[
  {
    "path": ".claude/README.md",
    "content": "# Claude Code Setup\n\nThis directory contains project-specific configuration for [Claude Code](https://claude.ai/code).\n\n## Structure\n\n```\n.claude/\n├── settings.json              # Tool permissions and MCP server configuration\n├── last-knowledge-update      # Tracks last SHA processed by /pre-push-update\n├── commands/\n│   └── pre-push-update.md     # /pre-push-update slash command\n├── skills/\n│   ├── audio-nodes/\n│   │   ├── SKILL.md           # C++ audio node engine\n│   │   ├── gainnode-example.md\n│   │   └── maintenance.md     # For /pre-push-update only\n│   ├── host-objects/\n│   │   ├── SKILL.md           # JSI HostObject layer\n│   │   ├── examples.md\n│   │   └── maintenance.md\n│   ├── build-compilation-dependencies/\n│   │   ├── SKILL.md           # CMake, Gradle, podspec, prebuilt libs\n│   │   ├── build-details.md\n│   │   └── maintenance.md\n│   ├── utilities/\n│   │   ├── SKILL.md           # Shared C++ and TS utilities\n│   │   ├── api.md\n│   │   └── maintenance.md\n│   ├── native-ios/\n│   │   ├── SKILL.md           # iOS native layer\n│   │   └── maintenance.md\n│   ├── native-android/\n│   │   ├── SKILL.md           # Android native layer\n│   │   └── maintenance.md\n│   ├── turbo-modules/\n│   │   ├── SKILL.md           # TurboModule/JSI wiring\n│   │   └── maintenance.md\n│   ├── web-audio-api/\n│   │   ├── SKILL.md           # Web Audio API spec conformance\n│   │   └── maintenance.md\n│   ├── thread-safety-itc/\n│   │   ├── SKILL.md           # Audio thread safety & ITC\n│   │   └── maintenance.md\n│   ├── post-work-checks/\n│   │   ├── SKILL.md           # Checklist after every change\n│   │   └── maintenance.md\n│   ├── flow/\n│   │   ├── SKILL.md           # End-to-end feature flow\n│   │   └── maintenance.md\n│   └── writing-skills/\n│       ├── SKILL.md           # How to write and maintain skill files (meta)\n│       └── maintenance.md\n└── README.md                  # This file\n```\n\n## Skills\n\nSkill files are a reference library for Claude. Each skill lives in its own directory (`.claude/skills/<name>/SKILL.md`) and is **auto-loaded** by Claude Code based on the YAML frontmatter `name` and `description` fields. The description contains trigger phrases — when the conversation context matches, the skill is surfaced automatically.\n\nSkills use a **three-level progressive disclosure model**:\n1. **Frontmatter** — always loaded; name + description with trigger phrases\n2. **`SKILL.md` body** — loaded when the skill is triggered; concise patterns and APIs\n3. **Supporting `.md` files** (e.g. `gainnode-example.md`, `build-details.md`) — linked from `SKILL.md`; loaded explicitly when deep reference is needed\n\nSkills are intentionally kept concise (under 500 lines). They answer \"what exists and how do I use it\", not \"how is it implemented\". Verbose material (full code examples, deep build analysis, complete API docs for large `.hpp` files) lives alongside `SKILL.md` in the same skill directory.\n\n**To update a skill manually**: edit the relevant `SKILL.md` file directly.\n\n**To keep skills in sync with code automatically**: use `/pre-push-update` (see below).\n\n## Maintenance Files\n\nEvery skill directory has a `maintenance.md` file. It maps source file path patterns to what needs checking in that skill when those paths change. This file is **not loaded during normal skill usage** — only `/pre-push-update` reads it.\n\n**Purpose**: when `/pre-push-update` runs, it reads each relevant skill's `maintenance.md` to decide exactly which sections to review. Without this table, Claude has to guess — with it, the mapping is explicit and reliable.\n\n**Format** (same in every `maintenance.md`):\n\n```markdown\n# Maintenance — skill-name\n\n> Used by /pre-push-update only — not loaded during skill usage.\n\n| Path | What to check |\n|---|---|\n| `path/to/file.*` | What in this skill to review or update |\n```\n\nEach `SKILL.md` ends with a single footer line: `*Maintenance: see [maintenance.md](maintenance.md).*`\n\nSupporting files (e.g. `gainnode-example.md`) do **not** have their own maintenance sections — their rows are merged into the skill's `maintenance.md`.\n\n**Rule**: if you add a new pattern, invariant, or code example to a skill, also add or update the relevant row in `maintenance.md` so future runs of `/pre-push-update` know to revisit it.\n\n## `/pre-push-update` command\n\nA slash command that reviews all commits since its last run and updates skill files to reflect what changed.\n\n### How it works\n\n1. `scripts/collect-knowledge-changes.sh` reads `.claude/last-knowledge-update` for the last-processed git SHA. On first run (empty file), it falls back to `HEAD~10`.\n2. The script outputs:\n   - All commits in the range\n   - **All changed files** (full stat, unfiltered) — Claude uses this to triage what is interesting\n   - **Source diff** filtered to `*.h / *.hpp / *.cpp / *.mm / *.kt / *.ts / *.tsx` inside the tracked source directories\n   - **Maintenance tables** — all `maintenance.md` files concatenated, so Claude knows exactly which sections to review without extra file reads\n3. Claude reads the output, classifies each changed path against the skill map, and makes targeted additions or corrections.\n4. Claude advances `.claude/last-knowledge-update` to the new HEAD SHA.\n\n### When to run it\n\nRun it before pushing a branch, after merging a PR, or whenever you feel the skill files may have drifted from the code. It is safe to run at any time — it only reads git history and writes to `.claude/`.\n\n```bash\n# Inside a Claude Code session:\n/pre-push-update\n```\n\n### What it updates\n\n| Change type | Action |\n|---|---|\n| New audio node class | Add entry to `audio-nodes/SKILL.md` |\n| New HostObject pattern | Add entry to `host-objects/SKILL.md` |\n| New utility helper | Add entry to `utilities/SKILL.md` |\n| Renamed/moved class referenced in a skill | Correct the reference |\n| New thread-safety invariant | Add to `thread-safety-itc/SKILL.md` |\n| Pure formatting / test-only / CI changes | Skipped |\n\n### What it does NOT do\n\n- Rewrite skills from scratch\n- Document internal implementation details\n- Process binary files, lock files, or generated code\n- Touch anything outside `.claude/`\n\n### Marker file\n\n`.claude/last-knowledge-update` contains the SHA of the last commit that was successfully processed. If it is empty or the SHA is not found in history, the script falls back to `HEAD~10`. You can reset it manually by writing any valid commit SHA.\n\n```bash\n# Reset to a specific commit (process everything since that point next run)\ngit rev-parse <commit-ish> > .claude/last-knowledge-update\n\n# Reset to process the last 20 commits next run\ngit rev-parse HEAD~20 > .claude/last-knowledge-update\n```\n\n### Diff limits\n\nThe script caps the source diff at **4000 lines**. If a batch of commits exceeds this, the diff is truncated with a warning. In that case run `/pre-push-update` more frequently, or review large refactors manually.\n\n## `settings.json`\n\nDefines tool permissions for Claude Code:\n\n- **Always allow**: `yarn build/lint/format/test`, read-only git commands, reading all source files, writing/editing `.claude/**` and `**/CLAUDE.md`, common inspection commands (`ls`, `which`, etc.)\n- **Ask before**: destructive git operations (`commit`, `push`, `reset`, `checkout`, etc.), `yarn clean`\n- **Always deny**: force push, `rm -rf`, `sudo`, reading build artifacts and binary files\n\nAlso configures MCP servers:\n- `filesystem` — `@modelcontextprotocol/server-filesystem` pointed at the repo root\n- `lsp` — `mcp-language-server` using `typescript-language-server` for TS/JS code intelligence\n"
  },
  {
    "path": ".claude/commands/pre-push-update.md",
    "content": "Run the knowledge update process: collect all commits since the last update, analyse what changed, and update skill files and CLAUDE.md accordingly.\n\n## Step 1 — Collect changes\n\nRun the collection script:\n\n```bash\nbash scripts/collect-knowledge-changes.sh\n```\n\nIf the output starts with `NO_NEW_COMMITS`, stop here and tell the user there is nothing to update.\n\n## Step 2 — Triage the changed files\n\nLook at the **ALL CHANGED FILES** section first. Use it to decide which changes are worth deep analysis. Classify each changed path:\n\n| Path pattern | Potentially affects |\n|---|---|\n| `common/cpp/audioapi/core/` | `audio-nodes/SKILL.md` (+ `audio-nodes/gainnode-example.md`) |\n| `common/cpp/audioapi/HostObjects/` | `host-objects/SKILL.md` (+ `host-objects/examples.md`) |\n| `common/cpp/audioapi/utils/` or `dsp/` | `utilities/SKILL.md` (+ `utilities/api.md`) |\n| `common/cpp/audioapi/events/` or `core/utils/Audio*` | `thread-safety-itc/SKILL.md` |\n| `android/src/main/` | `native-android/SKILL.md` |\n| `ios/` | `native-ios/SKILL.md` |\n| `src/specs/` or `AudioAPIModule.*` | `turbo-modules/SKILL.md` |\n| `src/` (TypeScript) | `turbo-modules/SKILL.md` or `web-audio-api/SKILL.md` |\n| `CMakeLists.txt`, `*.podspec`, `*.gradle` | `build-compilation-dependencies/SKILL.md` (+ `build-compilation-dependencies/build-details.md`) |\n| `.claude/` | CLAUDE.md itself |\n\nFor each identified skill, check the **MAINTENANCE TABLES** section at the end of the script output — it contains every skill's `maintenance.md` so you can see exactly which sections to review without additional file reads.\n\n**Skip a file entirely if:**\n- It is a test file with no new patterns (e.g. adding a test for existing behaviour)\n- The change is purely formatting/whitespace\n- It is a dependency version bump\n- It is CI config, example app, or lock file\n\n## Step 3 — Read the source diff\n\nRead the **SOURCE DIFF** section for the files you decided are interesting. For each interesting change ask:\n\n1. **New API or class?** — Is there a new class, method, or utility that a developer working in this area would want to know about? If yes, add a concise entry to the relevant skill file.\n\n2. **New pattern or invariant?** — Did the change reveal a non-obvious pattern, rule, or constraint (e.g. \"this must always be called before X\", \"this field is audio-thread only\")? If yes, document it in the relevant skill file.\n\n3. **Broken reference?** — Does the diff rename, move, or delete something that is currently mentioned in a skill file or CLAUDE.md? If yes, correct the reference.\n\n4. **New utility?** — Was a utility helper added to `utils/` or `dsp/`? If yes, add it to `utilities.md` following the existing format (brief usage note for `.h` files, inline docs for `.hpp`).\n\n5. **Nothing documentable?** — If the change is purely internal implementation with no effect on the documented API, patterns, or invariants — skip it.\n\n## Step 4 — Update skill files\n\nApply only targeted, minimal additions or corrections. Do **not**:\n- Rewrite skill files from scratch\n- Add documentation for every changed line\n- Document internal implementation details that are only useful when reading that specific file\n\nRead each skill file you intend to modify before editing it.\n\n## Step 5 — Advance the marker\n\nExtract the `HEAD_SHA=<sha>` line from the script output. Write only that SHA (no newline, no extra text) to `.claude/last-knowledge-update`.\n\n```bash\n# replace <sha> with the actual SHA from the last line of script output\nprintf '%s' '<sha>' > .claude/last-knowledge-update\n```\n\nTo reset the marker to \"empty\" (so the next run falls back to HEAD~10), use:\n```bash\n> .claude/last-knowledge-update\n```\n(`touch` only updates the timestamp — it does **not** clear the file contents.)\n\n## Step 6 — Report\n\nTell the user:\n- Which skill files were updated and why (one line each)\n- Which files were skipped and why (brief)\n- The new marker SHA\n"
  },
  {
    "path": ".claude/hooks/double-prompt.js",
    "content": "#!/usr/bin/env node\n// UserPromptSubmit hook — repeats the user's prompt as additionalContext.\n// Research suggests repeating the instruction improves instruction-following.\n\nlet data = '';\nprocess.stdin.setEncoding('utf8');\nprocess.stdin.on('data', chunk => { data += chunk; });\nprocess.stdin.on('end', () => {\n  try {\n    const input = JSON.parse(data);\n    const prompt = (input.prompt || '').trim();\n    if (prompt.length >= 500) {\n      process.stdout.write(JSON.stringify({ additionalContext: prompt }));\n    }\n  } catch (_) {\n    // parsing failed — output nothing, hook is a no-op\n  }\n});\n"
  },
  {
    "path": ".claude/last-knowledge-update",
    "content": "69e3f98f9413eca44ba6ef375636873a92184587\n"
  },
  {
    "path": ".claude/settings.json",
    "content": "{\n  \"$schema\": \"https://json.schemastore.org/claude-code-settings.json\",\n  \"respectGitIgnore\": true,\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(yarn build)\",\n      \"Bash(yarn lint*)\",\n      \"Bash(yarn format*)\",\n      \"Bash(yarn typecheck)\",\n      \"Bash(yarn test)\",\n      \"Bash(yarn check-audio-enum-sync)\",\n      \"Bash(yarn workspace *)\",\n      \"Bash(git status)\",\n      \"Bash(git diff*)\",\n      \"Bash(git log*)\",\n      \"Bash(git branch*)\",\n      \"Bash(git show*)\",\n      \"Bash(cmake *)\",\n      \"Bash(clang-format *)\",\n      \"Bash(node *)\",\n      \"Bash(npx prettier*)\",\n\n      \"Bash(ls*)\",\n      \"Bash(pwd)\",\n      \"Bash(which *)\",\n      \"Bash(type *)\",\n      \"Bash(file *)\",\n      \"Bash(wc *)\",\n      \"Bash(bash scripts/collect-knowledge-changes.sh*)\",\n      \"Bash(printf '%s' * > .claude/last-knowledge-update)\",\n      \"Bash(> .claude/last-knowledge-update)\",\n\n      \"Read(**)\",\n\n      \"WebFetch(https://webaudio.github.io/*)\",\n      \"WebFetch(https://developer.mozilla.org/*)\",\n      \"WebFetch(https://en.cppreference.com/*)\",\n      \"WebFetch(https://reactnative.dev/*)\",\n      \"WebSearch(*)\",\n\n      \"Write(.claude/**)\",\n      \"Edit(.claude/**)\",\n      \"Write(CLAUDE.md)\",\n      \"Edit(CLAUDE.md)\",\n      \"Write(apps/CLAUDE.md)\",\n      \"Edit(apps/CLAUDE.md)\",\n      \"Write(packages/*/CLAUDE.md)\",\n      \"Edit(packages/*/CLAUDE.md)\",\n      \"Write(packages/react-native-audio-api/tests/CLAUDE.md)\",\n      \"Edit(packages/react-native-audio-api/tests/CLAUDE.md)\"\n    ],\n    \"ask\": [\n      \"Bash(git add*)\",\n      \"Bash(git commit*)\",\n      \"Bash(git push*)\",\n      \"Bash(git merge*)\",\n      \"Bash(git rebase*)\",\n      \"Bash(git reset*)\",\n      \"Bash(git checkout *)\",\n      \"Bash(git stash*)\",\n      \"Bash(yarn clean)\"\n    ],\n    \"deny\": [\n      \"Bash(git push --force*)\",\n      \"Bash(rm -rf *)\",\n      \"Bash(sudo *)\",\n\n      \"Read(**/node_modules/**)\",\n      \"Read(**/Pods/**)\",\n      \"Read(**/vendor/bundle/**)\",\n\n      \"Read(**/build/**)\",\n      \"Read(**/lib/**)\",\n      \"Read(**/.turbo/**)\",\n      \"Read(**/.gradle/**)\",\n      \"Read(**/.cxx/**)\",\n      \"Read(**/.kotlin/**)\",\n      \"Read(**/DerivedData/**)\",\n      \"Read(**/*.xcuserstate)\",\n      \"Read(**/*.pbxuser)\",\n      \"Read(**/*.hmap)\",\n      \"Read(**/*.ipa)\",\n\n      \"Read(**/jniLibs/**)\",\n      \"Read(**/*.a)\",\n      \"Read(**/*.xcframework/**)\",\n      \"Read(**/ffmpeg_ios/**)\",\n      \"Read(**/openssl-prebuilt/**)\",\n      \"Read(**/prebuilt_libs/**)\",\n      \"Read(**/output/**)\",\n\n      \"Read(**/CMakeFiles/**)\",\n\n      \"Read(yarn.lock)\",\n      \"Read(**/Gemfile.lock)\",\n      \"Read(**/Podfile.lock)\",\n\n      \"Read(**/*.png)\",\n      \"Read(**/*.jpg)\",\n      \"Read(**/*.jpeg)\",\n      \"Read(**/*.gif)\",\n      \"Read(**/*.webp)\",\n      \"Read(**/*.ico)\",\n      \"Read(**/*.svg)\",\n      \"Read(**/*.ttf)\",\n      \"Read(**/*.otf)\",\n      \"Read(**/*.woff)\",\n      \"Read(**/*.woff2)\",\n      \"Read(**/*.mp3)\",\n      \"Read(**/*.wav)\",\n      \"Read(**/*.ogg)\",\n      \"Read(**/*.aac)\"\n    ]\n  },\n  \"hooks\": {\n    \"UserPromptSubmit\": [\n      {\n        \"matcher\": \"\",\n        \"hooks\": [\n          {\n            \"type\": \"command\",\n            \"command\": \"node .claude/hooks/double-prompt.js\"\n          }\n        ]\n      }\n    ]\n  },\n  \"mcpServers\": {\n    \"lsp\": {\n      \"command\": \"npx\",\n      \"args\": [\"-y\", \"mcp-language-server\", \"--stdio\"],\n      \"env\": {\n        \"LSP_COMMAND\": \"typescript-language-server\",\n        \"LSP_ARGS\": \"--stdio\"\n      }\n    }\n  }\n}\n"
  },
  {
    "path": ".claude/skills/audio-nodes/SKILL.md",
    "content": "---\nname: audio-nodes\ndescription: >\n  C++ audio node engine for react-native-audio-api. Covers the AudioNode class hierarchy, the processNode() audio-thread contract (no allocs, no locks, no blocking I/O), AudioParam a-rate/k-rate processing, cross-thread communication patterns (CrossThreadEventScheduler, IAudioEventHandlerRegistry), and a step-by-step checklist for implementing a new node end-to-end. Use this skill when implementing a new Web Audio API node, modifying audio graph traversal or processing logic, or debugging audio rendering artifacts. Trigger phrases: \"add a new node\", \"implement AudioNode\", \"processNode\", \"audio thread\", \"AudioParam automation\".\n---\n\n# Skill: AudioNodes\n\nGolden references: `GainNode.h/.cpp` (effect node), `OscillatorNode.h/.cpp` (scheduled source). Mirror their structure for any new node. See [gainnode-example.md](gainnode-example.md) for an annotated header + .cpp.\n\n**If spec defaults or parameter ranges are unclear → fetch https://webaudio.github.io/web-audio-api/ before writing any constructor code.**\n\n---\n\n## Directory Structure\n\n```\ncommon/cpp/audioapi/core/\n├── AudioNode.h / .cpp               # Base class for all nodes\n├── AudioParam.h / .cpp              # Automatable parameter\n├── BaseAudioContext.h / .cpp        # Engine + node factory\n├── AudioContext.h / .cpp            # Real-time context\n├── OfflineAudioContext.h / .cpp     # Offline rendering context\n├── sources/\n│   ├── AudioScheduledSourceNode.h   # Base for start/stop sources (INTERNAL)\n│   ├── AudioBufferBaseSourceNode.h  # Base for buffer playback (INTERNAL)\n│   ├── OscillatorNode.h / .cpp\n│   ├── AudioBufferSourceNode.h / .cpp\n│   ├── AudioBufferQueueSourceNode.h / .cpp\n│   ├── ConstantSourceNode.h / .cpp\n│   ├── StreamerNode.h / .cpp        # FFmpeg-based (conditional)\n│   ├── WorkletSourceNode.h / .cpp\n│   └── RecorderAdapterNode.h / .cpp\n├── effects/\n│   ├── GainNode.h / .cpp\n│   ├── BiquadFilterNode.h / .cpp\n│   ├── DelayNode.h / .cpp\n│   ├── IIRFilterNode.h / .cpp\n│   ├── StereoPannerNode.h / .cpp\n│   ├── WaveShaperNode.h / .cpp\n│   ├── ConvolverNode.h / .cpp\n│   ├── WorkletNode.h / .cpp\n│   └── PeriodicWave.h / .cpp        # Wave table (not a node)\n├── analysis/\n│   └── AnalyserNode.h / .cpp\n├── destinations/\n│   └── AudioDestinationNode.h / .cpp\n├── inputs/\n│   └── AudioRecorder.h / .cpp\n└── utils/\n    └── AudioGraphManager.h / .cpp\n```\n\n---\n\n## The Audio Thread Contract\n\n`processNode()` runs on the **audio thread** — the real-time rendering thread driven by the native audio driver (Oboe on Android, CoreAudio on iOS). This thread has strict requirements:\n\n**MUST NOT in `processNode()`:**\n- Allocate or free memory (`new`, `delete`, `malloc`, `free`, `std::vector::push_back` that grows, etc.)\n- Acquire any mutex or lock (`std::mutex`, `std::lock_guard`, etc.)\n- Make any blocking syscall (file I/O, socket, `sleep`, `wait`)\n- Call into JavaScript — no JSI calls, no `callInvoker_->invokeSync()`\n- Throw exceptions (or rely on exception unwinding paths that allocate)\n\n**Preallocate everything in the constructor:**\n```cpp\n// Constructor — JS thread, allocations OK\nGainNode::GainNode(const std::shared_ptr<BaseAudioContext> &context, const GainOptions &options)\n    : AudioNode(context, options) {\n  // Preallocate the AudioBuffer used during processing\n  audioBuffer_ = std::make_shared<AudioBuffer>(channelCount_, context->getBufferSize());\n\n  // Preallocate params — they own their internal AudioBuffer too\n  gainParam_ = std::make_shared<AudioParam>(\n      options.gain, -3.4028234663852886e+38f, 3.4028234663852886e+38f, context);\n}\n\n// processNode — audio thread, NO allocations\nstd::shared_ptr<AudioBuffer> GainNode::processNode(\n    const std::shared_ptr<AudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  // Already-allocated buffer reused each render quantum\n  auto gainValues = gainParam_->processARateParam(framesToProcess, time);\n  for (size_t i = 0; i < processingBuffer->getNumberOfChannels(); i++) {\n    processingBuffer->getChannel(i)->multiply(*gainValues->getChannel(0), framesToProcess);\n  }\n  return processingBuffer;\n}\n```\n\n---\n\n## Class Hierarchy\n\n```mermaid\nclassDiagram\n  direction TD\n\n  class AudioScheduledSourceNode {\n    <<internal base>>\n    start(when)\n    stop(when)\n  }\n  class AudioBufferBaseSourceNode {\n    <<internal base>>\n    playbackRate AudioParam\n    detune AudioParam\n  }\n\n  AudioNode <|-- AudioScheduledSourceNode\n  AudioNode <|-- GainNode\n  AudioNode <|-- BiquadFilterNode\n  AudioNode <|-- DelayNode\n  AudioNode <|-- IIRFilterNode\n  AudioNode <|-- StereoPannerNode\n  AudioNode <|-- WaveShaperNode\n  AudioNode <|-- ConvolverNode\n  AudioNode <|-- WorkletNode\n  AudioNode <|-- AnalyserNode\n  AudioNode <|-- AudioDestinationNode\n  AudioNode <|-- AudioRecorder\n\n  AudioScheduledSourceNode <|-- AudioBufferBaseSourceNode\n  AudioScheduledSourceNode <|-- OscillatorNode\n  AudioScheduledSourceNode <|-- ConstantSourceNode\n  AudioScheduledSourceNode <|-- StreamerNode\n  AudioScheduledSourceNode <|-- WorkletSourceNode\n\n  AudioBufferBaseSourceNode <|-- AudioBufferSourceNode\n  AudioBufferBaseSourceNode <|-- AudioBufferQueueSourceNode\n```\n\n### AudioScheduledSourceNode (internal only — not exposed to JS directly)\n\nBase class for source nodes that have a scheduled start and stop time. **Not instantiated directly.**\n\n```cpp\n// Playback state machine\nenum class PlaybackState {\n  UNSCHEDULED,      // before start() called\n  SCHEDULED,        // start() called, waiting for startTime_\n  PLAYING,          // actively producing audio\n  STOP_SCHEDULED,   // stop() called, waiting for stopTime_\n  FINISHED          // done, node will be disabled\n};\n```\n\nSubclasses call `updatePlaybackInfo(currentTime, framesToProcess)` at the top of `processNode()` to transition the state machine and handle sample-accurate start/stop.\n\nWhen the node finishes, fire the `ENDED` event to JS via `audioEventHandlerRegistry_->invokeHandlerWithEventBody(AudioEvent::ENDED, {})`.\n\n---\n\n## processNode() Signature\n\n```cpp\nprotected:\n  // Audio-thread only\n  virtual std::shared_ptr<AudioBuffer> processNode(\n      const std::shared_ptr<AudioBuffer> &processingBuffer,\n      int framesToProcess) = 0;\n```\n\n- `processingBuffer` — already contains the mixed input from all connected input nodes. Modify in-place and return it.\n- `framesToProcess` — number of samples per channel to process, typically 128 (RENDER_QUANTUM_SIZE).\n- Called by `AudioNode::processAudio()` which handles input mixing, channel count modes, and deduplication (via `lastRenderedFrame_`).\n\n---\n\n## Thread Annotations in Header Files\n\n**Annotate every method with the thread it is safe to call from.** Use comments in the header:\n\n```cpp\nclass MyNode : public AudioNode {\n public:\n  // JS-thread only\n  void setSomething(float value);\n  float getSomething() const;\n\n protected:\n  // Audio-thread only\n  std::shared_ptr<AudioBuffer> processNode(\n      const std::shared_ptr<AudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n};\n```\n\nIn `AudioParam.h` the pattern is:\n```cpp\n/// JS-Thread only methods\n[[nodiscard]] inline float getValue() const noexcept { ... }\nvoid setValue(float value);\nvoid setValueAtTime(float value, double startTime);\n\n/// Audio-Thread only methods\nstd::shared_ptr<AudioBuffer> processARateParam(int framesToProcess, double time);\nfloat processKRateParam(int framesToProcess, double time);\n```\n\n---\n\n## AudioParam — Automatable Parameters\n\nEvery automatable property (frequency, gain, detune, Q, etc.) is an `AudioParam`.\n\n```cpp\ngainParam_ = std::make_shared<AudioParam>(\n    defaultValue,\n    minValue,\n    maxValue,\n    context\n);\n```\n\n### A-rate vs K-rate\n\n- **A-rate (audio-rate)**: one value per sample — use when the parameter can change significantly within a render quantum (e.g. frequency modulation)\n  ```cpp\n  // Call processARateParam() for per-sample values — returns AudioBuffer, no allocation\n  auto gainValues = gainParam_->processARateParam(framesToProcess, time);\n  float *values = gainValues->getChannel(0)->getData();\n  // values[i] is the gain for frame i\n  ```\n\n- **K-rate (control-rate)**: one value per render quantum — use when the parameter changes slowly\n  ```cpp\n  // Call processKRateParam() for a single block-wide value\n  float gain = gainParam_->processKRateParam(framesToProcess, time);\n  // Single value for the whole block\n  ```\n\n### JS → Audio Thread parameter updates\n\n`CrossThreadEventScheduler<T>` is a lock-free SPSC channel. When JS calls `param.setValueAtTime(...)`, it enqueues a lambda on the scheduler. The audio thread drains the queue at the start of each `processARateParam` / `processKRateParam` call.\n\n```cpp\n// JS-thread (in AudioParam):\nvoid AudioParam::setValueAtTime(float value, double startTime) {\n  eventScheduler_.scheduleEvent([value, startTime](AudioParam &param) {\n    param.eventsQueue_.insertEvent(...);\n  });\n}\n\n// Audio-thread (inside processARateParam):\neventScheduler_.processAllEvents(*this);  // drain all pending events\n```\n\n**Important**: HostObject setters forward to the node/param asynchronously through this scheduler. By the time `processNode()` runs, the queued update may or may not have been applied yet, depending on timing. Design accordingly — never assume immediate consistency.\n\n---\n\n## Cross-Thread Communication Patterns\n\n### JS → Audio (parameter/graph updates)\nUse `CrossThreadEventScheduler` (lock-free SPSC queue). See `utils/CrossThreadEventScheduler.hpp`.\n\n### Audio → JS (events like `ended`, `loopEnded`, `positionChanged`)\nUse `IAudioEventHandlerRegistry::invokeHandlerWithEventBody()` which internally calls `callInvoker_->invokeAsync()` — this safely schedules the JS callback on the JS thread from the audio thread.\n\n```cpp\n// Audio-thread: fire 'ended' event\naudioEventHandlerRegistry_->invokeHandlerWithEventBody(\n    AudioEvent::ENDED, {});\n```\n\nCallback IDs are stored as `std::atomic<uint64_t>` on the node. `0` means no listener registered.\n\n### JS → Audio (graph mutations: connect/disconnect)\nAll graph mutations are queued via `AudioGraphManager` using its own SPSC channel (`addPendingNodeConnection`, `addPendingParamConnection`). The audio thread calls `graphManager_->preProcessGraph()` before each render pass to apply pending changes.\n\n---\n\n## Implementing a New Node — Checklist\n\n1. **Subclass the right base**\n   - `AudioNode` — standard effect or analysis node\n   - `AudioScheduledSourceNode` — source with start/stop scheduling\n   - `AudioBufferBaseSourceNode` — source that plays back an AudioBuffer with pitch control\n\n2. **Header file** (`core/<category>/MyNode.h`)\n   - Annotate every method with `// JS-thread only` or `// Audio-thread only`\n   - Declare `processNode()` in `protected:`\n   - Declare `AudioParam` members for automatable properties\n   - Preallocate all buffers you'll need in `private:` state\n\n3. **Constructor** (runs on JS thread)\n   - Call `AudioNode(context, options)` base constructor with correct `numberOfInputs`, `numberOfOutputs`\n   - Create all `AudioParam` instances with correct default/min/max values from the Web Audio spec\n   - Preallocate any DSP state buffers (IIR delay lines, ring buffers, etc.)\n   - Do NOT call `context_->...` in `processNode()` for anything that could block\n\n4. **processNode()** (runs on audio thread)\n   - Call `context_.lock()` to get a `shared_ptr<BaseAudioContext>` — return early if null\n   - Call `context->getCurrentTime()` for automation timing\n   - Use `processARateParam()` or `processKRateParam()` to read param values\n   - Process samples in-place on `processingBuffer`\n   - No allocations, no locks, no blocking I/O\n\n5. **HostObject** (see the `host-objects` skill)\n   - Create `MyNodeHostObject` extending `AudioNodeHostObject`\n   - Add factory method to `BaseAudioContextHostObject` (`createMyNode`)\n   - Add factory method to `BaseAudioContext` C++ class\n\n6. **TypeScript API** (see the `turbo-modules` skill)\n   - Add TS class in `src/core/`\n   - Export from package index\n\n7. **Spec compliance**\n   - Check the Web Audio API spec for default values, parameter ranges, and behavior\n   - See `web-audio-api.md` skill\n\n8. **Tests and docs** — see the `flow` skill\n\nSee [full GainNode example](gainnode-example.md) for a complete header + .cpp reference implementation.\n\n---\n\n## Web Audio API Spec Reference\n\nAll node behavior (parameter names, default values, valid ranges, processing semantics) must match the spec:\n- https://webaudio.github.io/web-audio-api/\n\nKey spec-defined constraints already encoded in the codebase:\n- `AudioParam` min/max values come from spec tables\n- `GainNode.gain` default = 1.0, no clamping\n- `BiquadFilterNode.frequency` default = 350 Hz, range [Nyquist - epsilon, Nyquist]\n- `OscillatorNode.frequency` default = 440 Hz\n- Render quantum = 128 frames\n\n---\n\n*Maintenance: see [maintenance.md](maintenance.md).*\n"
  },
  {
    "path": ".claude/skills/audio-nodes/gainnode-example.md",
    "content": "# Reference: Complete GainNode C++ Example\n\nThis file contains the full GainNode header and implementation, extracted from `SKILL.md` to keep the main skill file under budget.\n\n## `GainNode.h`\n\n```cpp\n#pragma once\n#include \"audioapi/core/AudioNode.h\"\n#include \"audioapi/core/AudioParam.h\"\n\nnamespace audioapi {\n\nclass GainNode : public AudioNode {\n public:\n  // JS-thread only\n  explicit GainNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const GainOptions &options);\n\n  // JS-thread only\n  [[nodiscard]] std::shared_ptr<AudioParam> getGainParam() const;\n\n protected:\n  // Audio-thread only\n  std::shared_ptr<AudioBuffer> processNode(\n      const std::shared_ptr<AudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  std::shared_ptr<AudioParam> gainParam_;\n};\n\n} // namespace audioapi\n```\n\n## `GainNode.cpp`\n\n```cpp\nGainNode::GainNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const GainOptions &options)\n    : AudioNode(context, options) {\n  // Preallocate param — constructor is on JS thread, allocation OK\n  gainParam_ = std::make_shared<AudioParam>(\n      options.gain,\n      -3.4028234663852886e+38f,\n      3.4028234663852886e+38f,\n      context);\n}\n\nstd::shared_ptr<AudioBuffer> GainNode::processNode(\n    const std::shared_ptr<AudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (!context) return processingBuffer;\n\n  double time = context->getCurrentTime();\n\n  // A-rate: per-sample gain values — no allocation, reuses preallocated buffer\n  auto gainParamValues = gainParam_->processARateParam(framesToProcess, time);\n  auto gainValues = gainParamValues->getChannel(0);\n\n  for (size_t i = 0; i < processingBuffer->getNumberOfChannels(); i++) {\n    processingBuffer->getChannel(i)->multiply(*gainValues, framesToProcess);\n  }\n\n  return processingBuffer;\n}\n```\n\n"
  },
  {
    "path": ".claude/skills/audio-nodes/maintenance.md",
    "content": "# Maintenance — audio-nodes\n\n> Used by `/pre-push-update` only — not loaded when the `audio-nodes` skill is active.\n\nReview this skill when `pre-push-update` reports changes in:\n\n| Path | What to check |\n|---|---|\n| `common/cpp/audioapi/core/AudioNode.*` | Base class contract, `processNode()` signature, `processAudio()` graph traversal |\n| `common/cpp/audioapi/core/AudioParam.*` | A-rate / k-rate section, automation method list |\n| `common/cpp/audioapi/core/sources/AudioScheduledSourceNode.*` | Playback state machine, `updatePlaybackInfo` contract |\n| `common/cpp/audioapi/core/<new file>` | Add new node to class hierarchy diagram and directory tree |\n| `common/cpp/audioapi/core/effects/GainNode.h` | `gainnode-example.md` — constructor signature, AudioParam declarations, thread annotations |\n| `common/cpp/audioapi/core/effects/GainNode.cpp` | `gainnode-example.md` — `processNode()` body, AudioParam initialization |\n\nUpdate the **class hierarchy diagram** in `SKILL.md` when a node is added, removed, or changes its base class.\n"
  },
  {
    "path": ".claude/skills/build-compilation-dependencies/SKILL.md",
    "content": "---\nname: build-compilation-dependencies\ndescription: >\n  Build system overview for react-native-audio-api across all platforms — CMakeLists.txt,\n  android/build.gradle, RNAudioAPI.podspec, prebuilt external libraries, and the standalone\n  C++ test build. Use this skill when adding a new source file, modifying CMakeLists or podspec,\n  debugging compilation errors, integrating a new dependency, or understanding why includes work\n  differently in tests vs the app. Trigger phrases: \"add source file\", \"CMakeLists\", \"podspec\",\n  \"build.gradle\", \"prebuilt binaries\", \"FFmpeg disabled\", \"pod install\", \"new architecture\",\n  \"compile error\", \"undefined symbol\", \"SIMD\", \"worklets build flag\", \"C++ tests\", \"conditional\n  compilation\", \"include path\", \"gradle build fails\", \"link error\".\n---\n\n# Skill: Build, Compilation & Dependencies\n\nFor deep CMake/Gradle/podspec analysis see [build-details.md](build-details.md).\n\n---\n\n## Repository Build Overview\n\n```\nreact-native-audio-api/\n├── package.json                        # Yarn 4 workspaces root\n├── packages/react-native-audio-api/    # Main library\n│   ├── android/\n│   │   ├── build.gradle                # Android build config (Gradle)\n│   │   ├── CMakeLists.txt              # Android CMake root (delegates to subdirectory)\n│   │   └── src/main/cpp/audioapi/\n│   │       └── CMakeLists.txt          # Actual Android C++ build target\n│   ├── common/cpp/audioapi/            # Shared C++ (used by all platforms)\n│   │   └── external/                   # Prebuilt binaries per platform\n│   │       ├── android/                # .a static libs (Opus, Ogg, Vorbis, OpenSSL)\n│   │       ├── iphoneos/               # iOS device .a libs\n│   │       ├── iphonesimulator/        # iOS sim .a libs\n│   │       ├── macosx/                 # macOS .a libs\n│   │       ├── ffmpeg_ios/             # FFmpeg .xcframeworks (iOS only)\n│   │       ├── include/                # Headers for Opus/Ogg/Vorbis/OpenSSL\n│   │       └── include_ffmpeg/         # Headers for FFmpeg\n│   ├── common/cpp/test/\n│   │   ├── CMakeLists.txt              # Standalone test build (no Android/iOS)\n│   │   ├── RunTests.sh                 # Test runner script\n│   │   └── src/                        # Google Test files\n│   ├── RNAudioAPI.podspec              # CocoaPods spec for iOS\n│   └── scripts/\n│       ├── download-prebuilt-binaries.sh  # Downloads externals from GitHub Releases\n│       ├── rnaa_utils.rb               # Ruby helpers for podspec (path resolution, worklets check)\n│       └── validate-worklets-version.js\n└── apps/\n    └── fabric-example/\n        └── ios/\n            └── Podfile                 # Consumer Podfile (new arch enabled)\n```\n\n---\n\n## Prebuilt Binaries\n\nExternal libraries (Opus, Ogg, Vorbis, OpenSSL, FFmpeg) are **not compiled from source** — they are downloaded as prebuilt `.a` / `.so` / `.xcframework` archives from:\n\n```\nhttps://github.com/software-mansion-labs/rn-audio-libs/releases/download/<TAG>/\n```\n\nCurrent tag: **v3.0.0** (see `scripts/download-prebuilt-binaries.sh`).\n\nThe download script is triggered automatically:\n- **iOS**: by podspec `prepare_command` during `pod install`\n- **Android**: by `downloadPrebuiltBinaries` Gradle task, which runs before `preBuild`\n\nDownloaded artifacts land in:\n- `common/cpp/audioapi/external/android/<ABI>/` — `.a` static libs for Android ABIs\n- `android/src/main/jniLibs/<ABI>/` — FFmpeg `.so` shared libs for Android (loaded at runtime)\n- `common/cpp/audioapi/external/ffmpeg_ios/` — FFmpeg `.xcframework` files for iOS\n- `common/cpp/audioapi/external/iphoneos/` / `iphonesimulator/` / `macosx/` — Opus/Ogg/etc `.a`\n\n**These directories are gitignored.** If they're missing, run `pod install` (iOS) or Gradle build (Android) to re-download them. Do not commit them.\n\n---\n\n## Android Build — high-level summary\n\n### Files\n- `android/build.gradle` — Gradle library config\n- `android/CMakeLists.txt` — Android CMake root (SIMD detection, RN version flags, delegates to subdirectory)\n- `android/src/main/cpp/audioapi/CMakeLists.txt` — actual build target (sources, prebuilt libs, include paths)\n\n### Key behaviors\n- Feature flags (`newArchEnabled`, `disableAudioapiFFmpeg`) are read from app's `gradle.properties` and forwarded to both CMake and Kotlin `BuildConfig`\n- DSP sources always compiled with `-O3` regardless of overall build type\n- Sources gathered with `GLOB_RECURSE CONFIGURE_DEPENDS` — CMake re-runs automatically when files are added/removed\n- Worklets must be merged before the audio API CMake build starts (explicit Gradle task dependency)\n- 16KB page size alignment enabled for Android 15+\n\nFor full per-line analysis see [build-details.md](build-details.md#android-androidcmakeliststxt-root--detailed-analysis).\n\n---\n\n## iOS Build (CocoaPods) — high-level summary\n\n### Files\n- `RNAudioAPI.podspec` — library spec with subspecs\n- `scripts/rnaa_utils.rb` — Ruby helpers called by podspec\n- `apps/fabric-example/ios/Podfile` — consumer\n\n### Key behaviors\n- Four subspecs split compilation: `audioapi` (core C++), `audioapi/ios` (ObjC++), `audioapi/audioapi_dsp` (DSP with `-O3`), `audioapi/miniaudio_impl` (compiled as `-x objective-c++`)\n- Static prebuilt libs linked with `-force_load` to prevent dead-stripping\n- FFmpeg xcframeworks listed in `s.ios.vendored_frameworks` — CocoaPods handles embedding and signing\n- `Accelerate` framework linked, enabling `HAVE_ACCELERATE=1` for vDSP SIMD on iOS\n- Header search paths split: `pod_target_xcconfig` (library compilation) vs `xcconfig` (app consumers)\n- `rnaa_utils.rb` resolves dynamic paths at `pod install` time (not hardcoded)\n\nFor full per-line analysis see [build-details.md](build-details.md#ios-rnaudioapipodspec--detailed-analysis).\n\n---\n\n## Building the Apps\n\n### iOS (fabric-example)\n\n```bash\n# From the monorepo root first:\nyarn install\n\n# Then install pods — must be done from the ios/ directory:\ncd apps/fabric-example/ios\npod install\n\n# Run the app (from repo root):\nyarn workspace fabric-example ios\n# or open Xcode:\nopen apps/fabric-example/ios/FabricExample.xcworkspace\n```\n\n**When to re-run `pod install`**:\n- After `yarn install` (any dependency change)\n- After changing `RNAudioAPI.podspec`\n- After adding/removing iOS source files that need to be picked up\n- After changing `rnaa_utils.rb` or `scripts/validate-worklets-version.js`\n- When prebuilt binaries need to be re-downloaded (podspec `prepare_command` runs on `pod install`)\n\n**Disable FFmpeg on iOS**:\n```bash\nDISABLE_AUDIOAPI_FFMPEG=1 pod install\n```\n\n### Android (fabric-example)\n\n```bash\nyarn workspace fabric-example android\n# or open in Android Studio:\nopen apps/fabric-example/android\n```\n\n**Disable FFmpeg on Android**: set in `android/gradle.properties`:\n```\ndisableAudioapiFFmpeg=true\n```\n\n**Clean CMake cache** (fixes most mysterious native build failures):\n```bash\nyarn workspace react-native-audio-api clean  # or manually:\nrm -rf packages/react-native-audio-api/android/.cxx\n```\n\n---\n\n## C++ Tests (standalone build)\n\n### Location\n`packages/react-native-audio-api/common/cpp/test/`\n\n### How to run\n```bash\nyarn test   # from monorepo root — runs RunTests.sh\n```\n\n`RunTests.sh` does:\n```bash\ncd packages/react-native-audio-api/common/cpp/test\ncmake -S . -B build -Wno-dev\ncd build && make -j10\n./tests --gtest_print_time=1\n```\n\nThe `build/` directory is deleted after each run.\n\n### Key design decisions\n- Completely standalone — no Gradle, no Xcode, no prebuilt Android libraries needed\n- Sources resolved from `node_modules` (symlinked to `packages/` in yarn workspaces)\n- HostObjects, worklets nodes, AudioContext, and FFmpegDecoding are excluded from the test build\n- Compile definitions: `RN_AUDIO_API_ENABLE_WORKLETS=0`, `RN_AUDIO_API_TEST=1`, `RN_AUDIO_API_FFMPEG_DISABLED=1`\n- Google Test auto-fetched via `FetchContent` if not installed locally\n- New test files in `test/src/**/*.cpp` are picked up automatically by glob — no CMakeLists edit needed\n\nFor `MockAudioEventHandlerRegistry`, `TestableXxx` pattern, and full CMakeLists analysis see [build-details.md](build-details.md#c-test-build--commoncpptestcmakeliststxt--detailed-analysis).\n\n---\n\n## Conditional Compilation Flags Summary\n\n| Flag | Android (CMake) | iOS (podspec) | Tests |\n|---|---|---|---|\n| `RN_AUDIO_API_FFMPEG_DISABLED` | `-DRN_AUDIO_API_FFMPEG_DISABLED` | `-DRN_AUDIO_API_FFMPEG_DISABLED=1` | Always set to 1 |\n| `RN_AUDIO_API_ENABLE_WORKLETS` | `-DRN_AUDIO_API_ENABLE_WORKLETS=1/0` | `-DRN_AUDIO_API_ENABLE_WORKLETS=1` | Always set to 0 |\n| `RCT_NEW_ARCH_ENABLED` | `-DRCT_NEW_ARCH_ENABLED` | `-DRCT_NEW_ARCH_ENABLED` | Not set |\n| `HAVE_ARM_NEON_INTRINSICS` | Set by CMake SIMD detection | Set by Xcode/Clang for arm64 | Set by CMake SIMD detection |\n| `HAVE_X86_SSE2` | Set by CMake SIMD detection | Not used | Set by CMake SIMD detection |\n| `HAVE_ACCELERATE` | Not set | `GCC_PREPROCESSOR_DEFINITIONS` | Not set |\n| `RN_AUDIO_API_TEST` | Not set | Not set | Always set to 1 |\n\n---\n\n## Common Build Failure Patterns\n\n| Symptom | Likely cause | Fix |\n|---|---|---|\n| `file not found: libopus.a` | Prebuilt binaries not downloaded | Run `pod install` (iOS) or Gradle build (triggers download task) |\n| `No such module 'RNAudioAPI'` | Pod not installed | `cd apps/fabric-example/ios && pod install` |\n| `undefined symbol: av_*` | FFmpeg .so not in jniLibs | Build triggers download; verify `disableAudioapiFFmpeg` not set unexpectedly |\n| CMake error on clean build | Stale `.cxx` cache | `rm -rf packages/react-native-audio-api/android/.cxx` |\n| Test build: `Cannot open include file: audioapi/...` | Node modules not linked | `yarn install` from root, then re-run tests |\n| New `.cpp` not compiled in tests | Glob picks it up automatically — may need cmake reconfigure | Delete `test/build/` and re-run |\n| iOS compile error `unknown type 'id'` | C++ file included ObjC-only header | Compile that file as ObjC++ (separate subspec with `-x objective-c++`) |\n| `RCT_NEW_ARCH_ENABLED` undefined on Android | Old RN gradle plugin | Ensure `newArchEnabled=true` in app's `gradle.properties` |\n\n---\n\n*Maintenance: see [maintenance.md](maintenance.md).*\n"
  },
  {
    "path": ".claude/skills/build-compilation-dependencies/build-details.md",
    "content": "# Build Details — CMake, Gradle & Podspec Deep Reference\n\n> This file contains the detailed per-platform build system analysis for `CMakeLists.txt`, `android/build.gradle`, `RNAudioAPI.podspec`, and the C++ test build.\n>\n> For the high-level overview, prebuilt binaries, building apps, conditional flags, and common failures, see [SKILL.md](SKILL.md).\n\n---\n\n## Android: `build.gradle` — detailed analysis\n\n### Feature flags (set by app's `gradle.properties`)\n\n```groovy\ndef isNewArchitectureEnabled() {\n  return rootProject.hasProperty(\"newArchEnabled\") && rootProject.getProperty(\"newArchEnabled\") == \"true\"\n}\ndef isFFmpegDisabled() {\n  return rootProject.hasProperty(\"disableAudioapiFFmpeg\") && rootProject.getProperty(\"disableAudioapiFFmpeg\") == \"true\"\n}\n```\n\n### Forwarding flags to CMake\n\n```groovy\n\"-DRN_AUDIO_API_FFMPEG_DISABLED=${IS_RN_AUDIO_API_FFMPEG_DISABLED}\"\n\"-DRN_AUDIO_API_WORKLETS_ENABLED=${isWorkletsAvailable}\"\n\"-DIS_NEW_ARCHITECTURE_ENABLED=${IS_NEW_ARCHITECTURE_ENABLED}\"\n```\n\n### Forwarding flags to Kotlin via BuildConfig\n\n```groovy\nbuildConfigField \"boolean\", \"RN_AUDIO_API_FFMPEG_DISABLED\", isFFmpegDisabled().toString()\nbuildConfigField \"boolean\", \"RN_AUDIO_API_ENABLE_WORKLETS\", \"${isWorkletsAvailable}\"\n```\n\n### 16KB page size alignment (Android 15+)\n\n```groovy\npackagingOptions {\n  jniLibs { useLegacyPackaging = false }\n}\n```\n\n### Worklets dependency ordering\n\nWorklets must be merged before the audio API's CMake build starts. Gradle task dependency is wired explicitly:\n\n```groovy\ntasks.getByName(\"buildCMakeDebug\").dependsOn(rnWorkletsProject.tasks.getByName(\"mergeDebugNativeLibs\"))\n```\n\n### Minimum RN version enforcement\n\nEnforced in Gradle task `assertMinimalReactNativeVersionTask` (currently RN 76+).\n\n---\n\n## Android: `android/CMakeLists.txt` (root) — detailed analysis\n\nThin delegator. Sets up SIMD detection, applies Folly + React Native flags, then:\n\n```cmake\nadd_subdirectory(\"${ANDROID_CPP_DIR}/audioapi\")\n```\n\n### SIMD detection (affects DSP performance)\n\n```cmake\nif(CMAKE_SYSTEM_PROCESSOR STREQUAL \"arm64\" OR CMAKE_SYSTEM_PROCESSOR STREQUAL \"aarch64\")\n    set(HAVE_ARM_NEON_INTRINSICS TRUE)\nelseif(CMAKE_SYSTEM_PROCESSOR MATCHES \"x86_64|amd64\")\n    set(HAVE_X86_SSE2 TRUE)\nendif()\n```\n\n### RN version-dependent flags (workaround for RN 0.80+ flag changes)\n\n```cmake\nif(ReactAndroid_VERSION_MINOR GREATER_EQUAL 80)\n  include(\"${REACT_NATIVE_DIR}/ReactCommon/cmake-utils/react-native-flags.cmake\")\n  target_compile_reactnative_options(react-native-audio-api PRIVATE)\nelse()\n  string(APPEND CMAKE_CXX_FLAGS \" -fexceptions -frtti ...\")\nendif()\n```\n\n---\n\n## Android: `android/src/main/cpp/audioapi/CMakeLists.txt` — detailed analysis\n\nBuilds `react-native-audio-api` as a shared library.\n\n### Source gathering\n\nUses `GLOB_RECURSE CONFIGURE_DEPENDS` — CMake will re-run automatically when files are added/removed:\n\n```cmake\nfile(GLOB_RECURSE COMMON_CPP_SOURCES CONFIGURE_DEPENDS \"${COMMON_CPP_DIR}/audioapi/*.cpp\")\n```\n\n### FFmpeg conditional exclusion\n\n```cmake\nif(RN_AUDIO_API_FFMPEG_DISABLED)\n  list(REMOVE_ITEM COMMON_CPP_SOURCES\n    \"${COMMON_CPP_DIR}/audioapi/libs/ffmpeg/FFmpegDecoding.cpp\"\n  )\nendif()\n```\n\n### DSP sources get `-O3` (always, regardless of overall build type)\n\n```cmake\nset_source_files_properties(${DSP_CPP_SOURCES} PROPERTIES COMPILE_FLAGS \"-O3\")\n```\n\n### Static prebuilt libs imported via `IMPORTED_LOCATION`\n\n```cmake\nforeach(lib IN ITEMS opus opusfile ogg vorbis vorbisenc vorbisfile crypto ssl)\n  add_library(${lib} STATIC IMPORTED)\n  set_target_properties(${lib} PROPERTIES IMPORTED_LOCATION ${EXTERNAL_DIR}/${ANDROID_ABI}/lib${lib}.a)\nendforeach()\n```\n\n### FFmpeg shared libs (`.so`) in `jniLibs/` linked as shared IMPORTED\n\n```cmake\nadd_library(${lib} SHARED IMPORTED)\nset_target_properties(${lib} PROPERTIES IMPORTED_LOCATION ${JNI_LIBS_DIR}/${ANDROID_ABI}/lib${lib}.so)\n```\n\n### Include paths for Android (key paths)\n\n```\ncommon/cpp                        — for #include <audioapi/...>\nandroid/src/main/cpp              — for Android-specific headers\nexternal/include                  — Opus/Ogg/Vorbis/OpenSSL headers\nexternal/include/opus             — nested Opus headers\nexternal/include_ffmpeg           — FFmpeg headers\nReactCommon                       — JSI headers\nReactAndroid/src/main/jni/...     — TurboModule JNI headers\n```\n\n---\n\n## iOS: `RNAudioAPI.podspec` — detailed analysis\n\n### Subspecs split compilation\n\n| Subspec | Sources | Special |\n|---|---|---|\n| `audioapi` | `common/cpp/audioapi/**/*.{cpp,h,hpp}` | Excludes FFmpeg sources if disabled |\n| `audioapi/ios` | `ios/audioapi/**/*.{mm,h}` | ObjC++ platform layer |\n| `audioapi/audioapi_dsp` | `common/cpp/audioapi/dsp/**/*.cpp` | Compiled with `-O3` |\n| `audioapi/miniaudio_impl` | `utils/MiniaudioImplementation.cpp` | Compiled as `-x objective-c++` (required by miniaudio) |\n\n### `miniaudio_impl` workaround\n\nminiaudio's implementation file must be compiled as Objective-C++ on iOS (it uses Apple APIs). CocoaPods can't set per-file compiler flags the same way CMake can, so it gets its own subspec with `compiler_flags = \"-x objective-c++\"`.\n\n### Prebuilt binaries linked via `-force_load`\n\nAll static libs (Opus, Ogg, Vorbis, OpenSSL) use `-force_load` to prevent dead-stripping of symbols needed at runtime but not referenced at link time:\n\n```ruby\ns.xcconfig = {\n  'OTHER_LDFLAGS' => %W[\n    -force_load #{lib_dir}/libopus.a\n    -force_load #{lib_dir}/libogg.a\n    ...\n  ].join(\" \")\n}\n```\n\n### FFmpeg xcframeworks listed in `s.ios.vendored_frameworks`\n\nCocoaPods handles embedding and signing automatically:\n\n```ruby\ns.ios.vendored_frameworks = $RN_AUDIO_API_FFMPEG_DISABLED ? [] : [\n  'common/cpp/audioapi/external/ffmpeg_ios/libavcodec.xcframework',\n  ...\n]\n```\n\n### Header search paths split between pod target and consumers\n\n- `pod_target_xcconfig` — `HEADER_SEARCH_PATHS` for compiling the library itself (Boost, Folly, Yoga, external headers)\n- `xcconfig` — `HEADER_SEARCH_PATHS` for app targets consuming this pod (ReactCommon, dynamic framework dirs)\n\n### `rnaa_utils.rb` — dynamic path resolution at `pod install` time\n\nResolves three paths that vary per machine/monorepo layout:\n\n1. `react_native_common_dir` — ReactCommon path relative to Pods root\n2. `dynamic_frameworks_audio_api_dir` — this pod's dir relative to Pods root\n3. `dynamic_frameworks_worklets_dir` — worklets pod dir (only if enabled)\n\nThese vary per machine/monorepo layout, so they're computed at install time rather than hardcoded.\n\n### System frameworks linked\n\n```ruby\ns.ios.frameworks = 'Accelerate', 'AVFoundation', 'MediaPlayer'\n```\n\n`Accelerate` enables `HAVE_ACCELERATE=1` for vDSP SIMD on iOS.\n\n### Podfile (fabric-example)\n\nEnables New Architecture: `ENV['RCT_NEW_ARCH_ENABLED'] = '1'` at the top. This is the only example app using the new arch — always test new features here.\n\nThe podfile resolves the minimum iOS version from RN's `min_ios_version_supported` helper — do not hardcode `14.0` in the Podfile itself.\n\n---\n\n## C++ Test Build — `common/cpp/test/CMakeLists.txt` — detailed analysis\n\n### Design: completely standalone\n\nNo Gradle, no Xcode, no prebuilt Android libraries needed.\n\n### Sources resolved from `node_modules` (not from monorepo source directly)\n\n```cmake\nset(ROOT ${CMAKE_SOURCE_DIR}/../../../../..)\nset(REACT_NATIVE_AUDIO_API_DIR \"${ROOT}/node_modules/react-native-audio-api\")\n\nfile(GLOB_RECURSE RNAUDIOAPI_SRC CONFIGURE_DEPENDS\n  \"${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/*.cpp\"\n)\n```\n\nThis means **tests build against the installed/published version of the library** in `node_modules`, not the local `packages/` source directly. In a monorepo with yarn workspaces, `node_modules/react-native-audio-api` symlinks to `packages/react-native-audio-api`, so this works fine locally.\n\n### Excluded from tests (not relevant for unit testing)\n\n```cmake\nlist(FILTER RNAUDIOAPI_SRC EXCLUDE REGEX \".*/audioapi/HostObjects/.*\\\\.cpp$\")  # no JSI in tests\nlist(FILTER RNAUDIOAPI_SRC EXCLUDE REGEX \".*/Worklet.*Node\\\\.cpp$\")            # worklets not compiled\nlist(REMOVE_ITEM RNAUDIOAPI_SRC ... \"AudioContext.cpp\")                         # needs real audio I/O\nlist(REMOVE_ITEM RNAUDIOAPI_SRC ... \"FFmpegDecoding.cpp\")                       # FFmpeg disabled in tests\n```\n\n### Compile definitions always set in tests\n\n```cmake\nadd_compile_definitions(RN_AUDIO_API_ENABLE_WORKLETS=0)\nadd_compile_definitions(RN_AUDIO_API_TEST=1)\nadd_compile_definitions(RN_AUDIO_API_FFMPEG_DISABLED=1)\n```\n\nUse `RN_AUDIO_API_TEST` in source code to conditionally compile test-only hooks.\n\n### Google Test auto-fetched if not installed\n\n```cmake\nfind_package(GTest QUIET)\nif(NOT GTest_FOUND)\n  include(FetchContent)\n  FetchContent_Declare(googletest URL https://github.com/google/googletest/archive/<sha>.zip)\n  FetchContent_MakeAvailable(googletest)\nendif()\n```\n\n### JSI headers included for compilation\n\nJSI headers are included from `node_modules/react-native/ReactCommon/jsi` so core audio classes that depend on JSI types can compile even without a running JS engine.\n\n### `MockAudioEventHandlerRegistry` — test fixture boilerplate\n\n`test/src/MockAudioEventHandlerRegistry.h` provides a Google Mock implementation of `IAudioEventHandlerRegistry`. Pass it to `OfflineAudioContext` in every test fixture:\n\n```cpp\nclass MyNodeTest : public ::testing::Test {\n protected:\n  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;\n  std::shared_ptr<OfflineAudioContext> context;\n\n  void SetUp() override {\n    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();\n    context = std::make_shared<OfflineAudioContext>(\n        2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});\n    context->initialize();\n  }\n};\n```\n\n### `TestableXxx` pattern — white-box unit testing\n\nExpose `processNode()` and internal state for white-box unit testing (since `processNode` is `protected`):\n\n```cpp\nclass TestableGainNode : public GainNode {\n public:\n  explicit TestableGainNode(std::shared_ptr<BaseAudioContext> ctx)\n      : GainNode(ctx, GainOptions()) {}\n\n  std::shared_ptr<AudioBuffer> processNode(\n      const std::shared_ptr<AudioBuffer> &buf, int frames) override {\n    return GainNode::processNode(buf, frames);  // call through to real implementation\n  }\n};\n```\n\n### Adding a new test file\n\n1. Create `test/src/core/<category>/MyNodeTest.cpp`\n2. `GLOB_RECURSE test_src \"src/*.cpp\"` picks it up automatically — no CMakeLists edit needed.\n3. Verify `context->initialize()` is called in `SetUp()` if your node needs the context to be running.\n\n"
  },
  {
    "path": ".claude/skills/build-compilation-dependencies/maintenance.md",
    "content": "# Maintenance — build-compilation-dependencies\n\n> Used by `/pre-push-update` only — not loaded when the `build-compilation-dependencies` skill is active.\n\nReview this skill when `pre-push-update` reports changes in:\n\n| Path | What to check |\n|---|---|\n| `android/CMakeLists.txt` | SIMD detection, RN version flag workaround |\n| `android/src/main/cpp/audioapi/CMakeLists.txt` | Source glob patterns, FFmpeg exclusion, DSP `-O3` targets, IMPORTED lib list, include paths |\n| `android/build.gradle` | Feature flag detection, CMake arg forwarding, BuildConfig fields, worklets task dependency, packaging options |\n| `RNAudioAPI.podspec` | Subspecs table, `miniaudio_impl` workaround, `-force_load` list, xcframeworks list, `rnaa_utils.rb` dynamic paths |\n| `apps/fabric-example/ios/Podfile` | New Architecture enablement, minimum iOS version helper |\n| `common/cpp/test/CMakeLists.txt` | Excluded sources list, compile definitions, GoogleTest fetch URL, include paths |\n| `common/cpp/test/src/MockAudioEventHandlerRegistry.h` | Mock interface — update fixture boilerplate in `build-details.md` if signature changes |\n| `scripts/download-prebuilt-binaries.sh` | New download artifacts, new TAG version |\n"
  },
  {
    "path": ".claude/skills/flow/SKILL.md",
    "content": "---\nname: flow\ndescription: >\n  End-to-end process for shipping a feature or bug fix in react-native-audio-api. Covers all required deliverables in order: Web Audio API spec review, TypeScript interface and types, C++ AudioNode implementation, HostObject wiring, TypeScript class, TurboModule spec (when needed), C++ tests (Google Test), JS tests (Jest), documentation (audiodocs MDX), and post-work checks. Also covers the bug-fix flow: MRE first, C++ test when applicable, root-cause analysis, post-mortem. Use this skill at the start of any feature implementation or bug fix. Trigger phrases: \"implement a feature\", \"add a node\", \"fix a bug\", \"what steps\", \"where do I start\", \"PR checklist\", \"how to write tests\".\n---\n\n# Skill: Feature Implementation Flow\n\n## Quick Reference\n\n**Feature checklist (all 9 steps required for a PR):**\n1. Read spec → define exactly what you're building\n2. TypeScript interface + option types (`src/interfaces/`, `src/types/`)\n3. C++ AudioNode (`core/<category>/MyNode.h/.cpp`) — see `audio-nodes` skill\n4. HostObject (`HostObjects/MyNodeHostObject.h/.cpp`) — see `host-objects` skill\n5. TypeScript class (`src/core/MyNode.ts`)\n6. TurboModule spec entry — **only** if a new RN native method is needed\n7. C++ tests (Google Test) — **write tests first, confirm they fail, then implement**\n8. JS/TS tests (Jest)\n9. Docs page (`packages/audiodocs/`)\nThen: `post-work-checks` skill\n\n**Bug fix checklist:**\n1. Reproduce (write failing test or MRE first)\n2. Identify the layer (use the table in §Bug Fix Flow)\n3. Fix + verify tests pass\n4. Post-mortem (update skill if a new pitfall discovered)\n\n---\n\n## Feature Implementation Flow\n\n### 1 — Define exactly what you are building\n\nBefore touching any code. **If spec behavior is unclear → fetch https://webaudio.github.io/web-audio-api/ before proceeding.**\n\n- Read the Web Audio API spec section for the node/feature. Nail down:\n  - All properties and methods\n  - Parameter default values, min/max, and automation behaviour\n  - Edge cases (what happens when `start()` is called twice? what if feedback[0] === 0?)\n- Decide the **TypeScript interface shape**: what does the JS consumer see?\n- Identify if **native platform code** is needed (e.g. new permission, device routing, new Oboe/CoreAudio API surface). If yes, plan iOS + Android separately.\n\n---\n\n### 2 — TypeScript interface and types\n\nFiles: `packages/react-native-audio-api/src/`\n\n1. Add the interface in `src/interfaces/` — `IMyNode.ts`\n   ```ts\n   export interface IMyNode extends IAudioNode {\n     readonly myParam: IAudioParam;\n     someMethod(arg: number): void;\n   }\n   ```\n\n2. Add the options type in `src/types/` — `NodeOptions.ts` (or add to existing file)\n   ```ts\n   export interface MyNodeOptions extends AudioNodeOptions {\n     myParam?: number; // default: 1.0\n   }\n   ```\n\n3. Export both from `src/interfaces/index.ts` and `src/types/index.ts`.\n\n---\n\n### 3 — C++ AudioNode\n\nFiles: `packages/react-native-audio-api/common/cpp/audioapi/core/`\n\nSee the `audio-nodes` skill for the full contract. **If unsure which base class to use → check the class hierarchy in that skill.** Summary:\n\n1. Create `core/<category>/MyNode.h` and `MyNode.cpp`.\n2. Subclass the right base (`AudioNode`, `AudioScheduledSourceNode`, `AudioBufferBaseSourceNode`).\n3. Annotate every method with `// JS-thread only` or `// Audio-thread only`.\n4. Declare `processNode()` in `protected:` — audio thread.\n5. Preallocate all `AudioParam`s and scratch buffers in the constructor (JS thread).\n6. Add `createMyNode(const MyNodeOptions &options)` factory to `BaseAudioContext`.\n7. Add the `.cpp` file to `CMakeLists.txt` (check existing entries for the pattern).\n\n**No allocations, no locks, no blocking I/O in `processNode()`.**\n\n---\n\n### 4 — HostObject\n\nFiles: `packages/react-native-audio-api/common/cpp/audioapi/HostObjects/`\n\nSee the `host-objects` skill for the full macro system and shadow state patterns. **If unsure whether to use shadow state or atomics → check the decision table in that skill.** Summary:\n\n1. Create `HostObjects/MyNodeHostObject.h` and `MyNodeHostObject.cpp`.\n2. Extend `AudioNodeHostObject`.\n3. Expose properties with `JSI_PROPERTY_GETTER/SETTER_DECL/IMPL` + `JSI_EXPORT_PROPERTY_GETTER/SETTER`.\n4. Expose methods with `JSI_HOST_FUNCTION_DECL/IMPL` + `JSI_EXPORT_FUNCTION`.\n5. Use **shadow state** (JS-thread copy + `scheduleAudioEvent`) for any property that: is read back by JS, is written from JS, AND must be applied on the audio thread. See `host-objects.md` for the decision table.\n6. Wire factory in `BaseAudioContextHostObject`: add `createMyNode` host function that calls `context->createMyNode(options)` and wraps in `MyNodeHostObject`.\n7. Add to `CMakeLists.txt`.\n\n---\n\n### 5 — TypeScript class\n\nFiles: `packages/react-native-audio-api/src/core/`\n\n1. Create `src/core/MyNode.ts` — extends `AudioNode`, wraps the JSI HostObject.\n   ```ts\n   import { IMyNode } from '../interfaces';\n   import AudioNode from './AudioNode';\n   import BaseAudioContext from './BaseAudioContext';\n   import { MyNodeOptions } from '../types';\n\n   export default class MyNode extends AudioNode implements IMyNode {\n     constructor(context: BaseAudioContext, options: MyNodeOptions) {\n       const node = context.context.createMyNode(options);\n       super(context, node);\n     }\n     // getters/setters forwarded to (this.node as IMyNode)\n   }\n   ```\n\n2. Add a factory method `createMyNode(options?)` to `src/core/BaseAudioContext.ts`.\n\n3. Export from `src/index.ts`.\n\n4. Add web passthrough in `src/web-core/MyNode.ts` if the node has a browser equivalent, or add a stub/throw if not supported on web. The web system always delegates to the browser's `AudioContext`.\n\n---\n\n### 6 — TurboModule spec (only if new native entry point needed)\n\nFile: `src/specs/NativeAudioAPIModule.ts`\n\nOnly needed if the feature requires a *new* RN native method (e.g. a permission check, a new audio session configuration). Most audio nodes do **not** need this — they are exposed entirely through JSI HostObjects.\n\nIf needed: add the method signature to the spec, then implement on iOS (`AudioAPIModule.mm`) and Android (`AudioAPIModule.kt`).\n\n---\n\n### 7 — Tests\n\n#### C++ tests (Google Test)\n\nPath: `common/cpp/test/src/core/<category>/MyNodeTest.cpp`\n\nPattern:\n```cpp\n#include <audioapi/core/OfflineAudioContext.h>\n#include <audioapi/core/effects/MyNode.h>\n#include <gtest/gtest.h>\n#include <test/src/MockAudioEventHandlerRegistry.h>\n#include <memory>\nusing namespace audioapi;\n\nclass MyNodeTest : public ::testing::Test {\n protected:\n  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;\n  std::shared_ptr<OfflineAudioContext> context;\n  static constexpr int sampleRate = 44100;\n\n  void SetUp() override {\n    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();\n    context = std::make_shared<OfflineAudioContext>(\n        2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});\n    context->initialize();\n  }\n};\n\n// Use TestableXxx subclass to expose processNode() and internal state for white-box tests\nclass TestableMyNode : public MyNode {\n public:\n  explicit TestableMyNode(std::shared_ptr<BaseAudioContext> ctx)\n      : MyNode(ctx, MyNodeOptions()) {}\n  std::shared_ptr<AudioBuffer> processNode(\n      const std::shared_ptr<AudioBuffer> &buf, int frames) override {\n    return MyNode::processNode(buf, frames);\n  }\n};\n\nTEST_F(MyNodeTest, CanBeCreated) { ... }\nTEST_F(MyNodeTest, ProcessesAudioCorrectly) { ... }\nTEST_F(MyNodeTest, EdgeCase) { ... }\n```\n\nNew test files are picked up automatically by `GLOB_RECURSE` — no CMakeLists edit needed.\n\nRun with:\n```bash\nyarn test   # from repo root\n```\n\n#### JS/TS tests (Jest)\n\nPath: `packages/react-native-audio-api/tests/`\n\n- `integration.test.ts` — graph construction, node creation, property access through the mock API\n- `mock.test.ts` — mock implementation correctness\n\nRun with:\n```bash\nyarn workspace react-native-audio-api test\n```\n\n#### Example app (fabric-example)\n\nIf the feature has a visible or audible component, add a demo in `apps/fabric-example/App.tsx` (or a sub-screen). This acts as a manual smoke test and documents intended usage.\n\n---\n\n### 8 — Documentation\n\nPath: `packages/audiodocs/`\n\nEvery **public API** that ships must have a documentation page. The docs package uses MDX. Look at an existing node's page for the format. Cover:\n\n- Constructor / factory call\n- All properties and their types/ranges\n- All methods with parameter descriptions\n- A minimal usage example (TypeScript snippet)\n- Any spec deviations or limitations (e.g. \"offline rendering not supported\")\n\n---\n\n### 9 — Post-work checks\n\nSee the `post-work-checks` skill. At minimum before any PR:\n\n```bash\nyarn format          # auto-fix formatting\nyarn lint            # JS/TS/C++/Kotlin linting\nyarn typecheck       # TypeScript\nyarn test            # C++ Google Tests\nyarn check-audio-enum-sync  # if you touched AudioEvent enums\n```\n\n---\n\n## Bug Fix Flow\n\n### 1 — Reproduce (MRE first)\n\n- **If an MRE is provided** → good, use it as your starting point.\n- **If no MRE** → reproduce in `apps/fabric-example/App.tsx`. Add the minimal code that triggers the bug. Keep it in the app until the fix is verified, then remove or clean it up.\n- **If the bug is in C++ DSP/processing logic** → write a **failing C++ test first** (`common/cpp/test/`). This gives a fast edit-compile-run loop without needing a device, and the test stays as a permanent regression guard.\n\n---\n\n### 2 — Identify the layer\n\n| Symptom | Likely layer | Where to look |\n|---|---|---|\n| Wrong default value / validation error | TypeScript | `src/core/MyNode.ts`, `src/types/` |\n| Property read-back returns wrong value | HostObject shadow state | `HostObjects/MyNodeHostObject` |\n| Wrong argument parsed from JS | HostObject | argument parsing in `get`/`call` |\n| Audio output sounds wrong | C++ `processNode()` | `core/<category>/MyNode.cpp` |\n| DSP math wrong | DSP helpers | `dsp/` utilities |\n| Crash on audio thread | Thread safety violation | `cross-thread` patterns — `audio-nodes.md` |\n| Platform-specific (only iOS or only Android) | Native layer | `ios/` or `android/` |\n| Only in new RN architecture | TurboModule / JSI wiring | `src/specs/`, HostObject init |\n\n---\n\n### 3 — Fix and verify\n\n1. Make the fix.\n2. If a C++ test was written in step 1 → it must now pass.\n3. If no C++ test was written but the fix touches `processNode()` or DSP code → add one now. It will stay as a regression test.\n4. Run post-work checks (see above).\n\n---\n\n### 4 — Post-mortem (short, but do it)\n\nAfter the fix is working, spend 2 minutes asking:\n\n- **Why did this bug exist?** Was it a missing validation? A wrong default value? A thread-safety assumption that wasn't documented?\n- **Should a skill file be updated?** If the bug revealed a non-obvious invariant (e.g. \"feedback[0] must not be 0\"), add it to the relevant skill (`audio-nodes.md`, `host-objects.md`, etc.) under a pitfalls or constraints section.\n- **Should a new test be added?** If no test existed that would have caught this, add one.\n- **Should docs be updated?** If the spec says X but the implementation did Y, and the fix brings it in line — update the docs page.\n\nThese small post-mortems compound over time and prevent the same class of bug from recurring.\n\n---\n\n*Maintenance: see [maintenance.md](maintenance.md).*\n"
  },
  {
    "path": ".claude/skills/flow/maintenance.md",
    "content": "# Maintenance — flow\n\n> Used by `/pre-push-update` only — not loaded when the `flow` skill is active.\n\nReview this skill when `pre-push-update` reports changes in:\n\n| Path | What to check |\n|---|---|\n| `common/cpp/test/CMakeLists.txt` | Test build section — new exclusions, new defines |\n| `packages/react-native-audio-api/tests/` | JS test section — new test patterns |\n| `packages/audiodocs/` | Docs section — new documentation conventions |\n| `package.json` scripts | Post-work checks step — new or renamed commands |\n\nThis skill describes **process** — update it when the team's workflow changes, not for every new node added.\n"
  },
  {
    "path": ".claude/skills/host-objects/SKILL.md",
    "content": "---\nname: host-objects\ndescription: >\n  Covers how to create, structure, and maintain JSI HostObjects that bridge C++ audio nodes to\n  JavaScript in react-native-audio-api. Explains naming conventions, property/method exposure via\n  macros, shadow state for JS↔audio-thread communication, JSI argument parsing, return value\n  patterns, memory pressure, factory wiring in BaseAudioContextHostObject, and common pitfalls.\n  Use this skill when creating a new audio node HostObject, modifying existing HostObject get/set/call\n  logic, wiring a new node into the context factory, or debugging JSI-related crashes and type errors.\n  Trigger phrases: \"add HostObject\", \"create JSI bridge\", \"expose C++ node to JS\", \"shadow state\",\n  \"scheduleAudioEvent from setter\", \"JSI property getter\", \"HostObject crashes\", \"new audio node\".\n---\n\n# Skill: HostObjects\n\nScope: C++ JSI HostObject layer — `packages/react-native-audio-api/common/cpp/audioapi/HostObjects/`\n\nHostObjects are the middle layer between the TypeScript API and the C++ audio engine. They expose C++ audio node state and methods to JavaScript via JSI (no bridge serialization), and route state changes to the audio thread via a lock-free SPSC event queue.\n\nGolden references: `GainNodeHostObject.h/.cpp` (effect node), `OscillatorNodeHostObject.h/.cpp` (source node). Mirror their structure for any new HostObject. See [full examples](examples.md) for annotated implementations.\n\n---\n\n## Critical Pitfalls — Read Before Writing Any Code\n\n- **NEVER read from `node_` in a getter** if the property can be written by the audio thread. Use shadow state or atomics instead.\n- **NEVER call `node_->someMethod()` directly from a setter** — always schedule via `scheduleAudioEvent`. The audio thread may be mid-render.\n- **ALWAYS register getters/setters/functions in the constructor.** Anything not added to `addGetters`/`addSetters`/`addFunctions` is silently missing from JS.\n- **Match property names exactly.** The string in `JSI_EXPORT_PROPERTY_GETTER` becomes the JS property name. A typo means the property doesn't exist in JS.\n- **Clear callback IDs in the destructor** for any HO that registers audio events. Otherwise the audio thread fires into a destroyed JS function.\n- **Call `setExternalMemoryPressure`** when returning HOs or typed arrays backed by large native buffers.\n- **Shadow state must be initialized** from `options` in the constructor — JS may read a property before ever setting it.\n\n---\n\n## Three-Layer Architecture\n\nEvery audio node has three layers. HostObject is the middle one:\n\n```mermaid\nflowchart TD\n  TS[\"TypeScript class\\n(src/core/)\"]\n  HO[\"HostObject\\n(C++ — JsiHostObject subclass)\"]\n  AN[\"AudioNode\\n(C++ core — audio thread)\"]\n\n  TS <--> |\"JSI — direct memory, no serialization\"| HO\n  HO <--> |\"shared_ptr\\nscheduleAudioEvent → SPSC\"| AN\n```\n\nThere is **no strong typing** between the C++ HostObject and the TypeScript interface. Alignment is by convention — property names and function signatures must match manually.\n\n---\n\n## Directory Structure\n\n```\nHostObjects/\n├── AudioNodeHostObject.h/.cpp            # Base for all audio node HOs\n├── AudioParamHostObject.h/.cpp           # AudioParam wrapper\n├── BaseAudioContextHostObject.h/.cpp     # Factory — all createXxx() methods live here\n├── AudioContextHostObject.h/.cpp         # Realtime context (adds close/resume/suspend)\n├── OfflineAudioContextHostObject.h/.cpp\n├── analysis/\n│   └── AnalyserNodeHostObject.h/.cpp\n├── destinations/\n│   └── AudioDestinationNodeHostObject.h\n├── effects/\n│   ├── GainNodeHostObject.h/.cpp\n│   ├── BiquadFilterNodeHostObject.h/.cpp\n│   ├── DelayNodeHostObject.h/.cpp\n│   ├── IIRFilterNodeHostObject.h/.cpp\n│   ├── StereoPannerNodeHostObject.h/.cpp\n│   ├── WaveShaperNodeHostObject.h/.cpp\n│   ├── ConvolverNodeHostObject.h/.cpp\n│   ├── WorkletNodeHostObject.h/.cpp\n│   └── WorkletProcessingNodeHostObject.h/.cpp\n├── sources/\n│   ├── AudioScheduledSourceNodeHostObject.h/.cpp  # Base for timed sources\n│   ├── AudioBufferBaseSourceNodeHostObject.h/.cpp # Base for buffer sources\n│   ├── OscillatorNodeHostObject.h/.cpp\n│   ├── AudioBufferSourceNodeHostObject.h/.cpp\n│   ├── AudioBufferQueueSourceNodeHostObject.h/.cpp\n│   ├── ConstantSourceNodeHostObject.h/.cpp\n│   ├── StreamerNodeHostObject.h/.cpp\n│   ├── AudioBufferHostObject.h/.cpp               # Data container, not a node\n│   └── RecorderAdapterNodeHostObject.h/.cpp\n├── inputs/\n│   └── AudioRecorderHostObject.h/.cpp\n├── events/\n│   └── AudioEventHandlerRegistryHostObject.h/.cpp\n└── utils/\n    ├── JsEnumParser.h/.cpp      # Enum ↔ string conversions\n    ├── NodeOptionsParser.h      # Parses JS option objects into C++ structs\n    ├── AudioDecoderHostObject.h/.cpp\n    └── AudioStretcherHostObject.h/.cpp\n```\n\n---\n\n## Macro System\n\nAll HostObjects use macros defined in `jsi/JsiHostObject.h`. Always use these — never write raw JSI dispatch code.\n\n### Declaration macros (in .h)\n\n```cpp\nJSI_PROPERTY_GETTER_DECL(gain)         // jsi::Value gain(jsi::Runtime &runtime)\nJSI_PROPERTY_SETTER_DECL(gain)         // void gain(jsi::Runtime &runtime, const jsi::Value &value)\nJSI_HOST_FUNCTION_DECL(setValueAtTime) // jsi::Value setValueAtTime(jsi::Runtime &, const jsi::Value &, const jsi::Value *, size_t)\n```\n\n### Implementation macros (in .cpp)\n\n```cpp\nJSI_PROPERTY_GETTER_IMPL(GainNodeHostObject, gain) { ... }\nJSI_PROPERTY_SETTER_IMPL(GainNodeHostObject, gain) { ... }\nJSI_HOST_FUNCTION_IMPL(GainNodeHostObject, setValueAtTime) { ... }\n```\n\n### Registration macros (in constructor)\n\n```cpp\naddGetters(\n    JSI_EXPORT_PROPERTY_GETTER(GainNodeHostObject, gain));\naddSetters(\n    JSI_EXPORT_PROPERTY_SETTER(GainNodeHostObject, fftSize));\naddFunctions(\n    JSI_EXPORT_FUNCTION(GainNodeHostObject, connect),\n    JSI_EXPORT_FUNCTION(GainNodeHostObject, disconnect));\n```\n\n**All getters, setters, and functions must be registered in the constructor.** Anything not registered is invisible to JS.\n\n---\n\n## Shadow State\n\nShadow state is the core pattern for JS↔audio-thread communication (introduced in PR #942).\n\n### The Problem\n\nThe audio node's C++ state is read and written on the **audio thread**. JS runs on a different thread. Without shadow state, reading a property from JS would require either a lock (forbidden on the audio thread) or an atomic (only works for primitives).\n\n### The Solution\n\nThe HostObject maintains its own **copy** of the node's properties — the shadow state. This copy:\n- Is read/written **only by the JS thread**\n- Is always in sync with what JS last set\n- Is the source of truth for JS reads\n\nWhen JS sets a property:\n1. Update the shadow copy immediately (JS thread)\n2. Schedule an event on `CrossThreadEventScheduler` that will apply the change on the audio thread\n\nWhen JS reads a property:\n1. Return the shadow copy — **do not touch the C++ node**\n\n```cpp\n// Header — shadow state declared as private member\nclass OscillatorNodeHostObject : public AudioScheduledSourceNodeHostObject {\n public:\n  JSI_PROPERTY_GETTER_DECL(type);\n  JSI_PROPERTY_SETTER_DECL(type);\n private:\n  OscillatorType type_;  // shadow copy of node_->type_\n};\n\n// Getter — returns shadow, never touches audio thread\nJSI_PROPERTY_GETTER_IMPL(OscillatorNodeHostObject, type) {\n  return jsi::String::createFromUtf8(\n      runtime, js_enum_parser::oscillatorTypeToString(type_));\n}\n\n// Setter — updates shadow + schedules audio thread update\nJSI_PROPERTY_SETTER_IMPL(OscillatorNodeHostObject, type) {\n  auto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);\n  auto type = js_enum_parser::oscillatorTypeFromString(\n      value.asString(runtime).utf8(runtime));\n\n  // 1. Update shadow state (JS thread, immediate)\n  type_ = type;\n\n  // 2. Schedule audio thread update (lock-free SPSC)\n  auto event = [oscillatorNode, type](BaseAudioContext &) {\n    oscillatorNode->setType(type);\n  };\n  oscillatorNode->scheduleAudioEvent(std::move(event));\n}\n```\n\n### When NOT to use shadow state\n\n| Scenario | Pattern |\n|---|---|\n| Primitive, only written by JS | Shadow state (standard) |\n| Non-primitive, only written by JS | Store in TS layer, pass to AudioNode when needed |\n| Primitive, can be written by audio thread | `std::atomic<T>` on the C++ node; read directly via getter |\n| Non-primitive, can be written by audio thread | Triple buffer pattern (see `AnalyserNode` for reference) |\n\n### AudioParam is a special case\n\n`AudioParam::value_` is `std::atomic<float>` because it can be updated by the audio thread during automation. The HO reads it directly:\n\n```cpp\nJSI_PROPERTY_GETTER_IMPL(AudioParamHostObject, value) {\n  return {param_->getValue()};  // atomic read, no shadow needed\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioParamHostObject, value) {\n  auto event = [param = param_, v = static_cast<float>(value.getNumber())](BaseAudioContext &) {\n    param->setValue(v);\n  };\n  param_->scheduleAudioEvent(std::move(event));\n}\n```\n\n### Shadow state must be initialized in the constructor\n\nInitialize shadow members from `options` in the constructor — JS may read a property before ever setting it:\n\n```cpp\nOscillatorNodeHostObject::OscillatorNodeHostObject(...) {\n  type_ = options.type;  // Initialize shadow from options\n}\n```\n\n---\n\n## Argument Parsing\n\n### Primitives\n\n```cpp\nfloat v       = static_cast<float>(args[0].getNumber());\ndouble d      = args[0].getNumber();\nint i         = static_cast<int>(args[0].getNumber());\nbool b        = args[0].getBool();\nstd::string s = args[0].getString(runtime).utf8(runtime);\n```\n\n### Optional arguments — check count first\n\n```cpp\n// args[2] is optional, default -1\ndouble duration = (count > 2 && !args[2].isUndefined()) ? args[2].getNumber() : -1.0;\n```\n\nUse `jsiutils::argToString(runtime, args, count, index, defaultValue)` for optional string args.\n\n### TypedArrays (Float32Array, Uint8Array, etc.)\n\nJS typed arrays are passed as objects with a `.buffer` property:\n\n```cpp\nJSI_HOST_FUNCTION_IMPL(AnalyserNodeHostObject, getByteFrequencyData) {\n  auto arrayBuffer = args[0]\n      .getObject(runtime)\n      .getPropertyAsObject(runtime, \"buffer\")\n      .getArrayBuffer(runtime);\n  auto data   = arrayBuffer.data(runtime);\n  auto length = static_cast<int>(arrayBuffer.size(runtime));\n\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  analyserNode->getByteFrequencyData(data, length);\n  return jsi::Value::undefined();\n}\n```\n\nFor Float32Arrays (reinterpret the bytes):\n\n```cpp\nauto rawValues = reinterpret_cast<float *>(arrayBuffer.data(runtime));\nauto length    = static_cast<int>(arrayBuffer.size(runtime) / sizeof(float));\n```\n\n### HostObject arguments (node-to-node)\n\n```cpp\nJSI_HOST_FUNCTION_IMPL(AudioNodeHostObject, connect) {\n  auto obj = args[0].getObject(runtime);\n  if (obj.isHostObject<AudioNodeHostObject>(runtime)) {\n    auto other = obj.getHostObject<AudioNodeHostObject>(runtime);\n    node_->connect(other->node_);\n  } else if (obj.isHostObject<AudioParamHostObject>(runtime)) {\n    auto param = obj.getHostObject<AudioParamHostObject>(runtime);\n    node_->connect(param->param_);\n  }\n  return jsi::Value::undefined();\n}\n```\n\n### Extracting a HostObject's inner C++ object\n\n```cpp\nauto periodicWave = args[0]\n    .getObject(runtime)\n    .getHostObject<PeriodicWaveHostObject>(runtime);\noscillatorNode->setPeriodicWave(periodicWave->periodicWave_);\n```\n\n---\n\n## Return Value Patterns\n\n### Primitives\n\n```cpp\nreturn {fftSize_};                                          // int/float/double\nreturn {true};                                              // bool\nreturn jsi::String::createFromUtf8(runtime, \"suspended\");  // string\nreturn jsi::Value::undefined();                             // void\nreturn jsi::Value::null();                                  // null\n```\n\n### A HostObject\n\n```cpp\nJSI_PROPERTY_GETTER_IMPL(GainNodeHostObject, gain) {\n  auto gainNode  = std::static_pointer_cast<GainNode>(node_);\n  auto gainParam = std::make_shared<AudioParamHostObject>(gainNode->getGainParam());\n  return jsi::Object::createFromHostObject(runtime, gainParam);\n}\n```\n\n### A plain JS object\n\n```cpp\nauto result = jsi::Object(runtime);\nresult.setProperty(runtime, \"status\", jsi::String::createFromUtf8(runtime, \"success\"));\nresult.setProperty(runtime, \"path\",   jsi::String::createFromUtf8(runtime, path));\nreturn result;\n```\n\n### A Float32Array wrapping native memory\n\n```cpp\nJSI_HOST_FUNCTION_IMPL(AudioBufferHostObject, getChannelData) {\n  auto channel          = static_cast<int>(args[0].getNumber());\n  auto audioArrayBuffer = audioBuffer_->getSharedChannel(channel);\n  auto arrayBuffer      = jsi::ArrayBuffer(runtime, audioArrayBuffer);\n\n  auto float32ArrayCtor = runtime.global()\n      .getPropertyAsFunction(runtime, \"Float32Array\");\n  auto float32Array = float32ArrayCtor\n      .callAsConstructor(runtime, arrayBuffer)\n      .getObject(runtime);\n\n  float32Array.setExternalMemoryPressure(runtime, audioArrayBuffer->size());\n  return float32Array;\n}\n```\n\n### External memory pressure\n\nCall `setExternalMemoryPressure` whenever returning a HostObject or typed array that wraps a large native buffer. This lets the JS GC schedule collection correctly:\n\n```cpp\njsiObject.setExternalMemoryPressure(runtime, bufferHostObject->getSizeInBytes());\n```\n\n---\n\n## Enum Parsing\n\nUse `JsEnumParser` (`utils/JsEnumParser.h`) for all enum ↔ string conversions. Never hardcode strings.\n\n```cpp\n// String → enum\nauto type = js_enum_parser::oscillatorTypeFromString(\n    value.asString(runtime).utf8(runtime));\n\n// Enum → string\nreturn jsi::String::createFromUtf8(\n    runtime, js_enum_parser::oscillatorTypeToString(type_));\n```\n\nWhen adding a new enum, add both directions to `JsEnumParser`.\n\n---\n\n## Destructor: Clearing Callbacks\n\nWhen a HostObject is garbage collected, registered audio callbacks must be cleared. Otherwise the audio thread fires into a destroyed JS function.\n\n```cpp\nAudioScheduledSourceNodeHostObject::~AudioScheduledSourceNodeHostObject() {\n  auto node = std::static_pointer_cast<AudioScheduledSourceNode>(node_);\n  node->setOnEndedCallbackId(0);  // 0 = no listener\n}\n```\n\nApply this for every `std::atomic<uint64_t>` callback ID on the node.\n\n---\n\n## TypeScript Counterpart\n\nEach HO must have a matching TS interface and class in `packages/react-native-audio-api/src/core/`.\n\n```ts\n// Interface — mirrors C++ HO properties exactly (src/core/interfaces/)\nexport interface IGainNode extends IAudioNode {\n  readonly gain: IAudioParam;\n}\n\n// TS class — wraps the C++ HO (src/core/)\nclass GainNode extends AudioNode {\n  readonly gain: AudioParam;\n\n  constructor(context: BaseAudioContext, options?: TGainOptions) {\n    // context.context is the C++ BaseAudioContextHostObject\n    const gainNode: IGainNode = context.context.createGain(options ?? {});\n    super(context, gainNode);\n    this.gain = new AudioParam(gainNode.gain, context);\n  }\n}\n```\n\nSee the `turbo-modules` skill for full TS wiring details.\n\n---\n\n## Adding to BaseAudioContextHostObject\n\nEvery new node needs a factory method. Three steps:\n\n### 1. Declare in `BaseAudioContextHostObject.h`\n\n```cpp\nJSI_HOST_FUNCTION_DECL(createMyNode);\n```\n\n### 2. Register in `BaseAudioContextHostObject` constructor\n\n```cpp\naddFunctions(\n    // ... existing entries\n    JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createMyNode));\n```\n\n### 3. Implement in `BaseAudioContextHostObject.cpp`\n\n```cpp\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createMyNode) {\n  MyNodeOptions options = NodeOptionsParser::parseMyNodeOptions(runtime, args, count);\n  auto myNode = std::make_shared<MyNodeHostObject>(context_, options);\n  return jsi::Object::createFromHostObject(runtime, myNode);\n}\n```\n\nAlso add `createMyNode()` to the C++ `BaseAudioContext` factory — see the `audio-nodes` skill.\n\n---\n\n---\n\n*Maintenance: see [maintenance.md](maintenance.md).*\n"
  },
  {
    "path": ".claude/skills/host-objects/examples.md",
    "content": "# HostObject Examples\n\n## GainNodeHostObject (no shadow state)\n\n`gain` is an `AudioParam` — no shadow state needed because its `value_` is `std::atomic<float>`.\n\n### `effects/GainNodeHostObject.h`\n\n```cpp\n#pragma once\n#include \"audioapi/HostObjects/AudioNodeHostObject.h\"\n#include \"audioapi/HostObjects/AudioParamHostObject.h\"\n#include \"audioapi/core/effects/GainNode.h\"\n\nnamespace audioapi {\n\nclass GainNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit GainNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const GainOptions &options);\n\n  // JS-thread only\n  JSI_PROPERTY_GETTER_DECL(gain);\n};\n\n} // namespace audioapi\n```\n\n### `effects/GainNodeHostObject.cpp`\n\n```cpp\nGainNodeHostObject::GainNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const GainOptions &options)\n    : AudioNodeHostObject(context->createGain(options)) {\n  addGetters(\n      JSI_EXPORT_PROPERTY_GETTER(GainNodeHostObject, gain));\n}\n\nJSI_PROPERTY_GETTER_IMPL(GainNodeHostObject, gain) {\n  auto gainNode  = std::static_pointer_cast<GainNode>(node_);\n  auto gainParam = std::make_shared<AudioParamHostObject>(gainNode->getGainParam());\n  return jsi::Object::createFromHostObject(runtime, gainParam);\n}\n```\n\n---\n\n## OscillatorNodeHostObject (with shadow state)\n\n`type` is a plain enum — not atomic — so it uses shadow state. `AudioParam` wrappers for `frequency` and `detune` are preallocated in the constructor and returned directly (no shadow needed since the underlying `value_` is atomic on the node).\n\n### `sources/OscillatorNodeHostObject.h`\n\n```cpp\n#pragma once\n#include \"audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h\"\n#include \"audioapi/core/sources/OscillatorNode.h\"\n\nnamespace audioapi {\n\nclass OscillatorNodeHostObject : public AudioScheduledSourceNodeHostObject {\n public:\n  explicit OscillatorNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const OscillatorOptions &options);\n\n  // JS-thread only\n  JSI_PROPERTY_GETTER_DECL(frequency);\n  JSI_PROPERTY_GETTER_DECL(detune);\n  JSI_PROPERTY_GETTER_DECL(type);\n  JSI_PROPERTY_SETTER_DECL(type);\n  JSI_HOST_FUNCTION_DECL(setPeriodicWave);\n\n private:\n  // Shadow state — JS thread only\n  OscillatorType type_;\n  // AudioParam wrappers — not shadow state, wrap atomic state on the node\n  std::shared_ptr<AudioParamHostObject> frequencyParam_;\n  std::shared_ptr<AudioParamHostObject> detuneParam_;\n};\n\n} // namespace audioapi\n```\n\n### `sources/OscillatorNodeHostObject.cpp`\n\n```cpp\nOscillatorNodeHostObject::OscillatorNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const OscillatorOptions &options)\n    : AudioScheduledSourceNodeHostObject(context->createOscillator(options)) {\n  auto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);\n\n  // Initialize shadow from options\n  type_ = options.type;\n\n  // Preallocate AudioParam wrappers\n  frequencyParam_ = std::make_shared<AudioParamHostObject>(oscillatorNode->getFrequencyParam());\n  detuneParam_    = std::make_shared<AudioParamHostObject>(oscillatorNode->getDetuneParam());\n\n  addGetters(\n      JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, frequency),\n      JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, detune),\n      JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, type));\n  addSetters(\n      JSI_EXPORT_PROPERTY_SETTER(OscillatorNodeHostObject, type));\n  addFunctions(\n      JSI_EXPORT_FUNCTION(OscillatorNodeHostObject, setPeriodicWave));\n}\n\nJSI_PROPERTY_GETTER_IMPL(OscillatorNodeHostObject, frequency) {\n  return jsi::Object::createFromHostObject(runtime, frequencyParam_);\n}\n\nJSI_PROPERTY_GETTER_IMPL(OscillatorNodeHostObject, type) {\n  // Return shadow — never read from node_\n  return jsi::String::createFromUtf8(\n      runtime, js_enum_parser::oscillatorTypeToString(type_));\n}\n\nJSI_PROPERTY_SETTER_IMPL(OscillatorNodeHostObject, type) {\n  auto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);\n  auto type = js_enum_parser::oscillatorTypeFromString(\n      value.asString(runtime).utf8(runtime));\n\n  // 1. Shadow update — immediate, JS thread\n  type_ = type;\n\n  // 2. Audio thread update — async, lock-free\n  auto event = [oscillatorNode, type](BaseAudioContext &) {\n    oscillatorNode->setType(type);\n  };\n  oscillatorNode->scheduleAudioEvent(std::move(event));\n}\n\nJSI_HOST_FUNCTION_IMPL(OscillatorNodeHostObject, setPeriodicWave) {\n  auto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);\n  auto periodicWave   = args[0].getObject(runtime)\n      .getHostObject<PeriodicWaveHostObject>(runtime);\n  oscillatorNode->setPeriodicWave(periodicWave->periodicWave_);\n  return jsi::Value::undefined();\n}\n```\n\n"
  },
  {
    "path": ".claude/skills/host-objects/maintenance.md",
    "content": "# Maintenance — host-objects\n\n> Used by `/pre-push-update` only — not loaded when the `host-objects` skill is active.\n\nReview this skill when `pre-push-update` reports changes in:\n\n| Path | What to check |\n|---|---|\n| `common/cpp/audioapi/HostObjects/**` | New HostObjects, macro usage changes, shadow state patterns |\n| `common/cpp/audioapi/jsi/JsiHostObject.*` | Macro signatures, new export macros — update both `SKILL.md` and `examples.md` |\n| `common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.*` | Factory wiring section (3-step checklist) |\n| Any new `*HostObject.h` | Add to directory structure, document any new patterns it introduces |\n| `common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.*` | `examples.md` — macro usage, AudioParam wrapping pattern |\n| `common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.*` | `examples.md` — shadow state pattern, enum parsing |\n\nUpdate the **three-layer architecture diagram** in `SKILL.md` only if the communication mechanism between layers changes.\n"
  },
  {
    "path": ".claude/skills/post-work-checks/SKILL.md",
    "content": "---\nname: post-work-checks\ndescription: >\n  Ordered quality gate checklist to run after every code change in react-native-audio-api.\n  Covers formatting, linting, type checking, C++ tests, JS tests, and enum sync validation.\n  Documents what lefthook pre-commit hooks run automatically vs what must be run manually.\n  Use at the end of any implementation task before opening a PR.\n  Trigger phrases: \"post-work\", \"before PR\", \"before commit\", \"check quality\", \"run linter\",\n  \"run tests\", \"format code\", \"lefthook\", \"pre-commit\", \"yarn test\", \"yarn lint\".\n---\n\n# Skill: Post-Work Checks\n\nRun these checks after any code change and before opening a PR.\n\n---\n\n## Quick Reference\n\n```bash\nyarn format                  # auto-fix all formatting\nyarn lint                    # lint all workspaces\nyarn typecheck               # TypeScript type checking\nyarn test                    # C++ Google Tests\nyarn check-audio-enum-sync   # only if AudioEvent enum touched\n```\n\n---\n\n## What lefthook Runs Automatically\n\n`lefthook` runs pre-commit hooks on every `git commit` — these run automatically:\n\n| Hook | Command |\n|---|---|\n| Format | `yarn format` (JS via Prettier, C++ via clang-format, Kotlin via ktlint) |\n| Lint | `yarn lint` (JS/TS + C++ + Kotlin) |\n| Type check | `yarn typecheck` |\n| Commit message | `commitlint` |\n\n**If a hook fails, the commit is aborted.** Fix the issue and re-commit — do NOT use `--no-verify`.\n\n---\n\n## What Must Be Run Manually\n\nThese are NOT run by lefthook:\n\n### C++ tests\n\n```bash\nyarn test   # from monorepo root\n```\n\nRuns `packages/react-native-audio-api/common/cpp/test/RunTests.sh` via CMake + Google Test.\n\n**When**: after any change to `common/cpp/audioapi/core/`, `dsp/`, or `utils/` C++ files.\n\n### AudioEvent enum sync check\n\n```bash\nyarn check-audio-enum-sync\n```\n\n**When**: only when you modify the `AudioEvent` enum or any file that maps event names across C++/Kotlin/TypeScript.\n\n---\n\n## Per-Language Commands\n\nWhen you need to target a specific language:\n\n```bash\n# TypeScript/JavaScript\nyarn lint:js           # ESLint\nyarn format:js         # Prettier\n\n# Shared C++\nyarn format:common     # clang-format for common/cpp/\nyarn lint:cpp          # cpplint\n\n# Android\nyarn format:android:cpp     # clang-format for android/src/main/cpp/\nyarn format:android:kotlin  # KtLint\nyarn lint:kotlin             # Kotlin linter\n\n# iOS\nyarn format:ios         # clang-format for ios/\nyarn lint:ios           # iOS Objective-C++ format checks\n```\n\n---\n\n## Recommended Order\n\nLater steps may surface issues caused by earlier ones — run in this order:\n\n1. `yarn format` — fix formatting first (removes noise from lint)\n2. `yarn lint` — catch remaining code issues\n3. `yarn typecheck` — catch TypeScript errors\n4. `yarn test` — catch C++ regressions (when C++ changed)\n5. `yarn check-audio-enum-sync` — when `AudioEvent` enum was touched\n\n---\n\n*Maintenance: see [maintenance.md](maintenance.md).*\n"
  },
  {
    "path": ".claude/skills/post-work-checks/maintenance.md",
    "content": "# Maintenance — post-work-checks\n\n> Used by `/pre-push-update` only — not loaded when the `post-work-checks` skill is active.\n\nReview this skill when `pre-push-update` reports changes in:\n\n| Path | What to check |\n|---|---|\n| Root `package.json` scripts | New or renamed lint/format/test commands |\n| `packages/react-native-audio-api/package.json` scripts | Package-level command changes |\n| `.lefthook.yml` or lefthook config | Pre-commit hook changes |\n| `scripts/check-audio-enum-sync*` | Enum sync check details |\n"
  },
  {
    "path": ".claude/skills/thread-safety-itc/SKILL.md",
    "content": "---\nname: thread-safety-itc\ndescription: >\n  Audio thread safety rules, lock-free inter-thread communication patterns, and the audio event\n  system in react-native-audio-api. Covers the three-thread model (JS / audio / worker),\n  CrossThreadEventScheduler for JS→audio scheduling, IAudioEventHandlerRegistry for audio→JS events,\n  AudioGraphManager for graph mutations, shadow state vs atomics decision table, TaskOffloader for\n  off-thread work, and SpscChannel low-level API. Use when implementing cross-thread data flow,\n  adding audio events, debugging thread-safety crashes or data races, or deciding which ITC\n  primitive to use.\n  Trigger phrases: \"lock-free\", \"SPSC\", \"thread safety\", \"ITC\", \"cross-thread\", \"audio thread race\",\n  \"scheduleAudioEvent\", \"invokeHandlerWithEventBody\", \"TaskOffloader\", \"off-thread\",\n  \"SpscChannel\", \"CrossThreadEventScheduler\", \"shadow state\", \"atomic\".\n---\n\n# Skill: Thread Safety & Inter-Thread Communication\n\nThree threads interact in this codebase. Every line of code that crosses a thread boundary must use the correct primitive or it is a bug.\n\n**When in doubt about which ITC primitive to use → go to the Decision Table below first.**\n\n---\n\n## The Three Threads\n\n| Thread | Alias | Runs |\n|---|---|---|\n| React Native JS thread | \"JS thread\" | User code, HostObject methods, `scheduleAudioEvent` calls |\n| Audio thread | \"audio thread\" | `processNode()` — driven by Oboe (Android) / CoreAudio (iOS) |\n| Worker threads | \"off-thread\" | FFmpeg decoding, file I/O, `TaskOffloader` tasks |\n\n**Audio thread is real-time.** It has a hard deadline (~3ms at 44100 Hz, 128 frames). Missing it causes audible glitches.\n\n---\n\n## Audio Thread Contract\n\n`processNode()` **MUST NOT**:\n- Allocate or free memory (`new`, `delete`, `malloc`, `free`, any `push_back` that grows)\n- Acquire any mutex (`std::mutex`, `std::lock_guard`, `std::unique_lock`)\n- Make blocking syscalls (file I/O, socket I/O, `sleep`, `wait`)\n- Call into JavaScript (no JSI calls, no `callInvoker_->invokeSync()`)\n- Throw exceptions\n\n**Preallocate everything in the constructor (JS thread).** The audio thread only uses what was already allocated.\n\n---\n\n## JS → Audio: `CrossThreadEventScheduler`\n\nThe standard way to send property updates from JS to the audio thread.\n\n```cpp\n// JS thread (HostObject setter):\nauto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);\nauto event = [oscillatorNode, type](BaseAudioContext &) {\n  oscillatorNode->setType(type);   // runs on audio thread\n};\noscillatorNode->scheduleAudioEvent(std::move(event));\n```\n\n`scheduleAudioEvent()` is defined on `AudioNode`. It enqueues a lambda into the node's `CrossThreadEventScheduler<BaseAudioContext>`. The audio thread drains the queue at the start of each render cycle.\n\n**Never assume immediate consistency** — by the time the audio thread processes the event, several render quanta may have passed.\n\n---\n\n## Audio → JS: `IAudioEventHandlerRegistry`\n\nSend events from the audio thread back to JS (e.g. `ended`, `loopEnded`, `positionChanged`).\n\n```cpp\n// Audio thread: fire event with no payload\naudioEventHandlerRegistry_->invokeHandlerWithEventBody(AudioEvent::ENDED, {});\n\n// Audio thread: fire event with payload\naudioEventHandlerRegistry_->invokeHandlerWithEventBody(\n    AudioEvent::POSITION_CHANGED, {{\"position\", currentPosition}});\n```\n\nInternally calls `callInvoker_->invokeAsync()` — safe to call from the audio thread.\n\n### Callback ID pattern\n\nCallbacks are stored as `std::atomic<uint64_t>` on the C++ node. `0` means no listener.\n\n```cpp\n// C++ node header\nstd::atomic<uint64_t> onEndedCallbackId_{0};\n\n// HostObject destructor — MUST clear to prevent firing into a destroyed JS function\n~AudioScheduledSourceNodeHostObject() {\n  auto node = std::static_pointer_cast<AudioScheduledSourceNode>(node_);\n  node->setOnEndedCallbackId(0);\n}\n```\n\n**Always clear callback IDs in the HostObject destructor.**\n\n---\n\n## Graph Mutations: `AudioGraphManager`\n\nConnect/disconnect operations queue via `AudioGraphManager` (its own internal SPSC channel). The audio thread calls `graphManager_->preProcessGraph()` before each render pass to apply pending changes.\n\nDo not call `AudioGraphManager` directly — go through `AudioNode::connect()` / `disconnect()`.\n\n---\n\n## Decision Table\n\n| Scenario | Correct pattern |\n|---|---|\n| JS sets a property → audio thread reads it | Shadow state in HostObject + `scheduleAudioEvent` |\n| Audio thread fires an event → JS callback | `invokeHandlerWithEventBody()` |\n| JS connects/disconnects nodes | `AudioNode::connect()` → `AudioGraphManager` |\n| Property written by audio thread, JS reads it | `std::atomic<T>` on C++ node; getter reads directly |\n| Non-primitive, can be written by audio thread | Triple buffer (see `AnalyserNode` for reference) |\n| CPU-heavy work, must not block JS or audio | `TaskOffloader` on a dedicated worker thread |\n\n---\n\n## Off-Thread Work: `TaskOffloader`\n\nFor work that would block both the JS thread and the audio thread (decoding, file writing):\n\n```cpp\nTaskOffloader<MyWorkItem> offloader([](MyWorkItem item) {\n  // runs on dedicated worker thread — allocs OK, blocking I/O OK\n  item.process();\n});\noffloader.scheduleTask(std::move(workItem));\n```\n\nSee the `utilities` skill for full API.\n\n---\n\n## Common Mistakes\n\n- **Reading `node_->field_` in a getter** when that field is written by the audio thread → use shadow state or atomics.\n- **Calling `node_->method()` directly from a setter** → always schedule via `scheduleAudioEvent`.\n- **Not clearing callback IDs in the HostObject destructor** → audio thread fires into destroyed JS function.\n- **`std::vector::push_back` in `processNode()`** → may allocate; preallocate in constructor.\n- **`std::mutex` anywhere in `processNode()`** → deadlock risk and real-time violation.\n- **Copying `shared_ptr` inside `processNode()`** — increments atomic refcount; capture before entering hot path.\n\n---\n\n*Maintenance: see [maintenance.md](maintenance.md).*\n"
  },
  {
    "path": ".claude/skills/thread-safety-itc/maintenance.md",
    "content": "# Maintenance — thread-safety-itc\n\n> Used by `/pre-push-update` only — not loaded when the `thread-safety-itc` skill is active.\n\nReview this skill when `pre-push-update` reports changes in:\n\n| Path | What to check |\n|---|---|\n| `common/cpp/audioapi/events/**` | New event types, handler patterns, `AudioEvent` enum |\n| `common/cpp/audioapi/utils/SpscChannel.hpp` | Lock-free queue API changes |\n| `common/cpp/audioapi/utils/CrossThreadEventScheduler.hpp` | Scheduler API changes — update decision table |\n| `common/cpp/audioapi/core/AudioNode.*` | Audio thread contract changes |\n| `common/cpp/audioapi/core/utils/AudioGraphManager.*` | Graph mutation queue changes |\n| Any new cross-thread primitive in `utils/` | Document in the decision table |\n"
  },
  {
    "path": ".claude/skills/turbo-modules/SKILL.md",
    "content": "---\nname: turbo-modules\ndescription: >\n  TurboModule spec, JSI binding injection, and platform native module entry points. Use when adding\n  a new native method to NativeAudioAPIModule.ts, wiring a new top-level HostObject through\n  AudioAPIModuleInstaller, debugging \"native module not found\" or \"undefined is not a function\"\n  for a global, or understanding the install() bootstrap flow on iOS and Android.\n  Trigger phrases: \"native module not found\", \"install()\", \"NativeAudioAPIModule\",\n  \"injectJSIBindings\", \"AudioAPIModuleInstaller\", \"JSI global\", \"TurboModule spec\",\n  \"module bootstrap\", \"undefined is not a function\".\n---\n\n# Skill: TurboModules & JSI Installation\n\n## When to Use TurboModule vs HostObjects\n\n**Rule**: if it needs `AVAudioSession`, `AudioManager`, `MediaSession`, or OS permissions → TurboModule. If it's audio processing → HostObject installed by `AudioAPIModuleInstaller`.\n\n| Use TurboModule method | Use HostObject property/method |\n|---|---|\n| Platform system APIs (audio session, permissions, notifications, device routing) | All audio graph operations (create/connect/disconnect nodes, AudioParam, scheduling) |\n| One-time initialization (`install`) | Real-time playback control |\n| Features that need native UI thread or system callbacks | Features that only need the JSI runtime |\n| Android-only or iOS-only behavior | Cross-platform C++ engine behavior |\n\nMost audio nodes do **not** need a TurboModule method — they are exposed entirely through JSI HostObjects injected by `injectJSIBindings`.\n\n---\n\n## Reference\n\n- RN TurboModules (new arch): https://reactnative.dev/docs/the-new-architecture/pure-cxx-modules\n- RN JSI: https://reactnative.dev/docs/the-new-architecture/architecture-glossary#javascript-interface-jsi\n- fbjni (Android JNI bridge): https://github.com/facebookincubator/fbjni\n\n---\n\n## The Big Picture\n\nMost audio functionality is exposed **not** through TurboModule method calls but through **JSI HostObjects** placed directly on the JS global object. The TurboModule's job is narrow:\n\n1. Be available early via the standard RN module system\n2. Provide `install()` — one synchronous call that injects HostObject factories onto `globalThis`\n3. Expose platform-specific system APIs (audio session, permissions, notifications, devices) that cannot be done through pure JSI\n\n```mermaid\nflowchart TD\n  A[\"JS: NativeAudioAPIModule.install()\"]\n\n  subgraph ios[\"iOS — AudioAPIModule.mm\"]\n    B[\"init AudioSessionManager · AudioEngine\\nget jsi::Runtime* · CallInvoker\"]\n  end\n\n  subgraph android[\"Android — AudioAPIModule.kt + .cpp\"]\n    C[\"MediaSessionManager.initialize()\\nJNI: injectJSIBindings()\"]\n  end\n\n  D[\"AudioAPIModuleInstaller::injectJSIBindings\\n(runtime, callInvoker, eventRegistry, uiRuntime?)\"]\n\n  subgraph globals[\"globalThis — set by injectJSIBindings\"]\n    G[\"createAudioContext\\ncreateOfflineAudioContext\\ncreateAudioRecorder\\ncreateAudioBuffer\\ncreateAudioDecoder\\ncreateAudioStretcher\\nAudioEventEmitter HostObject\"]\n  end\n\n  A --> ios\n  A --> android\n  ios --> D\n  android --> D\n  D --> globals\n```\n\nAfter `install()` returns, TypeScript code can call `globalThis.createAudioContext(sampleRate)` and get back a HostObject — no serialization, no bridge round-trip.\n\n---\n\n## TurboModule Spec (`src/specs/NativeAudioAPIModule.ts`)\n\nDefines the TypeScript interface for the native module. Codegen (React Native's codegen) generates the native binding glue from this file.\n\n```ts\ninterface Spec extends TurboModule {\n  install(): boolean;                           // synchronous — MUST run first\n  getDevicePreferredSampleRate(): number;       // synchronous\n  setAudioSessionActivity(enabled: boolean): Promise<boolean>;\n  setAudioSessionOptions(...): void;\n  observeAudioInterruptions(focusType, enabled): void;\n  requestRecordingPermissions(): Promise<PermissionStatus>;\n  // ... audio devices, notifications ...\n}\n\nconst NativeAudioAPIModule = TurboModuleRegistry.get<Spec>('AudioAPIModule')!;\n```\n\n**`install()` is synchronous** (`RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD` on iOS, `override fun install(): Boolean` on Android). It must complete before the app tries to use any audio API. It is called once during module bootstrap in `src/AudioAPIModule/index.ts`.\n\n**Web mock** (`src/specs/NativeAudioAPIModule.web.ts`): on the web platform, the whole spec is mocked with no-ops and resolved promises (e.g. permissions always return `'Granted'`). This file replaces the native spec at bundle time for web builds.\n\n---\n\n## `AudioAPIModuleInstaller` (`common/cpp/audioapi/AudioAPIModuleInstaller.h`)\n\nThe single C++ class that owns JSI injection. It is `#include`-d by both iOS (`.mm`) and Android (`.cpp`) native modules, keeping the injection logic platform-agnostic.\n\n```cpp\nclass AudioAPIModuleInstaller {\n public:\n  static void injectJSIBindings(\n      jsi::Runtime *jsiRuntime,\n      const std::shared_ptr<react::CallInvoker> &jsCallInvoker,\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      std::shared_ptr<worklets::WorkletRuntime> uiRuntime = nullptr);\n};\n```\n\nEach `get*Function()` private method creates a `jsi::Function` via `jsi::Function::createFromHostFunction()`. The lambda captures the dependencies it needs (`jsCallInvoker`, `audioEventHandlerRegistry`, `uiRuntime`) by value (shared_ptr).\n\n**Worklets guard**: functions that need the worklets runtime (AudioContext, OfflineAudioContext) have an `#if RN_AUDIO_API_ENABLE_WORKLETS` branch:\n```cpp\n#if RN_AUDIO_API_ENABLE_WORKLETS\n  auto runtimeRegistry = RuntimeRegistry{.uiRuntime = uiRuntime};\n  if (count > 1 && args[1].isObject()) {\n    runtimeRegistry.audioRuntime = worklets::extractWorkletRuntime(runtime, args[1]);\n  }\n#else\n  auto runtimeRegistry = RuntimeRegistry{};\n#endif\n```\n\n**Adding a new top-level global**: add a `static jsi::Function getCreateXxxFunction(...)` private method and a `setProperty(\"createXxx\", ...)` call in `injectJSIBindings`. This is only needed for objects that JS creates directly (not objects created as properties of another HostObject).\n\n---\n\n## iOS Native Module (`AudioAPIModule.mm`)\n\nUses ObjC++ with `RCT_EXPORT_MODULE` and `RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD`.\n\n**Key steps in `install`**:\n1. Allocate platform managers (`AudioSessionManager`, `AudioEngine`, `SystemNotificationManager`, `NotificationRegistry`)\n2. Get `jsi::Runtime *` from the bridge: `reinterpret_cast<facebook::jsi::Runtime *>(self.bridge.runtime)`\n3. Get `CallInvoker` — different paths for old Bridge vs New Architecture:\n   ```objc\n   #if defined(RCT_NEW_ARCH_ENABLED)\n     auto jsCallInvoker = _callInvoker.callInvoker;\n   #else\n     auto jsCallInvoker = self.bridge.jsCallInvoker;\n   #endif\n   ```\n4. Create `AudioEventHandlerRegistry` (owns JS callbacks, needs runtime + callInvoker)\n5. Call `AudioAPIModuleInstaller::injectJSIBindings(...)`\n\n**New Architecture support** (`getTurboModule`):\n```objc\n#ifdef RCT_NEW_ARCH_ENABLED\n- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:\n    (const facebook::react::ObjCTurboModule::InitParams &)params\n{\n  return std::make_shared<facebook::react::NativeAudioAPIModuleSpecJSI>(params);\n}\n#endif\n```\nThis connects the ObjC implementation to the codegen-generated C++ TurboModule spec.\n\n**`methodQueue`**: the module runs on a dedicated serial queue (`com.swmansion.audioapi.MainModuleQueue`), not the main thread.\n\n**`invokeHandlerWithEventName:eventBody:`**: called from Objective-C system callbacks (audio session interruption, volume change, etc.) to fire events back into JS. It converts `NSDictionary` to `std::unordered_map<std::string, EventValue>` and calls `audioEventHandlerRegistry_->invokeHandlerWithEventBody(...)`.\n\n---\n\n## Android Native Module (`AudioAPIModule.kt` + `AudioAPIModule.cpp`)\n\nAndroid uses **fbjni HybridObject** — a pattern where a Kotlin class holds a C++ peer via `HybridData`. The Kotlin class handles the Java/Kotlin TurboModule protocol; the C++ peer owns the JSI runtime pointer and call invoker.\n\n### Initialization flow\n\n```\nAudioAPIModule.kt (init block)\n  ├── System.loadLibrary(\"react-native-audio-api\")        // load .so\n  ├── get CallInvokerHolderImpl from reactContext\n  ├── get WorkletsModule if worklets enabled\n  └── mHybridData = initHybrid(workletsModule, jsContext, callInvokerHolder)\n            │\n            ▼\n      AudioAPIModule.cpp::initHybrid (JNI)\n        ├── unwrap jsCallInvoker from holder\n        ├── reinterpret_cast<jsi::Runtime *>(jsContext)\n        ├── [if worklets] get WorkletsModuleProxy\n        └── makeCxxInstance(...)   → creates C++ AudioAPIModule peer\n                └── stores: jsiRuntime_, jsCallInvoker_, audioEventHandlerRegistry_\n```\n\n```\nAudioAPIModule.kt::install()\n  ├── MediaSessionManager.initialize(...)\n  ├── NativeFileInfo.initialize(...)\n  └── injectJSIBindings()   // external fun → JNI call\n            │\n            ▼\n      AudioAPIModule.cpp::injectJSIBindings()\n        └── AudioAPIModuleInstaller::injectJSIBindings(...)\n```\n\n**`external fun`**: Kotlin keyword for JNI-implemented methods. These are registered in `AudioAPIModule.cpp::registerNatives()`:\n```cpp\nvoid AudioAPIModule::registerNatives() {\n  registerHybrid({\n    makeNativeMethod(\"initHybrid\",          AudioAPIModule::initHybrid),\n    makeNativeMethod(\"injectJSIBindings\",   AudioAPIModule::injectJSIBindings),\n    makeNativeMethod(\"invokeHandlerWithEventNameAndEventBody\", ...),\n  });\n}\n```\n\n`registerNatives()` is called from `android/src/main/cpp/audioapi/android/OnLoad.cpp` at `.so` load time.\n\n**`invokeHandlerWithEventNameAndEventBody`**: called from Kotlin (MediaSessionManager callbacks) to fire events into JS. Takes a Java `Map<String, Object>` and converts to `std::unordered_map<std::string, EventValue>`.\n\n---\n\n## Two-Architecture Paths Summary\n\n| | Old Bridge | New Architecture (TurboModules/Fabric) |\n|---|---|---|\n| iOS CallInvoker source | `self.bridge.jsCallInvoker` | `_callInvoker.callInvoker` |\n| iOS runtime source | `self.bridge.runtime` (cast) | same |\n| iOS codegen | `RCT_EXPORT_MODULE` only | `+ getTurboModule:` implemented |\n| Android CallInvoker | `reactContext.jsCallInvokerHolder` | same |\n| Android codegen | `NativeAudioAPIModuleSpec` base class | same (generated) |\n\nThe JSI injection itself (`AudioAPIModuleInstaller`) is identical for both architectures — it only needs the `jsi::Runtime *` and `CallInvoker`, which are obtained differently but behave the same.\n\n---\n\n---\n\n*Maintenance: see [maintenance.md](maintenance.md).*\n"
  },
  {
    "path": ".claude/skills/turbo-modules/maintenance.md",
    "content": "# Maintenance — turbo-modules\n\n> Used by `/pre-push-update` only — not loaded when the `turbo-modules` skill is active.\n\nReview this skill when `pre-push-update` reports changes in:\n\n| Path | What to check |\n|---|---|\n| `src/specs/NativeAudioAPIModule.ts` | Spec interface — new methods, changed signatures |\n| `common/cpp/audioapi/AudioAPIModuleInstaller.h` | New globals injected, new HostObjects installed |\n| `ios/audioapi/ios/AudioAPIModule.mm` | iOS install flow, new platform managers, new RCT_EXPORT_METHOD |\n| `android/src/main/java/.../AudioAPIModule.kt` | Android `install()`, new `external fun`, lifecycle changes |\n| `android/src/main/cpp/audioapi/android/AudioAPIModule.cpp` | New `registerNatives` entries |\n\nUpdate the **install flow diagram** when new globals are added to `injectJSIBindings`.\n"
  },
  {
    "path": ".claude/skills/utilities/SKILL.md",
    "content": "---\nname: utilities\ndescription: >\n  Overview of all shared utility helpers, data structures, and DSP primitives available in\n  react-native-audio-api. Covers C++ utilities in common/cpp/audioapi/utils/,\n  common/cpp/audioapi/core/utils/, common/cpp/audioapi/dsp/, and TypeScript utilities in\n  src/utils/. Use this skill before writing new math, buffer management, or cross-thread code —\n  check if a utility already exists. Trigger phrases: \"add a new utility\", \"what helpers are\n  available\", \"cross-thread communication\", \"audio buffer\", \"DSP math\", \"circular buffer\",\n  \"lock-free queue\", \"off-thread\", \"SIMD buffer\", \"time conversion\", \"parameter automation\",\n  \"audio constants\", \"TypeScript utils\".\n---\n\n# Skill: Utilities\n\n## `common/cpp/audioapi/utils/` — Core data structures & primitives\n\n### `AudioArray.h` — float audio array (read header for full API)\n\nSingle-channel float buffer. The foundational data type. Use for any per-channel audio data.\n\nKey operations: `zero()`, `sum(source, gain)`, `multiply(source)`, `copy(source)`, `copyReverse(...)`, `copyTo(float*)`, `copyWithin(...)`, `scale(float)`, `normalize()`, `getMaxAbsValue()`, `computeConvolution(kernel)`.\n\nAccess: `operator[]`, `begin()`/`end()`, `span()`, `subSpan(length, offset)`.\n\nConstructors copy data — `AudioArray` always owns its buffer.\n\n---\n\n### `AudioBuffer.h` — multi-channel container (read header for full API)\n\nHolds N channels of `AudioArrayBuffer`. Handles up/down-mixing automatically on `sum()` and `copy()`.\n\nKey operations: `getChannel(index)`, `getSharedChannel(index)`, `zero()`, `sum(source, interpretation)`, `copy(source)`, `deinterleaveFrom(float*, frames)`, `interleaveTo(float*, frames)`, `normalize()`, `scale(float)`.\n\nChannel layout constants: `ChannelMono=0`, `ChannelLeft=0`, `ChannelRight=1`, `ChannelCenter=2`, `ChannelLFE=3`, `ChannelSurroundLeft=4`, `ChannelSurroundRight=5`.\n\n`getChannel()` returns a non-owning `AudioArray*`. `getSharedChannel()` returns `shared_ptr<AudioArrayBuffer>` (use for JSI transfer).\n\n---\n\n### `AudioArrayBuffer.hpp` — JSI-transferable audio array\n\n`AudioArray` + `jsi::MutableBuffer`. Allows zero-copy transfer of audio data to JS as an `ArrayBuffer`. Use in `getChannelData()` patterns.\n\n```cpp\n// Typical usage in HostObject — no copy, JS sees the native memory\nauto audioArrayBuffer = audioBuffer_->getSharedChannel(channel);\nauto arrayBuffer = jsi::ArrayBuffer(runtime, audioArrayBuffer);\nauto float32Array = runtime.global()\n    .getPropertyAsFunction(runtime, \"Float32Array\")\n    .callAsConstructor(runtime, arrayBuffer)\n    .getObject(runtime);\nfloat32Array.setExternalMemoryPressure(runtime, audioArrayBuffer->size());\n```\n\n---\n\n### `CircularAudioArray.h` — circular float buffer (read header)\n\n`AudioArray` subclass acting as a circular queue for streaming audio. **Not thread-safe** — use only from one thread.\n\nKey operations:\n- `push_back(AudioArray&, size)` / `push_back(float*, size)` — write frames\n- `pop_front(AudioArray&, size)` / `pop_front(float*, size)` — read oldest frames\n- `pop_back(AudioArray&, size, offset)` — read newest frames\n- `getNumberOfAvailableFrames()` — how many frames ready to read\n\nUsed in delay lines and streaming buffers.\n\n---\n\n### `CircularOverflowableAudioArray.h` — overwritable circular buffer\n\nLike `CircularAudioArray` but overwrites oldest data when full instead of rejecting. Use for recording input where you always want the latest data, not the oldest.\n\n---\n\n### `SpscChannel.hpp` — lock-free SPSC channel\n\nBounded single-producer, single-consumer queue built on aligned atomics. **Do not use directly — prefer `CrossThreadEventScheduler` or `TaskOffloader`** unless you need fine-grained control.\n\nFor full API see [api.md](api.md#spscchannelhpp--lock-free-spsc-channel).\n\n---\n\n### `CrossThreadEventScheduler.hpp` — JS→audio event queue\n\nHigh-level wrapper over `SpscChannel` for scheduling lambdas from the JS thread to be executed on the audio thread. This is **the standard way** to send updates from JS to audio.\n\nFor full API see [api.md](api.md#crossthreadeventschedulerhpp--jsaudio-event-queue).\n\n---\n\n### `AlignedAllocator.hpp` — aligned STL allocator\n\nSTL-compatible allocator that guarantees `N`-byte alignment (default 16 bytes, SIMD-friendly). Use when creating buffers that will be processed by SIMD code in `VectorMath`.\n\nFor full API see [api.md](api.md#alignedallocatorhpp--aligned-stl-allocator).\n\n---\n\n### `MoveOnlyFunction.hpp` — non-copyable function wrapper\n\nBackport of C++23 `std::move_only_function`. Use instead of `std::function` when the callable captures a move-only type (e.g. a `unique_ptr`).\n\nFor full API see [api.md](api.md#moveonlyfunctionhpp--non-copyable-function-wrapper).\n\n---\n\n### `Result.hpp` — Rust-style Result<T,E>\n\nRepresents either success (`Ok`) or error (`Err`). Use at API boundaries (e.g. `AudioRecorder::start()`). Use `NoneType` / `None` for void variants.\n\nFor full API see [api.md](api.md#resulthpp--rust-style-resultte).\n\n---\n\n### `RingBiDirectionalBuffer.hpp` — compile-time capacity ring deque\n\nNon-thread-safe bounded ring buffer with push/pop from both ends. Capacity is a **compile-time** power-of-two template parameter. Used for `AudioParamEventQueue`.\n\nFor full API see [api.md](api.md#ringbidirectionalbufferhpp--compile-time-capacity-ring-deque).\n\n---\n\n### `TaskOffloader.hpp` — worker thread with SPSC input\n\nSpawns a dedicated worker thread that processes items from a SPSC channel. Use when you need to offload a recurring task (e.g. file writing, decoding) to a dedicated thread.\n\nFor full API see [api.md](api.md#taskoffloaderhpp--worker-thread-with-spsc-input).\n\n---\n\n### `Benchmark.hpp` — timing utilities (dev/debug only)\n\nUse `getExecutionTime()` for one-shot nanosecond timing. **Do not leave `logAvgExecutionTime` in production code.**\n\nFor full API see [api.md](api.md#benchmarkhpp--timing-utilities-devdebug-only).\n\n---\n\n### `UnitConversion.h` — byte unit constants\n\n```cpp\naudioapi::KB_IN_BYTES   // 1024.0\naudioapi::MB_IN_BYTES   // 1024 * 1024.0\naudioapi::GB_IN_BYTES   // 1024^3.0\n```\n\n---\n\n## `common/cpp/audioapi/core/utils/` — Node and context utilities\n\n### `Constants.h` — global audio constants\n\n```cpp\nRENDER_QUANTUM_SIZE   = 128      // frames per render block — never hardcode 128\nMAX_FFT_SIZE          = 32768\nMAX_CHANNEL_COUNT     = 32\nOCTAVE_RANGE          = 1200     // cents per octave\nPI                    = std::numbers::pi_v<float>\nMOST_POSITIVE_SINGLE_FLOAT / MOST_NEGATIVE_SINGLE_FLOAT\nPROMISE_VENDOR_THREAD_POOL_WORKER_COUNT = 4\n```\n\n---\n\n### `AudioDestructor.hpp` — off-thread destruction\n\nOffloads `shared_ptr` destruction to a dedicated worker thread. Use for any object whose destructor may block or deallocate large buffers — both are forbidden on the audio thread.\n\nFor full API see [api.md](api.md#audiodestructorhpp--off-thread-destruction).\n\n---\n\n### `ParamChangeEvent.hpp` — AudioParam automation event\n\nRepresents a single Web Audio API automation command (`setValueAtTime`, `linearRampToValueAtTime`, etc.). Move-only. Used exclusively within `AudioParamEventQueue` — do not construct outside of `AudioParam` scheduling methods.\n\nFor full API see [api.md](api.md#paramchangeeventhpp--audioparam-automation-event).\n\n---\n\n### `AudioParamEventQueue.h` — sorted automation event queue\n\nStores and processes `ParamChangeEvent` objects in time order on the audio thread. Read the header for full API.\n\n---\n\n### `AudioGraphManager.h` — thread-safe graph mutation queue\n\nQueues connect/disconnect operations from the JS thread for application before each render pass. Do not call its methods directly — go through `AudioNode::connect()`/`disconnect()`. Read the header for implementation details.\n\n---\n\n### `Locker.h` — nullable mutex RAII wrapper\n\nRAII mutex wrapper that can hold `nullptr` (no-op). Supports `Locker::tryLock(mutex)` for non-blocking acquisition. **Do not use on the audio thread.** Locks are forbidden in `processNode()`.\n\n---\n\n### Other `core/utils/` classes\n\n- **`AudioDecoder.h`** — decodes audio files to `AudioBuffer` (FFmpeg, conditional). Read the header.\n- **`AudioFileWriter.h`** — writes PCM to audio files. Read the header.\n- **`AudioStretcher.h`** — pitch/time stretching (signalsmith-stretch). Read the header.\n- **`AudioRecorderCallback.h`** — callback adapter for the platform recorder. Internal.\n- **`worklets/WorkletsRunner.h`** — manages JS worklet execution on the audio thread. Internal.\n\n---\n\n## `common/cpp/audioapi/dsp/` — DSP helpers\n\n### `AudioUtils.hpp` — inline DSP math\n\nProvides `timeToSampleFrame()`, `sampleFrameToTime()`, `linearInterpolate()`, `linearToDecibels()`, `decibelsToLinear()`.\n\nFor full API see [api.md](api.md#audioutilshpp--inline-dsp-math).\n\n---\n\n### `VectorMath.h` — SIMD-optimized vector math\n\nSIMD-accelerated array operations (ARM NEON / x86 SSE2). Use for per-channel hot-path processing. Read the header for available functions before writing manual loops.\n\n---\n\n### `FFT.h` / `Convolver.h` / `Resampler.h` / `WaveShaper.h` / `Windows.hpp`\n\nHigher-level DSP blocks. Read each header before use.\n\n---\n\n## `src/utils/` — TypeScript utilities\n\n### `paths.ts`\n\n```ts\nimport { isRemoteSource, isBase64Source, isDataBlobString } from './utils/paths';\n\nisRemoteSource(url)      // true if starts with http:// or https://\nisBase64Source(data)     // true if 'data:audio/...;base64,...'\nisDataBlobString(data)   // true if starts with 'blob:'\n```\n\nUse before passing a URL/path to decoder or streaming APIs to determine the source type.\n\n---\n\n### `filePresets.ts`\n\n```ts\nimport FilePreset from './utils/filePresets';\n\nFilePreset.Low        // 22050 Hz, 48kbps,  16-bit\nFilePreset.Medium     // 44100 Hz, 128kbps, 16-bit\nFilePreset.High       // 48000 Hz, 192kbps, 24-bit\nFilePreset.Lossless   // 48000 Hz, 320kbps, 24-bit, FLAC L8\n```\n\nUse when configuring `AudioRecorder` file output instead of building `FilePresetType` objects manually.\n\n---\n\n*Maintenance: see [maintenance.md](maintenance.md).*\n"
  },
  {
    "path": ".claude/skills/utilities/api.md",
    "content": "# Utilities API Reference — Full .hpp Documentation\n\n> This file contains the detailed API documentation for template/inline utilities in `common/cpp/audioapi/utils/`, `common/cpp/audioapi/core/utils/`, and `common/cpp/audioapi/dsp/`.\n>\n> For a concise overview and when-to-use guidance, see [SKILL.md](SKILL.md).\n\n---\n\n## `SpscChannel.hpp` — lock-free SPSC channel\n\nBounded single-producer, single-consumer queue built on aligned atomics. **Do not use directly — prefer `CrossThreadEventScheduler` or `TaskOffloader`** unless you need fine-grained control.\n\n```cpp\n// Create a channel\nauto [sender, receiver] = channels::spsc::channel<MyType>(capacity);\n// Optional template params: OverflowStrategy, WaitStrategy\n\n// Sender (producer thread)\nsender.try_send(value);   // non-blocking, returns ResponseStatus\nsender.send(value);       // blocks until space available\n\n// Receiver (consumer thread)\nResponseStatus s = receiver.try_receive(value);  // non-blocking\nT val = receiver.receive();                       // blocks until data available\n```\n\n**OverflowStrategy:**\n- `WAIT_ON_FULL` (default) — `try_send` returns `CHANNEL_FULL` when full\n- `OVERWRITE_ON_FULL` — overwrites oldest element (use with `BUSY_LOOP`)\n\n**WaitStrategy** (affects blocking `send`/`receive`):\n- `BUSY_LOOP` (default) — spin loop; lowest latency, highest CPU\n- `YIELD` — `std::this_thread::yield()`; lower CPU, higher latency\n- `ATOMIC_WAIT` — `std::atomic::wait()`; good for long waits (destructor threads)\n\n**ResponseStatus:** `SUCCESS`, `CHANNEL_FULL`, `CHANNEL_EMPTY`, `SKIP_DUE_TO_OVERWRITE`.\n\nReal capacity rounds up to next power of two.\n\n---\n\n## `CrossThreadEventScheduler.hpp` — JS→audio event queue\n\nHigh-level wrapper over `SpscChannel` for scheduling lambdas from the JS thread to be executed on the audio thread. This is **the standard way** to send updates from JS to audio.\n\n```cpp\n// Declaration (e.g. in AudioNode or AudioParam)\nCrossThreadEventScheduler<MyNode> eventScheduler_{/*capacity=*/64};\n\n// JS thread — schedule a change\neventScheduler_.scheduleEvent([newValue](MyNode &node) {\n    node.setSomething(newValue);\n});\n// returns false if queue is full (drop the event or handle it)\n\n// Audio thread — drain all pending events before processNode()\neventScheduler_.processAllEvents(*this);\n```\n\nTemplate parameter `T` is the type passed by reference to each event lambda. For `AudioNode` subclasses, `T = BaseAudioContext` (events are called with the context). For `AudioParam`, `T = AudioParam` itself.\n\nNot copyable. Use `std::shared_ptr` if shared ownership is needed across threads.\n\n---\n\n## `AlignedAllocator.hpp` — aligned STL allocator\n\nSTL-compatible allocator that guarantees `N`-byte alignment. Default alignment is 16 bytes (SIMD-friendly).\n\n```cpp\n// 16-byte aligned float vector (default)\nstd::vector<float, AlignedAllocator<float>> buf(1024);\n\n// Custom alignment (e.g. 64 bytes for AVX-512)\nstd::vector<float, AlignedAllocator<float, 64>> buf(1024);\n```\n\nUse when creating buffers that will be processed by SIMD code in `VectorMath`.\n\n---\n\n## `MoveOnlyFunction.hpp` — non-copyable function wrapper\n\nBackport of C++23 `std::move_only_function`. Use instead of `std::function` when the callable captures a move-only type (e.g. a `unique_ptr`).\n\n```cpp\naudioapi::move_only_function<void(BaseAudioContext&)> event = [ptr = std::move(uniquePtr)](BaseAudioContext &) {\n    ptr->doSomething();\n};\n// move into the scheduler\neventScheduler_.scheduleEvent(std::move(event));\n```\n\nNot copyable. Throws `std::bad_function_call` if invoked when empty.\n\n---\n\n## `Result.hpp` — Rust-style Result<T,E>\n\nRepresents either success (`Ok`) or error (`Err`). Used at API boundaries (e.g. `AudioRecorder::start()`).\n\n```cpp\n// Creating\nResult<std::string, std::string> res = Ok(std::string(\"path/to/file\"));\nResult<std::string, std::string> err = Err(std::string(\"permission denied\"));\n\n// Checking and extracting\nif (result.is_ok()) {\n    std::string path = std::move(result).unwrap();\n}\nif (result.is_err()) {\n    std::string msg = std::move(result).unwrap_err();\n}\n\n// With default\nstd::string path = std::move(result).unwrap_or(std::string(\"default\"));\n\n// Transforming\nauto mapped     = std::move(result).map([](std::string s) { return s.size(); });\nauto mapped_err = std::move(result).map_err([](std::string e) { return -1; });\n\n// Chaining\nauto chained = std::move(result).and_then([](std::string s) -> Result<int, std::string> {\n    return Ok(42);\n});\n```\n\nUse `NoneType` / `None` for void variants: `Result<NoneType, std::string>`.\n\n---\n\n## `RingBiDirectionalBuffer.hpp` — compile-time capacity ring deque\n\nNon-thread-safe bounded ring buffer with push/pop from both ends. Capacity is a **compile-time** power-of-two template parameter.\n\n```cpp\nRingBiDirectionalBuffer<MyEvent, 128> queue;  // capacity must be power of 2\n\nqueue.pushBack(event);   // add to back, returns false if full\nqueue.pushFront(event);  // add to front, returns false if full\n\nMyEvent e;\nqueue.popFront(e);       // remove from front into e, returns false if empty\nqueue.popBack(e);        // remove from back into e, returns false if empty\nqueue.popFront();        // discard front element\nqueue.popBack();         // discard back element\n\nconst MyEvent &front = queue.peekFront();   // const peek, no removal\nMyEvent &back = queue.peekBackMut();        // mutable peek\n\nqueue.isEmpty(); queue.isFull();\nqueue.size(); queue.getCapacity();          // real capacity = getCapacity() - 1\n```\n\nUsed for `AudioParamEventQueue` (parameter automation event storage on the audio thread).\n\n---\n\n## `TaskOffloader.hpp` — worker thread with SPSC input\n\nSpawns a dedicated worker thread that processes items from a SPSC channel. Use when you need to offload a recurring task (e.g. file writing, decoding) to a dedicated thread.\n\n```cpp\n// T must be default_initializable\nTaskOffloader<AudioData,\n    OverflowStrategy::WAIT_ON_FULL,\n    WaitStrategy::ATOMIC_WAIT> offloader{\n    /*capacity=*/64,\n    [](AudioData data) {    // runs on worker thread\n        writeToFile(data);\n    }\n};\n\n// Push work from any thread\nauto *sender = offloader.getSender();\nsender->send(audioData);\n```\n\nNot copyable or movable. Destructor sends a dummy value to unblock the worker and joins the thread.\n\n---\n\n## `Benchmark.hpp` — timing utilities (dev/debug only)\n\n```cpp\n#include <audioapi/utils/Benchmark.hpp>\n\n// One-shot timing — returns nanoseconds\ndouble ns = audioapi::benchmarks::getExecutionTime([]{ doSomething(); });\n\n// Running average with logging (NOT thread-safe, not for production)\naudioapi::benchmarks::logAvgExecutionTime(\"render quantum\", []{ renderAudio(); });\n```\n\n**Do not leave `logAvgExecutionTime` in production code.**\n\n---\n\n## `AudioDestructor.hpp` — off-thread destruction\n\nOffloads `shared_ptr` destruction to a dedicated worker thread. Use for any object whose destructor may block or deallocate large buffers — both are forbidden on the audio thread.\n\n```cpp\n// Typically owned by AudioContext or BaseAudioContext\nAudioDestructor<AudioNode> destructor;\n\n// Audio thread — hand off a node for destruction without blocking\nbool ok = destructor.tryAddForDeconstruction(std::move(nodePtr));\n// if false (queue capacity=1024 is full), the shared_ptr is NOT moved\n```\n\nThe worker thread blocks on receive and drops the `shared_ptr`, triggering the destructor off the audio thread.\n\n---\n\n## `ParamChangeEvent.hpp` — AudioParam automation event\n\nRepresents a single Web Audio API automation command (`setValueAtTime`, `linearRampToValueAtTime`, etc.). Stores timing, start/end values, and a `calculateValue_` lambda. Move-only.\n\n```cpp\nParamChangeEvent event(\n    startTime, endTime, startValue, endValue,\n    [](double start, double end, float startVal, float endVal, double currentTime) -> float {\n        return computedValue;  // interpolation logic\n    },\n    ParamChangeEventType::LINEAR_RAMP\n);\n\nevent.getStartTime(); event.getEndTime();\nevent.getStartValue(); event.getEndValue();\nevent.getCalculateValue();   // the interpolation lambda\nevent.getType();\n\n// Mutators used by AudioParamEventQueue when adjusting event boundaries:\nevent.setEndTime(t); event.setStartValue(v); event.setEndValue(v);\n```\n\nUsed exclusively within `AudioParamEventQueue`. Do not construct outside of `AudioParam` scheduling methods.\n\n---\n\n## `AudioUtils.hpp` — inline DSP math\n\n```cpp\n#include <audioapi/dsp/AudioUtils.hpp>\nusing namespace audioapi::dsp;\n\nsize_t frame = timeToSampleFrame(time, sampleRate);   // double → size_t\ndouble t     = sampleFrameToTime(frame, sampleRate);  // int → double\n\n// Linear interpolation with edge-case handling (extrapolates at end of array)\nfloat v = linearInterpolate(span, firstIndex, secondIndex, factor);\n\nfloat db     = linearToDecibels(linearValue);    // 20 * log10(v)\nfloat linear = decibelsToLinear(dbValue);        // 10^(db/20)\n```\n\n"
  },
  {
    "path": ".claude/skills/utilities/maintenance.md",
    "content": "# Maintenance — utilities\n\n> Used by `/pre-push-update` only — not loaded when the `utilities` skill is active.\n\nReview this skill when `pre-push-update` reports changes in:\n\n| Path | What to check |\n|---|---|\n| `common/cpp/audioapi/utils/*.h` | New utility added — add brief usage note to `SKILL.md` |\n| `common/cpp/audioapi/utils/SpscChannel.hpp` | `api.md` — API, OverflowStrategy/WaitStrategy values, ResponseStatus enum |\n| `common/cpp/audioapi/utils/CrossThreadEventScheduler.hpp` | `api.md` — template parameter meaning, `scheduleEvent` return value |\n| `common/cpp/audioapi/utils/AlignedAllocator.hpp` | `api.md` — default alignment, constructor signature |\n| `common/cpp/audioapi/utils/MoveOnlyFunction.hpp` | `api.md` — signature, throw behaviour |\n| `common/cpp/audioapi/utils/Result.hpp` | `api.md` — Ok/Err constructors, method signatures |\n| `common/cpp/audioapi/utils/RingBiDirectionalBuffer.hpp` | `api.md` — push/pop/peek method names, capacity rules |\n| `common/cpp/audioapi/utils/TaskOffloader.hpp` | `api.md` — constructor, `getSender`, destructor behaviour |\n| `common/cpp/audioapi/utils/Benchmark.hpp` | `api.md` — function names, return type |\n| `common/cpp/audioapi/core/utils/AudioDestructor.hpp` | `api.md` — `tryAddForDeconstruction` signature, capacity |\n| `common/cpp/audioapi/core/utils/ParamChangeEvent.hpp` | `api.md` — constructor args, getters/setters |\n| `common/cpp/audioapi/dsp/AudioUtils.hpp` | `api.md` — new DSP helpers added or signatures changed |\n| `common/cpp/audioapi/core/utils/Constants.h` | Constants section in `SKILL.md` |\n| `src/utils/**` | TypeScript utils section in `SKILL.md` |\n"
  },
  {
    "path": ".claude/skills/web-audio-api/SKILL.md",
    "content": "---\nname: web-audio-api\ndescription: >\n  Web Audio API spec reference and browser passthrough layer (src/web-core/). Use when implementing\n  a node that must match the Web Audio API spec, checking parameter default values and ranges,\n  adding or modifying src/web-core/ wrapper classes, deciding whether a feature belongs to the spec\n  or is an RN-specific extension, or updating the coverage table.\n  Trigger phrases: \"web-core\", \"spec compliance\", \"coverage table\", \"api.web.ts\", \"Web Audio spec\",\n  \"parameter default\", \"browser passthrough\", \"not in spec\", \"spec deviation\",\n  \"webaudio.github.io\".\n---\n\n# Skill: Web Audio API\n\n## Spec Reference\n\nEverything that has a counterpart in the Web Audio API specification must match it:\n\n- **Spec**: https://webaudio.github.io/web-audio-api/\n- **MDN reference**: https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API\n\nKey spec sections to check when implementing or reviewing a node:\n- Processing model and render quantum (128 frames)\n- `AudioNode` channel count rules and `channelCountMode` / `channelInterpretation`\n- `AudioParam` automation methods, value clamping, and timing\n- Each node's constructor options, property defaults, and valid ranges\n\n---\n\n## Platform Routing\n\nThe library ships **one TypeScript API** that runs on two platforms. The entry point swap happens via package.json field resolution:\n\n```\nindex.ts          # re-exports from api.ts (or api.web.ts on web)\n├── api.ts        # React Native — re-exports from src/core/*\n└── api.web.ts    # Browser — re-exports from src/web-core/*\n```\n\nOn **React Native**: classes in `src/core/` hold a reference to a C++ JSI HostObject. All method calls go to native.\n\nOn **Web (browser)**: classes in `src/web-core/` wrap the corresponding `globalThis.*` (browser Web Audio API) object. All method calls delegate directly to the browser engine.\n\nBoth sides share:\n- The same TypeScript interfaces (`src/interfaces.ts`)\n- The same types (`src/types.ts`)\n- The same error classes (`src/errors/`)\n- The same hooks (`src/hooks/`)\n\n---\n\n## `src/web-core/` — Browser Passthrough Layer\n\nEach file in `src/web-core/` is a thin wrapper around the corresponding browser API object. The pattern is:\n\n**Constructor**: instantiate the browser node via `globalThis.XxxNode` (or `new window.AudioContext`), store it as `this.node` (or `this.context`), read readonly properties from it.\n\n**Getters/setters/methods**: delegate directly to `this.node`.\n\n**AudioParam**: wrapped in the local `AudioParam` class (which stores `this.param: globalThis.AudioParam` and delegates all automation calls).\n\n```ts\n// Example: GainNode.tsx (minimal)\nexport default class GainNode extends AudioNode {\n  readonly gain: AudioParam;\n\n  constructor(context: BaseAudioContext, gainOptions?: GainOptions) {\n    const gain = new globalThis.GainNode(context.context, gainOptions);\n    super(context, gain);\n    this.gain = new AudioParam(gain.gain, context);\n  }\n}\n\n// Example: OscillatorNode.tsx (with extra validation)\npublic set type(value: OscillatorType) {\n  if (value === 'custom') {\n    throw new InvalidStateError(\"'type' cannot be set to 'custom' directly...\");\n  }\n  (this.node as globalThis.OscillatorNode).type = value;\n}\n```\n\n**`AudioContext`** (web) wraps `window.AudioContext`. It also adds validation matching the RN side (e.g. sampleRate range check) so error behaviour is consistent across platforms.\n\n**`decodeAudioData`** on web additionally supports a `string` URL source (fetches the file, then decodes). This is a deliberate extension beyond the browser spec signature (which only takes `ArrayBuffer`), mirroring the RN native implementation.\n\n### Rules for web-core code\n\n- Every public method/property must have a direct counterpart in the spec (or be in `custom/`)\n- Extra validation (range checks, length checks) is fine — it makes error messages consistent with the RN side\n- No business logic — the browser engine is the source of truth for audio processing\n- If a node does not exist in the browser, it goes in `src/web-core/custom/`\n\n---\n\n## `src/web-core/custom/` — RN Extensions on Web\n\nNodes or features that don't exist in the Web Audio API spec but are in this library as mobile extensions. The `custom/index.ts` re-exports them and `api.web.ts` re-exports the custom barrel.\n\nCurrently: signalsmith-stretch WASM wrapper (`LoadCustomWasm.ts`, `signalsmithStretch/`) for time-stretch on web.\n\nWhen adding a new RN-specific feature that should also work on web, implement the web version here.\n\n---\n\n## Implementation Coverage\n\nCurrent status (from `packages/audiodocs/docs/other/web-audio-api-coverage.mdx`):\n\n### Fully implemented ✅\n`AnalyserNode`, `AudioBuffer`, `AudioBufferSourceNode`, `AudioDestinationNode`, `AudioNode`, `AudioParam`, `AudioScheduledSourceNode`, `BiquadFilterNode`, `ConstantSourceNode`, `ConvolverNode`, `DelayNode`, `GainNode`, `IIRFilterNode`, `OfflineAudioContext`, `OscillatorNode`, `PeriodicWave`, `StereoPannerNode`, `WaveShaperNode`\n\n### Partially implemented 🚧\n| Interface | What's available |\n|---|---|\n| `AudioContext` | `close`, `suspend`, `resume`, `currentTime`, `destination`, `sampleRate`, `state` |\n| `BaseAudioContext` | `currentTime`, `destination`, `sampleRate`, `state`, `decodeAudioData`, all `create*` for available nodes |\n\n### Not yet implemented ❌\n`AudioListener`, `AudioSinkInfo`, `AudioWorklet`, `AudioWorkletGlobalScope`, `AudioWorkletNode`, `AudioWorkletProcessor`, `ChannelMergerNode`, `ChannelSplitterNode`, `DynamicsCompressorNode`, `MediaElementAudioSourceNode`, `MediaStreamAudioDestinationNode`, `MediaStreamAudioSourceNode`, `PannerNode`\n\n**Goal**: everything in the Web Audio API spec should eventually be in this library. If you implement a node from the ❌ list, update the coverage table in `packages/audiodocs/docs/other/web-audio-api-coverage.mdx`.\n\n---\n\n## RN-Specific Extensions (beyond spec)\n\nThese are exported from `api.ts` but **not** from `api.web.ts` (or have a stub/custom web implementation):\n\n| Class | Purpose |\n|---|---|\n| `AudioBufferQueueSourceNode` | Queue of audio buffers, plays them sequentially — no Web Audio spec equivalent |\n| `StreamerNode` | FFmpeg-backed streaming decoder — no Web Audio spec equivalent |\n| `AudioRecorder` | Microphone input recording — no Web Audio spec equivalent |\n| `RecorderAdapterNode` | Connects recorder to the audio graph |\n| `WorkletNode` / `WorkletSourceNode` / `WorkletProcessingNode` | JS-on-audio-thread via React Native Worklets — different from browser `AudioWorkletNode` |\n| `AudioManager` | iOS/Android audio session management (permissions, routing, interruption handling) |\n| `changePlaybackSpeed` (`AudioStretcher`) | Time-stretch without pitch change |\n| `decodeAudioData` (standalone) | Standalone decode utility (not on context) |\n| `decodePCMInBase64` | Decode raw PCM from base64 |\n\nWhen implementing these on the RN side, a web stub or polyfill in `src/web-core/custom/` should be considered if the feature can be reasonably approximated in a browser.\n\n---\n\n## Adding a New Spec Node — Web Layer Checklist\n\nWhen adding a new Web Audio API node that is in the spec:\n\n1. **Implement `src/web-core/MyNode.tsx`**\n   - Extend the right base class (`AudioNode`, `AudioScheduledSourceNode`)\n   - Constructor: `new globalThis.MyNode(context.context, options)`\n   - Wrap all `AudioParam` properties in `new AudioParam(node.myParam, context)`\n   - Delegate all getters/setters/methods to `this.node`\n   - Add any validation that matches the RN side's error behaviour\n\n2. **Export from `src/api.web.ts`**\n   ```ts\n   export { default as MyNode } from './web-core/MyNode';\n   ```\n\n3. **Ensure the interface in `src/interfaces.ts`** (or a dedicated interface file) is shared between both paths.\n\n4. **Update the coverage table** in `packages/audiodocs/docs/other/web-audio-api-coverage.mdx` — move the node from ❌ to ✅.\n\nIf the node **does not exist in the browser** (e.g. `AudioBufferQueueSourceNode`):\n- Add a stub or alternative implementation in `src/web-core/custom/`\n- Export it from `src/web-core/custom/index.ts`\n- It will be picked up automatically by the `export * from './web-core/custom'` line in `api.web.ts`\n\n---\n\n## Spec Compliance Notes\n\nWhen in doubt, cross-check the spec. Key invariants that are easy to get wrong:\n\n- **`feedback[0]` must not be 0** for `IIRFilterNode` — the spec requires it; we validate in TypeScript and in C++.\n- **`feedforward` all-zeros** must throw `InvalidStateError` — the spec requires at least one non-zero coefficient.\n- **`OscillatorNode.type = 'custom'`** must throw `InvalidStateError` — use `setPeriodicWave()` instead.\n- **`AudioParam` min/max** — must match the spec's exact values; do not invent ranges.\n- **`createBuffer` / `createDelay` / `createPeriodicWave`** — the spec defines when these throw and what error type. Match it.\n- **`decodeAudioData`** — on RN side, we extend it to accept a URL string in addition to `ArrayBuffer`. This is intentional and documented.\n- **`sampleRate` range** — spec says [8000, 96000]; enforced in `AudioContext` constructor on both platforms.\n\n---\n\n*Maintenance: see [maintenance.md](maintenance.md).*\n"
  },
  {
    "path": ".claude/skills/web-audio-api/maintenance.md",
    "content": "# Maintenance — web-audio-api\n\n> Used by `/pre-push-update` only — not loaded when the `web-audio-api` skill is active.\n\nReview this skill when `pre-push-update` reports changes in:\n\n| Path | What to check |\n|---|---|\n| `src/web-core/**` | New or modified web wrapper — update pattern docs or coverage table |\n| `src/api.web.ts` | New export — add to coverage table or RN-extensions table |\n| `src/api.ts` | New RN-only export — add to RN-specific extensions table |\n| `packages/audiodocs/docs/other/web-audio-api-coverage.mdx` | Coverage table sync |\n| `src/web-core/custom/**` | New web-side RN extension |\n"
  },
  {
    "path": ".claude/skills/writing-skills/SKILL.md",
    "content": "---\nname: writing-skills\ndescription: >\n  How to write, structure, and maintain Claude skill files. Covers the three-level progressive\n  disclosure model, all YAML frontmatter fields (context:fork, allowed-tools,\n  disable-model-invocation, user-invocable, hooks, argument-hint), invocation control patterns,\n  string substitutions ($ARGUMENTS, ${CLAUDE_SKILL_DIR}), shell preprocessing with backtick\n  syntax, and the Maintenance section contract. Use when creating a new skill file, rewriting an\n  existing one, or reviewing a skill for quality.\n  Trigger phrases: \"add a skill\", \"write a skill\", \"create a skill file\", \"update skill\",\n  \"skill quality\", \"skill review\", \"context fork\", \"allowed-tools\", \"user-invocable\".\nuser-invocable: false\n---\n\n# Skill: Writing Skills\n\nA skill file is a scoped knowledge document that Claude loads on demand. Good skills are concise, trigger reliably, and stay accurate over time.\n\n---\n\n## Three-Level Model\n\n```\nLevel 1 — YAML frontmatter       always loaded, ~100 tokens\nLevel 2 — skill body (SKILL.md)  loaded on trigger, < 500 lines / ~5 k tokens\nLevel 3 — supporting .md files   loaded explicitly when more detail is needed\n```\n\nClaude sees the `description` field in every conversation. It reads the skill body only when the topic is relevant. It reads a supporting file only when the skill body links to it and more detail is needed.\n\n**Design each level independently.** The frontmatter alone must be enough to trigger the skill. The skill body must be useful without any supporting file. Supporting files are supplementary.\n\n---\n\n## File Structure\n\nEach skill lives in its own directory:\n\n```\n.claude/skills/<skill-name>/\n├── SKILL.md              # Required — main skill body with YAML frontmatter\n└── <supporting-file>.md  # Optional — verbose reference material linked from SKILL.md\n```\n\nSupporting files (e.g. `gainnode-example.md`, `api.md`, `build-details.md`) live alongside `SKILL.md` in the same directory. They are plain `.md` files (not `SKILL.md`). Alternatively group them under an optional `references/` subdirectory when you have several related documents, or `scripts/` for executable code Claude can run.\n\nLink from the parent skill:\n\n```markdown\nSee [gainnode-example.md](gainnode-example.md) for a complete header + .cpp.\n```\n\n---\n\n## YAML Frontmatter\n\nRequired: `name` and `description`. Everything else is optional.\n\n```yaml\n---\nname: kebab-case-name           # matches the directory name; no claude/anthropic prefix\ndescription: >\n  What the skill covers. When to use it.\n  Trigger phrases: \"phrase one\", \"phrase two\".\n\n# — optional fields —\ncontext: fork                   # run as isolated subagent (see below)\nagent: Explore                  # subagent type: Explore / Plan / general-purpose / custom\nallowed-tools: \"Read Grep Glob\" # tools available without per-use approval\nmodel: claude-sonnet-4-6        # model override for this skill\ndisable-model-invocation: true  # user can /invoke; Claude won't auto-load\nuser-invocable: false           # Claude auto-loads; hidden from the /menu\nargument-hint: \"[node-name]\"    # shown in slash-command autocomplete\nhooks:                          # hooks scoped to this skill's lifecycle\nmetadata:\n  author: team\n  version: 1.0.0\n---\n```\n\n### Rules\n\n- `name`: kebab-case, matches directory name. Forbidden prefixes: `claude`, `anthropic`.\n- `description`: max 1024 characters. Include **what**, **when**, and **trigger phrases** (quoted, comma-separated at the end).\n- Trigger phrases must match how developers actually speak: `\"add a node\"`, `\"processNode\"`, `\"shadow state\"` — not `\"audio processing implementation\"`.\n- No XML angle brackets (`<` or `>`) anywhere in frontmatter — security restriction.\n\n### Anti-patterns\n\n```yaml\n# BAD — vague, no trigger phrases\ndescription: This skill covers audio node implementation details.\n\n# BAD — too long (gets cut at 1024 chars)\ndescription: >\n  This skill covers every aspect of ... [500 words] ...\n\n# BAD — missing the literal \"Trigger phrases:\" label (skill will never auto-load)\ndescription: >\n  How to create a C++ audio node. Covers processNode() contract, AudioParam a-rate/k-rate,\n  cross-thread scheduling. Use when implementing a new node or debugging audio rendering.\n  \"add a node\", \"processNode\", \"audio thread\", \"AudioParam automation\".\n\n# GOOD\ndescription: >\n  How to create a C++ audio node. Covers processNode() contract, AudioParam a-rate/k-rate,\n  cross-thread scheduling. Use when implementing a new node or debugging audio rendering.\n  Trigger phrases: \"add a node\", \"processNode\", \"audio thread\", \"AudioParam automation\".\n```\n\n**The `Trigger phrases:` label is mandatory** — without the exact label, Claude Code does not recognise the list as trigger phrases and the skill will not auto-load.\n\n---\n\n## Invocation Control\n\nBy default a skill is both user-invokable (`/skill-name`) and auto-loaded by Claude. Override with:\n\n| Frontmatter | User `/invoke` | Claude auto-load | Use when |\n|---|---|---|---|\n| (default) | Yes | Yes | General knowledge skills |\n| `disable-model-invocation: true` | Yes | No | Task-only / deployment skills |\n| `user-invocable: false` | No | Yes | Internal / meta knowledge |\n\n---\n\n## context: fork\n\nRuns the skill in an isolated subagent. The skill body becomes the task prompt — the subagent has no access to conversation history.\n\n```yaml\n---\nname: deep-research\ndescription: Research a topic thoroughly\ncontext: fork\nagent: Explore   # Explore / Plan / general-purpose / custom .claude/agents/ name\n---\n\nResearch $ARGUMENTS thoroughly:\n1. Find relevant files using Glob and Grep\n2. Read and analyze the code\n3. Summarize findings with specific file references\n```\n\n**Only useful for task-oriented skills** with concrete step-by-step instructions. Do NOT set on reference/knowledge skills — the subagent receives guidelines but has no actionable task.\n\n---\n\n## String Substitutions\n\nAvailable in skill body content:\n\n```\n$ARGUMENTS             all arguments passed when user invokes /skill-name arg\n$ARGUMENTS[0]          first argument by index (0-based); $0 is shorthand\n${CLAUDE_SESSION_ID}   current session ID\n${CLAUDE_SKILL_DIR}    absolute path to the skill directory — use to reference bundled scripts\n```\n\n## Shell Preprocessing\n\n`` !`command` `` runs a shell command **before** the skill content is sent to Claude. Output replaces the placeholder at load time — Claude sees only the result, not the syntax.\n\n```markdown\n## Context\nBranch: !`git branch --show-current`\nLast commits: !`git log --oneline -5`\n```\n\nUseful for skills that need live repository state injected automatically.\n\n---\n\n## Skill Body\n\n### Structure\n\n```markdown\n---\nname: my-skill\ndescription: > ...\n---\n\n# Skill: My Skill\n\nOne-sentence summary of what this covers (not a repeat of frontmatter — add context).\n\n---\n\n## Most Important Section First\n\nCritical invariants, hard constraints, common mistakes go at the top.\nReaders may stop reading early — put the highest-value content first.\n\n## Secondary Sections\n\n...\n\n---\n\n## Maintenance\n\nReview this skill when `pre-push-update` reports changes in:\n\n| Path | What to check |\n|---|---|\n| `path/to/file.*` | What to review in this skill |\n```\n\n### Rules\n\n- **Under 500 lines** — non-negotiable. If the file exceeds 500 lines, move verbose content to a supporting file in the same directory.\n- **Imperative form**: \"Use `AudioParam`\", \"Declare in protected:\", \"Call `scheduleAudioEvent`\". Not: \"You should use\", \"It is recommended to call\".\n- **Code over prose**: a 5-line snippet teaches faster than two paragraphs. Prefer concrete examples.\n- **Critical first**: MUST NOT lists, common pitfalls, and hard constraints go in the FIRST section, not buried at the bottom. Readers stop reading early.\n- **No scope blockquotes**: do not add `> **Scope**: ...` / `> **What this skill covers**: ...` / `> **When Claude should consult this skill**: ...` — this duplicates the frontmatter and wastes lines.\n- **Escape hatches**: add \"If unsure → [do X]\" guidance wherever a wrong choice causes hard-to-debug bugs (e.g. \"If unsure which ITC primitive → check the decision table in `thread-safety-itc`\").\n- **Golden references**: link to one or two existing files that exemplify the patterns in the skill. These let Claude anchor new code to proven implementations.\n\n### What belongs in the skill body vs supporting files\n\n| Belongs in skill body | Move to supporting file |\n|---|---|\n| API overview (1-line per method) | Complete header + .cpp of a class |\n| Key usage patterns (5–15 line snippets) | Full working example (50+ lines) |\n| Decision tables, checklists | Exhaustive per-flag build analysis |\n| Common pitfalls (concise) | Line-by-line CMakeLists commentary |\n| Links to spec or docs | Full `.hpp` API with every overload |\n\n---\n\n## The Maintenance File\n\nEach skill directory has a `maintenance.md` file mapping source paths to what needs checking. It is **not loaded during normal skill usage** — only `/pre-push-update` reads it.\n\n```markdown\n# Maintenance — skill-name\n\n> Used by /pre-push-update only — not loaded during skill usage.\n\n| Path | What to check |\n|---|---|\n| `path/to/file.*` | Specific section or element to review |\n```\n\n`SKILL.md` ends with a single footer line linking to it:\n\n```markdown\n*Maintenance: see [maintenance.md](maintenance.md).*\n```\n\nSupporting files do **not** have their own maintenance sections — their rows go into the same `maintenance.md`.\n\n### Why separate\n\n`## Maintenance` embedded in `SKILL.md` wastes tokens on every skill load. A dedicated `maintenance.md` is only read by `/pre-push-update`.\n\n### Rules\n\n- Use glob-style patterns (`*`, `**`) for directories.\n- The \"What to check\" column must name the specific section or element to review — not just \"update if needed\".\n- Add a row whenever you add a new documented pattern to the skill.\n- Supporting file paths belong in the skill's `maintenance.md` — not in the supporting file itself.\n\n---\n\n## Supporting Files\n\nFor content that is too large for the skill body but still useful to load on demand.\n\n### When to create a supporting file\n\n- A complete class header + implementation (50+ lines of code)\n- Full API documentation for a large `.hpp` template file\n- Deep line-by-line analysis of a build file\n- A complete worked example spanning multiple files\n\n### Location\n\nPlace supporting files in the same directory as `SKILL.md`:\n\n```\n.claude/skills/audio-nodes/\n├── SKILL.md\n└── gainnode-example.md    # supporting file\n```\n\nLink from the parent skill:\n\n```markdown\nSee [gainnode-example.md](gainnode-example.md) for a complete header + .cpp.\n```\n\nSupporting files do **not** need YAML frontmatter or a `name` field — they are plain markdown.\n\n---\n\n## Checklist: New Skill File\n\n1. Create directory `.claude/skills/<skill-name>/`\n2. Create `SKILL.md` with YAML frontmatter (`name`, `description` with what + when + trigger phrases, ≤1024 chars)\n3. `# Skill: Name` heading — no scope blockquotes below it\n4. Most important content first\n5. Under 500 lines — move verbose content to a supporting `.md` file in the same directory\n6. Imperative form, code snippets preferred over prose\n7. Create `maintenance.md` with path → what-to-check table; add `*Maintenance: see [maintenance.md](maintenance.md).*` at the bottom of `SKILL.md`\n8. If supporting files created: their maintenance rows go into `maintenance.md` (not in the supporting files)\n9. Add the skill directory to the table in `CLAUDE.md` and the tree in `.claude/README.md`\n\n---\n\n*Maintenance: see [maintenance.md](maintenance.md).*\n"
  },
  {
    "path": ".claude/skills/writing-skills/maintenance.md",
    "content": "# Maintenance — writing-skills\n\n> Used by `/pre-push-update` only — not loaded when the `writing-skills` skill is active.\n\nReview this skill when `pre-push-update` reports changes in:\n\n| Path | What to check |\n|---|---|\n| `.claude/skills/*/SKILL.md` | New patterns observed — update best-practices or anti-patterns sections |\n| `.claude/skills/**/*.md` | Supporting file or maintenance.md conventions changed — update the relevant section |\n| `.claude/commands/pre-push-update.md` | Maintenance contract changed — update the `maintenance.md` rules |\n| `CLAUDE.md` | Skill table updated — update the checklist step that references `CLAUDE.md` |\n"
  },
  {
    "path": ".editorconfig",
    "content": "# EditorConfig helps developers define and maintain consistent\n# coding styles between different editors and IDEs\n# editorconfig.org\n\nroot = true\n\n[*]\n\nindent_style = space\nindent_size = 2\n\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\n"
  },
  {
    "path": ".eslintrc.js",
    "content": "/** @type {import('eslint').ESLint.ConfigData} */\nmodule.exports = {\n  root: true,\n  overrides: [\n    {\n      files: ['*.ts', '*.tsx'],\n      parser: '@typescript-eslint/parser',\n      parserOptions: {\n        project: true,\n        tsconfigRootDir: __dirname,\n      },\n      plugins: ['tsdoc'],\n      extends: [\n        'plugin:@typescript-eslint/recommended-type-checked',\n        'plugin:prettier/recommended',\n      ],\n      rules: {\n        '@typescript-eslint/no-unsafe-call': 'off',\n        '@typescript-eslint/no-unsafe-member-access': 'off',\n        '@typescript-eslint/no-floating-promises': 'off',\n        '@typescript-eslint/no-misused-promises': 'off',\n        '@typescript-eslint/no-unsafe-return': 'off',\n        '@typescript-eslint/no-unsafe-assignment': 'off',\n        '@typescript-eslint/no-unsafe-argument': 'off',\n        '@typescript-eslint/no-require-imports': 'off',\n        '@typescript-eslint/no-empty-object-type': 'off',\n        '@typescript-eslint/no-inline-styles': 'off',\n        '@typescript-eslint/no-explicit-any': 'warn',\n        '@typescript-eslint/ban-ts-comment': [\n          'error',\n          {\n            'ts-ignore': 'allow-with-description',\n            'ts-expect-error': 'allow-with-description',\n          },\n        ],\n        '@typescript-eslint/no-unused-vars': [\n          'error',\n          { argsIgnorePattern: '^_' },\n        ],\n        '@typescript-eslint/no-var-requires': 'off',\n        '@typescript-eslint/no-non-null-assertion': 'off',\n        '@typescript-eslint/no-duplicate-type-constituents': 'error',\n        '@typescript-eslint/no-shadow': 'error',\n        'tsdoc/syntax': 'error',\n        'prettier/prettier': [\n          'error',\n          {\n            plugins: ['prettier-plugin-jsdoc'],\n            bracketSameLine: true,\n            printWidth: 80,\n            singleQuote: true,\n            trailingComma: 'es5',\n            tabWidth: 2,\n            arrowParens: 'always',\n          },\n        ],\n      },\n    },\n    {\n      files: ['*.js', '*.jsx'],\n      plugins: ['jsdoc'],\n      extends: ['plugin:jsdoc/recommended'],\n      rules: {\n        'jsdoc/tag-lines': 'off',\n      },\n    },\n  ],\n  parserOptions: {\n    requireConfigFile: false,\n  },\n  extends: [\n    'standard',\n    'prettier',\n    'plugin:import/typescript',\n    'plugin:react-hooks/recommended',\n  ],\n  plugins: ['react', 'react-native', 'import', 'jest', '@typescript-eslint'],\n  env: {\n    'react-native/react-native': true,\n    'jest/globals': true,\n  },\n  settings: {\n    'import/resolver': {\n      'babel-module': {\n        extensions: ['.js', '.jsx', '.ts', '.tsx'],\n      },\n    },\n  },\n  rules: {\n    'object-shorthand': 'error',\n    'curly': ['error', 'all'],\n    'no-case-declarations': 'error',\n    'import/no-unresolved': 'error',\n    'import/consistent-type-specifier-style': ['error', 'prefer-top-level'],\n    'react/jsx-uses-vars': 'error',\n    'react/jsx-uses-react': 'error',\n    'no-use-before-define': 'off',\n    'eqeqeq': 'error',\n    'no-unreachable': 'error',\n    'jest/no-disabled-tests': 'warn',\n    'jest/no-focused-tests': 'error',\n    'jest/no-identical-title': 'error',\n    'jest/prefer-to-have-length': 'warn',\n    'jest/valid-expect': 'error',\n    'react/react-in-jsx-scope': 'off',\n    'import/no-duplicates': 'warn', // Avoid issues in native component specs since 0.81\n  },\n};\n"
  },
  {
    "path": ".gitattributes",
    "content": "*.pbxproj -text\n# specific for windows script files\n*.bat text eol=crlf\ndocs/assets/example-01.mp4 filter=lfs diff=lfs merge=lfs -text\n\npackages/react-native-audio-api/common/cpp/audioapi/libs/** linguist-vendored\napps/** linguist-vendored\ndocs/** linguist-vendored\n.github/** linguist-vendored\n.yarn/** linguist-vendored\npackages/audiodocs/** linguist-documentation\npackages/react-native-audio-api/src/web-core/custom/signalsmithStretch/* linguist-vendored\n"
  },
  {
    "path": ".github/CODEOWNERS",
    "content": "/.github/CODEOWNERS @maciejmakowski2003 @mdydek\n/.github/workflows  @maciejmakowski2003 @mdydek\n"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "# These are supported funding model platforms\n\ngithub: software-mansion\npatreon: # Replace with a single Patreon username\nopen_collective: # Replace with a single Open Collective username\nko_fi: # Replace with a single Ko-fi username\ntidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel\ncommunity_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry\nliberapay: # Replace with a single Liberapay username\nissuehunt: # Replace with a single IssueHunt username\nlfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry\npolar: # Replace with a single Polar username\nbuy_me_a_coffee: # Replace with a single Buy Me a Coffee username\nthanks_dev: # Replace with a single thanks.dev username\ncustom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
    "content": "name: Bug report\ndescription: Report an issue with React Native Audio API here.\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Thanks for taking the time to fill out this bug report!\n\n        > [!TIP]\n        > **We strongly encourage providing a Minimal Reproducible Example (MRE) with your report.**\n        > Issues without a reproduction are much harder to investigate and are likely to stall or be closed.\n        >\n        > A good MRE is:\n        > - **Minimal** — stripped down to the smallest amount of code that still reproduces the issue (no unrelated dependencies, screens, or logic)\n        > - **Reproducible** — someone else must be able to clone/open it and see the bug without any extra steps\n        > - **Self-contained** — a public GitHub repository or an Expo Snack that runs out of the box\n        >\n        > If you ARE an AI assistant filing this issue, you MUST create and **verify** the MRE before submitting.\n\n        Before you proceed:\n\n        - Make sure to check whether there are similar issues in the repository\n        - Make sure to clean cache in your project. Depending on your setup this could be done by:\n          - `yarn start --reset-cache` or\n          - `npm start -- --reset-cache` or\n          - `expo start --clear`\n\n  - type: markdown\n    attributes:\n      value: |\n        ## Required information\n  - type: textarea\n    id: description\n    attributes:\n      label: Description\n      description: Please provide a clear, concise and descriptive explanation of what the bug is. Include screenshots or a video if needed. Tell us what were you expecting to happen instead of what is happening now.\n    validations:\n      required: true\n\n  - type: textarea\n    id: steps-to-reproduce\n    attributes:\n      label: Steps to reproduce\n      description: Provide a detailed list of steps that reproduce the issue.\n      placeholder: |\n        1.\n        2.\n        3.\n    validations:\n      required: true\n\n  - type: input\n    id: repro\n    attributes:\n      label: Snack or a link to a repository\n      description: |\n        Please provide a Snack (https://snack.expo.io/) or a link to a repository on GitHub under your username that reproduces the issue.\n        Here are some tips for providing a minimal example: https://stackoverflow.com/help/mcve.\n        Issues without a reproduction are likely to stale.\n      placeholder: Link to a Snack or a GitHub repository\n    validations:\n      required: true\n\n  - type: input\n    id: react-native-audio-api-version\n    attributes:\n      label: React Native Audio API version\n      description: What version of react-native-audio-api are you using?\n      placeholder: 0.1.0\n    validations:\n      required: true\n\n  - type: input\n    id: react-native-version\n    attributes:\n      label: React Native version\n      description: What version of react-native are you using?\n      placeholder: 0.75.3\n    validations:\n      required: true\n\n  - type: dropdown\n    id: platforms\n    attributes:\n      label: Platforms\n      description: On what platform your application is running on?\n      multiple: true\n      options:\n        - Android\n        - iOS\n    validations:\n      required: true\n\n  - type: markdown\n    attributes:\n      value: |\n        ## Additonal information\n\n        Providing as much information as possible greatly helps us with reproducting the issues.\n\n  - type: dropdown\n    id: runtime\n    attributes:\n      label: JavaScript runtime\n      description: What runtime is your application using?\n      options:\n        - JSC\n        - Hermes\n        - V8\n\n  - type: dropdown\n    id: workflow\n    attributes:\n      label: Workflow\n      description: How is your application managed?\n      options:\n        - React Native\n        - Expo Go\n        - Expo Dev Client\n\n  - type: dropdown\n    id: architecture\n    attributes:\n      label: Architecture\n      description: What React Native architecture your application is running on? Currently, the default architecture on React Native is Paper so if you haven't changed it in your application select this option.\n      options:\n        - Paper (Old Architecture)\n        - Fabric (New Architecture)\n\n  - type: dropdown\n    id: build-type\n    attributes:\n      label: Build type\n      description: What is the build configuration/variant of your native app and JavaScript bundle mode?\n      options:\n        - Debug app & dev bundle\n        - Release app & production bundle\n        - Debug app & production bundle\n        - Release app & dev bundle\n        - Other (please specify)\n\n  - type: dropdown\n    id: emulator\n    attributes:\n      label: Device\n      description: How are you running your application?\n      options:\n        - iOS simulator\n        - Android emulator\n        - Real device\n\n  - type: input\n    id: device-model\n    attributes:\n      label: Device model\n      description: What device you are experiencing this problem on? Specify full device name along with the version of the operating system it's running.\n      placeholder: ex. Samsung Galaxy A22 (Android 12)\n\n  - type: dropdown\n    id: acknowledgements\n    attributes:\n      label: Acknowledgements\n      description: I searched for similar issues in the repository.\n      options:\n        - 'Yes'\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yaml",
    "content": "name: Feature request\ndescription: Suggest a feature\nbody:\n  - type: textarea\n    id: Suggestion\n    attributes:\n      label: Feature Request\n      description: Describe the feature(s) you would like to be added.\n    validations:\n      required: true\n"
  },
  {
    "path": ".github/actions/setup/action.yml",
    "content": "name: Setup\ndescription: Setup Node.js and install dependencies\n\nruns:\n  using: composite\n  steps:\n    - name: Setup Node.js\n      uses: actions/setup-node@v4\n      with:\n        node-version-file: .nvmrc\n\n    - name: Setup Python\n      uses: actions/setup-python@v1\n\n    - name: Setup Cmake\n      uses: jwlawson/actions-setup-cmake@v2\n      with:\n        cmake-version: '4.0.x'\n\n    - name: Install cpplint\n      shell: bash\n      run: pip install 'cpplint==2.0.2'\n\n    - name: Install ktlint\n      shell: bash\n      run: |\n        curl -sSLO https://github.com/pinterest/ktlint/releases/download/1.7.0/ktlint\n        chmod a+x ktlint\n        sudo mv ktlint /usr/local/bin/\n\n    # .clang-format uses options added in clang-format 22 (BreakAfterOpenBracket*).\n    # ubuntu-latest still defaults to an older binary; install 22\n    - name: Install clang-format 22\n      shell: bash\n      run: |\n        set -euo pipefail\n        curl -fsSL https://apt.llvm.org/llvm.sh | sudo bash -s -- 22\n        sudo apt-get install -y clang-format-22\n        sudo update-alternatives --install /usr/bin/clang-format clang-format /usr/bin/clang-format-22 200\n        clang-format --version\n\n    - name: Cache dependencies\n      id: yarn-cache\n      uses: actions/cache@v4\n      with:\n        path: |\n          **/node_modules\n          .yarn/install-state.gz\n        key: ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }}-${{ hashFiles('**/package.json', '!node_modules/**') }}\n        restore-keys: |\n          ${{ runner.os }}-yarn-${{ hashFiles('yarn.lock') }}\n          ${{ runner.os }}-yarn-\n\n    - name: Install dependencies\n      if: steps.yarn-cache.outputs.cache-hit != 'true'\n      run: yarn install --immutable\n      shell: bash\n"
  },
  {
    "path": ".github/pull_request_template.md",
    "content": "<!-- Reference any GitHub issues resolved by this PR -->\n\nCloses #\n\n## ⚠️ Breaking changes ⚠️\n\n<!-- A brief description of the breaking changes -->\n\n-\n\n## Introduced changes\n\n<!-- A brief description of the changes -->\n\n-\n\n## Checklist\n\n<!-- Make sure all of these are complete -->\n\n- [ ] Linked relevant issue\n- [ ] Updated relevant documentation\n- [ ] Added/Conducted relevant tests\n- [ ] Performed self-review of the code\n- [ ] Updated Web Audio API coverage\n- [ ] Added support for web\n- [ ] Updated old arch android spec file\n"
  },
  {
    "path": ".github/release.yml",
    "content": "changelog:\n  categories:\n    - title: ⚠️ Breaking Changes\n      labels:\n        - breaking-change\n    - title: 🚀 Features\n      labels:\n        - feature\n    - title: 📖 Docs\n      labels:\n        - documentation\n    - title: 🐛 Bug Fixes\n      labels:\n        - bug\n        - fix\n    - title: 👨🏻‍🔬 Unstable\n      labels:\n        - unstable\n    - title: 🧪 Tests\n      labels:\n        - tests\n    - title: Other Changes\n      labels:\n        - \"*\"\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "name: CI\non:\n  pull_request:\n    branches:\n      - main\n  merge_group:\n    types:\n      - checks_requested\n\njobs:\n  lint:\n    if: github.event.pull_request.draft == false\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup\n        uses: ./.github/actions/setup\n\n      - name: Lint files\n        run: yarn lint\n\n      - name: Typecheck files\n        run: yarn typecheck\n\n  check-audio-enum-sync:\n    if: github.event.pull_request.draft == false\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup\n        uses: ./.github/actions/setup\n\n      - name: Check AudioEvent enum sync\n        run: yarn check-audio-enum-sync\n\n  build-library:\n    if: github.event.pull_request.draft == false\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup\n        uses: ./.github/actions/setup\n\n      - name: Build package\n        run: yarn build\n"
  },
  {
    "path": ".github/workflows/graph-tests.yml",
    "content": "name: Graph Tests\non:\n  pull_request:\n    paths:\n      - 'packages/react-native-audio-api/common/cpp/audioapi/core/utils/graph/**'\n      - 'packages/react-native-audio-api/common/cpp/test/src/graph/**'\n\njobs:\n  graph-test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: ./.github/actions/setup\n      - run: yarn test:graph\n"
  },
  {
    "path": ".github/workflows/npm-audio-package-build.yml",
    "content": "name: NPM Build and publish to npm\n\non:\n  schedule:\n    - cron: '01 00 * * *' # Every day at 00:01 UTC\n  workflow_dispatch:\n    inputs:\n      latest-build:\n        description: 'Whether to publish as a latest build'\n        required: true\n        type: boolean\n      old-version-patch:\n        description: 'Whether to publish as a patch to an old version'\n        required: true\n        type: boolean\n\npermissions:\n  id-token: write\n  contents: read\n\nconcurrency:\n  group: 'npm-audio-package-build'\n  cancel-in-progress: false\n\njobs:\n  build:\n    if: github.repository == 'software-mansion/react-native-audio-api'\n    runs-on: ubuntu-latest\n    environment: deployment\n    permissions:\n      contents: read\n      id-token: write\n    env:\n      AUDIO_API_DIR: packages/react-native-audio-api\n      AUDIO_API_VERSION: PLACEHOLDER # all placeholders to be replaced during the run\n      TRUNKATED_VERSION: PLACEHOLDER\n      PACKAGE_NAME: PLACEHOLDER\n      TAG: PLACEHOLDER\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup Node\n        uses: actions/setup-node@v4\n        with:\n          node-version: 24\n          cache: 'yarn'\n          registry-url: https://registry.npmjs.org/\n\n      - name: Update NPM\n        run: npm install -g npm@latest\n\n      - name: Determine version\n        working-directory: ${{ env.AUDIO_API_DIR }}\n        run: |\n          VERSION=$(jq -r .version package.json)\n          echo \"AUDIO_API_VERSION=$VERSION\" >> $GITHUB_ENV\n          TRUNKATED_VERSION=$(echo $VERSION | cut -d. -f1,2)\n          echo \"TRUNKATED_VERSION=$TRUNKATED_VERSION\" >> $GITHUB_ENV\n\n      - name: Assert AUDIO_API_VERSION\n        if: ${{ env.AUDIO_API_VERSION == 'PLACEHOLDER' }}\n        run: exit 1 # this should never happen\n\n      - name: Assert TRUNKATED_VERSION\n        if: ${{ env.TRUNKATED_VERSION == 'PLACEHOLDER' }}\n        run: exit 1 # this should never happen\n\n      - name: Install monorepo dependencies\n        run: yarn install --immutable\n\n      - name: Set tag\n        run: |\n          if [[ \"${{ inputs.old-version-patch }}\" == \"true\" ]]; then\n            CURRENT_VERSION=$(npm view react-native-audio-api version | cut -d. -f1,2)\n            if [[ \"$CURRENT_VERSION\" == \"${{ env.TRUNKATED_VERSION }}\" ]]; then\n              echo \"Old version patch requested but current published version matches package version. Exiting.\"\n              exit 1\n            fi\n            echo \"TAG=rn-audio-api-${{ env.TRUNKATED_VERSION }}\" >> $GITHUB_ENV\n          elif [[ \"${{ inputs.latest-build }}\" != \"true\" ]]; then\n            echo \"TAG=audio-api-nightly\" >> $GITHUB_ENV\n          else\n            echo \"TAG=latest\" >> $GITHUB_ENV\n          fi\n\n      - name: Assert tag\n        if: ${{ env.TAG == 'PLACEHOLDER' }}\n        run: exit 1 # this should never happen\n\n      - name: Build package\n        id: build\n        working-directory: ${{ env.AUDIO_API_DIR }}\n        run: |\n          if [[ \"${{ inputs.latest-build }}\" != \"true\" && \"${{ inputs.old-version-patch }}\" != \"true\" ]]; then\n            ./scripts/create-package.sh generate_nightly_version\n          else\n            ./scripts/create-package.sh\n          fi\n\n      - name: Check if any node_modules were packed\n        id: check_node_modules\n        working-directory: ${{ env.AUDIO_API_DIR }}\n        run: >-\n          ! grep --silent -E \"node_modules/.+\" build.log\n\n      - name: Show build log\n        working-directory: ${{ env.AUDIO_API_DIR }}\n        if: failure() && steps.build.outcome == 'failure'\n        run: cat build.log\n\n      - name: Show packed node_modules\n        working-directory: ${{ env.AUDIO_API_DIR }}\n        if: failure() && steps.node_modules.outcome == 'failure'\n        run: >-\n          ! grep -E \"node_modules/.+\" build.log\n\n      - name: Add package name to env\n        working-directory: ${{ env.AUDIO_API_DIR }}\n        run: echo \"PACKAGE_NAME=$(ls -l | egrep -o \"react-native-audio-api-(.*)(=?\\.tgz)\")\" >> $GITHUB_ENV\n\n      - name: Assert package name\n        if: ${{ env.PACKAGE_NAME == 'PLACEHOLDER' }}\n        run: exit 1 # this should never happen\n\n      - name: Upload package to GitHub\n        uses: actions/upload-artifact@v4\n        with:\n          name: ${{ env.PACKAGE_NAME }}\n          path: ${{ env.AUDIO_API_DIR }}/${{ env.PACKAGE_NAME }}\n\n      - name: Move package to monorepo root\n        run: mv ${{ env.AUDIO_API_DIR }}/${{ env.PACKAGE_NAME }} .\n\n      - name: Publish package to npm\n        run: npm publish $PACKAGE_NAME --tag ${{ env.TAG }} --provenance\n"
  },
  {
    "path": ".github/workflows/npm-custom-node-generator-build.yml",
    "content": "name: NPM[Custom Node Generator] Build and publish to npm\n\non:\n  workflow_dispatch:\n\npermissions:\n  id-token: write\n  contents: read\n\nconcurrency:\n  group: npm-custom-node-generator-build\n  cancel-in-progress: false\njobs:\n  build:\n    if: github.repository == 'software-mansion/react-native-audio-api'\n    runs-on: ubuntu-latest\n    environment: deployment\n    permissions:\n      contents: read\n      id-token: write\n    env:\n      PACKAGE_DIR: packages/custom-node-generator\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup Node\n        uses: actions/setup-node@v4\n        with:\n          node-version: 24\n          registry-url: https://registry.npmjs.org/\n\n      - name: Update NPM\n        run: npm install -g npm@latest\n\n      - name: Publish package to npm\n        working-directory: ${{ env.PACKAGE_DIR }}\n        run: npm publish --provenance --access public\n"
  },
  {
    "path": ".github/workflows/publish-docs.yml",
    "content": "name: DOCS Build and publish audio api docs\n\non:\n  workflow_dispatch:\n\npermissions:\n  contents: read\n  pages: write\n  id-token: write\n\nconcurrency:\n  group: 'pages'\n  cancel-in-progress: true\n\njobs:\n  publish:\n    if: github.repository == 'software-mansion/react-native-audio-api'\n    runs-on: ubuntu-latest\n    environment: github-pages\n    steps:\n      - name: Checkout repo\n        uses: actions/checkout@v4\n\n      - name: Setup Node\n        uses: actions/setup-node@v4\n\n      - name: Setup Yarn\n        uses: mskelton/setup-yarn@v2\n\n      - name: Install dependencies and build the docs\n        run: |\n          cd packages/audiodocs\n          yarn\n          yarn build\n\n      - name: Upload build files\n        uses: actions/upload-pages-artifact@v3\n        with:\n          path: packages/audiodocs/build\n\n      - name: Setup Pages\n        uses: actions/configure-pages@v5\n\n      - name: Recrawl search index\n        run: |\n          curl -X POST https://crawler.algolia.com/api/1/crawlers/${{ secrets.CRAWLER_ID }}/reindex \\\n          -H \"Content-Type: application/json\" \\\n          -u ${{ secrets.CRAWLER_USER_ID }}:${{ secrets.CRAWLER_API_KEY }}\n\n      - name: Deploy to Github Pages\n        uses: actions/deploy-pages@v4\n"
  },
  {
    "path": ".github/workflows/tests.yml",
    "content": "name: Tests\n\non:\n  pull_request:\n  workflow_dispatch:\n\njobs:\n  cpp-tests:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup\n        uses: ./.github/actions/setup\n\n      - name: Run C++ tests\n        working-directory: packages/react-native-audio-api\n        run: yarn test:cpp\n\n  js-tests:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Setup\n        uses: ./.github/actions/setup\n\n      - name: Run JS integration tests\n        working-directory: packages/react-native-audio-api\n        run: yarn test:js\n"
  },
  {
    "path": ".gitignore",
    "content": "# OSX\n#\n.DS_Store\n\n# XDE\n.expo/\n\n# VSCode\n.vscode/\njsconfig.json\n\n# Xcode\n#\nbuild/\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n*.xccheckout\n*.moved-aside\nDerivedData\n*.hmap\n*.ipa\n*.xcuserstate\nproject.xcworkspace\n\n.xcode.env.local\n\n# Android/IJ\n#\n.classpath\n.cxx\n.gradle\n.idea\n.project\n.settings\nlocal.properties\nandroid.iml\n\n# Cocoapods\n#\napps/**/ios/Pods\n\n# Ruby\napps/**/vendor/\n\n# node.js\n#\nnode_modules/\nnpm-debug.log\nyarn-debug.log\nyarn-error.log\n\n# BUCK\nbuck-out/\n\\.buckd/\nandroid/app/libs\nandroid/keystores/debug.keystore\n\n# Yarn\n.yarn/*\n!.yarn/patches\n!.yarn/plugins\n!.yarn/releases\n!.yarn/sdks\n!.yarn/versions\n.yarn/cache\n\n# Expo\n.expo/\n\n# Turborepo\n.turbo/\n\npackages/react-native-audio-api/lib\nreact-native-audio-api*.tgz\n\n# Android\n.kotlin\n\n\n# Envs\n.env\n\ncompile_commands.json\nopenssl-prebuilt/\nprebuilt_libs/\noutput/\n\n# External libs\npackages/react-native-audio-api/android/src/main/jniLibs/\npackages/react-native-audio-api/common/cpp/audioapi/external/**/*.a\npackages/react-native-audio-api/common/cpp/audioapi/external/*.xcframework\npackages/react-native-audio-api/common/cpp/audioapi/external/ffmpeg_ios/\n\n# Clangd cache\n.cache\n"
  },
  {
    "path": ".nvmrc",
    "content": "v22.16.0\n"
  },
  {
    "path": ".yarn/releases/yarn-4.5.0.cjs",
    "content": "#!/usr/bin/env node\n/* eslint-disable */\n//prettier-ignore\n(()=>{var t_e=Object.create;var vR=Object.defineProperty;var r_e=Object.getOwnPropertyDescriptor;var n_e=Object.getOwnPropertyNames;var i_e=Object.getPrototypeOf,s_e=Object.prototype.hasOwnProperty;var ve=(t=>typeof require<\"u\"?require:typeof Proxy<\"u\"?new Proxy(t,{get:(e,r)=>(typeof require<\"u\"?require:e)[r]}):t)(function(t){if(typeof require<\"u\")return require.apply(this,arguments);throw Error('Dynamic require of \"'+t+'\" is not supported')});var Et=(t,e)=>()=>(t&&(e=t(t=0)),e);var _=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Vt=(t,e)=>{for(var r in e)vR(t,r,{get:e[r],enumerable:!0})},o_e=(t,e,r,o)=>{if(e&&typeof e==\"object\"||typeof e==\"function\")for(let a of n_e(e))!s_e.call(t,a)&&a!==r&&vR(t,a,{get:()=>e[a],enumerable:!(o=r_e(e,a))||o.enumerable});return t};var Ze=(t,e,r)=>(r=t!=null?t_e(i_e(t)):{},o_e(e||!t||!t.__esModule?vR(r,\"default\",{value:t,enumerable:!0}):r,t));var Bi={};Vt(Bi,{SAFE_TIME:()=>D7,S_IFDIR:()=>iD,S_IFLNK:()=>sD,S_IFMT:()=>Uu,S_IFREG:()=>Dw});var Uu,iD,Dw,sD,D7,P7=Et(()=>{Uu=61440,iD=16384,Dw=32768,sD=40960,D7=456789e3});var nr={};Vt(nr,{EBADF:()=>Io,EBUSY:()=>a_e,EEXIST:()=>p_e,EINVAL:()=>c_e,EISDIR:()=>f_e,ENOENT:()=>u_e,ENOSYS:()=>l_e,ENOTDIR:()=>A_e,ENOTEMPTY:()=>g_e,EOPNOTSUPP:()=>d_e,EROFS:()=>h_e,ERR_DIR_CLOSED:()=>DR});function Tl(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function a_e(t){return Tl(\"EBUSY\",t)}function l_e(t,e){return Tl(\"ENOSYS\",`${t}, ${e}`)}function c_e(t){return Tl(\"EINVAL\",`invalid argument, ${t}`)}function Io(t){return Tl(\"EBADF\",`bad file descriptor, ${t}`)}function u_e(t){return Tl(\"ENOENT\",`no such file or directory, ${t}`)}function A_e(t){return Tl(\"ENOTDIR\",`not a directory, ${t}`)}function f_e(t){return Tl(\"EISDIR\",`illegal operation on a directory, ${t}`)}function p_e(t){return Tl(\"EEXIST\",`file already exists, ${t}`)}function h_e(t){return Tl(\"EROFS\",`read-only filesystem, ${t}`)}function g_e(t){return Tl(\"ENOTEMPTY\",`directory not empty, ${t}`)}function d_e(t){return Tl(\"EOPNOTSUPP\",`operation not supported, ${t}`)}function DR(){return Tl(\"ERR_DIR_CLOSED\",\"Directory handle was closed\")}var oD=Et(()=>{});var wa={};Vt(wa,{BigIntStatsEntry:()=>qd,DEFAULT_MODE:()=>SR,DirEntry:()=>PR,StatEntry:()=>Hd,areStatsEqual:()=>xR,clearStats:()=>aD,convertToBigIntStats:()=>y_e,makeDefaultStats:()=>b7,makeEmptyStats:()=>m_e});function b7(){return new Hd}function m_e(){return aD(b7())}function aD(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r==\"number\"?t[e]=0:typeof r==\"bigint\"?t[e]=BigInt(0):bR.types.isDate(r)&&(t[e]=new Date(0))}return t}function y_e(t){let e=new qd;for(let r in t)if(Object.hasOwn(t,r)){let o=t[r];typeof o==\"number\"?e[r]=BigInt(o):bR.types.isDate(o)&&(e[r]=new Date(o))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function xR(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,o=e;return!(r.atimeNs!==o.atimeNs||r.mtimeNs!==o.mtimeNs||r.ctimeNs!==o.ctimeNs||r.birthtimeNs!==o.birthtimeNs)}var bR,SR,PR,Hd,qd,kR=Et(()=>{bR=Ze(ve(\"util\")),SR=33188,PR=class{constructor(){this.name=\"\";this.path=\"\";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},Hd=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=SR;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},qd=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(SR);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}}});function B_e(t){let e,r;if(e=t.match(w_e))t=e[1];else if(r=t.match(I_e))t=`\\\\\\\\${r[1]?\".\\\\\":\"\"}${r[2]}`;else return t;return t.replace(/\\//g,\"\\\\\")}function v_e(t){t=t.replace(/\\\\/g,\"/\");let e,r;return(e=t.match(E_e))?t=`/${e[1]}`:(r=t.match(C_e))&&(t=`/unc/${r[1]?\".dot/\":\"\"}${r[2]}`),t}function lD(t,e){return t===ue?x7(e):QR(e)}var Pw,It,dr,ue,V,S7,E_e,C_e,w_e,I_e,QR,x7,Ia=Et(()=>{Pw=Ze(ve(\"path\")),It={root:\"/\",dot:\".\",parent:\"..\"},dr={home:\"~\",nodeModules:\"node_modules\",manifest:\"package.json\",lockfile:\"yarn.lock\",virtual:\"__virtual__\",pnpJs:\".pnp.js\",pnpCjs:\".pnp.cjs\",pnpData:\".pnp.data.json\",pnpEsmLoader:\".pnp.loader.mjs\",rc:\".yarnrc.yml\",env:\".env\"},ue=Object.create(Pw.default),V=Object.create(Pw.default.posix);ue.cwd=()=>process.cwd();V.cwd=process.platform===\"win32\"?()=>QR(process.cwd()):process.cwd;process.platform===\"win32\"&&(V.resolve=(...t)=>t.length>0&&V.isAbsolute(t[0])?Pw.default.posix.resolve(...t):Pw.default.posix.resolve(V.cwd(),...t));S7=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?\".\":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};ue.contains=(t,e)=>S7(ue,t,e);V.contains=(t,e)=>S7(V,t,e);E_e=/^([a-zA-Z]:.*)$/,C_e=/^\\/\\/(\\.\\/)?(.*)$/,w_e=/^\\/([a-zA-Z]:.*)$/,I_e=/^\\/unc\\/(\\.dot\\/)?(.*)$/;QR=process.platform===\"win32\"?v_e:t=>t,x7=process.platform===\"win32\"?B_e:t=>t;ue.fromPortablePath=x7;ue.toPortablePath=QR});async function cD(t,e){let r=\"0123456789abcdef\";await t.mkdirPromise(e.indexPath,{recursive:!0});let o=[];for(let a of r)for(let n of r)o.push(t.mkdirPromise(t.pathUtils.join(e.indexPath,`${a}${n}`),{recursive:!0}));return await Promise.all(o),e.indexPath}async function k7(t,e,r,o,a){let n=t.pathUtils.normalize(e),u=r.pathUtils.normalize(o),A=[],p=[],{atime:h,mtime:E}=a.stableTime?{atime:R0,mtime:R0}:await r.lstatPromise(u);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[h,E]}),await FR(A,p,t,n,r,u,{...a,didParentExist:!0});for(let I of A)await I();await Promise.all(p.map(I=>I()))}async function FR(t,e,r,o,a,n,u){let A=u.didParentExist?await Q7(r,o):null,p=await a.lstatPromise(n),{atime:h,mtime:E}=u.stableTime?{atime:R0,mtime:R0}:p,I;switch(!0){case p.isDirectory():I=await P_e(t,e,r,o,A,a,n,p,u);break;case p.isFile():I=await x_e(t,e,r,o,A,a,n,p,u);break;case p.isSymbolicLink():I=await k_e(t,e,r,o,A,a,n,p,u);break;default:throw new Error(`Unsupported file type (${p.mode})`)}return(u.linkStrategy?.type!==\"HardlinkFromIndex\"||!p.isFile())&&((I||A?.mtime?.getTime()!==E.getTime()||A?.atime?.getTime()!==h.getTime())&&(e.push(()=>r.lutimesPromise(o,h,E)),I=!0),(A===null||(A.mode&511)!==(p.mode&511))&&(e.push(()=>r.chmodPromise(o,p.mode&511)),I=!0)),I}async function Q7(t,e){try{return await t.lstatPromise(e)}catch{return null}}async function P_e(t,e,r,o,a,n,u,A,p){if(a!==null&&!a.isDirectory())if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;let h=!1;a===null&&(t.push(async()=>{try{await r.mkdirPromise(o,{mode:A.mode})}catch(v){if(v.code!==\"EEXIST\")throw v}}),h=!0);let E=await n.readdirPromise(u),I=p.didParentExist&&!a?{...p,didParentExist:!1}:p;if(p.stableSort)for(let v of E.sort())await FR(t,e,r,r.pathUtils.join(o,v),n,n.pathUtils.join(u,v),I)&&(h=!0);else(await Promise.all(E.map(async x=>{await FR(t,e,r,r.pathUtils.join(o,x),n,n.pathUtils.join(u,x),I)}))).some(x=>x)&&(h=!0);return h}async function b_e(t,e,r,o,a,n,u,A,p,h){let E=await n.checksumFilePromise(u,{algorithm:\"sha1\"}),I=420,v=A.mode&511,x=`${E}${v!==I?v.toString(8):\"\"}`,C=r.pathUtils.join(h.indexPath,E.slice(0,2),`${x}.dat`),R;(ce=>(ce[ce.Lock=0]=\"Lock\",ce[ce.Rename=1]=\"Rename\"))(R||={});let L=1,U=await Q7(r,C);if(a){let ae=U&&a.dev===U.dev&&a.ino===U.ino,le=U?.mtimeMs!==D_e;if(ae&&le&&h.autoRepair&&(L=0,U=null),!ae)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1}let z=!U&&L===1?`${C}.${Math.floor(Math.random()*4294967296).toString(16).padStart(8,\"0\")}`:null,te=!1;return t.push(async()=>{if(!U&&(L===0&&await r.lockPromise(C,async()=>{let ae=await n.readFilePromise(u);await r.writeFilePromise(C,ae)}),L===1&&z)){let ae=await n.readFilePromise(u);await r.writeFilePromise(z,ae);try{await r.linkPromise(z,C)}catch(le){if(le.code===\"EEXIST\")te=!0,await r.unlinkPromise(z);else throw le}}a||await r.linkPromise(C,o)}),e.push(async()=>{U||(await r.lutimesPromise(C,R0,R0),v!==I&&await r.chmodPromise(C,v)),z&&!te&&await r.unlinkPromise(z)}),!1}async function S_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{let h=await n.readFilePromise(u);await r.writeFilePromise(o,h)}),!0}async function x_e(t,e,r,o,a,n,u,A,p){return p.linkStrategy?.type===\"HardlinkFromIndex\"?b_e(t,e,r,o,a,n,u,A,p,p.linkStrategy):S_e(t,e,r,o,a,n,u,A,p)}async function k_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{await r.symlinkPromise(lD(r.pathUtils,await n.readlinkPromise(u)),o)}),!0}var R0,D_e,RR=Et(()=>{Ia();R0=new Date(456789e3*1e3),D_e=R0.getTime()});function uD(t,e,r,o){let a=()=>{let n=r.shift();if(typeof n>\"u\")return null;let u=t.pathUtils.join(e,n);return Object.assign(t.statSync(u),{name:n,path:void 0})};return new bw(e,a,o)}var bw,F7=Et(()=>{oD();bw=class{constructor(e,r,o={}){this.path=e;this.nextDirent=r;this.opts=o;this.closed=!1}throwIfClosed(){if(this.closed)throw DR()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e<\"u\"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e<\"u\"?e(null):Promise.resolve()}closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}}});function R7(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var T7,AD,N7=Et(()=>{T7=ve(\"events\");kR();AD=class t extends T7.EventEmitter{constructor(r,o,{bigint:a=!1}={}){super();this.status=\"ready\";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=r,this.path=o,this.bigint=a,this.lastStats=this.stat()}static create(r,o,a){let n=new t(r,o,a);return n.start(),n}start(){R7(this.status,\"ready\"),this.status=\"running\",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(\"change\",this.lastStats,this.lastStats)},3)}stop(){R7(this.status,\"running\"),this.status=\"stopped\",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(\"stop\")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let o=this.bigint?new qd:new Hd;return aD(o)}}makeInterval(r){let o=setInterval(()=>{let a=this.stat(),n=this.lastStats;xR(a,n)||(this.lastStats=a,this.emit(\"change\",a,n))},r.interval);return r.persistent?o:o.unref()}registerChangeListener(r,o){this.addListener(\"change\",r),this.changeListeners.set(r,this.makeInterval(o))}unregisterChangeListener(r){this.removeListener(\"change\",r);let o=this.changeListeners.get(r);typeof o<\"u\"&&clearInterval(o),this.changeListeners.delete(r)}unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())this.unregisterChangeListener(r)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let r of this.changeListeners.values())r.ref();return this}unref(){for(let r of this.changeListeners.values())r.unref();return this}}});function jd(t,e,r,o){let a,n,u,A;switch(typeof r){case\"function\":a=!1,n=!0,u=5007,A=r;break;default:({bigint:a=!1,persistent:n=!0,interval:u=5007}=r),A=o;break}let p=fD.get(t);typeof p>\"u\"&&fD.set(t,p=new Map);let h=p.get(e);return typeof h>\"u\"&&(h=AD.create(t,e,{bigint:a}),p.set(e,h)),h.registerChangeListener(A,{persistent:n,interval:u}),h}function T0(t,e,r){let o=fD.get(t);if(typeof o>\"u\")return;let a=o.get(e);typeof a>\"u\"||(typeof r>\"u\"?a.unregisterAllChangeListeners():a.unregisterChangeListener(r),a.hasChangeListeners()||(a.stop(),o.delete(e)))}function N0(t){let e=fD.get(t);if(!(typeof e>\"u\"))for(let r of e.keys())T0(t,r)}var fD,TR=Et(()=>{N7();fD=new WeakMap});function Q_e(t){let e=t.match(/\\r?\\n/g);if(e===null)return M7.EOL;let r=e.filter(a=>a===`\\r\n`).length,o=e.length-r;return r>o?`\\r\n`:`\n`}function L0(t,e){return e.replace(/\\r?\\n/g,Q_e(t))}var L7,M7,hf,_u,M0=Et(()=>{L7=ve(\"crypto\"),M7=ve(\"os\");RR();Ia();hf=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let o=[e];for(;o.length>0;){let a=o.shift();if((await this.lstatPromise(a)).isDirectory()){let u=await this.readdirPromise(a);if(r)for(let A of u.sort())o.push(this.pathUtils.join(a,A));else throw new Error(\"Not supported\")}else yield a}}async checksumFilePromise(e,{algorithm:r=\"sha512\"}={}){let o=await this.openPromise(e,\"r\");try{let n=Buffer.allocUnsafeSlow(65536),u=(0,L7.createHash)(r),A=0;for(;(A=await this.readPromise(o,n,0,65536))!==0;)u.update(A===65536?n:n.slice(0,A));return u.digest(\"hex\")}finally{await this.closePromise(o)}}async removePromise(e,{recursive:r=!0,maxRetries:o=5}={}){let a;try{a=await this.lstatPromise(e)}catch(n){if(n.code===\"ENOENT\")return;throw n}if(a.isDirectory()){if(r){let n=await this.readdirPromise(e);await Promise.all(n.map(u=>this.removePromise(this.pathUtils.resolve(e,u))))}for(let n=0;n<=o;n++)try{await this.rmdirPromise(e);break}catch(u){if(u.code!==\"EBUSY\"&&u.code!==\"ENOTEMPTY\")throw u;n<o&&await new Promise(A=>setTimeout(A,n*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:r=!0}={}){let o;try{o=this.lstatSync(e)}catch(a){if(a.code===\"ENOENT\")return;throw a}if(o.isDirectory()){if(r)for(let a of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,a));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{await this.mkdirPromise(A)}catch(p){if(p.code===\"EEXIST\")continue;throw p}if(n??=A,r!=null&&await this.chmodPromise(A,r),o!=null)await this.utimesPromise(A,o[0],o[1]);else{let p=await this.statPromise(this.pathUtils.dirname(A));await this.utimesPromise(A,p.atime,p.mtime)}}}return n}mkdirpSync(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{this.mkdirSync(A)}catch(p){if(p.code===\"EEXIST\")continue;throw p}if(n??=A,r!=null&&this.chmodSync(A,r),o!=null)this.utimesSync(A,o[0],o[1]);else{let p=this.statSync(this.pathUtils.dirname(A));this.utimesSync(A,p.atime,p.mtime)}}}return n}async copyPromise(e,r,{baseFs:o=this,overwrite:a=!0,stableSort:n=!1,stableTime:u=!1,linkStrategy:A=null}={}){return await k7(this,e,o,r,{overwrite:a,stableSort:n,stableTime:u,linkStrategy:A})}copySync(e,r,{baseFs:o=this,overwrite:a=!0}={}){let n=o.lstatSync(r),u=this.existsSync(e);if(n.isDirectory()){this.mkdirpSync(e);let p=o.readdirSync(r);for(let h of p)this.copySync(this.pathUtils.join(e,h),o.pathUtils.join(r,h),{baseFs:o,overwrite:a})}else if(n.isFile()){if(!u||a){u&&this.removeSync(e);let p=o.readFileSync(r);this.writeFileSync(e,p)}}else if(n.isSymbolicLink()){if(!u||a){u&&this.removeSync(e);let p=o.readlinkSync(r);this.symlinkSync(lD(this.pathUtils,p),e)}}else throw new Error(`Unsupported file type (file: ${r}, mode: 0o${n.mode.toString(8).padStart(6,\"0\")})`);let A=n.mode&511;this.chmodSync(e,A)}async changeFilePromise(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferPromise(e,r,o):this.changeFileTextPromise(e,r,o)}async changeFileBufferPromise(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=await this.readFilePromise(e)}catch{}Buffer.compare(a,r)!==0&&await this.writeFilePromise(e,r,{mode:o})}async changeFileTextPromise(e,r,{automaticNewlines:o,mode:a}={}){let n=\"\";try{n=await this.readFilePromise(e,\"utf8\")}catch{}let u=o?L0(n,r):r;n!==u&&await this.writeFilePromise(e,u,{mode:a})}changeFileSync(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferSync(e,r,o):this.changeFileTextSync(e,r,o)}changeFileBufferSync(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=this.readFileSync(e)}catch{}Buffer.compare(a,r)!==0&&this.writeFileSync(e,r,{mode:o})}changeFileTextSync(e,r,{automaticNewlines:o=!1,mode:a}={}){let n=\"\";try{n=this.readFileSync(e,\"utf8\")}catch{}let u=o?L0(n,r):r;n!==u&&this.writeFileSync(e,u,{mode:a})}async movePromise(e,r){try{await this.renamePromise(e,r)}catch(o){if(o.code===\"EXDEV\")await this.copyPromise(r,e),await this.removePromise(e);else throw o}}moveSync(e,r){try{this.renameSync(e,r)}catch(o){if(o.code===\"EXDEV\")this.copySync(r,e),this.removeSync(e);else throw o}}async lockPromise(e,r){let o=`${e}.flock`,a=1e3/60,n=Date.now(),u=null,A=async()=>{let p;try{[p]=await this.readJsonPromise(o)}catch{return Date.now()-n<500}try{return process.kill(p,0),!0}catch{return!1}};for(;u===null;)try{u=await this.openPromise(o,\"wx\")}catch(p){if(p.code===\"EEXIST\"){if(!await A())try{await this.unlinkPromise(o);continue}catch{}if(Date.now()-n<60*1e3)await new Promise(h=>setTimeout(h,a));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${o})`)}else throw p}await this.writePromise(u,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(u),await this.unlinkPromise(o)}catch{}}}async readJsonPromise(e){let r=await this.readFilePromise(e,\"utf8\");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}readJsonSync(e){let r=this.readFileSync(e,\"utf8\");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}async writeJsonPromise(e,r,{compact:o=!1}={}){let a=o?0:2;return await this.writeFilePromise(e,`${JSON.stringify(r,null,a)}\n`)}writeJsonSync(e,r,{compact:o=!1}={}){let a=o?0:2;return this.writeFileSync(e,`${JSON.stringify(r,null,a)}\n`)}async preserveTimePromise(e,r){let o=await this.lstatPromise(e),a=await r();typeof a<\"u\"&&(e=a),await this.lutimesPromise(e,o.atime,o.mtime)}async preserveTimeSync(e,r){let o=this.lstatSync(e),a=r();typeof a<\"u\"&&(e=a),this.lutimesSync(e,o.atime,o.mtime)}},_u=class extends hf{constructor(){super(V)}}});var Ss,gf=Et(()=>{M0();Ss=class extends hf{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,o){return this.baseFs.openPromise(this.mapToBase(e),r,o)}openSync(e,r,o){return this.baseFs.openSync(this.mapToBase(e),r,o)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,o,a,n){return await this.baseFs.readPromise(e,r,o,a,n)}readSync(e,r,o,a,n){return this.baseFs.readSync(e,r,o,a,n)}async writePromise(e,r,o,a,n){return typeof r==\"string\"?await this.baseFs.writePromise(e,r,o):await this.baseFs.writePromise(e,r,o,a,n)}writeSync(e,r,o,a,n){return typeof r==\"string\"?this.baseFs.writeSync(e,r,o):this.baseFs.writeSync(e,r,o,a,n)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async fchownPromise(e,r,o){return this.baseFs.fchownPromise(e,r,o)}fchownSync(e,r,o){return this.baseFs.fchownSync(e,r,o)}async chownPromise(e,r,o){return this.baseFs.chownPromise(this.mapToBase(e),r,o)}chownSync(e,r,o){return this.baseFs.chownSync(this.mapToBase(e),r,o)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,o=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),o)}copyFileSync(e,r,o=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),o)}async appendFilePromise(e,r,o){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,o)}appendFileSync(e,r,o){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,o)}async writeFilePromise(e,r,o){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,o)}writeFileSync(e,r,o){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,o)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,o){return this.baseFs.utimesPromise(this.mapToBase(e),r,o)}utimesSync(e,r,o){return this.baseFs.utimesSync(this.mapToBase(e),r,o)}async lutimesPromise(e,r,o){return this.baseFs.lutimesPromise(this.mapToBase(e),r,o)}lutimesSync(e,r,o){return this.baseFs.lutimesSync(this.mapToBase(e),r,o)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async rmPromise(e,r){return this.baseFs.rmPromise(this.mapToBase(e),r)}rmSync(e,r){return this.baseFs.rmSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),a,o);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),u=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkPromise(u,a,o)}symlinkSync(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),a,o);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),u=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkSync(u,a,o)}async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}watch(e,r,o){return this.baseFs.watch(this.mapToBase(e),r,o)}watchFile(e,r,o){return this.baseFs.watchFile(this.mapToBase(e),r,o)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e==\"number\"?e:this.mapToBase(e)}}});var Hu,O7=Et(()=>{gf();Hu=class extends Ss{constructor(e,{baseFs:r,pathUtils:o}){super(o),this.target=e,this.baseFs=r}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}}});function U7(t){let e=t;return typeof t.path==\"string\"&&(e.path=ue.toPortablePath(t.path)),e}var _7,Tn,O0=Et(()=>{_7=Ze(ve(\"fs\"));M0();Ia();Tn=class extends _u{constructor(e=_7.default){super(),this.realFs=e}getExtractHint(){return!1}getRealPath(){return It.root}resolve(e){return V.resolve(e)}async openPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.open(ue.fromPortablePath(e),r,o,this.makeCallback(a,n))})}openSync(e,r,o){return this.realFs.openSync(ue.fromPortablePath(e),r,o)}async opendirPromise(e,r){return await new Promise((o,a)=>{typeof r<\"u\"?this.realFs.opendir(ue.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.opendir(ue.fromPortablePath(e),this.makeCallback(o,a))}).then(o=>{let a=o;return Object.defineProperty(a,\"path\",{value:e,configurable:!0,writable:!0}),a})}opendirSync(e,r){let a=typeof r<\"u\"?this.realFs.opendirSync(ue.fromPortablePath(e),r):this.realFs.opendirSync(ue.fromPortablePath(e));return Object.defineProperty(a,\"path\",{value:e,configurable:!0,writable:!0}),a}async readPromise(e,r,o=0,a=0,n=-1){return await new Promise((u,A)=>{this.realFs.read(e,r,o,a,n,(p,h)=>{p?A(p):u(h)})})}readSync(e,r,o,a,n){return this.realFs.readSync(e,r,o,a,n)}async writePromise(e,r,o,a,n){return await new Promise((u,A)=>typeof r==\"string\"?this.realFs.write(e,r,o,this.makeCallback(u,A)):this.realFs.write(e,r,o,a,n,this.makeCallback(u,A)))}writeSync(e,r,o,a,n){return typeof r==\"string\"?this.realFs.writeSync(e,r,o):this.realFs.writeSync(e,r,o,a,n)}async closePromise(e){await new Promise((r,o)=>{this.realFs.close(e,this.makeCallback(r,o))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,r){let o=e!==null?ue.fromPortablePath(e):e;return this.realFs.createReadStream(o,r)}createWriteStream(e,r){let o=e!==null?ue.fromPortablePath(e):e;return this.realFs.createWriteStream(o,r)}async realpathPromise(e){return await new Promise((r,o)=>{this.realFs.realpath(ue.fromPortablePath(e),{},this.makeCallback(r,o))}).then(r=>ue.toPortablePath(r))}realpathSync(e){return ue.toPortablePath(this.realFs.realpathSync(ue.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(r=>{this.realFs.exists(ue.fromPortablePath(e),r)})}accessSync(e,r){return this.realFs.accessSync(ue.fromPortablePath(e),r)}async accessPromise(e,r){return await new Promise((o,a)=>{this.realFs.access(ue.fromPortablePath(e),r,this.makeCallback(o,a))})}existsSync(e){return this.realFs.existsSync(ue.fromPortablePath(e))}async statPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.stat(ue.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.stat(ue.fromPortablePath(e),this.makeCallback(o,a))})}statSync(e,r){return r?this.realFs.statSync(ue.fromPortablePath(e),r):this.realFs.statSync(ue.fromPortablePath(e))}async fstatPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.fstat(e,r,this.makeCallback(o,a)):this.realFs.fstat(e,this.makeCallback(o,a))})}fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync(e)}async lstatPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.lstat(ue.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.lstat(ue.fromPortablePath(e),this.makeCallback(o,a))})}lstatSync(e,r){return r?this.realFs.lstatSync(ue.fromPortablePath(e),r):this.realFs.lstatSync(ue.fromPortablePath(e))}async fchmodPromise(e,r){return await new Promise((o,a)=>{this.realFs.fchmod(e,r,this.makeCallback(o,a))})}fchmodSync(e,r){return this.realFs.fchmodSync(e,r)}async chmodPromise(e,r){return await new Promise((o,a)=>{this.realFs.chmod(ue.fromPortablePath(e),r,this.makeCallback(o,a))})}chmodSync(e,r){return this.realFs.chmodSync(ue.fromPortablePath(e),r)}async fchownPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.fchown(e,r,o,this.makeCallback(a,n))})}fchownSync(e,r,o){return this.realFs.fchownSync(e,r,o)}async chownPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.chown(ue.fromPortablePath(e),r,o,this.makeCallback(a,n))})}chownSync(e,r,o){return this.realFs.chownSync(ue.fromPortablePath(e),r,o)}async renamePromise(e,r){return await new Promise((o,a)=>{this.realFs.rename(ue.fromPortablePath(e),ue.fromPortablePath(r),this.makeCallback(o,a))})}renameSync(e,r){return this.realFs.renameSync(ue.fromPortablePath(e),ue.fromPortablePath(r))}async copyFilePromise(e,r,o=0){return await new Promise((a,n)=>{this.realFs.copyFile(ue.fromPortablePath(e),ue.fromPortablePath(r),o,this.makeCallback(a,n))})}copyFileSync(e,r,o=0){return this.realFs.copyFileSync(ue.fromPortablePath(e),ue.fromPortablePath(r),o)}async appendFilePromise(e,r,o){return await new Promise((a,n)=>{let u=typeof e==\"string\"?ue.fromPortablePath(e):e;o?this.realFs.appendFile(u,r,o,this.makeCallback(a,n)):this.realFs.appendFile(u,r,this.makeCallback(a,n))})}appendFileSync(e,r,o){let a=typeof e==\"string\"?ue.fromPortablePath(e):e;o?this.realFs.appendFileSync(a,r,o):this.realFs.appendFileSync(a,r)}async writeFilePromise(e,r,o){return await new Promise((a,n)=>{let u=typeof e==\"string\"?ue.fromPortablePath(e):e;o?this.realFs.writeFile(u,r,o,this.makeCallback(a,n)):this.realFs.writeFile(u,r,this.makeCallback(a,n))})}writeFileSync(e,r,o){let a=typeof e==\"string\"?ue.fromPortablePath(e):e;o?this.realFs.writeFileSync(a,r,o):this.realFs.writeFileSync(a,r)}async unlinkPromise(e){return await new Promise((r,o)=>{this.realFs.unlink(ue.fromPortablePath(e),this.makeCallback(r,o))})}unlinkSync(e){return this.realFs.unlinkSync(ue.fromPortablePath(e))}async utimesPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.utimes(ue.fromPortablePath(e),r,o,this.makeCallback(a,n))})}utimesSync(e,r,o){this.realFs.utimesSync(ue.fromPortablePath(e),r,o)}async lutimesPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.lutimes(ue.fromPortablePath(e),r,o,this.makeCallback(a,n))})}lutimesSync(e,r,o){this.realFs.lutimesSync(ue.fromPortablePath(e),r,o)}async mkdirPromise(e,r){return await new Promise((o,a)=>{this.realFs.mkdir(ue.fromPortablePath(e),r,this.makeCallback(o,a))})}mkdirSync(e,r){return this.realFs.mkdirSync(ue.fromPortablePath(e),r)}async rmdirPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.rmdir(ue.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.rmdir(ue.fromPortablePath(e),this.makeCallback(o,a))})}rmdirSync(e,r){return this.realFs.rmdirSync(ue.fromPortablePath(e),r)}async rmPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.rm(ue.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.rm(ue.fromPortablePath(e),this.makeCallback(o,a))})}rmSync(e,r){return this.realFs.rmSync(ue.fromPortablePath(e),r)}async linkPromise(e,r){return await new Promise((o,a)=>{this.realFs.link(ue.fromPortablePath(e),ue.fromPortablePath(r),this.makeCallback(o,a))})}linkSync(e,r){return this.realFs.linkSync(ue.fromPortablePath(e),ue.fromPortablePath(r))}async symlinkPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.symlink(ue.fromPortablePath(e.replace(/\\/+$/,\"\")),ue.fromPortablePath(r),o,this.makeCallback(a,n))})}symlinkSync(e,r,o){return this.realFs.symlinkSync(ue.fromPortablePath(e.replace(/\\/+$/,\"\")),ue.fromPortablePath(r),o)}async readFilePromise(e,r){return await new Promise((o,a)=>{let n=typeof e==\"string\"?ue.fromPortablePath(e):e;this.realFs.readFile(n,r,this.makeCallback(o,a))})}readFileSync(e,r){let o=typeof e==\"string\"?ue.fromPortablePath(e):e;return this.realFs.readFileSync(o,r)}async readdirPromise(e,r){return await new Promise((o,a)=>{r?r.recursive&&process.platform===\"win32\"?r.withFileTypes?this.realFs.readdir(ue.fromPortablePath(e),r,this.makeCallback(n=>o(n.map(U7)),a)):this.realFs.readdir(ue.fromPortablePath(e),r,this.makeCallback(n=>o(n.map(ue.toPortablePath)),a)):this.realFs.readdir(ue.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.readdir(ue.fromPortablePath(e),this.makeCallback(o,a))})}readdirSync(e,r){return r?r.recursive&&process.platform===\"win32\"?r.withFileTypes?this.realFs.readdirSync(ue.fromPortablePath(e),r).map(U7):this.realFs.readdirSync(ue.fromPortablePath(e),r).map(ue.toPortablePath):this.realFs.readdirSync(ue.fromPortablePath(e),r):this.realFs.readdirSync(ue.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((r,o)=>{this.realFs.readlink(ue.fromPortablePath(e),this.makeCallback(r,o))}).then(r=>ue.toPortablePath(r))}readlinkSync(e){return ue.toPortablePath(this.realFs.readlinkSync(ue.fromPortablePath(e)))}async truncatePromise(e,r){return await new Promise((o,a)=>{this.realFs.truncate(ue.fromPortablePath(e),r,this.makeCallback(o,a))})}truncateSync(e,r){return this.realFs.truncateSync(ue.fromPortablePath(e),r)}async ftruncatePromise(e,r){return await new Promise((o,a)=>{this.realFs.ftruncate(e,r,this.makeCallback(o,a))})}ftruncateSync(e,r){return this.realFs.ftruncateSync(e,r)}watch(e,r,o){return this.realFs.watch(ue.fromPortablePath(e),r,o)}watchFile(e,r,o){return this.realFs.watchFile(ue.fromPortablePath(e),r,o)}unwatchFile(e,r){return this.realFs.unwatchFile(ue.fromPortablePath(e),r)}makeCallback(e,r){return(o,a)=>{o?r(o):e(a)}}}});var gn,H7=Et(()=>{O0();gf();Ia();gn=class extends Ss{constructor(e,{baseFs:r=new Tn}={}){super(V),this.target=this.pathUtils.normalize(e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?V.normalize(e):this.baseFs.resolve(V.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}}});var q7,qu,j7=Et(()=>{O0();gf();Ia();q7=It.root,qu=class extends Ss{constructor(e,{baseFs:r=new Tn}={}){super(V),this.target=this.pathUtils.resolve(It.root,e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(It.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(q7,e));if(r.match(/^\\.\\.\\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(q7,this.pathUtils.relative(this.target,e))}}});var Gd,G7=Et(()=>{gf();Gd=class extends Ss{constructor(r,o){super(o);this.instance=null;this.factory=r}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(r){this.instance=r}mapFromBase(r){return r}mapToBase(r){return r}}});var U0,Ba,Up,Y7=Et(()=>{U0=ve(\"fs\");M0();O0();TR();oD();Ia();Ba=4278190080,Up=class extends _u{constructor({baseFs:r=new Tn,filter:o=null,magicByte:a=42,maxOpenFiles:n=1/0,useCache:u=!0,maxAge:A=5e3,typeCheck:p=U0.constants.S_IFREG,getMountPoint:h,factoryPromise:E,factorySync:I}){if(Math.floor(a)!==a||!(a>1&&a<=127))throw new Error(\"The magic byte must be set to a round value between 1 and 127 included\");super();this.fdMap=new Map;this.nextFd=3;this.isMount=new Set;this.notMount=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.baseFs=r,this.mountInstances=u?new Map:null,this.factoryPromise=E,this.factorySync=I,this.filter=o,this.getMountPoint=h,this.magic=a<<24,this.maxAge=A,this.maxOpenFiles=n,this.typeCheck=p}getExtractHint(r){return this.baseFs.getExtractHint(r)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(N0(this),this.mountInstances)for(let[r,{childFs:o}]of this.mountInstances.entries())o.saveAndClose?.(),this.mountInstances.delete(r)}discardAndClose(){if(N0(this),this.mountInstances)for(let[r,{childFs:o}]of this.mountInstances.entries())o.discardAndClose?.(),this.mountInstances.delete(r)}resolve(r){return this.baseFs.resolve(r)}remapFd(r,o){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,o]),a}async openPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.openPromise(r,o,a),async(n,{subPath:u})=>this.remapFd(n,await n.openPromise(u,o,a)))}openSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,o,a),(n,{subPath:u})=>this.remapFd(n,n.openSync(u,o,a)))}async opendirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.opendirPromise(r,o),async(a,{subPath:n})=>await a.opendirPromise(n,o),{requireSubpath:!1})}opendirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.opendirSync(r,o),(a,{subPath:n})=>a.opendirSync(n,o),{requireSubpath:!1})}async readPromise(r,o,a,n,u){if((r&Ba)!==this.magic)return await this.baseFs.readPromise(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>\"u\")throw Io(\"read\");let[p,h]=A;return await p.readPromise(h,o,a,n,u)}readSync(r,o,a,n,u){if((r&Ba)!==this.magic)return this.baseFs.readSync(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>\"u\")throw Io(\"readSync\");let[p,h]=A;return p.readSync(h,o,a,n,u)}async writePromise(r,o,a,n,u){if((r&Ba)!==this.magic)return typeof o==\"string\"?await this.baseFs.writePromise(r,o,a):await this.baseFs.writePromise(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>\"u\")throw Io(\"write\");let[p,h]=A;return typeof o==\"string\"?await p.writePromise(h,o,a):await p.writePromise(h,o,a,n,u)}writeSync(r,o,a,n,u){if((r&Ba)!==this.magic)return typeof o==\"string\"?this.baseFs.writeSync(r,o,a):this.baseFs.writeSync(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>\"u\")throw Io(\"writeSync\");let[p,h]=A;return typeof o==\"string\"?p.writeSync(h,o,a):p.writeSync(h,o,a,n,u)}async closePromise(r){if((r&Ba)!==this.magic)return await this.baseFs.closePromise(r);let o=this.fdMap.get(r);if(typeof o>\"u\")throw Io(\"close\");this.fdMap.delete(r);let[a,n]=o;return await a.closePromise(n)}closeSync(r){if((r&Ba)!==this.magic)return this.baseFs.closeSync(r);let o=this.fdMap.get(r);if(typeof o>\"u\")throw Io(\"closeSync\");this.fdMap.delete(r);let[a,n]=o;return a.closeSync(n)}createReadStream(r,o){return r===null?this.baseFs.createReadStream(r,o):this.makeCallSync(r,()=>this.baseFs.createReadStream(r,o),(a,{archivePath:n,subPath:u})=>{let A=a.createReadStream(u,o);return A.path=ue.fromPortablePath(this.pathUtils.join(n,u)),A})}createWriteStream(r,o){return r===null?this.baseFs.createWriteStream(r,o):this.makeCallSync(r,()=>this.baseFs.createWriteStream(r,o),(a,{subPath:n})=>a.createWriteStream(n,o))}async realpathPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.realpathPromise(r),async(o,{archivePath:a,subPath:n})=>{let u=this.realPaths.get(a);return typeof u>\"u\"&&(u=await this.baseFs.realpathPromise(a),this.realPaths.set(a,u)),this.pathUtils.join(u,this.pathUtils.relative(It.root,await o.realpathPromise(n)))})}realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(r),(o,{archivePath:a,subPath:n})=>{let u=this.realPaths.get(a);return typeof u>\"u\"&&(u=this.baseFs.realpathSync(a),this.realPaths.set(a,u)),this.pathUtils.join(u,this.pathUtils.relative(It.root,o.realpathSync(n)))})}async existsPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.existsPromise(r),async(o,{subPath:a})=>await o.existsPromise(a))}existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(o,{subPath:a})=>o.existsSync(a))}async accessPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.accessPromise(r,o),async(a,{subPath:n})=>await a.accessPromise(n,o))}accessSync(r,o){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,o),(a,{subPath:n})=>a.accessSync(n,o))}async statPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.statPromise(r,o),async(a,{subPath:n})=>await a.statPromise(n,o))}statSync(r,o){return this.makeCallSync(r,()=>this.baseFs.statSync(r,o),(a,{subPath:n})=>a.statSync(n,o))}async fstatPromise(r,o){if((r&Ba)!==this.magic)return this.baseFs.fstatPromise(r,o);let a=this.fdMap.get(r);if(typeof a>\"u\")throw Io(\"fstat\");let[n,u]=a;return n.fstatPromise(u,o)}fstatSync(r,o){if((r&Ba)!==this.magic)return this.baseFs.fstatSync(r,o);let a=this.fdMap.get(r);if(typeof a>\"u\")throw Io(\"fstatSync\");let[n,u]=a;return n.fstatSync(u,o)}async lstatPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.lstatPromise(r,o),async(a,{subPath:n})=>await a.lstatPromise(n,o))}lstatSync(r,o){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,o),(a,{subPath:n})=>a.lstatSync(n,o))}async fchmodPromise(r,o){if((r&Ba)!==this.magic)return this.baseFs.fchmodPromise(r,o);let a=this.fdMap.get(r);if(typeof a>\"u\")throw Io(\"fchmod\");let[n,u]=a;return n.fchmodPromise(u,o)}fchmodSync(r,o){if((r&Ba)!==this.magic)return this.baseFs.fchmodSync(r,o);let a=this.fdMap.get(r);if(typeof a>\"u\")throw Io(\"fchmodSync\");let[n,u]=a;return n.fchmodSync(u,o)}async chmodPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.chmodPromise(r,o),async(a,{subPath:n})=>await a.chmodPromise(n,o))}chmodSync(r,o){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,o),(a,{subPath:n})=>a.chmodSync(n,o))}async fchownPromise(r,o,a){if((r&Ba)!==this.magic)return this.baseFs.fchownPromise(r,o,a);let n=this.fdMap.get(r);if(typeof n>\"u\")throw Io(\"fchown\");let[u,A]=n;return u.fchownPromise(A,o,a)}fchownSync(r,o,a){if((r&Ba)!==this.magic)return this.baseFs.fchownSync(r,o,a);let n=this.fdMap.get(r);if(typeof n>\"u\")throw Io(\"fchownSync\");let[u,A]=n;return u.fchownSync(A,o,a)}async chownPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.chownPromise(r,o,a),async(n,{subPath:u})=>await n.chownPromise(u,o,a))}chownSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,o,a),(n,{subPath:u})=>n.chownSync(u,o,a))}async renamePromise(r,o){return await this.makeCallPromise(r,async()=>await this.makeCallPromise(o,async()=>await this.baseFs.renamePromise(r,o),async()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})}),async(a,{subPath:n})=>await this.makeCallPromise(o,async()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})},async(u,{subPath:A})=>{if(a!==u)throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"});return await a.renamePromise(n,A)}))}renameSync(r,o){return this.makeCallSync(r,()=>this.makeCallSync(o,()=>this.baseFs.renameSync(r,o),()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})}),(a,{subPath:n})=>this.makeCallSync(o,()=>{throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"})},(u,{subPath:A})=>{if(a!==u)throw Object.assign(new Error(\"EEXDEV: cross-device link not permitted\"),{code:\"EEXDEV\"});return a.renameSync(n,A)}))}async copyFilePromise(r,o,a=0){let n=async(u,A,p,h)=>{if(a&U0.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${A}' -> ${h}'`),{code:\"EXDEV\"});if(a&U0.constants.COPYFILE_EXCL&&await this.existsPromise(A))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${A}' -> '${h}'`),{code:\"EEXIST\"});let E;try{E=await u.readFilePromise(A)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${A}' -> '${h}'`),{code:\"EINVAL\"})}await p.writeFilePromise(h,E)};return await this.makeCallPromise(r,async()=>await this.makeCallPromise(o,async()=>await this.baseFs.copyFilePromise(r,o,a),async(u,{subPath:A})=>await n(this.baseFs,r,u,A)),async(u,{subPath:A})=>await this.makeCallPromise(o,async()=>await n(u,A,this.baseFs,o),async(p,{subPath:h})=>u!==p?await n(u,A,p,h):await u.copyFilePromise(A,h,a)))}copyFileSync(r,o,a=0){let n=(u,A,p,h)=>{if(a&U0.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${A}' -> ${h}'`),{code:\"EXDEV\"});if(a&U0.constants.COPYFILE_EXCL&&this.existsSync(A))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${A}' -> '${h}'`),{code:\"EEXIST\"});let E;try{E=u.readFileSync(A)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${A}' -> '${h}'`),{code:\"EINVAL\"})}p.writeFileSync(h,E)};return this.makeCallSync(r,()=>this.makeCallSync(o,()=>this.baseFs.copyFileSync(r,o,a),(u,{subPath:A})=>n(this.baseFs,r,u,A)),(u,{subPath:A})=>this.makeCallSync(o,()=>n(u,A,this.baseFs,o),(p,{subPath:h})=>u!==p?n(u,A,p,h):u.copyFileSync(A,h,a)))}async appendFilePromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.appendFilePromise(r,o,a),async(n,{subPath:u})=>await n.appendFilePromise(u,o,a))}appendFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.appendFileSync(r,o,a),(n,{subPath:u})=>n.appendFileSync(u,o,a))}async writeFilePromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.writeFilePromise(r,o,a),async(n,{subPath:u})=>await n.writeFilePromise(u,o,a))}writeFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.writeFileSync(r,o,a),(n,{subPath:u})=>n.writeFileSync(u,o,a))}async unlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.unlinkPromise(r),async(o,{subPath:a})=>await o.unlinkPromise(a))}unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(o,{subPath:a})=>o.unlinkSync(a))}async utimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.utimesPromise(r,o,a),async(n,{subPath:u})=>await n.utimesPromise(u,o,a))}utimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(r,o,a),(n,{subPath:u})=>n.utimesSync(u,o,a))}async lutimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.lutimesPromise(r,o,a),async(n,{subPath:u})=>await n.lutimesPromise(u,o,a))}lutimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSync(r,o,a),(n,{subPath:u})=>n.lutimesSync(u,o,a))}async mkdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.mkdirPromise(r,o),async(a,{subPath:n})=>await a.mkdirPromise(n,o))}mkdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,o),(a,{subPath:n})=>a.mkdirSync(n,o))}async rmdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.rmdirPromise(r,o),async(a,{subPath:n})=>await a.rmdirPromise(n,o))}rmdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,o),(a,{subPath:n})=>a.rmdirSync(n,o))}async rmPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.rmPromise(r,o),async(a,{subPath:n})=>await a.rmPromise(n,o))}rmSync(r,o){return this.makeCallSync(r,()=>this.baseFs.rmSync(r,o),(a,{subPath:n})=>a.rmSync(n,o))}async linkPromise(r,o){return await this.makeCallPromise(o,async()=>await this.baseFs.linkPromise(r,o),async(a,{subPath:n})=>await a.linkPromise(r,n))}linkSync(r,o){return this.makeCallSync(o,()=>this.baseFs.linkSync(r,o),(a,{subPath:n})=>a.linkSync(r,n))}async symlinkPromise(r,o,a){return await this.makeCallPromise(o,async()=>await this.baseFs.symlinkPromise(r,o,a),async(n,{subPath:u})=>await n.symlinkPromise(r,u))}symlinkSync(r,o,a){return this.makeCallSync(o,()=>this.baseFs.symlinkSync(r,o,a),(n,{subPath:u})=>n.symlinkSync(r,u))}async readFilePromise(r,o){return this.makeCallPromise(r,async()=>await this.baseFs.readFilePromise(r,o),async(a,{subPath:n})=>await a.readFilePromise(n,o))}readFileSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readFileSync(r,o),(a,{subPath:n})=>a.readFileSync(n,o))}async readdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.readdirPromise(r,o),async(a,{subPath:n})=>await a.readdirPromise(n,o),{requireSubpath:!1})}readdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readdirSync(r,o),(a,{subPath:n})=>a.readdirSync(n,o),{requireSubpath:!1})}async readlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.readlinkPromise(r),async(o,{subPath:a})=>await o.readlinkPromise(a))}readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(r),(o,{subPath:a})=>o.readlinkSync(a))}async truncatePromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.truncatePromise(r,o),async(a,{subPath:n})=>await a.truncatePromise(n,o))}truncateSync(r,o){return this.makeCallSync(r,()=>this.baseFs.truncateSync(r,o),(a,{subPath:n})=>a.truncateSync(n,o))}async ftruncatePromise(r,o){if((r&Ba)!==this.magic)return this.baseFs.ftruncatePromise(r,o);let a=this.fdMap.get(r);if(typeof a>\"u\")throw Io(\"ftruncate\");let[n,u]=a;return n.ftruncatePromise(u,o)}ftruncateSync(r,o){if((r&Ba)!==this.magic)return this.baseFs.ftruncateSync(r,o);let a=this.fdMap.get(r);if(typeof a>\"u\")throw Io(\"ftruncateSync\");let[n,u]=a;return n.ftruncateSync(u,o)}watch(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,o,a),(n,{subPath:u})=>n.watch(u,o,a))}watchFile(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,o,a),()=>jd(this,r,o,a))}unwatchFile(r,o){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(r,o),()=>T0(this,r,o))}async makeCallPromise(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!=\"string\")return await o();let u=this.resolve(r),A=this.findMount(u);return A?n&&A.subPath===\"/\"?await o():await this.getMountPromise(A.archivePath,async p=>await a(p,A)):await o()}makeCallSync(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!=\"string\")return o();let u=this.resolve(r),A=this.findMount(u);return!A||n&&A.subPath===\"/\"?o():this.getMountSync(A.archivePath,p=>a(p,A))}findMount(r){if(this.filter&&!this.filter.test(r))return null;let o=\"\";for(;;){let a=r.substring(o.length),n=this.getMountPoint(a,o);if(!n)return null;if(o=this.pathUtils.join(o,n),!this.isMount.has(o)){if(this.notMount.has(o))continue;try{if(this.typeCheck!==null&&(this.baseFs.lstatSync(o).mode&U0.constants.S_IFMT)!==this.typeCheck){this.notMount.add(o);continue}}catch{return null}this.isMount.add(o)}return{archivePath:o,subPath:this.pathUtils.join(It.root,r.substring(o.length))}}}limitOpenFiles(r){if(this.mountInstances===null)return;let o=Date.now(),a=o+this.maxAge,n=r===null?0:this.mountInstances.size-r;for(let[u,{childFs:A,expiresAt:p,refCount:h}]of this.mountInstances.entries())if(!(h!==0||A.hasOpenFileHandles?.())){if(o>=p){A.saveAndClose?.(),this.mountInstances.delete(u),n-=1;continue}else if(r===null||n<=0){a=p;break}A.saveAndClose?.(),this.mountInstances.delete(u),n-=1}this.limitOpenFilesTimeout===null&&(r===null&&this.mountInstances.size>0||r!==null)&&isFinite(a)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},a-o).unref())}async getMountPromise(r,o){if(this.mountInstances){let a=this.mountInstances.get(r);if(!a){let n=await this.factoryPromise(this.baseFs,r);a=this.mountInstances.get(r),a||(a={childFs:n(),expiresAt:0,refCount:0})}this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,a.refCount+=1;try{return await o(a.childFs)}finally{a.refCount-=1}}else{let a=(await this.factoryPromise(this.baseFs,r))();try{return await o(a)}finally{a.saveAndClose?.()}}}getMountSync(r,o){if(this.mountInstances){let a=this.mountInstances.get(r);return a||(a={childFs:this.factorySync(this.baseFs,r),expiresAt:0,refCount:0}),this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,o(a.childFs)}else{let a=this.factorySync(this.baseFs,r);try{return o(a)}finally{a.saveAndClose?.()}}}}});var Zt,pD,W7=Et(()=>{M0();Ia();Zt=()=>Object.assign(new Error(\"ENOSYS: unsupported filesystem access\"),{code:\"ENOSYS\"}),pD=class t extends hf{static{this.instance=new t}constructor(){super(V)}getExtractHint(){throw Zt()}getRealPath(){throw Zt()}resolve(){throw Zt()}async openPromise(){throw Zt()}openSync(){throw Zt()}async opendirPromise(){throw Zt()}opendirSync(){throw Zt()}async readPromise(){throw Zt()}readSync(){throw Zt()}async writePromise(){throw Zt()}writeSync(){throw Zt()}async closePromise(){throw Zt()}closeSync(){throw Zt()}createWriteStream(){throw Zt()}createReadStream(){throw Zt()}async realpathPromise(){throw Zt()}realpathSync(){throw Zt()}async readdirPromise(){throw Zt()}readdirSync(){throw Zt()}async existsPromise(e){throw Zt()}existsSync(e){throw Zt()}async accessPromise(){throw Zt()}accessSync(){throw Zt()}async statPromise(){throw Zt()}statSync(){throw Zt()}async fstatPromise(e){throw Zt()}fstatSync(e){throw Zt()}async lstatPromise(e){throw Zt()}lstatSync(e){throw Zt()}async fchmodPromise(){throw Zt()}fchmodSync(){throw Zt()}async chmodPromise(){throw Zt()}chmodSync(){throw Zt()}async fchownPromise(){throw Zt()}fchownSync(){throw Zt()}async chownPromise(){throw Zt()}chownSync(){throw Zt()}async mkdirPromise(){throw Zt()}mkdirSync(){throw Zt()}async rmdirPromise(){throw Zt()}rmdirSync(){throw Zt()}async rmPromise(){throw Zt()}rmSync(){throw Zt()}async linkPromise(){throw Zt()}linkSync(){throw Zt()}async symlinkPromise(){throw Zt()}symlinkSync(){throw Zt()}async renamePromise(){throw Zt()}renameSync(){throw Zt()}async copyFilePromise(){throw Zt()}copyFileSync(){throw Zt()}async appendFilePromise(){throw Zt()}appendFileSync(){throw Zt()}async writeFilePromise(){throw Zt()}writeFileSync(){throw Zt()}async unlinkPromise(){throw Zt()}unlinkSync(){throw Zt()}async utimesPromise(){throw Zt()}utimesSync(){throw Zt()}async lutimesPromise(){throw Zt()}lutimesSync(){throw Zt()}async readFilePromise(){throw Zt()}readFileSync(){throw Zt()}async readlinkPromise(){throw Zt()}readlinkSync(){throw Zt()}async truncatePromise(){throw Zt()}truncateSync(){throw Zt()}async ftruncatePromise(e,r){throw Zt()}ftruncateSync(e,r){throw Zt()}watch(){throw Zt()}watchFile(){throw Zt()}unwatchFile(){throw Zt()}}});var _p,K7=Et(()=>{gf();Ia();_p=class extends Ss{constructor(e){super(ue),this.baseFs=e}mapFromBase(e){return ue.fromPortablePath(e)}mapToBase(e){return ue.toPortablePath(e)}}});var F_e,NR,R_e,zs,V7=Et(()=>{O0();gf();Ia();F_e=/^[0-9]+$/,NR=/^(\\/(?:[^/]+\\/)*?(?:\\$\\$virtual|__virtual__))((?:\\/((?:[^/]+-)?[a-f0-9]+)(?:\\/([^/]+))?)?((?:\\/.*)?))$/,R_e=/^([^/]+-)?[a-f0-9]+$/,zs=class t extends Ss{static makeVirtualPath(e,r,o){if(V.basename(e)!==\"__virtual__\")throw new Error('Assertion failed: Virtual folders must be named \"__virtual__\"');if(!V.basename(r).match(R_e))throw new Error(\"Assertion failed: Virtual components must be ended by an hexadecimal hash\");let n=V.relative(V.dirname(e),o).split(\"/\"),u=0;for(;u<n.length&&n[u]===\"..\";)u+=1;let A=n.slice(u);return V.join(e,r,String(u),...A)}static resolveVirtual(e){let r=e.match(NR);if(!r||!r[3]&&r[5])return e;let o=V.dirname(r[1]);if(!r[3]||!r[4])return o;if(!F_e.test(r[4]))return e;let n=Number(r[4]),u=\"../\".repeat(n),A=r[5]||\".\";return t.resolveVirtual(V.join(o,u,A))}constructor({baseFs:e=new Tn}={}){super(V),this.baseFs=e}getExtractHint(e){return this.baseFs.getExtractHint(e)}getRealPath(){return this.baseFs.getRealPath()}realpathSync(e){let r=e.match(NR);if(!r)return this.baseFs.realpathSync(e);if(!r[5])return e;let o=this.baseFs.realpathSync(this.mapToBase(e));return t.makeVirtualPath(r[1],r[3],o)}async realpathPromise(e){let r=e.match(NR);if(!r)return await this.baseFs.realpathPromise(e);if(!r[5])return e;let o=await this.baseFs.realpathPromise(this.mapToBase(e));return t.makeVirtualPath(r[1],r[3],o)}mapToBase(e){if(e===\"\")return e;if(this.pathUtils.isAbsolute(e))return t.resolveVirtual(e);let r=t.resolveVirtual(this.baseFs.resolve(It.dot)),o=t.resolveVirtual(this.baseFs.resolve(e));return V.relative(r,o)||It.dot}mapFromBase(e){return e}}});function T_e(t,e){return typeof LR.default.isUtf8<\"u\"?LR.default.isUtf8(t):Buffer.byteLength(e)===t.byteLength}var LR,z7,J7,hD,X7=Et(()=>{LR=Ze(ve(\"buffer\")),z7=ve(\"url\"),J7=ve(\"util\");gf();Ia();hD=class extends Ss{constructor(e){super(ue),this.baseFs=e}mapFromBase(e){return e}mapToBase(e){if(typeof e==\"string\")return e;if(e instanceof URL)return(0,z7.fileURLToPath)(e);if(Buffer.isBuffer(e)){let r=e.toString();if(!T_e(e,r))throw new Error(\"Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942\");return r}throw new Error(`Unsupported path type: ${(0,J7.inspect)(e)}`)}}});var rY,Bo,df,Hp,gD,dD,Yd,Nc,Lc,Z7,$7,eY,tY,Sw,nY=Et(()=>{rY=ve(\"readline\"),Bo=Symbol(\"kBaseFs\"),df=Symbol(\"kFd\"),Hp=Symbol(\"kClosePromise\"),gD=Symbol(\"kCloseResolve\"),dD=Symbol(\"kCloseReject\"),Yd=Symbol(\"kRefs\"),Nc=Symbol(\"kRef\"),Lc=Symbol(\"kUnref\"),Sw=class{constructor(e,r){this[tY]=1;this[eY]=void 0;this[$7]=void 0;this[Z7]=void 0;this[Bo]=r,this[df]=e}get fd(){return this[df]}async appendFile(e,r){try{this[Nc](this.appendFile);let o=(typeof r==\"string\"?r:r?.encoding)??void 0;return await this[Bo].appendFilePromise(this.fd,e,o?{encoding:o}:void 0)}finally{this[Lc]()}}async chown(e,r){try{return this[Nc](this.chown),await this[Bo].fchownPromise(this.fd,e,r)}finally{this[Lc]()}}async chmod(e){try{return this[Nc](this.chmod),await this[Bo].fchmodPromise(this.fd,e)}finally{this[Lc]()}}createReadStream(e){return this[Bo].createReadStream(null,{...e,fd:this.fd})}createWriteStream(e){return this[Bo].createWriteStream(null,{...e,fd:this.fd})}datasync(){throw new Error(\"Method not implemented.\")}sync(){throw new Error(\"Method not implemented.\")}async read(e,r,o,a){try{this[Nc](this.read);let n;return Buffer.isBuffer(e)?n=e:(e??={},n=e.buffer??Buffer.alloc(16384),r=e.offset||0,o=e.length??n.byteLength,a=e.position??null),r??=0,o??=0,o===0?{bytesRead:o,buffer:n}:{bytesRead:await this[Bo].readPromise(this.fd,n,r,o,a),buffer:n}}finally{this[Lc]()}}async readFile(e){try{this[Nc](this.readFile);let r=(typeof e==\"string\"?e:e?.encoding)??void 0;return await this[Bo].readFilePromise(this.fd,r)}finally{this[Lc]()}}readLines(e){return(0,rY.createInterface)({input:this.createReadStream(e),crlfDelay:1/0})}async stat(e){try{return this[Nc](this.stat),await this[Bo].fstatPromise(this.fd,e)}finally{this[Lc]()}}async truncate(e){try{return this[Nc](this.truncate),await this[Bo].ftruncatePromise(this.fd,e)}finally{this[Lc]()}}utimes(e,r){throw new Error(\"Method not implemented.\")}async writeFile(e,r){try{this[Nc](this.writeFile);let o=(typeof r==\"string\"?r:r?.encoding)??void 0;await this[Bo].writeFilePromise(this.fd,e,o)}finally{this[Lc]()}}async write(...e){try{if(this[Nc](this.write),ArrayBuffer.isView(e[0])){let[r,o,a,n]=e;return{bytesWritten:await this[Bo].writePromise(this.fd,r,o??void 0,a??void 0,n??void 0),buffer:r}}else{let[r,o,a]=e;return{bytesWritten:await this[Bo].writePromise(this.fd,r,o,a),buffer:r}}}finally{this[Lc]()}}async writev(e,r){try{this[Nc](this.writev);let o=0;if(typeof r<\"u\")for(let a of e){let n=await this.write(a,void 0,void 0,r);o+=n.bytesWritten,r+=n.bytesWritten}else for(let a of e){let n=await this.write(a);o+=n.bytesWritten}return{buffers:e,bytesWritten:o}}finally{this[Lc]()}}readv(e,r){throw new Error(\"Method not implemented.\")}close(){if(this[df]===-1)return Promise.resolve();if(this[Hp])return this[Hp];if(this[Yd]--,this[Yd]===0){let e=this[df];this[df]=-1,this[Hp]=this[Bo].closePromise(e).finally(()=>{this[Hp]=void 0})}else this[Hp]=new Promise((e,r)=>{this[gD]=e,this[dD]=r}).finally(()=>{this[Hp]=void 0,this[dD]=void 0,this[gD]=void 0});return this[Hp]}[(Bo,df,tY=Yd,eY=Hp,$7=gD,Z7=dD,Nc)](e){if(this[df]===-1){let r=new Error(\"file closed\");throw r.code=\"EBADF\",r.syscall=e.name,r}this[Yd]++}[Lc](){if(this[Yd]--,this[Yd]===0){let e=this[df];this[df]=-1,this[Bo].closePromise(e).then(this[gD],this[dD])}}}});function xw(t,e){e=new hD(e);let r=(o,a,n)=>{let u=o[a];o[a]=n,typeof u?.[Wd.promisify.custom]<\"u\"&&(n[Wd.promisify.custom]=u[Wd.promisify.custom])};{r(t,\"exists\",(o,...a)=>{let u=typeof a[a.length-1]==\"function\"?a.pop():()=>{};process.nextTick(()=>{e.existsPromise(o).then(A=>{u(A)},()=>{u(!1)})})}),r(t,\"read\",(...o)=>{let[a,n,u,A,p,h]=o;if(o.length<=3){let E={};o.length<3?h=o[1]:(E=o[1],h=o[2]),{buffer:n=Buffer.alloc(16384),offset:u=0,length:A=n.byteLength,position:p}=E}if(u==null&&(u=0),A|=0,A===0){process.nextTick(()=>{h(null,0,n)});return}p==null&&(p=-1),process.nextTick(()=>{e.readPromise(a,n,u,A,p).then(E=>{h(null,E,n)},E=>{h(E,0,n)})})});for(let o of iY){let a=o.replace(/Promise$/,\"\");if(typeof t[a]>\"u\")continue;let n=e[o];if(typeof n>\"u\")continue;r(t,a,(...A)=>{let h=typeof A[A.length-1]==\"function\"?A.pop():()=>{};process.nextTick(()=>{n.apply(e,A).then(E=>{h(null,E)},E=>{h(E)})})})}t.realpath.native=t.realpath}{r(t,\"existsSync\",o=>{try{return e.existsSync(o)}catch{return!1}}),r(t,\"readSync\",(...o)=>{let[a,n,u,A,p]=o;return o.length<=3&&({offset:u=0,length:A=n.byteLength,position:p}=o[2]||{}),u==null&&(u=0),A|=0,A===0?0:(p==null&&(p=-1),e.readSync(a,n,u,A,p))});for(let o of N_e){let a=o;if(typeof t[a]>\"u\")continue;let n=e[o];typeof n>\"u\"||r(t,a,n.bind(e))}t.realpathSync.native=t.realpathSync}{let o=t.promises;for(let a of iY){let n=a.replace(/Promise$/,\"\");if(typeof o[n]>\"u\")continue;let u=e[a];typeof u>\"u\"||a!==\"open\"&&r(o,n,(A,...p)=>A instanceof Sw?A[n].apply(A,p):u.call(e,A,...p))}r(o,\"open\",async(...a)=>{let n=await e.openPromise(...a);return new Sw(n,e)})}t.read[Wd.promisify.custom]=async(o,a,...n)=>({bytesRead:await e.readPromise(o,a,...n),buffer:a}),t.write[Wd.promisify.custom]=async(o,a,...n)=>({bytesWritten:await e.writePromise(o,a,...n),buffer:a})}function mD(t,e){let r=Object.create(t);return xw(r,e),r}var Wd,N_e,iY,sY=Et(()=>{Wd=ve(\"util\");X7();nY();N_e=new Set([\"accessSync\",\"appendFileSync\",\"createReadStream\",\"createWriteStream\",\"chmodSync\",\"fchmodSync\",\"chownSync\",\"fchownSync\",\"closeSync\",\"copyFileSync\",\"linkSync\",\"lstatSync\",\"fstatSync\",\"lutimesSync\",\"mkdirSync\",\"openSync\",\"opendirSync\",\"readlinkSync\",\"readFileSync\",\"readdirSync\",\"readlinkSync\",\"realpathSync\",\"renameSync\",\"rmdirSync\",\"rmSync\",\"statSync\",\"symlinkSync\",\"truncateSync\",\"ftruncateSync\",\"unlinkSync\",\"unwatchFile\",\"utimesSync\",\"watch\",\"watchFile\",\"writeFileSync\",\"writeSync\"]),iY=new Set([\"accessPromise\",\"appendFilePromise\",\"fchmodPromise\",\"chmodPromise\",\"fchownPromise\",\"chownPromise\",\"closePromise\",\"copyFilePromise\",\"linkPromise\",\"fstatPromise\",\"lstatPromise\",\"lutimesPromise\",\"mkdirPromise\",\"openPromise\",\"opendirPromise\",\"readdirPromise\",\"realpathPromise\",\"readFilePromise\",\"readdirPromise\",\"readlinkPromise\",\"renamePromise\",\"rmdirPromise\",\"rmPromise\",\"statPromise\",\"symlinkPromise\",\"truncatePromise\",\"ftruncatePromise\",\"unlinkPromise\",\"utimesPromise\",\"writeFilePromise\",\"writeSync\"])});function oY(t){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,\"0\");return`${t}${e}`}function aY(){if(MR)return MR;let t=ue.toPortablePath(lY.default.tmpdir()),e=oe.realpathSync(t);return process.once(\"exit\",()=>{oe.rmtempSync()}),MR={tmpdir:t,realTmpdir:e}}var lY,Mc,MR,oe,cY=Et(()=>{lY=Ze(ve(\"os\"));O0();Ia();Mc=new Set,MR=null;oe=Object.assign(new Tn,{detachTemp(t){Mc.delete(t)},mktempSync(t){let{tmpdir:e,realTmpdir:r}=aY();for(;;){let o=oY(\"xfs-\");try{this.mkdirSync(V.join(e,o))}catch(n){if(n.code===\"EEXIST\")continue;throw n}let a=V.join(r,o);if(Mc.add(a),typeof t>\"u\")return a;try{return t(a)}finally{if(Mc.has(a)){Mc.delete(a);try{this.removeSync(a)}catch{}}}}},async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=aY();for(;;){let o=oY(\"xfs-\");try{await this.mkdirPromise(V.join(e,o))}catch(n){if(n.code===\"EEXIST\")continue;throw n}let a=V.join(r,o);if(Mc.add(a),typeof t>\"u\")return a;try{return await t(a)}finally{if(Mc.has(a)){Mc.delete(a);try{await this.removePromise(a)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(Mc.values()).map(async t=>{try{await oe.removePromise(t,{maxRetries:0}),Mc.delete(t)}catch{}}))},rmtempSync(){for(let t of Mc)try{oe.removeSync(t),Mc.delete(t)}catch{}}})});var kw={};Vt(kw,{AliasFS:()=>Hu,BasePortableFakeFS:()=>_u,CustomDir:()=>bw,CwdFS:()=>gn,FakeFS:()=>hf,Filename:()=>dr,JailFS:()=>qu,LazyFS:()=>Gd,MountFS:()=>Up,NoFS:()=>pD,NodeFS:()=>Tn,PortablePath:()=>It,PosixFS:()=>_p,ProxiedFS:()=>Ss,VirtualFS:()=>zs,constants:()=>Bi,errors:()=>nr,extendFs:()=>mD,normalizeLineEndings:()=>L0,npath:()=>ue,opendir:()=>uD,patchFs:()=>xw,ppath:()=>V,setupCopyIndex:()=>cD,statUtils:()=>wa,unwatchAllFiles:()=>N0,unwatchFile:()=>T0,watchFile:()=>jd,xfs:()=>oe});var Pt=Et(()=>{P7();oD();kR();RR();F7();TR();M0();Ia();Ia();O7();M0();H7();j7();G7();Y7();W7();O0();K7();gf();V7();sY();cY()});var hY=_((pSt,pY)=>{pY.exports=fY;fY.sync=M_e;var uY=ve(\"fs\");function L_e(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(\";\"),r.indexOf(\"\")!==-1))return!0;for(var o=0;o<r.length;o++){var a=r[o].toLowerCase();if(a&&t.substr(-a.length).toLowerCase()===a)return!0}return!1}function AY(t,e,r){return!t.isSymbolicLink()&&!t.isFile()?!1:L_e(e,r)}function fY(t,e,r){uY.stat(t,function(o,a){r(o,o?!1:AY(a,t,e))})}function M_e(t,e){return AY(uY.statSync(t),t,e)}});var EY=_((hSt,yY)=>{yY.exports=dY;dY.sync=O_e;var gY=ve(\"fs\");function dY(t,e,r){gY.stat(t,function(o,a){r(o,o?!1:mY(a,e))})}function O_e(t,e){return mY(gY.statSync(t),e)}function mY(t,e){return t.isFile()&&U_e(t,e)}function U_e(t,e){var r=t.mode,o=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),u=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),A=parseInt(\"100\",8),p=parseInt(\"010\",8),h=parseInt(\"001\",8),E=A|p,I=r&h||r&p&&a===u||r&A&&o===n||r&E&&n===0;return I}});var wY=_((dSt,CY)=>{var gSt=ve(\"fs\"),yD;process.platform===\"win32\"||global.TESTING_WINDOWS?yD=hY():yD=EY();CY.exports=OR;OR.sync=__e;function OR(t,e,r){if(typeof e==\"function\"&&(r=e,e={}),!r){if(typeof Promise!=\"function\")throw new TypeError(\"callback not provided\");return new Promise(function(o,a){OR(t,e||{},function(n,u){n?a(n):o(u)})})}yD(t,e||{},function(o,a){o&&(o.code===\"EACCES\"||e&&e.ignoreErrors)&&(o=null,a=!1),r(o,a)})}function __e(t,e){try{return yD.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code===\"EACCES\")return!1;throw r}}});var SY=_((mSt,bY)=>{var Kd=process.platform===\"win32\"||process.env.OSTYPE===\"cygwin\"||process.env.OSTYPE===\"msys\",IY=ve(\"path\"),H_e=Kd?\";\":\":\",BY=wY(),vY=t=>Object.assign(new Error(`not found: ${t}`),{code:\"ENOENT\"}),DY=(t,e)=>{let r=e.colon||H_e,o=t.match(/\\//)||Kd&&t.match(/\\\\/)?[\"\"]:[...Kd?[process.cwd()]:[],...(e.path||process.env.PATH||\"\").split(r)],a=Kd?e.pathExt||process.env.PATHEXT||\".EXE;.CMD;.BAT;.COM\":\"\",n=Kd?a.split(r):[\"\"];return Kd&&t.indexOf(\".\")!==-1&&n[0]!==\"\"&&n.unshift(\"\"),{pathEnv:o,pathExt:n,pathExtExe:a}},PY=(t,e,r)=>{typeof e==\"function\"&&(r=e,e={}),e||(e={});let{pathEnv:o,pathExt:a,pathExtExe:n}=DY(t,e),u=[],A=h=>new Promise((E,I)=>{if(h===o.length)return e.all&&u.length?E(u):I(vY(t));let v=o[h],x=/^\".*\"$/.test(v)?v.slice(1,-1):v,C=IY.join(x,t),R=!x&&/^\\.[\\\\\\/]/.test(t)?t.slice(0,2)+C:C;E(p(R,h,0))}),p=(h,E,I)=>new Promise((v,x)=>{if(I===a.length)return v(A(E+1));let C=a[I];BY(h+C,{pathExt:n},(R,L)=>{if(!R&&L)if(e.all)u.push(h+C);else return v(h+C);return v(p(h,E,I+1))})});return r?A(0).then(h=>r(null,h),r):A(0)},q_e=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:o,pathExtExe:a}=DY(t,e),n=[];for(let u=0;u<r.length;u++){let A=r[u],p=/^\".*\"$/.test(A)?A.slice(1,-1):A,h=IY.join(p,t),E=!p&&/^\\.[\\\\\\/]/.test(t)?t.slice(0,2)+h:h;for(let I=0;I<o.length;I++){let v=E+o[I];try{if(BY.sync(v,{pathExt:a}))if(e.all)n.push(v);else return v}catch{}}}if(e.all&&n.length)return n;if(e.nothrow)return null;throw vY(t)};bY.exports=PY;PY.sync=q_e});var kY=_((ySt,UR)=>{\"use strict\";var xY=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!==\"win32\"?\"PATH\":Object.keys(e).reverse().find(o=>o.toUpperCase()===\"PATH\")||\"Path\"};UR.exports=xY;UR.exports.default=xY});var TY=_((ESt,RY)=>{\"use strict\";var QY=ve(\"path\"),j_e=SY(),G_e=kY();function FY(t,e){let r=t.options.env||process.env,o=process.cwd(),a=t.options.cwd!=null,n=a&&process.chdir!==void 0&&!process.chdir.disabled;if(n)try{process.chdir(t.options.cwd)}catch{}let u;try{u=j_e.sync(t.command,{path:r[G_e({env:r})],pathExt:e?QY.delimiter:void 0})}catch{}finally{n&&process.chdir(o)}return u&&(u=QY.resolve(a?t.options.cwd:\"\",u)),u}function Y_e(t){return FY(t)||FY(t,!0)}RY.exports=Y_e});var NY=_((CSt,HR)=>{\"use strict\";var _R=/([()\\][%!^\"`<>&|;, *?])/g;function W_e(t){return t=t.replace(_R,\"^$1\"),t}function K_e(t,e){return t=`${t}`,t=t.replace(/(\\\\*)\"/g,'$1$1\\\\\"'),t=t.replace(/(\\\\*)$/,\"$1$1\"),t=`\"${t}\"`,t=t.replace(_R,\"^$1\"),e&&(t=t.replace(_R,\"^$1\")),t}HR.exports.command=W_e;HR.exports.argument=K_e});var MY=_((wSt,LY)=>{\"use strict\";LY.exports=/^#!(.*)/});var UY=_((ISt,OY)=>{\"use strict\";var V_e=MY();OY.exports=(t=\"\")=>{let e=t.match(V_e);if(!e)return null;let[r,o]=e[0].replace(/#! ?/,\"\").split(\" \"),a=r.split(\"/\").pop();return a===\"env\"?o:o?`${a} ${o}`:a}});var HY=_((BSt,_Y)=>{\"use strict\";var qR=ve(\"fs\"),z_e=UY();function J_e(t){let r=Buffer.alloc(150),o;try{o=qR.openSync(t,\"r\"),qR.readSync(o,r,0,150,0),qR.closeSync(o)}catch{}return z_e(r.toString())}_Y.exports=J_e});var YY=_((vSt,GY)=>{\"use strict\";var X_e=ve(\"path\"),qY=TY(),jY=NY(),Z_e=HY(),$_e=process.platform===\"win32\",e8e=/\\.(?:com|exe)$/i,t8e=/node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/i;function r8e(t){t.file=qY(t);let e=t.file&&Z_e(t.file);return e?(t.args.unshift(t.file),t.command=e,qY(t)):t.file}function n8e(t){if(!$_e)return t;let e=r8e(t),r=!e8e.test(e);if(t.options.forceShell||r){let o=t8e.test(e);t.command=X_e.normalize(t.command),t.command=jY.command(t.command),t.args=t.args.map(n=>jY.argument(n,o));let a=[t.command].concat(t.args).join(\" \");t.args=[\"/d\",\"/s\",\"/c\",`\"${a}\"`],t.command=process.env.comspec||\"cmd.exe\",t.options.windowsVerbatimArguments=!0}return t}function i8e(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let o={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?o:n8e(o)}GY.exports=i8e});var VY=_((DSt,KY)=>{\"use strict\";var jR=process.platform===\"win32\";function GR(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:\"ENOENT\",errno:\"ENOENT\",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function s8e(t,e){if(!jR)return;let r=t.emit;t.emit=function(o,a){if(o===\"exit\"){let n=WY(a,e,\"spawn\");if(n)return r.call(t,\"error\",n)}return r.apply(t,arguments)}}function WY(t,e){return jR&&t===1&&!e.file?GR(e.original,\"spawn\"):null}function o8e(t,e){return jR&&t===1&&!e.file?GR(e.original,\"spawnSync\"):null}KY.exports={hookChildProcess:s8e,verifyENOENT:WY,verifyENOENTSync:o8e,notFoundError:GR}});var KR=_((PSt,Vd)=>{\"use strict\";var zY=ve(\"child_process\"),YR=YY(),WR=VY();function JY(t,e,r){let o=YR(t,e,r),a=zY.spawn(o.command,o.args,o.options);return WR.hookChildProcess(a,o),a}function a8e(t,e,r){let o=YR(t,e,r),a=zY.spawnSync(o.command,o.args,o.options);return a.error=a.error||WR.verifyENOENTSync(a.status,o),a}Vd.exports=JY;Vd.exports.spawn=JY;Vd.exports.sync=a8e;Vd.exports._parse=YR;Vd.exports._enoent=WR});var ZY=_((bSt,XY)=>{\"use strict\";function l8e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function _0(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,_0)}l8e(_0,Error);_0.buildMessage=function(t,e){var r={literal:function(h){return'\"'+a(h.text)+'\"'},class:function(h){var E=\"\",I;for(I=0;I<h.parts.length;I++)E+=h.parts[I]instanceof Array?n(h.parts[I][0])+\"-\"+n(h.parts[I][1]):n(h.parts[I]);return\"[\"+(h.inverted?\"^\":\"\")+E+\"]\"},any:function(h){return\"any character\"},end:function(h){return\"end of input\"},other:function(h){return h.description}};function o(h){return h.charCodeAt(0).toString(16).toUpperCase()}function a(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+o(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+o(E)})}function n(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+o(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+o(E)})}function u(h){return r[h.type](h)}function A(h){var E=new Array(h.length),I,v;for(I=0;I<h.length;I++)E[I]=u(h[I]);if(E.sort(),E.length>0){for(I=1,v=1;I<E.length;I++)E[I-1]!==E[I]&&(E[v]=E[I],v++);E.length=v}switch(E.length){case 1:return E[0];case 2:return E[0]+\" or \"+E[1];default:return E.slice(0,-1).join(\", \")+\", or \"+E[E.length-1]}}function p(h){return h?'\"'+a(h)+'\"':\"end of input\"}return\"Expected \"+A(t)+\" but \"+p(e)+\" found.\"};function c8e(t,e){e=e!==void 0?e:{};var r={},o={Start:u0},a=u0,n=function(N){return N||[]},u=function(N,K,re){return[{command:N,type:K}].concat(re||[])},A=function(N,K){return[{command:N,type:K||\";\"}]},p=function(N){return N},h=\";\",E=Br(\";\",!1),I=\"&\",v=Br(\"&\",!1),x=function(N,K){return K?{chain:N,then:K}:{chain:N}},C=function(N,K){return{type:N,line:K}},R=\"&&\",L=Br(\"&&\",!1),U=\"||\",z=Br(\"||\",!1),te=function(N,K){return K?{...N,then:K}:N},ae=function(N,K){return{type:N,chain:K}},le=\"|&\",ce=Br(\"|&\",!1),Ce=\"|\",de=Br(\"|\",!1),Be=\"=\",Ee=Br(\"=\",!1),g=function(N,K){return{name:N,args:[K]}},me=function(N){return{name:N,args:[]}},we=\"(\",Ae=Br(\"(\",!1),ne=\")\",Z=Br(\")\",!1),xe=function(N,K){return{type:\"subshell\",subshell:N,args:K}},Ne=\"{\",ht=Br(\"{\",!1),H=\"}\",rt=Br(\"}\",!1),Te=function(N,K){return{type:\"group\",group:N,args:K}},Fe=function(N,K){return{type:\"command\",args:K,envs:N}},ke=function(N){return{type:\"envs\",envs:N}},Ye=function(N){return N},be=function(N){return N},et=/^[0-9]/,Ue=Is([[\"0\",\"9\"]],!1,!1),S=function(N,K,re){return{type:\"redirection\",subtype:K,fd:N!==null?parseInt(N):null,args:[re]}},w=\">>\",b=Br(\">>\",!1),y=\">&\",F=Br(\">&\",!1),J=\">\",X=Br(\">\",!1),$=\"<<<\",ie=Br(\"<<<\",!1),Se=\"<&\",Re=Br(\"<&\",!1),at=\"<\",dt=Br(\"<\",!1),jt=function(N){return{type:\"argument\",segments:[].concat(...N)}},tr=function(N){return N},bt=\"$'\",ln=Br(\"$'\",!1),kr=\"'\",mr=Br(\"'\",!1),Sr=function(N){return[{type:\"text\",text:N}]},Kr='\"\"',Kn=Br('\"\"',!1),Ms=function(){return{type:\"text\",text:\"\"}},Ri='\"',gs=Br('\"',!1),io=function(N){return N},Pi=function(N){return{type:\"arithmetic\",arithmetic:N,quoted:!0}},Os=function(N){return{type:\"shell\",shell:N,quoted:!0}},so=function(N){return{type:\"variable\",...N,quoted:!0}},uc=function(N){return{type:\"text\",text:N}},Au=function(N){return{type:\"arithmetic\",arithmetic:N,quoted:!1}},op=function(N){return{type:\"shell\",shell:N,quoted:!1}},ap=function(N){return{type:\"variable\",...N,quoted:!1}},Us=function(N){return{type:\"glob\",pattern:N}},Dn=/^[^']/,oo=Is([\"'\"],!0,!1),_s=function(N){return N.join(\"\")},ml=/^[^$\"]/,yl=Is([\"$\",'\"'],!0,!1),ao=`\\\\\n`,Vn=Br(`\\\\\n`,!1),Mn=function(){return\"\"},Ti=\"\\\\\",On=Br(\"\\\\\",!1),_i=/^[\\\\$\"`]/,ir=Is([\"\\\\\",\"$\",'\"',\"`\"],!1,!1),Me=function(N){return N},ii=\"\\\\a\",Ha=Br(\"\\\\a\",!1),hr=function(){return\"a\"},Ac=\"\\\\b\",fu=Br(\"\\\\b\",!1),fc=function(){return\"\\b\"},El=/^[Ee]/,vA=Is([\"E\",\"e\"],!1,!1),pu=function(){return\"\\x1B\"},Ie=\"\\\\f\",Tt=Br(\"\\\\f\",!1),pc=function(){return\"\\f\"},Hi=\"\\\\n\",hu=Br(\"\\\\n\",!1),Yt=function(){return`\n`},Cl=\"\\\\r\",DA=Br(\"\\\\r\",!1),lp=function(){return\"\\r\"},hc=\"\\\\t\",PA=Br(\"\\\\t\",!1),Qn=function(){return\"\t\"},hi=\"\\\\v\",gc=Br(\"\\\\v\",!1),bA=function(){return\"\\v\"},aa=/^[\\\\'\"?]/,Ni=Is([\"\\\\\",\"'\",'\"',\"?\"],!1,!1),_o=function(N){return String.fromCharCode(parseInt(N,16))},Xe=\"\\\\x\",lo=Br(\"\\\\x\",!1),dc=\"\\\\u\",gu=Br(\"\\\\u\",!1),qi=\"\\\\U\",du=Br(\"\\\\U\",!1),SA=function(N){return String.fromCodePoint(parseInt(N,16))},qa=/^[0-7]/,mc=Is([[\"0\",\"7\"]],!1,!1),ds=/^[0-9a-fA-f]/,Ht=Is([[\"0\",\"9\"],[\"a\",\"f\"],[\"A\",\"f\"]],!1,!1),Fn=o0(),Ei=\"{}\",la=Br(\"{}\",!1),co=function(){return\"{}\"},Hs=\"-\",ca=Br(\"-\",!1),ua=\"+\",Ho=Br(\"+\",!1),Ci=\".\",ms=Br(\".\",!1),ys=function(N,K,re){return{type:\"number\",value:(N===\"-\"?-1:1)*parseFloat(K.join(\"\")+\".\"+re.join(\"\"))}},Es=function(N,K){return{type:\"number\",value:(N===\"-\"?-1:1)*parseInt(K.join(\"\"))}},qs=function(N){return{type:\"variable\",...N}},Un=function(N){return{type:\"variable\",name:N}},Pn=function(N){return N},Cs=\"*\",We=Br(\"*\",!1),tt=\"/\",Bt=Br(\"/\",!1),or=function(N,K,re){return{type:K===\"*\"?\"multiplication\":\"division\",right:re}},ee=function(N,K){return K.reduce((re,he)=>({left:re,...he}),N)},ye=function(N,K,re){return{type:K===\"+\"?\"addition\":\"subtraction\",right:re}},Le=\"$((\",ft=Br(\"$((\",!1),pt=\"))\",Nt=Br(\"))\",!1),rr=function(N){return N},$r=\"$(\",ji=Br(\"$(\",!1),rs=function(N){return N},bi=\"${\",qo=Br(\"${\",!1),xA=\":-\",kA=Br(\":-\",!1),cp=function(N,K){return{name:N,defaultValue:K}},e0=\":-}\",mu=Br(\":-}\",!1),t0=function(N){return{name:N,defaultValue:[]}},yu=\":+\",uo=Br(\":+\",!1),QA=function(N,K){return{name:N,alternativeValue:K}},yc=\":+}\",Aa=Br(\":+}\",!1),r0=function(N){return{name:N,alternativeValue:[]}},Ec=function(N){return{name:N}},hd=\"$\",n0=Br(\"$\",!1),$n=function(N){return e.isGlobPattern(N)},up=function(N){return N},i0=/^[a-zA-Z0-9_]/,FA=Is([[\"a\",\"z\"],[\"A\",\"Z\"],[\"0\",\"9\"],\"_\"],!1,!1),js=function(){return s0()},Eu=/^[$@*?#a-zA-Z0-9_\\-]/,ja=Is([\"$\",\"@\",\"*\",\"?\",\"#\",[\"a\",\"z\"],[\"A\",\"Z\"],[\"0\",\"9\"],\"_\",\"-\"],!1,!1),Gi=/^[()}<>$|&; \\t\"']/,fa=Is([\"(\",\")\",\"}\",\"<\",\">\",\"$\",\"|\",\"&\",\";\",\" \",\"\t\",'\"',\"'\"],!1,!1),Cu=/^[<>&; \\t\"']/,ws=Is([\"<\",\">\",\"&\",\";\",\" \",\"\t\",'\"',\"'\"],!1,!1),Cc=/^[ \\t]/,wc=Is([\" \",\"\t\"],!1,!1),Y=0,Dt=0,wl=[{line:1,column:1}],Si=0,Ic=[],ct=0,wu;if(\"startRule\"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');a=o[e.startRule]}function s0(){return t.substring(Dt,Y)}function tw(){return Bc(Dt,Y)}function RA(N,K){throw K=K!==void 0?K:Bc(Dt,Y),c0([l0(N)],t.substring(Dt,Y),K)}function Ap(N,K){throw K=K!==void 0?K:Bc(Dt,Y),gd(N,K)}function Br(N,K){return{type:\"literal\",text:N,ignoreCase:K}}function Is(N,K,re){return{type:\"class\",parts:N,inverted:K,ignoreCase:re}}function o0(){return{type:\"any\"}}function a0(){return{type:\"end\"}}function l0(N){return{type:\"other\",description:N}}function fp(N){var K=wl[N],re;if(K)return K;for(re=N-1;!wl[re];)re--;for(K=wl[re],K={line:K.line,column:K.column};re<N;)t.charCodeAt(re)===10?(K.line++,K.column=1):K.column++,re++;return wl[N]=K,K}function Bc(N,K){var re=fp(N),he=fp(K);return{start:{offset:N,line:re.line,column:re.column},end:{offset:K,line:he.line,column:he.column}}}function Ct(N){Y<Si||(Y>Si&&(Si=Y,Ic=[]),Ic.push(N))}function gd(N,K){return new _0(N,null,null,K)}function c0(N,K,re){return new _0(_0.buildMessage(N,K),N,K,re)}function u0(){var N,K,re;for(N=Y,K=[],re=Qt();re!==r;)K.push(re),re=Qt();return K!==r?(re=Iu(),re===r&&(re=null),re!==r?(Dt=N,K=n(re),N=K):(Y=N,N=r)):(Y=N,N=r),N}function Iu(){var N,K,re,he,ze;if(N=Y,K=Bu(),K!==r){for(re=[],he=Qt();he!==r;)re.push(he),he=Qt();re!==r?(he=A0(),he!==r?(ze=dd(),ze===r&&(ze=null),ze!==r?(Dt=N,K=u(K,he,ze),N=K):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r)}else Y=N,N=r;if(N===r)if(N=Y,K=Bu(),K!==r){for(re=[],he=Qt();he!==r;)re.push(he),he=Qt();re!==r?(he=A0(),he===r&&(he=null),he!==r?(Dt=N,K=A(K,he),N=K):(Y=N,N=r)):(Y=N,N=r)}else Y=N,N=r;return N}function dd(){var N,K,re,he,ze;for(N=Y,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r)if(re=Iu(),re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();he!==r?(Dt=N,K=p(re),N=K):(Y=N,N=r)}else Y=N,N=r;else Y=N,N=r;return N}function A0(){var N;return t.charCodeAt(Y)===59?(N=h,Y++):(N=r,ct===0&&Ct(E)),N===r&&(t.charCodeAt(Y)===38?(N=I,Y++):(N=r,ct===0&&Ct(v))),N}function Bu(){var N,K,re;return N=Y,K=pa(),K!==r?(re=rw(),re===r&&(re=null),re!==r?(Dt=N,K=x(K,re),N=K):(Y=N,N=r)):(Y=N,N=r),N}function rw(){var N,K,re,he,ze,mt,fr;for(N=Y,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r)if(re=md(),re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();if(he!==r)if(ze=Bu(),ze!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();mt!==r?(Dt=N,K=C(re,ze),N=K):(Y=N,N=r)}else Y=N,N=r;else Y=N,N=r}else Y=N,N=r;else Y=N,N=r;return N}function md(){var N;return t.substr(Y,2)===R?(N=R,Y+=2):(N=r,ct===0&&Ct(L)),N===r&&(t.substr(Y,2)===U?(N=U,Y+=2):(N=r,ct===0&&Ct(z))),N}function pa(){var N,K,re;return N=Y,K=f0(),K!==r?(re=vc(),re===r&&(re=null),re!==r?(Dt=N,K=te(K,re),N=K):(Y=N,N=r)):(Y=N,N=r),N}function vc(){var N,K,re,he,ze,mt,fr;for(N=Y,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r)if(re=Il(),re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();if(he!==r)if(ze=pa(),ze!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();mt!==r?(Dt=N,K=ae(re,ze),N=K):(Y=N,N=r)}else Y=N,N=r;else Y=N,N=r}else Y=N,N=r;else Y=N,N=r;return N}function Il(){var N;return t.substr(Y,2)===le?(N=le,Y+=2):(N=r,ct===0&&Ct(ce)),N===r&&(t.charCodeAt(Y)===124?(N=Ce,Y++):(N=r,ct===0&&Ct(de))),N}function vu(){var N,K,re,he,ze,mt;if(N=Y,K=d0(),K!==r)if(t.charCodeAt(Y)===61?(re=Be,Y++):(re=r,ct===0&&Ct(Ee)),re!==r)if(he=jo(),he!==r){for(ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();ze!==r?(Dt=N,K=g(K,he),N=K):(Y=N,N=r)}else Y=N,N=r;else Y=N,N=r;else Y=N,N=r;if(N===r)if(N=Y,K=d0(),K!==r)if(t.charCodeAt(Y)===61?(re=Be,Y++):(re=r,ct===0&&Ct(Ee)),re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();he!==r?(Dt=N,K=me(K),N=K):(Y=N,N=r)}else Y=N,N=r;else Y=N,N=r;return N}function f0(){var N,K,re,he,ze,mt,fr,Cr,yn,oi,Li;for(N=Y,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r)if(t.charCodeAt(Y)===40?(re=we,Y++):(re=r,ct===0&&Ct(Ae)),re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();if(he!==r)if(ze=Iu(),ze!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();if(mt!==r)if(t.charCodeAt(Y)===41?(fr=ne,Y++):(fr=r,ct===0&&Ct(Z)),fr!==r){for(Cr=[],yn=Qt();yn!==r;)Cr.push(yn),yn=Qt();if(Cr!==r){for(yn=[],oi=Ga();oi!==r;)yn.push(oi),oi=Ga();if(yn!==r){for(oi=[],Li=Qt();Li!==r;)oi.push(Li),Li=Qt();oi!==r?(Dt=N,K=xe(ze,yn),N=K):(Y=N,N=r)}else Y=N,N=r}else Y=N,N=r}else Y=N,N=r;else Y=N,N=r}else Y=N,N=r;else Y=N,N=r}else Y=N,N=r;else Y=N,N=r;if(N===r){for(N=Y,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r)if(t.charCodeAt(Y)===123?(re=Ne,Y++):(re=r,ct===0&&Ct(ht)),re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();if(he!==r)if(ze=Iu(),ze!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();if(mt!==r)if(t.charCodeAt(Y)===125?(fr=H,Y++):(fr=r,ct===0&&Ct(rt)),fr!==r){for(Cr=[],yn=Qt();yn!==r;)Cr.push(yn),yn=Qt();if(Cr!==r){for(yn=[],oi=Ga();oi!==r;)yn.push(oi),oi=Ga();if(yn!==r){for(oi=[],Li=Qt();Li!==r;)oi.push(Li),Li=Qt();oi!==r?(Dt=N,K=Te(ze,yn),N=K):(Y=N,N=r)}else Y=N,N=r}else Y=N,N=r}else Y=N,N=r;else Y=N,N=r}else Y=N,N=r;else Y=N,N=r}else Y=N,N=r;else Y=N,N=r;if(N===r){for(N=Y,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r){for(re=[],he=vu();he!==r;)re.push(he),he=vu();if(re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();if(he!==r){if(ze=[],mt=pp(),mt!==r)for(;mt!==r;)ze.push(mt),mt=pp();else ze=r;if(ze!==r){for(mt=[],fr=Qt();fr!==r;)mt.push(fr),fr=Qt();mt!==r?(Dt=N,K=Fe(re,ze),N=K):(Y=N,N=r)}else Y=N,N=r}else Y=N,N=r}else Y=N,N=r}else Y=N,N=r;if(N===r){for(N=Y,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r){if(re=[],he=vu(),he!==r)for(;he!==r;)re.push(he),he=vu();else re=r;if(re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();he!==r?(Dt=N,K=ke(re),N=K):(Y=N,N=r)}else Y=N,N=r}else Y=N,N=r}}}return N}function TA(){var N,K,re,he,ze;for(N=Y,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r){if(re=[],he=hp(),he!==r)for(;he!==r;)re.push(he),he=hp();else re=r;if(re!==r){for(he=[],ze=Qt();ze!==r;)he.push(ze),ze=Qt();he!==r?(Dt=N,K=Ye(re),N=K):(Y=N,N=r)}else Y=N,N=r}else Y=N,N=r;return N}function pp(){var N,K,re;for(N=Y,K=[],re=Qt();re!==r;)K.push(re),re=Qt();if(K!==r?(re=Ga(),re!==r?(Dt=N,K=be(re),N=K):(Y=N,N=r)):(Y=N,N=r),N===r){for(N=Y,K=[],re=Qt();re!==r;)K.push(re),re=Qt();K!==r?(re=hp(),re!==r?(Dt=N,K=be(re),N=K):(Y=N,N=r)):(Y=N,N=r)}return N}function Ga(){var N,K,re,he,ze;for(N=Y,K=[],re=Qt();re!==r;)K.push(re),re=Qt();return K!==r?(et.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(Ue)),re===r&&(re=null),re!==r?(he=p0(),he!==r?(ze=hp(),ze!==r?(Dt=N,K=S(re,he,ze),N=K):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r),N}function p0(){var N;return t.substr(Y,2)===w?(N=w,Y+=2):(N=r,ct===0&&Ct(b)),N===r&&(t.substr(Y,2)===y?(N=y,Y+=2):(N=r,ct===0&&Ct(F)),N===r&&(t.charCodeAt(Y)===62?(N=J,Y++):(N=r,ct===0&&Ct(X)),N===r&&(t.substr(Y,3)===$?(N=$,Y+=3):(N=r,ct===0&&Ct(ie)),N===r&&(t.substr(Y,2)===Se?(N=Se,Y+=2):(N=r,ct===0&&Ct(Re)),N===r&&(t.charCodeAt(Y)===60?(N=at,Y++):(N=r,ct===0&&Ct(dt))))))),N}function hp(){var N,K,re;for(N=Y,K=[],re=Qt();re!==r;)K.push(re),re=Qt();return K!==r?(re=jo(),re!==r?(Dt=N,K=be(re),N=K):(Y=N,N=r)):(Y=N,N=r),N}function jo(){var N,K,re;if(N=Y,K=[],re=Bs(),re!==r)for(;re!==r;)K.push(re),re=Bs();else K=r;return K!==r&&(Dt=N,K=jt(K)),N=K,N}function Bs(){var N,K;return N=Y,K=wi(),K!==r&&(Dt=N,K=tr(K)),N=K,N===r&&(N=Y,K=yd(),K!==r&&(Dt=N,K=tr(K)),N=K,N===r&&(N=Y,K=Ed(),K!==r&&(Dt=N,K=tr(K)),N=K,N===r&&(N=Y,K=Go(),K!==r&&(Dt=N,K=tr(K)),N=K))),N}function wi(){var N,K,re,he;return N=Y,t.substr(Y,2)===bt?(K=bt,Y+=2):(K=r,ct===0&&Ct(ln)),K!==r?(re=cn(),re!==r?(t.charCodeAt(Y)===39?(he=kr,Y++):(he=r,ct===0&&Ct(mr)),he!==r?(Dt=N,K=Sr(re),N=K):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r),N}function yd(){var N,K,re,he;return N=Y,t.charCodeAt(Y)===39?(K=kr,Y++):(K=r,ct===0&&Ct(mr)),K!==r?(re=dp(),re!==r?(t.charCodeAt(Y)===39?(he=kr,Y++):(he=r,ct===0&&Ct(mr)),he!==r?(Dt=N,K=Sr(re),N=K):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r),N}function Ed(){var N,K,re,he;if(N=Y,t.substr(Y,2)===Kr?(K=Kr,Y+=2):(K=r,ct===0&&Ct(Kn)),K!==r&&(Dt=N,K=Ms()),N=K,N===r)if(N=Y,t.charCodeAt(Y)===34?(K=Ri,Y++):(K=r,ct===0&&Ct(gs)),K!==r){for(re=[],he=NA();he!==r;)re.push(he),he=NA();re!==r?(t.charCodeAt(Y)===34?(he=Ri,Y++):(he=r,ct===0&&Ct(gs)),he!==r?(Dt=N,K=io(re),N=K):(Y=N,N=r)):(Y=N,N=r)}else Y=N,N=r;return N}function Go(){var N,K,re;if(N=Y,K=[],re=gp(),re!==r)for(;re!==r;)K.push(re),re=gp();else K=r;return K!==r&&(Dt=N,K=io(K)),N=K,N}function NA(){var N,K;return N=Y,K=Yr(),K!==r&&(Dt=N,K=Pi(K)),N=K,N===r&&(N=Y,K=mp(),K!==r&&(Dt=N,K=Os(K)),N=K,N===r&&(N=Y,K=Pc(),K!==r&&(Dt=N,K=so(K)),N=K,N===r&&(N=Y,K=h0(),K!==r&&(Dt=N,K=uc(K)),N=K))),N}function gp(){var N,K;return N=Y,K=Yr(),K!==r&&(Dt=N,K=Au(K)),N=K,N===r&&(N=Y,K=mp(),K!==r&&(Dt=N,K=op(K)),N=K,N===r&&(N=Y,K=Pc(),K!==r&&(Dt=N,K=ap(K)),N=K,N===r&&(N=Y,K=nw(),K!==r&&(Dt=N,K=Us(K)),N=K,N===r&&(N=Y,K=ga(),K!==r&&(Dt=N,K=uc(K)),N=K)))),N}function dp(){var N,K,re;for(N=Y,K=[],Dn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(oo));re!==r;)K.push(re),Dn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(oo));return K!==r&&(Dt=N,K=_s(K)),N=K,N}function h0(){var N,K,re;if(N=Y,K=[],re=ha(),re===r&&(ml.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(yl))),re!==r)for(;re!==r;)K.push(re),re=ha(),re===r&&(ml.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(yl)));else K=r;return K!==r&&(Dt=N,K=_s(K)),N=K,N}function ha(){var N,K,re;return N=Y,t.substr(Y,2)===ao?(K=ao,Y+=2):(K=r,ct===0&&Ct(Vn)),K!==r&&(Dt=N,K=Mn()),N=K,N===r&&(N=Y,t.charCodeAt(Y)===92?(K=Ti,Y++):(K=r,ct===0&&Ct(On)),K!==r?(_i.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(ir)),re!==r?(Dt=N,K=Me(re),N=K):(Y=N,N=r)):(Y=N,N=r)),N}function cn(){var N,K,re;for(N=Y,K=[],re=Ao(),re===r&&(Dn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(oo)));re!==r;)K.push(re),re=Ao(),re===r&&(Dn.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(oo)));return K!==r&&(Dt=N,K=_s(K)),N=K,N}function Ao(){var N,K,re;return N=Y,t.substr(Y,2)===ii?(K=ii,Y+=2):(K=r,ct===0&&Ct(Ha)),K!==r&&(Dt=N,K=hr()),N=K,N===r&&(N=Y,t.substr(Y,2)===Ac?(K=Ac,Y+=2):(K=r,ct===0&&Ct(fu)),K!==r&&(Dt=N,K=fc()),N=K,N===r&&(N=Y,t.charCodeAt(Y)===92?(K=Ti,Y++):(K=r,ct===0&&Ct(On)),K!==r?(El.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(vA)),re!==r?(Dt=N,K=pu(),N=K):(Y=N,N=r)):(Y=N,N=r),N===r&&(N=Y,t.substr(Y,2)===Ie?(K=Ie,Y+=2):(K=r,ct===0&&Ct(Tt)),K!==r&&(Dt=N,K=pc()),N=K,N===r&&(N=Y,t.substr(Y,2)===Hi?(K=Hi,Y+=2):(K=r,ct===0&&Ct(hu)),K!==r&&(Dt=N,K=Yt()),N=K,N===r&&(N=Y,t.substr(Y,2)===Cl?(K=Cl,Y+=2):(K=r,ct===0&&Ct(DA)),K!==r&&(Dt=N,K=lp()),N=K,N===r&&(N=Y,t.substr(Y,2)===hc?(K=hc,Y+=2):(K=r,ct===0&&Ct(PA)),K!==r&&(Dt=N,K=Qn()),N=K,N===r&&(N=Y,t.substr(Y,2)===hi?(K=hi,Y+=2):(K=r,ct===0&&Ct(gc)),K!==r&&(Dt=N,K=bA()),N=K,N===r&&(N=Y,t.charCodeAt(Y)===92?(K=Ti,Y++):(K=r,ct===0&&Ct(On)),K!==r?(aa.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(Ni)),re!==r?(Dt=N,K=Me(re),N=K):(Y=N,N=r)):(Y=N,N=r),N===r&&(N=LA()))))))))),N}function LA(){var N,K,re,he,ze,mt,fr,Cr,yn,oi,Li,y0;return N=Y,t.charCodeAt(Y)===92?(K=Ti,Y++):(K=r,ct===0&&Ct(On)),K!==r?(re=Ya(),re!==r?(Dt=N,K=_o(re),N=K):(Y=N,N=r)):(Y=N,N=r),N===r&&(N=Y,t.substr(Y,2)===Xe?(K=Xe,Y+=2):(K=r,ct===0&&Ct(lo)),K!==r?(re=Y,he=Y,ze=Ya(),ze!==r?(mt=si(),mt!==r?(ze=[ze,mt],he=ze):(Y=he,he=r)):(Y=he,he=r),he===r&&(he=Ya()),he!==r?re=t.substring(re,Y):re=he,re!==r?(Dt=N,K=_o(re),N=K):(Y=N,N=r)):(Y=N,N=r),N===r&&(N=Y,t.substr(Y,2)===dc?(K=dc,Y+=2):(K=r,ct===0&&Ct(gu)),K!==r?(re=Y,he=Y,ze=si(),ze!==r?(mt=si(),mt!==r?(fr=si(),fr!==r?(Cr=si(),Cr!==r?(ze=[ze,mt,fr,Cr],he=ze):(Y=he,he=r)):(Y=he,he=r)):(Y=he,he=r)):(Y=he,he=r),he!==r?re=t.substring(re,Y):re=he,re!==r?(Dt=N,K=_o(re),N=K):(Y=N,N=r)):(Y=N,N=r),N===r&&(N=Y,t.substr(Y,2)===qi?(K=qi,Y+=2):(K=r,ct===0&&Ct(du)),K!==r?(re=Y,he=Y,ze=si(),ze!==r?(mt=si(),mt!==r?(fr=si(),fr!==r?(Cr=si(),Cr!==r?(yn=si(),yn!==r?(oi=si(),oi!==r?(Li=si(),Li!==r?(y0=si(),y0!==r?(ze=[ze,mt,fr,Cr,yn,oi,Li,y0],he=ze):(Y=he,he=r)):(Y=he,he=r)):(Y=he,he=r)):(Y=he,he=r)):(Y=he,he=r)):(Y=he,he=r)):(Y=he,he=r)):(Y=he,he=r),he!==r?re=t.substring(re,Y):re=he,re!==r?(Dt=N,K=SA(re),N=K):(Y=N,N=r)):(Y=N,N=r)))),N}function Ya(){var N;return qa.test(t.charAt(Y))?(N=t.charAt(Y),Y++):(N=r,ct===0&&Ct(mc)),N}function si(){var N;return ds.test(t.charAt(Y))?(N=t.charAt(Y),Y++):(N=r,ct===0&&Ct(Ht)),N}function ga(){var N,K,re,he,ze;if(N=Y,K=[],re=Y,t.charCodeAt(Y)===92?(he=Ti,Y++):(he=r,ct===0&&Ct(On)),he!==r?(t.length>Y?(ze=t.charAt(Y),Y++):(ze=r,ct===0&&Ct(Fn)),ze!==r?(Dt=re,he=Me(ze),re=he):(Y=re,re=r)):(Y=re,re=r),re===r&&(re=Y,t.substr(Y,2)===Ei?(he=Ei,Y+=2):(he=r,ct===0&&Ct(la)),he!==r&&(Dt=re,he=co()),re=he,re===r&&(re=Y,he=Y,ct++,ze=Cd(),ct--,ze===r?he=void 0:(Y=he,he=r),he!==r?(t.length>Y?(ze=t.charAt(Y),Y++):(ze=r,ct===0&&Ct(Fn)),ze!==r?(Dt=re,he=Me(ze),re=he):(Y=re,re=r)):(Y=re,re=r))),re!==r)for(;re!==r;)K.push(re),re=Y,t.charCodeAt(Y)===92?(he=Ti,Y++):(he=r,ct===0&&Ct(On)),he!==r?(t.length>Y?(ze=t.charAt(Y),Y++):(ze=r,ct===0&&Ct(Fn)),ze!==r?(Dt=re,he=Me(ze),re=he):(Y=re,re=r)):(Y=re,re=r),re===r&&(re=Y,t.substr(Y,2)===Ei?(he=Ei,Y+=2):(he=r,ct===0&&Ct(la)),he!==r&&(Dt=re,he=co()),re=he,re===r&&(re=Y,he=Y,ct++,ze=Cd(),ct--,ze===r?he=void 0:(Y=he,he=r),he!==r?(t.length>Y?(ze=t.charAt(Y),Y++):(ze=r,ct===0&&Ct(Fn)),ze!==r?(Dt=re,he=Me(ze),re=he):(Y=re,re=r)):(Y=re,re=r)));else K=r;return K!==r&&(Dt=N,K=_s(K)),N=K,N}function Dc(){var N,K,re,he,ze,mt;if(N=Y,t.charCodeAt(Y)===45?(K=Hs,Y++):(K=r,ct===0&&Ct(ca)),K===r&&(t.charCodeAt(Y)===43?(K=ua,Y++):(K=r,ct===0&&Ct(Ho))),K===r&&(K=null),K!==r){if(re=[],et.test(t.charAt(Y))?(he=t.charAt(Y),Y++):(he=r,ct===0&&Ct(Ue)),he!==r)for(;he!==r;)re.push(he),et.test(t.charAt(Y))?(he=t.charAt(Y),Y++):(he=r,ct===0&&Ct(Ue));else re=r;if(re!==r)if(t.charCodeAt(Y)===46?(he=Ci,Y++):(he=r,ct===0&&Ct(ms)),he!==r){if(ze=[],et.test(t.charAt(Y))?(mt=t.charAt(Y),Y++):(mt=r,ct===0&&Ct(Ue)),mt!==r)for(;mt!==r;)ze.push(mt),et.test(t.charAt(Y))?(mt=t.charAt(Y),Y++):(mt=r,ct===0&&Ct(Ue));else ze=r;ze!==r?(Dt=N,K=ys(K,re,ze),N=K):(Y=N,N=r)}else Y=N,N=r;else Y=N,N=r}else Y=N,N=r;if(N===r){if(N=Y,t.charCodeAt(Y)===45?(K=Hs,Y++):(K=r,ct===0&&Ct(ca)),K===r&&(t.charCodeAt(Y)===43?(K=ua,Y++):(K=r,ct===0&&Ct(Ho))),K===r&&(K=null),K!==r){if(re=[],et.test(t.charAt(Y))?(he=t.charAt(Y),Y++):(he=r,ct===0&&Ct(Ue)),he!==r)for(;he!==r;)re.push(he),et.test(t.charAt(Y))?(he=t.charAt(Y),Y++):(he=r,ct===0&&Ct(Ue));else re=r;re!==r?(Dt=N,K=Es(K,re),N=K):(Y=N,N=r)}else Y=N,N=r;if(N===r&&(N=Y,K=Pc(),K!==r&&(Dt=N,K=qs(K)),N=K,N===r&&(N=Y,K=Wa(),K!==r&&(Dt=N,K=Un(K)),N=K,N===r)))if(N=Y,t.charCodeAt(Y)===40?(K=we,Y++):(K=r,ct===0&&Ct(Ae)),K!==r){for(re=[],he=Qt();he!==r;)re.push(he),he=Qt();if(re!==r)if(he=ns(),he!==r){for(ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();ze!==r?(t.charCodeAt(Y)===41?(mt=ne,Y++):(mt=r,ct===0&&Ct(Z)),mt!==r?(Dt=N,K=Pn(he),N=K):(Y=N,N=r)):(Y=N,N=r)}else Y=N,N=r;else Y=N,N=r}else Y=N,N=r}return N}function Bl(){var N,K,re,he,ze,mt,fr,Cr;if(N=Y,K=Dc(),K!==r){for(re=[],he=Y,ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();if(ze!==r)if(t.charCodeAt(Y)===42?(mt=Cs,Y++):(mt=r,ct===0&&Ct(We)),mt===r&&(t.charCodeAt(Y)===47?(mt=tt,Y++):(mt=r,ct===0&&Ct(Bt))),mt!==r){for(fr=[],Cr=Qt();Cr!==r;)fr.push(Cr),Cr=Qt();fr!==r?(Cr=Dc(),Cr!==r?(Dt=he,ze=or(K,mt,Cr),he=ze):(Y=he,he=r)):(Y=he,he=r)}else Y=he,he=r;else Y=he,he=r;for(;he!==r;){for(re.push(he),he=Y,ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();if(ze!==r)if(t.charCodeAt(Y)===42?(mt=Cs,Y++):(mt=r,ct===0&&Ct(We)),mt===r&&(t.charCodeAt(Y)===47?(mt=tt,Y++):(mt=r,ct===0&&Ct(Bt))),mt!==r){for(fr=[],Cr=Qt();Cr!==r;)fr.push(Cr),Cr=Qt();fr!==r?(Cr=Dc(),Cr!==r?(Dt=he,ze=or(K,mt,Cr),he=ze):(Y=he,he=r)):(Y=he,he=r)}else Y=he,he=r;else Y=he,he=r}re!==r?(Dt=N,K=ee(K,re),N=K):(Y=N,N=r)}else Y=N,N=r;return N}function ns(){var N,K,re,he,ze,mt,fr,Cr;if(N=Y,K=Bl(),K!==r){for(re=[],he=Y,ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();if(ze!==r)if(t.charCodeAt(Y)===43?(mt=ua,Y++):(mt=r,ct===0&&Ct(Ho)),mt===r&&(t.charCodeAt(Y)===45?(mt=Hs,Y++):(mt=r,ct===0&&Ct(ca))),mt!==r){for(fr=[],Cr=Qt();Cr!==r;)fr.push(Cr),Cr=Qt();fr!==r?(Cr=Bl(),Cr!==r?(Dt=he,ze=ye(K,mt,Cr),he=ze):(Y=he,he=r)):(Y=he,he=r)}else Y=he,he=r;else Y=he,he=r;for(;he!==r;){for(re.push(he),he=Y,ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();if(ze!==r)if(t.charCodeAt(Y)===43?(mt=ua,Y++):(mt=r,ct===0&&Ct(Ho)),mt===r&&(t.charCodeAt(Y)===45?(mt=Hs,Y++):(mt=r,ct===0&&Ct(ca))),mt!==r){for(fr=[],Cr=Qt();Cr!==r;)fr.push(Cr),Cr=Qt();fr!==r?(Cr=Bl(),Cr!==r?(Dt=he,ze=ye(K,mt,Cr),he=ze):(Y=he,he=r)):(Y=he,he=r)}else Y=he,he=r;else Y=he,he=r}re!==r?(Dt=N,K=ee(K,re),N=K):(Y=N,N=r)}else Y=N,N=r;return N}function Yr(){var N,K,re,he,ze,mt;if(N=Y,t.substr(Y,3)===Le?(K=Le,Y+=3):(K=r,ct===0&&Ct(ft)),K!==r){for(re=[],he=Qt();he!==r;)re.push(he),he=Qt();if(re!==r)if(he=ns(),he!==r){for(ze=[],mt=Qt();mt!==r;)ze.push(mt),mt=Qt();ze!==r?(t.substr(Y,2)===pt?(mt=pt,Y+=2):(mt=r,ct===0&&Ct(Nt)),mt!==r?(Dt=N,K=rr(he),N=K):(Y=N,N=r)):(Y=N,N=r)}else Y=N,N=r;else Y=N,N=r}else Y=N,N=r;return N}function mp(){var N,K,re,he;return N=Y,t.substr(Y,2)===$r?(K=$r,Y+=2):(K=r,ct===0&&Ct(ji)),K!==r?(re=Iu(),re!==r?(t.charCodeAt(Y)===41?(he=ne,Y++):(he=r,ct===0&&Ct(Z)),he!==r?(Dt=N,K=rs(re),N=K):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r),N}function Pc(){var N,K,re,he,ze,mt;return N=Y,t.substr(Y,2)===bi?(K=bi,Y+=2):(K=r,ct===0&&Ct(qo)),K!==r?(re=Wa(),re!==r?(t.substr(Y,2)===xA?(he=xA,Y+=2):(he=r,ct===0&&Ct(kA)),he!==r?(ze=TA(),ze!==r?(t.charCodeAt(Y)===125?(mt=H,Y++):(mt=r,ct===0&&Ct(rt)),mt!==r?(Dt=N,K=cp(re,ze),N=K):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r),N===r&&(N=Y,t.substr(Y,2)===bi?(K=bi,Y+=2):(K=r,ct===0&&Ct(qo)),K!==r?(re=Wa(),re!==r?(t.substr(Y,3)===e0?(he=e0,Y+=3):(he=r,ct===0&&Ct(mu)),he!==r?(Dt=N,K=t0(re),N=K):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r),N===r&&(N=Y,t.substr(Y,2)===bi?(K=bi,Y+=2):(K=r,ct===0&&Ct(qo)),K!==r?(re=Wa(),re!==r?(t.substr(Y,2)===yu?(he=yu,Y+=2):(he=r,ct===0&&Ct(uo)),he!==r?(ze=TA(),ze!==r?(t.charCodeAt(Y)===125?(mt=H,Y++):(mt=r,ct===0&&Ct(rt)),mt!==r?(Dt=N,K=QA(re,ze),N=K):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r),N===r&&(N=Y,t.substr(Y,2)===bi?(K=bi,Y+=2):(K=r,ct===0&&Ct(qo)),K!==r?(re=Wa(),re!==r?(t.substr(Y,3)===yc?(he=yc,Y+=3):(he=r,ct===0&&Ct(Aa)),he!==r?(Dt=N,K=r0(re),N=K):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r),N===r&&(N=Y,t.substr(Y,2)===bi?(K=bi,Y+=2):(K=r,ct===0&&Ct(qo)),K!==r?(re=Wa(),re!==r?(t.charCodeAt(Y)===125?(he=H,Y++):(he=r,ct===0&&Ct(rt)),he!==r?(Dt=N,K=Ec(re),N=K):(Y=N,N=r)):(Y=N,N=r)):(Y=N,N=r),N===r&&(N=Y,t.charCodeAt(Y)===36?(K=hd,Y++):(K=r,ct===0&&Ct(n0)),K!==r?(re=Wa(),re!==r?(Dt=N,K=Ec(re),N=K):(Y=N,N=r)):(Y=N,N=r)))))),N}function nw(){var N,K,re;return N=Y,K=g0(),K!==r?(Dt=Y,re=$n(K),re?re=void 0:re=r,re!==r?(Dt=N,K=up(K),N=K):(Y=N,N=r)):(Y=N,N=r),N}function g0(){var N,K,re,he,ze;if(N=Y,K=[],re=Y,he=Y,ct++,ze=m0(),ct--,ze===r?he=void 0:(Y=he,he=r),he!==r?(t.length>Y?(ze=t.charAt(Y),Y++):(ze=r,ct===0&&Ct(Fn)),ze!==r?(Dt=re,he=Me(ze),re=he):(Y=re,re=r)):(Y=re,re=r),re!==r)for(;re!==r;)K.push(re),re=Y,he=Y,ct++,ze=m0(),ct--,ze===r?he=void 0:(Y=he,he=r),he!==r?(t.length>Y?(ze=t.charAt(Y),Y++):(ze=r,ct===0&&Ct(Fn)),ze!==r?(Dt=re,he=Me(ze),re=he):(Y=re,re=r)):(Y=re,re=r);else K=r;return K!==r&&(Dt=N,K=_s(K)),N=K,N}function d0(){var N,K,re;if(N=Y,K=[],i0.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(FA)),re!==r)for(;re!==r;)K.push(re),i0.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(FA));else K=r;return K!==r&&(Dt=N,K=js()),N=K,N}function Wa(){var N,K,re;if(N=Y,K=[],Eu.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(ja)),re!==r)for(;re!==r;)K.push(re),Eu.test(t.charAt(Y))?(re=t.charAt(Y),Y++):(re=r,ct===0&&Ct(ja));else K=r;return K!==r&&(Dt=N,K=js()),N=K,N}function Cd(){var N;return Gi.test(t.charAt(Y))?(N=t.charAt(Y),Y++):(N=r,ct===0&&Ct(fa)),N}function m0(){var N;return Cu.test(t.charAt(Y))?(N=t.charAt(Y),Y++):(N=r,ct===0&&Ct(ws)),N}function Qt(){var N,K;if(N=[],Cc.test(t.charAt(Y))?(K=t.charAt(Y),Y++):(K=r,ct===0&&Ct(wc)),K!==r)for(;K!==r;)N.push(K),Cc.test(t.charAt(Y))?(K=t.charAt(Y),Y++):(K=r,ct===0&&Ct(wc));else N=r;return N}if(wu=a(),wu!==r&&Y===t.length)return wu;throw wu!==r&&Y<t.length&&Ct(a0()),c0(Ic,Si<t.length?t.charAt(Si):null,Si<t.length?Bc(Si,Si+1):Bc(Si,Si))}XY.exports={SyntaxError:_0,parse:c8e}});function CD(t,e={isGlobPattern:()=>!1}){try{return(0,$Y.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function zd(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:o},a)=>`${wD(r)}${o===\";\"?a!==t.length-1||e?\";\":\"\":\" &\"}`).join(\" \")}function wD(t){return`${Jd(t.chain)}${t.then?` ${VR(t.then)}`:\"\"}`}function VR(t){return`${t.type} ${wD(t.line)}`}function Jd(t){return`${JR(t)}${t.then?` ${zR(t.then)}`:\"\"}`}function zR(t){return`${t.type} ${Jd(t.chain)}`}function JR(t){switch(t.type){case\"command\":return`${t.envs.length>0?`${t.envs.map(e=>ED(e)).join(\" \")} `:\"\"}${t.args.map(e=>XR(e)).join(\" \")}`;case\"subshell\":return`(${zd(t.subshell)})${t.args.length>0?` ${t.args.map(e=>Qw(e)).join(\" \")}`:\"\"}`;case\"group\":return`{ ${zd(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>Qw(e)).join(\" \")}`:\"\"}`;case\"envs\":return t.envs.map(e=>ED(e)).join(\" \");default:throw new Error(`Unsupported command type:  \"${t.type}\"`)}}function ED(t){return`${t.name}=${t.args[0]?H0(t.args[0]):\"\"}`}function XR(t){switch(t.type){case\"redirection\":return Qw(t);case\"argument\":return H0(t);default:throw new Error(`Unsupported argument type: \"${t.type}\"`)}}function Qw(t){return`${t.subtype} ${t.args.map(e=>H0(e)).join(\" \")}`}function H0(t){return t.segments.map(e=>ZR(e)).join(\"\")}function ZR(t){let e=(o,a)=>a?`\"${o}\"`:o,r=o=>o===\"\"?\"''\":o.match(/[()}<>$|&;\"'\\n\\t ]/)?o.match(/['\\t\\p{C}]/u)?o.match(/'/)?`\"${o.replace(/[\"$\\t\\p{C}]/u,A8e)}\"`:`$'${o.replace(/[\\t\\p{C}]/u,tW)}'`:`'${o}'`:o;switch(t.type){case\"text\":return r(t.text);case\"glob\":return t.pattern;case\"shell\":return e(`$(${zd(t.shell)})`,t.quoted);case\"variable\":return e(typeof t.defaultValue>\"u\"?typeof t.alternativeValue>\"u\"?`\\${${t.name}}`:t.alternativeValue.length===0?`\\${${t.name}:+}`:`\\${${t.name}:+${t.alternativeValue.map(o=>H0(o)).join(\" \")}}`:t.defaultValue.length===0?`\\${${t.name}:-}`:`\\${${t.name}:-${t.defaultValue.map(o=>H0(o)).join(\" \")}}`,t.quoted);case\"arithmetic\":return`$(( ${ID(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: \"${t.type}\"`)}}function ID(t){let e=a=>{switch(a){case\"addition\":return\"+\";case\"subtraction\":return\"-\";case\"multiplication\":return\"*\";case\"division\":return\"/\";default:throw new Error(`Can't extract operator from arithmetic expression of type \"${a}\"`)}},r=(a,n)=>n?`( ${a} )`:a,o=a=>r(ID(a),![\"number\",\"variable\"].includes(a.type));switch(t.type){case\"number\":return String(t.value);case\"variable\":return t.name;default:return`${o(t.left)} ${e(t.type)} ${o(t.right)}`}}var $Y,eW,u8e,tW,A8e,rW=Et(()=>{$Y=Ze(ZY());eW=new Map([[\"\\f\",\"\\\\f\"],[`\n`,\"\\\\n\"],[\"\\r\",\"\\\\r\"],[\"\t\",\"\\\\t\"],[\"\\v\",\"\\\\v\"],[\"\\0\",\"\\\\0\"]]),u8e=new Map([[\"\\\\\",\"\\\\\\\\\"],[\"$\",\"\\\\$\"],['\"','\\\\\"'],...Array.from(eW,([t,e])=>[t,`\"$'${e}'\"`])]),tW=t=>eW.get(t)??`\\\\x${t.charCodeAt(0).toString(16).padStart(2,\"0\")}`,A8e=t=>u8e.get(t)??`\"$'${tW(t)}'\"`});var iW=_((HSt,nW)=>{\"use strict\";function f8e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function q0(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,q0)}f8e(q0,Error);q0.buildMessage=function(t,e){var r={literal:function(h){return'\"'+a(h.text)+'\"'},class:function(h){var E=\"\",I;for(I=0;I<h.parts.length;I++)E+=h.parts[I]instanceof Array?n(h.parts[I][0])+\"-\"+n(h.parts[I][1]):n(h.parts[I]);return\"[\"+(h.inverted?\"^\":\"\")+E+\"]\"},any:function(h){return\"any character\"},end:function(h){return\"end of input\"},other:function(h){return h.description}};function o(h){return h.charCodeAt(0).toString(16).toUpperCase()}function a(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+o(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+o(E)})}function n(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+o(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+o(E)})}function u(h){return r[h.type](h)}function A(h){var E=new Array(h.length),I,v;for(I=0;I<h.length;I++)E[I]=u(h[I]);if(E.sort(),E.length>0){for(I=1,v=1;I<E.length;I++)E[I-1]!==E[I]&&(E[v]=E[I],v++);E.length=v}switch(E.length){case 1:return E[0];case 2:return E[0]+\" or \"+E[1];default:return E.slice(0,-1).join(\", \")+\", or \"+E[E.length-1]}}function p(h){return h?'\"'+a(h)+'\"':\"end of input\"}return\"Expected \"+A(t)+\" but \"+p(e)+\" found.\"};function p8e(t,e){e=e!==void 0?e:{};var r={},o={resolution:Fe},a=Fe,n=\"/\",u=we(\"/\",!1),A=function(Ue,S){return{from:Ue,descriptor:S}},p=function(Ue){return{descriptor:Ue}},h=\"@\",E=we(\"@\",!1),I=function(Ue,S){return{fullName:Ue,description:S}},v=function(Ue){return{fullName:Ue}},x=function(){return Be()},C=/^[^\\/@]/,R=Ae([\"/\",\"@\"],!0,!1),L=/^[^\\/]/,U=Ae([\"/\"],!0,!1),z=0,te=0,ae=[{line:1,column:1}],le=0,ce=[],Ce=0,de;if(\"startRule\"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');a=o[e.startRule]}function Be(){return t.substring(te,z)}function Ee(){return ht(te,z)}function g(Ue,S){throw S=S!==void 0?S:ht(te,z),Te([xe(Ue)],t.substring(te,z),S)}function me(Ue,S){throw S=S!==void 0?S:ht(te,z),rt(Ue,S)}function we(Ue,S){return{type:\"literal\",text:Ue,ignoreCase:S}}function Ae(Ue,S,w){return{type:\"class\",parts:Ue,inverted:S,ignoreCase:w}}function ne(){return{type:\"any\"}}function Z(){return{type:\"end\"}}function xe(Ue){return{type:\"other\",description:Ue}}function Ne(Ue){var S=ae[Ue],w;if(S)return S;for(w=Ue-1;!ae[w];)w--;for(S=ae[w],S={line:S.line,column:S.column};w<Ue;)t.charCodeAt(w)===10?(S.line++,S.column=1):S.column++,w++;return ae[Ue]=S,S}function ht(Ue,S){var w=Ne(Ue),b=Ne(S);return{start:{offset:Ue,line:w.line,column:w.column},end:{offset:S,line:b.line,column:b.column}}}function H(Ue){z<le||(z>le&&(le=z,ce=[]),ce.push(Ue))}function rt(Ue,S){return new q0(Ue,null,null,S)}function Te(Ue,S,w){return new q0(q0.buildMessage(Ue,S),Ue,S,w)}function Fe(){var Ue,S,w,b;return Ue=z,S=ke(),S!==r?(t.charCodeAt(z)===47?(w=n,z++):(w=r,Ce===0&&H(u)),w!==r?(b=ke(),b!==r?(te=Ue,S=A(S,b),Ue=S):(z=Ue,Ue=r)):(z=Ue,Ue=r)):(z=Ue,Ue=r),Ue===r&&(Ue=z,S=ke(),S!==r&&(te=Ue,S=p(S)),Ue=S),Ue}function ke(){var Ue,S,w,b;return Ue=z,S=Ye(),S!==r?(t.charCodeAt(z)===64?(w=h,z++):(w=r,Ce===0&&H(E)),w!==r?(b=et(),b!==r?(te=Ue,S=I(S,b),Ue=S):(z=Ue,Ue=r)):(z=Ue,Ue=r)):(z=Ue,Ue=r),Ue===r&&(Ue=z,S=Ye(),S!==r&&(te=Ue,S=v(S)),Ue=S),Ue}function Ye(){var Ue,S,w,b,y;return Ue=z,t.charCodeAt(z)===64?(S=h,z++):(S=r,Ce===0&&H(E)),S!==r?(w=be(),w!==r?(t.charCodeAt(z)===47?(b=n,z++):(b=r,Ce===0&&H(u)),b!==r?(y=be(),y!==r?(te=Ue,S=x(),Ue=S):(z=Ue,Ue=r)):(z=Ue,Ue=r)):(z=Ue,Ue=r)):(z=Ue,Ue=r),Ue===r&&(Ue=z,S=be(),S!==r&&(te=Ue,S=x()),Ue=S),Ue}function be(){var Ue,S,w;if(Ue=z,S=[],C.test(t.charAt(z))?(w=t.charAt(z),z++):(w=r,Ce===0&&H(R)),w!==r)for(;w!==r;)S.push(w),C.test(t.charAt(z))?(w=t.charAt(z),z++):(w=r,Ce===0&&H(R));else S=r;return S!==r&&(te=Ue,S=x()),Ue=S,Ue}function et(){var Ue,S,w;if(Ue=z,S=[],L.test(t.charAt(z))?(w=t.charAt(z),z++):(w=r,Ce===0&&H(U)),w!==r)for(;w!==r;)S.push(w),L.test(t.charAt(z))?(w=t.charAt(z),z++):(w=r,Ce===0&&H(U));else S=r;return S!==r&&(te=Ue,S=x()),Ue=S,Ue}if(de=a(),de!==r&&z===t.length)return de;throw de!==r&&z<t.length&&H(Z()),Te(ce,le<t.length?t.charAt(le):null,le<t.length?ht(le,le+1):ht(le,le))}nW.exports={SyntaxError:q0,parse:p8e}});function BD(t){let e=t.match(/^\\*{1,2}\\/(.*)/);if(e)throw new Error(`The override for '${t}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${e[1]}' instead.`);try{return(0,sW.parse)(t)}catch(r){throw r.location&&(r.message=r.message.replace(/(\\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function vD(t){let e=\"\";return t.from&&(e+=t.from.fullName,t.from.description&&(e+=`@${t.from.description}`),e+=\"/\"),e+=t.descriptor.fullName,t.descriptor.description&&(e+=`@${t.descriptor.description}`),e}var sW,oW=Et(()=>{sW=Ze(iW())});var G0=_((jSt,j0)=>{\"use strict\";function aW(t){return typeof t>\"u\"||t===null}function h8e(t){return typeof t==\"object\"&&t!==null}function g8e(t){return Array.isArray(t)?t:aW(t)?[]:[t]}function d8e(t,e){var r,o,a,n;if(e)for(n=Object.keys(e),r=0,o=n.length;r<o;r+=1)a=n[r],t[a]=e[a];return t}function m8e(t,e){var r=\"\",o;for(o=0;o<e;o+=1)r+=t;return r}function y8e(t){return t===0&&Number.NEGATIVE_INFINITY===1/t}j0.exports.isNothing=aW;j0.exports.isObject=h8e;j0.exports.toArray=g8e;j0.exports.repeat=m8e;j0.exports.isNegativeZero=y8e;j0.exports.extend=d8e});var Xd=_((GSt,lW)=>{\"use strict\";function Fw(t,e){Error.call(this),this.name=\"YAMLException\",this.reason=t,this.mark=e,this.message=(this.reason||\"(unknown reason)\")+(this.mark?\" \"+this.mark.toString():\"\"),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||\"\"}Fw.prototype=Object.create(Error.prototype);Fw.prototype.constructor=Fw;Fw.prototype.toString=function(e){var r=this.name+\": \";return r+=this.reason||\"(unknown reason)\",!e&&this.mark&&(r+=\" \"+this.mark.toString()),r};lW.exports=Fw});var AW=_((YSt,uW)=>{\"use strict\";var cW=G0();function $R(t,e,r,o,a){this.name=t,this.buffer=e,this.position=r,this.line=o,this.column=a}$R.prototype.getSnippet=function(e,r){var o,a,n,u,A;if(!this.buffer)return null;for(e=e||4,r=r||75,o=\"\",a=this.position;a>0&&`\\0\\r\n\\x85\\u2028\\u2029`.indexOf(this.buffer.charAt(a-1))===-1;)if(a-=1,this.position-a>r/2-1){o=\" ... \",a+=5;break}for(n=\"\",u=this.position;u<this.buffer.length&&`\\0\\r\n\\x85\\u2028\\u2029`.indexOf(this.buffer.charAt(u))===-1;)if(u+=1,u-this.position>r/2-1){n=\" ... \",u-=5;break}return A=this.buffer.slice(a,u),cW.repeat(\" \",e)+o+A+n+`\n`+cW.repeat(\" \",e+this.position-a+o.length)+\"^\"};$R.prototype.toString=function(e){var r,o=\"\";return this.name&&(o+='in \"'+this.name+'\" '),o+=\"at line \"+(this.line+1)+\", column \"+(this.column+1),e||(r=this.getSnippet(),r&&(o+=`:\n`+r)),o};uW.exports=$R});var ls=_((WSt,pW)=>{\"use strict\";var fW=Xd(),E8e=[\"kind\",\"resolve\",\"construct\",\"instanceOf\",\"predicate\",\"represent\",\"defaultStyle\",\"styleAliases\"],C8e=[\"scalar\",\"sequence\",\"mapping\"];function w8e(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(o){e[String(o)]=r})}),e}function I8e(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(E8e.indexOf(r)===-1)throw new fW('Unknown option \"'+r+'\" is met in definition of \"'+t+'\" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=w8e(e.styleAliases||null),C8e.indexOf(this.kind)===-1)throw new fW('Unknown kind \"'+this.kind+'\" is specified for \"'+t+'\" YAML type.')}pW.exports=I8e});var Y0=_((KSt,gW)=>{\"use strict\";var hW=G0(),DD=Xd(),B8e=ls();function eT(t,e,r){var o=[];return t.include.forEach(function(a){r=eT(a,e,r)}),t[e].forEach(function(a){r.forEach(function(n,u){n.tag===a.tag&&n.kind===a.kind&&o.push(u)}),r.push(a)}),r.filter(function(a,n){return o.indexOf(n)===-1})}function v8e(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function o(a){t[a.kind][a.tag]=t.fallback[a.tag]=a}for(e=0,r=arguments.length;e<r;e+=1)arguments[e].forEach(o);return t}function Zd(t){this.include=t.include||[],this.implicit=t.implicit||[],this.explicit=t.explicit||[],this.implicit.forEach(function(e){if(e.loadKind&&e.loadKind!==\"scalar\")throw new DD(\"There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.\")}),this.compiledImplicit=eT(this,\"implicit\",[]),this.compiledExplicit=eT(this,\"explicit\",[]),this.compiledTypeMap=v8e(this.compiledImplicit,this.compiledExplicit)}Zd.DEFAULT=null;Zd.create=function(){var e,r;switch(arguments.length){case 1:e=Zd.DEFAULT,r=arguments[0];break;case 2:e=arguments[0],r=arguments[1];break;default:throw new DD(\"Wrong number of arguments for Schema.create function\")}if(e=hW.toArray(e),r=hW.toArray(r),!e.every(function(o){return o instanceof Zd}))throw new DD(\"Specified list of super schemas (or a single Schema object) contains a non-Schema object.\");if(!r.every(function(o){return o instanceof B8e}))throw new DD(\"Specified list of YAML types (or a single Type object) contains a non-Type object.\");return new Zd({include:e,explicit:r})};gW.exports=Zd});var mW=_((VSt,dW)=>{\"use strict\";var D8e=ls();dW.exports=new D8e(\"tag:yaml.org,2002:str\",{kind:\"scalar\",construct:function(t){return t!==null?t:\"\"}})});var EW=_((zSt,yW)=>{\"use strict\";var P8e=ls();yW.exports=new P8e(\"tag:yaml.org,2002:seq\",{kind:\"sequence\",construct:function(t){return t!==null?t:[]}})});var wW=_((JSt,CW)=>{\"use strict\";var b8e=ls();CW.exports=new b8e(\"tag:yaml.org,2002:map\",{kind:\"mapping\",construct:function(t){return t!==null?t:{}}})});var PD=_((XSt,IW)=>{\"use strict\";var S8e=Y0();IW.exports=new S8e({explicit:[mW(),EW(),wW()]})});var vW=_((ZSt,BW)=>{\"use strict\";var x8e=ls();function k8e(t){if(t===null)return!0;var e=t.length;return e===1&&t===\"~\"||e===4&&(t===\"null\"||t===\"Null\"||t===\"NULL\")}function Q8e(){return null}function F8e(t){return t===null}BW.exports=new x8e(\"tag:yaml.org,2002:null\",{kind:\"scalar\",resolve:k8e,construct:Q8e,predicate:F8e,represent:{canonical:function(){return\"~\"},lowercase:function(){return\"null\"},uppercase:function(){return\"NULL\"},camelcase:function(){return\"Null\"}},defaultStyle:\"lowercase\"})});var PW=_(($St,DW)=>{\"use strict\";var R8e=ls();function T8e(t){if(t===null)return!1;var e=t.length;return e===4&&(t===\"true\"||t===\"True\"||t===\"TRUE\")||e===5&&(t===\"false\"||t===\"False\"||t===\"FALSE\")}function N8e(t){return t===\"true\"||t===\"True\"||t===\"TRUE\"}function L8e(t){return Object.prototype.toString.call(t)===\"[object Boolean]\"}DW.exports=new R8e(\"tag:yaml.org,2002:bool\",{kind:\"scalar\",resolve:T8e,construct:N8e,predicate:L8e,represent:{lowercase:function(t){return t?\"true\":\"false\"},uppercase:function(t){return t?\"TRUE\":\"FALSE\"},camelcase:function(t){return t?\"True\":\"False\"}},defaultStyle:\"lowercase\"})});var SW=_((ext,bW)=>{\"use strict\";var M8e=G0(),O8e=ls();function U8e(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function _8e(t){return 48<=t&&t<=55}function H8e(t){return 48<=t&&t<=57}function q8e(t){if(t===null)return!1;var e=t.length,r=0,o=!1,a;if(!e)return!1;if(a=t[r],(a===\"-\"||a===\"+\")&&(a=t[++r]),a===\"0\"){if(r+1===e)return!0;if(a=t[++r],a===\"b\"){for(r++;r<e;r++)if(a=t[r],a!==\"_\"){if(a!==\"0\"&&a!==\"1\")return!1;o=!0}return o&&a!==\"_\"}if(a===\"x\"){for(r++;r<e;r++)if(a=t[r],a!==\"_\"){if(!U8e(t.charCodeAt(r)))return!1;o=!0}return o&&a!==\"_\"}for(;r<e;r++)if(a=t[r],a!==\"_\"){if(!_8e(t.charCodeAt(r)))return!1;o=!0}return o&&a!==\"_\"}if(a===\"_\")return!1;for(;r<e;r++)if(a=t[r],a!==\"_\"){if(a===\":\")break;if(!H8e(t.charCodeAt(r)))return!1;o=!0}return!o||a===\"_\"?!1:a!==\":\"?!0:/^(:[0-5]?[0-9])+$/.test(t.slice(r))}function j8e(t){var e=t,r=1,o,a,n=[];return e.indexOf(\"_\")!==-1&&(e=e.replace(/_/g,\"\")),o=e[0],(o===\"-\"||o===\"+\")&&(o===\"-\"&&(r=-1),e=e.slice(1),o=e[0]),e===\"0\"?0:o===\"0\"?e[1]===\"b\"?r*parseInt(e.slice(2),2):e[1]===\"x\"?r*parseInt(e,16):r*parseInt(e,8):e.indexOf(\":\")!==-1?(e.split(\":\").forEach(function(u){n.unshift(parseInt(u,10))}),e=0,a=1,n.forEach(function(u){e+=u*a,a*=60}),r*e):r*parseInt(e,10)}function G8e(t){return Object.prototype.toString.call(t)===\"[object Number]\"&&t%1===0&&!M8e.isNegativeZero(t)}bW.exports=new O8e(\"tag:yaml.org,2002:int\",{kind:\"scalar\",resolve:q8e,construct:j8e,predicate:G8e,represent:{binary:function(t){return t>=0?\"0b\"+t.toString(2):\"-0b\"+t.toString(2).slice(1)},octal:function(t){return t>=0?\"0\"+t.toString(8):\"-0\"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?\"0x\"+t.toString(16).toUpperCase():\"-0x\"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:\"decimal\",styleAliases:{binary:[2,\"bin\"],octal:[8,\"oct\"],decimal:[10,\"dec\"],hexadecimal:[16,\"hex\"]}})});var QW=_((txt,kW)=>{\"use strict\";var xW=G0(),Y8e=ls(),W8e=new RegExp(\"^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*|[-+]?\\\\.(?:inf|Inf|INF)|\\\\.(?:nan|NaN|NAN))$\");function K8e(t){return!(t===null||!W8e.test(t)||t[t.length-1]===\"_\")}function V8e(t){var e,r,o,a;return e=t.replace(/_/g,\"\").toLowerCase(),r=e[0]===\"-\"?-1:1,a=[],\"+-\".indexOf(e[0])>=0&&(e=e.slice(1)),e===\".inf\"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===\".nan\"?NaN:e.indexOf(\":\")>=0?(e.split(\":\").forEach(function(n){a.unshift(parseFloat(n,10))}),e=0,o=1,a.forEach(function(n){e+=n*o,o*=60}),r*e):r*parseFloat(e,10)}var z8e=/^[-+]?[0-9]+e/;function J8e(t,e){var r;if(isNaN(t))switch(e){case\"lowercase\":return\".nan\";case\"uppercase\":return\".NAN\";case\"camelcase\":return\".NaN\"}else if(Number.POSITIVE_INFINITY===t)switch(e){case\"lowercase\":return\".inf\";case\"uppercase\":return\".INF\";case\"camelcase\":return\".Inf\"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case\"lowercase\":return\"-.inf\";case\"uppercase\":return\"-.INF\";case\"camelcase\":return\"-.Inf\"}else if(xW.isNegativeZero(t))return\"-0.0\";return r=t.toString(10),z8e.test(r)?r.replace(\"e\",\".e\"):r}function X8e(t){return Object.prototype.toString.call(t)===\"[object Number]\"&&(t%1!==0||xW.isNegativeZero(t))}kW.exports=new Y8e(\"tag:yaml.org,2002:float\",{kind:\"scalar\",resolve:K8e,construct:V8e,predicate:X8e,represent:J8e,defaultStyle:\"lowercase\"})});var tT=_((rxt,FW)=>{\"use strict\";var Z8e=Y0();FW.exports=new Z8e({include:[PD()],implicit:[vW(),PW(),SW(),QW()]})});var rT=_((nxt,RW)=>{\"use strict\";var $8e=Y0();RW.exports=new $8e({include:[tT()]})});var MW=_((ixt,LW)=>{\"use strict\";var eHe=ls(),TW=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$\"),NW=new RegExp(\"^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\\\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\\\.([0-9]*))?(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$\");function tHe(t){return t===null?!1:TW.exec(t)!==null||NW.exec(t)!==null}function rHe(t){var e,r,o,a,n,u,A,p=0,h=null,E,I,v;if(e=TW.exec(t),e===null&&(e=NW.exec(t)),e===null)throw new Error(\"Date resolve error\");if(r=+e[1],o=+e[2]-1,a=+e[3],!e[4])return new Date(Date.UTC(r,o,a));if(n=+e[4],u=+e[5],A=+e[6],e[7]){for(p=e[7].slice(0,3);p.length<3;)p+=\"0\";p=+p}return e[9]&&(E=+e[10],I=+(e[11]||0),h=(E*60+I)*6e4,e[9]===\"-\"&&(h=-h)),v=new Date(Date.UTC(r,o,a,n,u,A,p)),h&&v.setTime(v.getTime()-h),v}function nHe(t){return t.toISOString()}LW.exports=new eHe(\"tag:yaml.org,2002:timestamp\",{kind:\"scalar\",resolve:tHe,construct:rHe,instanceOf:Date,represent:nHe})});var UW=_((sxt,OW)=>{\"use strict\";var iHe=ls();function sHe(t){return t===\"<<\"||t===null}OW.exports=new iHe(\"tag:yaml.org,2002:merge\",{kind:\"scalar\",resolve:sHe})});var qW=_((oxt,HW)=>{\"use strict\";var W0;try{_W=ve,W0=_W(\"buffer\").Buffer}catch{}var _W,oHe=ls(),nT=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\\r`;function aHe(t){if(t===null)return!1;var e,r,o=0,a=t.length,n=nT;for(r=0;r<a;r++)if(e=n.indexOf(t.charAt(r)),!(e>64)){if(e<0)return!1;o+=6}return o%8===0}function lHe(t){var e,r,o=t.replace(/[\\r\\n=]/g,\"\"),a=o.length,n=nT,u=0,A=[];for(e=0;e<a;e++)e%4===0&&e&&(A.push(u>>16&255),A.push(u>>8&255),A.push(u&255)),u=u<<6|n.indexOf(o.charAt(e));return r=a%4*6,r===0?(A.push(u>>16&255),A.push(u>>8&255),A.push(u&255)):r===18?(A.push(u>>10&255),A.push(u>>2&255)):r===12&&A.push(u>>4&255),W0?W0.from?W0.from(A):new W0(A):A}function cHe(t){var e=\"\",r=0,o,a,n=t.length,u=nT;for(o=0;o<n;o++)o%3===0&&o&&(e+=u[r>>18&63],e+=u[r>>12&63],e+=u[r>>6&63],e+=u[r&63]),r=(r<<8)+t[o];return a=n%3,a===0?(e+=u[r>>18&63],e+=u[r>>12&63],e+=u[r>>6&63],e+=u[r&63]):a===2?(e+=u[r>>10&63],e+=u[r>>4&63],e+=u[r<<2&63],e+=u[64]):a===1&&(e+=u[r>>2&63],e+=u[r<<4&63],e+=u[64],e+=u[64]),e}function uHe(t){return W0&&W0.isBuffer(t)}HW.exports=new oHe(\"tag:yaml.org,2002:binary\",{kind:\"scalar\",resolve:aHe,construct:lHe,predicate:uHe,represent:cHe})});var GW=_((lxt,jW)=>{\"use strict\";var AHe=ls(),fHe=Object.prototype.hasOwnProperty,pHe=Object.prototype.toString;function hHe(t){if(t===null)return!0;var e=[],r,o,a,n,u,A=t;for(r=0,o=A.length;r<o;r+=1){if(a=A[r],u=!1,pHe.call(a)!==\"[object Object]\")return!1;for(n in a)if(fHe.call(a,n))if(!u)u=!0;else return!1;if(!u)return!1;if(e.indexOf(n)===-1)e.push(n);else return!1}return!0}function gHe(t){return t!==null?t:[]}jW.exports=new AHe(\"tag:yaml.org,2002:omap\",{kind:\"sequence\",resolve:hHe,construct:gHe})});var WW=_((cxt,YW)=>{\"use strict\";var dHe=ls(),mHe=Object.prototype.toString;function yHe(t){if(t===null)return!0;var e,r,o,a,n,u=t;for(n=new Array(u.length),e=0,r=u.length;e<r;e+=1){if(o=u[e],mHe.call(o)!==\"[object Object]\"||(a=Object.keys(o),a.length!==1))return!1;n[e]=[a[0],o[a[0]]]}return!0}function EHe(t){if(t===null)return[];var e,r,o,a,n,u=t;for(n=new Array(u.length),e=0,r=u.length;e<r;e+=1)o=u[e],a=Object.keys(o),n[e]=[a[0],o[a[0]]];return n}YW.exports=new dHe(\"tag:yaml.org,2002:pairs\",{kind:\"sequence\",resolve:yHe,construct:EHe})});var VW=_((uxt,KW)=>{\"use strict\";var CHe=ls(),wHe=Object.prototype.hasOwnProperty;function IHe(t){if(t===null)return!0;var e,r=t;for(e in r)if(wHe.call(r,e)&&r[e]!==null)return!1;return!0}function BHe(t){return t!==null?t:{}}KW.exports=new CHe(\"tag:yaml.org,2002:set\",{kind:\"mapping\",resolve:IHe,construct:BHe})});var $d=_((Axt,zW)=>{\"use strict\";var vHe=Y0();zW.exports=new vHe({include:[rT()],implicit:[MW(),UW()],explicit:[qW(),GW(),WW(),VW()]})});var XW=_((fxt,JW)=>{\"use strict\";var DHe=ls();function PHe(){return!0}function bHe(){}function SHe(){return\"\"}function xHe(t){return typeof t>\"u\"}JW.exports=new DHe(\"tag:yaml.org,2002:js/undefined\",{kind:\"scalar\",resolve:PHe,construct:bHe,predicate:xHe,represent:SHe})});var $W=_((pxt,ZW)=>{\"use strict\";var kHe=ls();function QHe(t){if(t===null||t.length===0)return!1;var e=t,r=/\\/([gim]*)$/.exec(t),o=\"\";return!(e[0]===\"/\"&&(r&&(o=r[1]),o.length>3||e[e.length-o.length-1]!==\"/\"))}function FHe(t){var e=t,r=/\\/([gim]*)$/.exec(t),o=\"\";return e[0]===\"/\"&&(r&&(o=r[1]),e=e.slice(1,e.length-o.length-1)),new RegExp(e,o)}function RHe(t){var e=\"/\"+t.source+\"/\";return t.global&&(e+=\"g\"),t.multiline&&(e+=\"m\"),t.ignoreCase&&(e+=\"i\"),e}function THe(t){return Object.prototype.toString.call(t)===\"[object RegExp]\"}ZW.exports=new kHe(\"tag:yaml.org,2002:js/regexp\",{kind:\"scalar\",resolve:QHe,construct:FHe,predicate:THe,represent:RHe})});var rK=_((hxt,tK)=>{\"use strict\";var bD;try{eK=ve,bD=eK(\"esprima\")}catch{typeof window<\"u\"&&(bD=window.esprima)}var eK,NHe=ls();function LHe(t){if(t===null)return!1;try{var e=\"(\"+t+\")\",r=bD.parse(e,{range:!0});return!(r.type!==\"Program\"||r.body.length!==1||r.body[0].type!==\"ExpressionStatement\"||r.body[0].expression.type!==\"ArrowFunctionExpression\"&&r.body[0].expression.type!==\"FunctionExpression\")}catch{return!1}}function MHe(t){var e=\"(\"+t+\")\",r=bD.parse(e,{range:!0}),o=[],a;if(r.type!==\"Program\"||r.body.length!==1||r.body[0].type!==\"ExpressionStatement\"||r.body[0].expression.type!==\"ArrowFunctionExpression\"&&r.body[0].expression.type!==\"FunctionExpression\")throw new Error(\"Failed to resolve function\");return r.body[0].expression.params.forEach(function(n){o.push(n.name)}),a=r.body[0].expression.body.range,r.body[0].expression.body.type===\"BlockStatement\"?new Function(o,e.slice(a[0]+1,a[1]-1)):new Function(o,\"return \"+e.slice(a[0],a[1]))}function OHe(t){return t.toString()}function UHe(t){return Object.prototype.toString.call(t)===\"[object Function]\"}tK.exports=new NHe(\"tag:yaml.org,2002:js/function\",{kind:\"scalar\",resolve:LHe,construct:MHe,predicate:UHe,represent:OHe})});var Rw=_((dxt,iK)=>{\"use strict\";var nK=Y0();iK.exports=nK.DEFAULT=new nK({include:[$d()],explicit:[XW(),$W(),rK()]})});var BK=_((mxt,Tw)=>{\"use strict\";var mf=G0(),AK=Xd(),_He=AW(),fK=$d(),HHe=Rw(),jp=Object.prototype.hasOwnProperty,SD=1,pK=2,hK=3,xD=4,iT=1,qHe=2,sK=3,jHe=/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/,GHe=/[\\x85\\u2028\\u2029]/,YHe=/[,\\[\\]\\{\\}]/,gK=/^(?:!|!!|![a-z\\-]+!)$/i,dK=/^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;function oK(t){return Object.prototype.toString.call(t)}function ju(t){return t===10||t===13}function V0(t){return t===9||t===32}function va(t){return t===9||t===32||t===10||t===13}function em(t){return t===44||t===91||t===93||t===123||t===125}function WHe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function KHe(t){return t===120?2:t===117?4:t===85?8:0}function VHe(t){return 48<=t&&t<=57?t-48:-1}function aK(t){return t===48?\"\\0\":t===97?\"\\x07\":t===98?\"\\b\":t===116||t===9?\"\t\":t===110?`\n`:t===118?\"\\v\":t===102?\"\\f\":t===114?\"\\r\":t===101?\"\\x1B\":t===32?\" \":t===34?'\"':t===47?\"/\":t===92?\"\\\\\":t===78?\"\\x85\":t===95?\"\\xA0\":t===76?\"\\u2028\":t===80?\"\\u2029\":\"\"}function zHe(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var mK=new Array(256),yK=new Array(256);for(K0=0;K0<256;K0++)mK[K0]=aK(K0)?1:0,yK[K0]=aK(K0);var K0;function JHe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||HHe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function EK(t,e){return new AK(e,new _He(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function br(t,e){throw EK(t,e)}function kD(t,e){t.onWarning&&t.onWarning.call(null,EK(t,e))}var lK={YAML:function(e,r,o){var a,n,u;e.version!==null&&br(e,\"duplication of %YAML directive\"),o.length!==1&&br(e,\"YAML directive accepts exactly one argument\"),a=/^([0-9]+)\\.([0-9]+)$/.exec(o[0]),a===null&&br(e,\"ill-formed argument of the YAML directive\"),n=parseInt(a[1],10),u=parseInt(a[2],10),n!==1&&br(e,\"unacceptable YAML version of the document\"),e.version=o[0],e.checkLineBreaks=u<2,u!==1&&u!==2&&kD(e,\"unsupported YAML version of the document\")},TAG:function(e,r,o){var a,n;o.length!==2&&br(e,\"TAG directive accepts exactly two arguments\"),a=o[0],n=o[1],gK.test(a)||br(e,\"ill-formed tag handle (first argument) of the TAG directive\"),jp.call(e.tagMap,a)&&br(e,'there is a previously declared suffix for \"'+a+'\" tag handle'),dK.test(n)||br(e,\"ill-formed tag prefix (second argument) of the TAG directive\"),e.tagMap[a]=n}};function qp(t,e,r,o){var a,n,u,A;if(e<r){if(A=t.input.slice(e,r),o)for(a=0,n=A.length;a<n;a+=1)u=A.charCodeAt(a),u===9||32<=u&&u<=1114111||br(t,\"expected valid JSON character\");else jHe.test(A)&&br(t,\"the stream contains non-printable characters\");t.result+=A}}function cK(t,e,r,o){var a,n,u,A;for(mf.isObject(r)||br(t,\"cannot merge mappings; the provided source object is unacceptable\"),a=Object.keys(r),u=0,A=a.length;u<A;u+=1)n=a[u],jp.call(e,n)||(e[n]=r[n],o[n]=!0)}function tm(t,e,r,o,a,n,u,A){var p,h;if(Array.isArray(a))for(a=Array.prototype.slice.call(a),p=0,h=a.length;p<h;p+=1)Array.isArray(a[p])&&br(t,\"nested arrays are not supported inside keys\"),typeof a==\"object\"&&oK(a[p])===\"[object Object]\"&&(a[p]=\"[object Object]\");if(typeof a==\"object\"&&oK(a)===\"[object Object]\"&&(a=\"[object Object]\"),a=String(a),e===null&&(e={}),o===\"tag:yaml.org,2002:merge\")if(Array.isArray(n))for(p=0,h=n.length;p<h;p+=1)cK(t,e,n[p],r);else cK(t,e,n,r);else!t.json&&!jp.call(r,a)&&jp.call(e,a)&&(t.line=u||t.line,t.position=A||t.position,br(t,\"duplicated mapping key\")),e[a]=n,delete r[a];return e}function sT(t){var e;e=t.input.charCodeAt(t.position),e===10?t.position++:e===13?(t.position++,t.input.charCodeAt(t.position)===10&&t.position++):br(t,\"a line break is expected\"),t.line+=1,t.lineStart=t.position}function Wi(t,e,r){for(var o=0,a=t.input.charCodeAt(t.position);a!==0;){for(;V0(a);)a=t.input.charCodeAt(++t.position);if(e&&a===35)do a=t.input.charCodeAt(++t.position);while(a!==10&&a!==13&&a!==0);if(ju(a))for(sT(t),a=t.input.charCodeAt(t.position),o++,t.lineIndent=0;a===32;)t.lineIndent++,a=t.input.charCodeAt(++t.position);else break}return r!==-1&&o!==0&&t.lineIndent<r&&kD(t,\"deficient indentation\"),o}function QD(t){var e=t.position,r;return r=t.input.charCodeAt(e),!!((r===45||r===46)&&r===t.input.charCodeAt(e+1)&&r===t.input.charCodeAt(e+2)&&(e+=3,r=t.input.charCodeAt(e),r===0||va(r)))}function oT(t,e){e===1?t.result+=\" \":e>1&&(t.result+=mf.repeat(`\n`,e-1))}function XHe(t,e,r){var o,a,n,u,A,p,h,E,I=t.kind,v=t.result,x;if(x=t.input.charCodeAt(t.position),va(x)||em(x)||x===35||x===38||x===42||x===33||x===124||x===62||x===39||x===34||x===37||x===64||x===96||(x===63||x===45)&&(a=t.input.charCodeAt(t.position+1),va(a)||r&&em(a)))return!1;for(t.kind=\"scalar\",t.result=\"\",n=u=t.position,A=!1;x!==0;){if(x===58){if(a=t.input.charCodeAt(t.position+1),va(a)||r&&em(a))break}else if(x===35){if(o=t.input.charCodeAt(t.position-1),va(o))break}else{if(t.position===t.lineStart&&QD(t)||r&&em(x))break;if(ju(x))if(p=t.line,h=t.lineStart,E=t.lineIndent,Wi(t,!1,-1),t.lineIndent>=e){A=!0,x=t.input.charCodeAt(t.position);continue}else{t.position=u,t.line=p,t.lineStart=h,t.lineIndent=E;break}}A&&(qp(t,n,u,!1),oT(t,t.line-p),n=u=t.position,A=!1),V0(x)||(u=t.position+1),x=t.input.charCodeAt(++t.position)}return qp(t,n,u,!1),t.result?!0:(t.kind=I,t.result=v,!1)}function ZHe(t,e){var r,o,a;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind=\"scalar\",t.result=\"\",t.position++,o=a=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(qp(t,o,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)o=t.position,t.position++,a=t.position;else return!0;else ju(r)?(qp(t,o,a,!0),oT(t,Wi(t,!1,e)),o=a=t.position):t.position===t.lineStart&&QD(t)?br(t,\"unexpected end of the document within a single quoted scalar\"):(t.position++,a=t.position);br(t,\"unexpected end of the stream within a single quoted scalar\")}function $He(t,e){var r,o,a,n,u,A;if(A=t.input.charCodeAt(t.position),A!==34)return!1;for(t.kind=\"scalar\",t.result=\"\",t.position++,r=o=t.position;(A=t.input.charCodeAt(t.position))!==0;){if(A===34)return qp(t,r,t.position,!0),t.position++,!0;if(A===92){if(qp(t,r,t.position,!0),A=t.input.charCodeAt(++t.position),ju(A))Wi(t,!1,e);else if(A<256&&mK[A])t.result+=yK[A],t.position++;else if((u=KHe(A))>0){for(a=u,n=0;a>0;a--)A=t.input.charCodeAt(++t.position),(u=WHe(A))>=0?n=(n<<4)+u:br(t,\"expected hexadecimal character\");t.result+=zHe(n),t.position++}else br(t,\"unknown escape sequence\");r=o=t.position}else ju(A)?(qp(t,r,o,!0),oT(t,Wi(t,!1,e)),r=o=t.position):t.position===t.lineStart&&QD(t)?br(t,\"unexpected end of the document within a double quoted scalar\"):(t.position++,o=t.position)}br(t,\"unexpected end of the stream within a double quoted scalar\")}function e6e(t,e){var r=!0,o,a=t.tag,n,u=t.anchor,A,p,h,E,I,v={},x,C,R,L;if(L=t.input.charCodeAt(t.position),L===91)p=93,I=!1,n=[];else if(L===123)p=125,I=!0,n={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=n),L=t.input.charCodeAt(++t.position);L!==0;){if(Wi(t,!0,e),L=t.input.charCodeAt(t.position),L===p)return t.position++,t.tag=a,t.anchor=u,t.kind=I?\"mapping\":\"sequence\",t.result=n,!0;r||br(t,\"missed comma between flow collection entries\"),C=x=R=null,h=E=!1,L===63&&(A=t.input.charCodeAt(t.position+1),va(A)&&(h=E=!0,t.position++,Wi(t,!0,e))),o=t.line,rm(t,e,SD,!1,!0),C=t.tag,x=t.result,Wi(t,!0,e),L=t.input.charCodeAt(t.position),(E||t.line===o)&&L===58&&(h=!0,L=t.input.charCodeAt(++t.position),Wi(t,!0,e),rm(t,e,SD,!1,!0),R=t.result),I?tm(t,n,v,C,x,R):h?n.push(tm(t,null,v,C,x,R)):n.push(x),Wi(t,!0,e),L=t.input.charCodeAt(t.position),L===44?(r=!0,L=t.input.charCodeAt(++t.position)):r=!1}br(t,\"unexpected end of the stream within a flow collection\")}function t6e(t,e){var r,o,a=iT,n=!1,u=!1,A=e,p=0,h=!1,E,I;if(I=t.input.charCodeAt(t.position),I===124)o=!1;else if(I===62)o=!0;else return!1;for(t.kind=\"scalar\",t.result=\"\";I!==0;)if(I=t.input.charCodeAt(++t.position),I===43||I===45)iT===a?a=I===43?sK:qHe:br(t,\"repeat of a chomping mode identifier\");else if((E=VHe(I))>=0)E===0?br(t,\"bad explicit indentation width of a block scalar; it cannot be less than one\"):u?br(t,\"repeat of an indentation width identifier\"):(A=e+E-1,u=!0);else break;if(V0(I)){do I=t.input.charCodeAt(++t.position);while(V0(I));if(I===35)do I=t.input.charCodeAt(++t.position);while(!ju(I)&&I!==0)}for(;I!==0;){for(sT(t),t.lineIndent=0,I=t.input.charCodeAt(t.position);(!u||t.lineIndent<A)&&I===32;)t.lineIndent++,I=t.input.charCodeAt(++t.position);if(!u&&t.lineIndent>A&&(A=t.lineIndent),ju(I)){p++;continue}if(t.lineIndent<A){a===sK?t.result+=mf.repeat(`\n`,n?1+p:p):a===iT&&n&&(t.result+=`\n`);break}for(o?V0(I)?(h=!0,t.result+=mf.repeat(`\n`,n?1+p:p)):h?(h=!1,t.result+=mf.repeat(`\n`,p+1)):p===0?n&&(t.result+=\" \"):t.result+=mf.repeat(`\n`,p):t.result+=mf.repeat(`\n`,n?1+p:p),n=!0,u=!0,p=0,r=t.position;!ju(I)&&I!==0;)I=t.input.charCodeAt(++t.position);qp(t,r,t.position,!1)}return!0}function uK(t,e){var r,o=t.tag,a=t.anchor,n=[],u,A=!1,p;for(t.anchor!==null&&(t.anchorMap[t.anchor]=n),p=t.input.charCodeAt(t.position);p!==0&&!(p!==45||(u=t.input.charCodeAt(t.position+1),!va(u)));){if(A=!0,t.position++,Wi(t,!0,-1)&&t.lineIndent<=e){n.push(null),p=t.input.charCodeAt(t.position);continue}if(r=t.line,rm(t,e,hK,!1,!0),n.push(t.result),Wi(t,!0,-1),p=t.input.charCodeAt(t.position),(t.line===r||t.lineIndent>e)&&p!==0)br(t,\"bad indentation of a sequence entry\");else if(t.lineIndent<e)break}return A?(t.tag=o,t.anchor=a,t.kind=\"sequence\",t.result=n,!0):!1}function r6e(t,e,r){var o,a,n,u,A=t.tag,p=t.anchor,h={},E={},I=null,v=null,x=null,C=!1,R=!1,L;for(t.anchor!==null&&(t.anchorMap[t.anchor]=h),L=t.input.charCodeAt(t.position);L!==0;){if(o=t.input.charCodeAt(t.position+1),n=t.line,u=t.position,(L===63||L===58)&&va(o))L===63?(C&&(tm(t,h,E,I,v,null),I=v=x=null),R=!0,C=!0,a=!0):C?(C=!1,a=!0):br(t,\"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line\"),t.position+=1,L=o;else if(rm(t,r,pK,!1,!0))if(t.line===n){for(L=t.input.charCodeAt(t.position);V0(L);)L=t.input.charCodeAt(++t.position);if(L===58)L=t.input.charCodeAt(++t.position),va(L)||br(t,\"a whitespace character is expected after the key-value separator within a block mapping\"),C&&(tm(t,h,E,I,v,null),I=v=x=null),R=!0,C=!1,a=!1,I=t.tag,v=t.result;else if(R)br(t,\"can not read an implicit mapping pair; a colon is missed\");else return t.tag=A,t.anchor=p,!0}else if(R)br(t,\"can not read a block mapping entry; a multiline key may not be an implicit key\");else return t.tag=A,t.anchor=p,!0;else break;if((t.line===n||t.lineIndent>e)&&(rm(t,e,xD,!0,a)&&(C?v=t.result:x=t.result),C||(tm(t,h,E,I,v,x,n,u),I=v=x=null),Wi(t,!0,-1),L=t.input.charCodeAt(t.position)),t.lineIndent>e&&L!==0)br(t,\"bad indentation of a mapping entry\");else if(t.lineIndent<e)break}return C&&tm(t,h,E,I,v,null),R&&(t.tag=A,t.anchor=p,t.kind=\"mapping\",t.result=h),R}function n6e(t){var e,r=!1,o=!1,a,n,u;if(u=t.input.charCodeAt(t.position),u!==33)return!1;if(t.tag!==null&&br(t,\"duplication of a tag property\"),u=t.input.charCodeAt(++t.position),u===60?(r=!0,u=t.input.charCodeAt(++t.position)):u===33?(o=!0,a=\"!!\",u=t.input.charCodeAt(++t.position)):a=\"!\",e=t.position,r){do u=t.input.charCodeAt(++t.position);while(u!==0&&u!==62);t.position<t.length?(n=t.input.slice(e,t.position),u=t.input.charCodeAt(++t.position)):br(t,\"unexpected end of the stream within a verbatim tag\")}else{for(;u!==0&&!va(u);)u===33&&(o?br(t,\"tag suffix cannot contain exclamation marks\"):(a=t.input.slice(e-1,t.position+1),gK.test(a)||br(t,\"named tag handle cannot contain such characters\"),o=!0,e=t.position+1)),u=t.input.charCodeAt(++t.position);n=t.input.slice(e,t.position),YHe.test(n)&&br(t,\"tag suffix cannot contain flow indicator characters\")}return n&&!dK.test(n)&&br(t,\"tag name cannot contain such characters: \"+n),r?t.tag=n:jp.call(t.tagMap,a)?t.tag=t.tagMap[a]+n:a===\"!\"?t.tag=\"!\"+n:a===\"!!\"?t.tag=\"tag:yaml.org,2002:\"+n:br(t,'undeclared tag handle \"'+a+'\"'),!0}function i6e(t){var e,r;if(r=t.input.charCodeAt(t.position),r!==38)return!1;for(t.anchor!==null&&br(t,\"duplication of an anchor property\"),r=t.input.charCodeAt(++t.position),e=t.position;r!==0&&!va(r)&&!em(r);)r=t.input.charCodeAt(++t.position);return t.position===e&&br(t,\"name of an anchor node must contain at least one character\"),t.anchor=t.input.slice(e,t.position),!0}function s6e(t){var e,r,o;if(o=t.input.charCodeAt(t.position),o!==42)return!1;for(o=t.input.charCodeAt(++t.position),e=t.position;o!==0&&!va(o)&&!em(o);)o=t.input.charCodeAt(++t.position);return t.position===e&&br(t,\"name of an alias node must contain at least one character\"),r=t.input.slice(e,t.position),jp.call(t.anchorMap,r)||br(t,'unidentified alias \"'+r+'\"'),t.result=t.anchorMap[r],Wi(t,!0,-1),!0}function rm(t,e,r,o,a){var n,u,A,p=1,h=!1,E=!1,I,v,x,C,R;if(t.listener!==null&&t.listener(\"open\",t),t.tag=null,t.anchor=null,t.kind=null,t.result=null,n=u=A=xD===r||hK===r,o&&Wi(t,!0,-1)&&(h=!0,t.lineIndent>e?p=1:t.lineIndent===e?p=0:t.lineIndent<e&&(p=-1)),p===1)for(;n6e(t)||i6e(t);)Wi(t,!0,-1)?(h=!0,A=n,t.lineIndent>e?p=1:t.lineIndent===e?p=0:t.lineIndent<e&&(p=-1)):A=!1;if(A&&(A=h||a),(p===1||xD===r)&&(SD===r||pK===r?C=e:C=e+1,R=t.position-t.lineStart,p===1?A&&(uK(t,R)||r6e(t,R,C))||e6e(t,C)?E=!0:(u&&t6e(t,C)||ZHe(t,C)||$He(t,C)?E=!0:s6e(t)?(E=!0,(t.tag!==null||t.anchor!==null)&&br(t,\"alias node should not have any properties\")):XHe(t,C,SD===r)&&(E=!0,t.tag===null&&(t.tag=\"?\")),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):p===0&&(E=A&&uK(t,R))),t.tag!==null&&t.tag!==\"!\")if(t.tag===\"?\"){for(t.result!==null&&t.kind!==\"scalar\"&&br(t,'unacceptable node kind for !<?> tag; it should be \"scalar\", not \"'+t.kind+'\"'),I=0,v=t.implicitTypes.length;I<v;I+=1)if(x=t.implicitTypes[I],x.resolve(t.result)){t.result=x.construct(t.result),t.tag=x.tag,t.anchor!==null&&(t.anchorMap[t.anchor]=t.result);break}}else jp.call(t.typeMap[t.kind||\"fallback\"],t.tag)?(x=t.typeMap[t.kind||\"fallback\"][t.tag],t.result!==null&&x.kind!==t.kind&&br(t,\"unacceptable node kind for !<\"+t.tag+'> tag; it should be \"'+x.kind+'\", not \"'+t.kind+'\"'),x.resolve(t.result)?(t.result=x.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):br(t,\"cannot resolve a node with !<\"+t.tag+\"> explicit tag\")):br(t,\"unknown tag !<\"+t.tag+\">\");return t.listener!==null&&t.listener(\"close\",t),t.tag!==null||t.anchor!==null||E}function o6e(t){var e=t.position,r,o,a,n=!1,u;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(u=t.input.charCodeAt(t.position))!==0&&(Wi(t,!0,-1),u=t.input.charCodeAt(t.position),!(t.lineIndent>0||u!==37));){for(n=!0,u=t.input.charCodeAt(++t.position),r=t.position;u!==0&&!va(u);)u=t.input.charCodeAt(++t.position);for(o=t.input.slice(r,t.position),a=[],o.length<1&&br(t,\"directive name must not be less than one character in length\");u!==0;){for(;V0(u);)u=t.input.charCodeAt(++t.position);if(u===35){do u=t.input.charCodeAt(++t.position);while(u!==0&&!ju(u));break}if(ju(u))break;for(r=t.position;u!==0&&!va(u);)u=t.input.charCodeAt(++t.position);a.push(t.input.slice(r,t.position))}u!==0&&sT(t),jp.call(lK,o)?lK[o](t,o,a):kD(t,'unknown document directive \"'+o+'\"')}if(Wi(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,Wi(t,!0,-1)):n&&br(t,\"directives end mark is expected\"),rm(t,t.lineIndent-1,xD,!1,!0),Wi(t,!0,-1),t.checkLineBreaks&&GHe.test(t.input.slice(e,t.position))&&kD(t,\"non-ASCII line breaks are interpreted as content\"),t.documents.push(t.result),t.position===t.lineStart&&QD(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,Wi(t,!0,-1));return}if(t.position<t.length-1)br(t,\"end of the stream or a document separator is expected\");else return}function CK(t,e){t=String(t),e=e||{},t.length!==0&&(t.charCodeAt(t.length-1)!==10&&t.charCodeAt(t.length-1)!==13&&(t+=`\n`),t.charCodeAt(0)===65279&&(t=t.slice(1)));var r=new JHe(t,e),o=t.indexOf(\"\\0\");for(o!==-1&&(r.position=o,br(r,\"null byte is not allowed in input\")),r.input+=\"\\0\";r.input.charCodeAt(r.position)===32;)r.lineIndent+=1,r.position+=1;for(;r.position<r.length-1;)o6e(r);return r.documents}function wK(t,e,r){e!==null&&typeof e==\"object\"&&typeof r>\"u\"&&(r=e,e=null);var o=CK(t,r);if(typeof e!=\"function\")return o;for(var a=0,n=o.length;a<n;a+=1)e(o[a])}function IK(t,e){var r=CK(t,e);if(r.length!==0){if(r.length===1)return r[0];throw new AK(\"expected a single document in the stream, but found more\")}}function a6e(t,e,r){return typeof e==\"object\"&&e!==null&&typeof r>\"u\"&&(r=e,e=null),wK(t,e,mf.extend({schema:fK},r))}function l6e(t,e){return IK(t,mf.extend({schema:fK},e))}Tw.exports.loadAll=wK;Tw.exports.load=IK;Tw.exports.safeLoadAll=a6e;Tw.exports.safeLoad=l6e});var WK=_((yxt,uT)=>{\"use strict\";var Lw=G0(),Mw=Xd(),c6e=Rw(),u6e=$d(),QK=Object.prototype.toString,FK=Object.prototype.hasOwnProperty,A6e=9,Nw=10,f6e=13,p6e=32,h6e=33,g6e=34,RK=35,d6e=37,m6e=38,y6e=39,E6e=42,TK=44,C6e=45,NK=58,w6e=61,I6e=62,B6e=63,v6e=64,LK=91,MK=93,D6e=96,OK=123,P6e=124,UK=125,vo={};vo[0]=\"\\\\0\";vo[7]=\"\\\\a\";vo[8]=\"\\\\b\";vo[9]=\"\\\\t\";vo[10]=\"\\\\n\";vo[11]=\"\\\\v\";vo[12]=\"\\\\f\";vo[13]=\"\\\\r\";vo[27]=\"\\\\e\";vo[34]='\\\\\"';vo[92]=\"\\\\\\\\\";vo[133]=\"\\\\N\";vo[160]=\"\\\\_\";vo[8232]=\"\\\\L\";vo[8233]=\"\\\\P\";var b6e=[\"y\",\"Y\",\"yes\",\"Yes\",\"YES\",\"on\",\"On\",\"ON\",\"n\",\"N\",\"no\",\"No\",\"NO\",\"off\",\"Off\",\"OFF\"];function S6e(t,e){var r,o,a,n,u,A,p;if(e===null)return{};for(r={},o=Object.keys(e),a=0,n=o.length;a<n;a+=1)u=o[a],A=String(e[u]),u.slice(0,2)===\"!!\"&&(u=\"tag:yaml.org,2002:\"+u.slice(2)),p=t.compiledTypeMap.fallback[u],p&&FK.call(p.styleAliases,A)&&(A=p.styleAliases[A]),r[u]=A;return r}function vK(t){var e,r,o;if(e=t.toString(16).toUpperCase(),t<=255)r=\"x\",o=2;else if(t<=65535)r=\"u\",o=4;else if(t<=4294967295)r=\"U\",o=8;else throw new Mw(\"code point within a string may not be greater than 0xFFFFFFFF\");return\"\\\\\"+r+Lw.repeat(\"0\",o-e.length)+e}function x6e(t){this.schema=t.schema||c6e,this.indent=Math.max(1,t.indent||2),this.noArrayIndent=t.noArrayIndent||!1,this.skipInvalid=t.skipInvalid||!1,this.flowLevel=Lw.isNothing(t.flowLevel)?-1:t.flowLevel,this.styleMap=S6e(this.schema,t.styles||null),this.sortKeys=t.sortKeys||!1,this.lineWidth=t.lineWidth||80,this.noRefs=t.noRefs||!1,this.noCompatMode=t.noCompatMode||!1,this.condenseFlow=t.condenseFlow||!1,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result=\"\",this.duplicates=[],this.usedDuplicates=null}function DK(t,e){for(var r=Lw.repeat(\" \",e),o=0,a=-1,n=\"\",u,A=t.length;o<A;)a=t.indexOf(`\n`,o),a===-1?(u=t.slice(o),o=A):(u=t.slice(o,a+1),o=a+1),u.length&&u!==`\n`&&(n+=r),n+=u;return n}function aT(t,e){return`\n`+Lw.repeat(\" \",t.indent*e)}function k6e(t,e){var r,o,a;for(r=0,o=t.implicitTypes.length;r<o;r+=1)if(a=t.implicitTypes[r],a.resolve(e))return!0;return!1}function cT(t){return t===p6e||t===A6e}function nm(t){return 32<=t&&t<=126||161<=t&&t<=55295&&t!==8232&&t!==8233||57344<=t&&t<=65533&&t!==65279||65536<=t&&t<=1114111}function Q6e(t){return nm(t)&&!cT(t)&&t!==65279&&t!==f6e&&t!==Nw}function PK(t,e){return nm(t)&&t!==65279&&t!==TK&&t!==LK&&t!==MK&&t!==OK&&t!==UK&&t!==NK&&(t!==RK||e&&Q6e(e))}function F6e(t){return nm(t)&&t!==65279&&!cT(t)&&t!==C6e&&t!==B6e&&t!==NK&&t!==TK&&t!==LK&&t!==MK&&t!==OK&&t!==UK&&t!==RK&&t!==m6e&&t!==E6e&&t!==h6e&&t!==P6e&&t!==w6e&&t!==I6e&&t!==y6e&&t!==g6e&&t!==d6e&&t!==v6e&&t!==D6e}function _K(t){var e=/^\\n* /;return e.test(t)}var HK=1,qK=2,jK=3,GK=4,FD=5;function R6e(t,e,r,o,a){var n,u,A,p=!1,h=!1,E=o!==-1,I=-1,v=F6e(t.charCodeAt(0))&&!cT(t.charCodeAt(t.length-1));if(e)for(n=0;n<t.length;n++){if(u=t.charCodeAt(n),!nm(u))return FD;A=n>0?t.charCodeAt(n-1):null,v=v&&PK(u,A)}else{for(n=0;n<t.length;n++){if(u=t.charCodeAt(n),u===Nw)p=!0,E&&(h=h||n-I-1>o&&t[I+1]!==\" \",I=n);else if(!nm(u))return FD;A=n>0?t.charCodeAt(n-1):null,v=v&&PK(u,A)}h=h||E&&n-I-1>o&&t[I+1]!==\" \"}return!p&&!h?v&&!a(t)?HK:qK:r>9&&_K(t)?FD:h?GK:jK}function T6e(t,e,r,o){t.dump=function(){if(e.length===0)return\"''\";if(!t.noCompatMode&&b6e.indexOf(e)!==-1)return\"'\"+e+\"'\";var a=t.indent*Math.max(1,r),n=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),u=o||t.flowLevel>-1&&r>=t.flowLevel;function A(p){return k6e(t,p)}switch(R6e(e,u,t.indent,n,A)){case HK:return e;case qK:return\"'\"+e.replace(/'/g,\"''\")+\"'\";case jK:return\"|\"+bK(e,t.indent)+SK(DK(e,a));case GK:return\">\"+bK(e,t.indent)+SK(DK(N6e(e,n),a));case FD:return'\"'+L6e(e,n)+'\"';default:throw new Mw(\"impossible error: invalid scalar style\")}}()}function bK(t,e){var r=_K(t)?String(e):\"\",o=t[t.length-1]===`\n`,a=o&&(t[t.length-2]===`\n`||t===`\n`),n=a?\"+\":o?\"\":\"-\";return r+n+`\n`}function SK(t){return t[t.length-1]===`\n`?t.slice(0,-1):t}function N6e(t,e){for(var r=/(\\n+)([^\\n]*)/g,o=function(){var h=t.indexOf(`\n`);return h=h!==-1?h:t.length,r.lastIndex=h,xK(t.slice(0,h),e)}(),a=t[0]===`\n`||t[0]===\" \",n,u;u=r.exec(t);){var A=u[1],p=u[2];n=p[0]===\" \",o+=A+(!a&&!n&&p!==\"\"?`\n`:\"\")+xK(p,e),a=n}return o}function xK(t,e){if(t===\"\"||t[0]===\" \")return t;for(var r=/ [^ ]/g,o,a=0,n,u=0,A=0,p=\"\";o=r.exec(t);)A=o.index,A-a>e&&(n=u>a?u:A,p+=`\n`+t.slice(a,n),a=n+1),u=A;return p+=`\n`,t.length-a>e&&u>a?p+=t.slice(a,u)+`\n`+t.slice(u+1):p+=t.slice(a),p.slice(1)}function L6e(t){for(var e=\"\",r,o,a,n=0;n<t.length;n++){if(r=t.charCodeAt(n),r>=55296&&r<=56319&&(o=t.charCodeAt(n+1),o>=56320&&o<=57343)){e+=vK((r-55296)*1024+o-56320+65536),n++;continue}a=vo[r],e+=!a&&nm(r)?t[n]:a||vK(r)}return e}function M6e(t,e,r){var o=\"\",a=t.tag,n,u;for(n=0,u=r.length;n<u;n+=1)z0(t,e,r[n],!1,!1)&&(n!==0&&(o+=\",\"+(t.condenseFlow?\"\":\" \")),o+=t.dump);t.tag=a,t.dump=\"[\"+o+\"]\"}function O6e(t,e,r,o){var a=\"\",n=t.tag,u,A;for(u=0,A=r.length;u<A;u+=1)z0(t,e+1,r[u],!0,!0)&&((!o||u!==0)&&(a+=aT(t,e)),t.dump&&Nw===t.dump.charCodeAt(0)?a+=\"-\":a+=\"- \",a+=t.dump);t.tag=n,t.dump=a||\"[]\"}function U6e(t,e,r){var o=\"\",a=t.tag,n=Object.keys(r),u,A,p,h,E;for(u=0,A=n.length;u<A;u+=1)E=\"\",u!==0&&(E+=\", \"),t.condenseFlow&&(E+='\"'),p=n[u],h=r[p],z0(t,e,p,!1,!1)&&(t.dump.length>1024&&(E+=\"? \"),E+=t.dump+(t.condenseFlow?'\"':\"\")+\":\"+(t.condenseFlow?\"\":\" \"),z0(t,e,h,!1,!1)&&(E+=t.dump,o+=E));t.tag=a,t.dump=\"{\"+o+\"}\"}function _6e(t,e,r,o){var a=\"\",n=t.tag,u=Object.keys(r),A,p,h,E,I,v;if(t.sortKeys===!0)u.sort();else if(typeof t.sortKeys==\"function\")u.sort(t.sortKeys);else if(t.sortKeys)throw new Mw(\"sortKeys must be a boolean or a function\");for(A=0,p=u.length;A<p;A+=1)v=\"\",(!o||A!==0)&&(v+=aT(t,e)),h=u[A],E=r[h],z0(t,e+1,h,!0,!0,!0)&&(I=t.tag!==null&&t.tag!==\"?\"||t.dump&&t.dump.length>1024,I&&(t.dump&&Nw===t.dump.charCodeAt(0)?v+=\"?\":v+=\"? \"),v+=t.dump,I&&(v+=aT(t,e)),z0(t,e+1,E,!0,I)&&(t.dump&&Nw===t.dump.charCodeAt(0)?v+=\":\":v+=\": \",v+=t.dump,a+=v));t.tag=n,t.dump=a||\"{}\"}function kK(t,e,r){var o,a,n,u,A,p;for(a=r?t.explicitTypes:t.implicitTypes,n=0,u=a.length;n<u;n+=1)if(A=a[n],(A.instanceOf||A.predicate)&&(!A.instanceOf||typeof e==\"object\"&&e instanceof A.instanceOf)&&(!A.predicate||A.predicate(e))){if(t.tag=r?A.tag:\"?\",A.represent){if(p=t.styleMap[A.tag]||A.defaultStyle,QK.call(A.represent)===\"[object Function]\")o=A.represent(e,p);else if(FK.call(A.represent,p))o=A.represent[p](e,p);else throw new Mw(\"!<\"+A.tag+'> tag resolver accepts not \"'+p+'\" style');t.dump=o}return!0}return!1}function z0(t,e,r,o,a,n){t.tag=null,t.dump=r,kK(t,r,!1)||kK(t,r,!0);var u=QK.call(t.dump);o&&(o=t.flowLevel<0||t.flowLevel>e);var A=u===\"[object Object]\"||u===\"[object Array]\",p,h;if(A&&(p=t.duplicates.indexOf(r),h=p!==-1),(t.tag!==null&&t.tag!==\"?\"||h||t.indent!==2&&e>0)&&(a=!1),h&&t.usedDuplicates[p])t.dump=\"*ref_\"+p;else{if(A&&h&&!t.usedDuplicates[p]&&(t.usedDuplicates[p]=!0),u===\"[object Object]\")o&&Object.keys(t.dump).length!==0?(_6e(t,e,t.dump,a),h&&(t.dump=\"&ref_\"+p+t.dump)):(U6e(t,e,t.dump),h&&(t.dump=\"&ref_\"+p+\" \"+t.dump));else if(u===\"[object Array]\"){var E=t.noArrayIndent&&e>0?e-1:e;o&&t.dump.length!==0?(O6e(t,E,t.dump,a),h&&(t.dump=\"&ref_\"+p+t.dump)):(M6e(t,E,t.dump),h&&(t.dump=\"&ref_\"+p+\" \"+t.dump))}else if(u===\"[object String]\")t.tag!==\"?\"&&T6e(t,t.dump,e,n);else{if(t.skipInvalid)return!1;throw new Mw(\"unacceptable kind of an object to dump \"+u)}t.tag!==null&&t.tag!==\"?\"&&(t.dump=\"!<\"+t.tag+\"> \"+t.dump)}return!0}function H6e(t,e){var r=[],o=[],a,n;for(lT(t,r,o),a=0,n=o.length;a<n;a+=1)e.duplicates.push(r[o[a]]);e.usedDuplicates=new Array(n)}function lT(t,e,r){var o,a,n;if(t!==null&&typeof t==\"object\")if(a=e.indexOf(t),a!==-1)r.indexOf(a)===-1&&r.push(a);else if(e.push(t),Array.isArray(t))for(a=0,n=t.length;a<n;a+=1)lT(t[a],e,r);else for(o=Object.keys(t),a=0,n=o.length;a<n;a+=1)lT(t[o[a]],e,r)}function YK(t,e){e=e||{};var r=new x6e(e);return r.noRefs||H6e(t,r),z0(r,0,t,!0,!0)?r.dump+`\n`:\"\"}function q6e(t,e){return YK(t,Lw.extend({schema:u6e},e))}uT.exports.dump=YK;uT.exports.safeDump=q6e});var VK=_((Ext,xi)=>{\"use strict\";var RD=BK(),KK=WK();function TD(t){return function(){throw new Error(\"Function \"+t+\" is deprecated and cannot be used.\")}}xi.exports.Type=ls();xi.exports.Schema=Y0();xi.exports.FAILSAFE_SCHEMA=PD();xi.exports.JSON_SCHEMA=tT();xi.exports.CORE_SCHEMA=rT();xi.exports.DEFAULT_SAFE_SCHEMA=$d();xi.exports.DEFAULT_FULL_SCHEMA=Rw();xi.exports.load=RD.load;xi.exports.loadAll=RD.loadAll;xi.exports.safeLoad=RD.safeLoad;xi.exports.safeLoadAll=RD.safeLoadAll;xi.exports.dump=KK.dump;xi.exports.safeDump=KK.safeDump;xi.exports.YAMLException=Xd();xi.exports.MINIMAL_SCHEMA=PD();xi.exports.SAFE_SCHEMA=$d();xi.exports.DEFAULT_SCHEMA=Rw();xi.exports.scan=TD(\"scan\");xi.exports.parse=TD(\"parse\");xi.exports.compose=TD(\"compose\");xi.exports.addConstructor=TD(\"addConstructor\")});var JK=_((Cxt,zK)=>{\"use strict\";var j6e=VK();zK.exports=j6e});var ZK=_((wxt,XK)=>{\"use strict\";function G6e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function J0(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,J0)}G6e(J0,Error);J0.buildMessage=function(t,e){var r={literal:function(h){return'\"'+a(h.text)+'\"'},class:function(h){var E=\"\",I;for(I=0;I<h.parts.length;I++)E+=h.parts[I]instanceof Array?n(h.parts[I][0])+\"-\"+n(h.parts[I][1]):n(h.parts[I]);return\"[\"+(h.inverted?\"^\":\"\")+E+\"]\"},any:function(h){return\"any character\"},end:function(h){return\"end of input\"},other:function(h){return h.description}};function o(h){return h.charCodeAt(0).toString(16).toUpperCase()}function a(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+o(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+o(E)})}function n(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+o(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+o(E)})}function u(h){return r[h.type](h)}function A(h){var E=new Array(h.length),I,v;for(I=0;I<h.length;I++)E[I]=u(h[I]);if(E.sort(),E.length>0){for(I=1,v=1;I<E.length;I++)E[I-1]!==E[I]&&(E[v]=E[I],v++);E.length=v}switch(E.length){case 1:return E[0];case 2:return E[0]+\" or \"+E[1];default:return E.slice(0,-1).join(\", \")+\", or \"+E[E.length-1]}}function p(h){return h?'\"'+a(h)+'\"':\"end of input\"}return\"Expected \"+A(t)+\" but \"+p(e)+\" found.\"};function Y6e(t,e){e=e!==void 0?e:{};var r={},o={Start:gu},a=gu,n=function(ee){return[].concat(...ee)},u=\"-\",A=Qn(\"-\",!1),p=function(ee){return ee},h=function(ee){return Object.assign({},...ee)},E=\"#\",I=Qn(\"#\",!1),v=gc(),x=function(){return{}},C=\":\",R=Qn(\":\",!1),L=function(ee,ye){return{[ee]:ye}},U=\",\",z=Qn(\",\",!1),te=function(ee,ye){return ye},ae=function(ee,ye,Le){return Object.assign({},...[ee].concat(ye).map(ft=>({[ft]:Le})))},le=function(ee){return ee},ce=function(ee){return ee},Ce=aa(\"correct indentation\"),de=\" \",Be=Qn(\" \",!1),Ee=function(ee){return ee.length===or*Bt},g=function(ee){return ee.length===(or+1)*Bt},me=function(){return or++,!0},we=function(){return or--,!0},Ae=function(){return DA()},ne=aa(\"pseudostring\"),Z=/^[^\\r\\n\\t ?:,\\][{}#&*!|>'\"%@`\\-]/,xe=hi([\"\\r\",`\n`,\"\t\",\" \",\"?\",\":\",\",\",\"]\",\"[\",\"{\",\"}\",\"#\",\"&\",\"*\",\"!\",\"|\",\">\",\"'\",'\"',\"%\",\"@\",\"`\",\"-\"],!0,!1),Ne=/^[^\\r\\n\\t ,\\][{}:#\"']/,ht=hi([\"\\r\",`\n`,\"\t\",\" \",\",\",\"]\",\"[\",\"{\",\"}\",\":\",\"#\",'\"',\"'\"],!0,!1),H=function(){return DA().replace(/^ *| *$/g,\"\")},rt=\"--\",Te=Qn(\"--\",!1),Fe=/^[a-zA-Z\\/0-9]/,ke=hi([[\"a\",\"z\"],[\"A\",\"Z\"],\"/\",[\"0\",\"9\"]],!1,!1),Ye=/^[^\\r\\n\\t :,]/,be=hi([\"\\r\",`\n`,\"\t\",\" \",\":\",\",\"],!0,!1),et=\"null\",Ue=Qn(\"null\",!1),S=function(){return null},w=\"true\",b=Qn(\"true\",!1),y=function(){return!0},F=\"false\",J=Qn(\"false\",!1),X=function(){return!1},$=aa(\"string\"),ie='\"',Se=Qn('\"',!1),Re=function(){return\"\"},at=function(ee){return ee},dt=function(ee){return ee.join(\"\")},jt=/^[^\"\\\\\\0-\\x1F\\x7F]/,tr=hi(['\"',\"\\\\\",[\"\\0\",\"\u001f\"],\"\\x7F\"],!0,!1),bt='\\\\\"',ln=Qn('\\\\\"',!1),kr=function(){return'\"'},mr=\"\\\\\\\\\",Sr=Qn(\"\\\\\\\\\",!1),Kr=function(){return\"\\\\\"},Kn=\"\\\\/\",Ms=Qn(\"\\\\/\",!1),Ri=function(){return\"/\"},gs=\"\\\\b\",io=Qn(\"\\\\b\",!1),Pi=function(){return\"\\b\"},Os=\"\\\\f\",so=Qn(\"\\\\f\",!1),uc=function(){return\"\\f\"},Au=\"\\\\n\",op=Qn(\"\\\\n\",!1),ap=function(){return`\n`},Us=\"\\\\r\",Dn=Qn(\"\\\\r\",!1),oo=function(){return\"\\r\"},_s=\"\\\\t\",ml=Qn(\"\\\\t\",!1),yl=function(){return\"\t\"},ao=\"\\\\u\",Vn=Qn(\"\\\\u\",!1),Mn=function(ee,ye,Le,ft){return String.fromCharCode(parseInt(`0x${ee}${ye}${Le}${ft}`))},Ti=/^[0-9a-fA-F]/,On=hi([[\"0\",\"9\"],[\"a\",\"f\"],[\"A\",\"F\"]],!1,!1),_i=aa(\"blank space\"),ir=/^[ \\t]/,Me=hi([\" \",\"\t\"],!1,!1),ii=aa(\"white space\"),Ha=/^[ \\t\\n\\r]/,hr=hi([\" \",\"\t\",`\n`,\"\\r\"],!1,!1),Ac=`\\r\n`,fu=Qn(`\\r\n`,!1),fc=`\n`,El=Qn(`\n`,!1),vA=\"\\r\",pu=Qn(\"\\r\",!1),Ie=0,Tt=0,pc=[{line:1,column:1}],Hi=0,hu=[],Yt=0,Cl;if(\"startRule\"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');a=o[e.startRule]}function DA(){return t.substring(Tt,Ie)}function lp(){return _o(Tt,Ie)}function hc(ee,ye){throw ye=ye!==void 0?ye:_o(Tt,Ie),dc([aa(ee)],t.substring(Tt,Ie),ye)}function PA(ee,ye){throw ye=ye!==void 0?ye:_o(Tt,Ie),lo(ee,ye)}function Qn(ee,ye){return{type:\"literal\",text:ee,ignoreCase:ye}}function hi(ee,ye,Le){return{type:\"class\",parts:ee,inverted:ye,ignoreCase:Le}}function gc(){return{type:\"any\"}}function bA(){return{type:\"end\"}}function aa(ee){return{type:\"other\",description:ee}}function Ni(ee){var ye=pc[ee],Le;if(ye)return ye;for(Le=ee-1;!pc[Le];)Le--;for(ye=pc[Le],ye={line:ye.line,column:ye.column};Le<ee;)t.charCodeAt(Le)===10?(ye.line++,ye.column=1):ye.column++,Le++;return pc[ee]=ye,ye}function _o(ee,ye){var Le=Ni(ee),ft=Ni(ye);return{start:{offset:ee,line:Le.line,column:Le.column},end:{offset:ye,line:ft.line,column:ft.column}}}function Xe(ee){Ie<Hi||(Ie>Hi&&(Hi=Ie,hu=[]),hu.push(ee))}function lo(ee,ye){return new J0(ee,null,null,ye)}function dc(ee,ye,Le){return new J0(J0.buildMessage(ee,ye),ee,ye,Le)}function gu(){var ee;return ee=SA(),ee}function qi(){var ee,ye,Le;for(ee=Ie,ye=[],Le=du();Le!==r;)ye.push(Le),Le=du();return ye!==r&&(Tt=ee,ye=n(ye)),ee=ye,ee}function du(){var ee,ye,Le,ft,pt;return ee=Ie,ye=ds(),ye!==r?(t.charCodeAt(Ie)===45?(Le=u,Ie++):(Le=r,Yt===0&&Xe(A)),Le!==r?(ft=Pn(),ft!==r?(pt=mc(),pt!==r?(Tt=ee,ye=p(pt),ee=ye):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r),ee}function SA(){var ee,ye,Le;for(ee=Ie,ye=[],Le=qa();Le!==r;)ye.push(Le),Le=qa();return ye!==r&&(Tt=ee,ye=h(ye)),ee=ye,ee}function qa(){var ee,ye,Le,ft,pt,Nt,rr,$r,ji;if(ee=Ie,ye=Pn(),ye===r&&(ye=null),ye!==r){if(Le=Ie,t.charCodeAt(Ie)===35?(ft=E,Ie++):(ft=r,Yt===0&&Xe(I)),ft!==r){if(pt=[],Nt=Ie,rr=Ie,Yt++,$r=tt(),Yt--,$r===r?rr=void 0:(Ie=rr,rr=r),rr!==r?(t.length>Ie?($r=t.charAt(Ie),Ie++):($r=r,Yt===0&&Xe(v)),$r!==r?(rr=[rr,$r],Nt=rr):(Ie=Nt,Nt=r)):(Ie=Nt,Nt=r),Nt!==r)for(;Nt!==r;)pt.push(Nt),Nt=Ie,rr=Ie,Yt++,$r=tt(),Yt--,$r===r?rr=void 0:(Ie=rr,rr=r),rr!==r?(t.length>Ie?($r=t.charAt(Ie),Ie++):($r=r,Yt===0&&Xe(v)),$r!==r?(rr=[rr,$r],Nt=rr):(Ie=Nt,Nt=r)):(Ie=Nt,Nt=r);else pt=r;pt!==r?(ft=[ft,pt],Le=ft):(Ie=Le,Le=r)}else Ie=Le,Le=r;if(Le===r&&(Le=null),Le!==r){if(ft=[],pt=We(),pt!==r)for(;pt!==r;)ft.push(pt),pt=We();else ft=r;ft!==r?(Tt=ee,ye=x(),ee=ye):(Ie=ee,ee=r)}else Ie=ee,ee=r}else Ie=ee,ee=r;if(ee===r&&(ee=Ie,ye=ds(),ye!==r?(Le=la(),Le!==r?(ft=Pn(),ft===r&&(ft=null),ft!==r?(t.charCodeAt(Ie)===58?(pt=C,Ie++):(pt=r,Yt===0&&Xe(R)),pt!==r?(Nt=Pn(),Nt===r&&(Nt=null),Nt!==r?(rr=mc(),rr!==r?(Tt=ee,ye=L(Le,rr),ee=ye):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r),ee===r&&(ee=Ie,ye=ds(),ye!==r?(Le=co(),Le!==r?(ft=Pn(),ft===r&&(ft=null),ft!==r?(t.charCodeAt(Ie)===58?(pt=C,Ie++):(pt=r,Yt===0&&Xe(R)),pt!==r?(Nt=Pn(),Nt===r&&(Nt=null),Nt!==r?(rr=mc(),rr!==r?(Tt=ee,ye=L(Le,rr),ee=ye):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r),ee===r))){if(ee=Ie,ye=ds(),ye!==r)if(Le=co(),Le!==r)if(ft=Pn(),ft!==r)if(pt=ca(),pt!==r){if(Nt=[],rr=We(),rr!==r)for(;rr!==r;)Nt.push(rr),rr=We();else Nt=r;Nt!==r?(Tt=ee,ye=L(Le,pt),ee=ye):(Ie=ee,ee=r)}else Ie=ee,ee=r;else Ie=ee,ee=r;else Ie=ee,ee=r;else Ie=ee,ee=r;if(ee===r)if(ee=Ie,ye=ds(),ye!==r)if(Le=co(),Le!==r){if(ft=[],pt=Ie,Nt=Pn(),Nt===r&&(Nt=null),Nt!==r?(t.charCodeAt(Ie)===44?(rr=U,Ie++):(rr=r,Yt===0&&Xe(z)),rr!==r?($r=Pn(),$r===r&&($r=null),$r!==r?(ji=co(),ji!==r?(Tt=pt,Nt=te(Le,ji),pt=Nt):(Ie=pt,pt=r)):(Ie=pt,pt=r)):(Ie=pt,pt=r)):(Ie=pt,pt=r),pt!==r)for(;pt!==r;)ft.push(pt),pt=Ie,Nt=Pn(),Nt===r&&(Nt=null),Nt!==r?(t.charCodeAt(Ie)===44?(rr=U,Ie++):(rr=r,Yt===0&&Xe(z)),rr!==r?($r=Pn(),$r===r&&($r=null),$r!==r?(ji=co(),ji!==r?(Tt=pt,Nt=te(Le,ji),pt=Nt):(Ie=pt,pt=r)):(Ie=pt,pt=r)):(Ie=pt,pt=r)):(Ie=pt,pt=r);else ft=r;ft!==r?(pt=Pn(),pt===r&&(pt=null),pt!==r?(t.charCodeAt(Ie)===58?(Nt=C,Ie++):(Nt=r,Yt===0&&Xe(R)),Nt!==r?(rr=Pn(),rr===r&&(rr=null),rr!==r?($r=mc(),$r!==r?(Tt=ee,ye=ae(Le,ft,$r),ee=ye):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)}else Ie=ee,ee=r;else Ie=ee,ee=r}return ee}function mc(){var ee,ye,Le,ft,pt,Nt,rr;if(ee=Ie,ye=Ie,Yt++,Le=Ie,ft=tt(),ft!==r?(pt=Ht(),pt!==r?(t.charCodeAt(Ie)===45?(Nt=u,Ie++):(Nt=r,Yt===0&&Xe(A)),Nt!==r?(rr=Pn(),rr!==r?(ft=[ft,pt,Nt,rr],Le=ft):(Ie=Le,Le=r)):(Ie=Le,Le=r)):(Ie=Le,Le=r)):(Ie=Le,Le=r),Yt--,Le!==r?(Ie=ye,ye=void 0):ye=r,ye!==r?(Le=We(),Le!==r?(ft=Fn(),ft!==r?(pt=qi(),pt!==r?(Nt=Ei(),Nt!==r?(Tt=ee,ye=le(pt),ee=ye):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r),ee===r&&(ee=Ie,ye=tt(),ye!==r?(Le=Fn(),Le!==r?(ft=SA(),ft!==r?(pt=Ei(),pt!==r?(Tt=ee,ye=le(ft),ee=ye):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r),ee===r))if(ee=Ie,ye=Hs(),ye!==r){if(Le=[],ft=We(),ft!==r)for(;ft!==r;)Le.push(ft),ft=We();else Le=r;Le!==r?(Tt=ee,ye=ce(ye),ee=ye):(Ie=ee,ee=r)}else Ie=ee,ee=r;return ee}function ds(){var ee,ye,Le;for(Yt++,ee=Ie,ye=[],t.charCodeAt(Ie)===32?(Le=de,Ie++):(Le=r,Yt===0&&Xe(Be));Le!==r;)ye.push(Le),t.charCodeAt(Ie)===32?(Le=de,Ie++):(Le=r,Yt===0&&Xe(Be));return ye!==r?(Tt=Ie,Le=Ee(ye),Le?Le=void 0:Le=r,Le!==r?(ye=[ye,Le],ee=ye):(Ie=ee,ee=r)):(Ie=ee,ee=r),Yt--,ee===r&&(ye=r,Yt===0&&Xe(Ce)),ee}function Ht(){var ee,ye,Le;for(ee=Ie,ye=[],t.charCodeAt(Ie)===32?(Le=de,Ie++):(Le=r,Yt===0&&Xe(Be));Le!==r;)ye.push(Le),t.charCodeAt(Ie)===32?(Le=de,Ie++):(Le=r,Yt===0&&Xe(Be));return ye!==r?(Tt=Ie,Le=g(ye),Le?Le=void 0:Le=r,Le!==r?(ye=[ye,Le],ee=ye):(Ie=ee,ee=r)):(Ie=ee,ee=r),ee}function Fn(){var ee;return Tt=Ie,ee=me(),ee?ee=void 0:ee=r,ee}function Ei(){var ee;return Tt=Ie,ee=we(),ee?ee=void 0:ee=r,ee}function la(){var ee;return ee=ys(),ee===r&&(ee=ua()),ee}function co(){var ee,ye,Le;if(ee=ys(),ee===r){if(ee=Ie,ye=[],Le=Ho(),Le!==r)for(;Le!==r;)ye.push(Le),Le=Ho();else ye=r;ye!==r&&(Tt=ee,ye=Ae()),ee=ye}return ee}function Hs(){var ee;return ee=Ci(),ee===r&&(ee=ms(),ee===r&&(ee=ys(),ee===r&&(ee=ua()))),ee}function ca(){var ee;return ee=Ci(),ee===r&&(ee=ys(),ee===r&&(ee=Ho())),ee}function ua(){var ee,ye,Le,ft,pt,Nt;if(Yt++,ee=Ie,Z.test(t.charAt(Ie))?(ye=t.charAt(Ie),Ie++):(ye=r,Yt===0&&Xe(xe)),ye!==r){for(Le=[],ft=Ie,pt=Pn(),pt===r&&(pt=null),pt!==r?(Ne.test(t.charAt(Ie))?(Nt=t.charAt(Ie),Ie++):(Nt=r,Yt===0&&Xe(ht)),Nt!==r?(pt=[pt,Nt],ft=pt):(Ie=ft,ft=r)):(Ie=ft,ft=r);ft!==r;)Le.push(ft),ft=Ie,pt=Pn(),pt===r&&(pt=null),pt!==r?(Ne.test(t.charAt(Ie))?(Nt=t.charAt(Ie),Ie++):(Nt=r,Yt===0&&Xe(ht)),Nt!==r?(pt=[pt,Nt],ft=pt):(Ie=ft,ft=r)):(Ie=ft,ft=r);Le!==r?(Tt=ee,ye=H(),ee=ye):(Ie=ee,ee=r)}else Ie=ee,ee=r;return Yt--,ee===r&&(ye=r,Yt===0&&Xe(ne)),ee}function Ho(){var ee,ye,Le,ft,pt;if(ee=Ie,t.substr(Ie,2)===rt?(ye=rt,Ie+=2):(ye=r,Yt===0&&Xe(Te)),ye===r&&(ye=null),ye!==r)if(Fe.test(t.charAt(Ie))?(Le=t.charAt(Ie),Ie++):(Le=r,Yt===0&&Xe(ke)),Le!==r){for(ft=[],Ye.test(t.charAt(Ie))?(pt=t.charAt(Ie),Ie++):(pt=r,Yt===0&&Xe(be));pt!==r;)ft.push(pt),Ye.test(t.charAt(Ie))?(pt=t.charAt(Ie),Ie++):(pt=r,Yt===0&&Xe(be));ft!==r?(Tt=ee,ye=H(),ee=ye):(Ie=ee,ee=r)}else Ie=ee,ee=r;else Ie=ee,ee=r;return ee}function Ci(){var ee,ye;return ee=Ie,t.substr(Ie,4)===et?(ye=et,Ie+=4):(ye=r,Yt===0&&Xe(Ue)),ye!==r&&(Tt=ee,ye=S()),ee=ye,ee}function ms(){var ee,ye;return ee=Ie,t.substr(Ie,4)===w?(ye=w,Ie+=4):(ye=r,Yt===0&&Xe(b)),ye!==r&&(Tt=ee,ye=y()),ee=ye,ee===r&&(ee=Ie,t.substr(Ie,5)===F?(ye=F,Ie+=5):(ye=r,Yt===0&&Xe(J)),ye!==r&&(Tt=ee,ye=X()),ee=ye),ee}function ys(){var ee,ye,Le,ft;return Yt++,ee=Ie,t.charCodeAt(Ie)===34?(ye=ie,Ie++):(ye=r,Yt===0&&Xe(Se)),ye!==r?(t.charCodeAt(Ie)===34?(Le=ie,Ie++):(Le=r,Yt===0&&Xe(Se)),Le!==r?(Tt=ee,ye=Re(),ee=ye):(Ie=ee,ee=r)):(Ie=ee,ee=r),ee===r&&(ee=Ie,t.charCodeAt(Ie)===34?(ye=ie,Ie++):(ye=r,Yt===0&&Xe(Se)),ye!==r?(Le=Es(),Le!==r?(t.charCodeAt(Ie)===34?(ft=ie,Ie++):(ft=r,Yt===0&&Xe(Se)),ft!==r?(Tt=ee,ye=at(Le),ee=ye):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)),Yt--,ee===r&&(ye=r,Yt===0&&Xe($)),ee}function Es(){var ee,ye,Le;if(ee=Ie,ye=[],Le=qs(),Le!==r)for(;Le!==r;)ye.push(Le),Le=qs();else ye=r;return ye!==r&&(Tt=ee,ye=dt(ye)),ee=ye,ee}function qs(){var ee,ye,Le,ft,pt,Nt;return jt.test(t.charAt(Ie))?(ee=t.charAt(Ie),Ie++):(ee=r,Yt===0&&Xe(tr)),ee===r&&(ee=Ie,t.substr(Ie,2)===bt?(ye=bt,Ie+=2):(ye=r,Yt===0&&Xe(ln)),ye!==r&&(Tt=ee,ye=kr()),ee=ye,ee===r&&(ee=Ie,t.substr(Ie,2)===mr?(ye=mr,Ie+=2):(ye=r,Yt===0&&Xe(Sr)),ye!==r&&(Tt=ee,ye=Kr()),ee=ye,ee===r&&(ee=Ie,t.substr(Ie,2)===Kn?(ye=Kn,Ie+=2):(ye=r,Yt===0&&Xe(Ms)),ye!==r&&(Tt=ee,ye=Ri()),ee=ye,ee===r&&(ee=Ie,t.substr(Ie,2)===gs?(ye=gs,Ie+=2):(ye=r,Yt===0&&Xe(io)),ye!==r&&(Tt=ee,ye=Pi()),ee=ye,ee===r&&(ee=Ie,t.substr(Ie,2)===Os?(ye=Os,Ie+=2):(ye=r,Yt===0&&Xe(so)),ye!==r&&(Tt=ee,ye=uc()),ee=ye,ee===r&&(ee=Ie,t.substr(Ie,2)===Au?(ye=Au,Ie+=2):(ye=r,Yt===0&&Xe(op)),ye!==r&&(Tt=ee,ye=ap()),ee=ye,ee===r&&(ee=Ie,t.substr(Ie,2)===Us?(ye=Us,Ie+=2):(ye=r,Yt===0&&Xe(Dn)),ye!==r&&(Tt=ee,ye=oo()),ee=ye,ee===r&&(ee=Ie,t.substr(Ie,2)===_s?(ye=_s,Ie+=2):(ye=r,Yt===0&&Xe(ml)),ye!==r&&(Tt=ee,ye=yl()),ee=ye,ee===r&&(ee=Ie,t.substr(Ie,2)===ao?(ye=ao,Ie+=2):(ye=r,Yt===0&&Xe(Vn)),ye!==r?(Le=Un(),Le!==r?(ft=Un(),ft!==r?(pt=Un(),pt!==r?(Nt=Un(),Nt!==r?(Tt=ee,ye=Mn(Le,ft,pt,Nt),ee=ye):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)):(Ie=ee,ee=r)))))))))),ee}function Un(){var ee;return Ti.test(t.charAt(Ie))?(ee=t.charAt(Ie),Ie++):(ee=r,Yt===0&&Xe(On)),ee}function Pn(){var ee,ye;if(Yt++,ee=[],ir.test(t.charAt(Ie))?(ye=t.charAt(Ie),Ie++):(ye=r,Yt===0&&Xe(Me)),ye!==r)for(;ye!==r;)ee.push(ye),ir.test(t.charAt(Ie))?(ye=t.charAt(Ie),Ie++):(ye=r,Yt===0&&Xe(Me));else ee=r;return Yt--,ee===r&&(ye=r,Yt===0&&Xe(_i)),ee}function Cs(){var ee,ye;if(Yt++,ee=[],Ha.test(t.charAt(Ie))?(ye=t.charAt(Ie),Ie++):(ye=r,Yt===0&&Xe(hr)),ye!==r)for(;ye!==r;)ee.push(ye),Ha.test(t.charAt(Ie))?(ye=t.charAt(Ie),Ie++):(ye=r,Yt===0&&Xe(hr));else ee=r;return Yt--,ee===r&&(ye=r,Yt===0&&Xe(ii)),ee}function We(){var ee,ye,Le,ft,pt,Nt;if(ee=Ie,ye=tt(),ye!==r){for(Le=[],ft=Ie,pt=Pn(),pt===r&&(pt=null),pt!==r?(Nt=tt(),Nt!==r?(pt=[pt,Nt],ft=pt):(Ie=ft,ft=r)):(Ie=ft,ft=r);ft!==r;)Le.push(ft),ft=Ie,pt=Pn(),pt===r&&(pt=null),pt!==r?(Nt=tt(),Nt!==r?(pt=[pt,Nt],ft=pt):(Ie=ft,ft=r)):(Ie=ft,ft=r);Le!==r?(ye=[ye,Le],ee=ye):(Ie=ee,ee=r)}else Ie=ee,ee=r;return ee}function tt(){var ee;return t.substr(Ie,2)===Ac?(ee=Ac,Ie+=2):(ee=r,Yt===0&&Xe(fu)),ee===r&&(t.charCodeAt(Ie)===10?(ee=fc,Ie++):(ee=r,Yt===0&&Xe(El)),ee===r&&(t.charCodeAt(Ie)===13?(ee=vA,Ie++):(ee=r,Yt===0&&Xe(pu)))),ee}let Bt=2,or=0;if(Cl=a(),Cl!==r&&Ie===t.length)return Cl;throw Cl!==r&&Ie<t.length&&Xe(bA()),dc(hu,Hi<t.length?t.charAt(Hi):null,Hi<t.length?_o(Hi,Hi+1):_o(Hi,Hi))}XK.exports={SyntaxError:J0,parse:Y6e}});function eV(t){return t.match(W6e)?t:JSON.stringify(t)}function rV(t){return typeof t>\"u\"?!0:typeof t==\"object\"&&t!==null&&!Array.isArray(t)?Object.keys(t).every(e=>rV(t[e])):!1}function AT(t,e,r){if(t===null)return`null\n`;if(typeof t==\"number\"||typeof t==\"boolean\")return`${t.toString()}\n`;if(typeof t==\"string\")return`${eV(t)}\n`;if(Array.isArray(t)){if(t.length===0)return`[]\n`;let o=\"  \".repeat(e);return`\n${t.map(n=>`${o}- ${AT(n,e+1,!1)}`).join(\"\")}`}if(typeof t==\"object\"&&t){let[o,a]=t instanceof ND?[t.data,!1]:[t,!0],n=\"  \".repeat(e),u=Object.keys(o);a&&u.sort((p,h)=>{let E=$K.indexOf(p),I=$K.indexOf(h);return E===-1&&I===-1?p<h?-1:p>h?1:0:E!==-1&&I===-1?-1:E===-1&&I!==-1?1:E-I});let A=u.filter(p=>!rV(o[p])).map((p,h)=>{let E=o[p],I=eV(p),v=AT(E,e+1,!0),x=h>0||r?n:\"\",C=I.length>1024?`? ${I}\n${x}:`:`${I}:`,R=v.startsWith(`\n`)?v:` ${v}`;return`${x}${C}${R}`}).join(e===0?`\n`:\"\")||`\n`;return r?`\n${A}`:`${A}`}throw new Error(`Unsupported value type (${t})`)}function Da(t){try{let e=AT(t,0,!1);return e!==`\n`?e:\"\"}catch(e){throw e.location&&(e.message=e.message.replace(/(\\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}function K6e(t){return t.endsWith(`\n`)||(t+=`\n`),(0,tV.parse)(t)}function z6e(t){if(V6e.test(t))return K6e(t);let e=(0,LD.safeLoad)(t,{schema:LD.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!=\"object\")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error(\"Expected an indexed object, got an array instead. Does your file follow Yaml's rules?\");return e}function Ki(t){return z6e(t)}var LD,tV,W6e,$K,ND,V6e,nV=Et(()=>{LD=Ze(JK()),tV=Ze(ZK()),W6e=/^(?![-?:,\\][{}#&*!|>'\"%@` \\t\\r\\n]).([ \\t]*(?![,\\][{}:# \\t\\r\\n]).)*$/,$K=[\"__metadata\",\"version\",\"resolution\",\"dependencies\",\"peerDependencies\",\"dependenciesMeta\",\"peerDependenciesMeta\",\"binaries\"],ND=class{constructor(e){this.data=e}};Da.PreserveOrdering=ND;V6e=/^(#.*(\\r?\\n))*?#\\s+yarn\\s+lockfile\\s+v1\\r?\\n/i});var Ow={};Vt(Ow,{parseResolution:()=>BD,parseShell:()=>CD,parseSyml:()=>Ki,stringifyArgument:()=>XR,stringifyArgumentSegment:()=>ZR,stringifyArithmeticExpression:()=>ID,stringifyCommand:()=>JR,stringifyCommandChain:()=>Jd,stringifyCommandChainThen:()=>zR,stringifyCommandLine:()=>wD,stringifyCommandLineThen:()=>VR,stringifyEnvSegment:()=>ED,stringifyRedirectArgument:()=>Qw,stringifyResolution:()=>vD,stringifyShell:()=>zd,stringifyShellLine:()=>zd,stringifySyml:()=>Da,stringifyValueArgument:()=>H0});var Nl=Et(()=>{rW();oW();nV()});var sV=_((Pxt,fT)=>{\"use strict\";var J6e=t=>{let e=!1,r=!1,o=!1;for(let a=0;a<t.length;a++){let n=t[a];e&&/[a-zA-Z]/.test(n)&&n.toUpperCase()===n?(t=t.slice(0,a)+\"-\"+t.slice(a),e=!1,o=r,r=!0,a++):r&&o&&/[a-zA-Z]/.test(n)&&n.toLowerCase()===n?(t=t.slice(0,a-1)+\"-\"+t.slice(a-1),o=r,r=!1,e=!0):(e=n.toLowerCase()===n&&n.toUpperCase()!==n,o=r,r=n.toUpperCase()===n&&n.toLowerCase()!==n)}return t},iV=(t,e)=>{if(!(typeof t==\"string\"||Array.isArray(t)))throw new TypeError(\"Expected the input to be `string | string[]`\");e=Object.assign({pascalCase:!1},e);let r=a=>e.pascalCase?a.charAt(0).toUpperCase()+a.slice(1):a;return Array.isArray(t)?t=t.map(a=>a.trim()).filter(a=>a.length).join(\"-\"):t=t.trim(),t.length===0?\"\":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=J6e(t)),t=t.replace(/^[_.\\- ]+/,\"\").toLowerCase().replace(/[_.\\- ]+(\\w|$)/g,(a,n)=>n.toUpperCase()).replace(/\\d+(\\w|$)/g,a=>a.toUpperCase()),r(t))};fT.exports=iV;fT.exports.default=iV});var oV=_((bxt,X6e)=>{X6e.exports=[{name:\"Agola CI\",constant:\"AGOLA\",env:\"AGOLA_GIT_REF\",pr:\"AGOLA_PULL_REQUEST_ID\"},{name:\"Appcircle\",constant:\"APPCIRCLE\",env:\"AC_APPCIRCLE\"},{name:\"AppVeyor\",constant:\"APPVEYOR\",env:\"APPVEYOR\",pr:\"APPVEYOR_PULL_REQUEST_NUMBER\"},{name:\"AWS CodeBuild\",constant:\"CODEBUILD\",env:\"CODEBUILD_BUILD_ARN\"},{name:\"Azure Pipelines\",constant:\"AZURE_PIPELINES\",env:\"TF_BUILD\",pr:{BUILD_REASON:\"PullRequest\"}},{name:\"Bamboo\",constant:\"BAMBOO\",env:\"bamboo_planKey\"},{name:\"Bitbucket Pipelines\",constant:\"BITBUCKET\",env:\"BITBUCKET_COMMIT\",pr:\"BITBUCKET_PR_ID\"},{name:\"Bitrise\",constant:\"BITRISE\",env:\"BITRISE_IO\",pr:\"BITRISE_PULL_REQUEST\"},{name:\"Buddy\",constant:\"BUDDY\",env:\"BUDDY_WORKSPACE_ID\",pr:\"BUDDY_EXECUTION_PULL_REQUEST_ID\"},{name:\"Buildkite\",constant:\"BUILDKITE\",env:\"BUILDKITE\",pr:{env:\"BUILDKITE_PULL_REQUEST\",ne:\"false\"}},{name:\"CircleCI\",constant:\"CIRCLE\",env:\"CIRCLECI\",pr:\"CIRCLE_PULL_REQUEST\"},{name:\"Cirrus CI\",constant:\"CIRRUS\",env:\"CIRRUS_CI\",pr:\"CIRRUS_PR\"},{name:\"Codefresh\",constant:\"CODEFRESH\",env:\"CF_BUILD_ID\",pr:{any:[\"CF_PULL_REQUEST_NUMBER\",\"CF_PULL_REQUEST_ID\"]}},{name:\"Codemagic\",constant:\"CODEMAGIC\",env:\"CM_BUILD_ID\",pr:\"CM_PULL_REQUEST\"},{name:\"Codeship\",constant:\"CODESHIP\",env:{CI_NAME:\"codeship\"}},{name:\"Drone\",constant:\"DRONE\",env:\"DRONE\",pr:{DRONE_BUILD_EVENT:\"pull_request\"}},{name:\"dsari\",constant:\"DSARI\",env:\"DSARI\"},{name:\"Earthly\",constant:\"EARTHLY\",env:\"EARTHLY_CI\"},{name:\"Expo Application Services\",constant:\"EAS\",env:\"EAS_BUILD\"},{name:\"Gerrit\",constant:\"GERRIT\",env:\"GERRIT_PROJECT\"},{name:\"Gitea Actions\",constant:\"GITEA_ACTIONS\",env:\"GITEA_ACTIONS\"},{name:\"GitHub Actions\",constant:\"GITHUB_ACTIONS\",env:\"GITHUB_ACTIONS\",pr:{GITHUB_EVENT_NAME:\"pull_request\"}},{name:\"GitLab CI\",constant:\"GITLAB\",env:\"GITLAB_CI\",pr:\"CI_MERGE_REQUEST_ID\"},{name:\"GoCD\",constant:\"GOCD\",env:\"GO_PIPELINE_LABEL\"},{name:\"Google Cloud Build\",constant:\"GOOGLE_CLOUD_BUILD\",env:\"BUILDER_OUTPUT\"},{name:\"Harness CI\",constant:\"HARNESS\",env:\"HARNESS_BUILD_ID\"},{name:\"Heroku\",constant:\"HEROKU\",env:{env:\"NODE\",includes:\"/app/.heroku/node/bin/node\"}},{name:\"Hudson\",constant:\"HUDSON\",env:\"HUDSON_URL\"},{name:\"Jenkins\",constant:\"JENKINS\",env:[\"JENKINS_URL\",\"BUILD_ID\"],pr:{any:[\"ghprbPullId\",\"CHANGE_ID\"]}},{name:\"LayerCI\",constant:\"LAYERCI\",env:\"LAYERCI\",pr:\"LAYERCI_PULL_REQUEST\"},{name:\"Magnum CI\",constant:\"MAGNUM\",env:\"MAGNUM\"},{name:\"Netlify CI\",constant:\"NETLIFY\",env:\"NETLIFY\",pr:{env:\"PULL_REQUEST\",ne:\"false\"}},{name:\"Nevercode\",constant:\"NEVERCODE\",env:\"NEVERCODE\",pr:{env:\"NEVERCODE_PULL_REQUEST\",ne:\"false\"}},{name:\"Prow\",constant:\"PROW\",env:\"PROW_JOB_ID\"},{name:\"ReleaseHub\",constant:\"RELEASEHUB\",env:\"RELEASE_BUILD_ID\"},{name:\"Render\",constant:\"RENDER\",env:\"RENDER\",pr:{IS_PULL_REQUEST:\"true\"}},{name:\"Sail CI\",constant:\"SAIL\",env:\"SAILCI\",pr:\"SAIL_PULL_REQUEST_NUMBER\"},{name:\"Screwdriver\",constant:\"SCREWDRIVER\",env:\"SCREWDRIVER\",pr:{env:\"SD_PULL_REQUEST\",ne:\"false\"}},{name:\"Semaphore\",constant:\"SEMAPHORE\",env:\"SEMAPHORE\",pr:\"PULL_REQUEST_NUMBER\"},{name:\"Sourcehut\",constant:\"SOURCEHUT\",env:{CI_NAME:\"sourcehut\"}},{name:\"Strider CD\",constant:\"STRIDER\",env:\"STRIDER\"},{name:\"TaskCluster\",constant:\"TASKCLUSTER\",env:[\"TASK_ID\",\"RUN_ID\"]},{name:\"TeamCity\",constant:\"TEAMCITY\",env:\"TEAMCITY_VERSION\"},{name:\"Travis CI\",constant:\"TRAVIS\",env:\"TRAVIS\",pr:{env:\"TRAVIS_PULL_REQUEST\",ne:\"false\"}},{name:\"Vela\",constant:\"VELA\",env:\"VELA\",pr:{VELA_PULL_REQUEST:\"1\"}},{name:\"Vercel\",constant:\"VERCEL\",env:{any:[\"NOW_BUILDER\",\"VERCEL\"]},pr:\"VERCEL_GIT_PULL_REQUEST_ID\"},{name:\"Visual Studio App Center\",constant:\"APPCENTER\",env:\"APPCENTER_BUILD_ID\"},{name:\"Woodpecker\",constant:\"WOODPECKER\",env:{CI:\"woodpecker\"},pr:{CI_BUILD_EVENT:\"pull_request\"}},{name:\"Xcode Cloud\",constant:\"XCODE_CLOUD\",env:\"CI_XCODE_PROJECT\",pr:\"CI_PULL_REQUEST_NUMBER\"},{name:\"Xcode Server\",constant:\"XCODE_SERVER\",env:\"XCS\"}]});var X0=_($a=>{\"use strict\";var lV=oV(),cs=process.env;Object.defineProperty($a,\"_vendors\",{value:lV.map(function(t){return t.constant})});$a.name=null;$a.isPR=null;lV.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(o){return aV(o)});if($a[t.constant]=r,!!r)switch($a.name=t.name,typeof t.pr){case\"string\":$a.isPR=!!cs[t.pr];break;case\"object\":\"env\"in t.pr?$a.isPR=t.pr.env in cs&&cs[t.pr.env]!==t.pr.ne:\"any\"in t.pr?$a.isPR=t.pr.any.some(function(o){return!!cs[o]}):$a.isPR=aV(t.pr);break;default:$a.isPR=null}});$a.isCI=!!(cs.CI!==\"false\"&&(cs.BUILD_ID||cs.BUILD_NUMBER||cs.CI||cs.CI_APP_ID||cs.CI_BUILD_ID||cs.CI_BUILD_NUMBER||cs.CI_NAME||cs.CONTINUOUS_INTEGRATION||cs.RUN_ID||$a.name));function aV(t){return typeof t==\"string\"?!!cs[t]:\"env\"in t?cs[t.env]&&cs[t.env].includes(t.includes):\"any\"in t?t.any.some(function(e){return!!cs[e]}):Object.keys(t).every(function(e){return cs[e]===t[e]})}});var Hn,un,Z0,pT,MD,cV,hT,gT,OD=Et(()=>{(function(t){t.StartOfInput=\"\\0\",t.EndOfInput=\"\u0001\",t.EndOfPartialInput=\"\u0002\"})(Hn||(Hn={}));(function(t){t[t.InitialNode=0]=\"InitialNode\",t[t.SuccessNode=1]=\"SuccessNode\",t[t.ErrorNode=2]=\"ErrorNode\",t[t.CustomNode=3]=\"CustomNode\"})(un||(un={}));Z0=-1,pT=/^(-h|--help)(?:=([0-9]+))?$/,MD=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,cV=/^-[a-zA-Z]{2,}$/,hT=/^([^=]+)=([\\s\\S]*)$/,gT=process.env.DEBUG_CLI===\"1\"});var st,im,UD,dT,_D=Et(()=>{OD();st=class extends Error{constructor(e){super(e),this.clipanion={type:\"usage\"},this.name=\"UsageError\"}},im=class extends Error{constructor(e,r){if(super(),this.input=e,this.candidates=r,this.clipanion={type:\"none\"},this.name=\"UnknownSyntaxError\",this.candidates.length===0)this.message=\"Command not found, but we're not sure what's the alternative.\";else if(this.candidates.every(o=>o.reason!==null&&o.reason===r[0].reason)){let[{reason:o}]=this.candidates;this.message=`${o}\n\n${this.candidates.map(({usage:a})=>`$ ${a}`).join(`\n`)}`}else if(this.candidates.length===1){let[{usage:o}]=this.candidates;this.message=`Command not found; did you mean:\n\n$ ${o}\n${dT(e)}`}else this.message=`Command not found; did you mean one of:\n\n${this.candidates.map(({usage:o},a)=>`${`${a}.`.padStart(4)} ${o}`).join(`\n`)}\n\n${dT(e)}`}},UD=class extends Error{constructor(e,r){super(),this.input=e,this.usages=r,this.clipanion={type:\"none\"},this.name=\"AmbiguousSyntaxError\",this.message=`Cannot find which to pick amongst the following alternatives:\n\n${this.usages.map((o,a)=>`${`${a}.`.padStart(4)} ${o}`).join(`\n`)}\n\n${dT(e)}`}},dT=t=>`While running ${t.filter(e=>e!==Hn.EndOfInput&&e!==Hn.EndOfPartialInput).map(e=>{let r=JSON.stringify(e);return e.match(/\\s/)||e.length===0||r!==`\"${e}\"`?r:e}).join(\" \")}`});function Z6e(t){let e=t.split(`\n`),r=e.filter(a=>a.match(/\\S/)),o=r.length>0?r.reduce((a,n)=>Math.min(a,n.length-n.trimStart().length),Number.MAX_VALUE):0;return e.map(a=>a.slice(o).trimRight()).join(`\n`)}function Do(t,{format:e,paragraphs:r}){return t=t.replace(/\\r\\n?/g,`\n`),t=Z6e(t),t=t.replace(/^\\n+|\\n+$/g,\"\"),t=t.replace(/^(\\s*)-([^\\n]*?)\\n+/gm,`$1-$2\n\n`),t=t.replace(/\\n(\\n)?\\n*/g,(o,a)=>a||\" \"),r&&(t=t.split(/\\n/).map(o=>{let a=o.match(/^\\s*[*-][\\t ]+(.*)/);if(!a)return o.match(/(.{1,80})(?: |$)/g).join(`\n`);let n=o.length-o.trimStart().length;return a[1].match(new RegExp(`(.{1,${78-n}})(?: |$)`,\"g\")).map((u,A)=>\" \".repeat(n)+(A===0?\"- \":\"  \")+u).join(`\n`)}).join(`\n\n`)),t=t.replace(/(`+)((?:.|[\\n])*?)\\1/g,(o,a,n)=>e.code(a+n+a)),t=t.replace(/(\\*\\*)((?:.|[\\n])*?)\\1/g,(o,a,n)=>e.bold(a+n+a)),t?`${t}\n`:\"\"}var mT,uV,AV,yT=Et(()=>{mT=Array(80).fill(\"\\u2501\");for(let t=0;t<=24;++t)mT[mT.length-t]=`\\x1B[38;5;${232+t}m\\u2501`;uV={header:t=>`\\x1B[1m\\u2501\\u2501\\u2501 ${t}${t.length<75?` ${mT.slice(t.length+5).join(\"\")}`:\":\"}\\x1B[0m`,bold:t=>`\\x1B[1m${t}\\x1B[22m`,error:t=>`\\x1B[31m\\x1B[1m${t}\\x1B[22m\\x1B[39m`,code:t=>`\\x1B[36m${t}\\x1B[39m`},AV={header:t=>t,bold:t=>t,error:t=>t,code:t=>t}});function Ko(t){return{...t,[Uw]:!0}}function Gu(t,e){return typeof t>\"u\"?[t,e]:typeof t==\"object\"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function HD(t,{mergeName:e=!1}={}){let r=t.match(/^([^:]+): (.*)$/m);if(!r)return\"validation failed\";let[,o,a]=r;return e&&(a=a[0].toLowerCase()+a.slice(1)),a=o!==\".\"||!e?`${o.replace(/^\\.(\\[|$)/,\"$1\")}: ${a}`:`: ${a}`,a}function _w(t,e){return e.length===1?new st(`${t}${HD(e[0],{mergeName:!0})}`):new st(`${t}:\n${e.map(r=>`\n- ${HD(r)}`).join(\"\")}`)}function $0(t,e,r){if(typeof r>\"u\")return e;let o=[],a=[],n=A=>{let p=e;return e=A,n.bind(null,p)};if(!r(e,{errors:o,coercions:a,coercion:n}))throw _w(`Invalid value for ${t}`,o);for(let[,A]of a)A();return e}var Uw,yf=Et(()=>{_D();Uw=Symbol(\"clipanion/isOption\")});var Vo={};Vt(Vo,{KeyRelationship:()=>Yu,TypeAssertionError:()=>Yp,applyCascade:()=>jw,as:()=>mqe,assert:()=>hqe,assertWithErrors:()=>gqe,cascade:()=>YD,fn:()=>yqe,hasAtLeastOneKey:()=>DT,hasExactLength:()=>dV,hasForbiddenKeys:()=>Mqe,hasKeyRelationship:()=>Yw,hasMaxLength:()=>Cqe,hasMinLength:()=>Eqe,hasMutuallyExclusiveKeys:()=>Oqe,hasRequiredKeys:()=>Lqe,hasUniqueItems:()=>wqe,isArray:()=>qD,isAtLeast:()=>BT,isAtMost:()=>vqe,isBase64:()=>Fqe,isBoolean:()=>oqe,isDate:()=>lqe,isDict:()=>Aqe,isEnum:()=>Js,isHexColor:()=>Qqe,isISO8601:()=>kqe,isInExclusiveRange:()=>Pqe,isInInclusiveRange:()=>Dqe,isInstanceOf:()=>pqe,isInteger:()=>vT,isJSON:()=>Rqe,isLiteral:()=>pV,isLowerCase:()=>bqe,isMap:()=>uqe,isNegative:()=>Iqe,isNullable:()=>Nqe,isNumber:()=>wT,isObject:()=>hV,isOneOf:()=>IT,isOptional:()=>Tqe,isPartial:()=>fqe,isPayload:()=>aqe,isPositive:()=>Bqe,isRecord:()=>GD,isSet:()=>cqe,isString:()=>om,isTuple:()=>jD,isUUID4:()=>xqe,isUnknown:()=>CT,isUpperCase:()=>Sqe,makeTrait:()=>gV,makeValidator:()=>Hr,matchesRegExp:()=>qw,softAssert:()=>dqe});function qn(t){return t===null?\"null\":t===void 0?\"undefined\":t===\"\"?\"an empty string\":typeof t==\"symbol\"?`<${t.toString()}>`:Array.isArray(t)?\"an array\":JSON.stringify(t)}function sm(t,e){if(t.length===0)return\"nothing\";if(t.length===1)return qn(t[0]);let r=t.slice(0,-1),o=t[t.length-1],a=t.length>2?`, ${e} `:` ${e} `;return`${r.map(n=>qn(n)).join(\", \")}${a}${qn(o)}`}function Gp(t,e){var r,o,a;return typeof e==\"number\"?`${(r=t?.p)!==null&&r!==void 0?r:\".\"}[${e}]`:$6e.test(e)?`${(o=t?.p)!==null&&o!==void 0?o:\"\"}.${e}`:`${(a=t?.p)!==null&&a!==void 0?a:\".\"}[${JSON.stringify(e)}]`}function ET(t,e,r){return t===1?e:r}function pr({errors:t,p:e}={},r){return t?.push(`${e??\".\"}: ${r}`),!1}function iqe(t,e){return r=>{t[e]=r}}function Wu(t,e){return r=>{let o=t[e];return t[e]=r,Wu(t,e).bind(null,o)}}function Hw(t,e,r){let o=()=>(t(r()),a),a=()=>(t(e),o);return o}function CT(){return Hr({test:(t,e)=>!0})}function pV(t){return Hr({test:(e,r)=>e!==t?pr(r,`Expected ${qn(t)} (got ${qn(e)})`):!0})}function om(){return Hr({test:(t,e)=>typeof t!=\"string\"?pr(e,`Expected a string (got ${qn(t)})`):!0})}function Js(t){let e=Array.isArray(t)?t:Object.values(t),r=e.every(a=>typeof a==\"string\"||typeof a==\"number\"),o=new Set(e);return o.size===1?pV([...o][0]):Hr({test:(a,n)=>o.has(a)?!0:r?pr(n,`Expected one of ${sm(e,\"or\")} (got ${qn(a)})`):pr(n,`Expected a valid enumeration value (got ${qn(a)})`)})}function oqe(){return Hr({test:(t,e)=>{var r;if(typeof t!=\"boolean\"){if(typeof e?.coercions<\"u\"){if(typeof e?.coercion>\"u\")return pr(e,\"Unbound coercion result\");let o=sqe.get(t);if(typeof o<\"u\")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:\".\",e.coercion.bind(null,o)]),!0}return pr(e,`Expected a boolean (got ${qn(t)})`)}return!0}})}function wT(){return Hr({test:(t,e)=>{var r;if(typeof t!=\"number\"){if(typeof e?.coercions<\"u\"){if(typeof e?.coercion>\"u\")return pr(e,\"Unbound coercion result\");let o;if(typeof t==\"string\"){let a;try{a=JSON.parse(t)}catch{}if(typeof a==\"number\")if(JSON.stringify(a)===t)o=a;else return pr(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof o<\"u\")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:\".\",e.coercion.bind(null,o)]),!0}return pr(e,`Expected a number (got ${qn(t)})`)}return!0}})}function aqe(t){return Hr({test:(e,r)=>{var o;if(typeof r?.coercions>\"u\")return pr(r,\"The isPayload predicate can only be used with coercion enabled\");if(typeof r.coercion>\"u\")return pr(r,\"Unbound coercion result\");if(typeof e!=\"string\")return pr(r,`Expected a string (got ${qn(e)})`);let a;try{a=JSON.parse(e)}catch{return pr(r,`Expected a JSON string (got ${qn(e)})`)}let n={value:a};return t(a,Object.assign(Object.assign({},r),{coercion:Wu(n,\"value\")}))?(r.coercions.push([(o=r.p)!==null&&o!==void 0?o:\".\",r.coercion.bind(null,n.value)]),!0):!1}})}function lqe(){return Hr({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof e?.coercions<\"u\"){if(typeof e?.coercion>\"u\")return pr(e,\"Unbound coercion result\");let o;if(typeof t==\"string\"&&fV.test(t))o=new Date(t);else{let a;if(typeof t==\"string\"){let n;try{n=JSON.parse(t)}catch{}typeof n==\"number\"&&(a=n)}else typeof t==\"number\"&&(a=t);if(typeof a<\"u\")if(Number.isSafeInteger(a)||!Number.isSafeInteger(a*1e3))o=new Date(a*1e3);else return pr(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof o<\"u\")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:\".\",e.coercion.bind(null,o)]),!0}return pr(e,`Expected a date (got ${qn(t)})`)}return!0}})}function qD(t,{delimiter:e}={}){return Hr({test:(r,o)=>{var a;let n=r;if(typeof r==\"string\"&&typeof e<\"u\"&&typeof o?.coercions<\"u\"){if(typeof o?.coercion>\"u\")return pr(o,\"Unbound coercion result\");r=r.split(e)}if(!Array.isArray(r))return pr(o,`Expected an array (got ${qn(r)})`);let u=!0;for(let A=0,p=r.length;A<p&&(u=t(r[A],Object.assign(Object.assign({},o),{p:Gp(o,A),coercion:Wu(r,A)}))&&u,!(!u&&o?.errors==null));++A);return r!==n&&o.coercions.push([(a=o.p)!==null&&a!==void 0?a:\".\",o.coercion.bind(null,r)]),u}})}function cqe(t,{delimiter:e}={}){let r=qD(t,{delimiter:e});return Hr({test:(o,a)=>{var n,u;if(Object.getPrototypeOf(o).toString()===\"[object Set]\")if(typeof a?.coercions<\"u\"){if(typeof a?.coercion>\"u\")return pr(a,\"Unbound coercion result\");let A=[...o],p=[...o];if(!r(p,Object.assign(Object.assign({},a),{coercion:void 0})))return!1;let h=()=>p.some((E,I)=>E!==A[I])?new Set(p):o;return a.coercions.push([(n=a.p)!==null&&n!==void 0?n:\".\",Hw(a.coercion,o,h)]),!0}else{let A=!0;for(let p of o)if(A=t(p,Object.assign({},a))&&A,!A&&a?.errors==null)break;return A}if(typeof a?.coercions<\"u\"){if(typeof a?.coercion>\"u\")return pr(a,\"Unbound coercion result\");let A={value:o};return r(o,Object.assign(Object.assign({},a),{coercion:Wu(A,\"value\")}))?(a.coercions.push([(u=a.p)!==null&&u!==void 0?u:\".\",Hw(a.coercion,o,()=>new Set(A.value))]),!0):!1}return pr(a,`Expected a set (got ${qn(o)})`)}})}function uqe(t,e){let r=qD(jD([t,e])),o=GD(e,{keys:t});return Hr({test:(a,n)=>{var u,A,p;if(Object.getPrototypeOf(a).toString()===\"[object Map]\")if(typeof n?.coercions<\"u\"){if(typeof n?.coercion>\"u\")return pr(n,\"Unbound coercion result\");let h=[...a],E=[...a];if(!r(E,Object.assign(Object.assign({},n),{coercion:void 0})))return!1;let I=()=>E.some((v,x)=>v[0]!==h[x][0]||v[1]!==h[x][1])?new Map(E):a;return n.coercions.push([(u=n.p)!==null&&u!==void 0?u:\".\",Hw(n.coercion,a,I)]),!0}else{let h=!0;for(let[E,I]of a)if(h=t(E,Object.assign({},n))&&h,!h&&n?.errors==null||(h=e(I,Object.assign(Object.assign({},n),{p:Gp(n,E)}))&&h,!h&&n?.errors==null))break;return h}if(typeof n?.coercions<\"u\"){if(typeof n?.coercion>\"u\")return pr(n,\"Unbound coercion result\");let h={value:a};return Array.isArray(a)?r(a,Object.assign(Object.assign({},n),{coercion:void 0}))?(n.coercions.push([(A=n.p)!==null&&A!==void 0?A:\".\",Hw(n.coercion,a,()=>new Map(h.value))]),!0):!1:o(a,Object.assign(Object.assign({},n),{coercion:Wu(h,\"value\")}))?(n.coercions.push([(p=n.p)!==null&&p!==void 0?p:\".\",Hw(n.coercion,a,()=>new Map(Object.entries(h.value)))]),!0):!1}return pr(n,`Expected a map (got ${qn(a)})`)}})}function jD(t,{delimiter:e}={}){let r=dV(t.length);return Hr({test:(o,a)=>{var n;if(typeof o==\"string\"&&typeof e<\"u\"&&typeof a?.coercions<\"u\"){if(typeof a?.coercion>\"u\")return pr(a,\"Unbound coercion result\");o=o.split(e),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:\".\",a.coercion.bind(null,o)])}if(!Array.isArray(o))return pr(a,`Expected a tuple (got ${qn(o)})`);let u=r(o,Object.assign({},a));for(let A=0,p=o.length;A<p&&A<t.length&&(u=t[A](o[A],Object.assign(Object.assign({},a),{p:Gp(a,A),coercion:Wu(o,A)}))&&u,!(!u&&a?.errors==null));++A);return u}})}function GD(t,{keys:e=null}={}){let r=qD(jD([e??om(),t]));return Hr({test:(o,a)=>{var n;if(Array.isArray(o)&&typeof a?.coercions<\"u\")return typeof a?.coercion>\"u\"?pr(a,\"Unbound coercion result\"):r(o,Object.assign(Object.assign({},a),{coercion:void 0}))?(o=Object.fromEntries(o),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:\".\",a.coercion.bind(null,o)]),!0):!1;if(typeof o!=\"object\"||o===null)return pr(a,`Expected an object (got ${qn(o)})`);let u=Object.keys(o),A=!0;for(let p=0,h=u.length;p<h&&(A||a?.errors!=null);++p){let E=u[p],I=o[E];if(E===\"__proto__\"||E===\"constructor\"){A=pr(Object.assign(Object.assign({},a),{p:Gp(a,E)}),\"Unsafe property name\");continue}if(e!==null&&!e(E,a)){A=!1;continue}if(!t(I,Object.assign(Object.assign({},a),{p:Gp(a,E),coercion:Wu(o,E)}))){A=!1;continue}}return A}})}function Aqe(t,e={}){return GD(t,e)}function hV(t,{extra:e=null}={}){let r=Object.keys(t),o=Hr({test:(a,n)=>{if(typeof a!=\"object\"||a===null)return pr(n,`Expected an object (got ${qn(a)})`);let u=new Set([...r,...Object.keys(a)]),A={},p=!0;for(let h of u){if(h===\"constructor\"||h===\"__proto__\")p=pr(Object.assign(Object.assign({},n),{p:Gp(n,h)}),\"Unsafe property name\");else{let E=Object.prototype.hasOwnProperty.call(t,h)?t[h]:void 0,I=Object.prototype.hasOwnProperty.call(a,h)?a[h]:void 0;typeof E<\"u\"?p=E(I,Object.assign(Object.assign({},n),{p:Gp(n,h),coercion:Wu(a,h)}))&&p:e===null?p=pr(Object.assign(Object.assign({},n),{p:Gp(n,h)}),`Extraneous property (got ${qn(I)})`):Object.defineProperty(A,h,{enumerable:!0,get:()=>I,set:iqe(a,h)})}if(!p&&n?.errors==null)break}return e!==null&&(p||n?.errors!=null)&&(p=e(A,n)&&p),p}});return Object.assign(o,{properties:t})}function fqe(t){return hV(t,{extra:GD(CT())})}function gV(t){return()=>t}function Hr({test:t}){return gV(t)()}function hqe(t,e){if(!e(t))throw new Yp}function gqe(t,e){let r=[];if(!e(t,{errors:r}))throw new Yp({errors:r})}function dqe(t,e){}function mqe(t,e,{coerce:r=!1,errors:o,throw:a}={}){let n=o?[]:void 0;if(!r){if(e(t,{errors:n}))return a?t:{value:t,errors:void 0};if(a)throw new Yp({errors:n});return{value:void 0,errors:n??!0}}let u={value:t},A=Wu(u,\"value\"),p=[];if(!e(t,{errors:n,coercion:A,coercions:p})){if(a)throw new Yp({errors:n});return{value:void 0,errors:n??!0}}for(let[,h]of p)h();return a?u.value:{value:u.value,errors:void 0}}function yqe(t,e){let r=jD(t);return(...o)=>{if(!r(o))throw new Yp;return e(...o)}}function Eqe(t){return Hr({test:(e,r)=>e.length>=t?!0:pr(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)})}function Cqe(t){return Hr({test:(e,r)=>e.length<=t?!0:pr(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)})}function dV(t){return Hr({test:(e,r)=>e.length!==t?pr(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0})}function wqe({map:t}={}){return Hr({test:(e,r)=>{let o=new Set,a=new Set;for(let n=0,u=e.length;n<u;++n){let A=e[n],p=typeof t<\"u\"?t(A):A;if(o.has(p)){if(a.has(p))continue;pr(r,`Expected to contain unique elements; got a duplicate with ${qn(e)}`),a.add(p)}else o.add(p)}return a.size===0}})}function Iqe(){return Hr({test:(t,e)=>t<=0?!0:pr(e,`Expected to be negative (got ${t})`)})}function Bqe(){return Hr({test:(t,e)=>t>=0?!0:pr(e,`Expected to be positive (got ${t})`)})}function BT(t){return Hr({test:(e,r)=>e>=t?!0:pr(r,`Expected to be at least ${t} (got ${e})`)})}function vqe(t){return Hr({test:(e,r)=>e<=t?!0:pr(r,`Expected to be at most ${t} (got ${e})`)})}function Dqe(t,e){return Hr({test:(r,o)=>r>=t&&r<=e?!0:pr(o,`Expected to be in the [${t}; ${e}] range (got ${r})`)})}function Pqe(t,e){return Hr({test:(r,o)=>r>=t&&r<e?!0:pr(o,`Expected to be in the [${t}; ${e}[ range (got ${r})`)})}function vT({unsafe:t=!1}={}){return Hr({test:(e,r)=>e!==Math.round(e)?pr(r,`Expected to be an integer (got ${e})`):!t&&!Number.isSafeInteger(e)?pr(r,`Expected to be a safe integer (got ${e})`):!0})}function qw(t){return Hr({test:(e,r)=>t.test(e)?!0:pr(r,`Expected to match the pattern ${t.toString()} (got ${qn(e)})`)})}function bqe(){return Hr({test:(t,e)=>t!==t.toLowerCase()?pr(e,`Expected to be all-lowercase (got ${t})`):!0})}function Sqe(){return Hr({test:(t,e)=>t!==t.toUpperCase()?pr(e,`Expected to be all-uppercase (got ${t})`):!0})}function xqe(){return Hr({test:(t,e)=>nqe.test(t)?!0:pr(e,`Expected to be a valid UUID v4 (got ${qn(t)})`)})}function kqe(){return Hr({test:(t,e)=>fV.test(t)?!0:pr(e,`Expected to be a valid ISO 8601 date string (got ${qn(t)})`)})}function Qqe({alpha:t=!1}){return Hr({test:(e,r)=>(t?eqe.test(e):tqe.test(e))?!0:pr(r,`Expected to be a valid hexadecimal color string (got ${qn(e)})`)})}function Fqe(){return Hr({test:(t,e)=>rqe.test(t)?!0:pr(e,`Expected to be a valid base 64 string (got ${qn(t)})`)})}function Rqe(t=CT()){return Hr({test:(e,r)=>{let o;try{o=JSON.parse(e)}catch{return pr(r,`Expected to be a valid JSON string (got ${qn(e)})`)}return t(o,r)}})}function YD(t,...e){let r=Array.isArray(e[0])?e[0]:e;return Hr({test:(o,a)=>{var n,u;let A={value:o},p=typeof a?.coercions<\"u\"?Wu(A,\"value\"):void 0,h=typeof a?.coercions<\"u\"?[]:void 0;if(!t(o,Object.assign(Object.assign({},a),{coercion:p,coercions:h})))return!1;let E=[];if(typeof h<\"u\")for(let[,I]of h)E.push(I());try{if(typeof a?.coercions<\"u\"){if(A.value!==o){if(typeof a?.coercion>\"u\")return pr(a,\"Unbound coercion result\");a.coercions.push([(n=a.p)!==null&&n!==void 0?n:\".\",a.coercion.bind(null,A.value)])}(u=a?.coercions)===null||u===void 0||u.push(...h)}return r.every(I=>I(A.value,a))}finally{for(let I of E)I()}}})}function jw(t,...e){let r=Array.isArray(e[0])?e[0]:e;return YD(t,r)}function Tqe(t){return Hr({test:(e,r)=>typeof e>\"u\"?!0:t(e,r)})}function Nqe(t){return Hr({test:(e,r)=>e===null?!0:t(e,r)})}function Lqe(t,e){var r;let o=new Set(t),a=Gw[(r=e?.missingIf)!==null&&r!==void 0?r:\"missing\"];return Hr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)||p.push(h);return p.length>0?pr(u,`Missing required ${ET(p.length,\"property\",\"properties\")} ${sm(p,\"and\")}`):!0}})}function DT(t,e){var r;let o=new Set(t),a=Gw[(r=e?.missingIf)!==null&&r!==void 0?r:\"missing\"];return Hr({test:(n,u)=>Object.keys(n).some(h=>a(o,h,n))?!0:pr(u,`Missing at least one property from ${sm(Array.from(o),\"or\")}`)})}function Mqe(t,e){var r;let o=new Set(t),a=Gw[(r=e?.missingIf)!==null&&r!==void 0?r:\"missing\"];return Hr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)&&p.push(h);return p.length>0?pr(u,`Forbidden ${ET(p.length,\"property\",\"properties\")} ${sm(p,\"and\")}`):!0}})}function Oqe(t,e){var r;let o=new Set(t),a=Gw[(r=e?.missingIf)!==null&&r!==void 0?r:\"missing\"];return Hr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)&&p.push(h);return p.length>1?pr(u,`Mutually exclusive properties ${sm(p,\"and\")}`):!0}})}function Yw(t,e,r,o){var a,n;let u=new Set((a=o?.ignore)!==null&&a!==void 0?a:[]),A=Gw[(n=o?.missingIf)!==null&&n!==void 0?n:\"missing\"],p=new Set(r),h=Uqe[e],E=e===Yu.Forbids?\"or\":\"and\";return Hr({test:(I,v)=>{let x=new Set(Object.keys(I));if(!A(x,t,I)||u.has(I[t]))return!0;let C=[];for(let R of p)(A(x,R,I)&&!u.has(I[R]))!==h.expect&&C.push(R);return C.length>=1?pr(v,`Property \"${t}\" ${h.message} ${ET(C.length,\"property\",\"properties\")} ${sm(C,E)}`):!0}})}var $6e,eqe,tqe,rqe,nqe,fV,sqe,pqe,IT,Yp,Gw,Yu,Uqe,el=Et(()=>{$6e=/^[a-zA-Z_][a-zA-Z0-9_]*$/;eqe=/^#[0-9a-f]{6}$/i,tqe=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,rqe=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,nqe=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,fV=/^(?:[1-9]\\d{3}(-?)(?:(?:0[1-9]|1[0-2])\\1(?:0[1-9]|1\\d|2[0-8])|(?:0[13-9]|1[0-2])\\1(?:29|30)|(?:0[13578]|1[02])(?:\\1)31|00[1-9]|0[1-9]\\d|[12]\\d{2}|3(?:[0-5]\\d|6[0-5]))|(?:[1-9]\\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\\2)29|-?366))T(?:[01]\\d|2[0-3])(:?)[0-5]\\d(?:\\3[0-5]\\d)?(?:Z|[+-][01]\\d(?:\\3[0-5]\\d)?)$/;sqe=new Map([[\"true\",!0],[\"True\",!0],[\"1\",!0],[1,!0],[\"false\",!1],[\"False\",!1],[\"0\",!1],[0,!1]]);pqe=t=>Hr({test:(e,r)=>e instanceof t?!0:pr(r,`Expected an instance of ${t.name} (got ${qn(e)})`)}),IT=(t,{exclusive:e=!1}={})=>Hr({test:(r,o)=>{var a,n,u;let A=[],p=typeof o?.errors<\"u\"?[]:void 0;for(let h=0,E=t.length;h<E;++h){let I=typeof o?.errors<\"u\"?[]:void 0,v=typeof o?.coercions<\"u\"?[]:void 0;if(t[h](r,Object.assign(Object.assign({},o),{errors:I,coercions:v,p:`${(a=o?.p)!==null&&a!==void 0?a:\".\"}#${h+1}`}))){if(A.push([`#${h+1}`,v]),!e)break}else p?.push(I[0])}if(A.length===1){let[,h]=A[0];return typeof h<\"u\"&&((n=o?.coercions)===null||n===void 0||n.push(...h)),!0}return A.length>1?pr(o,`Expected to match exactly a single predicate (matched ${A.join(\", \")})`):(u=o?.errors)===null||u===void 0||u.push(...p),!1}});Yp=class extends Error{constructor({errors:e}={}){let r=\"Type mismatch\";if(e&&e.length>0){r+=`\n`;for(let o of e)r+=`\n- ${o}`}super(r)}};Gw={missing:(t,e)=>t.has(e),undefined:(t,e,r)=>t.has(e)&&typeof r[e]<\"u\",nil:(t,e,r)=>t.has(e)&&r[e]!=null,falsy:(t,e,r)=>t.has(e)&&!!r[e]};(function(t){t.Forbids=\"Forbids\",t.Requires=\"Requires\"})(Yu||(Yu={}));Uqe={[Yu.Forbids]:{expect:!1,message:\"forbids using\"},[Yu.Requires]:{expect:!0,message:\"requires using\"}}});var it,Wp=Et(()=>{yf();it=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(Array.isArray(r)){let{isDict:a,isUnknown:n,applyCascade:u}=await Promise.resolve().then(()=>(el(),Vo)),A=u(a(n()),r),p=[],h=[];if(!A(this,{errors:p,coercions:h}))throw _w(\"Invalid option schema\",p);for(let[,I]of h)I()}else if(r!=null)throw new Error(\"Invalid command schema\");let o=await this.execute();return typeof o<\"u\"?o:0}};it.isOption=Uw;it.Default=[]});function Pa(t){gT&&console.log(t)}function yV(){let t={nodes:[]};for(let e=0;e<un.CustomNode;++e)t.nodes.push(tl());return t}function _qe(t){let e=yV(),r=[],o=e.nodes.length;for(let a of t){r.push(o);for(let n=0;n<a.nodes.length;++n)CV(n)||e.nodes.push(Vqe(a.nodes[n],o));o+=a.nodes.length-un.CustomNode+1}for(let a of r)am(e,un.InitialNode,a);return e}function Oc(t,e){return t.nodes.push(e),t.nodes.length-1}function Hqe(t){let e=new Set,r=o=>{if(e.has(o))return;e.add(o);let a=t.nodes[o];for(let u of Object.values(a.statics))for(let{to:A}of u)r(A);for(let[,{to:u}]of a.dynamics)r(u);for(let{to:u}of a.shortcuts)r(u);let n=new Set(a.shortcuts.map(({to:u})=>u));for(;a.shortcuts.length>0;){let{to:u}=a.shortcuts.shift(),A=t.nodes[u];for(let[p,h]of Object.entries(A.statics)){let E=Object.prototype.hasOwnProperty.call(a.statics,p)?a.statics[p]:a.statics[p]=[];for(let I of h)E.some(({to:v})=>I.to===v)||E.push(I)}for(let[p,h]of A.dynamics)a.dynamics.some(([E,{to:I}])=>p===E&&h.to===I)||a.dynamics.push([p,h]);for(let p of A.shortcuts)n.has(p.to)||(a.shortcuts.push(p),n.add(p.to))}};r(un.InitialNode)}function qqe(t,{prefix:e=\"\"}={}){if(gT){Pa(`${e}Nodes are:`);for(let r=0;r<t.nodes.length;++r)Pa(`${e}  ${r}: ${JSON.stringify(t.nodes[r])}`)}}function jqe(t,e,r=!1){Pa(`Running a vm on ${JSON.stringify(e)}`);let o=[{node:un.InitialNode,state:{candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,options:[],path:[],positionals:[],remainder:null,selectedIndex:null,partial:!1,tokens:[]}}];qqe(t,{prefix:\"  \"});let a=[Hn.StartOfInput,...e];for(let n=0;n<a.length;++n){let u=a[n],A=u===Hn.EndOfInput||u===Hn.EndOfPartialInput,p=n-1;Pa(`  Processing ${JSON.stringify(u)}`);let h=[];for(let{node:E,state:I}of o){Pa(`    Current node is ${E}`);let v=t.nodes[E];if(E===un.ErrorNode){h.push({node:E,state:I});continue}console.assert(v.shortcuts.length===0,\"Shortcuts should have been eliminated by now\");let x=Object.prototype.hasOwnProperty.call(v.statics,u);if(!r||n<a.length-1||x)if(x){let C=v.statics[u];for(let{to:R,reducer:L}of C)h.push({node:R,state:typeof L<\"u\"?WD(bT,L,I,u,p):I}),Pa(`      Static transition to ${R} found`)}else Pa(\"      No static transition found\");else{let C=!1;for(let R of Object.keys(v.statics))if(R.startsWith(u)){if(u===R)for(let{to:L,reducer:U}of v.statics[R])h.push({node:L,state:typeof U<\"u\"?WD(bT,U,I,u,p):I}),Pa(`      Static transition to ${L} found`);else for(let{to:L}of v.statics[R])h.push({node:L,state:{...I,remainder:R.slice(u.length)}}),Pa(`      Static transition to ${L} found (partial match)`);C=!0}C||Pa(\"      No partial static transition found\")}if(!A)for(let[C,{to:R,reducer:L}]of v.dynamics)WD(zqe,C,I,u,p)&&(h.push({node:R,state:typeof L<\"u\"?WD(bT,L,I,u,p):I}),Pa(`      Dynamic transition to ${R} found (via ${C})`))}if(h.length===0&&A&&e.length===1)return[{node:un.InitialNode,state:mV}];if(h.length===0)throw new im(e,o.filter(({node:E})=>E!==un.ErrorNode).map(({state:E})=>({usage:E.candidateUsage,reason:null})));if(h.every(({node:E})=>E===un.ErrorNode))throw new im(e,h.map(({state:E})=>({usage:E.candidateUsage,reason:E.errorMessage})));o=Yqe(h)}if(o.length>0){Pa(\"  Results:\");for(let n of o)Pa(`    - ${n.node} -> ${JSON.stringify(n.state)}`)}else Pa(\"  No results\");return o}function Gqe(t,e,{endToken:r=Hn.EndOfInput}={}){let o=jqe(t,[...e,r]);return Wqe(e,o.map(({state:a})=>a))}function Yqe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function Wqe(t,e){let r=e.filter(v=>v.selectedIndex!==null),o=r.filter(v=>!v.partial);if(o.length>0&&(r=o),r.length===0)throw new Error;let a=r.filter(v=>v.selectedIndex===Z0||v.requiredOptions.every(x=>x.some(C=>v.options.find(R=>R.name===C))));if(a.length===0)throw new im(t,r.map(v=>({usage:v.candidateUsage,reason:null})));let n=0;for(let v of a)v.path.length>n&&(n=v.path.length);let u=a.filter(v=>v.path.length===n),A=v=>v.positionals.filter(({extra:x})=>!x).length+v.options.length,p=u.map(v=>({state:v,positionalCount:A(v)})),h=0;for(let{positionalCount:v}of p)v>h&&(h=v);let E=p.filter(({positionalCount:v})=>v===h).map(({state:v})=>v),I=Kqe(E);if(I.length>1)throw new UD(t,I.map(v=>v.candidateUsage));return I[0]}function Kqe(t){let e=[],r=[];for(let o of t)o.selectedIndex===Z0?r.push(o):e.push(o);return r.length>0&&e.push({...mV,path:EV(...r.map(o=>o.path)),options:r.reduce((o,a)=>o.concat(a.options),[])}),e}function EV(t,e,...r){return e===void 0?Array.from(t):EV(t.filter((o,a)=>o===e[a]),...r)}function tl(){return{dynamics:[],shortcuts:[],statics:{}}}function CV(t){return t===un.SuccessNode||t===un.ErrorNode}function PT(t,e=0){return{to:CV(t.to)?t.to:t.to>=un.CustomNode?t.to+e-un.CustomNode+1:t.to+e,reducer:t.reducer}}function Vqe(t,e=0){let r=tl();for(let[o,a]of t.dynamics)r.dynamics.push([o,PT(a,e)]);for(let o of t.shortcuts)r.shortcuts.push(PT(o,e));for(let[o,a]of Object.entries(t.statics))r.statics[o]=a.map(n=>PT(n,e));return r}function xs(t,e,r,o,a){t.nodes[e].dynamics.push([r,{to:o,reducer:a}])}function am(t,e,r,o){t.nodes[e].shortcuts.push({to:r,reducer:o})}function zo(t,e,r,o,a){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:o,reducer:a})}function WD(t,e,r,o,a){if(Array.isArray(e)){let[n,...u]=e;return t[n](r,o,a,...u)}else return t[e](r,o,a)}var mV,zqe,bT,rl,ST,KD,VD=Et(()=>{OD();_D();mV={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:Z0,partial:!1,tokens:[]};zqe={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!==\"-\"&&e.startsWith(\"-\"),isNotOptionLike:(t,e)=>t.ignoreOptions||e===\"-\"||!e.startsWith(\"-\"),isOption:(t,e,r,o)=>!t.ignoreOptions&&e===o,isBatchOption:(t,e,r,o)=>!t.ignoreOptions&&cV.test(e)&&[...e.slice(1)].every(a=>o.has(`-${a}`)),isBoundOption:(t,e,r,o,a)=>{let n=e.match(hT);return!t.ignoreOptions&&!!n&&MD.test(n[1])&&o.has(n[1])&&a.filter(u=>u.nameSet.includes(n[1])).every(u=>u.allowBinding)},isNegatedOption:(t,e,r,o)=>!t.ignoreOptions&&e===`--no-${o.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&pT.test(e),isUnsupportedOption:(t,e,r,o)=>!t.ignoreOptions&&e.startsWith(\"-\")&&MD.test(e)&&!o.has(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith(\"-\")&&!MD.test(e)},bT={setCandidateState:(t,e,r,o)=>({...t,...o}),setSelectedIndex:(t,e,r,o)=>({...t,selectedIndex:o}),setPartialIndex:(t,e,r,o)=>({...t,selectedIndex:o,partial:!0}),pushBatch:(t,e,r,o)=>{let a=t.options.slice(),n=t.tokens.slice();for(let u=1;u<e.length;++u){let A=o.get(`-${e[u]}`),p=u===1?[0,2]:[u,u+1];a.push({name:A,value:!0}),n.push({segmentIndex:r,type:\"option\",option:A,slice:p})}return{...t,options:a,tokens:n}},pushBound:(t,e,r)=>{let[,o,a]=e.match(hT),n=t.options.concat({name:o,value:a}),u=t.tokens.concat([{segmentIndex:r,type:\"option\",slice:[0,o.length],option:o},{segmentIndex:r,type:\"assign\",slice:[o.length,o.length+1]},{segmentIndex:r,type:\"value\",slice:[o.length+1,o.length+a.length+1]}]);return{...t,options:n,tokens:u}},pushPath:(t,e,r)=>{let o=t.path.concat(e),a=t.tokens.concat({segmentIndex:r,type:\"path\"});return{...t,path:o,tokens:a}},pushPositional:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:!1}),a=t.tokens.concat({segmentIndex:r,type:\"positional\"});return{...t,positionals:o,tokens:a}},pushExtra:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:!0}),a=t.tokens.concat({segmentIndex:r,type:\"positional\"});return{...t,positionals:o,tokens:a}},pushExtraNoLimits:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:rl}),a=t.tokens.concat({segmentIndex:r,type:\"positional\"});return{...t,positionals:o,tokens:a}},pushTrue:(t,e,r,o)=>{let a=t.options.concat({name:o,value:!0}),n=t.tokens.concat({segmentIndex:r,type:\"option\",option:o});return{...t,options:a,tokens:n}},pushFalse:(t,e,r,o)=>{let a=t.options.concat({name:o,value:!1}),n=t.tokens.concat({segmentIndex:r,type:\"option\",option:o});return{...t,options:a,tokens:n}},pushUndefined:(t,e,r,o)=>{let a=t.options.concat({name:e,value:void 0}),n=t.tokens.concat({segmentIndex:r,type:\"option\",option:e});return{...t,options:a,tokens:n}},pushStringValue:(t,e,r)=>{var o;let a=t.options[t.options.length-1],n=t.options.slice(),u=t.tokens.concat({segmentIndex:r,type:\"value\"});return a.value=((o=a.value)!==null&&o!==void 0?o:[]).concat([e]),{...t,options:n,tokens:u}},setStringValue:(t,e,r)=>{let o=t.options[t.options.length-1],a=t.options.slice(),n=t.tokens.concat({segmentIndex:r,type:\"value\"});return o.value=e,{...t,options:a,tokens:n}},inhibateOptions:t=>({...t,ignoreOptions:!0}),useHelp:(t,e,r,o)=>{let[,,a]=e.match(pT);return typeof a<\"u\"?{...t,options:[{name:\"-c\",value:String(o)},{name:\"-i\",value:a}]}:{...t,options:[{name:\"-c\",value:String(o)}]}},setError:(t,e,r,o)=>e===Hn.EndOfInput||e===Hn.EndOfPartialInput?{...t,errorMessage:`${o}.`}:{...t,errorMessage:`${o} (\"${e}\").`},setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return{...t,errorMessage:`Not enough arguments to option ${r.name}.`}}},rl=Symbol(),ST=class{constructor(e,r){this.allOptionNames=new Map,this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:o=this.arity.extra,proxy:a=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:o,proxy:a})}addPositional({name:e=\"arg\",required:r=!0}={}){if(!r&&this.arity.extra===rl)throw new Error(\"Optional parameters cannot be declared when using .rest() or .proxy()\");if(!r&&this.arity.trailing.length>0)throw new Error(\"Optional parameters cannot be declared after the required trailing positional arguments\");!r&&this.arity.extra!==rl?this.arity.extra.push(e):this.arity.extra!==rl&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e=\"arg\",required:r=0}={}){if(this.arity.extra===rl)throw new Error(\"Infinite lists cannot be declared multiple times in the same command\");if(this.arity.trailing.length>0)throw new Error(\"Infinite lists cannot be declared after the required trailing positional arguments\");for(let o=0;o<r;++o)this.addPositional({name:e});this.arity.extra=rl}addProxy({required:e=0}={}){this.addRest({required:e}),this.arity.proxy=!0}addOption({names:e,description:r,arity:o=0,hidden:a=!1,required:n=!1,allowBinding:u=!0}){if(!u&&o>1)throw new Error(\"The arity cannot be higher than 1 when the option only supports the --arg=value syntax\");if(!Number.isInteger(o))throw new Error(`The arity must be an integer, got ${o}`);if(o<0)throw new Error(`The arity must be positive, got ${o}`);let A=e.reduce((p,h)=>h.length>p.length?h:p,\"\");for(let p of e)this.allOptionNames.set(p,A);this.options.push({preferredName:A,nameSet:e,description:r,arity:o,hidden:a,required:n,allowBinding:u})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let o=[this.cliOpts.binaryName],a=[];if(this.paths.length>0&&o.push(...this.paths[0]),e){for(let{preferredName:u,nameSet:A,arity:p,hidden:h,description:E,required:I}of this.options){if(h)continue;let v=[];for(let C=0;C<p;++C)v.push(` #${C}`);let x=`${A.join(\",\")}${v.join(\"\")}`;!r&&E?a.push({preferredName:u,nameSet:A,definition:x,description:E,required:I}):o.push(I?`<${x}>`:`[${x}]`)}o.push(...this.arity.leading.map(u=>`<${u}>`)),this.arity.extra===rl?o.push(\"...\"):o.push(...this.arity.extra.map(u=>`[${u}]`)),o.push(...this.arity.trailing.map(u=>`<${u}>`))}return{usage:o.join(\" \"),options:a}}compile(){if(typeof this.context>\"u\")throw new Error(\"Assertion failed: No context attached\");let e=yV(),r=un.InitialNode,o=this.usage().usage,a=this.options.filter(A=>A.required).map(A=>A.nameSet);r=Oc(e,tl()),zo(e,un.InitialNode,Hn.StartOfInput,r,[\"setCandidateState\",{candidateUsage:o,requiredOptions:a}]);let n=this.arity.proxy?\"always\":\"isNotOptionLike\",u=this.paths.length>0?this.paths:[[]];for(let A of u){let p=r;if(A.length>0){let v=Oc(e,tl());am(e,p,v),this.registerOptions(e,v),p=v}for(let v=0;v<A.length;++v){let x=Oc(e,tl());zo(e,p,A[v],x,\"pushPath\"),p=x}if(this.arity.leading.length>0||!this.arity.proxy){let v=Oc(e,tl());xs(e,p,\"isHelp\",v,[\"useHelp\",this.cliIndex]),xs(e,v,\"always\",v,\"pushExtra\"),zo(e,v,Hn.EndOfInput,un.SuccessNode,[\"setSelectedIndex\",Z0]),this.registerOptions(e,p)}this.arity.leading.length>0&&(zo(e,p,Hn.EndOfInput,un.ErrorNode,[\"setError\",\"Not enough positional arguments\"]),zo(e,p,Hn.EndOfPartialInput,un.SuccessNode,[\"setPartialIndex\",this.cliIndex]));let h=p;for(let v=0;v<this.arity.leading.length;++v){let x=Oc(e,tl());(!this.arity.proxy||v+1!==this.arity.leading.length)&&this.registerOptions(e,x),(this.arity.trailing.length>0||v+1!==this.arity.leading.length)&&(zo(e,x,Hn.EndOfInput,un.ErrorNode,[\"setError\",\"Not enough positional arguments\"]),zo(e,x,Hn.EndOfPartialInput,un.SuccessNode,[\"setPartialIndex\",this.cliIndex])),xs(e,h,\"isNotOptionLike\",x,\"pushPositional\"),h=x}let E=h;if(this.arity.extra===rl||this.arity.extra.length>0){let v=Oc(e,tl());if(am(e,h,v),this.arity.extra===rl){let x=Oc(e,tl());this.arity.proxy||this.registerOptions(e,x),xs(e,h,n,x,\"pushExtraNoLimits\"),xs(e,x,n,x,\"pushExtraNoLimits\"),am(e,x,v)}else for(let x=0;x<this.arity.extra.length;++x){let C=Oc(e,tl());(!this.arity.proxy||x>0)&&this.registerOptions(e,C),xs(e,E,n,C,\"pushExtra\"),am(e,C,v),E=C}E=v}this.arity.trailing.length>0&&(zo(e,E,Hn.EndOfInput,un.ErrorNode,[\"setError\",\"Not enough positional arguments\"]),zo(e,E,Hn.EndOfPartialInput,un.SuccessNode,[\"setPartialIndex\",this.cliIndex]));let I=E;for(let v=0;v<this.arity.trailing.length;++v){let x=Oc(e,tl());this.arity.proxy||this.registerOptions(e,x),v+1<this.arity.trailing.length&&(zo(e,x,Hn.EndOfInput,un.ErrorNode,[\"setError\",\"Not enough positional arguments\"]),zo(e,x,Hn.EndOfPartialInput,un.SuccessNode,[\"setPartialIndex\",this.cliIndex])),xs(e,I,\"isNotOptionLike\",x,\"pushPositional\"),I=x}xs(e,I,n,un.ErrorNode,[\"setError\",\"Extraneous positional argument\"]),zo(e,I,Hn.EndOfInput,un.SuccessNode,[\"setSelectedIndex\",this.cliIndex]),zo(e,I,Hn.EndOfPartialInput,un.SuccessNode,[\"setSelectedIndex\",this.cliIndex])}return{machine:e,context:this.context}}registerOptions(e,r){xs(e,r,[\"isOption\",\"--\"],r,\"inhibateOptions\"),xs(e,r,[\"isBatchOption\",this.allOptionNames],r,[\"pushBatch\",this.allOptionNames]),xs(e,r,[\"isBoundOption\",this.allOptionNames,this.options],r,\"pushBound\"),xs(e,r,[\"isUnsupportedOption\",this.allOptionNames],un.ErrorNode,[\"setError\",\"Unsupported option name\"]),xs(e,r,[\"isInvalidOption\"],un.ErrorNode,[\"setError\",\"Invalid option name\"]);for(let o of this.options)if(o.arity===0)for(let a of o.nameSet)xs(e,r,[\"isOption\",a],r,[\"pushTrue\",o.preferredName]),a.startsWith(\"--\")&&!a.startsWith(\"--no-\")&&xs(e,r,[\"isNegatedOption\",a],r,[\"pushFalse\",o.preferredName]);else{let a=Oc(e,tl());for(let n of o.nameSet)xs(e,r,[\"isOption\",n],a,[\"pushUndefined\",o.preferredName]);for(let n=0;n<o.arity;++n){let u=Oc(e,tl());zo(e,a,Hn.EndOfInput,un.ErrorNode,\"setOptionArityError\"),zo(e,a,Hn.EndOfPartialInput,un.ErrorNode,\"setOptionArityError\"),xs(e,a,\"isOptionLike\",un.ErrorNode,\"setOptionArityError\");let A=o.arity===1?\"setStringValue\":\"pushStringValue\";xs(e,a,\"isNotOptionLike\",u,A),a=u}am(e,a,r)}}},KD=class t{constructor({binaryName:e=\"...\"}={}){this.builders=[],this.opts={binaryName:e}}static build(e,r={}){return new t(r).commands(e).compile()}getBuilderByIndex(e){if(!(e>=0&&e<this.builders.length))throw new Error(`Assertion failed: Out-of-bound command index (${e})`);return this.builders[e]}commands(e){for(let r of e)r(this.command());return this}command(){let e=new ST(this.builders.length,this.opts);return this.builders.push(e),e}compile(){let e=[],r=[];for(let a of this.builders){let{machine:n,context:u}=a.compile();e.push(n),r.push(u)}let o=_qe(e);return Hqe(o),{machine:o,contexts:r,process:(a,{partial:n}={})=>{let u=n?Hn.EndOfPartialInput:Hn.EndOfInput;return Gqe(o,a,{endToken:u})}}}}});function IV(){return zD.default&&\"getColorDepth\"in zD.default.WriteStream.prototype?zD.default.WriteStream.prototype.getColorDepth():process.env.FORCE_COLOR===\"0\"?1:process.env.FORCE_COLOR===\"1\"||typeof process.stdout<\"u\"&&process.stdout.isTTY?8:1}function BV(t){let e=wV;if(typeof e>\"u\"){if(t.stdout===process.stdout&&t.stderr===process.stderr)return null;let{AsyncLocalStorage:r}=ve(\"async_hooks\");e=wV=new r;let o=process.stdout._write;process.stdout._write=function(n,u,A){let p=e.getStore();return typeof p>\"u\"?o.call(this,n,u,A):p.stdout.write(n,u,A)};let a=process.stderr._write;process.stderr._write=function(n,u,A){let p=e.getStore();return typeof p>\"u\"?a.call(this,n,u,A):p.stderr.write(n,u,A)}}return r=>e.run(t,r)}var zD,wV,vV=Et(()=>{zD=Ze(ve(\"tty\"),1)});var JD,DV=Et(()=>{Wp();JD=class t extends it{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,r){let o=new t(r);o.path=e.path;for(let a of e.options)switch(a.name){case\"-c\":o.commands.push(Number(a.value));break;case\"-i\":o.index=Number(a.value);break}return o}async execute(){let e=this.commands;if(typeof this.index<\"u\"&&this.index>=0&&this.index<e.length&&(e=[e[this.index]]),e.length===0)this.context.stdout.write(this.cli.usage());else if(e.length===1)this.context.stdout.write(this.cli.usage(this.contexts[e[0]].commandClass,{detailed:!0}));else if(e.length>1){this.context.stdout.write(`Multiple commands match your selection:\n`),this.context.stdout.write(`\n`);let r=0;for(let o of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[o].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(`\n`),this.context.stdout.write(`Run again with -h=<index> to see the longer details of any of those commands.\n`)}}}});async function SV(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}=kV(t);return Jo.from(r,e).runExit(o,a)}async function xV(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}=kV(t);return Jo.from(r,e).run(o,a)}function kV(t){let e,r,o,a;switch(typeof process<\"u\"&&typeof process.argv<\"u\"&&(o=process.argv.slice(2)),t.length){case 1:r=t[0];break;case 2:t[0]&&t[0].prototype instanceof it||Array.isArray(t[0])?(r=t[0],Array.isArray(t[1])?o=t[1]:a=t[1]):(e=t[0],r=t[1]);break;case 3:Array.isArray(t[2])?(e=t[0],r=t[1],o=t[2]):t[0]&&t[0].prototype instanceof it||Array.isArray(t[0])?(r=t[0],o=t[1],a=t[2]):(e=t[0],r=t[1],a=t[2]);break;default:e=t[0],r=t[1],o=t[2],a=t[3];break}if(typeof o>\"u\")throw new Error(\"The argv parameter must be provided when running Clipanion outside of a Node context\");return{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}}function bV(t){return t()}var PV,Jo,QV=Et(()=>{OD();VD();yT();vV();Wp();DV();PV=Symbol(\"clipanion/errorCommand\");Jo=class t{constructor({binaryLabel:e,binaryName:r=\"...\",binaryVersion:o,enableCapture:a=!1,enableColors:n}={}){this.registrations=new Map,this.builder=new KD({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=o,this.enableCapture=a,this.enableColors=n}static from(e,r={}){let o=new t(r),a=Array.isArray(e)?e:[e];for(let n of a)o.register(n);return o}register(e){var r;let o=new Map,a=new e;for(let p in a){let h=a[p];typeof h==\"object\"&&h!==null&&h[it.isOption]&&o.set(p,h)}let n=this.builder.command(),u=n.cliIndex,A=(r=e.paths)!==null&&r!==void 0?r:a.paths;if(typeof A<\"u\")for(let p of A)n.addPath(p);this.registrations.set(e,{specs:o,builder:n,index:u});for(let[p,{definition:h}]of o.entries())h(n,p);n.setContext({commandClass:e})}process(e,r){let{input:o,context:a,partial:n}=typeof e==\"object\"&&Array.isArray(e)?{input:e,context:r}:e,{contexts:u,process:A}=this.builder.compile(),p=A(o,{partial:n}),h={...t.defaultContext,...a};switch(p.selectedIndex){case Z0:{let E=JD.from(p,u);return E.context=h,E.tokens=p.tokens,E}default:{let{commandClass:E}=u[p.selectedIndex],I=this.registrations.get(E);if(typeof I>\"u\")throw new Error(\"Assertion failed: Expected the command class to have been registered.\");let v=new E;v.context=h,v.tokens=p.tokens,v.path=p.path;try{for(let[x,{transformer:C}]of I.specs.entries())v[x]=C(I.builder,x,p,h);return v}catch(x){throw x[PV]=v,x}}break}}async run(e,r){var o,a;let n,u={...t.defaultContext,...r},A=(o=this.enableColors)!==null&&o!==void 0?o:u.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e,u)}catch(E){return u.stdout.write(this.error(E,{colored:A})),1}if(n.help)return u.stdout.write(this.usage(n,{colored:A,detailed:!0})),0;n.context=u,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),definition:E=>this.definition(E),error:(E,I)=>this.error(E,I),format:E=>this.format(E),process:(E,I)=>this.process(E,{...u,...I}),run:(E,I)=>this.run(E,{...u,...I}),usage:(E,I)=>this.usage(E,I)};let p=this.enableCapture&&(a=BV(u))!==null&&a!==void 0?a:bV,h;try{h=await p(()=>n.validateAndExecute().catch(E=>n.catch(E).then(()=>0)))}catch(E){return u.stdout.write(this.error(E,{colored:A,command:n})),1}return h}async runExit(e,r){process.exitCode=await this.run(e,r)}definition(e,{colored:r=!1}={}){if(!e.usage)return null;let{usage:o}=this.getUsageByRegistration(e,{detailed:!1}),{usage:a,options:n}=this.getUsageByRegistration(e,{detailed:!0,inlineOptions:!1}),u=typeof e.usage.category<\"u\"?Do(e.usage.category,{format:this.format(r),paragraphs:!1}):void 0,A=typeof e.usage.description<\"u\"?Do(e.usage.description,{format:this.format(r),paragraphs:!1}):void 0,p=typeof e.usage.details<\"u\"?Do(e.usage.details,{format:this.format(r),paragraphs:!0}):void 0,h=typeof e.usage.examples<\"u\"?e.usage.examples.map(([E,I])=>[Do(E,{format:this.format(r),paragraphs:!1}),I.replace(/\\$0/g,this.binaryName)]):void 0;return{path:o,usage:a,category:u,description:A,details:p,examples:h,options:n}}definitions({colored:e=!1}={}){let r=[];for(let o of this.registrations.keys()){let a=this.definition(o,{colored:e});a&&r.push(a)}return r}usage(e=null,{colored:r,detailed:o=!1,prefix:a=\"$ \"}={}){var n;if(e===null){for(let p of this.registrations.keys()){let h=p.paths,E=typeof p.usage<\"u\";if(!h||h.length===0||h.length===1&&h[0].length===0||((n=h?.some(x=>x.length===0))!==null&&n!==void 0?n:!1))if(e){e=null;break}else e=p;else if(E){e=null;continue}}e&&(o=!0)}let u=e!==null&&e instanceof it?e.constructor:e,A=\"\";if(u)if(o){let{description:p=\"\",details:h=\"\",examples:E=[]}=u.usage||{};p!==\"\"&&(A+=Do(p,{format:this.format(r),paragraphs:!1}).replace(/^./,x=>x.toUpperCase()),A+=`\n`),(h!==\"\"||E.length>0)&&(A+=`${this.format(r).header(\"Usage\")}\n`,A+=`\n`);let{usage:I,options:v}=this.getUsageByRegistration(u,{inlineOptions:!1});if(A+=`${this.format(r).bold(a)}${I}\n`,v.length>0){A+=`\n`,A+=`${this.format(r).header(\"Options\")}\n`;let x=v.reduce((C,R)=>Math.max(C,R.definition.length),0);A+=`\n`;for(let{definition:C,description:R}of v)A+=`  ${this.format(r).bold(C.padEnd(x))}    ${Do(R,{format:this.format(r),paragraphs:!1})}`}if(h!==\"\"&&(A+=`\n`,A+=`${this.format(r).header(\"Details\")}\n`,A+=`\n`,A+=Do(h,{format:this.format(r),paragraphs:!0})),E.length>0){A+=`\n`,A+=`${this.format(r).header(\"Examples\")}\n`;for(let[x,C]of E)A+=`\n`,A+=Do(x,{format:this.format(r),paragraphs:!1}),A+=`${C.replace(/^/m,`  ${this.format(r).bold(a)}`).replace(/\\$0/g,this.binaryName)}\n`}}else{let{usage:p}=this.getUsageByRegistration(u);A+=`${this.format(r).bold(a)}${p}\n`}else{let p=new Map;for(let[v,{index:x}]of this.registrations.entries()){if(typeof v.usage>\"u\")continue;let C=typeof v.usage.category<\"u\"?Do(v.usage.category,{format:this.format(r),paragraphs:!1}):null,R=p.get(C);typeof R>\"u\"&&p.set(C,R=[]);let{usage:L}=this.getUsageByIndex(x);R.push({commandClass:v,usage:L})}let h=Array.from(p.keys()).sort((v,x)=>v===null?-1:x===null?1:v.localeCompare(x,\"en\",{usage:\"sort\",caseFirst:\"upper\"})),E=typeof this.binaryLabel<\"u\",I=typeof this.binaryVersion<\"u\";E||I?(E&&I?A+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)}\n\n`:E?A+=`${this.format(r).header(`${this.binaryLabel}`)}\n`:A+=`${this.format(r).header(`${this.binaryVersion}`)}\n`,A+=`  ${this.format(r).bold(a)}${this.binaryName} <command>\n`):A+=`${this.format(r).bold(a)}${this.binaryName} <command>\n`;for(let v of h){let x=p.get(v).slice().sort((R,L)=>R.usage.localeCompare(L.usage,\"en\",{usage:\"sort\",caseFirst:\"upper\"})),C=v!==null?v.trim():\"General commands\";A+=`\n`,A+=`${this.format(r).header(`${C}`)}\n`;for(let{commandClass:R,usage:L}of x){let U=R.usage.description||\"undocumented\";A+=`\n`,A+=`  ${this.format(r).bold(L)}\n`,A+=`    ${Do(U,{format:this.format(r),paragraphs:!1})}`}}A+=`\n`,A+=Do(\"You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.\",{format:this.format(r),paragraphs:!0})}return A}error(e,r){var o,{colored:a,command:n=(o=e[PV])!==null&&o!==void 0?o:null}=r===void 0?{}:r;(!e||typeof e!=\"object\"||!(\"stack\"in e))&&(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let u=\"\",A=e.name.replace(/([a-z])([A-Z])/g,\"$1 $2\");A===\"Error\"&&(A=\"Internal Error\"),u+=`${this.format(a).error(A)}: ${e.message}\n`;let p=e.clipanion;return typeof p<\"u\"?p.type===\"usage\"&&(u+=`\n`,u+=this.usage(n)):e.stack&&(u+=`${e.stack.replace(/^.*\\n/,\"\")}\n`),u}format(e){var r;return((r=e??this.enableColors)!==null&&r!==void 0?r:t.defaultContext.colorDepth>1)?uV:AV}getUsageByRegistration(e,r){let o=this.registrations.get(e);if(typeof o>\"u\")throw new Error(\"Assertion failed: Unregistered command\");return this.getUsageByIndex(o.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}};Jo.defaultContext={env:process.env,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:IV()}});var Ww,FV=Et(()=>{Wp();Ww=class extends it{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)}\n`)}};Ww.paths=[[\"--clipanion=definitions\"]]});var Kw,RV=Et(()=>{Wp();Kw=class extends it{async execute(){this.context.stdout.write(this.cli.usage())}};Kw.paths=[[\"-h\"],[\"--help\"]]});function XD(t={}){return Ko({definition(e,r){var o;e.addProxy({name:(o=t.name)!==null&&o!==void 0?o:r,required:t.required})},transformer(e,r,o){return o.positionals.map(({value:a})=>a)}})}var xT=Et(()=>{yf()});var Vw,TV=Et(()=>{Wp();xT();Vw=class extends it{constructor(){super(...arguments),this.args=XD()}async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.process(this.args).tokens,null,2)}\n`)}};Vw.paths=[[\"--clipanion=tokens\"]]});var zw,NV=Et(()=>{Wp();zw=class extends it{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:\"<unknown>\"}\n`)}};zw.paths=[[\"-v\"],[\"--version\"]]});var kT={};Vt(kT,{DefinitionsCommand:()=>Ww,HelpCommand:()=>Kw,TokensCommand:()=>Vw,VersionCommand:()=>zw});var LV=Et(()=>{FV();RV();TV();NV()});function MV(t,e,r){let[o,a]=Gu(e,r??{}),{arity:n=1}=a,u=t.split(\",\"),A=new Set(u);return Ko({definition(p){p.addOption({names:u,arity:n,hidden:a?.hidden,description:a?.description,required:a.required})},transformer(p,h,E){let I,v=typeof o<\"u\"?[...o]:void 0;for(let{name:x,value:C}of E.options)A.has(x)&&(I=x,v=v??[],v.push(C));return typeof v<\"u\"?$0(I??h,v,a.validator):v}})}var OV=Et(()=>{yf()});function UV(t,e,r){let[o,a]=Gu(e,r??{}),n=t.split(\",\"),u=new Set(n);return Ko({definition(A){A.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(A,p,h){let E=o;for(let{name:I,value:v}of h.options)u.has(I)&&(E=v);return E}})}var _V=Et(()=>{yf()});function HV(t,e,r){let[o,a]=Gu(e,r??{}),n=t.split(\",\"),u=new Set(n);return Ko({definition(A){A.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(A,p,h){let E=o;for(let{name:I,value:v}of h.options)u.has(I)&&(E??(E=0),v?E+=1:E=0);return E}})}var qV=Et(()=>{yf()});function jV(t={}){return Ko({definition(e,r){var o;e.addRest({name:(o=t.name)!==null&&o!==void 0?o:r,required:t.required})},transformer(e,r,o){let a=u=>{let A=o.positionals[u];return A.extra===rl||A.extra===!1&&u<e.arity.leading.length},n=0;for(;n<o.positionals.length&&a(n);)n+=1;return o.positionals.splice(0,n).map(({value:u})=>u)}})}var GV=Et(()=>{VD();yf()});function Jqe(t,e,r){let[o,a]=Gu(e,r??{}),{arity:n=1}=a,u=t.split(\",\"),A=new Set(u);return Ko({definition(p){p.addOption({names:u,arity:a.tolerateBoolean?0:n,hidden:a.hidden,description:a.description,required:a.required})},transformer(p,h,E,I){let v,x=o;typeof a.env<\"u\"&&I.env[a.env]&&(v=a.env,x=I.env[a.env]);for(let{name:C,value:R}of E.options)A.has(C)&&(v=C,x=R);return typeof x==\"string\"?$0(v??h,x,a.validator):x}})}function Xqe(t={}){let{required:e=!0}=t;return Ko({definition(r,o){var a;r.addPositional({name:(a=t.name)!==null&&a!==void 0?a:o,required:t.required})},transformer(r,o,a){var n;for(let u=0;u<a.positionals.length;++u){if(a.positionals[u].extra===rl||e&&a.positionals[u].extra===!0||!e&&a.positionals[u].extra===!1)continue;let[A]=a.positionals.splice(u,1);return $0((n=t.name)!==null&&n!==void 0?n:o,A.value,t.validator)}}})}function YV(t,...e){return typeof t==\"string\"?Jqe(t,...e):Xqe(t)}var WV=Et(()=>{VD();yf()});var ge={};Vt(ge,{Array:()=>MV,Boolean:()=>UV,Counter:()=>HV,Proxy:()=>XD,Rest:()=>jV,String:()=>YV,applyValidator:()=>$0,cleanValidationError:()=>HD,formatError:()=>_w,isOptionSymbol:()=>Uw,makeCommandOption:()=>Ko,rerouteArguments:()=>Gu});var KV=Et(()=>{yf();xT();OV();_V();qV();GV();WV()});var Jw={};Vt(Jw,{Builtins:()=>kT,Cli:()=>Jo,Command:()=>it,Option:()=>ge,UsageError:()=>st,formatMarkdownish:()=>Do,run:()=>xV,runExit:()=>SV});var qt=Et(()=>{_D();yT();Wp();QV();LV();KV()});var VV=_((Tkt,Zqe)=>{Zqe.exports={name:\"dotenv\",version:\"16.3.1\",description:\"Loads environment variables from .env file\",main:\"lib/main.js\",types:\"lib/main.d.ts\",exports:{\".\":{types:\"./lib/main.d.ts\",require:\"./lib/main.js\",default:\"./lib/main.js\"},\"./config\":\"./config.js\",\"./config.js\":\"./config.js\",\"./lib/env-options\":\"./lib/env-options.js\",\"./lib/env-options.js\":\"./lib/env-options.js\",\"./lib/cli-options\":\"./lib/cli-options.js\",\"./lib/cli-options.js\":\"./lib/cli-options.js\",\"./package.json\":\"./package.json\"},scripts:{\"dts-check\":\"tsc --project tests/types/tsconfig.json\",lint:\"standard\",\"lint-readme\":\"standard-markdown\",pretest:\"npm run lint && npm run dts-check\",test:\"tap tests/*.js --100 -Rspec\",prerelease:\"npm test\",release:\"standard-version\"},repository:{type:\"git\",url:\"git://github.com/motdotla/dotenv.git\"},funding:\"https://github.com/motdotla/dotenv?sponsor=1\",keywords:[\"dotenv\",\"env\",\".env\",\"environment\",\"variables\",\"config\",\"settings\"],readmeFilename:\"README.md\",license:\"BSD-2-Clause\",devDependencies:{\"@definitelytyped/dtslint\":\"^0.0.133\",\"@types/node\":\"^18.11.3\",decache:\"^4.6.1\",sinon:\"^14.0.1\",standard:\"^17.0.0\",\"standard-markdown\":\"^7.1.0\",\"standard-version\":\"^9.5.0\",tap:\"^16.3.0\",tar:\"^6.1.11\",typescript:\"^4.8.4\"},engines:{node:\">=12\"},browser:{fs:!1}}});var ZV=_((Nkt,Ef)=>{var zV=ve(\"fs\"),FT=ve(\"path\"),$qe=ve(\"os\"),eje=ve(\"crypto\"),tje=VV(),RT=tje.version,rje=/(?:^|^)\\s*(?:export\\s+)?([\\w.-]+)(?:\\s*=\\s*?|:\\s+?)(\\s*'(?:\\\\'|[^'])*'|\\s*\"(?:\\\\\"|[^\"])*\"|\\s*`(?:\\\\`|[^`])*`|[^#\\r\\n]+)?\\s*(?:#.*)?(?:$|$)/mg;function nje(t){let e={},r=t.toString();r=r.replace(/\\r\\n?/mg,`\n`);let o;for(;(o=rje.exec(r))!=null;){let a=o[1],n=o[2]||\"\";n=n.trim();let u=n[0];n=n.replace(/^(['\"`])([\\s\\S]*)\\1$/mg,\"$2\"),u==='\"'&&(n=n.replace(/\\\\n/g,`\n`),n=n.replace(/\\\\r/g,\"\\r\")),e[a]=n}return e}function ije(t){let e=XV(t),r=ks.configDotenv({path:e});if(!r.parsed)throw new Error(`MISSING_DATA: Cannot parse ${e} for an unknown reason`);let o=JV(t).split(\",\"),a=o.length,n;for(let u=0;u<a;u++)try{let A=o[u].trim(),p=aje(r,A);n=ks.decrypt(p.ciphertext,p.key);break}catch(A){if(u+1>=a)throw A}return ks.parse(n)}function sje(t){console.log(`[dotenv@${RT}][INFO] ${t}`)}function oje(t){console.log(`[dotenv@${RT}][WARN] ${t}`)}function QT(t){console.log(`[dotenv@${RT}][DEBUG] ${t}`)}function JV(t){return t&&t.DOTENV_KEY&&t.DOTENV_KEY.length>0?t.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:\"\"}function aje(t,e){let r;try{r=new URL(e)}catch(A){throw A.code===\"ERR_INVALID_URL\"?new Error(\"INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenv.org/vault/.env.vault?environment=development\"):A}let o=r.password;if(!o)throw new Error(\"INVALID_DOTENV_KEY: Missing key part\");let a=r.searchParams.get(\"environment\");if(!a)throw new Error(\"INVALID_DOTENV_KEY: Missing environment part\");let n=`DOTENV_VAULT_${a.toUpperCase()}`,u=t.parsed[n];if(!u)throw new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${n} in your .env.vault file.`);return{ciphertext:u,key:o}}function XV(t){let e=FT.resolve(process.cwd(),\".env\");return t&&t.path&&t.path.length>0&&(e=t.path),e.endsWith(\".vault\")?e:`${e}.vault`}function lje(t){return t[0]===\"~\"?FT.join($qe.homedir(),t.slice(1)):t}function cje(t){sje(\"Loading env from encrypted .env.vault\");let e=ks._parseVault(t),r=process.env;return t&&t.processEnv!=null&&(r=t.processEnv),ks.populate(r,e,t),{parsed:e}}function uje(t){let e=FT.resolve(process.cwd(),\".env\"),r=\"utf8\",o=!!(t&&t.debug);t&&(t.path!=null&&(e=lje(t.path)),t.encoding!=null&&(r=t.encoding));try{let a=ks.parse(zV.readFileSync(e,{encoding:r})),n=process.env;return t&&t.processEnv!=null&&(n=t.processEnv),ks.populate(n,a,t),{parsed:a}}catch(a){return o&&QT(`Failed to load ${e} ${a.message}`),{error:a}}}function Aje(t){let e=XV(t);return JV(t).length===0?ks.configDotenv(t):zV.existsSync(e)?ks._configVault(t):(oje(`You set DOTENV_KEY but you are missing a .env.vault file at ${e}. Did you forget to build it?`),ks.configDotenv(t))}function fje(t,e){let r=Buffer.from(e.slice(-64),\"hex\"),o=Buffer.from(t,\"base64\"),a=o.slice(0,12),n=o.slice(-16);o=o.slice(12,-16);try{let u=eje.createDecipheriv(\"aes-256-gcm\",r,a);return u.setAuthTag(n),`${u.update(o)}${u.final()}`}catch(u){let A=u instanceof RangeError,p=u.message===\"Invalid key length\",h=u.message===\"Unsupported state or unable to authenticate data\";if(A||p){let E=\"INVALID_DOTENV_KEY: It must be 64 characters long (or more)\";throw new Error(E)}else if(h){let E=\"DECRYPTION_FAILED: Please check your DOTENV_KEY\";throw new Error(E)}else throw console.error(\"Error: \",u.code),console.error(\"Error: \",u.message),u}}function pje(t,e,r={}){let o=!!(r&&r.debug),a=!!(r&&r.override);if(typeof e!=\"object\")throw new Error(\"OBJECT_REQUIRED: Please check the processEnv argument being passed to populate\");for(let n of Object.keys(e))Object.prototype.hasOwnProperty.call(t,n)?(a===!0&&(t[n]=e[n]),o&&QT(a===!0?`\"${n}\" is already defined and WAS overwritten`:`\"${n}\" is already defined and was NOT overwritten`)):t[n]=e[n]}var ks={configDotenv:uje,_configVault:cje,_parseVault:ije,config:Aje,decrypt:fje,parse:nje,populate:pje};Ef.exports.configDotenv=ks.configDotenv;Ef.exports._configVault=ks._configVault;Ef.exports._parseVault=ks._parseVault;Ef.exports.config=ks.config;Ef.exports.decrypt=ks.decrypt;Ef.exports.parse=ks.parse;Ef.exports.populate=ks.populate;Ef.exports=ks});var ez=_((Lkt,$V)=>{\"use strict\";$V.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var eg=_((Mkt,TT)=>{\"use strict\";var hje=ez(),tz=t=>{if(t<1)throw new TypeError(\"Expected `concurrency` to be a number from 1 and up\");let e=[],r=0,o=()=>{r--,e.length>0&&e.shift()()},a=(A,p,...h)=>{r++;let E=hje(A,...h);p(E),E.then(o,o)},n=(A,p,...h)=>{r<t?a(A,p,...h):e.push(a.bind(null,A,p,...h))},u=(A,...p)=>new Promise(h=>n(A,h,...p));return Object.defineProperties(u,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),u};TT.exports=tz;TT.exports.default=tz});function Ku(t){return`YN${t.toString(10).padStart(4,\"0\")}`}function ZD(t){let e=Number(t.slice(2));if(typeof wr[e]>\"u\")throw new Error(`Unknown message name: \"${t}\"`);return e}var wr,$D=Et(()=>{wr=(Me=>(Me[Me.UNNAMED=0]=\"UNNAMED\",Me[Me.EXCEPTION=1]=\"EXCEPTION\",Me[Me.MISSING_PEER_DEPENDENCY=2]=\"MISSING_PEER_DEPENDENCY\",Me[Me.CYCLIC_DEPENDENCIES=3]=\"CYCLIC_DEPENDENCIES\",Me[Me.DISABLED_BUILD_SCRIPTS=4]=\"DISABLED_BUILD_SCRIPTS\",Me[Me.BUILD_DISABLED=5]=\"BUILD_DISABLED\",Me[Me.SOFT_LINK_BUILD=6]=\"SOFT_LINK_BUILD\",Me[Me.MUST_BUILD=7]=\"MUST_BUILD\",Me[Me.MUST_REBUILD=8]=\"MUST_REBUILD\",Me[Me.BUILD_FAILED=9]=\"BUILD_FAILED\",Me[Me.RESOLVER_NOT_FOUND=10]=\"RESOLVER_NOT_FOUND\",Me[Me.FETCHER_NOT_FOUND=11]=\"FETCHER_NOT_FOUND\",Me[Me.LINKER_NOT_FOUND=12]=\"LINKER_NOT_FOUND\",Me[Me.FETCH_NOT_CACHED=13]=\"FETCH_NOT_CACHED\",Me[Me.YARN_IMPORT_FAILED=14]=\"YARN_IMPORT_FAILED\",Me[Me.REMOTE_INVALID=15]=\"REMOTE_INVALID\",Me[Me.REMOTE_NOT_FOUND=16]=\"REMOTE_NOT_FOUND\",Me[Me.RESOLUTION_PACK=17]=\"RESOLUTION_PACK\",Me[Me.CACHE_CHECKSUM_MISMATCH=18]=\"CACHE_CHECKSUM_MISMATCH\",Me[Me.UNUSED_CACHE_ENTRY=19]=\"UNUSED_CACHE_ENTRY\",Me[Me.MISSING_LOCKFILE_ENTRY=20]=\"MISSING_LOCKFILE_ENTRY\",Me[Me.WORKSPACE_NOT_FOUND=21]=\"WORKSPACE_NOT_FOUND\",Me[Me.TOO_MANY_MATCHING_WORKSPACES=22]=\"TOO_MANY_MATCHING_WORKSPACES\",Me[Me.CONSTRAINTS_MISSING_DEPENDENCY=23]=\"CONSTRAINTS_MISSING_DEPENDENCY\",Me[Me.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]=\"CONSTRAINTS_INCOMPATIBLE_DEPENDENCY\",Me[Me.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]=\"CONSTRAINTS_EXTRANEOUS_DEPENDENCY\",Me[Me.CONSTRAINTS_INVALID_DEPENDENCY=26]=\"CONSTRAINTS_INVALID_DEPENDENCY\",Me[Me.CANT_SUGGEST_RESOLUTIONS=27]=\"CANT_SUGGEST_RESOLUTIONS\",Me[Me.FROZEN_LOCKFILE_EXCEPTION=28]=\"FROZEN_LOCKFILE_EXCEPTION\",Me[Me.CROSS_DRIVE_VIRTUAL_LOCAL=29]=\"CROSS_DRIVE_VIRTUAL_LOCAL\",Me[Me.FETCH_FAILED=30]=\"FETCH_FAILED\",Me[Me.DANGEROUS_NODE_MODULES=31]=\"DANGEROUS_NODE_MODULES\",Me[Me.NODE_GYP_INJECTED=32]=\"NODE_GYP_INJECTED\",Me[Me.AUTHENTICATION_NOT_FOUND=33]=\"AUTHENTICATION_NOT_FOUND\",Me[Me.INVALID_CONFIGURATION_KEY=34]=\"INVALID_CONFIGURATION_KEY\",Me[Me.NETWORK_ERROR=35]=\"NETWORK_ERROR\",Me[Me.LIFECYCLE_SCRIPT=36]=\"LIFECYCLE_SCRIPT\",Me[Me.CONSTRAINTS_MISSING_FIELD=37]=\"CONSTRAINTS_MISSING_FIELD\",Me[Me.CONSTRAINTS_INCOMPATIBLE_FIELD=38]=\"CONSTRAINTS_INCOMPATIBLE_FIELD\",Me[Me.CONSTRAINTS_EXTRANEOUS_FIELD=39]=\"CONSTRAINTS_EXTRANEOUS_FIELD\",Me[Me.CONSTRAINTS_INVALID_FIELD=40]=\"CONSTRAINTS_INVALID_FIELD\",Me[Me.AUTHENTICATION_INVALID=41]=\"AUTHENTICATION_INVALID\",Me[Me.PROLOG_UNKNOWN_ERROR=42]=\"PROLOG_UNKNOWN_ERROR\",Me[Me.PROLOG_SYNTAX_ERROR=43]=\"PROLOG_SYNTAX_ERROR\",Me[Me.PROLOG_EXISTENCE_ERROR=44]=\"PROLOG_EXISTENCE_ERROR\",Me[Me.STACK_OVERFLOW_RESOLUTION=45]=\"STACK_OVERFLOW_RESOLUTION\",Me[Me.AUTOMERGE_FAILED_TO_PARSE=46]=\"AUTOMERGE_FAILED_TO_PARSE\",Me[Me.AUTOMERGE_IMMUTABLE=47]=\"AUTOMERGE_IMMUTABLE\",Me[Me.AUTOMERGE_SUCCESS=48]=\"AUTOMERGE_SUCCESS\",Me[Me.AUTOMERGE_REQUIRED=49]=\"AUTOMERGE_REQUIRED\",Me[Me.DEPRECATED_CLI_SETTINGS=50]=\"DEPRECATED_CLI_SETTINGS\",Me[Me.PLUGIN_NAME_NOT_FOUND=51]=\"PLUGIN_NAME_NOT_FOUND\",Me[Me.INVALID_PLUGIN_REFERENCE=52]=\"INVALID_PLUGIN_REFERENCE\",Me[Me.CONSTRAINTS_AMBIGUITY=53]=\"CONSTRAINTS_AMBIGUITY\",Me[Me.CACHE_OUTSIDE_PROJECT=54]=\"CACHE_OUTSIDE_PROJECT\",Me[Me.IMMUTABLE_INSTALL=55]=\"IMMUTABLE_INSTALL\",Me[Me.IMMUTABLE_CACHE=56]=\"IMMUTABLE_CACHE\",Me[Me.INVALID_MANIFEST=57]=\"INVALID_MANIFEST\",Me[Me.PACKAGE_PREPARATION_FAILED=58]=\"PACKAGE_PREPARATION_FAILED\",Me[Me.INVALID_RANGE_PEER_DEPENDENCY=59]=\"INVALID_RANGE_PEER_DEPENDENCY\",Me[Me.INCOMPATIBLE_PEER_DEPENDENCY=60]=\"INCOMPATIBLE_PEER_DEPENDENCY\",Me[Me.DEPRECATED_PACKAGE=61]=\"DEPRECATED_PACKAGE\",Me[Me.INCOMPATIBLE_OS=62]=\"INCOMPATIBLE_OS\",Me[Me.INCOMPATIBLE_CPU=63]=\"INCOMPATIBLE_CPU\",Me[Me.FROZEN_ARTIFACT_EXCEPTION=64]=\"FROZEN_ARTIFACT_EXCEPTION\",Me[Me.TELEMETRY_NOTICE=65]=\"TELEMETRY_NOTICE\",Me[Me.PATCH_HUNK_FAILED=66]=\"PATCH_HUNK_FAILED\",Me[Me.INVALID_CONFIGURATION_VALUE=67]=\"INVALID_CONFIGURATION_VALUE\",Me[Me.UNUSED_PACKAGE_EXTENSION=68]=\"UNUSED_PACKAGE_EXTENSION\",Me[Me.REDUNDANT_PACKAGE_EXTENSION=69]=\"REDUNDANT_PACKAGE_EXTENSION\",Me[Me.AUTO_NM_SUCCESS=70]=\"AUTO_NM_SUCCESS\",Me[Me.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]=\"NM_CANT_INSTALL_EXTERNAL_SOFT_LINK\",Me[Me.NM_PRESERVE_SYMLINKS_REQUIRED=72]=\"NM_PRESERVE_SYMLINKS_REQUIRED\",Me[Me.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]=\"UPDATE_LOCKFILE_ONLY_SKIP_LINK\",Me[Me.NM_HARDLINKS_MODE_DOWNGRADED=74]=\"NM_HARDLINKS_MODE_DOWNGRADED\",Me[Me.PROLOG_INSTANTIATION_ERROR=75]=\"PROLOG_INSTANTIATION_ERROR\",Me[Me.INCOMPATIBLE_ARCHITECTURE=76]=\"INCOMPATIBLE_ARCHITECTURE\",Me[Me.GHOST_ARCHITECTURE=77]=\"GHOST_ARCHITECTURE\",Me[Me.RESOLUTION_MISMATCH=78]=\"RESOLUTION_MISMATCH\",Me[Me.PROLOG_LIMIT_EXCEEDED=79]=\"PROLOG_LIMIT_EXCEEDED\",Me[Me.NETWORK_DISABLED=80]=\"NETWORK_DISABLED\",Me[Me.NETWORK_UNSAFE_HTTP=81]=\"NETWORK_UNSAFE_HTTP\",Me[Me.RESOLUTION_FAILED=82]=\"RESOLUTION_FAILED\",Me[Me.AUTOMERGE_GIT_ERROR=83]=\"AUTOMERGE_GIT_ERROR\",Me[Me.CONSTRAINTS_CHECK_FAILED=84]=\"CONSTRAINTS_CHECK_FAILED\",Me[Me.UPDATED_RESOLUTION_RECORD=85]=\"UPDATED_RESOLUTION_RECORD\",Me[Me.EXPLAIN_PEER_DEPENDENCIES_CTA=86]=\"EXPLAIN_PEER_DEPENDENCIES_CTA\",Me[Me.MIGRATION_SUCCESS=87]=\"MIGRATION_SUCCESS\",Me[Me.VERSION_NOTICE=88]=\"VERSION_NOTICE\",Me[Me.TIPS_NOTICE=89]=\"TIPS_NOTICE\",Me[Me.OFFLINE_MODE_ENABLED=90]=\"OFFLINE_MODE_ENABLED\",Me))(wr||{})});var Xw=_((Ukt,rz)=>{var gje=\"2.0.0\",dje=Number.MAX_SAFE_INTEGER||9007199254740991,mje=16,yje=250,Eje=[\"major\",\"premajor\",\"minor\",\"preminor\",\"patch\",\"prepatch\",\"prerelease\"];rz.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:mje,MAX_SAFE_BUILD_LENGTH:yje,MAX_SAFE_INTEGER:dje,RELEASE_TYPES:Eje,SEMVER_SPEC_VERSION:gje,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Zw=_((_kt,nz)=>{var Cje=typeof process==\"object\"&&process.env&&process.env.NODE_DEBUG&&/\\bsemver\\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error(\"SEMVER\",...t):()=>{};nz.exports=Cje});var lm=_((Cf,iz)=>{var{MAX_SAFE_COMPONENT_LENGTH:NT,MAX_SAFE_BUILD_LENGTH:wje,MAX_LENGTH:Ije}=Xw(),Bje=Zw();Cf=iz.exports={};var vje=Cf.re=[],Dje=Cf.safeRe=[],$t=Cf.src=[],er=Cf.t={},Pje=0,LT=\"[a-zA-Z0-9-]\",bje=[[\"\\\\s\",1],[\"\\\\d\",Ije],[LT,wje]],Sje=t=>{for(let[e,r]of bje)t=t.split(`${e}*`).join(`${e}{0,${r}}`).split(`${e}+`).join(`${e}{1,${r}}`);return t},jr=(t,e,r)=>{let o=Sje(e),a=Pje++;Bje(t,a,e),er[t]=a,$t[a]=e,vje[a]=new RegExp(e,r?\"g\":void 0),Dje[a]=new RegExp(o,r?\"g\":void 0)};jr(\"NUMERICIDENTIFIER\",\"0|[1-9]\\\\d*\");jr(\"NUMERICIDENTIFIERLOOSE\",\"\\\\d+\");jr(\"NONNUMERICIDENTIFIER\",`\\\\d*[a-zA-Z-]${LT}*`);jr(\"MAINVERSION\",`(${$t[er.NUMERICIDENTIFIER]})\\\\.(${$t[er.NUMERICIDENTIFIER]})\\\\.(${$t[er.NUMERICIDENTIFIER]})`);jr(\"MAINVERSIONLOOSE\",`(${$t[er.NUMERICIDENTIFIERLOOSE]})\\\\.(${$t[er.NUMERICIDENTIFIERLOOSE]})\\\\.(${$t[er.NUMERICIDENTIFIERLOOSE]})`);jr(\"PRERELEASEIDENTIFIER\",`(?:${$t[er.NUMERICIDENTIFIER]}|${$t[er.NONNUMERICIDENTIFIER]})`);jr(\"PRERELEASEIDENTIFIERLOOSE\",`(?:${$t[er.NUMERICIDENTIFIERLOOSE]}|${$t[er.NONNUMERICIDENTIFIER]})`);jr(\"PRERELEASE\",`(?:-(${$t[er.PRERELEASEIDENTIFIER]}(?:\\\\.${$t[er.PRERELEASEIDENTIFIER]})*))`);jr(\"PRERELEASELOOSE\",`(?:-?(${$t[er.PRERELEASEIDENTIFIERLOOSE]}(?:\\\\.${$t[er.PRERELEASEIDENTIFIERLOOSE]})*))`);jr(\"BUILDIDENTIFIER\",`${LT}+`);jr(\"BUILD\",`(?:\\\\+(${$t[er.BUILDIDENTIFIER]}(?:\\\\.${$t[er.BUILDIDENTIFIER]})*))`);jr(\"FULLPLAIN\",`v?${$t[er.MAINVERSION]}${$t[er.PRERELEASE]}?${$t[er.BUILD]}?`);jr(\"FULL\",`^${$t[er.FULLPLAIN]}$`);jr(\"LOOSEPLAIN\",`[v=\\\\s]*${$t[er.MAINVERSIONLOOSE]}${$t[er.PRERELEASELOOSE]}?${$t[er.BUILD]}?`);jr(\"LOOSE\",`^${$t[er.LOOSEPLAIN]}$`);jr(\"GTLT\",\"((?:<|>)?=?)\");jr(\"XRANGEIDENTIFIERLOOSE\",`${$t[er.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`);jr(\"XRANGEIDENTIFIER\",`${$t[er.NUMERICIDENTIFIER]}|x|X|\\\\*`);jr(\"XRANGEPLAIN\",`[v=\\\\s]*(${$t[er.XRANGEIDENTIFIER]})(?:\\\\.(${$t[er.XRANGEIDENTIFIER]})(?:\\\\.(${$t[er.XRANGEIDENTIFIER]})(?:${$t[er.PRERELEASE]})?${$t[er.BUILD]}?)?)?`);jr(\"XRANGEPLAINLOOSE\",`[v=\\\\s]*(${$t[er.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${$t[er.XRANGEIDENTIFIERLOOSE]})(?:\\\\.(${$t[er.XRANGEIDENTIFIERLOOSE]})(?:${$t[er.PRERELEASELOOSE]})?${$t[er.BUILD]}?)?)?`);jr(\"XRANGE\",`^${$t[er.GTLT]}\\\\s*${$t[er.XRANGEPLAIN]}$`);jr(\"XRANGELOOSE\",`^${$t[er.GTLT]}\\\\s*${$t[er.XRANGEPLAINLOOSE]}$`);jr(\"COERCEPLAIN\",`(^|[^\\\\d])(\\\\d{1,${NT}})(?:\\\\.(\\\\d{1,${NT}}))?(?:\\\\.(\\\\d{1,${NT}}))?`);jr(\"COERCE\",`${$t[er.COERCEPLAIN]}(?:$|[^\\\\d])`);jr(\"COERCEFULL\",$t[er.COERCEPLAIN]+`(?:${$t[er.PRERELEASE]})?(?:${$t[er.BUILD]})?(?:$|[^\\\\d])`);jr(\"COERCERTL\",$t[er.COERCE],!0);jr(\"COERCERTLFULL\",$t[er.COERCEFULL],!0);jr(\"LONETILDE\",\"(?:~>?)\");jr(\"TILDETRIM\",`(\\\\s*)${$t[er.LONETILDE]}\\\\s+`,!0);Cf.tildeTrimReplace=\"$1~\";jr(\"TILDE\",`^${$t[er.LONETILDE]}${$t[er.XRANGEPLAIN]}$`);jr(\"TILDELOOSE\",`^${$t[er.LONETILDE]}${$t[er.XRANGEPLAINLOOSE]}$`);jr(\"LONECARET\",\"(?:\\\\^)\");jr(\"CARETTRIM\",`(\\\\s*)${$t[er.LONECARET]}\\\\s+`,!0);Cf.caretTrimReplace=\"$1^\";jr(\"CARET\",`^${$t[er.LONECARET]}${$t[er.XRANGEPLAIN]}$`);jr(\"CARETLOOSE\",`^${$t[er.LONECARET]}${$t[er.XRANGEPLAINLOOSE]}$`);jr(\"COMPARATORLOOSE\",`^${$t[er.GTLT]}\\\\s*(${$t[er.LOOSEPLAIN]})$|^$`);jr(\"COMPARATOR\",`^${$t[er.GTLT]}\\\\s*(${$t[er.FULLPLAIN]})$|^$`);jr(\"COMPARATORTRIM\",`(\\\\s*)${$t[er.GTLT]}\\\\s*(${$t[er.LOOSEPLAIN]}|${$t[er.XRANGEPLAIN]})`,!0);Cf.comparatorTrimReplace=\"$1$2$3\";jr(\"HYPHENRANGE\",`^\\\\s*(${$t[er.XRANGEPLAIN]})\\\\s+-\\\\s+(${$t[er.XRANGEPLAIN]})\\\\s*$`);jr(\"HYPHENRANGELOOSE\",`^\\\\s*(${$t[er.XRANGEPLAINLOOSE]})\\\\s+-\\\\s+(${$t[er.XRANGEPLAINLOOSE]})\\\\s*$`);jr(\"STAR\",\"(<|>)?=?\\\\s*\\\\*\");jr(\"GTE0\",\"^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$\");jr(\"GTE0PRE\",\"^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$\")});var eP=_((Hkt,sz)=>{var xje=Object.freeze({loose:!0}),kje=Object.freeze({}),Qje=t=>t?typeof t!=\"object\"?xje:t:kje;sz.exports=Qje});var MT=_((qkt,lz)=>{var oz=/^[0-9]+$/,az=(t,e)=>{let r=oz.test(t),o=oz.test(e);return r&&o&&(t=+t,e=+e),t===e?0:r&&!o?-1:o&&!r?1:t<e?-1:1},Fje=(t,e)=>az(e,t);lz.exports={compareIdentifiers:az,rcompareIdentifiers:Fje}});var Po=_((jkt,fz)=>{var tP=Zw(),{MAX_LENGTH:cz,MAX_SAFE_INTEGER:rP}=Xw(),{safeRe:uz,t:Az}=lm(),Rje=eP(),{compareIdentifiers:cm}=MT(),OT=class t{constructor(e,r){if(r=Rje(r),e instanceof t){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!=\"string\")throw new TypeError(`Invalid version. Must be a string. Got type \"${typeof e}\".`);if(e.length>cz)throw new TypeError(`version is longer than ${cz} characters`);tP(\"SemVer\",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let o=e.trim().match(r.loose?uz[Az.LOOSE]:uz[Az.FULL]);if(!o)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+o[1],this.minor=+o[2],this.patch=+o[3],this.major>rP||this.major<0)throw new TypeError(\"Invalid major version\");if(this.minor>rP||this.minor<0)throw new TypeError(\"Invalid minor version\");if(this.patch>rP||this.patch<0)throw new TypeError(\"Invalid patch version\");o[4]?this.prerelease=o[4].split(\".\").map(a=>{if(/^[0-9]+$/.test(a)){let n=+a;if(n>=0&&n<rP)return n}return a}):this.prerelease=[],this.build=o[5]?o[5].split(\".\"):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(\".\")}`),this.version}toString(){return this.version}compare(e){if(tP(\"SemVer.compare\",this.version,this.options,e),!(e instanceof t)){if(typeof e==\"string\"&&e===this.version)return 0;e=new t(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof t||(e=new t(e,this.options)),cm(this.major,e.major)||cm(this.minor,e.minor)||cm(this.patch,e.patch)}comparePre(e){if(e instanceof t||(e=new t(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let r=0;do{let o=this.prerelease[r],a=e.prerelease[r];if(tP(\"prerelease compare\",r,o,a),o===void 0&&a===void 0)return 0;if(a===void 0)return 1;if(o===void 0)return-1;if(o===a)continue;return cm(o,a)}while(++r)}compareBuild(e){e instanceof t||(e=new t(e,this.options));let r=0;do{let o=this.build[r],a=e.build[r];if(tP(\"prerelease compare\",r,o,a),o===void 0&&a===void 0)return 0;if(a===void 0)return 1;if(o===void 0)return-1;if(o===a)continue;return cm(o,a)}while(++r)}inc(e,r,o){switch(e){case\"premajor\":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc(\"pre\",r,o);break;case\"preminor\":this.prerelease.length=0,this.patch=0,this.minor++,this.inc(\"pre\",r,o);break;case\"prepatch\":this.prerelease.length=0,this.inc(\"patch\",r,o),this.inc(\"pre\",r,o);break;case\"prerelease\":this.prerelease.length===0&&this.inc(\"patch\",r,o),this.inc(\"pre\",r,o);break;case\"major\":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case\"minor\":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case\"patch\":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case\"pre\":{let a=Number(o)?1:0;if(!r&&o===!1)throw new Error(\"invalid increment argument: identifier is empty\");if(this.prerelease.length===0)this.prerelease=[a];else{let n=this.prerelease.length;for(;--n>=0;)typeof this.prerelease[n]==\"number\"&&(this.prerelease[n]++,n=-2);if(n===-1){if(r===this.prerelease.join(\".\")&&o===!1)throw new Error(\"invalid increment argument: identifier already exists\");this.prerelease.push(a)}}if(r){let n=[r,a];o===!1&&(n=[r]),cm(this.prerelease[0],r)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(\".\")}`),this}};fz.exports=OT});var tg=_((Gkt,hz)=>{var pz=Po(),Tje=(t,e,r=!1)=>{if(t instanceof pz)return t;try{return new pz(t,e)}catch(o){if(!r)return null;throw o}};hz.exports=Tje});var dz=_((Ykt,gz)=>{var Nje=tg(),Lje=(t,e)=>{let r=Nje(t,e);return r?r.version:null};gz.exports=Lje});var yz=_((Wkt,mz)=>{var Mje=tg(),Oje=(t,e)=>{let r=Mje(t.trim().replace(/^[=v]+/,\"\"),e);return r?r.version:null};mz.exports=Oje});var wz=_((Kkt,Cz)=>{var Ez=Po(),Uje=(t,e,r,o,a)=>{typeof r==\"string\"&&(a=o,o=r,r=void 0);try{return new Ez(t instanceof Ez?t.version:t,r).inc(e,o,a).version}catch{return null}};Cz.exports=Uje});var vz=_((Vkt,Bz)=>{var Iz=tg(),_je=(t,e)=>{let r=Iz(t,null,!0),o=Iz(e,null,!0),a=r.compare(o);if(a===0)return null;let n=a>0,u=n?r:o,A=n?o:r,p=!!u.prerelease.length;if(!!A.prerelease.length&&!p)return!A.patch&&!A.minor?\"major\":u.patch?\"patch\":u.minor?\"minor\":\"major\";let E=p?\"pre\":\"\";return r.major!==o.major?E+\"major\":r.minor!==o.minor?E+\"minor\":r.patch!==o.patch?E+\"patch\":\"prerelease\"};Bz.exports=_je});var Pz=_((zkt,Dz)=>{var Hje=Po(),qje=(t,e)=>new Hje(t,e).major;Dz.exports=qje});var Sz=_((Jkt,bz)=>{var jje=Po(),Gje=(t,e)=>new jje(t,e).minor;bz.exports=Gje});var kz=_((Xkt,xz)=>{var Yje=Po(),Wje=(t,e)=>new Yje(t,e).patch;xz.exports=Wje});var Fz=_((Zkt,Qz)=>{var Kje=tg(),Vje=(t,e)=>{let r=Kje(t,e);return r&&r.prerelease.length?r.prerelease:null};Qz.exports=Vje});var Ll=_(($kt,Tz)=>{var Rz=Po(),zje=(t,e,r)=>new Rz(t,r).compare(new Rz(e,r));Tz.exports=zje});var Lz=_((eQt,Nz)=>{var Jje=Ll(),Xje=(t,e,r)=>Jje(e,t,r);Nz.exports=Xje});var Oz=_((tQt,Mz)=>{var Zje=Ll(),$je=(t,e)=>Zje(t,e,!0);Mz.exports=$je});var nP=_((rQt,_z)=>{var Uz=Po(),e5e=(t,e,r)=>{let o=new Uz(t,r),a=new Uz(e,r);return o.compare(a)||o.compareBuild(a)};_z.exports=e5e});var qz=_((nQt,Hz)=>{var t5e=nP(),r5e=(t,e)=>t.sort((r,o)=>t5e(r,o,e));Hz.exports=r5e});var Gz=_((iQt,jz)=>{var n5e=nP(),i5e=(t,e)=>t.sort((r,o)=>n5e(o,r,e));jz.exports=i5e});var $w=_((sQt,Yz)=>{var s5e=Ll(),o5e=(t,e,r)=>s5e(t,e,r)>0;Yz.exports=o5e});var iP=_((oQt,Wz)=>{var a5e=Ll(),l5e=(t,e,r)=>a5e(t,e,r)<0;Wz.exports=l5e});var UT=_((aQt,Kz)=>{var c5e=Ll(),u5e=(t,e,r)=>c5e(t,e,r)===0;Kz.exports=u5e});var _T=_((lQt,Vz)=>{var A5e=Ll(),f5e=(t,e,r)=>A5e(t,e,r)!==0;Vz.exports=f5e});var sP=_((cQt,zz)=>{var p5e=Ll(),h5e=(t,e,r)=>p5e(t,e,r)>=0;zz.exports=h5e});var oP=_((uQt,Jz)=>{var g5e=Ll(),d5e=(t,e,r)=>g5e(t,e,r)<=0;Jz.exports=d5e});var HT=_((AQt,Xz)=>{var m5e=UT(),y5e=_T(),E5e=$w(),C5e=sP(),w5e=iP(),I5e=oP(),B5e=(t,e,r,o)=>{switch(e){case\"===\":return typeof t==\"object\"&&(t=t.version),typeof r==\"object\"&&(r=r.version),t===r;case\"!==\":return typeof t==\"object\"&&(t=t.version),typeof r==\"object\"&&(r=r.version),t!==r;case\"\":case\"=\":case\"==\":return m5e(t,r,o);case\"!=\":return y5e(t,r,o);case\">\":return E5e(t,r,o);case\">=\":return C5e(t,r,o);case\"<\":return w5e(t,r,o);case\"<=\":return I5e(t,r,o);default:throw new TypeError(`Invalid operator: ${e}`)}};Xz.exports=B5e});var $z=_((fQt,Zz)=>{var v5e=Po(),D5e=tg(),{safeRe:aP,t:lP}=lm(),P5e=(t,e)=>{if(t instanceof v5e)return t;if(typeof t==\"number\"&&(t=String(t)),typeof t!=\"string\")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(e.includePrerelease?aP[lP.COERCEFULL]:aP[lP.COERCE]);else{let p=e.includePrerelease?aP[lP.COERCERTLFULL]:aP[lP.COERCERTL],h;for(;(h=p.exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||h.index+h[0].length!==r.index+r[0].length)&&(r=h),p.lastIndex=h.index+h[1].length+h[2].length;p.lastIndex=-1}if(r===null)return null;let o=r[2],a=r[3]||\"0\",n=r[4]||\"0\",u=e.includePrerelease&&r[5]?`-${r[5]}`:\"\",A=e.includePrerelease&&r[6]?`+${r[6]}`:\"\";return D5e(`${o}.${a}.${n}${u}${A}`,e)};Zz.exports=P5e});var tJ=_((pQt,eJ)=>{\"use strict\";eJ.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var cP=_((hQt,rJ)=>{\"use strict\";rJ.exports=Cn;Cn.Node=rg;Cn.create=Cn;function Cn(t){var e=this;if(e instanceof Cn||(e=new Cn),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach==\"function\")t.forEach(function(a){e.push(a)});else if(arguments.length>0)for(var r=0,o=arguments.length;r<o;r++)e.push(arguments[r]);return e}Cn.prototype.removeNode=function(t){if(t.list!==this)throw new Error(\"removing node which does not belong to this list\");var e=t.next,r=t.prev;return e&&(e.prev=r),r&&(r.next=e),t===this.head&&(this.head=e),t===this.tail&&(this.tail=r),t.list.length--,t.next=null,t.prev=null,t.list=null,e};Cn.prototype.unshiftNode=function(t){if(t!==this.head){t.list&&t.list.removeNode(t);var e=this.head;t.list=this,t.next=e,e&&(e.prev=t),this.head=t,this.tail||(this.tail=t),this.length++}};Cn.prototype.pushNode=function(t){if(t!==this.tail){t.list&&t.list.removeNode(t);var e=this.tail;t.list=this,t.prev=e,e&&(e.next=t),this.tail=t,this.head||(this.head=t),this.length++}};Cn.prototype.push=function(){for(var t=0,e=arguments.length;t<e;t++)S5e(this,arguments[t]);return this.length};Cn.prototype.unshift=function(){for(var t=0,e=arguments.length;t<e;t++)x5e(this,arguments[t]);return this.length};Cn.prototype.pop=function(){if(this.tail){var t=this.tail.value;return this.tail=this.tail.prev,this.tail?this.tail.next=null:this.head=null,this.length--,t}};Cn.prototype.shift=function(){if(this.head){var t=this.head.value;return this.head=this.head.next,this.head?this.head.prev=null:this.tail=null,this.length--,t}};Cn.prototype.forEach=function(t,e){e=e||this;for(var r=this.head,o=0;r!==null;o++)t.call(e,r.value,o,this),r=r.next};Cn.prototype.forEachReverse=function(t,e){e=e||this;for(var r=this.tail,o=this.length-1;r!==null;o--)t.call(e,r.value,o,this),r=r.prev};Cn.prototype.get=function(t){for(var e=0,r=this.head;r!==null&&e<t;e++)r=r.next;if(e===t&&r!==null)return r.value};Cn.prototype.getReverse=function(t){for(var e=0,r=this.tail;r!==null&&e<t;e++)r=r.prev;if(e===t&&r!==null)return r.value};Cn.prototype.map=function(t,e){e=e||this;for(var r=new Cn,o=this.head;o!==null;)r.push(t.call(e,o.value,this)),o=o.next;return r};Cn.prototype.mapReverse=function(t,e){e=e||this;for(var r=new Cn,o=this.tail;o!==null;)r.push(t.call(e,o.value,this)),o=o.prev;return r};Cn.prototype.reduce=function(t,e){var r,o=this.head;if(arguments.length>1)r=e;else if(this.head)o=this.head.next,r=this.head.value;else throw new TypeError(\"Reduce of empty list with no initial value\");for(var a=0;o!==null;a++)r=t(r,o.value,a),o=o.next;return r};Cn.prototype.reduceReverse=function(t,e){var r,o=this.tail;if(arguments.length>1)r=e;else if(this.tail)o=this.tail.prev,r=this.tail.value;else throw new TypeError(\"Reduce of empty list with no initial value\");for(var a=this.length-1;o!==null;a--)r=t(r,o.value,a),o=o.prev;return r};Cn.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};Cn.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};Cn.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Cn;if(e<t||e<0)return r;t<0&&(t=0),e>this.length&&(e=this.length);for(var o=0,a=this.head;a!==null&&o<t;o++)a=a.next;for(;a!==null&&o<e;o++,a=a.next)r.push(a.value);return r};Cn.prototype.sliceReverse=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Cn;if(e<t||e<0)return r;t<0&&(t=0),e>this.length&&(e=this.length);for(var o=this.length,a=this.tail;a!==null&&o>e;o--)a=a.prev;for(;a!==null&&o>t;o--,a=a.prev)r.push(a.value);return r};Cn.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var o=0,a=this.head;a!==null&&o<t;o++)a=a.next;for(var n=[],o=0;a&&o<e;o++)n.push(a.value),a=this.removeNode(a);a===null&&(a=this.tail),a!==this.head&&a!==this.tail&&(a=a.prev);for(var o=0;o<r.length;o++)a=b5e(this,a,r[o]);return n};Cn.prototype.reverse=function(){for(var t=this.head,e=this.tail,r=t;r!==null;r=r.prev){var o=r.prev;r.prev=r.next,r.next=o}return this.head=e,this.tail=t,this};function b5e(t,e,r){var o=e===t.head?new rg(r,null,e,t):new rg(r,e,e.next,t);return o.next===null&&(t.tail=o),o.prev===null&&(t.head=o),t.length++,o}function S5e(t,e){t.tail=new rg(e,t.tail,null,t),t.head||(t.head=t.tail),t.length++}function x5e(t,e){t.head=new rg(e,null,t.head,t),t.tail||(t.tail=t.head),t.length++}function rg(t,e,r,o){if(!(this instanceof rg))return new rg(t,e,r,o);this.list=o,this.value=t,e?(e.next=this,this.prev=e):this.prev=null,r?(r.prev=this,this.next=r):this.next=null}try{tJ()(Cn)}catch{}});var aJ=_((gQt,oJ)=>{\"use strict\";var k5e=cP(),ng=Symbol(\"max\"),If=Symbol(\"length\"),um=Symbol(\"lengthCalculator\"),tI=Symbol(\"allowStale\"),ig=Symbol(\"maxAge\"),wf=Symbol(\"dispose\"),nJ=Symbol(\"noDisposeOnSet\"),Qs=Symbol(\"lruList\"),Uc=Symbol(\"cache\"),sJ=Symbol(\"updateAgeOnGet\"),qT=()=>1,GT=class{constructor(e){if(typeof e==\"number\"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!=\"number\"||e.max<0))throw new TypeError(\"max must be a non-negative number\");let r=this[ng]=e.max||1/0,o=e.length||qT;if(this[um]=typeof o!=\"function\"?qT:o,this[tI]=e.stale||!1,e.maxAge&&typeof e.maxAge!=\"number\")throw new TypeError(\"maxAge must be a number\");this[ig]=e.maxAge||0,this[wf]=e.dispose,this[nJ]=e.noDisposeOnSet||!1,this[sJ]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!=\"number\"||e<0)throw new TypeError(\"max must be a non-negative number\");this[ng]=e||1/0,eI(this)}get max(){return this[ng]}set allowStale(e){this[tI]=!!e}get allowStale(){return this[tI]}set maxAge(e){if(typeof e!=\"number\")throw new TypeError(\"maxAge must be a non-negative number\");this[ig]=e,eI(this)}get maxAge(){return this[ig]}set lengthCalculator(e){typeof e!=\"function\"&&(e=qT),e!==this[um]&&(this[um]=e,this[If]=0,this[Qs].forEach(r=>{r.length=this[um](r.value,r.key),this[If]+=r.length})),eI(this)}get lengthCalculator(){return this[um]}get length(){return this[If]}get itemCount(){return this[Qs].length}rforEach(e,r){r=r||this;for(let o=this[Qs].tail;o!==null;){let a=o.prev;iJ(this,e,o,r),o=a}}forEach(e,r){r=r||this;for(let o=this[Qs].head;o!==null;){let a=o.next;iJ(this,e,o,r),o=a}}keys(){return this[Qs].toArray().map(e=>e.key)}values(){return this[Qs].toArray().map(e=>e.value)}reset(){this[wf]&&this[Qs]&&this[Qs].length&&this[Qs].forEach(e=>this[wf](e.key,e.value)),this[Uc]=new Map,this[Qs]=new k5e,this[If]=0}dump(){return this[Qs].map(e=>uP(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[Qs]}set(e,r,o){if(o=o||this[ig],o&&typeof o!=\"number\")throw new TypeError(\"maxAge must be a number\");let a=o?Date.now():0,n=this[um](r,e);if(this[Uc].has(e)){if(n>this[ng])return Am(this,this[Uc].get(e)),!1;let p=this[Uc].get(e).value;return this[wf]&&(this[nJ]||this[wf](e,p.value)),p.now=a,p.maxAge=o,p.value=r,this[If]+=n-p.length,p.length=n,this.get(e),eI(this),!0}let u=new YT(e,r,n,a,o);return u.length>this[ng]?(this[wf]&&this[wf](e,r),!1):(this[If]+=u.length,this[Qs].unshift(u),this[Uc].set(e,this[Qs].head),eI(this),!0)}has(e){if(!this[Uc].has(e))return!1;let r=this[Uc].get(e).value;return!uP(this,r)}get(e){return jT(this,e,!0)}peek(e){return jT(this,e,!1)}pop(){let e=this[Qs].tail;return e?(Am(this,e),e.value):null}del(e){Am(this,this[Uc].get(e))}load(e){this.reset();let r=Date.now();for(let o=e.length-1;o>=0;o--){let a=e[o],n=a.e||0;if(n===0)this.set(a.k,a.v);else{let u=n-r;u>0&&this.set(a.k,a.v,u)}}}prune(){this[Uc].forEach((e,r)=>jT(this,r,!1))}},jT=(t,e,r)=>{let o=t[Uc].get(e);if(o){let a=o.value;if(uP(t,a)){if(Am(t,o),!t[tI])return}else r&&(t[sJ]&&(o.value.now=Date.now()),t[Qs].unshiftNode(o));return a.value}},uP=(t,e)=>{if(!e||!e.maxAge&&!t[ig])return!1;let r=Date.now()-e.now;return e.maxAge?r>e.maxAge:t[ig]&&r>t[ig]},eI=t=>{if(t[If]>t[ng])for(let e=t[Qs].tail;t[If]>t[ng]&&e!==null;){let r=e.prev;Am(t,e),e=r}},Am=(t,e)=>{if(e){let r=e.value;t[wf]&&t[wf](r.key,r.value),t[If]-=r.length,t[Uc].delete(r.key),t[Qs].removeNode(e)}},YT=class{constructor(e,r,o,a,n){this.key=e,this.value=r,this.length=o,this.now=a,this.maxAge=n||0}},iJ=(t,e,r,o)=>{let a=r.value;uP(t,a)&&(Am(t,r),t[tI]||(a=void 0)),a&&e.call(o,a.value,a.key,t)};oJ.exports=GT});var Ml=_((dQt,AJ)=>{var WT=class t{constructor(e,r){if(r=F5e(r),e instanceof t)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new t(e.raw,r);if(e instanceof KT)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e.trim().split(/\\s+/).join(\" \"),this.set=this.raw.split(\"||\").map(o=>this.parseRange(o.trim())).filter(o=>o.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let o=this.set[0];if(this.set=this.set.filter(a=>!cJ(a[0])),this.set.length===0)this.set=[o];else if(this.set.length>1){for(let a of this.set)if(a.length===1&&U5e(a[0])){this.set=[a];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(\" \").trim()).join(\"||\").trim(),this.range}toString(){return this.range}parseRange(e){let o=((this.options.includePrerelease&&M5e)|(this.options.loose&&O5e))+\":\"+e,a=lJ.get(o);if(a)return a;let n=this.options.loose,u=n?ba[Xo.HYPHENRANGELOOSE]:ba[Xo.HYPHENRANGE];e=e.replace(u,z5e(this.options.includePrerelease)),ci(\"hyphen replace\",e),e=e.replace(ba[Xo.COMPARATORTRIM],T5e),ci(\"comparator trim\",e),e=e.replace(ba[Xo.TILDETRIM],N5e),ci(\"tilde trim\",e),e=e.replace(ba[Xo.CARETTRIM],L5e),ci(\"caret trim\",e);let A=e.split(\" \").map(I=>_5e(I,this.options)).join(\" \").split(/\\s+/).map(I=>V5e(I,this.options));n&&(A=A.filter(I=>(ci(\"loose invalid filter\",I,this.options),!!I.match(ba[Xo.COMPARATORLOOSE])))),ci(\"range list\",A);let p=new Map,h=A.map(I=>new KT(I,this.options));for(let I of h){if(cJ(I))return[I];p.set(I.value,I)}p.size>1&&p.has(\"\")&&p.delete(\"\");let E=[...p.values()];return lJ.set(o,E),E}intersects(e,r){if(!(e instanceof t))throw new TypeError(\"a Range is required\");return this.set.some(o=>uJ(o,r)&&e.set.some(a=>uJ(a,r)&&o.every(n=>a.every(u=>n.intersects(u,r)))))}test(e){if(!e)return!1;if(typeof e==\"string\")try{e=new R5e(e,this.options)}catch{return!1}for(let r=0;r<this.set.length;r++)if(J5e(this.set[r],e,this.options))return!0;return!1}};AJ.exports=WT;var Q5e=aJ(),lJ=new Q5e({max:1e3}),F5e=eP(),KT=rI(),ci=Zw(),R5e=Po(),{safeRe:ba,t:Xo,comparatorTrimReplace:T5e,tildeTrimReplace:N5e,caretTrimReplace:L5e}=lm(),{FLAG_INCLUDE_PRERELEASE:M5e,FLAG_LOOSE:O5e}=Xw(),cJ=t=>t.value===\"<0.0.0-0\",U5e=t=>t.value===\"\",uJ=(t,e)=>{let r=!0,o=t.slice(),a=o.pop();for(;r&&o.length;)r=o.every(n=>a.intersects(n,e)),a=o.pop();return r},_5e=(t,e)=>(ci(\"comp\",t,e),t=j5e(t,e),ci(\"caret\",t),t=H5e(t,e),ci(\"tildes\",t),t=Y5e(t,e),ci(\"xrange\",t),t=K5e(t,e),ci(\"stars\",t),t),Zo=t=>!t||t.toLowerCase()===\"x\"||t===\"*\",H5e=(t,e)=>t.trim().split(/\\s+/).map(r=>q5e(r,e)).join(\" \"),q5e=(t,e)=>{let r=e.loose?ba[Xo.TILDELOOSE]:ba[Xo.TILDE];return t.replace(r,(o,a,n,u,A)=>{ci(\"tilde\",t,o,a,n,u,A);let p;return Zo(a)?p=\"\":Zo(n)?p=`>=${a}.0.0 <${+a+1}.0.0-0`:Zo(u)?p=`>=${a}.${n}.0 <${a}.${+n+1}.0-0`:A?(ci(\"replaceTilde pr\",A),p=`>=${a}.${n}.${u}-${A} <${a}.${+n+1}.0-0`):p=`>=${a}.${n}.${u} <${a}.${+n+1}.0-0`,ci(\"tilde return\",p),p})},j5e=(t,e)=>t.trim().split(/\\s+/).map(r=>G5e(r,e)).join(\" \"),G5e=(t,e)=>{ci(\"caret\",t,e);let r=e.loose?ba[Xo.CARETLOOSE]:ba[Xo.CARET],o=e.includePrerelease?\"-0\":\"\";return t.replace(r,(a,n,u,A,p)=>{ci(\"caret\",t,a,n,u,A,p);let h;return Zo(n)?h=\"\":Zo(u)?h=`>=${n}.0.0${o} <${+n+1}.0.0-0`:Zo(A)?n===\"0\"?h=`>=${n}.${u}.0${o} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.0${o} <${+n+1}.0.0-0`:p?(ci(\"replaceCaret pr\",p),n===\"0\"?u===\"0\"?h=`>=${n}.${u}.${A}-${p} <${n}.${u}.${+A+1}-0`:h=`>=${n}.${u}.${A}-${p} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.${A}-${p} <${+n+1}.0.0-0`):(ci(\"no pr\"),n===\"0\"?u===\"0\"?h=`>=${n}.${u}.${A}${o} <${n}.${u}.${+A+1}-0`:h=`>=${n}.${u}.${A}${o} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.${A} <${+n+1}.0.0-0`),ci(\"caret return\",h),h})},Y5e=(t,e)=>(ci(\"replaceXRanges\",t,e),t.split(/\\s+/).map(r=>W5e(r,e)).join(\" \")),W5e=(t,e)=>{t=t.trim();let r=e.loose?ba[Xo.XRANGELOOSE]:ba[Xo.XRANGE];return t.replace(r,(o,a,n,u,A,p)=>{ci(\"xRange\",t,o,a,n,u,A,p);let h=Zo(n),E=h||Zo(u),I=E||Zo(A),v=I;return a===\"=\"&&v&&(a=\"\"),p=e.includePrerelease?\"-0\":\"\",h?a===\">\"||a===\"<\"?o=\"<0.0.0-0\":o=\"*\":a&&v?(E&&(u=0),A=0,a===\">\"?(a=\">=\",E?(n=+n+1,u=0,A=0):(u=+u+1,A=0)):a===\"<=\"&&(a=\"<\",E?n=+n+1:u=+u+1),a===\"<\"&&(p=\"-0\"),o=`${a+n}.${u}.${A}${p}`):E?o=`>=${n}.0.0${p} <${+n+1}.0.0-0`:I&&(o=`>=${n}.${u}.0${p} <${n}.${+u+1}.0-0`),ci(\"xRange return\",o),o})},K5e=(t,e)=>(ci(\"replaceStars\",t,e),t.trim().replace(ba[Xo.STAR],\"\")),V5e=(t,e)=>(ci(\"replaceGTE0\",t,e),t.trim().replace(ba[e.includePrerelease?Xo.GTE0PRE:Xo.GTE0],\"\")),z5e=t=>(e,r,o,a,n,u,A,p,h,E,I,v,x)=>(Zo(o)?r=\"\":Zo(a)?r=`>=${o}.0.0${t?\"-0\":\"\"}`:Zo(n)?r=`>=${o}.${a}.0${t?\"-0\":\"\"}`:u?r=`>=${r}`:r=`>=${r}${t?\"-0\":\"\"}`,Zo(h)?p=\"\":Zo(E)?p=`<${+h+1}.0.0-0`:Zo(I)?p=`<${h}.${+E+1}.0-0`:v?p=`<=${h}.${E}.${I}-${v}`:t?p=`<${h}.${E}.${+I+1}-0`:p=`<=${p}`,`${r} ${p}`.trim()),J5e=(t,e,r)=>{for(let o=0;o<t.length;o++)if(!t[o].test(e))return!1;if(e.prerelease.length&&!r.includePrerelease){for(let o=0;o<t.length;o++)if(ci(t[o].semver),t[o].semver!==KT.ANY&&t[o].semver.prerelease.length>0){let a=t[o].semver;if(a.major===e.major&&a.minor===e.minor&&a.patch===e.patch)return!0}return!1}return!0}});var rI=_((mQt,mJ)=>{var nI=Symbol(\"SemVer ANY\"),JT=class t{static get ANY(){return nI}constructor(e,r){if(r=fJ(r),e instanceof t){if(e.loose===!!r.loose)return e;e=e.value}e=e.trim().split(/\\s+/).join(\" \"),zT(\"comparator\",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===nI?this.value=\"\":this.value=this.operator+this.semver.version,zT(\"comp\",this)}parse(e){let r=this.options.loose?pJ[hJ.COMPARATORLOOSE]:pJ[hJ.COMPARATOR],o=e.match(r);if(!o)throw new TypeError(`Invalid comparator: ${e}`);this.operator=o[1]!==void 0?o[1]:\"\",this.operator===\"=\"&&(this.operator=\"\"),o[2]?this.semver=new gJ(o[2],this.options.loose):this.semver=nI}toString(){return this.value}test(e){if(zT(\"Comparator.test\",e,this.options.loose),this.semver===nI||e===nI)return!0;if(typeof e==\"string\")try{e=new gJ(e,this.options)}catch{return!1}return VT(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof t))throw new TypeError(\"a Comparator is required\");return this.operator===\"\"?this.value===\"\"?!0:new dJ(e.value,r).test(this.value):e.operator===\"\"?e.value===\"\"?!0:new dJ(this.value,r).test(e.semver):(r=fJ(r),r.includePrerelease&&(this.value===\"<0.0.0-0\"||e.value===\"<0.0.0-0\")||!r.includePrerelease&&(this.value.startsWith(\"<0.0.0\")||e.value.startsWith(\"<0.0.0\"))?!1:!!(this.operator.startsWith(\">\")&&e.operator.startsWith(\">\")||this.operator.startsWith(\"<\")&&e.operator.startsWith(\"<\")||this.semver.version===e.semver.version&&this.operator.includes(\"=\")&&e.operator.includes(\"=\")||VT(this.semver,\"<\",e.semver,r)&&this.operator.startsWith(\">\")&&e.operator.startsWith(\"<\")||VT(this.semver,\">\",e.semver,r)&&this.operator.startsWith(\"<\")&&e.operator.startsWith(\">\")))}};mJ.exports=JT;var fJ=eP(),{safeRe:pJ,t:hJ}=lm(),VT=HT(),zT=Zw(),gJ=Po(),dJ=Ml()});var iI=_((yQt,yJ)=>{var X5e=Ml(),Z5e=(t,e,r)=>{try{e=new X5e(e,r)}catch{return!1}return e.test(t)};yJ.exports=Z5e});var CJ=_((EQt,EJ)=>{var $5e=Ml(),eGe=(t,e)=>new $5e(t,e).set.map(r=>r.map(o=>o.value).join(\" \").trim().split(\" \"));EJ.exports=eGe});var IJ=_((CQt,wJ)=>{var tGe=Po(),rGe=Ml(),nGe=(t,e,r)=>{let o=null,a=null,n=null;try{n=new rGe(e,r)}catch{return null}return t.forEach(u=>{n.test(u)&&(!o||a.compare(u)===-1)&&(o=u,a=new tGe(o,r))}),o};wJ.exports=nGe});var vJ=_((wQt,BJ)=>{var iGe=Po(),sGe=Ml(),oGe=(t,e,r)=>{let o=null,a=null,n=null;try{n=new sGe(e,r)}catch{return null}return t.forEach(u=>{n.test(u)&&(!o||a.compare(u)===1)&&(o=u,a=new iGe(o,r))}),o};BJ.exports=oGe});var bJ=_((IQt,PJ)=>{var XT=Po(),aGe=Ml(),DJ=$w(),lGe=(t,e)=>{t=new aGe(t,e);let r=new XT(\"0.0.0\");if(t.test(r)||(r=new XT(\"0.0.0-0\"),t.test(r)))return r;r=null;for(let o=0;o<t.set.length;++o){let a=t.set[o],n=null;a.forEach(u=>{let A=new XT(u.semver.version);switch(u.operator){case\">\":A.prerelease.length===0?A.patch++:A.prerelease.push(0),A.raw=A.format();case\"\":case\">=\":(!n||DJ(A,n))&&(n=A);break;case\"<\":case\"<=\":break;default:throw new Error(`Unexpected operation: ${u.operator}`)}}),n&&(!r||DJ(r,n))&&(r=n)}return r&&t.test(r)?r:null};PJ.exports=lGe});var xJ=_((BQt,SJ)=>{var cGe=Ml(),uGe=(t,e)=>{try{return new cGe(t,e).range||\"*\"}catch{return null}};SJ.exports=uGe});var AP=_((vQt,RJ)=>{var AGe=Po(),FJ=rI(),{ANY:fGe}=FJ,pGe=Ml(),hGe=iI(),kJ=$w(),QJ=iP(),gGe=oP(),dGe=sP(),mGe=(t,e,r,o)=>{t=new AGe(t,o),e=new pGe(e,o);let a,n,u,A,p;switch(r){case\">\":a=kJ,n=gGe,u=QJ,A=\">\",p=\">=\";break;case\"<\":a=QJ,n=dGe,u=kJ,A=\"<\",p=\"<=\";break;default:throw new TypeError('Must provide a hilo val of \"<\" or \">\"')}if(hGe(t,e,o))return!1;for(let h=0;h<e.set.length;++h){let E=e.set[h],I=null,v=null;if(E.forEach(x=>{x.semver===fGe&&(x=new FJ(\">=0.0.0\")),I=I||x,v=v||x,a(x.semver,I.semver,o)?I=x:u(x.semver,v.semver,o)&&(v=x)}),I.operator===A||I.operator===p||(!v.operator||v.operator===A)&&n(t,v.semver))return!1;if(v.operator===p&&u(t,v.semver))return!1}return!0};RJ.exports=mGe});var NJ=_((DQt,TJ)=>{var yGe=AP(),EGe=(t,e,r)=>yGe(t,e,\">\",r);TJ.exports=EGe});var MJ=_((PQt,LJ)=>{var CGe=AP(),wGe=(t,e,r)=>CGe(t,e,\"<\",r);LJ.exports=wGe});var _J=_((bQt,UJ)=>{var OJ=Ml(),IGe=(t,e,r)=>(t=new OJ(t,r),e=new OJ(e,r),t.intersects(e,r));UJ.exports=IGe});var qJ=_((SQt,HJ)=>{var BGe=iI(),vGe=Ll();HJ.exports=(t,e,r)=>{let o=[],a=null,n=null,u=t.sort((E,I)=>vGe(E,I,r));for(let E of u)BGe(E,e,r)?(n=E,a||(a=E)):(n&&o.push([a,n]),n=null,a=null);a&&o.push([a,null]);let A=[];for(let[E,I]of o)E===I?A.push(E):!I&&E===u[0]?A.push(\"*\"):I?E===u[0]?A.push(`<=${I}`):A.push(`${E} - ${I}`):A.push(`>=${E}`);let p=A.join(\" || \"),h=typeof e.raw==\"string\"?e.raw:String(e);return p.length<h.length?p:e}});var VJ=_((xQt,KJ)=>{var jJ=Ml(),$T=rI(),{ANY:ZT}=$T,sI=iI(),eN=Ll(),DGe=(t,e,r={})=>{if(t===e)return!0;t=new jJ(t,r),e=new jJ(e,r);let o=!1;e:for(let a of t.set){for(let n of e.set){let u=bGe(a,n,r);if(o=o||u!==null,u)continue e}if(o)return!1}return!0},PGe=[new $T(\">=0.0.0-0\")],GJ=[new $T(\">=0.0.0\")],bGe=(t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===ZT){if(e.length===1&&e[0].semver===ZT)return!0;r.includePrerelease?t=PGe:t=GJ}if(e.length===1&&e[0].semver===ZT){if(r.includePrerelease)return!0;e=GJ}let o=new Set,a,n;for(let x of t)x.operator===\">\"||x.operator===\">=\"?a=YJ(a,x,r):x.operator===\"<\"||x.operator===\"<=\"?n=WJ(n,x,r):o.add(x.semver);if(o.size>1)return null;let u;if(a&&n){if(u=eN(a.semver,n.semver,r),u>0)return null;if(u===0&&(a.operator!==\">=\"||n.operator!==\"<=\"))return null}for(let x of o){if(a&&!sI(x,String(a),r)||n&&!sI(x,String(n),r))return null;for(let C of e)if(!sI(x,String(C),r))return!1;return!0}let A,p,h,E,I=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1,v=a&&!r.includePrerelease&&a.semver.prerelease.length?a.semver:!1;I&&I.prerelease.length===1&&n.operator===\"<\"&&I.prerelease[0]===0&&(I=!1);for(let x of e){if(E=E||x.operator===\">\"||x.operator===\">=\",h=h||x.operator===\"<\"||x.operator===\"<=\",a){if(v&&x.semver.prerelease&&x.semver.prerelease.length&&x.semver.major===v.major&&x.semver.minor===v.minor&&x.semver.patch===v.patch&&(v=!1),x.operator===\">\"||x.operator===\">=\"){if(A=YJ(a,x,r),A===x&&A!==a)return!1}else if(a.operator===\">=\"&&!sI(a.semver,String(x),r))return!1}if(n){if(I&&x.semver.prerelease&&x.semver.prerelease.length&&x.semver.major===I.major&&x.semver.minor===I.minor&&x.semver.patch===I.patch&&(I=!1),x.operator===\"<\"||x.operator===\"<=\"){if(p=WJ(n,x,r),p===x&&p!==n)return!1}else if(n.operator===\"<=\"&&!sI(n.semver,String(x),r))return!1}if(!x.operator&&(n||a)&&u!==0)return!1}return!(a&&h&&!n&&u!==0||n&&E&&!a&&u!==0||v||I)},YJ=(t,e,r)=>{if(!t)return e;let o=eN(t.semver,e.semver,r);return o>0?t:o<0||e.operator===\">\"&&t.operator===\">=\"?e:t},WJ=(t,e,r)=>{if(!t)return e;let o=eN(t.semver,e.semver,r);return o<0?t:o>0||e.operator===\"<\"&&t.operator===\"<=\"?e:t};KJ.exports=DGe});var Jn=_((kQt,XJ)=>{var tN=lm(),zJ=Xw(),SGe=Po(),JJ=MT(),xGe=tg(),kGe=dz(),QGe=yz(),FGe=wz(),RGe=vz(),TGe=Pz(),NGe=Sz(),LGe=kz(),MGe=Fz(),OGe=Ll(),UGe=Lz(),_Ge=Oz(),HGe=nP(),qGe=qz(),jGe=Gz(),GGe=$w(),YGe=iP(),WGe=UT(),KGe=_T(),VGe=sP(),zGe=oP(),JGe=HT(),XGe=$z(),ZGe=rI(),$Ge=Ml(),e9e=iI(),t9e=CJ(),r9e=IJ(),n9e=vJ(),i9e=bJ(),s9e=xJ(),o9e=AP(),a9e=NJ(),l9e=MJ(),c9e=_J(),u9e=qJ(),A9e=VJ();XJ.exports={parse:xGe,valid:kGe,clean:QGe,inc:FGe,diff:RGe,major:TGe,minor:NGe,patch:LGe,prerelease:MGe,compare:OGe,rcompare:UGe,compareLoose:_Ge,compareBuild:HGe,sort:qGe,rsort:jGe,gt:GGe,lt:YGe,eq:WGe,neq:KGe,gte:VGe,lte:zGe,cmp:JGe,coerce:XGe,Comparator:ZGe,Range:$Ge,satisfies:e9e,toComparators:t9e,maxSatisfying:r9e,minSatisfying:n9e,minVersion:i9e,validRange:s9e,outside:o9e,gtr:a9e,ltr:l9e,intersects:c9e,simplifyRange:u9e,subset:A9e,SemVer:SGe,re:tN.re,src:tN.src,tokens:tN.t,SEMVER_SPEC_VERSION:zJ.SEMVER_SPEC_VERSION,RELEASE_TYPES:zJ.RELEASE_TYPES,compareIdentifiers:JJ.compareIdentifiers,rcompareIdentifiers:JJ.rcompareIdentifiers}});var $J=_((QQt,ZJ)=>{\"use strict\";function f9e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function sg(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name=\"SyntaxError\",typeof Error.captureStackTrace==\"function\"&&Error.captureStackTrace(this,sg)}f9e(sg,Error);sg.buildMessage=function(t,e){var r={literal:function(h){return'\"'+a(h.text)+'\"'},class:function(h){var E=\"\",I;for(I=0;I<h.parts.length;I++)E+=h.parts[I]instanceof Array?n(h.parts[I][0])+\"-\"+n(h.parts[I][1]):n(h.parts[I]);return\"[\"+(h.inverted?\"^\":\"\")+E+\"]\"},any:function(h){return\"any character\"},end:function(h){return\"end of input\"},other:function(h){return h.description}};function o(h){return h.charCodeAt(0).toString(16).toUpperCase()}function a(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\"/g,'\\\\\"').replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+o(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+o(E)})}function n(h){return h.replace(/\\\\/g,\"\\\\\\\\\").replace(/\\]/g,\"\\\\]\").replace(/\\^/g,\"\\\\^\").replace(/-/g,\"\\\\-\").replace(/\\0/g,\"\\\\0\").replace(/\\t/g,\"\\\\t\").replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\").replace(/[\\x00-\\x0F]/g,function(E){return\"\\\\x0\"+o(E)}).replace(/[\\x10-\\x1F\\x7F-\\x9F]/g,function(E){return\"\\\\x\"+o(E)})}function u(h){return r[h.type](h)}function A(h){var E=new Array(h.length),I,v;for(I=0;I<h.length;I++)E[I]=u(h[I]);if(E.sort(),E.length>0){for(I=1,v=1;I<E.length;I++)E[I-1]!==E[I]&&(E[v]=E[I],v++);E.length=v}switch(E.length){case 1:return E[0];case 2:return E[0]+\" or \"+E[1];default:return E.slice(0,-1).join(\", \")+\", or \"+E[E.length-1]}}function p(h){return h?'\"'+a(h)+'\"':\"end of input\"}return\"Expected \"+A(t)+\" but \"+p(e)+\" found.\"};function p9e(t,e){e=e!==void 0?e:{};var r={},o={Expression:y},a=y,n=\"|\",u=Te(\"|\",!1),A=\"&\",p=Te(\"&\",!1),h=\"^\",E=Te(\"^\",!1),I=function($,ie){return!!ie.reduce((Se,Re)=>{switch(Re[1]){case\"|\":return Se|Re[3];case\"&\":return Se&Re[3];case\"^\":return Se^Re[3]}},$)},v=\"!\",x=Te(\"!\",!1),C=function($){return!$},R=\"(\",L=Te(\"(\",!1),U=\")\",z=Te(\")\",!1),te=function($){return $},ae=/^[^ \\t\\n\\r()!|&\\^]/,le=Fe([\" \",\"\t\",`\n`,\"\\r\",\"(\",\")\",\"!\",\"|\",\"&\",\"^\"],!0,!1),ce=function($){return e.queryPattern.test($)},Ce=function($){return e.checkFn($)},de=be(\"whitespace\"),Be=/^[ \\t\\n\\r]/,Ee=Fe([\" \",\"\t\",`\n`,\"\\r\"],!1,!1),g=0,me=0,we=[{line:1,column:1}],Ae=0,ne=[],Z=0,xe;if(\"startRule\"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule \"`+e.startRule+'\".');a=o[e.startRule]}function Ne(){return t.substring(me,g)}function ht(){return Ue(me,g)}function H($,ie){throw ie=ie!==void 0?ie:Ue(me,g),b([be($)],t.substring(me,g),ie)}function rt($,ie){throw ie=ie!==void 0?ie:Ue(me,g),w($,ie)}function Te($,ie){return{type:\"literal\",text:$,ignoreCase:ie}}function Fe($,ie,Se){return{type:\"class\",parts:$,inverted:ie,ignoreCase:Se}}function ke(){return{type:\"any\"}}function Ye(){return{type:\"end\"}}function be($){return{type:\"other\",description:$}}function et($){var ie=we[$],Se;if(ie)return ie;for(Se=$-1;!we[Se];)Se--;for(ie=we[Se],ie={line:ie.line,column:ie.column};Se<$;)t.charCodeAt(Se)===10?(ie.line++,ie.column=1):ie.column++,Se++;return we[$]=ie,ie}function Ue($,ie){var Se=et($),Re=et(ie);return{start:{offset:$,line:Se.line,column:Se.column},end:{offset:ie,line:Re.line,column:Re.column}}}function S($){g<Ae||(g>Ae&&(Ae=g,ne=[]),ne.push($))}function w($,ie){return new sg($,null,null,ie)}function b($,ie,Se){return new sg(sg.buildMessage($,ie),$,ie,Se)}function y(){var $,ie,Se,Re,at,dt,jt,tr;if($=g,ie=F(),ie!==r){for(Se=[],Re=g,at=X(),at!==r?(t.charCodeAt(g)===124?(dt=n,g++):(dt=r,Z===0&&S(u)),dt===r&&(t.charCodeAt(g)===38?(dt=A,g++):(dt=r,Z===0&&S(p)),dt===r&&(t.charCodeAt(g)===94?(dt=h,g++):(dt=r,Z===0&&S(E)))),dt!==r?(jt=X(),jt!==r?(tr=F(),tr!==r?(at=[at,dt,jt,tr],Re=at):(g=Re,Re=r)):(g=Re,Re=r)):(g=Re,Re=r)):(g=Re,Re=r);Re!==r;)Se.push(Re),Re=g,at=X(),at!==r?(t.charCodeAt(g)===124?(dt=n,g++):(dt=r,Z===0&&S(u)),dt===r&&(t.charCodeAt(g)===38?(dt=A,g++):(dt=r,Z===0&&S(p)),dt===r&&(t.charCodeAt(g)===94?(dt=h,g++):(dt=r,Z===0&&S(E)))),dt!==r?(jt=X(),jt!==r?(tr=F(),tr!==r?(at=[at,dt,jt,tr],Re=at):(g=Re,Re=r)):(g=Re,Re=r)):(g=Re,Re=r)):(g=Re,Re=r);Se!==r?(me=$,ie=I(ie,Se),$=ie):(g=$,$=r)}else g=$,$=r;return $}function F(){var $,ie,Se,Re,at,dt;return $=g,t.charCodeAt(g)===33?(ie=v,g++):(ie=r,Z===0&&S(x)),ie!==r?(Se=F(),Se!==r?(me=$,ie=C(Se),$=ie):(g=$,$=r)):(g=$,$=r),$===r&&($=g,t.charCodeAt(g)===40?(ie=R,g++):(ie=r,Z===0&&S(L)),ie!==r?(Se=X(),Se!==r?(Re=y(),Re!==r?(at=X(),at!==r?(t.charCodeAt(g)===41?(dt=U,g++):(dt=r,Z===0&&S(z)),dt!==r?(me=$,ie=te(Re),$=ie):(g=$,$=r)):(g=$,$=r)):(g=$,$=r)):(g=$,$=r)):(g=$,$=r),$===r&&($=J())),$}function J(){var $,ie,Se,Re,at;if($=g,ie=X(),ie!==r){if(Se=g,Re=[],ae.test(t.charAt(g))?(at=t.charAt(g),g++):(at=r,Z===0&&S(le)),at!==r)for(;at!==r;)Re.push(at),ae.test(t.charAt(g))?(at=t.charAt(g),g++):(at=r,Z===0&&S(le));else Re=r;Re!==r?Se=t.substring(Se,g):Se=Re,Se!==r?(me=g,Re=ce(Se),Re?Re=void 0:Re=r,Re!==r?(me=$,ie=Ce(Se),$=ie):(g=$,$=r)):(g=$,$=r)}else g=$,$=r;return $}function X(){var $,ie;for(Z++,$=[],Be.test(t.charAt(g))?(ie=t.charAt(g),g++):(ie=r,Z===0&&S(Ee));ie!==r;)$.push(ie),Be.test(t.charAt(g))?(ie=t.charAt(g),g++):(ie=r,Z===0&&S(Ee));return Z--,$===r&&(ie=r,Z===0&&S(de)),$}if(xe=a(),xe!==r&&g===t.length)return xe;throw xe!==r&&g<t.length&&S(Ye()),b(ne,Ae<t.length?t.charAt(Ae):null,Ae<t.length?Ue(Ae,Ae+1):Ue(Ae,Ae))}ZJ.exports={SyntaxError:sg,parse:p9e}});var eX=_(fP=>{var{parse:h9e}=$J();fP.makeParser=(t=/[a-z]+/)=>(e,r)=>h9e(e,{queryPattern:t,checkFn:r});fP.parse=fP.makeParser()});var rX=_((RQt,tX)=>{\"use strict\";tX.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var rN=_((TQt,iX)=>{var oI=rX(),nX={};for(let t of Object.keys(oI))nX[oI[t]]=t;var Ar={rgb:{channels:3,labels:\"rgb\"},hsl:{channels:3,labels:\"hsl\"},hsv:{channels:3,labels:\"hsv\"},hwb:{channels:3,labels:\"hwb\"},cmyk:{channels:4,labels:\"cmyk\"},xyz:{channels:3,labels:\"xyz\"},lab:{channels:3,labels:\"lab\"},lch:{channels:3,labels:\"lch\"},hex:{channels:1,labels:[\"hex\"]},keyword:{channels:1,labels:[\"keyword\"]},ansi16:{channels:1,labels:[\"ansi16\"]},ansi256:{channels:1,labels:[\"ansi256\"]},hcg:{channels:3,labels:[\"h\",\"c\",\"g\"]},apple:{channels:3,labels:[\"r16\",\"g16\",\"b16\"]},gray:{channels:1,labels:[\"gray\"]}};iX.exports=Ar;for(let t of Object.keys(Ar)){if(!(\"channels\"in Ar[t]))throw new Error(\"missing channels property: \"+t);if(!(\"labels\"in Ar[t]))throw new Error(\"missing channel labels property: \"+t);if(Ar[t].labels.length!==Ar[t].channels)throw new Error(\"channel and label counts mismatch: \"+t);let{channels:e,labels:r}=Ar[t];delete Ar[t].channels,delete Ar[t].labels,Object.defineProperty(Ar[t],\"channels\",{value:e}),Object.defineProperty(Ar[t],\"labels\",{value:r})}Ar.rgb.hsl=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(e,r,o),n=Math.max(e,r,o),u=n-a,A,p;n===a?A=0:e===n?A=(r-o)/u:r===n?A=2+(o-e)/u:o===n&&(A=4+(e-r)/u),A=Math.min(A*60,360),A<0&&(A+=360);let h=(a+n)/2;return n===a?p=0:h<=.5?p=u/(n+a):p=u/(2-n-a),[A,p*100,h*100]};Ar.rgb.hsv=function(t){let e,r,o,a,n,u=t[0]/255,A=t[1]/255,p=t[2]/255,h=Math.max(u,A,p),E=h-Math.min(u,A,p),I=function(v){return(h-v)/6/E+1/2};return E===0?(a=0,n=0):(n=E/h,e=I(u),r=I(A),o=I(p),u===h?a=o-r:A===h?a=1/3+e-o:p===h&&(a=2/3+r-e),a<0?a+=1:a>1&&(a-=1)),[a*360,n*100,h*100]};Ar.rgb.hwb=function(t){let e=t[0],r=t[1],o=t[2],a=Ar.rgb.hsl(t)[0],n=1/255*Math.min(e,Math.min(r,o));return o=1-1/255*Math.max(e,Math.max(r,o)),[a,n*100,o*100]};Ar.rgb.cmyk=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(1-e,1-r,1-o),n=(1-e-a)/(1-a)||0,u=(1-r-a)/(1-a)||0,A=(1-o-a)/(1-a)||0;return[n*100,u*100,A*100,a*100]};function g9e(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}Ar.rgb.keyword=function(t){let e=nX[t];if(e)return e;let r=1/0,o;for(let a of Object.keys(oI)){let n=oI[a],u=g9e(t,n);u<r&&(r=u,o=a)}return o};Ar.keyword.rgb=function(t){return oI[t]};Ar.rgb.xyz=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255;e=e>.04045?((e+.055)/1.055)**2.4:e/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,o=o>.04045?((o+.055)/1.055)**2.4:o/12.92;let a=e*.4124+r*.3576+o*.1805,n=e*.2126+r*.7152+o*.0722,u=e*.0193+r*.1192+o*.9505;return[a*100,n*100,u*100]};Ar.rgb.lab=function(t){let e=Ar.rgb.xyz(t),r=e[0],o=e[1],a=e[2];r/=95.047,o/=100,a/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,o=o>.008856?o**(1/3):7.787*o+16/116,a=a>.008856?a**(1/3):7.787*a+16/116;let n=116*o-16,u=500*(r-o),A=200*(o-a);return[n,u,A]};Ar.hsl.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100,a,n,u;if(r===0)return u=o*255,[u,u,u];o<.5?a=o*(1+r):a=o+r-o*r;let A=2*o-a,p=[0,0,0];for(let h=0;h<3;h++)n=e+1/3*-(h-1),n<0&&n++,n>1&&n--,6*n<1?u=A+(a-A)*6*n:2*n<1?u=a:3*n<2?u=A+(a-A)*(2/3-n)*6:u=A,p[h]=u*255;return p};Ar.hsl.hsv=function(t){let e=t[0],r=t[1]/100,o=t[2]/100,a=r,n=Math.max(o,.01);o*=2,r*=o<=1?o:2-o,a*=n<=1?n:2-n;let u=(o+r)/2,A=o===0?2*a/(n+a):2*r/(o+r);return[e,A*100,u*100]};Ar.hsv.rgb=function(t){let e=t[0]/60,r=t[1]/100,o=t[2]/100,a=Math.floor(e)%6,n=e-Math.floor(e),u=255*o*(1-r),A=255*o*(1-r*n),p=255*o*(1-r*(1-n));switch(o*=255,a){case 0:return[o,p,u];case 1:return[A,o,u];case 2:return[u,o,p];case 3:return[u,A,o];case 4:return[p,u,o];case 5:return[o,u,A]}};Ar.hsv.hsl=function(t){let e=t[0],r=t[1]/100,o=t[2]/100,a=Math.max(o,.01),n,u;u=(2-r)*o;let A=(2-r)*a;return n=r*a,n/=A<=1?A:2-A,n=n||0,u/=2,[e,n*100,u*100]};Ar.hwb.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100,a=r+o,n;a>1&&(r/=a,o/=a);let u=Math.floor(6*e),A=1-o;n=6*e-u,u&1&&(n=1-n);let p=r+n*(A-r),h,E,I;switch(u){default:case 6:case 0:h=A,E=p,I=r;break;case 1:h=p,E=A,I=r;break;case 2:h=r,E=A,I=p;break;case 3:h=r,E=p,I=A;break;case 4:h=p,E=r,I=A;break;case 5:h=A,E=r,I=p;break}return[h*255,E*255,I*255]};Ar.cmyk.rgb=function(t){let e=t[0]/100,r=t[1]/100,o=t[2]/100,a=t[3]/100,n=1-Math.min(1,e*(1-a)+a),u=1-Math.min(1,r*(1-a)+a),A=1-Math.min(1,o*(1-a)+a);return[n*255,u*255,A*255]};Ar.xyz.rgb=function(t){let e=t[0]/100,r=t[1]/100,o=t[2]/100,a,n,u;return a=e*3.2406+r*-1.5372+o*-.4986,n=e*-.9689+r*1.8758+o*.0415,u=e*.0557+r*-.204+o*1.057,a=a>.0031308?1.055*a**(1/2.4)-.055:a*12.92,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,u=u>.0031308?1.055*u**(1/2.4)-.055:u*12.92,a=Math.min(Math.max(0,a),1),n=Math.min(Math.max(0,n),1),u=Math.min(Math.max(0,u),1),[a*255,n*255,u*255]};Ar.xyz.lab=function(t){let e=t[0],r=t[1],o=t[2];e/=95.047,r/=100,o/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;let a=116*r-16,n=500*(e-r),u=200*(r-o);return[a,n,u]};Ar.lab.xyz=function(t){let e=t[0],r=t[1],o=t[2],a,n,u;n=(e+16)/116,a=r/500+n,u=n-o/200;let A=n**3,p=a**3,h=u**3;return n=A>.008856?A:(n-16/116)/7.787,a=p>.008856?p:(a-16/116)/7.787,u=h>.008856?h:(u-16/116)/7.787,a*=95.047,n*=100,u*=108.883,[a,n,u]};Ar.lab.lch=function(t){let e=t[0],r=t[1],o=t[2],a;a=Math.atan2(o,r)*360/2/Math.PI,a<0&&(a+=360);let u=Math.sqrt(r*r+o*o);return[e,u,a]};Ar.lch.lab=function(t){let e=t[0],r=t[1],a=t[2]/360*2*Math.PI,n=r*Math.cos(a),u=r*Math.sin(a);return[e,n,u]};Ar.rgb.ansi16=function(t,e=null){let[r,o,a]=t,n=e===null?Ar.rgb.hsv(t)[2]:e;if(n=Math.round(n/50),n===0)return 30;let u=30+(Math.round(a/255)<<2|Math.round(o/255)<<1|Math.round(r/255));return n===2&&(u+=60),u};Ar.hsv.ansi16=function(t){return Ar.rgb.ansi16(Ar.hsv.rgb(t),t[2])};Ar.rgb.ansi256=function(t){let e=t[0],r=t[1],o=t[2];return e===r&&r===o?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(o/255*5)};Ar.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let r=(~~(t>50)+1)*.5,o=(e&1)*r*255,a=(e>>1&1)*r*255,n=(e>>2&1)*r*255;return[o,a,n]};Ar.ansi256.rgb=function(t){if(t>=232){let n=(t-232)*10+8;return[n,n,n]}t-=16;let e,r=Math.floor(t/36)/5*255,o=Math.floor((e=t%36)/6)/5*255,a=e%6/5*255;return[r,o,a]};Ar.rgb.hex=function(t){let r=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return\"000000\".substring(r.length)+r};Ar.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let r=e[0];e[0].length===3&&(r=r.split(\"\").map(A=>A+A).join(\"\"));let o=parseInt(r,16),a=o>>16&255,n=o>>8&255,u=o&255;return[a,n,u]};Ar.rgb.hcg=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.max(Math.max(e,r),o),n=Math.min(Math.min(e,r),o),u=a-n,A,p;return u<1?A=n/(1-u):A=0,u<=0?p=0:a===e?p=(r-o)/u%6:a===r?p=2+(o-e)/u:p=4+(e-r)/u,p/=6,p%=1,[p*360,u*100,A*100]};Ar.hsl.hcg=function(t){let e=t[1]/100,r=t[2]/100,o=r<.5?2*e*r:2*e*(1-r),a=0;return o<1&&(a=(r-.5*o)/(1-o)),[t[0],o*100,a*100]};Ar.hsv.hcg=function(t){let e=t[1]/100,r=t[2]/100,o=e*r,a=0;return o<1&&(a=(r-o)/(1-o)),[t[0],o*100,a*100]};Ar.hcg.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100;if(r===0)return[o*255,o*255,o*255];let a=[0,0,0],n=e%1*6,u=n%1,A=1-u,p=0;switch(Math.floor(n)){case 0:a[0]=1,a[1]=u,a[2]=0;break;case 1:a[0]=A,a[1]=1,a[2]=0;break;case 2:a[0]=0,a[1]=1,a[2]=u;break;case 3:a[0]=0,a[1]=A,a[2]=1;break;case 4:a[0]=u,a[1]=0,a[2]=1;break;default:a[0]=1,a[1]=0,a[2]=A}return p=(1-r)*o,[(r*a[0]+p)*255,(r*a[1]+p)*255,(r*a[2]+p)*255]};Ar.hcg.hsv=function(t){let e=t[1]/100,r=t[2]/100,o=e+r*(1-e),a=0;return o>0&&(a=e/o),[t[0],a*100,o*100]};Ar.hcg.hsl=function(t){let e=t[1]/100,o=t[2]/100*(1-e)+.5*e,a=0;return o>0&&o<.5?a=e/(2*o):o>=.5&&o<1&&(a=e/(2*(1-o))),[t[0],a*100,o*100]};Ar.hcg.hwb=function(t){let e=t[1]/100,r=t[2]/100,o=e+r*(1-e);return[t[0],(o-e)*100,(1-o)*100]};Ar.hwb.hcg=function(t){let e=t[1]/100,o=1-t[2]/100,a=o-e,n=0;return a<1&&(n=(o-a)/(1-a)),[t[0],a*100,n*100]};Ar.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};Ar.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};Ar.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};Ar.gray.hsl=function(t){return[0,0,t[0]]};Ar.gray.hsv=Ar.gray.hsl;Ar.gray.hwb=function(t){return[0,100,t[0]]};Ar.gray.cmyk=function(t){return[0,0,0,t[0]]};Ar.gray.lab=function(t){return[t[0],0,0]};Ar.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,o=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return\"000000\".substring(o.length)+o};Ar.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var oX=_((NQt,sX)=>{var pP=rN();function d9e(){let t={},e=Object.keys(pP);for(let r=e.length,o=0;o<r;o++)t[e[o]]={distance:-1,parent:null};return t}function m9e(t){let e=d9e(),r=[t];for(e[t].distance=0;r.length;){let o=r.pop(),a=Object.keys(pP[o]);for(let n=a.length,u=0;u<n;u++){let A=a[u],p=e[A];p.distance===-1&&(p.distance=e[o].distance+1,p.parent=o,r.unshift(A))}}return e}function y9e(t,e){return function(r){return e(t(r))}}function E9e(t,e){let r=[e[t].parent,t],o=pP[e[t].parent][t],a=e[t].parent;for(;e[a].parent;)r.unshift(e[a].parent),o=y9e(pP[e[a].parent][a],o),a=e[a].parent;return o.conversion=r,o}sX.exports=function(t){let e=m9e(t),r={},o=Object.keys(e);for(let a=o.length,n=0;n<a;n++){let u=o[n];e[u].parent!==null&&(r[u]=E9e(u,e))}return r}});var lX=_((LQt,aX)=>{var nN=rN(),C9e=oX(),fm={},w9e=Object.keys(nN);function I9e(t){let e=function(...r){let o=r[0];return o==null?o:(o.length>1&&(r=o),t(r))};return\"conversion\"in t&&(e.conversion=t.conversion),e}function B9e(t){let e=function(...r){let o=r[0];if(o==null)return o;o.length>1&&(r=o);let a=t(r);if(typeof a==\"object\")for(let n=a.length,u=0;u<n;u++)a[u]=Math.round(a[u]);return a};return\"conversion\"in t&&(e.conversion=t.conversion),e}w9e.forEach(t=>{fm[t]={},Object.defineProperty(fm[t],\"channels\",{value:nN[t].channels}),Object.defineProperty(fm[t],\"labels\",{value:nN[t].labels});let e=C9e(t);Object.keys(e).forEach(o=>{let a=e[o];fm[t][o]=B9e(a),fm[t][o].raw=I9e(a)})});aX.exports=fm});var aI=_((MQt,pX)=>{\"use strict\";var cX=(t,e)=>(...r)=>`\\x1B[${t(...r)+e}m`,uX=(t,e)=>(...r)=>{let o=t(...r);return`\\x1B[${38+e};5;${o}m`},AX=(t,e)=>(...r)=>{let o=t(...r);return`\\x1B[${38+e};2;${o[0]};${o[1]};${o[2]}m`},hP=t=>t,fX=(t,e,r)=>[t,e,r],pm=(t,e,r)=>{Object.defineProperty(t,e,{get:()=>{let o=r();return Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0}),o},enumerable:!0,configurable:!0})},iN,hm=(t,e,r,o)=>{iN===void 0&&(iN=lX());let a=o?10:0,n={};for(let[u,A]of Object.entries(iN)){let p=u===\"ansi16\"?\"ansi\":u;u===e?n[p]=t(r,a):typeof A==\"object\"&&(n[p]=t(A[e],a))}return n};function v9e(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[r,o]of Object.entries(e)){for(let[a,n]of Object.entries(o))e[a]={open:`\\x1B[${n[0]}m`,close:`\\x1B[${n[1]}m`},o[a]=e[a],t.set(n[0],n[1]);Object.defineProperty(e,r,{value:o,enumerable:!1})}return Object.defineProperty(e,\"codes\",{value:t,enumerable:!1}),e.color.close=\"\\x1B[39m\",e.bgColor.close=\"\\x1B[49m\",pm(e.color,\"ansi\",()=>hm(cX,\"ansi16\",hP,!1)),pm(e.color,\"ansi256\",()=>hm(uX,\"ansi256\",hP,!1)),pm(e.color,\"ansi16m\",()=>hm(AX,\"rgb\",fX,!1)),pm(e.bgColor,\"ansi\",()=>hm(cX,\"ansi16\",hP,!0)),pm(e.bgColor,\"ansi256\",()=>hm(uX,\"ansi256\",hP,!0)),pm(e.bgColor,\"ansi16m\",()=>hm(AX,\"rgb\",fX,!0)),e}Object.defineProperty(pX,\"exports\",{enumerable:!0,get:v9e})});var gX=_((OQt,hX)=>{\"use strict\";hX.exports=(t,e=process.argv)=>{let r=t.startsWith(\"-\")?\"\":t.length===1?\"-\":\"--\",o=e.indexOf(r+t),a=e.indexOf(\"--\");return o!==-1&&(a===-1||o<a)}});var aN=_((UQt,mX)=>{\"use strict\";var D9e=ve(\"os\"),dX=ve(\"tty\"),Ol=gX(),{env:us}=process,Kp;Ol(\"no-color\")||Ol(\"no-colors\")||Ol(\"color=false\")||Ol(\"color=never\")?Kp=0:(Ol(\"color\")||Ol(\"colors\")||Ol(\"color=true\")||Ol(\"color=always\"))&&(Kp=1);\"FORCE_COLOR\"in us&&(us.FORCE_COLOR===\"true\"?Kp=1:us.FORCE_COLOR===\"false\"?Kp=0:Kp=us.FORCE_COLOR.length===0?1:Math.min(parseInt(us.FORCE_COLOR,10),3));function sN(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function oN(t,e){if(Kp===0)return 0;if(Ol(\"color=16m\")||Ol(\"color=full\")||Ol(\"color=truecolor\"))return 3;if(Ol(\"color=256\"))return 2;if(t&&!e&&Kp===void 0)return 0;let r=Kp||0;if(us.TERM===\"dumb\")return r;if(process.platform===\"win32\"){let o=D9e.release().split(\".\");return Number(o[0])>=10&&Number(o[2])>=10586?Number(o[2])>=14931?3:2:1}if(\"CI\"in us)return[\"TRAVIS\",\"CIRCLECI\",\"APPVEYOR\",\"GITLAB_CI\"].some(o=>o in us)||us.CI_NAME===\"codeship\"?1:r;if(\"TEAMCITY_VERSION\"in us)return/^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(us.TEAMCITY_VERSION)?1:0;if(\"GITHUB_ACTIONS\"in us)return 1;if(us.COLORTERM===\"truecolor\")return 3;if(\"TERM_PROGRAM\"in us){let o=parseInt((us.TERM_PROGRAM_VERSION||\"\").split(\".\")[0],10);switch(us.TERM_PROGRAM){case\"iTerm.app\":return o>=3?3:2;case\"Apple_Terminal\":return 2}}return/-256(color)?$/i.test(us.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(us.TERM)||\"COLORTERM\"in us?1:r}function P9e(t){let e=oN(t,t&&t.isTTY);return sN(e)}mX.exports={supportsColor:P9e,stdout:sN(oN(!0,dX.isatty(1))),stderr:sN(oN(!0,dX.isatty(2)))}});var EX=_((_Qt,yX)=>{\"use strict\";var b9e=(t,e,r)=>{let o=t.indexOf(e);if(o===-1)return t;let a=e.length,n=0,u=\"\";do u+=t.substr(n,o-n)+e+r,n=o+a,o=t.indexOf(e,n);while(o!==-1);return u+=t.substr(n),u},S9e=(t,e,r,o)=>{let a=0,n=\"\";do{let u=t[o-1]===\"\\r\";n+=t.substr(a,(u?o-1:o)-a)+e+(u?`\\r\n`:`\n`)+r,a=o+1,o=t.indexOf(`\n`,a)}while(o!==-1);return n+=t.substr(a),n};yX.exports={stringReplaceAll:b9e,stringEncaseCRLFWithFirstIndex:S9e}});var vX=_((HQt,BX)=>{\"use strict\";var x9e=/(?:\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi,CX=/(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g,k9e=/^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/,Q9e=/\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.)|([^\\\\])/gi,F9e=new Map([[\"n\",`\n`],[\"r\",\"\\r\"],[\"t\",\"\t\"],[\"b\",\"\\b\"],[\"f\",\"\\f\"],[\"v\",\"\\v\"],[\"0\",\"\\0\"],[\"\\\\\",\"\\\\\"],[\"e\",\"\\x1B\"],[\"a\",\"\\x07\"]]);function IX(t){let e=t[0]===\"u\",r=t[1]===\"{\";return e&&!r&&t.length===5||t[0]===\"x\"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):F9e.get(t)||t}function R9e(t,e){let r=[],o=e.trim().split(/\\s*,\\s*/g),a;for(let n of o){let u=Number(n);if(!Number.isNaN(u))r.push(u);else if(a=n.match(k9e))r.push(a[2].replace(Q9e,(A,p,h)=>p?IX(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function T9e(t){CX.lastIndex=0;let e=[],r;for(;(r=CX.exec(t))!==null;){let o=r[1];if(r[2]){let a=R9e(o,r[2]);e.push([o].concat(a))}else e.push([o])}return e}function wX(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let o=t;for(let[a,n]of Object.entries(r))if(Array.isArray(n)){if(!(a in o))throw new Error(`Unknown Chalk style: ${a}`);o=n.length>0?o[a](...n):o[a]}return o}BX.exports=(t,e)=>{let r=[],o=[],a=[];if(e.replace(x9e,(n,u,A,p,h,E)=>{if(u)a.push(IX(u));else if(p){let I=a.join(\"\");a=[],o.push(r.length===0?I:wX(t,r)(I)),r.push({inverse:A,styles:T9e(p)})}else if(h){if(r.length===0)throw new Error(\"Found extraneous } in Chalk template literal\");o.push(wX(t,r)(a.join(\"\"))),a=[],r.pop()}else a.push(E)}),o.push(a.join(\"\")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?\"\":\"s\"} (\\`}\\`)`;throw new Error(n)}return o.join(\"\")}});var pN=_((qQt,SX)=>{\"use strict\";var lI=aI(),{stdout:cN,stderr:uN}=aN(),{stringReplaceAll:N9e,stringEncaseCRLFWithFirstIndex:L9e}=EX(),DX=[\"ansi\",\"ansi\",\"ansi256\",\"ansi16m\"],gm=Object.create(null),M9e=(t,e={})=>{if(e.level>3||e.level<0)throw new Error(\"The `level` option should be an integer from 0 to 3\");let r=cN?cN.level:0;t.level=e.level===void 0?r:e.level},AN=class{constructor(e){return PX(e)}},PX=t=>{let e={};return M9e(e,t),e.template=(...r)=>_9e(e.template,...r),Object.setPrototypeOf(e,gP.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error(\"`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.\")},e.template.Instance=AN,e.template};function gP(t){return PX(t)}for(let[t,e]of Object.entries(lI))gm[t]={get(){let r=dP(this,fN(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};gm.visible={get(){let t=dP(this,this._styler,!0);return Object.defineProperty(this,\"visible\",{value:t}),t}};var bX=[\"rgb\",\"hex\",\"keyword\",\"hsl\",\"hsv\",\"hwb\",\"ansi\",\"ansi256\"];for(let t of bX)gm[t]={get(){let{level:e}=this;return function(...r){let o=fN(lI.color[DX[e]][t](...r),lI.color.close,this._styler);return dP(this,o,this._isEmpty)}}};for(let t of bX){let e=\"bg\"+t[0].toUpperCase()+t.slice(1);gm[e]={get(){let{level:r}=this;return function(...o){let a=fN(lI.bgColor[DX[r]][t](...o),lI.bgColor.close,this._styler);return dP(this,a,this._isEmpty)}}}}var O9e=Object.defineProperties(()=>{},{...gm,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),fN=(t,e,r)=>{let o,a;return r===void 0?(o=t,a=e):(o=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:o,closeAll:a,parent:r}},dP=(t,e,r)=>{let o=(...a)=>U9e(o,a.length===1?\"\"+a[0]:a.join(\" \"));return o.__proto__=O9e,o._generator=t,o._styler=e,o._isEmpty=r,o},U9e=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?\"\":e;let r=t._styler;if(r===void 0)return e;let{openAll:o,closeAll:a}=r;if(e.indexOf(\"\\x1B\")!==-1)for(;r!==void 0;)e=N9e(e,r.close,r.open),r=r.parent;let n=e.indexOf(`\n`);return n!==-1&&(e=L9e(e,a,o,n)),o+e+a},lN,_9e=(t,...e)=>{let[r]=e;if(!Array.isArray(r))return e.join(\" \");let o=e.slice(1),a=[r.raw[0]];for(let n=1;n<r.length;n++)a.push(String(o[n-1]).replace(/[{}\\\\]/g,\"\\\\$&\"),String(r.raw[n]));return lN===void 0&&(lN=vX()),lN(t,a.join(\"\"))};Object.defineProperties(gP.prototype,gm);var cI=gP();cI.supportsColor=cN;cI.stderr=gP({level:uN?uN.level:0});cI.stderr.supportsColor=uN;cI.Level={None:0,Basic:1,Ansi256:2,TrueColor:3,0:\"None\",1:\"Basic\",2:\"Ansi256\",3:\"TrueColor\"};SX.exports=cI});var mP=_(Ul=>{\"use strict\";Ul.isInteger=t=>typeof t==\"number\"?Number.isInteger(t):typeof t==\"string\"&&t.trim()!==\"\"?Number.isInteger(Number(t)):!1;Ul.find=(t,e)=>t.nodes.find(r=>r.type===e);Ul.exceedsLimit=(t,e,r=1,o)=>o===!1||!Ul.isInteger(t)||!Ul.isInteger(e)?!1:(Number(e)-Number(t))/Number(r)>=o;Ul.escapeNode=(t,e=0,r)=>{let o=t.nodes[e];o&&(r&&o.type===r||o.type===\"open\"||o.type===\"close\")&&o.escaped!==!0&&(o.value=\"\\\\\"+o.value,o.escaped=!0)};Ul.encloseBrace=t=>t.type!==\"brace\"||t.commas>>0+t.ranges>>0?!1:(t.invalid=!0,!0);Ul.isInvalidBrace=t=>t.type!==\"brace\"?!1:t.invalid===!0||t.dollar?!0:!(t.commas>>0+t.ranges>>0)||t.open!==!0||t.close!==!0?(t.invalid=!0,!0):!1;Ul.isOpenOrClose=t=>t.type===\"open\"||t.type===\"close\"?!0:t.open===!0||t.close===!0;Ul.reduce=t=>t.reduce((e,r)=>(r.type===\"text\"&&e.push(r.value),r.type===\"range\"&&(r.type=\"text\"),e),[]);Ul.flatten=(...t)=>{let e=[],r=o=>{for(let a=0;a<o.length;a++){let n=o[a];Array.isArray(n)?r(n,e):n!==void 0&&e.push(n)}return e};return r(t),e}});var yP=_((GQt,kX)=>{\"use strict\";var xX=mP();kX.exports=(t,e={})=>{let r=(o,a={})=>{let n=e.escapeInvalid&&xX.isInvalidBrace(a),u=o.invalid===!0&&e.escapeInvalid===!0,A=\"\";if(o.value)return(n||u)&&xX.isOpenOrClose(o)?\"\\\\\"+o.value:o.value;if(o.value)return o.value;if(o.nodes)for(let p of o.nodes)A+=r(p);return A};return r(t)}});var FX=_((YQt,QX)=>{\"use strict\";QX.exports=function(t){return typeof t==\"number\"?t-t===0:typeof t==\"string\"&&t.trim()!==\"\"?Number.isFinite?Number.isFinite(+t):isFinite(+t):!1}});var HX=_((WQt,_X)=>{\"use strict\";var RX=FX(),og=(t,e,r)=>{if(RX(t)===!1)throw new TypeError(\"toRegexRange: expected the first argument to be a number\");if(e===void 0||t===e)return String(t);if(RX(e)===!1)throw new TypeError(\"toRegexRange: expected the second argument to be a number.\");let o={relaxZeros:!0,...r};typeof o.strictZeros==\"boolean\"&&(o.relaxZeros=o.strictZeros===!1);let a=String(o.relaxZeros),n=String(o.shorthand),u=String(o.capture),A=String(o.wrap),p=t+\":\"+e+\"=\"+a+n+u+A;if(og.cache.hasOwnProperty(p))return og.cache[p].result;let h=Math.min(t,e),E=Math.max(t,e);if(Math.abs(h-E)===1){let R=t+\"|\"+e;return o.capture?`(${R})`:o.wrap===!1?R:`(?:${R})`}let I=UX(t)||UX(e),v={min:t,max:e,a:h,b:E},x=[],C=[];if(I&&(v.isPadded=I,v.maxLen=String(v.max).length),h<0){let R=E<0?Math.abs(E):1;C=TX(R,Math.abs(h),v,o),h=v.a=0}return E>=0&&(x=TX(h,E,v,o)),v.negatives=C,v.positives=x,v.result=H9e(C,x,o),o.capture===!0?v.result=`(${v.result})`:o.wrap!==!1&&x.length+C.length>1&&(v.result=`(?:${v.result})`),og.cache[p]=v,v.result};function H9e(t,e,r){let o=hN(t,e,\"-\",!1,r)||[],a=hN(e,t,\"\",!1,r)||[],n=hN(t,e,\"-?\",!0,r)||[];return o.concat(n).concat(a).join(\"|\")}function q9e(t,e){let r=1,o=1,a=LX(t,r),n=new Set([e]);for(;t<=a&&a<=e;)n.add(a),r+=1,a=LX(t,r);for(a=MX(e+1,o)-1;t<a&&a<=e;)n.add(a),o+=1,a=MX(e+1,o)-1;return n=[...n],n.sort(Y9e),n}function j9e(t,e,r){if(t===e)return{pattern:t,count:[],digits:0};let o=G9e(t,e),a=o.length,n=\"\",u=0;for(let A=0;A<a;A++){let[p,h]=o[A];p===h?n+=p:p!==\"0\"||h!==\"9\"?n+=W9e(p,h,r):u++}return u&&(n+=r.shorthand===!0?\"\\\\d\":\"[0-9]\"),{pattern:n,count:[u],digits:a}}function TX(t,e,r,o){let a=q9e(t,e),n=[],u=t,A;for(let p=0;p<a.length;p++){let h=a[p],E=j9e(String(u),String(h),o),I=\"\";if(!r.isPadded&&A&&A.pattern===E.pattern){A.count.length>1&&A.count.pop(),A.count.push(E.count[0]),A.string=A.pattern+OX(A.count),u=h+1;continue}r.isPadded&&(I=K9e(h,r,o)),E.string=I+E.pattern+OX(E.count),n.push(E),u=h+1,A=E}return n}function hN(t,e,r,o,a){let n=[];for(let u of t){let{string:A}=u;!o&&!NX(e,\"string\",A)&&n.push(r+A),o&&NX(e,\"string\",A)&&n.push(r+A)}return n}function G9e(t,e){let r=[];for(let o=0;o<t.length;o++)r.push([t[o],e[o]]);return r}function Y9e(t,e){return t>e?1:e>t?-1:0}function NX(t,e,r){return t.some(o=>o[e]===r)}function LX(t,e){return Number(String(t).slice(0,-e)+\"9\".repeat(e))}function MX(t,e){return t-t%Math.pow(10,e)}function OX(t){let[e=0,r=\"\"]=t;return r||e>1?`{${e+(r?\",\"+r:\"\")}}`:\"\"}function W9e(t,e,r){return`[${t}${e-t===1?\"\":\"-\"}${e}]`}function UX(t){return/^-?(0+)\\d/.test(t)}function K9e(t,e,r){if(!e.isPadded)return t;let o=Math.abs(e.maxLen-String(t).length),a=r.relaxZeros!==!1;switch(o){case 0:return\"\";case 1:return a?\"0?\":\"0\";case 2:return a?\"0{0,2}\":\"00\";default:return a?`0{0,${o}}`:`0{${o}}`}}og.cache={};og.clearCache=()=>og.cache={};_X.exports=og});var mN=_((KQt,zX)=>{\"use strict\";var V9e=ve(\"util\"),GX=HX(),qX=t=>t!==null&&typeof t==\"object\"&&!Array.isArray(t),z9e=t=>e=>t===!0?Number(e):String(e),gN=t=>typeof t==\"number\"||typeof t==\"string\"&&t!==\"\",uI=t=>Number.isInteger(+t),dN=t=>{let e=`${t}`,r=-1;if(e[0]===\"-\"&&(e=e.slice(1)),e===\"0\")return!1;for(;e[++r]===\"0\";);return r>0},J9e=(t,e,r)=>typeof t==\"string\"||typeof e==\"string\"?!0:r.stringify===!0,X9e=(t,e,r)=>{if(e>0){let o=t[0]===\"-\"?\"-\":\"\";o&&(t=t.slice(1)),t=o+t.padStart(o?e-1:e,\"0\")}return r===!1?String(t):t},jX=(t,e)=>{let r=t[0]===\"-\"?\"-\":\"\";for(r&&(t=t.slice(1),e--);t.length<e;)t=\"0\"+t;return r?\"-\"+t:t},Z9e=(t,e)=>{t.negatives.sort((u,A)=>u<A?-1:u>A?1:0),t.positives.sort((u,A)=>u<A?-1:u>A?1:0);let r=e.capture?\"\":\"?:\",o=\"\",a=\"\",n;return t.positives.length&&(o=t.positives.join(\"|\")),t.negatives.length&&(a=`-(${r}${t.negatives.join(\"|\")})`),o&&a?n=`${o}|${a}`:n=o||a,e.wrap?`(${r}${n})`:n},YX=(t,e,r,o)=>{if(r)return GX(t,e,{wrap:!1,...o});let a=String.fromCharCode(t);if(t===e)return a;let n=String.fromCharCode(e);return`[${a}-${n}]`},WX=(t,e,r)=>{if(Array.isArray(t)){let o=r.wrap===!0,a=r.capture?\"\":\"?:\";return o?`(${a}${t.join(\"|\")})`:t.join(\"|\")}return GX(t,e,r)},KX=(...t)=>new RangeError(\"Invalid range arguments: \"+V9e.inspect(...t)),VX=(t,e,r)=>{if(r.strictRanges===!0)throw KX([t,e]);return[]},$9e=(t,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step \"${t}\" to be a number`);return[]},e7e=(t,e,r=1,o={})=>{let a=Number(t),n=Number(e);if(!Number.isInteger(a)||!Number.isInteger(n)){if(o.strictRanges===!0)throw KX([t,e]);return[]}a===0&&(a=0),n===0&&(n=0);let u=a>n,A=String(t),p=String(e),h=String(r);r=Math.max(Math.abs(r),1);let E=dN(A)||dN(p)||dN(h),I=E?Math.max(A.length,p.length,h.length):0,v=E===!1&&J9e(t,e,o)===!1,x=o.transform||z9e(v);if(o.toRegex&&r===1)return YX(jX(t,I),jX(e,I),!0,o);let C={negatives:[],positives:[]},R=z=>C[z<0?\"negatives\":\"positives\"].push(Math.abs(z)),L=[],U=0;for(;u?a>=n:a<=n;)o.toRegex===!0&&r>1?R(a):L.push(X9e(x(a,U),I,v)),a=u?a-r:a+r,U++;return o.toRegex===!0?r>1?Z9e(C,o):WX(L,null,{wrap:!1,...o}):L},t7e=(t,e,r=1,o={})=>{if(!uI(t)&&t.length>1||!uI(e)&&e.length>1)return VX(t,e,o);let a=o.transform||(v=>String.fromCharCode(v)),n=`${t}`.charCodeAt(0),u=`${e}`.charCodeAt(0),A=n>u,p=Math.min(n,u),h=Math.max(n,u);if(o.toRegex&&r===1)return YX(p,h,!1,o);let E=[],I=0;for(;A?n>=u:n<=u;)E.push(a(n,I)),n=A?n-r:n+r,I++;return o.toRegex===!0?WX(E,null,{wrap:!1,options:o}):E},EP=(t,e,r,o={})=>{if(e==null&&gN(t))return[t];if(!gN(t)||!gN(e))return VX(t,e,o);if(typeof r==\"function\")return EP(t,e,1,{transform:r});if(qX(r))return EP(t,e,0,r);let a={...o};return a.capture===!0&&(a.wrap=!0),r=r||a.step||1,uI(r)?uI(t)&&uI(e)?e7e(t,e,r,a):t7e(t,e,Math.max(Math.abs(r),1),a):r!=null&&!qX(r)?$9e(r,a):EP(t,e,1,r)};zX.exports=EP});var ZX=_((VQt,XX)=>{\"use strict\";var r7e=mN(),JX=mP(),n7e=(t,e={})=>{let r=(o,a={})=>{let n=JX.isInvalidBrace(a),u=o.invalid===!0&&e.escapeInvalid===!0,A=n===!0||u===!0,p=e.escapeInvalid===!0?\"\\\\\":\"\",h=\"\";if(o.isOpen===!0||o.isClose===!0)return p+o.value;if(o.type===\"open\")return A?p+o.value:\"(\";if(o.type===\"close\")return A?p+o.value:\")\";if(o.type===\"comma\")return o.prev.type===\"comma\"?\"\":A?o.value:\"|\";if(o.value)return o.value;if(o.nodes&&o.ranges>0){let E=JX.reduce(o.nodes),I=r7e(...E,{...e,wrap:!1,toRegex:!0});if(I.length!==0)return E.length>1&&I.length>1?`(${I})`:I}if(o.nodes)for(let E of o.nodes)h+=r(E,o);return h};return r(t)};XX.exports=n7e});var tZ=_((zQt,eZ)=>{\"use strict\";var i7e=mN(),$X=yP(),dm=mP(),ag=(t=\"\",e=\"\",r=!1)=>{let o=[];if(t=[].concat(t),e=[].concat(e),!e.length)return t;if(!t.length)return r?dm.flatten(e).map(a=>`{${a}}`):e;for(let a of t)if(Array.isArray(a))for(let n of a)o.push(ag(n,e,r));else for(let n of e)r===!0&&typeof n==\"string\"&&(n=`{${n}}`),o.push(Array.isArray(n)?ag(a,n,r):a+n);return dm.flatten(o)},s7e=(t,e={})=>{let r=e.rangeLimit===void 0?1e3:e.rangeLimit,o=(a,n={})=>{a.queue=[];let u=n,A=n.queue;for(;u.type!==\"brace\"&&u.type!==\"root\"&&u.parent;)u=u.parent,A=u.queue;if(a.invalid||a.dollar){A.push(ag(A.pop(),$X(a,e)));return}if(a.type===\"brace\"&&a.invalid!==!0&&a.nodes.length===2){A.push(ag(A.pop(),[\"{}\"]));return}if(a.nodes&&a.ranges>0){let I=dm.reduce(a.nodes);if(dm.exceedsLimit(...I,e.step,r))throw new RangeError(\"expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.\");let v=i7e(...I,e);v.length===0&&(v=$X(a,e)),A.push(ag(A.pop(),v)),a.nodes=[];return}let p=dm.encloseBrace(a),h=a.queue,E=a;for(;E.type!==\"brace\"&&E.type!==\"root\"&&E.parent;)E=E.parent,h=E.queue;for(let I=0;I<a.nodes.length;I++){let v=a.nodes[I];if(v.type===\"comma\"&&a.type===\"brace\"){I===1&&h.push(\"\"),h.push(\"\");continue}if(v.type===\"close\"){A.push(ag(A.pop(),h,p));continue}if(v.value&&v.type!==\"open\"){h.push(ag(h.pop(),v.value));continue}v.nodes&&o(v,a)}return h};return dm.flatten(o(t))};eZ.exports=s7e});var nZ=_((JQt,rZ)=>{\"use strict\";rZ.exports={MAX_LENGTH:1024*64,CHAR_0:\"0\",CHAR_9:\"9\",CHAR_UPPERCASE_A:\"A\",CHAR_LOWERCASE_A:\"a\",CHAR_UPPERCASE_Z:\"Z\",CHAR_LOWERCASE_Z:\"z\",CHAR_LEFT_PARENTHESES:\"(\",CHAR_RIGHT_PARENTHESES:\")\",CHAR_ASTERISK:\"*\",CHAR_AMPERSAND:\"&\",CHAR_AT:\"@\",CHAR_BACKSLASH:\"\\\\\",CHAR_BACKTICK:\"`\",CHAR_CARRIAGE_RETURN:\"\\r\",CHAR_CIRCUMFLEX_ACCENT:\"^\",CHAR_COLON:\":\",CHAR_COMMA:\",\",CHAR_DOLLAR:\"$\",CHAR_DOT:\".\",CHAR_DOUBLE_QUOTE:'\"',CHAR_EQUAL:\"=\",CHAR_EXCLAMATION_MARK:\"!\",CHAR_FORM_FEED:\"\\f\",CHAR_FORWARD_SLASH:\"/\",CHAR_HASH:\"#\",CHAR_HYPHEN_MINUS:\"-\",CHAR_LEFT_ANGLE_BRACKET:\"<\",CHAR_LEFT_CURLY_BRACE:\"{\",CHAR_LEFT_SQUARE_BRACKET:\"[\",CHAR_LINE_FEED:`\n`,CHAR_NO_BREAK_SPACE:\"\\xA0\",CHAR_PERCENT:\"%\",CHAR_PLUS:\"+\",CHAR_QUESTION_MARK:\"?\",CHAR_RIGHT_ANGLE_BRACKET:\">\",CHAR_RIGHT_CURLY_BRACE:\"}\",CHAR_RIGHT_SQUARE_BRACKET:\"]\",CHAR_SEMICOLON:\";\",CHAR_SINGLE_QUOTE:\"'\",CHAR_SPACE:\" \",CHAR_TAB:\"\t\",CHAR_UNDERSCORE:\"_\",CHAR_VERTICAL_LINE:\"|\",CHAR_ZERO_WIDTH_NOBREAK_SPACE:\"\\uFEFF\"}});var lZ=_((XQt,aZ)=>{\"use strict\";var o7e=yP(),{MAX_LENGTH:iZ,CHAR_BACKSLASH:yN,CHAR_BACKTICK:a7e,CHAR_COMMA:l7e,CHAR_DOT:c7e,CHAR_LEFT_PARENTHESES:u7e,CHAR_RIGHT_PARENTHESES:A7e,CHAR_LEFT_CURLY_BRACE:f7e,CHAR_RIGHT_CURLY_BRACE:p7e,CHAR_LEFT_SQUARE_BRACKET:sZ,CHAR_RIGHT_SQUARE_BRACKET:oZ,CHAR_DOUBLE_QUOTE:h7e,CHAR_SINGLE_QUOTE:g7e,CHAR_NO_BREAK_SPACE:d7e,CHAR_ZERO_WIDTH_NOBREAK_SPACE:m7e}=nZ(),y7e=(t,e={})=>{if(typeof t!=\"string\")throw new TypeError(\"Expected a string\");let r=e||{},o=typeof r.maxLength==\"number\"?Math.min(iZ,r.maxLength):iZ;if(t.length>o)throw new SyntaxError(`Input length (${t.length}), exceeds max characters (${o})`);let a={type:\"root\",input:t,nodes:[]},n=[a],u=a,A=a,p=0,h=t.length,E=0,I=0,v,x={},C=()=>t[E++],R=L=>{if(L.type===\"text\"&&A.type===\"dot\"&&(A.type=\"text\"),A&&A.type===\"text\"&&L.type===\"text\"){A.value+=L.value;return}return u.nodes.push(L),L.parent=u,L.prev=A,A=L,L};for(R({type:\"bos\"});E<h;)if(u=n[n.length-1],v=C(),!(v===m7e||v===d7e)){if(v===yN){R({type:\"text\",value:(e.keepEscaping?v:\"\")+C()});continue}if(v===oZ){R({type:\"text\",value:\"\\\\\"+v});continue}if(v===sZ){p++;let L=!0,U;for(;E<h&&(U=C());){if(v+=U,U===sZ){p++;continue}if(U===yN){v+=C();continue}if(U===oZ&&(p--,p===0))break}R({type:\"text\",value:v});continue}if(v===u7e){u=R({type:\"paren\",nodes:[]}),n.push(u),R({type:\"text\",value:v});continue}if(v===A7e){if(u.type!==\"paren\"){R({type:\"text\",value:v});continue}u=n.pop(),R({type:\"text\",value:v}),u=n[n.length-1];continue}if(v===h7e||v===g7e||v===a7e){let L=v,U;for(e.keepQuotes!==!0&&(v=\"\");E<h&&(U=C());){if(U===yN){v+=U+C();continue}if(U===L){e.keepQuotes===!0&&(v+=U);break}v+=U}R({type:\"text\",value:v});continue}if(v===f7e){I++;let U={type:\"brace\",open:!0,close:!1,dollar:A.value&&A.value.slice(-1)===\"$\"||u.dollar===!0,depth:I,commas:0,ranges:0,nodes:[]};u=R(U),n.push(u),R({type:\"open\",value:v});continue}if(v===p7e){if(u.type!==\"brace\"){R({type:\"text\",value:v});continue}let L=\"close\";u=n.pop(),u.close=!0,R({type:L,value:v}),I--,u=n[n.length-1];continue}if(v===l7e&&I>0){if(u.ranges>0){u.ranges=0;let L=u.nodes.shift();u.nodes=[L,{type:\"text\",value:o7e(u)}]}R({type:\"comma\",value:v}),u.commas++;continue}if(v===c7e&&I>0&&u.commas===0){let L=u.nodes;if(I===0||L.length===0){R({type:\"text\",value:v});continue}if(A.type===\"dot\"){if(u.range=[],A.value+=v,A.type=\"range\",u.nodes.length!==3&&u.nodes.length!==5){u.invalid=!0,u.ranges=0,A.type=\"text\";continue}u.ranges++,u.args=[];continue}if(A.type===\"range\"){L.pop();let U=L[L.length-1];U.value+=A.value+v,A=U,u.ranges--;continue}R({type:\"dot\",value:v});continue}R({type:\"text\",value:v})}do if(u=n.pop(),u.type!==\"root\"){u.nodes.forEach(z=>{z.nodes||(z.type===\"open\"&&(z.isOpen=!0),z.type===\"close\"&&(z.isClose=!0),z.nodes||(z.type=\"text\"),z.invalid=!0)});let L=n[n.length-1],U=L.nodes.indexOf(u);L.nodes.splice(U,1,...u.nodes)}while(n.length>0);return R({type:\"eos\"}),a};aZ.exports=y7e});var AZ=_((ZQt,uZ)=>{\"use strict\";var cZ=yP(),E7e=ZX(),C7e=tZ(),w7e=lZ(),nl=(t,e={})=>{let r=[];if(Array.isArray(t))for(let o of t){let a=nl.create(o,e);Array.isArray(a)?r.push(...a):r.push(a)}else r=[].concat(nl.create(t,e));return e&&e.expand===!0&&e.nodupes===!0&&(r=[...new Set(r)]),r};nl.parse=(t,e={})=>w7e(t,e);nl.stringify=(t,e={})=>cZ(typeof t==\"string\"?nl.parse(t,e):t,e);nl.compile=(t,e={})=>(typeof t==\"string\"&&(t=nl.parse(t,e)),E7e(t,e));nl.expand=(t,e={})=>{typeof t==\"string\"&&(t=nl.parse(t,e));let r=C7e(t,e);return e.noempty===!0&&(r=r.filter(Boolean)),e.nodupes===!0&&(r=[...new Set(r)]),r};nl.create=(t,e={})=>t===\"\"||t.length<3?[t]:e.expand!==!0?nl.compile(t,e):nl.expand(t,e);uZ.exports=nl});var AI=_(($Qt,dZ)=>{\"use strict\";var I7e=ve(\"path\"),Vu=\"\\\\\\\\/\",fZ=`[^${Vu}]`,Bf=\"\\\\.\",B7e=\"\\\\+\",v7e=\"\\\\?\",CP=\"\\\\/\",D7e=\"(?=.)\",pZ=\"[^/]\",EN=`(?:${CP}|$)`,hZ=`(?:^|${CP})`,CN=`${Bf}{1,2}${EN}`,P7e=`(?!${Bf})`,b7e=`(?!${hZ}${CN})`,S7e=`(?!${Bf}{0,1}${EN})`,x7e=`(?!${CN})`,k7e=`[^.${CP}]`,Q7e=`${pZ}*?`,gZ={DOT_LITERAL:Bf,PLUS_LITERAL:B7e,QMARK_LITERAL:v7e,SLASH_LITERAL:CP,ONE_CHAR:D7e,QMARK:pZ,END_ANCHOR:EN,DOTS_SLASH:CN,NO_DOT:P7e,NO_DOTS:b7e,NO_DOT_SLASH:S7e,NO_DOTS_SLASH:x7e,QMARK_NO_DOT:k7e,STAR:Q7e,START_ANCHOR:hZ},F7e={...gZ,SLASH_LITERAL:`[${Vu}]`,QMARK:fZ,STAR:`${fZ}*?`,DOTS_SLASH:`${Bf}{1,2}(?:[${Vu}]|$)`,NO_DOT:`(?!${Bf})`,NO_DOTS:`(?!(?:^|[${Vu}])${Bf}{1,2}(?:[${Vu}]|$))`,NO_DOT_SLASH:`(?!${Bf}{0,1}(?:[${Vu}]|$))`,NO_DOTS_SLASH:`(?!${Bf}{1,2}(?:[${Vu}]|$))`,QMARK_NO_DOT:`[^.${Vu}]`,START_ANCHOR:`(?:^|[${Vu}])`,END_ANCHOR:`(?:[${Vu}]|$)`},R7e={alnum:\"a-zA-Z0-9\",alpha:\"a-zA-Z\",ascii:\"\\\\x00-\\\\x7F\",blank:\" \\\\t\",cntrl:\"\\\\x00-\\\\x1F\\\\x7F\",digit:\"0-9\",graph:\"\\\\x21-\\\\x7E\",lower:\"a-z\",print:\"\\\\x20-\\\\x7E \",punct:\"\\\\-!\\\"#$%&'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~\",space:\" \\\\t\\\\r\\\\n\\\\v\\\\f\",upper:\"A-Z\",word:\"A-Za-z0-9_\",xdigit:\"A-Fa-f0-9\"};dZ.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:R7e,REGEX_BACKSLASH:/\\\\(?![*+?^${}(|)[\\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\\].,$*+?^{}()|\\\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\\\?)((\\W)(\\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\\[.*?[^\\\\]\\]|\\\\(?=.))/g,REPLACEMENTS:{\"***\":\"*\",\"**/**\":\"**\",\"**/**/**\":\"**\"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:I7e.sep,extglobChars(t){return{\"!\":{type:\"negate\",open:\"(?:(?!(?:\",close:`))${t.STAR})`},\"?\":{type:\"qmark\",open:\"(?:\",close:\")?\"},\"+\":{type:\"plus\",open:\"(?:\",close:\")+\"},\"*\":{type:\"star\",open:\"(?:\",close:\")*\"},\"@\":{type:\"at\",open:\"(?:\",close:\")\"}}},globChars(t){return t===!0?F7e:gZ}}});var fI=_(Sa=>{\"use strict\";var T7e=ve(\"path\"),N7e=process.platform===\"win32\",{REGEX_BACKSLASH:L7e,REGEX_REMOVE_BACKSLASH:M7e,REGEX_SPECIAL_CHARS:O7e,REGEX_SPECIAL_CHARS_GLOBAL:U7e}=AI();Sa.isObject=t=>t!==null&&typeof t==\"object\"&&!Array.isArray(t);Sa.hasRegexChars=t=>O7e.test(t);Sa.isRegexChar=t=>t.length===1&&Sa.hasRegexChars(t);Sa.escapeRegex=t=>t.replace(U7e,\"\\\\$1\");Sa.toPosixSlashes=t=>t.replace(L7e,\"/\");Sa.removeBackslashes=t=>t.replace(M7e,e=>e===\"\\\\\"?\"\":e);Sa.supportsLookbehinds=()=>{let t=process.version.slice(1).split(\".\").map(Number);return t.length===3&&t[0]>=9||t[0]===8&&t[1]>=10};Sa.isWindows=t=>t&&typeof t.windows==\"boolean\"?t.windows:N7e===!0||T7e.sep===\"\\\\\";Sa.escapeLast=(t,e,r)=>{let o=t.lastIndexOf(e,r);return o===-1?t:t[o-1]===\"\\\\\"?Sa.escapeLast(t,e,o-1):`${t.slice(0,o)}\\\\${t.slice(o)}`};Sa.removePrefix=(t,e={})=>{let r=t;return r.startsWith(\"./\")&&(r=r.slice(2),e.prefix=\"./\"),r};Sa.wrapOutput=(t,e={},r={})=>{let o=r.contains?\"\":\"^\",a=r.contains?\"\":\"$\",n=`${o}(?:${t})${a}`;return e.negated===!0&&(n=`(?:^(?!${n}).*$)`),n}});var vZ=_((tFt,BZ)=>{\"use strict\";var mZ=fI(),{CHAR_ASTERISK:wN,CHAR_AT:_7e,CHAR_BACKWARD_SLASH:pI,CHAR_COMMA:H7e,CHAR_DOT:IN,CHAR_EXCLAMATION_MARK:BN,CHAR_FORWARD_SLASH:IZ,CHAR_LEFT_CURLY_BRACE:vN,CHAR_LEFT_PARENTHESES:DN,CHAR_LEFT_SQUARE_BRACKET:q7e,CHAR_PLUS:j7e,CHAR_QUESTION_MARK:yZ,CHAR_RIGHT_CURLY_BRACE:G7e,CHAR_RIGHT_PARENTHESES:EZ,CHAR_RIGHT_SQUARE_BRACKET:Y7e}=AI(),CZ=t=>t===IZ||t===pI,wZ=t=>{t.isPrefix!==!0&&(t.depth=t.isGlobstar?1/0:1)},W7e=(t,e)=>{let r=e||{},o=t.length-1,a=r.parts===!0||r.scanToEnd===!0,n=[],u=[],A=[],p=t,h=-1,E=0,I=0,v=!1,x=!1,C=!1,R=!1,L=!1,U=!1,z=!1,te=!1,ae=!1,le=!1,ce=0,Ce,de,Be={value:\"\",depth:0,isGlob:!1},Ee=()=>h>=o,g=()=>p.charCodeAt(h+1),me=()=>(Ce=de,p.charCodeAt(++h));for(;h<o;){de=me();let xe;if(de===pI){z=Be.backslashes=!0,de=me(),de===vN&&(U=!0);continue}if(U===!0||de===vN){for(ce++;Ee()!==!0&&(de=me());){if(de===pI){z=Be.backslashes=!0,me();continue}if(de===vN){ce++;continue}if(U!==!0&&de===IN&&(de=me())===IN){if(v=Be.isBrace=!0,C=Be.isGlob=!0,le=!0,a===!0)continue;break}if(U!==!0&&de===H7e){if(v=Be.isBrace=!0,C=Be.isGlob=!0,le=!0,a===!0)continue;break}if(de===G7e&&(ce--,ce===0)){U=!1,v=Be.isBrace=!0,le=!0;break}}if(a===!0)continue;break}if(de===IZ){if(n.push(h),u.push(Be),Be={value:\"\",depth:0,isGlob:!1},le===!0)continue;if(Ce===IN&&h===E+1){E+=2;continue}I=h+1;continue}if(r.noext!==!0&&(de===j7e||de===_7e||de===wN||de===yZ||de===BN)===!0&&g()===DN){if(C=Be.isGlob=!0,R=Be.isExtglob=!0,le=!0,de===BN&&h===E&&(ae=!0),a===!0){for(;Ee()!==!0&&(de=me());){if(de===pI){z=Be.backslashes=!0,de=me();continue}if(de===EZ){C=Be.isGlob=!0,le=!0;break}}continue}break}if(de===wN){if(Ce===wN&&(L=Be.isGlobstar=!0),C=Be.isGlob=!0,le=!0,a===!0)continue;break}if(de===yZ){if(C=Be.isGlob=!0,le=!0,a===!0)continue;break}if(de===q7e){for(;Ee()!==!0&&(xe=me());){if(xe===pI){z=Be.backslashes=!0,me();continue}if(xe===Y7e){x=Be.isBracket=!0,C=Be.isGlob=!0,le=!0;break}}if(a===!0)continue;break}if(r.nonegate!==!0&&de===BN&&h===E){te=Be.negated=!0,E++;continue}if(r.noparen!==!0&&de===DN){if(C=Be.isGlob=!0,a===!0){for(;Ee()!==!0&&(de=me());){if(de===DN){z=Be.backslashes=!0,de=me();continue}if(de===EZ){le=!0;break}}continue}break}if(C===!0){if(le=!0,a===!0)continue;break}}r.noext===!0&&(R=!1,C=!1);let we=p,Ae=\"\",ne=\"\";E>0&&(Ae=p.slice(0,E),p=p.slice(E),I-=E),we&&C===!0&&I>0?(we=p.slice(0,I),ne=p.slice(I)):C===!0?(we=\"\",ne=p):we=p,we&&we!==\"\"&&we!==\"/\"&&we!==p&&CZ(we.charCodeAt(we.length-1))&&(we=we.slice(0,-1)),r.unescape===!0&&(ne&&(ne=mZ.removeBackslashes(ne)),we&&z===!0&&(we=mZ.removeBackslashes(we)));let Z={prefix:Ae,input:t,start:E,base:we,glob:ne,isBrace:v,isBracket:x,isGlob:C,isExtglob:R,isGlobstar:L,negated:te,negatedExtglob:ae};if(r.tokens===!0&&(Z.maxDepth=0,CZ(de)||u.push(Be),Z.tokens=u),r.parts===!0||r.tokens===!0){let xe;for(let Ne=0;Ne<n.length;Ne++){let ht=xe?xe+1:E,H=n[Ne],rt=t.slice(ht,H);r.tokens&&(Ne===0&&E!==0?(u[Ne].isPrefix=!0,u[Ne].value=Ae):u[Ne].value=rt,wZ(u[Ne]),Z.maxDepth+=u[Ne].depth),(Ne!==0||rt!==\"\")&&A.push(rt),xe=H}if(xe&&xe+1<t.length){let Ne=t.slice(xe+1);A.push(Ne),r.tokens&&(u[u.length-1].value=Ne,wZ(u[u.length-1]),Z.maxDepth+=u[u.length-1].depth)}Z.slashes=n,Z.parts=A}return Z};BZ.exports=W7e});var bZ=_((rFt,PZ)=>{\"use strict\";var wP=AI(),il=fI(),{MAX_LENGTH:IP,POSIX_REGEX_SOURCE:K7e,REGEX_NON_SPECIAL_CHARS:V7e,REGEX_SPECIAL_CHARS_BACKREF:z7e,REPLACEMENTS:DZ}=wP,J7e=(t,e)=>{if(typeof e.expandRange==\"function\")return e.expandRange(...t,e);t.sort();let r=`[${t.join(\"-\")}]`;try{new RegExp(r)}catch{return t.map(a=>il.escapeRegex(a)).join(\"..\")}return r},mm=(t,e)=>`Missing ${t}: \"${e}\" - use \"\\\\\\\\${e}\" to match literal characters`,PN=(t,e)=>{if(typeof t!=\"string\")throw new TypeError(\"Expected a string\");t=DZ[t]||t;let r={...e},o=typeof r.maxLength==\"number\"?Math.min(IP,r.maxLength):IP,a=t.length;if(a>o)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${o}`);let n={type:\"bos\",value:\"\",output:r.prepend||\"\"},u=[n],A=r.capture?\"\":\"?:\",p=il.isWindows(e),h=wP.globChars(p),E=wP.extglobChars(h),{DOT_LITERAL:I,PLUS_LITERAL:v,SLASH_LITERAL:x,ONE_CHAR:C,DOTS_SLASH:R,NO_DOT:L,NO_DOT_SLASH:U,NO_DOTS_SLASH:z,QMARK:te,QMARK_NO_DOT:ae,STAR:le,START_ANCHOR:ce}=h,Ce=S=>`(${A}(?:(?!${ce}${S.dot?R:I}).)*?)`,de=r.dot?\"\":L,Be=r.dot?te:ae,Ee=r.bash===!0?Ce(r):le;r.capture&&(Ee=`(${Ee})`),typeof r.noext==\"boolean\"&&(r.noextglob=r.noext);let g={input:t,index:-1,start:0,dot:r.dot===!0,consumed:\"\",output:\"\",prefix:\"\",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:u};t=il.removePrefix(t,g),a=t.length;let me=[],we=[],Ae=[],ne=n,Z,xe=()=>g.index===a-1,Ne=g.peek=(S=1)=>t[g.index+S],ht=g.advance=()=>t[++g.index]||\"\",H=()=>t.slice(g.index+1),rt=(S=\"\",w=0)=>{g.consumed+=S,g.index+=w},Te=S=>{g.output+=S.output!=null?S.output:S.value,rt(S.value)},Fe=()=>{let S=1;for(;Ne()===\"!\"&&(Ne(2)!==\"(\"||Ne(3)===\"?\");)ht(),g.start++,S++;return S%2===0?!1:(g.negated=!0,g.start++,!0)},ke=S=>{g[S]++,Ae.push(S)},Ye=S=>{g[S]--,Ae.pop()},be=S=>{if(ne.type===\"globstar\"){let w=g.braces>0&&(S.type===\"comma\"||S.type===\"brace\"),b=S.extglob===!0||me.length&&(S.type===\"pipe\"||S.type===\"paren\");S.type!==\"slash\"&&S.type!==\"paren\"&&!w&&!b&&(g.output=g.output.slice(0,-ne.output.length),ne.type=\"star\",ne.value=\"*\",ne.output=Ee,g.output+=ne.output)}if(me.length&&S.type!==\"paren\"&&(me[me.length-1].inner+=S.value),(S.value||S.output)&&Te(S),ne&&ne.type===\"text\"&&S.type===\"text\"){ne.value+=S.value,ne.output=(ne.output||\"\")+S.value;return}S.prev=ne,u.push(S),ne=S},et=(S,w)=>{let b={...E[w],conditions:1,inner:\"\"};b.prev=ne,b.parens=g.parens,b.output=g.output;let y=(r.capture?\"(\":\"\")+b.open;ke(\"parens\"),be({type:S,value:w,output:g.output?\"\":C}),be({type:\"paren\",extglob:!0,value:ht(),output:y}),me.push(b)},Ue=S=>{let w=S.close+(r.capture?\")\":\"\"),b;if(S.type===\"negate\"){let y=Ee;if(S.inner&&S.inner.length>1&&S.inner.includes(\"/\")&&(y=Ce(r)),(y!==Ee||xe()||/^\\)+$/.test(H()))&&(w=S.close=`)$))${y}`),S.inner.includes(\"*\")&&(b=H())&&/^\\.[^\\\\/.]+$/.test(b)){let F=PN(b,{...e,fastpaths:!1}).output;w=S.close=`)${F})${y})`}S.prev.type===\"bos\"&&(g.negatedExtglob=!0)}be({type:\"paren\",extglob:!0,value:Z,output:w}),Ye(\"parens\")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\\]{}\"])/.test(t)){let S=!1,w=t.replace(z7e,(b,y,F,J,X,$)=>J===\"\\\\\"?(S=!0,b):J===\"?\"?y?y+J+(X?te.repeat(X.length):\"\"):$===0?Be+(X?te.repeat(X.length):\"\"):te.repeat(F.length):J===\".\"?I.repeat(F.length):J===\"*\"?y?y+J+(X?Ee:\"\"):Ee:y?b:`\\\\${b}`);return S===!0&&(r.unescape===!0?w=w.replace(/\\\\/g,\"\"):w=w.replace(/\\\\+/g,b=>b.length%2===0?\"\\\\\\\\\":b?\"\\\\\":\"\")),w===t&&r.contains===!0?(g.output=t,g):(g.output=il.wrapOutput(w,g,e),g)}for(;!xe();){if(Z=ht(),Z===\"\\0\")continue;if(Z===\"\\\\\"){let b=Ne();if(b===\"/\"&&r.bash!==!0||b===\".\"||b===\";\")continue;if(!b){Z+=\"\\\\\",be({type:\"text\",value:Z});continue}let y=/^\\\\+/.exec(H()),F=0;if(y&&y[0].length>2&&(F=y[0].length,g.index+=F,F%2!==0&&(Z+=\"\\\\\")),r.unescape===!0?Z=ht():Z+=ht(),g.brackets===0){be({type:\"text\",value:Z});continue}}if(g.brackets>0&&(Z!==\"]\"||ne.value===\"[\"||ne.value===\"[^\")){if(r.posix!==!1&&Z===\":\"){let b=ne.value.slice(1);if(b.includes(\"[\")&&(ne.posix=!0,b.includes(\":\"))){let y=ne.value.lastIndexOf(\"[\"),F=ne.value.slice(0,y),J=ne.value.slice(y+2),X=K7e[J];if(X){ne.value=F+X,g.backtrack=!0,ht(),!n.output&&u.indexOf(ne)===1&&(n.output=C);continue}}}(Z===\"[\"&&Ne()!==\":\"||Z===\"-\"&&Ne()===\"]\")&&(Z=`\\\\${Z}`),Z===\"]\"&&(ne.value===\"[\"||ne.value===\"[^\")&&(Z=`\\\\${Z}`),r.posix===!0&&Z===\"!\"&&ne.value===\"[\"&&(Z=\"^\"),ne.value+=Z,Te({value:Z});continue}if(g.quotes===1&&Z!=='\"'){Z=il.escapeRegex(Z),ne.value+=Z,Te({value:Z});continue}if(Z==='\"'){g.quotes=g.quotes===1?0:1,r.keepQuotes===!0&&be({type:\"text\",value:Z});continue}if(Z===\"(\"){ke(\"parens\"),be({type:\"paren\",value:Z});continue}if(Z===\")\"){if(g.parens===0&&r.strictBrackets===!0)throw new SyntaxError(mm(\"opening\",\"(\"));let b=me[me.length-1];if(b&&g.parens===b.parens+1){Ue(me.pop());continue}be({type:\"paren\",value:Z,output:g.parens?\")\":\"\\\\)\"}),Ye(\"parens\");continue}if(Z===\"[\"){if(r.nobracket===!0||!H().includes(\"]\")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(mm(\"closing\",\"]\"));Z=`\\\\${Z}`}else ke(\"brackets\");be({type:\"bracket\",value:Z});continue}if(Z===\"]\"){if(r.nobracket===!0||ne&&ne.type===\"bracket\"&&ne.value.length===1){be({type:\"text\",value:Z,output:`\\\\${Z}`});continue}if(g.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(mm(\"opening\",\"[\"));be({type:\"text\",value:Z,output:`\\\\${Z}`});continue}Ye(\"brackets\");let b=ne.value.slice(1);if(ne.posix!==!0&&b[0]===\"^\"&&!b.includes(\"/\")&&(Z=`/${Z}`),ne.value+=Z,Te({value:Z}),r.literalBrackets===!1||il.hasRegexChars(b))continue;let y=il.escapeRegex(ne.value);if(g.output=g.output.slice(0,-ne.value.length),r.literalBrackets===!0){g.output+=y,ne.value=y;continue}ne.value=`(${A}${y}|${ne.value})`,g.output+=ne.value;continue}if(Z===\"{\"&&r.nobrace!==!0){ke(\"braces\");let b={type:\"brace\",value:Z,output:\"(\",outputIndex:g.output.length,tokensIndex:g.tokens.length};we.push(b),be(b);continue}if(Z===\"}\"){let b=we[we.length-1];if(r.nobrace===!0||!b){be({type:\"text\",value:Z,output:Z});continue}let y=\")\";if(b.dots===!0){let F=u.slice(),J=[];for(let X=F.length-1;X>=0&&(u.pop(),F[X].type!==\"brace\");X--)F[X].type!==\"dots\"&&J.unshift(F[X].value);y=J7e(J,r),g.backtrack=!0}if(b.comma!==!0&&b.dots!==!0){let F=g.output.slice(0,b.outputIndex),J=g.tokens.slice(b.tokensIndex);b.value=b.output=\"\\\\{\",Z=y=\"\\\\}\",g.output=F;for(let X of J)g.output+=X.output||X.value}be({type:\"brace\",value:Z,output:y}),Ye(\"braces\"),we.pop();continue}if(Z===\"|\"){me.length>0&&me[me.length-1].conditions++,be({type:\"text\",value:Z});continue}if(Z===\",\"){let b=Z,y=we[we.length-1];y&&Ae[Ae.length-1]===\"braces\"&&(y.comma=!0,b=\"|\"),be({type:\"comma\",value:Z,output:b});continue}if(Z===\"/\"){if(ne.type===\"dot\"&&g.index===g.start+1){g.start=g.index+1,g.consumed=\"\",g.output=\"\",u.pop(),ne=n;continue}be({type:\"slash\",value:Z,output:x});continue}if(Z===\".\"){if(g.braces>0&&ne.type===\"dot\"){ne.value===\".\"&&(ne.output=I);let b=we[we.length-1];ne.type=\"dots\",ne.output+=Z,ne.value+=Z,b.dots=!0;continue}if(g.braces+g.parens===0&&ne.type!==\"bos\"&&ne.type!==\"slash\"){be({type:\"text\",value:Z,output:I});continue}be({type:\"dot\",value:Z,output:I});continue}if(Z===\"?\"){if(!(ne&&ne.value===\"(\")&&r.noextglob!==!0&&Ne()===\"(\"&&Ne(2)!==\"?\"){et(\"qmark\",Z);continue}if(ne&&ne.type===\"paren\"){let y=Ne(),F=Z;if(y===\"<\"&&!il.supportsLookbehinds())throw new Error(\"Node.js v10 or higher is required for regex lookbehinds\");(ne.value===\"(\"&&!/[!=<:]/.test(y)||y===\"<\"&&!/<([!=]|\\w+>)/.test(H()))&&(F=`\\\\${Z}`),be({type:\"text\",value:Z,output:F});continue}if(r.dot!==!0&&(ne.type===\"slash\"||ne.type===\"bos\")){be({type:\"qmark\",value:Z,output:ae});continue}be({type:\"qmark\",value:Z,output:te});continue}if(Z===\"!\"){if(r.noextglob!==!0&&Ne()===\"(\"&&(Ne(2)!==\"?\"||!/[!=<:]/.test(Ne(3)))){et(\"negate\",Z);continue}if(r.nonegate!==!0&&g.index===0){Fe();continue}}if(Z===\"+\"){if(r.noextglob!==!0&&Ne()===\"(\"&&Ne(2)!==\"?\"){et(\"plus\",Z);continue}if(ne&&ne.value===\"(\"||r.regex===!1){be({type:\"plus\",value:Z,output:v});continue}if(ne&&(ne.type===\"bracket\"||ne.type===\"paren\"||ne.type===\"brace\")||g.parens>0){be({type:\"plus\",value:Z});continue}be({type:\"plus\",value:v});continue}if(Z===\"@\"){if(r.noextglob!==!0&&Ne()===\"(\"&&Ne(2)!==\"?\"){be({type:\"at\",extglob:!0,value:Z,output:\"\"});continue}be({type:\"text\",value:Z});continue}if(Z!==\"*\"){(Z===\"$\"||Z===\"^\")&&(Z=`\\\\${Z}`);let b=V7e.exec(H());b&&(Z+=b[0],g.index+=b[0].length),be({type:\"text\",value:Z});continue}if(ne&&(ne.type===\"globstar\"||ne.star===!0)){ne.type=\"star\",ne.star=!0,ne.value+=Z,ne.output=Ee,g.backtrack=!0,g.globstar=!0,rt(Z);continue}let S=H();if(r.noextglob!==!0&&/^\\([^?]/.test(S)){et(\"star\",Z);continue}if(ne.type===\"star\"){if(r.noglobstar===!0){rt(Z);continue}let b=ne.prev,y=b.prev,F=b.type===\"slash\"||b.type===\"bos\",J=y&&(y.type===\"star\"||y.type===\"globstar\");if(r.bash===!0&&(!F||S[0]&&S[0]!==\"/\")){be({type:\"star\",value:Z,output:\"\"});continue}let X=g.braces>0&&(b.type===\"comma\"||b.type===\"brace\"),$=me.length&&(b.type===\"pipe\"||b.type===\"paren\");if(!F&&b.type!==\"paren\"&&!X&&!$){be({type:\"star\",value:Z,output:\"\"});continue}for(;S.slice(0,3)===\"/**\";){let ie=t[g.index+4];if(ie&&ie!==\"/\")break;S=S.slice(3),rt(\"/**\",3)}if(b.type===\"bos\"&&xe()){ne.type=\"globstar\",ne.value+=Z,ne.output=Ce(r),g.output=ne.output,g.globstar=!0,rt(Z);continue}if(b.type===\"slash\"&&b.prev.type!==\"bos\"&&!J&&xe()){g.output=g.output.slice(0,-(b.output+ne.output).length),b.output=`(?:${b.output}`,ne.type=\"globstar\",ne.output=Ce(r)+(r.strictSlashes?\")\":\"|$)\"),ne.value+=Z,g.globstar=!0,g.output+=b.output+ne.output,rt(Z);continue}if(b.type===\"slash\"&&b.prev.type!==\"bos\"&&S[0]===\"/\"){let ie=S[1]!==void 0?\"|$\":\"\";g.output=g.output.slice(0,-(b.output+ne.output).length),b.output=`(?:${b.output}`,ne.type=\"globstar\",ne.output=`${Ce(r)}${x}|${x}${ie})`,ne.value+=Z,g.output+=b.output+ne.output,g.globstar=!0,rt(Z+ht()),be({type:\"slash\",value:\"/\",output:\"\"});continue}if(b.type===\"bos\"&&S[0]===\"/\"){ne.type=\"globstar\",ne.value+=Z,ne.output=`(?:^|${x}|${Ce(r)}${x})`,g.output=ne.output,g.globstar=!0,rt(Z+ht()),be({type:\"slash\",value:\"/\",output:\"\"});continue}g.output=g.output.slice(0,-ne.output.length),ne.type=\"globstar\",ne.output=Ce(r),ne.value+=Z,g.output+=ne.output,g.globstar=!0,rt(Z);continue}let w={type:\"star\",value:Z,output:Ee};if(r.bash===!0){w.output=\".*?\",(ne.type===\"bos\"||ne.type===\"slash\")&&(w.output=de+w.output),be(w);continue}if(ne&&(ne.type===\"bracket\"||ne.type===\"paren\")&&r.regex===!0){w.output=Z,be(w);continue}(g.index===g.start||ne.type===\"slash\"||ne.type===\"dot\")&&(ne.type===\"dot\"?(g.output+=U,ne.output+=U):r.dot===!0?(g.output+=z,ne.output+=z):(g.output+=de,ne.output+=de),Ne()!==\"*\"&&(g.output+=C,ne.output+=C)),be(w)}for(;g.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(mm(\"closing\",\"]\"));g.output=il.escapeLast(g.output,\"[\"),Ye(\"brackets\")}for(;g.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(mm(\"closing\",\")\"));g.output=il.escapeLast(g.output,\"(\"),Ye(\"parens\")}for(;g.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(mm(\"closing\",\"}\"));g.output=il.escapeLast(g.output,\"{\"),Ye(\"braces\")}if(r.strictSlashes!==!0&&(ne.type===\"star\"||ne.type===\"bracket\")&&be({type:\"maybe_slash\",value:\"\",output:`${x}?`}),g.backtrack===!0){g.output=\"\";for(let S of g.tokens)g.output+=S.output!=null?S.output:S.value,S.suffix&&(g.output+=S.suffix)}return g};PN.fastpaths=(t,e)=>{let r={...e},o=typeof r.maxLength==\"number\"?Math.min(IP,r.maxLength):IP,a=t.length;if(a>o)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${o}`);t=DZ[t]||t;let n=il.isWindows(e),{DOT_LITERAL:u,SLASH_LITERAL:A,ONE_CHAR:p,DOTS_SLASH:h,NO_DOT:E,NO_DOTS:I,NO_DOTS_SLASH:v,STAR:x,START_ANCHOR:C}=wP.globChars(n),R=r.dot?I:E,L=r.dot?v:E,U=r.capture?\"\":\"?:\",z={negated:!1,prefix:\"\"},te=r.bash===!0?\".*?\":x;r.capture&&(te=`(${te})`);let ae=de=>de.noglobstar===!0?te:`(${U}(?:(?!${C}${de.dot?h:u}).)*?)`,le=de=>{switch(de){case\"*\":return`${R}${p}${te}`;case\".*\":return`${u}${p}${te}`;case\"*.*\":return`${R}${te}${u}${p}${te}`;case\"*/*\":return`${R}${te}${A}${p}${L}${te}`;case\"**\":return R+ae(r);case\"**/*\":return`(?:${R}${ae(r)}${A})?${L}${p}${te}`;case\"**/*.*\":return`(?:${R}${ae(r)}${A})?${L}${te}${u}${p}${te}`;case\"**/.*\":return`(?:${R}${ae(r)}${A})?${u}${p}${te}`;default:{let Be=/^(.*?)\\.(\\w+)$/.exec(de);if(!Be)return;let Ee=le(Be[1]);return Ee?Ee+u+Be[2]:void 0}}},ce=il.removePrefix(t,z),Ce=le(ce);return Ce&&r.strictSlashes!==!0&&(Ce+=`${A}?`),Ce};PZ.exports=PN});var xZ=_((nFt,SZ)=>{\"use strict\";var X7e=ve(\"path\"),Z7e=vZ(),bN=bZ(),SN=fI(),$7e=AI(),eYe=t=>t&&typeof t==\"object\"&&!Array.isArray(t),Mi=(t,e,r=!1)=>{if(Array.isArray(t)){let E=t.map(v=>Mi(v,e,r));return v=>{for(let x of E){let C=x(v);if(C)return C}return!1}}let o=eYe(t)&&t.tokens&&t.input;if(t===\"\"||typeof t!=\"string\"&&!o)throw new TypeError(\"Expected pattern to be a non-empty string\");let a=e||{},n=SN.isWindows(e),u=o?Mi.compileRe(t,e):Mi.makeRe(t,e,!1,!0),A=u.state;delete u.state;let p=()=>!1;if(a.ignore){let E={...e,ignore:null,onMatch:null,onResult:null};p=Mi(a.ignore,E,r)}let h=(E,I=!1)=>{let{isMatch:v,match:x,output:C}=Mi.test(E,u,e,{glob:t,posix:n}),R={glob:t,state:A,regex:u,posix:n,input:E,output:C,match:x,isMatch:v};return typeof a.onResult==\"function\"&&a.onResult(R),v===!1?(R.isMatch=!1,I?R:!1):p(E)?(typeof a.onIgnore==\"function\"&&a.onIgnore(R),R.isMatch=!1,I?R:!1):(typeof a.onMatch==\"function\"&&a.onMatch(R),I?R:!0)};return r&&(h.state=A),h};Mi.test=(t,e,r,{glob:o,posix:a}={})=>{if(typeof t!=\"string\")throw new TypeError(\"Expected input to be a string\");if(t===\"\")return{isMatch:!1,output:\"\"};let n=r||{},u=n.format||(a?SN.toPosixSlashes:null),A=t===o,p=A&&u?u(t):t;return A===!1&&(p=u?u(t):t,A=p===o),(A===!1||n.capture===!0)&&(n.matchBase===!0||n.basename===!0?A=Mi.matchBase(t,e,r,a):A=e.exec(p)),{isMatch:!!A,match:A,output:p}};Mi.matchBase=(t,e,r,o=SN.isWindows(r))=>(e instanceof RegExp?e:Mi.makeRe(e,r)).test(X7e.basename(t));Mi.isMatch=(t,e,r)=>Mi(e,r)(t);Mi.parse=(t,e)=>Array.isArray(t)?t.map(r=>Mi.parse(r,e)):bN(t,{...e,fastpaths:!1});Mi.scan=(t,e)=>Z7e(t,e);Mi.compileRe=(t,e,r=!1,o=!1)=>{if(r===!0)return t.output;let a=e||{},n=a.contains?\"\":\"^\",u=a.contains?\"\":\"$\",A=`${n}(?:${t.output})${u}`;t&&t.negated===!0&&(A=`^(?!${A}).*$`);let p=Mi.toRegex(A,e);return o===!0&&(p.state=t),p};Mi.makeRe=(t,e={},r=!1,o=!1)=>{if(!t||typeof t!=\"string\")throw new TypeError(\"Expected a non-empty string\");let a={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(t[0]===\".\"||t[0]===\"*\")&&(a.output=bN.fastpaths(t,e)),a.output||(a=bN(t,e)),Mi.compileRe(a,e,r,o)};Mi.toRegex=(t,e)=>{try{let r=e||{};return new RegExp(t,r.flags||(r.nocase?\"i\":\"\"))}catch(r){if(e&&e.debug===!0)throw r;return/$^/}};Mi.constants=$7e;SZ.exports=Mi});var QZ=_((iFt,kZ)=>{\"use strict\";kZ.exports=xZ()});var $o=_((sFt,NZ)=>{\"use strict\";var RZ=ve(\"util\"),TZ=AZ(),zu=QZ(),xN=fI(),FZ=t=>t===\"\"||t===\"./\",mi=(t,e,r)=>{e=[].concat(e),t=[].concat(t);let o=new Set,a=new Set,n=new Set,u=0,A=E=>{n.add(E.output),r&&r.onResult&&r.onResult(E)};for(let E=0;E<e.length;E++){let I=zu(String(e[E]),{...r,onResult:A},!0),v=I.state.negated||I.state.negatedExtglob;v&&u++;for(let x of t){let C=I(x,!0);(v?!C.isMatch:C.isMatch)&&(v?o.add(C.output):(o.delete(C.output),a.add(C.output)))}}let h=(u===e.length?[...n]:[...a]).filter(E=>!o.has(E));if(r&&h.length===0){if(r.failglob===!0)throw new Error(`No matches found for \"${e.join(\", \")}\"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?e.map(E=>E.replace(/\\\\/g,\"\")):e}return h};mi.match=mi;mi.matcher=(t,e)=>zu(t,e);mi.isMatch=(t,e,r)=>zu(e,r)(t);mi.any=mi.isMatch;mi.not=(t,e,r={})=>{e=[].concat(e).map(String);let o=new Set,a=[],n=A=>{r.onResult&&r.onResult(A),a.push(A.output)},u=new Set(mi(t,e,{...r,onResult:n}));for(let A of a)u.has(A)||o.add(A);return[...o]};mi.contains=(t,e,r)=>{if(typeof t!=\"string\")throw new TypeError(`Expected a string: \"${RZ.inspect(t)}\"`);if(Array.isArray(e))return e.some(o=>mi.contains(t,o,r));if(typeof e==\"string\"){if(FZ(t)||FZ(e))return!1;if(t.includes(e)||t.startsWith(\"./\")&&t.slice(2).includes(e))return!0}return mi.isMatch(t,e,{...r,contains:!0})};mi.matchKeys=(t,e,r)=>{if(!xN.isObject(t))throw new TypeError(\"Expected the first argument to be an object\");let o=mi(Object.keys(t),e,r),a={};for(let n of o)a[n]=t[n];return a};mi.some=(t,e,r)=>{let o=[].concat(t);for(let a of[].concat(e)){let n=zu(String(a),r);if(o.some(u=>n(u)))return!0}return!1};mi.every=(t,e,r)=>{let o=[].concat(t);for(let a of[].concat(e)){let n=zu(String(a),r);if(!o.every(u=>n(u)))return!1}return!0};mi.all=(t,e,r)=>{if(typeof t!=\"string\")throw new TypeError(`Expected a string: \"${RZ.inspect(t)}\"`);return[].concat(e).every(o=>zu(o,r)(t))};mi.capture=(t,e,r)=>{let o=xN.isWindows(r),n=zu.makeRe(String(t),{...r,capture:!0}).exec(o?xN.toPosixSlashes(e):e);if(n)return n.slice(1).map(u=>u===void 0?\"\":u)};mi.makeRe=(...t)=>zu.makeRe(...t);mi.scan=(...t)=>zu.scan(...t);mi.parse=(t,e)=>{let r=[];for(let o of[].concat(t||[]))for(let a of TZ(String(o),e))r.push(zu.parse(a,e));return r};mi.braces=(t,e)=>{if(typeof t!=\"string\")throw new TypeError(\"Expected a string\");return e&&e.nobrace===!0||!/\\{.*\\}/.test(t)?[t]:TZ(t,e)};mi.braceExpand=(t,e)=>{if(typeof t!=\"string\")throw new TypeError(\"Expected a string\");return mi.braces(t,{...e,expand:!0})};NZ.exports=mi});var MZ=_((oFt,LZ)=>{\"use strict\";LZ.exports=({onlyFirst:t=!1}={})=>{let e=[\"[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)\",\"(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))\"].join(\"|\");return new RegExp(e,t?void 0:\"g\")}});var BP=_((aFt,OZ)=>{\"use strict\";var tYe=MZ();OZ.exports=t=>typeof t==\"string\"?t.replace(tYe(),\"\"):t});var _Z=_((lFt,UZ)=>{function rYe(){this.__data__=[],this.size=0}UZ.exports=rYe});var ym=_((cFt,HZ)=>{function nYe(t,e){return t===e||t!==t&&e!==e}HZ.exports=nYe});var hI=_((uFt,qZ)=>{var iYe=ym();function sYe(t,e){for(var r=t.length;r--;)if(iYe(t[r][0],e))return r;return-1}qZ.exports=sYe});var GZ=_((AFt,jZ)=>{var oYe=hI(),aYe=Array.prototype,lYe=aYe.splice;function cYe(t){var e=this.__data__,r=oYe(e,t);if(r<0)return!1;var o=e.length-1;return r==o?e.pop():lYe.call(e,r,1),--this.size,!0}jZ.exports=cYe});var WZ=_((fFt,YZ)=>{var uYe=hI();function AYe(t){var e=this.__data__,r=uYe(e,t);return r<0?void 0:e[r][1]}YZ.exports=AYe});var VZ=_((pFt,KZ)=>{var fYe=hI();function pYe(t){return fYe(this.__data__,t)>-1}KZ.exports=pYe});var JZ=_((hFt,zZ)=>{var hYe=hI();function gYe(t,e){var r=this.__data__,o=hYe(r,t);return o<0?(++this.size,r.push([t,e])):r[o][1]=e,this}zZ.exports=gYe});var gI=_((gFt,XZ)=>{var dYe=_Z(),mYe=GZ(),yYe=WZ(),EYe=VZ(),CYe=JZ();function Em(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){var o=t[e];this.set(o[0],o[1])}}Em.prototype.clear=dYe;Em.prototype.delete=mYe;Em.prototype.get=yYe;Em.prototype.has=EYe;Em.prototype.set=CYe;XZ.exports=Em});var $Z=_((dFt,ZZ)=>{var wYe=gI();function IYe(){this.__data__=new wYe,this.size=0}ZZ.exports=IYe});var t$=_((mFt,e$)=>{function BYe(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}e$.exports=BYe});var n$=_((yFt,r$)=>{function vYe(t){return this.__data__.get(t)}r$.exports=vYe});var s$=_((EFt,i$)=>{function DYe(t){return this.__data__.has(t)}i$.exports=DYe});var kN=_((CFt,o$)=>{var PYe=typeof global==\"object\"&&global&&global.Object===Object&&global;o$.exports=PYe});var _l=_((wFt,a$)=>{var bYe=kN(),SYe=typeof self==\"object\"&&self&&self.Object===Object&&self,xYe=bYe||SYe||Function(\"return this\")();a$.exports=xYe});var lg=_((IFt,l$)=>{var kYe=_l(),QYe=kYe.Symbol;l$.exports=QYe});var f$=_((BFt,A$)=>{var c$=lg(),u$=Object.prototype,FYe=u$.hasOwnProperty,RYe=u$.toString,dI=c$?c$.toStringTag:void 0;function TYe(t){var e=FYe.call(t,dI),r=t[dI];try{t[dI]=void 0;var o=!0}catch{}var a=RYe.call(t);return o&&(e?t[dI]=r:delete t[dI]),a}A$.exports=TYe});var h$=_((vFt,p$)=>{var NYe=Object.prototype,LYe=NYe.toString;function MYe(t){return LYe.call(t)}p$.exports=MYe});var cg=_((DFt,m$)=>{var g$=lg(),OYe=f$(),UYe=h$(),_Ye=\"[object Null]\",HYe=\"[object Undefined]\",d$=g$?g$.toStringTag:void 0;function qYe(t){return t==null?t===void 0?HYe:_Ye:d$&&d$ in Object(t)?OYe(t):UYe(t)}m$.exports=qYe});var sl=_((PFt,y$)=>{function jYe(t){var e=typeof t;return t!=null&&(e==\"object\"||e==\"function\")}y$.exports=jYe});var vP=_((bFt,E$)=>{var GYe=cg(),YYe=sl(),WYe=\"[object AsyncFunction]\",KYe=\"[object Function]\",VYe=\"[object GeneratorFunction]\",zYe=\"[object Proxy]\";function JYe(t){if(!YYe(t))return!1;var e=GYe(t);return e==KYe||e==VYe||e==WYe||e==zYe}E$.exports=JYe});var w$=_((SFt,C$)=>{var XYe=_l(),ZYe=XYe[\"__core-js_shared__\"];C$.exports=ZYe});var v$=_((xFt,B$)=>{var QN=w$(),I$=function(){var t=/[^.]+$/.exec(QN&&QN.keys&&QN.keys.IE_PROTO||\"\");return t?\"Symbol(src)_1.\"+t:\"\"}();function $Ye(t){return!!I$&&I$ in t}B$.exports=$Ye});var FN=_((kFt,D$)=>{var eWe=Function.prototype,tWe=eWe.toString;function rWe(t){if(t!=null){try{return tWe.call(t)}catch{}try{return t+\"\"}catch{}}return\"\"}D$.exports=rWe});var b$=_((QFt,P$)=>{var nWe=vP(),iWe=v$(),sWe=sl(),oWe=FN(),aWe=/[\\\\^$.*+?()[\\]{}|]/g,lWe=/^\\[object .+?Constructor\\]$/,cWe=Function.prototype,uWe=Object.prototype,AWe=cWe.toString,fWe=uWe.hasOwnProperty,pWe=RegExp(\"^\"+AWe.call(fWe).replace(aWe,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");function hWe(t){if(!sWe(t)||iWe(t))return!1;var e=nWe(t)?pWe:lWe;return e.test(oWe(t))}P$.exports=hWe});var x$=_((FFt,S$)=>{function gWe(t,e){return t?.[e]}S$.exports=gWe});var Vp=_((RFt,k$)=>{var dWe=b$(),mWe=x$();function yWe(t,e){var r=mWe(t,e);return dWe(r)?r:void 0}k$.exports=yWe});var DP=_((TFt,Q$)=>{var EWe=Vp(),CWe=_l(),wWe=EWe(CWe,\"Map\");Q$.exports=wWe});var mI=_((NFt,F$)=>{var IWe=Vp(),BWe=IWe(Object,\"create\");F$.exports=BWe});var N$=_((LFt,T$)=>{var R$=mI();function vWe(){this.__data__=R$?R$(null):{},this.size=0}T$.exports=vWe});var M$=_((MFt,L$)=>{function DWe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}L$.exports=DWe});var U$=_((OFt,O$)=>{var PWe=mI(),bWe=\"__lodash_hash_undefined__\",SWe=Object.prototype,xWe=SWe.hasOwnProperty;function kWe(t){var e=this.__data__;if(PWe){var r=e[t];return r===bWe?void 0:r}return xWe.call(e,t)?e[t]:void 0}O$.exports=kWe});var H$=_((UFt,_$)=>{var QWe=mI(),FWe=Object.prototype,RWe=FWe.hasOwnProperty;function TWe(t){var e=this.__data__;return QWe?e[t]!==void 0:RWe.call(e,t)}_$.exports=TWe});var j$=_((_Ft,q$)=>{var NWe=mI(),LWe=\"__lodash_hash_undefined__\";function MWe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=NWe&&e===void 0?LWe:e,this}q$.exports=MWe});var Y$=_((HFt,G$)=>{var OWe=N$(),UWe=M$(),_We=U$(),HWe=H$(),qWe=j$();function Cm(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){var o=t[e];this.set(o[0],o[1])}}Cm.prototype.clear=OWe;Cm.prototype.delete=UWe;Cm.prototype.get=_We;Cm.prototype.has=HWe;Cm.prototype.set=qWe;G$.exports=Cm});var V$=_((qFt,K$)=>{var W$=Y$(),jWe=gI(),GWe=DP();function YWe(){this.size=0,this.__data__={hash:new W$,map:new(GWe||jWe),string:new W$}}K$.exports=YWe});var J$=_((jFt,z$)=>{function WWe(t){var e=typeof t;return e==\"string\"||e==\"number\"||e==\"symbol\"||e==\"boolean\"?t!==\"__proto__\":t===null}z$.exports=WWe});var yI=_((GFt,X$)=>{var KWe=J$();function VWe(t,e){var r=t.__data__;return KWe(e)?r[typeof e==\"string\"?\"string\":\"hash\"]:r.map}X$.exports=VWe});var $$=_((YFt,Z$)=>{var zWe=yI();function JWe(t){var e=zWe(this,t).delete(t);return this.size-=e?1:0,e}Z$.exports=JWe});var tee=_((WFt,eee)=>{var XWe=yI();function ZWe(t){return XWe(this,t).get(t)}eee.exports=ZWe});var nee=_((KFt,ree)=>{var $We=yI();function eKe(t){return $We(this,t).has(t)}ree.exports=eKe});var see=_((VFt,iee)=>{var tKe=yI();function rKe(t,e){var r=tKe(this,t),o=r.size;return r.set(t,e),this.size+=r.size==o?0:1,this}iee.exports=rKe});var PP=_((zFt,oee)=>{var nKe=V$(),iKe=$$(),sKe=tee(),oKe=nee(),aKe=see();function wm(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e<r;){var o=t[e];this.set(o[0],o[1])}}wm.prototype.clear=nKe;wm.prototype.delete=iKe;wm.prototype.get=sKe;wm.prototype.has=oKe;wm.prototype.set=aKe;oee.exports=wm});var lee=_((JFt,aee)=>{var lKe=gI(),cKe=DP(),uKe=PP(),AKe=200;function fKe(t,e){var r=this.__data__;if(r instanceof lKe){var o=r.__data__;if(!cKe||o.length<AKe-1)return o.push([t,e]),this.size=++r.size,this;r=this.__data__=new uKe(o)}return r.set(t,e),this.size=r.size,this}aee.exports=fKe});var bP=_((XFt,cee)=>{var pKe=gI(),hKe=$Z(),gKe=t$(),dKe=n$(),mKe=s$(),yKe=lee();function Im(t){var e=this.__data__=new pKe(t);this.size=e.size}Im.prototype.clear=hKe;Im.prototype.delete=gKe;Im.prototype.get=dKe;Im.prototype.has=mKe;Im.prototype.set=yKe;cee.exports=Im});var Aee=_((ZFt,uee)=>{var EKe=\"__lodash_hash_undefined__\";function CKe(t){return this.__data__.set(t,EKe),this}uee.exports=CKe});var pee=_(($Ft,fee)=>{function wKe(t){return this.__data__.has(t)}fee.exports=wKe});var gee=_((eRt,hee)=>{var IKe=PP(),BKe=Aee(),vKe=pee();function SP(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new IKe;++e<r;)this.add(t[e])}SP.prototype.add=SP.prototype.push=BKe;SP.prototype.has=vKe;hee.exports=SP});var mee=_((tRt,dee)=>{function DKe(t,e){for(var r=-1,o=t==null?0:t.length;++r<o;)if(e(t[r],r,t))return!0;return!1}dee.exports=DKe});var Eee=_((rRt,yee)=>{function PKe(t,e){return t.has(e)}yee.exports=PKe});var RN=_((nRt,Cee)=>{var bKe=gee(),SKe=mee(),xKe=Eee(),kKe=1,QKe=2;function FKe(t,e,r,o,a,n){var u=r&kKe,A=t.length,p=e.length;if(A!=p&&!(u&&p>A))return!1;var h=n.get(t),E=n.get(e);if(h&&E)return h==e&&E==t;var I=-1,v=!0,x=r&QKe?new bKe:void 0;for(n.set(t,e),n.set(e,t);++I<A;){var C=t[I],R=e[I];if(o)var L=u?o(R,C,I,e,t,n):o(C,R,I,t,e,n);if(L!==void 0){if(L)continue;v=!1;break}if(x){if(!SKe(e,function(U,z){if(!xKe(x,z)&&(C===U||a(C,U,r,o,n)))return x.push(z)})){v=!1;break}}else if(!(C===R||a(C,R,r,o,n))){v=!1;break}}return n.delete(t),n.delete(e),v}Cee.exports=FKe});var TN=_((iRt,wee)=>{var RKe=_l(),TKe=RKe.Uint8Array;wee.exports=TKe});var Bee=_((sRt,Iee)=>{function NKe(t){var e=-1,r=Array(t.size);return t.forEach(function(o,a){r[++e]=[a,o]}),r}Iee.exports=NKe});var Dee=_((oRt,vee)=>{function LKe(t){var e=-1,r=Array(t.size);return t.forEach(function(o){r[++e]=o}),r}vee.exports=LKe});var kee=_((aRt,xee)=>{var Pee=lg(),bee=TN(),MKe=ym(),OKe=RN(),UKe=Bee(),_Ke=Dee(),HKe=1,qKe=2,jKe=\"[object Boolean]\",GKe=\"[object Date]\",YKe=\"[object Error]\",WKe=\"[object Map]\",KKe=\"[object Number]\",VKe=\"[object RegExp]\",zKe=\"[object Set]\",JKe=\"[object String]\",XKe=\"[object Symbol]\",ZKe=\"[object ArrayBuffer]\",$Ke=\"[object DataView]\",See=Pee?Pee.prototype:void 0,NN=See?See.valueOf:void 0;function eVe(t,e,r,o,a,n,u){switch(r){case $Ke:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case ZKe:return!(t.byteLength!=e.byteLength||!n(new bee(t),new bee(e)));case jKe:case GKe:case KKe:return MKe(+t,+e);case YKe:return t.name==e.name&&t.message==e.message;case VKe:case JKe:return t==e+\"\";case WKe:var A=UKe;case zKe:var p=o&HKe;if(A||(A=_Ke),t.size!=e.size&&!p)return!1;var h=u.get(t);if(h)return h==e;o|=qKe,u.set(t,e);var E=OKe(A(t),A(e),o,a,n,u);return u.delete(t),E;case XKe:if(NN)return NN.call(t)==NN.call(e)}return!1}xee.exports=eVe});var xP=_((lRt,Qee)=>{function tVe(t,e){for(var r=-1,o=e.length,a=t.length;++r<o;)t[a+r]=e[r];return t}Qee.exports=tVe});var Hl=_((cRt,Fee)=>{var rVe=Array.isArray;Fee.exports=rVe});var LN=_((uRt,Ree)=>{var nVe=xP(),iVe=Hl();function sVe(t,e,r){var o=e(t);return iVe(t)?o:nVe(o,r(t))}Ree.exports=sVe});var Nee=_((ARt,Tee)=>{function oVe(t,e){for(var r=-1,o=t==null?0:t.length,a=0,n=[];++r<o;){var u=t[r];e(u,r,t)&&(n[a++]=u)}return n}Tee.exports=oVe});var MN=_((fRt,Lee)=>{function aVe(){return[]}Lee.exports=aVe});var kP=_((pRt,Oee)=>{var lVe=Nee(),cVe=MN(),uVe=Object.prototype,AVe=uVe.propertyIsEnumerable,Mee=Object.getOwnPropertySymbols,fVe=Mee?function(t){return t==null?[]:(t=Object(t),lVe(Mee(t),function(e){return AVe.call(t,e)}))}:cVe;Oee.exports=fVe});var _ee=_((hRt,Uee)=>{function pVe(t,e){for(var r=-1,o=Array(t);++r<t;)o[r]=e(r);return o}Uee.exports=pVe});var Ju=_((gRt,Hee)=>{function hVe(t){return t!=null&&typeof t==\"object\"}Hee.exports=hVe});var jee=_((dRt,qee)=>{var gVe=cg(),dVe=Ju(),mVe=\"[object Arguments]\";function yVe(t){return dVe(t)&&gVe(t)==mVe}qee.exports=yVe});var EI=_((mRt,Wee)=>{var Gee=jee(),EVe=Ju(),Yee=Object.prototype,CVe=Yee.hasOwnProperty,wVe=Yee.propertyIsEnumerable,IVe=Gee(function(){return arguments}())?Gee:function(t){return EVe(t)&&CVe.call(t,\"callee\")&&!wVe.call(t,\"callee\")};Wee.exports=IVe});var Vee=_((yRt,Kee)=>{function BVe(){return!1}Kee.exports=BVe});var wI=_((CI,Bm)=>{var vVe=_l(),DVe=Vee(),Xee=typeof CI==\"object\"&&CI&&!CI.nodeType&&CI,zee=Xee&&typeof Bm==\"object\"&&Bm&&!Bm.nodeType&&Bm,PVe=zee&&zee.exports===Xee,Jee=PVe?vVe.Buffer:void 0,bVe=Jee?Jee.isBuffer:void 0,SVe=bVe||DVe;Bm.exports=SVe});var II=_((ERt,Zee)=>{var xVe=9007199254740991,kVe=/^(?:0|[1-9]\\d*)$/;function QVe(t,e){var r=typeof t;return e=e??xVe,!!e&&(r==\"number\"||r!=\"symbol\"&&kVe.test(t))&&t>-1&&t%1==0&&t<e}Zee.exports=QVe});var QP=_((CRt,$ee)=>{var FVe=9007199254740991;function RVe(t){return typeof t==\"number\"&&t>-1&&t%1==0&&t<=FVe}$ee.exports=RVe});var tte=_((wRt,ete)=>{var TVe=cg(),NVe=QP(),LVe=Ju(),MVe=\"[object Arguments]\",OVe=\"[object Array]\",UVe=\"[object Boolean]\",_Ve=\"[object Date]\",HVe=\"[object Error]\",qVe=\"[object Function]\",jVe=\"[object Map]\",GVe=\"[object Number]\",YVe=\"[object Object]\",WVe=\"[object RegExp]\",KVe=\"[object Set]\",VVe=\"[object String]\",zVe=\"[object WeakMap]\",JVe=\"[object ArrayBuffer]\",XVe=\"[object DataView]\",ZVe=\"[object Float32Array]\",$Ve=\"[object Float64Array]\",eze=\"[object Int8Array]\",tze=\"[object Int16Array]\",rze=\"[object Int32Array]\",nze=\"[object Uint8Array]\",ize=\"[object Uint8ClampedArray]\",sze=\"[object Uint16Array]\",oze=\"[object Uint32Array]\",ui={};ui[ZVe]=ui[$Ve]=ui[eze]=ui[tze]=ui[rze]=ui[nze]=ui[ize]=ui[sze]=ui[oze]=!0;ui[MVe]=ui[OVe]=ui[JVe]=ui[UVe]=ui[XVe]=ui[_Ve]=ui[HVe]=ui[qVe]=ui[jVe]=ui[GVe]=ui[YVe]=ui[WVe]=ui[KVe]=ui[VVe]=ui[zVe]=!1;function aze(t){return LVe(t)&&NVe(t.length)&&!!ui[TVe(t)]}ete.exports=aze});var FP=_((IRt,rte)=>{function lze(t){return function(e){return t(e)}}rte.exports=lze});var RP=_((BI,vm)=>{var cze=kN(),nte=typeof BI==\"object\"&&BI&&!BI.nodeType&&BI,vI=nte&&typeof vm==\"object\"&&vm&&!vm.nodeType&&vm,uze=vI&&vI.exports===nte,ON=uze&&cze.process,Aze=function(){try{var t=vI&&vI.require&&vI.require(\"util\").types;return t||ON&&ON.binding&&ON.binding(\"util\")}catch{}}();vm.exports=Aze});var TP=_((BRt,ote)=>{var fze=tte(),pze=FP(),ite=RP(),ste=ite&&ite.isTypedArray,hze=ste?pze(ste):fze;ote.exports=hze});var UN=_((vRt,ate)=>{var gze=_ee(),dze=EI(),mze=Hl(),yze=wI(),Eze=II(),Cze=TP(),wze=Object.prototype,Ize=wze.hasOwnProperty;function Bze(t,e){var r=mze(t),o=!r&&dze(t),a=!r&&!o&&yze(t),n=!r&&!o&&!a&&Cze(t),u=r||o||a||n,A=u?gze(t.length,String):[],p=A.length;for(var h in t)(e||Ize.call(t,h))&&!(u&&(h==\"length\"||a&&(h==\"offset\"||h==\"parent\")||n&&(h==\"buffer\"||h==\"byteLength\"||h==\"byteOffset\")||Eze(h,p)))&&A.push(h);return A}ate.exports=Bze});var NP=_((DRt,lte)=>{var vze=Object.prototype;function Dze(t){var e=t&&t.constructor,r=typeof e==\"function\"&&e.prototype||vze;return t===r}lte.exports=Dze});var _N=_((PRt,cte)=>{function Pze(t,e){return function(r){return t(e(r))}}cte.exports=Pze});var Ate=_((bRt,ute)=>{var bze=_N(),Sze=bze(Object.keys,Object);ute.exports=Sze});var pte=_((SRt,fte)=>{var xze=NP(),kze=Ate(),Qze=Object.prototype,Fze=Qze.hasOwnProperty;function Rze(t){if(!xze(t))return kze(t);var e=[];for(var r in Object(t))Fze.call(t,r)&&r!=\"constructor\"&&e.push(r);return e}fte.exports=Rze});var DI=_((xRt,hte)=>{var Tze=vP(),Nze=QP();function Lze(t){return t!=null&&Nze(t.length)&&!Tze(t)}hte.exports=Lze});var LP=_((kRt,gte)=>{var Mze=UN(),Oze=pte(),Uze=DI();function _ze(t){return Uze(t)?Mze(t):Oze(t)}gte.exports=_ze});var HN=_((QRt,dte)=>{var Hze=LN(),qze=kP(),jze=LP();function Gze(t){return Hze(t,jze,qze)}dte.exports=Gze});var Ete=_((FRt,yte)=>{var mte=HN(),Yze=1,Wze=Object.prototype,Kze=Wze.hasOwnProperty;function Vze(t,e,r,o,a,n){var u=r&Yze,A=mte(t),p=A.length,h=mte(e),E=h.length;if(p!=E&&!u)return!1;for(var I=p;I--;){var v=A[I];if(!(u?v in e:Kze.call(e,v)))return!1}var x=n.get(t),C=n.get(e);if(x&&C)return x==e&&C==t;var R=!0;n.set(t,e),n.set(e,t);for(var L=u;++I<p;){v=A[I];var U=t[v],z=e[v];if(o)var te=u?o(z,U,v,e,t,n):o(U,z,v,t,e,n);if(!(te===void 0?U===z||a(U,z,r,o,n):te)){R=!1;break}L||(L=v==\"constructor\")}if(R&&!L){var ae=t.constructor,le=e.constructor;ae!=le&&\"constructor\"in t&&\"constructor\"in e&&!(typeof ae==\"function\"&&ae instanceof ae&&typeof le==\"function\"&&le instanceof le)&&(R=!1)}return n.delete(t),n.delete(e),R}yte.exports=Vze});var wte=_((RRt,Cte)=>{var zze=Vp(),Jze=_l(),Xze=zze(Jze,\"DataView\");Cte.exports=Xze});var Bte=_((TRt,Ite)=>{var Zze=Vp(),$ze=_l(),eJe=Zze($ze,\"Promise\");Ite.exports=eJe});var Dte=_((NRt,vte)=>{var tJe=Vp(),rJe=_l(),nJe=tJe(rJe,\"Set\");vte.exports=nJe});var bte=_((LRt,Pte)=>{var iJe=Vp(),sJe=_l(),oJe=iJe(sJe,\"WeakMap\");Pte.exports=oJe});var PI=_((MRt,Tte)=>{var qN=wte(),jN=DP(),GN=Bte(),YN=Dte(),WN=bte(),Rte=cg(),Dm=FN(),Ste=\"[object Map]\",aJe=\"[object Object]\",xte=\"[object Promise]\",kte=\"[object Set]\",Qte=\"[object WeakMap]\",Fte=\"[object DataView]\",lJe=Dm(qN),cJe=Dm(jN),uJe=Dm(GN),AJe=Dm(YN),fJe=Dm(WN),ug=Rte;(qN&&ug(new qN(new ArrayBuffer(1)))!=Fte||jN&&ug(new jN)!=Ste||GN&&ug(GN.resolve())!=xte||YN&&ug(new YN)!=kte||WN&&ug(new WN)!=Qte)&&(ug=function(t){var e=Rte(t),r=e==aJe?t.constructor:void 0,o=r?Dm(r):\"\";if(o)switch(o){case lJe:return Fte;case cJe:return Ste;case uJe:return xte;case AJe:return kte;case fJe:return Qte}return e});Tte.exports=ug});var qte=_((ORt,Hte)=>{var KN=bP(),pJe=RN(),hJe=kee(),gJe=Ete(),Nte=PI(),Lte=Hl(),Mte=wI(),dJe=TP(),mJe=1,Ote=\"[object Arguments]\",Ute=\"[object Array]\",MP=\"[object Object]\",yJe=Object.prototype,_te=yJe.hasOwnProperty;function EJe(t,e,r,o,a,n){var u=Lte(t),A=Lte(e),p=u?Ute:Nte(t),h=A?Ute:Nte(e);p=p==Ote?MP:p,h=h==Ote?MP:h;var E=p==MP,I=h==MP,v=p==h;if(v&&Mte(t)){if(!Mte(e))return!1;u=!0,E=!1}if(v&&!E)return n||(n=new KN),u||dJe(t)?pJe(t,e,r,o,a,n):hJe(t,e,p,r,o,a,n);if(!(r&mJe)){var x=E&&_te.call(t,\"__wrapped__\"),C=I&&_te.call(e,\"__wrapped__\");if(x||C){var R=x?t.value():t,L=C?e.value():e;return n||(n=new KN),a(R,L,r,o,n)}}return v?(n||(n=new KN),gJe(t,e,r,o,a,n)):!1}Hte.exports=EJe});var Wte=_((URt,Yte)=>{var CJe=qte(),jte=Ju();function Gte(t,e,r,o,a){return t===e?!0:t==null||e==null||!jte(t)&&!jte(e)?t!==t&&e!==e:CJe(t,e,r,o,Gte,a)}Yte.exports=Gte});var Vte=_((_Rt,Kte)=>{var wJe=Wte();function IJe(t,e){return wJe(t,e)}Kte.exports=IJe});var VN=_((HRt,zte)=>{var BJe=Vp(),vJe=function(){try{var t=BJe(Object,\"defineProperty\");return t({},\"\",{}),t}catch{}}();zte.exports=vJe});var OP=_((qRt,Xte)=>{var Jte=VN();function DJe(t,e,r){e==\"__proto__\"&&Jte?Jte(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}Xte.exports=DJe});var zN=_((jRt,Zte)=>{var PJe=OP(),bJe=ym();function SJe(t,e,r){(r!==void 0&&!bJe(t[e],r)||r===void 0&&!(e in t))&&PJe(t,e,r)}Zte.exports=SJe});var ere=_((GRt,$te)=>{function xJe(t){return function(e,r,o){for(var a=-1,n=Object(e),u=o(e),A=u.length;A--;){var p=u[t?A:++a];if(r(n[p],p,n)===!1)break}return e}}$te.exports=xJe});var rre=_((YRt,tre)=>{var kJe=ere(),QJe=kJe();tre.exports=QJe});var JN=_((bI,Pm)=>{var FJe=_l(),ore=typeof bI==\"object\"&&bI&&!bI.nodeType&&bI,nre=ore&&typeof Pm==\"object\"&&Pm&&!Pm.nodeType&&Pm,RJe=nre&&nre.exports===ore,ire=RJe?FJe.Buffer:void 0,sre=ire?ire.allocUnsafe:void 0;function TJe(t,e){if(e)return t.slice();var r=t.length,o=sre?sre(r):new t.constructor(r);return t.copy(o),o}Pm.exports=TJe});var UP=_((WRt,lre)=>{var are=TN();function NJe(t){var e=new t.constructor(t.byteLength);return new are(e).set(new are(t)),e}lre.exports=NJe});var XN=_((KRt,cre)=>{var LJe=UP();function MJe(t,e){var r=e?LJe(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}cre.exports=MJe});var _P=_((VRt,ure)=>{function OJe(t,e){var r=-1,o=t.length;for(e||(e=Array(o));++r<o;)e[r]=t[r];return e}ure.exports=OJe});var pre=_((zRt,fre)=>{var UJe=sl(),Are=Object.create,_Je=function(){function t(){}return function(e){if(!UJe(e))return{};if(Are)return Are(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();fre.exports=_Je});var HP=_((JRt,hre)=>{var HJe=_N(),qJe=HJe(Object.getPrototypeOf,Object);hre.exports=qJe});var ZN=_((XRt,gre)=>{var jJe=pre(),GJe=HP(),YJe=NP();function WJe(t){return typeof t.constructor==\"function\"&&!YJe(t)?jJe(GJe(t)):{}}gre.exports=WJe});var mre=_((ZRt,dre)=>{var KJe=DI(),VJe=Ju();function zJe(t){return VJe(t)&&KJe(t)}dre.exports=zJe});var $N=_(($Rt,Ere)=>{var JJe=cg(),XJe=HP(),ZJe=Ju(),$Je=\"[object Object]\",eXe=Function.prototype,tXe=Object.prototype,yre=eXe.toString,rXe=tXe.hasOwnProperty,nXe=yre.call(Object);function iXe(t){if(!ZJe(t)||JJe(t)!=$Je)return!1;var e=XJe(t);if(e===null)return!0;var r=rXe.call(e,\"constructor\")&&e.constructor;return typeof r==\"function\"&&r instanceof r&&yre.call(r)==nXe}Ere.exports=iXe});var eL=_((eTt,Cre)=>{function sXe(t,e){if(!(e===\"constructor\"&&typeof t[e]==\"function\")&&e!=\"__proto__\")return t[e]}Cre.exports=sXe});var qP=_((tTt,wre)=>{var oXe=OP(),aXe=ym(),lXe=Object.prototype,cXe=lXe.hasOwnProperty;function uXe(t,e,r){var o=t[e];(!(cXe.call(t,e)&&aXe(o,r))||r===void 0&&!(e in t))&&oXe(t,e,r)}wre.exports=uXe});var Ag=_((rTt,Ire)=>{var AXe=qP(),fXe=OP();function pXe(t,e,r,o){var a=!r;r||(r={});for(var n=-1,u=e.length;++n<u;){var A=e[n],p=o?o(r[A],t[A],A,r,t):void 0;p===void 0&&(p=t[A]),a?fXe(r,A,p):AXe(r,A,p)}return r}Ire.exports=pXe});var vre=_((nTt,Bre)=>{function hXe(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}Bre.exports=hXe});var Pre=_((iTt,Dre)=>{var gXe=sl(),dXe=NP(),mXe=vre(),yXe=Object.prototype,EXe=yXe.hasOwnProperty;function CXe(t){if(!gXe(t))return mXe(t);var e=dXe(t),r=[];for(var o in t)o==\"constructor\"&&(e||!EXe.call(t,o))||r.push(o);return r}Dre.exports=CXe});var bm=_((sTt,bre)=>{var wXe=UN(),IXe=Pre(),BXe=DI();function vXe(t){return BXe(t)?wXe(t,!0):IXe(t)}bre.exports=vXe});var xre=_((oTt,Sre)=>{var DXe=Ag(),PXe=bm();function bXe(t){return DXe(t,PXe(t))}Sre.exports=bXe});var Nre=_((aTt,Tre)=>{var kre=zN(),SXe=JN(),xXe=XN(),kXe=_P(),QXe=ZN(),Qre=EI(),Fre=Hl(),FXe=mre(),RXe=wI(),TXe=vP(),NXe=sl(),LXe=$N(),MXe=TP(),Rre=eL(),OXe=xre();function UXe(t,e,r,o,a,n,u){var A=Rre(t,r),p=Rre(e,r),h=u.get(p);if(h){kre(t,r,h);return}var E=n?n(A,p,r+\"\",t,e,u):void 0,I=E===void 0;if(I){var v=Fre(p),x=!v&&RXe(p),C=!v&&!x&&MXe(p);E=p,v||x||C?Fre(A)?E=A:FXe(A)?E=kXe(A):x?(I=!1,E=SXe(p,!0)):C?(I=!1,E=xXe(p,!0)):E=[]:LXe(p)||Qre(p)?(E=A,Qre(A)?E=OXe(A):(!NXe(A)||TXe(A))&&(E=QXe(p))):I=!1}I&&(u.set(p,E),a(E,p,o,n,u),u.delete(p)),kre(t,r,E)}Tre.exports=UXe});var Ore=_((lTt,Mre)=>{var _Xe=bP(),HXe=zN(),qXe=rre(),jXe=Nre(),GXe=sl(),YXe=bm(),WXe=eL();function Lre(t,e,r,o,a){t!==e&&qXe(e,function(n,u){if(a||(a=new _Xe),GXe(n))jXe(t,e,u,r,Lre,o,a);else{var A=o?o(WXe(t,u),n,u+\"\",t,e,a):void 0;A===void 0&&(A=n),HXe(t,u,A)}},YXe)}Mre.exports=Lre});var tL=_((cTt,Ure)=>{function KXe(t){return t}Ure.exports=KXe});var Hre=_((uTt,_re)=>{function VXe(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}_re.exports=VXe});var rL=_((ATt,jre)=>{var zXe=Hre(),qre=Math.max;function JXe(t,e,r){return e=qre(e===void 0?t.length-1:e,0),function(){for(var o=arguments,a=-1,n=qre(o.length-e,0),u=Array(n);++a<n;)u[a]=o[e+a];a=-1;for(var A=Array(e+1);++a<e;)A[a]=o[a];return A[e]=r(u),zXe(t,this,A)}}jre.exports=JXe});var Yre=_((fTt,Gre)=>{function XXe(t){return function(){return t}}Gre.exports=XXe});var Vre=_((pTt,Kre)=>{var ZXe=Yre(),Wre=VN(),$Xe=tL(),eZe=Wre?function(t,e){return Wre(t,\"toString\",{configurable:!0,enumerable:!1,value:ZXe(e),writable:!0})}:$Xe;Kre.exports=eZe});var Jre=_((hTt,zre)=>{var tZe=800,rZe=16,nZe=Date.now;function iZe(t){var e=0,r=0;return function(){var o=nZe(),a=rZe-(o-r);if(r=o,a>0){if(++e>=tZe)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}zre.exports=iZe});var nL=_((gTt,Xre)=>{var sZe=Vre(),oZe=Jre(),aZe=oZe(sZe);Xre.exports=aZe});var $re=_((dTt,Zre)=>{var lZe=tL(),cZe=rL(),uZe=nL();function AZe(t,e){return uZe(cZe(t,e,lZe),t+\"\")}Zre.exports=AZe});var tne=_((mTt,ene)=>{var fZe=ym(),pZe=DI(),hZe=II(),gZe=sl();function dZe(t,e,r){if(!gZe(r))return!1;var o=typeof e;return(o==\"number\"?pZe(r)&&hZe(e,r.length):o==\"string\"&&e in r)?fZe(r[e],t):!1}ene.exports=dZe});var nne=_((yTt,rne)=>{var mZe=$re(),yZe=tne();function EZe(t){return mZe(function(e,r){var o=-1,a=r.length,n=a>1?r[a-1]:void 0,u=a>2?r[2]:void 0;for(n=t.length>3&&typeof n==\"function\"?(a--,n):void 0,u&&yZe(r[0],r[1],u)&&(n=a<3?void 0:n,a=1),e=Object(e);++o<a;){var A=r[o];A&&t(e,A,o,n)}return e})}rne.exports=EZe});var sne=_((ETt,ine)=>{var CZe=Ore(),wZe=nne(),IZe=wZe(function(t,e,r,o){CZe(t,e,r,o)});ine.exports=IZe});var He={};Vt(He,{AsyncActions:()=>oL,BufferStream:()=>sL,CachingStrategy:()=>mne,DefaultStream:()=>aL,allSettledSafe:()=>_c,assertNever:()=>cL,bufferStream:()=>km,buildIgnorePattern:()=>xZe,convertMapsToIndexableObjects:()=>GP,dynamicRequire:()=>vf,escapeRegExp:()=>vZe,getArrayWithDefault:()=>xI,getFactoryWithDefault:()=>al,getMapWithDefault:()=>kI,getSetWithDefault:()=>Sm,groupBy:()=>FZe,isIndexableObject:()=>iL,isPathLike:()=>kZe,isTaggedYarnVersion:()=>BZe,makeDeferred:()=>hne,mapAndFilter:()=>ol,mapAndFind:()=>zp,mergeIntoTarget:()=>Ene,overrideType:()=>DZe,parseBoolean:()=>QI,parseInt:()=>Qm,parseOptionalBoolean:()=>yne,plural:()=>jP,prettifyAsyncErrors:()=>xm,prettifySyncErrors:()=>uL,releaseAfterUseAsync:()=>bZe,replaceEnvVariables:()=>YP,sortMap:()=>Fs,toMerged:()=>QZe,tryParseOptionalBoolean:()=>AL,validateEnum:()=>PZe});function BZe(t){return!!(Ane.default.valid(t)&&t.match(/^[^-]+(-rc\\.[0-9]+)?$/))}function jP(t,{one:e,more:r,zero:o=r}){return t===0?o:t===1?e:r}function vZe(t){return t.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function DZe(t){}function cL(t){throw new Error(`Assertion failed: Unexpected object '${t}'`)}function PZe(t,e){let r=Object.values(t);if(!r.includes(e))throw new st(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${r.map(o=>JSON.stringify(o)).join(\", \")})`);return e}function ol(t,e){let r=[];for(let o of t){let a=e(o);a!==fne&&r.push(a)}return r}function zp(t,e){for(let r of t){let o=e(r);if(o!==pne)return o}}function iL(t){return typeof t==\"object\"&&t!==null}async function _c(t){let e=await Promise.allSettled(t),r=[];for(let o of e){if(o.status===\"rejected\")throw o.reason;r.push(o.value)}return r}function GP(t){if(t instanceof Map&&(t=Object.fromEntries(t)),iL(t))for(let e of Object.keys(t)){let r=t[e];iL(r)&&(t[e]=GP(r))}return t}function al(t,e,r){let o=t.get(e);return typeof o>\"u\"&&t.set(e,o=r()),o}function xI(t,e){let r=t.get(e);return typeof r>\"u\"&&t.set(e,r=[]),r}function Sm(t,e){let r=t.get(e);return typeof r>\"u\"&&t.set(e,r=new Set),r}function kI(t,e){let r=t.get(e);return typeof r>\"u\"&&t.set(e,r=new Map),r}async function bZe(t,e){if(e==null)return await t();try{return await t()}finally{await e()}}async function xm(t,e){try{return await t()}catch(r){throw r.message=e(r.message),r}}function uL(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}async function km(t){return await new Promise((e,r)=>{let o=[];t.on(\"error\",a=>{r(a)}),t.on(\"data\",a=>{o.push(a)}),t.on(\"end\",()=>{e(Buffer.concat(o))})})}function hne(){let t,e;return{promise:new Promise((o,a)=>{t=o,e=a}),resolve:t,reject:e}}function gne(t){return SI(ue.fromPortablePath(t))}function dne(path){let physicalPath=ue.fromPortablePath(path),currentCacheEntry=SI.cache[physicalPath];delete SI.cache[physicalPath];let result;try{result=gne(physicalPath);let freshCacheEntry=SI.cache[physicalPath],dynamicModule=eval(\"module\"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{SI.cache[physicalPath]=currentCacheEntry}return result}function SZe(t){let e=one.get(t),r=oe.statSync(t);if(e?.mtime===r.mtimeMs)return e.instance;let o=dne(t);return one.set(t,{mtime:r.mtimeMs,instance:o}),o}function vf(t,{cachingStrategy:e=2}={}){switch(e){case 0:return dne(t);case 1:return SZe(t);case 2:return gne(t);default:throw new Error(\"Unsupported caching strategy\")}}function Fs(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];for(let n of e)o.push(r.map(u=>n(u)));let a=r.map((n,u)=>u);return a.sort((n,u)=>{for(let A of o){let p=A[n]<A[u]?-1:A[n]>A[u]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function xZe(t){return t.length===0?null:t.map(e=>`(${cne.default.makeRe(e,{windows:!1,dot:!0}).source})`).join(\"|\")}function YP(t,{env:e}){let r=/\\${(?<variableName>[\\d\\w_]+)(?<colon>:)?(?:-(?<fallback>[^}]*))?}/g;return t.replace(r,(...o)=>{let{variableName:a,colon:n,fallback:u}=o[o.length-1],A=Object.hasOwn(e,a),p=e[a];if(p||A&&!n)return p;if(u!=null)return u;throw new st(`Environment variable not found (${a})`)})}function QI(t){switch(t){case\"true\":case\"1\":case 1:case!0:return!0;case\"false\":case\"0\":case 0:case!1:return!1;default:throw new Error(`Couldn't parse \"${t}\" as a boolean`)}}function yne(t){return typeof t>\"u\"?t:QI(t)}function AL(t){try{return yne(t)}catch{return null}}function kZe(t){return!!(ue.isAbsolute(t)||t.match(/^(\\.{1,2}|~)\\//))}function Ene(t,...e){let r=u=>({value:u}),o=r(t),a=e.map(u=>r(u)),{value:n}=(0,lne.default)(o,...a,(u,A)=>{if(Array.isArray(u)&&Array.isArray(A)){for(let p of A)u.find(h=>(0,ane.default)(h,p))||u.push(p);return u}});return n}function QZe(...t){return Ene({},...t)}function FZe(t,e){let r=Object.create(null);for(let o of t){let a=o[e];r[a]??=[],r[a].push(o)}return r}function Qm(t){return typeof t==\"string\"?Number.parseInt(t,10):t}var ane,lne,cne,une,Ane,lL,fne,pne,sL,oL,aL,SI,one,mne,ql=Et(()=>{Pt();qt();ane=Ze(Vte()),lne=Ze(sne()),cne=Ze($o()),une=Ze(eg()),Ane=Ze(Jn()),lL=ve(\"stream\");fne=Symbol();ol.skip=fne;pne=Symbol();zp.skip=pne;sL=class extends lL.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(r,o,a){if(o!==\"buffer\"||!Buffer.isBuffer(r))throw new Error(\"Assertion failed: BufferStream only accept buffers\");this.chunks.push(r),a(null,null)}_flush(r){r(null,Buffer.concat(this.chunks))}};oL=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,une.default)(e)}set(e,r){let o=this.deferred.get(e);typeof o>\"u\"&&this.deferred.set(e,o=hne());let a=this.limit(()=>r());return this.promises.set(e,a),a.then(()=>{this.promises.get(e)===a&&o.resolve()},n=>{this.promises.get(e)===a&&o.reject(n)}),o.promise}reduce(e,r){let o=this.promises.get(e)??Promise.resolve();this.set(e,()=>r(o))}async wait(){await Promise.all(this.promises.values())}},aL=class extends lL.Transform{constructor(r=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=r}_transform(r,o,a){if(o!==\"buffer\"||!Buffer.isBuffer(r))throw new Error(\"Assertion failed: DefaultStream only accept buffers\");this.active=!1,a(null,r)}_flush(r){this.active&&this.ifEmpty.length>0?r(null,this.ifEmpty):r(null)}},SI=eval(\"require\");one=new Map;mne=(o=>(o[o.NoCache=0]=\"NoCache\",o[o.FsTime=1]=\"FsTime\",o[o.Node=2]=\"Node\",o))(mne||{})});var Fm,fL,pL,Cne=Et(()=>{Fm=(r=>(r.HARD=\"HARD\",r.SOFT=\"SOFT\",r))(Fm||{}),fL=(o=>(o.Dependency=\"Dependency\",o.PeerDependency=\"PeerDependency\",o.PeerDependencyMeta=\"PeerDependencyMeta\",o))(fL||{}),pL=(o=>(o.Inactive=\"inactive\",o.Redundant=\"redundant\",o.Active=\"active\",o))(pL||{})});var pe={};Vt(pe,{LogLevel:()=>JP,Style:()=>KP,Type:()=>yt,addLogFilterSupport:()=>TI,applyColor:()=>Xs,applyHyperlink:()=>Tm,applyStyle:()=>fg,json:()=>pg,jsonOrPretty:()=>NZe,mark:()=>yL,pretty:()=>Ot,prettyField:()=>Xu,prettyList:()=>mL,prettyTruncatedLocatorList:()=>zP,stripAnsi:()=>Rm.default,supportsColor:()=>VP,supportsHyperlinks:()=>dL,tuple:()=>Hc});function wne(t){let e=[\"KiB\",\"MiB\",\"GiB\",\"TiB\"],r=e.length;for(;r>1&&t<1024**r;)r-=1;let o=1024**r;return`${Math.floor(t*100/o)/100} ${e[r-1]}`}function Hc(t,e){return[e,t]}function fg(t,e,r){return t.get(\"enableColors\")&&r&2&&(e=RI.default.bold(e)),e}function Xs(t,e,r){if(!t.get(\"enableColors\"))return e;let o=RZe.get(r);if(o===null)return e;let a=typeof o>\"u\"?r:gL.level>=3?o[0]:o[1],n=typeof a==\"number\"?hL.ansi256(a):a.startsWith(\"#\")?hL.hex(a):hL[a];if(typeof n!=\"function\")throw new Error(`Invalid format type ${a}`);return n(e)}function Tm(t,e,r){return t.get(\"enableHyperlinks\")?TZe?`\\x1B]8;;${r}\\x1B\\\\${e}\\x1B]8;;\\x1B\\\\`:`\\x1B]8;;${r}\\x07${e}\\x1B]8;;\\x07`:e}function Ot(t,e,r){if(e===null)return Xs(t,\"null\",yt.NULL);if(Object.hasOwn(WP,r))return WP[r].pretty(t,e);if(typeof e!=\"string\")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return Xs(t,e,r)}function mL(t,e,r,{separator:o=\", \"}={}){return[...e].map(a=>Ot(t,a,r)).join(o)}function pg(t,e){if(t===null)return null;if(Object.hasOwn(WP,e))return WP[e].json(t);if(typeof t!=\"string\")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return t}function NZe(t,e,[r,o]){return t?pg(r,o):Ot(e,r,o)}function yL(t){return{Check:Xs(t,\"\\u2713\",\"green\"),Cross:Xs(t,\"\\u2718\",\"red\"),Question:Xs(t,\"?\",\"cyan\")}}function Xu(t,{label:e,value:[r,o]}){return`${Ot(t,e,yt.CODE)}: ${Ot(t,r,o)}`}function zP(t,e,r){let o=[],a=[...e],n=r;for(;a.length>0;){let h=a[0],E=`${qr(t,h)}, `,I=EL(h).length+2;if(o.length>0&&n<I)break;o.push([E,I]),n-=I,a.shift()}if(a.length===0)return o.map(([h])=>h).join(\"\").slice(0,-2);let u=\"X\".repeat(a.length.toString().length),A=`and ${u} more.`,p=a.length;for(;o.length>1&&n<A.length;)n+=o[o.length-1][1],p+=1,o.pop();return[o.map(([h])=>h).join(\"\"),A.replace(u,Ot(t,p,yt.NUMBER))].join(\"\")}function TI(t,{configuration:e}){let r=e.get(\"logFilters\"),o=new Map,a=new Map,n=[];for(let I of r){let v=I.get(\"level\");if(typeof v>\"u\")continue;let x=I.get(\"code\");typeof x<\"u\"&&o.set(x,v);let C=I.get(\"text\");typeof C<\"u\"&&a.set(C,v);let R=I.get(\"pattern\");typeof R<\"u\"&&n.push([Ine.default.matcher(R,{contains:!0}),v])}n.reverse();let u=(I,v,x)=>{if(I===null||I===0)return x;let C=a.size>0||n.length>0?(0,Rm.default)(v):v;if(a.size>0){let R=a.get(C);if(typeof R<\"u\")return R??x}if(n.length>0){for(let[R,L]of n)if(R(C))return L??x}if(o.size>0){let R=o.get(Ku(I));if(typeof R<\"u\")return R??x}return x},A=t.reportInfo,p=t.reportWarning,h=t.reportError,E=function(I,v,x,C){switch(u(v,x,C)){case\"info\":A.call(I,v,x);break;case\"warning\":p.call(I,v??0,x);break;case\"error\":h.call(I,v??0,x);break}};t.reportInfo=function(...I){return E(this,...I,\"info\")},t.reportWarning=function(...I){return E(this,...I,\"warning\")},t.reportError=function(...I){return E(this,...I,\"error\")}}var RI,FI,Ine,Rm,Bne,yt,KP,gL,VP,dL,hL,RZe,bo,WP,TZe,JP,jl=Et(()=>{Pt();RI=Ze(pN()),FI=Ze(X0());qt();Ine=Ze($o()),Rm=Ze(BP()),Bne=ve(\"util\");$D();So();yt={NO_HINT:\"NO_HINT\",ID:\"ID\",NULL:\"NULL\",SCOPE:\"SCOPE\",NAME:\"NAME\",RANGE:\"RANGE\",REFERENCE:\"REFERENCE\",NUMBER:\"NUMBER\",PATH:\"PATH\",URL:\"URL\",ADDED:\"ADDED\",REMOVED:\"REMOVED\",CODE:\"CODE\",INSPECT:\"INSPECT\",DURATION:\"DURATION\",SIZE:\"SIZE\",SIZE_DIFF:\"SIZE_DIFF\",IDENT:\"IDENT\",DESCRIPTOR:\"DESCRIPTOR\",LOCATOR:\"LOCATOR\",RESOLUTION:\"RESOLUTION\",DEPENDENT:\"DEPENDENT\",PACKAGE_EXTENSION:\"PACKAGE_EXTENSION\",SETTING:\"SETTING\",MARKDOWN:\"MARKDOWN\",MARKDOWN_INLINE:\"MARKDOWN_INLINE\"},KP=(e=>(e[e.BOLD=2]=\"BOLD\",e))(KP||{}),gL=FI.default.GITHUB_ACTIONS?{level:2}:RI.default.supportsColor?{level:RI.default.supportsColor.level}:{level:0},VP=gL.level!==0,dL=VP&&!FI.default.GITHUB_ACTIONS&&!FI.default.CIRCLE&&!FI.default.GITLAB,hL=new RI.default.Instance(gL),RZe=new Map([[yt.NO_HINT,null],[yt.NULL,[\"#a853b5\",129]],[yt.SCOPE,[\"#d75f00\",166]],[yt.NAME,[\"#d7875f\",173]],[yt.RANGE,[\"#00afaf\",37]],[yt.REFERENCE,[\"#87afff\",111]],[yt.NUMBER,[\"#ffd700\",220]],[yt.PATH,[\"#d75fd7\",170]],[yt.URL,[\"#d75fd7\",170]],[yt.ADDED,[\"#5faf00\",70]],[yt.REMOVED,[\"#ff3131\",160]],[yt.CODE,[\"#87afff\",111]],[yt.SIZE,[\"#ffd700\",220]]]),bo=t=>t;WP={[yt.ID]:bo({pretty:(t,e)=>typeof e==\"number\"?Xs(t,`${e}`,yt.NUMBER):Xs(t,e,yt.CODE),json:t=>t}),[yt.INSPECT]:bo({pretty:(t,e)=>(0,Bne.inspect)(e,{depth:1/0,colors:t.get(\"enableColors\"),compact:!0,breakLength:1/0}),json:t=>t}),[yt.NUMBER]:bo({pretty:(t,e)=>Xs(t,`${e}`,yt.NUMBER),json:t=>t}),[yt.IDENT]:bo({pretty:(t,e)=>Oi(t,e),json:t=>rn(t)}),[yt.LOCATOR]:bo({pretty:(t,e)=>qr(t,e),json:t=>ka(t)}),[yt.DESCRIPTOR]:bo({pretty:(t,e)=>jn(t,e),json:t=>xa(t)}),[yt.RESOLUTION]:bo({pretty:(t,{descriptor:e,locator:r})=>NI(t,e,r),json:({descriptor:t,locator:e})=>({descriptor:xa(t),locator:e!==null?ka(e):null})}),[yt.DEPENDENT]:bo({pretty:(t,{locator:e,descriptor:r})=>CL(t,e,r),json:({locator:t,descriptor:e})=>({locator:ka(t),descriptor:xa(e)})}),[yt.PACKAGE_EXTENSION]:bo({pretty:(t,e)=>{switch(e.type){case\"Dependency\":return`${Oi(t,e.parentDescriptor)} \\u27A4 ${Xs(t,\"dependencies\",yt.CODE)} \\u27A4 ${Oi(t,e.descriptor)}`;case\"PeerDependency\":return`${Oi(t,e.parentDescriptor)} \\u27A4 ${Xs(t,\"peerDependencies\",yt.CODE)} \\u27A4 ${Oi(t,e.descriptor)}`;case\"PeerDependencyMeta\":return`${Oi(t,e.parentDescriptor)} \\u27A4 ${Xs(t,\"peerDependenciesMeta\",yt.CODE)} \\u27A4 ${Oi(t,ea(e.selector))} \\u27A4 ${Xs(t,e.key,yt.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:t=>{switch(t.type){case\"Dependency\":return`${rn(t.parentDescriptor)} > ${rn(t.descriptor)}`;case\"PeerDependency\":return`${rn(t.parentDescriptor)} >> ${rn(t.descriptor)}`;case\"PeerDependencyMeta\":return`${rn(t.parentDescriptor)} >> ${t.selector} / ${t.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}}}),[yt.SETTING]:bo({pretty:(t,e)=>(t.get(e),Tm(t,Xs(t,e,yt.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:t=>t}),[yt.DURATION]:bo({pretty:(t,e)=>{if(e>1e3*60){let r=Math.floor(e/1e3/60),o=Math.ceil((e-r*60*1e3)/1e3);return o===0?`${r}m`:`${r}m ${o}s`}else{let r=Math.floor(e/1e3),o=e-r*1e3;return o===0?`${r}s`:`${r}s ${o}ms`}},json:t=>t}),[yt.SIZE]:bo({pretty:(t,e)=>Xs(t,wne(e),yt.NUMBER),json:t=>t}),[yt.SIZE_DIFF]:bo({pretty:(t,e)=>{let r=e>=0?\"+\":\"-\",o=r===\"+\"?yt.REMOVED:yt.ADDED;return Xs(t,`${r} ${wne(Math.max(Math.abs(e),1))}`,o)},json:t=>t}),[yt.PATH]:bo({pretty:(t,e)=>Xs(t,ue.fromPortablePath(e),yt.PATH),json:t=>ue.fromPortablePath(t)}),[yt.MARKDOWN]:bo({pretty:(t,{text:e,format:r,paragraphs:o})=>Do(e,{format:r,paragraphs:o}),json:({text:t})=>t}),[yt.MARKDOWN_INLINE]:bo({pretty:(t,e)=>(e=e.replace(/(`+)((?:.|[\\n])*?)\\1/g,(r,o,a)=>Ot(t,o+a+o,yt.CODE)),e=e.replace(/(\\*\\*)((?:.|[\\n])*?)\\1/g,(r,o,a)=>fg(t,a,2)),e),json:t=>t})};TZe=!!process.env.KONSOLE_VERSION;JP=(a=>(a.Error=\"error\",a.Warning=\"warning\",a.Info=\"info\",a.Discard=\"discard\",a))(JP||{})});var vne=_(Nm=>{\"use strict\";Object.defineProperty(Nm,\"__esModule\",{value:!0});Nm.splitWhen=Nm.flatten=void 0;function LZe(t){return t.reduce((e,r)=>[].concat(e,r),[])}Nm.flatten=LZe;function MZe(t,e){let r=[[]],o=0;for(let a of t)e(a)?(o++,r[o]=[]):r[o].push(a);return r}Nm.splitWhen=MZe});var Dne=_(XP=>{\"use strict\";Object.defineProperty(XP,\"__esModule\",{value:!0});XP.isEnoentCodeError=void 0;function OZe(t){return t.code===\"ENOENT\"}XP.isEnoentCodeError=OZe});var Pne=_(ZP=>{\"use strict\";Object.defineProperty(ZP,\"__esModule\",{value:!0});ZP.createDirentFromStats=void 0;var wL=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function UZe(t,e){return new wL(t,e)}ZP.createDirentFromStats=UZe});var kne=_(Vi=>{\"use strict\";Object.defineProperty(Vi,\"__esModule\",{value:!0});Vi.convertPosixPathToPattern=Vi.convertWindowsPathToPattern=Vi.convertPathToPattern=Vi.escapePosixPath=Vi.escapeWindowsPath=Vi.escape=Vi.removeLeadingDotSegment=Vi.makeAbsolute=Vi.unixify=void 0;var _Ze=ve(\"os\"),HZe=ve(\"path\"),bne=_Ze.platform()===\"win32\",qZe=2,jZe=/(\\\\?)([()*?[\\]{|}]|^!|[!+@](?=\\()|\\\\(?![!()*+?@[\\]{|}]))/g,GZe=/(\\\\?)([()[\\]{}]|^!|[!+@](?=\\())/g,YZe=/^\\\\\\\\([.?])/,WZe=/\\\\(?![!()+@[\\]{}])/g;function KZe(t){return t.replace(/\\\\/g,\"/\")}Vi.unixify=KZe;function VZe(t,e){return HZe.resolve(t,e)}Vi.makeAbsolute=VZe;function zZe(t){if(t.charAt(0)===\".\"){let e=t.charAt(1);if(e===\"/\"||e===\"\\\\\")return t.slice(qZe)}return t}Vi.removeLeadingDotSegment=zZe;Vi.escape=bne?IL:BL;function IL(t){return t.replace(GZe,\"\\\\$2\")}Vi.escapeWindowsPath=IL;function BL(t){return t.replace(jZe,\"\\\\$2\")}Vi.escapePosixPath=BL;Vi.convertPathToPattern=bne?Sne:xne;function Sne(t){return IL(t).replace(YZe,\"//$1\").replace(WZe,\"/\")}Vi.convertWindowsPathToPattern=Sne;function xne(t){return BL(t)}Vi.convertPosixPathToPattern=xne});var Fne=_((TTt,Qne)=>{Qne.exports=function(e){if(typeof e!=\"string\"||e===\"\")return!1;for(var r;r=/(\\\\).|([@?!+*]\\(.*\\))/g.exec(e);){if(r[2])return!0;e=e.slice(r.index+r[0].length)}return!1}});var Nne=_((NTt,Tne)=>{var JZe=Fne(),Rne={\"{\":\"}\",\"(\":\")\",\"[\":\"]\"},XZe=function(t){if(t[0]===\"!\")return!0;for(var e=0,r=-2,o=-2,a=-2,n=-2,u=-2;e<t.length;){if(t[e]===\"*\"||t[e+1]===\"?\"&&/[\\].+)]/.test(t[e])||o!==-1&&t[e]===\"[\"&&t[e+1]!==\"]\"&&(o<e&&(o=t.indexOf(\"]\",e)),o>e&&(u===-1||u>o||(u=t.indexOf(\"\\\\\",e),u===-1||u>o)))||a!==-1&&t[e]===\"{\"&&t[e+1]!==\"}\"&&(a=t.indexOf(\"}\",e),a>e&&(u=t.indexOf(\"\\\\\",e),u===-1||u>a))||n!==-1&&t[e]===\"(\"&&t[e+1]===\"?\"&&/[:!=]/.test(t[e+2])&&t[e+3]!==\")\"&&(n=t.indexOf(\")\",e),n>e&&(u=t.indexOf(\"\\\\\",e),u===-1||u>n))||r!==-1&&t[e]===\"(\"&&t[e+1]!==\"|\"&&(r<e&&(r=t.indexOf(\"|\",e)),r!==-1&&t[r+1]!==\")\"&&(n=t.indexOf(\")\",r),n>r&&(u=t.indexOf(\"\\\\\",r),u===-1||u>n))))return!0;if(t[e]===\"\\\\\"){var A=t[e+1];e+=2;var p=Rne[A];if(p){var h=t.indexOf(p,e);h!==-1&&(e=h+1)}if(t[e]===\"!\")return!0}else e++}return!1},ZZe=function(t){if(t[0]===\"!\")return!0;for(var e=0;e<t.length;){if(/[*?{}()[\\]]/.test(t[e]))return!0;if(t[e]===\"\\\\\"){var r=t[e+1];e+=2;var o=Rne[r];if(o){var a=t.indexOf(o,e);a!==-1&&(e=a+1)}if(t[e]===\"!\")return!0}else e++}return!1};Tne.exports=function(e,r){if(typeof e!=\"string\"||e===\"\")return!1;if(JZe(e))return!0;var o=XZe;return r&&r.strict===!1&&(o=ZZe),o(e)}});var Mne=_((LTt,Lne)=>{\"use strict\";var $Ze=Nne(),e$e=ve(\"path\").posix.dirname,t$e=ve(\"os\").platform()===\"win32\",vL=\"/\",r$e=/\\\\/g,n$e=/[\\{\\[].*[\\}\\]]$/,i$e=/(^|[^\\\\])([\\{\\[]|\\([^\\)]+$)/,s$e=/\\\\([\\!\\*\\?\\|\\[\\]\\(\\)\\{\\}])/g;Lne.exports=function(e,r){var o=Object.assign({flipBackslashes:!0},r);o.flipBackslashes&&t$e&&e.indexOf(vL)<0&&(e=e.replace(r$e,vL)),n$e.test(e)&&(e+=vL),e+=\"a\";do e=e$e(e);while($Ze(e)||i$e.test(e));return e.replace(s$e,\"$1\")}});var Yne=_(Nr=>{\"use strict\";Object.defineProperty(Nr,\"__esModule\",{value:!0});Nr.removeDuplicateSlashes=Nr.matchAny=Nr.convertPatternsToRe=Nr.makeRe=Nr.getPatternParts=Nr.expandBraceExpansion=Nr.expandPatternsWithBraceExpansion=Nr.isAffectDepthOfReadingPattern=Nr.endsWithSlashGlobStar=Nr.hasGlobStar=Nr.getBaseDirectory=Nr.isPatternRelatedToParentDirectory=Nr.getPatternsOutsideCurrentDirectory=Nr.getPatternsInsideCurrentDirectory=Nr.getPositivePatterns=Nr.getNegativePatterns=Nr.isPositivePattern=Nr.isNegativePattern=Nr.convertToNegativePattern=Nr.convertToPositivePattern=Nr.isDynamicPattern=Nr.isStaticPattern=void 0;var o$e=ve(\"path\"),a$e=Mne(),DL=$o(),One=\"**\",l$e=\"\\\\\",c$e=/[*?]|^!/,u$e=/\\[[^[]*]/,A$e=/(?:^|[^!*+?@])\\([^(]*\\|[^|]*\\)/,f$e=/[!*+?@]\\([^(]*\\)/,p$e=/,|\\.\\./,h$e=/(?!^)\\/{2,}/g;function Une(t,e={}){return!_ne(t,e)}Nr.isStaticPattern=Une;function _ne(t,e={}){return t===\"\"?!1:!!(e.caseSensitiveMatch===!1||t.includes(l$e)||c$e.test(t)||u$e.test(t)||A$e.test(t)||e.extglob!==!1&&f$e.test(t)||e.braceExpansion!==!1&&g$e(t))}Nr.isDynamicPattern=_ne;function g$e(t){let e=t.indexOf(\"{\");if(e===-1)return!1;let r=t.indexOf(\"}\",e+1);if(r===-1)return!1;let o=t.slice(e,r);return p$e.test(o)}function d$e(t){return $P(t)?t.slice(1):t}Nr.convertToPositivePattern=d$e;function m$e(t){return\"!\"+t}Nr.convertToNegativePattern=m$e;function $P(t){return t.startsWith(\"!\")&&t[1]!==\"(\"}Nr.isNegativePattern=$P;function Hne(t){return!$P(t)}Nr.isPositivePattern=Hne;function y$e(t){return t.filter($P)}Nr.getNegativePatterns=y$e;function E$e(t){return t.filter(Hne)}Nr.getPositivePatterns=E$e;function C$e(t){return t.filter(e=>!PL(e))}Nr.getPatternsInsideCurrentDirectory=C$e;function w$e(t){return t.filter(PL)}Nr.getPatternsOutsideCurrentDirectory=w$e;function PL(t){return t.startsWith(\"..\")||t.startsWith(\"./..\")}Nr.isPatternRelatedToParentDirectory=PL;function I$e(t){return a$e(t,{flipBackslashes:!1})}Nr.getBaseDirectory=I$e;function B$e(t){return t.includes(One)}Nr.hasGlobStar=B$e;function qne(t){return t.endsWith(\"/\"+One)}Nr.endsWithSlashGlobStar=qne;function v$e(t){let e=o$e.basename(t);return qne(t)||Une(e)}Nr.isAffectDepthOfReadingPattern=v$e;function D$e(t){return t.reduce((e,r)=>e.concat(jne(r)),[])}Nr.expandPatternsWithBraceExpansion=D$e;function jne(t){let e=DL.braces(t,{expand:!0,nodupes:!0,keepEscaping:!0});return e.sort((r,o)=>r.length-o.length),e.filter(r=>r!==\"\")}Nr.expandBraceExpansion=jne;function P$e(t,e){let{parts:r}=DL.scan(t,Object.assign(Object.assign({},e),{parts:!0}));return r.length===0&&(r=[t]),r[0].startsWith(\"/\")&&(r[0]=r[0].slice(1),r.unshift(\"\")),r}Nr.getPatternParts=P$e;function Gne(t,e){return DL.makeRe(t,e)}Nr.makeRe=Gne;function b$e(t,e){return t.map(r=>Gne(r,e))}Nr.convertPatternsToRe=b$e;function S$e(t,e){return e.some(r=>r.test(t))}Nr.matchAny=S$e;function x$e(t){return t.replace(h$e,\"/\")}Nr.removeDuplicateSlashes=x$e});var zne=_((OTt,Vne)=>{\"use strict\";var k$e=ve(\"stream\"),Wne=k$e.PassThrough,Q$e=Array.prototype.slice;Vne.exports=F$e;function F$e(){let t=[],e=Q$e.call(arguments),r=!1,o=e[e.length-1];o&&!Array.isArray(o)&&o.pipe==null?e.pop():o={};let a=o.end!==!1,n=o.pipeError===!0;o.objectMode==null&&(o.objectMode=!0),o.highWaterMark==null&&(o.highWaterMark=64*1024);let u=Wne(o);function A(){for(let E=0,I=arguments.length;E<I;E++)t.push(Kne(arguments[E],o));return p(),this}function p(){if(r)return;r=!0;let E=t.shift();if(!E){process.nextTick(h);return}Array.isArray(E)||(E=[E]);let I=E.length+1;function v(){--I>0||(r=!1,p())}function x(C){function R(){C.removeListener(\"merge2UnpipeEnd\",R),C.removeListener(\"end\",R),n&&C.removeListener(\"error\",L),v()}function L(U){u.emit(\"error\",U)}if(C._readableState.endEmitted)return v();C.on(\"merge2UnpipeEnd\",R),C.on(\"end\",R),n&&C.on(\"error\",L),C.pipe(u,{end:!1}),C.resume()}for(let C=0;C<E.length;C++)x(E[C]);v()}function h(){r=!1,u.emit(\"queueDrain\"),a&&u.end()}return u.setMaxListeners(0),u.add=A,u.on(\"unpipe\",function(E){E.emit(\"merge2UnpipeEnd\")}),e.length&&A.apply(null,e),u}function Kne(t,e){if(Array.isArray(t))for(let r=0,o=t.length;r<o;r++)t[r]=Kne(t[r],e);else{if(!t._readableState&&t.pipe&&(t=t.pipe(Wne(e))),!t._readableState||!t.pause||!t.pipe)throw new Error(\"Only readable stream can be merged.\");t.pause()}return t}});var Xne=_(eb=>{\"use strict\";Object.defineProperty(eb,\"__esModule\",{value:!0});eb.merge=void 0;var R$e=zne();function T$e(t){let e=R$e(t);return t.forEach(r=>{r.once(\"error\",o=>e.emit(\"error\",o))}),e.once(\"close\",()=>Jne(t)),e.once(\"end\",()=>Jne(t)),e}eb.merge=T$e;function Jne(t){t.forEach(e=>e.emit(\"close\"))}});var Zne=_(Lm=>{\"use strict\";Object.defineProperty(Lm,\"__esModule\",{value:!0});Lm.isEmpty=Lm.isString=void 0;function N$e(t){return typeof t==\"string\"}Lm.isString=N$e;function L$e(t){return t===\"\"}Lm.isEmpty=L$e});var Df=_(xo=>{\"use strict\";Object.defineProperty(xo,\"__esModule\",{value:!0});xo.string=xo.stream=xo.pattern=xo.path=xo.fs=xo.errno=xo.array=void 0;var M$e=vne();xo.array=M$e;var O$e=Dne();xo.errno=O$e;var U$e=Pne();xo.fs=U$e;var _$e=kne();xo.path=_$e;var H$e=Yne();xo.pattern=H$e;var q$e=Xne();xo.stream=q$e;var j$e=Zne();xo.string=j$e});var rie=_(ko=>{\"use strict\";Object.defineProperty(ko,\"__esModule\",{value:!0});ko.convertPatternGroupToTask=ko.convertPatternGroupsToTasks=ko.groupPatternsByBaseDirectory=ko.getNegativePatternsAsPositive=ko.getPositivePatterns=ko.convertPatternsToTasks=ko.generate=void 0;var qc=Df();function G$e(t,e){let r=$ne(t,e),o=$ne(e.ignore,e),a=eie(r),n=tie(r,o),u=a.filter(E=>qc.pattern.isStaticPattern(E,e)),A=a.filter(E=>qc.pattern.isDynamicPattern(E,e)),p=bL(u,n,!1),h=bL(A,n,!0);return p.concat(h)}ko.generate=G$e;function $ne(t,e){let r=t;return e.braceExpansion&&(r=qc.pattern.expandPatternsWithBraceExpansion(r)),e.baseNameMatch&&(r=r.map(o=>o.includes(\"/\")?o:`**/${o}`)),r.map(o=>qc.pattern.removeDuplicateSlashes(o))}function bL(t,e,r){let o=[],a=qc.pattern.getPatternsOutsideCurrentDirectory(t),n=qc.pattern.getPatternsInsideCurrentDirectory(t),u=SL(a),A=SL(n);return o.push(...xL(u,e,r)),\".\"in A?o.push(kL(\".\",n,e,r)):o.push(...xL(A,e,r)),o}ko.convertPatternsToTasks=bL;function eie(t){return qc.pattern.getPositivePatterns(t)}ko.getPositivePatterns=eie;function tie(t,e){return qc.pattern.getNegativePatterns(t).concat(e).map(qc.pattern.convertToPositivePattern)}ko.getNegativePatternsAsPositive=tie;function SL(t){let e={};return t.reduce((r,o)=>{let a=qc.pattern.getBaseDirectory(o);return a in r?r[a].push(o):r[a]=[o],r},e)}ko.groupPatternsByBaseDirectory=SL;function xL(t,e,r){return Object.keys(t).map(o=>kL(o,t[o],e,r))}ko.convertPatternGroupsToTasks=xL;function kL(t,e,r,o){return{dynamic:o,positive:e,negative:r,base:t,patterns:[].concat(e,r.map(qc.pattern.convertToNegativePattern))}}ko.convertPatternGroupToTask=kL});var iie=_(tb=>{\"use strict\";Object.defineProperty(tb,\"__esModule\",{value:!0});tb.read=void 0;function Y$e(t,e,r){e.fs.lstat(t,(o,a)=>{if(o!==null){nie(r,o);return}if(!a.isSymbolicLink()||!e.followSymbolicLink){QL(r,a);return}e.fs.stat(t,(n,u)=>{if(n!==null){if(e.throwErrorOnBrokenSymbolicLink){nie(r,n);return}QL(r,a);return}e.markSymbolicLink&&(u.isSymbolicLink=()=>!0),QL(r,u)})})}tb.read=Y$e;function nie(t,e){t(e)}function QL(t,e){t(null,e)}});var sie=_(rb=>{\"use strict\";Object.defineProperty(rb,\"__esModule\",{value:!0});rb.read=void 0;function W$e(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.followSymbolicLink)return r;try{let o=e.fs.statSync(t);return e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),o}catch(o){if(!e.throwErrorOnBrokenSymbolicLink)return r;throw o}}rb.read=W$e});var oie=_(Jp=>{\"use strict\";Object.defineProperty(Jp,\"__esModule\",{value:!0});Jp.createFileSystemAdapter=Jp.FILE_SYSTEM_ADAPTER=void 0;var nb=ve(\"fs\");Jp.FILE_SYSTEM_ADAPTER={lstat:nb.lstat,stat:nb.stat,lstatSync:nb.lstatSync,statSync:nb.statSync};function K$e(t){return t===void 0?Jp.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},Jp.FILE_SYSTEM_ADAPTER),t)}Jp.createFileSystemAdapter=K$e});var aie=_(RL=>{\"use strict\";Object.defineProperty(RL,\"__esModule\",{value:!0});var V$e=oie(),FL=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=V$e.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,r){return e??r}};RL.default=FL});var hg=_(Xp=>{\"use strict\";Object.defineProperty(Xp,\"__esModule\",{value:!0});Xp.statSync=Xp.stat=Xp.Settings=void 0;var lie=iie(),z$e=sie(),TL=aie();Xp.Settings=TL.default;function J$e(t,e,r){if(typeof e==\"function\"){lie.read(t,NL(),e);return}lie.read(t,NL(e),r)}Xp.stat=J$e;function X$e(t,e){let r=NL(e);return z$e.read(t,r)}Xp.statSync=X$e;function NL(t={}){return t instanceof TL.default?t:new TL.default(t)}});var Aie=_((VTt,uie)=>{var cie;uie.exports=typeof queueMicrotask==\"function\"?queueMicrotask.bind(typeof window<\"u\"?window:global):t=>(cie||(cie=Promise.resolve())).then(t).catch(e=>setTimeout(()=>{throw e},0))});var pie=_((zTt,fie)=>{fie.exports=$$e;var Z$e=Aie();function $$e(t,e){let r,o,a,n=!0;Array.isArray(t)?(r=[],o=t.length):(a=Object.keys(t),r={},o=a.length);function u(p){function h(){e&&e(p,r),e=null}n?Z$e(h):h()}function A(p,h,E){r[p]=E,(--o===0||h)&&u(h)}o?a?a.forEach(function(p){t[p](function(h,E){A(p,h,E)})}):t.forEach(function(p,h){p(function(E,I){A(h,E,I)})}):u(null),n=!1}});var LL=_(sb=>{\"use strict\";Object.defineProperty(sb,\"__esModule\",{value:!0});sb.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var ib=process.versions.node.split(\".\");if(ib[0]===void 0||ib[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var hie=Number.parseInt(ib[0],10),eet=Number.parseInt(ib[1],10),gie=10,tet=10,ret=hie>gie,net=hie===gie&&eet>=tet;sb.IS_SUPPORT_READDIR_WITH_FILE_TYPES=ret||net});var die=_(ob=>{\"use strict\";Object.defineProperty(ob,\"__esModule\",{value:!0});ob.createDirentFromStats=void 0;var ML=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function iet(t,e){return new ML(t,e)}ob.createDirentFromStats=iet});var OL=_(ab=>{\"use strict\";Object.defineProperty(ab,\"__esModule\",{value:!0});ab.fs=void 0;var set=die();ab.fs=set});var UL=_(lb=>{\"use strict\";Object.defineProperty(lb,\"__esModule\",{value:!0});lb.joinPathSegments=void 0;function oet(t,e,r){return t.endsWith(r)?t+e:t+r+e}lb.joinPathSegments=oet});var Iie=_(Zp=>{\"use strict\";Object.defineProperty(Zp,\"__esModule\",{value:!0});Zp.readdir=Zp.readdirWithFileTypes=Zp.read=void 0;var aet=hg(),mie=pie(),cet=LL(),yie=OL(),Eie=UL();function uet(t,e,r){if(!e.stats&&cet.IS_SUPPORT_READDIR_WITH_FILE_TYPES){Cie(t,e,r);return}wie(t,e,r)}Zp.read=uet;function Cie(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(o,a)=>{if(o!==null){ub(r,o);return}let n=a.map(A=>({dirent:A,name:A.name,path:Eie.joinPathSegments(t,A.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){_L(r,n);return}let u=n.map(A=>Aet(A,e));mie(u,(A,p)=>{if(A!==null){ub(r,A);return}_L(r,p)})})}Zp.readdirWithFileTypes=Cie;function Aet(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);return}e.fs.stat(t.path,(o,a)=>{if(o!==null){if(e.throwErrorOnBrokenSymbolicLink){r(o);return}r(null,t);return}t.dirent=yie.fs.createDirentFromStats(t.name,a),r(null,t)})}}function wie(t,e,r){e.fs.readdir(t,(o,a)=>{if(o!==null){ub(r,o);return}let n=a.map(u=>{let A=Eie.joinPathSegments(t,u,e.pathSegmentSeparator);return p=>{aet.stat(A,e.fsStatSettings,(h,E)=>{if(h!==null){p(h);return}let I={name:u,path:A,dirent:yie.fs.createDirentFromStats(u,E)};e.stats&&(I.stats=E),p(null,I)})}});mie(n,(u,A)=>{if(u!==null){ub(r,u);return}_L(r,A)})})}Zp.readdir=wie;function ub(t,e){t(e)}function _L(t,e){t(null,e)}});var bie=_($p=>{\"use strict\";Object.defineProperty($p,\"__esModule\",{value:!0});$p.readdir=$p.readdirWithFileTypes=$p.read=void 0;var fet=hg(),pet=LL(),Bie=OL(),vie=UL();function het(t,e){return!e.stats&&pet.IS_SUPPORT_READDIR_WITH_FILE_TYPES?Die(t,e):Pie(t,e)}$p.read=het;function Die(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(o=>{let a={dirent:o,name:o.name,path:vie.joinPathSegments(t,o.name,e.pathSegmentSeparator)};if(a.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let n=e.fs.statSync(a.path);a.dirent=Bie.fs.createDirentFromStats(a.name,n)}catch(n){if(e.throwErrorOnBrokenSymbolicLink)throw n}return a})}$p.readdirWithFileTypes=Die;function Pie(t,e){return e.fs.readdirSync(t).map(o=>{let a=vie.joinPathSegments(t,o,e.pathSegmentSeparator),n=fet.statSync(a,e.fsStatSettings),u={name:o,path:a,dirent:Bie.fs.createDirentFromStats(o,n)};return e.stats&&(u.stats=n),u})}$p.readdir=Pie});var Sie=_(eh=>{\"use strict\";Object.defineProperty(eh,\"__esModule\",{value:!0});eh.createFileSystemAdapter=eh.FILE_SYSTEM_ADAPTER=void 0;var Mm=ve(\"fs\");eh.FILE_SYSTEM_ADAPTER={lstat:Mm.lstat,stat:Mm.stat,lstatSync:Mm.lstatSync,statSync:Mm.statSync,readdir:Mm.readdir,readdirSync:Mm.readdirSync};function get(t){return t===void 0?eh.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},eh.FILE_SYSTEM_ADAPTER),t)}eh.createFileSystemAdapter=get});var xie=_(qL=>{\"use strict\";Object.defineProperty(qL,\"__esModule\",{value:!0});var det=ve(\"path\"),met=hg(),yet=Sie(),HL=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=yet.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,det.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new met.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};qL.default=HL});var Ab=_(th=>{\"use strict\";Object.defineProperty(th,\"__esModule\",{value:!0});th.Settings=th.scandirSync=th.scandir=void 0;var kie=Iie(),Eet=bie(),jL=xie();th.Settings=jL.default;function Cet(t,e,r){if(typeof e==\"function\"){kie.read(t,YL(),e);return}kie.read(t,YL(e),r)}th.scandir=Cet;function wet(t,e){let r=YL(e);return Eet.read(t,r)}th.scandirSync=wet;function YL(t={}){return t instanceof jL.default?t:new jL.default(t)}});var Fie=_((sNt,Qie)=>{\"use strict\";function Iet(t){var e=new t,r=e;function o(){var n=e;return n.next?e=n.next:(e=new t,r=e),n.next=null,n}function a(n){r.next=n,r=n}return{get:o,release:a}}Qie.exports=Iet});var Tie=_((oNt,WL)=>{\"use strict\";var Bet=Fie();function Rie(t,e,r){if(typeof t==\"function\"&&(r=e,e=t,t=null),!(r>=1))throw new Error(\"fastqueue concurrency must be equal to or greater than 1\");var o=Bet(vet),a=null,n=null,u=0,A=null,p={push:R,drain:Gl,saturated:Gl,pause:E,paused:!1,get concurrency(){return r},set concurrency(le){if(!(le>=1))throw new Error(\"fastqueue concurrency must be equal to or greater than 1\");if(r=le,!p.paused)for(;a&&u<r;)u++,U()},running:h,resume:x,idle:C,length:I,getQueue:v,unshift:L,empty:Gl,kill:z,killAndDrain:te,error:ae};return p;function h(){return u}function E(){p.paused=!0}function I(){for(var le=a,ce=0;le;)le=le.next,ce++;return ce}function v(){for(var le=a,ce=[];le;)ce.push(le.value),le=le.next;return ce}function x(){if(p.paused){if(p.paused=!1,a===null){u++,U();return}for(;a&&u<r;)u++,U()}}function C(){return u===0&&p.length()===0}function R(le,ce){var Ce=o.get();Ce.context=t,Ce.release=U,Ce.value=le,Ce.callback=ce||Gl,Ce.errorHandler=A,u>=r||p.paused?n?(n.next=Ce,n=Ce):(a=Ce,n=Ce,p.saturated()):(u++,e.call(t,Ce.value,Ce.worked))}function L(le,ce){var Ce=o.get();Ce.context=t,Ce.release=U,Ce.value=le,Ce.callback=ce||Gl,Ce.errorHandler=A,u>=r||p.paused?a?(Ce.next=a,a=Ce):(a=Ce,n=Ce,p.saturated()):(u++,e.call(t,Ce.value,Ce.worked))}function U(le){le&&o.release(le);var ce=a;ce&&u<=r?p.paused?u--:(n===a&&(n=null),a=ce.next,ce.next=null,e.call(t,ce.value,ce.worked),n===null&&p.empty()):--u===0&&p.drain()}function z(){a=null,n=null,p.drain=Gl}function te(){a=null,n=null,p.drain(),p.drain=Gl}function ae(le){A=le}}function Gl(){}function vet(){this.value=null,this.callback=Gl,this.next=null,this.release=Gl,this.context=null,this.errorHandler=null;var t=this;this.worked=function(r,o){var a=t.callback,n=t.errorHandler,u=t.value;t.value=null,t.callback=Gl,t.errorHandler&&n(r,u),a.call(t.context,r,o),t.release(t)}}function Det(t,e,r){typeof t==\"function\"&&(r=e,e=t,t=null);function o(E,I){e.call(this,E).then(function(v){I(null,v)},I)}var a=Rie(t,o,r),n=a.push,u=a.unshift;return a.push=A,a.unshift=p,a.drained=h,a;function A(E){var I=new Promise(function(v,x){n(E,function(C,R){if(C){x(C);return}v(R)})});return I.catch(Gl),I}function p(E){var I=new Promise(function(v,x){u(E,function(C,R){if(C){x(C);return}v(R)})});return I.catch(Gl),I}function h(){if(a.idle())return new Promise(function(v){v()});var E=a.drain,I=new Promise(function(v){a.drain=function(){E(),v()}});return I}}WL.exports=Rie;WL.exports.promise=Det});var fb=_(Zu=>{\"use strict\";Object.defineProperty(Zu,\"__esModule\",{value:!0});Zu.joinPathSegments=Zu.replacePathSegmentSeparator=Zu.isAppliedFilter=Zu.isFatalError=void 0;function Pet(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}Zu.isFatalError=Pet;function bet(t,e){return t===null||t(e)}Zu.isAppliedFilter=bet;function xet(t,e){return t.split(/[/\\\\]/).join(e)}Zu.replacePathSegmentSeparator=xet;function ket(t,e,r){return t===\"\"?e:t.endsWith(r)?t+e:t+r+e}Zu.joinPathSegments=ket});var zL=_(VL=>{\"use strict\";Object.defineProperty(VL,\"__esModule\",{value:!0});var Qet=fb(),KL=class{constructor(e,r){this._root=e,this._settings=r,this._root=Qet.replacePathSegmentSeparator(e,r.pathSegmentSeparator)}};VL.default=KL});var ZL=_(XL=>{\"use strict\";Object.defineProperty(XL,\"__esModule\",{value:!0});var Fet=ve(\"events\"),Ret=Ab(),Tet=Tie(),pb=fb(),Net=zL(),JL=class extends Net.default{constructor(e,r){super(e,r),this._settings=r,this._scandir=Ret.scandir,this._emitter=new Fet.EventEmitter,this._queue=Tet(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit(\"end\")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error(\"The reader is already destroyed\");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on(\"entry\",e)}onError(e){this._emitter.once(\"error\",e)}onEnd(e){this._emitter.once(\"end\",e)}_pushToQueue(e,r){let o={directory:e,base:r};this._queue.push(o,a=>{a!==null&&this._handleError(a)})}_worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,(o,a)=>{if(o!==null){r(o,void 0);return}for(let n of a)this._handleEntry(n,e.base);r(null,void 0)})}_handleError(e){this._isDestroyed||!pb.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit(\"error\",e))}_handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let o=e.path;r!==void 0&&(e.path=pb.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),pb.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&pb.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(o,r===void 0?void 0:e.path)}_emitEntry(e){this._emitter.emit(\"entry\",e)}};XL.default=JL});var Nie=_(eM=>{\"use strict\";Object.defineProperty(eM,\"__esModule\",{value:!0});var Let=ZL(),$L=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Let.default(this._root,this._settings),this._storage=[]}read(e){this._reader.onError(r=>{Met(e,r)}),this._reader.onEntry(r=>{this._storage.push(r)}),this._reader.onEnd(()=>{Oet(e,this._storage)}),this._reader.read()}};eM.default=$L;function Met(t,e){t(e)}function Oet(t,e){t(null,e)}});var Lie=_(rM=>{\"use strict\";Object.defineProperty(rM,\"__esModule\",{value:!0});var Uet=ve(\"stream\"),_et=ZL(),tM=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new _et.default(this._root,this._settings),this._stream=new Uet.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit(\"error\",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};rM.default=tM});var Mie=_(iM=>{\"use strict\";Object.defineProperty(iM,\"__esModule\",{value:!0});var Het=Ab(),hb=fb(),qet=zL(),nM=class extends qet.default{constructor(){super(...arguments),this._scandir=Het.scandirSync,this._storage=[],this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),this._storage}_pushToQueue(e,r){this._queue.add({directory:e,base:r})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,r){try{let o=this._scandir(e,this._settings.fsScandirSettings);for(let a of o)this._handleEntry(a,r)}catch(o){this._handleError(o)}}_handleError(e){if(hb.isFatalError(this._settings,e))throw e}_handleEntry(e,r){let o=e.path;r!==void 0&&(e.path=hb.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),hb.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&hb.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(o,r===void 0?void 0:e.path)}_pushToStorage(e){this._storage.push(e)}};iM.default=nM});var Oie=_(oM=>{\"use strict\";Object.defineProperty(oM,\"__esModule\",{value:!0});var jet=Mie(),sM=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new jet.default(this._root,this._settings)}read(){return this._reader.read()}};oM.default=sM});var Uie=_(lM=>{\"use strict\";Object.defineProperty(lM,\"__esModule\",{value:!0});var Get=ve(\"path\"),Yet=Ab(),aM=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,Get.sep),this.fsScandirSettings=new Yet.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};lM.default=aM});var db=_($u=>{\"use strict\";Object.defineProperty($u,\"__esModule\",{value:!0});$u.Settings=$u.walkStream=$u.walkSync=$u.walk=void 0;var _ie=Nie(),Wet=Lie(),Ket=Oie(),cM=Uie();$u.Settings=cM.default;function Vet(t,e,r){if(typeof e==\"function\"){new _ie.default(t,gb()).read(e);return}new _ie.default(t,gb(e)).read(r)}$u.walk=Vet;function zet(t,e){let r=gb(e);return new Ket.default(t,r).read()}$u.walkSync=zet;function Jet(t,e){let r=gb(e);return new Wet.default(t,r).read()}$u.walkStream=Jet;function gb(t={}){return t instanceof cM.default?t:new cM.default(t)}});var mb=_(AM=>{\"use strict\";Object.defineProperty(AM,\"__esModule\",{value:!0});var Xet=ve(\"path\"),Zet=hg(),Hie=Df(),uM=class{constructor(e){this._settings=e,this._fsStatSettings=new Zet.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return Xet.resolve(this._settings.cwd,e)}_makeEntry(e,r){let o={name:r,path:r,dirent:Hie.fs.createDirentFromStats(r,e)};return this._settings.stats&&(o.stats=e),o}_isFatalError(e){return!Hie.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};AM.default=uM});var hM=_(pM=>{\"use strict\";Object.defineProperty(pM,\"__esModule\",{value:!0});var $et=ve(\"stream\"),ett=hg(),ttt=db(),rtt=mb(),fM=class extends rtt.default{constructor(){super(...arguments),this._walkStream=ttt.walkStream,this._stat=ett.stat}dynamic(e,r){return this._walkStream(e,r)}static(e,r){let o=e.map(this._getFullEntryPath,this),a=new $et.PassThrough({objectMode:!0});a._write=(n,u,A)=>this._getEntry(o[n],e[n],r).then(p=>{p!==null&&r.entryFilter(p)&&a.push(p),n===o.length-1&&a.end(),A()}).catch(A);for(let n=0;n<o.length;n++)a.write(n);return a}_getEntry(e,r,o){return this._getStat(e).then(a=>this._makeEntry(a,r)).catch(a=>{if(o.errorFilter(a))return null;throw a})}_getStat(e){return new Promise((r,o)=>{this._stat(e,this._fsStatSettings,(a,n)=>a===null?r(n):o(a))})}};pM.default=fM});var qie=_(dM=>{\"use strict\";Object.defineProperty(dM,\"__esModule\",{value:!0});var ntt=db(),itt=mb(),stt=hM(),gM=class extends itt.default{constructor(){super(...arguments),this._walkAsync=ntt.walk,this._readerStream=new stt.default(this._settings)}dynamic(e,r){return new Promise((o,a)=>{this._walkAsync(e,r,(n,u)=>{n===null?o(u):a(n)})})}async static(e,r){let o=[],a=this._readerStream.static(e,r);return new Promise((n,u)=>{a.once(\"error\",u),a.on(\"data\",A=>o.push(A)),a.once(\"end\",()=>n(o))})}};dM.default=gM});var jie=_(yM=>{\"use strict\";Object.defineProperty(yM,\"__esModule\",{value:!0});var LI=Df(),mM=class{constructor(e,r,o){this._patterns=e,this._settings=r,this._micromatchOptions=o,this._storage=[],this._fillStorage()}_fillStorage(){for(let e of this._patterns){let r=this._getPatternSegments(e),o=this._splitSegmentsIntoSections(r);this._storage.push({complete:o.length<=1,pattern:e,segments:r,sections:o})}}_getPatternSegments(e){return LI.pattern.getPatternParts(e,this._micromatchOptions).map(o=>LI.pattern.isDynamicPattern(o,this._settings)?{dynamic:!0,pattern:o,patternRe:LI.pattern.makeRe(o,this._micromatchOptions)}:{dynamic:!1,pattern:o})}_splitSegmentsIntoSections(e){return LI.array.splitWhen(e,r=>r.dynamic&&LI.pattern.hasGlobStar(r.pattern))}};yM.default=mM});var Gie=_(CM=>{\"use strict\";Object.defineProperty(CM,\"__esModule\",{value:!0});var ott=jie(),EM=class extends ott.default{match(e){let r=e.split(\"/\"),o=r.length,a=this._storage.filter(n=>!n.complete||n.segments.length>o);for(let n of a){let u=n.sections[0];if(!n.complete&&o>u.length||r.every((p,h)=>{let E=n.segments[h];return!!(E.dynamic&&E.patternRe.test(p)||!E.dynamic&&E.pattern===p)}))return!0}return!1}};CM.default=EM});var Yie=_(IM=>{\"use strict\";Object.defineProperty(IM,\"__esModule\",{value:!0});var yb=Df(),att=Gie(),wM=class{constructor(e,r){this._settings=e,this._micromatchOptions=r}getFilter(e,r,o){let a=this._getMatcher(r),n=this._getNegativePatternsRe(o);return u=>this._filter(e,u,a,n)}_getMatcher(e){return new att.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let r=e.filter(yb.pattern.isAffectDepthOfReadingPattern);return yb.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(e,r,o,a){if(this._isSkippedByDeep(e,r.path)||this._isSkippedSymbolicLink(r))return!1;let n=yb.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(n,o)?!1:this._isSkippedByNegativePatterns(n,a)}_isSkippedByDeep(e,r){return this._settings.deep===1/0?!1:this._getEntryLevel(e,r)>=this._settings.deep}_getEntryLevel(e,r){let o=r.split(\"/\").length;if(e===\"\")return o;let a=e.split(\"/\").length;return o-a}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!r.match(e)}_isSkippedByNegativePatterns(e,r){return!yb.pattern.matchAny(e,r)}};IM.default=wM});var Wie=_(vM=>{\"use strict\";Object.defineProperty(vM,\"__esModule\",{value:!0});var gg=Df(),BM=class{constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=new Map}getFilter(e,r){let o=gg.pattern.convertPatternsToRe(e,this._micromatchOptions),a=gg.pattern.convertPatternsToRe(r,Object.assign(Object.assign({},this._micromatchOptions),{dot:!0}));return n=>this._filter(n,o,a)}_filter(e,r,o){let a=gg.path.removeLeadingDotSegment(e.path);if(this._settings.unique&&this._isDuplicateEntry(a)||this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(a,o))return!1;let n=e.dirent.isDirectory(),u=this._isMatchToPatterns(a,r,n)&&!this._isMatchToPatterns(a,o,n);return this._settings.unique&&u&&this._createIndexRecord(a),u}_isDuplicateEntry(e){return this.index.has(e)}_createIndexRecord(e){this.index.set(e,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,r){if(!this._settings.absolute)return!1;let o=gg.path.makeAbsolute(this._settings.cwd,e);return gg.pattern.matchAny(o,r)}_isMatchToPatterns(e,r,o){let a=gg.pattern.matchAny(e,r);return!a&&o?gg.pattern.matchAny(e+\"/\",r):a}};vM.default=BM});var Kie=_(PM=>{\"use strict\";Object.defineProperty(PM,\"__esModule\",{value:!0});var ltt=Df(),DM=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return ltt.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};PM.default=DM});var zie=_(SM=>{\"use strict\";Object.defineProperty(SM,\"__esModule\",{value:!0});var Vie=Df(),bM=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let r=e.path;return this._settings.absolute&&(r=Vie.path.makeAbsolute(this._settings.cwd,r),r=Vie.path.unixify(r)),this._settings.markDirectories&&e.dirent.isDirectory()&&(r+=\"/\"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:r}):r}};SM.default=bM});var Eb=_(kM=>{\"use strict\";Object.defineProperty(kM,\"__esModule\",{value:!0});var ctt=ve(\"path\"),utt=Yie(),Att=Wie(),ftt=Kie(),ptt=zie(),xM=class{constructor(e){this._settings=e,this.errorFilter=new ftt.default(this._settings),this.entryFilter=new Att.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new utt.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new ptt.default(this._settings)}_getRootDirectory(e){return ctt.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let r=e.base===\".\"?\"\":e.base;return{basePath:r,pathSegmentSeparator:\"/\",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};kM.default=xM});var Jie=_(FM=>{\"use strict\";Object.defineProperty(FM,\"__esModule\",{value:!0});var htt=qie(),gtt=Eb(),QM=class extends gtt.default{constructor(){super(...arguments),this._reader=new htt.default(this._settings)}async read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);return(await this.api(r,e,o)).map(n=>o.transform(n))}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};FM.default=QM});var Xie=_(TM=>{\"use strict\";Object.defineProperty(TM,\"__esModule\",{value:!0});var dtt=ve(\"stream\"),mtt=hM(),ytt=Eb(),RM=class extends ytt.default{constructor(){super(...arguments),this._reader=new mtt.default(this._settings)}read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e),a=this.api(r,e,o),n=new dtt.Readable({objectMode:!0,read:()=>{}});return a.once(\"error\",u=>n.emit(\"error\",u)).on(\"data\",u=>n.emit(\"data\",o.transform(u))).once(\"end\",()=>n.emit(\"end\")),n.once(\"close\",()=>a.destroy()),n}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};TM.default=RM});var Zie=_(LM=>{\"use strict\";Object.defineProperty(LM,\"__esModule\",{value:!0});var Ett=hg(),Ctt=db(),wtt=mb(),NM=class extends wtt.default{constructor(){super(...arguments),this._walkSync=Ctt.walkSync,this._statSync=Ett.statSync}dynamic(e,r){return this._walkSync(e,r)}static(e,r){let o=[];for(let a of e){let n=this._getFullEntryPath(a),u=this._getEntry(n,a,r);u===null||!r.entryFilter(u)||o.push(u)}return o}_getEntry(e,r,o){try{let a=this._getStat(e);return this._makeEntry(a,r)}catch(a){if(o.errorFilter(a))return null;throw a}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};LM.default=NM});var $ie=_(OM=>{\"use strict\";Object.defineProperty(OM,\"__esModule\",{value:!0});var Itt=Zie(),Btt=Eb(),MM=class extends Btt.default{constructor(){super(...arguments),this._reader=new Itt.default(this._settings)}read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);return this.api(r,e,o).map(o.transform)}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};OM.default=MM});var ese=_(Um=>{\"use strict\";Object.defineProperty(Um,\"__esModule\",{value:!0});Um.DEFAULT_FILE_SYSTEM_ADAPTER=void 0;var Om=ve(\"fs\"),vtt=ve(\"os\"),Dtt=Math.max(vtt.cpus().length,1);Um.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:Om.lstat,lstatSync:Om.lstatSync,stat:Om.stat,statSync:Om.statSync,readdir:Om.readdir,readdirSync:Om.readdirSync};var UM=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,Dtt),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,1/0),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0),this.ignore=[].concat(this.ignore)}_getValue(e,r){return e===void 0?r:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},Um.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};Um.default=UM});var Cb=_((QNt,rse)=>{\"use strict\";var tse=rie(),Ptt=Jie(),btt=Xie(),Stt=$ie(),_M=ese(),Yl=Df();async function HM(t,e){jc(t);let r=qM(t,Ptt.default,e),o=await Promise.all(r);return Yl.array.flatten(o)}(function(t){t.glob=t,t.globSync=e,t.globStream=r,t.async=t;function e(h,E){jc(h);let I=qM(h,Stt.default,E);return Yl.array.flatten(I)}t.sync=e;function r(h,E){jc(h);let I=qM(h,btt.default,E);return Yl.stream.merge(I)}t.stream=r;function o(h,E){jc(h);let I=[].concat(h),v=new _M.default(E);return tse.generate(I,v)}t.generateTasks=o;function a(h,E){jc(h);let I=new _M.default(E);return Yl.pattern.isDynamicPattern(h,I)}t.isDynamicPattern=a;function n(h){return jc(h),Yl.path.escape(h)}t.escapePath=n;function u(h){return jc(h),Yl.path.convertPathToPattern(h)}t.convertPathToPattern=u;let A;(function(h){function E(v){return jc(v),Yl.path.escapePosixPath(v)}h.escapePath=E;function I(v){return jc(v),Yl.path.convertPosixPathToPattern(v)}h.convertPathToPattern=I})(A=t.posix||(t.posix={}));let p;(function(h){function E(v){return jc(v),Yl.path.escapeWindowsPath(v)}h.escapePath=E;function I(v){return jc(v),Yl.path.convertWindowsPathToPattern(v)}h.convertPathToPattern=I})(p=t.win32||(t.win32={}))})(HM||(HM={}));function qM(t,e,r){let o=[].concat(t),a=new _M.default(r),n=tse.generate(o,a),u=new e(a);return n.map(u.read,u)}function jc(t){if(![].concat(t).every(o=>Yl.string.isString(o)&&!Yl.string.isEmpty(o)))throw new TypeError(\"Patterns must be a string (non empty) or an array of strings\")}rse.exports=HM});var wn={};Vt(wn,{checksumFile:()=>Ib,checksumPattern:()=>Bb,makeHash:()=>zi});function zi(...t){let e=(0,wb.createHash)(\"sha512\"),r=\"\";for(let o of t)typeof o==\"string\"?r+=o:o&&(r&&(e.update(r),r=\"\"),e.update(o));return r&&e.update(r),e.digest(\"hex\")}async function Ib(t,{baseFs:e,algorithm:r}={baseFs:oe,algorithm:\"sha512\"}){let o=await e.openPromise(t,\"r\");try{let n=Buffer.allocUnsafeSlow(65536),u=(0,wb.createHash)(r),A=0;for(;(A=await e.readPromise(o,n,0,65536))!==0;)u.update(A===65536?n:n.slice(0,A));return u.digest(\"hex\")}finally{await e.closePromise(o)}}async function Bb(t,{cwd:e}){let o=(await(0,jM.default)(t,{cwd:ue.fromPortablePath(e),onlyDirectories:!0})).map(A=>`${A}/**/*`),a=await(0,jM.default)([t,...o],{cwd:ue.fromPortablePath(e),onlyFiles:!1});a.sort();let n=await Promise.all(a.map(async A=>{let p=[Buffer.from(A)],h=V.join(e,ue.toPortablePath(A)),E=await oe.lstatPromise(h);return E.isSymbolicLink()?p.push(Buffer.from(await oe.readlinkPromise(h))):E.isFile()&&p.push(await oe.readFilePromise(h)),p.join(\"\\0\")})),u=(0,wb.createHash)(\"sha512\");for(let A of n)u.update(A);return u.digest(\"hex\")}var wb,jM,rh=Et(()=>{Pt();wb=ve(\"crypto\"),jM=Ze(Cb())});var G={};Vt(G,{allPeerRequests:()=>WI,areDescriptorsEqual:()=>ase,areIdentsEqual:()=>HI,areLocatorsEqual:()=>qI,areVirtualPackagesEquivalent:()=>Mtt,bindDescriptor:()=>Ntt,bindLocator:()=>Ltt,convertDescriptorToLocator:()=>vb,convertLocatorToDescriptor:()=>YM,convertPackageToLocator:()=>Ftt,convertToIdent:()=>Qtt,convertToManifestRange:()=>Ktt,copyPackage:()=>OI,devirtualizeDescriptor:()=>UI,devirtualizeLocator:()=>_I,ensureDevirtualizedDescriptor:()=>Rtt,ensureDevirtualizedLocator:()=>Ttt,getIdentVendorPath:()=>zM,isPackageCompatible:()=>xb,isVirtualDescriptor:()=>Pf,isVirtualLocator:()=>Gc,makeDescriptor:()=>In,makeIdent:()=>eA,makeLocator:()=>Rs,makeRange:()=>bb,parseDescriptor:()=>nh,parseFileStyleRange:()=>Ytt,parseIdent:()=>ea,parseLocator:()=>bf,parseRange:()=>dg,prettyDependent:()=>CL,prettyDescriptor:()=>jn,prettyIdent:()=>Oi,prettyLocator:()=>qr,prettyLocatorNoColors:()=>EL,prettyRange:()=>qm,prettyReference:()=>GI,prettyResolution:()=>NI,prettyWorkspace:()=>YI,renamePackage:()=>WM,slugifyIdent:()=>GM,slugifyLocator:()=>Hm,sortDescriptors:()=>jm,stringifyDescriptor:()=>xa,stringifyIdent:()=>rn,stringifyLocator:()=>ka,tryParseDescriptor:()=>jI,tryParseIdent:()=>lse,tryParseLocator:()=>Pb,tryParseRange:()=>Gtt,virtualizeDescriptor:()=>KM,virtualizePackage:()=>VM});function eA(t,e){if(t?.startsWith(\"@\"))throw new Error(\"Invalid scope: don't prefix it with '@'\");return{identHash:zi(t,e),scope:t,name:e}}function In(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:zi(t.identHash,e),range:e}}function Rs(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:zi(t.identHash,e),reference:e}}function Qtt(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}function vb(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.descriptorHash,reference:t.range}}function YM(t){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:t.locatorHash,range:t.reference}}function Ftt(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference}}function WM(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:t.version,languageName:t.languageName,linkType:t.linkType,conditions:t.conditions,dependencies:new Map(t.dependencies),peerDependencies:new Map(t.peerDependencies),dependenciesMeta:new Map(t.dependenciesMeta),peerDependenciesMeta:new Map(t.peerDependenciesMeta),bin:new Map(t.bin)}}function OI(t){return WM(t,t)}function KM(t,e){if(e.includes(\"#\"))throw new Error(\"Invalid entropy\");return In(t,`virtual:${e}#${t.range}`)}function VM(t,e){if(e.includes(\"#\"))throw new Error(\"Invalid entropy\");return WM(t,Rs(t,`virtual:${e}#${t.reference}`))}function Pf(t){return t.range.startsWith(MI)}function Gc(t){return t.reference.startsWith(MI)}function UI(t){if(!Pf(t))throw new Error(\"Not a virtual descriptor\");return In(t,t.range.replace(Db,\"\"))}function _I(t){if(!Gc(t))throw new Error(\"Not a virtual descriptor\");return Rs(t,t.reference.replace(Db,\"\"))}function Rtt(t){return Pf(t)?In(t,t.range.replace(Db,\"\")):t}function Ttt(t){return Gc(t)?Rs(t,t.reference.replace(Db,\"\")):t}function Ntt(t,e){return t.range.includes(\"::\")?t:In(t,`${t.range}::${_m.default.stringify(e)}`)}function Ltt(t,e){return t.reference.includes(\"::\")?t:Rs(t,`${t.reference}::${_m.default.stringify(e)}`)}function HI(t,e){return t.identHash===e.identHash}function ase(t,e){return t.descriptorHash===e.descriptorHash}function qI(t,e){return t.locatorHash===e.locatorHash}function Mtt(t,e){if(!Gc(t))throw new Error(\"Invalid package type\");if(!Gc(e))throw new Error(\"Invalid package type\");if(!HI(t,e)||t.dependencies.size!==e.dependencies.size)return!1;for(let r of t.dependencies.values()){let o=e.dependencies.get(r.identHash);if(!o||!ase(r,o))return!1}return!0}function ea(t){let e=lse(t);if(!e)throw new Error(`Invalid ident (${t})`);return e}function lse(t){let e=t.match(Ott);if(!e)return null;let[,r,o]=e;return eA(typeof r<\"u\"?r:null,o)}function nh(t,e=!1){let r=jI(t,e);if(!r)throw new Error(`Invalid descriptor (${t})`);return r}function jI(t,e=!1){let r=e?t.match(Utt):t.match(_tt);if(!r)return null;let[,o,a,n]=r;if(n===\"unknown\")throw new Error(`Invalid range (${t})`);let u=typeof o<\"u\"?o:null,A=typeof n<\"u\"?n:\"unknown\";return In(eA(u,a),A)}function bf(t,e=!1){let r=Pb(t,e);if(!r)throw new Error(`Invalid locator (${t})`);return r}function Pb(t,e=!1){let r=e?t.match(Htt):t.match(qtt);if(!r)return null;let[,o,a,n]=r;if(n===\"unknown\")throw new Error(`Invalid reference (${t})`);let u=typeof o<\"u\"?o:null,A=typeof n<\"u\"?n:\"unknown\";return Rs(eA(u,a),A)}function dg(t,e){let r=t.match(jtt);if(r===null)throw new Error(`Invalid range (${t})`);let o=typeof r[1]<\"u\"?r[1]:null;if(typeof e?.requireProtocol==\"string\"&&o!==e.requireProtocol)throw new Error(`Invalid protocol (${o})`);if(e?.requireProtocol&&o===null)throw new Error(`Missing protocol (${o})`);let a=typeof r[3]<\"u\"?decodeURIComponent(r[2]):null;if(e?.requireSource&&a===null)throw new Error(`Missing source (${t})`);let n=typeof r[3]<\"u\"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),u=e?.parseSelector?_m.default.parse(n):n,A=typeof r[4]<\"u\"?_m.default.parse(r[4]):null;return{protocol:o,source:a,selector:u,params:A}}function Gtt(t,e){try{return dg(t,e)}catch{return null}}function Ytt(t,{protocol:e}){let{selector:r,params:o}=dg(t,{requireProtocol:e,requireBindings:!0});if(typeof o.locator!=\"string\")throw new Error(`Assertion failed: Invalid bindings for ${t}`);return{parentLocator:bf(o.locator,!0),path:r}}function nse(t){return t=t.replaceAll(\"%\",\"%25\"),t=t.replaceAll(\":\",\"%3A\"),t=t.replaceAll(\"#\",\"%23\"),t}function Wtt(t){return t===null?!1:Object.entries(t).length>0}function bb({protocol:t,source:e,selector:r,params:o}){let a=\"\";return t!==null&&(a+=`${t}`),e!==null&&(a+=`${nse(e)}#`),a+=nse(r),Wtt(o)&&(a+=`::${_m.default.stringify(o)}`),a}function Ktt(t){let{params:e,protocol:r,source:o,selector:a}=dg(t);for(let n in e)n.startsWith(\"__\")&&delete e[n];return bb({protocol:r,source:o,params:e,selector:a})}function rn(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}function xa(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.name}@${t.range}`}function ka(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${t.name}@${t.reference}`}function GM(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}function Hm(t){let{protocol:e,selector:r}=dg(t.reference),o=e!==null?e.replace(Vtt,\"\"):\"exotic\",a=ise.default.valid(r),n=a!==null?`${o}-${a}`:`${o}`,u=10;return t.scope?`${GM(t)}-${n}-${t.locatorHash.slice(0,u)}`:`${GM(t)}-${n}-${t.locatorHash.slice(0,u)}`}function Oi(t,e){return e.scope?`${Ot(t,`@${e.scope}/`,yt.SCOPE)}${Ot(t,e.name,yt.NAME)}`:`${Ot(t,e.name,yt.NAME)}`}function Sb(t){if(t.startsWith(MI)){let e=Sb(t.substring(t.indexOf(\"#\")+1)),r=t.substring(MI.length,MI.length+xtt);return`${e} [${r}]`}else return t.replace(ztt,\"?[...]\")}function qm(t,e){return`${Ot(t,Sb(e),yt.RANGE)}`}function jn(t,e){return`${Oi(t,e)}${Ot(t,\"@\",yt.RANGE)}${qm(t,e.range)}`}function GI(t,e){return`${Ot(t,Sb(e),yt.REFERENCE)}`}function qr(t,e){return`${Oi(t,e)}${Ot(t,\"@\",yt.REFERENCE)}${GI(t,e.reference)}`}function EL(t){return`${rn(t)}@${Sb(t.reference)}`}function jm(t){return Fs(t,[e=>rn(e),e=>e.range])}function YI(t,e){return Oi(t,e.anchoredLocator)}function NI(t,e,r){let o=Pf(e)?UI(e):e;return r===null?`${jn(t,o)} \\u2192 ${yL(t).Cross}`:o.identHash===r.identHash?`${jn(t,o)} \\u2192 ${GI(t,r.reference)}`:`${jn(t,o)} \\u2192 ${qr(t,r)}`}function CL(t,e,r){return r===null?`${qr(t,e)}`:`${qr(t,e)} (via ${qm(t,r.range)})`}function zM(t){return`node_modules/${rn(t)}`}function xb(t,e){return t.conditions?ktt(t.conditions,r=>{let[,o,a]=r.match(ose),n=e[o];return n?n.includes(a):!0}):!0}function WI(t){let e=new Set;if(\"children\"in t)e.add(t);else for(let r of t.requests.values())e.add(r);for(let r of e)for(let o of r.children.values())e.add(o);return e}var _m,ise,sse,MI,xtt,ose,ktt,Db,Ott,Utt,_tt,Htt,qtt,jtt,Vtt,ztt,So=Et(()=>{_m=Ze(ve(\"querystring\")),ise=Ze(Jn()),sse=Ze(eX());jl();rh();ql();So();MI=\"virtual:\",xtt=5,ose=/(os|cpu|libc)=([a-z0-9_-]+)/,ktt=(0,sse.makeParser)(ose);Db=/^[^#]*#/;Ott=/^(?:@([^/]+?)\\/)?([^@/]+)$/;Utt=/^(?:@([^/]+?)\\/)?([^@/]+?)(?:@(.+))$/,_tt=/^(?:@([^/]+?)\\/)?([^@/]+?)(?:@(.+))?$/;Htt=/^(?:@([^/]+?)\\/)?([^@/]+?)(?:@(.+))$/,qtt=/^(?:@([^/]+?)\\/)?([^@/]+?)(?:@(.+))?$/;jtt=/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/;Vtt=/:$/;ztt=/\\?.*/});var cse,use=Et(()=>{So();cse={hooks:{reduceDependency:(t,e,r,o,{resolver:a,resolveOptions:n})=>{for(let{pattern:u,reference:A}of e.topLevelWorkspace.manifest.resolutions){if(u.from&&(u.from.fullName!==rn(r)||e.configuration.normalizeLocator(Rs(ea(u.from.fullName),u.from.description??r.reference)).locatorHash!==r.locatorHash)||u.descriptor.fullName!==rn(t)||e.configuration.normalizeDependency(In(bf(u.descriptor.fullName),u.descriptor.description??t.range)).descriptorHash!==t.descriptorHash)continue;return a.bindDescriptor(e.configuration.normalizeDependency(In(t,A)),e.topLevelWorkspace.anchoredLocator,n)}return t},validateProject:async(t,e)=>{for(let r of t.workspaces){let o=YI(t.configuration,r);await t.configuration.triggerHook(a=>a.validateWorkspace,r,{reportWarning:(a,n)=>e.reportWarning(a,`${o}: ${n}`),reportError:(a,n)=>e.reportError(a,`${o}: ${n}`)})}},validateWorkspace:async(t,e)=>{let{manifest:r}=t;r.resolutions.length&&t.cwd!==t.project.cwd&&r.errors.push(new Error(\"Resolutions field will be ignored\"));for(let o of r.errors)e.reportWarning(57,o.message)}}}});var ei,mg=Et(()=>{ei=class t{static{this.protocol=\"workspace:\"}supportsDescriptor(e,r){return!!(e.range.startsWith(t.protocol)||r.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,r){return!!e.reference.startsWith(t.protocol)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){return[o.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let o=r.project.getWorkspaceByCwd(e.reference.slice(t.protocol.length));return{...e,version:o.manifest.version||\"0.0.0\",languageName:\"unknown\",linkType:\"SOFT\",conditions:null,dependencies:r.project.configuration.normalizeDependencyMap(new Map([...o.manifest.dependencies,...o.manifest.devDependencies])),peerDependencies:new Map([...o.manifest.peerDependencies]),dependenciesMeta:o.manifest.dependenciesMeta,peerDependenciesMeta:o.manifest.peerDependenciesMeta,bin:o.manifest.bin}}}});var Lr={};Vt(Lr,{SemVer:()=>gse.SemVer,clean:()=>Xtt,getComparator:()=>pse,mergeComparators:()=>JM,satisfiesWithPrereleases:()=>tA,simplifyRanges:()=>XM,stringifyComparator:()=>hse,validRange:()=>Qa});function tA(t,e,r=!1){if(!t)return!1;let o=`${e}${r}`,a=Ase.get(o);if(typeof a>\"u\")try{a=new Sf.default.Range(e,{includePrerelease:!0,loose:r})}catch{return!1}finally{Ase.set(o,a||null)}else if(a===null)return!1;let n;try{n=new Sf.default.SemVer(t,a)}catch{return!1}return a.test(n)?!0:(n.prerelease&&(n.prerelease=[]),a.set.some(u=>{for(let A of u)A.semver.prerelease&&(A.semver.prerelease=[]);return u.every(A=>A.test(n))}))}function Qa(t){if(t.indexOf(\":\")!==-1)return null;let e=fse.get(t);if(typeof e<\"u\")return e;try{e=new Sf.default.Range(t)}catch{e=null}return fse.set(t,e),e}function Xtt(t){let e=Jtt.exec(t);return e?e[1]:null}function pse(t){if(t.semver===Sf.default.Comparator.ANY)return{gt:null,lt:null};switch(t.operator){case\"\":return{gt:[\">=\",t.semver],lt:[\"<=\",t.semver]};case\">\":case\">=\":return{gt:[t.operator,t.semver],lt:null};case\"<\":case\"<=\":return{gt:null,lt:[t.operator,t.semver]};default:throw new Error(`Assertion failed: Unexpected comparator operator (${t.operator})`)}}function JM(t){if(t.length===0)return null;let e=null,r=null;for(let o of t){if(o.gt){let a=e!==null?Sf.default.compare(o.gt[1],e[1]):null;(a===null||a>0||a===0&&o.gt[0]===\">\")&&(e=o.gt)}if(o.lt){let a=r!==null?Sf.default.compare(o.lt[1],r[1]):null;(a===null||a<0||a===0&&o.lt[0]===\"<\")&&(r=o.lt)}}if(e&&r){let o=Sf.default.compare(e[1],r[1]);if(o===0&&(e[0]===\">\"||r[0]===\"<\")||o>0)return null}return{gt:e,lt:r}}function hse(t){if(t.gt&&t.lt){if(t.gt[0]===\">=\"&&t.lt[0]===\"<=\"&&t.gt[1].version===t.lt[1].version)return t.gt[1].version;if(t.gt[0]===\">=\"&&t.lt[0]===\"<\"){if(t.lt[1].version===`${t.gt[1].major+1}.0.0-0`)return`^${t.gt[1].version}`;if(t.lt[1].version===`${t.gt[1].major}.${t.gt[1].minor+1}.0-0`)return`~${t.gt[1].version}`}}let e=[];return t.gt&&e.push(t.gt[0]+t.gt[1].version),t.lt&&e.push(t.lt[0]+t.lt[1].version),e.length?e.join(\" \"):\"*\"}function XM(t){let e=t.map(Ztt).map(o=>Qa(o).set.map(a=>a.map(n=>pse(n)))),r=e.shift().map(o=>JM(o)).filter(o=>o!==null);for(let o of e){let a=[];for(let n of r)for(let u of o){let A=JM([n,...u]);A!==null&&a.push(A)}r=a}return r.length===0?null:r.map(o=>hse(o)).join(\" || \")}function Ztt(t){let e=t.split(\"||\");if(e.length>1){let r=new Set;for(let o of e)e.some(a=>a!==o&&Sf.default.subset(o,a))||r.add(o);if(r.size<e.length)return[...r].join(\" || \")}return t}var Sf,gse,Ase,fse,Jtt,xf=Et(()=>{Sf=Ze(Jn()),gse=Ze(Jn()),Ase=new Map;fse=new Map;Jtt=/^(?:[\\sv=]*?)((0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?)(?:\\s*)$/});function dse(t){let e=t.match(/^[ \\t]+/m);return e?e[0]:\"  \"}function mse(t){return t.charCodeAt(0)===65279?t.slice(1):t}function ta(t){return t.replace(/\\\\/g,\"/\")}function kb(t,{yamlCompatibilityMode:e}){return e?AL(t):typeof t>\"u\"||typeof t==\"boolean\"?t:null}function yse(t,e){let r=e.search(/[^!]/);if(r===-1)return\"invalid\";let o=r%2===0?\"\":\"!\",a=e.slice(r);return`${o}${t}=${a}`}function ZM(t,e){return e.length===1?yse(t,e[0]):`(${e.map(r=>yse(t,r)).join(\" | \")})`}var Ese,Ut,Gm=Et(()=>{Pt();Nl();Ese=Ze(Jn());mg();ql();xf();So();Ut=class t{constructor(){this.indent=\"  \";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static{this.fileName=\"package.json\"}static{this.allDependencies=[\"dependencies\",\"devDependencies\",\"peerDependencies\"]}static{this.hardDependencies=[\"dependencies\",\"devDependencies\"]}static async tryFind(e,{baseFs:r=new Tn}={}){let o=V.join(e,\"package.json\");try{return await t.fromFile(o,{baseFs:r})}catch(a){if(a.code===\"ENOENT\")return null;throw a}}static async find(e,{baseFs:r}={}){let o=await t.tryFind(e,{baseFs:r});if(o===null)throw new Error(\"Manifest not found\");return o}static async fromFile(e,{baseFs:r=new Tn}={}){let o=new t;return await o.loadFile(e,{baseFs:r}),o}static fromText(e){let r=new t;return r.loadFromText(e),r}loadFromText(e){let r;try{r=JSON.parse(mse(e)||\"{}\")}catch(o){throw o.message+=` (when parsing ${e})`,o}this.load(r),this.indent=dse(e)}async loadFile(e,{baseFs:r=new Tn}){let o=await r.readFilePromise(e,\"utf8\"),a;try{a=JSON.parse(mse(o)||\"{}\")}catch(n){throw n.message+=` (when parsing ${e})`,n}this.load(a),this.indent=dse(o)}load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!=\"object\"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let o=[];if(this.name=null,typeof e.name==\"string\")try{this.name=ea(e.name)}catch{o.push(new Error(\"Parsing failed for the 'name' field\"))}if(typeof e.version==\"string\"?this.version=e.version:this.version=null,Array.isArray(e.os)){let n=[];this.os=n;for(let u of e.os)typeof u!=\"string\"?o.push(new Error(\"Parsing failed for the 'os' field\")):n.push(u)}else this.os=null;if(Array.isArray(e.cpu)){let n=[];this.cpu=n;for(let u of e.cpu)typeof u!=\"string\"?o.push(new Error(\"Parsing failed for the 'cpu' field\")):n.push(u)}else this.cpu=null;if(Array.isArray(e.libc)){let n=[];this.libc=n;for(let u of e.libc)typeof u!=\"string\"?o.push(new Error(\"Parsing failed for the 'libc' field\")):n.push(u)}else this.libc=null;if(typeof e.type==\"string\"?this.type=e.type:this.type=null,typeof e.packageManager==\"string\"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private==\"boolean\"?this.private=e.private:this.private=!1,typeof e.license==\"string\"?this.license=e.license:this.license=null,typeof e.languageName==\"string\"?this.languageName=e.languageName:this.languageName=null,typeof e.main==\"string\"?this.main=ta(e.main):this.main=null,typeof e.module==\"string\"?this.module=ta(e.module):this.module=null,e.browser!=null)if(typeof e.browser==\"string\")this.browser=ta(e.browser);else{this.browser=new Map;for(let[n,u]of Object.entries(e.browser))this.browser.set(ta(n),typeof u==\"string\"?ta(u):u)}else this.browser=null;if(this.bin=new Map,typeof e.bin==\"string\")e.bin.trim()===\"\"?o.push(new Error(\"Invalid bin field\")):this.name!==null?this.bin.set(this.name.name,ta(e.bin)):o.push(new Error(\"String bin field, but no attached package name\"));else if(typeof e.bin==\"object\"&&e.bin!==null)for(let[n,u]of Object.entries(e.bin)){if(typeof u!=\"string\"||u.trim()===\"\"){o.push(new Error(`Invalid bin definition for '${n}'`));continue}let A=ea(n);this.bin.set(A.name,ta(u))}if(this.scripts=new Map,typeof e.scripts==\"object\"&&e.scripts!==null)for(let[n,u]of Object.entries(e.scripts)){if(typeof u!=\"string\"){o.push(new Error(`Invalid script definition for '${n}'`));continue}this.scripts.set(n,u)}if(this.dependencies=new Map,typeof e.dependencies==\"object\"&&e.dependencies!==null)for(let[n,u]of Object.entries(e.dependencies)){if(typeof u!=\"string\"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=ea(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=In(A,u);this.dependencies.set(p.identHash,p)}if(this.devDependencies=new Map,typeof e.devDependencies==\"object\"&&e.devDependencies!==null)for(let[n,u]of Object.entries(e.devDependencies)){if(typeof u!=\"string\"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=ea(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=In(A,u);this.devDependencies.set(p.identHash,p)}if(this.peerDependencies=new Map,typeof e.peerDependencies==\"object\"&&e.peerDependencies!==null)for(let[n,u]of Object.entries(e.peerDependencies)){let A;try{A=ea(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}(typeof u!=\"string\"||!u.startsWith(ei.protocol)&&!Qa(u))&&(o.push(new Error(`Invalid dependency range for '${n}'`)),u=\"*\");let p=In(A,u);this.peerDependencies.set(p.identHash,p)}typeof e.workspaces==\"object\"&&e.workspaces!==null&&e.workspaces.nohoist&&o.push(new Error(\"'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead\"));let a=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces==\"object\"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let n of a){if(typeof n!=\"string\"){o.push(new Error(`Invalid workspace definition for '${n}'`));continue}this.workspaceDefinitions.push({pattern:n})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta==\"object\"&&e.dependenciesMeta!==null)for(let[n,u]of Object.entries(e.dependenciesMeta)){if(typeof u!=\"object\"||u===null){o.push(new Error(`Invalid meta field for '${n}`));continue}let A=nh(n),p=this.ensureDependencyMeta(A),h=kb(u.built,{yamlCompatibilityMode:r});if(h===null){o.push(new Error(`Invalid built meta field for '${n}'`));continue}let E=kb(u.optional,{yamlCompatibilityMode:r});if(E===null){o.push(new Error(`Invalid optional meta field for '${n}'`));continue}let I=kb(u.unplugged,{yamlCompatibilityMode:r});if(I===null){o.push(new Error(`Invalid unplugged meta field for '${n}'`));continue}Object.assign(p,{built:h,optional:E,unplugged:I})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta==\"object\"&&e.peerDependenciesMeta!==null)for(let[n,u]of Object.entries(e.peerDependenciesMeta)){if(typeof u!=\"object\"||u===null){o.push(new Error(`Invalid meta field for '${n}'`));continue}let A=nh(n),p=this.ensurePeerDependencyMeta(A),h=kb(u.optional,{yamlCompatibilityMode:r});if(h===null){o.push(new Error(`Invalid optional meta field for '${n}'`));continue}Object.assign(p,{optional:h})}if(this.resolutions=[],typeof e.resolutions==\"object\"&&e.resolutions!==null)for(let[n,u]of Object.entries(e.resolutions)){if(typeof u!=\"string\"){o.push(new Error(`Invalid resolution entry for '${n}'`));continue}try{this.resolutions.push({pattern:BD(n),reference:u})}catch(A){o.push(A);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let n of e.files){if(typeof n!=\"string\"){o.push(new Error(`Invalid files entry for '${n}'`));continue}this.files.add(n)}}else this.files=null;if(typeof e.publishConfig==\"object\"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access==\"string\"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main==\"string\"&&(this.publishConfig.main=ta(e.publishConfig.main)),typeof e.publishConfig.module==\"string\"&&(this.publishConfig.module=ta(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser==\"string\")this.publishConfig.browser=ta(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[n,u]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(ta(n),typeof u==\"string\"?ta(u):u)}if(typeof e.publishConfig.registry==\"string\"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin==\"string\")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,ta(e.publishConfig.bin)]]):o.push(new Error(\"String bin field, but no attached package name\"));else if(typeof e.publishConfig.bin==\"object\"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[n,u]of Object.entries(e.publishConfig.bin)){if(typeof u!=\"string\"){o.push(new Error(`Invalid bin definition for '${n}'`));continue}this.publishConfig.bin.set(n,ta(u))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let n of e.publishConfig.executableFiles){if(typeof n!=\"string\"){o.push(new Error(\"Invalid executable file definition\"));continue}this.publishConfig.executableFiles.add(ta(n))}}}else this.publishConfig=null;if(typeof e.installConfig==\"object\"&&e.installConfig!==null){this.installConfig={};for(let n of Object.keys(e.installConfig))n===\"hoistingLimits\"?typeof e.installConfig.hoistingLimits==\"string\"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:o.push(new Error(\"Invalid hoisting limits definition\")):n==\"selfReferences\"?typeof e.installConfig.selfReferences==\"boolean\"?this.installConfig.selfReferences=e.installConfig.selfReferences:o.push(new Error(\"Invalid selfReferences definition, must be a boolean value\")):o.push(new Error(`Unrecognized installConfig key: ${n}`))}else this.installConfig=null;if(typeof e.optionalDependencies==\"object\"&&e.optionalDependencies!==null)for(let[n,u]of Object.entries(e.optionalDependencies)){if(typeof u!=\"string\"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=ea(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=In(A,u);this.dependencies.set(p.identHash,p);let h=In(A,\"unknown\"),E=this.ensureDependencyMeta(h);Object.assign(E,{optional:!0})}typeof e.preferUnplugged==\"boolean\"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=o}getForScope(e){switch(e){case\"dependencies\":return this.dependencies;case\"devDependencies\":return this.devDependencies;case\"peerDependencies\":return this.peerDependencies;default:throw new Error(`Unsupported value (\"${e}\")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(ZM(\"os\",this.os)),this.cpu&&this.cpu.length>0&&e.push(ZM(\"cpu\",this.cpu)),this.libc&&this.libc.length>0&&e.push(ZM(\"libc\",this.libc)),e.length>0?e.join(\" & \"):null}ensureDependencyMeta(e){if(e.range!==\"unknown\"&&!Ese.default.valid(e.range))throw new Error(`Invalid meta field range for '${xa(e)}'`);let r=rn(e),o=e.range!==\"unknown\"?e.range:null,a=this.dependenciesMeta.get(r);a||this.dependenciesMeta.set(r,a=new Map);let n=a.get(o);return n||a.set(o,n={}),n}ensurePeerDependencyMeta(e){if(e.range!==\"unknown\")throw new Error(`Invalid meta field range for '${xa(e)}'`);let r=rn(e),o=this.peerDependenciesMeta.get(r);return o||this.peerDependenciesMeta.set(r,o={}),o}setRawField(e,r,{after:o=[]}={}){let a=new Set(o.filter(n=>Object.hasOwn(this.raw,n)));if(a.size===0||Object.hasOwn(this.raw,e))this.raw[e]=r;else{let n=this.raw,u=this.raw={},A=!1;for(let p of Object.keys(n))u[p]=n[p],A||(a.delete(p),a.size===0&&(u[e]=r,A=!0))}}exportTo(e,{compatibilityMode:r=!0}={}){if(Object.assign(e,this.raw),this.name!==null?e.name=rn(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let n=this.browser;typeof n==\"string\"?e.browser=n:n instanceof Map&&(e.browser=Object.assign({},...Array.from(n.keys()).sort().map(u=>({[u]:n.get(u)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(n=>({[n]:this.bin.get(n)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces={...this.raw.workspaces,packages:this.workspaceDefinitions.map(({pattern:n})=>n)}:e.workspaces=this.workspaceDefinitions.map(({pattern:n})=>n):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let o=[],a=[];for(let n of this.dependencies.values()){let u=this.dependenciesMeta.get(rn(n)),A=!1;if(r&&u){let p=u.get(null);p&&p.optional&&(A=!0)}A?a.push(n):o.push(n)}o.length>0?e.dependencies=Object.assign({},...jm(o).map(n=>({[rn(n)]:n.range}))):delete e.dependencies,a.length>0?e.optionalDependencies=Object.assign({},...jm(a).map(n=>({[rn(n)]:n.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...jm(this.devDependencies.values()).map(n=>({[rn(n)]:n.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...jm(this.peerDependencies.values()).map(n=>({[rn(n)]:n.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[n,u]of Fs(this.dependenciesMeta.entries(),([A,p])=>A))for(let[A,p]of Fs(u.entries(),([h,E])=>h!==null?`0${h}`:\"1\")){let h=A!==null?xa(In(ea(n),A)):n,E={...p};r&&A===null&&delete E.optional,Object.keys(E).length!==0&&(e.dependenciesMeta[h]=E)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...Fs(this.peerDependenciesMeta.entries(),([n,u])=>n).map(([n,u])=>({[n]:u}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:n,reference:u})=>({[vD(n)]:u}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){e.scripts??={};for(let n of Object.keys(e.scripts))this.scripts.has(n)||delete e.scripts[n];for(let[n,u]of this.scripts.entries())e.scripts[n]=u}else delete e.scripts;return e}}});var wse=_((WNt,Cse)=>{var $tt=_l(),ert=function(){return $tt.Date.now()};Cse.exports=ert});var Bse=_((KNt,Ise)=>{var trt=/\\s/;function rrt(t){for(var e=t.length;e--&&trt.test(t.charAt(e)););return e}Ise.exports=rrt});var Dse=_((VNt,vse)=>{var nrt=Bse(),irt=/^\\s+/;function srt(t){return t&&t.slice(0,nrt(t)+1).replace(irt,\"\")}vse.exports=srt});var Ym=_((zNt,Pse)=>{var ort=cg(),art=Ju(),lrt=\"[object Symbol]\";function crt(t){return typeof t==\"symbol\"||art(t)&&ort(t)==lrt}Pse.exports=crt});var kse=_((JNt,xse)=>{var urt=Dse(),bse=sl(),Art=Ym(),Sse=NaN,frt=/^[-+]0x[0-9a-f]+$/i,prt=/^0b[01]+$/i,hrt=/^0o[0-7]+$/i,grt=parseInt;function drt(t){if(typeof t==\"number\")return t;if(Art(t))return Sse;if(bse(t)){var e=typeof t.valueOf==\"function\"?t.valueOf():t;t=bse(e)?e+\"\":e}if(typeof t!=\"string\")return t===0?t:+t;t=urt(t);var r=prt.test(t);return r||hrt.test(t)?grt(t.slice(2),r?2:8):frt.test(t)?Sse:+t}xse.exports=drt});var Rse=_((XNt,Fse)=>{var mrt=sl(),$M=wse(),Qse=kse(),yrt=\"Expected a function\",Ert=Math.max,Crt=Math.min;function wrt(t,e,r){var o,a,n,u,A,p,h=0,E=!1,I=!1,v=!0;if(typeof t!=\"function\")throw new TypeError(yrt);e=Qse(e)||0,mrt(r)&&(E=!!r.leading,I=\"maxWait\"in r,n=I?Ert(Qse(r.maxWait)||0,e):n,v=\"trailing\"in r?!!r.trailing:v);function x(ce){var Ce=o,de=a;return o=a=void 0,h=ce,u=t.apply(de,Ce),u}function C(ce){return h=ce,A=setTimeout(U,e),E?x(ce):u}function R(ce){var Ce=ce-p,de=ce-h,Be=e-Ce;return I?Crt(Be,n-de):Be}function L(ce){var Ce=ce-p,de=ce-h;return p===void 0||Ce>=e||Ce<0||I&&de>=n}function U(){var ce=$M();if(L(ce))return z(ce);A=setTimeout(U,R(ce))}function z(ce){return A=void 0,v&&o?x(ce):(o=a=void 0,u)}function te(){A!==void 0&&clearTimeout(A),h=0,o=p=a=A=void 0}function ae(){return A===void 0?u:z($M())}function le(){var ce=$M(),Ce=L(ce);if(o=arguments,a=this,p=ce,Ce){if(A===void 0)return C(p);if(I)return clearTimeout(A),A=setTimeout(U,e),x(p)}return A===void 0&&(A=setTimeout(U,e)),u}return le.cancel=te,le.flush=ae,le}Fse.exports=wrt});var eO=_((ZNt,Tse)=>{var Irt=Rse(),Brt=sl(),vrt=\"Expected a function\";function Drt(t,e,r){var o=!0,a=!0;if(typeof t!=\"function\")throw new TypeError(vrt);return Brt(r)&&(o=\"leading\"in r?!!r.leading:o,a=\"trailing\"in r?!!r.trailing:a),Irt(t,e,{leading:o,maxWait:e,trailing:a})}Tse.exports=Drt});function brt(t){return typeof t.reportCode<\"u\"}var Nse,Lse,Mse,Prt,Jt,Zs,Wl=Et(()=>{Nse=Ze(eO()),Lse=ve(\"stream\"),Mse=ve(\"string_decoder\"),Prt=15,Jt=class extends Error{constructor(r,o,a){super(o);this.reportExtra=a;this.reportCode=r}};Zs=class{constructor(){this.cacheHits=new Set;this.cacheMisses=new Set;this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}getRecommendedLength(){return 180}reportCacheHit(e){this.cacheHits.add(e.locatorHash)}reportCacheMiss(e,r){this.cacheMisses.add(e.locatorHash)}static progressViaCounter(e){let r=0,o,a=new Promise(p=>{o=p}),n=p=>{let h=o;a=new Promise(E=>{o=E}),r=p,h()},u=(p=0)=>{n(r+1)},A=async function*(){for(;r<e;)await a,yield{progress:r/e}}();return{[Symbol.asyncIterator](){return A},hasProgress:!0,hasTitle:!1,set:n,tick:u}}static progressViaTitle(){let e,r,o=new Promise(u=>{r=u}),a=(0,Nse.default)(u=>{let A=r;o=new Promise(p=>{r=p}),e=u,A()},1e3/Prt),n=async function*(){for(;;)await o,yield{title:e}}();return{[Symbol.asyncIterator](){return n},hasProgress:!1,hasTitle:!0,setTitle:a}}async startProgressPromise(e,r){let o=this.reportProgress(e);try{return await r(e)}finally{o.stop()}}startProgressSync(e,r){let o=this.reportProgress(e);try{return r(e)}finally{o.stop()}}reportInfoOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedInfos.has(a)||(this.reportedInfos.add(a),this.reportInfo(e,r),o?.reportExtra?.(this))}reportWarningOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedWarnings.has(a)||(this.reportedWarnings.add(a),this.reportWarning(e,r),o?.reportExtra?.(this))}reportErrorOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedErrors.has(a)||(this.reportedErrors.add(a),this.reportError(e,r),o?.reportExtra?.(this))}reportExceptionOnce(e){brt(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(1,e.stack||e.message,{key:e})}createStreamReporter(e=null){let r=new Lse.PassThrough,o=new Mse.StringDecoder,a=\"\";return r.on(\"data\",n=>{let u=o.write(n),A;do if(A=u.indexOf(`\n`),A!==-1){let p=a+u.substring(0,A);u=u.substring(A+1),a=\"\",e!==null?this.reportInfo(null,`${e} ${p}`):this.reportInfo(null,p)}while(A!==-1);a+=u}),r.on(\"end\",()=>{let n=o.end();n!==\"\"&&(e!==null?this.reportInfo(null,`${e} ${n}`):this.reportInfo(null,n))}),r}}});var Wm,tO=Et(()=>{Wl();So();Wm=class{constructor(e){this.fetchers=e}supports(e,r){return!!this.tryFetcher(e,r)}getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}tryFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));return o||null}getFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));if(!o)throw new Jt(11,`${qr(r.project.configuration,e)} isn't supported by any available fetcher`);return o}}});var yg,rO=Et(()=>{So();yg=class{constructor(e){this.resolvers=e.filter(r=>r)}supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shouldPersistResolution(e,r)}bindDescriptor(e,r,o){return this.getResolverByDescriptor(e,o).bindDescriptor(e,r,o)}getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r).getResolutionDependencies(e,r)}async getCandidates(e,r,o){return await this.getResolverByDescriptor(e,o).getCandidates(e,r,o)}async getSatisfying(e,r,o,a){return this.getResolverByDescriptor(e,a).getSatisfying(e,r,o,a)}async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e,r)}tryResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDescriptor(e,r));return o||null}getResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDescriptor(e,r));if(!o)throw new Error(`${jn(r.project.configuration,e)} isn't supported by any available resolver`);return o}tryResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator(e,r));return o||null}getResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator(e,r));if(!o)throw new Error(`${qr(r.project.configuration,e)} isn't supported by any available resolver`);return o}}});var Km,nO=Et(()=>{Pt();So();Km=class{supports(e){return!!e.reference.startsWith(\"virtual:\")}getLocalPath(e,r){let o=e.reference.indexOf(\"#\");if(o===-1)throw new Error(\"Invalid virtual package reference\");let a=e.reference.slice(o+1),n=Rs(e,a);return r.fetcher.getLocalPath(n,r)}async fetch(e,r){let o=e.reference.indexOf(\"#\");if(o===-1)throw new Error(\"Invalid virtual package reference\");let a=e.reference.slice(o+1),n=Rs(e,a),u=await r.fetcher.fetch(n,r);return await this.ensureVirtualLink(e,u,r)}getLocatorFilename(e){return Hm(e)}async ensureVirtualLink(e,r,o){let a=r.packageFs.getRealPath(),n=o.project.configuration.get(\"virtualFolder\"),u=this.getLocatorFilename(e),A=zs.makeVirtualPath(n,u,a),p=new Hu(A,{baseFs:r.packageFs,pathUtils:V});return{...r,packageFs:p}}}});var Qb,Ose=Et(()=>{Qb=class t{static{this.protocol=\"virtual:\"}static isVirtualDescriptor(e){return!!e.range.startsWith(t.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(t.protocol)}supportsDescriptor(e,r){return t.isVirtualDescriptor(e)}supportsLocator(e,r){return t.isVirtualLocator(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){throw new Error('Assertion failed: calling \"bindDescriptor\" on a virtual descriptor is unsupported')}getResolutionDependencies(e,r){throw new Error('Assertion failed: calling \"getResolutionDependencies\" on a virtual descriptor is unsupported')}async getCandidates(e,r,o){throw new Error('Assertion failed: calling \"getCandidates\" on a virtual descriptor is unsupported')}async getSatisfying(e,r,o,a){throw new Error('Assertion failed: calling \"getSatisfying\" on a virtual descriptor is unsupported')}async resolve(e,r){throw new Error('Assertion failed: calling \"resolve\" on a virtual locator is unsupported')}}});var Vm,iO=Et(()=>{Pt();mg();Vm=class{supports(e){return!!e.reference.startsWith(ei.protocol)}getLocalPath(e,r){return this.getWorkspace(e,r).cwd}async fetch(e,r){let o=this.getWorkspace(e,r).cwd;return{packageFs:new gn(o),prefixPath:It.dot,localPath:o}}getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(ei.protocol.length))}}});function KI(t){return typeof t==\"object\"&&t!==null&&!Array.isArray(t)}function Use(t){return typeof t>\"u\"?3:KI(t)?0:Array.isArray(t)?1:2}function aO(t,e){return Object.hasOwn(t,e)}function xrt(t){return KI(t)&&aO(t,\"onConflict\")&&typeof t.onConflict==\"string\"}function krt(t){if(typeof t>\"u\")return{onConflict:\"default\",value:t};if(!xrt(t))return{onConflict:\"default\",value:t};if(aO(t,\"value\"))return t;let{onConflict:e,...r}=t;return{onConflict:e,value:r}}function _se(t,e){let r=KI(t)&&aO(t,e)?t[e]:void 0;return krt(r)}function zm(t,e){return[t,e,Hse]}function lO(t){return Array.isArray(t)?t[2]===Hse:!1}function sO(t,e){if(KI(t)){let r={};for(let o of Object.keys(t))r[o]=sO(t[o],e);return zm(e,r)}return Array.isArray(t)?zm(e,t.map(r=>sO(r,e))):zm(e,t)}function oO(t,e,r,o,a){let n,u=[],A=a,p=0;for(let E=a-1;E>=o;--E){let[I,v]=t[E],{onConflict:x,value:C}=_se(v,r),R=Use(C);if(R!==3){if(n??=R,R!==n||x===\"hardReset\"){p=A;break}if(R===2)return zm(I,C);if(u.unshift([I,C]),x===\"reset\"){p=E;break}x===\"extend\"&&E===o&&(o=0),A=E}}if(typeof n>\"u\")return null;let h=u.map(([E])=>E).join(\", \");switch(n){case 1:return zm(h,new Array().concat(...u.map(([E,I])=>I.map(v=>sO(v,E)))));case 0:{let E=Object.assign({},...u.map(([,R])=>R)),I=Object.keys(E),v={},x=t.map(([R,L])=>[R,_se(L,r).value]),C=Srt(x,([R,L])=>{let U=Use(L);return U!==0&&U!==3});if(C!==-1){let R=x.slice(C+1);for(let L of I)v[L]=oO(R,e,L,0,R.length)}else for(let R of I)v[R]=oO(x,e,R,p,x.length);return zm(h,v)}default:throw new Error(\"Assertion failed: Non-extendable value type\")}}function qse(t){return oO(t.map(([e,r])=>[e,{\".\":r}]),[],\".\",0,t.length)}function VI(t){return lO(t)?t[1]:t}function Fb(t){let e=lO(t)?t[1]:t;if(Array.isArray(e))return e.map(r=>Fb(r));if(KI(e)){let r={};for(let[o,a]of Object.entries(e))r[o]=Fb(a);return r}return e}function cO(t){return lO(t)?t[0]:null}var Srt,Hse,jse=Et(()=>{Srt=(t,e,r)=>{let o=[...t];return o.reverse(),o.findIndex(e,r)};Hse=Symbol()});var Rb={};Vt(Rb,{getDefaultGlobalFolder:()=>AO,getHomeFolder:()=>Jm,isFolderInside:()=>fO});function AO(){if(process.platform===\"win32\"){let t=ue.toPortablePath(process.env.LOCALAPPDATA||ue.join((0,uO.homedir)(),\"AppData\",\"Local\"));return V.resolve(t,\"Yarn/Berry\")}if(process.env.XDG_DATA_HOME){let t=ue.toPortablePath(process.env.XDG_DATA_HOME);return V.resolve(t,\"yarn/berry\")}return V.resolve(Jm(),\".yarn/berry\")}function Jm(){return ue.toPortablePath((0,uO.homedir)()||\"/usr/local/share\")}function fO(t,e){let r=V.relative(e,t);return r&&!r.startsWith(\"..\")&&!V.isAbsolute(r)}var uO,Tb=Et(()=>{Pt();uO=ve(\"os\")});var Kse=_(Xm=>{\"use strict\";var ALt=ve(\"net\"),Frt=ve(\"tls\"),pO=ve(\"http\"),Gse=ve(\"https\"),Rrt=ve(\"events\"),fLt=ve(\"assert\"),Trt=ve(\"util\");Xm.httpOverHttp=Nrt;Xm.httpsOverHttp=Lrt;Xm.httpOverHttps=Mrt;Xm.httpsOverHttps=Ort;function Nrt(t){var e=new kf(t);return e.request=pO.request,e}function Lrt(t){var e=new kf(t);return e.request=pO.request,e.createSocket=Yse,e.defaultPort=443,e}function Mrt(t){var e=new kf(t);return e.request=Gse.request,e}function Ort(t){var e=new kf(t);return e.request=Gse.request,e.createSocket=Yse,e.defaultPort=443,e}function kf(t){var e=this;e.options=t||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||pO.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on(\"free\",function(o,a,n,u){for(var A=Wse(a,n,u),p=0,h=e.requests.length;p<h;++p){var E=e.requests[p];if(E.host===A.host&&E.port===A.port){e.requests.splice(p,1),E.request.onSocket(o);return}}o.destroy(),e.removeSocket(o)})}Trt.inherits(kf,Rrt.EventEmitter);kf.prototype.addRequest=function(e,r,o,a){var n=this,u=hO({request:e},n.options,Wse(r,o,a));if(n.sockets.length>=this.maxSockets){n.requests.push(u);return}n.createSocket(u,function(A){A.on(\"free\",p),A.on(\"close\",h),A.on(\"agentRemove\",h),e.onSocket(A);function p(){n.emit(\"free\",A,u)}function h(E){n.removeSocket(A),A.removeListener(\"free\",p),A.removeListener(\"close\",h),A.removeListener(\"agentRemove\",h)}})};kf.prototype.createSocket=function(e,r){var o=this,a={};o.sockets.push(a);var n=hO({},o.proxyOptions,{method:\"CONNECT\",path:e.host+\":\"+e.port,agent:!1,headers:{host:e.host+\":\"+e.port}});e.localAddress&&(n.localAddress=e.localAddress),n.proxyAuth&&(n.headers=n.headers||{},n.headers[\"Proxy-Authorization\"]=\"Basic \"+new Buffer(n.proxyAuth).toString(\"base64\")),ih(\"making CONNECT request\");var u=o.request(n);u.useChunkedEncodingByDefault=!1,u.once(\"response\",A),u.once(\"upgrade\",p),u.once(\"connect\",h),u.once(\"error\",E),u.end();function A(I){I.upgrade=!0}function p(I,v,x){process.nextTick(function(){h(I,v,x)})}function h(I,v,x){if(u.removeAllListeners(),v.removeAllListeners(),I.statusCode!==200){ih(\"tunneling socket could not be established, statusCode=%d\",I.statusCode),v.destroy();var C=new Error(\"tunneling socket could not be established, statusCode=\"+I.statusCode);C.code=\"ECONNRESET\",e.request.emit(\"error\",C),o.removeSocket(a);return}if(x.length>0){ih(\"got illegal response body from proxy\"),v.destroy();var C=new Error(\"got illegal response body from proxy\");C.code=\"ECONNRESET\",e.request.emit(\"error\",C),o.removeSocket(a);return}return ih(\"tunneling connection has established\"),o.sockets[o.sockets.indexOf(a)]=v,r(v)}function E(I){u.removeAllListeners(),ih(`tunneling socket could not be established, cause=%s\n`,I.message,I.stack);var v=new Error(\"tunneling socket could not be established, cause=\"+I.message);v.code=\"ECONNRESET\",e.request.emit(\"error\",v),o.removeSocket(a)}};kf.prototype.removeSocket=function(e){var r=this.sockets.indexOf(e);if(r!==-1){this.sockets.splice(r,1);var o=this.requests.shift();o&&this.createSocket(o,function(a){o.request.onSocket(a)})}};function Yse(t,e){var r=this;kf.prototype.createSocket.call(r,t,function(o){var a=t.request.getHeader(\"host\"),n=hO({},r.options,{socket:o,servername:a?a.replace(/:.*$/,\"\"):t.host}),u=Frt.connect(0,n);r.sockets[r.sockets.indexOf(o)]=u,e(u)})}function Wse(t,e,r){return typeof t==\"string\"?{host:t,port:e,localAddress:r}:t}function hO(t){for(var e=1,r=arguments.length;e<r;++e){var o=arguments[e];if(typeof o==\"object\")for(var a=Object.keys(o),n=0,u=a.length;n<u;++n){var A=a[n];o[A]!==void 0&&(t[A]=o[A])}}return t}var ih;process.env.NODE_DEBUG&&/\\btunnel\\b/.test(process.env.NODE_DEBUG)?ih=function(){var t=Array.prototype.slice.call(arguments);typeof t[0]==\"string\"?t[0]=\"TUNNEL: \"+t[0]:t.unshift(\"TUNNEL:\"),console.error.apply(console,t)}:ih=function(){};Xm.debug=ih});var zse=_((hLt,Vse)=>{Vse.exports=Kse()});var Ff=_((Qf,Nb)=>{\"use strict\";Object.defineProperty(Qf,\"__esModule\",{value:!0});var Jse=[\"Int8Array\",\"Uint8Array\",\"Uint8ClampedArray\",\"Int16Array\",\"Uint16Array\",\"Int32Array\",\"Uint32Array\",\"Float32Array\",\"Float64Array\",\"BigInt64Array\",\"BigUint64Array\"];function Urt(t){return Jse.includes(t)}var _rt=[\"Function\",\"Generator\",\"AsyncGenerator\",\"GeneratorFunction\",\"AsyncGeneratorFunction\",\"AsyncFunction\",\"Observable\",\"Array\",\"Buffer\",\"Blob\",\"Object\",\"RegExp\",\"Date\",\"Error\",\"Map\",\"Set\",\"WeakMap\",\"WeakSet\",\"ArrayBuffer\",\"SharedArrayBuffer\",\"DataView\",\"Promise\",\"URL\",\"FormData\",\"URLSearchParams\",\"HTMLElement\",...Jse];function Hrt(t){return _rt.includes(t)}var qrt=[\"null\",\"undefined\",\"string\",\"number\",\"bigint\",\"boolean\",\"symbol\"];function jrt(t){return qrt.includes(t)}function Zm(t){return e=>typeof e===t}var{toString:Xse}=Object.prototype,zI=t=>{let e=Xse.call(t).slice(8,-1);if(/HTML\\w+Element/.test(e)&&Pe.domElement(t))return\"HTMLElement\";if(Hrt(e))return e},Xn=t=>e=>zI(e)===t;function Pe(t){if(t===null)return\"null\";switch(typeof t){case\"undefined\":return\"undefined\";case\"string\":return\"string\";case\"number\":return\"number\";case\"boolean\":return\"boolean\";case\"function\":return\"Function\";case\"bigint\":return\"bigint\";case\"symbol\":return\"symbol\";default:}if(Pe.observable(t))return\"Observable\";if(Pe.array(t))return\"Array\";if(Pe.buffer(t))return\"Buffer\";let e=zI(t);if(e)return e;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError(\"Please don't use object wrappers for primitive types\");return\"Object\"}Pe.undefined=Zm(\"undefined\");Pe.string=Zm(\"string\");var Grt=Zm(\"number\");Pe.number=t=>Grt(t)&&!Pe.nan(t);Pe.bigint=Zm(\"bigint\");Pe.function_=Zm(\"function\");Pe.null_=t=>t===null;Pe.class_=t=>Pe.function_(t)&&t.toString().startsWith(\"class \");Pe.boolean=t=>t===!0||t===!1;Pe.symbol=Zm(\"symbol\");Pe.numericString=t=>Pe.string(t)&&!Pe.emptyStringOrWhitespace(t)&&!Number.isNaN(Number(t));Pe.array=(t,e)=>Array.isArray(t)?Pe.function_(e)?t.every(e):!0:!1;Pe.buffer=t=>{var e,r,o,a;return(a=(o=(r=(e=t)===null||e===void 0?void 0:e.constructor)===null||r===void 0?void 0:r.isBuffer)===null||o===void 0?void 0:o.call(r,t))!==null&&a!==void 0?a:!1};Pe.blob=t=>Xn(\"Blob\")(t);Pe.nullOrUndefined=t=>Pe.null_(t)||Pe.undefined(t);Pe.object=t=>!Pe.null_(t)&&(typeof t==\"object\"||Pe.function_(t));Pe.iterable=t=>{var e;return Pe.function_((e=t)===null||e===void 0?void 0:e[Symbol.iterator])};Pe.asyncIterable=t=>{var e;return Pe.function_((e=t)===null||e===void 0?void 0:e[Symbol.asyncIterator])};Pe.generator=t=>{var e,r;return Pe.iterable(t)&&Pe.function_((e=t)===null||e===void 0?void 0:e.next)&&Pe.function_((r=t)===null||r===void 0?void 0:r.throw)};Pe.asyncGenerator=t=>Pe.asyncIterable(t)&&Pe.function_(t.next)&&Pe.function_(t.throw);Pe.nativePromise=t=>Xn(\"Promise\")(t);var Yrt=t=>{var e,r;return Pe.function_((e=t)===null||e===void 0?void 0:e.then)&&Pe.function_((r=t)===null||r===void 0?void 0:r.catch)};Pe.promise=t=>Pe.nativePromise(t)||Yrt(t);Pe.generatorFunction=Xn(\"GeneratorFunction\");Pe.asyncGeneratorFunction=t=>zI(t)===\"AsyncGeneratorFunction\";Pe.asyncFunction=t=>zI(t)===\"AsyncFunction\";Pe.boundFunction=t=>Pe.function_(t)&&!t.hasOwnProperty(\"prototype\");Pe.regExp=Xn(\"RegExp\");Pe.date=Xn(\"Date\");Pe.error=Xn(\"Error\");Pe.map=t=>Xn(\"Map\")(t);Pe.set=t=>Xn(\"Set\")(t);Pe.weakMap=t=>Xn(\"WeakMap\")(t);Pe.weakSet=t=>Xn(\"WeakSet\")(t);Pe.int8Array=Xn(\"Int8Array\");Pe.uint8Array=Xn(\"Uint8Array\");Pe.uint8ClampedArray=Xn(\"Uint8ClampedArray\");Pe.int16Array=Xn(\"Int16Array\");Pe.uint16Array=Xn(\"Uint16Array\");Pe.int32Array=Xn(\"Int32Array\");Pe.uint32Array=Xn(\"Uint32Array\");Pe.float32Array=Xn(\"Float32Array\");Pe.float64Array=Xn(\"Float64Array\");Pe.bigInt64Array=Xn(\"BigInt64Array\");Pe.bigUint64Array=Xn(\"BigUint64Array\");Pe.arrayBuffer=Xn(\"ArrayBuffer\");Pe.sharedArrayBuffer=Xn(\"SharedArrayBuffer\");Pe.dataView=Xn(\"DataView\");Pe.enumCase=(t,e)=>Object.values(e).includes(t);Pe.directInstanceOf=(t,e)=>Object.getPrototypeOf(t)===e.prototype;Pe.urlInstance=t=>Xn(\"URL\")(t);Pe.urlString=t=>{if(!Pe.string(t))return!1;try{return new URL(t),!0}catch{return!1}};Pe.truthy=t=>!!t;Pe.falsy=t=>!t;Pe.nan=t=>Number.isNaN(t);Pe.primitive=t=>Pe.null_(t)||jrt(typeof t);Pe.integer=t=>Number.isInteger(t);Pe.safeInteger=t=>Number.isSafeInteger(t);Pe.plainObject=t=>{if(Xse.call(t)!==\"[object Object]\")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.getPrototypeOf({})};Pe.typedArray=t=>Urt(zI(t));var Wrt=t=>Pe.safeInteger(t)&&t>=0;Pe.arrayLike=t=>!Pe.nullOrUndefined(t)&&!Pe.function_(t)&&Wrt(t.length);Pe.inRange=(t,e)=>{if(Pe.number(e))return t>=Math.min(0,e)&&t<=Math.max(e,0);if(Pe.array(e)&&e.length===2)return t>=Math.min(...e)&&t<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var Krt=1,Vrt=[\"innerHTML\",\"ownerDocument\",\"style\",\"attributes\",\"nodeValue\"];Pe.domElement=t=>Pe.object(t)&&t.nodeType===Krt&&Pe.string(t.nodeName)&&!Pe.plainObject(t)&&Vrt.every(e=>e in t);Pe.observable=t=>{var e,r,o,a;return t?t===((r=(e=t)[Symbol.observable])===null||r===void 0?void 0:r.call(e))||t===((a=(o=t)[\"@@observable\"])===null||a===void 0?void 0:a.call(o)):!1};Pe.nodeStream=t=>Pe.object(t)&&Pe.function_(t.pipe)&&!Pe.observable(t);Pe.infinite=t=>t===1/0||t===-1/0;var Zse=t=>e=>Pe.integer(e)&&Math.abs(e%2)===t;Pe.evenInteger=Zse(0);Pe.oddInteger=Zse(1);Pe.emptyArray=t=>Pe.array(t)&&t.length===0;Pe.nonEmptyArray=t=>Pe.array(t)&&t.length>0;Pe.emptyString=t=>Pe.string(t)&&t.length===0;var zrt=t=>Pe.string(t)&&!/\\S/.test(t);Pe.emptyStringOrWhitespace=t=>Pe.emptyString(t)||zrt(t);Pe.nonEmptyString=t=>Pe.string(t)&&t.length>0;Pe.nonEmptyStringAndNotWhitespace=t=>Pe.string(t)&&!Pe.emptyStringOrWhitespace(t);Pe.emptyObject=t=>Pe.object(t)&&!Pe.map(t)&&!Pe.set(t)&&Object.keys(t).length===0;Pe.nonEmptyObject=t=>Pe.object(t)&&!Pe.map(t)&&!Pe.set(t)&&Object.keys(t).length>0;Pe.emptySet=t=>Pe.set(t)&&t.size===0;Pe.nonEmptySet=t=>Pe.set(t)&&t.size>0;Pe.emptyMap=t=>Pe.map(t)&&t.size===0;Pe.nonEmptyMap=t=>Pe.map(t)&&t.size>0;Pe.propertyKey=t=>Pe.any([Pe.string,Pe.number,Pe.symbol],t);Pe.formData=t=>Xn(\"FormData\")(t);Pe.urlSearchParams=t=>Xn(\"URLSearchParams\")(t);var $se=(t,e,r)=>{if(!Pe.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(r.length===0)throw new TypeError(\"Invalid number of values\");return t.call(r,e)};Pe.any=(t,...e)=>(Pe.array(t)?t:[t]).some(o=>$se(Array.prototype.some,o,e));Pe.all=(t,...e)=>$se(Array.prototype.every,t,e);var Mt=(t,e,r,o={})=>{if(!t){let{multipleValues:a}=o,n=a?`received values of types ${[...new Set(r.map(u=>`\\`${Pe(u)}\\``))].join(\", \")}`:`received value of type \\`${Pe(r)}\\``;throw new TypeError(`Expected value which is \\`${e}\\`, ${n}.`)}};Qf.assert={undefined:t=>Mt(Pe.undefined(t),\"undefined\",t),string:t=>Mt(Pe.string(t),\"string\",t),number:t=>Mt(Pe.number(t),\"number\",t),bigint:t=>Mt(Pe.bigint(t),\"bigint\",t),function_:t=>Mt(Pe.function_(t),\"Function\",t),null_:t=>Mt(Pe.null_(t),\"null\",t),class_:t=>Mt(Pe.class_(t),\"Class\",t),boolean:t=>Mt(Pe.boolean(t),\"boolean\",t),symbol:t=>Mt(Pe.symbol(t),\"symbol\",t),numericString:t=>Mt(Pe.numericString(t),\"string with a number\",t),array:(t,e)=>{Mt(Pe.array(t),\"Array\",t),e&&t.forEach(e)},buffer:t=>Mt(Pe.buffer(t),\"Buffer\",t),blob:t=>Mt(Pe.blob(t),\"Blob\",t),nullOrUndefined:t=>Mt(Pe.nullOrUndefined(t),\"null or undefined\",t),object:t=>Mt(Pe.object(t),\"Object\",t),iterable:t=>Mt(Pe.iterable(t),\"Iterable\",t),asyncIterable:t=>Mt(Pe.asyncIterable(t),\"AsyncIterable\",t),generator:t=>Mt(Pe.generator(t),\"Generator\",t),asyncGenerator:t=>Mt(Pe.asyncGenerator(t),\"AsyncGenerator\",t),nativePromise:t=>Mt(Pe.nativePromise(t),\"native Promise\",t),promise:t=>Mt(Pe.promise(t),\"Promise\",t),generatorFunction:t=>Mt(Pe.generatorFunction(t),\"GeneratorFunction\",t),asyncGeneratorFunction:t=>Mt(Pe.asyncGeneratorFunction(t),\"AsyncGeneratorFunction\",t),asyncFunction:t=>Mt(Pe.asyncFunction(t),\"AsyncFunction\",t),boundFunction:t=>Mt(Pe.boundFunction(t),\"Function\",t),regExp:t=>Mt(Pe.regExp(t),\"RegExp\",t),date:t=>Mt(Pe.date(t),\"Date\",t),error:t=>Mt(Pe.error(t),\"Error\",t),map:t=>Mt(Pe.map(t),\"Map\",t),set:t=>Mt(Pe.set(t),\"Set\",t),weakMap:t=>Mt(Pe.weakMap(t),\"WeakMap\",t),weakSet:t=>Mt(Pe.weakSet(t),\"WeakSet\",t),int8Array:t=>Mt(Pe.int8Array(t),\"Int8Array\",t),uint8Array:t=>Mt(Pe.uint8Array(t),\"Uint8Array\",t),uint8ClampedArray:t=>Mt(Pe.uint8ClampedArray(t),\"Uint8ClampedArray\",t),int16Array:t=>Mt(Pe.int16Array(t),\"Int16Array\",t),uint16Array:t=>Mt(Pe.uint16Array(t),\"Uint16Array\",t),int32Array:t=>Mt(Pe.int32Array(t),\"Int32Array\",t),uint32Array:t=>Mt(Pe.uint32Array(t),\"Uint32Array\",t),float32Array:t=>Mt(Pe.float32Array(t),\"Float32Array\",t),float64Array:t=>Mt(Pe.float64Array(t),\"Float64Array\",t),bigInt64Array:t=>Mt(Pe.bigInt64Array(t),\"BigInt64Array\",t),bigUint64Array:t=>Mt(Pe.bigUint64Array(t),\"BigUint64Array\",t),arrayBuffer:t=>Mt(Pe.arrayBuffer(t),\"ArrayBuffer\",t),sharedArrayBuffer:t=>Mt(Pe.sharedArrayBuffer(t),\"SharedArrayBuffer\",t),dataView:t=>Mt(Pe.dataView(t),\"DataView\",t),enumCase:(t,e)=>Mt(Pe.enumCase(t,e),\"EnumCase\",t),urlInstance:t=>Mt(Pe.urlInstance(t),\"URL\",t),urlString:t=>Mt(Pe.urlString(t),\"string with a URL\",t),truthy:t=>Mt(Pe.truthy(t),\"truthy\",t),falsy:t=>Mt(Pe.falsy(t),\"falsy\",t),nan:t=>Mt(Pe.nan(t),\"NaN\",t),primitive:t=>Mt(Pe.primitive(t),\"primitive\",t),integer:t=>Mt(Pe.integer(t),\"integer\",t),safeInteger:t=>Mt(Pe.safeInteger(t),\"integer\",t),plainObject:t=>Mt(Pe.plainObject(t),\"plain object\",t),typedArray:t=>Mt(Pe.typedArray(t),\"TypedArray\",t),arrayLike:t=>Mt(Pe.arrayLike(t),\"array-like\",t),domElement:t=>Mt(Pe.domElement(t),\"HTMLElement\",t),observable:t=>Mt(Pe.observable(t),\"Observable\",t),nodeStream:t=>Mt(Pe.nodeStream(t),\"Node.js Stream\",t),infinite:t=>Mt(Pe.infinite(t),\"infinite number\",t),emptyArray:t=>Mt(Pe.emptyArray(t),\"empty array\",t),nonEmptyArray:t=>Mt(Pe.nonEmptyArray(t),\"non-empty array\",t),emptyString:t=>Mt(Pe.emptyString(t),\"empty string\",t),emptyStringOrWhitespace:t=>Mt(Pe.emptyStringOrWhitespace(t),\"empty string or whitespace\",t),nonEmptyString:t=>Mt(Pe.nonEmptyString(t),\"non-empty string\",t),nonEmptyStringAndNotWhitespace:t=>Mt(Pe.nonEmptyStringAndNotWhitespace(t),\"non-empty string and not whitespace\",t),emptyObject:t=>Mt(Pe.emptyObject(t),\"empty object\",t),nonEmptyObject:t=>Mt(Pe.nonEmptyObject(t),\"non-empty object\",t),emptySet:t=>Mt(Pe.emptySet(t),\"empty set\",t),nonEmptySet:t=>Mt(Pe.nonEmptySet(t),\"non-empty set\",t),emptyMap:t=>Mt(Pe.emptyMap(t),\"empty map\",t),nonEmptyMap:t=>Mt(Pe.nonEmptyMap(t),\"non-empty map\",t),propertyKey:t=>Mt(Pe.propertyKey(t),\"PropertyKey\",t),formData:t=>Mt(Pe.formData(t),\"FormData\",t),urlSearchParams:t=>Mt(Pe.urlSearchParams(t),\"URLSearchParams\",t),evenInteger:t=>Mt(Pe.evenInteger(t),\"even integer\",t),oddInteger:t=>Mt(Pe.oddInteger(t),\"odd integer\",t),directInstanceOf:(t,e)=>Mt(Pe.directInstanceOf(t,e),\"T\",t),inRange:(t,e)=>Mt(Pe.inRange(t,e),\"in range\",t),any:(t,...e)=>Mt(Pe.any(t,...e),\"predicate returns truthy for any value\",e,{multipleValues:!0}),all:(t,...e)=>Mt(Pe.all(t,...e),\"predicate returns truthy for all values\",e,{multipleValues:!0})};Object.defineProperties(Pe,{class:{value:Pe.class_},function:{value:Pe.function_},null:{value:Pe.null_}});Object.defineProperties(Qf.assert,{class:{value:Qf.assert.class_},function:{value:Qf.assert.function_},null:{value:Qf.assert.null_}});Qf.default=Pe;Nb.exports=Pe;Nb.exports.default=Pe;Nb.exports.assert=Qf.assert});var eoe=_((gLt,gO)=>{\"use strict\";var Lb=class extends Error{constructor(e){super(e||\"Promise was canceled\"),this.name=\"CancelError\"}get isCanceled(){return!0}},Mb=class t{static fn(e){return(...r)=>new t((o,a,n)=>{r.push(n),e(...r).then(o,a)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,o)=>{this._reject=o;let a=A=>{this._isPending=!1,r(A)},n=A=>{this._isPending=!1,o(A)},u=A=>{if(!this._isPending)throw new Error(\"The `onCancel` handler was attached after the promise settled.\");this._cancelHandlers.push(A)};return Object.defineProperties(u,{shouldReject:{get:()=>this._rejectOnCancel,set:A=>{this._rejectOnCancel=A}}}),e(a,n,u)})}then(e,r){return this._promise.then(e,r)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let r of this._cancelHandlers)r()}catch(r){this._reject(r)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new Lb(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(Mb.prototype,Promise.prototype);gO.exports=Mb;gO.exports.CancelError=Lb});var toe=_((mO,yO)=>{\"use strict\";Object.defineProperty(mO,\"__esModule\",{value:!0});function Jrt(t){return t.encrypted}var dO=(t,e)=>{let r;typeof e==\"function\"?r={connect:e}:r=e;let o=typeof r.connect==\"function\",a=typeof r.secureConnect==\"function\",n=typeof r.close==\"function\",u=()=>{o&&r.connect(),Jrt(t)&&a&&(t.authorized?r.secureConnect():t.authorizationError||t.once(\"secureConnect\",r.secureConnect)),n&&t.once(\"close\",r.close)};t.writable&&!t.connecting?u():t.connecting?t.once(\"connect\",u):t.destroyed&&n&&r.close(t._hadError)};mO.default=dO;yO.exports=dO;yO.exports.default=dO});var roe=_((CO,wO)=>{\"use strict\";Object.defineProperty(CO,\"__esModule\",{value:!0});var Xrt=toe(),Zrt=Number(process.versions.node.split(\".\")[0]),EO=t=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};t.timings=e;let r=u=>{let A=u.emit.bind(u);u.emit=(p,...h)=>(p===\"error\"&&(e.error=Date.now(),e.phases.total=e.error-e.start,u.emit=A),A(p,...h))};r(t),t.prependOnceListener(\"abort\",()=>{e.abort=Date.now(),(!e.response||Zrt>=13)&&(e.phases.total=Date.now()-e.start)});let o=u=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let A=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};u.prependOnceListener(\"lookup\",A),Xrt.default(u,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(u.removeListener(\"lookup\",A),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};t.socket?o(t.socket):t.prependOnceListener(\"socket\",o);let a=()=>{var u;e.upload=Date.now(),e.phases.request=e.upload-(u=e.secureConnect,u??e.connect)};return(typeof t.writableFinished==\"boolean\"?t.writableFinished:t.finished&&t.outputSize===0&&(!t.socket||t.socket.writableLength===0))?a():t.prependOnceListener(\"finish\",a),t.prependOnceListener(\"response\",u=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,u.timings=e,r(u),u.prependOnceListener(\"end\",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};CO.default=EO;wO.exports=EO;wO.exports.default=EO});var coe=_((dLt,vO)=>{\"use strict\";var{V4MAPPED:$rt,ADDRCONFIG:ent,ALL:loe,promises:{Resolver:noe},lookup:tnt}=ve(\"dns\"),{promisify:IO}=ve(\"util\"),rnt=ve(\"os\"),$m=Symbol(\"cacheableLookupCreateConnection\"),BO=Symbol(\"cacheableLookupInstance\"),ioe=Symbol(\"expires\"),nnt=typeof loe==\"number\",soe=t=>{if(!(t&&typeof t.createConnection==\"function\"))throw new Error(\"Expected an Agent instance as the first argument\")},int=t=>{for(let e of t)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},ooe=()=>{let t=!1,e=!1;for(let r of Object.values(rnt.networkInterfaces()))for(let o of r)if(!o.internal&&(o.family===\"IPv6\"?e=!0:t=!0,t&&e))return{has4:t,has6:e};return{has4:t,has6:e}},snt=t=>Symbol.iterator in t,aoe={ttl:!0},ont={all:!0},Ob=class{constructor({cache:e=new Map,maxTtl:r=1/0,fallbackDuration:o=3600,errorTtl:a=.15,resolver:n=new noe,lookup:u=tnt}={}){if(this.maxTtl=r,this.errorTtl=a,this._cache=e,this._resolver=n,this._dnsLookup=IO(u),this._resolver instanceof noe?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=IO(this._resolver.resolve4.bind(this._resolver)),this._resolve6=IO(this._resolver.resolve6.bind(this._resolver))),this._iface=ooe(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,o<1)this._fallback=!1;else{this._fallback=!0;let A=setInterval(()=>{this._hostnamesToFallback.clear()},o*1e3);A.unref&&A.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,r,o){if(typeof r==\"function\"?(o=r,r={}):typeof r==\"number\"&&(r={family:r}),!o)throw new Error(\"Callback must be a function.\");this.lookupAsync(e,r).then(a=>{r.all?o(null,a):o(null,a.address,a.family,a.expires,a.ttl)},o)}async lookupAsync(e,r={}){typeof r==\"number\"&&(r={family:r});let o=await this.query(e);if(r.family===6){let a=o.filter(n=>n.family===6);r.hints&$rt&&(nnt&&r.hints&loe||a.length===0)?int(o):o=a}else r.family===4&&(o=o.filter(a=>a.family===4));if(r.hints&ent){let{_iface:a}=this;o=o.filter(n=>n.family===6?a.has6:a.has4)}if(o.length===0){let a=new Error(`cacheableLookup ENOTFOUND ${e}`);throw a.code=\"ENOTFOUND\",a.hostname=e,a}return r.all?o:o[0]}async query(e){let r=await this._cache.get(e);if(!r){let o=this._pending[e];if(o)r=await o;else{let a=this.queryAndCache(e);this._pending[e]=a,r=await a}}return r=r.map(o=>({...o})),r}async _resolve(e){let r=async h=>{try{return await h}catch(E){if(E.code===\"ENODATA\"||E.code===\"ENOTFOUND\")return[];throw E}},[o,a]=await Promise.all([this._resolve4(e,aoe),this._resolve6(e,aoe)].map(h=>r(h))),n=0,u=0,A=0,p=Date.now();for(let h of o)h.family=4,h.expires=p+h.ttl*1e3,n=Math.max(n,h.ttl);for(let h of a)h.family=6,h.expires=p+h.ttl*1e3,u=Math.max(u,h.ttl);return o.length>0?a.length>0?A=Math.min(n,u):A=n:A=u,{entries:[...o,...a],cacheTtl:A}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch{return{entries:[],cacheTtl:0}}}async _set(e,r,o){if(this.maxTtl>0&&o>0){o=Math.min(o,this.maxTtl)*1e3,r[ioe]=Date.now()+o;try{await this._cache.set(e,r,o)}catch(a){this.lookupAsync=async()=>{let n=new Error(\"Cache Error. Please recreate the CacheableLookup instance.\");throw n.cause=a,n}}snt(this._cache)&&this._tick(o)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,ont);try{let r=await this._resolve(e);r.entries.length===0&&this._fallback&&(r=await this._lookup(e),r.entries.length!==0&&this._hostnamesToFallback.add(e));let o=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(e,r.entries,o),delete this._pending[e],r.entries}catch(r){throw delete this._pending[e],r}}_tick(e){let r=this._nextRemovalTime;(!r||e<r)&&(clearTimeout(this._removalTimeout),this._nextRemovalTime=e,this._removalTimeout=setTimeout(()=>{this._nextRemovalTime=!1;let o=1/0,a=Date.now();for(let[n,u]of this._cache){let A=u[ioe];a>=A?this._cache.delete(n):A<o&&(o=A)}o!==1/0&&this._tick(o-a)},e),this._removalTimeout.unref&&this._removalTimeout.unref())}install(e){if(soe(e),$m in e)throw new Error(\"CacheableLookup has been already installed\");e[$m]=e.createConnection,e[BO]=this,e.createConnection=(r,o)=>(\"lookup\"in r||(r.lookup=this.lookup),e[$m](r,o))}uninstall(e){if(soe(e),e[$m]){if(e[BO]!==this)throw new Error(\"The agent is not owned by this CacheableLookup instance\");e.createConnection=e[$m],delete e[$m],delete e[BO]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=ooe(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};vO.exports=Ob;vO.exports.default=Ob});var foe=_((mLt,DO)=>{\"use strict\";var ant=typeof URL>\"u\"?ve(\"url\").URL:URL,lnt=\"text/plain\",cnt=\"us-ascii\",uoe=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),unt=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let o=r[1].split(\";\"),a=r[2],n=e?\"\":r[3],u=!1;o[o.length-1]===\"base64\"&&(o.pop(),u=!0);let A=(o.shift()||\"\").toLowerCase(),h=[...o.map(E=>{let[I,v=\"\"]=E.split(\"=\").map(x=>x.trim());return I===\"charset\"&&(v=v.toLowerCase(),v===cnt)?\"\":`${I}${v?`=${v}`:\"\"}`}).filter(Boolean)];return u&&h.push(\"base64\"),(h.length!==0||A&&A!==lnt)&&h.unshift(A),`data:${h.join(\";\")},${u?a.trim():a}${n?`#${n}`:\"\"}`},Aoe=(t,e)=>{if(e={defaultProtocol:\"http:\",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},Reflect.has(e,\"normalizeHttps\"))throw new Error(\"options.normalizeHttps is renamed to options.forceHttp\");if(Reflect.has(e,\"normalizeHttp\"))throw new Error(\"options.normalizeHttp is renamed to options.forceHttps\");if(Reflect.has(e,\"stripFragment\"))throw new Error(\"options.stripFragment is renamed to options.stripHash\");if(t=t.trim(),/^data:/i.test(t))return unt(t,e);let r=t.startsWith(\"//\");!r&&/^\\.*\\//.test(t)||(t=t.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//,e.defaultProtocol));let a=new ant(t);if(e.forceHttp&&e.forceHttps)throw new Error(\"The `forceHttp` and `forceHttps` options cannot be used together\");if(e.forceHttp&&a.protocol===\"https:\"&&(a.protocol=\"http:\"),e.forceHttps&&a.protocol===\"http:\"&&(a.protocol=\"https:\"),e.stripAuthentication&&(a.username=\"\",a.password=\"\"),e.stripHash&&(a.hash=\"\"),a.pathname&&(a.pathname=a.pathname.replace(/((?!:).|^)\\/{2,}/g,(n,u)=>/^(?!\\/)/g.test(u)?`${u}/`:\"/\")),a.pathname&&(a.pathname=decodeURI(a.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let n=a.pathname.split(\"/\"),u=n[n.length-1];uoe(u,e.removeDirectoryIndex)&&(n=n.slice(0,n.length-1),a.pathname=n.slice(1).join(\"/\")+\"/\")}if(a.hostname&&(a.hostname=a.hostname.replace(/\\.$/,\"\"),e.stripWWW&&/^www\\.([a-z\\-\\d]{2,63})\\.([a-z.]{2,5})$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\\./,\"\"))),Array.isArray(e.removeQueryParameters))for(let n of[...a.searchParams.keys()])uoe(n,e.removeQueryParameters)&&a.searchParams.delete(n);return e.sortQueryParameters&&a.searchParams.sort(),e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\\/$/,\"\")),t=a.toString(),(e.removeTrailingSlash||a.pathname===\"/\")&&a.hash===\"\"&&(t=t.replace(/\\/$/,\"\")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\\/\\//,\"//\")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\\/\\//,\"\")),t};DO.exports=Aoe;DO.exports.default=Aoe});var goe=_((yLt,hoe)=>{hoe.exports=poe;function poe(t,e){if(t&&e)return poe(t)(e);if(typeof t!=\"function\")throw new TypeError(\"need wrapper function\");return Object.keys(t).forEach(function(o){r[o]=t[o]}),r;function r(){for(var o=new Array(arguments.length),a=0;a<o.length;a++)o[a]=arguments[a];var n=t.apply(this,o),u=o[o.length-1];return typeof n==\"function\"&&n!==u&&Object.keys(u).forEach(function(A){n[A]=u[A]}),n}}});var bO=_((ELt,PO)=>{var doe=goe();PO.exports=doe(Ub);PO.exports.strict=doe(moe);Ub.proto=Ub(function(){Object.defineProperty(Function.prototype,\"once\",{value:function(){return Ub(this)},configurable:!0}),Object.defineProperty(Function.prototype,\"onceStrict\",{value:function(){return moe(this)},configurable:!0})});function Ub(t){var e=function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))};return e.called=!1,e}function moe(t){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},r=t.name||\"Function wrapped with `once`\";return e.onceError=r+\" shouldn't be called more than once\",e.called=!1,e}});var SO=_((CLt,Eoe)=>{var Ant=bO(),fnt=function(){},pnt=function(t){return t.setHeader&&typeof t.abort==\"function\"},hnt=function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},yoe=function(t,e,r){if(typeof e==\"function\")return yoe(t,null,e);e||(e={}),r=Ant(r||fnt);var o=t._writableState,a=t._readableState,n=e.readable||e.readable!==!1&&t.readable,u=e.writable||e.writable!==!1&&t.writable,A=function(){t.writable||p()},p=function(){u=!1,n||r.call(t)},h=function(){n=!1,u||r.call(t)},E=function(C){r.call(t,C?new Error(\"exited with error code: \"+C):null)},I=function(C){r.call(t,C)},v=function(){if(n&&!(a&&a.ended))return r.call(t,new Error(\"premature close\"));if(u&&!(o&&o.ended))return r.call(t,new Error(\"premature close\"))},x=function(){t.req.on(\"finish\",p)};return pnt(t)?(t.on(\"complete\",p),t.on(\"abort\",v),t.req?x():t.on(\"request\",x)):u&&!o&&(t.on(\"end\",A),t.on(\"close\",A)),hnt(t)&&t.on(\"exit\",E),t.on(\"end\",h),t.on(\"finish\",p),e.error!==!1&&t.on(\"error\",I),t.on(\"close\",v),function(){t.removeListener(\"complete\",p),t.removeListener(\"abort\",v),t.removeListener(\"request\",x),t.req&&t.req.removeListener(\"finish\",p),t.removeListener(\"end\",A),t.removeListener(\"close\",A),t.removeListener(\"finish\",p),t.removeListener(\"exit\",E),t.removeListener(\"end\",h),t.removeListener(\"error\",I),t.removeListener(\"close\",v)}};Eoe.exports=yoe});var Ioe=_((wLt,woe)=>{var gnt=bO(),dnt=SO(),xO=ve(\"fs\"),JI=function(){},mnt=/^v?\\.0/.test(process.version),_b=function(t){return typeof t==\"function\"},ynt=function(t){return!mnt||!xO?!1:(t instanceof(xO.ReadStream||JI)||t instanceof(xO.WriteStream||JI))&&_b(t.close)},Ent=function(t){return t.setHeader&&_b(t.abort)},Cnt=function(t,e,r,o){o=gnt(o);var a=!1;t.on(\"close\",function(){a=!0}),dnt(t,{readable:e,writable:r},function(u){if(u)return o(u);a=!0,o()});var n=!1;return function(u){if(!a&&!n){if(n=!0,ynt(t))return t.close(JI);if(Ent(t))return t.abort();if(_b(t.destroy))return t.destroy();o(u||new Error(\"stream was destroyed\"))}}},Coe=function(t){t()},wnt=function(t,e){return t.pipe(e)},Int=function(){var t=Array.prototype.slice.call(arguments),e=_b(t[t.length-1]||JI)&&t.pop()||JI;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error(\"pump requires two streams per minimum\");var r,o=t.map(function(a,n){var u=n<t.length-1,A=n>0;return Cnt(a,u,A,function(p){r||(r=p),p&&o.forEach(Coe),!u&&(o.forEach(Coe),e(r))})});return t.reduce(wnt)};woe.exports=Int});var voe=_((ILt,Boe)=>{\"use strict\";var{PassThrough:Bnt}=ve(\"stream\");Boe.exports=t=>{t={...t};let{array:e}=t,{encoding:r}=t,o=r===\"buffer\",a=!1;e?a=!(r||o):r=r||\"utf8\",o&&(r=null);let n=new Bnt({objectMode:a});r&&n.setEncoding(r);let u=0,A=[];return n.on(\"data\",p=>{A.push(p),a?u=A.length:u+=p.length}),n.getBufferedValue=()=>e?A:o?Buffer.concat(A,u):A.join(\"\"),n.getBufferedLength=()=>u,n}});var Doe=_((BLt,ey)=>{\"use strict\";var vnt=Ioe(),Dnt=voe(),Hb=class extends Error{constructor(){super(\"maxBuffer exceeded\"),this.name=\"MaxBufferError\"}};async function qb(t,e){if(!t)return Promise.reject(new Error(\"Expected a stream\"));e={maxBuffer:1/0,...e};let{maxBuffer:r}=e,o;return await new Promise((a,n)=>{let u=A=>{A&&(A.bufferedData=o.getBufferedValue()),n(A)};o=vnt(t,Dnt(e),A=>{if(A){u(A);return}a()}),o.on(\"data\",()=>{o.getBufferedLength()>r&&u(new Hb)})}),o.getBufferedValue()}ey.exports=qb;ey.exports.default=qb;ey.exports.buffer=(t,e)=>qb(t,{...e,encoding:\"buffer\"});ey.exports.array=(t,e)=>qb(t,{...e,array:!0});ey.exports.MaxBufferError=Hb});var boe=_((DLt,Poe)=>{\"use strict\";var Pnt=new Set([200,203,204,206,300,301,308,404,405,410,414,501]),bnt=new Set([200,203,204,300,301,302,303,307,308,404,405,410,414,501]),Snt=new Set([500,502,503,504]),xnt={date:!0,connection:!0,\"keep-alive\":!0,\"proxy-authenticate\":!0,\"proxy-authorization\":!0,te:!0,trailer:!0,\"transfer-encoding\":!0,upgrade:!0},knt={\"content-length\":!0,\"content-encoding\":!0,\"transfer-encoding\":!0,\"content-range\":!0};function Eg(t){let e=parseInt(t,10);return isFinite(e)?e:0}function Qnt(t){return t?Snt.has(t.status):!0}function kO(t){let e={};if(!t)return e;let r=t.trim().split(/,/);for(let o of r){let[a,n]=o.split(/=/,2);e[a.trim()]=n===void 0?!0:n.trim().replace(/^\"|\"$/g,\"\")}return e}function Fnt(t){let e=[];for(let r in t){let o=t[r];e.push(o===!0?r:r+\"=\"+o)}if(e.length)return e.join(\", \")}Poe.exports=class{constructor(e,r,{shared:o,cacheHeuristic:a,immutableMinTimeToLive:n,ignoreCargoCult:u,_fromObject:A}={}){if(A){this._fromObject(A);return}if(!r||!r.headers)throw Error(\"Response headers missing\");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=o!==!1,this._cacheHeuristic=a!==void 0?a:.1,this._immutableMinTtl=n!==void 0?n:24*3600*1e3,this._status=\"status\"in r?r.status:200,this._resHeaders=r.headers,this._rescc=kO(r.headers[\"cache-control\"]),this._method=\"method\"in e?e.method:\"GET\",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=r.headers.vary?e.headers:null,this._reqcc=kO(e.headers[\"cache-control\"]),u&&\"pre-check\"in this._rescc&&\"post-check\"in this._rescc&&(delete this._rescc[\"pre-check\"],delete this._rescc[\"post-check\"],delete this._rescc[\"no-cache\"],delete this._rescc[\"no-store\"],delete this._rescc[\"must-revalidate\"],this._resHeaders=Object.assign({},this._resHeaders,{\"cache-control\":Fnt(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),r.headers[\"cache-control\"]==null&&/no-cache/.test(r.headers.pragma)&&(this._rescc[\"no-cache\"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc[\"no-store\"]&&(this._method===\"GET\"||this._method===\"HEAD\"||this._method===\"POST\"&&this._hasExplicitExpiration())&&bnt.has(this._status)&&!this._rescc[\"no-store\"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc[\"max-age\"]||this._isShared&&this._rescc[\"s-maxage\"]||this._rescc.public||Pnt.has(this._status)))}_hasExplicitExpiration(){return this._isShared&&this._rescc[\"s-maxage\"]||this._rescc[\"max-age\"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error(\"Request headers missing\")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let r=kO(e.headers[\"cache-control\"]);return r[\"no-cache\"]||/no-cache/.test(e.headers.pragma)||r[\"max-age\"]&&this.age()>r[\"max-age\"]||r[\"min-fresh\"]&&this.timeToLive()<1e3*r[\"min-fresh\"]||this.stale()&&!(r[\"max-stale\"]&&!this._rescc[\"must-revalidate\"]&&(r[\"max-stale\"]===!0||r[\"max-stale\"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||r&&e.method===\"HEAD\")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc[\"must-revalidate\"]||this._rescc.public||this._rescc[\"s-maxage\"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary===\"*\")return!1;let r=this._resHeaders.vary.trim().toLowerCase().split(/\\s*,\\s*/);for(let o of r)if(e.headers[o]!==this._reqHeaders[o])return!1;return!0}_copyWithoutHopByHopHeaders(e){let r={};for(let o in e)xnt[o]||(r[o]=e[o]);if(e.connection){let o=e.connection.trim().split(/\\s*,\\s*/);for(let a of o)delete r[a]}if(r.warning){let o=r.warning.split(/,/).filter(a=>!/^\\s*1[0-9][0-9]/.test(a));o.length?r.warning=o.join(\",\").trim():delete r.warning}return r}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:\"\")+'113 - \"rfc7234 5.5.4\"'),e.age=`${Math.round(r)}`,e.date=new Date(this.now()).toUTCString(),e}date(){let e=Date.parse(this._resHeaders.date);return isFinite(e)?e:this._responseTime}age(){let e=this._ageValue(),r=(this.now()-this._responseTime)/1e3;return e+r}_ageValue(){return Eg(this._resHeaders.age)}maxAge(){if(!this.storable()||this._rescc[\"no-cache\"]||this._isShared&&this._resHeaders[\"set-cookie\"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary===\"*\")return 0;if(this._isShared){if(this._rescc[\"proxy-revalidate\"])return 0;if(this._rescc[\"s-maxage\"])return Eg(this._rescc[\"s-maxage\"])}if(this._rescc[\"max-age\"])return Eg(this._rescc[\"max-age\"]);let e=this._rescc.immutable?this._immutableMinTtl:0,r=this.date();if(this._resHeaders.expires){let o=Date.parse(this._resHeaders.expires);return Number.isNaN(o)||o<r?0:Math.max(e,(o-r)/1e3)}if(this._resHeaders[\"last-modified\"]){let o=Date.parse(this._resHeaders[\"last-modified\"]);if(isFinite(o)&&r>o)return Math.max(e,(r-o)/1e3*this._cacheHeuristic)}return e}timeToLive(){let e=this.maxAge()-this.age(),r=e+Eg(this._rescc[\"stale-if-error\"]),o=e+Eg(this._rescc[\"stale-while-revalidate\"]);return Math.max(0,e,r,o)*1e3}stale(){return this.maxAge()<=this.age()}_useStaleIfError(){return this.maxAge()+Eg(this._rescc[\"stale-if-error\"])>this.age()}useStaleWhileRevalidate(){return this.maxAge()+Eg(this._rescc[\"stale-while-revalidate\"])>this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error(\"Reinitialized\");if(!e||e.v!==1)throw Error(\"Invalid serialization\");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let r=this._copyWithoutHopByHopHeaders(e.headers);if(delete r[\"if-range\"],!this._requestMatches(e,!0)||!this.storable())return delete r[\"if-none-match\"],delete r[\"if-modified-since\"],r;if(this._resHeaders.etag&&(r[\"if-none-match\"]=r[\"if-none-match\"]?`${r[\"if-none-match\"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),r[\"accept-ranges\"]||r[\"if-match\"]||r[\"if-unmodified-since\"]||this._method&&this._method!=\"GET\"){if(delete r[\"if-modified-since\"],r[\"if-none-match\"]){let a=r[\"if-none-match\"].split(/,/).filter(n=>!/^\\s*W\\//.test(n));a.length?r[\"if-none-match\"]=a.join(\",\").trim():delete r[\"if-none-match\"]}}else this._resHeaders[\"last-modified\"]&&!r[\"if-modified-since\"]&&(r[\"if-modified-since\"]=this._resHeaders[\"last-modified\"]);return r}revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),this._useStaleIfError()&&Qnt(r))return{modified:!1,matches:!1,policy:this};if(!r||!r.headers)throw Error(\"Response headers missing\");let o=!1;if(r.status!==void 0&&r.status!=304?o=!1:r.headers.etag&&!/^\\s*W\\//.test(r.headers.etag)?o=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\\s*W\\//,\"\")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?o=this._resHeaders.etag.replace(/^\\s*W\\//,\"\")===r.headers.etag.replace(/^\\s*W\\//,\"\"):this._resHeaders[\"last-modified\"]?o=this._resHeaders[\"last-modified\"]===r.headers[\"last-modified\"]:!this._resHeaders.etag&&!this._resHeaders[\"last-modified\"]&&!r.headers.etag&&!r.headers[\"last-modified\"]&&(o=!0),!o)return{policy:new this.constructor(e,r),modified:r.status!=304,matches:!1};let a={};for(let u in this._resHeaders)a[u]=u in r.headers&&!knt[u]?r.headers[u]:this._resHeaders[u];let n=Object.assign({},r,{status:this._status,method:this._method,headers:a});return{policy:new this.constructor(e,n,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl}),modified:!1,matches:!0}}}});var jb=_((PLt,Soe)=>{\"use strict\";Soe.exports=t=>{let e={};for(let[r,o]of Object.entries(t))e[r.toLowerCase()]=o;return e}});var koe=_((bLt,xoe)=>{\"use strict\";var Rnt=ve(\"stream\").Readable,Tnt=jb(),QO=class extends Rnt{constructor(e,r,o,a){if(typeof e!=\"number\")throw new TypeError(\"Argument `statusCode` should be a number\");if(typeof r!=\"object\")throw new TypeError(\"Argument `headers` should be an object\");if(!(o instanceof Buffer))throw new TypeError(\"Argument `body` should be a buffer\");if(typeof a!=\"string\")throw new TypeError(\"Argument `url` should be a string\");super(),this.statusCode=e,this.headers=Tnt(r),this.body=o,this.url=a}_read(){this.push(this.body),this.push(null)}};xoe.exports=QO});var Foe=_((SLt,Qoe)=>{\"use strict\";var Nnt=[\"destroy\",\"setTimeout\",\"socket\",\"headers\",\"trailers\",\"rawHeaders\",\"statusCode\",\"httpVersion\",\"httpVersionMinor\",\"httpVersionMajor\",\"rawTrailers\",\"statusMessage\"];Qoe.exports=(t,e)=>{let r=new Set(Object.keys(t).concat(Nnt));for(let o of r)o in e||(e[o]=typeof t[o]==\"function\"?t[o].bind(t):t[o])}});var Toe=_((xLt,Roe)=>{\"use strict\";var Lnt=ve(\"stream\").PassThrough,Mnt=Foe(),Ont=t=>{if(!(t&&t.pipe))throw new TypeError(\"Parameter `response` must be a response stream.\");let e=new Lnt;return Mnt(t,e),t.pipe(e)};Roe.exports=Ont});var Noe=_(FO=>{FO.stringify=function t(e){if(typeof e>\"u\")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(\":base64:\"+e.toString(\"base64\"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e==\"object\"){var r=\"\",o=Array.isArray(e);r=o?\"[\":\"{\";var a=!0;for(var n in e){var u=typeof e[n]==\"function\"||!o&&typeof e[n]>\"u\";Object.hasOwnProperty.call(e,n)&&!u&&(a||(r+=\",\"),a=!1,o?e[n]==null?r+=\"null\":r+=t(e[n]):e[n]!==void 0&&(r+=t(n)+\":\"+t(e[n])))}return r+=o?\"]\":\"}\",r}else return typeof e==\"string\"?JSON.stringify(/^:/.test(e)?\":\"+e:e):typeof e>\"u\"?\"null\":JSON.stringify(e)};FO.parse=function(t){return JSON.parse(t,function(e,r){return typeof r==\"string\"?/^:base64:/.test(r)?Buffer.from(r.substring(8),\"base64\"):/^:/.test(r)?r.substring(1):r:r})}});var Uoe=_((QLt,Ooe)=>{\"use strict\";var Unt=ve(\"events\"),Loe=Noe(),_nt=t=>{let e={redis:\"@keyv/redis\",rediss:\"@keyv/redis\",mongodb:\"@keyv/mongo\",mongo:\"@keyv/mongo\",sqlite:\"@keyv/sqlite\",postgresql:\"@keyv/postgres\",postgres:\"@keyv/postgres\",mysql:\"@keyv/mysql\",etcd:\"@keyv/etcd\",offline:\"@keyv/offline\",tiered:\"@keyv/tiered\"};if(t.adapter||t.uri){let r=t.adapter||/^[^:+]*/.exec(t.uri)[0];return new(ve(e[r]))(t)}return new Map},Moe=[\"sqlite\",\"postgres\",\"mysql\",\"mongo\",\"redis\",\"tiered\"],RO=class extends Unt{constructor(e,{emitErrors:r=!0,...o}={}){if(super(),this.opts={namespace:\"keyv\",serialize:Loe.stringify,deserialize:Loe.parse,...typeof e==\"string\"?{uri:e}:e,...o},!this.opts.store){let n={...this.opts};this.opts.store=_nt(n)}if(this.opts.compression){let n=this.opts.compression;this.opts.serialize=n.serialize.bind(n),this.opts.deserialize=n.deserialize.bind(n)}typeof this.opts.store.on==\"function\"&&r&&this.opts.store.on(\"error\",n=>this.emit(\"error\",n)),this.opts.store.namespace=this.opts.namespace;let a=n=>async function*(){for await(let[u,A]of typeof n==\"function\"?n(this.opts.store.namespace):n){let p=await this.opts.deserialize(A);if(!(this.opts.store.namespace&&!u.includes(this.opts.store.namespace))){if(typeof p.expires==\"number\"&&Date.now()>p.expires){this.delete(u);continue}yield[this._getKeyUnprefix(u),p.value]}}};typeof this.opts.store[Symbol.iterator]==\"function\"&&this.opts.store instanceof Map?this.iterator=a(this.opts.store):typeof this.opts.store.iterator==\"function\"&&this.opts.store.opts&&this._checkIterableAdaptar()&&(this.iterator=a(this.opts.store.iterator.bind(this.opts.store)))}_checkIterableAdaptar(){return Moe.includes(this.opts.store.opts.dialect)||Moe.findIndex(e=>this.opts.store.opts.url.includes(e))>=0}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}_getKeyPrefixArray(e){return e.map(r=>`${this.opts.namespace}:${r}`)}_getKeyUnprefix(e){return e.split(\":\").splice(1).join(\":\")}get(e,r){let{store:o}=this.opts,a=Array.isArray(e),n=a?this._getKeyPrefixArray(e):this._getKeyPrefix(e);if(a&&o.getMany===void 0){let u=[];for(let A of n)u.push(Promise.resolve().then(()=>o.get(A)).then(p=>typeof p==\"string\"?this.opts.deserialize(p):this.opts.compression?this.opts.deserialize(p):p).then(p=>{if(p!=null)return typeof p.expires==\"number\"&&Date.now()>p.expires?this.delete(A).then(()=>{}):r&&r.raw?p:p.value}));return Promise.allSettled(u).then(A=>{let p=[];for(let h of A)p.push(h.value);return p})}return Promise.resolve().then(()=>a?o.getMany(n):o.get(n)).then(u=>typeof u==\"string\"?this.opts.deserialize(u):this.opts.compression?this.opts.deserialize(u):u).then(u=>{if(u!=null)return a?u.map((A,p)=>{if(typeof A==\"string\"&&(A=this.opts.deserialize(A)),A!=null){if(typeof A.expires==\"number\"&&Date.now()>A.expires){this.delete(e[p]).then(()=>{});return}return r&&r.raw?A:A.value}}):typeof u.expires==\"number\"&&Date.now()>u.expires?this.delete(e).then(()=>{}):r&&r.raw?u:u.value})}set(e,r,o){let a=this._getKeyPrefix(e);typeof o>\"u\"&&(o=this.opts.ttl),o===0&&(o=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let u=typeof o==\"number\"?Date.now()+o:null;return typeof r==\"symbol\"&&this.emit(\"error\",\"symbol cannot be serialized\"),r={value:r,expires:u},this.opts.serialize(r)}).then(u=>n.set(a,u,o)).then(()=>!0)}delete(e){let{store:r}=this.opts;if(Array.isArray(e)){let a=this._getKeyPrefixArray(e);if(r.deleteMany===void 0){let n=[];for(let u of a)n.push(r.delete(u));return Promise.allSettled(n).then(u=>u.every(A=>A.value===!0))}return Promise.resolve().then(()=>r.deleteMany(a))}let o=this._getKeyPrefix(e);return Promise.resolve().then(()=>r.delete(o))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}has(e){let r=this._getKeyPrefix(e),{store:o}=this.opts;return Promise.resolve().then(async()=>typeof o.has==\"function\"?o.has(r):await o.get(r)!==void 0)}disconnect(){let{store:e}=this.opts;if(typeof e.disconnect==\"function\")return e.disconnect()}};Ooe.exports=RO});var qoe=_((RLt,Hoe)=>{\"use strict\";var Hnt=ve(\"events\"),Gb=ve(\"url\"),qnt=foe(),jnt=Doe(),TO=boe(),_oe=koe(),Gnt=jb(),Ynt=Toe(),Wnt=Uoe(),XI=class t{constructor(e,r){if(typeof e!=\"function\")throw new TypeError(\"Parameter `request` must be a function\");return this.cache=new Wnt({uri:typeof r==\"string\"&&r,store:typeof r!=\"string\"&&r,namespace:\"cacheable-request\"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(r,o)=>{let a;if(typeof r==\"string\")a=NO(Gb.parse(r)),r={};else if(r instanceof Gb.URL)a=NO(Gb.parse(r.toString())),r={};else{let[I,...v]=(r.path||\"\").split(\"?\"),x=v.length>0?`?${v.join(\"?\")}`:\"\";a=NO({...r,pathname:I,search:x})}r={headers:{},method:\"GET\",cache:!0,strictTtl:!1,automaticFailover:!1,...r,...Knt(a)},r.headers=Gnt(r.headers);let n=new Hnt,u=qnt(Gb.format(a),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),A=`${r.method}:${u}`,p=!1,h=!1,E=I=>{h=!0;let v=!1,x,C=new Promise(L=>{x=()=>{v||(v=!0,L())}}),R=L=>{if(p&&!I.forceRefresh){L.status=L.statusCode;let z=TO.fromObject(p.cachePolicy).revalidatedPolicy(I,L);if(!z.modified){let te=z.policy.responseHeaders();L=new _oe(p.statusCode,te,p.body,p.url),L.cachePolicy=z.policy,L.fromCache=!0}}L.fromCache||(L.cachePolicy=new TO(I,L,I),L.fromCache=!1);let U;I.cache&&L.cachePolicy.storable()?(U=Ynt(L),(async()=>{try{let z=jnt.buffer(L);if(await Promise.race([C,new Promise(ce=>L.once(\"end\",ce))]),v)return;let te=await z,ae={cachePolicy:L.cachePolicy.toObject(),url:L.url,statusCode:L.fromCache?p.statusCode:L.statusCode,body:te},le=I.strictTtl?L.cachePolicy.timeToLive():void 0;I.maxTtl&&(le=le?Math.min(le,I.maxTtl):I.maxTtl),await this.cache.set(A,ae,le)}catch(z){n.emit(\"error\",new t.CacheError(z))}})()):I.cache&&p&&(async()=>{try{await this.cache.delete(A)}catch(z){n.emit(\"error\",new t.CacheError(z))}})(),n.emit(\"response\",U||L),typeof o==\"function\"&&o(U||L)};try{let L=e(I,R);L.once(\"error\",x),L.once(\"abort\",x),n.emit(\"request\",L)}catch(L){n.emit(\"error\",new t.RequestError(L))}};return(async()=>{let I=async x=>{await Promise.resolve();let C=x.cache?await this.cache.get(A):void 0;if(typeof C>\"u\")return E(x);let R=TO.fromObject(C.cachePolicy);if(R.satisfiesWithoutRevalidation(x)&&!x.forceRefresh){let L=R.responseHeaders(),U=new _oe(C.statusCode,L,C.body,C.url);U.cachePolicy=R,U.fromCache=!0,n.emit(\"response\",U),typeof o==\"function\"&&o(U)}else p=C,x.headers=R.revalidationHeaders(x),E(x)},v=x=>n.emit(\"error\",new t.CacheError(x));this.cache.once(\"error\",v),n.on(\"response\",()=>this.cache.removeListener(\"error\",v));try{await I(r)}catch(x){r.automaticFailover&&!h&&E(r),n.emit(\"error\",new t.CacheError(x))}})(),n}}};function Knt(t){let e={...t};return e.path=`${t.pathname||\"/\"}${t.search||\"\"}`,delete e.pathname,delete e.search,e}function NO(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostname||t.host||\"localhost\",port:t.port,pathname:t.pathname,search:t.search}}XI.RequestError=class extends Error{constructor(t){super(t.message),this.name=\"RequestError\",Object.assign(this,t)}};XI.CacheError=class extends Error{constructor(t){super(t.message),this.name=\"CacheError\",Object.assign(this,t)}};Hoe.exports=XI});var Goe=_((LLt,joe)=>{\"use strict\";var Vnt=[\"aborted\",\"complete\",\"headers\",\"httpVersion\",\"httpVersionMinor\",\"httpVersionMajor\",\"method\",\"rawHeaders\",\"rawTrailers\",\"setTimeout\",\"socket\",\"statusCode\",\"statusMessage\",\"trailers\",\"url\"];joe.exports=(t,e)=>{if(e._readableState.autoDestroy)throw new Error(\"The second stream must have the `autoDestroy` option set to `false`\");let r=new Set(Object.keys(t).concat(Vnt)),o={};for(let a of r)a in e||(o[a]={get(){let n=t[a];return typeof n==\"function\"?n.bind(t):n},set(n){t[a]=n},enumerable:!0,configurable:!1});return Object.defineProperties(e,o),t.once(\"aborted\",()=>{e.destroy(),e.emit(\"aborted\")}),t.once(\"close\",()=>{t.complete&&e.readable?e.once(\"end\",()=>{e.emit(\"close\")}):e.emit(\"close\")}),e}});var Woe=_((MLt,Yoe)=>{\"use strict\";var{Transform:znt,PassThrough:Jnt}=ve(\"stream\"),LO=ve(\"zlib\"),Xnt=Goe();Yoe.exports=t=>{let e=(t.headers[\"content-encoding\"]||\"\").toLowerCase();if(![\"gzip\",\"deflate\",\"br\"].includes(e))return t;let r=e===\"br\";if(r&&typeof LO.createBrotliDecompress!=\"function\")return t.destroy(new Error(\"Brotli is not supported on Node.js < 12\")),t;let o=!0,a=new znt({transform(A,p,h){o=!1,h(null,A)},flush(A){A()}}),n=new Jnt({autoDestroy:!1,destroy(A,p){t.destroy(),p(A)}}),u=r?LO.createBrotliDecompress():LO.createUnzip();return u.once(\"error\",A=>{if(o&&!t.readable){n.end();return}n.destroy(A)}),Xnt(t,n),t.pipe(a).pipe(u).pipe(n),n}});var OO=_((OLt,Koe)=>{\"use strict\";var MO=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError(\"`maxSize` must be a number greater than 0\");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction==\"function\")for(let[o,a]of this.oldCache.entries())this.onEviction(o,a);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let r=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,r),r}}set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCache.delete(e)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[r]=e;this.cache.has(r)||(yield e)}}get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||e++;return Math.min(this._size+e,this.maxSize)}};Koe.exports=MO});var _O=_((ULt,Xoe)=>{\"use strict\";var Znt=ve(\"events\"),$nt=ve(\"tls\"),eit=ve(\"http2\"),tit=OO(),ra=Symbol(\"currentStreamsCount\"),Voe=Symbol(\"request\"),Kl=Symbol(\"cachedOriginSet\"),ty=Symbol(\"gracefullyClosing\"),rit=[\"maxDeflateDynamicTableSize\",\"maxSessionMemory\",\"maxHeaderListPairs\",\"maxOutstandingPings\",\"maxReservedRemoteStreams\",\"maxSendHeaderBlockLength\",\"paddingStrategy\",\"localAddress\",\"path\",\"rejectUnauthorized\",\"minDHSize\",\"ca\",\"cert\",\"clientCertEngine\",\"ciphers\",\"key\",\"pfx\",\"servername\",\"minVersion\",\"maxVersion\",\"secureProtocol\",\"crl\",\"honorCipherOrder\",\"ecdhCurve\",\"dhparam\",\"secureOptions\",\"sessionIdContext\"],nit=(t,e,r)=>{let o=0,a=t.length;for(;o<a;){let n=o+a>>>1;r(t[n],e)?o=n+1:a=n}return o},iit=(t,e)=>t.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,UO=(t,e)=>{for(let r of t)r[Kl].length<e[Kl].length&&r[Kl].every(o=>e[Kl].includes(o))&&r[ra]+e[ra]<=e.remoteSettings.maxConcurrentStreams&&Joe(r)},sit=(t,e)=>{for(let r of t)e[Kl].length<r[Kl].length&&e[Kl].every(o=>r[Kl].includes(o))&&e[ra]+r[ra]<=r.remoteSettings.maxConcurrentStreams&&Joe(e)},zoe=({agent:t,isFree:e})=>{let r={};for(let o in t.sessions){let n=t.sessions[o].filter(u=>{let A=u[Cg.kCurrentStreamsCount]<u.remoteSettings.maxConcurrentStreams;return e?A:!A});n.length!==0&&(r[o]=n)}return r},Joe=t=>{t[ty]=!0,t[ra]===0&&t.close()},Cg=class t extends Znt{constructor({timeout:e=6e4,maxSessions:r=1/0,maxFreeSessions:o=10,maxCachedTlsSessions:a=100}={}){super(),this.sessions={},this.queue={},this.timeout=e,this.maxSessions=r,this.maxFreeSessions=o,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new tit({maxSize:a})}static normalizeOrigin(e,r){return typeof e==\"string\"&&(e=new URL(e)),r&&e.hostname!==r&&(e.hostname=r),e.origin}normalizeOptions(e){let r=\"\";if(e)for(let o of rit)e[o]&&(r+=`:${e[o]}`);return r}_tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e]))return;let o=this.queue[e][r];this._sessionsCount<this.maxSessions&&!o.completed&&(o.completed=!0,o())}getSession(e,r,o){return new Promise((a,n)=>{Array.isArray(o)?(o=[...o],a()):o=[{resolve:a,reject:n}];let u=this.normalizeOptions(r),A=t.normalizeOrigin(e,r&&r.servername);if(A===void 0){for(let{reject:E}of o)E(new TypeError(\"The `origin` argument needs to be a string or an URL object\"));return}if(u in this.sessions){let E=this.sessions[u],I=-1,v=-1,x;for(let C of E){let R=C.remoteSettings.maxConcurrentStreams;if(R<I)break;if(C[Kl].includes(A)){let L=C[ra];if(L>=R||C[ty]||C.destroyed)continue;x||(I=R),L>v&&(x=C,v=L)}}if(x){if(o.length!==1){for(let{reject:C}of o){let R=new Error(`Expected the length of listeners to be 1, got ${o.length}.\nPlease report this to https://github.com/szmarczak/http2-wrapper/`);C(R)}return}o[0].resolve(x);return}}if(u in this.queue){if(A in this.queue[u]){this.queue[u][A].listeners.push(...o),this._tryToCreateNewSession(u,A);return}}else this.queue[u]={};let p=()=>{u in this.queue&&this.queue[u][A]===h&&(delete this.queue[u][A],Object.keys(this.queue[u]).length===0&&delete this.queue[u])},h=()=>{let E=`${A}:${u}`,I=!1;try{let v=eit.connect(e,{createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(E),...r});v[ra]=0,v[ty]=!1;let x=()=>v[ra]<v.remoteSettings.maxConcurrentStreams,C=!0;v.socket.once(\"session\",L=>{this.tlsSessionCache.set(E,L)}),v.once(\"error\",L=>{for(let{reject:U}of o)U(L);this.tlsSessionCache.delete(E)}),v.setTimeout(this.timeout,()=>{v.destroy()}),v.once(\"close\",()=>{if(I){C&&this._freeSessionsCount--,this._sessionsCount--;let L=this.sessions[u];L.splice(L.indexOf(v),1),L.length===0&&delete this.sessions[u]}else{let L=new Error(\"Session closed without receiving a SETTINGS frame\");L.code=\"HTTP2WRAPPER_NOSETTINGS\";for(let{reject:U}of o)U(L);p()}this._tryToCreateNewSession(u,A)});let R=()=>{if(!(!(u in this.queue)||!x())){for(let L of v[Kl])if(L in this.queue[u]){let{listeners:U}=this.queue[u][L];for(;U.length!==0&&x();)U.shift().resolve(v);let z=this.queue[u];if(z[L].listeners.length===0&&(delete z[L],Object.keys(z).length===0)){delete this.queue[u];break}if(!x())break}}};v.on(\"origin\",()=>{v[Kl]=v.originSet,x()&&(R(),UO(this.sessions[u],v))}),v.once(\"remoteSettings\",()=>{if(v.ref(),v.unref(),this._sessionsCount++,h.destroyed){let L=new Error(\"Agent has been destroyed\");for(let U of o)U.reject(L);v.destroy();return}v[Kl]=v.originSet;{let L=this.sessions;if(u in L){let U=L[u];U.splice(nit(U,v,iit),0,v)}else L[u]=[v]}this._freeSessionsCount+=1,I=!0,this.emit(\"session\",v),R(),p(),v[ra]===0&&this._freeSessionsCount>this.maxFreeSessions&&v.close(),o.length!==0&&(this.getSession(A,r,o),o.length=0),v.on(\"remoteSettings\",()=>{R(),UO(this.sessions[u],v)})}),v[Voe]=v.request,v.request=(L,U)=>{if(v[ty])throw new Error(\"The session is gracefully closing. No new streams are allowed.\");let z=v[Voe](L,U);return v.ref(),++v[ra],v[ra]===v.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,z.once(\"close\",()=>{if(C=x(),--v[ra],!v.destroyed&&!v.closed&&(sit(this.sessions[u],v),x()&&!v.closed)){C||(this._freeSessionsCount++,C=!0);let te=v[ra]===0;te&&v.unref(),te&&(this._freeSessionsCount>this.maxFreeSessions||v[ty])?v.close():(UO(this.sessions[u],v),R())}}),z}}catch(v){for(let x of o)x.reject(v);p()}};h.listeners=o,h.completed=!1,h.destroyed=!1,this.queue[u][A]=h,this._tryToCreateNewSession(u,A)})}request(e,r,o,a){return new Promise((n,u)=>{this.getSession(e,r,[{reject:u,resolve:A=>{try{n(A.request(o,a))}catch(p){u(p)}}}])})}createConnection(e,r){return t.connect(e,r)}static connect(e,r){r.ALPNProtocols=[\"h2\"];let o=e.port||443,a=e.hostname||e.host;return typeof r.servername>\"u\"&&(r.servername=a),$nt.connect(o,a,r)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r of e)r[ra]===0&&r.close()}destroy(e){for(let r of Object.values(this.sessions))for(let o of r)o.destroy(e);for(let r of Object.values(this.queue))for(let o of Object.values(r))o.destroyed=!0;this.queue={}}get freeSessions(){return zoe({agent:this,isFree:!0})}get busySessions(){return zoe({agent:this,isFree:!1})}};Cg.kCurrentStreamsCount=ra;Cg.kGracefullyClosing=ty;Xoe.exports={Agent:Cg,globalAgent:new Cg}});var qO=_((_Lt,Zoe)=>{\"use strict\";var{Readable:oit}=ve(\"stream\"),HO=class extends oit{constructor(e,r){super({highWaterMark:r,autoDestroy:!1}),this.statusCode=null,this.statusMessage=\"\",this.httpVersion=\"2.0\",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,r){return this.req.setTimeout(e,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners(\"data\"),this.resume())}_read(){this.req&&this.req._request.resume()}};Zoe.exports=HO});var jO=_((HLt,$oe)=>{\"use strict\";$oe.exports=t=>{let e={protocol:t.protocol,hostname:typeof t.hostname==\"string\"&&t.hostname.startsWith(\"[\")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||\"\"}${t.search||\"\"}`};return typeof t.port==\"string\"&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||\"\"}:${t.password||\"\"}`),e}});var tae=_((qLt,eae)=>{\"use strict\";eae.exports=(t,e,r)=>{for(let o of r)t.on(o,(...a)=>e.emit(o,...a))}});var nae=_((jLt,rae)=>{\"use strict\";rae.exports=t=>{switch(t){case\":method\":case\":scheme\":case\":authority\":case\":path\":return!0;default:return!1}}});var sae=_((YLt,iae)=>{\"use strict\";var ry=(t,e,r)=>{iae.exports[e]=class extends t{constructor(...a){super(typeof r==\"string\"?r:r(a)),this.name=`${super.name} [${e}]`,this.code=e}}};ry(TypeError,\"ERR_INVALID_ARG_TYPE\",t=>{let e=t[0].includes(\".\")?\"property\":\"argument\",r=t[1],o=Array.isArray(r);return o&&(r=`${r.slice(0,-1).join(\", \")} or ${r.slice(-1)}`),`The \"${t[0]}\" ${e} must be ${o?\"one of\":\"of\"} type ${r}. Received ${typeof t[2]}`});ry(TypeError,\"ERR_INVALID_PROTOCOL\",t=>`Protocol \"${t[0]}\" not supported. Expected \"${t[1]}\"`);ry(Error,\"ERR_HTTP_HEADERS_SENT\",t=>`Cannot ${t[0]} headers after they are sent to the client`);ry(TypeError,\"ERR_INVALID_HTTP_TOKEN\",t=>`${t[0]} must be a valid HTTP token [${t[1]}]`);ry(TypeError,\"ERR_HTTP_INVALID_HEADER_VALUE\",t=>`Invalid value \"${t[0]} for header \"${t[1]}\"`);ry(TypeError,\"ERR_INVALID_CHAR\",t=>`Invalid character in ${t[0]} [${t[1]}]`)});var VO=_((WLt,fae)=>{\"use strict\";var ait=ve(\"http2\"),{Writable:lit}=ve(\"stream\"),{Agent:oae,globalAgent:cit}=_O(),uit=qO(),Ait=jO(),fit=tae(),pit=nae(),{ERR_INVALID_ARG_TYPE:GO,ERR_INVALID_PROTOCOL:hit,ERR_HTTP_HEADERS_SENT:aae,ERR_INVALID_HTTP_TOKEN:git,ERR_HTTP_INVALID_HEADER_VALUE:dit,ERR_INVALID_CHAR:mit}=sae(),{HTTP2_HEADER_STATUS:lae,HTTP2_HEADER_METHOD:cae,HTTP2_HEADER_PATH:uae,HTTP2_METHOD_CONNECT:yit}=ait.constants,Qo=Symbol(\"headers\"),YO=Symbol(\"origin\"),WO=Symbol(\"session\"),Aae=Symbol(\"options\"),Yb=Symbol(\"flushedHeaders\"),ZI=Symbol(\"jobs\"),Eit=/^[\\^`\\-\\w!#$%&*+.|~]+$/,Cit=/[^\\t\\u0020-\\u007E\\u0080-\\u00FF]/,KO=class extends lit{constructor(e,r,o){super({autoDestroy:!1});let a=typeof e==\"string\"||e instanceof URL;if(a&&(e=Ait(e instanceof URL?e:new URL(e))),typeof r==\"function\"||r===void 0?(o=r,r=a?e:{...e}):r={...e,...r},r.h2session)this[WO]=r.h2session;else if(r.agent===!1)this.agent=new oae({maxFreeSessions:0});else if(typeof r.agent>\"u\"||r.agent===null)typeof r.createConnection==\"function\"?(this.agent=new oae({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=cit;else if(typeof r.agent.request==\"function\")this.agent=r.agent;else throw new GO(\"options.agent\",[\"Agent-like Object\",\"undefined\",\"false\"],r.agent);if(r.protocol&&r.protocol!==\"https:\")throw new hit(r.protocol,\"https:\");let n=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,u=r.hostname||r.host||\"localhost\";delete r.hostname,delete r.host,delete r.port;let{timeout:A}=r;if(r.timeout=void 0,this[Qo]=Object.create(null),this[ZI]=[],this.socket=null,this.connection=null,this.method=r.method||\"GET\",this.path=r.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,r.headers)for(let[p,h]of Object.entries(r.headers))this.setHeader(p,h);r.auth&&!(\"authorization\"in this[Qo])&&(this[Qo].authorization=\"Basic \"+Buffer.from(r.auth).toString(\"base64\")),r.session=r.tlsSession,r.path=r.socketPath,this[Aae]=r,n===443?(this[YO]=`https://${u}`,\":authority\"in this[Qo]||(this[Qo][\":authority\"]=u)):(this[YO]=`https://${u}:${n}`,\":authority\"in this[Qo]||(this[Qo][\":authority\"]=`${u}:${n}`)),A&&this.setTimeout(A),o&&this.once(\"response\",o),this[Yb]=!1}get method(){return this[Qo][cae]}set method(e){e&&(this[Qo][cae]=e.toUpperCase())}get path(){return this[Qo][uae]}set path(e){e&&(this[Qo][uae]=e)}get _mustNotHaveABody(){return this.method===\"GET\"||this.method===\"HEAD\"||this.method===\"DELETE\"}_write(e,r,o){if(this._mustNotHaveABody){o(new Error(\"The GET, HEAD and DELETE methods must NOT have a body\"));return}this.flushHeaders();let a=()=>this._request.write(e,r,o);this._request?a():this[ZI].push(a)}_final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?r():this[ZI].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit(\"abort\")),this.aborted=!0,this.destroy())}_destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(e)}async flushHeaders(){if(this[Yb]||this.destroyed)return;this[Yb]=!0;let e=this.method===yit,r=o=>{if(this._request=o,this.destroyed){o.destroy();return}e||fit(o,this,[\"timeout\",\"continue\",\"close\",\"error\"]);let a=u=>(...A)=>{!this.writable&&!this.destroyed?u(...A):this.once(\"finish\",()=>{u(...A)})};o.once(\"response\",a((u,A,p)=>{let h=new uit(this.socket,o.readableHighWaterMark);this.res=h,h.req=this,h.statusCode=u[lae],h.headers=u,h.rawHeaders=p,h.once(\"end\",()=>{this.aborted?(h.aborted=!0,h.emit(\"aborted\")):(h.complete=!0,h.socket=null,h.connection=null)}),e?(h.upgrade=!0,this.emit(\"connect\",h,o,Buffer.alloc(0))?this.emit(\"close\"):o.destroy()):(o.on(\"data\",E=>{!h._dumped&&!h.push(E)&&o.pause()}),o.once(\"end\",()=>{h.push(null)}),this.emit(\"response\",h)||h._dump())})),o.once(\"headers\",a(u=>this.emit(\"information\",{statusCode:u[lae]}))),o.once(\"trailers\",a((u,A,p)=>{let{res:h}=this;h.trailers=u,h.rawTrailers=p}));let{socket:n}=o.session;this.socket=n,this.connection=n;for(let u of this[ZI])u();this.emit(\"socket\",this.socket)};if(this[WO])try{r(this[WO].request(this[Qo]))}catch(o){this.emit(\"error\",o)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[YO],this[Aae],this[Qo]))}catch(o){this.emit(\"error\",o)}}}getHeader(e){if(typeof e!=\"string\")throw new GO(\"name\",\"string\",e);return this[Qo][e.toLowerCase()]}get headersSent(){return this[Yb]}removeHeader(e){if(typeof e!=\"string\")throw new GO(\"name\",\"string\",e);if(this.headersSent)throw new aae(\"remove\");delete this[Qo][e.toLowerCase()]}setHeader(e,r){if(this.headersSent)throw new aae(\"set\");if(typeof e!=\"string\"||!Eit.test(e)&&!pit(e))throw new git(\"Header name\",e);if(typeof r>\"u\")throw new dit(r,e);if(Cit.test(r))throw new mit(\"header content\",e);this[Qo][e.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,r){let o=()=>this._request.setTimeout(e,r);return this._request?o():this[ZI].push(o),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};fae.exports=KO});var hae=_((KLt,pae)=>{\"use strict\";var wit=ve(\"tls\");pae.exports=(t={},e=wit.connect)=>new Promise((r,o)=>{let a=!1,n,u=async()=>{await p,n.off(\"timeout\",A),n.off(\"error\",o),t.resolveSocket?(r({alpnProtocol:n.alpnProtocol,socket:n,timeout:a}),a&&(await Promise.resolve(),n.emit(\"timeout\"))):(n.destroy(),r({alpnProtocol:n.alpnProtocol,timeout:a}))},A=async()=>{a=!0,u()},p=(async()=>{try{n=await e(t,u),n.on(\"error\",o),n.once(\"timeout\",A)}catch(h){o(h)}})()})});var dae=_((VLt,gae)=>{\"use strict\";var Iit=ve(\"net\");gae.exports=t=>{let e=t.host,r=t.headers&&t.headers.host;return r&&(r.startsWith(\"[\")?r.indexOf(\"]\")===-1?e=r:e=r.slice(1,-1):e=r.split(\":\",1)[0]),Iit.isIP(e)?\"\":e}});var Eae=_((zLt,JO)=>{\"use strict\";var mae=ve(\"http\"),zO=ve(\"https\"),Bit=hae(),vit=OO(),Dit=VO(),Pit=dae(),bit=jO(),Wb=new vit({maxSize:100}),$I=new Map,yae=(t,e,r)=>{e._httpMessage={shouldKeepAlive:!0};let o=()=>{t.emit(\"free\",e,r)};e.on(\"free\",o);let a=()=>{t.removeSocket(e,r)};e.on(\"close\",a);let n=()=>{t.removeSocket(e,r),e.off(\"close\",a),e.off(\"free\",o),e.off(\"agentRemove\",n)};e.on(\"agentRemove\",n),t.emit(\"free\",e,r)},Sit=async t=>{let e=`${t.host}:${t.port}:${t.ALPNProtocols.sort()}`;if(!Wb.has(e)){if($I.has(e))return(await $I.get(e)).alpnProtocol;let{path:r,agent:o}=t;t.path=t.socketPath;let a=Bit(t);$I.set(e,a);try{let{socket:n,alpnProtocol:u}=await a;if(Wb.set(e,u),t.path=r,u===\"h2\")n.destroy();else{let{globalAgent:A}=zO,p=zO.Agent.prototype.createConnection;o?o.createConnection===p?yae(o,n,t):n.destroy():A.createConnection===p?yae(A,n,t):n.destroy()}return $I.delete(e),u}catch(n){throw $I.delete(e),n}}return Wb.get(e)};JO.exports=async(t,e,r)=>{if((typeof t==\"string\"||t instanceof URL)&&(t=bit(new URL(t))),typeof e==\"function\"&&(r=e,e=void 0),e={ALPNProtocols:[\"h2\",\"http/1.1\"],...t,...e,resolveSocket:!0},!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error(\"The `ALPNProtocols` option must be an Array with at least one entry\");e.protocol=e.protocol||\"https:\";let o=e.protocol===\"https:\";e.host=e.hostname||e.host||\"localhost\",e.session=e.tlsSession,e.servername=e.servername||Pit(e),e.port=e.port||(o?443:80),e._defaultAgent=o?zO.globalAgent:mae.globalAgent;let a=e.agent;if(a){if(a.addRequest)throw new Error(\"The `options.agent` object can contain only `http`, `https` or `http2` properties\");e.agent=a[o?\"https\":\"http\"]}return o&&await Sit(e)===\"h2\"?(a&&(e.agent=a.http2),new Dit(e,r)):mae.request(e,r)};JO.exports.protocolCache=Wb});var wae=_((JLt,Cae)=>{\"use strict\";var xit=ve(\"http2\"),kit=_O(),XO=VO(),Qit=qO(),Fit=Eae(),Rit=(t,e,r)=>new XO(t,e,r),Tit=(t,e,r)=>{let o=new XO(t,e,r);return o.end(),o};Cae.exports={...xit,ClientRequest:XO,IncomingMessage:Qit,...kit,request:Rit,get:Tit,auto:Fit}});var $O=_(ZO=>{\"use strict\";Object.defineProperty(ZO,\"__esModule\",{value:!0});var Iae=Ff();ZO.default=t=>Iae.default.nodeStream(t)&&Iae.default.function_(t.getBoundary)});var Pae=_(e4=>{\"use strict\";Object.defineProperty(e4,\"__esModule\",{value:!0});var vae=ve(\"fs\"),Dae=ve(\"util\"),Bae=Ff(),Nit=$O(),Lit=Dae.promisify(vae.stat);e4.default=async(t,e)=>{if(e&&\"content-length\"in e)return Number(e[\"content-length\"]);if(!t)return 0;if(Bae.default.string(t))return Buffer.byteLength(t);if(Bae.default.buffer(t))return t.length;if(Nit.default(t))return Dae.promisify(t.getLength.bind(t))();if(t instanceof vae.ReadStream){let{size:r}=await Lit(t.path);return r===0?void 0:r}}});var r4=_(t4=>{\"use strict\";Object.defineProperty(t4,\"__esModule\",{value:!0});function Mit(t,e,r){let o={};for(let a of r)o[a]=(...n)=>{e.emit(a,...n)},t.on(a,o[a]);return()=>{for(let a of r)t.off(a,o[a])}}t4.default=Mit});var bae=_(n4=>{\"use strict\";Object.defineProperty(n4,\"__esModule\",{value:!0});n4.default=()=>{let t=[];return{once(e,r,o){e.once(r,o),t.push({origin:e,event:r,fn:o})},unhandleAll(){for(let e of t){let{origin:r,event:o,fn:a}=e;r.removeListener(o,a)}t.length=0}}}});var xae=_(e1=>{\"use strict\";Object.defineProperty(e1,\"__esModule\",{value:!0});e1.TimeoutError=void 0;var Oit=ve(\"net\"),Uit=bae(),Sae=Symbol(\"reentry\"),_it=()=>{},Kb=class extends Error{constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`),this.event=r,this.name=\"TimeoutError\",this.code=\"ETIMEDOUT\"}};e1.TimeoutError=Kb;e1.default=(t,e,r)=>{if(Sae in t)return _it;t[Sae]=!0;let o=[],{once:a,unhandleAll:n}=Uit.default(),u=(I,v,x)=>{var C;let R=setTimeout(v,I,I,x);(C=R.unref)===null||C===void 0||C.call(R);let L=()=>{clearTimeout(R)};return o.push(L),L},{host:A,hostname:p}=r,h=(I,v)=>{t.destroy(new Kb(I,v))},E=()=>{for(let I of o)I();n()};if(t.once(\"error\",I=>{if(E(),t.listenerCount(\"error\")===0)throw I}),t.once(\"close\",E),a(t,\"response\",I=>{a(I,\"end\",E)}),typeof e.request<\"u\"&&u(e.request,h,\"request\"),typeof e.socket<\"u\"){let I=()=>{h(e.socket,\"socket\")};t.setTimeout(e.socket,I),o.push(()=>{t.removeListener(\"timeout\",I)})}return a(t,\"socket\",I=>{var v;let{socketPath:x}=t;if(I.connecting){let C=!!(x??Oit.isIP((v=p??A)!==null&&v!==void 0?v:\"\")!==0);if(typeof e.lookup<\"u\"&&!C&&typeof I.address().address>\"u\"){let R=u(e.lookup,h,\"lookup\");a(I,\"lookup\",R)}if(typeof e.connect<\"u\"){let R=()=>u(e.connect,h,\"connect\");C?a(I,\"connect\",R()):a(I,\"lookup\",L=>{L===null&&a(I,\"connect\",R())})}typeof e.secureConnect<\"u\"&&r.protocol===\"https:\"&&a(I,\"connect\",()=>{let R=u(e.secureConnect,h,\"secureConnect\");a(I,\"secureConnect\",R)})}if(typeof e.send<\"u\"){let C=()=>u(e.send,h,\"send\");I.connecting?a(I,\"connect\",()=>{a(t,\"upload-complete\",C())}):a(t,\"upload-complete\",C())}}),typeof e.response<\"u\"&&a(t,\"upload-complete\",()=>{let I=u(e.response,h,\"response\");a(t,\"response\",I)}),E}});var Qae=_(i4=>{\"use strict\";Object.defineProperty(i4,\"__esModule\",{value:!0});var kae=Ff();i4.default=t=>{t=t;let e={protocol:t.protocol,hostname:kae.default.string(t.hostname)&&t.hostname.startsWith(\"[\")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||\"\"}${t.search||\"\"}`};return kae.default.string(t.port)&&t.port.length>0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||\"\"}:${t.password||\"\"}`),e}});var Fae=_(s4=>{\"use strict\";Object.defineProperty(s4,\"__esModule\",{value:!0});var Hit=ve(\"url\"),qit=[\"protocol\",\"host\",\"hostname\",\"port\",\"pathname\",\"search\"];s4.default=(t,e)=>{var r,o;if(e.path){if(e.pathname)throw new TypeError(\"Parameters `path` and `pathname` are mutually exclusive.\");if(e.search)throw new TypeError(\"Parameters `path` and `search` are mutually exclusive.\");if(e.searchParams)throw new TypeError(\"Parameters `path` and `searchParams` are mutually exclusive.\")}if(e.search&&e.searchParams)throw new TypeError(\"Parameters `search` and `searchParams` are mutually exclusive.\");if(!t){if(!e.protocol)throw new TypeError(\"No URL protocol specified\");t=`${e.protocol}//${(o=(r=e.hostname)!==null&&r!==void 0?r:e.host)!==null&&o!==void 0?o:\"\"}`}let a=new Hit.URL(t);if(e.path){let n=e.path.indexOf(\"?\");n===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,n),e.search=e.path.slice(n+1)),delete e.path}for(let n of qit)e[n]&&(a[n]=e[n].toString());return a}});var Rae=_(a4=>{\"use strict\";Object.defineProperty(a4,\"__esModule\",{value:!0});var o4=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,r){typeof e==\"object\"?this.weakMap.set(e,r):this.map.set(e,r)}get(e){return typeof e==\"object\"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e==\"object\"?this.weakMap.has(e):this.map.has(e)}};a4.default=o4});var c4=_(l4=>{\"use strict\";Object.defineProperty(l4,\"__esModule\",{value:!0});var jit=async t=>{let e=[],r=0;for await(let o of t)e.push(o),r+=Buffer.byteLength(o);return Buffer.isBuffer(e[0])?Buffer.concat(e,r):Buffer.from(e.join(\"\"))};l4.default=jit});var Nae=_(wg=>{\"use strict\";Object.defineProperty(wg,\"__esModule\",{value:!0});wg.dnsLookupIpVersionToFamily=wg.isDnsLookupIpVersion=void 0;var Tae={auto:0,ipv4:4,ipv6:6};wg.isDnsLookupIpVersion=t=>t in Tae;wg.dnsLookupIpVersionToFamily=t=>{if(wg.isDnsLookupIpVersion(t))return Tae[t];throw new Error(\"Invalid DNS lookup IP version\")}});var u4=_(Vb=>{\"use strict\";Object.defineProperty(Vb,\"__esModule\",{value:!0});Vb.isResponseOk=void 0;Vb.isResponseOk=t=>{let{statusCode:e}=t,r=t.request.options.followRedirect?299:399;return e>=200&&e<=r||e===304}});var Mae=_(A4=>{\"use strict\";Object.defineProperty(A4,\"__esModule\",{value:!0});var Lae=new Set;A4.default=t=>{Lae.has(t)||(Lae.add(t),process.emitWarning(`Got: ${t}`,{type:\"DeprecationWarning\"}))}});var Oae=_(f4=>{\"use strict\";Object.defineProperty(f4,\"__esModule\",{value:!0});var Ai=Ff(),Git=(t,e)=>{if(Ai.default.null_(t.encoding))throw new TypeError(\"To get a Buffer, set `options.responseType` to `buffer` instead\");Ai.assert.any([Ai.default.string,Ai.default.undefined],t.encoding),Ai.assert.any([Ai.default.boolean,Ai.default.undefined],t.resolveBodyOnly),Ai.assert.any([Ai.default.boolean,Ai.default.undefined],t.methodRewriting),Ai.assert.any([Ai.default.boolean,Ai.default.undefined],t.isStream),Ai.assert.any([Ai.default.string,Ai.default.undefined],t.responseType),t.responseType===void 0&&(t.responseType=\"text\");let{retry:r}=t;if(e?t.retry={...e.retry}:t.retry={calculateDelay:o=>o.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},Ai.default.object(r)?(t.retry={...t.retry,...r},t.retry.methods=[...new Set(t.retry.methods.map(o=>o.toUpperCase()))],t.retry.statusCodes=[...new Set(t.retry.statusCodes)],t.retry.errorCodes=[...new Set(t.retry.errorCodes)]):Ai.default.number(r)&&(t.retry.limit=r),Ai.default.undefined(t.retry.maxRetryAfter)&&(t.retry.maxRetryAfter=Math.min(...[t.timeout.request,t.timeout.connect].filter(Ai.default.number))),Ai.default.object(t.pagination)){e&&(t.pagination={...e.pagination,...t.pagination});let{pagination:o}=t;if(!Ai.default.function_(o.transform))throw new Error(\"`options.pagination.transform` must be implemented\");if(!Ai.default.function_(o.shouldContinue))throw new Error(\"`options.pagination.shouldContinue` must be implemented\");if(!Ai.default.function_(o.filter))throw new TypeError(\"`options.pagination.filter` must be implemented\");if(!Ai.default.function_(o.paginate))throw new Error(\"`options.pagination.paginate` must be implemented\")}return t.responseType===\"json\"&&t.headers.accept===void 0&&(t.headers.accept=\"application/json\"),t};f4.default=Git});var Uae=_(t1=>{\"use strict\";Object.defineProperty(t1,\"__esModule\",{value:!0});t1.retryAfterStatusCodes=void 0;t1.retryAfterStatusCodes=new Set([413,429,503]);var Yit=({attemptCount:t,retryOptions:e,error:r,retryAfter:o})=>{if(t>e.limit)return 0;let a=e.methods.includes(r.options.method),n=e.errorCodes.includes(r.code),u=r.response&&e.statusCodes.includes(r.response.statusCode);if(!a||!n&&!u)return 0;if(r.response){if(o)return e.maxRetryAfter===void 0||o>e.maxRetryAfter?0:o;if(r.response.statusCode===413)return 0}let A=Math.random()*100;return 2**(t-1)*1e3+A};t1.default=Yit});var i1=_(Bn=>{\"use strict\";Object.defineProperty(Bn,\"__esModule\",{value:!0});Bn.UnsupportedProtocolError=Bn.ReadError=Bn.TimeoutError=Bn.UploadError=Bn.CacheError=Bn.HTTPError=Bn.MaxRedirectsError=Bn.RequestError=Bn.setNonEnumerableProperties=Bn.knownHookEvents=Bn.withoutBody=Bn.kIsNormalizedAlready=void 0;var _ae=ve(\"util\"),Hae=ve(\"stream\"),Wit=ve(\"fs\"),sh=ve(\"url\"),qae=ve(\"http\"),p4=ve(\"http\"),Kit=ve(\"https\"),Vit=roe(),zit=coe(),jae=qoe(),Jit=Woe(),Xit=wae(),Zit=jb(),ot=Ff(),$it=Pae(),Gae=$O(),est=r4(),Yae=xae(),tst=Qae(),Wae=Fae(),rst=Rae(),nst=c4(),Kae=Nae(),ist=u4(),oh=Mae(),sst=Oae(),ost=Uae(),h4,$s=Symbol(\"request\"),Xb=Symbol(\"response\"),ny=Symbol(\"responseSize\"),iy=Symbol(\"downloadedSize\"),sy=Symbol(\"bodySize\"),oy=Symbol(\"uploadedSize\"),zb=Symbol(\"serverResponsesPiped\"),Vae=Symbol(\"unproxyEvents\"),zae=Symbol(\"isFromCache\"),g4=Symbol(\"cancelTimeouts\"),Jae=Symbol(\"startedReading\"),ay=Symbol(\"stopReading\"),Jb=Symbol(\"triggerRead\"),ah=Symbol(\"body\"),r1=Symbol(\"jobs\"),Xae=Symbol(\"originalResponse\"),Zae=Symbol(\"retryTimeout\");Bn.kIsNormalizedAlready=Symbol(\"isNormalizedAlready\");var ast=ot.default.string(process.versions.brotli);Bn.withoutBody=new Set([\"GET\",\"HEAD\"]);Bn.knownHookEvents=[\"init\",\"beforeRequest\",\"beforeRedirect\",\"beforeError\",\"beforeRetry\",\"afterResponse\"];function lst(t){for(let e in t){let r=t[e];if(!ot.default.string(r)&&!ot.default.number(r)&&!ot.default.boolean(r)&&!ot.default.null_(r)&&!ot.default.undefined(r))throw new TypeError(`The \\`searchParams\\` value '${String(r)}' must be a string, number, boolean or null`)}}function cst(t){return ot.default.object(t)&&!(\"statusCode\"in t)}var d4=new rst.default,ust=async t=>new Promise((e,r)=>{let o=a=>{r(a)};t.pending||e(),t.once(\"error\",o),t.once(\"ready\",()=>{t.off(\"error\",o),e()})}),Ast=new Set([300,301,302,303,304,307,308]),fst=[\"context\",\"body\",\"json\",\"form\"];Bn.setNonEnumerableProperties=(t,e)=>{let r={};for(let o of t)if(o)for(let a of fst)a in o&&(r[a]={writable:!0,configurable:!0,enumerable:!1,value:o[a]});Object.defineProperties(e,r)};var Ji=class extends Error{constructor(e,r,o){var a;if(super(e),Error.captureStackTrace(this,this.constructor),this.name=\"RequestError\",this.code=r.code,o instanceof iS?(Object.defineProperty(this,\"request\",{enumerable:!1,value:o}),Object.defineProperty(this,\"response\",{enumerable:!1,value:o[Xb]}),Object.defineProperty(this,\"options\",{enumerable:!1,value:o.options})):Object.defineProperty(this,\"options\",{enumerable:!1,value:o}),this.timings=(a=this.request)===null||a===void 0?void 0:a.timings,ot.default.string(r.stack)&&ot.default.string(this.stack)){let n=this.stack.indexOf(this.message)+this.message.length,u=this.stack.slice(n).split(`\n`).reverse(),A=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(`\n`).reverse();for(;A.length!==0&&A[0]===u[0];)u.shift();this.stack=`${this.stack.slice(0,n)}${u.reverse().join(`\n`)}${A.reverse().join(`\n`)}`}}};Bn.RequestError=Ji;var Zb=class extends Ji{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e),this.name=\"MaxRedirectsError\"}};Bn.MaxRedirectsError=Zb;var $b=class extends Ji{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request),this.name=\"HTTPError\"}};Bn.HTTPError=$b;var eS=class extends Ji{constructor(e,r){super(e.message,e,r),this.name=\"CacheError\"}};Bn.CacheError=eS;var tS=class extends Ji{constructor(e,r){super(e.message,e,r),this.name=\"UploadError\"}};Bn.UploadError=tS;var rS=class extends Ji{constructor(e,r,o){super(e.message,e,o),this.name=\"TimeoutError\",this.event=e.event,this.timings=r}};Bn.TimeoutError=rS;var n1=class extends Ji{constructor(e,r){super(e.message,e,r),this.name=\"ReadError\"}};Bn.ReadError=n1;var nS=class extends Ji{constructor(e){super(`Unsupported protocol \"${e.url.protocol}\"`,{},e),this.name=\"UnsupportedProtocolError\"}};Bn.UnsupportedProtocolError=nS;var pst=[\"socket\",\"connect\",\"continue\",\"information\",\"upgrade\",\"timeout\"],iS=class extends Hae.Duplex{constructor(e,r={},o){super({autoDestroy:!1,highWaterMark:0}),this[iy]=0,this[oy]=0,this.requestInitialized=!1,this[zb]=new Set,this.redirects=[],this[ay]=!1,this[Jb]=!1,this[r1]=[],this.retryCount=0,this._progressCallbacks=[];let a=()=>this._unlockWrite(),n=()=>this._lockWrite();this.on(\"pipe\",h=>{h.prependListener(\"data\",a),h.on(\"data\",n),h.prependListener(\"end\",a),h.on(\"end\",n)}),this.on(\"unpipe\",h=>{h.off(\"data\",a),h.off(\"data\",n),h.off(\"end\",a),h.off(\"end\",n)}),this.on(\"pipe\",h=>{h instanceof p4.IncomingMessage&&(this.options.headers={...h.headers,...this.options.headers})});let{json:u,body:A,form:p}=r;if((u||A||p)&&this._lockWrite(),Bn.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,o)}catch(h){ot.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(h);return}(async()=>{var h;try{this.options.body instanceof Wit.ReadStream&&await ust(this.options.body);let{url:E}=this.options;if(!E)throw new TypeError(\"Missing `url` property\");if(this.requestUrl=E.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(h=this[$s])===null||h===void 0||h.destroy();return}for(let I of this[r1])I();this[r1].length=0,this.requestInitialized=!0}catch(E){if(E instanceof Ji){this._beforeError(E);return}this.destroyed||this.destroy(E)}})()}static normalizeArguments(e,r,o){var a,n,u,A,p;let h=r;if(ot.default.object(e)&&!ot.default.urlInstance(e))r={...o,...e,...r};else{if(e&&r&&r.url!==void 0)throw new TypeError(\"The `url` option is mutually exclusive with the `input` argument\");r={...o,...r},e!==void 0&&(r.url=e),ot.default.urlInstance(r.url)&&(r.url=new sh.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),ot.assert.any([ot.default.string,ot.default.undefined],r.method),ot.assert.any([ot.default.object,ot.default.undefined],r.headers),ot.assert.any([ot.default.string,ot.default.urlInstance,ot.default.undefined],r.prefixUrl),ot.assert.any([ot.default.object,ot.default.undefined],r.cookieJar),ot.assert.any([ot.default.object,ot.default.string,ot.default.undefined],r.searchParams),ot.assert.any([ot.default.object,ot.default.string,ot.default.undefined],r.cache),ot.assert.any([ot.default.object,ot.default.number,ot.default.undefined],r.timeout),ot.assert.any([ot.default.object,ot.default.undefined],r.context),ot.assert.any([ot.default.object,ot.default.undefined],r.hooks),ot.assert.any([ot.default.boolean,ot.default.undefined],r.decompress),ot.assert.any([ot.default.boolean,ot.default.undefined],r.ignoreInvalidCookies),ot.assert.any([ot.default.boolean,ot.default.undefined],r.followRedirect),ot.assert.any([ot.default.number,ot.default.undefined],r.maxRedirects),ot.assert.any([ot.default.boolean,ot.default.undefined],r.throwHttpErrors),ot.assert.any([ot.default.boolean,ot.default.undefined],r.http2),ot.assert.any([ot.default.boolean,ot.default.undefined],r.allowGetBody),ot.assert.any([ot.default.string,ot.default.undefined],r.localAddress),ot.assert.any([Kae.isDnsLookupIpVersion,ot.default.undefined],r.dnsLookupIpVersion),ot.assert.any([ot.default.object,ot.default.undefined],r.https),ot.assert.any([ot.default.boolean,ot.default.undefined],r.rejectUnauthorized),r.https&&(ot.assert.any([ot.default.boolean,ot.default.undefined],r.https.rejectUnauthorized),ot.assert.any([ot.default.function_,ot.default.undefined],r.https.checkServerIdentity),ot.assert.any([ot.default.string,ot.default.object,ot.default.array,ot.default.undefined],r.https.certificateAuthority),ot.assert.any([ot.default.string,ot.default.object,ot.default.array,ot.default.undefined],r.https.key),ot.assert.any([ot.default.string,ot.default.object,ot.default.array,ot.default.undefined],r.https.certificate),ot.assert.any([ot.default.string,ot.default.undefined],r.https.passphrase),ot.assert.any([ot.default.string,ot.default.buffer,ot.default.array,ot.default.undefined],r.https.pfx)),ot.assert.any([ot.default.object,ot.default.undefined],r.cacheOptions),ot.default.string(r.method)?r.method=r.method.toUpperCase():r.method=\"GET\",r.headers===o?.headers?r.headers={...r.headers}:r.headers=Zit({...o?.headers,...r.headers}),\"slashes\"in r)throw new TypeError(\"The legacy `url.Url` has been deprecated. Use `URL` instead.\");if(\"auth\"in r)throw new TypeError(\"Parameter `auth` is deprecated. Use `username` / `password` instead.\");if(\"searchParams\"in r&&r.searchParams&&r.searchParams!==o?.searchParams){let x;if(ot.default.string(r.searchParams)||r.searchParams instanceof sh.URLSearchParams)x=new sh.URLSearchParams(r.searchParams);else{lst(r.searchParams),x=new sh.URLSearchParams;for(let C in r.searchParams){let R=r.searchParams[C];R===null?x.append(C,\"\"):R!==void 0&&x.append(C,R)}}(a=o?.searchParams)===null||a===void 0||a.forEach((C,R)=>{x.has(R)||x.append(R,C)}),r.searchParams=x}if(r.username=(n=r.username)!==null&&n!==void 0?n:\"\",r.password=(u=r.password)!==null&&u!==void 0?u:\"\",ot.default.undefined(r.prefixUrl)?r.prefixUrl=(A=o?.prefixUrl)!==null&&A!==void 0?A:\"\":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==\"\"&&!r.prefixUrl.endsWith(\"/\")&&(r.prefixUrl+=\"/\")),ot.default.string(r.url)){if(r.url.startsWith(\"/\"))throw new Error(\"`input` must not start with a slash when using `prefixUrl`\");r.url=Wae.default(r.prefixUrl+r.url,r)}else(ot.default.undefined(r.url)&&r.prefixUrl!==\"\"||r.protocol)&&(r.url=Wae.default(r.prefixUrl,r));if(r.url){\"port\"in r&&delete r.port;let{prefixUrl:x}=r;Object.defineProperty(r,\"prefixUrl\",{set:R=>{let L=r.url;if(!L.href.startsWith(R))throw new Error(`Cannot change \\`prefixUrl\\` from ${x} to ${R}: ${L.href}`);r.url=new sh.URL(R+L.href.slice(x.length)),x=R},get:()=>x});let{protocol:C}=r.url;if(C===\"unix:\"&&(C=\"http:\",r.url=new sh.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),C!==\"http:\"&&C!==\"https:\")throw new nS(r);r.username===\"\"?r.username=r.url.username:r.url.username=r.username,r.password===\"\"?r.password=r.url.password:r.url.password=r.password}let{cookieJar:E}=r;if(E){let{setCookie:x,getCookieString:C}=E;ot.assert.function_(x),ot.assert.function_(C),x.length===4&&C.length===0&&(x=_ae.promisify(x.bind(r.cookieJar)),C=_ae.promisify(C.bind(r.cookieJar)),r.cookieJar={setCookie:x,getCookieString:C})}let{cache:I}=r;if(I&&(d4.has(I)||d4.set(I,new jae((x,C)=>{let R=x[$s](x,C);return ot.default.promise(R)&&(R.once=(L,U)=>{if(L===\"error\")R.catch(U);else if(L===\"abort\")(async()=>{try{(await R).once(\"abort\",U)}catch{}})();else throw new Error(`Unknown HTTP2 promise event: ${L}`);return R}),R},I))),r.cacheOptions={...r.cacheOptions},r.dnsCache===!0)h4||(h4=new zit.default),r.dnsCache=h4;else if(!ot.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \\`dnsCache\\` must be a CacheableLookup instance or a boolean, got ${ot.default(r.dnsCache)}`);ot.default.number(r.timeout)?r.timeout={request:r.timeout}:o&&r.timeout!==o.timeout?r.timeout={...o.timeout,...r.timeout}:r.timeout={...r.timeout},r.context||(r.context={});let v=r.hooks===o?.hooks;r.hooks={...r.hooks};for(let x of Bn.knownHookEvents)if(x in r.hooks)if(ot.default.array(r.hooks[x]))r.hooks[x]=[...r.hooks[x]];else throw new TypeError(`Parameter \\`${x}\\` must be an Array, got ${ot.default(r.hooks[x])}`);else r.hooks[x]=[];if(o&&!v)for(let x of Bn.knownHookEvents)o.hooks[x].length>0&&(r.hooks[x]=[...o.hooks[x],...r.hooks[x]]);if(\"family\"in r&&oh.default('\"options.family\" was never documented, please use \"options.dnsLookupIpVersion\"'),o?.https&&(r.https={...o.https,...r.https}),\"rejectUnauthorized\"in r&&oh.default('\"options.rejectUnauthorized\" is now deprecated, please use \"options.https.rejectUnauthorized\"'),\"checkServerIdentity\"in r&&oh.default('\"options.checkServerIdentity\" was never documented, please use \"options.https.checkServerIdentity\"'),\"ca\"in r&&oh.default('\"options.ca\" was never documented, please use \"options.https.certificateAuthority\"'),\"key\"in r&&oh.default('\"options.key\" was never documented, please use \"options.https.key\"'),\"cert\"in r&&oh.default('\"options.cert\" was never documented, please use \"options.https.certificate\"'),\"passphrase\"in r&&oh.default('\"options.passphrase\" was never documented, please use \"options.https.passphrase\"'),\"pfx\"in r&&oh.default('\"options.pfx\" was never documented, please use \"options.https.pfx\"'),\"followRedirects\"in r)throw new TypeError(\"The `followRedirects` option does not exist. Use `followRedirect` instead.\");if(r.agent){for(let x in r.agent)if(x!==\"http\"&&x!==\"https\"&&x!==\"http2\")throw new TypeError(`Expected the \\`options.agent\\` properties to be \\`http\\`, \\`https\\` or \\`http2\\`, got \\`${x}\\``)}return r.maxRedirects=(p=r.maxRedirects)!==null&&p!==void 0?p:0,Bn.setNonEnumerableProperties([o,h],r),sst.default(r,o)}_lockWrite(){let e=()=>{throw new TypeError(\"The payload has been already provided\")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:r}=e,o=!ot.default.undefined(e.form),a=!ot.default.undefined(e.json),n=!ot.default.undefined(e.body),u=o||a||n,A=Bn.withoutBody.has(e.method)&&!(e.method===\"GET\"&&e.allowGetBody);if(this._cannotHaveBody=A,u){if(A)throw new TypeError(`The \\`${e.method}\\` method cannot be used with a body`);if([n,o,a].filter(p=>p).length>1)throw new TypeError(\"The `body`, `json` and `form` options are mutually exclusive\");if(n&&!(e.body instanceof Hae.Readable)&&!ot.default.string(e.body)&&!ot.default.buffer(e.body)&&!Gae.default(e.body))throw new TypeError(\"The `body` option must be a stream.Readable, string or Buffer\");if(o&&!ot.default.object(e.form))throw new TypeError(\"The `form` option must be an Object\");{let p=!ot.default.string(r[\"content-type\"]);n?(Gae.default(e.body)&&p&&(r[\"content-type\"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[ah]=e.body):o?(p&&(r[\"content-type\"]=\"application/x-www-form-urlencoded\"),this[ah]=new sh.URLSearchParams(e.form).toString()):(p&&(r[\"content-type\"]=\"application/json\"),this[ah]=e.stringifyJson(e.json));let h=await $it.default(this[ah],e.headers);ot.default.undefined(r[\"content-length\"])&&ot.default.undefined(r[\"transfer-encoding\"])&&!A&&!ot.default.undefined(h)&&(r[\"content-length\"]=String(h))}}else A?this._lockWrite():this._unlockWrite();this[sy]=Number(r[\"content-length\"])||void 0}async _onResponseBase(e){let{options:r}=this,{url:o}=r;this[Xae]=e,r.decompress&&(e=Jit(e));let a=e.statusCode,n=e;n.statusMessage=n.statusMessage?n.statusMessage:qae.STATUS_CODES[a],n.url=r.url.toString(),n.requestUrl=this.requestUrl,n.redirectUrls=this.redirects,n.request=this,n.isFromCache=e.fromCache||!1,n.ip=this.ip,n.retryCount=this.retryCount,this[zae]=n.isFromCache,this[ny]=Number(e.headers[\"content-length\"])||void 0,this[Xb]=e,e.once(\"end\",()=>{this[ny]=this[iy],this.emit(\"downloadProgress\",this.downloadProgress)}),e.once(\"error\",A=>{e.destroy(),this._beforeError(new n1(A,this))}),e.once(\"aborted\",()=>{this._beforeError(new n1({name:\"Error\",message:\"The server aborted pending request\",code:\"ECONNRESET\"},this))}),this.emit(\"downloadProgress\",this.downloadProgress);let u=e.headers[\"set-cookie\"];if(ot.default.object(r.cookieJar)&&u){let A=u.map(async p=>r.cookieJar.setCookie(p,o.toString()));r.ignoreInvalidCookies&&(A=A.map(async p=>p.catch(()=>{})));try{await Promise.all(A)}catch(p){this._beforeError(p);return}}if(r.followRedirect&&e.headers.location&&Ast.has(a)){if(e.resume(),this[$s]&&(this[g4](),delete this[$s],this[Vae]()),(a===303&&r.method!==\"GET\"&&r.method!==\"HEAD\"||!r.methodRewriting)&&(r.method=\"GET\",\"body\"in r&&delete r.body,\"json\"in r&&delete r.json,\"form\"in r&&delete r.form,this[ah]=void 0,delete r.headers[\"content-length\"]),this.redirects.length>=r.maxRedirects){this._beforeError(new Zb(this));return}try{let p=Buffer.from(e.headers.location,\"binary\").toString(),h=new sh.URL(p,o),E=h.toString();decodeURI(E),h.hostname!==o.hostname||h.port!==o.port?(\"host\"in r.headers&&delete r.headers.host,\"cookie\"in r.headers&&delete r.headers.cookie,\"authorization\"in r.headers&&delete r.headers.authorization,(r.username||r.password)&&(r.username=\"\",r.password=\"\")):(h.username=r.username,h.password=r.password),this.redirects.push(E),r.url=h;for(let I of r.hooks.beforeRedirect)await I(r,n);this.emit(\"redirect\",n,r),await this._makeRequest()}catch(p){this._beforeError(p);return}return}if(r.isStream&&r.throwHttpErrors&&!ist.isResponseOk(n)){this._beforeError(new $b(n));return}e.on(\"readable\",()=>{this[Jb]&&this._read()}),this.on(\"resume\",()=>{e.resume()}),this.on(\"pause\",()=>{e.pause()}),e.once(\"end\",()=>{this.push(null)}),this.emit(\"response\",e);for(let A of this[zb])if(!A.headersSent){for(let p in e.headers){let h=r.decompress?p!==\"content-encoding\":!0,E=e.headers[p];h&&A.setHeader(p,E)}A.statusCode=a}}async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._beforeError(r)}}_onRequest(e){let{options:r}=this,{timeout:o,url:a}=r;Vit.default(e),this[g4]=Yae.default(e,o,a);let n=r.cache?\"cacheableResponse\":\"response\";e.once(n,p=>{this._onResponse(p)}),e.once(\"error\",p=>{var h;e.destroy(),(h=e.res)===null||h===void 0||h.removeAllListeners(\"end\"),p=p instanceof Yae.TimeoutError?new rS(p,this.timings,this):new Ji(p.message,p,this),this._beforeError(p)}),this[Vae]=est.default(e,this,pst),this[$s]=e,this.emit(\"uploadProgress\",this.uploadProgress);let u=this[ah],A=this.redirects.length===0?this:e;ot.default.nodeStream(u)?(u.pipe(A),u.once(\"error\",p=>{this._beforeError(new tS(p,this))})):(this._unlockWrite(),ot.default.undefined(u)?(this._cannotHaveBody||this._noPipe)&&(A.end(),this._lockWrite()):(this._writeRequest(u,void 0,()=>{}),A.end(),this._lockWrite())),this.emit(\"request\",e)}async _createCacheableRequest(e,r){return new Promise((o,a)=>{Object.assign(r,tst.default(e)),delete r.url;let n,u=d4.get(r.cache)(r,async A=>{A._readableState.autoDestroy=!1,n&&(await n).emit(\"cacheableResponse\",A),o(A)});r.url=e,u.once(\"error\",a),u.once(\"request\",async A=>{n=A,o(n)})})}async _makeRequest(){var e,r,o,a,n;let{options:u}=this,{headers:A}=u;for(let U in A)if(ot.default.undefined(A[U]))delete A[U];else if(ot.default.null_(A[U]))throw new TypeError(`Use \\`undefined\\` instead of \\`null\\` to delete the \\`${U}\\` header`);if(u.decompress&&ot.default.undefined(A[\"accept-encoding\"])&&(A[\"accept-encoding\"]=ast?\"gzip, deflate, br\":\"gzip, deflate\"),u.cookieJar){let U=await u.cookieJar.getCookieString(u.url.toString());ot.default.nonEmptyString(U)&&(u.headers.cookie=U)}for(let U of u.hooks.beforeRequest){let z=await U(u);if(!ot.default.undefined(z)){u.request=()=>z;break}}u.body&&this[ah]!==u.body&&(this[ah]=u.body);let{agent:p,request:h,timeout:E,url:I}=u;if(u.dnsCache&&!(\"lookup\"in u)&&(u.lookup=u.dnsCache.lookup),I.hostname===\"unix\"){let U=/(?<socketPath>.+?):(?<path>.+)/.exec(`${I.pathname}${I.search}`);if(U?.groups){let{socketPath:z,path:te}=U.groups;Object.assign(u,{socketPath:z,path:te,host:\"\"})}}let v=I.protocol===\"https:\",x;u.http2?x=Xit.auto:x=v?Kit.request:qae.request;let C=(e=u.request)!==null&&e!==void 0?e:x,R=u.cache?this._createCacheableRequest:C;p&&!u.http2&&(u.agent=p[v?\"https\":\"http\"]),u[$s]=C,delete u.request,delete u.timeout;let L=u;if(L.shared=(r=u.cacheOptions)===null||r===void 0?void 0:r.shared,L.cacheHeuristic=(o=u.cacheOptions)===null||o===void 0?void 0:o.cacheHeuristic,L.immutableMinTimeToLive=(a=u.cacheOptions)===null||a===void 0?void 0:a.immutableMinTimeToLive,L.ignoreCargoCult=(n=u.cacheOptions)===null||n===void 0?void 0:n.ignoreCargoCult,u.dnsLookupIpVersion!==void 0)try{L.family=Kae.dnsLookupIpVersionToFamily(u.dnsLookupIpVersion)}catch{throw new Error(\"Invalid `dnsLookupIpVersion` option value\")}u.https&&(\"rejectUnauthorized\"in u.https&&(L.rejectUnauthorized=u.https.rejectUnauthorized),u.https.checkServerIdentity&&(L.checkServerIdentity=u.https.checkServerIdentity),u.https.certificateAuthority&&(L.ca=u.https.certificateAuthority),u.https.certificate&&(L.cert=u.https.certificate),u.https.key&&(L.key=u.https.key),u.https.passphrase&&(L.passphrase=u.https.passphrase),u.https.pfx&&(L.pfx=u.https.pfx));try{let U=await R(I,L);ot.default.undefined(U)&&(U=x(I,L)),u.request=h,u.timeout=E,u.agent=p,u.https&&(\"rejectUnauthorized\"in u.https&&delete L.rejectUnauthorized,u.https.checkServerIdentity&&delete L.checkServerIdentity,u.https.certificateAuthority&&delete L.ca,u.https.certificate&&delete L.cert,u.https.key&&delete L.key,u.https.passphrase&&delete L.passphrase,u.https.pfx&&delete L.pfx),cst(U)?this._onRequest(U):this.writable?(this.once(\"finish\",()=>{this._onResponse(U)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(U)}catch(U){throw U instanceof jae.CacheError?new eS(U,this):new Ji(U.message,U,this)}}async _error(e){try{for(let r of this.options.hooks.beforeError)e=await r(e)}catch(r){e=new Ji(r.message,r,this)}this.destroy(e)}_beforeError(e){if(this[ay])return;let{options:r}=this,o=this.retryCount+1;this[ay]=!0,e instanceof Ji||(e=new Ji(e.message,e,this));let a=e,{response:n}=a;(async()=>{if(n&&!n.body){n.setEncoding(this._readableState.encoding);try{n.rawBody=await nst.default(n),n.body=n.rawBody.toString()}catch{}}if(this.listenerCount(\"retry\")!==0){let u;try{let A;n&&\"retry-after\"in n.headers&&(A=Number(n.headers[\"retry-after\"]),Number.isNaN(A)?(A=Date.parse(n.headers[\"retry-after\"])-Date.now(),A<=0&&(A=1)):A*=1e3),u=await r.retry.calculateDelay({attemptCount:o,retryOptions:r.retry,error:a,retryAfter:A,computedValue:ost.default({attemptCount:o,retryOptions:r.retry,error:a,retryAfter:A,computedValue:0})})}catch(A){this._error(new Ji(A.message,A,this));return}if(u){let A=async()=>{try{for(let p of this.options.hooks.beforeRetry)await p(this.options,a,o)}catch(p){this._error(new Ji(p.message,e,this));return}this.destroyed||(this.destroy(),this.emit(\"retry\",o,e))};this[Zae]=setTimeout(A,u);return}}this._error(a)})()}_read(){this[Jb]=!0;let e=this[Xb];if(e&&!this[ay]){e.readableLength&&(this[Jb]=!1);let r;for(;(r=e.read())!==null;){this[iy]+=r.length,this[Jae]=!0;let o=this.downloadProgress;o.percent<1&&this.emit(\"downloadProgress\",o),this.push(r)}}}_write(e,r,o){let a=()=>{this._writeRequest(e,r,o)};this.requestInitialized?a():this[r1].push(a)}_writeRequest(e,r,o){this[$s].destroyed||(this._progressCallbacks.push(()=>{this[oy]+=Buffer.byteLength(e,r);let a=this.uploadProgress;a.percent<1&&this.emit(\"uploadProgress\",a)}),this[$s].write(e,r,a=>{!a&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),o(a)}))}_final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!($s in this)){e();return}if(this[$s].destroyed){e();return}this[$s].end(o=>{o||(this[sy]=this[oy],this.emit(\"uploadProgress\",this.uploadProgress),this[$s].emit(\"upload-complete\")),e(o)})};this.requestInitialized?r():this[r1].push(r)}_destroy(e,r){var o;this[ay]=!0,clearTimeout(this[Zae]),$s in this&&(this[g4](),!((o=this[Xb])===null||o===void 0)&&o.complete||this[$s].destroy()),e!==null&&!ot.default.undefined(e)&&!(e instanceof Ji)&&(e=new Ji(e.message,e,this)),r(e)}get _isAboutToError(){return this[ay]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,r,o;return((r=(e=this[$s])===null||e===void 0?void 0:e.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!(!((o=this[Xae])===null||o===void 0)&&o.complete)}get socket(){var e,r;return(r=(e=this[$s])===null||e===void 0?void 0:e.socket)!==null&&r!==void 0?r:void 0}get downloadProgress(){let e;return this[ny]?e=this[iy]/this[ny]:this[ny]===this[iy]?e=1:e=0,{percent:e,transferred:this[iy],total:this[ny]}}get uploadProgress(){let e;return this[sy]?e=this[oy]/this[sy]:this[sy]===this[oy]?e=1:e=0,{percent:e,transferred:this[oy],total:this[sy]}}get timings(){var e;return(e=this[$s])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[zae]}pipe(e,r){if(this[Jae])throw new Error(\"Failed to pipe. The response has been emitted already.\");return e instanceof p4.ServerResponse&&this[zb].add(e),super.pipe(e,r)}unpipe(e){return e instanceof p4.ServerResponse&&this[zb].delete(e),super.unpipe(e),this}};Bn.default=iS});var s1=_(Yc=>{\"use strict\";var hst=Yc&&Yc.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),gst=Yc&&Yc.__exportStar||function(t,e){for(var r in t)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,r)&&hst(e,t,r)};Object.defineProperty(Yc,\"__esModule\",{value:!0});Yc.CancelError=Yc.ParseError=void 0;var $ae=i1(),m4=class extends $ae.RequestError{constructor(e,r){let{options:o}=r.request;super(`${e.message} in \"${o.url.toString()}\"`,e,r.request),this.name=\"ParseError\"}};Yc.ParseError=m4;var y4=class extends $ae.RequestError{constructor(e){super(\"Promise was canceled\",{},e),this.name=\"CancelError\"}get isCanceled(){return!0}};Yc.CancelError=y4;gst(i1(),Yc)});var tle=_(E4=>{\"use strict\";Object.defineProperty(E4,\"__esModule\",{value:!0});var ele=s1(),dst=(t,e,r,o)=>{let{rawBody:a}=t;try{if(e===\"text\")return a.toString(o);if(e===\"json\")return a.length===0?\"\":r(a.toString());if(e===\"buffer\")return a;throw new ele.ParseError({message:`Unknown body type '${e}'`,name:\"Error\"},t)}catch(n){throw new ele.ParseError(n,t)}};E4.default=dst});var C4=_(lh=>{\"use strict\";var mst=lh&&lh.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),yst=lh&&lh.__exportStar||function(t,e){for(var r in t)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,r)&&mst(e,t,r)};Object.defineProperty(lh,\"__esModule\",{value:!0});var Est=ve(\"events\"),Cst=Ff(),wst=eoe(),sS=s1(),rle=tle(),nle=i1(),Ist=r4(),Bst=c4(),ile=u4(),vst=[\"request\",\"response\",\"redirect\",\"uploadProgress\",\"downloadProgress\"];function sle(t){let e,r,o=new Est.EventEmitter,a=new wst((u,A,p)=>{let h=E=>{let I=new nle.default(void 0,t);I.retryCount=E,I._noPipe=!0,p(()=>I.destroy()),p.shouldReject=!1,p(()=>A(new sS.CancelError(I))),e=I,I.once(\"response\",async C=>{var R;if(C.retryCount=E,C.request.aborted)return;let L;try{L=await Bst.default(I),C.rawBody=L}catch{return}if(I._isAboutToError)return;let U=((R=C.headers[\"content-encoding\"])!==null&&R!==void 0?R:\"\").toLowerCase(),z=[\"gzip\",\"deflate\",\"br\"].includes(U),{options:te}=I;if(z&&!te.decompress)C.body=L;else try{C.body=rle.default(C,te.responseType,te.parseJson,te.encoding)}catch(ae){if(C.body=L.toString(),ile.isResponseOk(C)){I._beforeError(ae);return}}try{for(let[ae,le]of te.hooks.afterResponse.entries())C=await le(C,async ce=>{let Ce=nle.default.normalizeArguments(void 0,{...ce,retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1},te);Ce.hooks.afterResponse=Ce.hooks.afterResponse.slice(0,ae);for(let Be of Ce.hooks.beforeRetry)await Be(Ce);let de=sle(Ce);return p(()=>{de.catch(()=>{}),de.cancel()}),de})}catch(ae){I._beforeError(new sS.RequestError(ae.message,ae,I));return}if(!ile.isResponseOk(C)){I._beforeError(new sS.HTTPError(C));return}r=C,u(I.options.resolveBodyOnly?C.body:C)});let v=C=>{if(a.isCanceled)return;let{options:R}=I;if(C instanceof sS.HTTPError&&!R.throwHttpErrors){let{response:L}=C;u(I.options.resolveBodyOnly?L.body:L);return}A(C)};I.once(\"error\",v);let x=I.options.body;I.once(\"retry\",(C,R)=>{var L,U;if(x===((L=R.request)===null||L===void 0?void 0:L.options.body)&&Cst.default.nodeStream((U=R.request)===null||U===void 0?void 0:U.options.body)){v(R);return}h(C)}),Ist.default(I,o,vst)};h(0)});a.on=(u,A)=>(o.on(u,A),a);let n=u=>{let A=(async()=>{await a;let{options:p}=r.request;return rle.default(r,u,p.parseJson,p.encoding)})();return Object.defineProperties(A,Object.getOwnPropertyDescriptors(a)),A};return a.json=()=>{let{headers:u}=e.options;return!e.writableFinished&&u.accept===void 0&&(u.accept=\"application/json\"),n(\"json\")},a.buffer=()=>n(\"buffer\"),a.text=()=>n(\"text\"),a}lh.default=sle;yst(s1(),lh)});var ole=_(w4=>{\"use strict\";Object.defineProperty(w4,\"__esModule\",{value:!0});var Dst=s1();function Pst(t,...e){let r=(async()=>{if(t instanceof Dst.RequestError)try{for(let a of e)if(a)for(let n of a)t=await n(t)}catch(a){t=a}throw t})(),o=()=>r;return r.json=o,r.text=o,r.buffer=o,r.on=o,r}w4.default=Pst});var cle=_(I4=>{\"use strict\";Object.defineProperty(I4,\"__esModule\",{value:!0});var ale=Ff();function lle(t){for(let e of Object.values(t))(ale.default.plainObject(e)||ale.default.array(e))&&lle(e);return Object.freeze(t)}I4.default=lle});var Ale=_(ule=>{\"use strict\";Object.defineProperty(ule,\"__esModule\",{value:!0})});var B4=_(zl=>{\"use strict\";var bst=zl&&zl.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),Sst=zl&&zl.__exportStar||function(t,e){for(var r in t)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,r)&&bst(e,t,r)};Object.defineProperty(zl,\"__esModule\",{value:!0});zl.defaultHandler=void 0;var fle=Ff(),Vl=C4(),xst=ole(),aS=i1(),kst=cle(),Qst={RequestError:Vl.RequestError,CacheError:Vl.CacheError,ReadError:Vl.ReadError,HTTPError:Vl.HTTPError,MaxRedirectsError:Vl.MaxRedirectsError,TimeoutError:Vl.TimeoutError,ParseError:Vl.ParseError,CancelError:Vl.CancelError,UnsupportedProtocolError:Vl.UnsupportedProtocolError,UploadError:Vl.UploadError},Fst=async t=>new Promise(e=>{setTimeout(e,t)}),{normalizeArguments:oS}=aS.default,ple=(...t)=>{let e;for(let r of t)e=oS(void 0,r,e);return e},Rst=t=>t.isStream?new aS.default(void 0,t):Vl.default(t),Tst=t=>\"defaults\"in t&&\"options\"in t.defaults,Nst=[\"get\",\"post\",\"put\",\"patch\",\"head\",\"delete\"];zl.defaultHandler=(t,e)=>e(t);var hle=(t,e)=>{if(t)for(let r of t)r(e)},gle=t=>{t._rawHandlers=t.handlers,t.handlers=t.handlers.map(o=>(a,n)=>{let u,A=o(a,p=>(u=n(p),u));if(A!==u&&!a.isStream&&u){let p=A,{then:h,catch:E,finally:I}=p;Object.setPrototypeOf(p,Object.getPrototypeOf(u)),Object.defineProperties(p,Object.getOwnPropertyDescriptors(u)),p.then=h,p.catch=E,p.finally=I}return A});let e=(o,a={},n)=>{var u,A;let p=0,h=E=>t.handlers[p++](E,p===t.handlers.length?Rst:h);if(fle.default.plainObject(o)){let E={...o,...a};aS.setNonEnumerableProperties([o,a],E),a=E,o=void 0}try{let E;try{hle(t.options.hooks.init,a),hle((u=a.hooks)===null||u===void 0?void 0:u.init,a)}catch(v){E=v}let I=oS(o,a,n??t.options);if(I[aS.kIsNormalizedAlready]=!0,E)throw new Vl.RequestError(E.message,E,I);return h(I)}catch(E){if(a.isStream)throw E;return xst.default(E,t.options.hooks.beforeError,(A=a.hooks)===null||A===void 0?void 0:A.beforeError)}};e.extend=(...o)=>{let a=[t.options],n=[...t._rawHandlers],u;for(let A of o)Tst(A)?(a.push(A.defaults.options),n.push(...A.defaults._rawHandlers),u=A.defaults.mutableDefaults):(a.push(A),\"handlers\"in A&&n.push(...A.handlers),u=A.mutableDefaults);return n=n.filter(A=>A!==zl.defaultHandler),n.length===0&&n.push(zl.defaultHandler),gle({options:ple(...a),handlers:n,mutableDefaults:!!u})};let r=async function*(o,a){let n=oS(o,a,t.options);n.resolveBodyOnly=!1;let u=n.pagination;if(!fle.default.object(u))throw new TypeError(\"`options.pagination` must be implemented\");let A=[],{countLimit:p}=u,h=0;for(;h<u.requestLimit;){h!==0&&await Fst(u.backoff);let E=await e(void 0,void 0,n),I=await u.transform(E),v=[];for(let C of I)if(u.filter(C,A,v)&&(!u.shouldContinue(C,A,v)||(yield C,u.stackAllItems&&A.push(C),v.push(C),--p<=0)))return;let x=u.paginate(E,A,v);if(x===!1)return;x===E.request.options?n=E.request.options:x!==void 0&&(n=oS(void 0,x,n)),h++}};e.paginate=r,e.paginate.all=async(o,a)=>{let n=[];for await(let u of r(o,a))n.push(u);return n},e.paginate.each=r,e.stream=(o,a)=>e(o,{...a,isStream:!0});for(let o of Nst)e[o]=(a,n)=>e(a,{...n,method:o}),e.stream[o]=(a,n)=>e(a,{...n,method:o,isStream:!0});return Object.assign(e,Qst),Object.defineProperty(e,\"defaults\",{value:t.mutableDefaults?t:kst.default(t),writable:t.mutableDefaults,configurable:t.mutableDefaults,enumerable:!0}),e.mergeOptions=ple,e};zl.default=gle;Sst(Ale(),zl)});var yle=_((Rf,lS)=>{\"use strict\";var Lst=Rf&&Rf.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),dle=Rf&&Rf.__exportStar||function(t,e){for(var r in t)r!==\"default\"&&!Object.prototype.hasOwnProperty.call(e,r)&&Lst(e,t,r)};Object.defineProperty(Rf,\"__esModule\",{value:!0});var Mst=ve(\"url\"),mle=B4(),Ost={options:{method:\"GET\",retry:{limit:2,methods:[\"GET\",\"PUT\",\"HEAD\",\"DELETE\",\"OPTIONS\",\"TRACE\"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:[\"ETIMEDOUT\",\"ECONNRESET\",\"EADDRINUSE\",\"ECONNREFUSED\",\"EPIPE\",\"ENOTFOUND\",\"ENETUNREACH\",\"EAI_AGAIN\"],maxRetryAfter:void 0,calculateDelay:({computedValue:t})=>t},timeout:{},headers:{\"user-agent\":\"got (https://github.com/sindresorhus/got)\"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:\"text\",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:\"\",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:t=>t.request.options.responseType===\"json\"?t.body:JSON.parse(t.body),paginate:t=>{if(!Reflect.has(t.headers,\"link\"))return!1;let e=t.headers.link.split(\",\"),r;for(let o of e){let a=o.split(\";\");if(a[1].includes(\"next\")){r=a[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new Mst.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:1/0,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:t=>JSON.parse(t),stringifyJson:t=>JSON.stringify(t),cacheOptions:{}},handlers:[mle.defaultHandler],mutableDefaults:!1},v4=mle.default(Ost);Rf.default=v4;lS.exports=v4;lS.exports.default=v4;lS.exports.__esModule=!0;dle(B4(),Rf);dle(C4(),Rf)});var sn={};Vt(sn,{Method:()=>Dle,del:()=>jst,get:()=>S4,getNetworkSettings:()=>vle,post:()=>x4,put:()=>qst,request:()=>o1});function wle(t){let e=new URL(t),r={host:e.hostname,headers:{}};return e.port&&(r.port=Number(e.port)),e.username&&e.password&&(r.proxyAuth=`${e.username}:${e.password}`),{proxy:r}}async function D4(t){return al(Cle,t,()=>oe.readFilePromise(t).then(e=>(Cle.set(t,e),e)))}function Hst({statusCode:t,statusMessage:e},r){let o=Ot(r,t,yt.NUMBER),a=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${t}`;return Tm(r,`${o}${e?` (${e})`:\"\"}`,a)}async function cS(t,{configuration:e,customErrorMessage:r}){try{return await t}catch(o){if(o.name!==\"HTTPError\")throw o;let a=r?.(o,e)??o.response.body?.error;a==null&&(o.message.startsWith(\"Response code\")?a=\"The remote server failed to provide the requested resource\":a=o.message),o.code===\"ETIMEDOUT\"&&o.event===\"socket\"&&(a+=`(can be increased via ${Ot(e,\"httpTimeout\",yt.SETTING)})`);let n=new Jt(35,a,u=>{o.response&&u.reportError(35,`  ${Xu(e,{label:\"Response Code\",value:Hc(yt.NO_HINT,Hst(o.response,e))})}`),o.request&&(u.reportError(35,`  ${Xu(e,{label:\"Request Method\",value:Hc(yt.NO_HINT,o.request.options.method)})}`),u.reportError(35,`  ${Xu(e,{label:\"Request URL\",value:Hc(yt.URL,o.request.requestUrl)})}`)),o.request.redirects.length>0&&u.reportError(35,`  ${Xu(e,{label:\"Request Redirects\",value:Hc(yt.NO_HINT,mL(e,o.request.redirects,yt.URL))})}`),o.request.retryCount===o.request.options.retry.limit&&u.reportError(35,`  ${Xu(e,{label:\"Request Retry Count\",value:Hc(yt.NO_HINT,`${Ot(e,o.request.retryCount,yt.NUMBER)} (can be increased via ${Ot(e,\"httpRetry\",yt.SETTING)})`)})}`)});throw n.originalError=o,n}}function vle(t,e){let r=[...e.configuration.get(\"networkSettings\")].sort(([u],[A])=>A.length-u.length),o={enableNetwork:void 0,httpsCaFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},a=Object.keys(o),n=typeof t==\"string\"?new URL(t):t;for(let[u,A]of r)if(b4.default.isMatch(n.hostname,u))for(let p of a){let h=A.get(p);h!==null&&typeof o[p]>\"u\"&&(o[p]=h)}for(let u of a)typeof o[u]>\"u\"&&(o[u]=e.configuration.get(u));return o}async function o1(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u=\"GET\",wrapNetworkRequest:A}){let p={target:t,body:e,configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u},h=async()=>await Gst(t,e,p),E=typeof A<\"u\"?await A(h,p):h;return await(await r.reduceHook(v=>v.wrapNetworkRequest,E,p))()}async function S4(t,{configuration:e,jsonResponse:r,customErrorMessage:o,wrapNetworkRequest:a,...n}){let u=()=>cS(o1(t,null,{configuration:e,wrapNetworkRequest:a,...n}),{configuration:e,customErrorMessage:o}).then(p=>p.body),A=await(typeof a<\"u\"?u():al(Ele,t,()=>u().then(p=>(Ele.set(t,p),p))));return r?JSON.parse(A.toString()):A}async function qst(t,e,{customErrorMessage:r,...o}){return(await cS(o1(t,e,{...o,method:\"PUT\"}),{customErrorMessage:r,configuration:o.configuration})).body}async function x4(t,e,{customErrorMessage:r,...o}){return(await cS(o1(t,e,{...o,method:\"POST\"}),{customErrorMessage:r,configuration:o.configuration})).body}async function jst(t,{customErrorMessage:e,...r}){return(await cS(o1(t,null,{...r,method:\"DELETE\"}),{customErrorMessage:e,configuration:r.configuration})).body}async function Gst(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u=\"GET\"}){let A=typeof t==\"string\"?new URL(t):t,p=vle(A,{configuration:r});if(p.enableNetwork===!1)throw new Jt(80,`Request to '${A.href}' has been blocked because of your configuration settings`);if(A.protocol===\"http:\"&&!b4.default.isMatch(A.hostname,r.get(\"unsafeHttpWhitelist\")))throw new Jt(81,`Unsafe http requests must be explicitly whitelisted in your configuration (${A.hostname})`);let E={agent:{http:p.httpProxy?P4.default.httpOverHttp(wle(p.httpProxy)):Ust,https:p.httpsProxy?P4.default.httpsOverHttp(wle(p.httpsProxy)):_st},headers:o,method:u};E.responseType=n?\"json\":\"buffer\",e!==null&&(Buffer.isBuffer(e)||!a&&typeof e==\"string\"?E.body=e:E.json=e);let I=r.get(\"httpTimeout\"),v=r.get(\"httpRetry\"),x=r.get(\"enableStrictSsl\"),C=p.httpsCaFilePath,R=p.httpsCertFilePath,L=p.httpsKeyFilePath,{default:U}=await Promise.resolve().then(()=>Ze(yle())),z=C?await D4(C):void 0,te=R?await D4(R):void 0,ae=L?await D4(L):void 0,le=U.extend({timeout:{socket:I},retry:v,https:{rejectUnauthorized:x,certificateAuthority:z,certificate:te,key:ae},...E});return r.getLimit(\"networkConcurrency\")(()=>le(A))}var Ile,Ble,b4,P4,Ele,Cle,Ust,_st,Dle,uS=Et(()=>{Pt();Ile=ve(\"https\"),Ble=ve(\"http\"),b4=Ze($o()),P4=Ze(zse());Wl();jl();ql();Ele=new Map,Cle=new Map,Ust=new Ble.Agent({keepAlive:!0}),_st=new Ile.Agent({keepAlive:!0});Dle=(a=>(a.GET=\"GET\",a.PUT=\"PUT\",a.POST=\"POST\",a.DELETE=\"DELETE\",a))(Dle||{})});var Xi={};Vt(Xi,{availableParallelism:()=>Q4,getArchitecture:()=>a1,getArchitectureName:()=>zst,getArchitectureSet:()=>k4,getCaller:()=>$st,major:()=>Yst,openUrl:()=>Wst});function Vst(){if(process.platform===\"darwin\"||process.platform===\"win32\")return null;let t;try{t=oe.readFileSync(Kst)}catch{}if(typeof t<\"u\"){if(t&&(t.includes(\"GLIBC\")||t.includes(\"libc\")))return\"glibc\";if(t&&t.includes(\"musl\"))return\"musl\"}let r=(process.report?.getReport()??{}).sharedObjects??[],o=/\\/(?:(ld-linux-|[^/]+-linux-gnu\\/)|(libc.musl-|ld-musl-))/;return zp(r,a=>{let n=a.match(o);if(!n)return zp.skip;if(n[1])return\"glibc\";if(n[2])return\"musl\";throw new Error(\"Assertion failed: Expected the libc variant to have been detected\")})??null}function a1(){return ble=ble??{os:process.platform,cpu:process.arch,libc:Vst()}}function zst(t=a1()){return t.libc?`${t.os}-${t.cpu}-${t.libc}`:`${t.os}-${t.cpu}`}function k4(){let t=a1();return Sle=Sle??{os:[t.os],cpu:[t.cpu],libc:t.libc?[t.libc]:[]}}function Zst(t){let e=Jst.exec(t);if(!e)return null;let r=e[2]&&e[2].indexOf(\"native\")===0,o=e[2]&&e[2].indexOf(\"eval\")===0,a=Xst.exec(e[2]);return o&&a!=null&&(e[2]=a[1],e[3]=a[2],e[4]=a[3]),{file:r?null:e[2],methodName:e[1]||\"<unknown>\",arguments:r?[e[2]]:[],line:e[3]?+e[3]:null,column:e[4]?+e[4]:null}}function $st(){let e=new Error().stack.split(`\n`)[3];return Zst(e)}function Q4(){return typeof AS.default.availableParallelism<\"u\"?AS.default.availableParallelism():Math.max(1,AS.default.cpus().length)}var AS,Yst,Ple,Wst,Kst,ble,Sle,Jst,Xst,fS=Et(()=>{Pt();AS=Ze(ve(\"os\"));pS();ql();Yst=Number(process.versions.node.split(\".\")[0]),Ple=new Map([[\"darwin\",\"open\"],[\"linux\",\"xdg-open\"],[\"win32\",\"explorer.exe\"]]).get(process.platform),Wst=typeof Ple<\"u\"?async t=>{try{return await F4(Ple,[t],{cwd:V.cwd()}),!0}catch{return!1}}:void 0,Kst=\"/usr/bin/ldd\";Jst=/^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\\/|[a-z]:\\\\|\\\\\\\\).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,Xst=/\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/});function M4(t,e,r,o,a){let n=VI(r);if(o.isArray||o.type===\"ANY\"&&Array.isArray(n))return Array.isArray(n)?n.map((u,A)=>R4(t,`${e}[${A}]`,u,o,a)):String(n).split(/,/).map(u=>R4(t,e,u,o,a));if(Array.isArray(n))throw new Error(`Non-array configuration settings \"${e}\" cannot be an array`);return R4(t,e,r,o,a)}function R4(t,e,r,o,a){let n=VI(r);switch(o.type){case\"ANY\":return Fb(n);case\"SHAPE\":return not(t,e,r,o,a);case\"MAP\":return iot(t,e,r,o,a)}if(n===null&&!o.isNullable&&o.default!==null)throw new Error(`Non-nullable configuration settings \"${e}\" cannot be set to null`);if(o.values?.includes(n))return n;let A=(()=>{if(o.type===\"BOOLEAN\"&&typeof n!=\"string\")return QI(n);if(typeof n!=\"string\")throw new Error(`Expected configuration setting \"${e}\" to be a string, got ${typeof n}`);let p=YP(n,{env:t.env});switch(o.type){case\"ABSOLUTE_PATH\":{let h=a,E=cO(r);return E&&E[0]!==\"<\"&&(h=V.dirname(E)),V.resolve(h,ue.toPortablePath(p))}case\"LOCATOR_LOOSE\":return bf(p,!1);case\"NUMBER\":return parseInt(p);case\"LOCATOR\":return bf(p);case\"BOOLEAN\":return QI(p);default:return p}})();if(o.values&&!o.values.includes(A))throw new Error(`Invalid value, expected one of ${o.values.join(\", \")}`);return A}function not(t,e,r,o,a){let n=VI(r);if(typeof n!=\"object\"||Array.isArray(n))throw new st(`Object configuration settings \"${e}\" must be an object`);let u=O4(t,o,{ignoreArrays:!0});if(n===null)return u;for(let[A,p]of Object.entries(n)){let h=`${e}.${A}`;if(!o.properties[A])throw new st(`Unrecognized configuration settings found: ${e}.${A} - run \"yarn config -v\" to see the list of settings supported in Yarn`);u.set(A,M4(t,h,p,o.properties[A],a))}return u}function iot(t,e,r,o,a){let n=VI(r),u=new Map;if(typeof n!=\"object\"||Array.isArray(n))throw new st(`Map configuration settings \"${e}\" must be an object`);if(n===null)return u;for(let[A,p]of Object.entries(n)){let h=o.normalizeKeys?o.normalizeKeys(A):A,E=`${e}['${h}']`,I=o.valueDefinition;u.set(h,M4(t,E,p,I,a))}return u}function O4(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case\"SHAPE\":{if(e.isArray&&!r)return[];let o=new Map;for(let[a,n]of Object.entries(e.properties))o.set(a,O4(t,n));return o}case\"MAP\":return e.isArray&&!r?[]:new Map;case\"ABSOLUTE_PATH\":return e.default===null?null:t.projectCwd===null?Array.isArray(e.default)?e.default.map(o=>V.normalize(o)):V.isAbsolute(e.default)?V.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(o=>V.resolve(t.projectCwd,o)):V.resolve(t.projectCwd,e.default);default:return e.default}}function gS(t,e,r){if(e.type===\"SECRET\"&&typeof t==\"string\"&&r.hideSecrets)return rot;if(e.type===\"ABSOLUTE_PATH\"&&typeof t==\"string\"&&r.getNativePaths)return ue.fromPortablePath(t);if(e.isArray&&Array.isArray(t)){let o=[];for(let a of t)o.push(gS(a,e,r));return o}if(e.type===\"MAP\"&&t instanceof Map){if(t.size===0)return;let o=new Map;for(let[a,n]of t.entries()){let u=gS(n,e.valueDefinition,r);typeof u<\"u\"&&o.set(a,u)}return o}if(e.type===\"SHAPE\"&&t instanceof Map){if(t.size===0)return;let o=new Map;for(let[a,n]of t.entries()){let u=e.properties[a],A=gS(n,u,r);typeof A<\"u\"&&o.set(a,A)}return o}return t}function sot(){let t={};for(let[e,r]of Object.entries(process.env))e=e.toLowerCase(),e.startsWith(dS)&&(e=(0,kle.default)(e.slice(dS.length)),t[e]=r);return t}function N4(){let t=`${dS}rc_filename`;for(let[e,r]of Object.entries(process.env))if(e.toLowerCase()===t&&typeof r==\"string\")return r;return L4}async function xle(t){try{return await oe.readFilePromise(t)}catch{return Buffer.of()}}async function oot(t,e){return Buffer.compare(...await Promise.all([xle(t),xle(e)]))===0}async function aot(t,e){let[r,o]=await Promise.all([oe.statPromise(t),oe.statPromise(e)]);return r.dev===o.dev&&r.ino===o.ino}async function cot({configuration:t,selfPath:e}){let r=t.get(\"yarnPath\");return t.get(\"ignorePath\")||r===null||r===e||await lot(r,e)?null:r}var kle,Tf,Qle,Fle,Rle,T4,eot,l1,tot,ly,dS,L4,rot,c1,Tle,mS,hS,lot,Ke,u1=Et(()=>{Pt();Nl();kle=Ze(sV()),Tf=Ze(X0());qt();Qle=Ze(ZV()),Fle=ve(\"module\"),Rle=Ze(eg()),T4=ve(\"stream\");use();Gm();tO();rO();nO();Ose();iO();mg();jse();Tb();jl();rh();uS();ql();fS();xf();So();eot=function(){if(!Tf.GITHUB_ACTIONS||!process.env.GITHUB_EVENT_PATH)return!1;let t=ue.toPortablePath(process.env.GITHUB_EVENT_PATH),e;try{e=oe.readJsonSync(t)}catch{return!1}return!(!(\"repository\"in e)||!e.repository||(e.repository.private??!0))}(),l1=new Set([\"@yarnpkg/plugin-constraints\",\"@yarnpkg/plugin-exec\",\"@yarnpkg/plugin-interactive-tools\",\"@yarnpkg/plugin-stage\",\"@yarnpkg/plugin-typescript\",\"@yarnpkg/plugin-version\",\"@yarnpkg/plugin-workspace-tools\"]),tot=new Set([\"isTestEnv\",\"injectNpmUser\",\"injectNpmPassword\",\"injectNpm2FaToken\",\"zipDataEpilogue\",\"cacheCheckpointOverride\",\"cacheVersionOverride\",\"lockfileVersionOverride\",\"binFolder\",\"version\",\"flags\",\"profile\",\"gpg\",\"ignoreNode\",\"wrapOutput\",\"home\",\"confDir\",\"registry\",\"ignoreCwd\"]),ly=/^(?!v)[a-z0-9._-]+$/i,dS=\"yarn_\",L4=\".yarnrc.yml\",rot=\"********\",c1=(E=>(E.ANY=\"ANY\",E.BOOLEAN=\"BOOLEAN\",E.ABSOLUTE_PATH=\"ABSOLUTE_PATH\",E.LOCATOR=\"LOCATOR\",E.LOCATOR_LOOSE=\"LOCATOR_LOOSE\",E.NUMBER=\"NUMBER\",E.STRING=\"STRING\",E.SECRET=\"SECRET\",E.SHAPE=\"SHAPE\",E.MAP=\"MAP\",E))(c1||{}),Tle=yt,mS=(r=>(r.JUNCTIONS=\"junctions\",r.SYMLINKS=\"symlinks\",r))(mS||{}),hS={lastUpdateCheck:{description:\"Last timestamp we checked whether new Yarn versions were available\",type:\"STRING\",default:null},yarnPath:{description:\"Path to the local executable that must be used over the global one\",type:\"ABSOLUTE_PATH\",default:null},ignorePath:{description:\"If true, the local executable will be ignored when using the global one\",type:\"BOOLEAN\",default:!1},globalFolder:{description:\"Folder where all system-global files are stored\",type:\"ABSOLUTE_PATH\",default:AO()},cacheFolder:{description:\"Folder where the cache files must be written\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/cache\"},compressionLevel:{description:\"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)\",type:\"NUMBER\",values:[\"mixed\",0,1,2,3,4,5,6,7,8,9],default:0},virtualFolder:{description:\"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/__virtual__\"},installStatePath:{description:\"Path of the file where the install state will be persisted\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/install-state.gz\"},immutablePatterns:{description:\"Array of glob patterns; files matching them won't be allowed to change during immutable installs\",type:\"STRING\",default:[],isArray:!0},rcFilename:{description:\"Name of the files where the configuration can be found\",type:\"STRING\",default:N4()},enableGlobalCache:{description:\"If true, the system-wide cache folder will be used regardless of `cache-folder`\",type:\"BOOLEAN\",default:!0},cacheMigrationMode:{description:\"Defines the conditions under which Yarn upgrades should cause the cache archives to be regenerated.\",type:\"STRING\",values:[\"always\",\"match-spec\",\"required-only\"],default:\"always\"},enableColors:{description:\"If true, the CLI is allowed to use colors in its output\",type:\"BOOLEAN\",default:VP,defaultText:\"<dynamic>\"},enableHyperlinks:{description:\"If true, the CLI is allowed to use hyperlinks in its output\",type:\"BOOLEAN\",default:dL,defaultText:\"<dynamic>\"},enableInlineBuilds:{description:\"If true, the CLI will print the build output on the command line\",type:\"BOOLEAN\",default:Tf.isCI,defaultText:\"<dynamic>\"},enableMessageNames:{description:\"If true, the CLI will prefix most messages with codes suitable for search engines\",type:\"BOOLEAN\",default:!0},enableProgressBars:{description:\"If true, the CLI is allowed to show a progress bar for long-running events\",type:\"BOOLEAN\",default:!Tf.isCI,defaultText:\"<dynamic>\"},enableTimers:{description:\"If true, the CLI is allowed to print the time spent executing commands\",type:\"BOOLEAN\",default:!0},enableTips:{description:\"If true, installs will print a helpful message every day of the week\",type:\"BOOLEAN\",default:!Tf.isCI,defaultText:\"<dynamic>\"},preferInteractive:{description:\"If true, the CLI will automatically use the interactive mode when called from a TTY\",type:\"BOOLEAN\",default:!1},preferTruncatedLines:{description:\"If true, the CLI will truncate lines that would go beyond the size of the terminal\",type:\"BOOLEAN\",default:!1},progressBarStyle:{description:\"Which style of progress bar should be used (only when progress bars are enabled)\",type:\"STRING\",default:void 0,defaultText:\"<dynamic>\"},defaultLanguageName:{description:\"Default language mode that should be used when a package doesn't offer any insight\",type:\"STRING\",default:\"node\"},defaultProtocol:{description:\"Default resolution protocol used when resolving pure semver and tag ranges\",type:\"STRING\",default:\"npm:\"},enableTransparentWorkspaces:{description:\"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol\",type:\"BOOLEAN\",default:!0},supportedArchitectures:{description:\"Architectures that Yarn will fetch and inject into the resolver\",type:\"SHAPE\",properties:{os:{description:\"Array of supported process.platform strings, or null to target them all\",type:\"STRING\",isArray:!0,isNullable:!0,default:[\"current\"]},cpu:{description:\"Array of supported process.arch strings, or null to target them all\",type:\"STRING\",isArray:!0,isNullable:!0,default:[\"current\"]},libc:{description:\"Array of supported libc libraries, or null to target them all\",type:\"STRING\",isArray:!0,isNullable:!0,default:[\"current\"]}}},enableMirror:{description:\"If true, the downloaded packages will be retrieved and stored in both the local and global folders\",type:\"BOOLEAN\",default:!0},enableNetwork:{description:\"If false, Yarn will refuse to use the network if required to\",type:\"BOOLEAN\",default:!0},enableOfflineMode:{description:\"If true, Yarn will attempt to retrieve files and metadata from the global cache rather than the network\",type:\"BOOLEAN\",default:!1},httpProxy:{description:\"URL of the http proxy that must be used for outgoing http requests\",type:\"STRING\",default:null},httpsProxy:{description:\"URL of the http proxy that must be used for outgoing https requests\",type:\"STRING\",default:null},unsafeHttpWhitelist:{description:\"List of the hostnames for which http queries are allowed (glob patterns are supported)\",type:\"STRING\",default:[],isArray:!0},httpTimeout:{description:\"Timeout of each http request in milliseconds\",type:\"NUMBER\",default:6e4},httpRetry:{description:\"Retry times on http failure\",type:\"NUMBER\",default:3},networkConcurrency:{description:\"Maximal number of concurrent requests\",type:\"NUMBER\",default:50},taskPoolConcurrency:{description:\"Maximal amount of concurrent heavy task processing\",type:\"NUMBER\",default:Q4()},taskPoolMode:{description:\"Execution strategy for heavy tasks\",type:\"STRING\",values:[\"async\",\"workers\"],default:\"workers\"},networkSettings:{description:\"Network settings per hostname (glob patterns are supported)\",type:\"MAP\",valueDefinition:{description:\"\",type:\"SHAPE\",properties:{httpsCaFilePath:{description:\"Path to file containing one or multiple Certificate Authority signing certificates\",type:\"ABSOLUTE_PATH\",default:null},enableNetwork:{description:\"If false, the package manager will refuse to use the network if required to\",type:\"BOOLEAN\",default:null},httpProxy:{description:\"URL of the http proxy that must be used for outgoing http requests\",type:\"STRING\",default:null},httpsProxy:{description:\"URL of the http proxy that must be used for outgoing https requests\",type:\"STRING\",default:null},httpsKeyFilePath:{description:\"Path to file containing private key in PEM format\",type:\"ABSOLUTE_PATH\",default:null},httpsCertFilePath:{description:\"Path to file containing certificate chain in PEM format\",type:\"ABSOLUTE_PATH\",default:null}}}},httpsCaFilePath:{description:\"A path to a file containing one or multiple Certificate Authority signing certificates\",type:\"ABSOLUTE_PATH\",default:null},httpsKeyFilePath:{description:\"Path to file containing private key in PEM format\",type:\"ABSOLUTE_PATH\",default:null},httpsCertFilePath:{description:\"Path to file containing certificate chain in PEM format\",type:\"ABSOLUTE_PATH\",default:null},enableStrictSsl:{description:\"If false, SSL certificate errors will be ignored\",type:\"BOOLEAN\",default:!0},logFilters:{description:\"Overrides for log levels\",type:\"SHAPE\",isArray:!0,concatenateValues:!0,properties:{code:{description:\"Code of the messages covered by this override\",type:\"STRING\",default:void 0},text:{description:\"Code of the texts covered by this override\",type:\"STRING\",default:void 0},pattern:{description:\"Code of the patterns covered by this override\",type:\"STRING\",default:void 0},level:{description:\"Log level override, set to null to remove override\",type:\"STRING\",values:Object.values(JP),isNullable:!0,default:void 0}}},enableTelemetry:{description:\"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry\",type:\"BOOLEAN\",default:!0},telemetryInterval:{description:\"Minimal amount of time between two telemetry uploads, in days\",type:\"NUMBER\",default:7},telemetryUserId:{description:\"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.\",type:\"STRING\",default:null},enableHardenedMode:{description:\"If true, automatically enable --check-resolutions --refresh-lockfile on installs\",type:\"BOOLEAN\",default:Tf.isPR&&eot,defaultText:\"<true on public PRs>\"},enableScripts:{description:\"If true, packages are allowed to have install scripts by default\",type:\"BOOLEAN\",default:!0},enableStrictSettings:{description:\"If true, unknown settings will cause Yarn to abort\",type:\"BOOLEAN\",default:!0},enableImmutableCache:{description:\"If true, the cache is reputed immutable and actions that would modify it will throw\",type:\"BOOLEAN\",default:!1},checksumBehavior:{description:\"Enumeration defining what to do when a checksum doesn't match expectations\",type:\"STRING\",default:\"throw\"},injectEnvironmentFiles:{description:\"List of all the environment files that Yarn should inject inside the process when it starts\",type:\"ABSOLUTE_PATH\",default:[\".env.yarn?\"],isArray:!0},packageExtensions:{description:\"Map of package corrections to apply on the dependency tree\",type:\"MAP\",valueDefinition:{description:\"The extension that will be applied to any package whose version matches the specified range\",type:\"SHAPE\",properties:{dependencies:{description:\"The set of dependencies that must be made available to the current package in order for it to work properly\",type:\"MAP\",valueDefinition:{description:\"A range\",type:\"STRING\"}},peerDependencies:{description:\"Inherited dependencies - the consumer of the package will be tasked to provide them\",type:\"MAP\",valueDefinition:{description:\"A semver range\",type:\"STRING\"}},peerDependenciesMeta:{description:\"Extra information related to the dependencies listed in the peerDependencies field\",type:\"MAP\",valueDefinition:{description:\"The peerDependency meta\",type:\"SHAPE\",properties:{optional:{description:\"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error\",type:\"BOOLEAN\",default:!1}}}}}}}};lot=process.platform===\"win32\"?oot:aot;Ke=class t{constructor(e){this.isCI=Tf.isCI;this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.env={};this.limits=new Map;this.packageExtensions=null;this.startingCwd=e}static{this.deleteProperty=Symbol()}static{this.telemetry=null}static create(e,r,o){let a=new t(e);typeof r<\"u\"&&!(r instanceof Map)&&(a.projectCwd=r),a.importSettings(hS);let n=typeof o<\"u\"?o:r instanceof Map?r:new Map;for(let[u,A]of n)a.activatePlugin(u,A);return a}static async find(e,r,{strict:o=!0,usePathCheck:a=null,useRc:n=!0}={}){let u=sot();delete u.rcFilename;let A=new t(e),p=await t.findRcFiles(e),h=await t.findFolderRcFile(Jm());h&&(p.find(Ce=>Ce.path===h.path)||p.unshift(h));let E=qse(p.map(ce=>[ce.path,ce.data])),I=It.dot,v=new Set(Object.keys(hS)),x=({yarnPath:ce,ignorePath:Ce,injectEnvironmentFiles:de})=>({yarnPath:ce,ignorePath:Ce,injectEnvironmentFiles:de}),C=({yarnPath:ce,ignorePath:Ce,injectEnvironmentFiles:de,...Be})=>{let Ee={};for(let[g,me]of Object.entries(Be))v.has(g)&&(Ee[g]=me);return Ee},R=({yarnPath:ce,ignorePath:Ce,...de})=>{let Be={};for(let[Ee,g]of Object.entries(de))v.has(Ee)||(Be[Ee]=g);return Be};if(A.importSettings(x(hS)),A.useWithSource(\"<environment>\",x(u),e,{strict:!1}),E){let[ce,Ce]=E;A.useWithSource(ce,x(Ce),I,{strict:!1})}if(a){if(await cot({configuration:A,selfPath:a})!==null)return A;A.useWithSource(\"<override>\",{ignorePath:!0},e,{strict:!1,overwrite:!0})}let L=await t.findProjectCwd(e);A.startingCwd=e,A.projectCwd=L;let U=Object.assign(Object.create(null),process.env);A.env=U;let z=await Promise.all(A.get(\"injectEnvironmentFiles\").map(async ce=>{let Ce=ce.endsWith(\"?\")?await oe.readFilePromise(ce.slice(0,-1),\"utf8\").catch(()=>\"\"):await oe.readFilePromise(ce,\"utf8\");return(0,Qle.parse)(Ce)}));for(let ce of z)for(let[Ce,de]of Object.entries(ce))A.env[Ce]=YP(de,{env:U});if(A.importSettings(C(hS)),A.useWithSource(\"<environment>\",C(u),e,{strict:o}),E){let[ce,Ce]=E;A.useWithSource(ce,C(Ce),I,{strict:o})}let te=ce=>\"default\"in ce?ce.default:ce,ae=new Map([[\"@@core\",cse]]);if(r!==null)for(let ce of r.plugins.keys())ae.set(ce,te(r.modules.get(ce)));for(let[ce,Ce]of ae)A.activatePlugin(ce,Ce);let le=new Map([]);if(r!==null){let ce=new Map;for(let[Be,Ee]of r.modules)ce.set(Be,()=>Ee);let Ce=new Set,de=async(Be,Ee)=>{let{factory:g,name:me}=vf(Be);if(!g||Ce.has(me))return;let we=new Map(ce),Ae=Z=>{if((0,Fle.isBuiltin)(Z))return vf(Z);if(we.has(Z))return we.get(Z)();throw new st(`This plugin cannot access the package referenced via ${Z} which is neither a builtin, nor an exposed entry`)},ne=await xm(async()=>te(await g(Ae)),Z=>`${Z} (when initializing ${me}, defined in ${Ee})`);ce.set(me,()=>ne),Ce.add(me),le.set(me,ne)};if(u.plugins)for(let Be of u.plugins.split(\";\")){let Ee=V.resolve(e,ue.toPortablePath(Be));await de(Ee,\"<environment>\")}for(let{path:Be,cwd:Ee,data:g}of p)if(n&&Array.isArray(g.plugins))for(let me of g.plugins){let we=typeof me!=\"string\"?me.path:me,Ae=me?.spec??\"\",ne=me?.checksum??\"\";if(l1.has(Ae))continue;let Z=V.resolve(Ee,ue.toPortablePath(we));if(!await oe.existsPromise(Z)){if(!Ae){let ht=Ot(A,V.basename(Z,\".cjs\"),yt.NAME),H=Ot(A,\".gitignore\",yt.NAME),rt=Ot(A,A.values.get(\"rcFilename\"),yt.NAME),Te=Ot(A,\"https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored\",yt.URL);throw new st(`Missing source for the ${ht} plugin - please try to remove the plugin from ${rt} then reinstall it manually. This error usually occurs because ${H} is incorrect, check ${Te} to make sure your plugin folder isn't gitignored.`)}if(!Ae.match(/^https?:/)){let ht=Ot(A,V.basename(Z,\".cjs\"),yt.NAME),H=Ot(A,A.values.get(\"rcFilename\"),yt.NAME);throw new st(`Failed to recognize the source for the ${ht} plugin - please try to delete the plugin from ${H} then reinstall it manually.`)}let xe=await S4(Ae,{configuration:A}),Ne=zi(xe);if(ne&&ne!==Ne){let ht=Ot(A,V.basename(Z,\".cjs\"),yt.NAME),H=Ot(A,A.values.get(\"rcFilename\"),yt.NAME),rt=Ot(A,`yarn plugin import ${Ae}`,yt.CODE);throw new st(`Failed to fetch the ${ht} plugin from its remote location: its checksum seems to have changed. If this is expected, please remove the plugin from ${H} then run ${rt} to reimport it.`)}await oe.mkdirPromise(V.dirname(Z),{recursive:!0}),await oe.writeFilePromise(Z,xe)}await de(Z,Be)}}for(let[ce,Ce]of le)A.activatePlugin(ce,Ce);if(A.useWithSource(\"<environment>\",R(u),e,{strict:o}),E){let[ce,Ce]=E;A.useWithSource(ce,R(Ce),I,{strict:o})}return A.get(\"enableGlobalCache\")&&(A.values.set(\"cacheFolder\",`${A.get(\"globalFolder\")}/cache`),A.sources.set(\"cacheFolder\",\"<internal>\")),A}static async findRcFiles(e){let r=N4(),o=[],a=e,n=null;for(;a!==n;){n=a;let u=V.join(n,r);if(oe.existsSync(u)){let A=await oe.readFilePromise(u,\"utf8\"),p;try{p=Ki(A)}catch{let E=\"\";throw A.match(/^\\s+(?!-)[^:]+\\s+\\S+/m)&&(E=\" (in particular, make sure you list the colons after each key name)\"),new st(`Parse error when loading ${u}; please check it's proper Yaml${E}`)}o.unshift({path:u,cwd:n,data:p})}a=V.dirname(n)}return o}static async findFolderRcFile(e){let r=V.join(e,dr.rc),o;try{o=await oe.readFilePromise(r,\"utf8\")}catch(n){if(n.code===\"ENOENT\")return null;throw n}let a=Ki(o);return{path:r,cwd:e,data:a}}static async findProjectCwd(e){let r=null,o=e,a=null;for(;o!==a;){if(a=o,oe.existsSync(V.join(a,dr.lockfile)))return a;oe.existsSync(V.join(a,dr.manifest))&&(r=a),o=V.dirname(a)}return r}static async updateConfiguration(e,r,o={}){let a=N4(),n=V.join(e,a),u=oe.existsSync(n)?Ki(await oe.readFilePromise(n,\"utf8\")):{},A=!1,p;if(typeof r==\"function\"){try{p=r(u)}catch{p=r({})}if(p===u)return!1}else{p=u;for(let h of Object.keys(r)){let E=u[h],I=r[h],v;if(typeof I==\"function\")try{v=I(E)}catch{v=I(void 0)}else v=I;E!==v&&(v===t.deleteProperty?delete p[h]:p[h]=v,A=!0)}if(!A)return!1}return await oe.changeFilePromise(n,Da(p),{automaticNewlines:!0}),!0}static async addPlugin(e,r){r.length!==0&&await t.updateConfiguration(e,o=>{let a=o.plugins??[];if(a.length===0)return{...o,plugins:r};let n=[],u=[...r];for(let A of a){let p=typeof A!=\"string\"?A.path:A,h=u.find(E=>E.path===p);h?(n.push(h),u=u.filter(E=>E!==h)):n.push(A)}return n.push(...u),{...o,plugins:n}})}static async updateHomeConfiguration(e){let r=Jm();return await t.updateConfiguration(r,e)}activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration<\"u\"&&this.importSettings(r.configuration)}importSettings(e){for(let[r,o]of Object.entries(e))if(o!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings \"${r}\"`);this.settings.set(r,o),this.values.set(r,O4(this,o))}}useWithSource(e,r,o,a){try{this.use(e,r,o,a)}catch(n){throw n.message+=` (in ${Ot(this,e,yt.PATH)})`,n}}use(e,r,o,{strict:a=!0,overwrite:n=!1}={}){a=a&&this.get(\"enableStrictSettings\");for(let u of[\"enableStrictSettings\",...Object.keys(r)]){let A=r[u],p=cO(A);if(p&&(e=p),typeof A>\"u\"||u===\"plugins\"||e===\"<environment>\"&&tot.has(u))continue;if(u===\"rcFilename\")throw new st(`The rcFilename settings can only be set via ${`${dS}RC_FILENAME`.toUpperCase()}, not via a rc file`);let h=this.settings.get(u);if(!h){let I=Jm(),v=e[0]!==\"<\"?V.dirname(e):null;if(a&&!(v!==null?I===v:!1))throw new st(`Unrecognized or legacy configuration settings found: ${u} - run \"yarn config -v\" to see the list of settings supported in Yarn`);this.invalid.set(u,e);continue}if(this.sources.has(u)&&!(n||h.type===\"MAP\"||h.isArray&&h.concatenateValues))continue;let E;try{E=M4(this,u,A,h,o)}catch(I){throw I.message+=` in ${Ot(this,e,yt.PATH)}`,I}if(u===\"enableStrictSettings\"&&e!==\"<environment>\"){a=E;continue}if(h.type===\"MAP\"){let I=this.values.get(u);this.values.set(u,new Map(n?[...I,...E]:[...E,...I])),this.sources.set(u,`${this.sources.get(u)}, ${e}`)}else if(h.isArray&&h.concatenateValues){let I=this.values.get(u);this.values.set(u,n?[...I,...E]:[...E,...I]),this.sources.set(u,`${this.sources.get(u)}, ${e}`)}else this.values.set(u,E),this.sources.set(u,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key \"${e}\"`);return this.values.get(e)}getSpecial(e,{hideSecrets:r=!1,getNativePaths:o=!1}){let a=this.get(e),n=this.settings.get(e);if(typeof n>\"u\")throw new st(`Couldn't find a configuration settings named \"${e}\"`);return gS(a,n,{hideSecrets:r,getNativePaths:o})}getSubprocessStreams(e,{header:r,prefix:o,report:a}){let n,u,A=oe.createWriteStream(e);if(this.get(\"enableInlineBuilds\")){let p=a.createStreamReporter(`${o} ${Ot(this,\"STDOUT\",\"green\")}`),h=a.createStreamReporter(`${o} ${Ot(this,\"STDERR\",\"red\")}`);n=new T4.PassThrough,n.pipe(p),n.pipe(A),u=new T4.PassThrough,u.pipe(h),u.pipe(A)}else n=A,u=A,typeof r<\"u\"&&n.write(`${r}\n`);return{stdout:n,stderr:u}}makeResolver(){let e=[];for(let r of this.plugins.values())for(let o of r.resolvers||[])e.push(new o);return new yg([new Qb,new ei,...e])}makeFetcher(){let e=[];for(let r of this.plugins.values())for(let o of r.fetchers||[])e.push(new o);return new Wm([new Km,new Vm,...e])}getLinkers(){let e=[];for(let r of this.plugins.values())for(let o of r.linkers||[])e.push(new o);return e}getSupportedArchitectures(){let e=a1(),r=this.get(\"supportedArchitectures\"),o=r.get(\"os\");o!==null&&(o=o.map(u=>u===\"current\"?e.os:u));let a=r.get(\"cpu\");a!==null&&(a=a.map(u=>u===\"current\"?e.cpu:u));let n=r.get(\"libc\");return n!==null&&(n=ol(n,u=>u===\"current\"?e.libc??ol.skip:u)),{os:o,cpu:a,libc:n}}isInteractive({interactive:e,stdout:r}){return r.isTTY?e??this.get(\"preferInteractive\"):!1}async getPackageExtensions(){if(this.packageExtensions!==null)return this.packageExtensions;this.packageExtensions=new Map;let e=this.packageExtensions,r=(o,a,{userProvided:n=!1}={})=>{if(!Qa(o.range))throw new Error(\"Only semver ranges are allowed as keys for the packageExtensions setting\");let u=new Ut;u.load(a,{yamlCompatibilityMode:!0});let A=xI(e,o.identHash),p=[];A.push([o.range,p]);let h={status:\"inactive\",userProvided:n,parentDescriptor:o};for(let E of u.dependencies.values())p.push({...h,type:\"Dependency\",descriptor:E});for(let E of u.peerDependencies.values())p.push({...h,type:\"PeerDependency\",descriptor:E});for(let[E,I]of u.peerDependenciesMeta)for(let[v,x]of Object.entries(I))p.push({...h,type:\"PeerDependencyMeta\",selector:E,key:v,value:x})};await this.triggerHook(o=>o.registerPackageExtensions,this,r);for(let[o,a]of this.get(\"packageExtensions\"))r(nh(o,!0),GP(a),{userProvided:!0});return e}normalizeLocator(e){return Qa(e.reference)?Rs(e,`${this.get(\"defaultProtocol\")}${e.reference}`):ly.test(e.reference)?Rs(e,`${this.get(\"defaultProtocol\")}${e.reference}`):e}normalizeDependency(e){return Qa(e.range)?In(e,`${this.get(\"defaultProtocol\")}${e.range}`):ly.test(e.range)?In(e,`${this.get(\"defaultProtocol\")}${e.range}`):e}normalizeDependencyMap(e){return new Map([...e].map(([r,o])=>[r,this.normalizeDependency(o)]))}normalizePackage(e,{packageExtensions:r}){let o=OI(e),a=r.get(e.identHash);if(typeof a<\"u\"){let u=e.version;if(u!==null){for(let[A,p]of a)if(tA(u,A))for(let h of p)switch(h.status===\"inactive\"&&(h.status=\"redundant\"),h.type){case\"Dependency\":typeof o.dependencies.get(h.descriptor.identHash)>\"u\"&&(h.status=\"active\",o.dependencies.set(h.descriptor.identHash,this.normalizeDependency(h.descriptor)));break;case\"PeerDependency\":typeof o.peerDependencies.get(h.descriptor.identHash)>\"u\"&&(h.status=\"active\",o.peerDependencies.set(h.descriptor.identHash,h.descriptor));break;case\"PeerDependencyMeta\":{let E=o.peerDependenciesMeta.get(h.selector);(typeof E>\"u\"||!Object.hasOwn(E,h.key)||E[h.key]!==h.value)&&(h.status=\"active\",al(o.peerDependenciesMeta,h.selector,()=>({}))[h.key]=h.value)}break;default:cL(h)}}}let n=u=>u.scope?`${u.scope}__${u.name}`:`${u.name}`;for(let u of o.peerDependenciesMeta.keys()){let A=ea(u);o.peerDependencies.has(A.identHash)||o.peerDependencies.set(A.identHash,In(A,\"*\"))}for(let u of o.peerDependencies.values()){if(u.scope===\"types\")continue;let A=n(u),p=eA(\"types\",A),h=rn(p);o.peerDependencies.has(p.identHash)||o.peerDependenciesMeta.has(h)||(o.peerDependencies.set(p.identHash,In(p,\"*\")),o.peerDependenciesMeta.set(h,{optional:!0}))}return o.dependencies=new Map(Fs(o.dependencies,([,u])=>xa(u))),o.peerDependencies=new Map(Fs(o.peerDependencies,([,u])=>xa(u))),o}getLimit(e){return al(this.limits,e,()=>(0,Rle.default)(this.get(e)))}async triggerHook(e,...r){for(let o of this.plugins.values()){let a=o.hooks;if(!a)continue;let n=e(a);n&&await n(...r)}}async triggerMultipleHooks(e,r){for(let o of r)await this.triggerHook(e,...o)}async reduceHook(e,r,...o){let a=r;for(let n of this.plugins.values()){let u=n.hooks;if(!u)continue;let A=e(u);A&&(a=await A(a,...o))}return a}async firstHook(e,...r){for(let o of this.plugins.values()){let a=o.hooks;if(!a)continue;let n=e(a);if(!n)continue;let u=await n(...r);if(typeof u<\"u\")return u}return null}}});var Ur={};Vt(Ur,{EndStrategy:()=>q4,ExecError:()=>yS,PipeError:()=>A1,execvp:()=>F4,pipevp:()=>Wc});function Ig(t){return t!==null&&typeof t.fd==\"number\"}function U4(){}function _4(){for(let t of Bg)t.kill()}async function Wc(t,e,{cwd:r,env:o=process.env,strict:a=!1,stdin:n=null,stdout:u,stderr:A,end:p=2}){let h=[\"pipe\",\"pipe\",\"pipe\"];n===null?h[0]=\"ignore\":Ig(n)&&(h[0]=n),Ig(u)&&(h[1]=u),Ig(A)&&(h[2]=A);let E=(0,H4.default)(t,e,{cwd:ue.fromPortablePath(r),env:{...o,PWD:ue.fromPortablePath(r)},stdio:h});Bg.add(E),Bg.size===1&&(process.on(\"SIGINT\",U4),process.on(\"SIGTERM\",_4)),!Ig(n)&&n!==null&&n.pipe(E.stdin),Ig(u)||E.stdout.pipe(u,{end:!1}),Ig(A)||E.stderr.pipe(A,{end:!1});let I=()=>{for(let v of new Set([u,A]))Ig(v)||v.end()};return new Promise((v,x)=>{E.on(\"error\",C=>{Bg.delete(E),Bg.size===0&&(process.off(\"SIGINT\",U4),process.off(\"SIGTERM\",_4)),(p===2||p===1)&&I(),x(C)}),E.on(\"close\",(C,R)=>{Bg.delete(E),Bg.size===0&&(process.off(\"SIGINT\",U4),process.off(\"SIGTERM\",_4)),(p===2||p===1&&C!==0)&&I(),C===0||!a?v({code:j4(C,R)}):x(new A1({fileName:t,code:C,signal:R}))})})}async function F4(t,e,{cwd:r,env:o=process.env,encoding:a=\"utf8\",strict:n=!1}){let u=[\"ignore\",\"pipe\",\"pipe\"],A=[],p=[],h=ue.fromPortablePath(r);typeof o.PWD<\"u\"&&(o={...o,PWD:h});let E=(0,H4.default)(t,e,{cwd:h,env:o,stdio:u});return E.stdout.on(\"data\",I=>{A.push(I)}),E.stderr.on(\"data\",I=>{p.push(I)}),await new Promise((I,v)=>{E.on(\"error\",x=>{let C=Ke.create(r),R=Ot(C,t,yt.PATH);v(new Jt(1,`Process ${R} failed to spawn`,L=>{L.reportError(1,`  ${Xu(C,{label:\"Thrown Error\",value:Hc(yt.NO_HINT,x.message)})}`)}))}),E.on(\"close\",(x,C)=>{let R=a===\"buffer\"?Buffer.concat(A):Buffer.concat(A).toString(a),L=a===\"buffer\"?Buffer.concat(p):Buffer.concat(p).toString(a);x===0||!n?I({code:j4(x,C),stdout:R,stderr:L}):v(new yS({fileName:t,code:x,signal:C,stdout:R,stderr:L}))})})}function j4(t,e){let r=uot.get(e);return typeof r<\"u\"?128+r:t??1}function Aot(t,e,{configuration:r,report:o}){o.reportError(1,`  ${Xu(r,t!==null?{label:\"Exit Code\",value:Hc(yt.NUMBER,t)}:{label:\"Exit Signal\",value:Hc(yt.CODE,e)})}`)}var H4,q4,A1,yS,Bg,uot,pS=Et(()=>{Pt();H4=Ze(KR());u1();Wl();jl();q4=(o=>(o[o.Never=0]=\"Never\",o[o.ErrorCode=1]=\"ErrorCode\",o[o.Always=2]=\"Always\",o))(q4||{}),A1=class extends Jt{constructor({fileName:e,code:r,signal:o}){let a=Ke.create(V.cwd()),n=Ot(a,e,yt.PATH);super(1,`Child ${n} reported an error`,u=>{Aot(r,o,{configuration:a,report:u})}),this.code=j4(r,o)}},yS=class extends A1{constructor({fileName:e,code:r,signal:o,stdout:a,stderr:n}){super({fileName:e,code:r,signal:o}),this.stdout=a,this.stderr=n}};Bg=new Set;uot=new Map([[\"SIGINT\",2],[\"SIGQUIT\",3],[\"SIGKILL\",9],[\"SIGTERM\",15]])});function Lle(t){Nle=t}function f1(){return typeof G4>\"u\"&&(G4=Nle()),G4}var G4,Nle,Y4=Et(()=>{Nle=()=>{throw new Error(\"Assertion failed: No libzip instance is available, and no factory was configured\")}});var Mle=_((ES,K4)=>{var fot=Object.assign({},ve(\"fs\")),W4=function(){var t=typeof document<\"u\"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename<\"u\"&&(t=t||__filename),function(e){e=e||{};var r=typeof e<\"u\"?e:{},o,a;r.ready=new Promise(function(We,tt){o=We,a=tt});var n={},u;for(u in r)r.hasOwnProperty(u)&&(n[u]=r[u]);var A=[],p=\"./this.program\",h=function(We,tt){throw tt},E=!1,I=!0,v=\"\";function x(We){return r.locateFile?r.locateFile(We,v):v+We}var C,R,L,U;I&&(E?v=ve(\"path\").dirname(v)+\"/\":v=__dirname+\"/\",C=function(tt,Bt){var or=ii(tt);return or?Bt?or:or.toString():(L||(L=fot),U||(U=ve(\"path\")),tt=U.normalize(tt),L.readFileSync(tt,Bt?null:\"utf8\"))},R=function(tt){var Bt=C(tt,!0);return Bt.buffer||(Bt=new Uint8Array(Bt)),me(Bt.buffer),Bt},process.argv.length>1&&(p=process.argv[1].replace(/\\\\/g,\"/\")),A=process.argv.slice(2),h=function(We){process.exit(We)},r.inspect=function(){return\"[Emscripten Module object]\"});var z=r.print||console.log.bind(console),te=r.printErr||console.warn.bind(console);for(u in n)n.hasOwnProperty(u)&&(r[u]=n[u]);n=null,r.arguments&&(A=r.arguments),r.thisProgram&&(p=r.thisProgram),r.quit&&(h=r.quit);var ae=0,le=function(We){ae=We},ce;r.wasmBinary&&(ce=r.wasmBinary);var Ce=r.noExitRuntime||!0;typeof WebAssembly!=\"object\"&&Ri(\"no native wasm support detected\");function de(We,tt,Bt){switch(tt=tt||\"i8\",tt.charAt(tt.length-1)===\"*\"&&(tt=\"i32\"),tt){case\"i1\":return Ye[We>>0];case\"i8\":return Ye[We>>0];case\"i16\":return ap((We>>1)*2);case\"i32\":return Us((We>>2)*4);case\"i64\":return Us((We>>2)*4);case\"float\":return Au((We>>2)*4);case\"double\":return op((We>>3)*8);default:Ri(\"invalid type for getValue: \"+tt)}return null}var Be,Ee=!1,g;function me(We,tt){We||Ri(\"Assertion failed: \"+tt)}function we(We){var tt=r[\"_\"+We];return me(tt,\"Cannot call unknown function \"+We+\", make sure it is exported\"),tt}function Ae(We,tt,Bt,or,ee){var ye={string:function(rs){var bi=0;if(rs!=null&&rs!==0){var qo=(rs.length<<2)+1;bi=Un(qo),ht(rs,bi,qo)}return bi},array:function(rs){var bi=Un(rs.length);return Te(rs,bi),bi}};function Le(rs){return tt===\"string\"?xe(rs):tt===\"boolean\"?!!rs:rs}var ft=we(We),pt=[],Nt=0;if(or)for(var rr=0;rr<or.length;rr++){var $r=ye[Bt[rr]];$r?(Nt===0&&(Nt=Es()),pt[rr]=$r(or[rr])):pt[rr]=or[rr]}var ji=ft.apply(null,pt);return ji=Le(ji),Nt!==0&&qs(Nt),ji}function ne(We,tt,Bt,or){Bt=Bt||[];var ee=Bt.every(function(Le){return Le===\"number\"}),ye=tt!==\"string\";return ye&&ee&&!or?we(We):function(){return Ae(We,tt,Bt,arguments,or)}}var Z=new TextDecoder(\"utf8\");function xe(We,tt){if(!We)return\"\";for(var Bt=We+tt,or=We;!(or>=Bt)&&be[or];)++or;return Z.decode(be.subarray(We,or))}function Ne(We,tt,Bt,or){if(!(or>0))return 0;for(var ee=Bt,ye=Bt+or-1,Le=0;Le<We.length;++Le){var ft=We.charCodeAt(Le);if(ft>=55296&&ft<=57343){var pt=We.charCodeAt(++Le);ft=65536+((ft&1023)<<10)|pt&1023}if(ft<=127){if(Bt>=ye)break;tt[Bt++]=ft}else if(ft<=2047){if(Bt+1>=ye)break;tt[Bt++]=192|ft>>6,tt[Bt++]=128|ft&63}else if(ft<=65535){if(Bt+2>=ye)break;tt[Bt++]=224|ft>>12,tt[Bt++]=128|ft>>6&63,tt[Bt++]=128|ft&63}else{if(Bt+3>=ye)break;tt[Bt++]=240|ft>>18,tt[Bt++]=128|ft>>12&63,tt[Bt++]=128|ft>>6&63,tt[Bt++]=128|ft&63}}return tt[Bt]=0,Bt-ee}function ht(We,tt,Bt){return Ne(We,be,tt,Bt)}function H(We){for(var tt=0,Bt=0;Bt<We.length;++Bt){var or=We.charCodeAt(Bt);or>=55296&&or<=57343&&(or=65536+((or&1023)<<10)|We.charCodeAt(++Bt)&1023),or<=127?++tt:or<=2047?tt+=2:or<=65535?tt+=3:tt+=4}return tt}function rt(We){var tt=H(We)+1,Bt=Ni(tt);return Bt&&Ne(We,Ye,Bt,tt),Bt}function Te(We,tt){Ye.set(We,tt)}function Fe(We,tt){return We%tt>0&&(We+=tt-We%tt),We}var ke,Ye,be,et,Ue,S,w,b,y,F;function J(We){ke=We,r.HEAP_DATA_VIEW=F=new DataView(We),r.HEAP8=Ye=new Int8Array(We),r.HEAP16=et=new Int16Array(We),r.HEAP32=S=new Int32Array(We),r.HEAPU8=be=new Uint8Array(We),r.HEAPU16=Ue=new Uint16Array(We),r.HEAPU32=w=new Uint32Array(We),r.HEAPF32=b=new Float32Array(We),r.HEAPF64=y=new Float64Array(We)}var X=r.INITIAL_MEMORY||16777216,$,ie=[],Se=[],Re=[],at=!1;function dt(){if(r.preRun)for(typeof r.preRun==\"function\"&&(r.preRun=[r.preRun]);r.preRun.length;)bt(r.preRun.shift());oo(ie)}function jt(){at=!0,oo(Se)}function tr(){if(r.postRun)for(typeof r.postRun==\"function\"&&(r.postRun=[r.postRun]);r.postRun.length;)kr(r.postRun.shift());oo(Re)}function bt(We){ie.unshift(We)}function ln(We){Se.unshift(We)}function kr(We){Re.unshift(We)}var mr=0,Sr=null,Kr=null;function Kn(We){mr++,r.monitorRunDependencies&&r.monitorRunDependencies(mr)}function Ms(We){if(mr--,r.monitorRunDependencies&&r.monitorRunDependencies(mr),mr==0&&(Sr!==null&&(clearInterval(Sr),Sr=null),Kr)){var tt=Kr;Kr=null,tt()}}r.preloadedImages={},r.preloadedAudios={};function Ri(We){r.onAbort&&r.onAbort(We),We+=\"\",te(We),Ee=!0,g=1,We=\"abort(\"+We+\"). Build with -s ASSERTIONS=1 for more info.\";var tt=new WebAssembly.RuntimeError(We);throw a(tt),tt}var gs=\"data:application/octet-stream;base64,\";function io(We){return We.startsWith(gs)}var Pi=\"data:application/octet-stream;base64,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QCAAKAJIIgEgASADaiADEAcaAkAgAyAAKAJsIgFNBEAgACABIANrNgJsDAELIABCADcCbAsgACAAKAJoIANrIgE2AmggACAAKAJYIANrNgJYIAEgACgChC5JBEAgACABNgKELgsgAEH8gAEoAgARAwAgAiADaiECCwJAIAAoAgAiASgCBCIERQ0AIAAoAjwhBSAAIAIgBCACIARJGyICBH8gACgCSCAAKAJoaiAFaiEFIAEgBCACazYCBAJAAkACQAJAIAEoAhwiBCgCFEEBaw4CAQACCyAEQaABaiAFIAEoAgAgAkHcgAEoAgARCAAMAgsgASABKAIwIAUgASgCACACQcSAASgCABEEADYCMAwBCyAFIAEoAgAgAhAHGgsgASABKAIAIAJqNgIAIAEgASgCCCACajYCCCAAKAI8BSAFCyACaiICNgI8AkAgACgChC4iASACakEDSQ0AIAAoAmggAWshAQJAIAAoAnRBgQhPBEAgACAAIAAoAkggAWoiAi0AACACLQABIAAoAnwRAAA2AlQMAQsgAUUNACAAIAFBAWsgACgChAERAgAaCyAAKAKELiAAKAI8IgJBAUZrIgRFDQAgACABIAQgACgCgAERBQAgACAAKAKELiAEazYChC4gACgCPCECCyACQYUCSw0AIAAoAgAoAgRFDQAgACgCMCEBDAELCwJAIAAoAkQiAiAAKAJAIgNNDQAgAAJ/IAAoAjwgACgCaGoiASADSwRAIAAoAkggAWpBACACIAFrIgNBggIgA0GCAkkbIgMQGSABIANqDAELIAFBggJqIgEgA00NASAAKAJIIANqQQAgAiADayICIAEgA2siAyACIANJGyIDEBkgACgCQCADags2AkALC50CAQF/AkAgAAJ/IAAoAqAuIgFBwABGBEAgACgCBCAAKAIQaiAAKQOYLjcAACAAQgA3A5guIAAgACgCEEEIajYCEEEADAELIAFBIE4EQCAAKAIEIAAoAhBqIAApA5guPgAAIAAgAEGcLmo1AgA3A5guIAAgACgCEEEEajYCECAAIAAoAqAuQSBrIgE2AqAuCyABQRBOBEAgACgCBCAAKAIQaiAAKQOYLj0AACAAIAAoAhBBAmo2AhAgACAAKQOYLkIQiDcDmC4gACAAKAKgLkEQayIBNgKgLgsgAUEISA0BIAAgACgCECIBQQFqNgIQ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KAJUIgEEfyABQQAgARAiEBkgACgCVAVBAAsQBiAAQQA2AlQLC9wMAgl/AX4jAEFAaiIGJAACQAJAAkACQAJAIAEoAjBBABAjIgVBAkZBACABKAI4QQAQIyIEQQFGGw0AIAVBAUZBACAEQQJGGw0AIAVBAkciAw0BIARBAkcNAQsgASABLwEMQYAQcjsBDEEAIQMMAQsgASABLwEMQf/vA3E7AQxBACEFIANFBEBB9eABIAEoAjAgAEEIahBpIgVFDQILIAJBgAJxBEAgBSEDDAELIARBAkcEQCAFIQMMAQtB9cYBIAEoAjggAEEIahBpIgNFBEAgBRAcDAILIAMgBTYCAAsgASABLwEMQf7/A3EgAS8BUiIFQQBHcjsBDAJAAkACQAJAAn8CQAJAIAEpAyhC/v///w9WDQAgASkDIEL+////D1YNACACQYAEcUUNASABKQNIQv////8PVA0BCyAFQYECa0H//wNxQQNJIQdBAQwBCyAFQYECa0H//wNxIQQgAkGACnFBgApHDQEgBEEDSSEHQQALIQkgBkIcEBciBEUEQCAAQQhqIgAEQCAAQQA2AgQgAEEONgIACyADEBwMBQsgAkGACHEhBQJAAkAgAkGAAnEEQAJAIAUNACABKQMgQv////8PVg0AIAEpAyhCgICAgBBUDQMLIAQgASkDKBAYIAEpAyAhDAwBCwJAAkACQCAFDQAgASkDIEL/////D1YNACABKQMoIgxC/////w9WDQEgASkDSEKAgICAEFQNBAsgASkDKCIMQv////8PVA0BCyAEIAwQGAsgASkDICIMQv////8PWgRAIAQgDBAYCyABKQNIIgxC/////w9UDQELIAQgDBAYCyAELQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALIAQQCCADEBwMBQtBASEKQQEgBC0AAAR+IAQpAxAFQgALp0H//wNxIAYQRyEFIAQQCCAFIAM2AgAgBw0BDAILIAMhBSAEQQJLDQELIAZCBxAXIgRFBEAgAEEIaiIABEAgAEEANgIEIABBDjYCAAsgBRAcDAMLIARBAhANIARBhxJBAhAsIAQgAS0AUhBwIAQgAS8BEBANIAQtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAsgBBAIDAILQYGyAkEHIAYQRyEDIAQQCCADIAU2AgBBASEL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NgIEIABB7A42AhggGiEdDAMLIARB/wFxIgJBwABxRQRAIAggDSADLwECQQJ0aiAdp0F/IAJ0QX9zcUECdGoiAy0AASICayEIIB0gAq2IIR0gAy0AACIERQ0HDAELCyAEQSBxBEAgB0G//gA2AgQgASECDAgLIAdB0f4ANgIEIABB0A42AhggASECDAcLIB1BfyAGdEF/c62DIBt8IhunIQUgCCAEQQ9xIgNrIQggGiAErUIPg4ghHSABIBdrIgYgAjMBAiAaQX8gA3RBf3Otg3ynIgRPDQIgBCAGayIGIBlNDQEgBygCjEdFDQEgB0HR/gA2AgQgAEG5DDYCGAsgASECIAshBQwFCwJAIA5FBEAgDCARIAZraiEDDAELIAYgDk0EQCAMIA4gBmtqIQMMAQsgDCARIAYgDmsiBmtqIQMgBSAGTQ0AIAUgBmshBQJAAkAgASADTSABIA8gAWusIhogBq0iGyAaIBtUGyIapyIGaiICIANLcQ0AIAMgBmogAUsgASADT3ENACABIAMgBhAHGiACIQEMAQsgASADIAMgAWsiASABQR91IgFqIAFzIgIQByACaiEBIBogAq0iHn0iHFANACACIANqIQIDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgASACKQAANwAAIAEgAikAGDcAGCABIAIpABA3ABAgASACKQAINwAIIBpCIH0hGiACQSBqIQIgAUEgaiEBIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAEgAikAADcAACABIAIpABg3ABggASACKQAQNwAQIAEgAikACDcACCABIAIpADg3ADggASACKQAwNwAwIAEgAikAKDcAKCABIAIpACA3ACAgASACKQBYNwBYIAEgAikAUDcAUCABIAIpAEg3AEggASACKQBANwBAIAEgAikAYDcAYCABIAIpAGg3AGggASACKQBwNwBwIAEgAikAeDcAeCACQYABaiECIAFBgAFqIQEgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAEgAikAADcAACABIAIpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCABIAIpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCABIAIoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCABIAIvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCABIAItAAA6AAAgAkEBaiECIAFBAWohAQsgHEIAUg0ACwsgDiEGIAwhAwsgBSAGSwRAAkACQCABIANNIAEgDyABa6wiGiAGrSIbIBogG1QbIhqnIglqIgIgA0txDQAgAyAJaiABSyABIANPcQ0AIAEgAyAJEAcaDAELIAEgAyADIAFrIgEgAUEfdSIBaiABcyIBEAcgAWohAiAaIAGtIh59IhxQDQAgASADaiEBA0ACQCAcIB4gHCAeVBsiG0IgVARAIBshGgwBCyAbIhpCIH0iIEIFiEIBfEIDgyIfUEUEQANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCAaQiB9IRogAUEgaiEBIAJBIGohAiAfQgF9Ih9CAFINAAsLICBC4ABUDQADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggAiABKQA4NwA4IAIgASkAMDcAMCACIAEpACg3ACggAiABKQAgNwAgIAIgASkAWDcAWCACIAEpAFA3AFAgAiABKQBINwBIIAIgASkAQDcAQCACIAEpAGA3AGAgAiABKQBoNwBoIAIgASkAcDcAcCACIAEpAHg3AHggAUGAAWohASACQYABaiECIBpCgAF9IhpCH1YNAAsLIBpCEFoEQCACIAEpAAA3AAAgAiABKQAINwAIIBpCEH0hGiACQRBqIQIgAUEQaiEBCyAaQghaBEAgAiABKQAANwAAIBpCCH0hGiACQQhqIQIgAUEIaiEBCyAaQgRaBEAgAiABKAAANgAAIBpCBH0hGiACQQRqIQIgAUEEaiEBCyAaQgJaBEAgAiABLwAAOwAAIBpCAn0hGiACQQJqIQIgAUECaiEBCyAcIBt9IRwgGlBFBEAgAiABLQAAOgAAIAJBAWohAiABQQFqIQELIBxCAFINAAsLIAUgBmshAUEAIARrIQUCQCAEQQdLBEAgBCEDDAELIAEgBE0EQCAEIQMMAQsgAiAEayEFA0ACQCACIAUpAAA3AAAgBEEBdCEDIAEgBGshASACIARqIQIgBEEDSw0AIAMhBCABIANLDQELC0EAIANrIQULIAIgBWohBAJAIAUgDyACa6wiGiABrSIbIBogG1QbIhqnIgFIIAVBf0pxDQAgBUEBSCABIARqIAJLcQ0AIAIgBCABEAcgAWohAgwDCyACIAQgAyADQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANAiABIARqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAILAkAgASADTSABIA8gAWusIhogBa0iGyAaIBtUGyIapyIEaiICIANLcQ0AIAMgBGogAUsgASADT3ENACABIAMgBBAHGgwCCyABIAMgAyABayIBIAFBH3UiAWogAXMiARAHIAFqIQIgGiABrSIefSIcUA0BIAEgA2ohAQNAAkAgHCAeIBwgHlQbIhtCIFQEQCAbIRoMAQsgGyIaQiB9IiBCBYhCAXxCA4MiH1BFBEADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggGkIgfSEaIAFBIGohASACQSBqIQIgH0IBfSIfQgBSDQALCyAgQuAAVA0AA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIAIgASkAODcAOCACIAEpADA3ADAgAiABKQAoNwAoIAIgASkAIDcAICACIAEpAFg3AFggAiABKQBQNwBQIAIgASkASDcASCACIAEpAEA3AEAgAiABKQBgNwBgIAIgASkAaDcAaCACIAEpAHA3AHAgAiABKQB4NwB4IAFBgAFqIQEgAkGAAWohAiAaQoABfSIaQh9WDQALCyAaQhBaBEAgAiABKQAANwAAIAIgASkACDcACCAaQhB9IRogAkEQaiECIAFBEGohAQsgGkIIWgRAIAIgASkAADcAACAaQgh9IRogAkEIaiECIAFBCGohAQsgGkIEWgRAIAIgASgAADYAACAaQgR9IRogAkEEaiECIAFBBGohAQsgGkICWgRAIAIgAS8AADsAACAaQgJ9IRogAkECaiECIAFBAmohAQsgHCAbfSEcIBpQRQRAIAIgAS0AADoAACACQQFqIQIgAUEBaiEBCyAcUEUNAAsMAQsCQAJAIBYEQAJAIAQgBUkEQCAHKAKYRyAESw0BCyABIARrIQMCQEEAIARrIgVBf0ogDyABa6wiGiAbIBogG1QbIhqnIgIgBUpxDQAgBUEBSCACIANqIAFLcQ0AIAEgAyACEAcgAmohAgwFCyABIAMgBCAEQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANBCABIANqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAQLIBAgAWsiCUEBaiIGIAUgBSAGSxshAyABIARrIQIgAUEHcUUNAiADRQ0CIAEgAi0AADoAACACQQFqIQIgAUEBaiIGQQdxQQAgA0EBayIFGw0BIAYhASAFIQMgCSEGDAILAkAgBCAFSQRAIAcoAphHIARLDQELIAEgASAEayIGKQAANwAAIAEgBUEBa0EHcUEBaiIDaiECIAUgA2siBEUNAyADIAZqIQEDQCACIAEpAAA3AAAgAUEIaiEBIAJBCGohAiAEQQhrIgQNAAsMAwsgASAEIAUQPyECDAILIAEgAi0AADoAASAJQQFrIQYgA0ECayEFIAJBAWohAgJAIAFBAmoiCkEHcUUNACAFRQ0AIAEgAi0AADoAAiAJQQJrIQYgA0EDayEFIAJBAWohAgJAIAFBA2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAAyAJQQNrIQYgA0EEayEFIAJBAWohAgJAIAFBBGoiCkEHcUUNACAFRQ0AIAEgAi0AADoABCAJQQRrIQYgA0EFayEFIAJBAWohAgJAIAFBBWoiCkEHcUUNACAFRQ0AIAEgAi0AADoABSAJQQVrIQYgA0EGayEFIAJBAWohAgJAIAFBBmoiCkEHcUUNACAFRQ0AIAEgAi0AADoABiAJQQZrIQYgA0EHayEFIAJBAWohAgJAIAFBB2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAByAJQQdrIQYgA0EIayEDIAFBCGohASACQQFqIQIMBgsgCiEBIAUhAwwFCyAKIQEgBSEDDAQLIAohASAFIQMMAwsgCiEBIAUhAwwCCyAKIQEgBSEDDAELIAohASAFIQMLAkACQCAGQRdNBEAgA0UNASADQQFrIQUgA0EHcSIEBEADQCABIAItAAA6AAAgA0EBayEDIAFBAWohASACQQFqIQIgBEEBayIEDQALCyAFQQdJDQEDQCABIAItAAA6AAAgASACLQABOgABIAEgAi0AAjoAAiABIAItAAM6AAMgASACLQAEOgAEIAEgAi0ABToABSABIAItAAY6AAYgASACLQAHOgAHIAFBCGohASACQQhqIQIgA0EIayIDDQALDAELIAMNAQsgASECDAELIAEgBCADED8hAgsgCyEFDAELIAEgAy0AAjoAACABQQFqIQILIAUgFE8NACACIBNJDQELCyAAIAI2AgwgACAFIAhBA3ZrIgE2AgAgACATIAJrQYMCajYCECAAIBQgAWtBDmo2AgQgByAIQQdxIgA2AogBIAcgHUJ/IACthkJ/hYM+AoQBC+cFAQR/IAMgAiACIANLGyEEIAAgAWshAgJAIABBB3FFDQAgBEUNACAAIAItAAA6AAAgA0EBayEGIAJBAWohAiAAQQFqIgdBB3FBACAEQQFrIgUbRQRAIAchACAFIQQgBiEDDAELIAAgAi0AADoAASADQQJrIQYgBEECayEFIAJBAWohAgJAIABBAmoiB0EHcUUNACAFRQ0AIAAgAi0AADoAAiADQQNrIQYgBEEDayEFIAJBAWohAgJAIABBA2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAAyADQQRrIQYgBEEEayEFIAJBAWohAgJAIABBBGoiB0EHcUUNACAFRQ0AIAAgAi0AADoABCADQQVrIQYgBEEFayEFIAJBAWohAgJAIABBBWoiB0EHcUUNACAFRQ0AIAAgAi0AADoABSADQQZrIQYgBEEGayEFIAJBAWohAgJAIABBBmoiB0EHcUUNACAFRQ0AIAAgAi0AADoABiADQQdrIQYgBEEHayEFIAJBAWohAgJAIABBB2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAByADQQhrIQMgBEEIayEEIABBCGohACACQQFqIQIMBgsgByEAIAUhBCAGIQMMBQsgByEAIAUhBCAGIQMMBAsgByEAIAUhBCAGIQMMAwsgByEAIAUhBCAGIQMMAgsgByEAIAUhBCAGIQMMAQsgByEAIAUhBCAGIQMLAkAgA0EXTQRAIARFDQEgBEEBayEBIARBB3EiAwRAA0AgACACLQAAOgAAIARBAWshBCAAQQFqIQAgAkEBaiECIANBAWsi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CyAAIAMtAAAEfiADKQMQBUIAC6dB//8DcSADKAIEEEcLIQUgAxAICyAEQRBqJAAgBQvgAQICfwF+QTAQCSICRQRAIAEEQCABQQA2AgQgAUEONgIAC0EADwsgAkIANwMIIAJBADYCACACQgA3AxAgAkIANwMYIAJCADcDICACQgA3ACUgAFAEQCACDwsCQCAAQv////8AVg0AIACnQQR0EAkiA0UNACACIAM2AgBBACEBQgEhBANAIAMgAUEEdGoiAUIANwIAIAFCADcABSAAIARSBEAgBKchASAEQgF8IQQMAQsLIAIgADcDCCACIAA3AxAgAg8LIAEEQCABQQA2AgQgAUEONgIAC0EAEBAgAhAGQQAL7gECA38BfiMAQRBrIgQkAAJAIARBDGpCBBAXIgNFBEBBfyECDAELAkAgAQRAIAJBgAZxIQUDQAJAIAUgASgCBHFFDQACQCADKQMIQgBUBEAgA0EAOgAADAELIANCADcDECADQQE6AAALIAMgAS8BCBANIAMgAS8BChANIAMtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAtBfyECDAQLQX8hAiAAIARBDGpCBBAbQQBIDQMgATMBCiIGUA0AIAAgASgCDCAGEBtBAEgNAwsgASgCACIBDQALC0EAIQILIAMQCAsgBEEQaiQAIAILPAEBfyAABEAgAUGABnEhAQNAIAEgACgCBHEEQCACIAAvAQpqQQRqIQILIAAoAgAiAA0ACwsgAkH//wNxC5wBAQN/IABFBEBBAA8LIAAhAwNAAn8CQAJAIAAvAQgiAUH04AFNBEAgAUEBRg0BIAFB9cYBRg0BDAILIAFBgbICRg0AIAFB9eABRw0BCyAAKAIAIQEgAEEANgIAIAAoAgwQBiAAEAYgASADIAAgA0YbIQMCQCACRQRAQQAhAgwBCyACIAE2AgALIAEMAQsgACICKAIACyIADQALIAMLsgQCBX8BfgJAAkACQCAAIAGtEBciAQRAIAEtAAANAUEAIQAMAgsgBARAIARBADYCBCAEQQ42AgALQQAPC0EAIQADQCABLQAABH4gASkDCCABKQMQfQVCAAtCBFQNASABEAwhByABIAEQDCIGrRATIghFBEBBACECIAQEQCAEQQA2AgQgBEEVNgIACyABEAggAEUNAwNAIAAoAgAhASAAKAIMEAYg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DCAAQRg2AggLDAMLIAAgBiAFLwFqQQAgBCABEQYAIQEgBhALIAFFDQILAkAgDUUEQCABIQMMAQsgACABIAUvAWgQgQEhAyABEAsgA0UNAQsCQCAJRSAMckUEQCADIQEMAQsgACADQQEQgAEhASADEAsgAUUNAQsgASEDDAELQQAhAwsgBUHwAGokACADC4UBAQF/IAFFBEAgAEEIaiIABEAgAEEANgIEIABBEjYCAAtBAA8LQTgQCSIDRQRAIABBCGoiAARAIABBADYCBCAAQQ42AgALQQAPCyADQQA2AhAgA0IANwIIIANCADcDKCADQQA2AgQgAyACNgIAIANCADcDGCADQQA2AjAgACABQTsgAxBCCw8AIAAgASACQQBBABCCAQusAgECfyABRQRAIABBCGoiAARAIABBADYCBCAAQRI2AgALQQAPCwJAIAJBfUsNACACQf//A3FBCEYNACAAQQhqIgAEQCAAQQA2AgQgAEEQNgIAC0EADwsCQEGwwAAQCSIFBEAgBUEANgIIIAVCADcCACAFQYiBAUGogQEgAxs2AqhAIAUgAjYCFCAFIAM6ABAgBUEAOgAPIAVBADsBDCAFIAMgAkF9SyIGcToADiAFQQggAiAGG0H//wNxIAQgBUGIgQFBqIEBIAMbKAIAEQAAIgI2AqxAIAINASAFEDEgBRAGCyAAQQhqIgAEQCAAQQA2AgQgAEEONgIAC0EADwsgACABQTogBRBCIgAEfyAABSAFKAKsQCAFKAKoQCgCBBEDACAFEDEgBRAGQQALC6ABAQF/IAIgACgCBCIDIAIgA0kbIgIEQCAAIAMgAms2AgQCQAJAAkACQCAAKAIcIgMoAhRBAWsOAgEAAgsgA0GgAWogASAAKAIAIAJB3IABKAIAEQgADAILIAAgACgCMCABIAAoAgAgAkHEgAEoAgARBAA2AjAMAQsgASAAKAIAIAIQBxoLIAAgACgCACACajYCACAAIAAoAgggAmo2AggLC7cCAQR/QX4hAgJAIABFDQAgACgCIEUNACAAKAIkIgRFDQAgACgCHCIBRQ0AIAEoAgAgAEcNAAJAAkAgASgCICIDQTlrDjkBAgICAgICAgICAgIBAgICAQICAgICAgICAgICAgICAgICAQICAgICAgICAgICAQICAgICAgICAgEACyADQZoFRg0AIANBKkcN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DCABajYCDCAGIAYoAgggAWo2AgggBSAFKAIUIAFqNgIUIAUgBSgCECABazYCECAGIAYoAhAgAWsiATYCECABDQAgBiAGKAIENgIIC0EAIQRBACEJIAMoAhBFDQAMCgsgAygCHCgCJCEGIAMgAygCGCIBQQFqNgIYIAEgBmotAAAhASADIARBAWo2AhAgAygCBCAEaiABOgAAIAEEQCADKAIQIQQMAQsLIAMoAhwoAixFDQAgAygCECIGIAlNDQAgBQJ/IAUoAjAhBEEAIAMoAgQgCWoiAUUNABogBCABIAYgCWtB1IABKAIAEQAACzYCMAsgA0HnADYCIAsCQCADKAIcKAIsBEAgAygCDCADKAIQIgFBAmpJBH8gBRAKIAMoAhANAkEABSABCyADKAIEaiAFKAIwOwAAIAMgAygCEEECajYCECADQaABakHkgAEoAgARAQAaCyADQfEANgIgIAUQCiADKAIQRQ0BDAcLDAYLIAUoAgQNAQsgAygCPA0AIApFDQEgAygCIEGaBUYNAQsCfyADKAKIASIBRQRAIAMgChCFAQwBCwJAAkACQCADKAKMAUECaw4CAAECCwJ/AkADQAJAAkAgAygCPA0AIAMQLyADKAI8DQAgCg0BQQAMBAsgAygCSCADKAJoai0AACEEIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qQQA6AAAgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtaiAEOgAAIAMgBEECdGoiASABLwHkAUEBajsB5AEgAyADKAI8QQFrNgI8IAMgAygCaEEBaiIBNgJoIAMoAvAtIAMoAvQtRw0BQQAhBCADIAMoAlgiBkEATgR/IAMoAkggBmoFQQALIAEgBmtBABAPIAMgAygCaDYCWCADKAIAEAogAygCACgCEA0BDAILCyADQQA2AoQuIApBBEYEQCADIAMoAlgiAUEATgR/IAMoAkggAWoFQQALIAMoAmggAWtBARAPIAMgAygCaDYCWCADKAIAEApBA0ECIAMoAgAoAhAbDAILIAMoAvAtBEBBACEEIAMgAygCWCIBQQBOBH8gAygCSCABagVBAAsgAygCaCABa0EAEA8gAyADKAJoNgJYIAMoAgAQCiADKAIAKAIQRQ0BC0EBIQQLIAQL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bGl0ZXJhbC9sZW5ndGhzIHNldABpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQAdW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0AGludmFsaWQgZGlzdGFuY2VzIHNldABpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0AEZpbGUgYWxyZWFkeSBleGlzdHMAdG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMAaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocwAlcyVzJXMAYnVmZmVyIGVycm9yAE5vIGVycm9yAHN0cmVhbSBlcnJvcgBUZWxsIGVycm9yAEludGVybmFsIGVycm9yAFNlZWsgZXJyb3IAV3JpdGUgZXJyb3IAZmlsZSBlcnJvcgBSZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoADEuMi4xMy56bGliLW5nAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRl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UgAIANIACAAyAAgAsgAIAHIACADyAAgACgAIAIoACABKAAgAygAIACoACACqAAgAagAIAOoACAAaAAgAmgAIAFoACADaAAgAOgAIALoACAB6AAgA+gAIAAYACACGAAgARgAIAMYACAAmAAgApgAIAGYACADmAAgAFgAIAJYACABWAAgA1gAIADYACAC2AAgAdgAIAPYACAAOAAgAjgAIAE4ACADOAAgALgAIAK4ACABuAAgA7gAIAB4ACACeAAgAXgAIAN4ACAA+AAgAvgAIAH4ACAD+AAgAAQAIAIEACABBAAgAwQAIACEACAChAAgAYQAIAOEACAARAAgAkQAIAFEACADRAAgAMQAIALEACABxAAgA8QAIAAkACACJAAgASQAIAMkACAApAAgAqQAIAGkACADpAAgAGQAIAJkACABZAAgA2QAIADkACAC5AAgAeQAIAPkACAAFAAgAhQAIAEUACADFAAgAJQAIAKUACABlAAgA5QAIABUACACVAAgAVQAIANUACAA1AAgAtQAIAHUACAD1AAgADQAIAI0ACABNAAgAzQAIAC0ACACtAAgAbQAIAO0ACAAdAAgAnQAIAF0ACADdAAgAPQAIAL0ACAB9AAgA/QAIABMACQATAQkAkwAJAJMBCQBTAAkAUwEJANMACQDTAQkAMwAJADMBCQCzAAkAswEJAHMACQBzAQkA8wAJAPMBCQALAAkACwEJAIsACQCLAQkASwAJAEsBCQDLAAkAywEJACsACQArAQkAqwAJAKsBCQBrAAkAawEJAOsACQDrAQkAGwAJABsBCQCbAAkAmwEJAFsACQBbAQkA2wAJANsBCQA7AAkAOwEJALsACQC7AQkAewAJAHsBCQD7AAkA+wEJAAcACQAHAQkAhwAJAIcBCQBHAAkARwEJAMcACQDHAQkAJwAJACcBCQCnAAkApwEJAGcACQBnAQkA5wAJAOcBCQAXAAkAFwEJAJcACQCXAQkAVwAJAFcBCQDXAAkA1wEJADcACQA3AQkAtwAJALcBCQB3AAkAdwEJAPcACQD3AQkADwAJAA8BCQCPAAkAjwEJAE8ACQBPAQkAzwAJAM8BCQAvAAkALwEJAK8ACQCvAQkAbwAJAG8BCQDvAAkA7wEJAB8ACQAfAQkAnwAJAJ8BCQBfAAkAXwEJAN8ACQDfAQkAPwAJAD8BCQC/AAkA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SXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AQcCAAQuFARMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAgERQADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAQfSCAQsCXEQAQbCDAQsQ/////////////////////w==\";io(Pi)||(Pi=x(Pi));function Os(We){try{if(We==Pi&&ce)return new Uint8Array(ce);var tt=ii(We);if(tt)return tt;if(R)return R(We);throw\"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)\"}catch(Bt){Ri(Bt)}}function so(We,tt){var Bt,or,ee;try{ee=Os(We),or=new WebAssembly.Module(ee),Bt=new WebAssembly.Instance(or,tt)}catch(Le){var ye=Le.toString();throw te(\"failed to compile wasm module: \"+ye),(ye.includes(\"imported Memory\")||ye.includes(\"memory import\"))&&te(\"Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time).\"),Le}return[Bt,or]}function uc(){var We={a:Ha};function tt(ee,ye){var Le=ee.exports;r.asm=Le,Be=r.asm.g,J(Be.buffer),$=r.asm.W,ln(r.asm.h),Ms(\"wasm-instantiate\")}if(Kn(\"wasm-instantiate\"),r.instantiateWasm)try{var Bt=r.instantiateWasm(We,tt);return Bt}catch(ee){return te(\"Module.instantiateWasm callback failed with error: \"+ee),!1}var or=so(Pi,We);return tt(or[0]),r.asm}function Au(We){return F.getFloat32(We,!0)}function op(We){return F.getFloat64(We,!0)}function ap(We){return F.getInt16(We,!0)}function Us(We){return F.getInt32(We,!0)}function Dn(We,tt){F.setInt32(We,tt,!0)}function oo(We){for(;We.length>0;){var tt=We.shift();if(typeof tt==\"function\"){tt(r);continue}var Bt=tt.func;typeof Bt==\"number\"?tt.arg===void 0?$.get(Bt)():$.get(Bt)(tt.arg):Bt(tt.arg===void 0?null:tt.arg)}}function _s(We,tt){var Bt=new Date(Us((We>>2)*4)*1e3);Dn((tt>>2)*4,Bt.getUTCSeconds()),Dn((tt+4>>2)*4,Bt.getUTCMinutes()),Dn((tt+8>>2)*4,Bt.getUTCHours()),Dn((tt+12>>2)*4,Bt.getUTCDate()),Dn((tt+16>>2)*4,Bt.getUTCMonth()),Dn((tt+20>>2)*4,Bt.getUTCFullYear()-1900),Dn((tt+24>>2)*4,Bt.getUTCDay()),Dn((tt+36>>2)*4,0),Dn((tt+32>>2)*4,0);var or=Date.UTC(Bt.getUTCFullYear(),0,1,0,0,0,0),ee=(Bt.getTime()-or)/(1e3*60*60*24)|0;return Dn((tt+28>>2)*4,ee),_s.GMTString||(_s.GMTString=rt(\"GMT\")),Dn((tt+40>>2)*4,_s.GMTString),tt}function ml(We,tt){return _s(We,tt)}function yl(We,tt,Bt){be.copyWithin(We,tt,tt+Bt)}function ao(We){try{return Be.grow(We-ke.byteLength+65535>>>16),J(Be.buffer),1}catch{}}function Vn(We){var tt=be.length;We=We>>>0;var Bt=2147483648;if(We>Bt)return!1;for(var or=1;or<=4;or*=2){var ee=tt*(1+.2/or);ee=Math.min(ee,We+100663296);var ye=Math.min(Bt,Fe(Math.max(We,ee),65536)),Le=ao(ye);if(Le)return!0}return!1}function Mn(We){le(We)}function Ti(We){var tt=Date.now()/1e3|0;return We&&Dn((We>>2)*4,tt),tt}function On(){if(On.called)return;On.called=!0;var We=new Date().getFullYear(),tt=new Date(We,0,1),Bt=new Date(We,6,1),or=tt.getTimezoneOffset(),ee=Bt.getTimezoneOffset(),ye=Math.max(or,ee);Dn((ys()>>2)*4,ye*60),Dn((ms()>>2)*4,+(or!=ee));function Le($r){var ji=$r.toTimeString().match(/\\(([A-Za-z ]+)\\)$/);return ji?ji[1]:\"GMT\"}var ft=Le(tt),pt=Le(Bt),Nt=rt(ft),rr=rt(pt);ee<or?(Dn((Ci()>>2)*4,Nt),Dn((Ci()+4>>2)*4,rr)):(Dn((Ci()>>2)*4,rr),Dn((Ci()+4>>2)*4,Nt))}function _i(We){On();var tt=Date.UTC(Us((We+20>>2)*4)+1900,Us((We+16>>2)*4),Us((We+12>>2)*4),Us((We+8>>2)*4),Us((We+4>>2)*4),Us((We>>2)*4),0),Bt=new Date(tt);Dn((We+24>>2)*4,Bt.getUTCDay());var or=Date.UTC(Bt.getUTCFullYear(),0,1,0,0,0,0),ee=(Bt.getTime()-or)/(1e3*60*60*24)|0;return Dn((We+28>>2)*4,ee),Bt.getTime()/1e3|0}var ir=typeof atob==\"function\"?atob:function(We){var tt=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",Bt=\"\",or,ee,ye,Le,ft,pt,Nt,rr=0;We=We.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");do Le=tt.indexOf(We.charAt(rr++)),ft=tt.indexOf(We.charAt(rr++)),pt=tt.indexOf(We.charAt(rr++)),Nt=tt.indexOf(We.charAt(rr++)),or=Le<<2|ft>>4,ee=(ft&15)<<4|pt>>2,ye=(pt&3)<<6|Nt,Bt=Bt+String.fromCharCode(or),pt!==64&&(Bt=Bt+String.fromCharCode(ee)),Nt!==64&&(Bt=Bt+String.fromCharCode(ye));while(rr<We.length);return Bt};function Me(We){if(typeof I==\"boolean\"&&I){var tt;try{tt=Buffer.from(We,\"base64\")}catch{tt=new Buffer(We,\"base64\")}return new Uint8Array(tt.buffer,tt.byteOffset,tt.byteLength)}try{for(var Bt=ir(We),or=new Uint8Array(Bt.length),ee=0;ee<Bt.length;++ee)or[ee]=Bt.charCodeAt(ee);return or}catch{throw new Error(\"Converting base64 string to bytes failed.\")}}function ii(We){if(io(We))return Me(We.slice(gs.length))}var Ha={e:ml,c:yl,d:Vn,a:Mn,b:Ti,f:_i},hr=uc(),Ac=r.___wasm_call_ctors=hr.h,fu=r._zip_ext_count_symlinks=hr.i,fc=r._zip_file_get_external_attributes=hr.j,El=r._zipstruct_statS=hr.k,vA=r._zipstruct_stat_size=hr.l,pu=r._zipstruct_stat_mtime=hr.m,Ie=r._zipstruct_stat_crc=hr.n,Tt=r._zipstruct_errorS=hr.o,pc=r._zipstruct_error_code_zip=hr.p,Hi=r._zipstruct_stat_comp_size=hr.q,hu=r._zipstruct_stat_comp_method=hr.r,Yt=r._zip_close=hr.s,Cl=r._zip_delete=hr.t,DA=r._zip_dir_add=hr.u,lp=r._zip_discard=hr.v,hc=r._zip_error_init_with_code=hr.w,PA=r._zip_get_error=hr.x,Qn=r._zip_file_get_error=hr.y,hi=r._zip_error_strerror=hr.z,gc=r._zip_fclose=hr.A,bA=r._zip_file_add=hr.B,aa=r._free=hr.C,Ni=r._malloc=hr.D,_o=r._zip_source_error=hr.E,Xe=r._zip_source_seek=hr.F,lo=r._zip_file_set_external_attributes=hr.G,dc=r._zip_file_set_mtime=hr.H,gu=r._zip_fopen_index=hr.I,qi=r._zip_fread=hr.J,du=r._zip_get_name=hr.K,SA=r._zip_get_num_entries=hr.L,qa=r._zip_source_read=hr.M,mc=r._zip_name_locate=hr.N,ds=r._zip_open_from_source=hr.O,Ht=r._zip_set_file_compression=hr.P,Fn=r._zip_source_buffer=hr.Q,Ei=r._zip_source_buffer_create=hr.R,la=r._zip_source_close=hr.S,co=r._zip_source_free=hr.T,Hs=r._zip_source_keep=hr.U,ca=r._zip_source_open=hr.V,ua=r._zip_source_tell=hr.X,Ho=r._zip_stat_index=hr.Y,Ci=r.__get_tzname=hr.Z,ms=r.__get_daylight=hr._,ys=r.__get_timezone=hr.$,Es=r.stackSave=hr.aa,qs=r.stackRestore=hr.ba,Un=r.stackAlloc=hr.ca;r.cwrap=ne,r.getValue=de;var Pn;Kr=function We(){Pn||Cs(),Pn||(Kr=We)};function Cs(We){if(We=We||A,mr>0||(dt(),mr>0))return;function tt(){Pn||(Pn=!0,r.calledRun=!0,!Ee&&(jt(),o(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),tr()))}r.setStatus?(r.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){r.setStatus(\"\")},1),tt()},1)):tt()}if(r.run=Cs,r.preInit)for(typeof r.preInit==\"function\"&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return Cs(),e}}();typeof ES==\"object\"&&typeof K4==\"object\"?K4.exports=W4:typeof define==\"function\"&&define.amd?define([],function(){return W4}):typeof ES==\"object\"&&(ES.createModule=W4)});var Nf,Ole,Ule,_le=Et(()=>{Nf=[\"number\",\"number\"],Ole=(Z=>(Z[Z.ZIP_ER_OK=0]=\"ZIP_ER_OK\",Z[Z.ZIP_ER_MULTIDISK=1]=\"ZIP_ER_MULTIDISK\",Z[Z.ZIP_ER_RENAME=2]=\"ZIP_ER_RENAME\",Z[Z.ZIP_ER_CLOSE=3]=\"ZIP_ER_CLOSE\",Z[Z.ZIP_ER_SEEK=4]=\"ZIP_ER_SEEK\",Z[Z.ZIP_ER_READ=5]=\"ZIP_ER_READ\",Z[Z.ZIP_ER_WRITE=6]=\"ZIP_ER_WRITE\",Z[Z.ZIP_ER_CRC=7]=\"ZIP_ER_CRC\",Z[Z.ZIP_ER_ZIPCLOSED=8]=\"ZIP_ER_ZIPCLOSED\",Z[Z.ZIP_ER_NOENT=9]=\"ZIP_ER_NOENT\",Z[Z.ZIP_ER_EXISTS=10]=\"ZIP_ER_EXISTS\",Z[Z.ZIP_ER_OPEN=11]=\"ZIP_ER_OPEN\",Z[Z.ZIP_ER_TMPOPEN=12]=\"ZIP_ER_TMPOPEN\",Z[Z.ZIP_ER_ZLIB=13]=\"ZIP_ER_ZLIB\",Z[Z.ZIP_ER_MEMORY=14]=\"ZIP_ER_MEMORY\",Z[Z.ZIP_ER_CHANGED=15]=\"ZIP_ER_CHANGED\",Z[Z.ZIP_ER_COMPNOTSUPP=16]=\"ZIP_ER_COMPNOTSUPP\",Z[Z.ZIP_ER_EOF=17]=\"ZIP_ER_EOF\",Z[Z.ZIP_ER_INVAL=18]=\"ZIP_ER_INVAL\",Z[Z.ZIP_ER_NOZIP=19]=\"ZIP_ER_NOZIP\",Z[Z.ZIP_ER_INTERNAL=20]=\"ZIP_ER_INTERNAL\",Z[Z.ZIP_ER_INCONS=21]=\"ZIP_ER_INCONS\",Z[Z.ZIP_ER_REMOVE=22]=\"ZIP_ER_REMOVE\",Z[Z.ZIP_ER_DELETED=23]=\"ZIP_ER_DELETED\",Z[Z.ZIP_ER_ENCRNOTSUPP=24]=\"ZIP_ER_ENCRNOTSUPP\",Z[Z.ZIP_ER_RDONLY=25]=\"ZIP_ER_RDONLY\",Z[Z.ZIP_ER_NOPASSWD=26]=\"ZIP_ER_NOPASSWD\",Z[Z.ZIP_ER_WRONGPASSWD=27]=\"ZIP_ER_WRONGPASSWD\",Z[Z.ZIP_ER_OPNOTSUPP=28]=\"ZIP_ER_OPNOTSUPP\",Z[Z.ZIP_ER_INUSE=29]=\"ZIP_ER_INUSE\",Z[Z.ZIP_ER_TELL=30]=\"ZIP_ER_TELL\",Z[Z.ZIP_ER_COMPRESSED_DATA=31]=\"ZIP_ER_COMPRESSED_DATA\",Z))(Ole||{}),Ule=t=>({get HEAPU8(){return t.HEAPU8},errors:Ole,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_EXCL:2,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:t._malloc(1),uint32S:t._malloc(4),malloc:t._malloc,free:t._free,getValue:t.getValue,openFromSource:t.cwrap(\"zip_open_from_source\",\"number\",[\"number\",\"number\",\"number\"]),close:t.cwrap(\"zip_close\",\"number\",[\"number\"]),discard:t.cwrap(\"zip_discard\",null,[\"number\"]),getError:t.cwrap(\"zip_get_error\",\"number\",[\"number\"]),getName:t.cwrap(\"zip_get_name\",\"string\",[\"number\",\"number\",\"number\"]),getNumEntries:t.cwrap(\"zip_get_num_entries\",\"number\",[\"number\",\"number\"]),delete:t.cwrap(\"zip_delete\",\"number\",[\"number\",\"number\"]),statIndex:t.cwrap(\"zip_stat_index\",\"number\",[\"number\",...Nf,\"number\",\"number\"]),fopenIndex:t.cwrap(\"zip_fopen_index\",\"number\",[\"number\",...Nf,\"number\"]),fread:t.cwrap(\"zip_fread\",\"number\",[\"number\",\"number\",\"number\",\"number\"]),fclose:t.cwrap(\"zip_fclose\",\"number\",[\"number\"]),dir:{add:t.cwrap(\"zip_dir_add\",\"number\",[\"number\",\"string\"])},file:{add:t.cwrap(\"zip_file_add\",\"number\",[\"number\",\"string\",\"number\",\"number\"]),getError:t.cwrap(\"zip_file_get_error\",\"number\",[\"number\"]),getExternalAttributes:t.cwrap(\"zip_file_get_external_attributes\",\"number\",[\"number\",...Nf,\"number\",\"number\",\"number\"]),setExternalAttributes:t.cwrap(\"zip_file_set_external_attributes\",\"number\",[\"number\",...Nf,\"number\",\"number\",\"number\"]),setMtime:t.cwrap(\"zip_file_set_mtime\",\"number\",[\"number\",...Nf,\"number\",\"number\"]),setCompression:t.cwrap(\"zip_set_file_compression\",\"number\",[\"number\",...Nf,\"number\",\"number\"])},ext:{countSymlinks:t.cwrap(\"zip_ext_count_symlinks\",\"number\",[\"number\"])},error:{initWithCode:t.cwrap(\"zip_error_init_with_code\",null,[\"number\",\"number\"]),strerror:t.cwrap(\"zip_error_strerror\",\"string\",[\"number\"])},name:{locate:t.cwrap(\"zip_name_locate\",\"number\",[\"number\",\"string\",\"number\"])},source:{fromUnattachedBuffer:t.cwrap(\"zip_source_buffer_create\",\"number\",[\"number\",...Nf,\"number\",\"number\"]),fromBuffer:t.cwrap(\"zip_source_buffer\",\"number\",[\"number\",\"number\",...Nf,\"number\"]),free:t.cwrap(\"zip_source_free\",null,[\"number\"]),keep:t.cwrap(\"zip_source_keep\",null,[\"number\"]),open:t.cwrap(\"zip_source_open\",\"number\",[\"number\"]),close:t.cwrap(\"zip_source_close\",\"number\",[\"number\"]),seek:t.cwrap(\"zip_source_seek\",\"number\",[\"number\",...Nf,\"number\"]),tell:t.cwrap(\"zip_source_tell\",\"number\",[\"number\"]),read:t.cwrap(\"zip_source_read\",\"number\",[\"number\",\"number\",\"number\"]),error:t.cwrap(\"zip_source_error\",\"number\",[\"number\"])},struct:{statS:t.cwrap(\"zipstruct_statS\",\"number\",[]),statSize:t.cwrap(\"zipstruct_stat_size\",\"number\",[\"number\"]),statCompSize:t.cwrap(\"zipstruct_stat_comp_size\",\"number\",[\"number\"]),statCompMethod:t.cwrap(\"zipstruct_stat_comp_method\",\"number\",[\"number\"]),statMtime:t.cwrap(\"zipstruct_stat_mtime\",\"number\",[\"number\"]),statCrc:t.cwrap(\"zipstruct_stat_crc\",\"number\",[\"number\"]),errorS:t.cwrap(\"zipstruct_errorS\",\"number\",[]),errorCodeZip:t.cwrap(\"zipstruct_error_code_zip\",\"number\",[\"number\"])}})});function V4(t,e){let r=t.indexOf(e);if(r<=0)return null;let o=r;for(;r>=0&&(o=r+e.length,t[o]!==V.sep);){if(t[r-1]===V.sep)return null;r=t.indexOf(e,o)}return t.length>o&&t[o]!==V.sep?null:t.slice(0,o)}var rA,Hle=Et(()=>{Pt();Pt();nA();rA=class t extends Up{static async openPromise(e,r){let o=new t(r);try{return await e(o)}finally{o.saveAndClose()}}constructor(e={}){let r=e.fileExtensions,o=e.readOnlyArchives,a=typeof r>\"u\"?A=>V4(A,\".zip\"):A=>{for(let p of r){let h=V4(A,p);if(h)return h}return null},n=(A,p)=>new Zi(p,{baseFs:A,readOnly:o,stats:A.statSync(p)}),u=async(A,p)=>{let h={baseFs:A,readOnly:o,stats:await A.statPromise(p)};return()=>new Zi(p,h)};super({...e,factorySync:n,factoryPromise:u,getMountPoint:a})}}});function pot(t){if(typeof t==\"string\"&&String(+t)===t)return+t;if(typeof t==\"number\"&&Number.isFinite(t))return t<0?Date.now()/1e3:t;if(qle.types.isDate(t))return t.getTime()/1e3;throw new Error(\"Invalid time\")}function CS(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var na,z4,qle,J4,jle,wS,Zi,X4=Et(()=>{Pt();Pt();Pt();Pt();Pt();Pt();na=ve(\"fs\"),z4=ve(\"stream\"),qle=ve(\"util\"),J4=Ze(ve(\"zlib\"));Y4();jle=\"mixed\";wS=class extends Error{constructor(e,r){super(e),this.name=\"Libzip Error\",this.code=r}},Zi=class extends _u{constructor(r,o={}){super();this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;let a=o;if(this.level=typeof a.level<\"u\"?a.level:jle,r??=CS(),typeof r==\"string\"){let{baseFs:A=new Tn}=a;this.baseFs=A,this.path=r}else this.path=null,this.baseFs=null;if(o.stats)this.stats=o.stats;else if(typeof r==\"string\")try{this.stats=this.baseFs.statSync(r)}catch(A){if(A.code===\"ENOENT\"&&a.create)this.stats=wa.makeDefaultStats();else throw A}else this.stats=wa.makeDefaultStats();this.libzip=f1();let n=this.libzip.malloc(4);try{let A=0;o.readOnly&&(A|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof r==\"string\"&&(r=a.create?CS():this.baseFs.readFileSync(r));let p=this.allocateUnattachedSource(r);try{this.zip=this.libzip.openFromSource(p,A,n),this.lzSource=p}catch(h){throw this.libzip.source.free(p),h}if(this.zip===0){let h=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(h,this.libzip.getValue(n,\"i32\")),this.makeLibzipError(h)}}finally{this.libzip.free(n)}this.listings.set(It.root,new Set);let u=this.libzip.getNumEntries(this.zip,0);for(let A=0;A<u;++A){let p=this.libzip.getName(this.zip,A,0);if(V.isAbsolute(p))continue;let h=V.resolve(It.root,p);this.registerEntry(h,A),p.endsWith(\"/\")&&this.registerListing(h)}if(this.symlinkCount=this.libzip.ext.countSymlinks(this.zip),this.symlinkCount===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.ready=!0}makeLibzipError(r){let o=this.libzip.struct.errorCodeZip(r),a=this.libzip.error.strerror(r),n=new wS(a,this.libzip.errors[o]);if(o===this.libzip.errors.ZIP_ER_CHANGED)throw new Error(`Assertion failed: Unexpected libzip error: ${n.message}`);return n}getExtractHint(r){for(let o of this.entries.keys()){let a=this.pathUtils.extname(o);if(r.relevantExtensions.has(a))return!0}return!1}getAllFiles(){return Array.from(this.entries.keys())}getRealPath(){if(!this.path)throw new Error(\"ZipFS don't have real paths when loaded from a buffer\");return this.path}prepareClose(){if(!this.ready)throw nr.EBUSY(\"archive closed, close\");N0(this)}getBufferAndClose(){if(this.prepareClose(),this.entries.size===0)return this.discardAndClose(),CS();try{if(this.libzip.source.keep(this.lzSource),this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.libzip.source.open(this.lzSource)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(this.libzip.source.seek(this.lzSource,0,0,this.libzip.SEEK_END)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));let r=this.libzip.source.tell(this.lzSource);if(r===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(this.libzip.source.seek(this.lzSource,0,0,this.libzip.SEEK_SET)===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));let o=this.libzip.malloc(r);if(!o)throw new Error(\"Couldn't allocate enough memory\");try{let a=this.libzip.source.read(this.lzSource,o,r);if(a===-1)throw this.makeLibzipError(this.libzip.source.error(this.lzSource));if(a<r)throw new Error(\"Incomplete read\");if(a>r)throw new Error(\"Overread\");let n=Buffer.from(this.libzip.HEAPU8.subarray(o,o+r));return process.env.YARN_IS_TEST_ENV&&process.env.YARN_ZIP_DATA_EPILOGUE&&(n=Buffer.concat([n,Buffer.from(process.env.YARN_ZIP_DATA_EPILOGUE)])),n}finally{this.libzip.free(o)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}saveAndClose(){if(!this.path||!this.baseFs)throw new Error(\"ZipFS cannot be saved and must be discarded when loaded from a buffer\");if(this.readOnly){this.discardAndClose();return}let r=this.baseFs.existsSync(this.path)||this.stats.mode===wa.DEFAULT_MODE?void 0:this.stats.mode;this.baseFs.writeFileSync(this.path,this.getBufferAndClose(),{mode:r}),this.ready=!1}resolve(r){return V.resolve(It.root,r)}async openPromise(r,o,a){return this.openSync(r,o,a)}openSync(r,o,a){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:r}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(r,o){return this.opendirSync(r,o)}opendirSync(r,o={}){let a=this.resolveFilename(`opendir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw nr.ENOENT(`opendir '${r}'`);let n=this.listings.get(a);if(!n)throw nr.ENOTDIR(`opendir '${r}'`);let u=[...n],A=this.openSync(a,\"r\");return uD(this,a,u,{onClose:()=>{this.closeSync(A)}})}async readPromise(r,o,a,n,u){return this.readSync(r,o,a,n,u)}readSync(r,o,a=0,n=o.byteLength,u=-1){let A=this.fds.get(r);if(typeof A>\"u\")throw nr.EBADF(\"read\");let p=u===-1||u===null?A.cursor:u,h=this.readFileSync(A.p);h.copy(o,a,p,p+n);let E=Math.max(0,Math.min(h.length-p,n));return(u===-1||u===null)&&(A.cursor+=E),E}async writePromise(r,o,a,n,u){return typeof o==\"string\"?this.writeSync(r,o,u):this.writeSync(r,o,a,n,u)}writeSync(r,o,a,n,u){throw typeof this.fds.get(r)>\"u\"?nr.EBADF(\"read\"):new Error(\"Unimplemented\")}async closePromise(r){return this.closeSync(r)}closeSync(r){if(typeof this.fds.get(r)>\"u\")throw nr.EBADF(\"read\");this.fds.delete(r)}createReadStream(r,{encoding:o}={}){if(r===null)throw new Error(\"Unimplemented\");let a=this.openSync(r,\"r\"),n=Object.assign(new z4.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(A,p)=>{clearImmediate(u),this.closeSync(a),p(A)}}),{close(){n.destroy()},bytesRead:0,path:r,pending:!1}),u=setImmediate(async()=>{try{let A=await this.readFilePromise(r,o);n.bytesRead=A.length,n.end(A)}catch(A){n.destroy(A)}});return n}createWriteStream(r,{encoding:o}={}){if(this.readOnly)throw nr.EROFS(`open '${r}'`);if(r===null)throw new Error(\"Unimplemented\");let a=[],n=this.openSync(r,\"w\"),u=Object.assign(new z4.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(A,p)=>{try{A?p(A):(this.writeFileSync(r,Buffer.concat(a),o),p(null))}catch(h){p(h)}finally{this.closeSync(n)}}}),{close(){u.destroy()},bytesWritten:0,path:r,pending:!1});return u.on(\"data\",A=>{let p=Buffer.from(A);u.bytesWritten+=p.length,a.push(p)}),u}async realpathPromise(r){return this.realpathSync(r)}realpathSync(r){let o=this.resolveFilename(`lstat '${r}'`,r);if(!this.entries.has(o)&&!this.listings.has(o))throw nr.ENOENT(`lstat '${r}'`);return o}async existsPromise(r){return this.existsSync(r)}existsSync(r){if(!this.ready)throw nr.EBUSY(`archive closed, existsSync '${r}'`);if(this.symlinkCount===0){let a=V.resolve(It.root,r);return this.entries.has(a)||this.listings.has(a)}let o;try{o=this.resolveFilename(`stat '${r}'`,r,void 0,!1)}catch{return!1}return o===void 0?!1:this.entries.has(o)||this.listings.has(o)}async accessPromise(r,o){return this.accessSync(r,o)}accessSync(r,o=na.constants.F_OK){let a=this.resolveFilename(`access '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw nr.ENOENT(`access '${r}'`);if(this.readOnly&&o&na.constants.W_OK)throw nr.EROFS(`access '${r}'`)}async statPromise(r,o={bigint:!1}){return o.bigint?this.statSync(r,{bigint:!0}):this.statSync(r)}statSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`stat '${r}'`,r,void 0,o.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(o.throwIfNoEntry===!1)return;throw nr.ENOENT(`stat '${r}'`)}if(r[r.length-1]===\"/\"&&!this.listings.has(a))throw nr.ENOTDIR(`stat '${r}'`);return this.statImpl(`stat '${r}'`,a,o)}}async fstatPromise(r,o){return this.fstatSync(r,o)}fstatSync(r,o){let a=this.fds.get(r);if(typeof a>\"u\")throw nr.EBADF(\"fstatSync\");let{p:n}=a,u=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(u)&&!this.listings.has(u))throw nr.ENOENT(`stat '${n}'`);if(n[n.length-1]===\"/\"&&!this.listings.has(u))throw nr.ENOTDIR(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,u,o)}async lstatPromise(r,o={bigint:!1}){return o.bigint?this.lstatSync(r,{bigint:!0}):this.lstatSync(r)}lstatSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`lstat '${r}'`,r,!1,o.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(o.throwIfNoEntry===!1)return;throw nr.ENOENT(`lstat '${r}'`)}if(r[r.length-1]===\"/\"&&!this.listings.has(a))throw nr.ENOTDIR(`lstat '${r}'`);return this.statImpl(`lstat '${r}'`,a,o)}}statImpl(r,o,a={}){let n=this.entries.get(o);if(typeof n<\"u\"){let u=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,u)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let p=this.stats.uid,h=this.stats.gid,E=this.libzip.struct.statSize(u)>>>0,I=512,v=Math.ceil(E/I),x=(this.libzip.struct.statMtime(u)>>>0)*1e3,C=x,R=x,L=x,U=new Date(C),z=new Date(R),te=new Date(L),ae=new Date(x),le=this.listings.has(o)?na.constants.S_IFDIR:this.isSymbolicLink(n)?na.constants.S_IFLNK:na.constants.S_IFREG,ce=le===na.constants.S_IFDIR?493:420,Ce=le|this.getUnixMode(n,ce)&511,de=this.libzip.struct.statCrc(u),Be=Object.assign(new wa.StatEntry,{uid:p,gid:h,size:E,blksize:I,blocks:v,atime:U,birthtime:z,ctime:te,mtime:ae,atimeMs:C,birthtimeMs:R,ctimeMs:L,mtimeMs:x,mode:Ce,crc:de});return a.bigint===!0?wa.convertToBigIntStats(Be):Be}if(this.listings.has(o)){let u=this.stats.uid,A=this.stats.gid,p=0,h=512,E=0,I=this.stats.mtimeMs,v=this.stats.mtimeMs,x=this.stats.mtimeMs,C=this.stats.mtimeMs,R=new Date(I),L=new Date(v),U=new Date(x),z=new Date(C),te=na.constants.S_IFDIR|493,le=Object.assign(new wa.StatEntry,{uid:u,gid:A,size:p,blksize:h,blocks:E,atime:R,birthtime:L,ctime:U,mtime:z,atimeMs:I,birthtimeMs:v,ctimeMs:x,mtimeMs:C,mode:te,crc:0});return a.bigint===!0?wa.convertToBigIntStats(le):le}throw new Error(\"Unreachable\")}getUnixMode(r,o){if(this.libzip.file.getExternalAttributes(this.zip,r,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,\"i8\")>>>0!==this.libzip.ZIP_OPSYS_UNIX?o:this.libzip.getValue(this.libzip.uint32S,\"i32\")>>>16}registerListing(r){let o=this.listings.get(r);if(o)return o;this.registerListing(V.dirname(r)).add(V.basename(r));let n=new Set;return this.listings.set(r,n),n}registerEntry(r,o){this.registerListing(V.dirname(r)).add(V.basename(r)),this.entries.set(r,o)}unregisterListing(r){this.listings.delete(r),this.listings.get(V.dirname(r))?.delete(V.basename(r))}unregisterEntry(r){this.unregisterListing(r);let o=this.entries.get(r);this.entries.delete(r),!(typeof o>\"u\")&&(this.fileSources.delete(o),this.isSymbolicLink(o)&&this.symlinkCount--)}deleteEntry(r,o){if(this.unregisterEntry(r),this.libzip.delete(this.zip,o)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(r,o,a=!0,n=!0){if(!this.ready)throw nr.EBUSY(`archive closed, ${r}`);let u=V.resolve(It.root,o);if(u===\"/\")return It.root;let A=this.entries.get(u);if(a&&A!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(A)){let p=this.getFileSource(A).toString();return this.resolveFilename(r,V.resolve(V.dirname(u),p),!0,n)}else return u;for(;;){let p=this.resolveFilename(r,V.dirname(u),!0,n);if(p===void 0)return p;let h=this.listings.has(p),E=this.entries.has(p);if(!h&&!E){if(n===!1)return;throw nr.ENOENT(r)}if(!h)throw nr.ENOTDIR(r);if(u=V.resolve(p,V.basename(u)),!a||this.symlinkCount===0)break;let I=this.libzip.name.locate(this.zip,u.slice(1),0);if(I===-1)break;if(this.isSymbolicLink(I)){let v=this.getFileSource(I).toString();u=V.resolve(V.dirname(u),v)}else break}return u}allocateBuffer(r){Buffer.isBuffer(r)||(r=Buffer.from(r));let o=this.libzip.malloc(r.byteLength);if(!o)throw new Error(\"Couldn't allocate enough memory\");return new Uint8Array(this.libzip.HEAPU8.buffer,o,r.byteLength).set(r),{buffer:o,byteLength:r.byteLength}}allocateUnattachedSource(r){let o=this.libzip.struct.errorS(),{buffer:a,byteLength:n}=this.allocateBuffer(r),u=this.libzip.source.fromUnattachedBuffer(a,n,0,1,o);if(u===0)throw this.libzip.free(o),this.makeLibzipError(o);return u}allocateSource(r){let{buffer:o,byteLength:a}=this.allocateBuffer(r),n=this.libzip.source.fromBuffer(this.zip,o,a,0,1);if(n===0)throw this.libzip.free(o),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(r,o){let a=Buffer.isBuffer(o)?o:Buffer.from(o),n=V.relative(It.root,r),u=this.allocateSource(o);try{let A=this.libzip.file.add(this.zip,n,u,this.libzip.ZIP_FL_OVERWRITE);if(A===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!==\"mixed\"){let p=this.level===0?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(this.libzip.file.setCompression(this.zip,A,0,p,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(A,a),A}catch(A){throw this.libzip.source.free(u),A}}isSymbolicLink(r){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,r,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,\"i8\")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,\"i32\")>>>16&na.constants.S_IFMT)===na.constants.S_IFLNK}getFileSource(r,o={asyncDecompress:!1}){let a=this.fileSources.get(r);if(typeof a<\"u\")return a;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,r,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let A=this.libzip.struct.statCompSize(n),p=this.libzip.struct.statCompMethod(n),h=this.libzip.malloc(A);try{let E=this.libzip.fopenIndex(this.zip,r,0,this.libzip.ZIP_FL_COMPRESSED);if(E===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let I=this.libzip.fread(E,h,A,0);if(I===-1)throw this.makeLibzipError(this.libzip.file.getError(E));if(I<A)throw new Error(\"Incomplete read\");if(I>A)throw new Error(\"Overread\");let v=this.libzip.HEAPU8.subarray(h,h+A),x=Buffer.from(v);if(p===0)return this.fileSources.set(r,x),x;if(o.asyncDecompress)return new Promise((C,R)=>{J4.default.inflateRaw(x,(L,U)=>{L?R(L):(this.fileSources.set(r,U),C(U))})});{let C=J4.default.inflateRawSync(x);return this.fileSources.set(r,C),C}}finally{this.libzip.fclose(E)}}finally{this.libzip.free(h)}}async fchmodPromise(r,o){return this.chmodPromise(this.fdToPath(r,\"fchmod\"),o)}fchmodSync(r,o){return this.chmodSync(this.fdToPath(r,\"fchmodSync\"),o)}async chmodPromise(r,o){return this.chmodSync(r,o)}chmodSync(r,o){if(this.readOnly)throw nr.EROFS(`chmod '${r}'`);o&=493;let a=this.resolveFilename(`chmod '${r}'`,r,!1),n=this.entries.get(a);if(typeof n>\"u\")throw new Error(`Assertion failed: The entry should have been registered (${a})`);let A=this.getUnixMode(n,na.constants.S_IFREG|0)&-512|o;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,A<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async fchownPromise(r,o,a){return this.chownPromise(this.fdToPath(r,\"fchown\"),o,a)}fchownSync(r,o,a){return this.chownSync(this.fdToPath(r,\"fchownSync\"),o,a)}async chownPromise(r,o,a){return this.chownSync(r,o,a)}chownSync(r,o,a){throw new Error(\"Unimplemented\")}async renamePromise(r,o){return this.renameSync(r,o)}renameSync(r,o){throw new Error(\"Unimplemented\")}async copyFilePromise(r,o,a){let{indexSource:n,indexDest:u,resolvedDestP:A}=this.prepareCopyFile(r,o,a),p=await this.getFileSource(n,{asyncDecompress:!0}),h=this.setFileSource(A,p);h!==u&&this.registerEntry(A,h)}copyFileSync(r,o,a=0){let{indexSource:n,indexDest:u,resolvedDestP:A}=this.prepareCopyFile(r,o,a),p=this.getFileSource(n),h=this.setFileSource(A,p);h!==u&&this.registerEntry(A,h)}prepareCopyFile(r,o,a=0){if(this.readOnly)throw nr.EROFS(`copyfile '${r} -> '${o}'`);if(a&na.constants.COPYFILE_FICLONE_FORCE)throw nr.ENOSYS(\"unsupported clone operation\",`copyfile '${r}' -> ${o}'`);let n=this.resolveFilename(`copyfile '${r} -> ${o}'`,r),u=this.entries.get(n);if(typeof u>\"u\")throw nr.EINVAL(`copyfile '${r}' -> '${o}'`);let A=this.resolveFilename(`copyfile '${r}' -> ${o}'`,o),p=this.entries.get(A);if(a&(na.constants.COPYFILE_EXCL|na.constants.COPYFILE_FICLONE_FORCE)&&typeof p<\"u\")throw nr.EEXIST(`copyfile '${r}' -> '${o}'`);return{indexSource:u,resolvedDestP:A,indexDest:p}}async appendFilePromise(r,o,a){if(this.readOnly)throw nr.EROFS(`open '${r}'`);return typeof a>\"u\"?a={flag:\"a\"}:typeof a==\"string\"?a={flag:\"a\",encoding:a}:typeof a.flag>\"u\"&&(a={flag:\"a\",...a}),this.writeFilePromise(r,o,a)}appendFileSync(r,o,a={}){if(this.readOnly)throw nr.EROFS(`open '${r}'`);return typeof a>\"u\"?a={flag:\"a\"}:typeof a==\"string\"?a={flag:\"a\",encoding:a}:typeof a.flag>\"u\"&&(a={flag:\"a\",...a}),this.writeFileSync(r,o,a)}fdToPath(r,o){let a=this.fds.get(r)?.p;if(typeof a>\"u\")throw nr.EBADF(o);return a}async writeFilePromise(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}=this.prepareWriteFile(r,a);A!==void 0&&typeof a==\"object\"&&a.flag&&a.flag.includes(\"a\")&&(o=Buffer.concat([await this.getFileSource(A,{asyncDecompress:!0}),Buffer.from(o)])),n!==null&&(o=o.toString(n));let h=this.setFileSource(p,o);h!==A&&this.registerEntry(p,h),u!==null&&await this.chmodPromise(p,u)}writeFileSync(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}=this.prepareWriteFile(r,a);A!==void 0&&typeof a==\"object\"&&a.flag&&a.flag.includes(\"a\")&&(o=Buffer.concat([this.getFileSource(A),Buffer.from(o)])),n!==null&&(o=o.toString(n));let h=this.setFileSource(p,o);h!==A&&this.registerEntry(p,h),u!==null&&this.chmodSync(p,u)}prepareWriteFile(r,o){if(typeof r==\"number\"&&(r=this.fdToPath(r,\"read\")),this.readOnly)throw nr.EROFS(`open '${r}'`);let a=this.resolveFilename(`open '${r}'`,r);if(this.listings.has(a))throw nr.EISDIR(`open '${r}'`);let n=null,u=null;typeof o==\"string\"?n=o:typeof o==\"object\"&&({encoding:n=null,mode:u=null}=o);let A=this.entries.get(a);return{encoding:n,mode:u,resolvedP:a,index:A}}async unlinkPromise(r){return this.unlinkSync(r)}unlinkSync(r){if(this.readOnly)throw nr.EROFS(`unlink '${r}'`);let o=this.resolveFilename(`unlink '${r}'`,r);if(this.listings.has(o))throw nr.EISDIR(`unlink '${r}'`);let a=this.entries.get(o);if(typeof a>\"u\")throw nr.EINVAL(`unlink '${r}'`);this.deleteEntry(o,a)}async utimesPromise(r,o,a){return this.utimesSync(r,o,a)}utimesSync(r,o,a){if(this.readOnly)throw nr.EROFS(`utimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r);this.utimesImpl(n,a)}async lutimesPromise(r,o,a){return this.lutimesSync(r,o,a)}lutimesSync(r,o,a){if(this.readOnly)throw nr.EROFS(`lutimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r,!1);this.utimesImpl(n,a)}utimesImpl(r,o){this.listings.has(r)&&(this.entries.has(r)||this.hydrateDirectory(r));let a=this.entries.get(r);if(a===void 0)throw new Error(\"Unreachable\");if(this.libzip.file.setMtime(this.zip,a,0,pot(o),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(r,o){return this.mkdirSync(r,o)}mkdirSync(r,{mode:o=493,recursive:a=!1}={}){if(a)return this.mkdirpSync(r,{chmod:o});if(this.readOnly)throw nr.EROFS(`mkdir '${r}'`);let n=this.resolveFilename(`mkdir '${r}'`,r);if(this.entries.has(n)||this.listings.has(n))throw nr.EEXIST(`mkdir '${r}'`);this.hydrateDirectory(n),this.chmodSync(n,o)}async rmdirPromise(r,o){return this.rmdirSync(r,o)}rmdirSync(r,{recursive:o=!1}={}){if(this.readOnly)throw nr.EROFS(`rmdir '${r}'`);if(o){this.removeSync(r);return}let a=this.resolveFilename(`rmdir '${r}'`,r),n=this.listings.get(a);if(!n)throw nr.ENOTDIR(`rmdir '${r}'`);if(n.size>0)throw nr.ENOTEMPTY(`rmdir '${r}'`);let u=this.entries.get(a);if(typeof u>\"u\")throw nr.EINVAL(`rmdir '${r}'`);this.deleteEntry(r,u)}async rmPromise(r,o){return this.rmSync(r,o)}rmSync(r,{recursive:o=!1}={}){if(this.readOnly)throw nr.EROFS(`rm '${r}'`);if(o){this.removeSync(r);return}let a=this.resolveFilename(`rm '${r}'`,r),n=this.listings.get(a);if(!n)throw nr.ENOTDIR(`rm '${r}'`);if(n.size>0)throw nr.ENOTEMPTY(`rm '${r}'`);let u=this.entries.get(a);if(typeof u>\"u\")throw nr.EINVAL(`rm '${r}'`);this.deleteEntry(r,u)}hydrateDirectory(r){let o=this.libzip.dir.add(this.zip,V.relative(It.root,r));if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(r),this.registerEntry(r,o),o}async linkPromise(r,o){return this.linkSync(r,o)}linkSync(r,o){throw nr.EOPNOTSUPP(`link '${r}' -> '${o}'`)}async symlinkPromise(r,o){return this.symlinkSync(r,o)}symlinkSync(r,o){if(this.readOnly)throw nr.EROFS(`symlink '${r}' -> '${o}'`);let a=this.resolveFilename(`symlink '${r}' -> '${o}'`,o);if(this.listings.has(a))throw nr.EISDIR(`symlink '${r}' -> '${o}'`);if(this.entries.has(a))throw nr.EEXIST(`symlink '${r}' -> '${o}'`);let n=this.setFileSource(a,r);if(this.registerEntry(a,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(na.constants.S_IFLNK|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(r,o){typeof o==\"object\"&&(o=o?o.encoding:void 0);let a=await this.readFileBuffer(r,{asyncDecompress:!0});return o?a.toString(o):a}readFileSync(r,o){typeof o==\"object\"&&(o=o?o.encoding:void 0);let a=this.readFileBuffer(r);return o?a.toString(o):a}readFileBuffer(r,o={asyncDecompress:!1}){typeof r==\"number\"&&(r=this.fdToPath(r,\"read\"));let a=this.resolveFilename(`open '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw nr.ENOENT(`open '${r}'`);if(r[r.length-1]===\"/\"&&!this.listings.has(a))throw nr.ENOTDIR(`open '${r}'`);if(this.listings.has(a))throw nr.EISDIR(\"read\");let n=this.entries.get(a);if(n===void 0)throw new Error(\"Unreachable\");return this.getFileSource(n,o)}async readdirPromise(r,o){return this.readdirSync(r,o)}readdirSync(r,o){let a=this.resolveFilename(`scandir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw nr.ENOENT(`scandir '${r}'`);let n=this.listings.get(a);if(!n)throw nr.ENOTDIR(`scandir '${r}'`);if(o?.recursive)if(o?.withFileTypes){let u=Array.from(n,A=>Object.assign(this.statImpl(\"lstat\",V.join(r,A)),{name:A,path:It.dot}));for(let A of u){if(!A.isDirectory())continue;let p=V.join(A.path,A.name),h=this.listings.get(V.join(a,p));for(let E of h)u.push(Object.assign(this.statImpl(\"lstat\",V.join(r,p,E)),{name:E,path:p}))}return u}else{let u=[...n];for(let A of u){let p=this.listings.get(V.join(a,A));if(!(typeof p>\"u\"))for(let h of p)u.push(V.join(A,h))}return u}else return o?.withFileTypes?Array.from(n,u=>Object.assign(this.statImpl(\"lstat\",V.join(r,u)),{name:u,path:void 0})):[...n]}async readlinkPromise(r){let o=this.prepareReadlink(r);return(await this.getFileSource(o,{asyncDecompress:!0})).toString()}readlinkSync(r){let o=this.prepareReadlink(r);return this.getFileSource(o).toString()}prepareReadlink(r){let o=this.resolveFilename(`readlink '${r}'`,r,!1);if(!this.entries.has(o)&&!this.listings.has(o))throw nr.ENOENT(`readlink '${r}'`);if(r[r.length-1]===\"/\"&&!this.listings.has(o))throw nr.ENOTDIR(`open '${r}'`);if(this.listings.has(o))throw nr.EINVAL(`readlink '${r}'`);let a=this.entries.get(o);if(a===void 0)throw new Error(\"Unreachable\");if(!this.isSymbolicLink(a))throw nr.EINVAL(`readlink '${r}'`);return a}async truncatePromise(r,o=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>\"u\")throw nr.EINVAL(`open '${r}'`);let u=await this.getFileSource(n,{asyncDecompress:!0}),A=Buffer.alloc(o,0);return u.copy(A),await this.writeFilePromise(r,A)}truncateSync(r,o=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>\"u\")throw nr.EINVAL(`open '${r}'`);let u=this.getFileSource(n),A=Buffer.alloc(o,0);return u.copy(A),this.writeFileSync(r,A)}async ftruncatePromise(r,o){return this.truncatePromise(this.fdToPath(r,\"ftruncate\"),o)}ftruncateSync(r,o){return this.truncateSync(this.fdToPath(r,\"ftruncateSync\"),o)}watch(r,o,a){let n;switch(typeof o){case\"function\":case\"string\":case\"undefined\":n=!0;break;default:({persistent:n=!0}=o);break}if(!n)return{on:()=>{},close:()=>{}};let u=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(u)}}}watchFile(r,o,a){let n=V.resolve(It.root,r);return jd(this,n,o,a)}unwatchFile(r,o){let a=V.resolve(It.root,r);return T0(this,a,o)}}});function Yle(t,e,r=Buffer.alloc(0),o){let a=new Zi(r),n=I=>I===e||I.startsWith(`${e}/`)?I.slice(0,e.length):null,u=async(I,v)=>()=>a,A=(I,v)=>a,p={...t},h=new Tn(p),E=new Up({baseFs:h,getMountPoint:n,factoryPromise:u,factorySync:A,magicByte:21,maxAge:1/0,typeCheck:o?.typeCheck});return xw(Gle.default,new _p(E)),a}var Gle,Wle=Et(()=>{Pt();Gle=Ze(ve(\"fs\"));X4()});var Kle=Et(()=>{Hle();X4();Wle()});var p1={};Vt(p1,{DEFAULT_COMPRESSION_LEVEL:()=>jle,LibzipError:()=>wS,ZipFS:()=>Zi,ZipOpenFS:()=>rA,getArchivePart:()=>V4,getLibzipPromise:()=>got,getLibzipSync:()=>hot,makeEmptyArchive:()=>CS,mountMemoryDrive:()=>Yle});function hot(){return f1()}async function got(){return f1()}var Vle,nA=Et(()=>{Y4();Vle=Ze(Mle());_le();Kle();Lle(()=>{let t=(0,Vle.default)();return Ule(t)})});var h1,zle=Et(()=>{Pt();qt();g1();h1=class extends it{constructor(){super(...arguments);this.cwd=ge.String(\"--cwd\",process.cwd(),{description:\"The directory to run the command in\"});this.commandName=ge.String();this.args=ge.Proxy()}static{this.usage={description:\"run a command using yarn's portable shell\",details:`\n      This command will run a command using Yarn's portable shell.\n\n      Make sure to escape glob patterns, redirections, and other features that might be expanded by your own shell.\n\n      Note: To escape something from Yarn's shell, you might have to escape it twice, the first time from your own shell.\n\n      Note: Don't use this command in Yarn scripts, as Yarn's shell is automatically used.\n\n      For a list of features, visit: https://github.com/yarnpkg/berry/blob/master/packages/yarnpkg-shell/README.md.\n    `,examples:[[\"Run a simple command\",\"$0 echo Hello\"],[\"Run a command with a glob pattern\",\"$0 echo '*.js'\"],[\"Run a command with a redirection\",\"$0 echo Hello World '>' hello.txt\"],[\"Run a command with an escaped glob pattern (The double escape is needed in Unix shells)\",`$0 echo '\"*.js\"'`],[\"Run a command with a variable (Double quotes are needed in Unix shells, to prevent them from expanding the variable)\",'$0 \"GREETING=Hello echo $GREETING World\"']]}}async execute(){let r=this.args.length>0?`${this.commandName} ${this.args.join(\" \")}`:this.commandName;return await cy(r,[],{cwd:ue.toPortablePath(this.cwd),stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}}});var ll,Jle=Et(()=>{ll=class extends Error{constructor(e){super(e),this.name=\"ShellError\"}}});var vS={};Vt(vS,{fastGlobOptions:()=>$le,isBraceExpansion:()=>Z4,isGlobPattern:()=>dot,match:()=>mot,micromatchOptions:()=>BS});function dot(t){if(!IS.default.scan(t,BS).isGlob)return!1;try{IS.default.parse(t,BS)}catch{return!1}return!0}function mot(t,{cwd:e,baseFs:r}){return(0,Xle.default)(t,{...$le,cwd:ue.fromPortablePath(e),fs:mD(Zle.default,new _p(r))})}function Z4(t){return IS.default.scan(t,BS).isBrace}var Xle,Zle,IS,BS,$le,ece=Et(()=>{Pt();Xle=Ze(Cb()),Zle=Ze(ve(\"fs\")),IS=Ze($o()),BS={strictBrackets:!0},$le={onlyDirectories:!1,onlyFiles:!1}});function $4(){}function eU(){for(let t of vg)t.kill()}function ice(t,e,r,o){return a=>{let n=a[0]instanceof iA.Transform?\"pipe\":a[0],u=a[1]instanceof iA.Transform?\"pipe\":a[1],A=a[2]instanceof iA.Transform?\"pipe\":a[2],p=(0,rce.default)(t,e,{...o,stdio:[n,u,A]});return vg.add(p),vg.size===1&&(process.on(\"SIGINT\",$4),process.on(\"SIGTERM\",eU)),a[0]instanceof iA.Transform&&a[0].pipe(p.stdin),a[1]instanceof iA.Transform&&p.stdout.pipe(a[1],{end:!1}),a[2]instanceof iA.Transform&&p.stderr.pipe(a[2],{end:!1}),{stdin:p.stdin,promise:new Promise(h=>{p.on(\"error\",E=>{switch(vg.delete(p),vg.size===0&&(process.off(\"SIGINT\",$4),process.off(\"SIGTERM\",eU)),E.code){case\"ENOENT\":a[2].write(`command not found: ${t}\n`),h(127);break;case\"EACCES\":a[2].write(`permission denied: ${t}\n`),h(128);break;default:a[2].write(`uncaught error: ${E.message}\n`),h(1);break}}),p.on(\"close\",E=>{vg.delete(p),vg.size===0&&(process.off(\"SIGINT\",$4),process.off(\"SIGTERM\",eU)),h(E!==null?E:129)})})}}}function sce(t){return e=>{let r=e[0]===\"pipe\"?new iA.PassThrough:e[0];return{stdin:r,promise:Promise.resolve().then(()=>t({stdin:r,stdout:e[1],stderr:e[2]}))}}}function DS(t,e){return rU.start(t,e)}function tce(t,e=null){let r=new iA.PassThrough,o=new nce.StringDecoder,a=\"\";return r.on(\"data\",n=>{let u=o.write(n),A;do if(A=u.indexOf(`\n`),A!==-1){let p=a+u.substring(0,A);u=u.substring(A+1),a=\"\",t(e!==null?`${e} ${p}`:p)}while(A!==-1);a+=u}),r.on(\"end\",()=>{let n=o.end();n!==\"\"&&t(e!==null?`${e} ${n}`:n)}),r}function oce(t,{prefix:e}){return{stdout:tce(r=>t.stdout.write(`${r}\n`),t.stdout.isTTY?e:null),stderr:tce(r=>t.stderr.write(`${r}\n`),t.stderr.isTTY?e:null)}}var rce,iA,nce,vg,Jl,tU,rU,nU=Et(()=>{rce=Ze(KR()),iA=ve(\"stream\"),nce=ve(\"string_decoder\"),vg=new Set;Jl=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},tU=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error(\"Assertion failed: No stream attached\");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error(\"Assertion failed: No stream attached\");return this.stream}},rU=class t{constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=r}static start(e,{stdin:r,stdout:o,stderr:a}){let n=new t(null,e);return n.stdin=r,n.stdout=o,n.stderr=a,n}pipeTo(e,r=1){let o=new t(this,e),a=new tU;return o.pipe=a,o.stdout=this.stdout,o.stderr=this.stderr,(r&1)===1?this.stdout=a:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)===2?this.stderr=a:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),o}async exec(){let e=[\"ignore\",\"ignore\",\"ignore\"];if(this.pipe)e[0]=\"pipe\";else{if(this.stdin===null)throw new Error(\"Assertion failed: No input stream registered\");e[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error(\"Assertion failed: No output stream registered\");r=this.stdout,e[1]=r.get();let o;if(this.stderr===null)throw new Error(\"Assertion failed: No error stream registered\");o=this.stderr,e[2]=o.get();let a=this.implementation(e);return this.pipe&&this.pipe.attach(a.stdin),await a.promise.then(n=>(r.close(),o.close(),n))}async run(){let e=[];for(let o=this;o;o=o.ancestor)e.push(o.exec());return(await Promise.all(e))[0]}}});var E1={};Vt(E1,{EntryCommand:()=>h1,ShellError:()=>ll,execute:()=>cy,globUtils:()=>vS});function ace(t,e,r){let o=new cl.PassThrough({autoDestroy:!0});switch(t){case 0:(e&1)===1&&r.stdin.pipe(o,{end:!1}),(e&2)===2&&r.stdin instanceof cl.Writable&&o.pipe(r.stdin,{end:!1});break;case 1:(e&1)===1&&r.stdout.pipe(o,{end:!1}),(e&2)===2&&o.pipe(r.stdout,{end:!1});break;case 2:(e&1)===1&&r.stderr.pipe(o,{end:!1}),(e&2)===2&&o.pipe(r.stderr,{end:!1});break;default:throw new ll(`Bad file descriptor: \"${t}\"`)}return o}function bS(t,e={}){let r={...t,...e};return r.environment={...t.environment,...e.environment},r.variables={...t.variables,...e.variables},r}async function Eot(t,e,r){let o=[],a=new cl.PassThrough;return a.on(\"data\",n=>o.push(n)),await SS(t,e,bS(r,{stdout:a})),Buffer.concat(o).toString().replace(/[\\r\\n]+$/,\"\")}async function lce(t,e,r){let o=t.map(async n=>{let u=await Dg(n.args,e,r);return{name:n.name,value:u.join(\" \")}});return(await Promise.all(o)).reduce((n,u)=>(n[u.name]=u.value,n),{})}function PS(t){return t.match(/[^ \\r\\n\\t]+/g)||[]}async function hce(t,e,r,o,a=o){switch(t.name){case\"$\":o(String(process.pid));break;case\"#\":o(String(e.args.length));break;case\"@\":if(t.quoted)for(let n of e.args)a(n);else for(let n of e.args){let u=PS(n);for(let A=0;A<u.length-1;++A)a(u[A]);o(u[u.length-1])}break;case\"*\":{let n=e.args.join(\" \");if(t.quoted)o(n);else for(let u of PS(n))a(u)}break;case\"PPID\":o(String(process.ppid));break;case\"RANDOM\":o(String(Math.floor(Math.random()*32768)));break;default:{let n=parseInt(t.name,10),u,A=Number.isFinite(n);if(A?n>=0&&n<e.args.length&&(u=e.args[n]):Object.hasOwn(r.variables,t.name)?u=r.variables[t.name]:Object.hasOwn(r.environment,t.name)&&(u=r.environment[t.name]),typeof u<\"u\"&&t.alternativeValue?u=(await Dg(t.alternativeValue,e,r)).join(\" \"):typeof u>\"u\"&&(t.defaultValue?u=(await Dg(t.defaultValue,e,r)).join(\" \"):t.alternativeValue&&(u=\"\")),typeof u>\"u\")throw A?new ll(`Unbound argument #${n}`):new ll(`Unbound variable \"${t.name}\"`);if(t.quoted)o(u);else{let p=PS(u);for(let E=0;E<p.length-1;++E)a(p[E]);let h=p[p.length-1];typeof h<\"u\"&&o(h)}}break}}async function d1(t,e,r){if(t.type===\"number\"){if(Number.isInteger(t.value))return t.value;throw new Error(`Invalid number: \"${t.value}\", only integers are allowed`)}else if(t.type===\"variable\"){let o=[];await hce({...t,quoted:!0},e,r,n=>o.push(n));let a=Number(o.join(\" \"));return Number.isNaN(a)?d1({type:\"variable\",name:o.join(\" \")},e,r):d1({type:\"number\",value:a},e,r)}else return Cot[t.type](await d1(t.left,e,r),await d1(t.right,e,r))}async function Dg(t,e,r){let o=new Map,a=[],n=[],u=E=>{n.push(E)},A=()=>{n.length>0&&a.push(n.join(\"\")),n=[]},p=E=>{u(E),A()},h=(E,I,v)=>{let x=JSON.stringify({type:E,fd:I}),C=o.get(x);typeof C>\"u\"&&o.set(x,C=[]),C.push(v)};for(let E of t){let I=!1;switch(E.type){case\"redirection\":{let v=await Dg(E.args,e,r);for(let x of v)h(E.subtype,E.fd,x)}break;case\"argument\":for(let v of E.segments)switch(v.type){case\"text\":u(v.text);break;case\"glob\":u(v.pattern),I=!0;break;case\"shell\":{let x=await Eot(v.shell,e,r);if(v.quoted)u(x);else{let C=PS(x);for(let R=0;R<C.length-1;++R)p(C[R]);u(C[C.length-1])}}break;case\"variable\":await hce(v,e,r,u,p);break;case\"arithmetic\":u(String(await d1(v.arithmetic,e,r)));break}break}if(A(),I){let v=a.pop();if(typeof v>\"u\")throw new Error(\"Assertion failed: Expected a glob pattern to have been set\");let x=await e.glob.match(v,{cwd:r.cwd,baseFs:e.baseFs});if(x.length===0){let C=Z4(v)?\". Note: Brace expansion of arbitrary strings isn't currently supported. For more details, please read this issue: https://github.com/yarnpkg/berry/issues/22\":\"\";throw new ll(`No matches found: \"${v}\"${C}`)}for(let C of x.sort())p(C)}}if(o.size>0){let E=[];for(let[I,v]of o.entries())E.splice(E.length,0,I,String(v.length),...v);a.splice(0,0,\"__ysh_set_redirects\",...E,\"--\")}return a}function m1(t,e,r){e.builtins.has(t[0])||(t=[\"command\",...t]);let o=ue.fromPortablePath(r.cwd),a=r.environment;typeof a.PWD<\"u\"&&(a={...a,PWD:o});let[n,...u]=t;if(n===\"command\")return ice(u[0],u.slice(1),e,{cwd:o,env:a});let A=e.builtins.get(n);if(typeof A>\"u\")throw new Error(`Assertion failed: A builtin should exist for \"${n}\"`);return sce(async({stdin:p,stdout:h,stderr:E})=>{let{stdin:I,stdout:v,stderr:x}=r;r.stdin=p,r.stdout=h,r.stderr=E;try{return await A(u,e,r)}finally{r.stdin=I,r.stdout=v,r.stderr=x}})}function wot(t,e,r){return o=>{let a=new cl.PassThrough,n=SS(t,e,bS(r,{stdin:a}));return{stdin:a,promise:n}}}function Iot(t,e,r){return o=>{let a=new cl.PassThrough,n=SS(t,e,r);return{stdin:a,promise:n}}}function cce(t,e,r,o){if(e.length===0)return t;{let a;do a=String(Math.random());while(Object.hasOwn(o.procedures,a));return o.procedures={...o.procedures},o.procedures[a]=t,m1([...e,\"__ysh_run_procedure\",a],r,o)}}async function uce(t,e,r){let o=t,a=null,n=null;for(;o;){let u=o.then?{...r}:r,A;switch(o.type){case\"command\":{let p=await Dg(o.args,e,r),h=await lce(o.envs,e,r);A=o.envs.length?m1(p,e,bS(u,{environment:h})):m1(p,e,u)}break;case\"subshell\":{let p=await Dg(o.args,e,r),h=wot(o.subshell,e,u);A=cce(h,p,e,u)}break;case\"group\":{let p=await Dg(o.args,e,r),h=Iot(o.group,e,u);A=cce(h,p,e,u)}break;case\"envs\":{let p=await lce(o.envs,e,r);u.environment={...u.environment,...p},A=m1([\"true\"],e,u)}break}if(typeof A>\"u\")throw new Error(\"Assertion failed: An action should have been generated\");if(a===null)n=DS(A,{stdin:new Jl(u.stdin),stdout:new Jl(u.stdout),stderr:new Jl(u.stderr)});else{if(n===null)throw new Error(\"Assertion failed: The execution pipeline should have been setup\");switch(a){case\"|\":n=n.pipeTo(A,1);break;case\"|&\":n=n.pipeTo(A,3);break}}o.then?(a=o.then.type,o=o.then.chain):o=null}if(n===null)throw new Error(\"Assertion failed: The execution pipeline should have been setup\");return await n.run()}async function Bot(t,e,r,{background:o=!1}={}){function a(n){let u=[\"#2E86AB\",\"#A23B72\",\"#F18F01\",\"#C73E1D\",\"#CCE2A3\"],A=u[n%u.length];return Ace.default.hex(A)}if(o){let n=r.nextBackgroundJobIndex++,u=a(n),A=`[${n}]`,p=u(A),{stdout:h,stderr:E}=oce(r,{prefix:p});return r.backgroundJobs.push(uce(t,e,bS(r,{stdout:h,stderr:E})).catch(I=>E.write(`${I.message}\n`)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${p}, '${u(Jd(t))}' has ended\n`)})),0}return await uce(t,e,r)}async function vot(t,e,r,{background:o=!1}={}){let a,n=A=>{a=A,r.variables[\"?\"]=String(A)},u=async A=>{try{return await Bot(A.chain,e,r,{background:o&&typeof A.then>\"u\"})}catch(p){if(!(p instanceof ll))throw p;return r.stderr.write(`${p.message}\n`),1}};for(n(await u(t));t.then;){if(r.exitCode!==null)return r.exitCode;switch(t.then.type){case\"&&\":a===0&&n(await u(t.then.line));break;case\"||\":a!==0&&n(await u(t.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: \"${t.then.type}\"`)}t=t.then.line}return a}async function SS(t,e,r){let o=r.backgroundJobs;r.backgroundJobs=[];let a=0;for(let{command:n,type:u}of t){if(a=await vot(n,e,r,{background:u===\"&\"}),r.exitCode!==null)return r.exitCode;r.variables[\"?\"]=String(a)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=o,a}function gce(t){switch(t.type){case\"variable\":return t.name===\"@\"||t.name===\"#\"||t.name===\"*\"||Number.isFinite(parseInt(t.name,10))||\"defaultValue\"in t&&!!t.defaultValue&&t.defaultValue.some(e=>y1(e))||\"alternativeValue\"in t&&!!t.alternativeValue&&t.alternativeValue.some(e=>y1(e));case\"arithmetic\":return iU(t.arithmetic);case\"shell\":return sU(t.shell);default:return!1}}function y1(t){switch(t.type){case\"redirection\":return t.args.some(e=>y1(e));case\"argument\":return t.segments.some(e=>gce(e));default:throw new Error(`Assertion failed: Unsupported argument type: \"${t.type}\"`)}}function iU(t){switch(t.type){case\"variable\":return gce(t);case\"number\":return!1;default:return iU(t.left)||iU(t.right)}}function sU(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(;r;){let o;switch(r.type){case\"subshell\":o=sU(r.subshell);break;case\"command\":o=r.envs.some(a=>a.args.some(n=>y1(n)))||r.args.some(a=>y1(a));break}if(o)return!0;if(!r.then)break;r=r.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function cy(t,e=[],{baseFs:r=new Tn,builtins:o={},cwd:a=ue.toPortablePath(process.cwd()),env:n=process.env,stdin:u=process.stdin,stdout:A=process.stdout,stderr:p=process.stderr,variables:h={},glob:E=vS}={}){let I={};for(let[C,R]of Object.entries(n))typeof R<\"u\"&&(I[C]=R);let v=new Map(yot);for(let[C,R]of Object.entries(o))v.set(C,R);u===null&&(u=new cl.PassThrough,u.end());let x=CD(t,E);if(!sU(x)&&x.length>0&&e.length>0){let{command:C}=x[x.length-1];for(;C.then;)C=C.then.line;let R=C.chain;for(;R.then;)R=R.then.chain;R.type===\"command\"&&(R.args=R.args.concat(e.map(L=>({type:\"argument\",segments:[{type:\"text\",text:L}]}))))}return await SS(x,{args:e,baseFs:r,builtins:v,initialStdin:u,initialStdout:A,initialStderr:p,glob:E},{cwd:a,environment:I,exitCode:null,procedures:{},stdin:u,stdout:A,stderr:p,variables:Object.assign({},h,{\"?\":0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var Ace,fce,cl,pce,yot,Cot,g1=Et(()=>{Pt();Nl();Ace=Ze(pN()),fce=ve(\"os\"),cl=ve(\"stream\"),pce=ve(\"timers/promises\");zle();Jle();ece();nU();nU();yot=new Map([[\"cd\",async([t=(0,fce.homedir)(),...e],r,o)=>{let a=V.resolve(o.cwd,ue.toPortablePath(t));if(!(await r.baseFs.statPromise(a).catch(u=>{throw u.code===\"ENOENT\"?new ll(`cd: no such file or directory: ${t}`):u})).isDirectory())throw new ll(`cd: not a directory: ${t}`);return o.cwd=a,0}],[\"pwd\",async(t,e,r)=>(r.stdout.write(`${ue.fromPortablePath(r.cwd)}\n`),0)],[\":\",async(t,e,r)=>0],[\"true\",async(t,e,r)=>0],[\"false\",async(t,e,r)=>1],[\"exit\",async([t,...e],r,o)=>o.exitCode=parseInt(t??o.variables[\"?\"],10)],[\"echo\",async(t,e,r)=>(r.stdout.write(`${t.join(\" \")}\n`),0)],[\"sleep\",async([t],e,r)=>{if(typeof t>\"u\")throw new ll(\"sleep: missing operand\");let o=Number(t);if(Number.isNaN(o))throw new ll(`sleep: invalid time interval '${t}'`);return await(0,pce.setTimeout)(1e3*o,0)}],[\"unset\",async(t,e,r)=>{for(let o of t)delete r.environment[o],delete r.variables[o];return 0}],[\"__ysh_run_procedure\",async(t,e,r)=>{let o=r.procedures[t[0]];return await DS(o,{stdin:new Jl(r.stdin),stdout:new Jl(r.stdout),stderr:new Jl(r.stderr)}).run()}],[\"__ysh_set_redirects\",async(t,e,r)=>{let o=r.stdin,a=r.stdout,n=r.stderr,u=[],A=[],p=[],h=0;for(;t[h]!==\"--\";){let I=t[h++],{type:v,fd:x}=JSON.parse(I),C=z=>{switch(x){case null:case 0:u.push(z);break;default:throw new Error(`Unsupported file descriptor: \"${x}\"`)}},R=z=>{switch(x){case null:case 1:A.push(z);break;case 2:p.push(z);break;default:throw new Error(`Unsupported file descriptor: \"${x}\"`)}},L=Number(t[h++]),U=h+L;for(let z=h;z<U;++h,++z)switch(v){case\"<\":C(()=>e.baseFs.createReadStream(V.resolve(r.cwd,ue.toPortablePath(t[z]))));break;case\"<<<\":C(()=>{let te=new cl.PassThrough;return process.nextTick(()=>{te.write(`${t[z]}\n`),te.end()}),te});break;case\"<&\":C(()=>ace(Number(t[z]),1,r));break;case\">\":case\">>\":{let te=V.resolve(r.cwd,ue.toPortablePath(t[z]));R(te===\"/dev/null\"?new cl.Writable({autoDestroy:!0,emitClose:!0,write(ae,le,ce){setImmediate(ce)}}):e.baseFs.createWriteStream(te,v===\">>\"?{flags:\"a\"}:void 0))}break;case\">&\":R(ace(Number(t[z]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: \"${v}\"`)}}if(u.length>0){let I=new cl.PassThrough;o=I;let v=x=>{if(x===u.length)I.end();else{let C=u[x]();C.pipe(I,{end:!1}),C.on(\"end\",()=>{v(x+1)})}};v(0)}if(A.length>0){let I=new cl.PassThrough;a=I;for(let v of A)I.pipe(v)}if(p.length>0){let I=new cl.PassThrough;n=I;for(let v of p)I.pipe(v)}let E=await DS(m1(t.slice(h+1),e,r),{stdin:new Jl(o),stdout:new Jl(a),stderr:new Jl(n)}).run();return await Promise.all(A.map(I=>new Promise((v,x)=>{I.on(\"error\",C=>{x(C)}),I.on(\"close\",()=>{v()}),I.end()}))),await Promise.all(p.map(I=>new Promise((v,x)=>{I.on(\"error\",C=>{x(C)}),I.on(\"close\",()=>{v()}),I.end()}))),E}]]);Cot={addition:(t,e)=>t+e,subtraction:(t,e)=>t-e,multiplication:(t,e)=>t*e,division:(t,e)=>Math.trunc(t/e)}});var xS=_((c4t,dce)=>{function Dot(t,e){for(var r=-1,o=t==null?0:t.length,a=Array(o);++r<o;)a[r]=e(t[r],r,t);return a}dce.exports=Dot});var Ice=_((u4t,wce)=>{var mce=lg(),Pot=xS(),bot=Hl(),Sot=Ym(),xot=1/0,yce=mce?mce.prototype:void 0,Ece=yce?yce.toString:void 0;function Cce(t){if(typeof t==\"string\")return t;if(bot(t))return Pot(t,Cce)+\"\";if(Sot(t))return Ece?Ece.call(t):\"\";var e=t+\"\";return e==\"0\"&&1/t==-xot?\"-0\":e}wce.exports=Cce});var C1=_((A4t,Bce)=>{var kot=Ice();function Qot(t){return t==null?\"\":kot(t)}Bce.exports=Qot});var oU=_((f4t,vce)=>{function Fot(t,e,r){var o=-1,a=t.length;e<0&&(e=-e>a?0:a+e),r=r>a?a:r,r<0&&(r+=a),a=e>r?0:r-e>>>0,e>>>=0;for(var n=Array(a);++o<a;)n[o]=t[o+e];return n}vce.exports=Fot});var Pce=_((p4t,Dce)=>{var Rot=oU();function Tot(t,e,r){var o=t.length;return r=r===void 0?o:r,!e&&r>=o?t:Rot(t,e,r)}Dce.exports=Tot});var aU=_((h4t,bce)=>{var Not=\"\\\\ud800-\\\\udfff\",Lot=\"\\\\u0300-\\\\u036f\",Mot=\"\\\\ufe20-\\\\ufe2f\",Oot=\"\\\\u20d0-\\\\u20ff\",Uot=Lot+Mot+Oot,_ot=\"\\\\ufe0e\\\\ufe0f\",Hot=\"\\\\u200d\",qot=RegExp(\"[\"+Hot+Not+Uot+_ot+\"]\");function jot(t){return qot.test(t)}bce.exports=jot});var xce=_((g4t,Sce)=>{function Got(t){return t.split(\"\")}Sce.exports=Got});var Mce=_((d4t,Lce)=>{var kce=\"\\\\ud800-\\\\udfff\",Yot=\"\\\\u0300-\\\\u036f\",Wot=\"\\\\ufe20-\\\\ufe2f\",Kot=\"\\\\u20d0-\\\\u20ff\",Vot=Yot+Wot+Kot,zot=\"\\\\ufe0e\\\\ufe0f\",Jot=\"[\"+kce+\"]\",lU=\"[\"+Vot+\"]\",cU=\"\\\\ud83c[\\\\udffb-\\\\udfff]\",Xot=\"(?:\"+lU+\"|\"+cU+\")\",Qce=\"[^\"+kce+\"]\",Fce=\"(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}\",Rce=\"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\",Zot=\"\\\\u200d\",Tce=Xot+\"?\",Nce=\"[\"+zot+\"]?\",$ot=\"(?:\"+Zot+\"(?:\"+[Qce,Fce,Rce].join(\"|\")+\")\"+Nce+Tce+\")*\",eat=Nce+Tce+$ot,tat=\"(?:\"+[Qce+lU+\"?\",lU,Fce,Rce,Jot].join(\"|\")+\")\",rat=RegExp(cU+\"(?=\"+cU+\")|\"+tat+eat,\"g\");function nat(t){return t.match(rat)||[]}Lce.exports=nat});var Uce=_((m4t,Oce)=>{var iat=xce(),sat=aU(),oat=Mce();function aat(t){return sat(t)?oat(t):iat(t)}Oce.exports=aat});var Hce=_((y4t,_ce)=>{var lat=Pce(),cat=aU(),uat=Uce(),Aat=C1();function fat(t){return function(e){e=Aat(e);var r=cat(e)?uat(e):void 0,o=r?r[0]:e.charAt(0),a=r?lat(r,1).join(\"\"):e.slice(1);return o[t]()+a}}_ce.exports=fat});var jce=_((E4t,qce)=>{var pat=Hce(),hat=pat(\"toUpperCase\");qce.exports=hat});var uU=_((C4t,Gce)=>{var gat=C1(),dat=jce();function mat(t){return dat(gat(t).toLowerCase())}Gce.exports=mat});var Yce=_((w4t,kS)=>{function yat(){var t=0,e=1,r=2,o=3,a=4,n=5,u=6,A=7,p=8,h=9,E=10,I=11,v=12,x=13,C=14,R=15,L=16,U=17,z=0,te=1,ae=2,le=3,ce=4;function Ce(g,me){return 55296<=g.charCodeAt(me)&&g.charCodeAt(me)<=56319&&56320<=g.charCodeAt(me+1)&&g.charCodeAt(me+1)<=57343}function de(g,me){me===void 0&&(me=0);var we=g.charCodeAt(me);if(55296<=we&&we<=56319&&me<g.length-1){var Ae=we,ne=g.charCodeAt(me+1);return 56320<=ne&&ne<=57343?(Ae-55296)*1024+(ne-56320)+65536:Ae}if(56320<=we&&we<=57343&&me>=1){var Ae=g.charCodeAt(me-1),ne=we;return 55296<=Ae&&Ae<=56319?(Ae-55296)*1024+(ne-56320)+65536:ne}return we}function Be(g,me,we){var Ae=[g].concat(me).concat([we]),ne=Ae[Ae.length-2],Z=we,xe=Ae.lastIndexOf(C);if(xe>1&&Ae.slice(1,xe).every(function(H){return H==o})&&[o,x,U].indexOf(g)==-1)return ae;var Ne=Ae.lastIndexOf(a);if(Ne>0&&Ae.slice(1,Ne).every(function(H){return H==a})&&[v,a].indexOf(ne)==-1)return Ae.filter(function(H){return H==a}).length%2==1?le:ce;if(ne==t&&Z==e)return z;if(ne==r||ne==t||ne==e)return Z==C&&me.every(function(H){return H==o})?ae:te;if(Z==r||Z==t||Z==e)return te;if(ne==u&&(Z==u||Z==A||Z==h||Z==E))return z;if((ne==h||ne==A)&&(Z==A||Z==p))return z;if((ne==E||ne==p)&&Z==p)return z;if(Z==o||Z==R)return z;if(Z==n)return z;if(ne==v)return z;var ht=Ae.indexOf(o)!=-1?Ae.lastIndexOf(o)-1:Ae.length-2;return[x,U].indexOf(Ae[ht])!=-1&&Ae.slice(ht+1,-1).every(function(H){return H==o})&&Z==C||ne==R&&[L,U].indexOf(Z)!=-1?z:me.indexOf(a)!=-1?ae:ne==a&&Z==a?z:te}this.nextBreak=function(g,me){if(me===void 0&&(me=0),me<0)return 0;if(me>=g.length-1)return g.length;for(var we=Ee(de(g,me)),Ae=[],ne=me+1;ne<g.length;ne++)if(!Ce(g,ne-1)){var Z=Ee(de(g,ne));if(Be(we,Ae,Z))return ne;Ae.push(Z)}return g.length},this.splitGraphemes=function(g){for(var me=[],we=0,Ae;(Ae=this.nextBreak(g,we))<g.length;)me.push(g.slice(we,Ae)),we=Ae;return we<g.length&&me.push(g.slice(we)),me},this.iterateGraphemes=function(g){var me=0,we={next:function(){var Ae,ne;return(ne=this.nextBreak(g,me))<g.length?(Ae=g.slice(me,ne),me=ne,{value:Ae,done:!1}):me<g.length?(Ae=g.slice(me),me=g.length,{value:Ae,done:!1}):{value:void 0,done:!0}}.bind(this)};return typeof Symbol<\"u\"&&Symbol.iterator&&(we[Symbol.iterator]=function(){return we}),we},this.countGraphemes=function(g){for(var me=0,we=0,Ae;(Ae=this.nextBreak(g,we))<g.length;)we=Ae,me++;return we<g.length&&me++,me};function Ee(g){return 1536<=g&&g<=1541||g==1757||g==1807||g==2274||g==3406||g==69821||70082<=g&&g<=70083||g==72250||72326<=g&&g<=72329||g==73030?v:g==13?t:g==10?e:0<=g&&g<=9||11<=g&&g<=12||14<=g&&g<=31||127<=g&&g<=159||g==173||g==1564||g==6158||g==8203||8206<=g&&g<=8207||g==8232||g==8233||8234<=g&&g<=8238||8288<=g&&g<=8292||g==8293||8294<=g&&g<=8303||55296<=g&&g<=57343||g==65279||65520<=g&&g<=65528||65529<=g&&g<=65531||113824<=g&&g<=113827||119155<=g&&g<=119162||g==917504||g==917505||917506<=g&&g<=917535||917632<=g&&g<=917759||918e3<=g&&g<=921599?r:768<=g&&g<=879||1155<=g&&g<=1159||1160<=g&&g<=1161||1425<=g&&g<=1469||g==1471||1473<=g&&g<=1474||1476<=g&&g<=1477||g==1479||1552<=g&&g<=1562||1611<=g&&g<=1631||g==1648||1750<=g&&g<=1756||1759<=g&&g<=1764||1767<=g&&g<=1768||1770<=g&&g<=1773||g==1809||1840<=g&&g<=1866||1958<=g&&g<=1968||2027<=g&&g<=2035||2070<=g&&g<=2073||2075<=g&&g<=2083||2085<=g&&g<=2087||2089<=g&&g<=2093||2137<=g&&g<=2139||2260<=g&&g<=2273||2275<=g&&g<=2306||g==2362||g==2364||2369<=g&&g<=2376||g==2381||2385<=g&&g<=2391||2402<=g&&g<=2403||g==2433||g==2492||g==2494||2497<=g&&g<=2500||g==2509||g==2519||2530<=g&&g<=2531||2561<=g&&g<=2562||g==2620||2625<=g&&g<=2626||2631<=g&&g<=2632||2635<=g&&g<=2637||g==2641||2672<=g&&g<=2673||g==2677||2689<=g&&g<=2690||g==2748||2753<=g&&g<=2757||2759<=g&&g<=2760||g==2765||2786<=g&&g<=2787||2810<=g&&g<=2815||g==2817||g==2876||g==2878||g==2879||2881<=g&&g<=2884||g==2893||g==2902||g==2903||2914<=g&&g<=2915||g==2946||g==3006||g==3008||g==3021||g==3031||g==3072||3134<=g&&g<=3136||3142<=g&&g<=3144||3146<=g&&g<=3149||3157<=g&&g<=3158||3170<=g&&g<=3171||g==3201||g==3260||g==3263||g==3266||g==3270||3276<=g&&g<=3277||3285<=g&&g<=3286||3298<=g&&g<=3299||3328<=g&&g<=3329||3387<=g&&g<=3388||g==3390||3393<=g&&g<=3396||g==3405||g==3415||3426<=g&&g<=3427||g==3530||g==3535||3538<=g&&g<=3540||g==3542||g==3551||g==3633||3636<=g&&g<=3642||3655<=g&&g<=3662||g==3761||3764<=g&&g<=3769||3771<=g&&g<=3772||3784<=g&&g<=3789||3864<=g&&g<=3865||g==3893||g==3895||g==3897||3953<=g&&g<=3966||3968<=g&&g<=3972||3974<=g&&g<=3975||3981<=g&&g<=3991||3993<=g&&g<=4028||g==4038||4141<=g&&g<=4144||4146<=g&&g<=4151||4153<=g&&g<=4154||4157<=g&&g<=4158||4184<=g&&g<=4185||4190<=g&&g<=4192||4209<=g&&g<=4212||g==4226||4229<=g&&g<=4230||g==4237||g==4253||4957<=g&&g<=4959||5906<=g&&g<=5908||5938<=g&&g<=5940||5970<=g&&g<=5971||6002<=g&&g<=6003||6068<=g&&g<=6069||6071<=g&&g<=6077||g==6086||6089<=g&&g<=6099||g==6109||6155<=g&&g<=6157||6277<=g&&g<=6278||g==6313||6432<=g&&g<=6434||6439<=g&&g<=6440||g==6450||6457<=g&&g<=6459||6679<=g&&g<=6680||g==6683||g==6742||6744<=g&&g<=6750||g==6752||g==6754||6757<=g&&g<=6764||6771<=g&&g<=6780||g==6783||6832<=g&&g<=6845||g==6846||6912<=g&&g<=6915||g==6964||6966<=g&&g<=6970||g==6972||g==6978||7019<=g&&g<=7027||7040<=g&&g<=7041||7074<=g&&g<=7077||7080<=g&&g<=7081||7083<=g&&g<=7085||g==7142||7144<=g&&g<=7145||g==7149||7151<=g&&g<=7153||7212<=g&&g<=7219||7222<=g&&g<=7223||7376<=g&&g<=7378||7380<=g&&g<=7392||7394<=g&&g<=7400||g==7405||g==7412||7416<=g&&g<=7417||7616<=g&&g<=7673||7675<=g&&g<=7679||g==8204||8400<=g&&g<=8412||8413<=g&&g<=8416||g==8417||8418<=g&&g<=8420||8421<=g&&g<=8432||11503<=g&&g<=11505||g==11647||11744<=g&&g<=11775||12330<=g&&g<=12333||12334<=g&&g<=12335||12441<=g&&g<=12442||g==42607||42608<=g&&g<=42610||42612<=g&&g<=42621||42654<=g&&g<=42655||42736<=g&&g<=42737||g==43010||g==43014||g==43019||43045<=g&&g<=43046||43204<=g&&g<=43205||43232<=g&&g<=43249||43302<=g&&g<=43309||43335<=g&&g<=43345||43392<=g&&g<=43394||g==43443||43446<=g&&g<=43449||g==43452||g==43493||43561<=g&&g<=43566||43569<=g&&g<=43570||43573<=g&&g<=43574||g==43587||g==43596||g==43644||g==43696||43698<=g&&g<=43700||43703<=g&&g<=43704||43710<=g&&g<=43711||g==43713||43756<=g&&g<=43757||g==43766||g==44005||g==44008||g==44013||g==64286||65024<=g&&g<=65039||65056<=g&&g<=65071||65438<=g&&g<=65439||g==66045||g==66272||66422<=g&&g<=66426||68097<=g&&g<=68099||68101<=g&&g<=68102||68108<=g&&g<=68111||68152<=g&&g<=68154||g==68159||68325<=g&&g<=68326||g==69633||69688<=g&&g<=69702||69759<=g&&g<=69761||69811<=g&&g<=69814||69817<=g&&g<=69818||69888<=g&&g<=69890||69927<=g&&g<=69931||69933<=g&&g<=69940||g==70003||70016<=g&&g<=70017||70070<=g&&g<=70078||70090<=g&&g<=70092||70191<=g&&g<=70193||g==70196||70198<=g&&g<=70199||g==70206||g==70367||70371<=g&&g<=70378||70400<=g&&g<=70401||g==70460||g==70462||g==70464||g==70487||70502<=g&&g<=70508||70512<=g&&g<=70516||70712<=g&&g<=70719||70722<=g&&g<=70724||g==70726||g==70832||70835<=g&&g<=70840||g==70842||g==70845||70847<=g&&g<=70848||70850<=g&&g<=70851||g==71087||71090<=g&&g<=71093||71100<=g&&g<=71101||71103<=g&&g<=71104||71132<=g&&g<=71133||71219<=g&&g<=71226||g==71229||71231<=g&&g<=71232||g==71339||g==71341||71344<=g&&g<=71349||g==71351||71453<=g&&g<=71455||71458<=g&&g<=71461||71463<=g&&g<=71467||72193<=g&&g<=72198||72201<=g&&g<=72202||72243<=g&&g<=72248||72251<=g&&g<=72254||g==72263||72273<=g&&g<=72278||72281<=g&&g<=72283||72330<=g&&g<=72342||72344<=g&&g<=72345||72752<=g&&g<=72758||72760<=g&&g<=72765||g==72767||72850<=g&&g<=72871||72874<=g&&g<=72880||72882<=g&&g<=72883||72885<=g&&g<=72886||73009<=g&&g<=73014||g==73018||73020<=g&&g<=73021||73023<=g&&g<=73029||g==73031||92912<=g&&g<=92916||92976<=g&&g<=92982||94095<=g&&g<=94098||113821<=g&&g<=113822||g==119141||119143<=g&&g<=119145||119150<=g&&g<=119154||119163<=g&&g<=119170||119173<=g&&g<=119179||119210<=g&&g<=119213||119362<=g&&g<=119364||121344<=g&&g<=121398||121403<=g&&g<=121452||g==121461||g==121476||121499<=g&&g<=121503||121505<=g&&g<=121519||122880<=g&&g<=122886||122888<=g&&g<=122904||122907<=g&&g<=122913||122915<=g&&g<=122916||122918<=g&&g<=122922||125136<=g&&g<=125142||125252<=g&&g<=125258||917536<=g&&g<=917631||917760<=g&&g<=917999?o:127462<=g&&g<=127487?a:g==2307||g==2363||2366<=g&&g<=2368||2377<=g&&g<=2380||2382<=g&&g<=2383||2434<=g&&g<=2435||2495<=g&&g<=2496||2503<=g&&g<=2504||2507<=g&&g<=2508||g==2563||2622<=g&&g<=2624||g==2691||2750<=g&&g<=2752||g==2761||2763<=g&&g<=2764||2818<=g&&g<=2819||g==2880||2887<=g&&g<=2888||2891<=g&&g<=2892||g==3007||3009<=g&&g<=3010||3014<=g&&g<=3016||3018<=g&&g<=3020||3073<=g&&g<=3075||3137<=g&&g<=3140||3202<=g&&g<=3203||g==3262||3264<=g&&g<=3265||3267<=g&&g<=3268||3271<=g&&g<=3272||3274<=g&&g<=3275||3330<=g&&g<=3331||3391<=g&&g<=3392||3398<=g&&g<=3400||3402<=g&&g<=3404||3458<=g&&g<=3459||3536<=g&&g<=3537||3544<=g&&g<=3550||3570<=g&&g<=3571||g==3635||g==3763||3902<=g&&g<=3903||g==3967||g==4145||4155<=g&&g<=4156||4182<=g&&g<=4183||g==4228||g==6070||6078<=g&&g<=6085||6087<=g&&g<=6088||6435<=g&&g<=6438||6441<=g&&g<=6443||6448<=g&&g<=6449||6451<=g&&g<=6456||6681<=g&&g<=6682||g==6741||g==6743||6765<=g&&g<=6770||g==6916||g==6965||g==6971||6973<=g&&g<=6977||6979<=g&&g<=6980||g==7042||g==7073||7078<=g&&g<=7079||g==7082||g==7143||7146<=g&&g<=7148||g==7150||7154<=g&&g<=7155||7204<=g&&g<=7211||7220<=g&&g<=7221||g==7393||7410<=g&&g<=7411||g==7415||43043<=g&&g<=43044||g==43047||43136<=g&&g<=43137||43188<=g&&g<=43203||43346<=g&&g<=43347||g==43395||43444<=g&&g<=43445||43450<=g&&g<=43451||43453<=g&&g<=43456||43567<=g&&g<=43568||43571<=g&&g<=43572||g==43597||g==43755||43758<=g&&g<=43759||g==43765||44003<=g&&g<=44004||44006<=g&&g<=44007||44009<=g&&g<=44010||g==44012||g==69632||g==69634||g==69762||69808<=g&&g<=69810||69815<=g&&g<=69816||g==69932||g==70018||70067<=g&&g<=70069||70079<=g&&g<=70080||70188<=g&&g<=70190||70194<=g&&g<=70195||g==70197||70368<=g&&g<=70370||70402<=g&&g<=70403||g==70463||70465<=g&&g<=70468||70471<=g&&g<=70472||70475<=g&&g<=70477||70498<=g&&g<=70499||70709<=g&&g<=70711||70720<=g&&g<=70721||g==70725||70833<=g&&g<=70834||g==70841||70843<=g&&g<=70844||g==70846||g==70849||71088<=g&&g<=71089||71096<=g&&g<=71099||g==71102||71216<=g&&g<=71218||71227<=g&&g<=71228||g==71230||g==71340||71342<=g&&g<=71343||g==71350||71456<=g&&g<=71457||g==71462||72199<=g&&g<=72200||g==72249||72279<=g&&g<=72280||g==72343||g==72751||g==72766||g==72873||g==72881||g==72884||94033<=g&&g<=94078||g==119142||g==119149?n:4352<=g&&g<=4447||43360<=g&&g<=43388?u:4448<=g&&g<=4519||55216<=g&&g<=55238?A:4520<=g&&g<=4607||55243<=g&&g<=55291?p:g==44032||g==44060||g==44088||g==44116||g==44144||g==44172||g==44200||g==44228||g==44256||g==44284||g==44312||g==44340||g==44368||g==44396||g==44424||g==44452||g==44480||g==44508||g==44536||g==44564||g==44592||g==44620||g==44648||g==44676||g==44704||g==44732||g==44760||g==44788||g==44816||g==44844||g==44872||g==44900||g==44928||g==44956||g==44984||g==45012||g==45040||g==45068||g==45096||g==45124||g==45152||g==45180||g==45208||g==45236||g==45264||g==45292||g==45320||g==45348||g==45376||g==45404||g==45432||g==45460||g==45488||g==45516||g==45544||g==45572||g==45600||g==45628||g==45656||g==45684||g==45712||g==45740||g==45768||g==45796||g==45824||g==45852||g==45880||g==45908||g==45936||g==45964||g==45992||g==46020||g==46048||g==46076||g==46104||g==46132||g==46160||g==46188||g==46216||g==46244||g==46272||g==46300||g==46328||g==46356||g==46384||g==46412||g==46440||g==46468||g==46496||g==46524||g==46552||g==46580||g==46608||g==46636||g==46664||g==46692||g==46720||g==46748||g==46776||g==46804||g==46832||g==46860||g==46888||g==46916||g==46944||g==46972||g==47e3||g==47028||g==47056||g==47084||g==47112||g==47140||g==47168||g==47196||g==47224||g==47252||g==47280||g==47308||g==47336||g==47364||g==47392||g==47420||g==47448||g==47476||g==47504||g==47532||g==47560||g==47588||g==47616||g==47644||g==47672||g==47700||g==47728||g==47756||g==47784||g==47812||g==47840||g==47868||g==47896||g==47924||g==47952||g==47980||g==48008||g==48036||g==48064||g==48092||g==48120||g==48148||g==48176||g==48204||g==48232||g==48260||g==48288||g==48316||g==48344||g==48372||g==48400||g==48428||g==48456||g==48484||g==48512||g==48540||g==48568||g==48596||g==48624||g==48652||g==48680||g==48708||g==48736||g==48764||g==48792||g==48820||g==48848||g==48876||g==48904||g==48932||g==48960||g==48988||g==49016||g==49044||g==49072||g==49100||g==49128||g==49156||g==49184||g==49212||g==49240||g==49268||g==49296||g==49324||g==49352||g==49380||g==49408||g==49436||g==49464||g==49492||g==49520||g==49548||g==49576||g==49604||g==49632||g==49660||g==49688||g==49716||g==49744||g==49772||g==49800||g==49828||g==49856||g==49884||g==49912||g==49940||g==49968||g==49996||g==50024||g==50052||g==50080||g==50108||g==50136||g==50164||g==50192||g==50220||g==50248||g==50276||g==50304||g==50332||g==50360||g==50388||g==50416||g==50444||g==50472||g==50500||g==50528||g==50556||g==50584||g==50612||g==50640||g==50668||g==50696||g==50724||g==50752||g==50780||g==50808||g==50836||g==50864||g==50892||g==50920||g==50948||g==50976||g==51004||g==51032||g==51060||g==51088||g==51116||g==51144||g==51172||g==51200||g==51228||g==51256||g==51284||g==51312||g==51340||g==51368||g==51396||g==51424||g==51452||g==51480||g==51508||g==51536||g==51564||g==51592||g==51620||g==51648||g==51676||g==51704||g==51732||g==51760||g==51788||g==51816||g==51844||g==51872||g==51900||g==51928||g==51956||g==51984||g==52012||g==52040||g==52068||g==52096||g==52124||g==52152||g==52180||g==52208||g==52236||g==52264||g==52292||g==52320||g==52348||g==52376||g==52404||g==52432||g==52460||g==52488||g==52516||g==52544||g==52572||g==52600||g==52628||g==52656||g==52684||g==52712||g==52740||g==52768||g==52796||g==52824||g==52852||g==52880||g==52908||g==52936||g==52964||g==52992||g==53020||g==53048||g==53076||g==53104||g==53132||g==53160||g==53188||g==53216||g==53244||g==53272||g==53300||g==53328||g==53356||g==53384||g==53412||g==53440||g==53468||g==53496||g==53524||g==53552||g==53580||g==53608||g==53636||g==53664||g==53692||g==53720||g==53748||g==53776||g==53804||g==53832||g==53860||g==53888||g==53916||g==53944||g==53972||g==54e3||g==54028||g==54056||g==54084||g==54112||g==54140||g==54168||g==54196||g==54224||g==54252||g==54280||g==54308||g==54336||g==54364||g==54392||g==54420||g==54448||g==54476||g==54504||g==54532||g==54560||g==54588||g==54616||g==54644||g==54672||g==54700||g==54728||g==54756||g==54784||g==54812||g==54840||g==54868||g==54896||g==54924||g==54952||g==54980||g==55008||g==55036||g==55064||g==55092||g==55120||g==55148||g==55176?h:44033<=g&&g<=44059||44061<=g&&g<=44087||44089<=g&&g<=44115||44117<=g&&g<=44143||44145<=g&&g<=44171||44173<=g&&g<=44199||44201<=g&&g<=44227||44229<=g&&g<=44255||44257<=g&&g<=44283||44285<=g&&g<=44311||44313<=g&&g<=44339||44341<=g&&g<=44367||44369<=g&&g<=44395||44397<=g&&g<=44423||44425<=g&&g<=44451||44453<=g&&g<=44479||44481<=g&&g<=44507||44509<=g&&g<=44535||44537<=g&&g<=44563||44565<=g&&g<=44591||44593<=g&&g<=44619||44621<=g&&g<=44647||44649<=g&&g<=44675||44677<=g&&g<=44703||44705<=g&&g<=44731||44733<=g&&g<=44759||44761<=g&&g<=44787||44789<=g&&g<=44815||44817<=g&&g<=44843||44845<=g&&g<=44871||44873<=g&&g<=44899||44901<=g&&g<=44927||44929<=g&&g<=44955||44957<=g&&g<=44983||44985<=g&&g<=45011||45013<=g&&g<=45039||45041<=g&&g<=45067||45069<=g&&g<=45095||45097<=g&&g<=45123||45125<=g&&g<=45151||45153<=g&&g<=45179||45181<=g&&g<=45207||45209<=g&&g<=45235||45237<=g&&g<=45263||45265<=g&&g<=45291||45293<=g&&g<=45319||45321<=g&&g<=45347||45349<=g&&g<=45375||45377<=g&&g<=45403||45405<=g&&g<=45431||45433<=g&&g<=45459||45461<=g&&g<=45487||45489<=g&&g<=45515||45517<=g&&g<=45543||45545<=g&&g<=45571||45573<=g&&g<=45599||45601<=g&&g<=45627||45629<=g&&g<=45655||45657<=g&&g<=45683||45685<=g&&g<=45711||45713<=g&&g<=45739||45741<=g&&g<=45767||45769<=g&&g<=45795||45797<=g&&g<=45823||45825<=g&&g<=45851||45853<=g&&g<=45879||45881<=g&&g<=45907||45909<=g&&g<=45935||45937<=g&&g<=45963||45965<=g&&g<=45991||45993<=g&&g<=46019||46021<=g&&g<=46047||46049<=g&&g<=46075||46077<=g&&g<=46103||46105<=g&&g<=46131||46133<=g&&g<=46159||46161<=g&&g<=46187||46189<=g&&g<=46215||46217<=g&&g<=46243||46245<=g&&g<=46271||46273<=g&&g<=46299||46301<=g&&g<=46327||46329<=g&&g<=46355||46357<=g&&g<=46383||46385<=g&&g<=46411||46413<=g&&g<=46439||46441<=g&&g<=46467||46469<=g&&g<=46495||46497<=g&&g<=46523||46525<=g&&g<=46551||46553<=g&&g<=46579||46581<=g&&g<=46607||46609<=g&&g<=46635||46637<=g&&g<=46663||46665<=g&&g<=46691||46693<=g&&g<=46719||46721<=g&&g<=46747||46749<=g&&g<=46775||46777<=g&&g<=46803||46805<=g&&g<=46831||46833<=g&&g<=46859||46861<=g&&g<=46887||46889<=g&&g<=46915||46917<=g&&g<=46943||46945<=g&&g<=46971||46973<=g&&g<=46999||47001<=g&&g<=47027||47029<=g&&g<=47055||47057<=g&&g<=47083||47085<=g&&g<=47111||47113<=g&&g<=47139||47141<=g&&g<=47167||47169<=g&&g<=47195||47197<=g&&g<=47223||47225<=g&&g<=47251||47253<=g&&g<=47279||47281<=g&&g<=47307||47309<=g&&g<=47335||47337<=g&&g<=47363||47365<=g&&g<=47391||47393<=g&&g<=47419||47421<=g&&g<=47447||47449<=g&&g<=47475||47477<=g&&g<=47503||47505<=g&&g<=47531||47533<=g&&g<=47559||47561<=g&&g<=47587||47589<=g&&g<=47615||47617<=g&&g<=47643||47645<=g&&g<=47671||47673<=g&&g<=47699||47701<=g&&g<=47727||47729<=g&&g<=47755||47757<=g&&g<=47783||47785<=g&&g<=47811||47813<=g&&g<=47839||47841<=g&&g<=47867||47869<=g&&g<=47895||47897<=g&&g<=47923||47925<=g&&g<=47951||47953<=g&&g<=47979||47981<=g&&g<=48007||48009<=g&&g<=48035||48037<=g&&g<=48063||48065<=g&&g<=48091||48093<=g&&g<=48119||48121<=g&&g<=48147||48149<=g&&g<=48175||48177<=g&&g<=48203||48205<=g&&g<=48231||48233<=g&&g<=48259||48261<=g&&g<=48287||48289<=g&&g<=48315||48317<=g&&g<=48343||48345<=g&&g<=48371||48373<=g&&g<=48399||48401<=g&&g<=48427||48429<=g&&g<=48455||48457<=g&&g<=48483||48485<=g&&g<=48511||48513<=g&&g<=48539||48541<=g&&g<=48567||48569<=g&&g<=48595||48597<=g&&g<=48623||48625<=g&&g<=48651||48653<=g&&g<=48679||48681<=g&&g<=48707||48709<=g&&g<=48735||48737<=g&&g<=48763||48765<=g&&g<=48791||48793<=g&&g<=48819||48821<=g&&g<=48847||48849<=g&&g<=48875||48877<=g&&g<=48903||48905<=g&&g<=48931||48933<=g&&g<=48959||48961<=g&&g<=48987||48989<=g&&g<=49015||49017<=g&&g<=49043||49045<=g&&g<=49071||49073<=g&&g<=49099||49101<=g&&g<=49127||49129<=g&&g<=49155||49157<=g&&g<=49183||49185<=g&&g<=49211||49213<=g&&g<=49239||49241<=g&&g<=49267||49269<=g&&g<=49295||49297<=g&&g<=49323||49325<=g&&g<=49351||49353<=g&&g<=49379||49381<=g&&g<=49407||49409<=g&&g<=49435||49437<=g&&g<=49463||49465<=g&&g<=49491||49493<=g&&g<=49519||49521<=g&&g<=49547||49549<=g&&g<=49575||49577<=g&&g<=49603||49605<=g&&g<=49631||49633<=g&&g<=49659||49661<=g&&g<=49687||49689<=g&&g<=49715||49717<=g&&g<=49743||49745<=g&&g<=49771||49773<=g&&g<=49799||49801<=g&&g<=49827||49829<=g&&g<=49855||49857<=g&&g<=49883||49885<=g&&g<=49911||49913<=g&&g<=49939||49941<=g&&g<=49967||49969<=g&&g<=49995||49997<=g&&g<=50023||50025<=g&&g<=50051||50053<=g&&g<=50079||50081<=g&&g<=50107||50109<=g&&g<=50135||50137<=g&&g<=50163||50165<=g&&g<=50191||50193<=g&&g<=50219||50221<=g&&g<=50247||50249<=g&&g<=50275||50277<=g&&g<=50303||50305<=g&&g<=50331||50333<=g&&g<=50359||50361<=g&&g<=50387||50389<=g&&g<=50415||50417<=g&&g<=50443||50445<=g&&g<=50471||50473<=g&&g<=50499||50501<=g&&g<=50527||50529<=g&&g<=50555||50557<=g&&g<=50583||50585<=g&&g<=50611||50613<=g&&g<=50639||50641<=g&&g<=50667||50669<=g&&g<=50695||50697<=g&&g<=50723||50725<=g&&g<=50751||50753<=g&&g<=50779||50781<=g&&g<=50807||50809<=g&&g<=50835||50837<=g&&g<=50863||50865<=g&&g<=50891||50893<=g&&g<=50919||50921<=g&&g<=50947||50949<=g&&g<=50975||50977<=g&&g<=51003||51005<=g&&g<=51031||51033<=g&&g<=51059||51061<=g&&g<=51087||51089<=g&&g<=51115||51117<=g&&g<=51143||51145<=g&&g<=51171||51173<=g&&g<=51199||51201<=g&&g<=51227||51229<=g&&g<=51255||51257<=g&&g<=51283||51285<=g&&g<=51311||51313<=g&&g<=51339||51341<=g&&g<=51367||51369<=g&&g<=51395||51397<=g&&g<=51423||51425<=g&&g<=51451||51453<=g&&g<=51479||51481<=g&&g<=51507||51509<=g&&g<=51535||51537<=g&&g<=51563||51565<=g&&g<=51591||51593<=g&&g<=51619||51621<=g&&g<=51647||51649<=g&&g<=51675||51677<=g&&g<=51703||51705<=g&&g<=51731||51733<=g&&g<=51759||51761<=g&&g<=51787||51789<=g&&g<=51815||51817<=g&&g<=51843||51845<=g&&g<=51871||51873<=g&&g<=51899||51901<=g&&g<=51927||51929<=g&&g<=51955||51957<=g&&g<=51983||51985<=g&&g<=52011||52013<=g&&g<=52039||52041<=g&&g<=52067||52069<=g&&g<=52095||52097<=g&&g<=52123||52125<=g&&g<=52151||52153<=g&&g<=52179||52181<=g&&g<=52207||52209<=g&&g<=52235||52237<=g&&g<=52263||52265<=g&&g<=52291||52293<=g&&g<=52319||52321<=g&&g<=52347||52349<=g&&g<=52375||52377<=g&&g<=52403||52405<=g&&g<=52431||52433<=g&&g<=52459||52461<=g&&g<=52487||52489<=g&&g<=52515||52517<=g&&g<=52543||52545<=g&&g<=52571||52573<=g&&g<=52599||52601<=g&&g<=52627||52629<=g&&g<=52655||52657<=g&&g<=52683||52685<=g&&g<=52711||52713<=g&&g<=52739||52741<=g&&g<=52767||52769<=g&&g<=52795||52797<=g&&g<=52823||52825<=g&&g<=52851||52853<=g&&g<=52879||52881<=g&&g<=52907||52909<=g&&g<=52935||52937<=g&&g<=52963||52965<=g&&g<=52991||52993<=g&&g<=53019||53021<=g&&g<=53047||53049<=g&&g<=53075||53077<=g&&g<=53103||53105<=g&&g<=53131||53133<=g&&g<=53159||53161<=g&&g<=53187||53189<=g&&g<=53215||53217<=g&&g<=53243||53245<=g&&g<=53271||53273<=g&&g<=53299||53301<=g&&g<=53327||53329<=g&&g<=53355||53357<=g&&g<=53383||53385<=g&&g<=53411||53413<=g&&g<=53439||53441<=g&&g<=53467||53469<=g&&g<=53495||53497<=g&&g<=53523||53525<=g&&g<=53551||53553<=g&&g<=53579||53581<=g&&g<=53607||53609<=g&&g<=53635||53637<=g&&g<=53663||53665<=g&&g<=53691||53693<=g&&g<=53719||53721<=g&&g<=53747||53749<=g&&g<=53775||53777<=g&&g<=53803||53805<=g&&g<=53831||53833<=g&&g<=53859||53861<=g&&g<=53887||53889<=g&&g<=53915||53917<=g&&g<=53943||53945<=g&&g<=53971||53973<=g&&g<=53999||54001<=g&&g<=54027||54029<=g&&g<=54055||54057<=g&&g<=54083||54085<=g&&g<=54111||54113<=g&&g<=54139||54141<=g&&g<=54167||54169<=g&&g<=54195||54197<=g&&g<=54223||54225<=g&&g<=54251||54253<=g&&g<=54279||54281<=g&&g<=54307||54309<=g&&g<=54335||54337<=g&&g<=54363||54365<=g&&g<=54391||54393<=g&&g<=54419||54421<=g&&g<=54447||54449<=g&&g<=54475||54477<=g&&g<=54503||54505<=g&&g<=54531||54533<=g&&g<=54559||54561<=g&&g<=54587||54589<=g&&g<=54615||54617<=g&&g<=54643||54645<=g&&g<=54671||54673<=g&&g<=54699||54701<=g&&g<=54727||54729<=g&&g<=54755||54757<=g&&g<=54783||54785<=g&&g<=54811||54813<=g&&g<=54839||54841<=g&&g<=54867||54869<=g&&g<=54895||54897<=g&&g<=54923||54925<=g&&g<=54951||54953<=g&&g<=54979||54981<=g&&g<=55007||55009<=g&&g<=55035||55037<=g&&g<=55063||55065<=g&&g<=55091||55093<=g&&g<=55119||55121<=g&&g<=55147||55149<=g&&g<=55175||55177<=g&&g<=55203?E:g==9757||g==9977||9994<=g&&g<=9997||g==127877||127938<=g&&g<=127940||g==127943||127946<=g&&g<=127948||128066<=g&&g<=128067||128070<=g&&g<=128080||g==128110||128112<=g&&g<=128120||g==128124||128129<=g&&g<=128131||128133<=g&&g<=128135||g==128170||128372<=g&&g<=128373||g==128378||g==128400||128405<=g&&g<=128406||128581<=g&&g<=128583||128587<=g&&g<=128591||g==128675||128692<=g&&g<=128694||g==128704||g==128716||129304<=g&&g<=129308||129310<=g&&g<=129311||g==129318||129328<=g&&g<=129337||129341<=g&&g<=129342||129489<=g&&g<=129501?x:127995<=g&&g<=127999?C:g==8205?R:g==9792||g==9794||9877<=g&&g<=9878||g==9992||g==10084||g==127752||g==127806||g==127859||g==127891||g==127908||g==127912||g==127979||g==127981||g==128139||128187<=g&&g<=128188||g==128295||g==128300||g==128488||g==128640||g==128658?L:128102<=g&&g<=128105?U:I}return this}typeof kS<\"u\"&&kS.exports&&(kS.exports=yat)});var Kce=_((I4t,Wce)=>{var Eat=/^(.*?)(\\x1b\\[[^m]+m|\\x1b\\]8;;.*?(\\x1b\\\\|\\u0007))/,QS;function Cat(){if(QS)return QS;if(typeof Intl.Segmenter<\"u\"){let t=new Intl.Segmenter(\"en\",{granularity:\"grapheme\"});return QS=e=>Array.from(t.segment(e),({segment:r})=>r)}else{let t=Yce(),e=new t;return QS=r=>e.splitGraphemes(r)}}Wce.exports=(t,e=0,r=t.length)=>{if(e<0||r<0)throw new RangeError(\"Negative indices aren't supported by this implementation\");let o=r-e,a=\"\",n=0,u=0;for(;t.length>0;){let A=t.match(Eat)||[t,t,void 0],p=Cat()(A[1]),h=Math.min(e-n,p.length);p=p.slice(h);let E=Math.min(o-u,p.length);a+=p.slice(0,E).join(\"\"),n+=h,u+=E,typeof A[2]<\"u\"&&(a+=A[2]),t=t.slice(A[0].length)}return a}});var nn,w1=Et(()=>{nn=process.env.YARN_IS_TEST_ENV?\"0.0.0\":\"4.5.0\"});function $ce(t,{configuration:e,json:r}){if(!e.get(\"enableMessageNames\"))return\"\";let a=Ku(t===null?0:t);return!r&&t===null?Ot(e,a,\"grey\"):a}function AU(t,{configuration:e,json:r}){let o=$ce(t,{configuration:e,json:r});if(!o||t===null||t===0)return o;let a=wr[t],n=`https://yarnpkg.com/advanced/error-codes#${o}---${a}`.toLowerCase();return Tm(e,o,n)}async function uy({configuration:t,stdout:e,forceError:r},o){let a=await Rt.start({configuration:t,stdout:e,includeFooter:!1},async n=>{let u=!1,A=!1;for(let p of o)typeof p.option<\"u\"&&(p.error||r?(A=!0,n.reportError(50,p.message)):(u=!0,n.reportWarning(50,p.message)),p.callback?.());u&&!A&&n.reportSeparator()});return a.hasErrors()?a.exitCode():null}var Xce,RS,wat,Vce,zce,ch,Zce,Jce,Iat,Bat,TS,vat,Rt,I1=Et(()=>{Xce=Ze(Kce()),RS=Ze(X0());$D();Wl();w1();jl();wat=\"\\xB7\",Vce=[\"\\u280B\",\"\\u2819\",\"\\u2839\",\"\\u2838\",\"\\u283C\",\"\\u2834\",\"\\u2826\",\"\\u2827\",\"\\u2807\",\"\\u280F\"],zce=80,ch=RS.default.GITHUB_ACTIONS?{start:t=>`::group::${t}\n`,end:t=>`::endgroup::\n`}:RS.default.TRAVIS?{start:t=>`travis_fold:start:${t}\n`,end:t=>`travis_fold:end:${t}\n`}:RS.default.GITLAB?{start:t=>`section_start:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\\W+/g,\"_\")}[collapsed=true]\\r\\x1B[0K${t}\n`,end:t=>`section_end:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\\W+/g,\"_\")}\\r\\x1B[0K`}:null,Zce=ch!==null,Jce=new Date,Iat=[\"iTerm.app\",\"Apple_Terminal\",\"WarpTerminal\",\"vscode\"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,Bat=t=>t,TS=Bat({patrick:{date:[17,3],chars:[\"\\u{1F340}\",\"\\u{1F331}\"],size:40},simba:{date:[19,7],chars:[\"\\u{1F981}\",\"\\u{1F334}\"],size:40},jack:{date:[31,10],chars:[\"\\u{1F383}\",\"\\u{1F987}\"],size:40},hogsfather:{date:[31,12],chars:[\"\\u{1F389}\",\"\\u{1F384}\"],size:40},default:{chars:[\"=\",\"-\"],size:80}}),vat=Iat&&Object.keys(TS).find(t=>{let e=TS[t];return!(e.date&&(e.date[0]!==Jce.getDate()||e.date[1]!==Jce.getMonth()+1))})||\"default\";Rt=class extends Zs{constructor({configuration:r,stdout:o,json:a=!1,forceSectionAlignment:n=!1,includeNames:u=!0,includePrefix:A=!0,includeFooter:p=!0,includeLogs:h=!a,includeInfos:E=h,includeWarnings:I=h}){super();this.uncommitted=new Set;this.warningCount=0;this.errorCount=0;this.timerFooter=[];this.startTime=Date.now();this.indent=0;this.level=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;if(TI(this,{configuration:r}),this.configuration=r,this.forceSectionAlignment=n,this.includeNames=u,this.includePrefix=A,this.includeFooter=p,this.includeInfos=E,this.includeWarnings=I,this.json=a,this.stdout=o,r.get(\"enableProgressBars\")&&!a&&o.isTTY&&o.columns>22){let v=r.get(\"progressBarStyle\")||vat;if(!Object.hasOwn(TS,v))throw new Error(\"Assertion failed: Invalid progress bar style\");this.progressStyle=TS[v];let x=Math.min(this.getRecommendedLength(),80);this.progressMaxScaledSize=Math.floor(this.progressStyle.size*x/80)}}static async start(r,o){let a=new this(r),n=process.emitWarning;process.emitWarning=(u,A)=>{if(typeof u!=\"string\"){let h=u;u=h.message,A=A??h.name}let p=typeof A<\"u\"?`${A}: ${u}`:u;a.reportWarning(0,p)},r.includeVersion&&a.reportInfo(0,fg(r.configuration,`Yarn ${nn}`,2));try{await o(a)}catch(u){a.reportExceptionOnce(u)}finally{await a.finalize(),process.emitWarning=n}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}getRecommendedLength(){let o=this.progressStyle!==null?this.stdout.columns-1:super.getRecommendedLength();return Math.max(40,o-12-this.indent*2)}startSectionSync({reportHeader:r,reportFooter:o,skipIfEmpty:a},n){let u={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(u):(u.action(),u.committed=!0);let A=Date.now();try{return n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(u),u.committed&&o?.(p-A)}}async startSectionPromise({reportHeader:r,reportFooter:o,skipIfEmpty:a},n){let u={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(u):(u.action(),u.committed=!0);let A=Date.now();try{return await n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(u),u.committed&&o?.(p-A)}}startTimerImpl(r,o,a){return{cb:typeof o==\"function\"?o:a,reportHeader:()=>{this.level+=1,this.reportInfo(null,`\\u250C ${r}`),this.indent+=1,ch!==null&&!this.json&&this.includeInfos&&this.stdout.write(ch.start(r))},reportFooter:A=>{if(this.indent-=1,ch!==null&&!this.json&&this.includeInfos){this.stdout.write(ch.end(r));for(let p of this.timerFooter)p()}this.configuration.get(\"enableTimers\")&&A>200?this.reportInfo(null,`\\u2514 Completed in ${Ot(this.configuration,A,yt.DURATION)}`):this.reportInfo(null,\"\\u2514 Completed\"),this.level-=1},skipIfEmpty:(typeof o==\"function\"?{}:o).skipIfEmpty}}startTimerSync(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a);return this.startSectionSync(u,n)}async startTimerPromise(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a);return this.startSectionPromise(u,n)}reportSeparator(){this.indent===0?this.writeLine(\"\"):this.reportInfo(null,\"\")}reportInfo(r,o){if(!this.includeInfos)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:\"\",u=`${this.formatPrefix(n,\"blueBright\")}${o}`;this.json?this.reportJson({type:\"info\",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(u)}reportWarning(r,o){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:\"\";this.json?this.reportJson({type:\"warning\",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(`${this.formatPrefix(n,\"yellowBright\")}${o}`)}reportError(r,o){this.errorCount+=1,this.timerFooter.push(()=>this.reportErrorImpl(r,o)),this.reportErrorImpl(r,o)}reportErrorImpl(r,o){this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:\"\";this.json?this.reportJson({type:\"error\",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(`${this.formatPrefix(n,\"redBright\")}${o}`,{truncate:!1})}reportFold(r,o){if(!ch)return;let a=`${ch.start(r)}${o}${ch.end(r)}`;this.timerFooter.push(()=>this.stdout.write(a))}reportProgress(r){if(this.progressStyle===null)return{...Promise.resolve(),stop:()=>{}};if(r.hasProgress&&r.hasTitle)throw new Error(\"Unimplemented: Progress bars can't have both progress and titles.\");let o=!1,a=Promise.resolve().then(async()=>{let u={progress:r.hasProgress?0:void 0,title:r.hasTitle?\"\":void 0};this.progress.set(r,{definition:u,lastScaledSize:r.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:A,title:p}of r)o||u.progress===A&&u.title===p||(u.progress=A,u.title=p,this.refreshProgress());n()}),n=()=>{o||(o=!0,this.progress.delete(r),this.refreshProgress({delta:1}))};return{...a,stop:n}}reportJson(r){this.json&&this.writeLine(`${JSON.stringify(r)}`)}async finalize(){if(!this.includeFooter)return;let r=\"\";this.errorCount>0?r=\"Failed with errors\":this.warningCount>0?r=\"Done with warnings\":r=\"Done\";let o=Ot(this.configuration,Date.now()-this.startTime,yt.DURATION),a=this.configuration.get(\"enableTimers\")?`${r} in ${o}`:r;this.errorCount>0?this.reportError(0,a):this.warningCount>0?this.reportWarning(0,a):this.reportInfo(0,a)}writeLine(r,{truncate:o}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(r,{truncate:o})}\n`),this.writeProgress()}writeLines(r,{truncate:o}={}){this.clearProgress({delta:r.length});for(let a of r)this.stdout.write(`${this.truncate(a,{truncate:o})}\n`);this.writeProgress()}commit(){let r=this.uncommitted;this.uncommitted=new Set;for(let o of r)o.committed=!0,o.action()}clearProgress({delta:r=0,clear:o=!1}){this.progressStyle!==null&&this.progress.size+r>0&&(this.stdout.write(`\\x1B[${this.progress.size+r}A`),(r>0||o)&&this.stdout.write(\"\\x1B[0J\"))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let r=Date.now();r-this.progressTime>zce&&(this.progressFrame=(this.progressFrame+1)%Vce.length,this.progressTime=r);let o=Vce[this.progressFrame];for(let a of this.progress.values()){let n=\"\";if(typeof a.lastScaledSize<\"u\"){let h=this.progressStyle.chars[0].repeat(a.lastScaledSize),E=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-a.lastScaledSize);n=` ${h}${E}`}let u=this.formatName(null),A=u?`${u}: `:\"\",p=a.definition.title?` ${a.definition.title}`:\"\";this.stdout.write(`${Ot(this.configuration,\"\\u27A4\",\"blueBright\")} ${A}${o}${n}${p}\n`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},zce)}refreshProgress({delta:r=0,force:o=!1}={}){let a=!1,n=!1;if(o||this.progress.size===0)a=!0;else for(let u of this.progress.values()){let A=typeof u.definition.progress<\"u\"?Math.trunc(this.progressMaxScaledSize*u.definition.progress):void 0,p=u.lastScaledSize;u.lastScaledSize=A;let h=u.lastTitle;if(u.lastTitle=u.definition.title,A!==p||(n=h!==u.definition.title)){a=!0;break}}a&&(this.clearProgress({delta:r,clear:n}),this.writeProgress())}truncate(r,{truncate:o}={}){return this.progressStyle===null&&(o=!1),typeof o>\"u\"&&(o=this.configuration.get(\"preferTruncatedLines\")),o&&(r=(0,Xce.default)(r,0,this.stdout.columns-1)),r}formatName(r){return this.includeNames?$ce(r,{configuration:this.configuration,json:this.json}):\"\"}formatPrefix(r,o){return this.includePrefix?`${Ot(this.configuration,\"\\u27A4\",o)} ${r}${this.formatIndent()}`:\"\"}formatNameWithHyperlink(r){return this.includeNames?AU(r,{configuration:this.configuration,json:this.json}):\"\"}formatIndent(){return this.level>0||!this.forceSectionAlignment?\"\\u2502 \".repeat(this.indent):`${wat} `}}});var An={};Vt(An,{PackageManager:()=>rue,detectPackageManager:()=>nue,executePackageAccessibleBinary:()=>lue,executePackageScript:()=>NS,executePackageShellcode:()=>fU,executeWorkspaceAccessibleBinary:()=>Qat,executeWorkspaceLifecycleScript:()=>oue,executeWorkspaceScript:()=>sue,getPackageAccessibleBinaries:()=>LS,getWorkspaceAccessibleBinaries:()=>aue,hasPackageScript:()=>Sat,hasWorkspaceScript:()=>pU,isNodeScript:()=>hU,makeScriptEnv:()=>B1,maybeExecuteWorkspaceLifecycleScript:()=>kat,prepareExternalProject:()=>bat});async function uh(t,e,r,o=[]){if(process.platform===\"win32\"){let a=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @\"${r}\" ${o.map(n=>`\"${n.replace('\"','\"\"')}\"`).join(\" \")} %*`;await oe.writeFilePromise(V.format({dir:t,name:e,ext:\".cmd\"}),a)}await oe.writeFilePromise(V.join(t,e),`#!/bin/sh\nexec \"${r}\" ${o.map(a=>`'${a.replace(/'/g,`'\"'\"'`)}'`).join(\" \")} \"$@\"\n`,{mode:493})}async function nue(t){let e=await Ut.tryFind(t);if(e?.packageManager){let o=Pb(e.packageManager);if(o?.name){let a=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[n]=o.reference.split(\".\");switch(o.name){case\"yarn\":return{packageManagerField:!0,packageManager:Number(n)===1?\"Yarn Classic\":\"Yarn\",reason:a};case\"npm\":return{packageManagerField:!0,packageManager:\"npm\",reason:a};case\"pnpm\":return{packageManagerField:!0,packageManager:\"pnpm\",reason:a}}}}let r;try{r=await oe.readFilePromise(V.join(t,dr.lockfile),\"utf8\")}catch{}return r!==void 0?r.match(/^__metadata:$/m)?{packageManager:\"Yarn\",reason:'\"__metadata\" key found in yarn.lock'}:{packageManager:\"Yarn Classic\",reason:'\"__metadata\" key not found in yarn.lock, must be a Yarn classic lockfile'}:oe.existsSync(V.join(t,\"package-lock.json\"))?{packageManager:\"npm\",reason:`found npm's \"package-lock.json\" lockfile`}:oe.existsSync(V.join(t,\"pnpm-lock.yaml\"))?{packageManager:\"pnpm\",reason:`found pnpm's \"pnpm-lock.yaml\" lockfile`}:null}async function B1({project:t,locator:e,binFolder:r,ignoreCorepack:o,lifecycleScript:a,baseEnv:n=t?.configuration.env??process.env}){let u={};for(let[E,I]of Object.entries(n))typeof I<\"u\"&&(u[E.toLowerCase()!==\"path\"?E:\"PATH\"]=I);let A=ue.fromPortablePath(r);u.BERRY_BIN_FOLDER=ue.fromPortablePath(A);let p=process.env.COREPACK_ROOT&&!o?ue.join(process.env.COREPACK_ROOT,\"dist/yarn.js\"):process.argv[1];if(await Promise.all([uh(r,\"node\",process.execPath),...nn!==null?[uh(r,\"run\",process.execPath,[p,\"run\"]),uh(r,\"yarn\",process.execPath,[p]),uh(r,\"yarnpkg\",process.execPath,[p]),uh(r,\"node-gyp\",process.execPath,[p,\"run\",\"--top-level\",\"node-gyp\"])]:[]]),t&&(u.INIT_CWD=ue.fromPortablePath(t.configuration.startingCwd),u.PROJECT_CWD=ue.fromPortablePath(t.cwd)),u.PATH=u.PATH?`${A}${ue.delimiter}${u.PATH}`:`${A}`,u.npm_execpath=`${A}${ue.sep}yarn`,u.npm_node_execpath=`${A}${ue.sep}node`,e){if(!t)throw new Error(\"Assertion failed: Missing project\");let E=t.tryWorkspaceByLocator(e),I=E?E.manifest.version??\"\":t.storedPackages.get(e.locatorHash).version??\"\";u.npm_package_name=rn(e),u.npm_package_version=I;let v;if(E)v=E.cwd;else{let x=t.storedPackages.get(e.locatorHash);if(!x)throw new Error(`Package for ${qr(t.configuration,e)} not found in the project`);let C=t.configuration.getLinkers(),R={project:t,report:new Rt({stdout:new Ah.PassThrough,configuration:t.configuration})},L=C.find(U=>U.supportsPackage(x,R));if(!L)throw new Error(`The package ${qr(t.configuration,x)} isn't supported by any of the available linkers`);v=await L.findPackageLocation(x,R)}u.npm_package_json=ue.fromPortablePath(V.join(v,dr.manifest))}let h=nn!==null?`yarn/${nn}`:`yarn/${vf(\"@yarnpkg/core\").version}-core`;return u.npm_config_user_agent=`${h} npm/? node/${process.version} ${process.platform} ${process.arch}`,a&&(u.npm_lifecycle_event=a),t&&await t.configuration.triggerHook(E=>E.setupScriptEnvironment,t,u,async(E,I,v)=>await uh(r,E,I,v)),u}async function bat(t,e,{configuration:r,report:o,workspace:a=null,locator:n=null}){await Pat(async()=>{await oe.mktempPromise(async u=>{let A=V.join(u,\"pack.log\"),p=null,{stdout:h,stderr:E}=r.getSubprocessStreams(A,{prefix:ue.fromPortablePath(t),report:o}),I=n&&Gc(n)?_I(n):n,v=I?ka(I):\"an external project\";h.write(`Packing ${v} from sources\n`);let x=await nue(t),C;x!==null?(h.write(`Using ${x.packageManager} for bootstrap. Reason: ${x.reason}\n\n`),C=x.packageManager):(h.write(`No package manager configuration detected; defaulting to Yarn\n\n`),C=\"Yarn\");let R=C===\"Yarn\"&&!x?.packageManagerField;await oe.mktempPromise(async L=>{let U=await B1({binFolder:L,ignoreCorepack:R}),te=new Map([[\"Yarn Classic\",async()=>{let le=a!==null?[\"workspace\",a]:[],ce=V.join(t,dr.manifest),Ce=await oe.readFilePromise(ce),de=await Wc(process.execPath,[process.argv[1],\"set\",\"version\",\"classic\",\"--only-if-needed\",\"--yarn-path\"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(de.code!==0)return de.code;await oe.writeFilePromise(ce,Ce),await oe.appendFilePromise(V.join(t,\".npmignore\"),`/.yarn\n`),h.write(`\n`),delete U.NODE_ENV;let Be=await Wc(\"yarn\",[\"install\"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(Be.code!==0)return Be.code;h.write(`\n`);let Ee=await Wc(\"yarn\",[...le,\"pack\",\"--filename\",ue.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return Ee.code!==0?Ee.code:0}],[\"Yarn\",async()=>{let le=a!==null?[\"workspace\",a]:[];U.YARN_ENABLE_INLINE_BUILDS=\"1\";let ce=V.join(t,dr.lockfile);await oe.existsPromise(ce)||await oe.writeFilePromise(ce,\"\");let Ce=await Wc(\"yarn\",[...le,\"pack\",\"--install-if-needed\",\"--filename\",ue.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return Ce.code!==0?Ce.code:0}],[\"npm\",async()=>{if(a!==null){let me=new Ah.PassThrough,we=km(me);me.pipe(h,{end:!1});let Ae=await Wc(\"npm\",[\"--version\"],{cwd:t,env:U,stdin:p,stdout:me,stderr:E,end:0});if(me.end(),Ae.code!==0)return h.end(),E.end(),Ae.code;let ne=(await we).toString().trim();if(!tA(ne,\">=7.x\")){let Z=eA(null,\"npm\"),xe=In(Z,ne),Ne=In(Z,\">=7.x\");throw new Error(`Workspaces aren't supported by ${jn(r,xe)}; please upgrade to ${jn(r,Ne)} (npm has been detected as the primary package manager for ${Ot(r,t,yt.PATH)})`)}}let le=a!==null?[\"--workspace\",a]:[];delete U.npm_config_user_agent,delete U.npm_config_production,delete U.NPM_CONFIG_PRODUCTION,delete U.NODE_ENV;let ce=await Wc(\"npm\",[\"install\",\"--legacy-peer-deps\"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(ce.code!==0)return ce.code;let Ce=new Ah.PassThrough,de=km(Ce);Ce.pipe(h);let Be=await Wc(\"npm\",[\"pack\",\"--silent\",...le],{cwd:t,env:U,stdin:p,stdout:Ce,stderr:E});if(Be.code!==0)return Be.code;let Ee=(await de).toString().trim().replace(/^.*\\n/s,\"\"),g=V.resolve(t,ue.toPortablePath(Ee));return await oe.renamePromise(g,e),0}]]).get(C);if(typeof te>\"u\")throw new Error(\"Assertion failed: Unsupported workflow\");let ae=await te();if(!(ae===0||typeof ae>\"u\"))throw oe.detachTemp(u),new Jt(58,`Packing the package failed (exit code ${ae}, logs can be found here: ${Ot(r,A,yt.PATH)})`)})})})}async function Sat(t,e,{project:r}){let o=r.tryWorkspaceByLocator(t);if(o!==null)return pU(o,e);let a=r.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${qr(r.configuration,t)} not found in the project`);return await rA.openPromise(async n=>{let u=r.configuration,A=r.configuration.getLinkers(),p={project:r,report:new Rt({stdout:new Ah.PassThrough,configuration:u})},h=A.find(x=>x.supportsPackage(a,p));if(!h)throw new Error(`The package ${qr(r.configuration,a)} isn't supported by any of the available linkers`);let E=await h.findPackageLocation(a,p),I=new gn(E,{baseFs:n});return(await Ut.find(It.dot,{baseFs:I})).scripts.has(e)})}async function NS(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){return await oe.mktempPromise(async p=>{let{manifest:h,env:E,cwd:I}=await iue(t,{project:a,binFolder:p,cwd:o,lifecycleScript:e}),v=h.scripts.get(e);if(typeof v>\"u\")return 1;let x=async()=>await cy(v,r,{cwd:I,env:E,stdin:n,stdout:u,stderr:A});return await(await a.configuration.reduceHook(R=>R.wrapScriptExecution,x,a,t,e,{script:v,args:r,cwd:I,env:E,stdin:n,stdout:u,stderr:A}))()})}async function fU(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){return await oe.mktempPromise(async p=>{let{env:h,cwd:E}=await iue(t,{project:a,binFolder:p,cwd:o});return await cy(e,r,{cwd:E,env:h,stdin:n,stdout:u,stderr:A})})}async function xat(t,{binFolder:e,cwd:r,lifecycleScript:o}){let a=await B1({project:t.project,locator:t.anchoredLocator,binFolder:e,lifecycleScript:o});return await gU(e,await aue(t)),typeof r>\"u\"&&(r=V.dirname(await oe.realpathPromise(V.join(t.cwd,\"package.json\")))),{manifest:t.manifest,binFolder:e,env:a,cwd:r}}async function iue(t,{project:e,binFolder:r,cwd:o,lifecycleScript:a}){let n=e.tryWorkspaceByLocator(t);if(n!==null)return xat(n,{binFolder:r,cwd:o,lifecycleScript:a});let u=e.storedPackages.get(t.locatorHash);if(!u)throw new Error(`Package for ${qr(e.configuration,t)} not found in the project`);return await rA.openPromise(async A=>{let p=e.configuration,h=e.configuration.getLinkers(),E={project:e,report:new Rt({stdout:new Ah.PassThrough,configuration:p})},I=h.find(L=>L.supportsPackage(u,E));if(!I)throw new Error(`The package ${qr(e.configuration,u)} isn't supported by any of the available linkers`);let v=await B1({project:e,locator:t,binFolder:r,lifecycleScript:a});await gU(r,await LS(t,{project:e}));let x=await I.findPackageLocation(u,E),C=new gn(x,{baseFs:A}),R=await Ut.find(It.dot,{baseFs:C});return typeof o>\"u\"&&(o=x),{manifest:R,binFolder:r,env:v,cwd:o}})}async function sue(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u}){return await NS(t.anchoredLocator,e,r,{cwd:o,project:t.project,stdin:a,stdout:n,stderr:u})}function pU(t,e){return t.manifest.scripts.has(e)}async function oue(t,e,{cwd:r,report:o}){let{configuration:a}=t.project,n=null;await oe.mktempPromise(async u=>{let A=V.join(u,`${e}.log`),p=`# This file contains the result of Yarn calling the \"${e}\" lifecycle script inside a workspace (\"${ue.fromPortablePath(t.cwd)}\")\n`,{stdout:h,stderr:E}=a.getSubprocessStreams(A,{report:o,prefix:qr(a,t.anchoredLocator),header:p});o.reportInfo(36,`Calling the \"${e}\" lifecycle script`);let I=await sue(t,e,[],{cwd:r,stdin:n,stdout:h,stderr:E});if(h.end(),E.end(),I!==0)throw oe.detachTemp(u),new Jt(36,`${(0,eue.default)(e)} script failed (exit code ${Ot(a,I,yt.NUMBER)}, logs can be found here: ${Ot(a,A,yt.PATH)}); run ${Ot(a,`yarn ${e}`,yt.CODE)} to investigate`)})}async function kat(t,e,r){pU(t,e)&&await oue(t,e,r)}function hU(t){let e=V.extname(t);if(e.match(/\\.[cm]?[jt]sx?$/))return!0;if(e===\".exe\"||e===\".bin\")return!1;let r=Buffer.alloc(4),o;try{o=oe.openSync(t,\"r\")}catch{return!0}try{oe.readSync(o,r,0,r.length,0)}finally{oe.closeSync(o)}let a=r.readUint32BE();return!(a===3405691582||a===3489328638||a===2135247942||(a&4294901760)===1297743872)}async function LS(t,{project:e}){let r=e.configuration,o=new Map,a=e.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${qr(r,t)} not found in the project`);let n=new Ah.Writable,u=r.getLinkers(),A={project:e,report:new Rt({configuration:r,stdout:n})},p=new Set([t.locatorHash]);for(let E of a.dependencies.values()){let I=e.storedResolutions.get(E.descriptorHash);if(!I)throw new Error(`Assertion failed: The resolution (${jn(r,E)}) should have been registered`);p.add(I)}let h=await Promise.all(Array.from(p,async E=>{let I=e.storedPackages.get(E);if(!I)throw new Error(`Assertion failed: The package (${E}) should have been registered`);if(I.bin.size===0)return ol.skip;let v=u.find(C=>C.supportsPackage(I,A));if(!v)return ol.skip;let x=null;try{x=await v.findPackageLocation(I,A)}catch(C){if(C.code===\"LOCATOR_NOT_INSTALLED\")return ol.skip;throw C}return{dependency:I,packageLocation:x}}));for(let E of h){if(E===ol.skip)continue;let{dependency:I,packageLocation:v}=E;for(let[x,C]of I.bin){let R=V.resolve(v,C);o.set(x,[I,ue.fromPortablePath(R),hU(R)])}}return o}async function aue(t){return await LS(t.anchoredLocator,{project:t.project})}async function gU(t,e){await Promise.all(Array.from(e,([r,[,o,a]])=>a?uh(t,r,process.execPath,[o]):uh(t,r,o,[])))}async function lue(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A,nodeArgs:p=[],packageAccessibleBinaries:h}){h??=await LS(t,{project:a});let E=h.get(e);if(!E)throw new Error(`Binary not found (${e}) for ${qr(a.configuration,t)}`);return await oe.mktempPromise(async I=>{let[,v]=E,x=await B1({project:a,locator:t,binFolder:I});await gU(x.BERRY_BIN_FOLDER,h);let C=hU(ue.toPortablePath(v))?Wc(process.execPath,[...p,v,...r],{cwd:o,env:x,stdin:n,stdout:u,stderr:A}):Wc(v,r,{cwd:o,env:x,stdin:n,stdout:u,stderr:A}),R;try{R=await C}finally{await oe.removePromise(x.BERRY_BIN_FOLDER)}return R.code})}async function Qat(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u,packageAccessibleBinaries:A}){return await lue(t.anchoredLocator,e,r,{project:t.project,cwd:o,stdin:a,stdout:n,stderr:u,packageAccessibleBinaries:A})}var eue,tue,Ah,rue,Dat,Pat,dU=Et(()=>{Pt();Pt();nA();g1();eue=Ze(uU()),tue=Ze(eg()),Ah=ve(\"stream\");Gm();Wl();I1();w1();pS();jl();ql();xf();So();rue=(a=>(a.Yarn1=\"Yarn Classic\",a.Yarn2=\"Yarn\",a.Npm=\"npm\",a.Pnpm=\"pnpm\",a))(rue||{});Dat=2,Pat=(0,tue.default)(Dat)});var Ay=_((j4t,uue)=>{\"use strict\";var cue=new Map([[\"C\",\"cwd\"],[\"f\",\"file\"],[\"z\",\"gzip\"],[\"P\",\"preservePaths\"],[\"U\",\"unlink\"],[\"strip-components\",\"strip\"],[\"stripComponents\",\"strip\"],[\"keep-newer\",\"newer\"],[\"keepNewer\",\"newer\"],[\"keep-newer-files\",\"newer\"],[\"keepNewerFiles\",\"newer\"],[\"k\",\"keep\"],[\"keep-existing\",\"keep\"],[\"keepExisting\",\"keep\"],[\"m\",\"noMtime\"],[\"no-mtime\",\"noMtime\"],[\"p\",\"preserveOwner\"],[\"L\",\"follow\"],[\"h\",\"follow\"]]);uue.exports=t=>t?Object.keys(t).map(e=>[cue.has(e)?cue.get(e):e,t[e]]).reduce((e,r)=>(e[r[0]]=r[1],e),Object.create(null)):{}});var py=_((G4t,Eue)=>{\"use strict\";var Aue=typeof process==\"object\"&&process?process:{stdout:null,stderr:null},Fat=ve(\"events\"),fue=ve(\"stream\"),pue=ve(\"string_decoder\").StringDecoder,Lf=Symbol(\"EOF\"),Mf=Symbol(\"maybeEmitEnd\"),fh=Symbol(\"emittedEnd\"),MS=Symbol(\"emittingEnd\"),v1=Symbol(\"emittedError\"),OS=Symbol(\"closed\"),hue=Symbol(\"read\"),US=Symbol(\"flush\"),gue=Symbol(\"flushChunk\"),Fa=Symbol(\"encoding\"),Of=Symbol(\"decoder\"),_S=Symbol(\"flowing\"),D1=Symbol(\"paused\"),fy=Symbol(\"resume\"),Ts=Symbol(\"bufferLength\"),mU=Symbol(\"bufferPush\"),yU=Symbol(\"bufferShift\"),Fo=Symbol(\"objectMode\"),Ro=Symbol(\"destroyed\"),EU=Symbol(\"emitData\"),due=Symbol(\"emitEnd\"),CU=Symbol(\"emitEnd2\"),Uf=Symbol(\"async\"),P1=t=>Promise.resolve().then(t),mue=global._MP_NO_ITERATOR_SYMBOLS_!==\"1\",Rat=mue&&Symbol.asyncIterator||Symbol(\"asyncIterator not implemented\"),Tat=mue&&Symbol.iterator||Symbol(\"iterator not implemented\"),Nat=t=>t===\"end\"||t===\"finish\"||t===\"prefinish\",Lat=t=>t instanceof ArrayBuffer||typeof t==\"object\"&&t.constructor&&t.constructor.name===\"ArrayBuffer\"&&t.byteLength>=0,Mat=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t),HS=class{constructor(e,r,o){this.src=e,this.dest=r,this.opts=o,this.ondrain=()=>e[fy](),r.on(\"drain\",this.ondrain)}unpipe(){this.dest.removeListener(\"drain\",this.ondrain)}proxyErrors(){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},wU=class extends HS{unpipe(){this.src.removeListener(\"error\",this.proxyErrors),super.unpipe()}constructor(e,r,o){super(e,r,o),this.proxyErrors=a=>r.emit(\"error\",a),e.on(\"error\",this.proxyErrors)}};Eue.exports=class yue extends fue{constructor(e){super(),this[_S]=!1,this[D1]=!1,this.pipes=[],this.buffer=[],this[Fo]=e&&e.objectMode||!1,this[Fo]?this[Fa]=null:this[Fa]=e&&e.encoding||null,this[Fa]===\"buffer\"&&(this[Fa]=null),this[Uf]=e&&!!e.async||!1,this[Of]=this[Fa]?new pue(this[Fa]):null,this[Lf]=!1,this[fh]=!1,this[MS]=!1,this[OS]=!1,this[v1]=null,this.writable=!0,this.readable=!0,this[Ts]=0,this[Ro]=!1}get bufferLength(){return this[Ts]}get encoding(){return this[Fa]}set encoding(e){if(this[Fo])throw new Error(\"cannot set encoding in objectMode\");if(this[Fa]&&e!==this[Fa]&&(this[Of]&&this[Of].lastNeed||this[Ts]))throw new Error(\"cannot change encoding\");this[Fa]!==e&&(this[Of]=e?new pue(e):null,this.buffer.length&&(this.buffer=this.buffer.map(r=>this[Of].write(r)))),this[Fa]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[Fo]}set objectMode(e){this[Fo]=this[Fo]||!!e}get async(){return this[Uf]}set async(e){this[Uf]=this[Uf]||!!e}write(e,r,o){if(this[Lf])throw new Error(\"write after end\");if(this[Ro])return this.emit(\"error\",Object.assign(new Error(\"Cannot call write after a stream was destroyed\"),{code:\"ERR_STREAM_DESTROYED\"})),!0;typeof r==\"function\"&&(o=r,r=\"utf8\"),r||(r=\"utf8\");let a=this[Uf]?P1:n=>n();return!this[Fo]&&!Buffer.isBuffer(e)&&(Mat(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):Lat(e)?e=Buffer.from(e):typeof e!=\"string\"&&(this.objectMode=!0)),this[Fo]?(this.flowing&&this[Ts]!==0&&this[US](!0),this.flowing?this.emit(\"data\",e):this[mU](e),this[Ts]!==0&&this.emit(\"readable\"),o&&a(o),this.flowing):e.length?(typeof e==\"string\"&&!(r===this[Fa]&&!this[Of].lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[Fa]&&(e=this[Of].write(e)),this.flowing&&this[Ts]!==0&&this[US](!0),this.flowing?this.emit(\"data\",e):this[mU](e),this[Ts]!==0&&this.emit(\"readable\"),o&&a(o),this.flowing):(this[Ts]!==0&&this.emit(\"readable\"),o&&a(o),this.flowing)}read(e){if(this[Ro])return null;if(this[Ts]===0||e===0||e>this[Ts])return this[Mf](),null;this[Fo]&&(e=null),this.buffer.length>1&&!this[Fo]&&(this.encoding?this.buffer=[this.buffer.join(\"\")]:this.buffer=[Buffer.concat(this.buffer,this[Ts])]);let r=this[hue](e||null,this.buffer[0]);return this[Mf](),r}[hue](e,r){return e===r.length||e===null?this[yU]():(this.buffer[0]=r.slice(e),r=r.slice(0,e),this[Ts]-=e),this.emit(\"data\",r),!this.buffer.length&&!this[Lf]&&this.emit(\"drain\"),r}end(e,r,o){return typeof e==\"function\"&&(o=e,e=null),typeof r==\"function\"&&(o=r,r=\"utf8\"),e&&this.write(e,r),o&&this.once(\"end\",o),this[Lf]=!0,this.writable=!1,(this.flowing||!this[D1])&&this[Mf](),this}[fy](){this[Ro]||(this[D1]=!1,this[_S]=!0,this.emit(\"resume\"),this.buffer.length?this[US]():this[Lf]?this[Mf]():this.emit(\"drain\"))}resume(){return this[fy]()}pause(){this[_S]=!1,this[D1]=!0}get destroyed(){return this[Ro]}get flowing(){return this[_S]}get paused(){return this[D1]}[mU](e){this[Fo]?this[Ts]+=1:this[Ts]+=e.length,this.buffer.push(e)}[yU](){return this.buffer.length&&(this[Fo]?this[Ts]-=1:this[Ts]-=this.buffer[0].length),this.buffer.shift()}[US](e){do;while(this[gue](this[yU]()));!e&&!this.buffer.length&&!this[Lf]&&this.emit(\"drain\")}[gue](e){return e?(this.emit(\"data\",e),this.flowing):!1}pipe(e,r){if(this[Ro])return;let o=this[fh];return r=r||{},e===Aue.stdout||e===Aue.stderr?r.end=!1:r.end=r.end!==!1,r.proxyErrors=!!r.proxyErrors,o?r.end&&e.end():(this.pipes.push(r.proxyErrors?new wU(this,e,r):new HS(this,e,r)),this[Uf]?P1(()=>this[fy]()):this[fy]()),e}unpipe(e){let r=this.pipes.find(o=>o.dest===e);r&&(this.pipes.splice(this.pipes.indexOf(r),1),r.unpipe())}addListener(e,r){return this.on(e,r)}on(e,r){let o=super.on(e,r);return e===\"data\"&&!this.pipes.length&&!this.flowing?this[fy]():e===\"readable\"&&this[Ts]!==0?super.emit(\"readable\"):Nat(e)&&this[fh]?(super.emit(e),this.removeAllListeners(e)):e===\"error\"&&this[v1]&&(this[Uf]?P1(()=>r.call(this,this[v1])):r.call(this,this[v1])),o}get emittedEnd(){return this[fh]}[Mf](){!this[MS]&&!this[fh]&&!this[Ro]&&this.buffer.length===0&&this[Lf]&&(this[MS]=!0,this.emit(\"end\"),this.emit(\"prefinish\"),this.emit(\"finish\"),this[OS]&&this.emit(\"close\"),this[MS]=!1)}emit(e,r,...o){if(e!==\"error\"&&e!==\"close\"&&e!==Ro&&this[Ro])return;if(e===\"data\")return r?this[Uf]?P1(()=>this[EU](r)):this[EU](r):!1;if(e===\"end\")return this[due]();if(e===\"close\"){if(this[OS]=!0,!this[fh]&&!this[Ro])return;let n=super.emit(\"close\");return this.removeAllListeners(\"close\"),n}else if(e===\"error\"){this[v1]=r;let n=super.emit(\"error\",r);return this[Mf](),n}else if(e===\"resume\"){let n=super.emit(\"resume\");return this[Mf](),n}else if(e===\"finish\"||e===\"prefinish\"){let n=super.emit(e);return this.removeAllListeners(e),n}let a=super.emit(e,r,...o);return this[Mf](),a}[EU](e){for(let o of this.pipes)o.dest.write(e)===!1&&this.pause();let r=super.emit(\"data\",e);return this[Mf](),r}[due](){this[fh]||(this[fh]=!0,this.readable=!1,this[Uf]?P1(()=>this[CU]()):this[CU]())}[CU](){if(this[Of]){let r=this[Of].end();if(r){for(let o of this.pipes)o.dest.write(r);super.emit(\"data\",r)}}for(let r of this.pipes)r.end();let e=super.emit(\"end\");return this.removeAllListeners(\"end\"),e}collect(){let e=[];this[Fo]||(e.dataLength=0);let r=this.promise();return this.on(\"data\",o=>{e.push(o),this[Fo]||(e.dataLength+=o.length)}),r.then(()=>e)}concat(){return this[Fo]?Promise.reject(new Error(\"cannot concat in objectMode\")):this.collect().then(e=>this[Fo]?Promise.reject(new Error(\"cannot concat in objectMode\")):this[Fa]?e.join(\"\"):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,r)=>{this.on(Ro,()=>r(new Error(\"stream destroyed\"))),this.on(\"error\",o=>r(o)),this.on(\"end\",()=>e())})}[Rat](){return{next:()=>{let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[Lf])return Promise.resolve({done:!0});let o=null,a=null,n=h=>{this.removeListener(\"data\",u),this.removeListener(\"end\",A),a(h)},u=h=>{this.removeListener(\"error\",n),this.removeListener(\"end\",A),this.pause(),o({value:h,done:!!this[Lf]})},A=()=>{this.removeListener(\"error\",n),this.removeListener(\"data\",u),o({done:!0})},p=()=>n(new Error(\"stream destroyed\"));return new Promise((h,E)=>{a=E,o=h,this.once(Ro,p),this.once(\"error\",n),this.once(\"end\",A),this.once(\"data\",u)})}}}[Tat](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}destroy(e){return this[Ro]?(e?this.emit(\"error\",e):this.emit(Ro),this):(this[Ro]=!0,this.buffer.length=0,this[Ts]=0,typeof this.close==\"function\"&&!this[OS]&&this.close(),e?this.emit(\"error\",e):this.emit(Ro),this)}static isStream(e){return!!e&&(e instanceof yue||e instanceof fue||e instanceof Fat&&(typeof e.pipe==\"function\"||typeof e.write==\"function\"&&typeof e.end==\"function\"))}}});var wue=_((Y4t,Cue)=>{var Oat=ve(\"zlib\").constants||{ZLIB_VERNUM:4736};Cue.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},Oat))});var MU=_(ul=>{\"use strict\";var PU=ve(\"assert\"),ph=ve(\"buffer\").Buffer,vue=ve(\"zlib\"),Pg=ul.constants=wue(),Uat=py(),Iue=ph.concat,bg=Symbol(\"_superWrite\"),gy=class extends Error{constructor(e){super(\"zlib: \"+e.message),this.code=e.code,this.errno=e.errno,this.code||(this.code=\"ZLIB_ERROR\"),this.message=\"zlib: \"+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return\"ZlibError\"}},_at=Symbol(\"opts\"),b1=Symbol(\"flushFlag\"),Bue=Symbol(\"finishFlushFlag\"),LU=Symbol(\"fullFlushFlag\"),ti=Symbol(\"handle\"),qS=Symbol(\"onError\"),hy=Symbol(\"sawError\"),IU=Symbol(\"level\"),BU=Symbol(\"strategy\"),vU=Symbol(\"ended\"),W4t=Symbol(\"_defaultFullFlush\"),jS=class extends Uat{constructor(e,r){if(!e||typeof e!=\"object\")throw new TypeError(\"invalid options for ZlibBase constructor\");super(e),this[hy]=!1,this[vU]=!1,this[_at]=e,this[b1]=e.flush,this[Bue]=e.finishFlush;try{this[ti]=new vue[r](e)}catch(o){throw new gy(o)}this[qS]=o=>{this[hy]||(this[hy]=!0,this.close(),this.emit(\"error\",o))},this[ti].on(\"error\",o=>this[qS](new gy(o))),this.once(\"end\",()=>this.close)}close(){this[ti]&&(this[ti].close(),this[ti]=null,this.emit(\"close\"))}reset(){if(!this[hy])return PU(this[ti],\"zlib binding closed\"),this[ti].reset()}flush(e){this.ended||(typeof e!=\"number\"&&(e=this[LU]),this.write(Object.assign(ph.alloc(0),{[b1]:e})))}end(e,r,o){return e&&this.write(e,r),this.flush(this[Bue]),this[vU]=!0,super.end(null,null,o)}get ended(){return this[vU]}write(e,r,o){if(typeof r==\"function\"&&(o=r,r=\"utf8\"),typeof e==\"string\"&&(e=ph.from(e,r)),this[hy])return;PU(this[ti],\"zlib binding closed\");let a=this[ti]._handle,n=a.close;a.close=()=>{};let u=this[ti].close;this[ti].close=()=>{},ph.concat=h=>h;let A;try{let h=typeof e[b1]==\"number\"?e[b1]:this[b1];A=this[ti]._processChunk(e,h),ph.concat=Iue}catch(h){ph.concat=Iue,this[qS](new gy(h))}finally{this[ti]&&(this[ti]._handle=a,a.close=n,this[ti].close=u,this[ti].removeAllListeners(\"error\"))}this[ti]&&this[ti].on(\"error\",h=>this[qS](new gy(h)));let p;if(A)if(Array.isArray(A)&&A.length>0){p=this[bg](ph.from(A[0]));for(let h=1;h<A.length;h++)p=this[bg](A[h])}else p=this[bg](ph.from(A));return o&&o(),p}[bg](e){return super.write(e)}},_f=class extends jS{constructor(e,r){e=e||{},e.flush=e.flush||Pg.Z_NO_FLUSH,e.finishFlush=e.finishFlush||Pg.Z_FINISH,super(e,r),this[LU]=Pg.Z_FULL_FLUSH,this[IU]=e.level,this[BU]=e.strategy}params(e,r){if(!this[hy]){if(!this[ti])throw new Error(\"cannot switch params when binding is closed\");if(!this[ti].params)throw new Error(\"not supported in this implementation\");if(this[IU]!==e||this[BU]!==r){this.flush(Pg.Z_SYNC_FLUSH),PU(this[ti],\"zlib binding closed\");let o=this[ti].flush;this[ti].flush=(a,n)=>{this.flush(a),n()};try{this[ti].params(e,r)}finally{this[ti].flush=o}this[ti]&&(this[IU]=e,this[BU]=r)}}}},bU=class extends _f{constructor(e){super(e,\"Deflate\")}},SU=class extends _f{constructor(e){super(e,\"Inflate\")}},DU=Symbol(\"_portable\"),xU=class extends _f{constructor(e){super(e,\"Gzip\"),this[DU]=e&&!!e.portable}[bg](e){return this[DU]?(this[DU]=!1,e[9]=255,super[bg](e)):super[bg](e)}},kU=class extends _f{constructor(e){super(e,\"Gunzip\")}},QU=class extends _f{constructor(e){super(e,\"DeflateRaw\")}},FU=class extends _f{constructor(e){super(e,\"InflateRaw\")}},RU=class extends _f{constructor(e){super(e,\"Unzip\")}},GS=class extends jS{constructor(e,r){e=e||{},e.flush=e.flush||Pg.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||Pg.BROTLI_OPERATION_FINISH,super(e,r),this[LU]=Pg.BROTLI_OPERATION_FLUSH}},TU=class extends GS{constructor(e){super(e,\"BrotliCompress\")}},NU=class extends GS{constructor(e){super(e,\"BrotliDecompress\")}};ul.Deflate=bU;ul.Inflate=SU;ul.Gzip=xU;ul.Gunzip=kU;ul.DeflateRaw=QU;ul.InflateRaw=FU;ul.Unzip=RU;typeof vue.BrotliCompress==\"function\"?(ul.BrotliCompress=TU,ul.BrotliDecompress=NU):ul.BrotliCompress=ul.BrotliDecompress=class{constructor(){throw new Error(\"Brotli is not supported in this version of Node.js\")}}});var dy=_((z4t,Due)=>{var Hat=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;Due.exports=Hat!==\"win32\"?t=>t:t=>t&&t.replace(/\\\\/g,\"/\")});var YS=_((X4t,Pue)=>{\"use strict\";var qat=py(),OU=dy(),UU=Symbol(\"slurp\");Pue.exports=class extends qat{constructor(e,r,o){switch(super(),this.pause(),this.extended=r,this.globalExtended=o,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case\"File\":case\"OldFile\":case\"Link\":case\"SymbolicLink\":case\"CharacterDevice\":case\"BlockDevice\":case\"Directory\":case\"FIFO\":case\"ContiguousFile\":case\"GNUDumpDir\":break;case\"NextFileHasLongLinkpath\":case\"NextFileHasLongPath\":case\"OldGnuLongPath\":case\"GlobalExtendedHeader\":case\"ExtendedHeader\":case\"OldExtendedHeader\":this.meta=!0;break;default:this.ignore=!0}this.path=OU(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=OU(e.linkpath),this.uname=e.uname,this.gname=e.gname,r&&this[UU](r),o&&this[UU](o,!0)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error(\"writing more to entry than is appropriate\");let o=this.remain,a=this.blockRemain;return this.remain=Math.max(0,o-r),this.blockRemain=Math.max(0,a-r),this.ignore?!0:o>=r?super.write(e):super.write(e.slice(0,o))}[UU](e,r){for(let o in e)e[o]!==null&&e[o]!==void 0&&!(r&&o===\"path\")&&(this[o]=o===\"path\"||o===\"linkpath\"?OU(e[o]):e[o])}}});var _U=_(WS=>{\"use strict\";WS.name=new Map([[\"0\",\"File\"],[\"\",\"OldFile\"],[\"1\",\"Link\"],[\"2\",\"SymbolicLink\"],[\"3\",\"CharacterDevice\"],[\"4\",\"BlockDevice\"],[\"5\",\"Directory\"],[\"6\",\"FIFO\"],[\"7\",\"ContiguousFile\"],[\"g\",\"GlobalExtendedHeader\"],[\"x\",\"ExtendedHeader\"],[\"A\",\"SolarisACL\"],[\"D\",\"GNUDumpDir\"],[\"I\",\"Inode\"],[\"K\",\"NextFileHasLongLinkpath\"],[\"L\",\"NextFileHasLongPath\"],[\"M\",\"ContinuationFile\"],[\"N\",\"OldGnuLongPath\"],[\"S\",\"SparseFile\"],[\"V\",\"TapeVolumeHeader\"],[\"X\",\"OldExtendedHeader\"]]);WS.code=new Map(Array.from(WS.name).map(t=>[t[1],t[0]]))});var kue=_(($4t,xue)=>{\"use strict\";var jat=(t,e)=>{if(Number.isSafeInteger(t))t<0?Yat(t,e):Gat(t,e);else throw Error(\"cannot encode number outside of javascript safe integer range\");return e},Gat=(t,e)=>{e[0]=128;for(var r=e.length;r>1;r--)e[r-1]=t&255,t=Math.floor(t/256)},Yat=(t,e)=>{e[0]=255;var r=!1;t=t*-1;for(var o=e.length;o>1;o--){var a=t&255;t=Math.floor(t/256),r?e[o-1]=bue(a):a===0?e[o-1]=0:(r=!0,e[o-1]=Sue(a))}},Wat=t=>{let e=t[0],r=e===128?Vat(t.slice(1,t.length)):e===255?Kat(t):null;if(r===null)throw Error(\"invalid base256 encoding\");if(!Number.isSafeInteger(r))throw Error(\"parsed number outside of javascript safe integer range\");return r},Kat=t=>{for(var e=t.length,r=0,o=!1,a=e-1;a>-1;a--){var n=t[a],u;o?u=bue(n):n===0?u=n:(o=!0,u=Sue(n)),u!==0&&(r-=u*Math.pow(256,e-a-1))}return r},Vat=t=>{for(var e=t.length,r=0,o=e-1;o>-1;o--){var a=t[o];a!==0&&(r+=a*Math.pow(256,e-o-1))}return r},bue=t=>(255^t)&255,Sue=t=>(255^t)+1&255;xue.exports={encode:jat,parse:Wat}});var yy=_((eUt,Fue)=>{\"use strict\";var HU=_U(),my=ve(\"path\").posix,Que=kue(),qU=Symbol(\"slurp\"),Al=Symbol(\"type\"),YU=class{constructor(e,r,o,a){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[Al]=\"0\",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,r||0,o,a):e&&this.set(e)}decode(e,r,o,a){if(r||(r=0),!e||!(e.length>=r+512))throw new Error(\"need 512 bytes for header\");if(this.path=Sg(e,r,100),this.mode=hh(e,r+100,8),this.uid=hh(e,r+108,8),this.gid=hh(e,r+116,8),this.size=hh(e,r+124,12),this.mtime=jU(e,r+136,12),this.cksum=hh(e,r+148,12),this[qU](o),this[qU](a,!0),this[Al]=Sg(e,r+156,1),this[Al]===\"\"&&(this[Al]=\"0\"),this[Al]===\"0\"&&this.path.substr(-1)===\"/\"&&(this[Al]=\"5\"),this[Al]===\"5\"&&(this.size=0),this.linkpath=Sg(e,r+157,100),e.slice(r+257,r+265).toString()===\"ustar\\x0000\")if(this.uname=Sg(e,r+265,32),this.gname=Sg(e,r+297,32),this.devmaj=hh(e,r+329,8),this.devmin=hh(e,r+337,8),e[r+475]!==0){let u=Sg(e,r+345,155);this.path=u+\"/\"+this.path}else{let u=Sg(e,r+345,130);u&&(this.path=u+\"/\"+this.path),this.atime=jU(e,r+476,12),this.ctime=jU(e,r+488,12)}let n=8*32;for(let u=r;u<r+148;u++)n+=e[u];for(let u=r+156;u<r+512;u++)n+=e[u];this.cksumValid=n===this.cksum,this.cksum===null&&n===8*32&&(this.nullBlock=!0)}[qU](e,r){for(let o in e)e[o]!==null&&e[o]!==void 0&&!(r&&o===\"path\")&&(this[o]=e[o])}encode(e,r){if(e||(e=this.block=Buffer.alloc(512),r=0),r||(r=0),!(e.length>=r+512))throw new Error(\"need 512 bytes for header\");let o=this.ctime||this.atime?130:155,a=zat(this.path||\"\",o),n=a[0],u=a[1];this.needPax=a[2],this.needPax=xg(e,r,100,n)||this.needPax,this.needPax=gh(e,r+100,8,this.mode)||this.needPax,this.needPax=gh(e,r+108,8,this.uid)||this.needPax,this.needPax=gh(e,r+116,8,this.gid)||this.needPax,this.needPax=gh(e,r+124,12,this.size)||this.needPax,this.needPax=GU(e,r+136,12,this.mtime)||this.needPax,e[r+156]=this[Al].charCodeAt(0),this.needPax=xg(e,r+157,100,this.linkpath)||this.needPax,e.write(\"ustar\\x0000\",r+257,8),this.needPax=xg(e,r+265,32,this.uname)||this.needPax,this.needPax=xg(e,r+297,32,this.gname)||this.needPax,this.needPax=gh(e,r+329,8,this.devmaj)||this.needPax,this.needPax=gh(e,r+337,8,this.devmin)||this.needPax,this.needPax=xg(e,r+345,o,u)||this.needPax,e[r+475]!==0?this.needPax=xg(e,r+345,155,u)||this.needPax:(this.needPax=xg(e,r+345,130,u)||this.needPax,this.needPax=GU(e,r+476,12,this.atime)||this.needPax,this.needPax=GU(e,r+488,12,this.ctime)||this.needPax);let A=8*32;for(let p=r;p<r+148;p++)A+=e[p];for(let p=r+156;p<r+512;p++)A+=e[p];return this.cksum=A,gh(e,r+148,8,this.cksum),this.cksumValid=!0,this.needPax}set(e){for(let r in e)e[r]!==null&&e[r]!==void 0&&(this[r]=e[r])}get type(){return HU.name.get(this[Al])||this[Al]}get typeKey(){return this[Al]}set type(e){HU.code.has(e)?this[Al]=HU.code.get(e):this[Al]=e}},zat=(t,e)=>{let o=t,a=\"\",n,u=my.parse(t).root||\".\";if(Buffer.byteLength(o)<100)n=[o,a,!1];else{a=my.dirname(o),o=my.basename(o);do Buffer.byteLength(o)<=100&&Buffer.byteLength(a)<=e?n=[o,a,!1]:Buffer.byteLength(o)>100&&Buffer.byteLength(a)<=e?n=[o.substr(0,99),a,!0]:(o=my.join(my.basename(a),o),a=my.dirname(a));while(a!==u&&!n);n||(n=[t.substr(0,99),\"\",!0])}return n},Sg=(t,e,r)=>t.slice(e,e+r).toString(\"utf8\").replace(/\\0.*/,\"\"),jU=(t,e,r)=>Jat(hh(t,e,r)),Jat=t=>t===null?null:new Date(t*1e3),hh=(t,e,r)=>t[e]&128?Que.parse(t.slice(e,e+r)):Zat(t,e,r),Xat=t=>isNaN(t)?null:t,Zat=(t,e,r)=>Xat(parseInt(t.slice(e,e+r).toString(\"utf8\").replace(/\\0.*$/,\"\").trim(),8)),$at={12:8589934591,8:2097151},gh=(t,e,r,o)=>o===null?!1:o>$at[r]||o<0?(Que.encode(o,t.slice(e,e+r)),!0):(elt(t,e,r,o),!1),elt=(t,e,r,o)=>t.write(tlt(o,r),e,r,\"ascii\"),tlt=(t,e)=>rlt(Math.floor(t).toString(8),e),rlt=(t,e)=>(t.length===e-1?t:new Array(e-t.length-1).join(\"0\")+t+\" \")+\"\\0\",GU=(t,e,r,o)=>o===null?!1:gh(t,e,r,o.getTime()/1e3),nlt=new Array(156).join(\"\\0\"),xg=(t,e,r,o)=>o===null?!1:(t.write(o+nlt,e,r,\"utf8\"),o.length!==Buffer.byteLength(o)||o.length>r);Fue.exports=YU});var KS=_((tUt,Rue)=>{\"use strict\";var ilt=yy(),slt=ve(\"path\"),S1=class{constructor(e,r){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=r||!1}encode(){let e=this.encodeBody();if(e===\"\")return null;let r=Buffer.byteLength(e),o=512*Math.ceil(1+r/512),a=Buffer.allocUnsafe(o);for(let n=0;n<512;n++)a[n]=0;new ilt({path:(\"PaxHeader/\"+slt.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:r,mtime:this.mtime||null,type:this.global?\"GlobalExtendedHeader\":\"ExtendedHeader\",linkpath:\"\",uname:this.uname||\"\",gname:this.gname||\"\",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(a),a.write(e,512,r,\"utf8\");for(let n=r+512;n<a.length;n++)a[n]=0;return a}encodeBody(){return this.encodeField(\"path\")+this.encodeField(\"ctime\")+this.encodeField(\"atime\")+this.encodeField(\"dev\")+this.encodeField(\"ino\")+this.encodeField(\"nlink\")+this.encodeField(\"charset\")+this.encodeField(\"comment\")+this.encodeField(\"gid\")+this.encodeField(\"gname\")+this.encodeField(\"linkpath\")+this.encodeField(\"mtime\")+this.encodeField(\"size\")+this.encodeField(\"uid\")+this.encodeField(\"uname\")}encodeField(e){if(this[e]===null||this[e]===void 0)return\"\";let r=this[e]instanceof Date?this[e].getTime()/1e3:this[e],o=\" \"+(e===\"dev\"||e===\"ino\"||e===\"nlink\"?\"SCHILY.\":\"\")+e+\"=\"+r+`\n`,a=Buffer.byteLength(o),n=Math.floor(Math.log(a)/Math.log(10))+1;return a+n>=Math.pow(10,n)&&(n+=1),n+a+o}};S1.parse=(t,e,r)=>new S1(olt(alt(t),e),r);var olt=(t,e)=>e?Object.keys(t).reduce((r,o)=>(r[o]=t[o],r),e):t,alt=t=>t.replace(/\\n$/,\"\").split(`\n`).reduce(llt,Object.create(null)),llt=(t,e)=>{let r=parseInt(e,10);if(r!==Buffer.byteLength(e)+1)return t;e=e.substr((r+\" \").length);let o=e.split(\"=\"),a=o.shift().replace(/^SCHILY\\.(dev|ino|nlink)/,\"$1\");if(!a)return t;let n=o.join(\"=\");return t[a]=/^([A-Z]+\\.)?([mac]|birth|creation)time$/.test(a)?new Date(n*1e3):/^[0-9]+$/.test(n)?+n:n,t};Rue.exports=S1});var Ey=_((rUt,Tue)=>{Tue.exports=t=>{let e=t.length-1,r=-1;for(;e>-1&&t.charAt(e)===\"/\";)r=e,e--;return r===-1?t:t.slice(0,r)}});var VS=_((nUt,Nue)=>{\"use strict\";Nue.exports=t=>class extends t{warn(e,r,o={}){this.file&&(o.file=this.file),this.cwd&&(o.cwd=this.cwd),o.code=r instanceof Error&&r.code||e,o.tarCode=e,!this.strict&&o.recoverable!==!1?(r instanceof Error&&(o=Object.assign(r,o),r=r.message),this.emit(\"warn\",o.tarCode,r,o)):r instanceof Error?this.emit(\"error\",Object.assign(r,o)):this.emit(\"error\",Object.assign(new Error(`${e}: ${r}`),o))}}});var KU=_((sUt,Lue)=>{\"use strict\";var zS=[\"|\",\"<\",\">\",\"?\",\":\"],WU=zS.map(t=>String.fromCharCode(61440+t.charCodeAt(0))),clt=new Map(zS.map((t,e)=>[t,WU[e]])),ult=new Map(WU.map((t,e)=>[t,zS[e]]));Lue.exports={encode:t=>zS.reduce((e,r)=>e.split(r).join(clt.get(r)),t),decode:t=>WU.reduce((e,r)=>e.split(r).join(ult.get(r)),t)}});var VU=_((oUt,Oue)=>{var{isAbsolute:Alt,parse:Mue}=ve(\"path\").win32;Oue.exports=t=>{let e=\"\",r=Mue(t);for(;Alt(t)||r.root;){let o=t.charAt(0)===\"/\"&&t.slice(0,4)!==\"//?/\"?\"/\":r.root;t=t.substr(o.length),e+=o,r=Mue(t)}return[e,t]}});var _ue=_((aUt,Uue)=>{\"use strict\";Uue.exports=(t,e,r)=>(t&=4095,r&&(t=(t|384)&-19),e&&(t&256&&(t|=64),t&32&&(t|=8),t&4&&(t|=1)),t)});var i3=_((uUt,eAe)=>{\"use strict\";var Kue=py(),Vue=KS(),zue=yy(),oA=ve(\"fs\"),Hue=ve(\"path\"),sA=dy(),flt=Ey(),Jue=(t,e)=>e?(t=sA(t).replace(/^\\.(\\/|$)/,\"\"),flt(e)+\"/\"+t):sA(t),plt=16*1024*1024,que=Symbol(\"process\"),jue=Symbol(\"file\"),Gue=Symbol(\"directory\"),JU=Symbol(\"symlink\"),Yue=Symbol(\"hardlink\"),x1=Symbol(\"header\"),JS=Symbol(\"read\"),XU=Symbol(\"lstat\"),XS=Symbol(\"onlstat\"),ZU=Symbol(\"onread\"),$U=Symbol(\"onreadlink\"),e3=Symbol(\"openfile\"),t3=Symbol(\"onopenfile\"),dh=Symbol(\"close\"),ZS=Symbol(\"mode\"),r3=Symbol(\"awaitDrain\"),zU=Symbol(\"ondrain\"),aA=Symbol(\"prefix\"),Wue=Symbol(\"hadError\"),Xue=VS(),hlt=KU(),Zue=VU(),$ue=_ue(),$S=Xue(class extends Kue{constructor(e,r){if(r=r||{},super(r),typeof e!=\"string\")throw new TypeError(\"path is required\");this.path=sA(e),this.portable=!!r.portable,this.myuid=process.getuid&&process.getuid()||0,this.myuser=process.env.USER||\"\",this.maxReadSize=r.maxReadSize||plt,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=sA(r.cwd||process.cwd()),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime||null,this.prefix=r.prefix?sA(r.prefix):null,this.fd=null,this.blockLen=null,this.blockRemain=null,this.buf=null,this.offset=null,this.length=null,this.pos=null,this.remain=null,typeof r.onwarn==\"function\"&&this.on(\"warn\",r.onwarn);let o=!1;if(!this.preservePaths){let[a,n]=Zue(this.path);a&&(this.path=n,o=a)}this.win32=!!r.win32||process.platform===\"win32\",this.win32&&(this.path=hlt.decode(this.path.replace(/\\\\/g,\"/\")),e=e.replace(/\\\\/g,\"/\")),this.absolute=sA(r.absolute||Hue.resolve(this.cwd,e)),this.path===\"\"&&(this.path=\"./\"),o&&this.warn(\"TAR_ENTRY_INFO\",`stripping ${o} from absolute path`,{entry:this,path:o+this.path}),this.statCache.has(this.absolute)?this[XS](this.statCache.get(this.absolute)):this[XU]()}emit(e,...r){return e===\"error\"&&(this[Wue]=!0),super.emit(e,...r)}[XU](){oA.lstat(this.absolute,(e,r)=>{if(e)return this.emit(\"error\",e);this[XS](r)})}[XS](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=dlt(e),this.emit(\"stat\",e),this[que]()}[que](){switch(this.type){case\"File\":return this[jue]();case\"Directory\":return this[Gue]();case\"SymbolicLink\":return this[JU]();default:return this.end()}}[ZS](e){return $ue(e,this.type===\"Directory\",this.portable)}[aA](e){return Jue(e,this.prefix)}[x1](){this.type===\"Directory\"&&this.portable&&(this.noMtime=!0),this.header=new zue({path:this[aA](this.path),linkpath:this.type===\"Link\"?this[aA](this.linkpath):this.linkpath,mode:this[ZS](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:\"\",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new Vue({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this[aA](this.path),linkpath:this.type===\"Link\"?this[aA](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),super.write(this.header.block)}[Gue](){this.path.substr(-1)!==\"/\"&&(this.path+=\"/\"),this.stat.size=0,this[x1](),this.end()}[JU](){oA.readlink(this.absolute,(e,r)=>{if(e)return this.emit(\"error\",e);this[$U](r)})}[$U](e){this.linkpath=sA(e),this[x1](),this.end()}[Yue](e){this.type=\"Link\",this.linkpath=sA(Hue.relative(this.cwd,e)),this.stat.size=0,this[x1](),this.end()}[jue](){if(this.stat.nlink>1){let e=this.stat.dev+\":\"+this.stat.ino;if(this.linkCache.has(e)){let r=this.linkCache.get(e);if(r.indexOf(this.cwd)===0)return this[Yue](r)}this.linkCache.set(e,this.absolute)}if(this[x1](),this.stat.size===0)return this.end();this[e3]()}[e3](){oA.open(this.absolute,\"r\",(e,r)=>{if(e)return this.emit(\"error\",e);this[t3](r)})}[t3](e){if(this.fd=e,this[Wue])return this[dh]();this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let r=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(r),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[JS]()}[JS](){let{fd:e,buf:r,offset:o,length:a,pos:n}=this;oA.read(e,r,o,a,n,(u,A)=>{if(u)return this[dh](()=>this.emit(\"error\",u));this[ZU](A)})}[dh](e){oA.close(this.fd,e)}[ZU](e){if(e<=0&&this.remain>0){let a=new Error(\"encountered unexpected EOF\");return a.path=this.absolute,a.syscall=\"read\",a.code=\"EOF\",this[dh](()=>this.emit(\"error\",a))}if(e>this.remain){let a=new Error(\"did not encounter expected EOF\");return a.path=this.absolute,a.syscall=\"read\",a.code=\"EOF\",this[dh](()=>this.emit(\"error\",a))}if(e===this.remain)for(let a=e;a<this.length&&e<this.blockRemain;a++)this.buf[a+this.offset]=0,e++,this.remain++;let r=this.offset===0&&e===this.buf.length?this.buf:this.buf.slice(this.offset,this.offset+e);this.write(r)?this[zU]():this[r3](()=>this[zU]())}[r3](e){this.once(\"drain\",e)}write(e){if(this.blockRemain<e.length){let r=new Error(\"writing more data than expected\");return r.path=this.absolute,this.emit(\"error\",r)}return this.remain-=e.length,this.blockRemain-=e.length,this.pos+=e.length,this.offset+=e.length,super.write(e)}[zU](){if(!this.remain)return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),this[dh](e=>e?this.emit(\"error\",e):this.end());this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[JS]()}}),n3=class extends $S{[XU](){this[XS](oA.lstatSync(this.absolute))}[JU](){this[$U](oA.readlinkSync(this.absolute))}[e3](){this[t3](oA.openSync(this.absolute,\"r\"))}[JS](){let e=!0;try{let{fd:r,buf:o,offset:a,length:n,pos:u}=this,A=oA.readSync(r,o,a,n,u);this[ZU](A),e=!1}finally{if(e)try{this[dh](()=>{})}catch{}}}[r3](e){e()}[dh](e){oA.closeSync(this.fd),e()}},glt=Xue(class extends Kue{constructor(e,r){r=r||{},super(r),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.readEntry=e,this.type=e.type,this.type===\"Directory\"&&this.portable&&(this.noMtime=!0),this.prefix=r.prefix||null,this.path=sA(e.path),this.mode=this[ZS](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:r.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=sA(e.linkpath),typeof r.onwarn==\"function\"&&this.on(\"warn\",r.onwarn);let o=!1;if(!this.preservePaths){let[a,n]=Zue(this.path);a&&(this.path=n,o=a)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new zue({path:this[aA](this.path),linkpath:this.type===\"Link\"?this[aA](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),o&&this.warn(\"TAR_ENTRY_INFO\",`stripping ${o} from absolute path`,{entry:this,path:o+this.path}),this.header.encode()&&!this.noPax&&super.write(new Vue({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this[aA](this.path),linkpath:this.type===\"Link\"?this[aA](this.linkpath):this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[aA](e){return Jue(e,this.prefix)}[ZS](e){return $ue(e,this.type===\"Directory\",this.portable)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error(\"writing more to entry than is appropriate\");return this.blockRemain-=r,super.write(e)}end(){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),super.end()}});$S.Sync=n3;$S.Tar=glt;var dlt=t=>t.isFile()?\"File\":t.isDirectory()?\"Directory\":t.isSymbolicLink()?\"SymbolicLink\":\"Unsupported\";eAe.exports=$S});var lx=_((fUt,aAe)=>{\"use strict\";var ox=class{constructor(e,r){this.path=e||\"./\",this.absolute=r,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},mlt=py(),ylt=MU(),Elt=YS(),p3=i3(),Clt=p3.Sync,wlt=p3.Tar,Ilt=cP(),tAe=Buffer.alloc(1024),rx=Symbol(\"onStat\"),ex=Symbol(\"ended\"),lA=Symbol(\"queue\"),Cy=Symbol(\"current\"),kg=Symbol(\"process\"),tx=Symbol(\"processing\"),rAe=Symbol(\"processJob\"),cA=Symbol(\"jobs\"),s3=Symbol(\"jobDone\"),nx=Symbol(\"addFSEntry\"),nAe=Symbol(\"addTarEntry\"),c3=Symbol(\"stat\"),u3=Symbol(\"readdir\"),ix=Symbol(\"onreaddir\"),sx=Symbol(\"pipe\"),iAe=Symbol(\"entry\"),o3=Symbol(\"entryOpt\"),A3=Symbol(\"writeEntryClass\"),oAe=Symbol(\"write\"),a3=Symbol(\"ondrain\"),ax=ve(\"fs\"),sAe=ve(\"path\"),Blt=VS(),l3=dy(),h3=Blt(class extends mlt{constructor(e){super(e),e=e||Object.create(null),this.opt=e,this.file=e.file||\"\",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=l3(e.prefix||\"\"),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[A3]=p3,typeof e.onwarn==\"function\"&&this.on(\"warn\",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!=\"object\"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new ylt.Gzip(e.gzip),this.zip.on(\"data\",r=>super.write(r)),this.zip.on(\"end\",r=>super.end()),this.zip.on(\"drain\",r=>this[a3]()),this.on(\"resume\",r=>this.zip.resume())):this.on(\"drain\",this[a3]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter==\"function\"?e.filter:r=>!0,this[lA]=new Ilt,this[cA]=0,this.jobs=+e.jobs||4,this[tx]=!1,this[ex]=!1}[oAe](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[ex]=!0,this[kg](),this}write(e){if(this[ex])throw new Error(\"write after end\");return e instanceof Elt?this[nAe](e):this[nx](e),this.flowing}[nAe](e){let r=l3(sAe.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let o=new ox(e.path,r,!1);o.entry=new wlt(e,this[o3](o)),o.entry.on(\"end\",a=>this[s3](o)),this[cA]+=1,this[lA].push(o)}this[kg]()}[nx](e){let r=l3(sAe.resolve(this.cwd,e));this[lA].push(new ox(e,r)),this[kg]()}[c3](e){e.pending=!0,this[cA]+=1;let r=this.follow?\"stat\":\"lstat\";ax[r](e.absolute,(o,a)=>{e.pending=!1,this[cA]-=1,o?this.emit(\"error\",o):this[rx](e,a)})}[rx](e,r){this.statCache.set(e.absolute,r),e.stat=r,this.filter(e.path,r)||(e.ignore=!0),this[kg]()}[u3](e){e.pending=!0,this[cA]+=1,ax.readdir(e.absolute,(r,o)=>{if(e.pending=!1,this[cA]-=1,r)return this.emit(\"error\",r);this[ix](e,o)})}[ix](e,r){this.readdirCache.set(e.absolute,r),e.readdir=r,this[kg]()}[kg](){if(!this[tx]){this[tx]=!0;for(let e=this[lA].head;e!==null&&this[cA]<this.jobs;e=e.next)if(this[rAe](e.value),e.value.ignore){let r=e.next;this[lA].removeNode(e),e.next=r}this[tx]=!1,this[ex]&&!this[lA].length&&this[cA]===0&&(this.zip?this.zip.end(tAe):(super.write(tAe),super.end()))}}get[Cy](){return this[lA]&&this[lA].head&&this[lA].head.value}[s3](e){this[lA].shift(),this[cA]-=1,this[kg]()}[rAe](e){if(!e.pending){if(e.entry){e===this[Cy]&&!e.piped&&this[sx](e);return}if(e.stat||(this.statCache.has(e.absolute)?this[rx](e,this.statCache.get(e.absolute)):this[c3](e)),!!e.stat&&!e.ignore&&!(!this.noDirRecurse&&e.stat.isDirectory()&&!e.readdir&&(this.readdirCache.has(e.absolute)?this[ix](e,this.readdirCache.get(e.absolute)):this[u3](e),!e.readdir))){if(e.entry=this[iAe](e),!e.entry){e.ignore=!0;return}e===this[Cy]&&!e.piped&&this[sx](e)}}}[o3](e){return{onwarn:(r,o,a)=>this.warn(r,o,a),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix}}[iAe](e){this[cA]+=1;try{return new this[A3](e.path,this[o3](e)).on(\"end\",()=>this[s3](e)).on(\"error\",r=>this.emit(\"error\",r))}catch(r){this.emit(\"error\",r)}}[a3](){this[Cy]&&this[Cy].entry&&this[Cy].entry.resume()}[sx](e){e.piped=!0,e.readdir&&e.readdir.forEach(a=>{let n=e.path,u=n===\"./\"?\"\":n.replace(/\\/*$/,\"/\");this[nx](u+a)});let r=e.entry,o=this.zip;o?r.on(\"data\",a=>{o.write(a)||r.pause()}):r.on(\"data\",a=>{super.write(a)||r.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),f3=class extends h3{constructor(e){super(e),this[A3]=Clt}pause(){}resume(){}[c3](e){let r=this.follow?\"statSync\":\"lstatSync\";this[rx](e,ax[r](e.absolute))}[u3](e,r){this[ix](e,ax.readdirSync(e.absolute))}[sx](e){let r=e.entry,o=this.zip;e.readdir&&e.readdir.forEach(a=>{let n=e.path,u=n===\"./\"?\"\":n.replace(/\\/*$/,\"/\");this[nx](u+a)}),o?r.on(\"data\",a=>{o.write(a)}):r.on(\"data\",a=>{super[oAe](a)})}};h3.Sync=f3;aAe.exports=h3});var Sy=_(Q1=>{\"use strict\";var vlt=py(),Dlt=ve(\"events\").EventEmitter,Ra=ve(\"fs\"),m3=Ra.writev;if(!m3){let t=process.binding(\"fs\"),e=t.FSReqWrap||t.FSReqCallback;m3=(r,o,a,n)=>{let u=(p,h)=>n(p,h,o),A=new e;A.oncomplete=u,t.writeBuffers(r,o,a,A)}}var Py=Symbol(\"_autoClose\"),Kc=Symbol(\"_close\"),k1=Symbol(\"_ended\"),Gn=Symbol(\"_fd\"),lAe=Symbol(\"_finished\"),yh=Symbol(\"_flags\"),g3=Symbol(\"_flush\"),y3=Symbol(\"_handleChunk\"),E3=Symbol(\"_makeBuf\"),px=Symbol(\"_mode\"),cx=Symbol(\"_needDrain\"),vy=Symbol(\"_onerror\"),by=Symbol(\"_onopen\"),d3=Symbol(\"_onread\"),Iy=Symbol(\"_onwrite\"),Eh=Symbol(\"_open\"),Hf=Symbol(\"_path\"),Qg=Symbol(\"_pos\"),uA=Symbol(\"_queue\"),By=Symbol(\"_read\"),cAe=Symbol(\"_readSize\"),mh=Symbol(\"_reading\"),ux=Symbol(\"_remain\"),uAe=Symbol(\"_size\"),Ax=Symbol(\"_write\"),wy=Symbol(\"_writing\"),fx=Symbol(\"_defaultFlag\"),Dy=Symbol(\"_errored\"),hx=class extends vlt{constructor(e,r){if(r=r||{},super(r),this.readable=!0,this.writable=!1,typeof e!=\"string\")throw new TypeError(\"path must be a string\");this[Dy]=!1,this[Gn]=typeof r.fd==\"number\"?r.fd:null,this[Hf]=e,this[cAe]=r.readSize||16*1024*1024,this[mh]=!1,this[uAe]=typeof r.size==\"number\"?r.size:1/0,this[ux]=this[uAe],this[Py]=typeof r.autoClose==\"boolean\"?r.autoClose:!0,typeof this[Gn]==\"number\"?this[By]():this[Eh]()}get fd(){return this[Gn]}get path(){return this[Hf]}write(){throw new TypeError(\"this is a readable stream\")}end(){throw new TypeError(\"this is a readable stream\")}[Eh](){Ra.open(this[Hf],\"r\",(e,r)=>this[by](e,r))}[by](e,r){e?this[vy](e):(this[Gn]=r,this.emit(\"open\",r),this[By]())}[E3](){return Buffer.allocUnsafe(Math.min(this[cAe],this[ux]))}[By](){if(!this[mh]){this[mh]=!0;let e=this[E3]();if(e.length===0)return process.nextTick(()=>this[d3](null,0,e));Ra.read(this[Gn],e,0,e.length,null,(r,o,a)=>this[d3](r,o,a))}}[d3](e,r,o){this[mh]=!1,e?this[vy](e):this[y3](r,o)&&this[By]()}[Kc](){if(this[Py]&&typeof this[Gn]==\"number\"){let e=this[Gn];this[Gn]=null,Ra.close(e,r=>r?this.emit(\"error\",r):this.emit(\"close\"))}}[vy](e){this[mh]=!0,this[Kc](),this.emit(\"error\",e)}[y3](e,r){let o=!1;return this[ux]-=e,e>0&&(o=super.write(e<r.length?r.slice(0,e):r)),(e===0||this[ux]<=0)&&(o=!1,this[Kc](),super.end()),o}emit(e,r){switch(e){case\"prefinish\":case\"finish\":break;case\"drain\":typeof this[Gn]==\"number\"&&this[By]();break;case\"error\":return this[Dy]?void 0:(this[Dy]=!0,super.emit(e,r));default:return super.emit(e,r)}}},C3=class extends hx{[Eh](){let e=!0;try{this[by](null,Ra.openSync(this[Hf],\"r\")),e=!1}finally{e&&this[Kc]()}}[By](){let e=!0;try{if(!this[mh]){this[mh]=!0;do{let r=this[E3](),o=r.length===0?0:Ra.readSync(this[Gn],r,0,r.length,null);if(!this[y3](o,r))break}while(!0);this[mh]=!1}e=!1}finally{e&&this[Kc]()}}[Kc](){if(this[Py]&&typeof this[Gn]==\"number\"){let e=this[Gn];this[Gn]=null,Ra.closeSync(e),this.emit(\"close\")}}},gx=class extends Dlt{constructor(e,r){r=r||{},super(r),this.readable=!1,this.writable=!0,this[Dy]=!1,this[wy]=!1,this[k1]=!1,this[cx]=!1,this[uA]=[],this[Hf]=e,this[Gn]=typeof r.fd==\"number\"?r.fd:null,this[px]=r.mode===void 0?438:r.mode,this[Qg]=typeof r.start==\"number\"?r.start:null,this[Py]=typeof r.autoClose==\"boolean\"?r.autoClose:!0;let o=this[Qg]!==null?\"r+\":\"w\";this[fx]=r.flags===void 0,this[yh]=this[fx]?o:r.flags,this[Gn]===null&&this[Eh]()}emit(e,r){if(e===\"error\"){if(this[Dy])return;this[Dy]=!0}return super.emit(e,r)}get fd(){return this[Gn]}get path(){return this[Hf]}[vy](e){this[Kc](),this[wy]=!0,this.emit(\"error\",e)}[Eh](){Ra.open(this[Hf],this[yh],this[px],(e,r)=>this[by](e,r))}[by](e,r){this[fx]&&this[yh]===\"r+\"&&e&&e.code===\"ENOENT\"?(this[yh]=\"w\",this[Eh]()):e?this[vy](e):(this[Gn]=r,this.emit(\"open\",r),this[g3]())}end(e,r){return e&&this.write(e,r),this[k1]=!0,!this[wy]&&!this[uA].length&&typeof this[Gn]==\"number\"&&this[Iy](null,0),this}write(e,r){return typeof e==\"string\"&&(e=Buffer.from(e,r)),this[k1]?(this.emit(\"error\",new Error(\"write() after end()\")),!1):this[Gn]===null||this[wy]||this[uA].length?(this[uA].push(e),this[cx]=!0,!1):(this[wy]=!0,this[Ax](e),!0)}[Ax](e){Ra.write(this[Gn],e,0,e.length,this[Qg],(r,o)=>this[Iy](r,o))}[Iy](e,r){e?this[vy](e):(this[Qg]!==null&&(this[Qg]+=r),this[uA].length?this[g3]():(this[wy]=!1,this[k1]&&!this[lAe]?(this[lAe]=!0,this[Kc](),this.emit(\"finish\")):this[cx]&&(this[cx]=!1,this.emit(\"drain\"))))}[g3](){if(this[uA].length===0)this[k1]&&this[Iy](null,0);else if(this[uA].length===1)this[Ax](this[uA].pop());else{let e=this[uA];this[uA]=[],m3(this[Gn],e,this[Qg],(r,o)=>this[Iy](r,o))}}[Kc](){if(this[Py]&&typeof this[Gn]==\"number\"){let e=this[Gn];this[Gn]=null,Ra.close(e,r=>r?this.emit(\"error\",r):this.emit(\"close\"))}}},w3=class extends gx{[Eh](){let e;if(this[fx]&&this[yh]===\"r+\")try{e=Ra.openSync(this[Hf],this[yh],this[px])}catch(r){if(r.code===\"ENOENT\")return this[yh]=\"w\",this[Eh]();throw r}else e=Ra.openSync(this[Hf],this[yh],this[px]);this[by](null,e)}[Kc](){if(this[Py]&&typeof this[Gn]==\"number\"){let e=this[Gn];this[Gn]=null,Ra.closeSync(e),this.emit(\"close\")}}[Ax](e){let r=!0;try{this[Iy](null,Ra.writeSync(this[Gn],e,0,e.length,this[Qg])),r=!1}finally{if(r)try{this[Kc]()}catch{}}}};Q1.ReadStream=hx;Q1.ReadStreamSync=C3;Q1.WriteStream=gx;Q1.WriteStreamSync=w3});var Ix=_((gUt,mAe)=>{\"use strict\";var Plt=VS(),blt=yy(),Slt=ve(\"events\"),xlt=cP(),klt=1024*1024,Qlt=YS(),AAe=KS(),Flt=MU(),I3=Buffer.from([31,139]),Xl=Symbol(\"state\"),Fg=Symbol(\"writeEntry\"),qf=Symbol(\"readEntry\"),B3=Symbol(\"nextEntry\"),fAe=Symbol(\"processEntry\"),Zl=Symbol(\"extendedHeader\"),F1=Symbol(\"globalExtendedHeader\"),Ch=Symbol(\"meta\"),pAe=Symbol(\"emitMeta\"),fi=Symbol(\"buffer\"),jf=Symbol(\"queue\"),Rg=Symbol(\"ended\"),hAe=Symbol(\"emittedEnd\"),Tg=Symbol(\"emit\"),Ta=Symbol(\"unzip\"),dx=Symbol(\"consumeChunk\"),mx=Symbol(\"consumeChunkSub\"),v3=Symbol(\"consumeBody\"),gAe=Symbol(\"consumeMeta\"),dAe=Symbol(\"consumeHeader\"),yx=Symbol(\"consuming\"),D3=Symbol(\"bufferConcat\"),P3=Symbol(\"maybeEnd\"),R1=Symbol(\"writing\"),wh=Symbol(\"aborted\"),Ex=Symbol(\"onDone\"),Ng=Symbol(\"sawValidEntry\"),Cx=Symbol(\"sawNullBlock\"),wx=Symbol(\"sawEOF\"),Rlt=t=>!0;mAe.exports=Plt(class extends Slt{constructor(e){e=e||{},super(e),this.file=e.file||\"\",this[Ng]=null,this.on(Ex,r=>{(this[Xl]===\"begin\"||this[Ng]===!1)&&this.warn(\"TAR_BAD_ARCHIVE\",\"Unrecognized archive format\")}),e.ondone?this.on(Ex,e.ondone):this.on(Ex,r=>{this.emit(\"prefinish\"),this.emit(\"finish\"),this.emit(\"end\"),this.emit(\"close\")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||klt,this.filter=typeof e.filter==\"function\"?e.filter:Rlt,this.writable=!0,this.readable=!1,this[jf]=new xlt,this[fi]=null,this[qf]=null,this[Fg]=null,this[Xl]=\"begin\",this[Ch]=\"\",this[Zl]=null,this[F1]=null,this[Rg]=!1,this[Ta]=null,this[wh]=!1,this[Cx]=!1,this[wx]=!1,typeof e.onwarn==\"function\"&&this.on(\"warn\",e.onwarn),typeof e.onentry==\"function\"&&this.on(\"entry\",e.onentry)}[dAe](e,r){this[Ng]===null&&(this[Ng]=!1);let o;try{o=new blt(e,r,this[Zl],this[F1])}catch(a){return this.warn(\"TAR_ENTRY_INVALID\",a)}if(o.nullBlock)this[Cx]?(this[wx]=!0,this[Xl]===\"begin\"&&(this[Xl]=\"header\"),this[Tg](\"eof\")):(this[Cx]=!0,this[Tg](\"nullBlock\"));else if(this[Cx]=!1,!o.cksumValid)this.warn(\"TAR_ENTRY_INVALID\",\"checksum failure\",{header:o});else if(!o.path)this.warn(\"TAR_ENTRY_INVALID\",\"path is required\",{header:o});else{let a=o.type;if(/^(Symbolic)?Link$/.test(a)&&!o.linkpath)this.warn(\"TAR_ENTRY_INVALID\",\"linkpath required\",{header:o});else if(!/^(Symbolic)?Link$/.test(a)&&o.linkpath)this.warn(\"TAR_ENTRY_INVALID\",\"linkpath forbidden\",{header:o});else{let n=this[Fg]=new Qlt(o,this[Zl],this[F1]);if(!this[Ng])if(n.remain){let u=()=>{n.invalid||(this[Ng]=!0)};n.on(\"end\",u)}else this[Ng]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[Tg](\"ignoredEntry\",n),this[Xl]=\"ignore\",n.resume()):n.size>0&&(this[Ch]=\"\",n.on(\"data\",u=>this[Ch]+=u),this[Xl]=\"meta\"):(this[Zl]=null,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[Tg](\"ignoredEntry\",n),this[Xl]=n.remain?\"ignore\":\"header\",n.resume()):(n.remain?this[Xl]=\"body\":(this[Xl]=\"header\",n.end()),this[qf]?this[jf].push(n):(this[jf].push(n),this[B3]())))}}}[fAe](e){let r=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[qf]=e,this.emit(\"entry\",e),e.emittedEnd||(e.on(\"end\",o=>this[B3]()),r=!1)):(this[qf]=null,r=!1),r}[B3](){do;while(this[fAe](this[jf].shift()));if(!this[jf].length){let e=this[qf];!e||e.flowing||e.size===e.remain?this[R1]||this.emit(\"drain\"):e.once(\"drain\",o=>this.emit(\"drain\"))}}[v3](e,r){let o=this[Fg],a=o.blockRemain,n=a>=e.length&&r===0?e:e.slice(r,r+a);return o.write(n),o.blockRemain||(this[Xl]=\"header\",this[Fg]=null,o.end()),n.length}[gAe](e,r){let o=this[Fg],a=this[v3](e,r);return this[Fg]||this[pAe](o),a}[Tg](e,r,o){!this[jf].length&&!this[qf]?this.emit(e,r,o):this[jf].push([e,r,o])}[pAe](e){switch(this[Tg](\"meta\",this[Ch]),e.type){case\"ExtendedHeader\":case\"OldExtendedHeader\":this[Zl]=AAe.parse(this[Ch],this[Zl],!1);break;case\"GlobalExtendedHeader\":this[F1]=AAe.parse(this[Ch],this[F1],!0);break;case\"NextFileHasLongPath\":case\"OldGnuLongPath\":this[Zl]=this[Zl]||Object.create(null),this[Zl].path=this[Ch].replace(/\\0.*/,\"\");break;case\"NextFileHasLongLinkpath\":this[Zl]=this[Zl]||Object.create(null),this[Zl].linkpath=this[Ch].replace(/\\0.*/,\"\");break;default:throw new Error(\"unknown meta: \"+e.type)}}abort(e){this[wh]=!0,this.emit(\"abort\",e),this.warn(\"TAR_ABORT\",e,{recoverable:!1})}write(e){if(this[wh])return;if(this[Ta]===null&&e){if(this[fi]&&(e=Buffer.concat([this[fi],e]),this[fi]=null),e.length<I3.length)return this[fi]=e,!0;for(let o=0;this[Ta]===null&&o<I3.length;o++)e[o]!==I3[o]&&(this[Ta]=!1);if(this[Ta]===null){let o=this[Rg];this[Rg]=!1,this[Ta]=new Flt.Unzip,this[Ta].on(\"data\",n=>this[dx](n)),this[Ta].on(\"error\",n=>this.abort(n)),this[Ta].on(\"end\",n=>{this[Rg]=!0,this[dx]()}),this[R1]=!0;let a=this[Ta][o?\"end\":\"write\"](e);return this[R1]=!1,a}}this[R1]=!0,this[Ta]?this[Ta].write(e):this[dx](e),this[R1]=!1;let r=this[jf].length?!1:this[qf]?this[qf].flowing:!0;return!r&&!this[jf].length&&this[qf].once(\"drain\",o=>this.emit(\"drain\")),r}[D3](e){e&&!this[wh]&&(this[fi]=this[fi]?Buffer.concat([this[fi],e]):e)}[P3](){if(this[Rg]&&!this[hAe]&&!this[wh]&&!this[yx]){this[hAe]=!0;let e=this[Fg];if(e&&e.blockRemain){let r=this[fi]?this[fi].length:0;this.warn(\"TAR_BAD_ARCHIVE\",`Truncated input (needed ${e.blockRemain} more bytes, only ${r} available)`,{entry:e}),this[fi]&&e.write(this[fi]),e.end()}this[Tg](Ex)}}[dx](e){if(this[yx])this[D3](e);else if(!e&&!this[fi])this[P3]();else{if(this[yx]=!0,this[fi]){this[D3](e);let r=this[fi];this[fi]=null,this[mx](r)}else this[mx](e);for(;this[fi]&&this[fi].length>=512&&!this[wh]&&!this[wx];){let r=this[fi];this[fi]=null,this[mx](r)}this[yx]=!1}(!this[fi]||this[Rg])&&this[P3]()}[mx](e){let r=0,o=e.length;for(;r+512<=o&&!this[wh]&&!this[wx];)switch(this[Xl]){case\"begin\":case\"header\":this[dAe](e,r),r+=512;break;case\"ignore\":case\"body\":r+=this[v3](e,r);break;case\"meta\":r+=this[gAe](e,r);break;default:throw new Error(\"invalid state: \"+this[Xl])}r<o&&(this[fi]?this[fi]=Buffer.concat([e.slice(r),this[fi]]):this[fi]=e.slice(r))}end(e){this[wh]||(this[Ta]?this[Ta].end(e):(this[Rg]=!0,this.write(e)))}})});var Bx=_((dUt,wAe)=>{\"use strict\";var Tlt=Ay(),EAe=Ix(),xy=ve(\"fs\"),Nlt=Sy(),yAe=ve(\"path\"),b3=Ey();wAe.exports=(t,e,r)=>{typeof t==\"function\"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e==\"function\"&&(r=e,e=null),e?e=Array.from(e):e=[];let o=Tlt(t);if(o.sync&&typeof r==\"function\")throw new TypeError(\"callback not supported for sync tar functions\");if(!o.file&&typeof r==\"function\")throw new TypeError(\"callback only supported with file option\");return e.length&&Mlt(o,e),o.noResume||Llt(o),o.file&&o.sync?Olt(o):o.file?Ult(o,r):CAe(o)};var Llt=t=>{let e=t.onentry;t.onentry=e?r=>{e(r),r.resume()}:r=>r.resume()},Mlt=(t,e)=>{let r=new Map(e.map(n=>[b3(n),!0])),o=t.filter,a=(n,u)=>{let A=u||yAe.parse(n).root||\".\",p=n===A?!1:r.has(n)?r.get(n):a(yAe.dirname(n),A);return r.set(n,p),p};t.filter=o?(n,u)=>o(n,u)&&a(b3(n)):n=>a(b3(n))},Olt=t=>{let e=CAe(t),r=t.file,o=!0,a;try{let n=xy.statSync(r),u=t.maxReadSize||16*1024*1024;if(n.size<u)e.end(xy.readFileSync(r));else{let A=0,p=Buffer.allocUnsafe(u);for(a=xy.openSync(r,\"r\");A<n.size;){let h=xy.readSync(a,p,0,u,A);A+=h,e.write(p.slice(0,h))}e.end()}o=!1}finally{if(o&&a)try{xy.closeSync(a)}catch{}}},Ult=(t,e)=>{let r=new EAe(t),o=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((u,A)=>{r.on(\"error\",A),r.on(\"end\",u),xy.stat(a,(p,h)=>{if(p)A(p);else{let E=new Nlt.ReadStream(a,{readSize:o,size:h.size});E.on(\"error\",A),E.pipe(r)}})});return e?n.then(e,e):n},CAe=t=>new EAe(t)});var bAe=_((mUt,PAe)=>{\"use strict\";var _lt=Ay(),vx=lx(),IAe=Sy(),BAe=Bx(),vAe=ve(\"path\");PAe.exports=(t,e,r)=>{if(typeof e==\"function\"&&(r=e),Array.isArray(t)&&(e=t,t={}),!e||!Array.isArray(e)||!e.length)throw new TypeError(\"no files or directories specified\");e=Array.from(e);let o=_lt(t);if(o.sync&&typeof r==\"function\")throw new TypeError(\"callback not supported for sync tar functions\");if(!o.file&&typeof r==\"function\")throw new TypeError(\"callback only supported with file option\");return o.file&&o.sync?Hlt(o,e):o.file?qlt(o,e,r):o.sync?jlt(o,e):Glt(o,e)};var Hlt=(t,e)=>{let r=new vx.Sync(t),o=new IAe.WriteStreamSync(t.file,{mode:t.mode||438});r.pipe(o),DAe(r,e)},qlt=(t,e,r)=>{let o=new vx(t),a=new IAe.WriteStream(t.file,{mode:t.mode||438});o.pipe(a);let n=new Promise((u,A)=>{a.on(\"error\",A),a.on(\"close\",u),o.on(\"error\",A)});return S3(o,e),r?n.then(r,r):n},DAe=(t,e)=>{e.forEach(r=>{r.charAt(0)===\"@\"?BAe({file:vAe.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:o=>t.add(o)}):t.add(r)}),t.end()},S3=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)===\"@\")return BAe({file:vAe.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:o=>t.add(o)}).then(o=>S3(t,e));t.add(r)}t.end()},jlt=(t,e)=>{let r=new vx.Sync(t);return DAe(r,e),r},Glt=(t,e)=>{let r=new vx(t);return S3(r,e),r}});var x3=_((yUt,TAe)=>{\"use strict\";var Ylt=Ay(),SAe=lx(),fl=ve(\"fs\"),xAe=Sy(),kAe=Bx(),QAe=ve(\"path\"),FAe=yy();TAe.exports=(t,e,r)=>{let o=Ylt(t);if(!o.file)throw new TypeError(\"file is required\");if(o.gzip)throw new TypeError(\"cannot append to compressed archives\");if(!e||!Array.isArray(e)||!e.length)throw new TypeError(\"no files or directories specified\");return e=Array.from(e),o.sync?Wlt(o,e):Vlt(o,e,r)};var Wlt=(t,e)=>{let r=new SAe.Sync(t),o=!0,a,n;try{try{a=fl.openSync(t.file,\"r+\")}catch(p){if(p.code===\"ENOENT\")a=fl.openSync(t.file,\"w+\");else throw p}let u=fl.fstatSync(a),A=Buffer.alloc(512);e:for(n=0;n<u.size;n+=512){for(let E=0,I=0;E<512;E+=I){if(I=fl.readSync(a,A,E,A.length-E,n+E),n===0&&A[0]===31&&A[1]===139)throw new Error(\"cannot append to compressed archives\");if(!I)break e}let p=new FAe(A);if(!p.cksumValid)break;let h=512*Math.ceil(p.size/512);if(n+h+512>u.size)break;n+=h,t.mtimeCache&&t.mtimeCache.set(p.path,p.mtime)}o=!1,Klt(t,r,n,a,e)}finally{if(o)try{fl.closeSync(a)}catch{}}},Klt=(t,e,r,o,a)=>{let n=new xAe.WriteStreamSync(t.file,{fd:o,start:r});e.pipe(n),zlt(e,a)},Vlt=(t,e,r)=>{e=Array.from(e);let o=new SAe(t),a=(u,A,p)=>{let h=(C,R)=>{C?fl.close(u,L=>p(C)):p(null,R)},E=0;if(A===0)return h(null,0);let I=0,v=Buffer.alloc(512),x=(C,R)=>{if(C)return h(C);if(I+=R,I<512&&R)return fl.read(u,v,I,v.length-I,E+I,x);if(E===0&&v[0]===31&&v[1]===139)return h(new Error(\"cannot append to compressed archives\"));if(I<512)return h(null,E);let L=new FAe(v);if(!L.cksumValid)return h(null,E);let U=512*Math.ceil(L.size/512);if(E+U+512>A||(E+=U+512,E>=A))return h(null,E);t.mtimeCache&&t.mtimeCache.set(L.path,L.mtime),I=0,fl.read(u,v,0,512,E,x)};fl.read(u,v,0,512,E,x)},n=new Promise((u,A)=>{o.on(\"error\",A);let p=\"r+\",h=(E,I)=>{if(E&&E.code===\"ENOENT\"&&p===\"r+\")return p=\"w+\",fl.open(t.file,p,h);if(E)return A(E);fl.fstat(I,(v,x)=>{if(v)return fl.close(I,()=>A(v));a(I,x.size,(C,R)=>{if(C)return A(C);let L=new xAe.WriteStream(t.file,{fd:I,start:R});o.pipe(L),L.on(\"error\",A),L.on(\"close\",u),RAe(o,e)})})};fl.open(t.file,p,h)});return r?n.then(r,r):n},zlt=(t,e)=>{e.forEach(r=>{r.charAt(0)===\"@\"?kAe({file:QAe.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:o=>t.add(o)}):t.add(r)}),t.end()},RAe=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)===\"@\")return kAe({file:QAe.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:o=>t.add(o)}).then(o=>RAe(t,e));t.add(r)}t.end()}});var LAe=_((EUt,NAe)=>{\"use strict\";var Jlt=Ay(),Xlt=x3();NAe.exports=(t,e,r)=>{let o=Jlt(t);if(!o.file)throw new TypeError(\"file is required\");if(o.gzip)throw new TypeError(\"cannot append to compressed archives\");if(!e||!Array.isArray(e)||!e.length)throw new TypeError(\"no files or directories specified\");return e=Array.from(e),Zlt(o),Xlt(o,e,r)};var Zlt=t=>{let e=t.filter;t.mtimeCache||(t.mtimeCache=new Map),t.filter=e?(r,o)=>e(r,o)&&!(t.mtimeCache.get(r)>o.mtime):(r,o)=>!(t.mtimeCache.get(r)>o.mtime)}});var UAe=_((CUt,OAe)=>{var{promisify:MAe}=ve(\"util\"),Ih=ve(\"fs\"),$lt=t=>{if(!t)t={mode:511,fs:Ih};else if(typeof t==\"object\")t={mode:511,fs:Ih,...t};else if(typeof t==\"number\")t={mode:t,fs:Ih};else if(typeof t==\"string\")t={mode:parseInt(t,8),fs:Ih};else throw new TypeError(\"invalid options argument\");return t.mkdir=t.mkdir||t.fs.mkdir||Ih.mkdir,t.mkdirAsync=MAe(t.mkdir),t.stat=t.stat||t.fs.stat||Ih.stat,t.statAsync=MAe(t.stat),t.statSync=t.statSync||t.fs.statSync||Ih.statSync,t.mkdirSync=t.mkdirSync||t.fs.mkdirSync||Ih.mkdirSync,t};OAe.exports=$lt});var HAe=_((wUt,_Ae)=>{var ect=process.platform,{resolve:tct,parse:rct}=ve(\"path\"),nct=t=>{if(/\\0/.test(t))throw Object.assign(new TypeError(\"path must be a string without null bytes\"),{path:t,code:\"ERR_INVALID_ARG_VALUE\"});if(t=tct(t),ect===\"win32\"){let e=/[*|\"<>?:]/,{root:r}=rct(t);if(e.test(t.substr(r.length)))throw Object.assign(new Error(\"Illegal characters in path.\"),{path:t,code:\"EINVAL\"})}return t};_Ae.exports=nct});var WAe=_((IUt,YAe)=>{var{dirname:qAe}=ve(\"path\"),jAe=(t,e,r=void 0)=>r===e?Promise.resolve():t.statAsync(e).then(o=>o.isDirectory()?r:void 0,o=>o.code===\"ENOENT\"?jAe(t,qAe(e),e):void 0),GAe=(t,e,r=void 0)=>{if(r!==e)try{return t.statSync(e).isDirectory()?r:void 0}catch(o){return o.code===\"ENOENT\"?GAe(t,qAe(e),e):void 0}};YAe.exports={findMade:jAe,findMadeSync:GAe}});var F3=_((BUt,VAe)=>{var{dirname:KAe}=ve(\"path\"),k3=(t,e,r)=>{e.recursive=!1;let o=KAe(t);return o===t?e.mkdirAsync(t,e).catch(a=>{if(a.code!==\"EISDIR\")throw a}):e.mkdirAsync(t,e).then(()=>r||t,a=>{if(a.code===\"ENOENT\")return k3(o,e).then(n=>k3(t,e,n));if(a.code!==\"EEXIST\"&&a.code!==\"EROFS\")throw a;return e.statAsync(t).then(n=>{if(n.isDirectory())return r;throw a},()=>{throw a})})},Q3=(t,e,r)=>{let o=KAe(t);if(e.recursive=!1,o===t)try{return e.mkdirSync(t,e)}catch(a){if(a.code!==\"EISDIR\")throw a;return}try{return e.mkdirSync(t,e),r||t}catch(a){if(a.code===\"ENOENT\")return Q3(t,e,Q3(o,e,r));if(a.code!==\"EEXIST\"&&a.code!==\"EROFS\")throw a;try{if(!e.statSync(t).isDirectory())throw a}catch{throw a}}};VAe.exports={mkdirpManual:k3,mkdirpManualSync:Q3}});var XAe=_((vUt,JAe)=>{var{dirname:zAe}=ve(\"path\"),{findMade:ict,findMadeSync:sct}=WAe(),{mkdirpManual:oct,mkdirpManualSync:act}=F3(),lct=(t,e)=>(e.recursive=!0,zAe(t)===t?e.mkdirAsync(t,e):ict(e,t).then(o=>e.mkdirAsync(t,e).then(()=>o).catch(a=>{if(a.code===\"ENOENT\")return oct(t,e);throw a}))),cct=(t,e)=>{if(e.recursive=!0,zAe(t)===t)return e.mkdirSync(t,e);let o=sct(e,t);try{return e.mkdirSync(t,e),o}catch(a){if(a.code===\"ENOENT\")return act(t,e);throw a}};JAe.exports={mkdirpNative:lct,mkdirpNativeSync:cct}});var tfe=_((DUt,efe)=>{var ZAe=ve(\"fs\"),uct=process.version,R3=uct.replace(/^v/,\"\").split(\".\"),$Ae=+R3[0]>10||+R3[0]==10&&+R3[1]>=12,Act=$Ae?t=>t.mkdir===ZAe.mkdir:()=>!1,fct=$Ae?t=>t.mkdirSync===ZAe.mkdirSync:()=>!1;efe.exports={useNative:Act,useNativeSync:fct}});var afe=_((PUt,ofe)=>{var ky=UAe(),Qy=HAe(),{mkdirpNative:rfe,mkdirpNativeSync:nfe}=XAe(),{mkdirpManual:ife,mkdirpManualSync:sfe}=F3(),{useNative:pct,useNativeSync:hct}=tfe(),Fy=(t,e)=>(t=Qy(t),e=ky(e),pct(e)?rfe(t,e):ife(t,e)),gct=(t,e)=>(t=Qy(t),e=ky(e),hct(e)?nfe(t,e):sfe(t,e));Fy.sync=gct;Fy.native=(t,e)=>rfe(Qy(t),ky(e));Fy.manual=(t,e)=>ife(Qy(t),ky(e));Fy.nativeSync=(t,e)=>nfe(Qy(t),ky(e));Fy.manualSync=(t,e)=>sfe(Qy(t),ky(e));ofe.exports=Fy});var hfe=_((bUt,pfe)=>{\"use strict\";var $l=ve(\"fs\"),Lg=ve(\"path\"),dct=$l.lchown?\"lchown\":\"chown\",mct=$l.lchownSync?\"lchownSync\":\"chownSync\",cfe=$l.lchown&&!process.version.match(/v1[1-9]+\\./)&&!process.version.match(/v10\\.[6-9]/),lfe=(t,e,r)=>{try{return $l[mct](t,e,r)}catch(o){if(o.code!==\"ENOENT\")throw o}},yct=(t,e,r)=>{try{return $l.chownSync(t,e,r)}catch(o){if(o.code!==\"ENOENT\")throw o}},Ect=cfe?(t,e,r,o)=>a=>{!a||a.code!==\"EISDIR\"?o(a):$l.chown(t,e,r,o)}:(t,e,r,o)=>o,T3=cfe?(t,e,r)=>{try{return lfe(t,e,r)}catch(o){if(o.code!==\"EISDIR\")throw o;yct(t,e,r)}}:(t,e,r)=>lfe(t,e,r),Cct=process.version,ufe=(t,e,r)=>$l.readdir(t,e,r),wct=(t,e)=>$l.readdirSync(t,e);/^v4\\./.test(Cct)&&(ufe=(t,e,r)=>$l.readdir(t,r));var Dx=(t,e,r,o)=>{$l[dct](t,e,r,Ect(t,e,r,a=>{o(a&&a.code!==\"ENOENT\"?a:null)}))},Afe=(t,e,r,o,a)=>{if(typeof e==\"string\")return $l.lstat(Lg.resolve(t,e),(n,u)=>{if(n)return a(n.code!==\"ENOENT\"?n:null);u.name=e,Afe(t,u,r,o,a)});if(e.isDirectory())N3(Lg.resolve(t,e.name),r,o,n=>{if(n)return a(n);let u=Lg.resolve(t,e.name);Dx(u,r,o,a)});else{let n=Lg.resolve(t,e.name);Dx(n,r,o,a)}},N3=(t,e,r,o)=>{ufe(t,{withFileTypes:!0},(a,n)=>{if(a){if(a.code===\"ENOENT\")return o();if(a.code!==\"ENOTDIR\"&&a.code!==\"ENOTSUP\")return o(a)}if(a||!n.length)return Dx(t,e,r,o);let u=n.length,A=null,p=h=>{if(!A){if(h)return o(A=h);if(--u===0)return Dx(t,e,r,o)}};n.forEach(h=>Afe(t,h,e,r,p))})},Ict=(t,e,r,o)=>{if(typeof e==\"string\")try{let a=$l.lstatSync(Lg.resolve(t,e));a.name=e,e=a}catch(a){if(a.code===\"ENOENT\")return;throw a}e.isDirectory()&&ffe(Lg.resolve(t,e.name),r,o),T3(Lg.resolve(t,e.name),r,o)},ffe=(t,e,r)=>{let o;try{o=wct(t,{withFileTypes:!0})}catch(a){if(a.code===\"ENOENT\")return;if(a.code===\"ENOTDIR\"||a.code===\"ENOTSUP\")return T3(t,e,r);throw a}return o&&o.length&&o.forEach(a=>Ict(t,a,e,r)),T3(t,e,r)};pfe.exports=N3;N3.sync=ffe});var yfe=_((SUt,L3)=>{\"use strict\";var gfe=afe(),ec=ve(\"fs\"),Px=ve(\"path\"),dfe=hfe(),Vc=dy(),bx=class extends Error{constructor(e,r){super(\"Cannot extract through symbolic link\"),this.path=r,this.symlink=e}get name(){return\"SylinkError\"}},Sx=class extends Error{constructor(e,r){super(r+\": Cannot cd into '\"+e+\"'\"),this.path=e,this.code=r}get name(){return\"CwdError\"}},xx=(t,e)=>t.get(Vc(e)),T1=(t,e,r)=>t.set(Vc(e),r),Bct=(t,e)=>{ec.stat(t,(r,o)=>{(r||!o.isDirectory())&&(r=new Sx(t,r&&r.code||\"ENOTDIR\")),e(r)})};L3.exports=(t,e,r)=>{t=Vc(t);let o=e.umask,a=e.mode|448,n=(a&o)!==0,u=e.uid,A=e.gid,p=typeof u==\"number\"&&typeof A==\"number\"&&(u!==e.processUid||A!==e.processGid),h=e.preserve,E=e.unlink,I=e.cache,v=Vc(e.cwd),x=(L,U)=>{L?r(L):(T1(I,t,!0),U&&p?dfe(U,u,A,z=>x(z)):n?ec.chmod(t,a,r):r())};if(I&&xx(I,t)===!0)return x();if(t===v)return Bct(t,x);if(h)return gfe(t,{mode:a}).then(L=>x(null,L),x);let R=Vc(Px.relative(v,t)).split(\"/\");kx(v,R,a,I,E,v,null,x)};var kx=(t,e,r,o,a,n,u,A)=>{if(!e.length)return A(null,u);let p=e.shift(),h=Vc(Px.resolve(t+\"/\"+p));if(xx(o,h))return kx(h,e,r,o,a,n,u,A);ec.mkdir(h,r,mfe(h,e,r,o,a,n,u,A))},mfe=(t,e,r,o,a,n,u,A)=>p=>{p?ec.lstat(t,(h,E)=>{if(h)h.path=h.path&&Vc(h.path),A(h);else if(E.isDirectory())kx(t,e,r,o,a,n,u,A);else if(a)ec.unlink(t,I=>{if(I)return A(I);ec.mkdir(t,r,mfe(t,e,r,o,a,n,u,A))});else{if(E.isSymbolicLink())return A(new bx(t,t+\"/\"+e.join(\"/\")));A(p)}}):(u=u||t,kx(t,e,r,o,a,n,u,A))},vct=t=>{let e=!1,r=\"ENOTDIR\";try{e=ec.statSync(t).isDirectory()}catch(o){r=o.code}finally{if(!e)throw new Sx(t,r)}};L3.exports.sync=(t,e)=>{t=Vc(t);let r=e.umask,o=e.mode|448,a=(o&r)!==0,n=e.uid,u=e.gid,A=typeof n==\"number\"&&typeof u==\"number\"&&(n!==e.processUid||u!==e.processGid),p=e.preserve,h=e.unlink,E=e.cache,I=Vc(e.cwd),v=L=>{T1(E,t,!0),L&&A&&dfe.sync(L,n,u),a&&ec.chmodSync(t,o)};if(E&&xx(E,t)===!0)return v();if(t===I)return vct(I),v();if(p)return v(gfe.sync(t,o));let C=Vc(Px.relative(I,t)).split(\"/\"),R=null;for(let L=C.shift(),U=I;L&&(U+=\"/\"+L);L=C.shift())if(U=Vc(Px.resolve(U)),!xx(E,U))try{ec.mkdirSync(U,o),R=R||U,T1(E,U,!0)}catch{let te=ec.lstatSync(U);if(te.isDirectory()){T1(E,U,!0);continue}else if(h){ec.unlinkSync(U),ec.mkdirSync(U,o),R=R||U,T1(E,U,!0);continue}else if(te.isSymbolicLink())return new bx(U,U+\"/\"+C.join(\"/\"))}return v(R)}});var O3=_((xUt,Efe)=>{var M3=Object.create(null),{hasOwnProperty:Dct}=Object.prototype;Efe.exports=t=>(Dct.call(M3,t)||(M3[t]=t.normalize(\"NFKD\")),M3[t])});var Bfe=_((kUt,Ife)=>{var Cfe=ve(\"assert\"),Pct=O3(),bct=Ey(),{join:wfe}=ve(\"path\"),Sct=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,xct=Sct===\"win32\";Ife.exports=()=>{let t=new Map,e=new Map,r=h=>h.split(\"/\").slice(0,-1).reduce((I,v)=>(I.length&&(v=wfe(I[I.length-1],v)),I.push(v||\"/\"),I),[]),o=new Set,a=h=>{let E=e.get(h);if(!E)throw new Error(\"function does not have any path reservations\");return{paths:E.paths.map(I=>t.get(I)),dirs:[...E.dirs].map(I=>t.get(I))}},n=h=>{let{paths:E,dirs:I}=a(h);return E.every(v=>v[0]===h)&&I.every(v=>v[0]instanceof Set&&v[0].has(h))},u=h=>o.has(h)||!n(h)?!1:(o.add(h),h(()=>A(h)),!0),A=h=>{if(!o.has(h))return!1;let{paths:E,dirs:I}=e.get(h),v=new Set;return E.forEach(x=>{let C=t.get(x);Cfe.equal(C[0],h),C.length===1?t.delete(x):(C.shift(),typeof C[0]==\"function\"?v.add(C[0]):C[0].forEach(R=>v.add(R)))}),I.forEach(x=>{let C=t.get(x);Cfe(C[0]instanceof Set),C[0].size===1&&C.length===1?t.delete(x):C[0].size===1?(C.shift(),v.add(C[0])):C[0].delete(h)}),o.delete(h),v.forEach(x=>u(x)),!0};return{check:n,reserve:(h,E)=>{h=xct?[\"win32 parallelization disabled\"]:h.map(v=>Pct(bct(wfe(v))).toLowerCase());let I=new Set(h.map(v=>r(v)).reduce((v,x)=>v.concat(x)));return e.set(E,{dirs:I,paths:h}),h.forEach(v=>{let x=t.get(v);x?x.push(E):t.set(v,[E])}),I.forEach(v=>{let x=t.get(v);x?x[x.length-1]instanceof Set?x[x.length-1].add(E):x.push(new Set([E])):t.set(v,[new Set([E])])}),u(E)}}}});var Pfe=_((QUt,Dfe)=>{var kct=process.platform,Qct=kct===\"win32\",Fct=global.__FAKE_TESTING_FS__||ve(\"fs\"),{O_CREAT:Rct,O_TRUNC:Tct,O_WRONLY:Nct,UV_FS_O_FILEMAP:vfe=0}=Fct.constants,Lct=Qct&&!!vfe,Mct=512*1024,Oct=vfe|Tct|Rct|Nct;Dfe.exports=Lct?t=>t<Mct?Oct:\"w\":()=>\"w\"});var K3=_((FUt,_fe)=>{\"use strict\";var Uct=ve(\"assert\"),_ct=Ix(),vn=ve(\"fs\"),Hct=Sy(),Gf=ve(\"path\"),Mfe=yfe(),bfe=KU(),qct=Bfe(),jct=VU(),pl=dy(),Gct=Ey(),Yct=O3(),Sfe=Symbol(\"onEntry\"),H3=Symbol(\"checkFs\"),xfe=Symbol(\"checkFs2\"),Rx=Symbol(\"pruneCache\"),q3=Symbol(\"isReusable\"),tc=Symbol(\"makeFs\"),j3=Symbol(\"file\"),G3=Symbol(\"directory\"),Tx=Symbol(\"link\"),kfe=Symbol(\"symlink\"),Qfe=Symbol(\"hardlink\"),Ffe=Symbol(\"unsupported\"),Rfe=Symbol(\"checkPath\"),Bh=Symbol(\"mkdir\"),To=Symbol(\"onError\"),Qx=Symbol(\"pending\"),Tfe=Symbol(\"pend\"),Ry=Symbol(\"unpend\"),U3=Symbol(\"ended\"),_3=Symbol(\"maybeClose\"),Y3=Symbol(\"skip\"),N1=Symbol(\"doChown\"),L1=Symbol(\"uid\"),M1=Symbol(\"gid\"),O1=Symbol(\"checkedCwd\"),Ofe=ve(\"crypto\"),Ufe=Pfe(),Wct=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,U1=Wct===\"win32\",Kct=(t,e)=>{if(!U1)return vn.unlink(t,e);let r=t+\".DELETE.\"+Ofe.randomBytes(16).toString(\"hex\");vn.rename(t,r,o=>{if(o)return e(o);vn.unlink(r,e)})},Vct=t=>{if(!U1)return vn.unlinkSync(t);let e=t+\".DELETE.\"+Ofe.randomBytes(16).toString(\"hex\");vn.renameSync(t,e),vn.unlinkSync(e)},Nfe=(t,e,r)=>t===t>>>0?t:e===e>>>0?e:r,Lfe=t=>Yct(Gct(pl(t))).toLowerCase(),zct=(t,e)=>{e=Lfe(e);for(let r of t.keys()){let o=Lfe(r);(o===e||o.indexOf(e+\"/\")===0)&&t.delete(r)}},Jct=t=>{for(let e of t.keys())t.delete(e)},_1=class extends _ct{constructor(e){if(e||(e={}),e.ondone=r=>{this[U3]=!0,this[_3]()},super(e),this[O1]=!1,this.reservations=qct(),this.transform=typeof e.transform==\"function\"?e.transform:null,this.writable=!0,this.readable=!1,this[Qx]=0,this[U3]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid==\"number\"||typeof e.gid==\"number\"){if(typeof e.uid!=\"number\"||typeof e.gid!=\"number\")throw new TypeError(\"cannot set owner without number uid and gid\");if(e.preserveOwner)throw new TypeError(\"cannot preserve owner in archive and also set owner explicitly\");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!=\"number\"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||U1,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=pl(Gf.resolve(e.cwd||process.cwd())),this.strip=+e.strip||0,this.processUmask=e.noChmod?0:process.umask(),this.umask=typeof e.umask==\"number\"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on(\"entry\",r=>this[Sfe](r))}warn(e,r,o={}){return(e===\"TAR_BAD_ARCHIVE\"||e===\"TAR_ABORT\")&&(o.recoverable=!1),super.warn(e,r,o)}[_3](){this[U3]&&this[Qx]===0&&(this.emit(\"prefinish\"),this.emit(\"finish\"),this.emit(\"end\"),this.emit(\"close\"))}[Rfe](e){if(this.strip){let r=pl(e.path).split(\"/\");if(r.length<this.strip)return!1;if(e.path=r.slice(this.strip).join(\"/\"),e.type===\"Link\"){let o=pl(e.linkpath).split(\"/\");if(o.length>=this.strip)e.linkpath=o.slice(this.strip).join(\"/\");else return!1}}if(!this.preservePaths){let r=pl(e.path),o=r.split(\"/\");if(o.includes(\"..\")||U1&&/^[a-z]:\\.\\.$/i.test(o[0]))return this.warn(\"TAR_ENTRY_ERROR\",\"path contains '..'\",{entry:e,path:r}),!1;let[a,n]=jct(r);a&&(e.path=n,this.warn(\"TAR_ENTRY_INFO\",`stripping ${a} from absolute path`,{entry:e,path:r}))}if(Gf.isAbsolute(e.path)?e.absolute=pl(Gf.resolve(e.path)):e.absolute=pl(Gf.resolve(this.cwd,e.path)),!this.preservePaths&&e.absolute.indexOf(this.cwd+\"/\")!==0&&e.absolute!==this.cwd)return this.warn(\"TAR_ENTRY_ERROR\",\"path escaped extraction target\",{entry:e,path:pl(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!==\"Directory\"&&e.type!==\"GNUDumpDir\")return!1;if(this.win32){let{root:r}=Gf.win32.parse(e.absolute);e.absolute=r+bfe.encode(e.absolute.substr(r.length));let{root:o}=Gf.win32.parse(e.path);e.path=o+bfe.encode(e.path.substr(o.length))}return!0}[Sfe](e){if(!this[Rfe](e))return e.resume();switch(Uct.equal(typeof e.absolute,\"string\"),e.type){case\"Directory\":case\"GNUDumpDir\":e.mode&&(e.mode=e.mode|448);case\"File\":case\"OldFile\":case\"ContiguousFile\":case\"Link\":case\"SymbolicLink\":return this[H3](e);case\"CharacterDevice\":case\"BlockDevice\":case\"FIFO\":default:return this[Ffe](e)}}[To](e,r){e.name===\"CwdError\"?this.emit(\"error\",e):(this.warn(\"TAR_ENTRY_ERROR\",e,{entry:r}),this[Ry](),r.resume())}[Bh](e,r,o){Mfe(pl(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r,noChmod:this.noChmod},o)}[N1](e){return this.forceChown||this.preserveOwner&&(typeof e.uid==\"number\"&&e.uid!==this.processUid||typeof e.gid==\"number\"&&e.gid!==this.processGid)||typeof this.uid==\"number\"&&this.uid!==this.processUid||typeof this.gid==\"number\"&&this.gid!==this.processGid}[L1](e){return Nfe(this.uid,e.uid,this.processUid)}[M1](e){return Nfe(this.gid,e.gid,this.processGid)}[j3](e,r){let o=e.mode&4095||this.fmode,a=new Hct.WriteStream(e.absolute,{flags:Ufe(e.size),mode:o,autoClose:!1});a.on(\"error\",p=>{a.fd&&vn.close(a.fd,()=>{}),a.write=()=>!0,this[To](p,e),r()});let n=1,u=p=>{if(p){a.fd&&vn.close(a.fd,()=>{}),this[To](p,e),r();return}--n===0&&vn.close(a.fd,h=>{h?this[To](h,e):this[Ry](),r()})};a.on(\"finish\",p=>{let h=e.absolute,E=a.fd;if(e.mtime&&!this.noMtime){n++;let I=e.atime||new Date,v=e.mtime;vn.futimes(E,I,v,x=>x?vn.utimes(h,I,v,C=>u(C&&x)):u())}if(this[N1](e)){n++;let I=this[L1](e),v=this[M1](e);vn.fchown(E,I,v,x=>x?vn.chown(h,I,v,C=>u(C&&x)):u())}u()});let A=this.transform&&this.transform(e)||e;A!==e&&(A.on(\"error\",p=>{this[To](p,e),r()}),e.pipe(A)),A.pipe(a)}[G3](e,r){let o=e.mode&4095||this.dmode;this[Bh](e.absolute,o,a=>{if(a){this[To](a,e),r();return}let n=1,u=A=>{--n===0&&(r(),this[Ry](),e.resume())};e.mtime&&!this.noMtime&&(n++,vn.utimes(e.absolute,e.atime||new Date,e.mtime,u)),this[N1](e)&&(n++,vn.chown(e.absolute,this[L1](e),this[M1](e),u)),u()})}[Ffe](e){e.unsupported=!0,this.warn(\"TAR_ENTRY_UNSUPPORTED\",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[kfe](e,r){this[Tx](e,e.linkpath,\"symlink\",r)}[Qfe](e,r){let o=pl(Gf.resolve(this.cwd,e.linkpath));this[Tx](e,o,\"link\",r)}[Tfe](){this[Qx]++}[Ry](){this[Qx]--,this[_3]()}[Y3](e){this[Ry](),e.resume()}[q3](e,r){return e.type===\"File\"&&!this.unlink&&r.isFile()&&r.nlink<=1&&!U1}[H3](e){this[Tfe]();let r=[e.path];e.linkpath&&r.push(e.linkpath),this.reservations.reserve(r,o=>this[xfe](e,o))}[Rx](e){e.type===\"SymbolicLink\"?Jct(this.dirCache):e.type!==\"Directory\"&&zct(this.dirCache,e.absolute)}[xfe](e,r){this[Rx](e);let o=A=>{this[Rx](e),r(A)},a=()=>{this[Bh](this.cwd,this.dmode,A=>{if(A){this[To](A,e),o();return}this[O1]=!0,n()})},n=()=>{if(e.absolute!==this.cwd){let A=pl(Gf.dirname(e.absolute));if(A!==this.cwd)return this[Bh](A,this.dmode,p=>{if(p){this[To](p,e),o();return}u()})}u()},u=()=>{vn.lstat(e.absolute,(A,p)=>{if(p&&(this.keep||this.newer&&p.mtime>e.mtime)){this[Y3](e),o();return}if(A||this[q3](e,p))return this[tc](null,e,o);if(p.isDirectory()){if(e.type===\"Directory\"){let h=!this.noChmod&&e.mode&&(p.mode&4095)!==e.mode,E=I=>this[tc](I,e,o);return h?vn.chmod(e.absolute,e.mode,E):E()}if(e.absolute!==this.cwd)return vn.rmdir(e.absolute,h=>this[tc](h,e,o))}if(e.absolute===this.cwd)return this[tc](null,e,o);Kct(e.absolute,h=>this[tc](h,e,o))})};this[O1]?n():a()}[tc](e,r,o){if(e){this[To](e,r),o();return}switch(r.type){case\"File\":case\"OldFile\":case\"ContiguousFile\":return this[j3](r,o);case\"Link\":return this[Qfe](r,o);case\"SymbolicLink\":return this[kfe](r,o);case\"Directory\":case\"GNUDumpDir\":return this[G3](r,o)}}[Tx](e,r,o,a){vn[o](r,e.absolute,n=>{n?this[To](n,e):(this[Ry](),e.resume()),a()})}},Fx=t=>{try{return[null,t()]}catch(e){return[e,null]}},W3=class extends _1{[tc](e,r){return super[tc](e,r,()=>{})}[H3](e){if(this[Rx](e),!this[O1]){let n=this[Bh](this.cwd,this.dmode);if(n)return this[To](n,e);this[O1]=!0}if(e.absolute!==this.cwd){let n=pl(Gf.dirname(e.absolute));if(n!==this.cwd){let u=this[Bh](n,this.dmode);if(u)return this[To](u,e)}}let[r,o]=Fx(()=>vn.lstatSync(e.absolute));if(o&&(this.keep||this.newer&&o.mtime>e.mtime))return this[Y3](e);if(r||this[q3](e,o))return this[tc](null,e);if(o.isDirectory()){if(e.type===\"Directory\"){let u=!this.noChmod&&e.mode&&(o.mode&4095)!==e.mode,[A]=u?Fx(()=>{vn.chmodSync(e.absolute,e.mode)}):[];return this[tc](A,e)}let[n]=Fx(()=>vn.rmdirSync(e.absolute));this[tc](n,e)}let[a]=e.absolute===this.cwd?[]:Fx(()=>Vct(e.absolute));this[tc](a,e)}[j3](e,r){let o=e.mode&4095||this.fmode,a=A=>{let p;try{vn.closeSync(n)}catch(h){p=h}(A||p)&&this[To](A||p,e),r()},n;try{n=vn.openSync(e.absolute,Ufe(e.size),o)}catch(A){return a(A)}let u=this.transform&&this.transform(e)||e;u!==e&&(u.on(\"error\",A=>this[To](A,e)),e.pipe(u)),u.on(\"data\",A=>{try{vn.writeSync(n,A,0,A.length)}catch(p){a(p)}}),u.on(\"end\",A=>{let p=null;if(e.mtime&&!this.noMtime){let h=e.atime||new Date,E=e.mtime;try{vn.futimesSync(n,h,E)}catch(I){try{vn.utimesSync(e.absolute,h,E)}catch{p=I}}}if(this[N1](e)){let h=this[L1](e),E=this[M1](e);try{vn.fchownSync(n,h,E)}catch(I){try{vn.chownSync(e.absolute,h,E)}catch{p=p||I}}}a(p)})}[G3](e,r){let o=e.mode&4095||this.dmode,a=this[Bh](e.absolute,o);if(a){this[To](a,e),r();return}if(e.mtime&&!this.noMtime)try{vn.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch{}if(this[N1](e))try{vn.chownSync(e.absolute,this[L1](e),this[M1](e))}catch{}r(),e.resume()}[Bh](e,r){try{return Mfe.sync(pl(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r})}catch(o){return o}}[Tx](e,r,o,a){try{vn[o+\"Sync\"](r,e.absolute),a(),e.resume()}catch(n){return this[To](n,e)}}};_1.Sync=W3;_fe.exports=_1});var Yfe=_((RUt,Gfe)=>{\"use strict\";var Xct=Ay(),Nx=K3(),qfe=ve(\"fs\"),jfe=Sy(),Hfe=ve(\"path\"),V3=Ey();Gfe.exports=(t,e,r)=>{typeof t==\"function\"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e==\"function\"&&(r=e,e=null),e?e=Array.from(e):e=[];let o=Xct(t);if(o.sync&&typeof r==\"function\")throw new TypeError(\"callback not supported for sync tar functions\");if(!o.file&&typeof r==\"function\")throw new TypeError(\"callback only supported with file option\");return e.length&&Zct(o,e),o.file&&o.sync?$ct(o):o.file?eut(o,r):o.sync?tut(o):rut(o)};var Zct=(t,e)=>{let r=new Map(e.map(n=>[V3(n),!0])),o=t.filter,a=(n,u)=>{let A=u||Hfe.parse(n).root||\".\",p=n===A?!1:r.has(n)?r.get(n):a(Hfe.dirname(n),A);return r.set(n,p),p};t.filter=o?(n,u)=>o(n,u)&&a(V3(n)):n=>a(V3(n))},$ct=t=>{let e=new Nx.Sync(t),r=t.file,o=qfe.statSync(r),a=t.maxReadSize||16*1024*1024;new jfe.ReadStreamSync(r,{readSize:a,size:o.size}).pipe(e)},eut=(t,e)=>{let r=new Nx(t),o=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((u,A)=>{r.on(\"error\",A),r.on(\"close\",u),qfe.stat(a,(p,h)=>{if(p)A(p);else{let E=new jfe.ReadStream(a,{readSize:o,size:h.size});E.on(\"error\",A),E.pipe(r)}})});return e?n.then(e,e):n},tut=t=>new Nx.Sync(t),rut=t=>new Nx(t)});var Wfe=_(As=>{\"use strict\";As.c=As.create=bAe();As.r=As.replace=x3();As.t=As.list=Bx();As.u=As.update=LAe();As.x=As.extract=Yfe();As.Pack=lx();As.Unpack=K3();As.Parse=Ix();As.ReadEntry=YS();As.WriteEntry=i3();As.Header=yy();As.Pax=KS();As.types=_U()});var z3,Kfe,vh,H1,q1,Vfe=Et(()=>{z3=Ze(eg()),Kfe=ve(\"worker_threads\"),vh=Symbol(\"kTaskInfo\"),H1=class{constructor(e,r){this.fn=e;this.limit=(0,z3.default)(r.poolSize)}run(e){return this.limit(()=>this.fn(e))}},q1=class{constructor(e,r){this.source=e;this.workers=[];this.limit=(0,z3.default)(r.poolSize),this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let o=this.workers.pop();o?o.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new Kfe.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,\"--unhandled-rejections=strict\"]});return e.on(\"message\",r=>{if(!e[vh])throw new Error(\"Assertion failed: Worker sent a result without having a task assigned\");e[vh].resolve(r),e[vh]=null,e.unref(),this.workers.push(e)}),e.on(\"error\",r=>{e[vh]?.reject(r),e[vh]=null}),e.on(\"exit\",r=>{r!==0&&e[vh]?.reject(new Error(`Worker exited with code ${r}`)),e[vh]=null}),e}run(e){return this.limit(()=>{let r=this.workers.pop()??this.createWorker();return r.ref(),new Promise((o,a)=>{r[vh]={resolve:o,reject:a},r.postMessage(e)})})}}});var Jfe=_((MUt,zfe)=>{var J3;zfe.exports.getContent=()=>(typeof J3>\"u\"&&(J3=ve(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),J3)});var $i={};Vt($i,{convertToZip:()=>out,convertToZipWorker:()=>$3,extractArchiveTo:()=>tpe,getDefaultTaskPool:()=>$fe,getTaskPoolForConfiguration:()=>epe,makeArchiveFromDirectory:()=>sut});function nut(t,e){switch(t){case\"async\":return new H1($3,{poolSize:e});case\"workers\":return new q1((0,Z3.getContent)(),{poolSize:e});default:throw new Error(`Assertion failed: Unknown value ${t} for taskPoolMode`)}}function $fe(){return typeof X3>\"u\"&&(X3=nut(\"workers\",Xi.availableParallelism())),X3}function epe(t){return typeof t>\"u\"?$fe():al(iut,t,()=>{let e=t.get(\"taskPoolMode\"),r=t.get(\"taskPoolConcurrency\");switch(e){case\"async\":return new H1($3,{poolSize:r});case\"workers\":return new q1((0,Z3.getContent)(),{poolSize:r});default:throw new Error(`Assertion failed: Unknown value ${e} for taskPoolMode`)}})}async function $3(t){let{tmpFile:e,tgz:r,compressionLevel:o,extractBufferOpts:a}=t,n=new Zi(e,{create:!0,level:o,stats:wa.makeDefaultStats()}),u=Buffer.from(r.buffer,r.byteOffset,r.byteLength);return await tpe(u,n,a),n.saveAndClose(),e}async function sut(t,{baseFs:e=new Tn,prefixPath:r=It.root,compressionLevel:o,inMemory:a=!1}={}){let n;if(a)n=new Zi(null,{level:o});else{let A=await oe.mktempPromise(),p=V.join(A,\"archive.zip\");n=new Zi(p,{create:!0,level:o})}let u=V.resolve(It.root,r);return await n.copyPromise(u,t,{baseFs:e,stableTime:!0,stableSort:!0}),n}async function out(t,e={}){let r=await oe.mktempPromise(),o=V.join(r,\"archive.zip\"),a=e.compressionLevel??e.configuration?.get(\"compressionLevel\")??\"mixed\",n={prefixPath:e.prefixPath,stripComponents:e.stripComponents};return await(e.taskPool??epe(e.configuration)).run({tmpFile:o,tgz:t,compressionLevel:a,extractBufferOpts:n}),new Zi(o,{level:e.compressionLevel})}async function*aut(t){let e=new Zfe.default.Parse,r=new Xfe.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on(\"entry\",o=>{r.write(o)}),e.on(\"error\",o=>{r.destroy(o)}),e.on(\"close\",()=>{r.destroyed||r.end()}),e.end(t);for await(let o of r){let a=o;yield a,a.resume()}}async function tpe(t,e,{stripComponents:r=0,prefixPath:o=It.dot}={}){function a(n){if(n.path[0]===\"/\")return!0;let u=n.path.split(/\\//g);return!!(u.some(A=>A===\"..\")||u.length<=r)}for await(let n of aut(t)){if(a(n))continue;let u=V.normalize(ue.toPortablePath(n.path)).replace(/\\/$/,\"\").split(/\\//g);if(u.length<=r)continue;let A=u.slice(r).join(\"/\"),p=V.join(o,A),h=420;switch((n.type===\"Directory\"||(n.mode??0)&73)&&(h|=73),n.type){case\"Directory\":e.mkdirpSync(V.dirname(p),{chmod:493,utimes:[Bi.SAFE_TIME,Bi.SAFE_TIME]}),e.mkdirSync(p,{mode:h}),e.utimesSync(p,Bi.SAFE_TIME,Bi.SAFE_TIME);break;case\"OldFile\":case\"File\":e.mkdirpSync(V.dirname(p),{chmod:493,utimes:[Bi.SAFE_TIME,Bi.SAFE_TIME]}),e.writeFileSync(p,await km(n),{mode:h}),e.utimesSync(p,Bi.SAFE_TIME,Bi.SAFE_TIME);break;case\"SymbolicLink\":e.mkdirpSync(V.dirname(p),{chmod:493,utimes:[Bi.SAFE_TIME,Bi.SAFE_TIME]}),e.symlinkSync(n.linkpath,p),e.lutimesSync(p,Bi.SAFE_TIME,Bi.SAFE_TIME);break}}return e}var Xfe,Zfe,Z3,X3,iut,rpe=Et(()=>{Ge();Pt();nA();Xfe=ve(\"stream\"),Zfe=Ze(Wfe());Vfe();ql();Z3=Ze(Jfe());iut=new WeakMap});var ipe=_((e_,npe)=>{(function(t,e){typeof e_==\"object\"?npe.exports=e():typeof define==\"function\"&&define.amd?define(e):t.treeify=e()})(e_,function(){function t(a,n){var u=n?\"\\u2514\":\"\\u251C\";return a?u+=\"\\u2500 \":u+=\"\\u2500\\u2500\\u2510\",u}function e(a,n){var u=[];for(var A in a)a.hasOwnProperty(A)&&(n&&typeof a[A]==\"function\"||u.push(A));return u}function r(a,n,u,A,p,h,E){var I=\"\",v=0,x,C,R=A.slice(0);if(R.push([n,u])&&A.length>0&&(A.forEach(function(U,z){z>0&&(I+=(U[1]?\" \":\"\\u2502\")+\"  \"),!C&&U[0]===n&&(C=!0)}),I+=t(a,u)+a,p&&(typeof n!=\"object\"||n instanceof Date)&&(I+=\": \"+n),C&&(I+=\" (circular ref.)\"),E(I)),!C&&typeof n==\"object\"){var L=e(n,h);L.forEach(function(U){x=++v===L.length,r(U,n[U],x,R,p,h,E)})}}var o={};return o.asLines=function(a,n,u,A){var p=typeof u!=\"function\"?u:!1;r(\".\",a,!1,[],n,p,A||u)},o.asTree=function(a,n,u){var A=\"\";return r(\".\",a,!1,[],n,u,function(p){A+=p+`\n`}),A},o})});var fs={};Vt(fs,{emitList:()=>lut,emitTree:()=>lpe,treeNodeToJson:()=>ape,treeNodeToTreeify:()=>ope});function ope(t,{configuration:e}){let r={},o=0,a=(n,u)=>{let A=Array.isArray(n)?n.entries():Object.entries(n);for(let[p,h]of A){if(!h)continue;let{label:E,value:I,children:v}=h,x=[];typeof E<\"u\"&&x.push(fg(e,E,2)),typeof I<\"u\"&&x.push(Ot(e,I[0],I[1])),x.length===0&&x.push(fg(e,`${p}`,2));let C=x.join(\": \").trim(),R=`\\0${o++}\\0`,L=u[`${R}${C}`]={};typeof v<\"u\"&&a(v,L)}};if(typeof t.children>\"u\")throw new Error(\"The root node must only contain children\");return a(t.children,r),r}function ape(t){let e=r=>{if(typeof r.children>\"u\"){if(typeof r.value>\"u\")throw new Error(\"Assertion failed: Expected a value to be set if the children are missing\");return pg(r.value[0],r.value[1])}let o=Array.isArray(r.children)?r.children.entries():Object.entries(r.children??{}),a=Array.isArray(r.children)?[]:{};for(let[n,u]of o)u&&(a[cut(n)]=e(u));return typeof r.value>\"u\"?a:{value:pg(r.value[0],r.value[1]),children:a}};return e(t)}function lut(t,{configuration:e,stdout:r,json:o}){let a=t.map(n=>({value:n}));lpe({children:a},{configuration:e,stdout:r,json:o})}function lpe(t,{configuration:e,stdout:r,json:o,separators:a=0}){if(o){let u=Array.isArray(t.children)?t.children.values():Object.values(t.children??{});for(let A of u)A&&r.write(`${JSON.stringify(ape(A))}\n`);return}let n=(0,spe.asTree)(ope(t,{configuration:e}),!1,!1);if(n=n.replace(/\\0[0-9]+\\0/g,\"\"),a>=1&&(n=n.replace(/^([├└]─)/gm,`\\u2502\n$1`).replace(/^│\\n/,\"\")),a>=2)for(let u=0;u<2;++u)n=n.replace(/^([│ ].{2}[├│ ].{2}[^\\n]+\\n)(([│ ]).{2}[├└].{2}[^\\n]*\\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3  \\u2502\n$2`).replace(/^│\\n/,\"\");if(a>=3)throw new Error(\"Only the first two levels are accepted by treeUtils.emitTree\");r.write(n)}function cut(t){return typeof t==\"string\"?t.replace(/^\\0[0-9]+\\0/,\"\"):t}var spe,cpe=Et(()=>{spe=Ze(ipe());jl()});function j1(t){let e=t.match(uut);if(!e?.groups)throw new Error(\"Assertion failed: Expected the checksum to match the requested pattern\");let r=e.groups.cacheVersion?parseInt(e.groups.cacheVersion):null;return{cacheKey:e.groups.cacheKey??null,cacheVersion:r,cacheSpec:e.groups.cacheSpec??null,hash:e.groups.hash}}var upe,t_,r_,Lx,Gr,uut,n_=Et(()=>{Ge();Pt();Pt();nA();upe=ve(\"crypto\"),t_=Ze(ve(\"fs\"));Wl();rh();ql();So();r_=Qm(process.env.YARN_CACHE_CHECKPOINT_OVERRIDE??process.env.YARN_CACHE_VERSION_OVERRIDE??9),Lx=Qm(process.env.YARN_CACHE_VERSION_OVERRIDE??10),Gr=class t{constructor(e,{configuration:r,immutable:o=r.get(\"enableImmutableCache\"),check:a=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,upe.randomBytes)(8).toString(\"hex\")}.tmp`;this.configuration=r,this.cwd=e,this.immutable=o,this.check=a;let{cacheSpec:n,cacheKey:u}=t.getCacheKey(r);this.cacheSpec=n,this.cacheKey=u}static async find(e,{immutable:r,check:o}={}){let a=new t(e.get(\"cacheFolder\"),{configuration:e,immutable:r,check:o});return await a.setup(),a}static getCacheKey(e){let r=e.get(\"compressionLevel\"),o=r!==\"mixed\"?`c${r}`:\"\";return{cacheKey:[Lx,o].join(\"\"),cacheSpec:o}}get mirrorCwd(){if(!this.configuration.get(\"enableMirror\"))return null;let e=`${this.configuration.get(\"globalFolder\")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${Hm(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,r){let a=j1(r).hash.slice(0,10);return`${Hm(e)}-${a}.zip`}isChecksumCompatible(e){if(e===null)return!1;let{cacheVersion:r,cacheSpec:o}=j1(e);if(r===null||r<r_)return!1;let a=this.configuration.get(\"cacheMigrationMode\");return!(r<Lx&&a===\"always\"||o!==this.cacheSpec&&a!==\"required-only\")}getLocatorPath(e,r){return this.mirrorCwd===null?V.resolve(this.cwd,this.getVersionFilename(e)):r===null?V.resolve(this.cwd,this.getVersionFilename(e)):V.resolve(this.cwd,this.getChecksumFilename(e,r))}getLocatorMirrorPath(e){let r=this.mirrorCwd;return r!==null?V.resolve(r,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get(\"enableGlobalCache\"))if(this.immutable){if(!await oe.existsPromise(this.cwd))throw new Jt(56,\"Cache path does not exist.\")}else{await oe.mkdirPromise(this.cwd,{recursive:!0});let e=V.resolve(this.cwd,\".gitignore\");await oe.changeFilePromise(e,`/.gitignore\n*.flock\n*.tmp\n`)}(this.mirrorCwd||!this.immutable)&&await oe.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,r,{onHit:o,onMiss:a,loader:n,...u}){let A=this.getLocatorMirrorPath(e),p=new Tn,h=()=>{let de=new Zi,Be=V.join(It.root,zM(e));return de.mkdirSync(Be,{recursive:!0}),de.writeJsonSync(V.join(Be,dr.manifest),{name:rn(e),mocked:!0}),de},E=async(de,{isColdHit:Be,controlPath:Ee=null})=>{if(Ee===null&&u.unstablePackages?.has(e.locatorHash))return{isValid:!0,hash:null};let g=r&&!Be?j1(r).cacheKey:this.cacheKey,me=!u.skipIntegrityCheck||!r?`${g}/${await Ib(de)}`:r;if(Ee!==null){let Ae=!u.skipIntegrityCheck||!r?`${this.cacheKey}/${await Ib(Ee)}`:r;if(me!==Ae)throw new Jt(18,\"The remote archive doesn't match the local checksum - has the local cache been corrupted?\")}let we=null;switch(r!==null&&me!==r&&(this.check?we=\"throw\":j1(r).cacheKey!==j1(me).cacheKey?we=\"update\":we=this.configuration.get(\"checksumBehavior\")),we){case null:case\"update\":return{isValid:!0,hash:me};case\"ignore\":return{isValid:!0,hash:r};case\"reset\":return{isValid:!1,hash:r};default:case\"throw\":throw new Jt(18,\"The remote archive doesn't match the expected checksum\")}},I=async de=>{if(!n)throw new Error(`Cache check required but no loader configured for ${qr(this.configuration,e)}`);let Be=await n(),Ee=Be.getRealPath();Be.saveAndClose(),await oe.chmodPromise(Ee,420);let g=await E(de,{controlPath:Ee,isColdHit:!1});if(!g.isValid)throw new Error(\"Assertion failed: Expected a valid checksum\");return g.hash},v=async()=>{if(A===null||!await oe.existsPromise(A)){let de=await n(),Be=de.getRealPath();return de.saveAndClose(),{source:\"loader\",path:Be}}return{source:\"mirror\",path:A}},x=async()=>{if(!n)throw new Error(`Cache entry required but missing for ${qr(this.configuration,e)}`);if(this.immutable)throw new Jt(56,`Cache entry required but missing for ${qr(this.configuration,e)}`);let{path:de,source:Be}=await v(),{hash:Ee}=await E(de,{isColdHit:!0}),g=this.getLocatorPath(e,Ee),me=[];Be!==\"mirror\"&&A!==null&&me.push(async()=>{let Ae=`${A}${this.cacheId}`;await oe.copyFilePromise(de,Ae,t_.default.constants.COPYFILE_FICLONE),await oe.chmodPromise(Ae,420),await oe.renamePromise(Ae,A)}),(!u.mirrorWriteOnly||A===null)&&me.push(async()=>{let Ae=`${g}${this.cacheId}`;await oe.copyFilePromise(de,Ae,t_.default.constants.COPYFILE_FICLONE),await oe.chmodPromise(Ae,420),await oe.renamePromise(Ae,g)});let we=u.mirrorWriteOnly?A??g:g;return await Promise.all(me.map(Ae=>Ae())),[!1,we,Ee]},C=async()=>{let Be=(async()=>{let Ee=u.unstablePackages?.has(e.locatorHash),g=Ee||!r||this.isChecksumCompatible(r)?this.getLocatorPath(e,r):null,me=g!==null?this.markedFiles.has(g)||await p.existsPromise(g):!1,we=!!u.mockedPackages?.has(e.locatorHash)&&(!this.check||!me),Ae=we||me,ne=Ae?o:a;if(ne&&ne(),Ae){let Z=null,xe=g;if(!we)if(this.check)Z=await I(xe);else{let Ne=await E(xe,{isColdHit:!1});if(Ne.isValid)Z=Ne.hash;else return x()}return[we,xe,Z]}else{if(this.immutable&&Ee)throw new Jt(56,`Cache entry required but missing for ${qr(this.configuration,e)}; consider defining ${pe.pretty(this.configuration,\"supportedArchitectures\",pe.Type.CODE)} to cache packages for multiple systems`);return x()}})();this.mutexes.set(e.locatorHash,Be);try{return await Be}finally{this.mutexes.delete(e.locatorHash)}};for(let de;de=this.mutexes.get(e.locatorHash);)await de;let[R,L,U]=await C();R||this.markedFiles.add(L);let z,te=R?()=>h():()=>new Zi(L,{baseFs:p,readOnly:!0}),ae=new Gd(()=>uL(()=>z=te(),de=>`Failed to open the cache entry for ${qr(this.configuration,e)}: ${de}`),V),le=new Hu(L,{baseFs:ae,pathUtils:V}),ce=()=>{z?.discardAndClose()},Ce=u.unstablePackages?.has(e.locatorHash)?null:U;return[le,ce,Ce]}},uut=/^(?:(?<cacheKey>(?<cacheVersion>[0-9]+)(?<cacheSpec>.*))\\/)?(?<hash>.*)$/});var Mx,Ape=Et(()=>{Mx=(r=>(r[r.SCRIPT=0]=\"SCRIPT\",r[r.SHELLCODE=1]=\"SHELLCODE\",r))(Mx||{})});var Aut,Ty,i_=Et(()=>{Pt();Nl();xf();So();Aut=[[/^(git(?:\\+(?:https|ssh))?:\\/\\/.*(?:\\.git)?)#(.*)$/,(t,e,r,o)=>`${r}#commit=${o}`],[/^https:\\/\\/((?:[^/]+?)@)?codeload\\.github\\.com\\/([^/]+\\/[^/]+)\\/tar\\.gz\\/([0-9a-f]+)$/,(t,e,r=\"\",o,a)=>`https://${r}github.com/${o}.git#commit=${a}`],[/^https:\\/\\/((?:[^/]+?)@)?github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?#([0-9a-f]+)$/,(t,e,r=\"\",o,a)=>`https://${r}github.com/${o}.git#commit=${a}`],[/^https?:\\/\\/[^/]+\\/(?:[^/]+\\/)*(?:@.+(?:\\/|(?:%2f)))?([^/]+)\\/(?:-|download)\\/\\1-[^/]+\\.tgz(?:#|$)/,t=>`npm:${t}`],[/^https:\\/\\/npm\\.pkg\\.github\\.com\\/download\\/(?:@[^/]+)\\/(?:[^/]+)\\/(?:[^/]+)\\/(?:[0-9a-f]+)(?:#|$)/,t=>`npm:${t}`],[/^https:\\/\\/npm\\.fontawesome\\.com\\/(?:@[^/]+)\\/([^/]+)\\/-\\/([^/]+)\\/\\1-\\2.tgz(?:#|$)/,t=>`npm:${t}`],[/^https?:\\/\\/[^/]+\\/.*\\/(@[^/]+)\\/([^/]+)\\/-\\/\\1\\/\\2-(?:[.\\d\\w-]+)\\.tgz(?:#|$)/,(t,e)=>bb({protocol:\"npm:\",source:null,selector:t,params:{__archiveUrl:e}})],[/^[^/]+\\.tgz#[0-9a-f]+$/,t=>`npm:${t}`]],Ty=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:r}){let o=V.join(e.cwd,dr.lockfile);if(!oe.existsSync(o))return;let a=await oe.readFilePromise(o,\"utf8\"),n=Ki(a);if(Object.hasOwn(n,\"__metadata\"))return;let u=this.resolutions=new Map;for(let A of Object.keys(n)){let p=jI(A);if(!p){r.reportWarning(14,`Failed to parse the string \"${A}\" into a proper descriptor`);continue}let h=Qa(p.range)?In(p,`npm:${p.range}`):p,{version:E,resolved:I}=n[A];if(!I)continue;let v;for(let[C,R]of Aut){let L=I.match(C);if(L){v=R(E,...L);break}}if(!v){r.reportWarning(14,`${jn(e.configuration,h)}: Only some patterns can be imported from legacy lockfiles (not \"${I}\")`);continue}let x=h;try{let C=dg(h.range),R=jI(C.selector,!0);R&&(x=R)}catch{}u.set(h.descriptorHash,Rs(x,v))}}supportsDescriptor(e,r){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error(\"Assertion failed: This resolver doesn't support resolving locators to packages\")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!this.resolutions)throw new Error(\"Assertion failed: The resolution store should have been setup\");let a=this.resolutions.get(e.descriptorHash);if(!a)throw new Error(\"Assertion failed: The resolution should have been registered\");let n=YM(a),u=o.project.configuration.normalizeDependency(n);return await this.resolver.getCandidates(u,r,o)}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){throw new Error(\"Assertion failed: This resolver doesn't support resolving locators to packages\")}}});var AA,fpe=Et(()=>{Wl();I1();jl();AA=class extends Zs{constructor({configuration:r,stdout:o,suggestInstall:a=!0}){super();this.errorCount=0;TI(this,{configuration:r}),this.configuration=r,this.stdout=o,this.suggestInstall=a}static async start(r,o){let a=new this(r);try{await o(a)}catch(n){a.reportExceptionOnce(n)}finally{await a.finalize()}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(r){}reportCacheMiss(r){}startSectionSync(r,o){return o()}async startSectionPromise(r,o){return await o()}startTimerSync(r,o,a){return(typeof o==\"function\"?o:a)()}async startTimerPromise(r,o,a){return await(typeof o==\"function\"?o:a)()}reportSeparator(){}reportInfo(r,o){}reportWarning(r,o){}reportError(r,o){this.errorCount+=1,this.stdout.write(`${Ot(this.configuration,\"\\u27A4\",\"redBright\")} ${this.formatNameWithHyperlink(r)}: ${o}\n`)}reportProgress(r){return{...Promise.resolve().then(async()=>{for await(let{}of r);}),stop:()=>{}}}reportJson(r){}reportFold(r,o){}async finalize(){this.errorCount>0&&(this.stdout.write(`\n`),this.stdout.write(`${Ot(this.configuration,\"\\u27A4\",\"redBright\")} Errors happened when preparing the environment required to run this command.\n`),this.suggestInstall&&this.stdout.write(`${Ot(this.configuration,\"\\u27A4\",\"redBright\")} This might be caused by packages being missing from the lockfile, in which case running \"yarn install\" might help.\n`))}formatNameWithHyperlink(r){return AU(r,{configuration:this.configuration,json:!1})}}});var Ny,s_=Et(()=>{So();Ny=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return!!(r.project.storedResolutions.get(e.descriptorHash)||r.project.originalPackages.has(vb(e).locatorHash))}supportsLocator(e,r){return!!(r.project.originalPackages.has(e.locatorHash)&&!r.project.lockfileNeedsRefresh)}shouldPersistResolution(e,r){throw new Error(\"The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes\")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,o){let a=o.project.storedResolutions.get(e.descriptorHash);if(a){let u=o.project.originalPackages.get(a);if(u)return[u]}let n=o.project.originalPackages.get(vb(e).locatorHash);if(n)return[n];throw new Error(\"Resolution expected from the lockfile data\")}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let o=r.project.originalPackages.get(e.locatorHash);if(!o)throw new Error(\"The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache\");return o}}});function Yf(){}function fut(t,e,r,o,a){for(var n=0,u=e.length,A=0,p=0;n<u;n++){var h=e[n];if(h.removed){if(h.value=t.join(o.slice(p,p+h.count)),p+=h.count,n&&e[n-1].added){var I=e[n-1];e[n-1]=e[n],e[n]=I}}else{if(!h.added&&a){var E=r.slice(A,A+h.count);E=E.map(function(x,C){var R=o[p+C];return R.length>x.length?R:x}),h.value=t.join(E)}else h.value=t.join(r.slice(A,A+h.count));A+=h.count,h.added||(p+=h.count)}}var v=e[u-1];return u>1&&typeof v.value==\"string\"&&(v.added||v.removed)&&t.equals(\"\",v.value)&&(e[u-2].value+=v.value,e.pop()),e}function put(t){return{newPos:t.newPos,components:t.components.slice(0)}}function hut(t,e){if(typeof t==\"function\")e.callback=t;else if(t)for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}function gpe(t,e,r){return r=hut(r,{ignoreWhitespace:!0}),u_.diff(t,e,r)}function gut(t,e,r){return A_.diff(t,e,r)}function Ox(t){\"@babel/helpers - typeof\";return typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?Ox=function(e){return typeof e}:Ox=function(e){return e&&typeof Symbol==\"function\"&&e.constructor===Symbol&&e!==Symbol.prototype?\"symbol\":typeof e},Ox(t)}function o_(t){return yut(t)||Eut(t)||Cut(t)||wut()}function yut(t){if(Array.isArray(t))return a_(t)}function Eut(t){if(typeof Symbol<\"u\"&&Symbol.iterator in Object(t))return Array.from(t)}function Cut(t,e){if(t){if(typeof t==\"string\")return a_(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);if(r===\"Object\"&&t.constructor&&(r=t.constructor.name),r===\"Map\"||r===\"Set\")return Array.from(t);if(r===\"Arguments\"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return a_(t,e)}}function a_(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,o=new Array(e);r<e;r++)o[r]=t[r];return o}function wut(){throw new TypeError(`Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function l_(t,e,r,o,a){e=e||[],r=r||[],o&&(t=o(a,t));var n;for(n=0;n<e.length;n+=1)if(e[n]===t)return r[n];var u;if(Iut.call(t)===\"[object Array]\"){for(e.push(t),u=new Array(t.length),r.push(u),n=0;n<t.length;n+=1)u[n]=l_(t[n],e,r,o,a);return e.pop(),r.pop(),u}if(t&&t.toJSON&&(t=t.toJSON()),Ox(t)===\"object\"&&t!==null){e.push(t),u={},r.push(u);var A=[],p;for(p in t)t.hasOwnProperty(p)&&A.push(p);for(A.sort(),n=0;n<A.length;n+=1)p=A[n],u[p]=l_(t[p],e,r,o,p);e.pop(),r.pop()}else u=t;return u}function dpe(t,e,r,o,a,n,u){u||(u={}),typeof u.context>\"u\"&&(u.context=4);var A=gut(r,o,u);if(!A)return;A.push({value:\"\",lines:[]});function p(U){return U.map(function(z){return\" \"+z})}for(var h=[],E=0,I=0,v=[],x=1,C=1,R=function(z){var te=A[z],ae=te.lines||te.value.replace(/\\n$/,\"\").split(`\n`);if(te.lines=ae,te.added||te.removed){var le;if(!E){var ce=A[z-1];E=x,I=C,ce&&(v=u.context>0?p(ce.lines.slice(-u.context)):[],E-=v.length,I-=v.length)}(le=v).push.apply(le,o_(ae.map(function(Ae){return(te.added?\"+\":\"-\")+Ae}))),te.added?C+=ae.length:x+=ae.length}else{if(E)if(ae.length<=u.context*2&&z<A.length-2){var Ce;(Ce=v).push.apply(Ce,o_(p(ae)))}else{var de,Be=Math.min(ae.length,u.context);(de=v).push.apply(de,o_(p(ae.slice(0,Be))));var Ee={oldStart:E,oldLines:x-E+Be,newStart:I,newLines:C-I+Be,lines:v};if(z>=A.length-2&&ae.length<=u.context){var g=/\\n$/.test(r),me=/\\n$/.test(o),we=ae.length==0&&v.length>Ee.oldLines;!g&&we&&r.length>0&&v.splice(Ee.oldLines,0,\"\\\\ No newline at end of file\"),(!g&&!we||!me)&&v.push(\"\\\\ No newline at end of file\")}h.push(Ee),E=0,I=0,v=[]}x+=ae.length,C+=ae.length}},L=0;L<A.length;L++)R(L);return{oldFileName:t,newFileName:e,oldHeader:a,newHeader:n,hunks:h}}var u3t,ppe,hpe,u_,A_,dut,mut,Iut,G1,c_,f_=Et(()=>{Yf.prototype={diff:function(e,r){var o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a=o.callback;typeof o==\"function\"&&(a=o,o={}),this.options=o;var n=this;function u(R){return a?(setTimeout(function(){a(void 0,R)},0),!0):R}e=this.castInput(e),r=this.castInput(r),e=this.removeEmpty(this.tokenize(e)),r=this.removeEmpty(this.tokenize(r));var A=r.length,p=e.length,h=1,E=A+p;o.maxEditLength&&(E=Math.min(E,o.maxEditLength));var I=[{newPos:-1,components:[]}],v=this.extractCommon(I[0],r,e,0);if(I[0].newPos+1>=A&&v+1>=p)return u([{value:this.join(r),count:r.length}]);function x(){for(var R=-1*h;R<=h;R+=2){var L=void 0,U=I[R-1],z=I[R+1],te=(z?z.newPos:0)-R;U&&(I[R-1]=void 0);var ae=U&&U.newPos+1<A,le=z&&0<=te&&te<p;if(!ae&&!le){I[R]=void 0;continue}if(!ae||le&&U.newPos<z.newPos?(L=put(z),n.pushComponent(L.components,void 0,!0)):(L=U,L.newPos++,n.pushComponent(L.components,!0,void 0)),te=n.extractCommon(L,r,e,R),L.newPos+1>=A&&te+1>=p)return u(fut(n,L.components,r,e,n.useLongestToken));I[R]=L}h++}if(a)(function R(){setTimeout(function(){if(h>E)return a();x()||R()},0)})();else for(;h<=E;){var C=x();if(C)return C}},pushComponent:function(e,r,o){var a=e[e.length-1];a&&a.added===r&&a.removed===o?e[e.length-1]={count:a.count+1,added:r,removed:o}:e.push({count:1,added:r,removed:o})},extractCommon:function(e,r,o,a){for(var n=r.length,u=o.length,A=e.newPos,p=A-a,h=0;A+1<n&&p+1<u&&this.equals(r[A+1],o[p+1]);)A++,p++,h++;return h&&e.components.push({count:h}),e.newPos=A,p},equals:function(e,r){return this.options.comparator?this.options.comparator(e,r):e===r||this.options.ignoreCase&&e.toLowerCase()===r.toLowerCase()},removeEmpty:function(e){for(var r=[],o=0;o<e.length;o++)e[o]&&r.push(e[o]);return r},castInput:function(e){return e},tokenize:function(e){return e.split(\"\")},join:function(e){return e.join(\"\")}};u3t=new Yf;ppe=/^[A-Za-z\\xC0-\\u02C6\\u02C8-\\u02D7\\u02DE-\\u02FF\\u1E00-\\u1EFF]+$/,hpe=/\\S/,u_=new Yf;u_.equals=function(t,e){return this.options.ignoreCase&&(t=t.toLowerCase(),e=e.toLowerCase()),t===e||this.options.ignoreWhitespace&&!hpe.test(t)&&!hpe.test(e)};u_.tokenize=function(t){for(var e=t.split(/([^\\S\\r\\n]+|[()[\\]{}'\"\\r\\n]|\\b)/),r=0;r<e.length-1;r++)!e[r+1]&&e[r+2]&&ppe.test(e[r])&&ppe.test(e[r+2])&&(e[r]+=e[r+2],e.splice(r+1,2),r--);return e};A_=new Yf;A_.tokenize=function(t){var e=[],r=t.split(/(\\n|\\r\\n)/);r[r.length-1]||r.pop();for(var o=0;o<r.length;o++){var a=r[o];o%2&&!this.options.newlineIsToken?e[e.length-1]+=a:(this.options.ignoreWhitespace&&(a=a.trim()),e.push(a))}return e};dut=new Yf;dut.tokenize=function(t){return t.split(/(\\S.+?[.!?])(?=\\s+|$)/)};mut=new Yf;mut.tokenize=function(t){return t.split(/([{}:;,]|\\s+)/)};Iut=Object.prototype.toString,G1=new Yf;G1.useLongestToken=!0;G1.tokenize=A_.tokenize;G1.castInput=function(t){var e=this.options,r=e.undefinedReplacement,o=e.stringifyReplacer,a=o===void 0?function(n,u){return typeof u>\"u\"?r:u}:o;return typeof t==\"string\"?t:JSON.stringify(l_(t,null,null,a),a,\"  \")};G1.equals=function(t,e){return Yf.prototype.equals.call(G1,t.replace(/,([\\r\\n])/g,\"$1\"),e.replace(/,([\\r\\n])/g,\"$1\"))};c_=new Yf;c_.tokenize=function(t){return t.slice()};c_.join=c_.removeEmpty=function(t){return t}});var ype=_((f3t,mpe)=>{var But=Hl(),vut=Ym(),Dut=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,Put=/^\\w*$/;function but(t,e){if(But(t))return!1;var r=typeof t;return r==\"number\"||r==\"symbol\"||r==\"boolean\"||t==null||vut(t)?!0:Put.test(t)||!Dut.test(t)||e!=null&&t in Object(e)}mpe.exports=but});var wpe=_((p3t,Cpe)=>{var Epe=PP(),Sut=\"Expected a function\";function p_(t,e){if(typeof t!=\"function\"||e!=null&&typeof e!=\"function\")throw new TypeError(Sut);var r=function(){var o=arguments,a=e?e.apply(this,o):o[0],n=r.cache;if(n.has(a))return n.get(a);var u=t.apply(this,o);return r.cache=n.set(a,u)||n,u};return r.cache=new(p_.Cache||Epe),r}p_.Cache=Epe;Cpe.exports=p_});var Bpe=_((h3t,Ipe)=>{var xut=wpe(),kut=500;function Qut(t){var e=xut(t,function(o){return r.size===kut&&r.clear(),o}),r=e.cache;return e}Ipe.exports=Qut});var h_=_((g3t,vpe)=>{var Fut=Bpe(),Rut=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,Tut=/\\\\(\\\\)?/g,Nut=Fut(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(\"\"),t.replace(Rut,function(r,o,a,n){e.push(a?n.replace(Tut,\"$1\"):o||r)}),e});vpe.exports=Nut});var Mg=_((d3t,Dpe)=>{var Lut=Hl(),Mut=ype(),Out=h_(),Uut=C1();function _ut(t,e){return Lut(t)?t:Mut(t,e)?[t]:Out(Uut(t))}Dpe.exports=_ut});var Ly=_((m3t,Ppe)=>{var Hut=Ym(),qut=1/0;function jut(t){if(typeof t==\"string\"||Hut(t))return t;var e=t+\"\";return e==\"0\"&&1/t==-qut?\"-0\":e}Ppe.exports=jut});var Ux=_((y3t,bpe)=>{var Gut=Mg(),Yut=Ly();function Wut(t,e){e=Gut(e,t);for(var r=0,o=e.length;t!=null&&r<o;)t=t[Yut(e[r++])];return r&&r==o?t:void 0}bpe.exports=Wut});var g_=_((E3t,xpe)=>{var Kut=qP(),Vut=Mg(),zut=II(),Spe=sl(),Jut=Ly();function Xut(t,e,r,o){if(!Spe(t))return t;e=Vut(e,t);for(var a=-1,n=e.length,u=n-1,A=t;A!=null&&++a<n;){var p=Jut(e[a]),h=r;if(p===\"__proto__\"||p===\"constructor\"||p===\"prototype\")return t;if(a!=u){var E=A[p];h=o?o(E,p,A):void 0,h===void 0&&(h=Spe(E)?E:zut(e[a+1])?[]:{})}Kut(A,p,h),A=A[p]}return t}xpe.exports=Xut});var Qpe=_((C3t,kpe)=>{var Zut=Ux(),$ut=g_(),eAt=Mg();function tAt(t,e,r){for(var o=-1,a=e.length,n={};++o<a;){var u=e[o],A=Zut(t,u);r(A,u)&&$ut(n,eAt(u,t),A)}return n}kpe.exports=tAt});var Rpe=_((w3t,Fpe)=>{function rAt(t,e){return t!=null&&e in Object(t)}Fpe.exports=rAt});var d_=_((I3t,Tpe)=>{var nAt=Mg(),iAt=EI(),sAt=Hl(),oAt=II(),aAt=QP(),lAt=Ly();function cAt(t,e,r){e=nAt(e,t);for(var o=-1,a=e.length,n=!1;++o<a;){var u=lAt(e[o]);if(!(n=t!=null&&r(t,u)))break;t=t[u]}return n||++o!=a?n:(a=t==null?0:t.length,!!a&&aAt(a)&&oAt(u,a)&&(sAt(t)||iAt(t)))}Tpe.exports=cAt});var Lpe=_((B3t,Npe)=>{var uAt=Rpe(),AAt=d_();function fAt(t,e){return t!=null&&AAt(t,e,uAt)}Npe.exports=fAt});var Ope=_((v3t,Mpe)=>{var pAt=Qpe(),hAt=Lpe();function gAt(t,e){return pAt(t,e,function(r,o){return hAt(t,o)})}Mpe.exports=gAt});var qpe=_((D3t,Hpe)=>{var Upe=lg(),dAt=EI(),mAt=Hl(),_pe=Upe?Upe.isConcatSpreadable:void 0;function yAt(t){return mAt(t)||dAt(t)||!!(_pe&&t&&t[_pe])}Hpe.exports=yAt});var Ype=_((P3t,Gpe)=>{var EAt=xP(),CAt=qpe();function jpe(t,e,r,o,a){var n=-1,u=t.length;for(r||(r=CAt),a||(a=[]);++n<u;){var A=t[n];e>0&&r(A)?e>1?jpe(A,e-1,r,o,a):EAt(a,A):o||(a[a.length]=A)}return a}Gpe.exports=jpe});var Kpe=_((b3t,Wpe)=>{var wAt=Ype();function IAt(t){var e=t==null?0:t.length;return e?wAt(t,1):[]}Wpe.exports=IAt});var m_=_((S3t,Vpe)=>{var BAt=Kpe(),vAt=rL(),DAt=nL();function PAt(t){return DAt(vAt(t,void 0,BAt),t+\"\")}Vpe.exports=PAt});var y_=_((x3t,zpe)=>{var bAt=Ope(),SAt=m_(),xAt=SAt(function(t,e){return t==null?{}:bAt(t,e)});zpe.exports=xAt});var _x,Jpe=Et(()=>{Wl();_x=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return this.resolver.supportsDescriptor(e,r)}supportsLocator(e,r){return this.resolver.supportsLocator(e,r)}shouldPersistResolution(e,r){return this.resolver.shouldPersistResolution(e,r)}bindDescriptor(e,r,o){return this.resolver.bindDescriptor(e,r,o)}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,o){throw new Jt(20,`This package doesn't seem to be present in your lockfile; run \"yarn install\" to update the lockfile`)}async getSatisfying(e,r,o,a){throw new Jt(20,`This package doesn't seem to be present in your lockfile; run \"yarn install\" to update the lockfile`)}async resolve(e,r){throw new Jt(20,`This package doesn't seem to be present in your lockfile; run \"yarn install\" to update the lockfile`)}}});var ki,E_=Et(()=>{Wl();ki=class extends Zs{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,r){return r()}async startSectionPromise(e,r){return await r()}startTimerSync(e,r,o){return(typeof r==\"function\"?r:o)()}async startTimerPromise(e,r,o){return await(typeof r==\"function\"?r:o)()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(let{}of e);}),stop:()=>{}}}reportJson(e){}reportFold(e,r){}async finalize(){}}});var Xpe,My,C_=Et(()=>{Pt();Xpe=Ze(Cb());Gm();mg();jl();rh();xf();So();My=class{constructor(e,{project:r}){this.workspacesCwds=new Set;this.project=r,this.cwd=e}async setup(){this.manifest=await Ut.tryFind(this.cwd)??new Ut,this.relativeCwd=V.relative(this.project.cwd,this.cwd)||It.dot;let e=this.manifest.name?this.manifest.name:eA(null,`${this.computeCandidateName()}-${zi(this.relativeCwd).substring(0,6)}`);this.anchoredDescriptor=In(e,`${ei.protocol}${this.relativeCwd}`),this.anchoredLocator=Rs(e,`${ei.protocol}${this.relativeCwd}`);let r=this.manifest.workspaceDefinitions.map(({pattern:a})=>a);if(r.length===0)return;let o=await(0,Xpe.default)(r,{cwd:ue.fromPortablePath(this.cwd),onlyDirectories:!0,ignore:[\"**/node_modules\",\"**/.git\",\"**/.yarn\"]});o.sort(),await o.reduce(async(a,n)=>{let u=V.resolve(this.cwd,ue.toPortablePath(n)),A=await oe.existsPromise(V.join(u,\"package.json\"));await a,A&&this.workspacesCwds.add(u)},Promise.resolve())}get anchoredPackage(){let e=this.project.storedPackages.get(this.anchoredLocator.locatorHash);if(!e)throw new Error(`Assertion failed: Expected workspace ${YI(this.project.configuration,this)} (${Ot(this.project.configuration,V.join(this.cwd,dr.manifest),yt.PATH)}) to have been resolved. Run \"yarn install\" to update the lockfile`);return e}accepts(e){let r=e.indexOf(\":\"),o=r!==-1?e.slice(0,r+1):null,a=r!==-1?e.slice(r+1):e;if(o===ei.protocol&&V.normalize(a)===this.relativeCwd||o===ei.protocol&&(a===\"*\"||a===\"^\"||a===\"~\"))return!0;let n=Qa(a);return n?o===ei.protocol?n.test(this.manifest.version??\"0.0.0\"):this.project.configuration.get(\"enableTransparentWorkspaces\")&&this.manifest.version!==null?n.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?\"root-workspace\":`${V.basename(this.cwd)}`||\"unnamed-workspace\"}getRecursiveWorkspaceDependencies({dependencies:e=Ut.hardDependencies}={}){let r=new Set,o=a=>{for(let n of e)for(let u of a.manifest[n].values()){let A=this.project.tryWorkspaceByDescriptor(u);A===null||r.has(A)||(r.add(A),o(A))}};return o(this),r}getRecursiveWorkspaceDependents({dependencies:e=Ut.hardDependencies}={}){let r=new Set,o=a=>{for(let n of this.project.workspaces)e.some(A=>[...n.manifest[A].values()].some(p=>{let h=this.project.tryWorkspaceByDescriptor(p);return h!==null&&qI(h.anchoredLocator,a.anchoredLocator)}))&&!r.has(n)&&(r.add(n),o(n))};return o(this),r}getRecursiveWorkspaceChildren(){let e=new Set([this]);for(let r of e)for(let o of r.workspacesCwds){let a=this.project.workspacesByCwd.get(o);a&&e.add(a)}return e.delete(this),Array.from(e)}async persistManifest(){let e={};this.manifest.exportTo(e);let r=V.join(this.cwd,Ut.fileName),o=`${JSON.stringify(e,null,this.manifest.indent)}\n`;await oe.changeFilePromise(r,o,{automaticNewlines:!0}),this.manifest.raw=e}}});function NAt({project:t,allDescriptors:e,allResolutions:r,allPackages:o,accessibleLocators:a=new Set,optionalBuilds:n=new Set,peerRequirements:u=new Map,peerWarnings:A=[],peerRequirementNodes:p=new Map,volatileDescriptors:h=new Set}){let E=new Map,I=[],v=new Map,x=new Map,C=new Map,R=new Map,L=new Map(t.workspaces.map(le=>{let ce=le.anchoredLocator.locatorHash,Ce=o.get(ce);if(typeof Ce>\"u\")throw new Error(\"Assertion failed: The workspace should have an associated package\");return[ce,OI(Ce)]})),U=()=>{let le=oe.mktempSync(),ce=V.join(le,\"stacktrace.log\"),Ce=String(I.length+1).length,de=I.map((Be,Ee)=>`${`${Ee+1}.`.padStart(Ce,\" \")} ${ka(Be)}\n`).join(\"\");throw oe.writeFileSync(ce,de),oe.detachTemp(le),new Jt(45,`Encountered a stack overflow when resolving peer dependencies; cf ${ue.fromPortablePath(ce)}`)},z=le=>{let ce=r.get(le.descriptorHash);if(typeof ce>\"u\")throw new Error(\"Assertion failed: The resolution should have been registered\");let Ce=o.get(ce);if(!Ce)throw new Error(\"Assertion failed: The package could not be found\");return Ce},te=(le,ce,Ce,{top:de,optional:Be})=>{I.length>1e3&&U(),I.push(ce);let Ee=ae(le,ce,Ce,{top:de,optional:Be});return I.pop(),Ee},ae=(le,ce,Ce,{top:de,optional:Be})=>{if(Be||n.delete(ce.locatorHash),a.has(ce.locatorHash))return;a.add(ce.locatorHash);let Ee=o.get(ce.locatorHash);if(!Ee)throw new Error(`Assertion failed: The package (${qr(t.configuration,ce)}) should have been registered`);let g=[],me=new Map,we=[],Ae=[],ne=[],Z=[];for(let Ne of Array.from(Ee.dependencies.values())){if(Ee.peerDependencies.has(Ne.identHash)&&Ee.locatorHash!==de)continue;if(Pf(Ne))throw new Error(\"Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch\");h.delete(Ne.descriptorHash);let ht=Be;if(!ht){let be=Ee.dependenciesMeta.get(rn(Ne));if(typeof be<\"u\"){let et=be.get(null);typeof et<\"u\"&&et.optional&&(ht=!0)}}let H=r.get(Ne.descriptorHash);if(!H)throw new Error(`Assertion failed: The resolution (${jn(t.configuration,Ne)}) should have been registered`);let rt=L.get(H)||o.get(H);if(!rt)throw new Error(`Assertion failed: The package (${H}, resolved from ${jn(t.configuration,Ne)}) should have been registered`);if(rt.peerDependencies.size===0){te(Ne,rt,new Map,{top:de,optional:ht});continue}let Te,Fe,ke=new Set,Ye=new Map;we.push(()=>{Te=KM(Ne,ce.locatorHash),Fe=VM(rt,ce.locatorHash),Ee.dependencies.delete(Ne.identHash),Ee.dependencies.set(Te.identHash,Te),r.set(Te.descriptorHash,Fe.locatorHash),e.set(Te.descriptorHash,Te),o.set(Fe.locatorHash,Fe),g.push([rt,Te,Fe])}),Ae.push(()=>{R.set(Fe.locatorHash,Ye);for(let be of Fe.peerDependencies.values()){let Ue=al(me,be.identHash,()=>{let S=Ce.get(be.identHash)??null,w=Ee.dependencies.get(be.identHash);return!w&&HI(ce,be)&&(le.identHash===ce.identHash?w=le:(w=In(ce,le.range),e.set(w.descriptorHash,w),r.set(w.descriptorHash,ce.locatorHash),h.delete(w.descriptorHash),S=null)),w||(w=In(be,\"missing:\")),{subject:ce,ident:be,provided:w,root:!S,requests:new Map,hash:`p${zi(ce.locatorHash,be.identHash).slice(0,5)}`}}).provided;if(Ue.range===\"missing:\"&&Fe.dependencies.has(be.identHash)){Fe.peerDependencies.delete(be.identHash);continue}Ye.set(be.identHash,{requester:Fe,descriptor:be,meta:Fe.peerDependenciesMeta.get(rn(be)),children:new Map}),Fe.dependencies.set(be.identHash,Ue),Pf(Ue)&&Sm(C,Ue.descriptorHash).add(Fe.locatorHash),v.set(Ue.identHash,Ue),Ue.range===\"missing:\"&&ke.add(Ue.identHash)}Fe.dependencies=new Map(Fs(Fe.dependencies,([be,et])=>rn(et)))}),ne.push(()=>{if(!o.has(Fe.locatorHash))return;let be=E.get(rt.locatorHash);typeof be==\"number\"&&be>=2&&U();let et=E.get(rt.locatorHash),Ue=typeof et<\"u\"?et+1:1;E.set(rt.locatorHash,Ue),te(Te,Fe,Ye,{top:de,optional:ht}),E.set(rt.locatorHash,Ue-1)}),Z.push(()=>{let be=Ee.dependencies.get(Ne.identHash);if(typeof be>\"u\")throw new Error(\"Assertion failed: Expected the peer dependency to have been turned into a dependency\");let et=r.get(be.descriptorHash);if(typeof et>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");let Ue=R.get(et);if(typeof Ue>\"u\")throw new Error(\"Assertion failed: Expected the peer requests to be registered\");for(let S of me.values()){let w=Ue.get(S.ident.identHash);w&&(S.requests.set(be.descriptorHash,w),p.set(S.hash,S),S.root||Ce.get(S.ident.identHash)?.children.set(be.descriptorHash,w))}if(o.has(Fe.locatorHash))for(let S of ke)Fe.dependencies.delete(S)})}for(let Ne of[...we,...Ae])Ne();let xe;do{xe=!0;for(let[Ne,ht,H]of g){let rt=kI(x,Ne.locatorHash),Te=zi(...[...H.dependencies.values()].map(be=>{let et=be.range!==\"missing:\"?r.get(be.descriptorHash):\"missing:\";if(typeof et>\"u\")throw new Error(`Assertion failed: Expected the resolution for ${jn(t.configuration,be)} to have been registered`);return et===de?`${et} (top)`:et}),ht.identHash),Fe=rt.get(Te);if(typeof Fe>\"u\"){rt.set(Te,ht);continue}if(Fe===ht)continue;o.delete(H.locatorHash),e.delete(ht.descriptorHash),r.delete(ht.descriptorHash),a.delete(H.locatorHash);let ke=C.get(ht.descriptorHash)||[],Ye=[Ee.locatorHash,...ke];C.delete(ht.descriptorHash);for(let be of Ye){let et=o.get(be);typeof et>\"u\"||(et.dependencies.get(ht.identHash).descriptorHash!==Fe.descriptorHash&&(xe=!1),et.dependencies.set(ht.identHash,Fe))}for(let be of me.values())be.provided.descriptorHash===ht.descriptorHash&&(be.provided=Fe)}}while(!xe);for(let Ne of[...ne,...Z])Ne()};for(let le of t.workspaces){let ce=le.anchoredLocator;h.delete(le.anchoredDescriptor.descriptorHash),te(le.anchoredDescriptor,ce,new Map,{top:ce.locatorHash,optional:!1})}for(let le of p.values()){if(!le.root)continue;let ce=o.get(le.subject.locatorHash);if(typeof ce>\"u\")continue;for(let de of le.requests.values()){let Be=`p${zi(le.subject.locatorHash,rn(le.ident),de.requester.locatorHash).slice(0,5)}`;u.set(Be,{subject:le.subject.locatorHash,requested:le.ident,rootRequester:de.requester.locatorHash,allRequesters:Array.from(WI(de),Ee=>Ee.requester.locatorHash)})}let Ce=[...WI(le)];if(le.provided.range!==\"missing:\"){let de=z(le.provided),Be=de.version??\"0.0.0\",Ee=me=>{if(me.startsWith(ei.protocol)){if(!t.tryWorkspaceByLocator(de))return null;me=me.slice(ei.protocol.length),(me===\"^\"||me===\"~\")&&(me=\"*\")}return me},g=!0;for(let me of Ce){let we=Ee(me.descriptor.range);if(we===null){g=!1;continue}if(!tA(Be,we)){g=!1;let Ae=`p${zi(le.subject.locatorHash,rn(le.ident),me.requester.locatorHash).slice(0,5)}`;A.push({type:1,subject:ce,requested:le.ident,requester:me.requester,version:Be,hash:Ae,requirementCount:Ce.length})}}if(!g){let me=Ce.map(we=>Ee(we.descriptor.range));A.push({type:3,node:le,range:me.includes(null)?null:XM(me),hash:le.hash})}}else{let de=!0;for(let Be of Ce)if(!Be.meta?.optional){de=!1;let Ee=`p${zi(le.subject.locatorHash,rn(le.ident),Be.requester.locatorHash).slice(0,5)}`;A.push({type:0,subject:ce,requested:le.ident,requester:Be.requester,hash:Ee})}de||A.push({type:2,node:le,hash:le.hash})}}}function*LAt(t){let e=new Map;if(\"children\"in t)e.set(t,t);else for(let r of t.requests.values())e.set(r,r);for(let[r,o]of e){yield{request:r,root:o};for(let a of r.children.values())e.has(a)||e.set(a,o)}}function MAt(t,e){let r=[],o=[],a=!1;for(let n of t.peerWarnings)if(!(n.type===1||n.type===0)){if(!t.tryWorkspaceByLocator(n.node.subject)){a=!0;continue}if(n.type===3){let u=t.storedResolutions.get(n.node.provided.descriptorHash);if(typeof u>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");let A=t.storedPackages.get(u);if(typeof A>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");let p=zp(LAt(n.node),({request:I,root:v})=>tA(A.version??\"0.0.0\",I.descriptor.range)?zp.skip:I===v?Oi(t.configuration,I.requester):`${Oi(t.configuration,I.requester)} (via ${Oi(t.configuration,v.requester)})`),h=[...WI(n.node)].length>1?\"and other dependencies request\":\"requests\",E=n.range?qm(t.configuration,n.range):Ot(t.configuration,\"but they have non-overlapping ranges!\",\"redBright\");r.push(`${Oi(t.configuration,n.node.ident)} is listed by your project with version ${GI(t.configuration,A.version??\"0.0.0\")} (${Ot(t.configuration,n.hash,yt.CODE)}), which doesn't satisfy what ${p} ${h} (${E}).`)}if(n.type===2){let u=n.node.requests.size>1?\" and other dependencies\":\"\";o.push(`${qr(t.configuration,n.node.subject)} doesn't provide ${Oi(t.configuration,n.node.ident)} (${Ot(t.configuration,n.hash,yt.CODE)}), requested by ${Oi(t.configuration,n.node.requests.values().next().value.requester)}${u}.`)}}e.startSectionSync({reportFooter:()=>{e.reportWarning(86,`Some peer dependencies are incorrectly met by your project; run ${Ot(t.configuration,\"yarn explain peer-requirements <hash>\",yt.CODE)} for details, where ${Ot(t.configuration,\"<hash>\",yt.CODE)} is the six-letter p-prefixed code.`)},skipIfEmpty:!0},()=>{for(let n of Fs(r,u=>Rm.default(u)))e.reportWarning(60,n);for(let n of Fs(o,u=>Rm.default(u)))e.reportWarning(2,n)}),a&&e.reportWarning(86,`Some peer dependencies are incorrectly met by dependencies; run ${Ot(t.configuration,\"yarn explain peer-requirements\",yt.CODE)} for details.`)}var Hx,qx,jx,ehe,B_,I_,v_,Gx,kAt,QAt,Zpe,FAt,RAt,TAt,hl,w_,Yx,$pe,kt,the=Et(()=>{Pt();Pt();Nl();qt();Hx=ve(\"crypto\");f_();qx=Ze(y_()),jx=Ze(eg()),ehe=Ze(Jn()),B_=ve(\"util\"),I_=Ze(ve(\"v8\")),v_=Ze(ve(\"zlib\"));n_();u1();i_();s_();Gm();rO();Wl();Jpe();I1();E_();mg();C_();Tb();jl();rh();ql();fS();dU();xf();So();Gx=Qm(process.env.YARN_LOCKFILE_VERSION_OVERRIDE??8),kAt=3,QAt=/ *, */g,Zpe=/\\/$/,FAt=32,RAt=(0,B_.promisify)(v_.default.gzip),TAt=(0,B_.promisify)(v_.default.gunzip),hl=(r=>(r.UpdateLockfile=\"update-lockfile\",r.SkipBuild=\"skip-build\",r))(hl||{}),w_={restoreLinkersCustomData:[\"linkersCustomData\"],restoreResolutions:[\"accessibleLocators\",\"conditionalLocators\",\"disabledLocators\",\"optionalBuilds\",\"storedDescriptors\",\"storedResolutions\",\"storedPackages\",\"lockFileChecksum\"],restoreBuildState:[\"skippedBuilds\",\"storedBuildState\"]},Yx=(a=>(a[a.NotProvided=0]=\"NotProvided\",a[a.NotCompatible=1]=\"NotCompatible\",a[a.NodeNotProvided=2]=\"NodeNotProvided\",a[a.NodeNotCompatible=3]=\"NodeNotCompatible\",a))(Yx||{}),$pe=t=>zi(`${kAt}`,t),kt=class t{constructor(e,{configuration:r}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.skippedBuilds=new Set;this.lockfileLastVersion=null;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.peerWarnings=[];this.peerRequirementNodes=new Map;this.linkersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=e}static async find(e,r){if(!e.projectCwd)throw new st(`No project found in ${r}`);let o=e.projectCwd,a=r,n=null;for(;n!==e.projectCwd;){if(n=a,oe.existsSync(V.join(n,dr.manifest))){o=n;break}a=V.dirname(n)}let u=new t(e.projectCwd,{configuration:e});Ke.telemetry?.reportProject(u.cwd),await u.setupResolutions(),await u.setupWorkspaces(),Ke.telemetry?.reportWorkspaceCount(u.workspaces.length),Ke.telemetry?.reportDependencyCount(u.workspaces.reduce((C,R)=>C+R.manifest.dependencies.size+R.manifest.devDependencies.size,0));let A=u.tryWorkspaceByCwd(o);if(A)return{project:u,workspace:A,locator:A.anchoredLocator};let p=await u.findLocatorForLocation(`${o}/`,{strict:!0});if(p)return{project:u,locator:p,workspace:null};let h=Ot(e,u.cwd,yt.PATH),E=Ot(e,V.relative(u.cwd,o),yt.PATH),I=`- If ${h} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,v=`- If ${h} is intended to be a project, it might be that you forgot to list ${E} in its workspace configuration.`,x=`- Finally, if ${h} is fine and you intend ${E} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new st(`The nearest package directory (${Ot(e,o,yt.PATH)}) doesn't seem to be part of the project declared in ${Ot(e,u.cwd,yt.PATH)}.\n\n${[I,v,x].join(`\n`)}`)}async setupResolutions(){this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=V.join(this.cwd,dr.lockfile),r=this.configuration.get(\"defaultLanguageName\");if(oe.existsSync(e)){let o=await oe.readFilePromise(e,\"utf8\");this.lockFileChecksum=$pe(o);let a=Ki(o);if(a.__metadata){let n=a.__metadata.version,u=a.__metadata.cacheKey;this.lockfileLastVersion=n,this.lockfileNeedsRefresh=n<Gx;for(let A of Object.keys(a)){if(A===\"__metadata\")continue;let p=a[A];if(typeof p.resolution>\"u\")throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${A})`);let h=bf(p.resolution,!0),E=new Ut;E.load(p,{yamlCompatibilityMode:!0});let I=E.version,v=E.languageName||r,x=p.linkType.toUpperCase(),C=p.conditions??null,R=E.dependencies,L=E.peerDependencies,U=E.dependenciesMeta,z=E.peerDependenciesMeta,te=E.bin;if(p.checksum!=null){let le=typeof u<\"u\"&&!p.checksum.includes(\"/\")?`${u}/${p.checksum}`:p.checksum;this.storedChecksums.set(h.locatorHash,le)}let ae={...h,version:I,languageName:v,linkType:x,conditions:C,dependencies:R,peerDependencies:L,dependenciesMeta:U,peerDependenciesMeta:z,bin:te};this.originalPackages.set(ae.locatorHash,ae);for(let le of A.split(QAt)){let ce=nh(le);n<=6&&(ce=this.configuration.normalizeDependency(ce),ce=In(ce,ce.range.replace(/^patch:[^@]+@(?!npm(:|%3A))/,\"$1npm%3A\"))),this.storedDescriptors.set(ce.descriptorHash,ce),this.storedResolutions.set(ce.descriptorHash,h.locatorHash)}}}else o.includes(\"yarn lockfile v1\")&&(this.lockfileLastVersion=-1)}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let e=new Set,r=(0,jx.default)(4),o=async(a,n)=>{if(e.has(n))return a;e.add(n);let u=new My(n,{project:this});await r(()=>u.setup());let A=a.then(()=>{this.addWorkspace(u)});return Array.from(u.workspacesCwds).reduce(o,A)};await o(Promise.resolve(),this.cwd)}addWorkspace(e){let r=this.workspacesByIdent.get(e.anchoredLocator.identHash);if(typeof r<\"u\")throw new Error(`Duplicate workspace name ${Oi(this.configuration,e.anchoredLocator)}: ${ue.fromPortablePath(e.cwd)} conflicts with ${ue.fromPortablePath(r.cwd)}`);this.workspaces.push(e),this.workspacesByCwd.set(e.cwd,e),this.workspacesByIdent.set(e.anchoredLocator.identHash,e)}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){V.isAbsolute(e)||(e=V.resolve(this.cwd,e)),e=V.normalize(e).replace(/\\/+$/,\"\");let r=this.workspacesByCwd.get(e);return r||null}getWorkspaceByCwd(e){let r=this.tryWorkspaceByCwd(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByFilePath(e){let r=null;for(let o of this.workspaces)V.relative(o.cwd,e).startsWith(\"../\")||r&&r.cwd.length>=o.cwd.length||(r=o);return r||null}getWorkspaceByFilePath(e){let r=this.tryWorkspaceByFilePath(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByIdent(e){let r=this.workspacesByIdent.get(e.identHash);return typeof r>\"u\"?null:r}getWorkspaceByIdent(e){let r=this.tryWorkspaceByIdent(e);if(!r)throw new Error(`Workspace not found (${Oi(this.configuration,e)})`);return r}tryWorkspaceByDescriptor(e){if(e.range.startsWith(ei.protocol)){let o=e.range.slice(ei.protocol.length);if(o!==\"^\"&&o!==\"~\"&&o!==\"*\"&&!Qa(o))return this.tryWorkspaceByCwd(o)}let r=this.tryWorkspaceByIdent(e);return r===null||(Pf(e)&&(e=UI(e)),!r.accepts(e.range))?null:r}getWorkspaceByDescriptor(e){let r=this.tryWorkspaceByDescriptor(e);if(r===null)throw new Error(`Workspace not found (${jn(this.configuration,e)})`);return r}tryWorkspaceByLocator(e){let r=this.tryWorkspaceByIdent(e);return r===null||(Gc(e)&&(e=_I(e)),r.anchoredLocator.locatorHash!==e.locatorHash)?null:r}getWorkspaceByLocator(e){let r=this.tryWorkspaceByLocator(e);if(!r)throw new Error(`Workspace not found (${qr(this.configuration,e)})`);return r}deleteDescriptor(e){this.storedResolutions.delete(e),this.storedDescriptors.delete(e)}deleteLocator(e){this.originalPackages.delete(e),this.storedPackages.delete(e),this.accessibleLocators.delete(e)}forgetResolution(e){if(\"descriptorHash\"in e){let r=this.storedResolutions.get(e.descriptorHash);this.deleteDescriptor(e.descriptorHash);let o=new Set(this.storedResolutions.values());typeof r<\"u\"&&!o.has(r)&&this.deleteLocator(r)}if(\"locatorHash\"in e){this.deleteLocator(e.locatorHash);for(let[r,o]of this.storedResolutions)o===e.locatorHash&&this.deleteDescriptor(r)}}forgetTransientResolutions(){let e=this.configuration.makeResolver(),r=new Map;for(let[o,a]of this.storedResolutions.entries()){let n=r.get(a);n||r.set(a,n=new Set),n.add(o)}for(let o of this.originalPackages.values()){let a;try{a=e.shouldPersistResolution(o,{project:this,resolver:e})}catch{a=!1}if(!a){this.deleteLocator(o.locatorHash);let n=r.get(o.locatorHash);if(n){r.delete(o.locatorHash);for(let u of n)this.deleteDescriptor(u)}}}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[r,o]of e.dependencies)Pf(o)&&e.dependencies.set(r,UI(o))}getDependencyMeta(e,r){let o={},n=this.topLevelWorkspace.manifest.dependenciesMeta.get(rn(e));if(!n)return o;let u=n.get(null);if(u&&Object.assign(o,u),r===null||!ehe.default.valid(r))return o;for(let[A,p]of n)A!==null&&A===r&&Object.assign(o,p);return o}async findLocatorForLocation(e,{strict:r=!1}={}){let o=new ki,a=this.configuration.getLinkers(),n={project:this,report:o};for(let u of a){let A=await u.findPackageLocator(e,n);if(A){if(r&&(await u.findPackageLocation(A,n)).replace(Zpe,\"\")!==e.replace(Zpe,\"\"))continue;return A}}return null}async loadUserConfig(){let e=V.join(this.cwd,\".pnp.cjs\");await oe.existsPromise(e)&&vf(e).setup();let r=V.join(this.cwd,\"yarn.config.cjs\");return await oe.existsPromise(r)?vf(r):null}async preparePackage(e,{resolver:r,resolveOptions:o}){let a=await this.configuration.getPackageExtensions(),n=this.configuration.normalizePackage(e,{packageExtensions:a});for(let[u,A]of n.dependencies){let p=await this.configuration.reduceHook(E=>E.reduceDependency,A,this,n,A,{resolver:r,resolveOptions:o});if(!HI(A,p))throw new Error(\"Assertion failed: The descriptor ident cannot be changed through aliases\");let h=r.bindDescriptor(p,n,o);n.dependencies.set(u,h)}return n}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error(\"Workspaces must have been setup before calling this function\");this.forgetVirtualResolutions();let r=new Map(this.originalPackages),o=[];e.lockfileOnly||this.forgetTransientResolutions();let a=e.resolver||this.configuration.makeResolver(),n=new Ty(a);await n.setup(this,{report:e.report});let u=e.lockfileOnly?[new _x(a)]:[n,a],A=new yg([new Ny(a),...u]),p=new yg([...u]),h=this.configuration.makeFetcher(),E=e.lockfileOnly?{project:this,report:e.report,resolver:A}:{project:this,report:e.report,resolver:A,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:h,cacheOptions:{mirrorWriteOnly:!0}}},I=new Map,v=new Map,x=new Map,C=new Map,R=new Map,L=new Map,U=this.topLevelWorkspace.anchoredLocator,z=new Set,te=[],ae=k4(),le=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(Zs.progressViaTitle(),async ne=>{let Z=async rt=>{let Te=await xm(async()=>await A.resolve(rt,E),be=>`${qr(this.configuration,rt)}: ${be}`);if(!qI(rt,Te))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${qr(this.configuration,rt)} to ${qr(this.configuration,Te)})`);C.set(Te.locatorHash,Te),!r.delete(Te.locatorHash)&&!this.tryWorkspaceByLocator(Te)&&o.push(Te);let ke=await this.preparePackage(Te,{resolver:A,resolveOptions:E}),Ye=_c([...ke.dependencies.values()].map(be=>H(be)));return te.push(Ye),Ye.catch(()=>{}),v.set(ke.locatorHash,ke),ke},xe=async rt=>{let Te=R.get(rt.locatorHash);if(typeof Te<\"u\")return Te;let Fe=Promise.resolve().then(()=>Z(rt));return R.set(rt.locatorHash,Fe),Fe},Ne=async(rt,Te)=>{let Fe=await H(Te);return I.set(rt.descriptorHash,rt),x.set(rt.descriptorHash,Fe.locatorHash),Fe},ht=async rt=>{ne.setTitle(jn(this.configuration,rt));let Te=this.resolutionAliases.get(rt.descriptorHash);if(typeof Te<\"u\")return Ne(rt,this.storedDescriptors.get(Te));let Fe=A.getResolutionDependencies(rt,E),ke=Object.fromEntries(await _c(Object.entries(Fe).map(async([et,Ue])=>{let S=A.bindDescriptor(Ue,U,E),w=await H(S);return z.add(w.locatorHash),[et,w]}))),be=(await xm(async()=>await A.getCandidates(rt,ke,E),et=>`${jn(this.configuration,rt)}: ${et}`))[0];if(typeof be>\"u\")throw new Jt(82,`${jn(this.configuration,rt)}: No candidates found`);if(e.checkResolutions){let{locators:et}=await p.getSatisfying(rt,ke,[be],{...E,resolver:p});if(!et.find(Ue=>Ue.locatorHash===be.locatorHash))throw new Jt(78,`Invalid resolution ${NI(this.configuration,rt,be)}`)}return I.set(rt.descriptorHash,rt),x.set(rt.descriptorHash,be.locatorHash),xe(be)},H=rt=>{let Te=L.get(rt.descriptorHash);if(typeof Te<\"u\")return Te;I.set(rt.descriptorHash,rt);let Fe=Promise.resolve().then(()=>ht(rt));return L.set(rt.descriptorHash,Fe),Fe};for(let rt of this.workspaces){let Te=rt.anchoredDescriptor;te.push(H(Te))}for(;te.length>0;){let rt=[...te];te.length=0,await _c(rt)}});let ce=ol(r.values(),ne=>this.tryWorkspaceByLocator(ne)?ol.skip:ne);if(o.length>0||ce.length>0){let ne=new Set(this.workspaces.flatMap(rt=>{let Te=v.get(rt.anchoredLocator.locatorHash);if(!Te)throw new Error(\"Assertion failed: The workspace should have been resolved\");return Array.from(Te.dependencies.values(),Fe=>{let ke=x.get(Fe.descriptorHash);if(!ke)throw new Error(\"Assertion failed: The resolution should have been registered\");return ke})})),Z=rt=>ne.has(rt.locatorHash)?\"0\":\"1\",xe=rt=>ka(rt),Ne=Fs(o,[Z,xe]),ht=Fs(ce,[Z,xe]),H=e.report.getRecommendedLength();Ne.length>0&&e.report.reportInfo(85,`${Ot(this.configuration,\"+\",yt.ADDED)} ${zP(this.configuration,Ne,H)}`),ht.length>0&&e.report.reportInfo(85,`${Ot(this.configuration,\"-\",yt.REMOVED)} ${zP(this.configuration,ht,H)}`)}let Ce=new Set(this.resolutionAliases.values()),de=new Set(v.keys()),Be=new Set,Ee=new Map,g=[],me=new Map;NAt({project:this,accessibleLocators:Be,volatileDescriptors:Ce,optionalBuilds:de,peerRequirements:Ee,peerWarnings:g,peerRequirementNodes:me,allDescriptors:I,allResolutions:x,allPackages:v});for(let ne of z)de.delete(ne);for(let ne of Ce)I.delete(ne),x.delete(ne);let we=new Set,Ae=new Set;for(let ne of v.values())ne.conditions!=null&&de.has(ne.locatorHash)&&(xb(ne,le)||(xb(ne,ae)&&e.report.reportWarningOnce(77,`${qr(this.configuration,ne)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${Ot(this.configuration,\"supportedArchitectures\",yt.SETTING)} setting`),Ae.add(ne.locatorHash)),we.add(ne.locatorHash));this.storedResolutions=x,this.storedDescriptors=I,this.storedPackages=v,this.accessibleLocators=Be,this.conditionalLocators=we,this.disabledLocators=Ae,this.originalPackages=C,this.optionalBuilds=de,this.peerRequirements=Ee,this.peerWarnings=g,this.peerRequirementNodes=me}async fetchEverything({cache:e,report:r,fetcher:o,mode:a,persistProject:n=!0}){let u={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},A=o||this.configuration.makeFetcher(),p={checksums:this.storedChecksums,project:this,cache:e,fetcher:A,report:r,cacheOptions:u},h=Array.from(new Set(Fs(this.storedResolutions.values(),[C=>{let R=this.storedPackages.get(C);if(!R)throw new Error(\"Assertion failed: The locator should have been registered\");return ka(R)}])));a===\"update-lockfile\"&&(h=h.filter(C=>!this.storedChecksums.has(C)));let E=!1,I=Zs.progressViaCounter(h.length);await r.reportProgress(I);let v=(0,jx.default)(FAt);if(await _c(h.map(C=>v(async()=>{let R=this.storedPackages.get(C);if(!R)throw new Error(\"Assertion failed: The locator should have been registered\");if(Gc(R))return;let L;try{L=await A.fetch(R,p)}catch(U){U.message=`${qr(this.configuration,R)}: ${U.message}`,r.reportExceptionOnce(U),E=U;return}L.checksum!=null?this.storedChecksums.set(R.locatorHash,L.checksum):this.storedChecksums.delete(R.locatorHash),L.releaseFs&&L.releaseFs()}).finally(()=>{I.tick()}))),E)throw E;let x=n&&a!==\"update-lockfile\"?await this.cacheCleanup({cache:e,report:r}):null;if(r.cacheMisses.size>0||x){let R=(await Promise.all([...r.cacheMisses].map(async ce=>{let Ce=this.storedPackages.get(ce),de=this.storedChecksums.get(ce)??null,Be=e.getLocatorPath(Ce,de);return(await oe.statPromise(Be)).size}))).reduce((ce,Ce)=>ce+Ce,0)-(x?.size??0),L=r.cacheMisses.size,U=x?.count??0,z=`${jP(L,{zero:\"No new packages\",one:\"A package was\",more:`${Ot(this.configuration,L,yt.NUMBER)} packages were`})} added to the project`,te=`${jP(U,{zero:\"none were\",one:\"one was\",more:`${Ot(this.configuration,U,yt.NUMBER)} were`})} removed`,ae=R!==0?` (${Ot(this.configuration,R,yt.SIZE_DIFF)})`:\"\",le=U>0?L>0?`${z}, and ${te}${ae}.`:`${z}, but ${te}${ae}.`:`${z}${ae}.`;r.reportInfo(13,le)}}async linkEverything({cache:e,report:r,fetcher:o,mode:a}){let n={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},u=o||this.configuration.makeFetcher(),A={checksums:this.storedChecksums,project:this,cache:e,fetcher:u,report:r,cacheOptions:n},p=this.configuration.getLinkers(),h={project:this,report:r},E=new Map(p.map(we=>{let Ae=we.makeInstaller(h),ne=we.getCustomDataKey(),Z=this.linkersCustomData.get(ne);return typeof Z<\"u\"&&Ae.attachCustomData(Z),[we,Ae]})),I=new Map,v=new Map,x=new Map,C=new Map(await _c([...this.accessibleLocators].map(async we=>{let Ae=this.storedPackages.get(we);if(!Ae)throw new Error(\"Assertion failed: The locator should have been registered\");return[we,await u.fetch(Ae,A)]}))),R=[],L=new Set,U=[];for(let we of this.accessibleLocators){let Ae=this.storedPackages.get(we);if(typeof Ae>\"u\")throw new Error(\"Assertion failed: The locator should have been registered\");let ne=C.get(Ae.locatorHash);if(typeof ne>\"u\")throw new Error(\"Assertion failed: The fetch result should have been registered\");let Z=[],xe=ht=>{Z.push(ht)},Ne=this.tryWorkspaceByLocator(Ae);if(Ne!==null){let ht=[],{scripts:H}=Ne.manifest;for(let Te of[\"preinstall\",\"install\",\"postinstall\"])H.has(Te)&&ht.push({type:0,script:Te});try{for(let[Te,Fe]of E)if(Te.supportsPackage(Ae,h)&&(await Fe.installPackage(Ae,ne,{holdFetchResult:xe})).buildRequest!==null)throw new Error(\"Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core\")}finally{Z.length===0?ne.releaseFs?.():R.push(_c(Z).catch(()=>{}).then(()=>{ne.releaseFs?.()}))}let rt=V.join(ne.packageFs.getRealPath(),ne.prefixPath);v.set(Ae.locatorHash,rt),!Gc(Ae)&&ht.length>0&&x.set(Ae.locatorHash,{buildDirectives:ht,buildLocations:[rt]})}else{let ht=p.find(Te=>Te.supportsPackage(Ae,h));if(!ht)throw new Jt(12,`${qr(this.configuration,Ae)} isn't supported by any available linker`);let H=E.get(ht);if(!H)throw new Error(\"Assertion failed: The installer should have been registered\");let rt;try{rt=await H.installPackage(Ae,ne,{holdFetchResult:xe})}finally{Z.length===0?ne.releaseFs?.():R.push(_c(Z).then(()=>{}).then(()=>{ne.releaseFs?.()}))}I.set(Ae.locatorHash,ht),v.set(Ae.locatorHash,rt.packageLocation),rt.buildRequest&&rt.packageLocation&&(rt.buildRequest.skipped?(L.add(Ae.locatorHash),this.skippedBuilds.has(Ae.locatorHash)||U.push([Ae,rt.buildRequest.explain])):x.set(Ae.locatorHash,{buildDirectives:rt.buildRequest.directives,buildLocations:[rt.packageLocation]}))}}let z=new Map;for(let we of this.accessibleLocators){let Ae=this.storedPackages.get(we);if(!Ae)throw new Error(\"Assertion failed: The locator should have been registered\");let ne=this.tryWorkspaceByLocator(Ae)!==null,Z=async(xe,Ne)=>{let ht=v.get(Ae.locatorHash);if(typeof ht>\"u\")throw new Error(`Assertion failed: The package (${qr(this.configuration,Ae)}) should have been registered`);let H=[];for(let rt of Ae.dependencies.values()){let Te=this.storedResolutions.get(rt.descriptorHash);if(typeof Te>\"u\")throw new Error(`Assertion failed: The resolution (${jn(this.configuration,rt)}, from ${qr(this.configuration,Ae)})should have been registered`);let Fe=this.storedPackages.get(Te);if(typeof Fe>\"u\")throw new Error(`Assertion failed: The package (${Te}, resolved from ${jn(this.configuration,rt)}) should have been registered`);let ke=this.tryWorkspaceByLocator(Fe)===null?I.get(Te):null;if(typeof ke>\"u\")throw new Error(`Assertion failed: The package (${Te}, resolved from ${jn(this.configuration,rt)}) should have been registered`);ke===xe||ke===null?v.get(Fe.locatorHash)!==null&&H.push([rt,Fe]):!ne&&ht!==null&&xI(z,Te).push(ht)}ht!==null&&await Ne.attachInternalDependencies(Ae,H)};if(ne)for(let[xe,Ne]of E)xe.supportsPackage(Ae,h)&&await Z(xe,Ne);else{let xe=I.get(Ae.locatorHash);if(!xe)throw new Error(\"Assertion failed: The linker should have been found\");let Ne=E.get(xe);if(!Ne)throw new Error(\"Assertion failed: The installer should have been registered\");await Z(xe,Ne)}}for(let[we,Ae]of z){let ne=this.storedPackages.get(we);if(!ne)throw new Error(\"Assertion failed: The package should have been registered\");let Z=I.get(ne.locatorHash);if(!Z)throw new Error(\"Assertion failed: The linker should have been found\");let xe=E.get(Z);if(!xe)throw new Error(\"Assertion failed: The installer should have been registered\");await xe.attachExternalDependents(ne,Ae)}let te=new Map;for(let[we,Ae]of E){let ne=await Ae.finalizeInstall();for(let Z of ne?.records??[])Z.buildRequest.skipped?(L.add(Z.locator.locatorHash),this.skippedBuilds.has(Z.locator.locatorHash)||U.push([Z.locator,Z.buildRequest.explain])):x.set(Z.locator.locatorHash,{buildDirectives:Z.buildRequest.directives,buildLocations:Z.buildLocations});typeof ne?.customData<\"u\"&&te.set(we.getCustomDataKey(),ne.customData)}if(this.linkersCustomData=te,await _c(R),a===\"skip-build\")return;for(let[,we]of Fs(U,([Ae])=>ka(Ae)))we(r);let ae=new Set(x.keys()),le=(0,Hx.createHash)(\"sha512\");le.update(process.versions.node),await this.configuration.triggerHook(we=>we.globalHashGeneration,this,we=>{le.update(\"\\0\"),le.update(we)});let ce=le.digest(\"hex\"),Ce=new Map,de=we=>{let Ae=Ce.get(we.locatorHash);if(typeof Ae<\"u\")return Ae;let ne=this.storedPackages.get(we.locatorHash);if(typeof ne>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");let Z=(0,Hx.createHash)(\"sha512\");Z.update(we.locatorHash),Ce.set(we.locatorHash,\"<recursive>\");for(let xe of ne.dependencies.values()){let Ne=this.storedResolutions.get(xe.descriptorHash);if(typeof Ne>\"u\")throw new Error(`Assertion failed: The resolution (${jn(this.configuration,xe)}) should have been registered`);let ht=this.storedPackages.get(Ne);if(typeof ht>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");Z.update(de(ht))}return Ae=Z.digest(\"hex\"),Ce.set(we.locatorHash,Ae),Ae},Be=(we,Ae)=>{let ne=(0,Hx.createHash)(\"sha512\");ne.update(ce),ne.update(de(we));for(let Z of Ae)ne.update(Z);return ne.digest(\"hex\")},Ee=new Map,g=!1,me=we=>{let Ae=new Set([we.locatorHash]);for(let ne of Ae){let Z=this.storedPackages.get(ne);if(!Z)throw new Error(\"Assertion failed: The package should have been registered\");for(let xe of Z.dependencies.values()){let Ne=this.storedResolutions.get(xe.descriptorHash);if(!Ne)throw new Error(`Assertion failed: The resolution (${jn(this.configuration,xe)}) should have been registered`);if(Ne!==we.locatorHash&&ae.has(Ne))return!1;let ht=this.storedPackages.get(Ne);if(!ht)throw new Error(\"Assertion failed: The package should have been registered\");let H=this.tryWorkspaceByLocator(ht);if(H){if(H.anchoredLocator.locatorHash!==we.locatorHash&&ae.has(H.anchoredLocator.locatorHash))return!1;Ae.add(H.anchoredLocator.locatorHash)}Ae.add(Ne)}}return!0};for(;ae.size>0;){let we=ae.size,Ae=[];for(let ne of ae){let Z=this.storedPackages.get(ne);if(!Z)throw new Error(\"Assertion failed: The package should have been registered\");if(!me(Z))continue;let xe=x.get(Z.locatorHash);if(!xe)throw new Error(\"Assertion failed: The build directive should have been registered\");let Ne=Be(Z,xe.buildLocations);if(this.storedBuildState.get(Z.locatorHash)===Ne){Ee.set(Z.locatorHash,Ne),ae.delete(ne);continue}g||(await this.persistInstallStateFile(),g=!0),this.storedBuildState.has(Z.locatorHash)?r.reportInfo(8,`${qr(this.configuration,Z)} must be rebuilt because its dependency tree changed`):r.reportInfo(7,`${qr(this.configuration,Z)} must be built because it never has been before or the last one failed`);let ht=xe.buildLocations.map(async H=>{if(!V.isAbsolute(H))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${H})`);for(let rt of xe.buildDirectives){let Te=`# This file contains the result of Yarn building a package (${ka(Z)})\n`;switch(rt.type){case 0:Te+=`# Script name: ${rt.script}\n`;break;case 1:Te+=`# Script code: ${rt.script}\n`;break}let Fe=null;if(!await oe.mktempPromise(async Ye=>{let be=V.join(Ye,\"build.log\"),{stdout:et,stderr:Ue}=this.configuration.getSubprocessStreams(be,{header:Te,prefix:qr(this.configuration,Z),report:r}),S;try{switch(rt.type){case 0:S=await NS(Z,rt.script,[],{cwd:H,project:this,stdin:Fe,stdout:et,stderr:Ue});break;case 1:S=await fU(Z,rt.script,[],{cwd:H,project:this,stdin:Fe,stdout:et,stderr:Ue});break}}catch(y){Ue.write(y.stack),S=1}if(et.end(),Ue.end(),S===0)return!0;oe.detachTemp(Ye);let w=`${qr(this.configuration,Z)} couldn't be built successfully (exit code ${Ot(this.configuration,S,yt.NUMBER)}, logs can be found here: ${Ot(this.configuration,be,yt.PATH)})`,b=this.optionalBuilds.has(Z.locatorHash);return b?r.reportInfo(9,w):r.reportError(9,w),Zce&&r.reportFold(ue.fromPortablePath(be),oe.readFileSync(be,\"utf8\")),b}))return!1}return!0});Ae.push(...ht,Promise.allSettled(ht).then(H=>{ae.delete(ne),H.every(rt=>rt.status===\"fulfilled\"&&rt.value===!0)&&Ee.set(Z.locatorHash,Ne)}))}if(await _c(Ae),we===ae.size){let ne=Array.from(ae).map(Z=>{let xe=this.storedPackages.get(Z);if(!xe)throw new Error(\"Assertion failed: The package should have been registered\");return qr(this.configuration,xe)}).join(\", \");r.reportError(3,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${ne})`);break}}this.storedBuildState=Ee,this.skippedBuilds=L}async installWithNewReport(e,r){return(await Rt.start({configuration:this.configuration,json:e.json,stdout:e.stdout,forceSectionAlignment:!0,includeLogs:!e.json&&!e.quiet,includeVersion:!0},async a=>{await this.install({...r,report:a})})).exitCode()}async install(e){let r=this.configuration.get(\"nodeLinker\");Ke.telemetry?.reportInstall(r);let o=!1;if(await e.report.startTimerPromise(\"Project validation\",{skipIfEmpty:!0},async()=>{this.configuration.get(\"enableOfflineMode\")&&e.report.reportWarning(90,\"Offline work is enabled; Yarn won't fetch packages from the remote registry if it can avoid it\"),await this.configuration.triggerHook(E=>E.validateProject,this,{reportWarning:(E,I)=>{e.report.reportWarning(E,I)},reportError:(E,I)=>{e.report.reportError(E,I),o=!0}})}),o)return;let a=await this.configuration.getPackageExtensions();for(let E of a.values())for(let[,I]of E)for(let v of I)v.status=\"inactive\";let n=V.join(this.cwd,dr.lockfile),u=null;if(e.immutable)try{u=await oe.readFilePromise(n,\"utf8\")}catch(E){throw E.code===\"ENOENT\"?new Jt(28,\"The lockfile would have been created by this install, which is explicitly forbidden.\"):E}await e.report.startTimerPromise(\"Resolution step\",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise(\"Post-resolution validation\",{skipIfEmpty:!0},async()=>{MAt(this,e.report);for(let[,E]of a)for(let[,I]of E)for(let v of I)if(v.userProvided){let x=Ot(this.configuration,v,yt.PACKAGE_EXTENSION);switch(v.status){case\"inactive\":e.report.reportWarning(68,`${x}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case\"redundant\":e.report.reportWarning(69,`${x}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(u!==null){let E=L0(u,this.generateLockfile());if(E!==u){let I=dpe(n,n,u,E,void 0,void 0,{maxEditLength:100});if(I){e.report.reportSeparator();for(let v of I.hunks){e.report.reportInfo(null,`@@ -${v.oldStart},${v.oldLines} +${v.newStart},${v.newLines} @@`);for(let x of v.lines)x.startsWith(\"+\")?e.report.reportError(28,Ot(this.configuration,x,yt.ADDED)):x.startsWith(\"-\")?e.report.reportError(28,Ot(this.configuration,x,yt.REMOVED)):e.report.reportInfo(null,Ot(this.configuration,x,\"grey\"))}e.report.reportSeparator()}throw new Jt(28,\"The lockfile would have been modified by this install, which is explicitly forbidden.\")}}});for(let E of a.values())for(let[,I]of E)for(let v of I)v.userProvided&&v.status===\"active\"&&Ke.telemetry?.reportPackageExtension(pg(v,yt.PACKAGE_EXTENSION));await e.report.startTimerPromise(\"Fetch step\",async()=>{await this.fetchEverything(e)});let A=e.immutable?[...new Set(this.configuration.get(\"immutablePatterns\"))].sort():[],p=await Promise.all(A.map(async E=>Bb(E,{cwd:this.cwd})));(typeof e.persistProject>\"u\"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise(\"Link step\",async()=>{if(e.mode===\"update-lockfile\"){e.report.reportWarning(73,`Skipped due to ${Ot(this.configuration,\"mode=update-lockfile\",yt.CODE)}`);return}await this.linkEverything(e);let E=await Promise.all(A.map(async I=>Bb(I,{cwd:this.cwd})));for(let I=0;I<A.length;++I)p[I]!==E[I]&&e.report.reportError(64,`The checksum for ${A[I]} has been modified by this install, which is explicitly forbidden.`)}),await this.persistInstallStateFile();let h=!1;await e.report.startTimerPromise(\"Post-install validation\",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(E=>E.validateProjectAfterInstall,this,{reportWarning:(E,I)=>{e.report.reportWarning(E,I)},reportError:(E,I)=>{e.report.reportError(E,I),h=!0}})}),!h&&await this.configuration.triggerHook(E=>E.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,u]of this.storedResolutions.entries()){let A=e.get(u);A||e.set(u,A=new Set),A.add(n)}let r={},{cacheKey:o}=Gr.getCacheKey(this.configuration);r.__metadata={version:Gx,cacheKey:o};for(let[n,u]of e.entries()){let A=this.originalPackages.get(n);if(!A)continue;let p=[];for(let I of u){let v=this.storedDescriptors.get(I);if(!v)throw new Error(\"Assertion failed: The descriptor should have been registered\");p.push(v)}let h=p.map(I=>xa(I)).sort().join(\", \"),E=new Ut;E.version=A.linkType===\"HARD\"?A.version:\"0.0.0-use.local\",E.languageName=A.languageName,E.dependencies=new Map(A.dependencies),E.peerDependencies=new Map(A.peerDependencies),E.dependenciesMeta=new Map(A.dependenciesMeta),E.peerDependenciesMeta=new Map(A.peerDependenciesMeta),E.bin=new Map(A.bin),r[h]={...E.exportTo({},{compatibilityMode:!1}),linkType:A.linkType.toLowerCase(),resolution:ka(A),checksum:this.storedChecksums.get(A.locatorHash),conditions:A.conditions||void 0}}return`${[`# This file is generated by running \"yarn install\" inside your project.\n`,`# Manual changes might be lost - proceed with caution!\n`].join(\"\")}\n`+Da(r)}async persistLockfile(){let e=V.join(this.cwd,dr.lockfile),r=\"\";try{r=await oe.readFilePromise(e,\"utf8\")}catch{}let o=this.generateLockfile(),a=L0(r,o);a!==r&&(await oe.writeFilePromise(e,a),this.lockFileChecksum=$pe(a),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let u of Object.values(w_))e.push(...u);let r=(0,qx.default)(this,e),o=I_.default.serialize(r),a=zi(o);if(this.installStateChecksum===a)return;let n=this.configuration.get(\"installStatePath\");await oe.mkdirPromise(V.dirname(n),{recursive:!0}),await oe.writeFilePromise(n,await RAt(o)),this.installStateChecksum=a}async restoreInstallState({restoreLinkersCustomData:e=!0,restoreResolutions:r=!0,restoreBuildState:o=!0}={}){let a=this.configuration.get(\"installStatePath\"),n;try{let u=await TAt(await oe.readFilePromise(a));n=I_.default.deserialize(u),this.installStateChecksum=zi(u)}catch{r&&await this.applyLightResolution();return}e&&typeof n.linkersCustomData<\"u\"&&(this.linkersCustomData=n.linkersCustomData),o&&Object.assign(this,(0,qx.default)(n,w_.restoreBuildState)),r&&(n.lockFileChecksum===this.lockFileChecksum?Object.assign(this,(0,qx.default)(n,w_.restoreResolutions)):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new ki}),await this.persistInstallStateFile()}async persist(){let e=(0,jx.default)(4);await Promise.all([this.persistLockfile(),...this.workspaces.map(r=>e(()=>r.persistManifest()))])}async cacheCleanup({cache:e,report:r}){if(this.configuration.get(\"enableGlobalCache\"))return null;let o=new Set([\".gitignore\"]);if(!fO(e.cwd,this.cwd)||!await oe.existsPromise(e.cwd))return null;let a=[];for(let u of await oe.readdirPromise(e.cwd)){if(o.has(u))continue;let A=V.resolve(e.cwd,u);e.markedFiles.has(A)||(e.immutable?r.reportError(56,`${Ot(this.configuration,V.basename(A),\"magenta\")} appears to be unused and would be marked for deletion, but the cache is immutable`):a.push(oe.lstatPromise(A).then(async p=>(await oe.removePromise(A),p.size))))}if(a.length===0)return null;let n=await Promise.all(a);return{count:a.length,size:n.reduce((u,A)=>u+A,0)}}}});function OAt(t){let o=Math.floor(t.timeNow/864e5),a=t.updateInterval*864e5,n=t.state.lastUpdate??t.timeNow+a+Math.floor(a*t.randomInitialInterval),u=n+a,A=t.state.lastTips??o*864e5,p=A+864e5+8*36e5-t.timeZone,h=u<=t.timeNow,E=p<=t.timeNow,I=null;return(h||E||!t.state.lastUpdate||!t.state.lastTips)&&(I={},I.lastUpdate=h?t.timeNow:n,I.lastTips=A,I.blocks=h?{}:t.state.blocks,I.displayedTips=t.state.displayedTips),{nextState:I,triggerUpdate:h,triggerTips:E,nextTips:E?o*864e5:A}}var Oy,rhe=Et(()=>{Pt();w1();rh();uS();ql();xf();Oy=class{constructor(e,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.nextTips=0;this.displayedTips=[];this.shouldCommitTips=!1;this.configuration=e;let o=this.getRegistryPath();this.isNew=!oe.existsSync(o),this.shouldShowTips=!1,this.sendReport(r),this.startBuffer()}commitTips(){this.shouldShowTips&&(this.shouldCommitTips=!0)}selectTip(e){let r=new Set(this.displayedTips),o=A=>A&&nn?tA(nn,A):!1,a=e.map((A,p)=>p).filter(A=>e[A]&&o(e[A]?.selector));if(a.length===0)return null;let n=a.filter(A=>!r.has(A));if(n.length===0){let A=Math.floor(a.length*.2);this.displayedTips=A>0?this.displayedTips.slice(-A):[],n=a.filter(p=>!r.has(p))}let u=n[Math.floor(Math.random()*n.length)];return this.displayedTips.push(u),this.commitTips(),e[u]}reportVersion(e){this.reportValue(\"version\",e.replace(/-git\\..*/,\"-git\"))}reportCommandName(e){this.reportValue(\"commandName\",e||\"<none>\")}reportPluginName(e){this.reportValue(\"pluginName\",e)}reportProject(e){this.reportEnumerator(\"projectCount\",e)}reportInstall(e){this.reportHit(\"installCount\",e)}reportPackageExtension(e){this.reportValue(\"packageExtension\",e)}reportWorkspaceCount(e){this.reportValue(\"workspaceCount\",String(e))}reportDependencyCount(e){this.reportValue(\"dependencyCount\",String(e))}reportValue(e,r){Sm(this.values,e).add(r)}reportEnumerator(e,r){Sm(this.enumerators,e).add(zi(r))}reportHit(e,r=\"*\"){let o=kI(this.hits,e),a=al(o,r,()=>0);o.set(r,a+1)}getRegistryPath(){let e=this.configuration.get(\"globalFolder\");return V.join(e,\"telemetry.json\")}sendReport(e){let r=this.getRegistryPath(),o;try{o=oe.readJsonSync(r)}catch{o={}}let{nextState:a,triggerUpdate:n,triggerTips:u,nextTips:A}=OAt({state:o,timeNow:Date.now(),timeZone:new Date().getTimezoneOffset()*60*1e3,randomInitialInterval:Math.random(),updateInterval:this.configuration.get(\"telemetryInterval\")});if(this.nextTips=A,this.displayedTips=o.displayedTips??[],a!==null)try{oe.mkdirSync(V.dirname(r),{recursive:!0}),oe.writeJsonSync(r,a)}catch{return!1}if(u&&this.configuration.get(\"enableTips\")&&(this.shouldShowTips=!0),n){let p=o.blocks??{};if(Object.keys(p).length===0){let h=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,E=I=>x4(h,I,{configuration:this.configuration}).catch(()=>{});for(let[I,v]of Object.entries(o.blocks??{})){if(Object.keys(v).length===0)continue;let x=v;x.userId=I,x.reportType=\"primary\";for(let L of Object.keys(x.enumerators??{}))x.enumerators[L]=x.enumerators[L].length;E(x);let C=new Map,R=20;for(let[L,U]of Object.entries(x.values))U.length>0&&C.set(L,U.slice(0,R));for(;C.size>0;){let L={};L.userId=I,L.reportType=\"secondary\",L.metrics={};for(let[U,z]of C)L.metrics[U]=z.shift(),z.length===0&&C.delete(U);E(L)}}}}return!0}applyChanges(){let e=this.getRegistryPath(),r;try{r=oe.readJsonSync(e)}catch{r={}}let o=this.configuration.get(\"telemetryUserId\")??\"*\",a=r.blocks=r.blocks??{},n=a[o]=a[o]??{};for(let u of this.hits.keys()){let A=n.hits=n.hits??{},p=A[u]=A[u]??{};for(let[h,E]of this.hits.get(u))p[h]=(p[h]??0)+E}for(let u of[\"values\",\"enumerators\"])for(let A of this[u].keys()){let p=n[u]=n[u]??{};p[A]=[...new Set([...p[A]??[],...this[u].get(A)??[]])]}this.shouldCommitTips&&(r.lastTips=this.nextTips,r.displayedTips=this.displayedTips),oe.mkdirSync(V.dirname(e),{recursive:!0}),oe.writeJsonSync(e,r)}startBuffer(){process.on(\"exit\",()=>{try{this.applyChanges()}catch{}})}}});var Y1={};Vt(Y1,{BuildDirectiveType:()=>Mx,CACHE_CHECKPOINT:()=>r_,CACHE_VERSION:()=>Lx,Cache:()=>Gr,Configuration:()=>Ke,DEFAULT_RC_FILENAME:()=>L4,FormatType:()=>Tle,InstallMode:()=>hl,LEGACY_PLUGINS:()=>l1,LOCKFILE_VERSION:()=>Gx,LegacyMigrationResolver:()=>Ty,LightReport:()=>AA,LinkType:()=>Fm,LockfileResolver:()=>Ny,Manifest:()=>Ut,MessageName:()=>wr,MultiFetcher:()=>Wm,PackageExtensionStatus:()=>pL,PackageExtensionType:()=>fL,PeerWarningType:()=>Yx,Project:()=>kt,Report:()=>Zs,ReportError:()=>Jt,SettingsType:()=>c1,StreamReport:()=>Rt,TAG_REGEXP:()=>ly,TelemetryManager:()=>Oy,ThrowReport:()=>ki,VirtualFetcher:()=>Km,WindowsLinkType:()=>mS,Workspace:()=>My,WorkspaceFetcher:()=>Vm,WorkspaceResolver:()=>ei,YarnVersion:()=>nn,execUtils:()=>Ur,folderUtils:()=>Rb,formatUtils:()=>pe,hashUtils:()=>wn,httpUtils:()=>sn,miscUtils:()=>He,nodeUtils:()=>Xi,parseMessageName:()=>ZD,reportOptionDeprecations:()=>uy,scriptUtils:()=>An,semverUtils:()=>Lr,stringifyMessageName:()=>Ku,structUtils:()=>G,tgzUtils:()=>$i,treeUtils:()=>fs});var Ge=Et(()=>{pS();Tb();jl();rh();uS();ql();fS();dU();xf();So();rpe();cpe();n_();u1();u1();Ape();i_();fpe();s_();Gm();$D();tO();the();Wl();I1();rhe();E_();nO();iO();mg();C_();w1();Cne()});var lhe=_((e8t,K1)=>{\"use strict\";var _At=process.env.TERM_PROGRAM===\"Hyper\",HAt=process.platform===\"win32\",she=process.platform===\"linux\",D_={ballotDisabled:\"\\u2612\",ballotOff:\"\\u2610\",ballotOn:\"\\u2611\",bullet:\"\\u2022\",bulletWhite:\"\\u25E6\",fullBlock:\"\\u2588\",heart:\"\\u2764\",identicalTo:\"\\u2261\",line:\"\\u2500\",mark:\"\\u203B\",middot:\"\\xB7\",minus:\"\\uFF0D\",multiplication:\"\\xD7\",obelus:\"\\xF7\",pencilDownRight:\"\\u270E\",pencilRight:\"\\u270F\",pencilUpRight:\"\\u2710\",percent:\"%\",pilcrow2:\"\\u2761\",pilcrow:\"\\xB6\",plusMinus:\"\\xB1\",section:\"\\xA7\",starsOff:\"\\u2606\",starsOn:\"\\u2605\",upDownArrow:\"\\u2195\"},ohe=Object.assign({},D_,{check:\"\\u221A\",cross:\"\\xD7\",ellipsisLarge:\"...\",ellipsis:\"...\",info:\"i\",question:\"?\",questionSmall:\"?\",pointer:\">\",pointerSmall:\"\\xBB\",radioOff:\"( )\",radioOn:\"(*)\",warning:\"\\u203C\"}),ahe=Object.assign({},D_,{ballotCross:\"\\u2718\",check:\"\\u2714\",cross:\"\\u2716\",ellipsisLarge:\"\\u22EF\",ellipsis:\"\\u2026\",info:\"\\u2139\",question:\"?\",questionFull:\"\\uFF1F\",questionSmall:\"\\uFE56\",pointer:she?\"\\u25B8\":\"\\u276F\",pointerSmall:she?\"\\u2023\":\"\\u203A\",radioOff:\"\\u25EF\",radioOn:\"\\u25C9\",warning:\"\\u26A0\"});K1.exports=HAt&&!_At?ohe:ahe;Reflect.defineProperty(K1.exports,\"common\",{enumerable:!1,value:D_});Reflect.defineProperty(K1.exports,\"windows\",{enumerable:!1,value:ohe});Reflect.defineProperty(K1.exports,\"other\",{enumerable:!1,value:ahe})});var zc=_((t8t,P_)=>{\"use strict\";var qAt=t=>t!==null&&typeof t==\"object\"&&!Array.isArray(t),jAt=/[\\u001b\\u009b][[\\]#;?()]*(?:(?:(?:[^\\W_]*;?[^\\W_]*)\\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,che=()=>{let t={enabled:!0,visible:!0,styles:{},keys:{}};\"FORCE_COLOR\"in process.env&&(t.enabled=process.env.FORCE_COLOR!==\"0\");let e=n=>{let u=n.open=`\\x1B[${n.codes[0]}m`,A=n.close=`\\x1B[${n.codes[1]}m`,p=n.regex=new RegExp(`\\\\u001b\\\\[${n.codes[1]}m`,\"g\");return n.wrap=(h,E)=>{h.includes(A)&&(h=h.replace(p,A+u));let I=u+h+A;return E?I.replace(/\\r*\\n/g,`${A}$&${u}`):I},n},r=(n,u,A)=>typeof n==\"function\"?n(u):n.wrap(u,A),o=(n,u)=>{if(n===\"\"||n==null)return\"\";if(t.enabled===!1)return n;if(t.visible===!1)return\"\";let A=\"\"+n,p=A.includes(`\n`),h=u.length;for(h>0&&u.includes(\"unstyle\")&&(u=[...new Set([\"unstyle\",...u])].reverse());h-- >0;)A=r(t.styles[u[h]],A,p);return A},a=(n,u,A)=>{t.styles[n]=e({name:n,codes:u}),(t.keys[A]||(t.keys[A]=[])).push(n),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(h){t.alias(n,h)},get(){let h=E=>o(E,h.stack);return Reflect.setPrototypeOf(h,t),h.stack=this.stack?this.stack.concat(n):[n],h}})};return a(\"reset\",[0,0],\"modifier\"),a(\"bold\",[1,22],\"modifier\"),a(\"dim\",[2,22],\"modifier\"),a(\"italic\",[3,23],\"modifier\"),a(\"underline\",[4,24],\"modifier\"),a(\"inverse\",[7,27],\"modifier\"),a(\"hidden\",[8,28],\"modifier\"),a(\"strikethrough\",[9,29],\"modifier\"),a(\"black\",[30,39],\"color\"),a(\"red\",[31,39],\"color\"),a(\"green\",[32,39],\"color\"),a(\"yellow\",[33,39],\"color\"),a(\"blue\",[34,39],\"color\"),a(\"magenta\",[35,39],\"color\"),a(\"cyan\",[36,39],\"color\"),a(\"white\",[37,39],\"color\"),a(\"gray\",[90,39],\"color\"),a(\"grey\",[90,39],\"color\"),a(\"bgBlack\",[40,49],\"bg\"),a(\"bgRed\",[41,49],\"bg\"),a(\"bgGreen\",[42,49],\"bg\"),a(\"bgYellow\",[43,49],\"bg\"),a(\"bgBlue\",[44,49],\"bg\"),a(\"bgMagenta\",[45,49],\"bg\"),a(\"bgCyan\",[46,49],\"bg\"),a(\"bgWhite\",[47,49],\"bg\"),a(\"blackBright\",[90,39],\"bright\"),a(\"redBright\",[91,39],\"bright\"),a(\"greenBright\",[92,39],\"bright\"),a(\"yellowBright\",[93,39],\"bright\"),a(\"blueBright\",[94,39],\"bright\"),a(\"magentaBright\",[95,39],\"bright\"),a(\"cyanBright\",[96,39],\"bright\"),a(\"whiteBright\",[97,39],\"bright\"),a(\"bgBlackBright\",[100,49],\"bgBright\"),a(\"bgRedBright\",[101,49],\"bgBright\"),a(\"bgGreenBright\",[102,49],\"bgBright\"),a(\"bgYellowBright\",[103,49],\"bgBright\"),a(\"bgBlueBright\",[104,49],\"bgBright\"),a(\"bgMagentaBright\",[105,49],\"bgBright\"),a(\"bgCyanBright\",[106,49],\"bgBright\"),a(\"bgWhiteBright\",[107,49],\"bgBright\"),t.ansiRegex=jAt,t.hasColor=t.hasAnsi=n=>(t.ansiRegex.lastIndex=0,typeof n==\"string\"&&n!==\"\"&&t.ansiRegex.test(n)),t.alias=(n,u)=>{let A=typeof u==\"string\"?t[u]:u;if(typeof A!=\"function\")throw new TypeError(\"Expected alias to be the name of an existing color (string) or a function\");A.stack||(Reflect.defineProperty(A,\"name\",{value:n}),t.styles[n]=A,A.stack=[n]),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(p){t.alias(n,p)},get(){let p=h=>o(h,p.stack);return Reflect.setPrototypeOf(p,t),p.stack=this.stack?this.stack.concat(A.stack):A.stack,p}})},t.theme=n=>{if(!qAt(n))throw new TypeError(\"Expected theme to be an object\");for(let u of Object.keys(n))t.alias(u,n[u]);return t},t.alias(\"unstyle\",n=>typeof n==\"string\"&&n!==\"\"?(t.ansiRegex.lastIndex=0,n.replace(t.ansiRegex,\"\")):\"\"),t.alias(\"noop\",n=>n),t.none=t.clear=t.noop,t.stripColor=t.unstyle,t.symbols=lhe(),t.define=a,t};P_.exports=che();P_.exports.create=che});var No=_(on=>{\"use strict\";var GAt=Object.prototype.toString,rc=zc(),uhe=!1,b_=[],Ahe={yellow:\"blue\",cyan:\"red\",green:\"magenta\",black:\"white\",blue:\"yellow\",red:\"cyan\",magenta:\"green\",white:\"black\"};on.longest=(t,e)=>t.reduce((r,o)=>Math.max(r,e?o[e].length:o.length),0);on.hasColor=t=>!!t&&rc.hasColor(t);var Kx=on.isObject=t=>t!==null&&typeof t==\"object\"&&!Array.isArray(t);on.nativeType=t=>GAt.call(t).slice(8,-1).toLowerCase().replace(/\\s/g,\"\");on.isAsyncFn=t=>on.nativeType(t)===\"asyncfunction\";on.isPrimitive=t=>t!=null&&typeof t!=\"object\"&&typeof t!=\"function\";on.resolve=(t,e,...r)=>typeof e==\"function\"?e.call(t,...r):e;on.scrollDown=(t=[])=>[...t.slice(1),t[0]];on.scrollUp=(t=[])=>[t.pop(),...t];on.reorder=(t=[])=>{let e=t.slice();return e.sort((r,o)=>r.index>o.index?1:r.index<o.index?-1:0),e};on.swap=(t,e,r)=>{let o=t.length,a=r===o?0:r<0?o-1:r,n=t[e];t[e]=t[a],t[a]=n};on.width=(t,e=80)=>{let r=t&&t.columns?t.columns:e;return t&&typeof t.getWindowSize==\"function\"&&(r=t.getWindowSize()[0]),process.platform===\"win32\"?r-1:r};on.height=(t,e=20)=>{let r=t&&t.rows?t.rows:e;return t&&typeof t.getWindowSize==\"function\"&&(r=t.getWindowSize()[1]),r};on.wordWrap=(t,e={})=>{if(!t)return t;typeof e==\"number\"&&(e={width:e});let{indent:r=\"\",newline:o=`\n`+r,width:a=80}=e,n=(o+r).match(/[^\\S\\n]/g)||[];a-=n.length;let u=`.{1,${a}}([\\\\s\\\\u200B]+|$)|[^\\\\s\\\\u200B]+?([\\\\s\\\\u200B]+|$)`,A=t.trim(),p=new RegExp(u,\"g\"),h=A.match(p)||[];return h=h.map(E=>E.replace(/\\n$/,\"\")),e.padEnd&&(h=h.map(E=>E.padEnd(a,\" \"))),e.padStart&&(h=h.map(E=>E.padStart(a,\" \"))),r+h.join(o)};on.unmute=t=>{let e=t.stack.find(o=>rc.keys.color.includes(o));return e?rc[e]:t.stack.find(o=>o.slice(2)===\"bg\")?rc[e.slice(2)]:o=>o};on.pascal=t=>t?t[0].toUpperCase()+t.slice(1):\"\";on.inverse=t=>{if(!t||!t.stack)return t;let e=t.stack.find(o=>rc.keys.color.includes(o));if(e){let o=rc[\"bg\"+on.pascal(e)];return o?o.black:t}let r=t.stack.find(o=>o.slice(0,2)===\"bg\");return r?rc[r.slice(2).toLowerCase()]||t:rc.none};on.complement=t=>{if(!t||!t.stack)return t;let e=t.stack.find(o=>rc.keys.color.includes(o)),r=t.stack.find(o=>o.slice(0,2)===\"bg\");if(e&&!r)return rc[Ahe[e]||e];if(r){let o=r.slice(2).toLowerCase(),a=Ahe[o];return a&&rc[\"bg\"+on.pascal(a)]||t}return rc.none};on.meridiem=t=>{let e=t.getHours(),r=t.getMinutes(),o=e>=12?\"pm\":\"am\";e=e%12;let a=e===0?12:e,n=r<10?\"0\"+r:r;return a+\":\"+n+\" \"+o};on.set=(t={},e=\"\",r)=>e.split(\".\").reduce((o,a,n,u)=>{let A=u.length-1>n?o[a]||{}:r;return!on.isObject(A)&&n<u.length-1&&(A={}),o[a]=A},t);on.get=(t={},e=\"\",r)=>{let o=t[e]==null?e.split(\".\").reduce((a,n)=>a&&a[n],t):t[e];return o??r};on.mixin=(t,e)=>{if(!Kx(t))return e;if(!Kx(e))return t;for(let r of Object.keys(e)){let o=Object.getOwnPropertyDescriptor(e,r);if(o.hasOwnProperty(\"value\"))if(t.hasOwnProperty(r)&&Kx(o.value)){let a=Object.getOwnPropertyDescriptor(t,r);Kx(a.value)?t[r]=on.merge({},t[r],e[r]):Reflect.defineProperty(t,r,o)}else Reflect.defineProperty(t,r,o);else Reflect.defineProperty(t,r,o)}return t};on.merge=(...t)=>{let e={};for(let r of t)on.mixin(e,r);return e};on.mixinEmitter=(t,e)=>{let r=e.constructor.prototype;for(let o of Object.keys(r)){let a=r[o];typeof a==\"function\"?on.define(t,o,a.bind(e)):on.define(t,o,a)}};on.onExit=t=>{let e=(r,o)=>{uhe||(uhe=!0,b_.forEach(a=>a()),r===!0&&process.exit(128+o))};b_.length===0&&(process.once(\"SIGTERM\",e.bind(null,!0,15)),process.once(\"SIGINT\",e.bind(null,!0,2)),process.once(\"exit\",e)),b_.push(t)};on.define=(t,e,r)=>{Reflect.defineProperty(t,e,{value:r})};on.defineExport=(t,e,r)=>{let o;Reflect.defineProperty(t,e,{enumerable:!0,configurable:!0,set(a){o=a},get(){return o?o():r()}})}});var fhe=_(qy=>{\"use strict\";qy.ctrl={a:\"first\",b:\"backward\",c:\"cancel\",d:\"deleteForward\",e:\"last\",f:\"forward\",g:\"reset\",i:\"tab\",k:\"cutForward\",l:\"reset\",n:\"newItem\",m:\"cancel\",j:\"submit\",p:\"search\",r:\"remove\",s:\"save\",u:\"undo\",w:\"cutLeft\",x:\"toggleCursor\",v:\"paste\"};qy.shift={up:\"shiftUp\",down:\"shiftDown\",left:\"shiftLeft\",right:\"shiftRight\",tab:\"prev\"};qy.fn={up:\"pageUp\",down:\"pageDown\",left:\"pageLeft\",right:\"pageRight\",delete:\"deleteForward\"};qy.option={b:\"backward\",f:\"forward\",d:\"cutRight\",left:\"cutLeft\",up:\"altUp\",down:\"altDown\"};qy.keys={pageup:\"pageUp\",pagedown:\"pageDown\",home:\"home\",end:\"end\",cancel:\"cancel\",delete:\"deleteForward\",backspace:\"delete\",down:\"down\",enter:\"submit\",escape:\"cancel\",left:\"left\",space:\"space\",number:\"number\",return:\"submit\",right:\"right\",tab:\"next\",up:\"up\"}});var ghe=_((i8t,hhe)=>{\"use strict\";var phe=ve(\"readline\"),YAt=fhe(),WAt=/^(?:\\x1b)([a-zA-Z0-9])$/,KAt=/^(?:\\x1b+)(O|N|\\[|\\[\\[)(?:(\\d+)(?:;(\\d+))?([~^$])|(?:1;)?(\\d+)?([a-zA-Z]))/,VAt={OP:\"f1\",OQ:\"f2\",OR:\"f3\",OS:\"f4\",\"[11~\":\"f1\",\"[12~\":\"f2\",\"[13~\":\"f3\",\"[14~\":\"f4\",\"[[A\":\"f1\",\"[[B\":\"f2\",\"[[C\":\"f3\",\"[[D\":\"f4\",\"[[E\":\"f5\",\"[15~\":\"f5\",\"[17~\":\"f6\",\"[18~\":\"f7\",\"[19~\":\"f8\",\"[20~\":\"f9\",\"[21~\":\"f10\",\"[23~\":\"f11\",\"[24~\":\"f12\",\"[A\":\"up\",\"[B\":\"down\",\"[C\":\"right\",\"[D\":\"left\",\"[E\":\"clear\",\"[F\":\"end\",\"[H\":\"home\",OA:\"up\",OB:\"down\",OC:\"right\",OD:\"left\",OE:\"clear\",OF:\"end\",OH:\"home\",\"[1~\":\"home\",\"[2~\":\"insert\",\"[3~\":\"delete\",\"[4~\":\"end\",\"[5~\":\"pageup\",\"[6~\":\"pagedown\",\"[[5~\":\"pageup\",\"[[6~\":\"pagedown\",\"[7~\":\"home\",\"[8~\":\"end\",\"[a\":\"up\",\"[b\":\"down\",\"[c\":\"right\",\"[d\":\"left\",\"[e\":\"clear\",\"[2$\":\"insert\",\"[3$\":\"delete\",\"[5$\":\"pageup\",\"[6$\":\"pagedown\",\"[7$\":\"home\",\"[8$\":\"end\",Oa:\"up\",Ob:\"down\",Oc:\"right\",Od:\"left\",Oe:\"clear\",\"[2^\":\"insert\",\"[3^\":\"delete\",\"[5^\":\"pageup\",\"[6^\":\"pagedown\",\"[7^\":\"home\",\"[8^\":\"end\",\"[Z\":\"tab\"};function zAt(t){return[\"[a\",\"[b\",\"[c\",\"[d\",\"[e\",\"[2$\",\"[3$\",\"[5$\",\"[6$\",\"[7$\",\"[8$\",\"[Z\"].includes(t)}function JAt(t){return[\"Oa\",\"Ob\",\"Oc\",\"Od\",\"Oe\",\"[2^\",\"[3^\",\"[5^\",\"[6^\",\"[7^\",\"[8^\"].includes(t)}var Vx=(t=\"\",e={})=>{let r,o={name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:t,raw:t,...e};if(Buffer.isBuffer(t)?t[0]>127&&t[1]===void 0?(t[0]-=128,t=\"\\x1B\"+String(t)):t=String(t):t!==void 0&&typeof t!=\"string\"?t=String(t):t||(t=o.sequence||\"\"),o.sequence=o.sequence||t||o.name,t===\"\\r\")o.raw=void 0,o.name=\"return\";else if(t===`\n`)o.name=\"enter\";else if(t===\"\t\")o.name=\"tab\";else if(t===\"\\b\"||t===\"\\x7F\"||t===\"\\x1B\\x7F\"||t===\"\\x1B\\b\")o.name=\"backspace\",o.meta=t.charAt(0)===\"\\x1B\";else if(t===\"\\x1B\"||t===\"\\x1B\\x1B\")o.name=\"escape\",o.meta=t.length===2;else if(t===\" \"||t===\"\\x1B \")o.name=\"space\",o.meta=t.length===2;else if(t<=\"\u001a\")o.name=String.fromCharCode(t.charCodeAt(0)+97-1),o.ctrl=!0;else if(t.length===1&&t>=\"0\"&&t<=\"9\")o.name=\"number\";else if(t.length===1&&t>=\"a\"&&t<=\"z\")o.name=t;else if(t.length===1&&t>=\"A\"&&t<=\"Z\")o.name=t.toLowerCase(),o.shift=!0;else if(r=WAt.exec(t))o.meta=!0,o.shift=/^[A-Z]$/.test(r[1]);else if(r=KAt.exec(t)){let a=[...t];a[0]===\"\\x1B\"&&a[1]===\"\\x1B\"&&(o.option=!0);let n=[r[1],r[2],r[4],r[6]].filter(Boolean).join(\"\"),u=(r[3]||r[5]||1)-1;o.ctrl=!!(u&4),o.meta=!!(u&10),o.shift=!!(u&1),o.code=n,o.name=VAt[n],o.shift=zAt(n)||o.shift,o.ctrl=JAt(n)||o.ctrl}return o};Vx.listen=(t={},e)=>{let{stdin:r}=t;if(!r||r!==process.stdin&&!r.isTTY)throw new Error(\"Invalid stream passed\");let o=phe.createInterface({terminal:!0,input:r});phe.emitKeypressEvents(r,o);let a=(A,p)=>e(A,Vx(A,p),o),n=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on(\"keypress\",a),o.resume(),()=>{r.isTTY&&r.setRawMode(n),r.removeListener(\"keypress\",a),o.pause(),o.close()}};Vx.action=(t,e,r)=>{let o={...YAt,...r};return e.ctrl?(e.action=o.ctrl[e.name],e):e.option&&o.option?(e.action=o.option[e.name],e):e.shift?(e.action=o.shift[e.name],e):(e.action=o.keys[e.name],e)};hhe.exports=Vx});var mhe=_((s8t,dhe)=>{\"use strict\";dhe.exports=t=>{t.timers=t.timers||{};let e=t.options.timers;if(e)for(let r of Object.keys(e)){let o=e[r];typeof o==\"number\"&&(o={interval:o}),XAt(t,r,o)}};function XAt(t,e,r={}){let o=t.timers[e]={name:e,start:Date.now(),ms:0,tick:0},a=r.interval||120;o.frames=r.frames||[],o.loading=!0;let n=setInterval(()=>{o.ms=Date.now()-o.start,o.tick++,t.render()},a);return o.stop=()=>{o.loading=!1,clearInterval(n)},Reflect.defineProperty(o,\"interval\",{value:n}),t.once(\"close\",()=>o.stop()),o.stop}});var Ehe=_((o8t,yhe)=>{\"use strict\";var{define:ZAt,width:$At}=No(),S_=class{constructor(e){let r=e.options;ZAt(this,\"_prompt\",e),this.type=e.type,this.name=e.name,this.message=\"\",this.header=\"\",this.footer=\"\",this.error=\"\",this.hint=\"\",this.input=\"\",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt=\"\",this.buffer=\"\",this.width=$At(r.stdout||process.stdout),Object.assign(this,r),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e={...this};return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let r=this._color||e[this.status];return typeof r==\"function\"?r:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading==\"boolean\"?this._loading:this.loadingChoices?\"choices\":!1}get status(){return this.cancelled?\"cancelled\":this.submitted?\"submitted\":\"pending\"}};yhe.exports=S_});var whe=_((a8t,Che)=>{\"use strict\";var x_=No(),eo=zc(),k_={default:eo.noop,noop:eo.noop,set inverse(t){this._inverse=t},get inverse(){return this._inverse||x_.inverse(this.primary)},set complement(t){this._complement=t},get complement(){return this._complement||x_.complement(this.primary)},primary:eo.cyan,success:eo.green,danger:eo.magenta,strong:eo.bold,warning:eo.yellow,muted:eo.dim,disabled:eo.gray,dark:eo.dim.gray,underline:eo.underline,set info(t){this._info=t},get info(){return this._info||this.primary},set em(t){this._em=t},get em(){return this._em||this.primary.underline},set heading(t){this._heading=t},get heading(){return this._heading||this.muted.underline},set pending(t){this._pending=t},get pending(){return this._pending||this.primary},set submitted(t){this._submitted=t},get submitted(){return this._submitted||this.success},set cancelled(t){this._cancelled=t},get cancelled(){return this._cancelled||this.danger},set typing(t){this._typing=t},get typing(){return this._typing||this.dim},set placeholder(t){this._placeholder=t},get placeholder(){return this._placeholder||this.primary.dim},set highlight(t){this._highlight=t},get highlight(){return this._highlight||this.inverse}};k_.merge=(t={})=>{t.styles&&typeof t.styles.enabled==\"boolean\"&&(eo.enabled=t.styles.enabled),t.styles&&typeof t.styles.visible==\"boolean\"&&(eo.visible=t.styles.visible);let e=x_.merge({},k_,t.styles);delete e.merge;for(let r of Object.keys(eo))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>eo[r]});for(let r of Object.keys(eo.styles))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>eo[r]});return e};Che.exports=k_});var Bhe=_((l8t,Ihe)=>{\"use strict\";var Q_=process.platform===\"win32\",Wf=zc(),eft=No(),F_={...Wf.symbols,upDownDoubleArrow:\"\\u21D5\",upDownDoubleArrow2:\"\\u2B0D\",upDownArrow:\"\\u2195\",asterisk:\"*\",asterism:\"\\u2042\",bulletWhite:\"\\u25E6\",electricArrow:\"\\u2301\",ellipsisLarge:\"\\u22EF\",ellipsisSmall:\"\\u2026\",fullBlock:\"\\u2588\",identicalTo:\"\\u2261\",indicator:Wf.symbols.check,leftAngle:\"\\u2039\",mark:\"\\u203B\",minus:\"\\u2212\",multiplication:\"\\xD7\",obelus:\"\\xF7\",percent:\"%\",pilcrow:\"\\xB6\",pilcrow2:\"\\u2761\",pencilUpRight:\"\\u2710\",pencilDownRight:\"\\u270E\",pencilRight:\"\\u270F\",plus:\"+\",plusMinus:\"\\xB1\",pointRight:\"\\u261E\",rightAngle:\"\\u203A\",section:\"\\xA7\",hexagon:{off:\"\\u2B21\",on:\"\\u2B22\",disabled:\"\\u2B22\"},ballot:{on:\"\\u2611\",off:\"\\u2610\",disabled:\"\\u2612\"},stars:{on:\"\\u2605\",off:\"\\u2606\",disabled:\"\\u2606\"},folder:{on:\"\\u25BC\",off:\"\\u25B6\",disabled:\"\\u25B6\"},prefix:{pending:Wf.symbols.question,submitted:Wf.symbols.check,cancelled:Wf.symbols.cross},separator:{pending:Wf.symbols.pointerSmall,submitted:Wf.symbols.middot,cancelled:Wf.symbols.middot},radio:{off:Q_?\"( )\":\"\\u25EF\",on:Q_?\"(*)\":\"\\u25C9\",disabled:Q_?\"(|)\":\"\\u24BE\"},numbers:[\"\\u24EA\",\"\\u2460\",\"\\u2461\",\"\\u2462\",\"\\u2463\",\"\\u2464\",\"\\u2465\",\"\\u2466\",\"\\u2467\",\"\\u2468\",\"\\u2469\",\"\\u246A\",\"\\u246B\",\"\\u246C\",\"\\u246D\",\"\\u246E\",\"\\u246F\",\"\\u2470\",\"\\u2471\",\"\\u2472\",\"\\u2473\",\"\\u3251\",\"\\u3252\",\"\\u3253\",\"\\u3254\",\"\\u3255\",\"\\u3256\",\"\\u3257\",\"\\u3258\",\"\\u3259\",\"\\u325A\",\"\\u325B\",\"\\u325C\",\"\\u325D\",\"\\u325E\",\"\\u325F\",\"\\u32B1\",\"\\u32B2\",\"\\u32B3\",\"\\u32B4\",\"\\u32B5\",\"\\u32B6\",\"\\u32B7\",\"\\u32B8\",\"\\u32B9\",\"\\u32BA\",\"\\u32BB\",\"\\u32BC\",\"\\u32BD\",\"\\u32BE\",\"\\u32BF\"]};F_.merge=t=>{let e=eft.merge({},Wf.symbols,F_,t.symbols);return delete e.merge,e};Ihe.exports=F_});var Dhe=_((c8t,vhe)=>{\"use strict\";var tft=whe(),rft=Bhe(),nft=No();vhe.exports=t=>{t.options=nft.merge({},t.options.theme,t.options),t.symbols=rft.merge(t.options),t.styles=tft.merge(t.options)}});var khe=_((She,xhe)=>{\"use strict\";var Phe=process.env.TERM_PROGRAM===\"Apple_Terminal\",ift=zc(),R_=No(),Jc=xhe.exports=She,vi=\"\\x1B[\",bhe=\"\\x07\",T_=!1,Dh=Jc.code={bell:bhe,beep:bhe,beginning:`${vi}G`,down:`${vi}J`,esc:vi,getPosition:`${vi}6n`,hide:`${vi}?25l`,line:`${vi}2K`,lineEnd:`${vi}K`,lineStart:`${vi}1K`,restorePosition:vi+(Phe?\"8\":\"u\"),savePosition:vi+(Phe?\"7\":\"s\"),screen:`${vi}2J`,show:`${vi}?25h`,up:`${vi}1J`},Og=Jc.cursor={get hidden(){return T_},hide(){return T_=!0,Dh.hide},show(){return T_=!1,Dh.show},forward:(t=1)=>`${vi}${t}C`,backward:(t=1)=>`${vi}${t}D`,nextLine:(t=1)=>`${vi}E`.repeat(t),prevLine:(t=1)=>`${vi}F`.repeat(t),up:(t=1)=>t?`${vi}${t}A`:\"\",down:(t=1)=>t?`${vi}${t}B`:\"\",right:(t=1)=>t?`${vi}${t}C`:\"\",left:(t=1)=>t?`${vi}${t}D`:\"\",to(t,e){return e?`${vi}${e+1};${t+1}H`:`${vi}${t+1}G`},move(t=0,e=0){let r=\"\";return r+=t<0?Og.left(-t):t>0?Og.right(t):\"\",r+=e<0?Og.up(-e):e>0?Og.down(e):\"\",r},restore(t={}){let{after:e,cursor:r,initial:o,input:a,prompt:n,size:u,value:A}=t;if(o=R_.isPrimitive(o)?String(o):\"\",a=R_.isPrimitive(a)?String(a):\"\",A=R_.isPrimitive(A)?String(A):\"\",u){let p=Jc.cursor.up(u)+Jc.cursor.to(n.length),h=a.length-r;return h>0&&(p+=Jc.cursor.left(h)),p}if(A||e){let p=!a&&o?-o.length:-a.length+r;return e&&(p-=e.length),a===\"\"&&o&&!n.includes(o)&&(p+=o.length),Jc.cursor.move(p)}}},N_=Jc.erase={screen:Dh.screen,up:Dh.up,down:Dh.down,line:Dh.line,lineEnd:Dh.lineEnd,lineStart:Dh.lineStart,lines(t){let e=\"\";for(let r=0;r<t;r++)e+=Jc.erase.line+(r<t-1?Jc.cursor.up(1):\"\");return t&&(e+=Jc.code.beginning),e}};Jc.clear=(t=\"\",e=process.stdout.columns)=>{if(!e)return N_.line+Og.to(0);let r=n=>[...ift.unstyle(n)].length,o=t.split(/\\r?\\n/),a=0;for(let n of o)a+=1+Math.floor(Math.max(r(n)-1,0)/e);return(N_.line+Og.prevLine()).repeat(a-1)+N_.line+Og.to(0)}});var jy=_((u8t,Fhe)=>{\"use strict\";var sft=ve(\"events\"),Qhe=zc(),L_=ghe(),oft=mhe(),aft=Ehe(),lft=Dhe(),Na=No(),Ug=khe(),M_=class t extends sft{constructor(e={}){super(),this.name=e.name,this.type=e.type,this.options=e,lft(this),oft(this),this.state=new aft(this),this.initial=[e.initial,e.default].find(r=>r!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=uft(this.options.margin),this.setMaxListeners(0),cft(this)}async keypress(e,r={}){this.keypressed=!0;let o=L_.action(e,L_(e,r),this.options.actions);this.state.keypress=o,this.emit(\"keypress\",e,o),this.emit(\"state\",this.state.clone());let a=this.options[o.action]||this[o.action]||this.dispatch;if(typeof a==\"function\")return await a.call(this,e,o);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit(\"alert\"):this.stdout.write(Ug.code.beep)}cursorHide(){this.stdout.write(Ug.cursor.hide()),Na.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(Ug.cursor.show())}write(e){e&&(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let r=this.state.buffer;this.state.buffer=\"\",!(!r&&!e||this.options.show===!1)&&this.stdout.write(Ug.cursor.down(e)+Ug.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:r,rest:o}=this.sections(),{cursor:a,initial:n=\"\",input:u=\"\",value:A=\"\"}=this,p=this.state.size=o.length,h={after:r,cursor:a,initial:n,input:u,prompt:e,size:p,value:A},E=Ug.cursor.restore(h);E&&this.stdout.write(E)}sections(){let{buffer:e,input:r,prompt:o}=this.state;o=Qhe.unstyle(o);let a=Qhe.unstyle(e),n=a.indexOf(o),u=a.slice(0,n),p=a.slice(n).split(`\n`),h=p[0],E=p[p.length-1],v=(o+(r?\" \"+r:\"\")).length,x=v<h.length?h.slice(v+1):\"\";return{header:u,prompt:h,after:x,rest:p.slice(1),last:E}}async submit(){this.state.submitted=!0,this.state.validating=!0,this.options.onSubmit&&await this.options.onSubmit.call(this,this.name,this.value,this);let e=this.state.error||await this.validate(this.value,this.state);if(e!==!0){let r=`\n`+this.symbols.pointer+\" \";typeof e==\"string\"?r+=e.trim():r+=\"Invalid input\",this.state.error=`\n`+this.styles.danger(r),this.state.submitted=!1,await this.render(),await this.alert(),this.state.validating=!1,this.state.error=void 0;return}this.state.validating=!1,await this.render(),await this.close(),this.value=await this.result(this.value),this.emit(\"submit\",this.value)}async cancel(e){this.state.cancelled=this.state.submitted=!0,await this.render(),await this.close(),typeof this.options.onCancel==\"function\"&&await this.options.onCancel.call(this,this.name,this.value,this),this.emit(\"cancel\",await this.error(e))}async close(){this.state.closed=!0;try{let e=this.sections(),r=Math.ceil(e.prompt.length/this.width);e.rest&&this.write(Ug.cursor.down(e.rest.length)),this.write(`\n`.repeat(r))}catch{}this.emit(\"close\")}start(){!this.stop&&this.options.show!==!1&&(this.stop=L_.listen(this,this.keypress.bind(this)),this.once(\"close\",this.stop))}async skip(){return this.skipped=this.options.skip===!0,typeof this.options.skip==\"function\"&&(this.skipped=await this.options.skip.call(this,this.name,this.value)),this.skipped}async initialize(){let{format:e,options:r,result:o}=this;if(this.format=()=>e.call(this,this.value),this.result=()=>o.call(this,this.value),typeof r.initial==\"function\"&&(this.initial=await r.initial.call(this,this)),typeof r.onRun==\"function\"&&await r.onRun.call(this,this),typeof r.onSubmit==\"function\"){let a=r.onSubmit.bind(this),n=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await a(this.name,this.value,this),n())}await this.start(),await this.render()}render(){throw new Error(\"expected prompt to have a custom render method\")}run(){return new Promise(async(e,r)=>{if(this.once(\"submit\",e),this.once(\"cancel\",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit(\"run\")})}async element(e,r,o){let{options:a,state:n,symbols:u,timers:A}=this,p=A&&A[e];n.timer=p;let h=a[e]||n[e]||u[e],E=r&&r[e]!=null?r[e]:await h;if(E===\"\")return E;let I=await this.resolve(E,n,r,o);return!I&&r&&r[e]?this.resolve(h,n,r,o):I}async prefix(){let e=await this.element(\"prefix\")||this.symbols,r=this.timers&&this.timers.prefix,o=this.state;return o.timer=r,Na.isObject(e)&&(e=e[o.status]||e.pending),Na.hasColor(e)?e:(this.styles[o.status]||this.styles.pending)(e)}async message(){let e=await this.element(\"message\");return Na.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element(\"separator\")||this.symbols,r=this.timers&&this.timers.separator,o=this.state;o.timer=r;let a=e[o.status]||e.pending||o.separator,n=await this.resolve(a,o);return Na.isObject(n)&&(n=n[o.status]||n.pending),Na.hasColor(n)?n:this.styles.muted(n)}async pointer(e,r){let o=await this.element(\"pointer\",e,r);if(typeof o==\"string\"&&Na.hasColor(o))return o;if(o){let a=this.styles,n=this.index===r,u=n?a.primary:h=>h,A=await this.resolve(o[n?\"on\":\"off\"]||o,this.state),p=Na.hasColor(A)?A:u(A);return n?p:\" \".repeat(A.length)}}async indicator(e,r){let o=await this.element(\"indicator\",e,r);if(typeof o==\"string\"&&Na.hasColor(o))return o;if(o){let a=this.styles,n=e.enabled===!0,u=n?a.success:a.dark,A=o[n?\"on\":\"off\"]||o;return Na.hasColor(A)?A:u(A)}return\"\"}body(){return null}footer(){if(this.state.status===\"pending\")return this.element(\"footer\")}header(){if(this.state.status===\"pending\")return this.element(\"header\")}async hint(){if(this.state.status===\"pending\"&&!this.isValue(this.state.input)){let e=await this.element(\"hint\");return Na.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?\"\":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==\"\"}resolve(e,...r){return Na.resolve(this,e,...r)}get base(){return t.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Na.height(this.stdout,25)}get width(){return this.options.columns||Na.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:r}=this.state,o=[r,e].find(this.isValue.bind(this));return this.isValue(o)?o:this.initial}static get prompt(){return e=>new this(e).run()}};function cft(t){let e=a=>t[a]===void 0||typeof t[a]==\"function\",r=[\"actions\",\"choices\",\"initial\",\"margin\",\"roles\",\"styles\",\"symbols\",\"theme\",\"timers\",\"value\"],o=[\"body\",\"footer\",\"error\",\"header\",\"hint\",\"indicator\",\"message\",\"prefix\",\"separator\",\"skip\"];for(let a of Object.keys(t.options)){if(r.includes(a)||/^on[A-Z]/.test(a))continue;let n=t.options[a];typeof n==\"function\"&&e(a)?o.includes(a)||(t[a]=n.bind(t)):typeof t[a]!=\"function\"&&(t[a]=n)}}function uft(t){typeof t==\"number\"&&(t=[t,t,t,t]);let e=[].concat(t||[]),r=a=>a%2===0?`\n`:\" \",o=[];for(let a=0;a<4;a++){let n=r(a);e[a]?o.push(n.repeat(e[a])):o.push(\"\")}return o}Fhe.exports=M_});var Nhe=_((A8t,The)=>{\"use strict\";var Aft=No(),Rhe={default(t,e){return e},checkbox(t,e){throw new Error(\"checkbox role is not implemented yet\")},editable(t,e){throw new Error(\"editable role is not implemented yet\")},expandable(t,e){throw new Error(\"expandable role is not implemented yet\")},heading(t,e){return e.disabled=\"\",e.indicator=[e.indicator,\" \"].find(r=>r!=null),e.message=e.message||\"\",e},input(t,e){throw new Error(\"input role is not implemented yet\")},option(t,e){return Rhe.default(t,e)},radio(t,e){throw new Error(\"radio role is not implemented yet\")},separator(t,e){return e.disabled=\"\",e.indicator=[e.indicator,\" \"].find(r=>r!=null),e.message=e.message||t.symbols.line.repeat(5),e},spacer(t,e){return e}};The.exports=(t,e={})=>{let r=Aft.merge({},Rhe,e.roles);return r[t]||r.default}});var V1=_((f8t,Ohe)=>{\"use strict\";var fft=zc(),pft=jy(),hft=Nhe(),zx=No(),{reorder:O_,scrollUp:gft,scrollDown:dft,isObject:Lhe,swap:mft}=zx,U_=class extends pft{constructor(e){super(e),this.cursorHide(),this.maxSelected=e.maxSelected||1/0,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=\"\"}async initialize(){typeof this.options.initial==\"function\"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:r,autofocus:o,suggest:a}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(n=>n.enabled=!1),typeof a!=\"function\"&&this.selectable.length===0)throw new Error(\"At least one choice must be selectable\");Lhe(r)&&(r=Object.keys(r)),Array.isArray(r)?(o!=null&&(this.index=this.findIndex(o)),r.forEach(n=>this.enable(this.find(n))),await this.render()):(o!=null&&(r=o),typeof r==\"string\"&&(r=this.findIndex(r)),typeof r==\"number\"&&r>-1&&(this.index=Math.max(0,Math.min(r,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,r){this.state.loadingChoices=!0;let o=[],a=0,n=async(u,A)=>{typeof u==\"function\"&&(u=await u.call(this)),u instanceof Promise&&(u=await u);for(let p=0;p<u.length;p++){let h=u[p]=await this.toChoice(u[p],a++,A);o.push(h),h.choices&&await n(h.choices,h)}return o};return n(e,r).then(u=>(this.state.loadingChoices=!1,u))}async toChoice(e,r,o){if(typeof e==\"function\"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e==\"string\"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let a=e.value;if(e=hft(e.role,this.options)(this,e),typeof e.disabled==\"string\"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint=\"(disabled)\"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||\"\",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input=\"\",e.index=r,e.cursor=0,zx.define(e,\"parent\",o),e.level=o?o.level+1:1,e.indent==null&&(e.indent=o?o.indent+\"  \":e.indent||\"\"),e.path=o?o.path+\".\"+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,fft.unstyle(e.message).length));let u={...e};return e.reset=(A=u.input,p=u.value)=>{for(let h of Object.keys(u))e[h]=u[h];e.input=A,e.value=p},a==null&&typeof e.initial==\"function\"&&(e.input=await e.initial.call(this,this.state,e,r)),e}async onChoice(e,r){this.emit(\"choice\",e,r,this),typeof e.onChoice==\"function\"&&await e.onChoice.call(this,this.state,e,r)}async addChoice(e,r,o){let a=await this.toChoice(e,r,o);return this.choices.push(a),this.index=this.choices.length-1,this.limit=this.choices.length,a}async newItem(e,r,o){let a={name:\"New choice name?\",editable:!0,newChoice:!0,...e},n=await this.addChoice(a,r,o);return n.updateChoice=()=>{delete n.newChoice,n.name=n.message=n.input,n.input=\"\",n.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?\"  \".repeat(e.level-1):\"\":e.indent}dispatch(e,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(e,r){return typeof r!=\"boolean\"&&(r=e.enabled),r&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=r&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelected<this.choices.length)return this.alert();let e=this.selectable.every(r=>r.enabled);return this.choices.forEach(r=>r.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(r=>!!r.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,r){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!=\"boolean\"&&(r=!e.enabled),e.enabled=r,e.choices&&e.choices.forEach(a=>this.toggle(a,r));let o=e.parent;for(;o;){let a=o.choices.filter(n=>this.isDisabled(n));o.enabled=a.every(n=>n.enabled===!0),o=o.parent}return Mhe(this,this.choices),this.emit(\"toggle\",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let r=o=>{let a=Number(o);if(a>this.choices.length-1)return this.alert();let n=this.focused,u=this.choices.find(A=>a===A.index);if(!u.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(u)===-1){let A=O_(this.choices),p=A.indexOf(u);if(n.index>p){let h=A.slice(p,p+this.limit),E=A.filter(I=>!h.includes(I));this.choices=h.concat(E)}else{let h=p-this.limit+1;this.choices=A.slice(h).concat(A.slice(0,h))}}return this.index=this.choices.indexOf(u),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(o=>{let a=this.choices.length,n=this.num,u=(A=!1,p)=>{clearTimeout(this.numberTimeout),A&&(p=r(n)),this.num=\"\",o(p)};if(n===\"0\"||n.length===1&&+(n+\"0\")>a)return u(!0);if(Number(n)>a)return u(!1,this.alert());this.numberTimeout=setTimeout(()=>u(!0),this.delay)})}home(){return this.choices=O_(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,r=O_(this.choices);return this.choices=r.slice(e).concat(r.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,r=this.visible.length,o=this.index;return this.options.scroll===!1&&o===0?this.alert():e>r&&o===0?this.scrollUp():(this.index=(o-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,r=this.visible.length,o=this.index;return this.options.scroll===!1&&o===r-1?this.alert():e>r&&o===r-1?this.scrollDown():(this.index=(o+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=gft(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=dft(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){mft(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&[\"disabled\",\"collapsed\",\"hidden\",\"completing\",\"readonly\"].some(o=>e[o]===!0)?!0:e&&e.role===\"heading\"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(r=>this.isEnabled(r));if(e.choices){let r=e.choices.filter(o=>!this.isDisabled(o));return e.enabled&&r.every(o=>this.isEnabled(o))}return e.enabled&&!this.isDisabled(e)}isChoice(e,r){return e.name===r||e.index===Number(r)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(e,r)):this.isChoice(e,this.initial)}map(e=[],r=\"value\"){return[].concat(e||[]).reduce((o,a)=>(o[a]=this.find(a,r),o),{})}filter(e,r){let a=typeof e==\"function\"?e:(A,p)=>[A.name,p].includes(e),u=(this.options.multiple?this.state._choices:this.choices).filter(a);return r?u.map(A=>A[r]):u}find(e,r){if(Lhe(e))return r?e[r]:e;let a=typeof e==\"function\"?e:(u,A)=>[u.name,A].includes(e),n=this.choices.find(a);if(n)return r?n[r]:n}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(u=>u.newChoice))return this.alert();let{reorder:r,sort:o}=this.options,a=this.multiple===!0,n=this.selected;return n===void 0?this.alert():(Array.isArray(n)&&r!==!1&&o!==!0&&(n=zx.reorder(n)),this.value=a?n.map(u=>u.name):n.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let r of e)this.state._choices.some(o=>o.name===r.name)||this.state._choices.push(r);if(!this._initial&&this.options.initial){this._initial=!0;let r=this.initial;if(typeof r==\"string\"||typeof r==\"number\"){let o=this.find(r);o&&(this.initial=o.index,this.focus(o,!0))}}}get choices(){return Mhe(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:r,choices:o}=this,a=e.limit||this._limit||r.limit||o.length;return Math.min(a,this.height)}set value(e){super.value=e}get value(){return typeof super.value!=\"string\"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function Mhe(t,e){if(e instanceof Promise)return e;if(typeof e==\"function\"){if(zx.isAsyncFn(e))return e;e=e.call(t,t)}for(let r of e){if(Array.isArray(r.choices)){let o=r.choices.filter(a=>!t.isDisabled(a));r.enabled=o.every(a=>a.enabled===!0)}t.isDisabled(r)===!0&&delete r.enabled}return e}Ohe.exports=U_});var Ph=_((p8t,Uhe)=>{\"use strict\";var yft=V1(),__=No(),H_=class extends yft{constructor(e){super(e),this.emptyError=this.options.emptyError||\"No items were selected\"}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,r){return!this.multiple||this.options.pointer?super.pointer(e,r):\"\"}indicator(e,r){return this.multiple?super.indicator(e,r):\"\"}choiceMessage(e,r){let o=this.resolve(e.message,this.state,e,r);return e.role===\"heading\"&&!__.hasColor(o)&&(o=this.styles.strong(o)),this.resolve(o,this.state,e,r)}choiceSeparator(){return\":\"}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=await this.pointer(e,r),n=await this.indicator(e,r)+(e.pad||\"\"),u=await this.resolve(e.hint,this.state,e,r);u&&!__.hasColor(u)&&(u=this.styles.muted(u));let A=this.indent(e),p=await this.choiceMessage(e,r),h=()=>[this.margin[3],A+a+n,p,this.margin[1],u].filter(Boolean).join(\" \");return e.role===\"heading\"?h():e.disabled?(__.hasColor(p)||(p=this.styles.disabled(p)),h()):(o&&(p=this.styles.em(p)),h())}async renderChoices(){if(this.state.loading===\"choices\")return this.styles.warning(\"Loading choices\");if(this.state.submitted)return\"\";let e=this.visible.map(async(n,u)=>await this.renderChoice(n,u)),r=await Promise.all(e);r.length||r.push(this.styles.danger(\"No matching choices\"));let o=this.margin[0]+r.join(`\n`),a;return this.options.choicesHeader&&(a=await this.resolve(this.options.choicesHeader,this.state)),[a,o].filter(Boolean).join(`\n`)}format(){return!this.state.submitted||this.state.cancelled?\"\":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(\", \"):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:r}=this.state,o=\"\",a=await this.header(),n=await this.prefix(),u=await this.separator(),A=await this.message();this.options.promptLine!==!1&&(o=[n,A,u,\"\"].join(\" \"),this.state.prompt=o);let p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),I=await this.footer();p&&(o+=p),h&&!o.includes(h)&&(o+=\" \"+h),e&&!p&&!E.trim()&&this.multiple&&this.emptyError!=null&&(o+=this.styles.danger(this.emptyError)),this.clear(r),this.write([a,o,E,I].filter(Boolean).join(`\n`)),this.write(this.margin[2]),this.restore()}};Uhe.exports=H_});var Hhe=_((h8t,_he)=>{\"use strict\";var Eft=Ph(),Cft=(t,e)=>{let r=t.toLowerCase();return o=>{let n=o.toLowerCase().indexOf(r),u=e(o.slice(n,n+r.length));return n>=0?o.slice(0,n)+u+o.slice(n+r.length):o}},q_=class extends Eft{constructor(e){super(e),this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:r,input:o}=this.state;return this.input=o.slice(0,r)+e+o.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:r}=this.state;return r?(this.input=r.slice(0,e-1)+r.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:r}=this.state;return r[e]===void 0?this.alert():(this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,r=this.state._choices){if(typeof this.options.suggest==\"function\")return this.options.suggest.call(this,e,r);let o=e.toLowerCase();return r.filter(a=>a.message.toLowerCase().includes(o))}pointer(){return\"\"}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(\", \");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!==\"pending\")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=Cft(this.input,e),o=this.choices;this.choices=o.map(a=>({...a,message:r(a.message)})),await super.render(),this.choices=o}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};_he.exports=q_});var G_=_((g8t,qhe)=>{\"use strict\";var j_=No();qhe.exports=(t,e={})=>{t.cursorHide();let{input:r=\"\",initial:o=\"\",pos:a,showCursor:n=!0,color:u}=e,A=u||t.styles.placeholder,p=j_.inverse(t.styles.primary),h=R=>p(t.styles.black(R)),E=r,I=\" \",v=h(I);if(t.blink&&t.blink.off===!0&&(h=R=>R,v=\"\"),n&&a===0&&o===\"\"&&r===\"\")return h(I);if(n&&a===0&&(r===o||r===\"\"))return h(o[0])+A(o.slice(1));o=j_.isPrimitive(o)?`${o}`:\"\",r=j_.isPrimitive(r)?`${r}`:\"\";let x=o&&o.startsWith(r)&&o!==r,C=x?h(o[r.length]):v;if(a!==r.length&&n===!0&&(E=r.slice(0,a)+h(r[a])+r.slice(a+1),C=\"\"),n===!1&&(C=\"\"),x){let R=t.styles.unstyle(E+C);return E+C+A(o.slice(R.length))}return E+C}});var Jx=_((d8t,jhe)=>{\"use strict\";var wft=zc(),Ift=Ph(),Bft=G_(),Y_=class extends Ift{constructor(e){super({...e,multiple:!0}),this.type=\"form\",this.initial=this.options.initial,this.align=[this.options.align,\"right\"].find(r=>r!=null),this.emptyError=\"\",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let r=this.focused;if(!r)return this.alert();let{cursor:o,input:a}=r;return r.value=r.input=a.slice(0,o)+e+a.slice(o),r.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:r,input:o}=e;return e.value=e.input=o.slice(0,r-1)+o.slice(r),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:r,input:o}=e;if(o[r]===void 0)return this.alert();let a=`${o}`.slice(0,r)+`${o}`.slice(r+1);return e.value=e.input=a,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,r){return this.dispatch(e,r)}number(e,r){return this.dispatch(e,r)}next(){let e=this.focused;if(!e)return this.alert();let{initial:r,input:o}=e;return r&&r.startsWith(o)&&o!==r?(e.value=e.input=r,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input=\"\",e.cursor=0,this.render()):this.alert()}separator(){return\"\"}format(e){return this.state.submitted?\"\":super.format(e)}pointer(){return\"\"}indicator(e){return e.input?\"\\u29BF\":\"\\u2299\"}async choiceSeparator(e,r){let o=await this.resolve(e.separator,this.state,e,r)||\":\";return o?\" \"+this.styles.disabled(o):\"\"}async renderChoice(e,r){await this.onChoice(e,r);let{state:o,styles:a}=this,{cursor:n,initial:u=\"\",name:A,hint:p,input:h=\"\"}=e,{muted:E,submitted:I,primary:v,danger:x}=a,C=p,R=this.index===r,L=e.validate||(()=>!0),U=await this.choiceSeparator(e,r),z=e.message;this.align===\"right\"&&(z=z.padStart(this.longest+1,\" \")),this.align===\"left\"&&(z=z.padEnd(this.longest+1,\" \"));let te=this.values[A]=h||u,ae=h?\"success\":\"dark\";await L.call(e,te,this.state)!==!0&&(ae=\"danger\");let le=a[ae],ce=le(await this.indicator(e,r))+(e.pad||\"\"),Ce=this.indent(e),de=()=>[Ce,ce,z+U,h,C].filter(Boolean).join(\" \");if(o.submitted)return z=wft.unstyle(z),h=I(h),C=\"\",de();if(e.format)h=await e.format.call(this,h,e,r);else{let Be=this.styles.muted;h=Bft(this,{input:h,initial:u,pos:n,showCursor:R,color:Be})}return this.isValue(h)||(h=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[A]=await e.result.call(this,te,e,r)),R&&(z=v(z)),e.error?h+=(h?\" \":\"\")+x(e.error.trim()):e.hint&&(h+=(h?\" \":\"\")+E(e.hint.trim())),de()}async submit(){return this.value=this.values,super.base.submit.call(this)}};jhe.exports=Y_});var W_=_((m8t,Yhe)=>{\"use strict\";var vft=Jx(),Dft=()=>{throw new Error(\"expected prompt to have a custom authenticate method\")},Ghe=(t=Dft)=>{class e extends vft{constructor(o){super(o)}async submit(){this.value=await t.call(this,this.values,this.state),super.base.submit.call(this)}static create(o){return Ghe(o)}}return e};Yhe.exports=Ghe()});var Vhe=_((y8t,Khe)=>{\"use strict\";var Pft=W_();function bft(t,e){return t.username===this.options.username&&t.password===this.options.password}var Whe=(t=bft)=>{let e=[{name:\"username\",message:\"username\"},{name:\"password\",message:\"password\",format(o){return this.options.showPassword?o:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(o.length))}}];class r extends Pft.create(t){constructor(a){super({...a,choices:e})}static create(a){return Whe(a)}}return r};Khe.exports=Whe()});var Xx=_((E8t,zhe)=>{\"use strict\";var Sft=jy(),{isPrimitive:xft,hasColor:kft}=No(),K_=class extends Sft{constructor(e){super(e),this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:r,state:o}=this;return o.submitted?r.success(e):r.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return xft(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status===\"pending\"){let e=await this.element(\"hint\");return kft(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u=this.styles.muted(this.default),A=[o,n,u,a].filter(Boolean).join(\" \");this.state.prompt=A;let p=await this.header(),h=this.value=this.cast(e),E=await this.format(h),I=await this.error()||await this.hint(),v=await this.footer();I&&!A.includes(I)&&(E+=\" \"+I),A+=\" \"+E,this.clear(r),this.write([p,A,v].filter(Boolean).join(`\n`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};zhe.exports=K_});var Xhe=_((C8t,Jhe)=>{\"use strict\";var Qft=Xx(),V_=class extends Qft{constructor(e){super(e),this.default=this.options.default||(this.initial?\"(Y/n)\":\"(y/N)\")}};Jhe.exports=V_});var $he=_((w8t,Zhe)=>{\"use strict\";var Fft=Ph(),Rft=Jx(),Gy=Rft.prototype,z_=class extends Fft{constructor(e){super({...e,multiple:!0}),this.align=[this.options.align,\"left\"].find(r=>r!=null),this.emptyError=\"\",this.values={}}dispatch(e,r){let o=this.focused,a=o.parent||{};return!o.editable&&!a.editable&&(e===\"a\"||e===\"i\")?super[e]():Gy.dispatch.call(this,e,r)}append(e,r){return Gy.append.call(this,e,r)}delete(e,r){return Gy.delete.call(this,e,r)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?Gy.next.call(this):super.next()}prev(){return this.focused.editable?Gy.prev.call(this):super.prev()}async indicator(e,r){let o=e.indicator||\"\",a=e.editable?o:super.indicator(e,r);return await this.resolve(a,this.state,e,r)||\"\"}indent(e){return e.role===\"heading\"?\"\":e.editable?\" \":\"  \"}async renderChoice(e,r){return e.indent=\"\",e.editable?Gy.renderChoice.call(this,e,r):super.renderChoice(e,r)}error(){return\"\"}footer(){return this.state.error}async validate(){let e=!0;for(let r of this.choices){if(typeof r.validate!=\"function\"||r.role===\"heading\")continue;let o=r.parent?this.value[r.parent.name]:this.value;if(r.editable?o=r.value===r.name?r.initial||\"\":r.value:this.isDisabled(r)||(o=r.enabled===!0),e=await r.validate(o,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e==\"string\"?e:\"Invalid Input\"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let r=e.parent?this.value[e.parent.name]:this.value;if(e.role===\"heading\"){this.value[e.name]={};continue}e.editable?r[e.name]=e.value===e.name?e.initial||\"\":e.value:this.isDisabled(e)||(r[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};Zhe.exports=z_});var _g=_((I8t,e0e)=>{\"use strict\";var Tft=jy(),Nft=G_(),{isPrimitive:Lft}=No(),J_=class extends Tft{constructor(e){super(e),this.initial=Lft(this.initial)?String(this.initial):\"\",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,r={}){let o=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name===\"return\"&&(!o||o.name!==\"return\")?this.append(`\n`,r):super.keypress(e,r)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value=\"\",this.cursor=0,this.render()}dispatch(e,r){if(!e||r.ctrl||r.code)return this.alert();this.append(e)}append(e){let{cursor:r,input:o}=this.state;this.input=`${o}`.slice(0,r)+e+`${o}`.slice(r),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:r}=this.state;if(e<=0)return this.alert();this.input=`${r}`.slice(0,e-1)+`${r}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:r}=this.state;if(r[e]===void 0)return this.alert();this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let r=this.input.slice(0,e),o=this.input.slice(e),a=r.split(\" \");this.state.clipboard.push(a.pop()),this.input=a.join(\" \"),this.cursor=this.input.length,this.input+=o,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):\"\";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||r):Nft(this,{input:e,initial:r,pos:this.cursor})}async render(){let e=this.state.size,r=await this.prefix(),o=await this.separator(),a=await this.message(),n=[r,a,o].filter(Boolean).join(\" \");this.state.prompt=n;let u=await this.header(),A=await this.format(),p=await this.error()||await this.hint(),h=await this.footer();p&&!A.includes(p)&&(A+=\" \"+p),n+=\" \"+A,this.clear(e),this.write([u,n,h].filter(Boolean).join(`\n`)),this.restore()}};e0e.exports=J_});var r0e=_((B8t,t0e)=>{\"use strict\";var Mft=t=>t.filter((e,r)=>t.lastIndexOf(e)===r),Zx=t=>Mft(t).filter(Boolean);t0e.exports=(t,e={},r=\"\")=>{let{past:o=[],present:a=\"\"}=e,n,u;switch(t){case\"prev\":case\"undo\":return n=o.slice(0,o.length-1),u=o[o.length-1]||\"\",{past:Zx([r,...n]),present:u};case\"next\":case\"redo\":return n=o.slice(1),u=o[0]||\"\",{past:Zx([...n,r]),present:u};case\"save\":return{past:Zx([...o,r]),present:\"\"};case\"remove\":return u=Zx(o.filter(A=>A!==r)),a=\"\",u.length&&(a=u.pop()),{past:u,present:a};default:throw new Error(`Invalid action: \"${t}\"`)}}});var Z_=_((v8t,i0e)=>{\"use strict\";var Oft=_g(),n0e=r0e(),X_=class extends Oft{constructor(e){super(e);let r=this.options.history;if(r&&r.store){let o=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get(\"values\")||{past:[],present:o},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=n0e(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion(\"prev\")}altDown(){return this.completion(\"next\")}prev(){return this.save(),super.prev()}save(){this.store&&(this.data=n0e(\"save\",this.data,this.input),this.store.set(\"values\",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};i0e.exports=X_});var o0e=_((D8t,s0e)=>{\"use strict\";var Uft=_g(),$_=class extends Uft{format(){return\"\"}};s0e.exports=$_});var l0e=_((P8t,a0e)=>{\"use strict\";var _ft=_g(),e8=class extends _ft{constructor(e={}){super(e),this.sep=this.options.separator||/, */,this.initial=e.initial||\"\"}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:r=>r;return this.list.map(e).join(\", \")}async submit(e){let r=this.state.error||await this.validate(this.list,this.state);return r!==!0?(this.state.error=r,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};a0e.exports=e8});var u0e=_((b8t,c0e)=>{\"use strict\";var Hft=Ph(),t8=class extends Hft{constructor(e){super({...e,multiple:!0})}};c0e.exports=t8});var n8=_((S8t,A0e)=>{\"use strict\";var qft=_g(),r8=class extends qft{constructor(e={}){super({style:\"number\",...e}),this.min=this.isValue(e.min)?this.toNumber(e.min):-1/0,this.max=this.isValue(e.max)?this.toNumber(e.max):1/0,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:\"\",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e===\".\"&&this.input.includes(\".\")?this.alert(\"invalid number\"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let r=e||this.minor,o=this.toNumber(this.input);return o>this.max+r?this.alert():(this.input=`${o+r}`,this.render())}down(e){let r=e||this.minor,o=this.toNumber(this.input);return o<this.min-r?this.alert():(this.input=`${o-r}`,this.render())}shiftDown(){return this.down(this.major)}shiftUp(){return this.up(this.major)}format(e=this.input){return typeof this.options.format==\"function\"?this.options.format.call(this,e):this.styles.info(e)}toNumber(e=\"\"){return this.float?+e:Math.round(+e)}isValue(e){return/^[-+]?[0-9]+((\\.)|(\\.[0-9]+))?$/.test(e)}submit(){let e=[this.input,this.initial].find(r=>this.isValue(r));return this.value=this.toNumber(e||0),super.submit()}};A0e.exports=r8});var p0e=_((x8t,f0e)=>{f0e.exports=n8()});var g0e=_((k8t,h0e)=>{\"use strict\";var jft=_g(),i8=class extends jft{constructor(e){super(e),this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):\"\"}};h0e.exports=i8});var y0e=_((Q8t,m0e)=>{\"use strict\";var Gft=zc(),Yft=V1(),d0e=No(),s8=class extends Yft{constructor(e={}){super(e),this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||\"left\"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||`\n   `;let r=e.startNumber||1;typeof this.scale==\"number\"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((o,a)=>({name:a+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let r of this.choices){e=Math.max(e,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let o=0;o<this.scale.length;o++)r.scale.push({index:o})}this.widths[0]=Math.min(this.widths[0],e+3)}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);this.alert()}heading(e,r,o){return this.styles.strong(e)}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIndex>=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return\"\"}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(\", \"):\"\"}pointer(){return\"\"}renderScaleKey(){return this.scaleKey===!1||this.state.submitted?\"\":[\"\",...this.scale.map(o=>`   ${o.name} - ${o.message}`)].map(o=>this.styles.muted(o)).join(`\n`)}renderScaleHeading(e){let r=this.scale.map(p=>p.name);typeof this.options.renderScaleHeading==\"function\"&&(r=this.options.renderScaleHeading.call(this,e));let o=this.scaleLength-r.join(\"\").length,a=Math.round(o/(r.length-1)),u=r.map(p=>this.styles.strong(p)).join(\" \".repeat(a)),A=\" \".repeat(this.widths[0]);return this.margin[3]+A+this.margin[1]+u}scaleIndicator(e,r,o){if(typeof this.options.scaleIndicator==\"function\")return this.options.scaleIndicator.call(this,e,r,o);let a=e.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):a?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,r){let o=e.scale.map(n=>this.scaleIndicator(e,n,r)),a=this.term===\"Hyper\"?\"\":\" \";return o.join(a+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=await this.pointer(e,r),n=await e.hint;n&&!d0e.hasColor(n)&&(n=this.styles.muted(n));let u=C=>this.margin[3]+C.replace(/\\s+$/,\"\").padEnd(this.widths[0],\" \"),A=this.newline,p=this.indent(e),h=await this.resolve(e.message,this.state,e,r),E=await this.renderScale(e,r),I=this.margin[1]+this.margin[3];this.scaleLength=Gft.unstyle(E).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-I.length);let x=d0e.wordWrap(h,{width:this.widths[0],newline:A}).split(`\n`).map(C=>u(C)+this.margin[1]);return o&&(E=this.styles.info(E),x=x.map(C=>this.styles.info(C))),x[0]+=E,this.linebreak&&x.push(\"\"),[p+a,x.join(`\n`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return\"\";this.tableize();let e=this.visible.map(async(a,n)=>await this.renderChoice(a,n)),r=await Promise.all(e),o=await this.renderScaleHeading();return this.margin[0]+[o,...r.map(a=>a.join(\" \"))].join(`\n`)}async render(){let{submitted:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u=\"\";this.options.promptLine!==!1&&(u=[o,n,a,\"\"].join(\" \"),this.state.prompt=u);let A=await this.header(),p=await this.format(),h=await this.renderScaleKey(),E=await this.error()||await this.hint(),I=await this.renderChoices(),v=await this.footer(),x=this.emptyError;p&&(u+=p),E&&!u.includes(E)&&(u+=\" \"+E),e&&!p&&!I.trim()&&this.multiple&&x!=null&&(u+=this.styles.danger(x)),this.clear(r),this.write([A,u,h,I,v].filter(Boolean).join(`\n`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};m0e.exports=s8});var w0e=_((F8t,C0e)=>{\"use strict\";var E0e=zc(),Wft=(t=\"\")=>typeof t==\"string\"?t.replace(/^['\"]|['\"]$/g,\"\"):\"\",a8=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=Wft(e.initial||this.field.initial||\"\"),this.message=e.message||this.name,this.cursor=0,this.input=\"\",this.lines=[]}},Kft=async(t={},e={},r=o=>o)=>{let o=new Set,a=t.fields||[],n=t.template,u=[],A=[],p=[],h=1;typeof n==\"function\"&&(n=await n());let E=-1,I=()=>n[++E],v=()=>n[E+1],x=C=>{C.line=h,u.push(C)};for(x({type:\"bos\",value:\"\"});E<n.length-1;){let C=I();if(/^[^\\S\\n ]$/.test(C)){x({type:\"text\",value:C});continue}if(C===`\n`){x({type:\"newline\",value:C}),h++;continue}if(C===\"\\\\\"){C+=I(),x({type:\"text\",value:C});continue}if((C===\"$\"||C===\"#\"||C===\"{\")&&v()===\"{\"){let L=I();C+=L;let U={type:\"template\",open:C,inner:\"\",close:\"\",value:C},z;for(;z=I();){if(z===\"}\"){v()===\"}\"&&(z+=I()),U.value+=z,U.close=z;break}z===\":\"?(U.initial=\"\",U.key=U.inner):U.initial!==void 0&&(U.initial+=z),U.value+=z,U.inner+=z}U.template=U.open+(U.initial||U.inner)+U.close,U.key=U.key||U.inner,e.hasOwnProperty(U.key)&&(U.initial=e[U.key]),U=r(U),x(U),p.push(U.key),o.add(U.key);let te=A.find(ae=>ae.name===U.key);U.field=a.find(ae=>ae.name===U.key),te||(te=new a8(U),A.push(te)),te.lines.push(U.line-1);continue}let R=u[u.length-1];R.type===\"text\"&&R.line===h?R.value+=C:x({type:\"text\",value:C})}return x({type:\"eos\",value:\"\"}),{input:n,tabstops:u,unique:o,keys:p,items:A}};C0e.exports=async t=>{let e=t.options,r=new Set(e.required===!0?[]:e.required||[]),o={...e.values,...e.initial},{tabstops:a,items:n,keys:u}=await Kft(e,o),A=o8(\"result\",t,e),p=o8(\"format\",t,e),h=o8(\"validate\",t,e,!0),E=t.isValue.bind(t);return async(I={},v=!1)=>{let x=0;I.required=r,I.items=n,I.keys=u,I.output=\"\";let C=async(z,te,ae,le)=>{let ce=await h(z,te,ae,le);return ce===!1?\"Invalid field \"+ae.name:ce};for(let z of a){let te=z.value,ae=z.key;if(z.type!==\"template\"){te&&(I.output+=te);continue}if(z.type===\"template\"){let le=n.find(Ee=>Ee.name===ae);e.required===!0&&I.required.add(le.name);let ce=[le.input,I.values[le.value],le.value,te].find(E),de=(le.field||{}).message||z.inner;if(v){let Ee=await C(I.values[ae],I,le,x);if(Ee&&typeof Ee==\"string\"||Ee===!1){I.invalid.set(ae,Ee);continue}I.invalid.delete(ae);let g=await A(I.values[ae],I,le,x);I.output+=E0e.unstyle(g);continue}le.placeholder=!1;let Be=te;te=await p(te,I,le,x),ce!==te?(I.values[ae]=ce,te=t.styles.typing(ce),I.missing.delete(de)):(I.values[ae]=void 0,ce=`<${de}>`,te=t.styles.primary(ce),le.placeholder=!0,I.required.has(ae)&&I.missing.add(de)),I.missing.has(de)&&I.validating&&(te=t.styles.warning(ce)),I.invalid.has(ae)&&I.validating&&(te=t.styles.danger(ce)),x===I.index&&(Be!==te?te=t.styles.underline(te):te=t.styles.heading(E0e.unstyle(te))),x++}te&&(I.output+=te)}let R=I.output.split(`\n`).map(z=>\" \"+z),L=n.length,U=0;for(let z of n)I.invalid.has(z.name)&&z.lines.forEach(te=>{R[te][0]===\" \"&&(R[te]=I.styles.danger(I.symbols.bullet)+R[te].slice(1))}),t.isValue(I.values[z.name])&&U++;return I.completed=(U/L*100).toFixed(0),I.output=R.join(`\n`),I.output}};function o8(t,e,r,o){return(a,n,u,A)=>typeof u.field[t]==\"function\"?u.field[t].call(e,a,n,u,A):[o,a].find(p=>e.isValue(p))}});var B0e=_((R8t,I0e)=>{\"use strict\";var Vft=zc(),zft=w0e(),Jft=jy(),l8=class extends Jft{constructor(e){super(e),this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await zft(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let r=this.getItem();this.cursor+=e,r.cursor+=e}dispatch(e,r){if(!r.code&&!r.ctrl&&e!=null&&this.getItem()){this.append(e,r);return}this.alert()}append(e,r){let o=this.getItem(),a=o.input.slice(0,this.cursor),n=o.input.slice(this.cursor);this.input=o.input=`${a}${e}${n}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let r=e.input.slice(this.cursor),o=e.input.slice(0,this.cursor-1);this.input=e.input=`${o}${r}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let r=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(r=this.styles.danger),r(`${this.state.completed}% completed`)}async render(){let{index:e,keys:r=[],submitted:o,size:a}=this.state,n=[this.options.newline,`\n`].find(z=>z!=null),u=await this.prefix(),A=await this.separator(),p=await this.message(),h=[u,p,A].filter(Boolean).join(\" \");this.state.prompt=h;let E=await this.header(),I=await this.error()||\"\",v=await this.hint()||\"\",x=o?\"\":await this.interpolate(this.state),C=this.state.key=r[e]||\"\",R=await this.format(C),L=await this.footer();R&&(h+=\" \"+R),v&&!R&&this.state.completed===0&&(h+=\" \"+v),this.clear(a);let U=[E,h,x,L,I.trim()];this.write(U.filter(Boolean).join(n)),this.restore()}getItem(e){let{items:r,keys:o,index:a}=this.state,n=r.find(u=>u.name===o[a]);return n&&n.input!=null&&(this.input=n.input,this.cursor=n.cursor),n}async submit(){typeof this.interpolate!=\"function\"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:r,output:o,values:a}=this.state;if(e.size){let A=\"\";for(let[p,h]of e)A+=`Invalid ${p}: ${h}\n`;return this.state.error=A,super.submit()}if(r.size)return this.state.error=\"Required: \"+[...r.keys()].join(\", \"),super.submit();let u=Vft.unstyle(o).split(`\n`).map(A=>A.slice(1)).join(`\n`);return this.value={values:a,result:u},super.submit()}};I0e.exports=l8});var D0e=_((T8t,v0e)=>{\"use strict\";var Xft=\"(Use <shift>+<up/down> to sort)\",Zft=Ph(),c8=class extends Zft{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0}),this.state.hint=[this.options.hint,Xft].find(this.isValue.bind(this))}indicator(){return\"\"}async renderChoice(e,r){let o=await super.renderChoice(e,r),a=this.symbols.identicalTo+\" \",n=this.index===r&&this.sorting?this.styles.muted(a):\"  \";return this.options.drag===!1&&(n=\"\"),this.options.numbered===!0?n+`${r+1} - `+o:n+o}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};v0e.exports=c8});var b0e=_((N8t,P0e)=>{\"use strict\";var $ft=V1(),u8=class extends $ft{constructor(e={}){if(super(e),this.emptyError=e.emptyError||\"No items were selected\",this.term=process.env.TERM_PROGRAM,!this.options.header){let r=[\"\",\"4 - Strongly Agree\",\"3 - Agree\",\"2 - Neutral\",\"1 - Disagree\",\"0 - Strongly Disagree\",\"\"];r=r.map(o=>this.styles.muted(o)),this.state.header=r.join(`\n   `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...e);for(let o of r)o.scale=ept(5,this.options),o.scaleIdx=2;return r}dispatch(){this.alert()}space(){let e=this.focused,r=e.scale[e.scaleIdx],o=r.selected;return e.scale.forEach(a=>a.selected=!1),r.selected=!o,this.render()}indicator(){return\"\"}pointer(){return\"\"}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return\"   \"}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=this.term===\"Hyper\",n=a?9:8,u=a?\"\":\" \",A=this.symbols.line.repeat(n),p=\" \".repeat(n+(a?0:1)),h=te=>(te?this.styles.success(\"\\u25C9\"):\"\\u25EF\")+u,E=r+1+\".\",I=o?this.styles.heading:this.styles.noop,v=await this.resolve(e.message,this.state,e,r),x=this.indent(e),C=x+e.scale.map((te,ae)=>h(ae===e.scaleIdx)).join(A),R=te=>te===e.scaleIdx?I(te):te,L=x+e.scale.map((te,ae)=>R(ae)).join(p),U=()=>[E,v].filter(Boolean).join(\" \"),z=()=>[U(),C,L,\" \"].filter(Boolean).join(`\n`);return o&&(C=this.styles.cyan(C),L=this.styles.cyan(L)),z()}async renderChoices(){if(this.state.submitted)return\"\";let e=this.visible.map(async(o,a)=>await this.renderChoice(o,a)),r=await Promise.all(e);return r.length||r.push(this.styles.danger(\"No matching choices\")),r.join(`\n`)}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.scaleIdx)).join(\", \"):\"\"}async render(){let{submitted:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u=[o,n,a].filter(Boolean).join(\" \");this.state.prompt=u;let A=await this.header(),p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),I=await this.footer();(p||!h)&&(u+=\" \"+p),h&&!u.includes(h)&&(u+=\" \"+h),e&&!p&&!E&&this.multiple&&this.type!==\"form\"&&(u+=this.styles.danger(this.emptyError)),this.clear(r),this.write([u,A,E,I].filter(Boolean).join(`\n`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function ept(t,e={}){if(Array.isArray(e.scale))return e.scale.map(o=>({...o}));let r=[];for(let o=1;o<t+1;o++)r.push({i:o,selected:!1});return r}P0e.exports=u8});var x0e=_((L8t,S0e)=>{S0e.exports=Z_()});var Q0e=_((M8t,k0e)=>{\"use strict\";var tpt=Xx(),A8=class extends tpt{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||\"no\",this.enabled=this.options.enabled||\"yes\",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e=\"\",r){switch(e.toLowerCase()){case\" \":return this.toggle();case\"1\":case\"y\":case\"t\":return this.enable();case\"0\":case\"n\":case\"f\":return this.disable();default:return this.alert()}}format(){let e=o=>this.styles.primary.underline(o);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(\" / \"))}async render(){let{size:e}=this.state,r=await this.header(),o=await this.prefix(),a=await this.separator(),n=await this.message(),u=await this.format(),A=await this.error()||await this.hint(),p=await this.footer(),h=[o,n,a,u].join(\" \");this.state.prompt=h,A&&!h.includes(A)&&(h+=\" \"+A),this.clear(e),this.write([r,h,p].filter(Boolean).join(`\n`)),this.write(this.margin[2]),this.restore()}};k0e.exports=A8});var R0e=_((O8t,F0e)=>{\"use strict\";var rpt=Ph(),f8=class extends rpt{constructor(e){if(super(e),typeof this.options.correctChoice!=\"number\"||this.options.correctChoice<0)throw new Error(\"Please specify the index of the correct answer from the list of choices\")}async toChoices(e,r){let o=await super.toChoices(e,r);if(o.length<2)throw new Error(\"Please give at least two choices to the user\");if(this.options.correctChoice>o.length)throw new Error(\"Please specify the index of the correct answer from the list of choices\");return o}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};F0e.exports=f8});var N0e=_(p8=>{\"use strict\";var T0e=No(),ps=(t,e)=>{T0e.defineExport(p8,t,e),T0e.defineExport(p8,t.toLowerCase(),e)};ps(\"AutoComplete\",()=>Hhe());ps(\"BasicAuth\",()=>Vhe());ps(\"Confirm\",()=>Xhe());ps(\"Editable\",()=>$he());ps(\"Form\",()=>Jx());ps(\"Input\",()=>Z_());ps(\"Invisible\",()=>o0e());ps(\"List\",()=>l0e());ps(\"MultiSelect\",()=>u0e());ps(\"Numeral\",()=>p0e());ps(\"Password\",()=>g0e());ps(\"Scale\",()=>y0e());ps(\"Select\",()=>Ph());ps(\"Snippet\",()=>B0e());ps(\"Sort\",()=>D0e());ps(\"Survey\",()=>b0e());ps(\"Text\",()=>x0e());ps(\"Toggle\",()=>Q0e());ps(\"Quiz\",()=>R0e())});var M0e=_((_8t,L0e)=>{L0e.exports={ArrayPrompt:V1(),AuthPrompt:W_(),BooleanPrompt:Xx(),NumberPrompt:n8(),StringPrompt:_g()}});var J1=_((H8t,U0e)=>{\"use strict\";var O0e=ve(\"assert\"),g8=ve(\"events\"),bh=No(),Xc=class extends g8{constructor(e,r){super(),this.options=bh.merge({},e),this.answers={...r}}register(e,r){if(bh.isObject(e)){for(let a of Object.keys(e))this.register(a,e[a]);return this}O0e.equal(typeof r,\"function\",\"expected a function\");let o=e.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[o]=r:this.prompts[o]=r(this.Prompt,this),this}async prompt(e=[]){for(let r of[].concat(e))try{typeof r==\"function\"&&(r=await r.call(this)),await this.ask(bh.merge({},this.options,r))}catch(o){return Promise.reject(o)}return this.answers}async ask(e){typeof e==\"function\"&&(e=await e.call(this));let r=bh.merge({},this.options,e),{type:o,name:a}=e,{set:n,get:u}=bh;if(typeof o==\"function\"&&(o=await o.call(this,e,this.answers)),!o)return this.answers[a];O0e(this.prompts[o],`Prompt \"${o}\" is not registered`);let A=new this.prompts[o](r),p=u(this.answers,a);A.state.answers=this.answers,A.enquirer=this,a&&A.on(\"submit\",E=>{this.emit(\"answer\",a,E,A),n(this.answers,a,E)});let h=A.emit.bind(A);return A.emit=(...E)=>(this.emit.call(this,...E),h(...E)),this.emit(\"prompt\",A,this),r.autofill&&p!=null?(A.value=A.input=p,r.autofill===\"show\"&&await A.submit()):p=A.value=await A.run(),p}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||jy()}static get prompts(){return N0e()}static get types(){return M0e()}static get prompt(){let e=(r,...o)=>{let a=new this(...o),n=a.emit.bind(a);return a.emit=(...u)=>(e.emit(...u),n(...u)),a.prompt(r)};return bh.mixinEmitter(e,new g8),e}};bh.mixinEmitter(Xc,new g8);var h8=Xc.prompts;for(let t of Object.keys(h8)){let e=t.toLowerCase(),r=o=>new h8[t](o).run();Xc.prompt[e]=r,Xc[e]=r,Xc[t]||Reflect.defineProperty(Xc,t,{get:()=>h8[t]})}var z1=t=>{bh.defineExport(Xc,t,()=>Xc.types[t])};z1(\"ArrayPrompt\");z1(\"AuthPrompt\");z1(\"BooleanPrompt\");z1(\"NumberPrompt\");z1(\"StringPrompt\");U0e.exports=Xc});var e2=_((BHt,W0e)=>{var lpt=Ux();function cpt(t,e,r){var o=t==null?void 0:lpt(t,e);return o===void 0?r:o}W0e.exports=cpt});var z0e=_((xHt,V0e)=>{function upt(t,e){for(var r=-1,o=t==null?0:t.length;++r<o&&e(t[r],r,t)!==!1;);return t}V0e.exports=upt});var X0e=_((kHt,J0e)=>{var Apt=Ag(),fpt=LP();function ppt(t,e){return t&&Apt(e,fpt(e),t)}J0e.exports=ppt});var $0e=_((QHt,Z0e)=>{var hpt=Ag(),gpt=bm();function dpt(t,e){return t&&hpt(e,gpt(e),t)}Z0e.exports=dpt});var tge=_((FHt,ege)=>{var mpt=Ag(),ypt=kP();function Ept(t,e){return mpt(t,ypt(t),e)}ege.exports=Ept});var w8=_((RHt,rge)=>{var Cpt=xP(),wpt=HP(),Ipt=kP(),Bpt=MN(),vpt=Object.getOwnPropertySymbols,Dpt=vpt?function(t){for(var e=[];t;)Cpt(e,Ipt(t)),t=wpt(t);return e}:Bpt;rge.exports=Dpt});var ige=_((THt,nge)=>{var Ppt=Ag(),bpt=w8();function Spt(t,e){return Ppt(t,bpt(t),e)}nge.exports=Spt});var I8=_((NHt,sge)=>{var xpt=LN(),kpt=w8(),Qpt=bm();function Fpt(t){return xpt(t,Qpt,kpt)}sge.exports=Fpt});var age=_((LHt,oge)=>{var Rpt=Object.prototype,Tpt=Rpt.hasOwnProperty;function Npt(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]==\"string\"&&Tpt.call(t,\"index\")&&(r.index=t.index,r.input=t.input),r}oge.exports=Npt});var cge=_((MHt,lge)=>{var Lpt=UP();function Mpt(t,e){var r=e?Lpt(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}lge.exports=Mpt});var Age=_((OHt,uge)=>{var Opt=/\\w*$/;function Upt(t){var e=new t.constructor(t.source,Opt.exec(t));return e.lastIndex=t.lastIndex,e}uge.exports=Upt});var dge=_((UHt,gge)=>{var fge=lg(),pge=fge?fge.prototype:void 0,hge=pge?pge.valueOf:void 0;function _pt(t){return hge?Object(hge.call(t)):{}}gge.exports=_pt});var yge=_((_Ht,mge)=>{var Hpt=UP(),qpt=cge(),jpt=Age(),Gpt=dge(),Ypt=XN(),Wpt=\"[object Boolean]\",Kpt=\"[object Date]\",Vpt=\"[object Map]\",zpt=\"[object Number]\",Jpt=\"[object RegExp]\",Xpt=\"[object Set]\",Zpt=\"[object String]\",$pt=\"[object Symbol]\",eht=\"[object ArrayBuffer]\",tht=\"[object DataView]\",rht=\"[object Float32Array]\",nht=\"[object Float64Array]\",iht=\"[object Int8Array]\",sht=\"[object Int16Array]\",oht=\"[object Int32Array]\",aht=\"[object Uint8Array]\",lht=\"[object Uint8ClampedArray]\",cht=\"[object Uint16Array]\",uht=\"[object Uint32Array]\";function Aht(t,e,r){var o=t.constructor;switch(e){case eht:return Hpt(t);case Wpt:case Kpt:return new o(+t);case tht:return qpt(t,r);case rht:case nht:case iht:case sht:case oht:case aht:case lht:case cht:case uht:return Ypt(t,r);case Vpt:return new o;case zpt:case Zpt:return new o(t);case Jpt:return jpt(t);case Xpt:return new o;case $pt:return Gpt(t)}}mge.exports=Aht});var Cge=_((HHt,Ege)=>{var fht=PI(),pht=Ju(),hht=\"[object Map]\";function ght(t){return pht(t)&&fht(t)==hht}Ege.exports=ght});var vge=_((qHt,Bge)=>{var dht=Cge(),mht=FP(),wge=RP(),Ige=wge&&wge.isMap,yht=Ige?mht(Ige):dht;Bge.exports=yht});var Pge=_((jHt,Dge)=>{var Eht=PI(),Cht=Ju(),wht=\"[object Set]\";function Iht(t){return Cht(t)&&Eht(t)==wht}Dge.exports=Iht});var kge=_((GHt,xge)=>{var Bht=Pge(),vht=FP(),bge=RP(),Sge=bge&&bge.isSet,Dht=Sge?vht(Sge):Bht;xge.exports=Dht});var B8=_((YHt,Tge)=>{var Pht=bP(),bht=z0e(),Sht=qP(),xht=X0e(),kht=$0e(),Qht=JN(),Fht=_P(),Rht=tge(),Tht=ige(),Nht=HN(),Lht=I8(),Mht=PI(),Oht=age(),Uht=yge(),_ht=ZN(),Hht=Hl(),qht=wI(),jht=vge(),Ght=sl(),Yht=kge(),Wht=LP(),Kht=bm(),Vht=1,zht=2,Jht=4,Qge=\"[object Arguments]\",Xht=\"[object Array]\",Zht=\"[object Boolean]\",$ht=\"[object Date]\",e0t=\"[object Error]\",Fge=\"[object Function]\",t0t=\"[object GeneratorFunction]\",r0t=\"[object Map]\",n0t=\"[object Number]\",Rge=\"[object Object]\",i0t=\"[object RegExp]\",s0t=\"[object Set]\",o0t=\"[object String]\",a0t=\"[object Symbol]\",l0t=\"[object WeakMap]\",c0t=\"[object ArrayBuffer]\",u0t=\"[object DataView]\",A0t=\"[object Float32Array]\",f0t=\"[object Float64Array]\",p0t=\"[object Int8Array]\",h0t=\"[object Int16Array]\",g0t=\"[object Int32Array]\",d0t=\"[object Uint8Array]\",m0t=\"[object Uint8ClampedArray]\",y0t=\"[object Uint16Array]\",E0t=\"[object Uint32Array]\",ri={};ri[Qge]=ri[Xht]=ri[c0t]=ri[u0t]=ri[Zht]=ri[$ht]=ri[A0t]=ri[f0t]=ri[p0t]=ri[h0t]=ri[g0t]=ri[r0t]=ri[n0t]=ri[Rge]=ri[i0t]=ri[s0t]=ri[o0t]=ri[a0t]=ri[d0t]=ri[m0t]=ri[y0t]=ri[E0t]=!0;ri[e0t]=ri[Fge]=ri[l0t]=!1;function ek(t,e,r,o,a,n){var u,A=e&Vht,p=e&zht,h=e&Jht;if(r&&(u=a?r(t,o,a,n):r(t)),u!==void 0)return u;if(!Ght(t))return t;var E=Hht(t);if(E){if(u=Oht(t),!A)return Fht(t,u)}else{var I=Mht(t),v=I==Fge||I==t0t;if(qht(t))return Qht(t,A);if(I==Rge||I==Qge||v&&!a){if(u=p||v?{}:_ht(t),!A)return p?Tht(t,kht(u,t)):Rht(t,xht(u,t))}else{if(!ri[I])return a?t:{};u=Uht(t,I,A)}}n||(n=new Pht);var x=n.get(t);if(x)return x;n.set(t,u),Yht(t)?t.forEach(function(L){u.add(ek(L,e,r,L,t,n))}):jht(t)&&t.forEach(function(L,U){u.set(U,ek(L,e,r,U,t,n))});var C=h?p?Lht:Nht:p?Kht:Wht,R=E?void 0:C(t);return bht(R||t,function(L,U){R&&(U=L,L=t[U]),Sht(u,U,ek(L,e,r,U,t,n))}),u}Tge.exports=ek});var v8=_((WHt,Nge)=>{var C0t=B8(),w0t=1,I0t=4;function B0t(t){return C0t(t,w0t|I0t)}Nge.exports=B0t});var D8=_((KHt,Lge)=>{var v0t=g_();function D0t(t,e,r){return t==null?t:v0t(t,e,r)}Lge.exports=D0t});var Hge=_(($Ht,_ge)=>{var P0t=Object.prototype,b0t=P0t.hasOwnProperty;function S0t(t,e){return t!=null&&b0t.call(t,e)}_ge.exports=S0t});var jge=_((e6t,qge)=>{var x0t=Hge(),k0t=d_();function Q0t(t,e){return t!=null&&k0t(t,e,x0t)}qge.exports=Q0t});var Yge=_((t6t,Gge)=>{function F0t(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}Gge.exports=F0t});var Kge=_((r6t,Wge)=>{var R0t=Ux(),T0t=oU();function N0t(t,e){return e.length<2?t:R0t(t,T0t(e,0,-1))}Wge.exports=N0t});var b8=_((n6t,Vge)=>{var L0t=Mg(),M0t=Yge(),O0t=Kge(),U0t=Ly();function _0t(t,e){return e=L0t(e,t),t=O0t(t,e),t==null||delete t[U0t(M0t(e))]}Vge.exports=_0t});var S8=_((i6t,zge)=>{var H0t=b8();function q0t(t,e){return t==null?!0:H0t(t,e)}zge.exports=q0t});var ede=_((R6t,Y0t)=>{Y0t.exports={name:\"@yarnpkg/cli\",version:\"4.5.0\",license:\"BSD-2-Clause\",main:\"./sources/index.ts\",exports:{\".\":\"./sources/index.ts\",\"./polyfills\":\"./sources/polyfills.ts\",\"./package.json\":\"./package.json\"},dependencies:{\"@yarnpkg/core\":\"workspace:^\",\"@yarnpkg/fslib\":\"workspace:^\",\"@yarnpkg/libzip\":\"workspace:^\",\"@yarnpkg/parsers\":\"workspace:^\",\"@yarnpkg/plugin-compat\":\"workspace:^\",\"@yarnpkg/plugin-constraints\":\"workspace:^\",\"@yarnpkg/plugin-dlx\":\"workspace:^\",\"@yarnpkg/plugin-essentials\":\"workspace:^\",\"@yarnpkg/plugin-exec\":\"workspace:^\",\"@yarnpkg/plugin-file\":\"workspace:^\",\"@yarnpkg/plugin-git\":\"workspace:^\",\"@yarnpkg/plugin-github\":\"workspace:^\",\"@yarnpkg/plugin-http\":\"workspace:^\",\"@yarnpkg/plugin-init\":\"workspace:^\",\"@yarnpkg/plugin-interactive-tools\":\"workspace:^\",\"@yarnpkg/plugin-link\":\"workspace:^\",\"@yarnpkg/plugin-nm\":\"workspace:^\",\"@yarnpkg/plugin-npm\":\"workspace:^\",\"@yarnpkg/plugin-npm-cli\":\"workspace:^\",\"@yarnpkg/plugin-pack\":\"workspace:^\",\"@yarnpkg/plugin-patch\":\"workspace:^\",\"@yarnpkg/plugin-pnp\":\"workspace:^\",\"@yarnpkg/plugin-pnpm\":\"workspace:^\",\"@yarnpkg/plugin-stage\":\"workspace:^\",\"@yarnpkg/plugin-typescript\":\"workspace:^\",\"@yarnpkg/plugin-version\":\"workspace:^\",\"@yarnpkg/plugin-workspace-tools\":\"workspace:^\",\"@yarnpkg/shell\":\"workspace:^\",\"ci-info\":\"^4.0.0\",clipanion:\"^4.0.0-rc.2\",semver:\"^7.1.2\",tslib:\"^2.4.0\",typanion:\"^3.14.0\"},devDependencies:{\"@types/semver\":\"^7.1.0\",\"@yarnpkg/builder\":\"workspace:^\",\"@yarnpkg/monorepo\":\"workspace:^\",\"@yarnpkg/pnpify\":\"workspace:^\"},peerDependencies:{\"@yarnpkg/core\":\"workspace:^\"},scripts:{postpack:\"rm -rf lib\",prepack:'run build:compile \"$(pwd)\"',\"build:cli+hook\":\"run build:pnp:hook && builder build bundle\",\"build:cli\":\"builder build bundle\",\"run:cli\":\"builder run\",\"update-local\":\"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/\"},publishConfig:{main:\"./lib/index.js\",bin:null,exports:{\".\":\"./lib/index.js\",\"./package.json\":\"./package.json\"}},files:[\"/lib/**/*\",\"!/lib/pluginConfiguration.*\",\"!/lib/cli.*\"],\"@yarnpkg/builder\":{bundles:{standard:[\"@yarnpkg/plugin-essentials\",\"@yarnpkg/plugin-compat\",\"@yarnpkg/plugin-constraints\",\"@yarnpkg/plugin-dlx\",\"@yarnpkg/plugin-exec\",\"@yarnpkg/plugin-file\",\"@yarnpkg/plugin-git\",\"@yarnpkg/plugin-github\",\"@yarnpkg/plugin-http\",\"@yarnpkg/plugin-init\",\"@yarnpkg/plugin-interactive-tools\",\"@yarnpkg/plugin-link\",\"@yarnpkg/plugin-nm\",\"@yarnpkg/plugin-npm\",\"@yarnpkg/plugin-npm-cli\",\"@yarnpkg/plugin-pack\",\"@yarnpkg/plugin-patch\",\"@yarnpkg/plugin-pnp\",\"@yarnpkg/plugin-pnpm\",\"@yarnpkg/plugin-stage\",\"@yarnpkg/plugin-typescript\",\"@yarnpkg/plugin-version\",\"@yarnpkg/plugin-workspace-tools\"]}},repository:{type:\"git\",url:\"ssh://git@github.com/yarnpkg/berry.git\",directory:\"packages/yarnpkg-cli\"},engines:{node:\">=18.12.0\"}}});var M8=_((uGt,fde)=>{\"use strict\";fde.exports=function(e,r){r===!0&&(r=0);var o=\"\";if(typeof e==\"string\")try{o=new URL(e).protocol}catch{}else e&&e.constructor===URL&&(o=e.protocol);var a=o.split(/\\:|\\+/).filter(Boolean);return typeof r==\"number\"?a[r]:a}});var hde=_((AGt,pde)=>{\"use strict\";var Agt=M8();function fgt(t){var e={protocols:[],protocol:null,port:null,resource:\"\",host:\"\",user:\"\",password:\"\",pathname:\"\",hash:\"\",search:\"\",href:t,query:{},parse_failed:!1};try{var r=new URL(t);e.protocols=Agt(r),e.protocol=e.protocols[0],e.port=r.port,e.resource=r.hostname,e.host=r.host,e.user=r.username||\"\",e.password=r.password||\"\",e.pathname=r.pathname,e.hash=r.hash.slice(1),e.search=r.search.slice(1),e.href=r.href,e.query=Object.fromEntries(r.searchParams)}catch{e.protocols=[\"file\"],e.protocol=e.protocols[0],e.port=\"\",e.resource=\"\",e.user=\"\",e.pathname=\"\",e.hash=\"\",e.search=\"\",e.href=t,e.query={},e.parse_failed=!0}return e}pde.exports=fgt});var mde=_((fGt,dde)=>{\"use strict\";var pgt=hde();function hgt(t){return t&&typeof t==\"object\"&&\"default\"in t?t:{default:t}}var ggt=hgt(pgt),dgt=\"text/plain\",mgt=\"us-ascii\",gde=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),ygt=(t,{stripHash:e})=>{let r=/^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(t);if(!r)throw new Error(`Invalid URL: ${t}`);let{type:o,data:a,hash:n}=r.groups,u=o.split(\";\");n=e?\"\":n;let A=!1;u[u.length-1]===\"base64\"&&(u.pop(),A=!0);let p=(u.shift()||\"\").toLowerCase(),E=[...u.map(I=>{let[v,x=\"\"]=I.split(\"=\").map(C=>C.trim());return v===\"charset\"&&(x=x.toLowerCase(),x===mgt)?\"\":`${v}${x?`=${x}`:\"\"}`}).filter(Boolean)];return A&&E.push(\"base64\"),(E.length>0||p&&p!==dgt)&&E.unshift(p),`data:${E.join(\";\")},${A?a.trim():a}${n?`#${n}`:\"\"}`};function Egt(t,e){if(e={defaultProtocol:\"http:\",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},t=t.trim(),/^data:/i.test(t))return ygt(t,e);if(/^view-source:/i.test(t))throw new Error(\"`view-source:` is not supported as it is a non-standard protocol\");let r=t.startsWith(\"//\");!r&&/^\\.*\\//.test(t)||(t=t.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//,e.defaultProtocol));let a=new URL(t);if(e.forceHttp&&e.forceHttps)throw new Error(\"The `forceHttp` and `forceHttps` options cannot be used together\");if(e.forceHttp&&a.protocol===\"https:\"&&(a.protocol=\"http:\"),e.forceHttps&&a.protocol===\"http:\"&&(a.protocol=\"https:\"),e.stripAuthentication&&(a.username=\"\",a.password=\"\"),e.stripHash?a.hash=\"\":e.stripTextFragment&&(a.hash=a.hash.replace(/#?:~:text.*?$/i,\"\")),a.pathname){let u=/\\b[a-z][a-z\\d+\\-.]{1,50}:\\/\\//g,A=0,p=\"\";for(;;){let E=u.exec(a.pathname);if(!E)break;let I=E[0],v=E.index,x=a.pathname.slice(A,v);p+=x.replace(/\\/{2,}/g,\"/\"),p+=I,A=v+I.length}let h=a.pathname.slice(A,a.pathname.length);p+=h.replace(/\\/{2,}/g,\"/\"),a.pathname=p}if(a.pathname)try{a.pathname=decodeURI(a.pathname)}catch{}if(e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let u=a.pathname.split(\"/\"),A=u[u.length-1];gde(A,e.removeDirectoryIndex)&&(u=u.slice(0,-1),a.pathname=u.slice(1).join(\"/\")+\"/\")}if(a.hostname&&(a.hostname=a.hostname.replace(/\\.$/,\"\"),e.stripWWW&&/^www\\.(?!www\\.)[a-z\\-\\d]{1,63}\\.[a-z.\\-\\d]{2,63}$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\\./,\"\"))),Array.isArray(e.removeQueryParameters))for(let u of[...a.searchParams.keys()])gde(u,e.removeQueryParameters)&&a.searchParams.delete(u);if(e.removeQueryParameters===!0&&(a.search=\"\"),e.sortQueryParameters){a.searchParams.sort();try{a.search=decodeURIComponent(a.search)}catch{}}e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\\/$/,\"\"));let n=t;return t=a.toString(),!e.removeSingleSlash&&a.pathname===\"/\"&&!n.endsWith(\"/\")&&a.hash===\"\"&&(t=t.replace(/\\/$/,\"\")),(e.removeTrailingSlash||a.pathname===\"/\")&&a.hash===\"\"&&e.removeSingleSlash&&(t=t.replace(/\\/$/,\"\")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\\/\\//,\"//\")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\\/\\//,\"\")),t}var O8=(t,e=!1)=>{let r=/^(?:([a-z_][a-z0-9_-]{0,31})@|https?:\\/\\/)([\\w\\.\\-@]+)[\\/:]([\\~,\\.\\w,\\-,\\_,\\/]+?(?:\\.git|\\/)?)$/,o=n=>{let u=new Error(n);throw u.subject_url=t,u};(typeof t!=\"string\"||!t.trim())&&o(\"Invalid url.\"),t.length>O8.MAX_INPUT_LENGTH&&o(\"Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH.\"),e&&(typeof e!=\"object\"&&(e={stripHash:!1}),t=Egt(t,e));let a=ggt.default(t);if(a.parse_failed){let n=a.href.match(r);n?(a.protocols=[\"ssh\"],a.protocol=\"ssh\",a.resource=n[2],a.host=n[2],a.user=n[1],a.pathname=`/${n[3]}`,a.parse_failed=!1):o(\"URL parsing failed.\")}return a};O8.MAX_INPUT_LENGTH=2048;dde.exports=O8});var Cde=_((pGt,Ede)=>{\"use strict\";var Cgt=M8();function yde(t){if(Array.isArray(t))return t.indexOf(\"ssh\")!==-1||t.indexOf(\"rsync\")!==-1;if(typeof t!=\"string\")return!1;var e=Cgt(t);if(t=t.substring(t.indexOf(\"://\")+3),yde(e))return!0;var r=new RegExp(\".([a-zA-Z\\\\d]+):(\\\\d+)/\");return!t.match(r)&&t.indexOf(\"@\")<t.indexOf(\":\")}Ede.exports=yde});var Bde=_((hGt,Ide)=>{\"use strict\";var wgt=mde(),wde=Cde();function Igt(t){var e=wgt(t);return e.token=\"\",e.password===\"x-oauth-basic\"?e.token=e.user:e.user===\"x-token-auth\"&&(e.token=e.password),wde(e.protocols)||e.protocols.length===0&&wde(t)?e.protocol=\"ssh\":e.protocols.length?e.protocol=e.protocols[0]:(e.protocol=\"file\",e.protocols=[\"file\"]),e.href=e.href.replace(/\\/$/,\"\"),e}Ide.exports=Igt});var Dde=_((gGt,vde)=>{\"use strict\";var Bgt=Bde();function U8(t){if(typeof t!=\"string\")throw new Error(\"The url must be a string.\");var e=/^([a-z\\d-]{1,39})\\/([-\\.\\w]{1,100})$/i;e.test(t)&&(t=\"https://github.com/\"+t);var r=Bgt(t),o=r.resource.split(\".\"),a=null;switch(r.toString=function(L){return U8.stringify(this,L)},r.source=o.length>2?o.slice(1-o.length).join(\".\"):r.source=r.resource,r.git_suffix=/\\.git$/.test(r.pathname),r.name=decodeURIComponent((r.pathname||r.href).replace(/(^\\/)|(\\/$)/g,\"\").replace(/\\.git$/,\"\")),r.owner=decodeURIComponent(r.user),r.source){case\"git.cloudforge.com\":r.owner=r.user,r.organization=o[0],r.source=\"cloudforge.com\";break;case\"visualstudio.com\":if(r.resource===\"vs-ssh.visualstudio.com\"){a=r.name.split(\"/\"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3],r.full_name=a[2]+\"/\"+a[3]);break}else{a=r.name.split(\"/\"),a.length===2?(r.owner=a[1],r.name=a[1],r.full_name=\"_git/\"+r.name):a.length===3?(r.name=a[2],a[0]===\"DefaultCollection\"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+\"/_git/\"+r.name):(r.owner=a[0],r.full_name=r.owner+\"/_git/\"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+\"/\"+r.owner+\"/_git/\"+r.name);break}case\"dev.azure.com\":case\"azure.com\":if(r.resource===\"ssh.dev.azure.com\"){a=r.name.split(\"/\"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3]);break}else{a=r.name.split(\"/\"),a.length===5?(r.organization=a[0],r.owner=a[1],r.name=a[4],r.full_name=\"_git/\"+r.name):a.length===3?(r.name=a[2],a[0]===\"DefaultCollection\"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+\"/_git/\"+r.name):(r.owner=a[0],r.full_name=r.owner+\"/_git/\"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+\"/\"+r.owner+\"/_git/\"+r.name),r.query&&r.query.path&&(r.filepath=r.query.path.replace(/^\\/+/g,\"\")),r.query&&r.query.version&&(r.ref=r.query.version.replace(/^GB/,\"\"));break}default:a=r.name.split(\"/\");var n=a.length-1;if(a.length>=2){var u=a.indexOf(\"-\",2),A=a.indexOf(\"blob\",2),p=a.indexOf(\"tree\",2),h=a.indexOf(\"commit\",2),E=a.indexOf(\"src\",2),I=a.indexOf(\"raw\",2),v=a.indexOf(\"edit\",2);n=u>0?u-1:A>0?A-1:p>0?p-1:h>0?h-1:E>0?E-1:I>0?I-1:v>0?v-1:n,r.owner=a.slice(0,n).join(\"/\"),r.name=a[n],h&&(r.commit=a[n+2])}r.ref=\"\",r.filepathtype=\"\",r.filepath=\"\";var x=a.length>n&&a[n+1]===\"-\"?n+1:n;a.length>x+2&&[\"raw\",\"src\",\"blob\",\"tree\",\"edit\"].indexOf(a[x+1])>=0&&(r.filepathtype=a[x+1],r.ref=a[x+2],a.length>x+3&&(r.filepath=a.slice(x+3).join(\"/\"))),r.organization=r.owner;break}r.full_name||(r.full_name=r.owner,r.name&&(r.full_name&&(r.full_name+=\"/\"),r.full_name+=r.name)),r.owner.startsWith(\"scm/\")&&(r.source=\"bitbucket-server\",r.owner=r.owner.replace(\"scm/\",\"\"),r.organization=r.owner,r.full_name=r.owner+\"/\"+r.name);var C=/(projects|users)\\/(.*?)\\/repos\\/(.*?)((\\/.*$)|$)/,R=C.exec(r.pathname);return R!=null&&(r.source=\"bitbucket-server\",R[1]===\"users\"?r.owner=\"~\"+R[2]:r.owner=R[2],r.organization=r.owner,r.name=R[3],a=R[4].split(\"/\"),a.length>1&&([\"raw\",\"browse\"].indexOf(a[1])>=0?(r.filepathtype=a[1],a.length>2&&(r.filepath=a.slice(2).join(\"/\"))):a[1]===\"commits\"&&a.length>2&&(r.commit=a[2])),r.full_name=r.owner+\"/\"+r.name,r.query.at?r.ref=r.query.at:r.ref=\"\"),r}U8.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join(\"+\"):t.protocol);var r=t.port?\":\"+t.port:\"\",o=t.user||\"git\",a=t.git_suffix?\".git\":\"\";switch(e){case\"ssh\":return r?\"ssh://\"+o+\"@\"+t.resource+r+\"/\"+t.full_name+a:o+\"@\"+t.resource+\":\"+t.full_name+a;case\"git+ssh\":case\"ssh+git\":case\"ftp\":case\"ftps\":return e+\"://\"+o+\"@\"+t.resource+r+\"/\"+t.full_name+a;case\"http\":case\"https\":var n=t.token?vgt(t):t.user&&(t.protocols.includes(\"http\")||t.protocols.includes(\"https\"))?t.user+\"@\":\"\";return e+\"://\"+n+t.resource+r+\"/\"+Dgt(t)+a;default:return t.href}};function vgt(t){switch(t.source){case\"bitbucket.org\":return\"x-token-auth:\"+t.token+\"@\";default:return t.token+\"@\"}}function Dgt(t){switch(t.source){case\"bitbucket-server\":return\"scm/\"+t.full_name;default:return\"\"+t.full_name}}vde.exports=U8});var Hde=_((V9t,_de)=>{var Lgt=xS(),Mgt=_P(),Ogt=Hl(),Ugt=Ym(),_gt=h_(),Hgt=Ly(),qgt=C1();function jgt(t){return Ogt(t)?Lgt(t,Hgt):Ugt(t)?[t]:Mgt(_gt(qgt(t)))}_de.exports=jgt});function Kgt(t,e){return e===1&&Wgt.has(t[0])}function a2(t){let e=Array.isArray(t)?t:(0,Gde.default)(t);return e.map((o,a)=>Ggt.test(o)?`[${o}]`:Ygt.test(o)&&!Kgt(e,a)?`.${o}`:`[${JSON.stringify(o)}]`).join(\"\").replace(/^\\./,\"\")}function Vgt(t,e){let r=[];if(e.methodName!==null&&r.push(pe.pretty(t,e.methodName,pe.Type.CODE)),e.file!==null){let o=[];o.push(pe.pretty(t,e.file,pe.Type.PATH)),e.line!==null&&(o.push(pe.pretty(t,e.line,pe.Type.NUMBER)),e.column!==null&&o.push(pe.pretty(t,e.column,pe.Type.NUMBER))),r.push(`(${o.join(pe.pretty(t,\":\",\"grey\"))})`)}return r.join(\" \")}function ik(t,{manifestUpdates:e,reportedErrors:r},{fix:o}={}){let a=new Map,n=new Map,u=[...r.keys()].map(A=>[A,new Map]);for(let[A,p]of[...u,...e]){let h=r.get(A)?.map(x=>({text:x,fixable:!1}))??[],E=!1,I=t.getWorkspaceByCwd(A),v=I.manifest.exportTo({});for(let[x,C]of p){if(C.size>1){let R=[...C].map(([L,U])=>{let z=pe.pretty(t.configuration,L,pe.Type.INSPECT),te=U.size>0?Vgt(t.configuration,U.values().next().value):null;return te!==null?`\n${z} at ${te}`:`\n${z}`}).join(\"\");h.push({text:`Conflict detected in constraint targeting ${pe.pretty(t.configuration,x,pe.Type.CODE)}; conflicting values are:${R}`,fixable:!1})}else{let[[R]]=C,L=(0,qde.default)(v,x);if(JSON.stringify(L)===JSON.stringify(R))continue;if(!o){let U=typeof L>\"u\"?`Missing field ${pe.pretty(t.configuration,x,pe.Type.CODE)}; expected ${pe.pretty(t.configuration,R,pe.Type.INSPECT)}`:typeof R>\"u\"?`Extraneous field ${pe.pretty(t.configuration,x,pe.Type.CODE)} currently set to ${pe.pretty(t.configuration,L,pe.Type.INSPECT)}`:`Invalid field ${pe.pretty(t.configuration,x,pe.Type.CODE)}; expected ${pe.pretty(t.configuration,R,pe.Type.INSPECT)}, found ${pe.pretty(t.configuration,L,pe.Type.INSPECT)}`;h.push({text:U,fixable:!0});continue}typeof R>\"u\"?(0,Yde.default)(v,x):(0,jde.default)(v,x,R),E=!0}E&&a.set(I,v)}h.length>0&&n.set(I,h)}return{changedWorkspaces:a,remainingErrors:n}}function Wde(t,{configuration:e}){let r={children:[]};for(let[o,a]of t){let n=[];for(let A of a){let p=A.text.split(/\\n/);A.fixable&&(p[0]=`${pe.pretty(e,\"\\u2699\",\"gray\")} ${p[0]}`),n.push({value:pe.tuple(pe.Type.NO_HINT,p[0]),children:p.slice(1).map(h=>({value:pe.tuple(pe.Type.NO_HINT,h)}))})}let u={value:pe.tuple(pe.Type.LOCATOR,o.anchoredLocator),children:He.sortMap(n,A=>A.value[1])};r.children.push(u)}return r.children=He.sortMap(r.children,o=>o.value[1]),r}var qde,jde,Gde,Yde,QE,Ggt,Ygt,Wgt,l2=Et(()=>{Ge();qde=Ze(e2()),jde=Ze(D8()),Gde=Ze(Hde()),Yde=Ze(S8()),QE=class{constructor(e){this.indexedFields=e;this.items=[];this.indexes={};this.clear()}clear(){this.items=[];for(let e of this.indexedFields)this.indexes[e]=new Map}insert(e){this.items.push(e);for(let r of this.indexedFields){let o=Object.hasOwn(e,r)?e[r]:void 0;if(typeof o>\"u\")continue;He.getArrayWithDefault(this.indexes[r],o).push(e)}return e}find(e){if(typeof e>\"u\")return this.items;let r=Object.entries(e);if(r.length===0)return this.items;let o=[],a;for(let[u,A]of r){let p=u,h=Object.hasOwn(this.indexes,p)?this.indexes[p]:void 0;if(typeof h>\"u\"){o.push([p,A]);continue}let E=new Set(h.get(A)??[]);if(E.size===0)return[];if(typeof a>\"u\")a=E;else for(let I of a)E.has(I)||a.delete(I);if(a.size===0)break}let n=[...a??[]];return o.length>0&&(n=n.filter(u=>{for(let[A,p]of o)if(!(typeof p<\"u\"?Object.hasOwn(u,A)&&u[A]===p:Object.hasOwn(u,A)===!1))return!1;return!0})),n}},Ggt=/^[0-9]+$/,Ygt=/^[a-zA-Z0-9_]+$/,Wgt=new Set([\"scripts\",...Ut.allDependencies])});var Kde=_((o7t,$8)=>{var zgt;(function(t){var e=function(){return{\"append/2\":[new t.type.Rule(new t.type.Term(\"append\",[new t.type.Var(\"X\"),new t.type.Var(\"L\")]),new t.type.Term(\"foldl\",[new t.type.Term(\"append\",[]),new t.type.Var(\"X\"),new t.type.Term(\"[]\",[]),new t.type.Var(\"L\")]))],\"append/3\":[new t.type.Rule(new t.type.Term(\"append\",[new t.type.Term(\"[]\",[]),new t.type.Var(\"X\"),new t.type.Var(\"X\")]),null),new t.type.Rule(new t.type.Term(\"append\",[new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"T\")]),new t.type.Var(\"X\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"S\")])]),new t.type.Term(\"append\",[new t.type.Var(\"T\"),new t.type.Var(\"X\"),new t.type.Var(\"S\")]))],\"member/2\":[new t.type.Rule(new t.type.Term(\"member\",[new t.type.Var(\"X\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"_\")])]),null),new t.type.Rule(new t.type.Term(\"member\",[new t.type.Var(\"X\"),new t.type.Term(\".\",[new t.type.Var(\"_\"),new t.type.Var(\"Xs\")])]),new t.type.Term(\"member\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]))],\"permutation/2\":[new t.type.Rule(new t.type.Term(\"permutation\",[new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"permutation\",[new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"T\")]),new t.type.Var(\"S\")]),new t.type.Term(\",\",[new t.type.Term(\"permutation\",[new t.type.Var(\"T\"),new t.type.Var(\"P\")]),new t.type.Term(\",\",[new t.type.Term(\"append\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"P\")]),new t.type.Term(\"append\",[new t.type.Var(\"X\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"Y\")]),new t.type.Var(\"S\")])])]))],\"maplist/2\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"X\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"Xs\")])]))],\"maplist/3\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"A\"),new t.type.Var(\"As\")]),new t.type.Term(\".\",[new t.type.Var(\"B\"),new t.type.Var(\"Bs\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"A\"),new t.type.Var(\"B\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"As\"),new t.type.Var(\"Bs\")])]))],\"maplist/4\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"A\"),new t.type.Var(\"As\")]),new t.type.Term(\".\",[new t.type.Var(\"B\"),new t.type.Var(\"Bs\")]),new t.type.Term(\".\",[new t.type.Var(\"C\"),new t.type.Var(\"Cs\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"A\"),new t.type.Var(\"B\"),new t.type.Var(\"C\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"As\"),new t.type.Var(\"Bs\"),new t.type.Var(\"Cs\")])]))],\"maplist/5\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"A\"),new t.type.Var(\"As\")]),new t.type.Term(\".\",[new t.type.Var(\"B\"),new t.type.Var(\"Bs\")]),new t.type.Term(\".\",[new t.type.Var(\"C\"),new t.type.Var(\"Cs\")]),new t.type.Term(\".\",[new t.type.Var(\"D\"),new t.type.Var(\"Ds\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"A\"),new t.type.Var(\"B\"),new t.type.Var(\"C\"),new t.type.Var(\"D\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"As\"),new t.type.Var(\"Bs\"),new t.type.Var(\"Cs\"),new t.type.Var(\"Ds\")])]))],\"maplist/6\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"A\"),new t.type.Var(\"As\")]),new t.type.Term(\".\",[new t.type.Var(\"B\"),new t.type.Var(\"Bs\")]),new t.type.Term(\".\",[new t.type.Var(\"C\"),new t.type.Var(\"Cs\")]),new t.type.Term(\".\",[new t.type.Var(\"D\"),new t.type.Var(\"Ds\")]),new t.type.Term(\".\",[new t.type.Var(\"E\"),new t.type.Var(\"Es\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"A\"),new t.type.Var(\"B\"),new t.type.Var(\"C\"),new t.type.Var(\"D\"),new t.type.Var(\"E\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"As\"),new t.type.Var(\"Bs\"),new t.type.Var(\"Cs\"),new t.type.Var(\"Ds\"),new t.type.Var(\"Es\")])]))],\"maplist/7\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"A\"),new t.type.Var(\"As\")]),new t.type.Term(\".\",[new t.type.Var(\"B\"),new t.type.Var(\"Bs\")]),new t.type.Term(\".\",[new t.type.Var(\"C\"),new t.type.Var(\"Cs\")]),new t.type.Term(\".\",[new t.type.Var(\"D\"),new t.type.Var(\"Ds\")]),new t.type.Term(\".\",[new t.type.Var(\"E\"),new t.type.Var(\"Es\")]),new t.type.Term(\".\",[new t.type.Var(\"F\"),new t.type.Var(\"Fs\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"A\"),new t.type.Var(\"B\"),new t.type.Var(\"C\"),new t.type.Var(\"D\"),new t.type.Var(\"E\"),new t.type.Var(\"F\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"As\"),new t.type.Var(\"Bs\"),new t.type.Var(\"Cs\"),new t.type.Var(\"Ds\"),new t.type.Var(\"Es\"),new t.type.Var(\"Fs\")])]))],\"maplist/8\":[new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"A\"),new t.type.Var(\"As\")]),new t.type.Term(\".\",[new t.type.Var(\"B\"),new t.type.Var(\"Bs\")]),new t.type.Term(\".\",[new t.type.Var(\"C\"),new t.type.Var(\"Cs\")]),new t.type.Term(\".\",[new t.type.Var(\"D\"),new t.type.Var(\"Ds\")]),new t.type.Term(\".\",[new t.type.Var(\"E\"),new t.type.Var(\"Es\")]),new t.type.Term(\".\",[new t.type.Var(\"F\"),new t.type.Var(\"Fs\")]),new t.type.Term(\".\",[new t.type.Var(\"G\"),new t.type.Var(\"Gs\")])]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P\"),new t.type.Var(\"A\"),new t.type.Var(\"B\"),new t.type.Var(\"C\"),new t.type.Var(\"D\"),new t.type.Var(\"E\"),new t.type.Var(\"F\"),new t.type.Var(\"G\")]),new t.type.Term(\"maplist\",[new t.type.Var(\"P\"),new t.type.Var(\"As\"),new t.type.Var(\"Bs\"),new t.type.Var(\"Cs\"),new t.type.Var(\"Ds\"),new t.type.Var(\"Es\"),new t.type.Var(\"Fs\"),new t.type.Var(\"Gs\")])]))],\"include/3\":[new t.type.Rule(new t.type.Term(\"include\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"include\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"T\")]),new t.type.Var(\"L\")]),new t.type.Term(\",\",[new t.type.Term(\"=..\",[new t.type.Var(\"P\"),new t.type.Var(\"A\")]),new t.type.Term(\",\",[new t.type.Term(\"append\",[new t.type.Var(\"A\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Term(\"[]\",[])]),new t.type.Var(\"B\")]),new t.type.Term(\",\",[new t.type.Term(\"=..\",[new t.type.Var(\"F\"),new t.type.Var(\"B\")]),new t.type.Term(\",\",[new t.type.Term(\";\",[new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"F\")]),new t.type.Term(\",\",[new t.type.Term(\"=\",[new t.type.Var(\"L\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"S\")])]),new t.type.Term(\"!\",[])])]),new t.type.Term(\"=\",[new t.type.Var(\"L\"),new t.type.Var(\"S\")])]),new t.type.Term(\"include\",[new t.type.Var(\"P\"),new t.type.Var(\"T\"),new t.type.Var(\"S\")])])])])]))],\"exclude/3\":[new t.type.Rule(new t.type.Term(\"exclude\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Term(\"[]\",[])]),null),new t.type.Rule(new t.type.Term(\"exclude\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"T\")]),new t.type.Var(\"S\")]),new t.type.Term(\",\",[new t.type.Term(\"exclude\",[new t.type.Var(\"P\"),new t.type.Var(\"T\"),new t.type.Var(\"E\")]),new t.type.Term(\",\",[new t.type.Term(\"=..\",[new t.type.Var(\"P\"),new t.type.Var(\"L\")]),new t.type.Term(\",\",[new t.type.Term(\"append\",[new t.type.Var(\"L\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Term(\"[]\",[])]),new t.type.Var(\"Q\")]),new t.type.Term(\",\",[new t.type.Term(\"=..\",[new t.type.Var(\"R\"),new t.type.Var(\"Q\")]),new t.type.Term(\";\",[new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"R\")]),new t.type.Term(\",\",[new t.type.Term(\"!\",[]),new t.type.Term(\"=\",[new t.type.Var(\"S\"),new t.type.Var(\"E\")])])]),new t.type.Term(\"=\",[new t.type.Var(\"S\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"E\")])])])])])])]))],\"foldl/4\":[new t.type.Rule(new t.type.Term(\"foldl\",[new t.type.Var(\"_\"),new t.type.Term(\"[]\",[]),new t.type.Var(\"I\"),new t.type.Var(\"I\")]),null),new t.type.Rule(new t.type.Term(\"foldl\",[new t.type.Var(\"P\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Var(\"T\")]),new t.type.Var(\"I\"),new t.type.Var(\"R\")]),new t.type.Term(\",\",[new t.type.Term(\"=..\",[new t.type.Var(\"P\"),new t.type.Var(\"L\")]),new t.type.Term(\",\",[new t.type.Term(\"append\",[new t.type.Var(\"L\"),new t.type.Term(\".\",[new t.type.Var(\"I\"),new t.type.Term(\".\",[new t.type.Var(\"H\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Term(\"[]\",[])])])]),new t.type.Var(\"L2\")]),new t.type.Term(\",\",[new t.type.Term(\"=..\",[new t.type.Var(\"P2\"),new t.type.Var(\"L2\")]),new t.type.Term(\",\",[new t.type.Term(\"call\",[new t.type.Var(\"P2\")]),new t.type.Term(\"foldl\",[new t.type.Var(\"P\"),new t.type.Var(\"T\"),new t.type.Var(\"X\"),new t.type.Var(\"R\")])])])])]))],\"select/3\":[new t.type.Rule(new t.type.Term(\"select\",[new t.type.Var(\"E\"),new t.type.Term(\".\",[new t.type.Var(\"E\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"Xs\")]),null),new t.type.Rule(new t.type.Term(\"select\",[new t.type.Var(\"E\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Ys\")])]),new t.type.Term(\"select\",[new t.type.Var(\"E\"),new t.type.Var(\"Xs\"),new t.type.Var(\"Ys\")]))],\"sum_list/2\":[new t.type.Rule(new t.type.Term(\"sum_list\",[new t.type.Term(\"[]\",[]),new t.type.Num(0,!1)]),null),new t.type.Rule(new t.type.Term(\"sum_list\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"S\")]),new t.type.Term(\",\",[new t.type.Term(\"sum_list\",[new t.type.Var(\"Xs\"),new t.type.Var(\"Y\")]),new t.type.Term(\"is\",[new t.type.Var(\"S\"),new t.type.Term(\"+\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\")])])]))],\"max_list/2\":[new t.type.Rule(new t.type.Term(\"max_list\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Term(\"[]\",[])]),new t.type.Var(\"X\")]),null),new t.type.Rule(new t.type.Term(\"max_list\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"S\")]),new t.type.Term(\",\",[new t.type.Term(\"max_list\",[new t.type.Var(\"Xs\"),new t.type.Var(\"Y\")]),new t.type.Term(\";\",[new t.type.Term(\",\",[new t.type.Term(\">=\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\")]),new t.type.Term(\",\",[new t.type.Term(\"=\",[new t.type.Var(\"S\"),new t.type.Var(\"X\")]),new t.type.Term(\"!\",[])])]),new t.type.Term(\"=\",[new t.type.Var(\"S\"),new t.type.Var(\"Y\")])])]))],\"min_list/2\":[new t.type.Rule(new t.type.Term(\"min_list\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Term(\"[]\",[])]),new t.type.Var(\"X\")]),null),new t.type.Rule(new t.type.Term(\"min_list\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"S\")]),new t.type.Term(\",\",[new t.type.Term(\"min_list\",[new t.type.Var(\"Xs\"),new t.type.Var(\"Y\")]),new t.type.Term(\";\",[new t.type.Term(\",\",[new t.type.Term(\"=<\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\")]),new t.type.Term(\",\",[new t.type.Term(\"=\",[new t.type.Var(\"S\"),new t.type.Var(\"X\")]),new t.type.Term(\"!\",[])])]),new t.type.Term(\"=\",[new t.type.Var(\"S\"),new t.type.Var(\"Y\")])])]))],\"prod_list/2\":[new t.type.Rule(new t.type.Term(\"prod_list\",[new t.type.Term(\"[]\",[]),new t.type.Num(1,!1)]),null),new t.type.Rule(new t.type.Term(\"prod_list\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"S\")]),new t.type.Term(\",\",[new t.type.Term(\"prod_list\",[new t.type.Var(\"Xs\"),new t.type.Var(\"Y\")]),new t.type.Term(\"is\",[new t.type.Var(\"S\"),new t.type.Term(\"*\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\")])])]))],\"last/2\":[new t.type.Rule(new t.type.Term(\"last\",[new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Term(\"[]\",[])]),new t.type.Var(\"X\")]),null),new t.type.Rule(new t.type.Term(\"last\",[new t.type.Term(\".\",[new t.type.Var(\"_\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"X\")]),new t.type.Term(\"last\",[new t.type.Var(\"Xs\"),new t.type.Var(\"X\")]))],\"prefix/2\":[new t.type.Rule(new t.type.Term(\"prefix\",[new t.type.Var(\"Part\"),new t.type.Var(\"Whole\")]),new t.type.Term(\"append\",[new t.type.Var(\"Part\"),new t.type.Var(\"_\"),new t.type.Var(\"Whole\")]))],\"nth0/3\":[new t.type.Rule(new t.type.Term(\"nth0\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\")]),new t.type.Term(\";\",[new t.type.Term(\"->\",[new t.type.Term(\"var\",[new t.type.Var(\"X\")]),new t.type.Term(\"nth\",[new t.type.Num(0,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"_\")])]),new t.type.Term(\",\",[new t.type.Term(\">=\",[new t.type.Var(\"X\"),new t.type.Num(0,!1)]),new t.type.Term(\",\",[new t.type.Term(\"nth\",[new t.type.Num(0,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"_\")]),new t.type.Term(\"!\",[])])])]))],\"nth1/3\":[new t.type.Rule(new t.type.Term(\"nth1\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\")]),new t.type.Term(\";\",[new t.type.Term(\"->\",[new t.type.Term(\"var\",[new t.type.Var(\"X\")]),new t.type.Term(\"nth\",[new t.type.Num(1,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"_\")])]),new t.type.Term(\",\",[new t.type.Term(\">\",[new t.type.Var(\"X\"),new t.type.Num(0,!1)]),new t.type.Term(\",\",[new t.type.Term(\"nth\",[new t.type.Num(1,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"_\")]),new t.type.Term(\"!\",[])])])]))],\"nth0/4\":[new t.type.Rule(new t.type.Term(\"nth0\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"W\")]),new t.type.Term(\";\",[new t.type.Term(\"->\",[new t.type.Term(\"var\",[new t.type.Var(\"X\")]),new t.type.Term(\"nth\",[new t.type.Num(0,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"W\")])]),new t.type.Term(\",\",[new t.type.Term(\">=\",[new t.type.Var(\"X\"),new t.type.Num(0,!1)]),new t.type.Term(\",\",[new t.type.Term(\"nth\",[new t.type.Num(0,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"W\")]),new t.type.Term(\"!\",[])])])]))],\"nth1/4\":[new t.type.Rule(new t.type.Term(\"nth1\",[new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"W\")]),new t.type.Term(\";\",[new t.type.Term(\"->\",[new t.type.Term(\"var\",[new t.type.Var(\"X\")]),new t.type.Term(\"nth\",[new t.type.Num(1,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"W\")])]),new t.type.Term(\",\",[new t.type.Term(\">\",[new t.type.Var(\"X\"),new t.type.Num(0,!1)]),new t.type.Term(\",\",[new t.type.Term(\"nth\",[new t.type.Num(1,!1),new t.type.Var(\"X\"),new t.type.Var(\"Y\"),new t.type.Var(\"Z\"),new t.type.Var(\"W\")]),new t.type.Term(\"!\",[])])])]))],\"nth/5\":[new t.type.Rule(new t.type.Term(\"nth\",[new t.type.Var(\"N\"),new t.type.Var(\"N\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),null),new t.type.Rule(new t.type.Term(\"nth\",[new t.type.Var(\"N\"),new t.type.Var(\"O\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Xs\")]),new t.type.Var(\"Y\"),new t.type.Term(\".\",[new t.type.Var(\"X\"),new t.type.Var(\"Ys\")])]),new t.type.Term(\",\",[new t.type.Term(\"is\",[new t.type.Var(\"M\"),new t.type.Term(\"+\",[new t.type.Var(\"N\"),new t.type.Num(1,!1)])]),new t.type.Term(\"nth\",[new t.type.Var(\"M\"),new t.type.Var(\"O\"),new t.type.Var(\"Xs\"),new t.type.Var(\"Y\"),new t.type.Var(\"Ys\")])]))],\"length/2\":function(o,a,n){var u=n.args[0],A=n.args[1];if(!t.type.is_variable(A)&&!t.type.is_integer(A))o.throw_error(t.error.type(\"integer\",A,n.indicator));else if(t.type.is_integer(A)&&A.value<0)o.throw_error(t.error.domain(\"not_less_than_zero\",A,n.indicator));else{var p=new t.type.Term(\"length\",[u,new t.type.Num(0,!1),A]);t.type.is_integer(A)&&(p=new t.type.Term(\",\",[p,new t.type.Term(\"!\",[])])),o.prepend([new t.type.State(a.goal.replace(p),a.substitution,a)])}},\"length/3\":[new t.type.Rule(new t.type.Term(\"length\",[new t.type.Term(\"[]\",[]),new t.type.Var(\"N\"),new t.type.Var(\"N\")]),null),new t.type.Rule(new t.type.Term(\"length\",[new t.type.Term(\".\",[new t.type.Var(\"_\"),new t.type.Var(\"X\")]),new t.type.Var(\"A\"),new t.type.Var(\"N\")]),new t.type.Term(\",\",[new t.type.Term(\"succ\",[new t.type.Var(\"A\"),new t.type.Var(\"B\")]),new t.type.Term(\"length\",[new t.type.Var(\"X\"),new t.type.Var(\"B\"),new t.type.Var(\"N\")])]))],\"replicate/3\":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_integer(A))o.throw_error(t.error.type(\"integer\",A,n.indicator));else if(A.value<0)o.throw_error(t.error.domain(\"not_less_than_zero\",A,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type(\"list\",p,n.indicator));else{for(var h=new t.type.Term(\"[]\"),E=0;E<A.value;E++)h=new t.type.Term(\".\",[u,h]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[h,p])),a.substitution,a)])}},\"sort/2\":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type(\"list\",A,n.indicator));else{for(var p=[],h=u;h.indicator===\"./2\";)p.push(h.args[0]),h=h.args[1];if(t.type.is_variable(h))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(h))o.throw_error(t.error.type(\"list\",u,n.indicator));else{for(var E=p.sort(t.compare),I=E.length-1;I>0;I--)E[I].equals(E[I-1])&&E.splice(I,1);for(var v=new t.type.Term(\"[]\"),I=E.length-1;I>=0;I--)v=new t.type.Term(\".\",[E[I],v]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[v,A])),a.substitution,a)])}}},\"msort/2\":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type(\"list\",A,n.indicator));else{for(var p=[],h=u;h.indicator===\"./2\";)p.push(h.args[0]),h=h.args[1];if(t.type.is_variable(h))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(h))o.throw_error(t.error.type(\"list\",u,n.indicator));else{for(var E=p.sort(t.compare),I=new t.type.Term(\"[]\"),v=E.length-1;v>=0;v--)I=new t.type.Term(\".\",[E[v],I]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[I,A])),a.substitution,a)])}}},\"keysort/2\":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type(\"list\",A,n.indicator));else{for(var p=[],h,E=u;E.indicator===\"./2\";){if(h=E.args[0],t.type.is_variable(h)){o.throw_error(t.error.instantiation(n.indicator));return}else if(!t.type.is_term(h)||h.indicator!==\"-/2\"){o.throw_error(t.error.type(\"pair\",h,n.indicator));return}h.args[0].pair=h.args[1],p.push(h.args[0]),E=E.args[1]}if(t.type.is_variable(E))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(E))o.throw_error(t.error.type(\"list\",u,n.indicator));else{for(var I=p.sort(t.compare),v=new t.type.Term(\"[]\"),x=I.length-1;x>=0;x--)v=new t.type.Term(\".\",[new t.type.Term(\"-\",[I[x],I[x].pair]),v]),delete I[x].pair;o.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[v,A])),a.substitution,a)])}}},\"take/3\":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A)||t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(A))o.throw_error(t.error.type(\"list\",A,n.indicator));else if(!t.type.is_integer(u))o.throw_error(t.error.type(\"integer\",u,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type(\"list\",p,n.indicator));else{for(var h=u.value,E=[],I=A;h>0&&I.indicator===\"./2\";)E.push(I.args[0]),I=I.args[1],h--;if(h===0){for(var v=new t.type.Term(\"[]\"),h=E.length-1;h>=0;h--)v=new t.type.Term(\".\",[E[h],v]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[v,p])),a.substitution,a)])}}},\"drop/3\":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A)||t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(A))o.throw_error(t.error.type(\"list\",A,n.indicator));else if(!t.type.is_integer(u))o.throw_error(t.error.type(\"integer\",u,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type(\"list\",p,n.indicator));else{for(var h=u.value,E=[],I=A;h>0&&I.indicator===\"./2\";)E.push(I.args[0]),I=I.args[1],h--;h===0&&o.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[I,p])),a.substitution,a)])}},\"reverse/2\":function(o,a,n){var u=n.args[0],A=n.args[1],p=t.type.is_instantiated_list(u),h=t.type.is_instantiated_list(A);if(t.type.is_variable(u)&&t.type.is_variable(A))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(u)&&!t.type.is_fully_list(u))o.throw_error(t.error.type(\"list\",u,n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type(\"list\",A,n.indicator));else if(!p&&!h)o.throw_error(t.error.instantiation(n.indicator));else{for(var E=p?u:A,I=new t.type.Term(\"[]\",[]);E.indicator===\"./2\";)I=new t.type.Term(\".\",[E.args[0],I]),E=E.args[1];o.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[I,p?A:u])),a.substitution,a)])}},\"list_to_set/2\":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else{for(var p=u,h=[];p.indicator===\"./2\";)h.push(p.args[0]),p=p.args[1];if(t.type.is_variable(p))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_term(p)||p.indicator!==\"[]/0\")o.throw_error(t.error.type(\"list\",u,n.indicator));else{for(var E=[],I=new t.type.Term(\"[]\",[]),v,x=0;x<h.length;x++){v=!1;for(var C=0;C<E.length&&!v;C++)v=t.compare(h[x],E[C])===0;v||E.push(h[x])}for(x=E.length-1;x>=0;x--)I=new t.type.Term(\".\",[E[x],I]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term(\"=\",[A,I])),a.substitution,a)])}}}}},r=[\"append/2\",\"append/3\",\"member/2\",\"permutation/2\",\"maplist/2\",\"maplist/3\",\"maplist/4\",\"maplist/5\",\"maplist/6\",\"maplist/7\",\"maplist/8\",\"include/3\",\"exclude/3\",\"foldl/4\",\"sum_list/2\",\"max_list/2\",\"min_list/2\",\"prod_list/2\",\"last/2\",\"prefix/2\",\"nth0/3\",\"nth1/3\",\"nth0/4\",\"nth1/4\",\"length/2\",\"replicate/3\",\"select/3\",\"sort/2\",\"msort/2\",\"keysort/2\",\"take/3\",\"drop/3\",\"reverse/2\",\"list_to_set/2\"];typeof $8<\"u\"?$8.exports=function(o){t=o,new t.type.Module(\"lists\",e(),r)}:new t.type.Module(\"lists\",e(),r)})(zgt)});var lme=_(Wr=>{\"use strict\";var jg=process.platform===\"win32\",eH=\"aes-256-cbc\",Jgt=\"sha256\",Jde=\"The current environment doesn't support interactive reading from TTY.\",Yn=ve(\"fs\"),Vde=process.binding(\"tty_wrap\").TTY,rH=ve(\"child_process\"),kh=ve(\"path\"),nH={prompt:\"> \",hideEchoBack:!1,mask:\"*\",limit:[],limitMessage:\"Input another, please.$<( [)limit(])>\",defaultInput:\"\",trueValue:[],falseValue:[],caseSensitive:!1,keepWhitespace:!1,encoding:\"utf8\",bufferSize:1024,print:void 0,history:!0,cd:!1,phContent:void 0,preCheck:void 0},Kf=\"none\",$c,RE,zde=!1,xh,ok,tH,Xgt=0,lH=\"\",qg=[],ak,Xde=!1,iH=!1,c2=!1;function Zde(t){function e(r){return r.replace(/[^\\w\\u0080-\\uFFFF]/g,function(o){return\"#\"+o.charCodeAt(0)+\";\"})}return ok.concat(function(r){var o=[];return Object.keys(r).forEach(function(a){r[a]===\"boolean\"?t[a]&&o.push(\"--\"+a):r[a]===\"string\"&&t[a]&&o.push(\"--\"+a,e(t[a]))}),o}({display:\"string\",displayOnly:\"boolean\",keyIn:\"boolean\",hideEchoBack:\"boolean\",mask:\"string\",limit:\"string\",caseSensitive:\"boolean\"}))}function Zgt(t,e){function r(U){var z,te=\"\",ae;for(tH=tH||ve(\"os\").tmpdir();;){z=kh.join(tH,U+te);try{ae=Yn.openSync(z,\"wx\")}catch(le){if(le.code===\"EEXIST\"){te++;continue}else throw le}Yn.closeSync(ae);break}return z}var o,a,n,u={},A,p,h=r(\"readline-sync.stdout\"),E=r(\"readline-sync.stderr\"),I=r(\"readline-sync.exit\"),v=r(\"readline-sync.done\"),x=ve(\"crypto\"),C,R,L;C=x.createHash(Jgt),C.update(\"\"+process.pid+Xgt+++Math.random()),L=C.digest(\"hex\"),R=x.createDecipher(eH,L),o=Zde(t),jg?(a=process.env.ComSpec||\"cmd.exe\",process.env.Q='\"',n=[\"/V:ON\",\"/S\",\"/C\",\"(%Q%\"+a+\"%Q% /V:ON /S /C %Q%%Q%\"+xh+\"%Q%\"+o.map(function(U){return\" %Q%\"+U+\"%Q%\"}).join(\"\")+\" & (echo !ERRORLEVEL!)>%Q%\"+I+\"%Q%%Q%) 2>%Q%\"+E+\"%Q% |%Q%\"+process.execPath+\"%Q% %Q%\"+__dirname+\"\\\\encrypt.js%Q% %Q%\"+eH+\"%Q% %Q%\"+L+\"%Q% >%Q%\"+h+\"%Q% & (echo 1)>%Q%\"+v+\"%Q%\"]):(a=\"/bin/sh\",n=[\"-c\",'(\"'+xh+'\"'+o.map(function(U){return\" '\"+U.replace(/'/g,\"'\\\\''\")+\"'\"}).join(\"\")+'; echo $?>\"'+I+'\") 2>\"'+E+'\" |\"'+process.execPath+'\" \"'+__dirname+'/encrypt.js\" \"'+eH+'\" \"'+L+'\" >\"'+h+'\"; echo 1 >\"'+v+'\"']),c2&&c2(\"_execFileSync\",o);try{rH.spawn(a,n,e)}catch(U){u.error=new Error(U.message),u.error.method=\"_execFileSync - spawn\",u.error.program=a,u.error.args=n}for(;Yn.readFileSync(v,{encoding:t.encoding}).trim()!==\"1\";);return(A=Yn.readFileSync(I,{encoding:t.encoding}).trim())===\"0\"?u.input=R.update(Yn.readFileSync(h,{encoding:\"binary\"}),\"hex\",t.encoding)+R.final(t.encoding):(p=Yn.readFileSync(E,{encoding:t.encoding}).trim(),u.error=new Error(Jde+(p?`\n`+p:\"\")),u.error.method=\"_execFileSync\",u.error.program=a,u.error.args=n,u.error.extMessage=p,u.error.exitCode=+A),Yn.unlinkSync(h),Yn.unlinkSync(E),Yn.unlinkSync(I),Yn.unlinkSync(v),u}function $gt(t){var e,r={},o,a={env:process.env,encoding:t.encoding};if(xh||(jg?process.env.PSModulePath?(xh=\"powershell.exe\",ok=[\"-ExecutionPolicy\",\"Bypass\",\"-File\",__dirname+\"\\\\read.ps1\"]):(xh=\"cscript.exe\",ok=[\"//nologo\",__dirname+\"\\\\read.cs.js\"]):(xh=\"/bin/sh\",ok=[__dirname+\"/read.sh\"])),jg&&!process.env.PSModulePath&&(a.stdio=[process.stdin]),rH.execFileSync){e=Zde(t),c2&&c2(\"execFileSync\",e);try{r.input=rH.execFileSync(xh,e,a)}catch(n){o=n.stderr?(n.stderr+\"\").trim():\"\",r.error=new Error(Jde+(o?`\n`+o:\"\")),r.error.method=\"execFileSync\",r.error.program=xh,r.error.args=e,r.error.extMessage=o,r.error.exitCode=n.status,r.error.code=n.code,r.error.signal=n.signal}}else r=Zgt(t,a);return r.error||(r.input=r.input.replace(/^\\s*'|'\\s*$/g,\"\"),t.display=\"\"),r}function sH(t){var e=\"\",r=t.display,o=!t.display&&t.keyIn&&t.hideEchoBack&&!t.mask;function a(){var n=$gt(t);if(n.error)throw n.error;return n.input}return iH&&iH(t),function(){var n,u,A;function p(){return n||(n=process.binding(\"fs\"),u=process.binding(\"constants\")),n}if(typeof Kf==\"string\")if(Kf=null,jg){if(A=function(h){var E=h.replace(/^\\D+/,\"\").split(\".\"),I=0;return(E[0]=+E[0])&&(I+=E[0]*1e4),(E[1]=+E[1])&&(I+=E[1]*100),(E[2]=+E[2])&&(I+=E[2]),I}(process.version),!(A>=20302&&A<40204||A>=5e4&&A<50100||A>=50600&&A<60200)&&process.stdin.isTTY)process.stdin.pause(),Kf=process.stdin.fd,RE=process.stdin._handle;else try{Kf=p().open(\"CONIN$\",u.O_RDWR,parseInt(\"0666\",8)),RE=new Vde(Kf,!0)}catch{}if(process.stdout.isTTY)$c=process.stdout.fd;else{try{$c=Yn.openSync(\"\\\\\\\\.\\\\CON\",\"w\")}catch{}if(typeof $c!=\"number\")try{$c=p().open(\"CONOUT$\",u.O_RDWR,parseInt(\"0666\",8))}catch{}}}else{if(process.stdin.isTTY){process.stdin.pause();try{Kf=Yn.openSync(\"/dev/tty\",\"r\"),RE=process.stdin._handle}catch{}}else try{Kf=Yn.openSync(\"/dev/tty\",\"r\"),RE=new Vde(Kf,!1)}catch{}if(process.stdout.isTTY)$c=process.stdout.fd;else try{$c=Yn.openSync(\"/dev/tty\",\"w\")}catch{}}}(),function(){var n,u,A=!t.hideEchoBack&&!t.keyIn,p,h,E,I,v;ak=\"\";function x(C){return C===zde?!0:RE.setRawMode(C)!==0?!1:(zde=C,!0)}if(Xde||!RE||typeof $c!=\"number\"&&(t.display||!A)){e=a();return}if(t.display&&(Yn.writeSync($c,t.display),t.display=\"\"),!t.displayOnly){if(!x(!A)){e=a();return}for(h=t.keyIn?1:t.bufferSize,p=Buffer.allocUnsafe&&Buffer.alloc?Buffer.alloc(h):new Buffer(h),t.keyIn&&t.limit&&(u=new RegExp(\"[^\"+t.limit+\"]\",\"g\"+(t.caseSensitive?\"\":\"i\")));;){E=0;try{E=Yn.readSync(Kf,p,0,h)}catch(C){if(C.code!==\"EOF\"){x(!1),e+=a();return}}if(E>0?(I=p.toString(t.encoding,0,E),ak+=I):(I=`\n`,ak+=\"\\0\"),I&&typeof(v=(I.match(/^(.*?)[\\r\\n]/)||[])[1])==\"string\"&&(I=v,n=!0),I&&(I=I.replace(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]/g,\"\")),I&&u&&(I=I.replace(u,\"\")),I&&(A||(t.hideEchoBack?t.mask&&Yn.writeSync($c,new Array(I.length+1).join(t.mask)):Yn.writeSync($c,I)),e+=I),!t.keyIn&&n||t.keyIn&&e.length>=h)break}!A&&!o&&Yn.writeSync($c,`\n`),x(!1)}}(),t.print&&!o&&t.print(r+(t.displayOnly?\"\":(t.hideEchoBack?new Array(e.length+1).join(t.mask):e)+`\n`),t.encoding),t.displayOnly?\"\":lH=t.keepWhitespace||t.keyIn?e:e.trim()}function edt(t,e){var r=[];function o(a){a!=null&&(Array.isArray(a)?a.forEach(o):(!e||e(a))&&r.push(a))}return o(t),r}function cH(t){return t.replace(/[\\x00-\\x7f]/g,function(e){return\"\\\\x\"+(\"00\"+e.charCodeAt().toString(16)).substr(-2)})}function Ns(){var t=Array.prototype.slice.call(arguments),e,r;return t.length&&typeof t[0]==\"boolean\"&&(r=t.shift(),r&&(e=Object.keys(nH),t.unshift(nH))),t.reduce(function(o,a){return a==null||(a.hasOwnProperty(\"noEchoBack\")&&!a.hasOwnProperty(\"hideEchoBack\")&&(a.hideEchoBack=a.noEchoBack,delete a.noEchoBack),a.hasOwnProperty(\"noTrim\")&&!a.hasOwnProperty(\"keepWhitespace\")&&(a.keepWhitespace=a.noTrim,delete a.noTrim),r||(e=Object.keys(a)),e.forEach(function(n){var u;if(a.hasOwnProperty(n))switch(u=a[n],n){case\"mask\":case\"limitMessage\":case\"defaultInput\":case\"encoding\":u=u!=null?u+\"\":\"\",u&&n!==\"limitMessage\"&&(u=u.replace(/[\\r\\n]/g,\"\")),o[n]=u;break;case\"bufferSize\":!isNaN(u=parseInt(u,10))&&typeof u==\"number\"&&(o[n]=u);break;case\"displayOnly\":case\"keyIn\":case\"hideEchoBack\":case\"caseSensitive\":case\"keepWhitespace\":case\"history\":case\"cd\":o[n]=!!u;break;case\"limit\":case\"trueValue\":case\"falseValue\":o[n]=edt(u,function(A){var p=typeof A;return p===\"string\"||p===\"number\"||p===\"function\"||A instanceof RegExp}).map(function(A){return typeof A==\"string\"?A.replace(/[\\r\\n]/g,\"\"):A});break;case\"print\":case\"phContent\":case\"preCheck\":o[n]=typeof u==\"function\"?u:void 0;break;case\"prompt\":case\"display\":o[n]=u??\"\";break}})),o},{})}function oH(t,e,r){return e.some(function(o){var a=typeof o;return a===\"string\"?r?t===o:t.toLowerCase()===o.toLowerCase():a===\"number\"?parseFloat(t)===o:a===\"function\"?o(t):o instanceof RegExp?o.test(t):!1})}function uH(t,e){var r=kh.normalize(jg?(process.env.HOMEDRIVE||\"\")+(process.env.HOMEPATH||\"\"):process.env.HOME||\"\").replace(/[\\/\\\\]+$/,\"\");return t=kh.normalize(t),e?t.replace(/^~(?=\\/|\\\\|$)/,r):t.replace(new RegExp(\"^\"+cH(r)+\"(?=\\\\/|\\\\\\\\|$)\",jg?\"i\":\"\"),\"~\")}function TE(t,e){var r=\"(?:\\\\(([\\\\s\\\\S]*?)\\\\))?(\\\\w+|.-.)(?:\\\\(([\\\\s\\\\S]*?)\\\\))?\",o=new RegExp(\"(\\\\$)?(\\\\$<\"+r+\">)\",\"g\"),a=new RegExp(\"(\\\\$)?(\\\\$\\\\{\"+r+\"\\\\})\",\"g\");function n(u,A,p,h,E,I){var v;return A||typeof(v=e(E))!=\"string\"?p:v?(h||\"\")+v+(I||\"\"):\"\"}return t.replace(o,n).replace(a,n)}function $de(t,e,r){var o,a=[],n=-1,u=0,A=\"\",p;function h(E,I){return I.length>3?(E.push(I[0]+\"...\"+I[I.length-1]),p=!0):I.length&&(E=E.concat(I)),E}return o=t.reduce(function(E,I){return E.concat((I+\"\").split(\"\"))},[]).reduce(function(E,I){var v,x;return e||(I=I.toLowerCase()),v=/^\\d$/.test(I)?1:/^[A-Z]$/.test(I)?2:/^[a-z]$/.test(I)?3:0,r&&v===0?A+=I:(x=I.charCodeAt(0),v&&v===n&&x===u+1?a.push(I):(E=h(E,a),a=[I],n=v),u=x),E},[]),o=h(o,a),A&&(o.push(A),p=!0),{values:o,suppressed:p}}function eme(t,e){return t.join(t.length>2?\", \":e?\" / \":\"/\")}function tme(t,e){var r,o,a={},n;if(e.phContent&&(r=e.phContent(t,e)),typeof r!=\"string\")switch(t){case\"hideEchoBack\":case\"mask\":case\"defaultInput\":case\"caseSensitive\":case\"keepWhitespace\":case\"encoding\":case\"bufferSize\":case\"history\":case\"cd\":r=e.hasOwnProperty(t)?typeof e[t]==\"boolean\"?e[t]?\"on\":\"off\":e[t]+\"\":\"\";break;case\"limit\":case\"trueValue\":case\"falseValue\":o=e[e.hasOwnProperty(t+\"Src\")?t+\"Src\":t],e.keyIn?(a=$de(o,e.caseSensitive),o=a.values):o=o.filter(function(u){var A=typeof u;return A===\"string\"||A===\"number\"}),r=eme(o,a.suppressed);break;case\"limitCount\":case\"limitCountNotZero\":r=e[e.hasOwnProperty(\"limitSrc\")?\"limitSrc\":\"limit\"].length,r=r||t!==\"limitCountNotZero\"?r+\"\":\"\";break;case\"lastInput\":r=lH;break;case\"cwd\":case\"CWD\":case\"cwdHome\":r=process.cwd(),t===\"CWD\"?r=kh.basename(r):t===\"cwdHome\"&&(r=uH(r));break;case\"date\":case\"time\":case\"localeDate\":case\"localeTime\":r=new Date()[\"to\"+t.replace(/^./,function(u){return u.toUpperCase()})+\"String\"]();break;default:typeof(n=(t.match(/^history_m(\\d+)$/)||[])[1])==\"string\"&&(r=qg[qg.length-n]||\"\")}return r}function rme(t){var e=/^(.)-(.)$/.exec(t),r=\"\",o,a,n,u;if(!e)return null;for(o=e[1].charCodeAt(0),a=e[2].charCodeAt(0),u=o<a?1:-1,n=o;n!==a+u;n+=u)r+=String.fromCharCode(n);return r}function aH(t){var e=new RegExp(/(\\s*)(?:(\"|')(.*?)(?:\\2|$)|(\\S+))/g),r,o=\"\",a=[],n;for(t=t.trim();r=e.exec(t);)n=r[3]||r[4]||\"\",r[1]&&(a.push(o),o=\"\"),o+=n;return o&&a.push(o),a}function nme(t,e){return e.trueValue.length&&oH(t,e.trueValue,e.caseSensitive)?!0:e.falseValue.length&&oH(t,e.falseValue,e.caseSensitive)?!1:t}function ime(t){var e,r,o,a,n,u,A;function p(E){return tme(E,t)}function h(E){t.display+=(/[^\\r\\n]$/.test(t.display)?`\n`:\"\")+E}for(t.limitSrc=t.limit,t.displaySrc=t.display,t.limit=\"\",t.display=TE(t.display+\"\",p);;){if(e=sH(t),r=!1,o=\"\",t.defaultInput&&!e&&(e=t.defaultInput),t.history&&((a=/^\\s*\\!(?:\\!|-1)(:p)?\\s*$/.exec(e))?(n=qg[0]||\"\",a[1]?r=!0:e=n,h(n+`\n`),r||(t.displayOnly=!0,sH(t),t.displayOnly=!1)):e&&e!==qg[qg.length-1]&&(qg=[e])),!r&&t.cd&&e)switch(u=aH(e),u[0].toLowerCase()){case\"cd\":if(u[1])try{process.chdir(uH(u[1],!0))}catch(E){h(E+\"\")}r=!0;break;case\"pwd\":h(process.cwd()),r=!0;break}if(!r&&t.preCheck&&(A=t.preCheck(e,t),e=A.res,A.forceNext&&(r=!0)),!r){if(!t.limitSrc.length||oH(e,t.limitSrc,t.caseSensitive))break;t.limitMessage&&(o=TE(t.limitMessage,p))}h((o?o+`\n`:\"\")+TE(t.displaySrc+\"\",p))}return nme(e,t)}Wr._DBG_set_useExt=function(t){Xde=t};Wr._DBG_set_checkOptions=function(t){iH=t};Wr._DBG_set_checkMethod=function(t){c2=t};Wr._DBG_clearHistory=function(){lH=\"\",qg=[]};Wr.setDefaultOptions=function(t){return nH=Ns(!0,t),Ns(!0)};Wr.question=function(t,e){return ime(Ns(Ns(!0,e),{display:t}))};Wr.prompt=function(t){var e=Ns(!0,t);return e.display=e.prompt,ime(e)};Wr.keyIn=function(t,e){var r=Ns(Ns(!0,e),{display:t,keyIn:!0,keepWhitespace:!0});return r.limitSrc=r.limit.filter(function(o){var a=typeof o;return a===\"string\"||a===\"number\"}).map(function(o){return TE(o+\"\",rme)}),r.limit=cH(r.limitSrc.join(\"\")),[\"trueValue\",\"falseValue\"].forEach(function(o){r[o]=r[o].reduce(function(a,n){var u=typeof n;return u===\"string\"||u===\"number\"?a=a.concat((n+\"\").split(\"\")):a.push(n),a},[])}),r.display=TE(r.display+\"\",function(o){return tme(o,r)}),nme(sH(r),r)};Wr.questionEMail=function(t,e){return t==null&&(t=\"Input e-mail address: \"),Wr.question(t,Ns({hideEchoBack:!1,limit:/^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,limitMessage:\"Input valid e-mail address, please.\",trueValue:null,falseValue:null},e,{keepWhitespace:!1,cd:!1}))};Wr.questionNewPassword=function(t,e){var r,o,a,n=Ns({hideEchoBack:!0,mask:\"*\",limitMessage:`It can include: $<charlist>\nAnd the length must be: $<length>`,trueValue:null,falseValue:null,caseSensitive:!0},e,{history:!1,cd:!1,phContent:function(x){return x===\"charlist\"?r.text:x===\"length\"?o+\"...\"+a:null}}),u,A,p,h,E,I,v;for(e=e||{},u=TE(e.charlist?e.charlist+\"\":\"$<!-~>\",rme),(isNaN(o=parseInt(e.min,10))||typeof o!=\"number\")&&(o=12),(isNaN(a=parseInt(e.max,10))||typeof a!=\"number\")&&(a=24),h=new RegExp(\"^[\"+cH(u)+\"]{\"+o+\",\"+a+\"}$\"),r=$de([u],n.caseSensitive,!0),r.text=eme(r.values,r.suppressed),A=e.confirmMessage!=null?e.confirmMessage:\"Reinput a same one to confirm it: \",p=e.unmatchMessage!=null?e.unmatchMessage:\"It differs from first one. Hit only the Enter key if you want to retry from first one.\",t==null&&(t=\"Input new password: \"),E=n.limitMessage;!v;)n.limit=h,n.limitMessage=E,I=Wr.question(t,n),n.limit=[I,\"\"],n.limitMessage=p,v=Wr.question(A,n);return I};function sme(t,e,r){var o;function a(n){return o=r(n),!isNaN(o)&&typeof o==\"number\"}return Wr.question(t,Ns({limitMessage:\"Input valid number, please.\"},e,{limit:a,cd:!1})),o}Wr.questionInt=function(t,e){return sme(t,e,function(r){return parseInt(r,10)})};Wr.questionFloat=function(t,e){return sme(t,e,parseFloat)};Wr.questionPath=function(t,e){var r,o=\"\",a=Ns({hideEchoBack:!1,limitMessage:`$<error(\n)>Input valid path, please.$<( Min:)min>$<( Max:)max>`,history:!0,cd:!0},e,{keepWhitespace:!1,limit:function(n){var u,A,p;n=uH(n,!0),o=\"\";function h(E){E.split(/\\/|\\\\/).reduce(function(I,v){var x=kh.resolve(I+=v+kh.sep);if(!Yn.existsSync(x))Yn.mkdirSync(x);else if(!Yn.statSync(x).isDirectory())throw new Error(\"Non directory already exists: \"+x);return I},\"\")}try{if(u=Yn.existsSync(n),r=u?Yn.realpathSync(n):kh.resolve(n),!e.hasOwnProperty(\"exists\")&&!u||typeof e.exists==\"boolean\"&&e.exists!==u)return o=(u?\"Already exists\":\"No such file or directory\")+\": \"+r,!1;if(!u&&e.create&&(e.isDirectory?h(r):(h(kh.dirname(r)),Yn.closeSync(Yn.openSync(r,\"w\"))),r=Yn.realpathSync(r)),u&&(e.min||e.max||e.isFile||e.isDirectory)){if(A=Yn.statSync(r),e.isFile&&!A.isFile())return o=\"Not file: \"+r,!1;if(e.isDirectory&&!A.isDirectory())return o=\"Not directory: \"+r,!1;if(e.min&&A.size<+e.min||e.max&&A.size>+e.max)return o=\"Size \"+A.size+\" is out of range: \"+r,!1}if(typeof e.validate==\"function\"&&(p=e.validate(r))!==!0)return typeof p==\"string\"&&(o=p),!1}catch(E){return o=E+\"\",!1}return!0},phContent:function(n){return n===\"error\"?o:n!==\"min\"&&n!==\"max\"?null:e.hasOwnProperty(n)?e[n]+\"\":\"\"}});return e=e||{},t==null&&(t='Input path (you can \"cd\" and \"pwd\"): '),Wr.question(t,a),r};function ome(t,e){var r={},o={};return typeof t==\"object\"?(Object.keys(t).forEach(function(a){typeof t[a]==\"function\"&&(o[e.caseSensitive?a:a.toLowerCase()]=t[a])}),r.preCheck=function(a){var n;return r.args=aH(a),n=r.args[0]||\"\",e.caseSensitive||(n=n.toLowerCase()),r.hRes=n!==\"_\"&&o.hasOwnProperty(n)?o[n].apply(a,r.args.slice(1)):o.hasOwnProperty(\"_\")?o._.apply(a,r.args):null,{res:a,forceNext:!1}},o.hasOwnProperty(\"_\")||(r.limit=function(){var a=r.args[0]||\"\";return e.caseSensitive||(a=a.toLowerCase()),o.hasOwnProperty(a)})):r.preCheck=function(a){return r.args=aH(a),r.hRes=typeof t==\"function\"?t.apply(a,r.args):!0,{res:a,forceNext:!1}},r}Wr.promptCL=function(t,e){var r=Ns({hideEchoBack:!1,limitMessage:\"Requested command is not available.\",caseSensitive:!1,history:!0},e),o=ome(t,r);return r.limit=o.limit,r.preCheck=o.preCheck,Wr.prompt(r),o.args};Wr.promptLoop=function(t,e){for(var r=Ns({hideEchoBack:!1,trueValue:null,falseValue:null,caseSensitive:!1,history:!0},e);!t(Wr.prompt(r)););};Wr.promptCLLoop=function(t,e){var r=Ns({hideEchoBack:!1,limitMessage:\"Requested command is not available.\",caseSensitive:!1,history:!0},e),o=ome(t,r);for(r.limit=o.limit,r.preCheck=o.preCheck;Wr.prompt(r),!o.hRes;);};Wr.promptSimShell=function(t){return Wr.prompt(Ns({hideEchoBack:!1,history:!0},t,{prompt:function(){return jg?\"$<cwd>>\":(process.env.USER||\"\")+(process.env.HOSTNAME?\"@\"+process.env.HOSTNAME.replace(/\\..*$/,\"\"):\"\")+\":$<cwdHome>$ \"}()}))};function ame(t,e,r){var o;return t==null&&(t=\"Are you sure? \"),(!e||e.guide!==!1)&&(t+=\"\")&&(t=t.replace(/\\s*:?\\s*$/,\"\")+\" [y/n]: \"),o=Wr.keyIn(t,Ns(e,{hideEchoBack:!1,limit:r,trueValue:\"y\",falseValue:\"n\",caseSensitive:!1})),typeof o==\"boolean\"?o:\"\"}Wr.keyInYN=function(t,e){return ame(t,e)};Wr.keyInYNStrict=function(t,e){return ame(t,e,\"yn\")};Wr.keyInPause=function(t,e){t==null&&(t=\"Continue...\"),(!e||e.guide!==!1)&&(t+=\"\")&&(t=t.replace(/\\s+$/,\"\")+\" (Hit any key)\"),Wr.keyIn(t,Ns({limit:null},e,{hideEchoBack:!0,mask:\"\"}))};Wr.keyInSelect=function(t,e,r){var o=Ns({hideEchoBack:!1},r,{trueValue:null,falseValue:null,caseSensitive:!1,phContent:function(p){return p===\"itemsCount\"?t.length+\"\":p===\"firstItem\"?(t[0]+\"\").trim():p===\"lastItem\"?(t[t.length-1]+\"\").trim():null}}),a=\"\",n={},u=49,A=`\n`;if(!Array.isArray(t)||!t.length||t.length>35)throw\"`items` must be Array (max length: 35).\";return t.forEach(function(p,h){var E=String.fromCharCode(u);a+=E,n[E]=h,A+=\"[\"+E+\"] \"+(p+\"\").trim()+`\n`,u=u===57?97:u+1}),(!r||r.cancel!==!1)&&(a+=\"0\",n[0]=-1,A+=\"[0] \"+(r&&r.cancel!=null&&typeof r.cancel!=\"boolean\"?(r.cancel+\"\").trim():\"CANCEL\")+`\n`),o.limit=a,A+=`\n`,e==null&&(e=\"Choose one from list: \"),(e+=\"\")&&((!r||r.guide!==!1)&&(e=e.replace(/\\s*:?\\s*$/,\"\")+\" [$<limit>]: \"),A+=e),n[Wr.keyIn(A,o).toLowerCase()]};Wr.getRawInput=function(){return ak};function u2(t,e){var r;return e.length&&(r={},r[t]=e[0]),Wr.setDefaultOptions(r)[t]}Wr.setPrint=function(){return u2(\"print\",arguments)};Wr.setPrompt=function(){return u2(\"prompt\",arguments)};Wr.setEncoding=function(){return u2(\"encoding\",arguments)};Wr.setMask=function(){return u2(\"mask\",arguments)};Wr.setBufferSize=function(){return u2(\"bufferSize\",arguments)}});var AH=_((l7t,gl)=>{(function(){var t={major:0,minor:2,patch:66,status:\"beta\"};tau_file_system={files:{},open:function(w,b,y){var F=tau_file_system.files[w];if(!F){if(y===\"read\")return null;F={path:w,text:\"\",type:b,get:function(J,X){return X===this.text.length||X>this.text.length?\"end_of_file\":this.text.substring(X,X+J)},put:function(J,X){return X===\"end_of_file\"?(this.text+=J,!0):X===\"past_end_of_file\"?null:(this.text=this.text.substring(0,X)+J+this.text.substring(X+J.length),!0)},get_byte:function(J){if(J===\"end_of_stream\")return-1;var X=Math.floor(J/2);if(this.text.length<=X)return-1;var $=n(this.text[Math.floor(J/2)],0);return J%2===0?$&255:$/256>>>0},put_byte:function(J,X){var $=X===\"end_of_stream\"?this.text.length:Math.floor(X/2);if(this.text.length<$)return null;var ie=this.text.length===$?-1:n(this.text[Math.floor(X/2)],0);return X%2===0?(ie=ie/256>>>0,ie=(ie&255)<<8|J&255):(ie=ie&255,ie=(J&255)<<8|ie&255),this.text.length===$?this.text+=u(ie):this.text=this.text.substring(0,$)+u(ie)+this.text.substring($+1),!0},flush:function(){return!0},close:function(){var J=tau_file_system.files[this.path];return J?!0:null}},tau_file_system.files[w]=F}return y===\"write\"&&(F.text=\"\"),F}},tau_user_input={buffer:\"\",get:function(w,b){for(var y;tau_user_input.buffer.length<w;)y=window.prompt(),y&&(tau_user_input.buffer+=y);return y=tau_user_input.buffer.substr(0,w),tau_user_input.buffer=tau_user_input.buffer.substr(w),y}},tau_user_output={put:function(w,b){return console.log(w),!0},flush:function(){return!0}},nodejs_file_system={open:function(w,b,y){var F=ve(\"fs\"),J=F.openSync(w,y[0]);return y===\"read\"&&!F.existsSync(w)?null:{get:function(X,$){var ie=new Buffer(X);return F.readSync(J,ie,0,X,$),ie.toString()},put:function(X,$){var ie=Buffer.from(X);if($===\"end_of_file\")F.writeSync(J,ie);else{if($===\"past_end_of_file\")return null;F.writeSync(J,ie,0,ie.length,$)}return!0},get_byte:function(X){return null},put_byte:function(X,$){return null},flush:function(){return!0},close:function(){return F.closeSync(J),!0}}}},nodejs_user_input={buffer:\"\",get:function(w,b){for(var y,F=lme();nodejs_user_input.buffer.length<w;)nodejs_user_input.buffer+=F.question();return y=nodejs_user_input.buffer.substr(0,w),nodejs_user_input.buffer=nodejs_user_input.buffer.substr(w),y}},nodejs_user_output={put:function(w,b){return process.stdout.write(w),!0},flush:function(){return!0}};var e;Array.prototype.indexOf?e=function(w,b){return w.indexOf(b)}:e=function(w,b){for(var y=w.length,F=0;F<y;F++)if(b===w[F])return F;return-1};var r=function(w,b){if(w.length!==0){for(var y=w[0],F=w.length,J=1;J<F;J++)y=b(y,w[J]);return y}},o;Array.prototype.map?o=function(w,b){return w.map(b)}:o=function(w,b){for(var y=[],F=w.length,J=0;J<F;J++)y.push(b(w[J]));return y};var a;Array.prototype.filter?a=function(w,b){return w.filter(b)}:a=function(w,b){for(var y=[],F=w.length,J=0;J<F;J++)b(w[J])&&y.push(w[J]);return y};var n;String.prototype.codePointAt?n=function(w,b){return w.codePointAt(b)}:n=function(w,b){return w.charCodeAt(b)};var u;String.fromCodePoint?u=function(){return String.fromCodePoint.apply(null,arguments)}:u=function(){return String.fromCharCode.apply(null,arguments)};var A=0,p=1,h=/(\\\\a)|(\\\\b)|(\\\\f)|(\\\\n)|(\\\\r)|(\\\\t)|(\\\\v)|\\\\x([0-9a-fA-F]+)\\\\|\\\\([0-7]+)\\\\|(\\\\\\\\)|(\\\\')|('')|(\\\\\")|(\\\\`)|(\\\\.)|(.)/g,E={\"\\\\a\":7,\"\\\\b\":8,\"\\\\f\":12,\"\\\\n\":10,\"\\\\r\":13,\"\\\\t\":9,\"\\\\v\":11};function I(w){var b=[],y=!1;return w.replace(h,function(F,J,X,$,ie,Se,Re,at,dt,jt,tr,bt,ln,kr,mr,Sr,Kr){switch(!0){case dt!==void 0:return b.push(parseInt(dt,16)),\"\";case jt!==void 0:return b.push(parseInt(jt,8)),\"\";case tr!==void 0:case bt!==void 0:case ln!==void 0:case kr!==void 0:case mr!==void 0:return b.push(n(F.substr(1),0)),\"\";case Kr!==void 0:return b.push(n(Kr,0)),\"\";case Sr!==void 0:y=!0;default:return b.push(E[F]),\"\"}}),y?null:b}function v(w,b){var y=\"\";if(w.length<2)return w;try{w=w.replace(/\\\\([0-7]+)\\\\/g,function($,ie){return u(parseInt(ie,8))}),w=w.replace(/\\\\x([0-9a-fA-F]+)\\\\/g,function($,ie){return u(parseInt(ie,16))})}catch{return null}for(var F=0;F<w.length;F++){var J=w.charAt(F),X=w.charAt(F+1);if(J===b&&X===b)F++,y+=b;else if(J===\"\\\\\")if([\"a\",\"b\",\"f\",\"n\",\"r\",\"t\",\"v\",\"'\",'\"',\"\\\\\",\"a\",\"\\b\",\"\\f\",`\n`,\"\\r\",\"\t\",\"\\v\"].indexOf(X)!==-1)switch(F+=1,X){case\"a\":y+=\"a\";break;case\"b\":y+=\"\\b\";break;case\"f\":y+=\"\\f\";break;case\"n\":y+=`\n`;break;case\"r\":y+=\"\\r\";break;case\"t\":y+=\"\t\";break;case\"v\":y+=\"\\v\";break;case\"'\":y+=\"'\";break;case'\"':y+='\"';break;case\"\\\\\":y+=\"\\\\\";break}else return null;else y+=J}return y}function x(w){for(var b=\"\",y=0;y<w.length;y++)switch(w.charAt(y)){case\"'\":b+=\"\\\\'\";break;case\"\\\\\":b+=\"\\\\\\\\\";break;case\"\\b\":b+=\"\\\\b\";break;case\"\\f\":b+=\"\\\\f\";break;case`\n`:b+=\"\\\\n\";break;case\"\\r\":b+=\"\\\\r\";break;case\"\t\":b+=\"\\\\t\";break;case\"\\v\":b+=\"\\\\v\";break;default:b+=w.charAt(y);break}return b}function C(w){var b=w.substr(2);switch(w.substr(0,2).toLowerCase()){case\"0x\":return parseInt(b,16);case\"0b\":return parseInt(b,2);case\"0o\":return parseInt(b,8);case\"0'\":return I(b)[0];default:return parseFloat(w)}}var R={whitespace:/^\\s*(?:(?:%.*)|(?:\\/\\*(?:\\n|\\r|.)*?\\*\\/)|(?:\\s+))\\s*/,variable:/^(?:[A-Z_][a-zA-Z0-9_]*)/,atom:/^(\\!|,|;|[a-z][0-9a-zA-Z_]*|[#\\$\\&\\*\\+\\-\\.\\/\\:\\<\\=\\>\\?\\@\\^\\~\\\\]+|'(?:[^']*?(?:\\\\(?:x?\\d+)?\\\\)*(?:'')*(?:\\\\')*)*')/,number:/^(?:0o[0-7]+|0x[0-9a-fA-F]+|0b[01]+|0'(?:''|\\\\[abfnrtv\\\\'\"`]|\\\\x?\\d+\\\\|[^\\\\])|\\d+(?:\\.\\d+(?:[eE][+-]?\\d+)?)?)/,string:/^(?:\"([^\"]|\"\"|\\\\\")*\"|`([^`]|``|\\\\`)*`)/,l_brace:/^(?:\\[)/,r_brace:/^(?:\\])/,l_bracket:/^(?:\\{)/,r_bracket:/^(?:\\})/,bar:/^(?:\\|)/,l_paren:/^(?:\\()/,r_paren:/^(?:\\))/};function L(w,b){return w.get_flag(\"char_conversion\").id===\"on\"?b.replace(/./g,function(y){return w.get_char_conversion(y)}):b}function U(w){this.thread=w,this.text=\"\",this.tokens=[]}U.prototype.set_last_tokens=function(w){return this.tokens=w},U.prototype.new_text=function(w){this.text=w,this.tokens=[]},U.prototype.get_tokens=function(w){var b,y=0,F=0,J=0,X=[],$=!1;if(w){var ie=this.tokens[w-1];y=ie.len,b=L(this.thread,this.text.substr(ie.len)),F=ie.line,J=ie.start}else b=this.text;if(/^\\s*$/.test(b))return null;for(;b!==\"\";){var Se=[],Re=!1;if(/^\\n/.exec(b)!==null){F++,J=0,y++,b=b.replace(/\\n/,\"\"),$=!0;continue}for(var at in R)if(R.hasOwnProperty(at)){var dt=R[at].exec(b);dt&&Se.push({value:dt[0],name:at,matches:dt})}if(!Se.length)return this.set_last_tokens([{value:b,matches:[],name:\"lexical\",line:F,start:J}]);var ie=r(Se,function(kr,mr){return kr.value.length>=mr.value.length?kr:mr});switch(ie.start=J,ie.line=F,b=b.replace(ie.value,\"\"),J+=ie.value.length,y+=ie.value.length,ie.name){case\"atom\":ie.raw=ie.value,ie.value.charAt(0)===\"'\"&&(ie.value=v(ie.value.substr(1,ie.value.length-2),\"'\"),ie.value===null&&(ie.name=\"lexical\",ie.value=\"unknown escape sequence\"));break;case\"number\":ie.float=ie.value.substring(0,2)!==\"0x\"&&ie.value.match(/[.eE]/)!==null&&ie.value!==\"0'.\",ie.value=C(ie.value),ie.blank=Re;break;case\"string\":var jt=ie.value.charAt(0);ie.value=v(ie.value.substr(1,ie.value.length-2),jt),ie.value===null&&(ie.name=\"lexical\",ie.value=\"unknown escape sequence\");break;case\"whitespace\":var tr=X[X.length-1];tr&&(tr.space=!0),Re=!0;continue;case\"r_bracket\":X.length>0&&X[X.length-1].name===\"l_bracket\"&&(ie=X.pop(),ie.name=\"atom\",ie.value=\"{}\",ie.raw=\"{}\",ie.space=!1);break;case\"r_brace\":X.length>0&&X[X.length-1].name===\"l_brace\"&&(ie=X.pop(),ie.name=\"atom\",ie.value=\"[]\",ie.raw=\"[]\",ie.space=!1);break}ie.len=y,X.push(ie),Re=!1}var bt=this.set_last_tokens(X);return bt.length===0?null:bt};function z(w,b,y,F,J){if(!b[y])return{type:A,value:S.error.syntax(b[y-1],\"expression expected\",!0)};var X;if(F===\"0\"){var $=b[y];switch($.name){case\"number\":return{type:p,len:y+1,value:new S.type.Num($.value,$.float)};case\"variable\":return{type:p,len:y+1,value:new S.type.Var($.value)};case\"string\":var ie;switch(w.get_flag(\"double_quotes\").id){case\"atom\":ie=new H($.value,[]);break;case\"codes\":ie=new H(\"[]\",[]);for(var Se=$.value.length-1;Se>=0;Se--)ie=new H(\".\",[new S.type.Num(n($.value,Se),!1),ie]);break;case\"chars\":ie=new H(\"[]\",[]);for(var Se=$.value.length-1;Se>=0;Se--)ie=new H(\".\",[new S.type.Term($.value.charAt(Se),[]),ie]);break}return{type:p,len:y+1,value:ie};case\"l_paren\":var bt=z(w,b,y+1,w.__get_max_priority(),!0);return bt.type!==p?bt:b[bt.len]&&b[bt.len].name===\"r_paren\"?(bt.len++,bt):{type:A,derived:!0,value:S.error.syntax(b[bt.len]?b[bt.len]:b[bt.len-1],\") or operator expected\",!b[bt.len])};case\"l_bracket\":var bt=z(w,b,y+1,w.__get_max_priority(),!0);return bt.type!==p?bt:b[bt.len]&&b[bt.len].name===\"r_bracket\"?(bt.len++,bt.value=new H(\"{}\",[bt.value]),bt):{type:A,derived:!0,value:S.error.syntax(b[bt.len]?b[bt.len]:b[bt.len-1],\"} or operator expected\",!b[bt.len])}}var Re=te(w,b,y,J);return Re.type===p||Re.derived||(Re=ae(w,b,y),Re.type===p||Re.derived)?Re:{type:A,derived:!1,value:S.error.syntax(b[y],\"unexpected token\")}}var at=w.__get_max_priority(),dt=w.__get_next_priority(F),jt=y;if(b[y].name===\"atom\"&&b[y+1]&&(b[y].space||b[y+1].name!==\"l_paren\")){var $=b[y++],tr=w.__lookup_operator_classes(F,$.value);if(tr&&tr.indexOf(\"fy\")>-1){var bt=z(w,b,y,F,J);if(bt.type!==A)return $.value===\"-\"&&!$.space&&S.type.is_number(bt.value)?{value:new S.type.Num(-bt.value.value,bt.value.is_float),len:bt.len,type:p}:{value:new S.type.Term($.value,[bt.value]),len:bt.len,type:p};X=bt}else if(tr&&tr.indexOf(\"fx\")>-1){var bt=z(w,b,y,dt,J);if(bt.type!==A)return{value:new S.type.Term($.value,[bt.value]),len:bt.len,type:p};X=bt}}y=jt;var bt=z(w,b,y,dt,J);if(bt.type===p){y=bt.len;var $=b[y];if(b[y]&&(b[y].name===\"atom\"&&w.__lookup_operator_classes(F,$.value)||b[y].name===\"bar\"&&w.__lookup_operator_classes(F,\"|\"))){var ln=dt,kr=F,tr=w.__lookup_operator_classes(F,$.value);if(tr.indexOf(\"xf\")>-1)return{value:new S.type.Term($.value,[bt.value]),len:++bt.len,type:p};if(tr.indexOf(\"xfx\")>-1){var mr=z(w,b,y+1,ln,J);return mr.type===p?{value:new S.type.Term($.value,[bt.value,mr.value]),len:mr.len,type:p}:(mr.derived=!0,mr)}else if(tr.indexOf(\"xfy\")>-1){var mr=z(w,b,y+1,kr,J);return mr.type===p?{value:new S.type.Term($.value,[bt.value,mr.value]),len:mr.len,type:p}:(mr.derived=!0,mr)}else if(bt.type!==A)for(;;){y=bt.len;var $=b[y];if($&&$.name===\"atom\"&&w.__lookup_operator_classes(F,$.value)){var tr=w.__lookup_operator_classes(F,$.value);if(tr.indexOf(\"yf\")>-1)bt={value:new S.type.Term($.value,[bt.value]),len:++y,type:p};else if(tr.indexOf(\"yfx\")>-1){var mr=z(w,b,++y,ln,J);if(mr.type===A)return mr.derived=!0,mr;y=mr.len,bt={value:new S.type.Term($.value,[bt.value,mr.value]),len:y,type:p}}else break}else break}}else X={type:A,value:S.error.syntax(b[bt.len-1],\"operator expected\")};return bt}return bt}function te(w,b,y,F){if(!b[y]||b[y].name===\"atom\"&&b[y].raw===\".\"&&!F&&(b[y].space||!b[y+1]||b[y+1].name!==\"l_paren\"))return{type:A,derived:!1,value:S.error.syntax(b[y-1],\"unfounded token\")};var J=b[y],X=[];if(b[y].name===\"atom\"&&b[y].raw!==\",\"){if(y++,b[y-1].space)return{type:p,len:y,value:new S.type.Term(J.value,X)};if(b[y]&&b[y].name===\"l_paren\"){if(b[y+1]&&b[y+1].name===\"r_paren\")return{type:A,derived:!0,value:S.error.syntax(b[y+1],\"argument expected\")};var $=z(w,b,++y,\"999\",!0);if($.type===A)return $.derived?$:{type:A,derived:!0,value:S.error.syntax(b[y]?b[y]:b[y-1],\"argument expected\",!b[y])};for(X.push($.value),y=$.len;b[y]&&b[y].name===\"atom\"&&b[y].value===\",\";){if($=z(w,b,y+1,\"999\",!0),$.type===A)return $.derived?$:{type:A,derived:!0,value:S.error.syntax(b[y+1]?b[y+1]:b[y],\"argument expected\",!b[y+1])};X.push($.value),y=$.len}if(b[y]&&b[y].name===\"r_paren\")y++;else return{type:A,derived:!0,value:S.error.syntax(b[y]?b[y]:b[y-1],\", or ) expected\",!b[y])}}return{type:p,len:y,value:new S.type.Term(J.value,X)}}return{type:A,derived:!1,value:S.error.syntax(b[y],\"term expected\")}}function ae(w,b,y){if(!b[y])return{type:A,derived:!1,value:S.error.syntax(b[y-1],\"[ expected\")};if(b[y]&&b[y].name===\"l_brace\"){var F=z(w,b,++y,\"999\",!0),J=[F.value],X=void 0;if(F.type===A)return b[y]&&b[y].name===\"r_brace\"?{type:p,len:y+1,value:new S.type.Term(\"[]\",[])}:{type:A,derived:!0,value:S.error.syntax(b[y],\"] expected\")};for(y=F.len;b[y]&&b[y].name===\"atom\"&&b[y].value===\",\";){if(F=z(w,b,y+1,\"999\",!0),F.type===A)return F.derived?F:{type:A,derived:!0,value:S.error.syntax(b[y+1]?b[y+1]:b[y],\"argument expected\",!b[y+1])};J.push(F.value),y=F.len}var $=!1;if(b[y]&&b[y].name===\"bar\"){if($=!0,F=z(w,b,y+1,\"999\",!0),F.type===A)return F.derived?F:{type:A,derived:!0,value:S.error.syntax(b[y+1]?b[y+1]:b[y],\"argument expected\",!b[y+1])};X=F.value,y=F.len}return b[y]&&b[y].name===\"r_brace\"?{type:p,len:y+1,value:g(J,X)}:{type:A,derived:!0,value:S.error.syntax(b[y]?b[y]:b[y-1],$?\"] expected\":\", or | or ] expected\",!b[y])}}return{type:A,derived:!1,value:S.error.syntax(b[y],\"list expected\")}}function le(w,b,y){var F=b[y].line,J=z(w,b,y,w.__get_max_priority(),!1),X=null,$;if(J.type!==A)if(y=J.len,b[y]&&b[y].name===\"atom\"&&b[y].raw===\".\")if(y++,S.type.is_term(J.value)){if(J.value.indicator===\":-/2\"?(X=new S.type.Rule(J.value.args[0],Ee(J.value.args[1])),$={value:X,len:y,type:p}):J.value.indicator===\"-->/2\"?(X=de(new S.type.Rule(J.value.args[0],J.value.args[1]),w),X.body=Ee(X.body),$={value:X,len:y,type:S.type.is_rule(X)?p:A}):(X=new S.type.Rule(J.value,null),$={value:X,len:y,type:p}),X){var ie=X.singleton_variables();ie.length>0&&w.throw_warning(S.warning.singleton(ie,X.head.indicator,F))}return $}else return{type:A,value:S.error.syntax(b[y],\"callable expected\")};else return{type:A,value:S.error.syntax(b[y]?b[y]:b[y-1],\". or operator expected\")};return J}function ce(w,b,y){y=y||{},y.from=y.from?y.from:\"$tau-js\",y.reconsult=y.reconsult!==void 0?y.reconsult:!0;var F=new U(w),J={},X;F.new_text(b);var $=0,ie=F.get_tokens($);do{if(ie===null||!ie[$])break;var Se=le(w,ie,$);if(Se.type===A)return new H(\"throw\",[Se.value]);if(Se.value.body===null&&Se.value.head.indicator===\"?-/1\"){var Re=new et(w.session);Re.add_goal(Se.value.head.args[0]),Re.answer(function(dt){S.type.is_error(dt)?w.throw_warning(dt.args[0]):(dt===!1||dt===null)&&w.throw_warning(S.warning.failed_goal(Se.value.head.args[0],Se.len))}),$=Se.len;var at=!0}else if(Se.value.body===null&&Se.value.head.indicator===\":-/1\"){var at=w.run_directive(Se.value.head.args[0]);$=Se.len,Se.value.head.args[0].indicator===\"char_conversion/2\"&&(ie=F.get_tokens($),$=0)}else{X=Se.value.head.indicator,y.reconsult!==!1&&J[X]!==!0&&!w.is_multifile_predicate(X)&&(w.session.rules[X]=a(w.session.rules[X]||[],function(jt){return jt.dynamic}),J[X]=!0);var at=w.add_rule(Se.value,y);$=Se.len}if(!at)return at}while(!0);return!0}function Ce(w,b){var y=new U(w);y.new_text(b);var F=0;do{var J=y.get_tokens(F);if(J===null)break;var X=z(w,J,0,w.__get_max_priority(),!1);if(X.type!==A){var $=X.len,ie=$;if(J[$]&&J[$].name===\"atom\"&&J[$].raw===\".\")w.add_goal(Ee(X.value));else{var Se=J[$];return new H(\"throw\",[S.error.syntax(Se||J[$-1],\". or operator expected\",!Se)])}F=X.len+1}else return new H(\"throw\",[X.value])}while(!0);return!0}function de(w,b){w=w.rename(b);var y=b.next_free_variable(),F=Be(w.body,y,b);return F.error?F.value:(w.body=F.value,w.head.args=w.head.args.concat([y,F.variable]),w.head=new H(w.head.id,w.head.args),w)}function Be(w,b,y){var F;if(S.type.is_term(w)&&w.indicator===\"!/0\")return{value:w,variable:b,error:!1};if(S.type.is_term(w)&&w.indicator===\",/2\"){var J=Be(w.args[0],b,y);if(J.error)return J;var X=Be(w.args[1],J.variable,y);return X.error?X:{value:new H(\",\",[J.value,X.value]),variable:X.variable,error:!1}}else{if(S.type.is_term(w)&&w.indicator===\"{}/1\")return{value:w.args[0],variable:b,error:!1};if(S.type.is_empty_list(w))return{value:new H(\"true\",[]),variable:b,error:!1};if(S.type.is_list(w)){F=y.next_free_variable();for(var $=w,ie;$.indicator===\"./2\";)ie=$,$=$.args[1];return S.type.is_variable($)?{value:S.error.instantiation(\"DCG\"),variable:b,error:!0}:S.type.is_empty_list($)?(ie.args[1]=F,{value:new H(\"=\",[b,w]),variable:F,error:!1}):{value:S.error.type(\"list\",w,\"DCG\"),variable:b,error:!0}}else return S.type.is_callable(w)?(F=y.next_free_variable(),w.args=w.args.concat([b,F]),w=new H(w.id,w.args),{value:w,variable:F,error:!1}):{value:S.error.type(\"callable\",w,\"DCG\"),variable:b,error:!0}}}function Ee(w){return S.type.is_variable(w)?new H(\"call\",[w]):S.type.is_term(w)&&[\",/2\",\";/2\",\"->/2\"].indexOf(w.indicator)!==-1?new H(w.id,[Ee(w.args[0]),Ee(w.args[1])]):w}function g(w,b){for(var y=b||new S.type.Term(\"[]\",[]),F=w.length-1;F>=0;F--)y=new S.type.Term(\".\",[w[F],y]);return y}function me(w,b){for(var y=w.length-1;y>=0;y--)w[y]===b&&w.splice(y,1)}function we(w){for(var b={},y=[],F=0;F<w.length;F++)w[F]in b||(y.push(w[F]),b[w[F]]=!0);return y}function Ae(w,b,y,F){if(w.session.rules[y]!==null){for(var J=0;J<w.session.rules[y].length;J++)if(w.session.rules[y][J]===F){w.session.rules[y].splice(J,1),w.success(b);break}}}function ne(w){return function(b,y,F){var J=F.args[0],X=F.args.slice(1,w);if(S.type.is_variable(J))b.throw_error(S.error.instantiation(b.level));else if(!S.type.is_callable(J))b.throw_error(S.error.type(\"callable\",J,b.level));else{var $=new H(J.id,J.args.concat(X));b.prepend([new ke(y.goal.replace($),y.substitution,y)])}}}function Z(w){for(var b=w.length-1;b>=0;b--)if(w.charAt(b)===\"/\")return new H(\"/\",[new H(w.substring(0,b)),new Ne(parseInt(w.substring(b+1)),!1)])}function xe(w){this.id=w}function Ne(w,b){this.is_float=b!==void 0?b:parseInt(w)!==w,this.value=this.is_float?w:parseInt(w)}var ht=0;function H(w,b,y){this.ref=y||++ht,this.id=w,this.args=b||[],this.indicator=w+\"/\"+this.args.length}var rt=0;function Te(w,b,y,F,J,X){this.id=rt++,this.stream=w,this.mode=b,this.alias=y,this.type=F!==void 0?F:\"text\",this.reposition=J!==void 0?J:!0,this.eof_action=X!==void 0?X:\"eof_code\",this.position=this.mode===\"append\"?\"end_of_stream\":0,this.output=this.mode===\"write\"||this.mode===\"append\",this.input=this.mode===\"read\"}function Fe(w){w=w||{},this.links=w}function ke(w,b,y){b=b||new Fe,y=y||null,this.goal=w,this.substitution=b,this.parent=y}function Ye(w,b,y){this.head=w,this.body=b,this.dynamic=y||!1}function be(w){w=w===void 0||w<=0?1e3:w,this.rules={},this.src_predicates={},this.rename=0,this.modules=[],this.thread=new et(this),this.total_threads=1,this.renamed_variables={},this.public_predicates={},this.multifile_predicates={},this.limit=w,this.streams={user_input:new Te(typeof gl<\"u\"&&gl.exports?nodejs_user_input:tau_user_input,\"read\",\"user_input\",\"text\",!1,\"reset\"),user_output:new Te(typeof gl<\"u\"&&gl.exports?nodejs_user_output:tau_user_output,\"write\",\"user_output\",\"text\",!1,\"eof_code\")},this.file_system=typeof gl<\"u\"&&gl.exports?nodejs_file_system:tau_file_system,this.standard_input=this.streams.user_input,this.standard_output=this.streams.user_output,this.current_input=this.streams.user_input,this.current_output=this.streams.user_output,this.format_success=function(b){return b.substitution},this.format_error=function(b){return b.goal},this.flag={bounded:S.flag.bounded.value,max_integer:S.flag.max_integer.value,min_integer:S.flag.min_integer.value,integer_rounding_function:S.flag.integer_rounding_function.value,char_conversion:S.flag.char_conversion.value,debug:S.flag.debug.value,max_arity:S.flag.max_arity.value,unknown:S.flag.unknown.value,double_quotes:S.flag.double_quotes.value,occurs_check:S.flag.occurs_check.value,dialect:S.flag.dialect.value,version_data:S.flag.version_data.value,nodejs:S.flag.nodejs.value},this.__loaded_modules=[],this.__char_conversion={},this.__operators={1200:{\":-\":[\"fx\",\"xfx\"],\"-->\":[\"xfx\"],\"?-\":[\"fx\"]},1100:{\";\":[\"xfy\"]},1050:{\"->\":[\"xfy\"]},1e3:{\",\":[\"xfy\"]},900:{\"\\\\+\":[\"fy\"]},700:{\"=\":[\"xfx\"],\"\\\\=\":[\"xfx\"],\"==\":[\"xfx\"],\"\\\\==\":[\"xfx\"],\"@<\":[\"xfx\"],\"@=<\":[\"xfx\"],\"@>\":[\"xfx\"],\"@>=\":[\"xfx\"],\"=..\":[\"xfx\"],is:[\"xfx\"],\"=:=\":[\"xfx\"],\"=\\\\=\":[\"xfx\"],\"<\":[\"xfx\"],\"=<\":[\"xfx\"],\">\":[\"xfx\"],\">=\":[\"xfx\"]},600:{\":\":[\"xfy\"]},500:{\"+\":[\"yfx\"],\"-\":[\"yfx\"],\"/\\\\\":[\"yfx\"],\"\\\\/\":[\"yfx\"]},400:{\"*\":[\"yfx\"],\"/\":[\"yfx\"],\"//\":[\"yfx\"],rem:[\"yfx\"],mod:[\"yfx\"],\"<<\":[\"yfx\"],\">>\":[\"yfx\"]},200:{\"**\":[\"xfx\"],\"^\":[\"xfy\"],\"-\":[\"fy\"],\"+\":[\"fy\"],\"\\\\\":[\"fy\"]}}}function et(w){this.epoch=Date.now(),this.session=w,this.session.total_threads++,this.total_steps=0,this.cpu_time=0,this.cpu_time_last=0,this.points=[],this.debugger=!1,this.debugger_states=[],this.level=\"top_level/0\",this.__calls=[],this.current_limit=this.session.limit,this.warnings=[]}function Ue(w,b,y){this.id=w,this.rules=b,this.exports=y,S.module[w]=this}Ue.prototype.exports_predicate=function(w){return this.exports.indexOf(w)!==-1},xe.prototype.unify=function(w,b){if(b&&e(w.variables(),this.id)!==-1&&!S.type.is_variable(w))return null;var y={};return y[this.id]=w,new Fe(y)},Ne.prototype.unify=function(w,b){return S.type.is_number(w)&&this.value===w.value&&this.is_float===w.is_float?new Fe:null},H.prototype.unify=function(w,b){if(S.type.is_term(w)&&this.indicator===w.indicator){for(var y=new Fe,F=0;F<this.args.length;F++){var J=S.unify(this.args[F].apply(y),w.args[F].apply(y),b);if(J===null)return null;for(var X in J.links)y.links[X]=J.links[X];y=y.apply(J)}return y}return null},Te.prototype.unify=function(w,b){return S.type.is_stream(w)&&this.id===w.id?new Fe:null},xe.prototype.toString=function(w){return this.id},Ne.prototype.toString=function(w){return this.is_float&&e(this.value.toString(),\".\")===-1?this.value+\".0\":this.value.toString()},H.prototype.toString=function(w,b,y){if(w=w||{},w.quoted=w.quoted===void 0?!0:w.quoted,w.ignore_ops=w.ignore_ops===void 0?!1:w.ignore_ops,w.numbervars=w.numbervars===void 0?!1:w.numbervars,b=b===void 0?1200:b,y=y===void 0?\"\":y,w.numbervars&&this.indicator===\"$VAR/1\"&&S.type.is_integer(this.args[0])&&this.args[0].value>=0){var F=this.args[0].value,J=Math.floor(F/26),X=F%26;return\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"[X]+(J!==0?J:\"\")}switch(this.indicator){case\"[]/0\":case\"{}/0\":case\"!/0\":return this.id;case\"{}/1\":return\"{\"+this.args[0].toString(w)+\"}\";case\"./2\":for(var $=\"[\"+this.args[0].toString(w),ie=this.args[1];ie.indicator===\"./2\";)$+=\", \"+ie.args[0].toString(w),ie=ie.args[1];return ie.indicator!==\"[]/0\"&&($+=\"|\"+ie.toString(w)),$+=\"]\",$;case\",/2\":return\"(\"+this.args[0].toString(w)+\", \"+this.args[1].toString(w)+\")\";default:var Se=this.id,Re=w.session?w.session.lookup_operator(this.id,this.args.length):null;if(w.session===void 0||w.ignore_ops||Re===null)return w.quoted&&!/^(!|,|;|[a-z][0-9a-zA-Z_]*)$/.test(Se)&&Se!==\"{}\"&&Se!==\"[]\"&&(Se=\"'\"+x(Se)+\"'\"),Se+(this.args.length?\"(\"+o(this.args,function(tr){return tr.toString(w)}).join(\", \")+\")\":\"\");var at=Re.priority>b.priority||Re.priority===b.priority&&(Re.class===\"xfy\"&&this.indicator!==b.indicator||Re.class===\"yfx\"&&this.indicator!==b.indicator||this.indicator===b.indicator&&Re.class===\"yfx\"&&y===\"right\"||this.indicator===b.indicator&&Re.class===\"xfy\"&&y===\"left\");Re.indicator=this.indicator;var dt=at?\"(\":\"\",jt=at?\")\":\"\";return this.args.length===0?\"(\"+this.id+\")\":[\"fy\",\"fx\"].indexOf(Re.class)!==-1?dt+Se+\" \"+this.args[0].toString(w,Re)+jt:[\"yf\",\"xf\"].indexOf(Re.class)!==-1?dt+this.args[0].toString(w,Re)+\" \"+Se+jt:dt+this.args[0].toString(w,Re,\"left\")+\" \"+this.id+\" \"+this.args[1].toString(w,Re,\"right\")+jt}},Te.prototype.toString=function(w){return\"<stream>(\"+this.id+\")\"},Fe.prototype.toString=function(w){var b=\"{\";for(var y in this.links)this.links.hasOwnProperty(y)&&(b!==\"{\"&&(b+=\", \"),b+=y+\"/\"+this.links[y].toString(w));return b+=\"}\",b},ke.prototype.toString=function(w){return this.goal===null?\"<\"+this.substitution.toString(w)+\">\":\"<\"+this.goal.toString(w)+\", \"+this.substitution.toString(w)+\">\"},Ye.prototype.toString=function(w){return this.body?this.head.toString(w)+\" :- \"+this.body.toString(w)+\".\":this.head.toString(w)+\".\"},be.prototype.toString=function(w){for(var b=\"\",y=0;y<this.modules.length;y++)b+=\":- use_module(library(\"+this.modules[y]+`)).\n`;b+=`\n`;for(key in this.rules)for(y=0;y<this.rules[key].length;y++)b+=this.rules[key][y].toString(w),b+=`\n`;return b},xe.prototype.clone=function(){return new xe(this.id)},Ne.prototype.clone=function(){return new Ne(this.value,this.is_float)},H.prototype.clone=function(){return new H(this.id,o(this.args,function(w){return w.clone()}))},Te.prototype.clone=function(){return new Stram(this.stream,this.mode,this.alias,this.type,this.reposition,this.eof_action)},Fe.prototype.clone=function(){var w={};for(var b in this.links)this.links.hasOwnProperty(b)&&(w[b]=this.links[b].clone());return new Fe(w)},ke.prototype.clone=function(){return new ke(this.goal.clone(),this.substitution.clone(),this.parent)},Ye.prototype.clone=function(){return new Ye(this.head.clone(),this.body!==null?this.body.clone():null)},xe.prototype.equals=function(w){return S.type.is_variable(w)&&this.id===w.id},Ne.prototype.equals=function(w){return S.type.is_number(w)&&this.value===w.value&&this.is_float===w.is_float},H.prototype.equals=function(w){if(!S.type.is_term(w)||this.indicator!==w.indicator)return!1;for(var b=0;b<this.args.length;b++)if(!this.args[b].equals(w.args[b]))return!1;return!0},Te.prototype.equals=function(w){return S.type.is_stream(w)&&this.id===w.id},Fe.prototype.equals=function(w){var b;if(!S.type.is_substitution(w))return!1;for(b in this.links)if(this.links.hasOwnProperty(b)&&(!w.links[b]||!this.links[b].equals(w.links[b])))return!1;for(b in w.links)if(w.links.hasOwnProperty(b)&&!this.links[b])return!1;return!0},ke.prototype.equals=function(w){return S.type.is_state(w)&&this.goal.equals(w.goal)&&this.substitution.equals(w.substitution)&&this.parent===w.parent},Ye.prototype.equals=function(w){return S.type.is_rule(w)&&this.head.equals(w.head)&&(this.body===null&&w.body===null||this.body!==null&&this.body.equals(w.body))},xe.prototype.rename=function(w){return w.get_free_variable(this)},Ne.prototype.rename=function(w){return this},H.prototype.rename=function(w){return new H(this.id,o(this.args,function(b){return b.rename(w)}))},Te.prototype.rename=function(w){return this},Ye.prototype.rename=function(w){return new Ye(this.head.rename(w),this.body!==null?this.body.rename(w):null)},xe.prototype.variables=function(){return[this.id]},Ne.prototype.variables=function(){return[]},H.prototype.variables=function(){return[].concat.apply([],o(this.args,function(w){return w.variables()}))},Te.prototype.variables=function(){return[]},Ye.prototype.variables=function(){return this.body===null?this.head.variables():this.head.variables().concat(this.body.variables())},xe.prototype.apply=function(w){return w.lookup(this.id)?w.lookup(this.id):this},Ne.prototype.apply=function(w){return this},H.prototype.apply=function(w){if(this.indicator===\"./2\"){for(var b=[],y=this;y.indicator===\"./2\";)b.push(y.args[0].apply(w)),y=y.args[1];for(var F=y.apply(w),J=b.length-1;J>=0;J--)F=new H(\".\",[b[J],F]);return F}return new H(this.id,o(this.args,function(X){return X.apply(w)}),this.ref)},Te.prototype.apply=function(w){return this},Ye.prototype.apply=function(w){return new Ye(this.head.apply(w),this.body!==null?this.body.apply(w):null)},Fe.prototype.apply=function(w){var b,y={};for(b in this.links)this.links.hasOwnProperty(b)&&(y[b]=this.links[b].apply(w));return new Fe(y)},H.prototype.select=function(){for(var w=this;w.indicator===\",/2\";)w=w.args[0];return w},H.prototype.replace=function(w){return this.indicator===\",/2\"?this.args[0].indicator===\",/2\"?new H(\",\",[this.args[0].replace(w),this.args[1]]):w===null?this.args[1]:new H(\",\",[w,this.args[1]]):w},H.prototype.search=function(w){if(S.type.is_term(w)&&w.ref!==void 0&&this.ref===w.ref)return!0;for(var b=0;b<this.args.length;b++)if(S.type.is_term(this.args[b])&&this.args[b].search(w))return!0;return!1},be.prototype.get_current_input=function(){return this.current_input},et.prototype.get_current_input=function(){return this.session.get_current_input()},be.prototype.get_current_output=function(){return this.current_output},et.prototype.get_current_output=function(){return this.session.get_current_output()},be.prototype.set_current_input=function(w){this.current_input=w},et.prototype.set_current_input=function(w){return this.session.set_current_input(w)},be.prototype.set_current_output=function(w){this.current_input=w},et.prototype.set_current_output=function(w){return this.session.set_current_output(w)},be.prototype.get_stream_by_alias=function(w){return this.streams[w]},et.prototype.get_stream_by_alias=function(w){return this.session.get_stream_by_alias(w)},be.prototype.file_system_open=function(w,b,y){return this.file_system.open(w,b,y)},et.prototype.file_system_open=function(w,b,y){return this.session.file_system_open(w,b,y)},be.prototype.get_char_conversion=function(w){return this.__char_conversion[w]||w},et.prototype.get_char_conversion=function(w){return this.session.get_char_conversion(w)},be.prototype.parse=function(w){return this.thread.parse(w)},et.prototype.parse=function(w){var b=new U(this);b.new_text(w);var y=b.get_tokens();if(y===null)return!1;var F=z(this,y,0,this.__get_max_priority(),!1);return F.len!==y.length?!1:{value:F.value,expr:F,tokens:y}},be.prototype.get_flag=function(w){return this.flag[w]},et.prototype.get_flag=function(w){return this.session.get_flag(w)},be.prototype.add_rule=function(w,b){return b=b||{},b.from=b.from?b.from:\"$tau-js\",this.src_predicates[w.head.indicator]=b.from,this.rules[w.head.indicator]||(this.rules[w.head.indicator]=[]),this.rules[w.head.indicator].push(w),this.public_predicates.hasOwnProperty(w.head.indicator)||(this.public_predicates[w.head.indicator]=!1),!0},et.prototype.add_rule=function(w,b){return this.session.add_rule(w,b)},be.prototype.run_directive=function(w){this.thread.run_directive(w)},et.prototype.run_directive=function(w){return S.type.is_directive(w)?(S.directive[w.indicator](this,w),!0):!1},be.prototype.__get_max_priority=function(){return\"1200\"},et.prototype.__get_max_priority=function(){return this.session.__get_max_priority()},be.prototype.__get_next_priority=function(w){var b=0;w=parseInt(w);for(var y in this.__operators)if(this.__operators.hasOwnProperty(y)){var F=parseInt(y);F>b&&F<w&&(b=F)}return b.toString()},et.prototype.__get_next_priority=function(w){return this.session.__get_next_priority(w)},be.prototype.__lookup_operator_classes=function(w,b){return this.__operators.hasOwnProperty(w)&&this.__operators[w][b]instanceof Array&&this.__operators[w][b]||!1},et.prototype.__lookup_operator_classes=function(w,b){return this.session.__lookup_operator_classes(w,b)},be.prototype.lookup_operator=function(w,b){for(var y in this.__operators)if(this.__operators[y][w]){for(var F=0;F<this.__operators[y][w].length;F++)if(b===0||this.__operators[y][w][F].length===b+1)return{priority:y,class:this.__operators[y][w][F]}}return null},et.prototype.lookup_operator=function(w,b){return this.session.lookup_operator(w,b)},be.prototype.throw_warning=function(w){this.thread.throw_warning(w)},et.prototype.throw_warning=function(w){this.warnings.push(w)},be.prototype.get_warnings=function(){return this.thread.get_warnings()},et.prototype.get_warnings=function(){return this.warnings},be.prototype.add_goal=function(w,b){this.thread.add_goal(w,b)},et.prototype.add_goal=function(w,b,y){y=y||null,b===!0&&(this.points=[]);for(var F=w.variables(),J={},X=0;X<F.length;X++)J[F[X]]=new xe(F[X]);this.points.push(new ke(w,new Fe(J),y))},be.prototype.consult=function(w,b){return this.thread.consult(w,b)},et.prototype.consult=function(w,b){var y=\"\";if(typeof w==\"string\"){y=w;var F=y.length;if(y.substring(F-3,F)===\".pl\"&&document.getElementById(y)){var J=document.getElementById(y),X=J.getAttribute(\"type\");X!==null&&X.replace(/ /g,\"\").toLowerCase()===\"text/prolog\"&&(y=J.text)}}else if(w.nodeName)switch(w.nodeName.toLowerCase()){case\"input\":case\"textarea\":y=w.value;break;default:y=w.innerHTML;break}else return!1;return this.warnings=[],ce(this,y,b)},be.prototype.query=function(w){return this.thread.query(w)},et.prototype.query=function(w){return this.points=[],this.debugger_points=[],Ce(this,w)},be.prototype.head_point=function(){return this.thread.head_point()},et.prototype.head_point=function(){return this.points[this.points.length-1]},be.prototype.get_free_variable=function(w){return this.thread.get_free_variable(w)},et.prototype.get_free_variable=function(w){var b=[];if(w.id===\"_\"||this.session.renamed_variables[w.id]===void 0){for(this.session.rename++,this.points.length>0&&(b=this.head_point().substitution.domain());e(b,S.format_variable(this.session.rename))!==-1;)this.session.rename++;if(w.id===\"_\")return new xe(S.format_variable(this.session.rename));this.session.renamed_variables[w.id]=S.format_variable(this.session.rename)}return new xe(this.session.renamed_variables[w.id])},be.prototype.next_free_variable=function(){return this.thread.next_free_variable()},et.prototype.next_free_variable=function(){this.session.rename++;var w=[];for(this.points.length>0&&(w=this.head_point().substitution.domain());e(w,S.format_variable(this.session.rename))!==-1;)this.session.rename++;return new xe(S.format_variable(this.session.rename))},be.prototype.is_public_predicate=function(w){return!this.public_predicates.hasOwnProperty(w)||this.public_predicates[w]===!0},et.prototype.is_public_predicate=function(w){return this.session.is_public_predicate(w)},be.prototype.is_multifile_predicate=function(w){return this.multifile_predicates.hasOwnProperty(w)&&this.multifile_predicates[w]===!0},et.prototype.is_multifile_predicate=function(w){return this.session.is_multifile_predicate(w)},be.prototype.prepend=function(w){return this.thread.prepend(w)},et.prototype.prepend=function(w){for(var b=w.length-1;b>=0;b--)this.points.push(w[b])},be.prototype.success=function(w,b){return this.thread.success(w,b)},et.prototype.success=function(w,y){var y=typeof y>\"u\"?w:y;this.prepend([new ke(w.goal.replace(null),w.substitution,y)])},be.prototype.throw_error=function(w){return this.thread.throw_error(w)},et.prototype.throw_error=function(w){this.prepend([new ke(new H(\"throw\",[w]),new Fe,null,null)])},be.prototype.step_rule=function(w,b){return this.thread.step_rule(w,b)},et.prototype.step_rule=function(w,b){var y=b.indicator;if(w===\"user\"&&(w=null),w===null&&this.session.rules.hasOwnProperty(y))return this.session.rules[y];for(var F=w===null?this.session.modules:e(this.session.modules,w)===-1?[]:[w],J=0;J<F.length;J++){var X=S.module[F[J]];if(X.rules.hasOwnProperty(y)&&(X.rules.hasOwnProperty(this.level)||X.exports_predicate(y)))return S.module[F[J]].rules[y]}return null},be.prototype.step=function(){return this.thread.step()},et.prototype.step=function(){if(this.points.length!==0){var w=!1,b=this.points.pop();if(this.debugger&&this.debugger_states.push(b),S.type.is_term(b.goal)){var y=b.goal.select(),F=null,J=[];if(y!==null){this.total_steps++;for(var X=b;X.parent!==null&&X.parent.goal.search(y);)X=X.parent;if(this.level=X.parent===null?\"top_level/0\":X.parent.goal.select().indicator,S.type.is_term(y)&&y.indicator===\":/2\"&&(F=y.args[0].id,y=y.args[1]),F===null&&S.type.is_builtin(y))this.__call_indicator=y.indicator,w=S.predicate[y.indicator](this,b,y);else{var $=this.step_rule(F,y);if($===null)this.session.rules.hasOwnProperty(y.indicator)||(this.get_flag(\"unknown\").id===\"error\"?this.throw_error(S.error.existence(\"procedure\",y.indicator,this.level)):this.get_flag(\"unknown\").id===\"warning\"&&this.throw_warning(\"unknown procedure \"+y.indicator+\" (from \"+this.level+\")\"));else if($ instanceof Function)w=$(this,b,y);else{for(var ie in $)if($.hasOwnProperty(ie)){var Se=$[ie];this.session.renamed_variables={},Se=Se.rename(this);var Re=this.get_flag(\"occurs_check\").indicator===\"true/0\",at=new ke,dt=S.unify(y,Se.head,Re);dt!==null&&(at.goal=b.goal.replace(Se.body),at.goal!==null&&(at.goal=at.goal.apply(dt)),at.substitution=b.substitution.apply(dt),at.parent=b,J.push(at))}this.prepend(J)}}}}else S.type.is_variable(b.goal)?this.throw_error(S.error.instantiation(this.level)):this.throw_error(S.error.type(\"callable\",b.goal,this.level));return w}},be.prototype.answer=function(w){return this.thread.answer(w)},et.prototype.answer=function(w){w=w||function(b){},this.__calls.push(w),!(this.__calls.length>1)&&this.again()},be.prototype.answers=function(w,b,y){return this.thread.answers(w,b,y)},et.prototype.answers=function(w,b,y){var F=b||1e3,J=this;if(b<=0){y&&y();return}this.answer(function(X){w(X),X!==!1?setTimeout(function(){J.answers(w,b-1,y)},1):y&&y()})},be.prototype.again=function(w){return this.thread.again(w)},et.prototype.again=function(w){for(var b,y=Date.now();this.__calls.length>0;){for(this.warnings=[],w!==!1&&(this.current_limit=this.session.limit);this.current_limit>0&&this.points.length>0&&this.head_point().goal!==null&&!S.type.is_error(this.head_point().goal);)if(this.current_limit--,this.step()===!0)return;var F=Date.now();this.cpu_time_last=F-y,this.cpu_time+=this.cpu_time_last;var J=this.__calls.shift();this.current_limit<=0?J(null):this.points.length===0?J(!1):S.type.is_error(this.head_point().goal)?(b=this.session.format_error(this.points.pop()),this.points=[],J(b)):(this.debugger&&this.debugger_states.push(this.head_point()),b=this.session.format_success(this.points.pop()),J(b))}},be.prototype.unfold=function(w){if(w.body===null)return!1;var b=w.head,y=w.body,F=y.select(),J=new et(this),X=[];J.add_goal(F),J.step();for(var $=J.points.length-1;$>=0;$--){var ie=J.points[$],Se=b.apply(ie.substitution),Re=y.replace(ie.goal);Re!==null&&(Re=Re.apply(ie.substitution)),X.push(new Ye(Se,Re))}var at=this.rules[b.indicator],dt=e(at,w);return X.length>0&&dt!==-1?(at.splice.apply(at,[dt,1].concat(X)),!0):!1},et.prototype.unfold=function(w){return this.session.unfold(w)},xe.prototype.interpret=function(w){return S.error.instantiation(w.level)},Ne.prototype.interpret=function(w){return this},H.prototype.interpret=function(w){return S.type.is_unitary_list(this)?this.args[0].interpret(w):S.operate(w,this)},xe.prototype.compare=function(w){return this.id<w.id?-1:this.id>w.id?1:0},Ne.prototype.compare=function(w){if(this.value===w.value&&this.is_float===w.is_float)return 0;if(this.value<w.value||this.value===w.value&&this.is_float&&!w.is_float)return-1;if(this.value>w.value)return 1},H.prototype.compare=function(w){if(this.args.length<w.args.length||this.args.length===w.args.length&&this.id<w.id)return-1;if(this.args.length>w.args.length||this.args.length===w.args.length&&this.id>w.id)return 1;for(var b=0;b<this.args.length;b++){var y=S.compare(this.args[b],w.args[b]);if(y!==0)return y}return 0},Fe.prototype.lookup=function(w){return this.links[w]?this.links[w]:null},Fe.prototype.filter=function(w){var b={};for(var y in this.links)if(this.links.hasOwnProperty(y)){var F=this.links[y];w(y,F)&&(b[y]=F)}return new Fe(b)},Fe.prototype.exclude=function(w){var b={};for(var y in this.links)this.links.hasOwnProperty(y)&&e(w,y)===-1&&(b[y]=this.links[y]);return new Fe(b)},Fe.prototype.add=function(w,b){this.links[w]=b},Fe.prototype.domain=function(w){var b=w===!0?function(J){return J}:function(J){return new xe(J)},y=[];for(var F in this.links)y.push(b(F));return y},xe.prototype.compile=function(){return'new pl.type.Var(\"'+this.id.toString()+'\")'},Ne.prototype.compile=function(){return\"new pl.type.Num(\"+this.value.toString()+\", \"+this.is_float.toString()+\")\"},H.prototype.compile=function(){return'new pl.type.Term(\"'+this.id.replace(/\"/g,'\\\\\"')+'\", ['+o(this.args,function(w){return w.compile()})+\"])\"},Ye.prototype.compile=function(){return\"new pl.type.Rule(\"+this.head.compile()+\", \"+(this.body===null?\"null\":this.body.compile())+\")\"},be.prototype.compile=function(){var w,b=[],y;for(var F in this.rules)if(this.rules.hasOwnProperty(F)){var J=this.rules[F];y=[],w='\"'+F+'\": [';for(var X=0;X<J.length;X++)y.push(J[X].compile());w+=y.join(),w+=\"]\",b.push(w)}return\"{\"+b.join()+\"};\"},xe.prototype.toJavaScript=function(){},Ne.prototype.toJavaScript=function(){return this.value},H.prototype.toJavaScript=function(){if(this.args.length===0&&this.indicator!==\"[]/0\")return this.id;if(S.type.is_list(this)){for(var w=[],b=this,y;b.indicator===\"./2\";){if(y=b.args[0].toJavaScript(),y===void 0)return;w.push(y),b=b.args[1]}if(b.indicator===\"[]/0\")return w}},Ye.prototype.singleton_variables=function(){var w=this.head.variables(),b={},y=[];this.body!==null&&(w=w.concat(this.body.variables()));for(var F=0;F<w.length;F++)b[w[F]]===void 0&&(b[w[F]]=0),b[w[F]]++;for(var J in b)J!==\"_\"&&b[J]===1&&y.push(J);return y};var S={__env:typeof gl<\"u\"&&gl.exports?global:window,module:{},version:t,parser:{tokenizer:U,expression:z},utils:{str_indicator:Z,codePointAt:n,fromCodePoint:u},statistics:{getCountTerms:function(){return ht}},fromJavaScript:{test:{boolean:function(w){return w===!0||w===!1},number:function(w){return typeof w==\"number\"},string:function(w){return typeof w==\"string\"},list:function(w){return w instanceof Array},variable:function(w){return w===void 0},any:function(w){return!0}},conversion:{boolean:function(w){return new H(w?\"true\":\"false\",[])},number:function(w){return new Ne(w,w%1!==0)},string:function(w){return new H(w,[])},list:function(w){for(var b=[],y,F=0;F<w.length;F++){if(y=S.fromJavaScript.apply(w[F]),y===void 0)return;b.push(y)}return g(b)},variable:function(w){return new xe(\"_\")},any:function(w){}},apply:function(w){for(var b in S.fromJavaScript.test)if(b!==\"any\"&&S.fromJavaScript.test[b](w))return S.fromJavaScript.conversion[b](w);return S.fromJavaScript.conversion.any(w)}},type:{Var:xe,Num:Ne,Term:H,Rule:Ye,State:ke,Stream:Te,Module:Ue,Thread:et,Session:be,Substitution:Fe,order:[xe,Ne,H,Te],compare:function(w,b){var y=e(S.type.order,w.constructor),F=e(S.type.order,b.constructor);if(y<F)return-1;if(y>F)return 1;if(w.constructor===Ne){if(w.is_float&&b.is_float)return 0;if(w.is_float)return-1;if(b.is_float)return 1}return 0},is_substitution:function(w){return w instanceof Fe},is_state:function(w){return w instanceof ke},is_rule:function(w){return w instanceof Ye},is_variable:function(w){return w instanceof xe},is_stream:function(w){return w instanceof Te},is_anonymous_var:function(w){return w instanceof xe&&w.id===\"_\"},is_callable:function(w){return w instanceof H},is_number:function(w){return w instanceof Ne},is_integer:function(w){return w instanceof Ne&&!w.is_float},is_float:function(w){return w instanceof Ne&&w.is_float},is_term:function(w){return w instanceof H},is_atom:function(w){return w instanceof H&&w.args.length===0},is_ground:function(w){if(w instanceof xe)return!1;if(w instanceof H){for(var b=0;b<w.args.length;b++)if(!S.type.is_ground(w.args[b]))return!1}return!0},is_atomic:function(w){return w instanceof H&&w.args.length===0||w instanceof Ne},is_compound:function(w){return w instanceof H&&w.args.length>0},is_list:function(w){return w instanceof H&&(w.indicator===\"[]/0\"||w.indicator===\"./2\")},is_empty_list:function(w){return w instanceof H&&w.indicator===\"[]/0\"},is_non_empty_list:function(w){return w instanceof H&&w.indicator===\"./2\"},is_fully_list:function(w){for(;w instanceof H&&w.indicator===\"./2\";)w=w.args[1];return w instanceof xe||w instanceof H&&w.indicator===\"[]/0\"},is_instantiated_list:function(w){for(;w instanceof H&&w.indicator===\"./2\";)w=w.args[1];return w instanceof H&&w.indicator===\"[]/0\"},is_unitary_list:function(w){return w instanceof H&&w.indicator===\"./2\"&&w.args[1]instanceof H&&w.args[1].indicator===\"[]/0\"},is_character:function(w){return w instanceof H&&(w.id.length===1||w.id.length>0&&w.id.length<=2&&n(w.id,0)>=65536)},is_character_code:function(w){return w instanceof Ne&&!w.is_float&&w.value>=0&&w.value<=1114111},is_byte:function(w){return w instanceof Ne&&!w.is_float&&w.value>=0&&w.value<=255},is_operator:function(w){return w instanceof H&&S.arithmetic.evaluation[w.indicator]},is_directive:function(w){return w instanceof H&&S.directive[w.indicator]!==void 0},is_builtin:function(w){return w instanceof H&&S.predicate[w.indicator]!==void 0},is_error:function(w){return w instanceof H&&w.indicator===\"throw/1\"},is_predicate_indicator:function(w){return w instanceof H&&w.indicator===\"//2\"&&w.args[0]instanceof H&&w.args[0].args.length===0&&w.args[1]instanceof Ne&&w.args[1].is_float===!1},is_flag:function(w){return w instanceof H&&w.args.length===0&&S.flag[w.id]!==void 0},is_value_flag:function(w,b){if(!S.type.is_flag(w))return!1;for(var y in S.flag[w.id].allowed)if(S.flag[w.id].allowed.hasOwnProperty(y)&&S.flag[w.id].allowed[y].equals(b))return!0;return!1},is_io_mode:function(w){return S.type.is_atom(w)&&[\"read\",\"write\",\"append\"].indexOf(w.id)!==-1},is_stream_option:function(w){return S.type.is_term(w)&&(w.indicator===\"alias/1\"&&S.type.is_atom(w.args[0])||w.indicator===\"reposition/1\"&&S.type.is_atom(w.args[0])&&(w.args[0].id===\"true\"||w.args[0].id===\"false\")||w.indicator===\"type/1\"&&S.type.is_atom(w.args[0])&&(w.args[0].id===\"text\"||w.args[0].id===\"binary\")||w.indicator===\"eof_action/1\"&&S.type.is_atom(w.args[0])&&(w.args[0].id===\"error\"||w.args[0].id===\"eof_code\"||w.args[0].id===\"reset\"))},is_stream_position:function(w){return S.type.is_integer(w)&&w.value>=0||S.type.is_atom(w)&&(w.id===\"end_of_stream\"||w.id===\"past_end_of_stream\")},is_stream_property:function(w){return S.type.is_term(w)&&(w.indicator===\"input/0\"||w.indicator===\"output/0\"||w.indicator===\"alias/1\"&&(S.type.is_variable(w.args[0])||S.type.is_atom(w.args[0]))||w.indicator===\"file_name/1\"&&(S.type.is_variable(w.args[0])||S.type.is_atom(w.args[0]))||w.indicator===\"position/1\"&&(S.type.is_variable(w.args[0])||S.type.is_stream_position(w.args[0]))||w.indicator===\"reposition/1\"&&(S.type.is_variable(w.args[0])||S.type.is_atom(w.args[0])&&(w.args[0].id===\"true\"||w.args[0].id===\"false\"))||w.indicator===\"type/1\"&&(S.type.is_variable(w.args[0])||S.type.is_atom(w.args[0])&&(w.args[0].id===\"text\"||w.args[0].id===\"binary\"))||w.indicator===\"mode/1\"&&(S.type.is_variable(w.args[0])||S.type.is_atom(w.args[0])&&(w.args[0].id===\"read\"||w.args[0].id===\"write\"||w.args[0].id===\"append\"))||w.indicator===\"eof_action/1\"&&(S.type.is_variable(w.args[0])||S.type.is_atom(w.args[0])&&(w.args[0].id===\"error\"||w.args[0].id===\"eof_code\"||w.args[0].id===\"reset\"))||w.indicator===\"end_of_stream/1\"&&(S.type.is_variable(w.args[0])||S.type.is_atom(w.args[0])&&(w.args[0].id===\"at\"||w.args[0].id===\"past\"||w.args[0].id===\"not\")))},is_streamable:function(w){return w.__proto__.stream!==void 0},is_read_option:function(w){return S.type.is_term(w)&&[\"variables/1\",\"variable_names/1\",\"singletons/1\"].indexOf(w.indicator)!==-1},is_write_option:function(w){return S.type.is_term(w)&&(w.indicator===\"quoted/1\"&&S.type.is_atom(w.args[0])&&(w.args[0].id===\"true\"||w.args[0].id===\"false\")||w.indicator===\"ignore_ops/1\"&&S.type.is_atom(w.args[0])&&(w.args[0].id===\"true\"||w.args[0].id===\"false\")||w.indicator===\"numbervars/1\"&&S.type.is_atom(w.args[0])&&(w.args[0].id===\"true\"||w.args[0].id===\"false\"))},is_close_option:function(w){return S.type.is_term(w)&&w.indicator===\"force/1\"&&S.type.is_atom(w.args[0])&&(w.args[0].id===\"true\"||w.args[0].id===\"false\")},is_modifiable_flag:function(w){return S.type.is_flag(w)&&S.flag[w.id].changeable},is_module:function(w){return w instanceof H&&w.indicator===\"library/1\"&&w.args[0]instanceof H&&w.args[0].args.length===0&&S.module[w.args[0].id]!==void 0}},arithmetic:{evaluation:{\"e/0\":{type_args:null,type_result:!0,fn:function(w){return Math.E}},\"pi/0\":{type_args:null,type_result:!0,fn:function(w){return Math.PI}},\"tau/0\":{type_args:null,type_result:!0,fn:function(w){return 2*Math.PI}},\"epsilon/0\":{type_args:null,type_result:!0,fn:function(w){return Number.EPSILON}},\"+/1\":{type_args:null,type_result:null,fn:function(w,b){return w}},\"-/1\":{type_args:null,type_result:null,fn:function(w,b){return-w}},\"\\\\/1\":{type_args:!1,type_result:!1,fn:function(w,b){return~w}},\"abs/1\":{type_args:null,type_result:null,fn:function(w,b){return Math.abs(w)}},\"sign/1\":{type_args:null,type_result:null,fn:function(w,b){return Math.sign(w)}},\"float_integer_part/1\":{type_args:!0,type_result:!1,fn:function(w,b){return parseInt(w)}},\"float_fractional_part/1\":{type_args:!0,type_result:!0,fn:function(w,b){return w-parseInt(w)}},\"float/1\":{type_args:null,type_result:!0,fn:function(w,b){return parseFloat(w)}},\"floor/1\":{type_args:!0,type_result:!1,fn:function(w,b){return Math.floor(w)}},\"truncate/1\":{type_args:!0,type_result:!1,fn:function(w,b){return parseInt(w)}},\"round/1\":{type_args:!0,type_result:!1,fn:function(w,b){return Math.round(w)}},\"ceiling/1\":{type_args:!0,type_result:!1,fn:function(w,b){return Math.ceil(w)}},\"sin/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.sin(w)}},\"cos/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.cos(w)}},\"tan/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.tan(w)}},\"asin/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.asin(w)}},\"acos/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.acos(w)}},\"atan/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.atan(w)}},\"atan2/2\":{type_args:null,type_result:!0,fn:function(w,b,y){return Math.atan2(w,b)}},\"exp/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.exp(w)}},\"sqrt/1\":{type_args:null,type_result:!0,fn:function(w,b){return Math.sqrt(w)}},\"log/1\":{type_args:null,type_result:!0,fn:function(w,b){return w>0?Math.log(w):S.error.evaluation(\"undefined\",b.__call_indicator)}},\"+/2\":{type_args:null,type_result:null,fn:function(w,b,y){return w+b}},\"-/2\":{type_args:null,type_result:null,fn:function(w,b,y){return w-b}},\"*/2\":{type_args:null,type_result:null,fn:function(w,b,y){return w*b}},\"//2\":{type_args:null,type_result:!0,fn:function(w,b,y){return b?w/b:S.error.evaluation(\"zero_division\",y.__call_indicator)}},\"///2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return b?parseInt(w/b):S.error.evaluation(\"zero_division\",y.__call_indicator)}},\"**/2\":{type_args:null,type_result:!0,fn:function(w,b,y){return Math.pow(w,b)}},\"^/2\":{type_args:null,type_result:null,fn:function(w,b,y){return Math.pow(w,b)}},\"<</2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return w<<b}},\">>/2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return w>>b}},\"/\\\\/2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return w&b}},\"\\\\//2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return w|b}},\"xor/2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return w^b}},\"rem/2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return b?w%b:S.error.evaluation(\"zero_division\",y.__call_indicator)}},\"mod/2\":{type_args:!1,type_result:!1,fn:function(w,b,y){return b?w-parseInt(w/b)*b:S.error.evaluation(\"zero_division\",y.__call_indicator)}},\"max/2\":{type_args:null,type_result:null,fn:function(w,b,y){return Math.max(w,b)}},\"min/2\":{type_args:null,type_result:null,fn:function(w,b,y){return Math.min(w,b)}}}},directive:{\"dynamic/1\":function(w,b){var y=b.args[0];if(S.type.is_variable(y))w.throw_error(S.error.instantiation(b.indicator));else if(!S.type.is_compound(y)||y.indicator!==\"//2\")w.throw_error(S.error.type(\"predicate_indicator\",y,b.indicator));else if(S.type.is_variable(y.args[0])||S.type.is_variable(y.args[1]))w.throw_error(S.error.instantiation(b.indicator));else if(!S.type.is_atom(y.args[0]))w.throw_error(S.error.type(\"atom\",y.args[0],b.indicator));else if(!S.type.is_integer(y.args[1]))w.throw_error(S.error.type(\"integer\",y.args[1],b.indicator));else{var F=b.args[0].args[0].id+\"/\"+b.args[0].args[1].value;w.session.public_predicates[F]=!0,w.session.rules[F]||(w.session.rules[F]=[])}},\"multifile/1\":function(w,b){var y=b.args[0];S.type.is_variable(y)?w.throw_error(S.error.instantiation(b.indicator)):!S.type.is_compound(y)||y.indicator!==\"//2\"?w.throw_error(S.error.type(\"predicate_indicator\",y,b.indicator)):S.type.is_variable(y.args[0])||S.type.is_variable(y.args[1])?w.throw_error(S.error.instantiation(b.indicator)):S.type.is_atom(y.args[0])?S.type.is_integer(y.args[1])?w.session.multifile_predicates[b.args[0].args[0].id+\"/\"+b.args[0].args[1].value]=!0:w.throw_error(S.error.type(\"integer\",y.args[1],b.indicator)):w.throw_error(S.error.type(\"atom\",y.args[0],b.indicator))},\"set_prolog_flag/2\":function(w,b){var y=b.args[0],F=b.args[1];S.type.is_variable(y)||S.type.is_variable(F)?w.throw_error(S.error.instantiation(b.indicator)):S.type.is_atom(y)?S.type.is_flag(y)?S.type.is_value_flag(y,F)?S.type.is_modifiable_flag(y)?w.session.flag[y.id]=F:w.throw_error(S.error.permission(\"modify\",\"flag\",y)):w.throw_error(S.error.domain(\"flag_value\",new H(\"+\",[y,F]),b.indicator)):w.throw_error(S.error.domain(\"prolog_flag\",y,b.indicator)):w.throw_error(S.error.type(\"atom\",y,b.indicator))},\"use_module/1\":function(w,b){var y=b.args[0];if(S.type.is_variable(y))w.throw_error(S.error.instantiation(b.indicator));else if(!S.type.is_term(y))w.throw_error(S.error.type(\"term\",y,b.indicator));else if(S.type.is_module(y)){var F=y.args[0].id;e(w.session.modules,F)===-1&&w.session.modules.push(F)}},\"char_conversion/2\":function(w,b){var y=b.args[0],F=b.args[1];S.type.is_variable(y)||S.type.is_variable(F)?w.throw_error(S.error.instantiation(b.indicator)):S.type.is_character(y)?S.type.is_character(F)?y.id===F.id?delete w.session.__char_conversion[y.id]:w.session.__char_conversion[y.id]=F.id:w.throw_error(S.error.type(\"character\",F,b.indicator)):w.throw_error(S.error.type(\"character\",y,b.indicator))},\"op/3\":function(w,b){var y=b.args[0],F=b.args[1],J=b.args[2];if(S.type.is_variable(y)||S.type.is_variable(F)||S.type.is_variable(J))w.throw_error(S.error.instantiation(b.indicator));else if(!S.type.is_integer(y))w.throw_error(S.error.type(\"integer\",y,b.indicator));else if(!S.type.is_atom(F))w.throw_error(S.error.type(\"atom\",F,b.indicator));else if(!S.type.is_atom(J))w.throw_error(S.error.type(\"atom\",J,b.indicator));else if(y.value<0||y.value>1200)w.throw_error(S.error.domain(\"operator_priority\",y,b.indicator));else if(J.id===\",\")w.throw_error(S.error.permission(\"modify\",\"operator\",J,b.indicator));else if(J.id===\"|\"&&(y.value<1001||F.id.length!==3))w.throw_error(S.error.permission(\"modify\",\"operator\",J,b.indicator));else if([\"fy\",\"fx\",\"yf\",\"xf\",\"xfx\",\"yfx\",\"xfy\"].indexOf(F.id)===-1)w.throw_error(S.error.domain(\"operator_specifier\",F,b.indicator));else{var X={prefix:null,infix:null,postfix:null};for(var $ in w.session.__operators)if(w.session.__operators.hasOwnProperty($)){var ie=w.session.__operators[$][J.id];ie&&(e(ie,\"fx\")!==-1&&(X.prefix={priority:$,type:\"fx\"}),e(ie,\"fy\")!==-1&&(X.prefix={priority:$,type:\"fy\"}),e(ie,\"xf\")!==-1&&(X.postfix={priority:$,type:\"xf\"}),e(ie,\"yf\")!==-1&&(X.postfix={priority:$,type:\"yf\"}),e(ie,\"xfx\")!==-1&&(X.infix={priority:$,type:\"xfx\"}),e(ie,\"xfy\")!==-1&&(X.infix={priority:$,type:\"xfy\"}),e(ie,\"yfx\")!==-1&&(X.infix={priority:$,type:\"yfx\"}))}var Se;switch(F.id){case\"fy\":case\"fx\":Se=\"prefix\";break;case\"yf\":case\"xf\":Se=\"postfix\";break;default:Se=\"infix\";break}if(((X.prefix&&Se===\"prefix\"||X.postfix&&Se===\"postfix\"||X.infix&&Se===\"infix\")&&X[Se].type!==F.id||X.infix&&Se===\"postfix\"||X.postfix&&Se===\"infix\")&&y.value!==0)w.throw_error(S.error.permission(\"create\",\"operator\",J,b.indicator));else return X[Se]&&(me(w.session.__operators[X[Se].priority][J.id],F.id),w.session.__operators[X[Se].priority][J.id].length===0&&delete w.session.__operators[X[Se].priority][J.id]),y.value>0&&(w.session.__operators[y.value]||(w.session.__operators[y.value.toString()]={}),w.session.__operators[y.value][J.id]||(w.session.__operators[y.value][J.id]=[]),w.session.__operators[y.value][J.id].push(F.id)),!0}}},predicate:{\"op/3\":function(w,b,y){S.directive[\"op/3\"](w,y)&&w.success(b)},\"current_op/3\":function(w,b,y){var F=y.args[0],J=y.args[1],X=y.args[2],$=[];for(var ie in w.session.__operators)for(var Se in w.session.__operators[ie])for(var Re=0;Re<w.session.__operators[ie][Se].length;Re++)$.push(new ke(b.goal.replace(new H(\",\",[new H(\"=\",[new Ne(ie,!1),F]),new H(\",\",[new H(\"=\",[new H(w.session.__operators[ie][Se][Re],[]),J]),new H(\"=\",[new H(Se,[]),X])])])),b.substitution,b));w.prepend($)},\";/2\":function(w,b,y){if(S.type.is_term(y.args[0])&&y.args[0].indicator===\"->/2\"){var F=w.points,J=w.session.format_success,X=w.session.format_error;w.session.format_success=function(Re){return Re.substitution},w.session.format_error=function(Re){return Re.goal},w.points=[new ke(y.args[0].args[0],b.substitution,b)];var $=function(Re){w.points=F,w.session.format_success=J,w.session.format_error=X,Re===!1?w.prepend([new ke(b.goal.replace(y.args[1]),b.substitution,b)]):S.type.is_error(Re)?w.throw_error(Re.args[0]):Re===null?(w.prepend([b]),w.__calls.shift()(null)):w.prepend([new ke(b.goal.replace(y.args[0].args[1]).apply(Re),b.substitution.apply(Re),b)])};w.__calls.unshift($)}else{var ie=new ke(b.goal.replace(y.args[0]),b.substitution,b),Se=new ke(b.goal.replace(y.args[1]),b.substitution,b);w.prepend([ie,Se])}},\"!/0\":function(w,b,y){var F,J,X=[];for(F=b,J=null;F.parent!==null&&F.parent.goal.search(y);)if(J=F,F=F.parent,F.goal!==null){var $=F.goal.select();if($&&$.id===\"call\"&&$.search(y)){F=J;break}}for(var ie=w.points.length-1;ie>=0;ie--){for(var Se=w.points[ie],Re=Se.parent;Re!==null&&Re!==F.parent;)Re=Re.parent;Re===null&&Re!==F.parent&&X.push(Se)}w.points=X.reverse(),w.success(b)},\"\\\\+/1\":function(w,b,y){var F=y.args[0];S.type.is_variable(F)?w.throw_error(S.error.instantiation(w.level)):S.type.is_callable(F)?w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\",\",[new H(\"call\",[F]),new H(\"!\",[])]),new H(\"fail\",[])])),b.substitution,b),new ke(b.goal.replace(null),b.substitution,b)]):w.throw_error(S.error.type(\"callable\",F,w.level))},\"->/2\":function(w,b,y){var F=b.goal.replace(new H(\",\",[y.args[0],new H(\",\",[new H(\"!\"),y.args[1]])]));w.prepend([new ke(F,b.substitution,b)])},\"fail/0\":function(w,b,y){},\"false/0\":function(w,b,y){},\"true/0\":function(w,b,y){w.success(b)},\"call/1\":ne(1),\"call/2\":ne(2),\"call/3\":ne(3),\"call/4\":ne(4),\"call/5\":ne(5),\"call/6\":ne(6),\"call/7\":ne(7),\"call/8\":ne(8),\"once/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"call\",[F]),new H(\"!\",[])])),b.substitution,b)])},\"forall/2\":function(w,b,y){var F=y.args[0],J=y.args[1];w.prepend([new ke(b.goal.replace(new H(\"\\\\+\",[new H(\",\",[new H(\"call\",[F]),new H(\"\\\\+\",[new H(\"call\",[J])])])])),b.substitution,b)])},\"repeat/0\":function(w,b,y){w.prepend([new ke(b.goal.replace(null),b.substitution,b),b])},\"throw/1\":function(w,b,y){S.type.is_variable(y.args[0])?w.throw_error(S.error.instantiation(w.level)):w.throw_error(y.args[0])},\"catch/3\":function(w,b,y){var F=w.points;w.points=[],w.prepend([new ke(y.args[0],b.substitution,b)]);var J=w.session.format_success,X=w.session.format_error;w.session.format_success=function(ie){return ie.substitution},w.session.format_error=function(ie){return ie.goal};var $=function(ie){var Se=w.points;if(w.points=F,w.session.format_success=J,w.session.format_error=X,S.type.is_error(ie)){for(var Re=[],at=w.points.length-1;at>=0;at--){for(var tr=w.points[at],dt=tr.parent;dt!==null&&dt!==b.parent;)dt=dt.parent;dt===null&&dt!==b.parent&&Re.push(tr)}w.points=Re;var jt=w.get_flag(\"occurs_check\").indicator===\"true/0\",tr=new ke,bt=S.unify(ie.args[0],y.args[1],jt);bt!==null?(tr.substitution=b.substitution.apply(bt),tr.goal=b.goal.replace(y.args[2]).apply(bt),tr.parent=b,w.prepend([tr])):w.throw_error(ie.args[0])}else if(ie!==!1){for(var ln=ie===null?[]:[new ke(b.goal.apply(ie).replace(null),b.substitution.apply(ie),b)],kr=[],at=Se.length-1;at>=0;at--){kr.push(Se[at]);var mr=Se[at].goal!==null?Se[at].goal.select():null;if(S.type.is_term(mr)&&mr.indicator===\"!/0\")break}var Sr=o(kr,function(Kr){return Kr.goal===null&&(Kr.goal=new H(\"true\",[])),Kr=new ke(b.goal.replace(new H(\"catch\",[Kr.goal,y.args[1],y.args[2]])),b.substitution.apply(Kr.substitution),Kr.parent),Kr.exclude=y.args[0].variables(),Kr}).reverse();w.prepend(Sr),w.prepend(ln),ie===null&&(this.current_limit=0,w.__calls.shift()(null))}};w.__calls.unshift($)},\"=/2\":function(w,b,y){var F=w.get_flag(\"occurs_check\").indicator===\"true/0\",J=new ke,X=S.unify(y.args[0],y.args[1],F);X!==null&&(J.goal=b.goal.apply(X).replace(null),J.substitution=b.substitution.apply(X),J.parent=b,w.prepend([J]))},\"unify_with_occurs_check/2\":function(w,b,y){var F=new ke,J=S.unify(y.args[0],y.args[1],!0);J!==null&&(F.goal=b.goal.apply(J).replace(null),F.substitution=b.substitution.apply(J),F.parent=b,w.prepend([F]))},\"\\\\=/2\":function(w,b,y){var F=w.get_flag(\"occurs_check\").indicator===\"true/0\",J=S.unify(y.args[0],y.args[1],F);J===null&&w.success(b)},\"subsumes_term/2\":function(w,b,y){var F=w.get_flag(\"occurs_check\").indicator===\"true/0\",J=S.unify(y.args[1],y.args[0],F);J!==null&&y.args[1].apply(J).equals(y.args[1])&&w.success(b)},\"findall/3\":function(w,b,y){var F=y.args[0],J=y.args[1],X=y.args[2];if(S.type.is_variable(J))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_callable(J))w.throw_error(S.error.type(\"callable\",J,y.indicator));else if(!S.type.is_variable(X)&&!S.type.is_list(X))w.throw_error(S.error.type(\"list\",X,y.indicator));else{var $=w.next_free_variable(),ie=new H(\",\",[J,new H(\"=\",[$,F])]),Se=w.points,Re=w.session.limit,at=w.session.format_success;w.session.format_success=function(tr){return tr.substitution},w.add_goal(ie,!0,b);var dt=[],jt=function(tr){if(tr!==!1&&tr!==null&&!S.type.is_error(tr))w.__calls.unshift(jt),dt.push(tr.links[$.id]),w.session.limit=w.current_limit;else if(w.points=Se,w.session.limit=Re,w.session.format_success=at,S.type.is_error(tr))w.throw_error(tr.args[0]);else if(w.current_limit>0){for(var bt=new H(\"[]\"),ln=dt.length-1;ln>=0;ln--)bt=new H(\".\",[dt[ln],bt]);w.prepend([new ke(b.goal.replace(new H(\"=\",[X,bt])),b.substitution,b)])}};w.__calls.unshift(jt)}},\"bagof/3\":function(w,b,y){var F,J=y.args[0],X=y.args[1],$=y.args[2];if(S.type.is_variable(X))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_callable(X))w.throw_error(S.error.type(\"callable\",X,y.indicator));else if(!S.type.is_variable($)&&!S.type.is_list($))w.throw_error(S.error.type(\"list\",$,y.indicator));else{var ie=w.next_free_variable(),Se;X.indicator===\"^/2\"?(Se=X.args[0].variables(),X=X.args[1]):Se=[],Se=Se.concat(J.variables());for(var Re=X.variables().filter(function(Sr){return e(Se,Sr)===-1}),at=new H(\"[]\"),dt=Re.length-1;dt>=0;dt--)at=new H(\".\",[new xe(Re[dt]),at]);var jt=new H(\",\",[X,new H(\"=\",[ie,new H(\",\",[at,J])])]),tr=w.points,bt=w.session.limit,ln=w.session.format_success;w.session.format_success=function(Sr){return Sr.substitution},w.add_goal(jt,!0,b);var kr=[],mr=function(Sr){if(Sr!==!1&&Sr!==null&&!S.type.is_error(Sr)){w.__calls.unshift(mr);var Kr=!1,Kn=Sr.links[ie.id].args[0],Ms=Sr.links[ie.id].args[1];for(var Ri in kr)if(kr.hasOwnProperty(Ri)){var gs=kr[Ri];if(gs.variables.equals(Kn)){gs.answers.push(Ms),Kr=!0;break}}Kr||kr.push({variables:Kn,answers:[Ms]}),w.session.limit=w.current_limit}else if(w.points=tr,w.session.limit=bt,w.session.format_success=ln,S.type.is_error(Sr))w.throw_error(Sr.args[0]);else if(w.current_limit>0){for(var io=[],Pi=0;Pi<kr.length;Pi++){Sr=kr[Pi].answers;for(var Os=new H(\"[]\"),so=Sr.length-1;so>=0;so--)Os=new H(\".\",[Sr[so],Os]);io.push(new ke(b.goal.replace(new H(\",\",[new H(\"=\",[at,kr[Pi].variables]),new H(\"=\",[$,Os])])),b.substitution,b))}w.prepend(io)}};w.__calls.unshift(mr)}},\"setof/3\":function(w,b,y){var F,J=y.args[0],X=y.args[1],$=y.args[2];if(S.type.is_variable(X))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_callable(X))w.throw_error(S.error.type(\"callable\",X,y.indicator));else if(!S.type.is_variable($)&&!S.type.is_list($))w.throw_error(S.error.type(\"list\",$,y.indicator));else{var ie=w.next_free_variable(),Se;X.indicator===\"^/2\"?(Se=X.args[0].variables(),X=X.args[1]):Se=[],Se=Se.concat(J.variables());for(var Re=X.variables().filter(function(Sr){return e(Se,Sr)===-1}),at=new H(\"[]\"),dt=Re.length-1;dt>=0;dt--)at=new H(\".\",[new xe(Re[dt]),at]);var jt=new H(\",\",[X,new H(\"=\",[ie,new H(\",\",[at,J])])]),tr=w.points,bt=w.session.limit,ln=w.session.format_success;w.session.format_success=function(Sr){return Sr.substitution},w.add_goal(jt,!0,b);var kr=[],mr=function(Sr){if(Sr!==!1&&Sr!==null&&!S.type.is_error(Sr)){w.__calls.unshift(mr);var Kr=!1,Kn=Sr.links[ie.id].args[0],Ms=Sr.links[ie.id].args[1];for(var Ri in kr)if(kr.hasOwnProperty(Ri)){var gs=kr[Ri];if(gs.variables.equals(Kn)){gs.answers.push(Ms),Kr=!0;break}}Kr||kr.push({variables:Kn,answers:[Ms]}),w.session.limit=w.current_limit}else if(w.points=tr,w.session.limit=bt,w.session.format_success=ln,S.type.is_error(Sr))w.throw_error(Sr.args[0]);else if(w.current_limit>0){for(var io=[],Pi=0;Pi<kr.length;Pi++){Sr=kr[Pi].answers.sort(S.compare);for(var Os=new H(\"[]\"),so=Sr.length-1;so>=0;so--)Os=new H(\".\",[Sr[so],Os]);io.push(new ke(b.goal.replace(new H(\",\",[new H(\"=\",[at,kr[Pi].variables]),new H(\"=\",[$,Os])])),b.substitution,b))}w.prepend(io)}};w.__calls.unshift(mr)}},\"functor/3\":function(w,b,y){var F,J=y.args[0],X=y.args[1],$=y.args[2];if(S.type.is_variable(J)&&(S.type.is_variable(X)||S.type.is_variable($)))w.throw_error(S.error.instantiation(\"functor/3\"));else if(!S.type.is_variable($)&&!S.type.is_integer($))w.throw_error(S.error.type(\"integer\",y.args[2],\"functor/3\"));else if(!S.type.is_variable(X)&&!S.type.is_atomic(X))w.throw_error(S.error.type(\"atomic\",y.args[1],\"functor/3\"));else if(S.type.is_integer(X)&&S.type.is_integer($)&&$.value!==0)w.throw_error(S.error.type(\"atom\",y.args[1],\"functor/3\"));else if(S.type.is_variable(J)){if(y.args[2].value>=0){for(var ie=[],Se=0;Se<$.value;Se++)ie.push(w.next_free_variable());var Re=S.type.is_integer(X)?X:new H(X.id,ie);w.prepend([new ke(b.goal.replace(new H(\"=\",[J,Re])),b.substitution,b)])}}else{var at=S.type.is_integer(J)?J:new H(J.id,[]),dt=S.type.is_integer(J)?new Ne(0,!1):new Ne(J.args.length,!1),jt=new H(\",\",[new H(\"=\",[at,X]),new H(\"=\",[dt,$])]);w.prepend([new ke(b.goal.replace(jt),b.substitution,b)])}},\"arg/3\":function(w,b,y){if(S.type.is_variable(y.args[0])||S.type.is_variable(y.args[1]))w.throw_error(S.error.instantiation(y.indicator));else if(y.args[0].value<0)w.throw_error(S.error.domain(\"not_less_than_zero\",y.args[0],y.indicator));else if(!S.type.is_compound(y.args[1]))w.throw_error(S.error.type(\"compound\",y.args[1],y.indicator));else{var F=y.args[0].value;if(F>0&&F<=y.args[1].args.length){var J=new H(\"=\",[y.args[1].args[F-1],y.args[2]]);w.prepend([new ke(b.goal.replace(J),b.substitution,b)])}}},\"=../2\":function(w,b,y){var F;if(S.type.is_variable(y.args[0])&&(S.type.is_variable(y.args[1])||S.type.is_non_empty_list(y.args[1])&&S.type.is_variable(y.args[1].args[0])))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_fully_list(y.args[1]))w.throw_error(S.error.type(\"list\",y.args[1],y.indicator));else if(S.type.is_variable(y.args[0])){if(!S.type.is_variable(y.args[1])){var X=[];for(F=y.args[1].args[1];F.indicator===\"./2\";)X.push(F.args[0]),F=F.args[1];S.type.is_variable(y.args[0])&&S.type.is_variable(F)?w.throw_error(S.error.instantiation(y.indicator)):X.length===0&&S.type.is_compound(y.args[1].args[0])?w.throw_error(S.error.type(\"atomic\",y.args[1].args[0],y.indicator)):X.length>0&&(S.type.is_compound(y.args[1].args[0])||S.type.is_number(y.args[1].args[0]))?w.throw_error(S.error.type(\"atom\",y.args[1].args[0],y.indicator)):X.length===0?w.prepend([new ke(b.goal.replace(new H(\"=\",[y.args[1].args[0],y.args[0]],b)),b.substitution,b)]):w.prepend([new ke(b.goal.replace(new H(\"=\",[new H(y.args[1].args[0].id,X),y.args[0]])),b.substitution,b)])}}else{if(S.type.is_atomic(y.args[0]))F=new H(\".\",[y.args[0],new H(\"[]\")]);else{F=new H(\"[]\");for(var J=y.args[0].args.length-1;J>=0;J--)F=new H(\".\",[y.args[0].args[J],F]);F=new H(\".\",[new H(y.args[0].id),F])}w.prepend([new ke(b.goal.replace(new H(\"=\",[F,y.args[1]])),b.substitution,b)])}},\"copy_term/2\":function(w,b,y){var F=y.args[0].rename(w);w.prepend([new ke(b.goal.replace(new H(\"=\",[F,y.args[1]])),b.substitution,b.parent)])},\"term_variables/2\":function(w,b,y){var F=y.args[0],J=y.args[1];if(!S.type.is_fully_list(J))w.throw_error(S.error.type(\"list\",J,y.indicator));else{var X=g(o(we(F.variables()),function($){return new xe($)}));w.prepend([new ke(b.goal.replace(new H(\"=\",[J,X])),b.substitution,b)])}},\"clause/2\":function(w,b,y){if(S.type.is_variable(y.args[0]))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_callable(y.args[0]))w.throw_error(S.error.type(\"callable\",y.args[0],y.indicator));else if(!S.type.is_variable(y.args[1])&&!S.type.is_callable(y.args[1]))w.throw_error(S.error.type(\"callable\",y.args[1],y.indicator));else if(w.session.rules[y.args[0].indicator]!==void 0)if(w.is_public_predicate(y.args[0].indicator)){var F=[];for(var J in w.session.rules[y.args[0].indicator])if(w.session.rules[y.args[0].indicator].hasOwnProperty(J)){var X=w.session.rules[y.args[0].indicator][J];w.session.renamed_variables={},X=X.rename(w),X.body===null&&(X.body=new H(\"true\"));var $=new H(\",\",[new H(\"=\",[X.head,y.args[0]]),new H(\"=\",[X.body,y.args[1]])]);F.push(new ke(b.goal.replace($),b.substitution,b))}w.prepend(F)}else w.throw_error(S.error.permission(\"access\",\"private_procedure\",y.args[0].indicator,y.indicator))},\"current_predicate/1\":function(w,b,y){var F=y.args[0];if(!S.type.is_variable(F)&&(!S.type.is_compound(F)||F.indicator!==\"//2\"))w.throw_error(S.error.type(\"predicate_indicator\",F,y.indicator));else if(!S.type.is_variable(F)&&!S.type.is_variable(F.args[0])&&!S.type.is_atom(F.args[0]))w.throw_error(S.error.type(\"atom\",F.args[0],y.indicator));else if(!S.type.is_variable(F)&&!S.type.is_variable(F.args[1])&&!S.type.is_integer(F.args[1]))w.throw_error(S.error.type(\"integer\",F.args[1],y.indicator));else{var J=[];for(var X in w.session.rules)if(w.session.rules.hasOwnProperty(X)){var $=X.lastIndexOf(\"/\"),ie=X.substr(0,$),Se=parseInt(X.substr($+1,X.length-($+1))),Re=new H(\"/\",[new H(ie),new Ne(Se,!1)]),at=new H(\"=\",[Re,F]);J.push(new ke(b.goal.replace(at),b.substitution,b))}w.prepend(J)}},\"asserta/1\":function(w,b,y){if(S.type.is_variable(y.args[0]))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_callable(y.args[0]))w.throw_error(S.error.type(\"callable\",y.args[0],y.indicator));else{var F,J;y.args[0].indicator===\":-/2\"?(F=y.args[0].args[0],J=Ee(y.args[0].args[1])):(F=y.args[0],J=null),S.type.is_callable(F)?J!==null&&!S.type.is_callable(J)?w.throw_error(S.error.type(\"callable\",J,y.indicator)):w.is_public_predicate(F.indicator)?(w.session.rules[F.indicator]===void 0&&(w.session.rules[F.indicator]=[]),w.session.public_predicates[F.indicator]=!0,w.session.rules[F.indicator]=[new Ye(F,J,!0)].concat(w.session.rules[F.indicator]),w.success(b)):w.throw_error(S.error.permission(\"modify\",\"static_procedure\",F.indicator,y.indicator)):w.throw_error(S.error.type(\"callable\",F,y.indicator))}},\"assertz/1\":function(w,b,y){if(S.type.is_variable(y.args[0]))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_callable(y.args[0]))w.throw_error(S.error.type(\"callable\",y.args[0],y.indicator));else{var F,J;y.args[0].indicator===\":-/2\"?(F=y.args[0].args[0],J=Ee(y.args[0].args[1])):(F=y.args[0],J=null),S.type.is_callable(F)?J!==null&&!S.type.is_callable(J)?w.throw_error(S.error.type(\"callable\",J,y.indicator)):w.is_public_predicate(F.indicator)?(w.session.rules[F.indicator]===void 0&&(w.session.rules[F.indicator]=[]),w.session.public_predicates[F.indicator]=!0,w.session.rules[F.indicator].push(new Ye(F,J,!0)),w.success(b)):w.throw_error(S.error.permission(\"modify\",\"static_procedure\",F.indicator,y.indicator)):w.throw_error(S.error.type(\"callable\",F,y.indicator))}},\"retract/1\":function(w,b,y){if(S.type.is_variable(y.args[0]))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_callable(y.args[0]))w.throw_error(S.error.type(\"callable\",y.args[0],y.indicator));else{var F,J;if(y.args[0].indicator===\":-/2\"?(F=y.args[0].args[0],J=y.args[0].args[1]):(F=y.args[0],J=new H(\"true\")),typeof b.retract>\"u\")if(w.is_public_predicate(F.indicator)){if(w.session.rules[F.indicator]!==void 0){for(var X=[],$=0;$<w.session.rules[F.indicator].length;$++){w.session.renamed_variables={};var ie=w.session.rules[F.indicator][$],Se=ie.rename(w);Se.body===null&&(Se.body=new H(\"true\",[]));var Re=w.get_flag(\"occurs_check\").indicator===\"true/0\",at=S.unify(new H(\",\",[F,J]),new H(\",\",[Se.head,Se.body]),Re);if(at!==null){var dt=new ke(b.goal.replace(new H(\",\",[new H(\"retract\",[new H(\":-\",[F,J])]),new H(\",\",[new H(\"=\",[F,Se.head]),new H(\"=\",[J,Se.body])])])),b.substitution,b);dt.retract=ie,X.push(dt)}}w.prepend(X)}}else w.throw_error(S.error.permission(\"modify\",\"static_procedure\",F.indicator,y.indicator));else Ae(w,b,F.indicator,b.retract)}},\"retractall/1\":function(w,b,y){var F=y.args[0];S.type.is_variable(F)?w.throw_error(S.error.instantiation(y.indicator)):S.type.is_callable(F)?w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"retract\",[new S.type.Term(\":-\",[F,new xe(\"_\")])]),new H(\"fail\",[])])),b.substitution,b),new ke(b.goal.replace(null),b.substitution,b)]):w.throw_error(S.error.type(\"callable\",F,y.indicator))},\"abolish/1\":function(w,b,y){if(S.type.is_variable(y.args[0])||S.type.is_term(y.args[0])&&y.args[0].indicator===\"//2\"&&(S.type.is_variable(y.args[0].args[0])||S.type.is_variable(y.args[0].args[1])))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_term(y.args[0])||y.args[0].indicator!==\"//2\")w.throw_error(S.error.type(\"predicate_indicator\",y.args[0],y.indicator));else if(!S.type.is_atom(y.args[0].args[0]))w.throw_error(S.error.type(\"atom\",y.args[0].args[0],y.indicator));else if(!S.type.is_integer(y.args[0].args[1]))w.throw_error(S.error.type(\"integer\",y.args[0].args[1],y.indicator));else if(y.args[0].args[1].value<0)w.throw_error(S.error.domain(\"not_less_than_zero\",y.args[0].args[1],y.indicator));else if(S.type.is_number(w.get_flag(\"max_arity\"))&&y.args[0].args[1].value>w.get_flag(\"max_arity\").value)w.throw_error(S.error.representation(\"max_arity\",y.indicator));else{var F=y.args[0].args[0].id+\"/\"+y.args[0].args[1].value;w.is_public_predicate(F)?(delete w.session.rules[F],w.success(b)):w.throw_error(S.error.permission(\"modify\",\"static_procedure\",F,y.indicator))}},\"atom_length/2\":function(w,b,y){if(S.type.is_variable(y.args[0]))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_atom(y.args[0]))w.throw_error(S.error.type(\"atom\",y.args[0],y.indicator));else if(!S.type.is_variable(y.args[1])&&!S.type.is_integer(y.args[1]))w.throw_error(S.error.type(\"integer\",y.args[1],y.indicator));else if(S.type.is_integer(y.args[1])&&y.args[1].value<0)w.throw_error(S.error.domain(\"not_less_than_zero\",y.args[1],y.indicator));else{var F=new Ne(y.args[0].id.length,!1);w.prepend([new ke(b.goal.replace(new H(\"=\",[F,y.args[1]])),b.substitution,b)])}},\"atom_concat/3\":function(w,b,y){var F,J,X=y.args[0],$=y.args[1],ie=y.args[2];if(S.type.is_variable(ie)&&(S.type.is_variable(X)||S.type.is_variable($)))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(X)&&!S.type.is_atom(X))w.throw_error(S.error.type(\"atom\",X,y.indicator));else if(!S.type.is_variable($)&&!S.type.is_atom($))w.throw_error(S.error.type(\"atom\",$,y.indicator));else if(!S.type.is_variable(ie)&&!S.type.is_atom(ie))w.throw_error(S.error.type(\"atom\",ie,y.indicator));else{var Se=S.type.is_variable(X),Re=S.type.is_variable($);if(!Se&&!Re)J=new H(\"=\",[ie,new H(X.id+$.id)]),w.prepend([new ke(b.goal.replace(J),b.substitution,b)]);else if(Se&&!Re)F=ie.id.substr(0,ie.id.length-$.id.length),F+$.id===ie.id&&(J=new H(\"=\",[X,new H(F)]),w.prepend([new ke(b.goal.replace(J),b.substitution,b)]));else if(Re&&!Se)F=ie.id.substr(X.id.length),X.id+F===ie.id&&(J=new H(\"=\",[$,new H(F)]),w.prepend([new ke(b.goal.replace(J),b.substitution,b)]));else{for(var at=[],dt=0;dt<=ie.id.length;dt++){var jt=new H(ie.id.substr(0,dt)),tr=new H(ie.id.substr(dt));J=new H(\",\",[new H(\"=\",[jt,X]),new H(\"=\",[tr,$])]),at.push(new ke(b.goal.replace(J),b.substitution,b))}w.prepend(at)}}},\"sub_atom/5\":function(w,b,y){var F,J=y.args[0],X=y.args[1],$=y.args[2],ie=y.args[3],Se=y.args[4];if(S.type.is_variable(J))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(X)&&!S.type.is_integer(X))w.throw_error(S.error.type(\"integer\",X,y.indicator));else if(!S.type.is_variable($)&&!S.type.is_integer($))w.throw_error(S.error.type(\"integer\",$,y.indicator));else if(!S.type.is_variable(ie)&&!S.type.is_integer(ie))w.throw_error(S.error.type(\"integer\",ie,y.indicator));else if(S.type.is_integer(X)&&X.value<0)w.throw_error(S.error.domain(\"not_less_than_zero\",X,y.indicator));else if(S.type.is_integer($)&&$.value<0)w.throw_error(S.error.domain(\"not_less_than_zero\",$,y.indicator));else if(S.type.is_integer(ie)&&ie.value<0)w.throw_error(S.error.domain(\"not_less_than_zero\",ie,y.indicator));else{var Re=[],at=[],dt=[];if(S.type.is_variable(X))for(F=0;F<=J.id.length;F++)Re.push(F);else Re.push(X.value);if(S.type.is_variable($))for(F=0;F<=J.id.length;F++)at.push(F);else at.push($.value);if(S.type.is_variable(ie))for(F=0;F<=J.id.length;F++)dt.push(F);else dt.push(ie.value);var jt=[];for(var tr in Re)if(Re.hasOwnProperty(tr)){F=Re[tr];for(var bt in at)if(at.hasOwnProperty(bt)){var ln=at[bt],kr=J.id.length-F-ln;if(e(dt,kr)!==-1&&F+ln+kr===J.id.length){var mr=J.id.substr(F,ln);if(J.id===J.id.substr(0,F)+mr+J.id.substr(F+ln,kr)){var Sr=new H(\"=\",[new H(mr),Se]),Kr=new H(\"=\",[X,new Ne(F)]),Kn=new H(\"=\",[$,new Ne(ln)]),Ms=new H(\"=\",[ie,new Ne(kr)]),Ri=new H(\",\",[new H(\",\",[new H(\",\",[Kr,Kn]),Ms]),Sr]);jt.push(new ke(b.goal.replace(Ri),b.substitution,b))}}}}w.prepend(jt)}},\"atom_chars/2\":function(w,b,y){var F=y.args[0],J=y.args[1];if(S.type.is_variable(F)&&S.type.is_variable(J))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(F)&&!S.type.is_atom(F))w.throw_error(S.error.type(\"atom\",F,y.indicator));else if(S.type.is_variable(F)){for(var ie=J,Se=S.type.is_variable(F),Re=\"\";ie.indicator===\"./2\";){if(S.type.is_character(ie.args[0]))Re+=ie.args[0].id;else if(S.type.is_variable(ie.args[0])&&Se){w.throw_error(S.error.instantiation(y.indicator));return}else if(!S.type.is_variable(ie.args[0])){w.throw_error(S.error.type(\"character\",ie.args[0],y.indicator));return}ie=ie.args[1]}S.type.is_variable(ie)&&Se?w.throw_error(S.error.instantiation(y.indicator)):!S.type.is_empty_list(ie)&&!S.type.is_variable(ie)?w.throw_error(S.error.type(\"list\",J,y.indicator)):w.prepend([new ke(b.goal.replace(new H(\"=\",[new H(Re),F])),b.substitution,b)])}else{for(var X=new H(\"[]\"),$=F.id.length-1;$>=0;$--)X=new H(\".\",[new H(F.id.charAt($)),X]);w.prepend([new ke(b.goal.replace(new H(\"=\",[J,X])),b.substitution,b)])}},\"atom_codes/2\":function(w,b,y){var F=y.args[0],J=y.args[1];if(S.type.is_variable(F)&&S.type.is_variable(J))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(F)&&!S.type.is_atom(F))w.throw_error(S.error.type(\"atom\",F,y.indicator));else if(S.type.is_variable(F)){for(var ie=J,Se=S.type.is_variable(F),Re=\"\";ie.indicator===\"./2\";){if(S.type.is_character_code(ie.args[0]))Re+=u(ie.args[0].value);else if(S.type.is_variable(ie.args[0])&&Se){w.throw_error(S.error.instantiation(y.indicator));return}else if(!S.type.is_variable(ie.args[0])){w.throw_error(S.error.representation(\"character_code\",y.indicator));return}ie=ie.args[1]}S.type.is_variable(ie)&&Se?w.throw_error(S.error.instantiation(y.indicator)):!S.type.is_empty_list(ie)&&!S.type.is_variable(ie)?w.throw_error(S.error.type(\"list\",J,y.indicator)):w.prepend([new ke(b.goal.replace(new H(\"=\",[new H(Re),F])),b.substitution,b)])}else{for(var X=new H(\"[]\"),$=F.id.length-1;$>=0;$--)X=new H(\".\",[new Ne(n(F.id,$),!1),X]);w.prepend([new ke(b.goal.replace(new H(\"=\",[J,X])),b.substitution,b)])}},\"char_code/2\":function(w,b,y){var F=y.args[0],J=y.args[1];if(S.type.is_variable(F)&&S.type.is_variable(J))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(F)&&!S.type.is_character(F))w.throw_error(S.error.type(\"character\",F,y.indicator));else if(!S.type.is_variable(J)&&!S.type.is_integer(J))w.throw_error(S.error.type(\"integer\",J,y.indicator));else if(!S.type.is_variable(J)&&!S.type.is_character_code(J))w.throw_error(S.error.representation(\"character_code\",y.indicator));else if(S.type.is_variable(J)){var X=new Ne(n(F.id,0),!1);w.prepend([new ke(b.goal.replace(new H(\"=\",[X,J])),b.substitution,b)])}else{var $=new H(u(J.value));w.prepend([new ke(b.goal.replace(new H(\"=\",[$,F])),b.substitution,b)])}},\"number_chars/2\":function(w,b,y){var F,J=y.args[0],X=y.args[1];if(S.type.is_variable(J)&&S.type.is_variable(X))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(J)&&!S.type.is_number(J))w.throw_error(S.error.type(\"number\",J,y.indicator));else if(!S.type.is_variable(X)&&!S.type.is_list(X))w.throw_error(S.error.type(\"list\",X,y.indicator));else{var $=S.type.is_variable(J);if(!S.type.is_variable(X)){var ie=X,Se=!0;for(F=\"\";ie.indicator===\"./2\";){if(S.type.is_character(ie.args[0]))F+=ie.args[0].id;else if(S.type.is_variable(ie.args[0]))Se=!1;else if(!S.type.is_variable(ie.args[0])){w.throw_error(S.error.type(\"character\",ie.args[0],y.indicator));return}ie=ie.args[1]}if(Se=Se&&S.type.is_empty_list(ie),!S.type.is_empty_list(ie)&&!S.type.is_variable(ie)){w.throw_error(S.error.type(\"list\",X,y.indicator));return}if(!Se&&$){w.throw_error(S.error.instantiation(y.indicator));return}else if(Se)if(S.type.is_variable(ie)&&$){w.throw_error(S.error.instantiation(y.indicator));return}else{var Re=w.parse(F),at=Re.value;!S.type.is_number(at)||Re.tokens[Re.tokens.length-1].space?w.throw_error(S.error.syntax_by_predicate(\"parseable_number\",y.indicator)):w.prepend([new ke(b.goal.replace(new H(\"=\",[J,at])),b.substitution,b)]);return}}if(!$){F=J.toString();for(var dt=new H(\"[]\"),jt=F.length-1;jt>=0;jt--)dt=new H(\".\",[new H(F.charAt(jt)),dt]);w.prepend([new ke(b.goal.replace(new H(\"=\",[X,dt])),b.substitution,b)])}}},\"number_codes/2\":function(w,b,y){var F,J=y.args[0],X=y.args[1];if(S.type.is_variable(J)&&S.type.is_variable(X))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(J)&&!S.type.is_number(J))w.throw_error(S.error.type(\"number\",J,y.indicator));else if(!S.type.is_variable(X)&&!S.type.is_list(X))w.throw_error(S.error.type(\"list\",X,y.indicator));else{var $=S.type.is_variable(J);if(!S.type.is_variable(X)){var ie=X,Se=!0;for(F=\"\";ie.indicator===\"./2\";){if(S.type.is_character_code(ie.args[0]))F+=u(ie.args[0].value);else if(S.type.is_variable(ie.args[0]))Se=!1;else if(!S.type.is_variable(ie.args[0])){w.throw_error(S.error.type(\"character_code\",ie.args[0],y.indicator));return}ie=ie.args[1]}if(Se=Se&&S.type.is_empty_list(ie),!S.type.is_empty_list(ie)&&!S.type.is_variable(ie)){w.throw_error(S.error.type(\"list\",X,y.indicator));return}if(!Se&&$){w.throw_error(S.error.instantiation(y.indicator));return}else if(Se)if(S.type.is_variable(ie)&&$){w.throw_error(S.error.instantiation(y.indicator));return}else{var Re=w.parse(F),at=Re.value;!S.type.is_number(at)||Re.tokens[Re.tokens.length-1].space?w.throw_error(S.error.syntax_by_predicate(\"parseable_number\",y.indicator)):w.prepend([new ke(b.goal.replace(new H(\"=\",[J,at])),b.substitution,b)]);return}}if(!$){F=J.toString();for(var dt=new H(\"[]\"),jt=F.length-1;jt>=0;jt--)dt=new H(\".\",[new Ne(n(F,jt),!1),dt]);w.prepend([new ke(b.goal.replace(new H(\"=\",[X,dt])),b.substitution,b)])}}},\"upcase_atom/2\":function(w,b,y){var F=y.args[0],J=y.args[1];S.type.is_variable(F)?w.throw_error(S.error.instantiation(y.indicator)):S.type.is_atom(F)?!S.type.is_variable(J)&&!S.type.is_atom(J)?w.throw_error(S.error.type(\"atom\",J,y.indicator)):w.prepend([new ke(b.goal.replace(new H(\"=\",[J,new H(F.id.toUpperCase(),[])])),b.substitution,b)]):w.throw_error(S.error.type(\"atom\",F,y.indicator))},\"downcase_atom/2\":function(w,b,y){var F=y.args[0],J=y.args[1];S.type.is_variable(F)?w.throw_error(S.error.instantiation(y.indicator)):S.type.is_atom(F)?!S.type.is_variable(J)&&!S.type.is_atom(J)?w.throw_error(S.error.type(\"atom\",J,y.indicator)):w.prepend([new ke(b.goal.replace(new H(\"=\",[J,new H(F.id.toLowerCase(),[])])),b.substitution,b)]):w.throw_error(S.error.type(\"atom\",F,y.indicator))},\"atomic_list_concat/2\":function(w,b,y){var F=y.args[0],J=y.args[1];w.prepend([new ke(b.goal.replace(new H(\"atomic_list_concat\",[F,new H(\"\",[]),J])),b.substitution,b)])},\"atomic_list_concat/3\":function(w,b,y){var F=y.args[0],J=y.args[1],X=y.args[2];if(S.type.is_variable(J)||S.type.is_variable(F)&&S.type.is_variable(X))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(F)&&!S.type.is_list(F))w.throw_error(S.error.type(\"list\",F,y.indicator));else if(!S.type.is_variable(X)&&!S.type.is_atom(X))w.throw_error(S.error.type(\"atom\",X,y.indicator));else if(S.type.is_variable(X)){for(var ie=\"\",Se=F;S.type.is_term(Se)&&Se.indicator===\"./2\";){if(!S.type.is_atom(Se.args[0])&&!S.type.is_number(Se.args[0])){w.throw_error(S.error.type(\"atomic\",Se.args[0],y.indicator));return}ie!==\"\"&&(ie+=J.id),S.type.is_atom(Se.args[0])?ie+=Se.args[0].id:ie+=\"\"+Se.args[0].value,Se=Se.args[1]}ie=new H(ie,[]),S.type.is_variable(Se)?w.throw_error(S.error.instantiation(y.indicator)):!S.type.is_term(Se)||Se.indicator!==\"[]/0\"?w.throw_error(S.error.type(\"list\",F,y.indicator)):w.prepend([new ke(b.goal.replace(new H(\"=\",[ie,X])),b.substitution,b)])}else{var $=g(o(X.id.split(J.id),function(Re){return new H(Re,[])}));w.prepend([new ke(b.goal.replace(new H(\"=\",[$,F])),b.substitution,b)])}},\"@=</2\":function(w,b,y){S.compare(y.args[0],y.args[1])<=0&&w.success(b)},\"==/2\":function(w,b,y){S.compare(y.args[0],y.args[1])===0&&w.success(b)},\"\\\\==/2\":function(w,b,y){S.compare(y.args[0],y.args[1])!==0&&w.success(b)},\"@</2\":function(w,b,y){S.compare(y.args[0],y.args[1])<0&&w.success(b)},\"@>/2\":function(w,b,y){S.compare(y.args[0],y.args[1])>0&&w.success(b)},\"@>=/2\":function(w,b,y){S.compare(y.args[0],y.args[1])>=0&&w.success(b)},\"compare/3\":function(w,b,y){var F=y.args[0],J=y.args[1],X=y.args[2];if(!S.type.is_variable(F)&&!S.type.is_atom(F))w.throw_error(S.error.type(\"atom\",F,y.indicator));else if(S.type.is_atom(F)&&[\"<\",\">\",\"=\"].indexOf(F.id)===-1)w.throw_error(S.type.domain(\"order\",F,y.indicator));else{var $=S.compare(J,X);$=$===0?\"=\":$===-1?\"<\":\">\",w.prepend([new ke(b.goal.replace(new H(\"=\",[F,new H($,[])])),b.substitution,b)])}},\"is/2\":function(w,b,y){var F=y.args[1].interpret(w);S.type.is_number(F)?w.prepend([new ke(b.goal.replace(new H(\"=\",[y.args[0],F],w.level)),b.substitution,b)]):w.throw_error(F)},\"between/3\":function(w,b,y){var F=y.args[0],J=y.args[1],X=y.args[2];if(S.type.is_variable(F)||S.type.is_variable(J))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_integer(F))w.throw_error(S.error.type(\"integer\",F,y.indicator));else if(!S.type.is_integer(J))w.throw_error(S.error.type(\"integer\",J,y.indicator));else if(!S.type.is_variable(X)&&!S.type.is_integer(X))w.throw_error(S.error.type(\"integer\",X,y.indicator));else if(S.type.is_variable(X)){var $=[new ke(b.goal.replace(new H(\"=\",[X,F])),b.substitution,b)];F.value<J.value&&$.push(new ke(b.goal.replace(new H(\"between\",[new Ne(F.value+1,!1),J,X])),b.substitution,b)),w.prepend($)}else F.value<=X.value&&J.value>=X.value&&w.success(b)},\"succ/2\":function(w,b,y){var F=y.args[0],J=y.args[1];S.type.is_variable(F)&&S.type.is_variable(J)?w.throw_error(S.error.instantiation(y.indicator)):!S.type.is_variable(F)&&!S.type.is_integer(F)?w.throw_error(S.error.type(\"integer\",F,y.indicator)):!S.type.is_variable(J)&&!S.type.is_integer(J)?w.throw_error(S.error.type(\"integer\",J,y.indicator)):!S.type.is_variable(F)&&F.value<0?w.throw_error(S.error.domain(\"not_less_than_zero\",F,y.indicator)):!S.type.is_variable(J)&&J.value<0?w.throw_error(S.error.domain(\"not_less_than_zero\",J,y.indicator)):(S.type.is_variable(J)||J.value>0)&&(S.type.is_variable(F)?w.prepend([new ke(b.goal.replace(new H(\"=\",[F,new Ne(J.value-1,!1)])),b.substitution,b)]):w.prepend([new ke(b.goal.replace(new H(\"=\",[J,new Ne(F.value+1,!1)])),b.substitution,b)]))},\"=:=/2\":function(w,b,y){var F=S.arithmetic_compare(w,y.args[0],y.args[1]);S.type.is_term(F)?w.throw_error(F):F===0&&w.success(b)},\"=\\\\=/2\":function(w,b,y){var F=S.arithmetic_compare(w,y.args[0],y.args[1]);S.type.is_term(F)?w.throw_error(F):F!==0&&w.success(b)},\"</2\":function(w,b,y){var F=S.arithmetic_compare(w,y.args[0],y.args[1]);S.type.is_term(F)?w.throw_error(F):F<0&&w.success(b)},\"=</2\":function(w,b,y){var F=S.arithmetic_compare(w,y.args[0],y.args[1]);S.type.is_term(F)?w.throw_error(F):F<=0&&w.success(b)},\">/2\":function(w,b,y){var F=S.arithmetic_compare(w,y.args[0],y.args[1]);S.type.is_term(F)?w.throw_error(F):F>0&&w.success(b)},\">=/2\":function(w,b,y){var F=S.arithmetic_compare(w,y.args[0],y.args[1]);S.type.is_term(F)?w.throw_error(F):F>=0&&w.success(b)},\"var/1\":function(w,b,y){S.type.is_variable(y.args[0])&&w.success(b)},\"atom/1\":function(w,b,y){S.type.is_atom(y.args[0])&&w.success(b)},\"atomic/1\":function(w,b,y){S.type.is_atomic(y.args[0])&&w.success(b)},\"compound/1\":function(w,b,y){S.type.is_compound(y.args[0])&&w.success(b)},\"integer/1\":function(w,b,y){S.type.is_integer(y.args[0])&&w.success(b)},\"float/1\":function(w,b,y){S.type.is_float(y.args[0])&&w.success(b)},\"number/1\":function(w,b,y){S.type.is_number(y.args[0])&&w.success(b)},\"nonvar/1\":function(w,b,y){S.type.is_variable(y.args[0])||w.success(b)},\"ground/1\":function(w,b,y){y.variables().length===0&&w.success(b)},\"acyclic_term/1\":function(w,b,y){for(var F=b.substitution.apply(b.substitution),J=y.args[0].variables(),X=0;X<J.length;X++)if(b.substitution.links[J[X]]!==void 0&&!b.substitution.links[J[X]].equals(F.links[J[X]]))return;w.success(b)},\"callable/1\":function(w,b,y){S.type.is_callable(y.args[0])&&w.success(b)},\"is_list/1\":function(w,b,y){for(var F=y.args[0];S.type.is_term(F)&&F.indicator===\"./2\";)F=F.args[1];S.type.is_term(F)&&F.indicator===\"[]/0\"&&w.success(b)},\"current_input/1\":function(w,b,y){var F=y.args[0];!S.type.is_variable(F)&&!S.type.is_stream(F)&&!S.type.is_atom(F)?w.throw_error(S.error.domain(\"stream\",F,y.indicator)):(S.type.is_atom(F)&&w.get_stream_by_alias(F.id)&&(F=w.get_stream_by_alias(F.id)),w.prepend([new ke(b.goal.replace(new H(\"=\",[F,w.get_current_input()])),b.substitution,b)]))},\"current_output/1\":function(w,b,y){var F=y.args[0];!S.type.is_variable(F)&&!S.type.is_stream(F)&&!S.type.is_atom(F)?w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator)):(S.type.is_atom(F)&&w.get_stream_by_alias(F.id)&&(F=w.get_stream_by_alias(F.id)),w.prepend([new ke(b.goal.replace(new H(\"=\",[F,w.get_current_output()])),b.substitution,b)]))},\"set_input/1\":function(w,b,y){var F=y.args[0],J=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);S.type.is_variable(F)?w.throw_error(S.error.instantiation(y.indicator)):!S.type.is_variable(F)&&!S.type.is_stream(F)&&!S.type.is_atom(F)?w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator)):S.type.is_stream(J)?J.output===!0?w.throw_error(S.error.permission(\"input\",\"stream\",F,y.indicator)):(w.set_current_input(J),w.success(b)):w.throw_error(S.error.existence(\"stream\",F,y.indicator))},\"set_output/1\":function(w,b,y){var F=y.args[0],J=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);S.type.is_variable(F)?w.throw_error(S.error.instantiation(y.indicator)):!S.type.is_variable(F)&&!S.type.is_stream(F)&&!S.type.is_atom(F)?w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator)):S.type.is_stream(J)?J.input===!0?w.throw_error(S.error.permission(\"output\",\"stream\",F,y.indicator)):(w.set_current_output(J),w.success(b)):w.throw_error(S.error.existence(\"stream\",F,y.indicator))},\"open/3\":function(w,b,y){var F=y.args[0],J=y.args[1],X=y.args[2];w.prepend([new ke(b.goal.replace(new H(\"open\",[F,J,X,new H(\"[]\",[])])),b.substitution,b)])},\"open/4\":function(w,b,y){var F=y.args[0],J=y.args[1],X=y.args[2],$=y.args[3];if(S.type.is_variable(F)||S.type.is_variable(J))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(J)&&!S.type.is_atom(J))w.throw_error(S.error.type(\"atom\",J,y.indicator));else if(!S.type.is_list($))w.throw_error(S.error.type(\"list\",$,y.indicator));else if(!S.type.is_variable(X))w.throw_error(S.error.type(\"variable\",X,y.indicator));else if(!S.type.is_atom(F)&&!S.type.is_streamable(F))w.throw_error(S.error.domain(\"source_sink\",F,y.indicator));else if(!S.type.is_io_mode(J))w.throw_error(S.error.domain(\"io_mode\",J,y.indicator));else{for(var ie={},Se=$,Re;S.type.is_term(Se)&&Se.indicator===\"./2\";){if(Re=Se.args[0],S.type.is_variable(Re)){w.throw_error(S.error.instantiation(y.indicator));return}else if(!S.type.is_stream_option(Re)){w.throw_error(S.error.domain(\"stream_option\",Re,y.indicator));return}ie[Re.id]=Re.args[0].id,Se=Se.args[1]}if(Se.indicator!==\"[]/0\"){S.type.is_variable(Se)?w.throw_error(S.error.instantiation(y.indicator)):w.throw_error(S.error.type(\"list\",$,y.indicator));return}else{var at=ie.alias;if(at&&w.get_stream_by_alias(at)){w.throw_error(S.error.permission(\"open\",\"source_sink\",new H(\"alias\",[new H(at,[])]),y.indicator));return}ie.type||(ie.type=\"text\");var dt;if(S.type.is_atom(F)?dt=w.file_system_open(F.id,ie.type,J.id):dt=F.stream(ie.type,J.id),dt===!1){w.throw_error(S.error.permission(\"open\",\"source_sink\",F,y.indicator));return}else if(dt===null){w.throw_error(S.error.existence(\"source_sink\",F,y.indicator));return}var jt=new Te(dt,J.id,ie.alias,ie.type,ie.reposition===\"true\",ie.eof_action);at?w.session.streams[at]=jt:w.session.streams[jt.id]=jt,w.prepend([new ke(b.goal.replace(new H(\"=\",[X,jt])),b.substitution,b)])}}},\"close/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\"close\",[F,new H(\"[]\",[])])),b.substitution,b)])},\"close/2\":function(w,b,y){var F=y.args[0],J=y.args[1],X=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(S.type.is_variable(F)||S.type.is_variable(J))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_list(J))w.throw_error(S.error.type(\"list\",J,y.indicator));else if(!S.type.is_stream(F)&&!S.type.is_atom(F))w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator));else if(!S.type.is_stream(X)||X.stream===null)w.throw_error(S.error.existence(\"stream\",F,y.indicator));else{for(var $={},ie=J,Se;S.type.is_term(ie)&&ie.indicator===\"./2\";){if(Se=ie.args[0],S.type.is_variable(Se)){w.throw_error(S.error.instantiation(y.indicator));return}else if(!S.type.is_close_option(Se)){w.throw_error(S.error.domain(\"close_option\",Se,y.indicator));return}$[Se.id]=Se.args[0].id===\"true\",ie=ie.args[1]}if(ie.indicator!==\"[]/0\"){S.type.is_variable(ie)?w.throw_error(S.error.instantiation(y.indicator)):w.throw_error(S.error.type(\"list\",J,y.indicator));return}else{if(X===w.session.standard_input||X===w.session.standard_output){w.success(b);return}else X===w.session.current_input?w.session.current_input=w.session.standard_input:X===w.session.current_output&&(w.session.current_output=w.session.current_output);X.alias!==null?delete w.session.streams[X.alias]:delete w.session.streams[X.id],X.output&&X.stream.flush();var Re=X.stream.close();X.stream=null,($.force===!0||Re===!0)&&w.success(b)}}},\"flush_output/0\":function(w,b,y){w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_output\",[new xe(\"S\")]),new H(\"flush_output\",[new xe(\"S\")])])),b.substitution,b)])},\"flush_output/1\":function(w,b,y){var F=y.args[0],J=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);S.type.is_variable(F)?w.throw_error(S.error.instantiation(y.indicator)):!S.type.is_stream(F)&&!S.type.is_atom(F)?w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator)):!S.type.is_stream(J)||J.stream===null?w.throw_error(S.error.existence(\"stream\",F,y.indicator)):F.input===!0?w.throw_error(S.error.permission(\"output\",\"stream\",output,y.indicator)):(J.stream.flush(),w.success(b))},\"stream_property/2\":function(w,b,y){var F=y.args[0],J=y.args[1],X=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(!S.type.is_variable(F)&&!S.type.is_stream(F)&&!S.type.is_atom(F))w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator));else if(!S.type.is_variable(F)&&(!S.type.is_stream(X)||X.stream===null))w.throw_error(S.error.existence(\"stream\",F,y.indicator));else if(!S.type.is_variable(J)&&!S.type.is_stream_property(J))w.throw_error(S.error.domain(\"stream_property\",J,y.indicator));else{var $=[],ie=[];if(!S.type.is_variable(F))$.push(X);else for(var Se in w.session.streams)$.push(w.session.streams[Se]);for(var Re=0;Re<$.length;Re++){var at=[];$[Re].filename&&at.push(new H(\"file_name\",[new H($[Re].file_name,[])])),at.push(new H(\"mode\",[new H($[Re].mode,[])])),at.push(new H($[Re].input?\"input\":\"output\",[])),$[Re].alias&&at.push(new H(\"alias\",[new H($[Re].alias,[])])),at.push(new H(\"position\",[typeof $[Re].position==\"number\"?new Ne($[Re].position,!1):new H($[Re].position,[])])),at.push(new H(\"end_of_stream\",[new H($[Re].position===\"end_of_stream\"?\"at\":$[Re].position===\"past_end_of_stream\"?\"past\":\"not\",[])])),at.push(new H(\"eof_action\",[new H($[Re].eof_action,[])])),at.push(new H(\"reposition\",[new H($[Re].reposition?\"true\":\"false\",[])])),at.push(new H(\"type\",[new H($[Re].type,[])]));for(var dt=0;dt<at.length;dt++)ie.push(new ke(b.goal.replace(new H(\",\",[new H(\"=\",[S.type.is_variable(F)?F:X,$[Re]]),new H(\"=\",[J,at[dt]])])),b.substitution,b))}w.prepend(ie)}},\"at_end_of_stream/0\":function(w,b,y){w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_input\",[new xe(\"S\")]),new H(\",\",[new H(\"stream_property\",[new xe(\"S\"),new H(\"end_of_stream\",[new xe(\"E\")])]),new H(\",\",[new H(\"!\",[]),new H(\";\",[new H(\"=\",[new xe(\"E\"),new H(\"at\",[])]),new H(\"=\",[new xe(\"E\"),new H(\"past\",[])])])])])])),b.substitution,b)])},\"at_end_of_stream/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"stream_property\",[F,new H(\"end_of_stream\",[new xe(\"E\")])]),new H(\",\",[new H(\"!\",[]),new H(\";\",[new H(\"=\",[new xe(\"E\"),new H(\"at\",[])]),new H(\"=\",[new xe(\"E\"),new H(\"past\",[])])])])])),b.substitution,b)])},\"set_stream_position/2\":function(w,b,y){var F=y.args[0],J=y.args[1],X=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);S.type.is_variable(F)||S.type.is_variable(J)?w.throw_error(S.error.instantiation(y.indicator)):!S.type.is_stream(F)&&!S.type.is_atom(F)?w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator)):!S.type.is_stream(X)||X.stream===null?w.throw_error(S.error.existence(\"stream\",F,y.indicator)):S.type.is_stream_position(J)?X.reposition===!1?w.throw_error(S.error.permission(\"reposition\",\"stream\",F,y.indicator)):(S.type.is_integer(J)?X.position=J.value:X.position=J.id,w.success(b)):w.throw_error(S.error.domain(\"stream_position\",J,y.indicator))},\"get_char/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_input\",[new xe(\"S\")]),new H(\"get_char\",[new xe(\"S\"),F])])),b.substitution,b)])},\"get_char/2\":function(w,b,y){var F=y.args[0],J=y.args[1],X=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(S.type.is_variable(F))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(J)&&!S.type.is_character(J))w.throw_error(S.error.type(\"in_character\",J,y.indicator));else if(!S.type.is_stream(F)&&!S.type.is_atom(F))w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator));else if(!S.type.is_stream(X)||X.stream===null)w.throw_error(S.error.existence(\"stream\",F,y.indicator));else if(X.output)w.throw_error(S.error.permission(\"input\",\"stream\",F,y.indicator));else if(X.type===\"binary\")w.throw_error(S.error.permission(\"input\",\"binary_stream\",F,y.indicator));else if(X.position===\"past_end_of_stream\"&&X.eof_action===\"error\")w.throw_error(S.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{var $;if(X.position===\"end_of_stream\")$=\"end_of_file\",X.position=\"past_end_of_stream\";else{if($=X.stream.get(1,X.position),$===null){w.throw_error(S.error.representation(\"character\",y.indicator));return}X.position++}w.prepend([new ke(b.goal.replace(new H(\"=\",[new H($,[]),J])),b.substitution,b)])}},\"get_code/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_input\",[new xe(\"S\")]),new H(\"get_code\",[new xe(\"S\"),F])])),b.substitution,b)])},\"get_code/2\":function(w,b,y){var F=y.args[0],J=y.args[1],X=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(S.type.is_variable(F))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(J)&&!S.type.is_integer(J))w.throw_error(S.error.type(\"integer\",char,y.indicator));else if(!S.type.is_variable(F)&&!S.type.is_stream(F)&&!S.type.is_atom(F))w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator));else if(!S.type.is_stream(X)||X.stream===null)w.throw_error(S.error.existence(\"stream\",F,y.indicator));else if(X.output)w.throw_error(S.error.permission(\"input\",\"stream\",F,y.indicator));else if(X.type===\"binary\")w.throw_error(S.error.permission(\"input\",\"binary_stream\",F,y.indicator));else if(X.position===\"past_end_of_stream\"&&X.eof_action===\"error\")w.throw_error(S.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{var $;if(X.position===\"end_of_stream\")$=-1,X.position=\"past_end_of_stream\";else{if($=X.stream.get(1,X.position),$===null){w.throw_error(S.error.representation(\"character\",y.indicator));return}$=n($,0),X.position++}w.prepend([new ke(b.goal.replace(new H(\"=\",[new Ne($,!1),J])),b.substitution,b)])}},\"peek_char/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_input\",[new xe(\"S\")]),new H(\"peek_char\",[new xe(\"S\"),F])])),b.substitution,b)])},\"peek_char/2\":function(w,b,y){var F=y.args[0],J=y.args[1],X=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(S.type.is_variable(F))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(J)&&!S.type.is_character(J))w.throw_error(S.error.type(\"in_character\",J,y.indicator));else if(!S.type.is_stream(F)&&!S.type.is_atom(F))w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator));else if(!S.type.is_stream(X)||X.stream===null)w.throw_error(S.error.existence(\"stream\",F,y.indicator));else if(X.output)w.throw_error(S.error.permission(\"input\",\"stream\",F,y.indicator));else if(X.type===\"binary\")w.throw_error(S.error.permission(\"input\",\"binary_stream\",F,y.indicator));else if(X.position===\"past_end_of_stream\"&&X.eof_action===\"error\")w.throw_error(S.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{var $;if(X.position===\"end_of_stream\")$=\"end_of_file\",X.position=\"past_end_of_stream\";else if($=X.stream.get(1,X.position),$===null){w.throw_error(S.error.representation(\"character\",y.indicator));return}w.prepend([new ke(b.goal.replace(new H(\"=\",[new H($,[]),J])),b.substitution,b)])}},\"peek_code/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_input\",[new xe(\"S\")]),new H(\"peek_code\",[new xe(\"S\"),F])])),b.substitution,b)])},\"peek_code/2\":function(w,b,y){var F=y.args[0],J=y.args[1],X=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(S.type.is_variable(F))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(J)&&!S.type.is_integer(J))w.throw_error(S.error.type(\"integer\",char,y.indicator));else if(!S.type.is_variable(F)&&!S.type.is_stream(F)&&!S.type.is_atom(F))w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator));else if(!S.type.is_stream(X)||X.stream===null)w.throw_error(S.error.existence(\"stream\",F,y.indicator));else if(X.output)w.throw_error(S.error.permission(\"input\",\"stream\",F,y.indicator));else if(X.type===\"binary\")w.throw_error(S.error.permission(\"input\",\"binary_stream\",F,y.indicator));else if(X.position===\"past_end_of_stream\"&&X.eof_action===\"error\")w.throw_error(S.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{var $;if(X.position===\"end_of_stream\")$=-1,X.position=\"past_end_of_stream\";else{if($=X.stream.get(1,X.position),$===null){w.throw_error(S.error.representation(\"character\",y.indicator));return}$=n($,0)}w.prepend([new ke(b.goal.replace(new H(\"=\",[new Ne($,!1),J])),b.substitution,b)])}},\"put_char/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_output\",[new xe(\"S\")]),new H(\"put_char\",[new xe(\"S\"),F])])),b.substitution,b)])},\"put_char/2\":function(w,b,y){var F=y.args[0],J=y.args[1],X=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);S.type.is_variable(F)||S.type.is_variable(J)?w.throw_error(S.error.instantiation(y.indicator)):S.type.is_character(J)?!S.type.is_variable(F)&&!S.type.is_stream(F)&&!S.type.is_atom(F)?w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator)):!S.type.is_stream(X)||X.stream===null?w.throw_error(S.error.existence(\"stream\",F,y.indicator)):X.input?w.throw_error(S.error.permission(\"output\",\"stream\",F,y.indicator)):X.type===\"binary\"?w.throw_error(S.error.permission(\"output\",\"binary_stream\",F,y.indicator)):X.stream.put(J.id,X.position)&&(typeof X.position==\"number\"&&X.position++,w.success(b)):w.throw_error(S.error.type(\"character\",J,y.indicator))},\"put_code/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_output\",[new xe(\"S\")]),new H(\"put_code\",[new xe(\"S\"),F])])),b.substitution,b)])},\"put_code/2\":function(w,b,y){var F=y.args[0],J=y.args[1],X=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);S.type.is_variable(F)||S.type.is_variable(J)?w.throw_error(S.error.instantiation(y.indicator)):S.type.is_integer(J)?S.type.is_character_code(J)?!S.type.is_variable(F)&&!S.type.is_stream(F)&&!S.type.is_atom(F)?w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator)):!S.type.is_stream(X)||X.stream===null?w.throw_error(S.error.existence(\"stream\",F,y.indicator)):X.input?w.throw_error(S.error.permission(\"output\",\"stream\",F,y.indicator)):X.type===\"binary\"?w.throw_error(S.error.permission(\"output\",\"binary_stream\",F,y.indicator)):X.stream.put_char(u(J.value),X.position)&&(typeof X.position==\"number\"&&X.position++,w.success(b)):w.throw_error(S.error.representation(\"character_code\",y.indicator)):w.throw_error(S.error.type(\"integer\",J,y.indicator))},\"nl/0\":function(w,b,y){w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_output\",[new xe(\"S\")]),new H(\"put_char\",[new xe(\"S\"),new H(`\n`,[])])])),b.substitution,b)])},\"nl/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\"put_char\",[F,new H(`\n`,[])])),b.substitution,b)])},\"get_byte/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_input\",[new xe(\"S\")]),new H(\"get_byte\",[new xe(\"S\"),F])])),b.substitution,b)])},\"get_byte/2\":function(w,b,y){var F=y.args[0],J=y.args[1],X=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(S.type.is_variable(F))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(J)&&!S.type.is_byte(J))w.throw_error(S.error.type(\"in_byte\",char,y.indicator));else if(!S.type.is_stream(F)&&!S.type.is_atom(F))w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator));else if(!S.type.is_stream(X)||X.stream===null)w.throw_error(S.error.existence(\"stream\",F,y.indicator));else if(X.output)w.throw_error(S.error.permission(\"input\",\"stream\",F,y.indicator));else if(X.type===\"text\")w.throw_error(S.error.permission(\"input\",\"text_stream\",F,y.indicator));else if(X.position===\"past_end_of_stream\"&&X.eof_action===\"error\")w.throw_error(S.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{var $;if(X.position===\"end_of_stream\")$=\"end_of_file\",X.position=\"past_end_of_stream\";else{if($=X.stream.get_byte(X.position),$===null){w.throw_error(S.error.representation(\"byte\",y.indicator));return}X.position++}w.prepend([new ke(b.goal.replace(new H(\"=\",[new Ne($,!1),J])),b.substitution,b)])}},\"peek_byte/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_input\",[new xe(\"S\")]),new H(\"peek_byte\",[new xe(\"S\"),F])])),b.substitution,b)])},\"peek_byte/2\":function(w,b,y){var F=y.args[0],J=y.args[1],X=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(S.type.is_variable(F))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_variable(J)&&!S.type.is_byte(J))w.throw_error(S.error.type(\"in_byte\",char,y.indicator));else if(!S.type.is_stream(F)&&!S.type.is_atom(F))w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator));else if(!S.type.is_stream(X)||X.stream===null)w.throw_error(S.error.existence(\"stream\",F,y.indicator));else if(X.output)w.throw_error(S.error.permission(\"input\",\"stream\",F,y.indicator));else if(X.type===\"text\")w.throw_error(S.error.permission(\"input\",\"text_stream\",F,y.indicator));else if(X.position===\"past_end_of_stream\"&&X.eof_action===\"error\")w.throw_error(S.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{var $;if(X.position===\"end_of_stream\")$=\"end_of_file\",X.position=\"past_end_of_stream\";else if($=X.stream.get_byte(X.position),$===null){w.throw_error(S.error.representation(\"byte\",y.indicator));return}w.prepend([new ke(b.goal.replace(new H(\"=\",[new Ne($,!1),J])),b.substitution,b)])}},\"put_byte/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_output\",[new xe(\"S\")]),new H(\"put_byte\",[new xe(\"S\"),F])])),b.substitution,b)])},\"put_byte/2\":function(w,b,y){var F=y.args[0],J=y.args[1],X=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);S.type.is_variable(F)||S.type.is_variable(J)?w.throw_error(S.error.instantiation(y.indicator)):S.type.is_byte(J)?!S.type.is_variable(F)&&!S.type.is_stream(F)&&!S.type.is_atom(F)?w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator)):!S.type.is_stream(X)||X.stream===null?w.throw_error(S.error.existence(\"stream\",F,y.indicator)):X.input?w.throw_error(S.error.permission(\"output\",\"stream\",F,y.indicator)):X.type===\"text\"?w.throw_error(S.error.permission(\"output\",\"text_stream\",F,y.indicator)):X.stream.put_byte(J.value,X.position)&&(typeof X.position==\"number\"&&X.position++,w.success(b)):w.throw_error(S.error.type(\"byte\",J,y.indicator))},\"read/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_input\",[new xe(\"S\")]),new H(\"read_term\",[new xe(\"S\"),F,new H(\"[]\",[])])])),b.substitution,b)])},\"read/2\":function(w,b,y){var F=y.args[0],J=y.args[1];w.prepend([new ke(b.goal.replace(new H(\"read_term\",[F,J,new H(\"[]\",[])])),b.substitution,b)])},\"read_term/2\":function(w,b,y){var F=y.args[0],J=y.args[1];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_input\",[new xe(\"S\")]),new H(\"read_term\",[new xe(\"S\"),F,J])])),b.substitution,b)])},\"read_term/3\":function(w,b,y){var F=y.args[0],J=y.args[1],X=y.args[2],$=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(S.type.is_variable(F)||S.type.is_variable(X))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_list(X))w.throw_error(S.error.type(\"list\",X,y.indicator));else if(!S.type.is_stream(F)&&!S.type.is_atom(F))w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator));else if(!S.type.is_stream($)||$.stream===null)w.throw_error(S.error.existence(\"stream\",F,y.indicator));else if($.output)w.throw_error(S.error.permission(\"input\",\"stream\",F,y.indicator));else if($.type===\"binary\")w.throw_error(S.error.permission(\"input\",\"binary_stream\",F,y.indicator));else if($.position===\"past_end_of_stream\"&&$.eof_action===\"error\")w.throw_error(S.error.permission(\"input\",\"past_end_of_stream\",F,y.indicator));else{for(var ie={},Se=X,Re;S.type.is_term(Se)&&Se.indicator===\"./2\";){if(Re=Se.args[0],S.type.is_variable(Re)){w.throw_error(S.error.instantiation(y.indicator));return}else if(!S.type.is_read_option(Re)){w.throw_error(S.error.domain(\"read_option\",Re,y.indicator));return}ie[Re.id]=Re.args[0],Se=Se.args[1]}if(Se.indicator!==\"[]/0\"){S.type.is_variable(Se)?w.throw_error(S.error.instantiation(y.indicator)):w.throw_error(S.error.type(\"list\",X,y.indicator));return}else{for(var at,dt,jt,tr=\"\",bt=[],ln=null;ln===null||ln.name!==\"atom\"||ln.value!==\".\"||jt.type===A&&S.flatten_error(new H(\"throw\",[jt.value])).found===\"token_not_found\";){if(at=$.stream.get(1,$.position),at===null){w.throw_error(S.error.representation(\"character\",y.indicator));return}if(at===\"end_of_file\"||at===\"past_end_of_file\"){jt?w.throw_error(S.error.syntax(bt[jt.len-1],\". or expression expected\",!1)):w.throw_error(S.error.syntax(null,\"token not found\",!0));return}$.position++,tr+=at,dt=new U(w),dt.new_text(tr),bt=dt.get_tokens(),ln=bt!==null&&bt.length>0?bt[bt.length-1]:null,bt!==null&&(jt=z(w,bt,0,w.__get_max_priority(),!1))}if(jt.type===p&&jt.len===bt.length-1&&ln.value===\".\"){jt=jt.value.rename(w);var kr=new H(\"=\",[J,jt]);if(ie.variables){var mr=g(o(we(jt.variables()),function(Sr){return new xe(Sr)}));kr=new H(\",\",[kr,new H(\"=\",[ie.variables,mr])])}if(ie.variable_names){var mr=g(o(we(jt.variables()),function(Kr){var Kn;for(Kn in w.session.renamed_variables)if(w.session.renamed_variables.hasOwnProperty(Kn)&&w.session.renamed_variables[Kn]===Kr)break;return new H(\"=\",[new H(Kn,[]),new xe(Kr)])}));kr=new H(\",\",[kr,new H(\"=\",[ie.variable_names,mr])])}if(ie.singletons){var mr=g(o(new Ye(jt,null).singleton_variables(),function(Kr){var Kn;for(Kn in w.session.renamed_variables)if(w.session.renamed_variables.hasOwnProperty(Kn)&&w.session.renamed_variables[Kn]===Kr)break;return new H(\"=\",[new H(Kn,[]),new xe(Kr)])}));kr=new H(\",\",[kr,new H(\"=\",[ie.singletons,mr])])}w.prepend([new ke(b.goal.replace(kr),b.substitution,b)])}else jt.type===p?w.throw_error(S.error.syntax(bt[jt.len],\"unexpected token\",!1)):w.throw_error(jt.value)}}},\"write/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_output\",[new xe(\"S\")]),new H(\"write\",[new xe(\"S\"),F])])),b.substitution,b)])},\"write/2\":function(w,b,y){var F=y.args[0],J=y.args[1];w.prepend([new ke(b.goal.replace(new H(\"write_term\",[F,J,new H(\".\",[new H(\"quoted\",[new H(\"false\",[])]),new H(\".\",[new H(\"ignore_ops\",[new H(\"false\")]),new H(\".\",[new H(\"numbervars\",[new H(\"true\")]),new H(\"[]\",[])])])])])),b.substitution,b)])},\"writeq/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_output\",[new xe(\"S\")]),new H(\"writeq\",[new xe(\"S\"),F])])),b.substitution,b)])},\"writeq/2\":function(w,b,y){var F=y.args[0],J=y.args[1];w.prepend([new ke(b.goal.replace(new H(\"write_term\",[F,J,new H(\".\",[new H(\"quoted\",[new H(\"true\",[])]),new H(\".\",[new H(\"ignore_ops\",[new H(\"false\")]),new H(\".\",[new H(\"numbervars\",[new H(\"true\")]),new H(\"[]\",[])])])])])),b.substitution,b)])},\"write_canonical/1\":function(w,b,y){var F=y.args[0];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_output\",[new xe(\"S\")]),new H(\"write_canonical\",[new xe(\"S\"),F])])),b.substitution,b)])},\"write_canonical/2\":function(w,b,y){var F=y.args[0],J=y.args[1];w.prepend([new ke(b.goal.replace(new H(\"write_term\",[F,J,new H(\".\",[new H(\"quoted\",[new H(\"true\",[])]),new H(\".\",[new H(\"ignore_ops\",[new H(\"true\")]),new H(\".\",[new H(\"numbervars\",[new H(\"false\")]),new H(\"[]\",[])])])])])),b.substitution,b)])},\"write_term/2\":function(w,b,y){var F=y.args[0],J=y.args[1];w.prepend([new ke(b.goal.replace(new H(\",\",[new H(\"current_output\",[new xe(\"S\")]),new H(\"write_term\",[new xe(\"S\"),F,J])])),b.substitution,b)])},\"write_term/3\":function(w,b,y){var F=y.args[0],J=y.args[1],X=y.args[2],$=S.type.is_stream(F)?F:w.get_stream_by_alias(F.id);if(S.type.is_variable(F)||S.type.is_variable(X))w.throw_error(S.error.instantiation(y.indicator));else if(!S.type.is_list(X))w.throw_error(S.error.type(\"list\",X,y.indicator));else if(!S.type.is_stream(F)&&!S.type.is_atom(F))w.throw_error(S.error.domain(\"stream_or_alias\",F,y.indicator));else if(!S.type.is_stream($)||$.stream===null)w.throw_error(S.error.existence(\"stream\",F,y.indicator));else if($.input)w.throw_error(S.error.permission(\"output\",\"stream\",F,y.indicator));else if($.type===\"binary\")w.throw_error(S.error.permission(\"output\",\"binary_stream\",F,y.indicator));else if($.position===\"past_end_of_stream\"&&$.eof_action===\"error\")w.throw_error(S.error.permission(\"output\",\"past_end_of_stream\",F,y.indicator));else{for(var ie={},Se=X,Re;S.type.is_term(Se)&&Se.indicator===\"./2\";){if(Re=Se.args[0],S.type.is_variable(Re)){w.throw_error(S.error.instantiation(y.indicator));return}else if(!S.type.is_write_option(Re)){w.throw_error(S.error.domain(\"write_option\",Re,y.indicator));return}ie[Re.id]=Re.args[0].id===\"true\",Se=Se.args[1]}if(Se.indicator!==\"[]/0\"){S.type.is_variable(Se)?w.throw_error(S.error.instantiation(y.indicator)):w.throw_error(S.error.type(\"list\",X,y.indicator));return}else{ie.session=w.session;var at=J.toString(ie);$.stream.put(at,$.position),typeof $.position==\"number\"&&($.position+=at.length),w.success(b)}}},\"halt/0\":function(w,b,y){w.points=[]},\"halt/1\":function(w,b,y){var F=y.args[0];S.type.is_variable(F)?w.throw_error(S.error.instantiation(y.indicator)):S.type.is_integer(F)?w.points=[]:w.throw_error(S.error.type(\"integer\",F,y.indicator))},\"current_prolog_flag/2\":function(w,b,y){var F=y.args[0],J=y.args[1];if(!S.type.is_variable(F)&&!S.type.is_atom(F))w.throw_error(S.error.type(\"atom\",F,y.indicator));else if(!S.type.is_variable(F)&&!S.type.is_flag(F))w.throw_error(S.error.domain(\"prolog_flag\",F,y.indicator));else{var X=[];for(var $ in S.flag)if(S.flag.hasOwnProperty($)){var ie=new H(\",\",[new H(\"=\",[new H($),F]),new H(\"=\",[w.get_flag($),J])]);X.push(new ke(b.goal.replace(ie),b.substitution,b))}w.prepend(X)}},\"set_prolog_flag/2\":function(w,b,y){var F=y.args[0],J=y.args[1];S.type.is_variable(F)||S.type.is_variable(J)?w.throw_error(S.error.instantiation(y.indicator)):S.type.is_atom(F)?S.type.is_flag(F)?S.type.is_value_flag(F,J)?S.type.is_modifiable_flag(F)?(w.session.flag[F.id]=J,w.success(b)):w.throw_error(S.error.permission(\"modify\",\"flag\",F)):w.throw_error(S.error.domain(\"flag_value\",new H(\"+\",[F,J]),y.indicator)):w.throw_error(S.error.domain(\"prolog_flag\",F,y.indicator)):w.throw_error(S.error.type(\"atom\",F,y.indicator))}},flag:{bounded:{allowed:[new H(\"true\"),new H(\"false\")],value:new H(\"true\"),changeable:!1},max_integer:{allowed:[new Ne(Number.MAX_SAFE_INTEGER)],value:new Ne(Number.MAX_SAFE_INTEGER),changeable:!1},min_integer:{allowed:[new Ne(Number.MIN_SAFE_INTEGER)],value:new Ne(Number.MIN_SAFE_INTEGER),changeable:!1},integer_rounding_function:{allowed:[new H(\"down\"),new H(\"toward_zero\")],value:new H(\"toward_zero\"),changeable:!1},char_conversion:{allowed:[new H(\"on\"),new H(\"off\")],value:new H(\"on\"),changeable:!0},debug:{allowed:[new H(\"on\"),new H(\"off\")],value:new H(\"off\"),changeable:!0},max_arity:{allowed:[new H(\"unbounded\")],value:new H(\"unbounded\"),changeable:!1},unknown:{allowed:[new H(\"error\"),new H(\"fail\"),new H(\"warning\")],value:new H(\"error\"),changeable:!0},double_quotes:{allowed:[new H(\"chars\"),new H(\"codes\"),new H(\"atom\")],value:new H(\"codes\"),changeable:!0},occurs_check:{allowed:[new H(\"false\"),new H(\"true\")],value:new H(\"false\"),changeable:!0},dialect:{allowed:[new H(\"tau\")],value:new H(\"tau\"),changeable:!1},version_data:{allowed:[new H(\"tau\",[new Ne(t.major,!1),new Ne(t.minor,!1),new Ne(t.patch,!1),new H(t.status)])],value:new H(\"tau\",[new Ne(t.major,!1),new Ne(t.minor,!1),new Ne(t.patch,!1),new H(t.status)]),changeable:!1},nodejs:{allowed:[new H(\"yes\"),new H(\"no\")],value:new H(typeof gl<\"u\"&&gl.exports?\"yes\":\"no\"),changeable:!1}},unify:function(w,b,y){y=y===void 0?!1:y;for(var F=[{left:w,right:b}],J={};F.length!==0;){var X=F.pop();if(w=X.left,b=X.right,S.type.is_term(w)&&S.type.is_term(b)){if(w.indicator!==b.indicator)return null;for(var $=0;$<w.args.length;$++)F.push({left:w.args[$],right:b.args[$]})}else if(S.type.is_number(w)&&S.type.is_number(b)){if(w.value!==b.value||w.is_float!==b.is_float)return null}else if(S.type.is_variable(w)){if(S.type.is_variable(b)&&w.id===b.id)continue;if(y===!0&&b.variables().indexOf(w.id)!==-1)return null;if(w.id!==\"_\"){var ie=new Fe;ie.add(w.id,b);for(var $=0;$<F.length;$++)F[$].left=F[$].left.apply(ie),F[$].right=F[$].right.apply(ie);for(var $ in J)J[$]=J[$].apply(ie);J[w.id]=b}}else if(S.type.is_variable(b))F.push({left:b,right:w});else if(w.unify!==void 0){if(!w.unify(b))return null}else return null}return new Fe(J)},compare:function(w,b){var y=S.type.compare(w,b);return y!==0?y:w.compare(b)},arithmetic_compare:function(w,b,y){var F=b.interpret(w);if(S.type.is_number(F)){var J=y.interpret(w);return S.type.is_number(J)?F.value<J.value?-1:F.value>J.value?1:0:J}else return F},operate:function(w,b){if(S.type.is_operator(b)){for(var y=S.type.is_operator(b),F=[],J,X=!1,$=0;$<b.args.length;$++){if(J=b.args[$].interpret(w),S.type.is_number(J)){if(y.type_args!==null&&J.is_float!==y.type_args)return S.error.type(y.type_args?\"float\":\"integer\",J,w.__call_indicator);F.push(J.value)}else return J;X=X||J.is_float}return F.push(w),J=S.arithmetic.evaluation[b.indicator].fn.apply(this,F),X=y.type_result===null?X:y.type_result,S.type.is_term(J)?J:J===Number.POSITIVE_INFINITY||J===Number.NEGATIVE_INFINITY?S.error.evaluation(\"overflow\",w.__call_indicator):X===!1&&w.get_flag(\"bounded\").id===\"true\"&&(J>w.get_flag(\"max_integer\").value||J<w.get_flag(\"min_integer\").value)?S.error.evaluation(\"int_overflow\",w.__call_indicator):new Ne(J,X)}else return S.error.type(\"evaluable\",b.indicator,w.__call_indicator)},error:{existence:function(w,b,y){return typeof b==\"string\"&&(b=Z(b)),new H(\"error\",[new H(\"existence_error\",[new H(w),b]),Z(y)])},type:function(w,b,y){return new H(\"error\",[new H(\"type_error\",[new H(w),b]),Z(y)])},instantiation:function(w){return new H(\"error\",[new H(\"instantiation_error\"),Z(w)])},domain:function(w,b,y){return new H(\"error\",[new H(\"domain_error\",[new H(w),b]),Z(y)])},representation:function(w,b){return new H(\"error\",[new H(\"representation_error\",[new H(w)]),Z(b)])},permission:function(w,b,y,F){return new H(\"error\",[new H(\"permission_error\",[new H(w),new H(b),y]),Z(F)])},evaluation:function(w,b){return new H(\"error\",[new H(\"evaluation_error\",[new H(w)]),Z(b)])},syntax:function(w,b,y){w=w||{value:\"\",line:0,column:0,matches:[\"\"],start:0};var F=y&&w.matches.length>0?w.start+w.matches[0].length:w.start,J=y?new H(\"token_not_found\"):new H(\"found\",[new H(w.value.toString())]),X=new H(\".\",[new H(\"line\",[new Ne(w.line+1)]),new H(\".\",[new H(\"column\",[new Ne(F+1)]),new H(\".\",[J,new H(\"[]\",[])])])]);return new H(\"error\",[new H(\"syntax_error\",[new H(b)]),X])},syntax_by_predicate:function(w,b){return new H(\"error\",[new H(\"syntax_error\",[new H(w)]),Z(b)])}},warning:{singleton:function(w,b,y){for(var F=new H(\"[]\"),J=w.length-1;J>=0;J--)F=new H(\".\",[new xe(w[J]),F]);return new H(\"warning\",[new H(\"singleton_variables\",[F,Z(b)]),new H(\".\",[new H(\"line\",[new Ne(y,!1)]),new H(\"[]\")])])},failed_goal:function(w,b){return new H(\"warning\",[new H(\"failed_goal\",[w]),new H(\".\",[new H(\"line\",[new Ne(b,!1)]),new H(\"[]\")])])}},format_variable:function(w){return\"_\"+w},format_answer:function(w,b,F){b instanceof be&&(b=b.thread);var F=F||{};if(F.session=b?b.session:void 0,S.type.is_error(w))return\"uncaught exception: \"+w.args[0].toString();if(w===!1)return\"false.\";if(w===null)return\"limit exceeded ;\";var J=0,X=\"\";if(S.type.is_substitution(w)){var $=w.domain(!0);w=w.filter(function(Re,at){return!S.type.is_variable(at)||$.indexOf(at.id)!==-1&&Re!==at.id})}for(var ie in w.links)w.links.hasOwnProperty(ie)&&(J++,X!==\"\"&&(X+=\", \"),X+=ie.toString(F)+\" = \"+w.links[ie].toString(F));var Se=typeof b>\"u\"||b.points.length>0?\" ;\":\".\";return J===0?\"true\"+Se:X+Se},flatten_error:function(w){if(!S.type.is_error(w))return null;w=w.args[0];var b={};return b.type=w.args[0].id,b.thrown=b.type===\"syntax_error\"?null:w.args[1].id,b.expected=null,b.found=null,b.representation=null,b.existence=null,b.existence_type=null,b.line=null,b.column=null,b.permission_operation=null,b.permission_type=null,b.evaluation_type=null,b.type===\"type_error\"||b.type===\"domain_error\"?(b.expected=w.args[0].args[0].id,b.found=w.args[0].args[1].toString()):b.type===\"syntax_error\"?w.args[1].indicator===\"./2\"?(b.expected=w.args[0].args[0].id,b.found=w.args[1].args[1].args[1].args[0],b.found=b.found.id===\"token_not_found\"?b.found.id:b.found.args[0].id,b.line=w.args[1].args[0].args[0].value,b.column=w.args[1].args[1].args[0].args[0].value):b.thrown=w.args[1].id:b.type===\"permission_error\"?(b.found=w.args[0].args[2].toString(),b.permission_operation=w.args[0].args[0].id,b.permission_type=w.args[0].args[1].id):b.type===\"evaluation_error\"?b.evaluation_type=w.args[0].args[0].id:b.type===\"representation_error\"?b.representation=w.args[0].args[0].id:b.type===\"existence_error\"&&(b.existence=w.args[0].args[1].toString(),b.existence_type=w.args[0].args[0].id),b},create:function(w){return new S.type.Session(w)}};typeof gl<\"u\"?gl.exports=S:window.pl=S})()});function cme(t,e,r){t.prepend(r.map(o=>new La.default.type.State(e.goal.replace(o),e.substitution,e)))}function fH(t){let e=Ame.get(t.session);if(e==null)throw new Error(\"Assertion failed: A project should have been registered for the active session\");return e}function fme(t,e){Ame.set(t,e),t.consult(`:- use_module(library(${ndt.id})).`)}var pH,La,ume,Qh,tdt,rdt,Ame,ndt,pme=Et(()=>{Ge();pH=Ze(e2()),La=Ze(AH()),ume=Ze(ve(\"vm\")),{is_atom:Qh,is_variable:tdt,is_instantiated_list:rdt}=La.default.type;Ame=new WeakMap;ndt=new La.default.type.Module(\"constraints\",{\"project_workspaces_by_descriptor/3\":(t,e,r)=>{let[o,a,n]=r.args;if(!Qh(o)||!Qh(a)){t.throw_error(La.default.error.instantiation(r.indicator));return}let u=G.parseIdent(o.id),A=G.makeDescriptor(u,a.id),h=fH(t).tryWorkspaceByDescriptor(A);tdt(n)&&h!==null&&cme(t,e,[new La.default.type.Term(\"=\",[n,new La.default.type.Term(String(h.relativeCwd))])]),Qh(n)&&h!==null&&h.relativeCwd===n.id&&t.success(e)},\"workspace_field/3\":(t,e,r)=>{let[o,a,n]=r.args;if(!Qh(o)||!Qh(a)){t.throw_error(La.default.error.instantiation(r.indicator));return}let A=fH(t).tryWorkspaceByCwd(o.id);if(A==null)return;let p=(0,pH.default)(A.manifest.raw,a.id);typeof p>\"u\"||cme(t,e,[new La.default.type.Term(\"=\",[n,new La.default.type.Term(typeof p==\"object\"?JSON.stringify(p):p)])])},\"workspace_field_test/3\":(t,e,r)=>{let[o,a,n]=r.args;t.prepend([new La.default.type.State(e.goal.replace(new La.default.type.Term(\"workspace_field_test\",[o,a,n,new La.default.type.Term(\"[]\",[])])),e.substitution,e)])},\"workspace_field_test/4\":(t,e,r)=>{let[o,a,n,u]=r.args;if(!Qh(o)||!Qh(a)||!Qh(n)||!rdt(u)){t.throw_error(La.default.error.instantiation(r.indicator));return}let p=fH(t).tryWorkspaceByCwd(o.id);if(p==null)return;let h=(0,pH.default)(p.manifest.raw,a.id);if(typeof h>\"u\")return;let E={$$:h};for(let[v,x]of u.toJavaScript().entries())E[`$${v}`]=x;ume.default.runInNewContext(n.id,E)&&t.success(e)}},[\"project_workspaces_by_descriptor/3\",\"workspace_field/3\",\"workspace_field_test/3\",\"workspace_field_test/4\"])});var A2={};Vt(A2,{Constraints:()=>gH,DependencyType:()=>mme});function to(t){if(t instanceof NE.default.type.Num)return t.value;if(t instanceof NE.default.type.Term)switch(t.indicator){case\"throw/1\":return to(t.args[0]);case\"error/1\":return to(t.args[0]);case\"error/2\":if(t.args[0]instanceof NE.default.type.Term&&t.args[0].indicator===\"syntax_error/1\")return Object.assign(to(t.args[0]),...to(t.args[1]));{let e=to(t.args[0]);return e.message+=` (in ${to(t.args[1])})`,e}case\"syntax_error/1\":return new Jt(43,`Syntax error: ${to(t.args[0])}`);case\"existence_error/2\":return new Jt(44,`Existence error: ${to(t.args[0])} ${to(t.args[1])} not found`);case\"instantiation_error/0\":return new Jt(75,\"Instantiation error: an argument is variable when an instantiated argument was expected\");case\"line/1\":return{line:to(t.args[0])};case\"column/1\":return{column:to(t.args[0])};case\"found/1\":return{found:to(t.args[0])};case\"./2\":return[to(t.args[0])].concat(to(t.args[1]));case\"//2\":return`${to(t.args[0])}/${to(t.args[1])}`;default:return t.id}throw`couldn't pretty print because of unsupported node ${t}`}function gme(t){let e;try{e=to(t)}catch(r){throw typeof r==\"string\"?new Jt(42,`Unknown error: ${t} (note: ${r})`):r}return typeof e.line<\"u\"&&typeof e.column<\"u\"&&(e.message+=` at line ${e.line}, column ${e.column}`),e}function Gg(t){return t.id===\"null\"?null:`${t.toJavaScript()}`}function idt(t){if(t.id===\"null\")return null;{let e=t.toJavaScript();if(typeof e!=\"string\")return JSON.stringify(e);try{return JSON.stringify(JSON.parse(e))}catch{return JSON.stringify(e)}}}function Fh(t){return typeof t==\"string\"?`'${t}'`:\"[]\"}var dme,NE,mme,hme,hH,gH,f2=Et(()=>{Ge();Ge();Pt();dme=Ze(Kde()),NE=Ze(AH());l2();pme();(0,dme.default)(NE.default);mme=(o=>(o.Dependencies=\"dependencies\",o.DevDependencies=\"devDependencies\",o.PeerDependencies=\"peerDependencies\",o))(mme||{}),hme=[\"dependencies\",\"devDependencies\",\"peerDependencies\"];hH=class{constructor(e,r){let o=1e3*e.workspaces.length;this.session=NE.default.create(o),fme(this.session,e),this.session.consult(\":- use_module(library(lists)).\"),this.session.consult(r)}fetchNextAnswer(){return new Promise(e=>{this.session.answer(r=>{e(r)})})}async*makeQuery(e){let r=this.session.query(e);if(r!==!0)throw gme(r);for(;;){let o=await this.fetchNextAnswer();if(o===null)throw new Jt(79,\"Resolution limit exceeded\");if(!o)break;if(o.id===\"throw\")throw gme(o);yield o}}};gH=class t{constructor(e){this.source=\"\";this.project=e;let r=e.configuration.get(\"constraintsPath\");oe.existsSync(r)&&(this.source=oe.readFileSync(r,\"utf8\"))}static async find(e){return new t(e)}getProjectDatabase(){let e=\"\";for(let r of hme)e+=`dependency_type(${r}).\n`;for(let r of this.project.workspacesByCwd.values()){let o=r.relativeCwd;e+=`workspace(${Fh(o)}).\n`,e+=`workspace_ident(${Fh(o)}, ${Fh(G.stringifyIdent(r.anchoredLocator))}).\n`,e+=`workspace_version(${Fh(o)}, ${Fh(r.manifest.version)}).\n`;for(let a of hme)for(let n of r.manifest[a].values())e+=`workspace_has_dependency(${Fh(o)}, ${Fh(G.stringifyIdent(n))}, ${Fh(n.range)}, ${a}).\n`}return e+=`workspace(_) :- false.\n`,e+=`workspace_ident(_, _) :- false.\n`,e+=`workspace_version(_, _) :- false.\n`,e+=`workspace_has_dependency(_, _, _, _) :- false.\n`,e}getDeclarations(){let e=\"\";return e+=`gen_enforced_dependency(_, _, _, _) :- false.\n`,e+=`gen_enforced_field(_, _, _) :- false.\n`,e}get fullSource(){return`${this.getProjectDatabase()}\n${this.source}\n${this.getDeclarations()}`}createSession(){return new hH(this.project,this.fullSource)}async processClassic(){let e=this.createSession();return{enforcedDependencies:await this.genEnforcedDependencies(e),enforcedFields:await this.genEnforcedFields(e)}}async process(){let{enforcedDependencies:e,enforcedFields:r}=await this.processClassic(),o=new Map;for(let{workspace:a,dependencyIdent:n,dependencyRange:u,dependencyType:A}of e){let p=a2([A,G.stringifyIdent(n)]),h=He.getMapWithDefault(o,a.cwd);He.getMapWithDefault(h,p).set(u??void 0,new Set)}for(let{workspace:a,fieldPath:n,fieldValue:u}of r){let A=a2(n),p=He.getMapWithDefault(o,a.cwd);He.getMapWithDefault(p,A).set(JSON.parse(u)??void 0,new Set)}return{manifestUpdates:o,reportedErrors:new Map}}async genEnforcedDependencies(e){let r=[];for await(let o of e.makeQuery(\"workspace(WorkspaceCwd), dependency_type(DependencyType), gen_enforced_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType).\")){let a=V.resolve(this.project.cwd,Gg(o.links.WorkspaceCwd)),n=Gg(o.links.DependencyIdent),u=Gg(o.links.DependencyRange),A=Gg(o.links.DependencyType);if(a===null||n===null)throw new Error(\"Invalid rule\");let p=this.project.getWorkspaceByCwd(a),h=G.parseIdent(n);r.push({workspace:p,dependencyIdent:h,dependencyRange:u,dependencyType:A})}return He.sortMap(r,[({dependencyRange:o})=>o!==null?\"0\":\"1\",({workspace:o})=>G.stringifyIdent(o.anchoredLocator),({dependencyIdent:o})=>G.stringifyIdent(o)])}async genEnforcedFields(e){let r=[];for await(let o of e.makeQuery(\"workspace(WorkspaceCwd), gen_enforced_field(WorkspaceCwd, FieldPath, FieldValue).\")){let a=V.resolve(this.project.cwd,Gg(o.links.WorkspaceCwd)),n=Gg(o.links.FieldPath),u=idt(o.links.FieldValue);if(a===null||n===null)throw new Error(\"Invalid rule\");let A=this.project.getWorkspaceByCwd(a);r.push({workspace:A,fieldPath:n,fieldValue:u})}return He.sortMap(r,[({workspace:o})=>G.stringifyIdent(o.anchoredLocator),({fieldPath:o})=>o])}async*query(e){let r=this.createSession();for await(let o of r.makeQuery(e)){let a={};for(let[n,u]of Object.entries(o.links))n!==\"_\"&&(a[n]=Gg(u));yield a}}}});var Pme=_(Ak=>{\"use strict\";Object.defineProperty(Ak,\"__esModule\",{value:!0});function b2(t){let e=[...t.caches],r=e.shift();return r===void 0?Dme():{get(o,a,n={miss:()=>Promise.resolve()}){return r.get(o,a,n).catch(()=>b2({caches:e}).get(o,a,n))},set(o,a){return r.set(o,a).catch(()=>b2({caches:e}).set(o,a))},delete(o){return r.delete(o).catch(()=>b2({caches:e}).delete(o))},clear(){return r.clear().catch(()=>b2({caches:e}).clear())}}}function Dme(){return{get(t,e,r={miss:()=>Promise.resolve()}){return e().then(a=>Promise.all([a,r.miss(a)])).then(([a])=>a)},set(t,e){return Promise.resolve(e)},delete(t){return Promise.resolve()},clear(){return Promise.resolve()}}}Ak.createFallbackableCache=b2;Ak.createNullCache=Dme});var Sme=_((OWt,bme)=>{bme.exports=Pme()});var xme=_(xH=>{\"use strict\";Object.defineProperty(xH,\"__esModule\",{value:!0});function Bdt(t={serializable:!0}){let e={};return{get(r,o,a={miss:()=>Promise.resolve()}){let n=JSON.stringify(r);if(n in e)return Promise.resolve(t.serializable?JSON.parse(e[n]):e[n]);let u=o(),A=a&&a.miss||(()=>Promise.resolve());return u.then(p=>A(p)).then(()=>u)},set(r,o){return e[JSON.stringify(r)]=t.serializable?JSON.stringify(o):o,Promise.resolve(o)},delete(r){return delete e[JSON.stringify(r)],Promise.resolve()},clear(){return e={},Promise.resolve()}}}xH.createInMemoryCache=Bdt});var Qme=_((_Wt,kme)=>{kme.exports=xme()});var Rme=_(eu=>{\"use strict\";Object.defineProperty(eu,\"__esModule\",{value:!0});function vdt(t,e,r){let o={\"x-algolia-api-key\":r,\"x-algolia-application-id\":e};return{headers(){return t===kH.WithinHeaders?o:{}},queryParameters(){return t===kH.WithinQueryParameters?o:{}}}}function Ddt(t){let e=0,r=()=>(e++,new Promise(o=>{setTimeout(()=>{o(t(r))},Math.min(100*e,1e3))}));return t(r)}function Fme(t,e=(r,o)=>Promise.resolve()){return Object.assign(t,{wait(r){return Fme(t.then(o=>Promise.all([e(o,r),o])).then(o=>o[1]))}})}function Pdt(t){let e=t.length-1;for(e;e>0;e--){let r=Math.floor(Math.random()*(e+1)),o=t[e];t[e]=t[r],t[r]=o}return t}function bdt(t,e){return e&&Object.keys(e).forEach(r=>{t[r]=e[r](t)}),t}function Sdt(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}var xdt=\"4.22.1\",kdt=t=>()=>t.transporter.requester.destroy(),kH={WithinQueryParameters:0,WithinHeaders:1};eu.AuthMode=kH;eu.addMethods=bdt;eu.createAuth=vdt;eu.createRetryablePromise=Ddt;eu.createWaitablePromise=Fme;eu.destroy=kdt;eu.encode=Sdt;eu.shuffle=Pdt;eu.version=xdt});var S2=_((qWt,Tme)=>{Tme.exports=Rme()});var Nme=_(QH=>{\"use strict\";Object.defineProperty(QH,\"__esModule\",{value:!0});var Qdt={Delete:\"DELETE\",Get:\"GET\",Post:\"POST\",Put:\"PUT\"};QH.MethodEnum=Qdt});var x2=_((GWt,Lme)=>{Lme.exports=Nme()});var Xme=_(Qi=>{\"use strict\";Object.defineProperty(Qi,\"__esModule\",{value:!0});var Ome=x2();function FH(t,e){let r=t||{},o=r.data||{};return Object.keys(r).forEach(a=>{[\"timeout\",\"headers\",\"queryParameters\",\"data\",\"cacheable\"].indexOf(a)===-1&&(o[a]=r[a])}),{data:Object.entries(o).length>0?o:void 0,timeout:r.timeout||e,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var k2={Read:1,Write:2,Any:3},YE={Up:1,Down:2,Timeouted:3},Ume=2*60*1e3;function TH(t,e=YE.Up){return{...t,status:e,lastUpdate:Date.now()}}function _me(t){return t.status===YE.Up||Date.now()-t.lastUpdate>Ume}function Hme(t){return t.status===YE.Timeouted&&Date.now()-t.lastUpdate<=Ume}function NH(t){return typeof t==\"string\"?{protocol:\"https\",url:t,accept:k2.Any}:{protocol:t.protocol||\"https\",url:t.url,accept:t.accept||k2.Any}}function Fdt(t,e){return Promise.all(e.map(r=>t.get(r,()=>Promise.resolve(TH(r))))).then(r=>{let o=r.filter(A=>_me(A)),a=r.filter(A=>Hme(A)),n=[...o,...a],u=n.length>0?n.map(A=>NH(A)):e;return{getTimeout(A,p){return(a.length===0&&A===0?1:a.length+3+A)*p},statelessHosts:u}})}var Rdt=({isTimedOut:t,status:e})=>!t&&~~e===0,Tdt=t=>{let e=t.status;return t.isTimedOut||Rdt(t)||~~(e/100)!==2&&~~(e/100)!==4},Ndt=({status:t})=>~~(t/100)===2,Ldt=(t,e)=>Tdt(t)?e.onRetry(t):Ndt(t)?e.onSuccess(t):e.onFail(t);function Mme(t,e,r,o){let a=[],n=Wme(r,o),u=Kme(t,o),A=r.method,p=r.method!==Ome.MethodEnum.Get?{}:{...r.data,...o.data},h={\"x-algolia-agent\":t.userAgent.value,...t.queryParameters,...p,...o.queryParameters},E=0,I=(v,x)=>{let C=v.pop();if(C===void 0)throw Jme(RH(a));let R={data:n,headers:u,method:A,url:Gme(C,r.path,h),connectTimeout:x(E,t.timeouts.connect),responseTimeout:x(E,o.timeout)},L=z=>{let te={request:R,response:z,host:C,triesLeft:v.length};return a.push(te),te},U={onSuccess:z=>qme(z),onRetry(z){let te=L(z);return z.isTimedOut&&E++,Promise.all([t.logger.info(\"Retryable failure\",LH(te)),t.hostsCache.set(C,TH(C,z.isTimedOut?YE.Timeouted:YE.Down))]).then(()=>I(v,x))},onFail(z){throw L(z),jme(z,RH(a))}};return t.requester.send(R).then(z=>Ldt(z,U))};return Fdt(t.hostsCache,e).then(v=>I([...v.statelessHosts].reverse(),v.getTimeout))}function Mdt(t){let{hostsCache:e,logger:r,requester:o,requestsCache:a,responsesCache:n,timeouts:u,userAgent:A,hosts:p,queryParameters:h,headers:E}=t,I={hostsCache:e,logger:r,requester:o,requestsCache:a,responsesCache:n,timeouts:u,userAgent:A,headers:E,queryParameters:h,hosts:p.map(v=>NH(v)),read(v,x){let C=FH(x,I.timeouts.read),R=()=>Mme(I,I.hosts.filter(z=>(z.accept&k2.Read)!==0),v,C);if((C.cacheable!==void 0?C.cacheable:v.cacheable)!==!0)return R();let U={request:v,mappedRequestOptions:C,transporter:{queryParameters:I.queryParameters,headers:I.headers}};return I.responsesCache.get(U,()=>I.requestsCache.get(U,()=>I.requestsCache.set(U,R()).then(z=>Promise.all([I.requestsCache.delete(U),z]),z=>Promise.all([I.requestsCache.delete(U),Promise.reject(z)])).then(([z,te])=>te)),{miss:z=>I.responsesCache.set(U,z)})},write(v,x){return Mme(I,I.hosts.filter(C=>(C.accept&k2.Write)!==0),v,FH(x,I.timeouts.write))}};return I}function Odt(t){let e={value:`Algolia for JavaScript (${t})`,add(r){let o=`; ${r.segment}${r.version!==void 0?` (${r.version})`:\"\"}`;return e.value.indexOf(o)===-1&&(e.value=`${e.value}${o}`),e}};return e}function qme(t){try{return JSON.parse(t.content)}catch(e){throw zme(e.message,t)}}function jme({content:t,status:e},r){let o=t;try{o=JSON.parse(t).message}catch{}return Vme(o,e,r)}function Udt(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}function Gme(t,e,r){let o=Yme(r),a=`${t.protocol}://${t.url}/${e.charAt(0)===\"/\"?e.substr(1):e}`;return o.length&&(a+=`?${o}`),a}function Yme(t){let e=r=>Object.prototype.toString.call(r)===\"[object Object]\"||Object.prototype.toString.call(r)===\"[object Array]\";return Object.keys(t).map(r=>Udt(\"%s=%s\",r,e(t[r])?JSON.stringify(t[r]):t[r])).join(\"&\")}function Wme(t,e){if(t.method===Ome.MethodEnum.Get||t.data===void 0&&e.data===void 0)return;let r=Array.isArray(t.data)?t.data:{...t.data,...e.data};return JSON.stringify(r)}function Kme(t,e){let r={...t.headers,...e.headers},o={};return Object.keys(r).forEach(a=>{let n=r[a];o[a.toLowerCase()]=n}),o}function RH(t){return t.map(e=>LH(e))}function LH(t){let e=t.request.headers[\"x-algolia-api-key\"]?{\"x-algolia-api-key\":\"*****\"}:{};return{...t,request:{...t.request,headers:{...t.request.headers,...e}}}}function Vme(t,e,r){return{name:\"ApiError\",message:t,status:e,transporterStackTrace:r}}function zme(t,e){return{name:\"DeserializationError\",message:t,response:e}}function Jme(t){return{name:\"RetryError\",message:\"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.\",transporterStackTrace:t}}Qi.CallEnum=k2;Qi.HostStatusEnum=YE;Qi.createApiError=Vme;Qi.createDeserializationError=zme;Qi.createMappedRequestOptions=FH;Qi.createRetryError=Jme;Qi.createStatefulHost=TH;Qi.createStatelessHost=NH;Qi.createTransporter=Mdt;Qi.createUserAgent=Odt;Qi.deserializeFailure=jme;Qi.deserializeSuccess=qme;Qi.isStatefulHostTimeouted=Hme;Qi.isStatefulHostUp=_me;Qi.serializeData=Wme;Qi.serializeHeaders=Kme;Qi.serializeQueryParameters=Yme;Qi.serializeUrl=Gme;Qi.stackFrameWithoutCredentials=LH;Qi.stackTraceWithoutCredentials=RH});var Q2=_((WWt,Zme)=>{Zme.exports=Xme()});var $me=_(Rh=>{\"use strict\";Object.defineProperty(Rh,\"__esModule\",{value:!0});var WE=S2(),_dt=Q2(),F2=x2(),Hdt=t=>{let e=t.region||\"us\",r=WE.createAuth(WE.AuthMode.WithinHeaders,t.appId,t.apiKey),o=_dt.createTransporter({hosts:[{url:`analytics.${e}.algolia.com`}],...t,headers:{...r.headers(),\"content-type\":\"application/json\",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a=t.appId;return WE.addMethods({appId:a,transporter:o},t.methods)},qdt=t=>(e,r)=>t.transporter.write({method:F2.MethodEnum.Post,path:\"2/abtests\",data:e},r),jdt=t=>(e,r)=>t.transporter.write({method:F2.MethodEnum.Delete,path:WE.encode(\"2/abtests/%s\",e)},r),Gdt=t=>(e,r)=>t.transporter.read({method:F2.MethodEnum.Get,path:WE.encode(\"2/abtests/%s\",e)},r),Ydt=t=>e=>t.transporter.read({method:F2.MethodEnum.Get,path:\"2/abtests\"},e),Wdt=t=>(e,r)=>t.transporter.write({method:F2.MethodEnum.Post,path:WE.encode(\"2/abtests/%s/stop\",e)},r);Rh.addABTest=qdt;Rh.createAnalyticsClient=Hdt;Rh.deleteABTest=jdt;Rh.getABTest=Gdt;Rh.getABTests=Ydt;Rh.stopABTest=Wdt});var tye=_((VWt,eye)=>{eye.exports=$me()});var nye=_(R2=>{\"use strict\";Object.defineProperty(R2,\"__esModule\",{value:!0});var MH=S2(),Kdt=Q2(),rye=x2(),Vdt=t=>{let e=t.region||\"us\",r=MH.createAuth(MH.AuthMode.WithinHeaders,t.appId,t.apiKey),o=Kdt.createTransporter({hosts:[{url:`personalization.${e}.algolia.com`}],...t,headers:{...r.headers(),\"content-type\":\"application/json\",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}});return MH.addMethods({appId:t.appId,transporter:o},t.methods)},zdt=t=>e=>t.transporter.read({method:rye.MethodEnum.Get,path:\"1/strategies/personalization\"},e),Jdt=t=>(e,r)=>t.transporter.write({method:rye.MethodEnum.Post,path:\"1/strategies/personalization\",data:e},r);R2.createPersonalizationClient=Vdt;R2.getPersonalizationStrategy=zdt;R2.setPersonalizationStrategy=Jdt});var sye=_((JWt,iye)=>{iye.exports=nye()});var Eye=_(Ft=>{\"use strict\";Object.defineProperty(Ft,\"__esModule\",{value:!0});var Gt=S2(),Ma=Q2(),Ir=x2(),Xdt=ve(\"crypto\");function fk(t){let e=r=>t.request(r).then(o=>{if(t.batch!==void 0&&t.batch(o.hits),!t.shouldStop(o))return o.cursor?e({cursor:o.cursor}):e({page:(r.page||0)+1})});return e({})}var Zdt=t=>{let e=t.appId,r=Gt.createAuth(t.authMode!==void 0?t.authMode:Gt.AuthMode.WithinHeaders,e,t.apiKey),o=Ma.createTransporter({hosts:[{url:`${e}-dsn.algolia.net`,accept:Ma.CallEnum.Read},{url:`${e}.algolia.net`,accept:Ma.CallEnum.Write}].concat(Gt.shuffle([{url:`${e}-1.algolianet.com`},{url:`${e}-2.algolianet.com`},{url:`${e}-3.algolianet.com`}])),...t,headers:{...r.headers(),\"content-type\":\"application/x-www-form-urlencoded\",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a={transporter:o,appId:e,addAlgoliaAgent(n,u){o.userAgent.add({segment:n,version:u})},clearCache(){return Promise.all([o.requestsCache.clear(),o.responsesCache.clear()]).then(()=>{})}};return Gt.addMethods(a,t.methods)};function oye(){return{name:\"MissingObjectIDError\",message:\"All objects must have an unique objectID (like a primary key) to be valid. Algolia is also able to generate objectIDs automatically but *it's not recommended*. To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option.\"}}function aye(){return{name:\"ObjectNotFoundError\",message:\"Object not found.\"}}function lye(){return{name:\"ValidUntilNotFoundError\",message:\"ValidUntil not found in given secured api key.\"}}var $dt=t=>(e,r)=>{let{queryParameters:o,...a}=r||{},n={acl:e,...o!==void 0?{queryParameters:o}:{}},u=(A,p)=>Gt.createRetryablePromise(h=>T2(t)(A.key,p).catch(E=>{if(E.status!==404)throw E;return h()}));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:\"1/keys\",data:n},a),u)},emt=t=>(e,r,o)=>{let a=Ma.createMappedRequestOptions(o);return a.queryParameters[\"X-Algolia-User-ID\"]=e,t.transporter.write({method:Ir.MethodEnum.Post,path:\"1/clusters/mapping\",data:{cluster:r}},a)},tmt=t=>(e,r,o)=>t.transporter.write({method:Ir.MethodEnum.Post,path:\"1/clusters/mapping/batch\",data:{users:e,cluster:r}},o),rmt=t=>(e,r)=>Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"/1/dictionaries/%s/batch\",e),data:{clearExistingDictionaryEntries:!0,requests:{action:\"addEntry\",body:[]}}},r),(o,a)=>KE(t)(o.taskID,a)),pk=t=>(e,r,o)=>{let a=(n,u)=>N2(t)(e,{methods:{waitTask:es}}).waitTask(n.taskID,u);return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/operation\",e),data:{operation:\"copy\",destination:r}},o),a)},nmt=t=>(e,r,o)=>pk(t)(e,r,{...o,scope:[gk.Rules]}),imt=t=>(e,r,o)=>pk(t)(e,r,{...o,scope:[gk.Settings]}),smt=t=>(e,r,o)=>pk(t)(e,r,{...o,scope:[gk.Synonyms]}),omt=t=>(e,r)=>e.method===Ir.MethodEnum.Get?t.transporter.read(e,r):t.transporter.write(e,r),amt=t=>(e,r)=>{let o=(a,n)=>Gt.createRetryablePromise(u=>T2(t)(e,n).then(u).catch(A=>{if(A.status!==404)throw A}));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Delete,path:Gt.encode(\"1/keys/%s\",e)},r),o)},lmt=t=>(e,r,o)=>{let a=r.map(n=>({action:\"deleteEntry\",body:{objectID:n}}));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"/1/dictionaries/%s/batch\",e),data:{clearExistingDictionaryEntries:!1,requests:a}},o),(n,u)=>KE(t)(n.taskID,u))},cmt=()=>(t,e)=>{let r=Ma.serializeQueryParameters(e),o=Xdt.createHmac(\"sha256\",t).update(r).digest(\"hex\");return Buffer.from(o+r).toString(\"base64\")},T2=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode(\"1/keys/%s\",e)},r),cye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode(\"1/task/%s\",e.toString())},r),umt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:\"/1/dictionaries/*/settings\"},e),Amt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:\"1/logs\"},e),fmt=()=>t=>{let e=Buffer.from(t,\"base64\").toString(\"ascii\"),r=/validUntil=(\\d+)/,o=e.match(r);if(o===null)throw lye();return parseInt(o[1],10)-Math.round(new Date().getTime()/1e3)},pmt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:\"1/clusters/mapping/top\"},e),hmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode(\"1/clusters/mapping/%s\",e)},r),gmt=t=>e=>{let{retrieveMappings:r,...o}=e||{};return r===!0&&(o.getClusters=!0),t.transporter.read({method:Ir.MethodEnum.Get,path:\"1/clusters/mapping/pending\"},o)},N2=t=>(e,r={})=>{let o={transporter:t.transporter,appId:t.appId,indexName:e};return Gt.addMethods(o,r.methods)},dmt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:\"1/keys\"},e),mmt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:\"1/clusters\"},e),ymt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:\"1/indexes\"},e),Emt=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:\"1/clusters/mapping\"},e),Cmt=t=>(e,r,o)=>{let a=(n,u)=>N2(t)(e,{methods:{waitTask:es}}).waitTask(n.taskID,u);return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/operation\",e),data:{operation:\"move\",destination:r}},o),a)},wmt=t=>(e,r)=>{let o=(a,n)=>Promise.all(Object.keys(a.taskID).map(u=>N2(t)(u,{methods:{waitTask:es}}).waitTask(a.taskID[u],n)));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:\"1/indexes/*/batch\",data:{requests:e}},r),o)},Imt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:\"1/indexes/*/objects\",data:{requests:e}},r),Bmt=t=>(e,r)=>{let o=e.map(a=>({...a,params:Ma.serializeQueryParameters(a.params||{})}));return t.transporter.read({method:Ir.MethodEnum.Post,path:\"1/indexes/*/queries\",data:{requests:o},cacheable:!0},r)},vmt=t=>(e,r)=>Promise.all(e.map(o=>{let{facetName:a,facetQuery:n,...u}=o.params;return N2(t)(o.indexName,{methods:{searchForFacetValues:dye}}).searchForFacetValues(a,n,{...r,...u})})),Dmt=t=>(e,r)=>{let o=Ma.createMappedRequestOptions(r);return o.queryParameters[\"X-Algolia-User-ID\"]=e,t.transporter.write({method:Ir.MethodEnum.Delete,path:\"1/clusters/mapping\"},o)},Pmt=t=>(e,r,o)=>{let a=r.map(n=>({action:\"addEntry\",body:n}));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"/1/dictionaries/%s/batch\",e),data:{clearExistingDictionaryEntries:!0,requests:a}},o),(n,u)=>KE(t)(n.taskID,u))},bmt=t=>(e,r)=>{let o=(a,n)=>Gt.createRetryablePromise(u=>T2(t)(e,n).catch(A=>{if(A.status!==404)throw A;return u()}));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/keys/%s/restore\",e)},r),o)},Smt=t=>(e,r,o)=>{let a=r.map(n=>({action:\"addEntry\",body:n}));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"/1/dictionaries/%s/batch\",e),data:{clearExistingDictionaryEntries:!1,requests:a}},o),(n,u)=>KE(t)(n.taskID,u))},xmt=t=>(e,r,o)=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode(\"/1/dictionaries/%s/search\",e),data:{query:r},cacheable:!0},o),kmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:\"1/clusters/mapping/search\",data:{query:e}},r),Qmt=t=>(e,r)=>Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Put,path:\"/1/dictionaries/*/settings\",data:e},r),(o,a)=>KE(t)(o.taskID,a)),Fmt=t=>(e,r)=>{let o=Object.assign({},r),{queryParameters:a,...n}=r||{},u=a?{queryParameters:a}:{},A=[\"acl\",\"indexes\",\"referers\",\"restrictSources\",\"queryParameters\",\"description\",\"maxQueriesPerIPPerHour\",\"maxHitsPerQuery\"],p=E=>Object.keys(o).filter(I=>A.indexOf(I)!==-1).every(I=>{if(Array.isArray(E[I])&&Array.isArray(o[I])){let v=E[I];return v.length===o[I].length&&v.every((x,C)=>x===o[I][C])}else return E[I]===o[I]}),h=(E,I)=>Gt.createRetryablePromise(v=>T2(t)(e,I).then(x=>p(x)?Promise.resolve():v()));return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Put,path:Gt.encode(\"1/keys/%s\",e),data:u},n),h)},KE=t=>(e,r)=>Gt.createRetryablePromise(o=>cye(t)(e,r).then(a=>a.status!==\"published\"?o():void 0)),uye=t=>(e,r)=>{let o=(a,n)=>es(t)(a.taskID,n);return Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/batch\",t.indexName),data:{requests:e}},r),o)},Rmt=t=>e=>fk({shouldStop:r=>r.cursor===void 0,...e,request:r=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/browse\",t.indexName),data:r},e)}),Tmt=t=>e=>{let r={hitsPerPage:1e3,...e};return fk({shouldStop:o=>o.hits.length<r.hitsPerPage,...r,request(o){return mye(t)(\"\",{...r,...o}).then(a=>({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},Nmt=t=>e=>{let r={hitsPerPage:1e3,...e};return fk({shouldStop:o=>o.hits.length<r.hitsPerPage,...r,request(o){return yye(t)(\"\",{...r,...o}).then(a=>({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},hk=t=>(e,r,o)=>{let{batchSize:a,...n}=o||{},u={taskIDs:[],objectIDs:[]},A=(p=0)=>{let h=[],E;for(E=p;E<e.length&&(h.push(e[E]),h.length!==(a||1e3));E++);return h.length===0?Promise.resolve(u):uye(t)(h.map(I=>({action:r,body:I})),n).then(I=>(u.objectIDs=u.objectIDs.concat(I.objectIDs),u.taskIDs.push(I.taskID),E++,A(E)))};return Gt.createWaitablePromise(A(),(p,h)=>Promise.all(p.taskIDs.map(E=>es(t)(E,h))))},Lmt=t=>e=>Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/clear\",t.indexName)},e),(r,o)=>es(t)(r.taskID,o)),Mmt=t=>e=>{let{forwardToReplicas:r,...o}=e||{},a=Ma.createMappedRequestOptions(o);return r&&(a.queryParameters.forwardToReplicas=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/rules/clear\",t.indexName)},a),(n,u)=>es(t)(n.taskID,u))},Omt=t=>e=>{let{forwardToReplicas:r,...o}=e||{},a=Ma.createMappedRequestOptions(o);return r&&(a.queryParameters.forwardToReplicas=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/synonyms/clear\",t.indexName)},a),(n,u)=>es(t)(n.taskID,u))},Umt=t=>(e,r)=>Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/deleteByQuery\",t.indexName),data:e},r),(o,a)=>es(t)(o.taskID,a)),_mt=t=>e=>Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Delete,path:Gt.encode(\"1/indexes/%s\",t.indexName)},e),(r,o)=>es(t)(r.taskID,o)),Hmt=t=>(e,r)=>Gt.createWaitablePromise(Aye(t)([e],r).then(o=>({taskID:o.taskIDs[0]})),(o,a)=>es(t)(o.taskID,a)),Aye=t=>(e,r)=>{let o=e.map(a=>({objectID:a}));return hk(t)(o,Wg.DeleteObject,r)},qmt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Ma.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Delete,path:Gt.encode(\"1/indexes/%s/rules/%s\",t.indexName,e)},n),(u,A)=>es(t)(u.taskID,A))},jmt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Ma.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Delete,path:Gt.encode(\"1/indexes/%s/synonyms/%s\",t.indexName,e)},n),(u,A)=>es(t)(u.taskID,A))},Gmt=t=>e=>fye(t)(e).then(()=>!0).catch(r=>{if(r.status!==404)throw r;return!1}),Ymt=t=>(e,r,o)=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/answers/%s/prediction\",t.indexName),data:{query:e,queryLanguages:r},cacheable:!0},o),Wmt=t=>(e,r)=>{let{query:o,paginate:a,...n}=r||{},u=0,A=()=>gye(t)(o||\"\",{...n,page:u}).then(p=>{for(let[h,E]of Object.entries(p.hits))if(e(E))return{object:E,position:parseInt(h,10),page:u};if(u++,a===!1||u>=p.nbPages)throw aye();return A()});return A()},Kmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode(\"1/indexes/%s/%s\",t.indexName,e)},r),Vmt=()=>(t,e)=>{for(let[r,o]of Object.entries(t.hits))if(o.objectID===e)return parseInt(r,10);return-1},zmt=t=>(e,r)=>{let{attributesToRetrieve:o,...a}=r||{},n=e.map(u=>({indexName:t.indexName,objectID:u,...o?{attributesToRetrieve:o}:{}}));return t.transporter.read({method:Ir.MethodEnum.Post,path:\"1/indexes/*/objects\",data:{requests:n}},a)},Jmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode(\"1/indexes/%s/rules/%s\",t.indexName,e)},r),fye=t=>e=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode(\"1/indexes/%s/settings\",t.indexName),data:{getVersion:2}},e),Xmt=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode(\"1/indexes/%s/synonyms/%s\",t.indexName,e)},r),pye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Get,path:Gt.encode(\"1/indexes/%s/task/%s\",t.indexName,e.toString())},r),Zmt=t=>(e,r)=>Gt.createWaitablePromise(hye(t)([e],r).then(o=>({objectID:o.objectIDs[0],taskID:o.taskIDs[0]})),(o,a)=>es(t)(o.taskID,a)),hye=t=>(e,r)=>{let{createIfNotExists:o,...a}=r||{},n=o?Wg.PartialUpdateObject:Wg.PartialUpdateObjectNoCreate;return hk(t)(e,n,a)},$mt=t=>(e,r)=>{let{safe:o,autoGenerateObjectIDIfNotExist:a,batchSize:n,...u}=r||{},A=(C,R,L,U)=>Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/operation\",C),data:{operation:L,destination:R}},U),(z,te)=>es(t)(z.taskID,te)),p=Math.random().toString(36).substring(7),h=`${t.indexName}_tmp_${p}`,E=OH({appId:t.appId,transporter:t.transporter,indexName:h}),I=[],v=A(t.indexName,h,\"copy\",{...u,scope:[\"settings\",\"synonyms\",\"rules\"]});I.push(v);let x=(o?v.wait(u):v).then(()=>{let C=E(e,{...u,autoGenerateObjectIDIfNotExist:a,batchSize:n});return I.push(C),o?C.wait(u):C}).then(()=>{let C=A(h,t.indexName,\"move\",u);return I.push(C),o?C.wait(u):C}).then(()=>Promise.all(I)).then(([C,R,L])=>({objectIDs:R.objectIDs,taskIDs:[C.taskID,...R.taskIDs,L.taskID]}));return Gt.createWaitablePromise(x,(C,R)=>Promise.all(I.map(L=>L.wait(R))))},eyt=t=>(e,r)=>UH(t)(e,{...r,clearExistingRules:!0}),tyt=t=>(e,r)=>_H(t)(e,{...r,clearExistingSynonyms:!0}),ryt=t=>(e,r)=>Gt.createWaitablePromise(OH(t)([e],r).then(o=>({objectID:o.objectIDs[0],taskID:o.taskIDs[0]})),(o,a)=>es(t)(o.taskID,a)),OH=t=>(e,r)=>{let{autoGenerateObjectIDIfNotExist:o,...a}=r||{},n=o?Wg.AddObject:Wg.UpdateObject;if(n===Wg.UpdateObject){for(let u of e)if(u.objectID===void 0)return Gt.createWaitablePromise(Promise.reject(oye()))}return hk(t)(e,n,a)},nyt=t=>(e,r)=>UH(t)([e],r),UH=t=>(e,r)=>{let{forwardToReplicas:o,clearExistingRules:a,...n}=r||{},u=Ma.createMappedRequestOptions(n);return o&&(u.queryParameters.forwardToReplicas=1),a&&(u.queryParameters.clearExistingRules=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/rules/batch\",t.indexName),data:e},u),(A,p)=>es(t)(A.taskID,p))},iyt=t=>(e,r)=>_H(t)([e],r),_H=t=>(e,r)=>{let{forwardToReplicas:o,clearExistingSynonyms:a,replaceExistingSynonyms:n,...u}=r||{},A=Ma.createMappedRequestOptions(u);return o&&(A.queryParameters.forwardToReplicas=1),(n||a)&&(A.queryParameters.replaceExistingSynonyms=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/synonyms/batch\",t.indexName),data:e},A),(p,h)=>es(t)(p.taskID,h))},gye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/query\",t.indexName),data:{query:e},cacheable:!0},r),dye=t=>(e,r,o)=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/facets/%s/query\",t.indexName,e),data:{facetQuery:r},cacheable:!0},o),mye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/rules/search\",t.indexName),data:{query:e}},r),yye=t=>(e,r)=>t.transporter.read({method:Ir.MethodEnum.Post,path:Gt.encode(\"1/indexes/%s/synonyms/search\",t.indexName),data:{query:e}},r),syt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Ma.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Gt.createWaitablePromise(t.transporter.write({method:Ir.MethodEnum.Put,path:Gt.encode(\"1/indexes/%s/settings\",t.indexName),data:e},n),(u,A)=>es(t)(u.taskID,A))},es=t=>(e,r)=>Gt.createRetryablePromise(o=>pye(t)(e,r).then(a=>a.status!==\"published\"?o():void 0)),oyt={AddObject:\"addObject\",Analytics:\"analytics\",Browser:\"browse\",DeleteIndex:\"deleteIndex\",DeleteObject:\"deleteObject\",EditSettings:\"editSettings\",Inference:\"inference\",ListIndexes:\"listIndexes\",Logs:\"logs\",Personalization:\"personalization\",Recommendation:\"recommendation\",Search:\"search\",SeeUnretrievableAttributes:\"seeUnretrievableAttributes\",Settings:\"settings\",Usage:\"usage\"},Wg={AddObject:\"addObject\",UpdateObject:\"updateObject\",PartialUpdateObject:\"partialUpdateObject\",PartialUpdateObjectNoCreate:\"partialUpdateObjectNoCreate\",DeleteObject:\"deleteObject\",DeleteIndex:\"delete\",ClearIndex:\"clear\"},gk={Settings:\"settings\",Synonyms:\"synonyms\",Rules:\"rules\"},ayt={None:\"none\",StopIfEnoughMatches:\"stopIfEnoughMatches\"},lyt={Synonym:\"synonym\",OneWaySynonym:\"oneWaySynonym\",AltCorrection1:\"altCorrection1\",AltCorrection2:\"altCorrection2\",Placeholder:\"placeholder\"};Ft.ApiKeyACLEnum=oyt;Ft.BatchActionEnum=Wg;Ft.ScopeEnum=gk;Ft.StrategyEnum=ayt;Ft.SynonymEnum=lyt;Ft.addApiKey=$dt;Ft.assignUserID=emt;Ft.assignUserIDs=tmt;Ft.batch=uye;Ft.browseObjects=Rmt;Ft.browseRules=Tmt;Ft.browseSynonyms=Nmt;Ft.chunkedBatch=hk;Ft.clearDictionaryEntries=rmt;Ft.clearObjects=Lmt;Ft.clearRules=Mmt;Ft.clearSynonyms=Omt;Ft.copyIndex=pk;Ft.copyRules=nmt;Ft.copySettings=imt;Ft.copySynonyms=smt;Ft.createBrowsablePromise=fk;Ft.createMissingObjectIDError=oye;Ft.createObjectNotFoundError=aye;Ft.createSearchClient=Zdt;Ft.createValidUntilNotFoundError=lye;Ft.customRequest=omt;Ft.deleteApiKey=amt;Ft.deleteBy=Umt;Ft.deleteDictionaryEntries=lmt;Ft.deleteIndex=_mt;Ft.deleteObject=Hmt;Ft.deleteObjects=Aye;Ft.deleteRule=qmt;Ft.deleteSynonym=jmt;Ft.exists=Gmt;Ft.findAnswers=Ymt;Ft.findObject=Wmt;Ft.generateSecuredApiKey=cmt;Ft.getApiKey=T2;Ft.getAppTask=cye;Ft.getDictionarySettings=umt;Ft.getLogs=Amt;Ft.getObject=Kmt;Ft.getObjectPosition=Vmt;Ft.getObjects=zmt;Ft.getRule=Jmt;Ft.getSecuredApiKeyRemainingValidity=fmt;Ft.getSettings=fye;Ft.getSynonym=Xmt;Ft.getTask=pye;Ft.getTopUserIDs=pmt;Ft.getUserID=hmt;Ft.hasPendingMappings=gmt;Ft.initIndex=N2;Ft.listApiKeys=dmt;Ft.listClusters=mmt;Ft.listIndices=ymt;Ft.listUserIDs=Emt;Ft.moveIndex=Cmt;Ft.multipleBatch=wmt;Ft.multipleGetObjects=Imt;Ft.multipleQueries=Bmt;Ft.multipleSearchForFacetValues=vmt;Ft.partialUpdateObject=Zmt;Ft.partialUpdateObjects=hye;Ft.removeUserID=Dmt;Ft.replaceAllObjects=$mt;Ft.replaceAllRules=eyt;Ft.replaceAllSynonyms=tyt;Ft.replaceDictionaryEntries=Pmt;Ft.restoreApiKey=bmt;Ft.saveDictionaryEntries=Smt;Ft.saveObject=ryt;Ft.saveObjects=OH;Ft.saveRule=nyt;Ft.saveRules=UH;Ft.saveSynonym=iyt;Ft.saveSynonyms=_H;Ft.search=gye;Ft.searchDictionaryEntries=xmt;Ft.searchForFacetValues=dye;Ft.searchRules=mye;Ft.searchSynonyms=yye;Ft.searchUserIDs=kmt;Ft.setDictionarySettings=Qmt;Ft.setSettings=syt;Ft.updateApiKey=Fmt;Ft.waitAppTask=KE;Ft.waitTask=es});var wye=_((ZWt,Cye)=>{Cye.exports=Eye()});var Iye=_(dk=>{\"use strict\";Object.defineProperty(dk,\"__esModule\",{value:!0});function cyt(){return{debug(t,e){return Promise.resolve()},info(t,e){return Promise.resolve()},error(t,e){return Promise.resolve()}}}var uyt={Debug:1,Info:2,Error:3};dk.LogLevelEnum=uyt;dk.createNullLogger=cyt});var vye=_((eKt,Bye)=>{Bye.exports=Iye()});var Sye=_(HH=>{\"use strict\";Object.defineProperty(HH,\"__esModule\",{value:!0});var Dye=ve(\"http\"),Pye=ve(\"https\"),Ayt=ve(\"url\"),bye={keepAlive:!0},fyt=new Dye.Agent(bye),pyt=new Pye.Agent(bye);function hyt({agent:t,httpAgent:e,httpsAgent:r,requesterOptions:o={}}={}){let a=e||t||fyt,n=r||t||pyt;return{send(u){return new Promise(A=>{let p=Ayt.parse(u.url),h=p.query===null?p.pathname:`${p.pathname}?${p.query}`,E={...o,agent:p.protocol===\"https:\"?n:a,hostname:p.hostname,path:h,method:u.method,headers:{...o&&o.headers?o.headers:{},...u.headers},...p.port!==void 0?{port:p.port||\"\"}:{}},I=(p.protocol===\"https:\"?Pye:Dye).request(E,R=>{let L=[];R.on(\"data\",U=>{L=L.concat(U)}),R.on(\"end\",()=>{clearTimeout(x),clearTimeout(C),A({status:R.statusCode||0,content:Buffer.concat(L).toString(),isTimedOut:!1})})}),v=(R,L)=>setTimeout(()=>{I.abort(),A({status:0,content:L,isTimedOut:!0})},R*1e3),x=v(u.connectTimeout,\"Connection timeout\"),C;I.on(\"error\",R=>{clearTimeout(x),clearTimeout(C),A({status:0,content:R.message,isTimedOut:!1})}),I.once(\"response\",()=>{clearTimeout(x),C=v(u.responseTimeout,\"Socket timeout\")}),u.data!==void 0&&I.write(u.data),I.end()})},destroy(){return a.destroy(),n.destroy(),Promise.resolve()}}}HH.createNodeHttpRequester=hyt});var kye=_((rKt,xye)=>{xye.exports=Sye()});var Tye=_((nKt,Rye)=>{\"use strict\";var Qye=Sme(),gyt=Qme(),VE=tye(),jH=S2(),qH=sye(),_t=wye(),dyt=vye(),myt=kye(),yyt=Q2();function Fye(t,e,r){let o={appId:t,apiKey:e,timeouts:{connect:2,read:5,write:30},requester:myt.createNodeHttpRequester(),logger:dyt.createNullLogger(),responsesCache:Qye.createNullCache(),requestsCache:Qye.createNullCache(),hostsCache:gyt.createInMemoryCache(),userAgent:yyt.createUserAgent(jH.version).add({segment:\"Node.js\",version:process.versions.node})},a={...o,...r},n=()=>u=>qH.createPersonalizationClient({...o,...u,methods:{getPersonalizationStrategy:qH.getPersonalizationStrategy,setPersonalizationStrategy:qH.setPersonalizationStrategy}});return _t.createSearchClient({...a,methods:{search:_t.multipleQueries,searchForFacetValues:_t.multipleSearchForFacetValues,multipleBatch:_t.multipleBatch,multipleGetObjects:_t.multipleGetObjects,multipleQueries:_t.multipleQueries,copyIndex:_t.copyIndex,copySettings:_t.copySettings,copyRules:_t.copyRules,copySynonyms:_t.copySynonyms,moveIndex:_t.moveIndex,listIndices:_t.listIndices,getLogs:_t.getLogs,listClusters:_t.listClusters,multipleSearchForFacetValues:_t.multipleSearchForFacetValues,getApiKey:_t.getApiKey,addApiKey:_t.addApiKey,listApiKeys:_t.listApiKeys,updateApiKey:_t.updateApiKey,deleteApiKey:_t.deleteApiKey,restoreApiKey:_t.restoreApiKey,assignUserID:_t.assignUserID,assignUserIDs:_t.assignUserIDs,getUserID:_t.getUserID,searchUserIDs:_t.searchUserIDs,listUserIDs:_t.listUserIDs,getTopUserIDs:_t.getTopUserIDs,removeUserID:_t.removeUserID,hasPendingMappings:_t.hasPendingMappings,generateSecuredApiKey:_t.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:_t.getSecuredApiKeyRemainingValidity,destroy:jH.destroy,clearDictionaryEntries:_t.clearDictionaryEntries,deleteDictionaryEntries:_t.deleteDictionaryEntries,getDictionarySettings:_t.getDictionarySettings,getAppTask:_t.getAppTask,replaceDictionaryEntries:_t.replaceDictionaryEntries,saveDictionaryEntries:_t.saveDictionaryEntries,searchDictionaryEntries:_t.searchDictionaryEntries,setDictionarySettings:_t.setDictionarySettings,waitAppTask:_t.waitAppTask,customRequest:_t.customRequest,initIndex:u=>A=>_t.initIndex(u)(A,{methods:{batch:_t.batch,delete:_t.deleteIndex,findAnswers:_t.findAnswers,getObject:_t.getObject,getObjects:_t.getObjects,saveObject:_t.saveObject,saveObjects:_t.saveObjects,search:_t.search,searchForFacetValues:_t.searchForFacetValues,waitTask:_t.waitTask,setSettings:_t.setSettings,getSettings:_t.getSettings,partialUpdateObject:_t.partialUpdateObject,partialUpdateObjects:_t.partialUpdateObjects,deleteObject:_t.deleteObject,deleteObjects:_t.deleteObjects,deleteBy:_t.deleteBy,clearObjects:_t.clearObjects,browseObjects:_t.browseObjects,getObjectPosition:_t.getObjectPosition,findObject:_t.findObject,exists:_t.exists,saveSynonym:_t.saveSynonym,saveSynonyms:_t.saveSynonyms,getSynonym:_t.getSynonym,searchSynonyms:_t.searchSynonyms,browseSynonyms:_t.browseSynonyms,deleteSynonym:_t.deleteSynonym,clearSynonyms:_t.clearSynonyms,replaceAllObjects:_t.replaceAllObjects,replaceAllSynonyms:_t.replaceAllSynonyms,searchRules:_t.searchRules,getRule:_t.getRule,deleteRule:_t.deleteRule,saveRule:_t.saveRule,saveRules:_t.saveRules,replaceAllRules:_t.replaceAllRules,browseRules:_t.browseRules,clearRules:_t.clearRules}}),initAnalytics:()=>u=>VE.createAnalyticsClient({...o,...u,methods:{addABTest:VE.addABTest,getABTest:VE.getABTest,getABTests:VE.getABTests,stopABTest:VE.stopABTest,deleteABTest:VE.deleteABTest}}),initPersonalization:n,initRecommendation:()=>u=>(a.logger.info(\"The `initRecommendation` method is deprecated. Use `initPersonalization` instead.\"),n()(u))}})}Fye.version=jH.version;Rye.exports=Fye});var YH=_((iKt,GH)=>{var Nye=Tye();GH.exports=Nye;GH.exports.default=Nye});var VH=_((oKt,Oye)=>{\"use strict\";var Mye=Object.getOwnPropertySymbols,Cyt=Object.prototype.hasOwnProperty,wyt=Object.prototype.propertyIsEnumerable;function Iyt(t){if(t==null)throw new TypeError(\"Object.assign cannot be called with null or undefined\");return Object(t)}function Byt(){try{if(!Object.assign)return!1;var t=new String(\"abc\");if(t[5]=\"de\",Object.getOwnPropertyNames(t)[0]===\"5\")return!1;for(var e={},r=0;r<10;r++)e[\"_\"+String.fromCharCode(r)]=r;var o=Object.getOwnPropertyNames(e).map(function(n){return e[n]});if(o.join(\"\")!==\"0123456789\")return!1;var a={};return\"abcdefghijklmnopqrst\".split(\"\").forEach(function(n){a[n]=n}),Object.keys(Object.assign({},a)).join(\"\")===\"abcdefghijklmnopqrst\"}catch{return!1}}Oye.exports=Byt()?Object.assign:function(t,e){for(var r,o=Iyt(t),a,n=1;n<arguments.length;n++){r=Object(arguments[n]);for(var u in r)Cyt.call(r,u)&&(o[u]=r[u]);if(Mye){a=Mye(r);for(var A=0;A<a.length;A++)wyt.call(r,a[A])&&(o[a[A]]=r[a[A]])}}return o}});var Jye=_(Nn=>{\"use strict\";var $H=VH(),tu=typeof Symbol==\"function\"&&Symbol.for,L2=tu?Symbol.for(\"react.element\"):60103,vyt=tu?Symbol.for(\"react.portal\"):60106,Dyt=tu?Symbol.for(\"react.fragment\"):60107,Pyt=tu?Symbol.for(\"react.strict_mode\"):60108,byt=tu?Symbol.for(\"react.profiler\"):60114,Syt=tu?Symbol.for(\"react.provider\"):60109,xyt=tu?Symbol.for(\"react.context\"):60110,kyt=tu?Symbol.for(\"react.forward_ref\"):60112,Qyt=tu?Symbol.for(\"react.suspense\"):60113,Fyt=tu?Symbol.for(\"react.memo\"):60115,Ryt=tu?Symbol.for(\"react.lazy\"):60116,Uye=typeof Symbol==\"function\"&&Symbol.iterator;function M2(t){for(var e=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+t,r=1;r<arguments.length;r++)e+=\"&args[]=\"+encodeURIComponent(arguments[r]);return\"Minified React error #\"+t+\"; visit \"+e+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}var _ye={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Hye={};function zE(t,e,r){this.props=t,this.context=e,this.refs=Hye,this.updater=r||_ye}zE.prototype.isReactComponent={};zE.prototype.setState=function(t,e){if(typeof t!=\"object\"&&typeof t!=\"function\"&&t!=null)throw Error(M2(85));this.updater.enqueueSetState(this,t,e,\"setState\")};zE.prototype.forceUpdate=function(t){this.updater.enqueueForceUpdate(this,t,\"forceUpdate\")};function qye(){}qye.prototype=zE.prototype;function e6(t,e,r){this.props=t,this.context=e,this.refs=Hye,this.updater=r||_ye}var t6=e6.prototype=new qye;t6.constructor=e6;$H(t6,zE.prototype);t6.isPureReactComponent=!0;var r6={current:null},jye=Object.prototype.hasOwnProperty,Gye={key:!0,ref:!0,__self:!0,__source:!0};function Yye(t,e,r){var o,a={},n=null,u=null;if(e!=null)for(o in e.ref!==void 0&&(u=e.ref),e.key!==void 0&&(n=\"\"+e.key),e)jye.call(e,o)&&!Gye.hasOwnProperty(o)&&(a[o]=e[o]);var A=arguments.length-2;if(A===1)a.children=r;else if(1<A){for(var p=Array(A),h=0;h<A;h++)p[h]=arguments[h+2];a.children=p}if(t&&t.defaultProps)for(o in A=t.defaultProps,A)a[o]===void 0&&(a[o]=A[o]);return{$$typeof:L2,type:t,key:n,ref:u,props:a,_owner:r6.current}}function Tyt(t,e){return{$$typeof:L2,type:t.type,key:e,ref:t.ref,props:t.props,_owner:t._owner}}function n6(t){return typeof t==\"object\"&&t!==null&&t.$$typeof===L2}function Nyt(t){var e={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+t).replace(/[=:]/g,function(r){return e[r]})}var Wye=/\\/+/g,mk=[];function Kye(t,e,r,o){if(mk.length){var a=mk.pop();return a.result=t,a.keyPrefix=e,a.func=r,a.context=o,a.count=0,a}return{result:t,keyPrefix:e,func:r,context:o,count:0}}function Vye(t){t.result=null,t.keyPrefix=null,t.func=null,t.context=null,t.count=0,10>mk.length&&mk.push(t)}function JH(t,e,r,o){var a=typeof t;(a===\"undefined\"||a===\"boolean\")&&(t=null);var n=!1;if(t===null)n=!0;else switch(a){case\"string\":case\"number\":n=!0;break;case\"object\":switch(t.$$typeof){case L2:case vyt:n=!0}}if(n)return r(o,t,e===\"\"?\".\"+zH(t,0):e),1;if(n=0,e=e===\"\"?\".\":e+\":\",Array.isArray(t))for(var u=0;u<t.length;u++){a=t[u];var A=e+zH(a,u);n+=JH(a,A,r,o)}else if(t===null||typeof t!=\"object\"?A=null:(A=Uye&&t[Uye]||t[\"@@iterator\"],A=typeof A==\"function\"?A:null),typeof A==\"function\")for(t=A.call(t),u=0;!(a=t.next()).done;)a=a.value,A=e+zH(a,u++),n+=JH(a,A,r,o);else if(a===\"object\")throw r=\"\"+t,Error(M2(31,r===\"[object Object]\"?\"object with keys {\"+Object.keys(t).join(\", \")+\"}\":r,\"\"));return n}function XH(t,e,r){return t==null?0:JH(t,\"\",e,r)}function zH(t,e){return typeof t==\"object\"&&t!==null&&t.key!=null?Nyt(t.key):e.toString(36)}function Lyt(t,e){t.func.call(t.context,e,t.count++)}function Myt(t,e,r){var o=t.result,a=t.keyPrefix;t=t.func.call(t.context,e,t.count++),Array.isArray(t)?ZH(t,o,r,function(n){return n}):t!=null&&(n6(t)&&(t=Tyt(t,a+(!t.key||e&&e.key===t.key?\"\":(\"\"+t.key).replace(Wye,\"$&/\")+\"/\")+r)),o.push(t))}function ZH(t,e,r,o,a){var n=\"\";r!=null&&(n=(\"\"+r).replace(Wye,\"$&/\")+\"/\"),e=Kye(e,n,o,a),XH(t,Myt,e),Vye(e)}var zye={current:null};function Vf(){var t=zye.current;if(t===null)throw Error(M2(321));return t}var Oyt={ReactCurrentDispatcher:zye,ReactCurrentBatchConfig:{suspense:null},ReactCurrentOwner:r6,IsSomeRendererActing:{current:!1},assign:$H};Nn.Children={map:function(t,e,r){if(t==null)return t;var o=[];return ZH(t,o,null,e,r),o},forEach:function(t,e,r){if(t==null)return t;e=Kye(null,null,e,r),XH(t,Lyt,e),Vye(e)},count:function(t){return XH(t,function(){return null},null)},toArray:function(t){var e=[];return ZH(t,e,null,function(r){return r}),e},only:function(t){if(!n6(t))throw Error(M2(143));return t}};Nn.Component=zE;Nn.Fragment=Dyt;Nn.Profiler=byt;Nn.PureComponent=e6;Nn.StrictMode=Pyt;Nn.Suspense=Qyt;Nn.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Oyt;Nn.cloneElement=function(t,e,r){if(t==null)throw Error(M2(267,t));var o=$H({},t.props),a=t.key,n=t.ref,u=t._owner;if(e!=null){if(e.ref!==void 0&&(n=e.ref,u=r6.current),e.key!==void 0&&(a=\"\"+e.key),t.type&&t.type.defaultProps)var A=t.type.defaultProps;for(p in e)jye.call(e,p)&&!Gye.hasOwnProperty(p)&&(o[p]=e[p]===void 0&&A!==void 0?A[p]:e[p])}var p=arguments.length-2;if(p===1)o.children=r;else if(1<p){A=Array(p);for(var h=0;h<p;h++)A[h]=arguments[h+2];o.children=A}return{$$typeof:L2,type:t.type,key:a,ref:n,props:o,_owner:u}};Nn.createContext=function(t,e){return e===void 0&&(e=null),t={$$typeof:xyt,_calculateChangedBits:e,_currentValue:t,_currentValue2:t,_threadCount:0,Provider:null,Consumer:null},t.Provider={$$typeof:Syt,_context:t},t.Consumer=t};Nn.createElement=Yye;Nn.createFactory=function(t){var e=Yye.bind(null,t);return e.type=t,e};Nn.createRef=function(){return{current:null}};Nn.forwardRef=function(t){return{$$typeof:kyt,render:t}};Nn.isValidElement=n6;Nn.lazy=function(t){return{$$typeof:Ryt,_ctor:t,_status:-1,_result:null}};Nn.memo=function(t,e){return{$$typeof:Fyt,type:t,compare:e===void 0?null:e}};Nn.useCallback=function(t,e){return Vf().useCallback(t,e)};Nn.useContext=function(t,e){return Vf().useContext(t,e)};Nn.useDebugValue=function(){};Nn.useEffect=function(t,e){return Vf().useEffect(t,e)};Nn.useImperativeHandle=function(t,e,r){return Vf().useImperativeHandle(t,e,r)};Nn.useLayoutEffect=function(t,e){return Vf().useLayoutEffect(t,e)};Nn.useMemo=function(t,e){return Vf().useMemo(t,e)};Nn.useReducer=function(t,e,r){return Vf().useReducer(t,e,r)};Nn.useRef=function(t){return Vf().useRef(t)};Nn.useState=function(t){return Vf().useState(t)};Nn.version=\"16.13.1\"});var an=_((lKt,Xye)=>{\"use strict\";Xye.exports=Jye()});var s6=_((cKt,i6)=>{\"use strict\";var fn=i6.exports;i6.exports.default=fn;var Ln=\"\\x1B[\",O2=\"\\x1B]\",JE=\"\\x07\",yk=\";\",Zye=process.env.TERM_PROGRAM===\"Apple_Terminal\";fn.cursorTo=(t,e)=>{if(typeof t!=\"number\")throw new TypeError(\"The `x` argument is required\");return typeof e!=\"number\"?Ln+(t+1)+\"G\":Ln+(e+1)+\";\"+(t+1)+\"H\"};fn.cursorMove=(t,e)=>{if(typeof t!=\"number\")throw new TypeError(\"The `x` argument is required\");let r=\"\";return t<0?r+=Ln+-t+\"D\":t>0&&(r+=Ln+t+\"C\"),e<0?r+=Ln+-e+\"A\":e>0&&(r+=Ln+e+\"B\"),r};fn.cursorUp=(t=1)=>Ln+t+\"A\";fn.cursorDown=(t=1)=>Ln+t+\"B\";fn.cursorForward=(t=1)=>Ln+t+\"C\";fn.cursorBackward=(t=1)=>Ln+t+\"D\";fn.cursorLeft=Ln+\"G\";fn.cursorSavePosition=Zye?\"\\x1B7\":Ln+\"s\";fn.cursorRestorePosition=Zye?\"\\x1B8\":Ln+\"u\";fn.cursorGetPosition=Ln+\"6n\";fn.cursorNextLine=Ln+\"E\";fn.cursorPrevLine=Ln+\"F\";fn.cursorHide=Ln+\"?25l\";fn.cursorShow=Ln+\"?25h\";fn.eraseLines=t=>{let e=\"\";for(let r=0;r<t;r++)e+=fn.eraseLine+(r<t-1?fn.cursorUp():\"\");return t&&(e+=fn.cursorLeft),e};fn.eraseEndLine=Ln+\"K\";fn.eraseStartLine=Ln+\"1K\";fn.eraseLine=Ln+\"2K\";fn.eraseDown=Ln+\"J\";fn.eraseUp=Ln+\"1J\";fn.eraseScreen=Ln+\"2J\";fn.scrollUp=Ln+\"S\";fn.scrollDown=Ln+\"T\";fn.clearScreen=\"\\x1Bc\";fn.clearTerminal=process.platform===\"win32\"?`${fn.eraseScreen}${Ln}0f`:`${fn.eraseScreen}${Ln}3J${Ln}H`;fn.beep=JE;fn.link=(t,e)=>[O2,\"8\",yk,yk,e,JE,t,O2,\"8\",yk,yk,JE].join(\"\");fn.image=(t,e={})=>{let r=`${O2}1337;File=inline=1`;return e.width&&(r+=`;width=${e.width}`),e.height&&(r+=`;height=${e.height}`),e.preserveAspectRatio===!1&&(r+=\";preserveAspectRatio=0\"),r+\":\"+t.toString(\"base64\")+JE};fn.iTerm={setCwd:(t=process.cwd())=>`${O2}50;CurrentDir=${t}${JE}`,annotation:(t,e={})=>{let r=`${O2}1337;`,o=typeof e.x<\"u\",a=typeof e.y<\"u\";if((o||a)&&!(o&&a&&typeof e.length<\"u\"))throw new Error(\"`x`, `y` and `length` must be defined when `x` or `y` is defined\");return t=t.replace(/\\|/g,\"\"),r+=e.isHidden?\"AddHiddenAnnotation=\":\"AddAnnotation=\",e.length>0?r+=(o?[t,e.length,e.x,e.y]:[e.length,t]).join(\"|\"):r+=t,r+JE}}});var eEe=_((uKt,o6)=>{\"use strict\";var $ye=(t,e)=>{for(let r of Reflect.ownKeys(e))Object.defineProperty(t,r,Object.getOwnPropertyDescriptor(e,r));return t};o6.exports=$ye;o6.exports.default=$ye});var rEe=_((AKt,Ck)=>{\"use strict\";var Uyt=eEe(),Ek=new WeakMap,tEe=(t,e={})=>{if(typeof t!=\"function\")throw new TypeError(\"Expected a function\");let r,o=0,a=t.displayName||t.name||\"<anonymous>\",n=function(...u){if(Ek.set(n,++o),o===1)r=t.apply(this,u),t=null;else if(e.throw===!0)throw new Error(`Function \\`${a}\\` can only be called once`);return r};return Uyt(n,t),Ek.set(n,o),n};Ck.exports=tEe;Ck.exports.default=tEe;Ck.exports.callCount=t=>{if(!Ek.has(t))throw new Error(`The given function \\`${t.name}\\` is not wrapped by the \\`onetime\\` package`);return Ek.get(t)}});var nEe=_((fKt,wk)=>{wk.exports=[\"SIGABRT\",\"SIGALRM\",\"SIGHUP\",\"SIGINT\",\"SIGTERM\"];process.platform!==\"win32\"&&wk.exports.push(\"SIGVTALRM\",\"SIGXCPU\",\"SIGXFSZ\",\"SIGUSR2\",\"SIGTRAP\",\"SIGSYS\",\"SIGQUIT\",\"SIGIOT\");process.platform===\"linux\"&&wk.exports.push(\"SIGIO\",\"SIGPOLL\",\"SIGPWR\",\"SIGSTKFLT\",\"SIGUNUSED\")});var c6=_((pKt,$E)=>{var yi=global.process,Kg=function(t){return t&&typeof t==\"object\"&&typeof t.removeListener==\"function\"&&typeof t.emit==\"function\"&&typeof t.reallyExit==\"function\"&&typeof t.listeners==\"function\"&&typeof t.kill==\"function\"&&typeof t.pid==\"number\"&&typeof t.on==\"function\"};Kg(yi)?(iEe=ve(\"assert\"),XE=nEe(),sEe=/^win/i.test(yi.platform),U2=ve(\"events\"),typeof U2!=\"function\"&&(U2=U2.EventEmitter),yi.__signal_exit_emitter__?Ls=yi.__signal_exit_emitter__:(Ls=yi.__signal_exit_emitter__=new U2,Ls.count=0,Ls.emitted={}),Ls.infinite||(Ls.setMaxListeners(1/0),Ls.infinite=!0),$E.exports=function(t,e){if(!Kg(global.process))return function(){};iEe.equal(typeof t,\"function\",\"a callback must be provided for exit handler\"),ZE===!1&&a6();var r=\"exit\";e&&e.alwaysLast&&(r=\"afterexit\");var o=function(){Ls.removeListener(r,t),Ls.listeners(\"exit\").length===0&&Ls.listeners(\"afterexit\").length===0&&Ik()};return Ls.on(r,t),o},Ik=function(){!ZE||!Kg(global.process)||(ZE=!1,XE.forEach(function(e){try{yi.removeListener(e,Bk[e])}catch{}}),yi.emit=vk,yi.reallyExit=l6,Ls.count-=1)},$E.exports.unload=Ik,Vg=function(e,r,o){Ls.emitted[e]||(Ls.emitted[e]=!0,Ls.emit(e,r,o))},Bk={},XE.forEach(function(t){Bk[t]=function(){if(Kg(global.process)){var r=yi.listeners(t);r.length===Ls.count&&(Ik(),Vg(\"exit\",null,t),Vg(\"afterexit\",null,t),sEe&&t===\"SIGHUP\"&&(t=\"SIGINT\"),yi.kill(yi.pid,t))}}}),$E.exports.signals=function(){return XE},ZE=!1,a6=function(){ZE||!Kg(global.process)||(ZE=!0,Ls.count+=1,XE=XE.filter(function(e){try{return yi.on(e,Bk[e]),!0}catch{return!1}}),yi.emit=aEe,yi.reallyExit=oEe)},$E.exports.load=a6,l6=yi.reallyExit,oEe=function(e){Kg(global.process)&&(yi.exitCode=e||0,Vg(\"exit\",yi.exitCode,null),Vg(\"afterexit\",yi.exitCode,null),l6.call(yi,yi.exitCode))},vk=yi.emit,aEe=function(e,r){if(e===\"exit\"&&Kg(global.process)){r!==void 0&&(yi.exitCode=r);var o=vk.apply(this,arguments);return Vg(\"exit\",yi.exitCode,null),Vg(\"afterexit\",yi.exitCode,null),o}else return vk.apply(this,arguments)}):$E.exports=function(){return function(){}};var iEe,XE,sEe,U2,Ls,Ik,Vg,Bk,ZE,a6,l6,oEe,vk,aEe});var cEe=_((hKt,lEe)=>{\"use strict\";var _yt=rEe(),Hyt=c6();lEe.exports=_yt(()=>{Hyt(()=>{process.stderr.write(\"\\x1B[?25h\")},{alwaysLast:!0})})});var u6=_(eC=>{\"use strict\";var qyt=cEe(),Dk=!1;eC.show=(t=process.stderr)=>{t.isTTY&&(Dk=!1,t.write(\"\\x1B[?25h\"))};eC.hide=(t=process.stderr)=>{t.isTTY&&(qyt(),Dk=!0,t.write(\"\\x1B[?25l\"))};eC.toggle=(t,e)=>{t!==void 0&&(Dk=t),Dk?eC.show(e):eC.hide(e)}});var pEe=_(_2=>{\"use strict\";var fEe=_2&&_2.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(_2,\"__esModule\",{value:!0});var uEe=fEe(s6()),AEe=fEe(u6()),jyt=(t,{showCursor:e=!1}={})=>{let r=0,o=\"\",a=!1,n=u=>{!e&&!a&&(AEe.default.hide(),a=!0);let A=u+`\n`;A!==o&&(o=A,t.write(uEe.default.eraseLines(r)+A),r=A.split(`\n`).length)};return n.clear=()=>{t.write(uEe.default.eraseLines(r)),o=\"\",r=0},n.done=()=>{o=\"\",r=0,e||(AEe.default.show(),a=!1)},n};_2.default={create:jyt}});var hEe=_((mKt,Gyt)=>{Gyt.exports=[{name:\"AppVeyor\",constant:\"APPVEYOR\",env:\"APPVEYOR\",pr:\"APPVEYOR_PULL_REQUEST_NUMBER\"},{name:\"Azure Pipelines\",constant:\"AZURE_PIPELINES\",env:\"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI\",pr:\"SYSTEM_PULLREQUEST_PULLREQUESTID\"},{name:\"Bamboo\",constant:\"BAMBOO\",env:\"bamboo_planKey\"},{name:\"Bitbucket Pipelines\",constant:\"BITBUCKET\",env:\"BITBUCKET_COMMIT\",pr:\"BITBUCKET_PR_ID\"},{name:\"Bitrise\",constant:\"BITRISE\",env:\"BITRISE_IO\",pr:\"BITRISE_PULL_REQUEST\"},{name:\"Buddy\",constant:\"BUDDY\",env:\"BUDDY_WORKSPACE_ID\",pr:\"BUDDY_EXECUTION_PULL_REQUEST_ID\"},{name:\"Buildkite\",constant:\"BUILDKITE\",env:\"BUILDKITE\",pr:{env:\"BUILDKITE_PULL_REQUEST\",ne:\"false\"}},{name:\"CircleCI\",constant:\"CIRCLE\",env:\"CIRCLECI\",pr:\"CIRCLE_PULL_REQUEST\"},{name:\"Cirrus CI\",constant:\"CIRRUS\",env:\"CIRRUS_CI\",pr:\"CIRRUS_PR\"},{name:\"AWS CodeBuild\",constant:\"CODEBUILD\",env:\"CODEBUILD_BUILD_ARN\"},{name:\"Codeship\",constant:\"CODESHIP\",env:{CI_NAME:\"codeship\"}},{name:\"Drone\",constant:\"DRONE\",env:\"DRONE\",pr:{DRONE_BUILD_EVENT:\"pull_request\"}},{name:\"dsari\",constant:\"DSARI\",env:\"DSARI\"},{name:\"GitLab CI\",constant:\"GITLAB\",env:\"GITLAB_CI\"},{name:\"GoCD\",constant:\"GOCD\",env:\"GO_PIPELINE_LABEL\"},{name:\"Hudson\",constant:\"HUDSON\",env:\"HUDSON_URL\"},{name:\"Jenkins\",constant:\"JENKINS\",env:[\"JENKINS_URL\",\"BUILD_ID\"],pr:{any:[\"ghprbPullId\",\"CHANGE_ID\"]}},{name:\"Magnum CI\",constant:\"MAGNUM\",env:\"MAGNUM\"},{name:\"Netlify CI\",constant:\"NETLIFY\",env:\"NETLIFY_BUILD_BASE\",pr:{env:\"PULL_REQUEST\",ne:\"false\"}},{name:\"Sail CI\",constant:\"SAIL\",env:\"SAILCI\",pr:\"SAIL_PULL_REQUEST_NUMBER\"},{name:\"Semaphore\",constant:\"SEMAPHORE\",env:\"SEMAPHORE\",pr:\"PULL_REQUEST_NUMBER\"},{name:\"Shippable\",constant:\"SHIPPABLE\",env:\"SHIPPABLE\",pr:{IS_PULL_REQUEST:\"true\"}},{name:\"Solano CI\",constant:\"SOLANO\",env:\"TDDIUM\",pr:\"TDDIUM_PR_ID\"},{name:\"Strider CD\",constant:\"STRIDER\",env:\"STRIDER\"},{name:\"TaskCluster\",constant:\"TASKCLUSTER\",env:[\"TASK_ID\",\"RUN_ID\"]},{name:\"TeamCity\",constant:\"TEAMCITY\",env:\"TEAMCITY_VERSION\"},{name:\"Travis CI\",constant:\"TRAVIS\",env:\"TRAVIS\",pr:{env:\"TRAVIS_PULL_REQUEST\",ne:\"false\"}}]});var mEe=_(dl=>{\"use strict\";var dEe=hEe(),pA=process.env;Object.defineProperty(dl,\"_vendors\",{value:dEe.map(function(t){return t.constant})});dl.name=null;dl.isPR=null;dEe.forEach(function(t){var e=Array.isArray(t.env)?t.env:[t.env],r=e.every(function(o){return gEe(o)});if(dl[t.constant]=r,r)switch(dl.name=t.name,typeof t.pr){case\"string\":dl.isPR=!!pA[t.pr];break;case\"object\":\"env\"in t.pr?dl.isPR=t.pr.env in pA&&pA[t.pr.env]!==t.pr.ne:\"any\"in t.pr?dl.isPR=t.pr.any.some(function(o){return!!pA[o]}):dl.isPR=gEe(t.pr);break;default:dl.isPR=null}});dl.isCI=!!(pA.CI||pA.CONTINUOUS_INTEGRATION||pA.BUILD_NUMBER||pA.RUN_ID||dl.name);function gEe(t){return typeof t==\"string\"?!!pA[t]:Object.keys(t).every(function(e){return pA[e]===t[e]})}});var EEe=_((EKt,yEe)=>{\"use strict\";yEe.exports=mEe().isCI});var wEe=_((CKt,CEe)=>{\"use strict\";var Yyt=t=>{let e=new Set;do for(let r of Reflect.ownKeys(t))e.add([t,r]);while((t=Reflect.getPrototypeOf(t))&&t!==Object.prototype);return e};CEe.exports=(t,{include:e,exclude:r}={})=>{let o=a=>{let n=u=>typeof u==\"string\"?a===u:u.test(a);return e?e.some(n):r?!r.some(n):!0};for(let[a,n]of Yyt(t.constructor.prototype)){if(n===\"constructor\"||!o(n))continue;let u=Reflect.getOwnPropertyDescriptor(a,n);u&&typeof u.value==\"function\"&&(t[n]=t[n].bind(t))}return t}});var SEe=_(kn=>{\"use strict\";Object.defineProperty(kn,\"__esModule\",{value:!0});var rC,j2,kk,Qk,m6;typeof window>\"u\"||typeof MessageChannel!=\"function\"?(tC=null,A6=null,f6=function(){if(tC!==null)try{var t=kn.unstable_now();tC(!0,t),tC=null}catch(e){throw setTimeout(f6,0),e}},IEe=Date.now(),kn.unstable_now=function(){return Date.now()-IEe},rC=function(t){tC!==null?setTimeout(rC,0,t):(tC=t,setTimeout(f6,0))},j2=function(t,e){A6=setTimeout(t,e)},kk=function(){clearTimeout(A6)},Qk=function(){return!1},m6=kn.unstable_forceFrameRate=function(){}):(Pk=window.performance,p6=window.Date,BEe=window.setTimeout,vEe=window.clearTimeout,typeof console<\"u\"&&(DEe=window.cancelAnimationFrame,typeof window.requestAnimationFrame!=\"function\"&&console.error(\"This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\"),typeof DEe!=\"function\"&&console.error(\"This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\")),typeof Pk==\"object\"&&typeof Pk.now==\"function\"?kn.unstable_now=function(){return Pk.now()}:(PEe=p6.now(),kn.unstable_now=function(){return p6.now()-PEe}),H2=!1,q2=null,bk=-1,h6=5,g6=0,Qk=function(){return kn.unstable_now()>=g6},m6=function(){},kn.unstable_forceFrameRate=function(t){0>t||125<t?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported\"):h6=0<t?Math.floor(1e3/t):5},d6=new MessageChannel,Sk=d6.port2,d6.port1.onmessage=function(){if(q2!==null){var t=kn.unstable_now();g6=t+h6;try{q2(!0,t)?Sk.postMessage(null):(H2=!1,q2=null)}catch(e){throw Sk.postMessage(null),e}}else H2=!1},rC=function(t){q2=t,H2||(H2=!0,Sk.postMessage(null))},j2=function(t,e){bk=BEe(function(){t(kn.unstable_now())},e)},kk=function(){vEe(bk),bk=-1});var tC,A6,f6,IEe,Pk,p6,BEe,vEe,DEe,PEe,H2,q2,bk,h6,g6,d6,Sk;function y6(t,e){var r=t.length;t.push(e);e:for(;;){var o=Math.floor((r-1)/2),a=t[o];if(a!==void 0&&0<xk(a,e))t[o]=e,t[r]=a,r=o;else break e}}function nc(t){return t=t[0],t===void 0?null:t}function Fk(t){var e=t[0];if(e!==void 0){var r=t.pop();if(r!==e){t[0]=r;e:for(var o=0,a=t.length;o<a;){var n=2*(o+1)-1,u=t[n],A=n+1,p=t[A];if(u!==void 0&&0>xk(u,r))p!==void 0&&0>xk(p,u)?(t[o]=p,t[A]=r,o=A):(t[o]=u,t[n]=r,o=n);else if(p!==void 0&&0>xk(p,r))t[o]=p,t[A]=r,o=A;else break e}}return e}return null}function xk(t,e){var r=t.sortIndex-e.sortIndex;return r!==0?r:t.id-e.id}var ru=[],Th=[],Wyt=1,sa=null,Lo=3,Rk=!1,zg=!1,G2=!1;function Tk(t){for(var e=nc(Th);e!==null;){if(e.callback===null)Fk(Th);else if(e.startTime<=t)Fk(Th),e.sortIndex=e.expirationTime,y6(ru,e);else break;e=nc(Th)}}function E6(t){if(G2=!1,Tk(t),!zg)if(nc(ru)!==null)zg=!0,rC(C6);else{var e=nc(Th);e!==null&&j2(E6,e.startTime-t)}}function C6(t,e){zg=!1,G2&&(G2=!1,kk()),Rk=!0;var r=Lo;try{for(Tk(e),sa=nc(ru);sa!==null&&(!(sa.expirationTime>e)||t&&!Qk());){var o=sa.callback;if(o!==null){sa.callback=null,Lo=sa.priorityLevel;var a=o(sa.expirationTime<=e);e=kn.unstable_now(),typeof a==\"function\"?sa.callback=a:sa===nc(ru)&&Fk(ru),Tk(e)}else Fk(ru);sa=nc(ru)}if(sa!==null)var n=!0;else{var u=nc(Th);u!==null&&j2(E6,u.startTime-e),n=!1}return n}finally{sa=null,Lo=r,Rk=!1}}function bEe(t){switch(t){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var Kyt=m6;kn.unstable_ImmediatePriority=1;kn.unstable_UserBlockingPriority=2;kn.unstable_NormalPriority=3;kn.unstable_IdlePriority=5;kn.unstable_LowPriority=4;kn.unstable_runWithPriority=function(t,e){switch(t){case 1:case 2:case 3:case 4:case 5:break;default:t=3}var r=Lo;Lo=t;try{return e()}finally{Lo=r}};kn.unstable_next=function(t){switch(Lo){case 1:case 2:case 3:var e=3;break;default:e=Lo}var r=Lo;Lo=e;try{return t()}finally{Lo=r}};kn.unstable_scheduleCallback=function(t,e,r){var o=kn.unstable_now();if(typeof r==\"object\"&&r!==null){var a=r.delay;a=typeof a==\"number\"&&0<a?o+a:o,r=typeof r.timeout==\"number\"?r.timeout:bEe(t)}else r=bEe(t),a=o;return r=a+r,t={id:Wyt++,callback:e,priorityLevel:t,startTime:a,expirationTime:r,sortIndex:-1},a>o?(t.sortIndex=a,y6(Th,t),nc(ru)===null&&t===nc(Th)&&(G2?kk():G2=!0,j2(E6,a-o))):(t.sortIndex=r,y6(ru,t),zg||Rk||(zg=!0,rC(C6))),t};kn.unstable_cancelCallback=function(t){t.callback=null};kn.unstable_wrapCallback=function(t){var e=Lo;return function(){var r=Lo;Lo=e;try{return t.apply(this,arguments)}finally{Lo=r}}};kn.unstable_getCurrentPriorityLevel=function(){return Lo};kn.unstable_shouldYield=function(){var t=kn.unstable_now();Tk(t);var e=nc(ru);return e!==sa&&sa!==null&&e!==null&&e.callback!==null&&e.startTime<=t&&e.expirationTime<sa.expirationTime||Qk()};kn.unstable_requestPaint=Kyt;kn.unstable_continueExecution=function(){zg||Rk||(zg=!0,rC(C6))};kn.unstable_pauseExecution=function(){};kn.unstable_getFirstCallbackNode=function(){return nc(ru)};kn.unstable_Profiling=null});var w6=_((IKt,xEe)=>{\"use strict\";xEe.exports=SEe()});var kEe=_((BKt,Y2)=>{Y2.exports=function t(e){\"use strict\";var r=VH(),o=an(),a=w6();function n(P){for(var D=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+P,T=1;T<arguments.length;T++)D+=\"&args[]=\"+encodeURIComponent(arguments[T]);return\"Minified React error #\"+P+\"; visit \"+D+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}var u=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;u.hasOwnProperty(\"ReactCurrentDispatcher\")||(u.ReactCurrentDispatcher={current:null}),u.hasOwnProperty(\"ReactCurrentBatchConfig\")||(u.ReactCurrentBatchConfig={suspense:null});var A=typeof Symbol==\"function\"&&Symbol.for,p=A?Symbol.for(\"react.element\"):60103,h=A?Symbol.for(\"react.portal\"):60106,E=A?Symbol.for(\"react.fragment\"):60107,I=A?Symbol.for(\"react.strict_mode\"):60108,v=A?Symbol.for(\"react.profiler\"):60114,x=A?Symbol.for(\"react.provider\"):60109,C=A?Symbol.for(\"react.context\"):60110,R=A?Symbol.for(\"react.concurrent_mode\"):60111,L=A?Symbol.for(\"react.forward_ref\"):60112,U=A?Symbol.for(\"react.suspense\"):60113,z=A?Symbol.for(\"react.suspense_list\"):60120,te=A?Symbol.for(\"react.memo\"):60115,ae=A?Symbol.for(\"react.lazy\"):60116;A&&Symbol.for(\"react.fundamental\"),A&&Symbol.for(\"react.responder\"),A&&Symbol.for(\"react.scope\");var le=typeof Symbol==\"function\"&&Symbol.iterator;function ce(P){return P===null||typeof P!=\"object\"?null:(P=le&&P[le]||P[\"@@iterator\"],typeof P==\"function\"?P:null)}function Ce(P){if(P._status===-1){P._status=0;var D=P._ctor;D=D(),P._result=D,D.then(function(T){P._status===0&&(T=T.default,P._status=1,P._result=T)},function(T){P._status===0&&(P._status=2,P._result=T)})}}function de(P){if(P==null)return null;if(typeof P==\"function\")return P.displayName||P.name||null;if(typeof P==\"string\")return P;switch(P){case E:return\"Fragment\";case h:return\"Portal\";case v:return\"Profiler\";case I:return\"StrictMode\";case U:return\"Suspense\";case z:return\"SuspenseList\"}if(typeof P==\"object\")switch(P.$$typeof){case C:return\"Context.Consumer\";case x:return\"Context.Provider\";case L:var D=P.render;return D=D.displayName||D.name||\"\",P.displayName||(D!==\"\"?\"ForwardRef(\"+D+\")\":\"ForwardRef\");case te:return de(P.type);case ae:if(P=P._status===1?P._result:null)return de(P)}return null}function Be(P){var D=P,T=P;if(P.alternate)for(;D.return;)D=D.return;else{P=D;do D=P,D.effectTag&1026&&(T=D.return),P=D.return;while(P)}return D.tag===3?T:null}function Ee(P){if(Be(P)!==P)throw Error(n(188))}function g(P){var D=P.alternate;if(!D){if(D=Be(P),D===null)throw Error(n(188));return D!==P?null:P}for(var T=P,q=D;;){var W=T.return;if(W===null)break;var fe=W.alternate;if(fe===null){if(q=W.return,q!==null){T=q;continue}break}if(W.child===fe.child){for(fe=W.child;fe;){if(fe===T)return Ee(W),P;if(fe===q)return Ee(W),D;fe=fe.sibling}throw Error(n(188))}if(T.return!==q.return)T=W,q=fe;else{for(var De=!1,vt=W.child;vt;){if(vt===T){De=!0,T=W,q=fe;break}if(vt===q){De=!0,q=W,T=fe;break}vt=vt.sibling}if(!De){for(vt=fe.child;vt;){if(vt===T){De=!0,T=fe,q=W;break}if(vt===q){De=!0,q=fe,T=W;break}vt=vt.sibling}if(!De)throw Error(n(189))}}if(T.alternate!==q)throw Error(n(190))}if(T.tag!==3)throw Error(n(188));return T.stateNode.current===T?P:D}function me(P){if(P=g(P),!P)return null;for(var D=P;;){if(D.tag===5||D.tag===6)return D;if(D.child)D.child.return=D,D=D.child;else{if(D===P)break;for(;!D.sibling;){if(!D.return||D.return===P)return null;D=D.return}D.sibling.return=D.return,D=D.sibling}}return null}function we(P){if(P=g(P),!P)return null;for(var D=P;;){if(D.tag===5||D.tag===6)return D;if(D.child&&D.tag!==4)D.child.return=D,D=D.child;else{if(D===P)break;for(;!D.sibling;){if(!D.return||D.return===P)return null;D=D.return}D.sibling.return=D.return,D=D.sibling}}return null}var Ae=e.getPublicInstance,ne=e.getRootHostContext,Z=e.getChildHostContext,xe=e.prepareForCommit,Ne=e.resetAfterCommit,ht=e.createInstance,H=e.appendInitialChild,rt=e.finalizeInitialChildren,Te=e.prepareUpdate,Fe=e.shouldSetTextContent,ke=e.shouldDeprioritizeSubtree,Ye=e.createTextInstance,be=e.setTimeout,et=e.clearTimeout,Ue=e.noTimeout,S=e.isPrimaryRenderer,w=e.supportsMutation,b=e.supportsPersistence,y=e.supportsHydration,F=e.appendChild,J=e.appendChildToContainer,X=e.commitTextUpdate,$=e.commitMount,ie=e.commitUpdate,Se=e.insertBefore,Re=e.insertInContainerBefore,at=e.removeChild,dt=e.removeChildFromContainer,jt=e.resetTextContent,tr=e.hideInstance,bt=e.hideTextInstance,ln=e.unhideInstance,kr=e.unhideTextInstance,mr=e.cloneInstance,Sr=e.createContainerChildSet,Kr=e.appendChildToContainerChildSet,Kn=e.finalizeContainerChildren,Ms=e.replaceContainerChildren,Ri=e.cloneHiddenInstance,gs=e.cloneHiddenTextInstance,io=e.canHydrateInstance,Pi=e.canHydrateTextInstance,Os=e.isSuspenseInstancePending,so=e.isSuspenseInstanceFallback,uc=e.getNextHydratableSibling,Au=e.getFirstHydratableChild,op=e.hydrateInstance,ap=e.hydrateTextInstance,Us=e.getNextHydratableInstanceAfterSuspenseInstance,Dn=e.commitHydratedContainer,oo=e.commitHydratedSuspenseInstance,_s=/^(.*)[\\\\\\/]/;function ml(P){var D=\"\";do{e:switch(P.tag){case 3:case 4:case 6:case 7:case 10:case 9:var T=\"\";break e;default:var q=P._debugOwner,W=P._debugSource,fe=de(P.type);T=null,q&&(T=de(q.type)),q=fe,fe=\"\",W?fe=\" (at \"+W.fileName.replace(_s,\"\")+\":\"+W.lineNumber+\")\":T&&(fe=\" (created by \"+T+\")\"),T=`\n    in `+(q||\"Unknown\")+fe}D+=T,P=P.return}while(P);return D}var yl=[],ao=-1;function Vn(P){0>ao||(P.current=yl[ao],yl[ao]=null,ao--)}function Mn(P,D){ao++,yl[ao]=P.current,P.current=D}var Ti={},On={current:Ti},_i={current:!1},ir=Ti;function Me(P,D){var T=P.type.contextTypes;if(!T)return Ti;var q=P.stateNode;if(q&&q.__reactInternalMemoizedUnmaskedChildContext===D)return q.__reactInternalMemoizedMaskedChildContext;var W={},fe;for(fe in T)W[fe]=D[fe];return q&&(P=P.stateNode,P.__reactInternalMemoizedUnmaskedChildContext=D,P.__reactInternalMemoizedMaskedChildContext=W),W}function ii(P){return P=P.childContextTypes,P!=null}function Ha(P){Vn(_i,P),Vn(On,P)}function hr(P){Vn(_i,P),Vn(On,P)}function Ac(P,D,T){if(On.current!==Ti)throw Error(n(168));Mn(On,D,P),Mn(_i,T,P)}function fu(P,D,T){var q=P.stateNode;if(P=D.childContextTypes,typeof q.getChildContext!=\"function\")return T;q=q.getChildContext();for(var W in q)if(!(W in P))throw Error(n(108,de(D)||\"Unknown\",W));return r({},T,{},q)}function fc(P){var D=P.stateNode;return D=D&&D.__reactInternalMemoizedMergedChildContext||Ti,ir=On.current,Mn(On,D,P),Mn(_i,_i.current,P),!0}function El(P,D,T){var q=P.stateNode;if(!q)throw Error(n(169));T?(D=fu(P,D,ir),q.__reactInternalMemoizedMergedChildContext=D,Vn(_i,P),Vn(On,P),Mn(On,D,P)):Vn(_i,P),Mn(_i,T,P)}var vA=a.unstable_runWithPriority,pu=a.unstable_scheduleCallback,Ie=a.unstable_cancelCallback,Tt=a.unstable_shouldYield,pc=a.unstable_requestPaint,Hi=a.unstable_now,hu=a.unstable_getCurrentPriorityLevel,Yt=a.unstable_ImmediatePriority,Cl=a.unstable_UserBlockingPriority,DA=a.unstable_NormalPriority,lp=a.unstable_LowPriority,hc=a.unstable_IdlePriority,PA={},Qn=pc!==void 0?pc:function(){},hi=null,gc=null,bA=!1,aa=Hi(),Ni=1e4>aa?Hi:function(){return Hi()-aa};function _o(){switch(hu()){case Yt:return 99;case Cl:return 98;case DA:return 97;case lp:return 96;case hc:return 95;default:throw Error(n(332))}}function Xe(P){switch(P){case 99:return Yt;case 98:return Cl;case 97:return DA;case 96:return lp;case 95:return hc;default:throw Error(n(332))}}function lo(P,D){return P=Xe(P),vA(P,D)}function dc(P,D,T){return P=Xe(P),pu(P,D,T)}function gu(P){return hi===null?(hi=[P],gc=pu(Yt,du)):hi.push(P),PA}function qi(){if(gc!==null){var P=gc;gc=null,Ie(P)}du()}function du(){if(!bA&&hi!==null){bA=!0;var P=0;try{var D=hi;lo(99,function(){for(;P<D.length;P++){var T=D[P];do T=T(!0);while(T!==null)}}),hi=null}catch(T){throw hi!==null&&(hi=hi.slice(P+1)),pu(Yt,qi),T}finally{bA=!1}}}var SA=3;function qa(P,D,T){return T/=10,1073741821-(((1073741821-P+D/10)/T|0)+1)*T}function mc(P,D){return P===D&&(P!==0||1/P===1/D)||P!==P&&D!==D}var ds=typeof Object.is==\"function\"?Object.is:mc,Ht=Object.prototype.hasOwnProperty;function Fn(P,D){if(ds(P,D))return!0;if(typeof P!=\"object\"||P===null||typeof D!=\"object\"||D===null)return!1;var T=Object.keys(P),q=Object.keys(D);if(T.length!==q.length)return!1;for(q=0;q<T.length;q++)if(!Ht.call(D,T[q])||!ds(P[T[q]],D[T[q]]))return!1;return!0}function Ei(P,D){if(P&&P.defaultProps){D=r({},D),P=P.defaultProps;for(var T in P)D[T]===void 0&&(D[T]=P[T])}return D}var la={current:null},co=null,Hs=null,ca=null;function ua(){ca=Hs=co=null}function Ho(P,D){var T=P.type._context;S?(Mn(la,T._currentValue,P),T._currentValue=D):(Mn(la,T._currentValue2,P),T._currentValue2=D)}function Ci(P){var D=la.current;Vn(la,P),P=P.type._context,S?P._currentValue=D:P._currentValue2=D}function ms(P,D){for(;P!==null;){var T=P.alternate;if(P.childExpirationTime<D)P.childExpirationTime=D,T!==null&&T.childExpirationTime<D&&(T.childExpirationTime=D);else if(T!==null&&T.childExpirationTime<D)T.childExpirationTime=D;else break;P=P.return}}function ys(P,D){co=P,ca=Hs=null,P=P.dependencies,P!==null&&P.firstContext!==null&&(P.expirationTime>=D&&(jo=!0),P.firstContext=null)}function Es(P,D){if(ca!==P&&D!==!1&&D!==0)if((typeof D!=\"number\"||D===1073741823)&&(ca=P,D=1073741823),D={context:P,observedBits:D,next:null},Hs===null){if(co===null)throw Error(n(308));Hs=D,co.dependencies={expirationTime:0,firstContext:D,responders:null}}else Hs=Hs.next=D;return S?P._currentValue:P._currentValue2}var qs=!1;function Un(P){return{baseState:P,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Pn(P){return{baseState:P.baseState,firstUpdate:P.firstUpdate,lastUpdate:P.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function Cs(P,D){return{expirationTime:P,suspenseConfig:D,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function We(P,D){P.lastUpdate===null?P.firstUpdate=P.lastUpdate=D:(P.lastUpdate.next=D,P.lastUpdate=D)}function tt(P,D){var T=P.alternate;if(T===null){var q=P.updateQueue,W=null;q===null&&(q=P.updateQueue=Un(P.memoizedState))}else q=P.updateQueue,W=T.updateQueue,q===null?W===null?(q=P.updateQueue=Un(P.memoizedState),W=T.updateQueue=Un(T.memoizedState)):q=P.updateQueue=Pn(W):W===null&&(W=T.updateQueue=Pn(q));W===null||q===W?We(q,D):q.lastUpdate===null||W.lastUpdate===null?(We(q,D),We(W,D)):(We(q,D),W.lastUpdate=D)}function Bt(P,D){var T=P.updateQueue;T=T===null?P.updateQueue=Un(P.memoizedState):or(P,T),T.lastCapturedUpdate===null?T.firstCapturedUpdate=T.lastCapturedUpdate=D:(T.lastCapturedUpdate.next=D,T.lastCapturedUpdate=D)}function or(P,D){var T=P.alternate;return T!==null&&D===T.updateQueue&&(D=P.updateQueue=Pn(D)),D}function ee(P,D,T,q,W,fe){switch(T.tag){case 1:return P=T.payload,typeof P==\"function\"?P.call(fe,q,W):P;case 3:P.effectTag=P.effectTag&-4097|64;case 0:if(P=T.payload,W=typeof P==\"function\"?P.call(fe,q,W):P,W==null)break;return r({},q,W);case 2:qs=!0}return q}function ye(P,D,T,q,W){qs=!1,D=or(P,D);for(var fe=D.baseState,De=null,vt=0,wt=D.firstUpdate,St=fe;wt!==null;){var _r=wt.expirationTime;_r<W?(De===null&&(De=wt,fe=St),vt<_r&&(vt=_r)):(uw(_r,wt.suspenseConfig),St=ee(P,D,wt,St,T,q),wt.callback!==null&&(P.effectTag|=32,wt.nextEffect=null,D.lastEffect===null?D.firstEffect=D.lastEffect=wt:(D.lastEffect.nextEffect=wt,D.lastEffect=wt))),wt=wt.next}for(_r=null,wt=D.firstCapturedUpdate;wt!==null;){var os=wt.expirationTime;os<W?(_r===null&&(_r=wt,De===null&&(fe=St)),vt<os&&(vt=os)):(St=ee(P,D,wt,St,T,q),wt.callback!==null&&(P.effectTag|=32,wt.nextEffect=null,D.lastCapturedEffect===null?D.firstCapturedEffect=D.lastCapturedEffect=wt:(D.lastCapturedEffect.nextEffect=wt,D.lastCapturedEffect=wt))),wt=wt.next}De===null&&(D.lastUpdate=null),_r===null?D.lastCapturedUpdate=null:P.effectTag|=32,De===null&&_r===null&&(fe=St),D.baseState=fe,D.firstUpdate=De,D.firstCapturedUpdate=_r,Sd(vt),P.expirationTime=vt,P.memoizedState=St}function Le(P,D,T){D.firstCapturedUpdate!==null&&(D.lastUpdate!==null&&(D.lastUpdate.next=D.firstCapturedUpdate,D.lastUpdate=D.lastCapturedUpdate),D.firstCapturedUpdate=D.lastCapturedUpdate=null),ft(D.firstEffect,T),D.firstEffect=D.lastEffect=null,ft(D.firstCapturedEffect,T),D.firstCapturedEffect=D.lastCapturedEffect=null}function ft(P,D){for(;P!==null;){var T=P.callback;if(T!==null){P.callback=null;var q=D;if(typeof T!=\"function\")throw Error(n(191,T));T.call(q)}P=P.nextEffect}}var pt=u.ReactCurrentBatchConfig,Nt=new o.Component().refs;function rr(P,D,T,q){D=P.memoizedState,T=T(q,D),T=T==null?D:r({},D,T),P.memoizedState=T,q=P.updateQueue,q!==null&&P.expirationTime===0&&(q.baseState=T)}var $r={isMounted:function(P){return(P=P._reactInternalFiber)?Be(P)===P:!1},enqueueSetState:function(P,D,T){P=P._reactInternalFiber;var q=ma(),W=pt.suspense;q=HA(q,P,W),W=Cs(q,W),W.payload=D,T!=null&&(W.callback=T),tt(P,W),Sc(P,q)},enqueueReplaceState:function(P,D,T){P=P._reactInternalFiber;var q=ma(),W=pt.suspense;q=HA(q,P,W),W=Cs(q,W),W.tag=1,W.payload=D,T!=null&&(W.callback=T),tt(P,W),Sc(P,q)},enqueueForceUpdate:function(P,D){P=P._reactInternalFiber;var T=ma(),q=pt.suspense;T=HA(T,P,q),q=Cs(T,q),q.tag=2,D!=null&&(q.callback=D),tt(P,q),Sc(P,T)}};function ji(P,D,T,q,W,fe,De){return P=P.stateNode,typeof P.shouldComponentUpdate==\"function\"?P.shouldComponentUpdate(q,fe,De):D.prototype&&D.prototype.isPureReactComponent?!Fn(T,q)||!Fn(W,fe):!0}function rs(P,D,T){var q=!1,W=Ti,fe=D.contextType;return typeof fe==\"object\"&&fe!==null?fe=Es(fe):(W=ii(D)?ir:On.current,q=D.contextTypes,fe=(q=q!=null)?Me(P,W):Ti),D=new D(T,fe),P.memoizedState=D.state!==null&&D.state!==void 0?D.state:null,D.updater=$r,P.stateNode=D,D._reactInternalFiber=P,q&&(P=P.stateNode,P.__reactInternalMemoizedUnmaskedChildContext=W,P.__reactInternalMemoizedMaskedChildContext=fe),D}function bi(P,D,T,q){P=D.state,typeof D.componentWillReceiveProps==\"function\"&&D.componentWillReceiveProps(T,q),typeof D.UNSAFE_componentWillReceiveProps==\"function\"&&D.UNSAFE_componentWillReceiveProps(T,q),D.state!==P&&$r.enqueueReplaceState(D,D.state,null)}function qo(P,D,T,q){var W=P.stateNode;W.props=T,W.state=P.memoizedState,W.refs=Nt;var fe=D.contextType;typeof fe==\"object\"&&fe!==null?W.context=Es(fe):(fe=ii(D)?ir:On.current,W.context=Me(P,fe)),fe=P.updateQueue,fe!==null&&(ye(P,fe,T,W,q),W.state=P.memoizedState),fe=D.getDerivedStateFromProps,typeof fe==\"function\"&&(rr(P,D,fe,T),W.state=P.memoizedState),typeof D.getDerivedStateFromProps==\"function\"||typeof W.getSnapshotBeforeUpdate==\"function\"||typeof W.UNSAFE_componentWillMount!=\"function\"&&typeof W.componentWillMount!=\"function\"||(D=W.state,typeof W.componentWillMount==\"function\"&&W.componentWillMount(),typeof W.UNSAFE_componentWillMount==\"function\"&&W.UNSAFE_componentWillMount(),D!==W.state&&$r.enqueueReplaceState(W,W.state,null),fe=P.updateQueue,fe!==null&&(ye(P,fe,T,W,q),W.state=P.memoizedState)),typeof W.componentDidMount==\"function\"&&(P.effectTag|=4)}var xA=Array.isArray;function kA(P,D,T){if(P=T.ref,P!==null&&typeof P!=\"function\"&&typeof P!=\"object\"){if(T._owner){if(T=T._owner,T){if(T.tag!==1)throw Error(n(309));var q=T.stateNode}if(!q)throw Error(n(147,P));var W=\"\"+P;return D!==null&&D.ref!==null&&typeof D.ref==\"function\"&&D.ref._stringRef===W?D.ref:(D=function(fe){var De=q.refs;De===Nt&&(De=q.refs={}),fe===null?delete De[W]:De[W]=fe},D._stringRef=W,D)}if(typeof P!=\"string\")throw Error(n(284));if(!T._owner)throw Error(n(290,P))}return P}function cp(P,D){if(P.type!==\"textarea\")throw Error(n(31,Object.prototype.toString.call(D)===\"[object Object]\"?\"object with keys {\"+Object.keys(D).join(\", \")+\"}\":D,\"\"))}function e0(P){function D(nt,Ve){if(P){var At=nt.lastEffect;At!==null?(At.nextEffect=Ve,nt.lastEffect=Ve):nt.firstEffect=nt.lastEffect=Ve,Ve.nextEffect=null,Ve.effectTag=8}}function T(nt,Ve){if(!P)return null;for(;Ve!==null;)D(nt,Ve),Ve=Ve.sibling;return null}function q(nt,Ve){for(nt=new Map;Ve!==null;)Ve.key!==null?nt.set(Ve.key,Ve):nt.set(Ve.index,Ve),Ve=Ve.sibling;return nt}function W(nt,Ve,At){return nt=YA(nt,Ve,At),nt.index=0,nt.sibling=null,nt}function fe(nt,Ve,At){return nt.index=At,P?(At=nt.alternate,At!==null?(At=At.index,At<Ve?(nt.effectTag=2,Ve):At):(nt.effectTag=2,Ve)):Ve}function De(nt){return P&&nt.alternate===null&&(nt.effectTag=2),nt}function vt(nt,Ve,At,Wt){return Ve===null||Ve.tag!==6?(Ve=gw(At,nt.mode,Wt),Ve.return=nt,Ve):(Ve=W(Ve,At,Wt),Ve.return=nt,Ve)}function wt(nt,Ve,At,Wt){return Ve!==null&&Ve.elementType===At.type?(Wt=W(Ve,At.props,Wt),Wt.ref=kA(nt,Ve,At),Wt.return=nt,Wt):(Wt=xd(At.type,At.key,At.props,null,nt.mode,Wt),Wt.ref=kA(nt,Ve,At),Wt.return=nt,Wt)}function St(nt,Ve,At,Wt){return Ve===null||Ve.tag!==4||Ve.stateNode.containerInfo!==At.containerInfo||Ve.stateNode.implementation!==At.implementation?(Ve=dw(At,nt.mode,Wt),Ve.return=nt,Ve):(Ve=W(Ve,At.children||[],Wt),Ve.return=nt,Ve)}function _r(nt,Ve,At,Wt,vr){return Ve===null||Ve.tag!==7?(Ve=ku(At,nt.mode,Wt,vr),Ve.return=nt,Ve):(Ve=W(Ve,At,Wt),Ve.return=nt,Ve)}function os(nt,Ve,At){if(typeof Ve==\"string\"||typeof Ve==\"number\")return Ve=gw(\"\"+Ve,nt.mode,At),Ve.return=nt,Ve;if(typeof Ve==\"object\"&&Ve!==null){switch(Ve.$$typeof){case p:return At=xd(Ve.type,Ve.key,Ve.props,null,nt.mode,At),At.ref=kA(nt,null,Ve),At.return=nt,At;case h:return Ve=dw(Ve,nt.mode,At),Ve.return=nt,Ve}if(xA(Ve)||ce(Ve))return Ve=ku(Ve,nt.mode,At,null),Ve.return=nt,Ve;cp(nt,Ve)}return null}function di(nt,Ve,At,Wt){var vr=Ve!==null?Ve.key:null;if(typeof At==\"string\"||typeof At==\"number\")return vr!==null?null:vt(nt,Ve,\"\"+At,Wt);if(typeof At==\"object\"&&At!==null){switch(At.$$typeof){case p:return At.key===vr?At.type===E?_r(nt,Ve,At.props.children,Wt,vr):wt(nt,Ve,At,Wt):null;case h:return At.key===vr?St(nt,Ve,At,Wt):null}if(xA(At)||ce(At))return vr!==null?null:_r(nt,Ve,At,Wt,null);cp(nt,At)}return null}function po(nt,Ve,At,Wt,vr){if(typeof Wt==\"string\"||typeof Wt==\"number\")return nt=nt.get(At)||null,vt(Ve,nt,\"\"+Wt,vr);if(typeof Wt==\"object\"&&Wt!==null){switch(Wt.$$typeof){case p:return nt=nt.get(Wt.key===null?At:Wt.key)||null,Wt.type===E?_r(Ve,nt,Wt.props.children,vr,Wt.key):wt(Ve,nt,Wt,vr);case h:return nt=nt.get(Wt.key===null?At:Wt.key)||null,St(Ve,nt,Wt,vr)}if(xA(Wt)||ce(Wt))return nt=nt.get(At)||null,_r(Ve,nt,Wt,vr,null);cp(Ve,Wt)}return null}function KA(nt,Ve,At,Wt){for(var vr=null,bn=null,Qr=Ve,Sn=Ve=0,ai=null;Qr!==null&&Sn<At.length;Sn++){Qr.index>Sn?(ai=Qr,Qr=null):ai=Qr.sibling;var tn=di(nt,Qr,At[Sn],Wt);if(tn===null){Qr===null&&(Qr=ai);break}P&&Qr&&tn.alternate===null&&D(nt,Qr),Ve=fe(tn,Ve,Sn),bn===null?vr=tn:bn.sibling=tn,bn=tn,Qr=ai}if(Sn===At.length)return T(nt,Qr),vr;if(Qr===null){for(;Sn<At.length;Sn++)Qr=os(nt,At[Sn],Wt),Qr!==null&&(Ve=fe(Qr,Ve,Sn),bn===null?vr=Qr:bn.sibling=Qr,bn=Qr);return vr}for(Qr=q(nt,Qr);Sn<At.length;Sn++)ai=po(Qr,nt,Sn,At[Sn],Wt),ai!==null&&(P&&ai.alternate!==null&&Qr.delete(ai.key===null?Sn:ai.key),Ve=fe(ai,Ve,Sn),bn===null?vr=ai:bn.sibling=ai,bn=ai);return P&&Qr.forEach(function(ho){return D(nt,ho)}),vr}function Yo(nt,Ve,At,Wt){var vr=ce(At);if(typeof vr!=\"function\")throw Error(n(150));if(At=vr.call(At),At==null)throw Error(n(151));for(var bn=vr=null,Qr=Ve,Sn=Ve=0,ai=null,tn=At.next();Qr!==null&&!tn.done;Sn++,tn=At.next()){Qr.index>Sn?(ai=Qr,Qr=null):ai=Qr.sibling;var ho=di(nt,Qr,tn.value,Wt);if(ho===null){Qr===null&&(Qr=ai);break}P&&Qr&&ho.alternate===null&&D(nt,Qr),Ve=fe(ho,Ve,Sn),bn===null?vr=ho:bn.sibling=ho,bn=ho,Qr=ai}if(tn.done)return T(nt,Qr),vr;if(Qr===null){for(;!tn.done;Sn++,tn=At.next())tn=os(nt,tn.value,Wt),tn!==null&&(Ve=fe(tn,Ve,Sn),bn===null?vr=tn:bn.sibling=tn,bn=tn);return vr}for(Qr=q(nt,Qr);!tn.done;Sn++,tn=At.next())tn=po(Qr,nt,Sn,tn.value,Wt),tn!==null&&(P&&tn.alternate!==null&&Qr.delete(tn.key===null?Sn:tn.key),Ve=fe(tn,Ve,Sn),bn===null?vr=tn:bn.sibling=tn,bn=tn);return P&&Qr.forEach(function(pF){return D(nt,pF)}),vr}return function(nt,Ve,At,Wt){var vr=typeof At==\"object\"&&At!==null&&At.type===E&&At.key===null;vr&&(At=At.props.children);var bn=typeof At==\"object\"&&At!==null;if(bn)switch(At.$$typeof){case p:e:{for(bn=At.key,vr=Ve;vr!==null;){if(vr.key===bn)if(vr.tag===7?At.type===E:vr.elementType===At.type){T(nt,vr.sibling),Ve=W(vr,At.type===E?At.props.children:At.props,Wt),Ve.ref=kA(nt,vr,At),Ve.return=nt,nt=Ve;break e}else{T(nt,vr);break}else D(nt,vr);vr=vr.sibling}At.type===E?(Ve=ku(At.props.children,nt.mode,Wt,At.key),Ve.return=nt,nt=Ve):(Wt=xd(At.type,At.key,At.props,null,nt.mode,Wt),Wt.ref=kA(nt,Ve,At),Wt.return=nt,nt=Wt)}return De(nt);case h:e:{for(vr=At.key;Ve!==null;){if(Ve.key===vr)if(Ve.tag===4&&Ve.stateNode.containerInfo===At.containerInfo&&Ve.stateNode.implementation===At.implementation){T(nt,Ve.sibling),Ve=W(Ve,At.children||[],Wt),Ve.return=nt,nt=Ve;break e}else{T(nt,Ve);break}else D(nt,Ve);Ve=Ve.sibling}Ve=dw(At,nt.mode,Wt),Ve.return=nt,nt=Ve}return De(nt)}if(typeof At==\"string\"||typeof At==\"number\")return At=\"\"+At,Ve!==null&&Ve.tag===6?(T(nt,Ve.sibling),Ve=W(Ve,At,Wt),Ve.return=nt,nt=Ve):(T(nt,Ve),Ve=gw(At,nt.mode,Wt),Ve.return=nt,nt=Ve),De(nt);if(xA(At))return KA(nt,Ve,At,Wt);if(ce(At))return Yo(nt,Ve,At,Wt);if(bn&&cp(nt,At),typeof At>\"u\"&&!vr)switch(nt.tag){case 1:case 0:throw nt=nt.type,Error(n(152,nt.displayName||nt.name||\"Component\"))}return T(nt,Ve)}}var mu=e0(!0),t0=e0(!1),yu={},uo={current:yu},QA={current:yu},yc={current:yu};function Aa(P){if(P===yu)throw Error(n(174));return P}function r0(P,D){Mn(yc,D,P),Mn(QA,P,P),Mn(uo,yu,P),D=ne(D),Vn(uo,P),Mn(uo,D,P)}function Ec(P){Vn(uo,P),Vn(QA,P),Vn(yc,P)}function hd(P){var D=Aa(yc.current),T=Aa(uo.current);D=Z(T,P.type,D),T!==D&&(Mn(QA,P,P),Mn(uo,D,P))}function n0(P){QA.current===P&&(Vn(uo,P),Vn(QA,P))}var $n={current:0};function up(P){for(var D=P;D!==null;){if(D.tag===13){var T=D.memoizedState;if(T!==null&&(T=T.dehydrated,T===null||Os(T)||so(T)))return D}else if(D.tag===19&&D.memoizedProps.revealOrder!==void 0){if(D.effectTag&64)return D}else if(D.child!==null){D.child.return=D,D=D.child;continue}if(D===P)break;for(;D.sibling===null;){if(D.return===null||D.return===P)return null;D=D.return}D.sibling.return=D.return,D=D.sibling}return null}function i0(P,D){return{responder:P,props:D}}var FA=u.ReactCurrentDispatcher,js=u.ReactCurrentBatchConfig,Eu=0,ja=null,Gi=null,fa=null,Cu=null,ws=null,Cc=null,wc=0,Y=null,Dt=0,wl=!1,Si=null,Ic=0;function ct(){throw Error(n(321))}function wu(P,D){if(D===null)return!1;for(var T=0;T<D.length&&T<P.length;T++)if(!ds(P[T],D[T]))return!1;return!0}function s0(P,D,T,q,W,fe){if(Eu=fe,ja=D,fa=P!==null?P.memoizedState:null,FA.current=fa===null?rw:md,D=T(q,W),wl){do wl=!1,Ic+=1,fa=P!==null?P.memoizedState:null,Cc=Cu,Y=ws=Gi=null,FA.current=md,D=T(q,W);while(wl);Si=null,Ic=0}if(FA.current=Bu,P=ja,P.memoizedState=Cu,P.expirationTime=wc,P.updateQueue=Y,P.effectTag|=Dt,P=Gi!==null&&Gi.next!==null,Eu=0,Cc=ws=Cu=fa=Gi=ja=null,wc=0,Y=null,Dt=0,P)throw Error(n(300));return D}function tw(){FA.current=Bu,Eu=0,Cc=ws=Cu=fa=Gi=ja=null,wc=0,Y=null,Dt=0,wl=!1,Si=null,Ic=0}function RA(){var P={memoizedState:null,baseState:null,queue:null,baseUpdate:null,next:null};return ws===null?Cu=ws=P:ws=ws.next=P,ws}function Ap(){if(Cc!==null)ws=Cc,Cc=ws.next,Gi=fa,fa=Gi!==null?Gi.next:null;else{if(fa===null)throw Error(n(310));Gi=fa;var P={memoizedState:Gi.memoizedState,baseState:Gi.baseState,queue:Gi.queue,baseUpdate:Gi.baseUpdate,next:null};ws=ws===null?Cu=P:ws.next=P,fa=Gi.next}return ws}function Br(P,D){return typeof D==\"function\"?D(P):D}function Is(P){var D=Ap(),T=D.queue;if(T===null)throw Error(n(311));if(T.lastRenderedReducer=P,0<Ic){var q=T.dispatch;if(Si!==null){var W=Si.get(T);if(W!==void 0){Si.delete(T);var fe=D.memoizedState;do fe=P(fe,W.action),W=W.next;while(W!==null);return ds(fe,D.memoizedState)||(jo=!0),D.memoizedState=fe,D.baseUpdate===T.last&&(D.baseState=fe),T.lastRenderedState=fe,[fe,q]}}return[D.memoizedState,q]}q=T.last;var De=D.baseUpdate;if(fe=D.baseState,De!==null?(q!==null&&(q.next=null),q=De.next):q=q!==null?q.next:null,q!==null){var vt=W=null,wt=q,St=!1;do{var _r=wt.expirationTime;_r<Eu?(St||(St=!0,vt=De,W=fe),_r>wc&&(wc=_r,Sd(wc))):(uw(_r,wt.suspenseConfig),fe=wt.eagerReducer===P?wt.eagerState:P(fe,wt.action)),De=wt,wt=wt.next}while(wt!==null&&wt!==q);St||(vt=De,W=fe),ds(fe,D.memoizedState)||(jo=!0),D.memoizedState=fe,D.baseUpdate=vt,D.baseState=W,T.lastRenderedState=fe}return[D.memoizedState,T.dispatch]}function o0(P){var D=RA();return typeof P==\"function\"&&(P=P()),D.memoizedState=D.baseState=P,P=D.queue={last:null,dispatch:null,lastRenderedReducer:Br,lastRenderedState:P},P=P.dispatch=A0.bind(null,ja,P),[D.memoizedState,P]}function a0(P){return Is(Br,P)}function l0(P,D,T,q){return P={tag:P,create:D,destroy:T,deps:q,next:null},Y===null?(Y={lastEffect:null},Y.lastEffect=P.next=P):(D=Y.lastEffect,D===null?Y.lastEffect=P.next=P:(T=D.next,D.next=P,P.next=T,Y.lastEffect=P)),P}function fp(P,D,T,q){var W=RA();Dt|=P,W.memoizedState=l0(D,T,void 0,q===void 0?null:q)}function Bc(P,D,T,q){var W=Ap();q=q===void 0?null:q;var fe=void 0;if(Gi!==null){var De=Gi.memoizedState;if(fe=De.destroy,q!==null&&wu(q,De.deps)){l0(0,T,fe,q);return}}Dt|=P,W.memoizedState=l0(D,T,fe,q)}function Ct(P,D){return fp(516,192,P,D)}function gd(P,D){return Bc(516,192,P,D)}function c0(P,D){if(typeof D==\"function\")return P=P(),D(P),function(){D(null)};if(D!=null)return P=P(),D.current=P,function(){D.current=null}}function u0(){}function Iu(P,D){return RA().memoizedState=[P,D===void 0?null:D],P}function dd(P,D){var T=Ap();D=D===void 0?null:D;var q=T.memoizedState;return q!==null&&D!==null&&wu(D,q[1])?q[0]:(T.memoizedState=[P,D],P)}function A0(P,D,T){if(!(25>Ic))throw Error(n(301));var q=P.alternate;if(P===ja||q!==null&&q===ja)if(wl=!0,P={expirationTime:Eu,suspenseConfig:null,action:T,eagerReducer:null,eagerState:null,next:null},Si===null&&(Si=new Map),T=Si.get(D),T===void 0)Si.set(D,P);else{for(D=T;D.next!==null;)D=D.next;D.next=P}else{var W=ma(),fe=pt.suspense;W=HA(W,P,fe),fe={expirationTime:W,suspenseConfig:fe,action:T,eagerReducer:null,eagerState:null,next:null};var De=D.last;if(De===null)fe.next=fe;else{var vt=De.next;vt!==null&&(fe.next=vt),De.next=fe}if(D.last=fe,P.expirationTime===0&&(q===null||q.expirationTime===0)&&(q=D.lastRenderedReducer,q!==null))try{var wt=D.lastRenderedState,St=q(wt,T);if(fe.eagerReducer=q,fe.eagerState=St,ds(St,wt))return}catch{}finally{}Sc(P,W)}}var Bu={readContext:Es,useCallback:ct,useContext:ct,useEffect:ct,useImperativeHandle:ct,useLayoutEffect:ct,useMemo:ct,useReducer:ct,useRef:ct,useState:ct,useDebugValue:ct,useResponder:ct,useDeferredValue:ct,useTransition:ct},rw={readContext:Es,useCallback:Iu,useContext:Es,useEffect:Ct,useImperativeHandle:function(P,D,T){return T=T!=null?T.concat([P]):null,fp(4,36,c0.bind(null,D,P),T)},useLayoutEffect:function(P,D){return fp(4,36,P,D)},useMemo:function(P,D){var T=RA();return D=D===void 0?null:D,P=P(),T.memoizedState=[P,D],P},useReducer:function(P,D,T){var q=RA();return D=T!==void 0?T(D):D,q.memoizedState=q.baseState=D,P=q.queue={last:null,dispatch:null,lastRenderedReducer:P,lastRenderedState:D},P=P.dispatch=A0.bind(null,ja,P),[q.memoizedState,P]},useRef:function(P){var D=RA();return P={current:P},D.memoizedState=P},useState:o0,useDebugValue:u0,useResponder:i0,useDeferredValue:function(P,D){var T=o0(P),q=T[0],W=T[1];return Ct(function(){a.unstable_next(function(){var fe=js.suspense;js.suspense=D===void 0?null:D;try{W(P)}finally{js.suspense=fe}})},[P,D]),q},useTransition:function(P){var D=o0(!1),T=D[0],q=D[1];return[Iu(function(W){q(!0),a.unstable_next(function(){var fe=js.suspense;js.suspense=P===void 0?null:P;try{q(!1),W()}finally{js.suspense=fe}})},[P,T]),T]}},md={readContext:Es,useCallback:dd,useContext:Es,useEffect:gd,useImperativeHandle:function(P,D,T){return T=T!=null?T.concat([P]):null,Bc(4,36,c0.bind(null,D,P),T)},useLayoutEffect:function(P,D){return Bc(4,36,P,D)},useMemo:function(P,D){var T=Ap();D=D===void 0?null:D;var q=T.memoizedState;return q!==null&&D!==null&&wu(D,q[1])?q[0]:(P=P(),T.memoizedState=[P,D],P)},useReducer:Is,useRef:function(){return Ap().memoizedState},useState:a0,useDebugValue:u0,useResponder:i0,useDeferredValue:function(P,D){var T=a0(P),q=T[0],W=T[1];return gd(function(){a.unstable_next(function(){var fe=js.suspense;js.suspense=D===void 0?null:D;try{W(P)}finally{js.suspense=fe}})},[P,D]),q},useTransition:function(P){var D=a0(!1),T=D[0],q=D[1];return[dd(function(W){q(!0),a.unstable_next(function(){var fe=js.suspense;js.suspense=P===void 0?null:P;try{q(!1),W()}finally{js.suspense=fe}})},[P,T]),T]}},pa=null,vc=null,Il=!1;function vu(P,D){var T=Dl(5,null,null,0);T.elementType=\"DELETED\",T.type=\"DELETED\",T.stateNode=D,T.return=P,T.effectTag=8,P.lastEffect!==null?(P.lastEffect.nextEffect=T,P.lastEffect=T):P.firstEffect=P.lastEffect=T}function f0(P,D){switch(P.tag){case 5:return D=io(D,P.type,P.pendingProps),D!==null?(P.stateNode=D,!0):!1;case 6:return D=Pi(D,P.pendingProps),D!==null?(P.stateNode=D,!0):!1;case 13:return!1;default:return!1}}function TA(P){if(Il){var D=vc;if(D){var T=D;if(!f0(P,D)){if(D=uc(T),!D||!f0(P,D)){P.effectTag=P.effectTag&-1025|2,Il=!1,pa=P;return}vu(pa,T)}pa=P,vc=Au(D)}else P.effectTag=P.effectTag&-1025|2,Il=!1,pa=P}}function pp(P){for(P=P.return;P!==null&&P.tag!==5&&P.tag!==3&&P.tag!==13;)P=P.return;pa=P}function Ga(P){if(!y||P!==pa)return!1;if(!Il)return pp(P),Il=!0,!1;var D=P.type;if(P.tag!==5||D!==\"head\"&&D!==\"body\"&&!Fe(D,P.memoizedProps))for(D=vc;D;)vu(P,D),D=uc(D);if(pp(P),P.tag===13){if(!y)throw Error(n(316));if(P=P.memoizedState,P=P!==null?P.dehydrated:null,!P)throw Error(n(317));vc=Us(P)}else vc=pa?uc(P.stateNode):null;return!0}function p0(){y&&(vc=pa=null,Il=!1)}var hp=u.ReactCurrentOwner,jo=!1;function Bs(P,D,T,q){D.child=P===null?t0(D,null,T,q):mu(D,P.child,T,q)}function wi(P,D,T,q,W){T=T.render;var fe=D.ref;return ys(D,W),q=s0(P,D,T,q,fe,W),P!==null&&!jo?(D.updateQueue=P.updateQueue,D.effectTag&=-517,P.expirationTime<=W&&(P.expirationTime=0),si(P,D,W)):(D.effectTag|=1,Bs(P,D,q,W),D.child)}function yd(P,D,T,q,W,fe){if(P===null){var De=T.type;return typeof De==\"function\"&&!hw(De)&&De.defaultProps===void 0&&T.compare===null&&T.defaultProps===void 0?(D.tag=15,D.type=De,Ed(P,D,De,q,W,fe)):(P=xd(T.type,null,q,null,D.mode,fe),P.ref=D.ref,P.return=D,D.child=P)}return De=P.child,W<fe&&(W=De.memoizedProps,T=T.compare,T=T!==null?T:Fn,T(W,q)&&P.ref===D.ref)?si(P,D,fe):(D.effectTag|=1,P=YA(De,q,fe),P.ref=D.ref,P.return=D,D.child=P)}function Ed(P,D,T,q,W,fe){return P!==null&&Fn(P.memoizedProps,q)&&P.ref===D.ref&&(jo=!1,W<fe)?si(P,D,fe):NA(P,D,T,q,fe)}function Go(P,D){var T=D.ref;(P===null&&T!==null||P!==null&&P.ref!==T)&&(D.effectTag|=128)}function NA(P,D,T,q,W){var fe=ii(T)?ir:On.current;return fe=Me(D,fe),ys(D,W),T=s0(P,D,T,q,fe,W),P!==null&&!jo?(D.updateQueue=P.updateQueue,D.effectTag&=-517,P.expirationTime<=W&&(P.expirationTime=0),si(P,D,W)):(D.effectTag|=1,Bs(P,D,T,W),D.child)}function gp(P,D,T,q,W){if(ii(T)){var fe=!0;fc(D)}else fe=!1;if(ys(D,W),D.stateNode===null)P!==null&&(P.alternate=null,D.alternate=null,D.effectTag|=2),rs(D,T,q,W),qo(D,T,q,W),q=!0;else if(P===null){var De=D.stateNode,vt=D.memoizedProps;De.props=vt;var wt=De.context,St=T.contextType;typeof St==\"object\"&&St!==null?St=Es(St):(St=ii(T)?ir:On.current,St=Me(D,St));var _r=T.getDerivedStateFromProps,os=typeof _r==\"function\"||typeof De.getSnapshotBeforeUpdate==\"function\";os||typeof De.UNSAFE_componentWillReceiveProps!=\"function\"&&typeof De.componentWillReceiveProps!=\"function\"||(vt!==q||wt!==St)&&bi(D,De,q,St),qs=!1;var di=D.memoizedState;wt=De.state=di;var po=D.updateQueue;po!==null&&(ye(D,po,q,De,W),wt=D.memoizedState),vt!==q||di!==wt||_i.current||qs?(typeof _r==\"function\"&&(rr(D,T,_r,q),wt=D.memoizedState),(vt=qs||ji(D,T,vt,q,di,wt,St))?(os||typeof De.UNSAFE_componentWillMount!=\"function\"&&typeof De.componentWillMount!=\"function\"||(typeof De.componentWillMount==\"function\"&&De.componentWillMount(),typeof De.UNSAFE_componentWillMount==\"function\"&&De.UNSAFE_componentWillMount()),typeof De.componentDidMount==\"function\"&&(D.effectTag|=4)):(typeof De.componentDidMount==\"function\"&&(D.effectTag|=4),D.memoizedProps=q,D.memoizedState=wt),De.props=q,De.state=wt,De.context=St,q=vt):(typeof De.componentDidMount==\"function\"&&(D.effectTag|=4),q=!1)}else De=D.stateNode,vt=D.memoizedProps,De.props=D.type===D.elementType?vt:Ei(D.type,vt),wt=De.context,St=T.contextType,typeof St==\"object\"&&St!==null?St=Es(St):(St=ii(T)?ir:On.current,St=Me(D,St)),_r=T.getDerivedStateFromProps,(os=typeof _r==\"function\"||typeof De.getSnapshotBeforeUpdate==\"function\")||typeof De.UNSAFE_componentWillReceiveProps!=\"function\"&&typeof De.componentWillReceiveProps!=\"function\"||(vt!==q||wt!==St)&&bi(D,De,q,St),qs=!1,wt=D.memoizedState,di=De.state=wt,po=D.updateQueue,po!==null&&(ye(D,po,q,De,W),di=D.memoizedState),vt!==q||wt!==di||_i.current||qs?(typeof _r==\"function\"&&(rr(D,T,_r,q),di=D.memoizedState),(_r=qs||ji(D,T,vt,q,wt,di,St))?(os||typeof De.UNSAFE_componentWillUpdate!=\"function\"&&typeof De.componentWillUpdate!=\"function\"||(typeof De.componentWillUpdate==\"function\"&&De.componentWillUpdate(q,di,St),typeof De.UNSAFE_componentWillUpdate==\"function\"&&De.UNSAFE_componentWillUpdate(q,di,St)),typeof De.componentDidUpdate==\"function\"&&(D.effectTag|=4),typeof De.getSnapshotBeforeUpdate==\"function\"&&(D.effectTag|=256)):(typeof De.componentDidUpdate!=\"function\"||vt===P.memoizedProps&&wt===P.memoizedState||(D.effectTag|=4),typeof De.getSnapshotBeforeUpdate!=\"function\"||vt===P.memoizedProps&&wt===P.memoizedState||(D.effectTag|=256),D.memoizedProps=q,D.memoizedState=di),De.props=q,De.state=di,De.context=St,q=_r):(typeof De.componentDidUpdate!=\"function\"||vt===P.memoizedProps&&wt===P.memoizedState||(D.effectTag|=4),typeof De.getSnapshotBeforeUpdate!=\"function\"||vt===P.memoizedProps&&wt===P.memoizedState||(D.effectTag|=256),q=!1);return dp(P,D,T,q,fe,W)}function dp(P,D,T,q,W,fe){Go(P,D);var De=(D.effectTag&64)!==0;if(!q&&!De)return W&&El(D,T,!1),si(P,D,fe);q=D.stateNode,hp.current=D;var vt=De&&typeof T.getDerivedStateFromError!=\"function\"?null:q.render();return D.effectTag|=1,P!==null&&De?(D.child=mu(D,P.child,null,fe),D.child=mu(D,null,vt,fe)):Bs(P,D,vt,fe),D.memoizedState=q.state,W&&El(D,T,!0),D.child}function h0(P){var D=P.stateNode;D.pendingContext?Ac(P,D.pendingContext,D.pendingContext!==D.context):D.context&&Ac(P,D.context,!1),r0(P,D.containerInfo)}var ha={dehydrated:null,retryTime:0};function cn(P,D,T){var q=D.mode,W=D.pendingProps,fe=$n.current,De=!1,vt;if((vt=(D.effectTag&64)!==0)||(vt=(fe&2)!==0&&(P===null||P.memoizedState!==null)),vt?(De=!0,D.effectTag&=-65):P!==null&&P.memoizedState===null||W.fallback===void 0||W.unstable_avoidThisFallback===!0||(fe|=1),Mn($n,fe&1,D),P===null){if(W.fallback!==void 0&&TA(D),De){if(De=W.fallback,W=ku(null,q,0,null),W.return=D,!(D.mode&2))for(P=D.memoizedState!==null?D.child.child:D.child,W.child=P;P!==null;)P.return=W,P=P.sibling;return T=ku(De,q,T,null),T.return=D,W.sibling=T,D.memoizedState=ha,D.child=W,T}return q=W.children,D.memoizedState=null,D.child=t0(D,null,q,T)}if(P.memoizedState!==null){if(P=P.child,q=P.sibling,De){if(W=W.fallback,T=YA(P,P.pendingProps,0),T.return=D,!(D.mode&2)&&(De=D.memoizedState!==null?D.child.child:D.child,De!==P.child))for(T.child=De;De!==null;)De.return=T,De=De.sibling;return q=YA(q,W,q.expirationTime),q.return=D,T.sibling=q,T.childExpirationTime=0,D.memoizedState=ha,D.child=T,q}return T=mu(D,P.child,W.children,T),D.memoizedState=null,D.child=T}if(P=P.child,De){if(De=W.fallback,W=ku(null,q,0,null),W.return=D,W.child=P,P!==null&&(P.return=W),!(D.mode&2))for(P=D.memoizedState!==null?D.child.child:D.child,W.child=P;P!==null;)P.return=W,P=P.sibling;return T=ku(De,q,T,null),T.return=D,W.sibling=T,T.effectTag|=2,W.childExpirationTime=0,D.memoizedState=ha,D.child=W,T}return D.memoizedState=null,D.child=mu(D,P,W.children,T)}function Ao(P,D){P.expirationTime<D&&(P.expirationTime=D);var T=P.alternate;T!==null&&T.expirationTime<D&&(T.expirationTime=D),ms(P.return,D)}function LA(P,D,T,q,W,fe){var De=P.memoizedState;De===null?P.memoizedState={isBackwards:D,rendering:null,last:q,tail:T,tailExpiration:0,tailMode:W,lastEffect:fe}:(De.isBackwards=D,De.rendering=null,De.last=q,De.tail=T,De.tailExpiration=0,De.tailMode=W,De.lastEffect=fe)}function Ya(P,D,T){var q=D.pendingProps,W=q.revealOrder,fe=q.tail;if(Bs(P,D,q.children,T),q=$n.current,q&2)q=q&1|2,D.effectTag|=64;else{if(P!==null&&P.effectTag&64)e:for(P=D.child;P!==null;){if(P.tag===13)P.memoizedState!==null&&Ao(P,T);else if(P.tag===19)Ao(P,T);else if(P.child!==null){P.child.return=P,P=P.child;continue}if(P===D)break e;for(;P.sibling===null;){if(P.return===null||P.return===D)break e;P=P.return}P.sibling.return=P.return,P=P.sibling}q&=1}if(Mn($n,q,D),!(D.mode&2))D.memoizedState=null;else switch(W){case\"forwards\":for(T=D.child,W=null;T!==null;)P=T.alternate,P!==null&&up(P)===null&&(W=T),T=T.sibling;T=W,T===null?(W=D.child,D.child=null):(W=T.sibling,T.sibling=null),LA(D,!1,W,T,fe,D.lastEffect);break;case\"backwards\":for(T=null,W=D.child,D.child=null;W!==null;){if(P=W.alternate,P!==null&&up(P)===null){D.child=W;break}P=W.sibling,W.sibling=T,T=W,W=P}LA(D,!0,T,null,fe,D.lastEffect);break;case\"together\":LA(D,!1,null,null,void 0,D.lastEffect);break;default:D.memoizedState=null}return D.child}function si(P,D,T){P!==null&&(D.dependencies=P.dependencies);var q=D.expirationTime;if(q!==0&&Sd(q),D.childExpirationTime<T)return null;if(P!==null&&D.child!==P.child)throw Error(n(153));if(D.child!==null){for(P=D.child,T=YA(P,P.pendingProps,P.expirationTime),D.child=T,T.return=D;P.sibling!==null;)P=P.sibling,T=T.sibling=YA(P,P.pendingProps,P.expirationTime),T.return=D;T.sibling=null}return D.child}function ga(P){P.effectTag|=4}var Dc,Bl,ns,Yr;if(w)Dc=function(P,D){for(var T=D.child;T!==null;){if(T.tag===5||T.tag===6)H(P,T.stateNode);else if(T.tag!==4&&T.child!==null){T.child.return=T,T=T.child;continue}if(T===D)break;for(;T.sibling===null;){if(T.return===null||T.return===D)return;T=T.return}T.sibling.return=T.return,T=T.sibling}},Bl=function(){},ns=function(P,D,T,q,W){if(P=P.memoizedProps,P!==q){var fe=D.stateNode,De=Aa(uo.current);T=Te(fe,T,P,q,W,De),(D.updateQueue=T)&&ga(D)}},Yr=function(P,D,T,q){T!==q&&ga(D)};else if(b){Dc=function(P,D,T,q){for(var W=D.child;W!==null;){if(W.tag===5){var fe=W.stateNode;T&&q&&(fe=Ri(fe,W.type,W.memoizedProps,W)),H(P,fe)}else if(W.tag===6)fe=W.stateNode,T&&q&&(fe=gs(fe,W.memoizedProps,W)),H(P,fe);else if(W.tag!==4){if(W.tag===13&&W.effectTag&4&&(fe=W.memoizedState!==null)){var De=W.child;if(De!==null&&(De.child!==null&&(De.child.return=De,Dc(P,De,!0,fe)),fe=De.sibling,fe!==null)){fe.return=W,W=fe;continue}}if(W.child!==null){W.child.return=W,W=W.child;continue}}if(W===D)break;for(;W.sibling===null;){if(W.return===null||W.return===D)return;W=W.return}W.sibling.return=W.return,W=W.sibling}};var mp=function(P,D,T,q){for(var W=D.child;W!==null;){if(W.tag===5){var fe=W.stateNode;T&&q&&(fe=Ri(fe,W.type,W.memoizedProps,W)),Kr(P,fe)}else if(W.tag===6)fe=W.stateNode,T&&q&&(fe=gs(fe,W.memoizedProps,W)),Kr(P,fe);else if(W.tag!==4){if(W.tag===13&&W.effectTag&4&&(fe=W.memoizedState!==null)){var De=W.child;if(De!==null&&(De.child!==null&&(De.child.return=De,mp(P,De,!0,fe)),fe=De.sibling,fe!==null)){fe.return=W,W=fe;continue}}if(W.child!==null){W.child.return=W,W=W.child;continue}}if(W===D)break;for(;W.sibling===null;){if(W.return===null||W.return===D)return;W=W.return}W.sibling.return=W.return,W=W.sibling}};Bl=function(P){var D=P.stateNode;if(P.firstEffect!==null){var T=D.containerInfo,q=Sr(T);mp(q,P,!1,!1),D.pendingChildren=q,ga(P),Kn(T,q)}},ns=function(P,D,T,q,W){var fe=P.stateNode,De=P.memoizedProps;if((P=D.firstEffect===null)&&De===q)D.stateNode=fe;else{var vt=D.stateNode,wt=Aa(uo.current),St=null;De!==q&&(St=Te(vt,T,De,q,W,wt)),P&&St===null?D.stateNode=fe:(fe=mr(fe,St,T,De,q,D,P,vt),rt(fe,T,q,W,wt)&&ga(D),D.stateNode=fe,P?ga(D):Dc(fe,D,!1,!1))}},Yr=function(P,D,T,q){T!==q&&(P=Aa(yc.current),T=Aa(uo.current),D.stateNode=Ye(q,P,T,D),ga(D))}}else Bl=function(){},ns=function(){},Yr=function(){};function Pc(P,D){switch(P.tailMode){case\"hidden\":D=P.tail;for(var T=null;D!==null;)D.alternate!==null&&(T=D),D=D.sibling;T===null?P.tail=null:T.sibling=null;break;case\"collapsed\":T=P.tail;for(var q=null;T!==null;)T.alternate!==null&&(q=T),T=T.sibling;q===null?D||P.tail===null?P.tail=null:P.tail.sibling=null:q.sibling=null}}function nw(P){switch(P.tag){case 1:ii(P.type)&&Ha(P);var D=P.effectTag;return D&4096?(P.effectTag=D&-4097|64,P):null;case 3:if(Ec(P),hr(P),D=P.effectTag,D&64)throw Error(n(285));return P.effectTag=D&-4097|64,P;case 5:return n0(P),null;case 13:return Vn($n,P),D=P.effectTag,D&4096?(P.effectTag=D&-4097|64,P):null;case 19:return Vn($n,P),null;case 4:return Ec(P),null;case 10:return Ci(P),null;default:return null}}function g0(P,D){return{value:P,source:D,stack:ml(D)}}var d0=typeof WeakSet==\"function\"?WeakSet:Set;function Wa(P,D){var T=D.source,q=D.stack;q===null&&T!==null&&(q=ml(T)),T!==null&&de(T.type),D=D.value,P!==null&&P.tag===1&&de(P.type);try{console.error(D)}catch(W){setTimeout(function(){throw W})}}function Cd(P,D){try{D.props=P.memoizedProps,D.state=P.memoizedState,D.componentWillUnmount()}catch(T){GA(P,T)}}function m0(P){var D=P.ref;if(D!==null)if(typeof D==\"function\")try{D(null)}catch(T){GA(P,T)}else D.current=null}function Qt(P,D){switch(D.tag){case 0:case 11:case 15:N(2,0,D);break;case 1:if(D.effectTag&256&&P!==null){var T=P.memoizedProps,q=P.memoizedState;P=D.stateNode,D=P.getSnapshotBeforeUpdate(D.elementType===D.type?T:Ei(D.type,T),q),P.__reactInternalSnapshotBeforeUpdate=D}break;case 3:case 5:case 6:case 4:case 17:break;default:throw Error(n(163))}}function N(P,D,T){if(T=T.updateQueue,T=T!==null?T.lastEffect:null,T!==null){var q=T=T.next;do{if(q.tag&P){var W=q.destroy;q.destroy=void 0,W!==void 0&&W()}q.tag&D&&(W=q.create,q.destroy=W()),q=q.next}while(q!==T)}}function K(P,D,T){switch(typeof pw==\"function\"&&pw(D),D.tag){case 0:case 11:case 14:case 15:if(P=D.updateQueue,P!==null&&(P=P.lastEffect,P!==null)){var q=P.next;lo(97<T?97:T,function(){var W=q;do{var fe=W.destroy;if(fe!==void 0){var De=D;try{fe()}catch(vt){GA(De,vt)}}W=W.next}while(W!==q)})}break;case 1:m0(D),T=D.stateNode,typeof T.componentWillUnmount==\"function\"&&Cd(D,T);break;case 5:m0(D);break;case 4:w?Cr(P,D,T):b&&ze(D)}}function re(P,D,T){for(var q=D;;)if(K(P,q,T),q.child===null||w&&q.tag===4){if(q===D)break;for(;q.sibling===null;){if(q.return===null||q.return===D)return;q=q.return}q.sibling.return=q.return,q=q.sibling}else q.child.return=q,q=q.child}function he(P){var D=P.alternate;P.return=null,P.child=null,P.memoizedState=null,P.updateQueue=null,P.dependencies=null,P.alternate=null,P.firstEffect=null,P.lastEffect=null,P.pendingProps=null,P.memoizedProps=null,D!==null&&he(D)}function ze(P){if(b){P=P.stateNode.containerInfo;var D=Sr(P);Ms(P,D)}}function mt(P){return P.tag===5||P.tag===3||P.tag===4}function fr(P){if(w){e:{for(var D=P.return;D!==null;){if(mt(D)){var T=D;break e}D=D.return}throw Error(n(160))}switch(D=T.stateNode,T.tag){case 5:var q=!1;break;case 3:D=D.containerInfo,q=!0;break;case 4:D=D.containerInfo,q=!0;break;default:throw Error(n(161))}T.effectTag&16&&(jt(D),T.effectTag&=-17);e:t:for(T=P;;){for(;T.sibling===null;){if(T.return===null||mt(T.return)){T=null;break e}T=T.return}for(T.sibling.return=T.return,T=T.sibling;T.tag!==5&&T.tag!==6&&T.tag!==18;){if(T.effectTag&2||T.child===null||T.tag===4)continue t;T.child.return=T,T=T.child}if(!(T.effectTag&2)){T=T.stateNode;break e}}for(var W=P;;){var fe=W.tag===5||W.tag===6;if(fe)fe=fe?W.stateNode:W.stateNode.instance,T?q?Re(D,fe,T):Se(D,fe,T):q?J(D,fe):F(D,fe);else if(W.tag!==4&&W.child!==null){W.child.return=W,W=W.child;continue}if(W===P)break;for(;W.sibling===null;){if(W.return===null||W.return===P)return;W=W.return}W.sibling.return=W.return,W=W.sibling}}}function Cr(P,D,T){for(var q=D,W=!1,fe,De;;){if(!W){W=q.return;e:for(;;){if(W===null)throw Error(n(160));switch(fe=W.stateNode,W.tag){case 5:De=!1;break e;case 3:fe=fe.containerInfo,De=!0;break e;case 4:fe=fe.containerInfo,De=!0;break e}W=W.return}W=!0}if(q.tag===5||q.tag===6)re(P,q,T),De?dt(fe,q.stateNode):at(fe,q.stateNode);else if(q.tag===4){if(q.child!==null){fe=q.stateNode.containerInfo,De=!0,q.child.return=q,q=q.child;continue}}else if(K(P,q,T),q.child!==null){q.child.return=q,q=q.child;continue}if(q===D)break;for(;q.sibling===null;){if(q.return===null||q.return===D)return;q=q.return,q.tag===4&&(W=!1)}q.sibling.return=q.return,q=q.sibling}}function yn(P,D){if(w)switch(D.tag){case 0:case 11:case 14:case 15:N(4,8,D);break;case 1:break;case 5:var T=D.stateNode;if(T!=null){var q=D.memoizedProps;P=P!==null?P.memoizedProps:q;var W=D.type,fe=D.updateQueue;D.updateQueue=null,fe!==null&&ie(T,fe,W,P,q,D)}break;case 6:if(D.stateNode===null)throw Error(n(162));T=D.memoizedProps,X(D.stateNode,P!==null?P.memoizedProps:T,T);break;case 3:y&&(D=D.stateNode,D.hydrate&&(D.hydrate=!1,Dn(D.containerInfo)));break;case 12:break;case 13:oi(D),Li(D);break;case 19:Li(D);break;case 17:break;case 20:break;case 21:break;default:throw Error(n(163))}else{switch(D.tag){case 0:case 11:case 14:case 15:N(4,8,D);return;case 12:return;case 13:oi(D),Li(D);return;case 19:Li(D);return;case 3:y&&(T=D.stateNode,T.hydrate&&(T.hydrate=!1,Dn(T.containerInfo)))}e:if(b)switch(D.tag){case 1:case 5:case 6:case 20:break e;case 3:case 4:D=D.stateNode,Ms(D.containerInfo,D.pendingChildren);break e;default:throw Error(n(163))}}}function oi(P){var D=P;if(P.memoizedState===null)var T=!1;else T=!0,D=P.child,ow=Ni();if(w&&D!==null){e:if(P=D,w)for(D=P;;){if(D.tag===5){var q=D.stateNode;T?tr(q):ln(D.stateNode,D.memoizedProps)}else if(D.tag===6)q=D.stateNode,T?bt(q):kr(q,D.memoizedProps);else if(D.tag===13&&D.memoizedState!==null&&D.memoizedState.dehydrated===null){q=D.child.sibling,q.return=D,D=q;continue}else if(D.child!==null){D.child.return=D,D=D.child;continue}if(D===P)break e;for(;D.sibling===null;){if(D.return===null||D.return===P)break e;D=D.return}D.sibling.return=D.return,D=D.sibling}}}function Li(P){var D=P.updateQueue;if(D!==null){P.updateQueue=null;var T=P.stateNode;T===null&&(T=P.stateNode=new d0),D.forEach(function(q){var W=aF.bind(null,P,q);T.has(q)||(T.add(q),q.then(W,W))})}}var y0=typeof WeakMap==\"function\"?WeakMap:Map;function bv(P,D,T){T=Cs(T,null),T.tag=3,T.payload={element:null};var q=D.value;return T.callback=function(){Pu||(Pu=!0,Dd=q),Wa(P,D)},T}function Sv(P,D,T){T=Cs(T,null),T.tag=3;var q=P.type.getDerivedStateFromError;if(typeof q==\"function\"){var W=D.value;T.payload=function(){return Wa(P,D),q(W)}}var fe=P.stateNode;return fe!==null&&typeof fe.componentDidCatch==\"function\"&&(T.callback=function(){typeof q!=\"function\"&&(bu===null?bu=new Set([this]):bu.add(this),Wa(P,D));var De=D.stack;this.componentDidCatch(D.value,{componentStack:De!==null?De:\"\"})}),T}var iw=Math.ceil,yp=u.ReactCurrentDispatcher,sw=u.ReactCurrentOwner,En=0,wd=8,is=16,Gs=32,Du=0,Id=1,Ii=2,da=3,vl=4,bc=5,yr=En,gi=null,Mr=null,ss=0,Yi=Du,Bd=null,Ka=1073741823,MA=1073741823,vd=null,Ep=0,OA=!1,ow=0,aw=500,lr=null,Pu=!1,Dd=null,bu=null,Cp=!1,E0=null,UA=90,_A=null,C0=0,lw=null,Pd=0;function ma(){return(yr&(is|Gs))!==En?1073741821-(Ni()/10|0):Pd!==0?Pd:Pd=1073741821-(Ni()/10|0)}function HA(P,D,T){if(D=D.mode,!(D&2))return 1073741823;var q=_o();if(!(D&4))return q===99?1073741823:1073741822;if((yr&is)!==En)return ss;if(T!==null)P=qa(P,T.timeoutMs|0||5e3,250);else switch(q){case 99:P=1073741823;break;case 98:P=qa(P,150,100);break;case 97:case 96:P=qa(P,5e3,250);break;case 95:P=2;break;default:throw Error(n(326))}return gi!==null&&P===ss&&--P,P}function Sc(P,D){if(50<C0)throw C0=0,lw=null,Error(n(185));if(P=w0(P,D),P!==null){var T=_o();D===1073741823?(yr&wd)!==En&&(yr&(is|Gs))===En?cw(P):(fo(P),yr===En&&qi()):fo(P),(yr&4)===En||T!==98&&T!==99||(_A===null?_A=new Map([[P,D]]):(T=_A.get(P),(T===void 0||T>D)&&_A.set(P,D)))}}function w0(P,D){P.expirationTime<D&&(P.expirationTime=D);var T=P.alternate;T!==null&&T.expirationTime<D&&(T.expirationTime=D);var q=P.return,W=null;if(q===null&&P.tag===3)W=P.stateNode;else for(;q!==null;){if(T=q.alternate,q.childExpirationTime<D&&(q.childExpirationTime=D),T!==null&&T.childExpirationTime<D&&(T.childExpirationTime=D),q.return===null&&q.tag===3){W=q.stateNode;break}q=q.return}return W!==null&&(gi===W&&(Sd(D),Yi===vl&&WA(W,ss)),Mv(W,D)),W}function bd(P){var D=P.lastExpiredTime;return D!==0||(D=P.firstPendingTime,!Lv(P,D))?D:(D=P.lastPingedTime,P=P.nextKnownPendingLevel,D>P?D:P)}function fo(P){if(P.lastExpiredTime!==0)P.callbackExpirationTime=1073741823,P.callbackPriority=99,P.callbackNode=gu(cw.bind(null,P));else{var D=bd(P),T=P.callbackNode;if(D===0)T!==null&&(P.callbackNode=null,P.callbackExpirationTime=0,P.callbackPriority=90);else{var q=ma();if(D===1073741823?q=99:D===1||D===2?q=95:(q=10*(1073741821-D)-10*(1073741821-q),q=0>=q?99:250>=q?98:5250>=q?97:95),T!==null){var W=P.callbackPriority;if(P.callbackExpirationTime===D&&W>=q)return;T!==PA&&Ie(T)}P.callbackExpirationTime=D,P.callbackPriority=q,D=D===1073741823?gu(cw.bind(null,P)):dc(q,xv.bind(null,P),{timeout:10*(1073741821-D)-Ni()}),P.callbackNode=D}}}function xv(P,D){if(Pd=0,D)return D=ma(),kd(P,D),fo(P),null;var T=bd(P);if(T!==0){if(D=P.callbackNode,(yr&(is|Gs))!==En)throw Error(n(327));if(wp(),P===gi&&T===ss||Su(P,T),Mr!==null){var q=yr;yr|=is;var W=jA(P);do try{rF();break}catch(vt){qA(P,vt)}while(!0);if(ua(),yr=q,yp.current=W,Yi===Id)throw D=Bd,Su(P,T),WA(P,T),fo(P),D;if(Mr===null)switch(W=P.finishedWork=P.current.alternate,P.finishedExpirationTime=T,q=Yi,gi=null,q){case Du:case Id:throw Error(n(345));case Ii:kd(P,2<T?2:T);break;case da:if(WA(P,T),q=P.lastSuspendedTime,T===q&&(P.nextKnownPendingLevel=Aw(W)),Ka===1073741823&&(W=ow+aw-Ni(),10<W)){if(OA){var fe=P.lastPingedTime;if(fe===0||fe>=T){P.lastPingedTime=T,Su(P,T);break}}if(fe=bd(P),fe!==0&&fe!==T)break;if(q!==0&&q!==T){P.lastPingedTime=q;break}P.timeoutHandle=be(xu.bind(null,P),W);break}xu(P);break;case vl:if(WA(P,T),q=P.lastSuspendedTime,T===q&&(P.nextKnownPendingLevel=Aw(W)),OA&&(W=P.lastPingedTime,W===0||W>=T)){P.lastPingedTime=T,Su(P,T);break}if(W=bd(P),W!==0&&W!==T)break;if(q!==0&&q!==T){P.lastPingedTime=q;break}if(MA!==1073741823?q=10*(1073741821-MA)-Ni():Ka===1073741823?q=0:(q=10*(1073741821-Ka)-5e3,W=Ni(),T=10*(1073741821-T)-W,q=W-q,0>q&&(q=0),q=(120>q?120:480>q?480:1080>q?1080:1920>q?1920:3e3>q?3e3:4320>q?4320:1960*iw(q/1960))-q,T<q&&(q=T)),10<q){P.timeoutHandle=be(xu.bind(null,P),q);break}xu(P);break;case bc:if(Ka!==1073741823&&vd!==null){fe=Ka;var De=vd;if(q=De.busyMinDurationMs|0,0>=q?q=0:(W=De.busyDelayMs|0,fe=Ni()-(10*(1073741821-fe)-(De.timeoutMs|0||5e3)),q=fe<=W?0:W+q-fe),10<q){WA(P,T),P.timeoutHandle=be(xu.bind(null,P),q);break}}xu(P);break;default:throw Error(n(329))}if(fo(P),P.callbackNode===D)return xv.bind(null,P)}}return null}function cw(P){var D=P.lastExpiredTime;if(D=D!==0?D:1073741823,P.finishedExpirationTime===D)xu(P);else{if((yr&(is|Gs))!==En)throw Error(n(327));if(wp(),P===gi&&D===ss||Su(P,D),Mr!==null){var T=yr;yr|=is;var q=jA(P);do try{tF();break}catch(W){qA(P,W)}while(!0);if(ua(),yr=T,yp.current=q,Yi===Id)throw T=Bd,Su(P,D),WA(P,D),fo(P),T;if(Mr!==null)throw Error(n(261));P.finishedWork=P.current.alternate,P.finishedExpirationTime=D,gi=null,xu(P),fo(P)}}return null}function kv(P,D){kd(P,D),fo(P),(yr&(is|Gs))===En&&qi()}function eF(){if(_A!==null){var P=_A;_A=null,P.forEach(function(D,T){kd(T,D),fo(T)}),qi()}}function Qv(P,D){if((yr&(is|Gs))!==En)throw Error(n(187));var T=yr;yr|=1;try{return lo(99,P.bind(null,D))}finally{yr=T,qi()}}function Su(P,D){P.finishedWork=null,P.finishedExpirationTime=0;var T=P.timeoutHandle;if(T!==Ue&&(P.timeoutHandle=Ue,et(T)),Mr!==null)for(T=Mr.return;T!==null;){var q=T;switch(q.tag){case 1:var W=q.type.childContextTypes;W!=null&&Ha(q);break;case 3:Ec(q),hr(q);break;case 5:n0(q);break;case 4:Ec(q);break;case 13:Vn($n,q);break;case 19:Vn($n,q);break;case 10:Ci(q)}T=T.return}gi=P,Mr=YA(P.current,null,D),ss=D,Yi=Du,Bd=null,MA=Ka=1073741823,vd=null,Ep=0,OA=!1}function qA(P,D){do{try{if(ua(),tw(),Mr===null||Mr.return===null)return Yi=Id,Bd=D,null;e:{var T=P,q=Mr.return,W=Mr,fe=D;if(D=ss,W.effectTag|=2048,W.firstEffect=W.lastEffect=null,fe!==null&&typeof fe==\"object\"&&typeof fe.then==\"function\"){var De=fe,vt=($n.current&1)!==0,wt=q;do{var St;if(St=wt.tag===13){var _r=wt.memoizedState;if(_r!==null)St=_r.dehydrated!==null;else{var os=wt.memoizedProps;St=os.fallback===void 0?!1:os.unstable_avoidThisFallback!==!0?!0:!vt}}if(St){var di=wt.updateQueue;if(di===null){var po=new Set;po.add(De),wt.updateQueue=po}else di.add(De);if(!(wt.mode&2)){if(wt.effectTag|=64,W.effectTag&=-2981,W.tag===1)if(W.alternate===null)W.tag=17;else{var KA=Cs(1073741823,null);KA.tag=2,tt(W,KA)}W.expirationTime=1073741823;break e}fe=void 0,W=D;var Yo=T.pingCache;if(Yo===null?(Yo=T.pingCache=new y0,fe=new Set,Yo.set(De,fe)):(fe=Yo.get(De),fe===void 0&&(fe=new Set,Yo.set(De,fe))),!fe.has(W)){fe.add(W);var nt=oF.bind(null,T,De,W);De.then(nt,nt)}wt.effectTag|=4096,wt.expirationTime=D;break e}wt=wt.return}while(wt!==null);fe=Error((de(W.type)||\"A React component\")+` suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.`+ml(W))}Yi!==bc&&(Yi=Ii),fe=g0(fe,W),wt=q;do{switch(wt.tag){case 3:De=fe,wt.effectTag|=4096,wt.expirationTime=D;var Ve=bv(wt,De,D);Bt(wt,Ve);break e;case 1:De=fe;var At=wt.type,Wt=wt.stateNode;if(!(wt.effectTag&64)&&(typeof At.getDerivedStateFromError==\"function\"||Wt!==null&&typeof Wt.componentDidCatch==\"function\"&&(bu===null||!bu.has(Wt)))){wt.effectTag|=4096,wt.expirationTime=D;var vr=Sv(wt,De,D);Bt(wt,vr);break e}}wt=wt.return}while(wt!==null)}Mr=Rv(Mr)}catch(bn){D=bn;continue}break}while(!0)}function jA(){var P=yp.current;return yp.current=Bu,P===null?Bu:P}function uw(P,D){P<Ka&&2<P&&(Ka=P),D!==null&&P<MA&&2<P&&(MA=P,vd=D)}function Sd(P){P>Ep&&(Ep=P)}function tF(){for(;Mr!==null;)Mr=Fv(Mr)}function rF(){for(;Mr!==null&&!Tt();)Mr=Fv(Mr)}function Fv(P){var D=Nv(P.alternate,P,ss);return P.memoizedProps=P.pendingProps,D===null&&(D=Rv(P)),sw.current=null,D}function Rv(P){Mr=P;do{var D=Mr.alternate;if(P=Mr.return,Mr.effectTag&2048){if(D=nw(Mr,ss),D!==null)return D.effectTag&=2047,D;P!==null&&(P.firstEffect=P.lastEffect=null,P.effectTag|=2048)}else{e:{var T=D;D=Mr;var q=ss,W=D.pendingProps;switch(D.tag){case 2:break;case 16:break;case 15:case 0:break;case 1:ii(D.type)&&Ha(D);break;case 3:Ec(D),hr(D),W=D.stateNode,W.pendingContext&&(W.context=W.pendingContext,W.pendingContext=null),(T===null||T.child===null)&&Ga(D)&&ga(D),Bl(D);break;case 5:n0(D);var fe=Aa(yc.current);if(q=D.type,T!==null&&D.stateNode!=null)ns(T,D,q,W,fe),T.ref!==D.ref&&(D.effectTag|=128);else if(W){if(T=Aa(uo.current),Ga(D)){if(W=D,!y)throw Error(n(175));T=op(W.stateNode,W.type,W.memoizedProps,fe,T,W),W.updateQueue=T,T=T!==null,T&&ga(D)}else{var De=ht(q,W,fe,T,D);Dc(De,D,!1,!1),D.stateNode=De,rt(De,q,W,fe,T)&&ga(D)}D.ref!==null&&(D.effectTag|=128)}else if(D.stateNode===null)throw Error(n(166));break;case 6:if(T&&D.stateNode!=null)Yr(T,D,T.memoizedProps,W);else{if(typeof W!=\"string\"&&D.stateNode===null)throw Error(n(166));if(T=Aa(yc.current),fe=Aa(uo.current),Ga(D)){if(T=D,!y)throw Error(n(176));(T=ap(T.stateNode,T.memoizedProps,T))&&ga(D)}else D.stateNode=Ye(W,T,fe,D)}break;case 11:break;case 13:if(Vn($n,D),W=D.memoizedState,D.effectTag&64){D.expirationTime=q;break e}W=W!==null,fe=!1,T===null?D.memoizedProps.fallback!==void 0&&Ga(D):(q=T.memoizedState,fe=q!==null,W||q===null||(q=T.child.sibling,q!==null&&(De=D.firstEffect,De!==null?(D.firstEffect=q,q.nextEffect=De):(D.firstEffect=D.lastEffect=q,q.nextEffect=null),q.effectTag=8))),W&&!fe&&D.mode&2&&(T===null&&D.memoizedProps.unstable_avoidThisFallback!==!0||$n.current&1?Yi===Du&&(Yi=da):((Yi===Du||Yi===da)&&(Yi=vl),Ep!==0&&gi!==null&&(WA(gi,ss),Mv(gi,Ep)))),b&&W&&(D.effectTag|=4),w&&(W||fe)&&(D.effectTag|=4);break;case 7:break;case 8:break;case 12:break;case 4:Ec(D),Bl(D);break;case 10:Ci(D);break;case 9:break;case 14:break;case 17:ii(D.type)&&Ha(D);break;case 19:if(Vn($n,D),W=D.memoizedState,W===null)break;if(fe=(D.effectTag&64)!==0,De=W.rendering,De===null){if(fe)Pc(W,!1);else if(Yi!==Du||T!==null&&T.effectTag&64)for(T=D.child;T!==null;){if(De=up(T),De!==null){for(D.effectTag|=64,Pc(W,!1),T=De.updateQueue,T!==null&&(D.updateQueue=T,D.effectTag|=4),W.lastEffect===null&&(D.firstEffect=null),D.lastEffect=W.lastEffect,T=q,W=D.child;W!==null;)fe=W,q=T,fe.effectTag&=2,fe.nextEffect=null,fe.firstEffect=null,fe.lastEffect=null,De=fe.alternate,De===null?(fe.childExpirationTime=0,fe.expirationTime=q,fe.child=null,fe.memoizedProps=null,fe.memoizedState=null,fe.updateQueue=null,fe.dependencies=null):(fe.childExpirationTime=De.childExpirationTime,fe.expirationTime=De.expirationTime,fe.child=De.child,fe.memoizedProps=De.memoizedProps,fe.memoizedState=De.memoizedState,fe.updateQueue=De.updateQueue,q=De.dependencies,fe.dependencies=q===null?null:{expirationTime:q.expirationTime,firstContext:q.firstContext,responders:q.responders}),W=W.sibling;Mn($n,$n.current&1|2,D),D=D.child;break e}T=T.sibling}}else{if(!fe)if(T=up(De),T!==null){if(D.effectTag|=64,fe=!0,T=T.updateQueue,T!==null&&(D.updateQueue=T,D.effectTag|=4),Pc(W,!0),W.tail===null&&W.tailMode===\"hidden\"&&!De.alternate){D=D.lastEffect=W.lastEffect,D!==null&&(D.nextEffect=null);break}}else Ni()>W.tailExpiration&&1<q&&(D.effectTag|=64,fe=!0,Pc(W,!1),D.expirationTime=D.childExpirationTime=q-1);W.isBackwards?(De.sibling=D.child,D.child=De):(T=W.last,T!==null?T.sibling=De:D.child=De,W.last=De)}if(W.tail!==null){W.tailExpiration===0&&(W.tailExpiration=Ni()+500),T=W.tail,W.rendering=T,W.tail=T.sibling,W.lastEffect=D.lastEffect,T.sibling=null,W=$n.current,W=fe?W&1|2:W&1,Mn($n,W,D),D=T;break e}break;case 20:break;case 21:break;default:throw Error(n(156,D.tag))}D=null}if(T=Mr,ss===1||T.childExpirationTime!==1){for(W=0,fe=T.child;fe!==null;)q=fe.expirationTime,De=fe.childExpirationTime,q>W&&(W=q),De>W&&(W=De),fe=fe.sibling;T.childExpirationTime=W}if(D!==null)return D;P!==null&&!(P.effectTag&2048)&&(P.firstEffect===null&&(P.firstEffect=Mr.firstEffect),Mr.lastEffect!==null&&(P.lastEffect!==null&&(P.lastEffect.nextEffect=Mr.firstEffect),P.lastEffect=Mr.lastEffect),1<Mr.effectTag&&(P.lastEffect!==null?P.lastEffect.nextEffect=Mr:P.firstEffect=Mr,P.lastEffect=Mr))}if(D=Mr.sibling,D!==null)return D;Mr=P}while(Mr!==null);return Yi===Du&&(Yi=bc),null}function Aw(P){var D=P.expirationTime;return P=P.childExpirationTime,D>P?D:P}function xu(P){var D=_o();return lo(99,nF.bind(null,P,D)),null}function nF(P,D){do wp();while(E0!==null);if((yr&(is|Gs))!==En)throw Error(n(327));var T=P.finishedWork,q=P.finishedExpirationTime;if(T===null)return null;if(P.finishedWork=null,P.finishedExpirationTime=0,T===P.current)throw Error(n(177));P.callbackNode=null,P.callbackExpirationTime=0,P.callbackPriority=90,P.nextKnownPendingLevel=0;var W=Aw(T);if(P.firstPendingTime=W,q<=P.lastSuspendedTime?P.firstSuspendedTime=P.lastSuspendedTime=P.nextKnownPendingLevel=0:q<=P.firstSuspendedTime&&(P.firstSuspendedTime=q-1),q<=P.lastPingedTime&&(P.lastPingedTime=0),q<=P.lastExpiredTime&&(P.lastExpiredTime=0),P===gi&&(Mr=gi=null,ss=0),1<T.effectTag?T.lastEffect!==null?(T.lastEffect.nextEffect=T,W=T.firstEffect):W=T:W=T.firstEffect,W!==null){var fe=yr;yr|=Gs,sw.current=null,xe(P.containerInfo),lr=W;do try{iF()}catch(ho){if(lr===null)throw Error(n(330));GA(lr,ho),lr=lr.nextEffect}while(lr!==null);lr=W;do try{for(var De=P,vt=D;lr!==null;){var wt=lr.effectTag;if(wt&16&&w&&jt(lr.stateNode),wt&128){var St=lr.alternate;if(St!==null){var _r=St.ref;_r!==null&&(typeof _r==\"function\"?_r(null):_r.current=null)}}switch(wt&1038){case 2:fr(lr),lr.effectTag&=-3;break;case 6:fr(lr),lr.effectTag&=-3,yn(lr.alternate,lr);break;case 1024:lr.effectTag&=-1025;break;case 1028:lr.effectTag&=-1025,yn(lr.alternate,lr);break;case 4:yn(lr.alternate,lr);break;case 8:var os=De,di=lr,po=vt;w?Cr(os,di,po):re(os,di,po),he(di)}lr=lr.nextEffect}}catch(ho){if(lr===null)throw Error(n(330));GA(lr,ho),lr=lr.nextEffect}while(lr!==null);Ne(P.containerInfo),P.current=T,lr=W;do try{for(wt=q;lr!==null;){var KA=lr.effectTag;if(KA&36){var Yo=lr.alternate;switch(St=lr,_r=wt,St.tag){case 0:case 11:case 15:N(16,32,St);break;case 1:var nt=St.stateNode;if(St.effectTag&4)if(Yo===null)nt.componentDidMount();else{var Ve=St.elementType===St.type?Yo.memoizedProps:Ei(St.type,Yo.memoizedProps);nt.componentDidUpdate(Ve,Yo.memoizedState,nt.__reactInternalSnapshotBeforeUpdate)}var At=St.updateQueue;At!==null&&Le(St,At,nt,_r);break;case 3:var Wt=St.updateQueue;if(Wt!==null){if(De=null,St.child!==null)switch(St.child.tag){case 5:De=Ae(St.child.stateNode);break;case 1:De=St.child.stateNode}Le(St,Wt,De,_r)}break;case 5:var vr=St.stateNode;Yo===null&&St.effectTag&4&&$(vr,St.type,St.memoizedProps,St);break;case 6:break;case 4:break;case 12:break;case 13:if(y&&St.memoizedState===null){var bn=St.alternate;if(bn!==null){var Qr=bn.memoizedState;if(Qr!==null){var Sn=Qr.dehydrated;Sn!==null&&oo(Sn)}}}break;case 19:case 17:case 20:case 21:break;default:throw Error(n(163))}}if(KA&128){St=void 0;var ai=lr.ref;if(ai!==null){var tn=lr.stateNode;switch(lr.tag){case 5:St=Ae(tn);break;default:St=tn}typeof ai==\"function\"?ai(St):ai.current=St}}lr=lr.nextEffect}}catch(ho){if(lr===null)throw Error(n(330));GA(lr,ho),lr=lr.nextEffect}while(lr!==null);lr=null,Qn(),yr=fe}else P.current=T;if(Cp)Cp=!1,E0=P,UA=D;else for(lr=W;lr!==null;)D=lr.nextEffect,lr.nextEffect=null,lr=D;if(D=P.firstPendingTime,D===0&&(bu=null),D===1073741823?P===lw?C0++:(C0=0,lw=P):C0=0,typeof fw==\"function\"&&fw(T.stateNode,q),fo(P),Pu)throw Pu=!1,P=Dd,Dd=null,P;return(yr&wd)!==En||qi(),null}function iF(){for(;lr!==null;){var P=lr.effectTag;P&256&&Qt(lr.alternate,lr),!(P&512)||Cp||(Cp=!0,dc(97,function(){return wp(),null})),lr=lr.nextEffect}}function wp(){if(UA!==90){var P=97<UA?97:UA;return UA=90,lo(P,sF)}}function sF(){if(E0===null)return!1;var P=E0;if(E0=null,(yr&(is|Gs))!==En)throw Error(n(331));var D=yr;for(yr|=Gs,P=P.current.firstEffect;P!==null;){try{var T=P;if(T.effectTag&512)switch(T.tag){case 0:case 11:case 15:N(128,0,T),N(0,64,T)}}catch(q){if(P===null)throw Error(n(330));GA(P,q)}T=P.nextEffect,P.nextEffect=null,P=T}return yr=D,qi(),!0}function Tv(P,D,T){D=g0(T,D),D=bv(P,D,1073741823),tt(P,D),P=w0(P,1073741823),P!==null&&fo(P)}function GA(P,D){if(P.tag===3)Tv(P,P,D);else for(var T=P.return;T!==null;){if(T.tag===3){Tv(T,P,D);break}else if(T.tag===1){var q=T.stateNode;if(typeof T.type.getDerivedStateFromError==\"function\"||typeof q.componentDidCatch==\"function\"&&(bu===null||!bu.has(q))){P=g0(D,P),P=Sv(T,P,1073741823),tt(T,P),T=w0(T,1073741823),T!==null&&fo(T);break}}T=T.return}}function oF(P,D,T){var q=P.pingCache;q!==null&&q.delete(D),gi===P&&ss===T?Yi===vl||Yi===da&&Ka===1073741823&&Ni()-ow<aw?Su(P,ss):OA=!0:Lv(P,T)&&(D=P.lastPingedTime,D!==0&&D<T||(P.lastPingedTime=T,P.finishedExpirationTime===T&&(P.finishedExpirationTime=0,P.finishedWork=null),fo(P)))}function aF(P,D){var T=P.stateNode;T!==null&&T.delete(D),D=0,D===0&&(D=ma(),D=HA(D,P,null)),P=w0(P,D),P!==null&&fo(P)}var Nv;Nv=function(P,D,T){var q=D.expirationTime;if(P!==null){var W=D.pendingProps;if(P.memoizedProps!==W||_i.current)jo=!0;else{if(q<T){switch(jo=!1,D.tag){case 3:h0(D),p0();break;case 5:if(hd(D),D.mode&4&&T!==1&&ke(D.type,W))return D.expirationTime=D.childExpirationTime=1,null;break;case 1:ii(D.type)&&fc(D);break;case 4:r0(D,D.stateNode.containerInfo);break;case 10:Ho(D,D.memoizedProps.value);break;case 13:if(D.memoizedState!==null)return q=D.child.childExpirationTime,q!==0&&q>=T?cn(P,D,T):(Mn($n,$n.current&1,D),D=si(P,D,T),D!==null?D.sibling:null);Mn($n,$n.current&1,D);break;case 19:if(q=D.childExpirationTime>=T,P.effectTag&64){if(q)return Ya(P,D,T);D.effectTag|=64}if(W=D.memoizedState,W!==null&&(W.rendering=null,W.tail=null),Mn($n,$n.current,D),!q)return null}return si(P,D,T)}jo=!1}}else jo=!1;switch(D.expirationTime=0,D.tag){case 2:if(q=D.type,P!==null&&(P.alternate=null,D.alternate=null,D.effectTag|=2),P=D.pendingProps,W=Me(D,On.current),ys(D,T),W=s0(null,D,q,P,W,T),D.effectTag|=1,typeof W==\"object\"&&W!==null&&typeof W.render==\"function\"&&W.$$typeof===void 0){if(D.tag=1,tw(),ii(q)){var fe=!0;fc(D)}else fe=!1;D.memoizedState=W.state!==null&&W.state!==void 0?W.state:null;var De=q.getDerivedStateFromProps;typeof De==\"function\"&&rr(D,q,De,P),W.updater=$r,D.stateNode=W,W._reactInternalFiber=D,qo(D,q,P,T),D=dp(null,D,q,!0,fe,T)}else D.tag=0,Bs(null,D,W,T),D=D.child;return D;case 16:if(W=D.elementType,P!==null&&(P.alternate=null,D.alternate=null,D.effectTag|=2),P=D.pendingProps,Ce(W),W._status!==1)throw W._result;switch(W=W._result,D.type=W,fe=D.tag=uF(W),P=Ei(W,P),fe){case 0:D=NA(null,D,W,P,T);break;case 1:D=gp(null,D,W,P,T);break;case 11:D=wi(null,D,W,P,T);break;case 14:D=yd(null,D,W,Ei(W.type,P),q,T);break;default:throw Error(n(306,W,\"\"))}return D;case 0:return q=D.type,W=D.pendingProps,W=D.elementType===q?W:Ei(q,W),NA(P,D,q,W,T);case 1:return q=D.type,W=D.pendingProps,W=D.elementType===q?W:Ei(q,W),gp(P,D,q,W,T);case 3:if(h0(D),q=D.updateQueue,q===null)throw Error(n(282));if(W=D.memoizedState,W=W!==null?W.element:null,ye(D,q,D.pendingProps,null,T),q=D.memoizedState.element,q===W)p0(),D=si(P,D,T);else{if((W=D.stateNode.hydrate)&&(y?(vc=Au(D.stateNode.containerInfo),pa=D,W=Il=!0):W=!1),W)for(T=t0(D,null,q,T),D.child=T;T;)T.effectTag=T.effectTag&-3|1024,T=T.sibling;else Bs(P,D,q,T),p0();D=D.child}return D;case 5:return hd(D),P===null&&TA(D),q=D.type,W=D.pendingProps,fe=P!==null?P.memoizedProps:null,De=W.children,Fe(q,W)?De=null:fe!==null&&Fe(q,fe)&&(D.effectTag|=16),Go(P,D),D.mode&4&&T!==1&&ke(q,W)?(D.expirationTime=D.childExpirationTime=1,D=null):(Bs(P,D,De,T),D=D.child),D;case 6:return P===null&&TA(D),null;case 13:return cn(P,D,T);case 4:return r0(D,D.stateNode.containerInfo),q=D.pendingProps,P===null?D.child=mu(D,null,q,T):Bs(P,D,q,T),D.child;case 11:return q=D.type,W=D.pendingProps,W=D.elementType===q?W:Ei(q,W),wi(P,D,q,W,T);case 7:return Bs(P,D,D.pendingProps,T),D.child;case 8:return Bs(P,D,D.pendingProps.children,T),D.child;case 12:return Bs(P,D,D.pendingProps.children,T),D.child;case 10:e:{if(q=D.type._context,W=D.pendingProps,De=D.memoizedProps,fe=W.value,Ho(D,fe),De!==null){var vt=De.value;if(fe=ds(vt,fe)?0:(typeof q._calculateChangedBits==\"function\"?q._calculateChangedBits(vt,fe):1073741823)|0,fe===0){if(De.children===W.children&&!_i.current){D=si(P,D,T);break e}}else for(vt=D.child,vt!==null&&(vt.return=D);vt!==null;){var wt=vt.dependencies;if(wt!==null){De=vt.child;for(var St=wt.firstContext;St!==null;){if(St.context===q&&St.observedBits&fe){vt.tag===1&&(St=Cs(T,null),St.tag=2,tt(vt,St)),vt.expirationTime<T&&(vt.expirationTime=T),St=vt.alternate,St!==null&&St.expirationTime<T&&(St.expirationTime=T),ms(vt.return,T),wt.expirationTime<T&&(wt.expirationTime=T);break}St=St.next}}else De=vt.tag===10&&vt.type===D.type?null:vt.child;if(De!==null)De.return=vt;else for(De=vt;De!==null;){if(De===D){De=null;break}if(vt=De.sibling,vt!==null){vt.return=De.return,De=vt;break}De=De.return}vt=De}}Bs(P,D,W.children,T),D=D.child}return D;case 9:return W=D.type,fe=D.pendingProps,q=fe.children,ys(D,T),W=Es(W,fe.unstable_observedBits),q=q(W),D.effectTag|=1,Bs(P,D,q,T),D.child;case 14:return W=D.type,fe=Ei(W,D.pendingProps),fe=Ei(W.type,fe),yd(P,D,W,fe,q,T);case 15:return Ed(P,D,D.type,D.pendingProps,q,T);case 17:return q=D.type,W=D.pendingProps,W=D.elementType===q?W:Ei(q,W),P!==null&&(P.alternate=null,D.alternate=null,D.effectTag|=2),D.tag=1,ii(q)?(P=!0,fc(D)):P=!1,ys(D,T),rs(D,q,W,T),qo(D,q,W,T),dp(null,D,q,!0,P,T);case 19:return Ya(P,D,T)}throw Error(n(156,D.tag))};var fw=null,pw=null;function lF(P){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>\"u\")return!1;var D=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(D.isDisabled||!D.supportsFiber)return!0;try{var T=D.inject(P);fw=function(q){try{D.onCommitFiberRoot(T,q,void 0,(q.current.effectTag&64)===64)}catch{}},pw=function(q){try{D.onCommitFiberUnmount(T,q)}catch{}}}catch{}return!0}function cF(P,D,T,q){this.tag=P,this.key=T,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=D,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=q,this.effectTag=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childExpirationTime=this.expirationTime=0,this.alternate=null}function Dl(P,D,T,q){return new cF(P,D,T,q)}function hw(P){return P=P.prototype,!(!P||!P.isReactComponent)}function uF(P){if(typeof P==\"function\")return hw(P)?1:0;if(P!=null){if(P=P.$$typeof,P===L)return 11;if(P===te)return 14}return 2}function YA(P,D){var T=P.alternate;return T===null?(T=Dl(P.tag,D,P.key,P.mode),T.elementType=P.elementType,T.type=P.type,T.stateNode=P.stateNode,T.alternate=P,P.alternate=T):(T.pendingProps=D,T.effectTag=0,T.nextEffect=null,T.firstEffect=null,T.lastEffect=null),T.childExpirationTime=P.childExpirationTime,T.expirationTime=P.expirationTime,T.child=P.child,T.memoizedProps=P.memoizedProps,T.memoizedState=P.memoizedState,T.updateQueue=P.updateQueue,D=P.dependencies,T.dependencies=D===null?null:{expirationTime:D.expirationTime,firstContext:D.firstContext,responders:D.responders},T.sibling=P.sibling,T.index=P.index,T.ref=P.ref,T}function xd(P,D,T,q,W,fe){var De=2;if(q=P,typeof P==\"function\")hw(P)&&(De=1);else if(typeof P==\"string\")De=5;else e:switch(P){case E:return ku(T.children,W,fe,D);case R:De=8,W|=7;break;case I:De=8,W|=1;break;case v:return P=Dl(12,T,D,W|8),P.elementType=v,P.type=v,P.expirationTime=fe,P;case U:return P=Dl(13,T,D,W),P.type=U,P.elementType=U,P.expirationTime=fe,P;case z:return P=Dl(19,T,D,W),P.elementType=z,P.expirationTime=fe,P;default:if(typeof P==\"object\"&&P!==null)switch(P.$$typeof){case x:De=10;break e;case C:De=9;break e;case L:De=11;break e;case te:De=14;break e;case ae:De=16,q=null;break e}throw Error(n(130,P==null?P:typeof P,\"\"))}return D=Dl(De,T,D,W),D.elementType=P,D.type=q,D.expirationTime=fe,D}function ku(P,D,T,q){return P=Dl(7,P,q,D),P.expirationTime=T,P}function gw(P,D,T){return P=Dl(6,P,null,D),P.expirationTime=T,P}function dw(P,D,T){return D=Dl(4,P.children!==null?P.children:[],P.key,D),D.expirationTime=T,D.stateNode={containerInfo:P.containerInfo,pendingChildren:null,implementation:P.implementation},D}function AF(P,D,T){this.tag=D,this.current=null,this.containerInfo=P,this.pingCache=this.pendingChildren=null,this.finishedExpirationTime=0,this.finishedWork=null,this.timeoutHandle=Ue,this.pendingContext=this.context=null,this.hydrate=T,this.callbackNode=null,this.callbackPriority=90,this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}function Lv(P,D){var T=P.firstSuspendedTime;return P=P.lastSuspendedTime,T!==0&&T>=D&&P<=D}function WA(P,D){var T=P.firstSuspendedTime,q=P.lastSuspendedTime;T<D&&(P.firstSuspendedTime=D),(q>D||T===0)&&(P.lastSuspendedTime=D),D<=P.lastPingedTime&&(P.lastPingedTime=0),D<=P.lastExpiredTime&&(P.lastExpiredTime=0)}function Mv(P,D){D>P.firstPendingTime&&(P.firstPendingTime=D);var T=P.firstSuspendedTime;T!==0&&(D>=T?P.firstSuspendedTime=P.lastSuspendedTime=P.nextKnownPendingLevel=0:D>=P.lastSuspendedTime&&(P.lastSuspendedTime=D+1),D>P.nextKnownPendingLevel&&(P.nextKnownPendingLevel=D))}function kd(P,D){var T=P.lastExpiredTime;(T===0||T>D)&&(P.lastExpiredTime=D)}function Ov(P){var D=P._reactInternalFiber;if(D===void 0)throw typeof P.render==\"function\"?Error(n(188)):Error(n(268,Object.keys(P)));return P=me(D),P===null?null:P.stateNode}function Uv(P,D){P=P.memoizedState,P!==null&&P.dehydrated!==null&&P.retryTime<D&&(P.retryTime=D)}function Qd(P,D){Uv(P,D),(P=P.alternate)&&Uv(P,D)}var _v={createContainer:function(P,D,T){return P=new AF(P,D,T),D=Dl(3,null,null,D===2?7:D===1?3:0),P.current=D,D.stateNode=P},updateContainer:function(P,D,T,q){var W=D.current,fe=ma(),De=pt.suspense;fe=HA(fe,W,De);e:if(T){T=T._reactInternalFiber;t:{if(Be(T)!==T||T.tag!==1)throw Error(n(170));var vt=T;do{switch(vt.tag){case 3:vt=vt.stateNode.context;break t;case 1:if(ii(vt.type)){vt=vt.stateNode.__reactInternalMemoizedMergedChildContext;break t}}vt=vt.return}while(vt!==null);throw Error(n(171))}if(T.tag===1){var wt=T.type;if(ii(wt)){T=fu(T,wt,vt);break e}}T=vt}else T=Ti;return D.context===null?D.context=T:D.pendingContext=T,D=Cs(fe,De),D.payload={element:P},q=q===void 0?null:q,q!==null&&(D.callback=q),tt(W,D),Sc(W,fe),fe},batchedEventUpdates:function(P,D){var T=yr;yr|=2;try{return P(D)}finally{yr=T,yr===En&&qi()}},batchedUpdates:function(P,D){var T=yr;yr|=1;try{return P(D)}finally{yr=T,yr===En&&qi()}},unbatchedUpdates:function(P,D){var T=yr;yr&=-2,yr|=wd;try{return P(D)}finally{yr=T,yr===En&&qi()}},deferredUpdates:function(P){return lo(97,P)},syncUpdates:function(P,D,T,q){return lo(99,P.bind(null,D,T,q))},discreteUpdates:function(P,D,T,q){var W=yr;yr|=4;try{return lo(98,P.bind(null,D,T,q))}finally{yr=W,yr===En&&qi()}},flushDiscreteUpdates:function(){(yr&(1|is|Gs))===En&&(eF(),wp())},flushControlled:function(P){var D=yr;yr|=1;try{lo(99,P)}finally{yr=D,yr===En&&qi()}},flushSync:Qv,flushPassiveEffects:wp,IsThisRendererActing:{current:!1},getPublicRootInstance:function(P){if(P=P.current,!P.child)return null;switch(P.child.tag){case 5:return Ae(P.child.stateNode);default:return P.child.stateNode}},attemptSynchronousHydration:function(P){switch(P.tag){case 3:var D=P.stateNode;D.hydrate&&kv(D,D.firstPendingTime);break;case 13:Qv(function(){return Sc(P,1073741823)}),D=qa(ma(),150,100),Qd(P,D)}},attemptUserBlockingHydration:function(P){if(P.tag===13){var D=qa(ma(),150,100);Sc(P,D),Qd(P,D)}},attemptContinuousHydration:function(P){if(P.tag===13){ma();var D=SA++;Sc(P,D),Qd(P,D)}},attemptHydrationAtCurrentPriority:function(P){if(P.tag===13){var D=ma();D=HA(D,P,null),Sc(P,D),Qd(P,D)}},findHostInstance:Ov,findHostInstanceWithWarning:function(P){return Ov(P)},findHostInstanceWithNoPortals:function(P){return P=we(P),P===null?null:P.tag===20?P.stateNode.instance:P.stateNode},shouldSuspend:function(){return!1},injectIntoDevTools:function(P){var D=P.findFiberByHostInstance;return lF(r({},P,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:u.ReactCurrentDispatcher,findHostInstanceByFiber:function(T){return T=me(T),T===null?null:T.stateNode},findFiberByHostInstance:function(T){return D?D(T):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))}};Y2.exports=_v.default||_v;var fF=Y2.exports;return Y2.exports=t,fF}});var FEe=_((vKt,QEe)=>{\"use strict\";QEe.exports=kEe()});var TEe=_((DKt,REe)=>{\"use strict\";var Vyt={ALIGN_COUNT:8,ALIGN_AUTO:0,ALIGN_FLEX_START:1,ALIGN_CENTER:2,ALIGN_FLEX_END:3,ALIGN_STRETCH:4,ALIGN_BASELINE:5,ALIGN_SPACE_BETWEEN:6,ALIGN_SPACE_AROUND:7,DIMENSION_COUNT:2,DIMENSION_WIDTH:0,DIMENSION_HEIGHT:1,DIRECTION_COUNT:3,DIRECTION_INHERIT:0,DIRECTION_LTR:1,DIRECTION_RTL:2,DISPLAY_COUNT:2,DISPLAY_FLEX:0,DISPLAY_NONE:1,EDGE_COUNT:9,EDGE_LEFT:0,EDGE_TOP:1,EDGE_RIGHT:2,EDGE_BOTTOM:3,EDGE_START:4,EDGE_END:5,EDGE_HORIZONTAL:6,EDGE_VERTICAL:7,EDGE_ALL:8,EXPERIMENTAL_FEATURE_COUNT:1,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:0,FLEX_DIRECTION_COUNT:4,FLEX_DIRECTION_COLUMN:0,FLEX_DIRECTION_COLUMN_REVERSE:1,FLEX_DIRECTION_ROW:2,FLEX_DIRECTION_ROW_REVERSE:3,JUSTIFY_COUNT:6,JUSTIFY_FLEX_START:0,JUSTIFY_CENTER:1,JUSTIFY_FLEX_END:2,JUSTIFY_SPACE_BETWEEN:3,JUSTIFY_SPACE_AROUND:4,JUSTIFY_SPACE_EVENLY:5,LOG_LEVEL_COUNT:6,LOG_LEVEL_ERROR:0,LOG_LEVEL_WARN:1,LOG_LEVEL_INFO:2,LOG_LEVEL_DEBUG:3,LOG_LEVEL_VERBOSE:4,LOG_LEVEL_FATAL:5,MEASURE_MODE_COUNT:3,MEASURE_MODE_UNDEFINED:0,MEASURE_MODE_EXACTLY:1,MEASURE_MODE_AT_MOST:2,NODE_TYPE_COUNT:2,NODE_TYPE_DEFAULT:0,NODE_TYPE_TEXT:1,OVERFLOW_COUNT:3,OVERFLOW_VISIBLE:0,OVERFLOW_HIDDEN:1,OVERFLOW_SCROLL:2,POSITION_TYPE_COUNT:2,POSITION_TYPE_RELATIVE:0,POSITION_TYPE_ABSOLUTE:1,PRINT_OPTIONS_COUNT:3,PRINT_OPTIONS_LAYOUT:1,PRINT_OPTIONS_STYLE:2,PRINT_OPTIONS_CHILDREN:4,UNIT_COUNT:4,UNIT_UNDEFINED:0,UNIT_POINT:1,UNIT_PERCENT:2,UNIT_AUTO:3,WRAP_COUNT:3,WRAP_NO_WRAP:0,WRAP_WRAP:1,WRAP_WRAP_REVERSE:2};REe.exports=Vyt});var OEe=_((PKt,MEe)=>{\"use strict\";var zyt=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var r=arguments[e];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(t[o]=r[o])}return t},Nk=function(){function t(e,r){for(var o=0;o<r.length;o++){var a=r[o];a.enumerable=a.enumerable||!1,a.configurable=!0,\"value\"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}return function(e,r,o){return r&&t(e.prototype,r),o&&t(e,o),e}}();function I6(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function B6(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}var nu=TEe(),Jyt=function(){function t(e,r,o,a,n,u){B6(this,t),this.left=e,this.right=r,this.top=o,this.bottom=a,this.width=n,this.height=u}return Nk(t,[{key:\"fromJS\",value:function(r){r(this.left,this.right,this.top,this.bottom,this.width,this.height)}},{key:\"toString\",value:function(){return\"<Layout#\"+this.left+\":\"+this.right+\";\"+this.top+\":\"+this.bottom+\";\"+this.width+\":\"+this.height+\">\"}}]),t}(),NEe=function(){Nk(t,null,[{key:\"fromJS\",value:function(r){var o=r.width,a=r.height;return new t(o,a)}}]);function t(e,r){B6(this,t),this.width=e,this.height=r}return Nk(t,[{key:\"fromJS\",value:function(r){r(this.width,this.height)}},{key:\"toString\",value:function(){return\"<Size#\"+this.width+\"x\"+this.height+\">\"}}]),t}(),LEe=function(){function t(e,r){B6(this,t),this.unit=e,this.value=r}return Nk(t,[{key:\"fromJS\",value:function(r){r(this.unit,this.value)}},{key:\"toString\",value:function(){switch(this.unit){case nu.UNIT_POINT:return String(this.value);case nu.UNIT_PERCENT:return this.value+\"%\";case nu.UNIT_AUTO:return\"auto\";default:return this.value+\"?\"}}},{key:\"valueOf\",value:function(){return this.value}}]),t}();MEe.exports=function(t,e){function r(u,A,p){var h=u[A];u[A]=function(){for(var E=arguments.length,I=Array(E),v=0;v<E;v++)I[v]=arguments[v];return p.call.apply(p,[this,h].concat(I))}}for(var o=[\"setPosition\",\"setMargin\",\"setFlexBasis\",\"setWidth\",\"setHeight\",\"setMinWidth\",\"setMinHeight\",\"setMaxWidth\",\"setMaxHeight\",\"setPadding\"],a=function(){var A,p=o[n],h=(A={},I6(A,nu.UNIT_POINT,e.Node.prototype[p]),I6(A,nu.UNIT_PERCENT,e.Node.prototype[p+\"Percent\"]),I6(A,nu.UNIT_AUTO,e.Node.prototype[p+\"Auto\"]),A);r(e.Node.prototype,p,function(E){for(var I=arguments.length,v=Array(I>1?I-1:0),x=1;x<I;x++)v[x-1]=arguments[x];var C=v.pop(),R=void 0,L=void 0;if(C===\"auto\")R=nu.UNIT_AUTO,L=void 0;else if(C instanceof LEe)R=C.unit,L=C.valueOf();else if(R=typeof C==\"string\"&&C.endsWith(\"%\")?nu.UNIT_PERCENT:nu.UNIT_POINT,L=parseFloat(C),!Number.isNaN(C)&&Number.isNaN(L))throw new Error(\"Invalid value \"+C+\" for \"+p);if(!h[R])throw new Error('Failed to execute \"'+p+`\": Unsupported unit '`+C+\"'\");if(L!==void 0){var U;return(U=h[R]).call.apply(U,[this].concat(v,[L]))}else{var z;return(z=h[R]).call.apply(z,[this].concat(v))}})},n=0;n<o.length;n++)a();return r(e.Config.prototype,\"free\",function(){e.Config.destroy(this)}),r(e.Node,\"create\",function(u,A){return A?e.Node.createWithConfig(A):e.Node.createDefault()}),r(e.Node.prototype,\"free\",function(){e.Node.destroy(this)}),r(e.Node.prototype,\"freeRecursive\",function(){for(var u=0,A=this.getChildCount();u<A;++u)this.getChild(0).freeRecursive();this.free()}),r(e.Node.prototype,\"setMeasureFunc\",function(u,A){return A?u.call(this,function(){return NEe.fromJS(A.apply(void 0,arguments))}):this.unsetMeasureFunc()}),r(e.Node.prototype,\"calculateLayout\",function(u){var A=arguments.length>1&&arguments[1]!==void 0?arguments[1]:NaN,p=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:nu.DIRECTION_LTR;return u.call(this,A,p,h)}),zyt({Config:e.Config,Node:e.Node,Layout:t(\"Layout\",Jyt),Size:t(\"Size\",NEe),Value:t(\"Value\",LEe),getInstanceCount:function(){return e.getInstanceCount.apply(e,arguments)}},nu)}});var UEe=_((exports,module)=>{(function(t,e){typeof define==\"function\"&&define.amd?define([],function(){return e}):typeof module==\"object\"&&module.exports?module.exports=e:(t.nbind=t.nbind||{}).init=e})(exports,function(Module,cb){typeof Module==\"function\"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(t,e){return function(){t&&t.apply(this,arguments);try{Module.ccall(\"nbind_init\")}catch(r){e(r);return}e(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module<\"u\"?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT===\"WEB\")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT===\"WORKER\")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT===\"NODE\")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT===\"SHELL\")ENVIRONMENT_IS_SHELL=!0;else throw new Error(\"The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.\");else ENVIRONMENT_IS_WEB=typeof window==\"object\",ENVIRONMENT_IS_WORKER=typeof importScripts==\"function\",ENVIRONMENT_IS_NODE=typeof process==\"object\"&&typeof ve==\"function\"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn);var nodeFS,nodePath;Module.read=function(e,r){nodeFS||(nodeFS={}(\"\")),nodePath||(nodePath={}(\"\")),e=nodePath.normalize(e);var o=nodeFS.readFileSync(e);return r?o:o.toString()},Module.readBinary=function(e){var r=Module.read(e,!0);return r.buffer||(r=new Uint8Array(r)),assert(r.buffer),r},Module.load=function(e){globalEval(read(e))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\\\/g,\"/\"):Module.thisProgram=\"unknown-program\"),Module.arguments=process.argv.slice(2),typeof module<\"u\"&&(module.exports=Module),Module.inspect=function(){return\"[Emscripten Module object]\"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr<\"u\"&&(Module.printErr=printErr),typeof read<\"u\"?Module.read=read:Module.read=function(){throw\"no read() available\"},Module.readBinary=function(e){if(typeof readbuffer==\"function\")return new Uint8Array(readbuffer(e));var r=read(e,\"binary\");return assert(typeof r==\"object\"),r},typeof scriptArgs<\"u\"?Module.arguments=scriptArgs:typeof arguments<\"u\"&&(Module.arguments=arguments),typeof quit==\"function\"&&(Module.quit=function(t,e){quit(t)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(e){var r=new XMLHttpRequest;return r.open(\"GET\",e,!1),r.send(null),r.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(e){var r=new XMLHttpRequest;return r.open(\"GET\",e,!1),r.responseType=\"arraybuffer\",r.send(null),new Uint8Array(r.response)}),Module.readAsync=function(e,r,o){var a=new XMLHttpRequest;a.open(\"GET\",e,!0),a.responseType=\"arraybuffer\",a.onload=function(){a.status==200||a.status==0&&a.response?r(a.response):o()},a.onerror=o,a.send(null)},typeof arguments<\"u\"&&(Module.arguments=arguments),typeof console<\"u\")Module.print||(Module.print=function(e){console.log(e)}),Module.printErr||(Module.printErr=function(e){console.warn(e)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump<\"u\"?function(t){dump(t)}:function(t){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle>\"u\"&&(Module.setWindowTitle=function(t){document.title=t})}else throw\"Unknown runtime environment. Where are we?\";function globalEval(t){eval.call(null,t)}!Module.load&&Module.read&&(Module.load=function(e){globalEval(Module.read(e))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram=\"./this.program\"),Module.quit||(Module.quit=function(t,e){throw e}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(t){return tempRet0=t,t},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(t){STACKTOP=t},getNativeTypeSize:function(t){switch(t){case\"i1\":case\"i8\":return 1;case\"i16\":return 2;case\"i32\":return 4;case\"i64\":return 8;case\"float\":return 4;case\"double\":return 8;default:{if(t[t.length-1]===\"*\")return Runtime.QUANTUM_SIZE;if(t[0]===\"i\"){var e=parseInt(t.substr(1));return assert(e%8===0),e/8}else return 0}}},getNativeFieldSize:function(t){return Math.max(Runtime.getNativeTypeSize(t),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(t,e){return e===\"double\"||e===\"i64\"?t&7&&(assert((t&7)===4),t+=4):assert((t&3)===0),t},getAlignSize:function(t,e,r){return!r&&(t==\"i64\"||t==\"double\")?8:t?Math.min(e||(t?Runtime.getNativeFieldSize(t):0),Runtime.QUANTUM_SIZE):Math.min(e,8)},dynCall:function(t,e,r){return r&&r.length?Module[\"dynCall_\"+t].apply(null,[e].concat(r)):Module[\"dynCall_\"+t].call(null,e)},functionPointers:[],addFunction:function(t){for(var e=0;e<Runtime.functionPointers.length;e++)if(!Runtime.functionPointers[e])return Runtime.functionPointers[e]=t,2*(1+e);throw\"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.\"},removeFunction:function(t){Runtime.functionPointers[(t-2)/2]=null},warnOnce:function(t){Runtime.warnOnce.shown||(Runtime.warnOnce.shown={}),Runtime.warnOnce.shown[t]||(Runtime.warnOnce.shown[t]=1,Module.printErr(t))},funcWrappers:{},getFuncWrapper:function(t,e){if(t){assert(e),Runtime.funcWrappers[e]||(Runtime.funcWrappers[e]={});var r=Runtime.funcWrappers[e];return r[t]||(e.length===1?r[t]=function(){return Runtime.dynCall(e,t)}:e.length===2?r[t]=function(a){return Runtime.dynCall(e,t,[a])}:r[t]=function(){return Runtime.dynCall(e,t,Array.prototype.slice.call(arguments))}),r[t]}},getCompilerSetting:function(t){throw\"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work\"},stackAlloc:function(t){var e=STACKTOP;return STACKTOP=STACKTOP+t|0,STACKTOP=STACKTOP+15&-16,e},staticAlloc:function(t){var e=STATICTOP;return STATICTOP=STATICTOP+t|0,STATICTOP=STATICTOP+15&-16,e},dynamicAlloc:function(t){var e=HEAP32[DYNAMICTOP_PTR>>2],r=(e+t+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=r,r>=TOTAL_MEMORY){var o=enlargeMemory();if(!o)return HEAP32[DYNAMICTOP_PTR>>2]=e,0}return e},alignMemory:function(t,e){var r=t=Math.ceil(t/(e||16))*(e||16);return r},makeBigInt:function(t,e,r){var o=r?+(t>>>0)+ +(e>>>0)*4294967296:+(t>>>0)+ +(e|0)*4294967296;return o},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(t,e){t||abort(\"Assertion failed: \"+e)}function getCFunc(ident){var func=Module[\"_\"+ident];if(!func)try{func=eval(\"_\"+ident)}catch(t){}return assert(func,\"Cannot call unknown function \"+ident+\" (perhaps LLVM optimizations or closure removed it?)\"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(t){var e=Runtime.stackAlloc(t.length);return writeArrayToMemory(t,e),e},stringToC:function(t){var e=0;if(t!=null&&t!==0){var r=(t.length<<2)+1;e=Runtime.stackAlloc(r),stringToUTF8(t,e,r)}return e}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(e,r,o,a,n){var u=getCFunc(e),A=[],p=0;if(a)for(var h=0;h<a.length;h++){var E=toC[o[h]];E?(p===0&&(p=Runtime.stackSave()),A[h]=E(a[h])):A[h]=a[h]}var I=u.apply(null,A);if(r===\"string\"&&(I=Pointer_stringify(I)),p!==0){if(n&&n.async){EmterpreterAsync.asyncFinalizers.push(function(){Runtime.stackRestore(p)});return}Runtime.stackRestore(p)}return I};var sourceRegex=/^function\\s*[a-zA-Z$_0-9]*\\s*\\(([^)]*)\\)\\s*{\\s*([^*]*?)[\\s;]*(?:return\\s*(.*?)[;\\s]*)?}$/;function parseJSFunc(t){var e=t.toString().match(sourceRegex).slice(1);return{arguments:e[0],body:e[1],returnValue:e[2]}}var JSsource=null;function ensureJSsource(){if(!JSsource){JSsource={};for(var t in JSfuncs)JSfuncs.hasOwnProperty(t)&&(JSsource[t]=parseJSFunc(JSfuncs[t]))}}cwrap=function cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var cfunc=getCFunc(ident),numericArgs=argTypes.every(function(t){return t===\"number\"}),numericRet=returnType!==\"string\";if(numericRet&&numericArgs)return cfunc;var argNames=argTypes.map(function(t,e){return\"$\"+e}),funcstr=\"(function(\"+argNames.join(\",\")+\") {\",nargs=argTypes.length;if(!numericArgs){ensureJSsource(),funcstr+=\"var stack = \"+JSsource.stackSave.body+\";\";for(var i=0;i<nargs;i++){var arg=argNames[i],type=argTypes[i];if(type!==\"number\"){var convertCode=JSsource[type+\"ToC\"];funcstr+=\"var \"+convertCode.arguments+\" = \"+arg+\";\",funcstr+=convertCode.body+\";\",funcstr+=arg+\"=(\"+convertCode.returnValue+\");\"}}}var cfuncname=parseJSFunc(function(){return cfunc}).returnValue;if(funcstr+=\"var ret = \"+cfuncname+\"(\"+argNames.join(\",\")+\");\",!numericRet){var strgfy=parseJSFunc(function(){return Pointer_stringify}).returnValue;funcstr+=\"ret = \"+strgfy+\"(ret);\"}return numericArgs||(ensureJSsource(),funcstr+=JSsource.stackRestore.body.replace(\"()\",\"(stack)\")+\";\"),funcstr+=\"return ret})\",eval(funcstr)}})(),Module.ccall=ccall,Module.cwrap=cwrap;function setValue(t,e,r,o){switch(r=r||\"i8\",r.charAt(r.length-1)===\"*\"&&(r=\"i32\"),r){case\"i1\":HEAP8[t>>0]=e;break;case\"i8\":HEAP8[t>>0]=e;break;case\"i16\":HEAP16[t>>1]=e;break;case\"i32\":HEAP32[t>>2]=e;break;case\"i64\":tempI64=[e>>>0,(tempDouble=e,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[t>>2]=tempI64[0],HEAP32[t+4>>2]=tempI64[1];break;case\"float\":HEAPF32[t>>2]=e;break;case\"double\":HEAPF64[t>>3]=e;break;default:abort(\"invalid type for setValue: \"+r)}}Module.setValue=setValue;function getValue(t,e,r){switch(e=e||\"i8\",e.charAt(e.length-1)===\"*\"&&(e=\"i32\"),e){case\"i1\":return HEAP8[t>>0];case\"i8\":return HEAP8[t>>0];case\"i16\":return HEAP16[t>>1];case\"i32\":return HEAP32[t>>2];case\"i64\":return HEAP32[t>>2];case\"float\":return HEAPF32[t>>2];case\"double\":return HEAPF64[t>>3];default:abort(\"invalid type for setValue: \"+e)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE;function allocate(t,e,r,o){var a,n;typeof t==\"number\"?(a=!0,n=t):(a=!1,n=t.length);var u=typeof e==\"string\"?e:null,A;if(r==ALLOC_NONE?A=o:A=[typeof _malloc==\"function\"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][r===void 0?ALLOC_STATIC:r](Math.max(n,u?1:e.length)),a){var o=A,p;for(assert((A&3)==0),p=A+(n&-4);o<p;o+=4)HEAP32[o>>2]=0;for(p=A+n;o<p;)HEAP8[o++>>0]=0;return A}if(u===\"i8\")return t.subarray||t.slice?HEAPU8.set(t,A):HEAPU8.set(new Uint8Array(t),A),A;for(var h=0,E,I,v;h<n;){var x=t[h];if(typeof x==\"function\"&&(x=Runtime.getFunctionIndex(x)),E=u||e[h],E===0){h++;continue}E==\"i64\"&&(E=\"i32\"),setValue(A+h,x,E),v!==E&&(I=Runtime.getNativeTypeSize(E),v=E),h+=I}return A}Module.allocate=allocate;function getMemory(t){return staticSealed?runtimeInitialized?_malloc(t):Runtime.dynamicAlloc(t):Runtime.staticAlloc(t)}Module.getMemory=getMemory;function Pointer_stringify(t,e){if(e===0||!t)return\"\";for(var r=0,o,a=0;o=HEAPU8[t+a>>0],r|=o,!(o==0&&!e||(a++,e&&a==e)););e||(e=a);var n=\"\";if(r<128){for(var u=1024,A;e>0;)A=String.fromCharCode.apply(String,HEAPU8.subarray(t,t+Math.min(e,u))),n=n?n+A:A,t+=u,e-=u;return n}return Module.UTF8ToString(t)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(t){for(var e=\"\";;){var r=HEAP8[t++>>0];if(!r)return e;e+=String.fromCharCode(r)}}Module.AsciiToString=AsciiToString;function stringToAscii(t,e){return writeAsciiToMemory(t,e,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder<\"u\"?new TextDecoder(\"utf8\"):void 0;function UTF8ArrayToString(t,e){for(var r=e;t[r];)++r;if(r-e>16&&t.subarray&&UTF8Decoder)return UTF8Decoder.decode(t.subarray(e,r));for(var o,a,n,u,A,p,h=\"\";;){if(o=t[e++],!o)return h;if(!(o&128)){h+=String.fromCharCode(o);continue}if(a=t[e++]&63,(o&224)==192){h+=String.fromCharCode((o&31)<<6|a);continue}if(n=t[e++]&63,(o&240)==224?o=(o&15)<<12|a<<6|n:(u=t[e++]&63,(o&248)==240?o=(o&7)<<18|a<<12|n<<6|u:(A=t[e++]&63,(o&252)==248?o=(o&3)<<24|a<<18|n<<12|u<<6|A:(p=t[e++]&63,o=(o&1)<<30|a<<24|n<<18|u<<12|A<<6|p))),o<65536)h+=String.fromCharCode(o);else{var E=o-65536;h+=String.fromCharCode(55296|E>>10,56320|E&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(t){return UTF8ArrayToString(HEAPU8,t)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(t,e,r,o){if(!(o>0))return 0;for(var a=r,n=r+o-1,u=0;u<t.length;++u){var A=t.charCodeAt(u);if(A>=55296&&A<=57343&&(A=65536+((A&1023)<<10)|t.charCodeAt(++u)&1023),A<=127){if(r>=n)break;e[r++]=A}else if(A<=2047){if(r+1>=n)break;e[r++]=192|A>>6,e[r++]=128|A&63}else if(A<=65535){if(r+2>=n)break;e[r++]=224|A>>12,e[r++]=128|A>>6&63,e[r++]=128|A&63}else if(A<=2097151){if(r+3>=n)break;e[r++]=240|A>>18,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}else if(A<=67108863){if(r+4>=n)break;e[r++]=248|A>>24,e[r++]=128|A>>18&63,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}else{if(r+5>=n)break;e[r++]=252|A>>30,e[r++]=128|A>>24&63,e[r++]=128|A>>18&63,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}}return e[r]=0,r-a}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(t,e,r){return stringToUTF8Array(t,HEAPU8,e,r)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(t){for(var e=0,r=0;r<t.length;++r){var o=t.charCodeAt(r);o>=55296&&o<=57343&&(o=65536+((o&1023)<<10)|t.charCodeAt(++r)&1023),o<=127?++e:o<=2047?e+=2:o<=65535?e+=3:o<=2097151?e+=4:o<=67108863?e+=5:e+=6}return e}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder<\"u\"?new TextDecoder(\"utf-16le\"):void 0;function demangle(t){var e=Module.___cxa_demangle||Module.__cxa_demangle;if(e){try{var r=t.substr(1),o=lengthBytesUTF8(r)+1,a=_malloc(o);stringToUTF8(r,a,o);var n=_malloc(4),u=e(a,0,0,n);if(getValue(n,\"i32\")===0&&u)return Pointer_stringify(u)}catch{}finally{a&&_free(a),n&&_free(n),u&&_free(u)}return t}return Runtime.warnOnce(\"warning: build with  -s DEMANGLE_SUPPORT=1  to link in libcxxabi demangling\"),t}function demangleAll(t){var e=/__Z[\\w\\d_]+/g;return t.replace(e,function(r){var o=demangle(r);return r===o?r:r+\" [\"+o+\"]\"})}function jsStackTrace(){var t=new Error;if(!t.stack){try{throw new Error(0)}catch(e){t=e}if(!t.stack)return\"(no stack trace available)\"}return t.stack.toString()}function stackTrace(){var t=jsStackTrace();return Module.extraStackTrace&&(t+=`\n`+Module.extraStackTrace()),demangleAll(t)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;function abortOnCannotGrowMemory(){abort(\"Cannot enlarge memory arrays. Either (1) compile with  -s TOTAL_MEMORY=X  with X higher than the current value \"+TOTAL_MEMORY+\", (2) compile with  -s ALLOW_MEMORY_GROWTH=1  which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with  -s ABORTING_MALLOC=0 \")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY<TOTAL_STACK&&Module.printErr(\"TOTAL_MEMORY should be larger than TOTAL_STACK, was \"+TOTAL_MEMORY+\"! (TOTAL_STACK=\"+TOTAL_STACK+\")\"),Module.buffer?buffer=Module.buffer:buffer=new ArrayBuffer(TOTAL_MEMORY),updateGlobalBufferViews();function getTotalMemory(){return TOTAL_MEMORY}if(HEAP32[0]=1668509029,HEAP16[1]=25459,HEAPU8[2]!==115||HEAPU8[3]!==99)throw\"Runtime error: expected the system to be little-endian!\";Module.HEAP=HEAP,Module.buffer=buffer,Module.HEAP8=HEAP8,Module.HEAP16=HEAP16,Module.HEAP32=HEAP32,Module.HEAPU8=HEAPU8,Module.HEAPU16=HEAPU16,Module.HEAPU32=HEAPU32,Module.HEAPF32=HEAPF32,Module.HEAPF64=HEAPF64;function callRuntimeCallbacks(t){for(;t.length>0;){var e=t.shift();if(typeof e==\"function\"){e();continue}var r=e.func;typeof r==\"number\"?e.arg===void 0?Module.dynCall_v(r):Module.dynCall_vi(r,e.arg):r(e.arg===void 0?null:e.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun==\"function\"&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for(typeof Module.postRun==\"function\"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(t){__ATPRERUN__.unshift(t)}Module.addOnPreRun=addOnPreRun;function addOnInit(t){__ATINIT__.unshift(t)}Module.addOnInit=addOnInit;function addOnPreMain(t){__ATMAIN__.unshift(t)}Module.addOnPreMain=addOnPreMain;function addOnExit(t){__ATEXIT__.unshift(t)}Module.addOnExit=addOnExit;function addOnPostRun(t){__ATPOSTRUN__.unshift(t)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(t,e,r){var o=r>0?r:lengthBytesUTF8(t)+1,a=new Array(o),n=stringToUTF8Array(t,a,0,a.length);return e&&(a.length=n),a}Module.intArrayFromString=intArrayFromString;function intArrayToString(t){for(var e=[],r=0;r<t.length;r++){var o=t[r];o>255&&(o&=255),e.push(String.fromCharCode(o))}return e.join(\"\")}Module.intArrayToString=intArrayToString;function writeStringToMemory(t,e,r){Runtime.warnOnce(\"writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!\");var o,a;r&&(a=e+lengthBytesUTF8(t),o=HEAP8[a]),stringToUTF8(t,e,1/0),r&&(HEAP8[a]=o)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(t,e){HEAP8.set(t,e)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(t,e,r){for(var o=0;o<t.length;++o)HEAP8[e++>>0]=t.charCodeAt(o);r||(HEAP8[e>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function t(e,r){var o=e>>>16,a=e&65535,n=r>>>16,u=r&65535;return a*u+(o*u+a*n<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(t){return froundBuffer[0]=t,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(t){t=t>>>0;for(var e=0;e<32;e++)if(t&1<<31-e)return e;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(t){return t<0?Math.ceil(t):Math.floor(t)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function getUniqueRunDependency(t){return t}function addRunDependency(t){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(t){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var e=dependenciesFulfilled;dependenciesFulfilled=null,e()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(t,e,r,o,a,n,u,A){return _nbind.callbackSignatureList[t].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(t,e,r,o,a,n,u,A){return ASM_CONSTS[t](e,r,o,a,n,u,A)}function _emscripten_asm_const_iiiii(t,e,r,o,a){return ASM_CONSTS[t](e,r,o,a)}function _emscripten_asm_const_iiidddddd(t,e,r,o,a,n,u,A,p){return ASM_CONSTS[t](e,r,o,a,n,u,A,p)}function _emscripten_asm_const_iiididi(t,e,r,o,a,n,u){return ASM_CONSTS[t](e,r,o,a,n,u)}function _emscripten_asm_const_iiii(t,e,r,o){return ASM_CONSTS[t](e,r,o)}function _emscripten_asm_const_iiiid(t,e,r,o,a){return ASM_CONSTS[t](e,r,o,a)}function _emscripten_asm_const_iiiiii(t,e,r,o,a,n){return ASM_CONSTS[t](e,r,o,a,n)}STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+12800,__ATINIT__.push({func:function(){__GLOBAL__sub_I_Yoga_cpp()}},{func:function(){__GLOBAL__sub_I_nbind_cc()}},{func:function(){__GLOBAL__sub_I_common_cc()}},{func:function(){__GLOBAL__sub_I_Binding_cc()}}),allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,192,127,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,128,191,0,0,128,191,0,0,192,127,0,0,0,0,0,0,0,0,0,0,128,63,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,190,12,0,0,200,12,0,0,208,12,0,0,216,12,0,0,230,12,0,0,242,12,0,0,1,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,192,127,3,0,0,0,180,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,182,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,183,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,184,45,0,0,185,45,0,0,181,45,0,0,181,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,148,4,0,0,3,0,0,0,187,45,0,0,164,4,0,0,188,45,0,0,2,0,0,0,189,45,0,0,164,4,0,0,188,45,0,0,185,45,0,0,164,4,0,0,185,45,0,0,164,4,0,0,188,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,183,45,0,0,182,45,0,0,181,45,0,0,190,45,0,0,190,45,0,0,182,45,0,0,182,45,0,0,185,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,185,45,0,0,48,5,0,0,3,0,0,0,56,5,0,0,1,0,0,0,189,45,0,0,185,45,0,0,164,4,0,0,76,5,0,0,2,0,0,0,191,45,0,0,186,45,0,0,182,45,0,0,185,45,0,0,192,45,0,0,185,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,76,5,0,0,76,5,0,0,136,5,0,0,182,45,0,0,181,45,0,0,2,0,0,0,190,45,0,0,136,5,0,0,56,19,0,0,156,5,0,0,2,0,0,0,184,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,204,5,0,0,181,45,0,0,181,45,0,0,2,0,0,0,180,45,0,0,204,5,0,0,2,0,0,0,195,45,0,0,236,5,0,0,97,19,0,0,198,45,0,0,211,45,0,0,212,45,0,0,213,45,0,0,214,45,0,0,215,45,0,0,188,45,0,0,182,45,0,0,216,45,0,0,217,45,0,0,218,45,0,0,219,45,0,0,192,45,0,0,181,45,0,0,0,0,0,0,185,45,0,0,110,19,0,0,186,45,0,0,115,19,0,0,221,45,0,0,120,19,0,0,148,4,0,0,132,19,0,0,96,6,0,0,145,19,0,0,222,45,0,0,164,19,0,0,223,45,0,0,173,19,0,0,0,0,0,0,3,0,0,0,104,6,0,0,1,0,0,0,187,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,11,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,185,45,0,0,224,45,0,0,164,6,0,0,188,45,0,0,172,6,0,0,180,6,0,0,2,0,0,0,188,6,0,0,7,0,0,0,224,45,0,0,7,0,0,0,164,6,0,0,1,0,0,0,213,45,0,0,185,45,0,0,224,45,0,0,172,6,0,0,185,45,0,0,224,45,0,0,164,6,0,0,185,45,0,0,224,45,0,0,211,45,0,0,211,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,172,6,0,0,222,45,0,0,211,45,0,0,224,45,0,0,188,45,0,0,222,45,0,0,211,45,0,0,40,7,0,0,188,45,0,0,2,0,0,0,224,45,0,0,185,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,222,45,0,0,224,45,0,0,148,4,0,0,185,45,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,185,45,0,0,164,6,0,0,148,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,14,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,148,7,0,0,2,0,0,0,225,45,0,0,183,45,0,0,188,45,0,0,168,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,234,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,148,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,242,45,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,110,111,100,101,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,119,104,105,99,104,32,115,116,105,108,108,32,104,97,115,32,99,104,105,108,100,114,101,110,32,97,116,116,97,99,104,101,100,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,115,116,105,108,108,32,97,116,116,97,99,104,101,100,32,116,111,32,97,32,112,97,114,101,110,116,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,99,111,110,102,105,103,0,67,97,110,110,111,116,32,115,101,116,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,67,104,105,108,100,32,97,108,114,101,97,100,121,32,104,97,115,32,97,32,112,97,114,101,110,116,44,32,105,116,32,109,117,115,116,32,98,101,32,114,101,109,111,118,101,100,32,102,105,114,115,116,46,0,67,97,110,110,111,116,32,97,100,100,32,99,104,105,108,100,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,79,110,108,121,32,108,101,97,102,32,110,111,100,101,115,32,119,105,116,104,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,115,104,111,117,108,100,32,109,97,110,117,97,108,108,121,32,109,97,114,107,32,116,104,101,109,115,101,108,118,101,115,32,97,115,32,100,105,114,116,121,0,67,97,110,110,111,116,32,103,101,116,32,108,97,121,111,117,116,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,109,117,108,116,105,45,101,100,103,101,32,115,104,111,114,116,104,97,110,100,115,0,37,115,37,100,46,123,91,115,107,105,112,112,101,100,93,32,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,61,62,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,37,115,37,100,46,123,37,115,0,42,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,37,115,10,0,37,115,37,100,46,125,37,115,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,79,117,116,32,111,102,32,99,97,99,104,101,32,101,110,116,114,105,101,115,33,10,0,83,99,97,108,101,32,102,97,99,116,111,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,122,101,114,111,0,105,110,105,116,105,97,108,0,37,115,10,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,85,78,68,69,70,73,78,69,68,0,69,88,65,67,84,76,89,0,65,84,95,77,79,83,84,0,76,65,89,95,85,78,68,69,70,73,78,69,68,0,76,65,89,95,69,88,65,67,84,76,89,0,76,65,89,95,65,84,95,77,79,83,84,0,97,118,97,105,108,97,98,108,101,87,105,100,116,104,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,119,105,100,116,104,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,97,118,97,105,108,97,98,108,101,72,101,105,103,104,116,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,104,101,105,103,104,116,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,102,108,101,120,0,115,116,114,101,116,99,104,0,109,117,108,116,105,108,105,110,101,45,115,116,114,101,116,99,104,0,69,120,112,101,99,116,101,100,32,110,111,100,101,32,116,111,32,104,97,118,101,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,0,109,101,97,115,117,114,101,0,69,120,112,101,99,116,32,99,117,115,116,111,109,32,98,97,115,101,108,105,110,101,32,102,117,110,99,116,105,111,110,32,116,111,32,110,111,116,32,114,101,116,117,114,110,32,78,97,78,0,97,98,115,45,109,101,97,115,117,114,101,0,97,98,115,45,108,97,121,111,117,116,0,78,111,100,101,0,99,114,101,97,116,101,68,101,102,97,117,108,116,0,99,114,101,97,116,101,87,105,116,104,67,111,110,102,105,103,0,100,101,115,116,114,111,121,0,114,101,115,101,116,0,99,111,112,121,83,116,121,108,101,0,115,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,115,101,116,80,111,115,105,116,105,111,110,0,115,101,116,80,111,115,105,116,105,111,110,80,101,114,99,101,110,116,0,115,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,115,101,116,65,108,105,103,110,73,116,101,109,115,0,115,101,116,65,108,105,103,110,83,101,108,102,0,115,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,115,101,116,70,108,101,120,87,114,97,112,0,115,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,115,101,116,77,97,114,103,105,110,0,115,101,116,77,97,114,103,105,110,80,101,114,99,101,110,116,0,115,101,116,77,97,114,103,105,110,65,117,116,111,0,115,101,116,79,118,101,114,102,108,111,119,0,115,101,116,68,105,115,112,108,97,121,0,115,101,116,70,108,101,120,0,115,101,116,70,108,101,120,66,97,115,105,115,0,115,101,116,70,108,101,120,66,97,115,105,115,80,101,114,99,101,110,116,0,115,101,116,70,108,101,120,71,114,111,119,0,115,101,116,70,108,101,120,83,104,114,105,110,107,0,115,101,116,87,105,100,116,104,0,115,101,116,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,87,105,100,116,104,65,117,116,111,0,115,101,116,72,101,105,103,104,116,0,115,101,116,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,72,101,105,103,104,116,65,117,116,111,0,115,101,116,77,105,110,87,105,100,116,104,0,115,101,116,77,105,110,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,105,110,72,101,105,103,104,116,0,115,101,116,77,105,110,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,77,97,120,87,105,100,116,104,0,115,101,116,77,97,120,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,97,120,72,101,105,103,104,116,0,115,101,116,77,97,120,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,65,115,112,101,99,116,82,97,116,105,111,0,115,101,116,66,111,114,100,101,114,0,115,101,116,80,97,100,100,105,110,103,0,115,101,116,80,97,100,100,105,110,103,80,101,114,99,101,110,116,0,103,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,103,101,116,80,111,115,105,116,105,111,110,0,103,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,103,101,116,65,108,105,103,110,73,116,101,109,115,0,103,101,116,65,108,105,103,110,83,101,108,102,0,103,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,103,101,116,70,108,101,120,87,114,97,112,0,103,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,103,101,116,77,97,114,103,105,110,0,103,101,116,70,108,101,120,66,97,115,105,115,0,103,101,116,70,108,101,120,71,114,111,119,0,103,101,116,70,108,101,120,83,104,114,105,110,107,0,103,101,116,87,105,100,116,104,0,103,101,116,72,101,105,103,104,116,0,103,101,116,77,105,110,87,105,100,116,104,0,103,101,116,77,105,110,72,101,105,103,104,116,0,103,101,116,77,97,120,87,105,100,116,104,0,103,101,116,77,97,120,72,101,105,103,104,116,0,103,101,116,65,115,112,101,99,116,82,97,116,105,111,0,103,101,116,66,111,114,100,101,114,0,103,101,116,79,118,101,114,102,108,111,119,0,103,101,116,68,105,115,112,108,97,121,0,103,101,116,80,97,100,100,105,110,103,0,105,110,115,101,114,116,67,104,105,108,100,0,114,101,109,111,118,101,67,104,105,108,100,0,103,101,116,67,104,105,108,100,67,111,117,110,116,0,103,101,116,80,97,114,101,110,116,0,103,101,116,67,104,105,108,100,0,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,117,110,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,109,97,114,107,68,105,114,116,121,0,105,115,68,105,114,116,121,0,99,97,108,99,117,108,97,116,101,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,76,101,102,116,0,103,101,116,67,111,109,112,117,116,101,100,82,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,84,111,112,0,103,101,116,67,111,109,112,117,116,101,100,66,111,116,116,111,109,0,103,101,116,67,111,109,112,117,116,101,100,87,105,100,116,104,0,103,101,116,67,111,109,112,117,116,101,100,72,101,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,77,97,114,103,105,110,0,103,101,116,67,111,109,112,117,116,101,100,66,111,114,100,101,114,0,103,101,116,67,111,109,112,117,116,101,100,80,97,100,100,105,110,103,0,67,111,110,102,105,103,0,99,114,101,97,116,101,0,115,101,116,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,115,101,116,80,111,105,110,116,83,99,97,108,101,70,97,99,116,111,114,0,105,115,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,86,97,108,117,101,0,76,97,121,111,117,116,0,83,105,122,101,0,103,101,116,73,110,115,116,97,110,99,101,67,111,117,110,116,0,73,110,116,54,52,0,1,1,1,2,2,4,4,4,4,8,8,4,8,118,111,105,100,0,98,111,111,108,0,115,116,100,58,58,115,116,114,105,110,103,0,99,98,70,117,110,99,116,105,111,110,32,38,0,99,111,110,115,116,32,99,98,70,117,110,99,116,105,111,110,32,38,0,69,120,116,101,114,110,97,108,0,66,117,102,102,101,114,0,78,66,105,110,100,73,68,0,78,66,105,110,100,0,98,105,110,100,95,118,97,108,117,101,0,114,101,102,108,101,99,116,0,113,117,101,114,121,84,121,112,101,0,108,97,108,108,111,99,0,108,114,101,115,101,116,0,123,114,101,116,117,114,110,40,95,110,98,105,110,100,46,99,97,108,108,98,97,99,107,83,105,103,110,97,116,117,114,101,76,105,115,116,91,36,48,93,46,97,112,112,108,121,40,116,104,105,115,44,97,114,103,117,109,101,110,116,115,41,41,59,125,0,95,110,98,105,110,100,95,110,101,119,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],\"i8\",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;function _atexit(t,e){__ATEXIT__.unshift({func:t,arg:e})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function _abort(){Module.abort()}function __ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj(){Module.printErr(\"missing function: _ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj\"),abort(-1)}function __decorate(t,e,r,o){var a=arguments.length,n=a<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,r):o,u;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")n=Reflect.decorate(t,e,r,o);else for(var A=t.length-1;A>=0;A--)(u=t[A])&&(n=(a<3?u(n):a>3?u(e,r,n):u(e,r))||n);return a>3&&n&&Object.defineProperty(e,r,n),n}function _defineHidden(t){return function(e,r){Object.defineProperty(e,r,{configurable:!1,enumerable:!1,value:t,writable:!0})}}var _nbind={};function __nbind_free_external(t){_nbind.externalList[t].dereference(t)}function __nbind_reference_external(t){_nbind.externalList[t].reference()}function _llvm_stackrestore(t){var e=_llvm_stacksave,r=e.LLVM_SAVEDSTACKS[t];e.LLVM_SAVEDSTACKS.splice(t,1),Runtime.stackRestore(r)}function __nbind_register_pool(t,e,r,o){_nbind.Pool.pageSize=t,_nbind.Pool.usedPtr=e/4,_nbind.Pool.rootPtr=r,_nbind.Pool.pagePtr=o/4,HEAP32[e/4]=16909060,HEAP8[e]==1&&(_nbind.bigEndian=!0),HEAP32[e/4]=0,_nbind.makeTypeKindTbl=(n={},n[1024]=_nbind.PrimitiveType,n[64]=_nbind.Int64Type,n[2048]=_nbind.BindClass,n[3072]=_nbind.BindClassPtr,n[4096]=_nbind.SharedClassPtr,n[5120]=_nbind.ArrayType,n[6144]=_nbind.ArrayType,n[7168]=_nbind.CStringType,n[9216]=_nbind.CallbackType,n[10240]=_nbind.BindType,n),_nbind.makeTypeNameTbl={Buffer:_nbind.BufferType,External:_nbind.ExternalType,Int64:_nbind.Int64Type,_nbind_new:_nbind.CreateValueType,bool:_nbind.BooleanType,\"cbFunction &\":_nbind.CallbackType,\"const cbFunction &\":_nbind.CallbackType,\"const std::string &\":_nbind.StringType,\"std::string\":_nbind.StringType},Module.toggleLightGC=_nbind.toggleLightGC,_nbind.callUpcast=Module.dynCall_ii;var a=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:\"\"});a.proto=Module,_nbind.BindClass.list.push(a);var n}function _emscripten_set_main_loop_timing(t,e){if(Browser.mainLoop.timingMode=t,Browser.mainLoop.timingValue=e,!Browser.mainLoop.func)return 1;if(t==0)Browser.mainLoop.scheduler=function(){var u=Math.max(0,Browser.mainLoop.tickStartTime+e-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,u)},Browser.mainLoop.method=\"timeout\";else if(t==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method=\"rAF\";else if(t==2){if(!window.setImmediate){let n=function(u){u.source===window&&u.data===o&&(u.stopPropagation(),r.shift()())};var a=n,r=[],o=\"setimmediate\";window.addEventListener(\"message\",n,!0),window.setImmediate=function(A){r.push(A),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(A),window.postMessage({target:o})):window.postMessage(o,\"*\")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method=\"immediate\"}return 0}function _emscripten_get_now(){abort()}function _emscripten_set_main_loop(t,e,r,o,a){Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,\"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.\"),Browser.mainLoop.func=t,Browser.mainLoop.arg=o;var n;typeof o<\"u\"?n=function(){Module.dynCall_vi(t,o)}:n=function(){Module.dynCall_v(t)};var u=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var p=Date.now(),h=Browser.mainLoop.queue.shift();if(h.func(h.arg),Browser.mainLoop.remainingBlockers){var E=Browser.mainLoop.remainingBlockers,I=E%1==0?E-1:Math.floor(E);h.counted?Browser.mainLoop.remainingBlockers=I:(I=I+.5,Browser.mainLoop.remainingBlockers=(8*E+I)/9)}if(console.log('main loop blocker \"'+h.name+'\" took '+(Date.now()-p)+\" ms\"),Browser.mainLoop.updateStatus(),u<Browser.mainLoop.currentlyRunningMainloop)return;setTimeout(Browser.mainLoop.runner,0);return}if(!(u<Browser.mainLoop.currentlyRunningMainloop)){if(Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0,Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method===\"timeout\"&&Module.ctx&&(Module.printErr(\"Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!\"),Browser.mainLoop.method=\"\"),Browser.mainLoop.runIter(n),!(u<Browser.mainLoop.currentlyRunningMainloop)&&(typeof SDL==\"object\"&&SDL.audio&&SDL.audio.queueNewAudioData&&SDL.audio.queueNewAudioData(),Browser.mainLoop.scheduler())}}},a||(e&&e>0?_emscripten_set_main_loop_timing(0,1e3/e):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),r)throw\"SimulateInfiniteLoop\"}var Browser={mainLoop:{scheduler:null,method:\"\",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var t=Browser.mainLoop.timingMode,e=Browser.mainLoop.timingValue,r=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(r,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(t,e),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var t=Module.statusMessage||\"Please wait...\",e=Browser.mainLoop.remainingBlockers,r=Browser.mainLoop.expectedBlockers;e?e<r?Module.setStatus(t+\" (\"+(r-e)+\"/\"+r+\")\"):Module.setStatus(t):Module.setStatus(\"\")}},runIter:function(t){if(!ABORT){if(Module.preMainLoop){var e=Module.preMainLoop();if(e===!1)return}try{t()}catch(r){if(r instanceof ExitStatus)return;throw r&&typeof r==\"object\"&&r.stack&&Module.printErr(\"exception thrown: \"+[r,r.stack]),r}Module.postMainLoop&&Module.postMainLoop()}}},isFullscreen:!1,pointerLock:!1,moduleContextCreatedCallbacks:[],workers:[],init:function(){if(Module.preloadPlugins||(Module.preloadPlugins=[]),Browser.initted)return;Browser.initted=!0;try{new Blob,Browser.hasBlobConstructor=!0}catch{Browser.hasBlobConstructor=!1,console.log(\"warning: no blob constructor, cannot create blobs with mimetypes\")}Browser.BlobBuilder=typeof MozBlobBuilder<\"u\"?MozBlobBuilder:typeof WebKitBlobBuilder<\"u\"?WebKitBlobBuilder:Browser.hasBlobConstructor?null:console.log(\"warning: no BlobBuilder\"),Browser.URLObject=typeof window<\"u\"?window.URL?window.URL:window.webkitURL:void 0,!Module.noImageDecoding&&typeof Browser.URLObject>\"u\"&&(console.log(\"warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available.\"),Module.noImageDecoding=!0);var t={};t.canHandle=function(n){return!Module.noImageDecoding&&/\\.(jpg|jpeg|png|bmp)$/i.test(n)},t.handle=function(n,u,A,p){var h=null;if(Browser.hasBlobConstructor)try{h=new Blob([n],{type:Browser.getMimetype(u)}),h.size!==n.length&&(h=new Blob([new Uint8Array(n).buffer],{type:Browser.getMimetype(u)}))}catch(x){Runtime.warnOnce(\"Blob constructor present but fails: \"+x+\"; falling back to blob builder\")}if(!h){var E=new Browser.BlobBuilder;E.append(new Uint8Array(n).buffer),h=E.getBlob()}var I=Browser.URLObject.createObjectURL(h),v=new Image;v.onload=function(){assert(v.complete,\"Image \"+u+\" could not be decoded\");var C=document.createElement(\"canvas\");C.width=v.width,C.height=v.height;var R=C.getContext(\"2d\");R.drawImage(v,0,0),Module.preloadedImages[u]=C,Browser.URLObject.revokeObjectURL(I),A&&A(n)},v.onerror=function(C){console.log(\"Image \"+I+\" could not be decoded\"),p&&p()},v.src=I},Module.preloadPlugins.push(t);var e={};e.canHandle=function(n){return!Module.noAudioDecoding&&n.substr(-4)in{\".ogg\":1,\".wav\":1,\".mp3\":1}},e.handle=function(n,u,A,p){var h=!1;function E(R){h||(h=!0,Module.preloadedAudios[u]=R,A&&A(n))}function I(){h||(h=!0,Module.preloadedAudios[u]=new Audio,p&&p())}if(Browser.hasBlobConstructor){try{var v=new Blob([n],{type:Browser.getMimetype(u)})}catch{return I()}var x=Browser.URLObject.createObjectURL(v),C=new Audio;C.addEventListener(\"canplaythrough\",function(){E(C)},!1),C.onerror=function(L){if(h)return;console.log(\"warning: browser could not fully decode audio \"+u+\", trying slower base64 approach\");function U(z){for(var te=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",ae=\"=\",le=\"\",ce=0,Ce=0,de=0;de<z.length;de++)for(ce=ce<<8|z[de],Ce+=8;Ce>=6;){var Be=ce>>Ce-6&63;Ce-=6,le+=te[Be]}return Ce==2?(le+=te[(ce&3)<<4],le+=ae+ae):Ce==4&&(le+=te[(ce&15)<<2],le+=ae),le}C.src=\"data:audio/x-\"+u.substr(-3)+\";base64,\"+U(n),E(C)},C.src=x,Browser.safeSetTimeout(function(){E(C)},1e4)}else return I()},Module.preloadPlugins.push(e);function r(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var o=Module.canvas;o&&(o.requestPointerLock=o.requestPointerLock||o.mozRequestPointerLock||o.webkitRequestPointerLock||o.msRequestPointerLock||function(){},o.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},o.exitPointerLock=o.exitPointerLock.bind(document),document.addEventListener(\"pointerlockchange\",r,!1),document.addEventListener(\"mozpointerlockchange\",r,!1),document.addEventListener(\"webkitpointerlockchange\",r,!1),document.addEventListener(\"mspointerlockchange\",r,!1),Module.elementPointerLock&&o.addEventListener(\"click\",function(a){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),a.preventDefault())},!1))},createContext:function(t,e,r,o){if(e&&Module.ctx&&t==Module.canvas)return Module.ctx;var a,n;if(e){var u={antialias:!1,alpha:!1};if(o)for(var A in o)u[A]=o[A];n=GL.createContext(t,u),n&&(a=GL.getContext(n).GLctx)}else a=t.getContext(\"2d\");return a?(r&&(e||assert(typeof GLctx>\"u\",\"cannot set in module if GLctx is used, but we are a non-GL context that would replace it\"),Module.ctx=a,e&&GL.makeContextCurrent(n),Module.useWebGL=e,Browser.moduleContextCreatedCallbacks.forEach(function(p){p()}),Browser.init()),a):null},destroyContext:function(t,e,r){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(t,e,r){Browser.lockPointer=t,Browser.resizeCanvas=e,Browser.vrDevice=r,typeof Browser.lockPointer>\"u\"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas>\"u\"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice>\"u\"&&(Browser.vrDevice=null);var o=Module.canvas;function a(){Browser.isFullscreen=!1;var u=o.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===u?(o.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},o.exitFullscreen=o.exitFullscreen.bind(document),Browser.lockPointer&&o.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(u.parentNode.insertBefore(o,u),u.parentNode.removeChild(u),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(o)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener(\"fullscreenchange\",a,!1),document.addEventListener(\"mozfullscreenchange\",a,!1),document.addEventListener(\"webkitfullscreenchange\",a,!1),document.addEventListener(\"MSFullscreenChange\",a,!1));var n=document.createElement(\"div\");o.parentNode.insertBefore(n,o),n.appendChild(o),n.requestFullscreen=n.requestFullscreen||n.mozRequestFullScreen||n.msRequestFullscreen||(n.webkitRequestFullscreen?function(){n.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(n.webkitRequestFullScreen?function(){n.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),r?n.requestFullscreen({vrDisplay:r}):n.requestFullscreen()},requestFullScreen:function(t,e,r){return Module.printErr(\"Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead.\"),Browser.requestFullScreen=function(o,a,n){return Browser.requestFullscreen(o,a,n)},Browser.requestFullscreen(t,e,r)},nextRAF:0,fakeRequestAnimationFrame:function(t){var e=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=e+1e3/60;else for(;e+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var r=Math.max(Browser.nextRAF-e,0);setTimeout(t,r)},requestAnimationFrame:function t(e){typeof window>\"u\"?Browser.fakeRequestAnimationFrame(e):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(e))},safeCallback:function(t){return function(){if(!ABORT)return t.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var t=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],t.forEach(function(e){e()})}},safeRequestAnimationFrame:function(t){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))})},safeSetTimeout:function(t,e){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))},e)},safeSetInterval:function(t,e){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&t()},e)},getMimetype:function(t){return{jpg:\"image/jpeg\",jpeg:\"image/jpeg\",png:\"image/png\",bmp:\"image/bmp\",ogg:\"audio/ogg\",wav:\"audio/wav\",mp3:\"audio/mpeg\"}[t.substr(t.lastIndexOf(\".\")+1)]},getUserMedia:function(t){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(t)},getMovementX:function(t){return t.movementX||t.mozMovementX||t.webkitMovementX||0},getMovementY:function(t){return t.movementY||t.mozMovementY||t.webkitMovementY||0},getMouseWheelDelta:function(t){var e=0;switch(t.type){case\"DOMMouseScroll\":e=t.detail;break;case\"mousewheel\":e=t.wheelDelta;break;case\"wheel\":e=t.deltaY;break;default:throw\"unrecognized mouse wheel event: \"+t.type}return e},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(t){if(Browser.pointerLock)t.type!=\"mousemove\"&&\"mozMovementX\"in t?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(t),Browser.mouseMovementY=Browser.getMovementY(t)),typeof SDL<\"u\"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var e=Module.canvas.getBoundingClientRect(),r=Module.canvas.width,o=Module.canvas.height,a=typeof window.scrollX<\"u\"?window.scrollX:window.pageXOffset,n=typeof window.scrollY<\"u\"?window.scrollY:window.pageYOffset;if(t.type===\"touchstart\"||t.type===\"touchend\"||t.type===\"touchmove\"){var u=t.touch;if(u===void 0)return;var A=u.pageX-(a+e.left),p=u.pageY-(n+e.top);A=A*(r/e.width),p=p*(o/e.height);var h={x:A,y:p};if(t.type===\"touchstart\")Browser.lastTouches[u.identifier]=h,Browser.touches[u.identifier]=h;else if(t.type===\"touchend\"||t.type===\"touchmove\"){var E=Browser.touches[u.identifier];E||(E=h),Browser.lastTouches[u.identifier]=E,Browser.touches[u.identifier]=h}return}var I=t.pageX-(a+e.left),v=t.pageY-(n+e.top);I=I*(r/e.width),v=v*(o/e.height),Browser.mouseMovementX=I-Browser.mouseX,Browser.mouseMovementY=v-Browser.mouseY,Browser.mouseX=I,Browser.mouseY=v}},asyncLoad:function(t,e,r,o){var a=o?\"\":\"al \"+t;Module.readAsync(t,function(n){assert(n,'Loading data file \"'+t+'\" failed (no arrayBuffer).'),e(new Uint8Array(n)),a&&removeRunDependency(a)},function(n){if(r)r();else throw'Loading data file \"'+t+'\" failed.'}),a&&addRunDependency(a)},resizeListeners:[],updateResizeListeners:function(){var t=Module.canvas;Browser.resizeListeners.forEach(function(e){e(t.width,t.height)})},setCanvasSize:function(t,e,r){var o=Module.canvas;Browser.updateCanvasDimensions(o,t,e),r||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL<\"u\"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL<\"u\"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t&-8388609,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},updateCanvasDimensions:function(t,e,r){e&&r?(t.widthNative=e,t.heightNative=r):(e=t.widthNative,r=t.heightNative);var o=e,a=r;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(o/a<Module.forcedAspectRatio?o=Math.round(a*Module.forcedAspectRatio):a=Math.round(o/Module.forcedAspectRatio)),(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===t.parentNode&&typeof screen<\"u\"){var n=Math.min(screen.width/o,screen.height/a);o=Math.round(o*n),a=Math.round(a*n)}Browser.resizeCanvas?(t.width!=o&&(t.width=o),t.height!=a&&(t.height=a),typeof t.style<\"u\"&&(t.style.removeProperty(\"width\"),t.style.removeProperty(\"height\"))):(t.width!=e&&(t.width=e),t.height!=r&&(t.height=r),typeof t.style<\"u\"&&(o!=e||a!=r?(t.style.setProperty(\"width\",o+\"px\",\"important\"),t.style.setProperty(\"height\",a+\"px\",\"important\")):(t.style.removeProperty(\"width\"),t.style.removeProperty(\"height\"))))},wgetRequests:{},nextWgetRequestHandle:0,getNextWgetRequestHandle:function(){var t=Browser.nextWgetRequestHandle;return Browser.nextWgetRequestHandle++,t}},SYSCALLS={varargs:0,get:function(t){SYSCALLS.varargs+=4;var e=HEAP32[SYSCALLS.varargs-4>>2];return e},getStr:function(){var t=Pointer_stringify(SYSCALLS.get());return t},get64:function(){var t=SYSCALLS.get(),e=SYSCALLS.get();return t>=0?assert(e===0):assert(e===-1),t},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD();return FS.close(r),0}catch(o){return(typeof FS>\"u\"||!(o instanceof FS.ErrnoError))&&abort(o),-o.errno}}function ___syscall54(t,e){SYSCALLS.varargs=e;try{return 0}catch(r){return(typeof FS>\"u\"||!(r instanceof FS.ErrnoError))&&abort(r),-r.errno}}function _typeModule(t){var e=[[0,1,\"X\"],[1,1,\"const X\"],[128,1,\"X *\"],[256,1,\"X &\"],[384,1,\"X &&\"],[512,1,\"std::shared_ptr<X>\"],[640,1,\"std::unique_ptr<X>\"],[5120,1,\"std::vector<X>\"],[6144,2,\"std::array<X, Y>\"],[9216,-1,\"std::function<X (Y)>\"]];function r(p,h,E,I,v,x){if(h==1){var C=I&896;(C==128||C==256||C==384)&&(p=\"X const\")}var R;return x?R=E.replace(\"X\",p).replace(\"Y\",v):R=p.replace(\"X\",E).replace(\"Y\",v),R.replace(/([*&]) (?=[*&])/g,\"$1\")}function o(p,h,E,I,v){throw new Error(p+\" type \"+E.replace(\"X\",h+\"?\")+(I?\" with flag \"+I:\"\")+\" in \"+v)}function a(p,h,E,I,v,x,C,R){x===void 0&&(x=\"X\"),R===void 0&&(R=1);var L=E(p);if(L)return L;var U=I(p),z=U.placeholderFlag,te=e[z];C&&te&&(x=r(C[2],C[0],x,te[0],\"?\",!0));var ae;z==0&&(ae=\"Unbound\"),z>=10&&(ae=\"Corrupt\"),R>20&&(ae=\"Deeply nested\"),ae&&o(ae,p,x,z,v||\"?\");var le=U.paramList[0],ce=a(le,h,E,I,v,x,te,R+1),Ce,de={flags:te[0],id:p,name:\"\",paramList:[ce]},Be=[],Ee=\"?\";switch(U.placeholderFlag){case 1:Ce=ce.spec;break;case 2:if((ce.flags&15360)==1024&&ce.spec.ptrSize==1){de.flags=7168;break}case 3:case 6:case 5:Ce=ce.spec,ce.flags&15360;break;case 8:Ee=\"\"+U.paramList[1],de.paramList.push(U.paramList[1]);break;case 9:for(var g=0,me=U.paramList[1];g<me.length;g++){var we=me[g],Ae=a(we,h,E,I,v,x,te,R+1);Be.push(Ae.name),de.paramList.push(Ae)}Ee=Be.join(\", \");break;default:break}if(de.name=r(te[2],te[0],ce.name,ce.flags,Ee),Ce){for(var ne=0,Z=Object.keys(Ce);ne<Z.length;ne++){var xe=Z[ne];de[xe]=de[xe]||Ce[xe]}de.flags|=Ce.flags}return n(h,de)}function n(p,h){var E=h.flags,I=E&896,v=E&15360;return!h.name&&v==1024&&(h.ptrSize==1?h.name=(E&16?\"\":(E&8?\"un\":\"\")+\"signed \")+\"char\":h.name=(E&8?\"u\":\"\")+(E&32?\"float\":\"int\")+(h.ptrSize*8+\"_t\")),h.ptrSize==8&&!(E&32)&&(v=64),v==2048&&(I==512||I==640?v=4096:I&&(v=3072)),p(v,h)}var u=function(){function p(h){this.id=h.id,this.name=h.name,this.flags=h.flags,this.spec=h}return p.prototype.toString=function(){return this.name},p}(),A={Type:u,getComplexType:a,makeType:n,structureList:e};return t.output=A,t.output||A}function __nbind_register_type(t,e){var r=_nbind.readAsciiString(e),o={flags:10240,id:t,name:r};_nbind.makeType(_nbind.constructType,o)}function __nbind_register_callback_signature(t,e){var r=_nbind.readTypeIdList(t,e),o=_nbind.callbackSignatureList.length;return _nbind.callbackSignatureList[o]=_nbind.makeJSCaller(r),o}function __extends(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);function o(){this.constructor=t}o.prototype=e.prototype,t.prototype=new o}function __nbind_register_class(t,e,r,o,a,n,u){var A=_nbind.readAsciiString(u),p=_nbind.readPolicyList(e),h=HEAPU32.subarray(t/4,t/4+2),E={flags:2048|(p.Value?2:0),id:h[0],name:A},I=_nbind.makeType(_nbind.constructType,E);I.ptrType=_nbind.getComplexType(h[1],_nbind.constructType,_nbind.getType,_nbind.queryType),I.destroy=_nbind.makeMethodCaller(I.ptrType,{boundID:E.id,flags:0,name:\"destroy\",num:0,ptr:n,title:I.name+\".free\",typeList:[\"void\",\"uint32_t\",\"uint32_t\"]}),a&&(I.superIdList=Array.prototype.slice.call(HEAPU32.subarray(r/4,r/4+a)),I.upcastList=Array.prototype.slice.call(HEAPU32.subarray(o/4,o/4+a))),Module[I.name]=I.makeBound(p),_nbind.BindClass.list.push(I)}function _removeAccessorPrefix(t){var e=/^[Gg]et_?([A-Z]?([A-Z]?))/;return t.replace(e,function(r,o,a){return a?o:o.toLowerCase()})}function __nbind_register_function(t,e,r,o,a,n,u,A,p,h){var E=_nbind.getType(t),I=_nbind.readPolicyList(e),v=_nbind.readTypeIdList(r,o),x;if(u==5)x=[{direct:a,name:\"__nbindConstructor\",ptr:0,title:E.name+\" constructor\",typeList:[\"uint32_t\"].concat(v.slice(1))},{direct:n,name:\"__nbindValueConstructor\",ptr:0,title:E.name+\" value constructor\",typeList:[\"void\",\"uint32_t\"].concat(v.slice(1))}];else{var C=_nbind.readAsciiString(A),R=(E.name&&E.name+\".\")+C;(u==3||u==4)&&(C=_removeAccessorPrefix(C)),x=[{boundID:t,direct:n,name:C,ptr:a,title:R,typeList:v}]}for(var L=0,U=x;L<U.length;L++){var z=U[L];z.signatureType=u,z.policyTbl=I,z.num=p,z.flags=h,E.addMethod(z)}}function _nbind_value(t,e){_nbind.typeNameTbl[t]||_nbind.throwError(\"Unknown value type \"+t),Module.NBind.bind_value(t,e),_defineHidden(_nbind.typeNameTbl[t].proto.prototype.__nbindValueConstructor)(e.prototype,\"__nbindValueConstructor\")}Module._nbind_value=_nbind_value;function __nbind_get_value_object(t,e){var r=_nbind.popValue(t);if(!r.fromJS)throw new Error(\"Object \"+r+\" has no fromJS function\");r.fromJS(function(){r.__nbindValueConstructor.apply(this,Array.prototype.concat.apply([e],arguments))})}function _emscripten_memcpy_big(t,e,r){return HEAPU8.set(HEAPU8.subarray(e,e+r),t),t}function __nbind_register_primitive(t,e,r){var o={flags:1024|r,id:t,ptrSize:e};_nbind.makeType(_nbind.constructType,o)}var cttz_i8=allocate([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],\"i8\",ALLOC_STATIC);function ___setErrNo(t){return Module.___errno_location&&(HEAP32[Module.___errno_location()>>2]=t),t}function _llvm_stacksave(){var t=_llvm_stacksave;return t.LLVM_SAVEDSTACKS||(t.LLVM_SAVEDSTACKS=[]),t.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),t.LLVM_SAVEDSTACKS.length-1}function ___syscall140(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD(),o=SYSCALLS.get(),a=SYSCALLS.get(),n=SYSCALLS.get(),u=SYSCALLS.get(),A=a;return FS.llseek(r,A,u),HEAP32[n>>2]=r.position,r.getdents&&A===0&&u===0&&(r.getdents=null),0}catch(p){return(typeof FS>\"u\"||!(p instanceof FS.ErrnoError))&&abort(p),-p.errno}}function ___syscall146(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.get(),o=SYSCALLS.get(),a=SYSCALLS.get(),n=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(E,I){var v=___syscall146.buffers[E];assert(v),I===0||I===10?((E===1?Module.print:Module.printErr)(UTF8ArrayToString(v,0)),v.length=0):v.push(I)});for(var u=0;u<a;u++){for(var A=HEAP32[o+u*8>>2],p=HEAP32[o+(u*8+4)>>2],h=0;h<p;h++)___syscall146.printChar(r,HEAPU8[A+h]);n+=p}return n}catch(E){return(typeof FS>\"u\"||!(E instanceof FS.ErrnoError))&&abort(E),-E.errno}}function __nbind_finish(){for(var t=0,e=_nbind.BindClass.list;t<e.length;t++){var r=e[t];r.finish()}}var ___dso_handle=STATICTOP;STATICTOP+=16,function(_nbind){var typeIdTbl={};_nbind.typeNameTbl={};var Pool=function(){function t(){}return t.lalloc=function(e){e=e+7&-8;var r=HEAPU32[t.usedPtr];if(e>t.pageSize/2||e>t.pageSize-r){var o=_nbind.typeNameTbl.NBind.proto;return o.lalloc(e)}else return HEAPU32[t.usedPtr]=r+e,t.rootPtr+r},t.lreset=function(e,r){var o=HEAPU32[t.pagePtr];if(o){var a=_nbind.typeNameTbl.NBind.proto;a.lreset(e,r)}else HEAPU32[t.usedPtr]=e},t}();_nbind.Pool=Pool;function constructType(t,e){var r=t==10240?_nbind.makeTypeNameTbl[e.name]||_nbind.BindType:_nbind.makeTypeKindTbl[t],o=new r(e);return typeIdTbl[e.id]=o,_nbind.typeNameTbl[e.name]=o,o}_nbind.constructType=constructType;function getType(t){return typeIdTbl[t]}_nbind.getType=getType;function queryType(t){var e=HEAPU8[t],r=_nbind.structureList[e][1];t/=4,r<0&&(++t,r=HEAPU32[t]+1);var o=Array.prototype.slice.call(HEAPU32.subarray(t+1,t+1+r));return e==9&&(o=[o[0],o.slice(1)]),{paramList:o,placeholderFlag:e}}_nbind.queryType=queryType;function getTypes(t,e){return t.map(function(r){return typeof r==\"number\"?_nbind.getComplexType(r,constructType,getType,queryType,e):_nbind.typeNameTbl[r]})}_nbind.getTypes=getTypes;function readTypeIdList(t,e){return Array.prototype.slice.call(HEAPU32,t/4,t/4+e)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(t){for(var e=t;HEAPU8[e++];);return String.fromCharCode.apply(\"\",HEAPU8.subarray(t,e-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(t){var e={};if(t)for(;;){var r=HEAPU32[t/4];if(!r)break;e[readAsciiString(r)]=!0,t+=4}return e}_nbind.readPolicyList=readPolicyList;function getDynCall(t,e){var r={float32_t:\"d\",float64_t:\"d\",int64_t:\"d\",uint64_t:\"d\",void:\"v\"},o=t.map(function(n){return r[n.name]||\"i\"}).join(\"\"),a=Module[\"dynCall_\"+o];if(!a)throw new Error(\"dynCall_\"+o+\" not found for \"+e+\"(\"+t.map(function(n){return n.name}).join(\", \")+\")\");return a}_nbind.getDynCall=getDynCall;function addMethod(t,e,r,o){var a=t[e];t.hasOwnProperty(e)&&a?((a.arity||a.arity===0)&&(a=_nbind.makeOverloader(a,a.arity),t[e]=a),a.addMethod(r,o)):(r.arity=o,t[e]=r)}_nbind.addMethod=addMethod;function throwError(t){throw new Error(t)}_nbind.throwError=throwError,_nbind.bigEndian=!1,_a=_typeModule(_typeModule),_nbind.Type=_a.Type,_nbind.makeType=_a.makeType,_nbind.getComplexType=_a.getComplexType,_nbind.structureList=_a.structureList;var BindType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.heap=HEAPU32,r.ptrSize=4,r}return e.prototype.needsWireRead=function(r){return!!this.wireRead||!!this.makeWireRead},e.prototype.needsWireWrite=function(r){return!!this.wireWrite||!!this.makeWireWrite},e}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(t){__extends(e,t);function e(r){var o=t.call(this,r)||this,a=r.flags&32?{32:HEAPF32,64:HEAPF64}:r.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return o.heap=a[r.ptrSize*8],o.ptrSize=r.ptrSize,o}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireWrite=function(r,o){return o&&o.Strict&&function(a){if(typeof a==\"number\")return a;throw new Error(\"Type mismatch\")}},e}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(t,e){if(t==null){if(e&&e.Nullable)return 0;throw new Error(\"Type mismatch\")}if(e&&e.Strict){if(typeof t!=\"string\")throw new Error(\"Type mismatch\")}else t=t.toString();var r=Module.lengthBytesUTF8(t)+1,o=_nbind.Pool.lalloc(r);return Module.stringToUTF8Array(t,HEAPU8,o,r),o}_nbind.pushCString=pushCString;function popCString(t){return t===0?null:Module.Pointer_stringify(t)}_nbind.popCString=popCString;var CStringType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=popCString,r.wireWrite=pushCString,r.readResources=[_nbind.resources.pool],r.writeResources=[_nbind.resources.pool],r}return e.prototype.makeWireWrite=function(r,o){return function(a){return pushCString(a,o)}},e}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=function(o){return!!o},r}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireRead=function(r){return\"!!(\"+r+\")\"},e.prototype.makeWireWrite=function(r,o){return o&&o.Strict&&function(a){if(typeof a==\"boolean\")return a;throw new Error(\"Type mismatch\")}||r},e}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function t(){}return t.prototype.persist=function(){this.__nbindState|=1},t}();_nbind.Wrapper=Wrapper;function makeBound(t,e){var r=function(o){__extends(a,o);function a(n,u,A,p){var h=o.call(this)||this;if(!(h instanceof a))return new(Function.prototype.bind.apply(a,Array.prototype.concat.apply([null],arguments)));var E=u,I=A,v=p;if(n!==_nbind.ptrMarker){var x=h.__nbindConstructor.apply(h,arguments);E=4608,v=HEAPU32[x/4],I=HEAPU32[x/4+1]}var C={configurable:!0,enumerable:!1,value:null,writable:!1},R={__nbindFlags:E,__nbindPtr:I};v&&(R.__nbindShared=v,_nbind.mark(h));for(var L=0,U=Object.keys(R);L<U.length;L++){var z=U[L];C.value=R[z],Object.defineProperty(h,z,C)}return _defineHidden(0)(h,\"__nbindState\"),h}return a.prototype.free=function(){e.destroy.call(this,this.__nbindShared,this.__nbindFlags),this.__nbindState|=2,disableMember(this,\"__nbindShared\"),disableMember(this,\"__nbindPtr\")},a}(Wrapper);return __decorate([_defineHidden()],r.prototype,\"__nbindConstructor\",void 0),__decorate([_defineHidden()],r.prototype,\"__nbindValueConstructor\",void 0),__decorate([_defineHidden(t)],r.prototype,\"__nbindPolicies\",void 0),r}_nbind.makeBound=makeBound;function disableMember(t,e){function r(){throw new Error(\"Accessing deleted object\")}Object.defineProperty(t,e,{configurable:!1,enumerable:!1,get:r,set:r})}_nbind.ptrMarker={};var BindClass=function(t){__extends(e,t);function e(r){var o=t.call(this,r)||this;return o.wireRead=function(a){return _nbind.popValue(a,o.ptrType)},o.wireWrite=function(a){return pushPointer(a,o.ptrType,!0)},o.pendingSuperCount=0,o.ready=!1,o.methodTbl={},r.paramList?(o.classType=r.paramList[0].classType,o.proto=o.classType.proto):o.classType=o,o}return e.prototype.makeBound=function(r){var o=_nbind.makeBound(r,this);return this.proto=o,this.ptrType.proto=o,o},e.prototype.addMethod=function(r){var o=this.methodTbl[r.name]||[];o.push(r),this.methodTbl[r.name]=o},e.prototype.registerMethods=function(r,o){for(var a,n=0,u=Object.keys(r.methodTbl);n<u.length;n++)for(var A=u[n],p=r.methodTbl[A],h=0,E=p;h<E.length;h++){var I=E[h],v=void 0,x=void 0;if(v=this.proto.prototype,!(o&&I.signatureType!=1))switch(I.signatureType){case 1:v=this.proto;case 5:x=_nbind.makeCaller(I),_nbind.addMethod(v,I.name,x,I.typeList.length-1);break;case 4:a=_nbind.makeMethodCaller(r.ptrType,I);break;case 3:Object.defineProperty(v,I.name,{configurable:!0,enumerable:!1,get:_nbind.makeMethodCaller(r.ptrType,I),set:a});break;case 2:x=_nbind.makeMethodCaller(r.ptrType,I),_nbind.addMethod(v,I.name,x,I.typeList.length-1);break;default:break}}},e.prototype.registerSuperMethods=function(r,o,a){if(!a[r.name]){a[r.name]=!0;for(var n=0,u,A=0,p=r.superIdList||[];A<p.length;A++){var h=p[A],E=_nbind.getType(h);n++<o||o<0?u=-1:u=0,this.registerSuperMethods(E,u,a)}this.registerMethods(r,o<0)}},e.prototype.finish=function(){if(this.ready)return this;this.ready=!0,this.superList=(this.superIdList||[]).map(function(a){return _nbind.getType(a).finish()});var r=this.proto;if(this.superList.length){var o=function(){this.constructor=r};o.prototype=this.superList[0].proto.prototype,r.prototype=new o}return r!=Module&&(r.prototype.__nbindType=this),this.registerSuperMethods(this,1,{}),this},e.prototype.upcastStep=function(r,o){if(r==this)return o;for(var a=0;a<this.superList.length;++a){var n=this.superList[a].upcastStep(r,_nbind.callUpcast(this.upcastList[a],o));if(n)return n}return 0},e}(_nbind.BindType);BindClass.list=[],_nbind.BindClass=BindClass;function popPointer(t,e){return t?new e.proto(_nbind.ptrMarker,e.flags,t):null}_nbind.popPointer=popPointer;function pushPointer(t,e,r){if(!(t instanceof _nbind.Wrapper)){if(r)return _nbind.pushValue(t);throw new Error(\"Type mismatch\")}var o=t.__nbindPtr,a=t.__nbindType.classType,n=e.classType;if(t instanceof e.proto)for(;a!=n;)o=_nbind.callUpcast(a.upcastList[0],o),a=a.superList[0];else if(o=a.upcastStep(n,o),!o)throw new Error(\"Type mismatch\");return o}_nbind.pushPointer=pushPointer;function pushMutablePointer(t,e){var r=pushPointer(t,e);if(t.__nbindFlags&1)throw new Error(\"Passing a const value as a non-const argument\");return r}var BindClassPtr=function(t){__extends(e,t);function e(r){var o=t.call(this,r)||this;o.classType=r.paramList[0].classType,o.proto=o.classType.proto;var a=r.flags&1,n=(o.flags&896)==256&&r.flags&2,u=a?pushPointer:pushMutablePointer,A=n?_nbind.popValue:popPointer;return o.makeWireWrite=function(p,h){return h.Nullable?function(E){return E?u(E,o):0}:function(E){return u(E,o)}},o.wireRead=function(p){return A(p,o)},o.wireWrite=function(p){return u(p,o)},o}return e}(_nbind.BindType);_nbind.BindClassPtr=BindClassPtr;function popShared(t,e){var r=HEAPU32[t/4],o=HEAPU32[t/4+1];return o?new e.proto(_nbind.ptrMarker,e.flags,o,r):null}_nbind.popShared=popShared;function pushShared(t,e){if(!(t instanceof e.proto))throw new Error(\"Type mismatch\");return t.__nbindShared}function pushMutableShared(t,e){if(!(t instanceof e.proto))throw new Error(\"Type mismatch\");if(t.__nbindFlags&1)throw new Error(\"Passing a const value as a non-const argument\");return t.__nbindShared}var SharedClassPtr=function(t){__extends(e,t);function e(r){var o=t.call(this,r)||this;o.readResources=[_nbind.resources.pool],o.classType=r.paramList[0].classType,o.proto=o.classType.proto;var a=r.flags&1,n=a?pushShared:pushMutableShared;return o.wireRead=function(u){return popShared(u,o)},o.wireWrite=function(u){return n(u,o)},o}return e}(_nbind.BindType);_nbind.SharedClassPtr=SharedClassPtr,_nbind.externalList=[0];var firstFreeExternal=0,External=function(){function t(e){this.refCount=1,this.data=e}return t.prototype.register=function(){var e=firstFreeExternal;return e?firstFreeExternal=_nbind.externalList[e]:e=_nbind.externalList.length,_nbind.externalList[e]=this,e},t.prototype.reference=function(){++this.refCount},t.prototype.dereference=function(e){--this.refCount==0&&(this.free&&this.free(),_nbind.externalList[e]=firstFreeExternal,firstFreeExternal=e)},t}();_nbind.External=External;function popExternal(t){var e=_nbind.externalList[t];return e.dereference(t),e.data}function pushExternal(t){var e=new External(t);return e.reference(),e.register()}var ExternalType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=popExternal,r.wireWrite=pushExternal,r}return e}(_nbind.BindType);_nbind.ExternalType=ExternalType,_nbind.callbackSignatureList=[];var CallbackType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireWrite=function(o){return typeof o!=\"function\"&&_nbind.throwError(\"Type mismatch\"),new _nbind.External(o).register()},r}return e}(_nbind.BindType);_nbind.CallbackType=CallbackType,_nbind.valueList=[0];var firstFreeValue=0;function pushValue(t){var e=firstFreeValue;return e?firstFreeValue=_nbind.valueList[e]:e=_nbind.valueList.length,_nbind.valueList[e]=t,e*2+1}_nbind.pushValue=pushValue;function popValue(t,e){if(t||_nbind.throwError(\"Value type JavaScript class is missing or not registered\"),t&1){t>>=1;var r=_nbind.valueList[t];return _nbind.valueList[t]=firstFreeValue,firstFreeValue=t,r}else{if(e)return _nbind.popShared(t,e);throw new Error(\"Invalid value slot \"+t)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(t){return typeof t==\"number\"?t:pushValue(t)*4096+valueBase}function pop64(t){return t<valueBase?t:popValue((t-valueBase)/4096)}var CreateValueType=function(t){__extends(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.makeWireWrite=function(r){return\"(_nbind.pushValue(new \"+r+\"))\"},e}(_nbind.BindType);_nbind.CreateValueType=CreateValueType;var Int64Type=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireWrite=push64,r.wireRead=pop64,r}return e}(_nbind.BindType);_nbind.Int64Type=Int64Type;function pushArray(t,e){if(!t)return 0;var r=t.length;if((e.size||e.size===0)&&r<e.size)throw new Error(\"Type mismatch\");var o=e.memberType.ptrSize,a=_nbind.Pool.lalloc(4+r*o);HEAPU32[a/4]=r;var n=e.memberType.heap,u=(a+4)/o,A=e.memberType.wireWrite,p=0;if(A)for(;p<r;)n[u++]=A(t[p++]);else for(;p<r;)n[u++]=t[p++];return a}_nbind.pushArray=pushArray;function popArray(t,e){if(t===0)return null;var r=HEAPU32[t/4],o=new Array(r),a=e.memberType.heap;t=(t+4)/e.memberType.ptrSize;var n=e.memberType.wireRead,u=0;if(n)for(;u<r;)o[u++]=n(a[t++]);else for(;u<r;)o[u++]=a[t++];return o}_nbind.popArray=popArray;var ArrayType=function(t){__extends(e,t);function e(r){var o=t.call(this,r)||this;return o.wireRead=function(a){return popArray(a,o)},o.wireWrite=function(a){return pushArray(a,o)},o.readResources=[_nbind.resources.pool],o.writeResources=[_nbind.resources.pool],o.memberType=r.paramList[0],r.paramList[1]&&(o.size=r.paramList[1]),o}return e}(_nbind.BindType);_nbind.ArrayType=ArrayType;function pushString(t,e){if(t==null)if(e&&e.Nullable)t=\"\";else throw new Error(\"Type mismatch\");if(e&&e.Strict){if(typeof t!=\"string\")throw new Error(\"Type mismatch\")}else t=t.toString();var r=Module.lengthBytesUTF8(t),o=_nbind.Pool.lalloc(4+r+1);return HEAPU32[o/4]=r,Module.stringToUTF8Array(t,HEAPU8,o+4,r+1),o}_nbind.pushString=pushString;function popString(t){if(t===0)return null;var e=HEAPU32[t/4];return Module.Pointer_stringify(t+4,e)}_nbind.popString=popString;var StringType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=popString,r.wireWrite=pushString,r.readResources=[_nbind.resources.pool],r.writeResources=[_nbind.resources.pool],r}return e.prototype.makeWireWrite=function(r,o){return function(a){return pushString(a,o)}},e}(_nbind.BindType);_nbind.StringType=StringType;function makeArgList(t){return Array.apply(null,Array(t)).map(function(e,r){return\"a\"+(r+1)})}function anyNeedsWireWrite(t,e){return t.reduce(function(r,o){return r||o.needsWireWrite(e)},!1)}function anyNeedsWireRead(t,e){return t.reduce(function(r,o){return r||!!o.needsWireRead(e)},!1)}function makeWireRead(t,e,r,o){var a=t.length;return r.makeWireRead?r.makeWireRead(o,t,a):r.wireRead?(t[a]=r.wireRead,\"(convertParamList[\"+a+\"](\"+o+\"))\"):o}function makeWireWrite(t,e,r,o){var a,n=t.length;return r.makeWireWrite?a=r.makeWireWrite(o,e,t,n):a=r.wireWrite,a?typeof a==\"string\"?a:(t[n]=a,\"(convertParamList[\"+n+\"](\"+o+\"))\"):o}function buildCallerFunction(dynCall,ptrType,ptr,num,policyTbl,needsWireWrite,prefix,returnType,argTypeList,mask,err){var argList=makeArgList(argTypeList.length),convertParamList=[],callExpression=makeWireRead(convertParamList,policyTbl,returnType,\"dynCall(\"+[prefix].concat(argList.map(function(t,e){return makeWireWrite(convertParamList,policyTbl,argTypeList[e],t)})).join(\",\")+\")\"),resourceSet=_nbind.listResources([returnType],argTypeList),sourceCode=\"function(\"+argList.join(\",\")+\"){\"+(mask?\"this.__nbindFlags&mask&&err();\":\"\")+resourceSet.makeOpen()+\"var r=\"+callExpression+\";\"+resourceSet.makeClose()+\"return r;}\";return eval(\"(\"+sourceCode+\")\")}function buildJSCallerFunction(returnType,argTypeList){var argList=makeArgList(argTypeList.length),convertParamList=[],callExpression=makeWireWrite(convertParamList,null,returnType,\"_nbind.externalList[num].data(\"+argList.map(function(t,e){return makeWireRead(convertParamList,null,argTypeList[e],t)}).join(\",\")+\")\"),resourceSet=_nbind.listResources(argTypeList,[returnType]);resourceSet.remove(_nbind.resources.pool);var sourceCode=\"function(\"+[\"dummy\",\"num\"].concat(argList).join(\",\")+\"){\"+resourceSet.makeOpen()+\"var r=\"+callExpression+\";\"+resourceSet.makeClose()+\"return r;}\";return eval(\"(\"+sourceCode+\")\")}_nbind.buildJSCallerFunction=buildJSCallerFunction;function makeJSCaller(t){var e=t.length-1,r=_nbind.getTypes(t,\"callback\"),o=r[0],a=r.slice(1),n=anyNeedsWireRead(a,null),u=o.needsWireWrite(null);if(!u&&!n)switch(e){case 0:return function(A,p){return _nbind.externalList[p].data()};case 1:return function(A,p,h){return _nbind.externalList[p].data(h)};case 2:return function(A,p,h,E){return _nbind.externalList[p].data(h,E)};case 3:return function(A,p,h,E,I){return _nbind.externalList[p].data(h,E,I)};default:break}return buildJSCallerFunction(o,a)}_nbind.makeJSCaller=makeJSCaller;function makeMethodCaller(t,e){var r=e.typeList.length-1,o=e.typeList.slice(0);o.splice(1,0,\"uint32_t\",e.boundID);var a=_nbind.getTypes(o,e.title),n=a[0],u=a.slice(3),A=n.needsWireRead(e.policyTbl),p=anyNeedsWireWrite(u,e.policyTbl),h=e.ptr,E=e.num,I=_nbind.getDynCall(a,e.title),v=~e.flags&1;function x(){throw new Error(\"Calling a non-const method on a const object\")}if(!A&&!p)switch(r){case 0:return function(){return this.__nbindFlags&v?x():I(h,E,_nbind.pushPointer(this,t))};case 1:return function(C){return this.__nbindFlags&v?x():I(h,E,_nbind.pushPointer(this,t),C)};case 2:return function(C,R){return this.__nbindFlags&v?x():I(h,E,_nbind.pushPointer(this,t),C,R)};case 3:return function(C,R,L){return this.__nbindFlags&v?x():I(h,E,_nbind.pushPointer(this,t),C,R,L)};default:break}return buildCallerFunction(I,t,h,E,e.policyTbl,p,\"ptr,num,pushPointer(this,ptrType)\",n,u,v,x)}_nbind.makeMethodCaller=makeMethodCaller;function makeCaller(t){var e=t.typeList.length-1,r=_nbind.getTypes(t.typeList,t.title),o=r[0],a=r.slice(1),n=o.needsWireRead(t.policyTbl),u=anyNeedsWireWrite(a,t.policyTbl),A=t.direct,p=t.ptr;if(t.direct&&!n&&!u){var h=_nbind.getDynCall(r,t.title);switch(e){case 0:return function(){return h(A)};case 1:return function(x){return h(A,x)};case 2:return function(x,C){return h(A,x,C)};case 3:return function(x,C,R){return h(A,x,C,R)};default:break}p=0}var E;if(p){var I=t.typeList.slice(0);I.splice(1,0,\"uint32_t\"),r=_nbind.getTypes(I,t.title),E=\"ptr,num\"}else p=A,E=\"ptr\";var v=_nbind.getDynCall(r,t.title);return buildCallerFunction(v,null,p,t.num,t.policyTbl,u,E,o,a)}_nbind.makeCaller=makeCaller;function makeOverloader(t,e){var r=[];function o(){return r[arguments.length].apply(this,arguments)}return o.addMethod=function(a,n){r[n]=a},o.addMethod(t,e),o}_nbind.makeOverloader=makeOverloader;var Resource=function(){function t(e,r){var o=this;this.makeOpen=function(){return Object.keys(o.openTbl).join(\"\")},this.makeClose=function(){return Object.keys(o.closeTbl).join(\"\")},this.openTbl={},this.closeTbl={},e&&(this.openTbl[e]=!0),r&&(this.closeTbl[r]=!0)}return t.prototype.add=function(e){for(var r=0,o=Object.keys(e.openTbl);r<o.length;r++){var a=o[r];this.openTbl[a]=!0}for(var n=0,u=Object.keys(e.closeTbl);n<u.length;n++){var a=u[n];this.closeTbl[a]=!0}},t.prototype.remove=function(e){for(var r=0,o=Object.keys(e.openTbl);r<o.length;r++){var a=o[r];delete this.openTbl[a]}for(var n=0,u=Object.keys(e.closeTbl);n<u.length;n++){var a=u[n];delete this.closeTbl[a]}},t}();_nbind.Resource=Resource;function listResources(t,e){for(var r=new Resource,o=0,a=t;o<a.length;o++)for(var n=a[o],u=0,A=n.readResources||[];u<A.length;u++){var p=A[u];r.add(p)}for(var h=0,E=e;h<E.length;h++)for(var n=E[h],I=0,v=n.writeResources||[];I<v.length;I++){var p=v[I];r.add(p)}return r}_nbind.listResources=listResources,_nbind.resources={pool:new Resource(\"var used=HEAPU32[_nbind.Pool.usedPtr],page=HEAPU32[_nbind.Pool.pagePtr];\",\"_nbind.Pool.lreset(used,page);\")};var ExternalBuffer=function(t){__extends(e,t);function e(r,o){var a=t.call(this,r)||this;return a.ptr=o,a}return e.prototype.free=function(){_free(this.ptr)},e}(_nbind.External);function getBuffer(t){return t instanceof ArrayBuffer?new Uint8Array(t):t instanceof DataView?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):t}function pushBuffer(t,e){if(t==null&&e&&e.Nullable&&(t=[]),typeof t!=\"object\")throw new Error(\"Type mismatch\");var r=t,o=r.byteLength||r.length;if(!o&&o!==0&&r.byteLength!==0)throw new Error(\"Type mismatch\");var a=_nbind.Pool.lalloc(8),n=_malloc(o),u=a/4;return HEAPU32[u++]=o,HEAPU32[u++]=n,HEAPU32[u++]=new ExternalBuffer(t,n).register(),HEAPU8.set(getBuffer(t),n),a}var BufferType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireWrite=pushBuffer,r.readResources=[_nbind.resources.pool],r.writeResources=[_nbind.resources.pool],r}return e.prototype.makeWireWrite=function(r,o){return function(a){return pushBuffer(a,o)}},e}(_nbind.BindType);_nbind.BufferType=BufferType;function commitBuffer(t,e,r){var o=_nbind.externalList[t].data,a=Buffer;if(typeof Buffer!=\"function\"&&(a=function(){}),!(o instanceof Array)){var n=HEAPU8.subarray(e,e+r);if(o instanceof a){var u=void 0;typeof Buffer.from==\"function\"&&Buffer.from.length>=3?u=Buffer.from(n):u=new Buffer(n),u.copy(o)}else getBuffer(o).set(n)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var t=0,e=dirtyList;t<e.length;t++){var r=e[t];r.__nbindState&3||r.free()}dirtyList=[],gcTimer=0}_nbind.mark=function(t){};function toggleLightGC(t){t?_nbind.mark=function(e){dirtyList.push(e),gcTimer||(gcTimer=setTimeout(sweep,0))}:_nbind.mark=function(e){}}_nbind.toggleLightGC=toggleLightGC}(_nbind),Module.requestFullScreen=function t(e,r,o){Module.printErr(\"Module.requestFullScreen is deprecated. Please call Module.requestFullscreen instead.\"),Module.requestFullScreen=Module.requestFullscreen,Browser.requestFullScreen(e,r,o)},Module.requestFullscreen=function t(e,r,o){Browser.requestFullscreen(e,r,o)},Module.requestAnimationFrame=function t(e){Browser.requestAnimationFrame(e)},Module.setCanvasSize=function t(e,r,o){Browser.setCanvasSize(e,r,o)},Module.pauseMainLoop=function t(){Browser.mainLoop.pause()},Module.resumeMainLoop=function t(){Browser.mainLoop.resume()},Module.getUserMedia=function t(){Browser.getUserMedia()},Module.createContext=function t(e,r,o,a){return Browser.createContext(e,r,o,a)},ENVIRONMENT_IS_NODE?_emscripten_get_now=function(){var e=process.hrtime();return e[0]*1e3+e[1]/1e6}:typeof dateNow<\"u\"?_emscripten_get_now=dateNow:typeof self==\"object\"&&self.performance&&typeof self.performance.now==\"function\"?_emscripten_get_now=function(){return self.performance.now()}:typeof performance==\"object\"&&typeof performance.now==\"function\"?_emscripten_get_now=function(){return performance.now()}:_emscripten_get_now=Date.now,__ATEXIT__.push(function(){var t=Module._fflush;t&&t(0);var e=___syscall146.printChar;if(e){var r=___syscall146.buffers;r[1].length&&e(1,10),r[2].length&&e(2,10)}}),DYNAMICTOP_PTR=allocate(1,\"i32\",ALLOC_STATIC),STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP),STACK_MAX=STACK_BASE+TOTAL_STACK,DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX),HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(t,e,r,o,a,n){try{Module.dynCall_viiiii(t,e,r,o,a,n)}catch(u){if(typeof u!=\"number\"&&u!==\"longjmp\")throw u;Module.setThrew(1,0)}}function invoke_vif(t,e,r){try{Module.dynCall_vif(t,e,r)}catch(o){if(typeof o!=\"number\"&&o!==\"longjmp\")throw o;Module.setThrew(1,0)}}function invoke_vid(t,e,r){try{Module.dynCall_vid(t,e,r)}catch(o){if(typeof o!=\"number\"&&o!==\"longjmp\")throw o;Module.setThrew(1,0)}}function invoke_fiff(t,e,r,o){try{return Module.dynCall_fiff(t,e,r,o)}catch(a){if(typeof a!=\"number\"&&a!==\"longjmp\")throw a;Module.setThrew(1,0)}}function invoke_vi(t,e){try{Module.dynCall_vi(t,e)}catch(r){if(typeof r!=\"number\"&&r!==\"longjmp\")throw r;Module.setThrew(1,0)}}function invoke_vii(t,e,r){try{Module.dynCall_vii(t,e,r)}catch(o){if(typeof o!=\"number\"&&o!==\"longjmp\")throw o;Module.setThrew(1,0)}}function invoke_ii(t,e){try{return Module.dynCall_ii(t,e)}catch(r){if(typeof r!=\"number\"&&r!==\"longjmp\")throw r;Module.setThrew(1,0)}}function invoke_viddi(t,e,r,o,a){try{Module.dynCall_viddi(t,e,r,o,a)}catch(n){if(typeof n!=\"number\"&&n!==\"longjmp\")throw n;Module.setThrew(1,0)}}function invoke_vidd(t,e,r,o){try{Module.dynCall_vidd(t,e,r,o)}catch(a){if(typeof a!=\"number\"&&a!==\"longjmp\")throw a;Module.setThrew(1,0)}}function invoke_iiii(t,e,r,o){try{return Module.dynCall_iiii(t,e,r,o)}catch(a){if(typeof a!=\"number\"&&a!==\"longjmp\")throw a;Module.setThrew(1,0)}}function invoke_diii(t,e,r,o){try{return Module.dynCall_diii(t,e,r,o)}catch(a){if(typeof a!=\"number\"&&a!==\"longjmp\")throw a;Module.setThrew(1,0)}}function invoke_di(t,e){try{return Module.dynCall_di(t,e)}catch(r){if(typeof r!=\"number\"&&r!==\"longjmp\")throw r;Module.setThrew(1,0)}}function invoke_iid(t,e,r){try{return Module.dynCall_iid(t,e,r)}catch(o){if(typeof o!=\"number\"&&o!==\"longjmp\")throw o;Module.setThrew(1,0)}}function invoke_iii(t,e,r){try{return Module.dynCall_iii(t,e,r)}catch(o){if(typeof o!=\"number\"&&o!==\"longjmp\")throw o;Module.setThrew(1,0)}}function invoke_viiddi(t,e,r,o,a,n){try{Module.dynCall_viiddi(t,e,r,o,a,n)}catch(u){if(typeof u!=\"number\"&&u!==\"longjmp\")throw u;Module.setThrew(1,0)}}function invoke_viiiiii(t,e,r,o,a,n,u){try{Module.dynCall_viiiiii(t,e,r,o,a,n,u)}catch(A){if(typeof A!=\"number\"&&A!==\"longjmp\")throw A;Module.setThrew(1,0)}}function invoke_dii(t,e,r){try{return Module.dynCall_dii(t,e,r)}catch(o){if(typeof o!=\"number\"&&o!==\"longjmp\")throw o;Module.setThrew(1,0)}}function invoke_i(t){try{return Module.dynCall_i(t)}catch(e){if(typeof e!=\"number\"&&e!==\"longjmp\")throw e;Module.setThrew(1,0)}}function invoke_iiiiii(t,e,r,o,a,n){try{return Module.dynCall_iiiiii(t,e,r,o,a,n)}catch(u){if(typeof u!=\"number\"&&u!==\"longjmp\")throw u;Module.setThrew(1,0)}}function invoke_viiid(t,e,r,o,a){try{Module.dynCall_viiid(t,e,r,o,a)}catch(n){if(typeof n!=\"number\"&&n!==\"longjmp\")throw n;Module.setThrew(1,0)}}function invoke_viififi(t,e,r,o,a,n,u){try{Module.dynCall_viififi(t,e,r,o,a,n,u)}catch(A){if(typeof A!=\"number\"&&A!==\"longjmp\")throw A;Module.setThrew(1,0)}}function invoke_viii(t,e,r,o){try{Module.dynCall_viii(t,e,r,o)}catch(a){if(typeof a!=\"number\"&&a!==\"longjmp\")throw a;Module.setThrew(1,0)}}function invoke_v(t){try{Module.dynCall_v(t)}catch(e){if(typeof e!=\"number\"&&e!==\"longjmp\")throw e;Module.setThrew(1,0)}}function invoke_viid(t,e,r,o){try{Module.dynCall_viid(t,e,r,o)}catch(a){if(typeof a!=\"number\"&&a!==\"longjmp\")throw a;Module.setThrew(1,0)}}function invoke_idd(t,e,r){try{return Module.dynCall_idd(t,e,r)}catch(o){if(typeof o!=\"number\"&&o!==\"longjmp\")throw o;Module.setThrew(1,0)}}function invoke_viiii(t,e,r,o,a){try{Module.dynCall_viiii(t,e,r,o,a)}catch(n){if(typeof n!=\"number\"&&n!==\"longjmp\")throw n;Module.setThrew(1,0)}}Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:1/0},Module.asmLibraryArg={abort,assert,enlargeMemory,getTotalMemory,abortOnCannotGrowMemory,invoke_viiiii,invoke_vif,invoke_vid,invoke_fiff,invoke_vi,invoke_vii,invoke_ii,invoke_viddi,invoke_vidd,invoke_iiii,invoke_diii,invoke_di,invoke_iid,invoke_iii,invoke_viiddi,invoke_viiiiii,invoke_dii,invoke_i,invoke_iiiiii,invoke_viiid,invoke_viififi,invoke_viii,invoke_v,invoke_viid,invoke_idd,invoke_viiii,_emscripten_asm_const_iiiii,_emscripten_asm_const_iiidddddd,_emscripten_asm_const_iiiid,__nbind_reference_external,_emscripten_asm_const_iiiiiiii,_removeAccessorPrefix,_typeModule,__nbind_register_pool,__decorate,_llvm_stackrestore,___cxa_atexit,__extends,__nbind_get_value_object,__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,_emscripten_set_main_loop_timing,__nbind_register_primitive,__nbind_register_type,_emscripten_memcpy_big,__nbind_register_function,___setErrNo,__nbind_register_class,__nbind_finish,_abort,_nbind_value,_llvm_stacksave,___syscall54,_defineHidden,_emscripten_set_main_loop,_emscripten_get_now,__nbind_register_callback_signature,_emscripten_asm_const_iiiiii,__nbind_free_external,_emscripten_asm_const_iiii,_emscripten_asm_const_iiididi,___syscall6,_atexit,___syscall140,___syscall146,DYNAMICTOP_PTR,tempDoublePtr,ABORT,STACKTOP,STACK_MAX,cttz_i8,___dso_handle};var asm=function(t,e,r){var o=new t.Int8Array(r),a=new t.Int16Array(r),n=new t.Int32Array(r),u=new t.Uint8Array(r),A=new t.Uint16Array(r),p=new t.Uint32Array(r),h=new t.Float32Array(r),E=new t.Float64Array(r),I=e.DYNAMICTOP_PTR|0,v=e.tempDoublePtr|0,x=e.ABORT|0,C=e.STACKTOP|0,R=e.STACK_MAX|0,L=e.cttz_i8|0,U=e.___dso_handle|0,z=0,te=0,ae=0,le=0,ce=t.NaN,Ce=t.Infinity,de=0,Be=0,Ee=0,g=0,me=0,we=0,Ae=t.Math.floor,ne=t.Math.abs,Z=t.Math.sqrt,xe=t.Math.pow,Ne=t.Math.cos,ht=t.Math.sin,H=t.Math.tan,rt=t.Math.acos,Te=t.Math.asin,Fe=t.Math.atan,ke=t.Math.atan2,Ye=t.Math.exp,be=t.Math.log,et=t.Math.ceil,Ue=t.Math.imul,S=t.Math.min,w=t.Math.max,b=t.Math.clz32,y=t.Math.fround,F=e.abort,J=e.assert,X=e.enlargeMemory,$=e.getTotalMemory,ie=e.abortOnCannotGrowMemory,Se=e.invoke_viiiii,Re=e.invoke_vif,at=e.invoke_vid,dt=e.invoke_fiff,jt=e.invoke_vi,tr=e.invoke_vii,bt=e.invoke_ii,ln=e.invoke_viddi,kr=e.invoke_vidd,mr=e.invoke_iiii,Sr=e.invoke_diii,Kr=e.invoke_di,Kn=e.invoke_iid,Ms=e.invoke_iii,Ri=e.invoke_viiddi,gs=e.invoke_viiiiii,io=e.invoke_dii,Pi=e.invoke_i,Os=e.invoke_iiiiii,so=e.invoke_viiid,uc=e.invoke_viififi,Au=e.invoke_viii,op=e.invoke_v,ap=e.invoke_viid,Us=e.invoke_idd,Dn=e.invoke_viiii,oo=e._emscripten_asm_const_iiiii,_s=e._emscripten_asm_const_iiidddddd,ml=e._emscripten_asm_const_iiiid,yl=e.__nbind_reference_external,ao=e._emscripten_asm_const_iiiiiiii,Vn=e._removeAccessorPrefix,Mn=e._typeModule,Ti=e.__nbind_register_pool,On=e.__decorate,_i=e._llvm_stackrestore,ir=e.___cxa_atexit,Me=e.__extends,ii=e.__nbind_get_value_object,Ha=e.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,hr=e._emscripten_set_main_loop_timing,Ac=e.__nbind_register_primitive,fu=e.__nbind_register_type,fc=e._emscripten_memcpy_big,El=e.__nbind_register_function,vA=e.___setErrNo,pu=e.__nbind_register_class,Ie=e.__nbind_finish,Tt=e._abort,pc=e._nbind_value,Hi=e._llvm_stacksave,hu=e.___syscall54,Yt=e._defineHidden,Cl=e._emscripten_set_main_loop,DA=e._emscripten_get_now,lp=e.__nbind_register_callback_signature,hc=e._emscripten_asm_const_iiiiii,PA=e.__nbind_free_external,Qn=e._emscripten_asm_const_iiii,hi=e._emscripten_asm_const_iiididi,gc=e.___syscall6,bA=e._atexit,aa=e.___syscall140,Ni=e.___syscall146,_o=y(0);let Xe=y(0);function lo(s){s=s|0;var l=0;return l=C,C=C+s|0,C=C+15&-16,l|0}function dc(){return C|0}function gu(s){s=s|0,C=s}function qi(s,l){s=s|0,l=l|0,C=s,R=l}function du(s,l){s=s|0,l=l|0,z||(z=s,te=l)}function SA(s){s=s|0,we=s}function qa(){return we|0}function mc(){var s=0,l=0;Dr(8104,8,400)|0,Dr(8504,408,540)|0,s=9044,l=s+44|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));o[9088]=0,o[9089]=1,n[2273]=0,n[2274]=948,n[2275]=948,ir(17,8104,U|0)|0}function ds(s){s=s|0,ft(s+948|0)}function Ht(s){return s=y(s),((bu(s)|0)&2147483647)>>>0>2139095040|0}function Fn(s,l,c){s=s|0,l=l|0,c=c|0;e:do if(n[s+(l<<3)+4>>2]|0)s=s+(l<<3)|0;else{if((l|2|0)==3&&n[s+60>>2]|0){s=s+56|0;break}switch(l|0){case 0:case 2:case 4:case 5:{if(n[s+52>>2]|0){s=s+48|0;break e}break}default:}if(n[s+68>>2]|0){s=s+64|0;break}else{s=(l|1|0)==5?948:c;break}}while(!1);return s|0}function Ei(s){s=s|0;var l=0;return l=Jv(1e3)|0,la(s,(l|0)!=0,2456),n[2276]=(n[2276]|0)+1,Dr(l|0,8104,1e3)|0,o[s+2>>0]|0&&(n[l+4>>2]=2,n[l+12>>2]=4),n[l+976>>2]=s,l|0}function la(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;d=C,C=C+16|0,f=d,l||(n[f>>2]=c,g0(s,5,3197,f)),C=d}function co(){return Ei(956)|0}function Hs(s){s=s|0;var l=0;return l=Kt(1e3)|0,ca(l,s),la(n[s+976>>2]|0,1,2456),n[2276]=(n[2276]|0)+1,n[l+944>>2]=0,l|0}function ca(s,l){s=s|0,l=l|0;var c=0;Dr(s|0,l|0,948)|0,Cd(s+948|0,l+948|0),c=s+960|0,s=l+960|0,l=c+40|0;do n[c>>2]=n[s>>2],c=c+4|0,s=s+4|0;while((c|0)<(l|0))}function ua(s){s=s|0;var l=0,c=0,f=0,d=0;if(l=s+944|0,c=n[l>>2]|0,c|0&&(Ho(c+948|0,s)|0,n[l>>2]=0),c=Ci(s)|0,c|0){l=0;do n[(ms(s,l)|0)+944>>2]=0,l=l+1|0;while((l|0)!=(c|0))}c=s+948|0,f=n[c>>2]|0,d=s+952|0,l=n[d>>2]|0,(l|0)!=(f|0)&&(n[d>>2]=l+(~((l+-4-f|0)>>>2)<<2)),ys(c),Xv(s),n[2276]=(n[2276]|0)+-1}function Ho(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0;f=n[s>>2]|0,k=s+4|0,c=n[k>>2]|0,m=c;e:do if((f|0)==(c|0))d=f,B=4;else for(s=f;;){if((n[s>>2]|0)==(l|0)){d=s,B=4;break e}if(s=s+4|0,(s|0)==(c|0)){s=0;break}}while(!1);return(B|0)==4&&((d|0)!=(c|0)?(f=d+4|0,s=m-f|0,l=s>>2,l&&(ww(d|0,f|0,s|0)|0,c=n[k>>2]|0),s=d+(l<<2)|0,(c|0)==(s|0)||(n[k>>2]=c+(~((c+-4-s|0)>>>2)<<2)),s=1):s=0),s|0}function Ci(s){return s=s|0,(n[s+952>>2]|0)-(n[s+948>>2]|0)>>2|0}function ms(s,l){s=s|0,l=l|0;var c=0;return c=n[s+948>>2]|0,(n[s+952>>2]|0)-c>>2>>>0>l>>>0?s=n[c+(l<<2)>>2]|0:s=0,s|0}function ys(s){s=s|0;var l=0,c=0,f=0,d=0;f=C,C=C+32|0,l=f,d=n[s>>2]|0,c=(n[s+4>>2]|0)-d|0,((n[s+8>>2]|0)-d|0)>>>0>c>>>0&&(d=c>>2,Cp(l,d,d,s+8|0),E0(s,l),UA(l)),C=f}function Es(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0;O=Ci(s)|0;do if(O|0){if((n[(ms(s,0)|0)+944>>2]|0)==(s|0)){if(!(Ho(s+948|0,l)|0))break;Dr(l+400|0,8504,540)|0,n[l+944>>2]=0,Le(s);break}B=n[(n[s+976>>2]|0)+12>>2]|0,k=s+948|0,Q=(B|0)==0,c=0,m=0;do f=n[(n[k>>2]|0)+(m<<2)>>2]|0,(f|0)==(l|0)?Le(s):(d=Hs(f)|0,n[(n[k>>2]|0)+(c<<2)>>2]=d,n[d+944>>2]=s,Q||BR[B&15](f,d,s,c),c=c+1|0),m=m+1|0;while((m|0)!=(O|0));if(c>>>0<O>>>0){Q=s+948|0,k=s+952|0,B=c,c=n[k>>2]|0;do m=(n[Q>>2]|0)+(B<<2)|0,f=m+4|0,d=c-f|0,l=d>>2,l&&(ww(m|0,f|0,d|0)|0,c=n[k>>2]|0),d=c,f=m+(l<<2)|0,(d|0)!=(f|0)&&(c=d+(~((d+-4-f|0)>>>2)<<2)|0,n[k>>2]=c),B=B+1|0;while((B|0)!=(O|0))}}while(!1)}function qs(s){s=s|0;var l=0,c=0,f=0,d=0;Un(s,(Ci(s)|0)==0,2491),Un(s,(n[s+944>>2]|0)==0,2545),l=s+948|0,c=n[l>>2]|0,f=s+952|0,d=n[f>>2]|0,(d|0)!=(c|0)&&(n[f>>2]=d+(~((d+-4-c|0)>>>2)<<2)),ys(l),l=s+976|0,c=n[l>>2]|0,Dr(s|0,8104,1e3)|0,o[c+2>>0]|0&&(n[s+4>>2]=2,n[s+12>>2]=4),n[l>>2]=c}function Un(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;d=C,C=C+16|0,f=d,l||(n[f>>2]=c,Ao(s,5,3197,f)),C=d}function Pn(){return n[2276]|0}function Cs(){var s=0;return s=Jv(20)|0,We((s|0)!=0,2592),n[2277]=(n[2277]|0)+1,n[s>>2]=n[239],n[s+4>>2]=n[240],n[s+8>>2]=n[241],n[s+12>>2]=n[242],n[s+16>>2]=n[243],s|0}function We(s,l){s=s|0,l=l|0;var c=0,f=0;f=C,C=C+16|0,c=f,s||(n[c>>2]=l,Ao(0,5,3197,c)),C=f}function tt(s){s=s|0,Xv(s),n[2277]=(n[2277]|0)+-1}function Bt(s,l){s=s|0,l=l|0;var c=0;l?(Un(s,(Ci(s)|0)==0,2629),c=1):(c=0,l=0),n[s+964>>2]=l,n[s+988>>2]=c}function or(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,m=f+8|0,d=f+4|0,B=f,n[d>>2]=l,Un(s,(n[l+944>>2]|0)==0,2709),Un(s,(n[s+964>>2]|0)==0,2763),ee(s),l=s+948|0,n[B>>2]=(n[l>>2]|0)+(c<<2),n[m>>2]=n[B>>2],ye(l,m,d)|0,n[(n[d>>2]|0)+944>>2]=s,Le(s),C=f}function ee(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;if(c=Ci(s)|0,c|0&&(n[(ms(s,0)|0)+944>>2]|0)!=(s|0)){f=n[(n[s+976>>2]|0)+12>>2]|0,d=s+948|0,m=(f|0)==0,l=0;do B=n[(n[d>>2]|0)+(l<<2)>>2]|0,k=Hs(B)|0,n[(n[d>>2]|0)+(l<<2)>>2]=k,n[k+944>>2]=s,m||BR[f&15](B,k,s,l),l=l+1|0;while((l|0)!=(c|0))}}function ye(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0,je=0,Oe=0,Qe=0,$e=0,Je=0;$e=C,C=C+64|0,j=$e+52|0,k=$e+48|0,se=$e+28|0,je=$e+24|0,Oe=$e+20|0,Qe=$e,f=n[s>>2]|0,m=f,l=f+((n[l>>2]|0)-m>>2<<2)|0,f=s+4|0,d=n[f>>2]|0,B=s+8|0;do if(d>>>0<(n[B>>2]|0)>>>0){if((l|0)==(d|0)){n[l>>2]=n[c>>2],n[f>>2]=(n[f>>2]|0)+4;break}_A(s,l,d,l+4|0),l>>>0<=c>>>0&&(c=(n[f>>2]|0)>>>0>c>>>0?c+4|0:c),n[l>>2]=n[c>>2]}else{f=(d-m>>2)+1|0,d=N(s)|0,d>>>0<f>>>0&&Jr(s),M=n[s>>2]|0,O=(n[B>>2]|0)-M|0,m=O>>1,Cp(Qe,O>>2>>>0<d>>>1>>>0?m>>>0<f>>>0?f:m:d,l-M>>2,s+8|0),M=Qe+8|0,f=n[M>>2]|0,m=Qe+12|0,O=n[m>>2]|0,B=O,Q=f;do if((f|0)==(O|0)){if(O=Qe+4|0,f=n[O>>2]|0,Je=n[Qe>>2]|0,d=Je,f>>>0<=Je>>>0){f=B-d>>1,f=f|0?f:1,Cp(se,f,f>>>2,n[Qe+16>>2]|0),n[je>>2]=n[O>>2],n[Oe>>2]=n[M>>2],n[k>>2]=n[je>>2],n[j>>2]=n[Oe>>2],lw(se,k,j),f=n[Qe>>2]|0,n[Qe>>2]=n[se>>2],n[se>>2]=f,f=se+4|0,Je=n[O>>2]|0,n[O>>2]=n[f>>2],n[f>>2]=Je,f=se+8|0,Je=n[M>>2]|0,n[M>>2]=n[f>>2],n[f>>2]=Je,f=se+12|0,Je=n[m>>2]|0,n[m>>2]=n[f>>2],n[f>>2]=Je,UA(se),f=n[M>>2]|0;break}m=f,B=((m-d>>2)+1|0)/-2|0,k=f+(B<<2)|0,d=Q-m|0,m=d>>2,m&&(ww(k|0,f|0,d|0)|0,f=n[O>>2]|0),Je=k+(m<<2)|0,n[M>>2]=Je,n[O>>2]=f+(B<<2),f=Je}while(!1);n[f>>2]=n[c>>2],n[M>>2]=(n[M>>2]|0)+4,l=C0(s,Qe,l)|0,UA(Qe)}while(!1);return C=$e,l|0}function Le(s){s=s|0;var l=0;do{if(l=s+984|0,o[l>>0]|0)break;o[l>>0]=1,h[s+504>>2]=y(ce),s=n[s+944>>2]|0}while(s|0)}function ft(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),gt(c))}function pt(s){return s=s|0,n[s+944>>2]|0}function Nt(s){s=s|0,Un(s,(n[s+964>>2]|0)!=0,2832),Le(s)}function rr(s){return s=s|0,(o[s+984>>0]|0)!=0|0}function $r(s,l){s=s|0,l=l|0,TUe(s,l,400)|0&&(Dr(s|0,l|0,400)|0,Le(s))}function ji(s){s=s|0;var l=Xe;return l=y(h[s+44>>2]),s=Ht(l)|0,y(s?y(0):l)}function rs(s){s=s|0;var l=Xe;return l=y(h[s+48>>2]),Ht(l)|0&&(l=o[(n[s+976>>2]|0)+2>>0]|0?y(1):y(0)),y(l)}function bi(s,l){s=s|0,l=l|0,n[s+980>>2]=l}function qo(s){return s=s|0,n[s+980>>2]|0}function xA(s,l){s=s|0,l=l|0;var c=0;c=s+4|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function kA(s){return s=s|0,n[s+4>>2]|0}function cp(s,l){s=s|0,l=l|0;var c=0;c=s+8|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function e0(s){return s=s|0,n[s+8>>2]|0}function mu(s,l){s=s|0,l=l|0;var c=0;c=s+12|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function t0(s){return s=s|0,n[s+12>>2]|0}function yu(s,l){s=s|0,l=l|0;var c=0;c=s+16|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function uo(s){return s=s|0,n[s+16>>2]|0}function QA(s,l){s=s|0,l=l|0;var c=0;c=s+20|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function yc(s){return s=s|0,n[s+20>>2]|0}function Aa(s,l){s=s|0,l=l|0;var c=0;c=s+24|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function r0(s){return s=s|0,n[s+24>>2]|0}function Ec(s,l){s=s|0,l=l|0;var c=0;c=s+28|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function hd(s){return s=s|0,n[s+28>>2]|0}function n0(s,l){s=s|0,l=l|0;var c=0;c=s+32|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function $n(s){return s=s|0,n[s+32>>2]|0}function up(s,l){s=s|0,l=l|0;var c=0;c=s+36|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Le(s))}function i0(s){return s=s|0,n[s+36>>2]|0}function FA(s,l){s=s|0,l=y(l);var c=0;c=s+40|0,y(h[c>>2])!=l&&(h[c>>2]=l,Le(s))}function js(s,l){s=s|0,l=y(l);var c=0;c=s+44|0,y(h[c>>2])!=l&&(h[c>>2]=l,Le(s))}function Eu(s,l){s=s|0,l=y(l);var c=0;c=s+48|0,y(h[c>>2])!=l&&(h[c>>2]=l,Le(s))}function ja(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+52|0,d=s+56|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function Gi(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+52|0,c=s+56|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ht(l)|0,n[c>>2]=f?3:2,Le(s))}function fa(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+52|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Cu(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=(m^1)&1,d=s+132+(l<<3)|0,l=s+132+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function ws(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=m?0:2,d=s+132+(l<<3)|0,l=s+132+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function Cc(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+132+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function wc(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=(m^1)&1,d=s+60+(l<<3)|0,l=s+60+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function Y(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=m?0:2,d=s+60+(l<<3)|0,l=s+60+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function Dt(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+60+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function wl(s,l){s=s|0,l=l|0;var c=0;c=s+60+(l<<3)+4|0,(n[c>>2]|0)!=3&&(h[s+60+(l<<3)>>2]=y(ce),n[c>>2]=3,Le(s))}function Si(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=(m^1)&1,d=s+204+(l<<3)|0,l=s+204+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function Ic(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=m?0:2,d=s+204+(l<<3)|0,l=s+204+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function ct(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+204+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function wu(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ht(c)|0,f=(m^1)&1,d=s+276+(l<<3)|0,l=s+276+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Le(s))}function s0(s,l){return s=s|0,l=l|0,y(h[s+276+(l<<3)>>2])}function tw(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+348|0,d=s+352|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function RA(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+348|0,c=s+352|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ht(l)|0,n[c>>2]=f?3:2,Le(s))}function Ap(s){s=s|0;var l=0;l=s+352|0,(n[l>>2]|0)!=3&&(h[s+348>>2]=y(ce),n[l>>2]=3,Le(s))}function Br(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+348|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Is(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+356|0,d=s+360|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function o0(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+356|0,c=s+360|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ht(l)|0,n[c>>2]=f?3:2,Le(s))}function a0(s){s=s|0;var l=0;l=s+360|0,(n[l>>2]|0)!=3&&(h[s+356>>2]=y(ce),n[l>>2]=3,Le(s))}function l0(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+356|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function fp(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+364|0,d=s+368|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function Bc(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=m?0:2,f=s+364|0,d=s+368|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function Ct(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+364|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function gd(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+372|0,d=s+376|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function c0(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=m?0:2,f=s+372|0,d=s+376|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function u0(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+372|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Iu(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+380|0,d=s+384|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function dd(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=m?0:2,f=s+380|0,d=s+384|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function A0(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+380|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Bu(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=(m^1)&1,f=s+388|0,d=s+392|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function rw(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ht(l)|0,c=m?0:2,f=s+388|0,d=s+392|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Le(s))}function md(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+388|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function pa(s,l){s=s|0,l=y(l);var c=0;c=s+396|0,y(h[c>>2])!=l&&(h[c>>2]=l,Le(s))}function vc(s){return s=s|0,y(h[s+396>>2])}function Il(s){return s=s|0,y(h[s+400>>2])}function vu(s){return s=s|0,y(h[s+404>>2])}function f0(s){return s=s|0,y(h[s+408>>2])}function TA(s){return s=s|0,y(h[s+412>>2])}function pp(s){return s=s|0,y(h[s+416>>2])}function Ga(s){return s=s|0,y(h[s+420>>2])}function p0(s,l){switch(s=s|0,l=l|0,Un(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+424+(l<<2)>>2])}function hp(s,l){switch(s=s|0,l=l|0,Un(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+448+(l<<2)>>2])}function jo(s,l){switch(s=s|0,l=l|0,Un(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+472+(l<<2)>>2])}function Bs(s,l){s=s|0,l=l|0;var c=0,f=Xe;return c=n[s+4>>2]|0,(c|0)==(n[l+4>>2]|0)?c?(f=y(h[s>>2]),s=y(ne(y(f-y(h[l>>2]))))<y(999999974e-13)):s=1:s=0,s|0}function wi(s,l){s=y(s),l=y(l);var c=0;return Ht(s)|0?c=Ht(l)|0:c=y(ne(y(s-l)))<y(999999974e-13),c|0}function yd(s,l){s=s|0,l=l|0,Ed(s,l)}function Ed(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c+4|0,n[f>>2]=0,n[f+4>>2]=0,n[f+8>>2]=0,Ha(f|0,s|0,l|0,0),Ao(s,3,(o[f+11>>0]|0)<0?n[f>>2]|0:f,c),n3e(f),C=c}function Go(s,l,c,f){s=y(s),l=y(l),c=c|0,f=f|0;var d=Xe;s=y(s*l),d=y(mR(s,y(1)));do if(wi(d,y(0))|0)s=y(s-d);else{if(s=y(s-d),wi(d,y(1))|0){s=y(s+y(1));break}if(c){s=y(s+y(1));break}f||(d>y(.5)?d=y(1):(f=wi(d,y(.5))|0,d=y(f?1:0)),s=y(s+d))}while(!1);return y(s/l)}function NA(s,l,c,f,d,m,B,k,Q,O,M,j,se){s=s|0,l=y(l),c=c|0,f=y(f),d=d|0,m=y(m),B=B|0,k=y(k),Q=y(Q),O=y(O),M=y(M),j=y(j),se=se|0;var je=0,Oe=Xe,Qe=Xe,$e=Xe,Je=Xe,lt=Xe,_e=Xe;return Q<y(0)|O<y(0)?se=0:(se|0&&(Oe=y(h[se+4>>2]),Oe!=y(0))?($e=y(Go(l,Oe,0,0)),Je=y(Go(f,Oe,0,0)),Qe=y(Go(m,Oe,0,0)),Oe=y(Go(k,Oe,0,0))):(Qe=m,$e=l,Oe=k,Je=f),(d|0)==(s|0)?je=wi(Qe,$e)|0:je=0,(B|0)==(c|0)?se=wi(Oe,Je)|0:se=0,!je&&(lt=y(l-M),!(gp(s,lt,Q)|0))&&!(dp(s,lt,d,Q)|0)?je=h0(s,lt,d,m,Q)|0:je=1,!se&&(_e=y(f-j),!(gp(c,_e,O)|0))&&!(dp(c,_e,B,O)|0)?se=h0(c,_e,B,k,O)|0:se=1,se=je&se),se|0}function gp(s,l,c){return s=s|0,l=y(l),c=y(c),(s|0)==1?s=wi(l,c)|0:s=0,s|0}function dp(s,l,c,f){return s=s|0,l=y(l),c=c|0,f=y(f),(s|0)==2&(c|0)==0?l>=f?s=1:s=wi(l,f)|0:s=0,s|0}function h0(s,l,c,f,d){return s=s|0,l=y(l),c=c|0,f=y(f),d=y(d),(s|0)==2&(c|0)==2&f>l?d<=l?s=1:s=wi(l,d)|0:s=0,s|0}function ha(s,l,c,f,d,m,B,k,Q,O,M){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=m|0,B=y(B),k=y(k),Q=Q|0,O=O|0,M=M|0;var j=0,se=0,je=0,Oe=0,Qe=Xe,$e=Xe,Je=0,lt=0,_e=0,qe=0,Lt=0,Or=0,cr=0,Xt=0,Pr=0,Tr=0,ar=0,xn=Xe,go=Xe,mo=Xe,yo=0,Ca=0;ar=C,C=C+160|0,Xt=ar+152|0,cr=ar+120|0,Or=ar+104|0,_e=ar+72|0,Oe=ar+56|0,Lt=ar+8|0,lt=ar,qe=(n[2279]|0)+1|0,n[2279]=qe,Pr=s+984|0,o[Pr>>0]|0&&(n[s+512>>2]|0)!=(n[2278]|0)?Je=4:(n[s+516>>2]|0)==(f|0)?Tr=0:Je=4,(Je|0)==4&&(n[s+520>>2]=0,n[s+924>>2]=-1,n[s+928>>2]=-1,h[s+932>>2]=y(-1),h[s+936>>2]=y(-1),Tr=1);e:do if(n[s+964>>2]|0)if(Qe=y(cn(s,2,B)),$e=y(cn(s,0,B)),j=s+916|0,mo=y(h[j>>2]),go=y(h[s+920>>2]),xn=y(h[s+932>>2]),NA(d,l,m,c,n[s+924>>2]|0,mo,n[s+928>>2]|0,go,xn,y(h[s+936>>2]),Qe,$e,M)|0)Je=22;else if(je=n[s+520>>2]|0,!je)Je=21;else for(se=0;;){if(j=s+524+(se*24|0)|0,xn=y(h[j>>2]),go=y(h[s+524+(se*24|0)+4>>2]),mo=y(h[s+524+(se*24|0)+16>>2]),NA(d,l,m,c,n[s+524+(se*24|0)+8>>2]|0,xn,n[s+524+(se*24|0)+12>>2]|0,go,mo,y(h[s+524+(se*24|0)+20>>2]),Qe,$e,M)|0){Je=22;break e}if(se=se+1|0,se>>>0>=je>>>0){Je=21;break}}else{if(Q){if(j=s+916|0,!(wi(y(h[j>>2]),l)|0)){Je=21;break}if(!(wi(y(h[s+920>>2]),c)|0)){Je=21;break}if((n[s+924>>2]|0)!=(d|0)){Je=21;break}j=(n[s+928>>2]|0)==(m|0)?j:0,Je=22;break}if(je=n[s+520>>2]|0,!je)Je=21;else for(se=0;;){if(j=s+524+(se*24|0)|0,wi(y(h[j>>2]),l)|0&&wi(y(h[s+524+(se*24|0)+4>>2]),c)|0&&(n[s+524+(se*24|0)+8>>2]|0)==(d|0)&&(n[s+524+(se*24|0)+12>>2]|0)==(m|0)){Je=22;break e}if(se=se+1|0,se>>>0>=je>>>0){Je=21;break}}}while(!1);do if((Je|0)==21)o[11697]|0?(j=0,Je=28):(j=0,Je=31);else if((Je|0)==22){if(se=(o[11697]|0)!=0,!((j|0)!=0&(Tr^1)))if(se){Je=28;break}else{Je=31;break}Oe=j+16|0,n[s+908>>2]=n[Oe>>2],je=j+20|0,n[s+912>>2]=n[je>>2],(o[11698]|0)==0|se^1||(n[lt>>2]=LA(qe)|0,n[lt+4>>2]=qe,Ao(s,4,2972,lt),se=n[s+972>>2]|0,se|0&&ef[se&127](s),d=Ya(d,Q)|0,m=Ya(m,Q)|0,Ca=+y(h[Oe>>2]),yo=+y(h[je>>2]),n[Lt>>2]=d,n[Lt+4>>2]=m,E[Lt+8>>3]=+l,E[Lt+16>>3]=+c,E[Lt+24>>3]=Ca,E[Lt+32>>3]=yo,n[Lt+40>>2]=O,Ao(s,4,2989,Lt))}while(!1);return(Je|0)==28&&(se=LA(qe)|0,n[Oe>>2]=se,n[Oe+4>>2]=qe,n[Oe+8>>2]=Tr?3047:11699,Ao(s,4,3038,Oe),se=n[s+972>>2]|0,se|0&&ef[se&127](s),Lt=Ya(d,Q)|0,Je=Ya(m,Q)|0,n[_e>>2]=Lt,n[_e+4>>2]=Je,E[_e+8>>3]=+l,E[_e+16>>3]=+c,n[_e+24>>2]=O,Ao(s,4,3049,_e),Je=31),(Je|0)==31&&(si(s,l,c,f,d,m,B,k,Q,M),o[11697]|0&&(se=n[2279]|0,Lt=LA(se)|0,n[Or>>2]=Lt,n[Or+4>>2]=se,n[Or+8>>2]=Tr?3047:11699,Ao(s,4,3083,Or),se=n[s+972>>2]|0,se|0&&ef[se&127](s),Lt=Ya(d,Q)|0,Or=Ya(m,Q)|0,yo=+y(h[s+908>>2]),Ca=+y(h[s+912>>2]),n[cr>>2]=Lt,n[cr+4>>2]=Or,E[cr+8>>3]=yo,E[cr+16>>3]=Ca,n[cr+24>>2]=O,Ao(s,4,3092,cr)),n[s+516>>2]=f,j||(se=s+520|0,j=n[se>>2]|0,(j|0)==16&&(o[11697]|0&&Ao(s,4,3124,Xt),n[se>>2]=0,j=0),Q?j=s+916|0:(n[se>>2]=j+1,j=s+524+(j*24|0)|0),h[j>>2]=l,h[j+4>>2]=c,n[j+8>>2]=d,n[j+12>>2]=m,n[j+16>>2]=n[s+908>>2],n[j+20>>2]=n[s+912>>2],j=0)),Q&&(n[s+416>>2]=n[s+908>>2],n[s+420>>2]=n[s+912>>2],o[s+985>>0]=1,o[Pr>>0]=0),n[2279]=(n[2279]|0)+-1,n[s+512>>2]=n[2278],C=ar,Tr|(j|0)==0|0}function cn(s,l,c){s=s|0,l=l|0,c=y(c);var f=Xe;return f=y(K(s,l,c)),y(f+y(re(s,l,c)))}function Ao(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=C,C=C+16|0,d=m,n[d>>2]=f,s?f=n[s+976>>2]|0:f=0,d0(f,s,l,c,d),C=m}function LA(s){return s=s|0,(s>>>0>60?3201:3201+(60-s)|0)|0}function Ya(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+32|0,c=d+12|0,f=d,n[c>>2]=n[254],n[c+4>>2]=n[255],n[c+8>>2]=n[256],n[f>>2]=n[257],n[f+4>>2]=n[258],n[f+8>>2]=n[259],(s|0)>2?s=11699:s=n[(l?f:c)+(s<<2)>>2]|0,C=d,s|0}function si(s,l,c,f,d,m,B,k,Q,O){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=m|0,B=y(B),k=y(k),Q=Q|0,O=O|0;var M=0,j=0,se=0,je=0,Oe=Xe,Qe=Xe,$e=Xe,Je=Xe,lt=Xe,_e=Xe,qe=Xe,Lt=0,Or=0,cr=0,Xt=Xe,Pr=Xe,Tr=0,ar=Xe,xn=0,go=0,mo=0,yo=0,Ca=0,kp=0,Qp=0,Sl=0,Fp=0,Tu=0,Nu=0,Rp=0,Tp=0,Np=0,Xr=0,xl=0,Lp=0,kc=0,Mp=Xe,Op=Xe,Lu=Xe,Mu=Xe,Qc=Xe,Ys=0,Za=0,Wo=0,kl=0,rf=0,nf=Xe,Ou=Xe,sf=Xe,of=Xe,Ws=Xe,Ps=Xe,Ql=0,Rn=Xe,af=Xe,Eo=Xe,Fc=Xe,Co=Xe,Rc=Xe,lf=0,cf=0,Tc=Xe,Ks=Xe,Fl=0,uf=0,Af=0,ff=0,xr=Xe,zn=0,bs=0,wo=0,Vs=0,Fr=0,ur=0,Rl=0,zt=Xe,pf=0,li=0;Rl=C,C=C+16|0,Ys=Rl+12|0,Za=Rl+8|0,Wo=Rl+4|0,kl=Rl,Un(s,(d|0)==0|(Ht(l)|0)^1,3326),Un(s,(m|0)==0|(Ht(c)|0)^1,3406),bs=mt(s,f)|0,n[s+496>>2]=bs,Fr=fr(2,bs)|0,ur=fr(0,bs)|0,h[s+440>>2]=y(K(s,Fr,B)),h[s+444>>2]=y(re(s,Fr,B)),h[s+428>>2]=y(K(s,ur,B)),h[s+436>>2]=y(re(s,ur,B)),h[s+464>>2]=y(Cr(s,Fr)),h[s+468>>2]=y(yn(s,Fr)),h[s+452>>2]=y(Cr(s,ur)),h[s+460>>2]=y(yn(s,ur)),h[s+488>>2]=y(oi(s,Fr,B)),h[s+492>>2]=y(Li(s,Fr,B)),h[s+476>>2]=y(oi(s,ur,B)),h[s+484>>2]=y(Li(s,ur,B));do if(n[s+964>>2]|0)y0(s,l,c,d,m,B,k);else{if(wo=s+948|0,Vs=(n[s+952>>2]|0)-(n[wo>>2]|0)>>2,!Vs){bv(s,l,c,d,m,B,k);break}if(!Q&&Sv(s,l,c,d,m,B,k)|0)break;ee(s),xl=s+508|0,o[xl>>0]=0,Fr=fr(n[s+4>>2]|0,bs)|0,ur=iw(Fr,bs)|0,zn=he(Fr)|0,Lp=n[s+8>>2]|0,uf=s+28|0,kc=(n[uf>>2]|0)!=0,Co=zn?B:k,Tc=zn?k:B,Mp=y(yp(s,Fr,B)),Op=y(sw(s,Fr,B)),Oe=y(yp(s,ur,B)),Rc=y(En(s,Fr,B)),Ks=y(En(s,ur,B)),cr=zn?d:m,Fl=zn?m:d,xr=zn?Rc:Ks,lt=zn?Ks:Rc,Fc=y(cn(s,2,B)),Je=y(cn(s,0,B)),Qe=y(y(Yr(s+364|0,B))-xr),$e=y(y(Yr(s+380|0,B))-xr),_e=y(y(Yr(s+372|0,k))-lt),qe=y(y(Yr(s+388|0,k))-lt),Lu=zn?Qe:_e,Mu=zn?$e:qe,Fc=y(l-Fc),l=y(Fc-xr),Ht(l)|0?xr=l:xr=y(_n(y(k0(l,$e)),Qe)),af=y(c-Je),l=y(af-lt),Ht(l)|0?Eo=l:Eo=y(_n(y(k0(l,qe)),_e)),Qe=zn?xr:Eo,Rn=zn?Eo:xr;e:do if((cr|0)==1)for(f=0,j=0;;){if(M=ms(s,j)|0,!f)y(is(M))>y(0)&&y(Gs(M))>y(0)?f=M:f=0;else if(wd(M)|0){je=0;break e}if(j=j+1|0,j>>>0>=Vs>>>0){je=f;break}}else je=0;while(!1);Lt=je+500|0,Or=je+504|0,f=0,M=0,l=y(0),se=0;do{if(j=n[(n[wo>>2]|0)+(se<<2)>>2]|0,(n[j+36>>2]|0)==1)Du(j),o[j+985>>0]=1,o[j+984>>0]=0;else{Bl(j),Q&&mp(j,mt(j,bs)|0,Qe,Rn,xr);do if((n[j+24>>2]|0)!=1)if((j|0)==(je|0)){n[Lt>>2]=n[2278],h[Or>>2]=y(0);break}else{Id(s,j,xr,d,Eo,xr,Eo,m,bs,O);break}else M|0&&(n[M+960>>2]=j),n[j+960>>2]=0,M=j,f=f|0?f:j;while(!1);Ps=y(h[j+504>>2]),l=y(l+y(Ps+y(cn(j,Fr,xr))))}se=se+1|0}while((se|0)!=(Vs|0));for(mo=l>Qe,Ql=kc&((cr|0)==2&mo)?1:cr,xn=(Fl|0)==1,Ca=xn&(Q^1),kp=(Ql|0)==1,Qp=(Ql|0)==2,Sl=976+(Fr<<2)|0,Fp=(Fl|2|0)==2,Np=xn&(kc^1),Tu=1040+(ur<<2)|0,Nu=1040+(Fr<<2)|0,Rp=976+(ur<<2)|0,Tp=(Fl|0)!=1,mo=kc&((cr|0)!=0&mo),go=s+976|0,xn=xn^1,l=Qe,Tr=0,yo=0,Ps=y(0),Qc=y(0);;){e:do if(Tr>>>0<Vs>>>0)for(Or=n[wo>>2]|0,se=0,qe=y(0),_e=y(0),$e=y(0),Qe=y(0),j=0,M=0,je=Tr;;){if(Lt=n[Or+(je<<2)>>2]|0,(n[Lt+36>>2]|0)!=1&&(n[Lt+940>>2]=yo,(n[Lt+24>>2]|0)!=1)){if(Je=y(cn(Lt,Fr,xr)),Xr=n[Sl>>2]|0,c=y(Yr(Lt+380+(Xr<<3)|0,Co)),lt=y(h[Lt+504>>2]),c=y(k0(c,lt)),c=y(_n(y(Yr(Lt+364+(Xr<<3)|0,Co)),c)),kc&(se|0)!=0&y(Je+y(_e+c))>l){m=se,Je=qe,cr=je;break e}Je=y(Je+c),c=y(_e+Je),Je=y(qe+Je),wd(Lt)|0&&($e=y($e+y(is(Lt))),Qe=y(Qe-y(lt*y(Gs(Lt))))),M|0&&(n[M+960>>2]=Lt),n[Lt+960>>2]=0,se=se+1|0,M=Lt,j=j|0?j:Lt}else Je=qe,c=_e;if(je=je+1|0,je>>>0<Vs>>>0)qe=Je,_e=c;else{m=se,cr=je;break}}else m=0,Je=y(0),$e=y(0),Qe=y(0),j=0,cr=Tr;while(!1);Xr=$e>y(0)&$e<y(1),Xt=Xr?y(1):$e,Xr=Qe>y(0)&Qe<y(1),qe=Xr?y(1):Qe;do if(kp)Xr=51;else if(Je<Lu&((Ht(Lu)|0)^1))l=Lu,Xr=51;else if(Je>Mu&((Ht(Mu)|0)^1))l=Mu,Xr=51;else if(o[(n[go>>2]|0)+3>>0]|0)Xr=51;else{if(Xt!=y(0)&&y(is(s))!=y(0)){Xr=53;break}l=Je,Xr=53}while(!1);if((Xr|0)==51&&(Xr=0,Ht(l)|0?Xr=53:(Pr=y(l-Je),ar=l)),(Xr|0)==53&&(Xr=0,Je<y(0)?(Pr=y(-Je),ar=l):(Pr=y(0),ar=l)),!Ca&&(rf=(j|0)==0,!rf)){se=n[Sl>>2]|0,je=Pr<y(0),lt=y(Pr/qe),Lt=Pr>y(0),_e=y(Pr/Xt),$e=y(0),Je=y(0),l=y(0),M=j;do c=y(Yr(M+380+(se<<3)|0,Co)),Qe=y(Yr(M+364+(se<<3)|0,Co)),Qe=y(k0(c,y(_n(Qe,y(h[M+504>>2]))))),je?(c=y(Qe*y(Gs(M))),c!=y(-0)&&(zt=y(Qe-y(lt*c)),nf=y(Ii(M,Fr,zt,ar,xr)),zt!=nf)&&($e=y($e-y(nf-Qe)),l=y(l+c))):Lt&&(Ou=y(is(M)),Ou!=y(0))&&(zt=y(Qe+y(_e*Ou)),sf=y(Ii(M,Fr,zt,ar,xr)),zt!=sf)&&($e=y($e-y(sf-Qe)),Je=y(Je-Ou)),M=n[M+960>>2]|0;while(M|0);if(l=y(qe+l),Qe=y(Pr+$e),rf)l=y(0);else{lt=y(Xt+Je),je=n[Sl>>2]|0,Lt=Qe<y(0),Or=l==y(0),_e=y(Qe/l),se=Qe>y(0),lt=y(Qe/lt),l=y(0);do{zt=y(Yr(j+380+(je<<3)|0,Co)),$e=y(Yr(j+364+(je<<3)|0,Co)),$e=y(k0(zt,y(_n($e,y(h[j+504>>2]))))),Lt?(zt=y($e*y(Gs(j))),Qe=y(-zt),zt!=y(-0)?(zt=y(_e*Qe),Qe=y(Ii(j,Fr,y($e+(Or?Qe:zt)),ar,xr))):Qe=$e):se&&(of=y(is(j)),of!=y(0))?Qe=y(Ii(j,Fr,y($e+y(lt*of)),ar,xr)):Qe=$e,l=y(l-y(Qe-$e)),Je=y(cn(j,Fr,xr)),c=y(cn(j,ur,xr)),Qe=y(Qe+Je),h[Za>>2]=Qe,n[kl>>2]=1,$e=y(h[j+396>>2]);e:do if(Ht($e)|0){M=Ht(Rn)|0;do if(!M){if(mo|(ns(j,ur,Rn)|0|xn)||(da(s,j)|0)!=4||(n[(vl(j,ur)|0)+4>>2]|0)==3||(n[(bc(j,ur)|0)+4>>2]|0)==3)break;h[Ys>>2]=Rn,n[Wo>>2]=1;break e}while(!1);if(ns(j,ur,Rn)|0){M=n[j+992+(n[Rp>>2]<<2)>>2]|0,zt=y(c+y(Yr(M,Rn))),h[Ys>>2]=zt,M=Tp&(n[M+4>>2]|0)==2,n[Wo>>2]=((Ht(zt)|0|M)^1)&1;break}else{h[Ys>>2]=Rn,n[Wo>>2]=M?0:2;break}}else zt=y(Qe-Je),Xt=y(zt/$e),zt=y($e*zt),n[Wo>>2]=1,h[Ys>>2]=y(c+(zn?Xt:zt));while(!1);yr(j,Fr,ar,xr,kl,Za),yr(j,ur,Rn,xr,Wo,Ys);do if(!(ns(j,ur,Rn)|0)&&(da(s,j)|0)==4){if((n[(vl(j,ur)|0)+4>>2]|0)==3){M=0;break}M=(n[(bc(j,ur)|0)+4>>2]|0)!=3}else M=0;while(!1);zt=y(h[Za>>2]),Xt=y(h[Ys>>2]),pf=n[kl>>2]|0,li=n[Wo>>2]|0,ha(j,zn?zt:Xt,zn?Xt:zt,bs,zn?pf:li,zn?li:pf,xr,Eo,Q&(M^1),3488,O)|0,o[xl>>0]=o[xl>>0]|o[j+508>>0],j=n[j+960>>2]|0}while(j|0)}}else l=y(0);if(l=y(Pr+l),li=l<y(0)&1,o[xl>>0]=li|u[xl>>0],Qp&l>y(0)?(M=n[Sl>>2]|0,n[s+364+(M<<3)+4>>2]|0&&(Ws=y(Yr(s+364+(M<<3)|0,Co)),Ws>=y(0))?Qe=y(_n(y(0),y(Ws-y(ar-l)))):Qe=y(0)):Qe=l,Lt=Tr>>>0<cr>>>0,Lt){je=n[wo>>2]|0,se=Tr,M=0;do j=n[je+(se<<2)>>2]|0,n[j+24>>2]|0||(M=((n[(vl(j,Fr)|0)+4>>2]|0)==3&1)+M|0,M=M+((n[(bc(j,Fr)|0)+4>>2]|0)==3&1)|0),se=se+1|0;while((se|0)!=(cr|0));M?(Je=y(0),c=y(0)):Xr=101}else Xr=101;e:do if((Xr|0)==101)switch(Xr=0,Lp|0){case 1:{M=0,Je=y(Qe*y(.5)),c=y(0);break e}case 2:{M=0,Je=Qe,c=y(0);break e}case 3:{if(m>>>0<=1){M=0,Je=y(0),c=y(0);break e}c=y((m+-1|0)>>>0),M=0,Je=y(0),c=y(y(_n(Qe,y(0)))/c);break e}case 5:{c=y(Qe/y((m+1|0)>>>0)),M=0,Je=c;break e}case 4:{c=y(Qe/y(m>>>0)),M=0,Je=y(c*y(.5));break e}default:{M=0,Je=y(0),c=y(0);break e}}while(!1);if(l=y(Mp+Je),Lt){$e=y(Qe/y(M|0)),se=n[wo>>2]|0,j=Tr,Qe=y(0);do{M=n[se+(j<<2)>>2]|0;e:do if((n[M+36>>2]|0)!=1){switch(n[M+24>>2]|0){case 1:{if(gi(M,Fr)|0){if(!Q)break e;zt=y(Mr(M,Fr,ar)),zt=y(zt+y(Cr(s,Fr))),zt=y(zt+y(K(M,Fr,xr))),h[M+400+(n[Nu>>2]<<2)>>2]=zt;break e}break}case 0:if(li=(n[(vl(M,Fr)|0)+4>>2]|0)==3,zt=y($e+l),l=li?zt:l,Q&&(li=M+400+(n[Nu>>2]<<2)|0,h[li>>2]=y(l+y(h[li>>2]))),li=(n[(bc(M,Fr)|0)+4>>2]|0)==3,zt=y($e+l),l=li?zt:l,Ca){zt=y(c+y(cn(M,Fr,xr))),Qe=Rn,l=y(l+y(zt+y(h[M+504>>2])));break e}else{l=y(l+y(c+y(ss(M,Fr,xr)))),Qe=y(_n(Qe,y(ss(M,ur,xr))));break e}default:}Q&&(zt=y(Je+y(Cr(s,Fr))),li=M+400+(n[Nu>>2]<<2)|0,h[li>>2]=y(zt+y(h[li>>2])))}while(!1);j=j+1|0}while((j|0)!=(cr|0))}else Qe=y(0);if(c=y(Op+l),Fp?Je=y(y(Ii(s,ur,y(Ks+Qe),Tc,B))-Ks):Je=Rn,$e=y(y(Ii(s,ur,y(Ks+(Np?Rn:Qe)),Tc,B))-Ks),Lt&Q){j=Tr;do{se=n[(n[wo>>2]|0)+(j<<2)>>2]|0;do if((n[se+36>>2]|0)!=1){if((n[se+24>>2]|0)==1){if(gi(se,ur)|0){if(zt=y(Mr(se,ur,Rn)),zt=y(zt+y(Cr(s,ur))),zt=y(zt+y(K(se,ur,xr))),M=n[Tu>>2]|0,h[se+400+(M<<2)>>2]=zt,!(Ht(zt)|0))break}else M=n[Tu>>2]|0;zt=y(Cr(s,ur)),h[se+400+(M<<2)>>2]=y(zt+y(K(se,ur,xr)));break}M=da(s,se)|0;do if((M|0)==4){if((n[(vl(se,ur)|0)+4>>2]|0)==3){Xr=139;break}if((n[(bc(se,ur)|0)+4>>2]|0)==3){Xr=139;break}if(ns(se,ur,Rn)|0){l=Oe;break}pf=n[se+908+(n[Sl>>2]<<2)>>2]|0,n[Ys>>2]=pf,l=y(h[se+396>>2]),li=Ht(l)|0,Qe=(n[v>>2]=pf,y(h[v>>2])),li?l=$e:(Pr=y(cn(se,ur,xr)),zt=y(Qe/l),l=y(l*Qe),l=y(Pr+(zn?zt:l))),h[Za>>2]=l,h[Ys>>2]=y(y(cn(se,Fr,xr))+Qe),n[Wo>>2]=1,n[kl>>2]=1,yr(se,Fr,ar,xr,Wo,Ys),yr(se,ur,Rn,xr,kl,Za),l=y(h[Ys>>2]),Pr=y(h[Za>>2]),zt=zn?l:Pr,l=zn?Pr:l,li=((Ht(zt)|0)^1)&1,ha(se,zt,l,bs,li,((Ht(l)|0)^1)&1,xr,Eo,1,3493,O)|0,l=Oe}else Xr=139;while(!1);e:do if((Xr|0)==139){Xr=0,l=y(Je-y(ss(se,ur,xr)));do if((n[(vl(se,ur)|0)+4>>2]|0)==3){if((n[(bc(se,ur)|0)+4>>2]|0)!=3)break;l=y(Oe+y(_n(y(0),y(l*y(.5)))));break e}while(!1);if((n[(bc(se,ur)|0)+4>>2]|0)==3){l=Oe;break}if((n[(vl(se,ur)|0)+4>>2]|0)==3){l=y(Oe+y(_n(y(0),l)));break}switch(M|0){case 1:{l=Oe;break e}case 2:{l=y(Oe+y(l*y(.5)));break e}default:{l=y(Oe+l);break e}}}while(!1);zt=y(Ps+l),li=se+400+(n[Tu>>2]<<2)|0,h[li>>2]=y(zt+y(h[li>>2]))}while(!1);j=j+1|0}while((j|0)!=(cr|0))}if(Ps=y(Ps+$e),Qc=y(_n(Qc,c)),m=yo+1|0,cr>>>0>=Vs>>>0)break;l=ar,Tr=cr,yo=m}do if(Q){if(M=m>>>0>1,!M&&!(Yi(s)|0))break;if(!(Ht(Rn)|0)){l=y(Rn-Ps);e:do switch(n[s+12>>2]|0){case 3:{Oe=y(Oe+l),_e=y(0);break}case 2:{Oe=y(Oe+y(l*y(.5))),_e=y(0);break}case 4:{Rn>Ps?_e=y(l/y(m>>>0)):_e=y(0);break}case 7:if(Rn>Ps){Oe=y(Oe+y(l/y(m<<1>>>0))),_e=y(l/y(m>>>0)),_e=M?_e:y(0);break e}else{Oe=y(Oe+y(l*y(.5))),_e=y(0);break e}case 6:{_e=y(l/y(yo>>>0)),_e=Rn>Ps&M?_e:y(0);break}default:_e=y(0)}while(!1);if(m|0)for(Lt=1040+(ur<<2)|0,Or=976+(ur<<2)|0,je=0,j=0;;){e:do if(j>>>0<Vs>>>0)for(Qe=y(0),$e=y(0),l=y(0),se=j;;){M=n[(n[wo>>2]|0)+(se<<2)>>2]|0;do if((n[M+36>>2]|0)!=1&&!(n[M+24>>2]|0)){if((n[M+940>>2]|0)!=(je|0))break e;if(Bd(M,ur)|0&&(zt=y(h[M+908+(n[Or>>2]<<2)>>2]),l=y(_n(l,y(zt+y(cn(M,ur,xr)))))),(da(s,M)|0)!=5)break;Ws=y(Ka(M)),Ws=y(Ws+y(K(M,0,xr))),zt=y(h[M+912>>2]),zt=y(y(zt+y(cn(M,0,xr)))-Ws),Ws=y(_n($e,Ws)),zt=y(_n(Qe,zt)),Qe=zt,$e=Ws,l=y(_n(l,y(Ws+zt)))}while(!1);if(M=se+1|0,M>>>0<Vs>>>0)se=M;else{se=M;break}}else $e=y(0),l=y(0),se=j;while(!1);if(lt=y(_e+l),c=Oe,Oe=y(Oe+lt),j>>>0<se>>>0){Je=y(c+$e),M=j;do{j=n[(n[wo>>2]|0)+(M<<2)>>2]|0;e:do if((n[j+36>>2]|0)!=1&&!(n[j+24>>2]|0))switch(da(s,j)|0){case 1:{zt=y(c+y(K(j,ur,xr))),h[j+400+(n[Lt>>2]<<2)>>2]=zt;break e}case 3:{zt=y(y(Oe-y(re(j,ur,xr)))-y(h[j+908+(n[Or>>2]<<2)>>2])),h[j+400+(n[Lt>>2]<<2)>>2]=zt;break e}case 2:{zt=y(c+y(y(lt-y(h[j+908+(n[Or>>2]<<2)>>2]))*y(.5))),h[j+400+(n[Lt>>2]<<2)>>2]=zt;break e}case 4:{if(zt=y(c+y(K(j,ur,xr))),h[j+400+(n[Lt>>2]<<2)>>2]=zt,ns(j,ur,Rn)|0||(zn?(Qe=y(h[j+908>>2]),l=y(Qe+y(cn(j,Fr,xr))),$e=lt):($e=y(h[j+912>>2]),$e=y($e+y(cn(j,ur,xr))),l=lt,Qe=y(h[j+908>>2])),wi(l,Qe)|0&&wi($e,y(h[j+912>>2]))|0))break e;ha(j,l,$e,bs,1,1,xr,Eo,1,3501,O)|0;break e}case 5:{h[j+404>>2]=y(y(Je-y(Ka(j)))+y(Mr(j,0,Rn)));break e}default:break e}while(!1);M=M+1|0}while((M|0)!=(se|0))}if(je=je+1|0,(je|0)==(m|0))break;j=se}}}while(!1);if(h[s+908>>2]=y(Ii(s,2,Fc,B,B)),h[s+912>>2]=y(Ii(s,0,af,k,B)),Ql|0&&(lf=n[s+32>>2]|0,cf=(Ql|0)==2,!(cf&(lf|0)!=2))?cf&(lf|0)==2&&(l=y(Rc+ar),l=y(_n(y(k0(l,y(MA(s,Fr,Qc,Co)))),Rc)),Xr=198):(l=y(Ii(s,Fr,Qc,Co,B)),Xr=198),(Xr|0)==198&&(h[s+908+(n[976+(Fr<<2)>>2]<<2)>>2]=l),Fl|0&&(Af=n[s+32>>2]|0,ff=(Fl|0)==2,!(ff&(Af|0)!=2))?ff&(Af|0)==2&&(l=y(Ks+Rn),l=y(_n(y(k0(l,y(MA(s,ur,y(Ks+Ps),Tc)))),Ks)),Xr=204):(l=y(Ii(s,ur,y(Ks+Ps),Tc,B)),Xr=204),(Xr|0)==204&&(h[s+908+(n[976+(ur<<2)>>2]<<2)>>2]=l),Q){if((n[uf>>2]|0)==2){j=976+(ur<<2)|0,se=1040+(ur<<2)|0,M=0;do je=ms(s,M)|0,n[je+24>>2]|0||(pf=n[j>>2]|0,zt=y(h[s+908+(pf<<2)>>2]),li=je+400+(n[se>>2]<<2)|0,zt=y(zt-y(h[li>>2])),h[li>>2]=y(zt-y(h[je+908+(pf<<2)>>2]))),M=M+1|0;while((M|0)!=(Vs|0))}if(f|0){M=zn?Ql:d;do vd(s,f,xr,M,Eo,bs,O),f=n[f+960>>2]|0;while(f|0)}if(M=(Fr|2|0)==3,j=(ur|2|0)==3,M|j){f=0;do se=n[(n[wo>>2]|0)+(f<<2)>>2]|0,(n[se+36>>2]|0)!=1&&(M&&Ep(s,se,Fr),j&&Ep(s,se,ur)),f=f+1|0;while((f|0)!=(Vs|0))}}}while(!1);C=Rl}function ga(s,l){s=s|0,l=y(l);var c=0;la(s,l>=y(0),3147),c=l==y(0),h[s+4>>2]=c?y(0):l}function Dc(s,l,c,f){s=s|0,l=y(l),c=y(c),f=f|0;var d=Xe,m=Xe,B=0,k=0,Q=0;n[2278]=(n[2278]|0)+1,Bl(s),ns(s,2,l)|0?(d=y(Yr(n[s+992>>2]|0,l)),Q=1,d=y(d+y(cn(s,2,l)))):(d=y(Yr(s+380|0,l)),d>=y(0)?Q=2:(Q=((Ht(l)|0)^1)&1,d=l)),ns(s,0,c)|0?(m=y(Yr(n[s+996>>2]|0,c)),k=1,m=y(m+y(cn(s,0,l)))):(m=y(Yr(s+388|0,c)),m>=y(0)?k=2:(k=((Ht(c)|0)^1)&1,m=c)),B=s+976|0,ha(s,d,m,f,Q,k,l,c,1,3189,n[B>>2]|0)|0&&(mp(s,n[s+496>>2]|0,l,c,l),Pc(s,y(h[(n[B>>2]|0)+4>>2]),y(0),y(0)),o[11696]|0)&&yd(s,7)}function Bl(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;k=C,C=C+32|0,B=k+24|0,m=k+16|0,f=k+8|0,d=k,c=0;do l=s+380+(c<<3)|0,n[s+380+(c<<3)+4>>2]|0&&(Q=l,O=n[Q+4>>2]|0,M=f,n[M>>2]=n[Q>>2],n[M+4>>2]=O,M=s+364+(c<<3)|0,O=n[M+4>>2]|0,Q=d,n[Q>>2]=n[M>>2],n[Q+4>>2]=O,n[m>>2]=n[f>>2],n[m+4>>2]=n[f+4>>2],n[B>>2]=n[d>>2],n[B+4>>2]=n[d+4>>2],Bs(m,B)|0)||(l=s+348+(c<<3)|0),n[s+992+(c<<2)>>2]=l,c=c+1|0;while((c|0)!=2);C=k}function ns(s,l,c){s=s|0,l=l|0,c=y(c);var f=0;switch(s=n[s+992+(n[976+(l<<2)>>2]<<2)>>2]|0,n[s+4>>2]|0){case 0:case 3:{s=0;break}case 1:{y(h[s>>2])<y(0)?s=0:f=5;break}case 2:{y(h[s>>2])<y(0)?s=0:s=(Ht(c)|0)^1;break}default:f=5}return(f|0)==5&&(s=1),s|0}function Yr(s,l){switch(s=s|0,l=y(l),n[s+4>>2]|0){case 2:{l=y(y(y(h[s>>2])*l)/y(100));break}case 1:{l=y(h[s>>2]);break}default:l=y(ce)}return y(l)}function mp(s,l,c,f,d){s=s|0,l=l|0,c=y(c),f=y(f),d=y(d);var m=0,B=Xe;l=n[s+944>>2]|0?l:1,m=fr(n[s+4>>2]|0,l)|0,l=iw(m,l)|0,c=y(Dd(s,m,c)),f=y(Dd(s,l,f)),B=y(c+y(K(s,m,d))),h[s+400+(n[1040+(m<<2)>>2]<<2)>>2]=B,c=y(c+y(re(s,m,d))),h[s+400+(n[1e3+(m<<2)>>2]<<2)>>2]=c,c=y(f+y(K(s,l,d))),h[s+400+(n[1040+(l<<2)>>2]<<2)>>2]=c,d=y(f+y(re(s,l,d))),h[s+400+(n[1e3+(l<<2)>>2]<<2)>>2]=d}function Pc(s,l,c,f){s=s|0,l=y(l),c=y(c),f=y(f);var d=0,m=0,B=Xe,k=Xe,Q=0,O=0,M=Xe,j=0,se=Xe,je=Xe,Oe=Xe,Qe=Xe;if(l!=y(0)&&(d=s+400|0,Qe=y(h[d>>2]),m=s+404|0,Oe=y(h[m>>2]),j=s+416|0,je=y(h[j>>2]),O=s+420|0,B=y(h[O>>2]),se=y(Qe+c),M=y(Oe+f),f=y(se+je),k=y(M+B),Q=(n[s+988>>2]|0)==1,h[d>>2]=y(Go(Qe,l,0,Q)),h[m>>2]=y(Go(Oe,l,0,Q)),c=y(mR(y(je*l),y(1))),wi(c,y(0))|0?m=0:m=(wi(c,y(1))|0)^1,c=y(mR(y(B*l),y(1))),wi(c,y(0))|0?d=0:d=(wi(c,y(1))|0)^1,Qe=y(Go(f,l,Q&m,Q&(m^1))),h[j>>2]=y(Qe-y(Go(se,l,0,Q))),Qe=y(Go(k,l,Q&d,Q&(d^1))),h[O>>2]=y(Qe-y(Go(M,l,0,Q))),m=(n[s+952>>2]|0)-(n[s+948>>2]|0)>>2,m|0)){d=0;do Pc(ms(s,d)|0,l,se,M),d=d+1|0;while((d|0)!=(m|0))}}function nw(s,l,c,f,d){switch(s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,c|0){case 5:case 0:{s=e7(n[489]|0,f,d)|0;break}default:s=$Ue(f,d)|0}return s|0}function g0(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;d=C,C=C+16|0,m=d,n[m>>2]=f,d0(s,0,l,c,m),C=d}function d0(s,l,c,f,d){if(s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,s=s|0?s:956,w7[n[s+8>>2]&1](s,l,c,f,d)|0,(c|0)==5)Tt();else return}function Wa(s,l,c){s=s|0,l=l|0,c=c|0,o[s+l>>0]=c&1}function Cd(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(m0(s,f),Qt(s,n[l>>2]|0,n[c>>2]|0,f))}function m0(s,l){s=s|0,l=l|0;var c=0;if((N(s)|0)>>>0<l>>>0&&Jr(s),l>>>0>1073741823)Tt();else{c=Kt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function Qt(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(Dr(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function N(s){return s=s|0,1073741823}function K(s,l,c){return s=s|0,l=l|0,c=y(c),he(l)|0&&n[s+96>>2]|0?s=s+92|0:s=Fn(s+60|0,n[1040+(l<<2)>>2]|0,992)|0,y(ze(s,c))}function re(s,l,c){return s=s|0,l=l|0,c=y(c),he(l)|0&&n[s+104>>2]|0?s=s+100|0:s=Fn(s+60|0,n[1e3+(l<<2)>>2]|0,992)|0,y(ze(s,c))}function he(s){return s=s|0,(s|1|0)==3|0}function ze(s,l){return s=s|0,l=y(l),(n[s+4>>2]|0)==3?l=y(0):l=y(Yr(s,l)),y(l)}function mt(s,l){return s=s|0,l=l|0,s=n[s>>2]|0,(s|0?s:(l|0)>1?l:1)|0}function fr(s,l){s=s|0,l=l|0;var c=0;e:do if((l|0)==2){switch(s|0){case 2:{s=3;break e}case 3:break;default:{c=4;break e}}s=2}else c=4;while(!1);return s|0}function Cr(s,l){s=s|0,l=l|0;var c=Xe;return he(l)|0&&n[s+312>>2]|0&&(c=y(h[s+308>>2]),c>=y(0))||(c=y(_n(y(h[(Fn(s+276|0,n[1040+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(c)}function yn(s,l){s=s|0,l=l|0;var c=Xe;return he(l)|0&&n[s+320>>2]|0&&(c=y(h[s+316>>2]),c>=y(0))||(c=y(_n(y(h[(Fn(s+276|0,n[1e3+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(c)}function oi(s,l,c){s=s|0,l=l|0,c=y(c);var f=Xe;return he(l)|0&&n[s+240>>2]|0&&(f=y(Yr(s+236|0,c)),f>=y(0))||(f=y(_n(y(Yr(Fn(s+204|0,n[1040+(l<<2)>>2]|0,992)|0,c)),y(0)))),y(f)}function Li(s,l,c){s=s|0,l=l|0,c=y(c);var f=Xe;return he(l)|0&&n[s+248>>2]|0&&(f=y(Yr(s+244|0,c)),f>=y(0))||(f=y(_n(y(Yr(Fn(s+204|0,n[1e3+(l<<2)>>2]|0,992)|0,c)),y(0)))),y(f)}function y0(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=Xe,Q=Xe,O=Xe,M=Xe,j=Xe,se=Xe,je=0,Oe=0,Qe=0;Qe=C,C=C+16|0,je=Qe,Oe=s+964|0,Un(s,(n[Oe>>2]|0)!=0,3519),k=y(En(s,2,l)),Q=y(En(s,0,l)),O=y(cn(s,2,l)),M=y(cn(s,0,l)),Ht(l)|0?j=l:j=y(_n(y(0),y(y(l-O)-k))),Ht(c)|0?se=c:se=y(_n(y(0),y(y(c-M)-Q))),(f|0)==1&(d|0)==1?(h[s+908>>2]=y(Ii(s,2,y(l-O),m,m)),l=y(Ii(s,0,y(c-M),B,m))):(I7[n[Oe>>2]&1](je,s,j,f,se,d),j=y(k+y(h[je>>2])),se=y(l-O),h[s+908>>2]=y(Ii(s,2,(f|2|0)==2?j:se,m,m)),se=y(Q+y(h[je+4>>2])),l=y(c-M),l=y(Ii(s,0,(d|2|0)==2?se:l,B,m))),h[s+912>>2]=l,C=Qe}function bv(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=Xe,Q=Xe,O=Xe,M=Xe;O=y(En(s,2,m)),k=y(En(s,0,m)),M=y(cn(s,2,m)),Q=y(cn(s,0,m)),l=y(l-M),h[s+908>>2]=y(Ii(s,2,(f|2|0)==2?O:l,m,m)),c=y(c-Q),h[s+912>>2]=y(Ii(s,0,(d|2|0)==2?k:c,B,m))}function Sv(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=0,Q=Xe,O=Xe;return k=(f|0)==2,!(l<=y(0)&k)&&!(c<=y(0)&(d|0)==2)&&!((f|0)==1&(d|0)==1)?s=0:(Q=y(cn(s,0,m)),O=y(cn(s,2,m)),k=l<y(0)&k|(Ht(l)|0),l=y(l-O),h[s+908>>2]=y(Ii(s,2,k?y(0):l,m,m)),l=y(c-Q),k=c<y(0)&(d|0)==2|(Ht(c)|0),h[s+912>>2]=y(Ii(s,0,k?y(0):l,B,m)),s=1),s|0}function iw(s,l){return s=s|0,l=l|0,OA(s)|0?s=fr(2,l)|0:s=0,s|0}function yp(s,l,c){return s=s|0,l=l|0,c=y(c),c=y(oi(s,l,c)),y(c+y(Cr(s,l)))}function sw(s,l,c){return s=s|0,l=l|0,c=y(c),c=y(Li(s,l,c)),y(c+y(yn(s,l)))}function En(s,l,c){s=s|0,l=l|0,c=y(c);var f=Xe;return f=y(yp(s,l,c)),y(f+y(sw(s,l,c)))}function wd(s){return s=s|0,n[s+24>>2]|0?s=0:y(is(s))!=y(0)?s=1:s=y(Gs(s))!=y(0),s|0}function is(s){s=s|0;var l=Xe;if(n[s+944>>2]|0){if(l=y(h[s+44>>2]),Ht(l)|0)return l=y(h[s+40>>2]),s=l>y(0)&((Ht(l)|0)^1),y(s?l:y(0))}else l=y(0);return y(l)}function Gs(s){s=s|0;var l=Xe,c=0,f=Xe;do if(n[s+944>>2]|0){if(l=y(h[s+48>>2]),Ht(l)|0){if(c=o[(n[s+976>>2]|0)+2>>0]|0,!(c<<24>>24)&&(f=y(h[s+40>>2]),f<y(0)&((Ht(f)|0)^1))){l=y(-f);break}l=c<<24>>24?y(1):y(0)}}else l=y(0);while(!1);return y(l)}function Du(s){s=s|0;var l=0,c=0;if(Od(s+400|0,0,540)|0,o[s+985>>0]=1,ee(s),c=Ci(s)|0,c|0){l=s+948|0,s=0;do Du(n[(n[l>>2]|0)+(s<<2)>>2]|0),s=s+1|0;while((s|0)!=(c|0))}}function Id(s,l,c,f,d,m,B,k,Q,O){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=y(m),B=y(B),k=k|0,Q=Q|0,O=O|0;var M=0,j=Xe,se=0,je=0,Oe=Xe,Qe=Xe,$e=0,Je=Xe,lt=0,_e=Xe,qe=0,Lt=0,Or=0,cr=0,Xt=0,Pr=0,Tr=0,ar=0,xn=0,go=0;xn=C,C=C+16|0,Or=xn+12|0,cr=xn+8|0,Xt=xn+4|0,Pr=xn,ar=fr(n[s+4>>2]|0,Q)|0,qe=he(ar)|0,j=y(Yr(ow(l)|0,qe?m:B)),Lt=ns(l,2,m)|0,Tr=ns(l,0,B)|0;do if(!(Ht(j)|0)&&!(Ht(qe?c:d)|0)){if(M=l+504|0,!(Ht(y(h[M>>2]))|0)&&(!(aw(n[l+976>>2]|0,0)|0)||(n[l+500>>2]|0)==(n[2278]|0)))break;h[M>>2]=y(_n(j,y(En(l,ar,m))))}else se=7;while(!1);do if((se|0)==7){if(lt=qe^1,!(lt|Lt^1)){B=y(Yr(n[l+992>>2]|0,m)),h[l+504>>2]=y(_n(B,y(En(l,2,m))));break}if(!(qe|Tr^1)){B=y(Yr(n[l+996>>2]|0,B)),h[l+504>>2]=y(_n(B,y(En(l,0,m))));break}h[Or>>2]=y(ce),h[cr>>2]=y(ce),n[Xt>>2]=0,n[Pr>>2]=0,Je=y(cn(l,2,m)),_e=y(cn(l,0,m)),Lt?(Oe=y(Je+y(Yr(n[l+992>>2]|0,m))),h[Or>>2]=Oe,n[Xt>>2]=1,je=1):(je=0,Oe=y(ce)),Tr?(j=y(_e+y(Yr(n[l+996>>2]|0,B))),h[cr>>2]=j,n[Pr>>2]=1,M=1):(M=0,j=y(ce)),se=n[s+32>>2]|0,qe&(se|0)==2?se=2:Ht(Oe)|0&&!(Ht(c)|0)&&(h[Or>>2]=c,n[Xt>>2]=2,je=2,Oe=c),!((se|0)==2&lt)&&Ht(j)|0&&!(Ht(d)|0)&&(h[cr>>2]=d,n[Pr>>2]=2,M=2,j=d),Qe=y(h[l+396>>2]),$e=Ht(Qe)|0;do if($e)se=je;else{if((je|0)==1&lt){h[cr>>2]=y(y(Oe-Je)/Qe),n[Pr>>2]=1,M=1,se=1;break}qe&(M|0)==1?(h[Or>>2]=y(Qe*y(j-_e)),n[Xt>>2]=1,M=1,se=1):se=je}while(!1);go=Ht(c)|0,je=(da(s,l)|0)!=4,!(qe|Lt|((f|0)!=1|go)|(je|(se|0)==1))&&(h[Or>>2]=c,n[Xt>>2]=1,!$e)&&(h[cr>>2]=y(y(c-Je)/Qe),n[Pr>>2]=1,M=1),!(Tr|lt|((k|0)!=1|(Ht(d)|0))|(je|(M|0)==1))&&(h[cr>>2]=d,n[Pr>>2]=1,!$e)&&(h[Or>>2]=y(Qe*y(d-_e)),n[Xt>>2]=1),yr(l,2,m,m,Xt,Or),yr(l,0,B,m,Pr,cr),c=y(h[Or>>2]),d=y(h[cr>>2]),ha(l,c,d,Q,n[Xt>>2]|0,n[Pr>>2]|0,m,B,0,3565,O)|0,B=y(h[l+908+(n[976+(ar<<2)>>2]<<2)>>2]),h[l+504>>2]=y(_n(B,y(En(l,ar,m))))}while(!1);n[l+500>>2]=n[2278],C=xn}function Ii(s,l,c,f,d){return s=s|0,l=l|0,c=y(c),f=y(f),d=y(d),f=y(MA(s,l,c,f)),y(_n(f,y(En(s,l,d))))}function da(s,l){return s=s|0,l=l|0,l=l+20|0,l=n[(n[l>>2]|0?l:s+16|0)>>2]|0,(l|0)==5&&OA(n[s+4>>2]|0)|0&&(l=1),l|0}function vl(s,l){return s=s|0,l=l|0,he(l)|0&&n[s+96>>2]|0?l=4:l=n[1040+(l<<2)>>2]|0,s+60+(l<<3)|0}function bc(s,l){return s=s|0,l=l|0,he(l)|0&&n[s+104>>2]|0?l=5:l=n[1e3+(l<<2)>>2]|0,s+60+(l<<3)|0}function yr(s,l,c,f,d,m){switch(s=s|0,l=l|0,c=y(c),f=y(f),d=d|0,m=m|0,c=y(Yr(s+380+(n[976+(l<<2)>>2]<<3)|0,c)),c=y(c+y(cn(s,l,f))),n[d>>2]|0){case 2:case 1:{d=Ht(c)|0,f=y(h[m>>2]),h[m>>2]=d|f<c?f:c;break}case 0:{Ht(c)|0||(n[d>>2]=2,h[m>>2]=c);break}default:}}function gi(s,l){return s=s|0,l=l|0,s=s+132|0,he(l)|0&&n[(Fn(s,4,948)|0)+4>>2]|0?s=1:s=(n[(Fn(s,n[1040+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,s|0}function Mr(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0;return s=s+132|0,he(l)|0&&(f=Fn(s,4,948)|0,(n[f+4>>2]|0)!=0)?d=4:(f=Fn(s,n[1040+(l<<2)>>2]|0,948)|0,n[f+4>>2]|0?d=4:c=y(0)),(d|0)==4&&(c=y(Yr(f,c))),y(c)}function ss(s,l,c){s=s|0,l=l|0,c=y(c);var f=Xe;return f=y(h[s+908+(n[976+(l<<2)>>2]<<2)>>2]),f=y(f+y(K(s,l,c))),y(f+y(re(s,l,c)))}function Yi(s){s=s|0;var l=0,c=0,f=0;e:do if(OA(n[s+4>>2]|0)|0)l=0;else if((n[s+16>>2]|0)!=5)if(c=Ci(s)|0,!c)l=0;else for(l=0;;){if(f=ms(s,l)|0,!(n[f+24>>2]|0)&&(n[f+20>>2]|0)==5){l=1;break e}if(l=l+1|0,l>>>0>=c>>>0){l=0;break}}else l=1;while(!1);return l|0}function Bd(s,l){s=s|0,l=l|0;var c=Xe;return c=y(h[s+908+(n[976+(l<<2)>>2]<<2)>>2]),c>=y(0)&((Ht(c)|0)^1)|0}function Ka(s){s=s|0;var l=Xe,c=0,f=0,d=0,m=0,B=0,k=0,Q=Xe;if(c=n[s+968>>2]|0,c)Q=y(h[s+908>>2]),l=y(h[s+912>>2]),l=y(m7[c&0](s,Q,l)),Un(s,(Ht(l)|0)^1,3573);else{m=Ci(s)|0;do if(m|0){for(c=0,d=0;;){if(f=ms(s,d)|0,n[f+940>>2]|0){B=8;break}if((n[f+24>>2]|0)!=1)if(k=(da(s,f)|0)==5,k){c=f;break}else c=c|0?c:f;if(d=d+1|0,d>>>0>=m>>>0){B=8;break}}if((B|0)==8&&!c)break;return l=y(Ka(c)),y(l+y(h[c+404>>2]))}while(!1);l=y(h[s+912>>2])}return y(l)}function MA(s,l,c,f){s=s|0,l=l|0,c=y(c),f=y(f);var d=Xe,m=0;return OA(l)|0?(l=1,m=3):he(l)|0?(l=0,m=3):(f=y(ce),d=y(ce)),(m|0)==3&&(d=y(Yr(s+364+(l<<3)|0,f)),f=y(Yr(s+380+(l<<3)|0,f))),m=f<c&(f>=y(0)&((Ht(f)|0)^1)),c=m?f:c,m=d>=y(0)&((Ht(d)|0)^1)&c<d,y(m?d:c)}function vd(s,l,c,f,d,m,B){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=m|0,B=B|0;var k=Xe,Q=Xe,O=0,M=0,j=Xe,se=Xe,je=Xe,Oe=0,Qe=0,$e=0,Je=0,lt=Xe,_e=0;$e=fr(n[s+4>>2]|0,m)|0,Oe=iw($e,m)|0,Qe=he($e)|0,j=y(cn(l,2,c)),se=y(cn(l,0,c)),ns(l,2,c)|0?k=y(j+y(Yr(n[l+992>>2]|0,c))):gi(l,2)|0&&lr(l,2)|0?(k=y(h[s+908>>2]),Q=y(Cr(s,2)),Q=y(k-y(Q+y(yn(s,2)))),k=y(Mr(l,2,c)),k=y(Ii(l,2,y(Q-y(k+y(Pu(l,2,c)))),c,c))):k=y(ce),ns(l,0,d)|0?Q=y(se+y(Yr(n[l+996>>2]|0,d))):gi(l,0)|0&&lr(l,0)|0?(Q=y(h[s+912>>2]),lt=y(Cr(s,0)),lt=y(Q-y(lt+y(yn(s,0)))),Q=y(Mr(l,0,d)),Q=y(Ii(l,0,y(lt-y(Q+y(Pu(l,0,d)))),d,c))):Q=y(ce),O=Ht(k)|0,M=Ht(Q)|0;do if(O^M&&(je=y(h[l+396>>2]),!(Ht(je)|0)))if(O){k=y(j+y(y(Q-se)*je));break}else{lt=y(se+y(y(k-j)/je)),Q=M?lt:Q;break}while(!1);M=Ht(k)|0,O=Ht(Q)|0,M|O&&(_e=(M^1)&1,f=c>y(0)&((f|0)!=0&M),k=Qe?k:f?c:k,ha(l,k,Q,m,Qe?_e:f?2:_e,M&(O^1)&1,k,Q,0,3623,B)|0,k=y(h[l+908>>2]),k=y(k+y(cn(l,2,c))),Q=y(h[l+912>>2]),Q=y(Q+y(cn(l,0,c)))),ha(l,k,Q,m,1,1,k,Q,1,3635,B)|0,lr(l,$e)|0&&!(gi(l,$e)|0)?(_e=n[976+($e<<2)>>2]|0,lt=y(h[s+908+(_e<<2)>>2]),lt=y(lt-y(h[l+908+(_e<<2)>>2])),lt=y(lt-y(yn(s,$e))),lt=y(lt-y(re(l,$e,c))),lt=y(lt-y(Pu(l,$e,Qe?c:d))),h[l+400+(n[1040+($e<<2)>>2]<<2)>>2]=lt):Je=21;do if((Je|0)==21){if(!(gi(l,$e)|0)&&(n[s+8>>2]|0)==1){_e=n[976+($e<<2)>>2]|0,lt=y(h[s+908+(_e<<2)>>2]),lt=y(y(lt-y(h[l+908+(_e<<2)>>2]))*y(.5)),h[l+400+(n[1040+($e<<2)>>2]<<2)>>2]=lt;break}!(gi(l,$e)|0)&&(n[s+8>>2]|0)==2&&(_e=n[976+($e<<2)>>2]|0,lt=y(h[s+908+(_e<<2)>>2]),lt=y(lt-y(h[l+908+(_e<<2)>>2])),h[l+400+(n[1040+($e<<2)>>2]<<2)>>2]=lt)}while(!1);lr(l,Oe)|0&&!(gi(l,Oe)|0)?(_e=n[976+(Oe<<2)>>2]|0,lt=y(h[s+908+(_e<<2)>>2]),lt=y(lt-y(h[l+908+(_e<<2)>>2])),lt=y(lt-y(yn(s,Oe))),lt=y(lt-y(re(l,Oe,c))),lt=y(lt-y(Pu(l,Oe,Qe?d:c))),h[l+400+(n[1040+(Oe<<2)>>2]<<2)>>2]=lt):Je=30;do if((Je|0)==30&&!(gi(l,Oe)|0)){if((da(s,l)|0)==2){_e=n[976+(Oe<<2)>>2]|0,lt=y(h[s+908+(_e<<2)>>2]),lt=y(y(lt-y(h[l+908+(_e<<2)>>2]))*y(.5)),h[l+400+(n[1040+(Oe<<2)>>2]<<2)>>2]=lt;break}_e=(da(s,l)|0)==3,_e^(n[s+28>>2]|0)==2&&(_e=n[976+(Oe<<2)>>2]|0,lt=y(h[s+908+(_e<<2)>>2]),lt=y(lt-y(h[l+908+(_e<<2)>>2])),h[l+400+(n[1040+(Oe<<2)>>2]<<2)>>2]=lt)}while(!1)}function Ep(s,l,c){s=s|0,l=l|0,c=c|0;var f=Xe,d=0;d=n[976+(c<<2)>>2]|0,f=y(h[l+908+(d<<2)>>2]),f=y(y(h[s+908+(d<<2)>>2])-f),f=y(f-y(h[l+400+(n[1040+(c<<2)>>2]<<2)>>2])),h[l+400+(n[1e3+(c<<2)>>2]<<2)>>2]=f}function OA(s){return s=s|0,(s|1|0)==1|0}function ow(s){s=s|0;var l=Xe;switch(n[s+56>>2]|0){case 0:case 3:{l=y(h[s+40>>2]),l>y(0)&((Ht(l)|0)^1)?s=o[(n[s+976>>2]|0)+2>>0]|0?1056:992:s=1056;break}default:s=s+52|0}return s|0}function aw(s,l){return s=s|0,l=l|0,(o[s+l>>0]|0)!=0|0}function lr(s,l){return s=s|0,l=l|0,s=s+132|0,he(l)|0&&n[(Fn(s,5,948)|0)+4>>2]|0?s=1:s=(n[(Fn(s,n[1e3+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,s|0}function Pu(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0;return s=s+132|0,he(l)|0&&(f=Fn(s,5,948)|0,(n[f+4>>2]|0)!=0)?d=4:(f=Fn(s,n[1e3+(l<<2)>>2]|0,948)|0,n[f+4>>2]|0?d=4:c=y(0)),(d|0)==4&&(c=y(Yr(f,c))),y(c)}function Dd(s,l,c){return s=s|0,l=l|0,c=y(c),gi(s,l)|0?c=y(Mr(s,l,c)):c=y(-y(Pu(s,l,c))),y(c)}function bu(s){return s=y(s),h[v>>2]=s,n[v>>2]|0|0}function Cp(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Tt();else{d=Kt(l<<2)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function E0(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function UA(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&&gt(s)}function _A(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;if(B=s+4|0,k=n[B>>2]|0,d=k-f|0,m=d>>2,s=l+(m<<2)|0,s>>>0<c>>>0){f=k;do n[f>>2]=n[s>>2],s=s+4|0,f=(n[B>>2]|0)+4|0,n[B>>2]=f;while(s>>>0<c>>>0)}m|0&&ww(k+(0-m<<2)|0,l|0,d|0)|0}function C0(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0;return k=l+4|0,Q=n[k>>2]|0,d=n[s>>2]|0,B=c,m=B-d|0,f=Q+(0-(m>>2)<<2)|0,n[k>>2]=f,(m|0)>0&&Dr(f|0,d|0,m|0)|0,d=s+4|0,m=l+8|0,f=(n[d>>2]|0)-B|0,(f|0)>0&&(Dr(n[m>>2]|0,c|0,f|0)|0,n[m>>2]=(n[m>>2]|0)+(f>>>2<<2)),B=n[s>>2]|0,n[s>>2]=n[k>>2],n[k>>2]=B,B=n[d>>2]|0,n[d>>2]=n[m>>2],n[m>>2]=B,B=s+8|0,c=l+12|0,s=n[B>>2]|0,n[B>>2]=n[c>>2],n[c>>2]=s,n[l>>2]=n[k>>2],Q|0}function lw(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;if(B=n[l>>2]|0,m=n[c>>2]|0,(B|0)!=(m|0)){d=s+8|0,c=((m+-4-B|0)>>>2)+1|0,s=B,f=n[d>>2]|0;do n[f>>2]=n[s>>2],f=(n[d>>2]|0)+4|0,n[d>>2]=f,s=s+4|0;while((s|0)!=(m|0));n[l>>2]=B+(c<<2)}}function Pd(){mc()}function ma(){var s=0;return s=Kt(4)|0,HA(s),s|0}function HA(s){s=s|0,n[s>>2]=Cs()|0}function Sc(s){s=s|0,s|0&&(w0(s),gt(s))}function w0(s){s=s|0,tt(n[s>>2]|0)}function bd(s,l,c){s=s|0,l=l|0,c=c|0,Wa(n[s>>2]|0,l,c)}function fo(s,l){s=s|0,l=y(l),ga(n[s>>2]|0,l)}function xv(s,l){return s=s|0,l=l|0,aw(n[s>>2]|0,l)|0}function cw(){var s=0;return s=Kt(8)|0,kv(s,0),s|0}function kv(s,l){s=s|0,l=l|0,l?l=Ei(n[l>>2]|0)|0:l=co()|0,n[s>>2]=l,n[s+4>>2]=0,bi(l,s)}function eF(s){s=s|0;var l=0;return l=Kt(8)|0,kv(l,s),l|0}function Qv(s){s=s|0,s|0&&(Su(s),gt(s))}function Su(s){s=s|0;var l=0;ua(n[s>>2]|0),l=s+4|0,s=n[l>>2]|0,n[l>>2]=0,s|0&&(qA(s),gt(s))}function qA(s){s=s|0,jA(s)}function jA(s){s=s|0,s=n[s>>2]|0,s|0&&PA(s|0)}function uw(s){return s=s|0,qo(s)|0}function Sd(s){s=s|0;var l=0,c=0;c=s+4|0,l=n[c>>2]|0,n[c>>2]=0,l|0&&(qA(l),gt(l)),qs(n[s>>2]|0)}function tF(s,l){s=s|0,l=l|0,$r(n[s>>2]|0,n[l>>2]|0)}function rF(s,l){s=s|0,l=l|0,Aa(n[s>>2]|0,l)}function Fv(s,l,c){s=s|0,l=l|0,c=+c,Cu(n[s>>2]|0,l,y(c))}function Rv(s,l,c){s=s|0,l=l|0,c=+c,ws(n[s>>2]|0,l,y(c))}function Aw(s,l){s=s|0,l=l|0,mu(n[s>>2]|0,l)}function xu(s,l){s=s|0,l=l|0,yu(n[s>>2]|0,l)}function nF(s,l){s=s|0,l=l|0,QA(n[s>>2]|0,l)}function iF(s,l){s=s|0,l=l|0,xA(n[s>>2]|0,l)}function wp(s,l){s=s|0,l=l|0,Ec(n[s>>2]|0,l)}function sF(s,l){s=s|0,l=l|0,cp(n[s>>2]|0,l)}function Tv(s,l,c){s=s|0,l=l|0,c=+c,wc(n[s>>2]|0,l,y(c))}function GA(s,l,c){s=s|0,l=l|0,c=+c,Y(n[s>>2]|0,l,y(c))}function oF(s,l){s=s|0,l=l|0,wl(n[s>>2]|0,l)}function aF(s,l){s=s|0,l=l|0,n0(n[s>>2]|0,l)}function Nv(s,l){s=s|0,l=l|0,up(n[s>>2]|0,l)}function fw(s,l){s=s|0,l=+l,FA(n[s>>2]|0,y(l))}function pw(s,l){s=s|0,l=+l,ja(n[s>>2]|0,y(l))}function lF(s,l){s=s|0,l=+l,Gi(n[s>>2]|0,y(l))}function cF(s,l){s=s|0,l=+l,js(n[s>>2]|0,y(l))}function Dl(s,l){s=s|0,l=+l,Eu(n[s>>2]|0,y(l))}function hw(s,l){s=s|0,l=+l,tw(n[s>>2]|0,y(l))}function uF(s,l){s=s|0,l=+l,RA(n[s>>2]|0,y(l))}function YA(s){s=s|0,Ap(n[s>>2]|0)}function xd(s,l){s=s|0,l=+l,Is(n[s>>2]|0,y(l))}function ku(s,l){s=s|0,l=+l,o0(n[s>>2]|0,y(l))}function gw(s){s=s|0,a0(n[s>>2]|0)}function dw(s,l){s=s|0,l=+l,fp(n[s>>2]|0,y(l))}function AF(s,l){s=s|0,l=+l,Bc(n[s>>2]|0,y(l))}function Lv(s,l){s=s|0,l=+l,gd(n[s>>2]|0,y(l))}function WA(s,l){s=s|0,l=+l,c0(n[s>>2]|0,y(l))}function Mv(s,l){s=s|0,l=+l,Iu(n[s>>2]|0,y(l))}function kd(s,l){s=s|0,l=+l,dd(n[s>>2]|0,y(l))}function Ov(s,l){s=s|0,l=+l,Bu(n[s>>2]|0,y(l))}function Uv(s,l){s=s|0,l=+l,rw(n[s>>2]|0,y(l))}function Qd(s,l){s=s|0,l=+l,pa(n[s>>2]|0,y(l))}function _v(s,l,c){s=s|0,l=l|0,c=+c,wu(n[s>>2]|0,l,y(c))}function fF(s,l,c){s=s|0,l=l|0,c=+c,Si(n[s>>2]|0,l,y(c))}function P(s,l,c){s=s|0,l=l|0,c=+c,Ic(n[s>>2]|0,l,y(c))}function D(s){return s=s|0,r0(n[s>>2]|0)|0}function T(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,Cc(d,n[l>>2]|0,c),q(s,d),C=f}function q(s,l){s=s|0,l=l|0,W(s,n[l+4>>2]|0,+y(h[l>>2]))}function W(s,l,c){s=s|0,l=l|0,c=+c,n[s>>2]=l,E[s+8>>3]=c}function fe(s){return s=s|0,t0(n[s>>2]|0)|0}function De(s){return s=s|0,uo(n[s>>2]|0)|0}function vt(s){return s=s|0,yc(n[s>>2]|0)|0}function wt(s){return s=s|0,kA(n[s>>2]|0)|0}function St(s){return s=s|0,hd(n[s>>2]|0)|0}function _r(s){return s=s|0,e0(n[s>>2]|0)|0}function os(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,Dt(d,n[l>>2]|0,c),q(s,d),C=f}function di(s){return s=s|0,$n(n[s>>2]|0)|0}function po(s){return s=s|0,i0(n[s>>2]|0)|0}function KA(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,fa(f,n[l>>2]|0),q(s,f),C=c}function Yo(s){return s=s|0,+ +y(ji(n[s>>2]|0))}function nt(s){return s=s|0,+ +y(rs(n[s>>2]|0))}function Ve(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,Br(f,n[l>>2]|0),q(s,f),C=c}function At(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,l0(f,n[l>>2]|0),q(s,f),C=c}function Wt(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,Ct(f,n[l>>2]|0),q(s,f),C=c}function vr(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,u0(f,n[l>>2]|0),q(s,f),C=c}function bn(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,A0(f,n[l>>2]|0),q(s,f),C=c}function Qr(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,md(f,n[l>>2]|0),q(s,f),C=c}function Sn(s){return s=s|0,+ +y(vc(n[s>>2]|0))}function ai(s,l){return s=s|0,l=l|0,+ +y(s0(n[s>>2]|0,l))}function tn(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,ct(d,n[l>>2]|0,c),q(s,d),C=f}function ho(s,l,c){s=s|0,l=l|0,c=c|0,or(n[s>>2]|0,n[l>>2]|0,c)}function pF(s,l){s=s|0,l=l|0,Es(n[s>>2]|0,n[l>>2]|0)}function nve(s){return s=s|0,Ci(n[s>>2]|0)|0}function ive(s){return s=s|0,s=pt(n[s>>2]|0)|0,s?s=uw(s)|0:s=0,s|0}function sve(s,l){return s=s|0,l=l|0,s=ms(n[s>>2]|0,l)|0,s?s=uw(s)|0:s=0,s|0}function ove(s,l){s=s|0,l=l|0;var c=0,f=0;f=Kt(4)|0,W5(f,l),c=s+4|0,l=n[c>>2]|0,n[c>>2]=f,l|0&&(qA(l),gt(l)),Bt(n[s>>2]|0,1)}function W5(s,l){s=s|0,l=l|0,yve(s,l)}function ave(s,l,c,f,d,m){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=m|0;var B=0,k=0;B=C,C=C+16|0,k=B,lve(k,qo(l)|0,+c,f,+d,m),h[s>>2]=y(+E[k>>3]),h[s+4>>2]=y(+E[k+8>>3]),C=B}function lve(s,l,c,f,d,m){s=s|0,l=l|0,c=+c,f=f|0,d=+d,m=m|0;var B=0,k=0,Q=0,O=0,M=0;B=C,C=C+32|0,M=B+8|0,O=B+20|0,Q=B,k=B+16|0,E[M>>3]=c,n[O>>2]=f,E[Q>>3]=d,n[k>>2]=m,cve(s,n[l+4>>2]|0,M,O,Q,k),C=B}function cve(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0;B=C,C=C+16|0,k=B,za(k),l=ya(l)|0,uve(s,l,+E[c>>3],n[f>>2]|0,+E[d>>3],n[m>>2]|0),Ja(k),C=B}function ya(s){return s=s|0,n[s>>2]|0}function uve(s,l,c,f,d,m){s=s|0,l=l|0,c=+c,f=f|0,d=+d,m=m|0;var B=0;B=Pl(Ave()|0)|0,c=+VA(c),f=hF(f)|0,d=+VA(d),fve(s,hi(0,B|0,l|0,+c,f|0,+d,hF(m)|0)|0)}function Ave(){var s=0;return o[7608]|0||(dve(9120),s=7608,n[s>>2]=1,n[s+4>>2]=0),9120}function Pl(s){return s=s|0,n[s+8>>2]|0}function VA(s){return s=+s,+ +gF(s)}function hF(s){return s=s|0,V5(s)|0}function fve(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+32|0,c=d,f=l,f&1?(pve(c,0),ii(f|0,c|0)|0,hve(s,c),gve(c)):(n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2]),C=d}function pve(s,l){s=s|0,l=l|0,K5(s,l),n[s+8>>2]=0,o[s+24>>0]=0}function hve(s,l){s=s|0,l=l|0,l=l+8|0,n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2]}function gve(s){s=s|0,o[s+24>>0]=0}function K5(s,l){s=s|0,l=l|0,n[s>>2]=l}function V5(s){return s=s|0,s|0}function gF(s){return s=+s,+s}function dve(s){s=s|0,bl(s,mve()|0,4)}function mve(){return 1064}function bl(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=lp(l|0,c+1|0)|0}function yve(s,l){s=s|0,l=l|0,l=n[l>>2]|0,n[s>>2]=l,yl(l|0)}function Eve(s){s=s|0;var l=0,c=0;c=s+4|0,l=n[c>>2]|0,n[c>>2]=0,l|0&&(qA(l),gt(l)),Bt(n[s>>2]|0,0)}function Cve(s){s=s|0,Nt(n[s>>2]|0)}function wve(s){return s=s|0,rr(n[s>>2]|0)|0}function Ive(s,l,c,f){s=s|0,l=+l,c=+c,f=f|0,Dc(n[s>>2]|0,y(l),y(c),f)}function Bve(s){return s=s|0,+ +y(Il(n[s>>2]|0))}function vve(s){return s=s|0,+ +y(f0(n[s>>2]|0))}function Dve(s){return s=s|0,+ +y(vu(n[s>>2]|0))}function Pve(s){return s=s|0,+ +y(TA(n[s>>2]|0))}function bve(s){return s=s|0,+ +y(pp(n[s>>2]|0))}function Sve(s){return s=s|0,+ +y(Ga(n[s>>2]|0))}function xve(s,l){s=s|0,l=l|0,E[s>>3]=+y(Il(n[l>>2]|0)),E[s+8>>3]=+y(f0(n[l>>2]|0)),E[s+16>>3]=+y(vu(n[l>>2]|0)),E[s+24>>3]=+y(TA(n[l>>2]|0)),E[s+32>>3]=+y(pp(n[l>>2]|0)),E[s+40>>3]=+y(Ga(n[l>>2]|0))}function kve(s,l){return s=s|0,l=l|0,+ +y(p0(n[s>>2]|0,l))}function Qve(s,l){return s=s|0,l=l|0,+ +y(hp(n[s>>2]|0,l))}function Fve(s,l){return s=s|0,l=l|0,+ +y(jo(n[s>>2]|0,l))}function Rve(){return Pn()|0}function Tve(){Nve(),Lve(),Mve(),Ove(),Uve(),_ve()}function Nve(){UNe(11713,4938,1)}function Lve(){iNe(10448)}function Mve(){UTe(10408)}function Ove(){lTe(10324)}function Uve(){dFe(10096)}function _ve(){Hve(9132)}function Hve(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0,je=0,Oe=0,Qe=0,$e=0,Je=0,lt=0,_e=0,qe=0,Lt=0,Or=0,cr=0,Xt=0,Pr=0,Tr=0,ar=0,xn=0,go=0,mo=0,yo=0,Ca=0,kp=0,Qp=0,Sl=0,Fp=0,Tu=0,Nu=0,Rp=0,Tp=0,Np=0,Xr=0,xl=0,Lp=0,kc=0,Mp=0,Op=0,Lu=0,Mu=0,Qc=0,Ys=0,Za=0,Wo=0,kl=0,rf=0,nf=0,Ou=0,sf=0,of=0,Ws=0,Ps=0,Ql=0,Rn=0,af=0,Eo=0,Fc=0,Co=0,Rc=0,lf=0,cf=0,Tc=0,Ks=0,Fl=0,uf=0,Af=0,ff=0,xr=0,zn=0,bs=0,wo=0,Vs=0,Fr=0,ur=0,Rl=0;l=C,C=C+672|0,c=l+656|0,Rl=l+648|0,ur=l+640|0,Fr=l+632|0,Vs=l+624|0,wo=l+616|0,bs=l+608|0,zn=l+600|0,xr=l+592|0,ff=l+584|0,Af=l+576|0,uf=l+568|0,Fl=l+560|0,Ks=l+552|0,Tc=l+544|0,cf=l+536|0,lf=l+528|0,Rc=l+520|0,Co=l+512|0,Fc=l+504|0,Eo=l+496|0,af=l+488|0,Rn=l+480|0,Ql=l+472|0,Ps=l+464|0,Ws=l+456|0,of=l+448|0,sf=l+440|0,Ou=l+432|0,nf=l+424|0,rf=l+416|0,kl=l+408|0,Wo=l+400|0,Za=l+392|0,Ys=l+384|0,Qc=l+376|0,Mu=l+368|0,Lu=l+360|0,Op=l+352|0,Mp=l+344|0,kc=l+336|0,Lp=l+328|0,xl=l+320|0,Xr=l+312|0,Np=l+304|0,Tp=l+296|0,Rp=l+288|0,Nu=l+280|0,Tu=l+272|0,Fp=l+264|0,Sl=l+256|0,Qp=l+248|0,kp=l+240|0,Ca=l+232|0,yo=l+224|0,mo=l+216|0,go=l+208|0,xn=l+200|0,ar=l+192|0,Tr=l+184|0,Pr=l+176|0,Xt=l+168|0,cr=l+160|0,Or=l+152|0,Lt=l+144|0,qe=l+136|0,_e=l+128|0,lt=l+120|0,Je=l+112|0,$e=l+104|0,Qe=l+96|0,Oe=l+88|0,je=l+80|0,se=l+72|0,j=l+64|0,M=l+56|0,O=l+48|0,Q=l+40|0,k=l+32|0,B=l+24|0,m=l+16|0,d=l+8|0,f=l,qve(s,3646),jve(s,3651,2)|0,Gve(s,3665,2)|0,Yve(s,3682,18)|0,n[Rl>>2]=19,n[Rl+4>>2]=0,n[c>>2]=n[Rl>>2],n[c+4>>2]=n[Rl+4>>2],mw(s,3690,c)|0,n[ur>>2]=1,n[ur+4>>2]=0,n[c>>2]=n[ur>>2],n[c+4>>2]=n[ur+4>>2],Wve(s,3696,c)|0,n[Fr>>2]=2,n[Fr+4>>2]=0,n[c>>2]=n[Fr>>2],n[c+4>>2]=n[Fr+4>>2],Qu(s,3706,c)|0,n[Vs>>2]=1,n[Vs+4>>2]=0,n[c>>2]=n[Vs>>2],n[c+4>>2]=n[Vs+4>>2],I0(s,3722,c)|0,n[wo>>2]=2,n[wo+4>>2]=0,n[c>>2]=n[wo>>2],n[c+4>>2]=n[wo+4>>2],I0(s,3734,c)|0,n[bs>>2]=3,n[bs+4>>2]=0,n[c>>2]=n[bs>>2],n[c+4>>2]=n[bs+4>>2],Qu(s,3753,c)|0,n[zn>>2]=4,n[zn+4>>2]=0,n[c>>2]=n[zn>>2],n[c+4>>2]=n[zn+4>>2],Qu(s,3769,c)|0,n[xr>>2]=5,n[xr+4>>2]=0,n[c>>2]=n[xr>>2],n[c+4>>2]=n[xr+4>>2],Qu(s,3783,c)|0,n[ff>>2]=6,n[ff+4>>2]=0,n[c>>2]=n[ff>>2],n[c+4>>2]=n[ff+4>>2],Qu(s,3796,c)|0,n[Af>>2]=7,n[Af+4>>2]=0,n[c>>2]=n[Af>>2],n[c+4>>2]=n[Af+4>>2],Qu(s,3813,c)|0,n[uf>>2]=8,n[uf+4>>2]=0,n[c>>2]=n[uf>>2],n[c+4>>2]=n[uf+4>>2],Qu(s,3825,c)|0,n[Fl>>2]=3,n[Fl+4>>2]=0,n[c>>2]=n[Fl>>2],n[c+4>>2]=n[Fl+4>>2],I0(s,3843,c)|0,n[Ks>>2]=4,n[Ks+4>>2]=0,n[c>>2]=n[Ks>>2],n[c+4>>2]=n[Ks+4>>2],I0(s,3853,c)|0,n[Tc>>2]=9,n[Tc+4>>2]=0,n[c>>2]=n[Tc>>2],n[c+4>>2]=n[Tc+4>>2],Qu(s,3870,c)|0,n[cf>>2]=10,n[cf+4>>2]=0,n[c>>2]=n[cf>>2],n[c+4>>2]=n[cf+4>>2],Qu(s,3884,c)|0,n[lf>>2]=11,n[lf+4>>2]=0,n[c>>2]=n[lf>>2],n[c+4>>2]=n[lf+4>>2],Qu(s,3896,c)|0,n[Rc>>2]=1,n[Rc+4>>2]=0,n[c>>2]=n[Rc>>2],n[c+4>>2]=n[Rc+4>>2],vs(s,3907,c)|0,n[Co>>2]=2,n[Co+4>>2]=0,n[c>>2]=n[Co>>2],n[c+4>>2]=n[Co+4>>2],vs(s,3915,c)|0,n[Fc>>2]=3,n[Fc+4>>2]=0,n[c>>2]=n[Fc>>2],n[c+4>>2]=n[Fc+4>>2],vs(s,3928,c)|0,n[Eo>>2]=4,n[Eo+4>>2]=0,n[c>>2]=n[Eo>>2],n[c+4>>2]=n[Eo+4>>2],vs(s,3948,c)|0,n[af>>2]=5,n[af+4>>2]=0,n[c>>2]=n[af>>2],n[c+4>>2]=n[af+4>>2],vs(s,3960,c)|0,n[Rn>>2]=6,n[Rn+4>>2]=0,n[c>>2]=n[Rn>>2],n[c+4>>2]=n[Rn+4>>2],vs(s,3974,c)|0,n[Ql>>2]=7,n[Ql+4>>2]=0,n[c>>2]=n[Ql>>2],n[c+4>>2]=n[Ql+4>>2],vs(s,3983,c)|0,n[Ps>>2]=20,n[Ps+4>>2]=0,n[c>>2]=n[Ps>>2],n[c+4>>2]=n[Ps+4>>2],mw(s,3999,c)|0,n[Ws>>2]=8,n[Ws+4>>2]=0,n[c>>2]=n[Ws>>2],n[c+4>>2]=n[Ws+4>>2],vs(s,4012,c)|0,n[of>>2]=9,n[of+4>>2]=0,n[c>>2]=n[of>>2],n[c+4>>2]=n[of+4>>2],vs(s,4022,c)|0,n[sf>>2]=21,n[sf+4>>2]=0,n[c>>2]=n[sf>>2],n[c+4>>2]=n[sf+4>>2],mw(s,4039,c)|0,n[Ou>>2]=10,n[Ou+4>>2]=0,n[c>>2]=n[Ou>>2],n[c+4>>2]=n[Ou+4>>2],vs(s,4053,c)|0,n[nf>>2]=11,n[nf+4>>2]=0,n[c>>2]=n[nf>>2],n[c+4>>2]=n[nf+4>>2],vs(s,4065,c)|0,n[rf>>2]=12,n[rf+4>>2]=0,n[c>>2]=n[rf>>2],n[c+4>>2]=n[rf+4>>2],vs(s,4084,c)|0,n[kl>>2]=13,n[kl+4>>2]=0,n[c>>2]=n[kl>>2],n[c+4>>2]=n[kl+4>>2],vs(s,4097,c)|0,n[Wo>>2]=14,n[Wo+4>>2]=0,n[c>>2]=n[Wo>>2],n[c+4>>2]=n[Wo+4>>2],vs(s,4117,c)|0,n[Za>>2]=15,n[Za+4>>2]=0,n[c>>2]=n[Za>>2],n[c+4>>2]=n[Za+4>>2],vs(s,4129,c)|0,n[Ys>>2]=16,n[Ys+4>>2]=0,n[c>>2]=n[Ys>>2],n[c+4>>2]=n[Ys+4>>2],vs(s,4148,c)|0,n[Qc>>2]=17,n[Qc+4>>2]=0,n[c>>2]=n[Qc>>2],n[c+4>>2]=n[Qc+4>>2],vs(s,4161,c)|0,n[Mu>>2]=18,n[Mu+4>>2]=0,n[c>>2]=n[Mu>>2],n[c+4>>2]=n[Mu+4>>2],vs(s,4181,c)|0,n[Lu>>2]=5,n[Lu+4>>2]=0,n[c>>2]=n[Lu>>2],n[c+4>>2]=n[Lu+4>>2],I0(s,4196,c)|0,n[Op>>2]=6,n[Op+4>>2]=0,n[c>>2]=n[Op>>2],n[c+4>>2]=n[Op+4>>2],I0(s,4206,c)|0,n[Mp>>2]=7,n[Mp+4>>2]=0,n[c>>2]=n[Mp>>2],n[c+4>>2]=n[Mp+4>>2],I0(s,4217,c)|0,n[kc>>2]=3,n[kc+4>>2]=0,n[c>>2]=n[kc>>2],n[c+4>>2]=n[kc+4>>2],zA(s,4235,c)|0,n[Lp>>2]=1,n[Lp+4>>2]=0,n[c>>2]=n[Lp>>2],n[c+4>>2]=n[Lp+4>>2],dF(s,4251,c)|0,n[xl>>2]=4,n[xl+4>>2]=0,n[c>>2]=n[xl>>2],n[c+4>>2]=n[xl+4>>2],zA(s,4263,c)|0,n[Xr>>2]=5,n[Xr+4>>2]=0,n[c>>2]=n[Xr>>2],n[c+4>>2]=n[Xr+4>>2],zA(s,4279,c)|0,n[Np>>2]=6,n[Np+4>>2]=0,n[c>>2]=n[Np>>2],n[c+4>>2]=n[Np+4>>2],zA(s,4293,c)|0,n[Tp>>2]=7,n[Tp+4>>2]=0,n[c>>2]=n[Tp>>2],n[c+4>>2]=n[Tp+4>>2],zA(s,4306,c)|0,n[Rp>>2]=8,n[Rp+4>>2]=0,n[c>>2]=n[Rp>>2],n[c+4>>2]=n[Rp+4>>2],zA(s,4323,c)|0,n[Nu>>2]=9,n[Nu+4>>2]=0,n[c>>2]=n[Nu>>2],n[c+4>>2]=n[Nu+4>>2],zA(s,4335,c)|0,n[Tu>>2]=2,n[Tu+4>>2]=0,n[c>>2]=n[Tu>>2],n[c+4>>2]=n[Tu+4>>2],dF(s,4353,c)|0,n[Fp>>2]=12,n[Fp+4>>2]=0,n[c>>2]=n[Fp>>2],n[c+4>>2]=n[Fp+4>>2],B0(s,4363,c)|0,n[Sl>>2]=1,n[Sl+4>>2]=0,n[c>>2]=n[Sl>>2],n[c+4>>2]=n[Sl+4>>2],JA(s,4376,c)|0,n[Qp>>2]=2,n[Qp+4>>2]=0,n[c>>2]=n[Qp>>2],n[c+4>>2]=n[Qp+4>>2],JA(s,4388,c)|0,n[kp>>2]=13,n[kp+4>>2]=0,n[c>>2]=n[kp>>2],n[c+4>>2]=n[kp+4>>2],B0(s,4402,c)|0,n[Ca>>2]=14,n[Ca+4>>2]=0,n[c>>2]=n[Ca>>2],n[c+4>>2]=n[Ca+4>>2],B0(s,4411,c)|0,n[yo>>2]=15,n[yo+4>>2]=0,n[c>>2]=n[yo>>2],n[c+4>>2]=n[yo+4>>2],B0(s,4421,c)|0,n[mo>>2]=16,n[mo+4>>2]=0,n[c>>2]=n[mo>>2],n[c+4>>2]=n[mo+4>>2],B0(s,4433,c)|0,n[go>>2]=17,n[go+4>>2]=0,n[c>>2]=n[go>>2],n[c+4>>2]=n[go+4>>2],B0(s,4446,c)|0,n[xn>>2]=18,n[xn+4>>2]=0,n[c>>2]=n[xn>>2],n[c+4>>2]=n[xn+4>>2],B0(s,4458,c)|0,n[ar>>2]=3,n[ar+4>>2]=0,n[c>>2]=n[ar>>2],n[c+4>>2]=n[ar+4>>2],JA(s,4471,c)|0,n[Tr>>2]=1,n[Tr+4>>2]=0,n[c>>2]=n[Tr>>2],n[c+4>>2]=n[Tr+4>>2],Hv(s,4486,c)|0,n[Pr>>2]=10,n[Pr+4>>2]=0,n[c>>2]=n[Pr>>2],n[c+4>>2]=n[Pr+4>>2],zA(s,4496,c)|0,n[Xt>>2]=11,n[Xt+4>>2]=0,n[c>>2]=n[Xt>>2],n[c+4>>2]=n[Xt+4>>2],zA(s,4508,c)|0,n[cr>>2]=3,n[cr+4>>2]=0,n[c>>2]=n[cr>>2],n[c+4>>2]=n[cr+4>>2],dF(s,4519,c)|0,n[Or>>2]=4,n[Or+4>>2]=0,n[c>>2]=n[Or>>2],n[c+4>>2]=n[Or+4>>2],Kve(s,4530,c)|0,n[Lt>>2]=19,n[Lt+4>>2]=0,n[c>>2]=n[Lt>>2],n[c+4>>2]=n[Lt+4>>2],Vve(s,4542,c)|0,n[qe>>2]=12,n[qe+4>>2]=0,n[c>>2]=n[qe>>2],n[c+4>>2]=n[qe+4>>2],zve(s,4554,c)|0,n[_e>>2]=13,n[_e+4>>2]=0,n[c>>2]=n[_e>>2],n[c+4>>2]=n[_e+4>>2],Jve(s,4568,c)|0,n[lt>>2]=2,n[lt+4>>2]=0,n[c>>2]=n[lt>>2],n[c+4>>2]=n[lt+4>>2],Xve(s,4578,c)|0,n[Je>>2]=20,n[Je+4>>2]=0,n[c>>2]=n[Je>>2],n[c+4>>2]=n[Je+4>>2],Zve(s,4587,c)|0,n[$e>>2]=22,n[$e+4>>2]=0,n[c>>2]=n[$e>>2],n[c+4>>2]=n[$e+4>>2],mw(s,4602,c)|0,n[Qe>>2]=23,n[Qe+4>>2]=0,n[c>>2]=n[Qe>>2],n[c+4>>2]=n[Qe+4>>2],mw(s,4619,c)|0,n[Oe>>2]=14,n[Oe+4>>2]=0,n[c>>2]=n[Oe>>2],n[c+4>>2]=n[Oe+4>>2],$ve(s,4629,c)|0,n[je>>2]=1,n[je+4>>2]=0,n[c>>2]=n[je>>2],n[c+4>>2]=n[je+4>>2],eDe(s,4637,c)|0,n[se>>2]=4,n[se+4>>2]=0,n[c>>2]=n[se>>2],n[c+4>>2]=n[se+4>>2],JA(s,4653,c)|0,n[j>>2]=5,n[j+4>>2]=0,n[c>>2]=n[j>>2],n[c+4>>2]=n[j+4>>2],JA(s,4669,c)|0,n[M>>2]=6,n[M+4>>2]=0,n[c>>2]=n[M>>2],n[c+4>>2]=n[M+4>>2],JA(s,4686,c)|0,n[O>>2]=7,n[O+4>>2]=0,n[c>>2]=n[O>>2],n[c+4>>2]=n[O+4>>2],JA(s,4701,c)|0,n[Q>>2]=8,n[Q+4>>2]=0,n[c>>2]=n[Q>>2],n[c+4>>2]=n[Q+4>>2],JA(s,4719,c)|0,n[k>>2]=9,n[k+4>>2]=0,n[c>>2]=n[k>>2],n[c+4>>2]=n[k+4>>2],JA(s,4736,c)|0,n[B>>2]=21,n[B+4>>2]=0,n[c>>2]=n[B>>2],n[c+4>>2]=n[B+4>>2],tDe(s,4754,c)|0,n[m>>2]=2,n[m+4>>2]=0,n[c>>2]=n[m>>2],n[c+4>>2]=n[m+4>>2],Hv(s,4772,c)|0,n[d>>2]=3,n[d+4>>2]=0,n[c>>2]=n[d>>2],n[c+4>>2]=n[d+4>>2],Hv(s,4790,c)|0,n[f>>2]=4,n[f+4>>2]=0,n[c>>2]=n[f>>2],n[c+4>>2]=n[f+4>>2],Hv(s,4808,c)|0,C=l}function qve(s,l){s=s|0,l=l|0;var c=0;c=aFe()|0,n[s>>2]=c,lFe(c,l),bp(n[s>>2]|0)}function jve(s,l,c){return s=s|0,l=l|0,c=c|0,KQe(s,pn(l)|0,c,0),s|0}function Gve(s,l,c){return s=s|0,l=l|0,c=c|0,QQe(s,pn(l)|0,c,0),s|0}function Yve(s,l,c){return s=s|0,l=l|0,c=c|0,mQe(s,pn(l)|0,c,0),s|0}function mw(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],tQe(s,l,d),C=f,s|0}function Wve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Lke(s,l,d),C=f,s|0}function Qu(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Cke(s,l,d),C=f,s|0}function I0(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ike(s,l,d),C=f,s|0}function vs(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],qxe(s,l,d),C=f,s|0}function zA(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Pxe(s,l,d),C=f,s|0}function dF(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],uxe(s,l,d),C=f,s|0}function B0(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],LSe(s,l,d),C=f,s|0}function JA(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],CSe(s,l,d),C=f,s|0}function Hv(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],iSe(s,l,d),C=f,s|0}function Kve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],qbe(s,l,d),C=f,s|0}function Vve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Pbe(s,l,d),C=f,s|0}function zve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Abe(s,l,d),C=f,s|0}function Jve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],JPe(s,l,d),C=f,s|0}function Xve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],RPe(s,l,d),C=f,s|0}function Zve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],dPe(s,l,d),C=f,s|0}function $ve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ePe(s,l,d),C=f,s|0}function eDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],LDe(s,l,d),C=f,s|0}function tDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],rDe(s,l,d),C=f,s|0}function rDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],nDe(s,c,d,1),C=f}function pn(s){return s=s|0,s|0}function nDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=mF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=iDe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,sDe(m,f)|0,f),C=d}function mF(){var s=0,l=0;if(o[7616]|0||(X5(9136),ir(24,9136,U|0)|0,l=7616,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9136)|0)){s=9136,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));X5(9136)}return 9136}function iDe(s){return s=s|0,0}function sDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=mF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],J5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(lDe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function hn(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,O=0,M=0,j=0,se=0,je=0;B=C,C=C+32|0,se=B+24|0,j=B+20|0,Q=B+16|0,M=B+12|0,O=B+8|0,k=B+4|0,je=B,n[j>>2]=l,n[Q>>2]=c,n[M>>2]=f,n[O>>2]=d,n[k>>2]=m,m=s+28|0,n[je>>2]=n[m>>2],n[se>>2]=n[je>>2],oDe(s+24|0,se,j,M,O,Q,k)|0,n[m>>2]=n[n[m>>2]>>2],C=B}function oDe(s,l,c,f,d,m,B){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,s=aDe(l)|0,l=Kt(24)|0,z5(l+4|0,n[c>>2]|0,n[f>>2]|0,n[d>>2]|0,n[m>>2]|0,n[B>>2]|0),n[l>>2]=n[s>>2],n[s>>2]=l,l|0}function aDe(s){return s=s|0,n[s>>2]|0}function z5(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=f,n[s+12>>2]=d,n[s+16>>2]=m}function gr(s,l){return s=s|0,l=l|0,l|s|0}function J5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function lDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=cDe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,uDe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],J5(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,ADe(s,k),fDe(k),C=O;return}}function cDe(s){return s=s|0,357913941}function uDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function ADe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function fDe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function X5(s){s=s|0,gDe(s)}function pDe(s){s=s|0,hDe(s+24|0)}function Rr(s){return s=s|0,n[s>>2]|0}function hDe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function gDe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,3,l,dDe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Vr(){return 9228}function dDe(){return 1140}function mDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=yDe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=EDe(l,f)|0,C=c,l|0}function zr(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=f,n[s+12>>2]=d,n[s+16>>2]=m}function yDe(s){return s=s|0,(n[(mF()|0)+24>>2]|0)+(s*12|0)|0}function EDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+48|0,f=d,c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),tf[c&31](f,s),f=CDe(f)|0,C=d,f|0}function CDe(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=yF(Z5()|0)|0,f?(EF(l,f),CF(c,l),wDe(s,c),s=wF(l)|0):s=IDe(s)|0,C=d,s|0}function Z5(){var s=0;return o[7632]|0||(FDe(9184),ir(25,9184,U|0)|0,s=7632,n[s>>2]=1,n[s+4>>2]=0),9184}function yF(s){return s=s|0,n[s+36>>2]|0}function EF(s,l){s=s|0,l=l|0,n[s>>2]=l,n[s+4>>2]=s,n[s+8>>2]=0}function CF(s,l){s=s|0,l=l|0,n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=0}function wDe(s,l){s=s|0,l=l|0,PDe(l,s,s+8|0,s+16|0,s+24|0,s+32|0,s+40|0)|0}function wF(s){return s=s|0,n[(n[s+4>>2]|0)+8>>2]|0}function IDe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0;Q=C,C=C+16|0,c=Q+4|0,f=Q,d=Va(8)|0,m=d,B=Kt(48)|0,k=B,l=k+48|0;do n[k>>2]=n[s>>2],k=k+4|0,s=s+4|0;while((k|0)<(l|0));return l=m+4|0,n[l>>2]=B,k=Kt(8)|0,B=n[l>>2]|0,n[f>>2]=0,n[c>>2]=n[f>>2],$5(k,B,c),n[d>>2]=k,C=Q,m|0}function $5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Kt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1092,n[c+12>>2]=l,n[s+4>>2]=c}function BDe(s){s=s|0,Md(s),gt(s)}function vDe(s){s=s|0,s=n[s+12>>2]|0,s|0&&gt(s)}function DDe(s){s=s|0,gt(s)}function PDe(s,l,c,f,d,m,B){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,m=bDe(n[s>>2]|0,l,c,f,d,m,B)|0,B=s+4|0,n[(n[B>>2]|0)+8>>2]=m,n[(n[B>>2]|0)+8>>2]|0}function bDe(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0;var k=0,Q=0;return k=C,C=C+16|0,Q=k,za(Q),s=ya(s)|0,B=SDe(s,+E[l>>3],+E[c>>3],+E[f>>3],+E[d>>3],+E[m>>3],+E[B>>3])|0,Ja(Q),C=k,B|0}function SDe(s,l,c,f,d,m,B){s=s|0,l=+l,c=+c,f=+f,d=+d,m=+m,B=+B;var k=0;return k=Pl(xDe()|0)|0,l=+VA(l),c=+VA(c),f=+VA(f),d=+VA(d),m=+VA(m),_s(0,k|0,s|0,+l,+c,+f,+d,+m,+ +VA(B))|0}function xDe(){var s=0;return o[7624]|0||(kDe(9172),s=7624,n[s>>2]=1,n[s+4>>2]=0),9172}function kDe(s){s=s|0,bl(s,QDe()|0,6)}function QDe(){return 1112}function FDe(s){s=s|0,Ip(s)}function RDe(s){s=s|0,eG(s+24|0),tG(s+16|0)}function eG(s){s=s|0,NDe(s)}function tG(s){s=s|0,TDe(s)}function TDe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,gt(c);while(l|0);n[s>>2]=0}function NDe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,gt(c);while(l|0);n[s>>2]=0}function Ip(s){s=s|0;var l=0;n[s+16>>2]=0,n[s+20>>2]=0,l=s+24|0,n[l>>2]=0,n[s+28>>2]=l,n[s+36>>2]=0,o[s+40>>0]=0,o[s+41>>0]=0}function LDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],MDe(s,c,d,0),C=f}function MDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=IF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=ODe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,UDe(m,f)|0,f),C=d}function IF(){var s=0,l=0;if(o[7640]|0||(nG(9232),ir(26,9232,U|0)|0,l=7640,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9232)|0)){s=9232,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));nG(9232)}return 9232}function ODe(s){return s=s|0,0}function UDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=IF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],rG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(_De(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function rG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function _De(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=HDe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,qDe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],rG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,jDe(s,k),GDe(k),C=O;return}}function HDe(s){return s=s|0,357913941}function qDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function jDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function GDe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function nG(s){s=s|0,KDe(s)}function YDe(s){s=s|0,WDe(s+24|0)}function WDe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function KDe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,1,l,VDe()|0,3),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function VDe(){return 1144}function zDe(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0;var m=0,B=0,k=0,Q=0;m=C,C=C+16|0,B=m+8|0,k=m,Q=JDe(s)|0,s=n[Q+4>>2]|0,n[k>>2]=n[Q>>2],n[k+4>>2]=s,n[B>>2]=n[k>>2],n[B+4>>2]=n[k+4>>2],XDe(l,B,c,f,d),C=m}function JDe(s){return s=s|0,(n[(IF()|0)+24>>2]|0)+(s*12|0)|0}function XDe(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0;var m=0,B=0,k=0,Q=0,O=0;O=C,C=C+16|0,B=O+2|0,k=O+1|0,Q=O,m=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(m=n[(n[s>>2]|0)+m>>2]|0),Fu(B,c),c=+Ru(B,c),Fu(k,f),f=+Ru(k,f),XA(Q,d),Q=ZA(Q,d)|0,y7[m&1](s,c,f,Q),C=O}function Fu(s,l){s=s|0,l=+l}function Ru(s,l){return s=s|0,l=+l,+ +$De(l)}function XA(s,l){s=s|0,l=l|0}function ZA(s,l){return s=s|0,l=l|0,ZDe(l)|0}function ZDe(s){return s=s|0,s|0}function $De(s){return s=+s,+s}function ePe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],tPe(s,c,d,1),C=f}function tPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=BF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=rPe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,nPe(m,f)|0,f),C=d}function BF(){var s=0,l=0;if(o[7648]|0||(sG(9268),ir(27,9268,U|0)|0,l=7648,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9268)|0)){s=9268,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));sG(9268)}return 9268}function rPe(s){return s=s|0,0}function nPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=BF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],iG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(iPe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function iG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function iPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=sPe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,oPe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],iG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,aPe(s,k),lPe(k),C=O;return}}function sPe(s){return s=s|0,357913941}function oPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function aPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function lPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function sG(s){s=s|0,APe(s)}function cPe(s){s=s|0,uPe(s+24|0)}function uPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function APe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,4,l,fPe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function fPe(){return 1160}function pPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=hPe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=gPe(l,f)|0,C=c,l|0}function hPe(s){return s=s|0,(n[(BF()|0)+24>>2]|0)+(s*12|0)|0}function gPe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),oG(F0[c&31](s)|0)|0}function oG(s){return s=s|0,s&1|0}function dPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],mPe(s,c,d,0),C=f}function mPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=vF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=yPe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,EPe(m,f)|0,f),C=d}function vF(){var s=0,l=0;if(o[7656]|0||(lG(9304),ir(28,9304,U|0)|0,l=7656,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9304)|0)){s=9304,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));lG(9304)}return 9304}function yPe(s){return s=s|0,0}function EPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=vF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],aG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(CPe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function aG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function CPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=wPe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,IPe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],aG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,BPe(s,k),vPe(k),C=O;return}}function wPe(s){return s=s|0,357913941}function IPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function BPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function vPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function lG(s){s=s|0,bPe(s)}function DPe(s){s=s|0,PPe(s+24|0)}function PPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function bPe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,5,l,SPe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function SPe(){return 1164}function xPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=kPe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],QPe(l,d,c),C=f}function kPe(s){return s=s|0,(n[(vF()|0)+24>>2]|0)+(s*12|0)|0}function QPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),Bp(d,c),c=vp(d,c)|0,tf[f&31](s,c),Dp(d),C=m}function Bp(s,l){s=s|0,l=l|0,FPe(s,l)}function vp(s,l){return s=s|0,l=l|0,s|0}function Dp(s){s=s|0,qA(s)}function FPe(s,l){s=s|0,l=l|0,DF(s,l)}function DF(s,l){s=s|0,l=l|0,n[s>>2]=l}function RPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],TPe(s,c,d,0),C=f}function TPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=PF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=NPe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,LPe(m,f)|0,f),C=d}function PF(){var s=0,l=0;if(o[7664]|0||(uG(9340),ir(29,9340,U|0)|0,l=7664,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9340)|0)){s=9340,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));uG(9340)}return 9340}function NPe(s){return s=s|0,0}function LPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=PF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],cG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(MPe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function cG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function MPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=OPe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,UPe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],cG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,_Pe(s,k),HPe(k),C=O;return}}function OPe(s){return s=s|0,357913941}function UPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function _Pe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function HPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function uG(s){s=s|0,GPe(s)}function qPe(s){s=s|0,jPe(s+24|0)}function jPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function GPe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,4,l,YPe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function YPe(){return 1180}function WPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=KPe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=VPe(l,d,c)|0,C=f,c|0}function KPe(s){return s=s|0,(n[(PF()|0)+24>>2]|0)+(s*12|0)|0}function VPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),v0(d,c),d=D0(d,c)|0,d=qv(IR[f&15](s,d)|0)|0,C=m,d|0}function v0(s,l){s=s|0,l=l|0}function D0(s,l){return s=s|0,l=l|0,zPe(l)|0}function qv(s){return s=s|0,s|0}function zPe(s){return s=s|0,s|0}function JPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],XPe(s,c,d,0),C=f}function XPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=bF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=ZPe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,$Pe(m,f)|0,f),C=d}function bF(){var s=0,l=0;if(o[7672]|0||(fG(9376),ir(30,9376,U|0)|0,l=7672,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9376)|0)){s=9376,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));fG(9376)}return 9376}function ZPe(s){return s=s|0,0}function $Pe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=bF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],AG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(ebe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function AG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function ebe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=tbe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,rbe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],AG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,nbe(s,k),ibe(k),C=O;return}}function tbe(s){return s=s|0,357913941}function rbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function nbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function ibe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function fG(s){s=s|0,abe(s)}function sbe(s){s=s|0,obe(s+24|0)}function obe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function abe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,5,l,pG()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function pG(){return 1196}function lbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=cbe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=ube(l,f)|0,C=c,l|0}function cbe(s){return s=s|0,(n[(bF()|0)+24>>2]|0)+(s*12|0)|0}function ube(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),qv(F0[c&31](s)|0)|0}function Abe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],fbe(s,c,d,1),C=f}function fbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=SF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=pbe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,hbe(m,f)|0,f),C=d}function SF(){var s=0,l=0;if(o[7680]|0||(gG(9412),ir(31,9412,U|0)|0,l=7680,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9412)|0)){s=9412,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));gG(9412)}return 9412}function pbe(s){return s=s|0,0}function hbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=SF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],hG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(gbe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function hG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function gbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=dbe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,mbe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],hG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,ybe(s,k),Ebe(k),C=O;return}}function dbe(s){return s=s|0,357913941}function mbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function ybe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Ebe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function gG(s){s=s|0,Ibe(s)}function Cbe(s){s=s|0,wbe(s+24|0)}function wbe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Ibe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,6,l,dG()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function dG(){return 1200}function Bbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=vbe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=Dbe(l,f)|0,C=c,l|0}function vbe(s){return s=s|0,(n[(SF()|0)+24>>2]|0)+(s*12|0)|0}function Dbe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),jv(F0[c&31](s)|0)|0}function jv(s){return s=s|0,s|0}function Pbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],bbe(s,c,d,0),C=f}function bbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=xF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=Sbe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,xbe(m,f)|0,f),C=d}function xF(){var s=0,l=0;if(o[7688]|0||(yG(9448),ir(32,9448,U|0)|0,l=7688,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9448)|0)){s=9448,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));yG(9448)}return 9448}function Sbe(s){return s=s|0,0}function xbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=xF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],mG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(kbe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function mG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function kbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Qbe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,Fbe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],mG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Rbe(s,k),Tbe(k),C=O;return}}function Qbe(s){return s=s|0,357913941}function Fbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Rbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Tbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function yG(s){s=s|0,Mbe(s)}function Nbe(s){s=s|0,Lbe(s+24|0)}function Lbe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Mbe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,6,l,EG()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function EG(){return 1204}function Obe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=Ube(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],_be(l,d,c),C=f}function Ube(s){return s=s|0,(n[(xF()|0)+24>>2]|0)+(s*12|0)|0}function _be(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),kF(d,c),d=QF(d,c)|0,tf[f&31](s,d),C=m}function kF(s,l){s=s|0,l=l|0}function QF(s,l){return s=s|0,l=l|0,Hbe(l)|0}function Hbe(s){return s=s|0,s|0}function qbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],jbe(s,c,d,0),C=f}function jbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=FF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=Gbe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Ybe(m,f)|0,f),C=d}function FF(){var s=0,l=0;if(o[7696]|0||(wG(9484),ir(33,9484,U|0)|0,l=7696,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9484)|0)){s=9484,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));wG(9484)}return 9484}function Gbe(s){return s=s|0,0}function Ybe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=FF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],CG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Wbe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function CG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Wbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Kbe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,Vbe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],CG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,zbe(s,k),Jbe(k),C=O;return}}function Kbe(s){return s=s|0,357913941}function Vbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function zbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Jbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function wG(s){s=s|0,$be(s)}function Xbe(s){s=s|0,Zbe(s+24|0)}function Zbe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function $be(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,1,l,eSe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function eSe(){return 1212}function tSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=rSe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],nSe(l,m,c,f),C=d}function rSe(s){return s=s|0,(n[(FF()|0)+24>>2]|0)+(s*12|0)|0}function nSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),kF(m,c),m=QF(m,c)|0,v0(B,f),B=D0(B,f)|0,vw[d&15](s,m,B),C=k}function iSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],sSe(s,c,d,1),C=f}function sSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=RF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=oSe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,aSe(m,f)|0,f),C=d}function RF(){var s=0,l=0;if(o[7704]|0||(BG(9520),ir(34,9520,U|0)|0,l=7704,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9520)|0)){s=9520,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));BG(9520)}return 9520}function oSe(s){return s=s|0,0}function aSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=RF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],IG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(lSe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function IG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function lSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=cSe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,uSe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],IG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,ASe(s,k),fSe(k),C=O;return}}function cSe(s){return s=s|0,357913941}function uSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function ASe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function fSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function BG(s){s=s|0,gSe(s)}function pSe(s){s=s|0,hSe(s+24|0)}function hSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function gSe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,1,l,dSe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function dSe(){return 1224}function mSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;return d=C,C=C+16|0,m=d+8|0,B=d,k=ySe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],f=+ESe(l,m,c),C=d,+f}function ySe(s){return s=s|0,(n[(RF()|0)+24>>2]|0)+(s*12|0)|0}function ESe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(d,c),d=ZA(d,c)|0,B=+gF(+C7[f&7](s,d)),C=m,+B}function CSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],wSe(s,c,d,1),C=f}function wSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=TF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=ISe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,BSe(m,f)|0,f),C=d}function TF(){var s=0,l=0;if(o[7712]|0||(DG(9556),ir(35,9556,U|0)|0,l=7712,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9556)|0)){s=9556,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));DG(9556)}return 9556}function ISe(s){return s=s|0,0}function BSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=TF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],vG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(vSe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function vG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function vSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=DSe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,PSe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],vG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,bSe(s,k),SSe(k),C=O;return}}function DSe(s){return s=s|0,357913941}function PSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function bSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function SSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function DG(s){s=s|0,QSe(s)}function xSe(s){s=s|0,kSe(s+24|0)}function kSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function QSe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,5,l,FSe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function FSe(){return 1232}function RSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=TSe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=+NSe(l,d),C=f,+c}function TSe(s){return s=s|0,(n[(TF()|0)+24>>2]|0)+(s*12|0)|0}function NSe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),+ +gF(+E7[c&15](s))}function LSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],MSe(s,c,d,1),C=f}function MSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=NF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=OSe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,USe(m,f)|0,f),C=d}function NF(){var s=0,l=0;if(o[7720]|0||(bG(9592),ir(36,9592,U|0)|0,l=7720,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9592)|0)){s=9592,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));bG(9592)}return 9592}function OSe(s){return s=s|0,0}function USe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=NF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],PG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(_Se(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function PG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function _Se(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=HSe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,qSe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],PG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,jSe(s,k),GSe(k),C=O;return}}function HSe(s){return s=s|0,357913941}function qSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function jSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function GSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function bG(s){s=s|0,KSe(s)}function YSe(s){s=s|0,WSe(s+24|0)}function WSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function KSe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,7,l,VSe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function VSe(){return 1276}function zSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=JSe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=XSe(l,f)|0,C=c,l|0}function JSe(s){return s=s|0,(n[(NF()|0)+24>>2]|0)+(s*12|0)|0}function XSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+16|0,f=d,c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),tf[c&31](f,s),f=SG(f)|0,C=d,f|0}function SG(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=yF(xG()|0)|0,f?(EF(l,f),CF(c,l),ZSe(s,c),s=wF(l)|0):s=$Se(s)|0,C=d,s|0}function xG(){var s=0;return o[7736]|0||(cxe(9640),ir(25,9640,U|0)|0,s=7736,n[s>>2]=1,n[s+4>>2]=0),9640}function ZSe(s,l){s=s|0,l=l|0,nxe(l,s,s+8|0)|0}function $Se(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Va(8)|0,l=f,k=Kt(16)|0,n[k>>2]=n[s>>2],n[k+4>>2]=n[s+4>>2],n[k+8>>2]=n[s+8>>2],n[k+12>>2]=n[s+12>>2],m=l+4|0,n[m>>2]=k,s=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],LF(s,m,d),n[f>>2]=s,C=c,l|0}function LF(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Kt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1244,n[c+12>>2]=l,n[s+4>>2]=c}function exe(s){s=s|0,Md(s),gt(s)}function txe(s){s=s|0,s=n[s+12>>2]|0,s|0&&gt(s)}function rxe(s){s=s|0,gt(s)}function nxe(s,l,c){return s=s|0,l=l|0,c=c|0,l=ixe(n[s>>2]|0,l,c)|0,c=s+4|0,n[(n[c>>2]|0)+8>>2]=l,n[(n[c>>2]|0)+8>>2]|0}function ixe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;return f=C,C=C+16|0,d=f,za(d),s=ya(s)|0,c=sxe(s,n[l>>2]|0,+E[c>>3])|0,Ja(d),C=f,c|0}function sxe(s,l,c){s=s|0,l=l|0,c=+c;var f=0;return f=Pl(oxe()|0)|0,l=hF(l)|0,ml(0,f|0,s|0,l|0,+ +VA(c))|0}function oxe(){var s=0;return o[7728]|0||(axe(9628),s=7728,n[s>>2]=1,n[s+4>>2]=0),9628}function axe(s){s=s|0,bl(s,lxe()|0,2)}function lxe(){return 1264}function cxe(s){s=s|0,Ip(s)}function uxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Axe(s,c,d,1),C=f}function Axe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=MF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=fxe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,pxe(m,f)|0,f),C=d}function MF(){var s=0,l=0;if(o[7744]|0||(QG(9684),ir(37,9684,U|0)|0,l=7744,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9684)|0)){s=9684,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));QG(9684)}return 9684}function fxe(s){return s=s|0,0}function pxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=MF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],kG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(hxe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function kG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function hxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=gxe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,dxe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],kG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,mxe(s,k),yxe(k),C=O;return}}function gxe(s){return s=s|0,357913941}function dxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function mxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function yxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function QG(s){s=s|0,wxe(s)}function Exe(s){s=s|0,Cxe(s+24|0)}function Cxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function wxe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,5,l,Ixe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Ixe(){return 1280}function Bxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=vxe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=Dxe(l,d,c)|0,C=f,c|0}function vxe(s){return s=s|0,(n[(MF()|0)+24>>2]|0)+(s*12|0)|0}function Dxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return B=C,C=C+32|0,d=B,m=B+16|0,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(m,c),m=ZA(m,c)|0,vw[f&15](d,s,m),m=SG(d)|0,C=B,m|0}function Pxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],bxe(s,c,d,1),C=f}function bxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=OF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=Sxe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,xxe(m,f)|0,f),C=d}function OF(){var s=0,l=0;if(o[7752]|0||(RG(9720),ir(38,9720,U|0)|0,l=7752,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9720)|0)){s=9720,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));RG(9720)}return 9720}function Sxe(s){return s=s|0,0}function xxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=OF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],FG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(kxe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function FG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function kxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Qxe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,Fxe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],FG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Rxe(s,k),Txe(k),C=O;return}}function Qxe(s){return s=s|0,357913941}function Fxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Rxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Txe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function RG(s){s=s|0,Mxe(s)}function Nxe(s){s=s|0,Lxe(s+24|0)}function Lxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Mxe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,8,l,Oxe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Oxe(){return 1288}function Uxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=_xe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=Hxe(l,f)|0,C=c,l|0}function _xe(s){return s=s|0,(n[(OF()|0)+24>>2]|0)+(s*12|0)|0}function Hxe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),V5(F0[c&31](s)|0)|0}function qxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],jxe(s,c,d,0),C=f}function jxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=UF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=Gxe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Yxe(m,f)|0,f),C=d}function UF(){var s=0,l=0;if(o[7760]|0||(NG(9756),ir(39,9756,U|0)|0,l=7760,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9756)|0)){s=9756,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));NG(9756)}return 9756}function Gxe(s){return s=s|0,0}function Yxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=UF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],TG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Wxe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function TG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Wxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Kxe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,Vxe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],TG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,zxe(s,k),Jxe(k),C=O;return}}function Kxe(s){return s=s|0,357913941}function Vxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function zxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Jxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function NG(s){s=s|0,$xe(s)}function Xxe(s){s=s|0,Zxe(s+24|0)}function Zxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function $xe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,8,l,eke()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function eke(){return 1292}function tke(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=rke(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],nke(l,d,c),C=f}function rke(s){return s=s|0,(n[(UF()|0)+24>>2]|0)+(s*12|0)|0}function nke(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),Fu(d,c),c=+Ru(d,c),d7[f&31](s,c),C=m}function ike(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ske(s,c,d,0),C=f}function ske(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=_F()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=oke(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,ake(m,f)|0,f),C=d}function _F(){var s=0,l=0;if(o[7768]|0||(MG(9792),ir(40,9792,U|0)|0,l=7768,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9792)|0)){s=9792,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));MG(9792)}return 9792}function oke(s){return s=s|0,0}function ake(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=_F()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],LG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(lke(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function LG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function lke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=cke(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,uke(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],LG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,Ake(s,k),fke(k),C=O;return}}function cke(s){return s=s|0,357913941}function uke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Ake(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function fke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function MG(s){s=s|0,gke(s)}function pke(s){s=s|0,hke(s+24|0)}function hke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function gke(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,1,l,dke()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function dke(){return 1300}function mke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=yke(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],Eke(l,m,c,f),C=d}function yke(s){return s=s|0,(n[(_F()|0)+24>>2]|0)+(s*12|0)|0}function Eke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),XA(m,c),m=ZA(m,c)|0,Fu(B,f),f=+Ru(B,f),v7[d&15](s,m,f),C=k}function Cke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],wke(s,c,d,0),C=f}function wke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=HF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=Ike(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Bke(m,f)|0,f),C=d}function HF(){var s=0,l=0;if(o[7776]|0||(UG(9828),ir(41,9828,U|0)|0,l=7776,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9828)|0)){s=9828,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));UG(9828)}return 9828}function Ike(s){return s=s|0,0}function Bke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=HF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],OG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(vke(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function OG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function vke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Dke(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,Pke(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],OG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,bke(s,k),Ske(k),C=O;return}}function Dke(s){return s=s|0,357913941}function Pke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function bke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Ske(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function UG(s){s=s|0,Qke(s)}function xke(s){s=s|0,kke(s+24|0)}function kke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Qke(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,7,l,Fke()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Fke(){return 1312}function Rke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=Tke(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Nke(l,d,c),C=f}function Tke(s){return s=s|0,(n[(HF()|0)+24>>2]|0)+(s*12|0)|0}function Nke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(d,c),d=ZA(d,c)|0,tf[f&31](s,d),C=m}function Lke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Mke(s,c,d,0),C=f}function Mke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=qF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=Oke(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,Uke(m,f)|0,f),C=d}function qF(){var s=0,l=0;if(o[7784]|0||(HG(9864),ir(42,9864,U|0)|0,l=7784,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9864)|0)){s=9864,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));HG(9864)}return 9864}function Oke(s){return s=s|0,0}function Uke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=qF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],_G(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(_ke(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function _G(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function _ke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Hke(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,qke(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],_G(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,jke(s,k),Gke(k),C=O;return}}function Hke(s){return s=s|0,357913941}function qke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function jke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Gke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function HG(s){s=s|0,Kke(s)}function Yke(s){s=s|0,Wke(s+24|0)}function Wke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function Kke(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,8,l,Vke()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Vke(){return 1320}function zke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=Jke(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Xke(l,d,c),C=f}function Jke(s){return s=s|0,(n[(qF()|0)+24>>2]|0)+(s*12|0)|0}function Xke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),Zke(d,c),d=$ke(d,c)|0,tf[f&31](s,d),C=m}function Zke(s,l){s=s|0,l=l|0}function $ke(s,l){return s=s|0,l=l|0,eQe(l)|0}function eQe(s){return s=s|0,s|0}function tQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],rQe(s,c,d,0),C=f}function rQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=jF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=nQe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,iQe(m,f)|0,f),C=d}function jF(){var s=0,l=0;if(o[7792]|0||(jG(9900),ir(43,9900,U|0)|0,l=7792,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9900)|0)){s=9900,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));jG(9900)}return 9900}function nQe(s){return s=s|0,0}function iQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=jF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],qG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(sQe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function qG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function sQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=oQe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,aQe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],qG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,lQe(s,k),cQe(k),C=O;return}}function oQe(s){return s=s|0,357913941}function aQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function lQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function cQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function jG(s){s=s|0,fQe(s)}function uQe(s){s=s|0,AQe(s+24|0)}function AQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function fQe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,22,l,pQe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function pQe(){return 1344}function hQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;c=C,C=C+16|0,f=c+8|0,d=c,m=gQe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],dQe(l,f),C=c}function gQe(s){return s=s|0,(n[(jF()|0)+24>>2]|0)+(s*12|0)|0}function dQe(s,l){s=s|0,l=l|0;var c=0;c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),ef[c&127](s)}function mQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=GF()|0,s=yQe(c)|0,hn(m,l,d,s,EQe(c,f)|0,f)}function GF(){var s=0,l=0;if(o[7800]|0||(YG(9936),ir(44,9936,U|0)|0,l=7800,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9936)|0)){s=9936,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));YG(9936)}return 9936}function yQe(s){return s=s|0,s|0}function EQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=GF()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(GG(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(CQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function GG(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function CQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=wQe(s)|0,f>>>0<B>>>0)Jr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,IQe(d,M>>3>>>0<f>>>1>>>0?O>>>0<B>>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,GG(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,BQe(s,d),vQe(d),C=k;return}}function wQe(s){return s=s|0,536870911}function IQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function BQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function vQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&gt(s)}function YG(s){s=s|0,bQe(s)}function DQe(s){s=s|0,PQe(s+24|0)}function PQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function bQe(s){s=s|0;var l=0;l=Vr()|0,zr(s,1,23,l,EG()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function SQe(s,l){s=s|0,l=l|0,kQe(n[(xQe(s)|0)>>2]|0,l)}function xQe(s){return s=s|0,(n[(GF()|0)+24>>2]|0)+(s<<3)|0}function kQe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,kF(f,l),l=QF(f,l)|0,ef[s&127](l),C=c}function QQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=YF()|0,s=FQe(c)|0,hn(m,l,d,s,RQe(c,f)|0,f)}function YF(){var s=0,l=0;if(o[7808]|0||(KG(9972),ir(45,9972,U|0)|0,l=7808,n[l>>2]=1,n[l+4>>2]=0),!(Rr(9972)|0)){s=9972,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));KG(9972)}return 9972}function FQe(s){return s=s|0,s|0}function RQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=YF()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(WG(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(TQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function WG(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function TQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=NQe(s)|0,f>>>0<B>>>0)Jr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,LQe(d,M>>3>>>0<f>>>1>>>0?O>>>0<B>>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,WG(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,MQe(s,d),OQe(d),C=k;return}}function NQe(s){return s=s|0,536870911}function LQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function MQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function OQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&gt(s)}function KG(s){s=s|0,HQe(s)}function UQe(s){s=s|0,_Qe(s+24|0)}function _Qe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function HQe(s){s=s|0;var l=0;l=Vr()|0,zr(s,1,9,l,qQe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function qQe(){return 1348}function jQe(s,l){return s=s|0,l=l|0,YQe(n[(GQe(s)|0)>>2]|0,l)|0}function GQe(s){return s=s|0,(n[(YF()|0)+24>>2]|0)+(s<<3)|0}function YQe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,VG(f,l),l=zG(f,l)|0,l=qv(F0[s&31](l)|0)|0,C=c,l|0}function VG(s,l){s=s|0,l=l|0}function zG(s,l){return s=s|0,l=l|0,WQe(l)|0}function WQe(s){return s=s|0,s|0}function KQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=WF()|0,s=VQe(c)|0,hn(m,l,d,s,zQe(c,f)|0,f)}function WF(){var s=0,l=0;if(o[7816]|0||(XG(10008),ir(46,10008,U|0)|0,l=7816,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10008)|0)){s=10008,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));XG(10008)}return 10008}function VQe(s){return s=s|0,s|0}function zQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=WF()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(JG(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(JQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function JG(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function JQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=XQe(s)|0,f>>>0<B>>>0)Jr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,ZQe(d,M>>3>>>0<f>>>1>>>0?O>>>0<B>>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,JG(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,$Qe(s,d),eFe(d),C=k;return}}function XQe(s){return s=s|0,536870911}function ZQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function $Qe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function eFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&gt(s)}function XG(s){s=s|0,nFe(s)}function tFe(s){s=s|0,rFe(s+24|0)}function rFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function nFe(s){s=s|0;var l=0;l=Vr()|0,zr(s,1,15,l,pG()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function iFe(s){return s=s|0,oFe(n[(sFe(s)|0)>>2]|0)|0}function sFe(s){return s=s|0,(n[(WF()|0)+24>>2]|0)+(s<<3)|0}function oFe(s){return s=s|0,qv(nD[s&7]()|0)|0}function aFe(){var s=0;return o[7832]|0||(gFe(10052),ir(25,10052,U|0)|0,s=7832,n[s>>2]=1,n[s+4>>2]=0),10052}function lFe(s,l){s=s|0,l=l|0,n[s>>2]=cFe()|0,n[s+4>>2]=uFe()|0,n[s+12>>2]=l,n[s+8>>2]=AFe()|0,n[s+32>>2]=2}function cFe(){return 11709}function uFe(){return 1188}function AFe(){return Gv()|0}function fFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Pp(f,896)|0)==512?c|0&&(pFe(c),gt(c)):l|0&&(Su(l),gt(l))}function Pp(s,l){return s=s|0,l=l|0,l&s|0}function pFe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Sp(s)}function Gv(){var s=0;return o[7824]|0||(n[2511]=hFe()|0,n[2512]=0,s=7824,n[s>>2]=1,n[s+4>>2]=0),10044}function hFe(){return 0}function gFe(s){s=s|0,Ip(s)}function dFe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0;l=C,C=C+32|0,c=l+24|0,m=l+16|0,d=l+8|0,f=l,mFe(s,4827),yFe(s,4834,3)|0,EFe(s,3682,47)|0,n[m>>2]=9,n[m+4>>2]=0,n[c>>2]=n[m>>2],n[c+4>>2]=n[m+4>>2],CFe(s,4841,c)|0,n[d>>2]=1,n[d+4>>2]=0,n[c>>2]=n[d>>2],n[c+4>>2]=n[d+4>>2],wFe(s,4871,c)|0,n[f>>2]=10,n[f+4>>2]=0,n[c>>2]=n[f>>2],n[c+4>>2]=n[f+4>>2],IFe(s,4891,c)|0,C=l}function mFe(s,l){s=s|0,l=l|0;var c=0;c=eTe()|0,n[s>>2]=c,tTe(c,l),bp(n[s>>2]|0)}function yFe(s,l,c){return s=s|0,l=l|0,c=c|0,ORe(s,pn(l)|0,c,0),s|0}function EFe(s,l,c){return s=s|0,l=l|0,c=c|0,BRe(s,pn(l)|0,c,0),s|0}function CFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],iRe(s,l,d),C=f,s|0}function wFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],UFe(s,l,d),C=f,s|0}function IFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],BFe(s,l,d),C=f,s|0}function BFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],vFe(s,c,d,1),C=f}function vFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=KF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=DFe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,PFe(m,f)|0,f),C=d}function KF(){var s=0,l=0;if(o[7840]|0||($G(10100),ir(48,10100,U|0)|0,l=7840,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10100)|0)){s=10100,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));$G(10100)}return 10100}function DFe(s){return s=s|0,0}function PFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=KF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],ZG(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(bFe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function ZG(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function bFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=SFe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,xFe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],ZG(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,kFe(s,k),QFe(k),C=O;return}}function SFe(s){return s=s|0,357913941}function xFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function kFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function QFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function $G(s){s=s|0,TFe(s)}function FFe(s){s=s|0,RFe(s+24|0)}function RFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function TFe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,6,l,NFe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function NFe(){return 1364}function LFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=MFe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=OFe(l,d,c)|0,C=f,c|0}function MFe(s){return s=s|0,(n[(KF()|0)+24>>2]|0)+(s*12|0)|0}function OFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(d,c),d=ZA(d,c)|0,d=oG(IR[f&15](s,d)|0)|0,C=m,d|0}function UFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],_Fe(s,c,d,0),C=f}function _Fe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=VF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=HFe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,qFe(m,f)|0,f),C=d}function VF(){var s=0,l=0;if(o[7848]|0||(t9(10136),ir(49,10136,U|0)|0,l=7848,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10136)|0)){s=10136,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));t9(10136)}return 10136}function HFe(s){return s=s|0,0}function qFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=VF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],e9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(jFe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function e9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function jFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=GFe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,YFe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],e9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,WFe(s,k),KFe(k),C=O;return}}function GFe(s){return s=s|0,357913941}function YFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function WFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function KFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function t9(s){s=s|0,JFe(s)}function VFe(s){s=s|0,zFe(s+24|0)}function zFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function JFe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,9,l,XFe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function XFe(){return 1372}function ZFe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=$Fe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],eRe(l,d,c),C=f}function $Fe(s){return s=s|0,(n[(VF()|0)+24>>2]|0)+(s*12|0)|0}function eRe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=Xe;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),tRe(d,c),B=y(rRe(d,c)),g7[f&1](s,B),C=m}function tRe(s,l){s=s|0,l=+l}function rRe(s,l){return s=s|0,l=+l,y(nRe(l))}function nRe(s){return s=+s,y(s)}function iRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=pn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],sRe(s,c,d,0),C=f}function sRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,Q=0,O=0,M=0;d=C,C=C+32|0,m=d+16|0,M=d+8|0,k=d,O=n[c>>2]|0,Q=n[c+4>>2]|0,B=n[s>>2]|0,s=zF()|0,n[M>>2]=O,n[M+4>>2]=Q,n[m>>2]=n[M>>2],n[m+4>>2]=n[M+4>>2],c=oRe(m)|0,n[k>>2]=O,n[k+4>>2]=Q,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],hn(B,l,s,c,aRe(m,f)|0,f),C=d}function zF(){var s=0,l=0;if(o[7856]|0||(n9(10172),ir(50,10172,U|0)|0,l=7856,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10172)|0)){s=10172,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));n9(10172)}return 10172}function oRe(s){return s=s|0,0}function aRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0;return M=C,C=C+32|0,d=M+24|0,B=M+16|0,k=M,Q=M+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=zF()|0,O=j+24|0,s=gr(l,4)|0,n[Q>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],r9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(lRe(O,k,Q),s=n[l>>2]|0),C=M,((s-(n[O>>2]|0)|0)/12|0)+-1|0}function r9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function lRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;if(O=C,C=C+48|0,f=O+32|0,B=O+24|0,k=O,Q=s+4|0,d=(((n[Q>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=cRe(s)|0,m>>>0<d>>>0)Jr(s);else{M=n[s>>2]|0,se=((n[s+8>>2]|0)-M|0)/12|0,j=se<<1,uRe(k,se>>>0<m>>>1>>>0?j>>>0<d>>>0?d:j:m,((n[Q>>2]|0)-M|0)/12|0,s+8|0),Q=k+8|0,m=n[Q>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],r9(m,f,c),n[Q>>2]=(n[Q>>2]|0)+12,ARe(s,k),fRe(k),C=O;return}}function cRe(s){return s=s|0,357913941}function uRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Kt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function ARe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function fRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&gt(s)}function n9(s){s=s|0,gRe(s)}function pRe(s){s=s|0,hRe(s+24|0)}function hRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),gt(c))}function gRe(s){s=s|0;var l=0;l=Vr()|0,zr(s,2,3,l,dRe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function dRe(){return 1380}function mRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=yRe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],ERe(l,m,c,f),C=d}function yRe(s){return s=s|0,(n[(zF()|0)+24>>2]|0)+(s*12|0)|0}function ERe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),XA(m,c),m=ZA(m,c)|0,CRe(B,f),B=wRe(B,f)|0,vw[d&15](s,m,B),C=k}function CRe(s,l){s=s|0,l=l|0}function wRe(s,l){return s=s|0,l=l|0,IRe(l)|0}function IRe(s){return s=s|0,(s|0)!=0|0}function BRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=JF()|0,s=vRe(c)|0,hn(m,l,d,s,DRe(c,f)|0,f)}function JF(){var s=0,l=0;if(o[7864]|0||(s9(10208),ir(51,10208,U|0)|0,l=7864,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10208)|0)){s=10208,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));s9(10208)}return 10208}function vRe(s){return s=s|0,s|0}function DRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=JF()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(i9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(PRe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function i9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function PRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=bRe(s)|0,f>>>0<B>>>0)Jr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,SRe(d,M>>3>>>0<f>>>1>>>0?O>>>0<B>>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,i9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,xRe(s,d),kRe(d),C=k;return}}function bRe(s){return s=s|0,536870911}function SRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function xRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function kRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&gt(s)}function s9(s){s=s|0,RRe(s)}function QRe(s){s=s|0,FRe(s+24|0)}function FRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function RRe(s){s=s|0;var l=0;l=Vr()|0,zr(s,1,24,l,TRe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function TRe(){return 1392}function NRe(s,l){s=s|0,l=l|0,MRe(n[(LRe(s)|0)>>2]|0,l)}function LRe(s){return s=s|0,(n[(JF()|0)+24>>2]|0)+(s<<3)|0}function MRe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,VG(f,l),l=zG(f,l)|0,ef[s&127](l),C=c}function ORe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=XF()|0,s=URe(c)|0,hn(m,l,d,s,_Re(c,f)|0,f)}function XF(){var s=0,l=0;if(o[7872]|0||(a9(10244),ir(52,10244,U|0)|0,l=7872,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10244)|0)){s=10244,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));a9(10244)}return 10244}function URe(s){return s=s|0,s|0}function _Re(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=XF()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(o9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(HRe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function o9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function HRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=qRe(s)|0,f>>>0<B>>>0)Jr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,jRe(d,M>>3>>>0<f>>>1>>>0?O>>>0<B>>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,o9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,GRe(s,d),YRe(d),C=k;return}}function qRe(s){return s=s|0,536870911}function jRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function GRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function YRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&gt(s)}function a9(s){s=s|0,VRe(s)}function WRe(s){s=s|0,KRe(s+24|0)}function KRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function VRe(s){s=s|0;var l=0;l=Vr()|0,zr(s,1,16,l,zRe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function zRe(){return 1400}function JRe(s){return s=s|0,ZRe(n[(XRe(s)|0)>>2]|0)|0}function XRe(s){return s=s|0,(n[(XF()|0)+24>>2]|0)+(s<<3)|0}function ZRe(s){return s=s|0,$Re(nD[s&7]()|0)|0}function $Re(s){return s=s|0,s|0}function eTe(){var s=0;return o[7880]|0||(aTe(10280),ir(25,10280,U|0)|0,s=7880,n[s>>2]=1,n[s+4>>2]=0),10280}function tTe(s,l){s=s|0,l=l|0,n[s>>2]=rTe()|0,n[s+4>>2]=nTe()|0,n[s+12>>2]=l,n[s+8>>2]=iTe()|0,n[s+32>>2]=4}function rTe(){return 11711}function nTe(){return 1356}function iTe(){return Gv()|0}function sTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Pp(f,896)|0)==512?c|0&&(oTe(c),gt(c)):l|0&&(w0(l),gt(l))}function oTe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Sp(s)}function aTe(s){s=s|0,Ip(s)}function lTe(s){s=s|0,cTe(s,4920),uTe(s)|0,ATe(s)|0}function cTe(s,l){s=s|0,l=l|0;var c=0;c=xG()|0,n[s>>2]=c,FTe(c,l),bp(n[s>>2]|0)}function uTe(s){s=s|0;var l=0;return l=n[s>>2]|0,P0(l,ITe()|0),s|0}function ATe(s){s=s|0;var l=0;return l=n[s>>2]|0,P0(l,fTe()|0),s|0}function fTe(){var s=0;return o[7888]|0||(l9(10328),ir(53,10328,U|0)|0,s=7888,n[s>>2]=1,n[s+4>>2]=0),Rr(10328)|0||l9(10328),10328}function P0(s,l){s=s|0,l=l|0,hn(s,0,l,0,0,0)}function l9(s){s=s|0,gTe(s),b0(s,10)}function pTe(s){s=s|0,hTe(s+24|0)}function hTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function gTe(s){s=s|0;var l=0;l=Vr()|0,zr(s,5,1,l,ETe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function dTe(s,l,c){s=s|0,l=l|0,c=+c,mTe(s,l,c)}function b0(s,l){s=s|0,l=l|0,n[s+20>>2]=l}function mTe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,m=f+8|0,k=f+13|0,d=f,B=f+12|0,XA(k,l),n[m>>2]=ZA(k,l)|0,Fu(B,c),E[d>>3]=+Ru(B,c),yTe(s,m,d),C=f}function yTe(s,l,c){s=s|0,l=l|0,c=c|0,W(s+8|0,n[l>>2]|0,+E[c>>3]),o[s+24>>0]=1}function ETe(){return 1404}function CTe(s,l){return s=s|0,l=+l,wTe(s,l)|0}function wTe(s,l){s=s|0,l=+l;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return f=C,C=C+16|0,m=f+4|0,B=f+8|0,k=f,d=Va(8)|0,c=d,Q=Kt(16)|0,XA(m,s),s=ZA(m,s)|0,Fu(B,l),W(Q,s,+Ru(B,l)),B=c+4|0,n[B>>2]=Q,s=Kt(8)|0,B=n[B>>2]|0,n[k>>2]=0,n[m>>2]=n[k>>2],LF(s,B,m),n[d>>2]=s,C=f,c|0}function ITe(){var s=0;return o[7896]|0||(c9(10364),ir(54,10364,U|0)|0,s=7896,n[s>>2]=1,n[s+4>>2]=0),Rr(10364)|0||c9(10364),10364}function c9(s){s=s|0,DTe(s),b0(s,55)}function BTe(s){s=s|0,vTe(s+24|0)}function vTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function DTe(s){s=s|0;var l=0;l=Vr()|0,zr(s,5,4,l,xTe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function PTe(s){s=s|0,bTe(s)}function bTe(s){s=s|0,STe(s)}function STe(s){s=s|0,u9(s+8|0),o[s+24>>0]=1}function u9(s){s=s|0,n[s>>2]=0,E[s+8>>3]=0}function xTe(){return 1424}function kTe(){return QTe()|0}function QTe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Va(8)|0,s=c,f=Kt(16)|0,u9(f),m=s+4|0,n[m>>2]=f,f=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],LF(f,m,d),n[c>>2]=f,C=l,s|0}function FTe(s,l){s=s|0,l=l|0,n[s>>2]=RTe()|0,n[s+4>>2]=TTe()|0,n[s+12>>2]=l,n[s+8>>2]=NTe()|0,n[s+32>>2]=5}function RTe(){return 11710}function TTe(){return 1416}function NTe(){return Yv()|0}function LTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Pp(f,896)|0)==512?c|0&&(MTe(c),gt(c)):l|0&&gt(l)}function MTe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Sp(s)}function Yv(){var s=0;return o[7904]|0||(n[2600]=OTe()|0,n[2601]=0,s=7904,n[s>>2]=1,n[s+4>>2]=0),10400}function OTe(){return n[357]|0}function UTe(s){s=s|0,_Te(s,4926),HTe(s)|0}function _Te(s,l){s=s|0,l=l|0;var c=0;c=Z5()|0,n[s>>2]=c,ZTe(c,l),bp(n[s>>2]|0)}function HTe(s){s=s|0;var l=0;return l=n[s>>2]|0,P0(l,qTe()|0),s|0}function qTe(){var s=0;return o[7912]|0||(A9(10412),ir(56,10412,U|0)|0,s=7912,n[s>>2]=1,n[s+4>>2]=0),Rr(10412)|0||A9(10412),10412}function A9(s){s=s|0,YTe(s),b0(s,57)}function jTe(s){s=s|0,GTe(s+24|0)}function GTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function YTe(s){s=s|0;var l=0;l=Vr()|0,zr(s,5,5,l,zTe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function WTe(s){s=s|0,KTe(s)}function KTe(s){s=s|0,VTe(s)}function VTe(s){s=s|0;var l=0,c=0;l=s+8|0,c=l+48|0;do n[l>>2]=0,l=l+4|0;while((l|0)<(c|0));o[s+56>>0]=1}function zTe(){return 1432}function JTe(){return XTe()|0}function XTe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0,k=0;B=C,C=C+16|0,s=B+4|0,l=B,c=Va(8)|0,f=c,d=Kt(48)|0,m=d,k=m+48|0;do n[m>>2]=0,m=m+4|0;while((m|0)<(k|0));return m=f+4|0,n[m>>2]=d,k=Kt(8)|0,m=n[m>>2]|0,n[l>>2]=0,n[s>>2]=n[l>>2],$5(k,m,s),n[c>>2]=k,C=B,f|0}function ZTe(s,l){s=s|0,l=l|0,n[s>>2]=$Te()|0,n[s+4>>2]=eNe()|0,n[s+12>>2]=l,n[s+8>>2]=tNe()|0,n[s+32>>2]=6}function $Te(){return 11704}function eNe(){return 1436}function tNe(){return Yv()|0}function rNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Pp(f,896)|0)==512?c|0&&(nNe(c),gt(c)):l|0&&gt(l)}function nNe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Sp(s)}function iNe(s){s=s|0,sNe(s,4933),oNe(s)|0,aNe(s)|0}function sNe(s,l){s=s|0,l=l|0;var c=0;c=QNe()|0,n[s>>2]=c,FNe(c,l),bp(n[s>>2]|0)}function oNe(s){s=s|0;var l=0;return l=n[s>>2]|0,P0(l,wNe()|0),s|0}function aNe(s){s=s|0;var l=0;return l=n[s>>2]|0,P0(l,lNe()|0),s|0}function lNe(){var s=0;return o[7920]|0||(f9(10452),ir(58,10452,U|0)|0,s=7920,n[s>>2]=1,n[s+4>>2]=0),Rr(10452)|0||f9(10452),10452}function f9(s){s=s|0,ANe(s),b0(s,1)}function cNe(s){s=s|0,uNe(s+24|0)}function uNe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function ANe(s){s=s|0;var l=0;l=Vr()|0,zr(s,5,1,l,gNe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function fNe(s,l,c){s=s|0,l=+l,c=+c,pNe(s,l,c)}function pNe(s,l,c){s=s|0,l=+l,c=+c;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,m=f+8|0,k=f+17|0,d=f,B=f+16|0,Fu(k,l),E[m>>3]=+Ru(k,l),Fu(B,c),E[d>>3]=+Ru(B,c),hNe(s,m,d),C=f}function hNe(s,l,c){s=s|0,l=l|0,c=c|0,p9(s+8|0,+E[l>>3],+E[c>>3]),o[s+24>>0]=1}function p9(s,l,c){s=s|0,l=+l,c=+c,E[s>>3]=l,E[s+8>>3]=c}function gNe(){return 1472}function dNe(s,l){return s=+s,l=+l,mNe(s,l)|0}function mNe(s,l){s=+s,l=+l;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return f=C,C=C+16|0,B=f+4|0,k=f+8|0,Q=f,d=Va(8)|0,c=d,m=Kt(16)|0,Fu(B,s),s=+Ru(B,s),Fu(k,l),p9(m,s,+Ru(k,l)),k=c+4|0,n[k>>2]=m,m=Kt(8)|0,k=n[k>>2]|0,n[Q>>2]=0,n[B>>2]=n[Q>>2],h9(m,k,B),n[d>>2]=m,C=f,c|0}function h9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Kt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1452,n[c+12>>2]=l,n[s+4>>2]=c}function yNe(s){s=s|0,Md(s),gt(s)}function ENe(s){s=s|0,s=n[s+12>>2]|0,s|0&&gt(s)}function CNe(s){s=s|0,gt(s)}function wNe(){var s=0;return o[7928]|0||(g9(10488),ir(59,10488,U|0)|0,s=7928,n[s>>2]=1,n[s+4>>2]=0),Rr(10488)|0||g9(10488),10488}function g9(s){s=s|0,vNe(s),b0(s,60)}function INe(s){s=s|0,BNe(s+24|0)}function BNe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function vNe(s){s=s|0;var l=0;l=Vr()|0,zr(s,5,6,l,SNe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function DNe(s){s=s|0,PNe(s)}function PNe(s){s=s|0,bNe(s)}function bNe(s){s=s|0,d9(s+8|0),o[s+24>>0]=1}function d9(s){s=s|0,n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,n[s+12>>2]=0}function SNe(){return 1492}function xNe(){return kNe()|0}function kNe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Va(8)|0,s=c,f=Kt(16)|0,d9(f),m=s+4|0,n[m>>2]=f,f=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],h9(f,m,d),n[c>>2]=f,C=l,s|0}function QNe(){var s=0;return o[7936]|0||(ONe(10524),ir(25,10524,U|0)|0,s=7936,n[s>>2]=1,n[s+4>>2]=0),10524}function FNe(s,l){s=s|0,l=l|0,n[s>>2]=RNe()|0,n[s+4>>2]=TNe()|0,n[s+12>>2]=l,n[s+8>>2]=NNe()|0,n[s+32>>2]=7}function RNe(){return 11700}function TNe(){return 1484}function NNe(){return Yv()|0}function LNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Pp(f,896)|0)==512?c|0&&(MNe(c),gt(c)):l|0&&gt(l)}function MNe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Sp(s)}function ONe(s){s=s|0,Ip(s)}function UNe(s,l,c){s=s|0,l=l|0,c=c|0,s=pn(l)|0,l=_Ne(c)|0,c=HNe(c,0)|0,mLe(s,l,c,ZF()|0,0)}function _Ne(s){return s=s|0,s|0}function HNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=ZF()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(y9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(VNe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function ZF(){var s=0,l=0;if(o[7944]|0||(m9(10568),ir(61,10568,U|0)|0,l=7944,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10568)|0)){s=10568,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));m9(10568)}return 10568}function m9(s){s=s|0,GNe(s)}function qNe(s){s=s|0,jNe(s+24|0)}function jNe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function GNe(s){s=s|0;var l=0;l=Vr()|0,zr(s,1,17,l,dG()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function YNe(s){return s=s|0,KNe(n[(WNe(s)|0)>>2]|0)|0}function WNe(s){return s=s|0,(n[(ZF()|0)+24>>2]|0)+(s<<3)|0}function KNe(s){return s=s|0,jv(nD[s&7]()|0)|0}function y9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function VNe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=zNe(s)|0,f>>>0<B>>>0)Jr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,JNe(d,M>>3>>>0<f>>>1>>>0?O>>>0<B>>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,y9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,XNe(s,d),ZNe(d),C=k;return}}function zNe(s){return s=s|0,536870911}function JNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function XNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function ZNe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&gt(s)}function $Ne(){eLe()}function eLe(){tLe(10604)}function tLe(s){s=s|0,rLe(s,4955)}function rLe(s,l){s=s|0,l=l|0;var c=0;c=nLe()|0,n[s>>2]=c,iLe(c,l),bp(n[s>>2]|0)}function nLe(){var s=0;return o[7952]|0||(pLe(10612),ir(25,10612,U|0)|0,s=7952,n[s>>2]=1,n[s+4>>2]=0),10612}function iLe(s,l){s=s|0,l=l|0,n[s>>2]=lLe()|0,n[s+4>>2]=cLe()|0,n[s+12>>2]=l,n[s+8>>2]=uLe()|0,n[s+32>>2]=8}function bp(s){s=s|0;var l=0,c=0;l=C,C=C+16|0,c=l,Fd()|0,n[c>>2]=s,sLe(10608,c),C=l}function Fd(){return o[11714]|0||(n[2652]=0,ir(62,10608,U|0)|0,o[11714]=1),10608}function sLe(s,l){s=s|0,l=l|0;var c=0;c=Kt(8)|0,n[c+4>>2]=n[l>>2],n[c>>2]=n[s>>2],n[s>>2]=c}function oLe(s){s=s|0,aLe(s)}function aLe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,gt(c);while(l|0);n[s>>2]=0}function lLe(){return 11715}function cLe(){return 1496}function uLe(){return Gv()|0}function ALe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Pp(f,896)|0)==512?c|0&&(fLe(c),gt(c)):l|0&&gt(l)}function fLe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Sp(s)}function pLe(s){s=s|0,Ip(s)}function hLe(s,l){s=s|0,l=l|0;var c=0,f=0;Fd()|0,c=n[2652]|0;e:do if(c|0){for(;f=n[c+4>>2]|0,!(f|0&&!($9($F(f)|0,s)|0));)if(c=n[c>>2]|0,!c)break e;gLe(f,l)}while(!1)}function $F(s){return s=s|0,n[s+12>>2]|0}function gLe(s,l){s=s|0,l=l|0;var c=0;s=s+36|0,c=n[s>>2]|0,c|0&&(qA(c),gt(c)),c=Kt(4)|0,W5(c,l),n[s>>2]=c}function eR(){return o[11716]|0||(n[2664]=0,ir(63,10656,U|0)|0,o[11716]=1),10656}function E9(){var s=0;return o[11717]|0?s=n[2665]|0:(dLe(),n[2665]=1504,o[11717]=1,s=1504),s|0}function dLe(){o[11740]|0||(o[11718]=gr(gr(8,0)|0,0)|0,o[11719]=gr(gr(0,0)|0,0)|0,o[11720]=gr(gr(0,16)|0,0)|0,o[11721]=gr(gr(8,0)|0,0)|0,o[11722]=gr(gr(0,0)|0,0)|0,o[11723]=gr(gr(8,0)|0,0)|0,o[11724]=gr(gr(0,0)|0,0)|0,o[11725]=gr(gr(8,0)|0,0)|0,o[11726]=gr(gr(0,0)|0,0)|0,o[11727]=gr(gr(8,0)|0,0)|0,o[11728]=gr(gr(0,0)|0,0)|0,o[11729]=gr(gr(0,0)|0,32)|0,o[11730]=gr(gr(0,0)|0,32)|0,o[11740]=1)}function C9(){return 1572}function mLe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,O=0,M=0;m=C,C=C+32|0,M=m+16|0,O=m+12|0,Q=m+8|0,k=m+4|0,B=m,n[M>>2]=s,n[O>>2]=l,n[Q>>2]=c,n[k>>2]=f,n[B>>2]=d,eR()|0,yLe(10656,M,O,Q,k,B),C=m}function yLe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0;B=Kt(24)|0,z5(B+4|0,n[l>>2]|0,n[c>>2]|0,n[f>>2]|0,n[d>>2]|0,n[m>>2]|0),n[B>>2]=n[s>>2],n[s>>2]=B}function w9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0,je=0,Oe=0,Qe=0,$e=0,Je=0,lt=0;if(lt=C,C=C+32|0,Oe=lt+20|0,Qe=lt+8|0,$e=lt+4|0,Je=lt,l=n[l>>2]|0,l|0){je=Oe+4|0,Q=Oe+8|0,O=Qe+4|0,M=Qe+8|0,j=Qe+8|0,se=Oe+8|0;do{if(B=l+4|0,k=tR(B)|0,k|0){if(d=yw(k)|0,n[Oe>>2]=0,n[je>>2]=0,n[Q>>2]=0,f=(Ew(k)|0)+1|0,ELe(Oe,f),f|0)for(;f=f+-1|0,xc(Qe,n[d>>2]|0),m=n[je>>2]|0,m>>>0<(n[se>>2]|0)>>>0?(n[m>>2]=n[Qe>>2],n[je>>2]=(n[je>>2]|0)+4):rR(Oe,Qe),f;)d=d+4|0;f=Cw(k)|0,n[Qe>>2]=0,n[O>>2]=0,n[M>>2]=0;e:do if(n[f>>2]|0)for(d=0,m=0;;){if((d|0)==(m|0)?CLe(Qe,f):(n[d>>2]=n[f>>2],n[O>>2]=(n[O>>2]|0)+4),f=f+4|0,!(n[f>>2]|0))break e;d=n[O>>2]|0,m=n[j>>2]|0}while(!1);n[$e>>2]=Wv(B)|0,n[Je>>2]=Rr(k)|0,wLe(c,s,$e,Je,Oe,Qe),nR(Qe),$A(Oe)}l=n[l>>2]|0}while(l|0)}C=lt}function tR(s){return s=s|0,n[s+12>>2]|0}function yw(s){return s=s|0,n[s+12>>2]|0}function Ew(s){return s=s|0,n[s+16>>2]|0}function ELe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+32|0,c=d,f=n[s>>2]|0,(n[s+8>>2]|0)-f>>2>>>0<l>>>0&&(x9(c,l,(n[s+4>>2]|0)-f>>2,s+8|0),k9(s,c),Q9(c)),C=d}function rR(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0;if(B=C,C=C+32|0,c=B,f=s+4|0,d=((n[f>>2]|0)-(n[s>>2]|0)>>2)+1|0,m=S9(s)|0,m>>>0<d>>>0)Jr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,Q=O>>1,x9(c,O>>2>>>0<m>>>1>>>0?Q>>>0<d>>>0?d:Q:m,(n[f>>2]|0)-k>>2,s+8|0),m=c+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,k9(s,c),Q9(c),C=B;return}}function Cw(s){return s=s|0,n[s+8>>2]|0}function CLe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0;if(B=C,C=C+32|0,c=B,f=s+4|0,d=((n[f>>2]|0)-(n[s>>2]|0)>>2)+1|0,m=b9(s)|0,m>>>0<d>>>0)Jr(s);else{k=n[s>>2]|0,O=(n[s+8>>2]|0)-k|0,Q=O>>1,_Le(c,O>>2>>>0<m>>>1>>>0?Q>>>0<d>>>0?d:Q:m,(n[f>>2]|0)-k>>2,s+8|0),m=c+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,HLe(s,c),qLe(c),C=B;return}}function Wv(s){return s=s|0,n[s>>2]|0}function wLe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,ILe(s,l,c,f,d,m)}function nR(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),gt(c))}function $A(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),gt(c))}function ILe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,O=0,M=0,j=0;B=C,C=C+48|0,M=B+40|0,k=B+32|0,j=B+24|0,Q=B+12|0,O=B,za(k),s=ya(s)|0,n[j>>2]=n[l>>2],c=n[c>>2]|0,f=n[f>>2]|0,iR(Q,d),BLe(O,m),n[M>>2]=n[j>>2],vLe(s,M,c,f,Q,O),nR(O),$A(Q),Ja(k),C=B}function iR(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(OLe(s,f),ULe(s,n[l>>2]|0,n[c>>2]|0,f))}function BLe(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(LLe(s,f),MLe(s,n[l>>2]|0,n[c>>2]|0,f))}function vLe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,O=0,M=0,j=0;B=C,C=C+32|0,M=B+28|0,j=B+24|0,k=B+12|0,Q=B,O=Pl(DLe()|0)|0,n[j>>2]=n[l>>2],n[M>>2]=n[j>>2],l=S0(M)|0,c=I9(c)|0,f=sR(f)|0,n[k>>2]=n[d>>2],M=d+4|0,n[k+4>>2]=n[M>>2],j=d+8|0,n[k+8>>2]=n[j>>2],n[j>>2]=0,n[M>>2]=0,n[d>>2]=0,d=oR(k)|0,n[Q>>2]=n[m>>2],M=m+4|0,n[Q+4>>2]=n[M>>2],j=m+8|0,n[Q+8>>2]=n[j>>2],n[j>>2]=0,n[M>>2]=0,n[m>>2]=0,ao(0,O|0,s|0,l|0,c|0,f|0,d|0,PLe(Q)|0)|0,nR(Q),$A(k),C=B}function DLe(){var s=0;return o[7968]|0||(TLe(10708),s=7968,n[s>>2]=1,n[s+4>>2]=0),10708}function S0(s){return s=s|0,v9(s)|0}function I9(s){return s=s|0,B9(s)|0}function sR(s){return s=s|0,jv(s)|0}function oR(s){return s=s|0,SLe(s)|0}function PLe(s){return s=s|0,bLe(s)|0}function bLe(s){s=s|0;var l=0,c=0,f=0;if(f=(n[s+4>>2]|0)-(n[s>>2]|0)|0,c=f>>2,f=Va(f+4|0)|0,n[f>>2]=c,c|0){l=0;do n[f+4+(l<<2)>>2]=B9(n[(n[s>>2]|0)+(l<<2)>>2]|0)|0,l=l+1|0;while((l|0)!=(c|0))}return f|0}function B9(s){return s=s|0,s|0}function SLe(s){s=s|0;var l=0,c=0,f=0;if(f=(n[s+4>>2]|0)-(n[s>>2]|0)|0,c=f>>2,f=Va(f+4|0)|0,n[f>>2]=c,c|0){l=0;do n[f+4+(l<<2)>>2]=v9((n[s>>2]|0)+(l<<2)|0)|0,l=l+1|0;while((l|0)!=(c|0))}return f|0}function v9(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=yF(D9()|0)|0,f?(EF(l,f),CF(c,l),uUe(s,c),s=wF(l)|0):s=xLe(s)|0,C=d,s|0}function D9(){var s=0;return o[7960]|0||(RLe(10664),ir(25,10664,U|0)|0,s=7960,n[s>>2]=1,n[s+4>>2]=0),10664}function xLe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Va(8)|0,l=f,k=Kt(4)|0,n[k>>2]=n[s>>2],m=l+4|0,n[m>>2]=k,s=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],P9(s,m,d),n[f>>2]=s,C=c,l|0}function P9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Kt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1656,n[c+12>>2]=l,n[s+4>>2]=c}function kLe(s){s=s|0,Md(s),gt(s)}function QLe(s){s=s|0,s=n[s+12>>2]|0,s|0&&gt(s)}function FLe(s){s=s|0,gt(s)}function RLe(s){s=s|0,Ip(s)}function TLe(s){s=s|0,bl(s,NLe()|0,5)}function NLe(){return 1676}function LLe(s,l){s=s|0,l=l|0;var c=0;if((b9(s)|0)>>>0<l>>>0&&Jr(s),l>>>0>1073741823)Tt();else{c=Kt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function MLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(Dr(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function b9(s){return s=s|0,1073741823}function OLe(s,l){s=s|0,l=l|0;var c=0;if((S9(s)|0)>>>0<l>>>0&&Jr(s),l>>>0>1073741823)Tt();else{c=Kt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function ULe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(Dr(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function S9(s){return s=s|0,1073741823}function _Le(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Tt();else{d=Kt(l<<2)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function HLe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function qLe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&&gt(s)}function x9(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Tt();else{d=Kt(l<<2)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function k9(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Q9(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&&gt(s)}function jLe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0,je=0,Oe=0,Qe=0;if(Qe=C,C=C+32|0,M=Qe+20|0,j=Qe+12|0,O=Qe+16|0,se=Qe+4|0,je=Qe,Oe=Qe+8|0,k=E9()|0,m=n[k>>2]|0,B=n[m>>2]|0,B|0)for(Q=n[k+8>>2]|0,k=n[k+4>>2]|0;xc(M,B),GLe(s,M,k,Q),m=m+4|0,B=n[m>>2]|0,B;)Q=Q+1|0,k=k+1|0;if(m=C9()|0,B=n[m>>2]|0,B|0)do xc(M,B),n[j>>2]=n[m+4>>2],YLe(l,M,j),m=m+8|0,B=n[m>>2]|0;while(B|0);if(m=n[(Fd()|0)>>2]|0,m|0)do l=n[m+4>>2]|0,xc(M,n[(Rd(l)|0)>>2]|0),n[j>>2]=$F(l)|0,WLe(c,M,j),m=n[m>>2]|0;while(m|0);if(xc(O,0),m=eR()|0,n[M>>2]=n[O>>2],w9(M,m,d),m=n[(Fd()|0)>>2]|0,m|0){s=M+4|0,l=M+8|0,c=M+8|0;do{if(Q=n[m+4>>2]|0,xc(j,n[(Rd(Q)|0)>>2]|0),KLe(se,F9(Q)|0),B=n[se>>2]|0,B|0){n[M>>2]=0,n[s>>2]=0,n[l>>2]=0;do xc(je,n[(Rd(n[B+4>>2]|0)|0)>>2]|0),k=n[s>>2]|0,k>>>0<(n[c>>2]|0)>>>0?(n[k>>2]=n[je>>2],n[s>>2]=(n[s>>2]|0)+4):rR(M,je),B=n[B>>2]|0;while(B|0);VLe(f,j,M),$A(M)}n[Oe>>2]=n[j>>2],O=R9(Q)|0,n[M>>2]=n[Oe>>2],w9(M,O,d),tG(se),m=n[m>>2]|0}while(m|0)}C=Qe}function GLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,oMe(s,l,c,f)}function YLe(s,l,c){s=s|0,l=l|0,c=c|0,sMe(s,l,c)}function Rd(s){return s=s|0,s|0}function WLe(s,l,c){s=s|0,l=l|0,c=c|0,tMe(s,l,c)}function F9(s){return s=s|0,s+16|0}function KLe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;if(m=C,C=C+16|0,d=m+8|0,c=m,n[s>>2]=0,f=n[l>>2]|0,n[d>>2]=f,n[c>>2]=s,c=eMe(c)|0,f|0){if(f=Kt(12)|0,B=(T9(d)|0)+4|0,s=n[B+4>>2]|0,l=f+4|0,n[l>>2]=n[B>>2],n[l+4>>2]=s,l=n[n[d>>2]>>2]|0,n[d>>2]=l,!l)s=f;else for(l=f;s=Kt(12)|0,Q=(T9(d)|0)+4|0,k=n[Q+4>>2]|0,B=s+4|0,n[B>>2]=n[Q>>2],n[B+4>>2]=k,n[l>>2]=s,B=n[n[d>>2]>>2]|0,n[d>>2]=B,B;)l=s;n[s>>2]=n[c>>2],n[c>>2]=f}C=m}function VLe(s,l,c){s=s|0,l=l|0,c=c|0,zLe(s,l,c)}function R9(s){return s=s|0,s+24|0}function zLe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,B=f+24|0,d=f+16|0,k=f+12|0,m=f,za(d),s=ya(s)|0,n[k>>2]=n[l>>2],iR(m,c),n[B>>2]=n[k>>2],JLe(s,B,m),$A(m),Ja(d),C=f}function JLe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,B=f+16|0,k=f+12|0,d=f,m=Pl(XLe()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=S0(B)|0,n[d>>2]=n[c>>2],B=c+4|0,n[d+4>>2]=n[B>>2],k=c+8|0,n[d+8>>2]=n[k>>2],n[k>>2]=0,n[B>>2]=0,n[c>>2]=0,oo(0,m|0,s|0,l|0,oR(d)|0)|0,$A(d),C=f}function XLe(){var s=0;return o[7976]|0||(ZLe(10720),s=7976,n[s>>2]=1,n[s+4>>2]=0),10720}function ZLe(s){s=s|0,bl(s,$Le()|0,2)}function $Le(){return 1732}function eMe(s){return s=s|0,n[s>>2]|0}function T9(s){return s=s|0,n[s>>2]|0}function tMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+32|0,m=f+16|0,d=f+8|0,B=f,za(d),s=ya(s)|0,n[B>>2]=n[l>>2],c=n[c>>2]|0,n[m>>2]=n[B>>2],N9(s,m,c),Ja(d),C=f}function N9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,m=f+4|0,B=f,d=Pl(rMe()|0)|0,n[B>>2]=n[l>>2],n[m>>2]=n[B>>2],l=S0(m)|0,oo(0,d|0,s|0,l|0,I9(c)|0)|0,C=f}function rMe(){var s=0;return o[7984]|0||(nMe(10732),s=7984,n[s>>2]=1,n[s+4>>2]=0),10732}function nMe(s){s=s|0,bl(s,iMe()|0,2)}function iMe(){return 1744}function sMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+32|0,m=f+16|0,d=f+8|0,B=f,za(d),s=ya(s)|0,n[B>>2]=n[l>>2],c=n[c>>2]|0,n[m>>2]=n[B>>2],N9(s,m,c),Ja(d),C=f}function oMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+32|0,B=d+16|0,m=d+8|0,k=d,za(m),s=ya(s)|0,n[k>>2]=n[l>>2],c=o[c>>0]|0,f=o[f>>0]|0,n[B>>2]=n[k>>2],aMe(s,B,c,f),Ja(m),C=d}function aMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,B=d+4|0,k=d,m=Pl(lMe()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=S0(B)|0,c=Td(c)|0,hc(0,m|0,s|0,l|0,c|0,Td(f)|0)|0,C=d}function lMe(){var s=0;return o[7992]|0||(uMe(10744),s=7992,n[s>>2]=1,n[s+4>>2]=0),10744}function Td(s){return s=s|0,cMe(s)|0}function cMe(s){return s=s|0,s&255|0}function uMe(s){s=s|0,bl(s,AMe()|0,3)}function AMe(){return 1756}function fMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;switch(se=C,C=C+32|0,k=se+8|0,Q=se+4|0,O=se+20|0,M=se,DF(s,0),f=cUe(l)|0,n[k>>2]=0,j=k+4|0,n[j>>2]=0,n[k+8>>2]=0,f<<24>>24){case 0:{o[O>>0]=0,pMe(Q,c,O),Kv(s,Q)|0,jA(Q);break}case 8:{j=fR(l)|0,o[O>>0]=8,xc(M,n[j+4>>2]|0),hMe(Q,c,O,M,j+8|0),Kv(s,Q)|0,jA(Q);break}case 9:{if(m=fR(l)|0,l=n[m+4>>2]|0,l|0)for(B=k+8|0,d=m+12|0;l=l+-1|0,xc(Q,n[d>>2]|0),f=n[j>>2]|0,f>>>0<(n[B>>2]|0)>>>0?(n[f>>2]=n[Q>>2],n[j>>2]=(n[j>>2]|0)+4):rR(k,Q),l;)d=d+4|0;o[O>>0]=9,xc(M,n[m+8>>2]|0),gMe(Q,c,O,M,k),Kv(s,Q)|0,jA(Q);break}default:j=fR(l)|0,o[O>>0]=f,xc(M,n[j+4>>2]|0),dMe(Q,c,O,M),Kv(s,Q)|0,jA(Q)}$A(k),C=se}function pMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,za(d),l=ya(l)|0,xMe(s,l,o[c>>0]|0),Ja(d),C=f}function Kv(s,l){s=s|0,l=l|0;var c=0;return c=n[s>>2]|0,c|0&&PA(c|0),n[s>>2]=n[l>>2],n[l>>2]=0,s|0}function hMe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0;m=C,C=C+32|0,k=m+16|0,B=m+8|0,Q=m,za(B),l=ya(l)|0,c=o[c>>0]|0,n[Q>>2]=n[f>>2],d=n[d>>2]|0,n[k>>2]=n[Q>>2],DMe(s,l,c,k,d),Ja(B),C=m}function gMe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,O=0;m=C,C=C+32|0,Q=m+24|0,B=m+16|0,O=m+12|0,k=m,za(B),l=ya(l)|0,c=o[c>>0]|0,n[O>>2]=n[f>>2],iR(k,d),n[Q>>2]=n[O>>2],wMe(s,l,c,Q,k),$A(k),Ja(B),C=m}function dMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+32|0,B=d+16|0,m=d+8|0,k=d,za(m),l=ya(l)|0,c=o[c>>0]|0,n[k>>2]=n[f>>2],n[B>>2]=n[k>>2],mMe(s,l,c,B),Ja(m),C=d}function mMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+4|0,k=d,B=Pl(yMe()|0)|0,c=Td(c)|0,n[k>>2]=n[f>>2],n[m>>2]=n[k>>2],Vv(s,oo(0,B|0,l|0,c|0,S0(m)|0)|0),C=d}function yMe(){var s=0;return o[8e3]|0||(EMe(10756),s=8e3,n[s>>2]=1,n[s+4>>2]=0),10756}function Vv(s,l){s=s|0,l=l|0,DF(s,l)}function EMe(s){s=s|0,bl(s,CMe()|0,2)}function CMe(){return 1772}function wMe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,O=0;m=C,C=C+32|0,Q=m+16|0,O=m+12|0,B=m,k=Pl(IMe()|0)|0,c=Td(c)|0,n[O>>2]=n[f>>2],n[Q>>2]=n[O>>2],f=S0(Q)|0,n[B>>2]=n[d>>2],Q=d+4|0,n[B+4>>2]=n[Q>>2],O=d+8|0,n[B+8>>2]=n[O>>2],n[O>>2]=0,n[Q>>2]=0,n[d>>2]=0,Vv(s,hc(0,k|0,l|0,c|0,f|0,oR(B)|0)|0),$A(B),C=m}function IMe(){var s=0;return o[8008]|0||(BMe(10768),s=8008,n[s>>2]=1,n[s+4>>2]=0),10768}function BMe(s){s=s|0,bl(s,vMe()|0,3)}function vMe(){return 1784}function DMe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0;m=C,C=C+16|0,k=m+4|0,Q=m,B=Pl(PMe()|0)|0,c=Td(c)|0,n[Q>>2]=n[f>>2],n[k>>2]=n[Q>>2],f=S0(k)|0,Vv(s,hc(0,B|0,l|0,c|0,f|0,sR(d)|0)|0),C=m}function PMe(){var s=0;return o[8016]|0||(bMe(10780),s=8016,n[s>>2]=1,n[s+4>>2]=0),10780}function bMe(s){s=s|0,bl(s,SMe()|0,3)}function SMe(){return 1800}function xMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=Pl(kMe()|0)|0,Vv(s,Qn(0,f|0,l|0,Td(c)|0)|0)}function kMe(){var s=0;return o[8024]|0||(QMe(10792),s=8024,n[s>>2]=1,n[s+4>>2]=0),10792}function QMe(s){s=s|0,bl(s,FMe()|0,1)}function FMe(){return 1816}function RMe(){TMe(),NMe(),LMe()}function TMe(){n[2702]=c7(65536)|0}function NMe(){rOe(10856)}function LMe(){MMe(10816)}function MMe(s){s=s|0,OMe(s,5044),UMe(s)|0}function OMe(s,l){s=s|0,l=l|0;var c=0;c=D9()|0,n[s>>2]=c,JMe(c,l),bp(n[s>>2]|0)}function UMe(s){s=s|0;var l=0;return l=n[s>>2]|0,P0(l,_Me()|0),s|0}function _Me(){var s=0;return o[8032]|0||(L9(10820),ir(64,10820,U|0)|0,s=8032,n[s>>2]=1,n[s+4>>2]=0),Rr(10820)|0||L9(10820),10820}function L9(s){s=s|0,jMe(s),b0(s,25)}function HMe(s){s=s|0,qMe(s+24|0)}function qMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function jMe(s){s=s|0;var l=0;l=Vr()|0,zr(s,5,18,l,KMe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function GMe(s,l){s=s|0,l=l|0,YMe(s,l)}function YMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;c=C,C=C+16|0,f=c,d=c+4|0,v0(d,l),n[f>>2]=D0(d,l)|0,WMe(s,f),C=c}function WMe(s,l){s=s|0,l=l|0,M9(s+4|0,n[l>>2]|0),o[s+8>>0]=1}function M9(s,l){s=s|0,l=l|0,n[s>>2]=l}function KMe(){return 1824}function VMe(s){return s=s|0,zMe(s)|0}function zMe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Va(8)|0,l=f,k=Kt(4)|0,v0(d,s),M9(k,D0(d,s)|0),m=l+4|0,n[m>>2]=k,s=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],P9(s,m,d),n[f>>2]=s,C=c,l|0}function Va(s){s=s|0;var l=0,c=0;return s=s+7&-8,s>>>0<=32768&&(l=n[2701]|0,s>>>0<=(65536-l|0)>>>0)?(c=(n[2702]|0)+l|0,n[2701]=l+s,s=c):(s=c7(s+8|0)|0,n[s>>2]=n[2703],n[2703]=s,s=s+8|0),s|0}function JMe(s,l){s=s|0,l=l|0,n[s>>2]=XMe()|0,n[s+4>>2]=ZMe()|0,n[s+12>>2]=l,n[s+8>>2]=$Me()|0,n[s+32>>2]=9}function XMe(){return 11744}function ZMe(){return 1832}function $Me(){return Yv()|0}function eOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Pp(f,896)|0)==512?c|0&&(tOe(c),gt(c)):l|0&&gt(l)}function tOe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Sp(s)}function rOe(s){s=s|0,nOe(s,5052),iOe(s)|0,sOe(s,5058,26)|0,oOe(s,5069,1)|0,aOe(s,5077,10)|0,lOe(s,5087,19)|0,cOe(s,5094,27)|0}function nOe(s,l){s=s|0,l=l|0;var c=0;c=tUe()|0,n[s>>2]=c,rUe(c,l),bp(n[s>>2]|0)}function iOe(s){s=s|0;var l=0;return l=n[s>>2]|0,P0(l,H4e()|0),s|0}function sOe(s,l,c){return s=s|0,l=l|0,c=c|0,B4e(s,pn(l)|0,c,0),s|0}function oOe(s,l,c){return s=s|0,l=l|0,c=c|0,l4e(s,pn(l)|0,c,0),s|0}function aOe(s,l,c){return s=s|0,l=l|0,c=c|0,_Oe(s,pn(l)|0,c,0),s|0}function lOe(s,l,c){return s=s|0,l=l|0,c=c|0,DOe(s,pn(l)|0,c,0),s|0}function O9(s,l){s=s|0,l=l|0;var c=0,f=0;e:for(;;){for(c=n[2703]|0;;){if((c|0)==(l|0))break e;if(f=n[c>>2]|0,n[2703]=f,!c)c=f;else break}gt(c)}n[2701]=s}function cOe(s,l,c){return s=s|0,l=l|0,c=c|0,uOe(s,pn(l)|0,c,0),s|0}function uOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=aR()|0,s=AOe(c)|0,hn(m,l,d,s,fOe(c,f)|0,f)}function aR(){var s=0,l=0;if(o[8040]|0||(_9(10860),ir(65,10860,U|0)|0,l=8040,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10860)|0)){s=10860,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));_9(10860)}return 10860}function AOe(s){return s=s|0,s|0}function fOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=aR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(U9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(pOe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function U9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function pOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=hOe(s)|0,f>>>0<B>>>0)Jr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,gOe(d,M>>3>>>0<f>>>1>>>0?O>>>0<B>>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,U9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,dOe(s,d),mOe(d),C=k;return}}function hOe(s){return s=s|0,536870911}function gOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function dOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function mOe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&gt(s)}function _9(s){s=s|0,COe(s)}function yOe(s){s=s|0,EOe(s+24|0)}function EOe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function COe(s){s=s|0;var l=0;l=Vr()|0,zr(s,1,11,l,wOe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function wOe(){return 1840}function IOe(s,l,c){s=s|0,l=l|0,c=c|0,vOe(n[(BOe(s)|0)>>2]|0,l,c)}function BOe(s){return s=s|0,(n[(aR()|0)+24>>2]|0)+(s<<3)|0}function vOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;f=C,C=C+16|0,m=f+1|0,d=f,v0(m,l),l=D0(m,l)|0,v0(d,c),c=D0(d,c)|0,tf[s&31](l,c),C=f}function DOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=lR()|0,s=POe(c)|0,hn(m,l,d,s,bOe(c,f)|0,f)}function lR(){var s=0,l=0;if(o[8048]|0||(q9(10896),ir(66,10896,U|0)|0,l=8048,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10896)|0)){s=10896,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));q9(10896)}return 10896}function POe(s){return s=s|0,s|0}function bOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=lR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(H9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(SOe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function H9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function SOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=xOe(s)|0,f>>>0<B>>>0)Jr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,kOe(d,M>>3>>>0<f>>>1>>>0?O>>>0<B>>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,H9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,QOe(s,d),FOe(d),C=k;return}}function xOe(s){return s=s|0,536870911}function kOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function QOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function FOe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&gt(s)}function q9(s){s=s|0,NOe(s)}function ROe(s){s=s|0,TOe(s+24|0)}function TOe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function NOe(s){s=s|0;var l=0;l=Vr()|0,zr(s,1,11,l,LOe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function LOe(){return 1852}function MOe(s,l){return s=s|0,l=l|0,UOe(n[(OOe(s)|0)>>2]|0,l)|0}function OOe(s){return s=s|0,(n[(lR()|0)+24>>2]|0)+(s<<3)|0}function UOe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,v0(f,l),l=D0(f,l)|0,l=jv(F0[s&31](l)|0)|0,C=c,l|0}function _Oe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=cR()|0,s=HOe(c)|0,hn(m,l,d,s,qOe(c,f)|0,f)}function cR(){var s=0,l=0;if(o[8056]|0||(G9(10932),ir(67,10932,U|0)|0,l=8056,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10932)|0)){s=10932,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));G9(10932)}return 10932}function HOe(s){return s=s|0,s|0}function qOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=cR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(j9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(jOe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function j9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function jOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=GOe(s)|0,f>>>0<B>>>0)Jr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,YOe(d,M>>3>>>0<f>>>1>>>0?O>>>0<B>>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,j9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,WOe(s,d),KOe(d),C=k;return}}function GOe(s){return s=s|0,536870911}function YOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function WOe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function KOe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&gt(s)}function G9(s){s=s|0,JOe(s)}function VOe(s){s=s|0,zOe(s+24|0)}function zOe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function JOe(s){s=s|0;var l=0;l=Vr()|0,zr(s,1,7,l,XOe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function XOe(){return 1860}function ZOe(s,l,c){return s=s|0,l=l|0,c=c|0,e4e(n[($Oe(s)|0)>>2]|0,l,c)|0}function $Oe(s){return s=s|0,(n[(cR()|0)+24>>2]|0)+(s<<3)|0}function e4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0;return f=C,C=C+32|0,B=f+12|0,m=f+8|0,k=f,Q=f+16|0,d=f+4|0,t4e(Q,l),r4e(k,Q,l),Bp(d,c),c=vp(d,c)|0,n[B>>2]=n[k>>2],vw[s&15](m,B,c),c=n4e(m)|0,jA(m),Dp(d),C=f,c|0}function t4e(s,l){s=s|0,l=l|0}function r4e(s,l,c){s=s|0,l=l|0,c=c|0,i4e(s,c)}function n4e(s){return s=s|0,ya(s)|0}function i4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+16|0,c=d,f=l,f&1?(s4e(c,0),ii(f|0,c|0)|0,o4e(s,c),a4e(c)):n[s>>2]=n[l>>2],C=d}function s4e(s,l){s=s|0,l=l|0,K5(s,l),n[s+4>>2]=0,o[s+8>>0]=0}function o4e(s,l){s=s|0,l=l|0,n[s>>2]=n[l+4>>2]}function a4e(s){s=s|0,o[s+8>>0]=0}function l4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=uR()|0,s=c4e(c)|0,hn(m,l,d,s,u4e(c,f)|0,f)}function uR(){var s=0,l=0;if(o[8064]|0||(W9(10968),ir(68,10968,U|0)|0,l=8064,n[l>>2]=1,n[l+4>>2]=0),!(Rr(10968)|0)){s=10968,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));W9(10968)}return 10968}function c4e(s){return s=s|0,s|0}function u4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=uR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(Y9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(A4e(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function Y9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function A4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=f4e(s)|0,f>>>0<B>>>0)Jr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,p4e(d,M>>3>>>0<f>>>1>>>0?O>>>0<B>>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,Y9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,h4e(s,d),g4e(d),C=k;return}}function f4e(s){return s=s|0,536870911}function p4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function h4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function g4e(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&gt(s)}function W9(s){s=s|0,y4e(s)}function d4e(s){s=s|0,m4e(s+24|0)}function m4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function y4e(s){s=s|0;var l=0;l=Vr()|0,zr(s,1,1,l,E4e()|0,5),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function E4e(){return 1872}function C4e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,I4e(n[(w4e(s)|0)>>2]|0,l,c,f,d,m)}function w4e(s){return s=s|0,(n[(uR()|0)+24>>2]|0)+(s<<3)|0}function I4e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,O=0,M=0,j=0;B=C,C=C+32|0,k=B+16|0,Q=B+12|0,O=B+8|0,M=B+4|0,j=B,Bp(k,l),l=vp(k,l)|0,Bp(Q,c),c=vp(Q,c)|0,Bp(O,f),f=vp(O,f)|0,Bp(M,d),d=vp(M,d)|0,Bp(j,m),m=vp(j,m)|0,h7[s&1](l,c,f,d,m),Dp(j),Dp(M),Dp(O),Dp(Q),Dp(k),C=B}function B4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=AR()|0,s=v4e(c)|0,hn(m,l,d,s,D4e(c,f)|0,f)}function AR(){var s=0,l=0;if(o[8072]|0||(V9(11004),ir(69,11004,U|0)|0,l=8072,n[l>>2]=1,n[l+4>>2]=0),!(Rr(11004)|0)){s=11004,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));V9(11004)}return 11004}function v4e(s){return s=s|0,s|0}function D4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,Q=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,Q=AR()|0,B=Q+24|0,l=gr(l,4)|0,n[m>>2]=l,c=Q+28|0,f=n[c>>2]|0,f>>>0<(n[Q+32>>2]|0)>>>0?(K9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(P4e(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function K9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function P4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=b4e(s)|0,f>>>0<B>>>0)Jr(s);else{Q=n[s>>2]|0,M=(n[s+8>>2]|0)-Q|0,O=M>>2,S4e(d,M>>3>>>0<f>>>1>>>0?O>>>0<B>>>0?B:O:f,(n[m>>2]|0)-Q>>3,s+8|0),B=d+8|0,K9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,x4e(s,d),k4e(d),C=k;return}}function b4e(s){return s=s|0,536870911}function S4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Kt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function x4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(Dr(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function k4e(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&gt(s)}function V9(s){s=s|0,R4e(s)}function Q4e(s){s=s|0,F4e(s+24|0)}function F4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function R4e(s){s=s|0;var l=0;l=Vr()|0,zr(s,1,12,l,T4e()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function T4e(){return 1896}function N4e(s,l,c){s=s|0,l=l|0,c=c|0,M4e(n[(L4e(s)|0)>>2]|0,l,c)}function L4e(s){return s=s|0,(n[(AR()|0)+24>>2]|0)+(s<<3)|0}function M4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;f=C,C=C+16|0,m=f+4|0,d=f,O4e(m,l),l=U4e(m,l)|0,Bp(d,c),c=vp(d,c)|0,tf[s&31](l,c),Dp(d),C=f}function O4e(s,l){s=s|0,l=l|0}function U4e(s,l){return s=s|0,l=l|0,_4e(l)|0}function _4e(s){return s=s|0,s|0}function H4e(){var s=0;return o[8080]|0||(z9(11040),ir(70,11040,U|0)|0,s=8080,n[s>>2]=1,n[s+4>>2]=0),Rr(11040)|0||z9(11040),11040}function z9(s){s=s|0,G4e(s),b0(s,71)}function q4e(s){s=s|0,j4e(s+24|0)}function j4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),gt(c))}function G4e(s){s=s|0;var l=0;l=Vr()|0,zr(s,5,7,l,V4e()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Y4e(s){s=s|0,W4e(s)}function W4e(s){s=s|0,K4e(s)}function K4e(s){s=s|0,o[s+8>>0]=1}function V4e(){return 1936}function z4e(){return J4e()|0}function J4e(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Va(8)|0,s=c,m=s+4|0,n[m>>2]=Kt(1)|0,f=Kt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],X4e(f,m,d),n[c>>2]=f,C=l,s|0}function X4e(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Kt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1916,n[c+12>>2]=l,n[s+4>>2]=c}function Z4e(s){s=s|0,Md(s),gt(s)}function $4e(s){s=s|0,s=n[s+12>>2]|0,s|0&&gt(s)}function eUe(s){s=s|0,gt(s)}function tUe(){var s=0;return o[8088]|0||(lUe(11076),ir(25,11076,U|0)|0,s=8088,n[s>>2]=1,n[s+4>>2]=0),11076}function rUe(s,l){s=s|0,l=l|0,n[s>>2]=nUe()|0,n[s+4>>2]=iUe()|0,n[s+12>>2]=l,n[s+8>>2]=sUe()|0,n[s+32>>2]=10}function nUe(){return 11745}function iUe(){return 1940}function sUe(){return Gv()|0}function oUe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Pp(f,896)|0)==512?c|0&&(aUe(c),gt(c)):l|0&&gt(l)}function aUe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Sp(s)}function lUe(s){s=s|0,Ip(s)}function xc(s,l){s=s|0,l=l|0,n[s>>2]=l}function fR(s){return s=s|0,n[s>>2]|0}function cUe(s){return s=s|0,o[n[s>>2]>>0]|0}function uUe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,n[f>>2]=n[s>>2],AUe(l,f)|0,C=c}function AUe(s,l){s=s|0,l=l|0;var c=0;return c=fUe(n[s>>2]|0,l)|0,l=s+4|0,n[(n[l>>2]|0)+8>>2]=c,n[(n[l>>2]|0)+8>>2]|0}function fUe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,za(f),s=ya(s)|0,l=pUe(s,n[l>>2]|0)|0,Ja(f),C=c,l|0}function za(s){s=s|0,n[s>>2]=n[2701],n[s+4>>2]=n[2703]}function pUe(s,l){s=s|0,l=l|0;var c=0;return c=Pl(hUe()|0)|0,Qn(0,c|0,s|0,sR(l)|0)|0}function Ja(s){s=s|0,O9(n[s>>2]|0,n[s+4>>2]|0)}function hUe(){var s=0;return o[8096]|0||(gUe(11120),s=8096,n[s>>2]=1,n[s+4>>2]=0),11120}function gUe(s){s=s|0,bl(s,dUe()|0,1)}function dUe(){return 1948}function mUe(){yUe()}function yUe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0,je=0,Oe=0,Qe=0;if(Oe=C,C=C+16|0,M=Oe+4|0,j=Oe,Ti(65536,10804,n[2702]|0,10812),c=E9()|0,l=n[c>>2]|0,s=n[l>>2]|0,s|0)for(f=n[c+8>>2]|0,c=n[c+4>>2]|0;Ac(s|0,u[c>>0]|0|0,o[f>>0]|0),l=l+4|0,s=n[l>>2]|0,s;)f=f+1|0,c=c+1|0;if(s=C9()|0,l=n[s>>2]|0,l|0)do fu(l|0,n[s+4>>2]|0),s=s+8|0,l=n[s>>2]|0;while(l|0);fu(EUe()|0,5167),O=Fd()|0,s=n[O>>2]|0;e:do if(s|0){do CUe(n[s+4>>2]|0),s=n[s>>2]|0;while(s|0);if(s=n[O>>2]|0,s|0){Q=O;do{for(;d=s,s=n[s>>2]|0,d=n[d+4>>2]|0,!!(wUe(d)|0);)if(n[j>>2]=Q,n[M>>2]=n[j>>2],IUe(O,M)|0,!s)break e;if(BUe(d),Q=n[Q>>2]|0,l=J9(d)|0,m=Hi()|0,B=C,C=C+((1*(l<<2)|0)+15&-16)|0,k=C,C=C+((1*(l<<2)|0)+15&-16)|0,l=n[(F9(d)|0)>>2]|0,l|0)for(c=B,f=k;n[c>>2]=n[(Rd(n[l+4>>2]|0)|0)>>2],n[f>>2]=n[l+8>>2],l=n[l>>2]|0,l;)c=c+4|0,f=f+4|0;Qe=Rd(d)|0,l=vUe(d)|0,c=J9(d)|0,f=DUe(d)|0,pu(Qe|0,l|0,B|0,k|0,c|0,f|0,$F(d)|0),_i(m|0)}while(s|0)}}while(!1);if(s=n[(eR()|0)>>2]|0,s|0)do Qe=s+4|0,O=tR(Qe)|0,d=Cw(O)|0,m=yw(O)|0,B=(Ew(O)|0)+1|0,k=zv(O)|0,Q=X9(Qe)|0,O=Rr(O)|0,M=Wv(Qe)|0,j=pR(Qe)|0,El(0,d|0,m|0,B|0,k|0,Q|0,O|0,M|0,j|0,hR(Qe)|0),s=n[s>>2]|0;while(s|0);s=n[(Fd()|0)>>2]|0;e:do if(s|0){t:for(;;){if(l=n[s+4>>2]|0,l|0&&(se=n[(Rd(l)|0)>>2]|0,je=n[(R9(l)|0)>>2]|0,je|0)){c=je;do{l=c+4|0,f=tR(l)|0;r:do if(f|0)switch(Rr(f)|0){case 0:break t;case 4:case 3:case 2:{k=Cw(f)|0,Q=yw(f)|0,O=(Ew(f)|0)+1|0,M=zv(f)|0,j=Rr(f)|0,Qe=Wv(l)|0,El(se|0,k|0,Q|0,O|0,M|0,0,j|0,Qe|0,pR(l)|0,hR(l)|0);break r}case 1:{B=Cw(f)|0,k=yw(f)|0,Q=(Ew(f)|0)+1|0,O=zv(f)|0,M=X9(l)|0,j=Rr(f)|0,Qe=Wv(l)|0,El(se|0,B|0,k|0,Q|0,O|0,M|0,j|0,Qe|0,pR(l)|0,hR(l)|0);break r}case 5:{O=Cw(f)|0,M=yw(f)|0,j=(Ew(f)|0)+1|0,Qe=zv(f)|0,El(se|0,O|0,M|0,j|0,Qe|0,PUe(f)|0,Rr(f)|0,0,0,0);break r}default:break r}while(!1);c=n[c>>2]|0}while(c|0)}if(s=n[s>>2]|0,!s)break e}Tt()}while(!1);Ie(),C=Oe}function EUe(){return 11703}function CUe(s){s=s|0,o[s+40>>0]=0}function wUe(s){return s=s|0,(o[s+40>>0]|0)!=0|0}function IUe(s,l){return s=s|0,l=l|0,l=bUe(l)|0,s=n[l>>2]|0,n[l>>2]=n[s>>2],gt(s),n[l>>2]|0}function BUe(s){s=s|0,o[s+40>>0]=1}function J9(s){return s=s|0,n[s+20>>2]|0}function vUe(s){return s=s|0,n[s+8>>2]|0}function DUe(s){return s=s|0,n[s+32>>2]|0}function zv(s){return s=s|0,n[s+4>>2]|0}function X9(s){return s=s|0,n[s+4>>2]|0}function pR(s){return s=s|0,n[s+8>>2]|0}function hR(s){return s=s|0,n[s+16>>2]|0}function PUe(s){return s=s|0,n[s+20>>2]|0}function bUe(s){return s=s|0,n[s>>2]|0}function Jv(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0,je=0,Oe=0,Qe=0,$e=0,Je=0,lt=0,_e=0,qe=0,Lt=0;Lt=C,C=C+16|0,se=Lt;do if(s>>>0<245){if(O=s>>>0<11?16:s+11&-8,s=O>>>3,j=n[2783]|0,c=j>>>s,c&3|0)return l=(c&1^1)+s|0,s=11172+(l<<1<<2)|0,c=s+8|0,f=n[c>>2]|0,d=f+8|0,m=n[d>>2]|0,(s|0)==(m|0)?n[2783]=j&~(1<<l):(n[m+12>>2]=s,n[c>>2]=m),qe=l<<3,n[f+4>>2]=qe|3,qe=f+qe+4|0,n[qe>>2]=n[qe>>2]|1,qe=d,C=Lt,qe|0;if(M=n[2785]|0,O>>>0>M>>>0){if(c|0)return l=2<<s,l=c<<s&(l|0-l),l=(l&0-l)+-1|0,B=l>>>12&16,l=l>>>B,c=l>>>5&8,l=l>>>c,d=l>>>2&4,l=l>>>d,s=l>>>1&2,l=l>>>s,f=l>>>1&1,f=(c|B|d|s|f)+(l>>>f)|0,l=11172+(f<<1<<2)|0,s=l+8|0,d=n[s>>2]|0,B=d+8|0,c=n[B>>2]|0,(l|0)==(c|0)?(s=j&~(1<<f),n[2783]=s):(n[c+12>>2]=l,n[s>>2]=c,s=j),m=(f<<3)-O|0,n[d+4>>2]=O|3,f=d+O|0,n[f+4>>2]=m|1,n[f+m>>2]=m,M|0&&(d=n[2788]|0,l=M>>>3,c=11172+(l<<1<<2)|0,l=1<<l,s&l?(s=c+8|0,l=n[s>>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=d,n[l+12>>2]=d,n[d+8>>2]=l,n[d+12>>2]=c),n[2785]=m,n[2788]=f,qe=B,C=Lt,qe|0;if(k=n[2784]|0,k){if(c=(k&0-k)+-1|0,B=c>>>12&16,c=c>>>B,m=c>>>5&8,c=c>>>m,Q=c>>>2&4,c=c>>>Q,f=c>>>1&2,c=c>>>f,s=c>>>1&1,s=n[11436+((m|B|Q|f|s)+(c>>>s)<<2)>>2]|0,c=(n[s+4>>2]&-8)-O|0,f=n[s+16+(((n[s+16>>2]|0)==0&1)<<2)>>2]|0,!f)Q=s,m=c;else{do B=(n[f+4>>2]&-8)-O|0,Q=B>>>0<c>>>0,c=Q?B:c,s=Q?f:s,f=n[f+16+(((n[f+16>>2]|0)==0&1)<<2)>>2]|0;while(f|0);Q=s,m=c}if(B=Q+O|0,Q>>>0<B>>>0){d=n[Q+24>>2]|0,l=n[Q+12>>2]|0;do if((l|0)==(Q|0)){if(s=Q+20|0,l=n[s>>2]|0,!l&&(s=Q+16|0,l=n[s>>2]|0,!l)){c=0;break}for(;;){if(c=l+20|0,f=n[c>>2]|0,f|0){l=f,s=c;continue}if(c=l+16|0,f=n[c>>2]|0,f)l=f,s=c;else break}n[s>>2]=0,c=l}else c=n[Q+8>>2]|0,n[c+12>>2]=l,n[l+8>>2]=c,c=l;while(!1);do if(d|0){if(l=n[Q+28>>2]|0,s=11436+(l<<2)|0,(Q|0)==(n[s>>2]|0)){if(n[s>>2]=c,!c){n[2784]=k&~(1<<l);break}}else if(n[d+16+(((n[d+16>>2]|0)!=(Q|0)&1)<<2)>>2]=c,!c)break;n[c+24>>2]=d,l=n[Q+16>>2]|0,l|0&&(n[c+16>>2]=l,n[l+24>>2]=c),l=n[Q+20>>2]|0,l|0&&(n[c+20>>2]=l,n[l+24>>2]=c)}while(!1);return m>>>0<16?(qe=m+O|0,n[Q+4>>2]=qe|3,qe=Q+qe+4|0,n[qe>>2]=n[qe>>2]|1):(n[Q+4>>2]=O|3,n[B+4>>2]=m|1,n[B+m>>2]=m,M|0&&(f=n[2788]|0,l=M>>>3,c=11172+(l<<1<<2)|0,l=1<<l,j&l?(s=c+8|0,l=n[s>>2]|0):(n[2783]=j|l,l=c,s=c+8|0),n[s>>2]=f,n[l+12>>2]=f,n[f+8>>2]=l,n[f+12>>2]=c),n[2785]=m,n[2788]=B),qe=Q+8|0,C=Lt,qe|0}else j=O}else j=O}else j=O}else if(s>>>0<=4294967231)if(s=s+11|0,O=s&-8,Q=n[2784]|0,Q){f=0-O|0,s=s>>>8,s?O>>>0>16777215?k=31:(j=(s+1048320|0)>>>16&8,_e=s<<j,M=(_e+520192|0)>>>16&4,_e=_e<<M,k=(_e+245760|0)>>>16&2,k=14-(M|j|k)+(_e<<k>>>15)|0,k=O>>>(k+7|0)&1|k<<1):k=0,c=n[11436+(k<<2)>>2]|0;e:do if(!c)c=0,s=0,_e=57;else for(s=0,B=O<<((k|0)==31?0:25-(k>>>1)|0),m=0;;){if(d=(n[c+4>>2]&-8)-O|0,d>>>0<f>>>0)if(d)s=c,f=d;else{s=c,f=0,d=c,_e=61;break e}if(d=n[c+20>>2]|0,c=n[c+16+(B>>>31<<2)>>2]|0,m=(d|0)==0|(d|0)==(c|0)?m:d,d=(c|0)==0,d){c=m,_e=57;break}else B=B<<((d^1)&1)}while(!1);if((_e|0)==57){if((c|0)==0&(s|0)==0){if(s=2<<k,s=Q&(s|0-s),!s){j=O;break}j=(s&0-s)+-1|0,B=j>>>12&16,j=j>>>B,m=j>>>5&8,j=j>>>m,k=j>>>2&4,j=j>>>k,M=j>>>1&2,j=j>>>M,c=j>>>1&1,s=0,c=n[11436+((m|B|k|M|c)+(j>>>c)<<2)>>2]|0}c?(d=c,_e=61):(k=s,B=f)}if((_e|0)==61)for(;;)if(_e=0,c=(n[d+4>>2]&-8)-O|0,j=c>>>0<f>>>0,c=j?c:f,s=j?d:s,d=n[d+16+(((n[d+16>>2]|0)==0&1)<<2)>>2]|0,d)f=c,_e=61;else{k=s,B=c;break}if(k|0&&B>>>0<((n[2785]|0)-O|0)>>>0){if(m=k+O|0,k>>>0>=m>>>0)return qe=0,C=Lt,qe|0;d=n[k+24>>2]|0,l=n[k+12>>2]|0;do if((l|0)==(k|0)){if(s=k+20|0,l=n[s>>2]|0,!l&&(s=k+16|0,l=n[s>>2]|0,!l)){l=0;break}for(;;){if(c=l+20|0,f=n[c>>2]|0,f|0){l=f,s=c;continue}if(c=l+16|0,f=n[c>>2]|0,f)l=f,s=c;else break}n[s>>2]=0}else qe=n[k+8>>2]|0,n[qe+12>>2]=l,n[l+8>>2]=qe;while(!1);do if(d){if(s=n[k+28>>2]|0,c=11436+(s<<2)|0,(k|0)==(n[c>>2]|0)){if(n[c>>2]=l,!l){f=Q&~(1<<s),n[2784]=f;break}}else if(n[d+16+(((n[d+16>>2]|0)!=(k|0)&1)<<2)>>2]=l,!l){f=Q;break}n[l+24>>2]=d,s=n[k+16>>2]|0,s|0&&(n[l+16>>2]=s,n[s+24>>2]=l),s=n[k+20>>2]|0,s&&(n[l+20>>2]=s,n[s+24>>2]=l),f=Q}else f=Q;while(!1);do if(B>>>0>=16){if(n[k+4>>2]=O|3,n[m+4>>2]=B|1,n[m+B>>2]=B,l=B>>>3,B>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<<l,s&l?(s=c+8|0,l=n[s>>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=m,n[l+12>>2]=m,n[m+8>>2]=l,n[m+12>>2]=c;break}if(l=B>>>8,l?B>>>0>16777215?l=31:(_e=(l+1048320|0)>>>16&8,qe=l<<_e,lt=(qe+520192|0)>>>16&4,qe=qe<<lt,l=(qe+245760|0)>>>16&2,l=14-(lt|_e|l)+(qe<<l>>>15)|0,l=B>>>(l+7|0)&1|l<<1):l=0,c=11436+(l<<2)|0,n[m+28>>2]=l,s=m+16|0,n[s+4>>2]=0,n[s>>2]=0,s=1<<l,!(f&s)){n[2784]=f|s,n[c>>2]=m,n[m+24>>2]=c,n[m+12>>2]=m,n[m+8>>2]=m;break}for(s=B<<((l|0)==31?0:25-(l>>>1)|0),c=n[c>>2]|0;;){if((n[c+4>>2]&-8|0)==(B|0)){_e=97;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{_e=96;break}}if((_e|0)==96){n[f>>2]=m,n[m+24>>2]=c,n[m+12>>2]=m,n[m+8>>2]=m;break}else if((_e|0)==97){_e=c+8|0,qe=n[_e>>2]|0,n[qe+12>>2]=m,n[_e>>2]=m,n[m+8>>2]=qe,n[m+12>>2]=c,n[m+24>>2]=0;break}}else qe=B+O|0,n[k+4>>2]=qe|3,qe=k+qe+4|0,n[qe>>2]=n[qe>>2]|1;while(!1);return qe=k+8|0,C=Lt,qe|0}else j=O}else j=O;else j=-1;while(!1);if(c=n[2785]|0,c>>>0>=j>>>0)return l=c-j|0,s=n[2788]|0,l>>>0>15?(qe=s+j|0,n[2788]=qe,n[2785]=l,n[qe+4>>2]=l|1,n[qe+l>>2]=l,n[s+4>>2]=j|3):(n[2785]=0,n[2788]=0,n[s+4>>2]=c|3,qe=s+c+4|0,n[qe>>2]=n[qe>>2]|1),qe=s+8|0,C=Lt,qe|0;if(B=n[2786]|0,B>>>0>j>>>0)return lt=B-j|0,n[2786]=lt,qe=n[2789]|0,_e=qe+j|0,n[2789]=_e,n[_e+4>>2]=lt|1,n[qe+4>>2]=j|3,qe=qe+8|0,C=Lt,qe|0;if(n[2901]|0?s=n[2903]|0:(n[2903]=4096,n[2902]=4096,n[2904]=-1,n[2905]=-1,n[2906]=0,n[2894]=0,s=se&-16^1431655768,n[se>>2]=s,n[2901]=s,s=4096),k=j+48|0,Q=j+47|0,m=s+Q|0,d=0-s|0,O=m&d,O>>>0<=j>>>0||(s=n[2893]|0,s|0&&(M=n[2891]|0,se=M+O|0,se>>>0<=M>>>0|se>>>0>s>>>0)))return qe=0,C=Lt,qe|0;e:do if(n[2894]&4)l=0,_e=133;else{c=n[2789]|0;t:do if(c){for(f=11580;s=n[f>>2]|0,!(s>>>0<=c>>>0&&(Qe=f+4|0,(s+(n[Qe>>2]|0)|0)>>>0>c>>>0));)if(s=n[f+8>>2]|0,s)f=s;else{_e=118;break t}if(l=m-B&d,l>>>0<2147483647)if(s=xp(l|0)|0,(s|0)==((n[f>>2]|0)+(n[Qe>>2]|0)|0)){if((s|0)!=-1){B=l,m=s,_e=135;break e}}else f=s,_e=126;else l=0}else _e=118;while(!1);do if((_e|0)==118)if(c=xp(0)|0,(c|0)!=-1&&(l=c,je=n[2902]|0,Oe=je+-1|0,l=(Oe&l|0?(Oe+l&0-je)-l|0:0)+O|0,je=n[2891]|0,Oe=l+je|0,l>>>0>j>>>0&l>>>0<2147483647)){if(Qe=n[2893]|0,Qe|0&&Oe>>>0<=je>>>0|Oe>>>0>Qe>>>0){l=0;break}if(s=xp(l|0)|0,(s|0)==(c|0)){B=l,m=c,_e=135;break e}else f=s,_e=126}else l=0;while(!1);do if((_e|0)==126){if(c=0-l|0,!(k>>>0>l>>>0&(l>>>0<2147483647&(f|0)!=-1)))if((f|0)==-1){l=0;break}else{B=l,m=f,_e=135;break e}if(s=n[2903]|0,s=Q-l+s&0-s,s>>>0>=2147483647){B=l,m=f,_e=135;break e}if((xp(s|0)|0)==-1){xp(c|0)|0,l=0;break}else{B=s+l|0,m=f,_e=135;break e}}while(!1);n[2894]=n[2894]|4,_e=133}while(!1);if((_e|0)==133&&O>>>0<2147483647&&(lt=xp(O|0)|0,Qe=xp(0)|0,$e=Qe-lt|0,Je=$e>>>0>(j+40|0)>>>0,!((lt|0)==-1|Je^1|lt>>>0<Qe>>>0&((lt|0)!=-1&(Qe|0)!=-1)^1))&&(B=Je?$e:l,m=lt,_e=135),(_e|0)==135){l=(n[2891]|0)+B|0,n[2891]=l,l>>>0>(n[2892]|0)>>>0&&(n[2892]=l),Q=n[2789]|0;do if(Q){for(l=11580;;){if(s=n[l>>2]|0,c=l+4|0,f=n[c>>2]|0,(m|0)==(s+f|0)){_e=145;break}if(d=n[l+8>>2]|0,d)l=d;else break}if((_e|0)==145&&!(n[l+12>>2]&8|0)&&Q>>>0<m>>>0&Q>>>0>=s>>>0){n[c>>2]=f+B,qe=Q+8|0,qe=qe&7|0?0-qe&7:0,_e=Q+qe|0,qe=(n[2786]|0)+(B-qe)|0,n[2789]=_e,n[2786]=qe,n[_e+4>>2]=qe|1,n[_e+qe+4>>2]=40,n[2790]=n[2905];break}for(m>>>0<(n[2787]|0)>>>0&&(n[2787]=m),c=m+B|0,l=11580;;){if((n[l>>2]|0)==(c|0)){_e=153;break}if(s=n[l+8>>2]|0,s)l=s;else break}if((_e|0)==153&&!(n[l+12>>2]&8|0)){n[l>>2]=m,M=l+4|0,n[M>>2]=(n[M>>2]|0)+B,M=m+8|0,M=m+(M&7|0?0-M&7:0)|0,l=c+8|0,l=c+(l&7|0?0-l&7:0)|0,O=M+j|0,k=l-M-j|0,n[M+4>>2]=j|3;do if((l|0)!=(Q|0)){if((l|0)==(n[2788]|0)){qe=(n[2785]|0)+k|0,n[2785]=qe,n[2788]=O,n[O+4>>2]=qe|1,n[O+qe>>2]=qe;break}if(s=n[l+4>>2]|0,(s&3|0)==1){B=s&-8,f=s>>>3;e:do if(s>>>0<256)if(s=n[l+8>>2]|0,c=n[l+12>>2]|0,(c|0)==(s|0)){n[2783]=n[2783]&~(1<<f);break}else{n[s+12>>2]=c,n[c+8>>2]=s;break}else{m=n[l+24>>2]|0,s=n[l+12>>2]|0;do if((s|0)==(l|0)){if(f=l+16|0,c=f+4|0,s=n[c>>2]|0,!s)if(s=n[f>>2]|0,s)c=f;else{s=0;break}for(;;){if(f=s+20|0,d=n[f>>2]|0,d|0){s=d,c=f;continue}if(f=s+16|0,d=n[f>>2]|0,d)s=d,c=f;else break}n[c>>2]=0}else qe=n[l+8>>2]|0,n[qe+12>>2]=s,n[s+8>>2]=qe;while(!1);if(!m)break;c=n[l+28>>2]|0,f=11436+(c<<2)|0;do if((l|0)!=(n[f>>2]|0)){if(n[m+16+(((n[m+16>>2]|0)!=(l|0)&1)<<2)>>2]=s,!s)break e}else{if(n[f>>2]=s,s|0)break;n[2784]=n[2784]&~(1<<c);break e}while(!1);if(n[s+24>>2]=m,c=l+16|0,f=n[c>>2]|0,f|0&&(n[s+16>>2]=f,n[f+24>>2]=s),c=n[c+4>>2]|0,!c)break;n[s+20>>2]=c,n[c+24>>2]=s}while(!1);l=l+B|0,d=B+k|0}else d=k;if(l=l+4|0,n[l>>2]=n[l>>2]&-2,n[O+4>>2]=d|1,n[O+d>>2]=d,l=d>>>3,d>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<<l,s&l?(s=c+8|0,l=n[s>>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=O,n[l+12>>2]=O,n[O+8>>2]=l,n[O+12>>2]=c;break}l=d>>>8;do if(!l)l=0;else{if(d>>>0>16777215){l=31;break}_e=(l+1048320|0)>>>16&8,qe=l<<_e,lt=(qe+520192|0)>>>16&4,qe=qe<<lt,l=(qe+245760|0)>>>16&2,l=14-(lt|_e|l)+(qe<<l>>>15)|0,l=d>>>(l+7|0)&1|l<<1}while(!1);if(f=11436+(l<<2)|0,n[O+28>>2]=l,s=O+16|0,n[s+4>>2]=0,n[s>>2]=0,s=n[2784]|0,c=1<<l,!(s&c)){n[2784]=s|c,n[f>>2]=O,n[O+24>>2]=f,n[O+12>>2]=O,n[O+8>>2]=O;break}for(s=d<<((l|0)==31?0:25-(l>>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(d|0)){_e=194;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{_e=193;break}}if((_e|0)==193){n[f>>2]=O,n[O+24>>2]=c,n[O+12>>2]=O,n[O+8>>2]=O;break}else if((_e|0)==194){_e=c+8|0,qe=n[_e>>2]|0,n[qe+12>>2]=O,n[_e>>2]=O,n[O+8>>2]=qe,n[O+12>>2]=c,n[O+24>>2]=0;break}}else qe=(n[2786]|0)+k|0,n[2786]=qe,n[2789]=O,n[O+4>>2]=qe|1;while(!1);return qe=M+8|0,C=Lt,qe|0}for(l=11580;s=n[l>>2]|0,!(s>>>0<=Q>>>0&&(qe=s+(n[l+4>>2]|0)|0,qe>>>0>Q>>>0));)l=n[l+8>>2]|0;d=qe+-47|0,s=d+8|0,s=d+(s&7|0?0-s&7:0)|0,d=Q+16|0,s=s>>>0<d>>>0?Q:s,l=s+8|0,c=m+8|0,c=c&7|0?0-c&7:0,_e=m+c|0,c=B+-40-c|0,n[2789]=_e,n[2786]=c,n[_e+4>>2]=c|1,n[_e+c+4>>2]=40,n[2790]=n[2905],c=s+4|0,n[c>>2]=27,n[l>>2]=n[2895],n[l+4>>2]=n[2896],n[l+8>>2]=n[2897],n[l+12>>2]=n[2898],n[2895]=m,n[2896]=B,n[2898]=0,n[2897]=l,l=s+24|0;do _e=l,l=l+4|0,n[l>>2]=7;while((_e+8|0)>>>0<qe>>>0);if((s|0)!=(Q|0)){if(m=s-Q|0,n[c>>2]=n[c>>2]&-2,n[Q+4>>2]=m|1,n[s>>2]=m,l=m>>>3,m>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<<l,s&l?(s=c+8|0,l=n[s>>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=Q,n[l+12>>2]=Q,n[Q+8>>2]=l,n[Q+12>>2]=c;break}if(l=m>>>8,l?m>>>0>16777215?c=31:(_e=(l+1048320|0)>>>16&8,qe=l<<_e,lt=(qe+520192|0)>>>16&4,qe=qe<<lt,c=(qe+245760|0)>>>16&2,c=14-(lt|_e|c)+(qe<<c>>>15)|0,c=m>>>(c+7|0)&1|c<<1):c=0,f=11436+(c<<2)|0,n[Q+28>>2]=c,n[Q+20>>2]=0,n[d>>2]=0,l=n[2784]|0,s=1<<c,!(l&s)){n[2784]=l|s,n[f>>2]=Q,n[Q+24>>2]=f,n[Q+12>>2]=Q,n[Q+8>>2]=Q;break}for(s=m<<((c|0)==31?0:25-(c>>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(m|0)){_e=216;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{_e=215;break}}if((_e|0)==215){n[f>>2]=Q,n[Q+24>>2]=c,n[Q+12>>2]=Q,n[Q+8>>2]=Q;break}else if((_e|0)==216){_e=c+8|0,qe=n[_e>>2]|0,n[qe+12>>2]=Q,n[_e>>2]=Q,n[Q+8>>2]=qe,n[Q+12>>2]=c,n[Q+24>>2]=0;break}}}else{qe=n[2787]|0,(qe|0)==0|m>>>0<qe>>>0&&(n[2787]=m),n[2895]=m,n[2896]=B,n[2898]=0,n[2792]=n[2901],n[2791]=-1,l=0;do qe=11172+(l<<1<<2)|0,n[qe+12>>2]=qe,n[qe+8>>2]=qe,l=l+1|0;while((l|0)!=32);qe=m+8|0,qe=qe&7|0?0-qe&7:0,_e=m+qe|0,qe=B+-40-qe|0,n[2789]=_e,n[2786]=qe,n[_e+4>>2]=qe|1,n[_e+qe+4>>2]=40,n[2790]=n[2905]}while(!1);if(l=n[2786]|0,l>>>0>j>>>0)return lt=l-j|0,n[2786]=lt,qe=n[2789]|0,_e=qe+j|0,n[2789]=_e,n[_e+4>>2]=lt|1,n[qe+4>>2]=j|3,qe=qe+8|0,C=Lt,qe|0}return n[(Nd()|0)>>2]=12,qe=0,C=Lt,qe|0}function Xv(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,Q=0;if(s){c=s+-8|0,d=n[2787]|0,s=n[s+-4>>2]|0,l=s&-8,Q=c+l|0;do if(s&1)k=c,B=c;else{if(f=n[c>>2]|0,!(s&3)||(B=c+(0-f)|0,m=f+l|0,B>>>0<d>>>0))return;if((B|0)==(n[2788]|0)){if(s=Q+4|0,l=n[s>>2]|0,(l&3|0)!=3){k=B,l=m;break}n[2785]=m,n[s>>2]=l&-2,n[B+4>>2]=m|1,n[B+m>>2]=m;return}if(c=f>>>3,f>>>0<256)if(s=n[B+8>>2]|0,l=n[B+12>>2]|0,(l|0)==(s|0)){n[2783]=n[2783]&~(1<<c),k=B,l=m;break}else{n[s+12>>2]=l,n[l+8>>2]=s,k=B,l=m;break}d=n[B+24>>2]|0,s=n[B+12>>2]|0;do if((s|0)==(B|0)){if(c=B+16|0,l=c+4|0,s=n[l>>2]|0,!s)if(s=n[c>>2]|0,s)l=c;else{s=0;break}for(;;){if(c=s+20|0,f=n[c>>2]|0,f|0){s=f,l=c;continue}if(c=s+16|0,f=n[c>>2]|0,f)s=f,l=c;else break}n[l>>2]=0}else k=n[B+8>>2]|0,n[k+12>>2]=s,n[s+8>>2]=k;while(!1);if(d){if(l=n[B+28>>2]|0,c=11436+(l<<2)|0,(B|0)==(n[c>>2]|0)){if(n[c>>2]=s,!s){n[2784]=n[2784]&~(1<<l),k=B,l=m;break}}else if(n[d+16+(((n[d+16>>2]|0)!=(B|0)&1)<<2)>>2]=s,!s){k=B,l=m;break}n[s+24>>2]=d,l=B+16|0,c=n[l>>2]|0,c|0&&(n[s+16>>2]=c,n[c+24>>2]=s),l=n[l+4>>2]|0,l?(n[s+20>>2]=l,n[l+24>>2]=s,k=B,l=m):(k=B,l=m)}else k=B,l=m}while(!1);if(!(B>>>0>=Q>>>0)&&(s=Q+4|0,f=n[s>>2]|0,!!(f&1))){if(f&2)n[s>>2]=f&-2,n[k+4>>2]=l|1,n[B+l>>2]=l,d=l;else{if(s=n[2788]|0,(Q|0)==(n[2789]|0)){if(Q=(n[2786]|0)+l|0,n[2786]=Q,n[2789]=k,n[k+4>>2]=Q|1,(k|0)!=(s|0))return;n[2788]=0,n[2785]=0;return}if((Q|0)==(s|0)){Q=(n[2785]|0)+l|0,n[2785]=Q,n[2788]=B,n[k+4>>2]=Q|1,n[B+Q>>2]=Q;return}d=(f&-8)+l|0,c=f>>>3;do if(f>>>0<256)if(l=n[Q+8>>2]|0,s=n[Q+12>>2]|0,(s|0)==(l|0)){n[2783]=n[2783]&~(1<<c);break}else{n[l+12>>2]=s,n[s+8>>2]=l;break}else{m=n[Q+24>>2]|0,s=n[Q+12>>2]|0;do if((s|0)==(Q|0)){if(c=Q+16|0,l=c+4|0,s=n[l>>2]|0,!s)if(s=n[c>>2]|0,s)l=c;else{c=0;break}for(;;){if(c=s+20|0,f=n[c>>2]|0,f|0){s=f,l=c;continue}if(c=s+16|0,f=n[c>>2]|0,f)s=f,l=c;else break}n[l>>2]=0,c=s}else c=n[Q+8>>2]|0,n[c+12>>2]=s,n[s+8>>2]=c,c=s;while(!1);if(m|0){if(s=n[Q+28>>2]|0,l=11436+(s<<2)|0,(Q|0)==(n[l>>2]|0)){if(n[l>>2]=c,!c){n[2784]=n[2784]&~(1<<s);break}}else if(n[m+16+(((n[m+16>>2]|0)!=(Q|0)&1)<<2)>>2]=c,!c)break;n[c+24>>2]=m,s=Q+16|0,l=n[s>>2]|0,l|0&&(n[c+16>>2]=l,n[l+24>>2]=c),s=n[s+4>>2]|0,s|0&&(n[c+20>>2]=s,n[s+24>>2]=c)}}while(!1);if(n[k+4>>2]=d|1,n[B+d>>2]=d,(k|0)==(n[2788]|0)){n[2785]=d;return}}if(s=d>>>3,d>>>0<256){c=11172+(s<<1<<2)|0,l=n[2783]|0,s=1<<s,l&s?(l=c+8|0,s=n[l>>2]|0):(n[2783]=l|s,s=c,l=c+8|0),n[l>>2]=k,n[s+12>>2]=k,n[k+8>>2]=s,n[k+12>>2]=c;return}s=d>>>8,s?d>>>0>16777215?s=31:(B=(s+1048320|0)>>>16&8,Q=s<<B,m=(Q+520192|0)>>>16&4,Q=Q<<m,s=(Q+245760|0)>>>16&2,s=14-(m|B|s)+(Q<<s>>>15)|0,s=d>>>(s+7|0)&1|s<<1):s=0,f=11436+(s<<2)|0,n[k+28>>2]=s,n[k+20>>2]=0,n[k+16>>2]=0,l=n[2784]|0,c=1<<s;do if(l&c){for(l=d<<((s|0)==31?0:25-(s>>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(d|0)){s=73;break}if(f=c+16+(l>>>31<<2)|0,s=n[f>>2]|0,s)l=l<<1,c=s;else{s=72;break}}if((s|0)==72){n[f>>2]=k,n[k+24>>2]=c,n[k+12>>2]=k,n[k+8>>2]=k;break}else if((s|0)==73){B=c+8|0,Q=n[B>>2]|0,n[Q+12>>2]=k,n[B>>2]=k,n[k+8>>2]=Q,n[k+12>>2]=c,n[k+24>>2]=0;break}}else n[2784]=l|c,n[f>>2]=k,n[k+24>>2]=f,n[k+12>>2]=k,n[k+8>>2]=k;while(!1);if(Q=(n[2791]|0)+-1|0,n[2791]=Q,!Q)s=11588;else return;for(;s=n[s>>2]|0,s;)s=s+8|0;n[2791]=-1}}}function SUe(){return 11628}function xUe(s){s=s|0;var l=0,c=0;return l=C,C=C+16|0,c=l,n[c>>2]=FUe(n[s+60>>2]|0)|0,s=Zv(gc(6,c|0)|0)|0,C=l,s|0}function Z9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0,je=0;j=C,C=C+48|0,O=j+16|0,m=j,d=j+32|0,k=s+28|0,f=n[k>>2]|0,n[d>>2]=f,Q=s+20|0,f=(n[Q>>2]|0)-f|0,n[d+4>>2]=f,n[d+8>>2]=l,n[d+12>>2]=c,f=f+c|0,B=s+60|0,n[m>>2]=n[B>>2],n[m+4>>2]=d,n[m+8>>2]=2,m=Zv(Ni(146,m|0)|0)|0;e:do if((f|0)!=(m|0)){for(l=2;!((m|0)<0);)if(f=f-m|0,je=n[d+4>>2]|0,se=m>>>0>je>>>0,d=se?d+8|0:d,l=(se<<31>>31)+l|0,je=m-(se?je:0)|0,n[d>>2]=(n[d>>2]|0)+je,se=d+4|0,n[se>>2]=(n[se>>2]|0)-je,n[O>>2]=n[B>>2],n[O+4>>2]=d,n[O+8>>2]=l,m=Zv(Ni(146,O|0)|0)|0,(f|0)==(m|0)){M=3;break e}n[s+16>>2]=0,n[k>>2]=0,n[Q>>2]=0,n[s>>2]=n[s>>2]|32,(l|0)==2?c=0:c=c-(n[d+4>>2]|0)|0}else M=3;while(!1);return(M|0)==3&&(je=n[s+44>>2]|0,n[s+16>>2]=je+(n[s+48>>2]|0),n[k>>2]=je,n[Q>>2]=je),C=j,c|0}function kUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return d=C,C=C+32|0,m=d,f=d+20|0,n[m>>2]=n[s+60>>2],n[m+4>>2]=0,n[m+8>>2]=l,n[m+12>>2]=f,n[m+16>>2]=c,(Zv(aa(140,m|0)|0)|0)<0?(n[f>>2]=-1,s=-1):s=n[f>>2]|0,C=d,s|0}function Zv(s){return s=s|0,s>>>0>4294963200&&(n[(Nd()|0)>>2]=0-s,s=-1),s|0}function Nd(){return(QUe()|0)+64|0}function QUe(){return gR()|0}function gR(){return 2084}function FUe(s){return s=s|0,s|0}function RUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;return d=C,C=C+32|0,f=d,n[s+36>>2]=1,!(n[s>>2]&64|0)&&(n[f>>2]=n[s+60>>2],n[f+4>>2]=21523,n[f+8>>2]=d+16,hu(54,f|0)|0)&&(o[s+75>>0]=-1),f=Z9(s,l,c)|0,C=d,f|0}function $9(s,l){s=s|0,l=l|0;var c=0,f=0;if(c=o[s>>0]|0,f=o[l>>0]|0,!(c<<24>>24)||c<<24>>24!=f<<24>>24)s=f;else{do s=s+1|0,l=l+1|0,c=o[s>>0]|0,f=o[l>>0]|0;while(!(!(c<<24>>24)||c<<24>>24!=f<<24>>24));s=f}return(c&255)-(s&255)|0}function TUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;e:do if(!c)s=0;else{for(;f=o[s>>0]|0,d=o[l>>0]|0,f<<24>>24==d<<24>>24;)if(c=c+-1|0,c)s=s+1|0,l=l+1|0;else{s=0;break e}s=(f&255)-(d&255)|0}while(!1);return s|0}function e7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0,je=0,Oe=0,Qe=0;Qe=C,C=C+224|0,M=Qe+120|0,j=Qe+80|0,je=Qe,Oe=Qe+136|0,f=j,d=f+40|0;do n[f>>2]=0,f=f+4|0;while((f|0)<(d|0));return n[M>>2]=n[c>>2],(dR(0,l,M,je,j)|0)<0?c=-1:((n[s+76>>2]|0)>-1?se=NUe(s)|0:se=0,c=n[s>>2]|0,O=c&32,(o[s+74>>0]|0)<1&&(n[s>>2]=c&-33),f=s+48|0,n[f>>2]|0?c=dR(s,l,M,je,j)|0:(d=s+44|0,m=n[d>>2]|0,n[d>>2]=Oe,B=s+28|0,n[B>>2]=Oe,k=s+20|0,n[k>>2]=Oe,n[f>>2]=80,Q=s+16|0,n[Q>>2]=Oe+80,c=dR(s,l,M,je,j)|0,m&&(rD[n[s+36>>2]&7](s,0,0)|0,c=n[k>>2]|0?c:-1,n[d>>2]=m,n[f>>2]=0,n[Q>>2]=0,n[B>>2]=0,n[k>>2]=0)),f=n[s>>2]|0,n[s>>2]=f|O,se|0&&LUe(s),c=f&32|0?-1:c),C=Qe,c|0}function dR(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0,je=0,Oe=0,Qe=0,$e=0,Je=0,lt=0,_e=0,qe=0,Lt=0,Or=0,cr=0,Xt=0,Pr=0,Tr=0,ar=0;ar=C,C=C+64|0,cr=ar+16|0,Xt=ar,Lt=ar+24|0,Pr=ar+8|0,Tr=ar+20|0,n[cr>>2]=l,lt=(s|0)!=0,_e=Lt+40|0,qe=_e,Lt=Lt+39|0,Or=Pr+4|0,B=0,m=0,M=0;e:for(;;){do if((m|0)>-1)if((B|0)>(2147483647-m|0)){n[(Nd()|0)>>2]=75,m=-1;break}else{m=B+m|0;break}while(!1);if(B=o[l>>0]|0,B<<24>>24)k=l;else{Je=87;break}t:for(;;){switch(B<<24>>24){case 37:{B=k,Je=9;break t}case 0:{B=k;break t}default:}$e=k+1|0,n[cr>>2]=$e,B=o[$e>>0]|0,k=$e}t:do if((Je|0)==9)for(;;){if(Je=0,(o[k+1>>0]|0)!=37)break t;if(B=B+1|0,k=k+2|0,n[cr>>2]=k,(o[k>>0]|0)==37)Je=9;else break}while(!1);if(B=B-l|0,lt&&as(s,l,B),B|0){l=k;continue}Q=k+1|0,B=(o[Q>>0]|0)+-48|0,B>>>0<10?($e=(o[k+2>>0]|0)==36,Qe=$e?B:-1,M=$e?1:M,Q=$e?k+3|0:Q):Qe=-1,n[cr>>2]=Q,B=o[Q>>0]|0,k=(B<<24>>24)+-32|0;t:do if(k>>>0<32)for(O=0,j=B;;){if(B=1<<k,!(B&75913)){B=j;break t}if(O=B|O,Q=Q+1|0,n[cr>>2]=Q,B=o[Q>>0]|0,k=(B<<24>>24)+-32|0,k>>>0>=32)break;j=B}else O=0;while(!1);if(B<<24>>24==42){if(k=Q+1|0,B=(o[k>>0]|0)+-48|0,B>>>0<10&&(o[Q+2>>0]|0)==36)n[d+(B<<2)>>2]=10,B=n[f+((o[k>>0]|0)+-48<<3)>>2]|0,M=1,Q=Q+3|0;else{if(M|0){m=-1;break}lt?(M=(n[c>>2]|0)+3&-4,B=n[M>>2]|0,n[c>>2]=M+4,M=0,Q=k):(B=0,M=0,Q=k)}n[cr>>2]=Q,$e=(B|0)<0,B=$e?0-B|0:B,O=$e?O|8192:O}else{if(B=t7(cr)|0,(B|0)<0){m=-1;break}Q=n[cr>>2]|0}do if((o[Q>>0]|0)==46){if((o[Q+1>>0]|0)!=42){n[cr>>2]=Q+1,k=t7(cr)|0,Q=n[cr>>2]|0;break}if(j=Q+2|0,k=(o[j>>0]|0)+-48|0,k>>>0<10&&(o[Q+3>>0]|0)==36){n[d+(k<<2)>>2]=10,k=n[f+((o[j>>0]|0)+-48<<3)>>2]|0,Q=Q+4|0,n[cr>>2]=Q;break}if(M|0){m=-1;break e}lt?($e=(n[c>>2]|0)+3&-4,k=n[$e>>2]|0,n[c>>2]=$e+4):k=0,n[cr>>2]=j,Q=j}else k=-1;while(!1);for(Oe=0;;){if(((o[Q>>0]|0)+-65|0)>>>0>57){m=-1;break e}if($e=Q+1|0,n[cr>>2]=$e,j=o[(o[Q>>0]|0)+-65+(5178+(Oe*58|0))>>0]|0,se=j&255,(se+-1|0)>>>0<8)Oe=se,Q=$e;else break}if(!(j<<24>>24)){m=-1;break}je=(Qe|0)>-1;do if(j<<24>>24==19)if(je){m=-1;break e}else Je=49;else{if(je){n[d+(Qe<<2)>>2]=se,je=f+(Qe<<3)|0,Qe=n[je+4>>2]|0,Je=Xt,n[Je>>2]=n[je>>2],n[Je+4>>2]=Qe,Je=49;break}if(!lt){m=0;break e}r7(Xt,se,c)}while(!1);if((Je|0)==49&&(Je=0,!lt)){B=0,l=$e;continue}Q=o[Q>>0]|0,Q=(Oe|0)!=0&(Q&15|0)==3?Q&-33:Q,je=O&-65537,Qe=O&8192|0?je:O;t:do switch(Q|0){case 110:switch((Oe&255)<<24>>24){case 0:{n[n[Xt>>2]>>2]=m,B=0,l=$e;continue e}case 1:{n[n[Xt>>2]>>2]=m,B=0,l=$e;continue e}case 2:{B=n[Xt>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=$e;continue e}case 3:{a[n[Xt>>2]>>1]=m,B=0,l=$e;continue e}case 4:{o[n[Xt>>2]>>0]=m,B=0,l=$e;continue e}case 6:{n[n[Xt>>2]>>2]=m,B=0,l=$e;continue e}case 7:{B=n[Xt>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=$e;continue e}default:{B=0,l=$e;continue e}}case 112:{Q=120,k=k>>>0>8?k:8,l=Qe|8,Je=61;break}case 88:case 120:{l=Qe,Je=61;break}case 111:{Q=Xt,l=n[Q>>2]|0,Q=n[Q+4>>2]|0,se=OUe(l,Q,_e)|0,je=qe-se|0,O=0,j=5642,k=(Qe&8|0)==0|(k|0)>(je|0)?k:je+1|0,je=Qe,Je=67;break}case 105:case 100:if(Q=Xt,l=n[Q>>2]|0,Q=n[Q+4>>2]|0,(Q|0)<0){l=$v(0,0,l|0,Q|0)|0,Q=we,O=Xt,n[O>>2]=l,n[O+4>>2]=Q,O=1,j=5642,Je=66;break t}else{O=(Qe&2049|0)!=0&1,j=Qe&2048|0?5643:Qe&1|0?5644:5642,Je=66;break t}case 117:{Q=Xt,O=0,j=5642,l=n[Q>>2]|0,Q=n[Q+4>>2]|0,Je=66;break}case 99:{o[Lt>>0]=n[Xt>>2],l=Lt,O=0,j=5642,se=_e,Q=1,k=je;break}case 109:{Q=UUe(n[(Nd()|0)>>2]|0)|0,Je=71;break}case 115:{Q=n[Xt>>2]|0,Q=Q|0?Q:5652,Je=71;break}case 67:{n[Pr>>2]=n[Xt>>2],n[Or>>2]=0,n[Xt>>2]=Pr,se=-1,Q=Pr,Je=75;break}case 83:{l=n[Xt>>2]|0,k?(se=k,Q=l,Je=75):(Ds(s,32,B,0,Qe),l=0,Je=84);break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{B=HUe(s,+E[Xt>>3],B,k,Qe,Q)|0,l=$e;continue e}default:O=0,j=5642,se=_e,Q=k,k=Qe}while(!1);t:do if((Je|0)==61)Qe=Xt,Oe=n[Qe>>2]|0,Qe=n[Qe+4>>2]|0,se=MUe(Oe,Qe,_e,Q&32)|0,j=(l&8|0)==0|(Oe|0)==0&(Qe|0)==0,O=j?0:2,j=j?5642:5642+(Q>>4)|0,je=l,l=Oe,Q=Qe,Je=67;else if((Je|0)==66)se=Ld(l,Q,_e)|0,je=Qe,Je=67;else if((Je|0)==71)Je=0,Qe=_Ue(Q,0,k)|0,Oe=(Qe|0)==0,l=Q,O=0,j=5642,se=Oe?Q+k|0:Qe,Q=Oe?k:Qe-Q|0,k=je;else if((Je|0)==75){for(Je=0,j=Q,l=0,k=0;O=n[j>>2]|0,!(!O||(k=n7(Tr,O)|0,(k|0)<0|k>>>0>(se-l|0)>>>0));)if(l=k+l|0,se>>>0>l>>>0)j=j+4|0;else break;if((k|0)<0){m=-1;break e}if(Ds(s,32,B,l,Qe),!l)l=0,Je=84;else for(O=0;;){if(k=n[Q>>2]|0,!k){Je=84;break t}if(k=n7(Tr,k)|0,O=k+O|0,(O|0)>(l|0)){Je=84;break t}if(as(s,Tr,k),O>>>0>=l>>>0){Je=84;break}else Q=Q+4|0}}while(!1);if((Je|0)==67)Je=0,Q=(l|0)!=0|(Q|0)!=0,Qe=(k|0)!=0|Q,Q=((Q^1)&1)+(qe-se)|0,l=Qe?se:_e,se=_e,Q=Qe?(k|0)>(Q|0)?k:Q:k,k=(k|0)>-1?je&-65537:je;else if((Je|0)==84){Je=0,Ds(s,32,B,l,Qe^8192),B=(B|0)>(l|0)?B:l,l=$e;continue}Oe=se-l|0,je=(Q|0)<(Oe|0)?Oe:Q,Qe=je+O|0,B=(B|0)<(Qe|0)?Qe:B,Ds(s,32,B,Qe,k),as(s,j,O),Ds(s,48,B,Qe,k^65536),Ds(s,48,je,Oe,0),as(s,l,Oe),Ds(s,32,B,Qe,k^8192),l=$e}e:do if((Je|0)==87&&!s)if(!M)m=0;else{for(m=1;l=n[d+(m<<2)>>2]|0,!!l;)if(r7(f+(m<<3)|0,l,c),m=m+1|0,(m|0)>=10){m=1;break e}for(;;){if(n[d+(m<<2)>>2]|0){m=-1;break e}if(m=m+1|0,(m|0)>=10){m=1;break}}}while(!1);return C=ar,m|0}function NUe(s){return s=s|0,0}function LUe(s){s=s|0}function as(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]&32||JUe(l,c,s)|0}function t7(s){s=s|0;var l=0,c=0,f=0;if(c=n[s>>2]|0,f=(o[c>>0]|0)+-48|0,f>>>0<10){l=0;do l=f+(l*10|0)|0,c=c+1|0,n[s>>2]=c,f=(o[c>>0]|0)+-48|0;while(f>>>0<10)}else l=0;return l|0}function r7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;e:do if(l>>>0<=20)do switch(l|0){case 9:{f=(n[c>>2]|0)+3&-4,l=n[f>>2]|0,n[c>>2]=f+4,n[s>>2]=l;break e}case 10:{f=(n[c>>2]|0)+3&-4,l=n[f>>2]|0,n[c>>2]=f+4,f=s,n[f>>2]=l,n[f+4>>2]=((l|0)<0)<<31>>31;break e}case 11:{f=(n[c>>2]|0)+3&-4,l=n[f>>2]|0,n[c>>2]=f+4,f=s,n[f>>2]=l,n[f+4>>2]=0;break e}case 12:{f=(n[c>>2]|0)+7&-8,l=f,d=n[l>>2]|0,l=n[l+4>>2]|0,n[c>>2]=f+8,f=s,n[f>>2]=d,n[f+4>>2]=l;break e}case 13:{d=(n[c>>2]|0)+3&-4,f=n[d>>2]|0,n[c>>2]=d+4,f=(f&65535)<<16>>16,d=s,n[d>>2]=f,n[d+4>>2]=((f|0)<0)<<31>>31;break e}case 14:{d=(n[c>>2]|0)+3&-4,f=n[d>>2]|0,n[c>>2]=d+4,d=s,n[d>>2]=f&65535,n[d+4>>2]=0;break e}case 15:{d=(n[c>>2]|0)+3&-4,f=n[d>>2]|0,n[c>>2]=d+4,f=(f&255)<<24>>24,d=s,n[d>>2]=f,n[d+4>>2]=((f|0)<0)<<31>>31;break e}case 16:{d=(n[c>>2]|0)+3&-4,f=n[d>>2]|0,n[c>>2]=d+4,d=s,n[d>>2]=f&255,n[d+4>>2]=0;break e}case 17:{d=(n[c>>2]|0)+7&-8,m=+E[d>>3],n[c>>2]=d+8,E[s>>3]=m;break e}case 18:{d=(n[c>>2]|0)+7&-8,m=+E[d>>3],n[c>>2]=d+8,E[s>>3]=m;break e}default:break e}while(!1);while(!1)}function MUe(s,l,c,f){if(s=s|0,l=l|0,c=c|0,f=f|0,!((s|0)==0&(l|0)==0))do c=c+-1|0,o[c>>0]=u[5694+(s&15)>>0]|0|f,s=eD(s|0,l|0,4)|0,l=we;while(!((s|0)==0&(l|0)==0));return c|0}function OUe(s,l,c){if(s=s|0,l=l|0,c=c|0,!((s|0)==0&(l|0)==0))do c=c+-1|0,o[c>>0]=s&7|48,s=eD(s|0,l|0,3)|0,l=we;while(!((s|0)==0&(l|0)==0));return c|0}function Ld(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;if(l>>>0>0|(l|0)==0&s>>>0>4294967295){for(;f=CR(s|0,l|0,10,0)|0,c=c+-1|0,o[c>>0]=f&255|48,f=s,s=ER(s|0,l|0,10,0)|0,l>>>0>9|(l|0)==9&f>>>0>4294967295;)l=we;l=s}else l=s;if(l)for(;c=c+-1|0,o[c>>0]=(l>>>0)%10|0|48,!(l>>>0<10);)l=(l>>>0)/10|0;return c|0}function UUe(s){return s=s|0,WUe(s,n[(YUe()|0)+188>>2]|0)|0}function _Ue(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;m=l&255,f=(c|0)!=0;e:do if(f&(s&3|0)!=0)for(d=l&255;;){if((o[s>>0]|0)==d<<24>>24){B=6;break e}if(s=s+1|0,c=c+-1|0,f=(c|0)!=0,!(f&(s&3|0)!=0)){B=5;break}}else B=5;while(!1);(B|0)==5&&(f?B=6:c=0);e:do if((B|0)==6&&(d=l&255,(o[s>>0]|0)!=d<<24>>24)){f=Ue(m,16843009)|0;t:do if(c>>>0>3){for(;m=n[s>>2]^f,!((m&-2139062144^-2139062144)&m+-16843009|0);)if(s=s+4|0,c=c+-4|0,c>>>0<=3){B=11;break t}}else B=11;while(!1);if((B|0)==11&&!c){c=0;break}for(;;){if((o[s>>0]|0)==d<<24>>24)break e;if(s=s+1|0,c=c+-1|0,!c){c=0;break}}}while(!1);return(c|0?s:0)|0}function Ds(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0;if(B=C,C=C+256|0,m=B,(c|0)>(f|0)&(d&73728|0)==0){if(d=c-f|0,Od(m|0,l|0,(d>>>0<256?d:256)|0)|0,d>>>0>255){l=c-f|0;do as(s,m,256),d=d+-256|0;while(d>>>0>255);d=l&255}as(s,m,d)}C=B}function n7(s,l){return s=s|0,l=l|0,s?s=jUe(s,l,0)|0:s=0,s|0}function HUe(s,l,c,f,d,m){s=s|0,l=+l,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,Q=0,O=0,M=0,j=0,se=0,je=0,Oe=0,Qe=0,$e=0,Je=0,lt=0,_e=0,qe=0,Lt=0,Or=0,cr=0,Xt=0,Pr=0,Tr=0,ar=0,xn=0;xn=C,C=C+560|0,Q=xn+8|0,$e=xn,ar=xn+524|0,Tr=ar,O=xn+512|0,n[$e>>2]=0,Pr=O+12|0,i7(l)|0,(we|0)<0?(l=-l,cr=1,Or=5659):(cr=(d&2049|0)!=0&1,Or=d&2048|0?5662:d&1|0?5665:5660),i7(l)|0,Xt=we&2146435072;do if(Xt>>>0<2146435072|(Xt|0)==2146435072&!1){if(je=+qUe(l,$e)*2,B=je!=0,B&&(n[$e>>2]=(n[$e>>2]|0)+-1),lt=m|32,(lt|0)==97){Oe=m&32,se=Oe|0?Or+9|0:Or,j=cr|2,B=12-f|0;do if(f>>>0>11|(B|0)==0)l=je;else{l=8;do B=B+-1|0,l=l*16;while(B|0);if((o[se>>0]|0)==45){l=-(l+(-je-l));break}else{l=je+l-l;break}}while(!1);k=n[$e>>2]|0,B=(k|0)<0?0-k|0:k,B=Ld(B,((B|0)<0)<<31>>31,Pr)|0,(B|0)==(Pr|0)&&(B=O+11|0,o[B>>0]=48),o[B+-1>>0]=(k>>31&2)+43,M=B+-2|0,o[M>>0]=m+15,O=(f|0)<1,Q=(d&8|0)==0,B=ar;do Xt=~~l,k=B+1|0,o[B>>0]=u[5694+Xt>>0]|Oe,l=(l-+(Xt|0))*16,(k-Tr|0)==1&&!(Q&(O&l==0))?(o[k>>0]=46,B=B+2|0):B=k;while(l!=0);Xt=B-Tr|0,Tr=Pr-M|0,Pr=(f|0)!=0&(Xt+-2|0)<(f|0)?f+2|0:Xt,B=Tr+j+Pr|0,Ds(s,32,c,B,d),as(s,se,j),Ds(s,48,c,B,d^65536),as(s,ar,Xt),Ds(s,48,Pr-Xt|0,0,0),as(s,M,Tr),Ds(s,32,c,B,d^8192);break}k=(f|0)<0?6:f,B?(B=(n[$e>>2]|0)+-28|0,n[$e>>2]=B,l=je*268435456):(l=je,B=n[$e>>2]|0),Xt=(B|0)<0?Q:Q+288|0,Q=Xt;do qe=~~l>>>0,n[Q>>2]=qe,Q=Q+4|0,l=(l-+(qe>>>0))*1e9;while(l!=0);if((B|0)>0)for(O=Xt,j=Q;;){if(M=(B|0)<29?B:29,B=j+-4|0,B>>>0>=O>>>0){Q=0;do _e=u7(n[B>>2]|0,0,M|0)|0,_e=yR(_e|0,we|0,Q|0,0)|0,qe=we,Je=CR(_e|0,qe|0,1e9,0)|0,n[B>>2]=Je,Q=ER(_e|0,qe|0,1e9,0)|0,B=B+-4|0;while(B>>>0>=O>>>0);Q&&(O=O+-4|0,n[O>>2]=Q)}for(Q=j;!(Q>>>0<=O>>>0);)if(B=Q+-4|0,!(n[B>>2]|0))Q=B;else break;if(B=(n[$e>>2]|0)-M|0,n[$e>>2]=B,(B|0)>0)j=Q;else break}else O=Xt;if((B|0)<0){f=((k+25|0)/9|0)+1|0,Qe=(lt|0)==102;do{if(Oe=0-B|0,Oe=(Oe|0)<9?Oe:9,O>>>0<Q>>>0){M=(1<<Oe)+-1|0,j=1e9>>>Oe,se=0,B=O;do qe=n[B>>2]|0,n[B>>2]=(qe>>>Oe)+se,se=Ue(qe&M,j)|0,B=B+4|0;while(B>>>0<Q>>>0);B=n[O>>2]|0?O:O+4|0,se?(n[Q>>2]=se,O=B,B=Q+4|0):(O=B,B=Q)}else O=n[O>>2]|0?O:O+4|0,B=Q;Q=Qe?Xt:O,Q=(B-Q>>2|0)>(f|0)?Q+(f<<2)|0:B,B=(n[$e>>2]|0)+Oe|0,n[$e>>2]=B}while((B|0)<0);B=O,f=Q}else B=O,f=Q;if(qe=Xt,B>>>0<f>>>0){if(Q=(qe-B>>2)*9|0,M=n[B>>2]|0,M>>>0>=10){O=10;do O=O*10|0,Q=Q+1|0;while(M>>>0>=O>>>0)}}else Q=0;if(Qe=(lt|0)==103,Je=(k|0)!=0,O=k-((lt|0)!=102?Q:0)+((Je&Qe)<<31>>31)|0,(O|0)<(((f-qe>>2)*9|0)+-9|0)){if(O=O+9216|0,Oe=Xt+4+(((O|0)/9|0)+-1024<<2)|0,O=((O|0)%9|0)+1|0,(O|0)<9){M=10;do M=M*10|0,O=O+1|0;while((O|0)!=9)}else M=10;if(j=n[Oe>>2]|0,se=(j>>>0)%(M>>>0)|0,O=(Oe+4|0)==(f|0),O&(se|0)==0)O=Oe;else if(je=((j>>>0)/(M>>>0)|0)&1|0?9007199254740994:9007199254740992,_e=(M|0)/2|0,l=se>>>0<_e>>>0?.5:O&(se|0)==(_e|0)?1:1.5,cr&&(_e=(o[Or>>0]|0)==45,l=_e?-l:l,je=_e?-je:je),O=j-se|0,n[Oe>>2]=O,je+l!=je){if(_e=O+M|0,n[Oe>>2]=_e,_e>>>0>999999999)for(Q=Oe;O=Q+-4|0,n[Q>>2]=0,O>>>0<B>>>0&&(B=B+-4|0,n[B>>2]=0),_e=(n[O>>2]|0)+1|0,n[O>>2]=_e,_e>>>0>999999999;)Q=O;else O=Oe;if(Q=(qe-B>>2)*9|0,j=n[B>>2]|0,j>>>0>=10){M=10;do M=M*10|0,Q=Q+1|0;while(j>>>0>=M>>>0)}}else O=Oe;O=O+4|0,O=f>>>0>O>>>0?O:f,_e=B}else O=f,_e=B;for(lt=O;;){if(lt>>>0<=_e>>>0){$e=0;break}if(B=lt+-4|0,!(n[B>>2]|0))lt=B;else{$e=1;break}}f=0-Q|0;do if(Qe)if(B=((Je^1)&1)+k|0,(B|0)>(Q|0)&(Q|0)>-5?(M=m+-1|0,k=B+-1-Q|0):(M=m+-2|0,k=B+-1|0),B=d&8,B)Oe=B;else{if($e&&(Lt=n[lt+-4>>2]|0,(Lt|0)!=0))if((Lt>>>0)%10|0)O=0;else{O=0,B=10;do B=B*10|0,O=O+1|0;while(!((Lt>>>0)%(B>>>0)|0|0))}else O=9;if(B=((lt-qe>>2)*9|0)+-9|0,(M|32|0)==102){Oe=B-O|0,Oe=(Oe|0)>0?Oe:0,k=(k|0)<(Oe|0)?k:Oe,Oe=0;break}else{Oe=B+Q-O|0,Oe=(Oe|0)>0?Oe:0,k=(k|0)<(Oe|0)?k:Oe,Oe=0;break}}else M=m,Oe=d&8;while(!1);if(Qe=k|Oe,j=(Qe|0)!=0&1,se=(M|32|0)==102,se)Je=0,B=(Q|0)>0?Q:0;else{if(B=(Q|0)<0?f:Q,B=Ld(B,((B|0)<0)<<31>>31,Pr)|0,O=Pr,(O-B|0)<2)do B=B+-1|0,o[B>>0]=48;while((O-B|0)<2);o[B+-1>>0]=(Q>>31&2)+43,B=B+-2|0,o[B>>0]=M,Je=B,B=O-B|0}if(B=cr+1+k+j+B|0,Ds(s,32,c,B,d),as(s,Or,cr),Ds(s,48,c,B,d^65536),se){M=_e>>>0>Xt>>>0?Xt:_e,Oe=ar+9|0,j=Oe,se=ar+8|0,O=M;do{if(Q=Ld(n[O>>2]|0,0,Oe)|0,(O|0)==(M|0))(Q|0)==(Oe|0)&&(o[se>>0]=48,Q=se);else if(Q>>>0>ar>>>0){Od(ar|0,48,Q-Tr|0)|0;do Q=Q+-1|0;while(Q>>>0>ar>>>0)}as(s,Q,j-Q|0),O=O+4|0}while(O>>>0<=Xt>>>0);if(Qe|0&&as(s,5710,1),O>>>0<lt>>>0&(k|0)>0)for(;;){if(Q=Ld(n[O>>2]|0,0,Oe)|0,Q>>>0>ar>>>0){Od(ar|0,48,Q-Tr|0)|0;do Q=Q+-1|0;while(Q>>>0>ar>>>0)}if(as(s,Q,(k|0)<9?k:9),O=O+4|0,Q=k+-9|0,O>>>0<lt>>>0&(k|0)>9)k=Q;else{k=Q;break}}Ds(s,48,k+9|0,9,0)}else{if(Qe=$e?lt:_e+4|0,(k|0)>-1){$e=ar+9|0,Oe=(Oe|0)==0,f=$e,j=0-Tr|0,se=ar+8|0,M=_e;do{Q=Ld(n[M>>2]|0,0,$e)|0,(Q|0)==($e|0)&&(o[se>>0]=48,Q=se);do if((M|0)==(_e|0)){if(O=Q+1|0,as(s,Q,1),Oe&(k|0)<1){Q=O;break}as(s,5710,1),Q=O}else{if(Q>>>0<=ar>>>0)break;Od(ar|0,48,Q+j|0)|0;do Q=Q+-1|0;while(Q>>>0>ar>>>0)}while(!1);Tr=f-Q|0,as(s,Q,(k|0)>(Tr|0)?Tr:k),k=k-Tr|0,M=M+4|0}while(M>>>0<Qe>>>0&(k|0)>-1)}Ds(s,48,k+18|0,18,0),as(s,Je,Pr-Je|0)}Ds(s,32,c,B,d^8192)}else ar=(m&32|0)!=0,B=cr+3|0,Ds(s,32,c,B,d&-65537),as(s,Or,cr),as(s,l!=l|!1?ar?5686:5690:ar?5678:5682,3),Ds(s,32,c,B,d^8192);while(!1);return C=xn,((B|0)<(c|0)?c:B)|0}function i7(s){s=+s;var l=0;return E[v>>3]=s,l=n[v>>2]|0,we=n[v+4>>2]|0,l|0}function qUe(s,l){return s=+s,l=l|0,+ +s7(s,l)}function s7(s,l){s=+s,l=l|0;var c=0,f=0,d=0;switch(E[v>>3]=s,c=n[v>>2]|0,f=n[v+4>>2]|0,d=eD(c|0,f|0,52)|0,d&2047){case 0:{s!=0?(s=+s7(s*18446744073709552e3,l),c=(n[l>>2]|0)+-64|0):c=0,n[l>>2]=c;break}case 2047:break;default:n[l>>2]=(d&2047)+-1022,n[v>>2]=c,n[v+4>>2]=f&-2146435073|1071644672,s=+E[v>>3]}return+s}function jUe(s,l,c){s=s|0,l=l|0,c=c|0;do if(s){if(l>>>0<128){o[s>>0]=l,s=1;break}if(!(n[n[(GUe()|0)+188>>2]>>2]|0))if((l&-128|0)==57216){o[s>>0]=l,s=1;break}else{n[(Nd()|0)>>2]=84,s=-1;break}if(l>>>0<2048){o[s>>0]=l>>>6|192,o[s+1>>0]=l&63|128,s=2;break}if(l>>>0<55296|(l&-8192|0)==57344){o[s>>0]=l>>>12|224,o[s+1>>0]=l>>>6&63|128,o[s+2>>0]=l&63|128,s=3;break}if((l+-65536|0)>>>0<1048576){o[s>>0]=l>>>18|240,o[s+1>>0]=l>>>12&63|128,o[s+2>>0]=l>>>6&63|128,o[s+3>>0]=l&63|128,s=4;break}else{n[(Nd()|0)>>2]=84,s=-1;break}}else s=1;while(!1);return s|0}function GUe(){return gR()|0}function YUe(){return gR()|0}function WUe(s,l){s=s|0,l=l|0;var c=0,f=0;for(f=0;;){if((u[5712+f>>0]|0)==(s|0)){s=2;break}if(c=f+1|0,(c|0)==87){c=5800,f=87,s=5;break}else f=c}if((s|0)==2&&(f?(c=5800,s=5):c=5800),(s|0)==5)for(;;){do s=c,c=c+1|0;while(o[s>>0]|0);if(f=f+-1|0,f)s=5;else break}return KUe(c,n[l+20>>2]|0)|0}function KUe(s,l){return s=s|0,l=l|0,VUe(s,l)|0}function VUe(s,l){return s=s|0,l=l|0,l?l=zUe(n[l>>2]|0,n[l+4>>2]|0,s)|0:l=0,(l|0?l:s)|0}function zUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0;se=(n[s>>2]|0)+1794895138|0,m=x0(n[s+8>>2]|0,se)|0,f=x0(n[s+12>>2]|0,se)|0,d=x0(n[s+16>>2]|0,se)|0;e:do if(m>>>0<l>>>2>>>0&&(j=l-(m<<2)|0,f>>>0<j>>>0&d>>>0<j>>>0)&&!((d|f)&3|0)){for(j=f>>>2,M=d>>>2,O=0;;){if(k=m>>>1,Q=O+k|0,B=Q<<1,d=B+j|0,f=x0(n[s+(d<<2)>>2]|0,se)|0,d=x0(n[s+(d+1<<2)>>2]|0,se)|0,!(d>>>0<l>>>0&f>>>0<(l-d|0)>>>0)){f=0;break e}if(o[s+(d+f)>>0]|0){f=0;break e}if(f=$9(c,s+d|0)|0,!f)break;if(f=(f|0)<0,(m|0)==1){f=0;break e}else O=f?O:Q,m=f?k:m-k|0}f=B+M|0,d=x0(n[s+(f<<2)>>2]|0,se)|0,f=x0(n[s+(f+1<<2)>>2]|0,se)|0,f>>>0<l>>>0&d>>>0<(l-f|0)>>>0?f=o[s+(f+d)>>0]|0?0:s+f|0:f=0}else f=0;while(!1);return f|0}function x0(s,l){s=s|0,l=l|0;var c=0;return c=p7(s|0)|0,(l|0?c:s)|0}function JUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=c+16|0,d=n[f>>2]|0,d?m=5:XUe(c)|0?f=0:(d=n[f>>2]|0,m=5);e:do if((m|0)==5){if(k=c+20|0,B=n[k>>2]|0,f=B,(d-B|0)>>>0<l>>>0){f=rD[n[c+36>>2]&7](c,s,l)|0;break}t:do if((o[c+75>>0]|0)>-1){for(B=l;;){if(!B){m=0,d=s;break t}if(d=B+-1|0,(o[s+d>>0]|0)==10)break;B=d}if(f=rD[n[c+36>>2]&7](c,s,B)|0,f>>>0<B>>>0)break e;m=B,d=s+B|0,l=l-B|0,f=n[k>>2]|0}else m=0,d=s;while(!1);Dr(f|0,d|0,l|0)|0,n[k>>2]=(n[k>>2]|0)+l,f=m+l|0}while(!1);return f|0}function XUe(s){s=s|0;var l=0,c=0;return l=s+74|0,c=o[l>>0]|0,o[l>>0]=c+255|c,l=n[s>>2]|0,l&8?(n[s>>2]=l|32,s=-1):(n[s+8>>2]=0,n[s+4>>2]=0,c=n[s+44>>2]|0,n[s+28>>2]=c,n[s+20>>2]=c,n[s+16>>2]=c+(n[s+48>>2]|0),s=0),s|0}function _n(s,l){s=y(s),l=y(l);var c=0,f=0;c=o7(s)|0;do if((c&2147483647)>>>0<=2139095040){if(f=o7(l)|0,(f&2147483647)>>>0<=2139095040)if((f^c|0)<0){s=(c|0)<0?l:s;break}else{s=s<l?l:s;break}}else s=l;while(!1);return y(s)}function o7(s){return s=y(s),h[v>>2]=s,n[v>>2]|0|0}function k0(s,l){s=y(s),l=y(l);var c=0,f=0;c=a7(s)|0;do if((c&2147483647)>>>0<=2139095040){if(f=a7(l)|0,(f&2147483647)>>>0<=2139095040)if((f^c|0)<0){s=(c|0)<0?s:l;break}else{s=s<l?s:l;break}}else s=l;while(!1);return y(s)}function a7(s){return s=y(s),h[v>>2]=s,n[v>>2]|0|0}function mR(s,l){s=y(s),l=y(l);var c=0,f=0,d=0,m=0,B=0,k=0,Q=0,O=0;m=(h[v>>2]=s,n[v>>2]|0),k=(h[v>>2]=l,n[v>>2]|0),c=m>>>23&255,B=k>>>23&255,Q=m&-2147483648,d=k<<1;e:do if(d|0&&!((c|0)==255|((ZUe(l)|0)&2147483647)>>>0>2139095040)){if(f=m<<1,f>>>0<=d>>>0)return l=y(s*y(0)),y((f|0)==(d|0)?l:s);if(c)f=m&8388607|8388608;else{if(c=m<<9,(c|0)>-1){f=c,c=0;do c=c+-1|0,f=f<<1;while((f|0)>-1)}else c=0;f=m<<1-c}if(B)k=k&8388607|8388608;else{if(m=k<<9,(m|0)>-1){d=0;do d=d+-1|0,m=m<<1;while((m|0)>-1)}else d=0;B=d,k=k<<1-d}d=f-k|0,m=(d|0)>-1;t:do if((c|0)>(B|0)){for(;;){if(m)if(d)f=d;else break;if(f=f<<1,c=c+-1|0,d=f-k|0,m=(d|0)>-1,(c|0)<=(B|0))break t}l=y(s*y(0));break e}while(!1);if(m)if(d)f=d;else{l=y(s*y(0));break}if(f>>>0<8388608)do f=f<<1,c=c+-1|0;while(f>>>0<8388608);(c|0)>0?c=f+-8388608|c<<23:c=f>>>(1-c|0),l=(n[v>>2]=c|Q,y(h[v>>2]))}else O=3;while(!1);return(O|0)==3&&(l=y(s*l),l=y(l/l)),y(l)}function ZUe(s){return s=y(s),h[v>>2]=s,n[v>>2]|0|0}function $Ue(s,l){return s=s|0,l=l|0,e7(n[582]|0,s,l)|0}function Jr(s){s=s|0,Tt()}function Md(s){s=s|0}function e3e(s,l){return s=s|0,l=l|0,0}function t3e(s){return s=s|0,(l7(s+4|0)|0)==-1?(ef[n[(n[s>>2]|0)+8>>2]&127](s),s=1):s=0,s|0}function l7(s){s=s|0;var l=0;return l=n[s>>2]|0,n[s>>2]=l+-1,l+-1|0}function Sp(s){s=s|0,t3e(s)|0&&r3e(s)}function r3e(s){s=s|0;var l=0;l=s+8|0,n[l>>2]|0&&(l7(l)|0)!=-1||ef[n[(n[s>>2]|0)+16>>2]&127](s)}function Kt(s){s=s|0;var l=0;for(l=s|0?s:1;s=Jv(l)|0,!(s|0);){if(s=i3e()|0,!s){s=0;break}B7[s&0]()}return s|0}function c7(s){return s=s|0,Kt(s)|0}function gt(s){s=s|0,Xv(s)}function n3e(s){s=s|0,(o[s+11>>0]|0)<0&&gt(n[s>>2]|0)}function i3e(){var s=0;return s=n[2923]|0,n[2923]=s+0,s|0}function s3e(){}function $v(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,f=l-f-(c>>>0>s>>>0|0)>>>0,we=f,s-c>>>0|0|0}function yR(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,c=s+c>>>0,we=l+f+(c>>>0<s>>>0|0)>>>0,c|0|0}function Od(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;if(m=s+c|0,l=l&255,(c|0)>=67){for(;s&3;)o[s>>0]=l,s=s+1|0;for(f=m&-4|0,d=f-64|0,B=l|l<<8|l<<16|l<<24;(s|0)<=(d|0);)n[s>>2]=B,n[s+4>>2]=B,n[s+8>>2]=B,n[s+12>>2]=B,n[s+16>>2]=B,n[s+20>>2]=B,n[s+24>>2]=B,n[s+28>>2]=B,n[s+32>>2]=B,n[s+36>>2]=B,n[s+40>>2]=B,n[s+44>>2]=B,n[s+48>>2]=B,n[s+52>>2]=B,n[s+56>>2]=B,n[s+60>>2]=B,s=s+64|0;for(;(s|0)<(f|0);)n[s>>2]=B,s=s+4|0}for(;(s|0)<(m|0);)o[s>>0]=l,s=s+1|0;return m-c|0}function u7(s,l,c){return s=s|0,l=l|0,c=c|0,(c|0)<32?(we=l<<c|(s&(1<<c)-1<<32-c)>>>32-c,s<<c):(we=s<<c-32,0)}function eD(s,l,c){return s=s|0,l=l|0,c=c|0,(c|0)<32?(we=l>>>c,s>>>c|(l&(1<<c)-1)<<32-c):(we=0,l>>>c-32|0)}function Dr(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;if((c|0)>=8192)return fc(s|0,l|0,c|0)|0;if(m=s|0,d=s+c|0,(s&3)==(l&3)){for(;s&3;){if(!c)return m|0;o[s>>0]=o[l>>0]|0,s=s+1|0,l=l+1|0,c=c-1|0}for(c=d&-4|0,f=c-64|0;(s|0)<=(f|0);)n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2],n[s+16>>2]=n[l+16>>2],n[s+20>>2]=n[l+20>>2],n[s+24>>2]=n[l+24>>2],n[s+28>>2]=n[l+28>>2],n[s+32>>2]=n[l+32>>2],n[s+36>>2]=n[l+36>>2],n[s+40>>2]=n[l+40>>2],n[s+44>>2]=n[l+44>>2],n[s+48>>2]=n[l+48>>2],n[s+52>>2]=n[l+52>>2],n[s+56>>2]=n[l+56>>2],n[s+60>>2]=n[l+60>>2],s=s+64|0,l=l+64|0;for(;(s|0)<(c|0);)n[s>>2]=n[l>>2],s=s+4|0,l=l+4|0}else for(c=d-4|0;(s|0)<(c|0);)o[s>>0]=o[l>>0]|0,o[s+1>>0]=o[l+1>>0]|0,o[s+2>>0]=o[l+2>>0]|0,o[s+3>>0]=o[l+3>>0]|0,s=s+4|0,l=l+4|0;for(;(s|0)<(d|0);)o[s>>0]=o[l>>0]|0,s=s+1|0,l=l+1|0;return m|0}function A7(s){s=s|0;var l=0;return l=o[L+(s&255)>>0]|0,(l|0)<8?l|0:(l=o[L+(s>>8&255)>>0]|0,(l|0)<8?l+8|0:(l=o[L+(s>>16&255)>>0]|0,(l|0)<8?l+16|0:(o[L+(s>>>24)>>0]|0)+24|0))}function f7(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,Q=0,O=0,M=0,j=0,se=0,je=0,Oe=0;if(M=s,Q=l,O=Q,B=c,se=f,k=se,!O)return m=(d|0)!=0,k?m?(n[d>>2]=s|0,n[d+4>>2]=l&0,se=0,d=0,we=se,d|0):(se=0,d=0,we=se,d|0):(m&&(n[d>>2]=(M>>>0)%(B>>>0),n[d+4>>2]=0),se=0,d=(M>>>0)/(B>>>0)>>>0,we=se,d|0);m=(k|0)==0;do if(B){if(!m){if(m=(b(k|0)|0)-(b(O|0)|0)|0,m>>>0<=31){j=m+1|0,k=31-m|0,l=m-31>>31,B=j,s=M>>>(j>>>0)&l|O<<k,l=O>>>(j>>>0)&l,m=0,k=M<<k;break}return d?(n[d>>2]=s|0,n[d+4>>2]=Q|l&0,se=0,d=0,we=se,d|0):(se=0,d=0,we=se,d|0)}if(m=B-1|0,m&B|0){k=(b(B|0)|0)+33-(b(O|0)|0)|0,Oe=64-k|0,j=32-k|0,Q=j>>31,je=k-32|0,l=je>>31,B=k,s=j-1>>31&O>>>(je>>>0)|(O<<j|M>>>(k>>>0))&l,l=l&O>>>(k>>>0),m=M<<Oe&Q,k=(O<<Oe|M>>>(je>>>0))&Q|M<<j&k-33>>31;break}return d|0&&(n[d>>2]=m&M,n[d+4>>2]=0),(B|0)==1?(je=Q|l&0,Oe=s|0|0,we=je,Oe|0):(Oe=A7(B|0)|0,je=O>>>(Oe>>>0)|0,Oe=O<<32-Oe|M>>>(Oe>>>0)|0,we=je,Oe|0)}else{if(m)return d|0&&(n[d>>2]=(O>>>0)%(B>>>0),n[d+4>>2]=0),je=0,Oe=(O>>>0)/(B>>>0)>>>0,we=je,Oe|0;if(!M)return d|0&&(n[d>>2]=0,n[d+4>>2]=(O>>>0)%(k>>>0)),je=0,Oe=(O>>>0)/(k>>>0)>>>0,we=je,Oe|0;if(m=k-1|0,!(m&k))return d|0&&(n[d>>2]=s|0,n[d+4>>2]=m&O|l&0),je=0,Oe=O>>>((A7(k|0)|0)>>>0),we=je,Oe|0;if(m=(b(k|0)|0)-(b(O|0)|0)|0,m>>>0<=30){l=m+1|0,k=31-m|0,B=l,s=O<<k|M>>>(l>>>0),l=O>>>(l>>>0),m=0,k=M<<k;break}return d?(n[d>>2]=s|0,n[d+4>>2]=Q|l&0,je=0,Oe=0,we=je,Oe|0):(je=0,Oe=0,we=je,Oe|0)}while(!1);if(!B)O=k,Q=0,k=0;else{j=c|0|0,M=se|f&0,O=yR(j|0,M|0,-1,-1)|0,c=we,Q=k,k=0;do f=Q,Q=m>>>31|Q<<1,m=k|m<<1,f=s<<1|f>>>31|0,se=s>>>31|l<<1|0,$v(O|0,c|0,f|0,se|0)|0,Oe=we,je=Oe>>31|((Oe|0)<0?-1:0)<<1,k=je&1,s=$v(f|0,se|0,je&j|0,(((Oe|0)<0?-1:0)>>31|((Oe|0)<0?-1:0)<<1)&M|0)|0,l=we,B=B-1|0;while(B|0);O=Q,Q=0}return B=0,d|0&&(n[d>>2]=s,n[d+4>>2]=l),je=(m|0)>>>31|(O|B)<<1|(B<<1|m>>>31)&0|Q,Oe=(m<<1|0)&-2|k,we=je,Oe|0}function ER(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,f7(s,l,c,f,0)|0}function xp(s){s=s|0;var l=0,c=0;return c=s+15&-16|0,l=n[I>>2]|0,s=l+c|0,(c|0)>0&(s|0)<(l|0)|(s|0)<0?(ie()|0,vA(12),-1):(n[I>>2]=s,(s|0)>($()|0)&&!(X()|0)?(n[I>>2]=l,vA(12),-1):l|0)}function ww(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;if((l|0)<(s|0)&(s|0)<(l+c|0)){for(f=s,l=l+c|0,s=s+c|0;(c|0)>0;)s=s-1|0,l=l-1|0,c=c-1|0,o[s>>0]=o[l>>0]|0;s=f}else Dr(s,l,c)|0;return s|0}function CR(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;return m=C,C=C+16|0,d=m|0,f7(s,l,c,f,d)|0,C=m,we=n[d+4>>2]|0,n[d>>2]|0|0}function p7(s){return s=s|0,(s&255)<<24|(s>>8&255)<<16|(s>>16&255)<<8|s>>>24|0}function o3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,h7[s&1](l|0,c|0,f|0,d|0,m|0)}function a3e(s,l,c){s=s|0,l=l|0,c=y(c),g7[s&1](l|0,y(c))}function l3e(s,l,c){s=s|0,l=l|0,c=+c,d7[s&31](l|0,+c)}function c3e(s,l,c,f){return s=s|0,l=l|0,c=y(c),f=y(f),y(m7[s&0](l|0,y(c),y(f)))}function u3e(s,l){s=s|0,l=l|0,ef[s&127](l|0)}function A3e(s,l,c){s=s|0,l=l|0,c=c|0,tf[s&31](l|0,c|0)}function f3e(s,l){return s=s|0,l=l|0,F0[s&31](l|0)|0}function p3e(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0,y7[s&1](l|0,+c,+f,d|0)}function h3e(s,l,c,f){s=s|0,l=l|0,c=+c,f=+f,V3e[s&1](l|0,+c,+f)}function g3e(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,rD[s&7](l|0,c|0,f|0)|0}function d3e(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,+z3e[s&1](l|0,c|0,f|0)}function m3e(s,l){return s=s|0,l=l|0,+E7[s&15](l|0)}function y3e(s,l,c){return s=s|0,l=l|0,c=+c,J3e[s&1](l|0,+c)|0}function E3e(s,l,c){return s=s|0,l=l|0,c=c|0,IR[s&15](l|0,c|0)|0}function C3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=+f,d=+d,m=m|0,X3e[s&1](l|0,c|0,+f,+d,m|0)}function w3e(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,Z3e[s&1](l|0,c|0,f|0,d|0,m|0,B|0)}function I3e(s,l,c){return s=s|0,l=l|0,c=c|0,+C7[s&7](l|0,c|0)}function B3e(s){return s=s|0,nD[s&7]()|0}function v3e(s,l,c,f,d,m){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,w7[s&1](l|0,c|0,f|0,d|0,m|0)|0}function D3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=+d,$3e[s&1](l|0,c|0,f|0,+d)}function P3e(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=y(f),d=d|0,m=y(m),B=B|0,I7[s&1](l|0,c|0,y(f),d|0,y(m),B|0)}function b3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,vw[s&15](l|0,c|0,f|0)}function S3e(s){s=s|0,B7[s&0]()}function x3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f,v7[s&15](l|0,c|0,+f)}function k3e(s,l,c){return s=s|0,l=+l,c=+c,e_e[s&1](+l,+c)|0}function Q3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,BR[s&15](l|0,c|0,f|0,d|0)}function F3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,F(0)}function R3e(s,l){s=s|0,l=y(l),F(1)}function Ea(s,l){s=s|0,l=+l,F(2)}function T3e(s,l,c){return s=s|0,l=y(l),c=y(c),F(3),Xe}function Er(s){s=s|0,F(4)}function Iw(s,l){s=s|0,l=l|0,F(5)}function Xa(s){return s=s|0,F(6),0}function N3e(s,l,c,f){s=s|0,l=+l,c=+c,f=f|0,F(7)}function L3e(s,l,c){s=s|0,l=+l,c=+c,F(8)}function M3e(s,l,c){return s=s|0,l=l|0,c=c|0,F(9),0}function O3e(s,l,c){return s=s|0,l=l|0,c=c|0,F(10),0}function Q0(s){return s=s|0,F(11),0}function U3e(s,l){return s=s|0,l=+l,F(12),0}function Bw(s,l){return s=s|0,l=l|0,F(13),0}function _3e(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0,F(14)}function H3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,F(15)}function wR(s,l){return s=s|0,l=l|0,F(16),0}function q3e(){return F(17),0}function j3e(s,l,c,f,d){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,F(18),0}function G3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f,F(19)}function Y3e(s,l,c,f,d,m){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=m|0,F(20)}function tD(s,l,c){s=s|0,l=l|0,c=c|0,F(21)}function W3e(){F(22)}function Ud(s,l,c){s=s|0,l=l|0,c=+c,F(23)}function K3e(s,l){return s=+s,l=+l,F(24),0}function _d(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,F(25)}var h7=[F3e,jLe],g7=[R3e,fo],d7=[Ea,fw,pw,lF,cF,Dl,hw,uF,xd,ku,dw,AF,Lv,WA,Mv,kd,Ov,Uv,Qd,Ea,Ea,Ea,Ea,Ea,Ea,Ea,Ea,Ea,Ea,Ea,Ea,Ea],m7=[T3e],ef=[Er,Md,BDe,vDe,DDe,exe,txe,rxe,yNe,ENe,CNe,kLe,QLe,FLe,Z4e,$4e,eUe,ds,Qv,Sd,YA,gw,Eve,Cve,pDe,RDe,YDe,cPe,DPe,qPe,sbe,Cbe,Nbe,Xbe,pSe,xSe,YSe,Exe,Nxe,Xxe,pke,xke,Yke,uQe,DQe,UQe,tFe,Sc,FFe,VFe,pRe,QRe,WRe,pTe,BTe,PTe,jTe,WTe,cNe,INe,DNe,qNe,oLe,eG,HMe,yOe,ROe,VOe,d4e,Q4e,q4e,Y4e,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er,Er],tf=[Iw,tF,rF,Aw,xu,nF,iF,wp,sF,oF,aF,Nv,KA,Ve,At,Wt,vr,bn,Qr,pF,ove,xve,hQe,SQe,NRe,GMe,hLe,O9,Iw,Iw,Iw,Iw],F0=[Xa,xUe,eF,D,fe,De,vt,wt,St,_r,di,po,nve,ive,wve,iFe,JRe,YNe,VMe,Va,Xa,Xa,Xa,Xa,Xa,Xa,Xa,Xa,Xa,Xa,Xa,Xa],y7=[N3e,Ive],V3e=[L3e,fNe],rD=[M3e,Z9,kUe,RUe,WPe,Bxe,LFe,ZOe],z3e=[O3e,mSe],E7=[Q0,Yo,nt,Sn,Bve,vve,Dve,Pve,bve,Sve,Q0,Q0,Q0,Q0,Q0,Q0],J3e=[U3e,CTe],IR=[Bw,e3e,sve,mDe,pPe,lbe,Bbe,zSe,Uxe,jQe,xv,MOe,Bw,Bw,Bw,Bw],X3e=[_3e,zDe],Z3e=[H3e,C4e],C7=[wR,ai,kve,Qve,Fve,RSe,wR,wR],nD=[q3e,Rve,cw,ma,kTe,JTe,xNe,z4e],w7=[j3e,nw],$3e=[G3e,mke],I7=[Y3e,ave],vw=[tD,T,os,tn,ho,xPe,Obe,Rke,zke,bd,fMe,IOe,N4e,tD,tD,tD],B7=[W3e],v7=[Ud,Fv,Rv,Tv,GA,_v,fF,P,tke,ZFe,dTe,Ud,Ud,Ud,Ud,Ud],e_e=[K3e,dNe],BR=[_d,tSe,fFe,mRe,sTe,LTe,rNe,LNe,ALe,eOe,oUe,_d,_d,_d,_d,_d];return{_llvm_bswap_i32:p7,dynCall_idd:k3e,dynCall_i:B3e,_i64Subtract:$v,___udivdi3:ER,dynCall_vif:a3e,setThrew:du,dynCall_viii:b3e,_bitshift64Lshr:eD,_bitshift64Shl:u7,dynCall_vi:u3e,dynCall_viiddi:C3e,dynCall_diii:d3e,dynCall_iii:E3e,_memset:Od,_sbrk:xp,_memcpy:Dr,__GLOBAL__sub_I_Yoga_cpp:Pd,dynCall_vii:A3e,___uremdi3:CR,dynCall_vid:l3e,stackAlloc:lo,_nbind_init:mUe,getTempRet0:qa,dynCall_di:m3e,dynCall_iid:y3e,setTempRet0:SA,_i64Add:yR,dynCall_fiff:c3e,dynCall_iiii:g3e,_emscripten_get_global_libc:SUe,dynCall_viid:x3e,dynCall_viiid:D3e,dynCall_viififi:P3e,dynCall_ii:f3e,__GLOBAL__sub_I_Binding_cc:RMe,dynCall_viiii:Q3e,dynCall_iiiiii:v3e,stackSave:dc,dynCall_viiiii:o3e,__GLOBAL__sub_I_nbind_cc:Tve,dynCall_vidd:h3e,_free:Xv,runPostSets:s3e,dynCall_viiiiii:w3e,establishStackSpace:qi,_memmove:ww,stackRestore:gu,_malloc:Jv,__GLOBAL__sub_I_common_cc:$Ne,dynCall_viddi:p3e,dynCall_dii:I3e,dynCall_v:S3e}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,getTempRet0=Module.getTempRet0=asm.getTempRet0,___udivdi3=Module.___udivdi3=asm.___udivdi3,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_memset=Module._memset=asm._memset,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,___uremdi3=Module.___uremdi3=asm.___uremdi3,_nbind_init=Module._nbind_init=asm._nbind_init,_i64Subtract=Module._i64Subtract=asm._i64Subtract,setTempRet0=Module.setTempRet0=asm.setTempRet0,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,__GLOBAL__sub_I_Yoga_cpp=Module.__GLOBAL__sub_I_Yoga_cpp=asm.__GLOBAL__sub_I_Yoga_cpp,__GLOBAL__sub_I_Binding_cc=Module.__GLOBAL__sub_I_Binding_cc=asm.__GLOBAL__sub_I_Binding_cc,stackSave=Module.stackSave=asm.stackSave,__GLOBAL__sub_I_nbind_cc=Module.__GLOBAL__sub_I_nbind_cc=asm.__GLOBAL__sub_I_nbind_cc,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,_memmove=Module._memmove=asm._memmove,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,__GLOBAL__sub_I_common_cc=Module.__GLOBAL__sub_I_common_cc=asm.__GLOBAL__sub_I_common_cc,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vif=Module.dynCall_vif=asm.dynCall_vif,dynCall_vid=Module.dynCall_vid=asm.dynCall_vid,dynCall_fiff=Module.dynCall_fiff=asm.dynCall_fiff,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viddi=Module.dynCall_viddi=asm.dynCall_viddi,dynCall_vidd=Module.dynCall_vidd=asm.dynCall_vidd,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_diii=Module.dynCall_diii=asm.dynCall_diii,dynCall_di=Module.dynCall_di=asm.dynCall_di,dynCall_iid=Module.dynCall_iid=asm.dynCall_iid,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiddi=Module.dynCall_viiddi=asm.dynCall_viiddi,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_dii=Module.dynCall_dii=asm.dynCall_dii,dynCall_i=Module.dynCall_i=asm.dynCall_i,dynCall_iiiiii=Module.dynCall_iiiiii=asm.dynCall_iiiiii,dynCall_viiid=Module.dynCall_viiid=asm.dynCall_viiid,dynCall_viififi=Module.dynCall_viififi=asm.dynCall_viififi,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viid=Module.dynCall_viid=asm.dynCall_viid,dynCall_idd=Module.dynCall_idd=asm.dynCall_idd,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii;Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm;function ExitStatus(t){this.name=\"ExitStatus\",this.message=\"Program terminated with exit(\"+t+\")\",this.status=t}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function t(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=t)},Module.callMain=Module.callMain=function t(e){e=e||[],ensureInitRuntime();var r=e.length+1;function o(){for(var p=0;p<3;p++)a.push(0)}var a=[allocate(intArrayFromString(Module.thisProgram),\"i8\",ALLOC_NORMAL)];o();for(var n=0;n<r-1;n=n+1)a.push(allocate(intArrayFromString(e[n]),\"i8\",ALLOC_NORMAL)),o();a.push(0),a=allocate(a,\"i32\",ALLOC_NORMAL);try{var u=Module._main(r,a,0);exit(u,!0)}catch(p){if(p instanceof ExitStatus)return;if(p==\"SimulateInfiniteLoop\"){Module.noExitRuntime=!0;return}else{var A=p;p&&typeof p==\"object\"&&p.stack&&(A=[p,p.stack]),Module.printErr(\"exception thrown: \"+A),Module.quit(1,p)}}finally{calledMain=!0}};function run(t){if(t=t||Module.arguments,preloadStartTime===null&&(preloadStartTime=Date.now()),runDependencies>0||(preRun(),runDependencies>0)||Module.calledRun)return;function e(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(t),postRun()))}Module.setStatus?(Module.setStatus(\"Running...\"),setTimeout(function(){setTimeout(function(){Module.setStatus(\"\")},1),e()},1)):e()}Module.run=Module.run=run;function exit(t,e){e&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=t,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(t)),ENVIRONMENT_IS_NODE&&process.exit(t),Module.quit(t,new ExitStatus(t)))}Module.exit=Module.exit=exit;var abortDecorators=[];function abort(t){Module.onAbort&&Module.onAbort(t),t!==void 0?(Module.print(t),Module.printErr(t),t=JSON.stringify(t)):t=\"\",ABORT=!0,EXITSTATUS=1;var e=`\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.`,r=\"abort(\"+t+\") at \"+stackTrace()+e;throw abortDecorators&&abortDecorators.forEach(function(o){r=o(r,t)}),r}if(Module.abort=Module.abort=abort,Module.preInit)for(typeof Module.preInit==\"function\"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()})});var Jg=_((SKt,_Ee)=>{\"use strict\";var Xyt=OEe(),Zyt=UEe(),v6=!1,D6=null;Zyt({},function(t,e){if(!v6){if(v6=!0,t)throw t;D6=e}});if(!v6)throw new Error(\"Failed to load the yoga module - it needed to be loaded synchronously, but didn't\");_Ee.exports=Xyt(D6.bind,D6.lib)});var b6=_((xKt,P6)=>{\"use strict\";var HEe=t=>Number.isNaN(t)?!1:t>=4352&&(t<=4447||t===9001||t===9002||11904<=t&&t<=12871&&t!==12351||12880<=t&&t<=19903||19968<=t&&t<=42182||43360<=t&&t<=43388||44032<=t&&t<=55203||63744<=t&&t<=64255||65040<=t&&t<=65049||65072<=t&&t<=65131||65281<=t&&t<=65376||65504<=t&&t<=65510||110592<=t&&t<=110593||127488<=t&&t<=127569||131072<=t&&t<=262141);P6.exports=HEe;P6.exports.default=HEe});var jEe=_((kKt,qEe)=>{\"use strict\";qEe.exports=function(){return/\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g}});var Lk=_((QKt,S6)=>{\"use strict\";var $yt=BP(),eEt=b6(),tEt=jEe(),GEe=t=>{if(typeof t!=\"string\"||t.length===0||(t=$yt(t),t.length===0))return 0;t=t.replace(tEt(),\"  \");let e=0;for(let r=0;r<t.length;r++){let o=t.codePointAt(r);o<=31||o>=127&&o<=159||o>=768&&o<=879||(o>65535&&r++,e+=eEt(o)?2:1)}return e};S6.exports=GEe;S6.exports.default=GEe});var k6=_((FKt,x6)=>{\"use strict\";var rEt=Lk(),YEe=t=>{let e=0;for(let r of t.split(`\n`))e=Math.max(e,rEt(r));return e};x6.exports=YEe;x6.exports.default=YEe});var WEe=_(W2=>{\"use strict\";var nEt=W2&&W2.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(W2,\"__esModule\",{value:!0});var iEt=nEt(k6()),Q6={};W2.default=t=>{if(t.length===0)return{width:0,height:0};if(Q6[t])return Q6[t];let e=iEt.default(t),r=t.split(`\n`).length;return Q6[t]={width:e,height:r},{width:e,height:r}}});var KEe=_(K2=>{\"use strict\";var sEt=K2&&K2.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(K2,\"__esModule\",{value:!0});var dn=sEt(Jg()),oEt=(t,e)=>{\"position\"in e&&t.setPositionType(e.position===\"absolute\"?dn.default.POSITION_TYPE_ABSOLUTE:dn.default.POSITION_TYPE_RELATIVE)},aEt=(t,e)=>{\"marginLeft\"in e&&t.setMargin(dn.default.EDGE_START,e.marginLeft||0),\"marginRight\"in e&&t.setMargin(dn.default.EDGE_END,e.marginRight||0),\"marginTop\"in e&&t.setMargin(dn.default.EDGE_TOP,e.marginTop||0),\"marginBottom\"in e&&t.setMargin(dn.default.EDGE_BOTTOM,e.marginBottom||0)},lEt=(t,e)=>{\"paddingLeft\"in e&&t.setPadding(dn.default.EDGE_LEFT,e.paddingLeft||0),\"paddingRight\"in e&&t.setPadding(dn.default.EDGE_RIGHT,e.paddingRight||0),\"paddingTop\"in e&&t.setPadding(dn.default.EDGE_TOP,e.paddingTop||0),\"paddingBottom\"in e&&t.setPadding(dn.default.EDGE_BOTTOM,e.paddingBottom||0)},cEt=(t,e)=>{var r;\"flexGrow\"in e&&t.setFlexGrow((r=e.flexGrow)!==null&&r!==void 0?r:0),\"flexShrink\"in e&&t.setFlexShrink(typeof e.flexShrink==\"number\"?e.flexShrink:1),\"flexDirection\"in e&&(e.flexDirection===\"row\"&&t.setFlexDirection(dn.default.FLEX_DIRECTION_ROW),e.flexDirection===\"row-reverse\"&&t.setFlexDirection(dn.default.FLEX_DIRECTION_ROW_REVERSE),e.flexDirection===\"column\"&&t.setFlexDirection(dn.default.FLEX_DIRECTION_COLUMN),e.flexDirection===\"column-reverse\"&&t.setFlexDirection(dn.default.FLEX_DIRECTION_COLUMN_REVERSE)),\"flexBasis\"in e&&(typeof e.flexBasis==\"number\"?t.setFlexBasis(e.flexBasis):typeof e.flexBasis==\"string\"?t.setFlexBasisPercent(Number.parseInt(e.flexBasis,10)):t.setFlexBasis(NaN)),\"alignItems\"in e&&((e.alignItems===\"stretch\"||!e.alignItems)&&t.setAlignItems(dn.default.ALIGN_STRETCH),e.alignItems===\"flex-start\"&&t.setAlignItems(dn.default.ALIGN_FLEX_START),e.alignItems===\"center\"&&t.setAlignItems(dn.default.ALIGN_CENTER),e.alignItems===\"flex-end\"&&t.setAlignItems(dn.default.ALIGN_FLEX_END)),\"alignSelf\"in e&&((e.alignSelf===\"auto\"||!e.alignSelf)&&t.setAlignSelf(dn.default.ALIGN_AUTO),e.alignSelf===\"flex-start\"&&t.setAlignSelf(dn.default.ALIGN_FLEX_START),e.alignSelf===\"center\"&&t.setAlignSelf(dn.default.ALIGN_CENTER),e.alignSelf===\"flex-end\"&&t.setAlignSelf(dn.default.ALIGN_FLEX_END)),\"justifyContent\"in e&&((e.justifyContent===\"flex-start\"||!e.justifyContent)&&t.setJustifyContent(dn.default.JUSTIFY_FLEX_START),e.justifyContent===\"center\"&&t.setJustifyContent(dn.default.JUSTIFY_CENTER),e.justifyContent===\"flex-end\"&&t.setJustifyContent(dn.default.JUSTIFY_FLEX_END),e.justifyContent===\"space-between\"&&t.setJustifyContent(dn.default.JUSTIFY_SPACE_BETWEEN),e.justifyContent===\"space-around\"&&t.setJustifyContent(dn.default.JUSTIFY_SPACE_AROUND))},uEt=(t,e)=>{var r,o;\"width\"in e&&(typeof e.width==\"number\"?t.setWidth(e.width):typeof e.width==\"string\"?t.setWidthPercent(Number.parseInt(e.width,10)):t.setWidthAuto()),\"height\"in e&&(typeof e.height==\"number\"?t.setHeight(e.height):typeof e.height==\"string\"?t.setHeightPercent(Number.parseInt(e.height,10)):t.setHeightAuto()),\"minWidth\"in e&&(typeof e.minWidth==\"string\"?t.setMinWidthPercent(Number.parseInt(e.minWidth,10)):t.setMinWidth((r=e.minWidth)!==null&&r!==void 0?r:0)),\"minHeight\"in e&&(typeof e.minHeight==\"string\"?t.setMinHeightPercent(Number.parseInt(e.minHeight,10)):t.setMinHeight((o=e.minHeight)!==null&&o!==void 0?o:0))},AEt=(t,e)=>{\"display\"in e&&t.setDisplay(e.display===\"flex\"?dn.default.DISPLAY_FLEX:dn.default.DISPLAY_NONE)},fEt=(t,e)=>{if(\"borderStyle\"in e){let r=typeof e.borderStyle==\"string\"?1:0;t.setBorder(dn.default.EDGE_TOP,r),t.setBorder(dn.default.EDGE_BOTTOM,r),t.setBorder(dn.default.EDGE_LEFT,r),t.setBorder(dn.default.EDGE_RIGHT,r)}};K2.default=(t,e={})=>{oEt(t,e),aEt(t,e),lEt(t,e),cEt(t,e),uEt(t,e),AEt(t,e),fEt(t,e)}});var JEe=_((NKt,zEe)=>{\"use strict\";var V2=Lk(),pEt=BP(),hEt=aI(),R6=new Set([\"\\x1B\",\"\\x9B\"]),gEt=39,VEe=t=>`${R6.values().next().value}[${t}m`,dEt=t=>t.split(\" \").map(e=>V2(e)),F6=(t,e,r)=>{let o=[...e],a=!1,n=V2(pEt(t[t.length-1]));for(let[u,A]of o.entries()){let p=V2(A);if(n+p<=r?t[t.length-1]+=A:(t.push(A),n=0),R6.has(A))a=!0;else if(a&&A===\"m\"){a=!1;continue}a||(n+=p,n===r&&u<o.length-1&&(t.push(\"\"),n=0))}!n&&t[t.length-1].length>0&&t.length>1&&(t[t.length-2]+=t.pop())},mEt=t=>{let e=t.split(\" \"),r=e.length;for(;r>0&&!(V2(e[r-1])>0);)r--;return r===e.length?t:e.slice(0,r).join(\" \")+e.slice(r).join(\"\")},yEt=(t,e,r={})=>{if(r.trim!==!1&&t.trim()===\"\")return\"\";let o=\"\",a=\"\",n,u=dEt(t),A=[\"\"];for(let[p,h]of t.split(\" \").entries()){r.trim!==!1&&(A[A.length-1]=A[A.length-1].trimLeft());let E=V2(A[A.length-1]);if(p!==0&&(E>=e&&(r.wordWrap===!1||r.trim===!1)&&(A.push(\"\"),E=0),(E>0||r.trim===!1)&&(A[A.length-1]+=\" \",E++)),r.hard&&u[p]>e){let I=e-E,v=1+Math.floor((u[p]-I-1)/e);Math.floor((u[p]-1)/e)<v&&A.push(\"\"),F6(A,h,e);continue}if(E+u[p]>e&&E>0&&u[p]>0){if(r.wordWrap===!1&&E<e){F6(A,h,e);continue}A.push(\"\")}if(E+u[p]>e&&r.wordWrap===!1){F6(A,h,e);continue}A[A.length-1]+=h}r.trim!==!1&&(A=A.map(mEt)),o=A.join(`\n`);for(let[p,h]of[...o].entries()){if(a+=h,R6.has(h)){let I=parseFloat(/\\d[^m]*/.exec(o.slice(p,p+4)));n=I===gEt?null:I}let E=hEt.codes.get(Number(n));n&&E&&(o[p+1]===`\n`?a+=VEe(E):h===`\n`&&(a+=VEe(n)))}return a};zEe.exports=(t,e,r)=>String(t).normalize().replace(/\\r\\n/g,`\n`).split(`\n`).map(o=>yEt(o,e,r)).join(`\n`)});var $Ee=_((LKt,ZEe)=>{\"use strict\";var XEe=\"[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\",EEt=t=>t&&t.exact?new RegExp(`^${XEe}$`):new RegExp(XEe,\"g\");ZEe.exports=EEt});var T6=_((MKt,nCe)=>{\"use strict\";var CEt=b6(),wEt=$Ee(),eCe=aI(),rCe=[\"\\x1B\",\"\\x9B\"],Mk=t=>`${rCe[0]}[${t}m`,tCe=(t,e,r)=>{let o=[];t=[...t];for(let a of t){let n=a;a.match(\";\")&&(a=a.split(\";\")[0][0]+\"0\");let u=eCe.codes.get(parseInt(a,10));if(u){let A=t.indexOf(u.toString());A>=0?t.splice(A,1):o.push(Mk(e?u:n))}else if(e){o.push(Mk(0));break}else o.push(Mk(n))}if(e&&(o=o.filter((a,n)=>o.indexOf(a)===n),r!==void 0)){let a=Mk(eCe.codes.get(parseInt(r,10)));o=o.reduce((n,u)=>u===a?[u,...n]:[...n,u],[])}return o.join(\"\")};nCe.exports=(t,e,r)=>{let o=[...t.normalize()],a=[];r=typeof r==\"number\"?r:o.length;let n=!1,u,A=0,p=\"\";for(let[h,E]of o.entries()){let I=!1;if(rCe.includes(E)){let v=/\\d[^m]*/.exec(t.slice(h,h+18));u=v&&v.length>0?v[0]:void 0,A<r&&(n=!0,u!==void 0&&a.push(u))}else n&&E===\"m\"&&(n=!1,I=!0);if(!n&&!I&&++A,!wEt({exact:!0}).test(E)&&CEt(E.codePointAt())&&++A,A>e&&A<=r)p+=E;else if(A===e&&!n&&u!==void 0)p=tCe(a);else if(A>=r){p+=tCe(a,!0,u);break}}return p}});var sCe=_((OKt,iCe)=>{\"use strict\";var Nh=T6(),IEt=Lk();function Ok(t,e,r){if(t.charAt(e)===\" \")return e;for(let o=1;o<=3;o++)if(r){if(t.charAt(e+o)===\" \")return e+o}else if(t.charAt(e-o)===\" \")return e-o;return e}iCe.exports=(t,e,r)=>{r={position:\"end\",preferTruncationOnSpace:!1,...r};let{position:o,space:a,preferTruncationOnSpace:n}=r,u=\"\\u2026\",A=1;if(typeof t!=\"string\")throw new TypeError(`Expected \\`input\\` to be a string, got ${typeof t}`);if(typeof e!=\"number\")throw new TypeError(`Expected \\`columns\\` to be a number, got ${typeof e}`);if(e<1)return\"\";if(e===1)return u;let p=IEt(t);if(p<=e)return t;if(o===\"start\"){if(n){let h=Ok(t,p-e+1,!0);return u+Nh(t,h,p).trim()}return a===!0&&(u+=\" \",A=2),u+Nh(t,p-e+A,p)}if(o===\"middle\"){a===!0&&(u=\" \"+u+\" \",A=3);let h=Math.floor(e/2);if(n){let E=Ok(t,h),I=Ok(t,p-(e-h)+1,!0);return Nh(t,0,E)+u+Nh(t,I,p).trim()}return Nh(t,0,h)+u+Nh(t,p-(e-h)+A,p)}if(o===\"end\"){if(n){let h=Ok(t,e-1);return Nh(t,0,h)+u}return a===!0&&(u=\" \"+u,A=2),Nh(t,0,e-A)+u}throw new Error(`Expected \\`options.position\\` to be either \\`start\\`, \\`middle\\` or \\`end\\`, got ${o}`)}});var L6=_(z2=>{\"use strict\";var oCe=z2&&z2.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(z2,\"__esModule\",{value:!0});var BEt=oCe(JEe()),vEt=oCe(sCe()),N6={};z2.default=(t,e,r)=>{let o=t+String(e)+String(r);if(N6[o])return N6[o];let a=t;if(r===\"wrap\"&&(a=BEt.default(t,e,{trim:!1,hard:!0})),r.startsWith(\"truncate\")){let n=\"end\";r===\"truncate-middle\"&&(n=\"middle\"),r===\"truncate-start\"&&(n=\"start\"),a=vEt.default(t,e,{position:n})}return N6[o]=a,a}});var O6=_(M6=>{\"use strict\";Object.defineProperty(M6,\"__esModule\",{value:!0});var aCe=t=>{let e=\"\";if(t.childNodes.length>0)for(let r of t.childNodes){let o=\"\";r.nodeName===\"#text\"?o=r.nodeValue:((r.nodeName===\"ink-text\"||r.nodeName===\"ink-virtual-text\")&&(o=aCe(r)),o.length>0&&typeof r.internal_transform==\"function\"&&(o=r.internal_transform(o))),e+=o}return e};M6.default=aCe});var U6=_(pi=>{\"use strict\";var J2=pi&&pi.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(pi,\"__esModule\",{value:!0});pi.setTextNodeValue=pi.createTextNode=pi.setStyle=pi.setAttribute=pi.removeChildNode=pi.insertBeforeNode=pi.appendChildNode=pi.createNode=pi.TEXT_NAME=void 0;var DEt=J2(Jg()),lCe=J2(WEe()),PEt=J2(KEe()),bEt=J2(L6()),SEt=J2(O6());pi.TEXT_NAME=\"#text\";pi.createNode=t=>{var e;let r={nodeName:t,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:t===\"ink-virtual-text\"?void 0:DEt.default.Node.create()};return t===\"ink-text\"&&((e=r.yogaNode)===null||e===void 0||e.setMeasureFunc(xEt.bind(null,r))),r};pi.appendChildNode=(t,e)=>{var r;e.parentNode&&pi.removeChildNode(e.parentNode,e),e.parentNode=t,t.childNodes.push(e),e.yogaNode&&((r=t.yogaNode)===null||r===void 0||r.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName===\"ink-text\"||t.nodeName===\"ink-virtual-text\")&&Uk(t)};pi.insertBeforeNode=(t,e,r)=>{var o,a;e.parentNode&&pi.removeChildNode(e.parentNode,e),e.parentNode=t;let n=t.childNodes.indexOf(r);if(n>=0){t.childNodes.splice(n,0,e),e.yogaNode&&((o=t.yogaNode)===null||o===void 0||o.insertChild(e.yogaNode,n));return}t.childNodes.push(e),e.yogaNode&&((a=t.yogaNode)===null||a===void 0||a.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName===\"ink-text\"||t.nodeName===\"ink-virtual-text\")&&Uk(t)};pi.removeChildNode=(t,e)=>{var r,o;e.yogaNode&&((o=(r=e.parentNode)===null||r===void 0?void 0:r.yogaNode)===null||o===void 0||o.removeChild(e.yogaNode)),e.parentNode=null;let a=t.childNodes.indexOf(e);a>=0&&t.childNodes.splice(a,1),(t.nodeName===\"ink-text\"||t.nodeName===\"ink-virtual-text\")&&Uk(t)};pi.setAttribute=(t,e,r)=>{t.attributes[e]=r};pi.setStyle=(t,e)=>{t.style=e,t.yogaNode&&PEt.default(t.yogaNode,e)};pi.createTextNode=t=>{let e={nodeName:\"#text\",nodeValue:t,yogaNode:void 0,parentNode:null,style:{}};return pi.setTextNodeValue(e,t),e};var xEt=function(t,e){var r,o;let a=t.nodeName===\"#text\"?t.nodeValue:SEt.default(t),n=lCe.default(a);if(n.width<=e||n.width>=1&&e>0&&e<1)return n;let u=(o=(r=t.style)===null||r===void 0?void 0:r.textWrap)!==null&&o!==void 0?o:\"wrap\",A=bEt.default(a,e,u);return lCe.default(A)},cCe=t=>{var e;if(!(!t||!t.parentNode))return(e=t.yogaNode)!==null&&e!==void 0?e:cCe(t.parentNode)},Uk=t=>{let e=cCe(t);e?.markDirty()};pi.setTextNodeValue=(t,e)=>{typeof e!=\"string\"&&(e=String(e)),t.nodeValue=e,Uk(t)}});var hCe=_(X2=>{\"use strict\";var pCe=X2&&X2.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(X2,\"__esModule\",{value:!0});var uCe=w6(),kEt=pCe(FEe()),ACe=pCe(Jg()),Mo=U6(),fCe=t=>{t?.unsetMeasureFunc(),t?.freeRecursive()};X2.default=kEt.default({schedulePassiveEffects:uCe.unstable_scheduleCallback,cancelPassiveEffects:uCe.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>{},resetAfterCommit:t=>{if(t.isStaticDirty){t.isStaticDirty=!1,typeof t.onImmediateRender==\"function\"&&t.onImmediateRender();return}typeof t.onRender==\"function\"&&t.onRender()},getChildHostContext:(t,e)=>{let r=t.isInsideText,o=e===\"ink-text\"||e===\"ink-virtual-text\";return r===o?t:{isInsideText:o}},shouldSetTextContent:()=>!1,createInstance:(t,e,r,o)=>{if(o.isInsideText&&t===\"ink-box\")throw new Error(\"<Box> can\\u2019t be nested inside <Text> component\");let a=t===\"ink-text\"&&o.isInsideText?\"ink-virtual-text\":t,n=Mo.createNode(a);for(let[u,A]of Object.entries(e))u!==\"children\"&&(u===\"style\"?Mo.setStyle(n,A):u===\"internal_transform\"?n.internal_transform=A:u===\"internal_static\"?n.internal_static=!0:Mo.setAttribute(n,u,A));return n},createTextInstance:(t,e,r)=>{if(!r.isInsideText)throw new Error(`Text string \"${t}\" must be rendered inside <Text> component`);return Mo.createTextNode(t)},resetTextContent:()=>{},hideTextInstance:t=>{Mo.setTextNodeValue(t,\"\")},unhideTextInstance:(t,e)=>{Mo.setTextNodeValue(t,e)},getPublicInstance:t=>t,hideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(ACe.default.DISPLAY_NONE)},unhideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(ACe.default.DISPLAY_FLEX)},appendInitialChild:Mo.appendChildNode,appendChild:Mo.appendChildNode,insertBefore:Mo.insertBeforeNode,finalizeInitialChildren:(t,e,r,o)=>(t.internal_static&&(o.isStaticDirty=!0,o.staticNode=t),!1),supportsMutation:!0,appendChildToContainer:Mo.appendChildNode,insertInContainerBefore:Mo.insertBeforeNode,removeChildFromContainer:(t,e)=>{Mo.removeChildNode(t,e),fCe(e.yogaNode)},prepareUpdate:(t,e,r,o,a)=>{t.internal_static&&(a.isStaticDirty=!0);let n={},u=Object.keys(o);for(let A of u)if(o[A]!==r[A]){if(A===\"style\"&&typeof o.style==\"object\"&&typeof r.style==\"object\"){let h=o.style,E=r.style,I=Object.keys(h);for(let v of I){if(v===\"borderStyle\"||v===\"borderColor\"){if(typeof n.style!=\"object\"){let x={};n.style=x}n.style.borderStyle=h.borderStyle,n.style.borderColor=h.borderColor}if(h[v]!==E[v]){if(typeof n.style!=\"object\"){let x={};n.style=x}n.style[v]=h[v]}}continue}n[A]=o[A]}return n},commitUpdate:(t,e)=>{for(let[r,o]of Object.entries(e))r!==\"children\"&&(r===\"style\"?Mo.setStyle(t,o):r===\"internal_transform\"?t.internal_transform=o:r===\"internal_static\"?t.internal_static=!0:Mo.setAttribute(t,r,o))},commitTextUpdate:(t,e,r)=>{Mo.setTextNodeValue(t,r)},removeChild:(t,e)=>{Mo.removeChildNode(t,e),fCe(e.yogaNode)}})});var dCe=_((jKt,gCe)=>{\"use strict\";gCe.exports=(t,e=1,r)=>{if(r={indent:\" \",includeEmptyLines:!1,...r},typeof t!=\"string\")throw new TypeError(`Expected \\`input\\` to be a \\`string\\`, got \\`${typeof t}\\``);if(typeof e!=\"number\")throw new TypeError(`Expected \\`count\\` to be a \\`number\\`, got \\`${typeof e}\\``);if(typeof r.indent!=\"string\")throw new TypeError(`Expected \\`options.indent\\` to be a \\`string\\`, got \\`${typeof r.indent}\\``);if(e===0)return t;let o=r.includeEmptyLines?/^/gm:/^(?!\\s*$)/gm;return t.replace(o,r.indent.repeat(e))}});var mCe=_(Z2=>{\"use strict\";var QEt=Z2&&Z2.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Z2,\"__esModule\",{value:!0});var _k=QEt(Jg());Z2.default=t=>t.getComputedWidth()-t.getComputedPadding(_k.default.EDGE_LEFT)-t.getComputedPadding(_k.default.EDGE_RIGHT)-t.getComputedBorder(_k.default.EDGE_LEFT)-t.getComputedBorder(_k.default.EDGE_RIGHT)});var yCe=_((YKt,FEt)=>{FEt.exports={single:{topLeft:\"\\u250C\",topRight:\"\\u2510\",bottomRight:\"\\u2518\",bottomLeft:\"\\u2514\",vertical:\"\\u2502\",horizontal:\"\\u2500\"},double:{topLeft:\"\\u2554\",topRight:\"\\u2557\",bottomRight:\"\\u255D\",bottomLeft:\"\\u255A\",vertical:\"\\u2551\",horizontal:\"\\u2550\"},round:{topLeft:\"\\u256D\",topRight:\"\\u256E\",bottomRight:\"\\u256F\",bottomLeft:\"\\u2570\",vertical:\"\\u2502\",horizontal:\"\\u2500\"},bold:{topLeft:\"\\u250F\",topRight:\"\\u2513\",bottomRight:\"\\u251B\",bottomLeft:\"\\u2517\",vertical:\"\\u2503\",horizontal:\"\\u2501\"},singleDouble:{topLeft:\"\\u2553\",topRight:\"\\u2556\",bottomRight:\"\\u255C\",bottomLeft:\"\\u2559\",vertical:\"\\u2551\",horizontal:\"\\u2500\"},doubleSingle:{topLeft:\"\\u2552\",topRight:\"\\u2555\",bottomRight:\"\\u255B\",bottomLeft:\"\\u2558\",vertical:\"\\u2502\",horizontal:\"\\u2550\"},classic:{topLeft:\"+\",topRight:\"+\",bottomRight:\"+\",bottomLeft:\"+\",vertical:\"|\",horizontal:\"-\"}}});var CCe=_((WKt,_6)=>{\"use strict\";var ECe=yCe();_6.exports=ECe;_6.exports.default=ECe});var ICe=_((KKt,wCe)=>{\"use strict\";var REt=(t,e,r)=>{let o=t.indexOf(e);if(o===-1)return t;let a=e.length,n=0,u=\"\";do u+=t.substr(n,o-n)+e+r,n=o+a,o=t.indexOf(e,n);while(o!==-1);return u+=t.substr(n),u},TEt=(t,e,r,o)=>{let a=0,n=\"\";do{let u=t[o-1]===\"\\r\";n+=t.substr(a,(u?o-1:o)-a)+e+(u?`\\r\n`:`\n`)+r,a=o+1,o=t.indexOf(`\n`,a)}while(o!==-1);return n+=t.substr(a),n};wCe.exports={stringReplaceAll:REt,stringEncaseCRLFWithFirstIndex:TEt}});var bCe=_((VKt,PCe)=>{\"use strict\";var NEt=/(?:\\\\(u(?:[a-f\\d]{4}|\\{[a-f\\d]{1,6}\\})|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi,BCe=/(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g,LEt=/^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/,MEt=/\\\\(u(?:[a-f\\d]{4}|{[a-f\\d]{1,6}})|x[a-f\\d]{2}|.)|([^\\\\])/gi,OEt=new Map([[\"n\",`\n`],[\"r\",\"\\r\"],[\"t\",\"\t\"],[\"b\",\"\\b\"],[\"f\",\"\\f\"],[\"v\",\"\\v\"],[\"0\",\"\\0\"],[\"\\\\\",\"\\\\\"],[\"e\",\"\\x1B\"],[\"a\",\"\\x07\"]]);function DCe(t){let e=t[0]===\"u\",r=t[1]===\"{\";return e&&!r&&t.length===5||t[0]===\"x\"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):OEt.get(t)||t}function UEt(t,e){let r=[],o=e.trim().split(/\\s*,\\s*/g),a;for(let n of o){let u=Number(n);if(!Number.isNaN(u))r.push(u);else if(a=n.match(LEt))r.push(a[2].replace(MEt,(A,p,h)=>p?DCe(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function _Et(t){BCe.lastIndex=0;let e=[],r;for(;(r=BCe.exec(t))!==null;){let o=r[1];if(r[2]){let a=UEt(o,r[2]);e.push([o].concat(a))}else e.push([o])}return e}function vCe(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let o=t;for(let[a,n]of Object.entries(r))if(Array.isArray(n)){if(!(a in o))throw new Error(`Unknown Chalk style: ${a}`);o=n.length>0?o[a](...n):o[a]}return o}PCe.exports=(t,e)=>{let r=[],o=[],a=[];if(e.replace(NEt,(n,u,A,p,h,E)=>{if(u)a.push(DCe(u));else if(p){let I=a.join(\"\");a=[],o.push(r.length===0?I:vCe(t,r)(I)),r.push({inverse:A,styles:_Et(p)})}else if(h){if(r.length===0)throw new Error(\"Found extraneous } in Chalk template literal\");o.push(vCe(t,r)(a.join(\"\"))),a=[],r.pop()}else a.push(E)}),o.push(a.join(\"\")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?\"\":\"s\"} (\\`}\\`)`;throw new Error(n)}return o.join(\"\")}});var Yk=_((zKt,RCe)=>{\"use strict\";var $2=aI(),{stdout:q6,stderr:j6}=aN(),{stringReplaceAll:HEt,stringEncaseCRLFWithFirstIndex:qEt}=ICe(),{isArray:Hk}=Array,xCe=[\"ansi\",\"ansi\",\"ansi256\",\"ansi16m\"],nC=Object.create(null),jEt=(t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error(\"The `level` option should be an integer from 0 to 3\");let r=q6?q6.level:0;t.level=e.level===void 0?r:e.level},G6=class{constructor(e){return kCe(e)}},kCe=t=>{let e={};return jEt(e,t),e.template=(...r)=>FCe(e.template,...r),Object.setPrototypeOf(e,qk.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error(\"`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.\")},e.template.Instance=G6,e.template};function qk(t){return kCe(t)}for(let[t,e]of Object.entries($2))nC[t]={get(){let r=jk(this,Y6(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};nC.visible={get(){let t=jk(this,this._styler,!0);return Object.defineProperty(this,\"visible\",{value:t}),t}};var QCe=[\"rgb\",\"hex\",\"keyword\",\"hsl\",\"hsv\",\"hwb\",\"ansi\",\"ansi256\"];for(let t of QCe)nC[t]={get(){let{level:e}=this;return function(...r){let o=Y6($2.color[xCe[e]][t](...r),$2.color.close,this._styler);return jk(this,o,this._isEmpty)}}};for(let t of QCe){let e=\"bg\"+t[0].toUpperCase()+t.slice(1);nC[e]={get(){let{level:r}=this;return function(...o){let a=Y6($2.bgColor[xCe[r]][t](...o),$2.bgColor.close,this._styler);return jk(this,a,this._isEmpty)}}}}var GEt=Object.defineProperties(()=>{},{...nC,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),Y6=(t,e,r)=>{let o,a;return r===void 0?(o=t,a=e):(o=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:o,closeAll:a,parent:r}},jk=(t,e,r)=>{let o=(...a)=>Hk(a[0])&&Hk(a[0].raw)?SCe(o,FCe(o,...a)):SCe(o,a.length===1?\"\"+a[0]:a.join(\" \"));return Object.setPrototypeOf(o,GEt),o._generator=t,o._styler=e,o._isEmpty=r,o},SCe=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?\"\":e;let r=t._styler;if(r===void 0)return e;let{openAll:o,closeAll:a}=r;if(e.indexOf(\"\\x1B\")!==-1)for(;r!==void 0;)e=HEt(e,r.close,r.open),r=r.parent;let n=e.indexOf(`\n`);return n!==-1&&(e=qEt(e,a,o,n)),o+e+a},H6,FCe=(t,...e)=>{let[r]=e;if(!Hk(r)||!Hk(r.raw))return e.join(\" \");let o=e.slice(1),a=[r.raw[0]];for(let n=1;n<r.length;n++)a.push(String(o[n-1]).replace(/[{}\\\\]/g,\"\\\\$&\"),String(r.raw[n]));return H6===void 0&&(H6=bCe()),H6(t,a.join(\"\"))};Object.defineProperties(qk.prototype,nC);var Gk=qk();Gk.supportsColor=q6;Gk.stderr=qk({level:j6?j6.level:0});Gk.stderr.supportsColor=j6;RCe.exports=Gk});var W6=_(tB=>{\"use strict\";var YEt=tB&&tB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(tB,\"__esModule\",{value:!0});var eB=YEt(Yk()),WEt=/^(rgb|hsl|hsv|hwb)\\(\\s?(\\d+),\\s?(\\d+),\\s?(\\d+)\\s?\\)$/,KEt=/^(ansi|ansi256)\\(\\s?(\\d+)\\s?\\)$/,Wk=(t,e)=>e===\"foreground\"?t:\"bg\"+t[0].toUpperCase()+t.slice(1);tB.default=(t,e,r)=>{if(!e)return t;if(e in eB.default){let a=Wk(e,r);return eB.default[a](t)}if(e.startsWith(\"#\")){let a=Wk(\"hex\",r);return eB.default[a](e)(t)}if(e.startsWith(\"ansi\")){let a=KEt.exec(e);if(!a)return t;let n=Wk(a[1],r),u=Number(a[2]);return eB.default[n](u)(t)}if(e.startsWith(\"rgb\")||e.startsWith(\"hsl\")||e.startsWith(\"hsv\")||e.startsWith(\"hwb\")){let a=WEt.exec(e);if(!a)return t;let n=Wk(a[1],r),u=Number(a[2]),A=Number(a[3]),p=Number(a[4]);return eB.default[n](u,A,p)(t)}return t}});var NCe=_(rB=>{\"use strict\";var TCe=rB&&rB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(rB,\"__esModule\",{value:!0});var VEt=TCe(CCe()),K6=TCe(W6());rB.default=(t,e,r,o)=>{if(typeof r.style.borderStyle==\"string\"){let a=r.yogaNode.getComputedWidth(),n=r.yogaNode.getComputedHeight(),u=r.style.borderColor,A=VEt.default[r.style.borderStyle],p=K6.default(A.topLeft+A.horizontal.repeat(a-2)+A.topRight,u,\"foreground\"),h=(K6.default(A.vertical,u,\"foreground\")+`\n`).repeat(n-2),E=K6.default(A.bottomLeft+A.horizontal.repeat(a-2)+A.bottomRight,u,\"foreground\");o.write(t,e,p,{transformers:[]}),o.write(t,e+1,h,{transformers:[]}),o.write(t+a-1,e+1,h,{transformers:[]}),o.write(t,e+n-1,E,{transformers:[]})}}});var MCe=_(nB=>{\"use strict\";var Xg=nB&&nB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(nB,\"__esModule\",{value:!0});var zEt=Xg(Jg()),JEt=Xg(k6()),XEt=Xg(dCe()),ZEt=Xg(L6()),$Et=Xg(mCe()),eCt=Xg(O6()),tCt=Xg(NCe()),rCt=(t,e)=>{var r;let o=(r=t.childNodes[0])===null||r===void 0?void 0:r.yogaNode;if(o){let a=o.getComputedLeft(),n=o.getComputedTop();e=`\n`.repeat(n)+XEt.default(e,a)}return e},LCe=(t,e,r)=>{var o;let{offsetX:a=0,offsetY:n=0,transformers:u=[],skipStaticElements:A}=r;if(A&&t.internal_static)return;let{yogaNode:p}=t;if(p){if(p.getDisplay()===zEt.default.DISPLAY_NONE)return;let h=a+p.getComputedLeft(),E=n+p.getComputedTop(),I=u;if(typeof t.internal_transform==\"function\"&&(I=[t.internal_transform,...u]),t.nodeName===\"ink-text\"){let v=eCt.default(t);if(v.length>0){let x=JEt.default(v),C=$Et.default(p);if(x>C){let R=(o=t.style.textWrap)!==null&&o!==void 0?o:\"wrap\";v=ZEt.default(v,C,R)}v=rCt(t,v),e.write(h,E,v,{transformers:I})}return}if(t.nodeName===\"ink-box\"&&tCt.default(h,E,t,e),t.nodeName===\"ink-root\"||t.nodeName===\"ink-box\")for(let v of t.childNodes)LCe(v,e,{offsetX:h,offsetY:E,transformers:I,skipStaticElements:A})}};nB.default=LCe});var UCe=_(($Kt,OCe)=>{\"use strict\";OCe.exports=t=>{t=Object.assign({onlyFirst:!1},t);let e=[\"[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:[a-zA-Z\\\\d]*(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)\",\"(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))\"].join(\"|\");return new RegExp(e,t.onlyFirst?void 0:\"g\")}});var HCe=_((eVt,V6)=>{\"use strict\";var nCt=UCe(),_Ce=t=>typeof t==\"string\"?t.replace(nCt(),\"\"):t;V6.exports=_Ce;V6.exports.default=_Ce});var GCe=_((tVt,jCe)=>{\"use strict\";var qCe=\"[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\";jCe.exports=t=>t&&t.exact?new RegExp(`^${qCe}$`):new RegExp(qCe,\"g\")});var WCe=_((rVt,z6)=>{\"use strict\";var iCt=HCe(),sCt=GCe(),YCe=t=>iCt(t).replace(sCt(),\" \").length;z6.exports=YCe;z6.exports.default=YCe});var zCe=_(iB=>{\"use strict\";var VCe=iB&&iB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(iB,\"__esModule\",{value:!0});var KCe=VCe(T6()),oCt=VCe(WCe()),J6=class{constructor(e){this.writes=[];let{width:r,height:o}=e;this.width=r,this.height=o}write(e,r,o,a){let{transformers:n}=a;o&&this.writes.push({x:e,y:r,text:o,transformers:n})}get(){let e=[];for(let o=0;o<this.height;o++)e.push(\" \".repeat(this.width));for(let o of this.writes){let{x:a,y:n,text:u,transformers:A}=o,p=u.split(`\n`),h=0;for(let E of p){let I=e[n+h];if(!I)continue;let v=oCt.default(E);for(let x of A)E=x(E);e[n+h]=KCe.default(I,0,a)+E+KCe.default(I,a+v),h++}}return{output:e.map(o=>o.trimRight()).join(`\n`),height:e.length}}};iB.default=J6});var ZCe=_(sB=>{\"use strict\";var X6=sB&&sB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(sB,\"__esModule\",{value:!0});var aCt=X6(Jg()),JCe=X6(MCe()),XCe=X6(zCe());sB.default=(t,e)=>{var r;if(t.yogaNode.setWidth(e),t.yogaNode){t.yogaNode.calculateLayout(void 0,void 0,aCt.default.DIRECTION_LTR);let o=new XCe.default({width:t.yogaNode.getComputedWidth(),height:t.yogaNode.getComputedHeight()});JCe.default(t,o,{skipStaticElements:!0});let a;!((r=t.staticNode)===null||r===void 0)&&r.yogaNode&&(a=new XCe.default({width:t.staticNode.yogaNode.getComputedWidth(),height:t.staticNode.yogaNode.getComputedHeight()}),JCe.default(t.staticNode,a,{skipStaticElements:!1}));let{output:n,height:u}=o.get();return{output:n,outputHeight:u,staticOutput:a?`${a.get().output}\n`:\"\"}}return{output:\"\",outputHeight:0,staticOutput:\"\"}}});var rwe=_((sVt,twe)=>{\"use strict\";var $Ce=ve(\"stream\"),ewe=[\"assert\",\"count\",\"countReset\",\"debug\",\"dir\",\"dirxml\",\"error\",\"group\",\"groupCollapsed\",\"groupEnd\",\"info\",\"log\",\"table\",\"time\",\"timeEnd\",\"timeLog\",\"trace\",\"warn\"],Z6={},lCt=t=>{let e=new $Ce.PassThrough,r=new $Ce.PassThrough;e.write=a=>t(\"stdout\",a),r.write=a=>t(\"stderr\",a);let o=new console.Console(e,r);for(let a of ewe)Z6[a]=console[a],console[a]=o[a];return()=>{for(let a of ewe)console[a]=Z6[a];Z6={}}};twe.exports=lCt});var eq=_($6=>{\"use strict\";Object.defineProperty($6,\"__esModule\",{value:!0});$6.default=new WeakMap});var rq=_(tq=>{\"use strict\";Object.defineProperty(tq,\"__esModule\",{value:!0});var cCt=an(),nwe=cCt.createContext({exit:()=>{}});nwe.displayName=\"InternalAppContext\";tq.default=nwe});var iq=_(nq=>{\"use strict\";Object.defineProperty(nq,\"__esModule\",{value:!0});var uCt=an(),iwe=uCt.createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});iwe.displayName=\"InternalStdinContext\";nq.default=iwe});var oq=_(sq=>{\"use strict\";Object.defineProperty(sq,\"__esModule\",{value:!0});var ACt=an(),swe=ACt.createContext({stdout:void 0,write:()=>{}});swe.displayName=\"InternalStdoutContext\";sq.default=swe});var lq=_(aq=>{\"use strict\";Object.defineProperty(aq,\"__esModule\",{value:!0});var fCt=an(),owe=fCt.createContext({stderr:void 0,write:()=>{}});owe.displayName=\"InternalStderrContext\";aq.default=owe});var Kk=_(cq=>{\"use strict\";Object.defineProperty(cq,\"__esModule\",{value:!0});var pCt=an(),awe=pCt.createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{}});awe.displayName=\"InternalFocusContext\";cq.default=awe});var cwe=_((fVt,lwe)=>{\"use strict\";var hCt=/[|\\\\{}()[\\]^$+*?.-]/g;lwe.exports=t=>{if(typeof t!=\"string\")throw new TypeError(\"Expected a string\");return t.replace(hCt,\"\\\\$&\")}});var pwe=_((pVt,fwe)=>{\"use strict\";var gCt=cwe(),dCt=typeof process==\"object\"&&process&&typeof process.cwd==\"function\"?process.cwd():\".\",Awe=[].concat(ve(\"module\").builtinModules,\"bootstrap_node\",\"node\").map(t=>new RegExp(`(?:\\\\((?:node:)?${t}(?:\\\\.js)?:\\\\d+:\\\\d+\\\\)$|^\\\\s*at (?:node:)?${t}(?:\\\\.js)?:\\\\d+:\\\\d+$)`));Awe.push(/\\((?:node:)?internal\\/[^:]+:\\d+:\\d+\\)$/,/\\s*at (?:node:)?internal\\/[^:]+:\\d+:\\d+$/,/\\/\\.node-spawn-wrap-\\w+-\\w+\\/node:\\d+:\\d+\\)?$/);var uq=class t{constructor(e){e={ignoredPackages:[],...e},\"internals\"in e||(e.internals=t.nodeInternals()),\"cwd\"in e||(e.cwd=dCt),this._cwd=e.cwd.replace(/\\\\/g,\"/\"),this._internals=[].concat(e.internals,mCt(e.ignoredPackages)),this._wrapCallSite=e.wrapCallSite||!1}static nodeInternals(){return[...Awe]}clean(e,r=0){r=\" \".repeat(r),Array.isArray(e)||(e=e.split(`\n`)),!/^\\s*at /.test(e[0])&&/^\\s*at /.test(e[1])&&(e=e.slice(1));let o=!1,a=null,n=[];return e.forEach(u=>{if(u=u.replace(/\\\\/g,\"/\"),this._internals.some(p=>p.test(u)))return;let A=/^\\s*at /.test(u);o?u=u.trimEnd().replace(/^(\\s+)at /,\"$1\"):(u=u.trim(),A&&(u=u.slice(3))),u=u.replace(`${this._cwd}/`,\"\"),u&&(A?(a&&(n.push(a),a=null),n.push(u)):(o=!0,a=u))}),n.map(u=>`${r}${u}\n`).join(\"\")}captureString(e,r=this.captureString){typeof e==\"function\"&&(r=e,e=1/0);let{stackTraceLimit:o}=Error;e&&(Error.stackTraceLimit=e);let a={};Error.captureStackTrace(a,r);let{stack:n}=a;return Error.stackTraceLimit=o,this.clean(n)}capture(e,r=this.capture){typeof e==\"function\"&&(r=e,e=1/0);let{prepareStackTrace:o,stackTraceLimit:a}=Error;Error.prepareStackTrace=(A,p)=>this._wrapCallSite?p.map(this._wrapCallSite):p,e&&(Error.stackTraceLimit=e);let n={};Error.captureStackTrace(n,r);let{stack:u}=n;return Object.assign(Error,{prepareStackTrace:o,stackTraceLimit:a}),u}at(e=this.at){let[r]=this.capture(1,e);if(!r)return{};let o={line:r.getLineNumber(),column:r.getColumnNumber()};uwe(o,r.getFileName(),this._cwd),r.isConstructor()&&(o.constructor=!0),r.isEval()&&(o.evalOrigin=r.getEvalOrigin()),r.isNative()&&(o.native=!0);let a;try{a=r.getTypeName()}catch{}a&&a!==\"Object\"&&a!==\"[object Object]\"&&(o.type=a);let n=r.getFunctionName();n&&(o.function=n);let u=r.getMethodName();return u&&n!==u&&(o.method=u),o}parseLine(e){let r=e&&e.match(yCt);if(!r)return null;let o=r[1]===\"new\",a=r[2],n=r[3],u=r[4],A=Number(r[5]),p=Number(r[6]),h=r[7],E=r[8],I=r[9],v=r[10]===\"native\",x=r[11]===\")\",C,R={};if(E&&(R.line=Number(E)),I&&(R.column=Number(I)),x&&h){let L=0;for(let U=h.length-1;U>0;U--)if(h.charAt(U)===\")\")L++;else if(h.charAt(U)===\"(\"&&h.charAt(U-1)===\" \"&&(L--,L===-1&&h.charAt(U-1)===\" \")){let z=h.slice(0,U-1);h=h.slice(U+1),a+=` (${z}`;break}}if(a){let L=a.match(ECt);L&&(a=L[1],C=L[2])}return uwe(R,h,this._cwd),o&&(R.constructor=!0),n&&(R.evalOrigin=n,R.evalLine=A,R.evalColumn=p,R.evalFile=u&&u.replace(/\\\\/g,\"/\")),v&&(R.native=!0),a&&(R.function=a),C&&a!==C&&(R.method=C),R}};function uwe(t,e,r){e&&(e=e.replace(/\\\\/g,\"/\"),e.startsWith(`${r}/`)&&(e=e.slice(r.length+1)),t.file=e)}function mCt(t){if(t.length===0)return[];let e=t.map(r=>gCt(r));return new RegExp(`[/\\\\\\\\]node_modules[/\\\\\\\\](?:${e.join(\"|\")})[/\\\\\\\\][^:]+:\\\\d+:\\\\d+`)}var yCt=new RegExp(\"^(?:\\\\s*at )?(?:(new) )?(?:(.*?) \\\\()?(?:eval at ([^ ]+) \\\\((.+?):(\\\\d+):(\\\\d+)\\\\), )?(?:(.+?):(\\\\d+):(\\\\d+)|(native))(\\\\)?)$\"),ECt=/^(.*?) \\[as (.*?)\\]$/;fwe.exports=uq});var gwe=_((hVt,hwe)=>{\"use strict\";hwe.exports=(t,e)=>t.replace(/^\\t+/gm,r=>\" \".repeat(r.length*(e||2)))});var mwe=_((gVt,dwe)=>{\"use strict\";var CCt=gwe(),wCt=(t,e)=>{let r=[],o=t-e,a=t+e;for(let n=o;n<=a;n++)r.push(n);return r};dwe.exports=(t,e,r)=>{if(typeof t!=\"string\")throw new TypeError(\"Source code is missing.\");if(!e||e<1)throw new TypeError(\"Line number must start from `1`.\");if(t=CCt(t).split(/\\r?\\n/),!(e>t.length))return r={around:3,...r},wCt(e,r.around).filter(o=>t[o-1]!==void 0).map(o=>({line:o,value:t[o-1]}))}});var Vk=_(iu=>{\"use strict\";var ICt=iu&&iu.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),BCt=iu&&iu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),vCt=iu&&iu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.hasOwnProperty.call(t,r)&&ICt(e,t,r);return BCt(e,t),e},DCt=iu&&iu.__rest||function(t,e){var r={};for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&e.indexOf(o)<0&&(r[o]=t[o]);if(t!=null&&typeof Object.getOwnPropertySymbols==\"function\")for(var a=0,o=Object.getOwnPropertySymbols(t);a<o.length;a++)e.indexOf(o[a])<0&&Object.prototype.propertyIsEnumerable.call(t,o[a])&&(r[o[a]]=t[o[a]]);return r};Object.defineProperty(iu,\"__esModule\",{value:!0});var ywe=vCt(an()),Aq=ywe.forwardRef((t,e)=>{var{children:r}=t,o=DCt(t,[\"children\"]);let a=Object.assign(Object.assign({},o),{marginLeft:o.marginLeft||o.marginX||o.margin||0,marginRight:o.marginRight||o.marginX||o.margin||0,marginTop:o.marginTop||o.marginY||o.margin||0,marginBottom:o.marginBottom||o.marginY||o.margin||0,paddingLeft:o.paddingLeft||o.paddingX||o.padding||0,paddingRight:o.paddingRight||o.paddingX||o.padding||0,paddingTop:o.paddingTop||o.paddingY||o.padding||0,paddingBottom:o.paddingBottom||o.paddingY||o.padding||0});return ywe.default.createElement(\"ink-box\",{ref:e,style:a},r)});Aq.displayName=\"Box\";Aq.defaultProps={flexDirection:\"row\",flexGrow:0,flexShrink:1};iu.default=Aq});var hq=_(oB=>{\"use strict\";var fq=oB&&oB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(oB,\"__esModule\",{value:!0});var PCt=fq(an()),iC=fq(Yk()),Ewe=fq(W6()),pq=({color:t,backgroundColor:e,dimColor:r,bold:o,italic:a,underline:n,strikethrough:u,inverse:A,wrap:p,children:h})=>{if(h==null)return null;let E=I=>(r&&(I=iC.default.dim(I)),t&&(I=Ewe.default(I,t,\"foreground\")),e&&(I=Ewe.default(I,e,\"background\")),o&&(I=iC.default.bold(I)),a&&(I=iC.default.italic(I)),n&&(I=iC.default.underline(I)),u&&(I=iC.default.strikethrough(I)),A&&(I=iC.default.inverse(I)),I);return PCt.default.createElement(\"ink-text\",{style:{flexGrow:0,flexShrink:1,flexDirection:\"row\",textWrap:p},internal_transform:E},h)};pq.displayName=\"Text\";pq.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:\"wrap\"};oB.default=pq});var Bwe=_(su=>{\"use strict\";var bCt=su&&su.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),SCt=su&&su.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),xCt=su&&su.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.hasOwnProperty.call(t,r)&&bCt(e,t,r);return SCt(e,t),e},aB=su&&su.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(su,\"__esModule\",{value:!0});var Cwe=xCt(ve(\"fs\")),hs=aB(an()),wwe=aB(pwe()),kCt=aB(mwe()),zf=aB(Vk()),hA=aB(hq()),Iwe=new wwe.default({cwd:process.cwd(),internals:wwe.default.nodeInternals()}),QCt=({error:t})=>{let e=t.stack?t.stack.split(`\n`).slice(1):void 0,r=e?Iwe.parseLine(e[0]):void 0,o,a=0;if(r?.file&&r?.line&&Cwe.existsSync(r.file)){let n=Cwe.readFileSync(r.file,\"utf8\");if(o=kCt.default(n,r.line),o)for(let{line:u}of o)a=Math.max(a,String(u).length)}return hs.default.createElement(zf.default,{flexDirection:\"column\",padding:1},hs.default.createElement(zf.default,null,hs.default.createElement(hA.default,{backgroundColor:\"red\",color:\"white\"},\" \",\"ERROR\",\" \"),hs.default.createElement(hA.default,null,\" \",t.message)),r&&hs.default.createElement(zf.default,{marginTop:1},hs.default.createElement(hA.default,{dimColor:!0},r.file,\":\",r.line,\":\",r.column)),r&&o&&hs.default.createElement(zf.default,{marginTop:1,flexDirection:\"column\"},o.map(({line:n,value:u})=>hs.default.createElement(zf.default,{key:n},hs.default.createElement(zf.default,{width:a+1},hs.default.createElement(hA.default,{dimColor:n!==r.line,backgroundColor:n===r.line?\"red\":void 0,color:n===r.line?\"white\":void 0},String(n).padStart(a,\" \"),\":\")),hs.default.createElement(hA.default,{key:n,backgroundColor:n===r.line?\"red\":void 0,color:n===r.line?\"white\":void 0},\" \"+u)))),t.stack&&hs.default.createElement(zf.default,{marginTop:1,flexDirection:\"column\"},t.stack.split(`\n`).slice(1).map(n=>{let u=Iwe.parseLine(n);return u?hs.default.createElement(zf.default,{key:n},hs.default.createElement(hA.default,{dimColor:!0},\"- \"),hs.default.createElement(hA.default,{dimColor:!0,bold:!0},u.function),hs.default.createElement(hA.default,{dimColor:!0,color:\"gray\"},\" \",\"(\",u.file,\":\",u.line,\":\",u.column,\")\")):hs.default.createElement(zf.default,{key:n},hs.default.createElement(hA.default,{dimColor:!0},\"- \"),hs.default.createElement(hA.default,{dimColor:!0,bold:!0},n))})))};su.default=QCt});var Dwe=_(ou=>{\"use strict\";var FCt=ou&&ou.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),RCt=ou&&ou.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),TCt=ou&&ou.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.hasOwnProperty.call(t,r)&&FCt(e,t,r);return RCt(e,t),e},$g=ou&&ou.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ou,\"__esModule\",{value:!0});var Zg=TCt(an()),vwe=$g(u6()),NCt=$g(rq()),LCt=$g(iq()),MCt=$g(oq()),OCt=$g(lq()),UCt=$g(Kk()),_Ct=$g(Bwe()),HCt=\"\t\",qCt=\"\\x1B[Z\",jCt=\"\\x1B\",zk=class extends Zg.PureComponent{constructor(){super(...arguments),this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=e=>{let{stdin:r}=this.props;if(!this.isRawModeSupported())throw r===process.stdin?new Error(`Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default.\nRead about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`):new Error(`Raw mode is not supported on the stdin provided to Ink.\nRead about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`);if(r.setEncoding(\"utf8\"),e){this.rawModeEnabledCount===0&&(r.addListener(\"data\",this.handleInput),r.resume(),r.setRawMode(!0)),this.rawModeEnabledCount++;return}--this.rawModeEnabledCount===0&&(r.setRawMode(!1),r.removeListener(\"data\",this.handleInput),r.pause())},this.handleInput=e=>{e===\"\u0003\"&&this.props.exitOnCtrlC&&this.handleExit(),e===jCt&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(e===HCt&&this.focusNext(),e===qCt&&this.focusPrevious())},this.handleExit=e=>{this.isRawModeSupported()&&this.handleSetRawMode(!1),this.props.onExit(e)},this.enableFocus=()=>{this.setState({isFocusEnabled:!0})},this.disableFocus=()=>{this.setState({isFocusEnabled:!1})},this.focusNext=()=>{this.setState(e=>{let r=e.focusables[0].id;return{activeFocusId:this.findNextFocusable(e)||r}})},this.focusPrevious=()=>{this.setState(e=>{let r=e.focusables[e.focusables.length-1].id;return{activeFocusId:this.findPreviousFocusable(e)||r}})},this.addFocusable=(e,{autoFocus:r})=>{this.setState(o=>{let a=o.activeFocusId;return!a&&r&&(a=e),{activeFocusId:a,focusables:[...o.focusables,{id:e,isActive:!0}]}})},this.removeFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.filter(o=>o.id!==e)}))},this.activateFocusable=e=>{this.setState(r=>({focusables:r.focusables.map(o=>o.id!==e?o:{id:e,isActive:!0})}))},this.deactivateFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.map(o=>o.id!==e?o:{id:e,isActive:!1})}))},this.findNextFocusable=e=>{let r=e.focusables.findIndex(o=>o.id===e.activeFocusId);for(let o=r+1;o<e.focusables.length;o++)if(e.focusables[o].isActive)return e.focusables[o].id},this.findPreviousFocusable=e=>{let r=e.focusables.findIndex(o=>o.id===e.activeFocusId);for(let o=r-1;o>=0;o--)if(e.focusables[o].isActive)return e.focusables[o].id}}static getDerivedStateFromError(e){return{error:e}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return Zg.default.createElement(NCt.default.Provider,{value:{exit:this.handleExit}},Zg.default.createElement(LCt.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},Zg.default.createElement(MCt.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},Zg.default.createElement(OCt.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},Zg.default.createElement(UCt.default.Provider,{value:{activeId:this.state.activeFocusId,add:this.addFocusable,remove:this.removeFocusable,activate:this.activateFocusable,deactivate:this.deactivateFocusable,enableFocus:this.enableFocus,disableFocus:this.disableFocus,focusNext:this.focusNext,focusPrevious:this.focusPrevious}},this.state.error?Zg.default.createElement(_Ct.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){vwe.default.hide(this.props.stdout)}componentWillUnmount(){vwe.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(e){this.handleExit(e)}};ou.default=zk;zk.displayName=\"InternalApp\"});var Swe=_(au=>{\"use strict\";var GCt=au&&au.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),YCt=au&&au.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),WCt=au&&au.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.hasOwnProperty.call(t,r)&&GCt(e,t,r);return YCt(e,t),e},lu=au&&au.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(au,\"__esModule\",{value:!0});var KCt=lu(an()),Pwe=eO(),VCt=lu(pEe()),zCt=lu(s6()),JCt=lu(EEe()),XCt=lu(wEe()),gq=lu(hCe()),ZCt=lu(ZCe()),$Ct=lu(c6()),ewt=lu(rwe()),twt=WCt(U6()),rwt=lu(eq()),nwt=lu(Dwe()),sC=process.env.CI===\"false\"?!1:JCt.default,bwe=()=>{},dq=class{constructor(e){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;let{output:r,outputHeight:o,staticOutput:a}=ZCt.default(this.rootNode,this.options.stdout.columns||80),n=a&&a!==`\n`;if(this.options.debug){n&&(this.fullStaticOutput+=a),this.options.stdout.write(this.fullStaticOutput+r);return}if(sC){n&&this.options.stdout.write(a),this.lastOutput=r;return}if(n&&(this.fullStaticOutput+=a),o>=this.options.stdout.rows){this.options.stdout.write(zCt.default.clearTerminal+this.fullStaticOutput+r),this.lastOutput=r;return}n&&(this.log.clear(),this.options.stdout.write(a),this.log(r)),!n&&r!==this.lastOutput&&this.throttledLog(r),this.lastOutput=r},XCt.default(this),this.options=e,this.rootNode=twt.createNode(\"ink-root\"),this.rootNode.onRender=e.debug?this.onRender:Pwe(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=VCt.default.create(e.stdout),this.throttledLog=e.debug?this.log:Pwe(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput=\"\",this.fullStaticOutput=\"\",this.container=gq.default.createContainer(this.rootNode,!1,!1),this.unsubscribeExit=$Ct.default(this.unmount,{alwaysLast:!1}),e.patchConsole&&this.patchConsole(),sC||(e.stdout.on(\"resize\",this.onRender),this.unsubscribeResize=()=>{e.stdout.off(\"resize\",this.onRender)})}render(e){let r=KCt.default.createElement(nwt.default,{stdin:this.options.stdin,stdout:this.options.stdout,stderr:this.options.stderr,writeToStdout:this.writeToStdout,writeToStderr:this.writeToStderr,exitOnCtrlC:this.options.exitOnCtrlC,onExit:this.unmount},e);gq.default.updateContainer(r,this.container,null,bwe)}writeToStdout(e){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(e+this.fullStaticOutput+this.lastOutput);return}if(sC){this.options.stdout.write(e);return}this.log.clear(),this.options.stdout.write(e),this.log(this.lastOutput)}}writeToStderr(e){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(e),this.options.stdout.write(this.fullStaticOutput+this.lastOutput);return}if(sC){this.options.stderr.write(e);return}this.log.clear(),this.options.stderr.write(e),this.log(this.lastOutput)}}unmount(e){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole==\"function\"&&this.restoreConsole(),typeof this.unsubscribeResize==\"function\"&&this.unsubscribeResize(),sC?this.options.stdout.write(this.lastOutput+`\n`):this.options.debug||this.log.done(),this.isUnmounted=!0,gq.default.updateContainer(null,this.container,null,bwe),rwt.default.delete(this.options.stdout),e instanceof Error?this.rejectExitPromise(e):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((e,r)=>{this.resolveExitPromise=e,this.rejectExitPromise=r})),this.exitPromise}clear(){!sC&&!this.options.debug&&this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=ewt.default((e,r)=>{e===\"stdout\"&&this.writeToStdout(r),e===\"stderr\"&&(r.startsWith(\"The above error occurred\")||this.writeToStderr(r))}))}};au.default=dq});var kwe=_(lB=>{\"use strict\";var xwe=lB&&lB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(lB,\"__esModule\",{value:!0});var iwt=xwe(Swe()),Jk=xwe(eq()),swt=ve(\"stream\"),owt=(t,e)=>{let r=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},awt(e)),o=lwt(r.stdout,()=>new iwt.default(r));return o.render(t),{rerender:o.render,unmount:()=>o.unmount(),waitUntilExit:o.waitUntilExit,cleanup:()=>Jk.default.delete(r.stdout),clear:o.clear}};lB.default=owt;var awt=(t={})=>t instanceof swt.Stream?{stdout:t,stdin:process.stdin}:t,lwt=(t,e)=>{let r;return Jk.default.has(t)?r=Jk.default.get(t):(r=e(),Jk.default.set(t,r)),r}});var Fwe=_(Jf=>{\"use strict\";var cwt=Jf&&Jf.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),uwt=Jf&&Jf.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,\"default\",{enumerable:!0,value:e})}:function(t,e){t.default=e}),Awt=Jf&&Jf.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!==\"default\"&&Object.hasOwnProperty.call(t,r)&&cwt(e,t,r);return uwt(e,t),e};Object.defineProperty(Jf,\"__esModule\",{value:!0});var cB=Awt(an()),Qwe=t=>{let{items:e,children:r,style:o}=t,[a,n]=cB.useState(0),u=cB.useMemo(()=>e.slice(a),[e,a]);cB.useLayoutEffect(()=>{n(e.length)},[e.length]);let A=u.map((h,E)=>r(h,a+E)),p=cB.useMemo(()=>Object.assign({position:\"absolute\",flexDirection:\"column\"},o),[o]);return cB.default.createElement(\"ink-box\",{internal_static:!0,style:p},A)};Qwe.displayName=\"Static\";Jf.default=Qwe});var Twe=_(uB=>{\"use strict\";var fwt=uB&&uB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(uB,\"__esModule\",{value:!0});var pwt=fwt(an()),Rwe=({children:t,transform:e})=>t==null?null:pwt.default.createElement(\"ink-text\",{style:{flexGrow:0,flexShrink:1,flexDirection:\"row\"},internal_transform:e},t);Rwe.displayName=\"Transform\";uB.default=Rwe});var Lwe=_(AB=>{\"use strict\";var hwt=AB&&AB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(AB,\"__esModule\",{value:!0});var gwt=hwt(an()),Nwe=({count:t=1})=>gwt.default.createElement(\"ink-text\",null,`\n`.repeat(t));Nwe.displayName=\"Newline\";AB.default=Nwe});var Uwe=_(fB=>{\"use strict\";var Mwe=fB&&fB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(fB,\"__esModule\",{value:!0});var dwt=Mwe(an()),mwt=Mwe(Vk()),Owe=()=>dwt.default.createElement(mwt.default,{flexGrow:1});Owe.displayName=\"Spacer\";fB.default=Owe});var Xk=_(pB=>{\"use strict\";var ywt=pB&&pB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(pB,\"__esModule\",{value:!0});var Ewt=an(),Cwt=ywt(iq()),wwt=()=>Ewt.useContext(Cwt.default);pB.default=wwt});var Hwe=_(hB=>{\"use strict\";var Iwt=hB&&hB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(hB,\"__esModule\",{value:!0});var _we=an(),Bwt=Iwt(Xk()),vwt=(t,e={})=>{let{stdin:r,setRawMode:o,internal_exitOnCtrlC:a}=Bwt.default();_we.useEffect(()=>{if(e.isActive!==!1)return o(!0),()=>{o(!1)}},[e.isActive,o]),_we.useEffect(()=>{if(e.isActive===!1)return;let n=u=>{let A=String(u),p={upArrow:A===\"\\x1B[A\",downArrow:A===\"\\x1B[B\",leftArrow:A===\"\\x1B[D\",rightArrow:A===\"\\x1B[C\",pageDown:A===\"\\x1B[6~\",pageUp:A===\"\\x1B[5~\",return:A===\"\\r\",escape:A===\"\\x1B\",ctrl:!1,shift:!1,tab:A===\"\t\"||A===\"\\x1B[Z\",backspace:A===\"\\b\",delete:A===\"\\x7F\"||A===\"\\x1B[3~\",meta:!1};A<=\"\u001a\"&&!p.return&&(A=String.fromCharCode(A.charCodeAt(0)+97-1),p.ctrl=!0),A.startsWith(\"\\x1B\")&&(A=A.slice(1),p.meta=!0);let h=A>=\"A\"&&A<=\"Z\",E=A>=\"\\u0410\"&&A<=\"\\u042F\";A.length===1&&(h||E)&&(p.shift=!0),p.tab&&A===\"[Z\"&&(p.shift=!0),(p.tab||p.backspace||p.delete)&&(A=\"\"),(!(A===\"c\"&&p.ctrl)||!a)&&t(A,p)};return r?.on(\"data\",n),()=>{r?.off(\"data\",n)}},[e.isActive,r,a,t])};hB.default=vwt});var qwe=_(gB=>{\"use strict\";var Dwt=gB&&gB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(gB,\"__esModule\",{value:!0});var Pwt=an(),bwt=Dwt(rq()),Swt=()=>Pwt.useContext(bwt.default);gB.default=Swt});var jwe=_(dB=>{\"use strict\";var xwt=dB&&dB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(dB,\"__esModule\",{value:!0});var kwt=an(),Qwt=xwt(oq()),Fwt=()=>kwt.useContext(Qwt.default);dB.default=Fwt});var Gwe=_(mB=>{\"use strict\";var Rwt=mB&&mB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(mB,\"__esModule\",{value:!0});var Twt=an(),Nwt=Rwt(lq()),Lwt=()=>Twt.useContext(Nwt.default);mB.default=Lwt});var Wwe=_(EB=>{\"use strict\";var Ywe=EB&&EB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(EB,\"__esModule\",{value:!0});var yB=an(),Mwt=Ywe(Kk()),Owt=Ywe(Xk()),Uwt=({isActive:t=!0,autoFocus:e=!1}={})=>{let{isRawModeSupported:r,setRawMode:o}=Owt.default(),{activeId:a,add:n,remove:u,activate:A,deactivate:p}=yB.useContext(Mwt.default),h=yB.useMemo(()=>Math.random().toString().slice(2,7),[]);return yB.useEffect(()=>(n(h,{autoFocus:e}),()=>{u(h)}),[h,e]),yB.useEffect(()=>{t?A(h):p(h)},[t,h]),yB.useEffect(()=>{if(!(!r||!t))return o(!0),()=>{o(!1)}},[t]),{isFocused:!!h&&a===h}};EB.default=Uwt});var Kwe=_(CB=>{\"use strict\";var _wt=CB&&CB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(CB,\"__esModule\",{value:!0});var Hwt=an(),qwt=_wt(Kk()),jwt=()=>{let t=Hwt.useContext(qwt.default);return{enableFocus:t.enableFocus,disableFocus:t.disableFocus,focusNext:t.focusNext,focusPrevious:t.focusPrevious}};CB.default=jwt});var Vwe=_(mq=>{\"use strict\";Object.defineProperty(mq,\"__esModule\",{value:!0});mq.default=t=>{var e,r,o,a;return{width:(r=(e=t.yogaNode)===null||e===void 0?void 0:e.getComputedWidth())!==null&&r!==void 0?r:0,height:(a=(o=t.yogaNode)===null||o===void 0?void 0:o.getComputedHeight())!==null&&a!==void 0?a:0}}});var ic=_(ro=>{\"use strict\";Object.defineProperty(ro,\"__esModule\",{value:!0});var Gwt=kwe();Object.defineProperty(ro,\"render\",{enumerable:!0,get:function(){return Gwt.default}});var Ywt=Vk();Object.defineProperty(ro,\"Box\",{enumerable:!0,get:function(){return Ywt.default}});var Wwt=hq();Object.defineProperty(ro,\"Text\",{enumerable:!0,get:function(){return Wwt.default}});var Kwt=Fwe();Object.defineProperty(ro,\"Static\",{enumerable:!0,get:function(){return Kwt.default}});var Vwt=Twe();Object.defineProperty(ro,\"Transform\",{enumerable:!0,get:function(){return Vwt.default}});var zwt=Lwe();Object.defineProperty(ro,\"Newline\",{enumerable:!0,get:function(){return zwt.default}});var Jwt=Uwe();Object.defineProperty(ro,\"Spacer\",{enumerable:!0,get:function(){return Jwt.default}});var Xwt=Hwe();Object.defineProperty(ro,\"useInput\",{enumerable:!0,get:function(){return Xwt.default}});var Zwt=qwe();Object.defineProperty(ro,\"useApp\",{enumerable:!0,get:function(){return Zwt.default}});var $wt=Xk();Object.defineProperty(ro,\"useStdin\",{enumerable:!0,get:function(){return $wt.default}});var eIt=jwe();Object.defineProperty(ro,\"useStdout\",{enumerable:!0,get:function(){return eIt.default}});var tIt=Gwe();Object.defineProperty(ro,\"useStderr\",{enumerable:!0,get:function(){return tIt.default}});var rIt=Wwe();Object.defineProperty(ro,\"useFocus\",{enumerable:!0,get:function(){return rIt.default}});var nIt=Kwe();Object.defineProperty(ro,\"useFocusManager\",{enumerable:!0,get:function(){return nIt.default}});var iIt=Vwe();Object.defineProperty(ro,\"measureElement\",{enumerable:!0,get:function(){return iIt.default}})});var Eq={};Vt(Eq,{Gem:()=>yq});var zwe,ed,yq,Zk=Et(()=>{zwe=Ze(ic()),ed=Ze(an()),yq=(0,ed.memo)(({active:t})=>{let e=(0,ed.useMemo)(()=>t?\"\\u25C9\":\"\\u25EF\",[t]),r=(0,ed.useMemo)(()=>t?\"green\":\"yellow\",[t]);return ed.default.createElement(zwe.Text,{color:r},e)})});var Xwe={};Vt(Xwe,{useKeypress:()=>td});function td({active:t},e,r){let{stdin:o}=(0,Jwe.useStdin)(),a=(0,$k.useCallback)((n,u)=>e(n,u),r);(0,$k.useEffect)(()=>{if(!(!t||!o))return o.on(\"keypress\",a),()=>{o.off(\"keypress\",a)}},[t,a,o])}var Jwe,$k,wB=Et(()=>{Jwe=Ze(ic()),$k=Ze(an())});var $we={};Vt($we,{FocusRequest:()=>Zwe,useFocusRequest:()=>Cq});var Zwe,Cq,wq=Et(()=>{wB();Zwe=(r=>(r.BEFORE=\"before\",r.AFTER=\"after\",r))(Zwe||{}),Cq=function({active:t},e,r){td({active:t},(o,a)=>{a.name===\"tab\"&&(a.shift?e(\"before\"):e(\"after\"))},r)}});var eIe={};Vt(eIe,{useListInput:()=>IB});var IB,eQ=Et(()=>{wB();IB=function(t,e,{active:r,minus:o,plus:a,set:n,loop:u=!0}){td({active:r},(A,p)=>{let h=e.indexOf(t);switch(p.name){case o:{let E=h-1;if(u){n(e[(e.length+E)%e.length]);return}if(E<0)return;n(e[E])}break;case a:{let E=h+1;if(u){n(e[E%e.length]);return}if(E>=e.length)return;n(e[E])}break}},[e,t,a,n,u])}});var tQ={};Vt(tQ,{ScrollableItems:()=>sIt});var Lh,Oa,sIt,rQ=Et(()=>{Lh=Ze(ic()),Oa=Ze(an());wq();eQ();sIt=({active:t=!0,children:e=[],radius:r=10,size:o=1,loop:a=!0,onFocusRequest:n,willReachEnd:u})=>{let A=L=>{if(L.key===null)throw new Error(\"Expected all children to have a key\");return L.key},p=Oa.default.Children.map(e,L=>A(L)),h=p[0],[E,I]=(0,Oa.useState)(h),v=p.indexOf(E);(0,Oa.useEffect)(()=>{p.includes(E)||I(h)},[e]),(0,Oa.useEffect)(()=>{u&&v>=p.length-2&&u()},[v]),Cq({active:t&&!!n},L=>{n?.(L)},[n]),IB(E,p,{active:t,minus:\"up\",plus:\"down\",set:I,loop:a});let x=v-r,C=v+r;C>p.length&&(x-=C-p.length,C=p.length),x<0&&(C+=-x,x=0),C>=p.length&&(C=p.length-1);let R=[];for(let L=x;L<=C;++L){let U=p[L],z=t&&U===E;R.push(Oa.default.createElement(Lh.Box,{key:U,height:o},Oa.default.createElement(Lh.Box,{marginLeft:1,marginRight:1},Oa.default.createElement(Lh.Text,null,z?Oa.default.createElement(Lh.Text,{color:\"cyan\",bold:!0},\">\"):\" \")),Oa.default.createElement(Lh.Box,null,Oa.default.cloneElement(e[L],{active:z}))))}return Oa.default.createElement(Lh.Box,{flexDirection:\"column\",width:\"100%\"},R)}});var tIe,Xf,rIe,Iq,nIe,Bq=Et(()=>{tIe=Ze(ic()),Xf=Ze(an()),rIe=ve(\"readline\"),Iq=Xf.default.createContext(null),nIe=({children:t})=>{let{stdin:e,setRawMode:r}=(0,tIe.useStdin)();(0,Xf.useEffect)(()=>{r&&r(!0),e&&(0,rIe.emitKeypressEvents)(e)},[e,r]);let[o,a]=(0,Xf.useState)(new Map),n=(0,Xf.useMemo)(()=>({getAll:()=>o,get:u=>o.get(u),set:(u,A)=>a(new Map([...o,[u,A]]))}),[o,a]);return Xf.default.createElement(Iq.Provider,{value:n,children:t})}});var vq={};Vt(vq,{useMinistore:()=>oIt});function oIt(t,e){let r=(0,nQ.useContext)(Iq);if(r===null)throw new Error(\"Expected this hook to run with a ministore context attached\");if(typeof t>\"u\")return r.getAll();let o=(0,nQ.useCallback)(n=>{r.set(t,n)},[t,r.set]),a=r.get(t);return typeof a>\"u\"&&(a=e),[a,o]}var nQ,Dq=Et(()=>{nQ=Ze(an());Bq()});var sQ={};Vt(sQ,{renderForm:()=>aIt});async function aIt(t,e,{stdin:r,stdout:o,stderr:a}){let n,u=p=>{let{exit:h}=(0,iQ.useApp)();td({active:!0},(E,I)=>{I.name===\"return\"&&(n=p,h())},[h,p])},{waitUntilExit:A}=(0,iQ.render)(Pq.default.createElement(nIe,null,Pq.default.createElement(t,{...e,useSubmit:u})),{stdin:r,stdout:o,stderr:a});return await A(),n}var iQ,Pq,oQ=Et(()=>{iQ=Ze(ic()),Pq=Ze(an());Bq();wB()});var aIe=_(BB=>{\"use strict\";Object.defineProperty(BB,\"__esModule\",{value:!0});BB.UncontrolledTextInput=void 0;var sIe=an(),bq=an(),iIe=ic(),rd=Yk(),oIe=({value:t,placeholder:e=\"\",focus:r=!0,mask:o,highlightPastedText:a=!1,showCursor:n=!0,onChange:u,onSubmit:A})=>{let[{cursorOffset:p,cursorWidth:h},E]=bq.useState({cursorOffset:(t||\"\").length,cursorWidth:0});bq.useEffect(()=>{E(R=>{if(!r||!n)return R;let L=t||\"\";return R.cursorOffset>L.length-1?{cursorOffset:L.length,cursorWidth:0}:R})},[t,r,n]);let I=a?h:0,v=o?o.repeat(t.length):t,x=v,C=e?rd.grey(e):void 0;if(n&&r){C=e.length>0?rd.inverse(e[0])+rd.grey(e.slice(1)):rd.inverse(\" \"),x=v.length>0?\"\":rd.inverse(\" \");let R=0;for(let L of v)R>=p-I&&R<=p?x+=rd.inverse(L):x+=L,R++;v.length>0&&p===v.length&&(x+=rd.inverse(\" \"))}return iIe.useInput((R,L)=>{if(L.upArrow||L.downArrow||L.ctrl&&R===\"c\"||L.tab||L.shift&&L.tab)return;if(L.return){A&&A(t);return}let U=p,z=t,te=0;L.leftArrow?n&&U--:L.rightArrow?n&&U++:L.backspace||L.delete?p>0&&(z=t.slice(0,p-1)+t.slice(p,t.length),U--):(z=t.slice(0,p)+R+t.slice(p,t.length),U+=R.length,R.length>1&&(te=R.length)),p<0&&(U=0),p>t.length&&(U=t.length),E({cursorOffset:U,cursorWidth:te}),z!==t&&u(z)},{isActive:r}),sIe.createElement(iIe.Text,null,e?v.length>0?x:C:x)};BB.default=oIe;BB.UncontrolledTextInput=t=>{let[e,r]=bq.useState(\"\");return sIe.createElement(oIe,Object.assign({},t,{value:e,onChange:r}))}});var uIe={};Vt(uIe,{Pad:()=>Sq});var lIe,cIe,Sq,xq=Et(()=>{lIe=Ze(ic()),cIe=Ze(an()),Sq=({length:t,active:e})=>{if(t===0)return null;let r=t>1?` ${\"-\".repeat(t-1)}`:\" \";return cIe.default.createElement(lIe.Text,{dimColor:!e},r)}});var AIe={};Vt(AIe,{ItemOptions:()=>lIt});var DB,Mh,lIt,fIe=Et(()=>{DB=Ze(ic()),Mh=Ze(an());eQ();Zk();xq();lIt=function({active:t,skewer:e,options:r,value:o,onChange:a,sizes:n=[]}){let u=r.filter(({label:p})=>!!p).map(({value:p})=>p),A=r.findIndex(p=>p.value===o&&p.label!=\"\");return IB(o,u,{active:t,minus:\"left\",plus:\"right\",set:a}),Mh.default.createElement(Mh.default.Fragment,null,r.map(({label:p},h)=>{let E=h===A,I=n[h]-1||0,v=p.replace(/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,\"\"),x=Math.max(0,I-v.length-2);return p?Mh.default.createElement(DB.Box,{key:p,width:I,marginLeft:1},Mh.default.createElement(DB.Text,{wrap:\"truncate\"},Mh.default.createElement(yq,{active:E}),\" \",p),e?Mh.default.createElement(Sq,{active:t,length:x}):null):Mh.default.createElement(DB.Box,{key:`spacer-${h}`,width:I,marginLeft:1})}))}});var bIe=_((nJt,PIe)=>{var Oq;PIe.exports=()=>(typeof Oq>\"u\"&&(Oq=ve(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),Oq)});var VIe=_((SJt,KIe)=>{var Kq=Symbol(\"arg flag\"),sc=class t extends Error{constructor(e,r){super(e),this.name=\"ArgError\",this.code=r,Object.setPrototypeOf(this,t.prototype)}};function HB(t,{argv:e=process.argv.slice(2),permissive:r=!1,stopAtPositional:o=!1}={}){if(!t)throw new sc(\"argument specification object is required\",\"ARG_CONFIG_NO_SPEC\");let a={_:[]},n={},u={};for(let A of Object.keys(t)){if(!A)throw new sc(\"argument key cannot be an empty string\",\"ARG_CONFIG_EMPTY_KEY\");if(A[0]!==\"-\")throw new sc(`argument key must start with '-' but found: '${A}'`,\"ARG_CONFIG_NONOPT_KEY\");if(A.length===1)throw new sc(`argument key must have a name; singular '-' keys are not allowed: ${A}`,\"ARG_CONFIG_NONAME_KEY\");if(typeof t[A]==\"string\"){n[A]=t[A];continue}let p=t[A],h=!1;if(Array.isArray(p)&&p.length===1&&typeof p[0]==\"function\"){let[E]=p;p=(I,v,x=[])=>(x.push(E(I,v,x[x.length-1])),x),h=E===Boolean||E[Kq]===!0}else if(typeof p==\"function\")h=p===Boolean||p[Kq]===!0;else throw new sc(`type missing or not a function or valid array type: ${A}`,\"ARG_CONFIG_VAD_TYPE\");if(A[1]!==\"-\"&&A.length>2)throw new sc(`short argument keys (with a single hyphen) must have only one character: ${A}`,\"ARG_CONFIG_SHORTOPT_TOOLONG\");u[A]=[p,h]}for(let A=0,p=e.length;A<p;A++){let h=e[A];if(o&&a._.length>0){a._=a._.concat(e.slice(A));break}if(h===\"--\"){a._=a._.concat(e.slice(A+1));break}if(h.length>1&&h[0]===\"-\"){let E=h[1]===\"-\"||h.length===2?[h]:h.slice(1).split(\"\").map(I=>`-${I}`);for(let I=0;I<E.length;I++){let v=E[I],[x,C]=v[1]===\"-\"?v.split(/=(.*)/,2):[v,void 0],R=x;for(;R in n;)R=n[R];if(!(R in u))if(r){a._.push(v);continue}else throw new sc(`unknown or unexpected option: ${x}`,\"ARG_UNKNOWN_OPTION\");let[L,U]=u[R];if(!U&&I+1<E.length)throw new sc(`option requires argument (but was followed by another short argument): ${x}`,\"ARG_MISSING_REQUIRED_SHORTARG\");if(U)a[R]=L(!0,R,a[R]);else if(C===void 0){if(e.length<A+2||e[A+1].length>1&&e[A+1][0]===\"-\"&&!(e[A+1].match(/^-?\\d*(\\.(?=\\d))?\\d*$/)&&(L===Number||typeof BigInt<\"u\"&&L===BigInt))){let z=x===R?\"\":` (alias for ${R})`;throw new sc(`option requires argument: ${x}${z}`,\"ARG_MISSING_REQUIRED_LONGARG\")}a[R]=L(e[A+1],R,a[R]),++A}else a[R]=L(C,R,a[R])}}else a._.push(h)}return a}HB.flag=t=>(t[Kq]=!0,t);HB.COUNT=HB.flag((t,e,r)=>(r||0)+1);HB.ArgError=sc;KIe.exports=HB});var r1e=_((iXt,t1e)=>{var Xq;t1e.exports=()=>(typeof Xq>\"u\"&&(Xq=ve(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),Xq)});var a1e=_((nj,ij)=>{(function(t){nj&&typeof nj==\"object\"&&typeof ij<\"u\"?ij.exports=t():typeof define==\"function\"&&define.amd?define([],t):typeof window<\"u\"?window.isWindows=t():typeof global<\"u\"?global.isWindows=t():typeof self<\"u\"?self.isWindows=t():this.isWindows=t()})(function(){\"use strict\";return function(){return process&&(process.platform===\"win32\"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var A1e=_((rZt,u1e)=>{\"use strict\";sj.ifExists=s1t;var uC=ve(\"util\"),oc=ve(\"path\"),l1e=a1e(),r1t=/^#!\\s*(?:\\/usr\\/bin\\/env)?\\s*([^ \\t]+)(.*)$/,n1t={createPwshFile:!0,createCmdFile:l1e(),fs:ve(\"fs\")},i1t=new Map([[\".js\",\"node\"],[\".cjs\",\"node\"],[\".mjs\",\"node\"],[\".cmd\",\"cmd\"],[\".bat\",\"cmd\"],[\".ps1\",\"pwsh\"],[\".sh\",\"sh\"]]);function c1e(t){let e={...n1t,...t},r=e.fs;return e.fs_={chmod:r.chmod?uC.promisify(r.chmod):async()=>{},mkdir:uC.promisify(r.mkdir),readFile:uC.promisify(r.readFile),stat:uC.promisify(r.stat),unlink:uC.promisify(r.unlink),writeFile:uC.promisify(r.writeFile)},e}async function sj(t,e,r){let o=c1e(r);await o.fs_.stat(t),await a1t(t,e,o)}function s1t(t,e,r){return sj(t,e,r).catch(()=>{})}function o1t(t,e){return e.fs_.unlink(t).catch(()=>{})}async function a1t(t,e,r){let o=await f1t(t,r);return await l1t(e,r),c1t(t,e,o,r)}function l1t(t,e){return e.fs_.mkdir(oc.dirname(t),{recursive:!0})}function c1t(t,e,r,o){let a=c1e(o),n=[{generator:g1t,extension:\"\"}];return a.createCmdFile&&n.push({generator:h1t,extension:\".cmd\"}),a.createPwshFile&&n.push({generator:d1t,extension:\".ps1\"}),Promise.all(n.map(u=>p1t(t,e+u.extension,r,u.generator,a)))}function u1t(t,e){return o1t(t,e)}function A1t(t,e){return m1t(t,e)}async function f1t(t,e){let a=(await e.fs_.readFile(t,\"utf8\")).trim().split(/\\r*\\n/)[0].match(r1t);if(!a){let n=oc.extname(t).toLowerCase();return{program:i1t.get(n)||null,additionalArgs:\"\"}}return{program:a[1],additionalArgs:a[2]}}async function p1t(t,e,r,o,a){let n=a.preserveSymlinks?\"--preserve-symlinks\":\"\",u=[r.additionalArgs,n].filter(A=>A).join(\" \");return a=Object.assign({},a,{prog:r.program,args:u}),await u1t(e,a),await a.fs_.writeFile(e,o(t,e,a),\"utf8\"),A1t(e,a)}function h1t(t,e,r){let a=oc.relative(oc.dirname(e),t).split(\"/\").join(\"\\\\\"),n=oc.isAbsolute(a)?`\"${a}\"`:`\"%~dp0\\\\${a}\"`,u,A=r.prog,p=r.args||\"\",h=oj(r.nodePath).win32;A?(u=`\"%~dp0\\\\${A}.exe\"`,a=n):(A=n,p=\"\",a=\"\");let E=r.progArgs?`${r.progArgs.join(\" \")} `:\"\",I=h?`@SET NODE_PATH=${h}\\r\n`:\"\";return u?I+=`@IF EXIST ${u} (\\r\n  ${u} ${p} ${a} ${E}%*\\r\n) ELSE (\\r\n  @SETLOCAL\\r\n  @SET PATHEXT=%PATHEXT:;.JS;=;%\\r\n  ${A} ${p} ${a} ${E}%*\\r\n)\\r\n`:I+=`@${A} ${p} ${a} ${E}%*\\r\n`,I}function g1t(t,e,r){let o=oc.relative(oc.dirname(e),t),a=r.prog&&r.prog.split(\"\\\\\").join(\"/\"),n;o=o.split(\"\\\\\").join(\"/\");let u=oc.isAbsolute(o)?`\"${o}\"`:`\"$basedir/${o}\"`,A=r.args||\"\",p=oj(r.nodePath).posix;a?(n=`\"$basedir/${r.prog}\"`,o=u):(a=u,A=\"\",o=\"\");let h=r.progArgs?`${r.progArgs.join(\" \")} `:\"\",E=`#!/bin/sh\nbasedir=$(dirname \"$(echo \"$0\" | sed -e 's,\\\\\\\\,/,g')\")\n\ncase \\`uname\\` in\n    *CYGWIN*) basedir=\\`cygpath -w \"$basedir\"\\`;;\nesac\n\n`,I=r.nodePath?`export NODE_PATH=\"${p}\"\n`:\"\";return n?E+=`${I}if [ -x ${n} ]; then\n  exec ${n} ${A} ${o} ${h}\"$@\"\nelse\n  exec ${a} ${A} ${o} ${h}\"$@\"\nfi\n`:E+=`${I}${a} ${A} ${o} ${h}\"$@\"\nexit $?\n`,E}function d1t(t,e,r){let o=oc.relative(oc.dirname(e),t),a=r.prog&&r.prog.split(\"\\\\\").join(\"/\"),n=a&&`\"${a}$exe\"`,u;o=o.split(\"\\\\\").join(\"/\");let A=oc.isAbsolute(o)?`\"${o}\"`:`\"$basedir/${o}\"`,p=r.args||\"\",h=oj(r.nodePath),E=h.win32,I=h.posix;n?(u=`\"$basedir/${r.prog}$exe\"`,o=A):(n=A,p=\"\",o=\"\");let v=r.progArgs?`${r.progArgs.join(\" \")} `:\"\",x=`#!/usr/bin/env pwsh\n$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n\n$exe=\"\"\n${r.nodePath?`$env_node_path=$env:NODE_PATH\n$env:NODE_PATH=\"${E}\"\n`:\"\"}if ($PSVersionTable.PSVersion -lt \"6.0\" -or $IsWindows) {\n  # Fix case when both the Windows and Linux builds of Node\n  # are installed in the same directory\n  $exe=\".exe\"\n}`;return r.nodePath&&(x+=` else {\n  $env:NODE_PATH=\"${I}\"\n}`),u?x+=`\n$ret=0\nif (Test-Path ${u}) {\n  # Support pipeline input\n  if ($MyInvocation.ExpectingInput) {\n    $input | & ${u} ${p} ${o} ${v}$args\n  } else {\n    & ${u} ${p} ${o} ${v}$args\n  }\n  $ret=$LASTEXITCODE\n} else {\n  # Support pipeline input\n  if ($MyInvocation.ExpectingInput) {\n    $input | & ${n} ${p} ${o} ${v}$args\n  } else {\n    & ${n} ${p} ${o} ${v}$args\n  }\n  $ret=$LASTEXITCODE\n}\n${r.nodePath?`$env:NODE_PATH=$env_node_path\n`:\"\"}exit $ret\n`:x+=`\n# Support pipeline input\nif ($MyInvocation.ExpectingInput) {\n  $input | & ${n} ${p} ${o} ${v}$args\n} else {\n  & ${n} ${p} ${o} ${v}$args\n}\n${r.nodePath?`$env:NODE_PATH=$env_node_path\n`:\"\"}exit $LASTEXITCODE\n`,x}function m1t(t,e){return e.fs_.chmod(t,493)}function oj(t){if(!t)return{win32:\"\",posix:\"\"};let e=typeof t==\"string\"?t.split(oc.delimiter):Array.from(t),r={};for(let o=0;o<e.length;o++){let a=e[o].split(\"/\").join(\"\\\\\"),n=l1e()?e[o].split(\"\\\\\").join(\"/\").replace(/^([^:\\\\/]*):/,(u,A)=>`/mnt/${A.toLowerCase()}`):e[o];r.win32=r.win32?`${r.win32};${a}`:a,r.posix=r.posix?`${r.posix}:${n}`:n,r[o]={win32:a,posix:n}}return r}u1e.exports=sj});var Cj=_((B$t,Q1e)=>{Q1e.exports=ve(\"stream\")});var N1e=_((v$t,T1e)=>{\"use strict\";function F1e(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,o)}return r}function G1t(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=null?arguments[e]:{};e%2?F1e(Object(r),!0).forEach(function(o){Y1t(t,o,r[o])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):F1e(Object(r)).forEach(function(o){Object.defineProperty(t,o,Object.getOwnPropertyDescriptor(r,o))})}return t}function Y1t(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}function W1t(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function R1e(t,e){for(var r=0;r<e.length;r++){var o=e[r];o.enumerable=o.enumerable||!1,o.configurable=!0,\"value\"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function K1t(t,e,r){return e&&R1e(t.prototype,e),r&&R1e(t,r),t}var V1t=ve(\"buffer\"),yQ=V1t.Buffer,z1t=ve(\"util\"),wj=z1t.inspect,J1t=wj&&wj.custom||\"inspect\";function X1t(t,e,r){yQ.prototype.copy.call(t,e,r)}T1e.exports=function(){function t(){W1t(this,t),this.head=null,this.tail=null,this.length=0}return K1t(t,[{key:\"push\",value:function(r){var o={data:r,next:null};this.length>0?this.tail.next=o:this.head=o,this.tail=o,++this.length}},{key:\"unshift\",value:function(r){var o={data:r,next:this.head};this.length===0&&(this.tail=o),this.head=o,++this.length}},{key:\"shift\",value:function(){if(this.length!==0){var r=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,r}}},{key:\"clear\",value:function(){this.head=this.tail=null,this.length=0}},{key:\"join\",value:function(r){if(this.length===0)return\"\";for(var o=this.head,a=\"\"+o.data;o=o.next;)a+=r+o.data;return a}},{key:\"concat\",value:function(r){if(this.length===0)return yQ.alloc(0);for(var o=yQ.allocUnsafe(r>>>0),a=this.head,n=0;a;)X1t(a.data,o,n),n+=a.data.length,a=a.next;return o}},{key:\"consume\",value:function(r,o){var a;return r<this.head.data.length?(a=this.head.data.slice(0,r),this.head.data=this.head.data.slice(r)):r===this.head.data.length?a=this.shift():a=o?this._getString(r):this._getBuffer(r),a}},{key:\"first\",value:function(){return this.head.data}},{key:\"_getString\",value:function(r){var o=this.head,a=1,n=o.data;for(r-=n.length;o=o.next;){var u=o.data,A=r>u.length?u.length:r;if(A===u.length?n+=u:n+=u.slice(0,r),r-=A,r===0){A===u.length?(++a,o.next?this.head=o.next:this.head=this.tail=null):(this.head=o,o.data=u.slice(A));break}++a}return this.length-=a,n}},{key:\"_getBuffer\",value:function(r){var o=yQ.allocUnsafe(r),a=this.head,n=1;for(a.data.copy(o),r-=a.data.length;a=a.next;){var u=a.data,A=r>u.length?u.length:r;if(u.copy(o,o.length-r,0,A),r-=A,r===0){A===u.length?(++n,a.next?this.head=a.next:this.head=this.tail=null):(this.head=a,a.data=u.slice(A));break}++n}return this.length-=n,o}},{key:J1t,value:function(r,o){return wj(this,G1t({},o,{depth:0,customInspect:!1}))}}]),t}()});var Bj=_((D$t,M1e)=>{\"use strict\";function Z1t(t,e){var r=this,o=this._readableState&&this._readableState.destroyed,a=this._writableState&&this._writableState.destroyed;return o||a?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(Ij,this,t)):process.nextTick(Ij,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(n){!e&&n?r._writableState?r._writableState.errorEmitted?process.nextTick(EQ,r):(r._writableState.errorEmitted=!0,process.nextTick(L1e,r,n)):process.nextTick(L1e,r,n):e?(process.nextTick(EQ,r),e(n)):process.nextTick(EQ,r)}),this)}function L1e(t,e){Ij(t,e),EQ(t)}function EQ(t){t._writableState&&!t._writableState.emitClose||t._readableState&&!t._readableState.emitClose||t.emit(\"close\")}function $1t(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function Ij(t,e){t.emit(\"error\",e)}function e2t(t,e){var r=t._readableState,o=t._writableState;r&&r.autoDestroy||o&&o.autoDestroy?t.destroy(e):t.emit(\"error\",e)}M1e.exports={destroy:Z1t,undestroy:$1t,errorOrDestroy:e2t}});var Gh=_((P$t,_1e)=>{\"use strict\";var U1e={};function lc(t,e,r){r||(r=Error);function o(n,u,A){return typeof e==\"string\"?e:e(n,u,A)}class a extends r{constructor(u,A,p){super(o(u,A,p))}}a.prototype.name=r.name,a.prototype.code=t,U1e[t]=a}function O1e(t,e){if(Array.isArray(t)){let r=t.length;return t=t.map(o=>String(o)),r>2?`one of ${e} ${t.slice(0,r-1).join(\", \")}, or `+t[r-1]:r===2?`one of ${e} ${t[0]} or ${t[1]}`:`of ${e} ${t[0]}`}else return`of ${e} ${String(t)}`}function t2t(t,e,r){return t.substr(!r||r<0?0:+r,e.length)===e}function r2t(t,e,r){return(r===void 0||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}function n2t(t,e,r){return typeof r!=\"number\"&&(r=0),r+e.length>t.length?!1:t.indexOf(e,r)!==-1}lc(\"ERR_INVALID_OPT_VALUE\",function(t,e){return'The value \"'+e+'\" is invalid for option \"'+t+'\"'},TypeError);lc(\"ERR_INVALID_ARG_TYPE\",function(t,e,r){let o;typeof e==\"string\"&&t2t(e,\"not \")?(o=\"must not be\",e=e.replace(/^not /,\"\")):o=\"must be\";let a;if(r2t(t,\" argument\"))a=`The ${t} ${o} ${O1e(e,\"type\")}`;else{let n=n2t(t,\".\")?\"property\":\"argument\";a=`The \"${t}\" ${n} ${o} ${O1e(e,\"type\")}`}return a+=`. Received type ${typeof r}`,a},TypeError);lc(\"ERR_STREAM_PUSH_AFTER_EOF\",\"stream.push() after EOF\");lc(\"ERR_METHOD_NOT_IMPLEMENTED\",function(t){return\"The \"+t+\" method is not implemented\"});lc(\"ERR_STREAM_PREMATURE_CLOSE\",\"Premature close\");lc(\"ERR_STREAM_DESTROYED\",function(t){return\"Cannot call \"+t+\" after a stream was destroyed\"});lc(\"ERR_MULTIPLE_CALLBACK\",\"Callback called multiple times\");lc(\"ERR_STREAM_CANNOT_PIPE\",\"Cannot pipe, not readable\");lc(\"ERR_STREAM_WRITE_AFTER_END\",\"write after end\");lc(\"ERR_STREAM_NULL_VALUES\",\"May not write null values to stream\",TypeError);lc(\"ERR_UNKNOWN_ENCODING\",function(t){return\"Unknown encoding: \"+t},TypeError);lc(\"ERR_STREAM_UNSHIFT_AFTER_END_EVENT\",\"stream.unshift() after end event\");_1e.exports.codes=U1e});var vj=_((b$t,H1e)=>{\"use strict\";var i2t=Gh().codes.ERR_INVALID_OPT_VALUE;function s2t(t,e,r){return t.highWaterMark!=null?t.highWaterMark:e?t[r]:null}function o2t(t,e,r,o){var a=s2t(e,o,r);if(a!=null){if(!(isFinite(a)&&Math.floor(a)===a)||a<0){var n=o?r:\"highWaterMark\";throw new i2t(n,a)}return Math.floor(a)}return t.objectMode?16:16*1024}H1e.exports={getHighWaterMark:o2t}});var q1e=_((S$t,Dj)=>{typeof Object.create==\"function\"?Dj.exports=function(e,r){r&&(e.super_=r,e.prototype=Object.create(r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:Dj.exports=function(e,r){if(r){e.super_=r;var o=function(){};o.prototype=r.prototype,e.prototype=new o,e.prototype.constructor=e}}});var Yh=_((x$t,bj)=>{try{if(Pj=ve(\"util\"),typeof Pj.inherits!=\"function\")throw\"\";bj.exports=Pj.inherits}catch{bj.exports=q1e()}var Pj});var G1e=_((k$t,j1e)=>{j1e.exports=ve(\"util\").deprecate});var kj=_((Q$t,J1e)=>{\"use strict\";J1e.exports=Fi;function W1e(t){var e=this;this.next=null,this.entry=null,this.finish=function(){R2t(e,t)}}var gC;Fi.WritableState=$B;var a2t={deprecate:G1e()},K1e=Cj(),wQ=ve(\"buffer\").Buffer,l2t=global.Uint8Array||function(){};function c2t(t){return wQ.from(t)}function u2t(t){return wQ.isBuffer(t)||t instanceof l2t}var xj=Bj(),A2t=vj(),f2t=A2t.getHighWaterMark,Wh=Gh().codes,p2t=Wh.ERR_INVALID_ARG_TYPE,h2t=Wh.ERR_METHOD_NOT_IMPLEMENTED,g2t=Wh.ERR_MULTIPLE_CALLBACK,d2t=Wh.ERR_STREAM_CANNOT_PIPE,m2t=Wh.ERR_STREAM_DESTROYED,y2t=Wh.ERR_STREAM_NULL_VALUES,E2t=Wh.ERR_STREAM_WRITE_AFTER_END,C2t=Wh.ERR_UNKNOWN_ENCODING,dC=xj.errorOrDestroy;Yh()(Fi,K1e);function w2t(){}function $B(t,e,r){gC=gC||ld(),t=t||{},typeof r!=\"boolean\"&&(r=e instanceof gC),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=f2t(this,t,\"writableHighWaterMark\",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var o=t.decodeStrings===!1;this.decodeStrings=!o,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(a){S2t(e,a)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new W1e(this)}$B.prototype.getBuffer=function(){for(var e=this.bufferedRequest,r=[];e;)r.push(e),e=e.next;return r};(function(){try{Object.defineProperty($B.prototype,\"buffer\",{get:a2t.deprecate(function(){return this.getBuffer()},\"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.\",\"DEP0003\")})}catch{}})();var CQ;typeof Symbol==\"function\"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]==\"function\"?(CQ=Function.prototype[Symbol.hasInstance],Object.defineProperty(Fi,Symbol.hasInstance,{value:function(e){return CQ.call(this,e)?!0:this!==Fi?!1:e&&e._writableState instanceof $B}})):CQ=function(e){return e instanceof this};function Fi(t){gC=gC||ld();var e=this instanceof gC;if(!e&&!CQ.call(Fi,this))return new Fi(t);this._writableState=new $B(t,this,e),this.writable=!0,t&&(typeof t.write==\"function\"&&(this._write=t.write),typeof t.writev==\"function\"&&(this._writev=t.writev),typeof t.destroy==\"function\"&&(this._destroy=t.destroy),typeof t.final==\"function\"&&(this._final=t.final)),K1e.call(this)}Fi.prototype.pipe=function(){dC(this,new d2t)};function I2t(t,e){var r=new E2t;dC(t,r),process.nextTick(e,r)}function B2t(t,e,r,o){var a;return r===null?a=new y2t:typeof r!=\"string\"&&!e.objectMode&&(a=new p2t(\"chunk\",[\"string\",\"Buffer\"],r)),a?(dC(t,a),process.nextTick(o,a),!1):!0}Fi.prototype.write=function(t,e,r){var o=this._writableState,a=!1,n=!o.objectMode&&u2t(t);return n&&!wQ.isBuffer(t)&&(t=c2t(t)),typeof e==\"function\"&&(r=e,e=null),n?e=\"buffer\":e||(e=o.defaultEncoding),typeof r!=\"function\"&&(r=w2t),o.ending?I2t(this,r):(n||B2t(this,o,t,r))&&(o.pendingcb++,a=D2t(this,o,n,t,e,r)),a};Fi.prototype.cork=function(){this._writableState.corked++};Fi.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&V1e(this,t))};Fi.prototype.setDefaultEncoding=function(e){if(typeof e==\"string\"&&(e=e.toLowerCase()),!([\"hex\",\"utf8\",\"utf-8\",\"ascii\",\"binary\",\"base64\",\"ucs2\",\"ucs-2\",\"utf16le\",\"utf-16le\",\"raw\"].indexOf((e+\"\").toLowerCase())>-1))throw new C2t(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Fi.prototype,\"writableBuffer\",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function v2t(t,e,r){return!t.objectMode&&t.decodeStrings!==!1&&typeof e==\"string\"&&(e=wQ.from(e,r)),e}Object.defineProperty(Fi.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function D2t(t,e,r,o,a,n){if(!r){var u=v2t(e,o,a);o!==u&&(r=!0,a=\"buffer\",o=u)}var A=e.objectMode?1:o.length;e.length+=A;var p=e.length<e.highWaterMark;if(p||(e.needDrain=!0),e.writing||e.corked){var h=e.lastBufferedRequest;e.lastBufferedRequest={chunk:o,encoding:a,isBuf:r,callback:n,next:null},h?h.next=e.lastBufferedRequest:e.bufferedRequest=e.lastBufferedRequest,e.bufferedRequestCount+=1}else Sj(t,e,!1,A,o,a,n);return p}function Sj(t,e,r,o,a,n,u){e.writelen=o,e.writecb=u,e.writing=!0,e.sync=!0,e.destroyed?e.onwrite(new m2t(\"write\")):r?t._writev(a,e.onwrite):t._write(a,n,e.onwrite),e.sync=!1}function P2t(t,e,r,o,a){--e.pendingcb,r?(process.nextTick(a,o),process.nextTick(ZB,t,e),t._writableState.errorEmitted=!0,dC(t,o)):(a(o),t._writableState.errorEmitted=!0,dC(t,o),ZB(t,e))}function b2t(t){t.writing=!1,t.writecb=null,t.length-=t.writelen,t.writelen=0}function S2t(t,e){var r=t._writableState,o=r.sync,a=r.writecb;if(typeof a!=\"function\")throw new g2t;if(b2t(r),e)P2t(t,r,o,e,a);else{var n=z1e(r)||t.destroyed;!n&&!r.corked&&!r.bufferProcessing&&r.bufferedRequest&&V1e(t,r),o?process.nextTick(Y1e,t,r,n,a):Y1e(t,r,n,a)}}function Y1e(t,e,r,o){r||x2t(t,e),e.pendingcb--,o(),ZB(t,e)}function x2t(t,e){e.length===0&&e.needDrain&&(e.needDrain=!1,t.emit(\"drain\"))}function V1e(t,e){e.bufferProcessing=!0;var r=e.bufferedRequest;if(t._writev&&r&&r.next){var o=e.bufferedRequestCount,a=new Array(o),n=e.corkedRequestsFree;n.entry=r;for(var u=0,A=!0;r;)a[u]=r,r.isBuf||(A=!1),r=r.next,u+=1;a.allBuffers=A,Sj(t,e,!0,e.length,a,\"\",n.finish),e.pendingcb++,e.lastBufferedRequest=null,n.next?(e.corkedRequestsFree=n.next,n.next=null):e.corkedRequestsFree=new W1e(e),e.bufferedRequestCount=0}else{for(;r;){var p=r.chunk,h=r.encoding,E=r.callback,I=e.objectMode?1:p.length;if(Sj(t,e,!1,I,p,h,E),r=r.next,e.bufferedRequestCount--,e.writing)break}r===null&&(e.lastBufferedRequest=null)}e.bufferedRequest=r,e.bufferProcessing=!1}Fi.prototype._write=function(t,e,r){r(new h2t(\"_write()\"))};Fi.prototype._writev=null;Fi.prototype.end=function(t,e,r){var o=this._writableState;return typeof t==\"function\"?(r=t,t=null,e=null):typeof e==\"function\"&&(r=e,e=null),t!=null&&this.write(t,e),o.corked&&(o.corked=1,this.uncork()),o.ending||F2t(this,o,r),this};Object.defineProperty(Fi.prototype,\"writableLength\",{enumerable:!1,get:function(){return this._writableState.length}});function z1e(t){return t.ending&&t.length===0&&t.bufferedRequest===null&&!t.finished&&!t.writing}function k2t(t,e){t._final(function(r){e.pendingcb--,r&&dC(t,r),e.prefinished=!0,t.emit(\"prefinish\"),ZB(t,e)})}function Q2t(t,e){!e.prefinished&&!e.finalCalled&&(typeof t._final==\"function\"&&!e.destroyed?(e.pendingcb++,e.finalCalled=!0,process.nextTick(k2t,t,e)):(e.prefinished=!0,t.emit(\"prefinish\")))}function ZB(t,e){var r=z1e(e);if(r&&(Q2t(t,e),e.pendingcb===0&&(e.finished=!0,t.emit(\"finish\"),e.autoDestroy))){var o=t._readableState;(!o||o.autoDestroy&&o.endEmitted)&&t.destroy()}return r}function F2t(t,e,r){e.ending=!0,ZB(t,e),r&&(e.finished?process.nextTick(r):t.once(\"finish\",r)),e.ended=!0,t.writable=!1}function R2t(t,e,r){var o=t.entry;for(t.entry=null;o;){var a=o.callback;e.pendingcb--,a(r),o=o.next}e.corkedRequestsFree.next=t}Object.defineProperty(Fi.prototype,\"destroyed\",{enumerable:!1,get:function(){return this._writableState===void 0?!1:this._writableState.destroyed},set:function(e){this._writableState&&(this._writableState.destroyed=e)}});Fi.prototype.destroy=xj.destroy;Fi.prototype._undestroy=xj.undestroy;Fi.prototype._destroy=function(t,e){e(t)}});var ld=_((F$t,Z1e)=>{\"use strict\";var T2t=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};Z1e.exports=yA;var X1e=Rj(),Fj=kj();Yh()(yA,X1e);for(Qj=T2t(Fj.prototype),IQ=0;IQ<Qj.length;IQ++)BQ=Qj[IQ],yA.prototype[BQ]||(yA.prototype[BQ]=Fj.prototype[BQ]);var Qj,BQ,IQ;function yA(t){if(!(this instanceof yA))return new yA(t);X1e.call(this,t),Fj.call(this,t),this.allowHalfOpen=!0,t&&(t.readable===!1&&(this.readable=!1),t.writable===!1&&(this.writable=!1),t.allowHalfOpen===!1&&(this.allowHalfOpen=!1,this.once(\"end\",N2t)))}Object.defineProperty(yA.prototype,\"writableHighWaterMark\",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});Object.defineProperty(yA.prototype,\"writableBuffer\",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});Object.defineProperty(yA.prototype,\"writableLength\",{enumerable:!1,get:function(){return this._writableState.length}});function N2t(){this._writableState.ended||process.nextTick(L2t,this)}function L2t(t){t.end()}Object.defineProperty(yA.prototype,\"destroyed\",{enumerable:!1,get:function(){return this._readableState===void 0||this._writableState===void 0?!1:this._readableState.destroyed&&this._writableState.destroyed},set:function(e){this._readableState===void 0||this._writableState===void 0||(this._readableState.destroyed=e,this._writableState.destroyed=e)}})});var t2e=_((Tj,e2e)=>{var vQ=ve(\"buffer\"),np=vQ.Buffer;function $1e(t,e){for(var r in t)e[r]=t[r]}np.from&&np.alloc&&np.allocUnsafe&&np.allocUnsafeSlow?e2e.exports=vQ:($1e(vQ,Tj),Tj.Buffer=mC);function mC(t,e,r){return np(t,e,r)}$1e(np,mC);mC.from=function(t,e,r){if(typeof t==\"number\")throw new TypeError(\"Argument must not be a number\");return np(t,e,r)};mC.alloc=function(t,e,r){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");var o=np(t);return e!==void 0?typeof r==\"string\"?o.fill(e,r):o.fill(e):o.fill(0),o};mC.allocUnsafe=function(t){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");return np(t)};mC.allocUnsafeSlow=function(t){if(typeof t!=\"number\")throw new TypeError(\"Argument must be a number\");return vQ.SlowBuffer(t)}});var Mj=_(n2e=>{\"use strict\";var Lj=t2e().Buffer,r2e=Lj.isEncoding||function(t){switch(t=\"\"+t,t&&t.toLowerCase()){case\"hex\":case\"utf8\":case\"utf-8\":case\"ascii\":case\"binary\":case\"base64\":case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":case\"raw\":return!0;default:return!1}};function M2t(t){if(!t)return\"utf8\";for(var e;;)switch(t){case\"utf8\":case\"utf-8\":return\"utf8\";case\"ucs2\":case\"ucs-2\":case\"utf16le\":case\"utf-16le\":return\"utf16le\";case\"latin1\":case\"binary\":return\"latin1\";case\"base64\":case\"ascii\":case\"hex\":return t;default:if(e)return;t=(\"\"+t).toLowerCase(),e=!0}}function O2t(t){var e=M2t(t);if(typeof e!=\"string\"&&(Lj.isEncoding===r2e||!r2e(t)))throw new Error(\"Unknown encoding: \"+t);return e||t}n2e.StringDecoder=ev;function ev(t){this.encoding=O2t(t);var e;switch(this.encoding){case\"utf16le\":this.text=G2t,this.end=Y2t,e=4;break;case\"utf8\":this.fillLast=H2t,e=4;break;case\"base64\":this.text=W2t,this.end=K2t,e=3;break;default:this.write=V2t,this.end=z2t;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=Lj.allocUnsafe(e)}ev.prototype.write=function(t){if(t.length===0)return\"\";var e,r;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return\"\";r=this.lastNeed,this.lastNeed=0}else r=0;return r<t.length?e?e+this.text(t,r):this.text(t,r):e||\"\"};ev.prototype.end=j2t;ev.prototype.text=q2t;ev.prototype.fillLast=function(t){if(this.lastNeed<=t.length)return t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,this.lastTotal-this.lastNeed,0,t.length),this.lastNeed-=t.length};function Nj(t){return t<=127?0:t>>5===6?2:t>>4===14?3:t>>3===30?4:t>>6===2?-1:-2}function U2t(t,e,r){var o=e.length-1;if(o<r)return 0;var a=Nj(e[o]);return a>=0?(a>0&&(t.lastNeed=a-1),a):--o<r||a===-2?0:(a=Nj(e[o]),a>=0?(a>0&&(t.lastNeed=a-2),a):--o<r||a===-2?0:(a=Nj(e[o]),a>=0?(a>0&&(a===2?a=0:t.lastNeed=a-3),a):0))}function _2t(t,e,r){if((e[0]&192)!==128)return t.lastNeed=0,\"\\uFFFD\";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!==128)return t.lastNeed=1,\"\\uFFFD\";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!==128)return t.lastNeed=2,\"\\uFFFD\"}}function H2t(t){var e=this.lastTotal-this.lastNeed,r=_2t(this,t,e);if(r!==void 0)return r;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}function q2t(t,e){var r=U2t(this,t,e);if(!this.lastNeed)return t.toString(\"utf8\",e);this.lastTotal=r;var o=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,o),t.toString(\"utf8\",e,o)}function j2t(t){var e=t&&t.length?this.write(t):\"\";return this.lastNeed?e+\"\\uFFFD\":e}function G2t(t,e){if((t.length-e)%2===0){var r=t.toString(\"utf16le\",e);if(r){var o=r.charCodeAt(r.length-1);if(o>=55296&&o<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString(\"utf16le\",e,t.length-1)}function Y2t(t){var e=t&&t.length?this.write(t):\"\";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString(\"utf16le\",0,r)}return e}function W2t(t,e){var r=(t.length-e)%3;return r===0?t.toString(\"base64\",e):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString(\"base64\",e,t.length-r))}function K2t(t){var e=t&&t.length?this.write(t):\"\";return this.lastNeed?e+this.lastChar.toString(\"base64\",0,3-this.lastNeed):e}function V2t(t){return t.toString(this.encoding)}function z2t(t){return t&&t.length?this.write(t):\"\"}});var DQ=_((T$t,o2e)=>{\"use strict\";var i2e=Gh().codes.ERR_STREAM_PREMATURE_CLOSE;function J2t(t){var e=!1;return function(){if(!e){e=!0;for(var r=arguments.length,o=new Array(r),a=0;a<r;a++)o[a]=arguments[a];t.apply(this,o)}}}function X2t(){}function Z2t(t){return t.setHeader&&typeof t.abort==\"function\"}function s2e(t,e,r){if(typeof e==\"function\")return s2e(t,null,e);e||(e={}),r=J2t(r||X2t);var o=e.readable||e.readable!==!1&&t.readable,a=e.writable||e.writable!==!1&&t.writable,n=function(){t.writable||A()},u=t._writableState&&t._writableState.finished,A=function(){a=!1,u=!0,o||r.call(t)},p=t._readableState&&t._readableState.endEmitted,h=function(){o=!1,p=!0,a||r.call(t)},E=function(C){r.call(t,C)},I=function(){var C;if(o&&!p)return(!t._readableState||!t._readableState.ended)&&(C=new i2e),r.call(t,C);if(a&&!u)return(!t._writableState||!t._writableState.ended)&&(C=new i2e),r.call(t,C)},v=function(){t.req.on(\"finish\",A)};return Z2t(t)?(t.on(\"complete\",A),t.on(\"abort\",I),t.req?v():t.on(\"request\",v)):a&&!t._writableState&&(t.on(\"end\",n),t.on(\"close\",n)),t.on(\"end\",h),t.on(\"finish\",A),e.error!==!1&&t.on(\"error\",E),t.on(\"close\",I),function(){t.removeListener(\"complete\",A),t.removeListener(\"abort\",I),t.removeListener(\"request\",v),t.req&&t.req.removeListener(\"finish\",A),t.removeListener(\"end\",n),t.removeListener(\"close\",n),t.removeListener(\"finish\",A),t.removeListener(\"end\",h),t.removeListener(\"error\",E),t.removeListener(\"close\",I)}}o2e.exports=s2e});var l2e=_((N$t,a2e)=>{\"use strict\";var PQ;function Kh(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var $2t=DQ(),Vh=Symbol(\"lastResolve\"),cd=Symbol(\"lastReject\"),tv=Symbol(\"error\"),bQ=Symbol(\"ended\"),ud=Symbol(\"lastPromise\"),Oj=Symbol(\"handlePromise\"),Ad=Symbol(\"stream\");function zh(t,e){return{value:t,done:e}}function eBt(t){var e=t[Vh];if(e!==null){var r=t[Ad].read();r!==null&&(t[ud]=null,t[Vh]=null,t[cd]=null,e(zh(r,!1)))}}function tBt(t){process.nextTick(eBt,t)}function rBt(t,e){return function(r,o){t.then(function(){if(e[bQ]){r(zh(void 0,!0));return}e[Oj](r,o)},o)}}var nBt=Object.getPrototypeOf(function(){}),iBt=Object.setPrototypeOf((PQ={get stream(){return this[Ad]},next:function(){var e=this,r=this[tv];if(r!==null)return Promise.reject(r);if(this[bQ])return Promise.resolve(zh(void 0,!0));if(this[Ad].destroyed)return new Promise(function(u,A){process.nextTick(function(){e[tv]?A(e[tv]):u(zh(void 0,!0))})});var o=this[ud],a;if(o)a=new Promise(rBt(o,this));else{var n=this[Ad].read();if(n!==null)return Promise.resolve(zh(n,!1));a=new Promise(this[Oj])}return this[ud]=a,a}},Kh(PQ,Symbol.asyncIterator,function(){return this}),Kh(PQ,\"return\",function(){var e=this;return new Promise(function(r,o){e[Ad].destroy(null,function(a){if(a){o(a);return}r(zh(void 0,!0))})})}),PQ),nBt),sBt=function(e){var r,o=Object.create(iBt,(r={},Kh(r,Ad,{value:e,writable:!0}),Kh(r,Vh,{value:null,writable:!0}),Kh(r,cd,{value:null,writable:!0}),Kh(r,tv,{value:null,writable:!0}),Kh(r,bQ,{value:e._readableState.endEmitted,writable:!0}),Kh(r,Oj,{value:function(n,u){var A=o[Ad].read();A?(o[ud]=null,o[Vh]=null,o[cd]=null,n(zh(A,!1))):(o[Vh]=n,o[cd]=u)},writable:!0}),r));return o[ud]=null,$2t(e,function(a){if(a&&a.code!==\"ERR_STREAM_PREMATURE_CLOSE\"){var n=o[cd];n!==null&&(o[ud]=null,o[Vh]=null,o[cd]=null,n(a)),o[tv]=a;return}var u=o[Vh];u!==null&&(o[ud]=null,o[Vh]=null,o[cd]=null,u(zh(void 0,!0))),o[bQ]=!0}),e.on(\"readable\",tBt.bind(null,o)),o};a2e.exports=sBt});var f2e=_((L$t,A2e)=>{\"use strict\";function c2e(t,e,r,o,a,n,u){try{var A=t[n](u),p=A.value}catch(h){r(h);return}A.done?e(p):Promise.resolve(p).then(o,a)}function oBt(t){return function(){var e=this,r=arguments;return new Promise(function(o,a){var n=t.apply(e,r);function u(p){c2e(n,o,a,u,A,\"next\",p)}function A(p){c2e(n,o,a,u,A,\"throw\",p)}u(void 0)})}}function u2e(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,o)}return r}function aBt(t){for(var e=1;e<arguments.length;e++){var r=arguments[e]!=null?arguments[e]:{};e%2?u2e(Object(r),!0).forEach(function(o){lBt(t,o,r[o])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):u2e(Object(r)).forEach(function(o){Object.defineProperty(t,o,Object.getOwnPropertyDescriptor(r,o))})}return t}function lBt(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var cBt=Gh().codes.ERR_INVALID_ARG_TYPE;function uBt(t,e,r){var o;if(e&&typeof e.next==\"function\")o=e;else if(e&&e[Symbol.asyncIterator])o=e[Symbol.asyncIterator]();else if(e&&e[Symbol.iterator])o=e[Symbol.iterator]();else throw new cBt(\"iterable\",[\"Iterable\"],e);var a=new t(aBt({objectMode:!0},r)),n=!1;a._read=function(){n||(n=!0,u())};function u(){return A.apply(this,arguments)}function A(){return A=oBt(function*(){try{var p=yield o.next(),h=p.value,E=p.done;E?a.push(null):a.push(yield h)?u():n=!1}catch(I){a.destroy(I)}}),A.apply(this,arguments)}return a}A2e.exports=uBt});var Rj=_((O$t,I2e)=>{\"use strict\";I2e.exports=mn;var yC;mn.ReadableState=d2e;var M$t=ve(\"events\").EventEmitter,g2e=function(e,r){return e.listeners(r).length},nv=Cj(),SQ=ve(\"buffer\").Buffer,ABt=global.Uint8Array||function(){};function fBt(t){return SQ.from(t)}function pBt(t){return SQ.isBuffer(t)||t instanceof ABt}var Uj=ve(\"util\"),en;Uj&&Uj.debuglog?en=Uj.debuglog(\"stream\"):en=function(){};var hBt=N1e(),Wj=Bj(),gBt=vj(),dBt=gBt.getHighWaterMark,xQ=Gh().codes,mBt=xQ.ERR_INVALID_ARG_TYPE,yBt=xQ.ERR_STREAM_PUSH_AFTER_EOF,EBt=xQ.ERR_METHOD_NOT_IMPLEMENTED,CBt=xQ.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,EC,_j,Hj;Yh()(mn,nv);var rv=Wj.errorOrDestroy,qj=[\"error\",\"close\",\"destroy\",\"pause\",\"resume\"];function wBt(t,e,r){if(typeof t.prependListener==\"function\")return t.prependListener(e,r);!t._events||!t._events[e]?t.on(e,r):Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]}function d2e(t,e,r){yC=yC||ld(),t=t||{},typeof r!=\"boolean\"&&(r=e instanceof yC),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=dBt(this,t,\"readableHighWaterMark\",r),this.buffer=new hBt,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||\"utf8\",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(EC||(EC=Mj().StringDecoder),this.decoder=new EC(t.encoding),this.encoding=t.encoding)}function mn(t){if(yC=yC||ld(),!(this instanceof mn))return new mn(t);var e=this instanceof yC;this._readableState=new d2e(t,this,e),this.readable=!0,t&&(typeof t.read==\"function\"&&(this._read=t.read),typeof t.destroy==\"function\"&&(this._destroy=t.destroy)),nv.call(this)}Object.defineProperty(mn.prototype,\"destroyed\",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){this._readableState&&(this._readableState.destroyed=e)}});mn.prototype.destroy=Wj.destroy;mn.prototype._undestroy=Wj.undestroy;mn.prototype._destroy=function(t,e){e(t)};mn.prototype.push=function(t,e){var r=this._readableState,o;return r.objectMode?o=!0:typeof t==\"string\"&&(e=e||r.defaultEncoding,e!==r.encoding&&(t=SQ.from(t,e),e=\"\"),o=!0),m2e(this,t,e,!1,o)};mn.prototype.unshift=function(t){return m2e(this,t,null,!0,!1)};function m2e(t,e,r,o,a){en(\"readableAddChunk\",e);var n=t._readableState;if(e===null)n.reading=!1,vBt(t,n);else{var u;if(a||(u=IBt(n,e)),u)rv(t,u);else if(n.objectMode||e&&e.length>0)if(typeof e!=\"string\"&&!n.objectMode&&Object.getPrototypeOf(e)!==SQ.prototype&&(e=fBt(e)),o)n.endEmitted?rv(t,new CBt):jj(t,n,e,!0);else if(n.ended)rv(t,new yBt);else{if(n.destroyed)return!1;n.reading=!1,n.decoder&&!r?(e=n.decoder.write(e),n.objectMode||e.length!==0?jj(t,n,e,!1):Yj(t,n)):jj(t,n,e,!1)}else o||(n.reading=!1,Yj(t,n))}return!n.ended&&(n.length<n.highWaterMark||n.length===0)}function jj(t,e,r,o){e.flowing&&e.length===0&&!e.sync?(e.awaitDrain=0,t.emit(\"data\",r)):(e.length+=e.objectMode?1:r.length,o?e.buffer.unshift(r):e.buffer.push(r),e.needReadable&&kQ(t)),Yj(t,e)}function IBt(t,e){var r;return!pBt(e)&&typeof e!=\"string\"&&e!==void 0&&!t.objectMode&&(r=new mBt(\"chunk\",[\"string\",\"Buffer\",\"Uint8Array\"],e)),r}mn.prototype.isPaused=function(){return this._readableState.flowing===!1};mn.prototype.setEncoding=function(t){EC||(EC=Mj().StringDecoder);var e=new EC(t);this._readableState.decoder=e,this._readableState.encoding=this._readableState.decoder.encoding;for(var r=this._readableState.buffer.head,o=\"\";r!==null;)o+=e.write(r.data),r=r.next;return this._readableState.buffer.clear(),o!==\"\"&&this._readableState.buffer.push(o),this._readableState.length=o.length,this};var p2e=1073741824;function BBt(t){return t>=p2e?t=p2e:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function h2e(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=BBt(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}mn.prototype.read=function(t){en(\"read\",t),t=parseInt(t,10);var e=this._readableState,r=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return en(\"read: emitReadable\",e.length,e.ended),e.length===0&&e.ended?Gj(this):kQ(this),null;if(t=h2e(t,e),t===0&&e.ended)return e.length===0&&Gj(this),null;var o=e.needReadable;en(\"need readable\",o),(e.length===0||e.length-t<e.highWaterMark)&&(o=!0,en(\"length less than watermark\",o)),e.ended||e.reading?(o=!1,en(\"reading or ended\",o)):o&&(en(\"do read\"),e.reading=!0,e.sync=!0,e.length===0&&(e.needReadable=!0),this._read(e.highWaterMark),e.sync=!1,e.reading||(t=h2e(r,e)));var a;return t>0?a=C2e(t,e):a=null,a===null?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&Gj(this)),a!==null&&this.emit(\"data\",a),a};function vBt(t,e){if(en(\"onEofChunk\"),!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,e.sync?kQ(t):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,y2e(t)))}}function kQ(t){var e=t._readableState;en(\"emitReadable\",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(en(\"emitReadable\",e.flowing),e.emittedReadable=!0,process.nextTick(y2e,t))}function y2e(t){var e=t._readableState;en(\"emitReadable_\",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(t.emit(\"readable\"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,Kj(t)}function Yj(t,e){e.readingMore||(e.readingMore=!0,process.nextTick(DBt,t,e))}function DBt(t,e){for(;!e.reading&&!e.ended&&(e.length<e.highWaterMark||e.flowing&&e.length===0);){var r=e.length;if(en(\"maybeReadMore read 0\"),t.read(0),r===e.length)break}e.readingMore=!1}mn.prototype._read=function(t){rv(this,new EBt(\"_read()\"))};mn.prototype.pipe=function(t,e){var r=this,o=this._readableState;switch(o.pipesCount){case 0:o.pipes=t;break;case 1:o.pipes=[o.pipes,t];break;default:o.pipes.push(t);break}o.pipesCount+=1,en(\"pipe count=%d opts=%j\",o.pipesCount,e);var a=(!e||e.end!==!1)&&t!==process.stdout&&t!==process.stderr,n=a?A:R;o.endEmitted?process.nextTick(n):r.once(\"end\",n),t.on(\"unpipe\",u);function u(L,U){en(\"onunpipe\"),L===r&&U&&U.hasUnpiped===!1&&(U.hasUnpiped=!0,E())}function A(){en(\"onend\"),t.end()}var p=PBt(r);t.on(\"drain\",p);var h=!1;function E(){en(\"cleanup\"),t.removeListener(\"close\",x),t.removeListener(\"finish\",C),t.removeListener(\"drain\",p),t.removeListener(\"error\",v),t.removeListener(\"unpipe\",u),r.removeListener(\"end\",A),r.removeListener(\"end\",R),r.removeListener(\"data\",I),h=!0,o.awaitDrain&&(!t._writableState||t._writableState.needDrain)&&p()}r.on(\"data\",I);function I(L){en(\"ondata\");var U=t.write(L);en(\"dest.write\",U),U===!1&&((o.pipesCount===1&&o.pipes===t||o.pipesCount>1&&w2e(o.pipes,t)!==-1)&&!h&&(en(\"false write response, pause\",o.awaitDrain),o.awaitDrain++),r.pause())}function v(L){en(\"onerror\",L),R(),t.removeListener(\"error\",v),g2e(t,\"error\")===0&&rv(t,L)}wBt(t,\"error\",v);function x(){t.removeListener(\"finish\",C),R()}t.once(\"close\",x);function C(){en(\"onfinish\"),t.removeListener(\"close\",x),R()}t.once(\"finish\",C);function R(){en(\"unpipe\"),r.unpipe(t)}return t.emit(\"pipe\",r),o.flowing||(en(\"pipe resume\"),r.resume()),t};function PBt(t){return function(){var r=t._readableState;en(\"pipeOnDrain\",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&g2e(t,\"data\")&&(r.flowing=!0,Kj(t))}}mn.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit(\"unpipe\",this,r),this);if(!t){var o=e.pipes,a=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var n=0;n<a;n++)o[n].emit(\"unpipe\",this,{hasUnpiped:!1});return this}var u=w2e(e.pipes,t);return u===-1?this:(e.pipes.splice(u,1),e.pipesCount-=1,e.pipesCount===1&&(e.pipes=e.pipes[0]),t.emit(\"unpipe\",this,r),this)};mn.prototype.on=function(t,e){var r=nv.prototype.on.call(this,t,e),o=this._readableState;return t===\"data\"?(o.readableListening=this.listenerCount(\"readable\")>0,o.flowing!==!1&&this.resume()):t===\"readable\"&&!o.endEmitted&&!o.readableListening&&(o.readableListening=o.needReadable=!0,o.flowing=!1,o.emittedReadable=!1,en(\"on readable\",o.length,o.reading),o.length?kQ(this):o.reading||process.nextTick(bBt,this)),r};mn.prototype.addListener=mn.prototype.on;mn.prototype.removeListener=function(t,e){var r=nv.prototype.removeListener.call(this,t,e);return t===\"readable\"&&process.nextTick(E2e,this),r};mn.prototype.removeAllListeners=function(t){var e=nv.prototype.removeAllListeners.apply(this,arguments);return(t===\"readable\"||t===void 0)&&process.nextTick(E2e,this),e};function E2e(t){var e=t._readableState;e.readableListening=t.listenerCount(\"readable\")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount(\"data\")>0&&t.resume()}function bBt(t){en(\"readable nexttick read 0\"),t.read(0)}mn.prototype.resume=function(){var t=this._readableState;return t.flowing||(en(\"resume\"),t.flowing=!t.readableListening,SBt(this,t)),t.paused=!1,this};function SBt(t,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(xBt,t,e))}function xBt(t,e){en(\"resume\",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit(\"resume\"),Kj(t),e.flowing&&!e.reading&&t.read(0)}mn.prototype.pause=function(){return en(\"call pause flowing=%j\",this._readableState.flowing),this._readableState.flowing!==!1&&(en(\"pause\"),this._readableState.flowing=!1,this.emit(\"pause\")),this._readableState.paused=!0,this};function Kj(t){var e=t._readableState;for(en(\"flow\",e.flowing);e.flowing&&t.read()!==null;);}mn.prototype.wrap=function(t){var e=this,r=this._readableState,o=!1;t.on(\"end\",function(){if(en(\"wrapped end\"),r.decoder&&!r.ended){var u=r.decoder.end();u&&u.length&&e.push(u)}e.push(null)}),t.on(\"data\",function(u){if(en(\"wrapped data\"),r.decoder&&(u=r.decoder.write(u)),!(r.objectMode&&u==null)&&!(!r.objectMode&&(!u||!u.length))){var A=e.push(u);A||(o=!0,t.pause())}});for(var a in t)this[a]===void 0&&typeof t[a]==\"function\"&&(this[a]=function(A){return function(){return t[A].apply(t,arguments)}}(a));for(var n=0;n<qj.length;n++)t.on(qj[n],this.emit.bind(this,qj[n]));return this._read=function(u){en(\"wrapped _read\",u),o&&(o=!1,t.resume())},this};typeof Symbol==\"function\"&&(mn.prototype[Symbol.asyncIterator]=function(){return _j===void 0&&(_j=l2e()),_j(this)});Object.defineProperty(mn.prototype,\"readableHighWaterMark\",{enumerable:!1,get:function(){return this._readableState.highWaterMark}});Object.defineProperty(mn.prototype,\"readableBuffer\",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}});Object.defineProperty(mn.prototype,\"readableFlowing\",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(e){this._readableState&&(this._readableState.flowing=e)}});mn._fromList=C2e;Object.defineProperty(mn.prototype,\"readableLength\",{enumerable:!1,get:function(){return this._readableState.length}});function C2e(t,e){if(e.length===0)return null;var r;return e.objectMode?r=e.buffer.shift():!t||t>=e.length?(e.decoder?r=e.buffer.join(\"\"):e.buffer.length===1?r=e.buffer.first():r=e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r}function Gj(t){var e=t._readableState;en(\"endReadable\",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(kBt,e,t))}function kBt(t,e){if(en(\"endReadableNT\",t.endEmitted,t.length),!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit(\"end\"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}typeof Symbol==\"function\"&&(mn.from=function(t,e){return Hj===void 0&&(Hj=f2e()),Hj(mn,t,e)});function w2e(t,e){for(var r=0,o=t.length;r<o;r++)if(t[r]===e)return r;return-1}});var Vj=_((U$t,v2e)=>{\"use strict\";v2e.exports=ip;var QQ=Gh().codes,QBt=QQ.ERR_METHOD_NOT_IMPLEMENTED,FBt=QQ.ERR_MULTIPLE_CALLBACK,RBt=QQ.ERR_TRANSFORM_ALREADY_TRANSFORMING,TBt=QQ.ERR_TRANSFORM_WITH_LENGTH_0,FQ=ld();Yh()(ip,FQ);function NBt(t,e){var r=this._transformState;r.transforming=!1;var o=r.writecb;if(o===null)return this.emit(\"error\",new FBt);r.writechunk=null,r.writecb=null,e!=null&&this.push(e),o(t);var a=this._readableState;a.reading=!1,(a.needReadable||a.length<a.highWaterMark)&&this._read(a.highWaterMark)}function ip(t){if(!(this instanceof ip))return new ip(t);FQ.call(this,t),this._transformState={afterTransform:NBt.bind(this),needTransform:!1,transforming:!1,writecb:null,writechunk:null,writeencoding:null},this._readableState.needReadable=!0,this._readableState.sync=!1,t&&(typeof t.transform==\"function\"&&(this._transform=t.transform),typeof t.flush==\"function\"&&(this._flush=t.flush)),this.on(\"prefinish\",LBt)}function LBt(){var t=this;typeof this._flush==\"function\"&&!this._readableState.destroyed?this._flush(function(e,r){B2e(t,e,r)}):B2e(this,null,null)}ip.prototype.push=function(t,e){return this._transformState.needTransform=!1,FQ.prototype.push.call(this,t,e)};ip.prototype._transform=function(t,e,r){r(new QBt(\"_transform()\"))};ip.prototype._write=function(t,e,r){var o=this._transformState;if(o.writecb=r,o.writechunk=t,o.writeencoding=e,!o.transforming){var a=this._readableState;(o.needTransform||a.needReadable||a.length<a.highWaterMark)&&this._read(a.highWaterMark)}};ip.prototype._read=function(t){var e=this._transformState;e.writechunk!==null&&!e.transforming?(e.transforming=!0,this._transform(e.writechunk,e.writeencoding,e.afterTransform)):e.needTransform=!0};ip.prototype._destroy=function(t,e){FQ.prototype._destroy.call(this,t,function(r){e(r)})};function B2e(t,e,r){if(e)return t.emit(\"error\",e);if(r!=null&&t.push(r),t._writableState.length)throw new TBt;if(t._transformState.transforming)throw new RBt;return t.push(null)}});var b2e=_((_$t,P2e)=>{\"use strict\";P2e.exports=iv;var D2e=Vj();Yh()(iv,D2e);function iv(t){if(!(this instanceof iv))return new iv(t);D2e.call(this,t)}iv.prototype._transform=function(t,e,r){r(null,t)}});var F2e=_((H$t,Q2e)=>{\"use strict\";var zj;function MBt(t){var e=!1;return function(){e||(e=!0,t.apply(void 0,arguments))}}var k2e=Gh().codes,OBt=k2e.ERR_MISSING_ARGS,UBt=k2e.ERR_STREAM_DESTROYED;function S2e(t){if(t)throw t}function _Bt(t){return t.setHeader&&typeof t.abort==\"function\"}function HBt(t,e,r,o){o=MBt(o);var a=!1;t.on(\"close\",function(){a=!0}),zj===void 0&&(zj=DQ()),zj(t,{readable:e,writable:r},function(u){if(u)return o(u);a=!0,o()});var n=!1;return function(u){if(!a&&!n){if(n=!0,_Bt(t))return t.abort();if(typeof t.destroy==\"function\")return t.destroy();o(u||new UBt(\"pipe\"))}}}function x2e(t){t()}function qBt(t,e){return t.pipe(e)}function jBt(t){return!t.length||typeof t[t.length-1]!=\"function\"?S2e:t.pop()}function GBt(){for(var t=arguments.length,e=new Array(t),r=0;r<t;r++)e[r]=arguments[r];var o=jBt(e);if(Array.isArray(e[0])&&(e=e[0]),e.length<2)throw new OBt(\"streams\");var a,n=e.map(function(u,A){var p=A<e.length-1,h=A>0;return HBt(u,p,h,function(E){a||(a=E),E&&n.forEach(x2e),!p&&(n.forEach(x2e),o(a))})});return e.reduce(qBt)}Q2e.exports=GBt});var CC=_((cc,ov)=>{var sv=ve(\"stream\");process.env.READABLE_STREAM===\"disable\"&&sv?(ov.exports=sv.Readable,Object.assign(ov.exports,sv),ov.exports.Stream=sv):(cc=ov.exports=Rj(),cc.Stream=sv||cc,cc.Readable=cc,cc.Writable=kj(),cc.Duplex=ld(),cc.Transform=Vj(),cc.PassThrough=b2e(),cc.finished=DQ(),cc.pipeline=F2e())});var N2e=_((q$t,T2e)=>{\"use strict\";var{Buffer:uu}=ve(\"buffer\"),R2e=Symbol.for(\"BufferList\");function ni(t){if(!(this instanceof ni))return new ni(t);ni._init.call(this,t)}ni._init=function(e){Object.defineProperty(this,R2e,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};ni.prototype._new=function(e){return new ni(e)};ni.prototype._offset=function(e){if(e===0)return[0,0];let r=0;for(let o=0;o<this._bufs.length;o++){let a=r+this._bufs[o].length;if(e<a||o===this._bufs.length-1)return[o,e-r];r=a}};ni.prototype._reverseOffset=function(t){let e=t[0],r=t[1];for(let o=0;o<e;o++)r+=this._bufs[o].length;return r};ni.prototype.get=function(e){if(e>this.length||e<0)return;let r=this._offset(e);return this._bufs[r[0]][r[1]]};ni.prototype.slice=function(e,r){return typeof e==\"number\"&&e<0&&(e+=this.length),typeof r==\"number\"&&r<0&&(r+=this.length),this.copy(null,0,e,r)};ni.prototype.copy=function(e,r,o,a){if((typeof o!=\"number\"||o<0)&&(o=0),(typeof a!=\"number\"||a>this.length)&&(a=this.length),o>=this.length||a<=0)return e||uu.alloc(0);let n=!!e,u=this._offset(o),A=a-o,p=A,h=n&&r||0,E=u[1];if(o===0&&a===this.length){if(!n)return this._bufs.length===1?this._bufs[0]:uu.concat(this._bufs,this.length);for(let I=0;I<this._bufs.length;I++)this._bufs[I].copy(e,h),h+=this._bufs[I].length;return e}if(p<=this._bufs[u[0]].length-E)return n?this._bufs[u[0]].copy(e,r,E,E+p):this._bufs[u[0]].slice(E,E+p);n||(e=uu.allocUnsafe(A));for(let I=u[0];I<this._bufs.length;I++){let v=this._bufs[I].length-E;if(p>v)this._bufs[I].copy(e,h,E),h+=v;else{this._bufs[I].copy(e,h,E,E+p),h+=v;break}p-=v,E&&(E=0)}return e.length>h?e.slice(0,h):e};ni.prototype.shallowSlice=function(e,r){if(e=e||0,r=typeof r!=\"number\"?this.length:r,e<0&&(e+=this.length),r<0&&(r+=this.length),e===r)return this._new();let o=this._offset(e),a=this._offset(r),n=this._bufs.slice(o[0],a[0]+1);return a[1]===0?n.pop():n[n.length-1]=n[n.length-1].slice(0,a[1]),o[1]!==0&&(n[0]=n[0].slice(o[1])),this._new(n)};ni.prototype.toString=function(e,r,o){return this.slice(r,o).toString(e)};ni.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};ni.prototype.duplicate=function(){let e=this._new();for(let r=0;r<this._bufs.length;r++)e.append(this._bufs[r]);return e};ni.prototype.append=function(e){if(e==null)return this;if(e.buffer)this._appendBuffer(uu.from(e.buffer,e.byteOffset,e.byteLength));else if(Array.isArray(e))for(let r=0;r<e.length;r++)this.append(e[r]);else if(this._isBufferList(e))for(let r=0;r<e._bufs.length;r++)this.append(e._bufs[r]);else typeof e==\"number\"&&(e=e.toString()),this._appendBuffer(uu.from(e));return this};ni.prototype._appendBuffer=function(e){this._bufs.push(e),this.length+=e.length};ni.prototype.indexOf=function(t,e,r){if(r===void 0&&typeof e==\"string\"&&(r=e,e=void 0),typeof t==\"function\"||Array.isArray(t))throw new TypeError('The \"value\" argument must be one of type string, Buffer, BufferList, or Uint8Array.');if(typeof t==\"number\"?t=uu.from([t]):typeof t==\"string\"?t=uu.from(t,r):this._isBufferList(t)?t=t.slice():Array.isArray(t.buffer)?t=uu.from(t.buffer,t.byteOffset,t.byteLength):uu.isBuffer(t)||(t=uu.from(t)),e=Number(e||0),isNaN(e)&&(e=0),e<0&&(e=this.length+e),e<0&&(e=0),t.length===0)return e>this.length?this.length:e;let o=this._offset(e),a=o[0],n=o[1];for(;a<this._bufs.length;a++){let u=this._bufs[a];for(;n<u.length;)if(u.length-n>=t.length){let p=u.indexOf(t,n);if(p!==-1)return this._reverseOffset([a,p]);n=u.length-t.length+1}else{let p=this._reverseOffset([a,n]);if(this._match(p,t))return p;n++}n=0}return-1};ni.prototype._match=function(t,e){if(this.length-t<e.length)return!1;for(let r=0;r<e.length;r++)if(this.get(t+r)!==e[r])return!1;return!0};(function(){let t={readDoubleBE:8,readDoubleLE:8,readFloatBE:4,readFloatLE:4,readInt32BE:4,readInt32LE:4,readUInt32BE:4,readUInt32LE:4,readInt16BE:2,readInt16LE:2,readUInt16BE:2,readUInt16LE:2,readInt8:1,readUInt8:1,readIntBE:null,readIntLE:null,readUIntBE:null,readUIntLE:null};for(let e in t)(function(r){t[r]===null?ni.prototype[r]=function(o,a){return this.slice(o,o+a)[r](0,a)}:ni.prototype[r]=function(o=0){return this.slice(o,o+t[r])[r](0)}})(e)})();ni.prototype._isBufferList=function(e){return e instanceof ni||ni.isBufferList(e)};ni.isBufferList=function(e){return e!=null&&e[R2e]};T2e.exports=ni});var L2e=_((j$t,RQ)=>{\"use strict\";var Jj=CC().Duplex,YBt=Yh(),av=N2e();function Uo(t){if(!(this instanceof Uo))return new Uo(t);if(typeof t==\"function\"){this._callback=t;let e=function(o){this._callback&&(this._callback(o),this._callback=null)}.bind(this);this.on(\"pipe\",function(o){o.on(\"error\",e)}),this.on(\"unpipe\",function(o){o.removeListener(\"error\",e)}),t=null}av._init.call(this,t),Jj.call(this)}YBt(Uo,Jj);Object.assign(Uo.prototype,av.prototype);Uo.prototype._new=function(e){return new Uo(e)};Uo.prototype._write=function(e,r,o){this._appendBuffer(e),typeof o==\"function\"&&o()};Uo.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Uo.prototype.end=function(e){Jj.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Uo.prototype._destroy=function(e,r){this._bufs.length=0,this.length=0,r(e)};Uo.prototype._isBufferList=function(e){return e instanceof Uo||e instanceof av||Uo.isBufferList(e)};Uo.isBufferList=av.isBufferList;RQ.exports=Uo;RQ.exports.BufferListStream=Uo;RQ.exports.BufferList=av});var $j=_(IC=>{var WBt=Buffer.alloc,KBt=\"0000000000000000000\",VBt=\"7777777777777777777\",M2e=48,O2e=Buffer.from(\"ustar\\0\",\"binary\"),zBt=Buffer.from(\"00\",\"binary\"),JBt=Buffer.from(\"ustar \",\"binary\"),XBt=Buffer.from(\" \\0\",\"binary\"),ZBt=parseInt(\"7777\",8),lv=257,Zj=263,$Bt=function(t,e,r){return typeof t!=\"number\"?r:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},evt=function(t){switch(t){case 0:return\"file\";case 1:return\"link\";case 2:return\"symlink\";case 3:return\"character-device\";case 4:return\"block-device\";case 5:return\"directory\";case 6:return\"fifo\";case 7:return\"contiguous-file\";case 72:return\"pax-header\";case 55:return\"pax-global-header\";case 27:return\"gnu-long-link-path\";case 28:case 30:return\"gnu-long-path\"}return null},tvt=function(t){switch(t){case\"file\":return 0;case\"link\":return 1;case\"symlink\":return 2;case\"character-device\":return 3;case\"block-device\":return 4;case\"directory\":return 5;case\"fifo\":return 6;case\"contiguous-file\":return 7;case\"pax-header\":return 72}return 0},U2e=function(t,e,r,o){for(;r<o;r++)if(t[r]===e)return r;return o},_2e=function(t){for(var e=256,r=0;r<148;r++)e+=t[r];for(var o=156;o<512;o++)e+=t[o];return e},Jh=function(t,e){return t=t.toString(8),t.length>e?VBt.slice(0,e)+\" \":KBt.slice(0,e-t.length)+t+\" \"};function rvt(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var r=[],o=t.length-1;o>0;o--){var a=t[o];e?r.push(a):r.push(255-a)}var n=0,u=r.length;for(o=0;o<u;o++)n+=r[o]*Math.pow(256,o);return e?n:-1*n}var Xh=function(t,e,r){if(t=t.slice(e,e+r),e=0,t[e]&128)return rvt(t);for(;e<t.length&&t[e]===32;)e++;for(var o=$Bt(U2e(t,32,e,t.length),t.length,t.length);e<o&&t[e]===0;)e++;return o===e?0:parseInt(t.slice(e,o).toString(),8)},wC=function(t,e,r,o){return t.slice(e,U2e(t,0,e,e+r)).toString(o)},Xj=function(t){var e=Buffer.byteLength(t),r=Math.floor(Math.log(e)/Math.log(10))+1;return e+r>=Math.pow(10,r)&&r++,e+r+t};IC.decodeLongPath=function(t,e){return wC(t,0,t.length,e)};IC.encodePax=function(t){var e=\"\";t.name&&(e+=Xj(\" path=\"+t.name+`\n`)),t.linkname&&(e+=Xj(\" linkpath=\"+t.linkname+`\n`));var r=t.pax;if(r)for(var o in r)e+=Xj(\" \"+o+\"=\"+r[o]+`\n`);return Buffer.from(e)};IC.decodePax=function(t){for(var e={};t.length;){for(var r=0;r<t.length&&t[r]!==32;)r++;var o=parseInt(t.slice(0,r).toString(),10);if(!o)return e;var a=t.slice(r+1,o-1).toString(),n=a.indexOf(\"=\");if(n===-1)return e;e[a.slice(0,n)]=a.slice(n+1),t=t.slice(o)}return e};IC.encode=function(t){var e=WBt(512),r=t.name,o=\"\";if(t.typeflag===5&&r[r.length-1]!==\"/\"&&(r+=\"/\"),Buffer.byteLength(r)!==r.length)return null;for(;Buffer.byteLength(r)>100;){var a=r.indexOf(\"/\");if(a===-1)return null;o+=o?\"/\"+r.slice(0,a):r.slice(0,a),r=r.slice(a+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(o)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(r),e.write(Jh(t.mode&ZBt,6),100),e.write(Jh(t.uid,6),108),e.write(Jh(t.gid,6),116),e.write(Jh(t.size,11),124),e.write(Jh(t.mtime.getTime()/1e3|0,11),136),e[156]=M2e+tvt(t.type),t.linkname&&e.write(t.linkname,157),O2e.copy(e,lv),zBt.copy(e,Zj),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(Jh(t.devmajor||0,6),329),e.write(Jh(t.devminor||0,6),337),o&&e.write(o,345),e.write(Jh(_2e(e),6),148),e)};IC.decode=function(t,e,r){var o=t[156]===0?0:t[156]-M2e,a=wC(t,0,100,e),n=Xh(t,100,8),u=Xh(t,108,8),A=Xh(t,116,8),p=Xh(t,124,12),h=Xh(t,136,12),E=evt(o),I=t[157]===0?null:wC(t,157,100,e),v=wC(t,265,32),x=wC(t,297,32),C=Xh(t,329,8),R=Xh(t,337,8),L=_2e(t);if(L===8*32)return null;if(L!==Xh(t,148,8))throw new Error(\"Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?\");if(O2e.compare(t,lv,lv+6)===0)t[345]&&(a=wC(t,345,155,e)+\"/\"+a);else if(!(JBt.compare(t,lv,lv+6)===0&&XBt.compare(t,Zj,Zj+2)===0)){if(!r)throw new Error(\"Invalid tar header: unknown format.\")}return o===0&&a&&a[a.length-1]===\"/\"&&(o=5),{name:a,mode:n,uid:u,gid:A,size:p,mtime:new Date(1e3*h),type:E,linkname:I,uname:v,gname:x,devmajor:C,devminor:R}}});var K2e=_((Y$t,W2e)=>{var q2e=ve(\"util\"),nvt=L2e(),cv=$j(),j2e=CC().Writable,G2e=CC().PassThrough,Y2e=function(){},H2e=function(t){return t&=511,t&&512-t},ivt=function(t,e){var r=new TQ(t,e);return r.end(),r},svt=function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},TQ=function(t,e){this._parent=t,this.offset=e,G2e.call(this,{autoDestroy:!1})};q2e.inherits(TQ,G2e);TQ.prototype.destroy=function(t){this._parent.destroy(t)};var sp=function(t){if(!(this instanceof sp))return new sp(t);j2e.call(this,t),t=t||{},this._offset=0,this._buffer=nvt(),this._missing=0,this._partial=!1,this._onparse=Y2e,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,r=e._buffer,o=function(){e._continue()},a=function(v){if(e._locked=!1,v)return e.destroy(v);e._stream||o()},n=function(){e._stream=null;var v=H2e(e._header.size);v?e._parse(v,u):e._parse(512,I),e._locked||o()},u=function(){e._buffer.consume(H2e(e._header.size)),e._parse(512,I),o()},A=function(){var v=e._header.size;e._paxGlobal=cv.decodePax(r.slice(0,v)),r.consume(v),n()},p=function(){var v=e._header.size;e._pax=cv.decodePax(r.slice(0,v)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),r.consume(v),n()},h=function(){var v=e._header.size;this._gnuLongPath=cv.decodeLongPath(r.slice(0,v),t.filenameEncoding),r.consume(v),n()},E=function(){var v=e._header.size;this._gnuLongLinkPath=cv.decodeLongPath(r.slice(0,v),t.filenameEncoding),r.consume(v),n()},I=function(){var v=e._offset,x;try{x=e._header=cv.decode(r.slice(0,512),t.filenameEncoding,t.allowUnknownFormat)}catch(C){e.emit(\"error\",C)}if(r.consume(512),!x){e._parse(512,I),o();return}if(x.type===\"gnu-long-path\"){e._parse(x.size,h),o();return}if(x.type===\"gnu-long-link-path\"){e._parse(x.size,E),o();return}if(x.type===\"pax-global-header\"){e._parse(x.size,A),o();return}if(x.type===\"pax-header\"){e._parse(x.size,p),o();return}if(e._gnuLongPath&&(x.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(x.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=x=svt(x,e._pax),e._pax=null),e._locked=!0,!x.size||x.type===\"directory\"){e._parse(512,I),e.emit(\"entry\",x,ivt(e,v),a);return}e._stream=new TQ(e,v),e.emit(\"entry\",x,e._stream,a),e._parse(x.size,n),o()};this._onheader=I,this._parse(512,I)};q2e.inherits(sp,j2e);sp.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit(\"error\",t),this.emit(\"close\"),this._stream&&this._stream.emit(\"close\"))};sp.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};sp.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=Y2e,this._overflow?this._write(this._overflow,void 0,t):t()}};sp.prototype._write=function(t,e,r){if(!this._destroyed){var o=this._stream,a=this._buffer,n=this._missing;if(t.length&&(this._partial=!0),t.length<n)return this._missing-=t.length,this._overflow=null,o?o.write(t,r):(a.append(t),r());this._cb=r,this._missing=0;var u=null;t.length>n&&(u=t.slice(n),t=t.slice(0,n)),o?o.end(t):a.append(t),this._overflow=u,this._onparse()}};sp.prototype._final=function(t){if(this._partial)return this.destroy(new Error(\"Unexpected end of data\"));t()};W2e.exports=sp});var z2e=_((W$t,V2e)=>{V2e.exports=ve(\"fs\").constants||ve(\"constants\")});var eBe=_((K$t,$2e)=>{var BC=z2e(),J2e=SO(),LQ=Yh(),ovt=Buffer.alloc,X2e=CC().Readable,vC=CC().Writable,avt=ve(\"string_decoder\").StringDecoder,NQ=$j(),lvt=parseInt(\"755\",8),cvt=parseInt(\"644\",8),Z2e=ovt(1024),t5=function(){},e5=function(t,e){e&=511,e&&t.push(Z2e.slice(0,512-e))};function uvt(t){switch(t&BC.S_IFMT){case BC.S_IFBLK:return\"block-device\";case BC.S_IFCHR:return\"character-device\";case BC.S_IFDIR:return\"directory\";case BC.S_IFIFO:return\"fifo\";case BC.S_IFLNK:return\"symlink\"}return\"file\"}var MQ=function(t){vC.call(this),this.written=0,this._to=t,this._destroyed=!1};LQ(MQ,vC);MQ.prototype._write=function(t,e,r){if(this.written+=t.length,this._to.push(t))return r();this._to._drain=r};MQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var OQ=function(){vC.call(this),this.linkname=\"\",this._decoder=new avt(\"utf-8\"),this._destroyed=!1};LQ(OQ,vC);OQ.prototype._write=function(t,e,r){this.linkname+=this._decoder.write(t),r()};OQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var uv=function(){vC.call(this),this._destroyed=!1};LQ(uv,vC);uv.prototype._write=function(t,e,r){r(new Error(\"No body allowed for this entry\"))};uv.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit(\"close\"))};var EA=function(t){if(!(this instanceof EA))return new EA(t);X2e.call(this,t),this._drain=t5,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};LQ(EA,X2e);EA.prototype.entry=function(t,e,r){if(this._stream)throw new Error(\"already piping an entry\");if(!(this._finalized||this._destroyed)){typeof e==\"function\"&&(r=e,e=null),r||(r=t5);var o=this;if((!t.size||t.type===\"symlink\")&&(t.size=0),t.type||(t.type=uvt(t.mode)),t.mode||(t.mode=t.type===\"directory\"?lvt:cvt),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e==\"string\"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){t.size=e.length,this._encode(t);var a=this.push(e);return e5(o,t.size),a?process.nextTick(r):this._drain=r,new uv}if(t.type===\"symlink\"&&!t.linkname){var n=new OQ;return J2e(n,function(A){if(A)return o.destroy(),r(A);t.linkname=n.linkname,o._encode(t),r()}),n}if(this._encode(t),t.type!==\"file\"&&t.type!==\"contiguous-file\")return process.nextTick(r),new uv;var u=new MQ(this);return this._stream=u,J2e(u,function(A){if(o._stream=null,A)return o.destroy(),r(A);if(u.written!==t.size)return o.destroy(),r(new Error(\"size mismatch\"));e5(o,t.size),o._finalizing&&o.finalize(),r()}),u}};EA.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(Z2e),this.push(null))};EA.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit(\"error\",t),this.emit(\"close\"),this._stream&&this._stream.destroy&&this._stream.destroy())};EA.prototype._encode=function(t){if(!t.pax){var e=NQ.encode(t);if(e){this.push(e);return}}this._encodePax(t)};EA.prototype._encodePax=function(t){var e=NQ.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),r={name:\"PaxHeader\",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:\"pax-header\",linkname:t.linkname&&\"PaxHeader\",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(NQ.encode(r)),this.push(e),e5(this,e.length),r.size=t.size,r.type=t.type,this.push(NQ.encode(r))};EA.prototype._read=function(t){var e=this._drain;this._drain=t5,e()};$2e.exports=EA});var tBe=_(r5=>{r5.extract=K2e();r5.pack=eBe()});var pBe=_((per,fBe)=>{\"use strict\";var Av=class t{constructor(e,r,o){this.__specs=e||{},Object.keys(this.__specs).forEach(a=>{if(typeof this.__specs[a]==\"string\"){let n=this.__specs[a],u=this.__specs[n];if(u){let A=u.aliases||[];A.push(a,n),u.aliases=[...new Set(A)],this.__specs[a]=u}else throw new Error(`Alias refers to invalid key: ${n} -> ${a}`)}}),this.__opts=r||{},this.__providers=uBe(o.filter(a=>a!=null&&typeof a==\"object\")),this.__isFiggyPudding=!0}get(e){return l5(this,e,!0)}get[Symbol.toStringTag](){return\"FiggyPudding\"}forEach(e,r=this){for(let[o,a]of this.entries())e.call(r,a,o,this)}toJSON(){let e={};return this.forEach((r,o)=>{e[o]=r}),e}*entries(e){for(let o of Object.keys(this.__specs))yield[o,this.get(o)];let r=e||this.__opts.other;if(r){let o=new Set;for(let a of this.__providers){let n=a.entries?a.entries(r):Dvt(a);for(let[u,A]of n)r(u)&&!o.has(u)&&(o.add(u),yield[u,A])}}}*[Symbol.iterator](){for(let[e,r]of this.entries())yield[e,r]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new t(this.__specs,this.__opts,uBe(this.__providers).concat(e)),ABe)}};try{let t=ve(\"util\");Av.prototype[t.inspect.custom]=function(e,r){return this[Symbol.toStringTag]+\" \"+t.inspect(this.toJSON(),r)}}catch{}function Bvt(t){throw Object.assign(new Error(`invalid config key requested: ${t}`),{code:\"EBADKEY\"})}function l5(t,e,r){let o=t.__specs[e];if(r&&!o&&(!t.__opts.other||!t.__opts.other(e)))Bvt(e);else{o||(o={});let a;for(let n of t.__providers){if(a=cBe(e,n),a===void 0&&o.aliases&&o.aliases.length){for(let u of o.aliases)if(u!==e&&(a=cBe(u,n),a!==void 0))break}if(a!==void 0)break}return a===void 0&&o.default!==void 0?typeof o.default==\"function\"?o.default(t):o.default:a}}function cBe(t,e){let r;return e.__isFiggyPudding?r=l5(e,t,!1):typeof e.get==\"function\"?r=e.get(t):r=e[t],r}var ABe={has(t,e){return e in t.__specs&&l5(t,e,!1)!==void 0},ownKeys(t){return Object.keys(t.__specs)},get(t,e){return typeof e==\"symbol\"||e.slice(0,2)===\"__\"||e in Av.prototype?t[e]:t.get(e)},set(t,e,r){if(typeof e==\"symbol\"||e.slice(0,2)===\"__\")return t[e]=r,!0;throw new Error(\"figgyPudding options cannot be modified. Use .concat() instead.\")},deleteProperty(){throw new Error(\"figgyPudding options cannot be deleted. Use .concat() and shadow them instead.\")}};fBe.exports=vvt;function vvt(t,e){function r(...o){return new Proxy(new Av(t,e,o),ABe)}return r}function uBe(t){let e=[];return t.forEach(r=>e.unshift(r)),e}function Dvt(t){return Object.keys(t).map(e=>[e,t[e]])}});var dBe=_((her,IA)=>{\"use strict\";var pv=ve(\"crypto\"),Pvt=pBe(),bvt=ve(\"stream\").Transform,hBe=[\"sha256\",\"sha384\",\"sha512\"],Svt=/^[a-z0-9+/]+(?:=?=?)$/i,xvt=/^([^-]+)-([^?]+)([?\\S*]*)$/,kvt=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\\?[\\x21-\\x7E]*)*$/,Qvt=/^[\\x21-\\x7E]+$/,oa=Pvt({algorithms:{default:[\"sha512\"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>Uvt},Promise:{default:()=>Promise},sep:{default:\" \"},single:{default:!1},size:{},strict:{default:!1}}),Zh=class{get isHash(){return!0}constructor(e,r){r=oa(r);let o=!!r.strict;this.source=e.trim();let a=this.source.match(o?kvt:xvt);if(!a||o&&!hBe.some(u=>u===a[1]))return;this.algorithm=a[1],this.digest=a[2];let n=a[3];this.options=n?n.slice(1).split(\"?\"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,\"base64\").toString(\"hex\")}toJSON(){return this.toString()}toString(e){if(e=oa(e),e.strict&&!(hBe.some(o=>o===this.algorithm)&&this.digest.match(Svt)&&(this.options||[]).every(o=>o.match(Qvt))))return\"\";let r=this.options&&this.options.length?`?${this.options.join(\"?\")}`:\"\";return`${this.algorithm}-${this.digest}${r}`}},fd=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=oa(e);let r=e.sep||\" \";return e.strict&&(r=r.replace(/\\S+/g,\" \")),Object.keys(this).map(o=>this[o].map(a=>Zh.prototype.toString.call(a,e)).filter(a=>a.length).join(r)).filter(o=>o.length).join(r)}concat(e,r){r=oa(r);let o=typeof e==\"string\"?e:fv(e,r);return wA(`${this.toString(r)} ${o}`,r)}hexDigest(){return wA(this,{single:!0}).hexDigest()}match(e,r){r=oa(r);let o=wA(e,r),a=o.pickAlgorithm(r);return this[a]&&o[a]&&this[a].find(n=>o[a].find(u=>n.digest===u.digest))||!1}pickAlgorithm(e){e=oa(e);let r=e.pickAlgorithm,o=Object.keys(this);if(!o.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return o.reduce((a,n)=>r(a,n)||a)}};IA.exports.parse=wA;function wA(t,e){if(e=oa(e),typeof t==\"string\")return c5(t,e);if(t.algorithm&&t.digest){let r=new fd;return r[t.algorithm]=[t],c5(fv(r,e),e)}else return c5(fv(t,e),e)}function c5(t,e){return e.single?new Zh(t,e):t.trim().split(/\\s+/).reduce((r,o)=>{let a=new Zh(o,e);if(a.algorithm&&a.digest){let n=a.algorithm;r[n]||(r[n]=[]),r[n].push(a)}return r},new fd)}IA.exports.stringify=fv;function fv(t,e){return e=oa(e),t.algorithm&&t.digest?Zh.prototype.toString.call(t,e):typeof t==\"string\"?fv(wA(t,e),e):fd.prototype.toString.call(t,e)}IA.exports.fromHex=Fvt;function Fvt(t,e,r){r=oa(r);let o=r.options&&r.options.length?`?${r.options.join(\"?\")}`:\"\";return wA(`${e}-${Buffer.from(t,\"hex\").toString(\"base64\")}${o}`,r)}IA.exports.fromData=Rvt;function Rvt(t,e){e=oa(e);let r=e.algorithms,o=e.options&&e.options.length?`?${e.options.join(\"?\")}`:\"\";return r.reduce((a,n)=>{let u=pv.createHash(n).update(t).digest(\"base64\"),A=new Zh(`${n}-${u}${o}`,e);if(A.algorithm&&A.digest){let p=A.algorithm;a[p]||(a[p]=[]),a[p].push(A)}return a},new fd)}IA.exports.fromStream=Tvt;function Tvt(t,e){e=oa(e);let r=e.Promise||Promise,o=u5(e);return new r((a,n)=>{t.pipe(o),t.on(\"error\",n),o.on(\"error\",n);let u;o.on(\"integrity\",A=>{u=A}),o.on(\"end\",()=>a(u)),o.on(\"data\",()=>{})})}IA.exports.checkData=Nvt;function Nvt(t,e,r){if(r=oa(r),e=wA(e,r),!Object.keys(e).length){if(r.error)throw Object.assign(new Error(\"No valid integrity hashes to check against\"),{code:\"EINTEGRITY\"});return!1}let o=e.pickAlgorithm(r),a=pv.createHash(o).update(t).digest(\"base64\"),n=wA({algorithm:o,digest:a}),u=n.match(e,r);if(u||!r.error)return u;if(typeof r.size==\"number\"&&t.length!==r.size){let A=new Error(`data size mismatch when checking ${e}.\n  Wanted: ${r.size}\n  Found: ${t.length}`);throw A.code=\"EBADSIZE\",A.found=t.length,A.expected=r.size,A.sri=e,A}else{let A=new Error(`Integrity checksum failed when using ${o}: Wanted ${e}, but got ${n}. (${t.length} bytes)`);throw A.code=\"EINTEGRITY\",A.found=n,A.expected=e,A.algorithm=o,A.sri=e,A}}IA.exports.checkStream=Lvt;function Lvt(t,e,r){r=oa(r);let o=r.Promise||Promise,a=u5(r.concat({integrity:e}));return new o((n,u)=>{t.pipe(a),t.on(\"error\",u),a.on(\"error\",u);let A;a.on(\"verified\",p=>{A=p}),a.on(\"end\",()=>n(A)),a.on(\"data\",()=>{})})}IA.exports.integrityStream=u5;function u5(t){t=oa(t);let e=t.integrity&&wA(t.integrity,t),r=e&&Object.keys(e).length,o=r&&e.pickAlgorithm(t),a=r&&e[o],n=Array.from(new Set(t.algorithms.concat(o?[o]:[]))),u=n.map(pv.createHash),A=0,p=new bvt({transform(h,E,I){A+=h.length,u.forEach(v=>v.update(h,E)),I(null,h,E)}}).on(\"end\",()=>{let h=t.options&&t.options.length?`?${t.options.join(\"?\")}`:\"\",E=wA(u.map((v,x)=>`${n[x]}-${v.digest(\"base64\")}${h}`).join(\" \"),t),I=r&&E.match(e,t);if(typeof t.size==\"number\"&&A!==t.size){let v=new Error(`stream size mismatch when checking ${e}.\n  Wanted: ${t.size}\n  Found: ${A}`);v.code=\"EBADSIZE\",v.found=A,v.expected=t.size,v.sri=e,p.emit(\"error\",v)}else if(t.integrity&&!I){let v=new Error(`${e} integrity checksum failed when using ${o}: wanted ${a} but got ${E}. (${A} bytes)`);v.code=\"EINTEGRITY\",v.found=E,v.expected=a,v.algorithm=o,v.sri=e,p.emit(\"error\",v)}else p.emit(\"size\",A),p.emit(\"integrity\",E),I&&p.emit(\"verified\",I)});return p}IA.exports.create=Mvt;function Mvt(t){t=oa(t);let e=t.algorithms,r=t.options.length?`?${t.options.join(\"?\")}`:\"\",o=e.map(pv.createHash);return{update:function(a,n){return o.forEach(u=>u.update(a,n)),this},digest:function(a){return e.reduce((u,A)=>{let p=o.shift().digest(\"base64\"),h=new Zh(`${A}-${p}${r}`,t);if(h.algorithm&&h.digest){let E=h.algorithm;u[E]||(u[E]=[]),u[E].push(h)}return u},new fd)}}}var Ovt=new Set(pv.getHashes()),gBe=[\"md5\",\"whirlpool\",\"sha1\",\"sha224\",\"sha256\",\"sha384\",\"sha512\",\"sha3\",\"sha3-256\",\"sha3-384\",\"sha3-512\",\"sha3_256\",\"sha3_384\",\"sha3_512\"].filter(t=>Ovt.has(t));function Uvt(t,e){return gBe.indexOf(t.toLowerCase())>=gBe.indexOf(e.toLowerCase())?t:e}});var YBe=_((mir,GBe)=>{var UDt=$N();function _Dt(t){return UDt(t)?void 0:t}GBe.exports=_Dt});var KBe=_((yir,WBe)=>{var HDt=xS(),qDt=B8(),jDt=b8(),GDt=Mg(),YDt=Ag(),WDt=YBe(),KDt=m_(),VDt=I8(),zDt=1,JDt=2,XDt=4,ZDt=KDt(function(t,e){var r={};if(t==null)return r;var o=!1;e=HDt(e,function(n){return n=GDt(n,t),o||(o=n.length>1),n}),YDt(t,VDt(t),r),o&&(r=qDt(r,zDt|JDt|XDt,WDt));for(var a=e.length;a--;)jDt(r,e[a]);return r});WBe.exports=ZDt});Pt();Ge();Pt();var ZBe=ve(\"child_process\"),$Be=Ze(X0());qt();var Uy=new Map([]);var W1={};Vt(W1,{BaseCommand:()=>ut,WorkspaceRequiredError:()=>sr,getCli:()=>ihe,getDynamicLibs:()=>nhe,getPluginConfiguration:()=>Hy,openWorkspace:()=>_y,pluginCommands:()=>Uy,runExit:()=>Wx});qt();var ut=class extends it{constructor(){super(...arguments);this.cwd=ge.String(\"--cwd\",{hidden:!0})}validateAndExecute(){if(typeof this.cwd<\"u\")throw new st(\"The --cwd option is ambiguous when used anywhere else than the very first parameter provided in the command line, before even the command path\");return super.validateAndExecute()}};Ge();Pt();qt();var sr=class extends st{constructor(e,r){let o=V.relative(e,r),a=V.join(e,Ut.fileName);super(`This command can only be run from within a workspace of your project (${o} isn't a workspace of ${a}).`)}};Ge();Pt();nA();Nl();g1();qt();var UAt=Ze(Jn());el();var nhe=()=>new Map([[\"@yarnpkg/cli\",W1],[\"@yarnpkg/core\",Y1],[\"@yarnpkg/fslib\",kw],[\"@yarnpkg/libzip\",p1],[\"@yarnpkg/parsers\",Ow],[\"@yarnpkg/shell\",E1],[\"clipanion\",Jw],[\"semver\",UAt],[\"typanion\",Vo]]);Ge();async function _y(t,e){let{project:r,workspace:o}=await kt.find(t,e);if(!o)throw new sr(r.cwd,e);return o}Ge();Pt();nA();Nl();g1();qt();var aPt=Ze(Jn());el();var K8={};Vt(K8,{AddCommand:()=>Yy,BinCommand:()=>Wy,CacheCleanCommand:()=>Ky,ClipanionCommand:()=>$y,ConfigCommand:()=>Xy,ConfigGetCommand:()=>Vy,ConfigSetCommand:()=>zy,ConfigUnsetCommand:()=>Jy,DedupeCommand:()=>Zy,EntryCommand:()=>tE,ExecCommand:()=>nE,ExplainCommand:()=>oE,ExplainPeerRequirementsCommand:()=>iE,HelpCommand:()=>eE,InfoCommand:()=>aE,LinkCommand:()=>cE,NodeCommand:()=>uE,PluginCheckCommand:()=>AE,PluginImportCommand:()=>hE,PluginImportSourcesCommand:()=>gE,PluginListCommand:()=>fE,PluginRemoveCommand:()=>dE,PluginRuntimeCommand:()=>mE,RebuildCommand:()=>yE,RemoveCommand:()=>EE,RunCommand:()=>wE,RunIndexCommand:()=>CE,SetResolutionCommand:()=>IE,SetVersionCommand:()=>sE,SetVersionSourcesCommand:()=>pE,UnlinkCommand:()=>BE,UpCommand:()=>vE,VersionCommand:()=>rE,WhyCommand:()=>DE,WorkspaceCommand:()=>kE,WorkspacesListCommand:()=>xE,YarnCommand:()=>lE,dedupeUtils:()=>rk,default:()=>Rgt,suggestUtils:()=>Zc});var Nde=Ze(X0());Ge();Ge();Ge();qt();var Y0e=Ze(J1());el();var Zc={};Vt(Zc,{Modifier:()=>m8,Strategy:()=>$x,Target:()=>X1,WorkspaceModifier:()=>_0e,applyModifier:()=>spt,extractDescriptorFromPath:()=>y8,extractRangeModifier:()=>H0e,fetchDescriptorFrom:()=>E8,findProjectDescriptors:()=>G0e,getModifier:()=>Z1,getSuggestedDescriptors:()=>$1,makeWorkspaceDescriptor:()=>j0e,toWorkspaceModifier:()=>q0e});Ge();Ge();Pt();var d8=Ze(Jn()),npt=\"workspace:\",X1=(o=>(o.REGULAR=\"dependencies\",o.DEVELOPMENT=\"devDependencies\",o.PEER=\"peerDependencies\",o))(X1||{}),m8=(o=>(o.CARET=\"^\",o.TILDE=\"~\",o.EXACT=\"\",o))(m8||{}),_0e=(o=>(o.CARET=\"^\",o.TILDE=\"~\",o.EXACT=\"*\",o))(_0e||{}),$x=(n=>(n.KEEP=\"keep\",n.REUSE=\"reuse\",n.PROJECT=\"project\",n.LATEST=\"latest\",n.CACHE=\"cache\",n))($x||{});function Z1(t,e){return t.exact?\"\":t.caret?\"^\":t.tilde?\"~\":e.configuration.get(\"defaultSemverRangePrefix\")}var ipt=/^([\\^~]?)[0-9]+(?:\\.[0-9]+){0,2}(?:-\\S+)?$/;function H0e(t,{project:e}){let r=t.match(ipt);return r?r[1]:e.configuration.get(\"defaultSemverRangePrefix\")}function spt(t,e){let{protocol:r,source:o,params:a,selector:n}=G.parseRange(t.range);return d8.default.valid(n)&&(n=`${e}${t.range}`),G.makeDescriptor(t,G.makeRange({protocol:r,source:o,params:a,selector:n}))}function q0e(t){switch(t){case\"^\":return\"^\";case\"~\":return\"~\";case\"\":return\"*\";default:throw new Error(`Assertion failed: Unknown modifier: \"${t}\"`)}}function j0e(t,e){return G.makeDescriptor(t.anchoredDescriptor,`${npt}${q0e(e)}`)}async function G0e(t,{project:e,target:r}){let o=new Map,a=n=>{let u=o.get(n.descriptorHash);return u||o.set(n.descriptorHash,u={descriptor:n,locators:[]}),u};for(let n of e.workspaces)if(r===\"peerDependencies\"){let u=n.manifest.peerDependencies.get(t.identHash);u!==void 0&&a(u).locators.push(n.anchoredLocator)}else{let u=n.manifest.dependencies.get(t.identHash),A=n.manifest.devDependencies.get(t.identHash);r===\"devDependencies\"?A!==void 0?a(A).locators.push(n.anchoredLocator):u!==void 0&&a(u).locators.push(n.anchoredLocator):u!==void 0?a(u).locators.push(n.anchoredLocator):A!==void 0&&a(A).locators.push(n.anchoredLocator)}return o}async function y8(t,{cwd:e,workspace:r}){return await opt(async o=>{V.isAbsolute(t)||(t=V.relative(r.cwd,V.resolve(e,t)),t.match(/^\\.{0,2}\\//)||(t=`./${t}`));let{project:a}=r,n=await E8(G.makeIdent(null,\"archive\"),t,{project:r.project,cache:o,workspace:r});if(!n)throw new Error(\"Assertion failed: The descriptor should have been found\");let u=new ki,A=a.configuration.makeResolver(),p=a.configuration.makeFetcher(),h={checksums:a.storedChecksums,project:a,cache:o,fetcher:p,report:u,resolver:A},E=A.bindDescriptor(n,r.anchoredLocator,h),I=G.convertDescriptorToLocator(E),v=await p.fetch(I,h),x=await Ut.find(v.prefixPath,{baseFs:v.packageFs});if(!x.name)throw new Error(\"Target path doesn't have a name\");return G.makeDescriptor(x.name,t)})}async function $1(t,{project:e,workspace:r,cache:o,target:a,fixed:n,modifier:u,strategies:A,maxResults:p=1/0}){if(!(p>=0))throw new Error(`Invalid maxResults (${p})`);let[h,E]=t.range!==\"unknown\"?n||Lr.validRange(t.range)||!t.range.match(/^[a-z0-9._-]+$/i)?[t.range,\"latest\"]:[\"unknown\",t.range]:[\"unknown\",\"latest\"];if(h!==\"unknown\")return{suggestions:[{descriptor:t,name:`Use ${G.prettyDescriptor(e.configuration,t)}`,reason:\"(unambiguous explicit request)\"}],rejections:[]};let I=typeof r<\"u\"&&r!==null&&r.manifest[a].get(t.identHash)||null,v=[],x=[],C=async R=>{try{await R()}catch(L){x.push(L)}};for(let R of A){if(v.length>=p)break;switch(R){case\"keep\":await C(async()=>{I&&v.push({descriptor:I,name:`Keep ${G.prettyDescriptor(e.configuration,I)}`,reason:\"(no changes)\"})});break;case\"reuse\":await C(async()=>{for(let{descriptor:L,locators:U}of(await G0e(t,{project:e,target:a})).values()){if(U.length===1&&U[0].locatorHash===r.anchoredLocator.locatorHash&&A.includes(\"keep\"))continue;let z=`(originally used by ${G.prettyLocator(e.configuration,U[0])}`;z+=U.length>1?` and ${U.length-1} other${U.length>2?\"s\":\"\"})`:\")\",v.push({descriptor:L,name:`Reuse ${G.prettyDescriptor(e.configuration,L)}`,reason:z})}});break;case\"cache\":await C(async()=>{for(let L of e.storedDescriptors.values())L.identHash===t.identHash&&v.push({descriptor:L,name:`Reuse ${G.prettyDescriptor(e.configuration,L)}`,reason:\"(already used somewhere in the lockfile)\"})});break;case\"project\":await C(async()=>{if(r.manifest.name!==null&&t.identHash===r.manifest.name.identHash)return;let L=e.tryWorkspaceByIdent(t);if(L===null)return;let U=j0e(L,u);v.push({descriptor:U,name:`Attach ${G.prettyDescriptor(e.configuration,U)}`,reason:`(local workspace at ${pe.pretty(e.configuration,L.relativeCwd,pe.Type.PATH)})`})});break;case\"latest\":{let L=e.configuration.get(\"enableNetwork\"),U=e.configuration.get(\"enableOfflineMode\");await C(async()=>{if(a===\"peerDependencies\")v.push({descriptor:G.makeDescriptor(t,\"*\"),name:\"Use *\",reason:\"(catch-all peer dependency pattern)\"});else if(!L&&!U)v.push({descriptor:null,name:\"Resolve from latest\",reason:pe.pretty(e.configuration,\"(unavailable because enableNetwork is toggled off)\",\"grey\")});else{let z=await E8(t,E,{project:e,cache:o,workspace:r,modifier:u});z&&v.push({descriptor:z,name:`Use ${G.prettyDescriptor(e.configuration,z)}`,reason:`(resolved from ${U?\"the cache\":\"latest\"})`})}})}break}}return{suggestions:v.slice(0,p),rejections:x.slice(0,p)}}async function E8(t,e,{project:r,cache:o,workspace:a,preserveModifier:n=!0,modifier:u}){let A=r.configuration.normalizeDependency(G.makeDescriptor(t,e)),p=new ki,h=r.configuration.makeFetcher(),E=r.configuration.makeResolver(),I={project:r,fetcher:h,cache:o,checksums:r.storedChecksums,report:p,cacheOptions:{skipIntegrityCheck:!0}},v={...I,resolver:E,fetchOptions:I},x=E.bindDescriptor(A,a.anchoredLocator,v),C=await E.getCandidates(x,{},v);if(C.length===0)return null;let R=C[0],{protocol:L,source:U,params:z,selector:te}=G.parseRange(G.convertToManifestRange(R.reference));if(L===r.configuration.get(\"defaultProtocol\")&&(L=null),d8.default.valid(te)){let ae=te;if(typeof u<\"u\")te=u+te;else if(n!==!1){let Ce=typeof n==\"string\"?n:A.range;te=H0e(Ce,{project:r})+te}let le=G.makeDescriptor(R,G.makeRange({protocol:L,source:U,params:z,selector:te}));(await E.getCandidates(r.configuration.normalizeDependency(le),{},v)).length!==1&&(te=ae)}return G.makeDescriptor(R,G.makeRange({protocol:L,source:U,params:z,selector:te}))}async function opt(t){return await oe.mktempPromise(async e=>{let r=Ke.create(e);return r.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await t(new Gr(e,{configuration:r,check:!1,immutable:!1}))})}var Yy=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.fixed=ge.Boolean(\"-F,--fixed\",!1,{description:\"Store dependency tags as-is instead of resolving them\"});this.exact=ge.Boolean(\"-E,--exact\",!1,{description:\"Don't use any semver modifier on the resolved range\"});this.tilde=ge.Boolean(\"-T,--tilde\",!1,{description:\"Use the `~` semver modifier on the resolved range\"});this.caret=ge.Boolean(\"-C,--caret\",!1,{description:\"Use the `^` semver modifier on the resolved range\"});this.dev=ge.Boolean(\"-D,--dev\",!1,{description:\"Add a package as a dev dependency\"});this.peer=ge.Boolean(\"-P,--peer\",!1,{description:\"Add a package as a peer dependency\"});this.optional=ge.Boolean(\"-O,--optional\",!1,{description:\"Add / upgrade a package to an optional regular / peer dependency\"});this.preferDev=ge.Boolean(\"--prefer-dev\",!1,{description:\"Add / upgrade a package to a dev dependency\"});this.interactive=ge.Boolean(\"-i,--interactive\",{description:\"Reuse the specified package from other workspaces in the project\"});this.cached=ge.Boolean(\"--cached\",!1,{description:\"Reuse the highest version already used somewhere within the project\"});this.mode=ge.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Js(hl)});this.silent=ge.Boolean(\"--silent\",{hidden:!0});this.packages=ge.Rest()}static{this.paths=[[\"add\"]]}static{this.usage=it.Usage({description:\"add dependencies to the project\",details:\"\\n      This command adds a package to the package.json for the nearest workspace.\\n\\n      - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\\n\\n      - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\\n\\n      - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\\n\\n      - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\\\"peerDependenciesMeta\\\": { \\\"<package>\\\": { \\\"optional\\\": true } }`\\n\\n      - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\\n\\n      - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\\n\\n      If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\\n\\n      If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n\\n      For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/protocols.\\n    \",examples:[[\"Add a regular package to the current workspace\",\"$0 add lodash\"],[\"Add a specific version for a package to the current workspace\",\"$0 add lodash@1.2.3\"],[\"Add a package from a GitHub repository (the master branch) to the current workspace using a URL\",\"$0 add lodash@https://github.com/lodash/lodash\"],[\"Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol\",\"$0 add lodash@github:lodash/lodash\"],[\"Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)\",\"$0 add lodash@lodash/lodash\"],[\"Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)\",\"$0 add lodash-es@lodash/lodash#es\"],[\"Add a local package (gzipped tarball format) to the current workspace\",\"$0 add local-package-name@file:../path/to/local-package-name-v0.1.2.tgz\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n=await Gr.find(r);if(!a)throw new sr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.fixed,A=r.isInteractive({interactive:this.interactive,stdout:this.context.stdout}),p=A||r.get(\"preferReuse\"),h=Z1(this,o),E=[p?\"reuse\":void 0,\"project\",this.cached?\"cache\":void 0,\"latest\"].filter(U=>typeof U<\"u\"),I=A?1/0:1,v=await Promise.all(this.packages.map(async U=>{let z=U.match(/^\\.{0,2}\\//)?await y8(U,{cwd:this.context.cwd,workspace:a}):G.tryParseDescriptor(U),te=U.match(/^(https?:|git@github)/);if(te)throw new st(`It seems you are trying to add a package using a ${pe.pretty(r,`${te[0]}...`,pe.Type.RANGE)} url; we now require package names to be explicitly specified.\nTry running the command again with the package name prefixed: ${pe.pretty(r,\"yarn add\",pe.Type.CODE)} ${pe.pretty(r,G.makeDescriptor(G.makeIdent(null,\"my-package\"),`${te[0]}...`),pe.Type.DESCRIPTOR)}`);if(!z)throw new st(`The ${pe.pretty(r,U,pe.Type.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let ae=apt(a,z,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return await Promise.all(ae.map(async ce=>{let Ce=await $1(z,{project:o,workspace:a,cache:n,fixed:u,target:ce,modifier:h,strategies:E,maxResults:I});return{request:z,suggestedDescriptors:Ce,target:ce}}))})).then(U=>U.flat()),x=await AA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async U=>{for(let{request:z,suggestedDescriptors:{suggestions:te,rejections:ae}}of v)if(te.filter(ce=>ce.descriptor!==null).length===0){let[ce]=ae;if(typeof ce>\"u\")throw new Error(\"Assertion failed: Expected an error to have been set\");o.configuration.get(\"enableNetwork\")?U.reportError(27,`${G.prettyDescriptor(r,z)} can't be resolved to a satisfying range`):U.reportError(27,`${G.prettyDescriptor(r,z)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),U.reportSeparator(),U.reportExceptionOnce(ce)}});if(x.hasErrors())return x.exitCode();let C=!1,R=[],L=[];for(let{suggestedDescriptors:{suggestions:U},target:z}of v){let te,ae=U.filter(de=>de.descriptor!==null),le=ae[0].descriptor,ce=ae.every(de=>G.areDescriptorsEqual(de.descriptor,le));ae.length===1||ce?te=le:(C=!0,{answer:te}=await(0,Y0e.prompt)({type:\"select\",name:\"answer\",message:\"Which range do you want to use?\",choices:U.map(({descriptor:de,name:Be,reason:Ee})=>de?{name:Be,hint:Ee,descriptor:de}:{name:Be,hint:Ee,disabled:!0}),onCancel:()=>process.exit(130),result(de){return this.find(de,\"descriptor\")},stdin:this.context.stdin,stdout:this.context.stdout}));let Ce=a.manifest[z].get(te.identHash);(typeof Ce>\"u\"||Ce.descriptorHash!==te.descriptorHash)&&(a.manifest[z].set(te.identHash,te),this.optional&&(z===\"dependencies\"?a.manifest.ensureDependencyMeta({...te,range:\"unknown\"}).optional=!0:z===\"peerDependencies\"&&(a.manifest.ensurePeerDependencyMeta({...te,range:\"unknown\"}).optional=!0)),typeof Ce>\"u\"?R.push([a,z,te,E]):L.push([a,z,Ce,te]))}return await r.triggerMultipleHooks(U=>U.afterWorkspaceDependencyAddition,R),await r.triggerMultipleHooks(U=>U.afterWorkspaceDependencyReplacement,L),C&&this.context.stdout.write(`\n`),await o.installWithNewReport({json:this.json,stdout:this.context.stdout,quiet:this.context.quiet},{cache:n,mode:this.mode})}};function apt(t,e,{dev:r,peer:o,preferDev:a,optional:n}){let u=t.manifest.dependencies.has(e.identHash),A=t.manifest.devDependencies.has(e.identHash),p=t.manifest.peerDependencies.has(e.identHash);if((r||o)&&u)throw new st(`Package \"${G.prettyIdent(t.project.configuration,e)}\" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!o&&p)throw new st(`Package \"${G.prettyIdent(t.project.configuration,e)}\" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(n&&A)throw new st(`Package \"${G.prettyIdent(t.project.configuration,e)}\" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(n&&!o&&p)throw new st(`Package \"${G.prettyIdent(t.project.configuration,e)}\" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||a)&&n)throw new st(`Package \"${G.prettyIdent(t.project.configuration,e)}\" cannot simultaneously be a dev dependency and an optional dependency`);let h=[];return o&&h.push(\"peerDependencies\"),(r||a)&&h.push(\"devDependencies\"),n&&h.push(\"dependencies\"),h.length>0?h:A?[\"devDependencies\"]:p?[\"peerDependencies\"]:[\"dependencies\"]}Ge();Ge();qt();var Wy=class extends ut{constructor(){super(...arguments);this.verbose=ge.Boolean(\"-v,--verbose\",!1,{description:\"Print both the binary name and the locator of the package that provides the binary\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.name=ge.String({required:!1})}static{this.paths=[[\"bin\"]]}static{this.usage=it.Usage({description:\"get the path to a binary script\",details:`\n      When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \\`-v,--verbose\\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary.\n\n      When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive.\n    `,examples:[[\"List all the available binaries\",\"$0 bin\"],[\"Print the path to a specific binary\",\"$0 bin eslint\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,locator:a}=await kt.find(r,this.context.cwd);if(await o.restoreInstallState(),this.name){let A=(await An.getPackageAccessibleBinaries(a,{project:o})).get(this.name);if(!A)throw new st(`Couldn't find a binary named \"${this.name}\" for package \"${G.prettyLocator(r,a)}\"`);let[,p]=A;return this.context.stdout.write(`${p}\n`),0}return(await Rt.start({configuration:r,json:this.json,stdout:this.context.stdout},async u=>{let A=await An.getPackageAccessibleBinaries(a,{project:o}),h=Array.from(A.keys()).reduce((E,I)=>Math.max(E,I.length),0);for(let[E,[I,v]]of A)u.reportJson({name:E,source:G.stringifyIdent(I),path:v});if(this.verbose)for(let[E,[I]]of A)u.reportInfo(null,`${E.padEnd(h,\" \")}   ${G.prettyLocator(r,I)}`);else for(let E of A.keys())u.reportInfo(null,E)})).exitCode()}};Ge();Pt();qt();var Ky=class extends ut{constructor(){super(...arguments);this.mirror=ge.Boolean(\"--mirror\",!1,{description:\"Remove the global cache files instead of the local cache files\"});this.all=ge.Boolean(\"--all\",!1,{description:\"Remove both the global cache files and the local cache files of the current project\"})}static{this.paths=[[\"cache\",\"clean\"],[\"cache\",\"clear\"]]}static{this.usage=it.Usage({description:\"remove the shared cache files\",details:`\n      This command will remove all the files from the cache.\n    `,examples:[[\"Remove all the local archives\",\"$0 cache clean\"],[\"Remove all the archives stored in the ~/.yarn directory\",\"$0 cache clean --mirror\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=await Gr.find(r);return(await Rt.start({configuration:r,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&o.mirrorCwd!==null,u=!this.mirror;n&&(await oe.removePromise(o.mirrorCwd),await r.triggerHook(A=>A.cleanGlobalArtifacts,r)),u&&await oe.removePromise(o.cwd)})).exitCode()}};Ge();qt();var K0e=Ze(e2()),C8=ve(\"util\"),Vy=class extends ut{constructor(){super(...arguments);this.why=ge.Boolean(\"--why\",!1,{description:\"Print the explanation for why a setting has its value\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.unsafe=ge.Boolean(\"--no-redacted\",!1,{description:\"Don't redact secrets (such as tokens) from the output\"});this.name=ge.String()}static{this.paths=[[\"config\",\"get\"]]}static{this.usage=it.Usage({description:\"read a configuration settings\",details:`\n      This command will print a configuration setting.\n\n      Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \\`--no-redacted\\` to get the untransformed value.\n    `,examples:[[\"Print a simple configuration setting\",\"yarn config get yarnPath\"],[\"Print a complex configuration setting\",\"yarn config get packageExtensions\"],[\"Print a nested field from the configuration\",`yarn config get 'npmScopes[\"my-company\"].npmRegistryServer'`],[\"Print a token from the configuration\",\"yarn config get npmAuthToken --no-redacted\"],[\"Print a configuration setting as JSON\",\"yarn config get packageExtensions --json\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=this.name.replace(/[.[].*$/,\"\"),a=this.name.replace(/^[^.[]*/,\"\");if(typeof r.settings.get(o)>\"u\")throw new st(`Couldn't find a configuration settings named \"${o}\"`);let u=r.getSpecial(o,{hideSecrets:!this.unsafe,getNativePaths:!0}),A=He.convertMapsToIndexableObjects(u),p=a?(0,K0e.default)(A,a):A,h=await Rt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async E=>{E.reportJson(p)});if(!this.json){if(typeof p==\"string\")return this.context.stdout.write(`${p}\n`),h.exitCode();C8.inspect.styles.name=\"cyan\",this.context.stdout.write(`${(0,C8.inspect)(p,{depth:1/0,colors:r.get(\"enableColors\"),compact:!1})}\n`)}return h.exitCode()}};Ge();qt();var Mge=Ze(v8()),Oge=Ze(e2()),Uge=Ze(D8()),P8=ve(\"util\"),zy=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Set complex configuration settings to JSON values\"});this.home=ge.Boolean(\"-H,--home\",!1,{description:\"Update the home configuration instead of the project configuration\"});this.name=ge.String();this.value=ge.String()}static{this.paths=[[\"config\",\"set\"]]}static{this.usage=it.Usage({description:\"change a configuration settings\",details:`\n      This command will set a configuration setting.\n\n      When used without the \\`--json\\` flag, it can only set a simple configuration setting (a string, a number, or a boolean).\n\n      When used with the \\`--json\\` flag, it can set both simple and complex configuration settings, including Arrays and Objects.\n    `,examples:[[\"Set a simple configuration setting (a string, a number, or a boolean)\",\"yarn config set initScope myScope\"],[\"Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag\",'yarn config set initScope --json \\\\\"myScope\\\\\"'],[\"Set a complex configuration setting (an Array) using the `--json` flag\",`yarn config set unsafeHttpWhitelist --json '[\"*.example.com\", \"example.com\"]'`],[\"Set a complex configuration setting (an Object) using the `--json` flag\",`yarn config set packageExtensions --json '{ \"@babel/parser@*\": { \"dependencies\": { \"@babel/types\": \"*\" } } }'`],[\"Set a nested configuration setting\",'yarn config set npmScopes.company.npmRegistryServer \"https://npm.example.com\"'],[\"Set a nested configuration setting using indexed access for non-simple keys\",`yarn config set 'npmRegistries[\"//npm.example.com\"].npmAuthToken' \"ffffffff-ffff-ffff-ffff-ffffffffffff\"`]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=()=>{if(!r.projectCwd)throw new st(\"This command must be run from within a project folder\");return r.projectCwd},a=this.name.replace(/[.[].*$/,\"\"),n=this.name.replace(/^[^.[]*\\.?/,\"\");if(typeof r.settings.get(a)>\"u\")throw new st(`Couldn't find a configuration settings named \"${a}\"`);if(a===\"enableStrictSettings\")throw new st(\"This setting only affects the file it's in, and thus cannot be set from the CLI\");let A=this.json?JSON.parse(this.value):this.value;await(this.home?C=>Ke.updateHomeConfiguration(C):C=>Ke.updateConfiguration(o(),C))(C=>{if(n){let R=(0,Mge.default)(C);return(0,Uge.default)(R,this.name,A),R}else return{...C,[a]:A}});let E=(await Ke.find(this.context.cwd,this.context.plugins)).getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),I=He.convertMapsToIndexableObjects(E),v=n?(0,Oge.default)(I,n):I;return(await Rt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async C=>{P8.inspect.styles.name=\"cyan\",C.reportInfo(0,`Successfully set ${this.name} to ${(0,P8.inspect)(v,{depth:1/0,colors:r.get(\"enableColors\"),compact:!1})}`)})).exitCode()}};Ge();qt();var Jge=Ze(v8()),Xge=Ze(jge()),Zge=Ze(S8()),Jy=class extends ut{constructor(){super(...arguments);this.home=ge.Boolean(\"-H,--home\",!1,{description:\"Update the home configuration instead of the project configuration\"});this.name=ge.String()}static{this.paths=[[\"config\",\"unset\"]]}static{this.usage=it.Usage({description:\"unset a configuration setting\",details:`\n      This command will unset a configuration setting.\n    `,examples:[[\"Unset a simple configuration setting\",\"yarn config unset initScope\"],[\"Unset a complex configuration setting\",\"yarn config unset packageExtensions\"],[\"Unset a nested configuration setting\",\"yarn config unset npmScopes.company.npmRegistryServer\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=()=>{if(!r.projectCwd)throw new st(\"This command must be run from within a project folder\");return r.projectCwd},a=this.name.replace(/[.[].*$/,\"\"),n=this.name.replace(/^[^.[]*\\.?/,\"\");if(typeof r.settings.get(a)>\"u\")throw new st(`Couldn't find a configuration settings named \"${a}\"`);let A=this.home?h=>Ke.updateHomeConfiguration(h):h=>Ke.updateConfiguration(o(),h);return(await Rt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async h=>{let E=!1;await A(I=>{if(!(0,Xge.default)(I,this.name))return h.reportWarning(0,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),E=!0,I;let v=n?(0,Jge.default)(I):{...I};return(0,Zge.default)(v,this.name),v}),E||h.reportInfo(0,`Successfully unset ${this.name}`)})).exitCode()}};Ge();Pt();qt();var tk=ve(\"util\"),Xy=class extends ut{constructor(){super(...arguments);this.noDefaults=ge.Boolean(\"--no-defaults\",!1,{description:\"Omit the default values from the display\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.verbose=ge.Boolean(\"-v,--verbose\",{hidden:!0});this.why=ge.Boolean(\"--why\",{hidden:!0});this.names=ge.Rest()}static{this.paths=[[\"config\"]]}static{this.usage=it.Usage({description:\"display the current configuration\",details:`\n      This command prints the current active configuration settings.\n    `,examples:[[\"Print the active configuration settings\",\"$0 config\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins,{strict:!1}),o=await uy({configuration:r,stdout:this.context.stdout,forceError:this.json},[{option:this.verbose,message:\"The --verbose option is deprecated, the settings' descriptions are now always displayed\"},{option:this.why,message:\"The --why option is deprecated, the settings' sources are now always displayed\"}]);if(o!==null)return o;let a=this.names.length>0?[...new Set(this.names)].sort():[...r.settings.keys()].sort(),n,u=await Rt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async A=>{if(r.invalid.size>0&&!this.json){for(let[p,h]of r.invalid)A.reportError(34,`Invalid configuration key \"${p}\" in ${h}`);A.reportSeparator()}if(this.json)for(let p of a){let h=r.settings.get(p);typeof h>\"u\"&&A.reportError(34,`No configuration key named \"${p}\"`);let E=r.getSpecial(p,{hideSecrets:!0,getNativePaths:!0}),I=r.sources.get(p)??\"<default>\",v=I&&I[0]!==\"<\"?ue.fromPortablePath(I):I;A.reportJson({key:p,effective:E,source:v,...h})}else{let p={breakLength:1/0,colors:r.get(\"enableColors\"),maxArrayLength:2},h={},E={children:h};for(let I of a){if(this.noDefaults&&!r.sources.has(I))continue;let v=r.settings.get(I),x=r.sources.get(I)??\"<default>\",C=r.getSpecial(I,{hideSecrets:!0,getNativePaths:!0}),R={Description:{label:\"Description\",value:pe.tuple(pe.Type.MARKDOWN,{text:v.description,format:this.cli.format(),paragraphs:!1})},Source:{label:\"Source\",value:pe.tuple(x[0]===\"<\"?pe.Type.CODE:pe.Type.PATH,x)}};h[I]={value:pe.tuple(pe.Type.CODE,I),children:R};let L=(U,z)=>{for(let[te,ae]of z)if(ae instanceof Map){let le={};U[te]={children:le},L(le,ae)}else U[te]={label:te,value:pe.tuple(pe.Type.NO_HINT,(0,tk.inspect)(ae,p))}};C instanceof Map?L(R,C):R.Value={label:\"Value\",value:pe.tuple(pe.Type.NO_HINT,(0,tk.inspect)(C,p))}}a.length!==1&&(n=void 0),fs.emitTree(E,{configuration:r,json:this.json,stdout:this.context.stdout,separators:2})}});if(!this.json&&typeof n<\"u\"){let A=a[0],p=(0,tk.inspect)(r.getSpecial(A,{hideSecrets:!0,getNativePaths:!0}),{colors:r.get(\"enableColors\")});this.context.stdout.write(`\n`),this.context.stdout.write(`${p}\n`)}return u.exitCode()}};Ge();qt();el();var rk={};Vt(rk,{Strategy:()=>t2,acceptedStrategies:()=>j0t,dedupe:()=>x8});Ge();Ge();var $ge=Ze($o()),t2=(e=>(e.HIGHEST=\"highest\",e))(t2||{}),j0t=new Set(Object.values(t2)),G0t={highest:async(t,e,{resolver:r,fetcher:o,resolveOptions:a,fetchOptions:n})=>{let u=new Map;for(let[p,h]of t.storedResolutions){let E=t.storedDescriptors.get(p);if(typeof E>\"u\")throw new Error(`Assertion failed: The descriptor (${p}) should have been registered`);He.getSetWithDefault(u,E.identHash).add(h)}let A=new Map(He.mapAndFilter(t.storedDescriptors.values(),p=>G.isVirtualDescriptor(p)?He.mapAndFilter.skip:[p.descriptorHash,He.makeDeferred()]));for(let p of t.storedDescriptors.values()){let h=A.get(p.descriptorHash);if(typeof h>\"u\")throw new Error(`Assertion failed: The descriptor (${p.descriptorHash}) should have been registered`);let E=t.storedResolutions.get(p.descriptorHash);if(typeof E>\"u\")throw new Error(`Assertion failed: The resolution (${p.descriptorHash}) should have been registered`);let I=t.originalPackages.get(E);if(typeof I>\"u\")throw new Error(`Assertion failed: The package (${E}) should have been registered`);Promise.resolve().then(async()=>{let v=r.getResolutionDependencies(p,a),x=Object.fromEntries(await He.allSettledSafe(Object.entries(v).map(async([te,ae])=>{let le=A.get(ae.descriptorHash);if(typeof le>\"u\")throw new Error(`Assertion failed: The descriptor (${ae.descriptorHash}) should have been registered`);let ce=await le.promise;if(!ce)throw new Error(\"Assertion failed: Expected the dependency to have been through the dedupe process itself\");return[te,ce.updatedPackage]})));if(e.length&&!$ge.default.isMatch(G.stringifyIdent(p),e)||!r.shouldPersistResolution(I,a))return I;let C=u.get(p.identHash);if(typeof C>\"u\")throw new Error(`Assertion failed: The resolutions (${p.identHash}) should have been registered`);if(C.size===1)return I;let R=[...C].map(te=>{let ae=t.originalPackages.get(te);if(typeof ae>\"u\")throw new Error(`Assertion failed: The package (${te}) should have been registered`);return ae}),L=await r.getSatisfying(p,x,R,a),U=L.locators?.[0];if(typeof U>\"u\"||!L.sorted)return I;let z=t.originalPackages.get(U.locatorHash);if(typeof z>\"u\")throw new Error(`Assertion failed: The package (${U.locatorHash}) should have been registered`);return z}).then(async v=>{let x=await t.preparePackage(v,{resolver:r,resolveOptions:a});h.resolve({descriptor:p,currentPackage:I,updatedPackage:v,resolvedPackage:x})}).catch(v=>{h.reject(v)})}return[...A.values()].map(p=>p.promise)}};async function x8(t,{strategy:e,patterns:r,cache:o,report:a}){let{configuration:n}=t,u=new ki,A=n.makeResolver(),p=n.makeFetcher(),h={cache:o,checksums:t.storedChecksums,fetcher:p,project:t,report:u,cacheOptions:{skipIntegrityCheck:!0}},E={project:t,resolver:A,report:u,fetchOptions:h};return await a.startTimerPromise(\"Deduplication step\",async()=>{let I=G0t[e],v=await I(t,r,{resolver:A,resolveOptions:E,fetcher:p,fetchOptions:h}),x=Zs.progressViaCounter(v.length);await a.reportProgress(x);let C=0;await Promise.all(v.map(U=>U.then(z=>{if(z===null||z.currentPackage.locatorHash===z.updatedPackage.locatorHash)return;C++;let{descriptor:te,currentPackage:ae,updatedPackage:le}=z;a.reportInfo(0,`${G.prettyDescriptor(n,te)} can be deduped from ${G.prettyLocator(n,ae)} to ${G.prettyLocator(n,le)}`),a.reportJson({descriptor:G.stringifyDescriptor(te),currentResolution:G.stringifyLocator(ae),updatedResolution:G.stringifyLocator(le)}),t.storedResolutions.set(te.descriptorHash,le.locatorHash)}).finally(()=>x.tick())));let R;switch(C){case 0:R=\"No packages\";break;case 1:R=\"One package\";break;default:R=`${C} packages`}let L=pe.pretty(n,e,pe.Type.CODE);return a.reportInfo(0,`${R} can be deduped using the ${L} strategy`),C})}var Zy=class extends ut{constructor(){super(...arguments);this.strategy=ge.String(\"-s,--strategy\",\"highest\",{description:\"The strategy to use when deduping dependencies\",validator:Js(t2)});this.check=ge.Boolean(\"-c,--check\",!1,{description:\"Exit with exit code 1 when duplicates are found, without persisting the dependency tree\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.mode=ge.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Js(hl)});this.patterns=ge.Rest()}static{this.paths=[[\"dedupe\"]]}static{this.usage=it.Usage({description:\"deduplicate dependencies with overlapping ranges\",details:\"\\n      Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\\n\\n      This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\\n\\n      - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\\n\\n      **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\\n\\n      If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n\\n      This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\\n\\n      ### In-depth explanation:\\n\\n      Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\\n\\n      **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\\n\\n      Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\\n\\n      **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\\n    \",examples:[[\"Dedupe all packages\",\"$0 dedupe\"],[\"Dedupe all packages using a specific strategy\",\"$0 dedupe --strategy highest\"],[\"Dedupe a specific package\",\"$0 dedupe lodash\"],[\"Dedupe all packages with the `@babel/*` scope\",\"$0 dedupe '@babel/*'\"],[\"Check for duplicates (can be used as a CI step)\",\"$0 dedupe --check\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await kt.find(r,this.context.cwd),a=await Gr.find(r);await o.restoreInstallState({restoreResolutions:!1});let n=0,u=await Rt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout,json:this.json},async A=>{n=await x8(o,{strategy:this.strategy,patterns:this.patterns,cache:a,report:A})});return u.hasErrors()?u.exitCode():this.check?n?1:0:await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:a,mode:this.mode})}};Ge();qt();var $y=class extends ut{static{this.paths=[[\"--clipanion=definitions\"]]}async execute(){let{plugins:e}=await Ke.find(this.context.cwd,this.context.plugins),r=[];for(let u of e){let{commands:A}=u[1];if(A){let h=Jo.from(A).definitions();r.push([u[0],h])}}let o=this.cli.definitions(),a=(u,A)=>u.split(\" \").slice(1).join()===A.split(\" \").slice(1).join(),n=ede()[\"@yarnpkg/builder\"].bundles.standard;for(let u of r){let A=u[1];for(let p of A)o.find(h=>a(h.path,p.path)).plugin={name:u[0],isDefault:n.includes(u[0])}}this.context.stdout.write(`${JSON.stringify(o,null,2)}\n`)}};var eE=class extends ut{static{this.paths=[[\"help\"],[\"--help\"],[\"-h\"]]}async execute(){this.context.stdout.write(this.cli.usage(null))}};Ge();Pt();qt();var tE=class extends ut{constructor(){super(...arguments);this.leadingArgument=ge.String();this.args=ge.Proxy()}async execute(){if(this.leadingArgument.match(/[\\\\/]/)&&!G.tryParseIdent(this.leadingArgument)){let r=V.resolve(this.context.cwd,ue.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:r})}else return await this.cli.run([\"run\",this.leadingArgument,...this.args])}};Ge();var rE=class extends ut{static{this.paths=[[\"-v\"],[\"--version\"]]}async execute(){this.context.stdout.write(`${nn||\"<unknown>\"}\n`)}};Ge();Ge();qt();var nE=class extends ut{constructor(){super(...arguments);this.commandName=ge.String();this.args=ge.Proxy()}static{this.paths=[[\"exec\"]]}static{this.usage=it.Usage({description:\"execute a shell script\",details:`\n      This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell.\n\n      It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment).\n    `,examples:[[\"Execute a single shell command\",\"$0 exec echo Hello World\"],[\"Execute a shell script\",'$0 exec \"tsc & babel src --out-dir lib\"']]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,locator:a}=await kt.find(r,this.context.cwd);return await o.restoreInstallState(),await An.executePackageShellcode(a,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:o})}};Ge();qt();el();var iE=class extends ut{constructor(){super(...arguments);this.hash=ge.String({required:!1,validator:YD(om(),[qw(/^p[0-9a-f]{5}$/)])})}static{this.paths=[[\"explain\",\"peer-requirements\"]]}static{this.usage=it.Usage({description:\"explain a set of peer requirements\",details:`\n      A peer requirement represents all peer requests that a subject must satisfy when providing a requested package to requesters.\n\n      When the hash argument is specified, this command prints a detailed explanation of the peer requirement corresponding to the hash and whether it is satisfied or not.\n\n      When used without arguments, this command lists all peer requirements and the corresponding hash that can be used to get detailed information about a given requirement.\n\n      **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\\`yarn explain peer-requirements\\`).\n    `,examples:[[\"Explain the corresponding peer requirement for a hash\",\"$0 explain peer-requirements p1a4ed\"],[\"List all peer requirements\",\"$0 explain peer-requirements\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await kt.find(r,this.context.cwd);return await o.restoreInstallState({restoreResolutions:!1}),await o.applyLightResolution(),typeof this.hash<\"u\"?await W0t(this.hash,o,{stdout:this.context.stdout}):await K0t(o,{stdout:this.context.stdout})}};async function W0t(t,e,r){let o=e.peerRequirementNodes.get(t);if(typeof o>\"u\")throw new Error(`No peerDependency requirements found for hash: \"${t}\"`);let a=new Set,n=p=>a.has(p.requester.locatorHash)?{value:pe.tuple(pe.Type.DEPENDENT,{locator:p.requester,descriptor:p.descriptor}),children:p.children.size>0?[{value:pe.tuple(pe.Type.NO_HINT,\"...\")}]:[]}:(a.add(p.requester.locatorHash),{value:pe.tuple(pe.Type.DEPENDENT,{locator:p.requester,descriptor:p.descriptor}),children:Object.fromEntries(Array.from(p.children.values(),h=>[G.stringifyLocator(h.requester),n(h)]))}),u=e.peerWarnings.find(p=>p.hash===t);return(await Rt.start({configuration:e.configuration,stdout:r.stdout,includeFooter:!1,includePrefix:!1},async p=>{let h=pe.mark(e.configuration),E=u?h.Cross:h.Check;if(p.reportInfo(0,`Package ${pe.pretty(e.configuration,o.subject,pe.Type.LOCATOR)} is requested to provide ${pe.pretty(e.configuration,o.ident,pe.Type.IDENT)} by its descendants`),p.reportSeparator(),p.reportInfo(0,pe.pretty(e.configuration,o.subject,pe.Type.LOCATOR)),fs.emitTree({children:Object.fromEntries(Array.from(o.requests.values(),I=>[G.stringifyLocator(I.requester),n(I)]))},{configuration:e.configuration,stdout:r.stdout,json:!1}),p.reportSeparator(),o.provided.range===\"missing:\"){let I=u?\"\":\" , but all peer requests are optional\";p.reportInfo(0,`${E} Package ${pe.pretty(e.configuration,o.subject,pe.Type.LOCATOR)} does not provide ${pe.pretty(e.configuration,o.ident,pe.Type.IDENT)}${I}.`)}else{let I=e.storedResolutions.get(o.provided.descriptorHash);if(!I)throw new Error(\"Assertion failed: Expected the descriptor to be registered\");let v=e.storedPackages.get(I);if(!v)throw new Error(\"Assertion failed: Expected the package to be registered\");p.reportInfo(0,`${E} Package ${pe.pretty(e.configuration,o.subject,pe.Type.LOCATOR)} provides ${pe.pretty(e.configuration,o.ident,pe.Type.IDENT)} with version ${G.prettyReference(e.configuration,v.version??\"0.0.0\")}, ${u?\"which does not satisfy all requests.\":\"which satisfies all requests\"}`),u?.type===3&&(u.range?p.reportInfo(0,`  The combined requested range is ${pe.pretty(e.configuration,u.range,pe.Type.RANGE)}`):p.reportInfo(0,\"  Unfortunately, the requested ranges have no overlap\"))}})).exitCode()}async function K0t(t,e){return(await Rt.start({configuration:t.configuration,stdout:e.stdout,includeFooter:!1,includePrefix:!1},async o=>{let a=pe.mark(t.configuration),n=He.sortMap(t.peerRequirementNodes,[([,u])=>G.stringifyLocator(u.subject),([,u])=>G.stringifyIdent(u.ident)]);for(let[,u]of n.values()){if(!u.root)continue;let A=t.peerWarnings.find(E=>E.hash===u.hash),p=[...G.allPeerRequests(u)],h;if(p.length>2?h=` and ${p.length-1} other dependencies`:p.length===2?h=\" and 1 other dependency\":h=\"\",u.provided.range!==\"missing:\"){let E=t.storedResolutions.get(u.provided.descriptorHash);if(!E)throw new Error(\"Assertion failed: Expected the resolution to have been registered\");let I=t.storedPackages.get(E);if(!I)throw new Error(\"Assertion failed: Expected the provided package to have been registered\");let v=`${pe.pretty(t.configuration,u.hash,pe.Type.CODE)} \\u2192 ${A?a.Cross:a.Check} ${G.prettyLocator(t.configuration,u.subject)} provides ${G.prettyLocator(t.configuration,I)} to ${G.prettyLocator(t.configuration,p[0].requester)}${h}`;A?o.reportWarning(0,v):o.reportInfo(0,v)}else{let E=`${pe.pretty(t.configuration,u.hash,pe.Type.CODE)} \\u2192 ${A?a.Cross:a.Check} ${G.prettyLocator(t.configuration,u.subject)} doesn't provide ${G.prettyIdent(t.configuration,u.ident)} to ${G.prettyLocator(t.configuration,p[0].requester)}${h}`;A?o.reportWarning(0,E):o.reportInfo(0,E)}}})).exitCode()}Ge();qt();el();Ge();Ge();Pt();qt();var tde=Ze(Jn()),sE=class extends ut{constructor(){super(...arguments);this.useYarnPath=ge.Boolean(\"--yarn-path\",{description:\"Set the yarnPath setting even if the version can be accessed by Corepack\"});this.onlyIfNeeded=ge.Boolean(\"--only-if-needed\",!1,{description:\"Only lock the Yarn version if it isn't already locked\"});this.version=ge.String()}static{this.paths=[[\"set\",\"version\"]]}static{this.usage=it.Usage({description:\"lock the Yarn version used by the project\",details:\"\\n      This command will set a specific release of Yarn to be used by Corepack: https://nodejs.org/api/corepack.html.\\n\\n      By default it only will set the `packageManager` field at the root of your project, but if the referenced release cannot be represented this way, if you already have `yarnPath` configured, or if you set the `--yarn-path` command line flag, then the release will also be downloaded from the Yarn GitHub repository, stored inside your project, and referenced via the `yarnPath` settings from your project `.yarnrc.yml` file.\\n\\n      A very good use case for this command is to enforce the version of Yarn used by any single member of your team inside the same project - by doing this you ensure that you have control over Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting different behavior.\\n\\n      The version specifier can be:\\n\\n      - a tag:\\n        - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\\n        - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\\n        - `classic` -> the most recent classic (`^0.x || ^1.x`) release\\n\\n      - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\\n\\n      - a semver version (e.g. `2.4.1`, `1.22.1`)\\n\\n      - a local file referenced through either a relative or absolute path\\n\\n      - `self` -> the version used to invoke the command\\n    \",examples:[[\"Download the latest release from the Yarn repository\",\"$0 set version latest\"],[\"Download the latest canary release from the Yarn repository\",\"$0 set version canary\"],[\"Download the latest classic release from the Yarn repository\",\"$0 set version classic\"],[\"Download the most recent Yarn 3 build\",\"$0 set version 3.x\"],[\"Download a specific Yarn 2 build\",\"$0 set version 2.0.0-rc.30\"],[\"Switch back to a specific Yarn 1 release\",\"$0 set version 1.22.1\"],[\"Use a release from the local filesystem\",\"$0 set version ./yarn.cjs\"],[\"Use a release from a URL\",\"$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js\"],[\"Download the version used to invoke the command\",\"$0 set version self\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins);if(this.onlyIfNeeded&&r.get(\"yarnPath\")){let A=r.sources.get(\"yarnPath\");if(!A)throw new Error(\"Assertion failed: Expected 'yarnPath' to have a source\");let p=r.projectCwd??r.startingCwd;if(V.contains(p,A))return 0}let o=()=>{if(typeof nn>\"u\")throw new st(\"The --install flag can only be used without explicit version specifier from the Yarn CLI\");return`file://${process.argv[1]}`},a,n=(A,p)=>({version:p,url:A.replace(/\\{\\}/g,p)});if(this.version===\"self\")a={url:o(),version:nn??\"self\"};else if(this.version===\"latest\"||this.version===\"berry\"||this.version===\"stable\")a=n(\"https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js\",await r2(r,\"stable\"));else if(this.version===\"canary\")a=n(\"https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js\",await r2(r,\"canary\"));else if(this.version===\"classic\")a={url:\"https://classic.yarnpkg.com/latest.js\",version:\"classic\"};else if(this.version.match(/^https?:/))a={url:this.version,version:\"remote\"};else if(this.version.match(/^\\.{0,2}[\\\\/]/)||ue.isAbsolute(this.version))a={url:`file://${V.resolve(ue.toPortablePath(this.version))}`,version:\"file\"};else if(Lr.satisfiesWithPrereleases(this.version,\">=2.0.0\"))a=n(\"https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js\",this.version);else if(Lr.satisfiesWithPrereleases(this.version,\"^0.x || ^1.x\"))a=n(\"https://github.com/yarnpkg/yarn/releases/download/v{}/yarn-{}.js\",this.version);else if(Lr.validRange(this.version))a=n(\"https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js\",await V0t(r,this.version));else throw new st(`Invalid version descriptor \"${this.version}\"`);return(await Rt.start({configuration:r,stdout:this.context.stdout,includeLogs:!this.context.quiet},async A=>{let p=async()=>{let h=\"file://\";return a.url.startsWith(h)?(A.reportInfo(0,`Retrieving ${pe.pretty(r,a.url,pe.Type.PATH)}`),await oe.readFilePromise(a.url.slice(h.length))):(A.reportInfo(0,`Downloading ${pe.pretty(r,a.url,pe.Type.URL)}`),await sn.get(a.url,{configuration:r}))};await k8(r,a.version,p,{report:A,useYarnPath:this.useYarnPath})})).exitCode()}};async function V0t(t,e){let o=(await sn.get(\"https://repo.yarnpkg.com/tags\",{configuration:t,jsonResponse:!0})).tags.filter(a=>Lr.satisfiesWithPrereleases(a,e));if(o.length===0)throw new st(`No matching release found for range ${pe.pretty(t,e,pe.Type.RANGE)}.`);return o[0]}async function r2(t,e){let r=await sn.get(\"https://repo.yarnpkg.com/tags\",{configuration:t,jsonResponse:!0});if(!r.latest[e])throw new st(`Tag ${pe.pretty(t,e,pe.Type.RANGE)} not found`);return r.latest[e]}async function k8(t,e,r,{report:o,useYarnPath:a}){let n,u=async()=>(typeof n>\"u\"&&(n=await r()),n);if(e===null){let te=await u();await oe.mktempPromise(async ae=>{let le=V.join(ae,\"yarn.cjs\");await oe.writeFilePromise(le,te);let{stdout:ce}=await Ur.execvp(process.execPath,[ue.fromPortablePath(le),\"--version\"],{cwd:ae,env:{...t.env,YARN_IGNORE_PATH:\"1\"}});if(e=ce.trim(),!tde.default.valid(e))throw new Error(`Invalid semver version. ${pe.pretty(t,\"yarn --version\",pe.Type.CODE)} returned:\n${e}`)})}let A=t.projectCwd??t.startingCwd,p=V.resolve(A,\".yarn/releases\"),h=V.resolve(p,`yarn-${e}.cjs`),E=V.relative(t.startingCwd,h),I=He.isTaggedYarnVersion(e),v=t.get(\"yarnPath\"),x=!I,C=x||!!v||!!a;if(a===!1){if(x)throw new Jt(0,\"You explicitly opted out of yarnPath usage in your command line, but the version you specified cannot be represented by Corepack\");C=!1}else!C&&!process.env.COREPACK_ROOT&&(o.reportWarning(0,`You don't seem to have ${pe.applyHyperlink(t,\"Corepack\",\"https://nodejs.org/api/corepack.html\")} enabled; we'll have to rely on ${pe.applyHyperlink(t,\"yarnPath\",\"https://yarnpkg.com/configuration/yarnrc#yarnPath\")} instead`),C=!0);if(C){let te=await u();o.reportInfo(0,`Saving the new release in ${pe.pretty(t,E,\"magenta\")}`),await oe.removePromise(V.dirname(h)),await oe.mkdirPromise(V.dirname(h),{recursive:!0}),await oe.writeFilePromise(h,te,{mode:493}),await Ke.updateConfiguration(A,{yarnPath:V.relative(A,h)})}else await oe.removePromise(V.dirname(h)),await Ke.updateConfiguration(A,{yarnPath:Ke.deleteProperty});let R=await Ut.tryFind(A)||new Ut;R.packageManager=`yarn@${I?e:await r2(t,\"stable\")}`;let L={};R.exportTo(L);let U=V.join(A,Ut.fileName),z=`${JSON.stringify(L,null,R.indent)}\n`;return await oe.changeFilePromise(U,z,{automaticNewlines:!0}),{bundleVersion:e}}function rde(t){return wr[ZD(t)]}var z0t=/## (?<code>YN[0-9]{4}) - `(?<name>[A-Z_]+)`\\n\\n(?<details>(?:.(?!##))+)/gs;async function J0t(t){let r=`https://repo.yarnpkg.com/${He.isTaggedYarnVersion(nn)?nn:await r2(t,\"canary\")}/packages/docusaurus/docs/advanced/01-general-reference/error-codes.mdx`,o=await sn.get(r,{configuration:t});return new Map(Array.from(o.toString().matchAll(z0t),({groups:a})=>{if(!a)throw new Error(\"Assertion failed: Expected the match to have been successful\");let n=rde(a.code);if(a.name!==n)throw new Error(`Assertion failed: Invalid error code data: Expected \"${a.name}\" to be named \"${n}\"`);return[a.code,a.details]}))}var oE=class extends ut{constructor(){super(...arguments);this.code=ge.String({required:!1,validator:jw(om(),[qw(/^YN[0-9]{4}$/)])});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"explain\"]]}static{this.usage=it.Usage({description:\"explain an error code\",details:`\n      When the code argument is specified, this command prints its name and its details.\n\n      When used without arguments, this command lists all error codes and their names.\n    `,examples:[[\"Explain an error code\",\"$0 explain YN0006\"],[\"List all error codes\",\"$0 explain\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins);if(typeof this.code<\"u\"){let o=rde(this.code),a=pe.pretty(r,o,pe.Type.CODE),n=this.cli.format().header(`${this.code} - ${a}`),A=(await J0t(r)).get(this.code),p=typeof A<\"u\"?pe.jsonOrPretty(this.json,r,pe.tuple(pe.Type.MARKDOWN,{text:A,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description.\n\nYou can help us by editing this page on GitHub \\u{1F642}:\n${pe.jsonOrPretty(this.json,r,pe.tuple(pe.Type.URL,\"https://github.com/yarnpkg/berry/blob/master/packages/docusaurus/docs/advanced/01-general-reference/error-codes.mdx\"))}\n`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:o,details:p})}\n`):this.context.stdout.write(`${n}\n\n${p}\n`)}else{let o={children:He.mapAndFilter(Object.entries(wr),([a,n])=>Number.isNaN(Number(a))?He.mapAndFilter.skip:{label:Ku(Number(a)),value:pe.tuple(pe.Type.CODE,n)})};fs.emitTree(o,{configuration:r,stdout:this.context.stdout,json:this.json})}}};Ge();Pt();qt();var nde=Ze($o()),aE=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Print versions of a package from the whole project\"});this.recursive=ge.Boolean(\"-R,--recursive\",!1,{description:\"Print information for all packages, including transitive dependencies\"});this.extra=ge.Array(\"-X,--extra\",[],{description:\"An array of requests of extra data provided by plugins\"});this.cache=ge.Boolean(\"--cache\",!1,{description:\"Print information about the cache entry of a package (path, size, checksum)\"});this.dependents=ge.Boolean(\"--dependents\",!1,{description:\"Print all dependents for each matching package\"});this.manifest=ge.Boolean(\"--manifest\",!1,{description:\"Print data obtained by looking at the package archive (license, homepage, ...)\"});this.nameOnly=ge.Boolean(\"--name-only\",!1,{description:\"Only print the name for the matching packages\"});this.virtuals=ge.Boolean(\"--virtuals\",!1,{description:\"Print each instance of the virtual packages\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.patterns=ge.Rest()}static{this.paths=[[\"info\"]]}static{this.usage=it.Usage({description:\"see information related to packages\",details:\"\\n      This command prints various information related to the specified packages, accepting glob patterns.\\n\\n      By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\\n\\n      Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\\n\\n      Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\\n    \",examples:[[\"Show information about Lodash\",\"$0 info lodash\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n=await Gr.find(r);if(!a&&!this.all)throw new sr(o.cwd,this.context.cwd);await o.restoreInstallState();let u=new Set(this.extra);this.cache&&u.add(\"cache\"),this.dependents&&u.add(\"dependents\"),this.manifest&&u.add(\"manifest\");let A=(ae,{recursive:le})=>{let ce=ae.anchoredLocator.locatorHash,Ce=new Map,de=[ce];for(;de.length>0;){let Be=de.shift();if(Ce.has(Be))continue;let Ee=o.storedPackages.get(Be);if(typeof Ee>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");if(Ce.set(Be,Ee),G.isVirtualLocator(Ee)&&de.push(G.devirtualizeLocator(Ee).locatorHash),!(!le&&Be!==ce))for(let g of Ee.dependencies.values()){let me=o.storedResolutions.get(g.descriptorHash);if(typeof me>\"u\")throw new Error(\"Assertion failed: Expected the resolution to be registered\");de.push(me)}}return Ce.values()},p=({recursive:ae})=>{let le=new Map;for(let ce of o.workspaces)for(let Ce of A(ce,{recursive:ae}))le.set(Ce.locatorHash,Ce);return le.values()},h=({all:ae,recursive:le})=>ae&&le?o.storedPackages.values():ae?p({recursive:le}):A(a,{recursive:le}),E=({all:ae,recursive:le})=>{let ce=h({all:ae,recursive:le}),Ce=this.patterns.map(Ee=>{let g=G.parseLocator(Ee),me=nde.default.makeRe(G.stringifyIdent(g)),we=G.isVirtualLocator(g),Ae=we?G.devirtualizeLocator(g):g;return ne=>{let Z=G.stringifyIdent(ne);if(!me.test(Z))return!1;if(g.reference===\"unknown\")return!0;let xe=G.isVirtualLocator(ne),Ne=xe?G.devirtualizeLocator(ne):ne;return!(we&&xe&&g.reference!==ne.reference||Ae.reference!==Ne.reference)}}),de=He.sortMap([...ce],Ee=>G.stringifyLocator(Ee));return{selection:de.filter(Ee=>Ce.length===0||Ce.some(g=>g(Ee))),sortedLookup:de}},{selection:I,sortedLookup:v}=E({all:this.all,recursive:this.recursive});if(I.length===0)throw new st(\"No package matched your request\");let x=new Map;if(this.dependents)for(let ae of v)for(let le of ae.dependencies.values()){let ce=o.storedResolutions.get(le.descriptorHash);if(typeof ce>\"u\")throw new Error(\"Assertion failed: Expected the resolution to be registered\");He.getArrayWithDefault(x,ce).push(ae)}let C=new Map;for(let ae of v){if(!G.isVirtualLocator(ae))continue;let le=G.devirtualizeLocator(ae);He.getArrayWithDefault(C,le.locatorHash).push(ae)}let R={},L={children:R},U=r.makeFetcher(),z={project:o,fetcher:U,cache:n,checksums:o.storedChecksums,report:new ki,cacheOptions:{skipIntegrityCheck:!0}},te=[async(ae,le,ce)=>{if(!le.has(\"manifest\"))return;let Ce=await U.fetch(ae,z),de;try{de=await Ut.find(Ce.prefixPath,{baseFs:Ce.packageFs})}finally{Ce.releaseFs?.()}ce(\"Manifest\",{License:pe.tuple(pe.Type.NO_HINT,de.license),Homepage:pe.tuple(pe.Type.URL,de.raw.homepage??null)})},async(ae,le,ce)=>{if(!le.has(\"cache\"))return;let Ce=o.storedChecksums.get(ae.locatorHash)??null,de=n.getLocatorPath(ae,Ce),Be;if(de!==null)try{Be=await oe.statPromise(de)}catch{}let Ee=typeof Be<\"u\"?[Be.size,pe.Type.SIZE]:void 0;ce(\"Cache\",{Checksum:pe.tuple(pe.Type.NO_HINT,Ce),Path:pe.tuple(pe.Type.PATH,de),Size:Ee})}];for(let ae of I){let le=G.isVirtualLocator(ae);if(!this.virtuals&&le)continue;let ce={},Ce={value:[ae,pe.Type.LOCATOR],children:ce};if(R[G.stringifyLocator(ae)]=Ce,this.nameOnly){delete Ce.children;continue}let de=C.get(ae.locatorHash);typeof de<\"u\"&&(ce.Instances={label:\"Instances\",value:pe.tuple(pe.Type.NUMBER,de.length)}),ce.Version={label:\"Version\",value:pe.tuple(pe.Type.NO_HINT,ae.version)};let Be=(g,me)=>{let we={};if(ce[g]=we,Array.isArray(me))we.children=me.map(Ae=>({value:Ae}));else{let Ae={};we.children=Ae;for(let[ne,Z]of Object.entries(me))typeof Z>\"u\"||(Ae[ne]={label:ne,value:Z})}};if(!le){for(let g of te)await g(ae,u,Be);await r.triggerHook(g=>g.fetchPackageInfo,ae,u,Be)}ae.bin.size>0&&!le&&Be(\"Exported Binaries\",[...ae.bin.keys()].map(g=>pe.tuple(pe.Type.PATH,g)));let Ee=x.get(ae.locatorHash);typeof Ee<\"u\"&&Ee.length>0&&Be(\"Dependents\",Ee.map(g=>pe.tuple(pe.Type.LOCATOR,g))),ae.dependencies.size>0&&!le&&Be(\"Dependencies\",[...ae.dependencies.values()].map(g=>{let me=o.storedResolutions.get(g.descriptorHash),we=typeof me<\"u\"?o.storedPackages.get(me)??null:null;return pe.tuple(pe.Type.RESOLUTION,{descriptor:g,locator:we})})),ae.peerDependencies.size>0&&le&&Be(\"Peer dependencies\",[...ae.peerDependencies.values()].map(g=>{let me=ae.dependencies.get(g.identHash),we=typeof me<\"u\"?o.storedResolutions.get(me.descriptorHash)??null:null,Ae=we!==null?o.storedPackages.get(we)??null:null;return pe.tuple(pe.Type.RESOLUTION,{descriptor:g,locator:Ae})}))}fs.emitTree(L,{configuration:r,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};Ge();Pt();Nl();var nk=Ze(X0());qt();var Q8=Ze(Jn());el();var X0t=[{selector:t=>t===-1,name:\"nodeLinker\",value:\"node-modules\"},{selector:t=>t!==-1&&t<8,name:\"enableGlobalCache\",value:!1},{selector:t=>t!==-1&&t<8,name:\"compressionLevel\",value:\"mixed\"}],lE=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.immutable=ge.Boolean(\"--immutable\",{description:\"Abort with an error exit code if the lockfile was to be modified\"});this.immutableCache=ge.Boolean(\"--immutable-cache\",{description:\"Abort with an error exit code if the cache folder was to be modified\"});this.refreshLockfile=ge.Boolean(\"--refresh-lockfile\",{description:\"Refresh the package metadata stored in the lockfile\"});this.checkCache=ge.Boolean(\"--check-cache\",{description:\"Always refetch the packages and ensure that their checksums are consistent\"});this.checkResolutions=ge.Boolean(\"--check-resolutions\",{description:\"Validates that the package resolutions are coherent\"});this.inlineBuilds=ge.Boolean(\"--inline-builds\",{description:\"Verbosely print the output of the build steps of dependencies\"});this.mode=ge.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Js(hl)});this.cacheFolder=ge.String(\"--cache-folder\",{hidden:!0});this.frozenLockfile=ge.Boolean(\"--frozen-lockfile\",{hidden:!0});this.ignoreEngines=ge.Boolean(\"--ignore-engines\",{hidden:!0});this.nonInteractive=ge.Boolean(\"--non-interactive\",{hidden:!0});this.preferOffline=ge.Boolean(\"--prefer-offline\",{hidden:!0});this.production=ge.Boolean(\"--production\",{hidden:!0});this.registry=ge.String(\"--registry\",{hidden:!0});this.silent=ge.Boolean(\"--silent\",{hidden:!0});this.networkTimeout=ge.String(\"--network-timeout\",{hidden:!0})}static{this.paths=[[\"install\"],it.Default]}static{this.usage=it.Usage({description:\"install the project dependencies\",details:\"\\n      This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics:\\n\\n      - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ).\\n\\n      - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of `cacheFolder` in `yarn config` to see where the cache files are stored).\\n\\n      - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the `.pnp.cjs` file you might know).\\n\\n      - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail.\\n\\n      Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your `.pnp.cjs` file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches.\\n\\n      If the `--immutable` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the `immutablePatterns` configuration setting). For backward compatibility we offer an alias under the name of `--frozen-lockfile`, but it will be removed in a later release.\\n\\n      If the `--immutable-cache` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed).\\n\\n      If the `--refresh-lockfile` option is set, Yarn will keep the same resolution for the packages currently in the lockfile but will refresh their metadata. If used together with `--immutable`, it can validate that the lockfile information are consistent. This flag is enabled by default when Yarn detects it runs within a pull request context.\\n\\n      If the `--check-cache` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them.\\n\\n      If the `--inline-builds` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments.\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n    \",examples:[[\"Install the project\",\"$0 install\"],[\"Validate a project when using Zero-Installs\",\"$0 install --immutable --immutable-cache\"],[\"Validate a project when using Zero-Installs (slightly safer if you accept external PRs)\",\"$0 install --immutable --immutable-cache --check-cache\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds<\"u\"&&r.useWithSource(\"<cli>\",{enableInlineBuilds:this.inlineBuilds},r.startingCwd,{overwrite:!0});let o=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,a=await uy({configuration:r,stdout:this.context.stdout},[{option:this.ignoreEngines,message:\"The --ignore-engines option is deprecated; engine checking isn't a core feature anymore\",error:!nk.default.VERCEL},{option:this.registry,message:\"The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file\"},{option:this.preferOffline,message:\"The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead\",error:!nk.default.VERCEL},{option:this.production,message:\"The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead\",error:!0},{option:this.nonInteractive,message:\"The --non-interactive option is deprecated\",error:!o},{option:this.frozenLockfile,message:\"The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead\",callback:()=>this.immutable=this.frozenLockfile},{option:this.cacheFolder,message:\"The cache-folder option has been deprecated; use rc settings instead\",error:!nk.default.NETLIFY}]);if(a!==null)return a;let n=this.mode===\"update-lockfile\";if(n&&(this.immutable||this.immutableCache))throw new st(`${pe.pretty(r,\"--immutable\",pe.Type.CODE)} and ${pe.pretty(r,\"--immutable-cache\",pe.Type.CODE)} cannot be used with ${pe.pretty(r,\"--mode=update-lockfile\",pe.Type.CODE)}`);let u=(this.immutable??r.get(\"enableImmutableInstalls\"))&&!n,A=this.immutableCache&&!n;if(r.projectCwd!==null){let R=await Rt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async L=>{let U=!1;await egt(r,u)&&(L.reportInfo(48,\"Automatically removed core plugins that are now builtins \\u{1F44D}\"),U=!0),await $0t(r,u)&&(L.reportInfo(48,\"Automatically fixed merge conflicts \\u{1F44D}\"),U=!0),U&&L.reportSeparator()});if(R.hasErrors())return R.exitCode()}if(r.projectCwd!==null){let R=await Rt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async L=>{if(Ke.telemetry?.isNew)Ke.telemetry.commitTips(),L.reportInfo(65,\"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry\"),L.reportInfo(65,`Run ${pe.pretty(r,\"yarn config set --home enableTelemetry 0\",pe.Type.CODE)} to disable`),L.reportSeparator();else if(Ke.telemetry?.shouldShowTips){let U=await sn.get(\"https://repo.yarnpkg.com/tags\",{configuration:r,jsonResponse:!0}).catch(()=>null);if(U!==null){let z=null;if(nn!==null){let ae=Q8.default.prerelease(nn)?\"canary\":\"stable\",le=U.latest[ae];Q8.default.gt(le,nn)&&(z=[ae,le])}if(z)Ke.telemetry.commitTips(),L.reportInfo(88,`${pe.applyStyle(r,`A new ${z[0]} version of Yarn is available:`,pe.Style.BOLD)} ${G.prettyReference(r,z[1])}!`),L.reportInfo(88,`Upgrade now by running ${pe.pretty(r,`yarn set version ${z[1]}`,pe.Type.CODE)}`),L.reportSeparator();else{let te=Ke.telemetry.selectTip(U.tips);te&&(L.reportInfo(89,pe.pretty(r,te.message,pe.Type.MARKDOWN_INLINE)),te.url&&L.reportInfo(89,`Learn more at ${te.url}`),L.reportSeparator())}}}});if(R.hasErrors())return R.exitCode()}let{project:p,workspace:h}=await kt.find(r,this.context.cwd),E=p.lockfileLastVersion;if(E!==null){let R=await Rt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async L=>{let U={};for(let z of X0t)z.selector(E)&&typeof r.sources.get(z.name)>\"u\"&&(r.use(\"<compat>\",{[z.name]:z.value},p.cwd,{overwrite:!0}),U[z.name]=z.value);Object.keys(U).length>0&&(await Ke.updateConfiguration(p.cwd,U),L.reportInfo(87,\"Migrated your project to the latest Yarn version \\u{1F680}\"),L.reportSeparator())});if(R.hasErrors())return R.exitCode()}let I=await Gr.find(r,{immutable:A,check:this.checkCache});if(!h)throw new sr(p.cwd,this.context.cwd);await p.restoreInstallState({restoreResolutions:!1});let v=r.get(\"enableHardenedMode\");v&&typeof r.sources.get(\"enableHardenedMode\")>\"u\"&&await Rt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async R=>{R.reportWarning(0,\"Yarn detected that the current workflow is executed from a public pull request. For safety the hardened mode has been enabled.\"),R.reportWarning(0,`It will prevent malicious lockfile manipulations, in exchange for a slower install time. You can opt-out if necessary; check our ${pe.applyHyperlink(r,\"documentation\",\"https://yarnpkg.com/features/security#hardened-mode\")} for more details.`),R.reportSeparator()}),(this.refreshLockfile??v)&&(p.lockfileNeedsRefresh=!0);let x=this.checkResolutions??v;return(await Rt.start({configuration:r,json:this.json,stdout:this.context.stdout,forceSectionAlignment:!0,includeLogs:!0,includeVersion:!0},async R=>{await p.install({cache:I,report:R,immutable:u,checkResolutions:x,mode:this.mode})})).exitCode()}},Z0t=\"<<<<<<<\";async function $0t(t,e){if(!t.projectCwd)return!1;let r=V.join(t.projectCwd,dr.lockfile);if(!await oe.existsPromise(r)||!(await oe.readFilePromise(r,\"utf8\")).includes(Z0t))return!1;if(e)throw new Jt(47,\"Cannot autofix a lockfile when running an immutable install\");let a=await Ur.execvp(\"git\",[\"rev-parse\",\"MERGE_HEAD\",\"HEAD\"],{cwd:t.projectCwd});if(a.code!==0&&(a=await Ur.execvp(\"git\",[\"rev-parse\",\"REBASE_HEAD\",\"HEAD\"],{cwd:t.projectCwd})),a.code!==0&&(a=await Ur.execvp(\"git\",[\"rev-parse\",\"CHERRY_PICK_HEAD\",\"HEAD\"],{cwd:t.projectCwd})),a.code!==0)throw new Jt(83,\"Git returned an error when trying to find the commits pertaining to the conflict\");let n=await Promise.all(a.stdout.trim().split(/\\n/).map(async A=>{let p=await Ur.execvp(\"git\",[\"show\",`${A}:./${dr.lockfile}`],{cwd:t.projectCwd});if(p.code!==0)throw new Jt(83,`Git returned an error when trying to access the lockfile content in ${A}`);try{return Ki(p.stdout)}catch{throw new Jt(46,\"A variant of the conflicting lockfile failed to parse\")}}));n=n.filter(A=>!!A.__metadata);for(let A of n){if(A.__metadata.version<7)for(let p of Object.keys(A)){if(p===\"__metadata\")continue;let h=G.parseDescriptor(p,!0),E=t.normalizeDependency(h),I=G.stringifyDescriptor(E);I!==p&&(A[I]=A[p],delete A[p])}for(let p of Object.keys(A)){if(p===\"__metadata\")continue;let h=A[p].checksum;typeof h==\"string\"&&h.includes(\"/\")||(A[p].checksum=`${A.__metadata.cacheKey}/${h}`)}}let u=Object.assign({},...n);u.__metadata.version=`${Math.min(...n.map(A=>parseInt(A.__metadata.version??0)))}`,u.__metadata.cacheKey=\"merged\";for(let[A,p]of Object.entries(u))typeof p==\"string\"&&delete u[A];return await oe.changeFilePromise(r,Da(u),{automaticNewlines:!0}),!0}async function egt(t,e){if(!t.projectCwd)return!1;let r=[],o=V.join(t.projectCwd,\".yarn/plugins/@yarnpkg\");return await Ke.updateConfiguration(t.projectCwd,{plugins:n=>{if(!Array.isArray(n))return n;let u=n.filter(A=>{if(!A.path)return!0;let p=V.resolve(t.projectCwd,A.path),h=l1.has(A.spec)&&V.contains(o,p);return h&&r.push(p),!h});return u.length===0?Ke.deleteProperty:u.length===n.length?n:u}},{immutable:e})?(await Promise.all(r.map(async n=>{await oe.removePromise(n)})),!0):!1}Ge();Pt();qt();var cE=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Link all workspaces belonging to the target projects to the current one\"});this.private=ge.Boolean(\"-p,--private\",!1,{description:\"Also link private workspaces belonging to the target projects to the current one\"});this.relative=ge.Boolean(\"-r,--relative\",!1,{description:\"Link workspaces using relative paths instead of absolute paths\"});this.destinations=ge.Rest()}static{this.paths=[[\"link\"]]}static{this.usage=it.Usage({description:\"connect the local project to another one\",details:\"\\n      This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\\n    \",examples:[[\"Register one or more remote workspaces for use in the current project\",\"$0 link ~/ts-loader ~/jest\"],[\"Register all workspaces from a remote project for use in the current project\",\"$0 link ~/jest --all\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n=await Gr.find(r);if(!a)throw new sr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=o.topLevelWorkspace,A=[];for(let p of this.destinations){let h=V.resolve(this.context.cwd,ue.toPortablePath(p)),E=await Ke.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:I,workspace:v}=await kt.find(E,h);if(o.cwd===I.cwd)throw new st(`Invalid destination '${p}'; Can't link the project to itself`);if(!v)throw new sr(I.cwd,h);if(this.all){let x=!1;for(let C of I.workspaces)C.manifest.name&&(!C.manifest.private||this.private)&&(A.push(C),x=!0);if(!x)throw new st(`No workspace found to be linked in the target project: ${p}`)}else{if(!v.manifest.name)throw new st(`The target workspace at '${p}' doesn't have a name and thus cannot be linked`);if(v.manifest.private&&!this.private)throw new st(`The target workspace at '${p}' is marked private - use the --private flag to link it anyway`);A.push(v)}}for(let p of A){let h=G.stringifyIdent(p.anchoredLocator),E=this.relative?V.relative(o.cwd,p.cwd):p.cwd;u.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${E}`})}return await o.installWithNewReport({stdout:this.context.stdout},{cache:n})}};qt();var uE=class extends ut{constructor(){super(...arguments);this.args=ge.Proxy()}static{this.paths=[[\"node\"]]}static{this.usage=it.Usage({description:\"run node with the hook already setup\",details:`\n      This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment).\n\n      The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version.\n    `,examples:[[\"Run a Node script\",\"$0 node ./my-script.js\"]]})}async execute(){return this.cli.run([\"exec\",\"node\",...this.args])}};Ge();qt();var AE=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"plugin\",\"check\"]]}static{this.usage=it.Usage({category:\"Plugin-related commands\",description:\"find all third-party plugins that differ from their own spec\",details:`\n      Check only the plugins from https.\n\n      If this command detects any plugin differences in the CI environment, it will throw an error.\n    `,examples:[[\"find all third-party plugins that differ from their own spec\",\"$0 plugin check\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=await Ke.findRcFiles(this.context.cwd);return(await Rt.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{for(let u of o)if(u.data?.plugins)for(let A of u.data.plugins){if(!A.checksum||!A.spec.match(/^https?:/))continue;let p=await sn.get(A.spec,{configuration:r}),h=wn.makeHash(p);if(A.checksum===h)continue;let E=pe.pretty(r,A.path,pe.Type.PATH),I=pe.pretty(r,A.spec,pe.Type.URL),v=`${E} is different from the file provided by ${I}`;n.reportJson({...A,newChecksum:h}),n.reportError(0,v)}})).exitCode()}};Ge();Ge();Pt();qt();var lde=ve(\"os\");Ge();Pt();qt();var ide=ve(\"os\");Ge();Nl();qt();var tgt=\"https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml\";async function Hg(t,e){let r=await sn.get(tgt,{configuration:t}),o=Ki(r.toString());return Object.fromEntries(Object.entries(o).filter(([a,n])=>!e||Lr.satisfiesWithPrereleases(e,n.range??\"<4.0.0-rc.1\")))}var fE=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"plugin\",\"list\"]]}static{this.usage=it.Usage({category:\"Plugin-related commands\",description:\"list the available official plugins\",details:\"\\n      This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\\n    \",examples:[[\"List the official plugins\",\"$0 plugin list\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins);return(await Rt.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{let n=await Hg(r,nn);for(let[u,{experimental:A,...p}]of Object.entries(n)){let h=u;A&&(h+=\" [experimental]\"),a.reportJson({name:u,experimental:A,...p}),a.reportInfo(null,h)}})).exitCode()}};var rgt=/^[0-9]+$/,ngt=process.platform===\"win32\";function sde(t){return rgt.test(t)?`pull/${t}/head`:t}var igt=({repository:t,branch:e},r)=>[[\"git\",\"init\",ue.fromPortablePath(r)],[\"git\",\"remote\",\"add\",\"origin\",t],[\"git\",\"fetch\",\"origin\",\"--depth=1\",sde(e)],[\"git\",\"reset\",\"--hard\",\"FETCH_HEAD\"]],sgt=({branch:t})=>[[\"git\",\"fetch\",\"origin\",\"--depth=1\",sde(t),\"--force\"],[\"git\",\"reset\",\"--hard\",\"FETCH_HEAD\"],[\"git\",\"clean\",\"-dfx\",\"-e\",\"packages/yarnpkg-cli/bundles\"]],ogt=({plugins:t,noMinify:e},r,o)=>[[\"yarn\",\"build:cli\",...new Array().concat(...t.map(a=>[\"--plugin\",V.resolve(o,a)])),...e?[\"--no-minify\"]:[],\"|\"],[ngt?\"move\":\"mv\",\"packages/yarnpkg-cli/bundles/yarn.js\",ue.fromPortablePath(r),\"|\"]],pE=class extends ut{constructor(){super(...arguments);this.installPath=ge.String(\"--path\",{description:\"The path where the repository should be cloned to\"});this.repository=ge.String(\"--repository\",\"https://github.com/yarnpkg/berry.git\",{description:\"The repository that should be cloned\"});this.branch=ge.String(\"--branch\",\"master\",{description:\"The branch of the repository that should be cloned\"});this.plugins=ge.Array(\"--plugin\",[],{description:\"An array of additional plugins that should be included in the bundle\"});this.dryRun=ge.Boolean(\"-n,--dry-run\",!1,{description:\"If set, the bundle will be built but not added to the project\"});this.noMinify=ge.Boolean(\"--no-minify\",!1,{description:\"Build a bundle for development (debugging) - non-minified and non-mangled\"});this.force=ge.Boolean(\"-f,--force\",!1,{description:\"Always clone the repository instead of trying to fetch the latest commits\"});this.skipPlugins=ge.Boolean(\"--skip-plugins\",!1,{description:\"Skip updating the contrib plugins\"})}static{this.paths=[[\"set\",\"version\",\"from\",\"sources\"]]}static{this.usage=it.Usage({description:\"build Yarn from master\",details:`\n      This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project.\n\n      By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \\`--skip-plugins\\` flag.\n    `,examples:[[\"Build Yarn from master\",\"$0 set version from sources\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await kt.find(r,this.context.cwd),a=typeof this.installPath<\"u\"?V.resolve(this.context.cwd,ue.toPortablePath(this.installPath)):V.resolve(ue.toPortablePath((0,ide.tmpdir)()),\"yarnpkg-sources\",wn.makeHash(this.repository).slice(0,6));return(await Rt.start({configuration:r,stdout:this.context.stdout},async u=>{await F8(this,{configuration:r,report:u,target:a}),u.reportSeparator(),u.reportInfo(0,\"Building a fresh bundle\"),u.reportSeparator();let A=await Ur.execvp(\"git\",[\"rev-parse\",\"--short\",\"HEAD\"],{cwd:a,strict:!0}),p=V.join(a,`packages/yarnpkg-cli/bundles/yarn-${A.stdout.trim()}.js`);oe.existsSync(p)||(await n2(ogt(this,p,a),{configuration:r,context:this.context,target:a}),u.reportSeparator());let h=await oe.readFilePromise(p);if(!this.dryRun){let{bundleVersion:E}=await k8(r,null,async()=>h,{report:u});this.skipPlugins||await agt(this,E,{project:o,report:u,target:a})}})).exitCode()}};async function n2(t,{configuration:e,context:r,target:o}){for(let[a,...n]of t){let u=n[n.length-1]===\"|\";if(u&&n.pop(),u)await Ur.pipevp(a,n,{cwd:o,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${pe.pretty(e,`  $ ${[a,...n].join(\" \")}`,\"grey\")}\n`);try{await Ur.execvp(a,n,{cwd:o,strict:!0})}catch(A){throw r.stdout.write(A.stdout||A.stack),A}}}}async function F8(t,{configuration:e,report:r,target:o}){let a=!1;if(!t.force&&oe.existsSync(V.join(o,\".git\"))){r.reportInfo(0,\"Fetching the latest commits\"),r.reportSeparator();try{await n2(sgt(t),{configuration:e,context:t.context,target:o}),a=!0}catch{r.reportSeparator(),r.reportWarning(0,\"Repository update failed; we'll try to regenerate it\")}}a||(r.reportInfo(0,\"Cloning the remote repository\"),r.reportSeparator(),await oe.removePromise(o),await oe.mkdirPromise(o,{recursive:!0}),await n2(igt(t,o),{configuration:e,context:t.context,target:o}))}async function agt(t,e,{project:r,report:o,target:a}){let n=await Hg(r.configuration,e),u=new Set(Object.keys(n));for(let A of r.configuration.plugins.keys())u.has(A)&&await R8(A,t,{project:r,report:o,target:a})}Ge();Ge();Pt();qt();var ode=Ze(Jn()),ade=ve(\"vm\");var hE=class extends ut{constructor(){super(...arguments);this.name=ge.String();this.checksum=ge.Boolean(\"--checksum\",!0,{description:\"Whether to care if this plugin is modified\"})}static{this.paths=[[\"plugin\",\"import\"]]}static{this.usage=it.Usage({category:\"Plugin-related commands\",description:\"download a plugin\",details:`\n      This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations.\n\n      Three types of plugin references are accepted:\n\n      - If the plugin is stored within the Yarn repository, it can be referenced by name.\n      - Third-party plugins can be referenced directly through their public urls.\n      - Local plugins can be referenced by their path on the disk.\n\n      If the \\`--no-checksum\\` option is set, Yarn will no longer care if the plugin is modified.\n\n      Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \\`@yarnpkg/builder\\` package).\n    `,examples:[['Download and activate the \"@yarnpkg/plugin-exec\" plugin',\"$0 plugin import @yarnpkg/plugin-exec\"],['Download and activate the \"@yarnpkg/plugin-exec\" plugin (shorthand)',\"$0 plugin import exec\"],[\"Download and activate a community plugin\",\"$0 plugin import https://example.org/path/to/plugin.js\"],[\"Activate a local plugin\",\"$0 plugin import ./path/to/plugin.js\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins);return(await Rt.start({configuration:r,stdout:this.context.stdout},async a=>{let{project:n}=await kt.find(r,this.context.cwd),u,A;if(this.name.match(/^\\.{0,2}[\\\\/]/)||ue.isAbsolute(this.name)){let p=V.resolve(this.context.cwd,ue.toPortablePath(this.name));a.reportInfo(0,`Reading ${pe.pretty(r,p,pe.Type.PATH)}`),u=V.relative(n.cwd,p),A=await oe.readFilePromise(p)}else{let p;if(this.name.match(/^https?:/)){try{new URL(this.name)}catch{throw new Jt(52,`Plugin specifier \"${this.name}\" is neither a plugin name nor a valid url`)}u=this.name,p=this.name}else{let h=G.parseLocator(this.name.replace(/^((@yarnpkg\\/)?plugin-)?/,\"@yarnpkg/plugin-\"));if(h.reference!==\"unknown\"&&!ode.default.valid(h.reference))throw new Jt(0,\"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.\");let E=G.stringifyIdent(h),I=await Hg(r,nn);if(!Object.hasOwn(I,E)){let v=`Couldn't find a plugin named ${G.prettyIdent(r,h)} on the remote registry.\n`;throw r.plugins.has(E)?v+=`A plugin named ${G.prettyIdent(r,h)} is already installed; possibly attempting to import a built-in plugin.`:v+=`Note that only the plugins referenced on our website (${pe.pretty(r,\"https://github.com/yarnpkg/berry/blob/master/plugins.yml\",pe.Type.URL)}) can be referenced by their name; any other plugin will have to be referenced through its public url (for example ${pe.pretty(r,\"https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js\",pe.Type.URL)}).`,new Jt(51,v)}u=E,p=I[E].url,h.reference!==\"unknown\"?p=p.replace(/\\/master\\//,`/${E}/${h.reference}/`):nn!==null&&(p=p.replace(/\\/master\\//,`/@yarnpkg/cli/${nn}/`))}a.reportInfo(0,`Downloading ${pe.pretty(r,p,\"green\")}`),A=await sn.get(p,{configuration:r})}await T8(u,A,{checksum:this.checksum,project:n,report:a})})).exitCode()}};async function T8(t,e,{checksum:r=!0,project:o,report:a}){let{configuration:n}=o,u={},A={exports:u};(0,ade.runInNewContext)(e.toString(),{module:A,exports:u});let h=`.yarn/plugins/${A.exports.name}.cjs`,E=V.resolve(o.cwd,h);a.reportInfo(0,`Saving the new plugin in ${pe.pretty(n,h,\"magenta\")}`),await oe.mkdirPromise(V.dirname(E),{recursive:!0}),await oe.writeFilePromise(E,e);let I={path:h,spec:t};r&&(I.checksum=wn.makeHash(e)),await Ke.addPlugin(o.cwd,[I])}var lgt=({pluginName:t,noMinify:e},r)=>[[\"yarn\",`build:${t}`,...e?[\"--no-minify\"]:[],\"|\"]],gE=class extends ut{constructor(){super(...arguments);this.installPath=ge.String(\"--path\",{description:\"The path where the repository should be cloned to\"});this.repository=ge.String(\"--repository\",\"https://github.com/yarnpkg/berry.git\",{description:\"The repository that should be cloned\"});this.branch=ge.String(\"--branch\",\"master\",{description:\"The branch of the repository that should be cloned\"});this.noMinify=ge.Boolean(\"--no-minify\",!1,{description:\"Build a plugin for development (debugging) - non-minified and non-mangled\"});this.force=ge.Boolean(\"-f,--force\",!1,{description:\"Always clone the repository instead of trying to fetch the latest commits\"});this.name=ge.String()}static{this.paths=[[\"plugin\",\"import\",\"from\",\"sources\"]]}static{this.usage=it.Usage({category:\"Plugin-related commands\",description:\"build a plugin from sources\",details:`\n      This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations.\n\n      The plugins can be referenced by their short name if sourced from the official Yarn repository.\n    `,examples:[['Build and activate the \"@yarnpkg/plugin-exec\" plugin',\"$0 plugin import from sources @yarnpkg/plugin-exec\"],['Build and activate the \"@yarnpkg/plugin-exec\" plugin (shorthand)',\"$0 plugin import from sources exec\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=typeof this.installPath<\"u\"?V.resolve(this.context.cwd,ue.toPortablePath(this.installPath)):V.resolve(ue.toPortablePath((0,lde.tmpdir)()),\"yarnpkg-sources\",wn.makeHash(this.repository).slice(0,6));return(await Rt.start({configuration:r,stdout:this.context.stdout},async n=>{let{project:u}=await kt.find(r,this.context.cwd),A=G.parseIdent(this.name.replace(/^((@yarnpkg\\/)?plugin-)?/,\"@yarnpkg/plugin-\")),p=G.stringifyIdent(A),h=await Hg(r,nn);if(!Object.hasOwn(h,p))throw new Jt(51,`Couldn't find a plugin named \"${p}\" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let E=p;await F8(this,{configuration:r,report:n,target:o}),await R8(E,this,{project:u,report:n,target:o})})).exitCode()}};async function R8(t,{context:e,noMinify:r},{project:o,report:a,target:n}){let u=t.replace(/@yarnpkg\\//,\"\"),{configuration:A}=o;a.reportSeparator(),a.reportInfo(0,`Building a fresh ${u}`),a.reportSeparator(),await n2(lgt({pluginName:u,noMinify:r},n),{configuration:A,context:e,target:n}),a.reportSeparator();let p=V.resolve(n,`packages/${u}/bundles/${t}.js`),h=await oe.readFilePromise(p);await T8(t,h,{project:o,report:a})}Ge();Pt();qt();var dE=class extends ut{constructor(){super(...arguments);this.name=ge.String()}static{this.paths=[[\"plugin\",\"remove\"]]}static{this.usage=it.Usage({category:\"Plugin-related commands\",description:\"remove a plugin\",details:`\n      This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration.\n\n      **Note:** The plugins have to be referenced by their name property, which can be obtained using the \\`yarn plugin runtime\\` command. Shorthands are not allowed.\n   `,examples:[[\"Remove a plugin imported from the Yarn repository\",\"$0 plugin remove @yarnpkg/plugin-typescript\"],[\"Remove a plugin imported from a local file\",\"$0 plugin remove my-local-plugin\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await kt.find(r,this.context.cwd);return(await Rt.start({configuration:r,stdout:this.context.stdout},async n=>{let u=this.name,A=G.parseIdent(u);if(!r.plugins.has(u))throw new st(`${G.prettyIdent(r,A)} isn't referenced by the current configuration`);let p=`.yarn/plugins/${u}.cjs`,h=V.resolve(o.cwd,p);oe.existsSync(h)&&(n.reportInfo(0,`Removing ${pe.pretty(r,p,pe.Type.PATH)}...`),await oe.removePromise(h)),n.reportInfo(0,\"Updating the configuration...\"),await Ke.updateConfiguration(o.cwd,{plugins:E=>{if(!Array.isArray(E))return E;let I=E.filter(v=>v.path!==p);return I.length===0?Ke.deleteProperty:I.length===E.length?E:I}})})).exitCode()}};Ge();qt();var mE=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"plugin\",\"runtime\"]]}static{this.usage=it.Usage({category:\"Plugin-related commands\",description:\"list the active plugins\",details:`\n      This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins.\n    `,examples:[[\"List the currently active plugins\",\"$0 plugin runtime\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins);return(await Rt.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{for(let n of r.plugins.keys()){let u=this.context.plugins.plugins.has(n),A=n;u&&(A+=\" [builtin]\"),a.reportJson({name:n,builtin:u}),a.reportInfo(null,`${A}`)}})).exitCode()}};Ge();Ge();qt();var yE=class extends ut{constructor(){super(...arguments);this.idents=ge.Rest()}static{this.paths=[[\"rebuild\"]]}static{this.usage=it.Usage({description:\"rebuild the project's native packages\",details:`\n      This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again.\n\n      Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future).\n\n      By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory.\n    `,examples:[[\"Rebuild all packages\",\"$0 rebuild\"],[\"Rebuild fsevents only\",\"$0 rebuild fsevents\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n=await Gr.find(r);if(!a)throw new sr(o.cwd,this.context.cwd);let u=new Set;for(let A of this.idents)u.add(G.parseIdent(A).identHash);if(await o.restoreInstallState({restoreResolutions:!1}),await o.resolveEverything({cache:n,report:new ki}),u.size>0)for(let A of o.storedPackages.values())u.has(A.identHash)&&(o.storedBuildState.delete(A.locatorHash),o.skippedBuilds.delete(A.locatorHash));else o.storedBuildState.clear(),o.skippedBuilds.clear();return await o.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};Ge();Ge();Ge();qt();var N8=Ze($o());el();var EE=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Apply the operation to all workspaces from the current project\"});this.mode=ge.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Js(hl)});this.patterns=ge.Rest()}static{this.paths=[[\"remove\"]]}static{this.usage=it.Usage({description:\"remove dependencies from the project\",details:`\n      This command will remove the packages matching the specified patterns from the current workspace.\n\n      If the \\`--mode=<mode>\\` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n      - \\`skip-build\\` will not run the build scripts at all. Note that this is different from setting \\`enableScripts\\` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n      - \\`update-lockfile\\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n      This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n    `,examples:[[\"Remove a dependency from the current project\",\"$0 remove lodash\"],[\"Remove a dependency from all workspaces at once\",\"$0 remove lodash --all\"],[\"Remove all dependencies starting with `eslint-`\",\"$0 remove 'eslint-*'\"],[\"Remove all dependencies with the `@babel` scope\",\"$0 remove '@babel/*'\"],[\"Remove all dependencies matching `react-dom` or `react-helmet`\",\"$0 remove 'react-{dom,helmet}'\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n=await Gr.find(r);if(!a)throw new sr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.all?o.workspaces:[a],A=[\"dependencies\",\"devDependencies\",\"peerDependencies\"],p=[],h=!1,E=[];for(let C of this.patterns){let R=!1,L=G.parseIdent(C);for(let U of u){let z=[...U.manifest.peerDependenciesMeta.keys()];for(let te of(0,N8.default)(z,C))U.manifest.peerDependenciesMeta.delete(te),h=!0,R=!0;for(let te of A){let ae=U.manifest.getForScope(te),le=[...ae.values()].map(ce=>G.stringifyIdent(ce));for(let ce of(0,N8.default)(le,G.stringifyIdent(L))){let{identHash:Ce}=G.parseIdent(ce),de=ae.get(Ce);if(typeof de>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");U.manifest[te].delete(Ce),E.push([U,te,de]),h=!0,R=!0}}}R||p.push(C)}let I=p.length>1?\"Patterns\":\"Pattern\",v=p.length>1?\"don't\":\"doesn't\",x=this.all?\"any\":\"this\";if(p.length>0)throw new st(`${I} ${pe.prettyList(r,p,pe.Type.CODE)} ${v} match any packages referenced by ${x} workspace`);return h?(await r.triggerMultipleHooks(C=>C.afterWorkspaceDependencyRemoval,E),await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})):0}};Ge();Ge();qt();var cde=ve(\"util\"),CE=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"run\"]]}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd);if(!a)throw new sr(o.cwd,this.context.cwd);return(await Rt.start({configuration:r,stdout:this.context.stdout,json:this.json},async u=>{let A=a.manifest.scripts,p=He.sortMap(A.keys(),I=>I),h={breakLength:1/0,colors:r.get(\"enableColors\"),maxArrayLength:2},E=p.reduce((I,v)=>Math.max(I,v.length),0);for(let[I,v]of A.entries())u.reportInfo(null,`${I.padEnd(E,\" \")}   ${(0,cde.inspect)(v,h)}`),u.reportJson({name:I,script:v})})).exitCode()}};Ge();Ge();qt();var wE=class extends ut{constructor(){super(...arguments);this.inspect=ge.String(\"--inspect\",!1,{tolerateBoolean:!0,description:\"Forwarded to the underlying Node process when executing a binary\"});this.inspectBrk=ge.String(\"--inspect-brk\",!1,{tolerateBoolean:!0,description:\"Forwarded to the underlying Node process when executing a binary\"});this.topLevel=ge.Boolean(\"-T,--top-level\",!1,{description:\"Check the root workspace for scripts and/or binaries instead of the current one\"});this.binariesOnly=ge.Boolean(\"-B,--binaries-only\",!1,{description:\"Ignore any user defined scripts and only check for binaries\"});this.require=ge.String(\"--require\",{description:\"Forwarded to the underlying Node process when executing a binary\"});this.silent=ge.Boolean(\"--silent\",{hidden:!0});this.scriptName=ge.String();this.args=ge.Proxy()}static{this.paths=[[\"run\"]]}static{this.usage=it.Usage({description:\"run a script defined in the package.json\",details:`\n      This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace:\n\n      - If the \\`scripts\\` field from your local package.json contains a matching script name, its definition will get executed.\n\n      - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed.\n\n      - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed.\n\n      Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax).\n    `,examples:[[\"Run the tests from the local workspace\",\"$0 run test\"],['Same thing, but without the \"run\" keyword',\"$0 test\"],[\"Inspect Webpack while running\",\"$0 run --inspect-brk webpack\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a,locator:n}=await kt.find(r,this.context.cwd);await o.restoreInstallState();let u=this.topLevel?o.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await An.hasPackageScript(u,this.scriptName,{project:o}))return await An.executePackageScript(u,this.scriptName,this.args,{project:o,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let A=await An.getPackageAccessibleBinaries(u,{project:o});if(A.get(this.scriptName)){let h=[];return this.inspect&&(typeof this.inspect==\"string\"?h.push(`--inspect=${this.inspect}`):h.push(\"--inspect\")),this.inspectBrk&&(typeof this.inspectBrk==\"string\"?h.push(`--inspect-brk=${this.inspectBrk}`):h.push(\"--inspect-brk\")),this.require&&h.push(`--require=${this.require}`),await An.executePackageAccessibleBinary(u,this.scriptName,this.args,{cwd:this.context.cwd,project:o,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:h,packageAccessibleBinaries:A})}if(!this.topLevel&&!this.binariesOnly&&a&&this.scriptName.includes(\":\")){let E=(await Promise.all(o.workspaces.map(async I=>I.manifest.scripts.has(this.scriptName)?I:null))).filter(I=>I!==null);if(E.length===1)return await An.executeWorkspaceScript(E[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName===\"node-gyp\"?new st(`Couldn't find a script name \"${this.scriptName}\" in the top-level (used by ${G.prettyLocator(r,n)}). This typically happens because some package depends on \"node-gyp\" to build itself, but didn't list it in their dependencies. To fix that, please run \"yarn add node-gyp\" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new st(`Couldn't find a script name \"${this.scriptName}\" in the top-level (used by ${G.prettyLocator(r,n)}).`);{if(this.scriptName===\"global\")throw new st(\"The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead\");let h=[this.scriptName].concat(this.args);for(let[E,I]of Uy)for(let v of I)if(h.length>=v.length&&JSON.stringify(h.slice(0,v.length))===JSON.stringify(v))throw new st(`Couldn't find a script named \"${this.scriptName}\", but a matching command can be found in the ${E} plugin. You can install it with \"yarn plugin import ${E}\".`);throw new st(`Couldn't find a script named \"${this.scriptName}\".`)}}};Ge();Ge();qt();var IE=class extends ut{constructor(){super(...arguments);this.descriptor=ge.String();this.resolution=ge.String()}static{this.paths=[[\"set\",\"resolution\"]]}static{this.usage=it.Usage({description:\"enforce a package resolution\",details:'\\n      This command updates the resolution table so that `descriptor` is resolved by `resolution`.\\n\\n      Note that by default this command only affect the current resolution table - meaning that this \"manual override\" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, edit the `resolutions` field in your top-level manifest.\\n\\n      Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\\n    ',examples:[[\"Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0\",\"$0 set resolution lodash@npm:^1.2.3 1.5.0\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n=await Gr.find(r);if(await o.restoreInstallState({restoreResolutions:!1}),!a)throw new sr(o.cwd,this.context.cwd);let u=G.parseDescriptor(this.descriptor,!0),A=G.makeDescriptor(u,this.resolution);return o.storedDescriptors.set(u.descriptorHash,u),o.storedDescriptors.set(A.descriptorHash,A),o.resolutionAliases.set(u.descriptorHash,A.descriptorHash),await o.installWithNewReport({stdout:this.context.stdout},{cache:n})}};Ge();Pt();qt();var ude=Ze($o()),BE=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Unlink all workspaces belonging to the target project from the current one\"});this.leadingArguments=ge.Rest()}static{this.paths=[[\"unlink\"]]}static{this.usage=it.Usage({description:\"disconnect the local project from another one\",details:`\n      This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments.\n    `,examples:[[\"Unregister a remote workspace in the current project\",\"$0 unlink ~/ts-loader\"],[\"Unregister all workspaces from a remote project in the current project\",\"$0 unlink ~/jest --all\"],[\"Unregister all previously linked workspaces\",\"$0 unlink --all\"],[\"Unregister all workspaces matching a glob\",\"$0 unlink '@babel/*' 'pkg-{a,b}'\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n=await Gr.find(r);if(!a)throw new sr(o.cwd,this.context.cwd);let u=o.topLevelWorkspace,A=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:p,reference:h}of u.manifest.resolutions)h.startsWith(\"portal:\")&&A.add(p.descriptor.fullName);if(this.leadingArguments.length>0)for(let p of this.leadingArguments){let h=V.resolve(this.context.cwd,ue.toPortablePath(p));if(He.isPathLike(p)){let E=await Ke.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:I,workspace:v}=await kt.find(E,h);if(!v)throw new sr(I.cwd,h);if(this.all){for(let x of I.workspaces)x.manifest.name&&A.add(G.stringifyIdent(x.anchoredLocator));if(A.size===0)throw new st(\"No workspace found to be unlinked in the target project\")}else{if(!v.manifest.name)throw new st(\"The target workspace doesn't have a name and thus cannot be unlinked\");A.add(G.stringifyIdent(v.anchoredLocator))}}else{let E=[...u.manifest.resolutions.map(({pattern:I})=>I.descriptor.fullName)];for(let I of(0,ude.default)(E,p))A.add(I)}}return u.manifest.resolutions=u.manifest.resolutions.filter(({pattern:p})=>!A.has(p.descriptor.fullName)),await o.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};Ge();Ge();Ge();qt();var Ade=Ze(J1()),L8=Ze($o());el();var vE=class extends ut{constructor(){super(...arguments);this.interactive=ge.Boolean(\"-i,--interactive\",{description:\"Offer various choices, depending on the detected upgrade paths\"});this.fixed=ge.Boolean(\"-F,--fixed\",!1,{description:\"Store dependency tags as-is instead of resolving them\"});this.exact=ge.Boolean(\"-E,--exact\",!1,{description:\"Don't use any semver modifier on the resolved range\"});this.tilde=ge.Boolean(\"-T,--tilde\",!1,{description:\"Use the `~` semver modifier on the resolved range\"});this.caret=ge.Boolean(\"-C,--caret\",!1,{description:\"Use the `^` semver modifier on the resolved range\"});this.recursive=ge.Boolean(\"-R,--recursive\",!1,{description:\"Resolve again ALL resolutions for those packages\"});this.mode=ge.String(\"--mode\",{description:\"Change what artifacts installs generate\",validator:Js(hl)});this.patterns=ge.Rest()}static{this.paths=[[\"up\"]]}static{this.usage=it.Usage({description:\"upgrade dependencies across the project\",details:\"\\n      This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\\n\\n      If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\\n\\n      If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\\n\\n      The, `-C,--caret`, `-E,--exact` and  `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\\n\\n      If the `--mode=<mode>` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\\n\\n      - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\\n\\n      - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\\n\\n      Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\\n\\n      This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\\n\\n      **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\\n    \",examples:[[\"Upgrade all instances of lodash to the latest release\",\"$0 up lodash\"],[\"Upgrade all instances of lodash to the latest release, but ask confirmation for each\",\"$0 up lodash -i\"],[\"Upgrade all instances of lodash to 1.2.3\",\"$0 up lodash@1.2.3\"],[\"Upgrade all instances of packages with the `@babel` scope to the latest release\",\"$0 up '@babel/*'\"],[\"Upgrade all instances of packages containing the word `jest` to the latest release\",\"$0 up '*jest*'\"],[\"Upgrade all instances of packages with the `@babel` scope to 7.0.0\",\"$0 up '@babel/*@7.0.0'\"]]})}static{this.schema=[Yw(\"recursive\",Yu.Forbids,[\"interactive\",\"exact\",\"tilde\",\"caret\"],{ignore:[void 0,!1]})]}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n=await Gr.find(r);if(!a)throw new sr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=[...o.storedDescriptors.values()],A=u.map(E=>G.stringifyIdent(E)),p=new Set;for(let E of this.patterns){if(G.parseDescriptor(E).range!==\"unknown\")throw new st(\"Ranges aren't allowed when using --recursive\");for(let I of(0,L8.default)(A,E)){let v=G.parseIdent(I);p.add(v.identHash)}}let h=u.filter(E=>p.has(E.identHash));for(let E of h)o.storedDescriptors.delete(E.descriptorHash),o.storedResolutions.delete(E.descriptorHash);return await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}async executeUpClassic(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n=await Gr.find(r);if(!a)throw new sr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.fixed,A=r.isInteractive({interactive:this.interactive,stdout:this.context.stdout}),p=Z1(this,o),h=A?[\"keep\",\"reuse\",\"project\",\"latest\"]:[\"project\",\"latest\"],E=[],I=[];for(let L of this.patterns){let U=!1,z=G.parseDescriptor(L),te=G.stringifyIdent(z);for(let ae of o.workspaces)for(let le of[\"dependencies\",\"devDependencies\"]){let Ce=[...ae.manifest.getForScope(le).values()].map(Be=>G.stringifyIdent(Be)),de=te===\"*\"?Ce:(0,L8.default)(Ce,te);for(let Be of de){let Ee=G.parseIdent(Be),g=ae.manifest[le].get(Ee.identHash);if(typeof g>\"u\")throw new Error(\"Assertion failed: Expected the descriptor to be registered\");let me=G.makeDescriptor(Ee,z.range);E.push(Promise.resolve().then(async()=>[ae,le,g,await $1(me,{project:o,workspace:ae,cache:n,target:le,fixed:u,modifier:p,strategies:h})])),U=!0}}U||I.push(L)}if(I.length>1)throw new st(`Patterns ${pe.prettyList(r,I,pe.Type.CODE)} don't match any packages referenced by any workspace`);if(I.length>0)throw new st(`Pattern ${pe.prettyList(r,I,pe.Type.CODE)} doesn't match any packages referenced by any workspace`);let v=await Promise.all(E),x=await AA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async L=>{for(let[,,U,{suggestions:z,rejections:te}]of v){let ae=z.filter(le=>le.descriptor!==null);if(ae.length===0){let[le]=te;if(typeof le>\"u\")throw new Error(\"Assertion failed: Expected an error to have been set\");let ce=this.cli.error(le);o.configuration.get(\"enableNetwork\")?L.reportError(27,`${G.prettyDescriptor(r,U)} can't be resolved to a satisfying range\n\n${ce}`):L.reportError(27,`${G.prettyDescriptor(r,U)} can't be resolved to a satisfying range (note: network resolution has been disabled)\n\n${ce}`)}else ae.length>1&&!A&&L.reportError(27,`${G.prettyDescriptor(r,U)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(x.hasErrors())return x.exitCode();let C=!1,R=[];for(let[L,U,,{suggestions:z}]of v){let te,ae=z.filter(de=>de.descriptor!==null),le=ae[0].descriptor,ce=ae.every(de=>G.areDescriptorsEqual(de.descriptor,le));ae.length===1||ce?te=le:(C=!0,{answer:te}=await(0,Ade.prompt)({type:\"select\",name:\"answer\",message:`Which range do you want to use in ${G.prettyWorkspace(r,L)} \\u276F ${U}?`,choices:z.map(({descriptor:de,name:Be,reason:Ee})=>de?{name:Be,hint:Ee,descriptor:de}:{name:Be,hint:Ee,disabled:!0}),onCancel:()=>process.exit(130),result(de){return this.find(de,\"descriptor\")},stdin:this.context.stdin,stdout:this.context.stdout}));let Ce=L.manifest[U].get(te.identHash);if(typeof Ce>\"u\")throw new Error(\"Assertion failed: This descriptor should have a matching entry\");if(Ce.descriptorHash!==te.descriptorHash)L.manifest[U].set(te.identHash,te),R.push([L,U,Ce,te]);else{let de=r.makeResolver(),Be={project:o,resolver:de},Ee=r.normalizeDependency(Ce),g=de.bindDescriptor(Ee,L.anchoredLocator,Be);o.forgetResolution(g)}}return await r.triggerMultipleHooks(L=>L.afterWorkspaceDependencyReplacement,R),C&&this.context.stdout.write(`\n`),await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}};Ge();Ge();Ge();qt();var DE=class extends ut{constructor(){super(...arguments);this.recursive=ge.Boolean(\"-R,--recursive\",!1,{description:\"List, for each workspace, what are all the paths that lead to the dependency\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.peers=ge.Boolean(\"--peers\",!1,{description:\"Also print the peer dependencies that match the specified name\"});this.package=ge.String()}static{this.paths=[[\"why\"]]}static{this.usage=it.Usage({description:\"display the reason why a package is needed\",details:`\n      This command prints the exact reasons why a package appears in the dependency tree.\n\n      If \\`-R,--recursive\\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named \"Foo\" when looking for \"Bar\", it means that \"Foo\" already got printed higher in the tree.\n    `,examples:[[\"Explain why lodash is used in your project\",\"$0 why lodash\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd);if(!a)throw new sr(o.cwd,this.context.cwd);await o.restoreInstallState();let n=G.parseIdent(this.package).identHash,u=this.recursive?ugt(o,n,{configuration:r,peers:this.peers}):cgt(o,n,{configuration:r,peers:this.peers});fs.emitTree(u,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1})}};function cgt(t,e,{configuration:r,peers:o}){let a=He.sortMap(t.storedPackages.values(),A=>G.stringifyLocator(A)),n={},u={children:n};for(let A of a){let p={};for(let E of A.dependencies.values()){if(!o&&A.peerDependencies.has(E.identHash))continue;let I=t.storedResolutions.get(E.descriptorHash);if(!I)throw new Error(\"Assertion failed: The resolution should have been registered\");let v=t.storedPackages.get(I);if(!v)throw new Error(\"Assertion failed: The package should have been registered\");if(v.identHash!==e)continue;{let C=G.stringifyLocator(A);n[C]={value:[A,pe.Type.LOCATOR],children:p}}let x=G.stringifyLocator(v);p[x]={value:[{descriptor:E,locator:v},pe.Type.DEPENDENT]}}}return u}function ugt(t,e,{configuration:r,peers:o}){let a=He.sortMap(t.workspaces,v=>G.stringifyLocator(v.anchoredLocator)),n=new Set,u=new Set,A=v=>{if(n.has(v.locatorHash))return u.has(v.locatorHash);if(n.add(v.locatorHash),v.identHash===e)return u.add(v.locatorHash),!0;let x=!1;v.identHash===e&&(x=!0);for(let C of v.dependencies.values()){if(!o&&v.peerDependencies.has(C.identHash))continue;let R=t.storedResolutions.get(C.descriptorHash);if(!R)throw new Error(\"Assertion failed: The resolution should have been registered\");let L=t.storedPackages.get(R);if(!L)throw new Error(\"Assertion failed: The package should have been registered\");A(L)&&(x=!0)}return x&&u.add(v.locatorHash),x};for(let v of a)A(v.anchoredPackage);let p=new Set,h={},E={children:h},I=(v,x,C)=>{if(!u.has(v.locatorHash))return;let R=C!==null?pe.tuple(pe.Type.DEPENDENT,{locator:v,descriptor:C}):pe.tuple(pe.Type.LOCATOR,v),L={},U={value:R,children:L},z=G.stringifyLocator(v);if(x[z]=U,!(C!==null&&t.tryWorkspaceByLocator(v))&&!p.has(v.locatorHash)){p.add(v.locatorHash);for(let te of v.dependencies.values()){if(!o&&v.peerDependencies.has(te.identHash))continue;let ae=t.storedResolutions.get(te.descriptorHash);if(!ae)throw new Error(\"Assertion failed: The resolution should have been registered\");let le=t.storedPackages.get(ae);if(!le)throw new Error(\"Assertion failed: The package should have been registered\");I(le,L,te)}}};for(let v of a)I(v.anchoredPackage,h,null);return E}Ge();var W8={};Vt(W8,{GitFetcher:()=>s2,GitResolver:()=>o2,default:()=>Qgt,gitUtils:()=>ia});Ge();Pt();var ia={};Vt(ia,{TreeishProtocols:()=>i2,clone:()=>Y8,fetchBase:()=>Rde,fetchChangedFiles:()=>Tde,fetchChangedWorkspaces:()=>xgt,fetchRoot:()=>Fde,isGitUrl:()=>SE,lsRemote:()=>Qde,normalizeLocator:()=>Sgt,normalizeRepoUrl:()=>PE,resolveUrl:()=>G8,splitRepoUrl:()=>Sh,validateRepoUrl:()=>j8});Ge();Pt();qt();var Sde=Ze(Dde()),xde=Ze(uU()),bE=Ze(ve(\"querystring\")),H8=Ze(Jn());function _8(t,e,r){let o=t.indexOf(r);return t.lastIndexOf(e,o>-1?o:1/0)}function Pde(t){try{return new URL(t)}catch{return}}function Pgt(t){let e=_8(t,\"@\",\"#\"),r=_8(t,\":\",\"#\");return r>e&&(t=`${t.slice(0,r)}/${t.slice(r+1)}`),_8(t,\":\",\"#\")===-1&&t.indexOf(\"//\")===-1&&(t=`ssh://${t}`),t}function bde(t){return Pde(t)||Pde(Pgt(t))}function PE(t,{git:e=!1}={}){if(t=t.replace(/^git\\+https:/,\"https:\"),t=t.replace(/^(?:github:|https:\\/\\/github\\.com\\/|git:\\/\\/github\\.com\\/)?(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\\.git)?(#.*)?$/,\"https://github.com/$1/$2.git$3\"),t=t.replace(/^https:\\/\\/github\\.com\\/(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\\/tarball\\/(.+)?$/,\"https://github.com/$1/$2.git#$3\"),e){let r=bde(t);r&&(t=r.href),t=t.replace(/^git\\+([^:]+):/,\"$1:\")}return t}function kde(){return{...process.env,GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||\"ssh\"} -o BatchMode=yes`}}var bgt=[/^ssh:/,/^git(?:\\+[^:]+)?:/,/^(?:git\\+)?https?:[^#]+\\/[^#]+(?:\\.git)(?:#.*)?$/,/^git@[^#]+\\/[^#]+\\.git(?:#.*)?$/,/^(?:github:|https:\\/\\/github\\.com\\/)?(?!\\.{1,2}\\/)([a-zA-Z._0-9-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\\.git)?(?:#.*)?$/,/^https:\\/\\/github\\.com\\/(?!\\.{1,2}\\/)([a-zA-Z0-9._-]+)\\/(?!\\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\\/tarball\\/(.+)?$/],i2=(a=>(a.Commit=\"commit\",a.Head=\"head\",a.Tag=\"tag\",a.Semver=\"semver\",a))(i2||{});function SE(t){return t?bgt.some(e=>!!t.match(e)):!1}function Sh(t){t=PE(t);let e=t.indexOf(\"#\");if(e===-1)return{repo:t,treeish:{protocol:\"head\",request:\"HEAD\"},extra:{}};let r=t.slice(0,e),o=t.slice(e+1);if(o.match(/^[a-z]+=/)){let a=bE.default.parse(o);for(let[p,h]of Object.entries(a))if(typeof h!=\"string\")throw new Error(`Assertion failed: The ${p} parameter must be a literal string`);let n=Object.values(i2).find(p=>Object.hasOwn(a,p)),[u,A]=typeof n<\"u\"?[n,a[n]]:[\"head\",\"HEAD\"];for(let p of Object.values(i2))delete a[p];return{repo:r,treeish:{protocol:u,request:A},extra:a}}else{let a=o.indexOf(\":\"),[n,u]=a===-1?[null,o]:[o.slice(0,a),o.slice(a+1)];return{repo:r,treeish:{protocol:n,request:u},extra:{}}}}function Sgt(t){return G.makeLocator(t,PE(t.reference))}function j8(t,{configuration:e}){let r=PE(t,{git:!0});if(!sn.getNetworkSettings(`https://${(0,Sde.default)(r).resource}`,{configuration:e}).enableNetwork)throw new Jt(80,`Request to '${r}' has been blocked because of your configuration settings`);return r}async function Qde(t,e){let r=j8(t,{configuration:e}),o=await q8(\"listing refs\",[\"ls-remote\",r],{cwd:e.startingCwd,env:kde()},{configuration:e,normalizedRepoUrl:r}),a=new Map,n=/^([a-f0-9]{40})\\t([^\\n]+)/gm,u;for(;(u=n.exec(o.stdout))!==null;)a.set(u[2],u[1]);return a}async function G8(t,e){let{repo:r,treeish:{protocol:o,request:a},extra:n}=Sh(t),u=await Qde(r,e),A=(h,E)=>{switch(h){case\"commit\":{if(!E.match(/^[a-f0-9]{40}$/))throw new Error(\"Invalid commit hash\");return bE.default.stringify({...n,commit:E})}case\"head\":{let I=u.get(E===\"HEAD\"?E:`refs/heads/${E}`);if(typeof I>\"u\")throw new Error(`Unknown head (\"${E}\")`);return bE.default.stringify({...n,commit:I})}case\"tag\":{let I=u.get(`refs/tags/${E}`);if(typeof I>\"u\")throw new Error(`Unknown tag (\"${E}\")`);return bE.default.stringify({...n,commit:I})}case\"semver\":{let I=Lr.validRange(E);if(!I)throw new Error(`Invalid range (\"${E}\")`);let v=new Map([...u.entries()].filter(([C])=>C.startsWith(\"refs/tags/\")).map(([C,R])=>[H8.default.parse(C.slice(10)),R]).filter(C=>C[0]!==null)),x=H8.default.maxSatisfying([...v.keys()],I);if(x===null)throw new Error(`No matching range (\"${E}\")`);return bE.default.stringify({...n,commit:v.get(x)})}case null:{let I;if((I=p(\"commit\",E))!==null||(I=p(\"tag\",E))!==null||(I=p(\"head\",E))!==null)return I;throw E.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve \"${E}\" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve \"${E}\" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol (\"${h}\")`)}},p=(h,E)=>{try{return A(h,E)}catch{return null}};return PE(`${r}#${A(o,a)}`)}async function Y8(t,e){return await e.getLimit(\"cloneConcurrency\")(async()=>{let{repo:r,treeish:{protocol:o,request:a}}=Sh(t);if(o!==\"commit\")throw new Error(\"Invalid treeish protocol when cloning\");let n=j8(r,{configuration:e}),u=await oe.mktempPromise(),A={cwd:u,env:kde()};return await q8(\"cloning the repository\",[\"clone\",\"-c core.autocrlf=false\",n,ue.fromPortablePath(u)],A,{configuration:e,normalizedRepoUrl:n}),await q8(\"switching branch\",[\"checkout\",`${a}`],A,{configuration:e,normalizedRepoUrl:n}),u})}async function Fde(t){let e,r=t;do{if(e=r,await oe.existsPromise(V.join(e,\".git\")))return e;r=V.dirname(e)}while(r!==e);return null}async function Rde(t,{baseRefs:e}){if(e.length===0)throw new st(\"Can't run this command with zero base refs specified.\");let r=[];for(let A of e){let{code:p}=await Ur.execvp(\"git\",[\"merge-base\",A,\"HEAD\"],{cwd:t});p===0&&r.push(A)}if(r.length===0)throw new st(`No ancestor could be found between any of HEAD and ${e.join(\", \")}`);let{stdout:o}=await Ur.execvp(\"git\",[\"merge-base\",\"HEAD\",...r],{cwd:t,strict:!0}),a=o.trim(),{stdout:n}=await Ur.execvp(\"git\",[\"show\",\"--quiet\",\"--pretty=format:%s\",a],{cwd:t,strict:!0}),u=n.trim();return{hash:a,title:u}}async function Tde(t,{base:e,project:r}){let o=He.buildIgnorePattern(r.configuration.get(\"changesetIgnorePatterns\")),{stdout:a}=await Ur.execvp(\"git\",[\"diff\",\"--name-only\",`${e}`],{cwd:t,strict:!0}),n=a.split(/\\r\\n|\\r|\\n/).filter(h=>h.length>0).map(h=>V.resolve(t,ue.toPortablePath(h))),{stdout:u}=await Ur.execvp(\"git\",[\"ls-files\",\"--others\",\"--exclude-standard\"],{cwd:t,strict:!0}),A=u.split(/\\r\\n|\\r|\\n/).filter(h=>h.length>0).map(h=>V.resolve(t,ue.toPortablePath(h))),p=[...new Set([...n,...A].sort())];return o?p.filter(h=>!V.relative(r.cwd,h).match(o)):p}async function xgt({ref:t,project:e}){if(e.configuration.projectCwd===null)throw new st(\"This command can only be run from within a Yarn project\");let r=[V.resolve(e.cwd,dr.lockfile),V.resolve(e.cwd,e.configuration.get(\"cacheFolder\")),V.resolve(e.cwd,e.configuration.get(\"installStatePath\")),V.resolve(e.cwd,e.configuration.get(\"virtualFolder\"))];await e.configuration.triggerHook(u=>u.populateYarnPaths,e,u=>{u!=null&&r.push(u)});let o=await Fde(e.configuration.projectCwd);if(o==null)throw new st(\"This command can only be run on Git repositories\");let a=await Rde(o,{baseRefs:typeof t==\"string\"?[t]:e.configuration.get(\"changesetBaseRefs\")}),n=await Tde(o,{base:a.hash,project:e});return new Set(He.mapAndFilter(n,u=>{let A=e.tryWorkspaceByFilePath(u);return A===null?He.mapAndFilter.skip:r.some(p=>u.startsWith(p))?He.mapAndFilter.skip:A}))}async function q8(t,e,r,{configuration:o,normalizedRepoUrl:a}){try{return await Ur.execvp(\"git\",e,{...r,strict:!0})}catch(n){if(!(n instanceof Ur.ExecError))throw n;let u=n.reportExtra,A=n.stderr.toString();throw new Jt(1,`Failed ${t}`,p=>{p.reportError(1,`  ${pe.prettyField(o,{label:\"Repository URL\",value:pe.tuple(pe.Type.URL,a)})}`);for(let h of A.matchAll(/^(.+?): (.*)$/gm)){let[,E,I]=h;E=E.toLowerCase();let v=E===\"error\"?\"Error\":`${(0,xde.default)(E)} Error`;p.reportError(1,`  ${pe.prettyField(o,{label:v,value:pe.tuple(pe.Type.NO_HINT,I)})}`)}u?.(p)})}}var s2=class{supports(e,r){return SE(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,a=new Map(r.checksums);a.set(e.locatorHash,o);let n={...r,checksums:a},u=await this.downloadHosted(e,n);if(u!==null)return u;let[A,p,h]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(e,n),...r.cacheOptions});return{packageFs:A,releaseFs:p,prefixPath:G.getIdentVendorPath(e),checksum:h}}async downloadHosted(e,r){return r.project.configuration.reduceHook(o=>o.fetchHostedRepository,null,e,r)}async cloneFromRemote(e,r){let o=Sh(e.reference),a=await Y8(e.reference,r.project.configuration),n=V.resolve(a,o.extra.cwd??It.dot),u=V.join(n,\"package.tgz\");await An.prepareExternalProject(n,u,{configuration:r.project.configuration,report:r.report,workspace:o.extra.workspace,locator:e});let A=await oe.readFilePromise(u);return await He.releaseAfterUseAsync(async()=>await $i.convertToZip(A,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1}))}};Ge();Ge();var o2=class{supportsDescriptor(e,r){return SE(e.range)}supportsLocator(e,r){return SE(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=await G8(e.range,o.project.configuration);return[G.makeLocator(e,a)]}async getSatisfying(e,r,o,a){let n=Sh(e.range);return{locators:o.filter(A=>{if(A.identHash!==e.identHash)return!1;let p=Sh(A.reference);return!(n.repo!==p.repo||n.treeish.protocol===\"commit\"&&n.treeish.request!==p.treeish.request)}),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await He.releaseAfterUseAsync(async()=>await Ut.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||\"0.0.0\",languageName:a.languageName||r.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var kgt={configuration:{changesetBaseRefs:{description:\"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.\",type:\"STRING\",isArray:!0,isNullable:!1,default:[\"master\",\"origin/master\",\"upstream/master\",\"main\",\"origin/main\",\"upstream/main\"]},changesetIgnorePatterns:{description:\"Array of glob patterns; files matching them will be ignored when fetching the changed files\",type:\"STRING\",default:[],isArray:!0},cloneConcurrency:{description:\"Maximal number of concurrent clones\",type:\"NUMBER\",default:2}},fetchers:[s2],resolvers:[o2]};var Qgt=kgt;qt();var xE=class extends ut{constructor(){super(...arguments);this.since=ge.String(\"--since\",{description:\"Only include workspaces that have been changed since the specified ref.\",tolerateBoolean:!0});this.recursive=ge.Boolean(\"-R,--recursive\",!1,{description:\"Find packages via dependencies/devDependencies instead of using the workspaces field\"});this.noPrivate=ge.Boolean(\"--no-private\",{description:\"Exclude workspaces that have the private field set to true\"});this.verbose=ge.Boolean(\"-v,--verbose\",!1,{description:\"Also return the cross-dependencies between workspaces\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"workspaces\",\"list\"]]}static{this.usage=it.Usage({category:\"Workspace-related commands\",description:\"list all available workspaces\",details:\"\\n      This command will print the list of all workspaces in the project.\\n\\n      - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\\n\\n      - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\\n\\n      - If `--no-private` is set, Yarn will not list any workspaces that have the `private` field set to `true`.\\n\\n      - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\\n    \"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await kt.find(r,this.context.cwd);return(await Rt.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{let u=this.since?await ia.fetchChangedWorkspaces({ref:this.since,project:o}):o.workspaces,A=new Set(u);if(this.recursive)for(let p of[...u].map(h=>h.getRecursiveWorkspaceDependents()))for(let h of p)A.add(h);for(let p of A){let{manifest:h}=p;if(h.private&&this.noPrivate)continue;let E;if(this.verbose){let I=new Set,v=new Set;for(let x of Ut.hardDependencies)for(let[C,R]of h.getForScope(x)){let L=o.tryWorkspaceByDescriptor(R);L===null?o.workspacesByIdent.has(C)&&v.add(R):I.add(L)}E={workspaceDependencies:Array.from(I).map(x=>x.relativeCwd),mismatchedWorkspaceDependencies:Array.from(v).map(x=>G.stringifyDescriptor(x))}}n.reportInfo(null,`${p.relativeCwd}`),n.reportJson({location:p.relativeCwd,name:h.name?G.stringifyIdent(h.name):null,...E})}})).exitCode()}};Ge();Ge();qt();var kE=class extends ut{constructor(){super(...arguments);this.workspaceName=ge.String();this.commandName=ge.String();this.args=ge.Proxy()}static{this.paths=[[\"workspace\"]]}static{this.usage=it.Usage({category:\"Workspace-related commands\",description:\"run a command within the specified workspace\",details:`\n      This command will run a given sub-command on a single workspace.\n    `,examples:[[\"Add a package to a single workspace\",\"yarn workspace components add -D react\"],[\"Run build script on a single workspace\",\"yarn workspace components run build\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd);if(!a)throw new sr(o.cwd,this.context.cwd);let n=o.workspaces,u=new Map(n.map(p=>[G.stringifyIdent(p.anchoredLocator),p])),A=u.get(this.workspaceName);if(A===void 0){let p=Array.from(u.keys()).sort();throw new st(`Workspace '${this.workspaceName}' not found. Did you mean any of the following:\n  - ${p.join(`\n  - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:A.cwd})}};var Fgt={configuration:{enableImmutableInstalls:{description:\"If true (the default on CI), prevents the install command from modifying the lockfile\",type:\"BOOLEAN\",default:Nde.isCI},defaultSemverRangePrefix:{description:\"The default save prefix: '^', '~' or ''\",type:\"STRING\",values:[\"^\",\"~\",\"\"],default:\"^\"},preferReuse:{description:\"If true, `yarn add` will attempt to reuse the most common dependency range in other workspaces.\",type:\"BOOLEAN\",default:!1}},commands:[Ky,Vy,zy,Jy,IE,pE,sE,xE,$y,eE,tE,rE,Yy,Wy,Xy,Zy,nE,iE,oE,aE,lE,cE,BE,uE,AE,gE,hE,dE,fE,mE,yE,EE,CE,wE,vE,DE,kE]},Rgt=Fgt;var Z8={};Vt(Z8,{default:()=>Ngt});Ge();var xt={optional:!0},V8=[[\"@tailwindcss/aspect-ratio@<0.2.1\",{peerDependencies:{tailwindcss:\"^2.0.2\"}}],[\"@tailwindcss/line-clamp@<0.2.1\",{peerDependencies:{tailwindcss:\"^2.0.2\"}}],[\"@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0\",{peerDependencies:{postcss:\"^8.0.0\"}}],[\"@samverschueren/stream-to-observable@<0.3.1\",{peerDependenciesMeta:{rxjs:xt,zenObservable:xt}}],[\"any-observable@<0.5.1\",{peerDependenciesMeta:{rxjs:xt,zenObservable:xt}}],[\"@pm2/agent@<1.0.4\",{dependencies:{debug:\"*\"}}],[\"debug@<4.2.0\",{peerDependenciesMeta:{\"supports-color\":xt}}],[\"got@<11\",{dependencies:{\"@types/responselike\":\"^1.0.0\",\"@types/keyv\":\"^3.1.1\"}}],[\"cacheable-lookup@<4.1.2\",{dependencies:{\"@types/keyv\":\"^3.1.1\"}}],[\"http-link-dataloader@*\",{peerDependencies:{graphql:\"^0.13.1 || ^14.0.0\"}}],[\"typescript-language-server@*\",{dependencies:{\"vscode-jsonrpc\":\"^5.0.1\",\"vscode-languageserver-protocol\":\"^3.15.0\"}}],[\"postcss-syntax@*\",{peerDependenciesMeta:{\"postcss-html\":xt,\"postcss-jsx\":xt,\"postcss-less\":xt,\"postcss-markdown\":xt,\"postcss-scss\":xt}}],[\"jss-plugin-rule-value-function@<=10.1.1\",{dependencies:{\"tiny-warning\":\"^1.0.2\"}}],[\"ink-select-input@<4.1.0\",{peerDependencies:{react:\"^16.8.2\"}}],[\"license-webpack-plugin@<2.3.18\",{peerDependenciesMeta:{webpack:xt}}],[\"snowpack@>=3.3.0\",{dependencies:{\"node-gyp\":\"^7.1.0\"}}],[\"promise-inflight@*\",{peerDependenciesMeta:{bluebird:xt}}],[\"reactcss@*\",{peerDependencies:{react:\"*\"}}],[\"react-color@<=2.19.0\",{peerDependencies:{react:\"*\"}}],[\"gatsby-plugin-i18n@*\",{dependencies:{ramda:\"^0.24.1\"}}],[\"useragent@^2.0.0\",{dependencies:{request:\"^2.88.0\",yamlparser:\"0.0.x\",semver:\"5.5.x\"}}],[\"@apollographql/apollo-tools@<=0.5.2\",{peerDependencies:{graphql:\"^14.2.1 || ^15.0.0\"}}],[\"material-table@^2.0.0\",{dependencies:{\"@babel/runtime\":\"^7.11.2\"}}],[\"@babel/parser@*\",{dependencies:{\"@babel/types\":\"^7.8.3\"}}],[\"fork-ts-checker-webpack-plugin@<=6.3.4\",{peerDependencies:{eslint:\">= 6\",typescript:\">= 2.7\",webpack:\">= 4\",\"vue-template-compiler\":\"*\"},peerDependenciesMeta:{eslint:xt,\"vue-template-compiler\":xt}}],[\"rc-animate@<=3.1.1\",{peerDependencies:{react:\">=16.9.0\",\"react-dom\":\">=16.9.0\"}}],[\"react-bootstrap-table2-paginator@*\",{dependencies:{classnames:\"^2.2.6\"}}],[\"react-draggable@<=4.4.3\",{peerDependencies:{react:\">= 16.3.0\",\"react-dom\":\">= 16.3.0\"}}],[\"apollo-upload-client@<14\",{peerDependencies:{graphql:\"14 - 15\"}}],[\"react-instantsearch-core@<=6.7.0\",{peerDependencies:{algoliasearch:\">= 3.1 < 5\"}}],[\"react-instantsearch-dom@<=6.7.0\",{dependencies:{\"react-fast-compare\":\"^3.0.0\"}}],[\"ws@<7.2.1\",{peerDependencies:{bufferutil:\"^4.0.1\",\"utf-8-validate\":\"^5.0.2\"},peerDependenciesMeta:{bufferutil:xt,\"utf-8-validate\":xt}}],[\"react-portal@<4.2.2\",{peerDependencies:{\"react-dom\":\"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0\"}}],[\"react-scripts@<=4.0.1\",{peerDependencies:{react:\"*\"}}],[\"testcafe@<=1.10.1\",{dependencies:{\"@babel/plugin-transform-for-of\":\"^7.12.1\",\"@babel/runtime\":\"^7.12.5\"}}],[\"testcafe-legacy-api@<=4.2.0\",{dependencies:{\"testcafe-hammerhead\":\"^17.0.1\",\"read-file-relative\":\"^1.2.0\"}}],[\"@google-cloud/firestore@<=4.9.3\",{dependencies:{protobufjs:\"^6.8.6\"}}],[\"gatsby-source-apiserver@*\",{dependencies:{\"babel-polyfill\":\"^6.26.0\"}}],[\"@webpack-cli/package-utils@<=1.0.1-alpha.4\",{dependencies:{\"cross-spawn\":\"^7.0.3\"}}],[\"gatsby-remark-prismjs@<3.3.28\",{dependencies:{lodash:\"^4\"}}],[\"gatsby-plugin-favicon@*\",{peerDependencies:{webpack:\"*\"}}],[\"gatsby-plugin-sharp@<=4.6.0-next.3\",{dependencies:{debug:\"^4.3.1\"}}],[\"gatsby-react-router-scroll@<=5.6.0-next.0\",{dependencies:{\"prop-types\":\"^15.7.2\"}}],[\"@rebass/forms@*\",{dependencies:{\"@styled-system/should-forward-prop\":\"^5.0.0\"},peerDependencies:{react:\"^16.8.6\"}}],[\"rebass@*\",{peerDependencies:{react:\"^16.8.6\"}}],[\"@ant-design/react-slick@<=0.28.3\",{peerDependencies:{react:\">=16.0.0\"}}],[\"mqtt@<4.2.7\",{dependencies:{duplexify:\"^4.1.1\"}}],[\"vue-cli-plugin-vuetify@<=2.0.3\",{dependencies:{semver:\"^6.3.0\"},peerDependenciesMeta:{\"sass-loader\":xt,\"vuetify-loader\":xt}}],[\"vue-cli-plugin-vuetify@<=2.0.4\",{dependencies:{\"null-loader\":\"^3.0.0\"}}],[\"vue-cli-plugin-vuetify@>=2.4.3\",{peerDependencies:{vue:\"*\"}}],[\"@vuetify/cli-plugin-utils@<=0.0.4\",{dependencies:{semver:\"^6.3.0\"},peerDependenciesMeta:{\"sass-loader\":xt}}],[\"@vue/cli-plugin-typescript@<=5.0.0-alpha.0\",{dependencies:{\"babel-loader\":\"^8.1.0\"}}],[\"@vue/cli-plugin-typescript@<=5.0.0-beta.0\",{dependencies:{\"@babel/core\":\"^7.12.16\"},peerDependencies:{\"vue-template-compiler\":\"^2.0.0\"},peerDependenciesMeta:{\"vue-template-compiler\":xt}}],[\"cordova-ios@<=6.3.0\",{dependencies:{underscore:\"^1.9.2\"}}],[\"cordova-lib@<=10.0.1\",{dependencies:{underscore:\"^1.9.2\"}}],[\"git-node-fs@*\",{peerDependencies:{\"js-git\":\"^0.7.8\"},peerDependenciesMeta:{\"js-git\":xt}}],[\"consolidate@<0.16.0\",{peerDependencies:{mustache:\"^3.0.0\"},peerDependenciesMeta:{mustache:xt}}],[\"consolidate@<=0.16.0\",{peerDependencies:{velocityjs:\"^2.0.1\",tinyliquid:\"^0.2.34\",\"liquid-node\":\"^3.0.1\",jade:\"^1.11.0\",\"then-jade\":\"*\",dust:\"^0.3.0\",\"dustjs-helpers\":\"^1.7.4\",\"dustjs-linkedin\":\"^2.7.5\",swig:\"^1.4.2\",\"swig-templates\":\"^2.0.3\",\"razor-tmpl\":\"^1.3.1\",atpl:\">=0.7.6\",liquor:\"^0.0.5\",twig:\"^1.15.2\",ejs:\"^3.1.5\",eco:\"^1.1.0-rc-3\",jazz:\"^0.0.18\",jqtpl:\"~1.1.0\",hamljs:\"^0.6.2\",hamlet:\"^0.3.3\",whiskers:\"^0.4.0\",\"haml-coffee\":\"^1.14.1\",\"hogan.js\":\"^3.0.2\",templayed:\">=0.2.3\",handlebars:\"^4.7.6\",underscore:\"^1.11.0\",lodash:\"^4.17.20\",pug:\"^3.0.0\",\"then-pug\":\"*\",qejs:\"^3.0.5\",walrus:\"^0.10.1\",mustache:\"^4.0.1\",just:\"^0.1.8\",ect:\"^0.5.9\",mote:\"^0.2.0\",toffee:\"^0.3.6\",dot:\"^1.1.3\",\"bracket-template\":\"^1.1.5\",ractive:\"^1.3.12\",nunjucks:\"^3.2.2\",htmling:\"^0.0.8\",\"babel-core\":\"^6.26.3\",plates:\"~0.4.11\",\"react-dom\":\"^16.13.1\",react:\"^16.13.1\",\"arc-templates\":\"^0.5.3\",vash:\"^0.13.0\",slm:\"^2.0.0\",marko:\"^3.14.4\",teacup:\"^2.0.0\",\"coffee-script\":\"^1.12.7\",squirrelly:\"^5.1.0\",twing:\"^5.0.2\"},peerDependenciesMeta:{velocityjs:xt,tinyliquid:xt,\"liquid-node\":xt,jade:xt,\"then-jade\":xt,dust:xt,\"dustjs-helpers\":xt,\"dustjs-linkedin\":xt,swig:xt,\"swig-templates\":xt,\"razor-tmpl\":xt,atpl:xt,liquor:xt,twig:xt,ejs:xt,eco:xt,jazz:xt,jqtpl:xt,hamljs:xt,hamlet:xt,whiskers:xt,\"haml-coffee\":xt,\"hogan.js\":xt,templayed:xt,handlebars:xt,underscore:xt,lodash:xt,pug:xt,\"then-pug\":xt,qejs:xt,walrus:xt,mustache:xt,just:xt,ect:xt,mote:xt,toffee:xt,dot:xt,\"bracket-template\":xt,ractive:xt,nunjucks:xt,htmling:xt,\"babel-core\":xt,plates:xt,\"react-dom\":xt,react:xt,\"arc-templates\":xt,vash:xt,slm:xt,marko:xt,teacup:xt,\"coffee-script\":xt,squirrelly:xt,twing:xt}}],[\"vue-loader@<=16.3.3\",{peerDependencies:{\"@vue/compiler-sfc\":\"^3.0.8\",webpack:\"^4.1.0 || ^5.0.0-0\"},peerDependenciesMeta:{\"@vue/compiler-sfc\":xt}}],[\"vue-loader@^16.7.0\",{peerDependencies:{\"@vue/compiler-sfc\":\"^3.0.8\",vue:\"^3.2.13\"},peerDependenciesMeta:{\"@vue/compiler-sfc\":xt,vue:xt}}],[\"scss-parser@<=1.0.5\",{dependencies:{lodash:\"^4.17.21\"}}],[\"query-ast@<1.0.5\",{dependencies:{lodash:\"^4.17.21\"}}],[\"redux-thunk@<=2.3.0\",{peerDependencies:{redux:\"^4.0.0\"}}],[\"skypack@<=0.3.2\",{dependencies:{tar:\"^6.1.0\"}}],[\"@npmcli/metavuln-calculator@<2.0.0\",{dependencies:{\"json-parse-even-better-errors\":\"^2.3.1\"}}],[\"bin-links@<2.3.0\",{dependencies:{\"mkdirp-infer-owner\":\"^1.0.2\"}}],[\"rollup-plugin-polyfill-node@<=0.8.0\",{peerDependencies:{rollup:\"^1.20.0 || ^2.0.0\"}}],[\"snowpack@<3.8.6\",{dependencies:{\"magic-string\":\"^0.25.7\"}}],[\"elm-webpack-loader@*\",{dependencies:{temp:\"^0.9.4\"}}],[\"winston-transport@<=4.4.0\",{dependencies:{logform:\"^2.2.0\"}}],[\"jest-vue-preprocessor@*\",{dependencies:{\"@babel/core\":\"7.8.7\",\"@babel/template\":\"7.8.6\"},peerDependencies:{pug:\"^2.0.4\"},peerDependenciesMeta:{pug:xt}}],[\"redux-persist@*\",{peerDependencies:{react:\">=16\"},peerDependenciesMeta:{react:xt}}],[\"sodium@>=3\",{dependencies:{\"node-gyp\":\"^3.8.0\"}}],[\"babel-plugin-graphql-tag@<=3.1.0\",{peerDependencies:{graphql:\"^14.0.0 || ^15.0.0\"}}],[\"@playwright/test@<=1.14.1\",{dependencies:{\"jest-matcher-utils\":\"^26.4.2\"}}],...[\"babel-plugin-remove-graphql-queries@<3.14.0-next.1\",\"babel-preset-gatsby-package@<1.14.0-next.1\",\"create-gatsby@<1.14.0-next.1\",\"gatsby-admin@<0.24.0-next.1\",\"gatsby-cli@<3.14.0-next.1\",\"gatsby-core-utils@<2.14.0-next.1\",\"gatsby-design-tokens@<3.14.0-next.1\",\"gatsby-legacy-polyfills@<1.14.0-next.1\",\"gatsby-plugin-benchmark-reporting@<1.14.0-next.1\",\"gatsby-plugin-graphql-config@<0.23.0-next.1\",\"gatsby-plugin-image@<1.14.0-next.1\",\"gatsby-plugin-mdx@<2.14.0-next.1\",\"gatsby-plugin-netlify-cms@<5.14.0-next.1\",\"gatsby-plugin-no-sourcemaps@<3.14.0-next.1\",\"gatsby-plugin-page-creator@<3.14.0-next.1\",\"gatsby-plugin-preact@<5.14.0-next.1\",\"gatsby-plugin-preload-fonts@<2.14.0-next.1\",\"gatsby-plugin-schema-snapshot@<2.14.0-next.1\",\"gatsby-plugin-styletron@<6.14.0-next.1\",\"gatsby-plugin-subfont@<3.14.0-next.1\",\"gatsby-plugin-utils@<1.14.0-next.1\",\"gatsby-recipes@<0.25.0-next.1\",\"gatsby-source-shopify@<5.6.0-next.1\",\"gatsby-source-wikipedia@<3.14.0-next.1\",\"gatsby-transformer-screenshot@<3.14.0-next.1\",\"gatsby-worker@<0.5.0-next.1\"].map(t=>[t,{dependencies:{\"@babel/runtime\":\"^7.14.8\"}}]),[\"gatsby-core-utils@<2.14.0-next.1\",{dependencies:{got:\"8.3.2\"}}],[\"gatsby-plugin-gatsby-cloud@<=3.1.0-next.0\",{dependencies:{\"gatsby-core-utils\":\"^2.13.0-next.0\"}}],[\"gatsby-plugin-gatsby-cloud@<=3.2.0-next.1\",{peerDependencies:{webpack:\"*\"}}],[\"babel-plugin-remove-graphql-queries@<=3.14.0-next.1\",{dependencies:{\"gatsby-core-utils\":\"^2.8.0-next.1\"}}],[\"gatsby-plugin-netlify@3.13.0-next.1\",{dependencies:{\"gatsby-core-utils\":\"^2.13.0-next.0\"}}],[\"clipanion-v3-codemod@<=0.2.0\",{peerDependencies:{jscodeshift:\"^0.11.0\"}}],[\"react-live@*\",{peerDependencies:{\"react-dom\":\"*\",react:\"*\"}}],[\"webpack@<4.44.1\",{peerDependenciesMeta:{\"webpack-cli\":xt,\"webpack-command\":xt}}],[\"webpack@<5.0.0-beta.23\",{peerDependenciesMeta:{\"webpack-cli\":xt}}],[\"webpack-dev-server@<3.10.2\",{peerDependenciesMeta:{\"webpack-cli\":xt}}],[\"@docusaurus/responsive-loader@<1.5.0\",{peerDependenciesMeta:{sharp:xt,jimp:xt}}],[\"eslint-module-utils@*\",{peerDependenciesMeta:{\"eslint-import-resolver-node\":xt,\"eslint-import-resolver-typescript\":xt,\"eslint-import-resolver-webpack\":xt,\"@typescript-eslint/parser\":xt}}],[\"eslint-plugin-import@*\",{peerDependenciesMeta:{\"@typescript-eslint/parser\":xt}}],[\"critters-webpack-plugin@<3.0.2\",{peerDependenciesMeta:{\"html-webpack-plugin\":xt}}],[\"terser@<=5.10.0\",{dependencies:{acorn:\"^8.5.0\"}}],[\"babel-preset-react-app@10.0.x <10.0.2\",{dependencies:{\"@babel/plugin-proposal-private-property-in-object\":\"^7.16.7\"}}],[\"eslint-config-react-app@*\",{peerDependenciesMeta:{typescript:xt}}],[\"@vue/eslint-config-typescript@<11.0.0\",{peerDependenciesMeta:{typescript:xt}}],[\"unplugin-vue2-script-setup@<0.9.1\",{peerDependencies:{\"@vue/composition-api\":\"^1.4.3\",\"@vue/runtime-dom\":\"^3.2.26\"}}],[\"@cypress/snapshot@*\",{dependencies:{debug:\"^3.2.7\"}}],[\"auto-relay@<=0.14.0\",{peerDependencies:{\"reflect-metadata\":\"^0.1.13\"}}],[\"vue-template-babel-compiler@<1.2.0\",{peerDependencies:{\"vue-template-compiler\":\"^2.6.0\"}}],[\"@parcel/transformer-image@<2.5.0\",{peerDependencies:{\"@parcel/core\":\"*\"}}],[\"@parcel/transformer-js@<2.5.0\",{peerDependencies:{\"@parcel/core\":\"*\"}}],[\"parcel@*\",{peerDependenciesMeta:{\"@parcel/core\":xt}}],[\"react-scripts@*\",{peerDependencies:{eslint:\"*\"}}],[\"focus-trap-react@^8.0.0\",{dependencies:{tabbable:\"^5.3.2\"}}],[\"react-rnd@<10.3.7\",{peerDependencies:{react:\">=16.3.0\",\"react-dom\":\">=16.3.0\"}}],[\"connect-mongo@<5.0.0\",{peerDependencies:{\"express-session\":\"^1.17.1\"}}],[\"vue-i18n@<9\",{peerDependencies:{vue:\"^2\"}}],[\"vue-router@<4\",{peerDependencies:{vue:\"^2\"}}],[\"unified@<10\",{dependencies:{\"@types/unist\":\"^2.0.0\"}}],[\"react-github-btn@<=1.3.0\",{peerDependencies:{react:\">=16.3.0\"}}],[\"react-dev-utils@*\",{peerDependencies:{typescript:\">=2.7\",webpack:\">=4\"},peerDependenciesMeta:{typescript:xt}}],[\"@asyncapi/react-component@<=1.0.0-next.39\",{peerDependencies:{react:\">=16.8.0\",\"react-dom\":\">=16.8.0\"}}],[\"xo@*\",{peerDependencies:{webpack:\">=1.11.0\"},peerDependenciesMeta:{webpack:xt}}],[\"babel-plugin-remove-graphql-queries@<=4.20.0-next.0\",{dependencies:{\"@babel/types\":\"^7.15.4\"}}],[\"gatsby-plugin-page-creator@<=4.20.0-next.1\",{dependencies:{\"fs-extra\":\"^10.1.0\"}}],[\"gatsby-plugin-utils@<=3.14.0-next.1\",{dependencies:{fastq:\"^1.13.0\"},peerDependencies:{graphql:\"^15.0.0\"}}],[\"gatsby-plugin-mdx@<3.1.0-next.1\",{dependencies:{mkdirp:\"^1.0.4\"}}],[\"gatsby-plugin-mdx@^2\",{peerDependencies:{gatsby:\"^3.0.0-next\"}}],[\"fdir@<=5.2.0\",{peerDependencies:{picomatch:\"2.x\"},peerDependenciesMeta:{picomatch:xt}}],[\"babel-plugin-transform-typescript-metadata@<=0.3.2\",{peerDependencies:{\"@babel/core\":\"^7\",\"@babel/traverse\":\"^7\"},peerDependenciesMeta:{\"@babel/traverse\":xt}}],[\"graphql-compose@>=9.0.10\",{peerDependencies:{graphql:\"^14.2.0 || ^15.0.0 || ^16.0.0\"}}],[\"vite-plugin-vuetify@<=1.0.2\",{peerDependencies:{vue:\"^3.0.0\"}}],[\"webpack-plugin-vuetify@<=2.0.1\",{peerDependencies:{vue:\"^3.2.6\"}}],[\"eslint-import-resolver-vite@<2.0.1\",{dependencies:{debug:\"^4.3.4\",resolve:\"^1.22.8\"}}]];var z8;function Lde(){return typeof z8>\"u\"&&(z8=ve(\"zlib\").brotliDecompressSync(Buffer.from(\"G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==\",\"base64\")).toString()),z8}var J8;function Mde(){return typeof J8>\"u\"&&(J8=ve(\"zlib\").brotliDecompressSync(Buffer.from(\"G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=\",\"base64\")).toString()),J8}var X8;function Ode(){return typeof X8>\"u\"&&(X8=ve(\"zlib\").brotliDecompressSync(Buffer.from(\"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\",\"base64\")).toString()),X8}var Ude=new Map([[G.makeIdent(null,\"fsevents\").identHash,Lde],[G.makeIdent(null,\"resolve\").identHash,Mde],[G.makeIdent(null,\"typescript\").identHash,Ode]]),Tgt={hooks:{registerPackageExtensions:async(t,e)=>{for(let[r,o]of V8)e(G.parseDescriptor(r,!0),o)},getBuiltinPatch:async(t,e)=>{let r=\"compat/\";if(!e.startsWith(r))return;let o=G.parseIdent(e.slice(r.length)),a=Ude.get(o.identHash)?.();return typeof a<\"u\"?a:null},reduceDependency:async(t,e,r,o)=>typeof Ude.get(t.identHash)>\"u\"?t:G.makeDescriptor(t,G.makeRange({protocol:\"patch:\",source:G.stringifyDescriptor(t),selector:`optional!builtin<compat/${G.stringifyIdent(t)}>`,params:null}))}},Ngt=Tgt;var dH={};Vt(dH,{ConstraintsCheckCommand:()=>OE,ConstraintsQueryCommand:()=>LE,ConstraintsSourceCommand:()=>ME,default:()=>ldt});Ge();Ge();l2();var FE=class{constructor(e){this.project=e}createEnvironment(){let e=new QE([\"cwd\",\"ident\"]),r=new QE([\"workspace\",\"type\",\"ident\"]),o=new QE([\"ident\"]),a={manifestUpdates:new Map,reportedErrors:new Map},n=new Map,u=new Map;for(let A of this.project.storedPackages.values()){let p=Array.from(A.peerDependencies.values(),h=>[G.stringifyIdent(h),h.range]);n.set(A.locatorHash,{workspace:null,ident:G.stringifyIdent(A),version:A.version,dependencies:new Map,peerDependencies:new Map(p.filter(([h])=>A.peerDependenciesMeta.get(h)?.optional!==!0)),optionalPeerDependencies:new Map(p.filter(([h])=>A.peerDependenciesMeta.get(h)?.optional===!0))})}for(let A of this.project.storedPackages.values()){let p=n.get(A.locatorHash);p.dependencies=new Map(Array.from(A.dependencies.values(),h=>{let E=this.project.storedResolutions.get(h.descriptorHash);if(typeof E>\"u\")throw new Error(\"Assertion failed: The resolution should have been registered\");let I=n.get(E);if(typeof I>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");return[G.stringifyIdent(h),I]})),p.dependencies.delete(p.ident)}for(let A of this.project.workspaces){let p=G.stringifyIdent(A.anchoredLocator),h=A.manifest.exportTo({}),E=n.get(A.anchoredLocator.locatorHash);if(typeof E>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");let I=(R,L,{caller:U=Xi.getCaller()}={})=>{let z=a2(R),te=He.getMapWithDefault(a.manifestUpdates,A.cwd),ae=He.getMapWithDefault(te,z),le=He.getSetWithDefault(ae,L);U!==null&&le.add(U)},v=R=>I(R,void 0,{caller:Xi.getCaller()}),x=R=>{He.getArrayWithDefault(a.reportedErrors,A.cwd).push(R)},C=e.insert({cwd:A.relativeCwd,ident:p,manifest:h,pkg:E,set:I,unset:v,error:x});u.set(A,C);for(let R of Ut.allDependencies)for(let L of A.manifest[R].values()){let U=G.stringifyIdent(L),z=()=>{I([R,U],void 0,{caller:Xi.getCaller()})},te=le=>{I([R,U],le,{caller:Xi.getCaller()})},ae=null;if(R!==\"peerDependencies\"&&(R!==\"dependencies\"||!A.manifest.devDependencies.has(L.identHash))){let le=A.anchoredPackage.dependencies.get(L.identHash);if(le){if(typeof le>\"u\")throw new Error(\"Assertion failed: The dependency should have been registered\");let ce=this.project.storedResolutions.get(le.descriptorHash);if(typeof ce>\"u\")throw new Error(\"Assertion failed: The resolution should have been registered\");let Ce=n.get(ce);if(typeof Ce>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");ae=Ce}}r.insert({workspace:C,ident:U,range:L.range,type:R,resolution:ae,update:te,delete:z,error:x})}}for(let A of this.project.storedPackages.values()){let p=this.project.tryWorkspaceByLocator(A);if(!p)continue;let h=u.get(p);if(typeof h>\"u\")throw new Error(\"Assertion failed: The workspace should have been registered\");let E=n.get(A.locatorHash);if(typeof E>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");E.workspace=h}return{workspaces:e,dependencies:r,packages:o,result:a}}async process(){let e=this.createEnvironment(),r={Yarn:{workspace:a=>e.workspaces.find(a)[0]??null,workspaces:a=>e.workspaces.find(a),dependency:a=>e.dependencies.find(a)[0]??null,dependencies:a=>e.dependencies.find(a),package:a=>e.packages.find(a)[0]??null,packages:a=>e.packages.find(a)}},o=await this.project.loadUserConfig();return o?.constraints?(await o.constraints(r),e.result):null}};Ge();Ge();qt();var LE=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.query=ge.String()}static{this.paths=[[\"constraints\",\"query\"]]}static{this.usage=it.Usage({category:\"Constraints-related commands\",description:\"query the constraints fact database\",details:`\n      This command will output all matches to the given prolog query.\n    `,examples:[[\"List all dependencies throughout the workspace\",\"yarn constraints query 'workspace_has_dependency(_, DependencyName, _, _).'\"]]})}async execute(){let{Constraints:r}=await Promise.resolve().then(()=>(f2(),A2)),o=await Ke.find(this.context.cwd,this.context.plugins),{project:a}=await kt.find(o,this.context.cwd),n=await r.find(a),u=this.query;return u.endsWith(\".\")||(u=`${u}.`),(await Rt.start({configuration:o,json:this.json,stdout:this.context.stdout},async p=>{for await(let h of n.query(u)){let E=Array.from(Object.entries(h)),I=E.length,v=E.reduce((x,[C])=>Math.max(x,C.length),0);for(let x=0;x<I;x++){let[C,R]=E[x];p.reportInfo(null,`${odt(x,I)}${C.padEnd(v,\" \")} = ${sdt(R)}`)}p.reportJson(h)}})).exitCode()}};function sdt(t){return typeof t!=\"string\"?`${t}`:t.match(/^[a-zA-Z][a-zA-Z0-9_]+$/)?t:`'${t}'`}function odt(t,e){let r=t===0,o=t===e-1;return r&&o?\"\":r?\"\\u250C \":o?\"\\u2514 \":\"\\u2502 \"}Ge();qt();var ME=class extends ut{constructor(){super(...arguments);this.verbose=ge.Boolean(\"-v,--verbose\",!1,{description:\"Also print the fact database automatically compiled from the workspace manifests\"})}static{this.paths=[[\"constraints\",\"source\"]]}static{this.usage=it.Usage({category:\"Constraints-related commands\",description:\"print the source code for the constraints\",details:\"\\n      This command will print the Prolog source code used by the constraints engine. Adding the `-v,--verbose` flag will print the *full* source code, including the fact database automatically compiled from the workspace manifests.\\n    \",examples:[[\"Prints the source code\",\"yarn constraints source\"],[\"Print the source code and the fact database\",\"yarn constraints source -v\"]]})}async execute(){let{Constraints:r}=await Promise.resolve().then(()=>(f2(),A2)),o=await Ke.find(this.context.cwd,this.context.plugins),{project:a}=await kt.find(o,this.context.cwd),n=await r.find(a);this.context.stdout.write(this.verbose?n.fullSource:n.source)}};Ge();Ge();qt();l2();var OE=class extends ut{constructor(){super(...arguments);this.fix=ge.Boolean(\"--fix\",!1,{description:\"Attempt to automatically fix unambiguous issues, following a multi-pass process\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"constraints\"]]}static{this.usage=it.Usage({category:\"Constraints-related commands\",description:\"check that the project constraints are met\",details:`\n      This command will run constraints on your project and emit errors for each one that is found but isn't met. If any error is emitted the process will exit with a non-zero exit code.\n\n      If the \\`--fix\\` flag is used, Yarn will attempt to automatically fix the issues the best it can, following a multi-pass process (with a maximum of 10 iterations). Some ambiguous patterns cannot be autofixed, in which case you'll have to manually specify the right resolution.\n\n      For more information as to how to write constraints, please consult our dedicated page on our website: https://yarnpkg.com/features/constraints.\n    `,examples:[[\"Check that all constraints are satisfied\",\"yarn constraints\"],[\"Autofix all unmet constraints\",\"yarn constraints --fix\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await kt.find(r,this.context.cwd);await o.restoreInstallState();let a=await o.loadUserConfig(),n;if(a?.constraints)n=new FE(o);else{let{Constraints:h}=await Promise.resolve().then(()=>(f2(),A2));n=await h.find(o)}let u,A=!1,p=!1;for(let h=this.fix?10:1;h>0;--h){let E=await n.process();if(!E)break;let{changedWorkspaces:I,remainingErrors:v}=ik(o,E,{fix:this.fix}),x=[];for(let[C,R]of I){let L=C.manifest.indent;C.manifest=new Ut,C.manifest.indent=L,C.manifest.load(R),x.push(C.persistManifest())}if(await Promise.all(x),!(I.size>0&&h>1)){u=Wde(v,{configuration:r}),A=!1,p=!0;for(let[,C]of v)for(let R of C)R.fixable?A=!0:p=!1}}if(u.children.length===0)return 0;if(A){let h=p?`Those errors can all be fixed by running ${pe.pretty(r,\"yarn constraints --fix\",pe.Type.CODE)}`:`Errors prefixed by '\\u2699' can be fixed by running ${pe.pretty(r,\"yarn constraints --fix\",pe.Type.CODE)}`;await Rt.start({configuration:r,stdout:this.context.stdout,includeNames:!1,includeFooter:!1},async E=>{E.reportInfo(0,h),E.reportSeparator()})}return u.children=He.sortMap(u.children,h=>h.value[1]),fs.emitTree(u,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1}),1}};l2();var adt={configuration:{enableConstraintsChecks:{description:\"If true, constraints will run during installs\",type:\"BOOLEAN\",default:!1},constraintsPath:{description:\"The path of the constraints file.\",type:\"ABSOLUTE_PATH\",default:\"./constraints.pro\"}},commands:[LE,ME,OE],hooks:{async validateProjectAfterInstall(t,{reportError:e}){if(!t.configuration.get(\"enableConstraintsChecks\"))return;let r=await t.loadUserConfig(),o;if(r?.constraints)o=new FE(t);else{let{Constraints:u}=await Promise.resolve().then(()=>(f2(),A2));o=await u.find(t)}let a=await o.process();if(!a)return;let{remainingErrors:n}=ik(t,a);if(n.size!==0)if(t.configuration.isCI)for(let[u,A]of n)for(let p of A)e(84,`${pe.pretty(t.configuration,u.anchoredLocator,pe.Type.IDENT)}: ${p.text}`);else e(84,`Constraint check failed; run ${pe.pretty(t.configuration,\"yarn constraints\",pe.Type.CODE)} for more details`)}}},ldt=adt;var mH={};Vt(mH,{CreateCommand:()=>UE,DlxCommand:()=>_E,default:()=>udt});Ge();qt();var UE=class extends ut{constructor(){super(...arguments);this.pkg=ge.String(\"-p,--package\",{description:\"The package to run the provided command from\"});this.quiet=ge.Boolean(\"-q,--quiet\",!1,{description:\"Only report critical errors instead of printing the full install logs\"});this.command=ge.String();this.args=ge.Proxy()}static{this.paths=[[\"create\"]]}async execute(){let r=[];this.pkg&&r.push(\"--package\",this.pkg),this.quiet&&r.push(\"--quiet\");let o=this.command.replace(/^(@[^@/]+)(@|$)/,\"$1/create$2\"),a=G.parseDescriptor(o),n=a.name.match(/^create(-|$)/)?a:a.scope?G.makeIdent(a.scope,`create-${a.name}`):G.makeIdent(null,`create-${a.name}`),u=G.stringifyIdent(n);return a.range!==\"unknown\"&&(u+=`@${a.range}`),this.cli.run([\"dlx\",...r,u,...this.args])}};Ge();Ge();Pt();qt();var _E=class extends ut{constructor(){super(...arguments);this.packages=ge.Array(\"-p,--package\",{description:\"The package(s) to install before running the command\"});this.quiet=ge.Boolean(\"-q,--quiet\",!1,{description:\"Only report critical errors instead of printing the full install logs\"});this.command=ge.String();this.args=ge.Proxy()}static{this.paths=[[\"dlx\"]]}static{this.usage=it.Usage({description:\"run a package in a temporary environment\",details:\"\\n      This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\\n\\n      By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\\n\\n      Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\\n    \",examples:[[\"Use create-react-app to create a new React app\",\"yarn dlx create-react-app ./my-app\"],[\"Install multiple packages for a single command\",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e \"console.log('hello!')\"`]]})}async execute(){return Ke.telemetry=null,await oe.mktempPromise(async r=>{let o=V.join(r,`dlx-${process.pid}`);await oe.mkdirPromise(o),await oe.writeFilePromise(V.join(o,\"package.json\"),`{}\n`),await oe.writeFilePromise(V.join(o,\"yarn.lock\"),\"\");let a=V.join(o,\".yarnrc.yml\"),n=await Ke.findProjectCwd(this.context.cwd),A={enableGlobalCache:!(await Ke.find(this.context.cwd,null,{strict:!1})).get(\"enableGlobalCache\"),enableTelemetry:!1,logFilters:[{code:Ku(68),level:pe.LogLevel.Discard}]},p=n!==null?V.join(n,\".yarnrc.yml\"):null;p!==null&&oe.existsSync(p)?(await oe.copyFilePromise(p,a),await Ke.updateConfiguration(o,L=>{let U=He.toMerged(L,A);return Array.isArray(L.plugins)&&(U.plugins=L.plugins.map(z=>{let te=typeof z==\"string\"?z:z.path,ae=ue.isAbsolute(te)?te:ue.resolve(ue.fromPortablePath(n),te);return typeof z==\"string\"?ae:{path:ae,spec:z.spec}})),U})):await oe.writeJsonPromise(a,A);let h=this.packages??[this.command],E=G.parseDescriptor(this.command).name,I=await this.cli.run([\"add\",\"--fixed\",\"--\",...h],{cwd:o,quiet:this.quiet});if(I!==0)return I;this.quiet||this.context.stdout.write(`\n`);let v=await Ke.find(o,this.context.plugins),{project:x,workspace:C}=await kt.find(v,o);if(C===null)throw new sr(x.cwd,o);await x.restoreInstallState();let R=await An.getWorkspaceAccessibleBinaries(C);return R.has(E)===!1&&R.size===1&&typeof this.packages>\"u\"&&(E=Array.from(R)[0][0]),await An.executeWorkspaceAccessibleBinary(C,E,this.args,{packageAccessibleBinaries:R,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};var cdt={commands:[UE,_E]},udt=cdt;var CH={};Vt(CH,{ExecFetcher:()=>h2,ExecResolver:()=>g2,default:()=>pdt,execUtils:()=>lk});Ge();Ge();Pt();var fA=\"exec:\";var lk={};Vt(lk,{loadGeneratorFile:()=>p2,makeLocator:()=>EH,makeSpec:()=>yme,parseSpec:()=>yH});Ge();Pt();function yH(t){let{params:e,selector:r}=G.parseRange(t),o=ue.toPortablePath(r);return{parentLocator:e&&typeof e.locator==\"string\"?G.parseLocator(e.locator):null,path:o}}function yme({parentLocator:t,path:e,generatorHash:r,protocol:o}){let a=t!==null?{locator:G.stringifyLocator(t)}:{},n=typeof r<\"u\"?{hash:r}:{};return G.makeRange({protocol:o,source:e,selector:e,params:{...n,...a}})}function EH(t,{parentLocator:e,path:r,generatorHash:o,protocol:a}){return G.makeLocator(t,yme({parentLocator:e,path:r,generatorHash:o,protocol:a}))}async function p2(t,e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(t,{protocol:e}),n=V.isAbsolute(a)?{packageFs:new gn(It.root),prefixPath:It.dot,localPath:It.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new gn(It.root),prefixPath:V.relative(It.root,n.localPath)}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=V.join(u.prefixPath,a);return await A.readFilePromise(p,\"utf8\")}var h2=class{supports(e,r){return!!e.reference.startsWith(fA)}getLocalPath(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:fA});if(V.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:V.resolve(n,a)}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async fetchFromDisk(e,r){let o=await p2(e.reference,fA,r);return oe.mktempPromise(async a=>{let n=V.join(a,\"generator.js\");return await oe.writeFilePromise(n,o),oe.mktempPromise(async u=>{if(await this.generatePackage(u,e,n,r),!oe.existsSync(V.join(u,\"build\")))throw new Error(\"The script should have generated a build directory\");return await $i.makeArchiveFromDirectory(V.join(u,\"build\"),{prefixPath:G.getIdentVendorPath(e),compressionLevel:r.project.configuration.get(\"compressionLevel\")})})})}async generatePackage(e,r,o,a){return await oe.mktempPromise(async n=>{let u=await An.makeScriptEnv({project:a.project,binFolder:n}),A=V.join(e,\"runtime.js\");return await oe.mktempPromise(async p=>{let h=V.join(p,\"buildfile.log\"),E=V.join(e,\"generator\"),I=V.join(e,\"build\");await oe.mkdirPromise(E),await oe.mkdirPromise(I);let v={tempDir:ue.fromPortablePath(E),buildDir:ue.fromPortablePath(I),locator:G.stringifyLocator(r)};await oe.writeFilePromise(A,`\n          // Expose 'Module' as a global variable\n          Object.defineProperty(global, 'Module', {\n            get: () => require('module'),\n            configurable: true,\n            enumerable: false,\n          });\n\n          // Expose non-hidden built-in modules as global variables\n          for (const name of Module.builtinModules.filter((name) => name !== 'module' && !name.startsWith('_'))) {\n            Object.defineProperty(global, name, {\n              get: () => require(name),\n              configurable: true,\n              enumerable: false,\n            });\n          }\n\n          // Expose the 'execEnv' global variable\n          Object.defineProperty(global, 'execEnv', {\n            value: {\n              ...${JSON.stringify(v)},\n            },\n            enumerable: true,\n          });\n        `);let x=u.NODE_OPTIONS||\"\",C=/\\s*--require\\s+\\S*\\.pnp\\.c?js\\s*/g;x=x.replace(C,\" \").trim(),u.NODE_OPTIONS=x;let{stdout:R,stderr:L}=a.project.configuration.getSubprocessStreams(h,{header:`# This file contains the result of Yarn generating a package (${G.stringifyLocator(r)})\n`,prefix:G.prettyLocator(a.project.configuration,r),report:a.report}),{code:U}=await Ur.pipevp(process.execPath,[\"--require\",ue.fromPortablePath(A),ue.fromPortablePath(o),G.stringifyIdent(r)],{cwd:e,env:u,stdin:null,stdout:R,stderr:L});if(U!==0)throw oe.detachTemp(p),new Error(`Package generation failed (exit code ${U}, logs can be found here: ${pe.pretty(a.project.configuration,h,pe.Type.PATH)})`)})})}};Ge();Ge();var Adt=2,g2=class{supportsDescriptor(e,r){return!!e.range.startsWith(fA)}supportsLocator(e,r){return!!e.reference.startsWith(fA)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let{path:a,parentLocator:n}=yH(e.range);if(n===null)throw new Error(\"Assertion failed: The descriptor should have been bound\");let u=await p2(G.makeRange({protocol:fA,source:a,selector:a,params:{locator:G.stringifyLocator(n)}}),fA,o.fetchOptions),A=wn.makeHash(`${Adt}`,u).slice(0,6);return[EH(e,{parentLocator:n,path:a,generatorHash:A,protocol:fA})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await He.releaseAfterUseAsync(async()=>await Ut.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||\"0.0.0\",languageName:a.languageName||r.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var fdt={fetchers:[h2],resolvers:[g2]},pdt=fdt;var IH={};Vt(IH,{FileFetcher:()=>E2,FileResolver:()=>C2,TarballFileFetcher:()=>w2,TarballFileResolver:()=>I2,default:()=>ddt,fileUtils:()=>Yg});Ge();Pt();var HE=/^(?:[a-zA-Z]:[\\\\/]|\\.{0,2}\\/)/,d2=/^[^?]*\\.(?:tar\\.gz|tgz)(?:::.*)?$/,Ui=\"file:\";var Yg={};Vt(Yg,{fetchArchiveFromLocator:()=>y2,makeArchiveFromLocator:()=>ck,makeBufferFromLocator:()=>wH,makeLocator:()=>qE,makeSpec:()=>Eme,parseSpec:()=>m2});Ge();Pt();function m2(t){let{params:e,selector:r}=G.parseRange(t),o=ue.toPortablePath(r);return{parentLocator:e&&typeof e.locator==\"string\"?G.parseLocator(e.locator):null,path:o}}function Eme({parentLocator:t,path:e,hash:r,protocol:o}){let a=t!==null?{locator:G.stringifyLocator(t)}:{},n=typeof r<\"u\"?{hash:r}:{};return G.makeRange({protocol:o,source:e,selector:e,params:{...n,...a}})}function qE(t,{parentLocator:e,path:r,hash:o,protocol:a}){return G.makeLocator(t,Eme({parentLocator:e,path:r,hash:o,protocol:a}))}async function y2(t,e){let{parentLocator:r,path:o}=G.parseFileStyleRange(t.reference,{protocol:Ui}),a=V.isAbsolute(o)?{packageFs:new gn(It.root),prefixPath:It.dot,localPath:It.root}:await e.fetcher.fetch(r,e),n=a.localPath?{packageFs:new gn(It.root),prefixPath:V.relative(It.root,a.localPath)}:a;a!==n&&a.releaseFs&&a.releaseFs();let u=n.packageFs,A=V.join(n.prefixPath,o);return await He.releaseAfterUseAsync(async()=>await u.readFilePromise(A),n.releaseFs)}async function ck(t,{protocol:e,fetchOptions:r,inMemory:o=!1}){let{parentLocator:a,path:n}=G.parseFileStyleRange(t.reference,{protocol:e}),u=V.isAbsolute(n)?{packageFs:new gn(It.root),prefixPath:It.dot,localPath:It.root}:await r.fetcher.fetch(a,r),A=u.localPath?{packageFs:new gn(It.root),prefixPath:V.relative(It.root,u.localPath)}:u;u!==A&&u.releaseFs&&u.releaseFs();let p=A.packageFs,h=V.join(A.prefixPath,n);return await He.releaseAfterUseAsync(async()=>await $i.makeArchiveFromDirectory(h,{baseFs:p,prefixPath:G.getIdentVendorPath(t),compressionLevel:r.project.configuration.get(\"compressionLevel\"),inMemory:o}),A.releaseFs)}async function wH(t,{protocol:e,fetchOptions:r}){return(await ck(t,{protocol:e,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var E2=class{supports(e,r){return!!e.reference.startsWith(Ui)}getLocalPath(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:Ui});if(V.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:V.resolve(n,a)}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async fetchFromDisk(e,r){return ck(e,{protocol:Ui,fetchOptions:r})}};Ge();Ge();var hdt=2,C2=class{supportsDescriptor(e,r){return e.range.match(HE)?!0:!!e.range.startsWith(Ui)}supportsLocator(e,r){return!!e.reference.startsWith(Ui)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return HE.test(e.range)&&(e=G.makeDescriptor(e,`${Ui}${e.range}`)),G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let{path:a,parentLocator:n}=m2(e.range);if(n===null)throw new Error(\"Assertion failed: The descriptor should have been bound\");let u=await wH(G.makeLocator(e,G.makeRange({protocol:Ui,source:a,selector:a,params:{locator:G.stringifyLocator(n)}})),{protocol:Ui,fetchOptions:o.fetchOptions}),A=wn.makeHash(`${hdt}`,u).slice(0,6);return[qE(e,{parentLocator:n,path:a,hash:A,protocol:Ui})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await He.releaseAfterUseAsync(async()=>await Ut.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||\"0.0.0\",languageName:a.languageName||r.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};Ge();var w2=class{supports(e,r){return d2.test(e.reference)?!!e.reference.startsWith(Ui):!1}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromDisk(e,r){let o=await y2(e,r);return await $i.convertToZip(o,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ge();Ge();Ge();var I2=class{supportsDescriptor(e,r){return d2.test(e.range)?!!(e.range.startsWith(Ui)||HE.test(e.range)):!1}supportsLocator(e,r){return d2.test(e.reference)?!!e.reference.startsWith(Ui):!1}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return HE.test(e.range)&&(e=G.makeDescriptor(e,`${Ui}${e.range}`)),G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let{path:a,parentLocator:n}=m2(e.range);if(n===null)throw new Error(\"Assertion failed: The descriptor should have been bound\");let u=qE(e,{parentLocator:n,path:a,hash:\"\",protocol:Ui}),A=await y2(u,o.fetchOptions),p=wn.makeHash(A).slice(0,6);return[qE(e,{parentLocator:n,path:a,hash:p,protocol:Ui})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await He.releaseAfterUseAsync(async()=>await Ut.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||\"0.0.0\",languageName:a.languageName||r.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var gdt={fetchers:[w2,E2],resolvers:[I2,C2]},ddt=gdt;var DH={};Vt(DH,{GithubFetcher:()=>B2,default:()=>ydt,githubUtils:()=>uk});Ge();Pt();var uk={};Vt(uk,{invalidGithubUrlMessage:()=>Ime,isGithubUrl:()=>BH,parseGithubUrl:()=>vH});var Cme=Ze(ve(\"querystring\")),wme=[/^https?:\\/\\/(?:([^/]+?)@)?github.com\\/([^/#]+)\\/([^/#]+)\\/tarball\\/([^/#]+)(?:#(.*))?$/,/^https?:\\/\\/(?:([^/]+?)@)?github.com\\/([^/#]+)\\/([^/#]+?)(?:\\.git)?(?:#(.*))?$/];function BH(t){return t?wme.some(e=>!!t.match(e)):!1}function vH(t){let e;for(let A of wme)if(e=t.match(A),e)break;if(!e)throw new Error(Ime(t));let[,r,o,a,n=\"master\"]=e,{commit:u}=Cme.default.parse(n);return n=u||n.replace(/[^:]*:/,\"\"),{auth:r,username:o,reponame:a,treeish:n}}function Ime(t){return`Input cannot be parsed as a valid GitHub URL ('${t}').`}var B2=class{supports(e,r){return!!BH(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o=await sn.get(this.getLocatorUrl(e,r),{configuration:r.project.configuration});return await oe.mktempPromise(async a=>{let n=new gn(a);await $i.extractArchiveTo(o,n,{stripComponents:1});let u=ia.splitRepoUrl(e.reference),A=V.join(a,\"package.tgz\");await An.prepareExternalProject(a,A,{configuration:r.project.configuration,report:r.report,workspace:u.extra.workspace,locator:e});let p=await oe.readFilePromise(A);return await $i.convertToZip(p,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,r){let{auth:o,username:a,reponame:n,treeish:u}=vH(e.reference);return`https://${o?`${o}@`:\"\"}github.com/${a}/${n}/archive/${u}.tar.gz`}};var mdt={hooks:{async fetchHostedRepository(t,e,r){if(t!==null)return t;let o=new B2;if(!o.supports(e,r))return null;try{return await o.fetch(e,r)}catch{return null}}}},ydt=mdt;var PH={};Vt(PH,{TarballHttpFetcher:()=>D2,TarballHttpResolver:()=>P2,default:()=>Cdt});Ge();function v2(t){let e;try{e=new URL(t)}catch{return!1}return!(e.protocol!==\"http:\"&&e.protocol!==\"https:\"||!e.pathname.match(/(\\.tar\\.gz|\\.tgz|\\/[^.]+)$/))}var D2=class{supports(e,r){return v2(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o=await sn.get(e.reference,{configuration:r.project.configuration});return await $i.convertToZip(o,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ge();Ge();var P2=class{supportsDescriptor(e,r){return v2(e.range)}supportsLocator(e,r){return v2(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){return[G.convertDescriptorToLocator(e)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await He.releaseAfterUseAsync(async()=>await Ut.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||\"0.0.0\",languageName:a.languageName||r.project.configuration.get(\"defaultLanguageName\"),linkType:\"HARD\",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var Edt={fetchers:[D2],resolvers:[P2]},Cdt=Edt;var bH={};Vt(bH,{InitCommand:()=>jE,default:()=>Idt});Ge();Ge();Pt();qt();var jE=class extends ut{constructor(){super(...arguments);this.private=ge.Boolean(\"-p,--private\",!1,{description:\"Initialize a private package\"});this.workspace=ge.Boolean(\"-w,--workspace\",!1,{description:\"Initialize a workspace root with a `packages/` directory\"});this.install=ge.String(\"-i,--install\",!1,{tolerateBoolean:!0,description:\"Initialize a package with a specific bundle that will be locked in the project\"});this.name=ge.String(\"-n,--name\",{description:\"Initialize a package with the given name\"});this.usev2=ge.Boolean(\"-2\",!1,{hidden:!0});this.yes=ge.Boolean(\"-y,--yes\",{hidden:!0})}static{this.paths=[[\"init\"]]}static{this.usage=it.Usage({description:\"create a new package\",details:\"\\n      This command will setup a new package in your local directory.\\n\\n      If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\\n\\n      If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\\n\\n      If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\\n\\n      The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\\n    \",examples:[[\"Create a new package in the local directory\",\"yarn init\"],[\"Create a new private package in the local directory\",\"yarn init -p\"],[\"Create a new package and store the Yarn release inside\",\"yarn init -i=latest\"],[\"Create a new private package and defines it as a workspace root\",\"yarn init -w\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=typeof this.install==\"string\"?this.install:this.usev2||this.install===!0?\"latest\":null;return o!==null?await this.executeProxy(r,o):await this.executeRegular(r)}async executeProxy(r,o){if(r.projectCwd!==null&&r.projectCwd!==this.context.cwd)throw new st(\"Cannot use the --install flag from within a project subdirectory\");oe.existsSync(this.context.cwd)||await oe.mkdirPromise(this.context.cwd,{recursive:!0});let a=V.join(this.context.cwd,dr.lockfile);oe.existsSync(a)||await oe.writeFilePromise(a,\"\");let n=await this.cli.run([\"set\",\"version\",o],{quiet:!0});if(n!==0)return n;let u=[];return this.private&&u.push(\"-p\"),this.workspace&&u.push(\"-w\"),this.name&&u.push(`-n=${this.name}`),this.yes&&u.push(\"-y\"),await oe.mktempPromise(async A=>{let{code:p}=await Ur.pipevp(\"yarn\",[\"init\",...u],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await An.makeScriptEnv({binFolder:A})});return p})}async executeRegular(r){let o=null;try{o=(await kt.find(r,this.context.cwd)).project}catch{o=null}oe.existsSync(this.context.cwd)||await oe.mkdirPromise(this.context.cwd,{recursive:!0});let a=await Ut.tryFind(this.context.cwd),n=a??new Ut,u=Object.fromEntries(r.get(\"initFields\").entries());n.load(u),n.name=n.name??G.makeIdent(r.get(\"initScope\"),this.name??V.basename(this.context.cwd)),n.packageManager=nn&&He.isTaggedYarnVersion(nn)?`yarn@${nn}`:null,(!a&&this.workspace||this.private)&&(n.private=!0),this.workspace&&n.workspaceDefinitions.length===0&&(await oe.mkdirPromise(V.join(this.context.cwd,\"packages\"),{recursive:!0}),n.workspaceDefinitions=[{pattern:\"packages/*\"}]);let A={};n.exportTo(A);let p=V.join(this.context.cwd,Ut.fileName);await oe.changeFilePromise(p,`${JSON.stringify(A,null,2)}\n`,{automaticNewlines:!0});let h=[p],E=V.join(this.context.cwd,\"README.md\");if(oe.existsSync(E)||(await oe.writeFilePromise(E,`# ${G.stringifyIdent(n.name)}\n`),h.push(E)),!o||o.cwd===this.context.cwd){let I=V.join(this.context.cwd,dr.lockfile);oe.existsSync(I)||(await oe.writeFilePromise(I,\"\"),h.push(I));let x=[\".yarn/*\",\"!.yarn/patches\",\"!.yarn/plugins\",\"!.yarn/releases\",\"!.yarn/sdks\",\"!.yarn/versions\",\"\",\"# Swap the comments on the following lines if you wish to use zero-installs\",\"# In that case, don't forget to run `yarn config set enableGlobalCache false`!\",\"# Documentation here: https://yarnpkg.com/features/caching#zero-installs\",\"\",\"#!.yarn/cache\",\".pnp.*\"].map(le=>`${le}\n`).join(\"\"),C=V.join(this.context.cwd,\".gitignore\");oe.existsSync(C)||(await oe.writeFilePromise(C,x),h.push(C));let L=[\"/.yarn/**            linguist-vendored\",\"/.yarn/releases/*    binary\",\"/.yarn/plugins/**/*  binary\",\"/.pnp.*              binary linguist-generated\"].map(le=>`${le}\n`).join(\"\"),U=V.join(this.context.cwd,\".gitattributes\");oe.existsSync(U)||(await oe.writeFilePromise(U,L),h.push(U));let z={\"*\":{endOfLine:\"lf\",insertFinalNewline:!0},\"*.{js,json,yml}\":{charset:\"utf-8\",indentStyle:\"space\",indentSize:2}};He.mergeIntoTarget(z,r.get(\"initEditorConfig\"));let te=`root = true\n`;for(let[le,ce]of Object.entries(z)){te+=`\n[${le}]\n`;for(let[Ce,de]of Object.entries(ce)){let Be=Ce.replace(/[A-Z]/g,Ee=>`_${Ee.toLowerCase()}`);te+=`${Be} = ${de}\n`}}let ae=V.join(this.context.cwd,\".editorconfig\");oe.existsSync(ae)||(await oe.writeFilePromise(ae,te),h.push(ae)),await this.cli.run([\"install\"],{quiet:!0}),oe.existsSync(V.join(this.context.cwd,\".git\"))||(await Ur.execvp(\"git\",[\"init\"],{cwd:this.context.cwd}),await Ur.execvp(\"git\",[\"add\",\"--\",...h],{cwd:this.context.cwd}),await Ur.execvp(\"git\",[\"commit\",\"--allow-empty\",\"-m\",\"First commit\"],{cwd:this.context.cwd}))}}};var wdt={configuration:{initScope:{description:\"Scope used when creating packages via the init command\",type:\"STRING\",default:null},initFields:{description:\"Additional fields to set when creating packages via the init command\",type:\"MAP\",valueDefinition:{description:\"\",type:\"ANY\"}},initEditorConfig:{description:\"Extra rules to define in the generator editorconfig\",type:\"MAP\",valueDefinition:{description:\"\",type:\"ANY\"}}},commands:[jE]},Idt=wdt;var kq={};Vt(kq,{SearchCommand:()=>oC,UpgradeInteractiveCommand:()=>aC,default:()=>uIt});Ge();var vme=Ze(ve(\"os\"));function GE({stdout:t}){if(vme.default.endianness()===\"BE\")throw new Error(\"Interactive commands cannot be used on big-endian systems because ink depends on yoga-layout-prebuilt which only supports little-endian architectures\");if(!t.isTTY)throw new Error(\"Interactive commands can only be used inside a TTY environment\")}qt();var Lye=Ze(YH()),WH={appId:\"OFCNCOG2CU\",apiKey:\"6fe4476ee5a1832882e326b506d14126\",indexName:\"npm-search\"},Eyt=(0,Lye.default)(WH.appId,WH.apiKey).initIndex(WH.indexName),KH=async(t,e=0)=>await Eyt.search(t,{analyticsTags:[\"yarn-plugin-interactive-tools\"],attributesToRetrieve:[\"name\",\"version\",\"owner\",\"repository\",\"humanDownloadsLast30Days\"],page:e,hitsPerPage:10});var vB=[\"regular\",\"dev\",\"peer\"],oC=class extends ut{static{this.paths=[[\"search\"]]}static{this.usage=it.Usage({category:\"Interactive commands\",description:\"open the search interface\",details:`\n    This command opens a fullscreen terminal interface where you can search for and install packages from the npm registry.\n    `,examples:[[\"Open the search window\",\"yarn search\"]]})}async execute(){GE(this.context);let{Gem:e}=await Promise.resolve().then(()=>(Zk(),Eq)),{ScrollableItems:r}=await Promise.resolve().then(()=>(rQ(),tQ)),{useKeypress:o}=await Promise.resolve().then(()=>(wB(),Xwe)),{useMinistore:a}=await Promise.resolve().then(()=>(Dq(),vq)),{renderForm:n}=await Promise.resolve().then(()=>(oQ(),sQ)),{default:u}=await Promise.resolve().then(()=>Ze(aIe())),{Box:A,Text:p}=await Promise.resolve().then(()=>Ze(ic())),{default:h,useEffect:E,useState:I}=await Promise.resolve().then(()=>Ze(an())),v=await Ke.find(this.context.cwd,this.context.plugins),x=()=>h.createElement(A,{flexDirection:\"row\"},h.createElement(A,{flexDirection:\"column\",width:48},h.createElement(A,null,h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<up>\"),\"/\",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<down>\"),\" to move between packages.\")),h.createElement(A,null,h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<space>\"),\" to select a package.\")),h.createElement(A,null,h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<space>\"),\" again to change the target.\"))),h.createElement(A,{flexDirection:\"column\"},h.createElement(A,{marginLeft:1},h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<enter>\"),\" to install the selected packages.\")),h.createElement(A,{marginLeft:1},h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<ctrl+c>\"),\" to abort.\")))),C=()=>h.createElement(h.Fragment,null,h.createElement(A,{width:15},h.createElement(p,{bold:!0,underline:!0,color:\"gray\"},\"Owner\")),h.createElement(A,{width:11},h.createElement(p,{bold:!0,underline:!0,color:\"gray\"},\"Version\")),h.createElement(A,{width:10},h.createElement(p,{bold:!0,underline:!0,color:\"gray\"},\"Downloads\"))),R=()=>h.createElement(A,{width:17},h.createElement(p,{bold:!0,underline:!0,color:\"gray\"},\"Target\")),L=({hit:de,active:Be})=>{let[Ee,g]=a(de.name,null);o({active:Be},(Ae,ne)=>{if(ne.name!==\"space\")return;if(!Ee){g(vB[0]);return}let Z=vB.indexOf(Ee)+1;Z===vB.length?g(null):g(vB[Z])},[Ee,g]);let me=G.parseIdent(de.name),we=G.prettyIdent(v,me);return h.createElement(A,null,h.createElement(A,{width:45},h.createElement(p,{bold:!0,wrap:\"wrap\"},we)),h.createElement(A,{width:14,marginLeft:1},h.createElement(p,{bold:!0,wrap:\"truncate\"},de.owner.name)),h.createElement(A,{width:10,marginLeft:1},h.createElement(p,{italic:!0,wrap:\"truncate\"},de.version)),h.createElement(A,{width:16,marginLeft:1},h.createElement(p,null,de.humanDownloadsLast30Days)))},U=({name:de,active:Be})=>{let[Ee]=a(de,null),g=G.parseIdent(de);return h.createElement(A,null,h.createElement(A,{width:47},h.createElement(p,{bold:!0},\" - \",G.prettyIdent(v,g))),vB.map(me=>h.createElement(A,{key:me,width:14,marginLeft:1},h.createElement(p,null,\" \",h.createElement(e,{active:Ee===me}),\" \",h.createElement(p,{bold:!0},me)))))},z=()=>h.createElement(A,{marginTop:1},h.createElement(p,null,\"Powered by Algolia.\")),ae=await n(({useSubmit:de})=>{let Be=a();de(Be);let Ee=Array.from(Be.keys()).filter(H=>Be.get(H)!==null),[g,me]=I(\"\"),[we,Ae]=I(0),[ne,Z]=I([]),xe=H=>{H.match(/\\t| /)||me(H)},Ne=async()=>{Ae(0);let H=await KH(g);H.query===g&&Z(H.hits)},ht=async()=>{let H=await KH(g,we+1);H.query===g&&H.page-1===we&&(Ae(H.page),Z([...ne,...H.hits]))};return E(()=>{g?Ne():Z([])},[g]),h.createElement(A,{flexDirection:\"column\"},h.createElement(x,null),h.createElement(A,{flexDirection:\"row\",marginTop:1},h.createElement(p,{bold:!0},\"Search: \"),h.createElement(A,{width:41},h.createElement(u,{value:g,onChange:xe,placeholder:\"i.e. babel, webpack, react...\",showCursor:!1})),h.createElement(C,null)),ne.length?h.createElement(r,{radius:2,loop:!1,children:ne.map(H=>h.createElement(L,{key:H.name,hit:H,active:!1})),willReachEnd:ht}):h.createElement(p,{color:\"gray\"},\"Start typing...\"),h.createElement(A,{flexDirection:\"row\",marginTop:1},h.createElement(A,{width:49},h.createElement(p,{bold:!0},\"Selected:\")),h.createElement(R,null)),Ee.length?Ee.map(H=>h.createElement(U,{key:H,name:H,active:!1})):h.createElement(p,{color:\"gray\"},\"No selected packages...\"),h.createElement(z,null))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof ae>\"u\")return 1;let le=Array.from(ae.keys()).filter(de=>ae.get(de)===\"regular\"),ce=Array.from(ae.keys()).filter(de=>ae.get(de)===\"dev\"),Ce=Array.from(ae.keys()).filter(de=>ae.get(de)===\"peer\");return le.length&&await this.cli.run([\"add\",...le]),ce.length&&await this.cli.run([\"add\",\"--dev\",...ce]),Ce&&await this.cli.run([\"add\",\"--peer\",...Ce]),0}};Ge();qt();f_();var hIe=Ze(Jn()),pIe=/^((?:[\\^~]|>=?)?)([0-9]+)(\\.[0-9]+)(\\.[0-9]+)((?:-\\S+)?)$/,gIe=(t,e)=>t.length>0?[t.slice(0,e)].concat(gIe(t.slice(e),e)):[],aC=class extends ut{static{this.paths=[[\"upgrade-interactive\"]]}static{this.usage=it.Usage({category:\"Interactive commands\",description:\"open the upgrade interface\",details:`\n      This command opens a fullscreen terminal interface where you can see any out of date packages used by your application, their status compared to the latest versions available on the remote registry, and select packages to upgrade.\n    `,examples:[[\"Open the upgrade window\",\"yarn upgrade-interactive\"]]})}async execute(){GE(this.context);let{ItemOptions:e}=await Promise.resolve().then(()=>(fIe(),AIe)),{Pad:r}=await Promise.resolve().then(()=>(xq(),uIe)),{ScrollableItems:o}=await Promise.resolve().then(()=>(rQ(),tQ)),{useMinistore:a}=await Promise.resolve().then(()=>(Dq(),vq)),{renderForm:n}=await Promise.resolve().then(()=>(oQ(),sQ)),{Box:u,Text:A}=await Promise.resolve().then(()=>Ze(ic())),{default:p,useEffect:h,useRef:E,useState:I}=await Promise.resolve().then(()=>Ze(an())),v=await Ke.find(this.context.cwd,this.context.plugins),{project:x,workspace:C}=await kt.find(v,this.context.cwd),R=await Gr.find(v);if(!C)throw new sr(x.cwd,this.context.cwd);await x.restoreInstallState({restoreResolutions:!1});let L=this.context.stdout.rows-7,U=(me,we)=>{let Ae=gpe(me,we),ne=\"\";for(let Z of Ae)Z.added?ne+=pe.pretty(v,Z.value,\"green\"):Z.removed||(ne+=Z.value);return ne},z=(me,we)=>{if(me===we)return we;let Ae=G.parseRange(me),ne=G.parseRange(we),Z=Ae.selector.match(pIe),xe=ne.selector.match(pIe);if(!Z||!xe)return U(me,we);let Ne=[\"gray\",\"red\",\"yellow\",\"green\",\"magenta\"],ht=null,H=\"\";for(let rt=1;rt<Ne.length;++rt)ht!==null||Z[rt]!==xe[rt]?(ht===null&&(ht=Ne[rt-1]),H+=pe.pretty(v,xe[rt],ht)):H+=xe[rt];return H},te=async(me,we,Ae)=>{let ne=await Zc.fetchDescriptorFrom(me,Ae,{project:x,cache:R,preserveModifier:we,workspace:C});return ne!==null?ne.range:me.range},ae=async me=>{let we=hIe.default.valid(me.range)?`^${me.range}`:me.range,[Ae,ne]=await Promise.all([te(me,me.range,we).catch(()=>null),te(me,me.range,\"latest\").catch(()=>null)]),Z=[{value:null,label:me.range}];return Ae&&Ae!==me.range?Z.push({value:Ae,label:z(me.range,Ae)}):Z.push({value:null,label:\"\"}),ne&&ne!==Ae&&ne!==me.range?Z.push({value:ne,label:z(me.range,ne)}):Z.push({value:null,label:\"\"}),Z},le=()=>p.createElement(u,{flexDirection:\"row\"},p.createElement(u,{flexDirection:\"column\",width:49},p.createElement(u,{marginLeft:1},p.createElement(A,null,\"Press \",p.createElement(A,{bold:!0,color:\"cyanBright\"},\"<up>\"),\"/\",p.createElement(A,{bold:!0,color:\"cyanBright\"},\"<down>\"),\" to select packages.\")),p.createElement(u,{marginLeft:1},p.createElement(A,null,\"Press \",p.createElement(A,{bold:!0,color:\"cyanBright\"},\"<left>\"),\"/\",p.createElement(A,{bold:!0,color:\"cyanBright\"},\"<right>\"),\" to select versions.\"))),p.createElement(u,{flexDirection:\"column\"},p.createElement(u,{marginLeft:1},p.createElement(A,null,\"Press \",p.createElement(A,{bold:!0,color:\"cyanBright\"},\"<enter>\"),\" to install.\")),p.createElement(u,{marginLeft:1},p.createElement(A,null,\"Press \",p.createElement(A,{bold:!0,color:\"cyanBright\"},\"<ctrl+c>\"),\" to abort.\")))),ce=()=>p.createElement(u,{flexDirection:\"row\",paddingTop:1,paddingBottom:1},p.createElement(u,{width:50},p.createElement(A,{bold:!0},p.createElement(A,{color:\"greenBright\"},\"?\"),\" Pick the packages you want to upgrade.\")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:\"gray\"},\"Current\")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:\"gray\"},\"Range\")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:\"gray\"},\"Latest\"))),Ce=({active:me,descriptor:we,suggestions:Ae})=>{let[ne,Z]=a(we.descriptorHash,null),xe=G.stringifyIdent(we),Ne=Math.max(0,45-xe.length);return p.createElement(p.Fragment,null,p.createElement(u,null,p.createElement(u,{width:45},p.createElement(A,{bold:!0},G.prettyIdent(v,we)),p.createElement(r,{active:me,length:Ne})),p.createElement(e,{active:me,options:Ae,value:ne,skewer:!0,onChange:Z,sizes:[17,17,17]})))},de=({dependencies:me})=>{let[we,Ae]=I(me.map(()=>null)),ne=E(!0),Z=async xe=>{let Ne=await ae(xe);return Ne.filter(ht=>ht.label!==\"\").length<=1?null:{descriptor:xe,suggestions:Ne}};return h(()=>()=>{ne.current=!1},[]),h(()=>{let xe=Math.trunc(L*1.75),Ne=me.slice(0,xe),ht=me.slice(xe),H=gIe(ht,L),rt=Ne.map(Z).reduce(async(Te,Fe)=>{await Te;let ke=await Fe;ke!==null&&ne.current&&Ae(Ye=>{let be=Ye.findIndex(Ue=>Ue===null),et=[...Ye];return et[be]=ke,et})},Promise.resolve());H.reduce((Te,Fe)=>Promise.all(Fe.map(ke=>Promise.resolve().then(()=>Z(ke)))).then(async ke=>{ke=ke.filter(Ye=>Ye!==null),await Te,ne.current&&Ae(Ye=>{let be=Ye.findIndex(et=>et===null);return Ye.slice(0,be).concat(ke).concat(Ye.slice(be+ke.length))})}),rt).then(()=>{ne.current&&Ae(Te=>Te.filter(Fe=>Fe!==null))})},[]),we.length?p.createElement(o,{radius:L>>1,children:we.map((xe,Ne)=>xe!==null?p.createElement(Ce,{key:Ne,active:!1,descriptor:xe.descriptor,suggestions:xe.suggestions}):p.createElement(A,{key:Ne},\"Loading...\"))}):p.createElement(A,null,\"No upgrades found\")},Ee=await n(({useSubmit:me})=>{me(a());let we=new Map;for(let ne of x.workspaces)for(let Z of[\"dependencies\",\"devDependencies\"])for(let xe of ne.manifest[Z].values())x.tryWorkspaceByDescriptor(xe)===null&&(xe.range.startsWith(\"link:\")||we.set(xe.descriptorHash,xe));let Ae=He.sortMap(we.values(),ne=>G.stringifyDescriptor(ne));return p.createElement(u,{flexDirection:\"column\"},p.createElement(le,null),p.createElement(ce,null),p.createElement(de,{dependencies:Ae}))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof Ee>\"u\")return 1;let g=!1;for(let me of x.workspaces)for(let we of[\"dependencies\",\"devDependencies\"]){let Ae=me.manifest[we];for(let ne of Ae.values()){let Z=Ee.get(ne.descriptorHash);typeof Z<\"u\"&&Z!==null&&(Ae.set(ne.identHash,G.makeDescriptor(ne,Z)),g=!0)}}return g?await x.installWithNewReport({quiet:this.context.quiet,stdout:this.context.stdout},{cache:R}):0}};var cIt={commands:[oC,aC]},uIt=cIt;var Qq={};Vt(Qq,{LinkFetcher:()=>PB,LinkResolver:()=>bB,PortalFetcher:()=>SB,PortalResolver:()=>xB,default:()=>fIt});Ge();Pt();var Zf=\"portal:\",$f=\"link:\";var PB=class{supports(e,r){return!!e.reference.startsWith($f)}getLocalPath(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:$f});if(V.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:V.resolve(n,a)}async fetch(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:$f}),n=V.isAbsolute(a)?{packageFs:new gn(It.root),prefixPath:It.dot,localPath:It.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new gn(It.root),prefixPath:V.relative(It.root,n.localPath),localPath:It.root}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=V.resolve(u.localPath??u.packageFs.getRealPath(),u.prefixPath,a);return n.localPath?{packageFs:new gn(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:It.dot,discardFromLookup:!0,localPath:p}:{packageFs:new qu(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:It.dot,discardFromLookup:!0}}};Ge();Pt();var bB=class{supportsDescriptor(e,r){return!!e.range.startsWith($f)}supportsLocator(e,r){return!!e.reference.startsWith($f)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice($f.length);return[G.makeLocator(e,`${$f}${ue.toPortablePath(a)}`)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){return{...e,version:\"0.0.0\",languageName:r.project.configuration.get(\"defaultLanguageName\"),linkType:\"SOFT\",conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map}}};Ge();Pt();var SB=class{supports(e,r){return!!e.reference.startsWith(Zf)}getLocalPath(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:Zf});if(V.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:V.resolve(n,a)}async fetch(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:Zf}),n=V.isAbsolute(a)?{packageFs:new gn(It.root),prefixPath:It.dot,localPath:It.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new gn(It.root),prefixPath:V.relative(It.root,n.localPath),localPath:It.root}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=V.resolve(u.localPath??u.packageFs.getRealPath(),u.prefixPath,a);return n.localPath?{packageFs:new gn(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:It.dot,localPath:p}:{packageFs:new qu(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:It.dot}}};Ge();Ge();Pt();var xB=class{supportsDescriptor(e,r){return!!e.range.startsWith(Zf)}supportsLocator(e,r){return!!e.reference.startsWith(Zf)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(Zf.length);return[G.makeLocator(e,`${Zf}${ue.toPortablePath(a)}`)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await He.releaseAfterUseAsync(async()=>await Ut.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||\"0.0.0\",languageName:a.languageName||r.project.configuration.get(\"defaultLanguageName\"),linkType:\"SOFT\",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var AIt={fetchers:[PB,SB],resolvers:[bB,xB]},fIt=AIt;var hj={};Vt(hj,{NodeModulesLinker:()=>GB,NodeModulesMode:()=>uj,PnpLooseLinker:()=>YB,default:()=>S1t});Pt();Ge();Pt();Pt();var Rq=(t,e)=>`${t}@${e}`,dIe=(t,e)=>{let r=e.indexOf(\"#\"),o=r>=0?e.substring(r+1):e;return Rq(t,o)};var yIe=(t,e={})=>{let r=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),o=e.check||r>=9,a=e.hoistingLimits||new Map,n={check:o,debugLevel:r,hoistingLimits:a,fastLookupPossible:!0},u;n.debugLevel>=0&&(u=Date.now());let A=EIt(t,n),p=!1,h=0;do{let E=Tq(A,[A],new Set([A.locator]),new Map,n);p=E.anotherRoundNeeded||E.isGraphChanged,n.fastLookupPossible=!1,h++}while(p);if(n.debugLevel>=0&&console.log(`hoist time: ${Date.now()-u}ms, rounds: ${h}`),n.debugLevel>=1){let E=kB(A);if(Tq(A,[A],new Set([A.locator]),new Map,n).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree:\n${E}, next tree:\n${kB(A)}`);let v=EIe(A);if(v)throw new Error(`${v}, after hoisting finished:\n${kB(A)}`)}return n.debugLevel>=2&&console.log(kB(A)),CIt(A)},pIt=t=>{let e=t[t.length-1],r=new Map,o=new Set,a=n=>{if(!o.has(n)){o.add(n);for(let u of n.hoistedDependencies.values())r.set(u.name,u);for(let u of n.dependencies.values())n.peerNames.has(u.name)||a(u)}};return a(e),r},hIt=t=>{let e=t[t.length-1],r=new Map,o=new Set,a=new Set,n=(u,A)=>{if(o.has(u))return;o.add(u);for(let h of u.hoistedDependencies.values())if(!A.has(h.name)){let E;for(let I of t)E=I.dependencies.get(h.name),E&&r.set(E.name,E)}let p=new Set;for(let h of u.dependencies.values())p.add(h.name);for(let h of u.dependencies.values())u.peerNames.has(h.name)||n(h,p)};return n(e,a),r},mIe=(t,e)=>{if(e.decoupled)return e;let{name:r,references:o,ident:a,locator:n,dependencies:u,originalDependencies:A,hoistedDependencies:p,peerNames:h,reasons:E,isHoistBorder:I,hoistPriority:v,dependencyKind:x,hoistedFrom:C,hoistedTo:R}=e,L={name:r,references:new Set(o),ident:a,locator:n,dependencies:new Map(u),originalDependencies:new Map(A),hoistedDependencies:new Map(p),peerNames:new Set(h),reasons:new Map(E),decoupled:!0,isHoistBorder:I,hoistPriority:v,dependencyKind:x,hoistedFrom:new Map(C),hoistedTo:new Map(R)},U=L.dependencies.get(r);return U&&U.ident==L.ident&&L.dependencies.set(r,L),t.dependencies.set(L.name,L),L},gIt=(t,e)=>{let r=new Map([[t.name,[t.ident]]]);for(let a of t.dependencies.values())t.peerNames.has(a.name)||r.set(a.name,[a.ident]);let o=Array.from(e.keys());o.sort((a,n)=>{let u=e.get(a),A=e.get(n);return A.hoistPriority!==u.hoistPriority?A.hoistPriority-u.hoistPriority:A.peerDependents.size!==u.peerDependents.size?A.peerDependents.size-u.peerDependents.size:A.dependents.size-u.dependents.size});for(let a of o){let n=a.substring(0,a.indexOf(\"@\",1)),u=a.substring(n.length+1);if(!t.peerNames.has(n)){let A=r.get(n);A||(A=[],r.set(n,A)),A.indexOf(u)<0&&A.push(u)}}return r},Fq=t=>{let e=new Set,r=(o,a=new Set)=>{if(!a.has(o)){a.add(o);for(let n of o.peerNames)if(!t.peerNames.has(n)){let u=t.dependencies.get(n);u&&!e.has(u)&&r(u,a)}e.add(o)}};for(let o of t.dependencies.values())t.peerNames.has(o.name)||r(o);return e},Tq=(t,e,r,o,a,n=new Set)=>{let u=e[e.length-1];if(n.has(u))return{anotherRoundNeeded:!1,isGraphChanged:!1};n.add(u);let A=wIt(u),p=gIt(u,A),h=t==u?new Map:a.fastLookupPossible?pIt(e):hIt(e),E,I=!1,v=!1,x=new Map(Array.from(p.entries()).map(([R,L])=>[R,L[0]])),C=new Map;do{let R=yIt(t,e,r,h,x,p,o,C,a);R.isGraphChanged&&(v=!0),R.anotherRoundNeeded&&(I=!0),E=!1;for(let[L,U]of p)U.length>1&&!u.dependencies.has(L)&&(x.delete(L),U.shift(),x.set(L,U[0]),E=!0)}while(E);for(let R of u.dependencies.values())if(!u.peerNames.has(R.name)&&!r.has(R.locator)){r.add(R.locator);let L=Tq(t,[...e,R],r,C,a);L.isGraphChanged&&(v=!0),L.anotherRoundNeeded&&(I=!0),r.delete(R.locator)}return{anotherRoundNeeded:I,isGraphChanged:v}},dIt=t=>{for(let[e,r]of t.dependencies)if(!t.peerNames.has(e)&&r.ident!==t.ident)return!0;return!1},mIt=(t,e,r,o,a,n,u,A,{outputReason:p,fastLookupPossible:h})=>{let E,I=null,v=new Set;p&&(E=`${Array.from(e).map(L=>no(L)).join(\"\\u2192\")}`);let x=r[r.length-1],R=!(o.ident===x.ident);if(p&&!R&&(I=\"- self-reference\"),R&&(R=o.dependencyKind!==1,p&&!R&&(I=\"- workspace\")),R&&o.dependencyKind===2&&(R=!dIt(o),p&&!R&&(I=\"- external soft link with unhoisted dependencies\")),R&&(R=!t.peerNames.has(o.name),p&&!R&&(I=`- cannot shadow peer: ${no(t.originalDependencies.get(o.name).locator)} at ${E}`)),R){let L=!1,U=a.get(o.name);if(L=!U||U.ident===o.ident,p&&!L&&(I=`- filled by: ${no(U.locator)} at ${E}`),L)for(let z=r.length-1;z>=1;z--){let ae=r[z].dependencies.get(o.name);if(ae&&ae.ident!==o.ident){L=!1;let le=A.get(x);le||(le=new Set,A.set(x,le)),le.add(o.name),p&&(I=`- filled by ${no(ae.locator)} at ${r.slice(0,z).map(ce=>no(ce.locator)).join(\"\\u2192\")}`);break}}R=L}if(R&&(R=n.get(o.name)===o.ident,p&&!R&&(I=`- filled by: ${no(u.get(o.name)[0])} at ${E}`)),R){let L=!0,U=new Set(o.peerNames);for(let z=r.length-1;z>=1;z--){let te=r[z];for(let ae of U){if(te.peerNames.has(ae)&&te.originalDependencies.has(ae))continue;let le=te.dependencies.get(ae);le&&t.dependencies.get(ae)!==le&&(z===r.length-1?v.add(le):(v=null,L=!1,p&&(I=`- peer dependency ${no(le.locator)} from parent ${no(te.locator)} was not hoisted to ${E}`))),U.delete(ae)}if(!L)break}R=L}if(R&&!h)for(let L of o.hoistedDependencies.values()){let U=a.get(L.name)||t.dependencies.get(L.name);if(!U||L.ident!==U.ident){R=!1,p&&(I=`- previously hoisted dependency mismatch, needed: ${no(L.locator)}, available: ${no(U?.locator)}`);break}}return v!==null&&v.size>0?{isHoistable:2,dependsOn:v,reason:I}:{isHoistable:R?0:1,reason:I}},aQ=t=>`${t.name}@${t.locator}`,yIt=(t,e,r,o,a,n,u,A,p)=>{let h=e[e.length-1],E=new Set,I=!1,v=!1,x=(U,z,te,ae,le)=>{if(E.has(ae))return;let ce=[...z,aQ(ae)],Ce=[...te,aQ(ae)],de=new Map,Be=new Map;for(let Ae of Fq(ae)){let ne=mIt(h,r,[h,...U,ae],Ae,o,a,n,A,{outputReason:p.debugLevel>=2,fastLookupPossible:p.fastLookupPossible});if(Be.set(Ae,ne),ne.isHoistable===2)for(let Z of ne.dependsOn){let xe=de.get(Z.name)||new Set;xe.add(Ae.name),de.set(Z.name,xe)}}let Ee=new Set,g=(Ae,ne,Z)=>{if(!Ee.has(Ae)){Ee.add(Ae),Be.set(Ae,{isHoistable:1,reason:Z});for(let xe of de.get(Ae.name)||[])g(ae.dependencies.get(xe),ne,p.debugLevel>=2?`- peer dependency ${no(Ae.locator)} from parent ${no(ae.locator)} was not hoisted`:\"\")}};for(let[Ae,ne]of Be)ne.isHoistable===1&&g(Ae,ne,ne.reason);let me=!1;for(let Ae of Be.keys())if(!Ee.has(Ae)){v=!0;let ne=u.get(ae);ne&&ne.has(Ae.name)&&(I=!0),me=!0,ae.dependencies.delete(Ae.name),ae.hoistedDependencies.set(Ae.name,Ae),ae.reasons.delete(Ae.name);let Z=h.dependencies.get(Ae.name);if(p.debugLevel>=2){let xe=Array.from(z).concat([ae.locator]).map(ht=>no(ht)).join(\"\\u2192\"),Ne=h.hoistedFrom.get(Ae.name);Ne||(Ne=[],h.hoistedFrom.set(Ae.name,Ne)),Ne.push(xe),ae.hoistedTo.set(Ae.name,Array.from(e).map(ht=>no(ht.locator)).join(\"\\u2192\"))}if(!Z)h.ident!==Ae.ident&&(h.dependencies.set(Ae.name,Ae),le.add(Ae));else for(let xe of Ae.references)Z.references.add(xe)}if(ae.dependencyKind===2&&me&&(I=!0),p.check){let Ae=EIe(t);if(Ae)throw new Error(`${Ae}, after hoisting dependencies of ${[h,...U,ae].map(ne=>no(ne.locator)).join(\"\\u2192\")}:\n${kB(t)}`)}let we=Fq(ae);for(let Ae of we)if(Ee.has(Ae)){let ne=Be.get(Ae);if((a.get(Ae.name)===Ae.ident||!ae.reasons.has(Ae.name))&&ne.isHoistable!==0&&ae.reasons.set(Ae.name,ne.reason),!Ae.isHoistBorder&&Ce.indexOf(aQ(Ae))<0){E.add(ae);let xe=mIe(ae,Ae);x([...U,ae],ce,Ce,xe,R),E.delete(ae)}}},C,R=new Set(Fq(h)),L=Array.from(e).map(U=>aQ(U));do{C=R,R=new Set;for(let U of C){if(U.locator===h.locator||U.isHoistBorder)continue;let z=mIe(h,U);x([],Array.from(r),L,z,R)}}while(R.size>0);return{anotherRoundNeeded:I,isGraphChanged:v}},EIe=t=>{let e=[],r=new Set,o=new Set,a=(n,u,A)=>{if(r.has(n)||(r.add(n),o.has(n)))return;let p=new Map(u);for(let h of n.dependencies.values())n.peerNames.has(h.name)||p.set(h.name,h);for(let h of n.originalDependencies.values()){let E=p.get(h.name),I=()=>`${Array.from(o).concat([n]).map(v=>no(v.locator)).join(\"\\u2192\")}`;if(n.peerNames.has(h.name)){let v=u.get(h.name);(v!==E||!v||v.ident!==h.ident)&&e.push(`${I()} - broken peer promise: expected ${h.ident} but found ${v&&v.ident}`)}else{let v=A.hoistedFrom.get(n.name),x=n.hoistedTo.get(h.name),C=`${v?` hoisted from ${v.join(\", \")}`:\"\"}`,R=`${x?` hoisted to ${x}`:\"\"}`,L=`${I()}${C}`;E?E.ident!==h.ident&&e.push(`${L} - broken require promise for ${h.name}${R}: expected ${h.ident}, but found: ${E.ident}`):e.push(`${L} - broken require promise: no required dependency ${h.name}${R} found`)}}o.add(n);for(let h of n.dependencies.values())n.peerNames.has(h.name)||a(h,p,n);o.delete(n)};return a(t,t.dependencies,t),e.join(`\n`)},EIt=(t,e)=>{let{identName:r,name:o,reference:a,peerNames:n}=t,u={name:o,references:new Set([a]),locator:Rq(r,a),ident:dIe(r,a),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(n),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},A=new Map([[t,u]]),p=(h,E)=>{let I=A.get(h),v=!!I;if(!I){let{name:x,identName:C,reference:R,peerNames:L,hoistPriority:U,dependencyKind:z}=h,te=e.hoistingLimits.get(E.locator);I={name:x,references:new Set([R]),locator:Rq(C,R),ident:dIe(C,R),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(L),reasons:new Map,decoupled:!0,isHoistBorder:te?te.has(x):!1,hoistPriority:U||0,dependencyKind:z||0,hoistedFrom:new Map,hoistedTo:new Map},A.set(h,I)}if(E.dependencies.set(h.name,I),E.originalDependencies.set(h.name,I),v){let x=new Set,C=R=>{if(!x.has(R)){x.add(R),R.decoupled=!1;for(let L of R.dependencies.values())R.peerNames.has(L.name)||C(L)}};C(I)}else for(let x of h.dependencies)p(x,I)};for(let h of t.dependencies)p(h,u);return u},Nq=t=>t.substring(0,t.indexOf(\"@\",1)),CIt=t=>{let e={name:t.name,identName:Nq(t.locator),references:new Set(t.references),dependencies:new Set},r=new Set([t]),o=(a,n,u)=>{let A=r.has(a),p;if(n===a)p=u;else{let{name:h,references:E,locator:I}=a;p={name:h,identName:Nq(I),references:E,dependencies:new Set}}if(u.dependencies.add(p),!A){r.add(a);for(let h of a.dependencies.values())a.peerNames.has(h.name)||o(h,a,p);r.delete(a)}};for(let a of t.dependencies.values())o(a,t,e);return e},wIt=t=>{let e=new Map,r=new Set([t]),o=u=>`${u.name}@${u.ident}`,a=u=>{let A=o(u),p=e.get(A);return p||(p={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(A,p)),p},n=(u,A)=>{let p=!!r.has(A);if(a(A).dependents.add(u.ident),!p){r.add(A);for(let E of A.dependencies.values()){let I=a(E);I.hoistPriority=Math.max(I.hoistPriority,E.hoistPriority),A.peerNames.has(E.name)?I.peerDependents.add(A.ident):n(A,E)}}};for(let u of t.dependencies.values())t.peerNames.has(u.name)||n(t,u);return e},no=t=>{if(!t)return\"none\";let e=t.indexOf(\"@\",1),r=t.substring(0,e);r.endsWith(\"$wsroot$\")&&(r=`wh:${r.replace(\"$wsroot$\",\"\")}`);let o=t.substring(e+1);if(o===\"workspace:.\")return\".\";if(o){let a=(o.indexOf(\"#\")>0?o.split(\"#\")[1]:o).replace(\"npm:\",\"\");return o.startsWith(\"virtual\")&&(r=`v:${r}`),a.startsWith(\"workspace\")&&(r=`w:${r}`,a=\"\"),`${r}${a?`@${a}`:\"\"}`}else return`${r}`};var kB=t=>{let e=0,r=(a,n,u=\"\")=>{if(e>5e4||n.has(a))return\"\";e++;let A=Array.from(a.dependencies.values()).sort((h,E)=>h.name===E.name?0:h.name>E.name?1:-1),p=\"\";n.add(a);for(let h=0;h<A.length;h++){let E=A[h];if(!a.peerNames.has(E.name)&&E!==a){let I=a.reasons.get(E.name),v=Nq(E.locator);p+=`${u}${h<A.length-1?\"\\u251C\\u2500\":\"\\u2514\\u2500\"}${(n.has(E)?\">\":\"\")+(v!==E.name?`a:${E.name}:`:\"\")+no(E.locator)+(I?` ${I}`:\"\")}\n`,p+=r(E,n,`${u}${h<A.length-1?\"\\u2502 \":\"  \"}`)}}return n.delete(a),p};return r(t,new Set)+(e>5e4?`\nTree is too large, part of the tree has been dunped\n`:\"\")};var QB=(o=>(o.WORKSPACES=\"workspaces\",o.DEPENDENCIES=\"dependencies\",o.NONE=\"none\",o))(QB||{}),CIe=\"node_modules\",Oh=\"$wsroot$\";var FB=(t,e)=>{let{packageTree:r,hoistingLimits:o,errors:a,preserveSymlinksRequired:n}=BIt(t,e),u=null;if(a.length===0){let A=yIe(r,{hoistingLimits:o});u=DIt(t,A,e)}return{tree:u,errors:a,preserveSymlinksRequired:n}},gA=t=>`${t.name}@${t.reference}`,Mq=t=>{let e=new Map;for(let[r,o]of t.entries())if(!o.dirList){let a=e.get(o.locator);a||(a={target:o.target,linkType:o.linkType,locations:[],aliases:o.aliases},e.set(o.locator,a)),a.locations.push(r)}for(let r of e.values())r.locations=r.locations.sort((o,a)=>{let n=o.split(V.delimiter).length,u=a.split(V.delimiter).length;return a===o?0:n!==u?u-n:a>o?1:-1});return e},wIe=(t,e)=>{let r=G.isVirtualLocator(t)?G.devirtualizeLocator(t):t,o=G.isVirtualLocator(e)?G.devirtualizeLocator(e):e;return G.areLocatorsEqual(r,o)},Lq=(t,e,r,o)=>{if(t.linkType!==\"SOFT\")return!1;let a=ue.toPortablePath(r.resolveVirtual&&e.reference&&e.reference.startsWith(\"virtual:\")?r.resolveVirtual(t.packageLocation):t.packageLocation);return V.contains(o,a)===null},IIt=t=>{let e=t.getPackageInformation(t.topLevel);if(e===null)throw new Error(\"Assertion failed: Expected the top-level package to have been registered\");if(t.findPackageLocator(e.packageLocation)===null)throw new Error(\"Assertion failed: Expected the top-level package to have a physical locator\");let o=ue.toPortablePath(e.packageLocation.slice(0,-1)),a=new Map,n={children:new Map},u=t.getDependencyTreeRoots(),A=new Map,p=new Set,h=(v,x)=>{let C=gA(v);if(p.has(C))return;p.add(C);let R=t.getPackageInformation(v);if(R){let L=x?gA(x):\"\";if(gA(v)!==L&&R.linkType===\"SOFT\"&&!v.reference.startsWith(\"link:\")&&!Lq(R,v,t,o)){let U=IIe(R,v,t);(!A.get(U)||v.reference.startsWith(\"workspace:\"))&&A.set(U,v)}for(let[U,z]of R.packageDependencies)z!==null&&(R.packagePeers.has(U)||h(t.getLocator(U,z),v))}};for(let v of u)h(v,null);let E=o.split(V.sep);for(let v of A.values()){let x=t.getPackageInformation(v),R=ue.toPortablePath(x.packageLocation.slice(0,-1)).split(V.sep).slice(E.length),L=n;for(let U of R){let z=L.children.get(U);z||(z={children:new Map},L.children.set(U,z)),L=z}L.workspaceLocator=v}let I=(v,x)=>{if(v.workspaceLocator){let C=gA(x),R=a.get(C);R||(R=new Set,a.set(C,R)),R.add(v.workspaceLocator)}for(let C of v.children.values())I(C,v.workspaceLocator||x)};for(let v of n.children.values())I(v,n.workspaceLocator);return a},BIt=(t,e)=>{let r=[],o=!1,a=new Map,n=IIt(t),u=t.getPackageInformation(t.topLevel);if(u===null)throw new Error(\"Assertion failed: Expected the top-level package to have been registered\");let A=t.findPackageLocator(u.packageLocation);if(A===null)throw new Error(\"Assertion failed: Expected the top-level package to have a physical locator\");let p=ue.toPortablePath(u.packageLocation.slice(0,-1)),h={name:A.name,identName:A.name,reference:A.reference,peerNames:u.packagePeers,dependencies:new Set,dependencyKind:1},E=new Map,I=(x,C)=>`${gA(C)}:${x}`,v=(x,C,R,L,U,z,te,ae)=>{let le=I(x,R),ce=E.get(le),Ce=!!ce;!Ce&&R.name===A.name&&R.reference===A.reference&&(ce=h,E.set(le,h));let de=Lq(C,R,t,p);if(!ce){let Ae=0;de?Ae=2:C.linkType===\"SOFT\"&&R.name.endsWith(Oh)&&(Ae=1),ce={name:x,identName:R.name,reference:R.reference,dependencies:new Set,peerNames:Ae===1?new Set:C.packagePeers,dependencyKind:Ae},E.set(le,ce)}let Be;if(de?Be=2:U.linkType===\"SOFT\"?Be=1:Be=0,ce.hoistPriority=Math.max(ce.hoistPriority||0,Be),ae&&!de){let Ae=gA({name:L.identName,reference:L.reference}),ne=a.get(Ae)||new Set;a.set(Ae,ne),ne.add(ce.name)}let Ee=new Map(C.packageDependencies);if(e.project){let Ae=e.project.workspacesByCwd.get(ue.toPortablePath(C.packageLocation.slice(0,-1)));if(Ae){let ne=new Set([...Array.from(Ae.manifest.peerDependencies.values(),Z=>G.stringifyIdent(Z)),...Array.from(Ae.manifest.peerDependenciesMeta.keys())]);for(let Z of ne)Ee.has(Z)||(Ee.set(Z,z.get(Z)||null),ce.peerNames.add(Z))}}let g=gA({name:R.name.replace(Oh,\"\"),reference:R.reference}),me=n.get(g);if(me)for(let Ae of me)Ee.set(`${Ae.name}${Oh}`,Ae.reference);(C!==U||C.linkType!==\"SOFT\"||!de&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(te)))&&L.dependencies.add(ce);let we=R!==A&&C.linkType===\"SOFT\"&&!R.name.endsWith(Oh)&&!de;if(!Ce&&!we){let Ae=new Map;for(let[ne,Z]of Ee)if(Z!==null){let xe=t.getLocator(ne,Z),Ne=t.getLocator(ne.replace(Oh,\"\"),Z),ht=t.getPackageInformation(Ne);if(ht===null)throw new Error(\"Assertion failed: Expected the package to have been registered\");let H=Lq(ht,xe,t,p);if(e.validateExternalSoftLinks&&e.project&&H){ht.packageDependencies.size>0&&(o=!0);for(let[Ye,be]of ht.packageDependencies)if(be!==null){let et=G.parseLocator(Array.isArray(be)?`${be[0]}@${be[1]}`:`${Ye}@${be}`);if(gA(et)!==gA(xe)){let Ue=Ee.get(Ye);if(Ue){let S=G.parseLocator(Array.isArray(Ue)?`${Ue[0]}@${Ue[1]}`:`${Ye}@${Ue}`);wIe(S,et)||r.push({messageName:71,text:`Cannot link ${G.prettyIdent(e.project.configuration,G.parseIdent(xe.name))} into ${G.prettyLocator(e.project.configuration,G.parseLocator(`${R.name}@${R.reference}`))} dependency ${G.prettyLocator(e.project.configuration,et)} conflicts with parent dependency ${G.prettyLocator(e.project.configuration,S)}`})}else{let S=Ae.get(Ye);if(S){let w=S.target,b=G.parseLocator(Array.isArray(w)?`${w[0]}@${w[1]}`:`${Ye}@${w}`);wIe(b,et)||r.push({messageName:71,text:`Cannot link ${G.prettyIdent(e.project.configuration,G.parseIdent(xe.name))} into ${G.prettyLocator(e.project.configuration,G.parseLocator(`${R.name}@${R.reference}`))} dependency ${G.prettyLocator(e.project.configuration,et)} conflicts with dependency ${G.prettyLocator(e.project.configuration,b)} from sibling portal ${G.prettyIdent(e.project.configuration,G.parseIdent(S.portal.name))}`})}else Ae.set(Ye,{target:et.reference,portal:xe})}}}}let rt=e.hoistingLimitsByCwd?.get(te),Te=H?te:V.relative(p,ue.toPortablePath(ht.packageLocation))||It.dot,Fe=e.hoistingLimitsByCwd?.get(Te);v(ne,ht,xe,ce,C,Ee,Te,rt===\"dependencies\"||Fe===\"dependencies\"||Fe===\"workspaces\")}}};return v(A.name,u,A,h,u,u.packageDependencies,It.dot,!1),{packageTree:h,hoistingLimits:a,errors:r,preserveSymlinksRequired:o}};function IIe(t,e,r){let o=r.resolveVirtual&&e.reference&&e.reference.startsWith(\"virtual:\")?r.resolveVirtual(t.packageLocation):t.packageLocation;return ue.toPortablePath(o||t.packageLocation)}function vIt(t,e,r){let o=e.getLocator(t.name.replace(Oh,\"\"),t.reference),a=e.getPackageInformation(o);if(a===null)throw new Error(\"Assertion failed: Expected the package to be registered\");return r.pnpifyFs?{linkType:\"SOFT\",target:ue.toPortablePath(a.packageLocation)}:{linkType:a.linkType,target:IIe(a,t,e)}}var DIt=(t,e,r)=>{let o=new Map,a=(E,I,v)=>{let{linkType:x,target:C}=vIt(E,t,r);return{locator:gA(E),nodePath:I,target:C,linkType:x,aliases:v}},n=E=>{let[I,v]=E.split(\"/\");return v?{scope:I,name:v}:{scope:null,name:I}},u=new Set,A=(E,I,v)=>{if(u.has(E))return;u.add(E);let x=Array.from(E.references).sort().join(\"#\");for(let C of E.dependencies){let R=Array.from(C.references).sort().join(\"#\");if(C.identName===E.identName.replace(Oh,\"\")&&R===x)continue;let L=Array.from(C.references).sort(),U={name:C.identName,reference:L[0]},{name:z,scope:te}=n(C.name),ae=te?[te,z]:[z],le=V.join(I,CIe),ce=V.join(le,...ae),Ce=`${v}/${U.name}`,de=a(U,v,L.slice(1)),Be=!1;if(de.linkType===\"SOFT\"&&r.project){let Ee=r.project.workspacesByCwd.get(de.target.slice(0,-1));Be=!!(Ee&&!Ee.manifest.name)}if(!C.name.endsWith(Oh)&&!Be){let Ee=o.get(ce);if(Ee){if(Ee.dirList)throw new Error(`Assertion failed: ${ce} cannot merge dir node with leaf node`);{let we=G.parseLocator(Ee.locator),Ae=G.parseLocator(de.locator);if(Ee.linkType!==de.linkType)throw new Error(`Assertion failed: ${ce} cannot merge nodes with different link types ${Ee.nodePath}/${G.stringifyLocator(we)} and ${v}/${G.stringifyLocator(Ae)}`);if(we.identHash!==Ae.identHash)throw new Error(`Assertion failed: ${ce} cannot merge nodes with different idents ${Ee.nodePath}/${G.stringifyLocator(we)} and ${v}/s${G.stringifyLocator(Ae)}`);de.aliases=[...de.aliases,...Ee.aliases,G.parseLocator(Ee.locator).reference]}}o.set(ce,de);let g=ce.split(\"/\"),me=g.indexOf(CIe);for(let we=g.length-1;me>=0&&we>me;we--){let Ae=ue.toPortablePath(g.slice(0,we).join(V.sep)),ne=g[we],Z=o.get(Ae);if(!Z)o.set(Ae,{dirList:new Set([ne])});else if(Z.dirList){if(Z.dirList.has(ne))break;Z.dirList.add(ne)}}}A(C,de.linkType===\"SOFT\"?de.target:ce,Ce)}},p=a({name:e.name,reference:Array.from(e.references)[0]},\"\",[]),h=p.target;return o.set(h,p),A(e,h,\"\"),o};Ge();Ge();Pt();Pt();nA();Nl();var rj={};Vt(rj,{PnpInstaller:()=>sd,PnpLinker:()=>Hh,UnplugCommand:()=>cC,default:()=>t1t,getPnpPath:()=>qh,jsInstallUtils:()=>mA,pnpUtils:()=>jB,quotePathIfNeeded:()=>o1e});Pt();var s1e=ve(\"url\");Ge();Ge();Pt();Pt();var BIe={DEFAULT:{collapsed:!1,next:{\"*\":\"DEFAULT\"}},TOP_LEVEL:{collapsed:!1,next:{fallbackExclusionList:\"FALLBACK_EXCLUSION_LIST\",packageRegistryData:\"PACKAGE_REGISTRY_DATA\",\"*\":\"DEFAULT\"}},FALLBACK_EXCLUSION_LIST:{collapsed:!1,next:{\"*\":\"FALLBACK_EXCLUSION_ENTRIES\"}},FALLBACK_EXCLUSION_ENTRIES:{collapsed:!0,next:{\"*\":\"FALLBACK_EXCLUSION_DATA\"}},FALLBACK_EXCLUSION_DATA:{collapsed:!0,next:{\"*\":\"DEFAULT\"}},PACKAGE_REGISTRY_DATA:{collapsed:!1,next:{\"*\":\"PACKAGE_REGISTRY_ENTRIES\"}},PACKAGE_REGISTRY_ENTRIES:{collapsed:!0,next:{\"*\":\"PACKAGE_STORE_DATA\"}},PACKAGE_STORE_DATA:{collapsed:!1,next:{\"*\":\"PACKAGE_STORE_ENTRIES\"}},PACKAGE_STORE_ENTRIES:{collapsed:!0,next:{\"*\":\"PACKAGE_INFORMATION_DATA\"}},PACKAGE_INFORMATION_DATA:{collapsed:!1,next:{packageDependencies:\"PACKAGE_DEPENDENCIES\",\"*\":\"DEFAULT\"}},PACKAGE_DEPENDENCIES:{collapsed:!1,next:{\"*\":\"PACKAGE_DEPENDENCY\"}},PACKAGE_DEPENDENCY:{collapsed:!0,next:{\"*\":\"DEFAULT\"}}};function PIt(t,e,r){let o=\"\";o+=\"[\";for(let a=0,n=t.length;a<n;++a)o+=lQ(String(a),t[a],e,r).replace(/^ +/g,\"\"),a+1<n&&(o+=\", \");return o+=\"]\",o}function bIt(t,e,r){let o=`${r}  `,a=\"\";a+=r,a+=`[\n`;for(let n=0,u=t.length;n<u;++n)a+=o+lQ(String(n),t[n],e,o).replace(/^ +/,\"\"),n+1<u&&(a+=\",\"),a+=`\n`;return a+=r,a+=\"]\",a}function SIt(t,e,r){let o=Object.keys(t),a=\"\";a+=\"{\";for(let n=0,u=o.length,A=0;n<u;++n){let p=o[n],h=t[p];typeof h>\"u\"||(A!==0&&(a+=\", \"),a+=JSON.stringify(p),a+=\": \",a+=lQ(p,h,e,r).replace(/^ +/g,\"\"),A+=1)}return a+=\"}\",a}function xIt(t,e,r){let o=Object.keys(t),a=`${r}  `,n=\"\";n+=r,n+=`{\n`;let u=0;for(let A=0,p=o.length;A<p;++A){let h=o[A],E=t[h];typeof E>\"u\"||(u!==0&&(n+=\",\",n+=`\n`),n+=a,n+=JSON.stringify(h),n+=\": \",n+=lQ(h,E,e,a).replace(/^ +/g,\"\"),u+=1)}return u!==0&&(n+=`\n`),n+=r,n+=\"}\",n}function lQ(t,e,r,o){let{next:a}=BIe[r],n=a[t]||a[\"*\"];return vIe(e,n,o)}function vIe(t,e,r){let{collapsed:o}=BIe[e];return Array.isArray(t)?o?PIt(t,e,r):bIt(t,e,r):typeof t==\"object\"&&t!==null?o?SIt(t,e,r):xIt(t,e,r):JSON.stringify(t)}function DIe(t){return vIe(t,\"TOP_LEVEL\",\"\")}function RB(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];for(let n of e)o.push(r.map(u=>n(u)));let a=r.map((n,u)=>u);return a.sort((n,u)=>{for(let A of o){let p=A[n]<A[u]?-1:A[n]>A[u]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function kIt(t){let e=new Map,r=RB(t.fallbackExclusionList||[],[({name:o,reference:a})=>o,({name:o,reference:a})=>a]);for(let{name:o,reference:a}of r){let n=e.get(o);typeof n>\"u\"&&e.set(o,n=new Set),n.add(a)}return Array.from(e).map(([o,a])=>[o,Array.from(a)])}function QIt(t){return RB(t.fallbackPool||[],([e])=>e)}function FIt(t){let e=[];for(let[r,o]of RB(t.packageRegistry,([a])=>a===null?\"0\":`1${a}`)){let a=[];e.push([r,a]);for(let[n,{packageLocation:u,packageDependencies:A,packagePeers:p,linkType:h,discardFromLookup:E}]of RB(o,([I])=>I===null?\"0\":`1${I}`)){let I=[];r!==null&&n!==null&&!A.has(r)&&I.push([r,n]);for(let[C,R]of RB(A.entries(),([L])=>L))I.push([C,R]);let v=p&&p.size>0?Array.from(p):void 0,x=E||void 0;a.push([n,{packageLocation:u,packageDependencies:I,packagePeers:v,linkType:h,discardFromLookup:x}])}}return e}function TB(t){return{__info:[\"This file is automatically generated. Do not touch it, or risk\",\"your modifications being lost.\"],dependencyTreeRoots:t.dependencyTreeRoots,enableTopLevelFallback:t.enableTopLevelFallback||!1,ignorePatternData:t.ignorePattern||null,fallbackExclusionList:kIt(t),fallbackPool:QIt(t),packageRegistryData:FIt(t)}}var SIe=Ze(bIe());function xIe(t,e){return[t?`${t}\n`:\"\",`/* eslint-disable */\n`,`// @ts-nocheck\n`,`\"use strict\";\n`,`\n`,e,`\n`,(0,SIe.default)()].join(\"\")}function RIt(t){return JSON.stringify(t,null,2)}function TIt(t){return`'${t.replace(/\\\\/g,\"\\\\\\\\\").replace(/'/g,\"\\\\'\").replace(/\\n/g,`\\\\\n`)}'`}function NIt(t){return[`const RAW_RUNTIME_STATE =\n`,`${TIt(DIe(t))};\n\n`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) {\n`,`  return hydrateRuntimeState(JSON.parse(RAW_RUNTIME_STATE), {basePath: basePath || __dirname});\n`,`}\n`].join(\"\")}function LIt(){return[`function $$SETUP_STATE(hydrateRuntimeState, basePath) {\n`,`  const fs = require('fs');\n`,`  const path = require('path');\n`,`  const pnpDataFilepath = path.resolve(__dirname, ${JSON.stringify(dr.pnpData)});\n`,`  return hydrateRuntimeState(JSON.parse(fs.readFileSync(pnpDataFilepath, 'utf8')), {basePath: basePath || __dirname});\n`,`}\n`].join(\"\")}function kIe(t){let e=TB(t),r=NIt(e);return xIe(t.shebang,r)}function QIe(t){let e=TB(t),r=LIt(),o=xIe(t.shebang,r);return{dataFile:RIt(e),loaderFile:o}}Pt();function Uq(t,{basePath:e}){let r=ue.toPortablePath(e),o=V.resolve(r),a=t.ignorePatternData!==null?new RegExp(t.ignorePatternData):null,n=new Map,u=new Map(t.packageRegistryData.map(([I,v])=>[I,new Map(v.map(([x,C])=>{if(I===null!=(x===null))throw new Error(\"Assertion failed: The name and reference should be null, or neither should\");let R=C.discardFromLookup??!1,L={name:I,reference:x},U=n.get(C.packageLocation);U?(U.discardFromLookup=U.discardFromLookup&&R,R||(U.locator=L)):n.set(C.packageLocation,{locator:L,discardFromLookup:R});let z=null;return[x,{packageDependencies:new Map(C.packageDependencies),packagePeers:new Set(C.packagePeers),linkType:C.linkType,discardFromLookup:R,get packageLocation(){return z||(z=V.join(o,C.packageLocation))}}]}))])),A=new Map(t.fallbackExclusionList.map(([I,v])=>[I,new Set(v)])),p=new Map(t.fallbackPool),h=t.dependencyTreeRoots,E=t.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:h,enableTopLevelFallback:E,fallbackExclusionList:A,fallbackPool:p,ignorePattern:a,packageLocatorsByLocations:n,packageRegistry:u}}Pt();Pt();var tp=ve(\"module\"),id=ve(\"url\"),zq=ve(\"util\");var Oo=ve(\"url\");var NIe=Ze(ve(\"assert\"));var _q=Array.isArray,NB=JSON.stringify,LB=Object.getOwnPropertyNames,nd=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),Hq=(t,e)=>RegExp.prototype.exec.call(t,e),qq=(t,...e)=>RegExp.prototype[Symbol.replace].apply(t,e),Uh=(t,...e)=>String.prototype.endsWith.apply(t,e),jq=(t,...e)=>String.prototype.includes.apply(t,e),Gq=(t,...e)=>String.prototype.lastIndexOf.apply(t,e),MB=(t,...e)=>String.prototype.indexOf.apply(t,e),FIe=(t,...e)=>String.prototype.replace.apply(t,e),_h=(t,...e)=>String.prototype.slice.apply(t,e),dA=(t,...e)=>String.prototype.startsWith.apply(t,e),RIe=Map,TIe=JSON.parse;function OB(t,e,r){return class extends r{constructor(...o){super(e(...o)),this.code=t,this.name=`${r.name} [${t}]`}}}var LIe=OB(\"ERR_PACKAGE_IMPORT_NOT_DEFINED\",(t,e,r)=>`Package import specifier \"${t}\" is not defined${e?` in package ${e}package.json`:\"\"} imported from ${r}`,TypeError),Yq=OB(\"ERR_INVALID_MODULE_SPECIFIER\",(t,e,r=void 0)=>`Invalid module \"${t}\" ${e}${r?` imported from ${r}`:\"\"}`,TypeError),MIe=OB(\"ERR_INVALID_PACKAGE_TARGET\",(t,e,r,o=!1,a=void 0)=>{let n=typeof r==\"string\"&&!o&&r.length&&!dA(r,\"./\");return e===\".\"?((0,NIe.default)(o===!1),`Invalid \"exports\" main target ${NB(r)} defined in the package config ${t}package.json${a?` imported from ${a}`:\"\"}${n?'; targets must start with \"./\"':\"\"}`):`Invalid \"${o?\"imports\":\"exports\"}\" target ${NB(r)} defined for '${e}' in the package config ${t}package.json${a?` imported from ${a}`:\"\"}${n?'; targets must start with \"./\"':\"\"}`},Error),UB=OB(\"ERR_INVALID_PACKAGE_CONFIG\",(t,e,r)=>`Invalid package config ${t}${e?` while importing ${e}`:\"\"}${r?`. ${r}`:\"\"}`,Error),OIe=OB(\"ERR_PACKAGE_PATH_NOT_EXPORTED\",(t,e,r=void 0)=>e===\".\"?`No \"exports\" main defined in ${t}package.json${r?` imported from ${r}`:\"\"}`:`Package subpath '${e}' is not defined by \"exports\" in ${t}package.json${r?` imported from ${r}`:\"\"}`,Error);var uQ=ve(\"url\");function UIe(t,e){let r=Object.create(null);for(let o=0;o<e.length;o++){let a=e[o];nd(t,a)&&(r[a]=t[a])}return r}var cQ=new RIe;function MIt(t,e,r,o){let a=cQ.get(t);if(a!==void 0)return a;let n=o(t);if(n===void 0){let x={pjsonPath:t,exists:!1,main:void 0,name:void 0,type:\"none\",exports:void 0,imports:void 0};return cQ.set(t,x),x}let u;try{u=TIe(n)}catch(x){throw new UB(t,(r?`\"${e}\" from `:\"\")+(0,uQ.fileURLToPath)(r||e),x.message)}let{imports:A,main:p,name:h,type:E}=UIe(u,[\"imports\",\"main\",\"name\",\"type\"]),I=nd(u,\"exports\")?u.exports:void 0;(typeof A!=\"object\"||A===null)&&(A=void 0),typeof p!=\"string\"&&(p=void 0),typeof h!=\"string\"&&(h=void 0),E!==\"module\"&&E!==\"commonjs\"&&(E=\"none\");let v={pjsonPath:t,exists:!0,main:p,name:h,type:E,exports:I,imports:A};return cQ.set(t,v),v}function _Ie(t,e){let r=new URL(\"./package.json\",t);for(;;){let n=r.pathname;if(Uh(n,\"node_modules/package.json\"))break;let u=MIt((0,uQ.fileURLToPath)(r),t,void 0,e);if(u.exists)return u;let A=r;if(r=new URL(\"../package.json\",r),r.pathname===A.pathname)break}let o=(0,uQ.fileURLToPath)(r),a={pjsonPath:o,exists:!1,main:void 0,name:void 0,type:\"none\",exports:void 0,imports:void 0};return cQ.set(o,a),a}function OIt(t,e,r){throw new LIe(t,e&&(0,Oo.fileURLToPath)(new URL(\".\",e)),(0,Oo.fileURLToPath)(r))}function UIt(t,e,r,o){let a=`request is not a valid subpath for the \"${r?\"imports\":\"exports\"}\" resolution of ${(0,Oo.fileURLToPath)(e)}`;throw new Yq(t,a,o&&(0,Oo.fileURLToPath)(o))}function _B(t,e,r,o,a){throw typeof e==\"object\"&&e!==null?e=NB(e,null,\"\"):e=`${e}`,new MIe((0,Oo.fileURLToPath)(new URL(\".\",r)),t,e,o,a&&(0,Oo.fileURLToPath)(a))}var HIe=/(^|\\\\|\\/)((\\.|%2e)(\\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))(\\\\|\\/|$)/i,qIe=/\\*/g;function _It(t,e,r,o,a,n,u,A){if(e!==\"\"&&!n&&t[t.length-1]!==\"/\"&&_B(r,t,o,u,a),!dA(t,\"./\")){if(u&&!dA(t,\"../\")&&!dA(t,\"/\")){let I=!1;try{new URL(t),I=!0}catch{}if(!I)return n?qq(qIe,t,()=>e):t+e}_B(r,t,o,u,a)}Hq(HIe,_h(t,2))!==null&&_B(r,t,o,u,a);let p=new URL(t,o),h=p.pathname,E=new URL(\".\",o).pathname;if(dA(h,E)||_B(r,t,o,u,a),e===\"\")return p;if(Hq(HIe,e)!==null){let I=n?FIe(r,\"*\",()=>e):r+e;UIt(I,o,u,a)}return n?new URL(qq(qIe,p.href,()=>e)):new URL(e,p)}function HIt(t){let e=+t;return`${e}`!==t?!1:e>=0&&e<4294967295}function lC(t,e,r,o,a,n,u,A){if(typeof e==\"string\")return _It(e,r,o,t,a,n,u,A);if(_q(e)){if(e.length===0)return null;let p;for(let h=0;h<e.length;h++){let E=e[h],I;try{I=lC(t,E,r,o,a,n,u,A)}catch(v){if(p=v,v.code===\"ERR_INVALID_PACKAGE_TARGET\")continue;throw v}if(I!==void 0){if(I===null){p=null;continue}return I}}if(p==null)return p;throw p}else if(typeof e==\"object\"&&e!==null){let p=LB(e);for(let h=0;h<p.length;h++){let E=p[h];if(HIt(E))throw new UB((0,Oo.fileURLToPath)(t),a,'\"exports\" cannot contain numeric property keys.')}for(let h=0;h<p.length;h++){let E=p[h];if(E===\"default\"||A.has(E)){let I=e[E],v=lC(t,I,r,o,a,n,u,A);if(v===void 0)continue;return v}}return}else if(e===null)return null;_B(o,e,t,u,a)}function GIe(t,e){let r=MB(t,\"*\"),o=MB(e,\"*\"),a=r===-1?t.length:r+1,n=o===-1?e.length:o+1;return a>n?-1:n>a||r===-1?1:o===-1||t.length>e.length?-1:e.length>t.length?1:0}function qIt(t,e,r){if(typeof t==\"string\"||_q(t))return!0;if(typeof t!=\"object\"||t===null)return!1;let o=LB(t),a=!1,n=0;for(let u=0;u<o.length;u++){let A=o[u],p=A===\"\"||A[0]!==\".\";if(n++===0)a=p;else if(a!==p)throw new UB((0,Oo.fileURLToPath)(e),r,`\"exports\" cannot contain some keys starting with '.' and some not. The exports object must either be an object of package subpath keys or an object of main entry condition name keys only.`)}return a}function Wq(t,e,r){throw new OIe((0,Oo.fileURLToPath)(new URL(\".\",e)),t,r&&(0,Oo.fileURLToPath)(r))}var jIe=new Set;function jIt(t,e,r){let o=(0,Oo.fileURLToPath)(e);jIe.has(o+\"|\"+t)||(jIe.add(o+\"|\"+t),process.emitWarning(`Use of deprecated trailing slash pattern mapping \"${t}\" in the \"exports\" field module resolution of the package at ${o}${r?` imported from ${(0,Oo.fileURLToPath)(r)}`:\"\"}. Mapping specifiers ending in \"/\" is no longer supported.`,\"DeprecationWarning\",\"DEP0155\"))}function YIe({packageJSONUrl:t,packageSubpath:e,exports:r,base:o,conditions:a}){if(qIt(r,t,o)&&(r={\".\":r}),nd(r,e)&&!jq(e,\"*\")&&!Uh(e,\"/\")){let p=r[e],h=lC(t,p,\"\",e,o,!1,!1,a);return h==null&&Wq(e,t,o),h}let n=\"\",u,A=LB(r);for(let p=0;p<A.length;p++){let h=A[p],E=MB(h,\"*\");if(E!==-1&&dA(e,_h(h,0,E))){Uh(e,\"/\")&&jIt(e,t,o);let I=_h(h,E+1);e.length>=h.length&&Uh(e,I)&&GIe(n,h)===1&&Gq(h,\"*\")===E&&(n=h,u=_h(e,E,e.length-I.length))}}if(n){let p=r[n],h=lC(t,p,u,n,o,!0,!1,a);return h==null&&Wq(e,t,o),h}Wq(e,t,o)}function WIe({name:t,base:e,conditions:r,readFileSyncFn:o}){if(t===\"#\"||dA(t,\"#/\")||Uh(t,\"/\")){let u=\"is not a valid internal imports specifier name\";throw new Yq(t,u,(0,Oo.fileURLToPath)(e))}let a,n=_Ie(e,o);if(n.exists){a=(0,Oo.pathToFileURL)(n.pjsonPath);let u=n.imports;if(u)if(nd(u,t)&&!jq(t,\"*\")){let A=lC(a,u[t],\"\",t,e,!1,!0,r);if(A!=null)return A}else{let A=\"\",p,h=LB(u);for(let E=0;E<h.length;E++){let I=h[E],v=MB(I,\"*\");if(v!==-1&&dA(t,_h(I,0,v))){let x=_h(I,v+1);t.length>=I.length&&Uh(t,x)&&GIe(A,I)===1&&Gq(I,\"*\")===v&&(A=I,p=_h(t,v,t.length-x.length))}}if(A){let E=u[A],I=lC(a,E,p,A,e,!0,!0,r);if(I!=null)return I}}}OIt(t,a,e)}Pt();var GIt=new Set([\"BUILTIN_NODE_RESOLUTION_FAILED\",\"MISSING_DEPENDENCY\",\"MISSING_PEER_DEPENDENCY\",\"QUALIFIED_PATH_RESOLUTION_FAILED\",\"UNDECLARED_DEPENDENCY\"]);function ts(t,e,r={},o){o??=GIt.has(t)?\"MODULE_NOT_FOUND\":t;let a={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:{...a,value:o},pnpCode:{...a,value:t},data:{...a,value:r}})}function cu(t){return ue.normalize(ue.fromPortablePath(t))}var JIe=Ze(VIe());function XIe(t){return YIt(),Vq[t]}var Vq;function YIt(){Vq||(Vq={\"--conditions\":[],...zIe(WIt()),...zIe(process.execArgv)})}function zIe(t){return(0,JIe.default)({\"--conditions\":[String],\"-C\":\"--conditions\"},{argv:t,permissive:!0})}function WIt(){let t=[],e=KIt(process.env.NODE_OPTIONS||\"\",t);return t.length,e}function KIt(t,e){let r=[],o=!1,a=!0;for(let n=0;n<t.length;++n){let u=t[n];if(u===\"\\\\\"&&o){if(n+1===t.length)return e.push(`invalid value for NODE_OPTIONS (invalid escape)\n`),r;u=t[++n]}else if(u===\" \"&&!o){a=!0;continue}else if(u==='\"'){o=!o;continue}a?(r.push(u),a=!1):r[r.length-1]+=u}return o&&e.push(`invalid value for NODE_OPTIONS (unterminated string)\n`),r}Pt();var[Ua,ep]=process.versions.node.split(\".\").map(t=>parseInt(t,10)),ZIe=Ua>19||Ua===19&&ep>=2||Ua===18&&ep>=13,kJt=Ua===20&&ep<6||Ua===19&&ep>=3,QJt=Ua>19||Ua===19&&ep>=6,FJt=Ua>=21||Ua===20&&ep>=10||Ua===18&&ep>=19,RJt=Ua>=21||Ua===20&&ep>=10||Ua===18&&ep>=20,TJt=Ua>=22;function $Ie(t){if(process.env.WATCH_REPORT_DEPENDENCIES&&process.send)if(t=t.map(e=>ue.fromPortablePath(zs.resolveVirtual(ue.toPortablePath(e)))),ZIe)process.send({\"watch:require\":t});else for(let e of t)process.send({\"watch:require\":e})}function Jq(t,e){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,o=Number(process.env.PNP_DEBUG_LEVEL),a=/^(?![a-zA-Z]:[\\\\/]|\\\\\\\\|\\.{0,2}(?:\\/|$))((?:node:)?(?:@[^/]+\\/)?[^/]+)\\/*(.*|)$/,n=/^(\\/|\\.{1,2}(\\/|$))/,u=/\\/$/,A=/^\\.{0,2}\\//,p={name:null,reference:null},h=[],E=new Set;if(t.enableTopLevelFallback===!0&&h.push(p),e.compatibilityMode!==!1)for(let Te of[\"react-scripts\",\"gatsby\"]){let Fe=t.packageRegistry.get(Te);if(Fe)for(let ke of Fe.keys()){if(ke===null)throw new Error(\"Assertion failed: This reference shouldn't be null\");h.push({name:Te,reference:ke})}}let{ignorePattern:I,packageRegistry:v,packageLocatorsByLocations:x}=t;function C(Te,Fe){return{fn:Te,args:Fe,error:null,result:null}}function R(Te){let Fe=process.stderr?.hasColors?.()??process.stdout.isTTY,ke=(et,Ue)=>`\\x1B[${et}m${Ue}\\x1B[0m`,Ye=Te.error;console.error(Ye?ke(\"31;1\",`\\u2716 ${Te.error?.message.replace(/\\n.*/s,\"\")}`):ke(\"33;1\",\"\\u203C Resolution\")),Te.args.length>0&&console.error();for(let et of Te.args)console.error(`  ${ke(\"37;1\",\"In \\u2190\")} ${(0,zq.inspect)(et,{colors:Fe,compact:!0})}`);Te.result&&(console.error(),console.error(`  ${ke(\"37;1\",\"Out \\u2192\")} ${(0,zq.inspect)(Te.result,{colors:Fe,compact:!0})}`));let be=new Error().stack.match(/(?<=^ +)at.*/gm)?.slice(2)??[];if(be.length>0){console.error();for(let et of be)console.error(`  ${ke(\"38;5;244\",et)}`)}console.error()}function L(Te,Fe){if(e.allowDebug===!1)return Fe;if(Number.isFinite(o)){if(o>=2)return(...ke)=>{let Ye=C(Te,ke);try{return Ye.result=Fe(...ke)}catch(be){throw Ye.error=be}finally{R(Ye)}};if(o>=1)return(...ke)=>{try{return Fe(...ke)}catch(Ye){let be=C(Te,ke);throw be.error=Ye,R(be),Ye}}}return Fe}function U(Te){let Fe=g(Te);if(!Fe)throw ts(\"INTERNAL\",\"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)\");return Fe}function z(Te){if(Te.name===null)return!0;for(let Fe of t.dependencyTreeRoots)if(Fe.name===Te.name&&Fe.reference===Te.reference)return!0;return!1}let te=new Set([\"node\",\"require\",...XIe(\"--conditions\")]);function ae(Te,Fe=te,ke){let Ye=Ae(V.join(Te,\"internal.js\"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(Ye===null)throw ts(\"INTERNAL\",`The locator that owns the \"${Te}\" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:be}=U(Ye),et=V.join(be,dr.manifest);if(!e.fakeFs.existsSync(et))return null;let Ue=JSON.parse(e.fakeFs.readFileSync(et,\"utf8\"));if(Ue.exports==null)return null;let S=V.contains(be,Te);if(S===null)throw ts(\"INTERNAL\",\"unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)\");S!==\".\"&&!A.test(S)&&(S=`./${S}`);try{let w=YIe({packageJSONUrl:(0,id.pathToFileURL)(ue.fromPortablePath(et)),packageSubpath:S,exports:Ue.exports,base:ke?(0,id.pathToFileURL)(ue.fromPortablePath(ke)):null,conditions:Fe});return ue.toPortablePath((0,id.fileURLToPath)(w))}catch(w){throw ts(\"EXPORTS_RESOLUTION_FAILED\",w.message,{unqualifiedPath:cu(Te),locator:Ye,pkgJson:Ue,subpath:cu(S),conditions:Fe},w.code)}}function le(Te,Fe,{extensions:ke}){let Ye;try{Fe.push(Te),Ye=e.fakeFs.statSync(Te)}catch{}if(Ye&&!Ye.isDirectory())return e.fakeFs.realpathSync(Te);if(Ye&&Ye.isDirectory()){let be;try{be=JSON.parse(e.fakeFs.readFileSync(V.join(Te,dr.manifest),\"utf8\"))}catch{}let et;if(be&&be.main&&(et=V.resolve(Te,be.main)),et&&et!==Te){let Ue=le(et,Fe,{extensions:ke});if(Ue!==null)return Ue}}for(let be=0,et=ke.length;be<et;be++){let Ue=`${Te}${ke[be]}`;if(Fe.push(Ue),e.fakeFs.existsSync(Ue))return Ue}if(Ye&&Ye.isDirectory())for(let be=0,et=ke.length;be<et;be++){let Ue=V.format({dir:Te,name:\"index\",ext:ke[be]});if(Fe.push(Ue),e.fakeFs.existsSync(Ue))return Ue}return null}function ce(Te){let Fe=new tp.Module(Te,null);return Fe.filename=Te,Fe.paths=tp.Module._nodeModulePaths(Te),Fe}function Ce(Te,Fe){return Fe.endsWith(\"/\")&&(Fe=V.join(Fe,\"internal.js\")),tp.Module._resolveFilename(ue.fromPortablePath(Te),ce(ue.fromPortablePath(Fe)),!1,{plugnplay:!1})}function de(Te){if(I===null)return!1;let Fe=V.contains(t.basePath,Te);return Fe===null?!1:!!I.test(Fe.replace(/\\/$/,\"\"))}let Be={std:3,resolveVirtual:1,getAllLocators:1},Ee=p;function g({name:Te,reference:Fe}){let ke=v.get(Te);if(!ke)return null;let Ye=ke.get(Fe);return Ye||null}function me({name:Te,reference:Fe}){let ke=[];for(let[Ye,be]of v)if(Ye!==null)for(let[et,Ue]of be)et===null||Ue.packageDependencies.get(Te)!==Fe||Ye===Te&&et===Fe||ke.push({name:Ye,reference:et});return ke}function we(Te,Fe){let ke=new Map,Ye=new Set,be=Ue=>{let S=JSON.stringify(Ue.name);if(Ye.has(S))return;Ye.add(S);let w=me(Ue);for(let b of w)if(U(b).packagePeers.has(Te))be(b);else{let F=ke.get(b.name);typeof F>\"u\"&&ke.set(b.name,F=new Set),F.add(b.reference)}};be(Fe);let et=[];for(let Ue of[...ke.keys()].sort())for(let S of[...ke.get(Ue)].sort())et.push({name:Ue,reference:S});return et}function Ae(Te,{resolveIgnored:Fe=!1,includeDiscardFromLookup:ke=!1}={}){if(de(Te)&&!Fe)return null;let Ye=V.relative(t.basePath,Te);Ye.match(n)||(Ye=`./${Ye}`),Ye.endsWith(\"/\")||(Ye=`${Ye}/`);do{let be=x.get(Ye);if(typeof be>\"u\"||be.discardFromLookup&&!ke){Ye=Ye.substring(0,Ye.lastIndexOf(\"/\",Ye.length-2)+1);continue}return be.locator}while(Ye!==\"\");return null}function ne(Te){try{return e.fakeFs.readFileSync(ue.toPortablePath(Te),\"utf8\")}catch(Fe){if(Fe.code===\"ENOENT\")return;throw Fe}}function Z(Te,Fe,{considerBuiltins:ke=!0}={}){if(Te.startsWith(\"#\"))throw new Error(\"resolveToUnqualified can not handle private import mappings\");if(Te===\"pnpapi\")return ue.toPortablePath(e.pnpapiResolution);if(ke&&(0,tp.isBuiltin)(Te))return null;let Ye=cu(Te),be=Fe&&cu(Fe);if(Fe&&de(Fe)&&(!V.isAbsolute(Te)||Ae(Te)===null)){let S=Ce(Te,Fe);if(S===!1)throw ts(\"BUILTIN_NODE_RESOLUTION_FAILED\",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp)\n\nRequire request: \"${Ye}\"\nRequired by: ${be}\n`,{request:Ye,issuer:be});return ue.toPortablePath(S)}let et,Ue=Te.match(a);if(Ue){if(!Fe)throw ts(\"API_ERROR\",\"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute\",{request:Ye,issuer:be});let[,S,w]=Ue,b=Ae(Fe);if(!b){let Re=Ce(Te,Fe);if(Re===!1)throw ts(\"BUILTIN_NODE_RESOLUTION_FAILED\",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree).\n\nRequire path: \"${Ye}\"\nRequired by: ${be}\n`,{request:Ye,issuer:be});return ue.toPortablePath(Re)}let F=U(b).packageDependencies.get(S),J=null;if(F==null&&b.name!==null){let Re=t.fallbackExclusionList.get(b.name);if(!Re||!Re.has(b.reference)){for(let dt=0,jt=h.length;dt<jt;++dt){let bt=U(h[dt]).packageDependencies.get(S);if(bt!=null){r?J=bt:F=bt;break}}if(t.enableTopLevelFallback&&F==null&&J===null){let dt=t.fallbackPool.get(S);dt!=null&&(J=dt)}}}let X=null;if(F===null)if(z(b))X=ts(\"MISSING_PEER_DEPENDENCY\",`Your application tried to access ${S} (a peer dependency); this isn't allowed as there is no ancestor to satisfy the requirement. Use a devDependency if needed.\n\nRequired package: ${S}${S!==Ye?` (via \"${Ye}\")`:\"\"}\nRequired by: ${be}\n`,{request:Ye,issuer:be,dependencyName:S});else{let Re=we(S,b);Re.every(at=>z(at))?X=ts(\"MISSING_PEER_DEPENDENCY\",`${b.name} tried to access ${S} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound.\n\nRequired package: ${S}${S!==Ye?` (via \"${Ye}\")`:\"\"}\nRequired by: ${b.name}@${b.reference} (via ${be})\n${Re.map(at=>`Ancestor breaking the chain: ${at.name}@${at.reference}\n`).join(\"\")}\n`,{request:Ye,issuer:be,issuerLocator:Object.assign({},b),dependencyName:S,brokenAncestors:Re}):X=ts(\"MISSING_PEER_DEPENDENCY\",`${b.name} tried to access ${S} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound.\n\nRequired package: ${S}${S!==Ye?` (via \"${Ye}\")`:\"\"}\nRequired by: ${b.name}@${b.reference} (via ${be})\n\n${Re.map(at=>`Ancestor breaking the chain: ${at.name}@${at.reference}\n`).join(\"\")}\n`,{request:Ye,issuer:be,issuerLocator:Object.assign({},b),dependencyName:S,brokenAncestors:Re})}else F===void 0&&(!ke&&(0,tp.isBuiltin)(Te)?z(b)?X=ts(\"UNDECLARED_DEPENDENCY\",`Your application tried to access ${S}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${S} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound.\n\nRequired package: ${S}${S!==Ye?` (via \"${Ye}\")`:\"\"}\nRequired by: ${be}\n`,{request:Ye,issuer:be,dependencyName:S}):X=ts(\"UNDECLARED_DEPENDENCY\",`${b.name} tried to access ${S}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${S} isn't otherwise declared in ${b.name}'s dependencies, this makes the require call ambiguous and unsound.\n\nRequired package: ${S}${S!==Ye?` (via \"${Ye}\")`:\"\"}\nRequired by: ${be}\n`,{request:Ye,issuer:be,issuerLocator:Object.assign({},b),dependencyName:S}):z(b)?X=ts(\"UNDECLARED_DEPENDENCY\",`Your application tried to access ${S}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound.\n\nRequired package: ${S}${S!==Ye?` (via \"${Ye}\")`:\"\"}\nRequired by: ${be}\n`,{request:Ye,issuer:be,dependencyName:S}):X=ts(\"UNDECLARED_DEPENDENCY\",`${b.name} tried to access ${S}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound.\n\nRequired package: ${S}${S!==Ye?` (via \"${Ye}\")`:\"\"}\nRequired by: ${b.name}@${b.reference} (via ${be})\n`,{request:Ye,issuer:be,issuerLocator:Object.assign({},b),dependencyName:S}));if(F==null){if(J===null||X===null)throw X||new Error(\"Assertion failed: Expected an error to have been set\");F=J;let Re=X.message.replace(/\\n.*/g,\"\");X.message=Re,!E.has(Re)&&o!==0&&(E.add(Re),process.emitWarning(X))}let $=Array.isArray(F)?{name:F[0],reference:F[1]}:{name:S,reference:F},ie=U($);if(!ie.packageLocation)throw ts(\"MISSING_DEPENDENCY\",`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod.\n\nRequired package: ${$.name}@${$.reference}${$.name!==Ye?` (via \"${Ye}\")`:\"\"}\nRequired by: ${b.name}@${b.reference} (via ${be})\n`,{request:Ye,issuer:be,dependencyLocator:Object.assign({},$)});let Se=ie.packageLocation;w?et=V.join(Se,w):et=Se}else if(V.isAbsolute(Te))et=V.normalize(Te);else{if(!Fe)throw ts(\"API_ERROR\",\"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute\",{request:Ye,issuer:be});let S=V.resolve(Fe);Fe.match(u)?et=V.normalize(V.join(S,Te)):et=V.normalize(V.join(V.dirname(S),Te))}return V.normalize(et)}function xe(Te,Fe,ke=te,Ye){if(n.test(Te))return Fe;let be=ae(Fe,ke,Ye);return be?V.normalize(be):Fe}function Ne(Te,{extensions:Fe=Object.keys(tp.Module._extensions)}={}){let ke=[],Ye=le(Te,ke,{extensions:Fe});if(Ye)return V.normalize(Ye);{$Ie(ke.map(Ue=>ue.fromPortablePath(Ue)));let be=cu(Te),et=Ae(Te);if(et){let{packageLocation:Ue}=U(et),S=!0;try{e.fakeFs.accessSync(Ue)}catch(w){if(w?.code===\"ENOENT\")S=!1;else{let b=(w?.message??w??\"empty exception thrown\").replace(/^[A-Z]/,y=>y.toLowerCase());throw ts(\"QUALIFIED_PATH_RESOLUTION_FAILED\",`Required package exists but could not be accessed (${b}).\n\nMissing package: ${et.name}@${et.reference}\nExpected package location: ${cu(Ue)}\n`,{unqualifiedPath:be,extensions:Fe})}}if(!S){let w=Ue.includes(\"/unplugged/\")?\"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).\":\"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.\";throw ts(\"QUALIFIED_PATH_RESOLUTION_FAILED\",`${w}\n\nMissing package: ${et.name}@${et.reference}\nExpected package location: ${cu(Ue)}\n`,{unqualifiedPath:be,extensions:Fe})}}throw ts(\"QUALIFIED_PATH_RESOLUTION_FAILED\",`Qualified path resolution failed: we looked for the following paths, but none could be accessed.\n\nSource path: ${be}\n${ke.map(Ue=>`Not found: ${cu(Ue)}\n`).join(\"\")}`,{unqualifiedPath:be,extensions:Fe})}}function ht(Te,Fe,ke){if(!Fe)throw new Error(\"Assertion failed: An issuer is required to resolve private import mappings\");let Ye=WIe({name:Te,base:(0,id.pathToFileURL)(ue.fromPortablePath(Fe)),conditions:ke.conditions??te,readFileSyncFn:ne});if(Ye instanceof URL)return Ne(ue.toPortablePath((0,id.fileURLToPath)(Ye)),{extensions:ke.extensions});if(Ye.startsWith(\"#\"))throw new Error(\"Mapping from one private import to another isn't allowed\");return H(Ye,Fe,ke)}function H(Te,Fe,ke={}){try{if(Te.startsWith(\"#\"))return ht(Te,Fe,ke);let{considerBuiltins:Ye,extensions:be,conditions:et}=ke,Ue=Z(Te,Fe,{considerBuiltins:Ye});if(Te===\"pnpapi\")return Ue;if(Ue===null)return null;let S=()=>Fe!==null?de(Fe):!1,w=(!Ye||!(0,tp.isBuiltin)(Te))&&!S()?xe(Te,Ue,et,Fe):Ue;return Ne(w,{extensions:be})}catch(Ye){throw Object.hasOwn(Ye,\"pnpCode\")&&Object.assign(Ye.data,{request:cu(Te),issuer:Fe&&cu(Fe)}),Ye}}function rt(Te){let Fe=V.normalize(Te),ke=zs.resolveVirtual(Fe);return ke!==Fe?ke:null}return{VERSIONS:Be,topLevel:Ee,getLocator:(Te,Fe)=>Array.isArray(Fe)?{name:Fe[0],reference:Fe[1]}:{name:Te,reference:Fe},getDependencyTreeRoots:()=>[...t.dependencyTreeRoots],getAllLocators(){let Te=[];for(let[Fe,ke]of v)for(let Ye of ke.keys())Fe!==null&&Ye!==null&&Te.push({name:Fe,reference:Ye});return Te},getPackageInformation:Te=>{let Fe=g(Te);if(Fe===null)return null;let ke=ue.fromPortablePath(Fe.packageLocation);return{...Fe,packageLocation:ke}},findPackageLocator:Te=>Ae(ue.toPortablePath(Te)),resolveToUnqualified:L(\"resolveToUnqualified\",(Te,Fe,ke)=>{let Ye=Fe!==null?ue.toPortablePath(Fe):null,be=Z(ue.toPortablePath(Te),Ye,ke);return be===null?null:ue.fromPortablePath(be)}),resolveUnqualified:L(\"resolveUnqualified\",(Te,Fe)=>ue.fromPortablePath(Ne(ue.toPortablePath(Te),Fe))),resolveRequest:L(\"resolveRequest\",(Te,Fe,ke)=>{let Ye=Fe!==null?ue.toPortablePath(Fe):null,be=H(ue.toPortablePath(Te),Ye,ke);return be===null?null:ue.fromPortablePath(be)}),resolveVirtual:L(\"resolveVirtual\",Te=>{let Fe=rt(ue.toPortablePath(Te));return Fe!==null?ue.fromPortablePath(Fe):null})}}Pt();var e1e=(t,e,r)=>{let o=TB(t),a=Uq(o,{basePath:e}),n=ue.join(e,dr.pnpCjs);return Jq(a,{fakeFs:r,pnpapiResolution:n})};var Zq=Ze(r1e());qt();var mA={};Vt(mA,{checkManifestCompatibility:()=>n1e,extractBuildRequest:()=>AQ,getExtractHint:()=>$q,hasBindingGyp:()=>ej});Ge();Pt();function n1e(t){return G.isPackageCompatible(t,Xi.getArchitectureSet())}function AQ(t,e,r,{configuration:o}){let a=[];for(let n of[\"preinstall\",\"install\",\"postinstall\"])e.manifest.scripts.has(n)&&a.push({type:0,script:n});return!e.manifest.scripts.has(\"install\")&&e.misc.hasBindingGyp&&a.push({type:1,script:\"node-gyp rebuild\"}),a.length===0?null:t.linkType!==\"HARD\"?{skipped:!0,explain:n=>n.reportWarningOnce(6,`${G.prettyLocator(o,t)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`)}:r&&r.built===!1?{skipped:!0,explain:n=>n.reportInfoOnce(5,`${G.prettyLocator(o,t)} lists build scripts, but its build has been explicitly disabled through configuration.`)}:!o.get(\"enableScripts\")&&!r.built?{skipped:!0,explain:n=>n.reportWarningOnce(4,`${G.prettyLocator(o,t)} lists build scripts, but all build scripts have been disabled.`)}:n1e(t)?{skipped:!1,directives:a}:{skipped:!0,explain:n=>n.reportWarningOnce(76,`${G.prettyLocator(o,t)} The ${Xi.getArchitectureName()} architecture is incompatible with this package, build skipped.`)}}var zIt=new Set([\".exe\",\".bin\",\".h\",\".hh\",\".hpp\",\".c\",\".cc\",\".cpp\",\".java\",\".jar\",\".node\"]);function $q(t){return t.packageFs.getExtractHint({relevantExtensions:zIt})}function ej(t){let e=V.join(t.prefixPath,\"binding.gyp\");return t.packageFs.existsSync(e)}var jB={};Vt(jB,{getUnpluggedPath:()=>qB});Ge();Pt();function qB(t,{configuration:e}){return V.resolve(e.get(\"pnpUnpluggedFolder\"),G.slugifyLocator(t))}var JIt=new Set([G.makeIdent(null,\"open\").identHash,G.makeIdent(null,\"opn\").identHash]),Hh=class{constructor(){this.mode=\"strict\";this.pnpCache=new Map}getCustomDataKey(){return JSON.stringify({name:\"PnpLinker\",version:2})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error(\"Assertion failed: Expected the PnP linker to be enabled\");let o=qh(r.project).cjs;if(!oe.existsSync(o))throw new st(`The project in ${pe.pretty(r.project.configuration,`${r.project.cwd}/package.json`,pe.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let a=He.getFactoryWithDefault(this.pnpCache,o,()=>He.dynamicRequire(o,{cachingStrategy:He.CachingStrategy.FsTime})),n={name:G.stringifyIdent(e),reference:e.reference},u=a.getPackageInformation(n);if(!u)throw new st(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed PnP map - running an install might help`);return ue.toPortablePath(u.packageLocation)}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=qh(r.project).cjs;if(!oe.existsSync(o))return null;let n=He.getFactoryWithDefault(this.pnpCache,o,()=>He.dynamicRequire(o,{cachingStrategy:He.CachingStrategy.FsTime})).findPackageLocator(ue.fromPortablePath(e));return n?G.makeLocator(G.parseIdent(n.name),n.reference):null}makeInstaller(e){return new sd(e)}isEnabled(e){return!(e.project.configuration.get(\"nodeLinker\")!==\"pnp\"||e.project.configuration.get(\"pnpMode\")!==this.mode)}},sd=class{constructor(e){this.opts=e;this.mode=\"strict\";this.asyncActions=new He.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}attachCustomData(e){this.customData=e}async installPackage(e,r,o){let a=G.stringifyIdent(e),n=e.reference,u=!!this.opts.project.tryWorkspaceByLocator(e),A=G.isVirtualLocator(e),p=e.peerDependencies.size>0&&!A,h=!p&&!u,E=!p&&e.linkType!==\"SOFT\",I,v;if(h||E){let te=A?G.devirtualizeLocator(e):e;I=this.customData.store.get(te.locatorHash),typeof I>\"u\"&&(I=await XIt(r),e.linkType===\"HARD\"&&this.customData.store.set(te.locatorHash,I)),I.manifest.type===\"module\"&&(this.isESMLoaderRequired=!0),v=this.opts.project.getDependencyMeta(te,e.version)}let x=h?AQ(e,I,v,{configuration:this.opts.project.configuration}):null,C=E?await this.unplugPackageIfNeeded(e,I,r,v,o):r.packageFs;if(V.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let R=V.resolve(C.getRealPath(),r.prefixPath),L=tj(this.opts.project.cwd,R),U=new Map,z=new Set;if(A){for(let te of e.peerDependencies.values())U.set(G.stringifyIdent(te),null),z.add(G.stringifyIdent(te));if(!u){let te=G.devirtualizeLocator(e);this.virtualTemplates.set(te.locatorHash,{location:tj(this.opts.project.cwd,zs.resolveVirtual(R)),locator:te})}}return He.getMapWithDefault(this.packageRegistry,a).set(n,{packageLocation:L,packageDependencies:U,packagePeers:z,linkType:e.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:R,buildRequest:x}}async attachInternalDependencies(e,r){let o=this.getPackageInformation(e);for(let[a,n]of r){let u=G.areIdentsEqual(a,n)?n.reference:[G.stringifyIdent(n),n.reference];o.packageDependencies.set(G.stringifyIdent(a),u)}}async attachExternalDependents(e,r){for(let o of r)this.getDiskInformation(o).packageDependencies.set(G.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get(\"pnpMode\")!==this.mode)return;let e=qh(this.opts.project);if(this.isEsmEnabled()||await oe.removePromise(e.esmLoader),this.opts.project.configuration.get(\"nodeLinker\")!==\"pnp\"){await oe.removePromise(e.cjs),await oe.removePromise(e.data),await oe.removePromise(e.esmLoader),await oe.removePromise(this.opts.project.configuration.get(\"pnpUnpluggedFolder\"));return}for(let{locator:E,location:I}of this.virtualTemplates.values())He.getMapWithDefault(this.packageRegistry,G.stringifyIdent(E)).set(E.reference,{packageLocation:I,packageDependencies:new Map,packagePeers:new Set,linkType:\"SOFT\",discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let r=this.opts.project.configuration.get(\"pnpFallbackMode\"),o=this.opts.project.workspaces.map(({anchoredLocator:E})=>({name:G.stringifyIdent(E),reference:E.reference})),a=r!==\"none\",n=[],u=new Map,A=He.buildIgnorePattern([\".yarn/sdks/**\",...this.opts.project.configuration.get(\"pnpIgnorePatterns\")]),p=this.packageRegistry,h=this.opts.project.configuration.get(\"pnpShebang\");if(r===\"dependencies-only\")for(let E of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(E)&&n.push({name:G.stringifyIdent(E),reference:E.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:o,enableTopLevelFallback:a,fallbackExclusionList:n,fallbackPool:u,ignorePattern:A,packageRegistry:p,shebang:h}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has(\"pnpEnableEsmLoader\"))return this.opts.project.configuration.get(\"pnpEnableEsmLoader\");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type===\"module\")return!0;return!1}async finalizeInstallWithPnp(e){let r=qh(this.opts.project),o=await this.locateNodeModules(e.ignorePattern);if(o.length>0){this.opts.report.reportWarning(31,\"One or more node_modules have been detected and will be removed. This operation may take some time.\");for(let n of o)await oe.removePromise(n)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get(\"pnpEnableInlining\")){let n=kIe(e);await oe.changeFilePromise(r.cjs,n,{automaticNewlines:!0,mode:493}),await oe.removePromise(r.data)}else{let{dataFile:n,loaderFile:u}=QIe(e);await oe.changeFilePromise(r.cjs,u,{automaticNewlines:!0,mode:493}),await oe.changeFilePromise(r.data,n,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(0,\"ESM support for PnP uses the experimental loader API and is therefore experimental\"),await oe.changeFilePromise(r.esmLoader,(0,Zq.default)(),{automaticNewlines:!0,mode:420}));let a=this.opts.project.configuration.get(\"pnpUnpluggedFolder\");if(this.unpluggedPaths.size===0)await oe.removePromise(a);else for(let n of await oe.readdirPromise(a)){let u=V.resolve(a,n);this.unpluggedPaths.has(u)||await oe.removePromise(u)}}async locateNodeModules(e){let r=[],o=e?new RegExp(e):null;for(let a of this.opts.project.workspaces){let n=V.join(a.cwd,\"node_modules\");if(o&&o.test(V.relative(this.opts.project.cwd,a.cwd))||!oe.existsSync(n))continue;let u=await oe.readdirPromise(n,{withFileTypes:!0}),A=u.filter(p=>!p.isDirectory()||p.name===\".bin\"||!p.name.startsWith(\".\"));if(A.length===u.length)r.push(n);else for(let p of A)r.push(V.join(n,p.name))}return r}async unplugPackageIfNeeded(e,r,o,a,n){return this.shouldBeUnplugged(e,r,a)?this.unplugPackage(e,o,n):o.packageFs}shouldBeUnplugged(e,r,o){return typeof o.unplugged<\"u\"?o.unplugged:JIt.has(e.identHash)||e.conditions!=null?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(AQ(e,r,o,{configuration:this.opts.project.configuration})?.skipped===!1||r.misc.extractHint)}async unplugPackage(e,r,o){let a=qB(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new Hu(a,{baseFs:r.packageFs,pathUtils:V}):(this.unpluggedPaths.add(a),o.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let n=V.join(a,r.prefixPath,\".ready\");await oe.existsPromise(n)||(this.opts.project.storedBuildState.delete(e.locatorHash),await oe.mkdirPromise(a,{recursive:!0}),await oe.copyPromise(a,It.dot,{baseFs:r.packageFs,overwrite:!1}),await oe.writeFilePromise(n,\"\"))})),new gn(a))}getPackageInformation(e){let r=G.stringifyIdent(e),o=e.reference,a=this.packageRegistry.get(r);if(!a)throw new Error(`Assertion failed: The package information store should have been available (for ${G.prettyIdent(this.opts.project.configuration,e)})`);let n=a.get(o);if(!n)throw new Error(`Assertion failed: The package information should have been available (for ${G.prettyLocator(this.opts.project.configuration,e)})`);return n}getDiskInformation(e){let r=He.getMapWithDefault(this.packageRegistry,\"@@disk\"),o=tj(this.opts.project.cwd,e);return He.getFactoryWithDefault(r,o,()=>({packageLocation:o,packageDependencies:new Map,packagePeers:new Set,linkType:\"SOFT\",discardFromLookup:!1}))}};function tj(t,e){let r=V.relative(t,e);return r.match(/^\\.{0,2}\\//)||(r=`./${r}`),r.replace(/\\/?$/,\"/\")}async function XIt(t){let e=await Ut.tryFind(t.prefixPath,{baseFs:t.packageFs})??new Ut,r=new Set([\"preinstall\",\"install\",\"postinstall\"]);for(let o of e.scripts.keys())r.has(o)||e.scripts.delete(o);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:$q(t),hasBindingGyp:ej(t)}}}Ge();Ge();qt();var i1e=Ze($o());var cC=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Unplug direct dependencies from the entire project\"});this.recursive=ge.Boolean(\"-R,--recursive\",!1,{description:\"Unplug both direct and transitive dependencies\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.patterns=ge.Rest()}static{this.paths=[[\"unplug\"]]}static{this.usage=it.Usage({description:\"force the unpacking of a list of packages\",details:\"\\n      This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\\n\\n      A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\\n\\n      Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\\n\\n      By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\\n\\n      This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\\n    \",examples:[[\"Unplug the lodash dependency from the active workspace\",\"yarn unplug lodash\"],[\"Unplug all instances of lodash referenced by any workspace\",\"yarn unplug lodash -A\"],[\"Unplug all instances of lodash referenced by the active workspace and its dependencies\",\"yarn unplug lodash -R\"],[\"Unplug all instances of lodash, anywhere\",\"yarn unplug lodash -AR\"],[\"Unplug one specific version of lodash\",\"yarn unplug lodash@1.2.3\"],[\"Unplug all packages with the `@babel` scope\",\"yarn unplug '@babel/*'\"],[\"Unplug all packages (only for testing, not recommended)\",\"yarn unplug -R '*'\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n=await Gr.find(r);if(!a)throw new sr(o.cwd,this.context.cwd);if(r.get(\"nodeLinker\")!==\"pnp\")throw new st(\"This command can only be used if the `nodeLinker` option is set to `pnp`\");await o.restoreInstallState();let u=new Set(this.patterns),A=this.patterns.map(x=>{let C=G.parseDescriptor(x),R=C.range!==\"unknown\"?C:G.makeDescriptor(C,\"*\");if(!Lr.validRange(R.range))throw new st(`The range of the descriptor patterns must be a valid semver range (${G.prettyDescriptor(r,R)})`);return L=>{let U=G.stringifyIdent(L);return!i1e.default.isMatch(U,G.stringifyIdent(R))||L.version&&!Lr.satisfiesWithPrereleases(L.version,R.range)?!1:(u.delete(x),!0)}}),p=()=>{let x=[];for(let C of o.storedPackages.values())!o.tryWorkspaceByLocator(C)&&!G.isVirtualLocator(C)&&A.some(R=>R(C))&&x.push(C);return x},h=x=>{let C=new Set,R=[],L=(U,z)=>{if(C.has(U.locatorHash))return;let te=!!o.tryWorkspaceByLocator(U);if(!(z>0&&!this.recursive&&te)&&(C.add(U.locatorHash),!o.tryWorkspaceByLocator(U)&&A.some(ae=>ae(U))&&R.push(U),!(z>0&&!this.recursive)))for(let ae of U.dependencies.values()){let le=o.storedResolutions.get(ae.descriptorHash);if(!le)throw new Error(\"Assertion failed: The resolution should have been registered\");let ce=o.storedPackages.get(le);if(!ce)throw new Error(\"Assertion failed: The package should have been registered\");L(ce,z+1)}};for(let U of x)L(U.anchoredPackage,0);return R},E,I;if(this.all&&this.recursive?(E=p(),I=\"the project\"):this.all?(E=h(o.workspaces),I=\"any workspace\"):(E=h([a]),I=\"this workspace\"),u.size>1)throw new st(`Patterns ${pe.prettyList(r,u,pe.Type.CODE)} don't match any packages referenced by ${I}`);if(u.size>0)throw new st(`Pattern ${pe.prettyList(r,u,pe.Type.CODE)} doesn't match any packages referenced by ${I}`);E=He.sortMap(E,x=>G.stringifyLocator(x));let v=await Rt.start({configuration:r,stdout:this.context.stdout,json:this.json},async x=>{for(let C of E){let R=C.version??\"unknown\",L=o.topLevelWorkspace.manifest.ensureDependencyMeta(G.makeDescriptor(C,R));L.unplugged=!0,x.reportInfo(0,`Will unpack ${G.prettyLocator(r,C)} to ${pe.pretty(r,qB(C,{configuration:r}),pe.Type.PATH)}`),x.reportJson({locator:G.stringifyLocator(C),version:R})}await o.topLevelWorkspace.persistManifest(),this.json||x.reportSeparator()});return v.hasErrors()?v.exitCode():await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};var qh=t=>({cjs:V.join(t.cwd,dr.pnpCjs),data:V.join(t.cwd,dr.pnpData),esmLoader:V.join(t.cwd,dr.pnpEsmLoader)}),o1e=t=>/\\s/.test(t)?JSON.stringify(t):t;async function ZIt(t,e,r){let o=/\\s*--require\\s+\\S*\\.pnp\\.c?js\\s*/g,a=/\\s*--experimental-loader\\s+\\S*\\.pnp\\.loader\\.mjs\\s*/,n=(e.NODE_OPTIONS??\"\").replace(o,\" \").replace(a,\" \").trim();if(t.configuration.get(\"nodeLinker\")!==\"pnp\"){e.NODE_OPTIONS=n||void 0;return}let u=qh(t),A=`--require ${o1e(ue.fromPortablePath(u.cjs))}`;oe.existsSync(u.esmLoader)&&(A=`${A} --experimental-loader ${(0,s1e.pathToFileURL)(ue.fromPortablePath(u.esmLoader)).href}`),oe.existsSync(u.cjs)&&(e.NODE_OPTIONS=n?`${A} ${n}`:A)}async function $It(t,e){let r=qh(t);e(r.cjs),e(r.data),e(r.esmLoader),e(t.configuration.get(\"pnpUnpluggedFolder\"))}var e1t={hooks:{populateYarnPaths:$It,setupScriptEnvironment:ZIt},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: \"pnp\", \"pnpm\", or \"node-modules\"',type:\"STRING\",default:\"pnp\"},winLinkType:{description:\"Whether Yarn should use Windows Junctions or symlinks when creating links on Windows.\",type:\"STRING\",values:[\"junctions\",\"symlinks\"],default:\"junctions\"},pnpMode:{description:\"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.\",type:\"STRING\",default:\"strict\"},pnpShebang:{description:\"String to prepend to the generated PnP script\",type:\"STRING\",default:\"#!/usr/bin/env node\"},pnpIgnorePatterns:{description:\"Array of glob patterns; files matching them will use the classic resolution\",type:\"STRING\",default:[],isArray:!0},pnpEnableEsmLoader:{description:\"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.\",type:\"BOOLEAN\",default:!1},pnpEnableInlining:{description:\"If true, the PnP data will be inlined along with the generated loader\",type:\"BOOLEAN\",default:!0},pnpFallbackMode:{description:\"If true, the generated PnP loader will follow the top-level fallback rule\",type:\"STRING\",default:\"dependencies-only\"},pnpUnpluggedFolder:{description:\"Folder where the unplugged packages must be stored\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/unplugged\"}},linkers:[Hh],commands:[cC]},t1t=e1t;var h1e=Ze(A1e());qt();var cj=Ze(ve(\"crypto\")),g1e=Ze(ve(\"fs\")),d1e=1,Di=\"node_modules\",fQ=\".bin\",m1e=\".yarn-state.yml\",y1t=1e3,uj=(o=>(o.CLASSIC=\"classic\",o.HARDLINKS_LOCAL=\"hardlinks-local\",o.HARDLINKS_GLOBAL=\"hardlinks-global\",o))(uj||{}),GB=class{constructor(){this.installStateCache=new Map}getCustomDataKey(){return JSON.stringify({name:\"NodeModulesLinker\",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error(\"Assertion failed: Expected the node-modules linker to be enabled\");let o=r.project.tryWorkspaceByLocator(e);if(o)return o.cwd;let a=await He.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await lj(r.project,{unrollAliases:!0}));if(a===null)throw new st(\"Couldn't find the node_modules state file - running an install might help (findPackageLocation)\");let n=a.locatorMap.get(G.stringifyLocator(e));if(!n){let p=new st(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw p.code=\"LOCATOR_NOT_INSTALLED\",p}let u=n.locations.sort((p,h)=>p.split(V.sep).length-h.split(V.sep).length),A=V.join(r.project.configuration.startingCwd,Di);return u.find(p=>V.contains(A,p))||n.locations[0]}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=await He.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await lj(r.project,{unrollAliases:!0}));if(o===null)return null;let{locationRoot:a,segments:n}=pQ(V.resolve(e),{skipPrefix:r.project.cwd}),u=o.locationTree.get(a);if(!u)return null;let A=u.locator;for(let p of n){if(u=u.children.get(p),!u)break;A=u.locator||A}return G.parseLocator(A)}makeInstaller(e){return new aj(e)}isEnabled(e){return e.project.configuration.get(\"nodeLinker\")===\"node-modules\"}},aj=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}attachCustomData(e){this.customData=e}async installPackage(e,r){let o=V.resolve(r.packageFs.getRealPath(),r.prefixPath),a=this.customData.store.get(e.locatorHash);if(typeof a>\"u\"&&(a=await E1t(e,r),e.linkType===\"HARD\"&&this.customData.store.set(e.locatorHash,a)),!G.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildRequest:null};let n=new Map,u=new Set;n.has(G.stringifyIdent(e))||n.set(G.stringifyIdent(e),e.reference);let A=e;if(G.isVirtualLocator(e)){A=G.devirtualizeLocator(e);for(let E of e.peerDependencies.values())n.set(G.stringifyIdent(E),null),u.add(G.stringifyIdent(E))}let p={packageLocation:`${ue.fromPortablePath(o)}/`,packageDependencies:n,packagePeers:u,linkType:e.linkType,discardFromLookup:r.discardFromLookup??!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:a,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:p});let h=r.checksum?r.checksum.substring(r.checksum.indexOf(\"/\")+1):null;return this.realLocatorChecksums.set(A.locatorHash,h),{packageLocation:o,buildRequest:null}}async attachInternalDependencies(e,r){let o=this.localStore.get(e.locatorHash);if(typeof o>\"u\")throw new Error(\"Assertion failed: Expected information object to have been registered\");for(let[a,n]of r){let u=G.areIdentsEqual(a,n)?n.reference:[G.stringifyIdent(n),n.reference];o.pnpNode.packageDependencies.set(G.stringifyIdent(a),u)}}async attachExternalDependents(e,r){throw new Error(\"External dependencies haven't been implemented for the node-modules linker\")}async finalizeInstall(){if(this.opts.project.configuration.get(\"nodeLinker\")!==\"node-modules\")return;let e=new zs({baseFs:new rA({maxOpenFiles:80,readOnlyArchives:!0})}),r=await lj(this.opts.project),o=this.opts.project.configuration.get(\"nmMode\");(r===null||o!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:o,mtimeMs:0});let a=new Map(this.opts.project.workspaces.map(v=>{let x=this.opts.project.configuration.get(\"nmHoistingLimits\");try{x=He.validateEnum(QB,v.manifest.installConfig?.hoistingLimits??x)}catch{let R=G.prettyWorkspace(this.opts.project.configuration,v);this.opts.report.reportWarning(57,`${R}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(QB).join(\", \")}, using default: \"${x}\"`)}return[v.relativeCwd,x]})),n=new Map(this.opts.project.workspaces.map(v=>{let x=this.opts.project.configuration.get(\"nmSelfReferences\");return x=v.manifest.installConfig?.selfReferences??x,[v.relativeCwd,x]})),u={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(v,x)=>Array.isArray(x)?{name:x[0],reference:x[1]}:{name:v,reference:x},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(v=>{let x=v.anchoredLocator;return{name:G.stringifyIdent(x),reference:x.reference}}),getPackageInformation:v=>{let x=v.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:G.makeLocator(G.parseIdent(v.name),v.reference),C=this.localStore.get(x.locatorHash);if(typeof C>\"u\")throw new Error(\"Assertion failed: Expected the package reference to have been registered\");return C.pnpNode},findPackageLocator:v=>{let x=this.opts.project.tryWorkspaceByCwd(ue.toPortablePath(v));if(x!==null){let C=x.anchoredLocator;return{name:G.stringifyIdent(C),reference:C.reference}}throw new Error(\"Assertion failed: Unimplemented\")},resolveToUnqualified:()=>{throw new Error(\"Assertion failed: Unimplemented\")},resolveUnqualified:()=>{throw new Error(\"Assertion failed: Unimplemented\")},resolveRequest:()=>{throw new Error(\"Assertion failed: Unimplemented\")},resolveVirtual:v=>ue.fromPortablePath(zs.resolveVirtual(ue.toPortablePath(v)))},{tree:A,errors:p,preserveSymlinksRequired:h}=FB(u,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:a,project:this.opts.project,selfReferencesByCwd:n});if(!A){for(let{messageName:v,text:x}of p)this.opts.report.reportError(v,x);return}let E=Mq(A);await D1t(r,E,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async v=>{let x=G.parseLocator(v),C=this.localStore.get(x.locatorHash);if(typeof C>\"u\")throw new Error(\"Assertion failed: Expected the slot to exist\");return C.customPackageData.manifest}});let I=[];for(let[v,x]of E.entries()){if(C1e(v))continue;let C=G.parseLocator(v),R=this.localStore.get(C.locatorHash);if(typeof R>\"u\")throw new Error(\"Assertion failed: Expected the slot to exist\");if(this.opts.project.tryWorkspaceByLocator(R.pkg))continue;let L=mA.extractBuildRequest(R.pkg,R.customPackageData,R.dependencyMeta,{configuration:this.opts.project.configuration});L&&I.push({buildLocations:x.locations,locator:C,buildRequest:L})}return h&&this.opts.report.reportWarning(72,`The application uses portals and that's why ${pe.pretty(this.opts.project.configuration,\"--preserve-symlinks\",pe.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:I}}};async function E1t(t,e){let r=await Ut.tryFind(e.prefixPath,{baseFs:e.packageFs})??new Ut,o=new Set([\"preinstall\",\"install\",\"postinstall\"]);for(let a of r.scripts.keys())o.has(a)||r.scripts.delete(a);return{manifest:{bin:r.bin,scripts:r.scripts},misc:{hasBindingGyp:mA.hasBindingGyp(e)}}}async function C1t(t,e,r,o,{installChangedByUser:a}){let n=\"\";n+=`# Warning: This file is automatically generated. Removing it is fine, but will\n`,n+=`# cause your node_modules installation to become invalidated.\n`,n+=`\n`,n+=`__metadata:\n`,n+=`  version: ${d1e}\n`,n+=`  nmMode: ${o.value}\n`;let u=Array.from(e.keys()).sort(),A=G.stringifyLocator(t.topLevelWorkspace.anchoredLocator);for(let E of u){let I=e.get(E);n+=`\n`,n+=`${JSON.stringify(E)}:\n`,n+=`  locations:\n`;for(let v of I.locations){let x=V.contains(t.cwd,v);if(x===null)throw new Error(`Assertion failed: Expected the path to be within the project (${v})`);n+=`    - ${JSON.stringify(x)}\n`}if(I.aliases.length>0){n+=`  aliases:\n`;for(let v of I.aliases)n+=`    - ${JSON.stringify(v)}\n`}if(E===A&&r.size>0){n+=`  bin:\n`;for(let[v,x]of r){let C=V.contains(t.cwd,v);if(C===null)throw new Error(`Assertion failed: Expected the path to be within the project (${v})`);n+=`    ${JSON.stringify(C)}:\n`;for(let[R,L]of x){let U=V.relative(V.join(v,Di),L);n+=`      ${JSON.stringify(R)}: ${JSON.stringify(U)}\n`}}}}let p=t.cwd,h=V.join(p,Di,m1e);a&&await oe.removePromise(h),await oe.changeFilePromise(h,n,{automaticNewlines:!0})}async function lj(t,{unrollAliases:e=!1}={}){let r=t.cwd,o=V.join(r,Di,m1e),a;try{a=await oe.statPromise(o)}catch{}if(!a)return null;let n=Ki(await oe.readFilePromise(o,\"utf8\"));if(n.__metadata.version>d1e)return null;let u=n.__metadata.nmMode||\"classic\",A=new Map,p=new Map;delete n.__metadata;for(let[h,E]of Object.entries(n)){let I=E.locations.map(x=>V.join(r,x)),v=E.bin;if(v)for(let[x,C]of Object.entries(v)){let R=V.join(r,ue.toPortablePath(x)),L=He.getMapWithDefault(p,R);for(let[U,z]of Object.entries(C))L.set(U,ue.toPortablePath([R,Di,z].join(V.sep)))}if(A.set(h,{target:It.dot,linkType:\"HARD\",locations:I,aliases:E.aliases||[]}),e&&E.aliases)for(let x of E.aliases){let{scope:C,name:R}=G.parseLocator(h),L=G.makeLocator(G.makeIdent(C,R),x),U=G.stringifyLocator(L);A.set(U,{target:It.dot,linkType:\"HARD\",locations:I,aliases:[]})}}return{locatorMap:A,binSymlinks:p,locationTree:y1e(A,{skipPrefix:t.cwd}),nmMode:u,mtimeMs:a.mtimeMs}}var AC=async(t,e)=>{if(t.split(V.sep).indexOf(Di)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${t}`);try{let r;if(!e.innerLoop&&(r=await oe.lstatPromise(t),!r.isDirectory()&&!r.isSymbolicLink()||r.isSymbolicLink()&&!e.isWorkspaceDir)){await oe.unlinkPromise(t);return}let o=await oe.readdirPromise(t,{withFileTypes:!0});for(let n of o){let u=V.join(t,n.name);n.isDirectory()?(n.name!==Di||e&&e.innerLoop)&&await AC(u,{innerLoop:!0,contentsOnly:!1}):await oe.unlinkPromise(u)}let a=!e.innerLoop&&e.isWorkspaceDir&&r?.isSymbolicLink();!e.contentsOnly&&!a&&await oe.rmdirPromise(t)}catch(r){if(r.code!==\"ENOENT\"&&r.code!==\"ENOTEMPTY\")throw r}},f1e=4,pQ=(t,{skipPrefix:e})=>{let r=V.contains(e,t);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${t} which is outside project root: ${e}`);let o=r.split(V.sep).filter(p=>p!==\"\"),a=o.indexOf(Di),n=o.slice(0,a).join(V.sep),u=V.join(e,n),A=o.slice(a);return{locationRoot:u,segments:A}},y1e=(t,{skipPrefix:e})=>{let r=new Map;if(t===null)return r;let o=()=>({children:new Map,linkType:\"HARD\"});for(let[a,n]of t.entries()){if(n.linkType===\"SOFT\"&&V.contains(e,n.target)!==null){let A=He.getFactoryWithDefault(r,n.target,o);A.locator=a,A.linkType=n.linkType}for(let u of n.locations){let{locationRoot:A,segments:p}=pQ(u,{skipPrefix:e}),h=He.getFactoryWithDefault(r,A,o);for(let E=0;E<p.length;++E){let I=p[E];if(I!==\".\"){let v=He.getFactoryWithDefault(h.children,I,o);h.children.set(I,v),h=v}E===p.length-1&&(h.locator=a,h.linkType=n.linkType)}}}return r},Aj=async(t,e,r)=>{if(process.platform===\"win32\"&&r===\"junctions\"){let o;try{o=await oe.lstatPromise(t)}catch{}if(!o||o.isDirectory()){await oe.symlinkPromise(t,e,\"junction\");return}}await oe.symlinkPromise(V.relative(V.dirname(e),t),e)};async function E1e(t,e,r){let o=V.join(t,`${cj.default.randomBytes(16).toString(\"hex\")}.tmp`);try{await oe.writeFilePromise(o,r);try{await oe.linkPromise(o,e)}catch{}}finally{await oe.unlinkPromise(o)}}async function w1t({srcPath:t,dstPath:e,entry:r,globalHardlinksStore:o,baseFs:a,nmMode:n}){if(r.kind===\"file\"){if(n.value===\"hardlinks-global\"&&o&&r.digest){let A=V.join(o,r.digest.substring(0,2),`${r.digest.substring(2)}.dat`),p;try{let h=await oe.statPromise(A);if(h&&(!r.mtimeMs||h.mtimeMs>r.mtimeMs||h.mtimeMs<r.mtimeMs-y1t))if(await wn.checksumFile(A,{baseFs:oe,algorithm:\"sha1\"})!==r.digest){let I=V.join(o,`${cj.default.randomBytes(16).toString(\"hex\")}.tmp`);await oe.renamePromise(A,I);let v=await a.readFilePromise(t);await oe.writeFilePromise(I,v);try{await oe.linkPromise(I,A),r.mtimeMs=new Date().getTime(),await oe.unlinkPromise(I)}catch{}}else r.mtimeMs||(r.mtimeMs=Math.ceil(h.mtimeMs));await oe.linkPromise(A,e),p=!0}catch{p=!1}if(!p){let h=await a.readFilePromise(t);await E1e(o,A,h),r.mtimeMs=new Date().getTime();try{await oe.linkPromise(A,e)}catch(E){E&&E.code&&E.code==\"EXDEV\"&&(n.value=\"hardlinks-local\",await a.copyFilePromise(t,e))}}}else await a.copyFilePromise(t,e);let u=r.mode&511;u!==420&&await oe.chmodPromise(e,u)}}var I1t=async(t,e,{baseFs:r,globalHardlinksStore:o,nmMode:a,windowsLinkType:n,packageChecksum:u})=>{await oe.mkdirPromise(t,{recursive:!0});let A=async(E=It.dot)=>{let I=V.join(e,E),v=await r.readdirPromise(I,{withFileTypes:!0}),x=new Map;for(let C of v){let R=V.join(E,C.name),L,U=V.join(I,C.name);if(C.isFile()){if(L={kind:\"file\",mode:(await r.lstatPromise(U)).mode},a.value===\"hardlinks-global\"){let z=await wn.checksumFile(U,{baseFs:r,algorithm:\"sha1\"});L.digest=z}}else if(C.isDirectory())L={kind:\"directory\"};else if(C.isSymbolicLink())L={kind:\"symlink\",symlinkTo:await r.readlinkPromise(U)};else throw new Error(`Unsupported file type (file: ${U}, mode: 0o${await r.statSync(U).mode.toString(8).padStart(6,\"0\")})`);if(x.set(R,L),C.isDirectory()&&R!==Di){let z=await A(R);for(let[te,ae]of z)x.set(te,ae)}}return x},p;if(a.value===\"hardlinks-global\"&&o&&u){let E=V.join(o,u.substring(0,2),`${u.substring(2)}.json`);try{p=new Map(Object.entries(JSON.parse(await oe.readFilePromise(E,\"utf8\"))))}catch{p=await A()}}else p=await A();let h=!1;for(let[E,I]of p){let v=V.join(e,E),x=V.join(t,E);if(I.kind===\"directory\")await oe.mkdirPromise(x,{recursive:!0});else if(I.kind===\"file\"){let C=I.mtimeMs;await w1t({srcPath:v,dstPath:x,entry:I,nmMode:a,baseFs:r,globalHardlinksStore:o}),I.mtimeMs!==C&&(h=!0)}else I.kind===\"symlink\"&&await Aj(V.resolve(V.dirname(x),I.symlinkTo),x,n)}if(a.value===\"hardlinks-global\"&&o&&h&&u){let E=V.join(o,u.substring(0,2),`${u.substring(2)}.json`);await oe.removePromise(E),await E1e(o,E,Buffer.from(JSON.stringify(Object.fromEntries(p))))}};function B1t(t,e,r,o){let a=new Map,n=new Map,u=new Map,A=!1,p=(h,E,I,v,x)=>{let C=!0,R=V.join(h,E),L=new Set;if(E===Di||E.startsWith(\"@\")){let z;try{z=oe.statSync(R)}catch{}C=!!z,z?z.mtimeMs>r?(A=!0,L=new Set(oe.readdirSync(R))):L=new Set(I.children.get(E).children.keys()):A=!0;let te=e.get(h);if(te){let ae=V.join(h,Di,fQ),le;try{le=oe.statSync(ae)}catch{}if(!le)A=!0;else if(le.mtimeMs>r){A=!0;let ce=new Set(oe.readdirSync(ae)),Ce=new Map;n.set(h,Ce);for(let[de,Be]of te)ce.has(de)&&Ce.set(de,Be)}else n.set(h,te)}}else C=x.has(E);let U=I.children.get(E);if(C){let{linkType:z,locator:te}=U,ae={children:new Map,linkType:z,locator:te};if(v.children.set(E,ae),te){let le=He.getSetWithDefault(u,te);le.add(R),u.set(te,le)}for(let le of U.children.keys())p(R,le,U,ae,L)}else U.locator&&o.storedBuildState.delete(G.parseLocator(U.locator).locatorHash)};for(let[h,E]of t){let{linkType:I,locator:v}=E,x={children:new Map,linkType:I,locator:v};if(a.set(h,x),v){let C=He.getSetWithDefault(u,E.locator);C.add(h),u.set(E.locator,C)}E.children.has(Di)&&p(h,Di,E,x,new Set)}return{locationTree:a,binSymlinks:n,locatorLocations:u,installChangedByUser:A}}function C1e(t){let e=G.parseDescriptor(t);return G.isVirtualDescriptor(e)&&(e=G.devirtualizeDescriptor(e)),e.range.startsWith(\"link:\")}async function v1t(t,e,r,{loadManifest:o}){let a=new Map;for(let[A,{locations:p}]of t){let h=C1e(A)?null:await o(A,p[0]),E=new Map;if(h)for(let[I,v]of h.bin){let x=V.join(p[0],v);v!==\"\"&&oe.existsSync(x)&&E.set(I,v)}a.set(A,E)}let n=new Map,u=(A,p,h)=>{let E=new Map,I=V.contains(r,A);if(h.locator&&I!==null){let v=a.get(h.locator);for(let[x,C]of v){let R=V.join(A,ue.toPortablePath(C));E.set(x,R)}for(let[x,C]of h.children){let R=V.join(A,x),L=u(R,R,C);L.size>0&&n.set(A,new Map([...n.get(A)||new Map,...L]))}}else for(let[v,x]of h.children){let C=u(V.join(A,v),p,x);for(let[R,L]of C)E.set(R,L)}return E};for(let[A,p]of e){let h=u(A,A,p);h.size>0&&n.set(A,new Map([...n.get(A)||new Map,...h]))}return n}var p1e=(t,e)=>{if(!t||!e)return t===e;let r=G.parseLocator(t);G.isVirtualLocator(r)&&(r=G.devirtualizeLocator(r));let o=G.parseLocator(e);return G.isVirtualLocator(o)&&(o=G.devirtualizeLocator(o)),G.areLocatorsEqual(r,o)};function fj(t){return V.join(t.get(\"globalFolder\"),\"store\")}async function D1t(t,e,{baseFs:r,project:o,report:a,loadManifest:n,realLocatorChecksums:u}){let A=V.join(o.cwd,Di),{locationTree:p,binSymlinks:h,locatorLocations:E,installChangedByUser:I}=B1t(t.locationTree,t.binSymlinks,t.mtimeMs,o),v=y1e(e,{skipPrefix:o.cwd}),x=[],C=async({srcDir:Be,dstDir:Ee,linkType:g,globalHardlinksStore:me,nmMode:we,windowsLinkType:Ae,packageChecksum:ne})=>{let Z=(async()=>{try{g===\"SOFT\"?(await oe.mkdirPromise(V.dirname(Ee),{recursive:!0}),await Aj(V.resolve(Be),Ee,Ae)):await I1t(Ee,Be,{baseFs:r,globalHardlinksStore:me,nmMode:we,windowsLinkType:Ae,packageChecksum:ne})}catch(xe){throw xe.message=`While persisting ${Be} -> ${Ee} ${xe.message}`,xe}finally{ae.tick()}})().then(()=>x.splice(x.indexOf(Z),1));x.push(Z),x.length>f1e&&await Promise.race(x)},R=async(Be,Ee,g)=>{let me=(async()=>{let we=async(Ae,ne,Z)=>{try{Z.innerLoop||await oe.mkdirPromise(ne,{recursive:!0});let xe=await oe.readdirPromise(Ae,{withFileTypes:!0});for(let Ne of xe){if(!Z.innerLoop&&Ne.name===fQ)continue;let ht=V.join(Ae,Ne.name),H=V.join(ne,Ne.name);Ne.isDirectory()?(Ne.name!==Di||Z&&Z.innerLoop)&&(await oe.mkdirPromise(H,{recursive:!0}),await we(ht,H,{...Z,innerLoop:!0})):Ce.value===\"hardlinks-local\"||Ce.value===\"hardlinks-global\"?await oe.linkPromise(ht,H):await oe.copyFilePromise(ht,H,g1e.default.constants.COPYFILE_FICLONE)}}catch(xe){throw Z.innerLoop||(xe.message=`While cloning ${Ae} -> ${ne} ${xe.message}`),xe}finally{Z.innerLoop||ae.tick()}};await we(Be,Ee,g)})().then(()=>x.splice(x.indexOf(me),1));x.push(me),x.length>f1e&&await Promise.race(x)},L=async(Be,Ee,g)=>{if(g)for(let[me,we]of Ee.children){let Ae=g.children.get(me);await L(V.join(Be,me),we,Ae)}else{Ee.children.has(Di)&&await AC(V.join(Be,Di),{contentsOnly:!1});let me=V.basename(Be)===Di&&p.has(V.join(V.dirname(Be)));await AC(Be,{contentsOnly:Be===A,isWorkspaceDir:me})}};for(let[Be,Ee]of p){let g=v.get(Be);for(let[me,we]of Ee.children){if(me===\".\")continue;let Ae=g&&g.children.get(me),ne=V.join(Be,me);await L(ne,we,Ae)}}let U=async(Be,Ee,g)=>{if(g){p1e(Ee.locator,g.locator)||await AC(Be,{contentsOnly:Ee.linkType===\"HARD\"});for(let[me,we]of Ee.children){let Ae=g.children.get(me);await U(V.join(Be,me),we,Ae)}}else{Ee.children.has(Di)&&await AC(V.join(Be,Di),{contentsOnly:!0});let me=V.basename(Be)===Di&&v.has(V.join(V.dirname(Be)));await AC(Be,{contentsOnly:Ee.linkType===\"HARD\",isWorkspaceDir:me})}};for(let[Be,Ee]of v){let g=p.get(Be);for(let[me,we]of Ee.children){if(me===\".\")continue;let Ae=g&&g.children.get(me);await U(V.join(Be,me),we,Ae)}}let z=new Map,te=[];for(let[Be,Ee]of E)for(let g of Ee){let{locationRoot:me,segments:we}=pQ(g,{skipPrefix:o.cwd}),Ae=v.get(me),ne=me;if(Ae){for(let Z of we)if(ne=V.join(ne,Z),Ae=Ae.children.get(Z),!Ae)break;if(Ae){let Z=p1e(Ae.locator,Be),xe=e.get(Ae.locator),Ne=xe.target,ht=ne,H=xe.linkType;if(Z)z.has(Ne)||z.set(Ne,ht);else if(Ne!==ht){let rt=G.parseLocator(Ae.locator);G.isVirtualLocator(rt)&&(rt=G.devirtualizeLocator(rt)),te.push({srcDir:Ne,dstDir:ht,linkType:H,realLocatorHash:rt.locatorHash})}}}}for(let[Be,{locations:Ee}]of e.entries())for(let g of Ee){let{locationRoot:me,segments:we}=pQ(g,{skipPrefix:o.cwd}),Ae=p.get(me),ne=v.get(me),Z=me,xe=e.get(Be),Ne=G.parseLocator(Be);G.isVirtualLocator(Ne)&&(Ne=G.devirtualizeLocator(Ne));let ht=Ne.locatorHash,H=xe.target,rt=g;if(H===rt)continue;let Te=xe.linkType;for(let Fe of we)ne=ne.children.get(Fe);if(!Ae)te.push({srcDir:H,dstDir:rt,linkType:Te,realLocatorHash:ht});else for(let Fe of we)if(Z=V.join(Z,Fe),Ae=Ae.children.get(Fe),!Ae){te.push({srcDir:H,dstDir:rt,linkType:Te,realLocatorHash:ht});break}}let ae=Zs.progressViaCounter(te.length),le=a.reportProgress(ae),ce=o.configuration.get(\"nmMode\"),Ce={value:ce},de=o.configuration.get(\"winLinkType\");try{let Be=Ce.value===\"hardlinks-global\"?`${fj(o.configuration)}/v1`:null;if(Be&&!await oe.existsPromise(Be)){await oe.mkdirpPromise(Be);for(let g=0;g<256;g++)await oe.mkdirPromise(V.join(Be,g.toString(16).padStart(2,\"0\")))}for(let g of te)(g.linkType===\"SOFT\"||!z.has(g.srcDir))&&(z.set(g.srcDir,g.dstDir),await C({...g,globalHardlinksStore:Be,nmMode:Ce,windowsLinkType:de,packageChecksum:u.get(g.realLocatorHash)||null}));await Promise.all(x),x.length=0;for(let g of te){let me=z.get(g.srcDir);g.linkType!==\"SOFT\"&&g.dstDir!==me&&await R(me,g.dstDir,{nmMode:Ce})}await Promise.all(x),await oe.mkdirPromise(A,{recursive:!0});let Ee=await v1t(e,v,o.cwd,{loadManifest:n});await P1t(h,Ee,o.cwd,de),await C1t(o,e,Ee,Ce,{installChangedByUser:I}),ce==\"hardlinks-global\"&&Ce.value==\"hardlinks-local\"&&a.reportWarningOnce(74,\"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices\")}finally{le.stop()}}async function P1t(t,e,r,o){for(let a of t.keys()){if(V.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);if(!e.has(a)){let n=V.join(a,Di,fQ);await oe.removePromise(n)}}for(let[a,n]of e){if(V.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);let u=V.join(a,Di,fQ),A=t.get(a)||new Map;await oe.mkdirPromise(u,{recursive:!0});for(let p of A.keys())n.has(p)||(await oe.removePromise(V.join(u,p)),process.platform===\"win32\"&&await oe.removePromise(V.join(u,`${p}.cmd`)));for(let[p,h]of n){let E=A.get(p),I=V.join(u,p);E!==h&&(process.platform===\"win32\"?await(0,h1e.default)(ue.fromPortablePath(h),ue.fromPortablePath(I),{createPwshFile:!1}):(await oe.removePromise(I),await Aj(h,I,o),V.contains(r,await oe.realpathPromise(h))!==null&&await oe.chmodPromise(h,493)))}}}Ge();Pt();nA();var YB=class extends Hh{constructor(){super(...arguments);this.mode=\"loose\"}makeInstaller(r){return new pj(r)}},pj=class extends sd{constructor(){super(...arguments);this.mode=\"loose\"}async transformPnpSettings(r){let o=new zs({baseFs:new rA({maxOpenFiles:80,readOnlyArchives:!0})}),a=e1e(r,this.opts.project.cwd,o),{tree:n,errors:u}=FB(a,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:I,text:v}of u)this.opts.report.reportError(I,v);return}let A=new Map;r.fallbackPool=A;let p=(I,v)=>{let x=G.parseLocator(v.locator),C=G.stringifyIdent(x);C===I?A.set(I,x.reference):A.set(I,[C,x.reference])},h=V.join(this.opts.project.cwd,dr.nodeModules),E=n.get(h);if(!(typeof E>\"u\")){if(\"target\"in E)throw new Error(\"Assertion failed: Expected the root junction point to be a directory\");for(let I of E.dirList){let v=V.join(h,I),x=n.get(v);if(typeof x>\"u\")throw new Error(\"Assertion failed: Expected the child to have been registered\");if(\"target\"in x)p(I,x);else for(let C of x.dirList){let R=V.join(v,C),L=n.get(R);if(typeof L>\"u\")throw new Error(\"Assertion failed: Expected the subchild to have been registered\");if(\"target\"in L)p(`${I}/${C}`,L);else throw new Error(\"Assertion failed: Expected the leaf junction to be a package\")}}}}};var b1t={hooks:{cleanGlobalArtifacts:async t=>{let e=fj(t);await oe.removePromise(e)}},configuration:{nmHoistingLimits:{description:\"Prevents packages to be hoisted past specific levels\",type:\"STRING\",values:[\"workspaces\",\"dependencies\",\"none\"],default:\"none\"},nmMode:{description:\"Defines in which measure Yarn must use hardlinks and symlinks when generated `node_modules` directories.\",type:\"STRING\",values:[\"classic\",\"hardlinks-local\",\"hardlinks-global\"],default:\"classic\"},nmSelfReferences:{description:\"Defines whether the linker should generate self-referencing symlinks for workspaces.\",type:\"BOOLEAN\",default:!0}},linkers:[GB,YB]},S1t=b1t;var f5={};Vt(f5,{NpmHttpFetcher:()=>VB,NpmRemapResolver:()=>zB,NpmSemverFetcher:()=>rp,NpmSemverResolver:()=>JB,NpmTagResolver:()=>XB,default:()=>jvt,npmConfigUtils:()=>Zn,npmHttpUtils:()=>Zr,npmPublishUtils:()=>PC});Ge();var S1e=Ze(Jn());var Wn=\"npm:\";var Zr={};Vt(Zr,{AuthType:()=>D1e,customPackageError:()=>od,del:()=>_1t,get:()=>ad,getIdentUrl:()=>hQ,getPackageMetadata:()=>hC,handleInvalidAuthenticationError:()=>jh,post:()=>O1t,put:()=>U1t});Ge();Ge();Pt();var mj=Ze(J1()),B1e=Ze(y_()),v1e=Ze(Jn());var Zn={};Vt(Zn,{RegistryType:()=>w1e,getAuditRegistry:()=>x1t,getAuthConfiguration:()=>dj,getDefaultRegistry:()=>WB,getPublishRegistry:()=>k1t,getRegistryConfiguration:()=>I1e,getScopeConfiguration:()=>gj,getScopeRegistry:()=>fC,normalizeRegistry:()=>ac});var w1e=(o=>(o.AUDIT_REGISTRY=\"npmAuditRegistry\",o.FETCH_REGISTRY=\"npmRegistryServer\",o.PUBLISH_REGISTRY=\"npmPublishRegistry\",o))(w1e||{});function ac(t){return t.replace(/\\/$/,\"\")}function x1t({configuration:t}){return WB({configuration:t,type:\"npmAuditRegistry\"})}function k1t(t,{configuration:e}){return t.publishConfig?.registry?ac(t.publishConfig.registry):t.name?fC(t.name.scope,{configuration:e,type:\"npmPublishRegistry\"}):WB({configuration:e,type:\"npmPublishRegistry\"})}function fC(t,{configuration:e,type:r=\"npmRegistryServer\"}){let o=gj(t,{configuration:e});if(o===null)return WB({configuration:e,type:r});let a=o.get(r);return a===null?WB({configuration:e,type:r}):ac(a)}function WB({configuration:t,type:e=\"npmRegistryServer\"}){let r=t.get(e);return ac(r!==null?r:t.get(\"npmRegistryServer\"))}function I1e(t,{configuration:e}){let r=e.get(\"npmRegistries\"),o=ac(t),a=r.get(o);if(typeof a<\"u\")return a;let n=r.get(o.replace(/^[a-z]+:/,\"\"));return typeof n<\"u\"?n:null}function gj(t,{configuration:e}){if(t===null)return null;let o=e.get(\"npmScopes\").get(t);return o||null}function dj(t,{configuration:e,ident:r}){let o=r&&gj(r.scope,{configuration:e});return o?.get(\"npmAuthIdent\")||o?.get(\"npmAuthToken\")?o:I1e(t,{configuration:e})||e}var D1e=(a=>(a[a.NO_AUTH=0]=\"NO_AUTH\",a[a.BEST_EFFORT=1]=\"BEST_EFFORT\",a[a.CONFIGURATION=2]=\"CONFIGURATION\",a[a.ALWAYS_AUTH=3]=\"ALWAYS_AUTH\",a))(D1e||{});async function jh(t,{attemptedAs:e,registry:r,headers:o,configuration:a}){if(dQ(t))throw new Jt(41,\"Invalid OTP token\");if(t.originalError?.name===\"HTTPError\"&&t.originalError?.response.statusCode===401)throw new Jt(41,`Invalid authentication (${typeof e!=\"string\"?`as ${await q1t(r,o,{configuration:a})}`:`attempted as ${e}`})`)}function od(t,e){let r=t.response?.statusCode;return r?r===404?\"Package not found\":r>=500&&r<600?`The registry appears to be down (using a ${pe.applyHyperlink(e,\"local cache\",\"https://yarnpkg.com/advanced/lexicon#local-cache\")} might have protected you against such outages)`:null:null}function hQ(t){return t.scope?`/@${t.scope}%2f${t.name}`:`/${t.name}`}var P1e=new Map,Q1t=new Map;async function F1t(t){return await He.getFactoryWithDefault(P1e,t,async()=>{let e=null;try{e=await oe.readJsonPromise(t)}catch{}return e})}async function R1t(t,e,{configuration:r,cached:o,registry:a,headers:n,version:u,...A}){return await He.getFactoryWithDefault(Q1t,t,async()=>await ad(hQ(e),{...A,customErrorMessage:od,configuration:r,registry:a,ident:e,headers:{...n,\"If-None-Match\":o?.etag,\"If-Modified-Since\":o?.lastModified},wrapNetworkRequest:async p=>async()=>{let h=await p();if(h.statusCode===304){if(o===null)throw new Error(\"Assertion failed: cachedMetadata should not be null\");return{...h,body:o.metadata}}let E=T1t(JSON.parse(h.body.toString())),I={metadata:E,etag:h.headers.etag,lastModified:h.headers[\"last-modified\"]};return P1e.set(t,Promise.resolve(I)),Promise.resolve().then(async()=>{let v=`${t}-${process.pid}.tmp`;await oe.mkdirPromise(V.dirname(v),{recursive:!0}),await oe.writeJsonPromise(v,I,{compact:!0}),await oe.renamePromise(v,t)}).catch(()=>{}),{...h,body:E}}}))}async function hC(t,{cache:e,project:r,registry:o,headers:a,version:n,...u}){let{configuration:A}=r;o=KB(A,{ident:t,registry:o});let p=L1t(A,o),h=V.join(p,`${G.slugifyIdent(t)}.json`),E=null;if(!r.lockfileNeedsRefresh&&(E=await F1t(h),E)){if(typeof n<\"u\"&&typeof E.metadata.versions[n]<\"u\")return E.metadata;if(A.get(\"enableOfflineMode\")){let I=structuredClone(E.metadata),v=new Set;if(e){for(let C of Object.keys(I.versions)){let R=G.makeLocator(t,`npm:${C}`),L=e.getLocatorMirrorPath(R);(!L||!oe.existsSync(L))&&(delete I.versions[C],v.add(C))}let x=I[\"dist-tags\"].latest;if(v.has(x)){let C=Object.keys(E.metadata.versions).sort(v1e.default.compare),R=C.indexOf(x);for(;v.has(C[R])&&R>=0;)R-=1;R>=0?I[\"dist-tags\"].latest=C[R]:delete I[\"dist-tags\"].latest}}return I}}return await R1t(h,t,{...u,configuration:A,cached:E,registry:o,headers:a,version:n})}var b1e=[\"name\",\"dist.tarball\",\"bin\",\"scripts\",\"os\",\"cpu\",\"libc\",\"dependencies\",\"dependenciesMeta\",\"optionalDependencies\",\"peerDependencies\",\"peerDependenciesMeta\",\"deprecated\"];function T1t(t){return{\"dist-tags\":t[\"dist-tags\"],versions:Object.fromEntries(Object.entries(t.versions).map(([e,r])=>[e,(0,B1e.default)(r,b1e)]))}}var N1t=wn.makeHash(...b1e).slice(0,6);function L1t(t,e){let r=M1t(t),o=new URL(e);return V.join(r,N1t,o.hostname)}function M1t(t){return V.join(t.get(\"globalFolder\"),\"metadata/npm\")}async function ad(t,{configuration:e,headers:r,ident:o,authType:a,registry:n,...u}){n=KB(e,{ident:o,registry:n}),o&&o.scope&&typeof a>\"u\"&&(a=1);let A=await gQ(n,{authType:a,configuration:e,ident:o});A&&(r={...r,authorization:A});try{return await sn.get(t.charAt(0)===\"/\"?`${n}${t}`:t,{configuration:e,headers:r,...u})}catch(p){throw await jh(p,{registry:n,configuration:e,headers:r}),p}}async function O1t(t,e,{attemptedAs:r,configuration:o,headers:a,ident:n,authType:u=3,registry:A,otp:p,...h}){A=KB(o,{ident:n,registry:A});let E=await gQ(A,{authType:u,configuration:o,ident:n});E&&(a={...a,authorization:E}),p&&(a={...a,...pC(p)});try{return await sn.post(A+t,e,{configuration:o,headers:a,...h})}catch(I){if(!dQ(I)||p)throw await jh(I,{attemptedAs:r,registry:A,configuration:o,headers:a}),I;p=await yj(I,{configuration:o});let v={...a,...pC(p)};try{return await sn.post(`${A}${t}`,e,{configuration:o,headers:v,...h})}catch(x){throw await jh(x,{attemptedAs:r,registry:A,configuration:o,headers:a}),x}}}async function U1t(t,e,{attemptedAs:r,configuration:o,headers:a,ident:n,authType:u=3,registry:A,otp:p,...h}){A=KB(o,{ident:n,registry:A});let E=await gQ(A,{authType:u,configuration:o,ident:n});E&&(a={...a,authorization:E}),p&&(a={...a,...pC(p)});try{return await sn.put(A+t,e,{configuration:o,headers:a,...h})}catch(I){if(!dQ(I))throw await jh(I,{attemptedAs:r,registry:A,configuration:o,headers:a}),I;p=await yj(I,{configuration:o});let v={...a,...pC(p)};try{return await sn.put(`${A}${t}`,e,{configuration:o,headers:v,...h})}catch(x){throw await jh(x,{attemptedAs:r,registry:A,configuration:o,headers:a}),x}}}async function _1t(t,{attemptedAs:e,configuration:r,headers:o,ident:a,authType:n=3,registry:u,otp:A,...p}){u=KB(r,{ident:a,registry:u});let h=await gQ(u,{authType:n,configuration:r,ident:a});h&&(o={...o,authorization:h}),A&&(o={...o,...pC(A)});try{return await sn.del(u+t,{configuration:r,headers:o,...p})}catch(E){if(!dQ(E)||A)throw await jh(E,{attemptedAs:e,registry:u,configuration:r,headers:o}),E;A=await yj(E,{configuration:r});let I={...o,...pC(A)};try{return await sn.del(`${u}${t}`,{configuration:r,headers:I,...p})}catch(v){throw await jh(v,{attemptedAs:e,registry:u,configuration:r,headers:o}),v}}}function KB(t,{ident:e,registry:r}){if(typeof r>\"u\"&&e)return fC(e.scope,{configuration:t});if(typeof r!=\"string\")throw new Error(\"Assertion failed: The registry should be a string\");return ac(r)}async function gQ(t,{authType:e=2,configuration:r,ident:o}){let a=dj(t,{configuration:r,ident:o}),n=H1t(a,e);if(!n)return null;let u=await r.reduceHook(A=>A.getNpmAuthenticationHeader,void 0,t,{configuration:r,ident:o});if(u)return u;if(a.get(\"npmAuthToken\"))return`Bearer ${a.get(\"npmAuthToken\")}`;if(a.get(\"npmAuthIdent\")){let A=a.get(\"npmAuthIdent\");return A.includes(\":\")?`Basic ${Buffer.from(A).toString(\"base64\")}`:`Basic ${A}`}if(n&&e!==1)throw new Jt(33,\"No authentication configured for request\");return null}function H1t(t,e){switch(e){case 2:return t.get(\"npmAlwaysAuth\");case 1:case 3:return!0;case 0:return!1;default:throw new Error(\"Unreachable\")}}async function q1t(t,e,{configuration:r}){if(typeof e>\"u\"||typeof e.authorization>\"u\")return\"an anonymous user\";try{return(await sn.get(new URL(`${t}/-/whoami`).href,{configuration:r,headers:e,jsonResponse:!0})).username??\"an unknown user\"}catch{return\"an unknown user\"}}async function yj(t,{configuration:e}){let r=t.originalError?.response.headers[\"npm-notice\"];if(r&&(await Rt.start({configuration:e,stdout:process.stdout,includeFooter:!1},async a=>{if(a.reportInfo(0,r.replace(/(https?:\\/\\/\\S+)/g,pe.pretty(e,\"$1\",pe.Type.URL))),!process.env.YARN_IS_TEST_ENV){let n=r.match(/open (https?:\\/\\/\\S+)/i);if(n&&Xi.openUrl){let{openNow:u}=await(0,mj.prompt)({type:\"confirm\",name:\"openNow\",message:\"Do you want to try to open this url now?\",required:!0,initial:!0,onCancel:()=>process.exit(130)});u&&(await Xi.openUrl(n[1])||(a.reportSeparator(),a.reportWarning(0,\"We failed to automatically open the url; you'll have to open it yourself in your browser of choice.\")))}}}),process.stdout.write(`\n`)),process.env.YARN_IS_TEST_ENV)return process.env.YARN_INJECT_NPM_2FA_TOKEN||\"\";let{otp:o}=await(0,mj.prompt)({type:\"password\",name:\"otp\",message:\"One-time password:\",required:!0,onCancel:()=>process.exit(130)});return process.stdout.write(`\n`),o}function dQ(t){if(t.originalError?.name!==\"HTTPError\")return!1;try{return(t.originalError?.response.headers[\"www-authenticate\"].split(/,\\s*/).map(r=>r.toLowerCase())).includes(\"otp\")}catch{return!1}}function pC(t){return{\"npm-otp\":t}}var VB=class{supports(e,r){if(!e.reference.startsWith(Wn))return!1;let{selector:o,params:a}=G.parseRange(e.reference);return!(!S1e.default.valid(o)||a===null||typeof a.__archiveUrl!=\"string\")}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let{params:o}=G.parseRange(e.reference);if(o===null||typeof o.__archiveUrl!=\"string\")throw new Error(\"Assertion failed: The archiveUrl querystring parameter should have been available\");let a=await ad(o.__archiveUrl,{customErrorMessage:od,configuration:r.project.configuration,ident:e});return await $i.convertToZip(a,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ge();var zB=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Wn)||!G.tryParseDescriptor(e.range.slice(Wn.length),!0))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error(\"Unreachable\")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){let o=r.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(Wn.length),!0));return r.resolver.getResolutionDependencies(o,r)}async getCandidates(e,r,o){let a=o.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(Wn.length),!0));return await o.resolver.getCandidates(a,r,o)}async getSatisfying(e,r,o,a){let n=a.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(Wn.length),!0));return a.resolver.getSatisfying(n,r,o,a)}resolve(e,r){throw new Error(\"Unreachable\")}};Ge();Ge();var x1e=Ze(Jn());var rp=class t{supports(e,r){if(!e.reference.startsWith(Wn))return!1;let o=new URL(e.reference);return!(!x1e.default.valid(o.pathname)||o.searchParams.has(\"__archiveUrl\"))}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o;try{o=await ad(t.getLocatorUrl(e),{customErrorMessage:od,configuration:r.project.configuration,ident:e})}catch{o=await ad(t.getLocatorUrl(e).replace(/%2f/g,\"/\"),{customErrorMessage:od,configuration:r.project.configuration,ident:e})}return await $i.convertToZip(o,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,r,{configuration:o}){let a=fC(e.scope,{configuration:o}),n=t.getLocatorUrl(e);return r=r.replace(/^https?:(\\/\\/(?:[^/]+\\.)?npmjs.org(?:$|\\/))/,\"https:$1\"),a=a.replace(/^https:\\/\\/registry\\.npmjs\\.org($|\\/)/,\"https://registry.yarnpkg.com$1\"),r=r.replace(/^https:\\/\\/registry\\.npmjs\\.org($|\\/)/,\"https://registry.yarnpkg.com$1\"),r===a+n||r===a+n.replace(/%2f/g,\"/\")}static getLocatorUrl(e){let r=Lr.clean(e.reference.slice(Wn.length));if(r===null)throw new Jt(10,\"The npm semver resolver got selected, but the version isn't semver\");return`${hQ(e)}/-/${e.name}-${r}.tgz`}};Ge();Ge();Ge();var Ej=Ze(Jn());var mQ=G.makeIdent(null,\"node-gyp\"),j1t=/\\b(node-gyp|prebuild-install)\\b/,JB=class{supportsDescriptor(e,r){return e.range.startsWith(Wn)?!!Lr.validRange(e.range.slice(Wn.length)):!1}supportsLocator(e,r){if(!e.reference.startsWith(Wn))return!1;let{selector:o}=G.parseRange(e.reference);return!!Ej.default.valid(o)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=Lr.validRange(e.range.slice(Wn.length));if(a===null)throw new Error(`Expected a valid range, got ${e.range.slice(Wn.length)}`);let n=await hC(e,{cache:o.fetchOptions?.cache,project:o.project,version:Ej.default.valid(a.raw)?a.raw:void 0}),u=He.mapAndFilter(Object.keys(n.versions),h=>{try{let E=new Lr.SemVer(h);if(a.test(E))return E}catch{}return He.mapAndFilter.skip}),A=u.filter(h=>!n.versions[h.raw].deprecated),p=A.length>0?A:u;return p.sort((h,E)=>-h.compare(E)),p.map(h=>{let E=G.makeLocator(e,`${Wn}${h.raw}`),I=n.versions[h.raw].dist.tarball;return rp.isConventionalTarballUrl(E,I,{configuration:o.project.configuration})?E:G.bindLocator(E,{__archiveUrl:I})})}async getSatisfying(e,r,o,a){let n=Lr.validRange(e.range.slice(Wn.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Wn.length)}`);return{locators:He.mapAndFilter(o,p=>{if(p.identHash!==e.identHash)return He.mapAndFilter.skip;let h=G.tryParseRange(p.reference,{requireProtocol:Wn});if(!h)return He.mapAndFilter.skip;let E=new Lr.SemVer(h.selector);return n.test(E)?{locator:p,version:E}:He.mapAndFilter.skip}).sort((p,h)=>-p.version.compare(h.version)).map(({locator:p})=>p),sorted:!0}}async resolve(e,r){let{selector:o}=G.parseRange(e.reference),a=Lr.clean(o);if(a===null)throw new Jt(10,\"The npm semver resolver got selected, but the version isn't semver\");let n=await hC(e,{cache:r.fetchOptions?.cache,project:r.project,version:a});if(!Object.hasOwn(n,\"versions\"))throw new Jt(15,'Registry returned invalid data for - missing \"versions\" field');if(!Object.hasOwn(n.versions,a))throw new Jt(16,`Registry failed to return reference \"${a}\"`);let u=new Ut;if(u.load(n.versions[a]),!u.dependencies.has(mQ.identHash)&&!u.peerDependencies.has(mQ.identHash)){for(let A of u.scripts.values())if(A.match(j1t)){u.dependencies.set(mQ.identHash,G.makeDescriptor(mQ,\"latest\"));break}}return{...e,version:a,languageName:\"node\",linkType:\"HARD\",conditions:u.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(u.dependencies),peerDependencies:u.peerDependencies,dependenciesMeta:u.dependenciesMeta,peerDependenciesMeta:u.peerDependenciesMeta,bin:u.bin}}};Ge();Ge();var k1e=Ze(Jn());var XB=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Wn)||!ly.test(e.range.slice(Wn.length)))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error(\"Unreachable\")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(Wn.length),n=await hC(e,{cache:o.fetchOptions?.cache,project:o.project});if(!Object.hasOwn(n,\"dist-tags\"))throw new Jt(15,'Registry returned invalid data - missing \"dist-tags\" field');let u=n[\"dist-tags\"];if(!Object.hasOwn(u,a))throw new Jt(16,`Registry failed to return tag \"${a}\"`);let A=u[a],p=G.makeLocator(e,`${Wn}${A}`),h=n.versions[A].dist.tarball;return rp.isConventionalTarballUrl(p,h,{configuration:o.project.configuration})?[p]:[G.bindLocator(p,{__archiveUrl:h})]}async getSatisfying(e,r,o,a){let n=[];for(let u of o){if(u.identHash!==e.identHash)continue;let A=G.tryParseRange(u.reference,{requireProtocol:Wn});if(!(!A||!k1e.default.valid(A.selector))){if(A.params?.__archiveUrl){let p=G.makeRange({protocol:Wn,selector:A.selector,source:null,params:null}),[h]=await a.resolver.getCandidates(G.makeDescriptor(e,p),r,a);if(u.reference!==h.reference)continue}n.push(u)}}return{locators:n,sorted:!1}}async resolve(e,r){throw new Error(\"Unreachable\")}};var PC={};Vt(PC,{getGitHead:()=>Hvt,getPublishAccess:()=>EBe,getReadmeContent:()=>CBe,makePublishBody:()=>_vt});Ge();Ge();Pt();var a5={};Vt(a5,{PackCommand:()=>DC,default:()=>Ivt,packUtils:()=>CA});Ge();Ge();Ge();Pt();qt();var CA={};Vt(CA,{genPackList:()=>_Q,genPackStream:()=>o5,genPackageManifest:()=>aBe,hasPackScripts:()=>i5,prepareForPack:()=>s5});Ge();Pt();var n5=Ze($o()),sBe=Ze(tBe()),oBe=ve(\"zlib\"),Avt=[\"/package.json\",\"/readme\",\"/readme.*\",\"/license\",\"/license.*\",\"/licence\",\"/licence.*\",\"/changelog\",\"/changelog.*\"],fvt=[\"/package.tgz\",\".github\",\".git\",\".hg\",\"node_modules\",\".npmignore\",\".gitignore\",\".#*\",\".DS_Store\"];async function i5(t){return!!(An.hasWorkspaceScript(t,\"prepack\")||An.hasWorkspaceScript(t,\"postpack\"))}async function s5(t,{report:e},r){await An.maybeExecuteWorkspaceLifecycleScript(t,\"prepack\",{report:e});try{let o=V.join(t.cwd,Ut.fileName);await oe.existsPromise(o)&&await t.manifest.loadFile(o,{baseFs:oe}),await r()}finally{await An.maybeExecuteWorkspaceLifecycleScript(t,\"postpack\",{report:e})}}async function o5(t,e){typeof e>\"u\"&&(e=await _Q(t));let r=new Set;for(let n of t.manifest.publishConfig?.executableFiles??new Set)r.add(V.normalize(n));for(let n of t.manifest.bin.values())r.add(V.normalize(n));let o=sBe.default.pack();process.nextTick(async()=>{for(let n of e){let u=V.normalize(n),A=V.resolve(t.cwd,u),p=V.join(\"package\",u),h=await oe.lstatPromise(A),E={name:p,mtime:new Date(Bi.SAFE_TIME*1e3)},I=r.has(u)?493:420,v,x,C=new Promise((L,U)=>{v=L,x=U}),R=L=>{L?x(L):v()};if(h.isFile()){let L;u===\"package.json\"?L=Buffer.from(JSON.stringify(await aBe(t),null,2)):L=await oe.readFilePromise(A),o.entry({...E,mode:I,type:\"file\"},L,R)}else h.isSymbolicLink()?o.entry({...E,mode:I,type:\"symlink\",linkname:await oe.readlinkPromise(A)},R):R(new Error(`Unsupported file type ${h.mode} for ${ue.fromPortablePath(u)}`));await C}o.finalize()});let a=(0,oBe.createGzip)();return o.pipe(a),a}async function aBe(t){let e=JSON.parse(JSON.stringify(t.manifest.raw));return await t.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,t,e),e}async function _Q(t){let e=t.project,r=e.configuration,o={accept:[],reject:[]};for(let I of fvt)o.reject.push(I);for(let I of Avt)o.accept.push(I);o.reject.push(r.get(\"rcFilename\"));let a=I=>{if(I===null||!I.startsWith(`${t.cwd}/`))return;let v=V.relative(t.cwd,I),x=V.resolve(It.root,v);o.reject.push(x)};a(V.resolve(e.cwd,dr.lockfile)),a(r.get(\"cacheFolder\")),a(r.get(\"globalFolder\")),a(r.get(\"installStatePath\")),a(r.get(\"virtualFolder\")),a(r.get(\"yarnPath\")),await r.triggerHook(I=>I.populateYarnPaths,e,I=>{a(I)});for(let I of e.workspaces){let v=V.relative(t.cwd,I.cwd);v!==\"\"&&!v.match(/^(\\.\\.)?\\//)&&o.reject.push(`/${v}`)}let n={accept:[],reject:[]},u=t.manifest.publishConfig?.main??t.manifest.main,A=t.manifest.publishConfig?.module??t.manifest.module,p=t.manifest.publishConfig?.browser??t.manifest.browser,h=t.manifest.publishConfig?.bin??t.manifest.bin;u!=null&&n.accept.push(V.resolve(It.root,u)),A!=null&&n.accept.push(V.resolve(It.root,A)),typeof p==\"string\"&&n.accept.push(V.resolve(It.root,p));for(let I of h.values())n.accept.push(V.resolve(It.root,I));if(p instanceof Map)for(let[I,v]of p.entries())n.accept.push(V.resolve(It.root,I)),typeof v==\"string\"&&n.accept.push(V.resolve(It.root,v));let E=t.manifest.files!==null;if(E){n.reject.push(\"/*\");for(let I of t.manifest.files)lBe(n.accept,I,{cwd:It.root})}return await pvt(t.cwd,{hasExplicitFileList:E,globalList:o,ignoreList:n})}async function pvt(t,{hasExplicitFileList:e,globalList:r,ignoreList:o}){let a=[],n=new qu(t),u=[[It.root,[o]]];for(;u.length>0;){let[A,p]=u.pop(),h=await n.lstatPromise(A);if(!nBe(A,{globalList:r,ignoreLists:h.isDirectory()?null:p}))if(h.isDirectory()){let E=await n.readdirPromise(A),I=!1,v=!1;if(!e||A!==It.root)for(let R of E)I=I||R===\".gitignore\",v=v||R===\".npmignore\";let x=v?await rBe(n,A,\".npmignore\"):I?await rBe(n,A,\".gitignore\"):null,C=x!==null?[x].concat(p):p;nBe(A,{globalList:r,ignoreLists:p})&&(C=[...p,{accept:[],reject:[\"**/*\"]}]);for(let R of E)u.push([V.resolve(A,R),C])}else(h.isFile()||h.isSymbolicLink())&&a.push(V.relative(It.root,A))}return a.sort()}async function rBe(t,e,r){let o={accept:[],reject:[]},a=await t.readFilePromise(V.join(e,r),\"utf8\");for(let n of a.split(/\\n/g))lBe(o.reject,n,{cwd:e});return o}function hvt(t,{cwd:e}){let r=t[0]===\"!\";return r&&(t=t.slice(1)),t.match(/\\.{0,1}\\//)&&(t=V.resolve(e,t)),r&&(t=`!${t}`),t}function lBe(t,e,{cwd:r}){let o=e.trim();o===\"\"||o[0]===\"#\"||t.push(hvt(o,{cwd:r}))}function nBe(t,{globalList:e,ignoreLists:r}){let o=UQ(t,e.accept);if(o!==0)return o===2;let a=UQ(t,e.reject);if(a!==0)return a===1;if(r!==null)for(let n of r){let u=UQ(t,n.accept);if(u!==0)return u===2;let A=UQ(t,n.reject);if(A!==0)return A===1}return!1}function UQ(t,e){let r=e,o=[];for(let a=0;a<e.length;++a)e[a][0]!==\"!\"?r!==e&&r.push(e[a]):(r===e&&(r=e.slice(0,a)),o.push(e[a].slice(1)));return iBe(t,o)?2:iBe(t,r)?1:0}function iBe(t,e){let r=e,o=[];for(let a=0;a<e.length;++a)e[a].includes(\"/\")?r!==e&&r.push(e[a]):(r===e&&(r=e.slice(0,a)),o.push(e[a]));return!!(n5.default.isMatch(t,r,{dot:!0,nocase:!0})||n5.default.isMatch(t,o,{dot:!0,basename:!0,nocase:!0}))}var DC=class extends ut{constructor(){super(...arguments);this.installIfNeeded=ge.Boolean(\"--install-if-needed\",!1,{description:\"Run a preliminary `yarn install` if the package contains build scripts\"});this.dryRun=ge.Boolean(\"-n,--dry-run\",!1,{description:\"Print the file paths without actually generating the package archive\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.out=ge.String(\"-o,--out\",{description:\"Create the archive at the specified path\"});this.filename=ge.String(\"--filename\",{hidden:!0})}static{this.paths=[[\"pack\"]]}static{this.usage=it.Usage({description:\"generate a tarball from the active workspace\",details:\"\\n      This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\\n\\n      If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\\n    \",examples:[[\"Create an archive from the active workspace\",\"yarn pack\"],[\"List the files that would be made part of the workspace's archive\",\"yarn pack --dry-run\"],[\"Name and output the archive in a dedicated folder\",\"yarn pack --out /artifacts/%s-%v.tgz\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd);if(!a)throw new sr(o.cwd,this.context.cwd);await i5(a)&&(this.installIfNeeded?await o.install({cache:await Gr.find(r),report:new ki}):await o.restoreInstallState());let n=this.out??this.filename,u=typeof n<\"u\"?V.resolve(this.context.cwd,gvt(n,{workspace:a})):V.resolve(a.cwd,\"package.tgz\");return(await Rt.start({configuration:r,stdout:this.context.stdout,json:this.json},async p=>{await s5(a,{report:p},async()=>{p.reportJson({base:ue.fromPortablePath(a.cwd)});let h=await _Q(a);for(let E of h)p.reportInfo(null,ue.fromPortablePath(E)),p.reportJson({location:ue.fromPortablePath(E)});if(!this.dryRun){let E=await o5(a,h),I=oe.createWriteStream(u);E.pipe(I),await new Promise(v=>{I.on(\"finish\",v)})}}),this.dryRun||(p.reportInfo(0,`Package archive generated in ${pe.pretty(r,u,pe.Type.PATH)}`),p.reportJson({output:ue.fromPortablePath(u)}))})).exitCode()}};function gvt(t,{workspace:e}){let r=t.replace(\"%s\",dvt(e)).replace(\"%v\",mvt(e));return ue.toPortablePath(r)}function dvt(t){return t.manifest.name!==null?G.slugifyIdent(t.manifest.name):\"package\"}function mvt(t){return t.manifest.version!==null?t.manifest.version:\"unknown\"}var yvt=[\"dependencies\",\"devDependencies\",\"peerDependencies\"],Evt=\"workspace:\",Cvt=(t,e)=>{e.publishConfig&&(e.publishConfig.type&&(e.type=e.publishConfig.type),e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.imports&&(e.imports=e.publishConfig.imports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let r=t.project;for(let o of yvt)for(let a of t.manifest.getForScope(o).values()){let n=r.tryWorkspaceByDescriptor(a),u=G.parseRange(a.range);if(u.protocol===Evt)if(n===null){if(r.tryWorkspaceByIdent(a)===null)throw new Jt(21,`${G.prettyDescriptor(r.configuration,a)}: No local workspace found for this range`)}else{let A;G.areDescriptorsEqual(a,n.anchoredDescriptor)||u.selector===\"*\"?A=n.manifest.version??\"0.0.0\":u.selector===\"~\"||u.selector===\"^\"?A=`${u.selector}${n.manifest.version??\"0.0.0\"}`:A=u.selector;let p=o===\"dependencies\"?G.makeDescriptor(a,\"unknown\"):null,h=p!==null&&t.manifest.ensureDependencyMeta(p).optional?\"optionalDependencies\":o;e[h][G.stringifyIdent(a)]=A}}},wvt={hooks:{beforeWorkspacePacking:Cvt},commands:[DC]},Ivt=wvt;var mBe=ve(\"crypto\"),yBe=Ze(dBe());async function _vt(t,e,{access:r,tag:o,registry:a,gitHead:n}){let u=t.manifest.name,A=t.manifest.version,p=G.stringifyIdent(u),h=(0,mBe.createHash)(\"sha1\").update(e).digest(\"hex\"),E=yBe.default.fromData(e).toString(),I=r??EBe(t,u),v=await CBe(t),x=await CA.genPackageManifest(t),C=`${p}-${A}.tgz`,R=new URL(`${ac(a)}/${p}/-/${C}`);return{_id:p,_attachments:{[C]:{content_type:\"application/octet-stream\",data:e.toString(\"base64\"),length:e.length}},name:p,access:I,\"dist-tags\":{[o]:A},versions:{[A]:{...x,_id:`${p}@${A}`,name:p,version:A,gitHead:n,dist:{shasum:h,integrity:E,tarball:R.toString()}}},readme:v}}async function Hvt(t){try{let{stdout:e}=await Ur.execvp(\"git\",[\"rev-parse\",\"--revs-only\",\"HEAD\"],{cwd:t});return e.trim()===\"\"?void 0:e.trim()}catch{return}}function EBe(t,e){let r=t.project.configuration;return t.manifest.publishConfig&&typeof t.manifest.publishConfig.access==\"string\"?t.manifest.publishConfig.access:r.get(\"npmPublishAccess\")!==null?r.get(\"npmPublishAccess\"):e.scope?\"restricted\":\"public\"}async function CBe(t){let e=ue.toPortablePath(`${t.cwd}/README.md`),r=t.manifest.name,a=`# ${G.stringifyIdent(r)}\n`;try{a=await oe.readFilePromise(e,\"utf8\")}catch(n){if(n.code===\"ENOENT\")return a;throw n}return a}var A5={npmAlwaysAuth:{description:\"URL of the selected npm registry (note: npm enterprise isn't supported)\",type:\"BOOLEAN\",default:!1},npmAuthIdent:{description:\"Authentication identity for the npm registry (_auth in npm and yarn v1)\",type:\"SECRET\",default:null},npmAuthToken:{description:\"Authentication token for the npm registry (_authToken in npm and yarn v1)\",type:\"SECRET\",default:null}},wBe={npmAuditRegistry:{description:\"Registry to query for audit reports\",type:\"STRING\",default:null},npmPublishRegistry:{description:\"Registry to push packages to\",type:\"STRING\",default:null},npmRegistryServer:{description:\"URL of the selected npm registry (note: npm enterprise isn't supported)\",type:\"STRING\",default:\"https://registry.yarnpkg.com\"}},qvt={configuration:{...A5,...wBe,npmScopes:{description:\"Settings per package scope\",type:\"MAP\",valueDefinition:{description:\"\",type:\"SHAPE\",properties:{...A5,...wBe}}},npmRegistries:{description:\"Settings per registry\",type:\"MAP\",normalizeKeys:ac,valueDefinition:{description:\"\",type:\"SHAPE\",properties:{...A5}}}},fetchers:[VB,rp],resolvers:[zB,JB,XB]},jvt=qvt;var w5={};Vt(w5,{NpmAuditCommand:()=>SC,NpmInfoCommand:()=>xC,NpmLoginCommand:()=>kC,NpmLogoutCommand:()=>FC,NpmPublishCommand:()=>RC,NpmTagAddCommand:()=>NC,NpmTagListCommand:()=>TC,NpmTagRemoveCommand:()=>LC,NpmWhoamiCommand:()=>MC,default:()=>Jvt,npmAuditTypes:()=>dv,npmAuditUtils:()=>HQ});Ge();Ge();qt();var m5=Ze($o());el();var dv={};Vt(dv,{Environment:()=>hv,Severity:()=>gv});var hv=(o=>(o.All=\"all\",o.Production=\"production\",o.Development=\"development\",o))(hv||{}),gv=(n=>(n.Info=\"info\",n.Low=\"low\",n.Moderate=\"moderate\",n.High=\"high\",n.Critical=\"critical\",n))(gv||{});var HQ={};Vt(HQ,{allSeverities:()=>bC,getPackages:()=>d5,getReportTree:()=>h5,getSeverityInclusions:()=>p5,getTopLevelDependencies:()=>g5});Ge();var IBe=Ze(Jn());var bC=[\"info\",\"low\",\"moderate\",\"high\",\"critical\"];function p5(t){if(typeof t>\"u\")return new Set(bC);let e=bC.indexOf(t),r=bC.slice(e);return new Set(r)}function h5(t){let e={},r={children:e};for(let[o,a]of He.sortMap(Object.entries(t),n=>n[0]))for(let n of He.sortMap(a,u=>`${u.id}`))e[`${o}/${n.id}`]={value:pe.tuple(pe.Type.IDENT,G.parseIdent(o)),children:{ID:typeof n.id<\"u\"&&{label:\"ID\",value:pe.tuple(pe.Type.ID,n.id)},Issue:{label:\"Issue\",value:pe.tuple(pe.Type.NO_HINT,n.title)},URL:typeof n.url<\"u\"&&{label:\"URL\",value:pe.tuple(pe.Type.URL,n.url)},Severity:{label:\"Severity\",value:pe.tuple(pe.Type.NO_HINT,n.severity)},\"Vulnerable Versions\":{label:\"Vulnerable Versions\",value:pe.tuple(pe.Type.RANGE,n.vulnerable_versions)},\"Tree Versions\":{label:\"Tree Versions\",children:[...n.versions].sort(IBe.default.compare).map(u=>({value:pe.tuple(pe.Type.REFERENCE,u)}))},Dependents:{label:\"Dependents\",children:He.sortMap(n.dependents,u=>G.stringifyLocator(u)).map(u=>({value:pe.tuple(pe.Type.LOCATOR,u)}))}}};return r}function g5(t,e,{all:r,environment:o}){let a=[],n=r?t.workspaces:[e],u=[\"all\",\"production\"].includes(o),A=[\"all\",\"development\"].includes(o);for(let p of n)for(let h of p.anchoredPackage.dependencies.values())(p.manifest.devDependencies.has(h.identHash)?!A:!u)||a.push({workspace:p,dependency:h});return a}function d5(t,e,{recursive:r}){let o=new Map,a=new Set,n=[],u=(A,p)=>{let h=t.storedResolutions.get(p.descriptorHash);if(typeof h>\"u\")throw new Error(\"Assertion failed: The resolution should have been registered\");if(!a.has(h))a.add(h);else return;let E=t.storedPackages.get(h);if(typeof E>\"u\")throw new Error(\"Assertion failed: The package should have been registered\");if(G.ensureDevirtualizedLocator(E).reference.startsWith(\"npm:\")&&E.version!==null){let v=G.stringifyIdent(E),x=He.getMapWithDefault(o,v);He.getArrayWithDefault(x,E.version).push(A)}if(r)for(let v of E.dependencies.values())n.push([E,v])};for(let{workspace:A,dependency:p}of e)n.push([A.anchoredLocator,p]);for(;n.length>0;){let[A,p]=n.shift();u(A,p)}return o}var SC=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Audit dependencies from all workspaces\"});this.recursive=ge.Boolean(\"-R,--recursive\",!1,{description:\"Audit transitive dependencies as well\"});this.environment=ge.String(\"--environment\",\"all\",{description:\"Which environments to cover\",validator:Js(hv)});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.noDeprecations=ge.Boolean(\"--no-deprecations\",!1,{description:\"Don't warn about deprecated packages\"});this.severity=ge.String(\"--severity\",\"info\",{description:\"Minimal severity requested for packages to be displayed\",validator:Js(gv)});this.excludes=ge.Array(\"--exclude\",[],{description:\"Array of glob patterns of packages to exclude from audit\"});this.ignores=ge.Array(\"--ignore\",[],{description:\"Array of glob patterns of advisory ID's to ignore in the audit report\"})}static{this.paths=[[\"npm\",\"audit\"]]}static{this.usage=it.Usage({description:\"perform a vulnerability audit against the installed packages\",details:`\n      This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths).\n\n      For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \\`-A,--all\\`. To extend this search to both direct and transitive dependencies, use \\`-R,--recursive\\`.\n\n      Applying the \\`--severity\\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${bC.map(r=>`\\`${r}\\``).join(\", \")}.\n\n      If the \\`--json\\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages.\n\n      If certain packages produce false positives for a particular environment, the \\`--exclude\\` flag can be used to exclude any number of packages from the audit. This can also be set in the configuration file with the \\`npmAuditExcludePackages\\` option.\n\n      If particular advisories are needed to be ignored, the \\`--ignore\\` flag can be used with Advisory ID's to ignore any number of advisories in the audit report. This can also be set in the configuration file with the \\`npmAuditIgnoreAdvisories\\` option.\n\n      To understand the dependency tree requiring vulnerable packages, check the raw report with the \\`--json\\` flag or use \\`yarn why package\\` to get more information as to who depends on them.\n    `,examples:[[\"Checks for known security issues with the installed packages. The output is a list of known issues.\",\"yarn npm audit\"],[\"Audit dependencies in all workspaces\",\"yarn npm audit --all\"],[\"Limit auditing to `dependencies` (excludes `devDependencies`)\",\"yarn npm audit --environment production\"],[\"Show audit report as valid JSON\",\"yarn npm audit --json\"],[\"Audit all direct and transitive dependencies\",\"yarn npm audit --recursive\"],[\"Output moderate (or more severe) vulnerabilities\",\"yarn npm audit --severity moderate\"],[\"Exclude certain packages\",\"yarn npm audit --exclude package1 --exclude package2\"],[\"Ignore specific advisories\",\"yarn npm audit --ignore 1234567 --ignore 7654321\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd);if(!a)throw new sr(o.cwd,this.context.cwd);await o.restoreInstallState();let n=g5(o,a,{all:this.all,environment:this.environment}),u=d5(o,n,{recursive:this.recursive}),A=Array.from(new Set([...r.get(\"npmAuditExcludePackages\"),...this.excludes])),p=Object.create(null);for(let[L,U]of u)A.some(z=>m5.default.isMatch(L,z))||(p[L]=[...U.keys()]);let h=Zn.getAuditRegistry({configuration:r}),E,I=await AA.start({configuration:r,stdout:this.context.stdout},async()=>{let L=Zr.post(\"/-/npm/v1/security/advisories/bulk\",p,{authType:Zr.AuthType.BEST_EFFORT,configuration:r,jsonResponse:!0,registry:h}),U=this.noDeprecations?[]:await Promise.all(Array.from(Object.entries(p),async([te,ae])=>{let le=await Zr.getPackageMetadata(G.parseIdent(te),{project:o});return He.mapAndFilter(ae,ce=>{let{deprecated:Ce}=le.versions[ce];return Ce?[te,ce,Ce]:He.mapAndFilter.skip})})),z=await L;for(let[te,ae,le]of U.flat(1))Object.hasOwn(z,te)&&z[te].some(ce=>Lr.satisfiesWithPrereleases(ae,ce.vulnerable_versions))||(z[te]??=[],z[te].push({id:`${te} (deprecation)`,title:le.trim()||\"This package has been deprecated.\",severity:\"moderate\",vulnerable_versions:ae}));E=z});if(I.hasErrors())return I.exitCode();let v=p5(this.severity),x=Array.from(new Set([...r.get(\"npmAuditIgnoreAdvisories\"),...this.ignores])),C=Object.create(null);for(let[L,U]of Object.entries(E)){let z=U.filter(te=>!m5.default.isMatch(`${te.id}`,x)&&v.has(te.severity));z.length>0&&(C[L]=z.map(te=>{let ae=u.get(L);if(typeof ae>\"u\")throw new Error(\"Assertion failed: Expected the registry to only return packages that were requested\");let le=[...ae.keys()].filter(Ce=>Lr.satisfiesWithPrereleases(Ce,te.vulnerable_versions)),ce=new Map;for(let Ce of le)for(let de of ae.get(Ce))ce.set(de.locatorHash,de);return{...te,versions:le,dependents:[...ce.values()]}}))}let R=Object.keys(C).length>0;return R?(fs.emitTree(h5(C),{configuration:r,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Rt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async L=>{L.reportInfo(1,\"No audit suggestions\")}),R?1:0)}};Ge();Ge();Pt();qt();var y5=Ze(Jn()),E5=ve(\"util\"),xC=class extends ut{constructor(){super(...arguments);this.fields=ge.String(\"-f,--fields\",{description:\"A comma-separated list of manifest fields that should be displayed\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.packages=ge.Rest()}static{this.paths=[[\"npm\",\"info\"]]}static{this.usage=it.Usage({category:\"Npm-related commands\",description:\"show information about a package\",details:\"\\n      This command fetches information about a package from the npm registry and prints it in a tree format.\\n\\n      The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\\n\\n      Append `@<range>` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\\n\\n      If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\\n\\n      By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\\n    \",examples:[[\"Show all available information about react (except the `dist`, `readme`, and `users` fields)\",\"yarn npm info react\"],[\"Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)\",\"yarn npm info react --json\"],[\"Show all available information about react@16.12.0\",\"yarn npm info react@16.12.0\"],[\"Show all available information about react@next\",\"yarn npm info react@next\"],[\"Show the description of react\",\"yarn npm info react --fields description\"],[\"Show all available versions of react\",\"yarn npm info react --fields versions\"],[\"Show the readme of react\",\"yarn npm info react --fields readme\"],[\"Show a few fields of react\",\"yarn npm info react --fields homepage,repository\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await kt.find(r,this.context.cwd),a=typeof this.fields<\"u\"?new Set([\"name\",...this.fields.split(/\\s*,\\s*/)]):null,n=[],u=!1,A=await Rt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async p=>{for(let h of this.packages){let E;if(h===\".\"){let ae=o.topLevelWorkspace;if(!ae.manifest.name)throw new st(`Missing ${pe.pretty(r,\"name\",pe.Type.CODE)} field in ${ue.fromPortablePath(V.join(ae.cwd,dr.manifest))}`);E=G.makeDescriptor(ae.manifest.name,\"unknown\")}else E=G.parseDescriptor(h);let I=Zr.getIdentUrl(E),v=C5(await Zr.get(I,{configuration:r,ident:E,jsonResponse:!0,customErrorMessage:Zr.customPackageError})),x=Object.keys(v.versions).sort(y5.default.compareLoose),R=v[\"dist-tags\"].latest||x[x.length-1],L=Lr.validRange(E.range);if(L){let ae=y5.default.maxSatisfying(x,L);ae!==null?R=ae:(p.reportWarning(0,`Unmet range ${G.prettyRange(r,E.range)}; falling back to the latest version`),u=!0)}else Object.hasOwn(v[\"dist-tags\"],E.range)?R=v[\"dist-tags\"][E.range]:E.range!==\"unknown\"&&(p.reportWarning(0,`Unknown tag ${G.prettyRange(r,E.range)}; falling back to the latest version`),u=!0);let U=v.versions[R],z={...v,...U,version:R,versions:x},te;if(a!==null){te={};for(let ae of a){let le=z[ae];if(typeof le<\"u\")te[ae]=le;else{p.reportWarning(1,`The ${pe.pretty(r,ae,pe.Type.CODE)} field doesn't exist inside ${G.prettyIdent(r,E)}'s information`),u=!0;continue}}}else this.json||(delete z.dist,delete z.readme,delete z.users),te=z;p.reportJson(te),this.json||n.push(te)}});E5.inspect.styles.name=\"cyan\";for(let p of n)(p!==n[0]||u)&&this.context.stdout.write(`\n`),this.context.stdout.write(`${(0,E5.inspect)(p,{depth:1/0,colors:!0,compact:!1})}\n`);return A.exitCode()}};function C5(t){if(Array.isArray(t)){let e=[];for(let r of t)r=C5(r),r&&e.push(r);return e}else if(typeof t==\"object\"&&t!==null){let e={};for(let r of Object.keys(t)){if(r.startsWith(\"_\"))continue;let o=C5(t[r]);o&&(e[r]=o)}return e}else return t||null}Ge();Ge();qt();var BBe=Ze(J1()),kC=class extends ut{constructor(){super(...arguments);this.scope=ge.String(\"-s,--scope\",{description:\"Login to the registry configured for a given scope\"});this.publish=ge.Boolean(\"--publish\",!1,{description:\"Login to the publish registry\"});this.alwaysAuth=ge.Boolean(\"--always-auth\",{description:\"Set the npmAlwaysAuth configuration\"})}static{this.paths=[[\"npm\",\"login\"]]}static{this.usage=it.Usage({category:\"Npm-related commands\",description:\"store new login info to access the npm registry\",details:\"\\n      This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\\n\\n      Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\\n\\n      Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\\n    \",examples:[[\"Login to the default registry\",\"yarn npm login\"],[\"Login to the registry linked to the @my-scope registry\",\"yarn npm login --scope my-scope\"],[\"Login to the publish registry for the current package\",\"yarn npm login --publish\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=await qQ({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Rt.start({configuration:r,stdout:this.context.stdout,includeFooter:!1},async n=>{let u=await Wvt({configuration:r,registry:o,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),A=await Gvt(o,u,r);return await Yvt(o,A,{alwaysAuth:this.alwaysAuth,scope:this.scope}),n.reportInfo(0,\"Successfully logged in\")})).exitCode()}};async function qQ({scope:t,publish:e,configuration:r,cwd:o}){return t&&e?Zn.getScopeRegistry(t,{configuration:r,type:Zn.RegistryType.PUBLISH_REGISTRY}):t?Zn.getScopeRegistry(t,{configuration:r}):e?Zn.getPublishRegistry((await _y(r,o)).manifest,{configuration:r}):Zn.getDefaultRegistry({configuration:r})}async function Gvt(t,e,r){let o=`/-/user/org.couchdb.user:${encodeURIComponent(e.name)}`,a={_id:`org.couchdb.user:${e.name}`,name:e.name,password:e.password,type:\"user\",roles:[],date:new Date().toISOString()},n={attemptedAs:e.name,configuration:r,registry:t,jsonResponse:!0,authType:Zr.AuthType.NO_AUTH};try{return(await Zr.put(o,a,n)).token}catch(E){if(!(E.originalError?.name===\"HTTPError\"&&E.originalError?.response.statusCode===409))throw E}let u={...n,authType:Zr.AuthType.NO_AUTH,headers:{authorization:`Basic ${Buffer.from(`${e.name}:${e.password}`).toString(\"base64\")}`}},A=await Zr.get(o,u);for(let[E,I]of Object.entries(A))(!a[E]||E===\"roles\")&&(a[E]=I);let p=`${o}/-rev/${a._rev}`;return(await Zr.put(p,a,u)).token}async function Yvt(t,e,{alwaysAuth:r,scope:o}){let a=u=>A=>{let p=He.isIndexableObject(A)?A:{},h=p[u],E=He.isIndexableObject(h)?h:{};return{...p,[u]:{...E,...r!==void 0?{npmAlwaysAuth:r}:{},npmAuthToken:e}}},n=o?{npmScopes:a(o)}:{npmRegistries:a(t)};return await Ke.updateHomeConfiguration(n)}async function Wvt({configuration:t,registry:e,report:r,stdin:o,stdout:a}){r.reportInfo(0,`Logging in to ${pe.pretty(t,e,pe.Type.URL)}`);let n=!1;if(e.match(/^https:\\/\\/npm\\.pkg\\.github\\.com(\\/|$)/)&&(r.reportInfo(0,\"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions.\"),n=!0),r.reportSeparator(),t.env.YARN_IS_TEST_ENV)return{name:t.env.YARN_INJECT_NPM_USER||\"\",password:t.env.YARN_INJECT_NPM_PASSWORD||\"\"};let u=await(0,BBe.prompt)([{type:\"input\",name:\"name\",message:\"Username:\",required:!0,onCancel:()=>process.exit(130),stdin:o,stdout:a},{type:\"password\",name:\"password\",message:n?\"Token:\":\"Password:\",required:!0,onCancel:()=>process.exit(130),stdin:o,stdout:a}]);return r.reportSeparator(),u}Ge();Ge();qt();var QC=new Set([\"npmAuthIdent\",\"npmAuthToken\"]),FC=class extends ut{constructor(){super(...arguments);this.scope=ge.String(\"-s,--scope\",{description:\"Logout of the registry configured for a given scope\"});this.publish=ge.Boolean(\"--publish\",!1,{description:\"Logout of the publish registry\"});this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Logout of all registries\"})}static{this.paths=[[\"npm\",\"logout\"]]}static{this.usage=it.Usage({category:\"Npm-related commands\",description:\"logout of the npm registry\",details:\"\\n      This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\\n\\n      Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\\n\\n      Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\\n\\n      Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\\n    \",examples:[[\"Logout of the default registry\",\"yarn npm logout\"],[\"Logout of the @my-scope scope\",\"yarn npm logout --scope my-scope\"],[\"Logout of the publish registry for the current package\",\"yarn npm logout --publish\"],[\"Logout of all registries\",\"yarn npm logout --all\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o=async()=>{let n=await qQ({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),u=await Ke.find(this.context.cwd,this.context.plugins),A=G.makeIdent(this.scope??null,\"pkg\");return!Zn.getAuthConfiguration(n,{configuration:u,ident:A}).get(\"npmAuthToken\")};return(await Rt.start({configuration:r,stdout:this.context.stdout},async n=>{if(this.all&&(await Vvt(),n.reportInfo(0,\"Successfully logged out from everything\")),this.scope){await vBe(\"npmScopes\",this.scope),await o()?n.reportInfo(0,`Successfully logged out from ${this.scope}`):n.reportWarning(0,\"Scope authentication settings removed, but some other ones settings still apply to it\");return}let u=await qQ({configuration:r,cwd:this.context.cwd,publish:this.publish});await vBe(\"npmRegistries\",u),await o()?n.reportInfo(0,`Successfully logged out from ${u}`):n.reportWarning(0,\"Registry authentication settings removed, but some other ones settings still apply to it\")})).exitCode()}};function Kvt(t,e){let r=t[e];if(!He.isIndexableObject(r))return!1;let o=new Set(Object.keys(r));if([...QC].every(n=>!o.has(n)))return!1;for(let n of QC)o.delete(n);if(o.size===0)return t[e]=void 0,!0;let a={...r};for(let n of QC)delete a[n];return t[e]=a,!0}async function Vvt(){let t=e=>{let r=!1,o=He.isIndexableObject(e)?{...e}:{};o.npmAuthToken&&(delete o.npmAuthToken,r=!0);for(let a of Object.keys(o))Kvt(o,a)&&(r=!0);if(Object.keys(o).length!==0)return r?o:e};return await Ke.updateHomeConfiguration({npmRegistries:t,npmScopes:t})}async function vBe(t,e){return await Ke.updateHomeConfiguration({[t]:r=>{let o=He.isIndexableObject(r)?r:{};if(!Object.hasOwn(o,e))return r;let a=o[e],n=He.isIndexableObject(a)?a:{},u=new Set(Object.keys(n));if([...QC].every(p=>!u.has(p)))return r;for(let p of QC)u.delete(p);if(u.size===0)return Object.keys(o).length===1?void 0:{...o,[e]:void 0};let A={};for(let p of QC)A[p]=void 0;return{...o,[e]:{...n,...A}}}})}Ge();qt();var RC=class extends ut{constructor(){super(...arguments);this.access=ge.String(\"--access\",{description:\"The access for the published package (public or restricted)\"});this.tag=ge.String(\"--tag\",\"latest\",{description:\"The tag on the registry that the package should be attached to\"});this.tolerateRepublish=ge.Boolean(\"--tolerate-republish\",!1,{description:\"Warn and exit when republishing an already existing version of a package\"});this.otp=ge.String(\"--otp\",{description:\"The OTP token to use with the command\"})}static{this.paths=[[\"npm\",\"publish\"]]}static{this.usage=it.Usage({category:\"Npm-related commands\",description:\"publish the active workspace to the npm registry\",details:'\\n      This command will pack the active workspace into a fresh archive and upload it to the npm registry.\\n\\n      The package will by default be attached to the `latest` tag on the registry, but this behavior can be overridden by using the `--tag` option.\\n\\n      Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka \"private packages\"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\\n    ',examples:[[\"Publish the active workspace\",\"yarn npm publish\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd);if(!a)throw new sr(o.cwd,this.context.cwd);if(a.manifest.private)throw new st(\"Private workspaces cannot be published\");if(a.manifest.name===null||a.manifest.version===null)throw new st(\"Workspaces must have valid names and versions to be published on an external registry\");await o.restoreInstallState();let n=a.manifest.name,u=a.manifest.version,A=Zn.getPublishRegistry(a.manifest,{configuration:r});return(await Rt.start({configuration:r,stdout:this.context.stdout},async h=>{if(this.tolerateRepublish)try{let E=await Zr.get(Zr.getIdentUrl(n),{configuration:r,registry:A,ident:n,jsonResponse:!0});if(!Object.hasOwn(E,\"versions\"))throw new Jt(15,'Registry returned invalid data for - missing \"versions\" field');if(Object.hasOwn(E.versions,u)){h.reportWarning(0,`Registry already knows about version ${u}; skipping.`);return}}catch(E){if(E.originalError?.response?.statusCode!==404)throw E}await An.maybeExecuteWorkspaceLifecycleScript(a,\"prepublish\",{report:h}),await CA.prepareForPack(a,{report:h},async()=>{let E=await CA.genPackList(a);for(let R of E)h.reportInfo(null,R);let I=await CA.genPackStream(a,E),v=await He.bufferStream(I),x=await PC.getGitHead(a.cwd),C=await PC.makePublishBody(a,v,{access:this.access,tag:this.tag,registry:A,gitHead:x});await Zr.put(Zr.getIdentUrl(n),C,{configuration:r,registry:A,ident:n,otp:this.otp,jsonResponse:!0})}),h.reportInfo(0,\"Package archive published\")})).exitCode()}};Ge();qt();var DBe=Ze(Jn());Ge();Pt();qt();var TC=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.package=ge.String({required:!1})}static{this.paths=[[\"npm\",\"tag\",\"list\"]]}static{this.usage=it.Usage({category:\"Npm-related commands\",description:\"list all dist-tags of a package\",details:`\n      This command will list all tags of a package from the npm registry.\n\n      If the package is not specified, Yarn will default to the current workspace.\n    `,examples:[[\"List all tags of package `my-pkg`\",\"yarn npm tag list my-pkg\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n;if(typeof this.package<\"u\")n=G.parseIdent(this.package);else{if(!a)throw new sr(o.cwd,this.context.cwd);if(!a.manifest.name)throw new st(`Missing 'name' field in ${ue.fromPortablePath(V.join(a.cwd,dr.manifest))}`);n=a.manifest.name}let u=await mv(n,r),p={children:He.sortMap(Object.entries(u),([h])=>h).map(([h,E])=>({value:pe.tuple(pe.Type.RESOLUTION,{descriptor:G.makeDescriptor(n,h),locator:G.makeLocator(n,E)})}))};return fs.emitTree(p,{configuration:r,json:this.json,stdout:this.context.stdout})}};async function mv(t,e){let r=`/-/package${Zr.getIdentUrl(t)}/dist-tags`;return Zr.get(r,{configuration:e,ident:t,jsonResponse:!0,customErrorMessage:Zr.customPackageError})}var NC=class extends ut{constructor(){super(...arguments);this.package=ge.String();this.tag=ge.String()}static{this.paths=[[\"npm\",\"tag\",\"add\"]]}static{this.usage=it.Usage({category:\"Npm-related commands\",description:\"add a tag for a specific version of a package\",details:`\n      This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten.\n    `,examples:[[\"Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`\",\"yarn npm tag add my-pkg@2.3.4-beta.4 beta\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd);if(!a)throw new sr(o.cwd,this.context.cwd);let n=G.parseDescriptor(this.package,!0),u=n.range;if(!DBe.default.valid(u))throw new st(`The range ${pe.pretty(r,n.range,pe.Type.RANGE)} must be a valid semver version`);let A=Zn.getPublishRegistry(a.manifest,{configuration:r}),p=pe.pretty(r,n,pe.Type.IDENT),h=pe.pretty(r,u,pe.Type.RANGE),E=pe.pretty(r,this.tag,pe.Type.CODE);return(await Rt.start({configuration:r,stdout:this.context.stdout},async v=>{let x=await mv(n,r);Object.hasOwn(x,this.tag)&&x[this.tag]===u&&v.reportWarning(0,`Tag ${E} is already set to version ${h}`);let C=`/-/package${Zr.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await Zr.put(C,u,{configuration:r,registry:A,ident:n,jsonRequest:!0,jsonResponse:!0}),v.reportInfo(0,`Tag ${E} added to version ${h} of package ${p}`)})).exitCode()}};Ge();qt();var LC=class extends ut{constructor(){super(...arguments);this.package=ge.String();this.tag=ge.String()}static{this.paths=[[\"npm\",\"tag\",\"remove\"]]}static{this.usage=it.Usage({category:\"Npm-related commands\",description:\"remove a tag from a package\",details:`\n      This command will remove a tag from a package from the npm registry.\n    `,examples:[[\"Remove the `beta` tag from package `my-pkg`\",\"yarn npm tag remove my-pkg beta\"]]})}async execute(){if(this.tag===\"latest\")throw new st(\"The 'latest' tag cannot be removed.\");let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd);if(!a)throw new sr(o.cwd,this.context.cwd);let n=G.parseIdent(this.package),u=Zn.getPublishRegistry(a.manifest,{configuration:r}),A=pe.pretty(r,this.tag,pe.Type.CODE),p=pe.pretty(r,n,pe.Type.IDENT),h=await mv(n,r);if(!Object.hasOwn(h,this.tag))throw new st(`${A} is not a tag of package ${p}`);return(await Rt.start({configuration:r,stdout:this.context.stdout},async I=>{let v=`/-/package${Zr.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await Zr.del(v,{configuration:r,registry:u,ident:n,jsonResponse:!0}),I.reportInfo(0,`Tag ${A} removed from package ${p}`)})).exitCode()}};Ge();Ge();qt();var MC=class extends ut{constructor(){super(...arguments);this.scope=ge.String(\"-s,--scope\",{description:\"Print username for the registry configured for a given scope\"});this.publish=ge.Boolean(\"--publish\",!1,{description:\"Print username for the publish registry\"})}static{this.paths=[[\"npm\",\"whoami\"]]}static{this.usage=it.Usage({category:\"Npm-related commands\",description:\"display the name of the authenticated user\",details:\"\\n      Print the username associated with the current authentication settings to the standard output.\\n\\n      When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\\n\\n      When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\\n    \",examples:[[\"Print username for the default registry\",\"yarn npm whoami\"],[\"Print username for the registry on a given scope\",\"yarn npm whoami --scope company\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),o;return this.scope&&this.publish?o=Zn.getScopeRegistry(this.scope,{configuration:r,type:Zn.RegistryType.PUBLISH_REGISTRY}):this.scope?o=Zn.getScopeRegistry(this.scope,{configuration:r}):this.publish?o=Zn.getPublishRegistry((await _y(r,this.context.cwd)).manifest,{configuration:r}):o=Zn.getDefaultRegistry({configuration:r}),(await Rt.start({configuration:r,stdout:this.context.stdout},async n=>{let u;try{u=await Zr.get(\"/-/whoami\",{configuration:r,registry:o,authType:Zr.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?G.makeIdent(this.scope,\"\"):void 0})}catch(A){if(A.response?.statusCode===401||A.response?.statusCode===403){n.reportError(41,\"Authentication failed - your credentials may have expired\");return}else throw A}n.reportInfo(0,u.username)})).exitCode()}};var zvt={configuration:{npmPublishAccess:{description:\"Default access of the published packages\",type:\"STRING\",default:null},npmAuditExcludePackages:{description:\"Array of glob patterns of packages to exclude from npm audit\",type:\"STRING\",default:[],isArray:!0},npmAuditIgnoreAdvisories:{description:\"Array of glob patterns of advisory IDs to exclude from npm audit\",type:\"STRING\",default:[],isArray:!0}},commands:[SC,xC,kC,FC,RC,NC,TC,LC,MC]},Jvt=zvt;var S5={};Vt(S5,{PatchCommand:()=>jC,PatchCommitCommand:()=>qC,PatchFetcher:()=>Iv,PatchResolver:()=>Bv,default:()=>hDt,patchUtils:()=>pd});Ge();Ge();Pt();nA();var pd={};Vt(pd,{applyPatchFile:()=>GQ,diffFolders:()=>P5,ensureUnpatchedDescriptor:()=>I5,ensureUnpatchedLocator:()=>WQ,extractPackageToDisk:()=>D5,extractPatchFlags:()=>FBe,isParentRequired:()=>v5,isPatchDescriptor:()=>YQ,isPatchLocator:()=>$h,loadPatchFiles:()=>wv,makeDescriptor:()=>KQ,makeLocator:()=>B5,makePatchHash:()=>b5,parseDescriptor:()=>Ev,parseLocator:()=>Cv,parsePatchFile:()=>yv,unpatchDescriptor:()=>ADt,unpatchLocator:()=>fDt});Ge();Pt();Ge();Pt();var Xvt=/^@@ -(\\d+)(,(\\d+))? \\+(\\d+)(,(\\d+))? @@.*/;function OC(t){return V.relative(It.root,V.resolve(It.root,ue.toPortablePath(t)))}function Zvt(t){let e=t.trim().match(Xvt);if(!e)throw new Error(`Bad header line: '${t}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var $vt=420,eDt=493;var PBe=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),tDt=t=>({header:Zvt(t),parts:[]}),rDt={\"@\":\"header\",\"-\":\"deletion\",\"+\":\"insertion\",\" \":\"context\",\"\\\\\":\"pragma\",undefined:\"context\"};function nDt(t){let e=[],r=PBe(),o=\"parsing header\",a=null,n=null;function u(){a&&(n&&(a.parts.push(n),n=null),r.hunks.push(a),a=null)}function A(){u(),e.push(r),r=PBe()}for(let p=0;p<t.length;p++){let h=t[p];if(o===\"parsing header\")if(h.startsWith(\"@@\"))o=\"parsing hunks\",r.hunks=[],p-=1;else if(h.startsWith(\"diff --git \")){r&&r.diffLineFromPath&&A();let E=h.match(/^diff --git a\\/(.*?) b\\/(.*?)\\s*$/);if(!E)throw new Error(`Bad diff line: ${h}`);r.diffLineFromPath=E[1],r.diffLineToPath=E[2]}else if(h.startsWith(\"old mode \"))r.oldMode=h.slice(9).trim();else if(h.startsWith(\"new mode \"))r.newMode=h.slice(9).trim();else if(h.startsWith(\"deleted file mode \"))r.deletedFileMode=h.slice(18).trim();else if(h.startsWith(\"new file mode \"))r.newFileMode=h.slice(14).trim();else if(h.startsWith(\"rename from \"))r.renameFrom=h.slice(12).trim();else if(h.startsWith(\"rename to \"))r.renameTo=h.slice(10).trim();else if(h.startsWith(\"index \")){let E=h.match(/(\\w+)\\.\\.(\\w+)/);if(!E)continue;r.beforeHash=E[1],r.afterHash=E[2]}else h.startsWith(\"semver exclusivity \")?r.semverExclusivity=h.slice(19).trim():h.startsWith(\"--- \")?r.fromPath=h.slice(6).trim():h.startsWith(\"+++ \")&&(r.toPath=h.slice(6).trim());else{let E=rDt[h[0]]||null;switch(E){case\"header\":u(),a=tDt(h);break;case null:o=\"parsing header\",A(),p-=1;break;case\"pragma\":{if(!h.startsWith(\"\\\\ No newline at end of file\"))throw new Error(`Unrecognized pragma in patch file: ${h}`);if(!n)throw new Error(\"Bad parser state: No newline at EOF pragma encountered without context\");n.noNewlineAtEndOfFile=!0}break;case\"context\":case\"deletion\":case\"insertion\":{if(!a)throw new Error(\"Bad parser state: Hunk lines encountered before hunk header\");n&&n.type!==E&&(a.parts.push(n),n=null),n||(n={type:E,lines:[],noNewlineAtEndOfFile:!1}),n.lines.push(h.slice(1))}break;default:He.assertNever(E);break}}}A();for(let{hunks:p}of e)if(p)for(let h of p)sDt(h);return e}function iDt(t){let e=[];for(let r of t){let{semverExclusivity:o,diffLineFromPath:a,diffLineToPath:n,oldMode:u,newMode:A,deletedFileMode:p,newFileMode:h,renameFrom:E,renameTo:I,beforeHash:v,afterHash:x,fromPath:C,toPath:R,hunks:L}=r,U=E?\"rename\":p?\"file deletion\":h?\"file creation\":L&&L.length>0?\"patch\":\"mode change\",z=null;switch(U){case\"rename\":{if(!E||!I)throw new Error(\"Bad parser state: rename from & to not given\");e.push({type:\"rename\",semverExclusivity:o,fromPath:OC(E),toPath:OC(I)}),z=I}break;case\"file deletion\":{let te=a||C;if(!te)throw new Error(\"Bad parse state: no path given for file deletion\");e.push({type:\"file deletion\",semverExclusivity:o,hunk:L&&L[0]||null,path:OC(te),mode:jQ(p),hash:v})}break;case\"file creation\":{let te=n||R;if(!te)throw new Error(\"Bad parse state: no path given for file creation\");e.push({type:\"file creation\",semverExclusivity:o,hunk:L&&L[0]||null,path:OC(te),mode:jQ(h),hash:x})}break;case\"patch\":case\"mode change\":z=R||n;break;default:He.assertNever(U);break}z&&u&&A&&u!==A&&e.push({type:\"mode change\",semverExclusivity:o,path:OC(z),oldMode:jQ(u),newMode:jQ(A)}),z&&L&&L.length&&e.push({type:\"patch\",semverExclusivity:o,path:OC(z),hunks:L,beforeHash:v,afterHash:x})}if(e.length===0)throw new Error(\"Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string\");return e}function jQ(t){let e=parseInt(t,8)&511;if(e!==$vt&&e!==eDt)throw new Error(`Unexpected file mode string: ${t}`);return e}function yv(t){let e=t.split(/\\n/g);return e[e.length-1]===\"\"&&e.pop(),iDt(nDt(e))}function sDt(t){let e=0,r=0;for(let{type:o,lines:a}of t.parts)switch(o){case\"context\":r+=a.length,e+=a.length;break;case\"deletion\":e+=a.length;break;case\"insertion\":r+=a.length;break;default:He.assertNever(o);break}if(e!==t.header.original.length||r!==t.header.patched.length){let o=a=>a<0?a:`+${a}`;throw new Error(`hunk header integrity check failed (expected @@ ${o(t.header.original.length)} ${o(t.header.patched.length)} @@, got @@ ${o(e)} ${o(r)} @@)`)}}Ge();Pt();var UC=class extends Error{constructor(r,o){super(`Cannot apply hunk #${r+1}`);this.hunk=o}};async function _C(t,e,r){let o=await t.lstatPromise(e),a=await r();typeof a<\"u\"&&(e=a),await t.lutimesPromise(e,o.atime,o.mtime)}async function GQ(t,{baseFs:e=new Tn,dryRun:r=!1,version:o=null}={}){for(let a of t)if(!(a.semverExclusivity!==null&&o!==null&&!Lr.satisfiesWithPrereleases(o,a.semverExclusivity)))switch(a.type){case\"file deletion\":if(r){if(!e.existsSync(a.path))throw new Error(`Trying to delete a file that doesn't exist: ${a.path}`)}else await _C(e,V.dirname(a.path),async()=>{await e.unlinkPromise(a.path)});break;case\"rename\":if(r){if(!e.existsSync(a.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${a.fromPath}`)}else await _C(e,V.dirname(a.fromPath),async()=>{await _C(e,V.dirname(a.toPath),async()=>{await _C(e,a.fromPath,async()=>(await e.movePromise(a.fromPath,a.toPath),a.toPath))})});break;case\"file creation\":if(r){if(e.existsSync(a.path))throw new Error(`Trying to create a file that already exists: ${a.path}`)}else{let n=a.hunk?a.hunk.parts[0].lines.join(`\n`)+(a.hunk.parts[0].noNewlineAtEndOfFile?\"\":`\n`):\"\";await e.mkdirpPromise(V.dirname(a.path),{chmod:493,utimes:[Bi.SAFE_TIME,Bi.SAFE_TIME]}),await e.writeFilePromise(a.path,n,{mode:a.mode}),await e.utimesPromise(a.path,Bi.SAFE_TIME,Bi.SAFE_TIME)}break;case\"patch\":await _C(e,a.path,async()=>{await lDt(a,{baseFs:e,dryRun:r})});break;case\"mode change\":{let u=(await e.statPromise(a.path)).mode;if(bBe(a.newMode)!==bBe(u))continue;await _C(e,a.path,async()=>{await e.chmodPromise(a.path,a.newMode)})}break;default:He.assertNever(a);break}}function bBe(t){return(t&64)>0}function SBe(t){return t.replace(/\\s+$/,\"\")}function aDt(t,e){return SBe(t)===SBe(e)}async function lDt({hunks:t,path:e},{baseFs:r,dryRun:o=!1}){let a=await r.statSync(e).mode,u=(await r.readFileSync(e,\"utf8\")).split(/\\n/),A=[],p=0,h=0;for(let I of t){let v=Math.max(h,I.header.patched.start+p),x=Math.max(0,v-h),C=Math.max(0,u.length-v-I.header.original.length),R=Math.max(x,C),L=0,U=0,z=null;for(;L<=R;){if(L<=x&&(U=v-L,z=xBe(I,u,U),z!==null)){L=-L;break}if(L<=C&&(U=v+L,z=xBe(I,u,U),z!==null))break;L+=1}if(z===null)throw new UC(t.indexOf(I),I);A.push(z),p+=L,h=U+I.header.original.length}if(o)return;let E=0;for(let I of A)for(let v of I)switch(v.type){case\"splice\":{let x=v.index+E;u.splice(x,v.numToDelete,...v.linesToInsert),E+=v.linesToInsert.length-v.numToDelete}break;case\"pop\":u.pop();break;case\"push\":u.push(v.line);break;default:He.assertNever(v);break}await r.writeFilePromise(e,u.join(`\n`),{mode:a})}function xBe(t,e,r){let o=[];for(let a of t.parts)switch(a.type){case\"context\":case\"deletion\":{for(let n of a.lines){let u=e[r];if(u==null||!aDt(u,n))return null;r+=1}a.type===\"deletion\"&&(o.push({type:\"splice\",index:r-a.lines.length,numToDelete:a.lines.length,linesToInsert:[]}),a.noNewlineAtEndOfFile&&o.push({type:\"push\",line:\"\"}))}break;case\"insertion\":o.push({type:\"splice\",index:r,numToDelete:0,linesToInsert:a.lines}),a.noNewlineAtEndOfFile&&o.push({type:\"pop\"});break;default:He.assertNever(a.type);break}return o}var uDt=/^builtin<([^>]+)>$/;function HC(t,e){let{protocol:r,source:o,selector:a,params:n}=G.parseRange(t);if(r!==\"patch:\")throw new Error(\"Invalid patch range\");if(o===null)throw new Error(\"Patch locators must explicitly define their source\");let u=a?a.split(/&/).map(E=>ue.toPortablePath(E)):[],A=n&&typeof n.locator==\"string\"?G.parseLocator(n.locator):null,p=n&&typeof n.version==\"string\"?n.version:null,h=e(o);return{parentLocator:A,sourceItem:h,patchPaths:u,sourceVersion:p}}function YQ(t){return t.range.startsWith(\"patch:\")}function $h(t){return t.reference.startsWith(\"patch:\")}function Ev(t){let{sourceItem:e,...r}=HC(t.range,G.parseDescriptor);return{...r,sourceDescriptor:e}}function Cv(t){let{sourceItem:e,...r}=HC(t.reference,G.parseLocator);return{...r,sourceLocator:e}}function ADt(t){let{sourceItem:e}=HC(t.range,G.parseDescriptor);return e}function fDt(t){let{sourceItem:e}=HC(t.reference,G.parseLocator);return e}function I5(t){if(!YQ(t))return t;let{sourceItem:e}=HC(t.range,G.parseDescriptor);return e}function WQ(t){if(!$h(t))return t;let{sourceItem:e}=HC(t.reference,G.parseLocator);return e}function kBe({parentLocator:t,sourceItem:e,patchPaths:r,sourceVersion:o,patchHash:a},n){let u=t!==null?{locator:G.stringifyLocator(t)}:{},A=typeof o<\"u\"?{version:o}:{},p=typeof a<\"u\"?{hash:a}:{};return G.makeRange({protocol:\"patch:\",source:n(e),selector:r.join(\"&\"),params:{...A,...p,...u}})}function KQ(t,{parentLocator:e,sourceDescriptor:r,patchPaths:o}){return G.makeDescriptor(t,kBe({parentLocator:e,sourceItem:r,patchPaths:o},G.stringifyDescriptor))}function B5(t,{parentLocator:e,sourcePackage:r,patchPaths:o,patchHash:a}){return G.makeLocator(t,kBe({parentLocator:e,sourceItem:r,sourceVersion:r.version,patchPaths:o,patchHash:a},G.stringifyLocator))}function QBe({onAbsolute:t,onRelative:e,onProject:r,onBuiltin:o},a){let n=a.lastIndexOf(\"!\");n!==-1&&(a=a.slice(n+1));let u=a.match(uDt);return u!==null?o(u[1]):a.startsWith(\"~/\")?r(a.slice(2)):V.isAbsolute(a)?t(a):e(a)}function FBe(t){let e=t.lastIndexOf(\"!\");return{optional:(e!==-1?new Set(t.slice(0,e).split(/!/)):new Set).has(\"optional\")}}function v5(t){return QBe({onAbsolute:()=>!1,onRelative:()=>!0,onProject:()=>!1,onBuiltin:()=>!1},t)}async function wv(t,e,r){let o=t!==null?await r.fetcher.fetch(t,r):null,a=o&&o.localPath?{packageFs:new gn(It.root),prefixPath:V.relative(It.root,o.localPath)}:o;o&&o!==a&&o.releaseFs&&o.releaseFs();let n=await He.releaseAfterUseAsync(async()=>await Promise.all(e.map(async u=>{let A=FBe(u),p=await QBe({onAbsolute:async h=>await oe.readFilePromise(h,\"utf8\"),onRelative:async h=>{if(a===null)throw new Error(\"Assertion failed: The parent locator should have been fetched\");return await a.packageFs.readFilePromise(V.join(a.prefixPath,h),\"utf8\")},onProject:async h=>await oe.readFilePromise(V.join(r.project.cwd,h),\"utf8\"),onBuiltin:async h=>await r.project.configuration.firstHook(E=>E.getBuiltinPatch,r.project,h)},u);return{...A,source:p}})));for(let u of n)typeof u.source==\"string\"&&(u.source=u.source.replace(/\\r\\n?/g,`\n`));return n}async function D5(t,{cache:e,project:r}){let o=r.storedPackages.get(t.locatorHash);if(typeof o>\"u\")throw new Error(\"Assertion failed: Expected the package to be registered\");let a=WQ(t),n=r.storedChecksums,u=new ki,A=await oe.mktempPromise(),p=V.join(A,\"source\"),h=V.join(A,\"user\"),E=V.join(A,\".yarn-patch.json\"),I=r.configuration.makeFetcher(),v=[];try{let x,C;if(t.locatorHash===a.locatorHash){let R=await I.fetch(t,{cache:e,project:r,fetcher:I,checksums:n,report:u});v.push(()=>R.releaseFs?.()),x=R,C=R}else x=await I.fetch(t,{cache:e,project:r,fetcher:I,checksums:n,report:u}),v.push(()=>x.releaseFs?.()),C=await I.fetch(t,{cache:e,project:r,fetcher:I,checksums:n,report:u}),v.push(()=>C.releaseFs?.());await Promise.all([oe.copyPromise(p,x.prefixPath,{baseFs:x.packageFs}),oe.copyPromise(h,C.prefixPath,{baseFs:C.packageFs}),oe.writeJsonPromise(E,{locator:G.stringifyLocator(t),version:o.version})])}finally{for(let x of v)x()}return oe.detachTemp(A),h}async function P5(t,e){let r=ue.fromPortablePath(t).replace(/\\\\/g,\"/\"),o=ue.fromPortablePath(e).replace(/\\\\/g,\"/\"),{stdout:a,stderr:n}=await Ur.execvp(\"git\",[\"-c\",\"core.safecrlf=false\",\"diff\",\"--src-prefix=a/\",\"--dst-prefix=b/\",\"--ignore-cr-at-eol\",\"--full-index\",\"--no-index\",\"--no-renames\",\"--text\",r,o],{cwd:ue.toPortablePath(process.cwd()),env:{...process.env,GIT_CONFIG_NOSYSTEM:\"1\",HOME:\"\",XDG_CONFIG_HOME:\"\",USERPROFILE:\"\"}});if(n.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH.\nThe following error was reported by 'git':\n${n}`);let u=r.startsWith(\"/\")?A=>A.slice(1):A=>A;return a.replace(new RegExp(`(a|b)(${He.escapeRegExp(`/${u(r)}/`)})`,\"g\"),\"$1/\").replace(new RegExp(`(a|b)${He.escapeRegExp(`/${u(o)}/`)}`,\"g\"),\"$1/\").replace(new RegExp(He.escapeRegExp(`${r}/`),\"g\"),\"\").replace(new RegExp(He.escapeRegExp(`${o}/`),\"g\"),\"\")}function b5(t,e){let r=[];for(let{source:o}of t){if(o===null)continue;let a=yv(o);for(let n of a){let{semverExclusivity:u,...A}=n;u!==null&&e!==null&&!Lr.satisfiesWithPrereleases(e,u)||r.push(JSON.stringify(A))}}return wn.makeHash(`${3}`,...r).slice(0,6)}Ge();function RBe(t,{configuration:e,report:r}){for(let o of t.parts)for(let a of o.lines)switch(o.type){case\"context\":r.reportInfo(null,`  ${pe.pretty(e,a,\"grey\")}`);break;case\"deletion\":r.reportError(28,`- ${pe.pretty(e,a,pe.Type.REMOVED)}`);break;case\"insertion\":r.reportError(28,`+ ${pe.pretty(e,a,pe.Type.ADDED)}`);break;default:He.assertNever(o.type)}}var Iv=class{supports(e,r){return!!$h(e)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async patchPackage(e,r){let{parentLocator:o,sourceLocator:a,sourceVersion:n,patchPaths:u}=Cv(e),A=await wv(o,u,r),p=await oe.mktempPromise(),h=V.join(p,\"current.zip\"),E=await r.fetcher.fetch(a,r),I=G.getIdentVendorPath(e),v=new Zi(h,{create:!0,level:r.project.configuration.get(\"compressionLevel\")});await He.releaseAfterUseAsync(async()=>{await v.copyPromise(I,E.prefixPath,{baseFs:E.packageFs,stableSort:!0})},E.releaseFs),v.saveAndClose();for(let{source:x,optional:C}of A){if(x===null)continue;let R=new Zi(h,{level:r.project.configuration.get(\"compressionLevel\")}),L=new gn(V.resolve(It.root,I),{baseFs:R});try{await GQ(yv(x),{baseFs:L,version:n})}catch(U){if(!(U instanceof UC))throw U;let z=r.project.configuration.get(\"enableInlineHunks\"),te=!z&&!C?\" (set enableInlineHunks for details)\":\"\",ae=`${G.prettyLocator(r.project.configuration,e)}: ${U.message}${te}`,le=ce=>{z&&RBe(U.hunk,{configuration:r.project.configuration,report:ce})};if(R.discardAndClose(),C){r.report.reportWarningOnce(66,ae,{reportExtra:le});continue}else throw new Jt(66,ae,le)}R.saveAndClose()}return new Zi(h,{level:r.project.configuration.get(\"compressionLevel\")})}};Ge();var Bv=class{supportsDescriptor(e,r){return!!YQ(e)}supportsLocator(e,r){return!!$h(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){let{patchPaths:a}=Ev(e);return a.every(n=>!v5(n))?e:G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){let{sourceDescriptor:o}=Ev(e);return{sourceDescriptor:r.project.configuration.normalizeDependency(o)}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error(\"Assertion failed: This resolver cannot be used unless a fetcher is configured\");let{parentLocator:a,patchPaths:n}=Ev(e),u=await wv(a,n,o.fetchOptions),A=r.sourceDescriptor;if(typeof A>\"u\")throw new Error(\"Assertion failed: The dependency should have been resolved\");let p=b5(u,A.version);return[B5(e,{parentLocator:a,sourcePackage:A,patchPaths:n,patchHash:p})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let{sourceLocator:o}=Cv(e);return{...await r.resolver.resolve(o,r),...e}}};Ge();Pt();qt();var qC=class extends ut{constructor(){super(...arguments);this.save=ge.Boolean(\"-s,--save\",!1,{description:\"Add the patch to your resolution entries\"});this.patchFolder=ge.String()}static{this.paths=[[\"patch-commit\"]]}static{this.usage=it.Usage({description:\"generate a patch out of a directory\",details:\"\\n      By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\\n\\n      With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\\n\\n      Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\\n    \"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd);if(!a)throw new sr(o.cwd,this.context.cwd);await o.restoreInstallState();let n=V.resolve(this.context.cwd,ue.toPortablePath(this.patchFolder)),u=V.join(n,\"../source\"),A=V.join(n,\"../.yarn-patch.json\");if(!oe.existsSync(u))throw new st(\"The argument folder didn't get created by 'yarn patch'\");let p=await P5(u,n),h=await oe.readJsonPromise(A),E=G.parseLocator(h.locator,!0);if(!o.storedPackages.has(E.locatorHash))throw new st(\"No package found in the project for the given locator\");if(!this.save){this.context.stdout.write(p);return}let I=r.get(\"patchFolder\"),v=V.join(I,`${G.slugifyLocator(E)}.patch`);await oe.mkdirPromise(I,{recursive:!0}),await oe.writeFilePromise(v,p);let x=[],C=new Map;for(let R of o.storedPackages.values()){if(G.isVirtualLocator(R))continue;let L=R.dependencies.get(E.identHash);if(!L)continue;let U=G.ensureDevirtualizedDescriptor(L),z=I5(U),te=o.storedResolutions.get(z.descriptorHash);if(!te)throw new Error(\"Assertion failed: Expected the resolution to have been registered\");if(!o.storedPackages.get(te))throw new Error(\"Assertion failed: Expected the package to have been registered\");let le=o.tryWorkspaceByLocator(R);if(le)x.push(le);else{let ce=o.originalPackages.get(R.locatorHash);if(!ce)throw new Error(\"Assertion failed: Expected the original package to have been registered\");let Ce=ce.dependencies.get(L.identHash);if(!Ce)throw new Error(\"Assertion failed: Expected the original dependency to have been registered\");C.set(Ce.descriptorHash,Ce)}}for(let R of x)for(let L of Ut.hardDependencies){let U=R.manifest[L].get(E.identHash);if(!U)continue;let z=KQ(U,{parentLocator:null,sourceDescriptor:G.convertLocatorToDescriptor(E),patchPaths:[V.join(dr.home,V.relative(o.cwd,v))]});R.manifest[L].set(U.identHash,z)}for(let R of C.values()){let L=KQ(R,{parentLocator:null,sourceDescriptor:G.convertLocatorToDescriptor(E),patchPaths:[V.join(dr.home,V.relative(o.cwd,v))]});o.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:G.stringifyIdent(L),description:R.range}},reference:L.range})}await o.persist()}};Ge();Pt();qt();var jC=class extends ut{constructor(){super(...arguments);this.update=ge.Boolean(\"-u,--update\",!1,{description:\"Reapply local patches that already apply to this packages\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.package=ge.String()}static{this.paths=[[\"patch\"]]}static{this.usage=it.Usage({description:\"prepare a package for patching\",details:\"\\n      This command will cause a package to be extracted in a temporary directory intended to be editable at will.\\n\\n      Once you're done with your changes, run `yarn patch-commit -s path` (with `path` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\\n\\n      Calling the command when you already have a patch won't import it by default (in other words, the default behavior is to reset existing patches). However, adding the `-u,--update` flag will import any current patch.\\n    \"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n=await Gr.find(r);if(!a)throw new sr(o.cwd,this.context.cwd);await o.restoreInstallState();let u=G.parseLocator(this.package);if(u.reference===\"unknown\"){let A=He.mapAndFilter([...o.storedPackages.values()],p=>p.identHash!==u.identHash?He.mapAndFilter.skip:G.isVirtualLocator(p)?He.mapAndFilter.skip:$h(p)!==this.update?He.mapAndFilter.skip:p);if(A.length===0)throw new st(\"No package found in the project for the given locator\");if(A.length>1)throw new st(`Multiple candidate packages found; explicitly choose one of them (use \\`yarn why <package>\\` to get more information as to who depends on them):\n${A.map(p=>`\n- ${G.prettyLocator(r,p)}`).join(\"\")}`);u=A[0]}if(!o.storedPackages.has(u.locatorHash))throw new st(\"No package found in the project for the given locator\");await Rt.start({configuration:r,json:this.json,stdout:this.context.stdout},async A=>{let p=WQ(u),h=await D5(u,{cache:n,project:o});A.reportJson({locator:G.stringifyLocator(p),path:ue.fromPortablePath(h)});let E=this.update?\" along with its current modifications\":\"\";A.reportInfo(0,`Package ${G.prettyLocator(r,p)} got extracted with success${E}!`),A.reportInfo(0,`You can now edit the following folder: ${pe.pretty(r,ue.fromPortablePath(h),\"magenta\")}`),A.reportInfo(0,`Once you are done run ${pe.pretty(r,`yarn patch-commit -s ${process.platform===\"win32\"?'\"':\"\"}${ue.fromPortablePath(h)}${process.platform===\"win32\"?'\"':\"\"}`,\"cyan\")} and Yarn will store a patchfile based on your changes.`)})}};var pDt={configuration:{enableInlineHunks:{description:\"If true, the installs will print unmatched patch hunks\",type:\"BOOLEAN\",default:!1},patchFolder:{description:\"Folder where the patch files must be written\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/patches\"}},commands:[qC,jC],fetchers:[Iv],resolvers:[Bv]},hDt=pDt;var Q5={};Vt(Q5,{PnpmLinker:()=>vv,default:()=>EDt});Ge();Pt();qt();var vv=class{getCustomDataKey(){return JSON.stringify({name:\"PnpmLinker\",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error(\"Assertion failed: Expected the pnpm linker to be enabled\");let o=this.getCustomDataKey(),a=r.project.linkersCustomData.get(o);if(!a)throw new st(`The project in ${pe.pretty(r.project.configuration,`${r.project.cwd}/package.json`,pe.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=a.pathsByLocator.get(e.locatorHash);if(typeof n>\"u\")throw new st(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return n.packageLocation}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=this.getCustomDataKey(),a=r.project.linkersCustomData.get(o);if(!a)throw new st(`The project in ${pe.pretty(r.project.configuration,`${r.project.cwd}/package.json`,pe.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=e.match(/(^.*\\/node_modules\\/(@[^/]*\\/)?[^/]+)(\\/.*$)/);if(n){let p=a.locatorByPath.get(n[1]);if(p)return p}let u=e,A=e;do{A=u,u=V.dirname(A);let p=a.locatorByPath.get(A);if(p)return p}while(u!==A);return null}makeInstaller(e){return new x5(e)}isEnabled(e){return e.project.configuration.get(\"nodeLinker\")===\"pnpm\"}},x5=class{constructor(e){this.opts=e;this.asyncActions=new He.AsyncActions(10);this.customData={pathsByLocator:new Map,locatorByPath:new Map};this.indexFolderPromise=cD(oe,{indexPath:V.join(e.project.configuration.get(\"globalFolder\"),\"index\")})}attachCustomData(e){}async installPackage(e,r,o){switch(e.linkType){case\"SOFT\":return this.installPackageSoft(e,r,o);case\"HARD\":return this.installPackageHard(e,r,o)}throw new Error(\"Assertion failed: Unsupported package link type\")}async installPackageSoft(e,r,o){let a=V.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.opts.project.tryWorkspaceByLocator(e)?V.join(a,dr.nodeModules):null;return this.customData.pathsByLocator.set(e.locatorHash,{packageLocation:a,dependenciesLocation:n}),{packageLocation:a,buildRequest:null}}async installPackageHard(e,r,o){let a=gDt(e,{project:this.opts.project}),n=a.packageLocation;this.customData.locatorByPath.set(n,G.stringifyLocator(e)),this.customData.pathsByLocator.set(e.locatorHash,a),o.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await oe.mkdirPromise(n,{recursive:!0}),await oe.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1,linkStrategy:{type:\"HardlinkFromIndex\",indexPath:await this.indexFolderPromise,autoRepair:!0}})}));let A=G.isVirtualLocator(e)?G.devirtualizeLocator(e):e,p={manifest:await Ut.tryFind(r.prefixPath,{baseFs:r.packageFs})??new Ut,misc:{hasBindingGyp:mA.hasBindingGyp(r)}},h=this.opts.project.getDependencyMeta(A,e.version),E=mA.extractBuildRequest(e,p,h,{configuration:this.opts.project.configuration});return{packageLocation:n,buildRequest:E}}async attachInternalDependencies(e,r){if(this.opts.project.configuration.get(\"nodeLinker\")!==\"pnpm\"||!TBe(e,{project:this.opts.project}))return;let o=this.customData.pathsByLocator.get(e.locatorHash);if(typeof o>\"u\")throw new Error(`Assertion failed: Expected the package to have been registered (${G.stringifyLocator(e)})`);let{dependenciesLocation:a}=o;a&&this.asyncActions.reduce(e.locatorHash,async n=>{await oe.mkdirPromise(a,{recursive:!0});let u=await dDt(a),A=new Map(u),p=[n],h=(I,v)=>{let x=v;TBe(v,{project:this.opts.project})||(this.opts.report.reportWarningOnce(0,\"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies\"),x=G.devirtualizeLocator(v));let C=this.customData.pathsByLocator.get(x.locatorHash);if(typeof C>\"u\")throw new Error(`Assertion failed: Expected the package to have been registered (${G.stringifyLocator(v)})`);let R=G.stringifyIdent(I),L=V.join(a,R),U=V.relative(V.dirname(L),C.packageLocation),z=A.get(R);A.delete(R),p.push(Promise.resolve().then(async()=>{if(z){if(z.isSymbolicLink()&&await oe.readlinkPromise(L)===U)return;await oe.removePromise(L)}await oe.mkdirpPromise(V.dirname(L)),process.platform==\"win32\"&&this.opts.project.configuration.get(\"winLinkType\")===\"junctions\"?await oe.symlinkPromise(C.packageLocation,L,\"junction\"):await oe.symlinkPromise(U,L)}))},E=!1;for(let[I,v]of r)I.identHash===e.identHash&&(E=!0),h(I,v);!E&&!this.opts.project.tryWorkspaceByLocator(e)&&h(G.convertLocatorToDescriptor(e),e),p.push(mDt(a,A)),await Promise.all(p)})}async attachExternalDependents(e,r){throw new Error(\"External dependencies haven't been implemented for the pnpm linker\")}async finalizeInstall(){let e=LBe(this.opts.project);if(this.opts.project.configuration.get(\"nodeLinker\")!==\"pnpm\")await oe.removePromise(e);else{let r;try{r=new Set(await oe.readdirPromise(e))}catch{r=new Set}for(let{dependenciesLocation:o}of this.customData.pathsByLocator.values()){if(!o)continue;let a=V.contains(e,o);if(a===null)continue;let[n]=a.split(V.sep);r.delete(n)}await Promise.all([...r].map(async o=>{await oe.removePromise(V.join(e,o))}))}return await this.asyncActions.wait(),await k5(e),this.opts.project.configuration.get(\"nodeLinker\")!==\"node-modules\"&&await k5(NBe(this.opts.project)),{customData:this.customData}}};function NBe(t){return V.join(t.cwd,dr.nodeModules)}function LBe(t){return V.join(NBe(t),\".store\")}function gDt(t,{project:e}){let r=G.slugifyLocator(t),o=LBe(e),a=V.join(o,r,\"package\"),n=V.join(o,r,dr.nodeModules);return{packageLocation:a,dependenciesLocation:n}}function TBe(t,{project:e}){return!G.isVirtualLocator(t)||!e.tryWorkspaceByLocator(t)}async function dDt(t){let e=new Map,r=[];try{r=await oe.readdirPromise(t,{withFileTypes:!0})}catch(o){if(o.code!==\"ENOENT\")throw o}try{for(let o of r)if(!o.name.startsWith(\".\"))if(o.name.startsWith(\"@\")){let a=await oe.readdirPromise(V.join(t,o.name),{withFileTypes:!0});if(a.length===0)e.set(o.name,o);else for(let n of a)e.set(`${o.name}/${n.name}`,n)}else e.set(o.name,o)}catch(o){if(o.code!==\"ENOENT\")throw o}return e}async function mDt(t,e){let r=[],o=new Set;for(let a of e.keys()){r.push(oe.removePromise(V.join(t,a)));let n=G.tryParseIdent(a)?.scope;n&&o.add(`@${n}`)}return Promise.all(r).then(()=>Promise.all([...o].map(a=>k5(V.join(t,a)))))}async function k5(t){try{await oe.rmdirPromise(t)}catch(e){if(e.code!==\"ENOENT\"&&e.code!==\"ENOTEMPTY\")throw e}}var yDt={linkers:[vv]},EDt=yDt;var O5={};Vt(O5,{StageCommand:()=>GC,default:()=>kDt,stageUtils:()=>zQ});Ge();Pt();qt();Ge();Pt();var zQ={};Vt(zQ,{ActionType:()=>F5,checkConsensus:()=>VQ,expandDirectory:()=>N5,findConsensus:()=>L5,findVcsRoot:()=>R5,genCommitMessage:()=>M5,getCommitPrefix:()=>MBe,isYarnFile:()=>T5});Pt();var F5=(n=>(n[n.CREATE=0]=\"CREATE\",n[n.DELETE=1]=\"DELETE\",n[n.ADD=2]=\"ADD\",n[n.REMOVE=3]=\"REMOVE\",n[n.MODIFY=4]=\"MODIFY\",n))(F5||{});async function R5(t,{marker:e}){do if(!oe.existsSync(V.join(t,e)))t=V.dirname(t);else return t;while(t!==\"/\");return null}function T5(t,{roots:e,names:r}){if(r.has(V.basename(t)))return!0;do if(!e.has(t))t=V.dirname(t);else return!0;while(t!==\"/\");return!1}function N5(t){let e=[],r=[t];for(;r.length>0;){let o=r.pop(),a=oe.readdirSync(o);for(let n of a){let u=V.resolve(o,n);oe.lstatSync(u).isDirectory()?r.push(u):e.push(u)}}return e}function VQ(t,e){let r=0,o=0;for(let a of t)a!==\"wip\"&&(e.test(a)?r+=1:o+=1);return r>=o}function L5(t){let e=VQ(t,/^(\\w\\(\\w+\\):\\s*)?\\w+s/),r=VQ(t,/^(\\w\\(\\w+\\):\\s*)?[A-Z]/),o=VQ(t,/^\\w\\(\\w+\\):/);return{useThirdPerson:e,useUpperCase:r,useComponent:o}}function MBe(t){return t.useComponent?\"chore(yarn): \":\"\"}var CDt=new Map([[0,\"create\"],[1,\"delete\"],[2,\"add\"],[3,\"remove\"],[4,\"update\"]]);function M5(t,e){let r=MBe(t),o=[],a=e.slice().sort((n,u)=>n[0]-u[0]);for(;a.length>0;){let[n,u]=a.shift(),A=CDt.get(n);t.useUpperCase&&o.length===0&&(A=`${A[0].toUpperCase()}${A.slice(1)}`),t.useThirdPerson&&(A+=\"s\");let p=[u];for(;a.length>0&&a[0][0]===n;){let[,E]=a.shift();p.push(E)}p.sort();let h=p.shift();p.length===1?h+=\" (and one other)\":p.length>1&&(h+=` (and ${p.length} others)`),o.push(`${A} ${h}`)}return`${r}${o.join(\", \")}`}var wDt=\"Commit generated via `yarn stage`\",IDt=11;async function OBe(t){let{code:e,stdout:r}=await Ur.execvp(\"git\",[\"log\",\"-1\",\"--pretty=format:%H\"],{cwd:t});return e===0?r.trim():null}async function BDt(t,e){let r=[],o=e.filter(h=>V.basename(h.path)===\"package.json\");for(let{action:h,path:E}of o){let I=V.relative(t,E);if(h===4){let v=await OBe(t),{stdout:x}=await Ur.execvp(\"git\",[\"show\",`${v}:${I}`],{cwd:t,strict:!0}),C=await Ut.fromText(x),R=await Ut.fromFile(E),L=new Map([...R.dependencies,...R.devDependencies]),U=new Map([...C.dependencies,...C.devDependencies]);for(let[z,te]of U){let ae=G.stringifyIdent(te),le=L.get(z);le?le.range!==te.range&&r.push([4,`${ae} to ${le.range}`]):r.push([3,ae])}for(let[z,te]of L)U.has(z)||r.push([2,G.stringifyIdent(te)])}else if(h===0){let v=await Ut.fromFile(E);v.name?r.push([0,G.stringifyIdent(v.name)]):r.push([0,\"a package\"])}else if(h===1){let v=await OBe(t),{stdout:x}=await Ur.execvp(\"git\",[\"show\",`${v}:${I}`],{cwd:t,strict:!0}),C=await Ut.fromText(x);C.name?r.push([1,G.stringifyIdent(C.name)]):r.push([1,\"a package\"])}else throw new Error(\"Assertion failed: Unsupported action type\")}let{code:a,stdout:n}=await Ur.execvp(\"git\",[\"log\",`-${IDt}`,\"--pretty=format:%s\"],{cwd:t}),u=a===0?n.split(/\\n/g).filter(h=>h!==\"\"):[],A=L5(u);return M5(A,r)}var vDt={0:[\" A \",\"?? \"],4:[\" M \"],1:[\" D \"]},DDt={0:[\"A  \"],4:[\"M  \"],1:[\"D  \"]},UBe={async findRoot(t){return await R5(t,{marker:\".git\"})},async filterChanges(t,e,r,o){let{stdout:a}=await Ur.execvp(\"git\",[\"status\",\"-s\"],{cwd:t,strict:!0}),n=a.toString().split(/\\n/g),u=o?.staged?DDt:vDt;return[].concat(...n.map(p=>{if(p===\"\")return[];let h=p.slice(0,3),E=V.resolve(t,p.slice(3));if(!o?.staged&&h===\"?? \"&&p.endsWith(\"/\"))return N5(E).map(I=>({action:0,path:I}));{let v=[0,4,1].find(x=>u[x].includes(h));return v!==void 0?[{action:v,path:E}]:[]}})).filter(p=>T5(p.path,{roots:e,names:r}))},async genCommitMessage(t,e){return await BDt(t,e)},async makeStage(t,e){let r=e.map(o=>ue.fromPortablePath(o.path));await Ur.execvp(\"git\",[\"add\",\"--\",...r],{cwd:t,strict:!0})},async makeCommit(t,e,r){let o=e.map(a=>ue.fromPortablePath(a.path));await Ur.execvp(\"git\",[\"add\",\"-N\",\"--\",...o],{cwd:t,strict:!0}),await Ur.execvp(\"git\",[\"commit\",\"-m\",`${r}\n\n${wDt}\n`,\"--\",...o],{cwd:t,strict:!0})},async makeReset(t,e){let r=e.map(o=>ue.fromPortablePath(o.path));await Ur.execvp(\"git\",[\"reset\",\"HEAD\",\"--\",...r],{cwd:t,strict:!0})}};var PDt=[UBe],GC=class extends ut{constructor(){super(...arguments);this.commit=ge.Boolean(\"-c,--commit\",!1,{description:\"Commit the staged files\"});this.reset=ge.Boolean(\"-r,--reset\",!1,{description:\"Remove all files from the staging area\"});this.dryRun=ge.Boolean(\"-n,--dry-run\",!1,{description:\"Print the commit message and the list of modified files without staging / committing\"});this.update=ge.Boolean(\"-u,--update\",!1,{hidden:!0})}static{this.paths=[[\"stage\"]]}static{this.usage=it.Usage({description:\"add all yarn files to your vcs\",details:\"\\n      This command will add to your staging area the files belonging to Yarn (typically any modified `package.json` and `.yarnrc.yml` files, but also linker-generated files, cache data, etc). It will take your ignore list into account, so the cache files won't be added if the cache is ignored in a `.gitignore` file (assuming you use Git).\\n\\n      Running `--reset` will instead remove them from the staging area (the changes will still be there, but won't be committed until you stage them back).\\n\\n      Since the staging area is a non-existent concept in Mercurial, Yarn will always create a new commit when running this command on Mercurial repositories. You can get this behavior when using Git by using the `--commit` flag which will directly create a commit.\\n    \",examples:[[\"Adds all modified project files to the staging area\",\"yarn stage\"],[\"Creates a new commit containing all modified project files\",\"yarn stage --commit\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o}=await kt.find(r,this.context.cwd),{driver:a,root:n}=await bDt(o.cwd),u=[r.get(\"cacheFolder\"),r.get(\"globalFolder\"),r.get(\"virtualFolder\"),r.get(\"yarnPath\")];await r.triggerHook(I=>I.populateYarnPaths,o,I=>{u.push(I)});let A=new Set;for(let I of u)for(let v of SDt(n,I))A.add(v);let p=new Set([r.get(\"rcFilename\"),dr.lockfile,dr.manifest]),h=await a.filterChanges(n,A,p),E=await a.genCommitMessage(n,h);if(this.dryRun)if(this.commit)this.context.stdout.write(`${E}\n`);else for(let I of h)this.context.stdout.write(`${ue.fromPortablePath(I.path)}\n`);else if(this.reset){let I=await a.filterChanges(n,A,p,{staged:!0});I.length===0?this.context.stdout.write(\"No staged changes found!\"):await a.makeReset(n,I)}else h.length===0?this.context.stdout.write(\"No changes found!\"):this.commit?await a.makeCommit(n,h,E):(await a.makeStage(n,h),this.context.stdout.write(E))}};async function bDt(t){let e=null,r=null;for(let o of PDt)if((r=await o.findRoot(t))!==null){e=o;break}if(e===null||r===null)throw new st(\"No stage driver has been found for your current project\");return{driver:e,root:r}}function SDt(t,e){let r=[];if(e===null)return r;for(;;){(e===t||e.startsWith(`${t}/`))&&r.push(e);let o;try{o=oe.statSync(e)}catch{break}if(o.isSymbolicLink())e=V.resolve(V.dirname(e),oe.readlinkSync(e));else break}return r}var xDt={commands:[GC]},kDt=xDt;var U5={};Vt(U5,{default:()=>ODt});Ge();Ge();Pt();var qBe=Ze(Jn());Ge();var _Be=Ze(YH()),QDt=\"e8e1bd300d860104bb8c58453ffa1eb4\",FDt=\"OFCNCOG2CU\",HBe=async(t,e)=>{let r=G.stringifyIdent(t),a=RDt(e).initIndex(\"npm-search\");try{return(await a.getObject(r,{attributesToRetrieve:[\"types\"]})).types?.ts===\"definitely-typed\"}catch{return!1}},RDt=t=>(0,_Be.default)(FDt,QDt,{requester:{async send(r){try{let o=await sn.request(r.url,r.data||null,{configuration:t,headers:r.headers});return{content:o.body,isTimedOut:!1,status:o.statusCode}}catch(o){return{content:o.response.body,isTimedOut:!1,status:o.response.statusCode}}}}});var jBe=t=>t.scope?`${t.scope}__${t.name}`:`${t.name}`,TDt=async(t,e,r,o)=>{if(r.scope===\"types\")return;let{project:a}=t,{configuration:n}=a;if(!(n.get(\"tsEnableAutoTypes\")??(oe.existsSync(V.join(t.cwd,\"tsconfig.json\"))||oe.existsSync(V.join(a.cwd,\"tsconfig.json\")))))return;let A=n.makeResolver(),p={project:a,resolver:A,report:new ki};if(!await HBe(r,n))return;let E=jBe(r),I=G.parseRange(r.range).selector;if(!Lr.validRange(I)){let L=n.normalizeDependency(r),U=await A.getCandidates(L,{},p);I=G.parseRange(U[0].reference).selector}let v=qBe.default.coerce(I);if(v===null)return;let x=`${Zc.Modifier.CARET}${v.major}`,C=G.makeDescriptor(G.makeIdent(\"types\",E),x),R=He.mapAndFind(a.workspaces,L=>{let U=L.manifest.dependencies.get(r.identHash)?.descriptorHash,z=L.manifest.devDependencies.get(r.identHash)?.descriptorHash;if(U!==r.descriptorHash&&z!==r.descriptorHash)return He.mapAndFind.skip;let te=[];for(let ae of Ut.allDependencies){let le=L.manifest[ae].get(C.identHash);typeof le>\"u\"||te.push([ae,le])}return te.length===0?He.mapAndFind.skip:te});if(typeof R<\"u\")for(let[L,U]of R)t.manifest[L].set(U.identHash,U);else{try{let L=n.normalizeDependency(C);if((await A.getCandidates(L,{},p)).length===0)return}catch{return}t.manifest[Zc.Target.DEVELOPMENT].set(C.identHash,C)}},NDt=async(t,e,r)=>{if(r.scope===\"types\")return;let{project:o}=t,{configuration:a}=o;if(!(a.get(\"tsEnableAutoTypes\")??(oe.existsSync(V.join(t.cwd,\"tsconfig.json\"))||oe.existsSync(V.join(o.cwd,\"tsconfig.json\")))))return;let u=jBe(r),A=G.makeIdent(\"types\",u);for(let p of Ut.allDependencies)typeof t.manifest[p].get(A.identHash)>\"u\"||t.manifest[p].delete(A.identHash)},LDt=(t,e)=>{e.publishConfig&&e.publishConfig.typings&&(e.typings=e.publishConfig.typings),e.publishConfig&&e.publishConfig.types&&(e.types=e.publishConfig.types)},MDt={configuration:{tsEnableAutoTypes:{description:\"Whether Yarn should auto-install @types/ dependencies on 'yarn add'\",type:\"BOOLEAN\",isNullable:!0,default:null}},hooks:{afterWorkspaceDependencyAddition:TDt,afterWorkspaceDependencyRemoval:NDt,beforeWorkspacePacking:LDt}},ODt=MDt;var G5={};Vt(G5,{VersionApplyCommand:()=>zC,VersionCheckCommand:()=>JC,VersionCommand:()=>XC,default:()=>nPt,versionUtils:()=>VC});Ge();Ge();qt();var VC={};Vt(VC,{Decision:()=>WC,applyPrerelease:()=>zBe,applyReleases:()=>j5,applyStrategy:()=>XQ,clearVersionFiles:()=>_5,getUndecidedDependentWorkspaces:()=>Pv,getUndecidedWorkspaces:()=>JQ,openVersionFile:()=>KC,requireMoreDecisions:()=>ePt,resolveVersionFiles:()=>Dv,suggestStrategy:()=>q5,updateVersionFiles:()=>H5,validateReleaseDecision:()=>YC});Ge();Pt();Nl();qt();var VBe=Ze(KBe()),BA=Ze(Jn()),$Dt=/^(>=|[~^]|)(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$/,WC=(u=>(u.UNDECIDED=\"undecided\",u.DECLINE=\"decline\",u.MAJOR=\"major\",u.MINOR=\"minor\",u.PATCH=\"patch\",u.PRERELEASE=\"prerelease\",u))(WC||{});function YC(t){let e=BA.default.valid(t);return e||He.validateEnum((0,VBe.default)(WC,\"UNDECIDED\"),t)}async function Dv(t,{prerelease:e=null}={}){let r=new Map,o=t.configuration.get(\"deferredVersionFolder\");if(!oe.existsSync(o))return r;let a=await oe.readdirPromise(o);for(let n of a){if(!n.endsWith(\".yml\"))continue;let u=V.join(o,n),A=await oe.readFilePromise(u,\"utf8\"),p=Ki(A);for(let[h,E]of Object.entries(p.releases||{})){if(E===\"decline\")continue;let I=G.parseIdent(h),v=t.tryWorkspaceByIdent(I);if(v===null)throw new Error(`Assertion failed: Expected a release definition file to only reference existing workspaces (${V.basename(u)} references ${h})`);if(v.manifest.version===null)throw new Error(`Assertion failed: Expected the workspace to have a version (${G.prettyLocator(t.configuration,v.anchoredLocator)})`);let x=v.manifest.raw.stableVersion??v.manifest.version,C=r.get(v),R=XQ(x,YC(E));if(R===null)throw new Error(`Assertion failed: Expected ${x} to support being bumped via strategy ${E}`);let L=typeof C<\"u\"?BA.default.gt(R,C)?R:C:R;r.set(v,L)}}return e&&(r=new Map([...r].map(([n,u])=>[n,zBe(u,{current:n.manifest.version,prerelease:e})]))),r}async function _5(t){let e=t.configuration.get(\"deferredVersionFolder\");oe.existsSync(e)&&await oe.removePromise(e)}async function H5(t,e){let r=new Set(e),o=t.configuration.get(\"deferredVersionFolder\");if(!oe.existsSync(o))return;let a=await oe.readdirPromise(o);for(let n of a){if(!n.endsWith(\".yml\"))continue;let u=V.join(o,n),A=await oe.readFilePromise(u,\"utf8\"),p=Ki(A),h=p?.releases;if(h){for(let E of Object.keys(h)){let I=G.parseIdent(E),v=t.tryWorkspaceByIdent(I);(v===null||r.has(v))&&delete p.releases[E]}Object.keys(p.releases).length>0?await oe.changeFilePromise(u,Da(new Da.PreserveOrdering(p))):await oe.unlinkPromise(u)}}}async function KC(t,{allowEmpty:e=!1}={}){let r=t.configuration;if(r.projectCwd===null)throw new st(\"This command can only be run from within a Yarn project\");let o=await ia.fetchRoot(r.projectCwd),a=o!==null?await ia.fetchBase(o,{baseRefs:r.get(\"changesetBaseRefs\")}):null,n=o!==null?await ia.fetchChangedFiles(o,{base:a.hash,project:t}):[],u=r.get(\"deferredVersionFolder\"),A=n.filter(x=>V.contains(u,x)!==null);if(A.length>1)throw new st(`Your current branch contains multiple versioning files; this isn't supported:\n- ${A.map(x=>ue.fromPortablePath(x)).join(`\n- `)}`);let p=new Set(He.mapAndFilter(n,x=>{let C=t.tryWorkspaceByFilePath(x);return C===null?He.mapAndFilter.skip:C}));if(A.length===0&&p.size===0&&!e)return null;let h=A.length===1?A[0]:V.join(u,`${wn.makeHash(Math.random().toString()).slice(0,8)}.yml`),E=oe.existsSync(h)?await oe.readFilePromise(h,\"utf8\"):\"{}\",I=Ki(E),v=new Map;for(let x of I.declined||[]){let C=G.parseIdent(x),R=t.getWorkspaceByIdent(C);v.set(R,\"decline\")}for(let[x,C]of Object.entries(I.releases||{})){let R=G.parseIdent(x),L=t.getWorkspaceByIdent(R);v.set(L,YC(C))}return{project:t,root:o,baseHash:a!==null?a.hash:null,baseTitle:a!==null?a.title:null,changedFiles:new Set(n),changedWorkspaces:p,releaseRoots:new Set([...p].filter(x=>x.manifest.version!==null)),releases:v,async saveAll(){let x={},C=[],R=[];for(let L of t.workspaces){if(L.manifest.version===null)continue;let U=G.stringifyIdent(L.anchoredLocator),z=v.get(L);z===\"decline\"?C.push(U):typeof z<\"u\"?x[U]=YC(z):p.has(L)&&R.push(U)}await oe.mkdirPromise(V.dirname(h),{recursive:!0}),await oe.changeFilePromise(h,Da(new Da.PreserveOrdering({releases:Object.keys(x).length>0?x:void 0,declined:C.length>0?C:void 0,undecided:R.length>0?R:void 0})))}}}function ePt(t){return JQ(t).size>0||Pv(t).length>0}function JQ(t){let e=new Set;for(let r of t.changedWorkspaces)r.manifest.version!==null&&(t.releases.has(r)||e.add(r));return e}function Pv(t,{include:e=new Set}={}){let r=[],o=new Map(He.mapAndFilter([...t.releases],([n,u])=>u===\"decline\"?He.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n])),a=new Map(He.mapAndFilter([...t.releases],([n,u])=>u!==\"decline\"?He.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n]));for(let n of t.project.workspaces)if(!(!e.has(n)&&(a.has(n.anchoredLocator.locatorHash)||o.has(n.anchoredLocator.locatorHash)))&&n.manifest.version!==null)for(let u of Ut.hardDependencies)for(let A of n.manifest.getForScope(u).values()){let p=t.project.tryWorkspaceByDescriptor(A);p!==null&&o.has(p.anchoredLocator.locatorHash)&&r.push([n,p])}return r}function q5(t,e){let r=BA.default.clean(e);for(let o of Object.values(WC))if(o!==\"undecided\"&&o!==\"decline\"&&BA.default.inc(t,o)===r)return o;return null}function XQ(t,e){if(BA.default.valid(e))return e;if(t===null)throw new st(`Cannot apply the release strategy \"${e}\" unless the workspace already has a valid version`);if(!BA.default.valid(t))throw new st(`Cannot apply the release strategy \"${e}\" on a non-semver version (${t})`);let r=BA.default.inc(t,e);if(r===null)throw new st(`Cannot apply the release strategy \"${e}\" on the specified version (${t})`);return r}function j5(t,e,{report:r}){let o=new Map;for(let a of t.workspaces)for(let n of Ut.allDependencies)for(let u of a.manifest[n].values()){let A=t.tryWorkspaceByDescriptor(u);if(A===null||!e.has(A))continue;He.getArrayWithDefault(o,A).push([a,n,u.identHash])}for(let[a,n]of e){let u=a.manifest.version;a.manifest.version=n,BA.default.prerelease(n)===null?delete a.manifest.raw.stableVersion:a.manifest.raw.stableVersion||(a.manifest.raw.stableVersion=u);let A=a.manifest.name!==null?G.stringifyIdent(a.manifest.name):null;r.reportInfo(0,`${G.prettyLocator(t.configuration,a.anchoredLocator)}: Bumped to ${n}`),r.reportJson({cwd:ue.fromPortablePath(a.cwd),ident:A,oldVersion:u,newVersion:n});let p=o.get(a);if(!(typeof p>\"u\"))for(let[h,E,I]of p){let v=h.manifest[E].get(I);if(typeof v>\"u\")throw new Error(\"Assertion failed: The dependency should have existed\");let x=v.range,C=!1;if(x.startsWith(ei.protocol)&&(x=x.slice(ei.protocol.length),C=!0,x===a.relativeCwd))continue;let R=x.match($Dt);if(!R){r.reportWarning(0,`Couldn't auto-upgrade range ${x} (in ${G.prettyLocator(t.configuration,h.anchoredLocator)})`);continue}let L=`${R[1]}${n}`;C&&(L=`${ei.protocol}${L}`);let U=G.makeDescriptor(v,L);h.manifest[E].set(I,U)}}}var tPt=new Map([[\"%n\",{extract:t=>t.length>=1?[t[0],t.slice(1)]:null,generate:(t=0)=>`${t+1}`}]]);function zBe(t,{current:e,prerelease:r}){let o=new BA.default.SemVer(e),a=o.prerelease.slice(),n=[];o.prerelease=[],o.format()!==t&&(a.length=0);let u=!0,A=r.split(/\\./g);for(let p of A){let h=tPt.get(p);if(typeof h>\"u\")n.push(p),a[0]===p?a.shift():u=!1;else{let E=u?h.extract(a):null;E!==null&&typeof E[0]==\"number\"?(n.push(h.generate(E[0])),a=E[1]):(n.push(h.generate()),u=!1)}}return o.prerelease&&(o.prerelease=[]),`${t}-${n.join(\".\")}`}var zC=class extends ut{constructor(){super(...arguments);this.all=ge.Boolean(\"--all\",!1,{description:\"Apply the deferred version changes on all workspaces\"});this.dryRun=ge.Boolean(\"--dry-run\",!1,{description:\"Print the versions without actually generating the package archive\"});this.prerelease=ge.String(\"--prerelease\",{description:\"Add a prerelease identifier to new versions\",tolerateBoolean:!0});this.recursive=ge.Boolean(\"-R,--recursive\",{description:\"Release the transitive workspaces as well\"});this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"})}static{this.paths=[[\"version\",\"apply\"]]}static{this.usage=it.Usage({category:\"Release-related commands\",description:\"apply all the deferred version bumps at once\",details:`\n      This command will apply the deferred version changes and remove their definitions from the repository.\n\n      Note that if \\`--prerelease\\` is set, the given prerelease identifier (by default \\`rc.%n\\`) will be used on all new versions and the version definitions will be kept as-is.\n\n      By default only the current workspace will be bumped, but you can configure this behavior by using one of:\n\n      - \\`--recursive\\` to also apply the version bump on its dependencies\n      - \\`--all\\` to apply the version bump on all packages in the repository\n\n      Note that this command will also update the \\`workspace:\\` references across all your local workspaces, thus ensuring that they keep referring to the same workspaces even after the version bump.\n    `,examples:[[\"Apply the version change to the local workspace\",\"yarn version apply\"],[\"Apply the version change to all the workspaces in the local workspace\",\"yarn version apply --all\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n=await Gr.find(r);if(!a)throw new sr(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=await Rt.start({configuration:r,json:this.json,stdout:this.context.stdout},async A=>{let p=this.prerelease?typeof this.prerelease!=\"boolean\"?this.prerelease:\"rc.%n\":null,h=await Dv(o,{prerelease:p}),E=new Map;if(this.all)E=h;else{let I=this.recursive?a.getRecursiveWorkspaceDependencies():[a];for(let v of I){let x=h.get(v);typeof x<\"u\"&&E.set(v,x)}}if(E.size===0){let I=h.size>0?\" Did you want to add --all?\":\"\";A.reportWarning(0,`The current workspace doesn't seem to require a version bump.${I}`);return}j5(o,E,{report:A}),this.dryRun||(p||(this.all?await _5(o):await H5(o,[...E.keys()])),A.reportSeparator())});return this.dryRun||u.hasErrors()?u.exitCode():await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};Ge();Pt();qt();var ZQ=Ze(Jn());var JC=class extends ut{constructor(){super(...arguments);this.interactive=ge.Boolean(\"-i,--interactive\",{description:\"Open an interactive interface used to set version bumps\"})}static{this.paths=[[\"version\",\"check\"]]}static{this.usage=it.Usage({category:\"Release-related commands\",description:\"check that all the relevant packages have been bumped\",details:\"\\n      **Warning:** This command currently requires Git.\\n\\n      This command will check that all the packages covered by the files listed in argument have been properly bumped or declined to bump.\\n\\n      In the case of a bump, the check will also cover transitive packages - meaning that should `Foo` be bumped, a package `Bar` depending on `Foo` will require a decision as to whether `Bar` will need to be bumped. This check doesn't cross packages that have declined to bump.\\n\\n      In case no arguments are passed to the function, the list of modified files will be generated by comparing the HEAD against `master`.\\n    \",examples:[[\"Check whether the modified packages need a bump\",\"yarn version check\"]]})}async execute(){return this.interactive?await this.executeInteractive():await this.executeStandard()}async executeInteractive(){GE(this.context);let{Gem:r}=await Promise.resolve().then(()=>(Zk(),Eq)),{ScrollableItems:o}=await Promise.resolve().then(()=>(rQ(),tQ)),{FocusRequest:a}=await Promise.resolve().then(()=>(wq(),$we)),{useListInput:n}=await Promise.resolve().then(()=>(eQ(),eIe)),{renderForm:u}=await Promise.resolve().then(()=>(oQ(),sQ)),{Box:A,Text:p}=await Promise.resolve().then(()=>Ze(ic())),{default:h,useCallback:E,useState:I}=await Promise.resolve().then(()=>Ze(an())),v=await Ke.find(this.context.cwd,this.context.plugins),{project:x,workspace:C}=await kt.find(v,this.context.cwd);if(!C)throw new sr(x.cwd,this.context.cwd);await x.restoreInstallState();let R=await KC(x);if(R===null||R.releaseRoots.size===0)return 0;if(R.root===null)throw new st(\"This command can only be run on Git repositories\");let L=()=>h.createElement(A,{flexDirection:\"row\",paddingBottom:1},h.createElement(A,{flexDirection:\"column\",width:60},h.createElement(A,null,h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<up>\"),\"/\",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<down>\"),\" to select workspaces.\")),h.createElement(A,null,h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<left>\"),\"/\",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<right>\"),\" to select release strategies.\"))),h.createElement(A,{flexDirection:\"column\"},h.createElement(A,{marginLeft:1},h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<enter>\"),\" to save.\")),h.createElement(A,{marginLeft:1},h.createElement(p,null,\"Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<ctrl+c>\"),\" to abort.\")))),U=({workspace:Ce,active:de,decision:Be,setDecision:Ee})=>{let g=Ce.manifest.raw.stableVersion??Ce.manifest.version;if(g===null)throw new Error(`Assertion failed: The version should have been set (${G.prettyLocator(v,Ce.anchoredLocator)})`);if(ZQ.default.prerelease(g)!==null)throw new Error(`Assertion failed: Prerelease identifiers shouldn't be found (${g})`);let me=[\"undecided\",\"decline\",\"patch\",\"minor\",\"major\"];n(Be,me,{active:de,minus:\"left\",plus:\"right\",set:Ee});let we=Be===\"undecided\"?h.createElement(p,{color:\"yellow\"},g):Be===\"decline\"?h.createElement(p,{color:\"green\"},g):h.createElement(p,null,h.createElement(p,{color:\"magenta\"},g),\" \\u2192 \",h.createElement(p,{color:\"green\"},ZQ.default.valid(Be)?Be:ZQ.default.inc(g,Be)));return h.createElement(A,{flexDirection:\"column\"},h.createElement(A,null,h.createElement(p,null,G.prettyLocator(v,Ce.anchoredLocator),\" - \",we)),h.createElement(A,null,me.map(Ae=>h.createElement(A,{key:Ae,paddingLeft:2},h.createElement(p,null,h.createElement(r,{active:Ae===Be}),\" \",Ae)))))},z=Ce=>{let de=new Set(R.releaseRoots),Be=new Map([...Ce].filter(([Ee])=>de.has(Ee)));for(;;){let Ee=Pv({project:R.project,releases:Be}),g=!1;if(Ee.length>0){for(let[me]of Ee)if(!de.has(me)){de.add(me),g=!0;let we=Ce.get(me);typeof we<\"u\"&&Be.set(me,we)}}if(!g)break}return{relevantWorkspaces:de,relevantReleases:Be}},te=()=>{let[Ce,de]=I(()=>new Map(R.releases)),Be=E((Ee,g)=>{let me=new Map(Ce);g!==\"undecided\"?me.set(Ee,g):me.delete(Ee);let{relevantReleases:we}=z(me);de(we)},[Ce,de]);return[Ce,Be]},ae=({workspaces:Ce,releases:de})=>{let Be=[];Be.push(`${Ce.size} total`);let Ee=0,g=0;for(let me of Ce){let we=de.get(me);typeof we>\"u\"?g+=1:we!==\"decline\"&&(Ee+=1)}return Be.push(`${Ee} release${Ee===1?\"\":\"s\"}`),Be.push(`${g} remaining`),h.createElement(p,{color:\"yellow\"},Be.join(\", \"))},ce=await u(({useSubmit:Ce})=>{let[de,Be]=te();Ce(de);let{relevantWorkspaces:Ee}=z(de),g=new Set([...Ee].filter(ne=>!R.releaseRoots.has(ne))),[me,we]=I(0),Ae=E(ne=>{switch(ne){case a.BEFORE:we(me-1);break;case a.AFTER:we(me+1);break}},[me,we]);return h.createElement(A,{flexDirection:\"column\"},h.createElement(L,null),h.createElement(A,null,h.createElement(p,{wrap:\"wrap\"},\"The following files have been modified in your local checkout.\")),h.createElement(A,{flexDirection:\"column\",marginTop:1,paddingLeft:2},[...R.changedFiles].map(ne=>h.createElement(A,{key:ne},h.createElement(p,null,h.createElement(p,{color:\"grey\"},ue.fromPortablePath(R.root)),ue.sep,ue.relative(ue.fromPortablePath(R.root),ue.fromPortablePath(ne)))))),R.releaseRoots.size>0&&h.createElement(h.Fragment,null,h.createElement(A,{marginTop:1},h.createElement(p,{wrap:\"wrap\"},\"Because of those files having been modified, the following workspaces may need to be released again (note that private workspaces are also shown here, because even though they won't be published, releasing them will allow us to flag their dependents for potential re-release):\")),g.size>3?h.createElement(A,{marginTop:1},h.createElement(ae,{workspaces:R.releaseRoots,releases:de})):null,h.createElement(A,{marginTop:1,flexDirection:\"column\"},h.createElement(o,{active:me%2===0,radius:1,size:2,onFocusRequest:Ae},[...R.releaseRoots].map(ne=>h.createElement(U,{key:ne.cwd,workspace:ne,decision:de.get(ne)||\"undecided\",setDecision:Z=>Be(ne,Z)}))))),g.size>0?h.createElement(h.Fragment,null,h.createElement(A,{marginTop:1},h.createElement(p,{wrap:\"wrap\"},\"The following workspaces depend on other workspaces that have been marked for release, and thus may need to be released as well:\")),h.createElement(A,null,h.createElement(p,null,\"(Press \",h.createElement(p,{bold:!0,color:\"cyanBright\"},\"<tab>\"),\" to move the focus between the workspace groups.)\")),g.size>5?h.createElement(A,{marginTop:1},h.createElement(ae,{workspaces:g,releases:de})):null,h.createElement(A,{marginTop:1,flexDirection:\"column\"},h.createElement(o,{active:me%2===1,radius:2,size:2,onFocusRequest:Ae},[...g].map(ne=>h.createElement(U,{key:ne.cwd,workspace:ne,decision:de.get(ne)||\"undecided\",setDecision:Z=>Be(ne,Z)}))))):null)},{versionFile:R},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof ce>\"u\")return 1;R.releases.clear();for(let[Ce,de]of ce)R.releases.set(Ce,de);await R.saveAll()}async executeStandard(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd);if(!a)throw new sr(o.cwd,this.context.cwd);return await o.restoreInstallState(),(await Rt.start({configuration:r,stdout:this.context.stdout},async u=>{let A=await KC(o);if(A===null||A.releaseRoots.size===0)return;if(A.root===null)throw new st(\"This command can only be run on Git repositories\");if(u.reportInfo(0,`Your PR was started right after ${pe.pretty(r,A.baseHash.slice(0,7),\"yellow\")} ${pe.pretty(r,A.baseTitle,\"magenta\")}`),A.changedFiles.size>0){u.reportInfo(0,\"You have changed the following files since then:\"),u.reportSeparator();for(let v of A.changedFiles)u.reportInfo(null,`${pe.pretty(r,ue.fromPortablePath(A.root),\"gray\")}${ue.sep}${ue.relative(ue.fromPortablePath(A.root),ue.fromPortablePath(v))}`)}let p=!1,h=!1,E=JQ(A);if(E.size>0){p||u.reportSeparator();for(let v of E)u.reportError(0,`${G.prettyLocator(r,v.anchoredLocator)} has been modified but doesn't have a release strategy attached`);p=!0}let I=Pv(A);for(let[v,x]of I)h||u.reportSeparator(),u.reportError(0,`${G.prettyLocator(r,v.anchoredLocator)} doesn't have a release strategy attached, but depends on ${G.prettyWorkspace(r,x)} which is planned for release.`),h=!0;(p||h)&&(u.reportSeparator(),u.reportInfo(0,\"This command detected that at least some workspaces have received modifications without explicit instructions as to how they had to be released (if needed).\"),u.reportInfo(0,\"To correct these errors, run `yarn version check --interactive` then follow the instructions.\"))})).exitCode()}};Ge();qt();var $Q=Ze(Jn());var XC=class extends ut{constructor(){super(...arguments);this.deferred=ge.Boolean(\"-d,--deferred\",{description:\"Prepare the version to be bumped during the next release cycle\"});this.immediate=ge.Boolean(\"-i,--immediate\",{description:\"Bump the version immediately\"});this.strategy=ge.String()}static{this.paths=[[\"version\"]]}static{this.usage=it.Usage({category:\"Release-related commands\",description:\"apply a new version to the current package\",details:\"\\n      This command will bump the version number for the given package, following the specified strategy:\\n\\n      - If `major`, the first number from the semver range will be increased (`X.0.0`).\\n      - If `minor`, the second number from the semver range will be increased (`0.X.0`).\\n      - If `patch`, the third number from the semver range will be increased (`0.0.X`).\\n      - If prefixed by `pre` (`premajor`, ...), a `-0` suffix will be set (`0.0.0-0`).\\n      - If `prerelease`, the suffix will be increased (`0.0.0-X`); the third number from the semver range will also be increased if there was no suffix in the previous version.\\n      - If `decline`, the nonce will be increased for `yarn version check` to pass without version bump.\\n      - If a valid semver range, it will be used as new version.\\n      - If unspecified, Yarn will ask you for guidance.\\n\\n      For more information about the `--deferred` flag, consult our documentation (https://yarnpkg.com/features/release-workflow#deferred-versioning).\\n    \",examples:[[\"Immediately bump the version to the next major\",\"yarn version major\"],[\"Prepare the version to be bumped to the next major\",\"yarn version major --deferred\"]]})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd);if(!a)throw new sr(o.cwd,this.context.cwd);let n=r.get(\"preferDeferredVersions\");this.deferred&&(n=!0),this.immediate&&(n=!1);let u=$Q.default.valid(this.strategy),A=this.strategy===\"decline\",p;if(u)if(a.manifest.version!==null){let E=q5(a.manifest.version,this.strategy);E!==null?p=E:p=this.strategy}else p=this.strategy;else{let E=a.manifest.version;if(!A){if(E===null)throw new st(\"Can't bump the version if there wasn't a version to begin with - use 0.0.0 as initial version then run the command again.\");if(typeof E!=\"string\"||!$Q.default.valid(E))throw new st(`Can't bump the version (${E}) if it's not valid semver`)}p=YC(this.strategy)}if(!n){let I=(await Dv(o)).get(a);if(typeof I<\"u\"&&p!==\"decline\"){let v=XQ(a.manifest.version,p);if($Q.default.lt(v,I))throw new st(`Can't bump the version to one that would be lower than the current deferred one (${I})`)}}let h=await KC(o,{allowEmpty:!0});return h.releases.set(a,p),await h.saveAll(),n?0:await this.cli.run([\"version\",\"apply\"])}};var rPt={configuration:{deferredVersionFolder:{description:\"Folder where are stored the versioning files\",type:\"ABSOLUTE_PATH\",default:\"./.yarn/versions\"},preferDeferredVersions:{description:\"If true, running `yarn version` will assume the `--deferred` flag unless `--immediate` is set\",type:\"BOOLEAN\",default:!1}},commands:[zC,JC,XC]},nPt=rPt;var Y5={};Vt(Y5,{WorkspacesFocusCommand:()=>ZC,WorkspacesForeachCommand:()=>ew,default:()=>oPt});Ge();Ge();qt();var ZC=class extends ut{constructor(){super(...arguments);this.json=ge.Boolean(\"--json\",!1,{description:\"Format the output as an NDJSON stream\"});this.production=ge.Boolean(\"--production\",!1,{description:\"Only install regular dependencies by omitting dev dependencies\"});this.all=ge.Boolean(\"-A,--all\",!1,{description:\"Install the entire project\"});this.workspaces=ge.Rest()}static{this.paths=[[\"workspaces\",\"focus\"]]}static{this.usage=it.Usage({category:\"Workspace-related commands\",description:\"install a single workspace and its dependencies\",details:\"\\n      This command will run an install as if the specified workspaces (and all other workspaces they depend on) were the only ones in the project. If no workspaces are explicitly listed, the active one will be assumed.\\n\\n      Note that this command is only very moderately useful when using zero-installs, since the cache will contain all the packages anyway - meaning that the only difference between a full install and a focused install would just be a few extra lines in the `.pnp.cjs` file, at the cost of introducing an extra complexity.\\n\\n      If the `-A,--all` flag is set, the entire project will be installed. Combine with `--production` to replicate the old `yarn install --production`.\\n    \"})}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd),n=await Gr.find(r);await o.restoreInstallState({restoreResolutions:!1});let u;if(this.all)u=new Set(o.workspaces);else if(this.workspaces.length===0){if(!a)throw new sr(o.cwd,this.context.cwd);u=new Set([a])}else u=new Set(this.workspaces.map(A=>o.getWorkspaceByIdent(G.parseIdent(A))));for(let A of u)for(let p of this.production?[\"dependencies\"]:Ut.hardDependencies)for(let h of A.manifest.getForScope(p).values()){let E=o.tryWorkspaceByDescriptor(h);E!==null&&u.add(E)}for(let A of o.workspaces)u.has(A)?this.production&&A.manifest.devDependencies.clear():(A.manifest.installConfig=A.manifest.installConfig||{},A.manifest.installConfig.selfReferences=!1,A.manifest.dependencies.clear(),A.manifest.devDependencies.clear(),A.manifest.peerDependencies.clear(),A.manifest.scripts.clear());return await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n,persistProject:!1})}};Ge();Ge();Ge();qt();var $C=Ze($o()),XBe=Ze(eg());el();var ew=class extends ut{constructor(){super(...arguments);this.from=ge.Array(\"--from\",{description:\"An array of glob pattern idents or paths from which to base any recursion\"});this.all=ge.Boolean(\"-A,--all\",{description:\"Run the command on all workspaces of a project\"});this.recursive=ge.Boolean(\"-R,--recursive\",{description:\"Run the command on the current workspace and all of its recursive dependencies\"});this.worktree=ge.Boolean(\"-W,--worktree\",{description:\"Run the command on all workspaces of the current worktree\"});this.verbose=ge.Counter(\"-v,--verbose\",{description:\"Increase level of logging verbosity up to 2 times\"});this.parallel=ge.Boolean(\"-p,--parallel\",!1,{description:\"Run the commands in parallel\"});this.interlaced=ge.Boolean(\"-i,--interlaced\",!1,{description:\"Print the output of commands in real-time instead of buffering it\"});this.jobs=ge.String(\"-j,--jobs\",{description:\"The maximum number of parallel tasks that the execution will be limited to; or `unlimited`\",validator:IT([Js([\"unlimited\"]),jw(wT(),[vT(),BT(1)])])});this.topological=ge.Boolean(\"-t,--topological\",!1,{description:\"Run the command after all workspaces it depends on (regular) have finished\"});this.topologicalDev=ge.Boolean(\"--topological-dev\",!1,{description:\"Run the command after all workspaces it depends on (regular + dev) have finished\"});this.include=ge.Array(\"--include\",[],{description:\"An array of glob pattern idents or paths; only matching workspaces will be traversed\"});this.exclude=ge.Array(\"--exclude\",[],{description:\"An array of glob pattern idents or paths; matching workspaces won't be traversed\"});this.publicOnly=ge.Boolean(\"--no-private\",{description:\"Avoid running the command on private workspaces\"});this.since=ge.String(\"--since\",{description:\"Only include workspaces that have been changed since the specified ref.\",tolerateBoolean:!0});this.dryRun=ge.Boolean(\"-n,--dry-run\",{description:\"Print the commands that would be run, without actually running them\"});this.commandName=ge.String();this.args=ge.Proxy()}static{this.paths=[[\"workspaces\",\"foreach\"]]}static{this.usage=it.Usage({category:\"Workspace-related commands\",description:\"run a command on all workspaces\",details:\"\\n      This command will run a given sub-command on current and all its descendant workspaces. Various flags can alter the exact behavior of the command:\\n\\n      - If `-p,--parallel` is set, the commands will be ran in parallel; they'll by default be limited to a number of parallel tasks roughly equal to half your core number, but that can be overridden via `-j,--jobs`, or disabled by setting `-j unlimited`.\\n\\n      - If `-p,--parallel` and `-i,--interlaced` are both set, Yarn will print the lines from the output as it receives them. If `-i,--interlaced` wasn't set, it would instead buffer the output from each process and print the resulting buffers only after their source processes have exited.\\n\\n      - If `-t,--topological` is set, Yarn will only run the command after all workspaces that it depends on through the `dependencies` field have successfully finished executing. If `--topological-dev` is set, both the `dependencies` and `devDependencies` fields will be considered when figuring out the wait points.\\n\\n      - If `-A,--all` is set, Yarn will run the command on all the workspaces of a project.\\n\\n      - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\\n\\n      - If `-W,--worktree` is set, Yarn will find workspaces to run the command on by looking at the current worktree.\\n\\n      - If `--from` is set, Yarn will use the packages matching the 'from' glob as the starting point for any recursive search.\\n\\n      - If `--since` is set, Yarn will only run the command on workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\\n\\n      - If `--dry-run` is set, Yarn will explain what it would do without actually doing anything.\\n\\n      - The command may apply to only some workspaces through the use of `--include` which acts as a whitelist. The `--exclude` flag will do the opposite and will be a list of packages that mustn't execute the script. Both flags accept glob patterns (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\\n\\n      The `-v,--verbose` flag can be passed up to twice: once to prefix output lines with the originating workspace's name, and again to include start/finish/timing log lines. Maximum verbosity is enabled by default in terminal environments.\\n\\n      If the command is `run` and the script being run does not exist the child workspace will be skipped without error.\\n    \",examples:[[\"Publish all packages\",\"yarn workspaces foreach -A npm publish --tolerate-republish\"],[\"Run the build script on all descendant packages\",\"yarn workspaces foreach -A run build\"],[\"Run the build script on current and all descendant packages in parallel, building package dependencies first\",\"yarn workspaces foreach -Apt run build\"],[\"Run the build script on several packages and all their dependencies, building dependencies first\",\"yarn workspaces foreach -Rpt --from '{workspace-a,workspace-b}' run build\"]]})}static{this.schema=[Yw(\"all\",Yu.Forbids,[\"from\",\"recursive\",\"since\",\"worktree\"],{missingIf:\"undefined\"}),DT([\"all\",\"recursive\",\"since\",\"worktree\"],{missingIf:\"undefined\"})]}async execute(){let r=await Ke.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await kt.find(r,this.context.cwd);if(!this.all&&!a)throw new sr(o.cwd,this.context.cwd);await o.restoreInstallState();let n=this.cli.process([this.commandName,...this.args]),u=n.path.length===1&&n.path[0]===\"run\"&&typeof n.scriptName<\"u\"?n.scriptName:null;if(n.path.length===0)throw new st(\"Invalid subcommand name for iteration - use the 'run' keyword if you wish to execute a script\");let A=Ee=>{this.dryRun&&this.context.stdout.write(`${Ee}\n`)},p=()=>{let Ee=this.from.map(g=>$C.default.matcher(g));return o.workspaces.filter(g=>{let me=G.stringifyIdent(g.anchoredLocator),we=g.relativeCwd;return Ee.some(Ae=>Ae(me)||Ae(we))})},h=[];if(this.since?(A(\"Option --since is set; selecting the changed workspaces as root for workspace selection\"),h=Array.from(await ia.fetchChangedWorkspaces({ref:this.since,project:o}))):this.from?(A(\"Option --from is set; selecting the specified workspaces\"),h=[...p()]):this.worktree?(A(\"Option --worktree is set; selecting the current workspace\"),h=[a]):this.recursive?(A(\"Option --recursive is set; selecting the current workspace\"),h=[a]):this.all&&(A(\"Option --all is set; selecting all workspaces\"),h=[...o.workspaces]),this.dryRun&&!this.all){for(let Ee of h)A(`\n- ${Ee.relativeCwd}\n  ${G.prettyLocator(r,Ee.anchoredLocator)}`);h.length>0&&A(\"\")}let E;if(this.recursive?this.since?(A(\"Option --recursive --since is set; recursively selecting all dependent workspaces\"),E=new Set(h.map(Ee=>[...Ee.getRecursiveWorkspaceDependents()]).flat())):(A(\"Option --recursive is set; recursively selecting all transitive dependencies\"),E=new Set(h.map(Ee=>[...Ee.getRecursiveWorkspaceDependencies()]).flat())):this.worktree?(A(\"Option --worktree is set; recursively selecting all nested workspaces\"),E=new Set(h.map(Ee=>[...Ee.getRecursiveWorkspaceChildren()]).flat())):E=null,E!==null&&(h=[...new Set([...h,...E])],this.dryRun))for(let Ee of E)A(`\n- ${Ee.relativeCwd}\n  ${G.prettyLocator(r,Ee.anchoredLocator)}`);let I=[],v=!1;if(u?.includes(\":\")){for(let Ee of o.workspaces)if(Ee.manifest.scripts.has(u)&&(v=!v,v===!1))break}for(let Ee of h){if(u&&!Ee.manifest.scripts.has(u)&&!v&&!(await An.getWorkspaceAccessibleBinaries(Ee)).has(u)){A(`Excluding ${Ee.relativeCwd} because it doesn't have a \"${u}\" script`);continue}if(!(u===r.env.npm_lifecycle_event&&Ee.cwd===a.cwd)){if(this.include.length>0&&!$C.default.isMatch(G.stringifyIdent(Ee.anchoredLocator),this.include)&&!$C.default.isMatch(Ee.relativeCwd,this.include)){A(`Excluding ${Ee.relativeCwd} because it doesn't match the --include filter`);continue}if(this.exclude.length>0&&($C.default.isMatch(G.stringifyIdent(Ee.anchoredLocator),this.exclude)||$C.default.isMatch(Ee.relativeCwd,this.exclude))){A(`Excluding ${Ee.relativeCwd} because it matches the --include filter`);continue}if(this.publicOnly&&Ee.manifest.private===!0){A(`Excluding ${Ee.relativeCwd} because it's a private workspace and --no-private was set`);continue}I.push(Ee)}}if(this.dryRun)return 0;let x=this.verbose??(this.context.stdout.isTTY?1/0:0),C=x>0,R=x>1,L=this.parallel?this.jobs===\"unlimited\"?1/0:Number(this.jobs)||Math.ceil(Xi.availableParallelism()/2):1,U=L===1?!1:this.parallel,z=U?this.interlaced:!0,te=(0,XBe.default)(L),ae=new Map,le=new Set,ce=0,Ce=null,de=!1,Be=await Rt.start({configuration:r,stdout:this.context.stdout,includePrefix:!1},async Ee=>{let g=async(me,{commandIndex:we})=>{if(de)return-1;!U&&R&&we>1&&Ee.reportSeparator();let Ae=iPt(me,{configuration:r,label:C,commandIndex:we}),[ne,Z]=JBe(Ee,{prefix:Ae,interlaced:z}),[xe,Ne]=JBe(Ee,{prefix:Ae,interlaced:z});try{R&&Ee.reportInfo(null,`${Ae?`${Ae} `:\"\"}Process started`);let ht=Date.now(),H=await this.cli.run([this.commandName,...this.args],{cwd:me.cwd,stdout:ne,stderr:xe})||0;ne.end(),xe.end(),await Z,await Ne;let rt=Date.now();if(R){let Te=r.get(\"enableTimers\")?`, completed in ${pe.pretty(r,rt-ht,pe.Type.DURATION)}`:\"\";Ee.reportInfo(null,`${Ae?`${Ae} `:\"\"}Process exited (exit code ${H})${Te}`)}return H===130&&(de=!0,Ce=H),H}catch(ht){throw ne.end(),xe.end(),await Z,await Ne,ht}};for(let me of I)ae.set(me.anchoredLocator.locatorHash,me);for(;ae.size>0&&!Ee.hasErrors();){let me=[];for(let[ne,Z]of ae){if(le.has(Z.anchoredDescriptor.descriptorHash))continue;let xe=!0;if(this.topological||this.topologicalDev){let Ne=this.topologicalDev?new Map([...Z.manifest.dependencies,...Z.manifest.devDependencies]):Z.manifest.dependencies;for(let ht of Ne.values()){let H=o.tryWorkspaceByDescriptor(ht);if(xe=H===null||!ae.has(H.anchoredLocator.locatorHash),!xe)break}}if(xe&&(le.add(Z.anchoredDescriptor.descriptorHash),me.push(te(async()=>{let Ne=await g(Z,{commandIndex:++ce});return ae.delete(ne),le.delete(Z.anchoredDescriptor.descriptorHash),Ne})),!U))break}if(me.length===0){let ne=Array.from(ae.values()).map(Z=>G.prettyLocator(r,Z.anchoredLocator)).join(\", \");Ee.reportError(3,`Dependency cycle detected (${ne})`);return}let Ae=(await Promise.all(me)).find(ne=>ne!==0);Ce===null&&(Ce=typeof Ae<\"u\"?1:Ce),(this.topological||this.topologicalDev)&&typeof Ae<\"u\"&&Ee.reportError(0,\"The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph\")}});return Ce!==null?Ce:Be.exitCode()}};function JBe(t,{prefix:e,interlaced:r}){let o=t.createStreamReporter(e),a=new He.DefaultStream;a.pipe(o,{end:!1}),a.on(\"finish\",()=>{o.end()});let n=new Promise(A=>{o.on(\"finish\",()=>{A(a.active)})});if(r)return[a,n];let u=new He.BufferStream;return u.pipe(a,{end:!1}),u.on(\"finish\",()=>{a.end()}),[u,n]}function iPt(t,{configuration:e,commandIndex:r,label:o}){if(!o)return null;let n=`[${G.stringifyIdent(t.anchoredLocator)}]:`,u=[\"#2E86AB\",\"#A23B72\",\"#F18F01\",\"#C73E1D\",\"#CCE2A3\"],A=u[r%u.length];return pe.pretty(e,n,A)}var sPt={commands:[ZC,ew]},oPt=sPt;var Hy=()=>({modules:new Map([[\"@yarnpkg/cli\",W1],[\"@yarnpkg/core\",Y1],[\"@yarnpkg/fslib\",kw],[\"@yarnpkg/libzip\",p1],[\"@yarnpkg/parsers\",Ow],[\"@yarnpkg/shell\",E1],[\"clipanion\",Jw],[\"semver\",aPt],[\"typanion\",Vo],[\"@yarnpkg/plugin-essentials\",K8],[\"@yarnpkg/plugin-compat\",Z8],[\"@yarnpkg/plugin-constraints\",dH],[\"@yarnpkg/plugin-dlx\",mH],[\"@yarnpkg/plugin-exec\",CH],[\"@yarnpkg/plugin-file\",IH],[\"@yarnpkg/plugin-git\",W8],[\"@yarnpkg/plugin-github\",DH],[\"@yarnpkg/plugin-http\",PH],[\"@yarnpkg/plugin-init\",bH],[\"@yarnpkg/plugin-interactive-tools\",kq],[\"@yarnpkg/plugin-link\",Qq],[\"@yarnpkg/plugin-nm\",hj],[\"@yarnpkg/plugin-npm\",f5],[\"@yarnpkg/plugin-npm-cli\",w5],[\"@yarnpkg/plugin-pack\",a5],[\"@yarnpkg/plugin-patch\",S5],[\"@yarnpkg/plugin-pnp\",rj],[\"@yarnpkg/plugin-pnpm\",Q5],[\"@yarnpkg/plugin-stage\",O5],[\"@yarnpkg/plugin-typescript\",U5],[\"@yarnpkg/plugin-version\",G5],[\"@yarnpkg/plugin-workspace-tools\",Y5]]),plugins:new Set([\"@yarnpkg/plugin-essentials\",\"@yarnpkg/plugin-compat\",\"@yarnpkg/plugin-constraints\",\"@yarnpkg/plugin-dlx\",\"@yarnpkg/plugin-exec\",\"@yarnpkg/plugin-file\",\"@yarnpkg/plugin-git\",\"@yarnpkg/plugin-github\",\"@yarnpkg/plugin-http\",\"@yarnpkg/plugin-init\",\"@yarnpkg/plugin-interactive-tools\",\"@yarnpkg/plugin-link\",\"@yarnpkg/plugin-nm\",\"@yarnpkg/plugin-npm\",\"@yarnpkg/plugin-npm-cli\",\"@yarnpkg/plugin-pack\",\"@yarnpkg/plugin-patch\",\"@yarnpkg/plugin-pnp\",\"@yarnpkg/plugin-pnpm\",\"@yarnpkg/plugin-stage\",\"@yarnpkg/plugin-typescript\",\"@yarnpkg/plugin-version\",\"@yarnpkg/plugin-workspace-tools\"])});function eve({cwd:t,pluginConfiguration:e}){let r=new Jo({binaryLabel:\"Yarn Package Manager\",binaryName:\"yarn\",binaryVersion:nn??\"<unknown>\"});return Object.assign(r,{defaultContext:{...Jo.defaultContext,cwd:t,plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr}})}function lPt(t){if(He.parseOptionalBoolean(process.env.YARN_IGNORE_NODE))return!0;let r=process.versions.node,o=\">=18.12.0\";if(Lr.satisfiesWithPrereleases(r,o))return!0;let a=new st(`This tool requires a Node version compatible with ${o} (got ${r}). Upgrade Node, or set \\`YARN_IGNORE_NODE=1\\` in your environment.`);return Jo.defaultContext.stdout.write(t.error(a)),!1}async function tve({selfPath:t,pluginConfiguration:e}){return await Ke.find(ue.toPortablePath(process.cwd()),e,{strict:!1,usePathCheck:t})}function cPt(t,e,{yarnPath:r}){if(!oe.existsSync(r))return t.error(new Error(`The \"yarn-path\" option has been set, but the specified location doesn't exist (${r}).`)),1;process.on(\"SIGINT\",()=>{});let o={stdio:\"inherit\",env:{...process.env,YARN_IGNORE_PATH:\"1\"}};try{(0,ZBe.execFileSync)(process.execPath,[ue.fromPortablePath(r),...e],o)}catch(a){return a.status??1}return 0}function uPt(t,e){let r=null,o=e;return e.length>=2&&e[0]===\"--cwd\"?(r=ue.toPortablePath(e[1]),o=e.slice(2)):e.length>=1&&e[0].startsWith(\"--cwd=\")?(r=ue.toPortablePath(e[0].slice(6)),o=e.slice(1)):e[0]===\"add\"&&e[e.length-2]===\"--cwd\"&&(r=ue.toPortablePath(e[e.length-1]),o=e.slice(0,e.length-2)),t.defaultContext.cwd=r!==null?V.resolve(r):V.cwd(),o}function APt(t,{configuration:e}){if(!e.get(\"enableTelemetry\")||$Be.isCI||!process.stdout.isTTY)return;Ke.telemetry=new Oy(e,\"puba9cdc10ec5790a2cf4969dd413a47270\");let o=/^@yarnpkg\\/plugin-(.*)$/;for(let a of e.plugins.keys())Uy.has(a.match(o)?.[1]??\"\")&&Ke.telemetry?.reportPluginName(a);t.binaryVersion&&Ke.telemetry.reportVersion(t.binaryVersion)}function rve(t,{configuration:e}){for(let r of e.plugins.values())for(let o of r.commands||[])t.register(o)}async function fPt(t,e,{selfPath:r,pluginConfiguration:o}){if(!lPt(t))return 1;let a=await tve({selfPath:r,pluginConfiguration:o}),n=a.get(\"yarnPath\"),u=a.get(\"ignorePath\");if(n&&!u)return cPt(t,e,{yarnPath:n});delete process.env.YARN_IGNORE_PATH;let A=uPt(t,e);APt(t,{configuration:a}),rve(t,{configuration:a});let p=t.process(A,t.defaultContext);return p.help||Ke.telemetry?.reportCommandName(p.path.join(\" \")),await t.run(p,t.defaultContext)}async function ihe({cwd:t=V.cwd(),pluginConfiguration:e=Hy()}={}){let r=eve({cwd:t,pluginConfiguration:e}),o=await tve({pluginConfiguration:e,selfPath:null});return rve(r,{configuration:o}),r}async function Wx(t,{cwd:e=V.cwd(),selfPath:r,pluginConfiguration:o}){let a=eve({cwd:e,pluginConfiguration:o});function n(){Jo.defaultContext.stdout.write(`ERROR: Yarn is terminating due to an unexpected empty event loop.\nPlease report this issue at https://github.com/yarnpkg/berry/issues.`)}process.once(\"beforeExit\",n);try{process.exitCode=42,process.exitCode=await fPt(a,t,{selfPath:r,pluginConfiguration:o})}catch(u){Jo.defaultContext.stdout.write(a.error(u)),process.exitCode=1}finally{process.off(\"beforeExit\",n),await oe.rmtempPromise()}}Wx(process.argv.slice(2),{cwd:V.cwd(),selfPath:ue.toPortablePath(ue.resolve(process.argv[1])),pluginConfiguration:Hy()});})();\n/**\n  @license\n  Copyright (c) 2015, Rebecca Turner\n\n  Permission to use, copy, modify, and/or distribute this software for any\n  purpose with or without fee is hereby granted, provided that the above\n  copyright notice and this permission notice appear in all copies.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\n  REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND\n  FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\n  INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\n  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\n  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\n  PERFORMANCE OF THIS SOFTWARE.\n */\n/**\n  @license\n  Copyright Node.js contributors. All rights reserved.\n\n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to\n  deal in the Software without restriction, including without limitation the\n  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n  sell copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n  IN THE SOFTWARE.\n*/\n/**\n  @license\n  The MIT License (MIT)\n\n  Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)\n\n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n*/\n/**\n  @license\n  Copyright Joyent, Inc. and other Node contributors.\n\n  Permission is hereby granted, free of charge, to any person obtaining a\n  copy of this software and associated documentation files (the\n  \"Software\"), to deal in the Software without restriction, including\n  without limitation the rights to use, copy, modify, merge, publish,\n  distribute, sublicense, and/or sell copies of the Software, and to permit\n  persons to whom the Software is furnished to do so, subject to the\n  following conditions:\n\n  The above copyright notice and this permission notice shall be included\n  in all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n  NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n  DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n  OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n  USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n/*! Bundled license information:\n\nis-number/index.js:\n  (*!\n   * is-number <https://github.com/jonschlinkert/is-number>\n   *\n   * Copyright (c) 2014-present, Jon Schlinkert.\n   * Released under the MIT License.\n   *)\n\nto-regex-range/index.js:\n  (*!\n   * to-regex-range <https://github.com/micromatch/to-regex-range>\n   *\n   * Copyright (c) 2015-present, Jon Schlinkert.\n   * Released under the MIT License.\n   *)\n\nfill-range/index.js:\n  (*!\n   * fill-range <https://github.com/jonschlinkert/fill-range>\n   *\n   * Copyright (c) 2014-present, Jon Schlinkert.\n   * Licensed under the MIT License.\n   *)\n\nis-extglob/index.js:\n  (*!\n   * is-extglob <https://github.com/jonschlinkert/is-extglob>\n   *\n   * Copyright (c) 2014-2016, Jon Schlinkert.\n   * Licensed under the MIT License.\n   *)\n\nis-glob/index.js:\n  (*!\n   * is-glob <https://github.com/jonschlinkert/is-glob>\n   *\n   * Copyright (c) 2014-2017, Jon Schlinkert.\n   * Released under the MIT License.\n   *)\n\nqueue-microtask/index.js:\n  (*! queue-microtask. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> *)\n\nrun-parallel/index.js:\n  (*! run-parallel. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> *)\n\ngit-url-parse/lib/index.js:\n  (*!\n   * buildToken\n   * Builds OAuth token prefix (helper function)\n   *\n   * @name buildToken\n   * @function\n   * @param {GitUrl} obj The parsed Git url object.\n   * @return {String} token prefix\n   *)\n\nobject-assign/index.js:\n  (*\n  object-assign\n  (c) Sindre Sorhus\n  @license MIT\n  *)\n\nreact/cjs/react.production.min.js:\n  (** @license React v16.13.1\n   * react.production.min.js\n   *\n   * Copyright (c) Facebook, Inc. and its affiliates.\n   *\n   * This source code is licensed under the MIT license found in the\n   * LICENSE file in the root directory of this source tree.\n   *)\n\nscheduler/cjs/scheduler.production.min.js:\n  (** @license React v0.18.0\n   * scheduler.production.min.js\n   *\n   * Copyright (c) Facebook, Inc. and its affiliates.\n   *\n   * This source code is licensed under the MIT license found in the\n   * LICENSE file in the root directory of this source tree.\n   *)\n\nreact-reconciler/cjs/react-reconciler.production.min.js:\n  (** @license React v0.24.0\n   * react-reconciler.production.min.js\n   *\n   * Copyright (c) Facebook, Inc. and its affiliates.\n   *\n   * This source code is licensed under the MIT license found in the\n   * LICENSE file in the root directory of this source tree.\n   *)\n\nis-windows/index.js:\n  (*!\n   * is-windows <https://github.com/jonschlinkert/is-windows>\n   *\n   * Copyright © 2015-2018, Jon Schlinkert.\n   * Released under the MIT License.\n   *)\n*/\n"
  },
  {
    "path": ".yarnrc.yml",
    "content": "compressionLevel: mixed\n\nenableGlobalCache: false\n\nnodeLinker: node-modules\n\nyarnPath: .yarn/releases/yarn-4.5.0.cjs\n"
  },
  {
    "path": "CLAUDE.md",
    "content": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## Repository Overview\n\n`react-native-audio-api` is a high-performance Web Audio API-compatible audio engine for React Native, maintained by Software Mansion. It provides audio playback, recording, DSP processing, and real-time analysis across iOS, Android, and Web.\n\n## Architecture\n\n### Monorepo Structure\n```\npackages/react-native-audio-api/   # Main library\napps/common-app/                   # Example RN app\napps/fabric-example/               # New Architecture example app\npackages/audiodocs/                # Documentation\npackages/custom-node-generator/    # Code generation tooling\n```\n\n### Layers (from JS to hardware)\n\n1. **TypeScript API** (`src/`) — node implementations (`src/core/`), browser passthrough (`src/web-core/`), platform system APIs (`src/system/`), TurboModule specs (`src/specs/`), hooks, events, utils\n2. **C++ Engine** (`common/cpp/audioapi/`) — node engine (`core/`), SIMD DSP (`dsp/`), JSI HostObjects, audio events, prebuilt external libraries (`external/`)\n3. **Android Native** (`android/`) — CMake + Gradle, Kotlin module, C++ JNI glue (`src/main/cpp/`), Oboe 1.9.3 audio I/O\n4. **iOS Native** (`ios/audioapi/ios/`) — Objective-C++ (`.mm`), CocoaPods (`RNAudioAPI.podspec`), CoreAudio I/O\n\n### Key Architectural Patterns\n- **JSI**: Audio nodes are exposed as C++ JSI HostObjects — no bridge serialization\n- **Audio Thread Safety**: Real-time audio processing happens on a dedicated audio thread; JS-side calls must not block it\n- **Dual Platform**: TypeScript code has separate paths for React Native (native engine) and Web (delegates to browser Web Audio API)\n- **New Architecture Ready**: Supports both old Bridge and new TurboModules/Fabric\n- **Optional FFmpeg**: Audio decoding via FFmpeg can be conditionally compiled out\n- **Audio Worklets**: JavaScript runs on the audio thread via React Native Worklets\n\n### Native Module Entry Points\n- iOS: `ios/audioapi/ios/AudioAPIModule.mm`\n- Android: `android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt`\n- TurboModule spec: `src/specs/NativeAudioAPIModule.ts`\n\n## Web Resources\n\nThe following URLs can be fetched without approval and are useful during development:\n\n| URL | When to use |\n|---|---|\n| https://webaudio.github.io/web-audio-api/ | Web Audio API W3C spec — parameter defaults, processing semantics, error conditions |\n| https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API | MDN — friendlier spec reference, examples |\n| https://en.cppreference.com/ | C++ standard library reference — containers, algorithms, atomics, memory model |\n| https://reactnative.dev/docs/the-new-architecture/pure-cxx-modules | RN New Architecture — TurboModules, JSI, fbjni patterns |\n\nFetch these proactively when implementing a new node (to check spec compliance), when using an unfamiliar C++ stdlib class, or when working on the TurboModule / JSI installation layer.\n\n## Autonomous Parallelization\n\nClaude MUST decide independently whether to parallelize work and run subagents — do not wait for the user to ask. Default to parallel execution whenever tasks are independent.\n\n**Web research**: When a task requires fetching or summarizing content from multiple URLs, or searching for information across multiple topics, launch parallel `general-purpose` or `Explore` subagents — one per source/topic. Each agent fetches, filters, and returns only the relevant excerpt. Never fetch URLs sequentially when they are independent.\n\n**Codebase exploration**: When investigating a bug or implementing a feature that spans multiple layers (TypeScript + HostObject + C++ node + iOS + Android), launch parallel `Explore` agents to read each layer simultaneously rather than reading files one by one.\n\n**Skill updates**: When `pre-push-update` identifies multiple skill files to review, use parallel background agents to update them simultaneously.\n\nThe user expects Claude to make these parallelization decisions without being prompted. Spawning a subagent costs less than waiting for sequential work.\n\n## Golden Reference Implementations\n\nWhen implementing anything new, mirror structure and style from these proven files. Ask the agent to explain any intentional deviation.\n\n| Task | Reference file(s) |\n|---|---|\n| New C++ effect/analysis node | `common/cpp/audioapi/core/effects/GainNode.h` + `.cpp` |\n| New JSI HostObject | `common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.h` + `.cpp` |\n| New scheduled source node | `common/cpp/audioapi/core/sources/OscillatorNode.h` + `.cpp` |\n| New TypeScript API class | `packages/react-native-audio-api/src/core/GainNode.ts` |\n\n---\n\n## Skills\n\nDetailed skill files live in `.claude/skills/`. Each skill lives in its own directory as `<name>/SKILL.md` and is auto-loaded by Claude Code based on YAML frontmatter trigger phrases. Consult the relevant skill before starting work in that area.\n\n| Skill directory | Domain |\n|---|---|\n| `host-objects/` | C++ JSI HostObject layer — creating and maintaining HostObjects |\n| `audio-nodes/` | C++ audio node engine — implementing and connecting audio nodes |\n| `turbo-modules/` | TurboModule/JSI wiring — spec → native → HostObject installation |\n| `web-audio-api/` | Web Audio API spec conformance and browser passthrough layer |\n| `build-compilation-dependencies/` | CMake, Gradle, podspec, prebuilt libraries |\n| `thread-safety-itc/` | Audio thread safety, lock-free patterns, event system |\n| `post-work-checks/` | Ordered checklist to run after every change |\n| `flow/` | End-to-end feature implementation flow (tests + docs required) |\n| `utilities/` | Shared DSP and C++/TS utility helpers |\n| `writing-skills/` | How to write, structure, and maintain skill files |\n\nSee `.claude/README.md` for a full description of the Claude Code setup and the `/pre-push-update` command.\n\n## Self-Modification Instructions\n\nAfter completing any task, Claude MUST review whether any of the following apply and make the appropriate edits if so:\n\n1. **New pattern discovered**: If a fix or investigation revealed a non-obvious pattern, invariant, or pitfall that is not yet documented in the relevant skill file, add a concise note to that skill file.\n\n2. **Inconsistency found**: If a path, folder, or file mentioned in this CLAUDE.md or any skill file does not actually exist, correct the reference. If an important path exists in the repo but is not mentioned anywhere, add it to the relevant skill file or to this file.\n\n3. **Outdated information**: If something described here contradicts reality (wrong command, moved file, renamed module), update it immediately — do not leave a known-wrong description in place.\n\n4. **Skill gaps**: If work required knowledge that is not covered by any skill file, note it in the closest matching skill file or propose a new one.\n\n5. **Skill quality issues**: When reading or modifying a skill file and noticing any of the following, fix them immediately — do not leave known-bad skill files in place:\n   - Missing `Trigger phrases: \"...\"` label in the `description` (skill will not auto-load without it)\n   - Cross-references using `.md` suffix (e.g. `audio-nodes.md`) instead of bare skill name (e.g. `audio-nodes`)\n   - Stale cross-references to renamed or moved files\n   - A skill body that exceeds 500 lines without moving verbose content to a supporting file\n\nThe goal is that these files stay accurate and grow more useful over time through incremental updates from real work, not just manual maintenance.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\n## Development\n\nTo contribute by resolving already opened issues, please follow these steps:\n\n1. Fork the repository to your own GitHub account.\n2. Create a new branch for your feature or bug fix.\n3. Stage your changes and commit them. (Follow [Conventional Commit Specification](https://www.conventionalcommits.org/en/v1.0.0/))\n4. Submit PR for review.\n\nAfter your pull request is submitted, we will review it at as soon as possible.\nWe may suggest changes or request additional improvements, so please enable\n[Allow edits from maintainers](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork)\non your PR.\n\n**Contributing by implementing your own feature should be preceded by design doc. It can be any kind of document describing all important api and implementation details.**\n\n## Reporting Issues and Feature Requests\n\nIf you encounter any bug, please report it [here](https://github.com/software-mansion/react-native-audio-api/issues/new?template=bug_report.yaml).\n\nFor feature requests, please submit them [here](https://github.com/software-mansion/react-native-audio-api/issues/new?template=feature_request.yaml). You can also create a [discussion](https://github.com/software-mansion/react-native-audio-api/discussions) first to talk about your idea or join existing one.\n\n\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2024 Software Mansion\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "<img src=\"./assets/react-native-audio-api-gh-cover.png?v0.0.1\" alt=\"React Native Audio API\" width=\"100%\">\n\n[![Ad](https://swm-delivery.com/www/images/zone-gh-react-native-audio-api-1?n=1)](https://swm-delivery.com/www/delivery/ck.php?zoneid=zone-gh-react-native-audio-api-1&n=1)\n[![Ad](https://swm-delivery.com/www/images/zone-gh-react-native-audio-api-2?n=1)](https://swm-delivery.com/www/delivery/ck.php?zoneid=zone-gh-react-native-audio-api-2&n=1)\n[![Ad](https://swm-delivery.com/www/images/zone-gh-react-native-audio-api-3?n=1)](https://swm-delivery.com/www/delivery/ck.php?zoneid=zone-gh-react-native-audio-api-3&n=1)\n\n### High-performance audio engine for React Native based on web audio api specification\n\n[![NPM latest](https://img.shields.io/npm/v/react-native-audio-api/latest)](https://www.npmjs.com/package/react-native-audio-api)\n[![NPM nightly](https://img.shields.io/npm/v/react-native-audio-api/audio-api-nightly)](https://www.npmjs.com/package/react-native-audio-api?activeTab=versions)\n<br />\n[![github ci](https://github.com/software-mansion/react-native-audio-api/actions/workflows/ci.yml/badge.svg)](https://github.com/software-mansion/react-native-audio-api/actions/workflows/ci.yml)\n[![Audio Api tests](https://github.com/software-mansion/react-native-audio-api/actions/workflows/tests.yml/badge.svg)](https://github.com/software-mansion/react-native-audio-api/actions/workflows/tests.yml)\n\n`react-native-audio-api` provides system for controlling audio in React Native environment compatible with Web Audio API specification,\nallowing developers to generate and modify audio in exact same way it is possible in browsers.\n\n## Installation\n\ncheck out the [Getting Started](https://docs.swmansion.com/react-native-audio-api/docs/fundamentals/getting-started) section of our documentation for detailed instructions!\n\n## Roadmap\n\n### Planned\n\n### <img src=\"https://img.shields.io/badge/Coming_in-x.x.x-orange\" />\n\n- **DynamicCompressorNode 〽️**<br />\n  Reduce the volume of loud sounds and boost quieter nodes to balance the audio signal, avoid clipping or distorted sounds\n\n- **MIDI support 🎸**<br />\n  Complementary lib for react-native-audio-api, that will allow to communicate with MIDI devices or read/write MIDI files.\n\n- **Spatial Audio 🛢️**<br />\n  manipulate audio in 3D space\n\n- **Noise Cancellation 🦇**<br />\n  System-based active noise and echo cancellation support\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.12.0\"><img src=\"https://img.shields.io/badge/Released_in-0.12.0-green\" /></a>\n\n- **Audio tag 🏷️**<br />\n  Simple ability to play and buffer audio, with all of the most commonly used functions, same as on the web, without the need to create and manipulate an audio graph.\n\n- **Recording rotation 🎤**<br />\n  Ability to chunk your recording into smaller files, increasing resilience to unpredictable events.\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.11.0\"><img src=\"https://img.shields.io/badge/Released_in-0.11.0-green\" /></a>\n\n- **Recording to file 📼**<br />\n  Fully customizable recording to a file. Choose a file format, quality and other parameters. Fully integrated with the audio graph.\n\n- **Playback and recording notification system 🔔**<br />\n  Control playback and recording from the notification center / lock screen and create custom notification layouts.\n\n- **Wave Shaper Node 🎸**<br />\n  Create custom nonlinear distortion effects. No need to buy guitar pedals anymore!\n\n- **IIR Filter Node 🧪**<br />\n  Implement custom digital filters using feedforward and feedback coefficients.\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.10.0\"><img src=\"https://img.shields.io/badge/Released_in-0.10.0-green\" /></a>\n\n- **Decoding and utility modules 🔧**<br />\n  Decode and modify audio data without the need to create AudioContext first through a set of utility classes\n\n- **Convolver Node 🐐**<br />\n  Realistic reverb and spatial effects in the browser by applying impulse responses. It makes audio sound like it’s being played in real spaces, from small rooms to cathedrals, or through hardware like amps and speakers\n\n- **JS Audio Worklets V2 🐎**<br />\n  Customize the process pipeline with JS functions running on audio thread.\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.9.0\"><img src=\"https://img.shields.io/badge/Released_in-0.9.0-green\" /></a>\n\n- **JS Audio Worklets V1 🐎**<br />\n  Receive events and data callbacks from audio thread to synchronize with UI on UI thread.\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.8.0\"><img src=\"https://img.shields.io/badge/Released_in-0.8.0-green\" /></a>\n\n- **Decoding support for m4a/mp4/aac/ogg/opus 📁** <br />\n  Decode m4a/mp4/aac/ogg/opus audio files, allowing for playback of these formats in the audio graph.\n\n- **HLS streaming support** 🌊 <br />\n  Stream audio from HLS sources, allowing for playback of live audio streams or pre-recorded audio files.\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.7.0\"><img src=\"https://img.shields.io/badge/Released_in-0.7.0-green\" /></a>\n\n- **Microphone support 🎙️** <br />\n  Grab audio data from device microphone or connected device, connect it to the audio graph or stream through the internet.\n\n- **Custom Audio Processor ⚙️** <br />\n  Write your own processing AudioNode.\n\nSee more in [Changelog](./ghdocs/changelog.md)\n\n## Web Audio API Specification Coverage\n\nOur current coverage of Web Audio API specification can be found here: [Web Audio API coverage](https://docs.swmansion.com/react-native-audio-api/docs/other/web-audio-api-coverage).\n\n## Examples\n\nThe source code for the example application is under the [`/apps/common-app`](./apps/common-app/) directory. If you want to play with the API but don't feel like trying it on a real app, you can run the example project. Check [Example README](./apps/fabric-example/README.md) for installation instructions.\n\n## Your feedback\n\nWe are open to new ideas and general feedback. If you want to share your opinion about `react-native-audio-api` or have some thoughts about how it could be further developed, don't hesitate to create an issue or contact the maintainers directly.\n\n## License\n\nreact-native-audio-api library is licensed under [The MIT License](./LICENSE). Some of the source code uses implementation directly copied from Webkit and utilizes FFmpeg binaries. Copyrights are held by respective organizations, check [THIRD_PARTY](./THIRD_PARTY.md) file for further details.\n\n## Credits\n\nThis project has been built and is maintained thanks to the support from [Software Mansion](https://swmansion.com)\n\n[![swm](https://logo.swmansion.com/logo?color=white&variant=desktop&width=150&tag=react-native-reanimated-github 'Software Mansion')](https://swmansion.com)\n\n## Community Discord\n\n<a href=\"https://discord.swmansion.com\" target=\"_blank\" rel=\"noopener noreferrer\">Join the Software Mansion Community Discord</a> to chat about React Native Audio API or other Software Mansion libraries.\n\n## react-native-audio-api is created by Software Mansion\n\nSince 2012 [Software Mansion](https://swmansion.com) is a software agency with experience in building web and mobile apps. We are Core React Native Contributors and experts in dealing with all kinds of React Native issues. We can help you build your next dream product – [Hire us](https://swmansion.com/contact/projects?utm_source=audioapi&utm_medium=readme).\n"
  },
  {
    "path": "THIRD_PARTY.md",
    "content": "This project contains source code copied from Webkit implementation, which mixes BSD 2 clause and BSD 3 clause with copyrights in specific files held by the following organizations:\n\n- Google Inc.\n- Apple Inc.\n\nIndividual files retain the original copyright notice, but not the full license text.\n\nWebKit, 2 Clause BSD\nCopyright (c) The WebKit Authors\n[https://github.com/WebKit/webkit](https://github.com/WebKit/webkit)\n\nWebKit, 3 Clause BSD\nCopyright (c) The WebKit Authors\n[https://github.com/WebKit/webkit](https://github.com/WebKit/webkit)\n\nIn addition we utilize FFmpeg library under GNU Lesser General Public License (LGPL) version 2.1 or later\n\n- Source: https://github.com/FFmpeg/FFmpeg/releases/tag/n8.0\n- Used in audio processing module [packages/react-native-audio-api/common/cpp/audioapi/core/sources/StreamerNode.cpp](https://github.com/software-mansion/react-native-audio-api/blob/main/packages/react-native-audio-api/common/cpp/audioapi/core/sources/StreamerNode.cpp)\n- Used in audio decoding module [packages/react-native-audio-api/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp](https://github.com/software-mansion/react-native-audio-api/blob/main/packages/react-native-audio-api/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp)\n- Instruction for relinking: [packages/react-native-audio-api/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md](https://github.com/software-mansion/react-native-audio-api/blob/main/packages/react-native-audio-api/common/cpp/audioapi/libs/ffmpeg/INSTRUCTIONS.md)\n\nOther LGPL components may be included as dependencies.\nThe full text of the LGPL license is included in lgplv3 file."
  },
  {
    "path": "apps/CLAUDE.md",
    "content": "# apps/ — Example Applications\n\nThe main example app is `fabric-example` — it uses the New Architecture (TurboModules/Fabric) and serves as the primary manual smoke-test environment for new features.\n\n## Architecture\n\n`fabric-example` is a **thin wrapper**. Almost all code lives in the shared `common-app` workspace:\n\n```\napps/\n├── fabric-example/          # RN app shell (native + metro config)\n│   ├── App.tsx              # Re-exports App from common-app\n│   ├── metro.config.js      # Monorepo-aware Metro (watches workspaces)\n│   └── android/ ios/        # Native projects\n└── common-app/              # Actual app code — edit this\n    └── src/\n        ├── App.tsx           # Navigation root (Stack + Bottom Tabs)\n        ├── examples/         # \"Tests\" tab — focused feature examples\n        │   └── index.ts      # Exports Examples array — register new screens here\n        ├── demos/            # \"Demo Apps\" tab — full mini-apps\n        │   └── index.ts      # Exports demos array — register new screens here\n        ├── components/       # Shared UI: Container, Button, Slider, Spacer, Switch, Select\n        ├── utils/\n        │   ├── soundEngines/ # Reusable synth classes (MetronomeSound, Kick, HiHat, Clap)\n        │   └── usePlayer.tsx # Hook for pattern-based scheduled playback\n        ├── singletons/       # Global audioContext and audioRecorder instances\n        └── styles.ts         # Shared colors and layout constants\n```\n\n## Navigation\n\n```\nBottom Tabs\n├── Tests       → 2-column grid of Examples (simple feature demos)\n├── Demo Apps   → Single-column list of Demos (full mini-apps)\n└── Other       → Placeholder\n```\n\nEach item navigates into a Stack screen. No manual stack registration needed — `examples/index.ts` and `demos/index.ts` drive it automatically.\n\n## Adding a New Example (Tests tab)\n\nExamples are focused single-feature demos (Oscillator, Metronome, AudioFile...).\n\n### 1. Create the screen\n\n```\napps/common-app/src/examples/MyExample/\n├── index.ts          # re-export default\n└── MyExample.tsx     # the screen component\n```\n\n```ts\n// index.ts\nexport { default } from './MyExample';\n```\n\n```tsx\n// MyExample.tsx\nimport React, { useEffect, useRef, FC } from 'react';\nimport { AudioContext, GainNode } from 'react-native-audio-api';\nimport { Container, Button, Slider } from '../../components';\n\nconst MyExample: FC = () => {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n\n  useEffect(() => {\n    audioContextRef.current = new AudioContext();\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <Container centered>\n      {/* UI here */}\n    </Container>\n  );\n};\n\nexport default MyExample;\n```\n\n### 2. Register in the index\n\n```ts\n// apps/common-app/src/examples/index.ts\nimport MyExample from './MyExample';\nimport { icons } from 'lucide-react-native';  // pick any icon\n\nexport const Examples = [\n  // ... existing\n  {\n    key: 'MyExample',\n    title: 'My Example',\n    Icon: icons.Zap,\n    screen: MyExample,\n  },\n];\n```\n\nDone — the screen appears in the Tests tab automatically.\n\n## Adding a New Demo (Demo Apps tab)\n\nDemos are full mini-apps (PedalBoard, voice memo recorder...).\n\n### 1. Create the screen (same pattern as above)\n\n```\napps/common-app/src/demos/MyDemo/\n└── MyDemo.tsx\n```\n\n### 2. Register in the index\n\n```ts\n// apps/common-app/src/demos/index.ts\nimport MyDemo from './MyDemo/MyDemo';\n\nexport const demos = [\n  // ... existing\n  {\n    key: 'MyDemo',\n    title: 'My Demo',\n    subtitle: 'One-line description shown in the list.',\n    icon: icons.Guitar,\n    screen: MyDemo,\n  },\n];\n```\n\n## Code Patterns\n\n### Core rule: use `useRef` for audio nodes, `useState` for UI\n\nAudio nodes are C++ objects — they must not be re-created on every render.\n\n```tsx\n// ✅ Correct\nconst gainRef = useRef<GainNode | null>(null);\n\n// ❌ Wrong — re-creates the node on every render\nconst [gain, setGain] = useState<GainNode | null>(null);\n```\n\n### Standard screen skeleton\n\n```tsx\nconst MyExample: FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [volume, setVolume] = useState(1.0);\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n\n  // Initialize audio context once\n  useEffect(() => {\n    audioContextRef.current = new AudioContext();\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  // Real-time parameter update\n  const handleVolumeChange = (value: number) => {\n    setVolume(value);\n    if (gainRef.current) {\n      gainRef.current.gain.value = value;\n    }\n  };\n\n  return (\n    <Container centered>\n      <Button\n        title={isPlaying ? 'Stop' : 'Play'}\n        onPress={() => setIsPlaying((p) => !p)}\n      />\n      <Slider\n        label=\"Volume\"\n        min={0} max={1} step={0.01}\n        value={volume}\n        onValueChange={handleVolumeChange}\n      />\n    </Container>\n  );\n};\n```\n\n### File playback pattern\n\nUse a singleton helper class to avoid managing node lifecycle inside the component:\n\n```tsx\n// AudioPlayer.ts\nclass AudioPlayer {\n  private ctx = new AudioContext();\n  private buffer: AudioBuffer | null = null;\n\n  async load(asset: string | number) {\n    this.buffer = await this.ctx.decodeAudioData(asset);\n  }\n\n  play() {\n    const src = this.ctx.createBufferSource();\n    src.buffer = this.buffer;\n    src.connect(this.ctx.destination);\n    src.start();\n  }\n}\nexport default new AudioPlayer();\n```\n\n### Pattern-based scheduling (Metronome, DrumMachine)\n\nUse the shared `usePlayer` hook + a `SoundEngine` class:\n\n```tsx\nimport usePlayer from '../../utils/usePlayer';\nimport MetronomeSound from '../../utils/soundEngines/MetronomeSound';\n\nfunction setupPlayer(ctx: AudioContext) {\n  const sound = new MetronomeSound(ctx, 1000);\n  return {\n    playNote: (name: string, time: number) => sound.play(time),\n  };\n}\n\nconst player = usePlayer({ bpm, patterns, numBeats, setup: setupPlayer });\n// player.play() / player.stop() / player.isPlaying\n```\n\nUse `react-native-background-timer` (not `setTimeout`) for scheduling — it continues running when the screen is locked.\n\n### Effects chain (PedalBoard pattern)\n\nSub-components receive `inputNode` / `outputNode` and wire their effect in between:\n\n```tsx\n// Parent\nconst inputNode = ctx.createGain();\nconst outputNode = ctx.createGain();\ninputNode.connect(outputNode); // bypass by default\n\n// Sub-component (pedal)\nfunction MyPedal({ context, inputNode, outputNode }: PedalProps) {\n  const effectRef = useRef<WaveShaperNode | null>(null);\n\n  const initEffect = () => {\n    if (effectRef.current) return;\n    const ws = context.createWaveShaper();\n    inputNode.disconnect(outputNode); // remove bypass\n    inputNode.connect(ws);\n    ws.connect(outputNode);\n    effectRef.current = ws;\n  };\n  // ...\n}\n```\n\n### iOS audio session (required on device)\n\n```tsx\nimport { AudioManager } from 'react-native-audio-api';\n\nAudioManager.setAudioSessionOptions({\n  iosCategory: 'playback',       // or 'playAndRecord' for mic input\n  iosMode: 'default',\n  iosOptions: [],\n});\nawait AudioManager.setAudioSessionActivity(true);\n```\n\n### Recording permission\n\n```tsx\nconst status = await AudioManager.requestRecordingPermissions();\nif (status !== 'Granted') return;\n```\n\n### Interruption handling\n\n```tsx\nuseEffect(() => {\n  const sub = AudioManager.addSystemEventListener('interruption', (event) => {\n    if (event.type === 'began') pause();\n  });\n  return () => sub?.remove();\n}, []);\n```\n\n## Shared UI Components\n\nAll in `apps/common-app/src/components/`:\n\n| Component | Props |\n|---|---|\n| `Container` | `centered?: boolean` — wraps screen in `SafeAreaView` |\n| `Button` | `title`, `onPress`, `disabled?` |\n| `Slider` | `label`, `min`, `max`, `step`, `value`, `onValueChange` |\n| `VerticalSlider` | same as Slider, vertical orientation |\n| `Spacer.Vertical` | `size` |\n| `Switch` | `label`, `value`, `onValueChange` |\n| `Select` | `label`, `options`, `value`, `onValueChange` |\n\n## Metro Config Notes\n\n`fabric-example/metro.config.js` sets `watchFolders: [monorepoRoot, appsRoot]` so Metro hot-reloads changes in `common-app` and `packages/react-native-audio-api` without restarting.\n\nIf you add a new workspace package that the app depends on, add its root to `watchFolders`.\n"
  },
  {
    "path": "apps/common-app/.eslintrc.js",
    "content": "module.exports = {\n  root: true,\n  extends: '@react-native',\n};\n"
  },
  {
    "path": "apps/common-app/index.ts",
    "content": "import App from './src/App';\n\nexport default App;\n"
  },
  {
    "path": "apps/common-app/package.json",
    "content": "{\n  \"name\": \"common-app\",\n  \"version\": \"0.0.1\",\n  \"private\": true,\n  \"peerDependencies\": {\n    \"react\": \"*\",\n    \"react-native\": \"*\"\n  },\n  \"dependencies\": {\n    \"@react-navigation/bottom-tabs\": \"^7.8.7\",\n    \"@react-navigation/native\": \"^7.1.22\",\n    \"@react-navigation/native-stack\": \"^7.3.28\",\n    \"@react-navigation/stack\": \"^7.4.10\",\n    \"@shopify/react-native-skia\": \"2.6.2\",\n    \"lucide-react-native\": \"^0.555.0\",\n    \"react-native-audio-api\": \"workspace:*\",\n    \"react-native-background-timer\": \"2.4.1\",\n    \"react-native-gesture-handler\": \"2.31.1\",\n    \"react-native-reanimated\": \"4.3.0\",\n    \"react-native-safe-area-context\": \"5.7.0\",\n    \"react-native-screens\": \"4.24.0\",\n    \"react-native-svg\": \"15.15.4\",\n    \"react-native-worklets\": \"0.8.1\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.25.2\",\n    \"@babel/preset-env\": \"^7.25.2\",\n    \"@babel/runtime\": \"^7.25.0\",\n    \"@react-native-community/cli\": \"20.1.0\",\n    \"@react-native-community/cli-platform-android\": \"20.1.0\",\n    \"@react-native-community/cli-platform-ios\": \"20.1.0\",\n    \"@react-native/babel-preset\": \"0.85.0\",\n    \"@react-native/eslint-config\": \"0.85.0\",\n    \"@react-native/metro-config\": \"0.85.0\",\n    \"@react-native/typescript-config\": \"0.85.0\",\n    \"@types/jest\": \"^29.5.13\",\n    \"@types/react\": \"^19.2.0\",\n    \"@types/react-native-background-timer\": \"^2.0.2\",\n    \"@types/react-test-renderer\": \"^19.1.0\",\n    \"eslint\": \"^8.57.0\",\n    \"jest\": \"^29.6.3\",\n    \"prettier\": \"^3.3.3\",\n    \"react\": \"19.2.3\",\n    \"react-native\": \"0.85.0\",\n    \"react-test-renderer\": \"19.2.3\",\n    \"typescript\": \"~5.8.3\"\n  }\n}\n"
  },
  {
    "path": "apps/common-app/prettier.config.js",
    "content": "/** @type {import('prettier').Config} */\nmodule.exports = {\n  plugins: [\"prettier-plugin-jsdoc\"],\n  bracketSameLine: false,\n  printWidth: 80,\n  singleQuote: true,\n  trailingComma: \"es5\",\n  tabWidth: 2,\n  arrowParens: \"always\",\n};\n"
  },
  {
    "path": "apps/common-app/scripts/dependencies.js",
    "content": "const path = require('path');\n\n/**\n * @param {Object<string, string>} dependencies\n * @param {Set<string>} exclude\n */\nfunction resolveDependencies(dependencies = {}, exclude) {\n  return Object.fromEntries(\n    Object.keys(dependencies)\n      .filter((name) => !exclude.has(name))\n      .map((name) => [\n        name,\n        { root: path.resolve(__dirname, `../../../node_modules/${name}`) },\n      ])\n  );\n}\n\n/**\n * This function will return the dependencies from the common-app package that\n * aren't listed in the current app's package.json\n *\n * @param {string} currentAppDir - The current app directory (e.g. __dirname)\n * @param {string[]} exclude - The dependencies to exclude from the common-app\n */\nfunction getDependencies(currentAppDir = '.', exclude = []) {\n  const commonAppDir = path.resolve(__dirname, '..');\n  const commonAppPkg = require(path.resolve(commonAppDir, 'package.json'));\n\n  const currentAppPkg = require(path.resolve(currentAppDir, 'package.json'));\n\n  const excludedDependencies = new Set([\n    ...Object.keys(currentAppPkg.devDependencies),\n    ...Object.keys(currentAppPkg.dependencies),\n    ...exclude,\n  ]);\n\n  return {\n    // Get all common-app dependencies that aren't already in the current app\n    ...resolveDependencies(commonAppPkg.devDependencies, excludedDependencies),\n    ...resolveDependencies(commonAppPkg.dependencies, excludedDependencies),\n  };\n}\n\nmodule.exports = {\n  getDependencies,\n};\n"
  },
  {
    "path": "apps/common-app/src/App.tsx",
    "content": "import { NavigationContainer, useNavigation } from '@react-navigation/native';\nimport { createStackNavigator } from '@react-navigation/stack';\nimport { Gauge, ListCheck, Waves } from 'lucide-react-native';\nimport type { FC } from 'react';\nimport React from 'react';\nimport {\n  FlatList,\n  ListRenderItem,\n  Pressable,\n  StyleSheet,\n  Text,\n  View,\n} from 'react-native';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\n\nimport { createBottomTabNavigator } from '@react-navigation/bottom-tabs';\nimport { Spacer } from './components';\nimport Container from './components/Container';\nimport { demos, DemoScreen } from './demos';\nimport { Example, Examples, MainStackProps } from './examples';\nimport { colors, layout } from './styles';\n\nconst Stack = createStackNavigator();\n\nconst TestsScreen: FC = () => {\n  const navigation = useNavigation<MainStackProps>();\n\n  const renderItem: ListRenderItem<Example> = ({\n    item: { Icon, key, title },\n  }) => (\n    <Pressable\n      key={key}\n      style={styles.buttonSmall}\n      onPress={() => navigation.navigate(key)}\n    >\n      <Icon color={colors.white} size={18} />\n      <Text style={styles.titleSmall}>{title}</Text>\n    </Pressable>\n  );\n\n  return (\n    <Container headless>\n      <FlatList\n        data={Examples}\n        renderItem={renderItem}\n        keyExtractor={(item) => item.key}\n        contentContainerStyle={styles.scrollView}\n        ItemSeparatorComponent={ItemSeparatorComponentSmall}\n        numColumns={2}\n      />\n    </Container>\n  );\n};\n\nconst DemoAppsScreen: FC = () => {\n  const navigation = useNavigation<MainStackProps>();\n\n  const renderItem: ListRenderItem<DemoScreen> = ({ item }) => (\n    <Pressable\n      onPress={() => navigation.navigate(item.key)}\n      key={item.key}\n      style={({ pressed }) => [\n        styles.button,\n        { borderStyle: pressed ? 'solid' : 'dashed' },\n      ]}\n    >\n      <item.icon color={colors.white} size={24} />\n      <View style={styles.buttonInner}>\n        <Text style={styles.title}>{item.title}</Text>\n        <Text style={styles.subtitle}>{item.subtitle}</Text>\n      </View>\n    </Pressable>\n  );\n\n  return (\n    <Container headless>\n      <FlatList\n        data={demos}\n        renderItem={renderItem}\n        keyExtractor={(item) => item.key}\n        contentContainerStyle={styles.scrollView}\n        ItemSeparatorComponent={ItemSeparatorComponent}\n      />\n    </Container>\n  );\n};\n\nconst OtherScreen: FC = () => {\n  return <Container headless />;\n};\n\nconst MainTabs = createBottomTabNavigator<MainStackProps>();\n\nconst tabBarIcon = ({\n  routeName,\n  color,\n  size,\n}: {\n  routeName: string;\n  color: string;\n  size: number;\n}) => {\n  if (routeName === 'Tests') {\n    return <ListCheck color={color} size={size} />;\n  } else if (routeName === 'DemoApps') {\n    return <Gauge color={color} size={size} />;\n  } else if (routeName === 'Other') {\n    return <Waves color={color} size={size} />;\n  }\n  return null;\n};\n\nconst MainTabsScreen: FC = () => {\n  return (\n    <MainTabs.Navigator\n      screenOptions={({ route }: { route: { name: string } }) => ({\n        tabBarIcon: ({ color, size }: { color: string; size: number }) =>\n          tabBarIcon({ routeName: route.name, color, size }),\n        tabBarActiveTintColor: '#ff7774',\n        tabBarInactiveTintColor: colors.border,\n        tabBarTransparent: true,\n        tabBarStyle: {\n          backgroundColor: colors.background,\n        },\n        headerShown: false,\n      })}\n    >\n      <MainTabs.Screen\n        name=\"Tests\"\n        component={TestsScreen}\n        options={{\n          title: 'Tests',\n        }}\n      />\n      <MainTabs.Screen\n        name=\"DemoApps\"\n        component={DemoAppsScreen}\n        options={{\n          title: 'Demo Apps',\n        }}\n      />\n      <MainTabs.Screen\n        name=\"Other\"\n        component={OtherScreen}\n        options={{\n          title: 'Other',\n        }}\n      />\n    </MainTabs.Navigator>\n  );\n};\n\nconst App: FC = () => {\n  return (\n    <GestureHandlerRootView style={styles.container}>\n      <NavigationContainer>\n        <Stack.Navigator\n          screenOptions={{\n            headerShown: true,\n            headerTransparent: true,\n            headerStyle: {\n              backgroundColor: 'transparent',\n            },\n            headerTintColor: colors.white,\n            headerBackTitle: 'Back',\n            headerBackAccessibilityLabel: 'Go back',\n          }}>\n          <Stack.Screen\n            name=\"MainTabs\"\n            component={MainTabsScreen}\n            options={{ headerShown: false }}\n          />\n          {Examples.map((item) => (\n            <Stack.Screen\n              key={item.key}\n              name={item.key}\n              component={item.screen}\n              options={{ title: item.title }}\n            />\n          ))}\n          {demos.map((item) => (\n            <Stack.Screen\n              key={item.key}\n              name={item.key}\n              component={item.screen}\n              options={{ title: item.title }}\n            />\n          ))}\n        </Stack.Navigator>\n      </NavigationContainer>\n    </GestureHandlerRootView>\n  );\n};\n\nexport default App;\n\nconst ItemSeparatorComponent = () => <Spacer.Vertical size={16} />;\n\nconst ItemSeparatorComponentSmall = () => (\n  <View>\n    <Spacer.Vertical size={6} />\n    <View style={styles.hr} />\n    <Spacer.Vertical size={6} />\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n  },\n  title: {\n    fontSize: 24,\n    fontWeight: '700',\n    color: colors.white,\n    lineHeight: 24,\n  },\n  subtitle: {\n    opacity: 0.6,\n    color: colors.white,\n  },\n  button: {\n    borderWidth: 2,\n    borderColor: colors.border,\n    borderRadius: layout.radius,\n    paddingVertical: layout.spacing * 2,\n    paddingHorizontal: layout.spacing * 2,\n    flexDirection: 'row',\n    alignItems: 'flex-start',\n    gap: layout.spacing,\n  },\n  buttonInner: {\n    flexShrink: 1,\n  },\n  buttonSmall: {\n    padding: layout.spacing,\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: layout.spacing,\n    width: '48%',\n    margin: '1%',\n    height: 40,\n    borderWidth: StyleSheet.hairlineWidth,\n    borderColor: colors.white,\n  },\n  titleSmall: {\n    fontSize: 16,\n    fontWeight: '600',\n    color: colors.white,\n    marginLeft: 4,\n    flexShrink: 1,\n  },\n  subtitleSmall: {\n    opacity: 0.6,\n    color: colors.white,\n  },\n  scrollView: {},\n  hr: {\n    // height: StyleSheet.hairlineWidth,\n    // // backgroundColor: colors.border,\n    // marginLeft: 60,\n    // marginRight: '35%',\n  },\n  row: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    gap: layout.spacing,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/components/BGGradient.tsx",
    "content": "import { Canvas, RadialGradient, Rect, vec } from '@shopify/react-native-skia';\nimport React, { useCallback, useState } from 'react';\nimport { LayoutChangeEvent, StyleSheet, View } from 'react-native';\n\nimport { colors } from '../styles';\n\nconst BGGradient = () => {\n  const [size, setSize] = useState({ width: 0, height: 0 });\n\n  const onWrapperLayout = useCallback((event: LayoutChangeEvent) => {\n    setSize({\n      width: event.nativeEvent.layout.width,\n      height: event.nativeEvent.layout.height,\n    });\n  }, []);\n\n  return (\n    <View style={styles.wrapper} onLayout={onWrapperLayout}>\n      <Canvas style={styles.canvas}>\n        <Rect x={0} y={0} width={size.width} height={size.height}>\n          <RadialGradient\n            r={size.width / 4}\n            c={vec(size.width / 2, 0)}\n            colors={[colors.backgroundLight, colors.background]}\n          />\n        </Rect>\n      </Canvas>\n    </View>\n  );\n};\n\nexport default BGGradient;\n\nconst styles = StyleSheet.create({\n  wrapper: {\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n  },\n  canvas: {\n    width: '100%',\n    height: '100%',\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/components/Button.tsx",
    "content": "import { FC } from 'react';\nimport { Text, Pressable, StyleSheet } from 'react-native';\n\nimport { colors, layout } from '../styles';\n\ninterface ButtonProps {\n  title: string;\n  onPress: () => void;\n  disabled?: boolean;\n  width?: number;\n}\n\nconst Button: FC<ButtonProps> = ({\n  title,\n  onPress,\n  disabled = false,\n  width = 100,\n}) => {\n  return (\n    <Pressable\n      disabled={disabled}\n      onPress={onPress}\n      style={({ pressed }) => [\n        styles.button,\n        {\n          backgroundColor: pressed ? `${colors.main}88` : colors.main,\n          opacity: disabled ? 0.5 : 1,\n          width: width,\n        },\n      ]}\n    >\n      <Text style={styles.text}>{title}</Text>\n    </Pressable>\n  );\n};\n\nconst styles = StyleSheet.create({\n  button: {\n    padding: layout.spacing,\n    borderRadius: layout.radius,\n  },\n  text: {\n    color: colors.white,\n    textAlign: 'center',\n  },\n});\n\nexport default Button;\n"
  },
  {
    "path": "apps/common-app/src/components/Container.tsx",
    "content": "import React, { PropsWithChildren } from 'react';\nimport { StyleProp, StyleSheet, ViewStyle } from 'react-native';\nimport { SafeAreaView } from 'react-native-safe-area-context';\n\nimport { colors } from '../styles';\n\ntype ContainerProps = PropsWithChildren<{\n  style?: StyleProp<ViewStyle>;\n  centered?: boolean;\n  disablePadding?: boolean;\n  headless?: boolean;\n}>;\n\nconst headerPadding = 120; // eyeballed\n\nconst Container: React.FC<ContainerProps> = (props) => {\n  const { children, style, centered, disablePadding, headless } = props;\n\n  return (\n    <SafeAreaView\n      edges={\n        headless\n          ? ['bottom', 'left', 'right', 'top']\n          : ['bottom', 'left', 'right']\n      }\n      style={[\n        headless ? styles.basicHeadless : styles.basic,\n        centered && styles.centered,\n        !disablePadding && styles.padding,\n        style,\n      ]}\n    >\n      {children}\n    </SafeAreaView>\n  );\n};\n\nexport default Container;\n\nconst styles = StyleSheet.create({\n  basic: {\n    flex: 1,\n    paddingTop: headerPadding,\n    backgroundColor: colors.background,\n  },\n  basicHeadless: {\n    flex: 1,\n    backgroundColor: colors.background,\n    paddingTop: 20,\n  },\n  padding: {\n    paddingHorizontal: 18,\n  },\n  centered: {\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/components/Select.tsx",
    "content": "import React, { useState } from 'react';\nimport { ScrollView } from 'react-native-gesture-handler';\nimport { Modal, View, Text, Pressable, StyleSheet } from 'react-native';\n\nimport withSeparators from '../utils/withSeparators';\nimport { colors } from '../styles';\nimport Spacer from './Spacer';\nimport MenuIcon from './icons/MenuIcon';\nimport CheckCircleIcon from './icons/CheckedCircleIcon';\n\ninterface SelectProps<T extends string> {\n  value: T;\n  options: T[];\n  onChange: (value: T) => void;\n}\n\nfunction Select<T extends string>(props: SelectProps<T>) {\n  const { options, value, onChange } = props;\n  const [isModalOpen, setModalOpen] = useState(false);\n\n  const renderSeparator = (index: number) => (\n    <View key={index} style={styles.separator} />\n  );\n\n  const renderOption = (option: T) => (\n    <Pressable\n      key={option}\n      onPress={() => {\n        onChange(option);\n        setModalOpen(false);\n      }}>\n      <View style={styles.optionRow}>\n        <CheckCircleIcon selected={option === value} color={colors.white} />\n        <Spacer.Horizontal size={12} />\n        <Text style={styles.selectText}>{option}</Text>\n      </View>\n    </Pressable>\n  );\n\n  return (\n    <>\n      <Pressable onPress={() => setModalOpen(true)}>\n        <View style={styles.selectBox}>\n          <Text style={styles.selectText}>{value}</Text>\n          <MenuIcon size={24} color={colors.white} />\n        </View>\n      </Pressable>\n      <Modal visible={isModalOpen} animationType=\"fade\" transparent>\n        <View style={styles.modalBackdrop} />\n        <Pressable\n          style={styles.modalSpacer}\n          onPress={() => {\n            setModalOpen(false);\n          }}\n        />\n        <View style={styles.modalContainer}>\n          <ScrollView>\n            {withSeparators(options, renderSeparator, renderOption)}\n          </ScrollView>\n        </View>\n      </Modal>\n    </>\n  );\n}\n\nexport default Select;\n\nconst styles = StyleSheet.create({\n  selectBox: {\n    borderWidth: 1,\n    borderColor: colors.border,\n    borderRadius: 8,\n    flexDirection: 'row',\n    alignItems: 'center',\n    paddingHorizontal: 12,\n  },\n  selectText: {\n    flex: 1,\n    color: colors.white,\n    fontSize: 16,\n    paddingVertical: 12,\n  },\n  modalBackdrop: {\n    backgroundColor: colors.modalBackdrop,\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n  },\n  modalSpacer: {\n    flex: 3,\n  },\n  modalContainer: {\n    flex: 2,\n    backgroundColor: `${colors.background}ee`,\n    borderTopLeftRadius: 20,\n    borderTopRightRadius: 20,\n    padding: 24,\n  },\n  modalCanvas: {\n    position: 'absolute',\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0,\n  },\n  optionRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n  },\n  separator: {\n    height: 1,\n    backgroundColor: colors.separator,\n    marginHorizontal: 12,\n    marginVertical: 6,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/components/Slider.tsx",
    "content": "import React, { useEffect } from 'react';\nimport {\n  View,\n  Text,\n  TextInput,\n  StyleSheet,\n  LayoutChangeEvent,\n} from 'react-native';\nimport { GestureDetector, Gesture } from 'react-native-gesture-handler';\nimport Animated, {\n  runOnJS,\n  withSpring,\n  useSharedValue,\n  useAnimatedProps,\n  useAnimatedStyle,\n} from 'react-native-reanimated';\n\nimport { colors } from '../styles';\nimport Spacer from './Spacer';\n\ninterface SliderProps {\n  min: number;\n  max: number;\n  step: number;\n\n  value: number;\n  label?: string;\n  minLabelWidth?: number;\n  onValueChange: (value: number) => void;\n}\n\nconst handleSize = 20;\n\nfunction valueToOffset(\n  value: number,\n  sliderWidth: number,\n  min: number,\n  max: number\n): number {\n  'worklet';\n\n  return ((value - min) / (max - min)) * (sliderWidth - handleSize);\n}\n\nfunction offsetToValue(\n  offset: number,\n  sliderWidth: number,\n  min: number,\n  max: number\n): number {\n  'worklet';\n\n  return (offset / (sliderWidth - handleSize)) * (max - min) + min;\n}\n\nfunction roundToStep(value: number, step: number): number {\n  'worklet';\n\n  return Math.round(value / step) * step;\n}\n\nconst AnimatedText = Animated.createAnimatedComponent(TextInput);\n\nconst Slider: React.FC<SliderProps> = (props) => {\n  const { value, onValueChange, min, max, step, label, minLabelWidth } = props;\n\n  const offset = useSharedValue(0);\n  const sValue = useSharedValue(0);\n  const sliderWidth = useSharedValue(0);\n\n  useEffect(() => {\n    offset.value = valueToOffset(value, sliderWidth.value, min, max);\n    sValue.value = value;\n  }, [value, min, max, sliderWidth, offset, sValue]);\n\n  const pan = Gesture.Pan()\n    .onChange((event) => {\n      offset.value = Math.max(\n        0,\n        Math.min(sliderWidth.value - handleSize, offset.value + event.changeX)\n      );\n\n      sValue.value = offsetToValue(offset.value, sliderWidth.value, min, max);\n    })\n    .onEnd(() => {\n      runOnJS(onValueChange)(roundToStep(sValue.value, step));\n    });\n\n  const onSliderLayout = (event: LayoutChangeEvent) => {\n    sliderWidth.value = event.nativeEvent.layout.width;\n\n    offset.value = valueToOffset(\n      value,\n      event.nativeEvent.layout.width,\n      min,\n      max\n    );\n\n    sValue.value = value;\n  };\n\n  const handleStyle = useAnimatedStyle(() => ({\n    transform: [{ translateX: offset.value }],\n  }));\n\n  const fillStyle = useAnimatedStyle(() => ({\n    transform: [\n      { translateX: offset.value + handleSize / 2 - sliderWidth.value },\n    ],\n  }));\n\n  const valueTextProps = useAnimatedProps(() => ({\n    text: `${step < 1 ? roundToStep(sValue.value, step).toFixed(2) : roundToStep(sValue.value, step)}`,\n    defaultValue: `${roundToStep(sValue.value, step)}`,\n  }));\n\n  const valueTextStyle = useAnimatedStyle(() => ({\n    transform: [\n      {\n        translateX: withSpring(\n          sliderWidth.value > 0 && offset.value < 1.5 * handleSize\n            ? 1.5 * handleSize\n            : 0\n        ),\n      },\n    ],\n  }));\n\n  return (\n    <View style={styles.container}>\n      {!!label && (\n        <>\n          <Text\n            style={[\n              styles.label,\n              !!minLabelWidth && { minWidth: minLabelWidth },\n            ]}>\n            {label}\n          </Text>\n          <Spacer.Horizontal size={12} />\n        </>\n      )}\n      <GestureDetector gesture={pan}>\n        <View style={styles.slider} onLayout={onSliderLayout}>\n          <Animated.View style={[styles.fill, fillStyle]} />\n          <AnimatedText\n            editable={false}\n            animatedProps={valueTextProps}\n            style={[styles.valueText, valueTextStyle]}\n          />\n          <Animated.View style={[styles.handle, handleStyle]} />\n        </View>\n      </GestureDetector>\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    flexDirection: 'row',\n  },\n  label: {\n    fontSize: 16,\n    color: colors.white,\n  },\n  slider: {\n    flex: 1,\n    borderWidth: 1,\n    overflow: 'hidden',\n    height: handleSize,\n    borderColor: colors.border,\n    borderRadius: handleSize / 2,\n  },\n  fill: {\n    position: 'absolute',\n    zIndex: -1,\n    width: '100%',\n    marginTop: -1,\n    height: handleSize,\n    borderRadius: handleSize / 2,\n    backgroundColor: colors.main,\n  },\n  valueText: {\n    fontSize: 16,\n    fontWeight: '600',\n    color: colors.white,\n    position: 'absolute',\n    left: 0,\n    right: 0,\n    top: 0,\n    bottom: 0,\n    paddingLeft: 12,\n  },\n  handle: {\n    marginTop: -1,\n    marginLeft: -1,\n    width: handleSize,\n    height: handleSize,\n    borderColor: colors.border,\n    borderRadius: handleSize / 2,\n    backgroundColor: colors.white,\n  },\n});\n\nexport default Slider;\n"
  },
  {
    "path": "apps/common-app/src/components/Spacer.tsx",
    "content": "import { FC } from 'react';\nimport { View } from 'react-native';\n\ninterface SpacerProps {\n  size: number;\n}\n\nconst Vertical: FC<SpacerProps> = ({ size }) => {\n  return <View style={{ height: size }} />;\n};\n\nconst Horizontal: FC<SpacerProps> = ({ size }) => {\n  return <View style={{ width: size }} />;\n};\n\nexport default { Vertical, Horizontal };\n"
  },
  {
    "path": "apps/common-app/src/components/Switch.tsx",
    "content": "import React, { type FC } from 'react';\nimport { StyleSheet, Pressable } from 'react-native';\nimport Animated, {\n  useAnimatedStyle,\n  withSpring,\n  withTiming,\n} from 'react-native-reanimated';\n\nimport { colors } from '../styles';\n\ninterface SwitchProps {\n  value: boolean;\n  onValueChange: (value: boolean) => void;\n}\n\nconst size = 24;\n\nconst Switch: FC<SwitchProps> = (props) => {\n  const { value, onValueChange } = props;\n\n  const onPress = () => {\n    onValueChange(!value);\n  };\n\n  const containerStyle = useAnimatedStyle(() => ({\n    backgroundColor: withTiming(value ? colors.main : colors.gray),\n  }));\n\n  const handleStyle = useAnimatedStyle(() => ({\n    transform: [\n      {\n        translateX: withSpring(value ? size : 0),\n      },\n    ],\n  }));\n\n  return (\n    <Pressable onPress={onPress}>\n      <Animated.View style={[styles.container, containerStyle]}>\n        <Animated.View\n          collapsable={false}\n          style={[styles.handle, handleStyle]}\n        />\n      </Animated.View>\n    </Pressable>\n  );\n};\n\nexport default Switch;\n\nconst styles = StyleSheet.create({\n  container: {\n    height: size,\n    width: 2 * size,\n    alignItems: 'center',\n    flexDirection: 'row',\n    padding: size * 0.1,\n    borderRadius: size / 2,\n  },\n  handle: {\n    width: size * 0.8,\n    height: size * 0.8,\n    borderRadius: size / 2,\n    backgroundColor: colors.white,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/components/VerticalSlider.tsx",
    "content": "import React, { useEffect } from 'react';\nimport { View, Text, StyleSheet, TextInput } from 'react-native';\nimport { GestureDetector, Gesture } from 'react-native-gesture-handler';\nimport Animated, {\n  useSharedValue,\n  useAnimatedStyle,\n  withSpring,\n  useAnimatedProps,\n} from 'react-native-reanimated';\nimport { runOnJS } from 'react-native-reanimated';\nimport { scheduleOnRN } from 'react-native-worklets';\n\nconst SLIDER_HEIGHT = 100;\nconst THUMB_SIZE = 30;\nconst TRACK_HEIGHT = SLIDER_HEIGHT - THUMB_SIZE;\n\nconst AText = Animated.createAnimatedComponent(TextInput);\n\ninterface VerticalSliderProps {\n  label: string;\n  value: number;\n  labelColor?: string;\n  valueColor?: string;\n  onValueChange: (val: number) => void;\n  possibleValues?: number[];\n}\n\nconst VerticalSlider: React.FC<VerticalSliderProps> = ({\n  label,\n  value,\n  labelColor = '#333',\n  valueColor = '#555',\n  onValueChange,\n  possibleValues\n}) => {\n  const progress = useSharedValue(value);\n  const startValue = useSharedValue(0);\n\n  useEffect(() => {\n    progress.value = withSpring(value);\n  }, [value, progress]);\n\n  const findClosestValue = (currentValue: number): number => {\n    'worklet';\n    if (!possibleValues || possibleValues.length === 0) {\n      return currentValue;\n    }\n\n    let closest = possibleValues[0];\n    let minDistance = Math.abs(currentValue - closest);\n\n    for (const possibleValue of possibleValues) {\n      const distance = Math.abs(currentValue - possibleValue);\n      if (distance < minDistance) {\n        minDistance = distance;\n        closest = possibleValue;\n      }\n    }\n\n    return closest;\n  };\n\n  const handleValueChange = (val: number) => {\n    onValueChange(val);\n  };\n\n  const gesture = Gesture.Pan()\n    .onStart(() => {\n      startValue.value = progress.value;\n    })\n    .onUpdate((e) => {\n      const change = -e.translationY / TRACK_HEIGHT;\n      const newValue = startValue.value + change;\n      const clampedValue = Math.min(Math.max(newValue, 0), 1);\n      progress.value = clampedValue;\n    })\n    .onEnd(() => {\n      if (possibleValues && possibleValues.length > 0) {\n        const snappedValue = findClosestValue(progress.value);\n        progress.value = withSpring(snappedValue);\n        scheduleOnRN(handleValueChange, snappedValue);\n      } else {\n        const finalValue = Math.min(Math.max(progress.value, 0), 1);\n        scheduleOnRN(handleValueChange, finalValue);\n      }\n    });\n\n  const thumbStyle = useAnimatedStyle(() => {\n    const translateY = (1 - progress.value) * TRACK_HEIGHT;\n    return {\n      transform: [{ translateY }],\n    };\n  });\n\n  const renderTickMarks = () => {\n    if (!possibleValues || possibleValues.length === 0) {\n      return null;\n    }\n\n    return possibleValues.map((val, index) => {\n      const position = (1 - val) * TRACK_HEIGHT + THUMB_SIZE / 2;\n      return (\n        <View\n          key={index}\n          style={[\n            styles.tickMark,\n            {\n              top: position, // Center the tick mark\n            },\n          ]}\n        />\n      );\n    });\n  };\n\n  const displayProps = useAnimatedProps(() => {\n    if (possibleValues && possibleValues.length > 0) {\n      return {\n        defaultValue: '',\n        text: '',\n      };\n    }\n\n    return {\n      defaultValue: (value * 100).toString(),\n      text: (progress.value * 100).toFixed(0),\n    };\n  });\n\n  return (\n    <View style={styles.sliderContainer}>\n      <Text style={[styles.sliderLabel, { color: labelColor }]}>{label}</Text>\n      <View style={styles.sliderTrackContainer}>\n        <View style={styles.sliderTrack} />\n        {renderTickMarks()}\n        <GestureDetector gesture={gesture}>\n          <Animated.View style={[styles.sliderThumbHitArea, thumbStyle]}>\n            <View style={styles.sliderThumb} />\n          </Animated.View>\n        </GestureDetector>\n      </View>\n      <AText style={[styles.sliderValue, { color: valueColor }]} editable={false} animatedProps={displayProps} />\n      {/* <Text style={[styles.sliderValue, { color: valueColor }]}>\n        {getDisplayValue()}\n      </Text> */}\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  sliderContainer: {\n    alignItems: 'center',\n    gap: 5,\n    height: SLIDER_HEIGHT + 40,\n  },\n  sliderLabel: {\n    fontWeight: 'bold',\n    fontSize: 12,\n  },\n  sliderTrackContainer: {\n    width: 40,\n    height: SLIDER_HEIGHT,\n    justifyContent: 'center',\n    alignItems: 'center',\n    position: 'relative',\n  },\n  sliderTrack: {\n    position: 'absolute',\n    width: 4,\n    height: '100%',\n    backgroundColor: '#111',\n    borderRadius: 2,\n  },\n  tickMark: {\n    position: 'absolute',\n    width: 12,\n    height: 2,\n    backgroundColor: '#fff',\n    borderRadius: 1,\n    left: '50%',\n    marginLeft: -6, // Center horizontally\n  },\n  sliderThumbHitArea: {\n    position: 'absolute',\n    top: 0,\n    width: 40,\n    height: THUMB_SIZE,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  sliderThumb: {\n    width: 30,\n    height: 15,\n    backgroundColor: '#222',\n    borderWidth: 1,\n    borderColor: '#fff',\n    borderRadius: 2,\n    shadowColor: '#000',\n    shadowOffset: { width: 0, height: 2 },\n    shadowOpacity: 0.5,\n    shadowRadius: 2,\n  },\n  sliderValue: {\n    fontSize: 10,\n    fontVariant: ['tabular-nums'],\n  },\n});\n\nexport default VerticalSlider;\n"
  },
  {
    "path": "apps/common-app/src/components/icons/CheckedCircleIcon.tsx",
    "content": "import React from 'react';\nimport Svg, { Circle, Path } from 'react-native-svg';\n\ntype Props = {\n  selected: boolean;\n  size?: number;\n  color?: string;\n};\n\nconst CheckCircleIcon: React.FC<Props> = ({ selected, size = 24, color = '#FFFFFF' }) => {\n  return (\n    <Svg width={size} height={size} viewBox=\"0 0 24 24\" fill=\"none\">\n      <Circle cx=\"12\" cy=\"12\" r=\"10\" stroke={color} strokeWidth=\"2\" fill=\"none\" />\n      {selected ?\n        <Path\n          d=\"M16 8L10.5 14L8 11.5\"\n          stroke={color}\n          strokeWidth=\"2\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n        />\n        : null}\n    </Svg>\n  );\n};\n\nexport default CheckCircleIcon;\n"
  },
  {
    "path": "apps/common-app/src/components/icons/MenuIcon.tsx",
    "content": "import React from 'react';\nimport Svg, { Line } from 'react-native-svg';\n\ntype Props = {\n  size?: number;\n  color?: string;\n};\n\nconst MenuIcon: React.FC<Props> = ({ size = 24, color = '#FFFFFF' }) => {\n  const strokeWidth = 2;\n  const spacing = size / 4;\n  const linesY = [spacing, size / 2, size - spacing];\n\n  return (\n    <Svg width={size} height={size} viewBox={`0 0 ${size} ${size}`} fill=\"none\">\n      {linesY.map((y, index) => (\n        <Line\n          key={index}\n          x1={0}\n          y1={y}\n          x2={size}\n          y2={y}\n          stroke={color}\n          strokeWidth={strokeWidth}\n          strokeLinecap=\"round\"\n        />\n      ))}\n    </Svg>\n  );\n};\n\nexport default MenuIcon;\n"
  },
  {
    "path": "apps/common-app/src/components/icons/PlayPauseIcon.tsx",
    "content": "import React from 'react';\nimport { View } from 'react-native';\nimport Svg, { Path, Rect } from 'react-native-svg';\n\ntype Props = {\n  isPlaying: boolean;\n  size?: number;\n  color?: string;\n};\n\nconst PlayPauseIcon: React.FC<Props> = ({\n  isPlaying = true,\n  size = 48,\n  color = '#FFFFFF',\n}) => {\n  return (\n    <View>\n      <Svg width={size} height={size} viewBox=\"0 0 64 64\" fill=\"none\">\n        {isPlaying ? (\n          <>\n            <Rect x=\"16\" y=\"12\" width=\"10\" height=\"40\" rx=\"2\" fill={color} />\n            <Rect x=\"38\" y=\"12\" width=\"10\" height=\"40\" rx=\"2\" fill={color} />\n          </>\n        ) : (\n          <Path d=\"M18 12L52 32L18 52V12Z\" fill={color} />\n        )}\n      </Svg>\n    </View>\n  );\n};\n\nexport default PlayPauseIcon;\n"
  },
  {
    "path": "apps/common-app/src/components/index.ts",
    "content": "export { default as Button } from './Button';\nexport { default as Slider } from './Slider';\nexport { default as Spacer } from './Spacer';\nexport { default as Switch } from './Switch';\nexport { default as Select } from './Select';\nexport { default as Container } from './Container';\nexport { default as BGGradient } from './BGGradient';\nexport { default as VerticalSlider } from './VerticalSlider';\n"
  },
  {
    "path": "apps/common-app/src/demos/Crossfade/Crossfade.tsx",
    "content": "import React, { FC, useCallback, useEffect, useState, useRef } from 'react';\nimport {\n  AudioBuffer,\n  AudioManager,\n  AudioBufferSourceNode,\n  GainNode,\n  AudioContext,\n} from 'react-native-audio-api';\nimport {\n  StyleSheet,\n  Text,\n  View,\n  Image,\n  ActivityIndicator,\n  Dimensions,\n  Pressable,\n} from 'react-native';\nimport { GestureDetector, Gesture } from 'react-native-gesture-handler';\nimport Animated, {\n  useSharedValue,\n  useAnimatedStyle,\n  useAnimatedReaction,\n  withSpring,\n} from 'react-native-reanimated';\nimport { Heart, SkipBack, SkipForward } from 'lucide-react-native';\nimport { scheduleOnRN } from 'react-native-worklets';\n\nimport { Container, Spacer } from '../../components';\nimport PlayPauseIcon from '../../components/icons/PlayPauseIcon';\nimport { colors } from '../../styles';\n\nconst ARTWORK_SIZE = Dimensions.get('window').width * 0.7;\nconst TILE_OFFSET = 60;\nconst TILE_DISTANCE = ARTWORK_SIZE + TILE_OFFSET;\nconst MAX_GAIN = 0.5;\n\nconst TRACKS = [\n  { title: 'Up-Beat', cover: require('./images/image_1.jpeg'), uri: require('./tracks/track1.mp3') },\n  { title: 'Chill', cover: require('./images/image_2.jpg'), uri: require('./tracks/track2.mp3') },\n] as const;\n\nfunction equalPowerGain1(progress: number): number {\n  return Math.cos(progress * 0.5 * Math.PI) * MAX_GAIN;\n}\n\nfunction equalPowerGain2(progress: number): number {\n  return Math.cos((1 - progress) * 0.5 * Math.PI) * MAX_GAIN;\n}\n\nfunction formatTime(seconds: number): string {\n  const m = Math.floor(seconds / 60);\n  const s = Math.floor(seconds % 60);\n  return `${m}:${s.toString().padStart(2, '0')}`;\n}\n\nconst Crossfade: FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isLoading, setIsLoading] = useState(true);\n  const [trackDuration, setTrackDuration] = useState(0);\n  const [visibleTrack, setVisibleTrack] = useState<1 | 2>(1);\n  const [playbackPosition, setPlaybackPosition] = useState(0);\n\n  const audioContext = useRef<AudioContext | null>(null);\n  const sourceNode1 = useRef<AudioBufferSourceNode | null>(null);\n  const sourceNode2 = useRef<AudioBufferSourceNode | null>(null);\n  const gainNode1 = useRef<GainNode | null>(null);\n  const gainNode2 = useRef<GainNode | null>(null);\n  const buffer1 = useRef<AudioBuffer | null>(null);\n  const buffer2 = useRef<AudioBuffer | null>(null);\n  const visibleTrackRef = useRef<1 | 2>(1);\n\n  const progress = useSharedValue(0);\n  const swipeStartProgress = useSharedValue(0);\n  const isPlayingShared = useSharedValue(0);\n  const swipeEndSnapTo = useSharedValue(-1);\n\n  useEffect(() => {\n    isPlayingShared.value = isPlaying ? 1 : 0;\n    visibleTrackRef.current = visibleTrack;\n  }, [isPlaying, visibleTrack, isPlayingShared]);\n\n  const applyGainFromProgress = useCallback((p: number) => {\n    const ctx = audioContext.current;\n    const g1 = gainNode1.current;\n    const g2 = gainNode2.current;\n    if (!ctx || !g1 || !g2) {\n      return;\n    }\n    const now = ctx.currentTime;\n    g1.gain.setValueAtTime(equalPowerGain1(p), now);\n    g2.gain.setValueAtTime(equalPowerGain2(p), now);\n  }, []);\n\n  const commitSwipeEnd = useCallback((snapTo: number) => {\n    const track: 1 | 2 = snapTo < 0.5 ? 1 : 2;\n    setVisibleTrack(track);\n    visibleTrackRef.current = track;\n\n    const buf = track === 1 ? buffer1.current : buffer2.current;\n    if (buf) {\n      setTrackDuration(buf.duration);\n    }\n\n    const ctx = audioContext.current;\n    const g1 = gainNode1.current;\n    const g2 = gainNode2.current;\n    if (!ctx || !g1 || !g2) {\n      return;\n    }\n    const now = ctx.currentTime;\n    g1.gain.setValueAtTime(visibleTrack === 1 ? MAX_GAIN : 0, now);\n    g2.gain.setValueAtTime(visibleTrack !== 1 ? MAX_GAIN : 0, now);\n  }, []);\n\n  useAnimatedReaction(\n    () => progress.value,\n    (p) => {\n      if (isPlayingShared.value === 1) {\n        scheduleOnRN(applyGainFromProgress, p);\n      }\n    },\n  );\n\n  useAnimatedReaction(\n    () => swipeEndSnapTo.value,\n    (snapTo) => {\n      if (snapTo >= 0) {\n        scheduleOnRN(commitSwipeEnd, snapTo);\n        swipeEndSnapTo.value = -1;\n      }\n    },\n  );\n\n  useEffect(() => {\n    const init = async () => {\n      audioContext.current = new AudioContext();\n\n      if (buffer1.current && buffer2.current) {\n        setIsLoading(false);\n        return;\n      }\n\n      buffer1.current = await audioContext.current.decodeAudioData(TRACKS[0].uri);\n      buffer2.current = await audioContext.current.decodeAudioData(TRACKS[1].uri);\n      setTrackDuration(buffer1.current.duration);\n      setPlaybackPosition(0);\n      setIsLoading(false);\n    };\n\n    init();\n\n    return () => {\n      stopAudio();\n      audioContext.current?.suspend();\n    };\n  }, []);\n\n  const playAudio = useCallback(async () => {\n    if (!audioContext.current || !buffer1.current || !buffer2.current || isPlaying) {\n      return;\n    }\n\n    AudioManager.setAudioSessionOptions({\n      iosCategory: 'playback',\n      iosMode: 'default',\n      iosOptions: [],\n    });\n    await AudioManager.setAudioSessionActivity(true);\n\n    if (audioContext.current.state === 'suspended') {\n      await audioContext.current.resume();\n    }\n\n    sourceNode1.current = audioContext.current.createBufferSource();\n    sourceNode1.current.buffer = buffer1.current;\n    sourceNode2.current = audioContext.current.createBufferSource();\n    sourceNode2.current.buffer = buffer2.current;\n    gainNode1.current = audioContext.current.createGain();\n    gainNode2.current = audioContext.current.createGain();\n\n    sourceNode1.current\n      .connect(gainNode1.current)\n      .connect(audioContext.current.destination);\n    sourceNode2.current\n      .connect(gainNode2.current)\n      .connect(audioContext.current.destination);\n\n    const now = audioContext.current.currentTime;\n    const maxOffset = Math.max(\n      0,\n      Math.min(buffer1.current.duration, buffer2.current.duration) - 0.01,\n    );\n    const startOffset = Math.min(Math.max(0, playbackPosition), maxOffset);\n\n    gainNode1.current.gain.setValueAtTime(visibleTrack === 1 ? MAX_GAIN : 0, now);\n    gainNode2.current.gain.setValueAtTime(visibleTrack !== 1 ? MAX_GAIN : 0, now);\n    progress.value = visibleTrack === 1 ? 0 : 1;\n\n    sourceNode1.current.onPositionChanged = (event) => {\n      if (visibleTrackRef.current === 1) {\n        setPlaybackPosition(event.value);\n      }\n    };\n    sourceNode1.current.start(now, startOffset);\n\n    sourceNode2.current.onPositionChanged = (event) => {\n      if (visibleTrackRef.current === 2) {\n        setPlaybackPosition(event.value);\n      }\n    };\n    sourceNode2.current.start(now, startOffset);\n\n    setIsPlaying(true);\n  }, [isPlaying, visibleTrack, playbackPosition]);\n\n  const stopAudio = useCallback(async () => {\n    if (!isPlaying || !audioContext.current) {\n      return;\n    }\n\n    gainNode1.current?.disconnect();\n    gainNode2.current?.disconnect();\n    sourceNode1.current = null;\n    sourceNode2.current = null;\n    gainNode1.current = null;\n    gainNode2.current = null;\n\n    await audioContext.current.suspend();\n    await AudioManager.setAudioSessionActivity(false);\n    setIsPlaying(false);\n  }, [isPlaying]);\n\n  const togglePlayPause = useCallback(() => {\n    if (isPlaying) {\n      stopAudio();\n    } else {\n      playAudio();\n    }\n  }, [isPlaying, playAudio, stopAudio]);\n\n  const progressPercent =\n    trackDuration > 0 ? (playbackPosition / trackDuration) * 100 : 0;\n\n  const panGesture = Gesture.Pan()\n    .activeOffsetX([-20, 20])\n    .onStart(() => {\n      swipeStartProgress.value = progress.value;\n    })\n    .onUpdate((event) => {\n      const p = Math.max(\n        0,\n        Math.min(1, swipeStartProgress.value - event.translationX / ARTWORK_SIZE),\n      );\n      progress.value = p;\n    })\n    .onEnd(() => {\n      const p = progress.value;\n      const snapTo = p < 0.5 ? 0 : 1;\n      progress.value = withSpring(snapTo, {\n        damping: 100,\n        stiffness: 300,\n      });\n      swipeEndSnapTo.value = snapTo;\n    });\n\n  const track1TileStyle = useAnimatedStyle(() => {\n    const p = progress.value;\n    return {\n      transform: [{ translateX: -p * TILE_DISTANCE }],\n    };\n  });\n\n  const track2TileStyle = useAnimatedStyle(() => {\n    const p = progress.value;\n    return {\n      transform: [{ translateX: (1 - p) * TILE_DISTANCE }],\n    };\n  });\n\n  const currentTrackTitle = TRACKS[visibleTrack - 1].title;\n\n  return (\n    <Container centered>\n      {isLoading ? (\n        <ActivityIndicator color={colors.white} />\n      ) : (\n        <View style={styles.content}>\n          <View style={styles.artworkWrapper}>\n            <GestureDetector gesture={panGesture}>\n              <View style={styles.artworkContainer}>\n                <Animated.View style={[styles.tile, track1TileStyle]}>\n                  <Image\n                    source={TRACKS[0].cover}\n                    style={styles.albumCover}\n                    resizeMode=\"cover\"\n                  />\n                </Animated.View>\n                <Animated.View style={[styles.tile, track2TileStyle]}>\n                  <Image\n                    source={TRACKS[1].cover}\n                    style={styles.albumCover}\n                    resizeMode=\"cover\"\n                  />\n                </Animated.View>\n              </View>\n            </GestureDetector>\n          </View>\n\n          <Spacer.Vertical size={40} />\n\n          <View style={styles.trackInfo}>\n            <View style={styles.trackInfoText}>\n              <Text style={styles.trackTitle} numberOfLines={1}>\n                {currentTrackTitle}\n              </Text>\n              <Text style={styles.trackArtist} numberOfLines={1}>\n                Lo-Fi Boy\n              </Text>\n            </View>\n            <Heart\n              color={colors.white}\n              size={24}\n              fill=\"transparent\"\n              style={styles.heartIcon}\n            />\n          </View>\n\n          <Spacer.Vertical size={30} />\n\n          <View style={styles.progressSection}>\n            <View style={styles.progressBar}>\n              <View\n                style={[styles.progressFill, { width: `${progressPercent}%` }]}\n              />\n            </View>\n            <View style={styles.timeRow}>\n              <Text style={styles.timeText}>\n                {formatTime(playbackPosition)}\n              </Text>\n              <Text style={styles.timeText}>\n                {formatTime(trackDuration)}\n              </Text>\n            </View>\n          </View>\n\n          <Spacer.Vertical size={20} />\n\n          <View style={styles.controlsRow}>\n            <Pressable\n              onPress={() => {}}\n              style={({ pressed }) => [\n                styles.iconButton,\n                pressed && styles.iconButtonPressed,\n              ]}\n            >\n              <SkipBack color={colors.white} size={32} />\n            </Pressable>\n            <Pressable\n              onPress={togglePlayPause}\n              style={({ pressed }) => [\n                styles.iconButton,\n                pressed && styles.iconButtonPressed,\n              ]}\n            >\n              <PlayPauseIcon\n                isPlaying={isPlaying}\n                size={56}\n                color={colors.white}\n              />\n            </Pressable>\n            <Pressable\n              onPress={() => {}}\n              style={({ pressed }) => [\n                styles.iconButton,\n                pressed && styles.iconButtonPressed,\n              ]}\n            >\n              <SkipForward color={colors.white} size={32} />\n            </Pressable>\n          </View>\n        </View>\n      )}\n    </Container>\n  );\n};\n\nexport default Crossfade;\n\nconst styles = StyleSheet.create({\n  content: {\n    width: '100%',\n    alignItems: 'center',\n    paddingHorizontal: 20,\n  },\n  artworkWrapper: {\n    width: ARTWORK_SIZE + 48,\n    height: ARTWORK_SIZE + 48,\n    borderRadius: 12,\n    backgroundColor: `${colors.main}12`,\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  artworkContainer: {\n    width: ARTWORK_SIZE,\n    height: ARTWORK_SIZE,\n    overflow: 'hidden',\n    position: 'relative',\n  },\n  tile: {\n    position: 'absolute',\n    left: 0,\n    top: 0,\n    width: ARTWORK_SIZE,\n    height: ARTWORK_SIZE,\n  },\n  albumCover: {\n    width: ARTWORK_SIZE,\n    height: ARTWORK_SIZE,\n  },\n  trackInfo: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    width: ARTWORK_SIZE,\n    marginTop: 12,\n    paddingHorizontal: 4,\n  },\n  trackInfoText: {\n    flex: 1,\n    marginRight: 8,\n  },\n  trackTitle: {\n    color: colors.white,\n    fontSize: 18,\n    fontWeight: '600',\n  },\n  trackArtist: {\n    color: colors.white,\n    fontSize: 14,\n    opacity: 0.8,\n    marginTop: 2,\n  },\n  heartIcon: {\n    opacity: 0.9,\n  },\n  progressSection: {\n    width: '100%',\n    maxWidth: ARTWORK_SIZE,\n  },\n  progressBar: {\n    height: 6,\n    backgroundColor: colors.separator,\n    borderRadius: 3,\n    overflow: 'hidden',\n  },\n  progressFill: {\n    height: '100%',\n    backgroundColor: colors.main,\n    borderRadius: 3,\n  },\n  timeRow: {\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    marginTop: 6,\n  },\n  timeText: {\n    color: colors.white,\n    fontSize: 12,\n    opacity: 0.9,\n  },\n  controlsRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'center',\n    gap: 32,\n  },\n  iconButton: {\n    padding: 12,\n  },\n  iconButtonPressed: {\n    opacity: 0.7,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/PedalBoard/AutoWahPedal.tsx",
    "content": "import React, { useRef, useState, useEffect } from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport { GestureDetector, Gesture } from 'react-native-gesture-handler';\nimport { VerticalSlider } from '../../components';\nimport { GainNode, BiquadFilterNode, AudioNode, AudioContext, OscillatorNode } from 'react-native-audio-api';\n\n// LFO Settings\nconst MIN_LFO_RATE = 0.3; // Slow sweep (0.5 Hz)\nconst MAX_LFO_RATE = 4; // Fast wobble (8 Hz)\nconst MIN_DEPTH = 50;    // Narrow frequency sweep\nconst MAX_DEPTH = 250;   // Wide frequency sweep\n\n// Filter Settings\nconst BASE_FREQ = 800;    // Center frequency for the sweep\nconst MIN_Q = 1;\nconst MAX_Q = 20;\n\ninterface AutoWahPedalProps {\n  context: AudioContext;\n  inputNode: AudioNode;\n  outputNode: AudioNode;\n}\n\nexport default function AutoWahPedal({\n  context,\n  inputNode,\n  outputNode,\n}: AutoWahPedalProps) {\n  const [isActive, setIsActive] = useState(false);\n\n  // Repurposed State Variables\n  const [rate, setRate] = useState(0.5);        // LFO Speed (was Frequency)\n  const [resonance, setResonance] = useState(0.5);\n  const [depth, setDepth] = useState(0.5);      // LFO Width (was Sensitivity)\n\n  // Audio Nodes\n  const inputGainRef = useRef<GainNode | null>(null);\n  const filterRef = useRef<BiquadFilterNode | null>(null);\n  const outputGainRef = useRef<GainNode | null>(null);\n\n  // LFO specific nodes\n  const lfoOscillatorRef = useRef<OscillatorNode | null>(null);\n  const lfoGainRef = useRef<GainNode | null>(null);\n\n  useEffect(() => {\n    initialize(context);\n    return () => {\n       try {\n         lfoOscillatorRef.current?.stop();\n       } catch(e) {}\n    };\n  }, [context]);\n\n  useEffect(() => {\n    if (inputNode == null || outputNode == null) {\n      return;\n    }\n    if (isActive) {\n      applyEffect(inputNode, outputNode);\n    } else {\n      discardEffect(inputNode, outputNode);\n    }\n  }, [isActive, inputNode, outputNode]);\n\n  useEffect(() => {\n    updateAudioParams(rate, resonance, depth);\n  }, [rate, resonance, depth]);\n\n  const initialize = (context: AudioContext) => {\n    inputGainRef.current = context.createGain();\n    inputGainRef.current.gain.value = 1;\n\n    outputGainRef.current = context.createGain();\n    outputGainRef.current.gain.value = 1;\n\n    // 1. Create the Filter (The \"Wah\")\n    filterRef.current = context.createBiquadFilter();\n    filterRef.current.type = 'bandpass';\n    filterRef.current.frequency.value = BASE_FREQ; // Set center point\n\n    // 2. Create the LFO (The \"Automatic Foot\")\n    lfoOscillatorRef.current = context.createOscillator();\n    lfoOscillatorRef.current.type = 'sine'; // Smooth sweep\n    lfoOscillatorRef.current.start();\n\n    // 3. Create LFO Depth Control\n    lfoGainRef.current = context.createGain();\n\n    // 4. Connect LFO -> Depth -> Filter Frequency\n    if (lfoOscillatorRef.current && lfoGainRef.current && filterRef.current) {\n        lfoOscillatorRef.current.connect(lfoGainRef.current);\n        lfoGainRef.current.connect(filterRef.current.frequency);\n    }\n\n    updateAudioParams(rate, resonance, depth);\n  };\n\n  const updateAudioParams = (r: number, res: number, d: number) => {\n    if (!filterRef.current || !lfoOscillatorRef.current || !lfoGainRef.current) {\n      return;\n    }\n\n    // 1. Update LFO Speed (Rate)\n    const lfoRate = MIN_LFO_RATE + r * (MAX_LFO_RATE - MIN_LFO_RATE);\n    lfoOscillatorRef.current.frequency.value = lfoRate;\n\n    // 2. Update Filter Q (Resonance)\n    const q = MIN_Q + res * (MAX_Q - MIN_Q);\n    filterRef.current.Q.value = q;\n\n    // 3. Update Sweep Width (Depth)\n    const sweepWidth = MIN_DEPTH + d * (MAX_DEPTH - MIN_DEPTH);\n    lfoGainRef.current.gain.value = sweepWidth;\n  };\n\n  const applyEffect = (inputNode: AudioNode, outputNode: AudioNode) => {\n    if (!inputGainRef.current || !filterRef.current || !outputGainRef.current) {\n      return;\n    }\n\n    inputNode.connect(inputGainRef.current);\n    inputGainRef.current.connect(filterRef.current);\n    filterRef.current.connect(outputGainRef.current);\n    outputGainRef.current.connect(outputNode);\n    (outputNode as GainNode).gain.value = 7; // Boost output level to compensate for wah attenuation\n\n    inputNode.disconnect(outputNode);\n  };\n\n  const discardEffect = (inputNode: AudioNode, outputNode: AudioNode) => {\n    if (inputGainRef.current) {\n      inputNode.disconnect(inputGainRef.current);\n    }\n\n    if (filterRef.current) {\n      inputGainRef.current?.disconnect(filterRef.current);\n    }\n\n    inputNode.connect(outputNode);\n    (outputNode as GainNode).gain.value = 1; // Boost output level to compensate for wah attenuation\n  };\n\n  const togglePower = () => {\n    setIsActive((prev) => !prev);\n  };\n\n  return (\n    <View style={styles.pedalBody}>\n      <View style={styles.header}>\n        <Text style={styles.brand}>RN AUDIO API</Text>\n        <Text style={styles.model}>AUTO WAH</Text>\n      </View>\n\n      <View style={styles.controlsRow}>\n        <VerticalSlider\n          label=\"RATE\"\n          value={rate}\n          labelColor=\"#fff\"\n          valueColor=\"#ffda\"\n          onValueChange={setRate}\n        />\n        <VerticalSlider\n          label=\"DEPTH\"\n          value={depth}\n          labelColor=\"#fff\"\n          valueColor=\"#ffda\"\n          onValueChange={setDepth}\n        />\n        <VerticalSlider\n          label=\"RES\"\n          value={resonance}\n          labelColor=\"#fff\"\n          valueColor=\"#ffda\"\n          onValueChange={setResonance}\n        />\n      </View>\n\n      <View style={styles.footer}>\n        <View style={styles.switchContainer}>\n          <View\n            style={[\n              styles.led,\n              {\n                backgroundColor: isActive ? '#00ff00' : '#003300', // Changed LED to Green\n              },\n            ]}\n          />\n          <GestureDetector\n            gesture={Gesture.Tap()\n              .runOnJS(true)\n              .onEnd(togglePower)}\n          >\n            <View style={[styles.stompSwitch]}>\n              <View style={styles.stompInner} />\n            </View>\n          </GestureDetector>\n          <Text style={styles.switchLabel}>\n            {isActive ? 'ON' : 'BYPASS'}\n          </Text>\n        </View>\n      </View>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  pedalBody: {\n    flex: 1,\n    backgroundColor: '#2d8f7b', // Changed color to Teal for \"LFO\" vibe\n    margin: 10,\n    borderRadius: 20,\n    borderWidth: 4,\n    borderColor: '#1f6a5a',\n    padding: 10,\n    justifyContent: 'space-between',\n    shadowColor: '#000',\n    shadowOffset: { width: 0, height: 10 },\n    shadowOpacity: 0.5,\n    shadowRadius: 10,\n    elevation: 10,\n  },\n  header: {\n    alignItems: 'center',\n    marginTop: 20,\n  },\n  brand: {\n    fontSize: 16,\n    fontWeight: 'bold',\n    color: '#fff',\n    letterSpacing: 2,\n  },\n  model: {\n    fontSize: 32,\n    fontWeight: '900',\n    color: '#fff',\n    fontStyle: 'italic',\n  },\n  controlsRow: {\n    flexDirection: 'row',\n    justifyContent: 'space-around',\n    alignItems: 'center',\n  },\n  footer: {\n    alignItems: 'center',\n    marginBottom: 40,\n  },\n  switchContainer: {\n    alignItems: 'center',\n    gap: 10,\n  },\n  led: {\n    width: 15,\n    height: 15,\n    borderRadius: 8,\n    borderWidth: 1,\n    borderColor: '#000',\n    marginBottom: 10,\n    shadowColor: '#0f0',\n    shadowOffset: { width: 0, height: 0 },\n    shadowOpacity: 0.8,\n    shadowRadius: 5,\n  },\n  stompSwitch: {\n    width: 30,\n    height: 30,\n    borderRadius: 30,\n    backgroundColor: '#c0c0c0',\n    borderWidth: 2,\n    borderColor: '#888',\n    justifyContent: 'center',\n    alignItems: 'center',\n    elevation: 5,\n  },\n  stompInner: {\n    width: 20,\n    height: 20,\n    borderRadius: 20,\n    backgroundColor: '#e0e0e0',\n    borderWidth: 1,\n    borderColor: '#aaa',\n  },\n  switchLabel: {\n    fontWeight: 'bold',\n    color: '#fff',\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/PedalBoard/EchoPedal.tsx",
    "content": "import React, { useRef, useState, useEffect } from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport { GestureDetector, Gesture } from 'react-native-gesture-handler';\nimport { ConvolverNode, AudioNode, AudioContext } from 'react-native-audio-api';\nimport { makeEchoCurve } from './curves';\n\ninterface EchoPedalProps {\n  context: AudioContext;\n  inputNode: AudioNode;\n  outputNode: AudioNode;\n}\n\nexport default function EchoPedal({\n  context,\n  inputNode,\n  outputNode,\n}: EchoPedalProps) {\n  const [isActive, setIsActive] = useState(false);\n\n  const convolverNodeRef = useRef<ConvolverNode | null>(null);\n\n  useEffect(() => {\n    if (inputNode == null || outputNode == null) {\n      return;\n    }\n    if (isActive) {\n      applyEffect(context, inputNode, outputNode);\n    } else {\n      discardEffect(inputNode, outputNode);\n    }\n  }, [isActive, inputNode, outputNode]);\n\n  const applyEffect = (context: AudioContext, inputNode: AudioNode, outputNode: AudioNode) => {\n    if (convolverNodeRef.current) {\n      inputNode.disconnect(convolverNodeRef.current);\n      convolverNodeRef.current.disconnect();\n    }\n\n    // Create new convolver with echo curve\n    const convolver = new ConvolverNode(context, { disableNormalization: true})\n    convolver.buffer = makeEchoCurve(0.7, context);\n    convolverNodeRef.current = convolver;\n\n    // Reconnect audio graph\n    inputNode.connect(convolver).connect(outputNode);\n    inputNode.disconnect(outputNode);\n  };\n\n  const discardEffect = (inputNode: AudioNode, outputNode: AudioNode) => {\n    inputNode.connect(outputNode);\n    if (convolverNodeRef.current) {\n      convolverNodeRef.current.disconnect();\n      inputNode.disconnect(convolverNodeRef.current);\n    }\n  };\n\n  const togglePower = () => {\n    setIsActive((prev) => !prev);\n  };\n\n  return (\n    <View style={styles.pedalBody}>\n      <View style={styles.header}>\n        <Text style={styles.brand}>RN AUDIO API</Text>\n        <Text style={styles.model}>ECHO</Text>\n      </View>\n\n      <View style={[styles.controlsRow, { height: 150 }]}>\n      </View>\n\n      <View style={styles.footer}>\n        <View style={styles.switchContainer}>\n          <View\n            style={[\n              styles.led,\n              {\n                backgroundColor: isActive ? '#00ff00' : '#003300',\n              },\n            ]}\n          />\n          <GestureDetector\n            gesture={Gesture.Tap()\n              .runOnJS(true)\n              .onEnd(togglePower)}\n          >\n            <View style={[styles.stompSwitch]}>\n              <View style={styles.stompInner} />\n            </View>\n          </GestureDetector>\n          <Text style={styles.switchLabel}>\n            {isActive ? 'ON' : 'BYPASS'}\n          </Text>\n        </View>\n      </View>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  pedalBody: {\n    flex: 1,\n    backgroundColor: '#2d8659',\n    margin: 10,\n    borderRadius: 20,\n    borderWidth: 4,\n    borderColor: '#1a5c3a',\n    padding: 10,\n    justifyContent: 'space-between',\n    shadowColor: '#000',\n    shadowOffset: { width: 0, height: 10 },\n    shadowOpacity: 0.5,\n    shadowRadius: 10,\n    elevation: 10,\n  },\n  header: {\n    alignItems: 'center',\n    marginTop: 20,\n  },\n  brand: {\n    fontSize: 16,\n    fontWeight: 'bold',\n    color: '#fff',\n    letterSpacing: 2,\n  },\n  model: {\n    fontSize: 32,\n    fontWeight: '900',\n    color: '#fff',\n    fontStyle: 'italic',\n  },\n  controlsRow: {\n    flexDirection: 'row',\n    justifyContent: 'space-around',\n    alignItems: 'center',\n  },\n  footer: {\n    alignItems: 'center',\n    marginBottom: 40,\n  },\n  switchContainer: {\n    alignItems: 'center',\n    gap: 10,\n  },\n  led: {\n    width: 15,\n    height: 15,\n    borderRadius: 8,\n    borderWidth: 1,\n    borderColor: '#000',\n    marginBottom: 10,\n    shadowColor: '#0f0',\n    shadowOffset: { width: 0, height: 0 },\n    shadowOpacity: 0.8,\n    shadowRadius: 5,\n  },\n  stompSwitch: {\n    width: 30,\n    height: 30,\n    borderRadius: 30,\n    backgroundColor: '#c0c0c0',\n    borderWidth: 2,\n    borderColor: '#888',\n    justifyContent: 'center',\n    alignItems: 'center',\n    elevation: 5,\n  },\n  stompInner: {\n    width: 20,\n    height: 20,\n    borderRadius: 20,\n    backgroundColor: '#e0e0e0',\n    borderWidth: 1,\n    borderColor: '#aaa',\n  },\n  switchLabel: {\n    fontWeight: 'bold',\n    color: '#fff',\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/PedalBoard/OverdrivePedal.tsx",
    "content": "// filepath: /Users/michal/react-native-audio-api/apps/common-app/src/demos/PedalBoard/OverdrivePedal.tsx\nimport React, { useRef, useState, useEffect } from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport { GestureDetector, Gesture } from 'react-native-gesture-handler';\nimport { VerticalSlider } from '../../components';\nimport { makeDistortionCurve } from './curves';\nimport { GainNode, BiquadFilterNode, WaveShaperNode, AudioNode, AudioContext } from 'react-native-audio-api';\n\nconst MIN_DRIVE_GAIN = 0.05;\nconst MAX_DRIVE_GAIN = 10;\nconst MIN_FREQ = 500;\nconst MAX_FREQ = 20000;\n\ninterface OverdrivePedalProps {\n  context: AudioContext;\n  inputNode: AudioNode;\n  outputNode: AudioNode;\n}\n\nexport default function OverdrivePedal({\n  context,\n  inputNode,\n  outputNode,\n}: OverdrivePedalProps) {\n  const [isActive, setIsActive] = useState(false);\n  const [drive, setDrive] = useState(0.5);\n  const [tone, setTone] = useState(0.5);\n  const [level, setLevel] = useState(0.5);\n\n  const driveRef = useRef<GainNode | null>(null);\n  const toneRef = useRef<BiquadFilterNode | null>(null);\n  const levelRef = useRef<GainNode | null>(null);\n  const shaperRef = useRef<WaveShaperNode | null>(null);\n\n  useEffect(() => {\n    initialize(context);\n  }, [context]);\n\n  useEffect(() => {\n    if (inputNode == null || outputNode == null) {\n      return;\n    }\n    if (isActive) {\n      applyEffect(inputNode, outputNode);\n    } else {\n      discardEffect(inputNode, outputNode);\n    }\n  }, [isActive, inputNode, outputNode]);\n\n  useEffect(() => {\n    updateAudioParams(drive, tone, level);\n  }, [drive, tone, level]);\n\n  const initialize = (context: AudioContext) => {\n    driveRef.current = context.createGain();\n    toneRef.current = context.createBiquadFilter();\n    levelRef.current = context.createGain();\n    shaperRef.current = context.createWaveShaper();\n    shaperRef.current.curve = makeDistortionCurve(50, context.sampleRate);\n    shaperRef.current.oversample = '4x';\n    toneRef.current.type = 'lowpass';\n    toneRef.current.Q.value = 1;\n    updateAudioParams(drive, tone, level);\n  };\n\n  const updateAudioParams = (d: number, t: number, l: number) => {\n    if (!driveRef.current || !toneRef.current || !levelRef.current) {\n      return;\n    }\n\n    const driveGain = MIN_DRIVE_GAIN + d * (MAX_DRIVE_GAIN - MIN_DRIVE_GAIN);\n    driveRef.current.gain.value = driveGain;\n\n    // logarithmic mapping for tone\n    const freq = MIN_FREQ * Math.pow(MAX_FREQ / MIN_FREQ, t);\n    toneRef.current.frequency.value = freq;\n\n    levelRef.current.gain.value = l;\n  };\n\n  const applyEffect = (inputNode: AudioNode, outputNode: AudioNode) => {\n    if (!driveRef.current || !toneRef.current || !levelRef.current || !shaperRef.current) {\n      console.warn('OverdrivePedal: Audio nodes not initialized');\n      return;\n    }\n    inputNode\n      .connect(driveRef.current!)\n      .connect(shaperRef.current!)\n      .connect(toneRef.current!)\n      .connect(levelRef.current!)\n      .connect(outputNode);\n    inputNode.disconnect(outputNode);\n  };\n\n  const discardEffect = (inputNode: AudioNode, outputNode: AudioNode) => {\n    inputNode.disconnect(driveRef.current!);\n    inputNode.connect(outputNode);\n  };\n\n  const togglePower = () => {\n\n    setIsActive((prev) => !prev);\n  };\n\n  return (\n    <View style={styles.pedalBody}>\n      <View style={styles.header}>\n        <Text style={styles.brand}>RN AUDIO API</Text>\n        <Text style={styles.model}>OVERDRIVE</Text>\n      </View>\n\n      <View style={styles.controlsRow}>\n        <VerticalSlider\n          label=\"DRIVE\"\n          value={drive}\n          onValueChange={setDrive}\n        />\n        <VerticalSlider\n          label=\"TONE\"\n          value={tone}\n          onValueChange={setTone}\n        />\n        <VerticalSlider\n          label=\"LEVEL\"\n          value={level}\n          onValueChange={setLevel}\n        />\n      </View>\n\n      <View style={styles.footer}>\n        <View style={styles.switchContainer}>\n          <View\n            style={[\n              styles.led,\n              {\n                backgroundColor: isActive ? '#ff0000' : '#330000',\n              },\n            ]}\n          />\n          <GestureDetector\n            gesture={Gesture.Tap()\n              .runOnJS(true)\n              .onEnd(togglePower)}\n          >\n            <View style={[styles.stompSwitch]}>\n              <View style={styles.stompInner} />\n            </View>\n          </GestureDetector>\n          <Text style={styles.switchLabel}>\n            {isActive ? 'ON' : 'BYPASS'}\n          </Text>\n        </View>\n      </View>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  pedalBody: {\n    flex: 1,\n    backgroundColor: '#e6b800',\n    margin: 10,\n    borderRadius: 20,\n    borderWidth: 4,\n    borderColor: '#b38f00',\n    padding: 10,\n    justifyContent: 'space-between',\n    shadowColor: '#000',\n    shadowOffset: { width: 0, height: 10 },\n    shadowOpacity: 0.5,\n    shadowRadius: 10,\n    elevation: 10,\n  },\n  header: {\n    alignItems: 'center',\n    marginTop: 20,\n  },\n  brand: {\n    fontSize: 16,\n    fontWeight: 'bold',\n    color: '#333',\n    letterSpacing: 2,\n  },\n  model: {\n    fontSize: 32,\n    fontWeight: '900',\n    color: '#000',\n    fontStyle: 'italic',\n  },\n  controlsRow: {\n    flexDirection: 'row',\n    justifyContent: 'space-around',\n    alignItems: 'center',\n  },\n  footer: {\n    alignItems: 'center',\n    marginBottom: 40,\n  },\n  switchContainer: {\n    alignItems: 'center',\n    gap: 10,\n  },\n  led: {\n    width: 15,\n    height: 15,\n    borderRadius: 8,\n    borderWidth: 1,\n    borderColor: '#000',\n    marginBottom: 10,\n    shadowColor: '#f00',\n    shadowOffset: { width: 0, height: 0 },\n    shadowOpacity: 0.8,\n    shadowRadius: 5,\n  },\n  stompSwitch: {\n    width: 30,\n    height: 30,\n    borderRadius: 30,\n    backgroundColor: '#c0c0c0',\n    borderWidth: 2,\n    borderColor: '#888',\n    justifyContent: 'center',\n    alignItems: 'center',\n    elevation: 5,\n  },\n  stompInner: {\n    width: 20,\n    height: 20,\n    borderRadius: 20,\n    backgroundColor: '#e0e0e0',\n    borderWidth: 1,\n    borderColor: '#aaa',\n  },\n  switchLabel: {\n    fontWeight: 'bold',\n    color: '#333',\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/PedalBoard/PedalBoard.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport {\n  AudioBufferSourceNode,\n  AudioBuffer,\n  GainNode,\n  RecorderAdapterNode,\n  AudioRecorder,\n  AudioManager\n} from 'react-native-audio-api';\nimport { Container } from '../../components';\nimport { audioContext } from '../../singletons';\nimport { ActivityIndicator, View, Button, StyleSheet, ScrollView, Dimensions, Alert } from 'react-native';\nimport OverdrivePedal from './OverdrivePedal';\nimport ReverbPedal from './ReverbPedal';\nimport AutoWahPedal from './AutoWahPedal';\n\nconst screenWdith = Dimensions.get('window').width;\n\nconst URL = 'https://files.catbox.moe/xbj6gn.flac';\nconst PEDALS = [\n  { id: 0, component: OverdrivePedal },\n  { id: 1, component: AutoWahPedal },\n  { id: 2, component: ReverbPedal },\n];\n\nlet permissionsGranted = false;\n\nexport default function PedalBoard() {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isRecording, setIsRecording] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n  const [audioBuffer, setAudioBuffer] = useState<AudioBuffer | null>(null);\n\n  const sourceNodeRef = useRef<AudioBufferSourceNode | RecorderAdapterNode>(null);\n  const recorderRef = useRef<AudioRecorder | null>(null);\n  const pedalInputNodesRef = useRef<GainNode[]>([]);\n  const pedalOutputNodesRef = useRef<GainNode[]>([]);\n\n  useEffect(() => {\n    const init = async () => {\n      setIsLoading(true);\n      AudioManager.setAudioSessionOptions({\n        iosCategory: 'playAndRecord',\n        iosMode: 'default',\n      })\n      AudioManager.setAudioSessionActivity(true);\n\n      try {\n        // Load audio file\n        const audioBuffer = await fetch(URL, {\n          headers: {\n            'User-Agent':\n              'Mozilla/5.0 (Android; Mobile; rv:122.0) Gecko/122.0 Firefox/122.0',\n          },\n        })\n          .then((response) => response.arrayBuffer())\n          .then((arrayBuffer) => audioContext.decodeAudioData(arrayBuffer));\n\n        for (let i = 0; i < PEDALS.length; i++) {\n          const input = audioContext.createGain();\n          const output = audioContext.createGain();\n          pedalInputNodesRef.current.push(input);\n          pedalOutputNodesRef.current.push(output);\n        }\n        setAudioBuffer(audioBuffer);\n        sourceNodeRef.current = audioContext.createBufferSource();\n        sourceNodeRef.current.buffer = audioBuffer;\n        handleConnections();\n      } catch (error) {\n        console.error('Error loading audio:', error);\n      } finally {\n        setIsLoading(false);\n      }\n    };\n\n    init();\n    return () => {\n      sourceNodeRef.current?.disconnect();\n    };\n  }, []);\n\n  const handleConnections = () => {\n    if (!sourceNodeRef.current) {\n      return;\n    }\n    const sourceNode = sourceNodeRef.current;\n    sourceNode.connect(pedalInputNodesRef.current[0]);\n    for (let i = 0; i < PEDALS.length; i++) {\n      pedalInputNodesRef.current[i].connect(pedalOutputNodesRef.current[i]);\n    }\n\n    for (let i = 0; i < PEDALS.length - 1; i++) {\n      pedalOutputNodesRef.current[i].connect(pedalInputNodesRef.current[i + 1]);\n    }\n    pedalOutputNodesRef.current[PEDALS.length - 1].connect(audioContext.destination);\n  }\n\n  const togglePlayback = () => {\n    if (isPlaying) {\n      sourceNodeRef.current?.disconnect();\n      setIsPlaying(false);\n    } else {\n      if (!audioBuffer) {\n        return;\n      }\n      sourceNodeRef.current = audioContext.createBufferSource();\n      sourceNodeRef.current.buffer = audioBuffer;\n      sourceNodeRef.current.connect(pedalInputNodesRef.current[0]);\n      sourceNodeRef.current.start();\n      setIsPlaying(true);\n    }\n  }\n\n  const toggleRecording = async () => {\n    if (isRecording) {\n      recorderRef.current?.stop();\n      sourceNodeRef.current?.disconnect();\n      setIsRecording(false);\n    } else {\n      if (!permissionsGranted) {\n        const recPerm = await AudioManager.requestRecordingPermissions();\n        permissionsGranted = recPerm === 'Granted';\n      }\n      if (permissionsGranted) {\n        const recorder = new AudioRecorder();\n        const adapter = audioContext.createRecorderAdapter();\n        recorder.connect(adapter);\n        recorderRef.current = recorder;\n        sourceNodeRef.current = adapter;\n        sourceNodeRef.current.connect(pedalInputNodesRef.current[0]);\n        if (audioContext.state === 'suspended') {\n          audioContext.resume();\n        }\n        recorder.start();\n        setIsRecording(true);\n      } else {\n        Alert.alert(\n          'Insufficient permissions!',\n          'You need to grant audio recording permissions to use this feature.'\n        );\n      };\n    }\n  }\n\n\n  return (\n    <Container centered>\n      {isLoading ? (\n        <ActivityIndicator color=\"#FFFFFF\" />\n      ) : (\n        <>\n          <ScrollView>\n          {PEDALS.map((pedal, index) => {\n              const PedalComponent = pedal.component;\n              return (\n                <View key={pedal.id} style={styles.container}>\n                  <PedalComponent\n                    context={audioContext}\n                    inputNode={pedalInputNodesRef.current[index]}\n                    outputNode={pedalOutputNodesRef.current[index]}\n                  />\n                </View>\n              );\n            })}\n          </ScrollView>\n          <View style={styles.controls}>\n            <View style= {{ display: isRecording ? 'none' : 'flex' }}>\n            <Button\n              title={isPlaying ? 'Stop' : 'Play'}\n              onPress={togglePlayback}\n            />\n            </View>\n\n            <View style= {{ display: isPlaying ? 'none' : 'flex' }}>\n            <Button\n              title={isRecording ? 'Stop' : 'Record'}\n              onPress={toggleRecording}\n            />\n            </View>\n          </View>\n        </>\n      )}\n    </Container>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    width: screenWdith * 0.9,\n    alignItems: 'center',\n    gap: 20,\n  },\n  controls: {\n    display: 'flex',\n    flexDirection: 'row',\n    justifyContent: 'space-around',\n    marginBottom: 20,\n    marginTop: 20,\n    width: 200,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/PedalBoard/ReverbPedal.tsx",
    "content": "import React, { useRef, useState, useEffect } from 'react';\nimport { View, Text, StyleSheet } from 'react-native';\nimport { GestureDetector, Gesture } from 'react-native-gesture-handler';\nimport { VerticalSlider } from '../../components';\nimport { ConvolverNode, AudioNode, AudioContext, AudioBuffer, GainNode } from 'react-native-audio-api';\nimport { makeReverbCurve } from './curves';\n\ninterface ReverbPedalProps {\n  context: AudioContext;\n  inputNode: AudioNode;\n  outputNode: AudioNode;\n}\n\nexport default function ReverbPedal({\n  context,\n  inputNode,\n  outputNode,\n}: ReverbPedalProps) {\n  const [isActive, setIsActive] = useState(false);\n  const [level, setLevel] = useState(0.5);\n\n  const convolverNodeRef = useRef<ConvolverNode | null>(null);\n\n  useEffect(() => {\n    if (inputNode == null || outputNode == null) {\n      return;\n    }\n    if (isActive) {\n      applyEffect(context, inputNode, outputNode);\n    } else {\n      discardEffect(inputNode, outputNode);\n    }\n  }, [isActive, inputNode, outputNode]);\n\n  useEffect(() => {\n    if (isActive && inputNode && outputNode) {\n      applyEffect(context, inputNode, outputNode);\n    }\n  }, [level]);\n\n  const applyEffect = (context: AudioContext,inputNode: AudioNode, outputNode: AudioNode) => {\n    // Select convolver based on level\n    let buffer: AudioBuffer;\n    let desiredDuration: number;\n    if (level < 0.33) {\n      desiredDuration = 0.4;\n    } else if (level < 0.66) {\n      desiredDuration = 0.7;\n    } else {\n      desiredDuration = 1;\n    }\n    if (convolverNodeRef.current?.buffer) {\n      if (convolverNodeRef.current.buffer.duration === desiredDuration) {\n        return; // No change needed\n      }\n      convolverNodeRef.current.disconnect();\n      inputNode.disconnect(convolverNodeRef.current);\n    }\n    if (level < 0.33) {\n      buffer = makeReverbCurve(desiredDuration, context);\n    } else if (level < 0.66) {\n      buffer = makeReverbCurve(desiredDuration, context);\n    } else {\n      buffer = makeReverbCurve(desiredDuration, context);\n    }\n    const convolver = context.createConvolver();\n    convolver.buffer = buffer;\n    convolverNodeRef.current = convolver;\n    inputNode.connect(convolver).connect(outputNode);\n    inputNode.disconnect(outputNode);\n    (outputNode as GainNode).gain.value = 2;\n  };\n\n  const discardEffect = (inputNode: AudioNode, outputNode: AudioNode) => {\n    inputNode.connect(outputNode);\n    (outputNode as GainNode).gain.value = 1; // Reset output gain\n    if (convolverNodeRef.current) {\n      inputNode.disconnect(convolverNodeRef.current);\n      convolverNodeRef.current.disconnect();\n    }\n    convolverNodeRef.current = null;\n  };\n\n  const togglePower = () => {\n    setIsActive((prev) => !prev);\n  };\n\n  return (\n    <View style={styles.pedalBody}>\n      <View style={styles.header}>\n        <Text style={styles.brand}>RN AUDIO API</Text>\n        <Text style={styles.model}>REVERB</Text>\n      </View>\n\n      <View style={styles.controlsRow}>\n        <VerticalSlider\n          label=\"LEVEL\"\n          value={level}\n          labelColor='#fff'\n          valueColor='#ffda'\n          onValueChange={setLevel}\n          possibleValues={[0, 0.5, 1]}\n        />\n      </View>\n\n      <View style={styles.footer}>\n        <View style={styles.switchContainer}>\n          <View\n            style={[\n              styles.led,\n              {\n                backgroundColor: isActive ? '#ff0000' : '#330000',\n              },\n            ]}\n          />\n          <GestureDetector\n            gesture={Gesture.Tap()\n              .runOnJS(true)\n              .onEnd(togglePower)}\n          >\n            <View style={[styles.stompSwitch]}>\n              <View style={styles.stompInner} />\n            </View>\n          </GestureDetector>\n          <Text style={styles.switchLabel}>\n            {isActive ? 'ON' : 'BYPASS'}\n          </Text>\n        </View>\n      </View>\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  pedalBody: {\n    flex: 1,\n    backgroundColor: '#4368a3',\n    margin: 10,\n    borderRadius: 20,\n    borderWidth: 4,\n    borderColor: '#283f63',\n    padding: 10,\n    justifyContent: 'space-between',\n    shadowColor: '#000',\n    shadowOffset: { width: 0, height: 10 },\n    shadowOpacity: 0.5,\n    shadowRadius: 10,\n    elevation: 10,\n  },\n  header: {\n    alignItems: 'center',\n    marginTop: 20,\n  },\n  brand: {\n    fontSize: 16,\n    fontWeight: 'bold',\n    color: '#fff',\n    letterSpacing: 2,\n  },\n  model: {\n    fontSize: 32,\n    fontWeight: '900',\n    color: '#fff',\n    fontStyle: 'italic',\n  },\n  controlsRow: {\n    flexDirection: 'row',\n    justifyContent: 'space-around',\n    alignItems: 'center',\n  },\n  footer: {\n    alignItems: 'center',\n    marginBottom: 40,\n  },\n  switchContainer: {\n    alignItems: 'center',\n    gap: 10,\n  },\n  led: {\n    width: 15,\n    height: 15,\n    borderRadius: 8,\n    borderWidth: 1,\n    borderColor: '#000',\n    marginBottom: 10,\n    shadowColor: '#f00',\n    shadowOffset: { width: 0, height: 0 },\n    shadowOpacity: 0.8,\n    shadowRadius: 5,\n  },\n  stompSwitch: {\n    width: 30,\n    height: 30,\n    borderRadius: 30,\n    backgroundColor: '#c0c0c0',\n    borderWidth: 2,\n    borderColor: '#888',\n    justifyContent: 'center',\n    alignItems: 'center',\n    elevation: 5,\n  },\n  stompInner: {\n    width: 20,\n    height: 20,\n    borderRadius: 20,\n    backgroundColor: '#e0e0e0',\n    borderWidth: 1,\n    borderColor: '#aaa',\n  },\n  switchLabel: {\n    fontWeight: 'bold',\n    color: '#fff',\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/PedalBoard/curves.ts",
    "content": "import { AudioContext, AudioBuffer } from 'react-native-audio-api';\n\nexport function makeDistortionCurve(k: number, sampleRate: number) {\n  const curve = new Float32Array(sampleRate);\n  const deg = Math.PI / 180;\n\n  for (let i = 0; i < sampleRate; ++i) {\n    const x = (i * 2) / sampleRate - 1;\n    curve[i] = ((3 + k) * x * 20 * deg) / (Math.PI + k * Math.abs(x));\n  }\n  return curve;\n}\n\nexport function makeReverbCurve(\n  duration: number,\n  context: AudioContext,\n): AudioBuffer {\n  const length = Math.floor(context.sampleRate * duration);\n  const impulse = context.createBuffer(2, length, context.sampleRate);\n  for (let channel = 0; channel < impulse.numberOfChannels; channel++) {\n    const impulseData = impulse.getChannelData(channel);\n    for (let i = 0; i < length; i++) {\n      impulseData[i] = (Math.random() * 2 - 1) * Math.pow(1 - i / length, 2);\n    }\n  }\n  return impulse;\n}\n\nexport function makeEchoCurve(\n  delayTime: number,\n  context: AudioContext,\n): AudioBuffer {\n  const length = Math.floor(context.sampleRate * delayTime);\n  const echoBuffer = context.createBuffer(1, length, context.sampleRate);\n  const echoData = echoBuffer.getChannelData(0);\n  echoData[length * 0.3] = 0.6;\n  echoData[length * 0.7] = 0.2;\n  return echoBuffer;\n}\n"
  },
  {
    "path": "apps/common-app/src/demos/Record/ControlPanel.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet } from 'react-native';\n\nimport Animated from 'react-native-reanimated';\nimport PauseButton from './PauseButton';\nimport RecordButton from './RecordButton';\nimport { RecordingState } from './types';\n\ninterface ControlPanelProps {\n  state: RecordingState;\n  onToggleState: (action: RecordingState) => void;\n}\n\nconst ControlPanel: FC<ControlPanelProps> = ({ state, onToggleState }) => {\n  return (\n    <Animated.View style={styles.controlPanelView}>\n      <PauseButton\n        state={state}\n        onPress={() => {\n          onToggleState(RecordingState.Paused);\n        }}\n      />\n      <RecordButton state={state} onToggleState={onToggleState} />\n    </Animated.View>\n  );\n};\n\nexport default ControlPanel;\n\nconst styles = StyleSheet.create({\n  controlPanelView: {\n    alignItems: 'center',\n    justifyContent: 'center',\n    flexDirection: 'row',\n    gap: 12,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/Record/PauseButton.tsx",
    "content": "import React, { FC } from 'react';\nimport { Pressable, StyleSheet, View } from 'react-native';\nimport Animated, {\n  useAnimatedProps,\n  withSpring,\n} from 'react-native-reanimated';\nimport { RecordingState } from './types';\n\ninterface PauseButtonProps {\n  state: RecordingState;\n  onPress: () => void;\n}\n\nconst PauseButton: FC<PauseButtonProps> = ({ state, onPress }) => (\n  <View>\n    <Pressable onPress={onPress} style={styles.pressable}>\n      {({ pressed }) => <PauseButtonInner state={state} pressed={pressed} />}\n    </Pressable>\n  </View>\n);\n\nexport default PauseButton;\n\nconst size = 24;\nconst innerSize = size * 0.3;\n\nconst PauseButtonInner: FC<{\n  pressed: boolean;\n  state: RecordingState;\n}> = ({ pressed, state }) => {\n  const leftViewStyle = useAnimatedProps(() => {\n    return {\n      transform: [\n        {\n          translateX: withSpring(pressed ? 6 : 0),\n        },\n      ],\n    };\n  });\n\n  const rightViewStyle = useAnimatedProps(() => {\n    return {\n      transform: [\n        {\n          translateX: withSpring(pressed ? -6 : 0),\n        },\n      ],\n    };\n  });\n\n  const containerStyle = useAnimatedProps(() => {\n    return {\n      transform: [\n        {\n          scale: withSpring(state === RecordingState.Recording ? 1 : 0),\n        },\n      ],\n    };\n  });\n\n  return (\n    <Animated.View style={[styles.container, containerStyle]}>\n      <Animated.View style={[styles.bar, leftViewStyle]} />\n      <Animated.View style={[styles.bar, rightViewStyle]} />\n    </Animated.View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  pressable: {\n    position: 'absolute',\n    left: -size,\n    top: -size / 2,\n  },\n  container: {\n    width: size,\n    height: size,\n    flexDirection: 'row',\n    alignItems: 'center',\n    justifyContent: 'center',\n    gap: innerSize - 2,\n  },\n  bar: {\n    width: innerSize,\n    height: size,\n    backgroundColor: '#d4d4d4',\n    borderRadius: 2,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/Record/PlaybackVisualization.tsx",
    "content": "import {\n  Canvas,\n  Group,\n  Path,\n  Skia,\n  useCanvasRef,\n  useCanvasSize,\n} from '@shopify/react-native-skia';\nimport React, { useMemo } from 'react';\nimport { StyleSheet, View } from 'react-native';\nimport { AudioBuffer } from 'react-native-audio-api';\nimport { SharedValue, useDerivedValue } from 'react-native-reanimated';\n\ninterface PlaybackVisualizationProps {\n  buffer: AudioBuffer | null;\n  currentPositionSeconds: SharedValue<number>;\n  durationSeconds: number;\n}\n\nconst PlaybackVisualization: React.FC<PlaybackVisualizationProps> = (props) => {\n  const { buffer, currentPositionSeconds, durationSeconds } = props;\n  const canvasRef = useCanvasRef();\n  const { size } = useCanvasSize(canvasRef);\n\n  const bufferWaveform = useMemo(() => {\n    const height = size.height;\n    const width = size.width;\n\n    if (!buffer || width === 0 || height === 0) {\n      return [];\n    }\n\n    const channelData = buffer.getChannelData(0);\n    const barWidth = 2;\n    const barGap = 2;\n\n    const totalBars = Math.floor(width / (barWidth + barGap));\n    const samplesPerBar = Math.floor(channelData.length / totalBars);\n    let maxValue = 0;\n\n    const waveform = new Array(totalBars).fill(0);\n\n    for (let i = 0; i < channelData.length; i++) {\n      maxValue = Math.max(maxValue, Math.abs(channelData[i]));\n    }\n\n    for (let i = 0; i < totalBars; i++) {\n      const startSample = i * samplesPerBar;\n      const endSample = startSample + samplesPerBar;\n      let max = 0;\n\n      for (let j = startSample; j < endSample; j++) {\n        max = Math.max(max, Math.abs(channelData[j]));\n      }\n\n      const barHeight = (max / maxValue) * height * 0.8;\n      const x = i * (barWidth + barGap);\n      const y = (height - barHeight) / 2;\n\n      waveform[i] = { x, y, width: barWidth, height: barHeight };\n    }\n\n    return waveform;\n  }, [buffer, size.height, size.width]);\n\n  const bgPath = useMemo(() => {\n    const path = Skia.Path.Make();\n\n    bufferWaveform.forEach((bar) => {\n      path.moveTo(bar.x, bar.y);\n      path.lineTo(bar.x, bar.y + bar.height);\n    });\n\n    path.close();\n    return path;\n  }, [bufferWaveform]);\n\n  const progressPath = useDerivedValue(() => {\n    const path = Skia.Path.Make();\n\n    const totalBars = bufferWaveform.length;\n    const currentBar = Math.floor(\n      (currentPositionSeconds.value / durationSeconds) * totalBars\n    );\n\n    for (let i = 0; i < currentBar; i++) {\n      const bar = bufferWaveform[i];\n      path.moveTo(bar.x, bar.y);\n      path.lineTo(bar.x, bar.y + bar.height);\n    }\n\n    path.close();\n    return path;\n  }, [bufferWaveform, buffer]);\n\n  if (!buffer) {\n    return null;\n  }\n\n  return (\n    <View style={styles.container}>\n      <Canvas ref={canvasRef} style={styles.canvas}>\n        <Group>\n          <Path\n            path={bgPath}\n            color=\"rgba(255, 255, 255, 0.2)\"\n            style=\"stroke\"\n            strokeWidth={2}\n            strokeCap=\"round\"\n          />\n          <Path\n            path={progressPath}\n            color=\"#00a9f0\"\n            style=\"stroke\"\n            strokeWidth={2}\n            strokeCap=\"round\"\n          />\n        </Group>\n      </Canvas>\n    </View>\n  );\n};\n\nexport default PlaybackVisualization;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    maxHeight: 250,\n    width: '100%',\n    backgroundColor: 'rgba(0, 0, 0, 0.15)',\n    flexDirection: 'column',\n  },\n  canvas: {\n    flex: 1,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/Record/Record.tsx",
    "content": "import React, { FC, useCallback, useEffect, useState } from 'react';\nimport {\n  AudioBuffer,\n  AudioManager,\n  RecordingNotificationManager,\n} from 'react-native-audio-api';\n\nimport { Alert, StyleSheet, View } from 'react-native';\nimport { Container } from '../../components';\n\nimport { Easing, useSharedValue, withTiming } from 'react-native-reanimated';\nimport { audioRecorder as Recorder, audioContext } from '../../singletons';\nimport ControlPanel from './ControlPanel';\nimport PlaybackVisualization from './PlaybackVisualization';\nimport RecordingTime from './RecordingTime';\nimport RecordingVisualization from './RecordingVisualization';\nimport Status from './Status';\nimport { RecordingState } from './types';\n\nconst Record: FC = () => {\n  const [state, setState] = useState<RecordingState>(RecordingState.Idle);\n  const [hasPermissions, setHasPermissions] = useState<boolean>(false);\n  const [recordedBuffer, setRecordedBuffer] = useState<AudioBuffer | null>(\n    null\n  );\n  const currentPositionSV = useSharedValue(0);\n\n  const updateNotification = (paused: boolean) => {\n    RecordingNotificationManager.show({\n      paused,\n    });\n  };\n\n  const setupNotification = (paused: boolean) => {\n    RecordingNotificationManager.show({\n      title: 'Recording Demo',\n      contentText: paused ? 'Paused recording' : 'Recording...',\n      paused,\n      smallIconResourceName: 'logo',\n      pauseIconResourceName: 'pause',\n      resumeIconResourceName: 'resume',\n      color: 0xff6200,\n    });\n  };\n\n  const onStartRecording = useCallback(async () => {\n    if (state !== RecordingState.Idle) {\n      return;\n    }\n\n    setState(RecordingState.Loading);\n\n    if (!hasPermissions) {\n      const permissionStatus = await AudioManager.requestRecordingPermissions();\n\n      if (permissionStatus !== 'Granted') {\n        Alert.alert('Error', \"Recording permissions are no't granted\");\n        return;\n      }\n\n      setHasPermissions(true);\n    }\n\n    let success = false;\n    AudioManager.setAudioSessionOptions({\n      iosCategory: 'playAndRecord',\n      iosMode: 'default',\n      iosOptions: ['defaultToSpeaker', 'allowBluetoothA2DP'],\n    });\n\n    try {\n      success = await AudioManager.setAudioSessionActivity(true);\n    } catch (error) {\n      console.error(error);\n      Alert.alert('Error', 'Failed to activate audio session for recording.');\n      setState(RecordingState.Idle);\n      return;\n    }\n\n    if (!success) {\n      Alert.alert('Error', 'Failed to activate audio session for recording.');\n      setState(RecordingState.Idle);\n      return;\n    }\n\n    const result = Recorder.start({\n      fileNameOverride: `overridden_name_${Date.now()}`,\n    });\n\n    setupNotification(false);\n\n    if (result.status === 'success') {\n      setState(RecordingState.Recording);\n      return;\n    }\n\n    console.log('Recording start error:', result);\n    Alert.alert('Error', `Failed to start recording: ${result.message}`);\n    setState(RecordingState.Idle);\n  }, [state, hasPermissions]);\n\n  const onPauseRecording = useCallback(() => {\n    Recorder.pause();\n    updateNotification(true);\n    setState(RecordingState.Paused);\n  }, []);\n\n  const onResumeRecording = useCallback(() => {\n    Recorder.resume();\n    updateNotification(false);\n    setState(RecordingState.Recording);\n  }, []);\n\n  const onStopRecording = useCallback(async () => {\n    const info = Recorder.stop();\n    RecordingNotificationManager.hide();\n    setState(RecordingState.Loading);\n\n    if (info.status !== 'success') {\n      Alert.alert('Error', `Failed to stop recording: ${info.message}`);\n      setRecordedBuffer(null);\n      setState(RecordingState.Idle);\n      return;\n    }\n\n    const audioBuffer = await audioContext.decodeAudioData(info.paths[0]);\n    setRecordedBuffer(audioBuffer);\n    setState(RecordingState.ReadyToPlay);\n    currentPositionSV.value = 0;\n  }, []);\n\n  const onPlayRecording = useCallback(() => {\n    if (state !== RecordingState.ReadyToPlay) {\n      return;\n    }\n\n    if (!recordedBuffer) {\n      Alert.alert('Error', 'No recorded audio to play.');\n      return;\n    }\n\n    const source = audioContext.createBufferSource();\n    source.buffer = recordedBuffer;\n    source.connect(audioContext.destination);\n    source.start(audioContext.currentTime);\n\n    source.onEnded = () => {\n      setState(RecordingState.Idle);\n    };\n\n    setTimeout(() => {\n      currentPositionSV.value = withTiming(recordedBuffer.duration, {\n        duration: recordedBuffer.duration * 1000,\n        easing: Easing.linear,\n      });\n    }, 100);\n\n    setState(RecordingState.Playing);\n  }, [state, recordedBuffer, currentPositionSV]);\n\n  const onToggleState = useCallback(\n    (action: RecordingState) => {\n      if (state === RecordingState.Paused) {\n        if (action === RecordingState.Recording) {\n          onResumeRecording();\n          return;\n        }\n      }\n\n      if (action === RecordingState.Recording) {\n        onStartRecording();\n        return;\n      }\n\n      if (action === RecordingState.Paused) {\n        onPauseRecording();\n        return;\n      }\n\n      if (action === RecordingState.Idle) {\n        if (state === RecordingState.Recording) {\n          onStopRecording();\n        } else if (state === RecordingState.Playing) {\n          setState(RecordingState.Idle);\n        }\n        return;\n      }\n\n      if (action === RecordingState.ReadyToPlay) {\n        onStopRecording();\n        return;\n      }\n\n      if (action === RecordingState.Playing) {\n        onPlayRecording();\n      }\n    },\n    [\n      state,\n      onStartRecording,\n      onPauseRecording,\n      onStopRecording,\n      onResumeRecording,\n      onPlayRecording,\n    ]\n  );\n\n  useEffect(() => {\n    (async () => {\n      const permissionStatus = await AudioManager.checkRecordingPermissions();\n\n      if (permissionStatus === 'Granted') {\n        setHasPermissions(true);\n      }\n    })();\n  }, []);\n\n  useEffect(() => {\n    const pauseListener = RecordingNotificationManager.addEventListener(\n      'recordingNotificationPause',\n      () => {\n        console.log('Notification pause action received');\n        onPauseRecording();\n      }\n    );\n\n    const resumeListener = RecordingNotificationManager.addEventListener(\n      'recordingNotificationResume',\n      () => {\n        console.log('Notification resume action received');\n        onResumeRecording();\n      }\n    );\n\n    return () => {\n      pauseListener.remove();\n      resumeListener.remove();\n      RecordingNotificationManager.hide();\n    };\n  }, [onPauseRecording, onResumeRecording]);\n\n  useEffect(() => {\n    Recorder.enableFileOutput({ rotateIntervalBytes: 1_000_000 });\n\n    return () => {\n      Recorder.disableFileOutput();\n      Recorder.stop();\n      AudioManager.setAudioSessionActivity(false);\n      RecordingNotificationManager.hide();\n    };\n  }, []);\n\n  return (\n    <Container disablePadding>\n      <Status state={state} />\n      <View style={styles.spacerM} />\n      {[RecordingState.Playing, RecordingState.ReadyToPlay].includes(state) ? (\n        <>\n          <PlaybackVisualization\n            buffer={recordedBuffer}\n            currentPositionSeconds={currentPositionSV}\n            durationSeconds={recordedBuffer?.duration || 0}\n          />\n        </>\n      ) : (\n        <>\n          <RecordingTime state={state} />\n          <View style={styles.spacerS} />\n          <RecordingVisualization state={state} />\n        </>\n      )}\n      <View style={styles.spacerM} />\n      <ControlPanel state={state} onToggleState={onToggleState} />\n    </Container>\n  );\n};\n\nexport default Record;\n\nconst styles = StyleSheet.create({\n  spacerM: { height: 24 },\n  spacerS: { height: 12 },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/Record/RecordButton.tsx",
    "content": "import React, { FC, useCallback } from 'react';\nimport { Pressable, StyleSheet } from 'react-native';\nimport Animated, {\n  useAnimatedProps,\n  withRepeat,\n  withSequence,\n  withSpring,\n  withTiming,\n} from 'react-native-reanimated';\nimport Svg, { Path } from 'react-native-svg';\n\nimport { RecordingState } from './types';\n\ninterface RecordButtonProps {\n  state: RecordingState;\n  onToggleState: (action: RecordingState) => void;\n}\n\nconst RecordButton: FC<RecordButtonProps> = ({ state, onToggleState }) => {\n  const onPress = useCallback(() => {\n    if ([RecordingState.Idle, RecordingState.Paused].includes(state)) {\n      onToggleState(RecordingState.Recording);\n      return;\n    }\n\n    if (state === RecordingState.Recording) {\n      onToggleState(RecordingState.ReadyToPlay);\n      return;\n    }\n\n    if (state === RecordingState.ReadyToPlay) {\n      onToggleState(RecordingState.Playing);\n      return;\n    }\n\n    if (state === RecordingState.Playing) {\n      onToggleState(RecordingState.Idle);\n    }\n  }, [onToggleState, state]);\n\n  return (\n    <Pressable onPress={onPress}>\n      {({ pressed }) => <RecordButtonInner pressed={pressed} state={state} />}\n    </Pressable>\n  );\n};\n\nexport default RecordButton;\n\ntype OuterStyle = {\n  borderColor: string;\n  transform: {\n    scale: number;\n  }[];\n};\n\nconst RecordButtonInner: FC<{\n  pressed: boolean;\n  state: RecordingState;\n}> = ({ pressed, state }) => {\n  const outerViewStyle = useAnimatedProps((): OuterStyle => {\n    if (state === RecordingState.Loading) {\n      return {\n        borderColor: '#d4d4d4',\n        transform: [\n          {\n            scale: withRepeat(\n              withSequence(withSpring(1), withSpring(0.3)),\n              -1,\n              true\n            ),\n          },\n        ],\n      };\n    }\n\n    return {\n      borderColor: withTiming(\n        state === RecordingState.ReadyToPlay ? '#ff6259' : 'white'\n      ),\n      transform: [\n        {\n          scale: pressed ? withSpring(0.9) : withSpring(1),\n        },\n      ],\n    };\n  });\n\n  const innerViewStyle = useAnimatedProps(() => {\n    let size = 40;\n\n    if (\n      state === RecordingState.Recording ||\n      state === RecordingState.Playing\n    ) {\n      size = 32;\n    }\n\n    if (state === RecordingState.ReadyToPlay) {\n      size = 0;\n    }\n\n    const transform = (() => {\n      if (state === RecordingState.Loading) {\n        return [\n          {\n            scale: withRepeat(\n              withSequence(withSpring(1), withSpring(5)),\n              -1,\n              true\n            ),\n          },\n        ];\n      }\n\n      if (pressed) {\n        return [\n          {\n            scale: withSpring(1.6),\n          },\n        ];\n      }\n\n      return [\n        {\n          scale: withSpring(1),\n        },\n      ];\n    })();\n\n    return {\n      borderRadius:\n        state === RecordingState.Recording || state === RecordingState.Playing\n          ? withTiming(4)\n          : withTiming(20),\n      width: withTiming(size),\n      height: withTiming(size),\n      transform,\n    };\n  });\n\n  const playStyle = useAnimatedProps(() => {\n    const scale = state === RecordingState.ReadyToPlay ? 1 : 0;\n    return {\n      transform: [\n        {\n          scale: withTiming(scale),\n        },\n      ],\n    };\n  });\n\n  return (\n    <Animated.View style={[styles.innerContainer, outerViewStyle]}>\n      <Animated.View style={[styles.mainIcon, innerViewStyle]} />\n      <Animated.View style={[styles.playIconContainer, playStyle]}>\n        <Svg width={72} height={72} viewBox=\"0 0 24 24\">\n          <Path\n            d=\"M10 8 L16 12 L10 16 Z\"\n            fill=\"#d4d4d4\"\n            stroke=\"#d4d4d4\"\n            strokeWidth={4}\n            strokeLinejoin=\"round\" // <-- rounded corners\n          />\n        </Svg>\n      </Animated.View>\n    </Animated.View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  innerContainer: {\n    width: 60,\n    height: 60,\n    borderRadius: 30,\n    borderWidth: 2,\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  mainIcon: {\n    position: 'absolute',\n    width: 40,\n    height: 40,\n    borderRadius: 20,\n    backgroundColor: '#ff6259',\n  },\n  playIconContainer: {\n    position: 'absolute',\n    top: -8,\n    left: -8,\n    overflow: 'hidden',\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/Record/RecordingTime.tsx",
    "content": "import React, { useEffect } from 'react';\nimport { StyleSheet, TextInput } from 'react-native';\nimport Animated, {\n  useAnimatedProps,\n  useSharedValue,\n} from 'react-native-reanimated';\n\nimport { audioRecorder as Recorder } from '../../singletons';\nimport { colors } from '../../styles';\nimport { RecordingState } from './types';\n\nconst AnimatedTextInput = Animated.createAnimatedComponent(TextInput);\n\ninterface RecordingTimeProps {\n  state: RecordingState;\n}\n\nconst RecordingTime: React.FC<RecordingTimeProps> = ({ state }) => {\n  const durationStringSV = useSharedValue('00:00:000');\n  const isMountedSV = useSharedValue(true);\n\n  useEffect(() => {\n    isMountedSV.value = true;\n    if (![RecordingState.Recording, RecordingState.Paused].includes(state)) {\n      durationStringSV.value = '00:00:00';\n      return;\n    }\n\n    const interval = setInterval(() => {\n      if (!isMountedSV.value) {\n        return;\n      }\n\n      const elapsedSeconds = Recorder.getCurrentDuration();\n\n      const minutes = Math.floor((elapsedSeconds % 3600) / 60)\n        .toString()\n        .padStart(2, '0');\n      const seconds = Math.floor(elapsedSeconds % 60)\n        .toString()\n        .padStart(2, '0');\n      const milliseconds = Math.floor((elapsedSeconds % 1) * 1000)\n        .toString()\n        .padStart(3, '0');\n\n      durationStringSV.value = `${minutes}:${seconds}:${milliseconds}`;\n    }, 100);\n\n    return () => {\n      isMountedSV.value = false;\n      clearInterval(interval);\n    };\n  }, [state, durationStringSV, isMountedSV]);\n\n  const animatedText = useAnimatedProps(() => {\n    return {\n      text: durationStringSV.value,\n      defaultValue: '00:00:000',\n    };\n  });\n\n  return (\n    <AnimatedTextInput\n      editable={false}\n      animatedProps={animatedText}\n      style={styles.text}\n    />\n  );\n};\n\nexport default RecordingTime;\n\nconst styles = StyleSheet.create({\n  text: {\n    color: colors.gray,\n    fontSize: 48,\n    width: '100%',\n    textAlign: 'center',\n    fontFamily: 'courier-new',\n    fontWeight: 'bold',\n    fontVariant: ['tabular-nums'],\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/Record/RecordingVisualization.tsx",
    "content": "import {\n  Canvas,\n  Group,\n  Path,\n  Skia,\n  useCanvasRef,\n  useCanvasSize,\n} from '@shopify/react-native-skia';\nimport React, { useEffect, useMemo } from 'react';\nimport { Dimensions, StyleSheet, View } from 'react-native';\nimport {\n  cancelAnimation,\n  Easing,\n  SharedValue,\n  useDerivedValue,\n  useSharedValue,\n  withRepeat,\n  withTiming,\n} from 'react-native-reanimated';\n\nimport { Spacer } from '../../components';\nimport { audioRecorder as Recorder } from '../../singletons';\nimport constants from './constants';\nimport TimeStream from './TimeStream';\nimport { RecordingState } from './types';\n\nconst { width: windowWidth } = Dimensions.get('window');\n\nconst defaultNumBars = Math.floor(\n  windowWidth / (constants.barWidth + constants.barGap)\n);\n\nconst historyNumBars = Math.floor(\n  windowWidth / (constants.historyBarWidth + constants.historyBarGap)\n);\n\nfunction getInitialWaveform() {\n  return new Array(defaultNumBars * 2).fill(-1);\n}\n\nfunction getInitialHistory() {\n  return new Array(historyNumBars * 10).fill(-1);\n}\n\ninterface RecordingVisualizationProps {\n  state: RecordingState;\n}\n\ninterface DrawDefaultWaveformParams {\n  normalized: number;\n  size: { width: number; height: number };\n  barHeights: number[];\n  translateX: SharedValue<number>;\n  lastIndex: SharedValue<number>;\n  numBars: number;\n}\n\ninterface DrawHistoryWaveformParams {\n  normalized: number;\n  lifetimeSize: { width: number; height: number };\n  history: number[];\n  historyHead: SharedValue<number>;\n  durationMS: SharedValue<number>;\n  historyMidpointMS: SharedValue<number>;\n}\n\nfunction drawDefaultWaveform(params: DrawDefaultWaveformParams) {\n  'worklet';\n  const { normalized, size, barHeights, translateX, lastIndex, numBars } =\n    params;\n\n  const value = normalized * size.height * 0.8;\n  let currentIndex =\n    barHeights.length / 2 -\n    1 +\n    Math.floor(-translateX.value / (constants.barWidth + constants.barGap));\n\n  barHeights[currentIndex] = value;\n\n  if (lastIndex.value !== -1) {\n    for (let i = lastIndex.value + 1; i < currentIndex; i++) {\n      const vInter =\n        barHeights[lastIndex.value] +\n        ((value - barHeights[lastIndex.value]) * (i - lastIndex.value)) /\n          (currentIndex - lastIndex.value);\n      barHeights[i] = vInter;\n      if (i > numBars / 2) {\n        barHeights[i - numBars / 2] = vInter;\n      }\n    }\n  }\n\n  if (currentIndex > numBars / 2) {\n    barHeights[currentIndex - numBars / 2] = value;\n  }\n\n  for (let i = 1; i <= 4; i++) {\n    barHeights[(currentIndex + i) % barHeights.length] = -1;\n  }\n\n  lastIndex.value = currentIndex;\n  return barHeights;\n}\n\nfunction drawHistoryWaveform(params: DrawHistoryWaveformParams) {\n  'worklet';\n\n  const {\n    history,\n    normalized,\n    lifetimeSize,\n    historyHead,\n    durationMS,\n    historyMidpointMS,\n  } = params;\n\n  const value = normalized * lifetimeSize.height * 0.8;\n  history[historyHead.value] = value;\n  historyHead.value += 1;\n\n  // downsample if needed\n  if (historyHead.value >= history.length) {\n    const halfLength = history.length / 2;\n\n    for (let i = 0; i < halfLength; i++) {\n      history[i] = Math.max(history[2 * i], history[2 * i + 1]);\n    }\n\n    historyHead.value = halfLength;\n    historyMidpointMS.value = durationMS.value;\n  }\n\n  return history;\n}\n\nconst RecordingVisualization: React.FC<RecordingVisualizationProps> = ({\n  state,\n}) => {\n  const canvasRef = useCanvasRef();\n  const lifetimeCanvasRef = useCanvasRef();\n\n  const { size } = useCanvasSize(canvasRef);\n  const { size: lifetimeSize } = useCanvasSize(lifetimeCanvasRef);\n  const barHeights = useSharedValue<number[]>(getInitialWaveform());\n\n  const history = useSharedValue<number[]>(getInitialHistory());\n  const historyHead = useSharedValue(0);\n  const historyMidpointMS = useSharedValue(0);\n  const historyRenderer = useSharedValue<number[]>(\n    new Array(historyNumBars).fill(-1)\n  );\n\n  const translateX = useSharedValue(0);\n  const lastIndex = useSharedValue(-1);\n  const durationMS = useSharedValue(0);\n\n  const numBars = useMemo(() => {\n    if (size.width === 0) {\n      return 0;\n    }\n\n    return Math.ceil(size.width / (constants.barWidth + constants.barGap)) * 2;\n  }, [size.width]);\n\n  const waveformPath = useDerivedValue(() => {\n    const path = Skia.Path.Make();\n    const currentHeights = barHeights.value;\n    const canvasHeight = size.height;\n\n    if (currentHeights.length === 0 || canvasHeight === 0) {\n      return path;\n    }\n\n    currentHeights.forEach((height, index) => {\n      if (height < 0) {\n        return;\n      }\n\n      const x =\n        index * (constants.barWidth + constants.barGap) +\n        constants.barWidth / 2;\n      const y1 = (canvasHeight - height) / 2;\n      const y2 = (canvasHeight + height) / 2;\n\n      path.moveTo(x, y1);\n      path.lineTo(x, y2);\n    });\n\n    return path;\n  }, [size, numBars]);\n\n  const historyWaveformPath = useDerivedValue(() => {\n    const path = Skia.Path.Make();\n    const canvasHeight = lifetimeSize.height;\n    const values = historyRenderer.value;\n\n    if (historyHead.value < historyNumBars) {\n      // render as it is\n      for (let i = 0; i < historyHead.value; i++) {\n        values[i] = history.value[i];\n\n        if (values[i] < 0) {\n          continue;\n        }\n\n        const x =\n          i * (constants.historyBarWidth + constants.historyBarGap) +\n          constants.historyBarWidth / 2;\n        const y1 = (canvasHeight - values[i]) / 2;\n        const y2 = (canvasHeight + values[i]) / 2;\n\n        path.moveTo(x, y1);\n        path.lineTo(x, y2);\n      }\n\n      return path;\n    }\n\n    const ratio = historyHead.value / historyNumBars;\n\n    // render rest\n    for (let i = 0; i < historyNumBars; i++) {\n      let maxVal = -1;\n      const startIndex = Math.floor(i * ratio);\n      const endIndex = Math.floor((i + 1) * ratio);\n\n      for (let j = startIndex; j < endIndex; j++) {\n        if (history.value[j] > maxVal) {\n          maxVal = history.value[j];\n        }\n      }\n\n      values[i] = maxVal;\n\n      if (values[i] < 0) {\n        continue;\n      }\n\n      const x =\n        i * (constants.historyBarWidth + constants.historyBarGap) +\n        constants.historyBarWidth / 2;\n      const y1 = (canvasHeight - values[i]) / 2;\n      const y2 = (canvasHeight + values[i]) / 2;\n\n      path.moveTo(x, y1);\n      path.lineTo(x, y2);\n    }\n\n    return path;\n  }, [lifetimeSize]);\n\n  useEffect(() => {\n    if (numBars <= 0) {\n      return;\n    }\n\n    if (barHeights.value.length !== numBars) {\n      barHeights.value = new Array(numBars).fill(-1);\n    }\n  }, [numBars, barHeights]);\n\n  useEffect(() => {\n    if (numBars <= 0) {\n      return () => {};\n    }\n\n    Recorder.onAudioReady(\n      {\n        sampleRate: constants.sampleRate,\n        channelCount: 1,\n        bufferLength:\n          (constants.updateIntervalMS / 1000.0) * constants.sampleRate,\n      },\n      (event) => {\n        durationMS.value += (event.numFrames / constants.sampleRate) * 1000;\n        const { buffer } = event;\n        const audioData = buffer.getChannelData(0);\n\n        let maxValue = 0;\n        for (let i = 0; i < audioData.length; i++) {\n          const val = Math.abs(audioData[i]);\n          if (val > maxValue) maxValue = val;\n        }\n\n        const db = maxValue > 0 ? 20 * Math.log10(maxValue) : constants.minDb;\n        let normalized =\n          (db - constants.minDb) / (constants.maxDb - constants.minDb);\n        normalized = Math.max(0, Math.min(1, normalized));\n\n        barHeights.modify(<T extends number[]>(heights: T) => {\n          'worklet';\n\n          return drawDefaultWaveform({\n            normalized,\n            size,\n            barHeights: heights,\n            translateX,\n            lastIndex,\n            numBars,\n          }) as T;\n        });\n\n        history.modify(<T extends number[]>(hist: T) => {\n          'worklet';\n\n          return drawHistoryWaveform({\n            normalized,\n            lifetimeSize,\n            history: hist,\n            historyHead,\n            durationMS,\n            historyMidpointMS,\n          }) as T;\n        });\n      }\n    );\n\n    return () => {\n      Recorder.clearOnAudioReady();\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [numBars, size, lifetimeSize]);\n\n  useEffect(() => {\n    if (state === RecordingState.Recording) {\n      const animationTarget = -size.width;\n      const animationDuration = 1000 * (size.width / constants.pixelsPerSecond);\n\n      translateX.value = withRepeat(\n        withTiming(animationTarget, {\n          duration: animationDuration,\n          easing: Easing.linear,\n        }),\n        -1, // Infinite loop\n        false // No reverse\n      );\n    } else if (state === RecordingState.Paused) {\n      cancelAnimation(translateX);\n\n      const currentIndexOffset =\n        -translateX.value / (constants.barWidth + constants.barGap);\n\n      const newBarHeights = [...barHeights.value];\n\n      for (let i = 0; i < newBarHeights.length; i++) {\n        newBarHeights[i] =\n          newBarHeights[\n            (i + Math.floor(currentIndexOffset)) % newBarHeights.length\n          ];\n      }\n\n      barHeights.value = newBarHeights;\n      translateX.value = 0;\n    } else {\n      cancelAnimation(translateX);\n      translateX.value = 0;\n      barHeights.value = Array(numBars).fill(-1);\n      historyRenderer.value = Array(historyNumBars).fill(-1);\n      history.value = Array(historyNumBars * 10).fill(-1);\n      historyHead.value = 0;\n      historyMidpointMS.value = 0;\n      durationMS.value = 0;\n      lastIndex.value = -1;\n    }\n  }, [\n    state,\n    size,\n    translateX,\n    barHeights,\n    numBars,\n    durationMS,\n    lastIndex,\n    history,\n    historyHead,\n    historyMidpointMS,\n    historyRenderer,\n  ]);\n\n  const transformPath = useDerivedValue(() => [\n    {\n      translateX: translateX.value,\n    },\n  ]);\n\n  return (\n    <>\n      <View style={styles.container}>\n        <Canvas style={styles.canvas} ref={canvasRef}>\n          <Group transform={transformPath}>\n            <Path\n              path={waveformPath}\n              style=\"stroke\"\n              strokeWidth={constants.barWidth}\n              strokeCap=\"round\"\n              color=\"#ff6259\"\n            />\n          </Group>\n        </Canvas>\n      </View>\n      <View style={styles.timeStreamContainer}>\n        <TimeStream\n          isRecording={state === RecordingState.Recording}\n          durationMS={durationMS}\n        />\n      </View>\n      <Spacer.Vertical size={32} />\n      <View style={styles.lifetimeContainer}>\n        <Canvas style={styles.canvas} ref={lifetimeCanvasRef}>\n          <Group>\n            <Path\n              path={historyWaveformPath}\n              style=\"stroke\"\n              strokeWidth={constants.historyBarWidth}\n              strokeCap=\"round\"\n              color=\"#ff6259\"\n            />\n          </Group>\n        </Canvas>\n      </View>\n    </>\n  );\n};\nexport default RecordingVisualization;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    width: '100%',\n    backgroundColor: 'rgba(0, 0, 0, 0.15)',\n    flexDirection: 'column',\n  },\n  canvas: {\n    flex: 1,\n  },\n  timeStreamContainer: {\n    height: 20,\n    marginTop: 8,\n  },\n  lifetimeContainer: {\n    marginTop: 16,\n    height: 75,\n    width: '100%',\n    backgroundColor: 'rgba(0, 0, 0, 0.15)',\n    flexDirection: 'column',\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/Record/Status.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { RecordingState } from './types';\n\ninterface StatusProps {\n  state: RecordingState;\n}\n\nconst Status: FC<StatusProps> = ({ state }) => {\n  let statusText = '';\n\n  if (state === RecordingState.Idle) {\n    statusText = 'Idle';\n  } else if (state === RecordingState.Loading) {\n    statusText = 'Loading...';\n  } else if (state === RecordingState.Recording) {\n    statusText = 'Recording...';\n  } else if (state === RecordingState.Paused) {\n    statusText = 'Paused';\n  } else if (state === RecordingState.ReadyToPlay) {\n    statusText = 'Ready to Play';\n  } else if (state === RecordingState.Playing) {\n    statusText = 'Playing...';\n  }\n\n  return (\n    <View style={styles.statusView}>\n      <Text style={styles.statusText}>{statusText}</Text>\n    </View>\n  );\n};\n\nexport default Status;\n\nconst styles = StyleSheet.create({\n  statusView: {\n    marginTop: 40,\n    alignItems: 'center',\n  },\n  statusText: {\n    fontSize: 18,\n    color: 'white',\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/Record/TimeStream.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { Dimensions, StyleSheet, Text, View } from 'react-native';\nimport Animated, {\n  cancelAnimation,\n  Easing,\n  SharedValue,\n  useAnimatedStyle,\n  useSharedValue,\n  withTiming,\n} from 'react-native-reanimated';\nimport constants from './constants';\n\nconst windowWidth = Dimensions.get('window').width;\n\nconst formatTime = (seconds: number) => {\n  const m = Math.floor(seconds / 60);\n  const s = seconds % 60;\n  return `${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n};\n\ninterface TimeStreamProps {\n  isRecording: boolean;\n  durationMS: SharedValue<number>;\n}\n\nfunction generateInitialTimestamps() {\n  const timestamps: number[] = [];\n\n  for (let i = -5; i < 15; i++) {\n    timestamps.push(i);\n  }\n\n  return timestamps;\n}\n\nconst TimeStream: React.FC<TimeStreamProps> = ({ isRecording, durationMS }) => {\n  const [timestamps, setTimestamps] = useState<number[]>(\n    generateInitialTimestamps()\n  );\n  const intervalRef = useRef<NodeJS.Timeout | null>(null);\n\n  useEffect(() => {\n    if (isRecording) {\n      setTimestamps(generateInitialTimestamps());\n\n      intervalRef.current = setInterval(() => {\n        const elapsedSeconds = durationMS.value / 1000;\n        const futureSecond = Math.ceil(elapsedSeconds + 1);\n\n        setTimestamps((prev) => {\n          if (prev.includes(futureSecond)) {\n            return prev;\n          }\n\n          const cleanList = prev.filter((t) => t > elapsedSeconds - 5);\n          return [...cleanList, futureSecond];\n        });\n      }, 500);\n    } else {\n      if (intervalRef.current) {\n        clearInterval(intervalRef.current);\n      }\n    }\n\n    return () => {\n      if (intervalRef.current) {\n        clearInterval(intervalRef.current);\n      }\n    };\n  }, [isRecording, durationMS]);\n\n  return (\n    <View style={StyleSheet.absoluteFill} pointerEvents=\"none\">\n      {timestamps.map((seconds) => (\n        <Timestamp\n          key={seconds}\n          spawnSeconds={seconds}\n          durationMS={durationMS}\n          isRecording={isRecording}\n        />\n      ))}\n    </View>\n  );\n};\n\nexport default TimeStream;\n\nconst textWidth = 60;\n\ninterface TimestampProps {\n  spawnSeconds: number;\n  durationMS: SharedValue<number>;\n  isRecording: boolean;\n}\n\nconst subSeconds = new Array(7).fill(0).map((_, i) => `sub-${i}`);\n\nconst Timestamp: React.FC<TimestampProps> = ({\n  spawnSeconds,\n  durationMS,\n  isRecording,\n}) => {\n  const translateX = useSharedValue(2 * windowWidth);\n\n  useEffect(() => {\n    const originalPositionOfFirstTimestamp = windowWidth - textWidth / 2;\n    const currentPositionOfFirstTimestamp =\n      originalPositionOfFirstTimestamp -\n      durationMS.value * constants.pixelsPerMS;\n\n    const startX =\n      currentPositionOfFirstTimestamp +\n      spawnSeconds * constants.pixelsPerSecond;\n\n    const endX = -constants.pixelsPerSecond * 2;\n\n    const totalDistance = startX - endX;\n    const duration = (totalDistance / constants.pixelsPerSecond) * 1000;\n\n    translateX.value = startX;\n\n    if (!isRecording) {\n      cancelAnimation(translateX);\n      return;\n    }\n\n    translateX.value = withTiming(endX, {\n      duration: duration,\n      easing: Easing.linear,\n    });\n  }, [spawnSeconds, durationMS, translateX, isRecording]);\n\n  const containerStyle = useAnimatedStyle(() => ({\n    position: 'absolute',\n    bottom: 5,\n    left: 0,\n    width: textWidth,\n    alignItems: 'center',\n    transform: [{ translateX: translateX.value }],\n  }));\n\n  return (\n    <>\n      <Animated.View style={containerStyle}>\n        <View style={styles.smallIndicatorContainer}>\n          {subSeconds.map((key, index) => (\n            <View\n              key={key}\n              style={[\n                styles.subSecondIndicator,\n                (index === 0 || index === subSeconds.length - 1) &&\n                  styles.hidden,\n              ]}\n            />\n          ))}\n        </View>\n        <View style={styles.timeIndicatorLarge} />\n        <Text style={[styles.text, spawnSeconds < 0 && styles.hidden]}>\n          {formatTime(spawnSeconds)}\n        </Text>\n      </Animated.View>\n    </>\n  );\n};\n\nconst styles = StyleSheet.create({\n  text: {\n    color: '#888',\n    fontSize: 16,\n    fontFamily: 'Menlo',\n    fontWeight: '600',\n    textAlign: 'center',\n  },\n  timeIndicatorLarge: {\n    width: 2,\n    height: 20,\n    backgroundColor: 'rgba(255,255,255,0.3)',\n    marginBottom: 4,\n  },\n  smallIndicatorContainer: {\n    position: 'absolute',\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n    width: constants.pixelsPerSecond + 2,\n    height: 15,\n    top: 10,\n    left: textWidth / 2 - 1,\n  },\n  subSecondIndicator: {\n    height: 10,\n    width: 2,\n    backgroundColor: 'rgba(255,255,255, 0.3)',\n    marginBottom: 4,\n  },\n  hidden: {\n    opacity: 0,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/demos/Record/constants.tsx",
    "content": "const constants = {\n  sampleRate: 3125,\n  updateIntervalMS: 32,\n  barWidth: 2,\n  barGap: 2,\n  minDb: -40,\n  maxDb: 0,\n  historyBarWidth: 2,\n  historyBarGap: 2,\n  get pixelsPerSecond() {\n    return (1000 / this.updateIntervalMS) * (this.barWidth + this.barGap);\n  },\n  get pixelsPerMS() {\n    return this.pixelsPerSecond / 1000;\n  },\n};\n\nexport default constants;\n"
  },
  {
    "path": "apps/common-app/src/demos/Record/types.ts",
    "content": "export enum RecordingState {\n  Idle = 'Idle',\n  Loading = 'Loading',\n  Recording = 'Recording',\n  Paused = 'Paused',\n  ReadyToPlay = 'ReadyToPlay',\n  Playing = 'Playing',\n}\n\nexport type AudioCallback = (normalized: number) => void;\n"
  },
  {
    "path": "apps/common-app/src/demos/index.ts",
    "content": "import { icons } from 'lucide-react-native';\n\nimport PedalBoard from './PedalBoard/PedalBoard';\nimport Record from './Record/Record';\nimport Crossfade from './Crossfade/Crossfade';\n\ninterface SimplifiedIconProps {\n  color?: string;\n  size?: number;\n}\n\nexport interface DemoScreen {\n  key: string;\n  title: string;\n  subtitle: string;\n  icon: React.FC<SimplifiedIconProps>;\n  screen: React.FC;\n}\n\nexport const demos: DemoScreen[] = [\n  {\n    key: 'RecordDemo',\n    title: 'Recorder',\n    subtitle:\n      'Demonstrates microphone permissions, capture, and playback similar to voice memos app.',\n    icon: icons.Mic,\n    screen: Record,\n  },\n  {\n    key: 'PedalBoard',\n    title: 'Pedal board',\n    subtitle:\n      'Simulates a guitar pedal board that can apply customizable audio effects in real-time.',\n    icon: icons.Guitar,\n    screen: PedalBoard,\n  },\n  {\n    key: 'Crossfade',\n    title: 'Crossfade',\n    subtitle:\n      'Demonstrates crossfading between two audio files.',\n    icon: icons.ArrowLeftRight,\n    screen: Crossfade,\n  }\n] as const;\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioFile/AudioFile.tsx",
    "content": "import React, { FC, useCallback, useEffect, useState } from 'react';\nimport { ActivityIndicator, Alert, StyleSheet, View } from 'react-native';\nimport {\n  AudioManager,\n  PlaybackNotificationManager,\n} from 'react-native-audio-api';\nimport BackgroundTimer from 'react-native-background-timer';\n\nimport { Button, Container, Spacer } from '../../components';\nimport { colors } from '../../styles';\nimport AudioPlayer from './AudioPlayer';\n\n// const remoteAsset =\n//   'https://software-mansion.github.io/react-native-audio-api/audio/voice/example-voice-01.mp3';\n\nimport staticAsset from './voice-sample-landing.mp3';\n\nconst AudioFile: FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n  const [positionPercentage, setPositionPercentage] = useState(0);\n  const [wasPlaying, setWasPlaying] = useState(false);\n\n  const togglePlayPause = async () => {\n    if (isPlaying) {\n      await AudioPlayer.pause();\n    } else {\n      AudioPlayer.setOnPositionChanged((offset) => {\n        setPositionPercentage(offset);\n      });\n\n      AudioManager.setAudioSessionOptions({\n        iosCategory: 'playback',\n        iosMode: 'default',\n        iosOptions: [],\n      });\n\n      const success = await AudioManager.setAudioSessionActivity(true);\n\n      if (!success) {\n        Alert.alert(\n          'Audio Session Error',\n          'Failed to activate audio session for playback.'\n        );\n        return;\n      }\n\n      await AudioPlayer.play();\n\n      AudioManager.observeAudioInterruptions(true);\n\n      AudioManager.getDevicesInfo().then(console.log);\n    }\n\n    setIsPlaying((prev) => !prev);\n  };\n\n  const fetchAudioBuffer = useCallback(async () => {\n    setIsLoading(true);\n\n    await AudioPlayer.loadBuffer(staticAsset);\n\n    setIsLoading(false);\n  }, []);\n\n  const setupNotification = async () => {\n    try {\n      await AudioManager.requestNotificationPermissions();\n      const duration = AudioPlayer.getDuration();\n      await PlaybackNotificationManager.show({\n        title: 'Audio File',\n        artist: 'Software Mansion',\n        album: 'Audio API',\n        duration: duration,\n        state: 'paused',\n        speed: 1.0,\n        elapsedTime: 0,\n      });\n      await PlaybackNotificationManager.enableControl('skipBackward', true);\n      await PlaybackNotificationManager.enableControl('nextTrack', true);\n      await PlaybackNotificationManager.enableControl('skipForward', true);\n      await PlaybackNotificationManager.enableControl('previousTrack', true);\n      await PlaybackNotificationManager.enableControl('pause', true);\n      await PlaybackNotificationManager.enableControl('play', true);\n      await PlaybackNotificationManager.enableControl('seekTo', true);\n\n    } catch (error) {\n      console.error('Failed to setup notification:', error);\n    }\n  };\n\n  useEffect(() => {\n    const setup = async () => {\n      await fetchAudioBuffer();\n      await setupNotification();\n    };\n    setup();\n    return () => {\n      AudioPlayer.reset();\n      PlaybackNotificationManager.hide();\n      AudioManager.setAudioSessionActivity(false);\n    };\n  }, [fetchAudioBuffer]);\n\n  useEffect(() => {\n    AudioManager.observeAudioInterruptions(true);\n\n    // Listen to notification control events\n    const playListener = PlaybackNotificationManager.addEventListener(\n      'playbackNotificationPlay',\n      () => {\n        AudioPlayer.play();\n        setIsPlaying(true);\n      }\n    );\n\n    const pauseListener = PlaybackNotificationManager.addEventListener(\n      'playbackNotificationPause',\n      () => {\n        AudioPlayer.pause();\n        setIsPlaying(false);\n      }\n    );\n\n    const skipForwardListener = PlaybackNotificationManager.addEventListener(\n      'playbackNotificationSkipForward',\n      (event) => {\n        AudioPlayer.seekBy(event.value);\n      }\n    );\n\n    const skipBackwardListener = PlaybackNotificationManager.addEventListener(\n      'playbackNotificationSkipBackward',\n      (event) => {\n        AudioPlayer.seekBy(-event.value);\n      }\n    );\n\n    // Keep interruption handling through AudioManager\n    const interruptionSubscription = AudioManager.addSystemEventListener(\n      'interruption',\n      async (event) => {\n        if (event.type === 'began' && isPlaying) {\n          await AudioPlayer.pause();\n          setIsPlaying(false);\n          setWasPlaying(true);\n          return;\n        }\n\n        if (event.type === 'ended' && wasPlaying) {\n          BackgroundTimer.setTimeout(async () => {\n            AudioPlayer.setVolume(1.0);\n            AudioManager.setAudioSessionActivity(true);\n            await AudioPlayer.play();\n            setIsPlaying(true);\n            setWasPlaying(false);\n            console.log('Auto-resumed after transient interruption');\n          }, 500);\n        }\n      }\n    );\n\n    const duckListener = AudioManager.addSystemEventListener(\n      'duck',\n      () => {\n        AudioPlayer.setVolume(0.2);\n      }\n    );\n\n    const seekToListener = PlaybackNotificationManager.addEventListener(\n      'playbackNotificationSeekTo',\n      (event) => {\n        AudioPlayer.seekBy(event.value - AudioPlayer.getElapsedTime());\n      }\n    );\n\n    return () => {\n      playListener.remove();\n      pauseListener.remove();\n      skipForwardListener.remove();\n      skipBackwardListener.remove();\n      seekToListener.remove();\n      interruptionSubscription?.remove();\n      duckListener.remove();\n    };\n  }, [isPlaying, wasPlaying]);\n\n  return (\n    <Container centered>\n      {isLoading && <ActivityIndicator color=\"#FFFFFF\" />}\n      <Button\n        title={isPlaying ? 'Stop' : 'Play'}\n        onPress={togglePlayPause}\n        disabled={isLoading}\n      />\n      <Spacer.Vertical size={20} />\n      <View style={styles.progressContainer}>\n        <View\n          style={[\n            styles.progressBar,\n            { width: `${positionPercentage * 100}%` },\n          ]}\n        />\n      </View>\n    </Container>\n  );\n};\n\nexport default AudioFile;\n\nconst styles = StyleSheet.create({\n  progressContainer: {\n    width: '100%',\n    height: 10,\n    backgroundColor: '#333',\n    borderRadius: 5,\n    overflow: 'hidden',\n    marginTop: 20,\n  },\n  progressBar: {\n    height: '100%',\n    backgroundColor: colors.main,\n    borderRadius: 5,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioFile/AudioPlayer.ts",
    "content": "import type {\n  AudioBuffer,\n  AudioBufferSourceNode,\n} from 'react-native-audio-api';\nimport {\n  AudioContext,\n  PlaybackNotificationManager,\n  GainNode,\n} from 'react-native-audio-api';\n\nclass AudioPlayer {\n  private readonly audioContext: AudioContext;\n  private sourceNode: AudioBufferSourceNode | null = null;\n  private audioBuffer: AudioBuffer | null = null;\n  private volumeNode: GainNode | null = null;\n\n  private isPlaying: boolean = false;\n\n  private currentElapsedTime: number = 0;\n  private playbackRate: number = 1;\n  private volume: number = 1;\n  private onPositionChanged: ((offset: number) => void) | null = null;\n\n  constructor() {\n    this.audioContext = new AudioContext();\n  }\n\n  play = async () => {\n    if (this.isPlaying) {\n      console.warn('Audio is already playing');\n      return;\n    }\n\n    if (!this.audioBuffer) {\n      console.warn('Audio buffer is not loaded');\n      return;\n    }\n\n    this.isPlaying = true;\n    PlaybackNotificationManager.show({\n      state: 'playing',\n    });\n\n    if (this.audioContext.state === 'suspended') {\n      await this.audioContext.resume();\n    }\n\n    this.sourceNode = this.audioContext.createBufferSource({\n      pitchCorrection: true,\n    });\n    this.sourceNode.buffer = this.audioBuffer;\n    this.sourceNode.playbackRate.value = this.playbackRate;\n    this.volumeNode = this.audioContext.createGain();\n    this.volumeNode.gain.value = this.volume;\n\n    this.sourceNode\n      .connect(this.volumeNode)\n      .connect(this.audioContext.destination);\n    this.sourceNode.onPositionChangedInterval = 1000;\n    this.sourceNode.onPositionChanged = (event) => {\n      PlaybackNotificationManager.show({\n        elapsedTime: this.currentElapsedTime,\n      });\n      this.currentElapsedTime = event.value;\n      if (this.onPositionChanged) {\n        this.onPositionChanged(\n          this.currentElapsedTime / this.audioBuffer!.duration\n        );\n      }\n    };\n\n    this.sourceNode.start(\n      this.audioContext.currentTime,\n      this.currentElapsedTime\n    );\n  };\n\n  pause = async () => {\n    if (!this.isPlaying) {\n      console.warn('Audio is not playing');\n      return;\n    }\n\n    this.sourceNode?.stop(this.audioContext.currentTime);\n\n    await this.audioContext.suspend();\n    PlaybackNotificationManager.show({\n      state: 'paused',\n      elapsedTime: this.currentElapsedTime,\n    });\n\n    this.isPlaying = false;\n  };\n\n  seekBy = (seconds: number) => {\n    this.sourceNode?.stop(this.audioContext.currentTime);\n    this.currentElapsedTime += seconds;\n    if (this.currentElapsedTime < 0) {\n      this.currentElapsedTime = 0;\n    } else if (this.currentElapsedTime > this.getDuration()) {\n      this.currentElapsedTime = this.getDuration();\n    }\n    PlaybackNotificationManager.show({\n      elapsedTime: this.currentElapsedTime,\n    });\n\n    if (this.isPlaying) {\n      this.isPlaying = false;\n      this.play();\n    }\n  };\n\n  loadBuffer = async (asset: string | number) => {\n    const buffer = await this.audioContext.decodeAudioData(asset);\n\n    if (buffer) {\n      this.audioBuffer = buffer;\n      this.playbackRate = 1;\n    }\n  };\n\n  reset = async () => {\n    if (this.sourceNode) {\n      this.sourceNode.onEnded = null;\n      this.sourceNode.onPositionChanged = null;\n      this.sourceNode.stop(this.audioContext.currentTime);\n    }\n    this.audioBuffer = null;\n    this.sourceNode = null;\n    this.currentElapsedTime = 0;\n    this.playbackRate = 1;\n    this.isPlaying = false;\n\n    await this.audioContext.suspend();\n  };\n\n  setOnPositionChanged = (\n    callback: null | ((offset: number) => void) = null\n  ) => {\n    this.onPositionChanged = callback;\n  };\n\n  getDuration = (): number => {\n    return this.audioBuffer?.duration ?? 0;\n  };\n\n  getElapsedTime = (): number => {\n    return this.currentElapsedTime;\n  };\n\n  setVolume = (volume: number) => {\n    this.volume = volume;\n    if (this.volumeNode) {\n      this.volumeNode.gain.value = volume;\n    }\n  };\n}\n\nexport default new AudioPlayer();\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioFile/index.ts",
    "content": "export { default } from './AudioFile';\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioParamPipeline/AudioParamPipeline.tsx",
    "content": "import React, { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport { ScrollView, StyleSheet, Text, View } from 'react-native';\nimport { AudioContext } from 'react-native-audio-api';\nimport type { AudioParam } from 'react-native-audio-api';\n\nimport { Button, Container, Spacer } from '../../components';\nimport { colors, layout } from '../../styles';\nimport {\n  SectionTitle,\n  StatusPill,\n  StepRow,\n  TestUI,\n  type ScenarioStatus,\n  type StepItem,\n  type SummaryItem,\n} from '../../testComponents';\nimport { NotSupportedError } from '../../../../../packages/react-native-audio-api/src/errors';\n\n// ---------------------------------------------------------------------------\n// Data types\n// ---------------------------------------------------------------------------\n\ninterface AudioTestCase {\n  key: string;\n  title: string;\n  description: string;\n  duration: number;\n  events: string[];\n  setup: (freq: AudioParam, t0: number) => void;\n}\n\ninterface ErrorSubCase {\n  id: string;\n  label: string;\n  run: (ctx: AudioContext, t0: number) => void;\n}\n\ntype PlayStatus = 'idle' | 'playing' | 'done';\n\n// ---------------------------------------------------------------------------\n// Frequency automation test cases\n// Oscillator frequency param is automated — pitch changes are easily heard.\n// ---------------------------------------------------------------------------\n\nconst AUDIO_TEST_CASES: AudioTestCase[] = [\n  {\n    key: 'setValueAtTime',\n    title: 'setValueAtTime',\n    description:\n      'Frequency jumps instantly to discrete pitches at scheduled times.',\n    duration: 3.5,\n    events: [\n      't = 0.0 s   freq → 220 Hz  (A3)',\n      't = 0.7 s   freq → 440 Hz  (A4)',\n      't = 1.4 s   freq → 330 Hz  (E4)',\n      't = 2.1 s   freq → 165 Hz  (E3)',\n      't = 2.8 s   freq → 220 Hz  (A3)',\n    ],\n    setup: (freq, t0) => {\n      freq.setValueAtTime(220, t0 + 0.0);\n      freq.setValueAtTime(440, t0 + 0.7);\n      freq.setValueAtTime(330, t0 + 1.4);\n      freq.setValueAtTime(165, t0 + 2.1);\n      freq.setValueAtTime(220, t0 + 2.8);\n    },\n  },\n  {\n    key: 'linearRamp',\n    title: 'linearRampToValueAtTime',\n    description: 'Pitch sweeps up then down with a constant rate of change.',\n    duration: 4.0,\n    events: [\n      't = 0.0 s    freq = 110 Hz',\n      't = 0 → 2 s  linear ramp  →  880 Hz',\n      't = 2 → 3.5s linear ramp  →  110 Hz',\n    ],\n    setup: (freq, t0) => {\n      freq.setValueAtTime(110, t0 + 0.0);\n      freq.linearRampToValueAtTime(880, t0 + 2.0);\n      freq.linearRampToValueAtTime(110, t0 + 3.5);\n    },\n  },\n  {\n    key: 'exponentialRamp',\n    title: 'exponentialRampToValueAtTime',\n    description:\n      'Pitch sweeps up then down at a constant number of semitones per second — sounds like an even glide to the ear.',\n    duration: 4.0,\n    events: [\n      't = 0.0 s    freq = 110 Hz',\n      't = 0 → 2 s  exponential ramp  →  880 Hz  (+3 octaves)',\n      't = 2 → 3.5s exponential ramp  →  110 Hz  (−3 octaves)',\n    ],\n    setup: (freq, t0) => {\n      freq.setValueAtTime(110, t0 + 0.0);\n      freq.exponentialRampToValueAtTime(880, t0 + 2.0);\n      freq.exponentialRampToValueAtTime(110, t0 + 3.5);\n    },\n  },\n  {\n    key: 'setTargetAtTime',\n    title: 'setTargetAtTime',\n    description:\n      'Frequency approaches a target exponentially — like a natural portamento.',\n    duration: 7.0,\n    events: [\n      't = 0.0 s   freq = 880 Hz',\n      't = 0.5 s   → target 110 Hz   τ = 0.8 s  (descend)',\n      't = 4.0 s   → target 880 Hz   τ = 0.8 s  (ascend)',\n    ],\n    setup: (freq, t0) => {\n      freq.setValueAtTime(880, t0 + 0.0);\n      freq.setTargetAtTime(110, t0 + 0.5, 0.8);\n      freq.setTargetAtTime(880, t0 + 4.0, 0.8);\n    },\n  },\n  {\n    key: 'setValueCurveAtTime',\n    title: 'setValueCurveAtTime',\n    description:\n      'Frequency follows an arbitrary curve — plays a simple melody pattern.',\n    duration: 4.0,\n    events: [\n      't = 0.0 s     freq = 220 Hz',\n      't = 0.5 → 3s  curve [220, 440, 330, 660, 220, 880, 440]  over 2.5 s',\n      't ≥ 3.0 s     holds at last value 440 Hz',\n    ],\n    setup: (freq, t0) => {\n      freq.setValueAtTime(220, t0 + 0.0);\n      freq.setValueCurveAtTime(\n        new Float32Array([220, 440, 330, 660, 220, 880, 440]),\n        t0 + 0.5,\n        2.5\n      );\n    },\n  },\n  {\n    key: 'cancelScheduledValues',\n    title: 'cancelScheduledValues',\n    description:\n      'Removes all future automation events. Frequency reverts to the last explicitly set value.',\n    duration: 4.5,\n    events: [\n      't = 0.0 s   freq = 220 Hz  (setValueAtTime)',\n      't = 0 → 4 s linear ramp  →  880 Hz',\n      't = 2.0 s   cancelScheduledValues',\n      '            ramp removed — freq snaps back to 220 Hz',\n    ],\n    setup: (freq, t0) => {\n      freq.setValueAtTime(220, t0 + 0.0);\n      freq.linearRampToValueAtTime(880, t0 + 4.0);\n      freq.cancelScheduledValues(t0 + 2.0);\n    },\n  },\n  {\n    key: 'cancelAndHoldAtTime',\n    title: 'cancelAndHoldAtTime',\n    description:\n      'Removes future events and freezes frequency at its interpolated value at the cancel time.',\n    duration: 4.5,\n    events: [\n      't = 0.0 s   freq = 220 Hz  (setValueAtTime)',\n      't = 0 → 4 s linear ramp  →  880 Hz',\n      't = 2.0 s   cancelAndHoldAtTime',\n      '            ramp removed — freq holds at ~550 Hz',\n    ],\n    setup: (freq, t0) => {\n      freq.setValueAtTime(220, t0 + 0.0);\n      freq.linearRampToValueAtTime(880, t0 + 4.0);\n      freq.cancelAndHoldAtTime(t0 + 2.0);\n    },\n  },\n];\n\n// ---------------------------------------------------------------------------\n// NotSupportedError sub-cases\n// Each uses a fresh GainNode so events don't accumulate across sub-cases.\n// ---------------------------------------------------------------------------\n\nconst ERROR_SUB_CASES: ErrorSubCase[] = [\n  {\n    id: 'A',\n    label: 'A: setValueCurveAtTime with event strictly inside interval',\n    run: (ctx, t0) => {\n      const gain = ctx.createGain().gain;\n      gain.setValueAtTime(0.5, t0 + 0.5);\n      gain.setValueCurveAtTime(new Float32Array([0, 1]), t0, 1);\n    },\n  },\n  {\n    id: 'B',\n    label: 'B: setValueCurveAtTime overlapping exponentialRamp endTime',\n    run: (ctx, t0) => {\n      const gain = ctx.createGain().gain;\n      gain.exponentialRampToValueAtTime(1, t0 + 0.5);\n      gain.setValueCurveAtTime(new Float32Array([0, 1]), t0, 1);\n    },\n  },\n  {\n    id: 'C',\n    label: 'C: two overlapping setValueCurveAtTime intervals',\n    run: (ctx, t0) => {\n      const gain = ctx.createGain().gain;\n      gain.setValueCurveAtTime(new Float32Array([0, 1]), t0, 0.5);\n      gain.setValueCurveAtTime(new Float32Array([0, 1]), t0 + 0.25, 0.5);\n    },\n  },\n  {\n    id: 'D',\n    label: 'D: setValueAtTime inside an existing curve interval',\n    run: (ctx, t0) => {\n      const gain = ctx.createGain().gain;\n      gain.setValueCurveAtTime(new Float32Array([0, 1]), t0, 1);\n      gain.setValueAtTime(0.5, t0);\n    },\n  },\n  {\n    id: 'E',\n    label: 'E: exponentialRamp endTime inside an existing curve interval',\n    run: (ctx, t0) => {\n      const gain = ctx.createGain().gain;\n      gain.setValueCurveAtTime(new Float32Array([0, 1]), t0, 1);\n      gain.exponentialRampToValueAtTime(1, t0 + 0.5);\n    },\n  },\n];\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst AudioParamPipeline: FC = () => {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const isUnmountedRef = useRef(false);\n  const stopRequestedRef = useRef(false);\n  const currentOscRef = useRef<ReturnType<AudioContext['createOscillator']> | null>(null);\n\n  const [audioStatuses, setAudioStatuses] = useState<\n    Record<string, PlayStatus>\n  >(() => Object.fromEntries(AUDIO_TEST_CASES.map((tc) => [tc.key, 'idle'])));\n  const [errorSteps, setErrorSteps] = useState<StepItem[] | null>(null);\n  const [errorRunning, setErrorRunning] = useState(false);\n  const [isPlayingAll, setIsPlayingAll] = useState(false);\n\n  useEffect(() => {\n    audioContextRef.current = new AudioContext();\n    return () => {\n      isUnmountedRef.current = true;\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  const setStatus = (key: string, status: PlayStatus) => {\n    if (!isUnmountedRef.current) {\n      setAudioStatuses((prev) => ({ ...prev, [key]: status }));\n    }\n  };\n\n  const playTestCase = useCallback(async (tc: AudioTestCase) => {\n    const ctx = audioContextRef.current;\n    if (!ctx) return;\n\n    setStatus(tc.key, 'playing');\n\n    const osc = ctx.createOscillator();\n    const gainNode = ctx.createGain();\n    osc.connect(gainNode);\n    gainNode.connect(ctx.destination);\n    gainNode.gain.value = 0.4;\n\n    const t0 = ctx.currentTime;\n    tc.setup(osc.frequency, t0);\n    osc.start(t0);\n    osc.stop(t0 + tc.duration);\n    currentOscRef.current = osc;\n\n    const stepMs = 50;\n    const totalMs = tc.duration * 1000 + 150;\n    for (let elapsed = 0; elapsed < totalMs; elapsed += stepMs) {\n      if (stopRequestedRef.current || isUnmountedRef.current) {\n        try {\n          osc.stop();\n        } catch {}\n        break;\n      }\n      await new Promise<void>((resolve) => setTimeout(resolve, stepMs));\n    }\n\n    currentOscRef.current = null;\n    setStatus(tc.key, 'done');\n  }, []);\n\n  const runErrorTest = useCallback(async () => {\n    const ctx = audioContextRef.current;\n    if (!ctx || errorRunning) return;\n\n    setErrorRunning(true);\n    setErrorSteps(null);\n\n    const t0 = ctx.currentTime;\n    const steps: StepItem[] = ERROR_SUB_CASES.map((sc) => {\n      try {\n        sc.run(ctx, t0);\n        return {\n          id: sc.id,\n          message: sc.label,\n          status: 'fail' as const,\n          details: 'Expected NotSupportedError but nothing was thrown',\n        };\n      } catch (e) {\n        if (e instanceof NotSupportedError) {\n          return { id: sc.id, message: sc.label, status: 'pass' as const };\n        }\n        return {\n          id: sc.id,\n          message: sc.label,\n          status: 'fail' as const,\n          details: `Unexpected error: ${e instanceof Error ? e.message : String(e)}`,\n        };\n      }\n    });\n\n    if (!isUnmountedRef.current) {\n      setErrorSteps(steps);\n      setErrorRunning(false);\n    }\n  }, [errorRunning]);\n\n  const playAll = useCallback(async () => {\n    if (isPlayingAll) return;\n    stopRequestedRef.current = false;\n    setIsPlayingAll(true);\n    setAudioStatuses(\n      Object.fromEntries(AUDIO_TEST_CASES.map((tc) => [tc.key, 'idle']))\n    );\n    setErrorSteps(null);\n\n    for (const tc of AUDIO_TEST_CASES) {\n      if (stopRequestedRef.current) break;\n      await playTestCase(tc);\n      if (stopRequestedRef.current) break;\n      await new Promise<void>((resolve) => setTimeout(resolve, 300));\n    }\n\n    if (!stopRequestedRef.current) {\n      await runErrorTest();\n    }\n\n    if (!isUnmountedRef.current) {\n      setIsPlayingAll(false);\n    }\n    stopRequestedRef.current = false;\n  }, [isPlayingAll, playTestCase, runErrorTest]);\n\n  const stopAll = useCallback(() => {\n    stopRequestedRef.current = true;\n    try {\n      currentOscRef.current?.stop();\n    } catch {}\n  }, []);\n\n  const reset = useCallback(() => {\n    if (isPlayingAll) return;\n    setAudioStatuses(\n      Object.fromEntries(AUDIO_TEST_CASES.map((tc) => [tc.key, 'idle']))\n    );\n    setErrorSteps(null);\n  }, [isPlayingAll]);\n\n  const controlActions = [\n    {\n      title: isPlayingAll ? 'Running…' : 'Play All',\n      onPress: playAll,\n      disabled: isPlayingAll,\n      width: 110,\n    },\n    {\n      title: 'Stop',\n      onPress: stopAll,\n      disabled: !isPlayingAll,\n      width: 80,\n    },\n    {\n      title: 'Reset',\n      onPress: reset,\n      disabled: isPlayingAll,\n      width: 90,\n    },\n  ];\n\n  const errorOverallStatus: ScenarioStatus | null = errorSteps\n    ? errorSteps.every((s) => s.status === 'pass')\n      ? 'pass'\n      : 'fail'\n    : null;\n\n  const isRunning =\n    isPlayingAll ||\n    Object.values(audioStatuses).some((s) => s === 'playing') ||\n    errorRunning;\n  const playedCount = Object.values(audioStatuses).filter(\n    (s) => s === 'done'\n  ).length;\n  const errorPassCount = errorSteps?.filter((s) => s.status === 'pass').length ?? 0;\n  const errorFailCount = errorSteps?.filter((s) => s.status === 'fail').length ?? 0;\n\n  const passedCount = playedCount + errorPassCount;\n  const failedCount = errorFailCount;\n  const totalCount = AUDIO_TEST_CASES.length + ERROR_SUB_CASES.length;\n  const hasAnyResults = playedCount > 0 || errorSteps !== null;\n\n  const summaryItems: SummaryItem[] = [\n    {\n      label: 'Status',\n      value: isRunning ? 'running' : hasAnyResults ? 'done' : 'idle',\n    },\n    {\n      label: 'Passed',\n      value: hasAnyResults ? `${passedCount}/${totalCount}` : '—',\n    },\n    {\n      label: 'Failed',\n      value: hasAnyResults ? String(failedCount) : '—',\n    },\n  ];\n\n  return (\n    <Container disablePadding>\n      <TestUI.Header\n        title=\"AudioParam\"\n        subtitle=\"Tap Play on each card to hear the automation. Pitch (oscillator frequency) is the animated parameter.\"\n      />\n      <TestUI.Summary items={summaryItems} />\n      <Spacer.Vertical size={12} />\n      <TestUI.ControlBar actions={controlActions} />\n\n      <ScrollView\n        style={styles.scroll}\n        contentContainerStyle={styles.scrollContent}\n      >\n        <SectionTitle title=\"Automation Methods\" />\n\n        {AUDIO_TEST_CASES.map((tc) => {\n          const status = audioStatuses[tc.key];\n          return (\n            <View key={tc.key} style={styles.card}>\n              <View style={styles.cardHeader}>\n                <Text style={styles.cardTitle}>{tc.title}</Text>\n                {status === 'playing' && (\n                  <Text style={styles.playingLabel}>▶ PLAYING</Text>\n                )}\n                {status === 'done' && <StatusPill status=\"pass\" />}\n              </View>\n              <Text style={styles.description}>{tc.description}</Text>\n              <View style={styles.eventList}>\n                {tc.events.map((line, i) => (\n                  <StepRow\n                    key={i}\n                    step={{ id: String(i), message: line, status: 'info' }}\n                  />\n                ))}\n              </View>\n              <Button\n                title={status === 'playing' ? 'Playing…' : 'Play'}\n                onPress={() => playTestCase(tc)}\n                disabled={status === 'playing' || isPlayingAll}\n                width={80}\n              />\n            </View>\n          );\n        })}\n\n        <SectionTitle title=\"Error Handling\" />\n\n        <View style={styles.card}>\n          <View style={styles.cardHeader}>\n            <Text style={styles.cardTitle}>NotSupportedError</Text>\n            {errorRunning && <Text style={styles.playingLabel}>▶ RUNNING</Text>}\n            {errorOverallStatus && !errorRunning && (\n              <StatusPill status={errorOverallStatus} />\n            )}\n          </View>\n          <Text style={styles.description}>\n            Scheduling events that overlap a setValueCurveAtTime interval must\n            throw NotSupportedError. Each sub-case uses a fresh GainNode.\n          </Text>\n          {errorSteps && (\n            <View style={styles.eventList}>\n              {errorSteps.map((step) => (\n                <StepRow key={step.id} step={step} />\n              ))}\n            </View>\n          )}\n          <Button\n            title={errorRunning ? 'Running…' : 'Run Test'}\n            onPress={runErrorTest}\n            disabled={errorRunning || isPlayingAll}\n            width={100}\n          />\n        </View>\n      </ScrollView>\n    </Container>\n  );\n};\n\nexport default AudioParamPipeline;\n\nconst styles = StyleSheet.create({\n  scroll: {\n    flex: 1,\n  },\n  scrollContent: {\n    gap: 12,\n    paddingHorizontal: 18,\n    paddingTop: 12,\n    paddingBottom: 32,\n  },\n  card: {\n    backgroundColor: colors.backgroundLight,\n    borderRadius: layout.radius,\n    gap: 10,\n    padding: 12,\n  },\n  cardHeader: {\n    alignItems: 'center',\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n  },\n  cardTitle: {\n    color: colors.white,\n    flex: 1,\n    fontSize: 15,\n    fontWeight: '700',\n    fontFamily: 'Courier New',\n    paddingRight: 8,\n  },\n  description: {\n    color: colors.gray,\n    fontSize: 12,\n    lineHeight: 17,\n  },\n  eventList: {\n    gap: 4,\n  },\n  playingLabel: {\n    color: colors.main,\n    fontSize: 11,\n    fontWeight: '700',\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioParamPipeline/index.ts",
    "content": "export { default } from './AudioParamPipeline';\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/AudioPipelineStress.tsx",
    "content": "import React, { FC, useEffect, useRef, useState } from 'react';\nimport { Platform, ScrollView, StyleSheet } from 'react-native';\nimport { AudioBuffer, AudioManager } from 'react-native-audio-api';\n\nimport { Container } from '../../components';\nimport {\n  TestUI,\n  type ControlAction,\n  type ScenarioItem,\n  type SummaryItem,\n} from '../../testComponents';\nimport {\n  DEFAULT_LOOP_COUNT,\n  MIN_DECODED_DURATION_SECONDS,\n  PLAYBACK_PROGRESS_TIMEOUT_MS,\n  PLAYBACK_STALL_WINDOW_MS,\n  POSITION_POLL_INTERVAL_MS,\n  RECORDING_CALLBACK_TIMEOUT_MS,\n  RECORDING_STALL_WINDOW_MS,\n  SHORT_PLAYBACK_MS,\n  SHORT_RECORDING_MS,\n} from './constants';\nimport StressResourceOwner from './StressResourceOwner';\nimport StopRequestedError from './StopRequestedError';\nimport { activatePlaybackSession, activateRecordingSession } from './audioSessions';\nimport {\n  formatDurationMs,\n  formatPlaybackProgressStats,\n  formatTimestamp,\n  getPlaybackProgressThreshold,\n  serializeUnknownError,\n  sleep,\n  waitForCondition,\n} from './helpers';\nimport staticAsset from '../AudioFile/voice-sample-landing.mp3';\nimport type {\n  PlaybackProgressStats,\n  RecordingCapture,\n  RunnerState,\n  ScenarioId,\n  ScenarioResult,\n  ScenarioStatus,\n  StepResult,\n} from './types';\n\nconst AudioPipelineStress: FC = () => {\n  const resourcesRef = useRef(new StressResourceOwner(staticAsset));\n  const stopRequestedRef = useRef(false);\n  const runIdRef = useRef(0);\n  const isMountedRef = useRef(true);\n\n  const [runnerState, setRunnerState] = useState<RunnerState>('idle');\n  const [currentStep, setCurrentStep] = useState<string>(\n    'Ready to run the audio pipeline stress suite.'\n  );\n  const [scenarioResults, setScenarioResults] = useState<ScenarioResult[]>([]);\n  const [liveLog, setLiveLog] = useState<string[]>([]);\n\n  useEffect(() => {\n    const resources = resourcesRef.current;\n\n    return () => {\n      isMountedRef.current = false;\n      stopRequestedRef.current = true;\n      resources.cleanup().catch((error) => {\n        console.warn('AudioPipelineStress cleanup failed', error);\n      });\n    };\n  }, []);\n\n  const appendLog = (message: string) => {\n    if (!isMountedRef.current) {\n      return;\n    }\n\n    setLiveLog((previous) => [\n      ...previous,\n      `${formatTimestamp(Date.now())} ${message}`,\n    ]);\n  };\n\n  const setVisibleStep = (message: string) => {\n    if (!isMountedRef.current) {\n      return;\n    }\n\n    setCurrentStep(message);\n  };\n\n  const requestStop = () => {\n    stopRequestedRef.current = true;\n    setRunnerState((state) => (state === 'running' ? 'stopping' : state));\n    appendLog('Stop requested.');\n  };\n\n  const ensureCanContinue = () => {\n    if (stopRequestedRef.current) {\n      throw new StopRequestedError();\n    }\n  };\n\n  const hardResetResources = async (reason: string) => {\n    appendLog(`Hard reset: ${reason}`);\n    await resourcesRef.current.recreate();\n  };\n\n  const runStep = async (\n    scenarioLabel: string,\n    stepResults: StepResult[],\n    id: string,\n    message: string,\n    action: () => Promise<void>\n  ) => {\n    ensureCanContinue();\n    setVisibleStep(`${scenarioLabel}: ${message}`);\n    appendLog(`[${scenarioLabel}] ${message}`);\n\n    const startedAt = Date.now();\n\n    try {\n      await action();\n\n      stepResults.push({\n        id,\n        message,\n        status: 'pass',\n        startedAt,\n        finishedAt: Date.now(),\n      });\n    } catch (error) {\n      const serializedError = serializeUnknownError(\n        error,\n        `${scenarioLabel} / ${id}`\n      );\n\n      stepResults.push({\n        id,\n        message,\n        status: error instanceof StopRequestedError ? 'skipped' : 'fail',\n        startedAt,\n        finishedAt: Date.now(),\n        details: serializedError.details,\n      });\n\n      appendLog(`[${scenarioLabel}] ${serializedError.headline}`);\n      throw error;\n    }\n  };\n\n  const addInfoStep = (\n    stepResults: StepResult[],\n    id: string,\n    message: string,\n    details?: string\n  ) => {\n    const now = Date.now();\n    stepResults.push({\n      id,\n      message,\n      status: 'info',\n      startedAt: now,\n      finishedAt: now,\n      details,\n    });\n  };\n\n  const waitForPlaybackProgress = async (\n    minimumSeconds: number,\n    contextLabel: string\n  ): Promise<PlaybackProgressStats> => {\n    const { context, playback } = resourcesRef.current.getReadyResources();\n    const startedAt = Date.now();\n    const positionSamples: number[] = [];\n    const engineSamples: number[] = [];\n    const engineStartTimeSeconds = context.currentTime;\n    let maxObserved = 0;\n    let lastSnapshot = playback.snapshot();\n    let lastEngineTimeSeconds = engineStartTimeSeconds;\n\n    while (Date.now() - startedAt < PLAYBACK_PROGRESS_TIMEOUT_MS) {\n      ensureCanContinue();\n      lastSnapshot = playback.snapshot();\n      lastEngineTimeSeconds = context.currentTime;\n      positionSamples.push(Number(lastSnapshot.lastPositionSeconds.toFixed(3)));\n      engineSamples.push(Number(lastEngineTimeSeconds.toFixed(3)));\n      maxObserved = Math.max(maxObserved, lastSnapshot.lastPositionSeconds);\n\n      if (lastSnapshot.lastPositionSeconds >= minimumSeconds) {\n        return {\n          engineEndTimeSeconds: lastEngineTimeSeconds,\n          engineDeltaSeconds: lastEngineTimeSeconds - engineStartTimeSeconds,\n          engineSamples,\n          engineStartTimeSeconds,\n          positionMaxObservedSeconds: maxObserved,\n          positionSamples,\n          thresholdSeconds: minimumSeconds,\n        };\n      }\n\n      await sleep(POSITION_POLL_INTERVAL_MS);\n    }\n\n    const recorder = resourcesRef.current.recorder;\n    const stats: PlaybackProgressStats = {\n      engineEndTimeSeconds: lastEngineTimeSeconds,\n      engineDeltaSeconds: lastEngineTimeSeconds - engineStartTimeSeconds,\n      engineSamples,\n      engineStartTimeSeconds,\n      positionMaxObservedSeconds: maxObserved,\n      positionSamples,\n      thresholdSeconds: minimumSeconds,\n    };\n    const diagnosis =\n      stats.engineDeltaSeconds < 0.05\n        ? 'engine-clock-stalled'\n        : 'engine-running-node-stalled';\n\n    throw new Error(\n      [\n        `${contextLabel}: playback progress check failed`,\n        `diagnosis=${diagnosis}`,\n        `target=${minimumSeconds.toFixed(2)}s`,\n        `maxObserved=${maxObserved.toFixed(3)}s`,\n        `engineStart=${engineStartTimeSeconds.toFixed(3)}s`,\n        `engineEnd=${lastEngineTimeSeconds.toFixed(3)}s`,\n        `engineDelta=${stats.engineDeltaSeconds.toFixed(3)}s`,\n        `recentPositionSamples=[${positionSamples.slice(-8).join(', ')}]`,\n        `recentEngineSamples=[${engineSamples.slice(-8).join(', ')}]`,\n        `contextState=${context.state}`,\n        `playbackActive=${lastSnapshot.isActive}`,\n        `playbackEnded=${lastSnapshot.ended}`,\n        `recorderRecording=${recorder?.isRecording() ?? false}`,\n        `recorderPaused=${recorder?.isPaused() ?? false}`,\n        `recorderCallbacks=${resourcesRef.current.callbackCount}`,\n        `lastRecorderError=${resourcesRef.current.lastRecorderError ?? 'none'}`,\n      ].join(', ')\n    );\n  };\n\n  const waitForPlaybackToStall = async () => {\n    const { context, playback } = resourcesRef.current.getReadyResources();\n\n    const engineStartTimeSeconds = context.currentTime;\n    const before = playback.snapshot().lastPositionSeconds;\n    await sleep(PLAYBACK_STALL_WINDOW_MS);\n    const after = playback.snapshot().lastPositionSeconds;\n    const engineEndTimeSeconds = context.currentTime;\n    const engineDeltaSeconds = engineEndTimeSeconds - engineStartTimeSeconds;\n\n    if (after - before > 0.1) {\n      throw new Error(\n        `Playback still advanced after deactivation (${before.toFixed(2)}s -> ${after.toFixed(2)}s), engineDelta=${engineDeltaSeconds.toFixed(3)}s`\n      );\n    }\n  };\n\n  const waitForRecordingCallbacks = async (minimumCount: number) => {\n    await waitForCondition(\n      () => resourcesRef.current.callbackCount >= minimumCount,\n      RECORDING_CALLBACK_TIMEOUT_MS,\n      `Recorder did not emit ${minimumCount} callback buffer(s)`\n    );\n  };\n\n  const waitForRecordingToStall = async () => {\n    const beforeCount = resourcesRef.current.callbackCount;\n    await sleep(RECORDING_STALL_WINDOW_MS);\n    const afterCount = resourcesRef.current.callbackCount;\n    const recorder = resourcesRef.current.recorder;\n\n    if (afterCount > beforeCount) {\n      throw new Error(\n        `Recorder callback count kept growing after deactivation (${beforeCount} -> ${afterCount})`\n      );\n    }\n\n    if (recorder && recorder.isRecording() && !recorder.isPaused()) {\n      throw new Error(\n        'Recorder still reports an active recording after deactivation'\n      );\n    }\n  };\n\n  const performCleanRecording = async (\n    fileNameOverride: string\n  ): Promise<RecordingCapture> => {\n    await activateRecordingSession();\n\n    resourcesRef.current.configureRecorderTap();\n    resourcesRef.current.startRecording(fileNameOverride);\n    await waitForRecordingCallbacks(1);\n    await sleep(SHORT_RECORDING_MS);\n\n    const capture = await resourcesRef.current.stopRecordingAndDecode();\n\n    if (capture.fileDurationSeconds < MIN_DECODED_DURATION_SECONDS) {\n      throw new Error(\n        `Recorded file duration is too short: ${capture.fileDurationSeconds.toFixed(3)}s`\n      );\n    }\n\n    await AudioManager.setAudioSessionActivity(false);\n    return capture;\n  };\n\n  const performCleanPlayback = async (\n    buffer: AudioBuffer,\n    durationSeconds: number = 1.4,\n    contextLabel: string = 'clean playback'\n  ): Promise<PlaybackProgressStats> => {\n    const { playback } = resourcesRef.current.getReadyResources();\n    const expectedPlaybackWindow = Math.min(buffer.duration, durationSeconds);\n    const progressThreshold = getPlaybackProgressThreshold(\n      expectedPlaybackWindow\n    );\n\n    await activatePlaybackSession();\n    await playback.play(buffer, durationSeconds);\n    const playbackStats = await waitForPlaybackProgress(\n      progressThreshold,\n      contextLabel\n    );\n    await sleep(SHORT_PLAYBACK_MS);\n    playback.stop();\n    await AudioManager.setAudioSessionActivity(false);\n    return playbackStats;\n  };\n\n  const performCleanRecordPlaybackCycle = async (label: string) => {\n    const capture = await performCleanRecording(`${label}-${Date.now()}`);\n    await performCleanPlayback(\n      capture.decodedBuffer,\n      Math.min(capture.decodedBuffer.duration, 1.4),\n      `${label}: playback after recording`\n    );\n  };\n\n  const runScenario = async (\n    scenarioId: ScenarioId,\n    label: string,\n    action: (steps: StepResult[]) => Promise<void>\n  ) => {\n    const startedAt = Date.now();\n    const stepResults: StepResult[] = [];\n    let status: ScenarioStatus = 'pass';\n    let errorMessage: string | undefined;\n\n    appendLog(`Scenario start: ${label}`);\n\n    try {\n      await action(stepResults);\n    } catch (error) {\n      if (error instanceof StopRequestedError) {\n        status = 'skipped';\n        errorMessage = error.message;\n      } else {\n        status = 'fail';\n        errorMessage = serializeUnknownError(error, label).details;\n      }\n    }\n\n    const finishedAt = Date.now();\n    const result: ScenarioResult = {\n      scenarioId,\n      label,\n      status,\n      startedAt,\n      finishedAt,\n      steps: stepResults,\n      error: errorMessage,\n    };\n\n    if (status === 'fail' && errorMessage) {\n      addInfoStep(\n        stepResults,\n        `${scenarioId}-failure-summary`,\n        'Scenario failed',\n        errorMessage\n      );\n      appendLog(\n        `Scenario failed: ${label} (${errorMessage.split('\\n')[0] ?? errorMessage})`\n      );\n    } else {\n      appendLog(`Scenario ${status}: ${label}`);\n    }\n\n    if (isMountedRef.current) {\n      setScenarioResults((previous) => [...previous, result]);\n    }\n\n    if (status === 'fail') {\n      await hardResetResources(`${label} failed`);\n    }\n\n    if (status === 'skipped') {\n      throw new StopRequestedError();\n    }\n  };\n\n  const runSuite = async () => {\n    if (runnerState === 'running' || runnerState === 'stopping') {\n      return;\n    }\n\n    runIdRef.current += 1;\n    const currentRunId = runIdRef.current;\n    stopRequestedRef.current = false;\n\n    setRunnerState('running');\n    setScenarioResults([]);\n    setLiveLog([]);\n    setVisibleStep('Preparing audio pipeline resources...');\n\n    try {\n      const permissionStatus = await AudioManager.requestRecordingPermissions();\n\n      if (permissionStatus !== 'Granted') {\n        throw new Error(\n          `Microphone permission is required to run the stress suite (status=${permissionStatus})`\n        );\n      }\n\n      await resourcesRef.current.recreate();\n\n      await runScenario('playback_warmup', 'Playback Warmup', async (steps) => {\n        await runStep(\n          'Playback Warmup',\n          steps,\n          'activate-playback',\n          'Activate playback session',\n          async () => {\n            await activatePlaybackSession();\n          }\n        );\n        await runStep(\n          'Playback Warmup',\n          steps,\n          'play-asset',\n          'Play bundled asset and observe progress',\n          async () => {\n            const { assetBuffer, playback } =\n              resourcesRef.current.getReadyResources();\n            const progressThreshold = getPlaybackProgressThreshold(1.4);\n            await playback.play(assetBuffer, 1.4);\n            const playbackStats = await waitForPlaybackProgress(\n              progressThreshold,\n              'Playback Warmup'\n            );\n            await sleep(SHORT_PLAYBACK_MS);\n            playback.stop();\n            addInfoStep(\n              steps,\n              'playback-warmup-engine-timing',\n              'Playback engine timing',\n              formatPlaybackProgressStats(playbackStats)\n            );\n          }\n        );\n        await runStep(\n          'Playback Warmup',\n          steps,\n          'deactivate-playback',\n          'Deactivate playback session',\n          async () => {\n            await AudioManager.setAudioSessionActivity(false);\n          }\n        );\n      });\n\n      await runScenario('record_warmup', 'Record Warmup', async (steps) => {\n        await runStep(\n          'Record Warmup',\n          steps,\n          'record-and-decode',\n          'Record briefly, then decode output',\n          async () => {\n            const capture = await performCleanRecording(\n              `record-warmup-${Date.now()}`\n            );\n            addInfoStep(\n              steps,\n              'recorded-file',\n              'Decoded recording metadata',\n              `${capture.path} (${capture.fileDurationSeconds.toFixed(2)}s)`\n            );\n          }\n        );\n      });\n\n      await runScenario(\n        'record_to_playback_loop',\n        'Record To Playback Loop',\n        async (steps) => {\n          for (let index = 0; index < DEFAULT_LOOP_COUNT; index += 1) {\n            const cycle = index + 1;\n            await runStep(\n              'Record To Playback Loop',\n              steps,\n              `cycle-${cycle}`,\n              `Cycle ${cycle}: record, decode, and play recorded audio`,\n              async () => {\n                const capture = await performCleanRecording(\n                  `record-to-playback-${cycle}-${Date.now()}`\n                );\n\n                const playbackStats = await performCleanPlayback(\n                  capture.decodedBuffer,\n                  Math.min(capture.decodedBuffer.duration, 1.4),\n                  `Record To Playback Loop cycle ${cycle}`\n                );\n                addInfoStep(\n                  steps,\n                  `cycle-${cycle}-recorded-buffer`,\n                  `Cycle ${cycle} recorded file metadata`,\n                  `fileDuration=${capture.fileDurationSeconds.toFixed(3)}s, decodedDuration=${capture.decodedBuffer.duration.toFixed(3)}s, decodedLength=${capture.decodedBuffer.length}, path=${capture.path}`\n                );\n                addInfoStep(\n                  steps,\n                  `cycle-${cycle}-playback-engine-timing`,\n                  `Cycle ${cycle} playback engine timing`,\n                  formatPlaybackProgressStats(playbackStats)\n                );\n              }\n            );\n          }\n        }\n      );\n\n      await runScenario(\n        'playback_to_record_loop',\n        'Playback To Record Loop',\n        async (steps) => {\n          for (let index = 0; index < DEFAULT_LOOP_COUNT; index += 1) {\n            const cycle = index + 1;\n            await runStep(\n              'Playback To Record Loop',\n              steps,\n              `cycle-${cycle}`,\n              `Cycle ${cycle}: play bundled asset, then record and decode`,\n              async () => {\n                const { assetBuffer } =\n                  resourcesRef.current.getReadyResources();\n                const playbackStats = await performCleanPlayback(\n                  assetBuffer,\n                  1.4,\n                  `Playback To Record Loop cycle ${cycle}`\n                );\n                addInfoStep(\n                  steps,\n                  `cycle-${cycle}-pre-record-playback-engine-timing`,\n                  `Cycle ${cycle} pre-record playback engine timing`,\n                  formatPlaybackProgressStats(playbackStats)\n                );\n                await performCleanRecording(\n                  `playback-to-record-${cycle}-${Date.now()}`\n                );\n              }\n            );\n          }\n        }\n      );\n\n      await runScenario(\n        'playback_session_deactivation_mid_run',\n        'Playback Session Deactivation Mid Run',\n        async (steps) => {\n          await runStep(\n            'Playback Session Deactivation Mid Run',\n            steps,\n            'start-playback',\n            'Start playback and wait for initial progress',\n            async () => {\n              const { assetBuffer, playback } =\n                resourcesRef.current.getReadyResources();\n              const progressThreshold = getPlaybackProgressThreshold(2.2);\n              await activatePlaybackSession();\n              await playback.play(assetBuffer, 2.2);\n              const playbackStats = await waitForPlaybackProgress(\n                progressThreshold,\n                'Playback Session Deactivation Mid Run'\n              );\n              addInfoStep(\n                steps,\n                'pre-deactivation-playback-engine-timing',\n                'Playback engine timing before session deactivation',\n                formatPlaybackProgressStats(playbackStats)\n              );\n            }\n          );\n          await runStep(\n            'Playback Session Deactivation Mid Run',\n            steps,\n            'deactivate-mid-playback',\n            'Deactivate session without pausing playback first',\n            async () => {\n              await AudioManager.setAudioSessionActivity(false);\n              await waitForPlaybackToStall();\n            }\n          );\n          await runStep(\n            'Playback Session Deactivation Mid Run',\n            steps,\n            'reactivate-playback',\n            'Reactivate playback and confirm fresh playback still works',\n            async () => {\n              const { assetBuffer, playback } =\n                resourcesRef.current.getReadyResources();\n              playback.stop();\n              const playbackStats = await performCleanPlayback(\n                assetBuffer,\n                1.2,\n                'Playback Session Deactivation Recovery'\n              );\n              addInfoStep(\n                steps,\n                'post-deactivation-recovery-engine-timing',\n                'Playback engine timing after recovery',\n                formatPlaybackProgressStats(playbackStats)\n              );\n            }\n          );\n        }\n      );\n\n      await runScenario(\n        'record_session_deactivation_mid_run',\n        'Record Session Deactivation Mid Run',\n        async (steps) => {\n          await runStep(\n            'Record Session Deactivation Mid Run',\n            steps,\n            'start-recording',\n            'Start recording and wait for callback data',\n            async () => {\n              await activateRecordingSession();\n              resourcesRef.current.configureRecorderTap();\n              resourcesRef.current.startRecording(\n                `record-deactivation-${Date.now()}`\n              );\n              await waitForRecordingCallbacks(1);\n            }\n          );\n          await runStep(\n            'Record Session Deactivation Mid Run',\n            steps,\n            'deactivate-mid-recording',\n            'Deactivate session without stopping recording first',\n            async () => {\n              await AudioManager.setAudioSessionActivity(false);\n              await waitForRecordingToStall();\n              const recorder = resourcesRef.current.recorder;\n\n              addInfoStep(\n                steps,\n                'post-deactivation-paused-state',\n                'Recorder paused state after session deactivation',\n                `isPaused=${recorder?.isPaused() ?? false}`\n              );\n            }\n          );\n          await runStep(\n            'Record Session Deactivation Mid Run',\n            steps,\n            'stop-after-deactivation',\n            'Attempt stop after deactivation, then recreate resources',\n            async () => {\n              const recorder = resourcesRef.current.recorder;\n\n              if (!recorder) {\n                throw new Error('Recorder is not ready');\n              }\n\n              const result = recorder.stop();\n              recorder.clearOnAudioReady();\n\n              if (result.status === 'error') {\n                addInfoStep(\n                  steps,\n                  'stop-after-deactivation-result',\n                  'Recorder stop returned an error after deactivation',\n                  result.message\n                );\n              }\n\n              await hardResetResources('recover after recording deactivation');\n            }\n          );\n          await runStep(\n            'Record Session Deactivation Mid Run',\n            steps,\n            'clean-recovery-cycle',\n            'Run one clean record and decode cycle after recovery',\n            async () => {\n              await performCleanRecording(`post-record-recovery-${Date.now()}`);\n            }\n          );\n        }\n      );\n\n      await runScenario(\n        'wrong_category_then_recover',\n        'Wrong Category Then Recover',\n        async (steps) => {\n          await runStep(\n            'Wrong Category Then Recover',\n            steps,\n            'attempt-wrong-category-record',\n            'Attempt recording while the session is configured for playback',\n            async () => {\n              AudioManager.setAudioSessionOptions({\n                iosCategory: 'playback',\n                iosMode: 'default',\n                iosOptions: [],\n              });\n\n              const active = await AudioManager.setAudioSessionActivity(true);\n\n              if (!active) {\n                throw new Error('Failed to activate playback session');\n              }\n\n              resourcesRef.current.configureRecorderTap();\n              const result = resourcesRef.current.tryStartRecording(\n                `wrong-category-${Date.now()}`\n              );\n\n              if (result.status === 'success') {\n                throw new Error(\n                  'Recording unexpectedly started under playback-only session settings'\n                );\n              }\n\n              addInfoStep(\n                steps,\n                'expected-recording-failure',\n                'Recorder rejected the wrong category as expected',\n                result.message\n              );\n\n              resourcesRef.current.recorder?.clearOnAudioReady();\n              await AudioManager.setAudioSessionActivity(false);\n            }\n          );\n          await runStep(\n            'Wrong Category Then Recover',\n            steps,\n            'clean-recovery-record',\n            'Switch back to playAndRecord and confirm clean recording works',\n            async () => {\n              await performCleanRecording(\n                `wrong-category-recovery-${Date.now()}`\n              );\n            }\n          );\n        }\n      );\n\n      await runScenario(\n        'final_clean_cycle',\n        'Final Clean Cycle',\n        async (steps) => {\n          await runStep(\n            'Final Clean Cycle',\n            steps,\n            'final-record-playback-cycle',\n            'Run one final clean record and playback cycle',\n            async () => {\n              await performCleanRecordPlaybackCycle('final-clean-cycle');\n            }\n          );\n        }\n      );\n\n      if (!stopRequestedRef.current) {\n        appendLog('Suite completed.');\n        setVisibleStep('Suite completed.');\n      }\n    } catch (error) {\n      if (error instanceof StopRequestedError) {\n        appendLog('Suite stopped before completion.');\n        setVisibleStep('Suite stopped.');\n      } else {\n        const serializedError = serializeUnknownError(error, 'Suite');\n        appendLog(`Suite aborted: ${serializedError.headline}`);\n        setVisibleStep(serializedError.headline);\n      }\n    } finally {\n      await resourcesRef.current.cleanup();\n\n      if (!isMountedRef.current || currentRunId !== runIdRef.current) {\n        return;\n      }\n\n      setRunnerState(stopRequestedRef.current ? 'finished' : 'finished');\n\n      if (!stopRequestedRef.current && scenarioResults.length === 0) {\n        setVisibleStep('Suite finished.');\n      }\n    }\n  };\n\n  const resetSuite = async () => {\n    if (runnerState === 'running' || runnerState === 'stopping') {\n      return;\n    }\n\n    setVisibleStep('Resetting resources...');\n    appendLog('Resetting screen state.');\n    setScenarioResults([]);\n    setLiveLog([]);\n    await resourcesRef.current.cleanup();\n    setVisibleStep('Ready to run the audio pipeline stress suite.');\n    setRunnerState('idle');\n  };\n\n  if (Platform.OS !== 'ios') {\n    return (\n      <Container centered>\n        <TestUI.UnsupportedNotice\n          title=\"Audio Pipeline Stress\"\n          message=\"This screen is iOS-only because it validates the shared iOS audio session and engine pipeline.\"\n        />\n      </Container>\n    );\n  }\n\n  const passedScenarios = scenarioResults.filter(\n    (result) => result.status === 'pass'\n  ).length;\n  const failedScenarios = scenarioResults.filter(\n    (result) => result.status === 'fail'\n  ).length;\n  const skippedScenarios = scenarioResults.filter(\n    (result) => result.status === 'skipped'\n  ).length;\n  const summaryItems: SummaryItem[] = [\n    { label: 'State', value: runnerState },\n    { label: 'Passed', value: String(passedScenarios) },\n    { label: 'Failed', value: String(failedScenarios) },\n    { label: 'Skipped', value: String(skippedScenarios) },\n  ];\n  const controlActions: ControlAction[] = [\n    {\n      title: 'Run Suite',\n      onPress: () => {\n        runSuite();\n      },\n      disabled: runnerState === 'running' || runnerState === 'stopping',\n      width: 120,\n    },\n    {\n      title: 'Stop',\n      onPress: requestStop,\n      disabled: runnerState !== 'running',\n      width: 90,\n    },\n    {\n      title: 'Reset',\n      onPress: () => {\n        resetSuite();\n      },\n      disabled: runnerState === 'running' || runnerState === 'stopping',\n      width: 90,\n    },\n  ];\n  const scenarioItems: ScenarioItem[] = scenarioResults.map((scenario) => ({\n    id: `${scenario.scenarioId}-${scenario.startedAt}`,\n    title: scenario.label,\n    status: scenario.status,\n    durationLabel: formatDurationMs(scenario.finishedAt - scenario.startedAt),\n    steps: scenario.steps.map((step) => ({\n      id: `${scenario.scenarioId}-${step.id}`,\n      message: step.message,\n      status: step.status,\n      details: step.details,\n    })),\n  }));\n\n  return (\n    <Container disablePadding>\n      <TestUI.Header\n        title=\"Audio Pipeline Stress\"\n        subtitle=\"Automated iOS playback and recording pipeline stress suite.\"\n      />\n      <TestUI.Summary items={summaryItems} />\n      <TestUI.CurrentStepCard message={currentStep} />\n      <TestUI.ControlBar actions={controlActions} />\n\n      <ScrollView\n        style={styles.scrollView}\n        contentContainerStyle={styles.scrollContent}\n      >\n        <TestUI.ScenarioResults\n          scenarios={scenarioItems}\n          emptyMessage=\"No scenario results yet.\"\n        />\n        <TestUI.LiveLog\n          entries={liveLog}\n          emptyMessage=\"Live log will appear here while the suite runs.\"\n        />\n      </ScrollView>\n    </Container>\n  );\n};\n\nconst styles = StyleSheet.create({\n  scrollContent: {\n    gap: 12,\n    paddingHorizontal: 18,\n    paddingTop: 18,\n    paddingBottom: 32,\n  },\n  scrollView: {\n    flex: 1,\n  },\n});\n\nexport default AudioPipelineStress;\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/StopRequestedError.ts",
    "content": "export default class StopRequestedError extends Error {\n  constructor() {\n    super('Run stopped by user');\n    this.name = 'StopRequestedError';\n  }\n}\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/StressPlaybackController.ts",
    "content": "import { AudioBuffer, AudioBufferSourceNode, AudioContext } from 'react-native-audio-api';\n\nexport default class StressPlaybackController {\n  private readonly context: AudioContext;\n  private source: AudioBufferSourceNode | null = null;\n  private lastPositionSeconds = 0;\n  private ended = false;\n\n  constructor(context: AudioContext) {\n    this.context = context;\n  }\n\n  async play(buffer: AudioBuffer, durationSeconds?: number): Promise<void> {\n    this.stop();\n\n    if (this.context.state === 'suspended') {\n      await this.context.resume();\n    }\n\n    const source = this.context.createBufferSource({\n      pitchCorrection: true,\n    });\n\n    this.lastPositionSeconds = 0;\n    this.ended = false;\n    this.source = source;\n    source.buffer = buffer;\n    source.onPositionChangedInterval = 50;\n    source.onPositionChanged = (event) => {\n      this.lastPositionSeconds = event.value;\n    };\n    source.onEnded = () => {\n      this.ended = true;\n    };\n    source.connect(this.context.destination);\n    source.start(this.context.currentTime, 0, durationSeconds);\n  }\n\n  stop(): void {\n    if (!this.source) {\n      return;\n    }\n\n    this.source.onEnded = null;\n    this.source.onPositionChanged = null;\n\n    try {\n      this.source.stop(this.context.currentTime);\n    } catch {\n      // Source nodes cannot always be stopped twice safely.\n    }\n\n    this.source = null;\n  }\n\n  snapshot() {\n    return {\n      ended: this.ended,\n      lastPositionSeconds: this.lastPositionSeconds,\n      isActive: this.source !== null,\n    };\n  }\n}\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/StressResourceOwner.ts",
    "content": "import {\n  AudioBuffer,\n  AudioContext,\n  AudioManager,\n  AudioRecorder,\n  FileDirectory,\n  FileFormat,\n} from 'react-native-audio-api';\n\nimport { BUFFER_LENGTH, MIN_DECODED_DURATION_SECONDS } from './constants';\nimport StressPlaybackController from './StressPlaybackController';\nimport type { RecordingCapture, ReadyResources } from './types';\n\ninterface RecorderHostShape {\n  isPaused?: unknown;\n}\n\nexport default class StressResourceOwner {\n  public context: AudioContext | null = null;\n  public recorder: AudioRecorder | null = null;\n  public playback: StressPlaybackController | null = null;\n  public assetBuffer: AudioBuffer | null = null;\n  public lastRecorderError: string | null = null;\n  public callbackCount = 0;\n  public lastCallbackFrames = 0;\n\n  private readonly asset: string | number;\n\n  constructor(asset: string | number) {\n    this.asset = asset;\n  }\n\n  async recreate(): Promise<void> {\n    await this.cleanup();\n\n    const context = new AudioContext();\n    const recorder = new AudioRecorder();\n    const recorderHost = (\n      recorder as unknown as { recorder?: RecorderHostShape }\n    ).recorder;\n\n    if (typeof recorderHost?.isPaused !== 'function') {\n      throw new Error(\n        `Recorder host object is missing isPaused(); typeof isPaused=${typeof recorderHost?.isPaused}`\n      );\n    }\n\n    const fileOutputResult = recorder.enableFileOutput({\n      channelCount: 1,\n      directory: FileDirectory.Cache,\n      fileNamePrefix: 'audio-pipeline-stress',\n      format: FileFormat.M4A,\n      subDirectory: 'AudioPipelineStress',\n    });\n\n    if (fileOutputResult.status === 'error') {\n      throw new Error(\n        `Failed to enable recorder file output: ${fileOutputResult.message}`\n      );\n    }\n\n    recorder.onError((event) => {\n      this.lastRecorderError = event.message;\n    });\n\n    this.context = context;\n    this.recorder = recorder;\n    this.playback = new StressPlaybackController(context);\n    this.assetBuffer = await context.decodeAudioData(this.asset);\n    this.lastRecorderError = null;\n    this.callbackCount = 0;\n    this.lastCallbackFrames = 0;\n  }\n\n  getReadyResources(): ReadyResources {\n    if (\n      !this.context ||\n      !this.recorder ||\n      !this.playback ||\n      !this.assetBuffer\n    ) {\n      throw new Error('Audio pipeline resources are not ready');\n    }\n\n    return {\n      assetBuffer: this.assetBuffer,\n      context: this.context,\n      playback: this.playback,\n      recorder: this.recorder,\n    };\n  }\n\n  configureRecorderTap(): void {\n    const { context, recorder } = this.getReadyResources();\n    this.callbackCount = 0;\n    this.lastCallbackFrames = 0;\n    this.lastRecorderError = null;\n\n    const callbackResult = recorder.onAudioReady(\n      {\n        sampleRate: context.sampleRate,\n        channelCount: 1,\n        bufferLength: BUFFER_LENGTH,\n      },\n      (event) => {\n        this.callbackCount += 1;\n        this.lastCallbackFrames = event.numFrames;\n      }\n    );\n\n    if (callbackResult.status === 'error') {\n      throw new Error(\n        `Failed to attach recorder callback: ${callbackResult.message}`\n      );\n    }\n  }\n\n  startRecording(fileNameOverride: string): void {\n    const { recorder } = this.getReadyResources();\n    const result = recorder.start({ fileNameOverride });\n\n    if (result.status === 'error') {\n      throw new Error(`Failed to start recording: ${result.message}`);\n    }\n  }\n\n  tryStartRecording(fileNameOverride: string) {\n    const { recorder } = this.getReadyResources();\n    return recorder.start({ fileNameOverride });\n  }\n\n  async stopRecordingAndDecode(): Promise<RecordingCapture> {\n    const { context, recorder } = this.getReadyResources();\n\n    const stopResult = recorder.stop();\n    recorder.clearOnAudioReady();\n\n    if (stopResult.status === 'error') {\n      throw new Error(`Failed to stop recording: ${stopResult.message}`);\n    }\n\n    if (!stopResult.paths.length) {\n      throw new Error('Recorder stop returned an empty file path');\n    }\n\n    const filePath = stopResult.paths[0];\n\n    const decodedBuffer = await context.decodeAudioData(filePath);\n\n    if (decodedBuffer.duration < MIN_DECODED_DURATION_SECONDS) {\n      throw new Error(\n        `Decoded buffer is too short: ${decodedBuffer.duration.toFixed(3)}s`\n      );\n    }\n\n    return {\n      decodedBuffer,\n      fileDurationSeconds: stopResult.duration,\n      path: filePath,\n    };\n  }\n\n  async cleanup(): Promise<void> {\n    const recorder = this.recorder;\n    const playback = this.playback;\n    const context = this.context;\n\n    try {\n      playback?.stop();\n    } catch {}\n\n    try {\n      recorder?.clearOnAudioReady();\n    } catch {}\n\n    try {\n      recorder?.clearOnError();\n    } catch {}\n\n    try {\n      if (recorder && (recorder.isRecording() || recorder.isPaused())) {\n        recorder.stop();\n      }\n    } catch {}\n\n    try {\n      recorder?.disableFileOutput();\n    } catch {}\n\n    try {\n      if (context?.state === 'running') {\n        await context.suspend();\n      }\n    } catch {}\n\n    try {\n      await context?.close();\n    } catch {}\n\n    try {\n      await AudioManager.setAudioSessionActivity(false);\n    } catch {}\n\n    this.context = null;\n    this.recorder = null;\n    this.playback = null;\n    this.assetBuffer = null;\n    this.lastRecorderError = null;\n    this.callbackCount = 0;\n    this.lastCallbackFrames = 0;\n  }\n}\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/audioSessions.ts",
    "content": "import { AudioManager } from 'react-native-audio-api';\n\nexport async function activatePlaybackSession(): Promise<void> {\n  AudioManager.setAudioSessionOptions({\n    iosCategory: 'playback',\n    iosMode: 'default',\n    iosOptions: [],\n  });\n\n  const success = await AudioManager.setAudioSessionActivity(true);\n\n  if (!success) {\n    throw new Error('Failed to activate playback session');\n  }\n}\n\nexport async function activateRecordingSession(): Promise<void> {\n  AudioManager.setAudioSessionOptions({\n    iosCategory: 'playAndRecord',\n    iosMode: 'default',\n    iosOptions: ['defaultToSpeaker', 'allowBluetoothA2DP'],\n  });\n\n  const success = await AudioManager.setAudioSessionActivity(true);\n\n  if (!success) {\n    throw new Error('Failed to activate recording session');\n  }\n}\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/constants.ts",
    "content": "export const DEFAULT_LOOP_COUNT = 5;\nexport const PLAYBACK_PROGRESS_TIMEOUT_MS = 4000;\nexport const RECORDING_CALLBACK_TIMEOUT_MS = 4000;\nexport const POSITION_POLL_INTERVAL_MS = 150;\nexport const PLAYBACK_STALL_WINDOW_MS = 900;\nexport const RECORDING_STALL_WINDOW_MS = 900;\nexport const SHORT_RECORDING_MS = 900;\nexport const SHORT_PLAYBACK_MS = 1100;\nexport const BUFFER_LENGTH = 4096;\nexport const MIN_DECODED_DURATION_SECONDS = 0.2;\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/helpers.ts",
    "content": "import { POSITION_POLL_INTERVAL_MS } from './constants';\nimport type { PlaybackProgressStats, SerializedError } from './types';\n\nexport async function sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function formatDurationMs(durationMs: number): string {\n  return `${(durationMs / 1000).toFixed(2)}s`;\n}\n\nexport function formatTimestamp(timestamp: number): string {\n  const date = new Date(timestamp);\n  return date.toLocaleTimeString([], {\n    hour: '2-digit',\n    minute: '2-digit',\n    second: '2-digit',\n  });\n}\n\nexport function getPlaybackProgressThreshold(durationSeconds: number): number {\n  return Number(\n    Math.max(0.08, Math.min(durationSeconds * 0.15, 0.18)).toFixed(2)\n  );\n}\n\nexport function serializeUnknownError(\n  error: unknown,\n  contextLabel?: string\n): SerializedError {\n  const prefix = contextLabel ? `${contextLabel}: ` : '';\n\n  if (error instanceof Error) {\n    const headline = `${prefix}${error.name}: ${error.message}`;\n    const details = [headline, error.stack].filter(Boolean).join('\\n');\n\n    return { headline, details };\n  }\n\n  const type = typeof error;\n  const constructorName =\n    error && typeof error === 'object' && 'constructor' in error\n      ? ((error as { constructor?: { name?: string } }).constructor?.name ??\n        'unknown')\n      : 'n/a';\n  const keys =\n    error && typeof error === 'object' ? Object.keys(error as object) : [];\n\n  let renderedValue = '';\n\n  try {\n    renderedValue =\n      typeof error === 'string' ? error : JSON.stringify(error, null, 2);\n  } catch {\n    renderedValue = String(error);\n  }\n\n  const headline = `${prefix}Non-Error throw: ${String(error)}`;\n  const details = [\n    headline,\n    `typeof=${type}`,\n    `constructor=${constructorName}`,\n    `keys=${keys.join(', ') || 'none'}`,\n    `value=${renderedValue}`,\n  ].join('\\n');\n\n  return { headline, details };\n}\n\nexport function formatPlaybackProgressStats(\n  stats: PlaybackProgressStats\n): string {\n  const diagnosis =\n    stats.engineDeltaSeconds < 0.05\n      ? 'engine-clock-stalled'\n      : stats.positionMaxObservedSeconds < stats.thresholdSeconds\n        ? 'engine-running-node-stalled'\n        : 'engine-and-node-running';\n\n  return [\n    `diagnosis=${diagnosis}`,\n    `threshold=${stats.thresholdSeconds.toFixed(2)}s`,\n    `positionMax=${stats.positionMaxObservedSeconds.toFixed(3)}s`,\n    `engineDelta=${stats.engineDeltaSeconds.toFixed(3)}s`,\n    `engineStart=${stats.engineStartTimeSeconds.toFixed(3)}s`,\n    `engineEnd=${stats.engineEndTimeSeconds.toFixed(3)}s`,\n    `recentPositionSamples=[${stats.positionSamples\n      .slice(-8)\n      .map((value) => value.toFixed(3))\n      .join(', ')}]`,\n    `recentEngineSamples=[${stats.engineSamples\n      .slice(-8)\n      .map((value) => value.toFixed(3))\n      .join(', ')}]`,\n  ].join(', ');\n}\n\nexport async function waitForCondition(\n  condition: () => boolean,\n  timeoutMs: number,\n  failureMessage: string,\n  intervalMs: number = POSITION_POLL_INTERVAL_MS\n): Promise<void> {\n  const startedAt = Date.now();\n\n  while (Date.now() - startedAt < timeoutMs) {\n    if (condition()) {\n      return;\n    }\n\n    await sleep(intervalMs);\n  }\n\n  throw new Error(failureMessage);\n}\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/index.ts",
    "content": "export { default } from './AudioPipelineStress';\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioPipelineStress/types.ts",
    "content": "import type { AudioBuffer, AudioContext, AudioRecorder } from 'react-native-audio-api';\n\nimport type StressPlaybackController from './StressPlaybackController';\n\nexport type RunnerState = 'idle' | 'running' | 'stopping' | 'finished';\n\nexport type ScenarioId =\n  | 'playback_warmup'\n  | 'record_warmup'\n  | 'record_to_playback_loop'\n  | 'playback_to_record_loop'\n  | 'playback_session_deactivation_mid_run'\n  | 'record_session_deactivation_mid_run'\n  | 'wrong_category_then_recover'\n  | 'final_clean_cycle';\n\nexport type StepStatus = 'pass' | 'fail' | 'info' | 'skipped';\nexport type ScenarioStatus = 'pass' | 'fail' | 'skipped';\n\nexport interface StepResult {\n  id: string;\n  message: string;\n  status: StepStatus;\n  startedAt: number;\n  finishedAt: number;\n  details?: string;\n}\n\nexport interface ScenarioResult {\n  scenarioId: ScenarioId;\n  label: string;\n  status: ScenarioStatus;\n  startedAt: number;\n  finishedAt: number;\n  steps: StepResult[];\n  error?: string;\n}\n\nexport interface RecordingCapture {\n  decodedBuffer: AudioBuffer;\n  fileDurationSeconds: number;\n  path: string;\n}\n\nexport interface ReadyResources {\n  assetBuffer: AudioBuffer;\n  context: AudioContext;\n  playback: StressPlaybackController;\n  recorder: AudioRecorder;\n}\n\nexport interface SerializedError {\n  headline: string;\n  details: string;\n}\n\nexport interface PlaybackProgressStats {\n  engineEndTimeSeconds: number;\n  engineDeltaSeconds: number;\n  engineStartTimeSeconds: number;\n  engineSamples: number[];\n  positionMaxObservedSeconds: number;\n  positionSamples: number[];\n  thresholdSeconds: number;\n}\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioTag/AudioTag.tsx",
    "content": "import React, { useRef } from 'react';\nimport { Button, View } from 'react-native';\nimport { Audio, AudioTagHandle } from 'react-native-audio-api/development/react';\n\nimport { Container } from '../../components';\n\n// const DEMO_AUDIO_URL = 'https://filesamples.com/samples/audio/m4a/sample4.m4a';\nconst DEMO_AUDIO_URL = 'https://filesamples.com/samples/audio/mp3/sample4.mp3';\n\nconst AudioTag: React.FC = () => {\n  const audioRef = useRef<AudioTagHandle>(null);\n\n  // const handlePlay = () => {\n  //   audioRef.current?.play();\n  // };\n\n  // const handlePause = () => {\n  //   audioRef.current?.pause();\n  // };\n\n  // const handleSeekToTime = (time: number) => {\n  //   console.log('handleSeekToTime', time);\n  //   audioRef.current?.seekToTime(time);\n  // };\n\n  // const handleSetVolume = (volume: number) => {\n  //   audioRef.current?.setVolume(volume);\n  // };\n\n  // const handleSetMuted = (muted: boolean) => {\n  //   audioRef.current?.setMuted(muted);\n  // };\n\n  return (\n    <Container disablePadding>\n      <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n        <View style={{ width: '90%' }}>\n          <Audio source={DEMO_AUDIO_URL} ref={audioRef} controls\n                 onLoadStart={() => console.log('onLoadStart')}\n                 onLoad={() => console.log('onLoad')}\n                 onError={(error) => console.log('onError', error)}\n                 onPositionChange={(seconds) =>\n                   console.log('onPositionChange', seconds)\n                 }\n                 onEnded={() => console.log('onEnded')}\n                 onPlay={() => console.log('onPlay')}\n                 onPause={() => console.log('onPause')}\n                 onVolumeChange={(volume) => console.log('onVolumeChange', volume)}\n                 />\n        </View>\n      </View>\n    </Container>\n  );\n};\n\nexport default AudioTag;\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioTag/index.ts",
    "content": "export { default } from './AudioTag';\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioVisualizer/AudioVisualizer.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport { ActivityIndicator, View } from 'react-native';\nimport {\n  AnalyserNode,\n  AudioBuffer,\n  AudioBufferSourceNode,\n  AudioContext,\n} from 'react-native-audio-api';\n\nimport { Button, Container } from '../../components';\nimport { layout } from '../../styles';\nimport FreqTimeChart from './FreqTimeChart';\n\nconst FFT_SIZE = 512;\n\nconst URL =\n  'https://software-mansion.github.io/react-native-audio-api/audio/music/example-music-02.mp3';\n\nconst AudioVisualizer: React.FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n  const [audioBuffer, setAudioBuffer] = useState<AudioBuffer | null>(null);\n\n  const [times, setTimes] = useState<Uint8Array>(\n    new Uint8Array(FFT_SIZE).fill(127)\n  );\n  const [freqs, setFreqs] = useState<Uint8Array>(\n    new Uint8Array(FFT_SIZE / 2).fill(0)\n  );\n\n  const [startTime, setStartTime] = useState(0);\n  const [offset, setOffset] = useState(0);\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const analyserRef = useRef<AnalyserNode | null>(null);\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n\n  const handlePlayPause = () => {\n    if (isPlaying) {\n      const stopTime = audioContextRef.current!.currentTime;\n      bufferSourceRef.current?.stop(stopTime);\n      setOffset((prev) => prev + stopTime - startTime);\n    } else {\n      if (!audioContextRef.current || !analyserRef.current) {\n        return;\n      }\n\n      if (!audioBuffer) {\n        fetchAudioBuffer();\n      }\n\n      bufferSourceRef.current = audioContextRef.current.createBufferSource();\n      bufferSourceRef.current.buffer = audioBuffer;\n      bufferSourceRef.current.connect(analyserRef.current);\n\n      setStartTime(audioContextRef.current.currentTime);\n      bufferSourceRef.current.start(startTime, offset);\n\n      requestAnimationFrame(draw);\n    }\n\n    setIsPlaying((prev) => !prev);\n  };\n\n  const draw = () => {\n    if (!analyserRef.current) {\n      return;\n    }\n\n    const timesArrayLength = analyserRef.current.fftSize;\n    const frequencyArrayLength = analyserRef.current.frequencyBinCount;\n\n    const timesArray = new Uint8Array(timesArrayLength);\n    analyserRef.current.getByteTimeDomainData(timesArray);\n    setTimes(timesArray);\n\n    const freqsArray = new Uint8Array(frequencyArrayLength);\n    analyserRef.current.getByteFrequencyData(freqsArray);\n    setFreqs(freqsArray);\n\n    requestAnimationFrame(draw);\n  };\n\n  const fetchAudioBuffer = async () => {\n    setIsLoading(true);\n\n    const buffer = await fetch(URL)\n      .then((response) => response.arrayBuffer())\n      .then((arrayBuffer) =>\n        audioContextRef.current!.decodeAudioData(arrayBuffer)\n      )\n      .catch((error) => {\n        console.error('Error decoding audio data source:', error);\n        return null;\n      });\n\n    setAudioBuffer(buffer);\n\n    setIsLoading(false);\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    if (!analyserRef.current) {\n      analyserRef.current = new AnalyserNode(audioContextRef.current, { fftSize: FFT_SIZE, smoothingTimeConstant: 0.2 });\n      analyserRef.current.connect(audioContextRef.current.destination);\n    }\n\n    fetchAudioBuffer();\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <Container disablePadding>\n      <View style={{ flex: 0.2 }} />\n      <FreqTimeChart\n        timeData={times}\n        frequencyData={freqs}\n        fftSize={analyserRef.current?.fftSize || FFT_SIZE}\n        frequencyBinCount={\n          analyserRef.current?.frequencyBinCount || FFT_SIZE / 2\n        }\n      />\n      <View\n        style={{ flex: 0.5, justifyContent: 'center', alignItems: 'center' }}>\n        {isLoading && <ActivityIndicator color=\"#FFFFFF\" />}\n        <View\n          style={{\n            justifyContent: 'center',\n            flexDirection: 'row',\n            marginTop: layout.spacing * 2,\n          }}>\n          <Button\n            onPress={handlePlayPause}\n            title={isPlaying ? 'Pause' : 'Play'}\n            disabled={!audioBuffer}\n          />\n        </View>\n      </View>\n    </Container>\n  );\n};\n\nexport default AudioVisualizer;\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioVisualizer/Canvas.tsx",
    "content": "import React, {\n  useContext,\n  createContext,\n  PropsWithChildren,\n  useMemo,\n} from 'react';\nimport { StyleSheet } from 'react-native';\nimport { Canvas as SKCanvas, useCanvasSize } from '@shopify/react-native-skia';\n\ninterface Size {\n  width: number;\n  height: number;\n}\n\ninterface CanvasContext {\n  initialized: boolean;\n  size: Size;\n}\n\nconst CanvasContext = createContext<CanvasContext>({\n  initialized: false,\n  size: { width: 0, height: 0 },\n});\n\nconst Canvas: React.FC<PropsWithChildren> = ({ children }) => {\n  const { ref, size } = useCanvasSize();\n\n  const context = useMemo(\n    () => ({\n      initialized: true,\n      size: { width: size.width, height: size.height },\n    }),\n    [size]\n  );\n\n  return (\n    <SKCanvas style={styles.canvas} ref={ref}>\n      <CanvasContext.Provider value={context}>\n        {children}\n      </CanvasContext.Provider>\n    </SKCanvas>\n  );\n};\n\nexport function useCanvas() {\n  const canvasContext = useContext(CanvasContext);\n\n  if (!canvasContext.initialized) {\n    throw new Error('Canvas context not initialized');\n  }\n\n  return canvasContext;\n}\n\nexport function withCanvas<P extends object>(\n  Component: React.ComponentType<P>\n) {\n  return (props: P) => {\n    return (\n      <Canvas>\n        <Component {...props} />\n      </Canvas>\n    );\n  };\n}\n\nexport default Canvas;\n\nconst styles = StyleSheet.create({\n  canvas: {\n    flex: 1,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioVisualizer/Charts.tsx",
    "content": "import React, { useMemo } from 'react';\nimport {\n  Points,\n  vec,\n  Line,\n  Circle,\n  Skia,\n  PaintStyle,\n  SkPoint,\n} from '@shopify/react-native-skia';\n\nimport { useCanvas } from './Canvas';\nimport { colors } from '../../styles';\nimport { getPointCX, getPointCY, getAngle } from '../../utils/skiUtils';\n\nconst INNER_RADIUS = 90;\nconst OUTER_RADIUS = 150;\n\ninterface Point {\n  x1: number;\n  y1: number;\n  x2: number;\n  y2: number;\n  color: string;\n}\n\nfunction sampleExp(value: number) {\n  return Math.exp(2.5 * value) / 4 - 0.2;\n}\n\nfunction weightWithIndex(value: number, index: number, indexMax: number) {\n  if (index < indexMax / 2) {\n    return value * Math.max(index / (indexMax / 2), 0.5);\n  }\n\n  return value;\n}\n\ninterface ChartProps {\n  data: Uint8Array;\n  fftSize: number;\n  frequencyBinCount: number;\n}\n\nconst TimeChart: React.FC<ChartProps> = (props) => {\n  const { size } = useCanvas();\n  const { data, fftSize } = props;\n\n  const circlePaint = useMemo(() => {\n    const paint = Skia.Paint();\n    paint.setAntiAlias(true);\n    paint.setColor(Skia.Color(colors.yellow));\n    paint.setStyle(PaintStyle.Stroke);\n    paint.setStrokeWidth(6);\n    return paint;\n  }, []);\n\n  const points = useMemo(() => {\n    const maxHeight = size.height;\n    const maxWidth = size.width;\n\n    const startWidth = (maxWidth - 2 * INNER_RADIUS) / 2;\n    const startHight = maxHeight - (maxHeight - 2 * INNER_RADIUS) / 2;\n\n    const p: SkPoint[] = [];\n\n    data.forEach((value, index) => {\n      const x = startWidth + (index * 2 * INNER_RADIUS) / fftSize;\n      const y = startHight - (value / 255) * 2 * INNER_RADIUS;\n\n      p.push(vec(x, y));\n    });\n\n    return p;\n  }, [size, data, fftSize]);\n\n  return (\n    <>\n      <Circle\n        cx={size.width / 2}\n        cy={size.height / 2}\n        r={140}\n        paint={circlePaint}\n      />\n      <Points points={points} mode=\"polygon\" color=\"#B5E1F1\" strokeWidth={2} />\n    </>\n  );\n};\n\nconst FrequencyChart: React.FC<ChartProps> = (props) => {\n  const { size } = useCanvas();\n  const { data, frequencyBinCount } = props;\n\n  const { points, barWidth } = useMemo(() => {\n    const maxHeight = size.height;\n    const maxWidth = size.width;\n    const bw = (Math.PI * 150) / (frequencyBinCount - 64);\n\n    const p: Point[] = [];\n\n    function getPoint(\n      index: number,\n      value: number,\n      color: string,\n      ogIndex: number\n    ) {\n      const angle = getAngle(index - 32, 2 * (frequencyBinCount - 64));\n      const x1 = getPointCX(angle, OUTER_RADIUS, maxWidth / 2);\n      const y1 = getPointCY(angle, OUTER_RADIUS, maxHeight / 2);\n\n      const x2 = getPointCX(\n        angle,\n        OUTER_RADIUS +\n          sampleExp(\n            weightWithIndex(value / 255.0, ogIndex, frequencyBinCount)\n          ) *\n            40,\n        maxWidth / 2\n      );\n\n      const y2 = getPointCY(\n        angle,\n        OUTER_RADIUS +\n          sampleExp(\n            weightWithIndex(value / 255.0, ogIndex, frequencyBinCount)\n          ) *\n            40,\n        maxHeight / 2\n      );\n\n      return { color, x1, y1, x2, y2 };\n    }\n\n    data.forEach((value, index) => {\n      if (index < 32 || index >= frequencyBinCount - 32) {\n        return;\n      }\n\n      const hue = 180 + 20 * (index / frequencyBinCount);\n      const color = `hsla(${hue}, 100%, 50%, 80%)`;\n\n      p.push(getPoint(index, value, color, index));\n      p.push(getPoint(2 * frequencyBinCount - 65 - index, value, color, index));\n    });\n\n    return { points: p, barWidth: bw };\n  }, [size, data, frequencyBinCount]);\n\n  return (\n    <>\n      {points.map((point, index) => (\n        <Line\n          key={index}\n          p1={vec(point.x1, point.y1)}\n          p2={vec(point.x2, point.y2)}\n          style=\"stroke\"\n          color={point.color}\n          strokeWidth={barWidth}\n        />\n      ))}\n    </>\n  );\n};\n\nexport default {\n  TimeChart,\n  FrequencyChart,\n};\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioVisualizer/FreqTimeChart.tsx",
    "content": "import React from 'react';\n\nimport { withCanvas } from './Canvas';\nimport Charts from './Charts';\n\ninterface FreqTimeChartProps {\n  timeData: Uint8Array;\n  frequencyData: Uint8Array;\n  fftSize: number;\n  frequencyBinCount: number;\n}\n\nconst FreqTimeChart: React.FC<FreqTimeChartProps> = (props) => {\n  const { timeData, frequencyData, fftSize, frequencyBinCount } = props;\n\n  return (\n    <>\n      <Charts.TimeChart\n        data={timeData}\n        fftSize={fftSize}\n        frequencyBinCount={frequencyBinCount}\n      />\n      <Charts.FrequencyChart\n        data={frequencyData}\n        fftSize={fftSize}\n        frequencyBinCount={frequencyBinCount}\n      />\n    </>\n  );\n};\n\nexport default withCanvas(FreqTimeChart);\n"
  },
  {
    "path": "apps/common-app/src/examples/AudioVisualizer/index.ts",
    "content": "export { default } from './AudioVisualizer';\n"
  },
  {
    "path": "apps/common-app/src/examples/ConvolverIR/ConvolverIR.tsx",
    "content": "import React, { FC, useCallback, useEffect, useRef, useState } from 'react';\nimport { StyleSheet, Text } from 'react-native';\nimport {\n  AudioContext,\n  AudioManager,\n  ConvolverNode,\n  GainNode,\n  AudioBufferSourceNode,\n  AudioBuffer,\n} from 'react-native-audio-api';\n\nimport { Button, Container, Slider, Spacer } from '../../components';\nimport { colors, layout } from '../../styles';\n\nconst LABEL_W = 88;\nconst IR = require('./ir.wav');\nconst TRACK = require('./track.mp3');\n\nconst ConvolverIR: FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isReady, setIsReady] = useState(false);\n  const [gain, setGain] = useState(0.28);\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const impulseRef = useRef<AudioBuffer | null>(null);\n  const bufferRef = useRef<AudioBuffer | null>(null);\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n  const convolverRef = useRef<ConvolverNode | null>(null);\n\n  const teardownGraph = useCallback(() => {\n    try {\n      bufferSourceRef.current?.stop(0);\n    } catch {\n      /* not started */\n    }\n    bufferSourceRef.current?.disconnect();\n    gainRef.current?.disconnect();\n    convolverRef.current?.disconnect();\n    bufferSourceRef.current = null;\n    gainRef.current = null;\n    convolverRef.current = null;\n  }, []);\n\n  useEffect(() => {\n    const ctx = new AudioContext();\n    audioContextRef.current = ctx;\n\n    const downloadIR = async () => {\n      const buffer = await ctx.decodeAudioData(IR);\n      const track = await ctx.decodeAudioData(TRACK);\n      impulseRef.current = buffer;\n      bufferRef.current = track;\n      setIsReady(true);\n    };\n\n    downloadIR().catch(() => {});\n\n    return () => {\n      teardownGraph();\n      impulseRef.current = null;\n      bufferRef.current = null;\n      ctx.close().catch(() => {});\n      audioContextRef.current = null;\n      AudioManager.setAudioSessionActivity(false).catch(() => {});\n    };\n  }, []);\n\n  const stopPlayback = useCallback(async () => {\n    const ctx = audioContextRef.current;\n    if (!ctx) {\n      return;\n    }\n    bufferSourceRef.current?.stop(0);\n    await AudioManager.setAudioSessionActivity(false);\n    setIsPlaying(false);\n  }, []);\n\n  const startPlayback = useCallback(\n    async (useConvolver: boolean) => {\n      const ctx = audioContextRef.current;\n      const ir = impulseRef.current;\n      const trackBuf = bufferRef.current;\n      if (!ctx || !trackBuf || isPlaying) {\n        return;\n      }\n      if (useConvolver && !ir) {\n        return;\n      }\n\n      AudioManager.setAudioSessionOptions({\n        iosCategory: 'playback',\n        iosMode: 'default',\n        iosOptions: [],\n      });\n      await AudioManager.setAudioSessionActivity(true);\n\n      if (ctx.state === 'suspended') {\n        await ctx.resume();\n      }\n\n      const source = ctx.createBufferSource();\n      source.buffer = trackBuf;\n\n      const g = ctx.createGain();\n      g.gain.value = gain;\n\n      if (useConvolver && ir) {\n        const convolver = ctx.createConvolver();\n        convolver.buffer = ir;\n        source.connect(g).connect(convolver).connect(ctx.destination);\n        convolverRef.current = convolver;\n      } else {\n        source.connect(g).connect(ctx.destination);\n        convolverRef.current = null;\n      }\n\n      bufferSourceRef.current = source;\n      gainRef.current = g;\n\n      source.start(ctx.currentTime + 0.1, 10);\n      setIsPlaying(true);\n    },\n    [gain, isPlaying],\n  );\n\n  const onPlayWithConvolver = useCallback(() => {\n    startPlayback(true).catch(() => {});\n  }, [startPlayback]);\n\n  const onPlayDry = useCallback(() => {\n    startPlayback(false).catch(() => {});\n  }, [startPlayback]);\n\n  const onStop = useCallback(() => {\n    stopPlayback().catch(() => {});\n  }, [stopPlayback]);\n\n  const onGainChange = useCallback((v: number) => {\n    setGain(v);\n    if (gainRef.current) {\n      gainRef.current.gain.value = v;\n    }\n  }, []);\n\n  return (\n    <Container centered>\n      <Text style={styles.title}>Reverb</Text>\n      <Spacer.Vertical size={10} />\n      <Spacer.Vertical size={24} />\n      <Button\n        title=\"Play (convolver)\"\n        onPress={onPlayWithConvolver}\n        width={200}\n        disabled={!isReady || isPlaying}\n      />\n      <Spacer.Vertical size={12} />\n      <Button\n        title=\"Play (dry)\"\n        onPress={onPlayDry}\n        width={200}\n        disabled={!isReady || isPlaying}\n      />\n      <Spacer.Vertical size={12} />\n      <Button title=\"Stop\" onPress={onStop} width={200} disabled={!isPlaying} />\n      <Spacer.Vertical size={28} />\n      <Slider\n        label=\"Gain\"\n        value={gain}\n        onValueChange={onGainChange}\n        min={0.02}\n        max={0.6}\n        step={0.01}\n        minLabelWidth={LABEL_W}\n      />\n    </Container>\n  );\n};\n\nexport default ConvolverIR;\n\nconst styles = StyleSheet.create({\n  title: {\n    color: colors.white,\n    fontSize: 18,\n    fontWeight: '600',\n    textAlign: 'center',\n  },\n  copy: {\n    color: colors.white,\n    fontSize: 14,\n    lineHeight: 20,\n    opacity: 0.85,\n    textAlign: 'center',\n    paddingHorizontal: layout.spacing * 2,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/examples/ConvolverIR/index.ts",
    "content": "export { default } from './ConvolverIR';\n"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/DrumMachine.tsx",
    "content": "import { Canvas, useCanvasRef } from '@shopify/react-native-skia';\nimport React, { useState, useCallback, useLayoutEffect } from 'react';\nimport { AudioContext } from 'react-native-audio-api';\nimport { GestureDetector } from 'react-native-gesture-handler';\nimport { StyleSheet, View } from 'react-native';\n\nimport { colors } from '../../styles';\nimport { Select, Slider, Spacer, Container } from '../../components';\nimport Kick from '../../utils/soundEngines/Kick';\nimport Clap from '../../utils/soundEngines/Clap';\nimport HiHat from '../../utils/soundEngines/HiHat';\n\nimport { InstrumentName, Pattern, XYWHRect } from '../../types';\nimport { size, initialBpm, numBeats } from './constants';\nimport NotesHighlight from './NotesHighlight';\nimport PatternShape from './PatternShape';\nimport useGestures from './useGestures';\nimport PlayButton from './PlayButton';\nimport usePlayer from '../../utils/usePlayer';\nimport presets from './presets';\nimport Grid from './Grid';\n\nconst defaultPreset = 'Empty';\n\nfunction setupPlayer(audioCtx: AudioContext) {\n  const kick = new Kick(audioCtx);\n  const clap = new Clap(audioCtx);\n  const hiHat = new HiHat(audioCtx);\n\n  const playNote = (name: InstrumentName, time: number) => {\n    switch (name) {\n      case 'kick':\n        kick.play(time);\n        break;\n      case 'clap':\n        clap.play(time);\n        break;\n      case 'hi-hat':\n        hiHat.play(time);\n        break;\n    }\n  };\n\n  return { playNote };\n}\n\nconst DrumMachine: React.FC = () => {\n  const [preset, setPreset] = useState<string>(defaultPreset);\n  const [bpm, setBpm] = useState<number>(initialBpm);\n\n  const [patterns, setPatterns] = useState<Pattern[]>([\n    ...presets[defaultPreset].pattern,\n  ]);\n\n  const player = usePlayer({\n    bpm,\n    patterns,\n    notesPerBeat: 2,\n    numBeats,\n    setup: setupPlayer,\n  });\n\n  const ref = useCanvasRef();\n  const [canvasRect, setCanvasRect] = useState<XYWHRect>({\n    x: 0,\n    y: 0,\n    width: size,\n    height: size,\n  });\n  useLayoutEffect(() => {\n    ref.current?.measure(\n      (x: number, y: number, width: number, height: number) => {\n        setCanvasRect({ x, y, width, height });\n      }\n    );\n  }, [ref]);\n\n  const onPatternChange = useCallback(\n    (patternIdx: number, stepIdx: number) => {\n      if (preset !== 'Custom') {\n        setPreset('Custom');\n      }\n\n      setPatterns((prevPatterns) => {\n        const newPatterns = [...prevPatterns].map((pattern, idx) => {\n          if (idx !== patternIdx) {\n            return { ...pattern, steps: [...pattern.steps] };\n          }\n\n          const newPattern = { ...pattern, steps: [...pattern.steps] };\n          newPattern.steps[stepIdx] = !newPattern.steps[stepIdx];\n\n          return newPattern;\n        });\n\n        return newPatterns;\n      });\n    },\n    [preset]\n  );\n\n  const onSetPreset = useCallback(\n    (newPreset: string) => {\n      setPreset(newPreset);\n\n      if (newPreset !== 'Custom') {\n        setBpm(presets[newPreset].bpm);\n        setPatterns([...presets[newPreset].pattern]);\n      }\n    },\n    [setPreset]\n  );\n\n  const onPlayPress = useCallback(() => {\n    if (player.isPlaying) {\n      player.stop();\n    } else {\n      player.play();\n    }\n  }, [player]);\n\n  const gesture = useGestures({ canvasRect, onPatternChange });\n\n  return (\n    <Container>\n      <View>\n        <Select\n          value={preset}\n          onChange={onSetPreset}\n          options={Object.keys(presets)}\n        />\n        <Spacer.Vertical size={24} />\n        <Slider\n          label=\"BPM\"\n          step={1}\n          min={24}\n          max={1500}\n          value={bpm}\n          onValueChange={setBpm}\n        />\n      </View>\n      <Spacer.Vertical size={54} />\n      <GestureDetector gesture={gesture}>\n        <View style={styles.container}>\n          <Canvas ref={ref} style={{ width: size, height: size }}>\n            <Grid />\n            {patterns.map((pattern) => (\n              <PatternShape key={pattern.instrumentName} pattern={pattern} />\n            ))}\n            {player.isPlaying && (\n              <NotesHighlight\n                progressSV={player.progressSV}\n                playingInstruments={player.playingInstruments}\n              />\n            )}\n          </Canvas>\n          <PlayButton\n            onPress={onPlayPress}\n            canvasRect={canvasRect}\n            isPlaying={player.isPlaying}\n            playingInstruments={player.playingInstruments}\n          />\n        </View>\n      </GestureDetector>\n    </Container>\n  );\n};\n\nexport default DrumMachine;\n\nconst styles = StyleSheet.create({\n  screen: {\n    backgroundColor: colors.background,\n    flex: 1,\n    position: 'relative',\n  },\n  container: {\n    flex: 1,\n    position: 'relative',\n    alignItems: 'center',\n  },\n  row: {\n    flexDirection: 'row',\n    alignItems: 'center',\n  },\n  label: {\n    fontSize: 16,\n    color: colors.white,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/Grid.tsx",
    "content": "import React, { memo } from 'react';\nimport { StyleSheet } from 'react-native';\nimport { Line, Circle, Paint, vec } from '@shopify/react-native-skia';\n\nimport { colors } from '../../styles';\nimport { numBeats, cPoint, maxSize, buttonRadius } from './constants';\nimport { getAngle, getPointCX, getPointCY } from '../../utils/skiUtils';\nimport type { Instrument } from '../../types';\nimport instruments from './instruments';\n\nconst points = Array(numBeats).fill(0);\n\nconst Grid: React.FC = () => {\n  const renderLine = (index: number) => {\n    const angle = getAngle(index, numBeats);\n    const x = getPointCX(angle, maxSize / 2, cPoint.x);\n    const y = getPointCY(angle, maxSize / 2, cPoint.y);\n\n    return (\n      <Line\n        key={`line-${index}`}\n        p1={vec(cPoint.x, cPoint.y)}\n        p2={vec(x, y)}\n        strokeWidth={StyleSheet.hairlineWidth}\n        color={colors.border}\n      />\n    );\n  };\n\n  const renderTouchPoint = (instrument: Instrument, index: number) => {\n    const angle = getAngle(index, numBeats);\n    const x = getPointCX(angle, instrument.radius, cPoint.x);\n    const y = getPointCY(angle, instrument.radius, cPoint.y);\n\n    return (\n      <Circle\n        cx={x}\n        cy={y}\n        r={buttonRadius}\n        color={colors.border}\n        key={`${instrument.name}-${index}`}\n      />\n    );\n  };\n\n  const renderInstrument = (instrument: Instrument) => (\n    <React.Fragment key={instrument.name}>\n      <Circle\n        cx={cPoint.x}\n        cy={cPoint.y}\n        color=\"transparent\"\n        r={instrument.radius}>\n        <Paint\n          style=\"stroke\"\n          color={colors.border}\n          strokeWidth={StyleSheet.hairlineWidth}\n        />\n      </Circle>\n      {points.map((_, index) => renderTouchPoint(instrument, index))}\n    </React.Fragment>\n  );\n\n  return (\n    <>\n      {points.map((_, index) => renderLine(index))}\n      {instruments.map(renderInstrument)}\n    </>\n  );\n};\n\nexport default memo(Grid);\n"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/NotesHighlight.tsx",
    "content": "import React, { memo } from 'react';\nimport { Circle, Paint } from '@shopify/react-native-skia';\nimport { SharedValue, useDerivedValue } from 'react-native-reanimated';\n\nimport { Instrument, PlayingInstruments } from '../../types';\nimport { cPoint, buttonRadius } from './constants';\nimport { getPointCX, getPointCY } from '../../utils/skiUtils';\nimport instruments from './instruments';\n\ninterface NotesHighlightProps {\n  progressSV: SharedValue<number>;\n  playingInstruments: SharedValue<PlayingInstruments>;\n}\n\ninterface NoteHighlightProps {\n  instrument: Instrument;\n  progressSV: SharedValue<number>;\n  playingInstruments: SharedValue<PlayingInstruments>;\n}\n\nconst NoteHighlight: React.FC<NoteHighlightProps> = (props) => {\n  const { instrument, progressSV, playingInstruments } = props;\n\n  const angle = useDerivedValue(\n    () => progressSV.value * Math.PI * 2 - Math.PI / 2\n  );\n\n  const cX = useDerivedValue(() =>\n    getPointCX(angle.value, instrument.radius, cPoint.x)\n  );\n  const cY = useDerivedValue(() =>\n    getPointCY(angle.value, instrument.radius, cPoint.y)\n  );\n\n  const r = useDerivedValue(() =>\n    playingInstruments.value[instrument.name]\n      ? buttonRadius * 1.5\n      : buttonRadius\n  );\n\n  const color = useDerivedValue(() =>\n    playingInstruments.value[instrument.name]\n      ? `${instrument.color}55`\n      : \"#e5e5e5\"\n  );\n\n  return (\n    <Circle cx={cX} cy={cY} r={r} color={color} />\n  );\n};\n\nconst NotesHighlight: React.FC<NotesHighlightProps> = (props) => (\n  <>\n    {instruments.map((instrument) => (\n      <NoteHighlight key={instrument.name} instrument={instrument} {...props} />\n    ))}\n  </>\n);\n\nexport default memo(NotesHighlight);\n"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/PatternShape.tsx",
    "content": "import React, { useMemo } from 'react';\nimport { Circle, Paint, Path, vec, Skia } from '@shopify/react-native-skia';\n\nimport { getAngle, getPointCX, getPointCY } from '../../utils/skiUtils';\nimport instruments from './instruments';\nimport type { Pattern } from '../../types';\nimport { buttonRadius, cPoint, numBeats } from './constants';\n\ninterface PatternShapeProps {\n  pattern: Pattern;\n}\n\nconst PatternShape: React.FC<PatternShapeProps> = (props) => {\n  const { pattern } = props;\n\n  const instrument = useMemo(\n    () => instruments.find((ins) => ins.name === pattern.instrumentName),\n    [pattern.instrumentName]\n  );\n\n  const { path, points } = useMemo(() => {\n    if (!instrument) {\n      return {};\n    }\n\n    const pathPoints = pattern.steps\n      .map((enabled, index) => {\n        if (!enabled) {\n          return null;\n        }\n\n        const angle = getAngle(index, numBeats);\n        const x = getPointCX(angle, instrument.radius, cPoint.x);\n        const y = getPointCY(angle, instrument.radius, cPoint.y);\n\n        return vec(x, y);\n      })\n      .filter((point) => !!point);\n\n    if (!pathPoints.length) {\n      return {};\n    }\n\n    pathPoints.push(pathPoints[0]);\n\n    const skPath = Skia.Path.Make();\n\n    skPath.moveTo(pathPoints[0].x, pathPoints[0].y);\n\n    pathPoints.slice(1).forEach((point) => {\n      skPath.lineTo(point.x, point.y);\n    });\n\n    skPath.close();\n\n    return { path: skPath, points: pathPoints };\n  }, [pattern, instrument]);\n\n  if (!path || !instrument) {\n    return null;\n  }\n\n  return (\n    <>\n      <Path path={path} color=\"transparent\">\n        <Paint color={`${instrument.color}33`} style=\"fill\" />\n        <Paint color={instrument.color} style=\"stroke\" strokeWidth={2} />\n      </Path>\n      {points.map((point, index) => (\n        <Circle\n          key={`${instrument.name}-${index}`}\n          cx={point.x}\n          cy={point.y}\n          r={buttonRadius}\n          color={instrument.color}\n        />\n      ))}\n    </>\n  );\n};\n\nexport default PatternShape;\n"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/PlayButton.tsx",
    "content": "import Animated, {\n  withTiming,\n  SharedValue,\n  useAnimatedStyle,\n} from 'react-native-reanimated';\nimport React, { useEffect } from 'react';\nimport { Pressable, StyleSheet } from 'react-native';\n\nimport { colors } from '../../styles';\nimport type { PlayingInstruments, XYWHRect } from '../../types';\nimport PlayPauseIcon from '../../components/icons/PlayPauseIcon';\n\ninterface PlayButtonProps {\n  isPlaying?: boolean;\n  onPress: () => void;\n\n  canvasRect: XYWHRect;\n  playingInstruments: SharedValue<PlayingInstruments>;\n}\n\ninterface PlayButtonInnerProps {\n  pressed: boolean;\n  isPlaying?: boolean;\n  playingInstruments: SharedValue<PlayingInstruments>;\n}\n\nconst timingOptions = {\n  duration: 25,\n};\n\nconst PlayButtonInner: React.FC<PlayButtonInnerProps> = (props) => {\n  const { pressed, isPlaying, playingInstruments } = props;\n\n  const containerStyle = useAnimatedStyle(() => {\n    const shouldPlay = playingInstruments.value.kick;\n\n    return {\n      transform: [\n        {\n          scale: withTiming(pressed || shouldPlay ? 1.15 : 1, timingOptions),\n        },\n      ],\n    };\n  });\n\n  return (\n    <Animated.View style={[styles.playButtonInner, containerStyle]}>\n      <PlayPauseIcon\n        size={48}\n        isPlaying={isPlaying ?? false}\n        color={colors.white}\n      />\n    </Animated.View>\n  );\n};\n\nconst PlayButton: React.FC<PlayButtonProps> = (props) => {\n  const { canvasRect, onPress, isPlaying, playingInstruments } = props;\n\n  useEffect(() => {\n    console.log('Canvas rect changed:', canvasRect);\n  }, [canvasRect]);\n\n  return (\n    <Pressable\n      style={[\n        styles.playButton,\n        {\n          top: canvasRect.y + canvasRect.height / 2 - 30,\n          left: canvasRect.x + canvasRect.width / 2 - 30,\n        },\n      ]}\n      onPress={onPress}>\n      {({ pressed }) => (\n        <PlayButtonInner\n          pressed={pressed}\n          isPlaying={isPlaying}\n          playingInstruments={playingInstruments}\n        />\n      )}\n    </Pressable>\n  );\n};\n\nexport default PlayButton;\n\nconst styles = StyleSheet.create({\n  playButton: {\n    width: 60,\n    height: 60,\n    borderRadius: 30,\n    position: 'absolute',\n  },\n  playButtonInner: {\n    backgroundColor: colors.main,\n    width: 60,\n    height: 60,\n    borderRadius: 30,\n    justifyContent: 'center',\n    alignItems: 'center',\n    borderWidth: StyleSheet.hairlineWidth,\n    borderColor: colors.white,\n  },\n  playButtonText: {\n    color: colors.white,\n    fontSize: 18,\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/constants.ts",
    "content": "import { Dimensions } from 'react-native';\nimport type { InstrumentName, XYPoint } from '../../types';\n\nexport const screenSize = Dimensions.get('screen');\nexport const size = Math.min(screenSize.width, screenSize.height);\n\nexport const padding = 24;\n\nexport const maxSize =\n  Math.min(screenSize.width, screenSize.height) - padding * 2;\n\nexport const initialBpm = 120;\nexport const numBeats = 16;\nexport const noteDensity = 2;\n\nexport const buttonRadius = 8;\n\nexport const cPoint: XYPoint = {\n  x: size / 2,\n  y: size / 2,\n};\n\nexport const instruments: InstrumentName[] = ['kick', 'clap', 'hi-hat'];\n"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/index.ts",
    "content": "export { default } from './DrumMachine';\n"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/instruments.ts",
    "content": "import { maxSize } from './constants';\nimport type { Instrument } from '../../types';\n\nexport const HiHat: Instrument = {\n  name: 'hi-hat',\n  color: '#38ACDD',\n  radius: maxSize / 2,\n};\n\nconst Clap: Instrument = {\n  name: 'clap',\n  color: '#57B495',\n  radius: (maxSize / 2) * 0.8,\n};\n\nconst Kick: Instrument = {\n  name: 'kick',\n  color: '#FFD61E',\n  radius: (maxSize / 2) * 0.6,\n};\n\nconst instruments: Array<Instrument> = [HiHat, Clap, Kick];\n\nexport default instruments;\n"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/presets.ts",
    "content": "import type { Preset } from '../../types';\nimport { numBeats } from './constants';\n\nconst Empty: Preset = {\n  name: 'Empty',\n  bpm: 120,\n  pattern: [\n    {\n      instrumentName: 'hi-hat',\n      steps: new Array(numBeats).fill(false),\n    },\n    {\n      instrumentName: 'clap',\n      steps: new Array(numBeats).fill(false),\n    },\n    {\n      instrumentName: 'kick',\n      steps: new Array(numBeats).fill(false),\n    },\n  ],\n};\n\nconst BosaNova: Preset = {\n  name: 'Bosa Nova',\n  bpm: 120,\n  pattern: [\n    {\n      instrumentName: 'hi-hat',\n      steps: new Array(numBeats).fill(true),\n    },\n    {\n      instrumentName: 'clap',\n      steps: [\n        true,\n        false,\n        false,\n        true,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        true,\n        false,\n        false,\n      ],\n    },\n    {\n      instrumentName: 'kick',\n      steps: [\n        true,\n        false,\n        false,\n        true,\n        true,\n        false,\n        false,\n        true,\n        true,\n        false,\n        false,\n        true,\n        true,\n        false,\n        false,\n        true,\n      ],\n    },\n  ],\n};\n\nconst basicGroove: Preset = {\n  name: 'Rock Groove 1',\n  bpm: 120,\n  pattern: [\n    {\n      instrumentName: 'hi-hat',\n      steps: new Array(numBeats).fill(true),\n    },\n    {\n      instrumentName: 'clap',\n      steps: [\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n      ],\n    },\n    {\n      instrumentName: 'kick',\n      steps: [\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n      ],\n    },\n  ],\n};\n\nconst basicGroove2: Preset = {\n  name: 'Rock Groove 2',\n  bpm: 120,\n  pattern: [\n    {\n      instrumentName: 'hi-hat',\n      steps: new Array(numBeats).fill(true),\n    },\n    {\n      instrumentName: 'clap',\n      steps: [\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n      ],\n    },\n    {\n      instrumentName: 'kick',\n      steps: [\n        true,\n        false,\n        false,\n        false,\n        true,\n        true,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        true,\n        false,\n        false,\n      ],\n    },\n  ],\n};\n\nconst basicGroove3: Preset = {\n  name: 'Rock Groove 3',\n  bpm: 120,\n  pattern: [\n    {\n      instrumentName: 'hi-hat',\n      steps: new Array(numBeats).fill(true),\n    },\n    {\n      instrumentName: 'clap',\n      steps: [\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n      ],\n    },\n    {\n      instrumentName: 'kick',\n      steps: [\n        true,\n        false,\n        false,\n        true,\n        false,\n        true,\n        false,\n        false,\n        true,\n        false,\n        false,\n        true,\n        false,\n        true,\n        false,\n        false,\n      ],\n    },\n  ],\n};\n\nconst BreakBeat1: Preset = {\n  name: 'Break Beat 1',\n  bpm: 240,\n  pattern: [\n    {\n      instrumentName: 'hi-hat',\n      steps: [\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n      ],\n    },\n    {\n      instrumentName: 'clap',\n      steps: [\n        false,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        true,\n        false,\n        true,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n      ],\n    },\n    {\n      instrumentName: 'kick',\n      steps: [\n        true,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        false,\n        false,\n      ],\n    },\n  ],\n};\n\nconst BreakBeat2: Preset = {\n  name: 'Break Beat 2',\n  bpm: 188,\n  pattern: [\n    {\n      instrumentName: 'hi-hat',\n      steps: [\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n      ],\n    },\n    {\n      instrumentName: 'clap',\n      steps: [\n        false,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n      ],\n    },\n    {\n      instrumentName: 'kick',\n      steps: [\n        true,\n        false,\n        true,\n        true,\n        false,\n        false,\n        false,\n        false,\n        true,\n        false,\n        true,\n        false,\n        false,\n        false,\n        false,\n        false,\n      ],\n    },\n  ],\n};\n\nconst LinearGroove: Preset = {\n  name: 'Linear Groove',\n  bpm: 105,\n  pattern: [\n    {\n      instrumentName: 'hi-hat',\n      steps: [\n        false,\n        true,\n        false,\n        false,\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n        false,\n        true,\n        false,\n        false,\n        true,\n        false,\n      ],\n    },\n    {\n      instrumentName: 'clap',\n      steps: [\n        false,\n        false,\n        true,\n        false,\n        false,\n        true,\n        false,\n        true,\n        false,\n        true,\n        false,\n        false,\n        true,\n        false,\n        false,\n        true,\n      ],\n    },\n    {\n      instrumentName: 'kick',\n      steps: [\n        true,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        true,\n        false,\n        false,\n      ],\n    },\n  ],\n};\n\nconst WWRYGroove: Preset = {\n  name: 'WWRY',\n  bpm: 81,\n  pattern: [\n    {\n      instrumentName: 'hi-hat',\n      steps: new Array(numBeats).fill(false),\n    },\n    {\n      instrumentName: 'clap',\n      steps: [\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n        false,\n        false,\n        true,\n        false,\n      ],\n    },\n    {\n      instrumentName: 'kick',\n      steps: [\n        true,\n        true,\n        false,\n        false,\n        true,\n        true,\n        false,\n        false,\n        true,\n        true,\n        false,\n        false,\n        true,\n        true,\n        false,\n        false,\n      ],\n    },\n  ],\n};\n\nconst presets: Record<string, Preset> = {\n  Empty,\n  'Bosa Nova': BosaNova,\n  'Rock Groove 1': basicGroove,\n  'Rock Groove 2': basicGroove2,\n  'Rock Groove 3': basicGroove3,\n  'Break Beat 1': BreakBeat1,\n  'Break Beat 2': BreakBeat2,\n  'Linear Groove': LinearGroove,\n  'WWRY': WWRYGroove,\n};\n\nexport default presets;\n"
  },
  {
    "path": "apps/common-app/src/examples/DrumMachine/useGestures.ts",
    "content": "import { runOnJS, useSharedValue } from 'react-native-reanimated';\nimport {\n  Gesture,\n  GestureUpdateEvent,\n  PanGestureHandlerEventPayload,\n  TapGestureHandlerEventPayload,\n} from 'react-native-gesture-handler';\n\nimport {\n  getAngle,\n  getPointCX,\n  getPointCY,\n  isPointInCircle,\n} from '../../utils/skiUtils';\nimport { numBeats, buttonRadius, cPoint } from './constants';\nimport type { Touché, XYWHRect } from '../../types';\nimport Instruments from './instruments';\nimport { useMemo } from 'react';\n\ninterface GestureParams {\n  canvasRect: XYWHRect;\n  touchRadius?: number;\n  onPatternChange: (pattern: number, stepIdx: number) => void;\n}\n\nconst initialHovers = Array(Instruments.length * numBeats).fill(false);\n\nexport default function useGestures(params: GestureParams) {\n  const {\n    canvasRect,\n    onPatternChange,\n    touchRadius = buttonRadius * 2,\n  } = params;\n  const hovers = useSharedValue(initialHovers);\n\n  const touchés = useMemo(() => {\n    const tArray: Touché[] = [];\n\n    Instruments.forEach((instrument, index) => {\n      for (let i = 0; i < numBeats; i++) {\n        const angle = getAngle(i, numBeats);\n        const x = getPointCX(angle, instrument.radius, cPoint.x);\n        const y = getPointCY(angle, instrument.radius, cPoint.y);\n\n        tArray.push({\n          cX: x,\n          cY: y,\n          stepIdx: i,\n          patternIdx: index,\n        });\n      }\n    });\n\n    return tArray;\n  }, []);\n\n  function onPanEvent(\n    event: GestureUpdateEvent<PanGestureHandlerEventPayload>\n  ) {\n    'worklet';\n    const x = event.x - canvasRect.x;\n    const y = event.y - canvasRect.y;\n\n    touchés.forEach((touché, index) => {\n      const isHovering = isPointInCircle(\n        x,\n        y,\n        touché.cX,\n        touché.cY,\n        touchRadius\n      );\n\n      if (isHovering && !hovers.value[index]) {\n        hovers.value[index] = true;\n        runOnJS(onPatternChange)(touché.patternIdx, touché.stepIdx);\n      } else if (!isHovering && hovers.value[index]) {\n        hovers.value[index] = false;\n      }\n    });\n  }\n\n  function onTapEvent(\n    event: GestureUpdateEvent<TapGestureHandlerEventPayload>\n  ) {\n    'worklet';\n\n    const x = event.x - canvasRect.x;\n    const y = event.y - canvasRect.y;\n\n    touchés.forEach((touché) => {\n      if (isPointInCircle(x, y, touché.cX, touché.cY, touchRadius)) {\n        runOnJS(onPatternChange)(touché.patternIdx, touché.stepIdx);\n      }\n    });\n  }\n\n  const pan = Gesture.Pan()\n    .onStart(onPanEvent)\n    .onChange(onPanEvent)\n    .onEnd(() => {\n      for (let i = 0; i < initialHovers.length; i++) {\n        hovers.value[i] = false;\n      }\n    });\n\n  const tap = Gesture.Tap().onEnd(onTapEvent);\n\n  return Gesture.Simultaneous(pan, tap);\n}\n"
  },
  {
    "path": "apps/common-app/src/examples/Metronome/Metronome.tsx",
    "content": "import { AudioContext } from 'react-native-audio-api';\nimport React, { useState, useCallback, FC } from 'react';\n\nimport { Container, Slider, Spacer, Button } from '../../components';\nimport MetronomeSound from '../../utils/soundEngines/MetronomeSound';\nimport { InstrumentName, Pattern } from '../../types';\nimport { patterns, defaultPattern } from './patterns';\nimport usePlayer from '../../utils/usePlayer';\n\nconst DOWN_BEAT_FREQUENCY = 1000;\nconst REGULAR_BEAT_FREQUENCY = 500;\n\nconst INITIAL_BPM = 120;\nconst INITIAL_BEATS_PER_BAR = 4;\n\nfunction setupPlayer(audioCtx: AudioContext) {\n  const downbeat = new MetronomeSound(audioCtx, DOWN_BEAT_FREQUENCY);\n  const regularbeat = new MetronomeSound(audioCtx, REGULAR_BEAT_FREQUENCY);\n\n  const playNote = (name: InstrumentName, time: number) => {\n    switch (name) {\n      case 'downbeat':\n        downbeat.play(time);\n        break;\n      case 'regularbeat':\n        regularbeat.play(time);\n        break;\n    }\n  };\n\n  return { playNote };\n}\n\nconst Metronome: FC = () => {\n  const [bpm, setBpm] = useState(INITIAL_BPM);\n  const [beatsPerBar, setBeatsPerBar] = useState(INITIAL_BEATS_PER_BAR);\n  const [pattern, setPattern] = useState<Pattern[]>([\n    ...patterns[defaultPattern],\n  ]);\n\n  const player = usePlayer({\n    bpm,\n    patterns: pattern,\n    notesPerBeat: 1,\n    numBeats: beatsPerBar,\n    setup: setupPlayer,\n  });\n\n  const onBeatsPerBarChange = useCallback((newBeatsPerBar: number) => {\n    setBeatsPerBar(newBeatsPerBar);\n    setPattern([...patterns[newBeatsPerBar]]);\n  }, []);\n\n  const onPlayPress = useCallback(() => {\n    if (player.isPlaying) {\n      player.stop();\n    } else {\n      player.play();\n    }\n  }, [player]);\n\n  return (\n    <Container centered>\n      <Button\n        title={player.isPlaying ? 'Stop' : 'Play'}\n        onPress={onPlayPress}\n      />\n      <Spacer.Vertical size={20} />\n      <Slider\n        label=\"BPM\"\n        step={1}\n        min={24}\n        max={320}\n        value={bpm}\n        onValueChange={setBpm}\n      />\n      <Spacer.Vertical size={20} />\n      <Slider\n        min={1}\n        max={8}\n        step={1}\n        value={beatsPerBar}\n        label=\"Beats\"\n        onValueChange={onBeatsPerBarChange}\n        minLabelWidth={50}\n      />\n    </Container>\n  );\n};\n\nexport default Metronome;\n"
  },
  {
    "path": "apps/common-app/src/examples/Metronome/index.tsx",
    "content": "export { default } from './Metronome';\n"
  },
  {
    "path": "apps/common-app/src/examples/Metronome/patterns.ts",
    "content": "import type { Pattern } from '../../types';\n\nconst oneBeatPerBar: Pattern[] = [\n  {\n    instrumentName: 'downbeat',\n    steps: [true],\n  },\n  {\n    instrumentName: 'regularbeat',\n    steps: [false],\n  },\n];\n\nconst twoBeatsPerBar: Pattern[] = [\n  {\n    instrumentName: 'downbeat',\n    steps: [true, false],\n  },\n  {\n    instrumentName: 'regularbeat',\n    steps: [false, true],\n  },\n];\n\nconst threeBeatsPerBar: Pattern[] = [\n  {\n    instrumentName: 'downbeat',\n    steps: [true, false, false],\n  },\n  {\n    instrumentName: 'regularbeat',\n    steps: [false, true, true],\n  },\n];\n\nconst fourBeatsPerBar: Pattern[] = [\n  {\n    instrumentName: 'downbeat',\n    steps: [true, false, false, false],\n  },\n  {\n    instrumentName: 'regularbeat',\n    steps: [false, true, true, true],\n  },\n];\n\nconst fiveBeatsPerBar: Pattern[] = [\n  {\n    instrumentName: 'downbeat',\n    steps: [true, false, false, false, false],\n  },\n  {\n    instrumentName: 'regularbeat',\n    steps: [false, true, true, true, true],\n  },\n];\n\nconst sixBeatsPerBar: Pattern[] = [\n  {\n    instrumentName: 'downbeat',\n    steps: [true, false, false, false, false, false],\n  },\n  {\n    instrumentName: 'regularbeat',\n    steps: [false, true, true, true, true, true],\n  },\n];\n\nconst sevenBeatsPerBar: Pattern[] = [\n  {\n    instrumentName: 'downbeat',\n    steps: [true, false, false, false, false, false, false],\n  },\n  {\n    instrumentName: 'regularbeat',\n    steps: [false, true, true, true, true, true, true],\n  },\n];\n\nconst eightBeatsPerBar: Pattern[] = [\n  {\n    instrumentName: 'downbeat',\n    steps: [true, false, false, false, false, false, false, false],\n  },\n  {\n    instrumentName: 'regularbeat',\n    steps: [false, true, true, true, true, true, true, true],\n  },\n];\n\nexport const patterns: Record<number, Pattern[]> = {\n  1: oneBeatPerBar,\n  2: twoBeatsPerBar,\n  3: threeBeatsPerBar,\n  4: fourBeatsPerBar,\n  5: fiveBeatsPerBar,\n  6: sixBeatsPerBar,\n  7: sevenBeatsPerBar,\n  8: eightBeatsPerBar,\n};\n\nexport const defaultPattern = 4;\n"
  },
  {
    "path": "apps/common-app/src/examples/OfflineRendering/OfflineRendering.tsx",
    "content": "import React, { useCallback, useState, FC } from 'react';\nimport {\n  AudioBuffer,\n  AudioContext,\n  OfflineAudioContext,\n} from 'react-native-audio-api';\n\nimport { Container, Button } from '../../components';\n\nconst URL = 'https://download.samplelib.com/mp3/sample-12s.mp3';\n\nconst OfflineRendering: FC = () => {\n  const [rendering, setRendering] = useState(false);\n  const [renderedBuffer, setRenderedBuffer] = useState<AudioBuffer | null>(\n    null\n  );\n\n  const handleStartRendering = useCallback(() => {\n    if (rendering) {\n      return;\n    }\n\n    setRendering(true);\n    (async () => {\n      const duration = 5;\n      const sampleRate = 48_000;\n      const length = duration * sampleRate;\n      const offlineAudioContext = new OfflineAudioContext(\n        2,\n        length,\n        sampleRate\n      );\n\n      // Suspend at 1 second\n      offlineAudioContext\n        .suspend(1)\n        .then(() => {\n          setTimeout(() => {\n            offlineAudioContext.resume().catch((e) => console.error(e));\n          }, 3000);\n        })\n        .catch((e) => console.error(e));\n\n      const buffer = await fetch(URL)\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          offlineAudioContext.decodeAudioData(arrayBuffer)\n        );\n      const audioBufferSourceNode = offlineAudioContext.createBufferSource();\n      audioBufferSourceNode.buffer = buffer;\n\n      audioBufferSourceNode.start();\n      audioBufferSourceNode.connect(offlineAudioContext.destination);\n      const result = await offlineAudioContext.startRendering();\n      setRenderedBuffer(result);\n    })();\n  }, [rendering]);\n\n  const handleStartPlay = useCallback(() => {\n    if (!renderedBuffer) return;\n    const audioContext = new AudioContext();\n    const audioBufferSourceNode = audioContext.createBufferSource();\n    audioBufferSourceNode.buffer = renderedBuffer;\n    audioBufferSourceNode.connect(audioContext.destination);\n    audioBufferSourceNode.start();\n  }, [renderedBuffer]);\n\n  let buttonTitle = '';\n  if (renderedBuffer) buttonTitle = 'Play';\n  else if (rendering) buttonTitle = 'Rendering..';\n  else buttonTitle = 'Start Rendering';\n\n  const disabled = rendering && !renderedBuffer;\n  const handler = !rendering ? handleStartRendering : handleStartPlay;\n\n  return (\n    <Container centered>\n      <Button title={buttonTitle} onPress={handler} disabled={disabled} />\n    </Container>\n  );\n};\n\nexport default OfflineRendering;\n"
  },
  {
    "path": "apps/common-app/src/examples/OfflineRendering/index.ts",
    "content": "export { default } from './OfflineRendering';\n"
  },
  {
    "path": "apps/common-app/src/examples/Oscillator/Oscillator.tsx",
    "content": "import React, { useRef, useState, useEffect, FC } from 'react';\nimport { StyleSheet, Text, View, Pressable } from 'react-native';\nimport {\n  AudioContext,\n  GainNode,\n  OscillatorNode,\n  StereoPannerNode,\n} from 'react-native-audio-api';\nimport type { OscillatorType } from 'react-native-audio-api';\n\nimport { Container, Slider, Spacer, Button } from '../../components';\nimport { layout, colors } from '../../styles';\n\nconst INITIAL_FREQUENCY = 440;\nconst INITIAL_DETUNE = 0;\nconst INITIAL_GAIN = 1.0;\nconst INITIAL_PAN = 0;\nconst OSCILLATOR_TYPES = ['sine', 'square', 'sawtooth', 'triangle'] as const;\n\nconst labelWidth = 80;\n\nconst Oscillator: FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [gain, setGain] = useState(INITIAL_GAIN);\n  const [frequency, setFrequency] = useState(INITIAL_FREQUENCY);\n  const [detune, setDetune] = useState(INITIAL_DETUNE);\n  const [pan, setPan] = useState(INITIAL_PAN);\n  const [oscillatorType, setOscillatorType] = useState<OscillatorType>('sine');\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const oscillatorRef = useRef<OscillatorNode | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n  const panRef = useRef<StereoPannerNode | null>(null);\n\n  const setup = () => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    oscillatorRef.current = audioContextRef.current.createOscillator();\n    oscillatorRef.current.frequency.value = frequency;\n    oscillatorRef.current.detune.value = detune;\n    oscillatorRef.current.type = oscillatorType;\n\n    gainRef.current = audioContextRef.current.createGain();\n    gainRef.current.gain.value = gain;\n\n    panRef.current = audioContextRef.current.createStereoPanner();\n    panRef.current.pan.value = pan;\n\n    oscillatorRef.current.connect(gainRef.current);\n    gainRef.current.connect(panRef.current);\n    panRef.current.connect(audioContextRef.current.destination);\n  };\n\n  const handleGainChange = (newValue: number) => {\n    setGain(newValue);\n\n    if (gainRef.current) {\n      gainRef.current.gain.value = newValue;\n    }\n  };\n\n  const handlePanChange = (newValue: number) => {\n    setPan(newValue);\n\n    if (panRef.current) {\n      panRef.current.pan.value = newValue;\n    }\n  };\n\n  const handleFrequencyChange = (newValue: number) => {\n    setFrequency(newValue);\n\n    if (oscillatorRef.current) {\n      oscillatorRef.current.frequency.value = newValue;\n    }\n  };\n\n  const handleDetuneChange = (newValue: number) => {\n    setDetune(newValue);\n\n    if (oscillatorRef.current) {\n      oscillatorRef.current.detune.value = newValue;\n    }\n  };\n\n  const handlePlayPause = () => {\n    if (isPlaying) {\n      oscillatorRef.current?.stop(0);\n    } else {\n      setup();\n      oscillatorRef.current?.start(0);\n    }\n\n    setIsPlaying((prev) => !prev);\n  };\n\n  const handleOscillatorTypeChange = (type: OscillatorType) => {\n    setOscillatorType(type);\n    if (oscillatorRef.current) {\n      oscillatorRef.current.type = type;\n    }\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <Container centered>\n      <Button onPress={handlePlayPause} title={isPlaying ? 'Pause' : 'Play'} />\n      <Spacer.Vertical size={49} />\n      <Slider\n        label=\"Gain\"\n        value={gain}\n        onValueChange={handleGainChange}\n        min={0.0}\n        max={1.0}\n        step={0.01}\n        minLabelWidth={labelWidth}\n      />\n      <Spacer.Vertical size={20} />\n      <Slider\n        label=\"Pan\"\n        value={pan}\n        onValueChange={handlePanChange}\n        min={-1}\n        max={1}\n        step={0.1}\n        minLabelWidth={labelWidth}\n      />\n      <Spacer.Vertical size={20} />\n      <Slider\n        label=\"Frequency\"\n        value={frequency}\n        onValueChange={handleFrequencyChange}\n        min={120}\n        max={1200}\n        step={10}\n        minLabelWidth={labelWidth}\n      />\n      <Spacer.Vertical size={20} />\n      <Slider\n        label=\"Detune\"\n        value={detune}\n        onValueChange={handleDetuneChange}\n        min={0}\n        step={1}\n        max={100}\n        minLabelWidth={labelWidth}\n      />\n      <Spacer.Vertical size={40} />\n      <View style={styles.oscillatorTypeContainer}>\n        {OSCILLATOR_TYPES.map((type: OscillatorType) => (\n          <Pressable\n            key={type}\n            style={({ pressed }) => [\n              styles.oscillatorButton,\n              pressed\n                ? styles.pressedOscillatorButton\n                : type === oscillatorType\n                  ? styles.activeOscillatorButton\n                  : styles.inactiveOscillatorButton,\n            ]}\n            onPress={() => handleOscillatorTypeChange(type)}>\n            <Text\n              style={[\n                styles.oscillatorButtonText,\n                type === oscillatorType && styles.activeOscillatorButtonText,\n              ]}>\n              {type}\n            </Text>\n          </Pressable>\n        ))}\n      </View>\n    </Container>\n  );\n};\n\nconst styles = StyleSheet.create({\n  oscillatorTypeContainer: {\n    flexDirection: 'row',\n  },\n  oscillatorButton: {\n    padding: layout.spacing,\n    marginHorizontal: 5,\n    borderWidth: 1,\n    borderRadius: layout.radius,\n  },\n  activeOscillatorButton: {\n    backgroundColor: colors.main,\n    borderColor: colors.main,\n  },\n  pressedOscillatorButton: {\n    backgroundColor: `${colors.main}88`,\n    borderColor: colors.main,\n  },\n  inactiveOscillatorButton: {\n    borderColor: colors.border,\n  },\n  oscillatorButtonText: {\n    color: colors.white,\n    textTransform: 'capitalize',\n  },\n  activeOscillatorButtonText: {\n    color: colors.white,\n  },\n});\n\nexport default Oscillator;\n"
  },
  {
    "path": "apps/common-app/src/examples/Oscillator/index.tsx",
    "content": "export { default } from './Oscillator';\n"
  },
  {
    "path": "apps/common-app/src/examples/Piano/Keyboard.tsx",
    "content": "import { FC } from 'react';\nimport { View, StyleSheet, Pressable } from 'react-native';\n\nimport { colors } from '../../styles';\nimport { KeyMap, Key, KeyName } from './utils';\n\ninterface KeyboardProps {\n  keys: KeyMap;\n  onPressIn: (key: KeyName) => void;\n  onPressOut: (key: KeyName) => void;\n}\n\ninterface KeyButtonProps {\n  which: Key;\n  index: number;\n  onPressIn: (key: KeyName) => void;\n  onPressOut: (key: KeyName) => void;\n}\n\nconst KeyButton: FC<KeyButtonProps> = (props) => {\n  const { which, index } = props;\n\n  const onPressIn = () => {\n    props.onPressIn(which.name);\n  };\n\n  const onPressOut = () => {\n    props.onPressOut(which.name);\n  };\n\n  const isBlackKey = which.name.includes('#');\n  const isFirst = index === 0;\n\n  return (\n    <Pressable\n      onPressIn={onPressIn}\n      onPressOut={onPressOut}\n      style={({ pressed }) => [\n        isBlackKey ? styles.blackKey : styles.key,\n        !isFirst && !isBlackKey && styles.shiftKey,\n        pressed && (isBlackKey ? styles.blackKeyPressed : styles.keyPressed),\n      ]}\n    />\n  );\n};\n\nconst Keyboard: FC<KeyboardProps> = (props) => {\n  const { keys, onPressIn, onPressOut } = props;\n\n  return (\n    <View style={styles.container}>\n      {Object.values(keys).map((key, index) => (\n        <KeyButton\n          which={key}\n          index={index}\n          key={key.name}\n          onPressIn={onPressIn}\n          onPressOut={onPressOut}\n        />\n      ))}\n    </View>\n  );\n};\n\nexport default Keyboard;\n\nconst baseWidth = 50;\n\nconst styles = StyleSheet.create({\n  container: {\n    flexDirection: 'row',\n  },\n  key: {\n    width: baseWidth,\n    height: baseWidth * 4.8,\n    backgroundColor: colors.white,\n    borderBottomLeftRadius: 4,\n    borderBottomRightRadius: 4,\n    borderWidth: 1,\n    borderColor: colors.black,\n  },\n  shiftKey: { marginLeft: -1 },\n  keyPressed: {\n    backgroundColor: `#efefef`,\n  },\n  blackKey: {\n    width: baseWidth * 0.6,\n    height: baseWidth * 3.6,\n    marginLeft: -baseWidth * 0.3,\n    marginRight: -baseWidth * 0.3,\n    zIndex: 2,\n    backgroundColor: colors.black,\n    borderBottomLeftRadius: 4,\n    borderBottomRightRadius: 4,\n  },\n  blackKeyPressed: {\n    backgroundColor: '#222',\n  },\n  text: {\n    textAlign: 'center',\n  },\n});\n"
  },
  {
    "path": "apps/common-app/src/examples/Piano/Piano.tsx",
    "content": "import { FC, useEffect, useRef } from 'react';\nimport { AudioContext, AudioBuffer } from 'react-native-audio-api';\n\nimport { Container } from '../../components';\nimport { KeyName, sources, keyMap } from './utils';\nimport PianoNote from './PianoNote';\nimport Keyboard from './Keyboard';\n\nconst Piano: FC = () => {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const notesRef = useRef<null | Record<KeyName, PianoNote>>(null);\n  const bufferListRef = useRef<Partial<Record<KeyName, AudioBuffer>>>({});\n\n  const onPressIn = (key: KeyName) => {\n    notesRef.current?.[key].start(bufferListRef.current);\n  };\n\n  const onPressOut = (key: KeyName) => {\n    notesRef.current?.[key].stop();\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    // eslint-disable-next-line @typescript-eslint/no-misused-promises\n    Object.entries(sources).forEach(async ([key, url]) => {\n      bufferListRef.current[key as KeyName] = await fetch(url)\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        );\n    });\n\n    const newNotes: Partial<Record<KeyName, PianoNote>> = {};\n\n    Object.values(keyMap).forEach((key) => {\n      newNotes[key.name] = new PianoNote(audioContextRef.current!, key);\n    });\n\n    notesRef.current = newNotes as Record<KeyName, PianoNote>;\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <Container centered>\n      <Keyboard keys={keyMap} onPressIn={onPressIn} onPressOut={onPressOut} />\n    </Container>\n  );\n};\n\nexport default Piano;\n"
  },
  {
    "path": "apps/common-app/src/examples/Piano/PianoNote.tsx",
    "content": "import {\n  GainNode,\n  AudioBuffer,\n  AudioContext,\n  AudioBufferSourceNode,\n} from 'react-native-audio-api';\n\nimport { Key, getSource } from './utils';\n\nclass PianoNote {\n  public audioContext: AudioContext;\n  public key: Key;\n\n  private gain: GainNode | null = null;\n  private bufferSource: AudioBufferSourceNode | null = null;\n  private startedAt: number | null = null;\n\n  constructor(audioContext: AudioContext, key: Key) {\n    this.audioContext = audioContext;\n    this.key = key;\n  }\n\n  start(bufferList: Record<string, AudioBuffer>) {\n    const { buffer, playbackRate } = getSource(bufferList, this.key);\n\n    if (!buffer) {\n      return;\n    }\n\n    const tNow = this.audioContext.currentTime;\n\n    this.bufferSource = this.audioContext.createBufferSource();\n    this.bufferSource.buffer = buffer;\n    this.bufferSource.playbackRate.value = playbackRate;\n\n    this.gain = this.audioContext.createGain();\n    this.gain.gain.setValueAtTime(1, this.audioContext.currentTime);\n\n    this.bufferSource.connect(this.gain);\n    this.gain.connect(this.audioContext.destination);\n\n    this.bufferSource.start(tNow);\n    this.startedAt = tNow;\n  }\n\n  stop() {\n    if (!this.bufferSource || !this.gain) {\n      return;\n    }\n\n    const tNow = Math.max(\n      this.audioContext.currentTime,\n      (this.startedAt ?? 0) + 5.0\n    );\n\n    this.gain.gain.exponentialRampToValueAtTime(0.0001, tNow + 0.08);\n    this.gain.gain.setValueAtTime(0, tNow + 0.09);\n    this.bufferSource.stop(tNow + 0.1);\n\n    this.bufferSource = null;\n    this.gain = null;\n  }\n}\n\nexport default PianoNote;\n"
  },
  {
    "path": "apps/common-app/src/examples/Piano/index.ts",
    "content": "export { default } from './Piano';\n"
  },
  {
    "path": "apps/common-app/src/examples/Piano/utils.ts",
    "content": "import { AudioBuffer } from 'react-native-audio-api';\n\nexport type KeyName =\n  | 'C4'\n  | 'C#4'\n  | 'D4'\n  | 'D#4'\n  | 'E4'\n  | 'F4'\n  | 'F#4'\n  | 'G4'\n  | 'G#4'\n  | 'A4'\n  | 'A#4'\n  | 'B4';\n\nexport interface Key {\n  name: KeyName;\n  frequency: number;\n}\n\nexport type KeyMap = Record<KeyName, Key>;\n\nexport const sourcesTone: Partial<Record<KeyName, string>> = {\n  'C4': 'https://tonejs.github.io/audio/salamander/C4.mp3',\n  'D#4': 'https://tonejs.github.io/audio/salamander/Ds4.mp3',\n  'F#4': 'https://tonejs.github.io/audio/salamander/Fs4.mp3',\n  'A4': 'https://tonejs.github.io/audio/salamander/A4.mp3',\n};\n\nexport const sourcesTeda: Partial<Record<KeyName, string>> = {\n  'C4': 'https://michalsek.github.io/audio-samples/piano/1_C4.mp3',\n  'C#4': 'https://michalsek.github.io/audio-samples/piano/2_Ch4.mp3',\n  'D4': 'https://michalsek.github.io/audio-samples/piano/3_D4.mp3',\n  'D#4': 'https://michalsek.github.io/audio-samples/piano/4_Dh4.mp3',\n  'E4': 'https://michalsek.github.io/audio-samples/piano/5_E4.mp3',\n  'F4': 'https://michalsek.github.io/audio-samples/piano/6_F4.mp3',\n  'F#4': 'https://michalsek.github.io/audio-samples/piano/7_Fh4.mp3',\n  'G4': 'https://michalsek.github.io/audio-samples/piano/8_G4.mp3',\n  'G#4': 'https://michalsek.github.io/audio-samples/piano/9_Gh4.mp3',\n  'A4': 'https://michalsek.github.io/audio-samples/piano/10_A4.mp3',\n  'A#4': 'https://michalsek.github.io/audio-samples/piano/11_Ah4.mp3',\n  'B4': 'https://michalsek.github.io/audio-samples/piano/12_B4.mp3',\n};\n\nexport const sources = sourcesTone;\n\nexport const keyMap: KeyMap = {\n  'C4': {\n    name: 'C4',\n    frequency: 261.626,\n  },\n  'C#4': {\n    name: 'C#4',\n    frequency: 277.183,\n  },\n  'D4': {\n    name: 'D4',\n    frequency: 293.665,\n  },\n  'D#4': {\n    name: 'D#4',\n    frequency: 311.127,\n  },\n  'E4': {\n    name: 'E4',\n    frequency: 329.628,\n  },\n  'F4': {\n    name: 'F4',\n    frequency: 349.228,\n  },\n  'F#4': {\n    name: 'F#4',\n    frequency: 369.994,\n  },\n  'G4': {\n    name: 'G4',\n    frequency: 391.995,\n  },\n  'G#4': {\n    name: 'G#4',\n    frequency: 415.305,\n  },\n  'A4': {\n    name: 'A4',\n    frequency: 440.0,\n  },\n  'A#4': {\n    name: 'A#4',\n    frequency: 466.164,\n  },\n  'B4': {\n    name: 'B4',\n    frequency: 493.883,\n  },\n} as const;\n\nexport function getClosest(key: Key) {\n  let closestKey = keyMap.C4;\n  let minDiff = closestKey.frequency - key.frequency;\n\n  for (const sourcedKeys of Object.keys(sources)) {\n    const currentKey = keyMap[sourcedKeys as KeyName];\n\n    const diff = currentKey.frequency - key.frequency;\n\n    if (Math.abs(diff) < Math.abs(minDiff)) {\n      minDiff = diff;\n      closestKey = currentKey;\n    }\n  }\n\n  return closestKey;\n}\n\nexport function getSource(bufferList: Record<KeyName, AudioBuffer>, key: Key) {\n  if (key.name in bufferList) {\n    return { buffer: bufferList[key.name], playbackRate: 1 };\n  }\n\n  const closestKey = getClosest(key);\n\n  return {\n    buffer: bufferList[closestKey.name],\n    playbackRate: key.frequency / closestKey.frequency,\n  };\n}\n"
  },
  {
    "path": "apps/common-app/src/examples/PlaybackSpeed/PlaybackSpeed.tsx",
    "content": "import React, {\n  useState,\n  FC,\n  useRef,\n  useEffect,\n  useCallback,\n  useMemo,\n} from 'react';\nimport { View, StyleSheet } from 'react-native';\nimport { Container, Button, Spacer, Slider, Select } from '../../components';\nimport { AudioContext, changePlaybackSpeed } from 'react-native-audio-api';\nimport type { AudioBufferSourceNode } from 'react-native-audio-api';\nimport {\n  PCM_DATA,\n  labelWidth,\n  PLAYBACK_SPEED_CONFIG,\n  SAMPLE_RATE,\n} from './constants';\nimport { TimeStretchingAlgorithm, TIME_STRETCHING_OPTIONS } from './types';\nimport { getAudioSettings } from './helpers';\n\nconst PlaybackSpeed: FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n  const [playbackSpeed, setPlaybackSpeed] = useState<number>(\n    PLAYBACK_SPEED_CONFIG.default\n  );\n  const [timeStretchingAlgorithm, setTimeStretchingAlgorithm] =\n    useState<TimeStretchingAlgorithm>('linear');\n\n  const aCtxRef = useRef<AudioContext | null>(null);\n  const sourceRef = useRef<AudioBufferSourceNode | null>(null);\n\n  const audioSettings = useMemo(\n    () => getAudioSettings(timeStretchingAlgorithm),\n    [timeStretchingAlgorithm]\n  );\n\n  const initializeAudioContext = useCallback(() => {\n    if (!aCtxRef.current) {\n      aCtxRef.current = new AudioContext({ sampleRate: SAMPLE_RATE });\n    }\n    return aCtxRef.current;\n  }, []);\n\n  const createSource = useCallback(async (): Promise<AudioBufferSourceNode> => {\n    const audioContext = initializeAudioContext();\n\n    setIsLoading(true);\n\n    try {\n      const buffer = await audioContext\n        .decodePCMInBase64(PCM_DATA, 48000, 1, true)\n        .then((audioBuffer) =>\n          changePlaybackSpeed(\n            audioBuffer,\n            audioSettings.PSOLA ? playbackSpeed : 1\n          )\n        );\n\n      const source = audioContext.createBufferSource(audioSettings.PSOLA ? { pitchCorrection: false } : { pitchCorrection: audioSettings.pitchCorrection });\n\n      source.buffer = buffer;\n      source.playbackRate.value = audioSettings.PSOLA ? 1 : playbackSpeed;\n      source.loop = true;\n\n      return source;\n    } catch (error) {\n      console.error('Failed to create audio source:', error);\n      throw error;\n    } finally {\n      setIsLoading(false);\n    }\n  }, [audioSettings, playbackSpeed, initializeAudioContext]);\n\n  const stopPlayback = useCallback(() => {\n    if (sourceRef.current) {\n      sourceRef.current.onEnded = null;\n      sourceRef.current.stop();\n      sourceRef.current = null;\n    }\n    setIsPlaying(false);\n  }, []);\n\n  const startPlayback = useCallback(async () => {\n    try {\n      const audioContext = initializeAudioContext();\n      const source = await createSource();\n\n      sourceRef.current = source;\n\n      sourceRef.current.onEnded = () => {\n        setIsPlaying(false);\n        sourceRef.current = null;\n      };\n\n      sourceRef.current.connect(audioContext.destination);\n      sourceRef.current.start(audioContext.currentTime);\n\n      setIsPlaying(true);\n    } catch (error) {\n      console.error('Failed to start playback:', error);\n      setIsPlaying(false);\n    }\n  }, [createSource, initializeAudioContext]);\n\n  const togglePlayPause = useCallback(async () => {\n    if (isPlaying) {\n      stopPlayback();\n    } else {\n      await startPlayback();\n    }\n  }, [isPlaying, stopPlayback, startPlayback]);\n\n  const handlePlaybackSpeedChange = useCallback(\n    (newSpeed: number) => {\n      if (audioSettings.PSOLA) {\n        stopPlayback();\n      } else {\n        if (aCtxRef.current && sourceRef.current) {\n          sourceRef.current.playbackRate.value = newSpeed;\n        }\n      }\n\n      setPlaybackSpeed(newSpeed);\n    },\n    [audioSettings, stopPlayback]\n  );\n\n  const handleTimeStretchingAlgorithmChange = useCallback(\n    (newMode: TimeStretchingAlgorithm) => {\n      setTimeStretchingAlgorithm(newMode);\n      if (isPlaying) {\n        stopPlayback();\n      }\n    },\n    [isPlaying, stopPlayback]\n  );\n\n  useEffect(() => {\n    return () => {\n      stopPlayback();\n      aCtxRef.current?.close();\n      aCtxRef.current = null;\n    };\n  }, [stopPlayback]);\n\n  return (\n    <Container>\n      <View style={styles.algorithmSelectContainer}>\n        <Select\n          value={timeStretchingAlgorithm}\n          options={TIME_STRETCHING_OPTIONS}\n          onChange={handleTimeStretchingAlgorithmChange}\n        />\n      </View>\n\n      <View style={styles.controlsContainer}>\n        <Button\n          title={isPlaying ? 'Stop' : 'Play'}\n          onPress={togglePlayPause}\n          disabled={isLoading}\n        />\n\n        <Spacer.Vertical size={20} />\n\n        <Slider\n          label=\"Playback Speed\"\n          value={playbackSpeed}\n          onValueChange={handlePlaybackSpeedChange}\n          min={PLAYBACK_SPEED_CONFIG.min}\n          max={PLAYBACK_SPEED_CONFIG.max}\n          step={PLAYBACK_SPEED_CONFIG.step}\n          minLabelWidth={labelWidth}\n        />\n      </View>\n    </Container>\n  );\n};\n\nconst styles = StyleSheet.create({\n  algorithmSelectContainer: {\n    paddingTop: 20,\n    paddingHorizontal: 20,\n  },\n  controlsContainer: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n});\n\nexport default PlaybackSpeed;\n"
  },
  {
    "path": "apps/common-app/src/examples/PlaybackSpeed/constants.ts",
    "content": "const PCM_DATA1 =\n  'BQADAAEAAAAAAAEA/P/4//v//f///wAAAAD///7//f/+////AQAAAP//AQACAAEAAQD///3//f/+//7//P/6//r//P/9//r/+P/4//n/+f/4//j/+v/8//7/AQACAAYACgALAAsADAALAAkACAAIAAYABAABAP7/+v/5//3//f/6//r//P/5//f/+v/8//z//f/8//z//v8BAAMABAAEAAgACAADAAcADAAKAAkACwAHAAIAAAD9//z//P/1//T/+f/2//T/+P/8//3//v///wAA//8AAAIAAQAEAAoADQAOAA4ADQAPABIADwALAAwABwD///3////+//3//v/+//7//v/+//v/+f/5//T/8f/w/+z/8//9/wIACAALAAkACAAHAAsAEQAUABcAGAAXABkAGAAUABAACQABAPz/9P/t/+v/6v/q/+7/8P/2//v/+v/9////AgAGAAYACQAOAA4ADwAOAA4AEQARAAoAAAD7//3/+//1//T/9P/v/+v/7f/r/+f/7P/v/+3/8v/8/wMADAAVAB0AJAAkACIAIwAeABsAHAAPAP/////6/+//6v/m/+T/5v/j/+H/6f/v/+//9f/+/wEABAAQABoAGwAcAB0AGgAZABgAEQAHAAAA+P/w/+v/5v/i/+f/6f/l/+P/5f/q//L/9//7/wIACQAQABoAIAAiACIAIQAiACEAHAAVAAoAAQD7//X/8P/s/+n/6f/n/+X/5//q/+3/8f/0//v/AAAFAA0AEgATABYAGQAYABcAFgASAAwAAwD+//v/9f/y/+//6P/m/+f/5v/m/+n/7f/x//j///8JABAAEwAaAB0AGwAdAB0AFwAUABUADgADAP///v/4//T/8P/t/+7/7f/r/+//8v/z//j//v8AAAYACQAIAAsACgAIAAkACAAJAAoABgADAAEA/v/8//z//f/6//j/+v/9//3/AAADAAQABgAGAAQABAAFAAQABQAHAAUAAwAEAAMA///9//7///////7//f/9//7//v///wEAAgAEAAkADAAMAA0ADQALAAgACAAKAAUAAAABAP7/+//8//v/9//1//T/8v/0//X/9f/3//z//f8BAAgACwAKAAoACwAKAAkACQAKAAoACwAJAAUABAADAAAA/P/2//P/9f/3//j/9//6//3//P/9//7//f8AAAMAAgADAAUABwAKAA0ADgAMAAsACwAKAAYAAQD+//z/+P/z//D/7f/o/+3/9f/1//j///8AAAEABAAFAAUABwAFAAQACAAHAAcACQAJAAYABAABAP//AQD///z//P/7//7////9/wAAAgACAAIAAgADAAQABAAHAAgABgAIAAoABgAEAAQA///6//n/+f/1//L/8//1//f/+f/7//3///8AAAEAAQACAAcACAAGAAkACQAGAAcABwAFAAUAAgD9///////6//r/+//5//n/+//+/////v8AAAMACAAKAAkACAAIAAUABQAHAAUAAgADAAEA/P/7//3/+v/2//r//v/7//j/+f/2//T/+f/8//r//f8AAAEABgAJAAsADwAQAA4ADgALAAUABwAFAAAAAQD9//X/9v/4//j/+f/4//j//v8CAP//AQAGAAUABAAJAAsACgAKAAoACQAHAAYABQACAAAA/f/3//b/9P/v//P/9f/z//T/9f/2//r/+//9/wIABAAFAAkACwALAA0ADgAPAA8ADAAKAAcAAgAAAP3//P/8//z/+//5//r/+//6//v/+//7/wAAAAD//wMABQAGAAgACAAHAAYABQAGAAMAAQABAAAA/v/+//z/+f/6//v/+//8//v/+//+//////8AAAMABQAEAAMAAwADAAQABQACAAEAAQD+//7/AQD//wAAAgABAAEAAwAFAAUAAwABAAIAAgD///7//v/+//3//f/+//7//P/8//3/+//7//3//f/7//v//v//////AgAGAAYABQAGAAUABQAFAAQABAAEAAAA/v8AAP7//P///wAA/v/9/////v/9////AQACAAMAAgADAAMABQAGAAUABgAGAAQABgADAP//AAD//wAAAgAAAAAAAAD+//z//v////3//f////////8BAAAAAgADAAEAAwAGAAUAAwAEAAYABwAHAAUABQAEAAIAAQABAAAA/v/+//7/+//5//z/AQD///7/AgADAAIABwAJAAQAAgAFAAQAAAAAAAAA/v8AAAIAAAABAAAA/v///wAA/f///wAA/v8BAAEA+//+//7/+//+//////8AAAAAAAAEAAYABQAIAAkABgAEAAYACAAHAAYABgAFAAEAAAD///v//P/9//n/+//6//f/+//7//n//f/9//3/AQAAAAEABAAEAAIABQAHAAcABwAHAAgACQAIAAYABAACAAAA/f/8//3//v/+//z//P/+//3/AAAAAP//AgACAAEABAAHAAcACQAKAAkACAAHAAUAAwD///z/+//7//r/+P/5//v/+v/7//7////+/wIABAADAAMABgAHAAUABQAIAAMA/v8DAAUA//8BAAEA/P/9//7//P///wAA/P/9/wAA/f/9/wAAAQABAAIAAQABAAMAAAABAAQAAgACAP///v8AAAAA//////7//v/+//7///////7//P/9/wAAAQABAAQAAwAGAAkACAAJAAgACQALAAcABAAEAAMAAwADAAAA/v/8//r/+//8//v/+f/6//3//P/6//z//v/8/wAABQAFAAUABQAEAAIAAQADAAQAAgADAAIAAQABAP////8BAP///P///wAA/f/+/wEA/v/8//7/AQABAAEAAgACAAMABAACAAIABQAFAAMAAwADAAIAAwACAAEAAQD/////AAD+//3///8AAP7//v8BAAAA/f8BAAEAAAACAAAA//8BAAEAAQABAAEAAQACAAEAAQABAAAAAgACAAAAAQABAAAAAgACAAEAAQACAAMAAgABAAIAAgABAAEAAQAAAAEAAgAAAAAAAAAAAAIAAQAAAAEAAwABAAAAAwADAAAAAAAAAP////8BAAIAAAABAAMAAQD+/wAA///9/////f/+/////f///////v8BAAEA/v8BAAMAAAAAAAIAAQABAAIAAgACAAMAAgAAAAIAAQD+//7/AAD/////AAD//wAA///////////+/wAAAAAAAAIAAgABAAEAAQADAAQAAQAAAAIAAAAAAAIAAAD+/wAAAAAAAAEAAAAAAAEAAAABAAEAAQAEAAQAAgACAAIAAQAAAAEAAgACAAIAAQAAAP//AAD///7/AAAAAP7////+/wIAAgD+/wAAAQD9////AwACAAAAAgACAAEAAQABAAAAAgABAP7///8CAAEAAAABAP///v8AAAIAAQD//wAAAQD+/wAABAABAAAAAgACAAMAAwAAAAEAAgACAAMAAAD9/wEAAgD//wIAAgD//wEAAgABAAEA///+/wEAAgD9////AwABAP//AAABAAIAAwABAAAAAgACAAEAAQACAAEAAAABAAEA//8AAAEA/////wIAAQD//wAAAwABAP//AQAAAP7/AQACAP//AAAAAAAAAgADAAEAAgACAP//AAABAAAAAQABAAAAAQABAP//AAAAAAAAAQD///7/AQACAP//AAACAAAAAAACAAMAAgACAAIAAgABAAEAAQD//wAAAQD+/wEAAQD9/wAAAAD9/wAAAAAAAAEA/v8AAAIAAQD//wEABAADAAEAAgAEAAIAAQADAAIAAQADAAEA//8AAAIAAgAAAP//AQAAAAAAAQD+/wEAAwAAAP//AAD//wEABAADAAEAAQABAAEAAQABAAEAAwABAP7//v8BAP///v8BAP////8CAAEAAAD//wEAAwAAAAEABAAAAP//BAACAP7/AgADAAEAAwABAP7/AAABAAAAAQADAAIA/////wEAAgABAAAA//8BAAAAAAACAAAA/v8CAAIA/v8AAAEAAAABAAAAAQACAP//AAACAP7///8EAP///v8DAAIAAQACAAAAAQACAAEAAwADAAMAAwABAAIAAwACAAEAAAABAAEAAQABAAAA//8BAAEAAAAAAAEAAQABAAEAAQABAAIAAgABAAEAAQACAAIAAQABAAMAAgAAAAEAAwACAAEAAAAAAAEAAQAAAAAAAQACAAIAAQAAAAEAAAADAAUAAQACAAMAAAACAAMAAQABAAIAAwD///7/AwACAP7/AgAFAP///f8DAAMA/v8AAAIA//8BAAIAAAAFAAQA/v8BAAMAAAABAAIAAQADAAMA//8CAAMAAAABAAMAAQAAAAAA//8BAAEAAAACAAIAAQACAAEAAAAEAAMAAAACAAQAAgAAAAAAAQABAAAAAQD/////AQAAAAAAAAD9////AwAAAP//AQABAAAAAQADAAEA//8CAAQAAgACAAMAAQABAAMAAgD/////AgAFAAEAAAABAAAAAQADAAAAAQADAAAAAQAEAP7//v8EAAMAAgADAAEAAwADAP//AAADAAEA//8AAAEAAAD//wAAAQABAAIAAAD//wAAAgABAAEAAQABAAEAAQACAAEAAgADAP////8EAAEA//8CAAEAAgACAAEAAgADAAAAAAACAAEA/v8AAAMAAQD//wEAAQAAAAEAAQD//wEAAgAAAAAAAAACAAIA//8AAAIAAAAAAAQAAQD//wIAAQABAAIAAAAAAAIAAQAAAAEAAQAAAP////8AAAIAAgAAAAEAAgABAAEAAQAAAAIAAAD//wEAAgABAAAAAAABAAEAAgABAAAAAAACAAIAAQAAAAEAAgACAAEAAQACAAAAAAACAAIAAAAAAAQAAwD//wEAAgD//wAAAwABAP//AQACAAAAAQACAAEAAgADAAEAAQABAAEAAQABAAEAAwABAP3/AgAEAP//AAADAAAAAAACAAIAAQACAAAAAAACAAEAAQABAAEAAQACAAAAAgADAAAAAAABAAEAAwACAP//AQACAAEAAQACAAIAAQABAAMAAQD//wEAAQAAAAEAAgABAAAAAQABAAEAAgAAAAIABQAAAP//AwACAAEAAgACAAAA//8BAAIA//8AAAMAAgAAAAEAAAAAAAIAAQABAAIA//8AAAIAAQABAAAA//8BAAIA/////wIAAQD/////AAABAAEAAAD//wEAAQD//wAAAAAAAAEAAAAAAAEAAAAAAAAA//8BAAEA/////wEAAAAAAAEAAQAAAAEAAAAAAAAA//8AAAAA//8AAAAA//8AAAAAAAABAP////8CAAAA/v8BAAIAAAD//wAAAAD+/wAAAgAAAP//AQD///7/AAAAAP//AQD///7/AAAAAP//AAAAAAAAAAD+////AgAAAP3/AAAAAP////////////////7//v/+//3//P///wAAAAD///z//P/+//////8AAAIAAgABAP//////////AAD///7//v/////////+//3//v///////v/+/////v/+/////f/9//7//v/9//7/AAD///3//v////3//f///////v///////v///wAA//////////8AAAAAAAAAAP////8BAAAA/v8BAAIA/v/+/wEAAAD+/wEAAQD///////8AAAAA////////AAD///////8AAAAAAAAAAAAA//8AAAAA///+/wAA/v///wEAAQD/////AAAAAP///////wAAAAAAAAAAAAD///7/AAABAP//AAACAP///v8BAAEA/v///wEAAAD//wAAAQAAAAAAAAD//wAAAQD/////AAD+////AQAAAP///////wEAAAD9//3/AAD/////AQD///7///8AAAAAAAAAAAAAAQABAP///v/+////AAABAAAA/////wEAAAD+/wAAAQD//wAAAQAAAAAAAAAAAAAAAAABAAAA/v8AAAIAAQAAAAEAAAD9//7/AAD/////AAD/////AAD//wAAAQAAAAAAAQABAAIAAgAAAAAAAQAAAAAAAAD//wAA///+/wAAAQD//wAAAwAAAP3/AAADAAEAAAACAAIAAQACAAEA/v///wAA//8BAAIA//8AAAIA//8AAAMAAQD//wAAAAACAAEA/v///wAA/////wAAAQACAAEAAQABAAEAAQAAAAAAAAACAAIAAQACAAIAAQACAAEAAAACAAEA/////wAAAAABAAAAAAAAAAEAAAD/////AAABAP//AAACAAEAAQABAAIAAgACAAIAAQD//wAAAQAAAP//AQABAP//AgADAP///v8DAAQA//8AAAQAAQABAAMA/////wAAAAABAAEAAAABAAAAAAADAAIA/v8CAAMA//8AAAEAAAABAAEA//8CAAMA/v///wIAAQAAAAAAAAACAAIA//8AAAQABAACAAAAAAAAAP//AAAAAP7/AAABAP////8AAAAAAQAAAAAAAAAAAP7///8CAAEAAAACAAMAAAD//wAAAQABAAAA/f/9////AQABAAIAAQAAAAAA/////wAAAQACAAEAAAABAAAA//8AAAAAAAABAAEAAAAAAAMABAABAAAAAAABAAEA/v/8//7//v/+/wIABAABAP7/AgADAPz//P8BAP7/+v8BAAMA/f/9/wIA/v/8/wEAAgACAAQA/v/9/wMAAwABAAIAAgADAAMA/f/8/wIA///8//7//P/8//7//v///wAA/f/9/////f/6//r//f8AAP7/+v/+/wMAAAD6//f/+v8AAAEA+//4//3/BAAFAAIAAQADAAQAAgD///3//P/8//3/AQAGAAMA/f/+/wQABAD+//v/+//8/wIABQACAAEAAwACAP///f8DAAMA+v/9/wYAAQD//wQABAAGAAkAAwAAAAAA+P/4/wEAAwAAAAEABAANAA8A///3//z//P/8//7/+//2//f//f/2/+f/5//r/+//9P/w//T/BAAVABsADwAMACAAHwAGAP//AQD3//r/DQAgAEMAaABxAF0APQAtADAAKAAZABEA8f/V/+j/7v/P/7f/rP+y/7P/lv+D/6D/zP/X/9v/AgASAP3/+f/1//b/BgD8/+T/2f/i//7/BwAJABMAHAAyADUADwD0/+3/1/+9/6z/sP/T/+//AgBCAHMAXABFAD8ALQAtADsANwAtADEAQwBiAHUA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DgAQABMAEAARABcAFwAXABsAHAAdAB8AHQAcAB4AHQAYABYAFAAQAAwACQAGAAMAAwADAAEAAgAEAAYACAAJAAsADAANAAwACwAKAAgAAgD8//f/8f/s/+n/4//c/9n/1//S/8//zv/L/8r/zP/N/87/z//Q/9P/1P/V/9j/1//X/9v/3P/b/9r/2v/a/9r/2v/Y/9j/2f/a/9v/3P/e/93/3//j/+P/5f/p/+j/6P/q/+z/6v/o/+r/6//q/+r/6f/n/+j/5//k/+L/4P/e/93/3P/a/9v/2f/W/9X/1P/R/9H/0v/P/9D/0f/P/9L/0v/R/9T/1P/S/9L/0v/S/9L/0P/P/8//zv/N/8v/yf/J/8j/xv/I/8n/yP/K/8z/z//P/87/0f/V/9X/2P/a/9n/2f/c/97/2//a/9v/2v/c/9v/2f/b/97/3f/f/+D/4v/k/+b/6f/q/+v/7//w/+7/8v/2//X/9f/2//X/9//2//P/9f/1//T/9f/1//P/8v/y//P/9P/z//D/7//x/+//7P/r/+r/6v/o/+X/5f/n/+f/5f/l/+X/5v/o/+n/6f/r/+z/7f/u//D/8P/y//T/9P/0//X/9v/2//b/9//3//f/+P/6//j/9//5//r/+f/7//3//f/+/wAAAAACAAQAAwAEAAQAAgACAAMAAQAAAP///v/9//z/+f/5//n/+f/5//j/+v/7//v//f///wAAAQACAAQABgAGAAcABwAHAAYABwAGAAMAAwADAAIAAgABAAAAAwAEAAQABgAGAAkADQAOAA8AEwAVABQAGAAcABsAHAAeAB8AHwAfAB8AHQAcAB0AHgAdABwAHQAcABsAHQAfABwAHAAeAB0AHwAfABwAHQAeABwAHAAeABwAGQAaABoAGAAWABYAFQAUABMAEgAQAA8AEAAQABAAEAAQABEAEwASABEAFAAUABEAEgAUABIAEwATABAAEQARAA8ADwAQAA4ADAAMAA0ADQAMAAsADAAMAAoACQAJAAgABQAGAAcABQADAAUAAwABAAMAAwAAAAIAAgACAAMAAgADAAQABAAFAAUAAwAEAAgABQAEAAcABwAHAAkABwAIAAkACQAIAAoACwAKAAgACQAKAAgABwAGAAUABQAFAAMAAgACAAEA///+//z//P/9//z/+v/6//r/+v/5//j/+P/5//j/9v/2//f/9//1//X/9f/1//T/8//y//L/8v/z//T/9P/1//b/9//4//n/+//9/wAAAgACAAQABQAFAAcACAAIAAkACQAKAAkACAAKAAkABwAKAAsABwAGAAgABwADAAUABwAEAAQABQAEAAYABQACAAMABAABAAAA///+//7//f/6//n/9//0//T/8//x//D/7//v//D/7//v//D/8f/x//H/8v/y//P/8//x//H/8v/w/+7/7v/u/+z/6//s/+v/6v/u/+7/7v/w//H/9f/4//j/+v/+/wAAAgADAAYABwAHAAsADQAMAA4ADwANAAwADwAQAA8ADwASABMAEgATABQAEgATABQAEgAUABQAEgATABQAEAAPABMAEgAQABAAEAAPAA0ADAANAA0ADAAKAAkACwAMAAsADAANAA0ADwAQAA8ADgARABEAEAASABQAEgATABMAEwAUABUAEgASABUAFAATABMAFAAUABQAEwAUABMAEQAPABEAEAALAAwADwAKAAcACgAIAAUABwAHAAUABwAGAAQABgAGAAYACAAIAAcABwAFAAcACgAHAAUABwAGAAUABQAEAAQABQAEAAMAAwADAAMAAQAAAAIAAgABAP///v////7//P/7//r/+f/5//b/9f/2//X/9P/0//P/9P/0//L/8P/w//H/8f/v/+7/7//v/+7/7P/s/+3/7f/s/+z/7P/s/+z/7v/t/+z/7v/u/+z/7f/w/+//7f/w//L/8P/w//L/7//x//P/8v/x//L/8v/z//P/8v/0//L/8f/2//j/8//2//v/+P/4//v/+//6//v/+f/4//r/+f/5//r/+v/6//r/9//6//7/+f/6//7//v///////v///wEAAAAAAAEAAAD+/wAAAgD///z//v/+//v//P/+//v/+v////7//P////z//f8BAPv/+f/8//n/9f/0//L/7//r/+r/6f/l/+P/4v/e/93/3P/Z/9j/2v/Y/9j/2f/X/9j/2v/Z/9j/2P/b/9v/2v/Z/9r/2//c/9v/2v/c/97/3f/d/97/3//h/+L/4v/k/+f/6f/r/+3/7f/v//H/8v/z//X/9v/2//f/+f/6//r//P/8//v//f/+//3//P/9/wAA///+/wAAAQD//wIAAwACAAUABQAEAAgACAAGAAoACgAIAAkACgALAAkACwAOAA0ADQAQAA8ADwASABEAEgAVABYAFwAZABoAHAAdAB0AHwAiACEAIwAoACcAJgArAC8ALgAvADAAMwA1ADYANwA4ADsAPAA8AD4APwA+AD4APgA+AD4APgA+ADwAOwA8ADsAOgA8ADwAOwA7ADsAOgA6ADoAOQA3ADUANgA1ADIAMgAwAC4ALQAqACkAKAAmACQAJQAjACEAIAAiAB8AHQAeAB4AHAAbABoAGQAYABgAFwAUABMAEwAQABAAEAALAAwADAAJAAkABwAGAAYAAgABAAQAAwAAAAAAAgD///z//v/8//r/+//4//f/9//1//T/9P/z//P/8f/v//D/8P/v/+//7//u/+7/7v/s/+z/7v/r/+r/7P/q/+n/6v/p/+n/5//n/+j/5//n/+j/5//n/+j/6f/p/+r/6P/p/+v/6P/o/+v/6v/o/+j/6P/n/+j/5//n/+b/5v/m/+X/5v/m/+T/5f/n/+X/5v/n/+b/5//o/+f/5//m/+b/6P/p/+f/5//n/+f/5//n/+j/5//l/+b/5//m/+f/5v/l/+b/5v/n/+j/5//n/+j/6P/o/+f/6P/q/+f/5//p/+j/5//o/+f/5v/m/+b/5v/l/+T/5v/l/+L/4//j/+L/4//j/+L/4//k/+P/5P/k/+P/5P/k/+P/4//i/+L/4//i/+D/4v/i/+D/4P/h/+L/4f/h/+L/4//j/+L/4v/l/+X/4//m/+f/5P/m/+n/6P/n/+r/6//p/+n/6v/p/+z/7P/p/+z/7//t/+//8f/x//H/8//1//b/9v/4//n/+P/7//3//P/9//////8BAAEAAAACAAIAAgAEAAUABAAFAAYABgAHAAgABwAHAAoACgAJAAkACgALAAwACwALAA0ADQAMAA0ADQAOAA8ADwAPABAAEAARABIAEwATABQAFQAVABUAFgAXABcAGAAZABkAGQAaABsAHAAbABwAHQAcAB0AHwAeAB8AIAAgACEAIgAhACMAJAAiACQAJQAkACUAJQAkACYAJgAlACYAJgAmACcAJgAnACkAKQApACkAKwArACsAKwAsAC0ALgAtAC0ALgAuAC4ALQAtAC4ALwAwAC8ALgAxADEAMQAyADEAMwA1ADQANQA3ADYANgA3ADgAOAA4ADkAOgA6ADoAOgA5ADkAOgA6ADgAOQA6ADoAOAA4ADgANwA2ADcANQA1ADYANAAyADIAMQAwADAALwAsACwAKwApACcAJQAjACMAIQAeAB0AGwAYABcAFgATABIAEAANAAsACQAHAAYAAgABAAEA/P/6//v/9//0//P/8f/u/+z/6v/n/+X/5P/h/93/3P/b/9j/1f/T/9L/z//L/8r/yf/G/8P/xP/C/77/v/+9/7n/uv+3/7T/tv+y/7H/sv+w/67/rP+q/6v/rP+o/6f/qP+n/6f/p/+l/6b/pv+m/6b/pf+l/6b/pf+m/6f/pv+m/6b/pv+n/6f/qP+n/6j/q/+r/6r/q/+t/6//sP+x/7L/tP+2/7f/uP+5/7z/vv+//8D/wv/D/8X/yP/I/8r/zP/N/8//0P/R/9T/1v/W/9n/2//e/9//4f/k/+X/6P/r/+r/7f/w//D/8v/0//T/9v/4//n/+f/6//7//v/8/wAAAwD///7/AgACAP7/AQADAP//AQADAAAAAgACAP////8AAP3//f/9//v//P/7//f/+P/2//P/8//z//H/8f/v/+7/7v/u/+z/7P/t/+v/6v/r/+r/6v/q/+n/6f/q/+r/6v/p/+r/7P/q/+3/7v/s//H/8//y//b/9//6//7//v8BAAQABwAKAA0AEQAUABUAGgAfACEAJQApACsALgAzADYAOQA9AEMARwBJAE4AUwBVAFoAXwBhAGcAawBsAHEAdgB3AHoAfwCCAIQAiQCMAI0AkACTAJUAmQCaAJsAngCgAKMApQCmAKgAqgCrAKwAqwCrAKwArQCuAK4ArACsAK0AqgCnAKoAqAChAKMApQCeAJwAnACXAJcAlQCQAI4AigCFAIIAfQB5AHYAcABqAGcAYQBbAFcAUgBOAEkAQgA8ADoANAAtACcAJAAeABYAEgANAAYAAQD8//T/7f/p/+L/3P/X/8//yf/G/7//uP+1/7D/qf+k/6D/nP+X/5H/jf+I/4T/gP97/3f/dP9w/2z/af9k/2D/YP9b/1b/VP9R/07/TP9K/0j/RP9C/0L/P/8+/z3/Ov86/zr/OP83/zj/Nv82/zf/N/84/zn/OP86/zz/PP8+/0H/Qv9E/0b/Sf9L/07/Uf9V/1r/XP9d/2P/af9q/2//dv95/3v/g/+K/4r/jf+Y/5z/m/+k/63/rv+1/7z/vv/I/8//0f/Z/+D/4//q//H/9v/+/wMABQAPABUAFgAdACUAKQAvADUAOQBCAEgASwBSAFkAXQBhAGcAbQBzAHcAfQCBAIQAigCQAJEAlgCcAJ4ApACoAKkAsAC0ALUAugC9AMEAxQDGAMkAzQDOANAA0wDVANcA1wDYANsA3ADcAN4A3ADbAN0A3ADbANsA2wDbANgA1wDXANQA0wDRAM4AzQDLAMYAxQDDAL8AvAC6ALYAsgCvAKwApgCgAJ0AmgCVAJAAiwCGAIEAfAB2AHIAbQBmAGIAXgBWAFEATgBIAEEAPAA4ADEAKgAnACIAGgAWABEACgAFAAAA+f/z/+7/6f/j/97/2f/U/9H/zP/I/8T/v/+9/7z/tf+x/7P/sf+t/6z/qv+o/6j/pf+i/6L/of+e/53/m/+Z/5f/lf+U/5T/kv+Q/5H/j/+P/43/iv+J/4f/h/+G/4L/gP9//3v/ef92/3L/cP9u/23/av9l/2P/YP9e/17/W/9Y/1j/V/9V/1T/Uv9R/1H/T/9N/0v/Sv9K/0r/R/9G/0b/Rv9F/0T/Q/9E/0P/RP9E/0L/Qf9D/0X/Q/9C/0T/Rv9G/0X/R/9J/0v/Tf9O/03/Tv9Q/1H/Uv9T/1X/WP9b/17/YP9j/2f/a/9u/3H/dv96/3z/gP+G/4j/iv+R/5X/mP+e/6L/pv+r/7D/tf+6/7//xv/L/87/1P/b/9//5P/r//D/9f/8/wEABgANABIAFwAgACUAKQAwADgAPABBAEYATABSAFcAXABgAGQAaQBuAHMAeAB7AIAAhgCIAIwAkgCWAJgAnQCiAKQAqACsAK8AswC1ALkAvAC/AMIAwwDGAMsAzADOANIA0wDVANgA2QDcANwA3QDgAOIA4QDiAOQA5ADlAOUA5gDnAOYA5gDnAOcA5wDlAOUA5gDkAOMA4gDgAN8A3gDcANoA1wDXANYA0gDQANAAzQDMAMoAxwDDAMEAvwC7ALYAswCxAK0ApwCjAJ4AmACVAJEAigCFAIEAfAB4AHMAbABoAGMAXQBYAFEASwBGAEAAOAAzAC0AJgAgABoAEwAMAAYAAAD7//T/6//l/+L/2v/R/83/yP+//7n/tf+u/6b/ov+f/5b/kf+O/4j/hf+B/3n/ev94/3L/cP9u/2r/aP9l/2P/Yv9h/17/Xf9c/1z/XP9d/13/Xf9d/1//YP9g/2L/ZP9m/2n/bP9u/2//c/93/3n/ff+C/4X/iv+Q/5P/l/+d/6L/p/+s/7H/t/++/8L/xv/N/9P/2f/e/+P/6f/v//T/+/8BAAYADAATABgAHQAjACoAMAA1ADsAQABEAEsAUABTAFcAXgBkAGMAagByAHEAdgB9AH4AgQCGAIkAjQCPAI8AkwCVAJUAmQCZAJUAmQCbAJcAmQCZAJcAlwCWAJQAlgCUAI8AjwCPAIoAhgCFAIMAfgB5AHUAcQBsAGgAYwBdAFoAVgBQAE0ARgA/AD4AOgAxACwAKAAiABsAEwAOAAkAAgD6//T/7v/o/+D/2//X/8//yP/F/77/tv+x/6v/pP+f/5n/k/+M/4b/gf96/3X/cf9r/2j/ZP9d/1j/Vf9R/07/Sv9F/0D/Pv87/zT/L/8u/yz/J/8j/x//Hf8d/xj/FP8U/xH/D/8O/wr/B/8F/wT/A//9/vz+/v76/vf++P72/vT+9v72/vP+8/70/vP+8v7y/vP+8f7y/vP+8f7w/vH+9P71/vL+9P76/vr++f7+/gD//f4C/wP/Av8K/wn/CP8P/xD/Ev8Z/xv/Hf8g/yP/Kv8x/zP/N/8+/0L/SP9O/1P/Wf9e/2T/a/9w/3X/fP+C/4n/kv+Z/5//p/+w/7n/wf/I/9D/2v/l/+z/8v/8/wcAEAAYACAAKQA1AD8ARwBPAFgAZABvAHcAfwCJAJMAnQCmAK4AtwDBAMoA0gDaAOMA7QD1AP0ABQENARQBHAElASsBLwE3AT8BQgFKAVABUwFaAV8BYgFpAW4BcgF1AXkBgAGBAYABiQGNAYcBhgGPAY8BiAGLAZIBjQGNAY8BjQGPAY8BiAGHAYcBgwGAAXwBeAF2AW8BZAFiAV0BUwFOAUkBQAE4ATEBKgEkARwBEAEHAQAB8gDlAN4A0gDDALcArQCgAJEAhQB7AGwAYABVAEYAPAAwACAAGAALAPj/7v/j/9T/w/+y/6b/mv+M/37/cP9k/1j/Tf9E/zr/L/8m/x3/Ff8L/wH/+/7y/uv+5/7e/tf+0/7N/sr+yf7F/sX+yP7I/sf+yf7M/tD+0/7W/tv+4P7n/u3+8P74/gL/Cv8U/x3/Kf83/0H/Tv9g/2//ff+M/5v/q/+6/8j/2P/q//n/BgAXACoAPABJAFcAbgCAAIoAoAC5AMIA0gDnAPcACQEWASMBNgFBAUoBVwFjAXABfAGDAY0BmwGlAawBtgHAAckB0AHVAdsB4gHmAeYB6AHuAesB5gHpAekB4wHhAeEB2gHUAdQB0AHHAb8BugG0Aa8BoQGRAY0BhAFxAWUBWwFNAT0BLgEfAQ8B/wDzAOQAzwDBALcApwCUAH0AagBjAFAAMwAfAAsA+f/p/9P/vP+m/5L/gv9u/1b/Qf8y/yX/EP/1/uL+1v7B/qn+lf6C/nL+Xf5E/jH+Hf4N/gD+6v3U/cf9u/2q/Zf9h/19/XX9aP1X/Un9Qv05/Sr9Hf0X/Qz9Af3+/Pb85/zg/OT84PzM/Mz81vzQ/Mv8zPzJ/NT82fzR/NL82PzW/Nf82vze/Oj85vzi/PT8/Pz3/AT9FP0Z/SH9Lv09/Ur9U/1c/Wz9eP15/YH9lv2k/av9uP3I/db95P34/RD+Gf4m/kH+V/5r/nT+f/6g/rH+tP7F/tb+5/72/gH/Ff8o/zT/Tf9u/4L/kP+l/8L/3//v//3/FwAoAC4APQBPAGIAdgCHAJoArwDGAN4A+AAWAS0BQQFfAX4BkQGgAbMByAHcAegB8QEDAhwCJgIjAjUCWQJtAnYCjgKuAr4CxwLfAvQC+gL9AgMDEAMXAwkDCQMZAxQDBgMSAygDKwMqAzoDSQNLA1EDXQNdA1QDSAM7Ay8DJAMQA/gC9QLzAtwC0QLPAs0CzAK+AsECzQK0AqcCsAKfAoMCdAJjAk0CMwIVAvwB6gHRAbcBrAGmAZYBggFyAWMBVgFIATMBGwECAekAzQCuAI8AeABkAEwALQASAAMA9P/c/8v/v/+q/5P/gP9p/0f/JP8H/+3+1v7A/qj+lf6E/m3+Xv5a/lf+Uf5C/i/+H/4R/v/97f3W/br9oP2F/Wr9VP1D/Tf9L/0q/Sv9M/08/Tz9NP00/UH9Sf1H/T39Nv07/T79PP1B/U39WP1n/Xz9k/2t/cn95P3//R3+QP5i/nv+kv6q/sL+4/4Q/zb/Vv+H/8P/9v8rAGwAqwDlACABWwGUAcsB/QEpAlgCiwK9AuUCCQM8A3QDnAPHAwMEOwRoBJgEyAT3BCMFSAVpBYsFpAW7BdgF7gX1Bf0FDwYhBiwGNQY/BkUGSAZPBlEGTgZHBjsGLgYhBgkG7gXZBb0FmgV7BWAFQwUjBQUF5ATABJ4EgQRZBCsE/QPKA5gDZgMlA+QCqwJyAjUC8wGxAXcBPQEBAc0AmwBjACoA8f+x/3L/O/8A/7j+af4Z/tr9pP1b/Qz9y/yV/GD8J/zz+8D7h/tY+yz77fqy+ob6V/oW+tP5lvln+T/5Evnc+K34iPhr+E/4N/gh+An48Pfa98b3r/eQ93n3ZvdO9zb3IvcT9xD3CPf+9gP3FPcm9zL3O/dQ92r3gveW96j3u/fQ9+b3//cQ+CT4QPhh+H/4nvjC+PH4HvlF+XH5q/nj+RP6RPp6+qP6zPoF+z77ZvuV+837//sz/Gn8mvzW/BX9VP2S/cn9/P04/nz+uv7p/h3/W/+Q/77/+P8yAF8AjQDBAPgANQF1AaoB1QH/ATQCcwKtAtcC/QIpA1MDcgOPA64D1AP8AxoELARABGIEkAS3BNAE5gQKBS4FSgVfBW0FgQWaBZoFkQWWBaQFpQWQBYYFjgWUBZoFjAV+BZIFnQWXBZkFiwVrBVoFcgV5BTIF9wQSBQ0FwgSnBMIEugSaBG4EWwSZBM8EpQRLBAoE/wMKBAYE8AOlAycD8wIiAxkDrAJ2Ap8CuAKOAlwCbAK0As4CqgKqAskCvAKbAo0CWAL2AdYB7wG5AUIB8gDPALcAkABfAE0AWwBpAH8AnwCiAH8AjgDeAPYAuQB0ADsAAwDF/3b/Hf/G/mz+GP7X/aH9h/2T/Z/9k/2W/dH9FP4X/vj98/3y/dn9r/1k/QL9r/xt/Cf84fuV+1j7QPs4+y/7M/tM+237gPuh+8j70PvL+8j7vPut+5j7fvtr+1v7SPtG+1v7fvuq+9b7+fsd/E78mPzf/P/8Dv0o/Uz9bv10/W39ff2l/dr9Fv5T/pb+8f5i/9X/QQCzACwBmwHvAS4CbAK0AvsCMANZA30DnQPQAx4EaASnBP8EbAXZBUIGowb5BlMHsgcGCEEIawiWCL4I2QjzCBYJOQleCYkJqgnJCfIJIgpRCncKhwqRCqEKpgqRCnYKXApDCiUKAQrVCakJiAltCVEJOQkiCQkJ7wjJCJIIYggzCPMHrAdtBxsHrQZHBvgFogVDBfUEuARwBCME3gOdA14DIwPaAocCMgLKAWMBCwGkAC4Avf9Y//7+n/5A/u/9o/1W/Rf96/y6/Gf8D/y7+1j79vqZ+jP6zvlg+e/4kPg/+On3kvdP9yj3Avfe9rr2dvYq9iD2IPbQ9WD1E/Xh9MX0mvRH9PDzxPO4863zlfOP85/zmPOD85LzoPOg87nz0vO385DzkPOz89Pz0PO789XzCPQc9CT0TvSO9MX08fQh9Vr1ofXZ9fj1FPZC9oT24vYv9073b/e69wb4QviG+Nb4IPlo+bz5Cvo4+oT6A/tt+6v74Psi/H785Pwt/Wn9sP3s/R/+aP6p/sj+A/95/+f/IABZAL0AJwFsAZgB1QE1ApsCzgLVAtMC1QIDA10DmQObA4EDhwPZA0gEiwSnBM0EDAVGBXkFowW0BbwF1gXeBcwFzAXcBdkF0wXHBdUFKAZ8Bn8GKQbxBVgGzAa9BpkGkwZzBlUGSAYmBvUFwwWRBYgFpgWvBZQFdwV1BZAFowWuBcMFoAU1BQkFKwUUBcMEnASXBHoEJwSuA2cDagNhA1YDggOhA3oDZAOLA4MDTQN1A8MDpQN4A7YD2wOIAxsD9QIuA08D0AIiAtIBtAGIAVcBRwFuAa8B1gHSAbwBtAHoAWoCyAKpAmkCQwL2AVkBhgC2/wv/Zv6x/Qn9o/yq/P78Qf1y/eH9fP70/ib/DP/H/pf+d/4j/n39n/y7+/b6RPqc+Q/5wvjJ+AH5V/nW+Vz65fpw+9H7+Pvy+8P7dfsP+6v6Sfrf+YT5QfkF+en4EPlx+eT5Y/oC+6f7Mvy8/EH9ff14/Wv9Uf0u/QP9v/yj/OL8S/22/Sz+v/56/z8A8wCuAV0C1QJHA8gDEwQjBCYEIAQLBPgD+AMYBGAEwwRNBQ0G7AbCB5IIYQkaCqEK/Qo1C08LVgtQCzQLEwsJCxcLLQtCC14LowsTDIUM5QxbDekNaA6qDqkOiA5uDkwOBA6VDSENvwx9DFEMKgwPDB4MSQxsDHcMbgxQDCEM5AuZCy0Lswo7Cp0Jxwj+B2kH8AaHBjgG/gXeBckFqgWJBWUFHwXCBF0E1QMbA0ECVQF4ALj/D/+D/gz+nv1A/QH92vyz/Jn8nvyV/Fj86/tW+6b68Pk/+YP4sff19mD22fVr9TL1HvUb9R71IvU79Vf1KPXG9Gn0CvSd8ybzmfL38V3xC/HZ8ITwTvCB8NXwCPEY8RfxKPFa8WnxSPEb8enws/CJ8E7w/u++76rvt+/N78/v4O8q8I7w2fAV8VXxk/HE8e7xAvIE8gjyHPI68mryovLe8iPzfvPx83H05vRF9ZD13PUi9l72pvYG91T3d/eF96D3zPcI+FP4t/g5+d/5kfot+7f7SPzV/Ef9nP3d/RX+T/6B/q/+8P5N/7P/GgB9AN8AUwHWAVMCzQJQA9QDTQSoBN4E+gQNBRsFLQVIBW0FowX0BVIGrAb/BlcHtgcOCFkIlwjHCO8ICwkhCT4JVglPCUIJQwk+CS8JOQlcCYIJqAnYCQIKIQpJCnIKawpBCjAKKwr7CcQJsAmWCWgJTQk2CRUJ8wjFCKEIlAhkCBsI9QfaB40HIAe8BmYGGQbOBWsF+ASYBFMEKQQXBPoD1wPWA+wD5wO+A30DJAPVArUClQI9AugBzgGuAU0B4QCsAKMAuADZAOsAEAFpAdUBPAKEApQClgKlAosCOgLkAboB6wFOAlgC3wEFAfP/7v4k/qH9Xf1I/V/9pv0B/kD+Zv6e/tz+7/7m/uj+8/7n/qf+RP7l/ZH9Kv2P/N/7UPvh+or6YPpy+rX6/voy+1H7Vfs4+wD7xPqg+pz6mfp5+j/6Dfr6+Qz6Ofp2+rX66foO+yT7MPtC+1D7Tfs7+zD7M/sq+wj77Pr6+kD7vftV/Pf8sv2J/lb/AACJAPMANAFHATsBKgEdARABDgE2AYgB6QFbAvACmQNIBAkF3AWtBn4HRwjyCHcJ1wkTCj0KUwpTClMKbQqPCrAK6wpYC94LXwzQDC0NdA23DeoN+g3uDekN8A3/DREOKA5CDlgOVw5EDh0O6w3GDbkNrQ2ZDXoNSw0BDZoMGQyXCxoLowo8CvcJygmtCZoJjQmECVsJ+QiICA0IcgfQBkQGvAUhBXcEzgMaA2ECvQEoAa0AUgD+/7D/c/9C/wf/oP4U/n791vwk/IX77vpO+r/5W/kX+eT4qPhr+D34BPid9xj3jPYL9pP1C/V49Af0qPNB8/LyvvJw8hby2PHB8b/xrfGO8ZrxuPGw8XLxH/HV8JDwLvC370rv/O647pLuou7F7tju9e4O7yXvT++P78bv5e/m79rvxO++79Dv3u/W7+fvJPBo8J7w2fAn8YXx0/EL8jbyVvJo8pPy6/I080HzcvPj8zL0YvTN9Ez1o/UR9sX2OfdX96/3Jfh0+ML45Pj1+Cn5Uvm4+ab6d/uj+6H7/PuN/Dv9If76/pj/JACDAKIAlABhAFIAoQA3AbYB0QHZAfIBFAKgAmMDFQTlBJsF6QW/BS0FKQVtBpsHXwe1Bo0G4gaPBysIwAiRCWAK4QqkCtEJIAlfCE4HVwfuCB4KGAoOCpgKGwttCv0IpwhsCcAJeQmrCeQJkggGB1wHyAenBkAGngbSBHoCSwOVBWgGwgbMB6cIEAgSBbsBawEWA04E8QX9BwEIwAUlA1cCWQQBBp8EyQKXApcCSALVAm4EkgYyCVsLqgs8CjgI3AbrBpwHKwg7CZoKVwsNDEoNgA2eC5UIiAQE/6T5WPYm9eP18PjI/YEC7wSuBJMDWQO1A6oDoQNGBBIFeAXeBMgC6f/T/FL5cPXC8UPvgu6f79fyh/dG/Lz/+ABKAJb+N/yh+c/3XPfP90r4n/ik+EX4DfgP+L/3RfcP9972kfa+9s73hflG+6P8Wv0M/ef7uPoE+jr62Puj/sgBqATrBnYIVQlnCZYILwddBRsD7wCY/2H/XwBpAjMFqggdDHwOrA9hEPYQbhH+EbsSPxNKE9YSuBEGEBQOIgyWCqEJOAlkCToKtwvTDTkQNBIrExETFRJiEEAORQwLC9YKfguDDEMNdQ0/DaUMfAv7CXgIMgdCBokF5AR7BE8EJgQOBC0ETQRUBH0E1AQwBacFTQb8BngHkAf7Bl8FBwPiACP/bf0d/L37BvyL/GD9nP4FAFwBiwKbA2IETARKAxAC2AB7/zz+Qv19/PT7lPsk+5/6EPqm+bf5Kvqa+gT7h/vy+/j7kfva+tL5n/i09xf3XPbI9QH2t/ZQ98H37vdj9xn2g/QL85jx8u+f7mzu3u787vHuPO9275XvbPDh8ePydfP689XznvIa8avvDO5K7Lvqt+lW6Q7p3uiH6QTrcuyZ7czuBPD78KLxIPKD8l3ylfHV8NvwV/FI8bDwdfCA8Ebw/++a8Hzyk/TK9WP2q/Z89lj2J/ev+Nz5ZPr2+sn7MfzM+2/77PvY/Iv9Pv4Z/5//qv+y/+P/0/8j/1H+ff7I//kAbQHZAboCwAOWBAQFFwV7BVIGsgZ5Bn4G7gZeB6sHyQccB4kFcQRzBE0EAAT9BHMG3wb4BhEHDwd/B98HugfOBy4IMQi0B4EHYggiCfYHMgdeCdAKbwjOBagF1wUfBdYEwwVVBwYIkAeFB6EHMAaJBP0EhwZBBzkHygZxBuwGfgeDBl8EBAOoAhsC9QCm/4L/IAHXAm4DTQOAAgABu/+l/1AAnACEANgAkgG7AaMAn/4H/SP9xv7DANUBbgG4ANkALQEeASIBYAF0AZMBIQJaApkBFAFkAm0FEQhtCFkHaQbXBYMFDgWyBLkF/ggWDn4SKxQFFBoSewzFA//6jfOu7TDrEe5y9fX9aQT+B74J5glDCDAGvgRdA2oCMAPhBPcE+AKU/wv6RvMw7gTrrujb6KrtI/b0/ksFkAiWCW4IUwSt/mb6Hvgi9zX34vdE+c36J/sX+5D7Lvud+az4oPi7+IX5bfsO/pEATALGA3oFdwYhBpsF7gWqBkUH6we3CJsJfArcCjQKyAgeB0MFZAOJAq8DrwZzCjEOChIRFgUZyBntGJEX7RXOE2cRRw+wDbgMJgySC/0KgwrSCewIQQhyCOcJMAxfDicQmBEcEvYQvg54DCwK7we9BqkGgwbRBfEEHwSYA1wDNwNWA7QDhgOiAosBWwB2/3X/VwDtAaQD2gR/BawFawWZBCsDaAFg/zX9OfuK+Z74Afl9+ov8sv6TAAkCDAO8A2UEHgWQBXQF0gSnA8ABGf9D/Pr5efi497z3WvhJ+Vn6dfuS/K39wf6V/+j/uP8e/xv+z/xn+wr6B/lj+K73CvfK9qv2Tfan9Tn1i/UU9v71LfVA9MnzovNm8yjzKPOB8+Xz5vOa85Pz3/Pl82rzAvOy8unxuPCt79buEe5b7ebs/uyw7YHuSu+M8C3ySPPL8yf0YPRT9PLzSfOI8rTx8vBe8LrvXe8k8DXxmfGY8nz0PfUa9R32rfdg+Jb4yPhx+Zv6Kfvp+rT6kfoa+q75zfn/+Sj61Pqm+2v8kf1R/gL+rP1W/pP/UACWAEIBWQIvAxQDEwLYAJH/pv7e/rP/FAD5/wgAnABYAfUBhgIPA6EDFgQjBOsDigNHA2EDMQNOAnMBtgG1AqQC9gFhAhIDSgPzA3UEpQNkAhEClgIjAxgD+wIHBGwF/AR1AxwDtgM+BMUEFAUKBRsFOQXhBFkERgQlBN0DXwQKBesEMQQrAy0D8AQEBlUEtwFiAcsChgKyAOYAngNPBT0E8wI6A/8CAAEmAPQBCgMcAaj+n/7H/9H+B/2H/jYB8P+K/T3/3QFxAbcB1AR7Bt0EmgLNAUsCVwHa/ub+fQGBAgICSQP5Bb0GRwUTBFcEwASKAz4CTwT5CCkNshB3FPoXcRmzF4QTWQ3kBND7NvVN8mPykfOX9A73O/tb/mYAhANzBw4LIQ6jD0QOpwpbBmgCuP5B+u30VPCr7QnsQ+uH7W3yePee/D0BswOABFAEagOVAhMCMgFB/4v80vlr9+L1h/UC9kb3Y/mu+0n9B/4t/jf+uv7S//EA4wEFA1EEegWwBhUIPAkuCm8LoQzhDEUMewsxCk0IOwc4B98GiAZMB6EIHApzDIgPuxK+FQwYdhlUGtkZixciFYMTohFSD8wMOQpVCDQHQwbOBWMGwwdfCQMLfAybDUsObQ46DjIOCg4NDUcLNwlFB8AFaATdArMBPAFtAOD+nP0Q/dn88vxU/Q7+F//b/4IAyAFrA5oE+gTGBCsE6gIiATH/Nv1R+4T5ufdf9gb2hfaf93T53vtu/swAnQLsAyUFJQZHBngFLAR1AkIAzv1Z+yL5ivej9jX2ZvZE91X4YvnC+p38iP7o/6gALQFCAVcA3f5y/cH72PlB+MX2RvVj9B709PPG84PzcfP283r0pPTu9ID1BvY39g32qvUO9Vb0hvOz8gjyXPGz8F3wFfCs70bvse7X7UntVe2J7abtL+5Q70XwqvBW8XLyafM/9MX0ffT085fz5vLa8Snx9/AQ8VLxg/HT8bXysfNN9DL1tPYs+GX5rvoN/Cn9wf3x/Qz+K/4E/nX97vyV/D/8FPww/Hj86fxH/Yn9Tf5V/87/hQDcAYQCowJKA84DogOcA8ADewMWA6EC5QFiATwB/QCyAF8ABABBANUADAFWARwC9QJiA44DGATgBEAFNwUHBYMEwAMRA3UCGAL4AUwBFABt/67/EQByADQB6AEuAncC6wK9A/oEfAUMBTwFKQb4BXAEjgPAA1IDQwJqAuUC4gF1AdYCaQP0AnIDDwTkAzcEDQX8BcAGBAblBE0F7wRzAlsBBQNFBIsDNAKxATECPAI5ASABfALOAmcBbABvAHoA4gApAtYDLQW/BB8CAQDZABMD7AOaA3UD5QKhAd4AqwAaAOf/YAEZBDEGBwazBDEFvwaIBsYFHgeDCC4GOgSACN4N/Q/4E4QZKBq/FdoOYAWH+8rz/u6T7530F/mm+9r96v+hAegC3AR4CUwNGQw9CscKcggUAnH9LfyF+q31xu7V6h7sS+5f8L/23/6mAjcEEQY2BXkC4AHfAqoCmQFLAH791/l69qHzlPPy9Rb3/few+rn8C/3D/U3/PwHfAx0GTQfjB0kHoQXMBEwFwAX9BfoGFghgCH0I2AhDCQsK/wpgC4MLDwxbDK8LNAtrDA8PqBFCEyAUChW4FTUV1RPoEmwSOhGED0AO0wzQChMJCAjEB04I8giDCZIK/wsMDY0Nog0sDWQMuwv7CrkJAAg+BrEE/gIBAaj/Tv/2/rf+af/u/1b/D/+a/67/jv/y/yYAJwDv//7+Pv7+/U/9OvwK+8n53vhK+N33Mfg9+RT67fok/Nf86fxL/RD+7v7i/2oAawBMANj/xv4t/VX72Pkk+ef4s/if+LP41fgv+fb5+Pro++j8FP78/jH/oP6f/ab8qftO+s/4lveU9pT1zPRg9BT04PMb9J703fQj9eP1rfZg9/n3CPh+92r2zfQk85/xB/Cx7jHuLu4A7tztUu4n77Dvs++v7xjwzvBw8QDycvJY8o/xlfDJ71fvUO+973jwIfFd8TTx//A38bnxd/K288v0SfWl9b710PVX9gP3kfck+Pz4Dvq9+jr7MvzH/DX8Dvz1/Ev93vzj/Fj9wf0i/qv+wv/0AP4AnABmAVcCJgIpAmgDOASkAxIDoAKcASEBZwFIAWMBaQIPAw4DOgNNA2cD2wPcA7kDWgSFBEUDMwIrAgMCVAHCAJgAyQAGAfsAHQESAh4DPAPyAgMDEQOqAgQCbwE5AVcBPgHYALwAEAFwAYIBTAFPAbABCgI4AqkCnQOEBAAFdgXgBdoFlAVYBRsFvwQ4BKoDVQNPA0gDLQM9AwADgQLTAl4DWQPgAzEFCwbjBZ4FFQZbBsAFPQVcBS0FoQOnATEBpgF0AR0BVwGOAVAB5ADzAA4CpgOABMUEVwX1BfsFzgXlBaoFcAUIBsgFsAPTAm8E4ARRA00CAAJdApMDMQSpBEEHGQwiEQ4VRRgnGmsYhhMFDjwGL/tr86vygPN189z1oPnJ+6D8W/2gAHkGGQoHC4UMiAx9CBMERALMAOv94fkE9UDwb+3z7IDt/e/c9CL5uPv+/Eb9//4OAp4DCwSsBBYEXgBo+zn4w/X+8urx3vJs9HH2dvjK+Yn73P17//IA6gKyBA0GqAb8BcUEHAQxBOMEuQUeBnMG0QaNBhMGpQZZCFIK2gvHDHsNIw6aDj8PVBCeEbISNhNLEwQTZRIWEmIS4hInE74SgBHrD3IOQw2FDBkMvAutC/4LLQzxC6kLyAt1DC4NbA2QDcYNJA1xC4UJwAfiBRsExAJ+Af//kf5S/cz8cv13/j3/0P8BAAAAGQAsAEAAaABDAEv/qv3u+0P6rfhZ9272//UO9lb2qPZi98f4avq9+5v8Jv2E/a39lP0l/XL8hvss+p34ePew9vf1jPW+9WT2GfeL99P3efic+bj6XvuX+637yvvG+2375vpJ+n75kfiU94H2jvUc9Xz1U/ao9lD2cfZZ9+X3zffn9zP4QfhS+If4Ovhq96z27/Ua9VT0dPPW8s7yxvJ/8mvynPLj8lLzBvSK9Jr0g/RR9NvzcfND8zbzNvNC80zzXPNU8//ycfIZ8inybfKc8sbyR/MW9LL0IvWo9f/1GPZ29v32Ufe791H45fif+Wj62vqv+hP6r/ng+Tf6kPpa+2r8V/0d/nn+ev7Z/pz/GQB4ABQBkgG+Ab0BrgGsAbgBxAHaAQgCegIxA6YD1gN+BDgFOwVGBe4FRQYZBv8FxwWuBf8F/QWpBaUFpgVWBS8FVgVdBSgF+gQXBUoFIQW7BHAEjgQYBXsFYwUwBQMFqQR8BJ0ECwTcAvACOAQuBC8D3wPvBFIEdQQRBr8F/AMRBOgE2wRWBO0CCAL5Al8D0gIxAxMD6AB6/6wAyAFuAXsBQALwAoEDOQMAAm8BLQIoAzgDPwIvARgB7gFCApgB/QDyAI8BGQJzAdcAAgGdAB4BNQQ6BokExwKNAz4F4QXQBNcD7QThBk8HkgXUA+sDtgRDBToGbgcoCCgJTgy3EegWqhmwGYAXrRIZCqX/BPi99BD0G/aj+mz9TPw++7T8D/+jAqIHZgq1CdEIAgmhCKgGQQPi/9P90/px9BbuMewQ7jjxD/SL9rf53ftA/KX9HwC4AaQCxQOoBMgDfQAt/Mf4d/Y19OLy4/OH9UD2j/ep+fb6tfwIAH8CkANiBSAHzgaFBQUFagUtBoAGJAYuBm0GggWuBLoFJQe5B+oI2gpPDHYNdg7RDoAPNhGrEiATNRMUE/sSYBO4E7cTDRRaFHwTwhFOENYOIA2EDCgNPA2ODEEMLwz9C3MMtw3+DtwPGBBvD24Odg0gDKQKUQncB/oFMQMTAEn+7/0r/uj+p/9z/7X+ff6//jH/DwAXAXkB1gBQ/1L9RPt5+UL4Efei9fv0+vSW9Ir0kvWa9gr3qPd/+O34+fjv+PP4K/ko+XX4fPev9uz1//TH88LysvJ683b0bvUF9v717/Uq9mn2oPb+9uL3DfmU+Tb5hvje91r3Bve49iz2hvUo9U31uvUg9pH2Sfcd+JD4b/g3+Gz43fjz+K34fvh0+Cr4mfcT98H2i/ZK9uP1iPWA9b/1DPZq9sb21PaQ9kL28fWK9Qv1h/Qn9B/0lPQq9Tr1IPVN9VL1AfWo9EP08PMC9EH0ZfSZ9MT0uvSP9KP0O/Xg9VH2E/fy92T4wvhq+bL5HfmB+LP4Svmj+aH5zPmj+pD7Cfym/Gb9kv3A/Zr+B/+3/jf/VABxAEQA8QBkAS4BdgFCAvYCigOpA6EDhASmBcYFpQUDBigGAwZZBpgGOwZgBgkH6waMBvYGPwcBB0YHygffB/IHEQgMCCsIOQjqB2AHxwZJBu0FYwUNBZoFCAY5BZ4ESwXZBbQFkQWkBQkGXwZYBlcGCAYpBacEpwQJBMwCJAIIAs4BswG4AWABAQH+AAQBPgGcARwBbAA3AVAC/AFFARgBgQDg/9IAVAFG/2z+lgBxAVQAggBLAQEBCgGYAcQBxAEyAUYAegDYAQoDLAMaA2wEuQVfBCIDHAVfBv8EIAa+CbcJMgaeA7MDIAaWB6wGIgfWCYQM5Q82FQUacRsYGgwW3w2LA2H6u/Ph8R/2k/wlAMv/rP0R/eX/OwQNB2IIuAkSCxoLwwgjBYoCIgFR/yn8G/fd8Hzsmew98DH0C/do+b772P2c/kv+SP+0AacDXARdA7cAGf3F+F/0V/GQ8H3xBvPK9Nb2FflM+xH9Z/4qAMsCOwUTBkQFxANVAmoBgwF6AjsDMQOsAv0BmAH7AWIDAQZTCVoMfA6zDw4QdQ/PDqcPAhHTEBcQXxB+EC0QMRH5En0ThhMVFPIT4RL6EWER7hBlEKcPSw9YD9gO+w3SDYUOlw+FENUQChHMET8SSxFTDwcN6Qo7CW4HIwXTAkIByQCNAN//Qf8L/y//5v/RABoB/QAvAS0BUAAK/1r97fpf+B32NfT38kPy4vHL8fnxovKd83L0MvUA9pT21PYP9zz3Cvdd9jz1xvNE8sTwWe+G7qHuXe9b8EDxrfEF8vTyF/TU9E/10fVA9o329/aG9773ZveO9mX1RvRk8/zybPNe9DL17fXQ9rT3h/hV+Qf6h/q0+nn6HPrc+dD5BPpI+hP6Oflz+Fr4nvjW+Nz4zfgZ+Z/5yfm/+fP5J/oD+tX5n/nu+Fj4b/hR+O/3/fcR+LD3bPfT94L4ovgT+Cn3K/bI9YL2Q/cG96n2wvZ29uf1JPbY9jj3c/fL90/4ovgr+JD3EPg4+bX5fflB+Sb5Jvki+dD4gPjX+Ib56PlE+vD6fvvH+yH8vfym/Zj+4v6W/qL+Pv/E//b/LACYAPEADAFIAcwBWwLnAoEDMwQBBX4FOwXaBCsFzgUYBhAGMwaDBt0GhAf6B5AHIQcvB9sGZwbRBl4HVQeTB1wI5QjwCLYIZQhLCHQIgwhECPwHOwi7CKIIVwhVCJwHMgaaBcYFpQVQBccEPgSZBCAFeARVAwADEAPKAvkCgQMZA5wC5AK/Ak8CXQKyASIA6f/uAKgAOP/l/qP/FQBzAKYAev9C/uj/sAKAAn8BHANbBH4DmQOFBHkDZwHoAGQCFQRIA74A2QCqA6QERQNSAu0B8wHnAx0HKQorDosTaBhgGyQbWhaIDk0GGP4G90XzwfLW9A/58fyV/nz/7AFNBeAH+QldDA0OzQ2cCzsINwWBA3MBpf26+NTzg/Av7yzvHPHS9BT5NP0JAE4BiAKKBBsGDwaEBcIEuAHq/Lz4XPV58qTwLfBn8U30nvdW+pD8ev5EAA4CfwN1BOQElASAA/wBlQCH/+/+Hf/S/wEAa/8q////xAFABDsHKwpqDIoNsA2DDZMNrw1wDRcN9wz5DCQNaQ27DYoO+g8sEcERKhJwElIS6hFeEdAQQxDjD84P1w/RD60PVw8jD2QP9A91ELEQjRAdEJQPvg4XDSoLxgl5COUGsQX9BE8E3gP9AxEErAM8A/0C8gIpAwcDVAKRAYIA2v7b/L/65/iT97H2DvZ+9Tj1UfWo9Uz28/YW99n2q/aE9vr1/fTi8+Xy/PH98MDvk+7j7cPtBu5z7sDu++5x7y7w6/Bw8aLxp/HA8RTyWfIO8njxXfF68Rfxa/Av8GLwqvAl8dPxTPLz8in0N/Wl9Q32vvZV92T38PaY9uP2TPct99322fYf97H3Xvjf+FP5ufnz+VT68/p2+9L7O/yM/I78R/zW+3T7YvuC+2L78fq/+vD6J/tg+8H7Kfxe/Db80ftp+y/7Mfse++T65for+2/7i/uS+5z7m/uL+4n7Xfvy+uf6bPvU+wj8JPyd+6j6T/pz+k/6E/oc+nr6Pfvj+/b71/sD/Gj8wPwC/Sj9Ef3c/Mf87Pw//X/9ev1//er9cv67/vr+lf+UAIABBAI8AhkCywERAsQC/wIWA5QDqAM1A5wDlwS0BIME+gSLBeIFDAYbBncG7wYSB0YHwQfYB4kHwQdLCHQIvQg6CQYJtwhbCewJggkVCdgIMgjCB8gHTgdZBsoFZwXUBPIEMAU9BNgDLgXDBT4F2wV3BnkFEQWDBWIEmwKMAv4CAALMAKIAHwBQ/8QA3QIFAVz+zP9RAXkA0gH9BC8FQgOxApkD+gPRASL/rgBiBM8DcgAbAIECTwTABGMEIASDA3sB6wBDBUoLCQ+jEugXFxz9G8UWyw2KA0r6KPPt7r/utvKk+M/9KAEVA3UEJQZ8CHQLuQ6uEF8PRQulBiADUwHT/wv8WvaE8eTuCO7M7srxqfZR/IgBZwTpBPYEVgVpBqEHuwY5A/X+B/sT90Tzx/Dh7wfwvPGH9Qf6q/0qAF8B8gFKA+UELwVoBLED8AJaAd3+evye+778kP55/0D/zv5U/0kBSgT7B8gLQw7IDkwOdw1KDFYLBQsiC4kL4wvaCwEM7gxjDgAQRxGtEZkRfREzEaIQBBCoD6APsA+mD4UPlg/0DzoQBRCiD8EPhRAkER4RtRANENEO1wx0Cn8IgQccB5EG0gVIBQwFDAVeBcUF8QW+BR8FWgR/A1oCHQHl/3/+vfyK+lP4q/bB9aX1DvZF9jH2Yvbs9j/3NvcO99L2O/YF9V7zBfIo8S3w3+6T7Xbsset+6+frnOxr7Tvu1+5p7yDwW/DL7yzvM++J71Tvc+7S7Qjuiu5y7qnt++xR7WvuWO/77/XwdPIA9PX0RPVK9Vv1avVL9Sb1QPVh9XP1p/Xr9Qj2Lvag9mj3fPio+WT6l/rz+u/7C/2S/Xn9VP1p/Vf9xPz1+5T7+/t9/Ej89Ptq/Bj9Zf3E/Vr+q/58/gX+s/23/bL9cP15/fL9Jv7R/Uv9rvwy/Dj8b/xq/Jr8L/1L/Yz8zvuQ+7D7EPxM/Ez8avxL/LH7U/ti+zf79foi+1n7Hfva+vv6TfuN+8f7APwp/EL8W/yx/Cb9Rv1c/Q3+Cf+K/37/gv8lALsAJABY/83/eQCVAGQBdwIyAs4BlwJKA3UDzgNEBIcEwwQ/BZ0FwAVaBgUH3waeBhwHnwd2BzQHqgfXCPEJ1wkGCT8JzQnDCKgHMAhgCHgH/QeeCWkJCwh6B4IGcgWHBtQHoQYyBakFdwaTBsQFOwQGBGQF8QXtBGADagK7AlIDZwPsA4EDywDs/5gCfAMrAQwAxwDpAaQDPQS7AlcBhwE/AzcFGgXoAu4BnQNVBQQFMQP2AB0ALgLvBLwEGgOpBP0JGRARFVEYZhlIGG8U2gw4AmP3J/Bq7oDwzfMo95L6aP5lAhcG9gi6CpMM4A41D/oLGgfOA8oCaQF0/WD4UfXa8wDxle538Jn0RPj0/dYEjwffBoEGswZFB80GAAQKAbT+g/s0+PL1tPPI8YbyDvbt+fP7Pvxm/ToBggXdBs8FZAU5Bg0GfQPi/1n9ZvyN/IX9g/61/s7+6P/GAfUDHQZ+B3QIFwoGDN8M9wtkCgsKNQsgDMAL/gr0Cr8LHw2fDqoPIBB4EPAQPxHZEKQPhg6KDiUPSg8LD94O1g4jD/kPFRHOEQISHRI5EtURuhBDD+ENpQxLC6cJBAioBroFcgXkBcQG2gerCIkIuAfhBhoGRQUiBK0CZQFMALv+XPzQ+fL32vZB9uT1gfVv9c31Nfa19kf3affO9qL1h/SK8/rx3O8r7ljt+ex/7KHreOqd6V/pZelv6arpH+q56ljr5etK7FzsBOzA6xLsoux37Inr8epM6/DrR+xf7Gzs2+zQ7YHuqO7y7s7vB/Ee8szyVfPv85T0OPXy9Z/2C/d69y743fhZ+YX5Yvlt+dr5Tvq7+kH71Ptq/Pz8ef0I/rD+Tf/1/5sA+gAOAdwAZADw/77/jf8d/5f+SP5y/iv/DQCEAJcAyQBeAQACLQLpAYUBTQFIAdAAf/8t/rb91f36/QX+7v3C/db9LP5N/h3+1P23/QP+cv6T/hH+/vxn/Iz8P/yA+3n77vss/Gb8YPwG/CH8u/xt/Qj+FP7F/R3+4v7s/pH++P68/+//t/+E/5//FwBaADYAeABYAfwBHgJxAvwC+QKiAuwC7QPEBN4E3QRJBbYFJgawBqkGiwaVB8oIgwiqB50HHwiWCK8Iwwg/CUEJ4AfEBisIaQmqB+sGvghfCJ8GtQdcCMAFngTfBjAJoQlSCFsHMAj6B00F4QONBRAHigUlAnYBLQQwBOcA/wHJB38JJQXGAYcD1QY7BioD1AMkB0UG7QHa/w4AgQA2AmEE3wRtBFEEGwQHBEQEHgTJA/UD4gR6B+gLChDxEh8WpxgYF6MQAgcy/Dfzde6C7UnvPPMC+Hb8igDjAysG8AfICRgMkw4BDycL0gRvAJr+OvzL+Cr2PfMp70Lt3e5f8efzS/iR/+kGwgn5BxgGXwYjBsgDigHR/7v8wvha9fLyGvKg8unzg/Z3+vD9tv+BAKAB/QPiBjkIOwdaBdYDIQL0/0r+f/15/X/+JwB4AScCfgJLA2sFFQjLCaYKEwvPCjgKFgpeCqIK4Ap0C58MFw4PD0YPaA/wD5oQGhHvEIoPrg3WDKwMNAy8C7IL+wvHDEsOFRA7EYkRzhGsEnwTHRORESMQeQ+BDjgMPAmQBsEE5QOJA2gD+wMzBUYGGgf0B2kIFQhIB5UG6gWKBDsCY/+1/Nb6U/lX9z716fOI84XzZ/Oh8+T0mvYx94n2PPaE9t715fPf8bDwAfDW7v7sOesJ6gXp+uew523oA+ny6Anp8+k+67Lr5eo26szq4evy6/nqP+qI6iTrLuu36n7q7uqg6+fr8+s67MHsfu1f7kPvK/Dp8JTxsfJM9J71VPbe9ov3LPh1+CT4oPex9034zPgF+Tn5wfnA+tz7zPzb/Ub/sgCvATwCeQJzAjcC2QF7AT8BEgHcAM0A7wD8AAEBJAFbAbgBJAJ2AuMCfQPqAxIEDwTLA2QD5AIDAiEBAAEbAYMArv9p/5X/tf+w/9n/NABQAC0AAgCY/+r+Uf7a/ZX9p/12/aD8Cvw7/Hv8bvxL/DX8WvyW/JL8gPyU/Lz8Kf2r/bj9xf3w/Yv9I/1t/dX95v3d/ez9G/5t/rn+Bf+R/y8AbwBXAFEArgBNAYIBTAG1AdECQwO3AqcCtgOjBAIFggULBmwG8QaVB0QIqwhdCAMIvgixCdoIQAc6B6EHVwe1B/gHmQbfBS8HJggHCLEHbAdjCCsKRQqmCH0HjAfEB+IGpgXpBe8FvAOzAkkEugSAA7kDXAWQBrAGkgV0BPQE6wUbBhAGeQWvBJQF1QXDAfr+bAMlBx4DVQBVBc4IiQRI/4//RAQmBwIGOAeNDCMPcw5nESUYgBrdEzoJiAIp/4P3iexG6SPxD/vD/3AA+wCqAhAFKgldDt8P3QsDCIEIRQn2BDz9ZfjZ+PH51/Ze8RPufe5i8pH4Wf4SAiIEvAU1B0EHJwV0AhkBGwEIAeb/Of08+TD2FvbZ9135KPrB+pX76Px4/s7/wgByAY8ChATsBe0EFQIVAJgA1QLQBE4F4QTnBHUFbQWDBKIDfAP4A7wElwVJBnwGQgbKBi8JcAwyDmQOQg8IES8S2BI2E2USAxEuEM8OPgy1CfsHbwcxCFAJSgpRC3AM9Q1WEL0S9hNWFKkUbRQSEx0R9g6JDGgKCAmkB5sFpAOoAtECvwPmBOMFnwYYB1QHKQdYBjsFNAQrAyEC7QAj/7/8Sfpi+OD2PfXk86zzQvQ29CzzxPJ+87/zFfO28rXyOfI+8TrwRu9/7tvtSe3a7BHsN+oN6ODmt+bN5qjmR+Y05uDm6Odg6FfotejQ6Vvr8Oyu7VbtCu2J7djtC+2N623qJupY6nfqiOrZ6uPr0u3f7zPxTvLG8yn1PPZW9zj4kfi0+P/4Zflx+a344fcd+Nr4LvmI+Xj6kfu2/Ef+kf8HAKYAvQFbAm4CdwJcAjQCIgLaAbUB+gELAg4CmgLuAmcC/wFNAqICuQLsAkcDmAPQA/ED+QP5A90DrgPcAyYEygMQA5sCLgKVASIByAAuAIL/Rv+c//b/vf9R/4H/IwBVAOb/cP9O/2f/gv9P/8r+W/4w/iL+I/4K/qn9UP0+/WH9t/3Y/Wf9Yv1v/vb+KP6+/Xr+9P6X/pb+l/9kANX/3f7//pr/K/9R/rz+JwDgAJoAkwBuAacCSQMXA0ADbwR6BXcFEQVDBQwGygYfB9oGJQavBZoFVAX+BDMF1QXGBrcH3AepB+sHAwijB5gHNgjDCMAInAiBCOsHeQctCCgIQAaZBe0GKgZIAwADqgU3BxQGtgTKBX0HPAZYBO0FIwisBjAEqwTXBqkHZAaUBDIEIQViBVEEdwN4A6ID8QOABMAEXQRAA2sCCASTBz0JQAh5CV8PBBXYFX0TihB5DEsGyv4++HL0jPLF8QP0PvkH/pYAQQLaBLQIMgxFDeoL5QkOCC8GngQEA/r/uftJ+F/2vvTz8obykPQh+DT8uwB9BCcF+QIWAVQB3QEyAB/9GfsH+zz8gf34/a39pv0F/9QAswBX/vD7lvsC/ef9Qf2N/Gz8Svwa/fD+1P87AC8CBQV/B/UJlQs7CyAKkAnfCPQGugOJACf/0f82AWUCQgN4BP0GewozDVgO4Q6uD18QmhCzEKEQ2Q+fDsANQg2DDFAL/wlNCbkJtQqdC8IM3g0UDucNOw5BDl0NXAzCC4sLyAv1C5MLNQuUCzcMLgxoC3UKAwmZBk0EyAIqAXr/aP6g/dL8a/yB/Lr83Pzv/Fb9Ff72/Wv8Ffuq+ur5Yfh19mb0pvIr8ZjvGe4j7ZHsHuw07CjtS+707g3v4u7P7pzuoO3+633qkukp6erocOj+5yno1OhT6WbpK+no6OjoD+kK6Rbpguko6rLqJOuW6wjsjOxF7RHuxe5372XwcvE18ljyRfKD8oryxPHt8O7wrPFZ8rTycfMA9cb2O/ij+Tf7nPyL/S7+6P6e/8D/O//A/rf+qf4R/kj9Hv2s/Uv+vv57/7kALwKGA6UEoAV8BvsG7gaPBigGwAVUBfAEjwQ4BDwElQSzBIkEtQRTBbkFfAU7BYQF1gW5BXIFPgX5BG0EuANgA48DlgMgA+sCcgP6A7sD8QJhAkwCDgJJAXkAxf8n//T+Bv/6/gv/bf/N//7/JwCPADABZQEPAeUACgH/AH4A7v8dAJYA4/+2/gP/1/94/yb/9P9yADMAPgCBALgANgG9ATgC1gIkAxcDcAP1A/gDRAQ4BXoFKwWSBbsF0wSXBIYF2wVfBTcFTgVaBcYFhgboBtEGIwcqCJUItgcHB2QHfwcMB2gHfwiSCDQH9gUeBrMGDAbCBK0E7QU3B2MHRAZSBQIGBAeJBrAFqQUgBf0DTQT0BaEGzgUYBakFjwYrBssEDATNA3cDhwQFB+gG4QIVAcME5QbJA7sBvwMnBtsHcQpYDQcPsg6ADZYN+gxACPABn/7A/W/8hPrl+Z771P1U/uf+jAF6A44CNgIhBWQIQAiKBVQEqAX6BUQDBABl/qb9nPxL++b6V/xN/jn/dP8CAKYACAAn/rn8yvyo/QL+uf0s/sr/JAGtAU4CzgJNArEByQFTAdn/uv5A/rL9Vf0v/Yz8xPt5+8f7Bv28/gMAgQHwA2sGIAgGCfwIhAg2CJkHWQb6BO0DVQM8A3oDrQOjA6wDLQQBBZkF0QXwBVYGCAfNB5kIIwlVCdAJYQpSChcKPgpVCksKgAqfCkMKuQksCYUItwe8Br4FGgW6BHAEZQS1BGAFSwYOB3IHwwcqCC4IfQeOBswFBgUABMICjwGNAIz/fP6X/RT9w/wz/KH7gft6+1z7YPtO++D6SPrB+Sn5UPiC9wT3vvZb9pn13/Si9F/0x/Mm85XyBPJU8UnwEu8e7nft0ew87PfrB+wt7Fnsrew27b7tJu5v7qjutu6C7hLuke0U7bLsauwd7LTrc+uT6wDse+z27ITtPu4X7+vvjfDp8Cnxi/H78VTyg/Ki8ubybPMI9Iv06PRE9bz1TPbN9if3gff790L4TPil+GH5yvnN+Vb6g/tP/Jr8M/0u/gf/sf9NAOEAWwFZAfwA8QAeAfIAsQDHAAoBWAG+ARsCkAJVAyUEowQFBZIFBwZGBoYGiAY2Bg0GDgbUBVYF5wTXBPsE7QTcBBUFLAUUBV0FzAXHBZIFkQWpBcAFvAV/BV0FhgW/BdkFuwVvBU0FbQVwBTEF8ATHBLAEpQSSBGoEQgQXBPkDDgQxBB8EAQQtBIIEoQSTBJkEoQSOBIsEkQRnBDoEMgQZBAIEEAT+A78DqQO5A7cDqAOPA20DZQNzA3wDgwOTA7sD9gMOBCkEhAS1BHwEYASCBGsEIQT1A9sDugOSA30DhANwA0QDWgOrA8gDnQOxAxkEKgTQA7ID9AMOBLoDXwN4A8IDkAMEA/ACbgOwA2gDKANSA4YDcANlA6gDzAOXA30DugPbA5wDVgNgA4oDhgNXAzsDSgNuA58D5wMXBAsE7QPeA9sD3gPMA5kDewOcA8ADoANeA0MDXQOIA5oDjQN1A14DUwNbA1EDEgPCArYC5gLoAqICagJpAnkCgwKEAnsCfQKAAmkCTAI9AiwCEgL5AeUB0QG/Aa8BpAGTAX8BdQF0AWQBSgFEAUsBNQH8ANMA1gDSAKEAewCLAJwAgwBsAHEAaABhAHcAdABRAFYAeQBzAEUAMABRAH4AggBVADMARQBZAFAATQBSAEwAVAB4AJUAjQBlADAAFgAlACAA4P+s/8D/9P8ZACUAJQAhACQAOgBQADwACwDq/+b/6f/v//H/6f/w/wAA8//d/9r/1f/O/8j/wP/F/8//xP+v/63/sP+c/37/c/94/3v/fP+B/47/nf+f/4j/X/9B/yv/CP/d/rX+nf6X/oT+Zv5O/jv+MP4c/vb93/3Z/cj9q/2e/aH9lf11/VL9KP0H/ef8t/yL/Gn8Rfwt/A/83vup+3/7Vvsk+/P6z/qd+lr6KfoG+tX5n/l9+WX5PvkR+fb47vjh+M74xPjA+K/4kfh8+HT4U/ga+PL34/fQ97v3rPem96T3o/ea95v3rPfB98331PfV9+L39vcA+AX4GPg2+FD4YviM+MH40vjS+Ov4D/kk+TP5T/l0+ZX5rvnL+fD5G/pF+mr6l/rN+vT6IPtk+6T71vv4+xT8S/yH/JX8nPzP/An9Ov1b/XT9wf0I/vf96/04/pj+rv6k/uH+Vv+4/wAATgC0ACMBggHLARMCbQLFAvYCDAM0A2sDgANnA1MDegPGA9kDygMBBHUE0QQGBTMFcgWyBfYFOAZgBnYGfAZvBpEG3wbxBqQGVwZVBnQGZQY1Bh4GOgZcBlEGMwYxBkoGXAY3BioGcQZ4BigGRga0Bp4GIQb1BR8GMgbyBZcFeQVsBSIF3ATfBOsEywSvBKoEoASLBIIEggSTBNME/gTVBL4E7QQSBdcEUwQwBLEE9ARcBL0DBQSrBKkEIQTqAysEXgQ3BOUD2gMeBBkE6QM0BKYEkgQKBKsD+QNxBD4EdQPwAjYDhAMrA9UCxgKOAn8C5QIIA4MCJgKdAk8DTwOuAmcCBQOmA2gD5QLuAkcDQAPiAvcCbQMrA2MCdAL4ApACnwE2AXgBrgEvAdQAkQF6ApECtwIvBPAFRwZgBp8HSwgXB68FQgXEBEkDSQH//9j/j/9Q/lD9cf3K/eD9wf6iAGcB+v+7/4AC3gOfASEApwHdAmsBJv+//vD/wP+6/dL8eP1J/QL8WPty+zX74vre+qD6evqR+j36GPrL+pz7Gvx7/Mn8TP08/sP+XP7e/dP9kv2o/I77yvpV+v/5tfm6+TP6pvrL+in7D/wA/Xj9pf0d/gD/vf/W/6T/1f89ADMAwv97/4v/rv+6/9j/PgDFACQBWwGcAd0B+AH8AQMC9AHYAeUBKAJ7As8CSAP8A7sEOwV8BcsFNgZuBlYGJgYKBv4FywVtBQkFvQSgBJwEdgQ/BB8ELQRiBIoEkwSmBLsEoARIBOUDmwNMA94CUwLTAY0BXAEfAekAugCbAGsA8P9g/+f+S/55/b78XfwO/I37Ifvq+sD6ifo2+vf54fm2+WL57vhq+Pr3fPfH9gX2WfWc9MrzAvNh8g7yE/Id8hTyQvKe8s/y2PLm8vvy5vK28qnyj/Ia8rHxqPGE8R/xEPFG8Trx//Du8PHw1fCV8FzwZfC08O7wBfFI8bjxLvLF8mjz+vOd9G31MPa19jX3zPdA+KL4/Pgd+Rv5H/ku+VL5ffnD+Ub6+/q9+3D8D/2q/U/+Bv+w/zgAygBlAekBZwLiAjQDcgPTA0EEcwRjBHQEzAQLBTwFsQUiBlAGbwZ8BoQGrgbJBt8GbQcVCFEIrAhyCcIJQQkBCaQJFAqJCRQJPgnRCBoIWAiHCK4HyQaRBtAG7QZ7BgEGWQYrB0IHtwaaBr4GuAa0BsEGPwfwB2oH3gUoBZIFawXdAyYC9gEnA6EDWwILAVsBKwKfAWoAMgC8AAsB5QDjANEBAgMJAycCAwIRA5sDvgLiAdMBJQJ0AjoCagGLAB0AmAB5AVsBQgAcAJYBegLRAacBegLXAi0DjATXBd8FeAXFBZoG3AYQBisFuAQQBGoD1QNiBC0D0QFDA6cFbAXqAyYELAUeBQUF5gVOBuMEOAPQA8gFxQXIA9MDegfZCi8KmgeUB18JTgieBIoDfwVSBn4FPAWVBnQIhwjaBkgFLwRZA/UCBwPIA9AFaAkLDsURjxJdESgQ6g3gCFoCPf2G+hT5L/jK+E37iv2Y/QL9q/1D/kX9I/w+/C79D/+6AVMDNgPbAmMCcADp/AT5Bfav9KL0PfW89sr4C/pF+gr6Gvk69/f0ZvM188/zlfQU9vn4kfxG/40APQGkAfIAEP9P/WH8h/ti+uj5cfqy+gL6JvmD+CP4V/gH+RX6HfxS//ECVwY8CWoLygwyDZcMUQvICT8IGAeaBrAGJQfBB3AIRwn6CdYJ1gjsB8UH2wfiB1gIfQkNC5EMuA2NDv4OKg9dD3cPXg8vD9UOTw65DeQMiQvLCcMHbAX6AtMAJ//8/Wv9kf1P/lv/iACQAf0B+wHvAWUBIQCm/in9f/vV+Wz4Mfff9WD05/K98Z7w++4f7eHrS+v/6tvqCeus62HshOwu7MjrQOtK6kzp6Ogo6bDpWeru6jXr+epB6j/pG+jh5szl+ORi5BbkUuQ05Y7m9udB6Z3qKuyn7dDuze8b8bXyCvTQ9Fv1uvWt9Sz1d/T+8xX0h/Qo9R72bffz+Lz6svxi/oL/OQDUAFQBpgEbAssCpwP6BH0GfgckCOEIgwnMCQgKWApZCh0KEgomCicKFQrhCbkJwgmpCWYJjgkkCtEKrAu5DLwNrg5iD1sPfQ50DXkMCQtVCSYIUwdVBnQFGQUWBTEFcQX2BVcGLAYXBkoGGga2BWYF0ARaBF8E2wN3AjkBagCh/5X+a/3e/OH8ePyw+5T7HvwS/Cn7ifq2+uH6XfqT+XT5XPpy+777p/vr+2T8ofxf/OD74/tt/MH8mPy0/Jz9ov5T////mAAbAcgBYgKgAtICgwO0BLIF2gWfBR4GOQeiB6wHtQjUCaYJ8wkSDIENugxiDEYOLxCTD5UNSw3aDhwPQQ2LDPMNyQ0XC7IJJwt3DBwL4whuCS0MiA20DDwMhA2CDiwNPQtXC6MMRQzKCYIH1wacBl8FggNBAvABmgEfAPj9V/2y/qf/4/+uAN0AHwAjAOsAbAFvAXQBXwKDBDQGnATR/+v8Kv+ZAPz8P/uq/q7/FPwU+6v+mACG/ST6G/yRAJkAPf6CAOYFUghmCFcKaA44EvsTmxP1EdQO2giYAFb5C/Vz8lTwaO++8DH04feA+cn5evv0/e/+hP+fASUEMgVYBQkGlwYeBSoBgfxk+V73pPRM8tTyfPWj97b4dvmt+U/4MPYk9oP3cPcw99L4K/vs/Fr+IQAAAtcCvgJOAyIEQwOHASUBPAGm//f8Q/uk+uT5Avn6+Ev6o/xt/24CxwXmCPcKbgzsDRYPxQ//D2APDg6iDBILQQmxB8IGVwZmBssGNgeCB9cHTggICegJTQovClMKiwqBCuIKwAtJDDAM8AupC50K6Qh8B0cGzwQPAysBa//F/cz7iPmC9+71q/Tm8+3ztvQd9rz30vg2+Uv5FPlO+P32N/Uh8wLxEO8Y7TLryOnD6OPnOeeg5g3me+UL5Sfln+Xk5Tbm7+bn55To4OgT6Rnp6OjR6Mvo4ejo6L3o7ei16Xfqy+rI6sjqvOpv6iXqRurh6tzrGu3X7jLxlPNl9QH3wfhb+qn73vwX/jf/AQCUAB0BbgGFAa8B9wFTAugCjQMNBMEE3AX5Bg8IVwl5ChMLbgvrC30M0AzQDM8MEw11Dc0NCQ72Db4NvA3bDeENmg31DB0MXwvDChEKMgluCAoI7ge0BzQHuAZRBu4F3wUABtsFiQVQBfcE/QOEAkQBRwAp/xf+cP0q/cn8GvzI+zL8mPxm/DX8r/x3/e79C/4C/sH9av02/eD8hvxd/NT7I/s3+9D7CvzY+9X7UPzU/Nz8uvzr/Ev9zf13/g3/fv/h/3UAVwEcArACkgONBDkFGgZTB/AH3wcRCMkILAkHCV4JCQpGCs8KhgtHC8UKMwv3C2kMjgxpDJMMUQ2sDa8NNw7IDp8OjQ4vD2kPAw9dDz8QfRBOEN4Pog4uDbsM2gzkC/wJvQjYCIsJsQjYBfYDzwRiB84IKwepBQcGdgVxBdAIuAqcBlkBvQCYA0sE5v9++0b8eP6R/HL4nPcn+pj6Zvcr9of4Lfh29Db1pPt0/wr9uvqO/YoBWQFk/1AAxgHW/yr93vxY/IH6Mfu7/d/87vlj+jD97f0L/Wb+eQJEBaMETgQqCGgNPQ/hD68TRhj1GF0VpRDlDLkHh//69y/0BfMT84X04/Zs+Cv4cfdq+N/6KP0I/zEBswPSBSwH/AcZCDcHSgX3AaH95flR91D1sPTU9Qj3JveY9jb2D/Zi9Zr06fQv9oX3sfhM+p/8Kf91ARgDBQTxBAgGkwYtBj0FhQTnA2sCCQAN/i79i/xM+0f6zvol/Cb9Fv+qAuEFHgjUCuYNMBDIEdMSHRPSEtIR/Q/XDZkLOQk9B/YFIQV1BHUDcAJsAiwDqwPUA0wEagV+Bv4GXwcGCJQIfwjVB/UG5QWeBEcD1gFfAMb+3/wW+6/5Efiz9dfyQfBB7rLsd+uM6l/q+Opx69Pr0uwn7iDvku+373fvUu7I7Kfr5uou6jLpmOeN5XPjZuGh35HeJd5N3hrfRuCi4Z7jFeZe6EDqvuvl7Ojthu7T7nTvdfAp8YnxB/KQ8qzyfPKC8gHzvPNs9C/1W/bb90f5jfrZ+yT9e/4AAJgBLQPOBIUGOAi+Cf8K+wvIDIMNGA4tDq0N/gxZDLELAwtPCp8JPglmCdYJEwo1CncKuwoOC70LgAzlDC4NsA0LDugNhg0eDTkMswpcCT8IugZJBVMEJgP1AYMBFwEzAGn/pv7b/TT9lPxu/ND8x/xG/Dn8nfyh/DX87vsU/CX8nfvU+lz6Zfpj+qH5t/hu+Gb4Lfjd9+L3nfic+TD6pPqy+zP9a/4s/+r/7QDsAYECAQPzA9ME8QTJBBUFmAW5BasFAQZwBpkG5gamB5QIsAkACxgMoAzxDHgNVg5zD2AQ3hBNEbcR2REJEn8SsRKSEpISfhL+EVYRnxDYD1EPFw+wDjAOHA5QDtUNaQwtC+cK4QqLCkAKPwrmCeYIDQihB9YGoQXrBPwERQWLBP8B2P8EALYACQFFASQAFv6+/Uz/6f9b/tL8QfzU+sX5Kfys/bP5i/YS+VX7f/ko+Jv6x/0G/Q35Cvit+gD7bvkA+w/9Svqh9RH1Uvh4+9388f0OAJgBjwDo/qr/SgInBaMHyAe1BAECtgIZBbMGhgcgCA4IHAcTBogF5wU+BzUJjws5DU8N/QxtDd8O3BG2FQAYFBfeE84PTgoNA/n7P/d99X31sPUC9nP2u/Vj9Of04PZh+Jn5/Po2/Bb98f1c/+UAQgFaAND+WvzU+Gj1ePPC8/f0UfUf9dH0KvQJ81nxUvDn8ATyu/JR8530wPbb+Pn6oP0/AEsCFATFBT4HZAgLCVwJcAm9CHIHNAapBG4CUwCH/+D/YwArAdECqgQhBsEHnwmNCz0OUxFmE2cU6xSZFHsTVRJiEYQQaA/JDUQMLgv4CZkIjAeYBl8FEQTaArQBuwDz/5H/zv/r/xH/8P1+/XT9Iv2X/GP8Z/wR/Fj7ZPoX+V33IfWM8tfvIe176gvoEOaY5FnjVuKJ4d3gd+BM4EPgkeAi4erh9uI35Jnl/uYZ6LLoxujM6PzoIOkR6fPo4ejP6KbouuhT6Tnq+upz6/frv+xw7RLuOO/98OXyuvSu9rb4i/o1/Mr9UP/dADkCPAM0BEgFVgYlB4kHpQeuB68HswerB14HAAcAB0wHsAdKCC0JSgpcCycM1wy7DaIOJQ82Dw4P1w6QDjcOqA2gDHsLlAqNCXcIzQc7B1QGaQXpBJ0EGgR8AxcD4wKJArABrgAXAMX/dP8J/3j+9v2B/cf83Psd+536Ofrk+bH5ovlp+az4qvcM9wL3MvdV92b3lPf891/4n/gs+Tz6Nfuy+yv8EP0L/p7+7/5y/0EAHwHAAU8CNQMhBMAEcAVYBlEHZgiACWcKIAvhC7UMfg0YDqMONA+UD6MPnA+pD6EPVA8sD2sPhw9LD1EPuA8UEDEQLxBCEKkQGxEUEbEQYxAwECoQcBCKEPgP9Q71DRENVwwrDN4LigplCcEI3wZ7BLkDswOWAusAuP8z/w3/qf5j/gH/YP81/uj8Wv0R/9//Zf67/Ej9PP7J/Uz9Jf3A+0r57ff0+Df7WfzL+/P6Svqt+db5A/tq/Iz97v2Z/Hb6R/of/Ef9Rf30/T7/iP8b/8T/egEFAuEA9gBiAzUEVwGS/0sCyQQ8AxgC/QQzCKkIdgjbCMQIRgg2CE4J5Qr9CkAKOgp+CdUH8wfjCVEKTwhABpAFUQXbBGYFEwhdC+IM5wxkDXEOZg7MDKYKRwi/BLv/W/oF9lTzBfIz8Qbwu+4+7pHuVe487Vftp++A8mP0dPXP9tz4WPrS+lP7BPz5+zD7RvpM+VH42/cF+N33BPfA9qv2h/Vr9Pvz/POV9A31PvXa9cD25Pd/+cP78f6LApwFgQiwCwUOHA/wD7AQ0xAqECYPWg6CDQEMNwoRCVcIHAfCBTUFMQUqBYEFYwanB30JxAuMDY0OTw/2D1sQoRDFEOIQBhGtEKwPZA7WDOkK3AjuBhQFHQMCAcj+ifxn+jT49PXz8yfyf/Ad7yLuo+2C7a3tM+7x7r/vaPDK8Pvw9vCj8DDwt+8x72HuGe1j63npjeer5Znjg+Gv3zDeF91p3CXcXdz13PvdbN8Q4cHifeQy5sbnJOmQ6kfsKe7e70Txf/Kk83X0J/Ug9j33IPjF+FP5wfnm+ev5H/qA+uT6Vfvn+5L8Xf1a/pr//ABaAvoDHgZOCDoKSAyRDoIQ/RFeE5EUSBWlFcUVYRWYFAMUoRMfE1ISKhH8DycPYQ5+DcEMOAy1CygLggrsCYgJFQl8CBQI9QfpB70Hcwc4BxAHrgYbBpQF+AQvBEYDTQJpAVkAG/8U/gj9rvst+qz4SvcE9uj0N/Tk86LzY/NX84DztPP+85P0UfXT9SH2n/Ys92j3vveu+LH5QPrB+oT7RPz4/K79Xf4e/9b/ZAD4AJEBHQLJApIDKwSbBHYFnwZdB/wHCgn+CaIKfwuRDG4NOA75Dn0P4w9dENsQXBHKEecRqRF2EXQRbxFXETkR7hCZEHgQQBDDD4cPgQ8vD7QObw78DQoNMQz6C8ML5grqCTEJGQj+BpIGzAURBKACBQJ5AYgAYP+D/lP+Uf4F/ur92f3e/Jf7Wvvi+0386vvk+pf67Pqv+kX6IPpi+Tv4J/gI+WT54fh2+Lv4EPm8+A346/fT+AT6NvqB+VX5FfrK+kT7Vfzb/cT+0v4s//AANwMaBN4DBASvBF4F2AXKBUYFOAXtBfIFzARABP4E8wWRBvYGVgerB9YHaAjFCQkLWwuNC2UM2gxiDI4Mvw3ZDX4M8QuNDJsMBwzgC/ULzwuVC1ILEAunCg0KrgnICM8FnQGe/g/9C/u/96X0cvMz89/xG/DE723wmvBa8HzwEvEG8p3zwvWe9574QflE+k37tfva+278Cf3w/Gn8SPyy/N78Qfx8+/X6R/pa+WP4xveW9yr3pfbB9kj3rfcJ+D/5Sfvy/Gf+jgC+AmYELgYUCFsJCAp6CvUKYgsxC7UKpwqHCpsJSghjB8oG3wXMBCEE6gPpA9MDcwMJA/0CGwP+Ar4CpAK1As4CyAK0AsUC9QIfA0EDWwOCA7UDhQPTAhsCmwEEAQwAwf5I/Zn7rfmr99T1K/SH8uXwY+8D7uPsDexo6/Pqq+p/6orqwer56kPr3uuP7N7s4uwO7VjtlO2q7a3tvu3a7RDuYe537oLuyu4B7/ru6e7U7s3u9e5A747v4e8d8ETwmfA38fvx0/LD8+b0NvZ497T4MfrC+zH9u/5iALMBkgJUAzkEKAXJBRUGdgYAB2MHgweOB6MHvgfTB/EHPAiPCK4IpwioCLIIuwjZCB8JXQlyCYEJqgnHCdEJ9wk+CnoKmQqcCpAKdApKChUK6QnACWIJwQgmCKMHDAdSBoEFsQT0A0EDnwIRAosBGQHCAGIACQDq/97/tP+S/3//Uv8y/zz/TP9f/3X/df9h/0H/If///tD+rv6Z/mf+Ef7D/aP9n/2S/Yj9mP2p/aT9s/3w/Sn+RP6E/vr+Wf+K/97/bQDpAD8BowENAnMC6gJGA4EDyAMZBFgEiQTCBA4FVgWBBYYFjgW0BbYFkAWNBaAFnQWIBVsFNwVLBX0FkAVzBUMFIQUSBfgEwASABFUENgT6A7EDiANwA1IDMQMaAxgDDwPbAooCOALsAa4BewE/AfQApgBcABMAz/+E/zb/EP8H//L+0f62/qP+iv5z/mz+Tv4v/ir+/f3f/RL+R/5i/mr+Yv5y/oL+V/4R/vr9Lf6b/jb/0f8fABgA/v8HADQAZgBuAD8AJQBvAPsAZAGcAQECxwJ+A6IDdgO+A4cEEwUoBUIFjgW3BZ8FmQW9BbUFeQVuBbwFHwZMBooGOgcFCFYIUginCIYJPApQCkkKhgqACi8KCQrjCZsJRwnTCHYIPwj3B8EHxAetBzkHhwb/Be8FwgX2BD0ExwPhAq4B2wBRAJj/m/6x/U39NP3W/In8v/wU/Rb99Pwb/Xf9xf0b/mn+jf7C/gz/Jf8t/2D/hv+S/4D/OP/6/uP+v/6H/k/+LP4A/rT9df1N/ST9+Py4/IL8lfy8/KH8i/y//Pv8H/1L/Y/90f3x/Q7+Q/5p/pn+EP+U/+T/RwC/AOcA4gAgAXoBnAGCAVwBagGIAUsB7gDcAN8AogBJABEA6P/A/7H/p/+F/3z/pv+2/5r/jf+I/3L/Tv8Y/+T+u/51/hz+3P2i/Vn9HP3o/LX8jfxa/Cn8Jfwy/Bz8//sD/Bz8Lfwj/Pv70fvJ+8z7sPuB+277dPtw+1f7RftF+0L7Q/te+3n7afs3+yH7Mvsm++v6xfqx+on6YPpY+lb6SPpT+oT6qvq7+tH67/oP+zD7RPtX+3P7a/tL+2P7mfu0+7f7u/vd+xX8Pvxh/Kb8Bv1k/a393/0V/lT+hf6m/rD+p/6Y/n7+aP5b/jj+Bf7l/cn9n/11/Vb9Nf0T/ff85vzs/AD9/vz1/Az9L/0v/SL9K/1B/Vj9cP2M/bD93/0f/nD+uv4C/2D/uf/4/0UApAD0ADQBbwGjAcoB6wEQAigCMAI/AkgCPQJAAkgCJgIJAhEC9wHKAdoB4wG3AcIB+QEBAgsCOwJlAn4CkwKsAtcC9AIHAzoDWANaA40DugOoA5UDlwOcA5wDkgOIA40DiANtA1wDTAMfA/UC3wKzAmoCOAISAsYBcQEtAdcAeQApANP/ff9C/wz/2f7D/rT+nP6R/or+gv6G/pf+pP6h/qD+qf6q/pv+hf5o/lD+Qv4j/uj9pv1o/TX9CP3D/H38XvxC/Pz7vfuz+6b7dftM+0P7QPs0+yP7Hvsu+zf7Ivsg+0D7TvtF+0f7U/tZ+2H7gPut+9r7Hfxs/J78s/zE/OP8CP0x/WP9iv2P/ZH9rP3E/bv9r/3H/ez9+/32/er96P0C/hn+If5t/tT+6P7p/h3/Z/+7//3/IABNAJMA0ADgANkAAwFVAW8BegHGAfEB2AEIAoACtgKzAtoCPAOhA8UD2AMwBHwEYQRcBMkEOAVLBUcFcgW9BfkFEwYvBnkGzgb7BhoHTwdvB38HtAcDCEAIYQhsCH8Imgi1CMgIzQjLCM4Ixgi1CKEIhQhlCFMIQAglCAoI8gfdB8IHjAdjB3MHgwdKBwAH8AbvBroGaAY3BjgGNwYTBuEFwwWhBW0FSwVRBVQFOQUZBQwFBwX8BOYE1gTNBLgEqgSuBJMEVwQyBDQEMwQaBO4DuwOXA4UDXgMhA/gC6ALVAqYCYwIwAgYC3gG/AZQBdQF0AW8BYgFTAT4BPQFYAWABTAFAAU8BXAFGASgBKwEfAfwA8QDYALMAtQCzAIsAegCOAJAAcwBVAEAAMAAWAOz/zP+1/4D/Ov8G/9f+mv5c/hT+v/2A/V39Mf3y/Lv8o/yi/Jz8g/xx/HD8c/xz/HP8dfx2/GT8Sfw1/CT8FvwG/Of7w/um+5H7dftL+x77B/sF+/n61/q3+q76rPqf+pb6lfqL+n36efqA+pH6lvqP+o/6o/q7+sH6uvrD+tf66Pr4+gr7G/sn+zz7Wvtj+1r7Z/uI+5j7nPug+6z7wvvZ+9371vvX++n7B/wc/CD8Jvw1/Ez8Zfxl/F38ffye/JH8f/yO/Jj8kPyL/In8h/x9/Gf8Xfxk/GT8VfxR/Fb8UfxI/E78Xvxt/IH8nvy+/On8Hf1I/W39nv3b/Rj+Tv56/p/+x/75/ir/RP9P/3H/oP+z/7r/1//4/wgAGwA0AFUAdQCJAKQAywDoAAABKAFZAYUBqgHQAfkBHwI9AmACkALAAuICAAMmA1IDeQOaA7cD1QP2AxYEKAQtBDEEPARNBFMESwRHBEYENQQYBAAE7APRA60DkAN7A1sDLQMHA+oCygKmAngCSgIiAvEBsAF1AUkBFgHMAIUASwALAMX/hf9G/wT/wv6G/lD+Ev7Q/Zr9Yf0c/d38pfxl/C38+vu5+3/7VPsW+9L6qfqB+kf6Fvr4+d35t/mQ+Xf5ZPlJ+UH5Pfkd+QH5//j1+On45vjh+OD46vjo+Of4+PgH+RP5NPlY+W35hvmx+dn5+fkd+kf6cfqj+tT68/oX+1b7hful+8z77/sN/Cj8Pvxg/IP8mfy0/Nn88/wJ/S79Uv1s/Yv9rf3K/ef9Dv47/mj+kP62/ub+HP9H/2T/if+9//L/FwA3AGUAngDIAOYADAE9AXABnAG9AeQBFQJFAnACmwLHAvcCJwNVA4EDrAPSA/gDJQRXBIIEqQTUBAYFOAVlBZAFxQX6BSsGXAaIBqsG1gYOBz4HXQd8B54HwAfhB/gHAggYCDoISwhKCFgIbQh2CHgIgQiECIEIgwiRCJMIgQh7CIEIcAhrCHYIZAhACDoINQggCAgI6QfNB78HnQd4B2YHTAchBwUH9AbZBrIGkQaBBnUGVwY5BikGHwYJBuYFygW/BaYFewVYBT4FIAUABdkErASEBF8ENgQPBOkDyAOsA5YDegNUAzUDJgMUA/kC1gK1Ap8CjQJxAlQCQwI5Ah4C+wHpAeQBzwGqAY8BjAGMAXUBUQFAAUMBOgEZAfkA6wDiAM0AqwCOAHsAZABJADAAFQDt/8D/of+N/27/Ov8P//z+6v7D/pr+e/5h/kj+LP4Q/vz95/3M/bH9nP2S/Xz9Wf1D/S79Ff0G/fT81/zA/LP8p/yZ/I38gvxq/FD8Wfxj/Eb8N/xF/DT8Gvwk/Cf8Bvzw+/H7/Pv5+9r7yfvg+/T76vvW+9b77PsB/AT8BfwT/Cb8M/xB/Ff8bfx2/H38j/yn/Lz8xvzJ/Nf88PwH/Q79C/0V/S39P/1B/Tn9Rv1o/Xb9a/1t/Yf9nf2f/Zr9qf3G/dH9yP3I/d799f31/ev9+v0Q/hL+Ev4o/kD+Sf5P/mT+g/6d/q3+u/7S/vL+E/8n/zf/V/94/4n/mv+3/8//3v/5/xQAIQAuADsATwBoAHEAcwB7AIcAkwCWAJYAqAC5AK8AqgC/AMkAxADMANkA3gDnAO8A8wD8AP8A+QD9AAMB+wDxAOsA5QDlAN8AyQC2ALAAqgCXAHwAaQBYAD4AJQASAPf/0/+z/5D/b/9T/zL/Bv/X/rH+j/5e/ir+Cf7m/az9ef1S/Sb9+fzJ/Jv8fvxa/C78EPz2+9P7sfuU+4D7aftH+y37Jfsc+wL75vrY+tX6x/qx+qX6l/qD+nb6bvpo+mT6WfpO+kv6TPpC+jX6Nfo4+jT6OvpB+jn6NfpH+lf6Wfpc+m76i/qi+qn6tPrP+vD6BfsS+yz7Tvtk+3P7kPu5+9H74Pv9+yD8NPxM/Gn8hfyd/LP8yfzf/P/8Iv0p/Sz9UP1y/Xv9kf2v/cL94v3+/QT+IP5M/mD+av6A/qX+xP7O/t/+E/83/z3/Xf+R/7j/2P/6/yUAWQCFALAA7AAjAUgBdQGyAe0BHQJIAngCswLvAhcDOgN0A60DxAPfAxoEUgRrBHsEoATYBAcFHwUxBVYFhQWrBcwF8QUPBikGTgZ6BpkGtAbVBvYGFwdAB10HcAeKB6oHxAfVB90H9gciCDoIMgg8CF8IbQhhCG0IhwiGCHUIfAiLCIUIcAhkCGsIZwg/CCcIMAgjCO4HzQfTB8IHfwdJB0EHNQf6BrcGmAaVBnoGQAYNBv0F7gXKBaAFfgVhBVYFTQUvBQcF6wTjBNgEsASJBIAEdgRQBCwEFwQEBOoDxAOmA5QDcQNFAykDEQPgAq4CpgKYAlICIgIrAhcC0gGiAZIBhQFtAUABFQEJAfwA3wDHAL4AtgCbAHoAdQB/AG0AUgBRAFAAOwAoACMAIAASAPP/3f/c/87/pv+G/4L/e/9O/xD/9v7//u3+r/54/mj+X/4+/hH+8v3c/bz9lP18/XP9YP06/RX9CP39/Nv8uvyv/Kf8kvxt/Fb8WPxQ/Cv8CfwQ/Cb8Efzl+977+fsA/Ob70/vf++z74/vW+9f72/vf+9771PvX++T75fvc+9n74/vy+/r7+fv5+wL8Gvwr/DD8PfxU/GT8evyZ/Kf8sPzT/Pn8Cf0b/T39YP19/Yz9mP22/dn96f3u/fr9Ff4w/jj+NP5E/mH+bP5o/nH+iv6c/pv+nf6z/sr+zP7I/sv+1/7p/vH+5/7k/vT+Bf8D//7+Av8I/wv/EP8R/xD/GP8g/yL/J/8r/yr/NP9G/1L/UP9Q/2H/df93/3b/iP+b/6H/oP+q/8D/yP+//8P/zv/T/8//xP/H/9L/zf/C/8X/zP/E/7j/t/+9/8D/u/+y/67/tP+1/6//p/+i/5z/k/+O/4j/ef9q/2T/YP9R/zz/Mv8r/xf/Af/1/uj+0v6//rH+nv6H/nH+Xf5L/jf+IP4J/vj95/3H/af9lv2A/V/9R/0u/Qr98fzd/Lr8m/yE/G/8Vvwx/A78+vvn+8z7sfuZ+4j7fPtp+1T7SftE+z37Mvst+zn7Qvs6+zT7R/tf+2P7Yfty+4f7kvuc+637vfvO+9v74vvu+wT8FPwc/Cr8N/xG/F/8cfx3/IT8n/y6/Mz82vzx/An9Gf0t/Uz9bv2G/Zf9tP3e/f79E/4v/k/+bP6G/qP+y/72/g7/H/9E/3D/jv+o/8//+P8XADUAWwCFAKwAywDjAAMBLgFVAXUBkwGxAcwB5gEFAiwCTAJgAngCnwLGAuEC8wISA0cDdwOCA4QDrwP6AyEEHwQwBG4ErgTJBM8E7AQkBVEFWAVhBZkFzwXRBdUF/gUqBkAGPwZIBnAGkgaVBpYGrAbGBtIG0gbgBvsGBgcBBwgHGwcrBykHJAcuB0AHQgc6BzwHQwdCB0QHSwdFBzAHNAdFBzwHHgcVBxkHFAcHB/kG6wbhBskGpAaSBpYGkwZ6Bk8GLwYjBhEG5QW5BZwFhAVqBUoFHgX1BNsExgShBGwEPwQtBCMEBATHA40DhAOQA3UDSgMrAxED9QLcAswCtwKSAnICWAJFAjsCJwICAtsBxAHTAd4BowFTAVUBbgFCAQsBCAEFAdgAsgDCAMsAmwBKAA4AIwBXADkA7v/K/7v/uv/V/7j/UP8y/4L/l/82/wb/RP9d/yL/7/7m/gr/F/+9/mr+lP7T/qr+Q/4X/kH+Uf4C/tH93/3C/Zn9j/1m/TX9Lf0d/ej8ufyX/Hb8XPw7/Bv8D/wE/On7yvus+5z7q/up+3b7UPtx+5/7f/tE+1X7ivuT+3f7bfuM+6b7lPuG+6H7vvu2+6n7vvvs+wX8/Pv2+wf8JPw+/EX8S/xk/Hz8f/x6/Ir8sPzH/Mr8z/zh/Pv8Ev0f/TD9Rv1b/XH9h/2X/a39y/3b/eD9+P0m/k3+Xf5o/oL+qf7R/uv+9f4D/yP/Rf9S/1r/bv+L/6X/tP+8/8b/0P/T/9f/5f/s/+X/6P/y//L/8P/v/+v/6//u/+n/4f/n//b/8v/d/9X/4//w//D/5P/Y/9P/0//a/+b/5f/U/8P/uf/A/9H/zf+7/7b/rv+f/53/mv9//2L/Xv9q/2r/Tv8w/zH/NP8Y//r++v4E//T+1f7I/sD+sP6h/pT+j/6T/oX+ZP5d/mX+XP5U/kb+Nf43/jD+JP4Q/vn9Cf79/fb9JP7s/Z790v0E/uj9x/2//bf9qP3Z/QL+Xf2W/A/93v3N/f/9of4Z/vT8Hf0l/jH+Bv1D/Cv9k/5f/gz9vfx7/cz9av3n/Kn8Bf2l/a/9Jf3o/Df9ev12/V39O/1A/XT9jP2G/Zb9pv2s/b79x/28/cr99f0P/hX+K/5Q/m3+fP6B/pD+vv7q/v3+HP87/zP/Lv9T/4T/mP+Z/6P/uv/Y/+//7P/Z/9v/9/8XAEgAawBSADQATwCLAK0AjQBkAJ0AGQFKAR0BGgFXAW8BegG1Ad0B5wElAlwCOQIsAnsCswKcApMC1AIYAxMD8AL6AicDRANNA1gDVwNEAz4DTQNsA4cDggNyA2UDVQNrA44DegNDAz0DkwPnA7cDTwNMA5IDuwPMA78DmgO2Ax0ETQT/A64D6QNzBMMEmwQnBA0EbASkBIoEZgRkBIAEjQR3BGAEUwRVBHUEgQRcBEIEKgQJBP8D5QPeAw8EGATaA50DqQPGA4wDcgPHA8gDVANDA2wDOgMPA+wCqQLzAtADPwS7A9MCPAIJAlkCLwNAA7YBogB1Af8BDQGPAF4BFQLRAR0B/ACfAQoC1AHoAXMCngKCAp0CoQKPAgIDiQNiAwkDCwMdAyADFwMJAyoDUwM9AwcD7QLZAnkCGQIiAigCzwFZARgBFQHmAGcAGgAVAOD/gv9R/zP/B//d/qf+TP7p/cL92f3U/Zj9Tf0Y/Rf9LP0b/e/81fzZ/Oj87vzm/OD88fwS/Rv9A/3b/Kv8hPx4/Hr8avw7/Ab86Pvf+8P7ivtZ+0j7N/sU++v6x/qw+pb6aPo9+i76Qvpm+nv6afpK+kj6cfqx+un6KvuD+8b75fsE/EP8p/wR/WL9nv3M/f39Ov59/sn+H/9o/5P/tf/m/xMAMwBrAL8A8gDzAO4A8AD1AAcBGQEqAT4BRAE/ATsBMAEiASYBNQE6ATIBKwE3AUUBPQE4AUsBWwFVAUMBPQFJAVcBXwFiAWIBZwGBAZ0BogGkAbUBxgHQAeIB9wH/Af4B9wHkAdIBzAHCAbEBoAGSAXoBSwEMAd4AzQC4AIIARQAeAPr/zf+t/53/if9g/yn/+P7Z/sf+uP6o/pb+g/53/nb+dv5w/m3+dv6C/or+jf6O/pb+oP6f/pX+lP6i/qv+o/6N/n3+e/6A/n7+av5K/jX+LP4c/gP+7f3Z/cP9rP2X/Xr9XP1I/Tn9I/0D/eH8zfzK/M78zfzC/Lb8tPyx/Kj8qPyz/LT8pfyX/Jr8rfy8/L78xvza/O389vz5/Pb88fz2/A39L/1K/Vn9ZP1p/XD9eP1z/WX9bP2I/aL9o/2S/Y79nP2p/bb9zP3l/fP9/P0I/hz+LP4q/iL+Ov5k/nv+g/6R/qr+1f4E/xv/Hv81/23/nf+v/8z/CwAyADAAPQBgAHkAlACuALgA3AAcAT8BRwFSAWUBfAGKAZEBsQHuASkCQgIrAv8B/wE4Al8CWwJoAooClQKSApUCoAK0AscC1gLkAtUCpQKWAsYCGQM2A98ChwKTAq0CvAL+Ai8DDwPtAuECzALTAgIDNwNOAy0DAQMAAxkDKQMlA/wC3QIBAyMDBgP3AiIDUANXA0UDNgNAA0oDSQNkA4YDdgNaA1oDVQNEA0wDTQM6A18DtgPQA6EDaANOA2QDeANWAy4DMgMxAwwD7QLTAqoCpwLmAu4CbQL0AQICNwJLAmYCTALTAWoBPwFYAcUBIQIlAt8BQgGMACQADgAXABoADwAjAGgAiABvAIsA9wBNAWEBagGNAcsBGQKJAiUDugMHBCEEOQRWBIgE9wSDBe4FPAZvBm4GTQYmBhEGIAYdBsYFPwXJBFcExQMmA4oC4AEtAZgACABO/6b+Nf6o/eb8Ifxb+5H65vlY+dL4aPgJ+Jb3JvfW9pz2cvZK9jj2RvY19hj2VPak9rX2yPbv9u726/Yg93334Pch+DL4R/hn+Hn4ovj8+E75hPmm+cL59/lB+m36evqJ+qz60frx+iP7dfvh+2H83fxO/cz9VP7N/kH/zv90ABUBrAFNAvYCngNHBNkESwXIBVwG+AaYByAIigjqCEEJmwnzCS0KQwpOCkUKIwr5CcYJfAkuCdQIWgjWB2MH7gZvBucFUgW3BCEEiQPZAg4CVwHJADMAh//7/oz+Dv6Z/T/93vx3/DH8Bvzh+737oPuf+7P7qfuJ+4T7mvur+7r7zPvf+/z7Hvw2/FD8dfyU/Kj8ufzV/P/8HP0m/Sv9LP01/Uf9TP09/S/9Ov1S/WD9a/2K/a79zP31/Rf+Lv5Y/pH+zP4F/zH/Zf+y/wUAUQCbAN0AGAFXAZ0B6QEvAmICmgLpAiwDQAMxAyADHQMZAwADzwKEAjAC+gHLAXMBAAGQAB4AqP89/9z+aP7o/WP9xfwl/Jz7G/un+kT64vmM+UP5/vjB+Jn4efhR+Db4PfhV+Hf4o/jN+Pb4Kflq+bf5+/ku+lr6qfo9+/f7kPze/N/81PwR/Z39Pf7D/gr/Cf/v/vf+Lv+B/8v/7//w/+P/2//v/ycAbgChAK4ArAC0AMEA1AD3AC4BgAHMAfMBBQIfAlICoALsAisDcQPBAwEEJwQ5BE8EbgSNBLUE1QTNBLgEmwRsBEsEOwQVBNYDhgMmA9ECkAJFAuoBiwExAdsAgQApANH/b/8i/+/+tf5+/l7+P/4k/hn+D/4Z/kj+df6I/pH+qP7Z/hL/TP+X/8b/vf/X/zsAlgDWABcBOQE8AUYBbwHFASoCTgIyAiECHgIbAlMCuQLQAqECrALbAucCFQNcA2YDdAPXAy4ESgRYBF0EkwQVBW0FlgXhBRkG+AXqBU8GvAbRBsMGrgacBsEG6QanBjMG+AXhBb4FfwUdBboEWwTVA1MDHgP6ApUCBQJ5AQQBsQBGALn/lv/E/4D/1P4z/tr9/P1q/sD+z/6V/i/+xv2n/U/+b//Q/2b/Jv8N/xb/z//LADgBKwHdAH0ApQBLAe4BagJxAtsBSgFGAZoB3wH9AegBoQFUAfQAcAAbABMACgDl/7z/e/8s//3+/f4w/4T/qv95/xr/6/4p/6j/EQBRAHIAdQB1AJQA3gBSAcMBCQI0AmUClAKXAn8CigKdAoUCeQKHAk0C3QGNASgBlQBRADgAo//e/mT+Bf6z/WP95/xn/PL7Ufuo+jz6D/oP+ub5aPkR+ff4v/iZ+L/49vge+UH5T/lX+YH5yPkm+pn63frk+gn7W/u8+zP8mvzk/C79bf2V/cD9Af5N/oz+v/7p/gH/Cf8Q/x7/Ov9h/33/gf9l/0H/YP+m/8H/5v8sAE0AVQB1AJoAwQD+ADsBdAG+AQECOQKAAssC9gIVA04DlgPUAxAENQQ4BEUEawRzBFkERAQsBAME3gPCA58DYgMCA4gCDgKsAWsBIwGpACcAvv9I/87+eP4s/sX9T/3d/H78QvwR/OT70PvD+6D7fvtp+2L7e/uu++z7N/x4/J38wvwF/Vn9sP0K/mz+1f41/4H/xf8NAGEAuQAIAUgBdwGcAb0B1QH3ASkCSAJAAiMCAQLrAecB3QHCAakBjgFpAUMBIgEKAfgA3wC+AKAAigB8AG4AXgBfAHEAewB3AGgAVQBTAGYAeAB/AHgAaABXAEQAKwAXAAMA5v/A/4f/Qf8I/9b+lf5C/u39nP1N/f38p/xT/AH8rvth+yX76vqo+mj6MvoQ+v757/nq+fL5EPoz+k36cfqj+uP6NfuH+9/7Sfy1/CX9mv0E/mz+3/5H/6X/FACCANoAJgFwAbwBAAI2AmMCgAKdArsCxQLBAsACvgKsAoMCYAI9AgACwgGaAWsBOQEVAecAqwBvACkA7//X/8b/sf+f/3//VP82/yv/J/8l/yT/Jf8h/x3/I/8x/0X/YP9s/2z/cf+B/5X/pP+h/5T/jP+F/4P/hf91/2T/YP9O/zb/Mv80/y7/KP8o/yf/JP8h/yP/Of9b/3H/gf+d/8f/AQBFAIYAxgALAUsBiAHOAR0CcALBAgkDSQODA7oD9gM5BHoEtwTlBAYFJAVGBWgFgAWHBYkFhwV7BWwFWQVBBTAFGQXxBMEEjwReBDcEDwTfA6sDeANEAw4D4QK/ApsCZwIsAvkB2AHHAasBfgFUATgBIQEJAeYAvACkAKEAmQCAAFgAKQABAOv/7P/v/9n/sP+K/3f/bf9a/0X/Rv9b/23/Wf8c//H+/f4p/1v/hP+C/1n/Tf9x/57/1/8SABsADwAqAFEAXgBzAKsA/QA+AVEBSQEcARQBoAEUAuwB0AHVAYkBVwGVAc4B4AHeAZ8BXAFRAVUBXwF8AX0BSQHXAE8ASwCwAMYAtgCyADwAlv+W/xoAjACgABgAbv9d/6L/y//l/9v/j/9O/z3/NP9J/3v/c/8L/5/+e/5t/lL+Lf7q/cj9Bv5e/pD+k/5W/gv+Ef5O/nz+u/4d/1L/N/8F//7+SP/W/08AdgCDAJoAmwCTALUAAQFUAXcBLwGwAG0AaABuAHgAegBRAN7/NP+N/iP+Gf45/iH+vv08/bT8SPwN/N/7pfts+x37v/qW+qH6kvpo+lL6UPpX+nn6ovq7+tP69Poc+1P7k/vU+wX8J/xh/Lz8Ff1o/b/9Bf4t/mj+zP4Q/zX/b/+X/7j//f85AFwAfgCVAJ8AqACuAMoA7gD0ABoBSAEsATABeAGIAXkBnAHDAdUB6AHjAeUBHgJQAmcClgLFAr0CqwLLAv8CKQNLA0UDEwPzAvkC6gLPAskCsAKAAk0CCgLPAaIBZwEoAfUAtwBtABYAo/9O/zb/F//d/qX+Y/4L/rn9j/2Q/aH9pP2Q/X79e/19/Yj9pv3W/Qj+J/5A/nb+v/7z/hv/Vf+R/8z/DgBNAJYA7QA7AXoBrQHXAQUCPwJ+ArsC4gLiAtcC5wILAzYDWQNPAxcD5QLOAtcC9AIBA+cCpAJKAvcBvQGhAZYBcwEqAd8AogBdACAAAQDu/9H/oP9h/yr/Bf/Z/qP+fP5f/i7+/f3h/bv9i/2D/Xv9QP0Y/Rj99vy//Kf8ivxj/FP8P/w0/Ez8U/w5/Cj8KPw4/Fz8gvyU/J/8t/zg/CT9gf3h/Tj+jP7S/gz/Wv+//yEAewDKABEBXwG6AR8CegK3AugCDwMxA2cDowPNA9cDtwOKA3QDaQNWAzcDAwPGAogCOALdAYUBHwGzAE0A8P+V/zf/5P6K/if+8f3T/Z/9Zv0r/er8vPyq/Lj84vwW/T39R/09/VD9l/32/Vb+qP7c/vz+H/9S/53/7f8tAFwAhgCzAOIABQETAR0BKgEtATcBTwFMASYBFwEzAUYBTwFnAW4BZQFsAXQBegGaAc0B+gEqAmEClAKvAsACAgNnA7MDAgRZBHgEbgR7BJIEtQTqBP4E9gTyBM4EkQRrBEcECgTJA44DOAPAAkgC4QGAASEBwwBZAPH/kP8e/7b+cf4q/uH9oP1c/Sn9Gf0L/eT8zfzp/Bf9Pv1r/Zf9u/3s/Sb+Wf6j/vz+Pv93/7v/+P8wAG8AqADfACcBbgGKAYUBhwGbAbMByAHWAdQBvgGdAXsBXQFQAUoBNQEWAesAtwCIAGAARwA7ACAA9//U/7j/sv/O/9H/m/9i/0n/WP9+/5f/nf+d/5j/kv+L/4b/l/+v/6b/lv+e/5//k/+W/5r/j/+H/4L/ev9z/13/Of8d/xH/DP8H///+7P7E/o/+b/6I/rz+0f6//p/+fP5w/nr+hf6c/rX+v/7A/r/+yf7n/gf/FP8G//3+DP8V/xn/KP8t/yX/Lv89/zv/O/85/zD/Nv87/zb/Ov9F/0z/Pv8n/xz/G/8v/1L/Yv9g/1n/TP9B/0b/Vf9l/2z/aP9d/1v/Zv95/43/n/+g/5X/k/+T/4r/iv+W/6P/sP+1/6n/m/+a/5//pf+u/7n/xP/K/8n/yf/M/9b/6v/9/wsAGgAwAEEASgBXAGwAhAChALQAtQC5AMcA2gD0AA8BGAEWARkBGgESAQsBDgEPAQEB+gD2AOMA0gDCAKQAigB4AGMAUAA4AA4A7//g/8z/vP+m/4z/hP96/2j/ZP9o/2v/bv9y/37/jv+X/5v/pv+//+L/BAAiADsASABZAHIAhACaALwA1gDoAPwABgEIAQ0BFQEfASoBKQEbAQ8BDgEQAQYB9ADkAM8AvACvAJkAgQB2AHEAaABfAFEAOAAhABIADgAWABsAEwANAAwABgD7//X/7//q/+j/5P/d/9r/0v/B/7P/q/+e/43/ev9o/1b/Qv8u/xj//v7r/tb+u/6r/p3+hv52/mf+V/5J/jj+Lf4s/i/+NP44/j3+S/5e/nX+kP6q/sD+3P79/iH/RP9a/3H/jv+r/9T//v8ZADIAQwBQAGgAfgCIAJMAnwCbAI4AkACXAIwAggCJAH4AWwBEADcAKAAiABIA9f/i/9T/v/+v/6j/of+a/47/g/+F/4f/hv+N/47/i/+R/5z/pf+v/7T/tv/A/8X/xv/J/8z/zv/K/8L/w//H/8X/vP+x/6j/o/+g/5v/lP+L/4H/dP9i/1n/W/9c/1z/Xf9d/2f/df98/4v/sP/V/+n///8lAE4AeQCjAMMA6AAZAUkBdgGcAbMBzAH2ARwCNAJNAmICagJsAnYCeAJoAmgCZwJIAjMCGgLrAdIBwwGnAYgBZAE1AfIAxQDGALAAhgCGAHYALAAJAAQA1f/K/wEAQwCMALYAbwDa/4X/w/9JAKwA+gARAXgA6v9JANEADQFeAXMBHgHVAMYA6ABDAYUBXgE9AVMB9wBTAEkAzQBlAcMBcQGQAPv//v9HAKsA1gCVAEAAIAAnADoAVgB3AHIAfwDGAMoAjwCEAKQA4QApATUBCAH1AB4BTQFiAX8BpAHAAcgBpgF1AYIBqQGIAU0BRwFdAXEBVwH7ALkA0wD5APIAzACYAH0AdwBKAAgA3//r//7/u/9c/zX/Nf9T/0//Bv/B/oz+QP7L/Vv9XP3d/Xj+0/7I/nb+Q/5r/tD+S/+w/+L/CgA6AHUAtgDfABcBhwHoASMCfALOAuQC6ALfAscC0ALHAooCOwLkAZ0BYQEdAc0AXADY/1n/tP7d/SX9sfxm/Cv8xfsV+2D6y/lM+eP4rPin+If4QvgX+Oz3xvfz91j4nPjU+EH5q/ng+UP63vpp+/T7WPyQ/Av9uv1V/vH+l/8vALAAFQFpAb4BFwJuAr0C7AL8AvsC9QL6AvoC9AL2AuUCwAKOAkoCGgL6AcYBkAFhASkB9gDUAK8AegBdAGYAZQBNAEMATwBtAJ4AxwDaAPUAGQE0AUoBXAFzAYYBjAGkAcoB0QHAAacBhgFtAWwBbgFaATIB/gC+AG4AEACw/13/G//n/rr+hv5R/iT+8P22/Zn9kf1+/Wr9Zv15/bD98v0n/lj+if7J/h7/fv/w/3UA6wBVAdEBTAKvAiEDqQMlBJ8EHwWOBesFMgZZBm4GegZ9Bn8GhAZ/BlsGEwa2BVgFAgWpBEMEzQM3A3wCrgHsAD8ArP8p/6H+A/5U/aL8BfyD+xj7xvqL+lL6DfrM+Z/5ifmS+a75xfnk+Rv6ZPq9+hz7dvvY+0L8r/wT/Wr9x/0t/pf+Cv92/8r/CwA8AFsAdwCeAM8A/wApAUoBTwEyAQcB3wDAAMAAywDAAKkAkwB+AGUASgBDAEUARQBGADcAKgAxADwASwBhAF4AQgA6AEcAUgBkAIIAlwCaAJQAgQBZADQAJAAYAA8AAADV/5j/Wf8W/9n+p/5y/jP+6/2V/Ub9/vyq/GH8N/wQ/OD7uvuX+3f7bvt3+4j7o/vE++T7FPxS/Jr89fxc/cr9Pf6k/g7/gf/r/14A0AA9AbYBIwJ8AtUCKAOHA+kDMARmBJgExgTxBBIFIgUnBSIFEwUIBfUE0QSjBGgEMgQCBLkDZAMIA6wCZQIhAs4BdQEaAc4AhwBFABMA3/+e/13/JP/+/uv+1f65/qH+jf59/nf+gv6Z/sL+9v4T/xb/I/9T/6f/DgBoAJsAtADQAAYBVwGuAfwBNQJSAl4CaAJ/AqsC4gIMAxsDGAMVAwYD5gLWAuECzwKjAoUCVAIUAgECBgLtAa4BaAEyASMBTwF+AUkBxAB3AHoAjgDJAA8B+wC0ALMA1gDqAP0A/wAgAWoBcQE2ARQBHQE6AWABhgF9AUsBMwEtATABYAGNAXQBPAH5ALQAvADtAMYAbQAyAPn/yP/E/7r/bv9G/6P/7/+f/0n/Z/+I/7L/EQAAAI//Yv9O/y7/U//N/2oA7gANAaEAyP85//T/UQHXAbMBNQELAAb/RP9rAHYBtwHhAJz/9P4D/1z/zP/r/z7/9v21/Pr7GvwI/Tj+BP8Q/2j+hv0r/cH99/4ZAIEAFwBn/xf/b/9UAGIBMgKKApQCqwLkAj0DjgOcA54DjgMKA1oC4wGCASYB1QBtAOH/ZP/y/jD+Gv0u/Hz7qPrr+Zz5QvmJ+Ln33/b09WT1XvWR9a71jPUp9fD0KfWV9TD2Gvfr92T4tPgE+Yr5X/pW+zz8AP3C/YD+L//y/8gAoQGWAosDRwTEBA8FMAU1BSYFGQUuBUYFSgVDBSQF8gTFBKEEhQRVBPcDcwPbAkkCzwFsASUB4gCMADgAAwDg/83/xv+s/4n/h/+g/6v/n/+c/7P/2P/9/xIAFgAgADUAVgCBAJgAjgB5AGkAaABxAHMAbgBpAGoAYABAAAwAsv88/9j+lf54/n3+if6E/n3+kf6y/rf+sf6x/pn+g/61/g7/UP+c//r/VgDNAGAB8wF8AvwCfQMDBIkECQV6BdAFJAaOBu4GNAd/B9QHGAg5CDEIBAjBB2MH8waNBigGoAUMBYwE/wNHA3sCoAGhAJr/rf7O/fT8LPxj+5P62fk4+br4avgU+KD3Nvfn9qb2ePZz9pz24vY/95v36PdI+Nf4iflP+g37t/tO/OL8fP0b/sP+c/8TAKkAQAHQAVwCzAIVA1IDewOHA5IDmgOAA1YDMwMSA/cC1AKaAlAC9AGKASgB3ACYAEIA6f+u/4T/Zf9L/xX/wv5z/jX+Gv4x/lr+Zv5I/gH+v/2u/cf96/0M/iz+PP4n/gH+6f3f/dv91/3I/bL9nf2C/Wb9Wf1W/Ur9MP0H/cz8nvyF/Gv8VvxW/GD8bPyB/Kr82fwB/TD9af2u/RT+if7e/h3/cv/d/0oAvQBBAcsBOwKsAjMDoQMJBIsE3gTpBPQEFAUtBVYFjAW0BcYFtQWDBVoFSgU+BRIFuwRlBC8E3wNnAwUDugJdAv0BqQFdARQBvQBZABIA7v/H/4r/Rv8N/+H+yP66/pf+jv7P/vf+zP6i/qn+0/4W/1n/jf/Q/ygAeAC9APIA/wAPAVUBqgHqAS4CaQKLAsUCLwN0A2ADUgOAA+MDegS8BFsE6APOAxIEiAS3BFIEtgOLA/EDWgReBCQEuwNJA2UDtANlA/kC5ALPArwCrAI3Al4B5ABGAdMB+QEqAj8CTQEgABgAfAClACIBcAGvAJr/Ev8M/3z/KwCyAAcB8gAIANL+hf6C/+gAcQGvAIT/1v6M/rD+of+mANoASgAz/z/+NP7H/gn/ef54/eP8Nv1L/p7/iADFAJwAXAAuAGQAJQErAggDaAM6A+UC7AKBA48ErgVQBk4G/gXOBeQFFAYPBoQFbwQlA/YBQgEwASABgwBZ/8/9Qvwo+3n6z/n1+PH3vfZl9TT0hPM38/bymfLl8ezwVfBi8MzwXfEH8qPyEvN18xP0CfVQ9pb3kfhd+Rr65Prd++/8Kv6I/7sArQGQAn4DegR2BU0G4wY7B2EHXgc9BwgH0QaoBpcGlAaCBl8GIAazBTgFugQXBFcDnQL1AV4B5gCBAAcAhP8w/xP/B//9/ur+tf5r/lL+df6N/pX+tv7A/o7+Y/5h/nr+vP79/hv/Lv8c/9n+oP6I/on+o/7G/sj+mf5V/h3++v3e/bL9Zf0P/d/85fwW/Wf9sv3o/RD+MP5Y/pn+5f4v/3r/yf8lAJUAEgGUASoC1AJ+Ax8EvwRhBQQGngYcB24HoAfNBwgIVgisCOwI/gjkCL0IlwhjCBQIsQc3B50G6wUlBUUEYgOMAqoBsgCu/6X+n/2f/LT71Prj+f34QPiV9xL32/a59m32APaW9UL1IvVH9ZD15/VV9sz2R/fV9434cPlX+jr7Lfz3/Hz9BP6s/kj/0/9VAMcAPQG2ASICjwL0AjoDZQN7A3QDUQMhA+4CxQKZAksC0gFBAb0AUQD7/8P/nf9//2r/S/8T/9L+kf5U/i3+FP72/dX9sP2V/Y/9i/2S/bD92P0N/kD+Wf5h/k/+Jf4E/vz9Af4N/gb+5f3K/bj9sf3B/bz9j/1c/Sn99PzN/MD8wvy+/LX8svy6/Mf84fwA/SP9Wv2M/a794v0z/p3+Ev95/9z/VgDmAGwB1QEsAnkCuwIEA2MDvgMIBFEEhgSRBJ8E0wQABQ0FFQUDBbIESQT4A8UDpwOHA0kD+gK3AnoCOAL5Ac8BuQGRAVQBLwETAdYAvwAFAToBKgEnATkBWAGjAeAB5AHiAfIBFwJLAnQCkgLBAgMDMAMtAxADBwMjA1kDkQOKAzIDyAKPAqgCCwNkA24DKQPGAoICkwLiAisDSwM7A/wCvgLNAjADlwPdAxMESgSGBJYERATmAwMEiATtBLkE4QMgA2UDZgTeBFIESQNOAvUB1wIuBFkEIQN7ATwAHAABAcwBzgEsAToAgv9N/z//Vv/R/3kA/QDzAEcArf+y/ywAxgA5AVkBPAHpAIAAmwA1AZIBZwEdATEBfQFTAWAAIf+T/kL/kABgAZQBwwEfArUCYQO8A9MD/QN7BGAFSgafBlcG0wXUBUYHLwnCCVIJuQgBCLMHHQhyCAoI5QYtBXIDTQKJAcwAIgBn/13+Gf2o++75FviI9pf1OPXQ9LDz+vGE8Nvvuu+M7xTvkO5M7mvu1+5w7ynwBfHz8dPypvOX9J/1nfaN94b4tfkl+4j8x/3+/iMAGgHzAeICBAQ9BW4GWwebBz4H4AaUBjQGNQarBvQG7AbMBnUG5AVHBZcE8wOCA/0COAJxAbcA/P9//03/G//K/mv+BP6y/ab90v32/fH9yv2T/Wb9WP1a/U39RP1U/YH9xP3Z/ZT9Lv3p/OP8AP3//Nz8zPzL/LT8iPxQ/Pf7lPte+1n7XftX+0H7GfsU+4n7XvwG/WH9q/3H/cX9JP7r/rL/bQAmAc4BjQJTA/kDqgR7BUcGIQcPCMoILwlpCZ8J7AlaCsIK8QrsCs8KkwoyCsIJNQmHCN8HPweKBq0FkwRLAwgC7gD4//7+z/1y/CH7/fn2+A74OvdY9m71lfTt85zzhfNq80vzNPM180nzdPPK81P0FvUQ9vT2nfdK+BL50Pmg+pn7lvx8/VX+KP/3/6sAKgF+AcgBLgKwAgoDJANBA18DSgMgA/YCpgI+AuwBrQF1AS4BtAAcAJL/FP+k/lD+F/7r/bz9fv1G/Sv9Dv3O/I38Wfwe/Of7zfvJ+9f74fvX+9f79vsV/Cj8KfwR/Pj78fvh+8j7y/vq++j7vPuY+4j7iPua+5r7gftx+2n7V/tC+yz7I/s6+2v7pvvu+0D8mvzj/BX9Vf2l/QH+hv4d/6j/MwC8ADwBuAEzAqcCFAOCA/wDZwSfBL8E8wQgBS0FMQUpBR0FJQUmBQcF3ASkBGIEHAS3A0gDAQPaAqMCTQL0Ac4B7AEIAtoBiQFxAZcBpAF3AT8BOQGPAQICGQLyAf8BbQL2AkQDVQNHA0kDqAMZBAIEnQN9A6MD+gNyBH4E0wMyA10DHwSvBEkEDQMtAnUCswOWBMwDMAJMAT4BKwITBBUFCgSZAjUCCANnBMAE/wOmAz8EOgWmBQ4FRQRPBDIFigaXBzMHpwXmBMgFLAekB80GVgVOBCwEtASiBUsGnQUXBGcDyQNNBHoE/wMoAywD9gPCA0ECPgHDAeoCMQMAAnoARgA+AcsBggE0AS0B7QDf/0/+rv3I/rIADQJnAkMCgwJuA3wELQWiBS0G4waEB+IHPAjpCMAJXwq2ChQLvAtyDLgMWQx4C6UKGQpMCSMI3wZoBdcDYwISAeH/sv5Y/cf7A/oO+Bb2P/Ss8pHxv/DY7/HuGO4e7Rrsf+uG6+/rROxQ7GDsAu1M7uLvbvHU8i70bfVo9pb3Q/nr+k/8u/0h/2AAoAHaAgMEVQXHBgsI+AhzCXUJOQn3CKwIPQiWB88GNwbnBbMFgAUoBX0ElwOsAsMB3ADr/+7+Fv53/f38qvx//FT8Jfwl/FX8f/yQ/J38svzg/Bn9Kf0R/RP9RP2j/R7+Yf5h/mP+cP5f/jD++v22/Vf9Ev37/Oz83fzE/Hv8DPyd+y77u/pW+gf67fke+mT6j/q++hT7oPtt/F79L/68/hr/d/8VAAYBGAIWAwQE+wQMBi8HRAgyCfgJpQo5C60L+AsQDBMMIQwmDA0MywtHC5wK/glrCbMItQdjBtcERAPGAW0AK//n/aT8Yvsd+t/4lvcx9sr0mPO18gDyZvHp8GzwCvD37zTwsvBL8dPxT/LV8nXzG/Sh9C71Nfah9/34P/p7+4H8b/17/nf/QAD+AJsBEAJ0ArwC6wIgA0sDZQODA5QDfAM4A8wCVALeAVQBsgAIAGv/7v57/gv+rP1N/df8YPwL/OH7zvus+337XPtL+0f7SPs/+0L7YPt/+4/7kPuO+5X7p/u4+8778vsN/Ab87fvf++P77Pvy++r72fvN+777lftl+0z7Vft8+7P71/vc+877y/vy+0D8l/zo/Cn9Vv2h/R/+nv4l/8r/VACyABkBpQE2AqoCEAOEAwcEhQTOBOQEBwVOBaEF0QXJBcYF0AW8BZsFbgUEBaIEjQRiBP0DqANrAzcDDQPkAqECRAIDAvMBqwEwATIBXAHzALQABQHwAIEAqQAqAYoBzwG6AagBFQJuAocC3AItAxIDBwN4Ax0EiQRxBBAEIgTaBHkFXwX5BPgEcQX4BfwFYwXYBOQETAWhBbkFmAV4BakFIgZjBhMGZAX4BFkFNQaeBkIGiwX/BOIEPgXqBYUGpAYrBpMFiwUDBicGggWjBIEEcQVlBt8FFwTNAtkCpgNRBFYE9AOaAxgDRQKHAWcBBALmAjMDjAKLAfUA3wDaANIAMAHFAe0BSAEYAGj/3P+wALsAq/9s/lX+1/8wAjIELQVtBcEFdwZMBxAIswiFCc4KGQzZDCwNYw22DVUOJQ+6D+APvQ9zD60OXQ09DA0LDAn2BlUFjAO+AVkAvv6W/Ff6Ovhu9s30pPIg8EruS+2E7Jbrc+pS6YPo7OeS583ncej06IPpjuoP7MPta+/k8GryKvQK9tn3nPll+y396v66AJoCQQR7BYcGwAc7CcUK+wuGDHsMOQz9C8ELVQuWCqMJwggQCHsH3AYgBlMFagRQAzUCQwFmAI3/vP7u/UP96fzK/KL8a/xa/Jb8Df2B/bn9r/2M/Yr9sf3d/Q3+Xf7H/iT/Sf/+/kf+fv31/Lz8o/xI/KL7/vp6+vX5X/nL+FH48PeS9xf3ffbn9Xv1PPUj9Tb1fPUB9tD23fcW+WD6l/uw/K/9qP64//AARwK3AzoFygZYCNgJRgugDM8NwA57DxcQrBA7EZ4RqxFcEdIQNBCND7YOmw1RDPQKnglECL4G+wQBA+MAyf7Y/BL7Yfmr9+v1SPTW8ojxWPAz7x/uT+3T7KTsu+wS7Z/tRe7+7snve/Aj8efx1/ID9FP1kva69+L4MPqn+w/9QP5Q/zoA+wDFAZACFwNmA5sDsAOiA3YDKwP1AvIC4gKmAmAC9gFZAd4AnAAXAED/i/7r/Rf9W/zy+4j7DPu2+nr6Xvpa+i368vnj+cD5dPlC+Rv53PjK+Pf4FvkS+Q/5F/ku+VP5ZvlR+Uj5TPku+fn4zfiu+L/4+fgu+V/5rfnt+ef5yvnl+Sj6Vvpx+p368/qC+x/8jfzZ/Cz9mv0u/s3+UP+w/wEAXADZAHQBBwKAAuACJANvA+8DawS7BAkFTQVxBYcFlAWfBZcFdgVdBVsFYwVXBREFrQR8BIgEhwRfBDkEMAQhBOoDnANdAzcDHAPsAq8CggJoAmsCkgLWAiMDNgMUAxQDNQNEA1YDbQNlA2ADiwOrA5MDhgO8AyMEhwSSBCgEvgPiA5UECAW9BEIECAQQBJEETAVfBb0EMQQ/BO0EqAXBBYgFgQWQBWUFCAUBBbkFrAYiBwkHiAbFBW4FBwbiBiEH7AbWBv4GIAfrBmUGEAYDBvkFNQaWBikGIgW6BN8E4gT7BPAEDwQfA1IDOAS9BGYEXAObAtgCLQO3AvcBbAETASYBSgGTAEf/jv5n/u/9F/2r/EX9I/++AeIDFAUCBi8HdQiHCVEK+ArHC88M6g3ODp8PCBHEEqIT1ROFFFIVKxU1FOoSoxF7EMIOOAxyCZ4GxQNdAWf/Zv06+wj5zPZu9MXx4e5C7EHqsuhp54bm9OVO5Yfk5ePF41XkReUq5hvnauhT6szsfu8d8qr0I/do+W/7WP0//yYB8QKQBCIGxgdLCX0KaAtCDCcN/g2aDs8OgQ6/DaMMOwvCCXEIDwd6BRoEMAOFAs8B7wANAF//xv4S/jn9W/yo+1P7bfvE+xr8bfzY/GT9Bf6K/sr+6P4z/77/YADSAO4A2gDVAPQADgHLABIAF/8i/lr9mfyW+1L6/vjL99H2CfZS9aD0GPTX87rzjvND8+nymvKO8vHyv/Pb9Cb2h/cO+en6HP1x/5kBbAMCBZ8GZgg/ChAMyg1UD7AQ+hEeE98TQBR/FJUUZBQXFKsT7BLvEdsQqw9TDrwMzQqrCIIGRgT8AcT/kf1Z+0b5bfeh9dfzP/L58Azwdu8N75fu+e0+7ZfsMewn7Hns+eyc7Xrune/78HPy4/M59Wr2mPfJ+MT5k/qG+438cv05/uX+bf/s/3YADQGqASYCVQJMAksCdAKbAnIC6QE4AYMA2P9U//X+kv40/u/9vf2S/Vf9Af2w/G78NPwS/A/8BvzV+4T7Mvv3+s76pPqH+oP6ffpT+h/6Afrw+db5pflP+fH4ofhT+AH4vfeR93v3Uff79p/2a/Zk9nz2o/bd9jP3ofcU+H74z/gO+U/5mvn/+Y36RfsU/N/8o/1z/lH/IADBAEYB2QF4AiIDxgNFBKkE/wQ3BUoFRAU5BSkFHgUkBRYF3gSNBCYExgOOA2EDHwPQAoYCRAIaAhcCGgL2AckBtwGbAX0BqAHXAa4BswFYAv0CPQORAw0ETQSOBAEFNwU6BWQFrAUYBnYGZAYiBj0GtgYkBy8H7AbEBrkGkAZ9BmoG0QUJBfEEagWlBS0FLAR7A64DLwRfBEUECQTuA3YEXgWKBdUEYQSoBCUFvwVZBhkGJQWzBA0FugUuBgEGpQXCBSAGNwYMBv8FZwb/BgQHPAYBBeUD4QM4BYEGKwZfBKACGQK7ArIDUQR0BCsEYQMjAlEB1AH8AkQDhgKXAaYAzv/N/4sABgHoACYAmf4K/Yf8dP2C/5YBugKtA4EFqgdKCbwKTQyjDZEOKA9mD8QP/xAMEwgVLxZ0FmcWqxY7F4MXUheQFtYUOxJPD4UMHwrGBwEFAAL+/gb8evmE93b10vLT78zs9Omc5wDm8+Q75PXjwOP44i3ieeJt4zHkQuUB56XoC+r264bucPF/9Ev31flI/G7+XQCIAqgELQYzBwYIuQiCCWwKSgv9C2UMbgxcDF0MIQxmC0gK4Ag/B6kFTQQrAz4CfgHWAEgA4f+g/1f/Cv/j/tz+xf6R/l3+a/7p/q7/agD8AGEBmQHCAfQBJAIvAgYCtgFcAfIAYgCv/+/+Jf5T/W38Svve+Vj40vZb9fPzkPJR8WHwuu9D7/7u+e4h72rv6++H8Bzx4PEK83X0BfbG97H5yvst/sgAYwPNBfkH/wn8C+wNtA80EXUSoRPFFL8VdRbgFgEX1xZdFpIVhxQ9E6YR6A8oDkMMJwoGCA4GHwQeAiAAB/67+6D56/dH9oT0uPLs8FnvRO6o7XLtZO0p7fPsJe2v7U/u2+5a7+HvifBZ8S3y8PLF87z02/X+9vL3tPhp+SH62vqF+xb8ePzG/Dj9v/0W/kD+Yv6I/s7+S//R/yEALwAXABEAPwCDALUA2QAFAT8BjQHtAU8CwAJKA6sDnwMoA4EC7gGMAUAB7gCEAPH/K/88/i/9Dvz2+iP6mfn/+PT3dfbD9F/zrPKB8lDyyvEB8TDwke9W75LvJvDO8FHxm/Hl8ZXyzfNG9bj2EfhL+Vf6TPs6/AP94v1G/9IAxQEpAp0CbgOOBKsFUgZ9BoUGgwZtBkgG9wWIBSYFqQQEBEsDnAI/AhkC2wF4AfoAfQAdAND/sf/Z/y0AgQDHAAUBSQGqAVICRAMnBLEEAAU9BYEF8wWEBgMHdQfnB0EIZwhrCGoIbAhbCBgIrAdHB9sGRgadBQgFrQSCBE0EBwTIA5sDbAMdA7oCewKHAtkCKwMzA/8C4QIcA7kDgAQWBVUFmAUmBqcGugawBhUHBAjyCBcJPggrB70GFAefB70HVwfiBnkGsQWWBCYE4QQmBjgHjwffBt8FrwVjBjAHgwc4B6gGLgacBf4E/gS5BXQGoQYxBgkFbQNdAj0CQwIGAq4ByAAb/5/9+/z+/Fn9lv17/Sn9kfyG+zT6fflu+tD8Gv+RALsBKAOFBRQJbAwPDnwORQ8XEU0TmRTYFFgV2BayGPIZMxq+GS0Z7xiEGBQX3xRpEqsPwAzFCboGygO6AD79u/nV9on0TvK576zsjulG50rmvuWq5JrjeOMu5C/l5+UC5hTm+eah6Fbqzes67fXuIfGB89f1UPjs+k79Kf92AIoBrwJ2A5cDngP6A2wEqgSkBGcEKwQeBEEEdARtBO0DAAPvASMB0ADRAMwAlgByALEAVwEtAucCdQMPBNQEjQURBn4GFwcRCFYJgQo4C38LlwuNCzcLngq2CUYIcwajBNYC8AAb/2n9t/v/+Tv4YfZ99J/yu/DO7uTsKOu76Zno3een58vnROhI6cTqcOws7vzv6PHy8wL2J/iS+i/9yP9lAhcFqQfvCQIM9w3HD3gR8RLzE30U1RQcFTwVExWHFLgT3xLuEbEQLA9wDY4LyQk4CJEGtgTaAjwB8f/0/jv+o/37/En8kfvJ+gT6YPnf+Iv4Y/hL+E/4Zvh++Kj4x/i7+Jv4VfgO+Pb36Pea9/n2MfaH9fn0fPQG9Ibz9/Ji8tfxgfF48aTx6fE+8qXyOPMI9BT1Wva79yD5mPoT/Hb9x/4XAHYB5wJBBFsFUQZqB7II3wmTCsMKmwo+Cr8JGgk4CBoHzQVjBOwCYwGq/9z9NPyw+jj57/fK9m717PO+8szx1/A08A3w7u/L7/rvcfAQ8d3xtfKV86D0u/XL9uD3/fgv+nn7p/yG/Sv+rv47/+T/XQBxAEwAIgD//9r/nv9E/+H+hf49/g/+1f1g/dD8XPwW/Pv75PvR+9/7C/xy/CH9/P0J/xoAFAEnAlYDjQTDBdIGsQd+CDoJ5Al9CvMKYQvaCxkMFAz3C7MLPAumCgoKawmsCL8HyAbUBcMEeQMcAusA6v8G/3f+Nf7g/af93/0f/jX+mf5j/zsABQGFAc8BegKyAzAFnAaPB+sH8Qc8CCkJRgrlCtgKPwqICUQJZwluCSYJbAhdB5EGRAbrBQYFBASgA5YDbgNUA/QCywEoAWoCaQSVBeoFtgVYBZoFlAaIBwAI9QfTBzAIoAgYCNwGPQbBBrkHAggPB3MF3AOLAicC5gIyA7AB+v5d/Af7OvvR+6D7fPoZ+Tv4Bfgn+Jf4c/nO+rX86f4VAWsDHAYQCSUMIw+qEXsTmxSGFdgWnxgtGu4aBhv9GgobDRvOGvoZbxh2FkwULxIMEC8NkwnXBUYCC/8Y/Aj5xPXH8ovw0O7o7MfqBukC6J3nmeen583nWug+6UXqeOvm7F7uhu8/8OLw4vFX8870+fUZ92/4zPnd+nj7+fuw/Fj9jP1I/Z38rfu8+vT5ZPkZ+e/4x/iv+Mj4MPnq+dj61Pvh/Af+Jv8lAFAB9QLtBO0G3giSCvQLPA15DoYPdRBgEQ4SRRIsEgISuBEeEVUQXQ/WDeEL3AmLB78E1AH//i/8cvnQ9mr0a/Kq8Bjv7+0m7X7s3etc6yDrNOt5687rTewg7VHu2u+s8ZHzX/Ui9+j4mvov/Kn9Bv8+AEsBJgLjApIDKgSYBOQEGQUvBRcF1wSVBHcEhQScBJcEiASjBPQEbQX8BZ8GWAcyCAgJqQkQCmkK4gp5CxQMtwxODbEN3Q3pDdwNwA15DbwMkgs2CsAIPgerBQEEGAK1/xv9qvph+Ev2gfS08qnwne7k7J7rxuoi6pDpOulX6ePpq+p561XsYe2W7vfvjPER83/0J/YY+PP5gfvX/DL+n//vAO8BrAIpA1gDRgMcA9YCagLkAUwBsgBLABMAsv///iX+Zf3l/Jf8VvwL/K/7U/sh+z37l/v3+0v8qfwL/V79qv35/Uz+ov75/iz/Iv/t/qX+Vf74/Wf9m/zB+/T6G/o6+V/4k/fg9jb2mvU39QT17PTt9Pn0C/Uy9WL1lfXg9UL2vvZo9zn4OPli+p373fwP/jn/egCvAcACswN2BBQFqwUkBlYGZAaOBsEGyQaoBnEGLAYHBiEGOAb4BYwFTgUNBaoEawQ/BOoDowOYA58DkwN1A3AD1wN8BOAEBAUxBWkFswUnBo8GlAZBBt4FrQXFBecFyQV8BTQFHAVMBYUFZQXqBHcETQQeBKEDBwO+AvkCjwP/A+4DfQNIA+QDJwX7BaIFqgQhBHAEFwVVBRkF6gQ3BbIFqwUQBZgE8wQCBtEG4wa9BrkGyAYTB5gH+gcZCPQHgQcxB3AHEgh+CC4IUwfABtYG4wYNBscE+ANsA9MClwJwAocBNQBE/6n+Pv7p/Xj9w/yb+wn6rfgb+GT4T/mG+r37G/0C/84BUgW7CG0LjQ2bDxESwhS+FoQX3henGMoZoxrEGkcacBmmGDUYjRdjFh8VjxNeEcEO2QuyCIIFewKq/xD9m/pJ+GD2F/Uq9CzzCPIW8Z3wW/Ag8G3wa/FW8u7yyvP69A/2yfb39t32zPaq9mP2/fVI9U70WvN/8nnxbvDE70zvm+7y7ajtku2C7X7td+2W7QXuoO5g70/waPHy8jj19PeN+un8Uv/kAZ8EdQccCm0MmQ6sEHIS0hO+FCgVOxUlFbsUyBNpEtcQPw+jDekLKAp+CNwGOwWcAxsC7QAUAE3/c/6H/an8FPy9+1T72vqO+pL6w/r1+kP7r/sa/In8xfyS/EH8APyI+9X6JPpH+Rj4xPZ09Tj0FPP88evw8e857/Du9O797iHvg+8E8LbwvfHt8hz0c/UR9/T4B/sV/Qf//ADmAqEEWgY1CBAKxAszDUsONw8mEPgQYxFbEQoRahCND6IOkw1PDPsKqQlaCAQHwQXABP0DUgPhArcCqgLLAigDYQNWA0wDQAMEA6MCGQJzAdoAKgBP/3b+lf17/DP78/m++G/3IfbY9HHzIvIt8Vjwbe+H7sztRO3v7MPs0ewj7ZbtHu7y7gbwC/Hz8ezy/PMu9Yn23ff9+AL68vrD+4n8Of2U/aT9lP1y/Ur9MP0C/aT8RPwf/Av83fvA+7j7pPvF+zj8h/yk/Pz8eP3J/en9AP43/ob+uf7T/uT+4v4G/1v/gf+f/+3/AwDg/+X/zv9t/zP/C/+R/gD+iP0F/V/8m/vU+iP6ovl5+XH5GPnI+CP5yvk1+qP6SPsG/Nv8tv2X/qb/qgB3AVoCOAO+AzYE6wR+BbUF/gVqBpYGqQa4Bm0GCwb7BccFAwUQBG4DPAMyA9ECEgKNAYABrAEHAngCjwJ8AiADfQSzBXQG8AZqBywIMgkVCmYKGAq0CboJ5wl7CYcIDggwCPEHQQfzBhoHOwdFB0kHSAdJB0IHKQfqBlsGwgWVBakFYQUIBYIFfAa4BjYGCQa0BsMHhgiuCFQIyweWB+QHKwjCB8IGxQUuBfoE7wS2BDgE4AMhBM4ETQUvBa4EpARIBYoF3QQcBJ8DAANiAqABQgCw/p39/fxN/Dn78PkV+V/50vpd/B79Sf70AL4DsQXgB50KCw3eDn0QIRKbE3sU4RQ5FRUVIBQ1E9ISIRKtEGYPow5zDaUL6QmPCG8H+gUIBEEC7gDR/+T+J/5p/bT8X/xB/M77Jfsf++T7uvxb/QP+0f68/4AA6QAoATwB/QCGANr/nv7V/N36y/h69hP0rvEf73TsIOpA6LnmsOUs5eHkxOT85ITlTuZF50bohOkm6/Dsnu4q8LLxbfNQ9ST3x/g/+qj7Q/33/kUABwG5AYsCOwOWA34D6gI6AsABWwHnAIQAQQAPAOz/+v9yAEABIwL3AvIDZgUeB6sIMAq7C/sMBA5DD44QZxHQERYSMBIDEs4RjxG5EHwPZQ4fDYQLIArLCAoHTwX+A7ICQAHE/1/+Rv12/Mn7PPvE+mP6Nfos+i36XPqm+r76y/ou+8X7J/xJ/GD8mPzW/M38bPwB/Jz7Bvsx+kr5f/jH99f2x/Xz9GP06vN18xPz6vIb85HzGvSw9G71cva69xf5dPr3+7L9ev85AQUDzQRnBskHCQkcCvYKpwsUDB8M5QuHCwELSApbCUYIIQcPBg8F5wOZApMB7gArAEP/o/4n/pn9S/1L/Tb9E/0V/Tv9gP3S/RL+NP5K/nP+nf6I/kX+AP5y/Yz8xPv/+uP5ovhr9wL2gvQr8/LxxPCm75Xuse0a7cbslOyB7KfsEO2Z7Svu2O7D78/wvfF+8mHzg/SO9Tr2y/Z69w34Xvio+M34n/hx+G34Kfi294L3X/fp9oP2d/Zb9i32SvZ79q/2FfeP9yv4FfkP+vb6+PsP/TL+if/2AEMChQPQBPgFzwZ9By0IswgECTQJMAkACcMIdggACGcH2QZtBucFLQWFBA4EpQNjAzgD5gKUAqkCCgNWA3IDpwMsBNwEcQX5BZEGLwe6BywIkwjwCCsJPwlECVYJVgkVCb8IhQgvCJ0H/AZrBt8FYwXzBGoE2gOgA7UDpQNoA3oD1QMhBHgE+wRwBdwFYQbfBmEH7wdDCHEIxgg0CYIJzglGCowKMQrDCQkKXArSCRMJwwhQCJEHIwfsBlYGUQVGBKkDYwPoAmYCVgJrAkECPgKhAvQCGAN3A+YDFQRUBNwESQWEBcIF4AXPBbwFwAXmBe8FmgU5BToFdQVoBfkEiARFBCYECwTFA3MDUwNMAy8D7AKnAooCiQJ7AlMCLAInAigCJQI3Aj0CHQILAisCWQJcAk0CcQLGAgMDBwMBAycDWQNcA0EDOAM8Az4DSQNYA04DKgMEA+cCyQKlAngCPQL/AcgBkQFYARUBugBTAPD/lv81/8P+Wf4D/rT9cf1I/R/92vyY/IP8hfx//HX8XvxD/Dv8NfwT/Of7y/u0+437cPtm+0L7E/sW+wj7qPpy+pT6f/of+uD5xfme+YT5hfmK+YP5cvl++cf5EPox+lr6q/oC+077l/vj+yX8X/yf/On8Jf1J/WL9hP2w/dD92f3X/c79xf3H/cL9pv2F/Wz9VP02/Rz9Dv0F/Qn9E/0R/SX9Wv2H/aL9sP29/d79+P3w/dj91/3s/fb9+/0Y/ij+Iv48/nP+lP6o/sv+9/4k/1P/h/+4/87/3P/7/xgAHwAXABYAKwBIAGsAgQB/AIUAoADJAPMA+wD4ABUBPAFZAWkBeAGWAbABvwHYAfQBAQIUAjsCXwJ2AoYCmAK0As4C3wLwAgQDEgMVAxMDEQMIA/kC3wKvAoICaAJAAvoBwgGjAWcBDgHSAKUAZwAuAP3/yv+Y/2j/Qv8n//3+xP6R/mr+QP4J/sz9lP1l/TT9+vy4/Hn8Svwe/O37ufuH+1f7KvsF++f6wfqR+mr6VPo7+hj6+Pnn+dn5xvmx+aD5kvmL+YL5b/lN+Sz5GfkM+er4rvhy+Fn4Vfg3+AD43PfL97r3sve396r3lfef98P32vff9+X3/vcg+Dv4UPhv+Jn4zfj++Cn5Xvmh+dP5A/pE+nr6nfrJ+vT6GftB+2X7f/uM+5n7u/vd+/L7E/w9/Fz8hvzE/PT8GP1P/Y79vv3v/Sr+Z/6j/tn+C/9J/5H/z/8NAE4AiQDLABQBUQGJAc0BEgJIAncCrgLlAhADOQN2A7ED3QMHBDQEcAS5BPUEKwVoBbEF/wVDBoIGzAYNB0QHggfCB/YHIwhJCGsIjgivCMgI3gjkCOEI4AjpCOkI1wjECMEIuwioCJEIewhmCFcIRAgtCBcIAAjiB8UHpAeKB3wHZwc8BxMH+AbeBrwGogaQBnMGUQZABjMGHAYEBuwF1QXDBakFjgVyBU4FKAURBf4E1wSlBIsEiQR5BFIEOQQ2BDgEOQQzBCoEKgQwBDcEMQQjBB0EHAQUBAwE/wPsA98D3QPOA7ADpAOfA4kDfAN2A2UDVwNRA0UDLwMRA/cC6gLZAr0CoQKBAmoCaAJgAkICKAIeAh4CGAINAggCDAIPAgwCBgICAvkB6QHcAckBrAGUAX0BXwE+ARoB8QDMAKoAgABPACMAAQDk/8T/of97/1r/Q/8w/xX/8P7M/rr+sv6d/n7+Zf5e/ln+Rv4s/hn+C/73/dv9wP2o/Y39b/1Y/UL9H/36/OT80fyy/I/8ePxq/F38TPw6/C78Kvwk/Bv8FPwN/An8CfwG/AH8/fv6+/T77/vp++L71/vO+8f7wPu6+7X7svuw+6v7pPuj+6X7ovua+5v7o/um+677wPvX++37Bvwj/EX8avyR/Lz85vwN/Tj9Zf2U/cH95/0N/jT+Wv59/p3+xP7v/hL/Of9q/43/qf/T/wUALgBSAH0AswDvACkBYAGaAdkBFQJNAoMCugL0AisDWgOEA6YDwwPfA/gDBwQPBBUEGwQfBB4EGAQQBAgEAATyA+ID0gPEA7ADlwOCA3IDWwM7Ax0D/wLfAr8CnQJ5AlYCLgICAtUBpwF1AUMBEgHfAKkAdQBCAAwA1P+Z/17/I//o/qz+bv4u/vD9sv1y/TP99Py0/HT8N/z3+7b7fPtI+xD71vqf+mb6LPr5+cf5kflb+Sj59/jF+JT4aPg7+A344vfA9533efdW9zf3GvcC9+b2yfav9pr2hPZp9kv2MfYh9hr2EPYG9gD2APYD9gv2FPYg9iz2O/ZL9mD2dvaK9p/2uPbN9uD2+vYc9z73Xfd/96r31vcB+DX4cPii+M/4Afk++X/5vPn0+TL6dvq9+gH7SfuW++P7MfyI/N/8Lv18/c/9Kf6B/tD+IP94/9T/LQCDAOAARAGnAQcCagLSAj4DqgMXBIQE7QRPBbIFFQZtBr0GDgdbB54H2QcRCEoIfAidCLUIzwjsCAIJDAkUCSAJKgk0CT4JQwlECUwJWAleCV8JaAl3CYMJigmXCaEJogmdCZ4JoQmaCYQJbgldCU8JMwkICeEIxwibCGUIPQgZCOUHuweZB28HRAcfB/0G2wauBoYGaQZMBikGDQb0Bd0FyQW3BaAFhgVwBV4FSgUyBRsFCwX3BNsEwASpBI0EbQRPBC8ECQTnA8oDqgOJA28DUgM2AyADDQP8AvAC5ALeAt4C2gLMAsECvAKvApoCigJ6AmQCTwI/AiwCFQIAAusB1wHJAbwBqwGWAYEBcAFjAVIBOgEqASABDAH5AO4A4gDVAMcAvAC0AKwAnwCSAI4AiwCAAHYAcQBqAGEAWABRAEkAPQA2ADAAJAAYAAwA+f/l/9f/zf/C/7X/qv+e/5D/if+I/4X/ev9u/2z/cv94/3z/ef9+/5D/j/+G/5b/qf+j/6H/r/+3/7n/uP+z/7X/tv+q/5//mf+M/3n/a/9m/2b/X/9M/zf/LP8m/xL/6/7K/rn+ov6K/oX+gP5l/k/+Uf5O/jH+Ev7+/eD9uP2e/Y39cv1j/Vj9Qv00/Sv9H/0q/Tf9LP0f/RX9AP3s/NP8sPye/JX8e/xi/E/8Pvwx/Bv88Pu2+4H7Zvtk+2X7cPuL+6j75Pst/Fb8dvyB/IT8tfze/OD8w/yi/MT85fy6/Jr8pfy2/K38nPzH/OX8j/wp/Cz8VvxE/FP86/yh/UH+F//E/5z/e/4B/R78sPvb+qL54vjw+B75L/mb+e35n/ni+UL7FvzX+3n8X/51/2T/a/9r/wT/C/5b/O36cfoX+rL59fmz+pH7Xfy7/EH9zP1p/eb86vy7/ED82vu++8n7nftD+xL7FfsH++/6Ffsz+//62Prh+uf65/rA+n76XvqM+ub63fqW+sv6XPsA/KD8Iv29/Vr+l/6g/qb+WP6O/d/8nfwz/ID7PPtO+/X6yfqA+zr8ifzm/H/9M/5d/u39//2l/sn+Pf7Y/cb9hP12/U7+df/k/6r/sv9xAAMBeQCD/6H/DQFAAhcCagF3AS4CdAKYAYYAmAC6AdUCWgOWAysERwU2BmQG5AX5BFoEbQSMBCoEhANcAxwEJwWeBX4FYwW+BX0GPAfJB0IIqQgnCbEJmwnjCEoI8Ad3B7EGxgU1BVgFmgVFBWsE7wOfBJgF3wWMBuoHjgiiCHoJkgqMCqcJUAk+CkML9wo4Co4Kcwt7C5sKtQkvCdYIXQiYB50GvgVNBVAFpQXzBesF6gVdBgMHfQehB6EH+we7CDsJ4gjjB94G4QV6BKACpwCI/l38avq2+JP39PZg9hH2SPba9nP3wvcQ+I344fhb+Xv6wfud/Eb92/3c/Tn9ivwf/I77pvrr+bX5vvmH+Rr5Xfku+oj6evp6+vT66/uh/Fr9uP5JANkBoAN2Be4GugclCJoI4AiaCAAIiQdQBxYHmAb3BZQFdQVXBVsF0gWfBlkHIwhtCS0L5gwyDhYP3w9tEGcQ5A8sD14Oiw3GDAMMHgscCiMJPwhjB4gGuQUTBZ0EUgQnBBAEBwT7A9YDlwM4A80CbQLrATgBegDV/0H/h/6M/YH8g/tx+hD5c/f19bb0rPPr8mbyEPLi8enxRfLO8jjzi/Pf80L0i/SJ9Ej0/vO983Tz8vI88mHxePC17y7v0+6R7lruXe6w7i7vzu+a8Hzxe/Kb87z0uvWZ9m33QvgD+Z35Hfqe+hv7gPu2+7n7lvtf+yn7B/vt+ur6JvuV+yL83vy9/aH+g/9uAHkBjQKKA40ErAWqBkEHfweUB3kHDgd/BggGgwXmBHMEOAQUBO0DwwPFA+ID4wPmAykEggS0BNQEEQVQBVEFMwU6BT0FJAURBdcEdAQYBJYDzwL3AR0BRgCZ/wT/Yv7B/Sv9svx5/Gf8Svwv/ET8lfwG/VL9Ov3d/JP8i/yD/Cn8fPvB+mL6Zfo1+sD5aflI+Uv5RvkU+df4r/jR+FL58/lI+iL6CPp8+gX7J/vz+r/6Bfu++0b8MPzi+0v8Rv3O/cj9kP33/FH8tvwS/q3+Jv4U/uH+nv/C/0r/uP5B/kr+WADXAxMFnwL0/0sAXQK4A5sENgYRCKgIjQf9BfAEVgRVBAAFvgXDBdgEvQP3AvcCkAQRB7QIFgnFCNwHXQbCBJ0EhQeOC/wMmgu4CQoJ/AiZB6AFUAVZBgMHsQZ1Bl4GjwQdAlsD3AfuCWYIAwgEClAKYwcFBbEFqQZeBfYDXgSsA9v/5PwX/pwAsQFHAwMFWgNVAAMBrQOFA10BtwEGBYoGfQMZAPYAeAOlAwgESwdRCR4GjADB/t8BjQO2ABP+i/4/AIcBdwJMA3kDmgMaBREHHgcrBawDQgT7BQYH5AbnBVwEGwMvAu3/Jvzm+Mz2Q/Ur9R/3BPkv+ZH5avxcAPEBHAD6/VD+kf9v/3T+5f3q/Wn+xf4X/oL8wvpb+Yr4VvjA+Ef5h/lS+jP8df7Z/6v/5P7I/gP//P44/ygASgF6Ak4EMQbXBlUGbgV+BJcDcgLcAHj/E//A/w0BoQJeBPgF5AaGB6EI0Al7Cg4L+QsnDUAO2A7BDhoOAA20C5EKXAmlB/sFSwWvBbsG6wf8CEYKvQuRDHgM6QsUCwoKLwm+CHYIGwiTB9sGIwaGBc8E0wO9AsYB5AD3///+J/6Y/Vf9TP0u/av8uvuU+pv5F/n/+EX5yfkh+gT6pfny+K/3BPYz9HHy9fCa73Duve147Xbtxe1y7jbvqu/r7znwgvCP8GLwJ/AM8O7vo+8g74Xu5O0/7a7saOxp7InsvOww7eftl+4c77Pvd/BL8evxSfKh8v/yX/Pd82b0AvW99Wz2C/e69yr4N/hN+H/4pPjn+FP50/lP+r76VPso/BT9If5I/0IAHAENAtMCVgPRAykEFwS5A1MDEAPiAoACJAJXAtwCPAOkA0EEzAQkBawFaQbJBs0G1gabBv4FjgVTBfMElwRCBPcD5QO7A3YDhwO3A5gDSAMcA/kCsgJ3AlcCBwKIASgB3QCmAKYAhwBaAKEA+wDQAD8Asv+O/7z/nP/x/hX+RP3X/CD9ff0O/Qf8kvs7/OT8ifzL+5P7/fug/BP9I/3k/Nf8SP23/Xj9Hfxq+kv6JfwY/h7+KfyY+u76Z/zV/Rb+T/3g/GP9Ff+oAGn/XvyT/HABFQXrAjf/aP8iAeoABAFhAgQCqv90/gECMgjRCEgDAADnAUQEPARaBGwGzwZZA68CnwhUDIEIdwVtCBALgAhKBEEDHgVLBuoGaQmTCnAGcQFHAvMHRAwCDI4ICgbqB0oM/gw2CMMDZASwB5UILwXYAO3/dQIWBmMJIAqzBskCeQO3B+8JVweMA2cDXwYqCG4G3gLQANIBOAWnCMMIxgRfAH//LgLjBBkE4AB1AF0EQgcpBR4B2//QAUYEVgUiBRsEkwK3ATwCawMfBAgELgSRBCQEpQKC/9n6qvdO+JH6vPq6+Lj3s/lV/QsAFQGSATEClAKeAhsCSQCs/Xj8wf0AABEBxf+g/Ef6kPqF+8n6i/lC+hr9JwDHAQ4CDAI9AkcCOwI9AngBBwBx/1YA/QEwA5MDXQS6BdIFPASRAkkBQwBMAIEBzgI5Ax4DHgSUBrQIVQlbCdEJogpJC4ULfwtnC2cLowujC9MKVQm0B4AGMwaiBjgHzwfHCF4KSQyyDTcOQQ4TDnYNVgwKCwUKNwlZCIcHLQdcB44HRAeuBisGsgX6BBsEsgMiBN0E2ATQA+oC5wLCAq4BjQD5/zH/9v0S/fX8HP2o/Hj7cvoa+t/5N/k3+BL3J/a59aT1tfXN9en1QfbL9gX3Svav9PjyuPH+8HXwne+e7gjuDu5a7k/u0O197bTtTu7Z7g3vHu+C7z/w6/AY8cLwNPCn7+/u6O3A7Nrrguvt6/zsRu5Q7/PvhvB28ZrykfNA9LT06vTr9Mz0oPSC9L/0dfVU9tP2tvZx9rv2o/e5+Jj5LPqr+k/79/tw/Mf8Dv1e/ej9rv6Y/2cA5ABHAeABhQLrAhIDGwMPA+ECigIZAsABsQH9AYgCPAPjAz4EiwQOBZsFFQZlBnAGQwb4BbEFawXQBBME5QPuA4YDRQNYAwIDwgKJA4cEtgRxBEsEYgRKBHgDbALcAYoBEwGuAGIA3f9m/4P/6/8gADcASwAwAO3/uP+J/zf/6v7P/qb+J/4l/e/7Mvv++hr7cPur+9r7A/zL+4v7zPsi/Pv7n/um+/r79/tT+6b64PrW+y38dvva+mn7Rfyw+6j6Mftd/Eb9Ef8JAZEAz/0C/IX9AwHGAr4BXADZ/2r/Pv8rAKcBeAKtAuAC8wKoAisCXwJIBNIGngfbBt4G+gdnCFgHNwYUB3wJRQo9CEoGAAd+CBkIRQciCGEJgQlyCdsJqgktCNoGigjjDFIPow2fChAJ6gigCMUHlQdlCLsIUQjJB0gGTQRABSoJTwuwCVIHMgc/CdMKKQqfCAQIRQirCJgISAewBBACYAGMAxsGuAVrA+MCbwR2BZYEzQJhAg0EdwaUCLQJIwnPB6cHEQl+CkwJggQx/4r78vda9PLy6fMu9p/5nv29AKsCIgShBeMG4wZ4BRQE/gLWAP39O/xk+3v6v/k0+Z34YPiM+P341/le+7/9TgBBAjoD/gIaAikBHwAr/3b+D/5T/hr/iP8s/8T+S/9tAB0B3ADO/6L+TP7U/nD/KQCVAZkDsQV7B9cIbgkSCa4IswhGCFwHvwZEBnEFkwTqA4wDoAMhBCMFjQZ5B8EHtwjMCt8MRA78DvEOJg6tDKgKcwhuBsMEmwM+A3UDnQObA9cDfgSEBZ4GUAdhB/EGRgbFBW8F0QQYBKgD9gJ6Aaz/I/4D/Tv8kvv3+pb6cvqn+k376Pvk+0X7j/oy+gn6nPm++MD3+/aW9mD2AfZQ9Uf0/PK28Z3wp+/k7oruwO6e78Twm/EM8mny0PIZ8/vycvKQ8YHwe+987rPtZe0o7aLsCuyy67LrAeyd7JztuO6g74/wvvG38kzzoPOY80Lz5/Jm8qzxA/Gw8LrwAPE+8ZDxRPJT84H0kPVY9v32sfdu+DX5JPoO+7v7Q/zJ/DP9Zv2E/bL98P07/m3+Wv5b/u7+8v/CADsB5AHVAqYDZgQ2BdQFVwYTB98Hhgj2CPsItghnCO4HWQfeBnIGKAZIBrEGDwd6B0IIUwlOCusKUQuvC/ALxQswC6sKagoFCjUJRAiJB+UGGQZSBR4FTgVTBaIFgwb7Br8GnQa1BrUGsQZ2BukFTgV0BDYDAQISAWwADAC3/0H/y/5h/if+Yv7F/tH+nf6R/qX+af7R/V39Nf3y/FP8mPsG+5z6P/rp+az5iflX+U357vnf+h77sfqE+uv6hPu3+yX7i/rq+t/7P/zU+1v7S/uA++n7XfwV/AX77/qG/O796P1d/VH9+v1G/8UACwKvAnUCVAK7AgYC9/+h/+AC8QYBCKUFbALdALcB8gMBBvcG8QbnBokHkweRBasDewWtCv0ORA7SCKkDZAO8B5gMyA0gChcF9gNUBzcKugj3BOQDWgfmCwYNYwpSB5QGwwilDPMOiwzzBvYEVwmLDCoJNwR8AkwDxQVyCF0IwAWXA9cDuQaXCVcJeweNBzsJjwkqB3EEWQVMCBUJOAnbCVAHOgKLAPICqgOq/sv2XvOY9gP7A/0X/qL/swF9BPYG4AbpBNMDkAN5AsAAU/6O+nT3c/dz+c367/nE90z3Afl7+mP7S/3//9EBUAI2Ar8BgAA1/sT79/ry+7r8Sfyn+477mvuo+0v8Af4yADgBQgCO/gH+6f47ALEBngNzBWAGUQZsBS4EpQMfBKcEewS+AwQDvwLbAg4DjAOABJkF0QY8CDcJSgkfCdcJpQt8Df8N9QxQC8MJNwhyBrUEpANzA9MDhwRfBfEFGQaPBuMHJQlLCZ0IpQd2Bm0F4wShBFgEnQMgAm4AS//B/mX+yv3j/D78Qfyf/P38J/1H/dv9Zv6q/dL7QvqV+U/57Pgz+ET3PvYt9UL0fvOO8ovxAfEa8UHxC/G18NvwzPFD83/05/Ru9H7zYPIa8ZLv9+217BHsvOtm6xXr3urZ6lbrWeyL7Y7uWu/171Hwe/Cj8NHwJ/Fr8SHxSvBj767uOe797RLuqe6v77Hwe/FP8mvzwfQP9hv32fdf+Or4ifkZ+n/6xvoH+1X7k/uT+0r7CPtY+1/8j/1n/hT/9/86AcMCIQTvBGkFDgbXBlsHZwcxBx0HNgcsB9oGewZlBr4GQAevB0UICwmXCfcJjQo7C5ILlQu4CzcMngxqDOoLmws1C2YKmglUCVgJPAkVCd4Igwh6CNEIDwlICbAJpwnlCAgIigdhB0EH1wZhBhAGYAUkBCoD0wKNAg4CqwGbAaUBWgG1AEkAcQCoAFkAnP+9/t/9If2W/D/8GvwE/Nj7l/tM+/76s/pc+gj68/ke+i763vlO+e349vhB+Yj5i/lA+d74ovih+Lv4yfjb+C75z/li+nH6Mfpz+pf76vxc/d/8f/zd/JP9Kf60/jv/gf99/3b/bv8T/7b+Ov++AFAC+QLGAr0ChQOeBEMFjgUmBj8HGAjKB6IGCgaOBkYHlQcGCBIJoAkVCLcF4QWDCPQJagk9CfAJdQpVCuUJvgllCcUINApyDuMQaw3BBrADLQf/C2cMlwr9CbsIEAZoBaQHewn4CHkIJAtcDrUMAAi9BhMJhwl/Bv0DHQXRBy8ILQakBFEE3wODAzIFMQh9COcEOwFBAWME0wb6BlYHVwkpCmYHGQMXAPv9ZPvY+DX36vX+9Ar2Ifrx//EDPgQiAywDLQTCBHoD3/+a+w/54PjF+cT5KPhv9vv1L/YW9in2offE+nj+HwGUAfb/1P37/Nr92f4S/rr7CPpk+mf7z/oB+Sj4E/kL+yb91f7t/3EAZADt/1T/Cv/w/0MCdgS3BDADvQGWAXQCqgOcBJEEUwN9Aef/ff/lAH4DCgbWB6cImAg0CAIIUAgtCUcKCgvuCroJFwjTBr0FdwR+AysDMgOAA1AESAWaBRgFtQR7BQwH8gejB8EGuQV2BAkDxAEOAfYA1ADi/yr+afxb+2L7N/z0/AL9j/z9+6373PtF/F383Pvk+ur5J/k++O72lfWW9PjzbPOq8sXxBPFh8N/vwO8X8K7wWvEH8tXykPPH83Pz1fLr8bDwUO8u7nTt2+wK7DfrzOrK6uTqLevv6x/tSu4r7+jvrPA68YTxy/E58ozydvL/8YTxGvGK8MXvMu8678TvdvAy8RnyYvPu9Hb2A/i++Xz7tvwB/dL8zPzn/A/9Zv2E/RD9g/w0/D786Pwy/uL/qgEGA+0D2QT8BSoHQAgKCX0JvAm2CXgJXwlmCTgJ5QjSCAIJIQkmCXMJOAohC74LPQwDDeoNkg4ED1APVw8RD6EOIw66DUkNnwzOCxELgQo5CiAK8gnGCfEJVAqeCrMKxArwChkLKQsYC6kKsgl6CIAH+AaMBqgFYQReA+kCtgJwAg4C9AFHAoACLQK1Aa4B7QH4AckBcwHBAKv/gP6a/SD92fxO/Ij75fqQ+oz6t/rP+tP66PoD+wT7B/sw+2T7Wvv4+oP6PfoO+r75S/nT+HX4R/hQ+Kb4IPmA+e35mvp7+0v8vPwC/VP9hP3v/QP/qv/3/gz++/2a/kH/Yv91/+P/5/9i/3n/uQA/AgwDZgNOBJEFCAYYBjkH9ggtCU8HlgWiBTAGIwaXBkkIdgkXCHQFswRmBpgIVQo4C44KhgknCuML0QwyDKgKownNCbwJ3AhrCKkIDgmeCdQJ3wgvB4sGZQhwC88Lawg1BfMF3QnnDKgMmwqLCKkGAQUlBM8ErAb4B30HsgW7A8YCggM+BfgGfQeQBeIC7gL+BLIFhgXSBqoIkwgJBh4DfgFh/7r60vUD9On0s/Yc+fX7Wf50/1L/VP/mAEIDMwQAA7IAPP6p+y/51Pcx+Ov4BPiF9Zfzz/MA9cL1jfc6+0r+Sv+k/5T/nP7F/WH9IP04/dr8rPt7+hj5Ufd19mf3s/lV/O39lv4w/8/+hP3X/TsARAICA34DKQQpBJ8CwADoALMCkgPaAq0BtAAiAD8AQQFMA58F/wZhB2IH1wbdBZ4FwAadCA8KMwr9CEwH9gUuBccEdwQwBNMDEgMYAksB0wAxAcICqwS9BbkFzwRnAykCggGpAVkCbQIdARb/L/2b+3v6u/lP+Wn5wPne+bT5LPlK+M33VPhM+an5HPkH+Nr2oPVr9I7zOPMe89XyI/Ib8e/v0+4U7jLuIe8V8GjwVfBM8GjwiPCc8LTwAfEh8Zjwne+d7tftWe3j7LnsQO0M7ojuu+7A7rru9O6c77vwOPJ08xH0O/Q29Cz0TvSt9ET1zPXS9Un1s/SL9B/1bfb+90/5R/oo+y78M/39/bz+wP/UAKEBJAKDArkCrgKwAv4CWgPHA40EbgUjBsAGTAfXB6cIpAmrCrYLbAykDLYMxQzYDA4Ndw3dDQsO+g2+DWgNPw1lDaINzA39DSIOQw55DpEObw4/Dh0OPQ6iDtMOcA6xDfsMjQxbDAQMVwuyClMKAgpiCYEIzQeZB7oH1we4B1EHtQYeBrYFdQUbBXoEwgNZAzQDuwKmAYAA9f/s/8L/Of+s/lL+9P1h/cT8bPxU/Bv8ofsz+8f6JvrJ+ez55/mk+cn57fl9+RT5/PgL+VD5UPnW+Hj4Q/jY93f3Pvcy92n3XPdu93n4M/nG+Lz4tfma+g37NPtG+8P7P/xb/K385fyQ/ID8Lv3m/RX+Bf5m/o3/zwBZAXMB4AG1AmUDyAM4BLQELAXQBYkGDwczB8QGBgbGBR8GfwbNBkkHVQjdCdUKpAoDCtcJaQpNC9sLAAwWDA8MqAuzCmYJyQhGCS4KVgsuDFkLxwiOBs0GLQkJC6kKOwnACFQJrwn8CBsIYQjPCRYLRQoYBwkEzwI0A84EcwZZBpsEPQNtAw4EPANJAR4B8wP8BgUHegQ2ArkBPQLVAkADUQNWAwoDxQCu/VD97/64//4AcgScB/4HrAWNAtEAd/8G/PP36/Ui9Xj0YvRA9dn3L/tO/ZX/VgIhAj//+/2o/u3+kv71/Uz9EvxR+Wr2OfXF9Cz0zfTg9q34WPmh+Qz7s/3H/0YA3/+Q/4H/JP9q/uX9d/1r/Oj6ovkK+U/5Gvo5+xP9Wv/dACAB5QAwATkCRwOYA4UDLgScBXoG3wVTBOsCMwILAgkCBgL9AbQBTQGjAQYDcQQQBYEFKAZHBrgFXwXVBQsHWgiiCGkHOAXiAoQBvQGQArACywE8AM/+Cf6n/Tr91Py0/MP83/wS/Vz9wf0+/o3+Qv40/cn7lfq2+cj4ivce9vT0a/R89Lv0u/Qx9DbzZPJZ8vTys/Mt9Cj0t/M389vywfLJ8pfyAvIi8fbvn+6X7VztyO1K7lPuw+1S7dntFe9b8EPxtvHe8d/x4/Er8nfygPJI8uvxifFO8UrxkPEW8nnyWPL/8RHy+vKL9Cr2YPdH+CH5Fvo5+338rP1p/mr+Ef7o/QP+ZP4J/6H/8f8jAH4ALgE2AnkD0QTsBWUGdgbiBvQHKQkeCuoKoQtQDB8N1A0fDgsOrw0YDYIMCgy8C9wLXwzGDOcM2gzBDNIMSQ0KDm8OSA5LDpEOzA5ID/cPABAyDx8OEw0UDB4LIgphCeEIHggOB1cG7wWUBY4F+gWMBvwGAAefBikGvgUxBX8E3gNIA2sCKAGr/1f+jf0z/cr8I/x++wL7o/pj+mL6t/om+1D7Q/tM+0z77/pd+vz54vnL+X75APmI+CX4wfdu92P3z/eA+OT46fjW+NT4/PhN+cX5d/og+2z7bftx+5P7yfv9+zv8pfwA/fz8rPxg/HX8Dv3v/b/+U//O/0wApgDfAFUBCgKuAjsDrAPUA9ED0QP+A4EECgU2BUYFfQWRBX0F3QXIBpAH5AcSCDcIUQiRCPQIRQmJCZ0JgAlfCTgJFAnnCJ0IgwheCMUHTwecBx8IMAjoB80HYQgmCQ4JZQgfCCAI6Qe7BxEIwwhuCF0GdgTcA24DYwOFBHkF0gRXA74CwgOKBYwGZAZ8BewDhAKXAtEDCAQvA8wDzQRzA3MBcQBf/zH/MwFsA/wDPQMvAjEC7QJfAqcBlAONBrgG9gMxAYwA4wG1AyYFewXaAw4BDf+P/9sB8QJzAsICXQQ7BcsDaQFJAX0ElAhtCnoI9QNBANL9yvma9MLx7/Fp82H1OPcu+Jf4ovmI/OAAnwP/ArgBGgKwAvIBaQBL//P+xf09+rT1OvLa77ful+8w8mb15/do+cD6kPwl/+wB8gN3Be4GDAjrB4oFhAGp/R373fkj+Yz4gfgk+S76j/so/br+OwCSAcwCQwS3BTAHJgkQCxEMwAsRCr8HeAUeA/8ABwAQADMATgDwAFUCyANWBEUEnQS1BfMGqAfOBwMIfgiMCI8HigUVA/0Am/8N/yT/7v7O/Qz8ZPp8+Qz5gfj799/3Q/jd+Eb5gfnx+XL6Yvp3+fP3Ufb19M3zpfKd8enwcPDs7x/vBu7I7IfrjOpT6tPqhesM7Krsou2l7kfvle/m73/wB/EC8ZbwJvCb77vup+317NXsyOyG7HTs2Oyb7bjuOfDU8UXzavQ59QX2JPdP+GT5ivqy+6T8Ff3p/Iv8c/yV/Kj8qPzm/KL9tf7e/xwBWwKSA9EE/gUaB1QIqAn1Cg4MzAw1DWoNfQ2IDXANCQ2NDEkMLgxNDKsM5wzXDOgMSA3ADTYOyg6XD3QQ6hDZEKQQfhAxEKYP5Q4PDkUNkAz7C4oLDgtaClUJOwhJB20GrQU7BQ0F7wSpBFQEIQTuA40DFAOeAjwC1gFJAX4AeP90/pr92PwV/D77bfrV+Vr52vhz+D74LPgd+O33ovd796X3J/jF+BT5Hvkl+TT5Qvk2+Sr5Q/ks+bn4Lvjb9/D3WfjT+Db5c/ma+eT5gfpT+wf8ivwb/ev95P7F/10A0QBXAbwB1gHzATMCWwJuApUCxgLRAqACawKUAiYDtQMBBEYEqQT+BFwFAAavBgoHQAeAB48HdwecB8cHYgfdBtgGnQa+BRYFvAQcBMEDDQQvBPwD/AM3BJkE6gTLBJ4EBQWmBcIFBAUBBNwDBQREA5UCrwIdAqQA3v8UAF8AMQCE/0n/6/9SACsAMwCqAEwB5QE8Ag8CkgEyAdgAWwArAF4APwDL/37/HP+w/r3+VP9RADYBhAGRAdYBGAI2AqMClAOfBB8FtwTiA3ADiAO5A+ADMwSYBG4EkAMHA74DOwVPBpoGLAd0CIwILgbIAzMEqQbKCNYJugkyCBcG9wR3BRMHfQgKCSkJwQhRB9kFwgXGBikI8wnFCr4IVwWmA/EDzwTNBfgGswchBzcFFQNHAjQD0QRWBuoG+ARJAJH6GvY89OvzDfRn9UH3D/eb9c71qvfS+Zz79vyy/pIACAH6//j+Nv8rACYAAv8z/l/8BfhX9G7zRPNJ8/r0Nfj++pv7jvqA+gH9ygDWBFkJuAznDMgKUQhrBo8FcgVoBUsFzARTA1ABEwAQAMwAtQE1AhwCLgIPA3IEFgYzCHUKLAwUDQoN9wtKCsAIzAdlBzsH9gZ0BqUFDQSHART/q/1T/X/9n/2B/TL9lvze+677+PsX/Bb8MfwV/M77rvtl+7L6y/lq+F/28vON8ajvRe747KrrpOod6t7pjeko6ffoJOnU6fDqHexE7YTudu/t7yjwWfBd8Onv2e6A7Unseuv66mfqlun36M3oA+mT6XDqhOvi7JDujPCU8kn0yPWV97D5cftR/LL8Pf34/YL+xP6w/mL+Vv6h/uX+HP9r/8//eQCTAfYCfAQrBvMHxwl2C8AMsQ2TDpQPpRBeEV0R5BCKEDsQpA//DpEOKQ6iDe4MPAztCw4MOgwoDAkMNwxnDE0MNwxmDI8MZgwDDJcL9woRCgQJ0gePBkkFCAT8AvIBpwBO/yD+Nv2K/Or7OPtl+qT5FvmQ+Eb4XfiI+JX4Zvj+94f35fZE9gv2XfYf99v35vfw9lf1K/Rj9LD12PY598b2qPWK9FT0aPVN9+34p/m1+aj5+fkE+9X84P46AIUAXAB1ALwA9QBgARQCuAL6As4CdQJEAisCOQKuAmMDIQTIBEUFuQUhBpwGiAeSCBMJOwl7CYoJKQnPCK4IZgjpB28H9gZoBscFMwXjBMkEgAT4A2sD+wKuAlQC2AGZAXQB1ADm/zn/yv5i/gT+oP0w/cz8bfwW/OD7pvtg+zT79fqh+l767/l9+Vb5N/n5+LH4ePhl+Fn4VPiM+Aj5m/ka+nb60fpZ+wT8xvyv/Zn+Uv/4/6YAIAFWAbQBcAIHAwoD1AL1Al0DrQP4A3wE+gQIBQgFbQXqBV8GEgfJBzkIkwg0CR4KFAvSCykMQgx/DMQMJQ3bDVsOLQ6RDdUMOgwFDHAMnwynC7gKrAowCjEJJQmfCSEJwQdRBt8FtQZyB38Hvgf5B04HCQadBbgGvAezBggFLAUWBioGegZfB+kGewRTApQCdwRRBYwEpQO7AlsBmgAlAdIBgAFlAOX+d/0X/c/9tP5s/5b/9f5M/jn+uv60/98A+AEnA/oDBwMFAOL8Afu3+NH06/Fu8XHx1PHF8//19fZX9yf4tfnQ+y/+ewF4BRQIAwk0CgUM3AwkDMkK3Aj2BckCSwBM/5T/lf8q/0L/kf+i/7T/zAB+A+oGLArlDKYOfw/WD/kP9g+8D6kPBBATEDoPIA5JDT0MkAofCIIFkQNGAowBbQF3AWkBXwF/AYkBDAE3AHr/lP6I/Sz9lf1Q/mP/FACK/zH+gvyT+pj4rfbV9CjzfPGu767tN+vN6Dfn7uXC5F/kr+QD5RrlZuVp5tnnNOl46uDrJO3Y7WbudO978M3we/Cx72bu7exh68/pwOh16KboPekv6mHrzexo7g7wuPGs8x320viE+yj+vwAnAzMFwQbiB80IegnHCb4JdAkICZwITQhJCI8I2gjiCLgIyQg6CckJfgpzC4QMaQ0DDpEOjA/lEBwSARPKE3MUzxTiFMAUThSBE3kSZxFFEAQPwQ1vDNwKKQlmB6EF/ANkAtUAdv9D/j39e/wk/D78i/za/Cb9Zf2B/YL9c/1D/dD8EPwJ++H52PgV+FT3KfaI9NPyL/GM7wfuyezz63jrN+uZ66Xsze0d77jwRPKU89X0SPap97345fkw+0f8G/2g/ez9O/5o/kD+Kf5E/k/+Sv4r/kP+5f5//9f/UAD9AOcB9QICBC4FbgZwBzQI+QjXCdgK7QvwDMgNKw4PDt0NoA36DAIMDgsACpoIDQexBYsETgMNAiQBhADo/0D/rf5U/hX+6v0W/l3+Rf4U/ij+Ff6z/WT9M/3N/AH86fq3+V/45fZ99WX0m/PM8u/xPvGX8APw0O/p7xLwXvDf8Grx7/G58qnzfvRi9Uv28PZr99f3KPhN+GH4hfii+KL4xfgf+Vn5b/mx+SL6r/o6+777lfyx/a/+rP/wAE0CjQP1BKkGAQjFCLgJ8AqgCwsM8Ay8DckN1A0tDiEOuA1uDTUN/QycDAcMpQttC+UKYApJCnUKygocCzcLkwsSDB0MHgyXDPAMzAyZDHQMIQy+C2cL6AolClkJrQjkB8wGvgXNBLID7ALDAoECxwGkAK7/jv/s/0cAcAAjAJr/dv/L/y0AmQBAAbEBbwE3AdcBLQJ8ASQBbAGpAQICIgKuAcMA1/8LAFwBcQK6AvYClwOQA7cCLQNVBagGewa4BngHbAeXB0MJugp8CqAJHgmuCOUHUwcqCLwJhwlCB5sFTgbbB5EHSwWsAwcDsAAF/Tz7N/tb+ob4Jffk9u/35/n6+1P9iv2D/aP+IwEqBO4GCQnYCoYMNA0iDd4N7Q40DrQLKAmOB5AGLQXYA4kDGgO5AZMANwDz/6z/xwD7Av0DAwSiBEMFXgXTBRMHsgjmCRwKHQqoCroK1Am8CHkHoAWbA2MCrQE5AGP+3/wY+wf5GPfs9JPyyfB8713uyu3g7WbuGe+q7xTwg/AH8dfxwPIi82nzO/Rv9EPz2vHv8MrvFu5n7CrrIOro6HvnQuZ45fHkkuR35MDkpOUe5/DoG+ud7Q3wWvKx9Kz2DPhl+QX7vPxk/g4AtQEMA68DzgPnAxoEQwQiBIwDBwMBAxkDGgM3A28DpQP2A30EOAUTBgUHDgg1CX0K8AthDa4O+w86ERQSqRI2E2oTCROJEiYSaxExENAOcw3uCxQKGAhsBhYFnAP1AXQASf+D/gv+t/21/fr9Qv6f/hv/c/+J/5z/zP/j/8r/qv9f/6H+cP0j/O36yvm1+JX3JPZ+9P7yv/HL8D7w9e+p71fvQ++K7xPwvfB78V7yfPPJ9Dz2u/c1+av69/tE/eb+gQCxAbUChgO+A7ED1QMNBEUEdQRsBAMESwOrAkMC9AEKAoECzQLZAiMD3gPDBL0F9wYpCPwIkwklCp4K0QrGCrkKlQr6CQ0JPghjB0UGNQVIBEADJQIcAf3/qf5g/VD8Uvtf+qL5Ifmy+Cz4f/fY9lf24vWi9c31BPYF9gP2KfaI9in35fd6+Jf4Ovi291T39vZ49uH1TPWl9MXzy/IT8qzxbvFC8SzxRfGn8Tby5PLT8w/1iPYs+NH5VPug/Kr9hf4//9X/WQDLABQBOQFdAYoBrwHWARwCZwJwAl0CgQLPAjMDpAMRBJsEKQWUBf4FawajBq8GyAYBBz8HcAeeB9QH+AcFCCoIfAjJCO0IAAkkCT4JQQlbCY0JdgkWCcMIbAjoB1cH2QZzBhMGugVmBfEEWwTrA6oDXwMEA80CsQJ1AvwBkwGPAcEBxAGxAe8BZAKIAo4CMQMFBPcDxAOABD4FaAWzBe0FfAXSBKoE+ARgBagFdQVfBAMDtgI3A6wDogTEBeMFkQXrBagG+ga0BpYGYQc7COgHSgdpB4MHFwcOB7sH6AdEB/IGxAYQBtUFywbnB0sIKwj3B+YHoAcGB+4GSwcRB18GIwY9BqwFnQRSBLgEnwTDA+QCmgJ5Aq0BTQAA/8b9TPyv+jX55fe99vr16PVB9rn2z/d2+cX6pfsl/ab/CwLnA0AGEgltCzINfg4/D7gP8A+iDxsPjg68DZwMPQtRCgwKPQncB54GVgUxBEwDgAL3AY4BCgGKACcA9f8HAEoAkgDWADMB8wHlAoAD9QNjBHkEmATrBK4E1gM3A+AC6wEqAEP+Svzt+WX36vRe8tzv0O0n7G3q+Ohe6Bnokucb5xHnQ+eb5znoJuku6h3r+esF7Sju9+6E7yzwxvBL8crxMvKq8j7zuPMb9Hr03PQp9WH1ofXa9ev1D/Zl9q/22fYs98j3kfhl+XP6+vuh/Tf/DwEUAwMF+Ab6CNoKfgz5DVQPiRCqEa8SaRPOE+UTrRM7E8MSWBLpEU4RdRCKD9UONA5VDU8MWQs9CucIqwewBr0FyAT6A1oD1QKFAnoCagI/AkgCYgJJAk8CrwIRAxQDzQJ2AvUBHQEjAD3/QP7b/Df7vfl2+Dv3Ava39IfzjPKN8aDwGPDW75Tvae9576bv8e9x8ADxh/Ez8gnz+vP09P71I/dB+Fr5h/qU+4H8ff14/lH/7v91AB0BpgHdAQICQgJhAjgCJgJpAqMCrgLpAj8DWwNnA6kD/wNTBK4EDQVwBcgFAQY/BpoG2AbWBukGKwc2B/sG0Aa+BqIGegZFBuMFNwVLBDMDFgIpAWMAkP+d/nf9+Ptd+hf5Hvg79132rvU59Yr0w/OS87DzpfOy8+nz+vPu8/7zNvSA9MP0/PRB9XD1afVM9UL1UPV89cX1IPZ/9tH28vbw9vz2EfcK9wr3LfdW92b3afd497n3IviB+Mv4Nfne+af6XPsT/AD9Ff4l/x4A/gDNAYwCMgPCAz8EqAQdBaAF6wXuBfQFHwZGBm4GrQbQBskG5QYXBwgH5Ab5BgUH2Qa/BtUG5gbwBgAHBgcAB/EG2QbPBrYGjgaFBpcGwAbrBtwGvga8BpoGQAbsBbQFjQV4BVUFCQWjBEwEJgQBBMsDrgOYA3ADVANKA0MDSgN9A9gDIwQiBNMDlQPGAygEggTUBL8EMwT+A6QEUQUABbsEnwViBjgGZwY5B3sH5QaKBhIH3QcKCP4HPQghCKgH4AeKCGkIrQfGB1MIxwfUBt8GQwdGB0IHTgdMB14HIQdrBs0FjQW6BW8G7wZQBhsFzQR/BdcFaAUWBRMF1wR6BOsDOAMyA1ADqgISAhAC2AEUAYUAYwC7/8j+2f7s/ib9JPv7+gb77/mH+Yz6Wvtg+7r7zvze/YH+Zf8jAQIDCQTcBIMGsgh6CpMLUww4DRQOPA4aDpIOGA8ZDxMPBQ+qDjYO0Q1ADQkMhQpnCUgIuAYkBfED8gKoAQsAk/5t/Xj8wPs4+7P6XPpY+lH6BPq1+c35Mfpo+mr6Vvo3+iL6+fml+Uf5s/je9+T2yvWz9NvzPvOZ8rnx5vAy8ErvIe757Nvrsep/6YTo0udT5/PmneZO5jjmaebX5oHnceig6Qvrrux07j/wKfI89Ff2YPhV+kP8LP7p/4EBLAPbBEAGUwc6CP8IpQlICg4L4wt2DMkMAQ38DKsMPAzbC4ULLwvcCocKKArqCd4JzwmpCZoJlQmJCZwJ3AkqCp0KTQsWDL4MLg1pDW4NQQ0gDQsNuQxCDNwLTAt2CoMJaQgXB7YFVgTfAlUBx/9J/uH8b/vp+W/4G/fj9aP0VPMt8mbx+vDD8Jvwe/B18IbwqPDp8D3xsfFM8uryd/MQ9Ln0YvX09Vn2pPYG93f33/dA+LT4Ovmc+eH5O/qJ+sb6Dvtd+6377Pso/Jj8J/2v/Sr+nv4p/9X/iABKATcCKgP/A84ElgVBBtoGdAf4B0sIowgdCWkJdgl5CWgJLwnhCIUI/wdiB/AGeQauBdIEDAQwAz4CSgFNAEn/Rv5I/U78S/tc+p351vj591r35PZU9sf1Z/Ud9dL0iPRS9Df0HvT68+nz3vPM887z7vP/8/DzxPOT84bzpPO/88bzyfPp8w/0JPRJ9Iz0zPT69BP1N/V19b31DPZ29vH2cff294f4Lfnn+Z36W/sl/O38uf2L/k//AgCkAEQB7wGJAgEDZgO4A+0DIARpBK4E0wTsBA8FLwU4BT8FaAWwBdwF0wXFBd4F+gX/BQkGHgYiBhkGEwYlBkkGWAZgBoUGjwZpBlsGgAaOBmcGQQYtBg0G6wXKBZcFVgUiBd4EcQQoBCsEEATKA8kD6gO9A4ADlwPgAwoEAgT/A0AEmQSjBGcEVQSIBLUErASpBNYE2ASSBKUEEAUNBb4E4AQiBfsE1wQNBUEFLQUiBXwFvgV7BUsFtgU8BjQG7QUYBo4GsgbLBnAHHggfCLgHgQfOB3II2QjMCHsIPQg+CD0IDQj0By8IbQg3CLgHdwd/B4UHiQdrBwgHxgbmBtgGRAaZBW0FmQVTBWwEqwN+A0oDfwK2AXkBJQFnAAIA+/+I//L+sP4//on9Kf1F/Vz93fz4+4P7sfv6+1D86PyA/f/9iP40/wkAAwElAjkDDQQbBb0GOQjgCEUJHApDCy8MmgzMDPQMGg13DcINzQ3yDfkNcg2JDJULswrVCeMIzweXBj8F1gN2AikB2P9j/sz8d/uv+sf5Svgu9+T2aPaJ9SH1HPXt9LT0kvSA9IX0ifSS9K70ovR09G70efRS9DT0TPRd9Dv0DvTS827z8/KC8gryk/Ey8dXwV/DQ71rv++6t7m3uOO4X7gXuD+5K7rnuS+8D8PnwGvIe8x/0XvW99hP4gfka+7P8NP7V/6kBYQP4BMkGnQgMCmEL1wwkDjwPSxAwEdMRQxKSEtISBRPuEowSHBKeEekQHBBSD3wOng3FDNgL2QrtCSIJWAh9B5wG1wUtBYMExAMBA2IC/AG/AZYBXQEXAfMA/gAiATwBLQENAREBGAHxALcAdwAXAKn/Sf/i/k3+k/3F/Nn72foF+lX5dfh596/24PXt9CP0jPPW8gfyTvG78Ejw2O9t70XvT+9R73Pv5e9n8N/wg/Fh8lvzcPSj9d32H/h5+b363/sj/X/+y/8gAWYCkgOwBLQFoAZwBx0IwwhhCdYJLwqICs0K3Qq7CnsKLQq4CQ4JSAiAB7kG6QUaBWUEpAO9AtoB/AAKADH/lP71/Tn9qvxR/Nn7TPvk+pj6VPoS+rv5Y/ks+Qr58vjk+Mn4tvih+Gf4Ovgt+BH48vfa9633YPcP99L2pvZp9hP2vPV49T71BvXE9H30RPQg9PfzyPOl84/zdvN4857zyPP08zP0hvTn9Dr1h/X49Y/2J/fD92X4CfnC+ZP6TPvv+7H8j/1J/uD+hv82AOgAqgFXAuMCdAMRBJ8EDAVhBbQFDQZkBq4G5QYNBzQHVQdbB1cHTQc5ByEH8wapBmUGNQYDBrkFcQU+BQoFxwSaBH8ESgQVBAkEAATpA+UD9gMTBEQEdQScBMkE/gQ4BXoFsAXgBR4GXAaNBr8G2QbkBhoHTQcqB+0G4gbnBr8GfQY+BgIGyQWTBU8F8wR9BBoE2QOQA0ID9AKcAmgCRgL3AagBlAGUAYUBfgGHAXsBcwG6AUgCtQLMAt0CQAPUA1QEqgT8BIwFPQaCBoAG+gbRB0sIaghxCKwIOgmdCY4JeQmgCeUJ6wmQCSQJ1wiVCIcImggmCDMHtwa/BmgGjgXXBHgEFQRoA9ECuwKtAiACjAFkAUMB7QDGAK0AOgDl/xMAGACa/0L/cP/B/7//Wf8a/4n/TwDFAOcAIAG8AYgCDAM9A54DeAR2BS0GpwY5BwAItwgeCVEJpgknCoMKlgqICpMK2QoVC/EKcwrjCXkJ+ggNCPYGEAZRBXoEZwNHAkwBTAAf/+n9x/yz+8D68Pka+SD4LPeF9g32d/XM9D/01fOC8y/z2fKU8m7yU/I48hXy8PHb8d/x6fH88SPyXvKZ8qfyefJh8oDyiPJm8l7ycPJ18nXyg/Ka8sLy6/IO8zfzZPON88zzLfSm9Dn12PVt9gz3wPd++ED5EPr1+un75/zv/f/+GQBHAYMCwQP8BD0GegebCKIJrQq6C7gMoQ10DioP1Q94EPkQTxGVEc0R5hHPEZURUREWEckQThDBD0APqg7mDQ8NNQxCC0oKZgl7CHcHgQajBccE4gP4Ah4CZgGsAN3/JP+Q/gf+kv0q/br8R/zY+2z7EfvN+o76T/oc+vP5wPmK+WH5P/kP+dn4pfh++GD4NvgG+OX3vveK90z3+vag9ln2Ivb09cr1pfWB9V/1Q/U59TP1IfUe9Tb1XPWU9dr1JfZ59uj2fPcW+Kz4Tfnw+aj6fftX/Ej9WP5j/1sARgE6Aj4DMQQIBe4F1AaRB0MI9Ah2CdUJKgprCowKkAp2CjoK5Ql3CfQIaAi4B84GzgXKBKwDgAJWASkA/P7a/bf8jftt+mL5Xvhm94/21/Ut9Zr0IfTG85HzbvNS80/zV/Nu85/z3vMl9Hz03fRJ9av1BvZp9tD2Ifdg95z33vca+ET4Xfhp+F/4V/hK+Cb4//fh9673cvc99xL38/bg9tD2xfbB9sj27/Y194T32vc++Lz4XfkR+rz6b/tG/Cv9BP7q/u//9ADsAeAC0wPABK4FkQZUB/IHhAgYCZMJ4wkpCmgKjgqnCq8KhwpLChgK1gmECSwJwAhZCAoIuwdSB+AGhAZHBu8FfwVIBS0F4AS2BMoErARzBIoEywT3BA4FDAUjBXcFwgX8BUgGiQaoBtEGDgc3B0UHSAczByEHNQdBBwQHrAZzBj0G+QW0BWQFAgWJBAkEsgOBAzQDuQJHAgYC3gGcATUB5QDlABYBJwEJAfkAMgGgAfoBMQKDAgwDlwPhAyAEuAR6BeIF8gU+Bg0HyAfwB+8HQwjBCAcJDgkUCSwJPQk5CQ4JsghhCF0IbggcCF8HsgZjBicGnwXyBH0EMgTNAzMDhgIOAuABrwFQAcwAVAAOAOX/sP9d/wn/4/7Z/rn+jf5p/lr+jP78/l7/oP/l/zUAogAyAc0BUAK+AlMDHgTNBFoFEAa1BggHggc1CJMIqgjuCDwJYwmECaEJrAmYCTwJrgg3CMIHJweCBr8FygTgAwoDHAITAfX/yf62/b78r/uL+oj5tPjj9/X2AvY29Z70FfRx88jyaPJP8ijy1vGV8X/xevF98ZLxtfHr8S/yePLL8ivzhfPV8xv0XPSh9Pb0SfWN9cz1FPZW9oP2nva99uL2/PYD9xH3NPdc93n3mPfI9/v3I/hW+Kn4FPmC+fH5evoh+8z7gvxV/TP+Dv/3//cADQI1A18EhQWiBrIHvgjRCdUKvAuYDHoNVw4YD7EPNBCeEO4QGxEPEd4QqxBdEOQPUg+4DgoOQA1XDFcLOQoNCf8H7wasBX8EiAOCAm8BgACa/6j+xf36/Ev8uPsr+676VPoF+rn5ivly+VP5PvlI+Vv5a/mO+cn5Avoq+kL6TPpY+m36gvqN+ob6aPpL+j76KPrr+ZX5Pfnm+I74O/jm95X3VvcZ9832ivZe9jn2F/YM9hn2NfZh9qz2FveO9xL4svhr+Tb6EPv0+9v80P3b/uT/5wDrAeIC2gPbBMQFkwZXB/wHgAj/CHsJwQnOCeAJ6wm9CYQJVAnaCCoIkgfmBhMGNwVDBD8DNgIgARIABf/n/db81/vJ+tL5D/k++F/3sPYf9oL18fSK9EP0DPTN84/zffOX87bz4fMV9Ef0jPTs9EP1nPUW9pT27PZD97D3E/hf+LX4C/lH+Wv5ifmn+cb51/nN+bD5mPmV+ZX5avkw+Rj5FfkP+QD58Pjw+Ar5MflX+YD5uPkS+ob68/pU+9H7g/xC/ej9lP5a/yIA9gDgAbgCdAM+BBkF5wWTBiEHswdZCNwIJgloCbUJ7AkWCjkKHArSCb0JuQloCfMIpAhZCP8HoQc2B8sGfAYoBssFewU5BfoE2QTOBLIElwS2BO8ECgUoBXAFugX+BVcGtwYDB0UHiwfcBy4IZQh7CIQIhAioCNkIqAhCCA8I2Ad9BxoHiwbgBW8FGAWABL8DHgO1AmIC1AEIAV4ADQDw/8H/Vf/3/gr/Pv8o/xv/eP/6/y8AJQBlAEcBNAKXArQCDwPfA+QEgAWCBYQFMwY+B8EHtge7BxMImwjfCJMIKwgwCGUIOAiYBwwHAgckB6IGfgWvBLcEwATtA7oCFQITAiQCuAHJABkAOACEACUAPv+u/g//vv+A/5P+Uv4B/4H/Ov/K/sf+Mv/W/0wAUgBqABkB/AGKAs0CKAPnA7YECgVPBS0GOQe6B9IHCAiBCAQJRwlCCSIJGQlFCWUJMwnICGAIEgidB8YG3gUlBWgEdgNjAlkBfwC3/6v+X/0T/On6C/pe+Wv4N/dM9tX1Z/XI9Bv0jfMj89PyhfIs8vDxCfJC8i/yBPJD8qvyyfLF8u3yOfOU8+3zQfSY9OD0CfVD9YP1nPWq9dL17fUD9j72gPag9rX2z/bv9hH3LvdK94j35/dE+KX4L/nU+XP6Cfuc+zn88/zV/cX+sv+6AOEBBwMsBFkFgQaeB7MIwgnTCt4LzwyyDZ0ObA8LEJcQGBFlEYgRqhG6EZQRWREYEbYQLhCVD+QOHQ5GDVoMWgtUCkkJOgguBxgG7ATCA6gCrwHMANb/2v4N/lv9svwg/JH7+Pp9+iD6uPlW+Rr5/fjl+Mn4ufi++M342/js+P34B/kR+Sj5Tfli+WP5a/l1+V/5P/k0+Sz5A/nN+J74afgt+BX4CvjK94P3f/eB92T3ZPeF95P3oPfL9xL4avjG+Cz5vflq+g77xPui/IL9Yf5G/yUAJAE+AjkDHgQSBfkFwwaJB0QI2whTCbcJAQoqCjgKKQryCZcJKAmiCPAHHQdDBl0FYARTAzQC/QC+/3n+NP0D/NT6m/lw+GH3b/ai9ef0L/SG8/Pyf/JC8hby4fG28a7xyPH78TbyfvLT8ivzc/PA8yX0mfQJ9Xf1x/UI9nj2AfdH92/3vvcD+Bb4Nfhh+HP4hPiq+MD4wvjN+PD4H/lC+Vn5gvm1+ff5a/rc+iP7ivse/Kr8Of3Z/Xf+H//d/5oAUgEIAr8CgQM9BNsEcAUJBpsGIweLB8cHEwh6CKwImAiFCIEIegheCBYIugdvByAHvgZQBtcFXAX2BJYEHASeA0oDCgOvAlsCMAIDAt4B3AHNAbIBzgEKAjQCUgKHAt8CPQN5A7oDJQSCBMAEGAWKBeYFFAY5BnYGrgbSBvAG9gbdBsgG0wbMBoQGKgYVBigG9wVrBe4EzgTLBIsEIwTdA8ADnANQA/QCzgLnAu4CqQJRAkQCjgLSArcCdwKiAioDdQNhA2EDrAMeBHsEqgTBBPgEbgXsBRcGGQZoBhMHoAfBB8UHBQhpCL4I5AjrCAkJOAlACTkJLgnhCIsIfwhaCNUHPQe6BioGsgVwBREFHwQFA8cC1gL1AdsAbQAoAKj/Hf+u/mn+Lv7I/V79J/0a/VP9v/3z/QT+k/6n/30A6ACBAYACpgOmBFMF9wUEB04IWwkJCooKHQvNC0UMUAxEDHQMqgyDDBAMrAtRC74K1AmoCIMHcwY6BdADVQLeAIf/Rf7h/FX73fmc+Hf3QvYM9R/0gfPx8ljy1PGI8WLxT/FX8WzxgvG98SjymPLp8jXzmfME9Fb0qPQL9W/1sPXX9f/1KvY69in2+PW19Wb1F/XP9JL0WPQf9N7znPNq81rzcPOa88PzEPSk9GT1LvYW9yD4Pfl9+uT7S/22/k0A+wGaAzoF8AamCD4KuAsiDWoOmg/fEAUSuBI/E9MTMhRDFDIU8BN4E+ESIRI2EUAQNw8UDtsMfwsJCp8IOgfWBYYEMwPPAYwAgP+M/pr9s/zh+zL7pvot+sj5hvln+Vn5X/mG+b357vkr+nr6u/ry+j37gvuh+6/7xPvN+8j7r/t6+z37Afu4+mb6APqD+Qb5nvg6+MX3V/cJ98L2ifaB9pX2n/at9tf2JveX9yX4xviB+Wb6ePuu/PH9If9OAJEB4QIzBHIFjwaXB5oInQmECjgLxgsuDG0Migx7DEcM/QudCx0LagqKCZwInQd6BkAFAAS3AmcBEQC3/mz9Lfz0+s/5v/i+98/2BfZy9fv0f/Qc9OTzxPO086vzivNw84jzu/Pi8/nzGPRJ9G/0hvSZ9K70yfTT9Mf0wPS79Ln0tPSf9If0gvR49Gv0bvR09H/0r/T59FX1vPUk9qL2N/fa95T4UfkN+tz6wfuj/HD9PP4f//r/tABcAf0BkwIhA5kD7gMnBFcEgwSXBH0ENwTjA5sDVQP1AoECDAKKAfsAigA1AMP/O//b/qT+a/4r/g/+I/5D/k3+ZP6h/uj+N/+b//X/RwCvAB8BfwHdATACbAKkAtwCBgMmA0cDZQNjA0sDNAMNA9cCtAKGAjIC/AHyAb4BcAFmAXMBVQFXAXYBdQGBAcQBIAJ8AtUCPAO1Ax0EiwQmBZUFuAUNBqoGGQcuBzEHaQetB74HuwfRB+IH2wfaB9cHpgd3B4oHvAfKB48HNgc6B30HeQdKB2UHqweqB2IHMwc4B0IHLgcBB+YG9wbbBk8GxAWYBVUFyQR4BEUEdQNwAjUCUwLZARkBmQBlAE4ACgDM/9T/uv+R/+b/aABtAEwAogA2AYgBogHkAWQC0ALhAsMC1gIRAw8DuwKDApECjQJaAg4CrAFYASMB/QC0ADYADQBnAHkACwD0/6YAngFSArUCUgOMBPEFDQcWCFIJtQr6Cw8NCw4NDywQLRGdEcMRPBKaEkISrhEYEVUQhA+MDkoN1wtVCtcIHgcVBTEDfgGR/4b9vPsN+lf44vas9W/0N/NG8rfxYPH58IfwbvC08PHwM/Gy8R3yevIO85vz5fMj9Hz0yvTT9L70pvSC9FT0EfS2827zKPPL8nDyIfLN8YzxcPFv8YPxqfHz8YLyPPP88+P0EfZ29wD5qPpf/Cr+IQA6AkcELgYLCPYJzQt5DQAPYhCYEaISbhP4E0UURxQSFLoTIxNVEngRnRCdD2EOEg3FC18K+girB1UGCAX7AxEDJwJYAbUAEwBz/+v+dv4c/tz9o/1+/XP9Yv0//RH9xfxP/Mv7Rvu9+jT6rfkR+WD4r/f69if2SfV39LHzBvOb8m7yYPJh8onyzvIM81zz8vOs9GL1U/al9wr5Yvrf+2j9yv4UAEcBcQKyA/wEOQZmB34IgAlnCg4LbQuqC88LzAu2C6kLqQuoC4sLQAvbCloKzAlFCcEIQgjXB4cHZAdEB/gGnAZCBr8FDgVdBMcDRgPQAkYCiwGwAMz/1v60/Wn8EPvF+Yb4Tfcc9gP18/PR8rDxnfB572jumO327HPsIOwO7CvsPexV7JPs9+yJ7T/uG+818GjxmPLc8yH1RvZy96j4sPmP+oX7jfx6/T/+9P6Q/wYAXwCUAKcAsgC5AMcA1ADZAOsA6QC9AIsAXwAzAPf/nP9P/zf/K/8A/7z+hP5j/kz+Lv79/cH9nv2a/YX9W/09/Rn92vyb/Fr89vuQ+077Cvud+iz63/mo+Wb5DPmt+GP4Q/hZ+Hf4ffil+AX5Xfm3+T36uPon+9L7ofxi/RH+sv5f/xIAqwA8Ab8BHgJzAtICFAMxA1IDbQNlA08DOAMJA9UCuAKvAq4CsQK9AtQC/wJTA7gDDgR+BC8F3wVfBu4GtAdpCNsINAmWCe4JLApGCkEKLAoUCuIJeQnuCHgIBQhiB6EG5QU4BbsEWATDAykD8QLUAoACOAIUAukB1QEIAnACzQL4AgYDNAOkA1sE0wSgBKAEPAV0BTEFUwWmBagFlwVcBdEEbgRcBFcEIgSmAzQD+gLKApsCXALgAZ0BDgJxAg0CoQHqAVECEAJ/AXEBBwKSArQCrgKnArgCFQNzA04D6wIHA1IDDQOnAr0CGAOEA9YD5APgA9cDrQOeA+cDYwTlBHUF1gXUBe4FrgZcB20H9AdFCSUKnAqTC50MIQ2xDXgOEQ9iD3gPfw+SD3IPJw/YDnAO0w3bDGwL7gnMCI4H5wWsBBQEGAOQARYAuP5m/fn7hPpr+X/4ePee9vD1GvVl9A/0r/MP82fy9PHG8aHxd/F18bnxCvLn8W/xOPEb8dHwjvB28FjwOvBf8JTwbvBZ8MXwPPGN8SXyBvMG9FL1x/Yn+KX5R/vK/Bj+W/+/ACgCcQPhBHMGlQd4CLkJ1gpFC5wLMQyVDLkM4AwaDWANcQ00De4MogwYDGYLtwoiCqkJKAmNCBgI0QdiB8wGVgbYBR0FZQTYA1QDwwI1ArIBCAEaAA3/8f3F/Kn7o/qR+YT4m/fD9uz1LfWH9PDzZfP/8sbyqvKl8rzy/fJs8/fzgfQF9ab1c/Y79wP4EvlF+ln7dvyx/c3+xP+6ALEBswKnA24EIAXKBVoGyQYeB3wH5QcOCPYHEghiCJYIyQghCWsJiAmVCaoJswmlCZoJpwmzCX4JEwnBCHoIBQhxB8oGAgYvBWYElgPAAvwBJAEDAM7+yv3S/K77Zvon+RP4JfdD9mH1d/SM88XyJPKR8Rzx7PD08BLxLvFP8ZLx+vFr8tryR/O680T07PSP9R32qvZJ9+H3Y/jr+Jb5Rfra+m37GfzO/HT9Cf6V/gv/b//b/0cAlgDkAFcBxwH2AQYCGQL/Ac8B0QHIAX0BJAHVAHQA/v+A//P+S/6T/c78Avw++2z6jfnN+DD4m/cL94v2LPb09cj1q/XB9ff1K/Zu9sT2K/eR9/f3gfgO+Wz5sfnr+SL6XPqH+qf62PoK+yT7Pftl+6f7CPxn/ML8JP2A/eH9Qv6X/vn+af/A/w8AlgAvAW0BfgHjAW8CpAKxAuMCCAMbA1IDgQOAA2oDXwNiA2IDUANMA14DWQM5AyADMAOEA8sDywPcAykEbQSbBNQEJgWLBcUFqAV8BVoFFgXFBJ4EqARwBMMDNAMBA74CVwIJAskBmQF9AVkBUAGCAZ0BfQFrAZgB6QErAl4CtAL9AusC8wJ+AwcERwSNBPAEFgXPBJoE+ASVBeAF2wXIBZoFOgXJBJAEoAS0BJ4EgQSABJYElgRrBEcEYgSxBOoExARqBIUEVwU2BoMGlAb4BkQHtwbdBeAFcwaUBmsGYgYTBnsFAwWXBO0DHgNuAgYC1gGZAS4B2ADLAPQATQHAAeEBxgEyAgUDWwOSA34EiwXmBf4FSgZvBm4GwAZVBxwIUwmlCoELFgzpDM0NKA51DkEPkw8PDyYP+Q/xD/EO9g1FDZMM/QqzCPsGvAV9BGwDYAIzASYAYv9S/nX8r/rk+W35jvib9xT3APfl9iP2EPV39Bv0ufN18ynzsfJR8lDyY/L08WvxX/Fy8S7xuPBj8HHw2vBI8Yzx2/Fr8j7zHfTg9Mv1Qvca+en6jPwY/r3/egHoAvgDHgVgBlAH7weKCAQJNQldCZYJmAlfCSUJ6AiMCEMIKQgKCOIHAgg5CBoI6QcFCAoIvQd5B2UHTQf2BmUG6wWCBdYE/AMxA1oCbgGHAI//jv6J/VX8F/sU+iP5DPjw9vz1H/VS9LTzQfPi8qryrPLQ8hPzpPOC9HP1aPZ094f4mfnO+h/8P/0a/uz+4//KAFQBwwF6AigDbAOkAzUE4gRgBdMFZwYOB7oHYgjwCG8J9wlxCtIKMAthC2sLjQukC2kL+Qp4CvMJdwnuCCcILAdCBmQFUgQgAwsC+gCy/0P+1Pxf+/P5rvh090H2OfVU9KTzHvOt8nnyWPJL8pDyz/L18nrzRvTT9Bz1dfX69XD2sPbb9hT3Pfda96L3Evh3+NL4UfkB+sD6fvsw/NL8e/08/g//8//vAO8B4AK1A1oE8QSYBRsGWQaUBvIGLwf/BoAG+gVyBdEENAR0A1kCDgG3/2P+JP3I+2X6Qfkz+CD3Q/au9Tz15/Ss9HX0XfSL9NT04PTd9Cr1gvWd9cj19fXd9aL1g/V09Vb1G/X69Br1P/VQ9X/1ufUW9rP2XPcG+MX4kvl0+mD7P/wY/ez9of5G//3/vABbAbcB8wFeAtYC+ALiAvUCDAPXAoICYAJuAmsCLQLUAZkBfwFsAU0BGgHtANQAyQDZAP0ASwHJAScCSQJ5AroC2wLnAvwCGgMqAw8D4wLEAn8CDwLDAZUBOgG/AKUA3ADJAJkAyQAEAQ4BTgGtAfYBeQLqAvYCIQOPA8QDpQOYA8kDxgOVA9QDTgRFBN4DlgNqA0ADLANkAxUEigRLBFUECwUMBScEKQQ3BU8FgQTUBI8FTwTfAigEHwYpBtkFagZJBvEEGgTwBHkGzAY8Bp4GVAd7Bv0ECAV+BnMH9gbnBZ8F8wXNBaEFiAZ+BwUHewX0AxoDHAOCA5QD9gJEAtkB3gBW/2P+Qf5L/iP+G/6E/lf/eACNASUCkAJhA4QETwW9BbwGhgiyCXgJEAmECVsK5woPC20LiAzgDc8Olw9pEPgQShFrERMRgRBPEJIQjhDVDwkPLw6LDGYKLggFBjcEmALdACn/6P08/WD8CfvY+cn4gvc29if1ZPQE9LXzRPPh8lryufFP8bPw/O+d73jvcO9W7xLvC+9H74Lvou+y79DvOfDb8IDxPfJM86L0AfY091D4i/kL++X89f7QAI0CmgSYBvUH9QjaCXgKugrQCuIK3wq+CpIKMgqOCSMJ7whfCMwHxgfBB3IHTAd2B64H1gfyBwoIGggHCLQHMweRBsYF2gTGA4ICMAHh/4n+TP09/Bv7x/l4+GL3ffar9eP0RPTn87rzovOh877z+/Nh9PP0pvVq9jn3BfjP+ML57PoI/Pv86/3o/tz/rABXAfYBkQIeA5MD7wNbBOkEcQXiBW4GJAfSB24IGAnACVcK+QqiCyEMcAyrDNYM0wyGDPsLXwu8CvUJ6QiMByAGzARiA+8BrQCC/zz+6Pyk+2/6VPli+Ib3u/YY9o71FPWh9EP0HvQV9Aj0DPQY9DD0d/Td9Cn1WfWX9fv1afa19un2Lfd39733GPiN+PP4Pfmd+Tn6+/rN+6/8lf2G/pD/nQCiAbACvAO+BMsFyAaJBwoIWgh5CGgIHAihBw0HPwY2BSQE8gKvAYoAcP9L/hD9yvuW+mr5SPhe97T2M/bd9aH1Z/U+9Rr1A/UT9ST1MPU+9SP19fT49BL1AvXH9Jv0jfRu9DD0D/QC9OPz7vM59Jz0EvWM9SX27vbF9674wPng+uv73PzX/c/+qP+IAH0BNwKsAhcDYwNRAxkD/QK8AkkC9AGMAdEAHgCp/yn/mv4l/sH9fP1U/S79Gf0g/T39ef3G/RP+cv7A/tj+Cv+P/xIAWQCAAIkAbwBXAEcAMQAsAFAAdwBgABoA+P8RAB0A9//h/xUAbwClANYAawFMAvUCSAOaAyoE2gReBbQFGwabBvYGGAchBzoHUwcfB6QGSAYnBuoFVAXjBM0EnQScBAoFOgUBBckEBQV/BVIFuQTzBDcGZweABxsHwwaeBRwEGAT4BIUE4AJ8AXcAmf9a/zkAvwGZAkMC1wEIAkUClALoAyAGwQfOB/EGQgb3Bd8FzgWjBYEFQwV3BEgDZwINAu4BIwLrAnMD/wKkApYD7QR7Bc4FbwbLBu0GRwdOB7MGCQaGBTcFYQWrBXMFQAXUBUgGUAVWBIYFDAd/BhIGZAftBwgHWgdACVkLRQ3bDmMQyxETEv4R6RKaE9cS7RGhETMRZRBAD8ANtQtLCSAHwAQiAggAVv5C/a78pPuV+hb6Y/lh+Mn3XPeW9gH26fW99Sv1x/TO9GT0gvPU8gzyVfH38Hnw+e+2737vUu8v7y3ve+/Y7y7w8PDq8dPyZPR99uz3Efkk+5r9aP/mAKsCoARiBsYH+ggQCuAKYQuGC0MLwQoiClMJeAjGByYHlQYzBvUFwwWmBY8FegWJBcMF/wUxBlQGYQZpBmAGHAanBRAFHwS3AjIB9v+s/gX9eftE+gP5tvey9vX1QPWq9GL0QvQf9D30xvRX9dz1n/Zk9/b3qvil+aT6jftr/Ej9Jf7I/iz/sP9aANkARAHYAXgC7gJGA6ADFASVBBEFjQUZBr0GYwcACKAIIwmWCTgK8gp3C6ULnguhC4kLLgvIClsKmAmDCHAHXgYIBaMDagIbAav/M/6s/Ej7J/o0+WH4mffp9lX2zfV09Vz1SvUX9eH05PQ59Z31qPV/9Yf1vvXk9QT2L/ZU9mj2f/a89jT3x/dx+CT5yPlx+iH74vvc/AH+K/89ADEBIQL1AqQDYQQbBacFEQZkBoQGbwY1Br0F7AT5AzMDZwJaAWoAh/9l/m/9v/wo/N37n/v9+jj6zfm5+Yz5JvkR+UT51/gC+NL39ffA9zv3fPbD9Vj1MPVA9Vr1JvW99Kb03vT89A71X/W+9Qr2sfaN9/P3cPhu+Sv6jPoS+6j7N/zp/K/9Uf7I/hX/QP9z/7f/zv+x/4n/Xv8n//v+7P74/u/+lf4T/tn96/3y/cL9hv2C/av9zf3q/RP+PP49/h7+Cv77/ej92f2a/Rr9zvzl/Ov8yvy0/JH8YPxC/Ff8qPwC/WH9Af7G/lL/vP9pAGMBXQIJA0ADFAPtAj8D0wM7BF0E9QNTA0cDnAO5A3UDDAMNA2IDrQO+A3YDdwPnA+wDxgMkBFMExQNQA2UDcgMoA8QCrwIYA48DcgOtAuUB4gG6ArgDRwQ7BL8DsgPmBHMGpAZ4BU4E0QNbAzYCjAG4AjMELQSIA5ADxwO/A7UEUAamBtAGMginCDwHXwZGB90IvwnDCAcH5gbYBwcIVgeJBk4Gqgb/BnwGKQVaBIgEkQQfBPEDJwRJBAQELQNhAmwC7QIMA4sC9AHSAW0BiwCWAMYBzgLPAwUF7gTUA3IEhQZRBzEH8gfuCAQJWgjUB4sInAoSDZYP2hH8ElYTDhRlFKkTShPGE7MTvhJ+EU4QJQ9uDTELwQjnBaECd/94/Yv8OPsQ+nP6iPqo+BH39vYy9pX0CPQK9FvzuvKZ8iryYPGu8Azwh+8K72XuOO6V7vbud++z77LvaPBT8cHxSPIc8/fzIfWj9g/4d/kX++b80/6QAAoCrgN9BQgHUghyCUgKBQu5C/ELnAsaC2MKVwlHCHsH5QZxBgYGkQU3BUAFiAWfBaUF8AUrBvcFkAVLBQYFowRWBP8DWwOBAngBRgD//oT9Dvzq+sX5cfhk98f2ZPYm9uv1tfW99dv17fVJ9u/2efcD+OT47fnG+nX7P/we/dX9i/5b/xsA5QC+AXEC/QJ4A88D5APlAysEuARQBdEFOQaNBuMGOweQB/4HdAjYCFQJ5QltCsQKqwpjCkgKHQqpCQAJKQglBwcG4wSzA3QCMQHw/63+WP3y+6b6jPme+N73O/ej9iD2sPVd9Tz1Q/VF9R/1//Qm9Wr1iPWI9aX15vUl9mv22PY+94L34/d6+A75nPlB+un6mvtq/CX9uv1i/iD/+/8LAfIBhAILA54DHwSJBNQE1QSCBBgEowPoAgwCiwE1AZIAu//B/r397/wg/Ev7svo/+tn5kvlf+Tj5E/m/+Cz4nvc29+T2n/Zy9lH2J/YA9tX1dfUE9df0/PQ99V/1afWZ9fX1YPba9k33qfcq+MH4IPl5+ff5c/rz+o37Rfzw/HP94/0n/k7+kP7D/t3+DP8w/zX/Wf+V/3z/FP/l/tT+hv5h/pH+nP6G/qf+3P7d/q3+Zf4w/gT+8f0k/jL+Bf4g/hv+iv0R/fb8zfyb/HP8RPxb/Jz8ufzS/NH8vfzt/E39m/3R/fL9Iv6z/oD//P8tAJUAQAG4AeMBEwJOAp8CHgOUA/gDVQR5BHMEiQTeBDMFIQX6BEoF0AUcBj8GUQZDBiAG4wWgBYgFhgVaBf8EWgRyA8cCfwJgAm4COgJ/AeUA4wBHAZQBdgFCAXMBQwKPA7UEBQV/BP0DPwR8BJsDrwJ7A98EagSSAsABdgKLA3YELQVFBZkE5gM6BIkFhQb2BmAIUwowCh4IDweZByAIHwn4CvEKswjdB+cI4giDB5MGZQZmBhQGJAUwBLUDEwN6AuECbgMEA8YBnQDmAH0BuQDmALUC9QKLAXEB0wLVAzQExgTfBfAGSAdYB9YHdAjsCJoJGQqqCT0JfgpEDfEPhBFCEv4SARSVFEAUmBNHExwTfBIVEUwPww12DNMKUwhQBaoCPwDu/UX8TPva+tX6kvqq+Z/4DPjh9273GvZr9IDzT/MA80PyrPFQ8Ubw0+4l7untru267ebt/u0z7sbuse+H8B/xtfGX8rDzePQq9a72+Pg7+/L8Q/7S/+QB9QOTBd0GBgjzCIMJ1gkcCkYKJAq/CScJbAihB9MGLAbEBYcFagVNBUEFqgWeBrUHUQgvCL8HfwdfBwcHVQaJBcwE3QN6AtkAVP/x/ZX8PPu6+R74A/eX9kz2AfYD9gP2xPWj9b/1Fvar9kX3ufcS+Hb4G/kO+hH71/tl/PP8m/1m/m3/mgCcAWMCFwOkA/4DXATfBG0F4gU7BnsGuQY5BxsI5QgzCXAJ/gmNCvsKfwsQDG8MiQxvDBgMZQtkCl0JaAgRBygFUwPrAYcACP+j/U38EPsp+oX5sPiZ96n2AfaU9T31w/Rw9Gf0QfQB9Nzzj/MU8+zyOPNA8/vyTfMo9NX0kPWc9nv3Dfio+GH5QvpF+yj8/vz1/cv+ff9LAOoAGwFbAQgCGQNqBIEF4QW5BWYF/QSUBEUEDATIAzEDNAIWASYAb/+z/tP98/wZ/Cz7Xfr++Rv6ZPo3+mz5ofgv+OT3ivfs9iT2fPUd9QT18PSr9FX0EvQB9C/0TvQm9Dj0vPQy9Wb1ovUO9qz2avcM+Ev4N/gw+HH4+Pik+Uf65Pp8+w38m/wE/Vz96/1z/pn+hv50/mX+bP5v/kL+B/7m/dD9w/2n/V39Gf08/af94P39/Vr+rP6l/pX+l/5j/h/+Cf7d/YD9Pf02/Vb9hv2h/aP9nP2Y/bj94v38/VT+2f4F/w//cP/F//j/WACcANMAOQF3AZkB6AFOAr0CPwPBA0MErATTBCgF0AUsBhgG8AXiBd0FzgXxBSwG5QUSBVUEAASaAwYDNwP7A6sDfQIUAugBFwFBAdsCMAOmAb4ABQGDAaQB6ABxAAYBXwHFASoDDgQ5A2UCNQNiBIUEagT8BJAFcQWwBFEDLAIgAs8CIgRJBbIEMQOZAhgDzQNYBLoFEQgtCRsI7gYvB8sHGgjlCIQJxwinB0QHaAdzBzwHqAeGCIwHsQRNA8wEnQZ/BhgFRwQHBWcGawarBPYC3wLTA+0DHAKy/yj/0gBNAvgB0gCMAH8BCANQBNQEOAWWBnwImQnrCVoKJwviC0cMzAwODtgPSBEtEi4TfRRhFUUVjhQxFIAUoRSGE0wR1A4MDUgMuAr9BhQDtwCC/2D+Ufwd+k75gflF+fb3ZPb99Yj2SfYO9Rf0jvM58/PyQ/I18TvwrO9w78zuve0o7Zztc+5t7vPtee64777wiPEs8sTy9/PS9Wr3c/iv+Zz77/32/0oBawIUBAAGYQcjCLUIPwm+CRQKEgqxCQkJPwiVByQHpQYNBqcFkQW1BfQFHgZUBusG0weQCNYIxgitCJMIUAjlBy0H/QWuBIIDQgK+AOn+7/wo+6H5N/gW93b2KPbz9c71rPWT9bP1H/ac9hf3wfd6+P/4gfk++gn7q/ss/JT84fwU/VH90/2W/j7/sf8uAMsAeAEXAo0CGAPUA28E8ASnBWwGDQfQB64IQQmMCeoJgAopC58LuAuNC0QLAQvGCjMKHwnpB8gGqwV9BCkDtQE3AN3+t/2S/Ff7Pfp++QD5ZPiw9zz38vap9mz2Lfba9Z31lvWa9XP1IvWz9Eb0B/Tq8wH0e/QJ9Xj1A/a+9ob3TPgE+Y75CPr2+mj8zf3b/sT/pAB2ASYCmgL+AogDAwQvBBEEzwOpA7oDtANPA5wC1gESAUIARP8B/rT8tfsP+636gfpZ+hD6y/mF+Sr54Pi2+Kv4ufiS+EL4Jfgm+Pv3xfej9zX3OPY79an0VfQ59Gz0rfTJ9NP0+vRh9eb1O/Z89t32evdg+Cr5qflF+vb6ePux+6D7ePuJ+9/7OfxH/Cn8L/xW/Gn8afx9/ID8Y/yA/KH8b/ya/Fv9rv2E/bb9Dv4y/lr+V/5L/n/+jv5d/jj+Jv4y/lz+WP4t/jH+Pf4C/pj9bf27/Qf+Hv5K/mn+cP6a/tX+CP81/57/aQAaAT0BHwFbAQkCrwIhA58D/QPyA/gDbwTaBOIEygTABLQEfgQ9BDkEagS/BDgFfwULBdoDIwO1A24EOgSTAyED1AJ3AhMC2wEGAm8CbgKWAVsAcv9w/ygAmACIALEADwHwAF4AXAAjAdABZgJ+A8gEbAXbBMMDSwO8A/8Eawa8BugFCgXGBM4ElwRsBDUFJwfdCGgIUwbmBE4Ftge+CroLbAp8CU8KqQtbDFcMmgvVCcwIuAqcC4gH0QPBBFIGSgUyAwoCbAIiA3IC9gDp///+eP9wAvwDnQG+/+0ATgJ9AukChARLBqAGogXoBPIFLwivCSkKYAqWChwLWAsfCvsI4QonD2sSMRPlErQT4xV1F1AXjxZAFioWuRVaFA4Sqg/RDTwMxwkwBuICiQCe/rb8Jfvu+nv7Nfus+qX6Nvow+VD4VfcD9hL1vvSW9LXz1fEv8EzvVe7t7LHrbeul62vrFutK6xnsNO3r7ULu5+4a8I/x9vJK9Oj1+PcX+tj7VP0B/ywBTgO4BLQF3AYUCPgISAkBCaEIfAgpCIIHyAYZBqgFhwWRBaAFugUnBhsHNAhcCesKFAwIDOMLUgxtDPsLbwuaCkEJmge3BcAD8gEQAPD96/sG+jr49PY+9vL1FfYR9pX1X/X39ef2mvfU99v3FvhC+Bz4Gfh1+Pf4Pfkn+Qr5CPke+Y35Pvq0+vb6dfsr/Nj8p/2//t7/yACCATgCGAMcBCIFNgZaB10IRQlaCo0LfgwdDW4NWg0qDT0NPg2qDKILego9CfEHuAa0Bd8E+gPTAqQBqgDF//P+cP47/hb+v/0d/Uz8o/tn+y37ffqV+bX41vfz9vf1J/W/9ID0KvS7827zX/Nc84bz+/Nr9L/0QPXl9ZX2Y/cH+FH4p/hK+f/5kvos+/776fyc/Tf+1f4d/1z/DABxACIA0f+5/6P/yP8RAPn/dP/Q/mv+qf5B/5D/hP9E/8j+Tv4R/g7+QP47/lX93/uZ+nv5hvgj+Br4+/ea9+r2SvYg9kP2gvbP9t72rPak9r322vYd92r3Vfeo9sf1T/U69Tn1LPUH9dP0zfT89En1vvVA9r32V/cF+K34Qfml+d/5GfqI+ir7svsU/In8//wv/TX9dv0R/qL+v/6o/tT+Jv9r/4//gv9o/1b/Nf88/6D/BQAyAFUAaQBvAJQA/ACVAe8B1AGFAQIBbgBWAHIALQAFAPr//v6y/cP9gP6c/r3+IP9a/7b/LQC0ALUB0gJ3A+4DZgTkBIAFkQVBBZcF4QVGBWgEywNeAwQDqwKAAq4C5gIFA1oDpANwA34DbASQBVoGbga6BUQFiwUZBu4G2gfyB8sGTgWHBFwEdgTXBHoFXQaZBgcFmgK4AWUDIAUYBO4BngBh/zX/igHMA7YD+QL+AqgDhwQIBXMGWgm6ChkJxgZdBYUEvASOBvkH3QZLBJACXAIBA80DtAQeBioHZwYQBZYF4AcfCioLvwplCfEHCQdcBx4IdAcxBpwFBwTTAI3+8f6iAFIBcQCc/0IAlgFSAs8CvAPWBL4FzgaWB2UHNAdiBwIHZQctCsoN1RBnFFQY/Br5G+0b/RvFHD0dFRwOGScVwxHcDnAL4gcIBeYBwf1u+s/4kvfz9gn4e/pc/Sf/s///ABEDAgTRA0YDuAFA/9j8LfrN9pbzTfGu7wruNexx6kbpxOgi6HTnwucZ6dfqjuzm7Q/vpvCg8kr0VPU69nz3Efl5+mz7fPxL/mAA+AHeAkoDmwMOBH4EfwT2A20DMgPbAlYCJAJEAosCZAPEBDAGmQccCb8KfgwQDksPWxBWEewRBRLvEXsRTRC6DgwN/AqBCOYFTgPjAOD+NP3G+736GvrA+cD5F/qM+hP7uftG/JP8sPyI/A38dPvO+iP6ffmw+Jb3UvYb9Rv0Z/P88sLyu/II87Dzh/Rp9WT2ivfF+On5BvtV/Lv9Bf9oAP4BUgNDBEMFWgZEB/IHYgjECEYJpwmrCXoJPgkHCeQIqwhVCAYIpQctB8YGgAZyBqMG3QYDByYHJwcPBwAHzQZXBqwF2wT7A9wCWgHW/27+vvy3+tX4SvfV9Zf0u/Pv8j/yBfI+8rDyEfNL863zP/Sz9PP0MvVl9Uv1D/Xx9Kb0K/Ty8xP0RfSA9MT08PQR9Vn1w/Va9jb3OfhW+Z/6xPuK/DL90v1G/s/+cf+l/2b/Uf+e/w4AaACZAJ0AggBJAPz/rP9b/wP/mP4B/lP9uPwR/GX78fqY+hr6g/n4+Ib4N/j49673Vvf99qz2kvbD9v32A/f79v329fbX9qP2SPbh9Zf1XPUU9e30AfUY9Qn1EfVm9fv1lvbt9hT3aPcW+CL5MvoH++773PxW/Yb9vv3U/dT9Hv6e/vz+8/6X/nj+yP4c/0f/d/+0/9r/6v/3//3/AwAAAAsAcADlAN4AsAD1ALIBiAIMAzMDYgPuA7MEKAU3BXcFJgaxBp0GOQb5BcUFZAXvBJAERgTiA0IDpwJgAnECmgKxAtgCXQMpBOIEaAWMBXEFyAVUBkAG/QUyBjEGpQU/BfAEQwSPA2oD1QMbBGwDNALgAe0C2wT4BQQFCwRQBPgDTgMvBJIF+AXsBYYFiASwA3cDIASVBa0GuQYhBqQF8AXPBj4HZQfsB/kHOAdCB1EInwjaB1UHlQf/B8cHOAeDB4AI0wiyCPMI+wilCOgIEQkICB0HdQcRCEEIIwjQB18HiQYxBRUEAASVBNMEygSWBLUDOAMIBAYEPgKOAbgCvgIrASYApP/Z/rn+lP86ASEEKgjdDNMRvhUrGJganh0OIBMhniAbH/gcehl+FCIQFQ1SCaQEVQB9/D350fa69bP29PgT+wb9If9OAbsDVQZfCHgJbAkcCPoFWwNnAG39x/pI+G/1ZPKt7zHtBeuF6YToqucr55rnfOje6IzpKeuk7Mvtbe8d8V7yrvMR9UT2nPcS+YT6E/x4/Tz+ef5C/tv9df1l/Nb6yPmc+M72n/WA9aL1KPaZ98P5bfw4/xUCdQUQCT4MFQ/dEXcUehaNF9IXxRdWFwsWGhQFEp8PvAzPCT0HEAVaAzsCxgHMAQYCZAIDA+UDIQWSBs8H5AjdCVYKSQrjCQoJzQdrBuYECQPHAEz+4/um+ZP30fVv9DzzL/Jl8dLwifCn8OHwEPGN8VnyEPPL89z0Mvaf9/X4E/oV+/77pfzy/P38Af0Y/dj8L/zE+6b7U/vl+pP6OPrw+Qb6dPoM+737qvwb/tD/NQFuAhYEGAbSBxQJEQrHCjULaAsxC5wK6AkJCdcHeAYrBfMDtgJnARMA4v7u/Rz9ZPzt+7X7kftr+z77EPsD+w/7+vqj+hf6e/ng+CT4U/eE9rj16vT689ryuvGq8K3v1+4r7pvtMO397PvsF+157TLuHe8X8APxxvGA8k3zG/TV9JL1UPbf9vD2qvZp9hv2s/WR9aP1ivVQ9Sn1C/UL9Ur1sPUd9oT24PZF96337ff79xX4ivh8+bj62Pua/AL9If1E/cr9dv68/oz+Nv4c/iX++P2u/Yv9lf2U/Sf9WPyt+2v7avuT++P7I/wu/Fj86PyF/bf9j/17/cP9Q/6U/pv+lf6e/o3+TP4z/pX+FP9W/5H/v/+o/6L/9/9PAIoA2wAzAXYBqQHaASECgwLQAvYCAAMSA24D2gMNBHsEHwVcBVUFhgXTBf8FFwY1Bm8GpgaWBnkGmQbQBugG8wbvBpsGGwbyBfkFvAVjBT8FPQVJBVUFUQVkBaYF3wX+BSMGSwZ7BtkGOgdoB30HngfAB9IH0wfSB9cH5AfjB7cHeAddB1QHNAcUB/sGyAaTBnEGVAYmBvkF/gUTBvgF6AX8BegFyAX1BT0GaAZ6Bm4GhgbYBg4HQgeSB7UHigdRB0IHKwfiBq4GhQYfBrEFbgUCBWcE+QPDA7MDwQPHA9ID6wP0AxIEeATyBE4FjQW9BQAGSAZKBjgGcgbXBhMHLQdMB28HjQe4B/IHIAguCCcIDQgDCCoIUQg7CB0IMghKCDAIGwgoCCQIDwj5B9oH1QfQB6wHhQdTBwwH0gadBlQGAgbNBa0FdwUjBdgEnARtBEUEBASlA1UDDwPBAngCNQL9Ac4BlgFaARMBywCnAKEAngCcAKYAsQChAHoAWgBDACwAEwD3/9r/sv9v/yr/BP/v/s/+q/6N/nj+af5W/j3+Lf5H/ob+vP7a/v3+MP9l/5T/t//W//n/HAA4AE4AUwBOAE8ATQBEADQAEwDv/+D/2f/D/6j/lf+D/3T/dP95/2v/Rv8e//n+2v7G/qX+YP4v/hr+2P14/U/9R/0r/Rb9Df35/Oz85PzV/ML8q/yO/Hf8XPw2/AX8x/uU+4v7hftj+0r7UvtY+1f7ZfuJ+7v74Pvu+wf8K/xD/Fb8a/x1/Hz8jfyW/Hv8U/xB/Dz8JPwJ/PP72vvS+9L7zPvO+9r77vsM/DD8V/yD/K784Pwi/WP9lv3K/fr9Hv4+/lv+bP5w/mr+Wf47/hL+6f3M/bj9qv2W/Xb9X/1h/Vn9Ov0u/Tv9RP1C/Tf9J/0X/QT96Py+/Ib8R/z++737ffsr+9n6lvpM+gP61Pmq+W75Pfkg+QT54vjQ+Mv4u/il+Jr4lfiV+JD4ffhs+GH4UvhG+C34B/js99j3s/eV94D3YvdO90b3PfdF90r3SfdO91z3dfeS96j3y/f19xH4LPhd+IP4nfi++OL4/fgQ+R/5NflK+VX5YPl++Zn5m/mR+Zv5rPms+a/5yPnT+dz59/kN+hv6NvpU+mv6f/qQ+qD6uvra+vz6JPtS+4H7q/vL+/X7KPxL/F/8gvyx/M783fz4/Bj9N/1S/WX9ev2Z/bv95P0b/lX+jf7N/hD/U/+T/9L/FQBUAJIA1QAMATcBYwGKAbMB2wH5ARECKAI9AlUCcAKJAqECtALAAtQC8QIGAxMDKgNJA2YDggOjA8ID5AMUBEYEbgSOBKcEvgTXBPUEAgX0BO4E/wT6BOIE4QTsBOkE6wT0BAAFFgUxBUsFbwWPBacFxwXuBQkGHwYtBjYGQgZGBj8GQQZIBksGSAZHBk0GVQZZBmEGcAaFBpoGsgbMBuEG7wYEBx8HKwcqBzAHMwcyBzoHRQdEB0YHTQdWB2sHhQegB74H2Af5BxkINAhLCFcIXAhkCF8IVQhJCDgIHwgLCPoH5wfPB70Htge0B64Hrwe3B8MHyAfIB8wH0QfFB7AHmgeAB2gHTQcjB/AGwgafBn4GWAYsBgoG8gXgBc8FvwW2BbcFtgW3BbIFpAWcBZsFkwWBBWgFVAVEBTIFHAUIBfYE5QTVBMwEwwSwBJ4EoASfBI0EfgRwBFcEPwQpBAgE4AO/A6IDhQNjAz0DHAMMAwID7wLaAscCugKvAp4ChwJvAlgCPQIgAgAC2wGxAYYBYgFCAR4B9gDTALkAqACXAIEAcABoAGIAWwBVAEsAQwA7AC4AGQACAO7/2v/B/6P/g/9h/0X/LP8S//j+4f7M/rj+ov6M/n3+df5t/mb+X/5Z/lf+V/5X/lX+T/5M/k/+UP5I/jv+Kf4Z/gr++P3j/cr9q/2L/Wr9SP0i/QP97/ze/Mj8s/yn/KD8nvyi/KH8m/ya/Jv8jPx0/GT8Ufwt/Af85Pu++5T7avtB+x/7APvf+sL6sPql+qH6mfqR+pX6lvqO+pT6nvqW+oz6jfqC+mf6T/o8+ib6Evr9+en51/nO+c35z/nO+dj54/nh+eX59/n/+QT6DfoV+hn6HPoZ+hj6Hfod+hz6Kfo2+jz6R/pd+nD6fvqN+qL6tvrL+uP68/r7+gj7D/sS+xf7FPsO+wr7BPsD+wL7AfsF+wr7BfsD+w77F/sb+yX7MPs3+0D7TftX+2H7a/t0+3z7gft/+3v7e/uA+4P7gvuA+4L7hvuG+4b7j/ua+6P7rPu2+8T70/ve++37//sQ/B/8Lfw+/FP8Yfxp/HX8hfyT/KP8sfy+/Mz83Pzr/Pr8B/0S/SD9MP05/T/9TP1i/XL9gP2W/aj9s/3M/ef99P0E/h3+Nf5K/l/+cf6C/pb+qf64/sf+1P7g/vD+//4R/yD/Jf80/1T/a/92/4j/of+7/9b/7f8GACYAQABVAG8AigChALgAzwDlAPkACwElAT8BUAFkAXwBlAGwAcgB2AHnAfQB/QEGAg0CDAISAh4CKQI0AjgCQAJVAmcCfgKbArUCyALTAuIC9AL+AgkDEwMWAx4DIwMdAxYDEwMZAxkDFAMWAxoDGAMbAyADIwMnAywDMQM3AzwDQgNJA1IDUwNWA2ADZgNlA2gDbQNzA3UDcwNuA2wDbANqA2IDXANZA1gDVQNSA04DUANXA14DZgNzA4ADjAOZA6cDtQPEA9AD2gPjA+kD6gPrA+gD3wPYA9YDzwPEA7sDuQO1A6wDrwO2A7EDswPBA8MDvwPEA8gDxwPHA8IDvQPAA7sDswOxA68DqAOjA6ADnwOeA5wDmwOaA5cDmQOZA5UDkgOLA4EDeANrA10DUANAAy4DHwMPA/wC7ALfAtICxAK3Aq8CpwKeApgCjwKJAowChwKCAoACgQKDAn0CcwJuAmcCXwJWAkcCMwIjAhUCBALyAd0ByQG/AbUBqQGhAZ4BmwGaAaQBsgG1AboBxwHRAdMB1QHZAdUBzQHLAcABrgGiAZMBhAF3AWIBTgFAATEBJAEaARABDQELAf8A9QD2APEA5QDiAOEA2QDSAM0AwwC7ALEAogCUAIQAcABaAEIAJgANAO//zf+0/5r/fP9k/07/O/8s/x//Fv8U/xP/EP8Q/xP/E/8W/xv/Gf8Q/wf/Af/3/uj+3P7M/rv+sf6o/p3+lv6R/o/+l/6d/qD+p/6z/r/+yv7R/tj+4v7r/u/+9f76/vz+/v4B/wX/BP8B/wH/AP/8/vj+8/7s/ub+4P7W/sf+vP6z/qT+lv6L/n7+bv5j/lj+Sv5C/jf+Lf4p/iL+Hf4Y/hD+DP4J/gH++v31/e395f3f/dn90f3L/cf9wv29/bj9tP22/bf9tf25/cL9x/3L/dP93P3h/ej98f32/ff9AP4I/gb+BP4F/gP+BP4B/vj98/3w/ej94f3Z/c/9y/3G/b/9wf3A/br9uv29/b39vf2+/cD9wv3B/bz9vP26/bL9qv2j/Zr9j/2C/Xb9av1e/VL9SP09/TX9MP0t/Sz9Kv0r/TH9N/0+/Uf9Uv1b/WT9b/17/YX9i/2R/Z39pP2r/bL9tv2+/cb9zP3W/dv93/3q/fP9/P0H/hP+HP4k/i3+Nv49/kL+Sf5P/lT+Wf5a/lv+YP5g/mD+Y/5h/l/+YP5e/lv+Wf5a/ln+U/5Q/lL+UP5R/lT+V/5b/mH+Zv5s/nP+eP6A/on+kP6W/p/+qP6t/rL+u/7E/sv+1P7c/uX+8v79/gj/FP8i/zH/Pf9K/1n/Zv9x/3//jf+a/6P/sf/B/8v/1//q//f/AgASACMAMQBBAE8AWwBtAHwAhgCTAJ8AqACzAL4AxwDSANgA4ADrAPEA+QACAQgBEAEYAR0BIwElASYBKAEoASYBJQEiAR0BGQEYARUBEQEOAQ0BDgEOAQ0BDQEPARIBFAEUARUBGAEYARYBEwESAQ8BCwEIAQUBAAH7APoA+AD1APYA9wD4APwA/QD/AAcBDQEUARwBIwEsATYBPAFFAU8BVAFcAWcBbAFzAXoBfgGHAY0BkQGXAZ0BowGoAa0BtwG/AcQBzgHWAdoB4gHvAfUB9wH+AQcCCgIOAhUCFwIYAhgCFgIVAhMCCwIFAgIC+wH1AfAB5wHiAd4B2AHUAdABzAHLAcoBxwHFAcQBwgHBAb8BuwG4AbMBrQGoAaMBmwGTAYwBgwF5AXEBagFjAVoBWAFVAVEBUAFNAUwBUQFSAVYBWgFcAWABYwFkAWcBZwFnAWcBZwFkAWIBYAFdAVsBVwFTAVIBTwFMAUwBTAFLAUoBSQFJAUYBQwFAAT4BPgE6ATMBLgEsASYBHwEaARYBEwEQAQsBBQEAAf0A+wD4APEA7QDrAOcA5ADgANkA1wDUANAAzQDIAMQAwAC8ALoAtwCxAK8ArgCoAKMAowCgAJgAlgCXAJAAjACMAIgAhgCEAH8AfQB7AHQAbwBsAGcAYwBdAFUAUwBQAEsARgBBAD4APQA6ADYANgA0ADEAMQAxAC0AKAAoACgAIgAeAB0AGAARAA8ACgADAAEA/v/5//f/8//u/+7/7f/o/+f/6P/n/+b/5P/j/+P/4v/h/+D/4f/h/9//3v/d/9z/2v/Z/9b/0//Q/8z/yP/E/8D/u/+1/7D/rP+o/6P/nv+a/5f/lf+Q/4z/if+F/4L/f/97/3j/c/9r/2f/Yf9Y/1P/T/9J/0H/PP84/zL/Lv8r/yb/Iv8f/xz/GP8V/xL/D/8O/wv/Cf8F/wD/Af8B//r++P74/vT+8v7w/ur+5/7m/uP+4P7f/tv+2v7a/tn+2P7Z/tn+2v7d/tv+2/7e/t/+4P7f/t/+3v7b/tj+1f7U/tL+zf7J/sb+wv6//r7+u/66/rr+u/66/rn+u/68/rr+vP66/rn+uP6z/q/+rv6q/qX+ov6f/pr+lv6T/pH+jv6O/pH+j/6N/o/+kP6S/pX+lP6X/p3+oP6k/qn+q/6u/rT+uf6+/sL+xv7M/tD+0/7Y/t3+4v7o/uz+8f72/vr+//4D/wb/C/8R/xb/Gv8d/yL/J/8q/y3/MP80/zb/N/84/zr/PP89/z7/Pv8+/z3/O/86/zr/OP83/zX/Mv8x/zD/L/8t/y3/LP8s/yz/LP8t/yz/Lf8v/zD/Mf8x/zH/M/8z/zX/Of84/zv/Qv9I/03/U/9Z/2H/av9z/3r/gP+J/5D/l/+f/6b/rv+2/77/xv/O/9b/3//p//L/+v8CAAsAFQAdACYALAAzADoAQQBIAFAAVwBcAGIAaQBwAHcAfgCEAIgAjgCUAJoAoACmAKoArwC0ALsAwwDLANMA3ADjAOgA7ADxAPUA+QD8AAABBQEIAQoBDAEOARABEAENAQsBDAEMAQoBCQEIAQcBBQEEAQUBBwEHAQcBBwEHAQgBBwEFAQMBAAH+AP0A/AD6APcA9ADzAPIA8ADvAO0A6gDoAOcA5QDkAOMA4QDeAN4A3QDaANYA0wDSANAAzADKAMgAxADBAL4AuwC5ALcAtACwAK4ArACpAKUAoQCcAJgAlACQAI0AjACLAIgAhgCGAIYAhQCDAIAAfwB/AIIAhACCAIAAgwCEAIEAfwCAAIAAfQB6AHoAewB6AHoAfQCBAIYAiACHAIgAigCKAIwAjQCMAI0AjwCQAI8AjgCPAJUAlgCVAJgAmwCXAJQAlgCYAJoAmwCaAJoAmgCaAJgAlQCTAJMAlQCVAJUAlACVAJQAkACOAJEAkwCTAJYAlwCVAJIAjwCLAIsAjgCOAI0AjgCRAJEAkQCUAJQAkQCOAJAAkQCPAJAAkwCQAIoAhQCBAHsAdQBvAG4AcgBxAG4AbABqAGkAaABkAGIAXABQAEwATwBKAEIAPwA7ADUAMQAsACoAKwAnACMAJwAoACcAKAAlACIAIQAbABMADgAKAAUA/v/6//j/9f/1//T/8//2//v/+f/z//H/8f/r/+b/6P/k/93/2v/a/9j/1P/R/83/xf/B/77/vf++/7n/tv+6/7X/sf+w/6j/oP+d/5H/jv+g/6j/qv+u/6D/l/+d/5//oP+f/5//qv+t/6b/pf+m/6L/p/+t/7b/xf/L/9T/2v/O/9X/4P/i/+f/0P/Q/+n/4f/o/+T/y//U/8b/x//4/83/ef+A/3T/B//W/jP/BACQAZMDlgQaBC4DaQKbAa0AXgCcAJn/iP6M/x0AzP6q/Vz9UP32/O/7T/tO/Pv94v5q/yYAgwBvADsAmv/k/i7/QQAJAVMBUwEaAcAAAADg/ir+6/15/SL9k/0h/tf9TP0Z/bb8KPzM+6v7CPxz/G/8xvyj/SD+Yv4S/57/vv8yAMsAvACSACABaAGlAFIAwAAtAOj+o/7c/mT+Hf4b/+3/uP+j/0r/VP6Z/cj8e/yL/ZX+ZP90ATQDLwJh/xb9fv1HABICKQNZBWEG9AU4B1YJXwj5BEsDxwNdA9gAXP4Q/h//+f4N/Un7uPp8+hb67vkg+vD6pPz+/Vz+MP9pAMAAxQCSASsDoAQ6BQwFJwQ2AyUD/wKkAQ0AZf8g/2f+Xf1z/Of7wPuO+xv7z/rA+gL7v/tD/B38Xfyg/cn+BP82/+X/bgD1AOIBdAI7As4BPwFxAMH/HP/O/lT/uv87/4P+Lv45/kT+6P1m/Uf9Y/2f/Vb+O/+0/+v/WADvAD4BUAFkAX8BAQLeAlsDWgMmA68C1gHWAE8AYQBzAD8AGABHAIwAYwDv/+b/XADUAFABxwH4AU8C8QL4AhsCYAE7AbwAp/8q/8f/6gAzAnUDcwQFBeQEGARZA+wCRgJeAboATwDT/zT/Of46/fn8Mv0g/bf8nvxf/Yv+PP9z/+b/1gC/ATwChQLZAu0CoAJVAhECmwHkAA0Anv+W/0X/pP4U/rb9lv2m/cr99/0v/mT+Sv7x/cz94v0I/mH++v6Q//j/YgC0AI0APwAsAAUArf+L/9L/VQDFAOQAvQB7ABMAf/8S//b+Av8x/4P/tP+s/5L/d/9X/zT/I/85/4n/CABtAKAA1AAYAU4BWQErAe8A9QA1AWIBVQElAQUBBAHjAH8ACgC7/6P/zf8nAHsAqQDHANgAxACgAJIAkQClAPcAXgFvAUQBeAEfApECfQJMAj4CLAL+AdAB1AHiAYQB1AB4AJUAwgC0AG0ARQBzAKMAkgBmAFgAjgDlAAgB7wDqACkBZAFKARIBEwEtAQwBuwCBAHsAewBUACkAKAArAO7/gv9I/1P/Q//7/sL+wf7g/vX+BP80/3b/j/98/13/Rf9D/1D/Wf9w/5j/s/+z/5n/bf82/xL/Fv8c///+0v66/sv+6f7m/uD+Ef9p/4j/Tv8w/3H/pf9+/0f/Pf9Q/2H/V/88/zz/Uf9p/43/wv8AACkAGwDs/9X/3//4//3/w/+E/6P/4P/C/4v/qf/m/97/ov+a/+7/RQBDAAIA1P/U/9r/uf+P/57/xP+v/4T/m//S//X/EAAfAA4A4/+5/77/7P8BAOz/5f8AABMA7/+e/3j/o//h/w4ALAAYANX/uv/m/wsA5P+B/z3/Xf+4/+L/uv+R/6//6v/l/6z/gP9e/z7/Of9D/z//SP+A/83/7//R/6j/rf/O/8X/lv+C/4T/gf9+/3//cf9Q/zr/UP+E/5X/aP8r/xL/KP9L/0P/E////ib/R/81/yn/Rf9O/xP/y/7U/kT/u//d/77/lf9p/0z/ZP9y/xP/if5l/pf+rv6j/sn+Lv+c/9z/sP9A/0P/1f8sAPr/xf/b/yMAZwBiACEA2/+Y/2n/X/9K/yr/Tv+7/wcA7v+j/6D//f9AACUAFwBoALwAtACPAKUAvQCBADMAPABTAAoAyP8UAIcApwDPAC8BUgEzAU4BggFcAQAB2QAhAYEBcQE7AUwBQgEAAf4AXwGdAXYBagGPAYcBhQGxAaMBbQGCAcgB6wHaAZ8BhwGxAc0B1wH8ASQCQwKEArsCcgKrARMBMgG0AdMBZwEeAXkBCgIkAtkBtQHcAe4BsAFTAS8BSAE4Ad4AlAB0ADYAwv9e/2L/1v9mAJMARAAjANYA7AE6AloBQAAbAP8A9gEWAlEBSwCs/4f/d/8K/yj+Q/0a/dr9qf6u/m7+N/8BARQChgGyAAwB5wHoAUIBtADw/9P+P/5l/nX+R/58/jf/5f80AKoAuQGMAiUCGwGKAHQAeACUAJYAVgBBAGcAJACO/47/KQCHAH4AagBmAJQA3AAPAWABiQECAWQAkAAfAQUBAAAJ/0j/HwAfAJz/lf+2/8L/UgAkAS8BWQCZ/7T/+v8z/9H9Zv0X/qr+gv4F/qT9i/2f/Zf9Z/09/Sv9PP1x/bb9FP6H/tL+4v7l/rf++v3t/Cz8rfv4+lD6J/oL+sn5/vmU+vT6V/vo+zz8efzg/Aj9r/wO/Jz73/t+/JT8Jfz8+1v89/xe/Uj9H/1f/a79f/0N/cn8nPxS/DL8s/yd/Sz+N/5c/t3+Pf83/0D/4f/IACYBEwE9AacB7wEEAhUCNgJVAk0CAAKSAXAB3AGTAhkDWgOdAxcEoQT1BA0FJgVwBc4F4wWGBRkFFAVNBWwFiwXcBS0GWAaBBpYGQgbKBe0FfAZ6BhgGRga3BqAGRwYbBvIFlwUmBdQEtwSGBB0E4gPlA6MDSwNHAyYDtAKLAqYCfgIjAt0BnwFgARIBeADC/1f/Dv+t/l/+J/7S/Vn93PyG/FD8+vuA+zH7G/sY+z/7ePs4+4b6G/oU+s75DPll+FL4YPgO+Mr3/Pcb+Nf33Pcn+M/3Cfe09m/2zvWF9df1H/Y29l72r/YZ9zj3//Yr98H30fdF98b2YvY69oX22fbl9v72e/dE+M34lvgK+CD4x/gZ+QL5WflT+ij7Pvvo+uH6evsw/EP8xvuE+7D7uPuI+7X7dvw8/Y791v24/vH/jQBXACoApwBdAZYBDAEKAID/EwD8AIgBYAKSAxUECgRKBHwEOAToA7kDkQMwA1YClAGsAZYC1wMUBWEGAAhwCeMJ1glaCukKVgoSCVwI9AeuBr4ErAP1A2EEIwQYBOQEAwZVBwUJPwrrCloMJQ46DucMFQxmC3AJAAfdBT8GcQZDBWMEugWHB4YHGAfzB/cI1QjVByYHKAeYBlMFhgWHB5kIhAf6BUgFGQWhBOoDrAPdA44DfwLEAVwCowPtA/QCGAKHARMAl/0h+7z5Nvqv/Ob/LwKKA4cFwwiBC3MLLwlaBwQGDQN3/gX6S/ZA80zxEvEq87725fli/CL/lgJPBuAIZwnWCMAIvQiEBuYBwf3j+0b7M/oi+BT2XvUa9jT3RPg/+iT+MAMsBxcJJwpjC5ALQwnjBaYDBgKK/3/8o/lB91X2afdN+Qz7GP3r/xADcAVKBl0G0QY/B7kGiQURBPgBWP/2/JT7Uvsl+xz6L/mg+cT6jfsV/M/87v0j//n/lgD7ALIAv/+Q/lv9Cfyb+lT5hfgQ+L734fe8+PP54fpn+yL84/xW/EX6cPhT+Fb5rvnl+Fz4C/kE+i/60/ng+WT6ePrg+Z75EvpM+rr5N/m5+dH6Qfuz+gz6JfqF+if6Kvnw+CX6nfsz/IL8If1y/Zf9iv6i/1b/0/1v/Oj72/t1++36TPt3/Hj9Jv7K/nr/cgCaAW0CAwO0Ax8E+QO2A4wD/wLMAZMAJwCCAP4AKwEhAWwBcQLuA10FhAa5BxAJ9Qk7Cl4KbQoNCkkJgwjjByEHDQY6BU8FGAYfBzYIDAmDCf4J4wriC20MnQzMDN0MnAwKDEULdQqxCesIVAgaCBQIMgiHCLEIiwiOCNgI/wgbCYcJFAouCowJgwilB/sGIQb2BOsDLgN9Av8B9wEQAv4B4wH3ASIC8QFAAb0AywDKADgAOv/4/cP8BPyE+7H6r/ks+WT5z/nL+W75Svll+T35u/gm+JH3/fae9nH2JfaN9ef0bfQO9KbzQ/MD8+7yAfNU86/zpPNX82zzuPNs87vyvvIh8+fygfJ88jDyj/Fk8cXxNvKR8tnyR/PP8wv0HvRo9H30HfT18zn0KfTc8/7zS/RL9IT0F/Vk9Zf1M/a49sz21PYn98D3Pvg/+BP4D/j299X3Ifi8+FH5xvkA+i76oPoB+zb74Pvq/HH9WP1M/cb9Zv54/v/9o/2z/RH+c/6l/ir/XgBFAT4BDAErAVoBtgFMArQC0QK1AmkCSwLDArIDfgSiBGgEnAQvBV8FMwUzBWgFqgUMBngGrQavBuIGawffB9UHqwfkBy4IGgjcB4gHPgefB6sIrgnKCkgM7wyLC3sJtQgFCT8JBAmdCJAI5ggACQQJ6AliCzYM1ws+C/ML3QzcC0MKzAlvCbMI1wjTCTMKQwkFCBAI8QgRCVAJMQsXDX4M2QmKB/8GxAe3CKcJYwp0CXcG7ANVBG4G3AYdBcoDwAS4BskG9gTdBD8I1guHC6cHJgQ7A2MDCAKj/k/79vpx/mQDUgY2BrUFuAdpC4sNsgyoCc8FxgLFAGz9/ve69Hv3lf0iAcgAFAABAhgGmgkqC8wLkAutCbMGdgONAPr+x/61/if+ef0Q/VH9Mf5a/0IBTgRSB/oIcAmYCQ8KWQo3CX4GhwNVAWv/Iv0q+176LPpN+jb8SABHBIUGhwcPCBgIpwcSB2oGFQW6AkEATv4Y/KD5ofiz+UH7YvyI/V/+af6h/rr/pwB0AGb/Jf5j/VT9RP3d/Dz8VvuR+lb6zvlX+Pf2tvZ293f42vjD+FL5oPpd+8b6W/n09xX3vvag9nn2LPbu9Rr2x/Z19233x/Zq9p32q/YT9lr1JvVC9UX1YPX79SL3GPgv+NH33fdt+M74Svgw94r20/aB98P3XPe09mb26vYi+Ej5nvk/+Qr5nfmo+ov7K/zF/Fn9yv0V/g7+Wf02/Lz7cPxx/df9rv2c/UT+ef9tAM4AJQH/AQ8DpwPEA88DBARBBFQEagShBMoE0gTDBNIERgX/BbgGfgdcCCAJoAnjCREKWwrCCi8LeAtuCxcLvgqXCqIKpQqCClsKZQqnCvQKHAtDC44L9gtRDHgMYgwQDJILKAvhCocK9wlQCb4IQQjYB6QHcQfxBk4G6gXDBXsF6wRtBEMELgTGAw4DZQLmAWIBxgAIACj/VP6V/dT8MvzS+3j75/pQ+u75kPkW+ZL4I/jT9333+/Z29gn2jPUB9Zz0QPS28xLzf/L18Wvx/vCw8FPwBPDu7+zv1u/K7+bvF/AT8L3vV+8471HvXu8o78Puau4s7vHt6u0e7inuBe4z7q3uFe9g787vefAa8VLxJvHL8JDwrPDw8APxA/Ea8THxX/Ho8ZryN/Pe85/0OvWd9ff1gPYX92n3bfeO9wX4jvi9+Ir4fvgO+eH5Z/qk+gf7yPu2/IP9F/6H/vP+f/8iAJUAvADDAMsA4gAdAXQBtQHMAQUCqAJpA9sDMQTBBHAFAQY8BkAGXwaEBqYG4AYNBwYH5gYBB2wH1wcOCPwHsgfOB50IXglmCRoJBQkxCWkJewlzCXEJVglbCfAJnApnCqsJcQngCU4KRArSCU4JNgmpCdYJdAkyCU0JgQm/CQQKUQqYCn0Kygn7CK0IFwl4CdYI3wfOB0MIfAiLCKUIoAhlCDcIWwhSCHUHxgapBzsJXwmZB58F4gR5BfIGtAdJBqQEcAU9B4IH2gZbBvMFHAZHB1sIjQdjBP4AhQBHAwgGjAWOAvgBnwUVCJAF6AFwASMDyANyAm8ADP/0/vgA5wRZCKEJBArHCqwKQAjIBBICIABv/l/8GfrS+Xj8FABwAn8DdAVHCY0MxQyKCp0IsAfLBZoC2/9E/nj9Qv2u/aP+jv8qAHEBXQT3Bw4KygmfCG0I5AgdCHwFugKLAd0A3v7A/Mv8Vv5Q/7z/xgCBAmEEHQZRB1oHDQZABM8CNwHo/nf9Z/7d/xf/pfw0++r7+/3l/1EAUf9Q/hP+9f1V/V/8rPvb+9H8lP0y/ZL74fnf+Yf7dvxC+6/5tfmD+lv6PPlD+Az4OPhV+Jb4Cfn8+EP48vfl+Fz6N/tw+5H7YftF+p/4jPcz9wz3LPeB9x33G/bf9dz2TPjB+SL7MPyh/GH8zfuC+577l/v1+vH5QPn4+HX48PdF+Fj5X/ok+wL8Df28/a79Yv2M/f/9Mf4c/kP+/P7O////wf/l/6gAkwEkAhACfQHmAJ8AoACqAM4ATAEhAjEDJASjBAEFqAWeBncHkQcPB7UGrAaEBgUGpQW6Bd4F2AUBBncG+wZgB9kHvQjwCdkKMgs3CyYLAQueCsIJkAh9B78GJAamBY8F7wWTBnUHeAhHCacJswm4CbgJVgloCCAH5AXuBCcEgQP/Ao8CRwI0AkMCVAJPAkkCWwJuAk4CuwHjAEQA3v9K/2j+eP2q/Oj7Pvva+p/6T/rv+aT5cvlA+ff4k/gh+Lv3Wffm9lf2vfVG9Rf1A/XV9HX08/N+8x7znfL88WPx2fBz8GfwkfCv8LPw0fAh8XXxjvF38UbxIfEM8efwjPD671fv5+6/7tDu5u737izvnu8p8LLwOvHY8Xny6/IS8wPz3PK28oryTPIU8gfyB/L88QryafIb8wT08fS99Wf2E/e/9zr4V/g6+DD4S/hT+Cn48/f991z43/hW+cT5Rvr0+sP7j/w2/bX9Nv7M/jX/Tv9H/z3/Kf81/4//9f8lAF8AywAWAVYB7AGZAvwCWwPcA1EEqwTgBPwEIgVSBZAF1QX1Bd0FuAWpBd0FUgawBs8G9AZIB6kHzAfQBw0IYgiXCNAIIAlSCVIJagmaCWsJ5AjJCAcJ2QiGCJ8Ihgj9Bw8IGQn8CfQJhQmbCTUKbAr3CXUJMQkWCS0JSQm8CJAHCAe5B7gITAlvCf0IRQhLCCwJ+wn3CQkJwQfLBj8GDAZPBg8H7Ad1CIAICwgwB0sG6gW2BpMI3gn0CIEGrARhBM4EMwWzBXUG9wbfBm8G3wUPBSgEDASYBSAIxAk3CdQGWARZA6gDsAPiAt4CsgSZBmkGZgR/ApsCdwVDCawKGglOB4kGIwUUA6QC8AMaBdAFcAbVBrYG4wUqBXUFVwb6BtgGRgb4BcYFgwUFBoEHYQifB9cGLQcbB8YFuwRIBeQGGwhYCPYH9AZDBfIDPATcBTEHCwf1BZoFgAZQB9kGzAWuBZcGMgefBiMFqQPRApUC2gJtA5QD8QJNAoUCKgNHA84CUgIlAmEC3gLNApwB+/8Y/3P/YABuAAD/Jf1U/L/8NP23/On7KPx6/XT+LP5A/dX8PP2S/e78rfvA+l36D/qK+R75MPlu+WD5F/kk+cj5UvoD+nH5qfl++un6ofo1+hL6Ffr4+af5O/nT+Jr4pvjM+LH4Vfgw+Lf44fk0+/D7sfsz+3X7Ovym/F78uPs6+wr7APv++tz6rfqw+hP7x/tm/Jn8kvzD/HT9iP6J/xoAWwCrAD4B6wE/AvUBWwHhAJkAUwD1/47/U/9y/wEA+gAVAicDOQQ/BTIG8AZYB5gHwweiBwoHEQYcBXYEAgSqA5gDBgTXBKkFSAb8BhUIUwkMCv4JoAmBCYEJIAk2CCIHegZpBnoGQQbOBYYFqAUMBmMGkQacBocGXwZYBn0GZga/BdgEWAR5BJ8EJAQYAwkCaAEVAbgAYgBDAFwAdAA/AMz/W/8D/9f+3v7J/j3+SP19/CT80vsR+yP6m/mJ+Wj57Pho+D34JPi09xD3yPYA9yf3yvY19tH1nfVN9bT06fNF8/byxPJi8tzxdvFX8Wbxg/GW8ZfxjfGN8XTxJfHJ8KnwsPCc8E3w1+9g7w7v5+7t7g7vQe9476fvu+/W7yDwj/DX8PzwNPFq8VjxI/EI8QTx//AK8TnxmfH78S3yR/KQ8g7znfMR9Fr0jfTT9Cb1dPXc9Xj2+fYV9wz3MPdm96v3C/hu+Mz4LvmX+Rn6qvo4+7f7Jfyc/C39mf3G/QX+cv62/tL+Iv+h/+P/2P/v/3AAEgF2AcMBRwLdAkADhAPPAwoEOQSEBL4EywQHBX0FqwWBBX4FxwUPBicGLQZiBrcG4wbzBisHfQeuB78H0wf3Bx0IHQj6B+QH7wf+BwwIIQgyCEgIgQi9CNEIugiDCD0IGQgyCEoIEAjSB/4HVQh7CI4IpAijCIoIdghlCD8I9we8B7IHrQd4BzsHHgcKB/kGCQceBxUHBgceB0kHWwc7B/AGngZrBj0G+AWxBYwFqAXuBfkFnQUsBREFUQWVBZwF';\n\nconst PCM_DATA2 =\n  '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GwAXABYAFgAWABkAFgARABMAFQAWABYAFAAUABcAFQATABYAFgAUABYAGAAWABUAFAAVABgAFgAQABIAGQAYABMAEwAWABcAFwAVABUAFQAUABQAEwATABQAFAAVABMADgARABUAEgASABYAFgAVABcAFgASABEAEQARAA8ADgANAA0AEAAPAAwADgARABAAEAAQAA8AEgAVABIAEgATABEAEAANAAsADQALAAsADAALAAsADAAMAA4ADgAPABEAEQASABMAFAATABAAEAARABIAEAAMAAsADQAMAA4ADwALAA0ADAALAA4ADwAPABEAEQATABIADwAPABEAEQASABIAEQATABMADwARABEAEQATABAADgAPAA4ADwAOAA0ADwAPAA8ADgANABAAEwARAA8AEQASABMAFAASABQAFAASABIAEAAOABEAEgAPAAwADwATAA4ADQARABAAEAASAA8ADgANAA4AEAAOAA4AEAAMAAkADgAOAAoADgAQAAwADAAMAAwADwANAAoADgASAA0ACgAOAA8ACwAIAAsADAAKAAoACQAGAAgACgAIAAgACAAHAAwADQAJAAsADgAMAAoACgALAAwACgAIAAoADAAIAAQACAAKAAcABAAFAAgACgAIAAYACQAKAAgABwAHAAkACQAIAAgACAAJAAoACQAHAAkACAAGAAYABgAFAAUABgAGAAYABQAFAAcACAAHAAYABwAJAAgABgAJAAgABgAIAAYABAAFAAUABQADAAQABgADAAIABgAFAAEABAAHAAMAAgAHAAYABAAFAAIABAAIAAMAAgAGAAQABAADAAIABgAHAAEAAAACAP///P///wAA/v/9//7/AAABAAAA//8AAAEAAAAAAP//AAABAAAA/v/8//v//P/9//n/+f/8//v/+v/7//v/+//7//z/+//7//z//f/8//z//f/7//n/+//7//j/+P/3//f/+v/4//X/+f/5//b/9//3//j/+v/3//b/+//8//b/9//8//n/9//6//3/+//6//r/+f/5//j/9//4//j/9//4//f/9//4//b/+P/5//f/+f/5//f/+f/7//j/+f/8//v/+v/7//r/+//6//f/+f/6//n/9//3//r/+f/3//n/+v/6//z/+//4//j/+//7//j/+P/6//v/+P/4//n/+f/6//n/9//5//v/+//6//n/+f/7//z/+v/5//n/+f/6//n/9//5//z/+f/3//n/+v/5//n/+P/4//v/+f/4//r/+f/4//r/+v/5//n/+P/5//n/+P/4//n/9//4//j/9//4//j/+P/6//j/+P/6//j/9v/3//j/+P/3//f/+P/4//f/9v/2//f/9//2//f/+f/4//f/+P/5//v/+f/3//j/+P/3//n/+f/3//f/+f/4//b/9v/4//n/+f/4//j/+v/5//j/+P/4//r/+v/3//f/+//5//j/+v/6//r/+v/5//j/+v/6//r/+v/5//n/+v/6//n/+f/5//r/+//7//n/+v/8//v/+//9//z/+//8//z/+//7//r//P/8//r/+//8//v//P/8//v//P/9//3//v/9//v//f/+//3//P/+//7//P/9/////P/7//7//v/9//z//f/8//v//v////3////+////AgD+//3/AQD///7//////////////////v/9//7//v/+//7//P/9///////+//z//f///////f/9//7///8AAP///v/+///////+//7//f/+/////f/9//7//v/8//3//v/+//7///////7//f/+//3//f/+//7//f/+//7//v///////v////////////////////////8AAP7//P/+//////////7//v8BAP///f8AAAEA/////wAAAQD/////AQD/////AQAAAP//AQAAAAAAAgACAAEAAgABAAEAAgACAAIAAgAAAAEABAACAAAABAAFAAIAAgADAAMABAACAAEAAwAFAAQAAwACAAIAAwABAP//AgAEAAIAAwAFAAMAAwAEAAMAAwAFAAQABAAFAAQABAAGAAYABAADAAMABAAEAAQAAgADAAMAAgAEAAQAAwAEAAQABAAFAAMAAgADAAMAAwADAAIAAwACAAIAAgACAAMAAwADAAQAAwADAAQAAwADAAMABAAEAAEAAgAEAAIAAQADAAQAAwADAAYABAACAAUABAAEAAYAAwADAAQAAwAFAAYAAwAEAAQAAwAEAAUAAwAEAAUABAAEAAQAAwAFAAYABAADAAYABQADAAQABQAFAAQABQAFAAQABQAGAAQABAAFAAQABQAFAAQABQAHAAUAAwAGAAYABQAFAAQABAAGAAUABAAGAAUABAAFAAYABQADAAMABgAFAAQABAAEAAcABgAEAAUABAAFAAYABgAGAAYABQAGAAYABgAHAAYABQAHAAYABgAGAAUABgAHAAUABgAHAAYABgAGAAcABgADAAYACAAFAAcABwAEAAcABwAHAAcABQAHAAgABgAHAAgABQAFAAgABgADAAcACAAFAAUABAAFAAkABwAEAAcACAAHAAcABgAGAAcABwAGAAYABgAGAAcABgAFAAcABgAFAAcABgAEAAUABgAGAAYABQAGAAcABgAGAAYABgAGAAYABgAGAAQABAAIAAYAAgAGAAcAAwAFAAcABQADAAUACAAFAAMABgAEAAMABgAFAAQABwAFAAMACAAGAAIABQAFAAMABQAEAAQABgAEAAMABgAFAAIAAwAEAAUABAACAAQAAwADAAMAAgAEAAUAAwADAAMAAwAEAAMAAgABAAIABAADAAIAAgADAAMAAgABAAIAAwACAAEAAgADAAMAAwACAAIAAgACAAIAAQACAAMAAQABAAIAAQACAAIAAQACAAEAAQACAAIAAQACAAIAAgACAAEAAAABAAAAAQACAAEAAAAAAAEAAAAAAAIAAQAAAAEAAgAAAAAAAgABAAAAAQABAP//AAAAAP//AgABAP7/AQABAAAAAQAAAP//AQD/////AgABAP7/AAABAAAAAAABAAIAAQAAAAIAAQD//wIAAQD+////AgACAP////8CAAAAAAACAP////8BAAAAAAACAP7//v8CAAEA//8BAAAAAAAAAP//AAABAAAA//8AAAAA/////wAAAAABAAEAAAAAAAAA//8AAP//AAABAP////8AAP////8AAAAAAAAAAAAAAAD/////AgABAP7/AQABAAAA/////wAA/////wAAAAAAAAAA//8AAAEA/v///wEA/v/9/wEAAAD+/wIAAgD///7///8AAAAAAAAAAP///v8BAAAA/v8CAP////8DAP7///8BAP7/AAABAP3/AQACAP3//v8DAAAA+////wIA/v/+//7///8BAAAA/v8AAAEA//////7///8CAAEA/v8AAP////8BAP///v8AAAAA/v8AAP///v///wAA///+////AAAAAAAAAAD/////AAD//wAAAQD+////AQD///7/AAABAP7//v8BAAEA//8AAAEAAAAAAAAA/////wAAAAAAAAAA/////wEAAQD+////AAD//wAAAQAAAP//AAABAP////8AAAAA//8AAAAA//8AAAAA//8AAAAAAQABAP////8AAP//AAACAAAA/v8BAAIA/////wEA//8BAAAA/v8AAAAA//8BAP////8CAP///f8BAAEA/f8AAAIA//8AAAAAAAABAAEA//8AAAEAAAD//wAAAAAAAAAA/////wEA//8AAAAA//8BAAAA//8AAAAAAAAAAP////8AAAEAAQAAAAAAAAAAAP//AAABAP////8AAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAP//AQABAP////8BAAAA/v///wEA/////wAA//8AAAAAAAABAAAA//8AAAAAAAABAAAA//8BAAEA//8AAAAA//8AAAAAAAABAAEAAAAAAAEAAAD//wAAAQABAAEAAQABAAAAAQABAAAAAAABAAEAAQABAAAAAQABAAEAAQAAAAAAAQABAAAAAQABAAAAAQABAAEAAQABAAEAAgABAAEAAQABAAEAAAACAAIAAQACAAEAAQACAAEAAQABAAEAAwACAAEAAQABAAEAAgACAAEAAQACAAMAAgAAAAIAAwABAAIAAwAAAAAAAwADAAIAAwAAAAEABAABAAEAAgABAAIAAgABAAQAAwABAAEAAwACAAAAAQADAAEAAQACAAIAAgACAAEAAgACAAIAAgACAAEAAwADAAIAAgABAAAAAwACAAEAAwACAAEAAwADAAAAAgADAAEAAQACAAMAAgABAAMAAgABAAMAAgABAAIAAwACAAMAAQD//wMAAwAAAAIAAgABAAMAAgABAAMAAwAAAAIAAwACAAIAAgACAAMAAgACAAIAAgACAAIAAgADAAIAAgADAAIAAQADAAMAAgACAAMAAgABAAIAAgADAAMAAgACAAMAAwACAAIAAgACAAIAAgACAAIAAgADAAEAAQADAAMAAQACAAIAAQABAAMAAgAAAAEAAwACAAAAAgADAAEAAgADAAIAAgACAAIAAwACAAEAAgADAAIAAQACAAIAAgACAAIAAgADAAIAAwADAAIAAgACAAEAAgACAAIAAgACAAEAAAABAAIAAQABAAEAAQABAAEAAgABAAAAAQABAAEAAgD//wAAAwAAAAEAAwABAAAAAAAAAAEAAAD//wAAAgABAAAAAQACAAEA//8AAAEAAAAAAAIAAQABAAIAAgABAAAAAgABAAAAAgAAAAEAAgAAAAEAAwAAAAAAAgACAAEAAAACAAEA//8BAAIAAAABAAEAAAABAAEAAQABAAEAAQABAAIAAQAAAAEAAgACAAIAAQAAAAIAAgABAAEAAgABAAEAAQABAAEAAgABAAIAAgAAAAEAAwAAAP//AgACAAEAAQACAAIAAAABAAIAAQABAAIAAQABAAIAAAACAAMAAAACAAIAAAABAAEAAQADAAIAAAACAAMAAAAAAAEAAgACAAAAAAACAAIAAQABAAEAAgACAAEAAQAAAAAAAwADAAAAAQADAAIAAAACAAMAAQABAAEAAgABAAEAAgAAAAEAAwACAP7/AQADAAEAAQADAAEAAgADAAAAAQAFAAAA//8EAAEAAAADAAMAAQABAAEAAQABAAEAAQABAAIAAgAAAAIABAABAAEAAwABAAEAAgABAAAAAgACAAIAAgABAAEAAwACAAAAAgADAAEAAAACAAIAAQABAAEAAgABAAIAAgAAAAEAAwABAP//AgADAAAAAQABAAEAAQAAAAEAAgACAAIAAQACAAAAAAACAAEAAAABAAEAAQABAAEAAgABAP//AgADAAAAAQAEAAAAAAADAAEA//8BAAMAAQD//wEAAgAAAAIAAwD//wEAAwD//wIAAwD+/wEABAAAAAEAAgAAAAIAAQD+/wIABAD///7/BAADAP//AQACAAEAAgABAAEAAgABAAEAAQAAAAEAAwAAAP//AgAAAAAAAwABAAAAAgABAAAAAQAAAAEAAgABAAEAAQABAAEAAQAAAP//AQACAAEAAQACAAEAAQACAAEAAAABAAEAAQABAAEAAQABAAEAAQABAP//AAACAAAAAQACAAAAAQABAAEAAQABAAIAAgABAAEAAQABAAEAAAAAAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAIAAQAAAAEAAQAAAAEAAQABAAAAAQABAAAAAAABAAEAAAAAAAEAAAABAAEAAQAAAP//AgABAP//AQACAP//AQACAAAAAQACAP//AgADAP//AQACAP//AQABAAIAAgAAAAAAAQABAAEAAAAAAAEAAQD//wEAAQAAAAIAAQAAAAIAAQABAAEAAAABAAMAAQD//wAAAgABAP//AQACAAAAAAABAAAA//8BAAIAAAD+/wIAAgD+/wAAAgD//wAAAwABAP//AQAAAAAAAwAAAP//AwABAP//AgABAAEAAAD//wAAAgAAAP//AQADAAEAAAABAAEAAQABAAAAAQAAAAAAAQAAAAAAAQAAAAEAAQAAAAEAAQABAAIAAgABAAEAAQABAAIAAQABAAEAAAACAAMA//8BAAIAAAAAAAIAAgAAAAAAAgACAAEAAQAAAAAAAgACAAEAAQABAAIAAQAAAAIAAwAAAAEAAwAAAAAAAgABAAEAAQD//wEAAwAAAAAAAgABAAAAAQAAAAIAAgAAAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAIAAQAAAAIAAgABAAEAAQACAAIAAQAAAAEAAgABAAEAAgABAAEAAgABAAAAAQABAAEAAgACAAIAAQABAAEAAQABAAEAAgACAAIAAgABAAEAAQAAAAEAAgABAAEAAQABAAEAAQACAAIAAQABAAEAAgABAAEAAQABAAEAAgACAAEAAQABAAEAAQABAAIAAgABAAEAAgABAAEAAgABAAAAAQABAAAAAQABAAEAAgABAAEAAQABAAIAAgAAAAEAAgACAAEAAgACAAAAAQADAAEAAQABAAEAAgABAAEAAQAAAAEAAwABAP//AgACAAAAAgADAAEAAQACAAIAAgABAAEAAQACAAIAAQACAAEAAgACAAAAAQADAAAAAQADAAEAAQACAAEAAQADAAEAAAACAAEAAAACAAIAAgABAAEAAQABAAEAAgACAAEAAgACAAEAAgABAAEAAwABAAAAAwACAAEAAQACAAIAAQACAAIAAQABAAEAAQACAAEA//8BAAIAAAABAAMAAQABAAIAAgABAAAAAgACAAAAAQABAAEAAgABAAAAAgABAAEAAwADAAAAAAADAAAA//8DAAMA//8AAAMAAQAAAAIAAgAAAAEAAgABAAIAAQABAAIAAQABAAIAAQABAAIAAAD//wMAAwD//wEAAwABAAEAAwAAAAIABAD//wEABAAAAAAAAwACAAEAAQAAAAIAAgABAAIAAgABAAMAAQABAAIAAAACAAMAAAACAAMAAQABAAIAAgABAAEAAQACAAIAAAAAAAEAAgABAAEAAQACAAMAAQABAAIAAgACAAIAAQABAAIAAgACAAIAAQACAAIAAQABAAEAAQABAAEAAQAAAAEAAgACAAEAAQACAAEAAQABAAEAAgABAAEAAwACAAAAAQACAAEAAQACAAIAAAABAAMAAQAAAAIAAgABAAEAAgABAP//AgACAAEAAwAAAAAABAABAAAAAwABAAAAAgABAAEAAgABAAEAAgABAAAAAQACAAEAAAAAAAEAAgABAAEAAQACAAIAAQABAAEAAgACAAMAAQABAAMAAgAAAAEAAgABAAIAAQAAAAIAAQAAAAEAAQABAAEAAQABAAIAAQAAAAEAAQAAAAEAAQABAAAAAAACAAEAAQABAAAAAAAAAAEAAQD//wEAAQD//wAAAwABAAAAAgABAAAAAQAAAAAAAQABAAEAAgABAAEAAQAAAAEAAgABAAEAAgABAAEAAQAAAAEAAgAAAAAAAwABAAAAAQABAAEAAQABAAEAAAABAAIAAQABAAIAAQACAAMAAAAAAAIAAQABAAIAAAAAAAEAAQADAAMAAAAAAAMAAQAAAAEAAQABAAEAAQABAAEAAQABAAAAAQACAAIAAAABAAMAAgABAAIAAQAAAAEAAwABAAEAAQABAAEAAgABAAEAAAAAAAIAAgABAAMAAgAAAAEAAgABAAEAAQABAAEAAgAAAAAAAwABAAAAAwACAP//AQACAAEAAQACAAEAAAAAAAIAAQAAAAIAAQABAAMAAAAAAAIAAAABAAIAAQABAAEAAAACAAIAAAAAAAMAAgAAAAEAAgACAAIAAQABAAIAAQABAAEAAAACAAIA/////wIAAQD//wEAAgABAAEAAQABAAIAAQAAAAEAAQAAAAEAAQAAAAAAAQABAAEAAQABAAEAAgACAAEAAQAAAAEAAgAAAAAAAgABAAEAAgACAAEAAQACAAEA//8BAAIAAAABAAIAAQAAAAEAAAACAAIAAAACAAIAAAAAAAEAAQABAAAAAQABAAAAAQABAAAAAAACAAIA//8BAAMAAQAAAAIAAgABAAEAAwABAP//AwACAP//AQABAAAAAgAAAP7/AgADAP//AAADAAAAAQACAAEAAQAAAP//AgACAAAA//8CAAIA//8BAAIAAAAAAAIAAgAAAAAAAgABAAAAAgACAP//AAADAAEAAAACAAIAAQACAAEAAAACAAEAAAACAAEAAAACAAEAAAACAAAA/v8CAAIA//8BAAMAAQAAAAEAAAABAAIA//8AAAIAAAD//wMAAgAAAAEAAQAAAAAAAQACAAEA//8DAAEA//8CAAEAAQADAAEAAQABAAAAAQACAAAAAQACAAAAAQACAP////8CAAEAAQACAP//AAAEAAAAAAADAAEAAAABAAEAAQABAAAAAQACAAEAAAAAAAAAAAD//wEAAgD//wEAAgAAAAEAAQAAAAIAAAAAAAIAAQAAAAAAAQABAAAAAAACAAIAAQABAAEAAAABAAEAAAAAAAIAAgACAAAAAQABAAIAAQD//wAAAgABAAEAAQAAAAAAAgABAAEAAgABAAEAAgABAAEAAgABAAAAAAABAAIAAQABAAEAAQABAAAAAAABAAIAAAABAAEAAAABAAMAAAD//wMAAwD//wAAAgABAAAAAQABAAEAAgABAAIAAgABAAIAAgAAAAIAAgAAAAEAAwAAAAAAAgAAAAAAAgABAAEAAgABAAAAAgABAAAAAQABAAEAAwABAAAAAgABAAAAAgACAAEAAQABAAIAAgABAAAAAgADAAEAAAACAAEAAQACAAIAAAAAAAEAAQABAAAAAQABAAIAAQABAAEAAQACAAEA//8BAAMAAAABAAIAAQAAAAIAAgAAAAEAAgABAAEAAQABAAEAAQAAAAEAAgACAAEAAQABAAIAAgABAAEAAgACAAEAAQAAAAEAAgABAAEAAgABAAIAAgABAAEAAAAAAAIAAgAAAAAAAQABAAEAAQABAAIAAQACAAMAAAABAAEAAQABAAIAAQABAAAAAQACAAEAAQABAAEAAgABAAAAAQABAAEAAgACAAAAAQADAAEA//8BAAIAAAABAAIAAgABAAEAAQABAAEAAQAAAAEAAQABAAEAAQABAAEAAQAAAAEAAAAAAAIAAQABAAIAAgABAAIAAQAAAAMAAwD//wEAAgABAAIAAQABAAIAAAACAAEAAAACAAAAAQACAAAAAQACAAAA//8DAAMA//8AAAMAAgAAAAEAAgABAAEAAgABAAAAAgACAAAAAQABAAEAAwABAP//AQACAAAAAQABAAEAAgABAAAAAgACAAEAAQABAAEAAgACAAEAAQABAAEAAQACAAEAAQABAAEAAQABAAIAAgABAAEAAQABAAEAAQAAAAIAAgD//wIAAgAAAAEAAgABAAAAAQADAAAA//8CAAEAAAACAAEAAAADAAIAAAADAAIAAAACAAEAAAACAAEAAgABAAAAAgACAAEAAQABAAIAAgABAAEAAQABAAEAAQABAAEAAQADAAEAAAACAAIAAAABAAIAAQAAAAIAAgAAAAEAAgABAAEAAQABAAEAAQACAAIAAQACAAMAAQABAAMAAQD//wEAAgAAAAEAAgAAAAIAAQAAAAMAAgAAAAIAAQAAAAQAAwD//wIAAgD+/wEAAgABAAEAAQAAAAIAAgD//wEABAABAP//AgADAAEAAQAEAAEA//8CAAMA//8AAAMAAQABAAEA//8CAAIA//8BAAEAAQACAAEAAAADAAIA//8BAAIAAQACAAIAAAACAAIAAAABAAMAAQAAAAEAAQABAAIAAQABAAIAAQABAAIAAAAAAAEAAgABAAAAAQACAAEAAQADAAEAAAACAAIAAAABAAMAAQAAAAEAAgABAAEAAgABAAEAAgABAAEAAQABAAEAAAAAAAIAAQD//wIAAgAAAAIAAgAAAAEAAgAAAAIAAgAAAAEAAwAAAAAAAgACAAEAAQAAAAEAAgABAAEAAQABAAIAAQABAAEAAAACAAMAAAABAAIAAAAAAAEAAQAAAAAAAgABAAAAAQABAAAAAQACAAEAAAABAAEAAQABAAEAAgABAAEAAQAAAP//AQABAP7/AQADAAEAAQABAP//AQADAP//AAADAAAAAQACAAEAAQABAAAAAQABAAEAAQABAAIAAQABAAIAAgAAAAEAAQAAAAEAAQAAAAEAAQABAAIAAQD//wEAAwABAAAAAgACAAAAAAABAAEAAQACAAIAAQABAAIAAQAAAAIAAwAAAAAAAwABAP//AQABAAAAAQABAAAAAgACAAEAAQABAAEAAgABAAEAAwABAP//AwACAAAAAgACAAAAAgACAAAAAgACAP//AQADAAEAAAABAAEAAQABAAEAAQABAAIAAgAAAAEAAQAAAAIAAQD+/wIAAgD//wIAAgAAAAAAAAABAAEAAAAAAAEAAgACAAAAAQACAAEAAQACAAEAAQACAAEAAQABAAEAAgACAAEAAAABAAIAAAAAAAMAAQD//wEAAgAAAAEAAgABAAAAAQACAAEAAAACAAIAAAACAAIAAAACAAIAAAACAAIA//8CAAQAAAD//wEAAQACAAIAAAABAAIAAAAAAAIAAgAAAAEAAgABAAAAAQABAAEAAgACAAEAAQABAAEAAQABAAEAAQABAAEAAAABAAIAAAABAAIAAQABAAIAAQABAAIAAQABAAIAAQABAAMAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAQACAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAQABAAEAAQABAAEAAQABAAIAAgABAAEAAgABAAEAAgACAAEAAQABAAAAAgACAAAAAQACAAAAAQABAAAAAQABAAEAAgABAAAAAQACAAEAAQABAAEAAQAAAAEAAQAAAAEAAgABAAEAAgABAAAAAgADAAEAAQABAAEAAgACAAAAAQADAAEAAAACAAEAAAACAAIAAAAAAAIAAgABAAEAAQABAAEAAgABAAEAAgABAAEAAgAAAAAAAgABAAAAAQABAAEAAQACAAEAAQABAAEAAQACAAEAAAACAAEAAQACAAAAAQABAAAAAQABAAEAAAABAAIAAAAAAAIAAQABAAIAAQABAAIAAQABAAMAAgAAAAIAAgABAAEAAgACAAAAAAACAAEAAQACAAEAAAACAAIAAgABAAAAAAABAAEAAQABAAIAAQAAAAEAAQAAAAEAAgABAAEAAgABAAEAAQACAAEAAAABAAIAAAAAAAIAAQAAAAIAAgAAAAAAAwACAP//AQADAAAAAQACAP//AgACAAEAAgAAAAAAAwAAAAAABAABAP//AwACAP7/AgACAAAAAgAAAP//AwADAP//AAACAAEAAAABAAIAAQABAAIAAAAAAAIAAQAAAAEAAQABAAIAAQAAAAIAAgAAAAEAAgABAAEAAgABAAEAAgAAAAEAAgABAAAAAQABAAEAAQAAAAEAAgABAAEAAgABAAEAAQACAAIAAQABAAEAAQABAAEAAQACAAIAAQABAAEAAAACAAEAAQACAAEAAQADAAEA//8BAAMAAQAAAAIAAgABAAEAAQABAAEAAQACAAEAAQADAAIAAAACAAQAAQAAAAMAAQD//wIAAgAAAAEAAQAAAAIAAgAAAAIAAQAAAAEAAQACAAMAAQAAAAIAAQAAAAIAAQAAAAIAAQAAAAMAAwAAAAEAAgABAAEAAQABAAEAAgACAAEAAQABAAIAAQABAAEAAAACAAEA/v8CAAIA//8BAAEAAAABAAEAAQACAAEAAAABAAIAAQABAAEAAgACAAEAAQABAAIAAQAAAAEAAgABAAIAAwABAAAAAQACAAAAAAACAAEAAAACAAEAAQACAAEAAQACAAEAAQABAAAAAQACAAAAAgACAAAAAQABAAAAAQACAAAAAQACAAAAAAACAAIAAQAAAAEAAgABAAEAAQABAAIAAQABAAIAAQABAAIAAgAAAAEAAgABAAAAAgACAAEAAQACAAIAAQABAAEAAAABAAMAAQAAAAEAAQABAAEAAQABAAEAAQACAAEAAAACAAMA//8BAAMA/////wMAAgAAAAIAAQABAAMAAQABAAIAAAABAAIAAAACAAMAAAABAAIAAAAAAAIAAQABAAIAAAAAAAMAAgD//wIAAwAAAAAAAgACAAAAAgACAAAAAAACAAEAAAABAAAAAQAEAAAA//8DAAEAAAACAAEAAgABAAAAAQACAAEAAAABAAMAAQAAAAIAAgABAAIAAgABAAEAAgACAP//AAADAAEAAAABAAEAAAACAAIAAAABAAIAAQABAAIAAAAAAAIAAQABAAIAAgABAAEAAQABAAEAAQABAAEAAQACAAEA//8BAAIAAQABAAIAAQAAAAEAAgABAAAAAQABAAAAAQACAAAA//8CAAEAAAADAAAAAQAFAAAA//8DAAAAAQACAAAAAgADAAAAAQADAAEA//8BAAIAAQD//wAAAQABAAEAAQABAAIAAgABAAEAAAACAAIAAQABAAAAAQADAAEAAAACAAEAAQACAAEAAAABAAEAAQABAAEAAgABAAEAAgABAAEAAgAAAAEAAgAAAAEAAgABAAAAAgACAAEAAQABAAEAAQABAAEAAgACAAEAAAABAAIAAQABAAEAAQACAAIAAQAAAAEAAQABAAEAAgACAAEAAgACAAAAAQABAAEAAQACAAEAAQABAAEAAgABAAEAAgABAAEAAgACAAEAAAACAAIAAAABAAEAAAABAAIAAQABAAEAAQABAAIAAQABAAEAAQACAAAA/v8BAAIA//8AAAIAAAABAAEAAAABAAIAAQABAAEAAAABAAEAAQACAAEA//8BAAIAAAAAAAIAAQAAAAEAAQABAAIAAQABAAEAAAAAAAEAAQABAAEAAAABAAIAAQABAAEAAgABAAEAAQABAAIAAgABAAEAAQAAAAIAAQABAAAAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAgACAAEAAAACAAEAAAACAAIAAAABAAIAAQAAAAAAAQABAAIAAQABAAEAAQABAAEAAQACAAIAAAABAAMAAAAAAAIAAQABAAIA//8BAAMAAQABAAIAAAABAAIAAQACAAIAAQACAAMAAQAAAAEAAgABAAAAAQABAAEAAgABAAAAAQABAAEAAgAAAAEAAgABAAEAAAABAAIAAQAAAAIAAgAAAAIAAgAAAAIAAQABAAIAAQACAAMAAAABAAEAAgACAP//AQACAAAAAAACAAAAAAACAAIAAAABAAIAAgAAAAEAAwABAAAAAwABAP//AgACAAAAAgABAAAAAwACAP//AgABAP//AQABAAEAAgABAAAAAgACAAAAAQAAAAAAAgACAAAAAgABAAAAAQACAAEAAAABAAEAAQABAAEAAQABAAIAAQAAAAEAAAAAAAMAAQD+/wIAAgD//wEAAgABAAEAAQABAAEAAQABAAEAAAABAAIAAAADAAIAAAADAAIAAAADAAEAAAACAAEAAgACAAAAAAACAAIAAAABAAIAAgABAAEAAQABAAIAAQAAAAIAAgABAAEAAAAAAAEAAgABAAEAAQABAAIAAgAAAAEAAgABAAAAAQABAAEAAQABAAEAAgACAAEAAQABAAIAAQAAAAEAAQAAAAIAAQAAAAIAAQAAAAIAAQABAAIAAAABAAMAAQD//wIAAgD//wAAAgABAAAAAQABAAAAAQAAAAAAAQABAAEAAQAAAAEAAgAAAAEAAwAAAAAAAgABAAEAAgABAAEAAgAAAAEAAwABAAAAAQACAAIAAQAAAAAAAgABAAAAAQABAAEAAQACAAEAAQABAAEAAQAAAAEAAQABAAIAAgABAAAAAQABAAAAAAABAAEAAAABAAEAAAAAAAEAAQABAAEAAQACAAEAAQACAAEAAQACAAEAAQABAAEAAQACAAEAAQACAAEAAQACAAEA//8BAAIAAQAAAAEAAQAAAAIAAgABAAEAAQAAAAEAAgABAAIAAgABAAIAAQABAAIAAQD//wEAAgAAAAAAAgAAAAAAAgAAAAEAAgAAAAAAAgAAAAEAAgAAAAEAAQD//wEAAgABAAAAAQACAAEAAAACAAIAAQACAAIAAAAAAAIAAwABAAEAAQABAAEAAQABAAEAAgAAAAEAAwABAP7/AgADAP7/AQAEAAAAAAADAAIAAQAAAAIAAQD//wMAAwD//wEAAwAAAAIAAgD+/wMABAD//wIAAwD//wEAAgABAAMAAQD//wEABAAAAP//AgACAAEAAgAAAAAAAgABAAEAAgABAAEAAgABAAIAAgABAAEAAgABAAAAAQACAAAAAAABAAIAAAABAAIAAQABAAEAAQACAAEAAQABAAEAAQAAAAEAAgAAAAAAAwABAAEAAwACAAEAAQACAAEAAQABAAEAAQACAAEAAAACAAEAAQACAAIAAAAAAAIAAQAAAAIAAQAAAAIAAQABAAIAAAD//wEAAgAAAAEAAgABAAAAAgACAAEAAgABAAEAAQABAAEAAgACAAEAAQACAAAAAAABAAIAAAAAAAQAAQD//wIAAgAAAAEAAgACAAEAAQADAAEA//8CAAIA//8CAAMA/////wMAAgAAAAEAAAABAAMAAAAAAAEAAAACAAIAAAABAAMAAAAAAAMAAQD//wIAAgAAAAIAAQAAAAQAAgD//wMAAwAAAAEAAgABAAEAAQABAAEAAQAAAAEAAQABAAEAAQACAAAAAAACAAEAAAACAAIAAQABAAEAAQACAAEAAAABAAEAAgACAAEAAQACAAEAAQACAAEAAAAAAAEAAQABAAEAAgAAAAAAAgABAAAAAgACAAEAAQABAAEAAwACAAAAAgABAAEAAgABAAEAAgABAAEAAQABAAAAAAACAAEAAQABAAAAAQACAAEAAQACAAEAAQACAAIAAQABAAIAAQABAAEAAgABAAEAAgABAAEAAQACAAEAAQABAAEAAgABAAEAAgAAAAIAAgAAAAIAAQAAAAMAAQAAAAMAAgD//wEAAgAAAAEAAgACAAEAAAACAAMAAQABAAEA//8BAAIAAAACAAIAAAADAAMA//8BAAMAAAAAAAEAAgACAAEAAQABAAEAAQACAAAAAQACAAAAAQABAAAAAgABAAEAAgAAAAAAAwAAAAAAAwABAP//AQACAAEAAQABAAEAAgADAAEAAAACAAEAAAACAAIAAQACAAEAAQACAAEAAQACAAAAAQACAAEAAQAAAAAAAgABAAEAAgABAAEAAgABAAEAAQACAAEAAQABAAEAAQABAAEAAQACAAIAAgAAAAAAAgACAAAAAQACAAAA//8CAAIAAAACAAMAAQABAAIAAgACAAIAAQABAAIAAQACAAEAAAACAAIAAAABAAIAAAABAAIAAAAAAAEAAAABAAIAAAAAAAIAAQABAAEAAAABAAIAAAAAAAIAAQAAAAEAAQABAAEAAQACAAAAAQACAAAAAQACAAEAAQABAAIAAQD+////AAD//wAAAQAAAAEAAgAAAAEAAgAAAAEAAgAAAAEAAgABAAEAAQAAAAEAAgAAAAEAAQABAAEAAQAAAAEAAQABAAEAAQABAAEAAAAAAAEAAQABAAEAAAABAAEAAQABAAEAAQACAAEAAAACAAIAAQAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAQACAAAAAQACAAAAAQACAAEAAQABAAEAAgABAAAAAQACAAIAAQABAAEAAQABAAIAAQABAAEAAQABAAEAAQAAAAEAAQAAAAEAAgABAAEAAQABAAEAAAABAAEAAQABAAEAAQACAAEAAQABAAAAAQABAAEAAQABAAEAAQAAAAEAAQAAAAEAAQAAAAAAAAABAAAAAAABAAEAAAAAAAEAAAABAAEAAQABAAIAAQABAAIAAQACAAMAAQAAAAEAAgABAAEAAQABAAEAAQAAAAEAAQABAAEAAQABAAAAAQABAAAAAQABAAEAAgACAAAAAgACAAEAAQACAAIAAAABAAIAAQAAAAEAAQABAAEAAQABAAEAAAABAAEAAAABAAEAAAABAAAAAgADAAAAAAADAAEAAQAEAAMA//8AAAMAAgAAAAEAAgAAAAAAAwABAAAAAgABAAAAAgAAAAAAAwABAP//AgACAP//AQADAAEAAQABAAEAAgACAAEAAQABAAEAAgABAAEAAQABAAEAAQABAAEAAAACAAMAAAAAAAMAAQD//wIAAgD//wEAAwABAAEAAQAAAAIAAwAAAAEAAgABAAEAAQAAAAIAAgD//wEAAgD//wAAAgAAAAEAAAAAAAEAAQAAAAEAAQABAAIAAQAAAAIAAwABAAEAAgACAAAAAQACAAAAAQACAAAAAQACAAEAAQAAAAAAAgABAAEAAgABAAAAAgABAAAAAQABAAAAAwABAP//AgACAAAAAQACAAAAAQABAAEAAwACAAAAAgADAAEAAQABAAEAAQAAAAIAAQD//wEAAQAAAAEAAQAAAAEAAQACAAIAAQABAAEAAgACAAEAAQADAAIAAQADAAIAAQACAAAAAQACAAEAAgACAAAAAQABAAIAAQD//wEAAQAAAAEAAQAAAAEAAgABAAIAAgABAAIAAQAAAAIAAgABAAAAAAACAAEAAAACAAEAAQACAAEAAAD//wEAAgAAAAAAAgABAAAAAQABAAAAAgACAAEAAgABAAEAAwACAP//AQAEAAEAAAADAAIAAAAAAAIAAQD//wIAAgD//wAAAQAAAAEAAQD//wEAAQAAAAEAAQAAAAEAAQABAAMAAwD//wIABAABAP//AgACAAAAAQABAAAAAwABAAEAAgAAAAAAAQD//wAAAwAAAAAAAgAAAAAAAwAAAAEAAgD//wAAAwABAP//AQACAAEAAAABAAMAAQABAAIAAAABAAIAAQACAAIAAAACAAMA/////wMAAgD//wIABAABAAAAAwADAAEAAQACAAEAAAADAAIAAAACAAEAAAADAAAAAQADAAAAAQACAAAAAwADAAAAAAADAAEA//8BAAIAAQABAAAAAAADAAIAAAACAAIAAAABAAEAAQACAAIAAgABAAAAAgADAAAAAQACAAEAAQACAAEAAQABAAIAAgAAAAEAAgAAAAEAAwABAP//AwADAAAAAQABAAAAAgABAP//AgACAP//AQABAAAAAgAAAAAAAgACAP//AQADAAEAAQACAAIAAgACAAMAAgABAAEAAAABAAIAAQACAAIAAQACAAEAAgABAP//AQABAP//AQABAP//AAACAAEAAQABAAEAAgABAAAAAQACAAEAAQABAAMAAQAAAAIAAgABAAMAAwAAAAAAAgACAP7///8DAAEA/v8BAAEA//8BAAMAAAAAAAIAAgACAAIAAAABAAMAAgABAAIAAQACAAIAAAABAAMAAAAAAAIAAQABAAEA//8BAAMA/////wIAAQD//wEAAgACAAEAAQABAAEAAAACAAIAAAACAAIAAQADAAEAAQAEAAEAAQADAAEAAAABAAEAAQACAAAAAAACAAEAAAABAAEAAQAAAAAAAgABAAEAAAABAAMAAgAAAAIAAQAAAAIAAwABAAEAAwACAAAAAQABAAEAAwABAAAAAgABAAAAAQABAAEAAQAAAAEAAQAAAAEAAQABAAIAAgABAAEAAQABAAIAAgABAAEAAQABAAIAAQAAAAAAAAABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAAAAQACAAIAAQABAAIAAgACAAEAAgACAAIAAwABAAAAAQACAAIAAgABAAEAAAABAAIAAAAAAAIAAQABAAEAAQAAAP//AgACAAAAAgABAAIABAABAAAAAwABAAAAAgACAAEAAQACAAMAAQAAAAEAAQAAAAEAAAAAAAEAAQAAAAAAAAACAAIAAAABAAEAAAACAAIAAAAAAAIAAgACAAIAAAABAAMAAAAAAAIAAQD//wEAAgABAAAAAQABAAEAAAABAAAAAAABAAEAAAABAAEAAQADAAEAAQADAAEAAAACAAIAAQABAAEAAgACAAEAAAAAAAEAAgABAAAAAQABAAEAAAABAAIAAQAAAAIAAQD//wIAAwAAAAAAAwABAAAAAgABAAEAAwABAAAAAgABAAEAAgAAAAIAAgD//wAAAgAAAP//AgACAAAAAQABAAEAAgACAAEAAQABAAIAAgABAAEAAgAAAP7/AQACAP3///8CAAAAAQABAP//AAABAAEAAQABAAAAAAABAAEAAgABAAAAAQADAAEAAAABAAAAAAABAAEAAAABAAEAAQACAAEAAAABAAAAAAAAAAAAAQABAAEAAAABAAEAAAAAAAIAAQABAAIAAgABAAEAAwADAAAAAQACAAAA//8BAAIAAQABAAMAAgAAAAIAAAAAAAIA/////wEA//8BAAIAAQABAAEAAAABAAEAAQACAAIAAgACAAEAAAACAAMAAQABAAMAAgAAAAAAAQAAAP//AQABAP//AAACAAAAAAABAAEAAQABAAAAAgADAAIAAQADAAMAAgACAAIAAQACAAEAAAACAAEAAAACAAEAAAD/////AAAAAAAAAAAAAAIAAAD//wEAAAAAAAEAAQACAAIAAQACAAIAAgACAAEAAQACAAEAAQABAP//AAABAAAAAAAAAAAAAgABAAAAAQD//wAAAQABAAIAAgABAAIAAwACAAIAAQACAAMAAQABAAIAAQABAAIAAQD//wEAAgAAAP////8AAAIAAQAAAAEAAQABAAIAAQABAAIAAgABAAIAAgACAAMAAgABAAMAAQAAAAIAAgD//wAAAQABAAEAAAAAAAEAAQACAAIAAQABAAEAAQACAP////8EAAIA/v8CAAIA//8BAAMAAQD//wAAAwABAAAAAQAAAAAAAwACAAAAAgAAAAAABAACAP//AgABAAEAAwABAAEAAwABAAAAAwACAP//AAACAAIAAQAAAAAAAQACAAEAAQACAAIAAQABAAEAAQACAAEAAQABAAEAAQABAAEAAAAAAAEAAAD//wEAAQAAAAAAAQACAAIAAgACAAEAAQABAAEAAAABAAIAAQABAAEAAQADAAIAAQACAAEAAAABAAEAAAABAAEAAQABAAEAAAAAAP//AQACAAEAAAABAAEAAAABAAIAAgABAAMAAgABAAEAAwACAAEAAgABAP//AAD///7/AgABAP7/AQACAP//AQAAAAAAAQD/////AwACAP//AQADAAIAAQADAAUAAwACAAQAAwAAAAIAAgD//wAAAgACAP7///8CAAAAAAABAP////8AAP//AAACAAAAAAAEAAIAAgAEAAMAAwACAAAAAQACAAEAAQACAAIAAAAAAAAAAAABAAEAAAABAAAA//8AAP//AAABAAAAAAABAAAAAAABAAIAAgACAAIAAwABAAEABAADAAEAAwADAAEAAAAAAAAA/////wAAAQABAAAA//8CAAIA//8AAAIA///+/wIAAQAAAAQABQACAAEAAgACAAIAAgADAAIAAAACAAEA//8CAAAAAQAEAAAAAQACAP//AgACAP7/AwAEAP//AAAFAAIA/f8BAAMAAAAAAAAAAAADAAIAAAACAAMAAQABAAAAAAACAAIAAQACAAAAAQADAAEAAQACAAEAAQABAAAA//8AAAEAAQAAAAEAAgABAAIAAgABAAEAAgABAAIAAgAAAAEAAwACAAEAAwADAAAA//8CAAIAAAACAAIAAQABAAAA/////wAA//8AAAEAAAAAAAMAAgAAAAIAAgAAAAEAAwADAAIAAgADAAEAAAABAAEA//8AAAAAAAABAAEAAAABAAEAAgACAAAAAAAAAP//AQACAAAAAAADAAQAAgACAAIAAQACAAIAAAABAAAAAAABAP////8CAP///f8CAAEA/v8BAAMAAAAAAAEAAQADAAMAAgADAAMAAgABAAIAAgACAAIAAAAAAAIAAAABAAIAAAABAAAA/v///wEAAAAAAAEAAQAAAAIAAwABAAEAAwACAAEAAQABAAAAAQACAAIAAgABAAAAAAABAAEAAAABAAAAAAD/////AQACAAEAAQAEAAIA/v8AAAIAAAAAAAIAAAABAAIAAwAEAAIAAgACAAEAAAACAAAA//8CAAIAAAAAAP////8AAAAAAAABAAEAAAAAAAEAAQAAAAIAAgACAAMAAgABAAIAAgACAAIAAAAAAAAAAQABAAEAAQABAAEAAQD///7/AAD/////AAAAAAAAAQACAAIAAgACAAMAAgACAAMAAgABAAEAAAACAAIAAQACAAIAAQABAAAA////////AgABAP//AAAAAP//AAACAAEAAAACAAQAAQAAAAQABAABAAMABQAAAP//BAADAAEAAgD/////AgD+////AQD+/wEAAQD//wQABAAAAAEAAwACAP7/AAACAP//AAACAAIABAADAAEAAgACAAEAAQAAAP//AgACAAEAAQD/////AQD/////AQAAAP//AQABAP//AQADAAIAAQADAAUAAgABAAQAAgAAAAMAAwAAAAEAAgABAAIAAAD9/wAAAQD+///////+/wEAAAD//wMAAgD+/wEAAgAAAAEAAgAEAAUABAACAAIAAgABAAAAAgACAAEAAgACAAAAAAABAAIA///9/wAA///+/wEAAgABAAEAAgADAAQABAAEAAMAAQACAAIAAQACAAMAAwADAAIAAAABAAIA//8AAAIA/v///wIAAAD+////AgACAAAAAgADAAEAAwADAAEAAQABAAAAAwADAAEAAgAEAAEAAQACAAEAAAAAAAAAAAAAAP//AAACAAEAAQABAAAAAQADAAMAAgADAAIAAgACAAIAAgACAAEAAAAAAAAAAQABAAAAAQABAAIABAABAAIABQACAAIABQADAAIAAwADAAQAAgABAAIAAwACAP////8AAP///f///wAA/v8AAAIAAQABAAIAAgABAAEABAADAAAAAgACAAEABAACAAIABQACAP/////+//3//v8BAP///f///wEAAQACAAEAAgAEAAMAAwADAAMAAwADAAMAAQAAAAEAAgACAAIAAAD/////////////AAABAAAAAQABAAAAAgADAAMABQADAAIAAgD///7/AQADAAMABAAEAAIAAAAAAP///v/+//////8AAAEAAAACAAQAAwAEAAQAAQABAAIAAgAEAAUAAwAEAAQAAQAAAAAAAAABAP//AAAAAP/////+//7/AQACAAIAAQAAAAAAAgAEAAIAAwAFAAMAAgAEAAYAAwABAAEAAQD////////+////AgAAAP3//v//////AQADAAMAAwADAAAAAQAEAAIAAQAEAAIAAQAEAAMAAgACAAEAAAAAAP7//v8AAAEAAQABAAIAAwABAAEAAgABAAAAAAD/////AQADAAQAAwACAAIAAgACAAEAAwAEAAIAAQACAAEAAAAAAAAAAgACAAMAAgAAAAAAAQD/////AgADAAEAAQACAAIAAgABAAIAAQABAAIAAQABAAIAAgADAAEA//////////8AAAAAAQAAAP7/AgAEAAIAAwAFAAEAAAADAAEA//8CAAUAAgD+/wEAAwACAAMAAwD+//7/AAD9////AQD9/wEABAAAAAEAAgABAAMAAgD//wEAAgD+//7/BgAHAAMAAwAEAAIAAgACAAEAAQAAAP///v/8/wAAAwD///7/AQD/////AQABAAEAAgACAAIAAwACAAIAAwADAAIAAwAEAAEA////////AQACAAIAAQACAAEAAgACAAAA/////wAAAAAAAAAA//8BAAMAAgADAAIAAQABAAIAAwACAAIABAADAAIAAwACAAQABAAAAAEAAQABAAIA/////wEAAQD/////AAAAAAAAAwAEAAIAAgABAAIAAwADAAMABAADAAQABAACAAIAAgAAAAAAAQABAAIAAwACAAEA//////7/+//7//3//v8AAAIAAgACAAIAAwADAAEAAgACAAEAAgAEAAQABgAHAAUABAACAP///v/8//v//v///wIABAADAAEAAAD///3//P/9////AAABAAIAAwAFAAYABQAGAAcABAADAAIAAQACAAMAAgAAAAAAAAAAAP7/AAABAAAA///+//3//f8AAAMAAgACAAUABQACAAQABQACAAIABQADAAAAAgADAAIABAABAAAAAAD9//z//v/9////AAD+/wEAAgAAAAAAAgAEAAMAAgABAAAABAAEAAAAAgABAAAAAwACAAAA///8//z//f/8//7///8CAAUABQAFAAUAAgACAAUAAwD///////8CAAQAAwAEAAQAAQAAAAAA///8//z/AQACAP7//v/+//7/AgAHAAcABgAGAAUAAAD9/wEAAwD//wIABQABAAEABAACAAAAAAD8//3/AAD9//7/AwACAAMABAAEAAcABwACAAAAAgABAAAAAgACAAAA///+/wAAAgABAAAA/v/+///////9//7/AgAFAAQABAACAAEAAwACAAIAAgABAAAAAQABAAAAAQACAAEAAQACAAIAAQABAAEAAAD+/wAAAgADAAMAAgABAAEAAAD//wEAAQD//wEAAAD///////8AAAIAAgAAAAAAAQABAAAAAwAGAAUABAAFAAIAAAAAAAAAAQADAAQABAADAAIABAACAAEAAAD8//z//P/6//7/AgABAAMABwAFAAIAAwADAAMAAgAAAAEAAQABAAEAAQADAAIAAAABAAAA/f///wEA/v/9/////v/8//7/AgAAAP7/AQABAAAAAwAEAAMABAAGAAYABQADAAEAAQACAAEAAAAAAP//AAAAAP3///8DAP3//f8CAAEAAAACAAAAAgAGAAEA/v8CAAAA/v8DAAUABQADAAEAAAD+//7/////////AgABAAEAAwACAAMABwAFAAUABwAEAAEAAQAAAAAAAQABAAMABAABAP7//f/8//v/+//7//7/AAABAAEAAwAGAAUAAgADAP///f8AAAIAAgADAAYABQAAAAAAAAD+/wEAAAD+/wAA/P/7//7///8CAAIA/v///wMAAAD//wQABQAFAAUAAwACAAQABQAGAAUAAQD+//3/+//9/////P/7//7////9//7/AQAAAAAAAwACAAIABQAFAAQAAwAAAAAAAwACAAEAAgACAAIAAQD//wAAAgACAAUAAgD8//7///8AAAMABgAIAAQAAwAEAP////8DAAIAAQAAAP///P/7////AgACAAMAAQAEAAgAAwACAAUAAwABAAEA//8AAAIAAwAFAAUABAADAAAA/f/9//z//P/+//7//v/+/wEABAACAAAAAQABAAEAAgABAP//AgAGAAgACAAFAAAAAAABAP7//f8BAAAA/f8AAAQAAgACAAIAAAD+//7//v/9//z///8BAAIABQAFAAQABgAEAAMABAABAAAAAAD//wIABAADAAMABgADAP//AAD///3//P/7//z//f/8//3/AwAGAAYABQAFAAYABQADAAEA//8AAAIAAgACAAMAAwADAAQAAQD//////P/7//v//P/+/wAAAQAEAAUAAwABAAEAAQACAAIABAAHAAgACQAJAAYABQAGAAUAAAD//wEAAAD+/wMAAwD9//3/AQD///7//P/8////BAAHAAgABQAAAAAAAwAGAAcABAABAAQABwADAP3//v/9//r//f8AAAAAAwAEAAMABAAAAP3//v/8//z//f/9/wEABwAGAAQABQAFAAMAAwADAAIAAgAAAAAAAgADAAQABQABAAAA///4//b/+v///wIABAAGAAUAAwAFAAMAAgACAP3/+//8//z/AQAGAAUAAwABAAEAAAD//wEAAgABAAEAAwACAAAAAgAEAAMABAAHAAYAAwACAAIAAQD9//v//P/7/wEABQABAAAAAQAAAAEA///9/wIABwAFAAQACAAIAAMAAwAEAAQABQADAAAA///9//7/AgAFAAQAAAD///7/+v/9/wIAAAABAP7/+v/6//n//f8DAAcABwADAP3//v8EAAgACwALAAcABgADAP//AAD+/wAAAwD///3/AAAAAAMABgAFAP//9//3//r/+//+/wEAAwAIAAkACAAJAAgABwAFAAEAAQAFAAIAAAACAAAA/f8AAP//+//4//n//P////////8DAAYABQAEAAMABAAFAAQAAgABAAIABwAIAAUABQAEAP7/+v/8//3//P/9//7//v/9//3/AAAEAAcACAAGAAMAAQAAAAEAAgD//wAABAABAPv//v8AAP7/AAAEAAEA/v8BAAUAAwAAAAEAAAABAAcACQAGAAYAAwADAAcAAwD9/////v///wEA/v///wQAAQAAAAUABAD+//7/AgADAAMAAQADAAYABgADAAIAAwACAP///v/+/wAAAAD9//v//P/+/wEAAgABAP////8AAAAAAAAEAAcABQAEAAYACAAJAAoACQAFAAAA/v/5//b/9//5//j/+//+/wAAAwAEAAUABwAJAAYAAwABAP7/AgAGAAgACgAHAAEA/v/7//3////8//r/+//6//n/+////wIABAAJAAkAAwACAAUACAAKAAoACAABAPz/+v/6/wAA///6////AAD9/////P/5//n/9//7/wUABQD/////AwAFAAkADgARAA4ACwAMAAgAAQAAAP7/+//+/wIA///3//j/AAACAAMAAgD7//j/9//4//3/BAAFAAcACwAJAAgACwAMAAsACAAFAAIA/v/6//j/+//+//z/+//8//v//v8BAAMABgADAP///f/6//v//////wIABAACAAAAAAAEAAcABwAGAAIA/f/9/wEAAQACAAUABwAFAAEA/P/7//v//P8AAAMABAAAAP7/AgAEAAAAAAD+//r/+v8AAAIAAwAKAA4ABwABAAAA/v/8//3/AQADAAEAAgAAAPz/AAAAAAIABwAFAAcACQAEAAYABAD//wcACwAEAAUADAAGAPz//v8BAPv/9v/2//j//P/8//3/BAAIAAMA/v/8////BQAEAAAAAwAGAAoADgAIAAYABwAFAAMA///3//P/8//3//f/9v/8/wIABwALAAoABQABAP3/+//9//3//f8CAAoADAANABAADQAFAAEAAwABAPz/+f/6//3/AAABAP///f/5//f/+v/9//3/AQAGAAMA/f/+/wIAAgAGAAwACwAHAAYABQADAAMABAADAP7/+//5//v///8AAAEABQAFAAMAAgD///3/+//5//n//P/9/wAADAASAA4ADAAMAAkABgACAP3//P/6//r//f/8//3//v/3//b//f////z///8CAAEAAAAAAAAABQAJAAoACwALAAcABQAGAAUAAgD8//j/+P/7//7/AQACAAEAAAD8//j/+/8AAAMABgAHAAgABwAIAAkABgAEAAYABAD///3/+//5//v///8DAAQA/v/4//r/AAACAAEAAgACAP////8AAAMABwAJAAoACgADAPr/+f/7//n/+v/9//3///8EAAoACwAIAAYABQACAAEAAQD+//7/AgAEAAMAAgD+//7////9//z//v/9//v/+v/8//3//P///wMACAALAAkABAADAAIABAADAP//+//7/wAAAgADAAcACQAHAAQA/v/6//r/+//8//3//P/9/wAAAwAIAAwACwAJAAQAAgAFAAQAAgABAAAAAQACAAEABAAIAAcAAwD8//b/9//+/wYABwAAAPr/+f/6//3////+/wAABQAEAP///v8IAA8ACgAJAAcA+v/2//7/AQD//wAA/v///wIA//////z/+P/9////AQAMAAwAAgADAAgABQD8//v//f/6//v//f8CAAsACQABAAMABAABAPz/9//5/wEABgAFAAUAAQD+/wEAAQAAAP7/+f/3//n/+v/8/wEABQAEAAUADAAPAAcAAgADAP///P8DAAUA/v///wYACAAGAP7/9f/3//n/9v/2//f/+/8BAAIABQAOAAsA///9//3//P/+/wQACwAQAA0ACgAIAAcABQABAAMAAwAAAP3//P/8/wIABwAIAAAA9//0/+//7//4/wAAAwAGAAkACwANAA4ADAAHAAEAAAD+//v///8HAAwADwANAAgABAD9//L/8f/1//P/9v/8//n/+P/+/wYACQAEAAUABwAHAAkABwACAAEA/////wQABgACAAIABQAEAAMAAwD+//n/+f/8//7//P/3//j//v8CAAIA/v/9/wIABwALAA0ADgANAAgABAADAP//+//3//T/+f/8//7//v/5//z/AwAIAAgA///7//////8EAA4ADgAMAA4AEQARAAsACQAJAAQA/P/2//L/8P/t/+3/9f/4//H/8//7//z///8DAAMAAgAHABIAEQAKAAwADQAMAAsABQAFAAYA///2//L/8f/y//X/9//0//L/9//8//7///8CAAsAEwARAA4ADwARABAADQALAAgAAgD8//n/+P/5//f/9v/3//j/+f/5//z/AgACAAEAAQAAAAMABwANABQAEgAOAAYA+f/1//7/BgAJAAoACgAGAAAA/P/4//P/8f/0//f/+//9//7/BAALAAwADQANAAoACQAIAAUABQAHAAcACQAFAPv/+f/7//7/AAD9//z//P/3//L/7//z//7/BwANAAwAAgD7/wAABAAEAAkADAAHAAMACQAKAAUAAAD//wAA/v/5//f/+P/9/wEA+v/y//X/+P/6/wAACgARABEACgACAAAAAQD9//3/AQADAAIAAwAFAAQAAwD///v/+v/5//z/AgADAAIABAAIAAwACgAJAAsABAD9//n/9f/3//3/AAD///3//v////7/AAAGAAsACwAHAAQABQAEAAIAAwAJAAsACgAJAAQA/f/9////+P/2//z//f/3//f//v8DAAUABgAGAAIABAAJAAgACAALAAoABQD7//T/8//0//r////+//v/+P/5/wMACQAGAAsADwAGAAQACwAHAP//BgALAP7/8f/7/woACwAGAAEA9f/u//L/9f/7//7/9//+/wcAAgADAAgACwANAAUA/v8EAAIA+P/9/w4AEQADAAAABwAKAAYAAAAAAAIA/P/y/+v/7////wQA+v/6/wMAAwABAAMACAAOABEAEAANAAsACwAKAAUAAQADAAUAAwD5//D/8P/1//3/AgABAP3/+/8AAAoADQAJAAUABAAEAAQAAQD7//r/AQAEAAAA/f/6//b/9v/8/wQABwAKAAwABwADAAgADAAMAAUA/v8AAAcADAALAAAA/P8CAP3/8v/v//P/8//2/wMACgAGAAQAAQADAAgABwAJAA0ADAANAAsABwAGAAEA+v/7/wIABAAEAAUABQAFAAAA+v/x/+T/4f/o//T///8CAAQACgAMAAkABQAAAAAAAQADAAcACwARABkAGwAUAAgA/f/4//T/7//w//b//P8CAAYABQAAAPz/+f/2//X/+v/9//7/AgAIAAsADQANAAsADQANAAgACQAIAP///f8AAP//+f/4//7/AAD9////AAD7//n/9v/u/+z/+P8EAAgACgAPABEADgANAAoAAgD+/wMABAAFAAwADwALAAkAAgD///7/9P/w//j/+//3//H/9P8AAAQAAAAAAAkADgAIAAAA/v8EAAoABwAAAAEAAgAEAAgABwABAPf/8P/x//P/9v/8/wIABwAOABIAEAAJAAAAAgAMAAcA/f/5//f/+v8AAAgAEgARAAkABgAEAP7/9P/x//r//f/0//L/+P/9/w0AHQAaABIAEgALAPj/7f/4/wEA+v/7/wIA//8BAAYAAwD8//X/7f/z//v/+f///wwACgABAAQAEQAbABUABQD8//3//f/+/wMABwAHAAEA/P/9//3//P/6//f/9//3//H/7P/1/wcAEAAPAAkABQAEAAkADgAOAAsAAwD6//X/+P8AAAcACAAIAAYA///9/wIAAgD+//v/+f/4//z/AgAGAAUAAQD+//3//P/7//z/AwAJAAcAAgD+/wAABQAHAAkACwAIAAMA///5//T/+P/+/wMABAACAAEAAAD+/wAAAgACAAcACgAHAAUABAABAP///v/9/////f/2//b//P8BAP//+v/8/wEABQAKAAYA/v8DAAgAAwD7//7/AgD9//7/BwAHAAEA+//4//n/9f/v//D/9f8BAAcA/f/4/wEABAD8//7/BgAHAAkAEQAWABEACAD///3/AAAAAPz/+//9/wAA/P/3/wAACAD7//X//f8AAAEABAAMABcAFQAGAP//AwABAP7/AgAGAP//7//j/+X/8P/5/wEACQAMAAwADAANAA4ADgARAA8ABQACAA0AEQAMAAsACwACAPj/8//2//v//P///wEA/P/u/+b/8v8BAAQADgAWABAADgAQAAoA/v/0//X/9v/1//v//v/+/wAA/P/7//z/9P/0////BgABAP7/AAAAAAMADAAHAPf/9/8FAAgABQAFAAUABAAFAAUAAgACAAcABwABAP7/AAD8//P/9v////v/+/8JAAcA9P/4/wgABwABAAIABwANAAkA//8FAAgA9f/r//z/AwD6//n/AgAFAAEA//////n/+f8DAAMA//8DAAQADAAQAAwADwASAA0ACAADAAYADQAMAAkACQACAPL/7f/6/wIA+//x/+//9//9//3/AwASABcADwAAAPb/+P/7//f///8SABgAFgATAA0ACgABAPX/6//e/9r/5P/1/wUACgAJAAkABgACAP3/+P/7/wQACwAPABAADwARABYAEgAJAP//+P/w/+r/9v8IAAcAAAD7//b/+f8BAAUAAAD6/wEABQD+////AwAHAA4ACwAFAAIAAAACAAIA//8CAAUAAAD6//n/+f/7//z/9v/z//j///8HAAcA+f/z//3/BAACAAAABwAZAB8AEQAFAAYACAADAPv/9//z/+z/7P/0//3/BAAEAPv/9f/0/+//7f/u//f/BwAOAAUA/f8CAAoACQAFAAgADQAKAAYAAQD8//7/AwD///v/+//7//j/8f/x//f/+v/9//7//P///wMA/v/5//r//P/8//v//v8JABMAEwAPAAwADgAWABIA+//p/+z/+f8AAP//+f/5//3/+P/7/wMA+f/u//b//P/4//T///8IAAEABgANAAUA//8GAA4AEAAJAP//AQAEAP7/AQALAAMA8//0/wYAFQALAPr///8QAAkA9P/1/wEA+//w//T/+//9//z/AwAQABoAFwAGAPj/AAAQAAoA/f8AAAAA+P/8/wUABgABAPr/9/////7/8P/w//r/BgAQABQAGQAeABQABAADAAQA+v/s/+b/6//1//r/AgAKAAwACwAIAAkABAD4//n//f/v/+r/+v8BAAAAEAAiABEA9//8/wsABwD1/+v/9v8FAAUAAwAMABUAEwAHAPn/9f/3//X/+P8AAAAA+//9/wQADAAMAAQAAQD+/+7/6v/1/wEACgAKAA0AHgAmABkABQD8/////P/2//j//f8CAAUABgAHAAYA///z/+f/5v/v//T/7v/n//T/CwASABUAHwAjABoACAACAAgADAAMAAkACAAOAAsA/f/u/9z/1P/a/93/3P/k//r/FAAlACoAJQAZAAoABAAIABAAFAAPAAAA9//+/wAA9//3/wAA/v/t/+D/3v/k//r/EgAWABAAEwAVAA4ABgALABQAFQAOAAMA+P/3/wIADAAMAAgABQD2/97/zf/K/9P/3v/v/xMAJwAVAAYAEQAbABUADgASAA4A/P/0//j/BwAVABQADgD//+D/z//g//j/BAALAAoA+P/n/+j/7v/s//f/DwAXAA8ACAAFAA4AHQAiAB4AFAAJAAkAEAAQAAEA8v/v//D/7P/h/93/7v/+/wAADAAZAAkA9v///xMAGgASAAoACgAJAPv/+f8MABYADgAIAAIA+P/x//T//P/8//v/AQD9//j//f/9//r/CQAaABQAAAD2//n/+//6/wEACwAOAAwAAgDw/+z/+/8DAAEAAAAAAAUABAD5/wIAFgAaABIACQAJABQACQDy//7/HAATAPL/5v/o/+T/3//p//b/9v/z//L/7//w//j/AQAHAAsADgALAAMABgAMAA4ADgAIAAMADAAYABYADwACAPn//P/v/9r/3//4/wcA+v/0/wwAFwARAA8ABQD8/wAABQAHAAcAAwACAAcAEAAYABQAAgD6//7/AgAEAP//8P/m//L/CQAJAO3/3f/v/woABADq//D/CAAEAPj/AgATABoAGAAVAA4ACAAJAAIA8//x/wIAFQAVAAMA+P8FAA4ABAD8//T/3P/M/9z/6//s//7/HAAjABMACQALAAwADgAVABwAHQAIAOv/5P/w//r////9//j/9P/o/9v/4v/w//j/AwANABEAEgAUABsAIgAdABUAEQAJAP7//v8GAAkAAgD7//3/9v/n/+D/4v/l/+j/7P/5/wgADwAXACAAJQAjAB8AGQALAAEABQD9/+b/4//w//P/7//1//n/8v/3/wUAAgD7//3/AwAGAAYADAAZAB8AHAATAAcAAwAGAAIA8//s//L/8v/u//P/9v/x/+T/2f/r/wMAAgAJABwAHwALAPj/+/8JAAgA/P/+/woADQAHAAMABwAMAA4AEgAFAOj/1f/U/9v/6v/9/wcABQAEAAwAEgANAAIA//8OABYADgAIAAwAEQAMAAUACgARAA0A/P/h/93/9/8BAPX/+v8RABkAEQASABgAEgAIAPv/7v/p/+b/5P/r//v/EwAcAAwA/v/3/+r/5//3/wYAAAD1//r/DgAhACUAJAAiAAYA4f/j//7/BwACAAQABwABAP3////6//f///8CAPn/8f/y//z/BwABAPf///8FAAQADAAVAA4ABgALAA4A///4/wkAFgAUAAwAAQD9//7/+P/v/+r/5P/a/9b/3f/x/wMACQAOABoAGgATABMADQACAAMADgASAAcA9//6/wYAAgDz//D/+P/x/+L/4v/x/wAACAAKABMAHgAfABYABQDz/+z/8v/9//z/9/8CABIAGQAaABMAAQDw/+7/8f/n/93/4v/q//f/FAAwADUAKAATAAoAEAAGAPP/7v/w//b/AwAOABAACgADAAMAAADz/+P/4f/s//X/+f/8/wYAEwAXABQAEAANABEADgD//wAAEQAPAP7//P8IAA4ABQDz/+f/5f/l/+f/7P/t/+v/7//+/wsACwADAP//BwAOAAYA+P/3/wMADwARAAcA/f/9//7//v8CAAQAAgD9//v/AgAFAP//AwANAAwAAAD2//P/+v8JABkAGwAHAPD/8f//////9v/4////+f/3/w4AFwAEAAYAGQAOAPr/BQANAPb/7f8EABYADgDw/+H/9P/+/+3/5f/x//n/9v/x//r/CwACAO///f8ZAB0AFAAUABYADwAKABQAHAAcABoAGQAcABUAAADo/9v/4f/q/+z//P8RAAoA7f/Y/93/+/8RAAwABAAFAAEAAgALAA8ADAAFAAcACgD2/+D/4//7/xMAFQAFAPP/5f/s/woAGAAHAPv////+////DAAYAAsA9v/8/wcA/v/3//b/+v8GAAkAAQD7//b/9f/+/wUABAAQACYAHQD2/+H/7f8HABEABAD8//7//v/+//3/AgAGAPT/2//S/93/9P/+//v///8KABQAGQAUAA8AGAAcAA0A+//2//n/+//5//f/8//o/+D/7v8HAA8AAwD4//z/BwAEAPX/+v8RABcADQAMABYAFgAKAAIAAQD8//z//v/7//f/6P/V/8//1f/n//D/9f8MABMAAQD4//r/9//3/wgAJAAsAA0A7P/z/wsAEQANABAAGwAeAA8AAgAJABMADQAEAAMAAADv/93/5f/+/wkA+//m/+f/BAAZAAsA+P8MAC0AJQASABQAEwAPAAgA9v/n/+D/3//p//X//P/3/+//7v/u/+7/7P/t//v/AgAFABMAFgANAA8AGwApACIACAABAAYA+v/q/+//+//0/+L/3v/j/9z/0f/U/+P//v8ZAB8AGAAdACgAIgAOAPz/AQASAAgA7f/8/x8AEwDt/+z/+//t/93/7P/8/wMAEgAYAAoA///8/wQAGQAfAB0AHgAMAPf/9v8KACoAMgATAPn//v8FAPj/7v/8/wwAAwDx//f/DAAKAPX/+f8RAA0A7P/W/93/8v/7/+//5//w/wQAGAAdAB8AIAARAP3/8f/u//X/+f/2////DwAKAAUAHAAsABYA+v/y/+3/4v/e/+//DwAhABgAAwD1/+//5P/W/97/9v/5/+X/5P/8/wQACAAjAC4AGQALAAYA/f/t/+X/+P8VABUA/v/4/wYAEgAUABMAEQAHAPb/6f/l//L/EgAoACIADgAAAPn/8P/g/+L/AgAWAA0A/P/x/+3/8/8IACEAIgAJAPP/7f/5/wwAFwAiADIAOAAmAAMA4P/U/+P/7P/f/9j/3P/W/9f/+v8hABsA9f/f/+z/DwAsADIAMAA5ADoAKgANAO//5P/u//f/9//7/wcAAgDp/+H/6P/s/+z/3//P/9D/2f/m//D///8ZACQAIwAyADsAIQAFAA0ADgDs/93//P8NAP//AgAUABAA9f/d/+T/+//y/9v/4v/0//j/BgAgACgAHQAXABUACgD9////DQAQAP3/6P/p//7/BwAGAAgA/v/s/+b/7/8AABoAMQApAA0ABgAOAAcA9v/q/+X/5//t//r/AQABAAEA/f/8/wAA/f/8/wMADAAQAAIA8v/w/+3/8f8PACsAIQAIAP//DAAfABoADwAZABoACQAKABoAFwADAPX/+v8DAPP/3//g/+n/7f/l/+H/8f/+///////8/wQAEwAMAP3/DQA3ADcACAD6/wIA7//e/+n/+v/8/+z/4//v//7/AQD4//X/+P/z/+z/6v/x/wAADAAWACEAHQAKAPr/7v/i/+T/7//6/wEA/P/+/xIAGwARAA0AEQAQAA8AGwAbAPr/2f/h/wIAFQALAPL/5v/u//X/7P/j/+j/8//8/wUAFQAiACMAJQApABgABQAGAAUA//8GABwAKAAVAPf/9v8KAA4A+P/q/+r/3v/L/8j/1P/o////EgAhACMAGQAMAP///f8MACAAJAATAAUACQAHAO3/2f/k//3/DQARAAMA6//l/+b/5v/t//T/AgAPAAMA7P/n/wAAJQAsACAAFAALABoALgAXAPb/AgASAPX/2v/r/wEA+//v//n/AgDv/9L/z//0/xkAEwD2//X/HgA5ACEAEwAmACAA///t/+j/6P/s//X//f/9//f/9P/1//L/8P/9/wkA/v/p/9z/8P8hADUAHwAOAAYA9f/h/+D//P8eACEADgAKAAoA8f/c/+3/BwAGAPz/+P/u/+f/8v8EABAAGwAjABwADgD9/+v/4//v/wIABAD9/wUACQDy/+z/CgALAOz/8f8HAPL/0//n/yAAQAAxABUADQAJAPz/AgAqAD4AIwAEAPf/8v/t/+z/8v/8/wIA/P/j/8v/0//3/xcAJQAbAAIA+/8CAAsAFgAUAAkAAADu/+D/3v/o//v/BgADAP//9//w/+7/8P/8/wkABwD4/+7/9v8GAAgA+//x//j/CwAZABsAGAAZABcACAD8/wIABgD4//D/AgASAAUA8f/2/wkAGAAiAB4AAADd/9D/4P/2//z/9//7//r/8P/4/w8ADAADACMARQAwAAEA7f/4/wsAEwAFAOn/0f/N/+H//v8RABQAGgAfAA8ABwAWABEA8v/r//f/9f/u//L/AAAPABEADAAFAPH/1P/H/9j/7//0//n/DQAmACsAGQANAA0A///v//j/BwD+//T//v/6/+T/5v/1//X/9v/+////7f/Q/8f/3f/9/xQAGgAYAB8AIwASAA4ALQBBADAADwAAAA8AHgAYABYAIQAWAOz/y//E/8P/wP/E/9T/6P/3/wAACQAMAAMA+/8DABUAJwA4AEIAOAAqACQAHQASAAUA//8GAAUA9v/p/+b/6//y/wQAGQALAOv/5//0//z/AQAFAAkAEwAeABYA+//q//n/DgAOAAYA/f/y//H/+/8IAAsA+P/r/wEADwD5//P/CQANAP3/9f/+/wMA+f/6/wkADwD//+v/7v/6/+3/2//k//D/8v8FABUADgALABIACgD7/wMAIQAgAP7/7f/2/wIAAwDy/+b/7f/w/+n/7v/5/wEADAAGAPP/7//5/xEAHAAIAP//IQBCAC0ABgALABkABgDz//T/AQAKAAYAAQAHAAsABQD3//T/AAABAOn/2P/g/+7///8TABgACADv/97/5f/5/wEA/v/6//X/9/8FACEARABNADAACQD1/+n/1//T/+z//v/8//X/9/8KABAA///7//f/5P/a/+//EgAgABoAFAAJAAAABwASABUAFgAUAA4ABAD6//T/+P8HABMADwD8/+j/5//6/wcA///x//P/CQAYAAoA+f8DABMAFQAMAAAA8P/Q/7n/zf/8/yAAHAD5//L/DgAaAAgA9v/+/wUA8v/0/woAEAATABcAEwAFAPH/5P/d/93/8P/9/+3/3P/Y/9j/5v8CAAwABwARACMAHgAEAPH/AAApADwANAA3ADsAHADs/9v/9v8VABoABADr/+D/2f/Z/+z//v/8/+L/wf+8/83/2//x/xYAMwA1ACYADwACABgASQBWAB8A6f/l//H/BQAgAB8AEQAIAPv/6//V/8f/zv/c/+r/+f8AAAUADwATABEAGwAlACAAEwAMABoALwAdAO3/6P8RAB4AAADp/+n/4P/M/9D/7f8JABQAEQALABUAKgAwACgACQDh/9//5f/K/8D/3//+/wYABgAHAPf/4P/k//r/DAAVABUAFQAdACQAHAAJAAEADQAXABEA/P/r/+3/BQAiACAADAAOAAkA2f+//+f/DgAEAPL/9f8GABQAFwAWABkAEgD8/+f/6P/7//3/6P/3/xUA+//f/wkAQwBBAAgA4f/z/w4A+//b/+j/BwADAPD/8f/6/wEABAD8/+n/2//f/93/2f/5/xoAFQAHAP7/+v/+/wUAFAAfABgADgARABkAGwAJAOr/3P/k/+b/5P/m//H/AQD0/9v/8f8rADYAAgDm/wkALwAvACYAJQAjAB0ADgDz/+X/8/8HAAwABgD4//P/+f/u/+f/AQAaABcAAQD4/woADADm/9X/AQArAB0AAQABAAoAAQD1////FQARAP3/AwAcAB8ABQDv//L/+f/5/+//2v/Y//v/EwAKAP7///8CAP7/9v/7/wkAAADr//X/FgAcAAYAAgAPAAgA/f8AAAMADAAWAAsA+//+/woA+v/N/7X/xf/p/wMAAAD4/wkALABEAC8AAwDx//T///8AAPb/BAAPAPn/9v8SABUA7v/K/8n/zv/O/9z/6v/p/+v/+f8HAAYA/v8NAC0AOAAlAAoA+//+/xwASABQACMA9P/j/9n/1v/g/+3/+//s/8f/yv/u/wcAHwBFAFQANAAOAAMA/P/5/w8AMwBMAD8AFwD+/wYAIQAlAAMA5f/e/9X/x//Q//D/BwD5/93/2//s/+z/4//i//D/BgALAAUADQAZABYAEgAnADEA/v/O/9//CAAiABUA6v/S/9T/5v/8/wQAAgD0/9X/zv/x/wcAAgATADYAPwA1AC4AGwD7/+v/BAAtACkA8f/W//T/DQDx/8T/t//E/87/0v/d//L/+//t//D/FwA9AEEAIwACAPT/8f/z//b//f8OAB0AEAD8//z/AwAFAAUABAAVACoAMQA2AEIAVQBfAFEANwAbAPj/5f/y//v/4//V//L////f/9b/8P/v/9j/2//u//7/8v/S/+L/CAANAAoAAQDn/8v/uf/M//f/DAAFAPz//v8GAAIA8v/x/wEAEgAXAAQA6f/x/wkADgATACUAJAAPAAwAEgACAOr/8v8UACUAEgDy/+n/9P/r/9P/1v/h/9v/2f/k/+v/+P8XACwAKAAhABEA6f/W//X/IAAyAC0AIAAKAPP/6//x//r/+//m/83/w/+8/8X/3v/x//n/+P/0/+b/z//W/woARABmAGoAUwA9AD4APgAkABUALAApAPX/2//3/wUA7//b/9j/3//f/8f/rf+0/+P/GAAuACMAEAAMACQAQgA9ABAA/f8fACYA//8BACsAMQAaABIAFAAOAPf/2P/Q/9X/y//C/8z/1//d/+//EwApABsAAgD//wsAEQAQAAcADgAoAC0AGQAKAAQA+v/t//X/CwAOAAkADgAHAPT/8//y/9z/1//t/+T/s/+i/8z/+/8HAAMADwAuADYAEgDu//b/EQAQAO//7/8bACIA9v/Z/+n/BAAEAO7/9f8ZABAA8P/y////DQAmADIAFwDl/9v//f8SAA4ABQD8//v/AwAJABgAKgAbAPf/5v/j/+b/5v/j/+//BwATAAQA4P/P/+3/FAAOAOz/4P8AAC4ANAAfABoAHgASAPT/6v8MADEAMgAeAA4ACQD9/+r/5f/v/wAA/v/h/9j/AAAwADgAGgAIABMAEgDz/+f/BAArAD4AMwAYAP//4//N/9X/7P/s/9T/yP/O/9T/3v/8/yIAQABIACAA4v/c/xAAGgDy//P/CQDx/9v/+/8aAAkA5P/U/+L/5//M/8v/+v8lAC0AHAAQABMAGQAjADcAQgAjAOb/yP/T/+D/6P/w//X/8v/k/97/7/8DAAkA///5/wwAHAAEAOv/+v8SABoAHQAZAAYA6v/b/+f/+P/9/wUAGAAXAPP/2//1/xcADgD7//j/5//X/+L/8v///xYAMwBIAD0AFwAHABgAHAADAPX/AAADAO//4P/s/wMACwABAPD/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2//s/+T/xv+1/7r/0v///yQAIQAPAAsABwAHACAAPwBEABkA2//M/+P/5f/M/9D/9f/+/+H/zv/J/8z/6P8FAAAAAwAsAEIAKQApAEwATAAhAAAACgAkAA8A2P/O//L/+//g/9j/6v/l/8T/sv/L//T/+P/o//r/GwAiABEABAAbAEIATgA3ABQACQAbACoAJQAYAAIA6v/n//H/6//Y/8r/x//N/9j/4P/l/+T/3f/o/w4AKAAaAPj/+P8xAGoAXwA1AC8ASABXAEgALwAhABEA///p/83/yf/U/9L/2f/2//r/y/+q/83/CAApADsAQQAkAPj/6P8HAEgAawBKABkACQAMAA4A+f/b/9D/2v/o/+L/xv+y/7r/1f/m/+L/2//X/9L/1v/x/xoAMQAqACEAKAAwACIACQAGABkAJAAfAAkA5f/K/83/5f/5//n/5//S/77/t//X/wQADgAFABAAHQAOAP//FgAvADAALwAyACwAKwA0AC8AHwASAAYA+//i/73/wP/p/+n/vP+6/+b/6v/W/+v/DwAVAAwAAwD4//7/GQAvADAAHwAKAP//AAALABYAGQAYABwAHgAcAB0AHAAIAPX///8FAOj/wv+y/7v/0P/f/+X/5v/o//P//v/9/wAAAwD7/xAAPQBBADIANQAzABkA+v/y//b/5P/P/9P/6P/5//L/zP+0/93/FwAOAOb/7/8IAAEA/f8TACoANwBAAEkATwA3AAYA5P/n/w0AMQAmAAYA7v/f/+X/AwAZAAgA6v/v////9//t//X/DAAdABMA8v/a/+X/CQAeAB0AHAAVAPn/4f/s/wsAHgAcAAUA7f/x//z/9//s/+H/7/8HAPv/4v/f//X/EwAVAAMADAAoACIA9f/b/+z/8//V/8L/3f8HABAA9f/a/9z/7v/z/+///f8bACcAEQD7/wkAJwAkAP//6f/8/xoAFgD4/+P/6f///wgA/f/1//v/AAD0/+L/2v/l//b/+P/y//b/CwAaABIABgAQACIAHAAJAAYAGgAuADYANAAwAC4AJgARAPb/4//e/+X/7v/q/9T/wf/B/8n/6v8NAAUA7//2/wEA+f/x/wYAGQAQABQAHwASAAIABQAQABcAFAAJAAkABQD4/wYAHwAPAOv/5f8DABoACADr//T/GgAdAPn/8f8EAPX/0v/S/+3/AgAPABUAEQAJAAEA8v/y/x8ATwA2AP///P8FAPj/AAAVABMA+P/V/8H/w//M/9f/8P8DAAgAAADz/wUAKwAaAOr/AAAqAA4A8f8SADUAJQALABQAJAAMAOL/3P///w4A9f/h/+X/6v/k/9v/5v/8//v/3//J/9P/9P8JABEAGgAdABQADAAPACMANgArABMAHAAxABoA/P8DAAIA3//P/9v/2P/G/8n/2f/f/+H/4f/d/+v/BQAZACEAGQAcADYASwBQADQABAD//xgAGQAGAP7/BQD//+n/4P/u/+//1v/I/9//BgALAN//vv/Z/wYACAD6/w8AMgA0ABoADAAbADMANgAqAC4AMgAQAPL/9v/x/9//4v/i/8T/tP/K//P/DgADAPr/CAAJAPj/+f8YAEMASgAiAAYAFwAtACUAIQA4AD8AGgDt/9j/2//t////AQD//wYABQDp/8//3v8EAAwA9//s/wEAHAAYAA8AEQAIAP3/9f/r/+z/7v/m/+L/7v8AAPz/5P/d/+v/+v8AAPz/8//v//T/+/8CABIAGgAQAA8A/P/J/7H/0f8DABUABwD+/wAA8v/b/9j/7P8LACAAEAD6//7/BQAGAAsAGwAzACcA///9/yIAKQD9/9z/7v8KAAoA+P/r/+3/9P/x/+//9f/r/+D/+/8pADsALwAaABAAEgAYACEAKwArACIAEwABAP3/BAAHAAsADgAIAP//8f/n/+v/6v/n/wMAIQAPAOL/0f/n/wMA/P/j/+7/EAASAPb/7P///xQAEwATACgALwAUAPL/7/8KABgACgD7//L/+v8OAAYA6//3/xUA/P/K/8z/5v/n/+P/9f8GAAUA9P/g/97/8/8EAAUAAAD9/wIABAACAAcADQARABMACQD6//7/CwAVABwACgDw//f/+//k/9//+/8GAN//yP/z/xoALAA/AC8ACQAGACAALQAnACEAHQASAAUABgANAAQA9v/w//L//P/5/9f/uf/O/wIABwDX/7r/0//9//r/3//3/xkABwD2/xQANwA6ADMAOQA6ACkAEgD+//3/DAASABAACQDx/+H/7//6/+n/2v/V/73/sf/P/9n/xP/a/xUAKAAVABIAHQAgADIATQBLADMAGwAHAP7/BAAJAPv/5P/f/+L/w/+l/7z/2f/a/+//CwAIAPn/+f8NACAAGwARACQANgAyADcASABEACUADgASABUABADv/+T/5v/o/9r/z//X/+b/7P/p/+f/5//o/+v/6P/u/woAFQAHAP7/AgAIAAYAAwAGAAoAFwAiABUACwAaACMAEwADAAcADQABAO//6f/s/+7/7v/r/+L/3f/i/+f/8f/8//T/3//Q/9P/8f8MABQALQBKADkABQDr/wEAJQAtABoADQAGAPT/5P/j//r/FQAVAAYA7//T/8P/vv/H/+z/FwAiAA4AAQAOAB8AIwAeAB4AKAAoABoAHwAyADkAIgADAAMADQADAO//3v/q/woABADe/9T/7v8EAAcABwAIAAAA7P/V/8//4//7/wIA/P8CABoAHQABAPX//v8BAP//CQAUAA0A/P/4/wwAIwAlABgACwDy/9r/6P8IAA4AAwAFAAUA9//v//X/+P/8/wgACAD9//v/AwANABcAEQADAAMAAgD6//v//P/1/+//9/8BAPj/8P/9/w0AEQAIAPn/9P/5//r/9f/z//P/6//a/9j/8f8HAP7/8v/7/wQADQAdAB0AEAATACIAIwAQAAAACgAZABIA/v/z/+//4v/T/9r/9P8HAP//6P/p/wUAGAATAP//6v/f/+j/+P/+/wMAGgA0ADsAMQAdAAgA//8LABwAEwD7/+z/5//u/wgAGgANAPT/4//l//b/9P/u////CwAKABMAHgAZAAoABQARABwAEgD9//X/AAAPAA8ACgAUACAAFwD//+z/5//z//b/5//v/wsACQDr/+X//P8SAA4A9v/r//P/8//x//b/+P/x/+T/5P/2//7/6f/X/+T//v///+7/7v8BAA4ACgD7//T///8JAAsAEwAcABwADgABAAwAIgAlABoADwAKAAEA7P/j//T/CQAMAAMA8P/e/+b/AAAJAAAA/P/+//X/9v8SACUAGwAZACAACgD4/xAAIAAJAP7/EgAWAPf/zv/G/+b/+//q/9j/2//h/97/3P/q/wQABQD2/wYAJwAuACYAKQA0ADQAMAAwACoAIgAeAB4AHQATAAEA7f/i/+P/4f/a/+b/9//p/8j/u//P//X/CwAFAP3///8CAAsAFwAcAB4AFwAUABcABgDw/+3/BQAlACgADADr/9X/2P/v//n/7v/p/+z/6v/r//7/EgAOAP//AgAKAAgACwAQABkALgA7AC0AEwAGAAgACgADAPn/AAAQAAEA1v/A/9H/8P/6/+z/5v/q/+3/8P/z/wIAEwAMAPX/7/8AABUAGQAVABoAGgATAAwABQAGABcAIgANAO7/4f/h/9//3//i/+H/1P/H/9b/+P8JAAIA/f8JACAAKwAiAB8ALAAsACIAJQAuACUADQD9//f/8f/z//b/7P/g/9L/xf/C/8z/4P/m/+b/+v8CAPj/+f8BAAAAAQASAC4AOwAlAA0AFwAsAC0AIAAXABsAHgASAAEAAAABAPP/5//t//P/5f/R/9b/9f8KAP//6f/r/wgAIAAhABwALQBCADUAHAAUABgAHgAZAAMA7v/i/97/4//u//X/7//e/9D/zv/T/93/7v8DAAUA/f8AAAMABgASACEAMwAvABQACwAWABYACQAEAAsACQD0/97/3v/l/97/0f/Q/+f////+//L/8//9/wEA+//1/wEAGQAYAAQABwAiACcAFgAUABsADwD9//b/8v/1/wQACgD7/+v/4v/l//P/+/8CAAkA/v/v//L/CwAtADkAKgAdAB8AHwASAAUACgAXABQAAQD4//3/+f/p/+f/9v/4/+j/3f/i/+7/9f/v/+v/9/8NABoAFAAPABIADAAEAP//AAALAA4ABAAGAA0ABQD+/w0AGQAKAPT/7v/y//T/9P/8/wwAEwAGAPT/7v/x/+7/4f/j//v/CAD9//j/AAD9//3/DwAVAAYA/v8AAAUAAwD7//3/CwAQAAgABQAKAAwABwADAAIAAAD8//b/9P/9/xMAHwAUAP7/7//s/+3/5P/k////FQAVAAoA///5//r/BgAcACYAGAACAPb//P8JABAAFAAeAB8AEAD2/9z/0v/f/+n/5v/q//H/4v/R/+f/DwAYAAIA7P/u/wkAIwAtADIAOQA3ACkAFwAKAAYACQAGAPv/+P/9//L/2f/U/93/4P/g/9n/zv/J/8//3P/j/+f/9/8GABAAIgAsACAAFQAfACcAFgAQACcALQAbABIAFAAKAPb/4//j//T/7//b/9r/3v/b/+n/AgAKAAIA/P/9/wIAAwAMACEALwAnAA8AAgAKABAAFgAjACEADQD4/+r/7P/+/xAACgDy/+r/7//u/+T/2v/Y/+T/+v8MAAwAAgABAAUADwAcACIAIAAbABwAIgAeABAABgD7//z/FAAiAA0A7v/i//D/CwASAAwADQAHAPv/AAAQABEACAABAAgAEAACAO3/8v8FAAwAAQD1//r/+//z/+//8//7//7/8P/i//D/FAAcAAIA+f/9//H/7//9/woABwDy/+T/6//6/wEA/v/9/wIA/v/w/+b/7v/+/wYACQANAAUA8v/q/+z/8P/7/wMAAgD///f/9v8GABQAGAAXAA0A+//z//z/BAD7/+z/7f/8/wMA+//r/+P/8P8DAAcA/v/7//3/AAAIABYAIwAjAB8AHwAYABIAFwASAAYABQAOABQADAD6//X//v///+//5v/s/+3/6v/r/+z/7f/w//v/EQAgAB4ADwD///7/DAAYABoAEQAJAAoACQD7/+v/6f/1/wYADAD8/+f/3v/f/+z//v8DAAUADQAJAP3/+P8FAB4AJAAdABoAFwAhAC0AHQAJABEAGQADAO3/9P8AAPr/8f/z//X/6P/U/9H/6f8DAP3/4v/Z//b/GAAVAAoAEQAOAAcACQAHAP3/+/8AAAQABAADAAcACgAEAP7/BAAJAP3/6//f/+z/DQAVAAAA9f/2//j/9v/z//v/DgASAAgABQAFAPr/9v8FABQADgD+//b/9f/5/////f/z//b/AwACAPv/9//0//P/7v/s//P/+P/+/wEA+f/5/wUA+//o//b/DgAHAPX/9/8NAB0AGAARABgAHQAUABEAKAA5AC4AGwAPAAsACQAGAAQAAQABAAAA6//T/9H/4P/0/wIAAQD2/+7/7f/3/woAFwAaABUACgAEAAIAAwAOABgAFwAOAAMA+f/0/+//7f/2//v/8//k/9f/2v/u//X/7f/w/wIADwARABMAGgAfABoAFQAaAB0AFgAOABMAGgAQAAAA/f8DAAoADQABAOr/3P/e/+j/8v/x/+r/6//v/+7/9f8CAP//9/8HAB8AIgAYABQAFAAXAB8AHAAIAPv/AAAFAAIA///5//n//f/7//j/+f/1/+z/5v/j/+T/6f/v//r/BAACAP3//v8DAAgACQAKABQAHAAbABUAFgAWAA0ABwAIAAEA8P/p/+b/4f/j/+v/4//W/9v/6f/u/+z/6f/w//n/8//s//X/CgAfACUAHwAcABoADwAMAB0ALAAmABAA/v/+/wMAAQD//wEA+//p/9f/0//Z/9//3//h/+z/9f/4//3/BgANABYAHgAgACIALAA3ADUALAAlAB4AFwAQABAAFgAUAAUA7f/a/9//8/8BAAAA6//Y/9//7P/w//j/BwAPABEAGQAbAA8ABgARACIAKQApACAADwAHAA4AFgAWAAsA/v8DAAgA9//v//T/8P/q/+r/8f/6//f/7P/s//P/8//z/wAADwAJAPb/7//2//z/CgATAAwABAD8//P/8v/5/wUAAgDt/+D/4v/s//T/7//q/+z/6f/i/+T/7v/8/wwADQADAPz/+/8EABEAGAAdAB8AHAAOAAEACwAaABsAFwANAP//+v/8/wEABQADAP7/+P/z//j/+v/x/+7/9//+/wMABgD9//T/9f8AAAwADQAFAAAA/////wQACwAVACMAJwAcAAwAAgD///7/AwAOABEACAD5//D//f8LAAcAAwABAPf/8f/3/wEABQAKABAABgD4//r/AgAGAA4AFAARAAgAAAD6//z/BgARABMABgD6//f/9v/3//3/9//u//v/BgD5/+z/7P/0//3/AAABAAgABwD5//j/BwASABEABQAFAA8AEAACAPj/AAAHAAEA//8BAP3//f////7/+P/u/+n/5//o//L/9f/t/+f/5//u//n/BgAOABAADwAJAAEAAAADAAoAGAAaAA4ABgACAP7//f///wEA///5//H/6//t//b///8CAPn/7f/p/+3/9/8AAAEAAwAJAA0ADAAPABQAEQATACAAHgADAPT/AAAKAA0ADgAHAAQABwAGAP//8P/m/+3/+P8BAAUA+f/r//X/BQACAP3/AAACAAMA///9/w0AHgAaABcAGwAVAAsABwAJAA0ACwAHAAYABQD///b/8v/2//z/+v/z/+P/1f/g//X/+v/6//v/+v/7//7/AgD///z/BQAPABEADQAHAAkAFAAYABIACAD///z//f/8//r//v8BAAUABgD8//T//P8GAPz/8v/6//3/8v/v//P/+/8HAA4ADgAJAAIA/////wIADwAWAAsABQAMAAIA+P8BAAgAAADz/+v/8f/+/wAA/f/9//n/7//v//j///8AAPj/9P/7/wAAAAAAAAEADwAYAA4ABQACAAEABQAMABMAEAAFAAEABQAHAAoACgD///f/+f/5//n/+f/3//r/+v/0//b/AQACAPX/8P/6/wIABQAIAA0ADgALAAQA/P/9/wkAFQAVAA8AAwD8//7//v8DABEAFwAOAAAA9P/x//T/9v/7/wQACAADAP7/+//6//r//f8HAAsABQD8//v/AwASABgAEgAKAAMAAAAEAAYACgAMAAgABAAAAPr/+//+//r/+v/+//7/9P/r/+7/9//9/wQABQD+//7/BAD///j//v8GAAkACgALAAoABgD//wIAEwAcABIABAAAAAMACQAJAAMA/f/4//X/9f/z//T/9v/y//L/9P/z//L/8v/2//r//f8AAP///P8AAAgADAAHAAIABgAQABQADwADAPz/9v/1////BAD7//D/6f/p/+7/8f/0//3/AwD+//n/9P/1/wMAFwAkAB8AEQAMAAwAFAAiACgAJgAdAA8ABgACAAQACgALAAQA9//p/+P/4f/j/+z/8v/s/+f/6//v//b//f8BAAUABAABAAcADwAUABgAHQAdAA4ABgAQABgAGQAVAAUA9f/w//X/9v/z//b/+//x/+X/6f/t/+z/9/8DAAYACAAHAAIAAwAIAA0AGgAdAA8ABwANABIADwABAPv/BAAJAPz/7v/q/+r/6f/p/+v/7v/t/+b/5f/v//r//v/6//f//v8EAAQACAARABoAIAAfABkAEgAVAB0AHgAcABoAFAAJAAYADQANAAEA+P/z/+r/6v/3//n/7f/o/+v/8v/+/wAA+//8//n/8P/8/wgA/f/6/wgAGAAaAAcA9f/y//v/CwAQAAQA/P/8//r/+f/6//r/AgAEAP3/AAABAPj/9P/2//7/BgAGAAUACAAIAP//+/8EAA8AEAAJAAYACAAKAAoACQAIAAcABQABAP//BAAGAAEA//8AAPz/9P/2//r/+f/4//j/8f/o/+r/9f8AAAUAAwABAP3/+f/+/wMABwAPAA8ACQAGAAIAAwAJAAsAEAAWABIABwADAAcABQABAP////8AAAIA/v/5//X/8f/y//r////8//b/9f/2//n///8CAAEAAwAFAAgABQD8//n/BAALAAkACQANAAoABAADAAUACAAJAAQA/v/4//T/+v8BAAEA+//5//z////8//z//////wQACwAGAAAABgAMAA4ACgAEAAUABwALABAADAAHAAcABQADAAcABQD3//D/9v/2/+7/7v/1//7////3//D/8P/3/wIABAD+/wEABgACAAEACgAKAAYACQALAAoABgD//wAADQAOAAkACwAHAPz/+v/+//3/9v/1//n/+P/3//r/+f/4//r/+v/6//z/+P/3//z//v8BAAUABQAEAAUABgAIAAoABAABAAcACgAHAAIA//8FAAoABgABAP//+//1//T//f8FAAcABgADAP3/+//8/wAABAAIAAcAAQAAAAMABwAMAAkABQAHAAcABAD+//v///8EAAMAAQAAAPz/9v/5/wEAAgD9//n/+P/4//r//P8AAAIAAwADAAEAAgAGAAcABAAFAAYABQAFAAgACQAJAAkABQACAP//+/8BAAoACwAGAPz/9//8/wIABQAIAAgAAQD4//j//P/7//z/AwAGAAQA/v/6//z/AQAFAAUAAAD9/wEAAgD////////+/wAA/v///wIAAAD//wEAAQD+/wIABQD///v/AQAHAAQA//8AAP////8EAAYAAgAAAAAAAQADAP7/+f/8//z/+v/9/wAA///+//3/AQAEAAEA/v8BAAcACAAEAAEABgAMAA4ADwALAAYABQACAAQACQAJAAgAAgD+/wEAAQAAAP3/+P/4//n/9//2//f//P8CAAMAAQD/////AAADAAQAAgAEAAQAAQAAAAgADQAJAAMAAwAEAAQAAwD+//r/+//+/////P/9/wAA+f/z//r//P/3//3/BAACAAIABAAHAAgABQACAAgADQAIAAQABQAGAAcABgAEAAYABwD+//j/9v/1//j/+//7//z/+v/1//b/+//+//3//f/+/wAA///+/wAABgAMABAAEQANAAoACAAKABAAEQAOAAkAAAACAAkACgAHAAUAAwACAP7//P///wMAAwD+//v///////v//P8AAP7/AAAAAP3///8CAAIAAAD9////AgABAAIAAAD+///////9////AQACAAEAAAABAAQAAwD+//z//v8CAAUABAABAAEAAgABAAEAAgAFAAcABgAEAAUABgADAAEABAAGAAMAAgABAP3//f8AAAEAAQAAAAEA///9//7//v8BAAIA+//7////AAACAAMAAQAAAAAA//8CAAMAAQABAAMAAgABAAAAAQACAAIAAgADAAYABAAAAAAABAAGAAIAAAAAAP//BAAHAAMAAAAAAAEAAwACAAIABAAFAAMAAQADAAQAAAAAAAEA//8AAAAA//8BAAEAAwAAAPz////+//3////9//z//P/5//z//f/9/wEAAAD+/wEAAQD+/wAABAAEAAYABwAFAAUABAADAAgADAAIAP///f8DAAMAAwAEAAIAAAD///7/+//6//7/AQACAP///P/9/wEAAQACAAQABAADAAAA//8EAAgABQACAAQABAABAAMABQABAP///v/9/////v/9/wAAAAD9//z/+//4//j/+v/8////AAACAAEA+//9/wIAAgAIAAkAAwAAAAAABQAJAAUABAAFAAEAAwAGAAIAAQAEAAQAAQAAAP3///8CAP7/+////wAA+//7/wIAAgD+//7/AAABAAIAAQD/////BAAHAAQAAgABAAIABwAGAAIAAwADAAUABQD///7/AwACAP//AwADAP3///8DAAAA/v/9//7/AgACAP3///8DAAEA/////wEABAAEAAAAAQADAAAAAQADAAMAAQAAAAAAAAD/////AQACAAIAAgABAP//AQADAAEAAAACAAAA/f///wAA//8AAAEAAAADAAMAAQABAP7//P8AAAQABAADAAEAAAACAAMAAQAAAAAAAgAEAAEA/v8AAAEAAQABAAIAAAD//wEAAgACAAEAAAAAAAAAAgACAP///f/+//7/AgAAAPv///////z///8AAAEAAwACAAIAAwABAP//AgAEAAQABAAGAAgABQACAAUABQAEAAUAAwADAAMAAAAAAAAA/v///wEAAAD9//v//v8AAP7//P/8//z//v8AAAAAAQABAAAAAQABAAAAAgAEAAIAAAACAAQAAQAAAAMAAgABAAIAAQD///7//v////////8AAP3//P////////8BAP////8CAAAAAAADAAEAAAADAAYABQABAAIABQADAAMAAwABAAAAAgABAP/////////////8//v//f/+//3//v///////v/+////AQABAAAAAQAEAAMAAAADAAMAAQADAAIAAQAEAAQABAAEAAAAAAABAAEAAgABAP7//v8AAAAAAAAAAP//AAD///7/AAABAP///v8AAAIAAQD//wAAAgADAAMAAQAAAAIAAwACAAEAAAABAAMAAgD+//7/AQABAP7///8CAAAA//8BAAAA/////wEAAQD//wIAAgAAAAEAAAAAAAMAAgACAAMAAQACAAIAAQAEAAYAAgAAAAQAAQD+/wEAAwAAAP///////wIAAAD9/wAAAQD+////AAAAAAEAAQABAAEAAQABAAEAAAACAAQAAQABAAIAAgACAAIAAgACAAIAAQABAAIAAQABAAAAAQABAAAA//8AAAAAAAAAAP////8BAAEA///+//7/AAADAAEA//8BAAIA//8AAAMAAQABAAMAAwABAAEAAgACAAIAAQAAAAIAAgAAAAIAAgABAAAA//8BAAIAAAABAAEA//8BAAIA//8AAAIAAQABAAEAAQADAAMAAAAAAAIAAQAAAAIAAwABAAAAAwACAAEAAgACAP//AAACAAEAAAD//wAAAQAAAAAAAQAAAAIAAQD//wEAAgACAAMAAQAAAAIAAwACAAEAAQACAAMAAgD//wEABAAAAP7/AgACAAAAAQABAAAAAQABAAAAAAAAAAAAAQABAAAAAQAAAAEAAgABAAEAAgACAAIAAgABAAIAAgABAAIAAgACAAIAAAAAAAEAAgACAAAAAQACAAEAAQACAAEAAQACAAEAAQACAAEAAQACAAEAAgACAAEAAQABAAEAAgACAAAAAQADAAIAAAAAAAIAAgAAAAAAAQABAAEAAgAAAP//AQADAAAAAAACAAEAAAADAAQAAgADAAMAAAACAAMAAgADAAIAAAACAAIAAQABAAAAAAADAAIA//8AAAMAAQAAAAIAAgACAAEAAAAAAAIAAgABAAIAAgABAAIAAwADAAIAAgADAAIAAgAEAAIAAAACAAIAAgACAAEAAgAAAAEAAwAAAP//AwADAP//AQADAAEAAAACAAIAAwAEAAAAAgAHAAEAAAAEAAMAAQADAAIAAQAAAAIAAgABAAEABAACAAEAAgD//wAAAwAAAAEAAwAAAAEAAgABAAEAAgABAAIAAgD//wAABAADAAEAAAABAAMAAwABAAEAAQACAAEAAAABAAEAAQACAAIAAQABAAEAAQABAAMAAwAAAAAAAgACAAEAAgACAAEAAgADAAIAAQACAAMAAQABAAIAAgABAAEAAQABAAMAAgAAAAMAAQD//wMAAwD//wAAAwABAP7/AAADAAAAAAADAAEAAAACAAAAAAADAAIAAAABAAEAAgACAAAAAgAEAP////8EAAEA/f8DAAQAAAAAAAEAAgACAAAA/v8BAAQA///+/wMAAgABAAIAAQADAAQAAQABAAAA//8CAAEA//8BAAEA//8BAAEA//8BAAIAAQABAP//AQACAAEAAgACAAAAAQABAAEAAgABAAEABAADAAAAAQAEAAEA//8BAAEAAAABAAAAAAABAAEAAQAAAAEAAgAAAAEAAgAAAAEAAQABAAQAAAD//wMAAQD+/wMABAD+////BQABAP//AwACAAEAAwAAAAAABAABAP//AwADAAAAAQABAAEAAQABAAIAAQAAAAMAAgD//wEAAgABAAEAAgACAAIAAQABAAEAAAAAAAEAAAABAAIAAQAAAAEAAQACAAEA//8BAAQAAAD+/wIAAwAAAAAAAQAAAAEAAgABAAEAAQABAAEAAQABAP//AAADAAAAAQACAAAAAgABAP//AgACAP//AQADAAAA//8CAAEAAAACAAIAAQABAAEAAQABAAIAAAAAAAMAAQAAAAEAAQABAAIAAQABAAAAAQACAAAA//8CAAIAAQACAAAAAQACAAIAAgABAAAAAgADAAAAAQACAAAAAQACAAAAAAACAAEAAQABAAAAAgADAAAAAAACAAAAAQABAAAAAQACAAEAAQABAAEAAQABAAEAAgACAP//AAADAAIA//8BAAQAAAAAAAMAAgAAAAMAAgAAAAIAAQD//wMAAgD9/wEAAwAAAAEAAwABAAAAAQABAAMAAgAAAAEAAAABAAMAAQABAAIAAQADAAIAAAABAAIAAQACAAIA//8BAAMAAQACAAIAAAACAAQAAgAAAAAAAAACAAIA//8AAAMAAgAAAAAAAQABAAIAAAAAAAIAAQAAAAEAAgABAAAAAQABAAAAAQABAAEAAQACAAEAAQAAAAEAAgABAAEAAQD//wEAAgAAAAAAAQAAAAIAAgAAAAIAAQAAAAEAAQABAAIAAQABAAIAAgAAAAAAAQABAAEAAQAAAAAAAgABAAAAAAAAAAEAAgAAAAEAAgABAAEAAQABAAEAAQABAAEAAQACAAEAAAACAAEAAQACAAEAAQABAAEAAgABAAAAAQACAAEAAgABAAEAAwABAAAAAwABAP//AgABAAAAAAABAAMAAQAAAAEAAAABAAIA//8AAAIAAQAAAAEA//8AAAIAAQABAAIAAQABAAEAAAAAAAMAAgD+/wAAAgD//wAAAgABAAEAAgABAAAAAAABAAIA//8AAAQAAQD+/wMAAgD//wEAAwABAAEAAgAAAAEAAgAAAAAAAwACAAAAAQABAAEAAgAAAAEAAwABAAAAAwACAP//AgACAP//AgABAP//AgAAAAEAAwABAAEAAQD//wEABAAAAP//AgACAAIAAgAAAAEAAQABAAMAAQABAAIAAQABAAIAAQABAAAAAQADAAIAAQAAAAAAAwADAP//AAABAAEAAQABAAAAAQADAAIAAQD//wEAAgABAAEAAQAAAAEAAgABAAEAAQAAAAEAAgAAAAEAAQAAAAEAAQABAAEAAQABAAEAAgACAP//AgADAAAAAQAAAAAAAgACAAEAAAAAAAMAAgD//wIABAAAAP//AgACAP//AAACAAAAAAABAAAAAgACAP//AQACAP//AAACAAEAAgACAAAAAQABAAAAAQABAAAAAQABAP//AQACAP//AQABAAAAAgAAAAAAAwACAAAAAQADAAIA/////wEAAQABAAEAAAAAAAIAAQAAAAAA//8AAAMAAQAAAAEAAQD//wAAAwACAP//AQADAAEAAQABAAAAAQACAAEAAAAAAAAAAwACAAAAAAD//wEAAwABAAEAAgD//wEABAD///7/AwACAAAAAQABAAIAAgD//wAAAQAAAAAAAQACAAEAAAABAAEAAQACAAIAAAAAAAEAAQABAAEAAQABAAEAAQAAAAEAAwAAAAAAAwAAAP//AQABAAEAAQABAAIAAgAAAAEAAgABAP//AQADAAEAAAACAAIAAAABAAEAAAABAAIAAAAAAAAAAgACAP//AAABAP//AAADAAEA//8CAAIAAQABAP//AAADAAEA//8BAAIAAAD//wAAAQACAAEAAAABAAEAAQABAAAAAAACAAEAAAABAAEAAQABAAAAAQABAAEAAQAAAAAAAgACAAEAAAABAAIAAQAAAAEAAgABAAEAAgACAAAAAAADAAIA//8CAAMA//8AAAMAAQD//wIAAwABAAEAAgD//wIAAwAAAAEAAgABAAIAAgABAAIAAAD//wMABAAAAAAAAwABAAEAAwACAAEAAQAAAAEAAgABAAAAAQABAAEAAgABAAEAAgABAAEAAQAAAAMAAgD//wEAAQABAAEAAQABAAAAAQADAAEA//8BAAEA//8AAAIAAQD//wEAAQABAAEA//8BAAUA///9/wIAAQAAAAEAAQAAAP7/AQACAP7/AAAEAAIAAAAAAP//AAADAP//AAACAAAAAAACAAAAAAAAAP//AgACAP//AAADAAIAAAAAAAEAAwADAAAAAAABAAIAAAABAAIAAQACAAIAAQACAAEAAQABAAAAAgADAP///v8BAAIAAQABAAAAAgADAAEAAQAAAAAAAgABAAAAAQABAAAAAAAAAAEAAgAAAAEAAwAAAP3/AgAEAP////8CAAEA/f8AAAQAAAD//wIAAAD//wIAAAAAAAMA///+/wIAAQAAAAEAAAABAAIA/v///wUAAQD9/wEAAgAAAAAAAAAAAAEAAQAAAAEAAgAAAAAABAAEAAMABAACAAMABgAFAAMAAwAEAAUAAgAAAAIABQADAAIAAQD//wEAAwADAAMAAgADAAIAAAACAAQAAgABAP//AAACAAAA/f///////f/+/wEA///7//7/AgACAP///f/+//////////7/AQADAP///v/+//v//f8CAAIAAAD+//7/AAD8//r/BAAHAPz/+/8CAP7/+/8EAAcAAAD8//3/AQACAPz/+P/+/wMAAgD///v/+////wIA/v/4//f///8CAPz/+v/9//z//P/9//z//f8AAAAA/f/5//j/+//+/wEAAQD+//n/+P/5//3/AAD//wIAAQD2//X/AgAGAAAA/P/8//z/+////wAA/P/9/wQAAQD7//7/+//8/wIA/f/7//3/+f/6//z/AAAHAP7/7f/z/wIAAAD8/wEA/v/0//b///8DAAAA+v/5/wEAAQD1//L/+/8CAAcAAwD5//f/+f/8//3/+v/9/wIA/v/6//j/+v///wEA/f/5//r/+//7//z//v8AAP///P/6//z//f/8//3/AAD+//r/+//+/////v///wIA/v/5//n/+/8AAAcABgD9//j//f8CAAEAAgAAAPz/AAAFAAAA+v///wUAAAD6/wMACAD7//f/BAAEAPz/AgAFAP//AAADAAAA///7//j/AgAGAP3///8IAAAA9f/4/wIACQAHAP7/+P/5//7/AwACAP////8BAAIAAQD8//z/AQAEAAMAAQD+/wEAAwAAAAAAAgD9//3/CAAKAAMA+//1//3/BQAEAAQAAgD8//r//P8CAAcAAwD7//v///8CAAEA/f/+/wIAAgAEAAMA+v/2//n/AwANAAoA+//1//7/CAAKAAQAAgABAPz/AAAFAPr///8PAAoA+//7/wMACAAEAAEAAQD//wAACgAEAPr/BQANAAIA+//+/wMABwAAAPn/BgAPAAQAAAABAPz/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z//Y/7f/tv/P/9T/v/+j/6H/rv+9/9D/wv+e/6T/wv+7/6T/q/+0/6D/kf+h/77/x/+f/3j/i/+e/4T/gP+q/7X/k/+G/5v/p/+e/4f/Z/9e/4v/sP+f/4//kf+c/6b/ff9M/13/iv+n/6b/g/9o/2z/gP+N/4z/gP9v/2//if+T/3z/Zv9o/23/Xf9O/2X/kf+W/3H/Wf9h/27/bP9g/1X/Wv9n/2v/X/9M/0r/af9+/1r/Lf86/1r/Vf9C/0n/Vv9e/2n/W/8v/yf/TP9X/z7/NP8y/yr/Nf9K/1T/VP89/yr/QP9N/y7/H/84/0f/Pf8u/zL/Uf9c/zv/DP8D/zf/YP9N/y7/Iv8v/0v/Vv9P/zr/Jf8q/z//Tf9b/2f/V/84/zf/UP9d/0//Pv9L/3P/hf97/3H/WP9D/1L/ef+b/5b/b/9q/5L/pP+U/5H/lf+G/37/oP/G/8f/vv+3/6P/nv+4/8//1//U/8b/t/+3/9f/9//s/9T/0P/k/wYACADe/8P/0f/x/xIAIAAIAOv/9P8JAAwACAAJABEAFwAMAAEACQARAA4ADwARAA0ACwAZACgAJAAcACIAHAAIAA8AIgAbABAAEAAPABcAKwAzACwAIgAVAAwAFgAjAB0AEgAcAC8ALwAkACYAMQAkAAEA+/8VACUALwA3ACQAEgArAEAALgAYABEAFwAlACkALQA3ADYALAAhAB8AMwBBAC8AIgAtADgASQBOADwAMgAsADEASABaAFoASgA8AEgAXQBbAEkAPQBBAFcAawBpAGAAZQBsAGMAVgBeAGwAZgBjAHAAgACGAHQAZAB0AJEAlgByAFcAewCrAJ4AcQBpAJAAsQCdAHUAdACMAJcAlQCFAHkAjgCpAKYAiQB5AIgApQC0AKIAhgCKAJIAfgB7AJQAoACgAKQAmQCAAH0AhgCAAH8AoQC4AJAAbQB8AIYAfwCCAIAAcQBuAHgAiACTAH4AZABzAIMAbgBfAGUAagBvAHEAbABtAGEASQBKAGMAcwBjAEgARgBQAFwAZQBcAEwAQgBDAFEAWwBUAEUAPwBGAEgAQQBBAEoAVABRAEEANgA4AEAARQA5ACoALgBCAFkAUQAtACYARgBUAD8AKwAnACUAMABQAGEAUwBDAD4AMwAsADIAMwAxADgASABOAEAAQABMAEcAPAAyAC8APwBHADwA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EwATABIAFgAcAB4AHQAcABsAGgAcACEAIgAfACIAJQAhACMAJQAlACcAKQAoACMAIwArAC0AKgAvADIAKAAmADEANQAuACsALQAtADAAMgAyADcANgAvADAANAAzADMANAA0ADYANgAzADIAMwA2ADkANgAxAC8AMQA2ADYAMgAyADUAOAA6ADcAMAAuADQANgAzADQAOAA3ADEAMAAzADUAMwAwAC8AMwA4ADUALgAsAC0AMgA1ADEALwAwADIAMAAtAC0ALAAqAC4AMQAvAC4ALQAqACoALAAqACYAJgApAC0AKgAoACkAKAAnACUAIwAoACwAJwAlACUAIQAgACQAIwAgACMAJgAlACIAIgAkACQAHwAbAB0AIgAkAB8AGQAbACIAJQAiAB0AGQAaABwAHQAbABgAGwAeABoAFwAcABoAEwAVABsAGAATABIAFQAZABcAEgAVABoAFAAOABEAEgAPAA4ADwARABIAEAAMAAkADAAOAAoACQAJAAcACQALAAsACAACAAMABwAHAAYABgACAP//AQACAAAAAAD///3//f/8//z/AAD+//f/9P/4//v/+f/4//n/+P/1//L/8P/y//f/9v/x/+3/7v/0//f/8f/r/+//9v/0/+z/5v/l/+r/8P/1//P/6//l/+T/6v/t/+r/5v/l/+b/6P/o/+b/5f/m/+j/6P/j/9z/3v/n/+r/5v/h/+D/5P/m/+L/3//f/+X/6P/l/9//3P/c/+P/5//l/+D/2//g/+X/4v/g/9//4P/j/+T/4//h/+H/4f/d/9r/3//l/+X/3//c/+D/5f/m/+L/3P/b/97/4//n/+P/3//i/+P/3//e/+P/4//e/97/5P/j/+H/5P/h/9z/2//e/+D/4P/i/+P/5P/h/93/4//r/+P/2//g/+X/4f/e/+L/5//o/+X/4v/i/+f/6//l/+H/5f/q/+3/7f/k/9//4v/k/+j/6//s/+3/7f/t/+7/7P/p/+j/7P/x/+//5f/j//L//P/z/+3/9v/2/+n/6P/x//L/7//2//n/9P/6////8//s//T/+f/2//H/7f/1/wIA/f/1/wEABwD5//r/AQD4//P/8v/2//3/BQAPAAYA9v8AAAEA9f/8/wIA9//1/woAGwAPAPj/+f8BAPD/8f8EAAAAAQAPABIAFgAMAPD/7P/7//f//P8dACQA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';\n\nconst PCM_DATA3 =\n  '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sv+6/6n/lP+U/6T/rv+p/53/nf+h/53/mP+j/7L/ov+P/5v/of+a/57/m/+S/5X/o/+r/53/jf+R/5f/kf+S/5X/k/+a/53/mP+Z/5r/lf+U/43/hf+O/6D/pv+f/57/nf+P/4b/jP+Q/5T/of+n/5f/iP+R/5//n/+V/43/lf+e/5X/lf+p/6r/lP+M/5D/j/+T/5z/mP+R/53/sP+r/5v/j/+E/4j/mP+f/6P/o/+h/6j/qf+X/4r/kf+h/6n/pP+d/6L/q/+r/6j/p/+g/5b/m/+y/77/tf+o/6H/ov+n/6r/r/+z/7L/tf+6/7r/sP+l/6r/rv+s/7f/xf+9/7b/v//B/7f/sv+w/7H/uv/O/9f/vv+s/73/yP+//8D/w/+8/77/wv/F/83/yP/C/9H/2f/O/8H/u//A/83/0f/S/9r/1f/K/8v/0v/X/8r/v//T/+P/1//L/9L/5f/h/9D/1//Z/8n/0f/o/+r/4v/m/+T/1v/R/93/8P/3/+H/zv/j//n/6//b/+P/8P/y//L/9f/1//X/8v/o/+P/9v8GAP3/+P/+/wcADwD9/+n/8/8EAA0ADgADAP//CgAQAA0ADgANAAYADAAbABkACwALABUAGwATAAgAEAAmACgAGQAVABsAJQAmABoAGQAiACYAKwAtACgAIgAkAC8AMQAoACkALQAuADEANwA0ADEAOwBBADMALwBBAEIAMgA4AEQAPAA5AD8AQQBIAEsASgBOAEkAPgBAAEsATwBPAE0AUwBfAFwATQBJAE0AVgBaAFMAVABeAF8AWwBfAGcAYgBWAFcAYgBpAGwAbABoAGMAZQBqAGgAZgBmAGsAeAB3AGwAbgBpAGMAbwB2AHgAdQBwAHwAhwB5AGgAcQCAAHYAagB8AIwAhQB/AIIAewBzAHUAeAB5AH8AhgCEAHwAfgCFAIEAeABxAHgAiwCOAHkAbgB0AH0AiACPAIIAcQBzAHoAeAB5AIAAggB+AHkAdQBxAG0AbQB3AH4AcwBsAHUAewByAGoAcgB0AGYAaAB1AG8AaQBsAGYAYABoAG0AawBqAGQAXABcAGIAYwBfAGEAZABcAFYAWwBiAF0ATwBPAFkAVQBTAFoAVABJAFEAVgBMAEsASwBJAEgARQBIAEwASABDAEAAPABCAEkAPQA4AEIAPgA6ADwAOAA2ADEAMQA8AD0AOAAzACwALAAxADAAKQAlACcALQAvACgAJQAoACwAJwAcABoAIwAlACAAHgAhACMAGwAUABcAHgAeABYADwAVAB4AGgAOAAsAFgAdABMABwAGAA0AEAAOAAgABAAJAA4ACwABAPz/AAADAAgACAAAAP7//P/0//b/+//6//3/AAD6/+z/5//w//H/7f/4//r/6f/k//P/8P/h/+H/5P/h/+H/5f/p/+z/4v/W/9r/4P/Y/9X/2v/b/97/3P/V/9f/1//P/8//1P/V/9D/zP/M/8//z//P/9D/zf/K/8j/xv/J/83/yP/D/8n/zP/D/7z/wP/E/8P/wv/E/8H/vf++/7z/u/+8/7n/vf/B/7r/uv/A/8D/uv+1/7T/sP+v/7z/wv+7/7j/uv+1/7H/s/+v/6j/rP+6/7//tf+x/7b/sv+s/6v/qf+t/7T/tP+3/7f/pv+h/67/r/+q/63/sf+1/7D/p/+s/7P/rP+m/6r/rv+t/6v/rv+z/7L/r/+s/6f/q/+w/6//r/+x/7D/rv+r/63/tP+4/7D/pP+r/7v/s/+q/6//sv+z/7P/tP+4/7r/tP+x/7T/s/+y/7X/uv+6/7n/vP+9/7j/t/+5/7f/uf++/7z/u//F/8r/v/+z/7j/wf+//7//y//I/8H/xf/E/8H/w//E/8X/yf/I/8b/y//N/8j/xP/F/8r/0P/N/8n/z//T/9D/z//N/8b/xP/J/9X/3v/a/9L/zf/Q/9L/zf/O/9X/2f/b/9n/1P/S/9X/2v/c/9j/1v/Z/9v/3P/a/9n/2v/a/97/5//l/93/3f/e/9z/4P/k/+H/4P/m/+j/4v/i/+j/5//n/+j/5//n/+r/6//r/+v/7P/v/+r/5//x//X/6//r//P/8v/y//b/9f/z//X/8//0//f/9v/2//X/9v/8//z/+f/8//z/9v/4//7///////3//f8BAAIA/v/9/wIAAwD+/wEABwADAAEABQAFAAMABgAKAAUAAQAGAAkABwAJAAoADAANAAQABAAPABIADgANAA0ACwALAA4ADgAMABAAGQAXABAADQAMABAAFQASABMAFgAUABUAGAAWABQAEwAUABcAGQAYABoAHQAZABQAFAAZAB4AHQAaABkAGQAbABsAGgAbABsAGgAZABwAHwAfABwAGAAZAB8AHwAWABUAHQAfAB0AHQAdABsAGgAaABoAGgAcAB4AGwAYABsAHAAbABsAGgAbABwAGAAWAB0AHAAXABwAHgAaABgAHAAbABUAGAAgAB4AGwAeABwAGQAcABwAHAAhACEAHgAeAB8AIQAhAB4AIAAjAB4AHwAmACEAGwAiACYAIwAeAB0AIQAkACQAJAAlACQAIAAfACYAJwAhAB4AHwAiACMAIgAgAB4AHwAgAB0AGwAdAB0AHQAeAB4AHAAbABwAHAAZABcAGgAZABYAGQAaABcAFwAWABYAFwAUABEAFQAXABQAFAAYABIACwAPABMAEgAQAA0ADQAOAA8ADwANAA4AEQANAAwADAAJAAsADAAJAAoACQAIAAgABgAGAAwACgACAAMACwAJAAUACgAMAAcABQAGAAYABgADAAIABwAJAAYABQAFAAQABAAFAAQAAgAEAAgACAADAAMABwAEAAIABAADAAMACAAJAAUAAgACAAMAAwAEAAYABQADAAIAAgAEAAYAAwADAAUAAgACAAcABgD/////AwACAP////8BAAMAAwAAAP//AgADAP////8AAP7///8AAP3//v8AAAAAAAD9//j//P8BAP7/+//7//v/+//8//z/+//5//v//P/7//r/9v/2//r/+f/5//3/+//2//f/+f/3//X/+P/5//T/9v/4//f/9v/2//X/9f/1//b/8//x//b/+v/2//P/9f/0//H/8v/0//H/8v/z//H/8v/y//D/8//0//D/7//x//D/8f/x//D/8v/y//H/8P/u/+7/7v/u/+//8//y/+3/7f/w/+3/6//x//P/7P/r//D/8P/u//H/8v/t/+3/7v/u//L/8f/t//D/8f/s/+7/9f/z/+7/7v/x//T/8//t/+7/8v/x/+//7//y//P/8v/z//L/8f/y//L/7//x//T/8//y//T/9P/w/+7/8v/z//T/9v/1//H/8f/x//H/8v/y//P/9f/1//P/8//0//P/8//z//P/9P/0//T/9v/2//X/9v/0//L/8//1//T/9P/2//X/9P/4//j/8//0//r/+f/x//P/+f/2//f/+f/1//T/9v/3//j/+f/4//n/9//2//r/+f/1//r//P/2//f/+//5//n/+P/2//z//f/3//j//f/7//j/+v/8//3/+//5//v////9//n/+v/8//3//f/9//v/+v/9//7/+//6//3//v/+//3//f/+//3/+//9/////v/9//3////9//z////+//z////9//n/+////wEA///+//3//P/9//7////+/wAA///8//7//v/+/wAA/v/9/wAAAQD+//z///8BAAAA/f/9/wAAAwD///3//////wAAAgABAAAAAQACAAIA//8BAAMA///9/wMABAD//wAABAABAAAABAAEAAIAAgACAAIAAwADAAIABAAFAAMAAQAAAAEABAADAAEABAAGAAQAAwABAAEABgAEAAEABQAEAAMABwAJAAYAAgABAAQACQAHAAUABQAGAAYABgAFAAUABQAHAAoACQAJAAoACgAIAAgACQAIAAcABwALAA8ADAAFAAcADQAMAAgACAAJAAgACgAMAAwADAAMAAoACQAJAAoADQANAAwACgAKAAoADAALAAsACwALAAwADQAJAAgACQAKAAwADQAMAAwADAALAAoACwAKAAoADwAPAAoACgAMAAoACgAKAAwADAAMAA4ADAAJAA4AEQAKAAgADwAOAAgACQALAAoACwAMAAkADAAOAAwACwAKAAYACQANAAwADAANAAoACQAJAAoADQALAAkACQAIAAkACwALAAkACQAKAAoACgAKAAsACgAJAAgACQAMAA0ACgAGAAcACgAKAAkACAAIAAoACgAHAAYABwAIAAkACAAHAAoACgAFAAUACAAFAAIABQAIAAgABgAGAAYABgAFAAIAAAABAAQABgAHAAYAAwD///7/AQADAAQAAwACAAIAAgAAAP////////3/AAADAAAA//8BAAAA/v/+/wAAAAD+//3////////////+///////+//7///////3//f8AAAEA/f/8/wEAAgD7//3/AwD///z//////////f/8/wIABAD+//v//v/+//7//////wEAAAD+//3//P/9//7//v/+/wAA///8//z//v/+//3//f///wIAAQD+//7/AQAAAP7//v/+//v/+/8AAP///P/9//3/+//7//3//f/9//7////8//r//P/8//n/+f/6//v//P/7//v/AAD+//j/+v/+//v/+//9//r//P8AAAAA/v/7//z//v/+//3/+v/7/wEA///6//r/+//8////////////AAD///r/+v///////v8BAAMA///+/wIA/v/3//v//v/8//n/+P/8/wAA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';\n\nconst PCM_DATA4 =\n  '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FwAkAEAAQgAqABUAHwA3ACYA9//1/xgAFgDw/+n/AQAIAAAAAAAJABUALQA5AC4ALQAzADwASgBDADoAQQA9ADoAOAAzAEAASQAyAB0AIgAoABkACQATACEAFgAAAAcAIQAhAAYABQAoADwALgAgAC0ASABKAC8AJQA1AEMAPQAlABwAJQAkABgACwD+/wEACAADAAoAHQAdABoALwA4AB8AEwAvAEMANQAjACkAOAAyABIA+v///wcA+f/i/9//9v8FAPz//P8LAAUA/P8QACEAIAAiACsAMwArABUAEQAfACAAEwAPABwAJgAdAAoAAwAHAAUA/v/6//v/AgAIAAQA9//r/+7/+f/y/+z/AwAXABgAFwAWABYAGQAbAB8AGwARAA4ADwAMAAsACgAHAAsACAD9//b/5f/h//T/8P/b/+b/BgAEAOr/8v8VAB0ACAD4/wQAIgAqABYADQATAA4A9v/h/9n/2//j/+D/zv/O/+f/5v/G/8L/0//b/+D/3v/Z/9//7P/x/+f/4v/x//n/8f/4/wUAAgD8/wgACwDv/+L/9v/4/9v/zv/a/97/0f++/8H/2v/X/8X/1P/p/+T/5f/3//v/9P/2//7//P/x//L//f/7/+z/3v/j//T/7f/k//P/+v/x//H/9//+/wAAAAD8//X/8v/z//T/7v/i/+H/8f8AAP//8f/r//T/+P/1//b/9v/0//j/AAABAPf/8v/6//b/5//y/wsACgD8//L/+/8RAAsA+f8BAAcA+//y//X/+f/y/+b/5//u/+X/1//a/+n/6//Z/83/2//m/9//2P/Y/+L/5//a/9D/2//z//H/1v/c/+//5v/Z/9f/1//W/83/x//M/9T/1f/O/8n/zv/U/9H/zf/O/9H/1P/a/93/0v/C/8P/zf/K/8j/yf/O/9z/3//a/93/5f/s/+7/4//W/9z/6f/p/9r/zf/U/+L/3f/R/8//1//j/+v/5f/e/+X/7f/u/+//9v/9//3/+//9//X/8//+//r/6//q//P/8//o/+T/8f/8//P/4v/n//r//P/1//b/+/8BAAEA//8FAAsACwAIAAMAAAADAAQAAwD+//j/+/8BAAAA+f/2/wAADQAMAP///f8DAP7/+v////7///8FAAAA+//2//b/AQABAPz//////wcAEQAFAPj/AQAGAPb/6v/3/wMA+P/q//D/+v/0/+X/4//y/wIA/v/t/+3/CgAcAAYA9v8BAP7/8//2/+3/2v/e/+7/7f/i/+T/7//0/+z/5v/t//X/+P/6//D/7P/9//7/7v/o/+j/6v/t/+j/7P/9//z/6v/q//T/7//m/+3/+P/3//L/9P/2//X/9//1/+7/8/////7/+v/2//f////9//H/7f/0//7//f/t/+z//f/3/+L/7P/9//T/6//6/xEADgD+/wAAEQAZAA0ABQAXACIAFAAMAAwACwAFAP7//v/4//T//P/3/+n/6//z//7/BAAAAP7/CgAVABcAFgAVABkAGQAOAAwADgAJAAwAEAANAAoABgAFAAUA/v/2//3/CQALAAQA9//6/w4ADgD9////FQAaAA8AEAAdACAAFgAPAA0ACgAEAAAAAwAGAAAA/f8FAAoACwAHAAEAAQABAAIACQANAAcAAwAHAAkAAgD+/wQABAD+/wUAEgAPAAoADgAKAAAABQAIAPv/9f8AAAIA+v/4//z/AgAHAAIA/v8EAAsABwD///v/AAAFAAAA/v8AAPn/9f/3//j//P8AAAQADwAWABMAEQAUABQACwAHAA0ACwAAAAEAAQDy/+z/9//3/+3/9v8GAAoABQAAAAsAGwASAAUADAAZAB8AFwAPABQAFwAQAA0AFgAaABMADAAPABYAFAALAAkADgANAAIA+P/7/wQABwABAAAACQARABMAFgAbACAAKwA1ADEAKAArADMALQAgABwAHAAbABUADgAPABEADwALAAkAEAAYAB0AHgAUAA4AHQAnAB0AGwAlACQAGwAhACgAHwAUABkAHQAXABYAGgAVAA0ADQAQABMAFAAPABgAJAAaABUAHgAeABkAEwAUAB8AHgAOAA4AFgAMAP//BwASAAcA8f/x/wIABwAEAAEABAANAAoAAgADAAcADAALAAMAAAAGABAAEQAFAAMACQAGAAEAAgADAAYADAAJAP7/+P/7//7/+P/4/wMAAwD9//7/AAAEAAgABgAHAAcAAQD//wYACgAGAAAAAQACAP7//P8AAAMAAAD8//7/BQAFAP7//P8EAAkABwAAAP7/BAAFAAMABgALAA4AFAASAAgAAwAFAAcA/v/2//z////7//b/8//9/wMA+P/z//j//f8AAP3//P/8//7////6//L/8//5//r/+v/9//z//P8BAAAA+f/6/wMAAwD4//L/+P/6//b/+P/z/+z/+P/+//D/6v/x//f/+//6//r/AwAGAPr/9////wMA/f/x//L//v/9/+//6v/1//v/8//y//n/+//6//j/+P/7//f/9v/2//X/9//1//P/9v/2//f/+f/7//3/+//8//3/+//8//z/+f/7//n/9//6//n/9f/z//P/+P/4//f/+f/6//3/AQD///3/+v/4//f/9f/3//r/+f/4//j/9//1//r////6//j/BAAEAPT/8/8AAAAA+P/3//n/AAADAAAA/v/8//r/+//6//3/AQD8//T//f8DAPn/8f/1//n/+v/2//L///8LAAIA/P8BAAMAAQD/////BAADAAAAAQAAAPr/9v/2//f/8//x//b/9v/w//T//P/6//r/+//6//r/+/8BAAIA+//7//3/AAACAPv/+P/+/wAA+//1//L/9f/5//T/8P/z//b//P/+//f/9f///wQA+v/x//r//v/0//H/9P/2//v//P/6//n/+//9//v/+P///wQA+f/2//7/9v/t//P/9v/x/+7/7//3/wAA/P/3////AgD9//r//f8DAAQA/P/5//7//f/4//T/7//0//j/9f/2//j/+P/5//r//v////v//P8AAAEAAwACAPv/+v/+//3/+f/4//r/AQABAPj/9v8AAAMA+v/2//z/AQD///z//P/+//z/+v/5//v/AAAEAAMAAQD+//3/AgABAP3/AQACAAEAAAD8//n/+v/4//j//P/+//7///8AAP//+v/3//z//v/9//z//f8BAAUAAwD9//n/+f/7//7//f/8//7//f/+//v/9f/6/////P/7//3/AAD+//r//f8AAP7//v/9//v//v8AAPn/9P/5//7/+f/2//f//P////n/9/8DAAkAAgD8////BAAHAAIA/f8AAP//+//6//n/+//6//b/9//3//j/+//8////AAD+/wIAAwAAAAEAAwAFAAQAAAABAAUABQAAAP3/AAAAAPv/+//+//3/+v/4//v/AQABAP3//v8CAAMAAgD+////BQAHAAgABgADAAcACQAIAAgABgAGAAUAAQABAAIA/////wEA///5//r///////v//v8EAAUAAwAEAAgACwAJAAcABwAFAAQABgAFAAQAAwADAAMAAAD+/wIABQAEAAQAAQD9/wAABAABAPz/AAAHAAQA/f8BAAQAAQAFAAcABQAHAAcABAAGAAYABQAIAAgAAQABAAUABgABAPr/+v8CAAQA/f/7/wAABAADAAAAAQAHAAoABgAEAAYACQALAAYAAQACAAIA//8AAAEAAgADAAQAAwD//wEABwAFAAMABgAGAAEAAQAIAAgA/v/8/wEAAQD//wMAAwABAAQABwAIAAkABQACAAgABQD4/wAADAACAPz/AAAFAAYA/f/7//7/AAAIAAgA//8CAAoABwAEAAQAAwAKAAoAAQAFAAkAAgD/////AQAFAAEA/f8FAAsAAgD8/wIACAAGAAEA//8GAAoABQACAAYABwAGAAMAAwAHAAcABAAEAAYAAwD//wIABAD///7/AwADAAAAAQAFAAgABQACAAUABwAEAAMABAAFAAYAAgACAAMA/v///wMAAwAEAAUABQAFAAUABgAFAAIAAgADAAUABgAEAAMABQADAAMABQAEAAEAAQADAAEAAAAEAAUAAwABAAIABgAFAAAA//8FAAcABAACAAYACAAHAAcABgAGAAYAAwABAAAA/v///wIAAgAAAAEABQAEAAEABAAHAAMABQALAAYAAQAFAAYABQADAAAAAwAEAAQABwAGAAMABQAFAAMABwAGAPz/+/8EAAMA/P/+/wQABwAGAAEAAQAEAAUACAAIAAQABgAJAAMAAgAFAAEA/f///wEAAQACAP7///8IAAUAAAAIAAoABAADAAYABgABAAEABQACAAAAAQACAAIAAwAAAAEABAABAAAABgAFAAIAAwAEAAQAAwAAAAMABwADAP7/AwAHAAQAAQACAAYABwADAAEAAQABAP7//f8CAAUABQAEAAMAAwADAAIAAwACAAQABQADAAMABAAEAAQAAQD//wIABAAEAAMAAgADAAQAAgACAAQAAwAAAAEABQAEAAEAAQACAAEAAAAAAAEAAwAEAAQABAAEAAQABAADAAMAAgACAAMABAADAAIAAgABAAMAAwD//wEABQAEAAMAAQABAAMAAgADAAQAAwACAP//AAAEAAAA/v8DAAQAAQACAAMAAgADAAUABQACAAEABAAGAAIA///9//7/AQD///7/AgACAAEABAADAP7/AQAEAAAA//8BAAUABAABAAIAAQAAAAIAAQAAAAIAAQD+/wAAAAD+/wAA/v/8/wAAAQABAAEA//8CAAUAAQD9////BAAEAAAA/v8BAAUABQACAAAAAQACAP//AAACAAIAAgAAAAEAAgD///7////9//7/AQACAAAAAAAEAAYAAwABAAMABQADAAMAAgD//wAAAgD+//z/AAACAP///v8AAAEABAADAP////8CAAMAAwAAAAEAAwD9//r/AQADAP3/AAAFAAIAAQACAAMABAADAP//AAADAAEA/v8AAAEAAgACAP//AAACAP///v////3///8CAAEAAQABAP//AAADAAEA/v/+////AAD+//v/+//+//////////7//v/+//7/AAD///3//f/7//7/AgD///3//f////7/+v/9/wEAAQAAAP7//P///wAA/f/9/////v///wAA/f///wEAAAD///7//v8BAAAA/v/+//7///////z//f///wAA/////wAAAgABAP///v8AAAEAAQAAAP//AAAAAAAAAAAAAAAAAgABAAEAAgACAAEA//8BAAMAAQAAAP///v8AAAEAAAABAAEAAwACAAEAAQABAAIAAwAAAAAAAgABAAIAAQD//wAAAQAAAAEAAQD//wAAAgABAP///////wAAAQABAAEAAwABAAAAAQACAAIAAAAAAAIAAAACAAMAAAABAAIAAQABAAAAAAABAAIAAQAAAAEAAAD//////////wEAAAABAAMAAwADAAIAAAAEAAMA//8AAAEAAAD+//3///////7///8AAAAAAQACAAAAAgACAAIAAwABAAAAAgACAAAAAAADAAIA/f/+/wMAAQACAAMAAQAAAAAAAAD/////AAAAAAEAAgD+/wAABAACAAEAAwACAAQAAgD//wIABAD+//3/AgABAPz//v8BAP///v8AAAAAAQADAAIABAAEAAAAAAABAP7///8BAAAAAQAAAAMABQD+//7/AwABAAMABQABAP3//v8BAAIA/v/+/wEAAAAAAAQAAQAAAAUABAACAAMAAgACAAMA/v/8/wIAAgD8//7/AgABAAAA//8AAAMABAABAAAAAgAEAAMAAgABAP//AAACAAEA//8AAAEAAwADAP7/AAAGAAIA/v8EAAQA//8AAAMAAQAAAP////8DAAQAAAABAAMAAgACAAAAAAAFAAQA/v8AAAMA//8AAAMAAQAAAAAAAAACAAMAAAABAAMAAgACAAIAAAADAAQAAAABAAMAAQD//wAAAAAAAAIAAAAAAAMAAgD//wAAAAAAAAIAAgADAAMAAgABAAEAAQACAAIA//8BAAIAAQAAAP//AAADAAEA//8BAAMAAwACAAMAAwACAAEAAgABAAIAAgAAAAAAAAACAAIAAAABAAEAAQABAAEAAQABAAIAAgACAAEAAQACAAIAAgACAAMABQACAAEABQAEAAEAAwACAAIAAgAAAAEAAQAAAAIAAQACAAIAAQACAAQAAgACAAMAAQABAAMAAAABAAMAAQABAAAAAAACAAIAAgABAAIABAADAAEABAAEAAIAAgABAAAAAQABAAAAAQABAAEAAwABAAAAAQAEAAMA//8AAAQAAAD//wIAAAAAAAIAAwACAAAAAgAFAAEA//8EAAIA//8FAAIA/f8BAAIAAAACAP///P8DAAQA/v8BAAMAAAABAAEAAgAFAAIAAAABAAQAAgD+/wAAAgAAAAEAAAD//wMAAgACAAIAAQACAAIAAAACAAMAAgABAAEAAAACAAIAAAABAAEAAAABAAEAAQABAAEAAgABAAAAAQACAAIAAgABAAAAAAADAAIAAAABAAMAAwACAAAAAAABAAEA//8AAAEAAAABAAIAAAABAAIAAgACAAIAAgACAAIAAQABAP////8BAAIAAAABAAMAAwAAAAIABQABAP//AgAAAP7/AQACAP//AAABAAEAAgABAAAAAwABAAAAAgABAAEAAwABAP//AgABAAAAAQAAAAAAAwABAP//AwAEAP//AQADAAEAAAAAAAEAAQABAAIAAQABAAEAAgAAAAEAAgAAAAIAAAD+/wIAAQD+/wAAAAAAAAIAAQAAAAIAAgD//wEAAwACAAAAAQADAAIAAQABAAEAAgABAP//AQACAAAAAgADAAAA//8BAAMAAAD//wMAAQD//wEAAQAAAAIAAgACAAIAAQACAAIA//8BAAEA//8BAAIA//8BAAIAAAACAAIAAAACAAMA/////wMAAgAAAP////8CAAIAAAAAAAIAAgABAAEAAwACAAIAAgAAAAAAAAABAAAA//8BAAIAAAABAAMAAQABAAEAAAAAAAIAAwABAAAAAAABAAEAAQAAAAEAAQABAAMAAgAAAAMAAwD//wEAAwD///7/AgABAP//AQABAAEAAwABAAEAAwAAAAEAAgAAAAIABAABAAAAAgABAAAAAQABAAEAAgAAAAAABAACAAAAAgADAAAAAAADAAMAAQACAAMAAAAAAAIAAAAAAAEAAAACAAQAAAD//wQAAgAAAAMAAwADAAIAAAACAAIAAQABAAIAAwACAAEAAgADAAIAAgACAAIAAQACAAEA//8AAAIAAgAAAAEAAQABAAIAAwABAAIABAADAAIAAQAAAAEAAgAAAAAAAgABAAAAAQABAAEAAQACAAIAAgADAAMAAQD//wEAAwABAAAAAQABAAAAAgADAAEAAAACAAIAAQABAAMAAQAAAAIAAQABAAMAAAABAAUAAAAAAAMAAQACAAIAAAADAAMAAAABAAIAAAD+/wAAAgAAAP7///8CAAEAAgACAAEAAwACAAEAAgABAAEAAwABAAAAAAABAAIAAAAAAAIAAQAAAAIAAQAAAAEAAQABAAAAAQACAAEAAQACAAEAAQABAAAAAQACAAAAAAACAAEAAAABAAIAAQABAAAAAAABAAAAAAACAAIAAAAAAAIAAQAAAAEAAQABAAIAAQABAAAAAAAAAAEAAQACAAIAAAABAAIA//8AAAEAAAABAAEAAAABAAEAAQACAAEAAQABAAEAAAABAAIAAAD//wIAAQD//wEAAQAAAAEAAQAAAAAAAAD//wAAAQABAAEAAAAAAAAA/v/9/wAAAAD+/wEAAwABAAAAAQAAAAEAAgABAAEAAgAAAAAAAgABAAEAAAD//wAAAgAAAP//AgACAAAAAQABAAEAAgACAAEAAQAAAAAAAQAAAAEAAAD//wAAAQAAAAAAAQABAAEAAQABAAAAAgACAAAAAQAAAAAAAgABAAAAAAAAAAEAAQABAAEAAQABAAIAAgACAAEAAAABAAEAAQABAAEAAQACAAIAAAAAAAMAAQD//wIAAwD//wAAAwABAAAAAAABAAEAAgACAAIAAQABAAEAAQABAAMAAgD//wEAAwAAAAAAAQAAAAEAAgD//wEABAABAAEAAgAAAAEAAwABAAIAAgABAAIAAwACAAAAAAACAAEA//8AAAEAAAABAAEAAAABAAEAAQACAAAAAQACAAEAAQAAAAEAAwABAAAAAgACAAEAAgABAAAAAgABAAEAAgABAAIAAwABAAEAAgACAAIA//8BAAIA//8AAAIAAQAAAAMAAgAAAAEAAwADAAAAAQAEAAEAAAADAAAA//8CAAIAAAACAAAAAAADAAIA//8CAAIA//8BAAIAAQACAAEAAAACAAIAAAABAAAAAAACAAEAAQABAAEAAAABAAIAAgAAAAEAAgABAAEAAgABAAAAAgABAAAAAQABAAAAAwABAP7/AgADAP//AQACAAEAAQABAAEAAQABAAEAAgAAAAEAAgABAAMAAgAAAAMAAgAAAAMAAQAAAAMAAQABAAIAAAAAAAMAAgAAAAEAAgACAAEAAAAAAAEAAgABAAAAAgADAAIAAQAAAAAAAQACAAEAAgABAAEAAgACAAAAAQACAAEAAAABAAEAAQABAAEAAgACAAIAAgABAAEAAgABAAAAAQABAAAAAQABAAAAAgABAAAAAgACAAEAAgAAAAEAAwABAP//AwADAP//AAACAAEAAAABAAEAAAAAAAEAAQACAAIAAQACAAAAAgADAAAAAQADAAAAAAACAAEAAQACAAEAAQACAAAAAAADAAEA//8AAAIAAgABAAAAAAABAAEAAAABAAEAAQACAAIAAQABAAEAAQACAAAAAQACAAEAAgACAAEAAAABAAEAAAAAAAIAAQAAAAEAAgAAAAAAAgABAAEAAQACAAIAAQABAAIAAQABAAIAAAAAAAIAAQABAAMAAQABAAMAAAAAAAMAAQD//wEAAwACAAEAAQAAAAAAAgACAAEAAQABAAAAAQACAAEAAgACAAEAAgABAAEAAgABAP//AgADAAAAAAACAAEAAAACAAEAAQADAAAAAAACAAEAAgACAAAAAQACAP//AAACAAEAAAACAAMAAQAAAAIAAgACAAIAAgABAAEAAgADAAEAAAABAAEAAAABAAEAAQACAAEAAQADAAEA/v8CAAMA/v8BAAQAAAABAAIAAgACAAAAAQACAAAAAwADAP//AQADAAEAAgACAP7/AwAEAP//AgADAP//AQACAAEAAwABAP//AQADAAEAAAABAAIAAgABAAAAAAACAAIAAQACAAIAAgACAAEAAQACAAEAAQACAAEAAAABAAIAAAD//wEAAgAAAAEAAgABAAEAAQABAAIAAQABAAEAAQACAAEAAQACAAAAAAADAAEAAAADAAMAAQABAAIAAQABAAEAAAABAAIAAQABAAIAAQABAAIAAgAAAAAAAgABAAAAAgABAAEAAgAAAAEAAgAAAP//AQACAAAAAQACAAIAAQADAAMAAgACAAEAAQACAAAAAAACAAIAAQABAAIAAQAAAAIAAwAAAAEAAwABAP//AgACAAEAAQABAAIAAQABAAMAAQAAAAIAAgAAAAEAAwD/////AwACAAAAAQABAAEAAwABAAAAAgABAAIAAwAAAAEAAwABAAAAAwABAAAAAgABAAEAAgABAAAABAADAAAAAgADAAAAAQACAAIAAQABAAIAAQABAAEAAQABAAIAAQABAAMAAAAAAAIAAQAAAAIAAQABAAEAAAABAAIAAgABAAEAAQACAAIAAQACAAMAAQABAAIAAQAAAAAAAgACAAAAAQADAAAAAAADAAEA//8CAAMAAQACAAEAAQAEAAIAAAACAAIAAQACAAEAAgADAAEAAAACAAIA//8AAAMAAgAAAAEAAQABAAEAAQACAAIAAQACAAIAAQACAAIAAAABAAMAAAAAAAMAAgABAAIAAQABAAMAAQABAAMAAQACAAIAAQACAAIAAgACAAEAAgAAAAAAAgAAAAAAAgABAAEAAgABAAEAAgABAAEAAgABAAIAAwACAAEAAAAAAAIAAQABAAIAAgABAAIAAgAAAAEAAgABAAAAAQACAAEAAQACAAEAAQACAAIAAQACAAEAAAADAAIA//8CAAIAAAACAAEAAQACAAEAAgACAAEAAAABAAAAAgACAAEAAgACAAEAAgABAAAAAgABAAEAAgACAAIAAQABAAIAAQABAAIAAAABAAIAAQABAAEAAQACAAIAAQACAAIAAQACAAIAAAABAAIAAQAAAAEAAQABAAEAAAABAAIAAgABAAEAAQACAAIAAAAAAAMAAAD+/wMAAwD//wEAAwABAAEAAgACAAIAAgABAAEAAQABAAEAAQAAAAEAAgAAAAEAAwAAAAEAAgAAAAEAAgAAAAEAAwAAAAAAAwABAAAAAQABAAEAAQD//wAAAQABAAAAAQACAAEAAAABAAIA//8BAAIA/////wIAAAD//wAAAQAAAP7///8BAAAAAQABAAAAAQACAP//AAACAP//AQADAAAAAQACAAEAAQAAAAAAAgACAAAAAAABAAEAAQAAAAEAAQABAAEAAQABAAIAAQAAAAAAAQABAAEAAQAAAAEAAQAAAAEAAAAAAAIAAQAAAAEAAgABAAAAAQABAAAAAAABAAAAAAABAAEAAQAAAAEAAQABAAIAAAABAAIAAAABAAIAAAABAAIAAQACAAEAAAABAAEAAAABAAIAAgABAAEAAAABAAIAAQABAAIAAQABAAEAAQABAAEAAQABAAAAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAAABAAIAAQABAAAAAAABAAEAAQABAAEAAQABAAAAAQAAAAAAAgAAAAAAAQAAAAIAAQAAAAEAAQAAAAEAAQABAAEAAAABAAIAAQABAAEAAQABAAEAAgABAAAAAQACAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAIAAAAAAAIAAQABAAEAAAACAAIAAAACAAIAAAAAAAIAAQD//wEAAgABAAAAAAAAAAEAAgABAAEAAQABAAEAAAAAAAIAAQAAAAIAAQAAAAMAAQAAAAIAAQAAAAMAAgD//wEAAgABAAIAAAABAAMAAQABAAEAAgABAAAAAQACAAAA//8DAAEA//8CAAIA//8BAAMAAQD//wAAAwABAAEAAgAAAAAAAwABAAAAAwAAAAAABAACAP7/AgACAAAAAgABAAEAAgABAAEAAgACAAAAAQACAAIAAQAAAAIAAQAAAAIAAQABAAIAAQAAAAEAAQACAAEAAAAAAAAAAQABAAAAAQABAAEAAQAAAAAAAQABAAAAAQACAAIAAgACAAAAAAACAAEA//8BAAIAAAABAAEAAAACAAIAAAACAAEAAAABAAIAAQABAAEAAQACAAEAAAABAAAAAQACAAAAAAABAAEAAQABAAEAAQAAAAEAAQABAAEAAgABAAEAAgABAAAAAQAAAAAAAwABAP//AgACAAAAAQABAAEAAQAAAAAAAgABAAAAAQABAAEAAQABAAMAAQABAAMAAgAAAAIAAgAAAAAAAgACAAAAAAACAAAAAQADAAEAAAACAAEAAQACAAAA//8DAAEAAQACAAEAAQABAP//AQACAAAAAAABAAEAAAABAAEAAAACAAIAAAABAAEAAAABAAAAAQADAAAA//8BAAAAAAABAAIAAQAAAAEAAwAAAAAAAwACAP//AgACAAAAAAACAAEAAAAAAAEAAQABAAEAAAABAAMA//8AAAMA///+/wMAAQD//wMAAwAAAAAAAQABAAAAAQACAAEAAAACAAEAAAACAAAAAAADAAAAAAACAP//AQACAP//AgADAP7///8FAAEA/f8BAAMAAAAAAAAAAAADAAEA//8BAAIAAQABAAAAAAACAAIAAAACAAAAAAACAAEAAQABAAEAAQABAAEAAAABAAEAAQACAAEAAQACAAIAAQABAAEAAQAAAAIAAgAAAAEAAgAAAAEAAQACAAEAAAACAAIAAQACAAIAAQABAAEAAAD//wEAAQAAAAEAAQAAAAIAAgAAAAEAAQAAAAEAAQABAAIAAQABAAEAAAABAAEAAAABAAIAAQABAAIAAQABAAEAAgABAAAAAQABAAAAAQACAAAAAAACAAMAAAAAAAIAAAACAAIA//8BAAEAAAADAP////8DAAAA/v8DAAIA/v8BAAMAAAAAAAEAAQACAAIAAAABAAIAAQAAAAEAAQACAAIA//8BAAMAAAABAAIAAAABAAIAAAABAAEAAAABAAEAAQABAAEAAgABAAAAAQABAAAAAQACAAAAAAABAAEAAQABAAAAAQABAAEAAQABAAEAAQABAAAAAgACAAAAAAACAAEA//8BAAIAAAABAAEAAAABAAEAAQACAAEAAAABAAEAAQACAAEAAAACAAIAAAABAAEAAAABAAEAAAABAAEAAAAAAAIAAQAAAAEAAgABAAEAAQABAAEAAQACAAEAAQABAAEAAgABAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAQABAAEAAQABAAEAAQABAAIAAQABAAEAAQACAAIAAQACAAEAAAABAAEAAQABAAAAAgACAAAAAQABAAAAAQACAAEAAAABAAIAAQAAAAIAAgAAAAEAAgAAAAAAAwACAAEAAgAAAAEAAwAAAAEAAQAAAAIAAQAAAAMAAwAAAAAAAgACAP//AQACAAAAAAABAAAAAgACAAAAAQABAAAAAQABAAAAAgACAAEAAgAAAAAAAgABAAAAAgABAAAAAgACAP//AQACAAAAAAABAAIAAQAAAAIAAQAAAAIAAgAAAAEAAgABAAIAAQD+/wIAAgAAAAEAAQAAAAEAAQAAAAIAAQD//wEAAgABAAEAAQACAAIAAQABAAEAAQABAAAAAQACAAEAAgACAAEAAAABAAIAAQAAAAIAAgAAAAEAAQABAAEAAQABAAIAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAAACAAIAAAABAAIAAAAAAAIAAQD//wAAAgABAAAAAQABAAAAAgACAAEAAQABAAEAAgACAP//AQACAAEAAQABAAEAAQABAAAAAQABAAEAAQACAAEAAQABAAAAAQACAAAAAAABAAAAAAABAAEAAQABAAEAAQD//wAAAgABAAAAAQABAAAAAgAAAAAAAwAAAAAAAwABAAAAAQABAAIAAgAAAAAAAgABAP//AQACAAEAAAABAAEAAAABAAEAAQABAAEAAQABAAEAAgABAAEAAgAAAAEAAgAAAAEAAwABAAEAAgACAAEAAAACAAIA//8BAAIAAAABAAIAAAAAAAEAAgABAAEAAQABAAIAAQAAAAEAAgABAAIAAQAAAAEAAQAAAAEAAQABAAEAAQABAAEAAQABAAEAAgAAAAEAAgAAAAAAAgACAAEAAQACAAEAAAABAAIAAQABAAIAAQABAAIAAAABAAIAAAACAAIAAAABAAEAAQADAAIAAAACAAIAAAAAAAEAAQABAAAAAAACAAIAAQABAAEAAQABAAEAAQAAAAEAAgACAAAAAAACAAEAAAACAAMAAQAAAAIAAgABAAIAAgAAAAEAAgABAP//AQACAAEAAQACAAEAAgACAAAAAAAEAAAA//8DAAEAAAACAAIAAQABAAEAAQABAAAAAAABAAIAAQAAAAEAAwABAAAAAgABAAEAAgAAAAAAAQABAAIAAQAAAAEAAgACAAAAAQADAAEAAAABAAEAAQABAAEAAgABAAIAAQAAAAEAAwABAP//AgACAAAAAQABAAEAAQAAAAEAAQABAAEAAQABAAAAAAACAAIAAAABAAEAAQABAAEAAgABAP//AgADAAAAAQADAAAAAAADAAEA//8BAAMAAQD//wEAAgAAAAIAAgD//wEAAgAAAAIAAwD+/wEAAwAAAAEAAgAAAAIAAAD+/wIAAwD/////AwADAP//AQADAAEAAQABAAEAAgABAAEAAQAAAAEAAwAAAP//AgABAAAAAwABAAAAAgABAAEAAQAAAAAAAgABAAEAAQABAAEAAQAAAAAAAQACAAEAAQACAAEAAQABAAEAAAABAAIAAQABAAEAAQABAAEAAQACAAAAAAACAAEAAQACAAEAAQABAAEAAQABAAEAAgABAAEAAQABAAIAAAABAAEAAQABAAEAAQABAAEAAQACAAEAAQABAAEAAQABAAEAAQABAAIAAQAAAAEAAQAAAAEAAgABAAAAAQABAAAAAAABAAEAAAABAAEAAQABAAEAAQAAAAAAAgABAAAAAgACAAAAAQACAAAAAQACAAAAAgACAAAAAQABAAAAAQABAAIAAgABAAEAAQABAAEAAAAAAAEAAQAAAAEAAQAAAAIAAgABAAIAAQABAAIAAAABAAMAAQAAAAAAAgABAP//AQACAAEAAAABAAAA//8BAAIAAAD//wIAAgD//wEAAgAAAAAAAwABAAAAAQABAAEAAwAAAP//AwABAAAAAgACAAEAAQAAAAEAAgABAP//AgADAAEAAAABAAEAAQABAAEAAQAAAAAAAQAAAAEAAQAAAAEAAQABAAEAAQABAAIAAgABAAEAAQABAAIAAQABAAEAAAACAAMAAAACAAIAAAABAAIAAgABAAAAAgACAAEAAQAAAAAAAQACAAEAAQABAAIAAQAAAAIAAgAAAAEAAwAAAAAAAgABAAEAAgAAAAEAAwAAAAAAAgABAAEAAQABAAIAAgABAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAIAAAAAAAIAAgAAAAEAAgACAAEAAQAAAAEAAgACAAEAAQABAAEAAQABAAAAAQABAAEAAgACAAEAAQABAAEAAQABAAEAAgABAAIAAgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEAAgABAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAgABAAEAAgABAAEAAgABAAAAAQABAAAAAQABAAEAAgABAAAAAQABAAEAAQAAAAAAAgABAAAAAQACAAAAAQACAAEAAQABAAEAAQABAAEAAQAAAAEAAwAAAP//AQACAAAAAgACAAEAAQACAAEAAQABAAEAAQABAAEAAQABAAEAAgACAAAAAQACAAAAAAACAAEAAQACAAEAAQACAAAAAAACAAEAAQABAAEAAgABAAAAAAABAAAAAQACAAEAAQABAAEAAgABAAEAAgABAAAAAgACAAEAAQACAAEAAQABAAIAAQABAAEAAQACAAEA//8BAAIAAAABAAIAAQABAAIAAQAAAAAAAQACAAAAAQABAAAAAQABAAAAAgABAAAAAwADAP//AAACAAAA//8CAAMA//8AAAIAAQAAAAIAAgAAAAEAAgABAAEAAQABAAEAAQABAAIAAAAAAAIAAAD//wMAAgD//wEAAwAAAAEAAgD//wEAAwD+/wAAAwD//wAAAwACAAEAAQAAAAIAAgABAAIAAQAAAAIAAQABAAIAAAACAAMAAAABAAIAAAABAAIAAQACAAEAAQACAAIAAAD//wEAAgABAAEAAQACAAIAAQABAAIAAgACAAEAAAABAAIAAQACAAIAAQABAAIAAQABAAEAAQABAAEAAQAAAAEAAgABAAEAAQACAAEAAQABAAEAAQABAAEAAwACAAAAAQACAAEAAQACAAIAAAABAAMAAQAAAAIAAQAAAAEAAgAAAAAAAgABAAEAAgAAAAAABAAAAAAAAwAAAAAAAgABAAIAAgABAAEAAgABAAEAAQACAAEAAQAAAAEAAgABAAEAAQABAAIAAQAAAAEAAQACAAIAAAABAAIAAQAAAAEAAQABAAIAAQAAAAIAAQAAAAEAAQABAAEAAQABAAIAAQABAAEAAQABAAEAAgACAAEAAQACAAEAAQACAAEAAAABAAIAAQD//wEAAQAAAAEAAwABAAAAAgACAAEAAgABAAEAAQABAAIAAgABAAEAAQAAAAEAAgABAAEAAgACAAEAAgAAAAEAAwAAAP//AwABAAAAAQABAAEAAQABAAEAAAABAAIAAQABAAIAAQACAAMAAAABAAIAAQABAAIAAQAAAAEAAQADAAMAAAAAAAMAAQAAAAEAAQABAAEAAQABAAEAAQABAAEAAQACAAIAAAABAAMAAgAAAAIAAgAAAAEAAgABAAEAAQABAAEAAQABAAIAAQAAAAIAAgABAAMAAgAAAAEAAgAAAAAAAQABAAEAAgAAAAAAAwAAAAAAAwACAP//AQACAAEAAQACAAEAAAAAAAIAAQAAAAIAAQAAAAIAAQABAAIAAQABAAIAAQABAAEAAAACAAMAAAAAAAMAAgAAAAEAAgACAAIAAQABAAIAAQABAAEAAAACAAMAAAAAAAMAAQD//wIAAgABAAEAAQAAAAIAAQAAAAIAAgAAAAEAAgAAAAAAAQABAAEAAQABAAEAAgACAAEAAQABAAEAAgAAAAEAAgABAAEAAgABAAEAAQACAAEA//8BAAIAAAABAAIAAQAAAAEAAAACAAIAAAABAAIAAAAAAAEAAQABAAAAAQABAAAAAQABAAAAAAACAAIAAAABAAMAAQAAAAIAAgAAAAEAAwAAAP//AwACAP//AQACAAAAAgABAP7/AgADAP7/AAADAAAAAQACAAAAAgAAAP//AgADAAAA//8CAAIAAAABAAIAAQAAAAIAAgAAAAAAAgABAAAAAgACAP//AAADAAEAAAACAAIAAQACAAEAAAACAAEAAQACAAEAAQACAAEAAAACAAAA/v8CAAIA//8BAAMAAQABAAIAAAABAAIA//8AAAIAAAD//wMAAgAAAAEAAQAAAAEAAQACAAEA//8DAAEA//8CAAEAAQADAAEAAQACAAAAAQACAAEAAQACAAAAAQACAP////8CAAEAAQACAP//AAAEAAAAAAADAAEAAAACAAEAAQACAAAAAQACAAEAAAABAAEAAAD//wEAAgAAAAEAAgAAAAIAAQAAAAIAAQAAAAIAAgAAAAAAAQABAAAAAQACAAIAAQABAAEAAQACAAEAAAABAAIAAgACAAAAAQABAAIAAQD//wAAAgABAAEAAgAAAAAAAgABAAEAAgABAAEAAgABAAEAAgABAAAAAQABAAIAAgABAAEAAQABAAEAAQABAAIAAAABAAIAAQABAAMAAQD//wMAAwAAAAAAAwABAAAAAgABAAEAAgABAAIAAgABAAIAAgABAAIAAgAAAAEAAwAAAAAAAgAAAAAAAQACAAEAAQAAAAAAAQABAAAAAQABAAEAAwABAAAAAgABAAAAAgABAAEAAQABAAEAAgABAAAAAgADAAEAAAACAAEAAQACAAIAAAAAAAEAAQAAAAEAAQABAAIAAQABAAIAAQACAAEA//8BAAMAAAAAAAMAAQAAAAIAAgAAAAEAAgABAAEAAQABAAEAAQAAAAEAAgABAAEAAQAAAAEAAQABAAEAAgACAAEAAgABAAEAAgAAAAEAAgAAAAEAAgABAAEAAAAAAAEAAgAAAAEAAQABAAIAAQABAAIAAQACAAMAAAABAAEAAQACAAEAAQABAAEAAQACAAEAAQABAAIAAgABAAAAAQACAAEAAgACAAAAAQADAAEA//8BAAIAAAABAAIAAQAAAAIAAQABAAEAAQAAAAEAAQABAAIAAQABAAEAAQAAAAEAAAAAAAIAAQAAAAIAAgABAAIAAQAAAAMAAwD//wEAAQABAAIAAAABAAIAAAACAAEAAAACAAAAAQACAAAAAQACAAAAAAADAAMAAAAAAAMAAgAAAAEAAgABAAAAAgAAAAAAAgABAAAAAQABAAEAAwABAP//AQACAAAAAQABAAEAAgABAAAAAgACAAAAAQABAAEAAgACAAEAAQABAAEAAQACAAEAAQABAAEAAQABAAIAAgABAAEAAQABAAEAAQAAAAIAAgD//wIAAgAAAAEAAgABAAAAAQADAAAAAAACAAEAAAACAAEAAAADAAIAAAADAAIAAAACAAEAAAACAAEAAgACAAAAAQACAAEAAQABAAIAAgABAAEAAQABAAEAAQABAAEAAQACAAEAAAACAAIAAAABAAIAAQAAAAIAAgAAAAEAAgABAAEAAQABAAEAAQACAAIAAQACAAMAAAAAAAIAAQD//wEAAgAAAAEAAQAAAAIAAQAAAAMAAgAAAAEAAQAAAAQAAgD//wIAAgD+/wEAAgAAAAEAAQAAAAIAAgAAAAEAAwABAP//AQADAAEAAQADAAEA//8CAAMA//8AAAMAAAABAAEA//8CAAIA//8BAAEAAQACAAEAAAADAAIA//8BAAIAAAACAAEAAAACAAIAAAABAAMAAQABAAEAAQABAAIAAAABAAIAAAABAAIAAAAAAAEAAQABAAEAAQABAAEAAQACAAEA//8CAAIAAAAAAAMAAQAAAAEAAgAAAAEAAgABAAEAAgABAAEAAQABAAEAAQAAAAIAAQD//wIAAgD//wIAAgAAAAIAAQAAAAIAAgAAAAEAAwAAAAAAAgACAAEAAQAAAAEAAgABAAEAAQABAAIAAQABAAEAAAACAAMAAAABAAIAAAABAAEAAQAAAAAAAgACAAEAAQABAAEAAgACAAEAAQABAAIAAQABAAEAAQABAAEAAQAAAP//AQABAP//AQACAAAAAAABAP//AQACAP//AAADAAAAAQABAAAAAQAAAAAAAQAAAAEAAQABAAIAAQABAAIAAgAAAAEAAQD//wEAAQAAAAEAAQABAAIAAQD//wEAAwABAAAAAgABAAAAAAABAAEAAAACAAIAAAABAAIAAQD//wIAAwAAAAAAAwAAAP//AQABAAAAAQAAAAAAAwACAAAAAQAAAAAAAgABAAEAAwABAP//AwACAP//AQABAAAAAgABAAAAAgACAP//AQADAAEAAAABAAEAAQABAAEAAQAAAAEAAgAAAAEAAQAAAAMAAQD9/wIAAgD//wIAAQAAAAAAAAABAAEAAAAAAAAAAgACAAAAAQACAAEAAQACAAEAAAACAAAAAAABAAEAAgACAAAAAAABAAIAAAD//wIAAQD//wEAAQAAAAEAAgABAAEAAQACAAEAAAABAAIAAAACAAIAAAACAAIAAAACAAIA//8CAAMA/////wEAAAACAAIAAAABAAIAAAAAAAIAAgAAAAEAAgABAAAAAQABAAAAAQACAAEAAQABAAEAAQABAAAAAQACAAEAAAABAAIAAAABAAIAAQAAAAEAAQABAAEAAAAAAAIAAAABAAMAAQABAAEAAQABAAAAAAABAAEAAQABAAAAAQACAAEAAQABAAAAAQABAAEAAQABAAEAAQAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAgABAAEAAgABAAEAAQACAAEAAQABAAAAAgACAP//AQACAAAAAQABAAAAAQABAAEAAgABAAAAAQABAAAAAQABAAEAAQAAAAIAAQD//wEAAgAAAAEAAgABAAAAAgADAAEAAAABAAEAAgACAAAAAQADAAEAAAACAAEA//8CAAIAAAAAAAIAAgABAAEAAQABAAEAAQABAAEAAgAAAAEAAgAAAAAAAwABAAAAAQABAAEAAQACAAEAAQABAAEAAQACAAEAAAACAAEAAQACAAAAAQAAAAAAAQABAAEAAAAAAAIAAAD//wIAAQAAAAEAAQABAAIAAQAAAAMAAgAAAAIAAQAAAAEAAQACAAAAAAACAAEAAQACAAEAAAACAAIAAgABAAAAAAABAAEAAAABAAIAAQAAAAEAAQAAAAEAAgAAAAEAAgABAAAAAAABAAEAAAABAAEAAAAAAAIAAQAAAAIAAgAAAAAAAgACAP//AQACAAAAAQABAP//AgACAAAAAgAAAAAAAgABAAAAAwABAP//AwABAP7/AQABAAAAAQAAAP//AgACAP//AAACAAEA//8AAAIAAQABAAIAAAD//wIAAgAAAAAAAQABAAEAAAAAAAIAAgAAAAEAAgABAAEAAgAAAAEAAgAAAAEAAgAAAAAAAQAAAAEAAQAAAAEAAgAAAAEAAgABAAEAAQACAAIAAAABAAIAAAABAAIAAAACAAMAAAABAAEAAAACAAEAAAABAAEAAQADAAEA//8BAAMAAQAAAAEAAgABAAEAAAAAAAEAAQACAAEAAQADAAIA//8CAAMAAQAAAAIAAQD//wIAAgAAAAEAAQAAAAEAAQAAAAIAAQD//wEAAQABAAMAAQD//wIAAQAAAAIAAQAAAAIAAQD//wMAAwD//wEAAgAAAAEAAQAAAAIAAgABAAEAAQABAAIAAQABAAEAAAACAAEA/v8CAAIA//8BAAEAAAABAAEAAAACAAEAAAABAAIAAQAAAAEAAgACAAEAAQABAAEAAQAAAAEAAgABAAIAAgABAAAAAQACAAAAAAACAAEAAAABAAEAAQACAAEAAQACAAEAAQABAAAAAQACAAAAAQACAP//AQABAAAAAQACAAAAAQACAAAAAAACAAEAAAAAAAEAAgABAAEAAQABAAIAAQABAAEAAQABAAIAAQAAAAEAAgABAAAAAgACAAAAAQACAAEAAQABAAEAAAABAAIAAQAAAAEAAQABAAEAAQABAAAAAQACAAEAAAACAAIA//8BAAMA/////wIAAQAAAAEAAQABAAMAAAABAAIAAAABAAIAAAACAAMAAAABAAIAAAAAAAEAAAABAAIAAAAAAAMAAQD//wIAAgAAAAAAAgACAAAAAQACAAAAAAACAAEAAAABAAAAAQADAP////8DAAEAAAACAAEAAQABAAAAAgACAAAAAAABAAMAAQAAAAIAAgABAAIAAgABAAAAAgABAP//AAACAAEAAAABAAEAAAACAAIAAAABAAIAAQABAAEAAAABAAIAAQABAAIAAQABAAEAAQABAAEAAQABAAEAAQADAAEA//8BAAIAAQAAAAIAAQAAAAEAAgABAAAAAQABAAAAAQACAAAA//8CAAEAAAADAP//AAAFAP////8DAAAAAQACAAAAAgACAAAAAQACAAAA//8BAAIAAQD//wAAAQAAAAEAAQAAAAEAAgABAAEAAAACAAIAAAABAAAAAAACAAEAAAACAAEAAAACAAEAAAAAAAEAAAABAAEAAQACAAEAAQABAAEAAQAAAAEAAgAAAAAAAgABAAAAAQABAAEAAQABAAEAAQABAAEAAgABAAEAAAABAAEAAAABAAEAAQACAAIAAQAAAAAAAQABAAEAAgACAAAAAQACAAAAAAACAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAQACAP////8CAAAA//8BAAEAAAABAAEAAAABAAAA//8BAAEAAAABAAEAAAABAAAA//8DAAIA//8CAAMAAAABAAEAAAABAAIAAQABAAIAAQABAAIAAQACAAEA//8BAAIAAAAAAAEAAQABAAEAAQABAAIAAQABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAQAAAAEAAQAAAAEAAAAAAAIAAQAAAAAAAAABAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEAAgACAAEAAAACAAEA//8CAAIAAAAAAAIAAQAAAAAAAQABAAEAAgABAAAAAQABAAEAAQACAAIAAAABAAIAAAAAAAEAAAABAAIA//8AAAMAAQABAAIAAAABAAIAAQACAAIAAQACAAIAAQAAAAAAAgABAP//AAABAAAAAgABAAAAAQABAAEAAQAAAAAAAQABAAEAAAABAAIAAQAAAAIAAgABAAIAAQAAAAIAAQAAAAIAAQABAAIAAAABAAEAAQACAP//AQACAAAAAAACAAAAAAACAAIAAAAAAAIAAgAAAAEAAwABAAAAAgAAAP//AQACAAAAAQABAP//AgACAAAAAgABAP//AQABAAEAAgAAAP//AgACAAAAAQAAAAAAAgABAAAAAQABAAAAAQACAAEAAAABAAEAAQABAAEAAQAAAAIAAQAAAAEAAQAAAAMAAQD9/wIAAgD//wEAAgAAAAEAAQABAAEAAAABAAEAAAABAAEAAAACAAIAAAADAAIAAAADAAEAAAACAAEAAgACAAAAAAACAAIAAQAAAAIAAgABAAAAAAABAAEAAQAAAAEAAgABAAEAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAgABAAAAAQABAAEAAQABAAEAAgACAAEAAAAAAAIAAQAAAAEAAgAAAAEAAgABAAIAAQABAAIAAQABAAIAAAAAAAMAAQD//wIAAgD//wAAAgABAAAAAQABAAEAAQAAAAAAAQABAAEAAQAAAAEAAgAAAAEAAgAAAAAAAgABAAEAAgABAAEAAgABAAEAAgABAAAAAQACAAIAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAAAAAAEAAQAAAAEAAQABAAIAAgABAAAAAQABAAEAAAACAAEAAAABAAIAAAAAAAIAAQABAAEAAQABAAAAAQACAAAAAQACAAAAAAACAAEAAQACAAEAAQACAAAAAAADAAEA//8BAAIAAQABAAEAAAAAAAEAAgABAAEAAQABAAEAAQACAAIAAQABAAIAAQAAAAIAAgD//wEAAwD//wAAAgABAAAAAgAAAAEAAwAAAAAAAgAAAAEAAgAAAAEAAgD//wAAAgABAAAAAQACAAEAAQABAAIAAgACAAEAAAABAAIAAgABAAEAAQABAAEAAQAAAAEAAgAAAAAAAwABAP7/AgACAP7/AQADAAAAAQACAAIAAQD//wIAAQD//wMAAgD+/wEAAgAAAAIAAgD+/wMABAD+/wEAAwD//wEAAQABAAIAAQD//wEAAgABAAAAAQABAAEAAQAAAAAAAQABAAEAAQABAAIAAgABAAEAAgABAAEAAQABAAAAAQACAAAA//8BAAIAAAABAAIAAAAAAAEAAQABAAAAAQABAAAAAgAAAAAAAgABAAAAAwABAAAAAwADAAAAAQACAAAAAQABAAAAAQACAAEAAQACAAEAAQACAAIAAAAAAAIAAQAAAAIAAQABAAIAAQABAAIAAAD//wEAAgAAAAEAAgACAAAAAgACAAEAAQABAAEAAQABAAAAAQACAAEAAQABAAEAAAABAAIAAQAAAAMAAQD//wIAAgAAAAEAAgACAAAAAQADAAEAAAACAAIAAAABAAIA/////wIAAQAAAAEAAQABAAMAAQAAAAEAAAABAAIAAAABAAMAAAAAAAMAAQD//wIAAgAAAAIAAAAAAAMAAgD//wIAAgAAAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAEAAQACAAEAAAABAAEAAQABAAEAAQABAAAAAQACAAEAAQABAAEAAgACAAAAAAACAAEAAAABAAEAAAAAAAIAAgAAAAEAAwAAAAAAAgABAP//AgACAAAAAgABAAAAAwACAAAAAgABAAEAAgABAAIAAgABAAEAAgABAAAAAAACAAEAAQABAAAAAQACAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAQABAAEAAQABAAEAAQABAAEAAgABAAEAAQABAAIAAgABAAIAAAAAAAIAAAAAAAIAAQABAAEAAQABAAEAAQABAAEAAAACAAIAAQABAAAAAAABAAEAAQACAAEAAAACAAIAAAABAAIAAAAAAAEAAgABAAEAAQABAAEAAgACAAAAAQABAAAAAgABAP//AgACAAAAAgAAAAAAAgAAAAAAAgABAP//AQACAAEAAQABAAIAAgABAAIAAQABAAIAAQAAAAEAAgACAAAAAAADAAAAAQACAAAAAQACAAAAAQABAAAAAQACAAEAAQABAAEAAgABAAAAAQACAAEAAAABAAEAAQABAAEAAQACAAIAAQAAAAAAAgACAP//AAADAAAA/v8CAAIAAAACAAMAAAABAAIAAQACAAIAAAABAAIAAQABAAEAAAABAAEAAAABAAEAAAABAAEAAAABAAEA//8BAAIAAAAAAAIAAQAAAAEAAAABAAEAAAAAAAEAAQABAAEAAQABAAAAAgACAAAAAQADAAAAAAADAAEAAAABAAEAAgABAAEAAgACAAIAAAD//wIAAgD//wEAAgD//wEAAwABAAEAAwACAAEAAQACAAIAAgACAAIAAQABAAIAAQABAAIAAgACAAIAAQACAAIAAAABAAIAAQACAAIA//8BAAIAAAAAAAEAAQABAAEAAAACAAMAAQAAAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAAAAQACAP//AQACAAEAAgACAAEAAgABAAAAAgACAAAAAQABAAEAAgABAAEAAQABAAIAAgABAAIAAQAAAAIAAgABAAIAAgAAAAEAAgABAAEAAQABAAIAAQAAAAEAAgABAAEAAQABAAEAAQABAAEAAgACAAEAAQABAAIAAQD//wIAAgAAAAEAAQABAAAAAAACAAAA//8CAAEA//8CAAIA//8AAAMAAgAAAAIAAQABAAMAAAAAAAMAAgAAAAEAAQABAAIAAQAAAAIAAQD//wIAAgAAAAEAAgABAAAAAAAAAAEAAgABAAEAAQABAAIAAQABAAEAAQABAAIAAQAAAAEAAQAAAAEAAQABAAEAAgABAAAAAAABAAEAAAAAAAEAAQABAAAAAgACAAAAAQADAAEAAAADAAMA//8AAAMAAgD//wEAAwD/////BAABAP//AwACAAAAAgABAAAAAwABAP7/AgADAP//AAADAAEAAQAAAP//AgACAAAAAQACAAEAAgACAAEAAgACAAIAAgACAAEAAAACAAMAAQABAAEAAQABAAIAAgABAAEAAgABAAEAAQAAAAIAAgAAAAEAAwABAAAAAQABAAEAAgABAAEAAgABAAEAAgACAAEAAAACAAIAAAABAAEAAAACAAIAAQABAAEAAQABAAIAAQABAAIAAQABAAEAAQABAAEAAgABAAIAAgAAAAEAAwABAAEAAgABAAEAAgABAAAAAAACAAEAAQABAAEAAgADAAEAAQACAAEAAQACAAIAAQABAAIAAQABAAEAAQABAAEAAgACAAEAAQACAAEAAgACAAEAAgACAAEAAgABAAEAAQABAAIAAQAAAAEAAQD//wIAAgD//wEAAgAAAAEAAQAAAAEAAAABAAIAAQAAAAAAAgADAAAAAAADAAEAAAADAAMA//8BAAMAAQD//wIAAwAAAP//AwABAP//AwACAP//AgACAAAAAwABAP7/AwADAP//AgACAAAAAgAAAP//AwACAP7/AQADAAEAAAABAAEAAgABAP//AAACAAEAAAABAAEAAQABAAIAAAD//wIAAwABAAAAAgABAAAAAQABAAEAAgABAAEAAgACAAEAAQAAAAAAAgAAAAEAAgAAAAEAAQAAAAEAAQAAAAEAAgAAAAAAAgACAAAAAAACAAEAAAACAAEAAQACAAIAAAABAAIAAAACAAMAAAABAAIAAAABAAIAAQABAAEAAAABAAIAAAABAAEAAQACAAEAAQACAAAAAAABAAEAAgABAAAAAgACAAEAAwABAP//AgAEAAAA/v8CAAMAAAAAAAEAAQACAAEAAQABAAAABAADAP//AgAFAAAAAAAFAAEA/v8CAAMAAAABAAEAAAAEAAIAAAACAAEAAAACAAEAAQADAAIAAAADAAEA//8BAAEAAAADAAIA//8DAAMA//8BAAMAAAD//wEAAgABAAEAAgABAAAAAgACAAAAAgABAP//AwACAP3/AwADAP7/AgACAAAAAQABAAEAAgAAAAAAAQADAAIAAAABAAMAAgABAAIAAQABAAIAAAABAAIAAQACAAIAAAAAAAIAAgAAAAAAAwABAAAAAgABAAEAAgABAAEAAQABAAIAAQAAAAEAAgABAAIAAQAAAAEAAgABAAIAAQAAAAIAAgAAAAAAAQABAAIAAgAAAAIAAgABAAAAAgACAP//AQADAAAAAAACAAEAAQACAAIAAgABAAEAAgABAAEAAgABAAAAAgABAAAAAQABAAEAAwACAAAAAgACAAAAAQACAAAAAAABAAIAAQABAAIAAQABAAIAAgABAAEAAQABAAIAAQAAAAIAAQAAAAIAAQABAAIAAQAAAAIAAQD//wEAAgABAAEAAQABAAIAAgABAAEAAQAAAAEAAgACAAEAAQABAAEAAQABAAEAAQAAAAIAAQABAAIAAQABAAEAAAABAAIAAAABAAEAAgACAAEAAAACAAIAAQAAAAIAAgABAAEAAQABAAAAAQABAAEAAgACAAEAAAABAAIAAQABAAIAAgD//wEAAwAAAAAAAwABAAEAAgABAAIAAQABAAIAAQABAAQAAgD//wMAAgD//wIAAgAAAAIAAQD//wQAAwD//wIAAwAAAAAAAQACAAIAAQACAAIAAQACAAIAAAABAAIAAAABAAEA//8CAAEAAAACAAAAAAACAAEAAAADAAEA/v8BAAQAAQAAAAEAAQACAAMAAAAAAAIAAQAAAAIAAQABAAIAAgABAAEAAAACAAEAAAACAAEAAAACAAEAAAACAAIAAQACAAEAAQACAAEAAAABAAIAAQAAAAEAAgABAAEAAgABAAAAAgACAAAAAAACAAIAAAABAAIAAAD//wIAAgAAAAIAAgAAAAEAAgABAAIAAgD//wEAAwABAAEAAgABAAIAAgAAAAIAAwAAAAEAAgABAAEAAQAAAAEAAgABAAEAAQAAAAEAAQAAAAIAAgAAAAEAAgACAAEAAQABAAEAAQACAAIAAAABAAMAAQABAAIAAQACAAAAAQADAAEAAgAEAAIAAwAAAP7/AwAEAAAAAgAEAAEAAwAFAAMAAwAFAAQAAwABAAEAAwADAAIAAgACAAMAAgACAAIAAgACAAMAAwABAAIAAwABAAAAAwACAAAAAQABAAEAAQABAAEAAQABAAEAAAABAAIAAQABAAEAAQACAAEAAAABAAAAAAACAAEA//8BAAIAAAAAAAIAAQABAAIAAAABAAIAAAABAAIAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAAACAAEAAgACAAEAAgACAAEAAQABAAEAAQAAAAEAAQABAAEAAQAAAAEAAgAAAAEAAQAAAAEAAQAAAAIAAQABAAAAAAABAAEAAQABAAEAAgACAAAAAQABAAAAAQABAAEAAAABAAEAAAAAAAIAAgD//wAAAQAAAAEAAQAAAAEAAgAAAAEAAQD//wEAAwACAAAAAAACAAEAAAACAAEAAAABAAIAAAAAAAEAAQABAAEAAAABAAMAAAAAAAEAAQACAAIAAAACAAMAAAAAAAMAAgD//wEAAwAAAAAAAQAAAAEAAgABAAIAAgABAAIAAQD//wIAAgAAAAIAAQAAAAIAAQAAAAIAAAAAAAMAAgD//wAABAABAP//AQADAAAA//8DAAAA/v8DAAIA//8BAAEAAAADAAEA/v8CAAIA//8BAAIAAAABAAAA//8CAAIA//8BAAIAAAACAAIAAQACAAEAAAABAAIAAQABAAIAAgABAAAAAQABAAAAAgADAAAAAAADAAEAAQABAP//AQACAAAAAQABAAAAAQABAAAAAgACAP//AQADAAAA//8CAAEAAQABAAAAAQACAAAAAAABAAEAAgACAP//AQADAAEAAAADAAEA//8BAAIA//8BAAIAAAACAAIAAQACAAEA//8BAAEAAAACAAEAAAACAAEAAAABAAAAAAADAAEA//8CAAIA//8AAAIAAAAAAAEAAgABAAEAAgABAAAAAgACAP//AQACAP//AgABAP7/AgACAP7/AQACAAAAAQABAAEAAgABAAAAAQACAAEAAQABAAIAAQABAAIAAQABAAEAAQABAAEAAQACAAEAAAABAAAAAgACAAAAAQACAAEAAQAAAP//AAABAAEAAQABAAEAAQAAAAAAAQAAAAEAAQAAAAEAAQAAAAEAAQABAAIAAQAAAAEAAQABAAEAAQABAAEAAQABAAEAAQACAAAAAAACAAAAAQACAAAAAAACAAIAAgAAAAAAAgABAAAAAwABAP//AwACAP//AQAAAAAAAgAAAP//AgACAAAAAAACAAEAAAABAAIAAQABAAEAAAABAAIAAAABAAIAAAABAAIAAAAAAAIAAgABAAEAAQABAAAAAQACAAEAAAACAAEAAQABAAAAAQACAAAAAQACAAEA//8BAAIAAQAAAAIAAgABAAIAAgAAAAEAAwABAAEAAQABAAIAAQAAAAAAAgABAAAAAQACAAEAAQACAAEAAQABAAEAAQABAAIAAgABAAEAAQAAAAEAAQACAAEAAQADAAIAAAACAAQAAAD//wQAAgD9/wEABAD+/wEAAgD//wIAAgAAAAMAAQD+/wEAAQAAAAQAAgD+/wMAAgD+/wEAAQD//wMAAQD+/wMABAD+/wEABAAAAAAAAQABAAEAAQACAAEAAQACAAIAAAABAAIAAAACAAEA/f8CAAIA//8BAAEA//8BAAIAAQACAAIA//8BAAMAAQABAAEAAgACAAEAAQABAAIAAQAAAAAAAQABAAIAAwABAAAAAQACAAAAAAACAAIAAAABAAAAAAABAAEAAQABAAAAAQABAAEAAQACAAEAAQABAAAAAgABAAAAAgABAAAAAgABAAAAAAACAAIAAAAAAAIAAQAAAAIAAgD//wIAAwAAAAEAAQABAAMAAgAAAAEAAgABAAEAAQAAAAIAAgAAAAEAAwAAAP//AwABAP//AQACAAAAAgABAAAAAgABAAEAAgAAAAEAAgAAAAEAAgABAAAAAgABAAEAAQABAAEAAgABAAEAAgACAAEAAQAAAAEAAgACAAAAAgACAAAAAQADAAAAAAACAAEAAQACAAEAAQABAAAAAQACAAAAAQABAAAAAQACAAAAAQADAAEAAAABAAAAAQADAAEAAAABAAEAAQACAAEAAQABAAAAAQACAAAAAAACAAIAAQABAAIAAQABAAIAAQABAAAAAQACAAEAAAACAAAA//8CAAIAAAABAAMAAQABAAIAAQABAAIAAAAAAAIAAAABAAMAAQAAAAEAAQABAAEAAAABAAIAAQADAAEA//8BAAIAAQABAAIAAgAAAAEAAgABAAAAAgACAP//AQADAAAA//8CAAEAAAACAAAAAAAFAAAA//8DAAEAAAACAAIAAQABAAEAAQABAAEAAgABAAEAAgAAAAAAAgABAAEAAgAAAAEAAwABAAEAAQABAAIAAgAAAAEAAgACAAIAAQABAAIAAgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAIAAgAAAAAAAQABAAIAAQAAAAEAAQABAAEAAQAAAAEAAQABAAEAAAAAAAAAAAABAAEAAQABAAIAAQD//wEAAQAAAAAAAQAAAP//AQACAAAA//8BAP///v////////8BAP///v8AAP///v8AAP///v////7//v8AAP7//f///////v/+//////8AAP///v///////v/+////AAAAAP///v8AAAEAAQABAAMABAAEAAQAAwADAAQAAwADAAMAAwADAAMAAwADAAMAAwADAAQAAwADAAMAAwACAAIAAwACAAMAAwADAAIAAQABAAIAAgACAAEAAQAAAAEAAQABAAEAAQAAAAAAAQAAAAEAAQAAAAAAAAAAAAEAAQABAAEAAAAAAAEAAQABAAEAAQAAAAAAAQABAAEAAQAAAAEAAQAAAAEAAgACAAEAAAAAAAAAAAABAAEAAQABAAEAAQAAAAAAAAABAAEAAQABAAEAAAAAAAEAAQABAAAAAAABAAEAAQAAAAEAAQABAAEAAAABAAEAAQAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAAAAAABAAEAAQABAAAAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAAAAAEAAQABAAEAAAAAAAEAAQAAAAAAAQABAAEAAQAAAAEAAQABAAAAAQAAAAEAAQABAAEAAAAAAAEAAQABAAAAAAABAAAAAAABAAAAAQABAAEAAQAAAAEAAQABAAAAAQAAAAAAAQABAAAAAQABAAEAAQABAAEAAQABAAAAAQACAAAAAAABAAIAAQAAAAEAAQABAAEAAQABAAAAAAAAAAEAAQAAAAEAAQAAAAEAAgABAP//AAABAAEAAQABAAAAAAABAAEAAQABAAEAAQACAAEAAAABAAEAAAABAAIAAgABAAAAAAABAAIAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAEAAQABAAEAAAAAAAEAAQAAAAEAAQABAAAAAAABAAEAAQACAAEAAAABAAIAAAABAAIAAQAAAAEAAgABAAEAAQABAAIAAQABAAIAAQAAAAEAAQABAAIAAQAAAAIAAgAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAIAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEAAgABAAAAAQABAAAAAgACAAEAAQABAAEAAgABAAEAAQABAAAAAAABAAIAAgACAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAIAAQABAAEAAQABAAIAAQAAAAEAAgABAAAAAAABAAEAAQABAAEAAAAAAAEAAQABAAEAAQAAAAEAAQAAAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAEAAgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAAAAQABAAEAAQABAAEAAQABAAEAAAABAAEAAQAAAAEAAQABAAEAAQAAAAAAAQABAAEAAQAAAAEAAQAAAAEAAQAAAAAAAQABAAEAAQAAAAEAAQABAAAAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAQABAAAAAQABAAEAAAABAAEAAgABAAEAAQABAAAAAQABAAIAAgABAAEAAQABAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEAAQAAAAAAAAAAAAEAAQAAAAEAAQAAAAEAAQAAAAAAAAABAAEAAQAAAAAAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAEAAQABAAEAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAAAAAAAAQABAAEAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////v/+//7//v/+//7//f/9//3//P/8//z//P/9//z//P/7//v/+//7//z//P/8//z/+//6//v/+//8//z//P/8//3//P/8//z/+v/3//f/+f/8//z//P/9//v//P8=';\n\nexport const PCM_DATA = PCM_DATA1 + PCM_DATA2 + PCM_DATA3 + PCM_DATA4;\n\nexport const labelWidth = 80;\n\nexport const PLAYBACK_SPEED_CONFIG = {\n  min: 0.5,\n  max: 2.0,\n  step: 0.25,\n  default: 1,\n} as const;\n\nexport const SAMPLE_RATE = 44100;\n"
  },
  {
    "path": "apps/common-app/src/examples/PlaybackSpeed/helpers.ts",
    "content": "import { TimeStretchingAlgorithm, AudioSettings } from './types';\n\nexport const getAudioSettings = (\n  algorithm: TimeStretchingAlgorithm\n): AudioSettings => {\n  switch (algorithm) {\n    case 'linear':\n      return { pitchCorrection: false, PSOLA: false };\n    case 'pitchCorrection':\n      return { pitchCorrection: true, PSOLA: false };\n    case 'PSOLA':\n      return { pitchCorrection: false, PSOLA: true };\n  }\n};\n"
  },
  {
    "path": "apps/common-app/src/examples/PlaybackSpeed/index.ts",
    "content": "export { default } from './PlaybackSpeed';\n"
  },
  {
    "path": "apps/common-app/src/examples/PlaybackSpeed/types.ts",
    "content": "export type TimeStretchingAlgorithm = 'linear' | 'pitchCorrection' | 'PSOLA';\n\nexport interface AudioSettings {\n  pitchCorrection: boolean;\n  PSOLA: boolean;\n}\n\nexport const TIME_STRETCHING_OPTIONS: TimeStretchingAlgorithm[] = [\n  'linear',\n  'pitchCorrection',\n  'PSOLA',\n] as const;\n"
  },
  {
    "path": "apps/common-app/src/examples/Record/Record.tsx",
    "content": "import React, { FC, useCallback, useEffect, useState, useRef } from 'react';\nimport { Alert, Text, View } from 'react-native';\nimport {\n  AudioBuffer,\n  AudioManager,\n  useAudioInput,\n  AudioBufferSourceNode,\n} from 'react-native-audio-api';\n\nimport { Button, Container, Select } from '../../components';\nimport { colors } from '../../styles';\n\nimport { audioContext, audioRecorder } from '../../singletons';\n\nenum Status {\n  Idle = 'Idle',\n  LiveEcho = 'LiveEcho',\n  Recording = 'Recording',\n  Playback = 'Playback',\n}\n\nconst Record: FC = () => {\n  const { availableInputs, currentInput, onSelectInput } = useAudioInput();\n\n  const [status, setStatus] = useState<Status>(Status.Idle);\n  const [capturedBuffers, setCapturedBuffers] = useState<AudioBuffer[]>([]);\n  const sourceNodesRef = useRef<AudioBufferSourceNode[]>([]);\n\n  const verifyPermissions = async () => {\n    const recPerm = await AudioManager.requestRecordingPermissions();\n    const notPerm = await AudioManager.requestNotificationPermissions();\n\n    return recPerm === 'Granted' && notPerm === 'Granted';\n  };\n\n  const startEcho = async () => {\n    const hasPermission = await verifyPermissions();\n    if (!hasPermission) {\n      Alert.alert(\n        'Insufficient permissions!',\n        'You need to grant audio recording permissions to use this feature.'\n      );\n      return;\n    }\n\n    AudioManager.setAudioSessionOptions({\n      iosCategory: 'playAndRecord',\n      iosMode: 'voiceChat',\n      iosOptions: ['allowBluetoothHFP'],\n    });\n\n    const success = await AudioManager.setAudioSessionActivity(true);\n\n    if (!success) {\n      Alert.alert(\n        'Audio Session Error',\n        'Failed to activate audio session for recording.'\n      );\n      return;\n    }\n\n    if (audioContext.state === 'suspended') {\n      await audioContext.resume();\n    }\n\n    if (audioContext.state !== 'running') {\n      Alert.alert(\n        'Audio Context Error',\n        `Audio context is not running. Current state: ${audioContext.state}`\n      );\n      return;\n    }\n\n    const adapter = audioContext.createRecorderAdapter();\n    adapter.connect(audioContext.destination);\n    audioRecorder.connect(adapter);\n\n    const result = audioRecorder.start();\n\n    if (result.status === 'error') {\n      Alert.alert(\n        'Recording Error',\n        `Failed to start recording: ${result.message}`\n      );\n      return;\n    }\n\n    setStatus(Status.LiveEcho);\n  };\n\n  /// This stops only the recording, not the audio context\n  const stopEcho = async () => {\n    audioRecorder.stop();\n    audioContext.suspend();\n\n    audioRecorder.disconnect();\n    setStatus(Status.Idle);\n    await AudioManager.setAudioSessionActivity(false);\n  };\n\n  const startRecordForReplay = async () => {\n    const hasPermission = await verifyPermissions();\n\n    if (!hasPermission) {\n      Alert.alert(\n        'Insufficient permissions!',\n        'You need to grant audio recording permissions to use this feature.'\n      );\n      return;\n    }\n\n    AudioManager.setAudioSessionOptions({\n      iosCategory: 'playAndRecord',\n      iosMode: 'default',\n      iosOptions: ['allowBluetoothA2DP', 'allowBluetoothHFP'],\n    });\n\n    const success = await AudioManager.setAudioSessionActivity(true);\n\n    if (!success) {\n      Alert.alert(\n        'Audio Session Error',\n        'Failed to activate audio session for recording.'\n      );\n      return;\n    }\n\n    setCapturedBuffers([]);\n\n    const callbackResult = audioRecorder.onAudioReady(\n      {\n        sampleRate: audioContext.sampleRate,\n        channelCount: 1,\n        bufferLength: 4096,\n      },\n      (event) => {\n        const { buffer, numFrames } = event;\n\n        console.log('Audio recorder buffer ready:', buffer.duration, numFrames);\n        setCapturedBuffers((prevBuffers) => [...prevBuffers, buffer]);\n      }\n    );\n\n    if (callbackResult.status === 'error') {\n      Alert.alert(\n        'Recorder Error',\n        `Failed to set audio ready callback: ${callbackResult.message}`\n      );\n      return;\n    }\n\n    const result = audioRecorder.start();\n\n    if (result.status === 'error') {\n      Alert.alert(\n        'Recording Error',\n        `Failed to start recording: ${result.message}`\n      );\n      return;\n    }\n\n    setStatus(Status.Recording);\n\n    setTimeout(async () => {\n      audioRecorder.stop();\n      audioRecorder.clearOnAudioReady();\n      await AudioManager.setAudioSessionActivity(false);\n      setStatus(Status.Idle);\n    }, 5000);\n  };\n\n  const onStartReplay = async () => {\n    AudioManager.setAudioSessionOptions({\n      iosCategory: 'playback',\n      iosMode: 'default',\n      iosOptions: [],\n    });\n\n    const success = await AudioManager.setAudioSessionActivity(true);\n\n    if (!success) {\n      Alert.alert(\n        'Audio Session Error',\n        'Failed to activate audio session for playback.'\n      );\n      return;\n    }\n\n    if (audioContext.state === 'suspended') {\n      await audioContext.resume();\n    }\n\n    const tNow = audioContext.currentTime;\n    let nextStartAt = tNow + 1;\n\n    capturedBuffers.forEach((buffer) => {\n      const source = audioContext.createBufferSource();\n      source.buffer = buffer;\n      source.connect(audioContext.destination);\n      source.start(nextStartAt);\n      nextStartAt += buffer.duration;\n      sourceNodesRef.current.push(source);\n    });\n\n    setStatus(Status.Playback);\n\n    setTimeout(\n      async () => {\n        await audioContext.suspend();\n        await AudioManager.setAudioSessionActivity(false);\n        setStatus(Status.Idle);\n      },\n      (nextStartAt - tNow) * 1000\n    );\n  };\n\n  const onSelect = useCallback(\n    (id: string) => {\n      const input = availableInputs.find((d) => d.id === id);\n\n      if (input) {\n        onSelectInput(input);\n      }\n    },\n    [availableInputs, onSelectInput]\n  );\n\n  useEffect(() => {\n    return () => {\n      audioRecorder.stop();\n      sourceNodesRef.current.forEach((source) => {\n        source.disconnect();\n      });\n      sourceNodesRef.current = [];\n    };\n  }, []);\n\n  return (\n    <Container style={{ gap: 40 }}>\n      <View style={{ alignItems: 'center' }}>\n        <Text style={{ color: colors.white, fontSize: 20 }}>\n          Status: {status}\n        </Text>\n      </View>\n      <View>\n        <Select\n          value={currentInput?.id || ''}\n          onChange={onSelect}\n          options={availableInputs.map((d) => d.id) || []}\n        />\n      </View>\n      <View style={{ alignItems: 'center', gap: 10 }}>\n        <Text style={{ color: colors.white, fontSize: 16 }}>Echo</Text>\n        <Button title=\"Start Recording\" onPress={startEcho} />\n        <Button title=\"Stop Recording\" onPress={stopEcho} />\n      </View>\n      <View style={{ alignItems: 'center', gap: 10, paddingTop: 40 }}>\n        <Text style={{ color: colors.white, fontSize: 16 }}>\n          Record & replay\n        </Text>\n        <Button title=\"Record for Replay\" onPress={startRecordForReplay} />\n        <Button title=\"Replay\" onPress={onStartReplay} />\n      </View>\n    </Container>\n  );\n};\n\nexport default Record;\n"
  },
  {
    "path": "apps/common-app/src/examples/Streaming/Streaming.tsx",
    "content": "import React, { FC, useEffect, useRef } from 'react';\nimport { AudioContext, GainNode, StreamerNode } from 'react-native-audio-api';\n\nimport { View } from 'react-native';\nimport { Button, Container } from '../../components';\n\nconst SAMPLE_RATE = 44100;\n\nconst Streaming: FC = () => {\n  const streamerRef = useRef<StreamerNode | null>(null);\n  const aCtxRef = useRef<AudioContext | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n\n  useEffect(() => {\n    const actx = new AudioContext({ sampleRate: SAMPLE_RATE });\n    aCtxRef.current = actx;\n    gainRef.current = actx.createGain();\n    return () => {\n      aCtxRef.current?.close();\n      streamerRef.current?.stop();\n    };\n  }, []);\n\n  const startStreaming = () => {\n    if (!aCtxRef.current || !gainRef.current) {\n      console.error('AudioContext or gain or streamer is not initialized');\n      return;\n    }\n    if (streamerRef.current) {\n      console.error('StreamerNode is already initialized');\n      return;\n    }\n    streamerRef.current = aCtxRef.current.createStreamer('https://liveradio.timesa.pl/2980-1.aac/playlist.m3u8');\n\n    streamerRef.current.connect(gainRef.current);\n    gainRef.current.connect(aCtxRef.current.destination);\n    streamerRef.current.start(aCtxRef.current.currentTime);\n  };\n\n  const stopStreaming = () => {\n    if (streamerRef.current) {\n      streamerRef.current.stop(aCtxRef.current!.currentTime);\n      streamerRef.current = null;\n    } else {\n      console.error('StreamerNode is not initialized');\n    }\n  };\n\n  return (\n    <Container style={{ gap: 40 }}>\n      <View style={{ alignItems: 'center', justifyContent: 'center', gap: 5 }}>\n        <Button title=\"Start streaming\" onPress={startStreaming} />\n        <Button title=\"Stop streaming\" onPress={stopStreaming} />\n        <Button\n          title=\"Volume to 0.5\"\n          onPress={() => {\n            if (gainRef.current) {\n              gainRef.current.gain.value = 0.5;\n            }\n          }}\n        />\n        <Button\n          title=\"Volume to 2.0\"\n          onPress={() => {\n            if (gainRef.current) {\n              gainRef.current.gain.value = 2.0;\n            }\n          }}\n        />\n      </View>\n    </Container>\n  );\n};\n\nexport default Streaming;\n"
  },
  {
    "path": "apps/common-app/src/examples/Worklets/Worklets.tsx",
    "content": "import { useEffect, useRef, useState } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\nimport {\n  AudioContext,\n  AudioManager,\n  WorkletNode,\n  WorkletProcessingNode,\n  WorkletSourceNode,\n} from 'react-native-audio-api';\nimport Animated, {\n  Extrapolation,\n  interpolate,\n  useAnimatedStyle,\n  useSharedValue,\n  withSpring,\n} from 'react-native-reanimated';\nimport { Button, Container } from '../../components';\nimport { colors } from '../../styles';\n\nfunction Worklets() {\n  const SAMPLE_RATE = 44100;\n  const aCtxRef = useRef<AudioContext | null>(null);\n  const workletNodeRef = useRef<WorkletNode | null>(null);\n  const workletProcessingNodeRef = useRef<WorkletProcessingNode | null>(null);\n  const workletSourceNodeRef = useRef<WorkletSourceNode | null>(null);\n  const [isPlaying, setIsPlaying] = useState(false);\n\n  const bar0 = useSharedValue(0);\n  const bar1 = useSharedValue(0);\n  const bar2 = useSharedValue(0); // center bar\n  const bar3 = useSharedValue(0);\n  const bar4 = useSharedValue(0);\n\n  useEffect(() => {\n    if (!aCtxRef.current) {\n      aCtxRef.current = new AudioContext({ sampleRate: SAMPLE_RATE });\n    }\n\n    AudioManager.setAudioSessionOptions({\n      iosCategory: 'playAndRecord',\n      iosMode: 'spokenAudio',\n      iosOptions: ['defaultToSpeaker', 'allowBluetoothA2DP'],\n    });\n\n    return () => {\n      aCtxRef.current?.close();\n    };\n  }, []);\n\n  const start = () => {\n    setIsPlaying(true);\n    const processingWorklet = (\n      inputAudioData: Array<Float32Array>,\n      outputAudioData: Array<Float32Array>,\n      framesToProcess: number,\n      _currentTime: number\n    ) => {\n      'worklet';\n      const gain = 0.5;\n      for (let channel = 0; channel < inputAudioData.length; channel++) {\n        const inputChannelData = inputAudioData[channel];\n        const outputChannelData = outputAudioData[channel];\n        for (let i = 0; i < framesToProcess; i++) {\n          outputChannelData[i] = inputChannelData[i] * gain;\n        }\n      }\n    };\n\n    const sourceWorklet = (\n      audioData: Array<Float32Array>,\n      framesToProcess: number,\n      currentTime: number,\n      _startOffset: number\n    ) => {\n      'worklet';\n      const frequency = 440; // A4 note\n      const baseAmplitude = 0.2;\n\n      const modulationFreq = 2; // 2 Hz modulation\n      const modulationDepth = 0.8;\n      const amplitudeModulation = Math.sin(\n        2 * Math.PI * modulationFreq * currentTime\n      );\n      const dynamicAmplitude =\n        baseAmplitude * (1 + modulationDepth * amplitudeModulation);\n\n      for (let channel = 0; channel < audioData.length; channel++) {\n        for (let sample = 0; sample < framesToProcess; sample++) {\n          // Calculate phase based on sample position and time\n          const phase =\n            2 * Math.PI * frequency * (currentTime + sample / SAMPLE_RATE);\n          audioData[channel][sample] = dynamicAmplitude * Math.sin(phase);\n        }\n      }\n    };\n    const worklet = (\n      audioData: Array<Float32Array>,\n      _inputChannelCount: number\n    ) => {\n      'worklet';\n\n      // Calculates RMS amplitude\n      let sum = 0;\n      for (let i = 0; i < audioData[0].length; i++) {\n        sum += audioData[0][i] * audioData[0][i];\n      }\n      const rms = Math.sqrt(sum / audioData[0].length);\n\n      // Increased scaling for better visualization\n      const scaledAmplitude = Math.min(rms * 25, 1);\n\n      // console.log(`RMS: ${rms}, Scaled: ${scaledAmplitude}`);\n\n      bar0.value = withSpring(bar1.value, { damping: 15, stiffness: 200 });\n      bar1.value = withSpring(bar2.value, { damping: 15, stiffness: 200 });\n      bar3.value = withSpring(bar2.value, { damping: 15, stiffness: 200 });\n      bar4.value = withSpring(bar3.value, { damping: 15, stiffness: 200 });\n      bar2.value = withSpring(scaledAmplitude, { damping: 15, stiffness: 200 });\n    };\n\n    if (!aCtxRef.current) {\n      aCtxRef.current = new AudioContext({ sampleRate: SAMPLE_RATE });\n    }\n\n    workletSourceNodeRef.current = aCtxRef.current.createWorkletSourceNode(\n      sourceWorklet,\n      'AudioRuntime'\n    );\n    workletNodeRef.current = aCtxRef.current.createWorkletNode(\n      worklet,\n      256,\n      1,\n      'UIRuntime'\n    );\n    workletProcessingNodeRef.current =\n      aCtxRef.current.createWorkletProcessingNode(\n        processingWorklet,\n        'AudioRuntime'\n      );\n\n    // Connect nodes\n    workletSourceNodeRef.current.connect(workletProcessingNodeRef.current);\n    workletProcessingNodeRef.current.connect(workletNodeRef.current);\n    workletSourceNodeRef.current.connect(workletNodeRef.current);\n    workletNodeRef.current.connect(aCtxRef.current.destination);\n\n    workletSourceNodeRef.current.start();\n    if (aCtxRef.current.state === 'suspended') {\n      aCtxRef.current.resume();\n    }\n  };\n\n  const stop = () => {\n    console.log('Recording stopped');\n    workletSourceNodeRef.current?.stop();\n    bar0.value = withSpring(0, { damping: 20, stiffness: 100 });\n    bar1.value = withSpring(0, { damping: 20, stiffness: 100 });\n    bar2.value = withSpring(0, { damping: 20, stiffness: 100 });\n    bar3.value = withSpring(0, { damping: 20, stiffness: 100 });\n    bar4.value = withSpring(0, { damping: 20, stiffness: 100 });\n    setIsPlaying(false);\n  };\n\n  const createBarStyle = (index: number) => {\n    return useAnimatedStyle(() => {\n      let amplitude = 0;\n\n      switch (index) {\n        case 0:\n          amplitude = bar0.value;\n          break;\n        case 1:\n          amplitude = bar1.value;\n          break;\n        case 2:\n          amplitude = bar2.value;\n          break;\n        case 3:\n          amplitude = bar3.value;\n          break;\n        case 4:\n          amplitude = bar4.value;\n          break;\n      }\n\n      const centerIndex = 2;\n      const distanceFromCenter = Math.abs(index - centerIndex);\n\n      const height = interpolate(\n        amplitude,\n        [0, 1],\n        [10, 200],\n        Extrapolation.CLAMP\n      );\n\n      // Interpolate red component: 0 (quiet) -> 255 (loud)\n      const red = interpolate(amplitude, [0, 1], [0, 255], Extrapolation.CLAMP);\n\n      // Interpolate green component: 255 (quiet) -> 0 (loud)\n      const green = interpolate(\n        amplitude,\n        [0, 1],\n        [255, 0],\n        Extrapolation.CLAMP\n      );\n\n      const opacity = 1 - distanceFromCenter * 0.15;\n\n      return {\n        height,\n        backgroundColor: `rgba(${Math.floor(red)}, ${Math.floor(green)}, 0, ${opacity})`,\n      };\n    });\n  };\n\n  return (\n    <Container>\n      <Text style={{ ...styles.title, color: colors.white }}>\n        Audio Worklets Visualizer\n      </Text>\n      <Text style={{ ...styles.subtitle, color: colors.white }}>\n        Listen to the generated sine wave with dynamic animation\n      </Text>\n\n      <View style={{ ...styles.visualizer, backgroundColor: colors.white }}>\n        <View style={styles.barsContainer}>\n          {Array.from({ length: 5 }, (_, index) => (\n            <Animated.View\n              key={index}\n              style={[styles.bar, createBarStyle(index)]}\n            />\n          ))}\n        </View>\n      </View>\n\n      <View style={styles.buttonsContainer}>\n        <Button onPress={start} title=\"Start Playing\" disabled={isPlaying} />\n        <Button onPress={stop} title=\"Stop Playing\" disabled={!isPlaying} />\n      </View>\n    </Container>\n  );\n}\n\nconst styles = StyleSheet.create({\n  title: {\n    fontSize: 20,\n    fontWeight: 'bold',\n    marginBottom: 10,\n    textAlign: 'center',\n  },\n  subtitle: {\n    fontSize: 14,\n    marginBottom: 30,\n    textAlign: 'center',\n  },\n  visualizer: {\n    height: 250,\n    justifyContent: 'flex-end',\n    alignItems: 'center',\n    marginVertical: 30,\n    borderRadius: 10,\n    padding: 20,\n  },\n  barsContainer: {\n    flexDirection: 'row',\n    alignItems: 'flex-end',\n    justifyContent: 'center',\n    gap: 8,\n  },\n  bar: {\n    borderRadius: 20,\n    minHeight: 10,\n    width: 40,\n  },\n  buttonsContainer: {\n    flexDirection: 'row',\n    justifyContent: 'center',\n    gap: 20,\n  },\n});\n\nexport default Worklets;\n"
  },
  {
    "path": "apps/common-app/src/examples/index.ts",
    "content": "import { StackNavigationProp } from '@react-navigation/stack';\nimport { icons } from 'lucide-react-native';\n\nimport AudioFile from './AudioFile';\nimport AudioPipelineStress from './AudioPipelineStress';\nimport AudioVisualizer from './AudioVisualizer';\nimport DrumMachine from './DrumMachine';\nimport Metronome from './Metronome';\nimport OfflineRendering from './OfflineRendering';\nimport Oscillator from './Oscillator';\nimport Piano from './Piano';\nimport PlaybackSpeed from './PlaybackSpeed/PlaybackSpeed';\nimport Record from './Record/Record';\nimport Streaming from './Streaming/Streaming';\nimport Worklets from './Worklets/Worklets';\nimport AudioStream from './AudioTag/AudioTag';\nimport ConvolverIR from './ConvolverIR';\nimport AudioParamPipeline from './AudioParamPipeline';\n\ntype NavigationParamList = {\n  Oscillator: undefined;\n  Metronome: undefined;\n  DrumMachine: undefined;\n  Piano: undefined;\n  TextToSpeech: undefined;\n  AudioFile: undefined;\n  AudioPipelineStress: undefined;\n  PlaybackSpeed: undefined;\n  AudioVisualizer: undefined;\n  OfflineRendering: undefined;\n  Record: undefined;\n  Worklets: undefined;\n  Streamer: undefined;\n  AudioTag: undefined;\n  ConvolverIR: undefined;\n  TestScreen: undefined;\n  AudioParamPipeline: undefined;\n};\n\nexport type ExampleKey = keyof NavigationParamList;\n\ninterface SimplifiedIconProps {\n  color?: string;\n  size?: number;\n}\n\nexport type MainStackProps = StackNavigationProp<NavigationParamList>;\nexport interface Example {\n  key: ExampleKey;\n  title: string;\n  Icon: React.FC<SimplifiedIconProps>;\n  screen: React.FC;\n}\n\nexport const Examples: Example[] = [\n  {\n    key: 'DrumMachine',\n    title: 'Drum Machine',\n    Icon: icons.Drum,\n    screen: DrumMachine,\n  },\n  {\n    key: 'Piano',\n    Icon: icons.Piano,\n    title: 'Simple Piano',\n    screen: Piano,\n  },\n  {\n    key: 'AudioFile',\n    title: 'Audio File',\n    Icon: icons.Music,\n    screen: AudioFile,\n  },\n  {\n    key: 'AudioPipelineStress',\n    title: 'Audio Pipeline Stress',\n    Icon: icons.Activity,\n    screen: AudioPipelineStress,\n  },\n  {\n    key: 'PlaybackSpeed',\n    Icon: icons.VenetianMask,\n    title: 'Playback Speed',\n    screen: PlaybackSpeed,\n  },\n  {\n    key: 'Metronome',\n    title: 'Metronome',\n    Icon: icons.Thermometer,\n    screen: Metronome,\n  },\n  {\n    key: 'Oscillator',\n    title: 'Oscillator',\n    Icon: icons.Waves,\n    screen: Oscillator,\n  },\n  {\n    key: 'AudioVisualizer',\n    title: 'Audio Visualizer',\n    Icon: icons.Activity,\n    screen: AudioVisualizer,\n  },\n  {\n    key: 'OfflineRendering',\n    title: 'Offline Rendering',\n    Icon: icons.HardDrive,\n    screen: OfflineRendering,\n  },\n  {\n    key: 'Record',\n    title: 'Record',\n    Icon: icons.Mic,\n    screen: Record,\n  },\n  {\n    key: 'Worklets',\n    title: 'Worklets',\n    Icon: icons.Code,\n    screen: Worklets,\n  },\n  {\n    key: 'Streamer',\n    title: 'Streamer',\n    Icon: icons.Radio,\n    screen: Streaming,\n  },\n  {\n    key: 'AudioTag',\n    title: 'Audio Tag',\n    Icon: icons.Tag,\n    screen: AudioStream,\n  },\n  {\n    key: 'ConvolverIR',\n    title: 'Reverb Effect',\n    Icon: icons.AudioWaveform,\n    screen: ConvolverIR,\n  },\n  {\n    key: 'AudioParamPipeline',\n    title: 'Audio Param',\n    Icon: icons.SquareStack,\n    screen: AudioParamPipeline,\n  },\n] as const;\n"
  },
  {
    "path": "apps/common-app/src/singletons/index.ts",
    "content": "import { AudioContext, AudioRecorder } from 'react-native-audio-api';\n\nexport const audioContext = new AudioContext();\nexport const audioRecorder = new AudioRecorder();\n"
  },
  {
    "path": "apps/common-app/src/styles.ts",
    "content": "import { Dimensions } from 'react-native';\n\nconst { width } = Dimensions.get('screen');\n\nexport const layout = {\n  spacing: 8,\n  radius: 4,\n  knobSize: 24,\n  indicatorSize: 48,\n  screenWidth: width,\n} as const;\n\nexport const colors = {\n  white: '#ffffff',\n  main: '#38ACDD',\n  black: '#000000',\n  gray: '#d7d7d7',\n  yellow: '#FFD61E',\n\n  background: '#232736',\n  backgroundDark: '#1f2020',\n  backgroundLight: '#32384d',\n\n  separator: '#333333',\n  modalBackdrop: '#00000040',\n  border: '#999999',\n} as const;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/ControlBar.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, View } from 'react-native';\n\nimport { Button } from '../components';\nimport { layout } from '../styles';\nimport type { ControlAction } from './types';\n\ninterface ControlBarProps {\n  actions: ControlAction[];\n}\n\nconst ControlBar: FC<ControlBarProps> = ({ actions }) => (\n  <View style={styles.controls}>\n    {actions.map((action, index) => (\n      <Button\n        key={`${action.title}-${index}`}\n        title={action.title}\n        onPress={action.onPress}\n        disabled={action.disabled}\n        width={action.width}\n      />\n    ))}\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  controls: {\n    flexDirection: 'row',\n    gap: layout.spacing,\n    paddingHorizontal: 12,\n    paddingBottom: 12,\n  },\n});\n\nexport default ControlBar;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/CurrentStepCard.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors, layout } from '../styles';\n\ninterface CurrentStepCardProps {\n  message: string;\n  label?: string;\n}\n\nconst CurrentStepCard: FC<CurrentStepCardProps> = ({\n  message,\n  label = 'Current step',\n}) => (\n  <View style={styles.currentStepCard}>\n    <Text style={styles.currentStepLabel}>{label}</Text>\n    <Text style={styles.currentStepText}>{message}</Text>\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  currentStepCard: {\n    backgroundColor: colors.backgroundLight,\n    borderRadius: layout.radius,\n    gap: 8,\n    marginHorizontal: 12,\n    marginBottom: 12,\n    marginTop: 12,\n    padding: 8,\n  },\n  currentStepLabel: {\n    color: colors.gray,\n    fontSize: 12,\n    textTransform: 'uppercase',\n  },\n  currentStepText: {\n    color: colors.white,\n    fontSize: 14,\n    lineHeight: 20,\n  },\n});\n\nexport default CurrentStepCard;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/EmptyState.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors, layout } from '../styles';\n\ninterface EmptyStateProps {\n  message: string;\n}\n\nconst EmptyState: FC<EmptyStateProps> = ({ message }) => (\n  <View style={styles.emptyCard}>\n    <Text style={styles.emptyText}>{message}</Text>\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  emptyCard: {\n    backgroundColor: colors.backgroundLight,\n    borderRadius: layout.radius,\n    padding: 12,\n  },\n  emptyText: {\n    color: colors.gray,\n  },\n});\n\nexport default EmptyState;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/Header.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors } from '../styles';\n\ninterface HeaderProps {\n  title: string;\n  subtitle?: string;\n}\n\nconst Header: FC<HeaderProps> = ({ title, subtitle }) => (\n  <View style={styles.header}>\n    <Text style={styles.title}>{title}</Text>\n    {subtitle ? <Text style={styles.subtitle}>{subtitle}</Text> : null}\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  header: {\n    gap: 6,\n    padding: 12,\n  },\n  title: {\n    color: colors.white,\n    fontSize: 24,\n    fontWeight: '700',\n  },\n  subtitle: {\n    color: colors.gray,\n    fontSize: 14,\n    lineHeight: 16,\n  },\n});\n\nexport default Header;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/LiveLog.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors, layout } from '../styles';\nimport EmptyState from './EmptyState';\nimport SectionTitle from './SectionTitle';\n\ninterface LiveLogProps {\n  entries: string[];\n  emptyMessage: string;\n  title?: string;\n}\n\nconst LiveLog: FC<LiveLogProps> = ({\n  entries,\n  emptyMessage,\n  title = 'Live Log',\n}) => (\n  <View style={styles.sectionContent}>\n    <SectionTitle title={title} />\n    {entries.length === 0 ? (\n      <EmptyState message={emptyMessage} />\n    ) : (\n      <View style={styles.logCard}>\n        {entries.map((entry, index) => (\n          <Text key={`${entry}-${index}`} style={styles.logLine}>\n            {entry}\n          </Text>\n        ))}\n      </View>\n    )}\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  sectionContent: {\n    gap: 12,\n  },\n  logCard: {\n    backgroundColor: colors.backgroundLight,\n    borderRadius: layout.radius,\n    gap: 8,\n    padding: 16,\n  },\n  logLine: {\n    color: colors.gray,\n    fontSize: 12,\n    lineHeight: 18,\n  },\n});\n\nexport default LiveLog;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/ScenarioCard.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors, layout } from '../styles';\nimport StatusPill from './StatusPill';\nimport StepRow from './StepRow';\nimport type { ScenarioItem } from './types';\n\ninterface ScenarioCardProps {\n  scenario: ScenarioItem;\n}\n\nconst ScenarioCard: FC<ScenarioCardProps> = ({ scenario }) => (\n  <View style={styles.scenarioCard}>\n    <View style={styles.scenarioHeader}>\n      <Text style={styles.scenarioTitle}>{scenario.title}</Text>\n      <StatusPill status={scenario.status} />\n    </View>\n    <Text style={styles.scenarioMeta}>{scenario.durationLabel}</Text>\n    {scenario.steps.map((step) => (\n      <StepRow key={step.id} step={step} />\n    ))}\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  scenarioCard: {\n    backgroundColor: colors.backgroundLight,\n    borderRadius: layout.radius,\n    gap: 10,\n    padding: 12,\n  },\n  scenarioHeader: {\n    alignItems: 'center',\n    flexDirection: 'row',\n    justifyContent: 'space-between',\n  },\n  scenarioTitle: {\n    color: colors.white,\n    flex: 1,\n    fontSize: 16,\n    fontWeight: '700',\n    paddingRight: 12,\n  },\n  scenarioMeta: {\n    color: colors.gray,\n    fontSize: 12,\n  },\n});\n\nexport default ScenarioCard;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/ScenarioResults.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, View } from 'react-native';\n\nimport EmptyState from './EmptyState';\nimport ScenarioCard from './ScenarioCard';\nimport SectionTitle from './SectionTitle';\nimport type { ScenarioItem } from './types';\n\ninterface ScenarioResultsProps {\n  scenarios: ScenarioItem[];\n  emptyMessage: string;\n  title?: string;\n}\n\nconst ScenarioResults: FC<ScenarioResultsProps> = ({\n  scenarios,\n  emptyMessage,\n  title = 'Scenario Results',\n}) => (\n  <View style={styles.sectionContent}>\n    <SectionTitle title={title} />\n    {scenarios.length === 0 ? (\n      <EmptyState message={emptyMessage} />\n    ) : (\n      scenarios.map((scenario) => (\n        <ScenarioCard key={scenario.id} scenario={scenario} />\n      ))\n    )}\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  sectionContent: {\n    gap: 12,\n  },\n});\n\nexport default ScenarioResults;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/SectionTitle.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, Text } from 'react-native';\n\nimport { colors } from '../styles';\n\ninterface SectionTitleProps {\n  title: string;\n}\n\nconst SectionTitle: FC<SectionTitleProps> = ({ title }) => (\n  <Text style={styles.sectionTitle}>{title}</Text>\n);\n\nconst styles = StyleSheet.create({\n  sectionTitle: {\n    color: colors.white,\n    fontSize: 18,\n    fontWeight: '700',\n  },\n});\n\nexport default SectionTitle;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/StatusPill.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors } from '../styles';\nimport { statusPillBackgroundColors } from './statusStyles';\nimport type { ScenarioStatus } from './types';\n\ninterface StatusPillProps {\n  status: ScenarioStatus;\n}\n\nconst StatusPill: FC<StatusPillProps> = ({ status }) => (\n  <View\n    style={[\n      styles.statusPill,\n      { backgroundColor: statusPillBackgroundColors[status] },\n    ]}\n  >\n    <Text style={styles.statusText}>{status.toUpperCase()}</Text>\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  statusPill: {\n    borderRadius: 999,\n    paddingHorizontal: 10,\n    paddingVertical: 5,\n  },\n  statusText: {\n    color: colors.white,\n    fontSize: 11,\n    fontWeight: '700',\n  },\n});\n\nexport default StatusPill;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/StepRow.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors } from '../styles';\nimport { statusTextColors } from './statusStyles';\nimport type { StepItem } from './types';\n\ninterface StepRowProps {\n  step: StepItem;\n}\n\nconst StepRow: FC<StepRowProps> = ({ step }) => (\n  <View style={styles.stepRow}>\n    <View style={styles.stepRowHeader}>\n      <Text\n        style={[styles.stepStatus, { color: statusTextColors[step.status] }]}\n      >\n        {step.status.toUpperCase()}\n      </Text>\n      <Text style={styles.stepMessage}>{step.message}</Text>\n    </View>\n    {step.details ? (\n      <Text style={styles.stepDetails}>{step.details}</Text>\n    ) : null}\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  stepRow: {\n    gap: 6,\n  },\n  stepRowHeader: {\n    alignItems: 'center',\n    flexDirection: 'row',\n    gap: 12,\n  },\n  stepStatus: {\n    fontSize: 11,\n    fontWeight: '700',\n    minWidth: 44,\n  },\n  stepMessage: {\n    color: colors.white,\n    flex: 1,\n    fontSize: 13,\n  },\n  stepDetails: {\n    color: colors.gray,\n    fontSize: 12,\n    lineHeight: 17,\n    paddingLeft: 56,\n  },\n});\n\nexport default StepRow;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/Summary.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, View } from 'react-native';\n\nimport { layout } from '../styles';\nimport type { SummaryItem } from './types';\nimport SummaryBadge from './SummaryBadge';\n\ninterface SummaryProps {\n  items: SummaryItem[];\n}\n\nconst Summary: FC<SummaryProps> = ({ items }) => (\n  <View style={styles.summaryRow}>\n    {items.map((item, index) => (\n      <SummaryBadge\n        key={`${item.label}-${item.value}-${index}`}\n        label={item.label}\n        value={item.value}\n      />\n    ))}\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  summaryRow: {\n    flexDirection: 'row',\n    gap: layout.spacing,\n    paddingHorizontal: 12,\n  },\n});\n\nexport default Summary;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/SummaryBadge.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, Text, View } from 'react-native';\n\nimport { colors, layout } from '../styles';\n\ninterface SummaryBadgeProps {\n  label: string;\n  value: string;\n}\n\nconst SummaryBadge: FC<SummaryBadgeProps> = ({ label, value }) => (\n  <View style={styles.summaryBadge}>\n    <Text style={styles.summaryLabel}>{label}</Text>\n    <Text style={styles.summaryValue}>{value}</Text>\n  </View>\n);\n\nconst styles = StyleSheet.create({\n  summaryBadge: {\n    backgroundColor: colors.backgroundLight,\n    borderRadius: layout.radius,\n    flex: 1,\n    gap: 2,\n    padding: 8,\n  },\n  summaryLabel: {\n    color: colors.gray,\n    fontSize: 10,\n    textTransform: 'uppercase',\n  },\n  summaryValue: {\n    color: colors.white,\n    fontSize: 14,\n    fontWeight: '700',\n  },\n});\n\nexport default SummaryBadge;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/UnsupportedNotice.tsx",
    "content": "import React, { FC } from 'react';\nimport { StyleSheet, Text } from 'react-native';\n\nimport { Spacer } from '../components';\nimport { colors } from '../styles';\n\ninterface UnsupportedNoticeProps {\n  title: string;\n  message: string;\n}\n\nconst UnsupportedNotice: FC<UnsupportedNoticeProps> = ({ title, message }) => (\n  <>\n    <Text style={styles.unsupportedTitle}>{title}</Text>\n    <Spacer.Vertical size={12} />\n    <Text style={styles.unsupportedText}>{message}</Text>\n  </>\n);\n\nconst styles = StyleSheet.create({\n  unsupportedTitle: {\n    color: colors.white,\n    fontSize: 24,\n    fontWeight: '700',\n  },\n  unsupportedText: {\n    color: colors.gray,\n    fontSize: 14,\n    lineHeight: 16,\n    maxWidth: 280,\n    textAlign: 'center',\n  },\n});\n\nexport default UnsupportedNotice;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/index.ts",
    "content": "import ControlBar from './ControlBar';\nimport CurrentStepCard from './CurrentStepCard';\nimport EmptyState from './EmptyState';\nimport Header from './Header';\nimport LiveLog from './LiveLog';\nimport ScenarioCard from './ScenarioCard';\nimport ScenarioResults from './ScenarioResults';\nimport SectionTitle from './SectionTitle';\nimport StatusPill from './StatusPill';\nimport StepRow from './StepRow';\nimport Summary from './Summary';\nimport SummaryBadge from './SummaryBadge';\nimport UnsupportedNotice from './UnsupportedNotice';\n\nexport type {\n  ControlAction,\n  ScenarioItem,\n  ScenarioStatus,\n  StepItem,\n  SummaryItem,\n  TestStatus,\n} from './types';\n\nexport {\n  ControlBar,\n  CurrentStepCard,\n  EmptyState,\n  Header,\n  LiveLog,\n  ScenarioCard,\n  ScenarioResults,\n  SectionTitle,\n  StatusPill,\n  StepRow,\n  Summary,\n  SummaryBadge,\n  UnsupportedNotice,\n};\n\nexport const TestUI = {\n  Header,\n  Summary,\n  SummaryBadge,\n  CurrentStepCard,\n  ControlBar,\n  SectionTitle,\n  EmptyState,\n  StatusPill,\n  StepRow,\n  ScenarioCard,\n  ScenarioResults,\n  LiveLog,\n  UnsupportedNotice,\n};\n\nexport default TestUI;\n"
  },
  {
    "path": "apps/common-app/src/testComponents/statusStyles.ts",
    "content": "import { colors } from '../styles';\nimport type { ScenarioStatus, TestStatus } from './types';\n\nexport const statusTextColors: Record<TestStatus, string> = {\n  pass: '#7bd88f',\n  fail: '#ff8d8d',\n  info: '#8fc8ff',\n  skipped: colors.gray,\n};\n\nexport const statusPillBackgroundColors: Record<ScenarioStatus, string> = {\n  pass: '#28794a',\n  fail: '#a63f3f',\n  skipped: '#5b5f6c',\n};\n"
  },
  {
    "path": "apps/common-app/src/testComponents/types.ts",
    "content": "export type TestStatus = 'pass' | 'fail' | 'info' | 'skipped';\nexport type ScenarioStatus = 'pass' | 'fail' | 'skipped';\n\nexport interface SummaryItem {\n  label: string;\n  value: string;\n}\n\nexport interface StepItem {\n  id: string;\n  message: string;\n  status: TestStatus;\n  details?: string;\n}\n\nexport interface ScenarioItem {\n  id: string;\n  title: string;\n  status: ScenarioStatus;\n  durationLabel: string;\n  steps: StepItem[];\n}\n\nexport interface ControlAction {\n  title: string;\n  onPress: () => void;\n  disabled?: boolean;\n  width?: number;\n}\n"
  },
  {
    "path": "apps/common-app/src/types.ts",
    "content": "export type InstrumentName =\n  | 'kick'\n  | 'clap'\n  | 'hi-hat'\n  | 'downbeat'\n  | 'regularbeat';\n\nexport interface Instrument {\n  color: string;\n  radius: number;\n  name: InstrumentName;\n}\n\nexport interface Touché {\n  cX: number;\n  cY: number;\n  stepIdx: number;\n  patternIdx: number;\n}\n\nexport interface Pattern {\n  instrumentName: InstrumentName;\n  steps: Array<boolean>;\n}\n\nexport interface Preset {\n  name: string;\n  bpm: number;\n  pattern: Pattern[];\n}\n\nexport interface XYWHRect {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n}\n\nexport interface XYPoint {\n  x: number;\n  y: number;\n}\n\nexport type PlayingInstruments = Record<InstrumentName, boolean>;\n"
  },
  {
    "path": "apps/common-app/src/utils/skiUtils.ts",
    "content": "export function getAngle(stepIdx: number, maxSteps: number) {\n  'worklet';\n\n  return (stepIdx / maxSteps) * Math.PI * 2 - Math.PI / 2;\n}\n\nexport function getPointCX(angle: number, radius: number, outerCX: number) {\n  'worklet';\n\n  return Math.cos(angle) * radius + outerCX;\n}\n\nexport function getPointCY(angle: number, radius: number, outerCY: number) {\n  'worklet';\n\n  return Math.sin(angle) * radius + outerCY;\n}\n\nexport function isPointInCircle(\n  pX: number,\n  pY: number,\n  cX: number,\n  cY: number,\n  r: number\n) {\n  'worklet';\n\n  return Math.sqrt((pX - cX) ** 2 + (pY - cY) ** 2) < r;\n}\n"
  },
  {
    "path": "apps/common-app/src/utils/soundEngines/Clap.ts",
    "content": "import { AudioContext } from 'react-native-audio-api';\n\nimport type { SoundEngine } from './SoundEngine';\n\nclass Clap implements SoundEngine {\n  public audioContext: AudioContext;\n  public tone: number;\n  public decay: number;\n  public volume: number;\n  private pulseWidth: number;\n  private pulseCount: number;\n\n  constructor(audioContext: AudioContext) {\n    this.audioContext = audioContext;\n    this.tone = 820;\n    this.volume = 1;\n    this.decay = 0.2;\n    this.pulseWidth = 0.008;\n    this.pulseCount = 4;\n  }\n\n  createNoiseBuffer() {\n    const bufferSize = this.audioContext.sampleRate / 5;\n    const buffer = this.audioContext.createBuffer(\n      1,\n      bufferSize,\n      this.audioContext.sampleRate\n    );\n\n    const output = new Float32Array(bufferSize);\n\n    for (let i = 0; i < bufferSize; i++) {\n      output[i] = Math.random() * 2 - 1;\n    }\n\n    buffer.copyToChannel(output, 0, 0);\n\n    return buffer;\n  }\n\n  play(time: number) {\n    // TODO: add delay node once implemented!\n    const noise = this.audioContext.createBufferSource();\n    noise.buffer = this.createNoiseBuffer();\n\n    const filter = this.audioContext.createBiquadFilter();\n    filter.type = 'bandpass';\n    filter.frequency.value = this.tone * 2;\n    filter.Q.value = 1;\n\n    const envelope = this.audioContext.createGain();\n\n    noise.connect(filter);\n    filter.connect(envelope);\n    envelope.connect(this.audioContext.destination);\n\n    for (let i = 0; i < this.pulseCount - 1; i += 1) {\n      envelope.gain.setValueAtTime(this.volume, time + i * this.pulseWidth);\n\n      envelope.gain.exponentialRampToValueAtTime(\n        0.1,\n        time + (i + 1) * this.pulseWidth\n      );\n    }\n\n    envelope.gain.setValueAtTime(\n      this.volume,\n      time + (this.pulseCount - 1) * this.pulseWidth\n    );\n    envelope.gain.exponentialRampToValueAtTime(0.001, time + this.decay);\n    envelope.gain.setValueAtTime(0, time + this.decay + 0.001);\n\n    noise.start(time);\n    noise.stop(time + this.decay);\n  }\n}\n\nexport default Clap;\n"
  },
  {
    "path": "apps/common-app/src/utils/soundEngines/HiHat.ts",
    "content": "import { AudioContext } from 'react-native-audio-api';\n\nimport type { SoundEngine } from './SoundEngine';\n\nclass HiHat implements SoundEngine {\n  public audioContext: AudioContext;\n  public tone: number;\n  public decay: number;\n  public volume: number;\n  private ratios: number[];\n  private bandpassFilterFrequency: number;\n  private highpassFilterFrequency: number;\n\n  constructor(audioContext: AudioContext) {\n    this.audioContext = audioContext;\n    this.tone = 40;\n    this.decay = 0.3;\n    this.volume = 1;\n    this.ratios = [2, 3, 4.16, 5.43, 6.79, 8.21];\n    this.bandpassFilterFrequency = 10000;\n    this.highpassFilterFrequency = 7000;\n  }\n\n  play(time: number) {\n    this.ratios.forEach((ratio) => {\n      const oscillator = this.audioContext.createOscillator();\n      oscillator.type = 'square';\n      oscillator.frequency.value = this.tone * ratio;\n\n      const bandpassFilter = this.audioContext.createBiquadFilter();\n      const highpassFilter = this.audioContext.createBiquadFilter();\n      const gain = this.audioContext.createGain();\n\n      bandpassFilter.type = 'bandpass';\n      bandpassFilter.frequency.value = this.bandpassFilterFrequency;\n\n      highpassFilter.type = 'highpass';\n      highpassFilter.frequency.value = this.highpassFilterFrequency;\n\n      gain.gain.setValueAtTime(0.0001, time);\n      gain.gain.exponentialRampToValueAtTime(this.volume, time + 0.02);\n      gain.gain.exponentialRampToValueAtTime(this.volume * 0.33, time + 0.03);\n      gain.gain.exponentialRampToValueAtTime(this.volume * 0.0001, time + 0.3);\n      gain.gain.setValueAtTime(0, time + 0.3 + 0.001);\n\n      oscillator.connect(bandpassFilter);\n      bandpassFilter.connect(highpassFilter);\n      highpassFilter.connect(gain);\n      gain.connect(this.audioContext.destination);\n\n      oscillator.start(time);\n      oscillator.stop(time + this.decay);\n    });\n  }\n}\n\nexport default HiHat;\n"
  },
  {
    "path": "apps/common-app/src/utils/soundEngines/Kick.ts",
    "content": "import { AudioContext } from 'react-native-audio-api';\n\nimport type { SoundEngine } from './SoundEngine';\n\nclass Kick implements SoundEngine {\n  public audioContext: AudioContext;\n  public tone: number;\n  public decay: number;\n  public volume: number;\n\n  constructor(audioContext: AudioContext) {\n    this.audioContext = audioContext;\n    this.tone = 164;\n    this.decay = 0.2;\n    this.volume = 0.95;\n  }\n\n  play(time: number) {\n    const oscillator = this.audioContext.createOscillator();\n    const gain = this.audioContext.createGain();\n\n    oscillator.frequency.setValueAtTime(0, time);\n    oscillator.frequency.setValueAtTime(this.tone, time + 0.01);\n    oscillator.frequency.exponentialRampToValueAtTime(10, time + this.decay);\n\n    gain.gain.setValueAtTime(0, time);\n    gain.gain.setValueAtTime(this.volume, time + 0.01);\n    gain.gain.exponentialRampToValueAtTime(0.001, time + this.decay);\n\n    oscillator.connect(gain);\n    gain.connect(this.audioContext.destination);\n\n    oscillator.start(time);\n    oscillator.stop(time + this.decay);\n  }\n}\n\nexport default Kick;\n"
  },
  {
    "path": "apps/common-app/src/utils/soundEngines/MetronomeSound.ts",
    "content": "import { AudioContext } from 'react-native-audio-api';\n\nimport type { SoundEngine } from './SoundEngine';\n\nclass MetronomeSound implements SoundEngine {\n  public audioContext: AudioContext;\n  public tone: number;\n  public decay: number;\n  public volume: number;\n\n  constructor(audioContext: AudioContext, tone: number) {\n    this.audioContext = audioContext;\n    this.tone = tone;\n    this.decay = 0.03;\n    this.volume = 1;\n  }\n\n  play(time: number) {\n    const oscillator = this.audioContext.createOscillator();\n    const gain = this.audioContext.createGain();\n\n    oscillator.frequency.value = this.tone;\n\n    gain.gain.setValueAtTime(this.volume, time);\n    gain.gain.linearRampToValueAtTime(0.5, time + 0.001);\n    gain.gain.linearRampToValueAtTime(0.001, time + this.decay);\n    gain.gain.setValueAtTime(0, time + this.decay + 0.001);\n\n    oscillator.connect(gain);\n    gain.connect(this.audioContext.destination);\n\n    oscillator.start(time);\n    oscillator.stop(time + this.decay);\n  }\n}\n\nexport default MetronomeSound;\n"
  },
  {
    "path": "apps/common-app/src/utils/soundEngines/SoundEngine.ts",
    "content": "import { AudioContext } from 'react-native-audio-api';\n\nexport interface SoundEngine {\n  audioContext: AudioContext;\n  tone: number;\n  decay: number;\n  volume: number;\n  play: (time: number) => void;\n}\n"
  },
  {
    "path": "apps/common-app/src/utils/usePlayer.tsx",
    "content": "import { AudioContext } from 'react-native-audio-api';\nimport { useSharedValue } from 'react-native-reanimated';\nimport { useRef, useState, useCallback, useLayoutEffect } from 'react';\n\nimport type { InstrumentName, Pattern, PlayingInstruments } from '../types';\nimport { instruments } from '../examples/DrumMachine/constants';\n\ntype PlayNoteMethod = (name: InstrumentName, time: number) => void;\n\ninterface SetupResponse {\n  playNote: PlayNoteMethod;\n}\n\ninterface PlayerOptions {\n  bpm: number;\n  patterns: Pattern[];\n  notesPerBeat: number;\n  numBeats: number;\n  setup: (AudioContext: AudioContext) => SetupResponse;\n}\n\nfunction getPlayingInstruments(\n  iName?: InstrumentName,\n  iValue: boolean = false\n) {\n  return instruments.reduce((acc, name) => {\n    acc[name] = iName === name ? iValue : false;\n    return acc;\n  }, {} as PlayingInstruments);\n}\n\nfunction r<T>(ref: React.MutableRefObject<T>) {\n  return ref.current;\n}\n\nexport default function usePlayer(options: PlayerOptions) {\n  const { bpm, patterns, notesPerBeat, numBeats, setup } = options;\n\n  const [isPlaying, setIsPlaying] = useState(false);\n\n  const bpmRef = useRef(bpm);\n  const patternsRef = useRef(patterns);\n  const isPlayingRef = useRef(isPlaying);\n  const notesPerBeatRef = useRef(notesPerBeat);\n  const numBeatsRef = useRef(numBeats);\n\n  const progressSV = useSharedValue(0);\n  const currentBeat = useSharedValue(0);\n\n  const playingInstruments = useSharedValue<PlayingInstruments>(\n    getPlayingInstruments()\n  );\n\n  useLayoutEffect(() => {\n    bpmRef.current = bpm;\n    patternsRef.current = patterns;\n    isPlayingRef.current = isPlaying;\n    notesPerBeatRef.current = notesPerBeat;\n    numBeatsRef.current = numBeats;\n  }, [bpm, patterns, isPlaying, notesPerBeat, numBeats]);\n\n  useLayoutEffect(() => {\n    const audioContext = new AudioContext();\n\n    const { playNote } = setup(audioContext);\n\n    let frameCount = 0;\n    let nextNoteTime = 0;\n    let averageFrameTime = 0;\n\n    let startTime = 0;\n    let currentTime = 0;\n\n    function advancePattern() {\n      for (let i = 0; i < r(patternsRef).length; i += 1) {\n        if (r(patternsRef)[i].steps[currentBeat.value]) {\n          playingInstruments.value = getPlayingInstruments(\n            r(patternsRef)[i].instrumentName,\n            true\n          );\n\n          playNote(r(patternsRef)[i].instrumentName, nextNoteTime);\n        }\n      }\n\n      currentBeat.value = (currentBeat.value + 1) % r(numBeatsRef);\n    }\n\n    function playerLoop() {\n      frameCount += 1;\n\n      const timePerNote = 60.0 / (r(bpmRef) * r(notesPerBeatRef));\n      const totalLoopTime = timePerNote * r(numBeatsRef);\n\n      currentTime = audioContext.currentTime;\n      const timeDiff = currentTime - startTime;\n\n      averageFrameTime = timeDiff / frameCount;\n\n      progressSV.value = (timeDiff % totalLoopTime) / totalLoopTime;\n\n      if (currentTime - (nextNoteTime - timePerNote) > 0.05) {\n        playingInstruments.value = getPlayingInstruments();\n      }\n\n      if (currentTime + averageFrameTime >= nextNoteTime) {\n        advancePattern();\n        nextNoteTime += timePerNote;\n      }\n\n      if (r(isPlayingRef)) {\n        requestAnimationFrame(playerLoop);\n      }\n    }\n\n    if (isPlaying) {\n      requestAnimationFrame(() => {\n        frameCount = 0;\n        averageFrameTime = 0;\n\n        progressSV.value = 0;\n        currentBeat.value = 0;\n        playingInstruments.value = getPlayingInstruments();\n        startTime = audioContext.currentTime;\n        currentTime = audioContext.currentTime;\n        nextNoteTime = audioContext.currentTime;\n\n        playerLoop();\n      });\n    } else {\n      frameCount = 0;\n      averageFrameTime = 0;\n\n      progressSV.value = 0;\n      currentBeat.value = 0;\n      playingInstruments.value = getPlayingInstruments();\n    }\n\n    return () => {\n      playingInstruments.value = getPlayingInstruments();\n      audioContext.close();\n    };\n\n    // \\/ Shared values are not necessary in deps array\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [isPlaying, setup]);\n\n  const play = useCallback(() => {\n    setIsPlaying(true);\n  }, []);\n\n  const stop = useCallback(() => {\n    setIsPlaying(false);\n  }, []);\n\n  return {\n    playingInstruments,\n    progressSV,\n    isPlaying,\n    play,\n    stop,\n  };\n}\n"
  },
  {
    "path": "apps/common-app/src/utils/withSeparators.ts",
    "content": "import { ReactNode } from 'react';\n\ntype RenderElement<T> = (element: T, index: number) => ReactNode;\ntype RenderSeparator = (index: number) => ReactNode;\n\nexport default function withSeparators<T>(\n  collection: ArrayLike<T>,\n  renderSeparator: RenderSeparator,\n  renderElement: RenderElement<T>\n) {\n  const elements = [];\n\n  for (let i = 0; i < collection.length; i += 1) {\n    elements.push(renderElement(collection[i], i));\n\n    if (i < collection.length - 1) {\n      elements.push(renderSeparator(i));\n    }\n  }\n\n  return elements;\n}\n"
  },
  {
    "path": "apps/common-app/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"types\": [\"jest\"],\n    \"moduleSuffixes\": [\".ios\", \".android\", \".native\", \"\"]\n  }\n}\n"
  },
  {
    "path": "apps/common-app/types.d.ts",
    "content": "module '*.mp3';\n"
  },
  {
    "path": "apps/fabric-example/.bundle/config",
    "content": "BUNDLE_PATH: \"vendor/bundle\"\nBUNDLE_FORCE_RUBY_PLATFORM: 1\n"
  },
  {
    "path": "apps/fabric-example/.watchmanconfig",
    "content": "{}\n"
  },
  {
    "path": "apps/fabric-example/App.tsx",
    "content": "import App from 'common-app';\n\nexport default App;\n"
  },
  {
    "path": "apps/fabric-example/Gemfile",
    "content": "source 'https://rubygems.org'\n\n# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version\nruby \">= 2.6.10\"\n\n# Exclude problematic versions of cocoapods and activesupport that causes build failures.\ngem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1'\ngem 'activesupport', '>= 6.1.7.5', '!= 7.1.0'\ngem 'xcodeproj', '< 1.26.0'\ngem 'concurrent-ruby', '< 1.3.4'\n\n# Ruby 3.4.0 has removed some libraries from the standard library.\ngem 'bigdecimal'\ngem 'logger'\ngem 'benchmark'\ngem 'mutex_m'\ngem 'nkf'\n"
  },
  {
    "path": "apps/fabric-example/README.md",
    "content": "This is a new [**React Native**](https://reactnative.dev) project, bootstrapped using [`@react-native-community/cli`](https://github.com/react-native-community/cli).\n\n# Getting Started\n\n> **Note**: Make sure you have completed the [Set Up Your Environment](https://reactnative.dev/docs/set-up-your-environment) guide before proceeding.\n\n## Step 1: Start Metro\n\nFirst, you will need to run **Metro**, the JavaScript build tool for React Native.\n\nTo start the Metro dev server, run the following command from the root of your React Native project:\n\n```sh\n# Using npm\nnpm start\n\n# OR using Yarn\nyarn start\n```\n\n## Step 2: Build and run your app\n\nWith Metro running, open a new terminal window/pane from the root of your React Native project, and use one of the following commands to build and run your Android or iOS app:\n\n### Android\n\n```sh\n# Using npm\nnpm run android\n\n# OR using Yarn\nyarn android\n```\n\n### iOS\n\nFor iOS, remember to install CocoaPods dependencies (this only needs to be run on first clone or after updating native deps).\n\nThe first time you create a new project, run the Ruby bundler to install CocoaPods itself:\n\n```sh\nbundle install\n```\n\nThen, and every time you update your native dependencies, run:\n\n```sh\nbundle exec pod install\n```\n\nFor more information, please visit [CocoaPods Getting Started guide](https://guides.cocoapods.org/using/getting-started.html).\n\n```sh\n# Using npm\nnpm run ios\n\n# OR using Yarn\nyarn ios\n```\n\n## Run iOS Tests\n\nThe Fabric example includes a native XCTest target, `FabricExampleTests`, with initial coverage for `AudioEngine` creation and teardown.\n\nFrom `apps/fabric-example`, make sure Pods are installed:\n\n```sh\nbundle exec pod install\n```\n\nThen run the tests from the repo root or from `apps/fabric-example`:\n\n```sh\nxcodebuild test \\\n  -workspace ios/FabricExample.xcworkspace \\\n  -scheme FabricExample \\\n  -destination 'platform=iOS Simulator,name=iPhone 17 pro,OS=26.4' \\\n  -parallelizeTargets\n```\n\nIf that simulator is not available on your machine, list installed simulators and swap the destination:\n\n```sh\nxcrun simctl list devices available\n```\n\nXcode script phases also require a valid `NODE_BINARY`. If Hermes or React Native pod scripts fail before tests start, update `ios/.xcode.env.local` to point at your current `node` executable.\n\nIf everything is set up correctly, you should see your new app running in the Android Emulator, iOS Simulator, or your connected device.\n\nThis is one way to run your app — you can also build it directly from Android Studio or Xcode.\n\n## Step 3: Modify your app\n\nNow that you have successfully run the app, let's make changes!\n\nOpen `App.tsx` in your text editor of choice and make some changes. When you save, your app will automatically update and reflect these changes — this is powered by [Fast Refresh](https://reactnative.dev/docs/fast-refresh).\n\nWhen you want to forcefully reload, for example to reset the state of your app, you can perform a full reload:\n\n- **Android**: Press the <kbd>R</kbd> key twice or select **\"Reload\"** from the **Dev Menu**, accessed via <kbd>Ctrl</kbd> + <kbd>M</kbd> (Windows/Linux) or <kbd>Cmd ⌘</kbd> + <kbd>M</kbd> (macOS).\n- **iOS**: Press <kbd>R</kbd> in iOS Simulator.\n\n## Congratulations! :tada:\n\nYou've successfully run and modified your React Native App. :partying_face:\n\n### Now what?\n\n- If you want to add this new React Native code to an existing application, check out the [Integration guide](https://reactnative.dev/docs/integration-with-existing-apps).\n- If you're curious to learn more about React Native, check out the [docs](https://reactnative.dev/docs/getting-started).\n\n# Troubleshooting\n\nIf you're having issues getting the above steps to work, see the [Troubleshooting](https://reactnative.dev/docs/troubleshooting) page.\n\n# Learn More\n\nTo learn more about React Native, take a look at the following resources:\n\n- [React Native Website](https://reactnative.dev) - learn more about React Native.\n- [Getting Started](https://reactnative.dev/docs/environment-setup) - an **overview** of React Native and how setup your environment.\n- [Learn the Basics](https://reactnative.dev/docs/getting-started) - a **guided tour** of the React Native **basics**.\n- [Blog](https://reactnative.dev/blog) - read the latest official React Native **Blog** posts.\n- [`@facebook/react-native`](https://github.com/facebook/react-native) - the Open Source; GitHub **repository** for React Native.\n"
  },
  {
    "path": "apps/fabric-example/android/app/build.gradle",
    "content": "apply plugin: \"com.android.application\"\napply plugin: \"org.jetbrains.kotlin.android\"\napply plugin: \"com.facebook.react\"\n\n/**\n * This is the configuration block to customize your React Native Android app.\n * By default you don't need to apply any configuration, just uncomment the lines you need.\n */\nreact {\n    /* Folders */\n    //   The root of your project, i.e. where \"package.json\" lives. Default is '../..'\n    // root = file(\"../../\")\n    //   The folder where the react-native NPM package is. Default is ../../node_modules/react-native\n    reactNativeDir = file(\"../../../../node_modules/react-native\")\n    //   The folder where the react-native Codegen package is. Default is ../../node_modules/@react-native/codegen\n    codegenDir = file(\"../../../../node_modules/@react-native/codegen\")\n    //   The cli.js file which is the React Native CLI entrypoint. Default is ../../node_modules/react-native/cli.js\n    cliFile = file(\"../../../../node_modules/react-native/cli.js\")\n\n    /* Variants */\n    //   The list of variants to that are debuggable. For those we're going to\n    //   skip the bundling of the JS bundle and the assets. Default is \"debug\", \"debugOptimized\".\n    //   If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants.\n    // debuggableVariants = [\"liteDebug\", \"liteDebugOptimized\", \"prodDebug\", \"prodDebugOptimized\"]\n\n    /* Bundling */\n    //   A list containing the node command and its flags. Default is just 'node'.\n    // nodeExecutableAndArgs = [\"node\"]\n    //\n    //   The command to run when bundling. By default is 'bundle'\n    // bundleCommand = \"ram-bundle\"\n    //\n    //   The path to the CLI configuration file. Default is empty.\n    // bundleConfig = file(../rn-cli.config.js)\n    //\n    //   The name of the generated asset file containing your JS bundle\n    // bundleAssetName = \"MyApplication.android.bundle\"\n    //\n    //   The entry file for bundle generation. Default is 'index.android.js' or 'index.js'\n    // entryFile = file(\"../js/MyApplication.android.js\")\n    //\n    //   A list of extra flags to pass to the 'bundle' commands.\n    //   See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle\n    // extraPackagerArgs = []\n\n    /* Hermes Commands */\n    //   The hermes compiler command to run. By default it is 'hermesc'\n    hermesCommand = \"../../node_modules/hermes-compiler/hermesc/%OS-BIN%/hermesc\"\n    //\n    //   The list of flags to pass to the Hermes compiler. By default is \"-O\", \"-output-source-map\"\n    // hermesFlags = [\"-O\", \"-output-source-map\"]\n\n    /* Autolinking */\n    autolinkLibrariesWithApp()\n}\n\n/**\n * Set this to true to Run Proguard on Release builds to minify the Java bytecode.\n */\ndef enableProguardInReleaseBuilds = false\n\n/**\n * The preferred build flavor of JavaScriptCore (JSC)\n *\n * For example, to use the international variant, you can use:\n * `def jscFlavor = io.github.react-native-community:jsc-android-intl:2026004.+`\n *\n * The international variant includes ICU i18n library and necessary data\n * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that\n * give correct results when using with locales other than en-US. Note that\n * this variant is about 6MiB larger per architecture than default.\n */\ndef jscFlavor = 'io.github.react-native-community:jsc-android:2026004.+'\n\nandroid {\n    ndkVersion rootProject.ext.ndkVersion\n    buildToolsVersion rootProject.ext.buildToolsVersion\n    compileSdk rootProject.ext.compileSdkVersion\n\n    namespace \"com.fabricexample\"\n    defaultConfig {\n        applicationId \"com.fabricexample\"\n        minSdkVersion rootProject.ext.minSdkVersion\n        targetSdkVersion rootProject.ext.targetSdkVersion\n        versionCode 1\n        versionName \"1.0\"\n    }\n    signingConfigs {\n        debug {\n            storeFile file('debug.keystore')\n            storePassword 'android'\n            keyAlias 'androiddebugkey'\n            keyPassword 'android'\n        }\n    }\n    buildTypes {\n        debug {\n            signingConfig signingConfigs.debug\n        }\n        release {\n            // Caution! In production, you need to generate your own keystore file.\n            // see https://reactnative.dev/docs/signed-apk-android.\n            signingConfig signingConfigs.debug\n            minifyEnabled enableProguardInReleaseBuilds\n            proguardFiles getDefaultProguardFile(\"proguard-android.txt\"), \"proguard-rules.pro\"\n        }\n    }\n}\n\ndependencies {\n    // The version of react-native is set by the React Native Gradle Plugin\n    implementation(\"com.facebook.react:react-android\")\n\n    if (hermesEnabled.toBoolean()) {\n        implementation(\"com.facebook.react:hermes-android\")\n    } else {\n        implementation jscFlavor\n    }\n}\n"
  },
  {
    "path": "apps/fabric-example/android/app/proguard-rules.pro",
    "content": "# Add project specific ProGuard rules here.\n# By default, the flags in this file are appended to flags specified\n# in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt\n# You can edit the include path and order by changing the proguardFiles\n# directive in build.gradle.\n#\n# For more details, see\n#   http://developer.android.com/guide/developing/tools/proguard.html\n\n# Add any project specific keep options here:\n"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n    <uses-permission android:name=\"android.permission.INTERNET\" />\n    <uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>\n    <uses-permission android:name=\"android.permission.READ_MEDIA_AUDIO\"/>\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\"/>\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK\"/>\n    <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_MICROPHONE\"/>\n    <uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>\n    <uses-permission android:name=\"android.permission.POST_NOTIFICATIONS\"/>\n\n    <application\n      android:name=\".MainApplication\"\n      android:label=\"@string/app_name\"\n      android:icon=\"@mipmap/ic_launcher\"\n      android:roundIcon=\"@mipmap/ic_launcher_round\"\n      android:allowBackup=\"false\"\n      android:theme=\"@style/AppTheme\"\n      android:usesCleartextTraffic=\"${usesCleartextTraffic}\"\n      android:supportsRtl=\"true\">\n        <service android:stopWithTask=\"true\" android:name=\"com.swmansion.audioapi.system.CentralizedForegroundService\" android:foregroundServiceType=\"mediaPlayback|microphone\" />\n      <activity\n        android:name=\".MainActivity\"\n        android:label=\"@string/app_name\"\n        android:configChanges=\"keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode\"\n        android:launchMode=\"singleTask\"\n        android:windowSoftInputMode=\"adjustResize\"\n        android:exported=\"true\">\n        <intent-filter>\n            <action android:name=\"android.intent.action.MAIN\" />\n            <category android:name=\"android.intent.category.LAUNCHER\" />\n        </intent-filter>\n      </activity>\n    </application>\n</manifest>\n"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/java/com/fabricexample/MainActivity.kt",
    "content": "package com.fabricexample\n\nimport android.Manifest\nimport android.os.Bundle\nimport androidx.core.app.ActivityCompat\nimport com.facebook.react.ReactActivity\nimport com.facebook.react.ReactActivityDelegate\nimport com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled\nimport com.facebook.react.defaults.DefaultReactActivityDelegate\n\nclass MainActivity : ReactActivity() {\n\n  /**\n   * Returns the name of the main component registered from JavaScript. This is used to schedule\n   * rendering of the component.\n   */\n  override fun getMainComponentName(): String = \"FabricExample\"\n\n  /**\n   * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate]\n   * which allows you to enable New Architecture with a single boolean flags [fabricEnabled]\n   */\n  override fun createReactActivityDelegate(): ReactActivityDelegate =\n      DefaultReactActivityDelegate(this, mainComponentName, fabricEnabled)\n}\n"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/java/com/fabricexample/MainApplication.kt",
    "content": "package com.fabricexample\n\nimport android.app.Application\nimport com.facebook.react.PackageList\nimport com.facebook.react.ReactApplication\nimport com.facebook.react.ReactHost\nimport com.facebook.react.ReactNativeApplicationEntryPoint.loadReactNative\nimport com.facebook.react.defaults.DefaultReactHost.getDefaultReactHost\n\nclass MainApplication : Application(), ReactApplication {\n\n  override val reactHost: ReactHost by lazy {\n    getDefaultReactHost(\n      context = applicationContext,\n      packageList =\n        PackageList(this).packages.apply {\n          // Packages that cannot be autolinked yet can be added manually here, for example:\n          // add(MyReactNativePackage())\n        },\n    )\n  }\n\n  override fun onCreate() {\n    super.onCreate()\n    loadReactNative(this)\n  }\n}\n"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/drawable/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector\n    android:height=\"108dp\"\n    android:width=\"108dp\"\n    android:viewportHeight=\"108\"\n    android:viewportWidth=\"108\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <path android:fillColor=\"#3DDC84\"\n          android:pathData=\"M0,0h108v108h-108z\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M9,0L9,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,0L19,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,0L29,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,0L39,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,0L49,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,0L59,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,0L69,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,0L79,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M89,0L89,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M99,0L99,108\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,9L108,9\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,19L108,19\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,29L108,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,39L108,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,49L108,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,59L108,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,69L108,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,79L108,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,89L108,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M0,99L108,99\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,29L89,29\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,39L89,39\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,49L89,49\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,59L89,59\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,69L89,69\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M19,79L89,79\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M29,19L29,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M39,19L39,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M49,19L49,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M59,19L59,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M69,19L69,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n    <path android:fillColor=\"#00000000\" android:pathData=\"M79,19L79,89\"\n          android:strokeColor=\"#33FFFFFF\" android:strokeWidth=\"0.8\"/>\n</vector>\n"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/drawable/logo.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"36dp\"\n    android:height=\"40dp\"\n    android:viewportWidth=\"36\"\n    android:viewportHeight=\"40\">\n  <path\n      android:pathData=\"M17.397,0C21.203,0.046 23.27,5.296 24.179,8.243C27.21,7.54 32.708,6.626 34.647,9.87C36.595,13.128 33.04,17.387 30.914,19.563C33.119,21.806 36.799,26.046 34.949,29.24C33.109,32.416 27.554,31.459 24.556,30.713C24.255,31.785 23.807,33.136 23.178,34.422H21.299C22.103,32.984 22.632,31.292 22.924,30.254C21.313,29.752 19.606,29.081 17.859,28.265C16.146,29.045 14.486,29.679 12.922,30.146C13.596,32.348 15.113,37.036 17.942,37.07C18.571,37.078 19.137,36.851 19.642,36.47V38.386C19.129,38.609 18.571,38.732 17.967,38.725C14.175,38.679 12.217,33.563 11.307,30.576C8.246,31.289 2.705,32.064 0.751,28.796C-1.189,25.549 2.304,21.448 4.464,19.251C2.234,16.992 -1.343,12.643 0.519,9.426C2.388,6.201 7.879,7.256 10.974,8.06C11.796,5.112 13.607,-0.045 17.397,0ZM29.727,20.706C28.536,21.787 27.16,22.861 25.645,23.896C25.517,25.774 25.284,27.531 24.947,29.115C27.313,29.701 32.09,30.789 33.478,28.394C34.853,26.021 31.341,22.355 29.727,20.706ZM5.689,20.42C4.098,22.039 0.752,25.567 2.199,27.988C3.654,30.42 8.949,29.416 10.864,28.969C10.462,27.348 10.155,25.583 9.952,23.74C8.36,22.649 6.924,21.533 5.689,20.42ZM23.853,25.061C22.536,25.876 21.18,26.632 19.795,27.334C21.007,27.856 22.188,28.299 23.314,28.653C23.546,27.543 23.726,26.339 23.853,25.061ZM11.796,24.948C11.974,26.203 12.204,27.408 12.48,28.536C13.569,28.206 14.713,27.791 15.893,27.296C14.496,26.57 13.13,25.784 11.796,24.948ZM17.621,12.313C15.473,13.304 13.408,14.458 11.446,15.76C11.298,18.111 11.334,20.479 11.55,22.834C13.561,24.165 15.658,25.375 17.827,26.431C19.965,25.413 22.038,24.259 24.01,22.964C24.129,20.623 24.098,18.269 23.896,15.925C21.897,14.57 19.797,13.362 17.621,12.313ZM25.674,17.194C25.764,18.716 25.784,20.24 25.745,21.761C26.751,21.027 27.678,20.279 28.507,19.531C27.645,18.744 26.695,17.96 25.674,17.194ZM9.697,16.982C8.679,17.733 7.733,18.504 6.88,19.278C7.742,20.049 8.71,20.826 9.767,21.597C9.67,20.059 9.646,18.518 9.697,16.982ZM33.199,10.678C31.759,8.27 26.844,9.336 24.623,9.85C25.013,11.441 25.308,13.189 25.5,15.035C27.038,16.117 28.452,17.247 29.696,18.388C31.236,16.81 34.652,13.11 33.199,10.678ZM10.576,9.657C8.293,9.061 3.383,7.868 1.99,10.273C0.597,12.679 4.074,16.508 5.652,18.109C6.881,16.989 8.287,15.88 9.82,14.825C9.967,13 10.222,11.259 10.576,9.657ZM23.003,10.274C21.898,10.596 20.754,10.993 19.591,11.461C20.983,12.18 22.341,12.961 23.66,13.804C23.49,12.558 23.27,11.374 23.003,10.274ZM12.206,10.129C11.965,11.234 11.772,12.41 11.632,13.638C12.925,12.833 14.259,12.088 15.627,11.408C14.459,10.911 13.311,10.482 12.206,10.129ZM17.421,1.655C14.583,1.62 13.266,6.153 12.602,8.53C14.208,9.038 15.893,9.698 17.596,10.484C19.286,9.74 20.959,9.127 22.561,8.665C21.899,6.529 20.262,1.689 17.421,1.655Z\"\n      android:fillColor=\"#919FCF\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M17.103,14.821L17.181,14.822L17.198,14.822C19.534,14.881 21.403,16.791 21.403,19.131V20.738C21.709,20.669 22.028,20.632 22.356,20.632C22.801,20.632 23.231,20.7 23.636,20.826C24.283,19.264 25.823,18.164 27.624,18.164L27.736,18.165C30.033,18.223 31.88,20.074 31.938,22.362L31.939,22.473V33.581C31.939,35.921 30.07,37.831 27.736,37.89L27.624,37.891C25.823,37.891 24.283,36.791 23.636,35.229C23.231,35.354 22.802,35.423 22.356,35.423C22.028,35.423 21.709,35.386 21.403,35.317V35.69C21.403,38.03 19.534,39.939 17.199,39.999L17.087,40C14.99,40 13.246,38.507 12.855,36.531C12.559,36.604 12.252,36.647 11.936,36.655L11.819,36.657C9.601,36.657 7.778,34.986 7.532,32.842C7.217,32.915 6.888,32.954 6.551,32.954C4.164,32.954 2.236,31.021 2.236,28.645V26.176C2.236,23.799 4.164,21.867 6.551,21.866C6.888,21.866 7.217,21.906 7.532,21.979C7.778,19.834 9.601,18.164 11.819,18.164L11.936,18.166C12.252,18.174 12.559,18.216 12.855,18.289C13.246,16.314 14.99,14.821 17.087,14.821L17.103,14.821Z\"\n      android:fillColor=\"#ffffff\"/>\n  <path\n      android:pathData=\"M29.065,22.473C29.065,21.676 28.418,21.032 27.624,21.032C26.83,21.032 26.184,21.676 26.184,22.473V33.581C26.184,34.379 26.83,35.023 27.624,35.023C28.418,35.023 29.065,34.379 29.065,33.581V22.473ZM22.356,23.501C21.561,23.501 20.915,24.145 20.915,24.942V31.113C20.915,31.91 21.561,32.554 22.356,32.554C23.15,32.554 23.796,31.91 23.796,31.113V24.942C23.796,24.145 23.15,23.501 22.356,23.501ZM5.11,28.645C5.11,29.442 5.756,30.086 6.551,30.086C7.345,30.086 7.991,29.442 7.991,28.645V26.176C7.991,25.379 7.345,24.735 6.551,24.735C5.756,24.735 5.11,25.379 5.11,26.176V28.645ZM10.378,32.347C10.378,33.144 11.025,33.788 11.819,33.788C12.613,33.788 13.26,33.144 13.26,32.347V22.473C13.26,21.676 12.613,21.032 11.819,21.032C11.025,21.032 10.378,21.676 10.378,22.473V32.347ZM18.528,19.131C18.528,18.358 17.922,17.73 17.162,17.691L17.087,17.689C16.293,17.689 15.647,18.333 15.647,19.131V35.69C15.647,36.487 16.293,37.132 17.087,37.132C17.882,37.132 18.528,36.487 18.528,35.69V19.131ZM20.125,22.882C20.68,22.283 21.473,21.907 22.356,21.907C23.238,21.907 24.032,22.283 24.587,22.882V22.473C24.587,20.799 25.945,19.439 27.624,19.439C29.303,19.439 30.662,20.799 30.662,22.473V33.581C30.662,35.256 29.303,36.616 27.624,36.616C25.945,36.616 24.587,35.256 24.587,33.581V33.172C24.032,33.772 23.238,34.148 22.356,34.148C21.473,34.148 20.68,33.772 20.125,33.172V35.69C20.125,37.365 18.766,38.725 17.087,38.725C15.409,38.725 14.05,37.365 14.05,35.69V34.406C13.495,35.006 12.701,35.382 11.819,35.382C10.14,35.382 8.782,34.022 8.782,32.347V30.704C8.227,31.304 7.433,31.679 6.551,31.679C4.872,31.679 3.513,30.319 3.513,28.645V26.176C3.513,24.501 4.872,23.141 6.551,23.141C7.433,23.141 8.227,23.517 8.782,24.117V22.473C8.782,20.799 10.14,19.439 11.819,19.439C12.701,19.439 13.495,19.815 14.05,20.414V19.131C14.05,17.456 15.409,16.096 17.087,16.096L17.166,16.097C18.808,16.138 20.125,17.482 20.125,19.131V22.882Z\"\n      android:fillColor=\"#001A72\"/>\n</vector>\n"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/drawable/pause.xml",
    "content": "﻿<vector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:viewportWidth=\"16\"\n    android:viewportHeight=\"16\"\n    android:width=\"20dp\"\n    android:height=\"20dp\">\n    <path\n        android:pathData=\"M7 1H2V15H7V1Z\"\n        android:fillColor=\"#ffffff\" />\n    <path\n        android:pathData=\"M14 1H9V15H14V1Z\"\n        android:fillColor=\"#ffffff\" />\n</vector>\n"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/drawable/resume.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\" xmlns:aapt=\"http://schemas.android.com/aapt\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\"\n    android:width=\"20dp\"\n    android:height=\"20dp\">\n    <path\n        android:pathData=\"M20.4086 9.35258C22.5305 10.5065 22.5305 13.4935 20.4086 14.6474L7.59662 21.6145C5.53435 22.736 3 21.2763 3 18.9671L3 5.0329C3 2.72368 5.53435 1.26402 7.59661 2.38548L20.4086 9.35258Z\"\n        android:strokeColor=\"#1C274C\"\n        android:strokeWidth=\"1.5\" />\n</vector>\n"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/drawable/rn_edit_text_material.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Copyright (C) 2014 The Android Open Source Project\n\n     Licensed under the Apache License, Version 2.0 (the \"License\");\n     you may not use this file except in compliance with the License.\n     You may obtain a copy of the License at\n\n          http://www.apache.org/licenses/LICENSE-2.0\n\n     Unless required by applicable law or agreed to in writing, software\n     distributed under the License is distributed on an \"AS IS\" BASIS,\n     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n     See the License for the specific language governing permissions and\n     limitations under the License.\n-->\n<inset xmlns:android=\"http://schemas.android.com/apk/res/android\"\n       android:insetLeft=\"@dimen/abc_edit_text_inset_horizontal_material\"\n       android:insetRight=\"@dimen/abc_edit_text_inset_horizontal_material\"\n       android:insetTop=\"@dimen/abc_edit_text_inset_top_material\"\n       android:insetBottom=\"@dimen/abc_edit_text_inset_bottom_material\"\n       >\n\n    <selector>\n        <!--\n          This file is a copy of abc_edit_text_material (https://bit.ly/3k8fX7I).\n          The item below with state_pressed=\"false\" and state_focused=\"false\" causes a NullPointerException.\n          NullPointerException:tempt to invoke virtual method 'android.graphics.drawable.Drawable android.graphics.drawable.Drawable$ConstantState.newDrawable(android.content.res.Resources)'\n\n          <item android:state_pressed=\"false\" android:state_focused=\"false\" android:drawable=\"@drawable/abc_textfield_default_mtrl_alpha\"/>\n\n          For more info, see https://bit.ly/3CdLStv (react-native/pull/29452) and https://bit.ly/3nxOMoR.\n        -->\n        <item android:state_enabled=\"false\" android:drawable=\"@drawable/abc_textfield_default_mtrl_alpha\"/>\n        <item android:drawable=\"@drawable/abc_textfield_activated_mtrl_alpha\"/>\n    </selector>\n\n</inset>\n"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<adaptive-icon xmlns:android=\"http://schemas.android.com/apk/res/android\">\n    <background android:drawable=\"@color/ic_launcher_background\"/>\n    <foreground android:drawable=\"@mipmap/ic_launcher_foreground\"/>\n</adaptive-icon>"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/values/ic_launcher_background.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n    <color name=\"ic_launcher_background\">#FFFFFF</color>\n</resources>"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/values/strings.xml",
    "content": "<resources>\n    <string name=\"app_name\">FabricExample</string>\n</resources>\n"
  },
  {
    "path": "apps/fabric-example/android/app/src/main/res/values/styles.xml",
    "content": "<resources>\n\n    <!-- Base application theme. -->\n    <style name=\"AppTheme\" parent=\"Theme.AppCompat.DayNight.NoActionBar\">\n        <!-- Customize your theme here. -->\n        <item name=\"android:editTextBackground\">@drawable/rn_edit_text_material</item>\n    </style>\n\n</resources>\n"
  },
  {
    "path": "apps/fabric-example/android/build.gradle",
    "content": "buildscript {\n    ext {\n        buildToolsVersion = \"36.0.0\"\n        minSdkVersion = 24\n        compileSdkVersion = 36\n        targetSdkVersion = 36\n        ndkVersion = \"27.1.12297006\"\n        kotlinVersion = \"2.1.20\"\n    }\n    repositories {\n        google()\n        mavenCentral()\n    }\n    dependencies {\n        classpath(\"com.android.tools.build:gradle\")\n        classpath(\"com.facebook.react:react-native-gradle-plugin\")\n        classpath(\"org.jetbrains.kotlin:kotlin-gradle-plugin\")\n    }\n}\n\napply plugin: \"com.facebook.react.rootproject\"\n"
  },
  {
    "path": "apps/fabric-example/android/gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-9.3.1-bin.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "apps/fabric-example/android/gradle.properties",
    "content": "# Project-wide Gradle settings.\n\n# IDE (e.g. Android Studio) users:\n# Gradle settings configured through the IDE *will override*\n# any settings specified in this file.\n\n# For more details on how to configure your build environment visit\n# http://www.gradle.org/docs/current/userguide/build_environment.html\n\n# Specifies the JVM arguments used for the daemon process.\n# The setting is particularly useful for tweaking memory settings.\n# Default value: -Xmx512m -XX:MaxMetaspaceSize=256m\norg.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m\n\n# When configured, Gradle will run in incubating parallel mode.\n# This option should only be used with decoupled projects. More details, visit\n# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects\n# org.gradle.parallel=true\n\n# AndroidX package structure to make it clearer which packages are bundled with the\n# Android operating system, and which are packaged with your app's APK\n# https://developer.android.com/topic/libraries/support-library/androidx-rn\nandroid.useAndroidX=true\n\n# Use this property to specify which architecture you want to build.\n# You can also override it from the CLI using\n# ./gradlew <task> -PreactNativeArchitectures=x86_64\nreactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64\n\n# Use this property to enable support to the new architecture.\n# This will allow you to use TurboModules and the Fabric render in\n# your application. You should enable this flag either if you want\n# to write custom TurboModules/Fabric components OR use libraries that\n# are providing them.\nnewArchEnabled=true\n\n# Use this property to enable or disable the Hermes JS engine.\n# If set to false, you will be using JSC instead.\nhermesEnabled=true\n\n# Use this property to enable edge-to-edge display support.\n# This allows your app to draw behind system bars for an immersive UI.\n# Note: Only works with ReactActivity and should not be used with custom Activity.\nedgeToEdgeEnabled=false\n"
  },
  {
    "path": "apps/fabric-example/android/gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015 the original authors.\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#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# SPDX-License-Identifier: Apache-2.0\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd -P \"${APP_HOME:-./}\" > /dev/null && printf '%s\\n' \"$PWD\" ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    if ! command -v java >/dev/null 2>&1\n    then\n        die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC2039,SC3045\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command:\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,\n#     and any embedded shellness will be escaped.\n#   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be\n#     treated as '${Hostname}' itself on the command line.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -jar \"$APP_HOME/gradle/wrapper/gradle-wrapper.jar\" \\\n        \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n    die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "apps/fabric-example/android/gradlew.bat",
    "content": "@REM Copyright (c) Meta Platforms, Inc. and affiliates.\r\n@REM\r\n@REM This source code is licensed under the MIT license found in the\r\n@REM LICENSE file in the root directory of this source tree.\r\n\r\n@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n@rem SPDX-License-Identifier: Apache-2.0\r\n@rem\r\n\r\n@if \"%DEBUG%\"==\"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\r\n@rem This is normally unused\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif %ERRORLEVEL% equ 0 goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho. 1>&2\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2\r\necho. 1>&2\r\necho Please set the JAVA_HOME variable in your environment to match the 1>&2\r\necho location of your Java installation. 1>&2\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -jar \"%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\" %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif %ERRORLEVEL% equ 0 goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nset EXIT_CODE=%ERRORLEVEL%\r\nif %EXIT_CODE% equ 0 set EXIT_CODE=1\r\nif not \"\"==\"%GRADLE_EXIT_CONSOLE%\" exit %EXIT_CODE%\r\nexit /b %EXIT_CODE%\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "apps/fabric-example/android/settings.gradle",
    "content": "pluginManagement { includeBuild(\"../../../node_modules/@react-native/gradle-plugin\") }\nplugins { id(\"com.facebook.react.settings\") }\nextensions.configure(com.facebook.react.ReactSettingsExtension){ ex -> ex.autolinkLibrariesFromCommand() }\nrootProject.name = 'FabricExample'\ninclude ':app'\nincludeBuild('../../../node_modules/@react-native/gradle-plugin')\n"
  },
  {
    "path": "apps/fabric-example/app.json",
    "content": "{\n  \"name\": \"FabricExample\",\n  \"displayName\": \"FabricExample\"\n}\n"
  },
  {
    "path": "apps/fabric-example/babel.config.js",
    "content": "module.exports = function (api) {\n  api.cache(false);\n  return {\n    presets: ['module:@react-native/babel-preset'],\n    plugins: [\n      'react-native-worklets/plugin',\n      [\n        'module-resolver',\n        {\n          alias: {\n            'common-app': '../common-app',\n          },\n          extensions: [\n            '.js',\n            '.jsx',\n            '.ts',\n            '.tsx',\n            '.ios.js',\n            '.android.js',\n            '.json',\n            '.ios.ts',\n            '.android.ts',\n            '.ios.tsx',\n            '.android.tsx',\n          ],\n        },\n      ],\n    ],\n  };\n};\n"
  },
  {
    "path": "apps/fabric-example/index.js",
    "content": "import { AppRegistry } from 'react-native';\nimport App from './App';\nimport { name as appName } from './app.json';\n\nAppRegistry.registerComponent(appName, () => App);\n"
  },
  {
    "path": "apps/fabric-example/ios/.xcode.env",
    "content": "# This `.xcode.env` file is versioned and is used to source the environment\n# used when running script phases inside Xcode.\n# To customize your local environment, you can create an `.xcode.env.local`\n# file that is not versioned.\n\n# NODE_BINARY variable contains the PATH to the node executable.\n#\n# Customize the NODE_BINARY variable here.\n# For example, to use nvm with brew, add the following line\n# . \"$(brew --prefix nvm)/nvm.sh\" --no-use\nexport NODE_BINARY=$(command -v node)\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExample/AppDelegate.swift",
    "content": "import UIKit\nimport React\nimport React_RCTAppDelegate\nimport ReactAppDependencyProvider\n\n@main\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n  var window: UIWindow?\n\n  var reactNativeDelegate: ReactNativeDelegate?\n  var reactNativeFactory: RCTReactNativeFactory?\n\n  func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil\n  ) -> Bool {\n    let delegate = ReactNativeDelegate()\n    let factory = RCTReactNativeFactory(delegate: delegate)\n    delegate.dependencyProvider = RCTAppDependencyProvider()\n\n    reactNativeDelegate = delegate\n    reactNativeFactory = factory\n\n    window = UIWindow(frame: UIScreen.main.bounds)\n\n    factory.startReactNative(\n      withModuleName: \"FabricExample\",\n      in: window,\n      launchOptions: launchOptions\n    )\n\n    return true\n  }\n}\n\nclass ReactNativeDelegate: RCTDefaultReactNativeFactoryDelegate {\n  override func sourceURL(for bridge: RCTBridge) -> URL? {\n    self.bundleURL()\n  }\n\n  override func bundleURL() -> URL? {\n#if DEBUG\n    RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: \"index\")\n#else\n    Bundle.main.url(forResource: \"main\", withExtension: \"jsbundle\")\n#endif\n  }\n}\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExample/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"filename\" : \"AppIcon.png\",\n      \"idiom\" : \"universal\",\n      \"platform\" : \"ios\",\n      \"size\" : \"1024x1024\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExample/Images.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExample/Info.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>CADisableMinimumFrameDurationOnPhone</key>\n\t<true/>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>FabricExample</string>\n\t<key>CFBundleDocumentTypes</key>\n\t<array>\n\t\t<dict/>\n\t</array>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(MARKETING_VERSION)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSAllowsArbitraryLoads</key>\n\t\t<false/>\n\t\t<key>NSAllowsLocalNetworking</key>\n\t\t<true/>\n\t</dict>\n\t<key>NSLocationWhenInUseUsageDescription</key>\n\t<string></string>\n\t<key>NSMicrophoneUsageDescription</key>\n\t<string>$(PRODUCT_NAME) wants to access your microphone in order to use voice memo recording</string>\n\t<key>RCTNewArchEnabled</key>\n\t<true/>\n\t<key>UIBackgroundModes</key>\n\t<array>\n\t\t<string>audio</string>\n\t</array>\n\t<key>UILaunchStoryboardName</key>\n\t<string>LaunchScreen</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>arm64</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t</array>\n\t<key>UIViewControllerBasedStatusBarAppearance</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExample/LaunchScreen.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"15702\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n    <device id=\"retina4_7\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"15704\"/>\n        <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"EHf-IW-A2E\">\n            <objects>\n                <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"FabricExample\" textAlignment=\"center\" lineBreakMode=\"middleTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"18\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GJd-Yh-RWb\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"202\" width=\"375\" height=\"43\"/>\n                                <fontDescription key=\"fontDescription\" type=\"boldSystem\" pointSize=\"36\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <label opaque=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Powered by React Native\" textAlignment=\"center\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"9\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"MN2-I3-ftu\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"626\" width=\"375\" height=\"21\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                        </subviews>\n                        <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\" cocoaTouchSystemColor=\"whiteColor\"/>\n                        <constraints>\n                            <constraint firstItem=\"Bcu-3y-fUS\" firstAttribute=\"bottom\" secondItem=\"MN2-I3-ftu\" secondAttribute=\"bottom\" constant=\"20\" id=\"OZV-Vh-mqD\"/>\n                            <constraint firstItem=\"Bcu-3y-fUS\" firstAttribute=\"centerX\" secondItem=\"GJd-Yh-RWb\" secondAttribute=\"centerX\" id=\"Q3B-4B-g5h\"/>\n                            <constraint firstItem=\"MN2-I3-ftu\" firstAttribute=\"centerX\" secondItem=\"Bcu-3y-fUS\" secondAttribute=\"centerX\" id=\"akx-eg-2ui\"/>\n                            <constraint firstItem=\"MN2-I3-ftu\" firstAttribute=\"leading\" secondItem=\"Bcu-3y-fUS\" secondAttribute=\"leading\" id=\"i1E-0Y-4RG\"/>\n                            <constraint firstItem=\"GJd-Yh-RWb\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"bottom\" multiplier=\"1/3\" constant=\"1\" id=\"moa-c2-u7t\"/>\n                            <constraint firstItem=\"GJd-Yh-RWb\" firstAttribute=\"leading\" secondItem=\"Bcu-3y-fUS\" secondAttribute=\"leading\" symbolic=\"YES\" id=\"x7j-FC-K8j\"/>\n                        </constraints>\n                        <viewLayoutGuide key=\"safeArea\" id=\"Bcu-3y-fUS\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"52.173913043478265\" y=\"375\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExample/PrivacyInfo.xcprivacy",
    "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>NSPrivacyAccessedAPITypes</key>\n\t<array>\n\t\t<dict>\n\t\t\t<key>NSPrivacyAccessedAPIType</key>\n\t\t\t<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>\n\t\t\t<key>NSPrivacyAccessedAPITypeReasons</key>\n\t\t\t<array>\n\t\t\t\t<string>C617.1</string>\n\t\t\t</array>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>NSPrivacyAccessedAPIType</key>\n\t\t\t<string>NSPrivacyAccessedAPICategoryUserDefaults</string>\n\t\t\t<key>NSPrivacyAccessedAPITypeReasons</key>\n\t\t\t<array>\n\t\t\t\t<string>CA92.1</string>\n\t\t\t</array>\n\t\t</dict>\n\t\t<dict>\n\t\t\t<key>NSPrivacyAccessedAPIType</key>\n\t\t\t<string>NSPrivacyAccessedAPICategorySystemBootTime</string>\n\t\t\t<key>NSPrivacyAccessedAPITypeReasons</key>\n\t\t\t<array>\n\t\t\t\t<string>35F9.1</string>\n\t\t\t</array>\n\t\t</dict>\n\t</array>\n\t<key>NSPrivacyCollectedDataTypes</key>\n\t<array/>\n\t<key>NSPrivacyTracking</key>\n\t<false/>\n</dict>\n</plist>\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExample.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };\n\t\t37E5A2E11D84D7619ECAB4FD /* libPods-FabricExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E03ADA267568B5D61B986B06 /* libPods-FabricExample.a */; };\n\t\t56A4D8FCA4F4A4F4D6931F91 /* libPods-FabricExampleTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = CC5986FE0E14CB5D60FE16B1 /* libPods-FabricExampleTests.a */; };\n\t\t761780ED2CA45674006654EE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 761780EC2CA45674006654EE /* AppDelegate.swift */; };\n\t\t81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */; };\n\t\t88485BE83AA320DC6673875F /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */; };\n\t\tA1B2C3D41E00000100A0A001 /* AudioEngineTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3D61E00000100A0A001 /* AudioEngineTests.mm */; };\n\t\tA1B2C3E01E00000100A0A001 /* AudioSessionManagerTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3E11E00000100A0A001 /* AudioSessionManagerTests.mm */; };\n\t\tA1B2C3F01E00000100A0A001 /* SystemNotificationManagerTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C3F11E00000100A0A001 /* SystemNotificationManagerTests.mm */; };\n\t\tA1B2C4001E00000100A0A001 /* AudioPlayerTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C4011E00000100A0A001 /* AudioPlayerTests.mm */; };\n\t\tA1B2C4101E00000100A0A001 /* NativeAudioRecorderTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C4111E00000100A0A001 /* NativeAudioRecorderTests.mm */; };\n\t\tA1B2C4201E00000100A0A001 /* IOSAudioRecorderTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C4211E00000100A0A001 /* IOSAudioRecorderTests.mm */; };\n\t\tA1B2C4301E00000100A0A001 /* AudioAPIModuleTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = A1B2C4311E00000100A0A001 /* AudioAPIModuleTests.mm */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\tA1B2C3D91E00000100A0A001 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 13B07F861A680F5B00A75B9A;\n\t\t\tremoteInfo = FabricExample;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXFileReference section */\n\t\t13B07F961A680F5B00A75B9A /* FabricExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FabricExample.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = FabricExample/Images.xcassets; sourceTree = \"<group>\"; };\n\t\t13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = FabricExample/Info.plist; sourceTree = \"<group>\"; };\n\t\t13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = PrivacyInfo.xcprivacy; path = FabricExample/PrivacyInfo.xcprivacy; sourceTree = \"<group>\"; };\n\t\t1DBF465031DCC1262763C932 /* Pods-FabricExampleTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-FabricExampleTests.debug.xcconfig\"; path = \"Target Support Files/Pods-FabricExampleTests/Pods-FabricExampleTests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t3B4392A12AC88292D35C810B /* Pods-FabricExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-FabricExample.debug.xcconfig\"; path = \"Target Support Files/Pods-FabricExample/Pods-FabricExample.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t5709B34CF0A7D63546082F79 /* Pods-FabricExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-FabricExample.release.xcconfig\"; path = \"Target Support Files/Pods-FabricExample/Pods-FabricExample.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t761780EC2CA45674006654EE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AppDelegate.swift; path = FabricExample/AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = FabricExample/LaunchScreen.storyboard; sourceTree = \"<group>\"; };\n\t\t83D4BF4645ED53746187231E /* Pods-FabricExampleTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-FabricExampleTests.release.xcconfig\"; path = \"Target Support Files/Pods-FabricExampleTests/Pods-FabricExampleTests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tA1B2C3D51E00000100A0A001 /* FabricExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FabricExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tA1B2C3D61E00000100A0A001 /* AudioEngineTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AudioEngineTests.mm; sourceTree = \"<group>\"; };\n\t\tA1B2C3E11E00000100A0A001 /* AudioSessionManagerTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AudioSessionManagerTests.mm; sourceTree = \"<group>\"; };\n\t\tA1B2C3F11E00000100A0A001 /* SystemNotificationManagerTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = SystemNotificationManagerTests.mm; sourceTree = \"<group>\"; };\n\t\tA1B2C4011E00000100A0A001 /* AudioPlayerTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AudioPlayerTests.mm; sourceTree = \"<group>\"; };\n\t\tA1B2C4111E00000100A0A001 /* NativeAudioRecorderTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = NativeAudioRecorderTests.mm; sourceTree = \"<group>\"; };\n\t\tA1B2C4211E00000100A0A001 /* IOSAudioRecorderTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = IOSAudioRecorderTests.mm; sourceTree = \"<group>\"; };\n\t\tA1B2C4311E00000100A0A001 /* AudioAPIModuleTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AudioAPIModuleTests.mm; sourceTree = \"<group>\"; };\n\t\tCC5986FE0E14CB5D60FE16B1 /* libPods-FabricExampleTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-FabricExampleTests.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tE03ADA267568B5D61B986B06 /* libPods-FabricExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = \"libPods-FabricExample.a\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t37E5A2E11D84D7619ECAB4FD /* libPods-FabricExample.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tA1B2C3D71E00000100A0A001 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t56A4D8FCA4F4A4F4D6931F91 /* libPods-FabricExampleTests.a in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t13B07FAE1A68108700A75B9A /* FabricExample */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FB51A68108700A75B9A /* Images.xcassets */,\n\t\t\t\t761780EC2CA45674006654EE /* AppDelegate.swift */,\n\t\t\t\t13B07FB61A68108700A75B9A /* Info.plist */,\n\t\t\t\t81AB9BB72411601600AC10FF /* LaunchScreen.storyboard */,\n\t\t\t\t13B07FB81A68108700A75B9A /* PrivacyInfo.xcprivacy */,\n\t\t\t);\n\t\t\tname = FabricExample;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t2D16E6871FA4F8E400B85C8A /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tED297162215061F000B7C4FE /* JavaScriptCore.framework */,\n\t\t\t\tE03ADA267568B5D61B986B06 /* libPods-FabricExample.a */,\n\t\t\t\tCC5986FE0E14CB5D60FE16B1 /* libPods-FabricExampleTests.a */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t832341AE1AAA6A7D00B99B32 /* Libraries */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Libraries;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t83CBB9F61A601CBA00E9B192 = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07FAE1A68108700A75B9A /* FabricExample */,\n\t\t\t\tA1B2C3D81E00000100A0A001 /* FabricExampleTests */,\n\t\t\t\t832341AE1AAA6A7D00B99B32 /* Libraries */,\n\t\t\t\t83CBBA001A601CBA00E9B192 /* Products */,\n\t\t\t\t2D16E6871FA4F8E400B85C8A /* Frameworks */,\n\t\t\t\tBBD78D7AC51CEA395F1C20DB /* Pods */,\n\t\t\t);\n\t\t\tindentWidth = 2;\n\t\t\tsourceTree = \"<group>\";\n\t\t\ttabWidth = 2;\n\t\t\tusesTabs = 0;\n\t\t};\n\t\t83CBBA001A601CBA00E9B192 /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t13B07F961A680F5B00A75B9A /* FabricExample.app */,\n\t\t\t\tA1B2C3D51E00000100A0A001 /* FabricExampleTests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tA1B2C3D81E00000100A0A001 /* FabricExampleTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tA1B2C4211E00000100A0A001 /* IOSAudioRecorderTests.mm */,\n\t\t\t\tA1B2C4311E00000100A0A001 /* AudioAPIModuleTests.mm */,\n\t\t\t\tA1B2C4011E00000100A0A001 /* AudioPlayerTests.mm */,\n\t\t\t\tA1B2C3D61E00000100A0A001 /* AudioEngineTests.mm */,\n\t\t\t\tA1B2C4111E00000100A0A001 /* NativeAudioRecorderTests.mm */,\n\t\t\t\tA1B2C3E11E00000100A0A001 /* AudioSessionManagerTests.mm */,\n\t\t\t\tA1B2C3F11E00000100A0A001 /* SystemNotificationManagerTests.mm */,\n\t\t\t);\n\t\t\tpath = FabricExampleTests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tBBD78D7AC51CEA395F1C20DB /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3B4392A12AC88292D35C810B /* Pods-FabricExample.debug.xcconfig */,\n\t\t\t\t5709B34CF0A7D63546082F79 /* Pods-FabricExample.release.xcconfig */,\n\t\t\t\t1DBF465031DCC1262763C932 /* Pods-FabricExampleTests.debug.xcconfig */,\n\t\t\t\t83D4BF4645ED53746187231E /* Pods-FabricExampleTests.release.xcconfig */,\n\t\t\t);\n\t\t\tpath = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t00E356ED1AD99517003FC87E /* FabricExampleTests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = A1B2C3DF1E00000100A0A001 /* Build configuration list for PBXNativeTarget \"FabricExampleTests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tC06DC1B8C712A29FA16B0EA8 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\tA1B2C3DC1E00000100A0A001 /* Sources */,\n\t\t\t\tA1B2C3D71E00000100A0A001 /* Frameworks */,\n\t\t\t\tA1B2C3DB1E00000100A0A001 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tA1B2C3DA1E00000100A0A001 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = FabricExampleTests;\n\t\t\tproductName = FabricExampleTests;\n\t\t\tproductReference = A1B2C3D51E00000100A0A001 /* FabricExampleTests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\t13B07F861A680F5B00A75B9A /* FabricExample */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"FabricExample\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tC38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t13B07F871A680F5B00A75B9A /* Sources */,\n\t\t\t\t13B07F8C1A680F5B00A75B9A /* Frameworks */,\n\t\t\t\t13B07F8E1A680F5B00A75B9A /* Resources */,\n\t\t\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,\n\t\t\t\t00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */,\n\t\t\t\tE235C05ADACE081382539298 /* [CP] Copy Pods Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = FabricExample;\n\t\t\tproductName = FabricExample;\n\t\t\tproductReference = 13B07F961A680F5B00A75B9A /* FabricExample.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t83CBB9F71A601CBA00E9B192 /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastUpgradeCheck = 1210;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t00E356ED1AD99517003FC87E = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 16.0;\n\t\t\t\t\t\tTestTargetID = 13B07F861A680F5B00A75B9A;\n\t\t\t\t\t};\n\t\t\t\t\t13B07F861A680F5B00A75B9A = {\n\t\t\t\t\t\tLastSwiftMigration = 1120;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"FabricExample\" */;\n\t\t\tcompatibilityVersion = \"Xcode 12.0\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 83CBB9F61A601CBA00E9B192;\n\t\t\tproductRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t13B07F861A680F5B00A75B9A /* FabricExample */,\n\t\t\t\t00E356ED1AD99517003FC87E /* FabricExampleTests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t13B07F8E1A680F5B00A75B9A /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t81AB9BB82411601600AC10FF /* LaunchScreen.storyboard in Resources */,\n\t\t\t\t13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,\n\t\t\t\t88485BE83AA320DC6673875F /* PrivacyInfo.xcprivacy in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tA1B2C3DB1E00000100A0A001 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"$(SRCROOT)/.xcode.env.local\",\n\t\t\t\t\"$(SRCROOT)/.xcode.env\",\n\t\t\t);\n\t\t\tname = \"Bundle React Native code and images\";\n\t\t\toutputPaths = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"set -e\\n\\nWITH_ENVIRONMENT=\\\"$REACT_NATIVE_PATH/scripts/xcode/with-environment.sh\\\"\\nREACT_NATIVE_XCODE=\\\"$REACT_NATIVE_PATH/scripts/react-native-xcode.sh\\\"\\n\\n/bin/sh -c \\\"$WITH_ENVIRONMENT $REACT_NATIVE_XCODE\\\"\\n\";\n\t\t};\n\t\t00EEFC60759A1932668264C0 /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-frameworks-${CONFIGURATION}-input-files.xcfilelist\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-frameworks-${CONFIGURATION}-output-files.xcfilelist\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tC06DC1B8C712A29FA16B0EA8 /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-FabricExampleTests-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tC38B50BA6285516D6DCD4F65 /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-FabricExample-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tE235C05ADACE081382539298 /* [CP] Copy Pods Resources */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-resources-${CONFIGURATION}-input-files.xcfilelist\",\n\t\t\t);\n\t\t\tname = \"[CP] Copy Pods Resources\";\n\t\t\toutputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-resources-${CONFIGURATION}-output-files.xcfilelist\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-FabricExample/Pods-FabricExample-resources.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t13B07F871A680F5B00A75B9A /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t761780ED2CA45674006654EE /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tA1B2C3DC1E00000100A0A001 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tA1B2C4201E00000100A0A001 /* IOSAudioRecorderTests.mm in Sources */,\n\t\t\t\tA1B2C4301E00000100A0A001 /* AudioAPIModuleTests.mm in Sources */,\n\t\t\t\tA1B2C4001E00000100A0A001 /* AudioPlayerTests.mm in Sources */,\n\t\t\t\tA1B2C3D41E00000100A0A001 /* AudioEngineTests.mm in Sources */,\n\t\t\t\tA1B2C4101E00000100A0A001 /* NativeAudioRecorderTests.mm in Sources */,\n\t\t\t\tA1B2C3E01E00000100A0A001 /* AudioSessionManagerTests.mm in Sources */,\n\t\t\t\tA1B2C3F01E00000100A0A001 /* SystemNotificationManagerTests.mm in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\tA1B2C3DA1E00000100A0A001 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 13B07F861A680F5B00A75B9A /* FabricExample */;\n\t\t\ttargetProxy = A1B2C3D91E00000100A0A001 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t13B07F941A680F5B00A75B9A /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 3B4392A12AC88292D35C810B /* Pods-FabricExample.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_TEAM = WC59N2X3FV;\n\t\t\t\tENABLE_BITCODE = NO;\n\t\t\t\tINFOPLIST_FILE = FabricExample/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/swift\",\n\t\t\t\t\t\"$(SDKROOT)/System/iOSSupport/usr/lib/swift\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"fdsfsdfsdcom-eseg3222233er.--PRODUCT-NAME-rfc1034identifier-\";\n\t\t\t\tPRODUCT_NAME = FabricExample;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphoneos iphonesimulator\";\n\t\t\t\tSUPPORTS_MACCATALYST = NO;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t13B07F951A680F5B00A75B9A /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 5709B34CF0A7D63546082F79 /* Pods-FabricExample.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEAD_CODE_STRIPPING = YES;\n\t\t\t\tDEVELOPMENT_TEAM = WC59N2X3FV;\n\t\t\t\tINFOPLIST_FILE = FabricExample/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/usr/lib/swift\",\n\t\t\t\t\t\"$(SDKROOT)/System/iOSSupport/usr/lib/swift\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t\t\"-lc++\",\n\t\t\t\t);\n\t\t\t\tPRESERVE_DEAD_CODE_INITS_AND_TERMS = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"fdsfsdfsdcom-eseg3222233er.--PRODUCT-NAME-rfc1034identifier-\";\n\t\t\t\tPRODUCT_NAME = FabricExample;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphoneos iphonesimulator\";\n\t\t\t\tSUPPORTS_MACCATALYST = NO;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t83CBBA201A601CBA00E9B192 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"c++20\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\t\"EXCLUDED_ARCHS[sdk=iphonesimulator*]\" = \"\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/React-runtimeexecutor/React_runtimeexecutor.framework/Headers\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/React-runtimeexecutor/React_runtimeexecutor.framework/Headers/platform/ios\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers/platform/ios\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/view/platform/cxx\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\",\n\t\t\t\t);\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t/usr/lib/swift,\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SDKROOT)/usr/lib/swift\\\"\",\n\t\t\t\t\t\"\\\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\\\"\",\n\t\t\t\t\t\"\\\"$(inherited)\\\"\",\n\t\t\t\t);\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-DRCT_REMOVE_LEGACY_ARCH=1\",\n\t\t\t\t);\n\t\t\t\tOTHER_CPLUSPLUSFLAGS = (\n\t\t\t\t\t\"$(OTHER_CFLAGS)\",\n\t\t\t\t\t\"-DFOLLY_NO_CONFIG\",\n\t\t\t\t\t\"-DFOLLY_MOBILE=1\",\n\t\t\t\t\t\"-DFOLLY_USE_LIBCPP=1\",\n\t\t\t\t\t\"-DFOLLY_CFG_NO_COROUTINES=1\",\n\t\t\t\t\t\"-DFOLLY_HAVE_CLOCK_GETTIME=1\",\n\t\t\t\t\t\"-DRCT_REMOVE_LEGACY_ARCH=1\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\" \",\n\t\t\t\t);\n\t\t\t\tREACT_NATIVE_PATH = \"${PODS_ROOT}/../../../../node_modules/react-native\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = \"$(inherited) DEBUG\";\n\t\t\t\tSWIFT_ENABLE_EXPLICIT_MODULES = NO;\n\t\t\t\tUSE_HERMES = true;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t83CBBA211A601CBA00E9B192 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"c++20\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\t\"CODE_SIGN_IDENTITY[sdk=iphoneos*]\" = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = YES;\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\t\"EXCLUDED_ARCHS[sdk=iphonesimulator*]\" = \"\";\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tHEADER_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon/ReactCommon.framework/Headers/react/nativemodule/core\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/React-runtimeexecutor/React_runtimeexecutor.framework/Headers\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/React-runtimeexecutor/React_runtimeexecutor.framework/Headers/platform/ios\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/ReactCommon-Samples/ReactCommon_Samples.framework/Headers/platform/ios\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/React-Fabric/React_Fabric.framework/Headers/react/renderer/components/view/platform/cxx\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/React-NativeModulesApple/React_NativeModulesApple.framework/Headers\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers\",\n\t\t\t\t\t\"${PODS_CONFIGURATION_BUILD_DIR}/React-graphics/React_graphics.framework/Headers/react/renderer/graphics/platform/ios\",\n\t\t\t\t);\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t/usr/lib/swift,\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tLIBRARY_SEARCH_PATHS = (\n\t\t\t\t\t\"\\\"$(SDKROOT)/usr/lib/swift\\\"\",\n\t\t\t\t\t\"\\\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\\\"\",\n\t\t\t\t\t\"\\\"$(inherited)\\\"\",\n\t\t\t\t);\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tOTHER_CFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-DRCT_REMOVE_LEGACY_ARCH=1\",\n\t\t\t\t);\n\t\t\t\tOTHER_CPLUSPLUSFLAGS = (\n\t\t\t\t\t\"$(OTHER_CFLAGS)\",\n\t\t\t\t\t\"-DFOLLY_NO_CONFIG\",\n\t\t\t\t\t\"-DFOLLY_MOBILE=1\",\n\t\t\t\t\t\"-DFOLLY_USE_LIBCPP=1\",\n\t\t\t\t\t\"-DFOLLY_CFG_NO_COROUTINES=1\",\n\t\t\t\t\t\"-DFOLLY_HAVE_CLOCK_GETTIME=1\",\n\t\t\t\t\t\"-DRCT_REMOVE_LEGACY_ARCH=1\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\" \",\n\t\t\t\t);\n\t\t\t\tREACT_NATIVE_PATH = \"${PODS_ROOT}/../../../../node_modules/react-native\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ENABLE_EXPLICIT_MODULES = NO;\n\t\t\t\tUSE_HERMES = true;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tA1B2C3DD1E00000100A0A001 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 1DBF465031DCC1262763C932 /* Pods-FabricExampleTests.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEVELOPMENT_TEAM = WC59N2X3FV;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.reactnativeaudioapi.fabricexampleTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphoneos iphonesimulator\";\n\t\t\t\tSUPPORTS_MACCATALYST = NO;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/FabricExample.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/FabricExample\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tA1B2C3DE1E00000100A0A001 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 83D4BF4645ED53746187231E /* Pods-FabricExampleTests.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tBUNDLE_LOADER = \"$(TEST_HOST)\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEVELOPMENT_TEAM = WC59N2X3FV;\n\t\t\t\tGENERATE_INFOPLIST_FILE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 15.1;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = com.reactnativeaudioapi.fabricexampleTests;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphoneos iphonesimulator\";\n\t\t\t\tSUPPORTS_MACCATALYST = NO;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tTEST_HOST = \"$(BUILT_PRODUCTS_DIR)/FabricExample.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/FabricExample\";\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget \"FabricExample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t13B07F941A680F5B00A75B9A /* Debug */,\n\t\t\t\t13B07F951A680F5B00A75B9A /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject \"FabricExample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t83CBBA201A601CBA00E9B192 /* Debug */,\n\t\t\t\t83CBBA211A601CBA00E9B192 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tA1B2C3DF1E00000100A0A001 /* Build configuration list for PBXNativeTarget \"FabricExampleTests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tA1B2C3DD1E00000100A0A001 /* Debug */,\n\t\t\t\tA1B2C3DE1E00000100A0A001 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;\n}\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExample.xcodeproj/xcshareddata/xcschemes/FabricExample.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1210\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n               BuildableName = \"FabricExample.app\"\n               BlueprintName = \"FabricExample\"\n               ReferencedContainer = \"container:FabricExample.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      codeCoverageEnabled = \"YES\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"00E356ED1AD99517003FC87E\"\n               BuildableName = \"FabricExampleTests.xctest\"\n               BlueprintName = \"FabricExampleTests\"\n               ReferencedContainer = \"container:FabricExample.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"FabricExample.app\"\n            BlueprintName = \"FabricExample\"\n            ReferencedContainer = \"container:FabricExample.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <BuildableProductRunnable\n         runnableDebuggingMode = \"0\">\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"13B07F861A680F5B00A75B9A\"\n            BuildableName = \"FabricExample.app\"\n            BlueprintName = \"FabricExample\"\n            ReferencedContainer = \"container:FabricExample.xcodeproj\">\n         </BuildableReference>\n      </BuildableProductRunnable>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExample.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:FabricExample.xcodeproj\">\n   </FileRef>\n   <FileRef\n      location = \"group:Pods/Pods.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExampleTests/AudioAPIModuleTests.mm",
    "content": "#import <XCTest/XCTest.h>\n\n#import <audioapi/ios/AudioAPIModule.h>\n#import <audioapi/ios/system/AudioEngine.h>\n#import <audioapi/ios/system/AudioSessionManager.h>\n\n@interface AudioAPIModule (TestingPrivate)\n\n- (void)setAudioSessionActivity:(BOOL)enabled\n                        resolve:(RCTPromiseResolveBlock)resolve\n                         reject:(RCTPromiseRejectBlock)reject;\n\n@end\n\nstatic void AppendAudioModuleEvent(NSMutableArray<NSString *> *eventLog, NSString *event)\n{\n  @synchronized(eventLog) {\n    [eventLog addObject:event];\n  }\n}\n\nstatic NSArray<NSString *> *CopyAudioModuleEvents(NSMutableArray<NSString *> *eventLog)\n{\n  @synchronized(eventLog) {\n    return [eventLog copy];\n  }\n}\n\n@interface FakeAudioAPIModuleEngine : AudioEngine\n\n@property(nonatomic, assign) NSInteger onSessionDeactivatedCallCount;\n@property(nonatomic, strong) NSMutableArray<NSString *> *eventLog;\n\n@end\n\n@implementation FakeAudioAPIModuleEngine\n\n- (void)createAudioEngineIfNeeded\n{\n  // Avoid spinning up a real AVAudioEngine for module unit tests.\n}\n\n- (void)onSessionDeactivated\n{\n  self.onSessionDeactivatedCallCount += 1;\n  AppendAudioModuleEvent(self.eventLog, @\"onSessionDeactivated\");\n}\n\n@end\n\n@interface FakeAudioAPIModuleSessionManager : AudioSessionManager\n\n@property(nonatomic, assign) NSInteger setActiveCallCount;\n@property(nonatomic, assign) NSInteger markInactiveCallCount;\n@property(nonatomic, assign) BOOL lastSetActiveValue;\n@property(nonatomic, strong) NSMutableArray<NSString *> *eventLog;\n\n@end\n\n@implementation FakeAudioAPIModuleSessionManager\n\n- (bool)setActive:(bool)active error:(NSError **)error\n{\n  self.setActiveCallCount += 1;\n  self.lastSetActiveValue = active;\n  self.isActive = active;\n  AppendAudioModuleEvent(self.eventLog, @\"setActive\");\n\n  if (error != nil) {\n    *error = nil;\n  }\n\n  return true;\n}\n\n- (void)markInactive\n{\n  self.markInactiveCallCount += 1;\n  self.isActive = false;\n  AppendAudioModuleEvent(self.eventLog, @\"markInactive\");\n}\n\n@end\n\n@interface AudioAPIModuleTests : XCTestCase\n\n@property(nonatomic, strong) AudioAPIModule *module;\n@property(nonatomic, strong) FakeAudioAPIModuleEngine *fakeAudioEngine;\n@property(nonatomic, strong) FakeAudioAPIModuleSessionManager *fakeSessionManager;\n@property(nonatomic, strong) NSMutableArray<NSString *> *eventLog;\n\n@end\n\n@implementation AudioAPIModuleTests\n\n- (void)setUp\n{\n  [super setUp];\n\n  self.eventLog = [[NSMutableArray alloc] init];\n  self.module = [[AudioAPIModule alloc] init];\n  self.fakeAudioEngine = [[FakeAudioAPIModuleEngine alloc] init];\n  self.fakeAudioEngine.eventLog = self.eventLog;\n  self.fakeSessionManager = [[FakeAudioAPIModuleSessionManager alloc] init];\n  self.fakeSessionManager.eventLog = self.eventLog;\n  self.module.audioEngine = self.fakeAudioEngine;\n  self.module.audioSessionManager = self.fakeSessionManager;\n}\n\n- (void)tearDown\n{\n  [self.fakeAudioEngine cleanup];\n  [self.fakeSessionManager cleanup];\n\n  self.module = nil;\n  self.fakeAudioEngine = nil;\n  self.fakeSessionManager = nil;\n  self.eventLog = nil;\n\n  [super tearDown];\n}\n\n- (void)testSetAudioSessionActivityFalseWaitsForSessionDeactivationBeforeResolve\n{\n  XCTestExpectation *resolveExpectation = [self expectationWithDescription:@\"setAudioSessionActivity\"];\n  __block NSArray<NSString *> *eventsAtResolve = nil;\n  __block NSString *rejectionCode = nil;\n  NSMutableArray<NSString *> *eventLog = self.eventLog;\n\n  [self.module setAudioSessionActivity:NO\n                               resolve:^(id result) {\n                                 AppendAudioModuleEvent(eventLog, @\"resolve\");\n                                 eventsAtResolve = CopyAudioModuleEvents(eventLog);\n                                 XCTAssertEqualObjects(result, @YES);\n                                 [resolveExpectation fulfill];\n                               }\n                                reject:^(NSString *code, NSString *message, NSError *error) {\n                                  rejectionCode = code;\n                                  [resolveExpectation fulfill];\n                                }];\n\n  [self waitForExpectations:@[ resolveExpectation ] timeout:1.0];\n\n  XCTAssertNil(rejectionCode);\n  XCTAssertEqual(self.fakeSessionManager.setActiveCallCount, 1);\n  XCTAssertFalse(self.fakeSessionManager.lastSetActiveValue);\n  XCTAssertEqual(self.fakeSessionManager.markInactiveCallCount, 1);\n  XCTAssertEqual(self.fakeAudioEngine.onSessionDeactivatedCallCount, 1);\n  XCTAssertFalse(self.fakeSessionManager.isActive);\n  XCTAssertEqualObjects(\n      eventsAtResolve,\n      (@[ @\"setActive\", @\"markInactive\", @\"onSessionDeactivated\", @\"resolve\" ]));\n}\n\n@end\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExampleTests/AudioEngineTests.mm",
    "content": "#import <XCTest/XCTest.h>\n\n#import <audioapi/ios/system/AudioEngine.h>\n#import <audioapi/ios/system/AudioSessionManager.h>\n\n@interface AudioEngine (TestingPrivate)\n\n- (void)createAudioEngineIfNeeded;\n\n@end\n\n@interface FakeAudioInputNode : NSObject\n\n@property(nonatomic, strong) AVAudioFormat *outputFormat;\n\n- (instancetype)initWithOutputFormat:(AVAudioFormat *)outputFormat;\n- (AVAudioFormat *)outputFormatForBus:(AVAudioNodeBus)bus;\n\n@end\n\n@implementation FakeAudioInputNode\n\n- (instancetype)initWithOutputFormat:(AVAudioFormat *)outputFormat {\n  if (self = [super init]) {\n    self.outputFormat = outputFormat;\n  }\n\n  return self;\n}\n\n- (AVAudioFormat *)outputFormatForBus:(AVAudioNodeBus)bus {\n  return self.outputFormat;\n}\n\n@end\n\n@interface FakeAudioEngine : AVAudioEngine\n\n@property(nonatomic, assign) BOOL fakeRunning;\n@property(nonatomic, strong) NSError *startError;\n@property(nonatomic, assign) NSInteger attachNodeCallCount;\n@property(nonatomic, assign) NSInteger detachNodeCallCount;\n@property(nonatomic, assign) NSInteger connectCallCount;\n@property(nonatomic, assign) NSInteger prepareCallCount;\n@property(nonatomic, assign) NSInteger startCallCount;\n@property(nonatomic, assign) NSInteger stopCallCount;\n@property(nonatomic, assign) NSInteger pauseCallCount;\n@property(nonatomic, assign) NSInteger resetCallCount;\n@property(nonatomic, strong)\n    NSMutableArray<AVAudioNode *> *recordedAttachedNodes;\n@property(nonatomic, strong)\n    NSMutableArray<AVAudioNode *> *recordedDetachedNodes;\n@property(nonatomic, strong) NSMutableArray<NSDictionary *> *connections;\n@property(nonatomic, strong) AVAudioNode *fakeMainMixerNode;\n@property(nonatomic, strong) FakeAudioInputNode *fakeInputNode;\n\n- (instancetype)initWithInputFormat:(AVAudioFormat *)inputFormat;\n\n@end\n\n@implementation FakeAudioEngine\n\n- (instancetype)init {\n  return [self initWithInputFormat:nil];\n}\n\n- (instancetype)initWithInputFormat:(AVAudioFormat *)inputFormat {\n  if (self = [super init]) {\n    self.recordedAttachedNodes = [[NSMutableArray alloc] init];\n    self.recordedDetachedNodes = [[NSMutableArray alloc] init];\n    self.connections = [[NSMutableArray alloc] init];\n    self.fakeMainMixerNode = [[AVAudioMixerNode alloc] init];\n    self.fakeInputNode =\n        [[FakeAudioInputNode alloc] initWithOutputFormat:inputFormat];\n  }\n\n  return self;\n}\n\n- (BOOL)isRunning {\n  return self.fakeRunning;\n}\n\n- (AVAudioMixerNode *)mainMixerNode {\n  return (AVAudioMixerNode *)self.fakeMainMixerNode;\n}\n\n- (AVAudioInputNode *)inputNode {\n  return (AVAudioInputNode *)self.fakeInputNode;\n}\n\n- (void)attachNode:(AVAudioNode *)node {\n  self.attachNodeCallCount += 1;\n  [self.recordedAttachedNodes addObject:node];\n}\n\n- (void)detachNode:(AVAudioNode *)node {\n  self.detachNodeCallCount += 1;\n  [self.recordedDetachedNodes addObject:node];\n}\n\n- (void)connect:(AVAudioNode *)node1\n             to:(AVAudioNode *)node2\n         format:(AVAudioFormat *)format {\n  self.connectCallCount += 1;\n  [self.connections addObject:@{\n    @\"from\" : node1,\n    @\"to\" : node2,\n    @\"format\" : format ?: [NSNull null],\n  }];\n}\n\n- (void)prepare {\n  self.prepareCallCount += 1;\n}\n\n- (BOOL)startAndReturnError:(NSError **)outError {\n  self.startCallCount += 1;\n\n  if (outError != nil) {\n    *outError = self.startError;\n  }\n\n  self.fakeRunning = self.startError == nil;\n  return self.startError == nil;\n}\n\n- (void)stop {\n  self.stopCallCount += 1;\n  self.fakeRunning = NO;\n}\n\n- (void)pause {\n  self.pauseCallCount += 1;\n  self.fakeRunning = NO;\n}\n\n- (void)reset {\n  self.resetCallCount += 1;\n}\n\n@end\n\n@interface FakeAudioSessionManager : AudioSessionManager\n\n@property(nonatomic, assign) BOOL ensureActiveResult;\n@property(nonatomic, strong) NSError *ensureActiveFailure;\n@property(nonatomic, assign) NSInteger ensureActiveCallCount;\n@property(nonatomic, assign) NSInteger setActiveCallCount;\n@property(nonatomic, assign) BOOL lastEnsureActiveForce;\n@property(nonatomic, assign) BOOL lastSetActiveValue;\n\n@end\n\n@implementation FakeAudioSessionManager\n\n- (instancetype)init {\n  if (self = [super init]) {\n    self.ensureActiveResult = YES;\n  }\n\n  return self;\n}\n\n- (bool)ensureActive:(bool)force error:(NSError **)error {\n  self.ensureActiveCallCount += 1;\n  self.lastEnsureActiveForce = force;\n\n  if (!self.ensureActiveResult && error != nil) {\n    *error = self.ensureActiveFailure;\n  } else if (error != nil) {\n    *error = nil;\n  }\n\n  if (self.ensureActiveResult) {\n    self.isActive = true;\n  }\n\n  return self.ensureActiveResult;\n}\n\n- (bool)setActive:(bool)active error:(NSError **)error {\n  self.setActiveCallCount += 1;\n  self.lastSetActiveValue = active;\n\n  if (error != nil) {\n    *error = nil;\n  }\n\n  self.isActive = active;\n  return true;\n}\n\n@end\n\n@interface TestableAudioEngine : AudioEngine\n\n@property(nonatomic, strong)\n    NSMutableArray<FakeAudioEngine *> *createdFakeEngines;\n@property(nonatomic, strong) NSError *nextCreatedEngineStartError;\n@property(nonatomic, strong) AVAudioFormat *defaultCreatedEngineInputFormat;\n@property(nonatomic, strong) AVAudioFormat *nextCreatedEngineInputFormat;\n\n- (FakeAudioEngine *)currentFakeAudioEngine;\n\n@end\n\n@implementation TestableAudioEngine\n\n- (instancetype)init {\n  if (self = [super init]) {\n    if (self.createdFakeEngines == nil) {\n      self.createdFakeEngines = [[NSMutableArray alloc] init];\n    }\n  }\n\n  return self;\n}\n\n- (void)createAudioEngineIfNeeded {\n  if (self.audioEngine != nil) {\n    return;\n  }\n\n  if (self.createdFakeEngines == nil) {\n    self.createdFakeEngines = [[NSMutableArray alloc] init];\n  }\n\n  AVAudioFormat *inputFormat =\n      self.nextCreatedEngineInputFormat ?: self.defaultCreatedEngineInputFormat;\n  self.nextCreatedEngineInputFormat = nil;\n\n  FakeAudioEngine *engine =\n      [[FakeAudioEngine alloc] initWithInputFormat:inputFormat];\n  engine.startError = self.nextCreatedEngineStartError;\n  self.nextCreatedEngineStartError = nil;\n  [self.createdFakeEngines addObject:engine];\n  self.audioEngine = engine;\n}\n\n- (FakeAudioEngine *)currentFakeAudioEngine {\n  return (FakeAudioEngine *)self.audioEngine;\n}\n\n@end\n\n@interface AudioEngineTests : XCTestCase\n\n@property(nonatomic, strong) TestableAudioEngine *audioEngine;\n@property(nonatomic, strong) FakeAudioSessionManager *sessionManager;\n\n@end\n\n@implementation AudioEngineTests\n\n- (void)setUp {\n  [super setUp];\n\n  self.audioEngine = [[TestableAudioEngine alloc] init];\n  AVAudioFormat *inputFormat = [self testInputFormat];\n  self.audioEngine.defaultCreatedEngineInputFormat = inputFormat;\n  self.audioEngine.currentFakeAudioEngine.fakeInputNode.outputFormat =\n      inputFormat;\n  self.sessionManager = [[FakeAudioSessionManager alloc] init];\n  self.audioEngine.sessionManager = self.sessionManager;\n}\n\n- (void)tearDown {\n  [self.audioEngine cleanup];\n  self.audioEngine = nil;\n  self.sessionManager = nil;\n\n  [super tearDown];\n}\n\n- (AVAudioFormat *)testFormat {\n  return [[AVAudioFormat alloc] initStandardFormatWithSampleRate:44100\n                                                        channels:2];\n}\n\n- (AVAudioFormat *)testInputFormat {\n  return [self testInputFormatWithSampleRate:44100 channelCount:1];\n}\n\n- (AVAudioFormat *)testInputFormatWithSampleRate:(double)sampleRate\n                                    channelCount:\n                                        (AVAudioChannelCount)channelCount {\n  return [[AVAudioFormat alloc] initStandardFormatWithSampleRate:sampleRate\n                                                        channels:channelCount];\n}\n\n- (AVAudioSourceNode *)testSourceNode {\n  return [[AVAudioSourceNode alloc]\n      initWithRenderBlock:^OSStatus(\n          BOOL *isSilence, const AudioTimeStamp *timestamp,\n          AVAudioFrameCount frameCount, AudioBufferList *outputData) {\n        if (isSilence != nil) {\n          *isSilence = YES;\n        }\n\n        return noErr;\n      }];\n}\n\n- (AVAudioSourceNodeRenderBlock)testSourceRenderBlock {\n  return ^OSStatus(BOOL *isSilence, const AudioTimeStamp *timestamp,\n                   AVAudioFrameCount frameCount, AudioBufferList *outputData) {\n    if (isSilence != nil) {\n      *isSilence = YES;\n    }\n\n    return noErr;\n  };\n}\n\n- (AVAudioSinkNodeReceiverBlock)testInputReceiverBlock {\n  return ^OSStatus(const AudioTimeStamp *timestamp,\n                   AVAudioFrameCount frameCount,\n                   const AudioBufferList *inputData) {\n    return noErr;\n  };\n}\n\n- (NSString *)attachSourceNodeToAudioEngine {\n  return [self.audioEngine\n      attachSourceNodeWithRenderBlock:[self testSourceRenderBlock]\n                           sampleRate:44100\n                         channelCount:2];\n}\n\n- (void)testCleanupDestroysInternalEngineAndResetsStateAndDeactivatesSession {\n  [self attachSourceNodeToAudioEngine];\n  self.audioEngine.graphNeedsRebuild = YES;\n\n  [self.audioEngine cleanup];\n\n  XCTAssertNil(self.audioEngine.audioEngine);\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateIdle);\n  XCTAssertNil(self.audioEngine.sourceNodes);\n  XCTAssertNil(self.audioEngine.sourceFormats);\n  XCTAssertNil(self.audioEngine.inputNode);\n  XCTAssertFalse(self.audioEngine.graphNeedsRebuild);\n  XCTAssertFalse(self.audioEngine.sessionDeactivationInvalidatedGraph);\n  XCTAssertEqual(self.sessionManager.setActiveCallCount, 1);\n  XCTAssertFalse(self.sessionManager.lastSetActiveValue);\n}\n\n- (void)testGetStateAndIsEngineRunningReflectUnderlyingEngine {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n\n  XCTAssertEqual([self.audioEngine getState], AudioEngineStateIdle);\n  XCTAssertFalse([self.audioEngine isEngineRunning]);\n\n  fakeEngine.fakeRunning = YES;\n  self.audioEngine.state = AudioEngineStateRunning;\n\n  XCTAssertEqual([self.audioEngine getState], AudioEngineStateRunning);\n  XCTAssertTrue([self.audioEngine isEngineRunning]);\n\n  self.audioEngine.audioEngine = nil;\n  XCTAssertFalse([self.audioEngine isEngineRunning]);\n}\n\n- (void)testAttachSourceNodeStoresAndConnectsSource {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  NSString *sourceNodeId = [self.audioEngine\n      attachSourceNodeWithRenderBlock:[self testSourceRenderBlock]\n                           sampleRate:44100\n                         channelCount:2];\n  AVAudioSourceNode *sourceNode = self.audioEngine.sourceNodes[sourceNodeId];\n  AVAudioFormat *format = self.audioEngine.sourceFormats[sourceNodeId];\n\n  XCTAssertNotNil(sourceNodeId);\n  XCTAssertEqual(self.audioEngine.sourceNodes.count, 1UL);\n  XCTAssertEqual(self.audioEngine.sourceFormats.count, 1UL);\n  XCTAssertNotNil(sourceNode);\n  XCTAssertNotNil(format);\n  XCTAssertEqualWithAccuracy(format.sampleRate, 44100.0, 0.001);\n  XCTAssertEqual(format.channelCount, 2U);\n  XCTAssertEqual(fakeEngine.attachNodeCallCount, 1);\n  XCTAssertEqual(fakeEngine.connectCallCount, 1);\n  XCTAssertEqualObjects(fakeEngine.recordedAttachedNodes.firstObject,\n                        sourceNode);\n  XCTAssertEqualObjects(fakeEngine.connections.firstObject[@\"from\"],\n                        sourceNode);\n  XCTAssertEqualObjects(fakeEngine.connections.firstObject[@\"to\"],\n                        fakeEngine.mainMixerNode);\n  XCTAssertEqualObjects(fakeEngine.connections.firstObject[@\"format\"], format);\n}\n\n- (void)testDetachSourceNodeWithUnknownIdDoesNothing {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n\n  [self.audioEngine detachSourceNodeWithId:@\"missing-source\"];\n\n  XCTAssertEqual(fakeEngine.detachNodeCallCount, 0);\n  XCTAssertEqual(self.audioEngine.sourceNodes.count, 0UL);\n  XCTAssertEqual(self.audioEngine.sourceFormats.count, 0UL);\n}\n\n- (void)testDetachSourceNodeRemovesTrackedNodeAndClearsGraphWhenEmpty {\n  NSString *sourceNodeId = [self attachSourceNodeToAudioEngine];\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  AVAudioSourceNode *sourceNode = self.audioEngine.sourceNodes[sourceNodeId];\n  self.audioEngine.graphNeedsRebuild = YES;\n\n  [self.audioEngine detachSourceNodeWithId:sourceNodeId];\n\n  XCTAssertNil(self.audioEngine.sourceNodes[sourceNodeId]);\n  XCTAssertNil(self.audioEngine.sourceFormats[sourceNodeId]);\n  XCTAssertEqual(fakeEngine.detachNodeCallCount, 1);\n  XCTAssertEqualObjects(fakeEngine.recordedDetachedNodes.firstObject,\n                        sourceNode);\n  XCTAssertFalse(self.audioEngine.graphNeedsRebuild);\n}\n\n- (void)testDetachSourceNodeKeepsGraphNeedsRebuildWhenInputRemains {\n  NSString *sourceNodeId = [self attachSourceNodeToAudioEngine];\n  [self.audioEngine\n      attachInputNodeWithReceiverBlock:[self testInputReceiverBlock]];\n  self.audioEngine.graphNeedsRebuild = YES;\n\n  [self.audioEngine detachSourceNodeWithId:sourceNodeId];\n\n  XCTAssertEqual(self.audioEngine.sourceNodes.count, 0UL);\n  XCTAssertNotNil(self.audioEngine.inputNode);\n  XCTAssertTrue(self.audioEngine.graphNeedsRebuild);\n}\n\n- (void)testAttachInputNodeStoresAndConnectsInput {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  [self.audioEngine\n      attachInputNodeWithReceiverBlock:[self testInputReceiverBlock]];\n\n  AVAudioSinkNode *inputNode = self.audioEngine.inputNode;\n  XCTAssertNotNil(inputNode);\n  XCTAssertEqual(fakeEngine.attachNodeCallCount, 1);\n  XCTAssertEqual(fakeEngine.connectCallCount, 1);\n  XCTAssertEqualObjects(fakeEngine.recordedAttachedNodes.firstObject,\n                        inputNode);\n  XCTAssertEqualObjects(fakeEngine.connections.firstObject[@\"from\"],\n                        fakeEngine.inputNode);\n  XCTAssertEqualObjects(fakeEngine.connections.firstObject[@\"to\"], inputNode);\n  XCTAssertEqualObjects(fakeEngine.connections.firstObject[@\"format\"],\n                        fakeEngine.fakeInputNode.outputFormat);\n}\n\n- (void)testAttachInputNodeDefersConnectionUntilLiveInputFormatIsAvailable {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  fakeEngine.fakeInputNode.outputFormat = nil;\n\n  [self.audioEngine\n      attachInputNodeWithReceiverBlock:[self testInputReceiverBlock]];\n\n  XCTAssertNil(self.audioEngine.inputNode);\n  XCTAssertEqual(fakeEngine.attachNodeCallCount, 0);\n  XCTAssertEqual(fakeEngine.connectCallCount, 0);\n\n  AVAudioFormat *liveInputFormat = [self testInputFormat];\n  fakeEngine.fakeInputNode.outputFormat = liveInputFormat;\n\n  XCTAssertTrue([self.audioEngine startIfNecessary]);\n  XCTAssertNotNil(self.audioEngine.inputNode);\n  XCTAssertEqual(fakeEngine.attachNodeCallCount, 1);\n  XCTAssertEqual(fakeEngine.connectCallCount, 1);\n  XCTAssertEqualObjects(fakeEngine.connections.firstObject[@\"format\"],\n                        liveInputFormat);\n}\n\n- (void)testDetachInputNodeWithoutInputDoesNothing {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n\n  [self.audioEngine detachInputNode];\n\n  XCTAssertNil(self.audioEngine.inputNode);\n  XCTAssertEqual(fakeEngine.detachNodeCallCount, 0);\n}\n\n- (void)testDetachInputNodeClearsGraphOnlyWhenNoSourcesRemain {\n  [self.audioEngine\n      attachInputNodeWithReceiverBlock:[self testInputReceiverBlock]];\n  self.audioEngine.graphNeedsRebuild = YES;\n\n  [self.audioEngine detachInputNode];\n\n  XCTAssertNil(self.audioEngine.inputNode);\n  XCTAssertFalse(self.audioEngine.graphNeedsRebuild);\n\n  [self attachSourceNodeToAudioEngine];\n  [self.audioEngine\n      attachInputNodeWithReceiverBlock:[self testInputReceiverBlock]];\n  self.audioEngine.graphNeedsRebuild = YES;\n\n  [self.audioEngine detachInputNode];\n\n  XCTAssertNil(self.audioEngine.inputNode);\n  XCTAssertTrue(self.audioEngine.graphNeedsRebuild);\n}\n\n- (void)testDetachInputNodePreservesSessionDeactivationInvalidation {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  fakeEngine.fakeRunning = YES;\n  self.audioEngine.state = AudioEngineStateRunning;\n  [self.audioEngine\n      attachInputNodeWithReceiverBlock:[self testInputReceiverBlock]];\n\n  [self.audioEngine onSessionDeactivated];\n  [self.audioEngine detachInputNode];\n\n  XCTAssertNil(self.audioEngine.inputNode);\n  XCTAssertFalse(self.audioEngine.graphNeedsRebuild);\n  XCTAssertTrue(self.audioEngine.sessionDeactivationInvalidatedGraph);\n}\n\n- (void)testOnInterruptionBeginOnlyTransitionsFromRunning {\n  [self.audioEngine onInterruptionBegin];\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateIdle);\n\n  self.audioEngine.state = AudioEngineStatePaused;\n  [self.audioEngine onInterruptionBegin];\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStatePaused);\n\n  self.audioEngine.state = AudioEngineStateRunning;\n  [self.audioEngine onInterruptionBegin];\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateInterrupted);\n}\n\n- (void)testOnSessionDeactivatedNoOpsFromIdle {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n\n  [self.audioEngine onSessionDeactivated];\n\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateIdle);\n  XCTAssertEqual(fakeEngine.pauseCallCount, 0);\n}\n\n- (void)testOnSessionDeactivatedPausesRunningEngine {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  fakeEngine.fakeRunning = YES;\n  self.audioEngine.state = AudioEngineStateRunning;\n\n  [self.audioEngine onSessionDeactivated];\n\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStatePaused);\n  XCTAssertEqual(fakeEngine.pauseCallCount, 1);\n  XCTAssertTrue(self.audioEngine.sessionDeactivationInvalidatedGraph);\n}\n\n- (void)testOnSessionDeactivatedMarksGraphForRebuildWhenNodesAreAttached {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  fakeEngine.fakeRunning = YES;\n  self.audioEngine.state = AudioEngineStateRunning;\n  [self attachSourceNodeToAudioEngine];\n\n  [self.audioEngine onSessionDeactivated];\n\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStatePaused);\n  XCTAssertEqual(fakeEngine.pauseCallCount, 1);\n  XCTAssertTrue(self.audioEngine.graphNeedsRebuild);\n  XCTAssertTrue(self.audioEngine.sessionDeactivationInvalidatedGraph);\n}\n\n- (void)\n    testOnSessionDeactivatedTransitionsToPausedWithoutPauseWhenEngineStopped {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  fakeEngine.fakeRunning = NO;\n  self.audioEngine.state = AudioEngineStateRunning;\n\n  [self.audioEngine onSessionDeactivated];\n\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStatePaused);\n  XCTAssertEqual(fakeEngine.pauseCallCount, 0);\n  XCTAssertTrue(self.audioEngine.sessionDeactivationInvalidatedGraph);\n}\n\n- (void)\n    testOnSessionDeactivatedMarksStoppedGraphForRebuildWhenNodesAreAttached {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  fakeEngine.fakeRunning = NO;\n  self.audioEngine.state = AudioEngineStateRunning;\n  [self attachSourceNodeToAudioEngine];\n\n  [self.audioEngine onSessionDeactivated];\n\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStatePaused);\n  XCTAssertEqual(fakeEngine.pauseCallCount, 0);\n  XCTAssertTrue(self.audioEngine.graphNeedsRebuild);\n  XCTAssertTrue(self.audioEngine.sessionDeactivationInvalidatedGraph);\n}\n\n- (void)testOnInterruptionEndNoOpsUnlessInterrupted {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n\n  [self.audioEngine onInterruptionEnd:true];\n\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateIdle);\n  XCTAssertEqual(fakeEngine.resetCallCount, 0);\n  XCTAssertEqual(self.audioEngine.createdFakeEngines.count, 1UL);\n}\n\n- (void)testOnInterruptionEndWithoutResumeRebuildsAndPauses {\n  [self attachSourceNodeToAudioEngine];\n\n  FakeAudioEngine *oldEngine = self.audioEngine.currentFakeAudioEngine;\n  oldEngine.fakeRunning = YES;\n  self.audioEngine.state = AudioEngineStateInterrupted;\n\n  [self.audioEngine onInterruptionEnd:false];\n\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStatePaused);\n  XCTAssertEqual(oldEngine.stopCallCount, 1);\n  XCTAssertEqual(oldEngine.resetCallCount, 1);\n  XCTAssertEqual(self.audioEngine.createdFakeEngines.count, 2UL);\n  XCTAssertNotEqual(self.audioEngine.currentFakeAudioEngine, oldEngine);\n  XCTAssertFalse(self.audioEngine.graphNeedsRebuild);\n}\n\n- (void)testOnInterruptionEndWithResumeRestartsEngine {\n  [self attachSourceNodeToAudioEngine];\n\n  FakeAudioEngine *oldEngine = self.audioEngine.currentFakeAudioEngine;\n  oldEngine.fakeRunning = YES;\n  self.audioEngine.state = AudioEngineStateInterrupted;\n\n  [self.audioEngine onInterruptionEnd:true];\n\n  FakeAudioEngine *newEngine = self.audioEngine.currentFakeAudioEngine;\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateRunning);\n  XCTAssertNotEqual(newEngine, oldEngine);\n  XCTAssertEqual(newEngine.prepareCallCount, 1);\n  XCTAssertEqual(newEngine.startCallCount, 1);\n  XCTAssertEqual(self.audioEngine.createdFakeEngines.count, 2UL);\n}\n\n- (void)testOnInterruptionEndWithResumeFailureEndsIdle {\n  [self attachSourceNodeToAudioEngine];\n\n  self.audioEngine.state = AudioEngineStateInterrupted;\n  FakeAudioEngine *oldEngine = self.audioEngine.currentFakeAudioEngine;\n  oldEngine.fakeRunning = YES;\n  self.audioEngine.nextCreatedEngineStartError =\n      [NSError errorWithDomain:@\"AudioEngineTests\" code:5 userInfo:nil];\n\n  [self.audioEngine onInterruptionEnd:true];\n\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateIdle);\n}\n\n- (void)testStartIfNecessaryReturnsFalseWhenGraphEmpty {\n  XCTAssertFalse([self.audioEngine startIfNecessary]);\n  XCTAssertEqual(self.sessionManager.ensureActiveCallCount, 0);\n}\n\n- (void)testStartIfNecessaryReturnsTrueWhenAlreadyRunning {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  fakeEngine.fakeRunning = YES;\n  self.audioEngine.state = AudioEngineStateRunning;\n\n  XCTAssertTrue([self.audioEngine startIfNecessary]);\n  XCTAssertEqual(self.sessionManager.ensureActiveCallCount, 0);\n  XCTAssertEqual(fakeEngine.startCallCount, 0);\n}\n\n- (void)testStartIfNecessaryStartsWhenGraphExists {\n  [self attachSourceNodeToAudioEngine];\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n\n  XCTAssertTrue([self.audioEngine startIfNecessary]);\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateRunning);\n  XCTAssertEqual(self.sessionManager.ensureActiveCallCount, 1);\n  XCTAssertEqual(fakeEngine.prepareCallCount, 1);\n  XCTAssertEqual(fakeEngine.startCallCount, 1);\n}\n\n- (void)testStartIfNecessaryReturnsFalseWhenSessionActivationFails {\n  [self attachSourceNodeToAudioEngine];\n  self.sessionManager.ensureActiveResult = NO;\n  self.sessionManager.ensureActiveFailure =\n      [NSError errorWithDomain:@\"AudioEngineTests\" code:7 userInfo:nil];\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n\n  XCTAssertFalse([self.audioEngine startIfNecessary]);\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateIdle);\n  XCTAssertEqual(self.sessionManager.ensureActiveCallCount, 1);\n  XCTAssertEqual(fakeEngine.startCallCount, 0);\n}\n\n- (void)testStartIfNecessaryRebuildsWhenInterrupted {\n  [self attachSourceNodeToAudioEngine];\n  FakeAudioEngine *oldEngine = self.audioEngine.currentFakeAudioEngine;\n  oldEngine.fakeRunning = YES;\n  self.audioEngine.state = AudioEngineStateInterrupted;\n\n  XCTAssertTrue([self.audioEngine startIfNecessary]);\n\n  FakeAudioEngine *newEngine = self.audioEngine.currentFakeAudioEngine;\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateRunning);\n  XCTAssertNotEqual(newEngine, oldEngine);\n  XCTAssertEqual(self.audioEngine.createdFakeEngines.count, 2UL);\n  XCTAssertFalse(self.audioEngine.graphNeedsRebuild);\n  XCTAssertFalse(self.audioEngine.sessionDeactivationInvalidatedGraph);\n}\n\n- (void)testStartIfNecessaryRebuildsWhenGraphNeedsRebuild {\n  [self attachSourceNodeToAudioEngine];\n  FakeAudioEngine *oldEngine = self.audioEngine.currentFakeAudioEngine;\n  AVAudioSourceNode *oldSourceNode =\n      self.audioEngine.sourceNodes.allValues.firstObject;\n  self.audioEngine.graphNeedsRebuild = YES;\n\n  XCTAssertTrue([self.audioEngine startIfNecessary]);\n\n  FakeAudioEngine *newEngine = self.audioEngine.currentFakeAudioEngine;\n  AVAudioSourceNode *newSourceNode =\n      self.audioEngine.sourceNodes.allValues.firstObject;\n  XCTAssertNotEqual(newEngine, oldEngine);\n  XCTAssertNotEqual(newSourceNode, oldSourceNode);\n  XCTAssertEqual(self.audioEngine.createdFakeEngines.count, 2UL);\n  XCTAssertFalse(self.audioEngine.graphNeedsRebuild);\n  XCTAssertFalse(self.audioEngine.sessionDeactivationInvalidatedGraph);\n  XCTAssertEqual(newEngine.prepareCallCount, 1);\n  XCTAssertEqual(newEngine.startCallCount, 1);\n}\n\n- (void)\n    testStartIfNecessaryRebuildsAfterSessionDeactivationEvenWhenTeardownClearsGraph {\n  [self.audioEngine\n      attachInputNodeWithReceiverBlock:[self testInputReceiverBlock]];\n\n  FakeAudioEngine *oldEngine = self.audioEngine.currentFakeAudioEngine;\n  oldEngine.fakeRunning = YES;\n  self.audioEngine.state = AudioEngineStateRunning;\n\n  [self.audioEngine onSessionDeactivated];\n  [self.audioEngine detachInputNode];\n  [self.audioEngine stopIfPossible];\n\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateIdle);\n  XCTAssertFalse(self.audioEngine.graphNeedsRebuild);\n  XCTAssertTrue(self.audioEngine.sessionDeactivationInvalidatedGraph);\n\n  AVAudioFormat *recoveredInputFormat =\n      [self testInputFormatWithSampleRate:48000 channelCount:1];\n  self.audioEngine.nextCreatedEngineInputFormat = recoveredInputFormat;\n  [self.audioEngine\n      attachInputNodeWithReceiverBlock:[self testInputReceiverBlock]];\n  AVAudioSinkNode *recoveredInputNode = self.audioEngine.inputNode;\n\n  XCTAssertTrue([self.audioEngine startIfNecessary]);\n\n  FakeAudioEngine *newEngine = self.audioEngine.currentFakeAudioEngine;\n  XCTAssertNotEqual(newEngine, oldEngine);\n  XCTAssertEqual(self.audioEngine.createdFakeEngines.count, 2UL);\n  XCTAssertEqual(newEngine.connectCallCount, 1);\n  XCTAssertEqualObjects(newEngine.connections.firstObject[@\"from\"],\n                        newEngine.inputNode);\n  XCTAssertEqualObjects(newEngine.connections.firstObject[@\"to\"],\n                        self.audioEngine.inputNode);\n  XCTAssertEqualObjects(newEngine.connections.firstObject[@\"format\"],\n                        recoveredInputFormat);\n  XCTAssertNotEqual(self.audioEngine.inputNode, recoveredInputNode);\n  XCTAssertFalse(self.audioEngine.graphNeedsRebuild);\n  XCTAssertFalse(self.audioEngine.sessionDeactivationInvalidatedGraph);\n}\n\n- (void)testStartIfNecessaryRebuildsInputNodeWithFreshInstance {\n  [self.audioEngine\n      attachInputNodeWithReceiverBlock:[self testInputReceiverBlock]];\n  FakeAudioEngine *oldEngine = self.audioEngine.currentFakeAudioEngine;\n  AVAudioSinkNode *oldInputNode = self.audioEngine.inputNode;\n  AVAudioFormat *replacementInputFormat =\n      [self testInputFormatWithSampleRate:48000 channelCount:1];\n  self.audioEngine.nextCreatedEngineInputFormat = replacementInputFormat;\n  self.audioEngine.graphNeedsRebuild = YES;\n\n  XCTAssertTrue([self.audioEngine startIfNecessary]);\n\n  FakeAudioEngine *newEngine = self.audioEngine.currentFakeAudioEngine;\n  XCTAssertNotEqual(newEngine, oldEngine);\n  XCTAssertNotEqual(self.audioEngine.inputNode, oldInputNode);\n  XCTAssertEqual(newEngine.connectCallCount, 1);\n  XCTAssertEqualObjects(newEngine.connections.firstObject[@\"from\"],\n                        newEngine.inputNode);\n  XCTAssertEqualObjects(newEngine.connections.firstObject[@\"to\"],\n                        self.audioEngine.inputNode);\n  XCTAssertEqualObjects(newEngine.connections.firstObject[@\"format\"],\n                        replacementInputFormat);\n}\n\n- (void)testStartIfNecessaryReturnsFalseWhenEngineStartFails {\n  [self attachSourceNodeToAudioEngine];\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  fakeEngine.startError = [NSError errorWithDomain:@\"AudioEngineTests\"\n                                              code:9\n                                          userInfo:nil];\n\n  XCTAssertFalse([self.audioEngine startIfNecessary]);\n  XCTAssertEqual(fakeEngine.startCallCount, 1);\n  XCTAssertNotEqual(self.audioEngine.state, AudioEngineStateRunning);\n}\n\n- (void)testPauseIfNecessaryNoOpsWhenAlreadyPaused {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  self.audioEngine.state = AudioEngineStatePaused;\n\n  [self.audioEngine pauseIfNecessary];\n\n  XCTAssertEqual(fakeEngine.pauseCallCount, 0);\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStatePaused);\n}\n\n- (void)testPauseIfNecessaryPausesActiveEngine {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  self.audioEngine.state = AudioEngineStateRunning;\n\n  [self.audioEngine pauseIfNecessary];\n\n  XCTAssertEqual(fakeEngine.pauseCallCount, 1);\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStatePaused);\n}\n\n- (void)testStopIfNecessaryNoOpsFromIdle {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n\n  [self.audioEngine stopIfNecessary];\n\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateIdle);\n  XCTAssertEqual(fakeEngine.stopCallCount, 0);\n  XCTAssertNotNil(self.audioEngine.audioEngine);\n}\n\n- (void)testStopIfNecessaryStopsButPreservesEngineInstance {\n  [self attachSourceNodeToAudioEngine];\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  fakeEngine.fakeRunning = YES;\n  self.audioEngine.state = AudioEngineStateRunning;\n\n  [self.audioEngine stopIfNecessary];\n\n  XCTAssertEqual(self.audioEngine.audioEngine, fakeEngine);\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateIdle);\n  XCTAssertEqual(fakeEngine.stopCallCount, 1);\n  XCTAssertEqual(fakeEngine.resetCallCount, 0);\n  XCTAssertFalse(self.audioEngine.graphNeedsRebuild);\n}\n\n- (void)testStopIfPossibleNoOpsWhenGraphStillExists {\n  [self attachSourceNodeToAudioEngine];\n  self.audioEngine.state = AudioEngineStateRunning;\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n\n  [self.audioEngine stopIfPossible];\n\n  XCTAssertEqual(self.audioEngine.audioEngine, fakeEngine);\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateRunning);\n  XCTAssertEqual(fakeEngine.stopCallCount, 0);\n}\n\n- (void)testStopIfPossibleKeepsIdleGraphlessEngineAlive {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n\n  [self.audioEngine stopIfPossible];\n\n  XCTAssertEqual(self.audioEngine.audioEngine, fakeEngine);\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateIdle);\n  XCTAssertEqual(fakeEngine.stopCallCount, 0);\n  XCTAssertEqual(fakeEngine.resetCallCount, 0);\n}\n\n- (void)testStopIfPossibleStopsNonIdleGraphlessEngineWithoutDestroyingIt {\n  FakeAudioEngine *fakeEngine = self.audioEngine.currentFakeAudioEngine;\n  fakeEngine.fakeRunning = YES;\n  self.audioEngine.state = AudioEngineStateRunning;\n\n  [self.audioEngine stopIfPossible];\n\n  XCTAssertEqual(self.audioEngine.audioEngine, fakeEngine);\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateIdle);\n  XCTAssertEqual(fakeEngine.stopCallCount, 1);\n  XCTAssertEqual(fakeEngine.resetCallCount, 0);\n}\n\n- (void)testRestartAudioEngineRebuildsWithoutRestartWhenStateIsNotRunning {\n  [self attachSourceNodeToAudioEngine];\n  FakeAudioEngine *oldEngine = self.audioEngine.currentFakeAudioEngine;\n  self.audioEngine.state = AudioEngineStatePaused;\n\n  [self.audioEngine restartAudioEngine];\n\n  FakeAudioEngine *newEngine = self.audioEngine.currentFakeAudioEngine;\n  XCTAssertNotEqual(newEngine, oldEngine);\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStatePaused);\n  XCTAssertEqual(newEngine.startCallCount, 0);\n  XCTAssertFalse(self.audioEngine.graphNeedsRebuild);\n}\n\n- (void)testRestartAudioEngineStopsAndRestartsWhenStateRunning {\n  [self attachSourceNodeToAudioEngine];\n  FakeAudioEngine *oldEngine = self.audioEngine.currentFakeAudioEngine;\n  oldEngine.fakeRunning = YES;\n  self.audioEngine.state = AudioEngineStateRunning;\n\n  [self.audioEngine restartAudioEngine];\n\n  FakeAudioEngine *newEngine = self.audioEngine.currentFakeAudioEngine;\n  XCTAssertNotEqual(newEngine, oldEngine);\n  XCTAssertEqual(oldEngine.stopCallCount, 1);\n  XCTAssertEqual(newEngine.prepareCallCount, 1);\n  XCTAssertEqual(newEngine.startCallCount, 1);\n  XCTAssertEqual(self.sessionManager.ensureActiveCallCount, 1);\n  XCTAssertEqual(self.audioEngine.state, AudioEngineStateRunning);\n}\n\n@end\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExampleTests/AudioPlayerTests.mm",
    "content": "#import <AudioToolbox/AudioServices.h>\n#import <XCTest/XCTest.h>\n\n#import <audioapi/core/utils/Constants.h>\n#import <audioapi/ios/core/NativeAudioPlayer.h>\n#import <audioapi/ios/system/AudioEngine.h>\n#import <audioapi/ios/system/AudioSessionManager.h>\n#import <audioapi/utils/AudioBuffer.hpp>\n\n#include <atomic>\n#include <cstddef>\n#include <functional>\n#include <memory>\n#include <utility>\n#include <vector>\n\nusing namespace audioapi;\n\nnamespace audioapi {\n\nclass IOSAudioPlayer {\n public:\n  IOSAudioPlayer(\n      const std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> &renderAudio,\n      float sampleRate,\n      int channelCount);\n  ~IOSAudioPlayer();\n\n  bool start();\n  void stop();\n  bool resume();\n  void suspend();\n  void cleanup();\n\n  bool isRunning() const;\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> audioBuffer_;\n  NativeAudioPlayer *audioPlayer_;\n  std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> renderAudio_;\n  int channelCount_;\n  std::atomic<bool> isRunning_;\n};\n\n} // namespace audioapi\n\n@interface NativeAudioPlayer (TestingPrivate)\n\n- (void)attachSourceNodeIfNeeded:(AudioEngine *)audioEngine;\n- (void)detachSourceNodeIfAttached:(AudioEngine *)audioEngine;\n\n@end\n\n@interface FakePlayerAudioSessionManager : AudioSessionManager\n\n@property(nonatomic, assign) BOOL ensureActiveResult;\n@property(nonatomic, strong) NSError *ensureActiveFailure;\n@property(nonatomic, assign) NSInteger ensureActiveCallCount;\n@property(nonatomic, assign) BOOL lastEnsureActiveForce;\n\n@end\n\n@implementation FakePlayerAudioSessionManager\n\n- (instancetype)init\n{\n  if (self = [super init]) {\n    self.ensureActiveResult = YES;\n  }\n\n  return self;\n}\n\n- (bool)ensureActive:(bool)force error:(NSError **)error\n{\n  self.ensureActiveCallCount += 1;\n  self.lastEnsureActiveForce = force;\n\n  if (!self.ensureActiveResult && error != nil) {\n    *error = self.ensureActiveFailure;\n  } else if (error != nil) {\n    *error = nil;\n  }\n\n  if (self.ensureActiveResult) {\n    self.isActive = true;\n  }\n\n  return self.ensureActiveResult;\n}\n\n@end\n\n@interface FakePlayerAudioEngine : AudioEngine\n\n@property(nonatomic, assign) BOOL fakeEngineRunning;\n@property(nonatomic, assign) BOOL startIfNecessaryResult;\n@property(nonatomic, assign) NSInteger stopIfNecessaryCallCount;\n@property(nonatomic, assign) NSInteger startIfNecessaryCallCount;\n@property(nonatomic, assign) NSInteger stopIfPossibleCallCount;\n@property(nonatomic, assign) NSInteger attachSourceNodeCallCount;\n@property(nonatomic, assign) NSInteger detachSourceNodeCallCount;\n@property(nonatomic, copy) AVAudioSourceNodeRenderBlock lastAttachedRenderBlock;\n@property(nonatomic, assign) float lastAttachedSampleRate;\n@property(nonatomic, assign) AVAudioChannelCount lastAttachedChannelCount;\n@property(nonatomic, copy) NSString *returnedSourceNodeId;\n@property(nonatomic, copy) NSString *lastDetachedSourceNodeId;\n\n@end\n\n@implementation FakePlayerAudioEngine\n\n- (instancetype)init\n{\n  if (self = [super init]) {\n    self.startIfNecessaryResult = YES;\n    self.returnedSourceNodeId = @\"fake-source-node-id\";\n  }\n\n  return self;\n}\n\n- (void)createAudioEngineIfNeeded\n{\n  // Prevent creating a real AVAudioEngine in unit tests.\n}\n\n- (bool)isEngineRunning\n{\n  return self.fakeEngineRunning;\n}\n\n- (void)stopIfNecessary\n{\n  self.stopIfNecessaryCallCount += 1;\n}\n\n- (bool)startIfNecessary\n{\n  self.startIfNecessaryCallCount += 1;\n  return self.startIfNecessaryResult;\n}\n\n- (void)stopIfPossible\n{\n  self.stopIfPossibleCallCount += 1;\n}\n\n- (NSString *)attachSourceNodeWithRenderBlock:(AVAudioSourceNodeRenderBlock)renderBlock\n                                   sampleRate:(float)sampleRate\n                                 channelCount:(AVAudioChannelCount)channelCount\n{\n  self.attachSourceNodeCallCount += 1;\n  self.lastAttachedRenderBlock = renderBlock;\n  self.lastAttachedSampleRate = sampleRate;\n  self.lastAttachedChannelCount = channelCount;\n  return self.returnedSourceNodeId;\n}\n\n- (void)detachSourceNodeWithId:(NSString *)sourceNodeId\n{\n  self.detachSourceNodeCallCount += 1;\n  self.lastDetachedSourceNodeId = sourceNodeId;\n}\n\n@end\n\n@interface FakeNativeAudioPlayer : NativeAudioPlayer\n\n@property(nonatomic, assign) BOOL startResult;\n@property(nonatomic, assign) BOOL resumeResult;\n@property(nonatomic, assign) NSInteger startCallCount;\n@property(nonatomic, assign) NSInteger stopCallCount;\n@property(nonatomic, assign) NSInteger resumeCallCount;\n@property(nonatomic, assign) NSInteger suspendCallCount;\n@property(nonatomic, assign) NSInteger cleanupCallCount;\n\n@end\n\n@implementation FakeNativeAudioPlayer\n\n- (instancetype)init\n{\n  if (self = [super init]) {\n    self.startResult = YES;\n    self.resumeResult = YES;\n  }\n\n  return self;\n}\n\n- (bool)start\n{\n  self.startCallCount += 1;\n  return self.startResult;\n}\n\n- (void)stop\n{\n  self.stopCallCount += 1;\n}\n\n- (bool)resume\n{\n  self.resumeCallCount += 1;\n  return self.resumeResult;\n}\n\n- (void)suspend\n{\n  self.suspendCallCount += 1;\n}\n\n- (void)cleanup\n{\n  self.cleanupCallCount += 1;\n}\n\n@end\n\nclass TestableIOSAudioPlayer : public IOSAudioPlayer {\n public:\n  TestableIOSAudioPlayer(\n      const std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> &renderAudio,\n      float sampleRate,\n      int channelCount)\n      : IOSAudioPlayer(renderAudio, sampleRate, channelCount) {}\n\n  NativeAudioPlayer *replaceAudioPlayer(NativeAudioPlayer *audioPlayer) {\n    NativeAudioPlayer *previous = audioPlayer_;\n    audioPlayer_ = audioPlayer;\n    return previous;\n  }\n\n  NativeAudioPlayer *getAudioPlayer() const {\n    return audioPlayer_;\n  }\n\n  std::shared_ptr<DSPAudioBuffer> getAudioBuffer() const {\n    return audioBuffer_;\n  }\n\n  void setRunning(bool isRunning) {\n    isRunning_.store(isRunning, std::memory_order_release);\n  }\n};\n\nstruct TestAudioOutput {\n  explicit TestAudioOutput(UInt32 channelCount, AVAudioFrameCount frameCount, float initialValue = 0.0f)\n      : storage(offsetof(AudioBufferList, mBuffers) + channelCount * sizeof(::AudioBuffer)),\n        channels(channelCount, std::vector<float>(frameCount, initialValue)) {\n    AudioBufferList *audioBufferList = bufferList();\n    audioBufferList->mNumberBuffers = channelCount;\n\n    for (UInt32 channel = 0; channel < channelCount; channel += 1) {\n      audioBufferList->mBuffers[channel].mNumberChannels = 1;\n      audioBufferList->mBuffers[channel].mDataByteSize = frameCount * sizeof(float);\n      audioBufferList->mBuffers[channel].mData = channels[channel].data();\n    }\n  }\n\n  AudioBufferList *bufferList() {\n    return reinterpret_cast<AudioBufferList *>(storage.data());\n  }\n\n  std::vector<uint8_t> storage;\n  std::vector<std::vector<float>> channels;\n};\n\n@interface NativeAudioPlayerTests : XCTestCase\n\n@property(nonatomic, strong) FakePlayerAudioEngine *audioEngine;\n@property(nonatomic, strong) FakePlayerAudioSessionManager *sessionManager;\n\n@end\n\n@implementation NativeAudioPlayerTests\n\n- (void)setUp\n{\n  [super setUp];\n\n  self.audioEngine = [[FakePlayerAudioEngine alloc] init];\n  self.sessionManager = [[FakePlayerAudioSessionManager alloc] init];\n  self.audioEngine.sessionManager = self.sessionManager;\n}\n\n- (void)tearDown\n{\n  [self.audioEngine cleanup];\n  [self.sessionManager cleanup];\n  self.audioEngine = nil;\n  self.sessionManager = nil;\n\n  [super tearDown];\n}\n\n- (NativeAudioPlayer *)createPlayerWithRenderCallCount:(NSInteger *)renderCallCount\n{\n  return [[NativeAudioPlayer alloc] initWithRenderAudio:^(AudioBufferList *outputBuffer, int numFrames) {\n    if (renderCallCount != nullptr) {\n      *renderCallCount += 1;\n    }\n  }\n                                             sampleRate:48000\n                                           channelCount:2];\n}\n\n- (void)assertStartLikeOperationRunsGraphForSelector:(SEL)selector\n{\n  NativeAudioPlayer *player = [self createPlayerWithRenderCallCount:nullptr];\n  typedef BOOL (*NativeAudioPlayerBoolMethod)(id, SEL);\n  NativeAudioPlayerBoolMethod operation =\n      (NativeAudioPlayerBoolMethod)[player methodForSelector:selector];\n\n  XCTAssertTrue(operation(player, selector));\n  XCTAssertEqual(self.sessionManager.ensureActiveCallCount, 1);\n  XCTAssertFalse(self.sessionManager.lastEnsureActiveForce);\n  XCTAssertEqual(self.audioEngine.stopIfNecessaryCallCount, 1);\n  XCTAssertEqual(self.audioEngine.attachSourceNodeCallCount, 1);\n  XCTAssertEqual(self.audioEngine.startIfNecessaryCallCount, 1);\n  XCTAssertNotNil(self.audioEngine.lastAttachedRenderBlock);\n  XCTAssertEqualWithAccuracy(self.audioEngine.lastAttachedSampleRate, 48000.0f, 0.001f);\n  XCTAssertEqual(self.audioEngine.lastAttachedChannelCount, 2U);\n  XCTAssertEqualObjects(player.sourceNodeId, self.audioEngine.returnedSourceNodeId);\n}\n\n- (void)assertStopLikeOperationDetachesSourceForSelector:(SEL)selector\n{\n  NativeAudioPlayer *player = [self createPlayerWithRenderCallCount:nullptr];\n  player.sourceNodeId = @\"attached-source-node\";\n  typedef void (*NativeAudioPlayerVoidMethod)(id, SEL);\n  NativeAudioPlayerVoidMethod operation =\n      (NativeAudioPlayerVoidMethod)[player methodForSelector:selector];\n\n  operation(player, selector);\n\n  XCTAssertEqual(self.audioEngine.detachSourceNodeCallCount, 1);\n  XCTAssertEqualObjects(self.audioEngine.lastDetachedSourceNodeId, @\"attached-source-node\");\n  XCTAssertEqual(self.audioEngine.stopIfPossibleCallCount, 1);\n  XCTAssertNil(player.sourceNodeId);\n}\n\n- (void)testRenderBlockReturnsErrorWhenBufferCountDoesNotMatch\n{\n  NSInteger renderCallCount = 0;\n  NativeAudioPlayer *player = [self createPlayerWithRenderCallCount:&renderCallCount];\n  TestAudioOutput output(1, 64, 1.0f);\n  BOOL isSilence = NO;\n  AudioTimeStamp timestamp = {};\n\n  OSStatus status = player.renderBlock(&isSilence, &timestamp, 64, output.bufferList());\n\n  XCTAssertEqual(status, kAudioServicesBadPropertySizeError);\n  XCTAssertEqual(renderCallCount, 0);\n}\n\n- (void)testRenderBlockInvokesRenderAudioWhenBufferCountMatches\n{\n  __block NSInteger renderCallCount = 0;\n  __block AVAudioFrameCount renderedFrameCount = 0;\n  __block AudioBufferList *renderedBufferList = nullptr;\n  NativeAudioPlayer *player = [[NativeAudioPlayer alloc]\n      initWithRenderAudio:^(AudioBufferList *outputBuffer, int numFrames) {\n        renderCallCount += 1;\n        renderedFrameCount = static_cast<AVAudioFrameCount>(numFrames);\n        renderedBufferList = outputBuffer;\n      }\n            sampleRate:48000\n          channelCount:2];\n  TestAudioOutput output(2, 64, 0.0f);\n  BOOL isSilence = NO;\n  AudioTimeStamp timestamp = {};\n\n  OSStatus status = player.renderBlock(&isSilence, &timestamp, 64, output.bufferList());\n\n  XCTAssertEqual(status, kAudioServicesNoError);\n  XCTAssertEqual(renderCallCount, 1);\n  XCTAssertEqual(renderedFrameCount, 64U);\n  XCTAssertEqual(renderedBufferList, output.bufferList());\n}\n\n- (void)testStartAndResumeActivateSessionAttachSourceAndStartEngine\n{\n  [self assertStartLikeOperationRunsGraphForSelector:@selector(start)];\n\n  self.audioEngine.stopIfNecessaryCallCount = 0;\n  self.audioEngine.attachSourceNodeCallCount = 0;\n  self.audioEngine.startIfNecessaryCallCount = 0;\n  self.sessionManager.ensureActiveCallCount = 0;\n\n  [self assertStartLikeOperationRunsGraphForSelector:@selector(resume)];\n}\n\n- (void)testStartReturnsFalseWhenSessionActivationFails\n{\n  NativeAudioPlayer *player = [self createPlayerWithRenderCallCount:nullptr];\n  self.sessionManager.ensureActiveResult = NO;\n  self.sessionManager.ensureActiveFailure =\n      [NSError errorWithDomain:@\"AudioPlayerTests\" code:1 userInfo:nil];\n\n  XCTAssertFalse([player start]);\n  XCTAssertEqual(self.sessionManager.ensureActiveCallCount, 1);\n  XCTAssertEqual(self.audioEngine.stopIfNecessaryCallCount, 0);\n  XCTAssertEqual(self.audioEngine.attachSourceNodeCallCount, 0);\n  XCTAssertEqual(self.audioEngine.startIfNecessaryCallCount, 0);\n  XCTAssertNil(player.sourceNodeId);\n}\n\n- (void)testAttachSourceNodeIfNeededIsIdempotent\n{\n  NativeAudioPlayer *player = [self createPlayerWithRenderCallCount:nullptr];\n  player.sourceNodeId = @\"existing-source-node\";\n\n  [player attachSourceNodeIfNeeded:self.audioEngine];\n\n  XCTAssertEqual(self.audioEngine.attachSourceNodeCallCount, 0);\n  XCTAssertEqualObjects(player.sourceNodeId, @\"existing-source-node\");\n}\n\n- (void)testStopAndSuspendDetachAttachedSourceAndStopIfPossible\n{\n  [self assertStopLikeOperationDetachesSourceForSelector:@selector(stop)];\n\n  self.audioEngine.detachSourceNodeCallCount = 0;\n  self.audioEngine.stopIfPossibleCallCount = 0;\n  self.audioEngine.lastDetachedSourceNodeId = nil;\n\n  [self assertStopLikeOperationDetachesSourceForSelector:@selector(suspend)];\n}\n\n- (void)testDetachSourceNodeIfAttachedNoOpsWhenNotAttached\n{\n  NativeAudioPlayer *player = [self createPlayerWithRenderCallCount:nullptr];\n\n  [player detachSourceNodeIfAttached:self.audioEngine];\n\n  XCTAssertEqual(self.audioEngine.detachSourceNodeCallCount, 0);\n  XCTAssertNil(player.sourceNodeId);\n}\n\n@end\n\n@interface IOSAudioPlayerTests : XCTestCase\n\n@property(nonatomic, strong) FakePlayerAudioEngine *audioEngine;\n@property(nonatomic, strong) FakePlayerAudioSessionManager *sessionManager;\n\n@end\n\n@implementation IOSAudioPlayerTests\n\n- (void)setUp\n{\n  [super setUp];\n\n  self.audioEngine = [[FakePlayerAudioEngine alloc] init];\n  self.sessionManager = [[FakePlayerAudioSessionManager alloc] init];\n  self.audioEngine.sessionManager = self.sessionManager;\n}\n\n- (void)tearDown\n{\n  [self.audioEngine cleanup];\n  [self.sessionManager cleanup];\n  self.audioEngine = nil;\n  self.sessionManager = nil;\n\n  [super tearDown];\n}\n\n- (void)testStartAndResumeReturnNativeResultAndUpdateRunningState\n{\n  auto assertOperationTracksRunning = [&](bool useResume) {\n    auto player = std::make_unique<TestableIOSAudioPlayer>(\n        [](std::shared_ptr<DSPAudioBuffer>, int) {}, 48000, 2);\n    FakeNativeAudioPlayer *fakeNative = [[FakeNativeAudioPlayer alloc] init];\n    NativeAudioPlayer *originalNative = player->replaceAudioPlayer(fakeNative);\n    [originalNative cleanup];\n\n    if (useResume) {\n      XCTAssertTrue(player->resume());\n      XCTAssertEqual(fakeNative.resumeCallCount, 1);\n    } else {\n      XCTAssertTrue(player->start());\n      XCTAssertEqual(fakeNative.startCallCount, 1);\n    }\n\n    self.audioEngine.fakeEngineRunning = YES;\n    self.audioEngine.state = AudioEngineStateRunning;\n    XCTAssertTrue(player->isRunning());\n  };\n\n  assertOperationTracksRunning(false);\n  assertOperationTracksRunning(true);\n}\n\n- (void)testStartShortCircuitsWhenAlreadyRunning\n{\n  auto player =\n      std::make_unique<TestableIOSAudioPlayer>([](std::shared_ptr<DSPAudioBuffer>, int) {}, 48000, 2);\n  FakeNativeAudioPlayer *fakeNative = [[FakeNativeAudioPlayer alloc] init];\n  NativeAudioPlayer *originalNative = player->replaceAudioPlayer(fakeNative);\n  [originalNative cleanup];\n\n  player->setRunning(true);\n  self.audioEngine.fakeEngineRunning = YES;\n  self.audioEngine.state = AudioEngineStateRunning;\n\n  XCTAssertTrue(player->start());\n  XCTAssertEqual(fakeNative.startCallCount, 0);\n}\n\n- (void)testStopAndSuspendClearRunningStateAndForwardToNativePlayer\n{\n  auto assertOperationStopsRunning = [&](bool useSuspend) {\n    auto player = std::make_unique<TestableIOSAudioPlayer>(\n        [](std::shared_ptr<DSPAudioBuffer>, int) {}, 48000, 2);\n    FakeNativeAudioPlayer *fakeNative = [[FakeNativeAudioPlayer alloc] init];\n    NativeAudioPlayer *originalNative = player->replaceAudioPlayer(fakeNative);\n    [originalNative cleanup];\n\n    player->setRunning(true);\n    self.audioEngine.fakeEngineRunning = YES;\n    self.audioEngine.state = AudioEngineStateRunning;\n\n    if (useSuspend) {\n      player->suspend();\n      XCTAssertEqual(fakeNative.suspendCallCount, 1);\n    } else {\n      player->stop();\n      XCTAssertEqual(fakeNative.stopCallCount, 1);\n    }\n\n    XCTAssertFalse(player->isRunning());\n  };\n\n  assertOperationStopsRunning(false);\n  assertOperationStopsRunning(true);\n}\n\n- (void)testCleanupStopsThenCleansUpAndClearsAudioBuffer\n{\n  auto player =\n      std::make_unique<TestableIOSAudioPlayer>([](std::shared_ptr<DSPAudioBuffer>, int) {}, 48000, 2);\n  FakeNativeAudioPlayer *fakeNative = [[FakeNativeAudioPlayer alloc] init];\n  NativeAudioPlayer *originalNative = player->replaceAudioPlayer(fakeNative);\n  [originalNative cleanup];\n\n  player->setRunning(true);\n  player->cleanup();\n\n  XCTAssertEqual(fakeNative.stopCallCount, 1);\n  XCTAssertEqual(fakeNative.cleanupCallCount, 1);\n  XCTAssertEqual(player->getAudioBuffer(), nullptr);\n}\n\n- (void)testIsRunningRequiresInternalFlagEngineAndRunningState\n{\n  auto player =\n      std::make_unique<TestableIOSAudioPlayer>([](std::shared_ptr<DSPAudioBuffer>, int) {}, 48000, 2);\n\n  player->setRunning(false);\n  self.audioEngine.fakeEngineRunning = YES;\n  self.audioEngine.state = AudioEngineStateRunning;\n  XCTAssertFalse(player->isRunning());\n\n  player->setRunning(true);\n  self.audioEngine.fakeEngineRunning = NO;\n  XCTAssertFalse(player->isRunning());\n\n  self.audioEngine.fakeEngineRunning = YES;\n  self.audioEngine.state = AudioEngineStatePaused;\n  XCTAssertFalse(player->isRunning());\n\n  self.audioEngine.state = AudioEngineStateRunning;\n  XCTAssertTrue(player->isRunning());\n}\n\n- (void)testRenderBlockRendersInQuantumSizedChunksWhenRunning\n{\n  std::vector<int> renderedFrameSizes;\n  int chunkIndex = 0;\n  auto player = std::make_unique<TestableIOSAudioPlayer>(\n      [&renderedFrameSizes, &chunkIndex](std::shared_ptr<DSPAudioBuffer> buffer, int numFrames) {\n        renderedFrameSizes.push_back(numFrames);\n\n        for (int channel = 0; channel < 2; channel += 1) {\n          for (int frame = 0; frame < numFrames; frame += 1) {\n            (*buffer->getChannel(channel))[frame] = (channel == 0 ? 1.0f : 10.0f) * (chunkIndex + 1);\n          }\n        }\n\n        chunkIndex += 1;\n      },\n      48000,\n      2);\n\n  player->setRunning(true);\n  TestAudioOutput output(2, 300, -1.0f);\n  BOOL isSilence = NO;\n  NativeAudioPlayer *nativePlayer = player->getAudioPlayer();\n  AudioTimeStamp timestamp = {};\n\n  OSStatus status = nativePlayer.renderBlock(&isSilence, &timestamp, 300, output.bufferList());\n\n  XCTAssertEqual(status, kAudioServicesNoError);\n  XCTAssertEqual(renderedFrameSizes.size(), 3UL);\n  XCTAssertEqual(renderedFrameSizes[0], RENDER_QUANTUM_SIZE);\n  XCTAssertEqual(renderedFrameSizes[1], RENDER_QUANTUM_SIZE);\n  XCTAssertEqual(renderedFrameSizes[2], 44);\n\n  for (int frame = 0; frame < 128; frame += 1) {\n    XCTAssertEqualWithAccuracy(output.channels[0][frame], 1.0f, 0.0001f);\n    XCTAssertEqualWithAccuracy(output.channels[1][frame], 10.0f, 0.0001f);\n  }\n\n  for (int frame = 128; frame < 256; frame += 1) {\n    XCTAssertEqualWithAccuracy(output.channels[0][frame], 2.0f, 0.0001f);\n    XCTAssertEqualWithAccuracy(output.channels[1][frame], 20.0f, 0.0001f);\n  }\n\n  for (int frame = 256; frame < 300; frame += 1) {\n    XCTAssertEqualWithAccuracy(output.channels[0][frame], 3.0f, 0.0001f);\n    XCTAssertEqualWithAccuracy(output.channels[1][frame], 30.0f, 0.0001f);\n  }\n}\n\n- (void)testRenderBlockZerosBufferedAudioWhenPlayerIsNotRunning\n{\n  int renderCallCount = 0;\n  auto player = std::make_unique<TestableIOSAudioPlayer>(\n      [&renderCallCount](std::shared_ptr<DSPAudioBuffer>, int) {\n        renderCallCount += 1;\n      },\n      48000,\n      2);\n\n  player->setRunning(false);\n  for (int channel = 0; channel < 2; channel += 1) {\n    for (int frame = 0; frame < static_cast<int>(player->getAudioBuffer()->getSize()); frame += 1) {\n      (*player->getAudioBuffer()->getChannel(channel))[frame] = 0.75f;\n    }\n  }\n\n  TestAudioOutput output(2, 64, 5.0f);\n  BOOL isSilence = NO;\n  NativeAudioPlayer *nativePlayer = player->getAudioPlayer();\n  AudioTimeStamp timestamp = {};\n\n  OSStatus status = nativePlayer.renderBlock(&isSilence, &timestamp, 64, output.bufferList());\n\n  XCTAssertEqual(status, kAudioServicesNoError);\n  XCTAssertEqual(renderCallCount, 0);\n\n  for (int channel = 0; channel < 2; channel += 1) {\n    for (int frame = 0; frame < 64; frame += 1) {\n      XCTAssertEqualWithAccuracy(output.channels[channel][frame], 0.0f, 0.0001f);\n    }\n  }\n}\n\n@end\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExampleTests/AudioSessionManagerTests.mm",
    "content": "#import <XCTest/XCTest.h>\n\n#import <audioapi/ios/system/AudioSessionManager.h>\n\n@interface AudioSessionManager (TestingPrivate)\n\n- (AVAudioSessionCategory)categoryFromString:(NSString *)categorySTR;\n- (AVAudioSessionMode)modeFromString:(NSString *)modeSTR;\n- (AVAudioSessionCategoryOptions)optionsFromArray:(NSArray *)optionsArray;\n- (bool)activateSessionIfNeeded:(bool)force error:(NSError **)error;\n- (bool)areDesiredOptionsSet;\n- (id)microphoneUsageDescriptionValue;\n- (bool)usesAudioApplicationRecordPermissionAPI;\n- (void)requestSystemRecordPermission:(void (^)(BOOL granted))completion;\n- (NSInteger)currentRecordPermissionStatus;\n\n@end\n\n@interface FakeAudioPortDescription : NSObject\n\n@property(nonatomic, copy) NSString *portName;\n@property(nonatomic, copy) NSString *portType;\n@property(nonatomic, copy) NSString *UID;\n\n@end\n\n@implementation FakeAudioPortDescription\n\n@end\n\n@interface FakeAudioRouteDescription : NSObject\n\n@property(nonatomic, strong) NSArray<FakeAudioPortDescription *> *inputs;\n@property(nonatomic, strong) NSArray<FakeAudioPortDescription *> *outputs;\n\n@end\n\n@implementation FakeAudioRouteDescription\n\n@end\n\n@interface FakeAVAudioSession : NSObject\n\n@property(nonatomic, copy) AVAudioSessionCategory category;\n@property(nonatomic, copy) AVAudioSessionMode mode;\n@property(nonatomic, assign) AVAudioSessionCategoryOptions categoryOptions;\n@property(nonatomic, assign) BOOL allowHapticsAndSystemSoundsDuringRecording;\n@property(nonatomic, assign) double sampleRate;\n@property(nonatomic, assign) NSInteger inputNumberOfChannels;\n@property(nonatomic, strong) NSArray<FakeAudioPortDescription *> *availableInputs;\n@property(nonatomic, strong) FakeAudioRouteDescription *currentRoute;\n@property(nonatomic, assign) NSInteger recordPermission;\n@property(nonatomic, strong) NSError *setCategoryError;\n@property(nonatomic, strong) NSError *setAllowHapticsError;\n@property(nonatomic, strong) NSError *setActiveError;\n@property(nonatomic, strong) NSError *setPreferredInputError;\n@property(nonatomic, assign) NSInteger setCategoryCallCount;\n@property(nonatomic, assign) NSInteger setAllowHapticsCallCount;\n@property(nonatomic, assign) NSInteger setActiveCallCount;\n@property(nonatomic, assign) NSInteger setPreferredInputCallCount;\n@property(nonatomic, assign) BOOL lastSetActiveValue;\n@property(nonatomic, assign) AVAudioSessionSetActiveOptions lastSetActiveOptions;\n@property(nonatomic, strong) FakeAudioPortDescription *lastPreferredInput;\n\n@end\n\n@implementation FakeAVAudioSession\n\n- (instancetype)init\n{\n  if (self = [super init]) {\n    self.category = AVAudioSessionCategoryPlayback;\n    self.mode = AVAudioSessionModeDefault;\n    self.categoryOptions = 0;\n    self.allowHapticsAndSystemSoundsDuringRecording = NO;\n    self.sampleRate = 44100;\n    self.inputNumberOfChannels = 2;\n    self.availableInputs = @[];\n    self.currentRoute = [[FakeAudioRouteDescription alloc] init];\n    self.currentRoute.inputs = @[];\n    self.currentRoute.outputs = @[];\n    self.recordPermission = AVAudioSessionRecordPermissionUndetermined;\n  }\n\n  return self;\n}\n\n- (BOOL)setCategory:(AVAudioSessionCategory)category\n               mode:(AVAudioSessionMode)mode\n            options:(AVAudioSessionCategoryOptions)options\n              error:(NSError **)error\n{\n  self.setCategoryCallCount += 1;\n\n  if (error != nil) {\n    *error = self.setCategoryError;\n  }\n\n  if (self.setCategoryError != nil) {\n    return NO;\n  }\n\n  self.category = category;\n  self.mode = mode;\n  self.categoryOptions = options;\n  return YES;\n}\n\n- (BOOL)setAllowHapticsAndSystemSoundsDuringRecording:(BOOL)allowHapticsAndSystemSoundsDuringRecording\n                                                error:(NSError **)error\n{\n  self.setAllowHapticsCallCount += 1;\n\n  if (error != nil) {\n    *error = self.setAllowHapticsError;\n  }\n\n  if (self.setAllowHapticsError != nil) {\n    return NO;\n  }\n\n  self.allowHapticsAndSystemSoundsDuringRecording = allowHapticsAndSystemSoundsDuringRecording;\n  return YES;\n}\n\n- (BOOL)setActive:(BOOL)active withOptions:(AVAudioSessionSetActiveOptions)options error:(NSError **)error\n{\n  self.setActiveCallCount += 1;\n  self.lastSetActiveValue = active;\n  self.lastSetActiveOptions = options;\n\n  if (error != nil) {\n    *error = self.setActiveError;\n  }\n\n  return self.setActiveError == nil;\n}\n\n- (BOOL)setPreferredInput:(FakeAudioPortDescription *)inPort error:(NSError **)error\n{\n  self.setPreferredInputCallCount += 1;\n  self.lastPreferredInput = inPort;\n\n  if (error != nil) {\n    *error = self.setPreferredInputError;\n  }\n\n  return self.setPreferredInputError == nil;\n}\n\n@end\n\n@interface TestableAudioSessionManager : AudioSessionManager\n\n@property(nonatomic, assign) BOOL shouldOverrideMicrophoneUsageDescription;\n@property(nonatomic, strong) id overriddenMicrophoneUsageDescription;\n@property(nonatomic, assign) BOOL shouldUseAudioApplicationRecordPermissionAPI;\n@property(nonatomic, assign) BOOL hasOverriddenRecordPermissionStatus;\n@property(nonatomic, assign) NSInteger overriddenRecordPermissionStatus;\n@property(nonatomic, assign) BOOL overriddenRequestPermissionResult;\n@property(nonatomic, assign) NSInteger requestSystemRecordPermissionCallCount;\n\n@end\n\n@implementation TestableAudioSessionManager\n\n- (id)microphoneUsageDescriptionValue\n{\n  if (self.shouldOverrideMicrophoneUsageDescription) {\n    return self.overriddenMicrophoneUsageDescription;\n  }\n\n  return [super microphoneUsageDescriptionValue];\n}\n\n- (bool)usesAudioApplicationRecordPermissionAPI\n{\n  return self.shouldUseAudioApplicationRecordPermissionAPI;\n}\n\n- (void)requestSystemRecordPermission:(void (^)(BOOL granted))completion\n{\n  self.requestSystemRecordPermissionCallCount += 1;\n  completion(self.overriddenRequestPermissionResult);\n}\n\n- (NSInteger)currentRecordPermissionStatus\n{\n  if (self.hasOverriddenRecordPermissionStatus) {\n    return self.overriddenRecordPermissionStatus;\n  }\n\n  return [super currentRecordPermissionStatus];\n}\n\n@end\n\n@interface AudioSessionManagerTests : XCTestCase\n\n@property(nonatomic, strong) TestableAudioSessionManager *manager;\n@property(nonatomic, strong) FakeAVAudioSession *fakeSession;\n\n@end\n\n@implementation AudioSessionManagerTests\n\n- (void)setUp\n{\n  [super setUp];\n\n  self.manager = [[TestableAudioSessionManager alloc] init];\n  self.fakeSession = [[FakeAVAudioSession alloc] init];\n  self.manager.audioSession = (AVAudioSession *)self.fakeSession;\n  self.manager.shouldOverrideMicrophoneUsageDescription = YES;\n  self.manager.overriddenMicrophoneUsageDescription = @\"Microphone usage\";\n}\n\n- (void)tearDown\n{\n  [self.manager cleanup];\n  self.manager = nil;\n  self.fakeSession = nil;\n\n  [super tearDown];\n}\n\n- (FakeAudioPortDescription *)portWithName:(NSString *)name type:(NSString *)type uid:(NSString *)uid\n{\n  FakeAudioPortDescription *port = [[FakeAudioPortDescription alloc] init];\n  port.portName = name;\n  port.portType = type;\n  port.UID = uid;\n  return port;\n}\n\n- (void)testConfigureAudioSessionNoOpsWhenSessionManagementDisabled\n{\n  self.manager.shouldManageSession = false;\n  self.fakeSession.category = AVAudioSessionCategoryRecord;\n\n  XCTAssertTrue([self.manager configureAudioSession]);\n  XCTAssertEqual(self.fakeSession.setCategoryCallCount, 0);\n  XCTAssertEqual(self.fakeSession.setAllowHapticsCallCount, 0);\n}\n\n- (void)testConfigureAudioSessionNoOpsWhenDesiredOptionsAlreadySet\n{\n  XCTAssertTrue([self.manager areDesiredOptionsSet]);\n  XCTAssertTrue([self.manager configureAudioSession]);\n  XCTAssertEqual(self.fakeSession.setCategoryCallCount, 0);\n  XCTAssertEqual(self.fakeSession.setAllowHapticsCallCount, 0);\n}\n\n- (void)testConfigureAudioSessionWritesCategoryModeOptionsAndHaptics\n{\n  self.manager.desiredCategory = AVAudioSessionCategoryPlayAndRecord;\n  self.manager.desiredMode = AVAudioSessionModeVoiceChat;\n  self.manager.desiredOptions =\n      AVAudioSessionCategoryOptionDuckOthers | AVAudioSessionCategoryOptionDefaultToSpeaker;\n  self.manager.allowHapticsAndSounds = true;\n  self.fakeSession.category = AVAudioSessionCategoryAmbient;\n  self.fakeSession.mode = AVAudioSessionModeMoviePlayback;\n  self.fakeSession.categoryOptions = AVAudioSessionCategoryOptionMixWithOthers;\n  self.fakeSession.allowHapticsAndSystemSoundsDuringRecording = NO;\n\n  XCTAssertTrue([self.manager configureAudioSession]);\n  XCTAssertEqual(self.fakeSession.setCategoryCallCount, 1);\n  XCTAssertEqual(self.fakeSession.setAllowHapticsCallCount, 1);\n  XCTAssertEqualObjects(self.fakeSession.category, AVAudioSessionCategoryPlayAndRecord);\n  XCTAssertEqualObjects(self.fakeSession.mode, AVAudioSessionModeVoiceChat);\n  XCTAssertEqual(\n      self.fakeSession.categoryOptions,\n      AVAudioSessionCategoryOptionDuckOthers | AVAudioSessionCategoryOptionDefaultToSpeaker);\n  XCTAssertTrue(self.fakeSession.allowHapticsAndSystemSoundsDuringRecording);\n}\n\n- (void)testConfigureAudioSessionReturnsFalseWhenSettingCategoryFails\n{\n  self.manager.desiredCategory = AVAudioSessionCategoryRecord;\n  self.fakeSession.setCategoryError =\n      [NSError errorWithDomain:@\"AudioSessionTests\" code:100 userInfo:nil];\n\n  XCTAssertFalse([self.manager configureAudioSession]);\n  XCTAssertEqual(self.fakeSession.setCategoryCallCount, 1);\n  XCTAssertEqual(self.fakeSession.setAllowHapticsCallCount, 0);\n}\n\n- (void)testConfigureAudioSessionReturnsFalseWhenSettingHapticsFails\n{\n  self.manager.desiredCategory = AVAudioSessionCategoryPlayAndRecord;\n  self.manager.allowHapticsAndSounds = true;\n  self.fakeSession.category = AVAudioSessionCategoryAmbient;\n  self.fakeSession.setAllowHapticsError =\n      [NSError errorWithDomain:@\"AudioSessionTests\" code:101 userInfo:nil];\n\n  XCTAssertFalse([self.manager configureAudioSession]);\n  XCTAssertEqual(self.fakeSession.setCategoryCallCount, 1);\n  XCTAssertEqual(self.fakeSession.setAllowHapticsCallCount, 1);\n}\n\n- (void)testSetAudioSessionOptionsUpdatesDesiredValuesAndReconfiguresWhenActive\n{\n  self.manager.isActive = true;\n  self.fakeSession.category = AVAudioSessionCategoryAmbient;\n\n  [self.manager setAudioSessionOptions:@\"playAndRecord\"\n                                  mode:@\"voiceChat\"\n                               options:@[ @\"duckOthers\", @\"defaultToSpeaker\", @\"allowBluetoothHFP\" ]\n                          allowHaptics:YES\n            notifyOthersOnDeactivation:NO];\n\n  XCTAssertEqualObjects(self.manager.desiredCategory, AVAudioSessionCategoryPlayAndRecord);\n  XCTAssertEqualObjects(self.manager.desiredMode, AVAudioSessionModeVoiceChat);\n  XCTAssertEqual(\n      self.manager.desiredOptions,\n      AVAudioSessionCategoryOptionDuckOthers | AVAudioSessionCategoryOptionDefaultToSpeaker | 0x4);\n  XCTAssertTrue(self.manager.allowHapticsAndSounds);\n  XCTAssertFalse(self.manager.notifyOthersOnDeactivation);\n  XCTAssertEqual(self.fakeSession.setCategoryCallCount, 1);\n}\n\n- (void)testSetAudioSessionOptionsSkipsReconfigureWhenConfigIsUnchanged\n{\n  self.manager.isActive = true;\n\n  [self.manager setAudioSessionOptions:@\"playback\"\n                                  mode:@\"default\"\n                               options:@[]\n                          allowHaptics:NO\n            notifyOthersOnDeactivation:NO];\n\n  XCTAssertFalse(self.manager.notifyOthersOnDeactivation);\n  XCTAssertEqual(self.fakeSession.setCategoryCallCount, 0);\n  XCTAssertEqual(self.fakeSession.setAllowHapticsCallCount, 0);\n}\n\n- (void)testSetActiveTrueActivatesSession\n{\n  NSError *error = nil;\n\n  XCTAssertTrue([self.manager setActive:true error:&error]);\n  XCTAssertNil(error);\n  XCTAssertTrue(self.manager.isActive);\n  XCTAssertEqual(self.fakeSession.setActiveCallCount, 1);\n  XCTAssertTrue(self.fakeSession.lastSetActiveValue);\n  XCTAssertEqual(self.fakeSession.lastSetActiveOptions, (AVAudioSessionSetActiveOptions)0);\n}\n\n- (void)testSetActiveFalseNoOpsWhenSessionManagementIsDisabled\n{\n  self.manager.shouldManageSession = false;\n  self.manager.isActive = true;\n  NSError *error = nil;\n\n  XCTAssertTrue([self.manager setActive:false error:&error]);\n  XCTAssertNil(error);\n  XCTAssertEqual(self.fakeSession.setActiveCallCount, 0);\n  XCTAssertTrue(self.manager.isActive);\n}\n\n- (void)testSetActiveFalseNoOpsWhenSessionIsAlreadyInactive\n{\n  NSError *error = nil;\n\n  XCTAssertTrue([self.manager setActive:false error:&error]);\n  XCTAssertNil(error);\n  XCTAssertEqual(self.fakeSession.setActiveCallCount, 0);\n  XCTAssertFalse(self.manager.isActive);\n}\n\n- (void)testSetActiveFalseUsesNotifyOthersOnDeactivationWhenEnabled\n{\n  self.manager.isActive = true;\n  self.manager.notifyOthersOnDeactivation = true;\n\n  XCTAssertTrue([self.manager setActive:false error:nil]);\n  XCTAssertEqual(self.fakeSession.setActiveCallCount, 1);\n  XCTAssertFalse(self.fakeSession.lastSetActiveValue);\n  XCTAssertEqual(\n      self.fakeSession.lastSetActiveOptions,\n      AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation);\n  XCTAssertFalse(self.manager.isActive);\n}\n\n- (void)testSetActiveFalseUsesZeroOptionsWhenNotifyOthersOnDeactivationIsDisabled\n{\n  self.manager.isActive = true;\n  self.manager.notifyOthersOnDeactivation = false;\n\n  XCTAssertTrue([self.manager setActive:false error:nil]);\n  XCTAssertEqual(self.fakeSession.setActiveCallCount, 1);\n  XCTAssertEqual(self.fakeSession.lastSetActiveOptions, (AVAudioSessionSetActiveOptions)0);\n}\n\n- (void)testActivateSessionIfNeededRespectsCachedActiveStateAndForce\n{\n  self.manager.isActive = true;\n\n  XCTAssertTrue([self.manager activateSessionIfNeeded:false error:nil]);\n  XCTAssertEqual(self.fakeSession.setActiveCallCount, 0);\n\n  XCTAssertTrue([self.manager activateSessionIfNeeded:true error:nil]);\n  XCTAssertEqual(self.fakeSession.setActiveCallCount, 1);\n  XCTAssertTrue(self.manager.isActive);\n}\n\n- (void)testActivateSessionIfNeededReturnsFalseWhenConfigurationFails\n{\n  self.manager.desiredCategory = AVAudioSessionCategoryRecord;\n  self.fakeSession.setCategoryError =\n      [NSError errorWithDomain:@\"AudioSessionTests\" code:102 userInfo:nil];\n\n  XCTAssertFalse([self.manager activateSessionIfNeeded:false error:nil]);\n  XCTAssertEqual(self.fakeSession.setCategoryCallCount, 1);\n  XCTAssertEqual(self.fakeSession.setActiveCallCount, 0);\n  XCTAssertFalse(self.manager.isActive);\n}\n\n- (void)testEnsureActiveNoOpsWhenSessionManagementIsDisabled\n{\n  self.manager.shouldManageSession = false;\n\n  XCTAssertTrue([self.manager ensureActive:false error:nil]);\n  XCTAssertEqual(self.fakeSession.setActiveCallCount, 0);\n}\n\n- (void)testInputDiagnosticsSnapshotReportsCurrentRouteAndOwnershipState\n{\n  self.fakeSession.sampleRate = 48000;\n  self.fakeSession.inputNumberOfChannels = 4;\n  self.fakeSession.currentRoute.inputs = @[ [self portWithName:@\"Mic\" type:@\"mic\" uid:@\"mic-1\"] ];\n  self.fakeSession.currentRoute.outputs =\n      @[ [self portWithName:@\"Speaker\" type:@\"speaker\" uid:@\"spk-1\"] ];\n\n  NSString *snapshot = [self.manager inputDiagnosticsSnapshot];\n\n  XCTAssertTrue([snapshot containsString:@\"active=false\"]);\n  XCTAssertTrue([snapshot containsString:@\"shouldManage=true\"]);\n  XCTAssertTrue([snapshot containsString:@\"sampleRate=48000.000000\"]);\n  XCTAssertTrue([snapshot containsString:@\"inputChannels=4\"]);\n  XCTAssertTrue([snapshot containsString:@\"Mic(mic,mic-1)\"]);\n  XCTAssertTrue([snapshot containsString:@\"Speaker(speaker,spk-1)\"]);\n}\n\n- (void)testParseDeviceListMapsPortDescriptionsToDictionaries\n{\n  NSArray<NSDictionary *> *devices = [self.manager parseDeviceList:@[\n    (AVAudioSessionPortDescription *)[self portWithName:@\"Mic\" type:@\"mic\" uid:@\"mic-1\"],\n    (AVAudioSessionPortDescription *)[self portWithName:@\"Speaker\" type:@\"speaker\" uid:@\"spk-1\"],\n  ]];\n\n  XCTAssertEqualObjects(devices, (@[\n    @{\n      @\"name\" : @\"Mic\",\n      @\"category\" : @\"mic\",\n      @\"id\" : @\"mic-1\",\n    },\n    @{\n      @\"name\" : @\"Speaker\",\n      @\"category\" : @\"speaker\",\n      @\"id\" : @\"spk-1\",\n    },\n  ]));\n}\n\n- (void)testGetDevicesInfoReturnsAvailableAndCurrentRouteSnapshots\n{\n  FakeAudioPortDescription *availableInput = [self portWithName:@\"Available Mic\" type:@\"mic\" uid:@\"in-1\"];\n  FakeAudioPortDescription *currentInput = [self portWithName:@\"Current Mic\" type:@\"mic\" uid:@\"in-2\"];\n  FakeAudioPortDescription *currentOutput =\n      [self portWithName:@\"Speaker\" type:@\"speaker\" uid:@\"out-1\"];\n  self.fakeSession.availableInputs = @[ availableInput ];\n  self.fakeSession.currentRoute.inputs = @[ currentInput ];\n  self.fakeSession.currentRoute.outputs = @[ currentOutput ];\n\n  __block NSDictionary *resolvedValue = nil;\n\n  [self.manager getDevicesInfo:^(id result) {\n    resolvedValue = result;\n  }\n                     reject:^(NSString *code, NSString *message, NSError *error){\n                     }];\n\n  XCTAssertNotNil(resolvedValue);\n  XCTAssertEqualObjects(\n      resolvedValue[@\"availableInputs\"],\n      (@[\n        @{\n          @\"name\" : @\"Available Mic\",\n          @\"category\" : @\"mic\",\n          @\"id\" : @\"in-1\",\n        },\n      ]));\n  XCTAssertEqualObjects(\n      resolvedValue[@\"currentInputs\"],\n      (@[\n        @{\n          @\"name\" : @\"Current Mic\",\n          @\"category\" : @\"mic\",\n          @\"id\" : @\"in-2\",\n        },\n      ]));\n  XCTAssertEqualObjects(\n      resolvedValue[@\"availableOutputs\"],\n      (@[\n        @{\n          @\"name\" : @\"Speaker\",\n          @\"category\" : @\"speaker\",\n          @\"id\" : @\"out-1\",\n        },\n      ]));\n  XCTAssertEqualObjects(\n      resolvedValue[@\"currentOutputs\"],\n      (@[\n        @{\n          @\"name\" : @\"Speaker\",\n          @\"category\" : @\"speaker\",\n          @\"id\" : @\"out-1\",\n        },\n      ]));\n}\n\n- (void)testSetInputDeviceRejectsWhenDeviceIsMissing\n{\n  self.fakeSession.availableInputs = @[ [self portWithName:@\"Mic\" type:@\"mic\" uid:@\"mic-1\"] ];\n  __block NSString *rejectedMessage = nil;\n\n  [self.manager setInputDevice:@\"missing-device\"\n                       resolve:^(id result){\n                       }\n                        reject:^(NSString *code, NSString *message, NSError *error) {\n                          rejectedMessage = message;\n                        }];\n\n  XCTAssertEqualObjects(rejectedMessage, @\"Input device with id missing-device not found\");\n  XCTAssertEqual(self.fakeSession.setPreferredInputCallCount, 0);\n}\n\n- (void)testSetInputDeviceRejectsWhenSettingPreferredInputFails\n{\n  FakeAudioPortDescription *input = [self portWithName:@\"Mic\" type:@\"mic\" uid:@\"mic-1\"];\n  self.fakeSession.availableInputs = @[ input ];\n  self.fakeSession.setPreferredInputError =\n      [NSError errorWithDomain:@\"AudioSessionTests\" code:103 userInfo:nil];\n  __block NSString *rejectedMessage = nil;\n  __block NSError *rejectedError = nil;\n\n  [self.manager setInputDevice:@\"mic-1\"\n                       resolve:^(id result){\n                       }\n                        reject:^(NSString *code, NSString *message, NSError *error) {\n                          rejectedMessage = message;\n                          rejectedError = error;\n                        }];\n\n  XCTAssertNotNil(rejectedMessage);\n  XCTAssertTrue([rejectedMessage containsString:@\"Error while setting preferred input\"]);\n  XCTAssertEqual(rejectedError.code, 103);\n  XCTAssertEqual(self.fakeSession.setPreferredInputCallCount, 1);\n}\n\n- (void)testSetInputDeviceResolvesWhenSettingPreferredInputSucceeds\n{\n  FakeAudioPortDescription *input = [self portWithName:@\"Mic\" type:@\"mic\" uid:@\"mic-1\"];\n  self.fakeSession.availableInputs = @[ input ];\n  __block id resolvedValue = nil;\n\n  [self.manager setInputDevice:@\"mic-1\"\n                       resolve:^(id result) {\n                         resolvedValue = result;\n                       }\n                        reject:^(NSString *code, NSString *message, NSError *error){\n                        }];\n\n  XCTAssertEqualObjects(resolvedValue, @YES);\n  XCTAssertEqual(self.fakeSession.setPreferredInputCallCount, 1);\n  XCTAssertEqualObjects(self.fakeSession.lastPreferredInput, input);\n}\n\n- (void)testRequestRecordingPermissionsReturnsDeniedWhenMicrophoneUsageDescriptionIsMissing\n{\n  self.manager.overriddenMicrophoneUsageDescription = nil;\n\n  XCTAssertEqualObjects([self.manager requestRecordingPermissions], @\"Denied\");\n  XCTAssertEqual(self.manager.requestSystemRecordPermissionCallCount, 0);\n}\n\n- (void)testRequestRecordingPermissionsRejectsWhenMicrophoneUsageDescriptionIsMissing\n{\n  self.manager.overriddenMicrophoneUsageDescription = nil;\n  __block NSString *rejectedMessage = nil;\n\n  [self.manager requestRecordingPermissions:^(id result) {\n    XCTFail(@\"Expected missing microphone usage description to reject\");\n  }\n                                reject:^(NSString *code, NSString *message, NSError *error) {\n                                  rejectedMessage = message;\n                                }];\n\n  XCTAssertEqualObjects(\n      rejectedMessage,\n      @\"There is no NSMicrophoneUsageDescription entry in info.plist file. App cannot access microphone without it.\");\n}\n\n- (void)testRequestRecordingPermissionsUsesOverridableSystemPermissionFlow\n{\n  self.manager.overriddenRequestPermissionResult = YES;\n\n  XCTAssertEqualObjects([self.manager requestRecordingPermissions], @\"Granted\");\n  XCTAssertEqual(self.manager.requestSystemRecordPermissionCallCount, 1);\n}\n\n- (void)testCheckRecordingPermissionsMapsStatusesToUserVisibleValues\n{\n  self.manager.shouldUseAudioApplicationRecordPermissionAPI = NO;\n  self.manager.hasOverriddenRecordPermissionStatus = YES;\n\n  self.manager.overriddenRecordPermissionStatus = AVAudioSessionRecordPermissionUndetermined;\n  XCTAssertEqualObjects([self.manager checkRecordingPermissions], @\"Undetermined\");\n\n  self.manager.overriddenRecordPermissionStatus = AVAudioSessionRecordPermissionGranted;\n  XCTAssertEqualObjects([self.manager checkRecordingPermissions], @\"Granted\");\n\n  self.manager.overriddenRecordPermissionStatus = AVAudioSessionRecordPermissionDenied;\n  XCTAssertEqualObjects([self.manager checkRecordingPermissions], @\"Denied\");\n}\n\n@end\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExampleTests/IOSAudioRecorderTests.mm",
    "content": "#import <XCTest/XCTest.h>\n\n#import <audioapi/core/OfflineAudioContext.h>\n#import <audioapi/ios/core/NativeAudioRecorder.h>\n#import <audioapi/ios/system/AudioEngine.h>\n#import <audioapi/ios/system/AudioSessionManager.h>\n#import <audioapi/core/inputs/AudioRecorder.h>\n#import <audioapi/core/sources/RecorderAdapterNode.h>\n#import <audioapi/utils/AudioFileProperties.h>\n\n#include <memory>\n#include <string>\n#include <tuple>\n\nusing namespace audioapi;\n\nstatic NSString *NSStringFromStdString(const std::string &value)\n{\n  return [NSString stringWithUTF8String:value.c_str()];\n}\n\nnamespace audioapi {\n\nclass AudioEventHandlerRegistry;\n\nclass IOSAudioRecorder : public AudioRecorder {\n public:\n  IOSAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);\n  ~IOSAudioRecorder() override;\n\n  Result<NoneType, std::string> start(const std::string &fileNameOverride = \"\") override;\n  Result<std::tuple<std::vector<std::string>, double, double>, std::string> stop() override;\n\n  Result<NoneType, std::string> enableFileOutput(\n      std::shared_ptr<AudioFileProperties> properties) override;\n  void disableFileOutput() override;\n\n  void connect(const std::shared_ptr<RecorderAdapterNode> &node) override;\n  void disconnect() override;\n\n  void pause() override;\n  void resume() override;\n\n  bool isRecording() const override;\n  bool isPaused() const override;\n  bool isIdle() const override;\n\n  Result<NoneType, std::string> setOnAudioReadyCallback(\n      float sampleRate,\n      size_t bufferLength,\n      int channelCount,\n      uint64_t callbackId) override;\n  void clearOnAudioReadyCallback() override;\n\n protected:\n  NativeAudioRecorder *nativeRecorder_;\n};\n\n} // namespace audioapi\n\n@interface FakeIOSRecorderFormat : NSObject\n\n@property(nonatomic, assign) double sampleRate;\n@property(nonatomic, assign) AVAudioChannelCount channelCount;\n@property(nonatomic, assign, getter=isInterleaved) BOOL interleaved;\n\n@end\n\n@implementation FakeIOSRecorderFormat\n@end\n\n@interface FakeIOSRecorderAudioEngine : AudioEngine\n@end\n\n@implementation FakeIOSRecorderAudioEngine\n\n- (void)createAudioEngineIfNeeded\n{\n  // Avoid spinning up a real AVAudioEngine inside unit tests.\n}\n\n@end\n\n@interface FakeIOSRecorderAudioSessionManager : AudioSessionManager\n\n@property(nonatomic, copy) NSString *recordingPermissions;\n@property(nonatomic, assign) double diagnosticSampleRate;\n@property(nonatomic, assign) AVAudioChannelCount diagnosticInputChannels;\n@property(nonatomic, assign) BOOL routeReady;\n\n@end\n\n@implementation FakeIOSRecorderAudioSessionManager\n\n- (instancetype)init\n{\n  if (self = [super init]) {\n    self.recordingPermissions = @\"Granted\";\n    self.diagnosticSampleRate = 44100;\n    self.diagnosticInputChannels = 2;\n    self.routeReady = YES;\n  }\n\n  return self;\n}\n\n- (NSString *)checkRecordingPermissions\n{\n  return self.recordingPermissions;\n}\n\n- (bool)ensureActive:(bool)force error:(NSError **)error\n{\n  if (error != nil) {\n    *error = nil;\n  }\n  return true;\n}\n\n- (NSString *)inputDiagnosticsSnapshot\n{\n  return [NSString stringWithFormat:@\"session={active=%@, sampleRate=%f, inputChannels=%lu}; \"\n                                   @\"route={routeReady=%@}\",\n                                   self.isActive ? @\"true\" : @\"false\",\n                                   self.diagnosticSampleRate,\n                                   (unsigned long)self.diagnosticInputChannels,\n                                   self.routeReady ? @\"true\" : @\"false\"];\n}\n\n@end\n\n@interface FakeNativeAudioRecorder : NativeAudioRecorder\n\n@property(nonatomic, strong) id mockResolvedInputFormat;\n@property(nonatomic, assign) int mockResolvedBufferSize;\n@property(nonatomic, assign) BOOL startResult;\n@property(nonatomic, strong) NSError *startError;\n@property(nonatomic, assign) NSInteger startCallCount;\n@property(nonatomic, assign) NSInteger stopCallCount;\n@property(nonatomic, assign) NSInteger pauseCallCount;\n@property(nonatomic, assign) NSInteger resumeCallCount;\n@property(nonatomic, assign) NSInteger cleanupCallCount;\n@property(nonatomic, assign) NSInteger setInputArmedCallCount;\n@property(nonatomic, assign) BOOL lastInputArmed;\n@property(nonatomic, assign) BOOL throwsOnStart;\n@property(nonatomic, strong) NSException *startException;\n\n@end\n\n@implementation FakeNativeAudioRecorder\n\n- (instancetype)init\n{\n  if (self = [super initWithReceiverBlock:^(const AudioBufferList *inputBuffer, int numFrames) {\n      }]) {\n    self.mockResolvedInputFormat =\n        [[AVAudioFormat alloc] initStandardFormatWithSampleRate:44100 channels:2];\n    self.mockResolvedBufferSize = 512;\n    self.startResult = YES;\n  }\n\n  return self;\n}\n\n- (AVAudioFormat *)getResolvedInputFormat\n{\n  return (AVAudioFormat *)self.mockResolvedInputFormat;\n}\n\n- (int)getResolvedBufferSize\n{\n  return self.mockResolvedBufferSize;\n}\n\n- (BOOL)start:(NSError **)error\n{\n  self.startCallCount += 1;\n\n  if (self.throwsOnStart) {\n    @throw self.startException ?: [NSException exceptionWithName:@\"FakeStartException\"\n                                                          reason:@\"boom\"\n                                                        userInfo:nil];\n  }\n\n  if (error != nil) {\n    *error = self.startError;\n  }\n\n  return self.startResult;\n}\n\n- (void)setInputArmed:(BOOL)armed\n{\n  self.setInputArmedCallCount += 1;\n  self.lastInputArmed = armed;\n  [super setInputArmed:armed];\n}\n\n- (void)stop\n{\n  self.stopCallCount += 1;\n}\n\n- (void)pause\n{\n  self.pauseCallCount += 1;\n}\n\n- (void)resume\n{\n  self.resumeCallCount += 1;\n}\n\n- (void)cleanup\n{\n  self.cleanupCallCount += 1;\n  [super cleanup];\n}\n\n@end\n\nclass TestableIOSAudioRecorder : public IOSAudioRecorder {\n public:\n  explicit TestableIOSAudioRecorder(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)\n      : IOSAudioRecorder(audioEventHandlerRegistry) {}\n\n  NativeAudioRecorder *replaceNativeRecorder(NativeAudioRecorder *nativeRecorder)\n  {\n    NativeAudioRecorder *previous = nativeRecorder_;\n    nativeRecorder_ = nativeRecorder;\n    return previous;\n  }\n\n  void setRecorderState(RecorderState state)\n  {\n    state_.store(state, std::memory_order_release);\n  }\n\n  std::string currentFilePath() const\n  {\n    return filePath_;\n  }\n\n  bool fileOutputEnabledIntent() const\n  {\n    return fileOutputEnabled_.load(std::memory_order_acquire);\n  }\n\n  bool fileOutputConfigured() const\n  {\n    return fileOutputConfigured_.load(std::memory_order_acquire);\n  }\n\n  bool callbackOutputEnabledIntent() const\n  {\n    return callbackOutputEnabled_.load(std::memory_order_acquire);\n  }\n\n  bool callbackOutputConfigured() const\n  {\n    return callbackOutputConfigured_.load(std::memory_order_acquire);\n  }\n\n  bool connectionEnabledIntent() const\n  {\n    return isConnected_.load(std::memory_order_acquire);\n  }\n\n  bool connectionConfigured() const\n  {\n    return connectedConfigured_.load(std::memory_order_acquire);\n  }\n};\n\n@interface IOSAudioRecorderTests : XCTestCase {\n @private\n  std::unique_ptr<TestableIOSAudioRecorder> _recorder;\n}\n\n@property(nonatomic, strong) FakeIOSRecorderAudioEngine *audioEngine;\n@property(nonatomic, strong) FakeIOSRecorderAudioSessionManager *sessionManager;\n@property(nonatomic, strong) FakeNativeAudioRecorder *nativeRecorder;\n@property(nonatomic, assign) NativeAudioRecorder *originalNativeRecorder;\n\n@end\n\n@implementation IOSAudioRecorderTests\n\n- (void)setUp\n{\n  [super setUp];\n\n  self.sessionManager = [[FakeIOSRecorderAudioSessionManager alloc] init];\n  self.audioEngine = [[FakeIOSRecorderAudioEngine alloc] init];\n  self.nativeRecorder = [[FakeNativeAudioRecorder alloc] init];\n\n  _recorder = std::make_unique<TestableIOSAudioRecorder>(std::shared_ptr<AudioEventHandlerRegistry>());\n  self.originalNativeRecorder = _recorder->replaceNativeRecorder(self.nativeRecorder);\n}\n\n- (void)tearDown\n{\n  if (self.originalNativeRecorder != nil) {\n    [self.originalNativeRecorder cleanup];\n  }\n\n  _recorder.reset();\n\n  [self.audioEngine cleanup];\n  [self.sessionManager cleanup];\n\n  self.originalNativeRecorder = nil;\n  self.nativeRecorder = nil;\n  self.audioEngine = nil;\n  self.sessionManager = nil;\n\n  [super tearDown];\n}\n\n- (std::shared_ptr<AudioFileProperties>)validFileProperties\n{\n  return std::make_shared<AudioFileProperties>(\n      AudioFileProperties::FileDirectory::Cache,\n      \"fabric-example-tests\",\n      \"ios-recorder-test\",\n      2,\n      1,\n      0,\n      AudioFileProperties::Format::WAV,\n      44100,\n      128000,\n      AudioFileProperties::BitDepth::Bit16,\n      0,\n      0,\n      AudioFileProperties::IOSAudioQuality::High);\n}\n\n- (id)invalidFormat\n{\n  FakeIOSRecorderFormat *format = [[FakeIOSRecorderFormat alloc] init];\n  format.sampleRate = 0;\n  format.channelCount = 0;\n  format.interleaved = NO;\n  return format;\n}\n\n- (id)validMultichannelFormat\n{\n  AVAudioChannelLayout *layout =\n      [[AVAudioChannelLayout alloc] initWithLayoutTag:kAudioChannelLayoutTag_MPEG_7_1_A];\n  return [[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatFloat32\n                                          sampleRate:44100\n                                         interleaved:NO\n                                       channelLayout:layout];\n}\n\n- (void)testStartReturnsErrorWhenRecorderIsNotIdle\n{\n  _recorder->setRecorderState(AudioRecorder::RecorderState::Paused);\n\n  auto result = _recorder->start(\"\");\n\n  XCTAssertTrue(result.is_err());\n  XCTAssertEqualObjects(NSStringFromStdString(result.unwrap_err()), @\"Recorder is already recording\");\n}\n\n- (void)testStartReturnsErrorWhenRecordingPermissionIsDenied\n{\n  self.sessionManager.recordingPermissions = @\"Denied\";\n\n  auto result = _recorder->start(\"\");\n\n  XCTAssertTrue(result.is_err());\n  XCTAssertEqualObjects(\n      NSStringFromStdString(result.unwrap_err()),\n      @\"Microphone permissions are not granted\");\n}\n\n- (void)testStartReturnsErrorWhenSessionActivationFails\n{\n  self.nativeRecorder.startResult = NO;\n  self.nativeRecorder.startError =\n      [NSError errorWithDomain:@\"RecorderTests\" code:7 userInfo:@{NSLocalizedDescriptionKey : @\"boom\"}];\n\n  auto result = _recorder->start(\"\");\n\n  XCTAssertTrue(result.is_err());\n  NSString *message = NSStringFromStdString(result.unwrap_err());\n  XCTAssertTrue([message containsString:@\"Failed to start native recorder\"]);\n  XCTAssertTrue([message containsString:@\"RecorderTests\"]);\n}\n\n- (void)testStartReturnsErrorWhenNativeRecorderThrows\n{\n  self.nativeRecorder.throwsOnStart = YES;\n  self.nativeRecorder.startException = [NSException exceptionWithName:@\"WrongCategory\"\n                                                               reason:@\"attempt-wrong-category-record\"\n                                                             userInfo:nil];\n\n  auto result = _recorder->start(\"\");\n\n  XCTAssertTrue(result.is_err());\n  XCTAssertEqual(self.nativeRecorder.startCallCount, 1);\n  XCTAssertEqual(self.nativeRecorder.stopCallCount, 1);\n\n  NSString *message = NSStringFromStdString(result.unwrap_err());\n  XCTAssertTrue([message containsString:@\"Failed to start native recorder\"]);\n  XCTAssertTrue([message containsString:@\"WrongCategory\"]);\n  XCTAssertTrue([message containsString:@\"attempt-wrong-category-record\"]);\n  XCTAssertTrue([message containsString:@\"session={\"]);\n}\n\n- (void)testStartReturnsErrorWhenEngineInputFormatIsUnavailable\n{\n  self.nativeRecorder.mockResolvedInputFormat = [self invalidFormat];\n  self.sessionManager.diagnosticSampleRate = 0;\n  self.sessionManager.diagnosticInputChannels = 0;\n  self.sessionManager.routeReady = NO;\n\n  auto result = _recorder->start(\"\");\n\n  XCTAssertTrue(result.is_err());\n  XCTAssertEqual(self.nativeRecorder.startCallCount, 1);\n  XCTAssertEqual(self.nativeRecorder.stopCallCount, 1);\n\n  NSString *message = NSStringFromStdString(result.unwrap_err());\n  XCTAssertTrue([message containsString:@\"Audio input format is unavailable\"]);\n  XCTAssertTrue([message containsString:@\"engineFormat={sampleRate=0.000000, channelCount=0\"]);\n  XCTAssertTrue([message containsString:@\"sampleRate=0.000000\"]);\n  XCTAssertTrue([message containsString:@\"inputChannels=0\"]);\n  XCTAssertTrue([message containsString:@\"routeReady=false\"]);\n}\n\n- (void)testStartSucceedsWhenResolvedInputFormatIsAvailable\n{\n  self.audioEngine.state = AudioEngineStateRunning;\n  self.nativeRecorder.mockResolvedInputFormat = [self validMultichannelFormat];\n\n  auto result = _recorder->start(\"\");\n\n  XCTAssertTrue(result.is_ok());\n  XCTAssertEqual(self.nativeRecorder.startCallCount, 1);\n  XCTAssertFalse(_recorder->isIdle());\n  XCTAssertTrue(self.nativeRecorder.lastInputArmed);\n  XCTAssertGreaterThanOrEqual(self.nativeRecorder.setInputArmedCallCount, 1);\n  XCTAssertFalse(_recorder->isIdle());\n  XCTAssertEqual(_recorder->currentFilePath(), \"\");\n}\n\n- (void)testStartPreparesMonoCallbackAgainstResolvedMultichannelInputFormat\n{\n  self.audioEngine.state = AudioEngineStateRunning;\n  self.nativeRecorder.mockResolvedInputFormat = [self validMultichannelFormat];\n\n  auto callbackResult = _recorder->setOnAudioReadyCallback(48000, 256, 1, 99);\n  XCTAssertTrue(callbackResult.is_ok());\n\n  auto startResult = _recorder->start(\"\");\n\n  XCTAssertTrue(startResult.is_ok());\n  XCTAssertTrue(_recorder->usesCallback());\n  XCTAssertTrue(self.nativeRecorder.lastInputArmed);\n}\n\n- (void)testEnableFileOutputWhileIdleTracksIntentWithoutLiveWriter\n{\n  auto enableResult = _recorder->enableFileOutput([self validFileProperties]);\n\n  XCTAssertTrue(enableResult.is_ok());\n  XCTAssertTrue(_recorder->fileOutputEnabledIntent());\n  XCTAssertFalse(_recorder->fileOutputConfigured());\n  XCTAssertFalse(_recorder->usesFileOutput());\n  XCTAssertEqual(_recorder->getCurrentDuration(), 0.0);\n\n  _recorder->clearOnErrorCallback();\n}\n\n- (void)testSetOnAudioReadyWhileIdleTracksIntentWithoutLiveCallback\n{\n  auto callbackResult = _recorder->setOnAudioReadyCallback(48000, 256, 1, 99);\n\n  XCTAssertTrue(callbackResult.is_ok());\n  XCTAssertTrue(_recorder->callbackOutputEnabledIntent());\n  XCTAssertFalse(_recorder->callbackOutputConfigured());\n  XCTAssertFalse(_recorder->usesCallback());\n}\n\n- (void)testConnectWhileIdleTracksIntentWithoutLiveConnection\n{\n  auto context =\n      std::make_shared<OfflineAudioContext>(2, 512, 44100.0f, nullptr, RuntimeRegistry{});\n  context->initialize();\n  auto adapter = context->createRecorderAdapter();\n\n  _recorder->connect(adapter);\n\n  XCTAssertTrue(_recorder->connectionEnabledIntent());\n  XCTAssertFalse(_recorder->connectionConfigured());\n  XCTAssertFalse(_recorder->isConnected());\n}\n\n- (void)testStartDoesNotAttemptToManageSessionWhenOwnershipIsExternal\n{\n  self.sessionManager.shouldManageSession = NO;\n\n  auto result = _recorder->start(\"\");\n\n  XCTAssertTrue(result.is_ok());\n  XCTAssertEqual(self.nativeRecorder.startCallCount, 1);\n}\n\n- (void)testPauseAndResumeRespectCurrentState\n{\n  _recorder->pause();\n  _recorder->resume();\n\n  XCTAssertEqual(self.nativeRecorder.pauseCallCount, 0);\n  XCTAssertEqual(self.nativeRecorder.resumeCallCount, 0);\n\n  _recorder->setRecorderState(AudioRecorder::RecorderState::Recording);\n  self.audioEngine.state = AudioEngineStateRunning;\n  _recorder->pause();\n\n  XCTAssertEqual(self.nativeRecorder.pauseCallCount, 1);\n  XCTAssertTrue(_recorder->isPaused());\n\n  _recorder->resume();\n\n  XCTAssertEqual(self.nativeRecorder.resumeCallCount, 1);\n  XCTAssertFalse(_recorder->isPaused());\n}\n\n- (void)testStopReturnsErrorWhileIdle\n{\n  auto result = _recorder->stop();\n\n  XCTAssertTrue(result.is_err());\n  XCTAssertEqualObjects(\n      NSStringFromStdString(result.unwrap_err()),\n      @\"Recorder is not in recording state.\");\n}\n\n- (void)testStopSucceedsAfterStartAndResetsState\n{\n  self.audioEngine.state = AudioEngineStateRunning;\n  auto startResult = _recorder->start(\"\");\n  XCTAssertTrue(startResult.is_ok());\n\n  auto stopResult = _recorder->stop();\n\n  XCTAssertTrue(stopResult.is_ok());\n  XCTAssertEqual(self.nativeRecorder.stopCallCount, 1);\n  XCTAssertTrue(_recorder->isIdle());\n  XCTAssertEqual(_recorder->currentFilePath(), \"\");\n  XCTAssertTrue(std::get<0>(stopResult.unwrap()).empty());\n  XCTAssertEqual(std::get<1>(stopResult.unwrap()), 0);\n  XCTAssertEqual(std::get<2>(stopResult.unwrap()), 0);\n}\n\n- (void)testStopClearsConfiguredStateButPreservesConfiguredIntent\n{\n  self.audioEngine.state = AudioEngineStateRunning;\n  auto context =\n      std::make_shared<OfflineAudioContext>(2, 512, 44100.0f, nullptr, RuntimeRegistry{});\n  context->initialize();\n  auto adapter = context->createRecorderAdapter();\n\n  XCTAssertTrue(_recorder->enableFileOutput([self validFileProperties]).is_ok());\n  XCTAssertTrue(_recorder->setOnAudioReadyCallback(48000, 256, 1, 99).is_ok());\n  _recorder->connect(adapter);\n\n  auto startResult = _recorder->start(\"\");\n  XCTAssertTrue(startResult.is_ok());\n  XCTAssertTrue(_recorder->fileOutputConfigured());\n  XCTAssertTrue(_recorder->callbackOutputConfigured());\n  XCTAssertTrue(_recorder->connectionConfigured());\n\n  auto stopResult = _recorder->stop();\n\n  XCTAssertTrue(stopResult.is_ok());\n  XCTAssertTrue(_recorder->fileOutputEnabledIntent());\n  XCTAssertFalse(_recorder->fileOutputConfigured());\n  XCTAssertFalse(_recorder->usesFileOutput());\n  XCTAssertTrue(_recorder->callbackOutputEnabledIntent());\n  XCTAssertFalse(_recorder->callbackOutputConfigured());\n  XCTAssertFalse(_recorder->usesCallback());\n  XCTAssertTrue(_recorder->connectionEnabledIntent());\n  XCTAssertFalse(_recorder->connectionConfigured());\n  XCTAssertFalse(_recorder->isConnected());\n}\n\n- (void)testFileOutputSmokeTest\n{\n  self.audioEngine.state = AudioEngineStateRunning;\n  auto enableResult = _recorder->enableFileOutput([self validFileProperties]);\n  XCTAssertTrue(enableResult.is_ok());\n\n  NSString *uuid = [[NSUUID UUID] UUIDString];\n  std::string fileName = [[NSString stringWithFormat:@\"ios-recorder-smoke-%@\", uuid] UTF8String];\n\n  auto startResult = _recorder->start(fileName);\n  XCTAssertTrue(startResult.is_ok());\n\n  NSString *path = NSStringFromStdString(_recorder->currentFilePath());\n  XCTAssertFalse(path.length == 0);\n  XCTAssertTrue([[NSFileManager defaultManager] fileExistsAtPath:path]);\n\n  auto stopResult = _recorder->stop();\n  XCTAssertTrue(stopResult.is_ok());\n  const auto &outputPaths = std::get<0>(stopResult.unwrap());\n  XCTAssertEqual(outputPaths.size(), 1U);\n  XCTAssertEqualObjects(\n      NSStringFromStdString(outputPaths.front()),\n      [@\"file://\" stringByAppendingString:path]);\n  XCTAssertGreaterThanOrEqual(std::get<1>(stopResult.unwrap()), 0.0);\n  XCTAssertGreaterThanOrEqual(std::get<2>(stopResult.unwrap()), 0.0);\n  XCTAssertEqual(_recorder->currentFilePath(), \"\");\n\n  [[NSFileManager defaultManager] removeItemAtPath:path error:nil];\n}\n\n- (void)testStartReturnsCallbackPreparationFailureForInvalidCallbackFormat\n{\n  auto callbackResult = _recorder->setOnAudioReadyCallback(0, 256, 2, 99);\n  XCTAssertTrue(callbackResult.is_ok());\n\n  auto result = _recorder->start(\"\");\n\n  XCTAssertTrue(result.is_err());\n  XCTAssertTrue(\n      [NSStringFromStdString(result.unwrap_err())\n          containsString:@\"Failed to prepare callback: Invalid callback format\"]);\n}\n\n- (void)testConnectWhileActiveInitializesAdapterAndDisconnectClearsIt\n{\n  auto context =\n      std::make_shared<OfflineAudioContext>(2, 512, 44100.0f, nullptr, RuntimeRegistry{});\n  context->initialize();\n  auto adapter = context->createRecorderAdapter();\n\n  XCTAssertFalse(_recorder->isConnected());\n  XCTAssertEqual(adapter->buff_.size(), 0U);\n\n  _recorder->setRecorderState(AudioRecorder::RecorderState::Recording);\n  _recorder->connect(adapter);\n\n  XCTAssertTrue(_recorder->isConnected());\n  XCTAssertEqual(adapter->buff_.size(), 2U);\n  XCTAssertTrue(adapter->buff_[0] != nullptr);\n  XCTAssertTrue(adapter->buff_[1] != nullptr);\n\n  _recorder->disconnect();\n\n  XCTAssertFalse(_recorder->isConnected());\n}\n\n@end\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExampleTests/NativeAudioRecorderTests.mm",
    "content": "#import <AudioToolbox/AudioServices.h>\n#import <XCTest/XCTest.h>\n#import <objc/runtime.h>\n\n#import <audioapi/ios/core/NativeAudioRecorder.h>\n#import <audioapi/ios/system/AudioEngine.h>\n#import <audioapi/ios/system/AudioSessionManager.h>\n\n#include <vector>\n\n@interface FakeRecorderFormat : NSObject\n\n@property(nonatomic, assign) double sampleRate;\n@property(nonatomic, assign) AVAudioChannelCount channelCount;\n@property(nonatomic, assign, getter=isInterleaved) BOOL interleaved;\n\n@end\n\n@implementation FakeRecorderFormat\n@end\n\n@interface FakeRecorderInputNode : NSObject\n\n@property(nonatomic, strong) id inputFormat;\n@property(nonatomic, strong) id outputFormat;\n\n- (AVAudioFormat *)inputFormatForBus:(AVAudioNodeBus)bus;\n- (AVAudioFormat *)outputFormatForBus:(AVAudioNodeBus)bus;\n\n@end\n\n@implementation FakeRecorderInputNode\n\n- (AVAudioFormat *)inputFormatForBus:(AVAudioNodeBus)bus\n{\n  return (AVAudioFormat *)self.inputFormat;\n}\n\n- (AVAudioFormat *)outputFormatForBus:(AVAudioNodeBus)bus\n{\n  return (AVAudioFormat *)self.outputFormat;\n}\n\n@end\n\n@interface FakeRecorderAVAudioEngine : AVAudioEngine\n\n@property(nonatomic, strong) FakeRecorderInputNode *fakeInputNode;\n\n@end\n\n@implementation FakeRecorderAVAudioEngine\n\n- (AVAudioInputNode *)inputNode\n{\n  return (AVAudioInputNode *)self.fakeInputNode;\n}\n\n@end\n\n@interface FakeRecorderSharedAVAudioSession : NSObject\n\n@property(nonatomic, assign) NSTimeInterval IOBufferDuration;\n@property(nonatomic, assign) double sampleRate;\n\n@end\n\n@implementation FakeRecorderSharedAVAudioSession\n@end\n\n@interface FakeRecorderAudioSessionManager : AudioSessionManager\n\n@end\n\n@implementation FakeRecorderAudioSessionManager\n\n@end\n\n@interface FakeRecorderAudioEngine : AudioEngine\n\n@property(nonatomic, strong) FakeRecorderAVAudioEngine *fakeAVAudioEngine;\n@property(nonatomic, assign) BOOL startIfNecessaryResult;\n@property(nonatomic, assign) NSInteger stopIfNecessaryCallCount;\n@property(nonatomic, assign) NSInteger attachInputNodeCallCount;\n@property(nonatomic, assign) NSInteger startIfNecessaryCallCount;\n@property(nonatomic, assign) NSInteger detachInputNodeCallCount;\n@property(nonatomic, assign) NSInteger stopIfPossibleCallCount;\n@property(nonatomic, assign) NSInteger restartAudioEngineCallCount;\n@property(nonatomic, assign) NSInteger pauseIfNecessaryCallCount;\n@property(nonatomic, assign) NSInteger rebuildAfterDeactivationCallCount;\n@property(nonatomic, strong) AVAudioSinkNode *lastAttachedInputNode;\n@property(nonatomic, copy) AVAudioSinkNodeReceiverBlock lastAttachedReceiverBlock;\n\n@end\n\n@implementation FakeRecorderAudioEngine\n\n- (void)createAudioEngineIfNeeded\n{\n  if (self.audioEngine != nil) {\n    return;\n  }\n\n  self.fakeAVAudioEngine = [[FakeRecorderAVAudioEngine alloc] init];\n  self.fakeAVAudioEngine.fakeInputNode = [[FakeRecorderInputNode alloc] init];\n  self.audioEngine = self.fakeAVAudioEngine;\n  self.startIfNecessaryResult = YES;\n}\n\n- (void)stopIfNecessary\n{\n  self.stopIfNecessaryCallCount += 1;\n}\n\n- (void)attachInputNodeWithReceiverBlock:(AVAudioSinkNodeReceiverBlock)receiverBlock\n{\n  self.attachInputNodeCallCount += 1;\n  self.inputNode = [[AVAudioSinkNode alloc] initWithReceiverBlock:receiverBlock];\n  self.lastAttachedInputNode = self.inputNode;\n  self.lastAttachedReceiverBlock = receiverBlock;\n}\n\n- (bool)startIfNecessary\n{\n  self.startIfNecessaryCallCount += 1;\n  BOOL observedSessionDeactivation = self.sessionDeactivationInvalidatedGraph;\n\n  if (observedSessionDeactivation) {\n    self.rebuildAfterDeactivationCallCount += 1;\n  }\n\n  if (self.startIfNecessaryResult) {\n    self.state = AudioEngineStateRunning;\n    self.sessionDeactivationInvalidatedGraph = NO;\n  }\n\n  return self.startIfNecessaryResult;\n}\n\n- (void)detachInputNode\n{\n  self.detachInputNodeCallCount += 1;\n  self.inputNode = nil;\n}\n\n- (void)stopIfPossible\n{\n  self.stopIfPossibleCallCount += 1;\n}\n\n- (void)restartAudioEngine\n{\n  self.restartAudioEngineCallCount += 1;\n}\n\n- (void)pauseIfNecessary\n{\n  self.pauseIfNecessaryCallCount += 1;\n  self.state = AudioEngineStatePaused;\n}\n\n@end\n\nstruct TestAudioInput {\n  explicit TestAudioInput(UInt32 channelCount, AVAudioFrameCount frameCount)\n      : storage(offsetof(AudioBufferList, mBuffers) + channelCount * sizeof(::AudioBuffer)),\n        channels(channelCount, std::vector<float>(frameCount, 0.25f))\n  {\n    AudioBufferList *audioBufferList = bufferList();\n    audioBufferList->mNumberBuffers = channelCount;\n\n    for (UInt32 channel = 0; channel < channelCount; channel += 1) {\n      audioBufferList->mBuffers[channel].mNumberChannels = 1;\n      audioBufferList->mBuffers[channel].mDataByteSize = frameCount * sizeof(float);\n      audioBufferList->mBuffers[channel].mData = channels[channel].data();\n    }\n  }\n\n  AudioBufferList *bufferList()\n  {\n    return reinterpret_cast<AudioBufferList *>(storage.data());\n  }\n\n  std::vector<uint8_t> storage;\n  std::vector<std::vector<float>> channels;\n};\n\nstatic id gFakeSharedRecorderSession = nil;\nstatic BOOL gRecorderSharedSessionSwizzled = NO;\n\n@interface AVAudioSession (NativeAudioRecorderTests)\n\n+ (id)rna_test_sharedInstance;\n\n@end\n\n@implementation AVAudioSession (NativeAudioRecorderTests)\n\n+ (id)rna_test_sharedInstance\n{\n  if (gFakeSharedRecorderSession != nil) {\n    return gFakeSharedRecorderSession;\n  }\n\n  return [self rna_test_sharedInstance];\n}\n\n@end\n\nstatic void SetFakeRecorderSharedAudioSession(id fakeSharedAudioSession)\n{\n  Method originalMethod = class_getClassMethod([AVAudioSession class], @selector(sharedInstance));\n  Method swizzledMethod =\n      class_getClassMethod([AVAudioSession class], @selector(rna_test_sharedInstance));\n\n  if (!gRecorderSharedSessionSwizzled) {\n    method_exchangeImplementations(originalMethod, swizzledMethod);\n    gRecorderSharedSessionSwizzled = YES;\n  }\n\n  gFakeSharedRecorderSession = fakeSharedAudioSession;\n}\n\nstatic void ClearFakeRecorderSharedAudioSession(void)\n{\n  if (gRecorderSharedSessionSwizzled) {\n    Method originalMethod = class_getClassMethod([AVAudioSession class], @selector(sharedInstance));\n    Method swizzledMethod =\n        class_getClassMethod([AVAudioSession class], @selector(rna_test_sharedInstance));\n    method_exchangeImplementations(originalMethod, swizzledMethod);\n    gRecorderSharedSessionSwizzled = NO;\n  }\n\n  gFakeSharedRecorderSession = nil;\n}\n\n@interface NativeAudioRecorderTests : XCTestCase\n\n@property(nonatomic, strong) FakeRecorderAudioEngine *audioEngine;\n@property(nonatomic, strong) FakeRecorderAudioSessionManager *sessionManager;\n@property(nonatomic, strong) FakeRecorderSharedAVAudioSession *sharedSession;\n\n@end\n\n@implementation NativeAudioRecorderTests\n\n- (void)setUp\n{\n  [super setUp];\n\n  self.sessionManager = [[FakeRecorderAudioSessionManager alloc] init];\n  self.audioEngine = [[FakeRecorderAudioEngine alloc] init];\n  self.sharedSession = [[FakeRecorderSharedAVAudioSession alloc] init];\n  self.sharedSession.IOBufferDuration = 0.01;\n  self.sharedSession.sampleRate = 48000;\n  SetFakeRecorderSharedAudioSession(self.sharedSession);\n\n  self.audioEngine.fakeAVAudioEngine.fakeInputNode.inputFormat = [self invalidFormat];\n  self.audioEngine.fakeAVAudioEngine.fakeInputNode.outputFormat = [self validFormat];\n}\n\n- (void)tearDown\n{\n  [self.audioEngine cleanup];\n  [self.sessionManager cleanup];\n  ClearFakeRecorderSharedAudioSession();\n\n  self.sharedSession = nil;\n  self.audioEngine = nil;\n  self.sessionManager = nil;\n\n  [super tearDown];\n}\n\n- (AVAudioFormat *)validFormat\n{\n  return [[AVAudioFormat alloc] initStandardFormatWithSampleRate:44100 channels:2];\n}\n\n- (id)invalidFormat\n{\n  FakeRecorderFormat *format = [[FakeRecorderFormat alloc] init];\n  format.sampleRate = 0;\n  format.channelCount = 0;\n  format.interleaved = NO;\n  return format;\n}\n\n- (void)testInitCreatesSinkNodeAndForwardsReceiverBlock\n{\n  __block const AudioBufferList *receivedBuffer = nullptr;\n  __block int receivedFrames = 0;\n  NativeAudioRecorder *recorder = [[NativeAudioRecorder alloc] initWithReceiverBlock:^(\n      const AudioBufferList *inputBuffer,\n      int numFrames) {\n    receivedBuffer = inputBuffer;\n    receivedFrames = numFrames;\n  }];\n\n  XCTAssertNotNil(recorder.receiverBlock);\n  XCTAssertNotNil(recorder.receiverSinkBlock);\n\n  TestAudioInput input(1, 8);\n  AudioTimeStamp timestamp = {};\n  OSStatus status = recorder.receiverSinkBlock(&timestamp, 8, input.bufferList());\n\n  XCTAssertEqual(status, (OSStatus)kAudioServicesNoError);\n  XCTAssertEqual(receivedBuffer, nullptr);\n  XCTAssertEqual(receivedFrames, 0);\n\n  [recorder setInputArmed:YES];\n  status = recorder.receiverSinkBlock(&timestamp, 8, input.bufferList());\n\n  XCTAssertEqual(status, (OSStatus)kAudioServicesNoError);\n  XCTAssertEqual(receivedBuffer, input.bufferList());\n  XCTAssertEqual(receivedFrames, 8);\n}\n\n- (void)testStartResolvesInputFormatFromTheLiveEngine\n{\n  AVAudioFormat *expectedFormat = [self validFormat];\n  self.audioEngine.fakeAVAudioEngine.fakeInputNode.outputFormat = expectedFormat;\n\n  NativeAudioRecorder *recorder =\n      [[NativeAudioRecorder alloc] initWithReceiverBlock:^(const AudioBufferList *inputBuffer,\n                                                           int numFrames){\n      }];\n\n  XCTAssertTrue([recorder start:nil]);\n  XCTAssertEqualObjects([recorder getResolvedInputFormat], expectedFormat);\n  XCTAssertEqual([recorder getResolvedBufferSize], 16384);\n}\n\n- (void)testGetBufferSizeUsesMinimumDurationAndRoundsUpToPowerOfTwo\n{\n  NativeAudioRecorder *recorder =\n      [[NativeAudioRecorder alloc] initWithReceiverBlock:^(const AudioBufferList *inputBuffer,\n                                                           int numFrames){\n      }];\n\n  int bufferSize = [recorder getBufferSize];\n  XCTAssertEqual(bufferSize, 16384);\n  XCTAssertEqual(bufferSize & (bufferSize - 1), 0);\n}\n\n- (void)testStartStopsEngineAttachesSinkNodeAndStartsEngine\n{\n  AVAudioFormat *expectedFormat = [self validFormat];\n  self.audioEngine.fakeAVAudioEngine.fakeInputNode.outputFormat = expectedFormat;\n  NativeAudioRecorder *recorder =\n      [[NativeAudioRecorder alloc] initWithReceiverBlock:^(const AudioBufferList *inputBuffer,\n                                                           int numFrames){\n      }];\n\n  XCTAssertTrue([recorder start:nil]);\n\n  XCTAssertEqual(self.audioEngine.stopIfNecessaryCallCount, 1);\n  XCTAssertEqual(self.audioEngine.attachInputNodeCallCount, 1);\n  XCTAssertEqual(self.audioEngine.startIfNecessaryCallCount, 1);\n  XCTAssertNotNil(self.audioEngine.lastAttachedInputNode);\n  XCTAssertNotNil(self.audioEngine.lastAttachedReceiverBlock);\n}\n\n- (void)testStartReturnsErrorWhenAudioEngineFailsToStart\n{\n  FakeRecorderAudioEngine *originalAudioEngine = self.audioEngine;\n  NativeAudioRecorder *recorder =\n      [[NativeAudioRecorder alloc] initWithReceiverBlock:^(const AudioBufferList *inputBuffer,\n                                                           int numFrames){\n      }];\n  self.audioEngine.startIfNecessaryResult = NO;\n\n  NSError *error = nil;\n  BOOL started = [recorder start:&error];\n\n  XCTAssertFalse(started);\n  XCTAssertNotNil(error);\n  XCTAssertEqual(originalAudioEngine.detachInputNodeCallCount, 1);\n  XCTAssertEqual(originalAudioEngine.stopIfPossibleCallCount, 1);\n}\n\n- (void)testStopDetachesInputClearsResolvedStateAndNeverRestartsEngine\n{\n  auto assertStopBehaviorForState = ^(AudioEngineState state) {\n    self.audioEngine.fakeAVAudioEngine.fakeInputNode.outputFormat = [self validFormat];\n    NativeAudioRecorder *recorder =\n        [[NativeAudioRecorder alloc] initWithReceiverBlock:^(const AudioBufferList *inputBuffer,\n                                                             int numFrames){\n        }];\n\n    XCTAssertTrue([recorder start:nil]);\n    XCTAssertNotNil([recorder getResolvedInputFormat]);\n    XCTAssertGreaterThan([recorder getResolvedBufferSize], 0);\n\n    NSInteger previousDetachCount = self.audioEngine.detachInputNodeCallCount;\n    NSInteger previousStopIfPossibleCount = self.audioEngine.stopIfPossibleCallCount;\n    NSInteger previousRestartAudioEngineCallCount = self.audioEngine.restartAudioEngineCallCount;\n    self.audioEngine.state = state;\n\n    [recorder stop];\n\n    XCTAssertEqual(self.audioEngine.detachInputNodeCallCount, previousDetachCount + 1);\n    XCTAssertEqual(self.audioEngine.stopIfPossibleCallCount, previousStopIfPossibleCount + 1);\n    XCTAssertEqual(self.audioEngine.restartAudioEngineCallCount, previousRestartAudioEngineCallCount + 1);\n    XCTAssertNil([recorder getResolvedInputFormat]);\n    XCTAssertEqual([recorder getResolvedBufferSize], 0);\n  };\n\n  assertStopBehaviorForState(AudioEngineStatePaused);\n  assertStopBehaviorForState(AudioEngineStateRunning);\n}\n\n- (void)testPauseAndResumeDelegateToAudioEngine\n{\n  NativeAudioRecorder *recorder =\n      [[NativeAudioRecorder alloc] initWithReceiverBlock:^(const AudioBufferList *inputBuffer,\n                                                           int numFrames){\n      }];\n\n  [recorder pause];\n  [recorder resume];\n\n  XCTAssertEqual(self.audioEngine.pauseIfNecessaryCallCount, 1);\n  XCTAssertEqual(self.audioEngine.startIfNecessaryCallCount, 1);\n  XCTAssertTrue(recorder.inputArmed);\n}\n\n- (void)testStartAfterSessionDeactivationUsesRecoveryRebuildPath\n{\n  AVAudioFormat *initialFormat = [self validFormat];\n  AVAudioFormat *recoveredFormat = [[AVAudioFormat alloc] initStandardFormatWithSampleRate:32000\n                                                                                   channels:1];\n  self.audioEngine.fakeAVAudioEngine.fakeInputNode.outputFormat = initialFormat;\n\n  NativeAudioRecorder *recorder =\n      [[NativeAudioRecorder alloc] initWithReceiverBlock:^(const AudioBufferList *inputBuffer,\n                                                           int numFrames){\n      }];\n\n  XCTAssertTrue([recorder start:nil]);\n  XCTAssertEqualObjects([recorder getResolvedInputFormat], initialFormat);\n\n  [self.audioEngine onSessionDeactivated];\n  XCTAssertTrue(self.audioEngine.sessionDeactivationInvalidatedGraph);\n\n  self.audioEngine.fakeAVAudioEngine.fakeInputNode.outputFormat = recoveredFormat;\n  [recorder stop];\n\n  XCTAssertTrue([recorder start:nil]);\n  XCTAssertEqual(self.audioEngine.rebuildAfterDeactivationCallCount, 1);\n  XCTAssertFalse(self.audioEngine.sessionDeactivationInvalidatedGraph);\n  XCTAssertEqualObjects([recorder getResolvedInputFormat], recoveredFormat);\n  XCTAssertEqual([recorder getResolvedBufferSize], 16384);\n}\n\n@end\n"
  },
  {
    "path": "apps/fabric-example/ios/FabricExampleTests/SystemNotificationManagerTests.mm",
    "content": "#import <XCTest/XCTest.h>\n#import <objc/runtime.h>\n\n#import <audioapi/events/AudioEvent.h>\n#import <audioapi/ios/system/AudioEngine.h>\n#import <audioapi/ios/system/AudioSessionManager.h>\n#import <audioapi/ios/system/SystemNotificationManager.h>\n\n@interface SystemNotificationManager (TestingPrivate)\n\n- (void)handleInterruption:(NSNotification *)notification;\n- (void)handleSecondaryAudio:(NSNotification *)notification;\n- (void)handleRouteChange:(NSNotification *)notification;\n- (void)handleMediaServicesReset:(NSNotification *)notification;\n- (void)handleEngineConfigurationChange:(NSNotification *)notification;\n- (void)startPollingSecondaryAudioHint;\n- (void)stopPollingSecondaryAudioHint;\n- (void)checkSecondaryAudioHint;\n\n@end\n\n@interface FakeNotificationCenter : NSObject\n\n@property(nonatomic, assign) NSInteger addObserverCallCount;\n@property(nonatomic, assign) NSInteger removeObserverCallCount;\n@property(nonatomic, strong) NSMutableArray<id> *addedNotificationNames;\n@property(nonatomic, strong) NSMutableArray<id> *removedNotificationNames;\n\n@end\n\n@implementation FakeNotificationCenter\n\n- (instancetype)init\n{\n  if (self = [super init]) {\n    self.addedNotificationNames = [[NSMutableArray alloc] init];\n    self.removedNotificationNames = [[NSMutableArray alloc] init];\n  }\n\n  return self;\n}\n\n- (void)addObserver:(id)observer\n           selector:(SEL)aSelector\n               name:(NSNotificationName)aName\n             object:(id)anObject\n{\n  self.addObserverCallCount += 1;\n  [self.addedNotificationNames addObject:aName ?: [NSNull null]];\n}\n\n- (void)removeObserver:(id)observer name:(NSNotificationName)aName object:(id)anObject\n{\n  self.removeObserverCallCount += 1;\n  [self.removedNotificationNames addObject:aName ?: [NSNull null]];\n}\n\n@end\n\n@interface FakeSharedAVAudioSession : NSObject\n\n@property(nonatomic, assign) BOOL secondaryAudioShouldBeSilencedHint;\n@property(nonatomic, assign) float outputVolume;\n@property(nonatomic, assign) NSInteger addObserverCallCount;\n@property(nonatomic, assign) NSInteger removeObserverCallCount;\n@property(nonatomic, copy) NSString *lastAddedKeyPath;\n@property(nonatomic, assign) NSKeyValueObservingOptions lastAddedOptions;\n@property(nonatomic, assign) void *lastAddedContext;\n\n@end\n\n@implementation FakeSharedAVAudioSession\n\n- (void)addObserver:(NSObject *)observer\n         forKeyPath:(NSString *)keyPath\n            options:(NSKeyValueObservingOptions)options\n            context:(void *)context\n{\n  self.addObserverCallCount += 1;\n  self.lastAddedKeyPath = keyPath;\n  self.lastAddedOptions = options;\n  self.lastAddedContext = context;\n}\n\n- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath context:(void *)context\n{\n  self.removeObserverCallCount += 1;\n}\n\n@end\n\n@interface SNMFakeAudioEngine : AudioEngine\n\n@property(nonatomic, assign) NSInteger interruptionBeginCallCount;\n@property(nonatomic, assign) NSInteger interruptionEndCallCount;\n@property(nonatomic, assign) NSInteger restartAudioEngineCallCount;\n@property(nonatomic, assign) BOOL lastShouldResume;\n\n@end\n\n@implementation SNMFakeAudioEngine\n\n- (void)onInterruptionBegin\n{\n  self.interruptionBeginCallCount += 1;\n}\n\n- (void)onInterruptionEnd:(bool)shouldResume\n{\n  self.interruptionEndCallCount += 1;\n  self.lastShouldResume = shouldResume;\n}\n\n- (void)restartAudioEngine\n{\n  self.restartAudioEngineCallCount += 1;\n}\n\n@end\n\n@interface SNMFakeAudioSessionManager : AudioSessionManager\n\n@property(nonatomic, assign) NSInteger markInactiveCallCount;\n@property(nonatomic, assign) NSInteger ensureActiveCallCount;\n@property(nonatomic, assign) BOOL lastEnsureActiveForce;\n\n@end\n\n@implementation SNMFakeAudioSessionManager\n\n- (void)markInactive\n{\n  self.markInactiveCallCount += 1;\n  self.isActive = false;\n}\n\n- (bool)ensureActive:(bool)force error:(NSError **)error\n{\n  self.ensureActiveCallCount += 1;\n  self.lastEnsureActiveForce = force;\n\n  if (error != nil) {\n    *error = nil;\n  }\n\n  self.isActive = true;\n  return true;\n}\n\n@end\n\n@interface FakeAudioAPIModule : NSObject\n\n@property(nonatomic, strong) AudioEngine *audioEngine;\n@property(nonatomic, strong) AudioSessionManager *audioSessionManager;\n@property(nonatomic, assign) NSInteger eventInvocationCount;\n@property(nonatomic, assign) NSInteger lastEventNameRaw;\n@property(nonatomic, strong) NSDictionary *lastEventBody;\n\n- (void)resetCapturedEvent;\n- (void)invokeHandlerWithEventName:(audioapi::AudioEvent)eventName eventBody:(NSDictionary *)eventBody;\n\n@end\n\n@implementation FakeAudioAPIModule\n\n- (void)resetCapturedEvent\n{\n  self.eventInvocationCount = 0;\n  self.lastEventNameRaw = -1;\n  self.lastEventBody = nil;\n}\n\n- (void)invokeHandlerWithEventName:(audioapi::AudioEvent)eventName eventBody:(NSDictionary *)eventBody\n{\n  self.eventInvocationCount += 1;\n  self.lastEventNameRaw = static_cast<NSInteger>(eventName);\n  self.lastEventBody = eventBody;\n}\n\n@end\n\nstatic id gFakeSharedAudioSession = nil;\nstatic BOOL gSharedAudioSessionSwizzled = NO;\n\n@interface AVAudioSession (SystemNotificationManagerTests)\n\n+ (id)rna_test_sharedInstance;\n\n@end\n\n@implementation AVAudioSession (SystemNotificationManagerTests)\n\n+ (id)rna_test_sharedInstance\n{\n  if (gFakeSharedAudioSession != nil) {\n    return gFakeSharedAudioSession;\n  }\n\n  return [self rna_test_sharedInstance];\n}\n\n@end\n\nstatic void SetFakeSharedAudioSession(id fakeSharedAudioSession)\n{\n  Method originalMethod = class_getClassMethod([AVAudioSession class], @selector(sharedInstance));\n  Method swizzledMethod =\n      class_getClassMethod([AVAudioSession class], @selector(rna_test_sharedInstance));\n\n  if (!gSharedAudioSessionSwizzled) {\n    method_exchangeImplementations(originalMethod, swizzledMethod);\n    gSharedAudioSessionSwizzled = YES;\n  }\n\n  gFakeSharedAudioSession = fakeSharedAudioSession;\n}\n\nstatic void ClearFakeSharedAudioSession(void)\n{\n  if (gSharedAudioSessionSwizzled) {\n    Method originalMethod = class_getClassMethod([AVAudioSession class], @selector(sharedInstance));\n    Method swizzledMethod =\n        class_getClassMethod([AVAudioSession class], @selector(rna_test_sharedInstance));\n    method_exchangeImplementations(originalMethod, swizzledMethod);\n    gSharedAudioSessionSwizzled = NO;\n  }\n\n  gFakeSharedAudioSession = nil;\n}\n\n@interface SystemNotificationManagerTests : XCTestCase\n\n@property(nonatomic, strong) SystemNotificationManager *manager;\n@property(nonatomic, strong) FakeAudioAPIModule *module;\n@property(nonatomic, strong) SNMFakeAudioEngine *fakeAudioEngine;\n@property(nonatomic, strong) SNMFakeAudioSessionManager *fakeSessionManager;\n@property(nonatomic, strong) FakeSharedAVAudioSession *fakeSharedAudioSession;\n\n@end\n\n@implementation SystemNotificationManagerTests\n\n- (void)setUp\n{\n  [super setUp];\n\n  self.fakeAudioEngine = [[SNMFakeAudioEngine alloc] init];\n  self.fakeSessionManager = [[SNMFakeAudioSessionManager alloc] init];\n  self.fakeSharedAudioSession = [[FakeSharedAVAudioSession alloc] init];\n  SetFakeSharedAudioSession(self.fakeSharedAudioSession);\n\n  self.module = [[FakeAudioAPIModule alloc] init];\n  self.module.audioEngine = self.fakeAudioEngine;\n  self.module.audioSessionManager = self.fakeSessionManager;\n  [self.module resetCapturedEvent];\n\n  self.manager = [[SystemNotificationManager alloc] initWithAudioAPIModule:(id)self.module];\n}\n\n- (void)tearDown\n{\n  [self.manager stopPollingSecondaryAudioHint];\n  [self.manager cleanup];\n  self.manager = nil;\n  self.module = nil;\n  self.fakeAudioEngine = nil;\n  self.fakeSessionManager = nil;\n  self.fakeSharedAudioSession = nil;\n\n  ClearFakeSharedAudioSession();\n\n  [super tearDown];\n}\n\n- (void)flushMainQueue\n{\n  XCTestExpectation *expectation = [self expectationWithDescription:@\"Flush main queue\"];\n  dispatch_async(dispatch_get_main_queue(), ^{ [expectation fulfill]; });\n  [self waitForExpectations:@[ expectation ] timeout:1.0];\n}\n\n- (NSNotification *)interruptionNotificationWithType:(AVAudioSessionInterruptionType)type\n                                              option:(AVAudioSessionInterruptionOptions)option\n{\n  return [NSNotification notificationWithName:AVAudioSessionInterruptionNotification\n                                       object:nil\n                                     userInfo:@{\n                                       AVAudioSessionInterruptionTypeKey : @(type),\n                                       AVAudioSessionInterruptionOptionKey : @(option),\n                                     }];\n}\n\n- (NSNotification *)secondaryAudioNotificationWithType:(AVAudioSessionSilenceSecondaryAudioHintType)type\n{\n  return [NSNotification\n      notificationWithName:AVAudioSessionSilenceSecondaryAudioHintNotification\n                    object:nil\n                  userInfo:@{\n                    AVAudioSessionSilenceSecondaryAudioHintTypeKey : @(type),\n                  }];\n}\n\n- (NSNotification *)routeChangeNotificationWithReason:(AVAudioSessionRouteChangeReason)reason\n{\n  return [NSNotification notificationWithName:AVAudioSessionRouteChangeNotification\n                                       object:nil\n                                     userInfo:@{\n                                       AVAudioSessionRouteChangeReasonKey : @(reason),\n                                     }];\n}\n\n- (void)testObserveVolumeChangesIsIdempotent\n{\n  [self.manager observeVolumeChanges:YES];\n  [self.manager observeVolumeChanges:YES];\n\n  XCTAssertTrue(self.manager.volumeChangesObserved);\n  XCTAssertEqual(self.fakeSharedAudioSession.addObserverCallCount, 1);\n  XCTAssertEqualObjects(self.fakeSharedAudioSession.lastAddedKeyPath, @\"outputVolume\");\n  XCTAssertEqual(self.fakeSharedAudioSession.lastAddedOptions, NSKeyValueObservingOptionNew);\n  XCTAssertNotEqual(self.fakeSharedAudioSession.lastAddedContext, nullptr);\n\n  [self.manager observeVolumeChanges:NO];\n  [self.manager observeVolumeChanges:NO];\n\n  XCTAssertFalse(self.manager.volumeChangesObserved);\n  XCTAssertEqual(self.fakeSharedAudioSession.removeObserverCallCount, 1);\n}\n\n- (void)testObserveValueForKeyPathRequiresExpectedContextAndEnabledObservation\n{\n  [self.manager observeVolumeChanges:YES];\n\n  [self.module resetCapturedEvent];\n  [self.manager observeValueForKeyPath:@\"outputVolume\"\n                              ofObject:nil\n                                change:@{@\"new\" : @0.25f}\n                               context:nil];\n  XCTAssertEqual(self.module.eventInvocationCount, 0);\n\n  [self.manager observeValueForKeyPath:@\"outputVolume\"\n                              ofObject:nil\n                                change:@{@\"new\" : @0.75f}\n                               context:self.fakeSharedAudioSession.lastAddedContext];\n\n  XCTAssertEqual(self.module.eventInvocationCount, 1);\n  XCTAssertEqual(self.module.lastEventNameRaw,\n                 static_cast<NSInteger>(audioapi::AudioEvent::VOLUME_CHANGE));\n  XCTAssertEqualObjects(self.module.lastEventBody[@\"value\"], @0.75f);\n}\n\n- (void)testActivelyReclaimSessionRegistersObserverAndStartsPolling\n{\n  FakeNotificationCenter *fakeNotificationCenter = [[FakeNotificationCenter alloc] init];\n  self.manager.notificationCenter = (NSNotificationCenter *)fakeNotificationCenter;\n\n  [self.manager activelyReclaimSession:YES];\n  [self flushMainQueue];\n\n  XCTAssertEqual(fakeNotificationCenter.addObserverCallCount, 1);\n  XCTAssertEqualObjects(fakeNotificationCenter.addedNotificationNames.firstObject,\n                        AVAudioSessionSilenceSecondaryAudioHintNotification);\n  XCTAssertNotNil(self.manager.hintPollingTimer);\n\n  [self.manager activelyReclaimSession:NO];\n\n  XCTAssertEqual(fakeNotificationCenter.removeObserverCallCount, 1);\n  XCTAssertEqualObjects(fakeNotificationCenter.removedNotificationNames.firstObject,\n                        AVAudioSessionSilenceSecondaryAudioHintNotification);\n  XCTAssertNil(self.manager.hintPollingTimer);\n}\n\n- (void)testHandleInterruptionBeganMarksInactiveAndEmitsEventWhenObserved\n{\n  [self.manager observeAudioInterruptions:YES];\n\n  [self.manager handleInterruption:[self interruptionNotificationWithType:AVAudioSessionInterruptionTypeBegan\n                                                                   option:0]];\n  [self flushMainQueue];\n\n  XCTAssertEqual(self.fakeSessionManager.markInactiveCallCount, 1);\n  XCTAssertEqual(self.fakeAudioEngine.interruptionBeginCallCount, 1);\n  XCTAssertEqual(self.module.eventInvocationCount, 1);\n  XCTAssertEqual(self.module.lastEventNameRaw,\n                 static_cast<NSInteger>(audioapi::AudioEvent::INTERRUPTION));\n  XCTAssertEqualObjects(self.module.lastEventBody[@\"type\"], @\"began\");\n  XCTAssertEqualObjects(self.module.lastEventBody[@\"shouldResume\"], @NO);\n}\n\n- (void)testHandleInterruptionEndedEmitsEventWhenObserved\n{\n  [self.manager observeAudioInterruptions:YES];\n\n  [self.manager handleInterruption:[self interruptionNotificationWithType:AVAudioSessionInterruptionTypeEnded\n                                                                   option:AVAudioSessionInterruptionOptionShouldResume]];\n\n  XCTAssertEqual(self.module.eventInvocationCount, 1);\n  XCTAssertEqual(self.module.lastEventNameRaw,\n                 static_cast<NSInteger>(audioapi::AudioEvent::INTERRUPTION));\n  XCTAssertEqualObjects(self.module.lastEventBody[@\"type\"], @\"ended\");\n  XCTAssertEqualObjects(self.module.lastEventBody[@\"shouldResume\"], @YES);\n  XCTAssertEqual(self.fakeAudioEngine.interruptionEndCallCount, 0);\n}\n\n- (void)testHandleInterruptionEndedResumesEngineWhenNotObserved\n{\n  [self.manager handleInterruption:[self interruptionNotificationWithType:AVAudioSessionInterruptionTypeEnded\n                                                                   option:AVAudioSessionInterruptionOptionShouldResume]];\n  [self flushMainQueue];\n\n  XCTAssertEqual(self.module.eventInvocationCount, 0);\n  XCTAssertEqual(self.fakeAudioEngine.interruptionEndCallCount, 1);\n  XCTAssertTrue(self.fakeAudioEngine.lastShouldResume);\n}\n\n- (void)testHandleSecondaryAudioBeginMarksInactiveAndEmitsEventWhenObserved\n{\n  [self.manager observeAudioInterruptions:YES];\n\n  [self.manager\n      handleSecondaryAudio:[self secondaryAudioNotificationWithType:\n                                     AVAudioSessionSilenceSecondaryAudioHintTypeBegin]];\n  [self flushMainQueue];\n\n  XCTAssertEqual(self.fakeSessionManager.markInactiveCallCount, 1);\n  XCTAssertEqual(self.fakeAudioEngine.interruptionBeginCallCount, 1);\n  XCTAssertEqual(self.module.eventInvocationCount, 1);\n  XCTAssertEqual(self.module.lastEventNameRaw,\n                 static_cast<NSInteger>(audioapi::AudioEvent::INTERRUPTION));\n  XCTAssertEqualObjects(self.module.lastEventBody[@\"type\"], @\"began\");\n  XCTAssertEqualObjects(self.module.lastEventBody[@\"shouldResume\"], @NO);\n}\n\n- (void)testHandleSecondaryAudioEndResumesEngineWhenNotObserved\n{\n  [self.manager\n      handleSecondaryAudio:[self secondaryAudioNotificationWithType:\n                                     AVAudioSessionSilenceSecondaryAudioHintTypeEnd]];\n  [self flushMainQueue];\n\n  XCTAssertEqual(self.module.eventInvocationCount, 0);\n  XCTAssertEqual(self.fakeAudioEngine.interruptionEndCallCount, 1);\n  XCTAssertTrue(self.fakeAudioEngine.lastShouldResume);\n}\n\n- (void)testHandleRouteChangeMapsReasonsAndFallsBackToUnknown\n{\n  NSArray<NSDictionary *> *cases = @[\n    @{\n      @\"reason\" : @(AVAudioSessionRouteChangeReasonNewDeviceAvailable),\n      @\"expected\" : @\"NewDeviceAvailable\",\n    },\n    @{\n      @\"reason\" : @(AVAudioSessionRouteChangeReasonOldDeviceUnavailable),\n      @\"expected\" : @\"OldDeviceUnavailable\",\n    },\n    @{\n      @\"reason\" : @(AVAudioSessionRouteChangeReasonRouteConfigurationChange),\n      @\"expected\" : @\"ConfigurationChange\",\n    },\n    @{\n      @\"reason\" : @999,\n      @\"expected\" : @\"Unknown\",\n    },\n  ];\n\n  for (NSDictionary *testCase in cases) {\n    [self.module resetCapturedEvent];\n\n    [self.manager handleRouteChange:[self routeChangeNotificationWithReason:\n                                                  (AVAudioSessionRouteChangeReason)[testCase[@\"reason\"]\n                                                      integerValue]]];\n\n    XCTAssertEqual(self.module.eventInvocationCount, 1);\n    XCTAssertEqual(self.module.lastEventNameRaw,\n                   static_cast<NSInteger>(audioapi::AudioEvent::ROUTE_CHANGE));\n    XCTAssertEqualObjects(self.module.lastEventBody[@\"reason\"], testCase[@\"expected\"]);\n  }\n}\n\n- (void)testHandleMediaServicesResetReactivatesSessionAndRestartsEngine\n{\n  [self.manager handleMediaServicesReset:nil];\n  [self flushMainQueue];\n\n  XCTAssertEqual(self.fakeSessionManager.markInactiveCallCount, 1);\n  XCTAssertEqual(self.fakeSessionManager.ensureActiveCallCount, 1);\n  XCTAssertTrue(self.fakeSessionManager.lastEnsureActiveForce);\n  XCTAssertEqual(self.fakeAudioEngine.restartAudioEngineCallCount, 1);\n}\n\n- (void)testHandleEngineConfigurationChangeMarksInactiveAndRestartsEngine\n{\n  [self.manager handleEngineConfigurationChange:nil];\n  [self flushMainQueue];\n\n  XCTAssertEqual(self.fakeSessionManager.markInactiveCallCount, 1);\n  XCTAssertEqual(self.fakeAudioEngine.restartAudioEngineCallCount, 1);\n}\n\n- (void)testCheckSecondaryAudioHintDoesNothingWhenStateIsUnchanged\n{\n  self.fakeSharedAudioSession.secondaryAudioShouldBeSilencedHint = NO;\n  self.manager.wasOtherAudioPlaying = NO;\n\n  [self.manager checkSecondaryAudioHint];\n  [self flushMainQueue];\n\n  XCTAssertEqual(self.module.eventInvocationCount, 0);\n  XCTAssertEqual(self.fakeSessionManager.markInactiveCallCount, 0);\n  XCTAssertEqual(self.fakeAudioEngine.interruptionBeginCallCount, 0);\n  XCTAssertEqual(self.fakeAudioEngine.interruptionEndCallCount, 0);\n}\n\n- (void)testCheckSecondaryAudioHintSilencedTransitionMarksInactiveAndEmitsEventWhenObserved\n{\n  [self.manager observeAudioInterruptions:YES];\n  self.fakeSharedAudioSession.secondaryAudioShouldBeSilencedHint = YES;\n  self.manager.wasOtherAudioPlaying = NO;\n\n  [self.manager checkSecondaryAudioHint];\n  [self flushMainQueue];\n\n  XCTAssertTrue(self.manager.wasOtherAudioPlaying);\n  XCTAssertEqual(self.fakeSessionManager.markInactiveCallCount, 1);\n  XCTAssertEqual(self.fakeAudioEngine.interruptionBeginCallCount, 1);\n  XCTAssertEqual(self.module.eventInvocationCount, 1);\n  XCTAssertEqual(self.module.lastEventNameRaw,\n                 static_cast<NSInteger>(audioapi::AudioEvent::INTERRUPTION));\n  XCTAssertEqualObjects(self.module.lastEventBody[@\"type\"], @\"began\");\n  XCTAssertEqualObjects(self.module.lastEventBody[@\"shouldResume\"], @NO);\n}\n\n- (void)testCheckSecondaryAudioHintResumeTransitionEmitsEventWhenObserved\n{\n  [self.manager observeAudioInterruptions:YES];\n  self.fakeSharedAudioSession.secondaryAudioShouldBeSilencedHint = NO;\n  self.manager.wasOtherAudioPlaying = YES;\n\n  [self.manager checkSecondaryAudioHint];\n\n  XCTAssertFalse(self.manager.wasOtherAudioPlaying);\n  XCTAssertEqual(self.module.eventInvocationCount, 1);\n  XCTAssertEqual(self.module.lastEventNameRaw,\n                 static_cast<NSInteger>(audioapi::AudioEvent::INTERRUPTION));\n  XCTAssertEqualObjects(self.module.lastEventBody[@\"type\"], @\"ended\");\n  XCTAssertEqualObjects(self.module.lastEventBody[@\"shouldResume\"], @YES);\n  XCTAssertEqual(self.fakeAudioEngine.interruptionEndCallCount, 0);\n}\n\n- (void)testCheckSecondaryAudioHintResumeTransitionResumesEngineWhenNotObserved\n{\n  self.fakeSharedAudioSession.secondaryAudioShouldBeSilencedHint = NO;\n  self.manager.wasOtherAudioPlaying = YES;\n\n  [self.manager checkSecondaryAudioHint];\n  [self flushMainQueue];\n\n  XCTAssertFalse(self.manager.wasOtherAudioPlaying);\n  XCTAssertEqual(self.module.eventInvocationCount, 0);\n  XCTAssertEqual(self.fakeAudioEngine.interruptionEndCallCount, 1);\n  XCTAssertTrue(self.fakeAudioEngine.lastShouldResume);\n}\n\n@end\n"
  },
  {
    "path": "apps/fabric-example/ios/Podfile",
    "content": "ENV['RCT_NEW_ARCH_ENABLED'] = '1'\n\n# Uncomment when building for macOS with Catalyst\n# ENV['RCT_BUILD_FROM_SOURCE'] = '1'\n\n# Resolve react_native_pods.rb with node to allow for hoisting\nrequire Pod::Executable.execute_command('node', ['-p',\n  'require.resolve(\n    \"react-native/scripts/react_native_pods.rb\",\n    {paths: [process.argv[1]]},\n  )', __dir__]).strip\n\nplatform :ios, min_ios_version_supported\nprepare_react_native_project!\n\ntarget 'FabricExample' do\n  config = use_native_modules!\n  # Uncomment when building for macOS with Catalyst\n  # use_frameworks! :linkage => :static\n\n  use_react_native!(\n    :path => config[:reactNativePath],\n    :hermes_enabled => true,\n    # An absolute path to your application root.\n    :app_path => \"#{Pod::Config.instance.installation_root}/..\",\n    :privacy_file_aggregation_enabled => true\n  )\n\n  target 'FabricExampleTests' do\n    inherit! :search_paths\n  end\n\n  post_install do |installer|\n    react_native_post_install(\n      installer,\n      config[:reactNativePath],\n      :mac_catalyst_enabled => false,\n      # :ccache_enabled => true\n    )\n  end\n\n  # post_install for builds with catalyst enabled, due to a bug in hermes <=0.14.0\n  # https://github.com/facebook/react-native/issues/55540\n  # post_install do |installer|\n  #   react_native_post_install(\n  #     installer,\n  #     config[:reactNativePath],\n  #     :mac_catalyst_enabled => true,\n  #     # :ccache_enabled => true\n  #   )\n\n  #   # ---- Hermes Mac Catalyst framework layout fix (RN 0.83.x) ----\n  #   require 'fileutils'\n\n  #   hermes_fw = File.join(__dir__,\n  #     'Pods/hermes-engine/destroot/Library/Frameworks/universal/hermesvm.xcframework',\n  #     'ios-arm64_x86_64-maccatalyst/hermesvm.framework'\n  #   )\n\n  #   if File.directory?(hermes_fw)\n  #     Dir.chdir(hermes_fw) do\n  #       # Ensure Versions/Current exists\n  #       FileUtils.mkdir_p('Versions/A')\n  #       File.symlink('A', 'Versions/Current') unless File.exist?('Versions/Current')\n\n  #       # If top-level \"hermesvm\" is a real file, move it into Versions/Current and\n  #       # replace with a symlink. This is the key part that prevents the \"ambiguous\" bundle.\n  #       if File.exist?('hermesvm') && !File.symlink?('hermesvm')\n  #         FileUtils.mkdir_p('Versions/Current')\n  #         FileUtils.mv('hermesvm', 'Versions/Current/hermesvm')\n  #         File.symlink('Versions/Current/hermesvm', 'hermesvm')\n  #       end\n\n  #       # Optional but makes the framework layout consistent\n  #       FileUtils.mkdir_p('Versions/Current/Resources')\n  #       if File.exist?('Resources') && !File.symlink?('Resources')\n  #         FileUtils.rm_rf('Resources')\n  #       end\n  #       File.symlink('Versions/Current/Resources', 'Resources') unless File.exist?('Resources')\n  #     end\n  #   end\n  # end\nend\n"
  },
  {
    "path": "apps/fabric-example/metro.config.js",
    "content": "const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');\nconst path = require('path');\n\nconst monorepoRoot = path.resolve(__dirname, '../..');\nconst appsRoot = path.resolve(monorepoRoot, 'apps');\n\nconst defaultConfig = getDefaultConfig(__dirname);\n/**\n * Metro configuration https://reactnative.dev/docs/metro\n *\n * @type {import('@react-native/metro-config').MetroConfig}\n */\nconst config = {\n  projectRoot: __dirname,\n  watchFolders: [monorepoRoot, appsRoot],\n  resolver: {\n    assetExts: [...defaultConfig.resolver.assetExts, 'ogg', 'flac', 'opus'],\n  },\n  /* we are rewriting requests because due to monorepo structure, the assets are found with '../../../' prefix\n  and we redirect them to the correct path without relative prefixes */\n  server: {\n    rewriteRequestUrl: (url) => {\n      if (!url.startsWith('/assets/../../')) {\n        return url;\n      }\n\n      const queryIndex = url.indexOf('?');\n      const pathname = queryIndex >= 0 ? url.substring(0, queryIndex) : url;\n      const query = queryIndex >= 0 ? url.substring(queryIndex) : '';\n      const separator = query ? '&' : '?';\n\n      const relPath = pathname.startsWith('/assets/')\n        ? pathname.substring('/assets/'.length)\n        : `../../${pathname}`;\n\n      const rewrittenUrl = `/assets${query}${separator}unstable_path=${encodeURIComponent(relPath)}`;\n\n      return rewrittenUrl;\n    },\n  },\n};\n\nmodule.exports = mergeConfig(defaultConfig, config);\n"
  },
  {
    "path": "apps/fabric-example/package.json",
    "content": "{\n  \"name\": \"fabric-example\",\n  \"version\": \"0.0.1\",\n  \"private\": true,\n  \"scripts\": {\n    \"android\": \"react-native run-android\",\n    \"ios\": \"react-native run-ios\",\n    \"lint\": \"eslint .\",\n    \"start\": \"react-native start\",\n    \"test\": \"jest\"\n  },\n  \"dependencies\": {\n    \"common-app\": \"workspace:*\",\n    \"lucide-react-native\": \"^0.555.0\",\n    \"react\": \"19.2.3\",\n    \"react-native\": \"0.85.0\",\n    \"react-native-svg\": \"15.15.4\"\n  },\n  \"devDependencies\": {\n    \"prettier\": \"^3.3.3\"\n  },\n  \"engines\": {\n    \"node\": \">=22.11.0\"\n  },\n  \"reactNativeVectorIcons\": {\n    \"fontDir\": \"./assets/fonts\"\n  }\n}\n"
  },
  {
    "path": "apps/fabric-example/react-native.config.js",
    "content": "/** This file is required to properly resolve native dependencies */\nconst { getDependencies } = require('../common-app/scripts/dependencies');\n\nconst dependencies = getDependencies(__dirname);\n\nmodule.exports = {\n  dependencies,\n  assets: ['./assets/fonts/'],\n};\n"
  },
  {
    "path": "apps/fabric-example/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"types\": [\"jest\"],\n    \"baseUrl\": \".\",\n    \"moduleSuffixes\": [\".ios\", \".android\", \".native\", \"\"],\n    \"paths\": {\n      \"@/*\": [\"../common-app/src/*\"]\n    }\n  },\n  \"exclude\": [\n    \"**/node_modules\",\n    \"**/Pods\",\n    \"metro.config.js\",\n    \"android\",\n    \"ios\",\n    \".bundle\"\n  ]\n}\n"
  },
  {
    "path": "ghdocs/audio-node.md",
    "content": "# How to create new AudioNode\n\nIn this docs we present recommended patterns for creating new AudioNodes.\n\n## Layers\n\nUsusally, each AudioNode has three layers:\n\n- Core (C++)\n\n  Class implementing core audio processing logic. Should be implemented in highly performant manner using internal data structures (if possible).\n\n```cpp\nclass GainNode : public AudioNode {\n public:\n  explicit GainNode(const std::shared_ptr<BaseAudioContext> &context, const GainOptions &options);\n\n  [[nodiscard]] std::shared_ptr<AudioParam> getGainParam() const;\n\n protected:\n  std::shared_ptr<AudioBuffer> processNode(\n      const std::shared_ptr<AudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  std::shared_ptr<AudioParam> gainParam_;\n};\n```\n\n- Host Object (HO)\n\n  Interop class between C++ and JS, implemented on C++ side. HO is returned from C++ to JS from BaseAudioContext factory methods. JS has its own interfaces that works as a counterpart of C++ HO. There is no strong typing mechanism between C++ and JS. Implementation is based on the alignment between C++ HO and JS interface.\n\n```cpp\nclass GainNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit GainNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const GainOptions &options);\n\n  JSI_PROPERTY_GETTER_DECL(gain);\n\n private:\n  std::shared_ptr<AudioParamHostObject> gainParam_;\n};\n```\n```ts\nexport interface IGainNode extends IAudioNode {\n  readonly gain: IAudioParam;\n}\n```\n\n- Typescript (JS)\n\n  Elegant typescript wrapper around JS HO interface.\n\n```ts\nclass GainNode extends AudioNode {\n  readonly gain: AudioParam;\n\n  constructor(context: BaseAudioContext, options?: TGainOptions) {\n    const gainNode: IGainNode = context.context.createGain(options || {}); // context.context is C++ HO\n    super(context, gainNode);\n    this.gain = new AudioParam(gainNode.gain, context);\n  }\n}\n```\n\n## Core (C++) implementation\n\nEach AudioNode should implement one virtual method:\n```cpp\nstd::shared_ptr<AudioBuffer> processNode(\n      const std::shared_ptr<AudioBuffer> &processingBuffer,\n      int framesToProcess)\n```\n\nIt is responsible for AudioNode's processing logic. It gets input buffer as argument - `processingBus` and should return processed buffer.\n\n```cpp\nstd::shared_ptr<AudioBuffer> GainNode::processNode(\n    const std::shared_ptr<AudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr)\n    return processingBuffer;\n  double time = context->getCurrentTime();\n  auto gainParamValues = gainParam_->processARateParam(framesToProcess, time);\n  auto gainValues = gainParamValues->getChannel(0);\n\n  for (size_t i = 0; i < processingBuffer->getNumberOfChannels(); i++) {\n    auto channel = processingBuffer->getChannel(i);\n    channel->multiply(*gainValues, framesToProcess);\n  }\n\n  return processingBuffer;\n}\n```\n\nThere are a few rules that should be followed when implementing C++ AudioNode core.\n\n- **Thread safety**: Each AudioNode should be created in thread safe manner.\n\n- **Heap allocations**: Heap allocations are not allowed on the Audio Thread, so all necessary data should be allocated in constructor, or pre-allocated on other thread and passed to AudioNode.\n\n- **Destructions** No destructions are allowed to happen on the Audio Thread. AudioNode destruction are handled by already active AudioDestructor. If you need to perform some cleanup, you have to delegate it to AudioDestructor.\n\n- **No locks on Audio Thread**: Locks are not allowed on the Audio Thread. Audio procssing have to be highly performant and efficient.\n\n- **No syscalls** Syscalls are not allowed on the Audio Thread, so if you need to perform some work that requires syscalls, you have to delegate it to other thread.\n\n## HostObject implementation\n\nWe can distinguish three types of AudioNode's JS methods:\n\n1. **getter**\n\n```ts\nconst fftSize = analyserNode.fftSize;\n```\n\nC++ counter part is `JSI_PROPERTY_GETTER`. It just returns some value.\n\n```cpp\nJSI_PROPERTY_GETTER_IMPL(AnalyserNodeHostObject, fftSize) {\n  return {fftSize_};\n}\n```\n\n2. **setter**\n\nC++ counterpart is `JSI_PROPERTY_SETTER`. It just receives some value.\n\n```ts\nanalyserNode.fftSize = 2048;\n```\n\n```cpp\nJSI_PROPERTY_SETTER_IMPL(AnalyserNodeHostObject, minDecibels) {\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  auto minDecibels = static_cast<float>(value.getNumber());\n  auto event = [analyserNode, minDecibels](BaseAudioContext&) {\n    analyserNode->setMinDecibels(minDecibels);\n  };\n    analyserNode->scheduleAudioEvent(std::move(event));\n    minDecibels_ = minDecibels;\n}\n```\n\n\n3. **function**\n\nC++ counterpart is `JSI_HOST_FUNCTION`. It is a common function that can receive arguments and return some value.\n\n```ts\nconst fftOutput = new Uint8Array(analyser.frequencyBinCount);\nanalyserNode.getByteFrequencyData(fftOutput);\n```\n\n```cpp\nJSI_HOST_FUNCTION_IMPL(AnalyserNodeHostObject, getByteFrequencyData) {\n  auto arrayBuffer =\n      args[0].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto data = arrayBuffer.data(runtime);\n  auto length = static_cast<int>(arrayBuffer.size(runtime));\n\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  analyserNode->getByteFrequencyData(data, length);\n\n  return jsi::Value::undefined();\n}\n```\n\nAll methods should be registerd in C++ HO constructor:\n\n```cpp\nAnalyserNodeHostObject::AnalyserNodeHostObject(const std::shared_ptr<BaseAudioContext>& context, const AnalyserOptions &options)\n    : /* ... */ {\n  addGetters(JSI_EXPORT_PROPERTY_GETTER(AnalyserNodeHostObject, fftSize));\n  addSetters(JSI_EXPORT_PROPERTY_SETTER(AnalyserNodeHostObject, fftSize));\n  addFunctions(JSI_EXPORT_FUNCTION(AnalyserNodeHostObject, getByteFrequencyData),);\n}\n```\n\n#### Shadow state (C++)\n\nShadow state is a mechanism introduced in order to make communication between JS and the Audio Thread lock-free. AudioNodeHostObject stores the set of properties, which are  modified only by JS thread (the same set C++ AudioNode has). Everytime we want to access some property from JS, we can just return property from shadow state, when we modify some property we have to update shadow state and schedule update event on Audio Event Loop (SPSC). By following that manner we can skip accessing AudioNode state, that is also accessed by the Audio Thread - no need to lock or use atomic variables.\n\n```cpp\nclass OscillatorNodeHostObject : public AudioScheduledSourceNodeHostObject {\n public:\n  /* ... */\n\n  JSI_PROPERTY_GETTER_DECL(type);\n  JSI_PROPERTY_SETTER_DECL(type);\n\n private:\n  /* ... */\n  OscillatorType type_;\n};\n```\n\n```cpp\nJSI_PROPERTY_GETTER_IMPL(OscillatorNodeHostObject, type) {\n  return jsi::String::createFromUtf8(runtime, js_enum_parser::oscillatorTypeToString(type_));\n}\n\nJSI_PROPERTY_SETTER_IMPL(OscillatorNodeHostObject, type) {\n  auto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);\n  auto type = js_enum_parser::oscillatorTypeFromString(value.asString(runtime).utf8(runtime));\n\n  auto event = [oscillatorNode, type](BaseAudioContext &) {\n    oscillatorNode->setType(type);\n  };\n  type_ = type;\n\n  oscillatorNode->scheduleAudioEvent(std::move(event));\n}\n```\n\n#### Communication between JS Thread and Audio Thread\n\n**getters** and **setters**\n\n1. Property is primitive and is not modified by the Audio Thread.\n\n   Shadow state design pattern should be followed.\n\n2. Property is not primitive and is not modified by the Audio Thread.\n\n  It should be stored in TS layer and copied to AudioNode\n\n3. Property is primitive and can be modified by the Audio Thread.\n\n  In C++ core it should be an atomic variable that allows to access it in thread-safe manner from both threads.\n\n```cpp\nclass AudioParam {\npublic:\n  /* ... */\n\n  [[nodiscard]] inline float getValue() const noexcept {\n    return value_.load(std::memory_order_relaxed);\n  }\n\n  inline void setValue(float value) {\n    value_.store(std::clamp(value, minValue_, maxValue_), std::memory_order_release);\n  }\n\n  /* ... */\n\nprivate:\n  std::atomic<float> value_;\n\n  /* ... */\n};\n```\n\n```cpp\nJSI_PROPERTY_GETTER_IMPL(AudioParamHostObject, value) {\n  return {param_->getValue()};\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioParamHostObject, value) {\n    auto event = [param = param_, value = static_cast<float>(value.getNumber())](BaseAudioContext &) {\n        param->setValue(value);\n    };\n\n    param_->scheduleAudioEvent(std::move(event));\n}\n```\n\n4. Property is not primitive and can be modified by the Audio Thread.\n  In C++ core triple buffer pattern should be followed. It allows to have one copy of property for reader, one for writer and one for pending update. On each update we just swap pending update with writer, and on each read we just read from reader. In that manner we can skip locks and just operate on atomic indices.\n\n  Check AnalyserNode implementation for example or this [article](https://medium.com/@sgn00/triple-buffer-lock-free-concurrency-primitive-611848627a1e) for more details.\n\n**functions**\n\nFunction's should follow the same thread-safe lock-free patterns as getters/setters. Set of properties read/write by the function determines mechanisms that should be used in implementation.\n"
  },
  {
    "path": "ghdocs/changelog.md",
    "content": "## Change log\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.8.0\"><img src=\"https://img.shields.io/badge/Released_in-0.8.0-green\" /></a>\n\n- **Decoding support for m4a/mp4/aac/ogg/opus 📁** <br />\n  Decode m4a/mp4/aac/ogg/opus audio files, allowing for playback of these formats in the audio graph.\n\n- **HLS streaming support** 🌊 <br />\n  Stream audio from HLS sources, allowing for playback of live audio streams or pre-recorded audio files.\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.7.0\"><img src=\"https://img.shields.io/badge/Released_in-0.7.0-green\" /></a>\n\n- **Microphone support 🎙️** <br />\n  Grab audio data from device microphone or connected device, connect it to the audio graph or stream through the internet.\n\n- **Custom Audio Processor ⚙️** <br />\n  Write your own processing AudioNode.\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.6.0\"><img src=\"https://img.shields.io/badge/Released_in-0.6.0-green\" /></a>\n\n- **System configuration 🛠️** <br />\n  Full control of system audio settings, remote controls, lock screen integration and most importantly configurable background modes.\n\n- **Connect audio param 🤞** <br />\n  Connect Audio nodes to audio params, which will allow for powerful and efficient modulation of audio parameters, creating effects like tremolo, vibrato or complex envelope followers.\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.5.0\"><img src=\"https://img.shields.io/badge/Released_in-0.5.0-green\" /></a>\n\n- **Pitch correction, extending the web 💥** <br />\n  Modify playback speed without affecting pitch of the sound.\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.4.0\"><img src=\"https://img.shields.io/badge/Released_in-0.4.0-green\" /></a>\n\n- **Analyser Node 🌊** <br />\n  Draw, animate or simply debug audio data in time or frequency domain.\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.3.2\"><img src=\"https://img.shields.io/badge/Released_in-0.3.2-green\" /></a>\n\n- **Audio Files 🎸** <br />\n  Local and remote audio file resources: MP3, WAV, FLAC.\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.2.0\"><img src=\"https://img.shields.io/badge/Released_in-0.2.0-green\" /></a>\n\n- **Graph Processing 🛎️** <br />\n  Multi-channel audio processing, audio-graph route optimizations, improved react-native layer for managing audio nodes.\n\n### <a href=\"https://github.com/software-mansion/react-native-audio-api/releases/tag/0.1.0\"><img src=\"https://img.shields.io/badge/Released_in-0.1.0-green\" /></a>\n\n- **Sound synthesis and system audio 🐣** <br />\n  Devices audio engines and threads, basic nodes for sound synthesis, simple effects and audio graph implementation.\n"
  },
  {
    "path": "lefthook.yml",
    "content": "pre-commit:\n  parallel: true\n  commands:\n    format_check:\n      run: yarn format:check\n    lint:\n      run: yarn lint\n    types:\n      glob: '*.{js,ts,jsx,tsx}'\n      run: yarn typecheck\ncommit-msg:\n  parallel: true\n  commands:\n    commitlint:\n      run: npx commitlint --edit\n"
  },
  {
    "path": "lgplv3",
    "content": "                   GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\n  This version of the GNU Lesser General Public License incorporates\nthe terms and conditions of version 3 of the GNU General Public\nLicense, supplemented by the additional permissions listed below.\n\n  0. Additional Definitions.\n\n  As used herein, \"this License\" refers to version 3 of the GNU Lesser\nGeneral Public License, and the \"GNU GPL\" refers to version 3 of the GNU\nGeneral Public License.\n\n  \"The Library\" refers to a covered work governed by this License,\nother than an Application or a Combined Work as defined below.\n\n  An \"Application\" is any work that makes use of an interface provided\nby the Library, but which is not otherwise based on the Library.\nDefining a subclass of a class defined by the Library is deemed a mode\nof using an interface provided by the Library.\n\n  A \"Combined Work\" is a work produced by combining or linking an\nApplication with the Library.  The particular version of the Library\nwith which the Combined Work was made is also called the \"Linked\nVersion\".\n\n  The \"Minimal Corresponding Source\" for a Combined Work means the\nCorresponding Source for the Combined Work, excluding any source code\nfor portions of the Combined Work that, considered in isolation, are\nbased on the Application, and not on the Linked Version.\n\n  The \"Corresponding Application Code\" for a Combined Work means the\nobject code and/or source code for the Application, including any data\nand utility programs needed for reproducing the Combined Work from the\nApplication, but excluding the System Libraries of the Combined Work.\n\n  1. Exception to Section 3 of the GNU GPL.\n\n  You may convey a covered work under sections 3 and 4 of this License\nwithout being bound by section 3 of the GNU GPL.\n\n  2. Conveying Modified Versions.\n\n  If you modify a copy of the Library, and, in your modifications, a\nfacility refers to a function or data to be supplied by an Application\nthat uses the facility (other than as an argument passed when the\nfacility is invoked), then you may convey a copy of the modified\nversion:\n\n   a) under this License, provided that you make a good faith effort to\n   ensure that, in the event an Application does not supply the\n   function or data, the facility still operates, and performs\n   whatever part of its purpose remains meaningful, or\n\n   b) under the GNU GPL, with none of the additional permissions of\n   this License applicable to that copy.\n\n  3. Object Code Incorporating Material from Library Header Files.\n\n  The object code form of an Application may incorporate material from\na header file that is part of the Library.  You may convey such object\ncode under terms of your choice, provided that, if the incorporated\nmaterial is not limited to numerical parameters, data structure\nlayouts and accessors, or small macros, inline functions and templates\n(ten or fewer lines in length), you do both of the following:\n\n   a) Give prominent notice with each copy of the object code that the\n   Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the object code with a copy of the GNU GPL and this license\n   document.\n\n  4. Combined Works.\n\n  You may convey a Combined Work under terms of your choice that,\ntaken together, effectively do not restrict modification of the\nportions of the Library contained in the Combined Work and reverse\nengineering for debugging such modifications, if you also do each of\nthe following:\n\n   a) Give prominent notice with each copy of the Combined Work that\n   the Library is used in it and that the Library and its use are\n   covered by this License.\n\n   b) Accompany the Combined Work with a copy of the GNU GPL and this license\n   document.\n\n   c) For a Combined Work that displays copyright notices during\n   execution, include the copyright notice for the Library among\n   these notices, as well as a reference directing the user to the\n   copies of the GNU GPL and this license document.\n\n   d) Do one of the following:\n\n       0) Convey the Minimal Corresponding Source under the terms of this\n       License, and the Corresponding Application Code in a form\n       suitable for, and under terms that permit, the user to\n       recombine or relink the Application with a modified version of\n       the Linked Version to produce a modified Combined Work, in the\n       manner specified by section 6 of the GNU GPL for conveying\n       Corresponding Source.\n\n       1) Use a suitable shared library mechanism for linking with the\n       Library.  A suitable mechanism is one that (a) uses at run time\n       a copy of the Library already present on the user's computer\n       system, and (b) will operate properly with a modified version\n       of the Library that is interface-compatible with the Linked\n       Version.\n\n   e) Provide Installation Information, but only if you would otherwise\n   be required to provide such information under section 6 of the\n   GNU GPL, and only to the extent that such information is\n   necessary to install and execute a modified version of the\n   Combined Work produced by recombining or relinking the\n   Application with a modified version of the Linked Version. (If\n   you use option 4d0, the Installation Information must accompany\n   the Minimal Corresponding Source and Corresponding Application\n   Code. If you use option 4d1, you must provide the Installation\n   Information in the manner specified by section 6 of the GNU GPL\n   for conveying Corresponding Source.)\n\n  5. Combined Libraries.\n\n  You may place library facilities that are a work based on the\nLibrary side by side in a single library together with other library\nfacilities that are not Applications and are not covered by this\nLicense, and convey such a combined library under terms of your\nchoice, if you do both of the following:\n\n   a) Accompany the combined library with a copy of the same work based\n   on the Library, uncombined with any other library facilities,\n   conveyed under the terms of this License.\n\n   b) Give prominent notice with the combined library that part of it\n   is a work based on the Library, and explaining where to find the\n   accompanying uncombined form of the same work.\n\n  6. Revised Versions of the GNU Lesser General Public License.\n\n  The Free Software Foundation may publish revised and/or new versions\nof the GNU Lesser General Public License from time to time. Such new\nversions will be similar in spirit to the present version, but may\ndiffer in detail to address new problems or concerns.\n\n  Each version is given a distinguishing version number. If the\nLibrary as you received it specifies that a certain numbered version\nof the GNU Lesser General Public License \"or any later version\"\napplies to it, you have the option of following the terms and\nconditions either of that published version or of any later version\npublished by the Free Software Foundation. If the Library as you\nreceived it does not specify a version number of the GNU Lesser\nGeneral Public License, you may choose any version of the GNU Lesser\nGeneral Public License ever published by the Free Software Foundation.\n\n  If the Library as you received it specifies that a proxy can decide\nwhether future versions of the GNU Lesser General Public License shall\napply, that proxy's public statement of acceptance of any version is\npermanent authorization for you to choose that version for the\nLibrary."
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"react-native-audio-api-monorepo\",\n  \"version\": \"0.0.0\",\n  \"packageManager\": \"yarn@4.5.0\",\n  \"private\": true,\n  \"workspaces\": {\n    \"packages\": [\n      \"packages/react-native-audio-api\",\n      \"apps/common-app\",\n      \"apps/fabric-example\"\n    ]\n  },\n  \"scripts\": {\n    \"build\": \"yarn workspaces foreach -A -p run build\",\n    \"lint\": \"yarn workspaces foreach -A -p run lint\",\n    \"format\": \"yarn workspaces foreach -A -p run format\",\n    \"format:check\": \"yarn workspace react-native-audio-api run format:check\",\n    \"clean\": \"del-cli packages/**/android/build apps/**/android/build apps/**/android/app/build apps/**/ios/build packages/**/lib node_modules apps/**/node_modules packages/**/node_modules\",\n    \"typecheck\": \"yarn workspaces foreach -A -p run typecheck\",\n    \"test\": \"yarn workspace react-native-audio-api run test\",\n    \"check-audio-enum-sync\": \"bash packages/react-native-audio-api/scripts/check-audio-events-sync.sh\"\n  },\n  \"devDependencies\": {\n    \"@commitlint/config-conventional\": \"17.0.2\",\n    \"@evilmartians/lefthook\": \"^1.5.0\",\n    \"@react-native/eslint-config\": \"0.85.0\",\n    \"@types/raf\": \"^3.4.3\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.48.1\",\n    \"@typescript-eslint/parser\": \"^8.48.1\",\n    \"commitlint\": \"17.0.2\",\n    \"eslint\": \"^8.57.0\",\n    \"eslint-config-prettier\": \"^9.0.0\",\n    \"eslint-plugin-jsdoc\": \"^50.2.2\",\n    \"eslint-plugin-prettier\": \"^5.0.1\",\n    \"eslint-plugin-react\": \"^7.34.3\",\n    \"hermes-eslint\": \"^0.26.0\",\n    \"prettier\": \"^3.3.3\",\n    \"prettier-plugin-jsdoc\": \"^1.3.0\",\n    \"typescript\": \"~5.8.3\"\n  },\n  \"resolutions\": {\n    \"typescript\": \"~5.8.3\"\n  },\n  \"commitlint\": {\n    \"extends\": [\n      \"@commitlint/config-conventional\"\n    ]\n  },\n  \"eslintConfig\": {\n    \"root\": true,\n    \"parserOptions\": {\n      \"requireConfigFile\": false\n    },\n    \"extends\": [\n      \"@react-native\",\n      \"prettier\"\n    ],\n    \"rules\": {\n      \"react/react-in-jsx-scope\": \"off\",\n      \"prettier/prettier\": [\n        \"error\",\n        {\n          \"quoteProps\": \"consistent\",\n          \"singleQuote\": true,\n          \"tabWidth\": 2,\n          \"trailingComma\": \"es5\",\n          \"useTabs\": false\n        }\n      ]\n    }\n  },\n  \"eslintIgnore\": [\n    \"node_modules/\",\n    \"lib/\"\n  ],\n  \"prettier\": {\n    \"quoteProps\": \"consistent\",\n    \"singleQuote\": true,\n    \"tabWidth\": 2,\n    \"trailingComma\": \"es5\",\n    \"useTabs\": false\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/.eslintrc",
    "content": "{\n  \"parser\": \"@babel/eslint-parser\",\n  \"parserOptions\": {\n    \"babelOptions\": {\n      \"presets\": [\"@babel/preset-react\"],\n      \"plugins\": [\"react-native-worklets/plugin\"]\n    }\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/.gitignore",
    "content": "# Dependencies\n/node_modules\n\n# Production\n/build\n\n# Generated files\n.docusaurus\n.cache-loader\n\n# Misc\n.DS_Store\n.env.local\n.env.development.local\n.env.test.local\n.env.production.local\n\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\n\n# Yarn\n.yarn/*\n!.yarn/patches\n!.yarn/plugins\n!.yarn/releases\n!.yarn/sdks\n!.yarn/versions\n.yarn/cache\n"
  },
  {
    "path": "packages/audiodocs/.yarn/releases/yarn-1.22.22.cjs",
    "content": "#!/usr/bin/env node\nmodule.exports =\n/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// identity function for calling harmony imports with the correct context\n/******/ \t__webpack_require__.i = function(value) { return value; };\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 517);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"path\");\n\n/***/ }),\n/* 1 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = __extends;\n/* unused harmony export __assign */\n/* unused harmony export __rest */\n/* unused harmony export __decorate */\n/* unused harmony export __param */\n/* unused harmony export __metadata */\n/* unused harmony export __awaiter */\n/* unused harmony export __generator */\n/* unused harmony export __exportStar */\n/* unused harmony export __values */\n/* unused harmony export __read */\n/* unused harmony export __spread */\n/* unused harmony export __await */\n/* unused harmony export __asyncGenerator */\n/* unused harmony export __asyncDelegator */\n/* unused harmony export __asyncValues */\n/* unused harmony export __makeTemplateObject */\n/* unused harmony export __importStar */\n/* unused harmony export __importDefault */\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nfunction __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nvar __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nfunction __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n            t[p[i]] = s[p[i]];\r\n    return t;\r\n}\r\n\r\nfunction __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nfunction __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nfunction __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nfunction __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nfunction __exportStar(m, exports) {\r\n    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nfunction __values(o) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n    if (m) return m.call(o);\r\n    return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n}\r\n\r\nfunction __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nfunction __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nfunction __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nfunction __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nfunction __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nfunction __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nfunction __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nfunction __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nfunction __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _promise = __webpack_require__(224);\n\nvar _promise2 = _interopRequireDefault(_promise);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function (fn) {\n  return function () {\n    var gen = fn.apply(this, arguments);\n    return new _promise2.default(function (resolve, reject) {\n      function step(key, arg) {\n        try {\n          var info = gen[key](arg);\n          var value = info.value;\n        } catch (error) {\n          reject(error);\n          return;\n        }\n\n        if (info.done) {\n          resolve(value);\n        } else {\n          return _promise2.default.resolve(value).then(function (value) {\n            step(\"next\", value);\n          }, function (err) {\n            step(\"throw\", err);\n          });\n        }\n      }\n\n      return step(\"next\");\n    });\n  };\n};\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"util\");\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"fs\");\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getFirstSuitableFolder = exports.readFirstAvailableStream = exports.makeTempDir = exports.hardlinksWork = exports.writeFilePreservingEol = exports.getFileSizeOnDisk = exports.walk = exports.symlink = exports.find = exports.readJsonAndFile = exports.readJson = exports.readFileAny = exports.hardlinkBulk = exports.copyBulk = exports.unlink = exports.glob = exports.link = exports.chmod = exports.lstat = exports.exists = exports.mkdirp = exports.stat = exports.access = exports.rename = exports.readdir = exports.realpath = exports.readlink = exports.writeFile = exports.open = exports.readFileBuffer = exports.lockQueue = exports.constants = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet buildActionsForCopy = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, events, possibleExtraneous, reporter) {\n\n    //\n    let build = (() => {\n      var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) {\n        const src = data.src,\n              dest = data.dest,\n              type = data.type;\n\n        const onFresh = data.onFresh || noop;\n        const onDone = data.onDone || noop;\n\n        // TODO https://github.com/yarnpkg/yarn/issues/3751\n        // related to bundled dependencies handling\n        if (files.has(dest.toLowerCase())) {\n          reporter.verbose(`The case-insensitive file ${dest} shouldn't be copied twice in one bulk copy`);\n        } else {\n          files.add(dest.toLowerCase());\n        }\n\n        if (type === 'symlink') {\n          yield mkdirp((_path || _load_path()).default.dirname(dest));\n          onFresh();\n          actions.symlink.push({\n            dest,\n            linkname: src\n          });\n          onDone();\n          return;\n        }\n\n        if (events.ignoreBasenames.indexOf((_path || _load_path()).default.basename(src)) >= 0) {\n          // ignored file\n          return;\n        }\n\n        const srcStat = yield lstat(src);\n        let srcFiles;\n\n        if (srcStat.isDirectory()) {\n          srcFiles = yield readdir(src);\n        }\n\n        let destStat;\n        try {\n          // try accessing the destination\n          destStat = yield lstat(dest);\n        } catch (e) {\n          // proceed if destination doesn't exist, otherwise error\n          if (e.code !== 'ENOENT') {\n            throw e;\n          }\n        }\n\n        // if destination exists\n        if (destStat) {\n          const bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink();\n          const bothFolders = srcStat.isDirectory() && destStat.isDirectory();\n          const bothFiles = srcStat.isFile() && destStat.isFile();\n\n          // EINVAL access errors sometimes happen which shouldn't because node shouldn't be giving\n          // us modes that aren't valid. investigate this, it's generally safe to proceed.\n\n          /* if (srcStat.mode !== destStat.mode) {\n            try {\n              await access(dest, srcStat.mode);\n            } catch (err) {}\n          } */\n\n          if (bothFiles && artifactFiles.has(dest)) {\n            // this file gets changed during build, likely by a custom install script. Don't bother checking it.\n            onDone();\n            reporter.verbose(reporter.lang('verboseFileSkipArtifact', src));\n            return;\n          }\n\n          if (bothFiles && srcStat.size === destStat.size && (0, (_fsNormalized || _load_fsNormalized()).fileDatesEqual)(srcStat.mtime, destStat.mtime)) {\n            // we can safely assume this is the same file\n            onDone();\n            reporter.verbose(reporter.lang('verboseFileSkip', src, dest, srcStat.size, +srcStat.mtime));\n            return;\n          }\n\n          if (bothSymlinks) {\n            const srcReallink = yield readlink(src);\n            if (srcReallink === (yield readlink(dest))) {\n              // if both symlinks are the same then we can continue on\n              onDone();\n              reporter.verbose(reporter.lang('verboseFileSkipSymlink', src, dest, srcReallink));\n              return;\n            }\n          }\n\n          if (bothFolders) {\n            // mark files that aren't in this folder as possibly extraneous\n            const destFiles = yield readdir(dest);\n            invariant(srcFiles, 'src files not initialised');\n\n            for (var _iterator4 = destFiles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n              var _ref6;\n\n              if (_isArray4) {\n                if (_i4 >= _iterator4.length) break;\n                _ref6 = _iterator4[_i4++];\n              } else {\n                _i4 = _iterator4.next();\n                if (_i4.done) break;\n                _ref6 = _i4.value;\n              }\n\n              const file = _ref6;\n\n              if (srcFiles.indexOf(file) < 0) {\n                const loc = (_path || _load_path()).default.join(dest, file);\n                possibleExtraneous.add(loc);\n\n                if ((yield lstat(loc)).isDirectory()) {\n                  for (var _iterator5 = yield readdir(loc), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n                    var _ref7;\n\n                    if (_isArray5) {\n                      if (_i5 >= _iterator5.length) break;\n                      _ref7 = _iterator5[_i5++];\n                    } else {\n                      _i5 = _iterator5.next();\n                      if (_i5.done) break;\n                      _ref7 = _i5.value;\n                    }\n\n                    const file = _ref7;\n\n                    possibleExtraneous.add((_path || _load_path()).default.join(loc, file));\n                  }\n                }\n              }\n            }\n          }\n        }\n\n        if (destStat && destStat.isSymbolicLink()) {\n          yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dest);\n          destStat = null;\n        }\n\n        if (srcStat.isSymbolicLink()) {\n          onFresh();\n          const linkname = yield readlink(src);\n          actions.symlink.push({\n            dest,\n            linkname\n          });\n          onDone();\n        } else if (srcStat.isDirectory()) {\n          if (!destStat) {\n            reporter.verbose(reporter.lang('verboseFileFolder', dest));\n            yield mkdirp(dest);\n          }\n\n          const destParts = dest.split((_path || _load_path()).default.sep);\n          while (destParts.length) {\n            files.add(destParts.join((_path || _load_path()).default.sep).toLowerCase());\n            destParts.pop();\n          }\n\n          // push all files to queue\n          invariant(srcFiles, 'src files not initialised');\n          let remaining = srcFiles.length;\n          if (!remaining) {\n            onDone();\n          }\n          for (var _iterator6 = srcFiles, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n            var _ref8;\n\n            if (_isArray6) {\n              if (_i6 >= _iterator6.length) break;\n              _ref8 = _iterator6[_i6++];\n            } else {\n              _i6 = _iterator6.next();\n              if (_i6.done) break;\n              _ref8 = _i6.value;\n            }\n\n            const file = _ref8;\n\n            queue.push({\n              dest: (_path || _load_path()).default.join(dest, file),\n              onFresh,\n              onDone: function (_onDone) {\n                function onDone() {\n                  return _onDone.apply(this, arguments);\n                }\n\n                onDone.toString = function () {\n                  return _onDone.toString();\n                };\n\n                return onDone;\n              }(function () {\n                if (--remaining === 0) {\n                  onDone();\n                }\n              }),\n              src: (_path || _load_path()).default.join(src, file)\n            });\n          }\n        } else if (srcStat.isFile()) {\n          onFresh();\n          actions.file.push({\n            src,\n            dest,\n            atime: srcStat.atime,\n            mtime: srcStat.mtime,\n            mode: srcStat.mode\n          });\n          onDone();\n        } else {\n          throw new Error(`unsure how to copy this: ${src}`);\n        }\n      });\n\n      return function build(_x5) {\n        return _ref5.apply(this, arguments);\n      };\n    })();\n\n    const artifactFiles = new Set(events.artifactFiles || []);\n    const files = new Set();\n\n    // initialise events\n    for (var _iterator = queue, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref2;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref2 = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref2 = _i.value;\n      }\n\n      const item = _ref2;\n\n      const onDone = item.onDone;\n      item.onDone = function () {\n        events.onProgress(item.dest);\n        if (onDone) {\n          onDone();\n        }\n      };\n    }\n    events.onStart(queue.length);\n\n    // start building actions\n    const actions = {\n      file: [],\n      symlink: [],\n      link: []\n    };\n\n    // custom concurrency logic as we're always executing stacks of CONCURRENT_QUEUE_ITEMS queue items\n    // at a time due to the requirement to push items onto the queue\n    while (queue.length) {\n      const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS);\n      yield Promise.all(items.map(build));\n    }\n\n    // simulate the existence of some files to prevent considering them extraneous\n    for (var _iterator2 = artifactFiles, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n      var _ref3;\n\n      if (_isArray2) {\n        if (_i2 >= _iterator2.length) break;\n        _ref3 = _iterator2[_i2++];\n      } else {\n        _i2 = _iterator2.next();\n        if (_i2.done) break;\n        _ref3 = _i2.value;\n      }\n\n      const file = _ref3;\n\n      if (possibleExtraneous.has(file)) {\n        reporter.verbose(reporter.lang('verboseFilePhantomExtraneous', file));\n        possibleExtraneous.delete(file);\n      }\n    }\n\n    for (var _iterator3 = possibleExtraneous, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n      var _ref4;\n\n      if (_isArray3) {\n        if (_i3 >= _iterator3.length) break;\n        _ref4 = _iterator3[_i3++];\n      } else {\n        _i3 = _iterator3.next();\n        if (_i3.done) break;\n        _ref4 = _i3.value;\n      }\n\n      const loc = _ref4;\n\n      if (files.has(loc.toLowerCase())) {\n        possibleExtraneous.delete(loc);\n      }\n    }\n\n    return actions;\n  });\n\n  return function buildActionsForCopy(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet buildActionsForHardlink = (() => {\n  var _ref9 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, events, possibleExtraneous, reporter) {\n\n    //\n    let build = (() => {\n      var _ref13 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) {\n        const src = data.src,\n              dest = data.dest;\n\n        const onFresh = data.onFresh || noop;\n        const onDone = data.onDone || noop;\n        if (files.has(dest.toLowerCase())) {\n          // Fixes issue https://github.com/yarnpkg/yarn/issues/2734\n          // When bulk hardlinking we have A -> B structure that we want to hardlink to A1 -> B1,\n          // package-linker passes that modules A1 and B1 need to be hardlinked,\n          // the recursive linking algorithm of A1 ends up scheduling files in B1 to be linked twice which will case\n          // an exception.\n          onDone();\n          return;\n        }\n        files.add(dest.toLowerCase());\n\n        if (events.ignoreBasenames.indexOf((_path || _load_path()).default.basename(src)) >= 0) {\n          // ignored file\n          return;\n        }\n\n        const srcStat = yield lstat(src);\n        let srcFiles;\n\n        if (srcStat.isDirectory()) {\n          srcFiles = yield readdir(src);\n        }\n\n        const destExists = yield exists(dest);\n        if (destExists) {\n          const destStat = yield lstat(dest);\n\n          const bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink();\n          const bothFolders = srcStat.isDirectory() && destStat.isDirectory();\n          const bothFiles = srcStat.isFile() && destStat.isFile();\n\n          if (srcStat.mode !== destStat.mode) {\n            try {\n              yield access(dest, srcStat.mode);\n            } catch (err) {\n              // EINVAL access errors sometimes happen which shouldn't because node shouldn't be giving\n              // us modes that aren't valid. investigate this, it's generally safe to proceed.\n              reporter.verbose(err);\n            }\n          }\n\n          if (bothFiles && artifactFiles.has(dest)) {\n            // this file gets changed during build, likely by a custom install script. Don't bother checking it.\n            onDone();\n            reporter.verbose(reporter.lang('verboseFileSkipArtifact', src));\n            return;\n          }\n\n          // correct hardlink\n          if (bothFiles && srcStat.ino !== null && srcStat.ino === destStat.ino) {\n            onDone();\n            reporter.verbose(reporter.lang('verboseFileSkip', src, dest, srcStat.ino));\n            return;\n          }\n\n          if (bothSymlinks) {\n            const srcReallink = yield readlink(src);\n            if (srcReallink === (yield readlink(dest))) {\n              // if both symlinks are the same then we can continue on\n              onDone();\n              reporter.verbose(reporter.lang('verboseFileSkipSymlink', src, dest, srcReallink));\n              return;\n            }\n          }\n\n          if (bothFolders) {\n            // mark files that aren't in this folder as possibly extraneous\n            const destFiles = yield readdir(dest);\n            invariant(srcFiles, 'src files not initialised');\n\n            for (var _iterator10 = destFiles, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) {\n              var _ref14;\n\n              if (_isArray10) {\n                if (_i10 >= _iterator10.length) break;\n                _ref14 = _iterator10[_i10++];\n              } else {\n                _i10 = _iterator10.next();\n                if (_i10.done) break;\n                _ref14 = _i10.value;\n              }\n\n              const file = _ref14;\n\n              if (srcFiles.indexOf(file) < 0) {\n                const loc = (_path || _load_path()).default.join(dest, file);\n                possibleExtraneous.add(loc);\n\n                if ((yield lstat(loc)).isDirectory()) {\n                  for (var _iterator11 = yield readdir(loc), _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) {\n                    var _ref15;\n\n                    if (_isArray11) {\n                      if (_i11 >= _iterator11.length) break;\n                      _ref15 = _iterator11[_i11++];\n                    } else {\n                      _i11 = _iterator11.next();\n                      if (_i11.done) break;\n                      _ref15 = _i11.value;\n                    }\n\n                    const file = _ref15;\n\n                    possibleExtraneous.add((_path || _load_path()).default.join(loc, file));\n                  }\n                }\n              }\n            }\n          }\n        }\n\n        if (srcStat.isSymbolicLink()) {\n          onFresh();\n          const linkname = yield readlink(src);\n          actions.symlink.push({\n            dest,\n            linkname\n          });\n          onDone();\n        } else if (srcStat.isDirectory()) {\n          reporter.verbose(reporter.lang('verboseFileFolder', dest));\n          yield mkdirp(dest);\n\n          const destParts = dest.split((_path || _load_path()).default.sep);\n          while (destParts.length) {\n            files.add(destParts.join((_path || _load_path()).default.sep).toLowerCase());\n            destParts.pop();\n          }\n\n          // push all files to queue\n          invariant(srcFiles, 'src files not initialised');\n          let remaining = srcFiles.length;\n          if (!remaining) {\n            onDone();\n          }\n          for (var _iterator12 = srcFiles, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) {\n            var _ref16;\n\n            if (_isArray12) {\n              if (_i12 >= _iterator12.length) break;\n              _ref16 = _iterator12[_i12++];\n            } else {\n              _i12 = _iterator12.next();\n              if (_i12.done) break;\n              _ref16 = _i12.value;\n            }\n\n            const file = _ref16;\n\n            queue.push({\n              onFresh,\n              src: (_path || _load_path()).default.join(src, file),\n              dest: (_path || _load_path()).default.join(dest, file),\n              onDone: function (_onDone2) {\n                function onDone() {\n                  return _onDone2.apply(this, arguments);\n                }\n\n                onDone.toString = function () {\n                  return _onDone2.toString();\n                };\n\n                return onDone;\n              }(function () {\n                if (--remaining === 0) {\n                  onDone();\n                }\n              })\n            });\n          }\n        } else if (srcStat.isFile()) {\n          onFresh();\n          actions.link.push({\n            src,\n            dest,\n            removeDest: destExists\n          });\n          onDone();\n        } else {\n          throw new Error(`unsure how to copy this: ${src}`);\n        }\n      });\n\n      return function build(_x10) {\n        return _ref13.apply(this, arguments);\n      };\n    })();\n\n    const artifactFiles = new Set(events.artifactFiles || []);\n    const files = new Set();\n\n    // initialise events\n    for (var _iterator7 = queue, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {\n      var _ref10;\n\n      if (_isArray7) {\n        if (_i7 >= _iterator7.length) break;\n        _ref10 = _iterator7[_i7++];\n      } else {\n        _i7 = _iterator7.next();\n        if (_i7.done) break;\n        _ref10 = _i7.value;\n      }\n\n      const item = _ref10;\n\n      const onDone = item.onDone || noop;\n      item.onDone = function () {\n        events.onProgress(item.dest);\n        onDone();\n      };\n    }\n    events.onStart(queue.length);\n\n    // start building actions\n    const actions = {\n      file: [],\n      symlink: [],\n      link: []\n    };\n\n    // custom concurrency logic as we're always executing stacks of CONCURRENT_QUEUE_ITEMS queue items\n    // at a time due to the requirement to push items onto the queue\n    while (queue.length) {\n      const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS);\n      yield Promise.all(items.map(build));\n    }\n\n    // simulate the existence of some files to prevent considering them extraneous\n    for (var _iterator8 = artifactFiles, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {\n      var _ref11;\n\n      if (_isArray8) {\n        if (_i8 >= _iterator8.length) break;\n        _ref11 = _iterator8[_i8++];\n      } else {\n        _i8 = _iterator8.next();\n        if (_i8.done) break;\n        _ref11 = _i8.value;\n      }\n\n      const file = _ref11;\n\n      if (possibleExtraneous.has(file)) {\n        reporter.verbose(reporter.lang('verboseFilePhantomExtraneous', file));\n        possibleExtraneous.delete(file);\n      }\n    }\n\n    for (var _iterator9 = possibleExtraneous, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {\n      var _ref12;\n\n      if (_isArray9) {\n        if (_i9 >= _iterator9.length) break;\n        _ref12 = _iterator9[_i9++];\n      } else {\n        _i9 = _iterator9.next();\n        if (_i9.done) break;\n        _ref12 = _i9.value;\n      }\n\n      const loc = _ref12;\n\n      if (files.has(loc.toLowerCase())) {\n        possibleExtraneous.delete(loc);\n      }\n    }\n\n    return actions;\n  });\n\n  return function buildActionsForHardlink(_x6, _x7, _x8, _x9) {\n    return _ref9.apply(this, arguments);\n  };\n})();\n\nlet copyBulk = exports.copyBulk = (() => {\n  var _ref17 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, reporter, _events) {\n    const events = {\n      onStart: _events && _events.onStart || noop,\n      onProgress: _events && _events.onProgress || noop,\n      possibleExtraneous: _events ? _events.possibleExtraneous : new Set(),\n      ignoreBasenames: _events && _events.ignoreBasenames || [],\n      artifactFiles: _events && _events.artifactFiles || []\n    };\n\n    const actions = yield buildActionsForCopy(queue, events, events.possibleExtraneous, reporter);\n    events.onStart(actions.file.length + actions.symlink.length + actions.link.length);\n\n    const fileActions = actions.file;\n\n    const currentlyWriting = new Map();\n\n    yield (_promise || _load_promise()).queue(fileActions, (() => {\n      var _ref18 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) {\n        let writePromise;\n        while (writePromise = currentlyWriting.get(data.dest)) {\n          yield writePromise;\n        }\n\n        reporter.verbose(reporter.lang('verboseFileCopy', data.src, data.dest));\n        const copier = (0, (_fsNormalized || _load_fsNormalized()).copyFile)(data, function () {\n          return currentlyWriting.delete(data.dest);\n        });\n        currentlyWriting.set(data.dest, copier);\n        events.onProgress(data.dest);\n        return copier;\n      });\n\n      return function (_x14) {\n        return _ref18.apply(this, arguments);\n      };\n    })(), CONCURRENT_QUEUE_ITEMS);\n\n    // we need to copy symlinks last as they could reference files we were copying\n    const symlinkActions = actions.symlink;\n    yield (_promise || _load_promise()).queue(symlinkActions, function (data) {\n      const linkname = (_path || _load_path()).default.resolve((_path || _load_path()).default.dirname(data.dest), data.linkname);\n      reporter.verbose(reporter.lang('verboseFileSymlink', data.dest, linkname));\n      return symlink(linkname, data.dest);\n    });\n  });\n\n  return function copyBulk(_x11, _x12, _x13) {\n    return _ref17.apply(this, arguments);\n  };\n})();\n\nlet hardlinkBulk = exports.hardlinkBulk = (() => {\n  var _ref19 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, reporter, _events) {\n    const events = {\n      onStart: _events && _events.onStart || noop,\n      onProgress: _events && _events.onProgress || noop,\n      possibleExtraneous: _events ? _events.possibleExtraneous : new Set(),\n      artifactFiles: _events && _events.artifactFiles || [],\n      ignoreBasenames: []\n    };\n\n    const actions = yield buildActionsForHardlink(queue, events, events.possibleExtraneous, reporter);\n    events.onStart(actions.file.length + actions.symlink.length + actions.link.length);\n\n    const fileActions = actions.link;\n\n    yield (_promise || _load_promise()).queue(fileActions, (() => {\n      var _ref20 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) {\n        reporter.verbose(reporter.lang('verboseFileLink', data.src, data.dest));\n        if (data.removeDest) {\n          yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(data.dest);\n        }\n        yield link(data.src, data.dest);\n      });\n\n      return function (_x18) {\n        return _ref20.apply(this, arguments);\n      };\n    })(), CONCURRENT_QUEUE_ITEMS);\n\n    // we need to copy symlinks last as they could reference files we were copying\n    const symlinkActions = actions.symlink;\n    yield (_promise || _load_promise()).queue(symlinkActions, function (data) {\n      const linkname = (_path || _load_path()).default.resolve((_path || _load_path()).default.dirname(data.dest), data.linkname);\n      reporter.verbose(reporter.lang('verboseFileSymlink', data.dest, linkname));\n      return symlink(linkname, data.dest);\n    });\n  });\n\n  return function hardlinkBulk(_x15, _x16, _x17) {\n    return _ref19.apply(this, arguments);\n  };\n})();\n\nlet readFileAny = exports.readFileAny = (() => {\n  var _ref21 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (files) {\n    for (var _iterator13 = files, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) {\n      var _ref22;\n\n      if (_isArray13) {\n        if (_i13 >= _iterator13.length) break;\n        _ref22 = _iterator13[_i13++];\n      } else {\n        _i13 = _iterator13.next();\n        if (_i13.done) break;\n        _ref22 = _i13.value;\n      }\n\n      const file = _ref22;\n\n      if (yield exists(file)) {\n        return readFile(file);\n      }\n    }\n    return null;\n  });\n\n  return function readFileAny(_x19) {\n    return _ref21.apply(this, arguments);\n  };\n})();\n\nlet readJson = exports.readJson = (() => {\n  var _ref23 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) {\n    return (yield readJsonAndFile(loc)).object;\n  });\n\n  return function readJson(_x20) {\n    return _ref23.apply(this, arguments);\n  };\n})();\n\nlet readJsonAndFile = exports.readJsonAndFile = (() => {\n  var _ref24 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) {\n    const file = yield readFile(loc);\n    try {\n      return {\n        object: (0, (_map || _load_map()).default)(JSON.parse(stripBOM(file))),\n        content: file\n      };\n    } catch (err) {\n      err.message = `${loc}: ${err.message}`;\n      throw err;\n    }\n  });\n\n  return function readJsonAndFile(_x21) {\n    return _ref24.apply(this, arguments);\n  };\n})();\n\nlet find = exports.find = (() => {\n  var _ref25 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (filename, dir) {\n    const parts = dir.split((_path || _load_path()).default.sep);\n\n    while (parts.length) {\n      const loc = parts.concat(filename).join((_path || _load_path()).default.sep);\n\n      if (yield exists(loc)) {\n        return loc;\n      } else {\n        parts.pop();\n      }\n    }\n\n    return false;\n  });\n\n  return function find(_x22, _x23) {\n    return _ref25.apply(this, arguments);\n  };\n})();\n\nlet symlink = exports.symlink = (() => {\n  var _ref26 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (src, dest) {\n    if (process.platform !== 'win32') {\n      // use relative paths otherwise which will be retained if the directory is moved\n      src = (_path || _load_path()).default.relative((_path || _load_path()).default.dirname(dest), src);\n      // When path.relative returns an empty string for the current directory, we should instead use\n      // '.', which is a valid fs.symlink target.\n      src = src || '.';\n    }\n\n    try {\n      const stats = yield lstat(dest);\n      if (stats.isSymbolicLink()) {\n        const resolved = dest;\n        if (resolved === src) {\n          return;\n        }\n      }\n    } catch (err) {\n      if (err.code !== 'ENOENT') {\n        throw err;\n      }\n    }\n\n    // We use rimraf for unlink which never throws an ENOENT on missing target\n    yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dest);\n\n    if (process.platform === 'win32') {\n      // use directory junctions if possible on win32, this requires absolute paths\n      yield fsSymlink(src, dest, 'junction');\n    } else {\n      yield fsSymlink(src, dest);\n    }\n  });\n\n  return function symlink(_x24, _x25) {\n    return _ref26.apply(this, arguments);\n  };\n})();\n\nlet walk = exports.walk = (() => {\n  var _ref27 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (dir, relativeDir, ignoreBasenames = new Set()) {\n    let files = [];\n\n    let filenames = yield readdir(dir);\n    if (ignoreBasenames.size) {\n      filenames = filenames.filter(function (name) {\n        return !ignoreBasenames.has(name);\n      });\n    }\n\n    for (var _iterator14 = filenames, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) {\n      var _ref28;\n\n      if (_isArray14) {\n        if (_i14 >= _iterator14.length) break;\n        _ref28 = _iterator14[_i14++];\n      } else {\n        _i14 = _iterator14.next();\n        if (_i14.done) break;\n        _ref28 = _i14.value;\n      }\n\n      const name = _ref28;\n\n      const relative = relativeDir ? (_path || _load_path()).default.join(relativeDir, name) : name;\n      const loc = (_path || _load_path()).default.join(dir, name);\n      const stat = yield lstat(loc);\n\n      files.push({\n        relative,\n        basename: name,\n        absolute: loc,\n        mtime: +stat.mtime\n      });\n\n      if (stat.isDirectory()) {\n        files = files.concat((yield walk(loc, relative, ignoreBasenames)));\n      }\n    }\n\n    return files;\n  });\n\n  return function walk(_x26, _x27) {\n    return _ref27.apply(this, arguments);\n  };\n})();\n\nlet getFileSizeOnDisk = exports.getFileSizeOnDisk = (() => {\n  var _ref29 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) {\n    const stat = yield lstat(loc);\n    const size = stat.size,\n          blockSize = stat.blksize;\n\n\n    return Math.ceil(size / blockSize) * blockSize;\n  });\n\n  return function getFileSizeOnDisk(_x28) {\n    return _ref29.apply(this, arguments);\n  };\n})();\n\nlet getEolFromFile = (() => {\n  var _ref30 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (path) {\n    if (!(yield exists(path))) {\n      return undefined;\n    }\n\n    const buffer = yield readFileBuffer(path);\n\n    for (let i = 0; i < buffer.length; ++i) {\n      if (buffer[i] === cr) {\n        return '\\r\\n';\n      }\n      if (buffer[i] === lf) {\n        return '\\n';\n      }\n    }\n    return undefined;\n  });\n\n  return function getEolFromFile(_x29) {\n    return _ref30.apply(this, arguments);\n  };\n})();\n\nlet writeFilePreservingEol = exports.writeFilePreservingEol = (() => {\n  var _ref31 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (path, data) {\n    const eol = (yield getEolFromFile(path)) || (_os || _load_os()).default.EOL;\n    if (eol !== '\\n') {\n      data = data.replace(/\\n/g, eol);\n    }\n    yield writeFile(path, data);\n  });\n\n  return function writeFilePreservingEol(_x30, _x31) {\n    return _ref31.apply(this, arguments);\n  };\n})();\n\nlet hardlinksWork = exports.hardlinksWork = (() => {\n  var _ref32 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (dir) {\n    const filename = 'test-file' + Math.random();\n    const file = (_path || _load_path()).default.join(dir, filename);\n    const fileLink = (_path || _load_path()).default.join(dir, filename + '-link');\n    try {\n      yield writeFile(file, 'test');\n      yield link(file, fileLink);\n    } catch (err) {\n      return false;\n    } finally {\n      yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(file);\n      yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(fileLink);\n    }\n    return true;\n  });\n\n  return function hardlinksWork(_x32) {\n    return _ref32.apply(this, arguments);\n  };\n})();\n\n// not a strict polyfill for Node's fs.mkdtemp\n\n\nlet makeTempDir = exports.makeTempDir = (() => {\n  var _ref33 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (prefix) {\n    const dir = (_path || _load_path()).default.join((_os || _load_os()).default.tmpdir(), `yarn-${prefix || ''}-${Date.now()}-${Math.random()}`);\n    yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dir);\n    yield mkdirp(dir);\n    return dir;\n  });\n\n  return function makeTempDir(_x33) {\n    return _ref33.apply(this, arguments);\n  };\n})();\n\nlet readFirstAvailableStream = exports.readFirstAvailableStream = (() => {\n  var _ref34 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (paths) {\n    for (var _iterator15 = paths, _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) {\n      var _ref35;\n\n      if (_isArray15) {\n        if (_i15 >= _iterator15.length) break;\n        _ref35 = _iterator15[_i15++];\n      } else {\n        _i15 = _iterator15.next();\n        if (_i15.done) break;\n        _ref35 = _i15.value;\n      }\n\n      const path = _ref35;\n\n      try {\n        const fd = yield open(path, 'r');\n        return (_fs || _load_fs()).default.createReadStream(path, { fd });\n      } catch (err) {\n        // Try the next one\n      }\n    }\n    return null;\n  });\n\n  return function readFirstAvailableStream(_x34) {\n    return _ref34.apply(this, arguments);\n  };\n})();\n\nlet getFirstSuitableFolder = exports.getFirstSuitableFolder = (() => {\n  var _ref36 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (paths, mode = constants.W_OK | constants.X_OK) {\n    const result = {\n      skipped: [],\n      folder: null\n    };\n\n    for (var _iterator16 = paths, _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator]();;) {\n      var _ref37;\n\n      if (_isArray16) {\n        if (_i16 >= _iterator16.length) break;\n        _ref37 = _iterator16[_i16++];\n      } else {\n        _i16 = _iterator16.next();\n        if (_i16.done) break;\n        _ref37 = _i16.value;\n      }\n\n      const folder = _ref37;\n\n      try {\n        yield mkdirp(folder);\n        yield access(folder, mode);\n\n        result.folder = folder;\n\n        return result;\n      } catch (error) {\n        result.skipped.push({\n          error,\n          folder\n        });\n      }\n    }\n    return result;\n  });\n\n  return function getFirstSuitableFolder(_x35) {\n    return _ref36.apply(this, arguments);\n  };\n})();\n\nexports.copy = copy;\nexports.readFile = readFile;\nexports.readFileRaw = readFileRaw;\nexports.normalizeOS = normalizeOS;\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireDefault(__webpack_require__(4));\n}\n\nvar _glob;\n\nfunction _load_glob() {\n  return _glob = _interopRequireDefault(__webpack_require__(99));\n}\n\nvar _os;\n\nfunction _load_os() {\n  return _os = _interopRequireDefault(__webpack_require__(42));\n}\n\nvar _path;\n\nfunction _load_path() {\n  return _path = _interopRequireDefault(__webpack_require__(0));\n}\n\nvar _blockingQueue;\n\nfunction _load_blockingQueue() {\n  return _blockingQueue = _interopRequireDefault(__webpack_require__(110));\n}\n\nvar _promise;\n\nfunction _load_promise() {\n  return _promise = _interopRequireWildcard(__webpack_require__(51));\n}\n\nvar _promise2;\n\nfunction _load_promise2() {\n  return _promise2 = __webpack_require__(51);\n}\n\nvar _map;\n\nfunction _load_map() {\n  return _map = _interopRequireDefault(__webpack_require__(30));\n}\n\nvar _fsNormalized;\n\nfunction _load_fsNormalized() {\n  return _fsNormalized = __webpack_require__(216);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst constants = exports.constants = typeof (_fs || _load_fs()).default.constants !== 'undefined' ? (_fs || _load_fs()).default.constants : {\n  R_OK: (_fs || _load_fs()).default.R_OK,\n  W_OK: (_fs || _load_fs()).default.W_OK,\n  X_OK: (_fs || _load_fs()).default.X_OK\n};\n\nconst lockQueue = exports.lockQueue = new (_blockingQueue || _load_blockingQueue()).default('fs lock');\n\nconst readFileBuffer = exports.readFileBuffer = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readFile);\nconst open = exports.open = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.open);\nconst writeFile = exports.writeFile = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.writeFile);\nconst readlink = exports.readlink = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readlink);\nconst realpath = exports.realpath = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.realpath);\nconst readdir = exports.readdir = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readdir);\nconst rename = exports.rename = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.rename);\nconst access = exports.access = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.access);\nconst stat = exports.stat = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.stat);\nconst mkdirp = exports.mkdirp = (0, (_promise2 || _load_promise2()).promisify)(__webpack_require__(146));\nconst exists = exports.exists = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.exists, true);\nconst lstat = exports.lstat = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.lstat);\nconst chmod = exports.chmod = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.chmod);\nconst link = exports.link = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.link);\nconst glob = exports.glob = (0, (_promise2 || _load_promise2()).promisify)((_glob || _load_glob()).default);\nexports.unlink = (_fsNormalized || _load_fsNormalized()).unlink;\n\n// fs.copyFile uses the native file copying instructions on the system, performing much better\n// than any JS-based solution and consumes fewer resources. Repeated testing to fine tune the\n// concurrency level revealed 128 as the sweet spot on a quad-core, 16 CPU Intel system with SSD.\n\nconst CONCURRENT_QUEUE_ITEMS = (_fs || _load_fs()).default.copyFile ? 128 : 4;\n\nconst fsSymlink = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.symlink);\nconst invariant = __webpack_require__(9);\nconst stripBOM = __webpack_require__(161);\n\nconst noop = () => {};\n\nfunction copy(src, dest, reporter) {\n  return copyBulk([{ src, dest }], reporter);\n}\n\nfunction _readFile(loc, encoding) {\n  return new Promise((resolve, reject) => {\n    (_fs || _load_fs()).default.readFile(loc, encoding, function (err, content) {\n      if (err) {\n        reject(err);\n      } else {\n        resolve(content);\n      }\n    });\n  });\n}\n\nfunction readFile(loc) {\n  return _readFile(loc, 'utf8').then(normalizeOS);\n}\n\nfunction readFileRaw(loc) {\n  return _readFile(loc, 'binary');\n}\n\nfunction normalizeOS(body) {\n  return body.replace(/\\r\\n/g, '\\n');\n}\n\nconst cr = '\\r'.charCodeAt(0);\nconst lf = '\\n'.charCodeAt(0);\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nclass MessageError extends Error {\n  constructor(msg, code) {\n    super(msg);\n    this.code = code;\n  }\n\n}\n\nexports.MessageError = MessageError;\nclass ProcessSpawnError extends MessageError {\n  constructor(msg, code, process) {\n    super(msg, code);\n    this.process = process;\n  }\n\n}\n\nexports.ProcessSpawnError = ProcessSpawnError;\nclass SecurityError extends MessageError {}\n\nexports.SecurityError = SecurityError;\nclass ProcessTermError extends MessageError {}\n\nexports.ProcessTermError = ProcessTermError;\nclass ResponseError extends Error {\n  constructor(msg, responseCode) {\n    super(msg);\n    this.responseCode = responseCode;\n  }\n\n}\n\nexports.ResponseError = ResponseError;\nclass OneTimePasswordError extends Error {\n  constructor(notice) {\n    super();\n    this.notice = notice;\n  }\n\n}\nexports.OneTimePasswordError = OneTimePasswordError;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Subscriber; });\n/* unused harmony export SafeSubscriber */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isFunction__ = __webpack_require__(155);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Observer__ = __webpack_require__(420);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscription__ = __webpack_require__(25);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__internal_symbol_rxSubscriber__ = __webpack_require__(322);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__config__ = __webpack_require__(186);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__ = __webpack_require__(324);\n/** PURE_IMPORTS_START tslib,_util_isFunction,_Observer,_Subscription,_internal_symbol_rxSubscriber,_config,_util_hostReportError PURE_IMPORTS_END */\n\n\n\n\n\n\n\nvar Subscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](Subscriber, _super);\n    function Subscriber(destinationOrNext, error, complete) {\n        var _this = _super.call(this) || this;\n        _this.syncErrorValue = null;\n        _this.syncErrorThrown = false;\n        _this.syncErrorThrowable = false;\n        _this.isStopped = false;\n        _this._parentSubscription = null;\n        switch (arguments.length) {\n            case 0:\n                _this.destination = __WEBPACK_IMPORTED_MODULE_2__Observer__[\"a\" /* empty */];\n                break;\n            case 1:\n                if (!destinationOrNext) {\n                    _this.destination = __WEBPACK_IMPORTED_MODULE_2__Observer__[\"a\" /* empty */];\n                    break;\n                }\n                if (typeof destinationOrNext === 'object') {\n                    if (destinationOrNext instanceof Subscriber) {\n                        _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;\n                        _this.destination = destinationOrNext;\n                        destinationOrNext.add(_this);\n                    }\n                    else {\n                        _this.syncErrorThrowable = true;\n                        _this.destination = new SafeSubscriber(_this, destinationOrNext);\n                    }\n                    break;\n                }\n            default:\n                _this.syncErrorThrowable = true;\n                _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete);\n                break;\n        }\n        return _this;\n    }\n    Subscriber.prototype[__WEBPACK_IMPORTED_MODULE_4__internal_symbol_rxSubscriber__[\"a\" /* rxSubscriber */]] = function () { return this; };\n    Subscriber.create = function (next, error, complete) {\n        var subscriber = new Subscriber(next, error, complete);\n        subscriber.syncErrorThrowable = false;\n        return subscriber;\n    };\n    Subscriber.prototype.next = function (value) {\n        if (!this.isStopped) {\n            this._next(value);\n        }\n    };\n    Subscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            this.isStopped = true;\n            this._error(err);\n        }\n    };\n    Subscriber.prototype.complete = function () {\n        if (!this.isStopped) {\n            this.isStopped = true;\n            this._complete();\n        }\n    };\n    Subscriber.prototype.unsubscribe = function () {\n        if (this.closed) {\n            return;\n        }\n        this.isStopped = true;\n        _super.prototype.unsubscribe.call(this);\n    };\n    Subscriber.prototype._next = function (value) {\n        this.destination.next(value);\n    };\n    Subscriber.prototype._error = function (err) {\n        this.destination.error(err);\n        this.unsubscribe();\n    };\n    Subscriber.prototype._complete = function () {\n        this.destination.complete();\n        this.unsubscribe();\n    };\n    Subscriber.prototype._unsubscribeAndRecycle = function () {\n        var _a = this, _parent = _a._parent, _parents = _a._parents;\n        this._parent = null;\n        this._parents = null;\n        this.unsubscribe();\n        this.closed = false;\n        this.isStopped = false;\n        this._parent = _parent;\n        this._parents = _parents;\n        this._parentSubscription = null;\n        return this;\n    };\n    return Subscriber;\n}(__WEBPACK_IMPORTED_MODULE_3__Subscription__[\"a\" /* Subscription */]));\n\nvar SafeSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SafeSubscriber, _super);\n    function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) {\n        var _this = _super.call(this) || this;\n        _this._parentSubscriber = _parentSubscriber;\n        var next;\n        var context = _this;\n        if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isFunction__[\"a\" /* isFunction */])(observerOrNext)) {\n            next = observerOrNext;\n        }\n        else if (observerOrNext) {\n            next = observerOrNext.next;\n            error = observerOrNext.error;\n            complete = observerOrNext.complete;\n            if (observerOrNext !== __WEBPACK_IMPORTED_MODULE_2__Observer__[\"a\" /* empty */]) {\n                context = Object.create(observerOrNext);\n                if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isFunction__[\"a\" /* isFunction */])(context.unsubscribe)) {\n                    _this.add(context.unsubscribe.bind(context));\n                }\n                context.unsubscribe = _this.unsubscribe.bind(_this);\n            }\n        }\n        _this._context = context;\n        _this._next = next;\n        _this._error = error;\n        _this._complete = complete;\n        return _this;\n    }\n    SafeSubscriber.prototype.next = function (value) {\n        if (!this.isStopped && this._next) {\n            var _parentSubscriber = this._parentSubscriber;\n            if (!__WEBPACK_IMPORTED_MODULE_5__config__[\"a\" /* config */].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {\n                this.__tryOrUnsub(this._next, value);\n            }\n            else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {\n                this.unsubscribe();\n            }\n        }\n    };\n    SafeSubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var _parentSubscriber = this._parentSubscriber;\n            var useDeprecatedSynchronousErrorHandling = __WEBPACK_IMPORTED_MODULE_5__config__[\"a\" /* config */].useDeprecatedSynchronousErrorHandling;\n            if (this._error) {\n                if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {\n                    this.__tryOrUnsub(this._error, err);\n                    this.unsubscribe();\n                }\n                else {\n                    this.__tryOrSetError(_parentSubscriber, this._error, err);\n                    this.unsubscribe();\n                }\n            }\n            else if (!_parentSubscriber.syncErrorThrowable) {\n                this.unsubscribe();\n                if (useDeprecatedSynchronousErrorHandling) {\n                    throw err;\n                }\n                __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_hostReportError__[\"a\" /* hostReportError */])(err);\n            }\n            else {\n                if (useDeprecatedSynchronousErrorHandling) {\n                    _parentSubscriber.syncErrorValue = err;\n                    _parentSubscriber.syncErrorThrown = true;\n                }\n                else {\n                    __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_hostReportError__[\"a\" /* hostReportError */])(err);\n                }\n                this.unsubscribe();\n            }\n        }\n    };\n    SafeSubscriber.prototype.complete = function () {\n        var _this = this;\n        if (!this.isStopped) {\n            var _parentSubscriber = this._parentSubscriber;\n            if (this._complete) {\n                var wrappedComplete = function () { return _this._complete.call(_this._context); };\n                if (!__WEBPACK_IMPORTED_MODULE_5__config__[\"a\" /* config */].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {\n                    this.__tryOrUnsub(wrappedComplete);\n                    this.unsubscribe();\n                }\n                else {\n                    this.__tryOrSetError(_parentSubscriber, wrappedComplete);\n                    this.unsubscribe();\n                }\n            }\n            else {\n                this.unsubscribe();\n            }\n        }\n    };\n    SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {\n        try {\n            fn.call(this._context, value);\n        }\n        catch (err) {\n            this.unsubscribe();\n            if (__WEBPACK_IMPORTED_MODULE_5__config__[\"a\" /* config */].useDeprecatedSynchronousErrorHandling) {\n                throw err;\n            }\n            else {\n                __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_hostReportError__[\"a\" /* hostReportError */])(err);\n            }\n        }\n    };\n    SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {\n        if (!__WEBPACK_IMPORTED_MODULE_5__config__[\"a\" /* config */].useDeprecatedSynchronousErrorHandling) {\n            throw new Error('bad call');\n        }\n        try {\n            fn.call(this._context, value);\n        }\n        catch (err) {\n            if (__WEBPACK_IMPORTED_MODULE_5__config__[\"a\" /* config */].useDeprecatedSynchronousErrorHandling) {\n                parent.syncErrorValue = err;\n                parent.syncErrorThrown = true;\n                return true;\n            }\n            else {\n                __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_hostReportError__[\"a\" /* hostReportError */])(err);\n                return true;\n            }\n        }\n        return false;\n    };\n    SafeSubscriber.prototype._unsubscribe = function () {\n        var _parentSubscriber = this._parentSubscriber;\n        this._context = null;\n        this._parentSubscriber = null;\n        _parentSubscriber.unsubscribe();\n    };\n    return SafeSubscriber;\n}(Subscriber));\n\n//# sourceMappingURL=Subscriber.js.map\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getPathKey = getPathKey;\nconst os = __webpack_require__(42);\nconst path = __webpack_require__(0);\nconst userHome = __webpack_require__(67).default;\n\nvar _require = __webpack_require__(222);\n\nconst getCacheDir = _require.getCacheDir,\n      getConfigDir = _require.getConfigDir,\n      getDataDir = _require.getDataDir;\n\nconst isWebpackBundle = __webpack_require__(278);\n\nconst DEPENDENCY_TYPES = exports.DEPENDENCY_TYPES = ['devDependencies', 'dependencies', 'optionalDependencies', 'peerDependencies'];\nconst OWNED_DEPENDENCY_TYPES = exports.OWNED_DEPENDENCY_TYPES = ['devDependencies', 'dependencies', 'optionalDependencies'];\n\nconst RESOLUTIONS = exports.RESOLUTIONS = 'resolutions';\nconst MANIFEST_FIELDS = exports.MANIFEST_FIELDS = [RESOLUTIONS, ...DEPENDENCY_TYPES];\n\nconst SUPPORTED_NODE_VERSIONS = exports.SUPPORTED_NODE_VERSIONS = '^4.8.0 || ^5.7.0 || ^6.2.2 || >=8.0.0';\n\nconst YARN_REGISTRY = exports.YARN_REGISTRY = 'https://registry.yarnpkg.com';\nconst NPM_REGISTRY_RE = exports.NPM_REGISTRY_RE = /https?:\\/\\/registry\\.npmjs\\.org/g;\n\nconst YARN_DOCS = exports.YARN_DOCS = 'https://yarnpkg.com/en/docs/cli/';\nconst YARN_INSTALLER_SH = exports.YARN_INSTALLER_SH = 'https://yarnpkg.com/install.sh';\nconst YARN_INSTALLER_MSI = exports.YARN_INSTALLER_MSI = 'https://yarnpkg.com/latest.msi';\n\nconst SELF_UPDATE_VERSION_URL = exports.SELF_UPDATE_VERSION_URL = 'https://yarnpkg.com/latest-version';\n\n// cache version, bump whenever we make backwards incompatible changes\nconst CACHE_VERSION = exports.CACHE_VERSION = 6;\n\n// lockfile version, bump whenever we make backwards incompatible changes\nconst LOCKFILE_VERSION = exports.LOCKFILE_VERSION = 1;\n\n// max amount of network requests to perform concurrently\nconst NETWORK_CONCURRENCY = exports.NETWORK_CONCURRENCY = 8;\n\n// HTTP timeout used when downloading packages\nconst NETWORK_TIMEOUT = exports.NETWORK_TIMEOUT = 30 * 1000; // in milliseconds\n\n// max amount of child processes to execute concurrently\nconst CHILD_CONCURRENCY = exports.CHILD_CONCURRENCY = 5;\n\nconst REQUIRED_PACKAGE_KEYS = exports.REQUIRED_PACKAGE_KEYS = ['name', 'version', '_uid'];\n\nfunction getPreferredCacheDirectories() {\n  const preferredCacheDirectories = [getCacheDir()];\n\n  if (process.getuid) {\n    // $FlowFixMe: process.getuid exists, dammit\n    preferredCacheDirectories.push(path.join(os.tmpdir(), `.yarn-cache-${process.getuid()}`));\n  }\n\n  preferredCacheDirectories.push(path.join(os.tmpdir(), `.yarn-cache`));\n\n  return preferredCacheDirectories;\n}\n\nconst PREFERRED_MODULE_CACHE_DIRECTORIES = exports.PREFERRED_MODULE_CACHE_DIRECTORIES = getPreferredCacheDirectories();\nconst CONFIG_DIRECTORY = exports.CONFIG_DIRECTORY = getConfigDir();\nconst DATA_DIRECTORY = exports.DATA_DIRECTORY = getDataDir();\nconst LINK_REGISTRY_DIRECTORY = exports.LINK_REGISTRY_DIRECTORY = path.join(DATA_DIRECTORY, 'link');\nconst GLOBAL_MODULE_DIRECTORY = exports.GLOBAL_MODULE_DIRECTORY = path.join(DATA_DIRECTORY, 'global');\n\nconst NODE_BIN_PATH = exports.NODE_BIN_PATH = process.execPath;\nconst YARN_BIN_PATH = exports.YARN_BIN_PATH = getYarnBinPath();\n\n// Webpack needs to be configured with node.__dirname/__filename = false\nfunction getYarnBinPath() {\n  if (isWebpackBundle) {\n    return __filename;\n  } else {\n    return path.join(__dirname, '..', 'bin', 'yarn.js');\n  }\n}\n\nconst NODE_MODULES_FOLDER = exports.NODE_MODULES_FOLDER = 'node_modules';\nconst NODE_PACKAGE_JSON = exports.NODE_PACKAGE_JSON = 'package.json';\n\nconst PNP_FILENAME = exports.PNP_FILENAME = '.pnp.js';\n\nconst POSIX_GLOBAL_PREFIX = exports.POSIX_GLOBAL_PREFIX = `${process.env.DESTDIR || ''}/usr/local`;\nconst FALLBACK_GLOBAL_PREFIX = exports.FALLBACK_GLOBAL_PREFIX = path.join(userHome, '.yarn');\n\nconst META_FOLDER = exports.META_FOLDER = '.yarn-meta';\nconst INTEGRITY_FILENAME = exports.INTEGRITY_FILENAME = '.yarn-integrity';\nconst LOCKFILE_FILENAME = exports.LOCKFILE_FILENAME = 'yarn.lock';\nconst METADATA_FILENAME = exports.METADATA_FILENAME = '.yarn-metadata.json';\nconst TARBALL_FILENAME = exports.TARBALL_FILENAME = '.yarn-tarball.tgz';\nconst CLEAN_FILENAME = exports.CLEAN_FILENAME = '.yarnclean';\n\nconst NPM_LOCK_FILENAME = exports.NPM_LOCK_FILENAME = 'package-lock.json';\nconst NPM_SHRINKWRAP_FILENAME = exports.NPM_SHRINKWRAP_FILENAME = 'npm-shrinkwrap.json';\n\nconst DEFAULT_INDENT = exports.DEFAULT_INDENT = '  ';\nconst SINGLE_INSTANCE_PORT = exports.SINGLE_INSTANCE_PORT = 31997;\nconst SINGLE_INSTANCE_FILENAME = exports.SINGLE_INSTANCE_FILENAME = '.yarn-single-instance';\n\nconst ENV_PATH_KEY = exports.ENV_PATH_KEY = getPathKey(process.platform, process.env);\n\nfunction getPathKey(platform, env) {\n  let pathKey = 'PATH';\n\n  // windows calls its path \"Path\" usually, but this is not guaranteed.\n  if (platform === 'win32') {\n    pathKey = 'Path';\n\n    for (const key in env) {\n      if (key.toLowerCase() === 'path') {\n        pathKey = key;\n      }\n    }\n  }\n\n  return pathKey;\n}\n\nconst VERSION_COLOR_SCHEME = exports.VERSION_COLOR_SCHEME = {\n  major: 'red',\n  premajor: 'red',\n  minor: 'yellow',\n  preminor: 'yellow',\n  patch: 'green',\n  prepatch: 'green',\n  prerelease: 'red',\n  unchanged: 'white',\n  unknown: 'red'\n};\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar NODE_ENV = process.env.NODE_ENV;\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n  if (NODE_ENV !== 'production') {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  }\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error(\n        'Minified exception occurred; use the non-minified dev environment ' +\n        'for the full error message and additional helpful warnings.'\n      );\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(\n        format.replace(/%s/g, function() { return args[argIndex++]; })\n      );\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n};\n\nmodule.exports = invariant;\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar YAMLException = __webpack_require__(55);\n\nvar TYPE_CONSTRUCTOR_OPTIONS = [\n  'kind',\n  'resolve',\n  'construct',\n  'instanceOf',\n  'predicate',\n  'represent',\n  'defaultStyle',\n  'styleAliases'\n];\n\nvar YAML_NODE_KINDS = [\n  'scalar',\n  'sequence',\n  'mapping'\n];\n\nfunction compileStyleAliases(map) {\n  var result = {};\n\n  if (map !== null) {\n    Object.keys(map).forEach(function (style) {\n      map[style].forEach(function (alias) {\n        result[String(alias)] = style;\n      });\n    });\n  }\n\n  return result;\n}\n\nfunction Type(tag, options) {\n  options = options || {};\n\n  Object.keys(options).forEach(function (name) {\n    if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) {\n      throw new YAMLException('Unknown option \"' + name + '\" is met in definition of \"' + tag + '\" YAML type.');\n    }\n  });\n\n  // TODO: Add tag format check.\n  this.tag          = tag;\n  this.kind         = options['kind']         || null;\n  this.resolve      = options['resolve']      || function () { return true; };\n  this.construct    = options['construct']    || function (data) { return data; };\n  this.instanceOf   = options['instanceOf']   || null;\n  this.predicate    = options['predicate']    || null;\n  this.represent    = options['represent']    || null;\n  this.defaultStyle = options['defaultStyle'] || null;\n  this.styleAliases = compileStyleAliases(options['styleAliases'] || null);\n\n  if (YAML_NODE_KINDS.indexOf(this.kind) === -1) {\n    throw new YAMLException('Unknown kind \"' + this.kind + '\" is specified for \"' + tag + '\" YAML type.');\n  }\n}\n\nmodule.exports = Type;\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"crypto\");\n\n/***/ }),\n/* 12 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Observable; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_canReportError__ = __webpack_require__(323);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_toSubscriber__ = __webpack_require__(932);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__internal_symbol_observable__ = __webpack_require__(118);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_pipe__ = __webpack_require__(325);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__config__ = __webpack_require__(186);\n/** PURE_IMPORTS_START _util_canReportError,_util_toSubscriber,_internal_symbol_observable,_util_pipe,_config PURE_IMPORTS_END */\n\n\n\n\n\nvar Observable = /*@__PURE__*/ (function () {\n    function Observable(subscribe) {\n        this._isScalar = false;\n        if (subscribe) {\n            this._subscribe = subscribe;\n        }\n    }\n    Observable.prototype.lift = function (operator) {\n        var observable = new Observable();\n        observable.source = this;\n        observable.operator = operator;\n        return observable;\n    };\n    Observable.prototype.subscribe = function (observerOrNext, error, complete) {\n        var operator = this.operator;\n        var sink = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_toSubscriber__[\"a\" /* toSubscriber */])(observerOrNext, error, complete);\n        if (operator) {\n            operator.call(sink, this.source);\n        }\n        else {\n            sink.add(this.source || (__WEBPACK_IMPORTED_MODULE_4__config__[\"a\" /* config */].useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?\n                this._subscribe(sink) :\n                this._trySubscribe(sink));\n        }\n        if (__WEBPACK_IMPORTED_MODULE_4__config__[\"a\" /* config */].useDeprecatedSynchronousErrorHandling) {\n            if (sink.syncErrorThrowable) {\n                sink.syncErrorThrowable = false;\n                if (sink.syncErrorThrown) {\n                    throw sink.syncErrorValue;\n                }\n            }\n        }\n        return sink;\n    };\n    Observable.prototype._trySubscribe = function (sink) {\n        try {\n            return this._subscribe(sink);\n        }\n        catch (err) {\n            if (__WEBPACK_IMPORTED_MODULE_4__config__[\"a\" /* config */].useDeprecatedSynchronousErrorHandling) {\n                sink.syncErrorThrown = true;\n                sink.syncErrorValue = err;\n            }\n            if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__util_canReportError__[\"a\" /* canReportError */])(sink)) {\n                sink.error(err);\n            }\n            else {\n                console.warn(err);\n            }\n        }\n    };\n    Observable.prototype.forEach = function (next, promiseCtor) {\n        var _this = this;\n        promiseCtor = getPromiseCtor(promiseCtor);\n        return new promiseCtor(function (resolve, reject) {\n            var subscription;\n            subscription = _this.subscribe(function (value) {\n                try {\n                    next(value);\n                }\n                catch (err) {\n                    reject(err);\n                    if (subscription) {\n                        subscription.unsubscribe();\n                    }\n                }\n            }, reject, resolve);\n        });\n    };\n    Observable.prototype._subscribe = function (subscriber) {\n        var source = this.source;\n        return source && source.subscribe(subscriber);\n    };\n    Observable.prototype[__WEBPACK_IMPORTED_MODULE_2__internal_symbol_observable__[\"a\" /* observable */]] = function () {\n        return this;\n    };\n    Observable.prototype.pipe = function () {\n        var operations = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            operations[_i] = arguments[_i];\n        }\n        if (operations.length === 0) {\n            return this;\n        }\n        return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_pipe__[\"b\" /* pipeFromArray */])(operations)(this);\n    };\n    Observable.prototype.toPromise = function (promiseCtor) {\n        var _this = this;\n        promiseCtor = getPromiseCtor(promiseCtor);\n        return new promiseCtor(function (resolve, reject) {\n            var value;\n            _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });\n        });\n    };\n    Observable.create = function (subscribe) {\n        return new Observable(subscribe);\n    };\n    return Observable;\n}());\n\nfunction getPromiseCtor(promiseCtor) {\n    if (!promiseCtor) {\n        promiseCtor = __WEBPACK_IMPORTED_MODULE_4__config__[\"a\" /* config */].Promise || Promise;\n    }\n    if (!promiseCtor) {\n        throw new Error('no Promise impl found');\n    }\n    return promiseCtor;\n}\n//# sourceMappingURL=Observable.js.map\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return OuterSubscriber; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nvar OuterSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](OuterSubscriber, _super);\n    function OuterSubscriber() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.destination.next(innerValue);\n    };\n    OuterSubscriber.prototype.notifyError = function (error, innerSub) {\n        this.destination.error(error);\n    };\n    OuterSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.destination.complete();\n    };\n    return OuterSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n\n//# sourceMappingURL=OuterSubscriber.js.map\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = subscribeToResult;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__InnerSubscriber__ = __webpack_require__(84);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__subscribeTo__ = __webpack_require__(446);\n/** PURE_IMPORTS_START _InnerSubscriber,_subscribeTo PURE_IMPORTS_END */\n\n\nfunction subscribeToResult(outerSubscriber, result, outerValue, outerIndex, destination) {\n    if (destination === void 0) {\n        destination = new __WEBPACK_IMPORTED_MODULE_0__InnerSubscriber__[\"a\" /* InnerSubscriber */](outerSubscriber, outerValue, outerIndex);\n    }\n    if (destination.closed) {\n        return;\n    }\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__subscribeTo__[\"a\" /* subscribeTo */])(result)(destination);\n}\n//# sourceMappingURL=subscribeToResult.js.map\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* eslint-disable node/no-deprecated-api */\n\n\n\nvar buffer = __webpack_require__(64)\nvar Buffer = buffer.Buffer\n\nvar safer = {}\n\nvar key\n\nfor (key in buffer) {\n  if (!buffer.hasOwnProperty(key)) continue\n  if (key === 'SlowBuffer' || key === 'Buffer') continue\n  safer[key] = buffer[key]\n}\n\nvar Safer = safer.Buffer = {}\nfor (key in Buffer) {\n  if (!Buffer.hasOwnProperty(key)) continue\n  if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue\n  Safer[key] = Buffer[key]\n}\n\nsafer.Buffer.prototype = Buffer.prototype\n\nif (!Safer.from || Safer.from === Uint8Array.from) {\n  Safer.from = function (value, encodingOrOffset, length) {\n    if (typeof value === 'number') {\n      throw new TypeError('The \"value\" argument must not be of type number. Received type ' + typeof value)\n    }\n    if (value && typeof value.length === 'undefined') {\n      throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value)\n    }\n    return Buffer(value, encodingOrOffset, length)\n  }\n}\n\nif (!Safer.alloc) {\n  Safer.alloc = function (size, fill, encoding) {\n    if (typeof size !== 'number') {\n      throw new TypeError('The \"size\" argument must be of type number. Received type ' + typeof size)\n    }\n    if (size < 0 || size >= 2 * (1 << 30)) {\n      throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n    }\n    var buf = Buffer(size)\n    if (!fill || fill.length === 0) {\n      buf.fill(0)\n    } else if (typeof encoding === 'string') {\n      buf.fill(fill, encoding)\n    } else {\n      buf.fill(fill)\n    }\n    return buf\n  }\n}\n\nif (!safer.kStringMaxLength) {\n  try {\n    safer.kStringMaxLength = process.binding('buffer').kStringMaxLength\n  } catch (e) {\n    // we can't determine kStringMaxLength in environments where process.binding\n    // is unsupported, so let's not set it\n  }\n}\n\nif (!safer.constants) {\n  safer.constants = {\n    MAX_LENGTH: safer.kMaxLength\n  }\n  if (safer.kStringMaxLength) {\n    safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength\n  }\n}\n\nmodule.exports = safer\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright (c) 2012, Mark Cavage. All rights reserved.\n// Copyright 2015 Joyent, Inc.\n\nvar assert = __webpack_require__(29);\nvar Stream = __webpack_require__(23).Stream;\nvar util = __webpack_require__(3);\n\n\n///--- Globals\n\n/* JSSTYLED */\nvar UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/;\n\n\n///--- Internal\n\nfunction _capitalize(str) {\n    return (str.charAt(0).toUpperCase() + str.slice(1));\n}\n\nfunction _toss(name, expected, oper, arg, actual) {\n    throw new assert.AssertionError({\n        message: util.format('%s (%s) is required', name, expected),\n        actual: (actual === undefined) ? typeof (arg) : actual(arg),\n        expected: expected,\n        operator: oper || '===',\n        stackStartFunction: _toss.caller\n    });\n}\n\nfunction _getClass(arg) {\n    return (Object.prototype.toString.call(arg).slice(8, -1));\n}\n\nfunction noop() {\n    // Why even bother with asserts?\n}\n\n\n///--- Exports\n\nvar types = {\n    bool: {\n        check: function (arg) { return typeof (arg) === 'boolean'; }\n    },\n    func: {\n        check: function (arg) { return typeof (arg) === 'function'; }\n    },\n    string: {\n        check: function (arg) { return typeof (arg) === 'string'; }\n    },\n    object: {\n        check: function (arg) {\n            return typeof (arg) === 'object' && arg !== null;\n        }\n    },\n    number: {\n        check: function (arg) {\n            return typeof (arg) === 'number' && !isNaN(arg);\n        }\n    },\n    finite: {\n        check: function (arg) {\n            return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg);\n        }\n    },\n    buffer: {\n        check: function (arg) { return Buffer.isBuffer(arg); },\n        operator: 'Buffer.isBuffer'\n    },\n    array: {\n        check: function (arg) { return Array.isArray(arg); },\n        operator: 'Array.isArray'\n    },\n    stream: {\n        check: function (arg) { return arg instanceof Stream; },\n        operator: 'instanceof',\n        actual: _getClass\n    },\n    date: {\n        check: function (arg) { return arg instanceof Date; },\n        operator: 'instanceof',\n        actual: _getClass\n    },\n    regexp: {\n        check: function (arg) { return arg instanceof RegExp; },\n        operator: 'instanceof',\n        actual: _getClass\n    },\n    uuid: {\n        check: function (arg) {\n            return typeof (arg) === 'string' && UUID_REGEXP.test(arg);\n        },\n        operator: 'isUUID'\n    }\n};\n\nfunction _setExports(ndebug) {\n    var keys = Object.keys(types);\n    var out;\n\n    /* re-export standard assert */\n    if (process.env.NODE_NDEBUG) {\n        out = noop;\n    } else {\n        out = function (arg, msg) {\n            if (!arg) {\n                _toss(msg, 'true', arg);\n            }\n        };\n    }\n\n    /* standard checks */\n    keys.forEach(function (k) {\n        if (ndebug) {\n            out[k] = noop;\n            return;\n        }\n        var type = types[k];\n        out[k] = function (arg, msg) {\n            if (!type.check(arg)) {\n                _toss(msg, k, type.operator, arg, type.actual);\n            }\n        };\n    });\n\n    /* optional checks */\n    keys.forEach(function (k) {\n        var name = 'optional' + _capitalize(k);\n        if (ndebug) {\n            out[name] = noop;\n            return;\n        }\n        var type = types[k];\n        out[name] = function (arg, msg) {\n            if (arg === undefined || arg === null) {\n                return;\n            }\n            if (!type.check(arg)) {\n                _toss(msg, k, type.operator, arg, type.actual);\n            }\n        };\n    });\n\n    /* arrayOf checks */\n    keys.forEach(function (k) {\n        var name = 'arrayOf' + _capitalize(k);\n        if (ndebug) {\n            out[name] = noop;\n            return;\n        }\n        var type = types[k];\n        var expected = '[' + k + ']';\n        out[name] = function (arg, msg) {\n            if (!Array.isArray(arg)) {\n                _toss(msg, expected, type.operator, arg, type.actual);\n            }\n            var i;\n            for (i = 0; i < arg.length; i++) {\n                if (!type.check(arg[i])) {\n                    _toss(msg, expected, type.operator, arg, type.actual);\n                }\n            }\n        };\n    });\n\n    /* optionalArrayOf checks */\n    keys.forEach(function (k) {\n        var name = 'optionalArrayOf' + _capitalize(k);\n        if (ndebug) {\n            out[name] = noop;\n            return;\n        }\n        var type = types[k];\n        var expected = '[' + k + ']';\n        out[name] = function (arg, msg) {\n            if (arg === undefined || arg === null) {\n                return;\n            }\n            if (!Array.isArray(arg)) {\n                _toss(msg, expected, type.operator, arg, type.actual);\n            }\n            var i;\n            for (i = 0; i < arg.length; i++) {\n                if (!type.check(arg[i])) {\n                    _toss(msg, expected, type.operator, arg, type.actual);\n                }\n            }\n        };\n    });\n\n    /* re-export built-in assertions */\n    Object.keys(assert).forEach(function (k) {\n        if (k === 'AssertionError') {\n            out[k] = assert[k];\n            return;\n        }\n        if (ndebug) {\n            out[k] = noop;\n            return;\n        }\n        out[k] = assert[k];\n    });\n\n    /* export ourselves (for unit tests _only_) */\n    out._setExports = _setExports;\n\n    return out;\n}\n\nmodule.exports = _setExports(process.env.NODE_NDEBUG);\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports) {\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self\n  // eslint-disable-next-line no-new-func\n  : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sortAlpha = sortAlpha;\nexports.sortOptionsByFlags = sortOptionsByFlags;\nexports.entries = entries;\nexports.removePrefix = removePrefix;\nexports.removeSuffix = removeSuffix;\nexports.addSuffix = addSuffix;\nexports.hyphenate = hyphenate;\nexports.camelCase = camelCase;\nexports.compareSortedArrays = compareSortedArrays;\nexports.sleep = sleep;\nconst _camelCase = __webpack_require__(227);\n\nfunction sortAlpha(a, b) {\n  // sort alphabetically in a deterministic way\n  const shortLen = Math.min(a.length, b.length);\n  for (let i = 0; i < shortLen; i++) {\n    const aChar = a.charCodeAt(i);\n    const bChar = b.charCodeAt(i);\n    if (aChar !== bChar) {\n      return aChar - bChar;\n    }\n  }\n  return a.length - b.length;\n}\n\nfunction sortOptionsByFlags(a, b) {\n  const aOpt = a.flags.replace(/-/g, '');\n  const bOpt = b.flags.replace(/-/g, '');\n  return sortAlpha(aOpt, bOpt);\n}\n\nfunction entries(obj) {\n  const entries = [];\n  if (obj) {\n    for (const key in obj) {\n      entries.push([key, obj[key]]);\n    }\n  }\n  return entries;\n}\n\nfunction removePrefix(pattern, prefix) {\n  if (pattern.startsWith(prefix)) {\n    pattern = pattern.slice(prefix.length);\n  }\n\n  return pattern;\n}\n\nfunction removeSuffix(pattern, suffix) {\n  if (pattern.endsWith(suffix)) {\n    return pattern.slice(0, -suffix.length);\n  }\n\n  return pattern;\n}\n\nfunction addSuffix(pattern, suffix) {\n  if (!pattern.endsWith(suffix)) {\n    return pattern + suffix;\n  }\n\n  return pattern;\n}\n\nfunction hyphenate(str) {\n  return str.replace(/[A-Z]/g, match => {\n    return '-' + match.charAt(0).toLowerCase();\n  });\n}\n\nfunction camelCase(str) {\n  if (/[A-Z]/.test(str)) {\n    return null;\n  } else {\n    return _camelCase(str);\n  }\n}\n\nfunction compareSortedArrays(array1, array2) {\n  if (array1.length !== array2.length) {\n    return false;\n  }\n  for (let i = 0, len = array1.length; i < len; i++) {\n    if (array1[i] !== array2[i]) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction sleep(ms) {\n  return new Promise(resolve => {\n    setTimeout(resolve, ms);\n  });\n}\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.stringify = exports.parse = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _parse;\n\nfunction _load_parse() {\n  return _parse = __webpack_require__(106);\n}\n\nObject.defineProperty(exports, 'parse', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_parse || _load_parse()).default;\n  }\n});\n\nvar _stringify;\n\nfunction _load_stringify() {\n  return _stringify = __webpack_require__(200);\n}\n\nObject.defineProperty(exports, 'stringify', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_stringify || _load_stringify()).default;\n  }\n});\nexports.implodeEntry = implodeEntry;\nexports.explodeEntry = explodeEntry;\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nvar _normalizePattern;\n\nfunction _load_normalizePattern() {\n  return _normalizePattern = __webpack_require__(37);\n}\n\nvar _parse2;\n\nfunction _load_parse2() {\n  return _parse2 = _interopRequireDefault(__webpack_require__(106));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nconst path = __webpack_require__(0);\nconst ssri = __webpack_require__(65);\n\nfunction getName(pattern) {\n  return (0, (_normalizePattern || _load_normalizePattern()).normalizePattern)(pattern).name;\n}\n\nfunction blankObjectUndefined(obj) {\n  return obj && Object.keys(obj).length ? obj : undefined;\n}\n\nfunction keyForRemote(remote) {\n  return remote.resolved || (remote.reference && remote.hash ? `${remote.reference}#${remote.hash}` : null);\n}\n\nfunction serializeIntegrity(integrity) {\n  // We need this because `Integrity.toString()` does not use sorting to ensure a stable string output\n  // See https://git.io/vx2Hy\n  return integrity.toString().split(' ').sort().join(' ');\n}\n\nfunction implodeEntry(pattern, obj) {\n  const inferredName = getName(pattern);\n  const integrity = obj.integrity ? serializeIntegrity(obj.integrity) : '';\n  const imploded = {\n    name: inferredName === obj.name ? undefined : obj.name,\n    version: obj.version,\n    uid: obj.uid === obj.version ? undefined : obj.uid,\n    resolved: obj.resolved,\n    registry: obj.registry === 'npm' ? undefined : obj.registry,\n    dependencies: blankObjectUndefined(obj.dependencies),\n    optionalDependencies: blankObjectUndefined(obj.optionalDependencies),\n    permissions: blankObjectUndefined(obj.permissions),\n    prebuiltVariants: blankObjectUndefined(obj.prebuiltVariants)\n  };\n  if (integrity) {\n    imploded.integrity = integrity;\n  }\n  return imploded;\n}\n\nfunction explodeEntry(pattern, obj) {\n  obj.optionalDependencies = obj.optionalDependencies || {};\n  obj.dependencies = obj.dependencies || {};\n  obj.uid = obj.uid || obj.version;\n  obj.permissions = obj.permissions || {};\n  obj.registry = obj.registry || 'npm';\n  obj.name = obj.name || getName(pattern);\n  const integrity = obj.integrity;\n  if (integrity && integrity.isIntegrity) {\n    obj.integrity = ssri.parse(integrity);\n  }\n  return obj;\n}\n\nclass Lockfile {\n  constructor({ cache, source, parseResultType } = {}) {\n    this.source = source || '';\n    this.cache = cache;\n    this.parseResultType = parseResultType;\n  }\n\n  // source string if the `cache` was parsed\n\n\n  // if true, we're parsing an old yarn file and need to update integrity fields\n  hasEntriesExistWithoutIntegrity() {\n    if (!this.cache) {\n      return false;\n    }\n\n    for (const key in this.cache) {\n      // $FlowFixMe - `this.cache` is clearly defined at this point\n      if (!/^.*@(file:|http)/.test(key) && this.cache[key] && !this.cache[key].integrity) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  static fromDirectory(dir, reporter) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      // read the manifest in this directory\n      const lockfileLoc = path.join(dir, (_constants || _load_constants()).LOCKFILE_FILENAME);\n\n      let lockfile;\n      let rawLockfile = '';\n      let parseResult;\n\n      if (yield (_fs || _load_fs()).exists(lockfileLoc)) {\n        rawLockfile = yield (_fs || _load_fs()).readFile(lockfileLoc);\n        parseResult = (0, (_parse2 || _load_parse2()).default)(rawLockfile, lockfileLoc);\n\n        if (reporter) {\n          if (parseResult.type === 'merge') {\n            reporter.info(reporter.lang('lockfileMerged'));\n          } else if (parseResult.type === 'conflict') {\n            reporter.warn(reporter.lang('lockfileConflict'));\n          }\n        }\n\n        lockfile = parseResult.object;\n      } else if (reporter) {\n        reporter.info(reporter.lang('noLockfileFound'));\n      }\n\n      if (lockfile && lockfile.__metadata) {\n        const lockfilev2 = lockfile;\n        lockfile = {};\n      }\n\n      return new Lockfile({ cache: lockfile, source: rawLockfile, parseResultType: parseResult && parseResult.type });\n    })();\n  }\n\n  getLocked(pattern) {\n    const cache = this.cache;\n    if (!cache) {\n      return undefined;\n    }\n\n    const shrunk = pattern in cache && cache[pattern];\n\n    if (typeof shrunk === 'string') {\n      return this.getLocked(shrunk);\n    } else if (shrunk) {\n      explodeEntry(pattern, shrunk);\n      return shrunk;\n    }\n\n    return undefined;\n  }\n\n  removePattern(pattern) {\n    const cache = this.cache;\n    if (!cache) {\n      return;\n    }\n    delete cache[pattern];\n  }\n\n  getLockfile(patterns) {\n    const lockfile = {};\n    const seen = new Map();\n\n    // order by name so that lockfile manifest is assigned to the first dependency with this manifest\n    // the others that have the same remoteKey will just refer to the first\n    // ordering allows for consistency in lockfile when it is serialized\n    const sortedPatternsKeys = Object.keys(patterns).sort((_misc || _load_misc()).sortAlpha);\n\n    for (var _iterator = sortedPatternsKeys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const pattern = _ref;\n\n      const pkg = patterns[pattern];\n      const remote = pkg._remote,\n            ref = pkg._reference;\n\n      invariant(ref, 'Package is missing a reference');\n      invariant(remote, 'Package is missing a remote');\n\n      const remoteKey = keyForRemote(remote);\n      const pkgName = getName(pattern);\n\n      const seenKey = remoteKey ? `${remoteKey}#${pkgName}` : null;\n      const seenPattern = seenKey ? seen.get(seenKey) : null;\n\n      if (seenPattern) {\n        // no point in duplicating it\n        lockfile[pattern] = seenPattern;\n        continue;\n      }\n\n      const obj = implodeEntry(pattern, {\n        name: pkgName,\n        version: pkg.version,\n        uid: pkg._uid,\n        resolved: remote.resolved,\n        integrity: remote.integrity,\n        registry: remote.registry,\n        dependencies: pkg.dependencies,\n        peerDependencies: pkg.peerDependencies,\n        optionalDependencies: pkg.optionalDependencies,\n        permissions: ref.permissions,\n        prebuiltVariants: pkg.prebuiltVariants\n      });\n\n      lockfile[pattern] = obj;\n\n      if (seenKey) {\n        seen.set(seenKey, obj);\n      }\n    }\n\n    return lockfile;\n  }\n}\nexports.default = Lockfile;\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports.__esModule = true;\n\nvar _assign = __webpack_require__(559);\n\nvar _assign2 = _interopRequireDefault(_assign);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _assign2.default || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n\n    for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n\n  return target;\n};\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar store = __webpack_require__(134)('wks');\nvar uid = __webpack_require__(138);\nvar Symbol = __webpack_require__(17).Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n  return store[name] || (store[name] =\n    USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports) {\n\nexports = module.exports = SemVer;\n\n// The debug function is excluded entirely from the minified version.\n/* nomin */ var debug;\n/* nomin */ if (typeof process === 'object' &&\n    /* nomin */ process.env &&\n    /* nomin */ process.env.NODE_DEBUG &&\n    /* nomin */ /\\bsemver\\b/i.test(process.env.NODE_DEBUG))\n  /* nomin */ debug = function() {\n    /* nomin */ var args = Array.prototype.slice.call(arguments, 0);\n    /* nomin */ args.unshift('SEMVER');\n    /* nomin */ console.log.apply(console, args);\n    /* nomin */ };\n/* nomin */ else\n  /* nomin */ debug = function() {};\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nexports.SEMVER_SPEC_VERSION = '2.0.0';\n\nvar MAX_LENGTH = 256;\nvar MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\n\n// Max safe segment length for coercion.\nvar MAX_SAFE_COMPONENT_LENGTH = 16;\n\n// The actual regexps go on exports.re\nvar re = exports.re = [];\nvar src = exports.src = [];\nvar R = 0;\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\nvar NUMERICIDENTIFIER = R++;\nsrc[NUMERICIDENTIFIER] = '0|[1-9]\\\\d*';\nvar NUMERICIDENTIFIERLOOSE = R++;\nsrc[NUMERICIDENTIFIERLOOSE] = '[0-9]+';\n\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\nvar NONNUMERICIDENTIFIER = R++;\nsrc[NONNUMERICIDENTIFIER] = '\\\\d*[a-zA-Z-][a-zA-Z0-9-]*';\n\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\nvar MAINVERSION = R++;\nsrc[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\\\.' +\n                   '(' + src[NUMERICIDENTIFIER] + ')\\\\.' +\n                   '(' + src[NUMERICIDENTIFIER] + ')';\n\nvar MAINVERSIONLOOSE = R++;\nsrc[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\\\.' +\n                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\\\.' +\n                        '(' + src[NUMERICIDENTIFIERLOOSE] + ')';\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\nvar PRERELEASEIDENTIFIER = R++;\nsrc[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] +\n                            '|' + src[NONNUMERICIDENTIFIER] + ')';\n\nvar PRERELEASEIDENTIFIERLOOSE = R++;\nsrc[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] +\n                                 '|' + src[NONNUMERICIDENTIFIER] + ')';\n\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\nvar PRERELEASE = R++;\nsrc[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] +\n                  '(?:\\\\.' + src[PRERELEASEIDENTIFIER] + ')*))';\n\nvar PRERELEASELOOSE = R++;\nsrc[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] +\n                       '(?:\\\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))';\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\nvar BUILDIDENTIFIER = R++;\nsrc[BUILDIDENTIFIER] = '[0-9A-Za-z-]+';\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\nvar BUILD = R++;\nsrc[BUILD] = '(?:\\\\+(' + src[BUILDIDENTIFIER] +\n             '(?:\\\\.' + src[BUILDIDENTIFIER] + ')*))';\n\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups.  The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\nvar FULL = R++;\nvar FULLPLAIN = 'v?' + src[MAINVERSION] +\n                src[PRERELEASE] + '?' +\n                src[BUILD] + '?';\n\nsrc[FULL] = '^' + FULLPLAIN + '$';\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\nvar LOOSEPLAIN = '[v=\\\\s]*' + src[MAINVERSIONLOOSE] +\n                 src[PRERELEASELOOSE] + '?' +\n                 src[BUILD] + '?';\n\nvar LOOSE = R++;\nsrc[LOOSE] = '^' + LOOSEPLAIN + '$';\n\nvar GTLT = R++;\nsrc[GTLT] = '((?:<|>)?=?)';\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\nvar XRANGEIDENTIFIERLOOSE = R++;\nsrc[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\\\*';\nvar XRANGEIDENTIFIER = R++;\nsrc[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\\\*';\n\nvar XRANGEPLAIN = R++;\nsrc[XRANGEPLAIN] = '[v=\\\\s]*(' + src[XRANGEIDENTIFIER] + ')' +\n                   '(?:\\\\.(' + src[XRANGEIDENTIFIER] + ')' +\n                   '(?:\\\\.(' + src[XRANGEIDENTIFIER] + ')' +\n                   '(?:' + src[PRERELEASE] + ')?' +\n                   src[BUILD] + '?' +\n                   ')?)?';\n\nvar XRANGEPLAINLOOSE = R++;\nsrc[XRANGEPLAINLOOSE] = '[v=\\\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' +\n                        '(?:\\\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +\n                        '(?:\\\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' +\n                        '(?:' + src[PRERELEASELOOSE] + ')?' +\n                        src[BUILD] + '?' +\n                        ')?)?';\n\nvar XRANGE = R++;\nsrc[XRANGE] = '^' + src[GTLT] + '\\\\s*' + src[XRANGEPLAIN] + '$';\nvar XRANGELOOSE = R++;\nsrc[XRANGELOOSE] = '^' + src[GTLT] + '\\\\s*' + src[XRANGEPLAINLOOSE] + '$';\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\nvar COERCE = R++;\nsrc[COERCE] = '(?:^|[^\\\\d])' +\n              '(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +\n              '(?:\\\\.(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +\n              '(?:\\\\.(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +\n              '(?:$|[^\\\\d])';\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\nvar LONETILDE = R++;\nsrc[LONETILDE] = '(?:~>?)';\n\nvar TILDETRIM = R++;\nsrc[TILDETRIM] = '(\\\\s*)' + src[LONETILDE] + '\\\\s+';\nre[TILDETRIM] = new RegExp(src[TILDETRIM], 'g');\nvar tildeTrimReplace = '$1~';\n\nvar TILDE = R++;\nsrc[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$';\nvar TILDELOOSE = R++;\nsrc[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$';\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\nvar LONECARET = R++;\nsrc[LONECARET] = '(?:\\\\^)';\n\nvar CARETTRIM = R++;\nsrc[CARETTRIM] = '(\\\\s*)' + src[LONECARET] + '\\\\s+';\nre[CARETTRIM] = new RegExp(src[CARETTRIM], 'g');\nvar caretTrimReplace = '$1^';\n\nvar CARET = R++;\nsrc[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$';\nvar CARETLOOSE = R++;\nsrc[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$';\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\nvar COMPARATORLOOSE = R++;\nsrc[COMPARATORLOOSE] = '^' + src[GTLT] + '\\\\s*(' + LOOSEPLAIN + ')$|^$';\nvar COMPARATOR = R++;\nsrc[COMPARATOR] = '^' + src[GTLT] + '\\\\s*(' + FULLPLAIN + ')$|^$';\n\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\nvar COMPARATORTRIM = R++;\nsrc[COMPARATORTRIM] = '(\\\\s*)' + src[GTLT] +\n                      '\\\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')';\n\n// this one has to use the /g flag\nre[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g');\nvar comparatorTrimReplace = '$1$2$3';\n\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\nvar HYPHENRANGE = R++;\nsrc[HYPHENRANGE] = '^\\\\s*(' + src[XRANGEPLAIN] + ')' +\n                   '\\\\s+-\\\\s+' +\n                   '(' + src[XRANGEPLAIN] + ')' +\n                   '\\\\s*$';\n\nvar HYPHENRANGELOOSE = R++;\nsrc[HYPHENRANGELOOSE] = '^\\\\s*(' + src[XRANGEPLAINLOOSE] + ')' +\n                        '\\\\s+-\\\\s+' +\n                        '(' + src[XRANGEPLAINLOOSE] + ')' +\n                        '\\\\s*$';\n\n// Star ranges basically just allow anything at all.\nvar STAR = R++;\nsrc[STAR] = '(<|>)?=?\\\\s*\\\\*';\n\n// Compile to actual regexp objects.\n// All are flag-free, unless they were created above with a flag.\nfor (var i = 0; i < R; i++) {\n  debug(i, src[i]);\n  if (!re[i])\n    re[i] = new RegExp(src[i]);\n}\n\nexports.parse = parse;\nfunction parse(version, loose) {\n  if (version instanceof SemVer)\n    return version;\n\n  if (typeof version !== 'string')\n    return null;\n\n  if (version.length > MAX_LENGTH)\n    return null;\n\n  var r = loose ? re[LOOSE] : re[FULL];\n  if (!r.test(version))\n    return null;\n\n  try {\n    return new SemVer(version, loose);\n  } catch (er) {\n    return null;\n  }\n}\n\nexports.valid = valid;\nfunction valid(version, loose) {\n  var v = parse(version, loose);\n  return v ? v.version : null;\n}\n\n\nexports.clean = clean;\nfunction clean(version, loose) {\n  var s = parse(version.trim().replace(/^[=v]+/, ''), loose);\n  return s ? s.version : null;\n}\n\nexports.SemVer = SemVer;\n\nfunction SemVer(version, loose) {\n  if (version instanceof SemVer) {\n    if (version.loose === loose)\n      return version;\n    else\n      version = version.version;\n  } else if (typeof version !== 'string') {\n    throw new TypeError('Invalid Version: ' + version);\n  }\n\n  if (version.length > MAX_LENGTH)\n    throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')\n\n  if (!(this instanceof SemVer))\n    return new SemVer(version, loose);\n\n  debug('SemVer', version, loose);\n  this.loose = loose;\n  var m = version.trim().match(loose ? re[LOOSE] : re[FULL]);\n\n  if (!m)\n    throw new TypeError('Invalid Version: ' + version);\n\n  this.raw = version;\n\n  // these are actually numbers\n  this.major = +m[1];\n  this.minor = +m[2];\n  this.patch = +m[3];\n\n  if (this.major > MAX_SAFE_INTEGER || this.major < 0)\n    throw new TypeError('Invalid major version')\n\n  if (this.minor > MAX_SAFE_INTEGER || this.minor < 0)\n    throw new TypeError('Invalid minor version')\n\n  if (this.patch > MAX_SAFE_INTEGER || this.patch < 0)\n    throw new TypeError('Invalid patch version')\n\n  // numberify any prerelease numeric ids\n  if (!m[4])\n    this.prerelease = [];\n  else\n    this.prerelease = m[4].split('.').map(function(id) {\n      if (/^[0-9]+$/.test(id)) {\n        var num = +id;\n        if (num >= 0 && num < MAX_SAFE_INTEGER)\n          return num;\n      }\n      return id;\n    });\n\n  this.build = m[5] ? m[5].split('.') : [];\n  this.format();\n}\n\nSemVer.prototype.format = function() {\n  this.version = this.major + '.' + this.minor + '.' + this.patch;\n  if (this.prerelease.length)\n    this.version += '-' + this.prerelease.join('.');\n  return this.version;\n};\n\nSemVer.prototype.toString = function() {\n  return this.version;\n};\n\nSemVer.prototype.compare = function(other) {\n  debug('SemVer.compare', this.version, this.loose, other);\n  if (!(other instanceof SemVer))\n    other = new SemVer(other, this.loose);\n\n  return this.compareMain(other) || this.comparePre(other);\n};\n\nSemVer.prototype.compareMain = function(other) {\n  if (!(other instanceof SemVer))\n    other = new SemVer(other, this.loose);\n\n  return compareIdentifiers(this.major, other.major) ||\n         compareIdentifiers(this.minor, other.minor) ||\n         compareIdentifiers(this.patch, other.patch);\n};\n\nSemVer.prototype.comparePre = function(other) {\n  if (!(other instanceof SemVer))\n    other = new SemVer(other, this.loose);\n\n  // NOT having a prerelease is > having one\n  if (this.prerelease.length && !other.prerelease.length)\n    return -1;\n  else if (!this.prerelease.length && other.prerelease.length)\n    return 1;\n  else if (!this.prerelease.length && !other.prerelease.length)\n    return 0;\n\n  var i = 0;\n  do {\n    var a = this.prerelease[i];\n    var b = other.prerelease[i];\n    debug('prerelease compare', i, a, b);\n    if (a === undefined && b === undefined)\n      return 0;\n    else if (b === undefined)\n      return 1;\n    else if (a === undefined)\n      return -1;\n    else if (a === b)\n      continue;\n    else\n      return compareIdentifiers(a, b);\n  } while (++i);\n};\n\n// preminor will bump the version up to the next minor release, and immediately\n// down to pre-release. premajor and prepatch work the same way.\nSemVer.prototype.inc = function(release, identifier) {\n  switch (release) {\n    case 'premajor':\n      this.prerelease.length = 0;\n      this.patch = 0;\n      this.minor = 0;\n      this.major++;\n      this.inc('pre', identifier);\n      break;\n    case 'preminor':\n      this.prerelease.length = 0;\n      this.patch = 0;\n      this.minor++;\n      this.inc('pre', identifier);\n      break;\n    case 'prepatch':\n      // If this is already a prerelease, it will bump to the next version\n      // drop any prereleases that might already exist, since they are not\n      // relevant at this point.\n      this.prerelease.length = 0;\n      this.inc('patch', identifier);\n      this.inc('pre', identifier);\n      break;\n    // If the input is a non-prerelease version, this acts the same as\n    // prepatch.\n    case 'prerelease':\n      if (this.prerelease.length === 0)\n        this.inc('patch', identifier);\n      this.inc('pre', identifier);\n      break;\n\n    case 'major':\n      // If this is a pre-major version, bump up to the same major version.\n      // Otherwise increment major.\n      // 1.0.0-5 bumps to 1.0.0\n      // 1.1.0 bumps to 2.0.0\n      if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0)\n        this.major++;\n      this.minor = 0;\n      this.patch = 0;\n      this.prerelease = [];\n      break;\n    case 'minor':\n      // If this is a pre-minor version, bump up to the same minor version.\n      // Otherwise increment minor.\n      // 1.2.0-5 bumps to 1.2.0\n      // 1.2.1 bumps to 1.3.0\n      if (this.patch !== 0 || this.prerelease.length === 0)\n        this.minor++;\n      this.patch = 0;\n      this.prerelease = [];\n      break;\n    case 'patch':\n      // If this is not a pre-release version, it will increment the patch.\n      // If it is a pre-release it will bump up to the same patch version.\n      // 1.2.0-5 patches to 1.2.0\n      // 1.2.0 patches to 1.2.1\n      if (this.prerelease.length === 0)\n        this.patch++;\n      this.prerelease = [];\n      break;\n    // This probably shouldn't be used publicly.\n    // 1.0.0 \"pre\" would become 1.0.0-0 which is the wrong direction.\n    case 'pre':\n      if (this.prerelease.length === 0)\n        this.prerelease = [0];\n      else {\n        var i = this.prerelease.length;\n        while (--i >= 0) {\n          if (typeof this.prerelease[i] === 'number') {\n            this.prerelease[i]++;\n            i = -2;\n          }\n        }\n        if (i === -1) // didn't increment anything\n          this.prerelease.push(0);\n      }\n      if (identifier) {\n        // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n        // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n        if (this.prerelease[0] === identifier) {\n          if (isNaN(this.prerelease[1]))\n            this.prerelease = [identifier, 0];\n        } else\n          this.prerelease = [identifier, 0];\n      }\n      break;\n\n    default:\n      throw new Error('invalid increment argument: ' + release);\n  }\n  this.format();\n  this.raw = this.version;\n  return this;\n};\n\nexports.inc = inc;\nfunction inc(version, release, loose, identifier) {\n  if (typeof(loose) === 'string') {\n    identifier = loose;\n    loose = undefined;\n  }\n\n  try {\n    return new SemVer(version, loose).inc(release, identifier).version;\n  } catch (er) {\n    return null;\n  }\n}\n\nexports.diff = diff;\nfunction diff(version1, version2) {\n  if (eq(version1, version2)) {\n    return null;\n  } else {\n    var v1 = parse(version1);\n    var v2 = parse(version2);\n    if (v1.prerelease.length || v2.prerelease.length) {\n      for (var key in v1) {\n        if (key === 'major' || key === 'minor' || key === 'patch') {\n          if (v1[key] !== v2[key]) {\n            return 'pre'+key;\n          }\n        }\n      }\n      return 'prerelease';\n    }\n    for (var key in v1) {\n      if (key === 'major' || key === 'minor' || key === 'patch') {\n        if (v1[key] !== v2[key]) {\n          return key;\n        }\n      }\n    }\n  }\n}\n\nexports.compareIdentifiers = compareIdentifiers;\n\nvar numeric = /^[0-9]+$/;\nfunction compareIdentifiers(a, b) {\n  var anum = numeric.test(a);\n  var bnum = numeric.test(b);\n\n  if (anum && bnum) {\n    a = +a;\n    b = +b;\n  }\n\n  return (anum && !bnum) ? -1 :\n         (bnum && !anum) ? 1 :\n         a < b ? -1 :\n         a > b ? 1 :\n         0;\n}\n\nexports.rcompareIdentifiers = rcompareIdentifiers;\nfunction rcompareIdentifiers(a, b) {\n  return compareIdentifiers(b, a);\n}\n\nexports.major = major;\nfunction major(a, loose) {\n  return new SemVer(a, loose).major;\n}\n\nexports.minor = minor;\nfunction minor(a, loose) {\n  return new SemVer(a, loose).minor;\n}\n\nexports.patch = patch;\nfunction patch(a, loose) {\n  return new SemVer(a, loose).patch;\n}\n\nexports.compare = compare;\nfunction compare(a, b, loose) {\n  return new SemVer(a, loose).compare(new SemVer(b, loose));\n}\n\nexports.compareLoose = compareLoose;\nfunction compareLoose(a, b) {\n  return compare(a, b, true);\n}\n\nexports.rcompare = rcompare;\nfunction rcompare(a, b, loose) {\n  return compare(b, a, loose);\n}\n\nexports.sort = sort;\nfunction sort(list, loose) {\n  return list.sort(function(a, b) {\n    return exports.compare(a, b, loose);\n  });\n}\n\nexports.rsort = rsort;\nfunction rsort(list, loose) {\n  return list.sort(function(a, b) {\n    return exports.rcompare(a, b, loose);\n  });\n}\n\nexports.gt = gt;\nfunction gt(a, b, loose) {\n  return compare(a, b, loose) > 0;\n}\n\nexports.lt = lt;\nfunction lt(a, b, loose) {\n  return compare(a, b, loose) < 0;\n}\n\nexports.eq = eq;\nfunction eq(a, b, loose) {\n  return compare(a, b, loose) === 0;\n}\n\nexports.neq = neq;\nfunction neq(a, b, loose) {\n  return compare(a, b, loose) !== 0;\n}\n\nexports.gte = gte;\nfunction gte(a, b, loose) {\n  return compare(a, b, loose) >= 0;\n}\n\nexports.lte = lte;\nfunction lte(a, b, loose) {\n  return compare(a, b, loose) <= 0;\n}\n\nexports.cmp = cmp;\nfunction cmp(a, op, b, loose) {\n  var ret;\n  switch (op) {\n    case '===':\n      if (typeof a === 'object') a = a.version;\n      if (typeof b === 'object') b = b.version;\n      ret = a === b;\n      break;\n    case '!==':\n      if (typeof a === 'object') a = a.version;\n      if (typeof b === 'object') b = b.version;\n      ret = a !== b;\n      break;\n    case '': case '=': case '==': ret = eq(a, b, loose); break;\n    case '!=': ret = neq(a, b, loose); break;\n    case '>': ret = gt(a, b, loose); break;\n    case '>=': ret = gte(a, b, loose); break;\n    case '<': ret = lt(a, b, loose); break;\n    case '<=': ret = lte(a, b, loose); break;\n    default: throw new TypeError('Invalid operator: ' + op);\n  }\n  return ret;\n}\n\nexports.Comparator = Comparator;\nfunction Comparator(comp, loose) {\n  if (comp instanceof Comparator) {\n    if (comp.loose === loose)\n      return comp;\n    else\n      comp = comp.value;\n  }\n\n  if (!(this instanceof Comparator))\n    return new Comparator(comp, loose);\n\n  debug('comparator', comp, loose);\n  this.loose = loose;\n  this.parse(comp);\n\n  if (this.semver === ANY)\n    this.value = '';\n  else\n    this.value = this.operator + this.semver.version;\n\n  debug('comp', this);\n}\n\nvar ANY = {};\nComparator.prototype.parse = function(comp) {\n  var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR];\n  var m = comp.match(r);\n\n  if (!m)\n    throw new TypeError('Invalid comparator: ' + comp);\n\n  this.operator = m[1];\n  if (this.operator === '=')\n    this.operator = '';\n\n  // if it literally is just '>' or '' then allow anything.\n  if (!m[2])\n    this.semver = ANY;\n  else\n    this.semver = new SemVer(m[2], this.loose);\n};\n\nComparator.prototype.toString = function() {\n  return this.value;\n};\n\nComparator.prototype.test = function(version) {\n  debug('Comparator.test', version, this.loose);\n\n  if (this.semver === ANY)\n    return true;\n\n  if (typeof version === 'string')\n    version = new SemVer(version, this.loose);\n\n  return cmp(version, this.operator, this.semver, this.loose);\n};\n\nComparator.prototype.intersects = function(comp, loose) {\n  if (!(comp instanceof Comparator)) {\n    throw new TypeError('a Comparator is required');\n  }\n\n  var rangeTmp;\n\n  if (this.operator === '') {\n    rangeTmp = new Range(comp.value, loose);\n    return satisfies(this.value, rangeTmp, loose);\n  } else if (comp.operator === '') {\n    rangeTmp = new Range(this.value, loose);\n    return satisfies(comp.semver, rangeTmp, loose);\n  }\n\n  var sameDirectionIncreasing =\n    (this.operator === '>=' || this.operator === '>') &&\n    (comp.operator === '>=' || comp.operator === '>');\n  var sameDirectionDecreasing =\n    (this.operator === '<=' || this.operator === '<') &&\n    (comp.operator === '<=' || comp.operator === '<');\n  var sameSemVer = this.semver.version === comp.semver.version;\n  var differentDirectionsInclusive =\n    (this.operator === '>=' || this.operator === '<=') &&\n    (comp.operator === '>=' || comp.operator === '<=');\n  var oppositeDirectionsLessThan =\n    cmp(this.semver, '<', comp.semver, loose) &&\n    ((this.operator === '>=' || this.operator === '>') &&\n    (comp.operator === '<=' || comp.operator === '<'));\n  var oppositeDirectionsGreaterThan =\n    cmp(this.semver, '>', comp.semver, loose) &&\n    ((this.operator === '<=' || this.operator === '<') &&\n    (comp.operator === '>=' || comp.operator === '>'));\n\n  return sameDirectionIncreasing || sameDirectionDecreasing ||\n    (sameSemVer && differentDirectionsInclusive) ||\n    oppositeDirectionsLessThan || oppositeDirectionsGreaterThan;\n};\n\n\nexports.Range = Range;\nfunction Range(range, loose) {\n  if (range instanceof Range) {\n    if (range.loose === loose) {\n      return range;\n    } else {\n      return new Range(range.raw, loose);\n    }\n  }\n\n  if (range instanceof Comparator) {\n    return new Range(range.value, loose);\n  }\n\n  if (!(this instanceof Range))\n    return new Range(range, loose);\n\n  this.loose = loose;\n\n  // First, split based on boolean or ||\n  this.raw = range;\n  this.set = range.split(/\\s*\\|\\|\\s*/).map(function(range) {\n    return this.parseRange(range.trim());\n  }, this).filter(function(c) {\n    // throw out any that are not relevant for whatever reason\n    return c.length;\n  });\n\n  if (!this.set.length) {\n    throw new TypeError('Invalid SemVer Range: ' + range);\n  }\n\n  this.format();\n}\n\nRange.prototype.format = function() {\n  this.range = this.set.map(function(comps) {\n    return comps.join(' ').trim();\n  }).join('||').trim();\n  return this.range;\n};\n\nRange.prototype.toString = function() {\n  return this.range;\n};\n\nRange.prototype.parseRange = function(range) {\n  var loose = this.loose;\n  range = range.trim();\n  debug('range', range, loose);\n  // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n  var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE];\n  range = range.replace(hr, hyphenReplace);\n  debug('hyphen replace', range);\n  // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n  range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace);\n  debug('comparator trim', range, re[COMPARATORTRIM]);\n\n  // `~ 1.2.3` => `~1.2.3`\n  range = range.replace(re[TILDETRIM], tildeTrimReplace);\n\n  // `^ 1.2.3` => `^1.2.3`\n  range = range.replace(re[CARETTRIM], caretTrimReplace);\n\n  // normalize spaces\n  range = range.split(/\\s+/).join(' ');\n\n  // At this point, the range is completely trimmed and\n  // ready to be split into comparators.\n\n  var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR];\n  var set = range.split(' ').map(function(comp) {\n    return parseComparator(comp, loose);\n  }).join(' ').split(/\\s+/);\n  if (this.loose) {\n    // in loose mode, throw out any that are not valid comparators\n    set = set.filter(function(comp) {\n      return !!comp.match(compRe);\n    });\n  }\n  set = set.map(function(comp) {\n    return new Comparator(comp, loose);\n  });\n\n  return set;\n};\n\nRange.prototype.intersects = function(range, loose) {\n  if (!(range instanceof Range)) {\n    throw new TypeError('a Range is required');\n  }\n\n  return this.set.some(function(thisComparators) {\n    return thisComparators.every(function(thisComparator) {\n      return range.set.some(function(rangeComparators) {\n        return rangeComparators.every(function(rangeComparator) {\n          return thisComparator.intersects(rangeComparator, loose);\n        });\n      });\n    });\n  });\n};\n\n// Mostly just for testing and legacy API reasons\nexports.toComparators = toComparators;\nfunction toComparators(range, loose) {\n  return new Range(range, loose).set.map(function(comp) {\n    return comp.map(function(c) {\n      return c.value;\n    }).join(' ').trim().split(' ');\n  });\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nfunction parseComparator(comp, loose) {\n  debug('comp', comp);\n  comp = replaceCarets(comp, loose);\n  debug('caret', comp);\n  comp = replaceTildes(comp, loose);\n  debug('tildes', comp);\n  comp = replaceXRanges(comp, loose);\n  debug('xrange', comp);\n  comp = replaceStars(comp, loose);\n  debug('stars', comp);\n  return comp;\n}\n\nfunction isX(id) {\n  return !id || id.toLowerCase() === 'x' || id === '*';\n}\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0\nfunction replaceTildes(comp, loose) {\n  return comp.trim().split(/\\s+/).map(function(comp) {\n    return replaceTilde(comp, loose);\n  }).join(' ');\n}\n\nfunction replaceTilde(comp, loose) {\n  var r = loose ? re[TILDELOOSE] : re[TILDE];\n  return comp.replace(r, function(_, M, m, p, pr) {\n    debug('tilde', comp, _, M, m, p, pr);\n    var ret;\n\n    if (isX(M))\n      ret = '';\n    else if (isX(m))\n      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';\n    else if (isX(p))\n      // ~1.2 == >=1.2.0 <1.3.0\n      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';\n    else if (pr) {\n      debug('replaceTilde pr', pr);\n      if (pr.charAt(0) !== '-')\n        pr = '-' + pr;\n      ret = '>=' + M + '.' + m + '.' + p + pr +\n            ' <' + M + '.' + (+m + 1) + '.0';\n    } else\n      // ~1.2.3 == >=1.2.3 <1.3.0\n      ret = '>=' + M + '.' + m + '.' + p +\n            ' <' + M + '.' + (+m + 1) + '.0';\n\n    debug('tilde return', ret);\n    return ret;\n  });\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0\n// ^1.2.3 --> >=1.2.3 <2.0.0\n// ^1.2.0 --> >=1.2.0 <2.0.0\nfunction replaceCarets(comp, loose) {\n  return comp.trim().split(/\\s+/).map(function(comp) {\n    return replaceCaret(comp, loose);\n  }).join(' ');\n}\n\nfunction replaceCaret(comp, loose) {\n  debug('caret', comp, loose);\n  var r = loose ? re[CARETLOOSE] : re[CARET];\n  return comp.replace(r, function(_, M, m, p, pr) {\n    debug('caret', comp, _, M, m, p, pr);\n    var ret;\n\n    if (isX(M))\n      ret = '';\n    else if (isX(m))\n      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';\n    else if (isX(p)) {\n      if (M === '0')\n        ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';\n      else\n        ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0';\n    } else if (pr) {\n      debug('replaceCaret pr', pr);\n      if (pr.charAt(0) !== '-')\n        pr = '-' + pr;\n      if (M === '0') {\n        if (m === '0')\n          ret = '>=' + M + '.' + m + '.' + p + pr +\n                ' <' + M + '.' + m + '.' + (+p + 1);\n        else\n          ret = '>=' + M + '.' + m + '.' + p + pr +\n                ' <' + M + '.' + (+m + 1) + '.0';\n      } else\n        ret = '>=' + M + '.' + m + '.' + p + pr +\n              ' <' + (+M + 1) + '.0.0';\n    } else {\n      debug('no pr');\n      if (M === '0') {\n        if (m === '0')\n          ret = '>=' + M + '.' + m + '.' + p +\n                ' <' + M + '.' + m + '.' + (+p + 1);\n        else\n          ret = '>=' + M + '.' + m + '.' + p +\n                ' <' + M + '.' + (+m + 1) + '.0';\n      } else\n        ret = '>=' + M + '.' + m + '.' + p +\n              ' <' + (+M + 1) + '.0.0';\n    }\n\n    debug('caret return', ret);\n    return ret;\n  });\n}\n\nfunction replaceXRanges(comp, loose) {\n  debug('replaceXRanges', comp, loose);\n  return comp.split(/\\s+/).map(function(comp) {\n    return replaceXRange(comp, loose);\n  }).join(' ');\n}\n\nfunction replaceXRange(comp, loose) {\n  comp = comp.trim();\n  var r = loose ? re[XRANGELOOSE] : re[XRANGE];\n  return comp.replace(r, function(ret, gtlt, M, m, p, pr) {\n    debug('xRange', comp, ret, gtlt, M, m, p, pr);\n    var xM = isX(M);\n    var xm = xM || isX(m);\n    var xp = xm || isX(p);\n    var anyX = xp;\n\n    if (gtlt === '=' && anyX)\n      gtlt = '';\n\n    if (xM) {\n      if (gtlt === '>' || gtlt === '<') {\n        // nothing is allowed\n        ret = '<0.0.0';\n      } else {\n        // nothing is forbidden\n        ret = '*';\n      }\n    } else if (gtlt && anyX) {\n      // replace X with 0\n      if (xm)\n        m = 0;\n      if (xp)\n        p = 0;\n\n      if (gtlt === '>') {\n        // >1 => >=2.0.0\n        // >1.2 => >=1.3.0\n        // >1.2.3 => >= 1.2.4\n        gtlt = '>=';\n        if (xm) {\n          M = +M + 1;\n          m = 0;\n          p = 0;\n        } else if (xp) {\n          m = +m + 1;\n          p = 0;\n        }\n      } else if (gtlt === '<=') {\n        // <=0.7.x is actually <0.8.0, since any 0.7.x should\n        // pass.  Similarly, <=7.x is actually <8.0.0, etc.\n        gtlt = '<';\n        if (xm)\n          M = +M + 1;\n        else\n          m = +m + 1;\n      }\n\n      ret = gtlt + M + '.' + m + '.' + p;\n    } else if (xm) {\n      ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0';\n    } else if (xp) {\n      ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0';\n    }\n\n    debug('xRange return', ret);\n\n    return ret;\n  });\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nfunction replaceStars(comp, loose) {\n  debug('replaceStars', comp, loose);\n  // Looseness is ignored here.  star is always as loose as it gets!\n  return comp.trim().replace(re[STAR], '');\n}\n\n// This function is passed to string.replace(re[HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0\nfunction hyphenReplace($0,\n                       from, fM, fm, fp, fpr, fb,\n                       to, tM, tm, tp, tpr, tb) {\n\n  if (isX(fM))\n    from = '';\n  else if (isX(fm))\n    from = '>=' + fM + '.0.0';\n  else if (isX(fp))\n    from = '>=' + fM + '.' + fm + '.0';\n  else\n    from = '>=' + from;\n\n  if (isX(tM))\n    to = '';\n  else if (isX(tm))\n    to = '<' + (+tM + 1) + '.0.0';\n  else if (isX(tp))\n    to = '<' + tM + '.' + (+tm + 1) + '.0';\n  else if (tpr)\n    to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr;\n  else\n    to = '<=' + to;\n\n  return (from + ' ' + to).trim();\n}\n\n\n// if ANY of the sets match ALL of its comparators, then pass\nRange.prototype.test = function(version) {\n  if (!version)\n    return false;\n\n  if (typeof version === 'string')\n    version = new SemVer(version, this.loose);\n\n  for (var i = 0; i < this.set.length; i++) {\n    if (testSet(this.set[i], version))\n      return true;\n  }\n  return false;\n};\n\nfunction testSet(set, version) {\n  for (var i = 0; i < set.length; i++) {\n    if (!set[i].test(version))\n      return false;\n  }\n\n  if (version.prerelease.length) {\n    // Find the set of versions that are allowed to have prereleases\n    // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n    // That should allow `1.2.3-pr.2` to pass.\n    // However, `1.2.4-alpha.notready` should NOT be allowed,\n    // even though it's within the range set by the comparators.\n    for (var i = 0; i < set.length; i++) {\n      debug(set[i].semver);\n      if (set[i].semver === ANY)\n        continue;\n\n      if (set[i].semver.prerelease.length > 0) {\n        var allowed = set[i].semver;\n        if (allowed.major === version.major &&\n            allowed.minor === version.minor &&\n            allowed.patch === version.patch)\n          return true;\n      }\n    }\n\n    // Version has a -pre, but it's not one of the ones we like.\n    return false;\n  }\n\n  return true;\n}\n\nexports.satisfies = satisfies;\nfunction satisfies(version, range, loose) {\n  try {\n    range = new Range(range, loose);\n  } catch (er) {\n    return false;\n  }\n  return range.test(version);\n}\n\nexports.maxSatisfying = maxSatisfying;\nfunction maxSatisfying(versions, range, loose) {\n  var max = null;\n  var maxSV = null;\n  try {\n    var rangeObj = new Range(range, loose);\n  } catch (er) {\n    return null;\n  }\n  versions.forEach(function (v) {\n    if (rangeObj.test(v)) { // satisfies(v, range, loose)\n      if (!max || maxSV.compare(v) === -1) { // compare(max, v, true)\n        max = v;\n        maxSV = new SemVer(max, loose);\n      }\n    }\n  })\n  return max;\n}\n\nexports.minSatisfying = minSatisfying;\nfunction minSatisfying(versions, range, loose) {\n  var min = null;\n  var minSV = null;\n  try {\n    var rangeObj = new Range(range, loose);\n  } catch (er) {\n    return null;\n  }\n  versions.forEach(function (v) {\n    if (rangeObj.test(v)) { // satisfies(v, range, loose)\n      if (!min || minSV.compare(v) === 1) { // compare(min, v, true)\n        min = v;\n        minSV = new SemVer(min, loose);\n      }\n    }\n  })\n  return min;\n}\n\nexports.validRange = validRange;\nfunction validRange(range, loose) {\n  try {\n    // Return '*' instead of '' so that truthiness works.\n    // This will throw if it's invalid anyway\n    return new Range(range, loose).range || '*';\n  } catch (er) {\n    return null;\n  }\n}\n\n// Determine if version is less than all the versions possible in the range\nexports.ltr = ltr;\nfunction ltr(version, range, loose) {\n  return outside(version, range, '<', loose);\n}\n\n// Determine if version is greater than all the versions possible in the range.\nexports.gtr = gtr;\nfunction gtr(version, range, loose) {\n  return outside(version, range, '>', loose);\n}\n\nexports.outside = outside;\nfunction outside(version, range, hilo, loose) {\n  version = new SemVer(version, loose);\n  range = new Range(range, loose);\n\n  var gtfn, ltefn, ltfn, comp, ecomp;\n  switch (hilo) {\n    case '>':\n      gtfn = gt;\n      ltefn = lte;\n      ltfn = lt;\n      comp = '>';\n      ecomp = '>=';\n      break;\n    case '<':\n      gtfn = lt;\n      ltefn = gte;\n      ltfn = gt;\n      comp = '<';\n      ecomp = '<=';\n      break;\n    default:\n      throw new TypeError('Must provide a hilo val of \"<\" or \">\"');\n  }\n\n  // If it satisifes the range it is not outside\n  if (satisfies(version, range, loose)) {\n    return false;\n  }\n\n  // From now on, variable terms are as if we're in \"gtr\" mode.\n  // but note that everything is flipped for the \"ltr\" function.\n\n  for (var i = 0; i < range.set.length; ++i) {\n    var comparators = range.set[i];\n\n    var high = null;\n    var low = null;\n\n    comparators.forEach(function(comparator) {\n      if (comparator.semver === ANY) {\n        comparator = new Comparator('>=0.0.0')\n      }\n      high = high || comparator;\n      low = low || comparator;\n      if (gtfn(comparator.semver, high.semver, loose)) {\n        high = comparator;\n      } else if (ltfn(comparator.semver, low.semver, loose)) {\n        low = comparator;\n      }\n    });\n\n    // If the edge version comparator has a operator then our version\n    // isn't outside it\n    if (high.operator === comp || high.operator === ecomp) {\n      return false;\n    }\n\n    // If the lowest version comparator has an operator and our version\n    // is less than it then it isn't higher than the range\n    if ((!low.operator || low.operator === comp) &&\n        ltefn(version, low.semver)) {\n      return false;\n    } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n      return false;\n    }\n  }\n  return true;\n}\n\nexports.prerelease = prerelease;\nfunction prerelease(version, loose) {\n  var parsed = parse(version, loose);\n  return (parsed && parsed.prerelease.length) ? parsed.prerelease : null;\n}\n\nexports.intersects = intersects;\nfunction intersects(r1, r2, loose) {\n  r1 = new Range(r1, loose)\n  r2 = new Range(r2, loose)\n  return r1.intersects(r2)\n}\n\nexports.coerce = coerce;\nfunction coerce(version) {\n  if (version instanceof SemVer)\n    return version;\n\n  if (typeof version !== 'string')\n    return null;\n\n  var match = version.match(re[COERCE]);\n\n  if (match == null)\n    return null;\n\n  return parse((match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0')); \n}\n\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"stream\");\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"url\");\n\n/***/ }),\n/* 25 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Subscription; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_isArray__ = __webpack_require__(41);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isObject__ = __webpack_require__(444);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isFunction__ = __webpack_require__(155);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__ = __webpack_require__(57);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_errorObject__ = __webpack_require__(48);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__ = __webpack_require__(441);\n/** PURE_IMPORTS_START _util_isArray,_util_isObject,_util_isFunction,_util_tryCatch,_util_errorObject,_util_UnsubscriptionError PURE_IMPORTS_END */\n\n\n\n\n\n\nvar Subscription = /*@__PURE__*/ (function () {\n    function Subscription(unsubscribe) {\n        this.closed = false;\n        this._parent = null;\n        this._parents = null;\n        this._subscriptions = null;\n        if (unsubscribe) {\n            this._unsubscribe = unsubscribe;\n        }\n    }\n    Subscription.prototype.unsubscribe = function () {\n        var hasErrors = false;\n        var errors;\n        if (this.closed) {\n            return;\n        }\n        var _a = this, _parent = _a._parent, _parents = _a._parents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;\n        this.closed = true;\n        this._parent = null;\n        this._parents = null;\n        this._subscriptions = null;\n        var index = -1;\n        var len = _parents ? _parents.length : 0;\n        while (_parent) {\n            _parent.remove(this);\n            _parent = ++index < len && _parents[index] || null;\n        }\n        if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isFunction__[\"a\" /* isFunction */])(_unsubscribe)) {\n            var trial = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_tryCatch__[\"a\" /* tryCatch */])(_unsubscribe).call(this);\n            if (trial === __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[\"a\" /* errorObject */]) {\n                hasErrors = true;\n                errors = errors || (__WEBPACK_IMPORTED_MODULE_4__util_errorObject__[\"a\" /* errorObject */].e instanceof __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__[\"a\" /* UnsubscriptionError */] ?\n                    flattenUnsubscriptionErrors(__WEBPACK_IMPORTED_MODULE_4__util_errorObject__[\"a\" /* errorObject */].e.errors) : [__WEBPACK_IMPORTED_MODULE_4__util_errorObject__[\"a\" /* errorObject */].e]);\n            }\n        }\n        if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__util_isArray__[\"a\" /* isArray */])(_subscriptions)) {\n            index = -1;\n            len = _subscriptions.length;\n            while (++index < len) {\n                var sub = _subscriptions[index];\n                if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isObject__[\"a\" /* isObject */])(sub)) {\n                    var trial = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_tryCatch__[\"a\" /* tryCatch */])(sub.unsubscribe).call(sub);\n                    if (trial === __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[\"a\" /* errorObject */]) {\n                        hasErrors = true;\n                        errors = errors || [];\n                        var err = __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[\"a\" /* errorObject */].e;\n                        if (err instanceof __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__[\"a\" /* UnsubscriptionError */]) {\n                            errors = errors.concat(flattenUnsubscriptionErrors(err.errors));\n                        }\n                        else {\n                            errors.push(err);\n                        }\n                    }\n                }\n            }\n        }\n        if (hasErrors) {\n            throw new __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__[\"a\" /* UnsubscriptionError */](errors);\n        }\n    };\n    Subscription.prototype.add = function (teardown) {\n        if (!teardown || (teardown === Subscription.EMPTY)) {\n            return Subscription.EMPTY;\n        }\n        if (teardown === this) {\n            return this;\n        }\n        var subscription = teardown;\n        switch (typeof teardown) {\n            case 'function':\n                subscription = new Subscription(teardown);\n            case 'object':\n                if (subscription.closed || typeof subscription.unsubscribe !== 'function') {\n                    return subscription;\n                }\n                else if (this.closed) {\n                    subscription.unsubscribe();\n                    return subscription;\n                }\n                else if (typeof subscription._addParent !== 'function') {\n                    var tmp = subscription;\n                    subscription = new Subscription();\n                    subscription._subscriptions = [tmp];\n                }\n                break;\n            default:\n                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');\n        }\n        var subscriptions = this._subscriptions || (this._subscriptions = []);\n        subscriptions.push(subscription);\n        subscription._addParent(this);\n        return subscription;\n    };\n    Subscription.prototype.remove = function (subscription) {\n        var subscriptions = this._subscriptions;\n        if (subscriptions) {\n            var subscriptionIndex = subscriptions.indexOf(subscription);\n            if (subscriptionIndex !== -1) {\n                subscriptions.splice(subscriptionIndex, 1);\n            }\n        }\n    };\n    Subscription.prototype._addParent = function (parent) {\n        var _a = this, _parent = _a._parent, _parents = _a._parents;\n        if (!_parent || _parent === parent) {\n            this._parent = parent;\n        }\n        else if (!_parents) {\n            this._parents = [parent];\n        }\n        else if (_parents.indexOf(parent) === -1) {\n            _parents.push(parent);\n        }\n    };\n    Subscription.EMPTY = (function (empty) {\n        empty.closed = true;\n        return empty;\n    }(new Subscription()));\n    return Subscription;\n}());\n\nfunction flattenUnsubscriptionErrors(errors) {\n    return errors.reduce(function (errs, err) { return errs.concat((err instanceof __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__[\"a\" /* UnsubscriptionError */]) ? err.errors : err); }, []);\n}\n//# sourceMappingURL=Subscription.js.map\n\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nmodule.exports = {\n\tbufferSplit: bufferSplit,\n\taddRSAMissing: addRSAMissing,\n\tcalculateDSAPublic: calculateDSAPublic,\n\tcalculateED25519Public: calculateED25519Public,\n\tcalculateX25519Public: calculateX25519Public,\n\tmpNormalize: mpNormalize,\n\tmpDenormalize: mpDenormalize,\n\tecNormalize: ecNormalize,\n\tcountZeros: countZeros,\n\tassertCompatible: assertCompatible,\n\tisCompatible: isCompatible,\n\topensslKeyDeriv: opensslKeyDeriv,\n\topensshCipherInfo: opensshCipherInfo,\n\tpublicFromPrivateECDSA: publicFromPrivateECDSA,\n\tzeroPadToLength: zeroPadToLength,\n\twriteBitString: writeBitString,\n\treadBitString: readBitString\n};\n\nvar assert = __webpack_require__(16);\nvar Buffer = __webpack_require__(15).Buffer;\nvar PrivateKey = __webpack_require__(33);\nvar Key = __webpack_require__(28);\nvar crypto = __webpack_require__(11);\nvar algs = __webpack_require__(32);\nvar asn1 = __webpack_require__(66);\n\nvar ec, jsbn;\nvar nacl;\n\nvar MAX_CLASS_DEPTH = 3;\n\nfunction isCompatible(obj, klass, needVer) {\n\tif (obj === null || typeof (obj) !== 'object')\n\t\treturn (false);\n\tif (needVer === undefined)\n\t\tneedVer = klass.prototype._sshpkApiVersion;\n\tif (obj instanceof klass &&\n\t    klass.prototype._sshpkApiVersion[0] == needVer[0])\n\t\treturn (true);\n\tvar proto = Object.getPrototypeOf(obj);\n\tvar depth = 0;\n\twhile (proto.constructor.name !== klass.name) {\n\t\tproto = Object.getPrototypeOf(proto);\n\t\tif (!proto || ++depth > MAX_CLASS_DEPTH)\n\t\t\treturn (false);\n\t}\n\tif (proto.constructor.name !== klass.name)\n\t\treturn (false);\n\tvar ver = proto._sshpkApiVersion;\n\tif (ver === undefined)\n\t\tver = klass._oldVersionDetect(obj);\n\tif (ver[0] != needVer[0] || ver[1] < needVer[1])\n\t\treturn (false);\n\treturn (true);\n}\n\nfunction assertCompatible(obj, klass, needVer, name) {\n\tif (name === undefined)\n\t\tname = 'object';\n\tassert.ok(obj, name + ' must not be null');\n\tassert.object(obj, name + ' must be an object');\n\tif (needVer === undefined)\n\t\tneedVer = klass.prototype._sshpkApiVersion;\n\tif (obj instanceof klass &&\n\t    klass.prototype._sshpkApiVersion[0] == needVer[0])\n\t\treturn;\n\tvar proto = Object.getPrototypeOf(obj);\n\tvar depth = 0;\n\twhile (proto.constructor.name !== klass.name) {\n\t\tproto = Object.getPrototypeOf(proto);\n\t\tassert.ok(proto && ++depth <= MAX_CLASS_DEPTH,\n\t\t    name + ' must be a ' + klass.name + ' instance');\n\t}\n\tassert.strictEqual(proto.constructor.name, klass.name,\n\t    name + ' must be a ' + klass.name + ' instance');\n\tvar ver = proto._sshpkApiVersion;\n\tif (ver === undefined)\n\t\tver = klass._oldVersionDetect(obj);\n\tassert.ok(ver[0] == needVer[0] && ver[1] >= needVer[1],\n\t    name + ' must be compatible with ' + klass.name + ' klass ' +\n\t    'version ' + needVer[0] + '.' + needVer[1]);\n}\n\nvar CIPHER_LEN = {\n\t'des-ede3-cbc': { key: 7, iv: 8 },\n\t'aes-128-cbc': { key: 16, iv: 16 }\n};\nvar PKCS5_SALT_LEN = 8;\n\nfunction opensslKeyDeriv(cipher, salt, passphrase, count) {\n\tassert.buffer(salt, 'salt');\n\tassert.buffer(passphrase, 'passphrase');\n\tassert.number(count, 'iteration count');\n\n\tvar clen = CIPHER_LEN[cipher];\n\tassert.object(clen, 'supported cipher');\n\n\tsalt = salt.slice(0, PKCS5_SALT_LEN);\n\n\tvar D, D_prev, bufs;\n\tvar material = Buffer.alloc(0);\n\twhile (material.length < clen.key + clen.iv) {\n\t\tbufs = [];\n\t\tif (D_prev)\n\t\t\tbufs.push(D_prev);\n\t\tbufs.push(passphrase);\n\t\tbufs.push(salt);\n\t\tD = Buffer.concat(bufs);\n\t\tfor (var j = 0; j < count; ++j)\n\t\t\tD = crypto.createHash('md5').update(D).digest();\n\t\tmaterial = Buffer.concat([material, D]);\n\t\tD_prev = D;\n\t}\n\n\treturn ({\n\t    key: material.slice(0, clen.key),\n\t    iv: material.slice(clen.key, clen.key + clen.iv)\n\t});\n}\n\n/* Count leading zero bits on a buffer */\nfunction countZeros(buf) {\n\tvar o = 0, obit = 8;\n\twhile (o < buf.length) {\n\t\tvar mask = (1 << obit);\n\t\tif ((buf[o] & mask) === mask)\n\t\t\tbreak;\n\t\tobit--;\n\t\tif (obit < 0) {\n\t\t\to++;\n\t\t\tobit = 8;\n\t\t}\n\t}\n\treturn (o*8 + (8 - obit) - 1);\n}\n\nfunction bufferSplit(buf, chr) {\n\tassert.buffer(buf);\n\tassert.string(chr);\n\n\tvar parts = [];\n\tvar lastPart = 0;\n\tvar matches = 0;\n\tfor (var i = 0; i < buf.length; ++i) {\n\t\tif (buf[i] === chr.charCodeAt(matches))\n\t\t\t++matches;\n\t\telse if (buf[i] === chr.charCodeAt(0))\n\t\t\tmatches = 1;\n\t\telse\n\t\t\tmatches = 0;\n\n\t\tif (matches >= chr.length) {\n\t\t\tvar newPart = i + 1;\n\t\t\tparts.push(buf.slice(lastPart, newPart - matches));\n\t\t\tlastPart = newPart;\n\t\t\tmatches = 0;\n\t\t}\n\t}\n\tif (lastPart <= buf.length)\n\t\tparts.push(buf.slice(lastPart, buf.length));\n\n\treturn (parts);\n}\n\nfunction ecNormalize(buf, addZero) {\n\tassert.buffer(buf);\n\tif (buf[0] === 0x00 && buf[1] === 0x04) {\n\t\tif (addZero)\n\t\t\treturn (buf);\n\t\treturn (buf.slice(1));\n\t} else if (buf[0] === 0x04) {\n\t\tif (!addZero)\n\t\t\treturn (buf);\n\t} else {\n\t\twhile (buf[0] === 0x00)\n\t\t\tbuf = buf.slice(1);\n\t\tif (buf[0] === 0x02 || buf[0] === 0x03)\n\t\t\tthrow (new Error('Compressed elliptic curve points ' +\n\t\t\t    'are not supported'));\n\t\tif (buf[0] !== 0x04)\n\t\t\tthrow (new Error('Not a valid elliptic curve point'));\n\t\tif (!addZero)\n\t\t\treturn (buf);\n\t}\n\tvar b = Buffer.alloc(buf.length + 1);\n\tb[0] = 0x0;\n\tbuf.copy(b, 1);\n\treturn (b);\n}\n\nfunction readBitString(der, tag) {\n\tif (tag === undefined)\n\t\ttag = asn1.Ber.BitString;\n\tvar buf = der.readString(tag, true);\n\tassert.strictEqual(buf[0], 0x00, 'bit strings with unused bits are ' +\n\t    'not supported (0x' + buf[0].toString(16) + ')');\n\treturn (buf.slice(1));\n}\n\nfunction writeBitString(der, buf, tag) {\n\tif (tag === undefined)\n\t\ttag = asn1.Ber.BitString;\n\tvar b = Buffer.alloc(buf.length + 1);\n\tb[0] = 0x00;\n\tbuf.copy(b, 1);\n\tder.writeBuffer(b, tag);\n}\n\nfunction mpNormalize(buf) {\n\tassert.buffer(buf);\n\twhile (buf.length > 1 && buf[0] === 0x00 && (buf[1] & 0x80) === 0x00)\n\t\tbuf = buf.slice(1);\n\tif ((buf[0] & 0x80) === 0x80) {\n\t\tvar b = Buffer.alloc(buf.length + 1);\n\t\tb[0] = 0x00;\n\t\tbuf.copy(b, 1);\n\t\tbuf = b;\n\t}\n\treturn (buf);\n}\n\nfunction mpDenormalize(buf) {\n\tassert.buffer(buf);\n\twhile (buf.length > 1 && buf[0] === 0x00)\n\t\tbuf = buf.slice(1);\n\treturn (buf);\n}\n\nfunction zeroPadToLength(buf, len) {\n\tassert.buffer(buf);\n\tassert.number(len);\n\twhile (buf.length > len) {\n\t\tassert.equal(buf[0], 0x00);\n\t\tbuf = buf.slice(1);\n\t}\n\twhile (buf.length < len) {\n\t\tvar b = Buffer.alloc(buf.length + 1);\n\t\tb[0] = 0x00;\n\t\tbuf.copy(b, 1);\n\t\tbuf = b;\n\t}\n\treturn (buf);\n}\n\nfunction bigintToMpBuf(bigint) {\n\tvar buf = Buffer.from(bigint.toByteArray());\n\tbuf = mpNormalize(buf);\n\treturn (buf);\n}\n\nfunction calculateDSAPublic(g, p, x) {\n\tassert.buffer(g);\n\tassert.buffer(p);\n\tassert.buffer(x);\n\ttry {\n\t\tvar bigInt = __webpack_require__(81).BigInteger;\n\t} catch (e) {\n\t\tthrow (new Error('To load a PKCS#8 format DSA private key, ' +\n\t\t    'the node jsbn library is required.'));\n\t}\n\tg = new bigInt(g);\n\tp = new bigInt(p);\n\tx = new bigInt(x);\n\tvar y = g.modPow(x, p);\n\tvar ybuf = bigintToMpBuf(y);\n\treturn (ybuf);\n}\n\nfunction calculateED25519Public(k) {\n\tassert.buffer(k);\n\n\tif (nacl === undefined)\n\t\tnacl = __webpack_require__(76);\n\n\tvar kp = nacl.sign.keyPair.fromSeed(new Uint8Array(k));\n\treturn (Buffer.from(kp.publicKey));\n}\n\nfunction calculateX25519Public(k) {\n\tassert.buffer(k);\n\n\tif (nacl === undefined)\n\t\tnacl = __webpack_require__(76);\n\n\tvar kp = nacl.box.keyPair.fromSeed(new Uint8Array(k));\n\treturn (Buffer.from(kp.publicKey));\n}\n\nfunction addRSAMissing(key) {\n\tassert.object(key);\n\tassertCompatible(key, PrivateKey, [1, 1]);\n\ttry {\n\t\tvar bigInt = __webpack_require__(81).BigInteger;\n\t} catch (e) {\n\t\tthrow (new Error('To write a PEM private key from ' +\n\t\t    'this source, the node jsbn lib is required.'));\n\t}\n\n\tvar d = new bigInt(key.part.d.data);\n\tvar buf;\n\n\tif (!key.part.dmodp) {\n\t\tvar p = new bigInt(key.part.p.data);\n\t\tvar dmodp = d.mod(p.subtract(1));\n\n\t\tbuf = bigintToMpBuf(dmodp);\n\t\tkey.part.dmodp = {name: 'dmodp', data: buf};\n\t\tkey.parts.push(key.part.dmodp);\n\t}\n\tif (!key.part.dmodq) {\n\t\tvar q = new bigInt(key.part.q.data);\n\t\tvar dmodq = d.mod(q.subtract(1));\n\n\t\tbuf = bigintToMpBuf(dmodq);\n\t\tkey.part.dmodq = {name: 'dmodq', data: buf};\n\t\tkey.parts.push(key.part.dmodq);\n\t}\n}\n\nfunction publicFromPrivateECDSA(curveName, priv) {\n\tassert.string(curveName, 'curveName');\n\tassert.buffer(priv);\n\tif (ec === undefined)\n\t\tec = __webpack_require__(140);\n\tif (jsbn === undefined)\n\t\tjsbn = __webpack_require__(81).BigInteger;\n\tvar params = algs.curves[curveName];\n\tvar p = new jsbn(params.p);\n\tvar a = new jsbn(params.a);\n\tvar b = new jsbn(params.b);\n\tvar curve = new ec.ECCurveFp(p, a, b);\n\tvar G = curve.decodePointHex(params.G.toString('hex'));\n\n\tvar d = new jsbn(mpNormalize(priv));\n\tvar pub = G.multiply(d);\n\tpub = Buffer.from(curve.encodePointHex(pub), 'hex');\n\n\tvar parts = [];\n\tparts.push({name: 'curve', data: Buffer.from(curveName)});\n\tparts.push({name: 'Q', data: pub});\n\n\tvar key = new Key({type: 'ecdsa', curve: curve, parts: parts});\n\treturn (key);\n}\n\nfunction opensshCipherInfo(cipher) {\n\tvar inf = {};\n\tswitch (cipher) {\n\tcase '3des-cbc':\n\t\tinf.keySize = 24;\n\t\tinf.blockSize = 8;\n\t\tinf.opensslName = 'des-ede3-cbc';\n\t\tbreak;\n\tcase 'blowfish-cbc':\n\t\tinf.keySize = 16;\n\t\tinf.blockSize = 8;\n\t\tinf.opensslName = 'bf-cbc';\n\t\tbreak;\n\tcase 'aes128-cbc':\n\tcase 'aes128-ctr':\n\tcase 'aes128-gcm@openssh.com':\n\t\tinf.keySize = 16;\n\t\tinf.blockSize = 16;\n\t\tinf.opensslName = 'aes-128-' + cipher.slice(7, 10);\n\t\tbreak;\n\tcase 'aes192-cbc':\n\tcase 'aes192-ctr':\n\tcase 'aes192-gcm@openssh.com':\n\t\tinf.keySize = 24;\n\t\tinf.blockSize = 16;\n\t\tinf.opensslName = 'aes-192-' + cipher.slice(7, 10);\n\t\tbreak;\n\tcase 'aes256-cbc':\n\tcase 'aes256-ctr':\n\tcase 'aes256-gcm@openssh.com':\n\t\tinf.keySize = 32;\n\t\tinf.blockSize = 16;\n\t\tinf.opensslName = 'aes-256-' + cipher.slice(7, 10);\n\t\tbreak;\n\tdefault:\n\t\tthrow (new Error(\n\t\t    'Unsupported openssl cipher \"' + cipher + '\"'));\n\t}\n\treturn (inf);\n}\n\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst escapeStringRegexp = __webpack_require__(382);\nconst ansiStyles = __webpack_require__(474);\nconst stdoutColor = __webpack_require__(566).stdout;\n\nconst template = __webpack_require__(567);\n\nconst isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m'];\n\n// `color-convert` models to exclude from the Chalk API due to conflicts and such\nconst skipModels = new Set(['gray']);\n\nconst styles = Object.create(null);\n\nfunction applyOptions(obj, options) {\n\toptions = options || {};\n\n\t// Detect level if not set manually\n\tconst scLevel = stdoutColor ? stdoutColor.level : 0;\n\tobj.level = options.level === undefined ? scLevel : options.level;\n\tobj.enabled = 'enabled' in options ? options.enabled : obj.level > 0;\n}\n\nfunction Chalk(options) {\n\t// We check for this.template here since calling `chalk.constructor()`\n\t// by itself will have a `this` of a previously constructed chalk object\n\tif (!this || !(this instanceof Chalk) || this.template) {\n\t\tconst chalk = {};\n\t\tapplyOptions(chalk, options);\n\n\t\tchalk.template = function () {\n\t\t\tconst args = [].slice.call(arguments);\n\t\t\treturn chalkTag.apply(null, [chalk.template].concat(args));\n\t\t};\n\n\t\tObject.setPrototypeOf(chalk, Chalk.prototype);\n\t\tObject.setPrototypeOf(chalk.template, chalk);\n\n\t\tchalk.template.constructor = Chalk;\n\n\t\treturn chalk.template;\n\t}\n\n\tapplyOptions(this, options);\n}\n\n// Use bright blue on Windows as the normal blue color is illegible\nif (isSimpleWindowsTerm) {\n\tansiStyles.blue.open = '\\u001B[94m';\n}\n\nfor (const key of Object.keys(ansiStyles)) {\n\tansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');\n\n\tstyles[key] = {\n\t\tget() {\n\t\t\tconst codes = ansiStyles[key];\n\t\t\treturn build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key);\n\t\t}\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\treturn build.call(this, this._styles || [], true, 'visible');\n\t}\n};\n\nansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g');\nfor (const model of Object.keys(ansiStyles.color.ansi)) {\n\tif (skipModels.has(model)) {\n\t\tcontinue;\n\t}\n\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst level = this.level;\n\t\t\treturn function () {\n\t\t\t\tconst open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments);\n\t\t\t\tconst codes = {\n\t\t\t\t\topen,\n\t\t\t\t\tclose: ansiStyles.color.close,\n\t\t\t\t\tcloseRe: ansiStyles.color.closeRe\n\t\t\t\t};\n\t\t\t\treturn build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);\n\t\t\t};\n\t\t}\n\t};\n}\n\nansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g');\nfor (const model of Object.keys(ansiStyles.bgColor.ansi)) {\n\tif (skipModels.has(model)) {\n\t\tcontinue;\n\t}\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst level = this.level;\n\t\t\treturn function () {\n\t\t\t\tconst open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments);\n\t\t\t\tconst codes = {\n\t\t\t\t\topen,\n\t\t\t\t\tclose: ansiStyles.bgColor.close,\n\t\t\t\t\tcloseRe: ansiStyles.bgColor.closeRe\n\t\t\t\t};\n\t\t\t\treturn build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model);\n\t\t\t};\n\t\t}\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, styles);\n\nfunction build(_styles, _empty, key) {\n\tconst builder = function () {\n\t\treturn applyStyle.apply(builder, arguments);\n\t};\n\n\tbuilder._styles = _styles;\n\tbuilder._empty = _empty;\n\n\tconst self = this;\n\n\tObject.defineProperty(builder, 'level', {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn self.level;\n\t\t},\n\t\tset(level) {\n\t\t\tself.level = level;\n\t\t}\n\t});\n\n\tObject.defineProperty(builder, 'enabled', {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn self.enabled;\n\t\t},\n\t\tset(enabled) {\n\t\t\tself.enabled = enabled;\n\t\t}\n\t});\n\n\t// See below for fix regarding invisible grey/dim combination on Windows\n\tbuilder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey';\n\n\t// `__proto__` is used because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tbuilder.__proto__ = proto; // eslint-disable-line no-proto\n\n\treturn builder;\n}\n\nfunction applyStyle() {\n\t// Support varags, but simply cast to string in case there's only one arg\n\tconst args = arguments;\n\tconst argsLen = args.length;\n\tlet str = String(arguments[0]);\n\n\tif (argsLen === 0) {\n\t\treturn '';\n\t}\n\n\tif (argsLen > 1) {\n\t\t// Don't slice `arguments`, it prevents V8 optimizations\n\t\tfor (let a = 1; a < argsLen; a++) {\n\t\t\tstr += ' ' + args[a];\n\t\t}\n\t}\n\n\tif (!this.enabled || this.level <= 0 || !str) {\n\t\treturn this._empty ? '' : str;\n\t}\n\n\t// Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,\n\t// see https://github.com/chalk/chalk/issues/58\n\t// If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.\n\tconst originalDim = ansiStyles.dim.open;\n\tif (isSimpleWindowsTerm && this.hasGrey) {\n\t\tansiStyles.dim.open = '';\n\t}\n\n\tfor (const code of this._styles.slice().reverse()) {\n\t\t// Replace any instances already present with a re-opening code\n\t\t// otherwise only the part of the string until said closing code\n\t\t// will be colored, and the rest will simply be 'plain'.\n\t\tstr = code.open + str.replace(code.closeRe, code.open) + code.close;\n\n\t\t// Close the styling before a linebreak and reopen\n\t\t// after next line to fix a bleed issue on macOS\n\t\t// https://github.com/chalk/chalk/pull/92\n\t\tstr = str.replace(/\\r?\\n/g, `${code.close}$&${code.open}`);\n\t}\n\n\t// Reset the original `dim` if we changed it to work around the Windows dimmed gray issue\n\tansiStyles.dim.open = originalDim;\n\n\treturn str;\n}\n\nfunction chalkTag(chalk, strings) {\n\tif (!Array.isArray(strings)) {\n\t\t// If chalk() was called by itself or with a string,\n\t\t// return the string itself as a string.\n\t\treturn [].slice.call(arguments, 1).join(' ');\n\t}\n\n\tconst args = [].slice.call(arguments, 2);\n\tconst parts = [strings.raw[0]];\n\n\tfor (let i = 1; i < strings.length; i++) {\n\t\tparts.push(String(args[i - 1]).replace(/[{}\\\\]/g, '\\\\$&'));\n\t\tparts.push(String(strings.raw[i]));\n\t}\n\n\treturn template(chalk, parts.join(''));\n}\n\nObject.defineProperties(Chalk.prototype, styles);\n\nmodule.exports = Chalk(); // eslint-disable-line new-cap\nmodule.exports.supportsColor = stdoutColor;\nmodule.exports.default = module.exports; // For TypeScript\n\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2017 Joyent, Inc.\n\nmodule.exports = Key;\n\nvar assert = __webpack_require__(16);\nvar algs = __webpack_require__(32);\nvar crypto = __webpack_require__(11);\nvar Fingerprint = __webpack_require__(157);\nvar Signature = __webpack_require__(75);\nvar DiffieHellman = __webpack_require__(326).DiffieHellman;\nvar errs = __webpack_require__(74);\nvar utils = __webpack_require__(26);\nvar PrivateKey = __webpack_require__(33);\nvar edCompat;\n\ntry {\n\tedCompat = __webpack_require__(454);\n} catch (e) {\n\t/* Just continue through, and bail out if we try to use it. */\n}\n\nvar InvalidAlgorithmError = errs.InvalidAlgorithmError;\nvar KeyParseError = errs.KeyParseError;\n\nvar formats = {};\nformats['auto'] = __webpack_require__(455);\nformats['pem'] = __webpack_require__(86);\nformats['pkcs1'] = __webpack_require__(328);\nformats['pkcs8'] = __webpack_require__(158);\nformats['rfc4253'] = __webpack_require__(103);\nformats['ssh'] = __webpack_require__(456);\nformats['ssh-private'] = __webpack_require__(193);\nformats['openssh'] = formats['ssh-private'];\nformats['dnssec'] = __webpack_require__(327);\n\nfunction Key(opts) {\n\tassert.object(opts, 'options');\n\tassert.arrayOfObject(opts.parts, 'options.parts');\n\tassert.string(opts.type, 'options.type');\n\tassert.optionalString(opts.comment, 'options.comment');\n\n\tvar algInfo = algs.info[opts.type];\n\tif (typeof (algInfo) !== 'object')\n\t\tthrow (new InvalidAlgorithmError(opts.type));\n\n\tvar partLookup = {};\n\tfor (var i = 0; i < opts.parts.length; ++i) {\n\t\tvar part = opts.parts[i];\n\t\tpartLookup[part.name] = part;\n\t}\n\n\tthis.type = opts.type;\n\tthis.parts = opts.parts;\n\tthis.part = partLookup;\n\tthis.comment = undefined;\n\tthis.source = opts.source;\n\n\t/* for speeding up hashing/fingerprint operations */\n\tthis._rfc4253Cache = opts._rfc4253Cache;\n\tthis._hashCache = {};\n\n\tvar sz;\n\tthis.curve = undefined;\n\tif (this.type === 'ecdsa') {\n\t\tvar curve = this.part.curve.data.toString();\n\t\tthis.curve = curve;\n\t\tsz = algs.curves[curve].size;\n\t} else if (this.type === 'ed25519' || this.type === 'curve25519') {\n\t\tsz = 256;\n\t\tthis.curve = 'curve25519';\n\t} else {\n\t\tvar szPart = this.part[algInfo.sizePart];\n\t\tsz = szPart.data.length;\n\t\tsz = sz * 8 - utils.countZeros(szPart.data);\n\t}\n\tthis.size = sz;\n}\n\nKey.formats = formats;\n\nKey.prototype.toBuffer = function (format, options) {\n\tif (format === undefined)\n\t\tformat = 'ssh';\n\tassert.string(format, 'format');\n\tassert.object(formats[format], 'formats[format]');\n\tassert.optionalObject(options, 'options');\n\n\tif (format === 'rfc4253') {\n\t\tif (this._rfc4253Cache === undefined)\n\t\t\tthis._rfc4253Cache = formats['rfc4253'].write(this);\n\t\treturn (this._rfc4253Cache);\n\t}\n\n\treturn (formats[format].write(this, options));\n};\n\nKey.prototype.toString = function (format, options) {\n\treturn (this.toBuffer(format, options).toString());\n};\n\nKey.prototype.hash = function (algo) {\n\tassert.string(algo, 'algorithm');\n\talgo = algo.toLowerCase();\n\tif (algs.hashAlgs[algo] === undefined)\n\t\tthrow (new InvalidAlgorithmError(algo));\n\n\tif (this._hashCache[algo])\n\t\treturn (this._hashCache[algo]);\n\tvar hash = crypto.createHash(algo).\n\t    update(this.toBuffer('rfc4253')).digest();\n\tthis._hashCache[algo] = hash;\n\treturn (hash);\n};\n\nKey.prototype.fingerprint = function (algo) {\n\tif (algo === undefined)\n\t\talgo = 'sha256';\n\tassert.string(algo, 'algorithm');\n\tvar opts = {\n\t\ttype: 'key',\n\t\thash: this.hash(algo),\n\t\talgorithm: algo\n\t};\n\treturn (new Fingerprint(opts));\n};\n\nKey.prototype.defaultHashAlgorithm = function () {\n\tvar hashAlgo = 'sha1';\n\tif (this.type === 'rsa')\n\t\thashAlgo = 'sha256';\n\tif (this.type === 'dsa' && this.size > 1024)\n\t\thashAlgo = 'sha256';\n\tif (this.type === 'ed25519')\n\t\thashAlgo = 'sha512';\n\tif (this.type === 'ecdsa') {\n\t\tif (this.size <= 256)\n\t\t\thashAlgo = 'sha256';\n\t\telse if (this.size <= 384)\n\t\t\thashAlgo = 'sha384';\n\t\telse\n\t\t\thashAlgo = 'sha512';\n\t}\n\treturn (hashAlgo);\n};\n\nKey.prototype.createVerify = function (hashAlgo) {\n\tif (hashAlgo === undefined)\n\t\thashAlgo = this.defaultHashAlgorithm();\n\tassert.string(hashAlgo, 'hash algorithm');\n\n\t/* ED25519 is not supported by OpenSSL, use a javascript impl. */\n\tif (this.type === 'ed25519' && edCompat !== undefined)\n\t\treturn (new edCompat.Verifier(this, hashAlgo));\n\tif (this.type === 'curve25519')\n\t\tthrow (new Error('Curve25519 keys are not suitable for ' +\n\t\t    'signing or verification'));\n\n\tvar v, nm, err;\n\ttry {\n\t\tnm = hashAlgo.toUpperCase();\n\t\tv = crypto.createVerify(nm);\n\t} catch (e) {\n\t\terr = e;\n\t}\n\tif (v === undefined || (err instanceof Error &&\n\t    err.message.match(/Unknown message digest/))) {\n\t\tnm = 'RSA-';\n\t\tnm += hashAlgo.toUpperCase();\n\t\tv = crypto.createVerify(nm);\n\t}\n\tassert.ok(v, 'failed to create verifier');\n\tvar oldVerify = v.verify.bind(v);\n\tvar key = this.toBuffer('pkcs8');\n\tvar curve = this.curve;\n\tvar self = this;\n\tv.verify = function (signature, fmt) {\n\t\tif (Signature.isSignature(signature, [2, 0])) {\n\t\t\tif (signature.type !== self.type)\n\t\t\t\treturn (false);\n\t\t\tif (signature.hashAlgorithm &&\n\t\t\t    signature.hashAlgorithm !== hashAlgo)\n\t\t\t\treturn (false);\n\t\t\tif (signature.curve && self.type === 'ecdsa' &&\n\t\t\t    signature.curve !== curve)\n\t\t\t\treturn (false);\n\t\t\treturn (oldVerify(key, signature.toBuffer('asn1')));\n\n\t\t} else if (typeof (signature) === 'string' ||\n\t\t    Buffer.isBuffer(signature)) {\n\t\t\treturn (oldVerify(key, signature, fmt));\n\n\t\t/*\n\t\t * Avoid doing this on valid arguments, walking the prototype\n\t\t * chain can be quite slow.\n\t\t */\n\t\t} else if (Signature.isSignature(signature, [1, 0])) {\n\t\t\tthrow (new Error('signature was created by too old ' +\n\t\t\t    'a version of sshpk and cannot be verified'));\n\n\t\t} else {\n\t\t\tthrow (new TypeError('signature must be a string, ' +\n\t\t\t    'Buffer, or Signature object'));\n\t\t}\n\t};\n\treturn (v);\n};\n\nKey.prototype.createDiffieHellman = function () {\n\tif (this.type === 'rsa')\n\t\tthrow (new Error('RSA keys do not support Diffie-Hellman'));\n\n\treturn (new DiffieHellman(this));\n};\nKey.prototype.createDH = Key.prototype.createDiffieHellman;\n\nKey.parse = function (data, format, options) {\n\tif (typeof (data) !== 'string')\n\t\tassert.buffer(data, 'data');\n\tif (format === undefined)\n\t\tformat = 'auto';\n\tassert.string(format, 'format');\n\tif (typeof (options) === 'string')\n\t\toptions = { filename: options };\n\tassert.optionalObject(options, 'options');\n\tif (options === undefined)\n\t\toptions = {};\n\tassert.optionalString(options.filename, 'options.filename');\n\tif (options.filename === undefined)\n\t\toptions.filename = '(unnamed)';\n\n\tassert.object(formats[format], 'formats[format]');\n\n\ttry {\n\t\tvar k = formats[format].read(data, options);\n\t\tif (k instanceof PrivateKey)\n\t\t\tk = k.toPublic();\n\t\tif (!k.comment)\n\t\t\tk.comment = options.filename;\n\t\treturn (k);\n\t} catch (e) {\n\t\tif (e.name === 'KeyEncryptedError')\n\t\t\tthrow (e);\n\t\tthrow (new KeyParseError(options.filename, format, e));\n\t}\n};\n\nKey.isKey = function (obj, ver) {\n\treturn (utils.isCompatible(obj, Key, ver));\n};\n\n/*\n * API versions for Key:\n * [1,0] -- initial ver, may take Signature for createVerify or may not\n * [1,1] -- added pkcs1, pkcs8 formats\n * [1,2] -- added auto, ssh-private, openssh formats\n * [1,3] -- added defaultHashAlgorithm\n * [1,4] -- added ed support, createDH\n * [1,5] -- first explicitly tagged version\n * [1,6] -- changed ed25519 part names\n */\nKey.prototype._sshpkApiVersion = [1, 6];\n\nKey._oldVersionDetect = function (obj) {\n\tassert.func(obj.toBuffer);\n\tassert.func(obj.fingerprint);\n\tif (obj.createDH)\n\t\treturn ([1, 4]);\n\tif (obj.defaultHashAlgorithm)\n\t\treturn ([1, 3]);\n\tif (obj.formats['auto'])\n\t\treturn ([1, 2]);\n\tif (obj.formats['pkcs1'])\n\t\treturn ([1, 1]);\n\treturn ([1, 0]);\n};\n\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"assert\");\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = nullify;\nfunction nullify(obj = {}) {\n  if (Array.isArray(obj)) {\n    for (var _iterator = obj, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const item = _ref;\n\n      nullify(item);\n    }\n  } else if (obj !== null && typeof obj === 'object' || typeof obj === 'function') {\n    Object.setPrototypeOf(obj, null);\n\n    // for..in can only be applied to 'object', not 'function'\n    if (typeof obj === 'object') {\n      for (const key in obj) {\n        nullify(obj[key]);\n      }\n    }\n  }\n\n  return obj;\n}\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports) {\n\nvar core = module.exports = { version: '2.5.7' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nvar Buffer = __webpack_require__(15).Buffer;\n\nvar algInfo = {\n\t'dsa': {\n\t\tparts: ['p', 'q', 'g', 'y'],\n\t\tsizePart: 'p'\n\t},\n\t'rsa': {\n\t\tparts: ['e', 'n'],\n\t\tsizePart: 'n'\n\t},\n\t'ecdsa': {\n\t\tparts: ['curve', 'Q'],\n\t\tsizePart: 'Q'\n\t},\n\t'ed25519': {\n\t\tparts: ['A'],\n\t\tsizePart: 'A'\n\t}\n};\nalgInfo['curve25519'] = algInfo['ed25519'];\n\nvar algPrivInfo = {\n\t'dsa': {\n\t\tparts: ['p', 'q', 'g', 'y', 'x']\n\t},\n\t'rsa': {\n\t\tparts: ['n', 'e', 'd', 'iqmp', 'p', 'q']\n\t},\n\t'ecdsa': {\n\t\tparts: ['curve', 'Q', 'd']\n\t},\n\t'ed25519': {\n\t\tparts: ['A', 'k']\n\t}\n};\nalgPrivInfo['curve25519'] = algPrivInfo['ed25519'];\n\nvar hashAlgs = {\n\t'md5': true,\n\t'sha1': true,\n\t'sha256': true,\n\t'sha384': true,\n\t'sha512': true\n};\n\n/*\n * Taken from\n * http://csrc.nist.gov/groups/ST/toolkit/documents/dss/NISTReCur.pdf\n */\nvar curves = {\n\t'nistp256': {\n\t\tsize: 256,\n\t\tpkcs8oid: '1.2.840.10045.3.1.7',\n\t\tp: Buffer.from(('00' +\n\t\t    'ffffffff 00000001 00000000 00000000' +\n\t\t    '00000000 ffffffff ffffffff ffffffff').\n\t\t    replace(/ /g, ''), 'hex'),\n\t\ta: Buffer.from(('00' +\n\t\t    'FFFFFFFF 00000001 00000000 00000000' +\n\t\t    '00000000 FFFFFFFF FFFFFFFF FFFFFFFC').\n\t\t    replace(/ /g, ''), 'hex'),\n\t\tb: Buffer.from((\n\t\t    '5ac635d8 aa3a93e7 b3ebbd55 769886bc' +\n\t\t    '651d06b0 cc53b0f6 3bce3c3e 27d2604b').\n\t\t    replace(/ /g, ''), 'hex'),\n\t\ts: Buffer.from(('00' +\n\t\t    'c49d3608 86e70493 6a6678e1 139d26b7' +\n\t\t    '819f7e90').\n\t\t    replace(/ /g, ''), 'hex'),\n\t\tn: Buffer.from(('00' +\n\t\t    'ffffffff 00000000 ffffffff ffffffff' +\n\t\t    'bce6faad a7179e84 f3b9cac2 fc632551').\n\t\t    replace(/ /g, ''), 'hex'),\n\t\tG: Buffer.from(('04' +\n\t\t    '6b17d1f2 e12c4247 f8bce6e5 63a440f2' +\n\t\t    '77037d81 2deb33a0 f4a13945 d898c296' +\n\t\t    '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16' +\n\t\t    '2bce3357 6b315ece cbb64068 37bf51f5').\n\t\t    replace(/ /g, ''), 'hex')\n\t},\n\t'nistp384': {\n\t\tsize: 384,\n\t\tpkcs8oid: '1.3.132.0.34',\n\t\tp: Buffer.from(('00' +\n\t\t    'ffffffff ffffffff ffffffff ffffffff' +\n\t\t    'ffffffff ffffffff ffffffff fffffffe' +\n\t\t    'ffffffff 00000000 00000000 ffffffff').\n\t\t    replace(/ /g, ''), 'hex'),\n\t\ta: Buffer.from(('00' +\n\t\t    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +\n\t\t    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE' +\n\t\t    'FFFFFFFF 00000000 00000000 FFFFFFFC').\n\t\t    replace(/ /g, ''), 'hex'),\n\t\tb: Buffer.from((\n\t\t    'b3312fa7 e23ee7e4 988e056b e3f82d19' +\n\t\t    '181d9c6e fe814112 0314088f 5013875a' +\n\t\t    'c656398d 8a2ed19d 2a85c8ed d3ec2aef').\n\t\t    replace(/ /g, ''), 'hex'),\n\t\ts: Buffer.from(('00' +\n\t\t    'a335926a a319a27a 1d00896a 6773a482' +\n\t\t    '7acdac73').\n\t\t    replace(/ /g, ''), 'hex'),\n\t\tn: Buffer.from(('00' +\n\t\t    'ffffffff ffffffff ffffffff ffffffff' +\n\t\t    'ffffffff ffffffff c7634d81 f4372ddf' +\n\t\t    '581a0db2 48b0a77a ecec196a ccc52973').\n\t\t    replace(/ /g, ''), 'hex'),\n\t\tG: Buffer.from(('04' +\n\t\t    'aa87ca22 be8b0537 8eb1c71e f320ad74' +\n\t\t    '6e1d3b62 8ba79b98 59f741e0 82542a38' +\n\t\t    '5502f25d bf55296c 3a545e38 72760ab7' +\n\t\t    '3617de4a 96262c6f 5d9e98bf 9292dc29' +\n\t\t    'f8f41dbd 289a147c e9da3113 b5f0b8c0' +\n\t\t    '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f').\n\t\t    replace(/ /g, ''), 'hex')\n\t},\n\t'nistp521': {\n\t\tsize: 521,\n\t\tpkcs8oid: '1.3.132.0.35',\n\t\tp: Buffer.from((\n\t\t    '01ffffff ffffffff ffffffff ffffffff' +\n\t\t    'ffffffff ffffffff ffffffff ffffffff' +\n\t\t    'ffffffff ffffffff ffffffff ffffffff' +\n\t\t    'ffffffff ffffffff ffffffff ffffffff' +\n\t\t    'ffff').replace(/ /g, ''), 'hex'),\n\t\ta: Buffer.from(('01FF' +\n\t\t    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +\n\t\t    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +\n\t\t    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' +\n\t\t    'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC').\n\t\t    replace(/ /g, ''), 'hex'),\n\t\tb: Buffer.from(('51' +\n\t\t    '953eb961 8e1c9a1f 929a21a0 b68540ee' +\n\t\t    'a2da725b 99b315f3 b8b48991 8ef109e1' +\n\t\t    '56193951 ec7e937b 1652c0bd 3bb1bf07' +\n\t\t    '3573df88 3d2c34f1 ef451fd4 6b503f00').\n\t\t    replace(/ /g, ''), 'hex'),\n\t\ts: Buffer.from(('00' +\n\t\t    'd09e8800 291cb853 96cc6717 393284aa' +\n\t\t    'a0da64ba').replace(/ /g, ''), 'hex'),\n\t\tn: Buffer.from(('01ff' +\n\t\t    'ffffffff ffffffff ffffffff ffffffff' +\n\t\t    'ffffffff ffffffff ffffffff fffffffa' +\n\t\t    '51868783 bf2f966b 7fcc0148 f709a5d0' +\n\t\t    '3bb5c9b8 899c47ae bb6fb71e 91386409').\n\t\t    replace(/ /g, ''), 'hex'),\n\t\tG: Buffer.from(('04' +\n\t\t    '00c6 858e06b7 0404e9cd 9e3ecb66 2395b442' +\n\t\t         '9c648139 053fb521 f828af60 6b4d3dba' +\n\t\t         'a14b5e77 efe75928 fe1dc127 a2ffa8de' +\n\t\t         '3348b3c1 856a429b f97e7e31 c2e5bd66' +\n\t\t    '0118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9' +\n\t\t         '98f54449 579b4468 17afbd17 273e662c' +\n\t\t         '97ee7299 5ef42640 c550b901 3fad0761' +\n\t\t         '353c7086 a272c240 88be9476 9fd16650').\n\t\t    replace(/ /g, ''), 'hex')\n\t}\n};\n\nmodule.exports = {\n\tinfo: algInfo,\n\tprivInfo: algPrivInfo,\n\thashAlgs: hashAlgs,\n\tcurves: curves\n};\n\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2017 Joyent, Inc.\n\nmodule.exports = PrivateKey;\n\nvar assert = __webpack_require__(16);\nvar Buffer = __webpack_require__(15).Buffer;\nvar algs = __webpack_require__(32);\nvar crypto = __webpack_require__(11);\nvar Fingerprint = __webpack_require__(157);\nvar Signature = __webpack_require__(75);\nvar errs = __webpack_require__(74);\nvar util = __webpack_require__(3);\nvar utils = __webpack_require__(26);\nvar dhe = __webpack_require__(326);\nvar generateECDSA = dhe.generateECDSA;\nvar generateED25519 = dhe.generateED25519;\nvar edCompat;\nvar nacl;\n\ntry {\n\tedCompat = __webpack_require__(454);\n} catch (e) {\n\t/* Just continue through, and bail out if we try to use it. */\n}\n\nvar Key = __webpack_require__(28);\n\nvar InvalidAlgorithmError = errs.InvalidAlgorithmError;\nvar KeyParseError = errs.KeyParseError;\nvar KeyEncryptedError = errs.KeyEncryptedError;\n\nvar formats = {};\nformats['auto'] = __webpack_require__(455);\nformats['pem'] = __webpack_require__(86);\nformats['pkcs1'] = __webpack_require__(328);\nformats['pkcs8'] = __webpack_require__(158);\nformats['rfc4253'] = __webpack_require__(103);\nformats['ssh-private'] = __webpack_require__(193);\nformats['openssh'] = formats['ssh-private'];\nformats['ssh'] = formats['ssh-private'];\nformats['dnssec'] = __webpack_require__(327);\n\nfunction PrivateKey(opts) {\n\tassert.object(opts, 'options');\n\tKey.call(this, opts);\n\n\tthis._pubCache = undefined;\n}\nutil.inherits(PrivateKey, Key);\n\nPrivateKey.formats = formats;\n\nPrivateKey.prototype.toBuffer = function (format, options) {\n\tif (format === undefined)\n\t\tformat = 'pkcs1';\n\tassert.string(format, 'format');\n\tassert.object(formats[format], 'formats[format]');\n\tassert.optionalObject(options, 'options');\n\n\treturn (formats[format].write(this, options));\n};\n\nPrivateKey.prototype.hash = function (algo) {\n\treturn (this.toPublic().hash(algo));\n};\n\nPrivateKey.prototype.toPublic = function () {\n\tif (this._pubCache)\n\t\treturn (this._pubCache);\n\n\tvar algInfo = algs.info[this.type];\n\tvar pubParts = [];\n\tfor (var i = 0; i < algInfo.parts.length; ++i) {\n\t\tvar p = algInfo.parts[i];\n\t\tpubParts.push(this.part[p]);\n\t}\n\n\tthis._pubCache = new Key({\n\t\ttype: this.type,\n\t\tsource: this,\n\t\tparts: pubParts\n\t});\n\tif (this.comment)\n\t\tthis._pubCache.comment = this.comment;\n\treturn (this._pubCache);\n};\n\nPrivateKey.prototype.derive = function (newType) {\n\tassert.string(newType, 'type');\n\tvar priv, pub, pair;\n\n\tif (this.type === 'ed25519' && newType === 'curve25519') {\n\t\tif (nacl === undefined)\n\t\t\tnacl = __webpack_require__(76);\n\n\t\tpriv = this.part.k.data;\n\t\tif (priv[0] === 0x00)\n\t\t\tpriv = priv.slice(1);\n\n\t\tpair = nacl.box.keyPair.fromSecretKey(new Uint8Array(priv));\n\t\tpub = Buffer.from(pair.publicKey);\n\n\t\treturn (new PrivateKey({\n\t\t\ttype: 'curve25519',\n\t\t\tparts: [\n\t\t\t\t{ name: 'A', data: utils.mpNormalize(pub) },\n\t\t\t\t{ name: 'k', data: utils.mpNormalize(priv) }\n\t\t\t]\n\t\t}));\n\t} else if (this.type === 'curve25519' && newType === 'ed25519') {\n\t\tif (nacl === undefined)\n\t\t\tnacl = __webpack_require__(76);\n\n\t\tpriv = this.part.k.data;\n\t\tif (priv[0] === 0x00)\n\t\t\tpriv = priv.slice(1);\n\n\t\tpair = nacl.sign.keyPair.fromSeed(new Uint8Array(priv));\n\t\tpub = Buffer.from(pair.publicKey);\n\n\t\treturn (new PrivateKey({\n\t\t\ttype: 'ed25519',\n\t\t\tparts: [\n\t\t\t\t{ name: 'A', data: utils.mpNormalize(pub) },\n\t\t\t\t{ name: 'k', data: utils.mpNormalize(priv) }\n\t\t\t]\n\t\t}));\n\t}\n\tthrow (new Error('Key derivation not supported from ' + this.type +\n\t    ' to ' + newType));\n};\n\nPrivateKey.prototype.createVerify = function (hashAlgo) {\n\treturn (this.toPublic().createVerify(hashAlgo));\n};\n\nPrivateKey.prototype.createSign = function (hashAlgo) {\n\tif (hashAlgo === undefined)\n\t\thashAlgo = this.defaultHashAlgorithm();\n\tassert.string(hashAlgo, 'hash algorithm');\n\n\t/* ED25519 is not supported by OpenSSL, use a javascript impl. */\n\tif (this.type === 'ed25519' && edCompat !== undefined)\n\t\treturn (new edCompat.Signer(this, hashAlgo));\n\tif (this.type === 'curve25519')\n\t\tthrow (new Error('Curve25519 keys are not suitable for ' +\n\t\t    'signing or verification'));\n\n\tvar v, nm, err;\n\ttry {\n\t\tnm = hashAlgo.toUpperCase();\n\t\tv = crypto.createSign(nm);\n\t} catch (e) {\n\t\terr = e;\n\t}\n\tif (v === undefined || (err instanceof Error &&\n\t    err.message.match(/Unknown message digest/))) {\n\t\tnm = 'RSA-';\n\t\tnm += hashAlgo.toUpperCase();\n\t\tv = crypto.createSign(nm);\n\t}\n\tassert.ok(v, 'failed to create verifier');\n\tvar oldSign = v.sign.bind(v);\n\tvar key = this.toBuffer('pkcs1');\n\tvar type = this.type;\n\tvar curve = this.curve;\n\tv.sign = function () {\n\t\tvar sig = oldSign(key);\n\t\tif (typeof (sig) === 'string')\n\t\t\tsig = Buffer.from(sig, 'binary');\n\t\tsig = Signature.parse(sig, type, 'asn1');\n\t\tsig.hashAlgorithm = hashAlgo;\n\t\tsig.curve = curve;\n\t\treturn (sig);\n\t};\n\treturn (v);\n};\n\nPrivateKey.parse = function (data, format, options) {\n\tif (typeof (data) !== 'string')\n\t\tassert.buffer(data, 'data');\n\tif (format === undefined)\n\t\tformat = 'auto';\n\tassert.string(format, 'format');\n\tif (typeof (options) === 'string')\n\t\toptions = { filename: options };\n\tassert.optionalObject(options, 'options');\n\tif (options === undefined)\n\t\toptions = {};\n\tassert.optionalString(options.filename, 'options.filename');\n\tif (options.filename === undefined)\n\t\toptions.filename = '(unnamed)';\n\n\tassert.object(formats[format], 'formats[format]');\n\n\ttry {\n\t\tvar k = formats[format].read(data, options);\n\t\tassert.ok(k instanceof PrivateKey, 'key is not a private key');\n\t\tif (!k.comment)\n\t\t\tk.comment = options.filename;\n\t\treturn (k);\n\t} catch (e) {\n\t\tif (e.name === 'KeyEncryptedError')\n\t\t\tthrow (e);\n\t\tthrow (new KeyParseError(options.filename, format, e));\n\t}\n};\n\nPrivateKey.isPrivateKey = function (obj, ver) {\n\treturn (utils.isCompatible(obj, PrivateKey, ver));\n};\n\nPrivateKey.generate = function (type, options) {\n\tif (options === undefined)\n\t\toptions = {};\n\tassert.object(options, 'options');\n\n\tswitch (type) {\n\tcase 'ecdsa':\n\t\tif (options.curve === undefined)\n\t\t\toptions.curve = 'nistp256';\n\t\tassert.string(options.curve, 'options.curve');\n\t\treturn (generateECDSA(options.curve));\n\tcase 'ed25519':\n\t\treturn (generateED25519());\n\tdefault:\n\t\tthrow (new Error('Key generation not supported with key ' +\n\t\t    'type \"' + type + '\"'));\n\t}\n};\n\n/*\n * API versions for PrivateKey:\n * [1,0] -- initial ver\n * [1,1] -- added auto, pkcs[18], openssh/ssh-private formats\n * [1,2] -- added defaultHashAlgorithm\n * [1,3] -- added derive, ed, createDH\n * [1,4] -- first tagged version\n * [1,5] -- changed ed25519 part names and format\n */\nPrivateKey.prototype._sshpkApiVersion = [1, 5];\n\nPrivateKey._oldVersionDetect = function (obj) {\n\tassert.func(obj.toPublic);\n\tassert.func(obj.createSign);\n\tif (obj.derive)\n\t\treturn ([1, 3]);\n\tif (obj.defaultHashAlgorithm)\n\t\treturn ([1, 2]);\n\tif (obj.formats['auto'])\n\t\treturn ([1, 1]);\n\treturn ([1, 0]);\n};\n\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.wrapLifecycle = exports.run = exports.install = exports.Install = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet install = exports.install = (() => {\n  var _ref29 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, lockfile) {\n    yield wrapLifecycle(config, flags, (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const install = new Install(flags, config, reporter, lockfile);\n      yield install.init();\n    }));\n  });\n\n  return function install(_x7, _x8, _x9, _x10) {\n    return _ref29.apply(this, arguments);\n  };\n})();\n\nlet run = exports.run = (() => {\n  var _ref31 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    let lockfile;\n    let error = 'installCommandRenamed';\n    if (flags.lockfile === false) {\n      lockfile = new (_lockfile || _load_lockfile()).default();\n    } else {\n      lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.lockfileFolder, reporter);\n    }\n\n    if (args.length) {\n      const exampleArgs = args.slice();\n\n      if (flags.saveDev) {\n        exampleArgs.push('--dev');\n      }\n      if (flags.savePeer) {\n        exampleArgs.push('--peer');\n      }\n      if (flags.saveOptional) {\n        exampleArgs.push('--optional');\n      }\n      if (flags.saveExact) {\n        exampleArgs.push('--exact');\n      }\n      if (flags.saveTilde) {\n        exampleArgs.push('--tilde');\n      }\n      let command = 'add';\n      if (flags.global) {\n        error = 'globalFlagRemoved';\n        command = 'global add';\n      }\n      throw new (_errors || _load_errors()).MessageError(reporter.lang(error, `yarn ${command} ${exampleArgs.join(' ')}`));\n    }\n\n    yield install(config, reporter, flags, lockfile);\n  });\n\n  return function run(_x11, _x12, _x13, _x14) {\n    return _ref31.apply(this, arguments);\n  };\n})();\n\nlet wrapLifecycle = exports.wrapLifecycle = (() => {\n  var _ref32 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, flags, factory) {\n    yield config.executeLifecycleScript('preinstall');\n\n    yield factory();\n\n    // npm behaviour, seems kinda funky but yay compatibility\n    yield config.executeLifecycleScript('install');\n    yield config.executeLifecycleScript('postinstall');\n\n    if (!config.production) {\n      if (!config.disablePrepublish) {\n        yield config.executeLifecycleScript('prepublish');\n      }\n      yield config.executeLifecycleScript('prepare');\n    }\n  });\n\n  return function wrapLifecycle(_x15, _x16, _x17) {\n    return _ref32.apply(this, arguments);\n  };\n})();\n\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\n\nvar _objectPath;\n\nfunction _load_objectPath() {\n  return _objectPath = _interopRequireDefault(__webpack_require__(304));\n}\n\nvar _hooks;\n\nfunction _load_hooks() {\n  return _hooks = __webpack_require__(368);\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = _interopRequireDefault(__webpack_require__(218));\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _integrityChecker;\n\nfunction _load_integrityChecker() {\n  return _integrityChecker = _interopRequireDefault(__webpack_require__(206));\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _lockfile2;\n\nfunction _load_lockfile2() {\n  return _lockfile2 = __webpack_require__(19);\n}\n\nvar _packageFetcher;\n\nfunction _load_packageFetcher() {\n  return _packageFetcher = _interopRequireWildcard(__webpack_require__(208));\n}\n\nvar _packageInstallScripts;\n\nfunction _load_packageInstallScripts() {\n  return _packageInstallScripts = _interopRequireDefault(__webpack_require__(525));\n}\n\nvar _packageCompatibility;\n\nfunction _load_packageCompatibility() {\n  return _packageCompatibility = _interopRequireWildcard(__webpack_require__(207));\n}\n\nvar _packageResolver;\n\nfunction _load_packageResolver() {\n  return _packageResolver = _interopRequireDefault(__webpack_require__(360));\n}\n\nvar _packageLinker;\n\nfunction _load_packageLinker() {\n  return _packageLinker = _interopRequireDefault(__webpack_require__(209));\n}\n\nvar _index2;\n\nfunction _load_index2() {\n  return _index2 = __webpack_require__(58);\n}\n\nvar _index3;\n\nfunction _load_index3() {\n  return _index3 = __webpack_require__(78);\n}\n\nvar _autoclean;\n\nfunction _load_autoclean() {\n  return _autoclean = __webpack_require__(348);\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _normalizePattern;\n\nfunction _load_normalizePattern() {\n  return _normalizePattern = __webpack_require__(37);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _map;\n\nfunction _load_map() {\n  return _map = _interopRequireDefault(__webpack_require__(30));\n}\n\nvar _yarnVersion;\n\nfunction _load_yarnVersion() {\n  return _yarnVersion = __webpack_require__(105);\n}\n\nvar _generatePnpMap;\n\nfunction _load_generatePnpMap() {\n  return _generatePnpMap = __webpack_require__(547);\n}\n\nvar _workspaceLayout;\n\nfunction _load_workspaceLayout() {\n  return _workspaceLayout = _interopRequireDefault(__webpack_require__(90));\n}\n\nvar _resolutionMap;\n\nfunction _load_resolutionMap() {\n  return _resolutionMap = _interopRequireDefault(__webpack_require__(212));\n}\n\nvar _guessName;\n\nfunction _load_guessName() {\n  return _guessName = _interopRequireDefault(__webpack_require__(169));\n}\n\nvar _audit;\n\nfunction _load_audit() {\n  return _audit = _interopRequireDefault(__webpack_require__(347));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst deepEqual = __webpack_require__(599);\n\nconst emoji = __webpack_require__(302);\nconst invariant = __webpack_require__(9);\nconst path = __webpack_require__(0);\nconst semver = __webpack_require__(22);\nconst uuid = __webpack_require__(120);\nconst ssri = __webpack_require__(65);\n\nconst ONE_DAY = 1000 * 60 * 60 * 24;\n\n/**\n * Try and detect the installation method for Yarn and provide a command to update it with.\n */\n\nfunction getUpdateCommand(installationMethod) {\n  if (installationMethod === 'tar') {\n    return `curl --compressed -o- -L ${(_constants || _load_constants()).YARN_INSTALLER_SH} | bash`;\n  }\n\n  if (installationMethod === 'homebrew') {\n    return 'brew upgrade yarn';\n  }\n\n  if (installationMethod === 'deb') {\n    return 'sudo apt-get update && sudo apt-get install yarn';\n  }\n\n  if (installationMethod === 'rpm') {\n    return 'sudo yum install yarn';\n  }\n\n  if (installationMethod === 'npm') {\n    return 'npm install --global yarn';\n  }\n\n  if (installationMethod === 'chocolatey') {\n    return 'choco upgrade yarn';\n  }\n\n  if (installationMethod === 'apk') {\n    return 'apk update && apk add -u yarn';\n  }\n\n  if (installationMethod === 'portage') {\n    return 'sudo emerge --sync && sudo emerge -au sys-apps/yarn';\n  }\n\n  return null;\n}\n\nfunction getUpdateInstaller(installationMethod) {\n  // Windows\n  if (installationMethod === 'msi') {\n    return (_constants || _load_constants()).YARN_INSTALLER_MSI;\n  }\n\n  return null;\n}\n\nfunction normalizeFlags(config, rawFlags) {\n  const flags = {\n    // install\n    har: !!rawFlags.har,\n    ignorePlatform: !!rawFlags.ignorePlatform,\n    ignoreEngines: !!rawFlags.ignoreEngines,\n    ignoreScripts: !!rawFlags.ignoreScripts,\n    ignoreOptional: !!rawFlags.ignoreOptional,\n    force: !!rawFlags.force,\n    flat: !!rawFlags.flat,\n    lockfile: rawFlags.lockfile !== false,\n    pureLockfile: !!rawFlags.pureLockfile,\n    updateChecksums: !!rawFlags.updateChecksums,\n    skipIntegrityCheck: !!rawFlags.skipIntegrityCheck,\n    frozenLockfile: !!rawFlags.frozenLockfile,\n    linkDuplicates: !!rawFlags.linkDuplicates,\n    checkFiles: !!rawFlags.checkFiles,\n    audit: !!rawFlags.audit,\n\n    // add\n    peer: !!rawFlags.peer,\n    dev: !!rawFlags.dev,\n    optional: !!rawFlags.optional,\n    exact: !!rawFlags.exact,\n    tilde: !!rawFlags.tilde,\n    ignoreWorkspaceRootCheck: !!rawFlags.ignoreWorkspaceRootCheck,\n\n    // outdated, update-interactive\n    includeWorkspaceDeps: !!rawFlags.includeWorkspaceDeps,\n\n    // add, remove, update\n    workspaceRootIsCwd: rawFlags.workspaceRootIsCwd !== false\n  };\n\n  if (config.getOption('ignore-scripts')) {\n    flags.ignoreScripts = true;\n  }\n\n  if (config.getOption('ignore-platform')) {\n    flags.ignorePlatform = true;\n  }\n\n  if (config.getOption('ignore-engines')) {\n    flags.ignoreEngines = true;\n  }\n\n  if (config.getOption('ignore-optional')) {\n    flags.ignoreOptional = true;\n  }\n\n  if (config.getOption('force')) {\n    flags.force = true;\n  }\n\n  return flags;\n}\n\nclass Install {\n  constructor(flags, config, reporter, lockfile) {\n    this.rootManifestRegistries = [];\n    this.rootPatternsToOrigin = (0, (_map || _load_map()).default)();\n    this.lockfile = lockfile;\n    this.reporter = reporter;\n    this.config = config;\n    this.flags = normalizeFlags(config, flags);\n    this.resolutions = (0, (_map || _load_map()).default)(); // Legacy resolutions field used for flat install mode\n    this.resolutionMap = new (_resolutionMap || _load_resolutionMap()).default(config); // Selective resolutions for nested dependencies\n    this.resolver = new (_packageResolver || _load_packageResolver()).default(config, lockfile, this.resolutionMap);\n    this.integrityChecker = new (_integrityChecker || _load_integrityChecker()).default(config);\n    this.linker = new (_packageLinker || _load_packageLinker()).default(config, this.resolver);\n    this.scripts = new (_packageInstallScripts || _load_packageInstallScripts()).default(config, this.resolver, this.flags.force);\n  }\n\n  /**\n   * Create a list of dependency requests from the current directories manifests.\n   */\n\n  fetchRequestFromCwd(excludePatterns = [], ignoreUnusedPatterns = false) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const patterns = [];\n      const deps = [];\n      let resolutionDeps = [];\n      const manifest = {};\n\n      const ignorePatterns = [];\n      const usedPatterns = [];\n      let workspaceLayout;\n\n      // some commands should always run in the context of the entire workspace\n      const cwd = _this.flags.includeWorkspaceDeps || _this.flags.workspaceRootIsCwd ? _this.config.lockfileFolder : _this.config.cwd;\n\n      // non-workspaces are always root, otherwise check for workspace root\n      const cwdIsRoot = !_this.config.workspaceRootFolder || _this.config.lockfileFolder === cwd;\n\n      // exclude package names that are in install args\n      const excludeNames = [];\n      for (var _iterator = excludePatterns, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref = _i.value;\n        }\n\n        const pattern = _ref;\n\n        if ((0, (_index3 || _load_index3()).getExoticResolver)(pattern)) {\n          excludeNames.push((0, (_guessName || _load_guessName()).default)(pattern));\n        } else {\n          // extract the name\n          const parts = (0, (_normalizePattern || _load_normalizePattern()).normalizePattern)(pattern);\n          excludeNames.push(parts.name);\n        }\n      }\n\n      const stripExcluded = function stripExcluded(manifest) {\n        for (var _iterator2 = excludeNames, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n          var _ref2;\n\n          if (_isArray2) {\n            if (_i2 >= _iterator2.length) break;\n            _ref2 = _iterator2[_i2++];\n          } else {\n            _i2 = _iterator2.next();\n            if (_i2.done) break;\n            _ref2 = _i2.value;\n          }\n\n          const exclude = _ref2;\n\n          if (manifest.dependencies && manifest.dependencies[exclude]) {\n            delete manifest.dependencies[exclude];\n          }\n          if (manifest.devDependencies && manifest.devDependencies[exclude]) {\n            delete manifest.devDependencies[exclude];\n          }\n          if (manifest.optionalDependencies && manifest.optionalDependencies[exclude]) {\n            delete manifest.optionalDependencies[exclude];\n          }\n        }\n      };\n\n      for (var _iterator3 = Object.keys((_index2 || _load_index2()).registries), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n        var _ref3;\n\n        if (_isArray3) {\n          if (_i3 >= _iterator3.length) break;\n          _ref3 = _iterator3[_i3++];\n        } else {\n          _i3 = _iterator3.next();\n          if (_i3.done) break;\n          _ref3 = _i3.value;\n        }\n\n        const registry = _ref3;\n\n        const filename = (_index2 || _load_index2()).registries[registry].filename;\n\n        const loc = path.join(cwd, filename);\n        if (!(yield (_fs || _load_fs()).exists(loc))) {\n          continue;\n        }\n\n        _this.rootManifestRegistries.push(registry);\n\n        const projectManifestJson = yield _this.config.readJson(loc);\n        yield (0, (_index || _load_index()).default)(projectManifestJson, cwd, _this.config, cwdIsRoot);\n\n        Object.assign(_this.resolutions, projectManifestJson.resolutions);\n        Object.assign(manifest, projectManifestJson);\n\n        _this.resolutionMap.init(_this.resolutions);\n        for (var _iterator4 = Object.keys(_this.resolutionMap.resolutionsByPackage), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n          var _ref4;\n\n          if (_isArray4) {\n            if (_i4 >= _iterator4.length) break;\n            _ref4 = _iterator4[_i4++];\n          } else {\n            _i4 = _iterator4.next();\n            if (_i4.done) break;\n            _ref4 = _i4.value;\n          }\n\n          const packageName = _ref4;\n\n          const optional = (_objectPath || _load_objectPath()).default.has(manifest.optionalDependencies, packageName) && _this.flags.ignoreOptional;\n          for (var _iterator8 = _this.resolutionMap.resolutionsByPackage[packageName], _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {\n            var _ref9;\n\n            if (_isArray8) {\n              if (_i8 >= _iterator8.length) break;\n              _ref9 = _iterator8[_i8++];\n            } else {\n              _i8 = _iterator8.next();\n              if (_i8.done) break;\n              _ref9 = _i8.value;\n            }\n\n            const _ref8 = _ref9;\n            const pattern = _ref8.pattern;\n\n            resolutionDeps = [...resolutionDeps, { registry, pattern, optional, hint: 'resolution' }];\n          }\n        }\n\n        const pushDeps = function pushDeps(depType, manifest, { hint, optional }, isUsed) {\n          if (ignoreUnusedPatterns && !isUsed) {\n            return;\n          }\n          // We only take unused dependencies into consideration to get deterministic hoisting.\n          // Since flat mode doesn't care about hoisting and everything is top level and specified then we can safely\n          // leave these out.\n          if (_this.flags.flat && !isUsed) {\n            return;\n          }\n          const depMap = manifest[depType];\n          for (const name in depMap) {\n            if (excludeNames.indexOf(name) >= 0) {\n              continue;\n            }\n\n            let pattern = name;\n            if (!_this.lockfile.getLocked(pattern)) {\n              // when we use --save we save the dependency to the lockfile with just the name rather than the\n              // version combo\n              pattern += '@' + depMap[name];\n            }\n\n            // normalization made sure packages are mentioned only once\n            if (isUsed) {\n              usedPatterns.push(pattern);\n            } else {\n              ignorePatterns.push(pattern);\n            }\n\n            _this.rootPatternsToOrigin[pattern] = depType;\n            patterns.push(pattern);\n            deps.push({ pattern, registry, hint, optional, workspaceName: manifest.name, workspaceLoc: manifest._loc });\n          }\n        };\n\n        if (cwdIsRoot) {\n          pushDeps('dependencies', projectManifestJson, { hint: null, optional: false }, true);\n          pushDeps('devDependencies', projectManifestJson, { hint: 'dev', optional: false }, !_this.config.production);\n          pushDeps('optionalDependencies', projectManifestJson, { hint: 'optional', optional: true }, true);\n        }\n\n        if (_this.config.workspaceRootFolder) {\n          const workspaceLoc = cwdIsRoot ? loc : path.join(_this.config.lockfileFolder, filename);\n          const workspacesRoot = path.dirname(workspaceLoc);\n\n          let workspaceManifestJson = projectManifestJson;\n          if (!cwdIsRoot) {\n            // the manifest we read before was a child workspace, so get the root\n            workspaceManifestJson = yield _this.config.readJson(workspaceLoc);\n            yield (0, (_index || _load_index()).default)(workspaceManifestJson, workspacesRoot, _this.config, true);\n          }\n\n          const workspaces = yield _this.config.resolveWorkspaces(workspacesRoot, workspaceManifestJson);\n          workspaceLayout = new (_workspaceLayout || _load_workspaceLayout()).default(workspaces, _this.config);\n\n          // add virtual manifest that depends on all workspaces, this way package hoisters and resolvers will work fine\n          const workspaceDependencies = (0, (_extends2 || _load_extends()).default)({}, workspaceManifestJson.dependencies);\n          for (var _iterator5 = Object.keys(workspaces), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n            var _ref5;\n\n            if (_isArray5) {\n              if (_i5 >= _iterator5.length) break;\n              _ref5 = _iterator5[_i5++];\n            } else {\n              _i5 = _iterator5.next();\n              if (_i5.done) break;\n              _ref5 = _i5.value;\n            }\n\n            const workspaceName = _ref5;\n\n            const workspaceManifest = workspaces[workspaceName].manifest;\n            workspaceDependencies[workspaceName] = workspaceManifest.version;\n\n            // include dependencies from all workspaces\n            if (_this.flags.includeWorkspaceDeps) {\n              pushDeps('dependencies', workspaceManifest, { hint: null, optional: false }, true);\n              pushDeps('devDependencies', workspaceManifest, { hint: 'dev', optional: false }, !_this.config.production);\n              pushDeps('optionalDependencies', workspaceManifest, { hint: 'optional', optional: true }, true);\n            }\n          }\n          const virtualDependencyManifest = {\n            _uid: '',\n            name: `workspace-aggregator-${uuid.v4()}`,\n            version: '1.0.0',\n            _registry: 'npm',\n            _loc: workspacesRoot,\n            dependencies: workspaceDependencies,\n            devDependencies: (0, (_extends2 || _load_extends()).default)({}, workspaceManifestJson.devDependencies),\n            optionalDependencies: (0, (_extends2 || _load_extends()).default)({}, workspaceManifestJson.optionalDependencies),\n            private: workspaceManifestJson.private,\n            workspaces: workspaceManifestJson.workspaces\n          };\n          workspaceLayout.virtualManifestName = virtualDependencyManifest.name;\n          const virtualDep = {};\n          virtualDep[virtualDependencyManifest.name] = virtualDependencyManifest.version;\n          workspaces[virtualDependencyManifest.name] = { loc: workspacesRoot, manifest: virtualDependencyManifest };\n\n          // ensure dependencies that should be excluded are stripped from the correct manifest\n          stripExcluded(cwdIsRoot ? virtualDependencyManifest : workspaces[projectManifestJson.name].manifest);\n\n          pushDeps('workspaces', { workspaces: virtualDep }, { hint: 'workspaces', optional: false }, true);\n\n          const implicitWorkspaceDependencies = (0, (_extends2 || _load_extends()).default)({}, workspaceDependencies);\n\n          for (var _iterator6 = (_constants || _load_constants()).OWNED_DEPENDENCY_TYPES, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n            var _ref6;\n\n            if (_isArray6) {\n              if (_i6 >= _iterator6.length) break;\n              _ref6 = _iterator6[_i6++];\n            } else {\n              _i6 = _iterator6.next();\n              if (_i6.done) break;\n              _ref6 = _i6.value;\n            }\n\n            const type = _ref6;\n\n            for (var _iterator7 = Object.keys(projectManifestJson[type] || {}), _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {\n              var _ref7;\n\n              if (_isArray7) {\n                if (_i7 >= _iterator7.length) break;\n                _ref7 = _iterator7[_i7++];\n              } else {\n                _i7 = _iterator7.next();\n                if (_i7.done) break;\n                _ref7 = _i7.value;\n              }\n\n              const dependencyName = _ref7;\n\n              delete implicitWorkspaceDependencies[dependencyName];\n            }\n          }\n\n          pushDeps('dependencies', { dependencies: implicitWorkspaceDependencies }, { hint: 'workspaces', optional: false }, true);\n        }\n\n        break;\n      }\n\n      // inherit root flat flag\n      if (manifest.flat) {\n        _this.flags.flat = true;\n      }\n\n      return {\n        requests: [...resolutionDeps, ...deps],\n        patterns,\n        manifest,\n        usedPatterns,\n        ignorePatterns,\n        workspaceLayout\n      };\n    })();\n  }\n\n  /**\n   * TODO description\n   */\n\n  prepareRequests(requests) {\n    return requests;\n  }\n\n  preparePatterns(patterns) {\n    return patterns;\n  }\n  preparePatternsForLinking(patterns, cwdManifest, cwdIsRoot) {\n    return patterns;\n  }\n\n  prepareManifests() {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const manifests = yield _this2.config.getRootManifests();\n      return manifests;\n    })();\n  }\n\n  bailout(patterns, workspaceLayout) {\n    var _this3 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      // We don't want to skip the audit - it could yield important errors\n      if (_this3.flags.audit) {\n        return false;\n      }\n      // PNP is so fast that the integrity check isn't pertinent\n      if (_this3.config.plugnplayEnabled) {\n        return false;\n      }\n      if (_this3.flags.skipIntegrityCheck || _this3.flags.force) {\n        return false;\n      }\n      const lockfileCache = _this3.lockfile.cache;\n      if (!lockfileCache) {\n        return false;\n      }\n      const lockfileClean = _this3.lockfile.parseResultType === 'success';\n      const match = yield _this3.integrityChecker.check(patterns, lockfileCache, _this3.flags, workspaceLayout);\n      if (_this3.flags.frozenLockfile && (!lockfileClean || match.missingPatterns.length > 0)) {\n        throw new (_errors || _load_errors()).MessageError(_this3.reporter.lang('frozenLockfileError'));\n      }\n\n      const haveLockfile = yield (_fs || _load_fs()).exists(path.join(_this3.config.lockfileFolder, (_constants || _load_constants()).LOCKFILE_FILENAME));\n\n      const lockfileIntegrityPresent = !_this3.lockfile.hasEntriesExistWithoutIntegrity();\n      const integrityBailout = lockfileIntegrityPresent || !_this3.config.autoAddIntegrity;\n\n      if (match.integrityMatches && haveLockfile && lockfileClean && integrityBailout) {\n        _this3.reporter.success(_this3.reporter.lang('upToDate'));\n        return true;\n      }\n\n      if (match.integrityFileMissing && haveLockfile) {\n        // Integrity file missing, force script installations\n        _this3.scripts.setForce(true);\n        return false;\n      }\n\n      if (match.hardRefreshRequired) {\n        // e.g. node version doesn't match, force script installations\n        _this3.scripts.setForce(true);\n        return false;\n      }\n\n      if (!patterns.length && !match.integrityFileMissing) {\n        _this3.reporter.success(_this3.reporter.lang('nothingToInstall'));\n        yield _this3.createEmptyManifestFolders();\n        yield _this3.saveLockfileAndIntegrity(patterns, workspaceLayout);\n        return true;\n      }\n\n      return false;\n    })();\n  }\n\n  /**\n   * Produce empty folders for all used root manifests.\n   */\n\n  createEmptyManifestFolders() {\n    var _this4 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      if (_this4.config.modulesFolder) {\n        // already created\n        return;\n      }\n\n      for (var _iterator9 = _this4.rootManifestRegistries, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {\n        var _ref10;\n\n        if (_isArray9) {\n          if (_i9 >= _iterator9.length) break;\n          _ref10 = _iterator9[_i9++];\n        } else {\n          _i9 = _iterator9.next();\n          if (_i9.done) break;\n          _ref10 = _i9.value;\n        }\n\n        const registryName = _ref10;\n        const folder = _this4.config.registries[registryName].folder;\n\n        yield (_fs || _load_fs()).mkdirp(path.join(_this4.config.lockfileFolder, folder));\n      }\n    })();\n  }\n\n  /**\n   * TODO description\n   */\n\n  markIgnored(patterns) {\n    for (var _iterator10 = patterns, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) {\n      var _ref11;\n\n      if (_isArray10) {\n        if (_i10 >= _iterator10.length) break;\n        _ref11 = _iterator10[_i10++];\n      } else {\n        _i10 = _iterator10.next();\n        if (_i10.done) break;\n        _ref11 = _i10.value;\n      }\n\n      const pattern = _ref11;\n\n      const manifest = this.resolver.getStrictResolvedPattern(pattern);\n      const ref = manifest._reference;\n      invariant(ref, 'expected package reference');\n\n      // just mark the package as ignored. if the package is used by a required package, the hoister\n      // will take care of that.\n      ref.ignore = true;\n    }\n  }\n\n  /**\n   * helper method that gets only recent manifests\n   * used by global.ls command\n   */\n  getFlattenedDeps() {\n    var _this5 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      var _ref12 = yield _this5.fetchRequestFromCwd();\n\n      const depRequests = _ref12.requests,\n            rawPatterns = _ref12.patterns;\n\n\n      yield _this5.resolver.init(depRequests, {});\n\n      const manifests = yield (_packageFetcher || _load_packageFetcher()).fetch(_this5.resolver.getManifests(), _this5.config);\n      _this5.resolver.updateManifests(manifests);\n\n      return _this5.flatten(rawPatterns);\n    })();\n  }\n\n  /**\n   * TODO description\n   */\n\n  init() {\n    var _this6 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      _this6.checkUpdate();\n\n      // warn if we have a shrinkwrap\n      if (yield (_fs || _load_fs()).exists(path.join(_this6.config.lockfileFolder, (_constants || _load_constants()).NPM_SHRINKWRAP_FILENAME))) {\n        _this6.reporter.warn(_this6.reporter.lang('shrinkwrapWarning'));\n      }\n\n      // warn if we have an npm lockfile\n      if (yield (_fs || _load_fs()).exists(path.join(_this6.config.lockfileFolder, (_constants || _load_constants()).NPM_LOCK_FILENAME))) {\n        _this6.reporter.warn(_this6.reporter.lang('npmLockfileWarning'));\n      }\n\n      if (_this6.config.plugnplayEnabled) {\n        _this6.reporter.info(_this6.reporter.lang('plugnplaySuggestV2L1'));\n        _this6.reporter.info(_this6.reporter.lang('plugnplaySuggestV2L2'));\n      }\n\n      let flattenedTopLevelPatterns = [];\n      const steps = [];\n\n      var _ref13 = yield _this6.fetchRequestFromCwd();\n\n      const depRequests = _ref13.requests,\n            rawPatterns = _ref13.patterns,\n            ignorePatterns = _ref13.ignorePatterns,\n            workspaceLayout = _ref13.workspaceLayout,\n            manifest = _ref13.manifest;\n\n      let topLevelPatterns = [];\n\n      const artifacts = yield _this6.integrityChecker.getArtifacts();\n      if (artifacts) {\n        _this6.linker.setArtifacts(artifacts);\n        _this6.scripts.setArtifacts(artifacts);\n      }\n\n      if ((_packageCompatibility || _load_packageCompatibility()).shouldCheck(manifest, _this6.flags)) {\n        steps.push((() => {\n          var _ref14 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (curr, total) {\n            _this6.reporter.step(curr, total, _this6.reporter.lang('checkingManifest'), emoji.get('mag'));\n            yield _this6.checkCompatibility();\n          });\n\n          return function (_x, _x2) {\n            return _ref14.apply(this, arguments);\n          };\n        })());\n      }\n\n      const audit = new (_audit || _load_audit()).default(_this6.config, _this6.reporter, { groups: (_constants || _load_constants()).OWNED_DEPENDENCY_TYPES });\n      let auditFoundProblems = false;\n\n      steps.push(function (curr, total) {\n        return (0, (_hooks || _load_hooks()).callThroughHook)('resolveStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n          _this6.reporter.step(curr, total, _this6.reporter.lang('resolvingPackages'), emoji.get('mag'));\n          yield _this6.resolver.init(_this6.prepareRequests(depRequests), {\n            isFlat: _this6.flags.flat,\n            isFrozen: _this6.flags.frozenLockfile,\n            workspaceLayout\n          });\n          topLevelPatterns = _this6.preparePatterns(rawPatterns);\n          flattenedTopLevelPatterns = yield _this6.flatten(topLevelPatterns);\n          return { bailout: !_this6.flags.audit && (yield _this6.bailout(topLevelPatterns, workspaceLayout)) };\n        }));\n      });\n\n      if (_this6.flags.audit) {\n        steps.push(function (curr, total) {\n          return (0, (_hooks || _load_hooks()).callThroughHook)('auditStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n            _this6.reporter.step(curr, total, _this6.reporter.lang('auditRunning'), emoji.get('mag'));\n            if (_this6.flags.offline) {\n              _this6.reporter.warn(_this6.reporter.lang('auditOffline'));\n              return { bailout: false };\n            }\n            const preparedManifests = yield _this6.prepareManifests();\n            // $FlowFixMe - Flow considers `m` in the map operation to be \"mixed\", so does not recognize `m.object`\n            const mergedManifest = Object.assign({}, ...Object.values(preparedManifests).map(function (m) {\n              return m.object;\n            }));\n            const auditVulnerabilityCounts = yield audit.performAudit(mergedManifest, _this6.lockfile, _this6.resolver, _this6.linker, topLevelPatterns);\n            auditFoundProblems = auditVulnerabilityCounts.info || auditVulnerabilityCounts.low || auditVulnerabilityCounts.moderate || auditVulnerabilityCounts.high || auditVulnerabilityCounts.critical;\n            return { bailout: yield _this6.bailout(topLevelPatterns, workspaceLayout) };\n          }));\n        });\n      }\n\n      steps.push(function (curr, total) {\n        return (0, (_hooks || _load_hooks()).callThroughHook)('fetchStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n          _this6.markIgnored(ignorePatterns);\n          _this6.reporter.step(curr, total, _this6.reporter.lang('fetchingPackages'), emoji.get('truck'));\n          const manifests = yield (_packageFetcher || _load_packageFetcher()).fetch(_this6.resolver.getManifests(), _this6.config);\n          _this6.resolver.updateManifests(manifests);\n          yield (_packageCompatibility || _load_packageCompatibility()).check(_this6.resolver.getManifests(), _this6.config, _this6.flags.ignoreEngines);\n        }));\n      });\n\n      steps.push(function (curr, total) {\n        return (0, (_hooks || _load_hooks()).callThroughHook)('linkStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n          // remove integrity hash to make this operation atomic\n          yield _this6.integrityChecker.removeIntegrityFile();\n          _this6.reporter.step(curr, total, _this6.reporter.lang('linkingDependencies'), emoji.get('link'));\n          flattenedTopLevelPatterns = _this6.preparePatternsForLinking(flattenedTopLevelPatterns, manifest, _this6.config.lockfileFolder === _this6.config.cwd);\n          yield _this6.linker.init(flattenedTopLevelPatterns, workspaceLayout, {\n            linkDuplicates: _this6.flags.linkDuplicates,\n            ignoreOptional: _this6.flags.ignoreOptional\n          });\n        }));\n      });\n\n      if (_this6.config.plugnplayEnabled) {\n        steps.push(function (curr, total) {\n          return (0, (_hooks || _load_hooks()).callThroughHook)('pnpStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n            const pnpPath = `${_this6.config.lockfileFolder}/${(_constants || _load_constants()).PNP_FILENAME}`;\n\n            const code = yield (0, (_generatePnpMap || _load_generatePnpMap()).generatePnpMap)(_this6.config, flattenedTopLevelPatterns, {\n              resolver: _this6.resolver,\n              reporter: _this6.reporter,\n              targetPath: pnpPath,\n              workspaceLayout\n            });\n\n            try {\n              const file = yield (_fs || _load_fs()).readFile(pnpPath);\n              if (file === code) {\n                return;\n              }\n            } catch (error) {}\n\n            yield (_fs || _load_fs()).writeFile(pnpPath, code);\n            yield (_fs || _load_fs()).chmod(pnpPath, 0o755);\n          }));\n        });\n      }\n\n      steps.push(function (curr, total) {\n        return (0, (_hooks || _load_hooks()).callThroughHook)('buildStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n          _this6.reporter.step(curr, total, _this6.flags.force ? _this6.reporter.lang('rebuildingPackages') : _this6.reporter.lang('buildingFreshPackages'), emoji.get('hammer'));\n\n          if (_this6.config.ignoreScripts) {\n            _this6.reporter.warn(_this6.reporter.lang('ignoredScripts'));\n          } else {\n            yield _this6.scripts.init(flattenedTopLevelPatterns);\n          }\n        }));\n      });\n\n      if (_this6.flags.har) {\n        steps.push((() => {\n          var _ref21 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (curr, total) {\n            const formattedDate = new Date().toISOString().replace(/:/g, '-');\n            const filename = `yarn-install_${formattedDate}.har`;\n            _this6.reporter.step(curr, total, _this6.reporter.lang('savingHar', filename), emoji.get('black_circle_for_record'));\n            yield _this6.config.requestManager.saveHar(filename);\n          });\n\n          return function (_x3, _x4) {\n            return _ref21.apply(this, arguments);\n          };\n        })());\n      }\n\n      if (yield _this6.shouldClean()) {\n        steps.push((() => {\n          var _ref22 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (curr, total) {\n            _this6.reporter.step(curr, total, _this6.reporter.lang('cleaningModules'), emoji.get('recycle'));\n            yield (0, (_autoclean || _load_autoclean()).clean)(_this6.config, _this6.reporter);\n          });\n\n          return function (_x5, _x6) {\n            return _ref22.apply(this, arguments);\n          };\n        })());\n      }\n\n      let currentStep = 0;\n      for (var _iterator11 = steps, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) {\n        var _ref23;\n\n        if (_isArray11) {\n          if (_i11 >= _iterator11.length) break;\n          _ref23 = _iterator11[_i11++];\n        } else {\n          _i11 = _iterator11.next();\n          if (_i11.done) break;\n          _ref23 = _i11.value;\n        }\n\n        const step = _ref23;\n\n        const stepResult = yield step(++currentStep, steps.length);\n        if (stepResult && stepResult.bailout) {\n          if (_this6.flags.audit) {\n            audit.summary();\n          }\n          if (auditFoundProblems) {\n            _this6.reporter.warn(_this6.reporter.lang('auditRunAuditForDetails'));\n          }\n          _this6.maybeOutputUpdate();\n          return flattenedTopLevelPatterns;\n        }\n      }\n\n      // fin!\n      if (_this6.flags.audit) {\n        audit.summary();\n      }\n      if (auditFoundProblems) {\n        _this6.reporter.warn(_this6.reporter.lang('auditRunAuditForDetails'));\n      }\n      yield _this6.saveLockfileAndIntegrity(topLevelPatterns, workspaceLayout);\n      yield _this6.persistChanges();\n      _this6.maybeOutputUpdate();\n      _this6.config.requestManager.clearCache();\n      return flattenedTopLevelPatterns;\n    })();\n  }\n\n  checkCompatibility() {\n    var _this7 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      var _ref24 = yield _this7.fetchRequestFromCwd();\n\n      const manifest = _ref24.manifest;\n\n      yield (_packageCompatibility || _load_packageCompatibility()).checkOne(manifest, _this7.config, _this7.flags.ignoreEngines);\n    })();\n  }\n\n  persistChanges() {\n    var _this8 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      // get all the different registry manifests in this folder\n      const manifests = yield _this8.config.getRootManifests();\n\n      if (yield _this8.applyChanges(manifests)) {\n        yield _this8.config.saveRootManifests(manifests);\n      }\n    })();\n  }\n\n  applyChanges(manifests) {\n    let hasChanged = false;\n\n    if (this.config.plugnplayPersist) {\n      const object = manifests.npm.object;\n\n\n      if (typeof object.installConfig !== 'object') {\n        object.installConfig = {};\n      }\n\n      if (this.config.plugnplayEnabled && object.installConfig.pnp !== true) {\n        object.installConfig.pnp = true;\n        hasChanged = true;\n      } else if (!this.config.plugnplayEnabled && typeof object.installConfig.pnp !== 'undefined') {\n        delete object.installConfig.pnp;\n        hasChanged = true;\n      }\n\n      if (Object.keys(object.installConfig).length === 0) {\n        delete object.installConfig;\n      }\n    }\n\n    return Promise.resolve(hasChanged);\n  }\n\n  /**\n   * Check if we should run the cleaning step.\n   */\n\n  shouldClean() {\n    return (_fs || _load_fs()).exists(path.join(this.config.lockfileFolder, (_constants || _load_constants()).CLEAN_FILENAME));\n  }\n\n  /**\n   * TODO\n   */\n\n  flatten(patterns) {\n    var _this9 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      if (!_this9.flags.flat) {\n        return patterns;\n      }\n\n      const flattenedPatterns = [];\n\n      for (var _iterator12 = _this9.resolver.getAllDependencyNamesByLevelOrder(patterns), _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) {\n        var _ref25;\n\n        if (_isArray12) {\n          if (_i12 >= _iterator12.length) break;\n          _ref25 = _iterator12[_i12++];\n        } else {\n          _i12 = _iterator12.next();\n          if (_i12.done) break;\n          _ref25 = _i12.value;\n        }\n\n        const name = _ref25;\n\n        const infos = _this9.resolver.getAllInfoForPackageName(name).filter(function (manifest) {\n          const ref = manifest._reference;\n          invariant(ref, 'expected package reference');\n          return !ref.ignore;\n        });\n\n        if (infos.length === 0) {\n          continue;\n        }\n\n        if (infos.length === 1) {\n          // single version of this package\n          // take out a single pattern as multiple patterns may have resolved to this package\n          flattenedPatterns.push(_this9.resolver.patternsByPackage[name][0]);\n          continue;\n        }\n\n        const options = infos.map(function (info) {\n          const ref = info._reference;\n          invariant(ref, 'expected reference');\n          return {\n            // TODO `and is required by {PARENT}`,\n            name: _this9.reporter.lang('manualVersionResolutionOption', ref.patterns.join(', '), info.version),\n\n            value: info.version\n          };\n        });\n        const versions = infos.map(function (info) {\n          return info.version;\n        });\n        let version;\n\n        const resolutionVersion = _this9.resolutions[name];\n        if (resolutionVersion && versions.indexOf(resolutionVersion) >= 0) {\n          // use json `resolution` version\n          version = resolutionVersion;\n        } else {\n          version = yield _this9.reporter.select(_this9.reporter.lang('manualVersionResolution', name), _this9.reporter.lang('answer'), options);\n          _this9.resolutions[name] = version;\n        }\n\n        flattenedPatterns.push(_this9.resolver.collapseAllVersionsOfPackage(name, version));\n      }\n\n      // save resolutions to their appropriate root manifest\n      if (Object.keys(_this9.resolutions).length) {\n        const manifests = yield _this9.config.getRootManifests();\n\n        for (const name in _this9.resolutions) {\n          const version = _this9.resolutions[name];\n\n          const patterns = _this9.resolver.patternsByPackage[name];\n          if (!patterns) {\n            continue;\n          }\n\n          let manifest;\n          for (var _iterator13 = patterns, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) {\n            var _ref26;\n\n            if (_isArray13) {\n              if (_i13 >= _iterator13.length) break;\n              _ref26 = _iterator13[_i13++];\n            } else {\n              _i13 = _iterator13.next();\n              if (_i13.done) break;\n              _ref26 = _i13.value;\n            }\n\n            const pattern = _ref26;\n\n            manifest = _this9.resolver.getResolvedPattern(pattern);\n            if (manifest) {\n              break;\n            }\n          }\n          invariant(manifest, 'expected manifest');\n\n          const ref = manifest._reference;\n          invariant(ref, 'expected reference');\n\n          const object = manifests[ref.registry].object;\n          object.resolutions = object.resolutions || {};\n          object.resolutions[name] = version;\n        }\n\n        yield _this9.config.saveRootManifests(manifests);\n      }\n\n      return flattenedPatterns;\n    })();\n  }\n\n  /**\n   * Remove offline tarballs that are no longer required\n   */\n\n  pruneOfflineMirror(lockfile) {\n    var _this10 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const mirror = _this10.config.getOfflineMirrorPath();\n      if (!mirror) {\n        return;\n      }\n\n      const requiredTarballs = new Set();\n      for (const dependency in lockfile) {\n        const resolved = lockfile[dependency].resolved;\n        if (resolved) {\n          const basename = path.basename(resolved.split('#')[0]);\n          if (dependency[0] === '@' && basename[0] !== '@') {\n            requiredTarballs.add(`${dependency.split('/')[0]}-${basename}`);\n          }\n          requiredTarballs.add(basename);\n        }\n      }\n\n      const mirrorFiles = yield (_fs || _load_fs()).walk(mirror);\n      for (var _iterator14 = mirrorFiles, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) {\n        var _ref27;\n\n        if (_isArray14) {\n          if (_i14 >= _iterator14.length) break;\n          _ref27 = _iterator14[_i14++];\n        } else {\n          _i14 = _iterator14.next();\n          if (_i14.done) break;\n          _ref27 = _i14.value;\n        }\n\n        const file = _ref27;\n\n        const isTarball = path.extname(file.basename) === '.tgz';\n        // if using experimental-pack-script-packages-in-mirror flag, don't unlink prebuilt packages\n        const hasPrebuiltPackage = file.relative.startsWith('prebuilt/');\n        if (isTarball && !hasPrebuiltPackage && !requiredTarballs.has(file.basename)) {\n          yield (_fs || _load_fs()).unlink(file.absolute);\n        }\n      }\n    })();\n  }\n\n  /**\n   * Save updated integrity and lockfiles.\n   */\n\n  saveLockfileAndIntegrity(patterns, workspaceLayout) {\n    var _this11 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const resolvedPatterns = {};\n      Object.keys(_this11.resolver.patterns).forEach(function (pattern) {\n        if (!workspaceLayout || !workspaceLayout.getManifestByPattern(pattern)) {\n          resolvedPatterns[pattern] = _this11.resolver.patterns[pattern];\n        }\n      });\n\n      // TODO this code is duplicated in a few places, need a common way to filter out workspace patterns from lockfile\n      patterns = patterns.filter(function (p) {\n        return !workspaceLayout || !workspaceLayout.getManifestByPattern(p);\n      });\n\n      const lockfileBasedOnResolver = _this11.lockfile.getLockfile(resolvedPatterns);\n\n      if (_this11.config.pruneOfflineMirror) {\n        yield _this11.pruneOfflineMirror(lockfileBasedOnResolver);\n      }\n\n      // write integrity hash\n      if (!_this11.config.plugnplayEnabled) {\n        yield _this11.integrityChecker.save(patterns, lockfileBasedOnResolver, _this11.flags, workspaceLayout, _this11.scripts.getArtifacts());\n      }\n\n      // --no-lockfile or --pure-lockfile or --frozen-lockfile\n      if (_this11.flags.lockfile === false || _this11.flags.pureLockfile || _this11.flags.frozenLockfile) {\n        return;\n      }\n\n      const lockFileHasAllPatterns = patterns.every(function (p) {\n        return _this11.lockfile.getLocked(p);\n      });\n      const lockfilePatternsMatch = Object.keys(_this11.lockfile.cache || {}).every(function (p) {\n        return lockfileBasedOnResolver[p];\n      });\n      const resolverPatternsAreSameAsInLockfile = Object.keys(lockfileBasedOnResolver).every(function (pattern) {\n        const manifest = _this11.lockfile.getLocked(pattern);\n        return manifest && manifest.resolved === lockfileBasedOnResolver[pattern].resolved && deepEqual(manifest.prebuiltVariants, lockfileBasedOnResolver[pattern].prebuiltVariants);\n      });\n      const integrityPatternsAreSameAsInLockfile = Object.keys(lockfileBasedOnResolver).every(function (pattern) {\n        const existingIntegrityInfo = lockfileBasedOnResolver[pattern].integrity;\n        if (!existingIntegrityInfo) {\n          // if this entry does not have an integrity, no need to re-write the lockfile because of it\n          return true;\n        }\n        const manifest = _this11.lockfile.getLocked(pattern);\n        if (manifest && manifest.integrity) {\n          const manifestIntegrity = ssri.stringify(manifest.integrity);\n          return manifestIntegrity === existingIntegrityInfo;\n        }\n        return false;\n      });\n\n      // remove command is followed by install with force, lockfile will be rewritten in any case then\n      if (!_this11.flags.force && _this11.lockfile.parseResultType === 'success' && lockFileHasAllPatterns && lockfilePatternsMatch && resolverPatternsAreSameAsInLockfile && integrityPatternsAreSameAsInLockfile && patterns.length) {\n        return;\n      }\n\n      // build lockfile location\n      const loc = path.join(_this11.config.lockfileFolder, (_constants || _load_constants()).LOCKFILE_FILENAME);\n\n      // write lockfile\n      const lockSource = (0, (_lockfile2 || _load_lockfile2()).stringify)(lockfileBasedOnResolver, false, _this11.config.enableLockfileVersions);\n      yield (_fs || _load_fs()).writeFilePreservingEol(loc, lockSource);\n\n      _this11._logSuccessSaveLockfile();\n    })();\n  }\n\n  _logSuccessSaveLockfile() {\n    this.reporter.success(this.reporter.lang('savedLockfile'));\n  }\n\n  /**\n   * Load the dependency graph of the current install. Only does package resolving and wont write to the cwd.\n   */\n  hydrate(ignoreUnusedPatterns) {\n    var _this12 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const request = yield _this12.fetchRequestFromCwd([], ignoreUnusedPatterns);\n      const depRequests = request.requests,\n            rawPatterns = request.patterns,\n            ignorePatterns = request.ignorePatterns,\n            workspaceLayout = request.workspaceLayout;\n\n\n      yield _this12.resolver.init(depRequests, {\n        isFlat: _this12.flags.flat,\n        isFrozen: _this12.flags.frozenLockfile,\n        workspaceLayout\n      });\n      yield _this12.flatten(rawPatterns);\n      _this12.markIgnored(ignorePatterns);\n\n      // fetch packages, should hit cache most of the time\n      const manifests = yield (_packageFetcher || _load_packageFetcher()).fetch(_this12.resolver.getManifests(), _this12.config);\n      _this12.resolver.updateManifests(manifests);\n      yield (_packageCompatibility || _load_packageCompatibility()).check(_this12.resolver.getManifests(), _this12.config, _this12.flags.ignoreEngines);\n\n      // expand minimal manifests\n      for (var _iterator15 = _this12.resolver.getManifests(), _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) {\n        var _ref28;\n\n        if (_isArray15) {\n          if (_i15 >= _iterator15.length) break;\n          _ref28 = _iterator15[_i15++];\n        } else {\n          _i15 = _iterator15.next();\n          if (_i15.done) break;\n          _ref28 = _i15.value;\n        }\n\n        const manifest = _ref28;\n\n        const ref = manifest._reference;\n        invariant(ref, 'expected reference');\n        const type = ref.remote.type;\n        // link specifier won't ever hit cache\n\n        let loc = '';\n        if (type === 'link') {\n          continue;\n        } else if (type === 'workspace') {\n          if (!ref.remote.reference) {\n            continue;\n          }\n          loc = ref.remote.reference;\n        } else {\n          loc = _this12.config.generateModuleCachePath(ref);\n        }\n        const newPkg = yield _this12.config.readManifest(loc);\n        yield _this12.resolver.updateManifest(ref, newPkg);\n      }\n\n      return request;\n    })();\n  }\n\n  /**\n   * Check for updates every day and output a nag message if there's a newer version.\n   */\n\n  checkUpdate() {\n    if (this.config.nonInteractive) {\n      // don't show upgrade dialog on CI or non-TTY terminals\n      return;\n    }\n\n    // don't check if disabled\n    if (this.config.getOption('disable-self-update-check')) {\n      return;\n    }\n\n    // only check for updates once a day\n    const lastUpdateCheck = Number(this.config.getOption('lastUpdateCheck')) || 0;\n    if (lastUpdateCheck && Date.now() - lastUpdateCheck < ONE_DAY) {\n      return;\n    }\n\n    // don't bug for updates on tagged releases\n    if ((_yarnVersion || _load_yarnVersion()).version.indexOf('-') >= 0) {\n      return;\n    }\n\n    this._checkUpdate().catch(() => {\n      // swallow errors\n    });\n  }\n\n  _checkUpdate() {\n    var _this13 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      let latestVersion = yield _this13.config.requestManager.request({\n        url: (_constants || _load_constants()).SELF_UPDATE_VERSION_URL\n      });\n      invariant(typeof latestVersion === 'string', 'expected string');\n      latestVersion = latestVersion.trim();\n      if (!semver.valid(latestVersion)) {\n        return;\n      }\n\n      // ensure we only check for updates periodically\n      _this13.config.registries.yarn.saveHomeConfig({\n        lastUpdateCheck: Date.now()\n      });\n\n      if (semver.gt(latestVersion, (_yarnVersion || _load_yarnVersion()).version)) {\n        const installationMethod = yield (0, (_yarnVersion || _load_yarnVersion()).getInstallationMethod)();\n        _this13.maybeOutputUpdate = function () {\n          _this13.reporter.warn(_this13.reporter.lang('yarnOutdated', latestVersion, (_yarnVersion || _load_yarnVersion()).version));\n\n          const command = getUpdateCommand(installationMethod);\n          if (command) {\n            _this13.reporter.info(_this13.reporter.lang('yarnOutdatedCommand'));\n            _this13.reporter.command(command);\n          } else {\n            const installer = getUpdateInstaller(installationMethod);\n            if (installer) {\n              _this13.reporter.info(_this13.reporter.lang('yarnOutdatedInstaller', installer));\n            }\n          }\n        };\n      }\n    })();\n  }\n\n  /**\n   * Method to override with a possible upgrade message.\n   */\n\n  maybeOutputUpdate() {}\n}\n\nexports.Install = Install;\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\nfunction setFlags(commander) {\n  commander.description('Yarn install is used to install all dependencies for a project.');\n  commander.usage('install [flags]');\n  commander.option('-A, --audit', 'Run vulnerability audit on installed packages');\n  commander.option('-g, --global', 'DEPRECATED');\n  commander.option('-S, --save', 'DEPRECATED - save package to your `dependencies`');\n  commander.option('-D, --save-dev', 'DEPRECATED - save package to your `devDependencies`');\n  commander.option('-P, --save-peer', 'DEPRECATED - save package to your `peerDependencies`');\n  commander.option('-O, --save-optional', 'DEPRECATED - save package to your `optionalDependencies`');\n  commander.option('-E, --save-exact', 'DEPRECATED');\n  commander.option('-T, --save-tilde', 'DEPRECATED');\n}\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(53);\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n\n/***/ }),\n/* 36 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return SubjectSubscriber; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Subject; });\n/* unused harmony export AnonymousSubject */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscription__ = __webpack_require__(25);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__ = __webpack_require__(190);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__SubjectSubscription__ = __webpack_require__(422);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__internal_symbol_rxSubscriber__ = __webpack_require__(322);\n/** PURE_IMPORTS_START tslib,_Observable,_Subscriber,_Subscription,_util_ObjectUnsubscribedError,_SubjectSubscription,_internal_symbol_rxSubscriber PURE_IMPORTS_END */\n\n\n\n\n\n\n\nvar SubjectSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SubjectSubscriber, _super);\n    function SubjectSubscriber(destination) {\n        var _this = _super.call(this, destination) || this;\n        _this.destination = destination;\n        return _this;\n    }\n    return SubjectSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_2__Subscriber__[\"a\" /* Subscriber */]));\n\nvar Subject = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](Subject, _super);\n    function Subject() {\n        var _this = _super.call(this) || this;\n        _this.observers = [];\n        _this.closed = false;\n        _this.isStopped = false;\n        _this.hasError = false;\n        _this.thrownError = null;\n        return _this;\n    }\n    Subject.prototype[__WEBPACK_IMPORTED_MODULE_6__internal_symbol_rxSubscriber__[\"a\" /* rxSubscriber */]] = function () {\n        return new SubjectSubscriber(this);\n    };\n    Subject.prototype.lift = function (operator) {\n        var subject = new AnonymousSubject(this, this);\n        subject.operator = operator;\n        return subject;\n    };\n    Subject.prototype.next = function (value) {\n        if (this.closed) {\n            throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[\"a\" /* ObjectUnsubscribedError */]();\n        }\n        if (!this.isStopped) {\n            var observers = this.observers;\n            var len = observers.length;\n            var copy = observers.slice();\n            for (var i = 0; i < len; i++) {\n                copy[i].next(value);\n            }\n        }\n    };\n    Subject.prototype.error = function (err) {\n        if (this.closed) {\n            throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[\"a\" /* ObjectUnsubscribedError */]();\n        }\n        this.hasError = true;\n        this.thrownError = err;\n        this.isStopped = true;\n        var observers = this.observers;\n        var len = observers.length;\n        var copy = observers.slice();\n        for (var i = 0; i < len; i++) {\n            copy[i].error(err);\n        }\n        this.observers.length = 0;\n    };\n    Subject.prototype.complete = function () {\n        if (this.closed) {\n            throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[\"a\" /* ObjectUnsubscribedError */]();\n        }\n        this.isStopped = true;\n        var observers = this.observers;\n        var len = observers.length;\n        var copy = observers.slice();\n        for (var i = 0; i < len; i++) {\n            copy[i].complete();\n        }\n        this.observers.length = 0;\n    };\n    Subject.prototype.unsubscribe = function () {\n        this.isStopped = true;\n        this.closed = true;\n        this.observers = null;\n    };\n    Subject.prototype._trySubscribe = function (subscriber) {\n        if (this.closed) {\n            throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[\"a\" /* ObjectUnsubscribedError */]();\n        }\n        else {\n            return _super.prototype._trySubscribe.call(this, subscriber);\n        }\n    };\n    Subject.prototype._subscribe = function (subscriber) {\n        if (this.closed) {\n            throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__[\"a\" /* ObjectUnsubscribedError */]();\n        }\n        else if (this.hasError) {\n            subscriber.error(this.thrownError);\n            return __WEBPACK_IMPORTED_MODULE_3__Subscription__[\"a\" /* Subscription */].EMPTY;\n        }\n        else if (this.isStopped) {\n            subscriber.complete();\n            return __WEBPACK_IMPORTED_MODULE_3__Subscription__[\"a\" /* Subscription */].EMPTY;\n        }\n        else {\n            this.observers.push(subscriber);\n            return new __WEBPACK_IMPORTED_MODULE_5__SubjectSubscription__[\"a\" /* SubjectSubscription */](this, subscriber);\n        }\n    };\n    Subject.prototype.asObservable = function () {\n        var observable = new __WEBPACK_IMPORTED_MODULE_1__Observable__[\"a\" /* Observable */]();\n        observable.source = this;\n        return observable;\n    };\n    Subject.create = function (destination, source) {\n        return new AnonymousSubject(destination, source);\n    };\n    return Subject;\n}(__WEBPACK_IMPORTED_MODULE_1__Observable__[\"a\" /* Observable */]));\n\nvar AnonymousSubject = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](AnonymousSubject, _super);\n    function AnonymousSubject(destination, source) {\n        var _this = _super.call(this) || this;\n        _this.destination = destination;\n        _this.source = source;\n        return _this;\n    }\n    AnonymousSubject.prototype.next = function (value) {\n        var destination = this.destination;\n        if (destination && destination.next) {\n            destination.next(value);\n        }\n    };\n    AnonymousSubject.prototype.error = function (err) {\n        var destination = this.destination;\n        if (destination && destination.error) {\n            this.destination.error(err);\n        }\n    };\n    AnonymousSubject.prototype.complete = function () {\n        var destination = this.destination;\n        if (destination && destination.complete) {\n            this.destination.complete();\n        }\n    };\n    AnonymousSubject.prototype._subscribe = function (subscriber) {\n        var source = this.source;\n        if (source) {\n            return this.source.subscribe(subscriber);\n        }\n        else {\n            return __WEBPACK_IMPORTED_MODULE_3__Subscription__[\"a\" /* Subscription */].EMPTY;\n        }\n    };\n    return AnonymousSubject;\n}(Subject));\n\n//# sourceMappingURL=Subject.js.map\n\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.normalizePattern = normalizePattern;\n\n/**\n * Explode and normalize a pattern into its name and range.\n */\n\nfunction normalizePattern(pattern) {\n  let hasVersion = false;\n  let range = 'latest';\n  let name = pattern;\n\n  // if we're a scope then remove the @ and add it back later\n  let isScoped = false;\n  if (name[0] === '@') {\n    isScoped = true;\n    name = name.slice(1);\n  }\n\n  // take first part as the name\n  const parts = name.split('@');\n  if (parts.length > 1) {\n    name = parts.shift();\n    range = parts.join('@');\n\n    if (range) {\n      hasVersion = true;\n    } else {\n      range = '*';\n    }\n  }\n\n  // add back @ scope suffix\n  if (isScoped) {\n    name = `@${name}`;\n  }\n\n  return { name, range, hasVersion };\n}\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_RESULT__;/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright JS Foundation and other contributors <https://js.foundation/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.10';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading and trailing whitespace. */\n  var reTrim = /^\\s+|\\s+$/g,\n      reTrimStart = /^\\s+/,\n      reTrimEnd = /\\s+$/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Gets the value at `key`, unless `key` is \"__proto__\".\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function safeGet(object, key) {\n    return key == '__proto__'\n      ? undefined\n      : object[key];\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n\n        return result;\n      }\n\n      if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n\n        return result;\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        if (isObject(srcValue)) {\n          stack || (stack = new Stack);\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      var index = -1;\n      iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      value = iteratee(value);\n\n      var low = 0,\n          high = array == null ? 0 : array.length,\n          valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      return object == null || delete object[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(array);\n      if (stacked && stack.get(other)) {\n        return stacked == other;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked && stack.get(other)) {\n        return stacked == other;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = value.replace(reTrim, '');\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('déjà vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      var sourceURL = '//# sourceURL=' +\n        ('sourceURL' in options\n          ? options.sourceURL\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrim, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimEnd, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = (lodashFunc.name + ''),\n            names = realNames[key] || (realNames[key] = []);\n\n        names.push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (true) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    !(__WEBPACK_AMD_DEFINE_RESULT__ = function() {\n      return _;\n    }.call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(121)(module)))\n\n/***/ }),\n/* 39 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return EMPTY; });\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = empty;\n/* unused harmony export emptyScheduled */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */\n\nvar EMPTY = /*@__PURE__*/ new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) { return subscriber.complete(); });\nfunction empty(scheduler) {\n    return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\nfunction emptyScheduled(scheduler) {\n    return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });\n}\n//# sourceMappingURL=empty.js.map\n\n\n/***/ }),\n/* 40 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return async; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AsyncAction__ = __webpack_require__(150);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsyncScheduler__ = __webpack_require__(151);\n/** PURE_IMPORTS_START _AsyncAction,_AsyncScheduler PURE_IMPORTS_END */\n\n\nvar async = /*@__PURE__*/ new __WEBPACK_IMPORTED_MODULE_1__AsyncScheduler__[\"a\" /* AsyncScheduler */](__WEBPACK_IMPORTED_MODULE_0__AsyncAction__[\"a\" /* AsyncAction */]);\n//# sourceMappingURL=async.js.map\n\n\n/***/ }),\n/* 41 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return isArray; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nvar isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; });\n//# sourceMappingURL=isArray.js.map\n\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"os\");\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(72);\nvar createDesc = __webpack_require__(133);\nmodule.exports = __webpack_require__(52) ? function (object, key, value) {\n  return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n\nfunction isNothing(subject) {\n  return (typeof subject === 'undefined') || (subject === null);\n}\n\n\nfunction isObject(subject) {\n  return (typeof subject === 'object') && (subject !== null);\n}\n\n\nfunction toArray(sequence) {\n  if (Array.isArray(sequence)) return sequence;\n  else if (isNothing(sequence)) return [];\n\n  return [ sequence ];\n}\n\n\nfunction extend(target, source) {\n  var index, length, key, sourceKeys;\n\n  if (source) {\n    sourceKeys = Object.keys(source);\n\n    for (index = 0, length = sourceKeys.length; index < length; index += 1) {\n      key = sourceKeys[index];\n      target[key] = source[key];\n    }\n  }\n\n  return target;\n}\n\n\nfunction repeat(string, count) {\n  var result = '', cycle;\n\n  for (cycle = 0; cycle < count; cycle += 1) {\n    result += string;\n  }\n\n  return result;\n}\n\n\nfunction isNegativeZero(number) {\n  return (number === 0) && (Number.NEGATIVE_INFINITY === 1 / number);\n}\n\n\nmodule.exports.isNothing      = isNothing;\nmodule.exports.isObject       = isObject;\nmodule.exports.toArray        = toArray;\nmodule.exports.repeat         = repeat;\nmodule.exports.isNegativeZero = isNegativeZero;\nmodule.exports.extend         = extend;\n\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/*eslint-disable max-len*/\n\nvar common        = __webpack_require__(44);\nvar YAMLException = __webpack_require__(55);\nvar Type          = __webpack_require__(10);\n\n\nfunction compileList(schema, name, result) {\n  var exclude = [];\n\n  schema.include.forEach(function (includedSchema) {\n    result = compileList(includedSchema, name, result);\n  });\n\n  schema[name].forEach(function (currentType) {\n    result.forEach(function (previousType, previousIndex) {\n      if (previousType.tag === currentType.tag && previousType.kind === currentType.kind) {\n        exclude.push(previousIndex);\n      }\n    });\n\n    result.push(currentType);\n  });\n\n  return result.filter(function (type, index) {\n    return exclude.indexOf(index) === -1;\n  });\n}\n\n\nfunction compileMap(/* lists... */) {\n  var result = {\n        scalar: {},\n        sequence: {},\n        mapping: {},\n        fallback: {}\n      }, index, length;\n\n  function collectType(type) {\n    result[type.kind][type.tag] = result['fallback'][type.tag] = type;\n  }\n\n  for (index = 0, length = arguments.length; index < length; index += 1) {\n    arguments[index].forEach(collectType);\n  }\n  return result;\n}\n\n\nfunction Schema(definition) {\n  this.include  = definition.include  || [];\n  this.implicit = definition.implicit || [];\n  this.explicit = definition.explicit || [];\n\n  this.implicit.forEach(function (type) {\n    if (type.loadKind && type.loadKind !== 'scalar') {\n      throw new YAMLException('There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.');\n    }\n  });\n\n  this.compiledImplicit = compileList(this, 'implicit', []);\n  this.compiledExplicit = compileList(this, 'explicit', []);\n  this.compiledTypeMap  = compileMap(this.compiledImplicit, this.compiledExplicit);\n}\n\n\nSchema.DEFAULT = null;\n\n\nSchema.create = function createSchema() {\n  var schemas, types;\n\n  switch (arguments.length) {\n    case 1:\n      schemas = Schema.DEFAULT;\n      types = arguments[0];\n      break;\n\n    case 2:\n      schemas = arguments[0];\n      types = arguments[1];\n      break;\n\n    default:\n      throw new YAMLException('Wrong number of arguments for Schema.create function');\n  }\n\n  schemas = common.toArray(schemas);\n  types = common.toArray(types);\n\n  if (!schemas.every(function (schema) { return schema instanceof Schema; })) {\n    throw new YAMLException('Specified list of super schemas (or a single Schema object) contains a non-Schema object.');\n  }\n\n  if (!types.every(function (type) { return type instanceof Type; })) {\n    throw new YAMLException('Specified list of YAML types (or a single Type object) contains a non-Type object.');\n  }\n\n  return new Schema({\n    include: schemas,\n    explicit: types\n  });\n};\n\n\nmodule.exports = Schema;\n\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* eslint-disable node/no-deprecated-api */\nvar buffer = __webpack_require__(64)\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n  for (var key in src) {\n    dst[key] = src[key]\n  }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n  module.exports = buffer\n} else {\n  // Copy properties from require('buffer')\n  copyProps(buffer, exports)\n  exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n  return Buffer(arg, encodingOrOffset, length)\n}\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n  if (typeof arg === 'number') {\n    throw new TypeError('Argument must not be a number')\n  }\n  return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  var buf = Buffer(size)\n  if (fill !== undefined) {\n    if (typeof encoding === 'string') {\n      buf.fill(fill, encoding)\n    } else {\n      buf.fill(fill)\n    }\n  } else {\n    buf.fill(0)\n  }\n  return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return buffer.SlowBuffer(size)\n}\n\n\n/***/ }),\n/* 47 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = map;\n/* unused harmony export MapOperator */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction map(project, thisArg) {\n    return function mapOperation(source) {\n        if (typeof project !== 'function') {\n            throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');\n        }\n        return source.lift(new MapOperator(project, thisArg));\n    };\n}\nvar MapOperator = /*@__PURE__*/ (function () {\n    function MapOperator(project, thisArg) {\n        this.project = project;\n        this.thisArg = thisArg;\n    }\n    MapOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));\n    };\n    return MapOperator;\n}());\n\nvar MapSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](MapSubscriber, _super);\n    function MapSubscriber(destination, project, thisArg) {\n        var _this = _super.call(this, destination) || this;\n        _this.project = project;\n        _this.count = 0;\n        _this.thisArg = thisArg || _this;\n        return _this;\n    }\n    MapSubscriber.prototype._next = function (value) {\n        var result;\n        try {\n            result = this.project.call(this.thisArg, value, this.count++);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return MapSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=map.js.map\n\n\n/***/ }),\n/* 48 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return errorObject; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nvar errorObject = { e: {} };\n//# sourceMappingURL=errorObject.js.map\n\n\n/***/ }),\n/* 49 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = isScheduler;\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction isScheduler(value) {\n    return value && typeof value.schedule === 'function';\n}\n//# sourceMappingURL=isScheduler.js.map\n\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.exec = exports.queue = undefined;\nexports.forkp = forkp;\nexports.spawnp = spawnp;\nexports.forwardSignalToSpawnedProcesses = forwardSignalToSpawnedProcesses;\nexports.spawn = spawn;\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _blockingQueue;\n\nfunction _load_blockingQueue() {\n  return _blockingQueue = _interopRequireDefault(__webpack_require__(110));\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _promise;\n\nfunction _load_promise() {\n  return _promise = __webpack_require__(51);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\n/* global child_process$spawnOpts */\n\nconst os = __webpack_require__(42);\nconst child = __webpack_require__(332);\nconst fs = __webpack_require__(4);\nconst path = __webpack_require__(0);\n\nconst queue = exports.queue = new (_blockingQueue || _load_blockingQueue()).default('child', (_constants || _load_constants()).CHILD_CONCURRENCY);\n\n// TODO: this uid check is kinda whack\nlet uid = 0;\n\nconst exec = exports.exec = (0, (_promise || _load_promise()).promisify)(child.exec);\n\nfunction validate(program, opts = {}) {\n  if (program.match(/[\\\\\\/]/)) {\n    return;\n  }\n\n  if (process.platform === 'win32' && process.env.PATHEXT) {\n    const cwd = opts.cwd || process.cwd();\n    const pathext = process.env.PATHEXT;\n\n    for (var _iterator = pathext.split(';'), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const ext = _ref;\n\n      const candidate = path.join(cwd, `${program}${ext}`);\n      if (fs.existsSync(candidate)) {\n        throw new Error(`Potentially dangerous call to \"${program}\" in ${cwd}`);\n      }\n    }\n  }\n}\n\nfunction forkp(program, args, opts) {\n  validate(program, opts);\n  const key = String(++uid);\n  return new Promise((resolve, reject) => {\n    const proc = child.fork(program, args, opts);\n    spawnedProcesses[key] = proc;\n\n    proc.on('error', error => {\n      reject(error);\n    });\n\n    proc.on('close', (exitCode, signal) => {\n      const finalExitCode = typeof exitCode !== `undefined` && exitCode !== null ? exitCode : 128 + os.constants.signals[signal];\n      resolve(finalExitCode);\n    });\n  });\n}\n\nfunction spawnp(program, args, opts) {\n  validate(program, opts);\n  const key = String(++uid);\n  return new Promise((resolve, reject) => {\n    const proc = child.spawn(program, args, opts);\n    spawnedProcesses[key] = proc;\n\n    proc.on('error', error => {\n      reject(error);\n    });\n\n    proc.on('close', (exitCode, signal) => {\n      const finalExitCode = typeof exitCode !== `undefined` && exitCode !== null ? exitCode : 128 + os.constants.signals[signal];\n      resolve(finalExitCode);\n    });\n  });\n}\n\nconst spawnedProcesses = {};\n\nfunction forwardSignalToSpawnedProcesses(signal) {\n  for (var _iterator2 = Object.keys(spawnedProcesses), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n    var _ref2;\n\n    if (_isArray2) {\n      if (_i2 >= _iterator2.length) break;\n      _ref2 = _iterator2[_i2++];\n    } else {\n      _i2 = _iterator2.next();\n      if (_i2.done) break;\n      _ref2 = _i2.value;\n    }\n\n    const key = _ref2;\n\n    spawnedProcesses[key].kill(signal);\n  }\n}\n\nfunction spawn(program, args, opts = {}, onData) {\n  const key = opts.cwd || String(++uid);\n  return queue.push(key, () => new Promise((resolve, reject) => {\n    validate(program, opts);\n\n    const proc = child.spawn(program, args, opts);\n    spawnedProcesses[key] = proc;\n\n    let processingDone = false;\n    let processClosed = false;\n    let err = null;\n\n    let stdout = '';\n\n    proc.on('error', err => {\n      if (err.code === 'ENOENT') {\n        reject(new (_errors || _load_errors()).ProcessSpawnError(`Couldn't find the binary ${program}`, err.code, program));\n      } else {\n        reject(err);\n      }\n    });\n\n    function updateStdout(chunk) {\n      stdout += chunk;\n      if (onData) {\n        onData(chunk);\n      }\n    }\n\n    function finish() {\n      delete spawnedProcesses[key];\n      if (err) {\n        reject(err);\n      } else {\n        resolve(stdout.trim());\n      }\n    }\n\n    if (typeof opts.process === 'function') {\n      opts.process(proc, updateStdout, reject, function () {\n        if (processClosed) {\n          finish();\n        } else {\n          processingDone = true;\n        }\n      });\n    } else {\n      if (proc.stderr) {\n        proc.stderr.on('data', updateStdout);\n      }\n\n      if (proc.stdout) {\n        proc.stdout.on('data', updateStdout);\n      }\n\n      processingDone = true;\n    }\n\n    proc.on('close', (code, signal) => {\n      if (signal || code >= 1) {\n        err = new (_errors || _load_errors()).ProcessTermError(['Command failed.', signal ? `Exit signal: ${signal}` : `Exit code: ${code}`, `Command: ${program}`, `Arguments: ${args.join(' ')}`, `Directory: ${opts.cwd || process.cwd()}`, `Output:\\n${stdout.trim()}`].join('\\n'));\n        err.EXIT_SIGNAL = signal;\n        err.EXIT_CODE = code;\n      }\n\n      if (processingDone || err) {\n        finish();\n      } else {\n        processClosed = true;\n      }\n    });\n  }));\n}\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.wait = wait;\nexports.promisify = promisify;\nexports.queue = queue;\nfunction wait(delay) {\n  return new Promise(resolve => {\n    setTimeout(resolve, delay);\n  });\n}\n\nfunction promisify(fn, firstData) {\n  return function (...args) {\n    return new Promise(function (resolve, reject) {\n      args.push(function (err, ...result) {\n        let res = result;\n\n        if (result.length <= 1) {\n          res = result[0];\n        }\n\n        if (firstData) {\n          res = err;\n          err = null;\n        }\n\n        if (err) {\n          reject(err);\n        } else {\n          resolve(res);\n        }\n      });\n\n      fn.apply(null, args);\n    });\n  };\n}\n\nfunction queue(arr, promiseProducer, concurrency = Infinity) {\n  concurrency = Math.min(concurrency, arr.length);\n\n  // clone\n  arr = arr.slice();\n\n  const results = [];\n  let total = arr.length;\n  if (!total) {\n    return Promise.resolve(results);\n  }\n\n  return new Promise((resolve, reject) => {\n    for (let i = 0; i < concurrency; i++) {\n      next();\n    }\n\n    function next() {\n      const item = arr.shift();\n      const promise = promiseProducer(item);\n\n      promise.then(function (result) {\n        results.push(result);\n\n        total--;\n        if (total === 0) {\n          resolve(results);\n        } else {\n          if (arr.length) {\n            next();\n          }\n        }\n      }, reject);\n    }\n  });\n}\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !__webpack_require__(112)(function () {\n  return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports) {\n\nmodule.exports = {};\n\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// YAML error class. http://stackoverflow.com/questions/8458984\n//\n\n\nfunction YAMLException(reason, mark) {\n  // Super constructor\n  Error.call(this);\n\n  this.name = 'YAMLException';\n  this.reason = reason;\n  this.mark = mark;\n  this.message = (this.reason || '(unknown reason)') + (this.mark ? ' ' + this.mark.toString() : '');\n\n  // Include stack trace in error object\n  if (Error.captureStackTrace) {\n    // Chrome and NodeJS\n    Error.captureStackTrace(this, this.constructor);\n  } else {\n    // FF, IE 10+ and Safari 6+. Fallback for others\n    this.stack = (new Error()).stack || '';\n  }\n}\n\n\n// Inherit from Error\nYAMLException.prototype = Object.create(Error.prototype);\nYAMLException.prototype.constructor = YAMLException;\n\n\nYAMLException.prototype.toString = function toString(compact) {\n  var result = this.name + ': ';\n\n  result += this.reason || '(unknown reason)';\n\n  if (!compact && this.mark) {\n    result += ' ' + this.mark.toString();\n  }\n\n  return result;\n};\n\n\nmodule.exports = YAMLException;\n\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// JS-YAML's default schema for `safeLoad` function.\n// It is not described in the YAML specification.\n//\n// This schema is based on standard YAML's Core schema and includes most of\n// extra types described at YAML tag repository. (http://yaml.org/type/)\n\n\n\n\n\nvar Schema = __webpack_require__(45);\n\n\nmodule.exports = new Schema({\n  include: [\n    __webpack_require__(144)\n  ],\n  implicit: [\n    __webpack_require__(299),\n    __webpack_require__(292)\n  ],\n  explicit: [\n    __webpack_require__(284),\n    __webpack_require__(294),\n    __webpack_require__(295),\n    __webpack_require__(297)\n  ]\n});\n\n\n/***/ }),\n/* 57 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = tryCatch;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__errorObject__ = __webpack_require__(48);\n/** PURE_IMPORTS_START _errorObject PURE_IMPORTS_END */\n\nvar tryCatchTarget;\nfunction tryCatcher() {\n    try {\n        return tryCatchTarget.apply(this, arguments);\n    }\n    catch (e) {\n        __WEBPACK_IMPORTED_MODULE_0__errorObject__[\"a\" /* errorObject */].e = e;\n        return __WEBPACK_IMPORTED_MODULE_0__errorObject__[\"a\" /* errorObject */];\n    }\n}\nfunction tryCatch(fn) {\n    tryCatchTarget = fn;\n    return tryCatcher;\n}\n//# sourceMappingURL=tryCatch.js.map\n\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.registryNames = exports.registries = undefined;\n\nvar _yarnRegistry;\n\nfunction _load_yarnRegistry() {\n  return _yarnRegistry = _interopRequireDefault(__webpack_require__(527));\n}\n\nvar _npmRegistry;\n\nfunction _load_npmRegistry() {\n  return _npmRegistry = _interopRequireDefault(__webpack_require__(88));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst registries = exports.registries = {\n  npm: (_npmRegistry || _load_npmRegistry()).default,\n  yarn: (_yarnRegistry || _load_yarnRegistry()).default\n};\n\nconst registryNames = exports.registryNames = Object.keys(registries);\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nexports.default = function (rootCommandName, subCommands, usage = []) {\n  let run = (() => {\n    var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n      const subName = (0, (_misc || _load_misc()).camelCase)(args.shift() || '');\n      if (subName && subCommands[subName]) {\n        const command = subCommands[subName];\n        const res = yield command(config, reporter, flags, args);\n        if (res !== false) {\n          return Promise.resolve();\n        }\n      }\n\n      if (usage && usage.length) {\n        reporter.error(`${reporter.lang('usage')}:`);\n        for (var _iterator = usage, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n          var _ref2;\n\n          if (_isArray) {\n            if (_i >= _iterator.length) break;\n            _ref2 = _iterator[_i++];\n          } else {\n            _i = _iterator.next();\n            if (_i.done) break;\n            _ref2 = _i.value;\n          }\n\n          const msg = _ref2;\n\n          reporter.error(`yarn ${rootCommandName} ${msg}`);\n        }\n      }\n      return Promise.reject(new (_errors || _load_errors()).MessageError(reporter.lang('invalidCommand', subCommandNames.join(', '))));\n    });\n\n    return function run(_x, _x2, _x3, _x4) {\n      return _ref.apply(this, arguments);\n    };\n  })();\n\n  const subCommandNames = Object.keys(subCommands).map((_misc || _load_misc()).hyphenate);\n\n  function setFlags(commander) {\n    commander.usage(`${rootCommandName} [${subCommandNames.join('|')}] [flags]`);\n  }\n\n  function hasWrapper(commander, args) {\n    return true;\n  }\n\n  const examples = usage.map(cmd => {\n    return `${rootCommandName} ${cmd}`;\n  });\n\n  return { run, setFlags, hasWrapper, examples };\n};\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(17);\nvar core = __webpack_require__(31);\nvar ctx = __webpack_require__(70);\nvar hide = __webpack_require__(43);\nvar has = __webpack_require__(71);\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n  var IS_FORCED = type & $export.F;\n  var IS_GLOBAL = type & $export.G;\n  var IS_STATIC = type & $export.S;\n  var IS_PROTO = type & $export.P;\n  var IS_BIND = type & $export.B;\n  var IS_WRAP = type & $export.W;\n  var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n  var expProto = exports[PROTOTYPE];\n  var target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE];\n  var key, own, out;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    if (own && has(exports, key)) continue;\n    // export native or passed\n    out = own ? target[key] : source[key];\n    // prevent global pollution for namespaces\n    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n    // bind timers to global for call from export context\n    : IS_BIND && own ? ctx(out, global)\n    // wrap global constructors for prevent change them in library\n    : IS_WRAP && target[key] == out ? (function (C) {\n      var F = function (a, b, c) {\n        if (this instanceof C) {\n          switch (arguments.length) {\n            case 0: return new C();\n            case 1: return new C(a);\n            case 2: return new C(a, b);\n          } return new C(a, b, c);\n        } return C.apply(this, arguments);\n      };\n      F[PROTOTYPE] = C[PROTOTYPE];\n      return F;\n    // make static versions for prototype methods\n    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n    if (IS_PROTO) {\n      (exports.virtual || (exports.virtual = {}))[key] = out;\n      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n      if (type & $export.R && expProto && !expProto[key]) hide(expProto, key, out);\n    }\n  }\n};\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\ntry {\n  var util = __webpack_require__(3);\n  if (typeof util.inherits !== 'function') throw '';\n  module.exports = util.inherits;\n} catch (e) {\n  module.exports = __webpack_require__(275);\n}\n\n\n/***/ }),\n/* 62 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = from;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isPromise__ = __webpack_require__(445);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isArrayLike__ = __webpack_require__(442);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_isInteropObservable__ = __webpack_require__(928);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_isIterable__ = __webpack_require__(929);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__fromArray__ = __webpack_require__(85);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__fromPromise__ = __webpack_require__(830);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__fromIterable__ = __webpack_require__(828);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__fromObservable__ = __webpack_require__(829);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__util_subscribeTo__ = __webpack_require__(446);\n/** PURE_IMPORTS_START _Observable,_util_isPromise,_util_isArrayLike,_util_isInteropObservable,_util_isIterable,_fromArray,_fromPromise,_fromIterable,_fromObservable,_util_subscribeTo PURE_IMPORTS_END */\n\n\n\n\n\n\n\n\n\n\nfunction from(input, scheduler) {\n    if (!scheduler) {\n        if (input instanceof __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */]) {\n            return input;\n        }\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_9__util_subscribeTo__[\"a\" /* subscribeTo */])(input));\n    }\n    if (input != null) {\n        if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_isInteropObservable__[\"a\" /* isInteropObservable */])(input)) {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_8__fromObservable__[\"a\" /* fromObservable */])(input, scheduler);\n        }\n        else if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isPromise__[\"a\" /* isPromise */])(input)) {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__fromPromise__[\"a\" /* fromPromise */])(input, scheduler);\n        }\n        else if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isArrayLike__[\"a\" /* isArrayLike */])(input)) {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__fromArray__[\"a\" /* fromArray */])(input, scheduler);\n        }\n        else if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_isIterable__[\"a\" /* isIterable */])(input) || typeof input === 'string') {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_7__fromIterable__[\"a\" /* fromIterable */])(input, scheduler);\n        }\n    }\n    throw new TypeError((input !== null && typeof input || input) + ' is not observable');\n}\n//# sourceMappingURL=from.js.map\n\n\n/***/ }),\n/* 63 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__internal_operators_audit__ = __webpack_require__(428);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"audit\", function() { return __WEBPACK_IMPORTED_MODULE_0__internal_operators_audit__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__internal_operators_auditTime__ = __webpack_require__(838);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"auditTime\", function() { return __WEBPACK_IMPORTED_MODULE_1__internal_operators_auditTime__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__internal_operators_buffer__ = __webpack_require__(839);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"buffer\", function() { return __WEBPACK_IMPORTED_MODULE_2__internal_operators_buffer__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__internal_operators_bufferCount__ = __webpack_require__(840);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"bufferCount\", function() { return __WEBPACK_IMPORTED_MODULE_3__internal_operators_bufferCount__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__internal_operators_bufferTime__ = __webpack_require__(841);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"bufferTime\", function() { return __WEBPACK_IMPORTED_MODULE_4__internal_operators_bufferTime__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__internal_operators_bufferToggle__ = __webpack_require__(842);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"bufferToggle\", function() { return __WEBPACK_IMPORTED_MODULE_5__internal_operators_bufferToggle__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__internal_operators_bufferWhen__ = __webpack_require__(843);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"bufferWhen\", function() { return __WEBPACK_IMPORTED_MODULE_6__internal_operators_bufferWhen__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__internal_operators_catchError__ = __webpack_require__(844);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"catchError\", function() { return __WEBPACK_IMPORTED_MODULE_7__internal_operators_catchError__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__internal_operators_combineAll__ = __webpack_require__(845);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"combineAll\", function() { return __WEBPACK_IMPORTED_MODULE_8__internal_operators_combineAll__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__internal_operators_combineLatest__ = __webpack_require__(846);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"combineLatest\", function() { return __WEBPACK_IMPORTED_MODULE_9__internal_operators_combineLatest__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__internal_operators_concat__ = __webpack_require__(847);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"concat\", function() { return __WEBPACK_IMPORTED_MODULE_10__internal_operators_concat__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__internal_operators_concatAll__ = __webpack_require__(429);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"concatAll\", function() { return __WEBPACK_IMPORTED_MODULE_11__internal_operators_concatAll__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__internal_operators_concatMap__ = __webpack_require__(430);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"concatMap\", function() { return __WEBPACK_IMPORTED_MODULE_12__internal_operators_concatMap__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__internal_operators_concatMapTo__ = __webpack_require__(848);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"concatMapTo\", function() { return __WEBPACK_IMPORTED_MODULE_13__internal_operators_concatMapTo__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__internal_operators_count__ = __webpack_require__(849);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"count\", function() { return __WEBPACK_IMPORTED_MODULE_14__internal_operators_count__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__internal_operators_debounce__ = __webpack_require__(850);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"debounce\", function() { return __WEBPACK_IMPORTED_MODULE_15__internal_operators_debounce__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__internal_operators_debounceTime__ = __webpack_require__(851);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"debounceTime\", function() { return __WEBPACK_IMPORTED_MODULE_16__internal_operators_debounceTime__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__internal_operators_defaultIfEmpty__ = __webpack_require__(147);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"defaultIfEmpty\", function() { return __WEBPACK_IMPORTED_MODULE_17__internal_operators_defaultIfEmpty__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__internal_operators_delay__ = __webpack_require__(852);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"delay\", function() { return __WEBPACK_IMPORTED_MODULE_18__internal_operators_delay__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__internal_operators_delayWhen__ = __webpack_require__(853);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"delayWhen\", function() { return __WEBPACK_IMPORTED_MODULE_19__internal_operators_delayWhen__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__internal_operators_dematerialize__ = __webpack_require__(854);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"dematerialize\", function() { return __WEBPACK_IMPORTED_MODULE_20__internal_operators_dematerialize__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__internal_operators_distinct__ = __webpack_require__(855);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"distinct\", function() { return __WEBPACK_IMPORTED_MODULE_21__internal_operators_distinct__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__internal_operators_distinctUntilChanged__ = __webpack_require__(431);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"distinctUntilChanged\", function() { return __WEBPACK_IMPORTED_MODULE_22__internal_operators_distinctUntilChanged__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__internal_operators_distinctUntilKeyChanged__ = __webpack_require__(856);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"distinctUntilKeyChanged\", function() { return __WEBPACK_IMPORTED_MODULE_23__internal_operators_distinctUntilKeyChanged__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__internal_operators_elementAt__ = __webpack_require__(857);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"elementAt\", function() { return __WEBPACK_IMPORTED_MODULE_24__internal_operators_elementAt__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__internal_operators_endWith__ = __webpack_require__(858);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"endWith\", function() { return __WEBPACK_IMPORTED_MODULE_25__internal_operators_endWith__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__internal_operators_every__ = __webpack_require__(859);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"every\", function() { return __WEBPACK_IMPORTED_MODULE_26__internal_operators_every__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__internal_operators_exhaust__ = __webpack_require__(860);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"exhaust\", function() { return __WEBPACK_IMPORTED_MODULE_27__internal_operators_exhaust__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__internal_operators_exhaustMap__ = __webpack_require__(861);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"exhaustMap\", function() { return __WEBPACK_IMPORTED_MODULE_28__internal_operators_exhaustMap__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__internal_operators_expand__ = __webpack_require__(862);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"expand\", function() { return __WEBPACK_IMPORTED_MODULE_29__internal_operators_expand__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__internal_operators_filter__ = __webpack_require__(148);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"filter\", function() { return __WEBPACK_IMPORTED_MODULE_30__internal_operators_filter__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__internal_operators_finalize__ = __webpack_require__(863);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"finalize\", function() { return __WEBPACK_IMPORTED_MODULE_31__internal_operators_finalize__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__internal_operators_find__ = __webpack_require__(432);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"find\", function() { return __WEBPACK_IMPORTED_MODULE_32__internal_operators_find__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__internal_operators_findIndex__ = __webpack_require__(864);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"findIndex\", function() { return __WEBPACK_IMPORTED_MODULE_33__internal_operators_findIndex__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__internal_operators_first__ = __webpack_require__(865);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"first\", function() { return __WEBPACK_IMPORTED_MODULE_34__internal_operators_first__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__internal_operators_groupBy__ = __webpack_require__(433);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"groupBy\", function() { return __WEBPACK_IMPORTED_MODULE_35__internal_operators_groupBy__[\"b\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_36__internal_operators_ignoreElements__ = __webpack_require__(866);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"ignoreElements\", function() { return __WEBPACK_IMPORTED_MODULE_36__internal_operators_ignoreElements__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_37__internal_operators_isEmpty__ = __webpack_require__(867);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isEmpty\", function() { return __WEBPACK_IMPORTED_MODULE_37__internal_operators_isEmpty__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_38__internal_operators_last__ = __webpack_require__(868);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"last\", function() { return __WEBPACK_IMPORTED_MODULE_38__internal_operators_last__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_39__internal_operators_map__ = __webpack_require__(47);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"map\", function() { return __WEBPACK_IMPORTED_MODULE_39__internal_operators_map__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_40__internal_operators_mapTo__ = __webpack_require__(869);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"mapTo\", function() { return __WEBPACK_IMPORTED_MODULE_40__internal_operators_mapTo__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_41__internal_operators_materialize__ = __webpack_require__(870);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"materialize\", function() { return __WEBPACK_IMPORTED_MODULE_41__internal_operators_materialize__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_42__internal_operators_max__ = __webpack_require__(871);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"max\", function() { return __WEBPACK_IMPORTED_MODULE_42__internal_operators_max__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_43__internal_operators_merge__ = __webpack_require__(872);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"merge\", function() { return __WEBPACK_IMPORTED_MODULE_43__internal_operators_merge__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_44__internal_operators_mergeAll__ = __webpack_require__(316);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"mergeAll\", function() { return __WEBPACK_IMPORTED_MODULE_44__internal_operators_mergeAll__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_45__internal_operators_mergeMap__ = __webpack_require__(149);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"mergeMap\", function() { return __WEBPACK_IMPORTED_MODULE_45__internal_operators_mergeMap__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"flatMap\", function() { return __WEBPACK_IMPORTED_MODULE_45__internal_operators_mergeMap__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_46__internal_operators_mergeMapTo__ = __webpack_require__(873);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"mergeMapTo\", function() { return __WEBPACK_IMPORTED_MODULE_46__internal_operators_mergeMapTo__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_47__internal_operators_mergeScan__ = __webpack_require__(874);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"mergeScan\", function() { return __WEBPACK_IMPORTED_MODULE_47__internal_operators_mergeScan__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_48__internal_operators_min__ = __webpack_require__(875);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"min\", function() { return __WEBPACK_IMPORTED_MODULE_48__internal_operators_min__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_49__internal_operators_multicast__ = __webpack_require__(117);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"multicast\", function() { return __WEBPACK_IMPORTED_MODULE_49__internal_operators_multicast__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_50__internal_operators_observeOn__ = __webpack_require__(434);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"observeOn\", function() { return __WEBPACK_IMPORTED_MODULE_50__internal_operators_observeOn__[\"b\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_51__internal_operators_onErrorResumeNext__ = __webpack_require__(876);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"onErrorResumeNext\", function() { return __WEBPACK_IMPORTED_MODULE_51__internal_operators_onErrorResumeNext__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_52__internal_operators_pairwise__ = __webpack_require__(877);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"pairwise\", function() { return __WEBPACK_IMPORTED_MODULE_52__internal_operators_pairwise__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_53__internal_operators_partition__ = __webpack_require__(878);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"partition\", function() { return __WEBPACK_IMPORTED_MODULE_53__internal_operators_partition__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_54__internal_operators_pluck__ = __webpack_require__(879);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"pluck\", function() { return __WEBPACK_IMPORTED_MODULE_54__internal_operators_pluck__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_55__internal_operators_publish__ = __webpack_require__(880);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"publish\", function() { return __WEBPACK_IMPORTED_MODULE_55__internal_operators_publish__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_56__internal_operators_publishBehavior__ = __webpack_require__(881);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"publishBehavior\", function() { return __WEBPACK_IMPORTED_MODULE_56__internal_operators_publishBehavior__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_57__internal_operators_publishLast__ = __webpack_require__(882);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"publishLast\", function() { return __WEBPACK_IMPORTED_MODULE_57__internal_operators_publishLast__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_58__internal_operators_publishReplay__ = __webpack_require__(883);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"publishReplay\", function() { return __WEBPACK_IMPORTED_MODULE_58__internal_operators_publishReplay__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_59__internal_operators_race__ = __webpack_require__(884);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"race\", function() { return __WEBPACK_IMPORTED_MODULE_59__internal_operators_race__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_60__internal_operators_reduce__ = __webpack_require__(188);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"reduce\", function() { return __WEBPACK_IMPORTED_MODULE_60__internal_operators_reduce__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_61__internal_operators_repeat__ = __webpack_require__(885);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"repeat\", function() { return __WEBPACK_IMPORTED_MODULE_61__internal_operators_repeat__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_62__internal_operators_repeatWhen__ = __webpack_require__(886);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"repeatWhen\", function() { return __WEBPACK_IMPORTED_MODULE_62__internal_operators_repeatWhen__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_63__internal_operators_retry__ = __webpack_require__(887);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"retry\", function() { return __WEBPACK_IMPORTED_MODULE_63__internal_operators_retry__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_64__internal_operators_retryWhen__ = __webpack_require__(888);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"retryWhen\", function() { return __WEBPACK_IMPORTED_MODULE_64__internal_operators_retryWhen__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_65__internal_operators_refCount__ = __webpack_require__(317);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"refCount\", function() { return __WEBPACK_IMPORTED_MODULE_65__internal_operators_refCount__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_66__internal_operators_sample__ = __webpack_require__(889);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"sample\", function() { return __WEBPACK_IMPORTED_MODULE_66__internal_operators_sample__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_67__internal_operators_sampleTime__ = __webpack_require__(890);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"sampleTime\", function() { return __WEBPACK_IMPORTED_MODULE_67__internal_operators_sampleTime__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_68__internal_operators_scan__ = __webpack_require__(318);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"scan\", function() { return __WEBPACK_IMPORTED_MODULE_68__internal_operators_scan__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_69__internal_operators_sequenceEqual__ = __webpack_require__(891);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"sequenceEqual\", function() { return __WEBPACK_IMPORTED_MODULE_69__internal_operators_sequenceEqual__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_70__internal_operators_share__ = __webpack_require__(892);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"share\", function() { return __WEBPACK_IMPORTED_MODULE_70__internal_operators_share__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_71__internal_operators_shareReplay__ = __webpack_require__(893);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"shareReplay\", function() { return __WEBPACK_IMPORTED_MODULE_71__internal_operators_shareReplay__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_72__internal_operators_single__ = __webpack_require__(894);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"single\", function() { return __WEBPACK_IMPORTED_MODULE_72__internal_operators_single__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_73__internal_operators_skip__ = __webpack_require__(895);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"skip\", function() { return __WEBPACK_IMPORTED_MODULE_73__internal_operators_skip__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_74__internal_operators_skipLast__ = __webpack_require__(896);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"skipLast\", function() { return __WEBPACK_IMPORTED_MODULE_74__internal_operators_skipLast__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_75__internal_operators_skipUntil__ = __webpack_require__(897);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"skipUntil\", function() { return __WEBPACK_IMPORTED_MODULE_75__internal_operators_skipUntil__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_76__internal_operators_skipWhile__ = __webpack_require__(898);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"skipWhile\", function() { return __WEBPACK_IMPORTED_MODULE_76__internal_operators_skipWhile__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_77__internal_operators_startWith__ = __webpack_require__(899);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"startWith\", function() { return __WEBPACK_IMPORTED_MODULE_77__internal_operators_startWith__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_78__internal_operators_subscribeOn__ = __webpack_require__(900);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"subscribeOn\", function() { return __WEBPACK_IMPORTED_MODULE_78__internal_operators_subscribeOn__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_79__internal_operators_switchAll__ = __webpack_require__(901);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"switchAll\", function() { return __WEBPACK_IMPORTED_MODULE_79__internal_operators_switchAll__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_80__internal_operators_switchMap__ = __webpack_require__(319);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"switchMap\", function() { return __WEBPACK_IMPORTED_MODULE_80__internal_operators_switchMap__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_81__internal_operators_switchMapTo__ = __webpack_require__(902);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"switchMapTo\", function() { return __WEBPACK_IMPORTED_MODULE_81__internal_operators_switchMapTo__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_82__internal_operators_take__ = __webpack_require__(320);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"take\", function() { return __WEBPACK_IMPORTED_MODULE_82__internal_operators_take__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_83__internal_operators_takeLast__ = __webpack_require__(321);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"takeLast\", function() { return __WEBPACK_IMPORTED_MODULE_83__internal_operators_takeLast__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_84__internal_operators_takeUntil__ = __webpack_require__(903);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"takeUntil\", function() { return __WEBPACK_IMPORTED_MODULE_84__internal_operators_takeUntil__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_85__internal_operators_takeWhile__ = __webpack_require__(904);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"takeWhile\", function() { return __WEBPACK_IMPORTED_MODULE_85__internal_operators_takeWhile__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_86__internal_operators_tap__ = __webpack_require__(435);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"tap\", function() { return __WEBPACK_IMPORTED_MODULE_86__internal_operators_tap__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_87__internal_operators_throttle__ = __webpack_require__(436);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"throttle\", function() { return __WEBPACK_IMPORTED_MODULE_87__internal_operators_throttle__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_88__internal_operators_throttleTime__ = __webpack_require__(905);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"throttleTime\", function() { return __WEBPACK_IMPORTED_MODULE_88__internal_operators_throttleTime__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_89__internal_operators_throwIfEmpty__ = __webpack_require__(189);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"throwIfEmpty\", function() { return __WEBPACK_IMPORTED_MODULE_89__internal_operators_throwIfEmpty__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_90__internal_operators_timeInterval__ = __webpack_require__(906);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"timeInterval\", function() { return __WEBPACK_IMPORTED_MODULE_90__internal_operators_timeInterval__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_91__internal_operators_timeout__ = __webpack_require__(907);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"timeout\", function() { return __WEBPACK_IMPORTED_MODULE_91__internal_operators_timeout__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_92__internal_operators_timeoutWith__ = __webpack_require__(437);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"timeoutWith\", function() { return __WEBPACK_IMPORTED_MODULE_92__internal_operators_timeoutWith__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_93__internal_operators_timestamp__ = __webpack_require__(908);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"timestamp\", function() { return __WEBPACK_IMPORTED_MODULE_93__internal_operators_timestamp__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_94__internal_operators_toArray__ = __webpack_require__(909);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"toArray\", function() { return __WEBPACK_IMPORTED_MODULE_94__internal_operators_toArray__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_95__internal_operators_window__ = __webpack_require__(910);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"window\", function() { return __WEBPACK_IMPORTED_MODULE_95__internal_operators_window__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_96__internal_operators_windowCount__ = __webpack_require__(911);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"windowCount\", function() { return __WEBPACK_IMPORTED_MODULE_96__internal_operators_windowCount__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_97__internal_operators_windowTime__ = __webpack_require__(912);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"windowTime\", function() { return __WEBPACK_IMPORTED_MODULE_97__internal_operators_windowTime__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_98__internal_operators_windowToggle__ = __webpack_require__(913);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"windowToggle\", function() { return __WEBPACK_IMPORTED_MODULE_98__internal_operators_windowToggle__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_99__internal_operators_windowWhen__ = __webpack_require__(914);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"windowWhen\", function() { return __WEBPACK_IMPORTED_MODULE_99__internal_operators_windowWhen__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_100__internal_operators_withLatestFrom__ = __webpack_require__(915);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"withLatestFrom\", function() { return __WEBPACK_IMPORTED_MODULE_100__internal_operators_withLatestFrom__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_101__internal_operators_zip__ = __webpack_require__(916);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"zip\", function() { return __WEBPACK_IMPORTED_MODULE_101__internal_operators_zip__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_102__internal_operators_zipAll__ = __webpack_require__(917);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"zipAll\", function() { return __WEBPACK_IMPORTED_MODULE_102__internal_operators_zipAll__[\"a\"]; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map\n\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"buffer\");\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nconst Buffer = __webpack_require__(46).Buffer\n\nconst crypto = __webpack_require__(11)\nconst Transform = __webpack_require__(23).Transform\n\nconst SPEC_ALGORITHMS = ['sha256', 'sha384', 'sha512']\n\nconst BASE64_REGEX = /^[a-z0-9+/]+(?:=?=?)$/i\nconst SRI_REGEX = /^([^-]+)-([^?]+)([?\\S*]*)$/\nconst STRICT_SRI_REGEX = /^([^-]+)-([A-Za-z0-9+/=]{44,88})(\\?[\\x21-\\x7E]*)*$/\nconst VCHAR_REGEX = /^[\\x21-\\x7E]+$/\n\nclass Hash {\n  get isHash () { return true }\n  constructor (hash, opts) {\n    const strict = !!(opts && opts.strict)\n    this.source = hash.trim()\n    // 3.1. Integrity metadata (called \"Hash\" by ssri)\n    // https://w3c.github.io/webappsec-subresource-integrity/#integrity-metadata-description\n    const match = this.source.match(\n      strict\n      ? STRICT_SRI_REGEX\n      : SRI_REGEX\n    )\n    if (!match) { return }\n    if (strict && !SPEC_ALGORITHMS.some(a => a === match[1])) { return }\n    this.algorithm = match[1]\n    this.digest = match[2]\n\n    const rawOpts = match[3]\n    this.options = rawOpts ? rawOpts.slice(1).split('?') : []\n  }\n  hexDigest () {\n    return this.digest && Buffer.from(this.digest, 'base64').toString('hex')\n  }\n  toJSON () {\n    return this.toString()\n  }\n  toString (opts) {\n    if (opts && opts.strict) {\n      // Strict mode enforces the standard as close to the foot of the\n      // letter as it can.\n      if (!(\n        // The spec has very restricted productions for algorithms.\n        // https://www.w3.org/TR/CSP2/#source-list-syntax\n        SPEC_ALGORITHMS.some(x => x === this.algorithm) &&\n        // Usually, if someone insists on using a \"different\" base64, we\n        // leave it as-is, since there's multiple standards, and the\n        // specified is not a URL-safe variant.\n        // https://www.w3.org/TR/CSP2/#base64_value\n        this.digest.match(BASE64_REGEX) &&\n        // Option syntax is strictly visual chars.\n        // https://w3c.github.io/webappsec-subresource-integrity/#grammardef-option-expression\n        // https://tools.ietf.org/html/rfc5234#appendix-B.1\n        (this.options || []).every(opt => opt.match(VCHAR_REGEX))\n      )) {\n        return ''\n      }\n    }\n    const options = this.options && this.options.length\n    ? `?${this.options.join('?')}`\n    : ''\n    return `${this.algorithm}-${this.digest}${options}`\n  }\n}\n\nclass Integrity {\n  get isIntegrity () { return true }\n  toJSON () {\n    return this.toString()\n  }\n  toString (opts) {\n    opts = opts || {}\n    let sep = opts.sep || ' '\n    if (opts.strict) {\n      // Entries must be separated by whitespace, according to spec.\n      sep = sep.replace(/\\S+/g, ' ')\n    }\n    return Object.keys(this).map(k => {\n      return this[k].map(hash => {\n        return Hash.prototype.toString.call(hash, opts)\n      }).filter(x => x.length).join(sep)\n    }).filter(x => x.length).join(sep)\n  }\n  concat (integrity, opts) {\n    const other = typeof integrity === 'string'\n    ? integrity\n    : stringify(integrity, opts)\n    return parse(`${this.toString(opts)} ${other}`, opts)\n  }\n  hexDigest () {\n    return parse(this, {single: true}).hexDigest()\n  }\n  match (integrity, opts) {\n    const other = parse(integrity, opts)\n    const algo = other.pickAlgorithm(opts)\n    return (\n      this[algo] &&\n      other[algo] &&\n      this[algo].find(hash =>\n        other[algo].find(otherhash =>\n          hash.digest === otherhash.digest\n        )\n      )\n    ) || false\n  }\n  pickAlgorithm (opts) {\n    const pickAlgorithm = (opts && opts.pickAlgorithm) || getPrioritizedHash\n    const keys = Object.keys(this)\n    if (!keys.length) {\n      throw new Error(`No algorithms available for ${\n        JSON.stringify(this.toString())\n      }`)\n    }\n    return keys.reduce((acc, algo) => {\n      return pickAlgorithm(acc, algo) || acc\n    })\n  }\n}\n\nmodule.exports.parse = parse\nfunction parse (sri, opts) {\n  opts = opts || {}\n  if (typeof sri === 'string') {\n    return _parse(sri, opts)\n  } else if (sri.algorithm && sri.digest) {\n    const fullSri = new Integrity()\n    fullSri[sri.algorithm] = [sri]\n    return _parse(stringify(fullSri, opts), opts)\n  } else {\n    return _parse(stringify(sri, opts), opts)\n  }\n}\n\nfunction _parse (integrity, opts) {\n  // 3.4.3. Parse metadata\n  // https://w3c.github.io/webappsec-subresource-integrity/#parse-metadata\n  if (opts.single) {\n    return new Hash(integrity, opts)\n  }\n  return integrity.trim().split(/\\s+/).reduce((acc, string) => {\n    const hash = new Hash(string, opts)\n    if (hash.algorithm && hash.digest) {\n      const algo = hash.algorithm\n      if (!acc[algo]) { acc[algo] = [] }\n      acc[algo].push(hash)\n    }\n    return acc\n  }, new Integrity())\n}\n\nmodule.exports.stringify = stringify\nfunction stringify (obj, opts) {\n  if (obj.algorithm && obj.digest) {\n    return Hash.prototype.toString.call(obj, opts)\n  } else if (typeof obj === 'string') {\n    return stringify(parse(obj, opts), opts)\n  } else {\n    return Integrity.prototype.toString.call(obj, opts)\n  }\n}\n\nmodule.exports.fromHex = fromHex\nfunction fromHex (hexDigest, algorithm, opts) {\n  const optString = (opts && opts.options && opts.options.length)\n  ? `?${opts.options.join('?')}`\n  : ''\n  return parse(\n    `${algorithm}-${\n      Buffer.from(hexDigest, 'hex').toString('base64')\n    }${optString}`, opts\n  )\n}\n\nmodule.exports.fromData = fromData\nfunction fromData (data, opts) {\n  opts = opts || {}\n  const algorithms = opts.algorithms || ['sha512']\n  const optString = opts.options && opts.options.length\n  ? `?${opts.options.join('?')}`\n  : ''\n  return algorithms.reduce((acc, algo) => {\n    const digest = crypto.createHash(algo).update(data).digest('base64')\n    const hash = new Hash(\n      `${algo}-${digest}${optString}`,\n       opts\n    )\n    if (hash.algorithm && hash.digest) {\n      const algo = hash.algorithm\n      if (!acc[algo]) { acc[algo] = [] }\n      acc[algo].push(hash)\n    }\n    return acc\n  }, new Integrity())\n}\n\nmodule.exports.fromStream = fromStream\nfunction fromStream (stream, opts) {\n  opts = opts || {}\n  const P = opts.Promise || Promise\n  const istream = integrityStream(opts)\n  return new P((resolve, reject) => {\n    stream.pipe(istream)\n    stream.on('error', reject)\n    istream.on('error', reject)\n    let sri\n    istream.on('integrity', s => { sri = s })\n    istream.on('end', () => resolve(sri))\n    istream.on('data', () => {})\n  })\n}\n\nmodule.exports.checkData = checkData\nfunction checkData (data, sri, opts) {\n  opts = opts || {}\n  sri = parse(sri, opts)\n  if (!Object.keys(sri).length) {\n    if (opts.error) {\n      throw Object.assign(\n        new Error('No valid integrity hashes to check against'), {\n          code: 'EINTEGRITY'\n        }\n      )\n    } else {\n      return false\n    }\n  }\n  const algorithm = sri.pickAlgorithm(opts)\n  const digest = crypto.createHash(algorithm).update(data).digest('base64')\n  const newSri = parse({algorithm, digest})\n  const match = newSri.match(sri, opts)\n  if (match || !opts.error) {\n    return match\n  } else if (typeof opts.size === 'number' && (data.length !== opts.size)) {\n    const err = new Error(`data size mismatch when checking ${sri}.\\n  Wanted: ${opts.size}\\n  Found: ${data.length}`)\n    err.code = 'EBADSIZE'\n    err.found = data.length\n    err.expected = opts.size\n    err.sri = sri\n    throw err\n  } else {\n    const err = new Error(`Integrity checksum failed when using ${algorithm}: Wanted ${sri}, but got ${newSri}. (${data.length} bytes)`)\n    err.code = 'EINTEGRITY'\n    err.found = newSri\n    err.expected = sri\n    err.algorithm = algorithm\n    err.sri = sri\n    throw err\n  }\n}\n\nmodule.exports.checkStream = checkStream\nfunction checkStream (stream, sri, opts) {\n  opts = opts || {}\n  const P = opts.Promise || Promise\n  const checker = integrityStream(Object.assign({}, opts, {\n    integrity: sri\n  }))\n  return new P((resolve, reject) => {\n    stream.pipe(checker)\n    stream.on('error', reject)\n    checker.on('error', reject)\n    let sri\n    checker.on('verified', s => { sri = s })\n    checker.on('end', () => resolve(sri))\n    checker.on('data', () => {})\n  })\n}\n\nmodule.exports.integrityStream = integrityStream\nfunction integrityStream (opts) {\n  opts = opts || {}\n  // For verification\n  const sri = opts.integrity && parse(opts.integrity, opts)\n  const goodSri = sri && Object.keys(sri).length\n  const algorithm = goodSri && sri.pickAlgorithm(opts)\n  const digests = goodSri && sri[algorithm]\n  // Calculating stream\n  const algorithms = Array.from(\n    new Set(\n      (opts.algorithms || ['sha512'])\n      .concat(algorithm ? [algorithm] : [])\n    )\n  )\n  const hashes = algorithms.map(crypto.createHash)\n  let streamSize = 0\n  const stream = new Transform({\n    transform (chunk, enc, cb) {\n      streamSize += chunk.length\n      hashes.forEach(h => h.update(chunk, enc))\n      cb(null, chunk, enc)\n    }\n  }).on('end', () => {\n    const optString = (opts.options && opts.options.length)\n    ? `?${opts.options.join('?')}`\n    : ''\n    const newSri = parse(hashes.map((h, i) => {\n      return `${algorithms[i]}-${h.digest('base64')}${optString}`\n    }).join(' '), opts)\n    // Integrity verification mode\n    const match = goodSri && newSri.match(sri, opts)\n    if (typeof opts.size === 'number' && streamSize !== opts.size) {\n      const err = new Error(`stream size mismatch when checking ${sri}.\\n  Wanted: ${opts.size}\\n  Found: ${streamSize}`)\n      err.code = 'EBADSIZE'\n      err.found = streamSize\n      err.expected = opts.size\n      err.sri = sri\n      stream.emit('error', err)\n    } else if (opts.integrity && !match) {\n      const err = new Error(`${sri} integrity checksum failed when using ${algorithm}: wanted ${digests} but got ${newSri}. (${streamSize} bytes)`)\n      err.code = 'EINTEGRITY'\n      err.found = newSri\n      err.expected = digests\n      err.algorithm = algorithm\n      err.sri = sri\n      stream.emit('error', err)\n    } else {\n      stream.emit('size', streamSize)\n      stream.emit('integrity', newSri)\n      match && stream.emit('verified', match)\n    }\n  })\n  return stream\n}\n\nmodule.exports.create = createIntegrity\nfunction createIntegrity (opts) {\n  opts = opts || {}\n  const algorithms = opts.algorithms || ['sha512']\n  const optString = opts.options && opts.options.length\n  ? `?${opts.options.join('?')}`\n  : ''\n\n  const hashes = algorithms.map(crypto.createHash)\n\n  return {\n    update: function (chunk, enc) {\n      hashes.forEach(h => h.update(chunk, enc))\n      return this\n    },\n    digest: function (enc) {\n      const integrity = algorithms.reduce((acc, algo) => {\n        const digest = hashes.shift().digest('base64')\n        const hash = new Hash(\n          `${algo}-${digest}${optString}`,\n          opts\n        )\n        if (hash.algorithm && hash.digest) {\n          const algo = hash.algorithm\n          if (!acc[algo]) { acc[algo] = [] }\n          acc[algo].push(hash)\n        }\n        return acc\n      }, new Integrity())\n\n      return integrity\n    }\n  }\n}\n\nconst NODE_HASHES = new Set(crypto.getHashes())\n\n// This is a Best Effort™ at a reasonable priority for hash algos\nconst DEFAULT_PRIORITY = [\n  'md5', 'whirlpool', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512',\n  // TODO - it's unclear _which_ of these Node will actually use as its name\n  //        for the algorithm, so we guesswork it based on the OpenSSL names.\n  'sha3',\n  'sha3-256', 'sha3-384', 'sha3-512',\n  'sha3_256', 'sha3_384', 'sha3_512'\n].filter(algo => NODE_HASHES.has(algo))\n\nfunction getPrioritizedHash (algo1, algo2) {\n  return DEFAULT_PRIORITY.indexOf(algo1.toLowerCase()) >= DEFAULT_PRIORITY.indexOf(algo2.toLowerCase())\n  ? algo1\n  : algo2\n}\n\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\n// If you have no idea what ASN.1 or BER is, see this:\n// ftp://ftp.rsa.com/pub/pkcs/ascii/layman.asc\n\nvar Ber = __webpack_require__(482);\n\n\n\n// --- Exported API\n\nmodule.exports = {\n\n  Ber: Ber,\n\n  BerReader: Ber.Reader,\n\n  BerWriter: Ber.Writer\n\n};\n\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.home = undefined;\n\nvar _rootUser;\n\nfunction _load_rootUser() {\n  return _rootUser = _interopRequireDefault(__webpack_require__(221));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst path = __webpack_require__(0);\n\nconst home = exports.home = __webpack_require__(42).homedir();\n\nconst userHomeDir = (_rootUser || _load_rootUser()).default ? path.resolve('/usr/local/share') : home;\n\nexports.default = userHomeDir;\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports) {\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// optional / simple context binding\nvar aFunction = __webpack_require__(68);\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1: return function (a) {\n      return fn.call(that, a);\n    };\n    case 2: return function (a, b) {\n      return fn.call(that, a, b);\n    };\n    case 3: return function (a, b, c) {\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function (/* ...args */) {\n    return fn.apply(that, arguments);\n  };\n};\n\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports) {\n\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(35);\nvar IE8_DOM_DEFINE = __webpack_require__(235);\nvar toPrimitive = __webpack_require__(252);\nvar dP = Object.defineProperty;\n\nexports.f = __webpack_require__(52) ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if (IE8_DOM_DEFINE) try {\n    return dP(O, P, Attributes);\n  } catch (e) { /* empty */ }\n  if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n  if ('value' in Attributes) O[P] = Attributes.value;\n  return O;\n};\n\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// JS-YAML's default schema for `load` function.\n// It is not described in the YAML specification.\n//\n// This schema is based on JS-YAML's default safe schema and includes\n// JavaScript-specific types: !!js/undefined, !!js/regexp and !!js/function.\n//\n// Also this schema is used as default base schema at `Schema.create` function.\n\n\n\n\n\nvar Schema = __webpack_require__(45);\n\n\nmodule.exports = Schema.DEFAULT = new Schema({\n  include: [\n    __webpack_require__(56)\n  ],\n  explicit: [\n    __webpack_require__(290),\n    __webpack_require__(289),\n    __webpack_require__(288)\n  ]\n});\n\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nvar assert = __webpack_require__(16);\nvar util = __webpack_require__(3);\n\nfunction FingerprintFormatError(fp, format) {\n\tif (Error.captureStackTrace)\n\t\tError.captureStackTrace(this, FingerprintFormatError);\n\tthis.name = 'FingerprintFormatError';\n\tthis.fingerprint = fp;\n\tthis.format = format;\n\tthis.message = 'Fingerprint format is not supported, or is invalid: ';\n\tif (fp !== undefined)\n\t\tthis.message += ' fingerprint = ' + fp;\n\tif (format !== undefined)\n\t\tthis.message += ' format = ' + format;\n}\nutil.inherits(FingerprintFormatError, Error);\n\nfunction InvalidAlgorithmError(alg) {\n\tif (Error.captureStackTrace)\n\t\tError.captureStackTrace(this, InvalidAlgorithmError);\n\tthis.name = 'InvalidAlgorithmError';\n\tthis.algorithm = alg;\n\tthis.message = 'Algorithm \"' + alg + '\" is not supported';\n}\nutil.inherits(InvalidAlgorithmError, Error);\n\nfunction KeyParseError(name, format, innerErr) {\n\tif (Error.captureStackTrace)\n\t\tError.captureStackTrace(this, KeyParseError);\n\tthis.name = 'KeyParseError';\n\tthis.format = format;\n\tthis.keyName = name;\n\tthis.innerErr = innerErr;\n\tthis.message = 'Failed to parse ' + name + ' as a valid ' + format +\n\t    ' format key: ' + innerErr.message;\n}\nutil.inherits(KeyParseError, Error);\n\nfunction SignatureParseError(type, format, innerErr) {\n\tif (Error.captureStackTrace)\n\t\tError.captureStackTrace(this, SignatureParseError);\n\tthis.name = 'SignatureParseError';\n\tthis.type = type;\n\tthis.format = format;\n\tthis.innerErr = innerErr;\n\tthis.message = 'Failed to parse the given data as a ' + type +\n\t    ' signature in ' + format + ' format: ' + innerErr.message;\n}\nutil.inherits(SignatureParseError, Error);\n\nfunction CertificateParseError(name, format, innerErr) {\n\tif (Error.captureStackTrace)\n\t\tError.captureStackTrace(this, CertificateParseError);\n\tthis.name = 'CertificateParseError';\n\tthis.format = format;\n\tthis.certName = name;\n\tthis.innerErr = innerErr;\n\tthis.message = 'Failed to parse ' + name + ' as a valid ' + format +\n\t    ' format certificate: ' + innerErr.message;\n}\nutil.inherits(CertificateParseError, Error);\n\nfunction KeyEncryptedError(name, format) {\n\tif (Error.captureStackTrace)\n\t\tError.captureStackTrace(this, KeyEncryptedError);\n\tthis.name = 'KeyEncryptedError';\n\tthis.format = format;\n\tthis.keyName = name;\n\tthis.message = 'The ' + format + ' format key ' + name + ' is ' +\n\t    'encrypted (password-protected), and no passphrase was ' +\n\t    'provided in `options`';\n}\nutil.inherits(KeyEncryptedError, Error);\n\nmodule.exports = {\n\tFingerprintFormatError: FingerprintFormatError,\n\tInvalidAlgorithmError: InvalidAlgorithmError,\n\tKeyParseError: KeyParseError,\n\tSignatureParseError: SignatureParseError,\n\tKeyEncryptedError: KeyEncryptedError,\n\tCertificateParseError: CertificateParseError\n};\n\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nmodule.exports = Signature;\n\nvar assert = __webpack_require__(16);\nvar Buffer = __webpack_require__(15).Buffer;\nvar algs = __webpack_require__(32);\nvar crypto = __webpack_require__(11);\nvar errs = __webpack_require__(74);\nvar utils = __webpack_require__(26);\nvar asn1 = __webpack_require__(66);\nvar SSHBuffer = __webpack_require__(160);\n\nvar InvalidAlgorithmError = errs.InvalidAlgorithmError;\nvar SignatureParseError = errs.SignatureParseError;\n\nfunction Signature(opts) {\n\tassert.object(opts, 'options');\n\tassert.arrayOfObject(opts.parts, 'options.parts');\n\tassert.string(opts.type, 'options.type');\n\n\tvar partLookup = {};\n\tfor (var i = 0; i < opts.parts.length; ++i) {\n\t\tvar part = opts.parts[i];\n\t\tpartLookup[part.name] = part;\n\t}\n\n\tthis.type = opts.type;\n\tthis.hashAlgorithm = opts.hashAlgo;\n\tthis.curve = opts.curve;\n\tthis.parts = opts.parts;\n\tthis.part = partLookup;\n}\n\nSignature.prototype.toBuffer = function (format) {\n\tif (format === undefined)\n\t\tformat = 'asn1';\n\tassert.string(format, 'format');\n\n\tvar buf;\n\tvar stype = 'ssh-' + this.type;\n\n\tswitch (this.type) {\n\tcase 'rsa':\n\t\tswitch (this.hashAlgorithm) {\n\t\tcase 'sha256':\n\t\t\tstype = 'rsa-sha2-256';\n\t\t\tbreak;\n\t\tcase 'sha512':\n\t\t\tstype = 'rsa-sha2-512';\n\t\t\tbreak;\n\t\tcase 'sha1':\n\t\tcase undefined:\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow (new Error('SSH signature ' +\n\t\t\t    'format does not support hash ' +\n\t\t\t    'algorithm ' + this.hashAlgorithm));\n\t\t}\n\t\tif (format === 'ssh') {\n\t\t\tbuf = new SSHBuffer({});\n\t\t\tbuf.writeString(stype);\n\t\t\tbuf.writePart(this.part.sig);\n\t\t\treturn (buf.toBuffer());\n\t\t} else {\n\t\t\treturn (this.part.sig.data);\n\t\t}\n\t\tbreak;\n\n\tcase 'ed25519':\n\t\tif (format === 'ssh') {\n\t\t\tbuf = new SSHBuffer({});\n\t\t\tbuf.writeString(stype);\n\t\t\tbuf.writePart(this.part.sig);\n\t\t\treturn (buf.toBuffer());\n\t\t} else {\n\t\t\treturn (this.part.sig.data);\n\t\t}\n\t\tbreak;\n\n\tcase 'dsa':\n\tcase 'ecdsa':\n\t\tvar r, s;\n\t\tif (format === 'asn1') {\n\t\t\tvar der = new asn1.BerWriter();\n\t\t\tder.startSequence();\n\t\t\tr = utils.mpNormalize(this.part.r.data);\n\t\t\ts = utils.mpNormalize(this.part.s.data);\n\t\t\tder.writeBuffer(r, asn1.Ber.Integer);\n\t\t\tder.writeBuffer(s, asn1.Ber.Integer);\n\t\t\tder.endSequence();\n\t\t\treturn (der.buffer);\n\t\t} else if (format === 'ssh' && this.type === 'dsa') {\n\t\t\tbuf = new SSHBuffer({});\n\t\t\tbuf.writeString('ssh-dss');\n\t\t\tr = this.part.r.data;\n\t\t\tif (r.length > 20 && r[0] === 0x00)\n\t\t\t\tr = r.slice(1);\n\t\t\ts = this.part.s.data;\n\t\t\tif (s.length > 20 && s[0] === 0x00)\n\t\t\t\ts = s.slice(1);\n\t\t\tif ((this.hashAlgorithm &&\n\t\t\t    this.hashAlgorithm !== 'sha1') ||\n\t\t\t    r.length + s.length !== 40) {\n\t\t\t\tthrow (new Error('OpenSSH only supports ' +\n\t\t\t\t    'DSA signatures with SHA1 hash'));\n\t\t\t}\n\t\t\tbuf.writeBuffer(Buffer.concat([r, s]));\n\t\t\treturn (buf.toBuffer());\n\t\t} else if (format === 'ssh' && this.type === 'ecdsa') {\n\t\t\tvar inner = new SSHBuffer({});\n\t\t\tr = this.part.r.data;\n\t\t\tinner.writeBuffer(r);\n\t\t\tinner.writePart(this.part.s);\n\n\t\t\tbuf = new SSHBuffer({});\n\t\t\t/* XXX: find a more proper way to do this? */\n\t\t\tvar curve;\n\t\t\tif (r[0] === 0x00)\n\t\t\t\tr = r.slice(1);\n\t\t\tvar sz = r.length * 8;\n\t\t\tif (sz === 256)\n\t\t\t\tcurve = 'nistp256';\n\t\t\telse if (sz === 384)\n\t\t\t\tcurve = 'nistp384';\n\t\t\telse if (sz === 528)\n\t\t\t\tcurve = 'nistp521';\n\t\t\tbuf.writeString('ecdsa-sha2-' + curve);\n\t\t\tbuf.writeBuffer(inner.toBuffer());\n\t\t\treturn (buf.toBuffer());\n\t\t}\n\t\tthrow (new Error('Invalid signature format'));\n\tdefault:\n\t\tthrow (new Error('Invalid signature data'));\n\t}\n};\n\nSignature.prototype.toString = function (format) {\n\tassert.optionalString(format, 'format');\n\treturn (this.toBuffer(format).toString('base64'));\n};\n\nSignature.parse = function (data, type, format) {\n\tif (typeof (data) === 'string')\n\t\tdata = Buffer.from(data, 'base64');\n\tassert.buffer(data, 'data');\n\tassert.string(format, 'format');\n\tassert.string(type, 'type');\n\n\tvar opts = {};\n\topts.type = type.toLowerCase();\n\topts.parts = [];\n\n\ttry {\n\t\tassert.ok(data.length > 0, 'signature must not be empty');\n\t\tswitch (opts.type) {\n\t\tcase 'rsa':\n\t\t\treturn (parseOneNum(data, type, format, opts));\n\t\tcase 'ed25519':\n\t\t\treturn (parseOneNum(data, type, format, opts));\n\n\t\tcase 'dsa':\n\t\tcase 'ecdsa':\n\t\t\tif (format === 'asn1')\n\t\t\t\treturn (parseDSAasn1(data, type, format, opts));\n\t\t\telse if (opts.type === 'dsa')\n\t\t\t\treturn (parseDSA(data, type, format, opts));\n\t\t\telse\n\t\t\t\treturn (parseECDSA(data, type, format, opts));\n\n\t\tdefault:\n\t\t\tthrow (new InvalidAlgorithmError(type));\n\t\t}\n\n\t} catch (e) {\n\t\tif (e instanceof InvalidAlgorithmError)\n\t\t\tthrow (e);\n\t\tthrow (new SignatureParseError(type, format, e));\n\t}\n};\n\nfunction parseOneNum(data, type, format, opts) {\n\tif (format === 'ssh') {\n\t\ttry {\n\t\t\tvar buf = new SSHBuffer({buffer: data});\n\t\t\tvar head = buf.readString();\n\t\t} catch (e) {\n\t\t\t/* fall through */\n\t\t}\n\t\tif (buf !== undefined) {\n\t\t\tvar msg = 'SSH signature does not match expected ' +\n\t\t\t    'type (expected ' + type + ', got ' + head + ')';\n\t\t\tswitch (head) {\n\t\t\tcase 'ssh-rsa':\n\t\t\t\tassert.strictEqual(type, 'rsa', msg);\n\t\t\t\topts.hashAlgo = 'sha1';\n\t\t\t\tbreak;\n\t\t\tcase 'rsa-sha2-256':\n\t\t\t\tassert.strictEqual(type, 'rsa', msg);\n\t\t\t\topts.hashAlgo = 'sha256';\n\t\t\t\tbreak;\n\t\t\tcase 'rsa-sha2-512':\n\t\t\t\tassert.strictEqual(type, 'rsa', msg);\n\t\t\t\topts.hashAlgo = 'sha512';\n\t\t\t\tbreak;\n\t\t\tcase 'ssh-ed25519':\n\t\t\t\tassert.strictEqual(type, 'ed25519', msg);\n\t\t\t\topts.hashAlgo = 'sha512';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow (new Error('Unknown SSH signature ' +\n\t\t\t\t    'type: ' + head));\n\t\t\t}\n\t\t\tvar sig = buf.readPart();\n\t\t\tassert.ok(buf.atEnd(), 'extra trailing bytes');\n\t\t\tsig.name = 'sig';\n\t\t\topts.parts.push(sig);\n\t\t\treturn (new Signature(opts));\n\t\t}\n\t}\n\topts.parts.push({name: 'sig', data: data});\n\treturn (new Signature(opts));\n}\n\nfunction parseDSAasn1(data, type, format, opts) {\n\tvar der = new asn1.BerReader(data);\n\tder.readSequence();\n\tvar r = der.readString(asn1.Ber.Integer, true);\n\tvar s = der.readString(asn1.Ber.Integer, true);\n\n\topts.parts.push({name: 'r', data: utils.mpNormalize(r)});\n\topts.parts.push({name: 's', data: utils.mpNormalize(s)});\n\n\treturn (new Signature(opts));\n}\n\nfunction parseDSA(data, type, format, opts) {\n\tif (data.length != 40) {\n\t\tvar buf = new SSHBuffer({buffer: data});\n\t\tvar d = buf.readBuffer();\n\t\tif (d.toString('ascii') === 'ssh-dss')\n\t\t\td = buf.readBuffer();\n\t\tassert.ok(buf.atEnd(), 'extra trailing bytes');\n\t\tassert.strictEqual(d.length, 40, 'invalid inner length');\n\t\tdata = d;\n\t}\n\topts.parts.push({name: 'r', data: data.slice(0, 20)});\n\topts.parts.push({name: 's', data: data.slice(20, 40)});\n\treturn (new Signature(opts));\n}\n\nfunction parseECDSA(data, type, format, opts) {\n\tvar buf = new SSHBuffer({buffer: data});\n\n\tvar r, s;\n\tvar inner = buf.readBuffer();\n\tvar stype = inner.toString('ascii');\n\tif (stype.slice(0, 6) === 'ecdsa-') {\n\t\tvar parts = stype.split('-');\n\t\tassert.strictEqual(parts[0], 'ecdsa');\n\t\tassert.strictEqual(parts[1], 'sha2');\n\t\topts.curve = parts[2];\n\t\tswitch (opts.curve) {\n\t\tcase 'nistp256':\n\t\t\topts.hashAlgo = 'sha256';\n\t\t\tbreak;\n\t\tcase 'nistp384':\n\t\t\topts.hashAlgo = 'sha384';\n\t\t\tbreak;\n\t\tcase 'nistp521':\n\t\t\topts.hashAlgo = 'sha512';\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow (new Error('Unsupported ECDSA curve: ' +\n\t\t\t    opts.curve));\n\t\t}\n\t\tinner = buf.readBuffer();\n\t\tassert.ok(buf.atEnd(), 'extra trailing bytes on outer');\n\t\tbuf = new SSHBuffer({buffer: inner});\n\t\tr = buf.readPart();\n\t} else {\n\t\tr = {data: inner};\n\t}\n\n\ts = buf.readPart();\n\tassert.ok(buf.atEnd(), 'extra trailing bytes');\n\n\tr.name = 'r';\n\ts.name = 's';\n\n\topts.parts.push(r);\n\topts.parts.push(s);\n\treturn (new Signature(opts));\n}\n\nSignature.isSignature = function (obj, ver) {\n\treturn (utils.isCompatible(obj, Signature, ver));\n};\n\n/*\n * API versions for Signature:\n * [1,0] -- initial ver\n * [2,0] -- support for rsa in full ssh format, compat with sshpk-agent\n *          hashAlgorithm property\n * [2,1] -- first tagged version\n */\nSignature.prototype._sshpkApiVersion = [2, 1];\n\nSignature._oldVersionDetect = function (obj) {\n\tassert.func(obj.toBuffer);\n\tif (obj.hasOwnProperty('hashAlgorithm'))\n\t\treturn ([2, 0]);\n\treturn ([1, 0]);\n};\n\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\n(function(nacl) {\n'use strict';\n\n// Ported in 2014 by Dmitry Chestnykh and Devi Mandiri.\n// Public domain.\n//\n// Implementation derived from TweetNaCl version 20140427.\n// See for details: http://tweetnacl.cr.yp.to/\n\nvar gf = function(init) {\n  var i, r = new Float64Array(16);\n  if (init) for (i = 0; i < init.length; i++) r[i] = init[i];\n  return r;\n};\n\n//  Pluggable, initialized in high-level API below.\nvar randombytes = function(/* x, n */) { throw new Error('no PRNG'); };\n\nvar _0 = new Uint8Array(16);\nvar _9 = new Uint8Array(32); _9[0] = 9;\n\nvar gf0 = gf(),\n    gf1 = gf([1]),\n    _121665 = gf([0xdb41, 1]),\n    D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),\n    D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),\n    X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),\n    Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),\n    I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);\n\nfunction ts64(x, i, h, l) {\n  x[i]   = (h >> 24) & 0xff;\n  x[i+1] = (h >> 16) & 0xff;\n  x[i+2] = (h >>  8) & 0xff;\n  x[i+3] = h & 0xff;\n  x[i+4] = (l >> 24)  & 0xff;\n  x[i+5] = (l >> 16)  & 0xff;\n  x[i+6] = (l >>  8)  & 0xff;\n  x[i+7] = l & 0xff;\n}\n\nfunction vn(x, xi, y, yi, n) {\n  var i,d = 0;\n  for (i = 0; i < n; i++) d |= x[xi+i]^y[yi+i];\n  return (1 & ((d - 1) >>> 8)) - 1;\n}\n\nfunction crypto_verify_16(x, xi, y, yi) {\n  return vn(x,xi,y,yi,16);\n}\n\nfunction crypto_verify_32(x, xi, y, yi) {\n  return vn(x,xi,y,yi,32);\n}\n\nfunction core_salsa20(o, p, k, c) {\n  var j0  = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,\n      j1  = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,\n      j2  = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,\n      j3  = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,\n      j4  = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,\n      j5  = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,\n      j6  = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,\n      j7  = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,\n      j8  = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,\n      j9  = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,\n      j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,\n      j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,\n      j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,\n      j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,\n      j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,\n      j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;\n\n  var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n      x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n      x15 = j15, u;\n\n  for (var i = 0; i < 20; i += 2) {\n    u = x0 + x12 | 0;\n    x4 ^= u<<7 | u>>>(32-7);\n    u = x4 + x0 | 0;\n    x8 ^= u<<9 | u>>>(32-9);\n    u = x8 + x4 | 0;\n    x12 ^= u<<13 | u>>>(32-13);\n    u = x12 + x8 | 0;\n    x0 ^= u<<18 | u>>>(32-18);\n\n    u = x5 + x1 | 0;\n    x9 ^= u<<7 | u>>>(32-7);\n    u = x9 + x5 | 0;\n    x13 ^= u<<9 | u>>>(32-9);\n    u = x13 + x9 | 0;\n    x1 ^= u<<13 | u>>>(32-13);\n    u = x1 + x13 | 0;\n    x5 ^= u<<18 | u>>>(32-18);\n\n    u = x10 + x6 | 0;\n    x14 ^= u<<7 | u>>>(32-7);\n    u = x14 + x10 | 0;\n    x2 ^= u<<9 | u>>>(32-9);\n    u = x2 + x14 | 0;\n    x6 ^= u<<13 | u>>>(32-13);\n    u = x6 + x2 | 0;\n    x10 ^= u<<18 | u>>>(32-18);\n\n    u = x15 + x11 | 0;\n    x3 ^= u<<7 | u>>>(32-7);\n    u = x3 + x15 | 0;\n    x7 ^= u<<9 | u>>>(32-9);\n    u = x7 + x3 | 0;\n    x11 ^= u<<13 | u>>>(32-13);\n    u = x11 + x7 | 0;\n    x15 ^= u<<18 | u>>>(32-18);\n\n    u = x0 + x3 | 0;\n    x1 ^= u<<7 | u>>>(32-7);\n    u = x1 + x0 | 0;\n    x2 ^= u<<9 | u>>>(32-9);\n    u = x2 + x1 | 0;\n    x3 ^= u<<13 | u>>>(32-13);\n    u = x3 + x2 | 0;\n    x0 ^= u<<18 | u>>>(32-18);\n\n    u = x5 + x4 | 0;\n    x6 ^= u<<7 | u>>>(32-7);\n    u = x6 + x5 | 0;\n    x7 ^= u<<9 | u>>>(32-9);\n    u = x7 + x6 | 0;\n    x4 ^= u<<13 | u>>>(32-13);\n    u = x4 + x7 | 0;\n    x5 ^= u<<18 | u>>>(32-18);\n\n    u = x10 + x9 | 0;\n    x11 ^= u<<7 | u>>>(32-7);\n    u = x11 + x10 | 0;\n    x8 ^= u<<9 | u>>>(32-9);\n    u = x8 + x11 | 0;\n    x9 ^= u<<13 | u>>>(32-13);\n    u = x9 + x8 | 0;\n    x10 ^= u<<18 | u>>>(32-18);\n\n    u = x15 + x14 | 0;\n    x12 ^= u<<7 | u>>>(32-7);\n    u = x12 + x15 | 0;\n    x13 ^= u<<9 | u>>>(32-9);\n    u = x13 + x12 | 0;\n    x14 ^= u<<13 | u>>>(32-13);\n    u = x14 + x13 | 0;\n    x15 ^= u<<18 | u>>>(32-18);\n  }\n   x0 =  x0 +  j0 | 0;\n   x1 =  x1 +  j1 | 0;\n   x2 =  x2 +  j2 | 0;\n   x3 =  x3 +  j3 | 0;\n   x4 =  x4 +  j4 | 0;\n   x5 =  x5 +  j5 | 0;\n   x6 =  x6 +  j6 | 0;\n   x7 =  x7 +  j7 | 0;\n   x8 =  x8 +  j8 | 0;\n   x9 =  x9 +  j9 | 0;\n  x10 = x10 + j10 | 0;\n  x11 = x11 + j11 | 0;\n  x12 = x12 + j12 | 0;\n  x13 = x13 + j13 | 0;\n  x14 = x14 + j14 | 0;\n  x15 = x15 + j15 | 0;\n\n  o[ 0] = x0 >>>  0 & 0xff;\n  o[ 1] = x0 >>>  8 & 0xff;\n  o[ 2] = x0 >>> 16 & 0xff;\n  o[ 3] = x0 >>> 24 & 0xff;\n\n  o[ 4] = x1 >>>  0 & 0xff;\n  o[ 5] = x1 >>>  8 & 0xff;\n  o[ 6] = x1 >>> 16 & 0xff;\n  o[ 7] = x1 >>> 24 & 0xff;\n\n  o[ 8] = x2 >>>  0 & 0xff;\n  o[ 9] = x2 >>>  8 & 0xff;\n  o[10] = x2 >>> 16 & 0xff;\n  o[11] = x2 >>> 24 & 0xff;\n\n  o[12] = x3 >>>  0 & 0xff;\n  o[13] = x3 >>>  8 & 0xff;\n  o[14] = x3 >>> 16 & 0xff;\n  o[15] = x3 >>> 24 & 0xff;\n\n  o[16] = x4 >>>  0 & 0xff;\n  o[17] = x4 >>>  8 & 0xff;\n  o[18] = x4 >>> 16 & 0xff;\n  o[19] = x4 >>> 24 & 0xff;\n\n  o[20] = x5 >>>  0 & 0xff;\n  o[21] = x5 >>>  8 & 0xff;\n  o[22] = x5 >>> 16 & 0xff;\n  o[23] = x5 >>> 24 & 0xff;\n\n  o[24] = x6 >>>  0 & 0xff;\n  o[25] = x6 >>>  8 & 0xff;\n  o[26] = x6 >>> 16 & 0xff;\n  o[27] = x6 >>> 24 & 0xff;\n\n  o[28] = x7 >>>  0 & 0xff;\n  o[29] = x7 >>>  8 & 0xff;\n  o[30] = x7 >>> 16 & 0xff;\n  o[31] = x7 >>> 24 & 0xff;\n\n  o[32] = x8 >>>  0 & 0xff;\n  o[33] = x8 >>>  8 & 0xff;\n  o[34] = x8 >>> 16 & 0xff;\n  o[35] = x8 >>> 24 & 0xff;\n\n  o[36] = x9 >>>  0 & 0xff;\n  o[37] = x9 >>>  8 & 0xff;\n  o[38] = x9 >>> 16 & 0xff;\n  o[39] = x9 >>> 24 & 0xff;\n\n  o[40] = x10 >>>  0 & 0xff;\n  o[41] = x10 >>>  8 & 0xff;\n  o[42] = x10 >>> 16 & 0xff;\n  o[43] = x10 >>> 24 & 0xff;\n\n  o[44] = x11 >>>  0 & 0xff;\n  o[45] = x11 >>>  8 & 0xff;\n  o[46] = x11 >>> 16 & 0xff;\n  o[47] = x11 >>> 24 & 0xff;\n\n  o[48] = x12 >>>  0 & 0xff;\n  o[49] = x12 >>>  8 & 0xff;\n  o[50] = x12 >>> 16 & 0xff;\n  o[51] = x12 >>> 24 & 0xff;\n\n  o[52] = x13 >>>  0 & 0xff;\n  o[53] = x13 >>>  8 & 0xff;\n  o[54] = x13 >>> 16 & 0xff;\n  o[55] = x13 >>> 24 & 0xff;\n\n  o[56] = x14 >>>  0 & 0xff;\n  o[57] = x14 >>>  8 & 0xff;\n  o[58] = x14 >>> 16 & 0xff;\n  o[59] = x14 >>> 24 & 0xff;\n\n  o[60] = x15 >>>  0 & 0xff;\n  o[61] = x15 >>>  8 & 0xff;\n  o[62] = x15 >>> 16 & 0xff;\n  o[63] = x15 >>> 24 & 0xff;\n}\n\nfunction core_hsalsa20(o,p,k,c) {\n  var j0  = c[ 0] & 0xff | (c[ 1] & 0xff)<<8 | (c[ 2] & 0xff)<<16 | (c[ 3] & 0xff)<<24,\n      j1  = k[ 0] & 0xff | (k[ 1] & 0xff)<<8 | (k[ 2] & 0xff)<<16 | (k[ 3] & 0xff)<<24,\n      j2  = k[ 4] & 0xff | (k[ 5] & 0xff)<<8 | (k[ 6] & 0xff)<<16 | (k[ 7] & 0xff)<<24,\n      j3  = k[ 8] & 0xff | (k[ 9] & 0xff)<<8 | (k[10] & 0xff)<<16 | (k[11] & 0xff)<<24,\n      j4  = k[12] & 0xff | (k[13] & 0xff)<<8 | (k[14] & 0xff)<<16 | (k[15] & 0xff)<<24,\n      j5  = c[ 4] & 0xff | (c[ 5] & 0xff)<<8 | (c[ 6] & 0xff)<<16 | (c[ 7] & 0xff)<<24,\n      j6  = p[ 0] & 0xff | (p[ 1] & 0xff)<<8 | (p[ 2] & 0xff)<<16 | (p[ 3] & 0xff)<<24,\n      j7  = p[ 4] & 0xff | (p[ 5] & 0xff)<<8 | (p[ 6] & 0xff)<<16 | (p[ 7] & 0xff)<<24,\n      j8  = p[ 8] & 0xff | (p[ 9] & 0xff)<<8 | (p[10] & 0xff)<<16 | (p[11] & 0xff)<<24,\n      j9  = p[12] & 0xff | (p[13] & 0xff)<<8 | (p[14] & 0xff)<<16 | (p[15] & 0xff)<<24,\n      j10 = c[ 8] & 0xff | (c[ 9] & 0xff)<<8 | (c[10] & 0xff)<<16 | (c[11] & 0xff)<<24,\n      j11 = k[16] & 0xff | (k[17] & 0xff)<<8 | (k[18] & 0xff)<<16 | (k[19] & 0xff)<<24,\n      j12 = k[20] & 0xff | (k[21] & 0xff)<<8 | (k[22] & 0xff)<<16 | (k[23] & 0xff)<<24,\n      j13 = k[24] & 0xff | (k[25] & 0xff)<<8 | (k[26] & 0xff)<<16 | (k[27] & 0xff)<<24,\n      j14 = k[28] & 0xff | (k[29] & 0xff)<<8 | (k[30] & 0xff)<<16 | (k[31] & 0xff)<<24,\n      j15 = c[12] & 0xff | (c[13] & 0xff)<<8 | (c[14] & 0xff)<<16 | (c[15] & 0xff)<<24;\n\n  var x0 = j0, x1 = j1, x2 = j2, x3 = j3, x4 = j4, x5 = j5, x6 = j6, x7 = j7,\n      x8 = j8, x9 = j9, x10 = j10, x11 = j11, x12 = j12, x13 = j13, x14 = j14,\n      x15 = j15, u;\n\n  for (var i = 0; i < 20; i += 2) {\n    u = x0 + x12 | 0;\n    x4 ^= u<<7 | u>>>(32-7);\n    u = x4 + x0 | 0;\n    x8 ^= u<<9 | u>>>(32-9);\n    u = x8 + x4 | 0;\n    x12 ^= u<<13 | u>>>(32-13);\n    u = x12 + x8 | 0;\n    x0 ^= u<<18 | u>>>(32-18);\n\n    u = x5 + x1 | 0;\n    x9 ^= u<<7 | u>>>(32-7);\n    u = x9 + x5 | 0;\n    x13 ^= u<<9 | u>>>(32-9);\n    u = x13 + x9 | 0;\n    x1 ^= u<<13 | u>>>(32-13);\n    u = x1 + x13 | 0;\n    x5 ^= u<<18 | u>>>(32-18);\n\n    u = x10 + x6 | 0;\n    x14 ^= u<<7 | u>>>(32-7);\n    u = x14 + x10 | 0;\n    x2 ^= u<<9 | u>>>(32-9);\n    u = x2 + x14 | 0;\n    x6 ^= u<<13 | u>>>(32-13);\n    u = x6 + x2 | 0;\n    x10 ^= u<<18 | u>>>(32-18);\n\n    u = x15 + x11 | 0;\n    x3 ^= u<<7 | u>>>(32-7);\n    u = x3 + x15 | 0;\n    x7 ^= u<<9 | u>>>(32-9);\n    u = x7 + x3 | 0;\n    x11 ^= u<<13 | u>>>(32-13);\n    u = x11 + x7 | 0;\n    x15 ^= u<<18 | u>>>(32-18);\n\n    u = x0 + x3 | 0;\n    x1 ^= u<<7 | u>>>(32-7);\n    u = x1 + x0 | 0;\n    x2 ^= u<<9 | u>>>(32-9);\n    u = x2 + x1 | 0;\n    x3 ^= u<<13 | u>>>(32-13);\n    u = x3 + x2 | 0;\n    x0 ^= u<<18 | u>>>(32-18);\n\n    u = x5 + x4 | 0;\n    x6 ^= u<<7 | u>>>(32-7);\n    u = x6 + x5 | 0;\n    x7 ^= u<<9 | u>>>(32-9);\n    u = x7 + x6 | 0;\n    x4 ^= u<<13 | u>>>(32-13);\n    u = x4 + x7 | 0;\n    x5 ^= u<<18 | u>>>(32-18);\n\n    u = x10 + x9 | 0;\n    x11 ^= u<<7 | u>>>(32-7);\n    u = x11 + x10 | 0;\n    x8 ^= u<<9 | u>>>(32-9);\n    u = x8 + x11 | 0;\n    x9 ^= u<<13 | u>>>(32-13);\n    u = x9 + x8 | 0;\n    x10 ^= u<<18 | u>>>(32-18);\n\n    u = x15 + x14 | 0;\n    x12 ^= u<<7 | u>>>(32-7);\n    u = x12 + x15 | 0;\n    x13 ^= u<<9 | u>>>(32-9);\n    u = x13 + x12 | 0;\n    x14 ^= u<<13 | u>>>(32-13);\n    u = x14 + x13 | 0;\n    x15 ^= u<<18 | u>>>(32-18);\n  }\n\n  o[ 0] = x0 >>>  0 & 0xff;\n  o[ 1] = x0 >>>  8 & 0xff;\n  o[ 2] = x0 >>> 16 & 0xff;\n  o[ 3] = x0 >>> 24 & 0xff;\n\n  o[ 4] = x5 >>>  0 & 0xff;\n  o[ 5] = x5 >>>  8 & 0xff;\n  o[ 6] = x5 >>> 16 & 0xff;\n  o[ 7] = x5 >>> 24 & 0xff;\n\n  o[ 8] = x10 >>>  0 & 0xff;\n  o[ 9] = x10 >>>  8 & 0xff;\n  o[10] = x10 >>> 16 & 0xff;\n  o[11] = x10 >>> 24 & 0xff;\n\n  o[12] = x15 >>>  0 & 0xff;\n  o[13] = x15 >>>  8 & 0xff;\n  o[14] = x15 >>> 16 & 0xff;\n  o[15] = x15 >>> 24 & 0xff;\n\n  o[16] = x6 >>>  0 & 0xff;\n  o[17] = x6 >>>  8 & 0xff;\n  o[18] = x6 >>> 16 & 0xff;\n  o[19] = x6 >>> 24 & 0xff;\n\n  o[20] = x7 >>>  0 & 0xff;\n  o[21] = x7 >>>  8 & 0xff;\n  o[22] = x7 >>> 16 & 0xff;\n  o[23] = x7 >>> 24 & 0xff;\n\n  o[24] = x8 >>>  0 & 0xff;\n  o[25] = x8 >>>  8 & 0xff;\n  o[26] = x8 >>> 16 & 0xff;\n  o[27] = x8 >>> 24 & 0xff;\n\n  o[28] = x9 >>>  0 & 0xff;\n  o[29] = x9 >>>  8 & 0xff;\n  o[30] = x9 >>> 16 & 0xff;\n  o[31] = x9 >>> 24 & 0xff;\n}\n\nfunction crypto_core_salsa20(out,inp,k,c) {\n  core_salsa20(out,inp,k,c);\n}\n\nfunction crypto_core_hsalsa20(out,inp,k,c) {\n  core_hsalsa20(out,inp,k,c);\n}\n\nvar sigma = new Uint8Array([101, 120, 112, 97, 110, 100, 32, 51, 50, 45, 98, 121, 116, 101, 32, 107]);\n            // \"expand 32-byte k\"\n\nfunction crypto_stream_salsa20_xor(c,cpos,m,mpos,b,n,k) {\n  var z = new Uint8Array(16), x = new Uint8Array(64);\n  var u, i;\n  for (i = 0; i < 16; i++) z[i] = 0;\n  for (i = 0; i < 8; i++) z[i] = n[i];\n  while (b >= 64) {\n    crypto_core_salsa20(x,z,k,sigma);\n    for (i = 0; i < 64; i++) c[cpos+i] = m[mpos+i] ^ x[i];\n    u = 1;\n    for (i = 8; i < 16; i++) {\n      u = u + (z[i] & 0xff) | 0;\n      z[i] = u & 0xff;\n      u >>>= 8;\n    }\n    b -= 64;\n    cpos += 64;\n    mpos += 64;\n  }\n  if (b > 0) {\n    crypto_core_salsa20(x,z,k,sigma);\n    for (i = 0; i < b; i++) c[cpos+i] = m[mpos+i] ^ x[i];\n  }\n  return 0;\n}\n\nfunction crypto_stream_salsa20(c,cpos,b,n,k) {\n  var z = new Uint8Array(16), x = new Uint8Array(64);\n  var u, i;\n  for (i = 0; i < 16; i++) z[i] = 0;\n  for (i = 0; i < 8; i++) z[i] = n[i];\n  while (b >= 64) {\n    crypto_core_salsa20(x,z,k,sigma);\n    for (i = 0; i < 64; i++) c[cpos+i] = x[i];\n    u = 1;\n    for (i = 8; i < 16; i++) {\n      u = u + (z[i] & 0xff) | 0;\n      z[i] = u & 0xff;\n      u >>>= 8;\n    }\n    b -= 64;\n    cpos += 64;\n  }\n  if (b > 0) {\n    crypto_core_salsa20(x,z,k,sigma);\n    for (i = 0; i < b; i++) c[cpos+i] = x[i];\n  }\n  return 0;\n}\n\nfunction crypto_stream(c,cpos,d,n,k) {\n  var s = new Uint8Array(32);\n  crypto_core_hsalsa20(s,n,k,sigma);\n  var sn = new Uint8Array(8);\n  for (var i = 0; i < 8; i++) sn[i] = n[i+16];\n  return crypto_stream_salsa20(c,cpos,d,sn,s);\n}\n\nfunction crypto_stream_xor(c,cpos,m,mpos,d,n,k) {\n  var s = new Uint8Array(32);\n  crypto_core_hsalsa20(s,n,k,sigma);\n  var sn = new Uint8Array(8);\n  for (var i = 0; i < 8; i++) sn[i] = n[i+16];\n  return crypto_stream_salsa20_xor(c,cpos,m,mpos,d,sn,s);\n}\n\n/*\n* Port of Andrew Moon's Poly1305-donna-16. Public domain.\n* https://github.com/floodyberry/poly1305-donna\n*/\n\nvar poly1305 = function(key) {\n  this.buffer = new Uint8Array(16);\n  this.r = new Uint16Array(10);\n  this.h = new Uint16Array(10);\n  this.pad = new Uint16Array(8);\n  this.leftover = 0;\n  this.fin = 0;\n\n  var t0, t1, t2, t3, t4, t5, t6, t7;\n\n  t0 = key[ 0] & 0xff | (key[ 1] & 0xff) << 8; this.r[0] = ( t0                     ) & 0x1fff;\n  t1 = key[ 2] & 0xff | (key[ 3] & 0xff) << 8; this.r[1] = ((t0 >>> 13) | (t1 <<  3)) & 0x1fff;\n  t2 = key[ 4] & 0xff | (key[ 5] & 0xff) << 8; this.r[2] = ((t1 >>> 10) | (t2 <<  6)) & 0x1f03;\n  t3 = key[ 6] & 0xff | (key[ 7] & 0xff) << 8; this.r[3] = ((t2 >>>  7) | (t3 <<  9)) & 0x1fff;\n  t4 = key[ 8] & 0xff | (key[ 9] & 0xff) << 8; this.r[4] = ((t3 >>>  4) | (t4 << 12)) & 0x00ff;\n  this.r[5] = ((t4 >>>  1)) & 0x1ffe;\n  t5 = key[10] & 0xff | (key[11] & 0xff) << 8; this.r[6] = ((t4 >>> 14) | (t5 <<  2)) & 0x1fff;\n  t6 = key[12] & 0xff | (key[13] & 0xff) << 8; this.r[7] = ((t5 >>> 11) | (t6 <<  5)) & 0x1f81;\n  t7 = key[14] & 0xff | (key[15] & 0xff) << 8; this.r[8] = ((t6 >>>  8) | (t7 <<  8)) & 0x1fff;\n  this.r[9] = ((t7 >>>  5)) & 0x007f;\n\n  this.pad[0] = key[16] & 0xff | (key[17] & 0xff) << 8;\n  this.pad[1] = key[18] & 0xff | (key[19] & 0xff) << 8;\n  this.pad[2] = key[20] & 0xff | (key[21] & 0xff) << 8;\n  this.pad[3] = key[22] & 0xff | (key[23] & 0xff) << 8;\n  this.pad[4] = key[24] & 0xff | (key[25] & 0xff) << 8;\n  this.pad[5] = key[26] & 0xff | (key[27] & 0xff) << 8;\n  this.pad[6] = key[28] & 0xff | (key[29] & 0xff) << 8;\n  this.pad[7] = key[30] & 0xff | (key[31] & 0xff) << 8;\n};\n\npoly1305.prototype.blocks = function(m, mpos, bytes) {\n  var hibit = this.fin ? 0 : (1 << 11);\n  var t0, t1, t2, t3, t4, t5, t6, t7, c;\n  var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9;\n\n  var h0 = this.h[0],\n      h1 = this.h[1],\n      h2 = this.h[2],\n      h3 = this.h[3],\n      h4 = this.h[4],\n      h5 = this.h[5],\n      h6 = this.h[6],\n      h7 = this.h[7],\n      h8 = this.h[8],\n      h9 = this.h[9];\n\n  var r0 = this.r[0],\n      r1 = this.r[1],\n      r2 = this.r[2],\n      r3 = this.r[3],\n      r4 = this.r[4],\n      r5 = this.r[5],\n      r6 = this.r[6],\n      r7 = this.r[7],\n      r8 = this.r[8],\n      r9 = this.r[9];\n\n  while (bytes >= 16) {\n    t0 = m[mpos+ 0] & 0xff | (m[mpos+ 1] & 0xff) << 8; h0 += ( t0                     ) & 0x1fff;\n    t1 = m[mpos+ 2] & 0xff | (m[mpos+ 3] & 0xff) << 8; h1 += ((t0 >>> 13) | (t1 <<  3)) & 0x1fff;\n    t2 = m[mpos+ 4] & 0xff | (m[mpos+ 5] & 0xff) << 8; h2 += ((t1 >>> 10) | (t2 <<  6)) & 0x1fff;\n    t3 = m[mpos+ 6] & 0xff | (m[mpos+ 7] & 0xff) << 8; h3 += ((t2 >>>  7) | (t3 <<  9)) & 0x1fff;\n    t4 = m[mpos+ 8] & 0xff | (m[mpos+ 9] & 0xff) << 8; h4 += ((t3 >>>  4) | (t4 << 12)) & 0x1fff;\n    h5 += ((t4 >>>  1)) & 0x1fff;\n    t5 = m[mpos+10] & 0xff | (m[mpos+11] & 0xff) << 8; h6 += ((t4 >>> 14) | (t5 <<  2)) & 0x1fff;\n    t6 = m[mpos+12] & 0xff | (m[mpos+13] & 0xff) << 8; h7 += ((t5 >>> 11) | (t6 <<  5)) & 0x1fff;\n    t7 = m[mpos+14] & 0xff | (m[mpos+15] & 0xff) << 8; h8 += ((t6 >>>  8) | (t7 <<  8)) & 0x1fff;\n    h9 += ((t7 >>> 5)) | hibit;\n\n    c = 0;\n\n    d0 = c;\n    d0 += h0 * r0;\n    d0 += h1 * (5 * r9);\n    d0 += h2 * (5 * r8);\n    d0 += h3 * (5 * r7);\n    d0 += h4 * (5 * r6);\n    c = (d0 >>> 13); d0 &= 0x1fff;\n    d0 += h5 * (5 * r5);\n    d0 += h6 * (5 * r4);\n    d0 += h7 * (5 * r3);\n    d0 += h8 * (5 * r2);\n    d0 += h9 * (5 * r1);\n    c += (d0 >>> 13); d0 &= 0x1fff;\n\n    d1 = c;\n    d1 += h0 * r1;\n    d1 += h1 * r0;\n    d1 += h2 * (5 * r9);\n    d1 += h3 * (5 * r8);\n    d1 += h4 * (5 * r7);\n    c = (d1 >>> 13); d1 &= 0x1fff;\n    d1 += h5 * (5 * r6);\n    d1 += h6 * (5 * r5);\n    d1 += h7 * (5 * r4);\n    d1 += h8 * (5 * r3);\n    d1 += h9 * (5 * r2);\n    c += (d1 >>> 13); d1 &= 0x1fff;\n\n    d2 = c;\n    d2 += h0 * r2;\n    d2 += h1 * r1;\n    d2 += h2 * r0;\n    d2 += h3 * (5 * r9);\n    d2 += h4 * (5 * r8);\n    c = (d2 >>> 13); d2 &= 0x1fff;\n    d2 += h5 * (5 * r7);\n    d2 += h6 * (5 * r6);\n    d2 += h7 * (5 * r5);\n    d2 += h8 * (5 * r4);\n    d2 += h9 * (5 * r3);\n    c += (d2 >>> 13); d2 &= 0x1fff;\n\n    d3 = c;\n    d3 += h0 * r3;\n    d3 += h1 * r2;\n    d3 += h2 * r1;\n    d3 += h3 * r0;\n    d3 += h4 * (5 * r9);\n    c = (d3 >>> 13); d3 &= 0x1fff;\n    d3 += h5 * (5 * r8);\n    d3 += h6 * (5 * r7);\n    d3 += h7 * (5 * r6);\n    d3 += h8 * (5 * r5);\n    d3 += h9 * (5 * r4);\n    c += (d3 >>> 13); d3 &= 0x1fff;\n\n    d4 = c;\n    d4 += h0 * r4;\n    d4 += h1 * r3;\n    d4 += h2 * r2;\n    d4 += h3 * r1;\n    d4 += h4 * r0;\n    c = (d4 >>> 13); d4 &= 0x1fff;\n    d4 += h5 * (5 * r9);\n    d4 += h6 * (5 * r8);\n    d4 += h7 * (5 * r7);\n    d4 += h8 * (5 * r6);\n    d4 += h9 * (5 * r5);\n    c += (d4 >>> 13); d4 &= 0x1fff;\n\n    d5 = c;\n    d5 += h0 * r5;\n    d5 += h1 * r4;\n    d5 += h2 * r3;\n    d5 += h3 * r2;\n    d5 += h4 * r1;\n    c = (d5 >>> 13); d5 &= 0x1fff;\n    d5 += h5 * r0;\n    d5 += h6 * (5 * r9);\n    d5 += h7 * (5 * r8);\n    d5 += h8 * (5 * r7);\n    d5 += h9 * (5 * r6);\n    c += (d5 >>> 13); d5 &= 0x1fff;\n\n    d6 = c;\n    d6 += h0 * r6;\n    d6 += h1 * r5;\n    d6 += h2 * r4;\n    d6 += h3 * r3;\n    d6 += h4 * r2;\n    c = (d6 >>> 13); d6 &= 0x1fff;\n    d6 += h5 * r1;\n    d6 += h6 * r0;\n    d6 += h7 * (5 * r9);\n    d6 += h8 * (5 * r8);\n    d6 += h9 * (5 * r7);\n    c += (d6 >>> 13); d6 &= 0x1fff;\n\n    d7 = c;\n    d7 += h0 * r7;\n    d7 += h1 * r6;\n    d7 += h2 * r5;\n    d7 += h3 * r4;\n    d7 += h4 * r3;\n    c = (d7 >>> 13); d7 &= 0x1fff;\n    d7 += h5 * r2;\n    d7 += h6 * r1;\n    d7 += h7 * r0;\n    d7 += h8 * (5 * r9);\n    d7 += h9 * (5 * r8);\n    c += (d7 >>> 13); d7 &= 0x1fff;\n\n    d8 = c;\n    d8 += h0 * r8;\n    d8 += h1 * r7;\n    d8 += h2 * r6;\n    d8 += h3 * r5;\n    d8 += h4 * r4;\n    c = (d8 >>> 13); d8 &= 0x1fff;\n    d8 += h5 * r3;\n    d8 += h6 * r2;\n    d8 += h7 * r1;\n    d8 += h8 * r0;\n    d8 += h9 * (5 * r9);\n    c += (d8 >>> 13); d8 &= 0x1fff;\n\n    d9 = c;\n    d9 += h0 * r9;\n    d9 += h1 * r8;\n    d9 += h2 * r7;\n    d9 += h3 * r6;\n    d9 += h4 * r5;\n    c = (d9 >>> 13); d9 &= 0x1fff;\n    d9 += h5 * r4;\n    d9 += h6 * r3;\n    d9 += h7 * r2;\n    d9 += h8 * r1;\n    d9 += h9 * r0;\n    c += (d9 >>> 13); d9 &= 0x1fff;\n\n    c = (((c << 2) + c)) | 0;\n    c = (c + d0) | 0;\n    d0 = c & 0x1fff;\n    c = (c >>> 13);\n    d1 += c;\n\n    h0 = d0;\n    h1 = d1;\n    h2 = d2;\n    h3 = d3;\n    h4 = d4;\n    h5 = d5;\n    h6 = d6;\n    h7 = d7;\n    h8 = d8;\n    h9 = d9;\n\n    mpos += 16;\n    bytes -= 16;\n  }\n  this.h[0] = h0;\n  this.h[1] = h1;\n  this.h[2] = h2;\n  this.h[3] = h3;\n  this.h[4] = h4;\n  this.h[5] = h5;\n  this.h[6] = h6;\n  this.h[7] = h7;\n  this.h[8] = h8;\n  this.h[9] = h9;\n};\n\npoly1305.prototype.finish = function(mac, macpos) {\n  var g = new Uint16Array(10);\n  var c, mask, f, i;\n\n  if (this.leftover) {\n    i = this.leftover;\n    this.buffer[i++] = 1;\n    for (; i < 16; i++) this.buffer[i] = 0;\n    this.fin = 1;\n    this.blocks(this.buffer, 0, 16);\n  }\n\n  c = this.h[1] >>> 13;\n  this.h[1] &= 0x1fff;\n  for (i = 2; i < 10; i++) {\n    this.h[i] += c;\n    c = this.h[i] >>> 13;\n    this.h[i] &= 0x1fff;\n  }\n  this.h[0] += (c * 5);\n  c = this.h[0] >>> 13;\n  this.h[0] &= 0x1fff;\n  this.h[1] += c;\n  c = this.h[1] >>> 13;\n  this.h[1] &= 0x1fff;\n  this.h[2] += c;\n\n  g[0] = this.h[0] + 5;\n  c = g[0] >>> 13;\n  g[0] &= 0x1fff;\n  for (i = 1; i < 10; i++) {\n    g[i] = this.h[i] + c;\n    c = g[i] >>> 13;\n    g[i] &= 0x1fff;\n  }\n  g[9] -= (1 << 13);\n\n  mask = (c ^ 1) - 1;\n  for (i = 0; i < 10; i++) g[i] &= mask;\n  mask = ~mask;\n  for (i = 0; i < 10; i++) this.h[i] = (this.h[i] & mask) | g[i];\n\n  this.h[0] = ((this.h[0]       ) | (this.h[1] << 13)                    ) & 0xffff;\n  this.h[1] = ((this.h[1] >>>  3) | (this.h[2] << 10)                    ) & 0xffff;\n  this.h[2] = ((this.h[2] >>>  6) | (this.h[3] <<  7)                    ) & 0xffff;\n  this.h[3] = ((this.h[3] >>>  9) | (this.h[4] <<  4)                    ) & 0xffff;\n  this.h[4] = ((this.h[4] >>> 12) | (this.h[5] <<  1) | (this.h[6] << 14)) & 0xffff;\n  this.h[5] = ((this.h[6] >>>  2) | (this.h[7] << 11)                    ) & 0xffff;\n  this.h[6] = ((this.h[7] >>>  5) | (this.h[8] <<  8)                    ) & 0xffff;\n  this.h[7] = ((this.h[8] >>>  8) | (this.h[9] <<  5)                    ) & 0xffff;\n\n  f = this.h[0] + this.pad[0];\n  this.h[0] = f & 0xffff;\n  for (i = 1; i < 8; i++) {\n    f = (((this.h[i] + this.pad[i]) | 0) + (f >>> 16)) | 0;\n    this.h[i] = f & 0xffff;\n  }\n\n  mac[macpos+ 0] = (this.h[0] >>> 0) & 0xff;\n  mac[macpos+ 1] = (this.h[0] >>> 8) & 0xff;\n  mac[macpos+ 2] = (this.h[1] >>> 0) & 0xff;\n  mac[macpos+ 3] = (this.h[1] >>> 8) & 0xff;\n  mac[macpos+ 4] = (this.h[2] >>> 0) & 0xff;\n  mac[macpos+ 5] = (this.h[2] >>> 8) & 0xff;\n  mac[macpos+ 6] = (this.h[3] >>> 0) & 0xff;\n  mac[macpos+ 7] = (this.h[3] >>> 8) & 0xff;\n  mac[macpos+ 8] = (this.h[4] >>> 0) & 0xff;\n  mac[macpos+ 9] = (this.h[4] >>> 8) & 0xff;\n  mac[macpos+10] = (this.h[5] >>> 0) & 0xff;\n  mac[macpos+11] = (this.h[5] >>> 8) & 0xff;\n  mac[macpos+12] = (this.h[6] >>> 0) & 0xff;\n  mac[macpos+13] = (this.h[6] >>> 8) & 0xff;\n  mac[macpos+14] = (this.h[7] >>> 0) & 0xff;\n  mac[macpos+15] = (this.h[7] >>> 8) & 0xff;\n};\n\npoly1305.prototype.update = function(m, mpos, bytes) {\n  var i, want;\n\n  if (this.leftover) {\n    want = (16 - this.leftover);\n    if (want > bytes)\n      want = bytes;\n    for (i = 0; i < want; i++)\n      this.buffer[this.leftover + i] = m[mpos+i];\n    bytes -= want;\n    mpos += want;\n    this.leftover += want;\n    if (this.leftover < 16)\n      return;\n    this.blocks(this.buffer, 0, 16);\n    this.leftover = 0;\n  }\n\n  if (bytes >= 16) {\n    want = bytes - (bytes % 16);\n    this.blocks(m, mpos, want);\n    mpos += want;\n    bytes -= want;\n  }\n\n  if (bytes) {\n    for (i = 0; i < bytes; i++)\n      this.buffer[this.leftover + i] = m[mpos+i];\n    this.leftover += bytes;\n  }\n};\n\nfunction crypto_onetimeauth(out, outpos, m, mpos, n, k) {\n  var s = new poly1305(k);\n  s.update(m, mpos, n);\n  s.finish(out, outpos);\n  return 0;\n}\n\nfunction crypto_onetimeauth_verify(h, hpos, m, mpos, n, k) {\n  var x = new Uint8Array(16);\n  crypto_onetimeauth(x,0,m,mpos,n,k);\n  return crypto_verify_16(h,hpos,x,0);\n}\n\nfunction crypto_secretbox(c,m,d,n,k) {\n  var i;\n  if (d < 32) return -1;\n  crypto_stream_xor(c,0,m,0,d,n,k);\n  crypto_onetimeauth(c, 16, c, 32, d - 32, c);\n  for (i = 0; i < 16; i++) c[i] = 0;\n  return 0;\n}\n\nfunction crypto_secretbox_open(m,c,d,n,k) {\n  var i;\n  var x = new Uint8Array(32);\n  if (d < 32) return -1;\n  crypto_stream(x,0,32,n,k);\n  if (crypto_onetimeauth_verify(c, 16,c, 32,d - 32,x) !== 0) return -1;\n  crypto_stream_xor(m,0,c,0,d,n,k);\n  for (i = 0; i < 32; i++) m[i] = 0;\n  return 0;\n}\n\nfunction set25519(r, a) {\n  var i;\n  for (i = 0; i < 16; i++) r[i] = a[i]|0;\n}\n\nfunction car25519(o) {\n  var i, v, c = 1;\n  for (i = 0; i < 16; i++) {\n    v = o[i] + c + 65535;\n    c = Math.floor(v / 65536);\n    o[i] = v - c * 65536;\n  }\n  o[0] += c-1 + 37 * (c-1);\n}\n\nfunction sel25519(p, q, b) {\n  var t, c = ~(b-1);\n  for (var i = 0; i < 16; i++) {\n    t = c & (p[i] ^ q[i]);\n    p[i] ^= t;\n    q[i] ^= t;\n  }\n}\n\nfunction pack25519(o, n) {\n  var i, j, b;\n  var m = gf(), t = gf();\n  for (i = 0; i < 16; i++) t[i] = n[i];\n  car25519(t);\n  car25519(t);\n  car25519(t);\n  for (j = 0; j < 2; j++) {\n    m[0] = t[0] - 0xffed;\n    for (i = 1; i < 15; i++) {\n      m[i] = t[i] - 0xffff - ((m[i-1]>>16) & 1);\n      m[i-1] &= 0xffff;\n    }\n    m[15] = t[15] - 0x7fff - ((m[14]>>16) & 1);\n    b = (m[15]>>16) & 1;\n    m[14] &= 0xffff;\n    sel25519(t, m, 1-b);\n  }\n  for (i = 0; i < 16; i++) {\n    o[2*i] = t[i] & 0xff;\n    o[2*i+1] = t[i]>>8;\n  }\n}\n\nfunction neq25519(a, b) {\n  var c = new Uint8Array(32), d = new Uint8Array(32);\n  pack25519(c, a);\n  pack25519(d, b);\n  return crypto_verify_32(c, 0, d, 0);\n}\n\nfunction par25519(a) {\n  var d = new Uint8Array(32);\n  pack25519(d, a);\n  return d[0] & 1;\n}\n\nfunction unpack25519(o, n) {\n  var i;\n  for (i = 0; i < 16; i++) o[i] = n[2*i] + (n[2*i+1] << 8);\n  o[15] &= 0x7fff;\n}\n\nfunction A(o, a, b) {\n  for (var i = 0; i < 16; i++) o[i] = a[i] + b[i];\n}\n\nfunction Z(o, a, b) {\n  for (var i = 0; i < 16; i++) o[i] = a[i] - b[i];\n}\n\nfunction M(o, a, b) {\n  var v, c,\n     t0 = 0,  t1 = 0,  t2 = 0,  t3 = 0,  t4 = 0,  t5 = 0,  t6 = 0,  t7 = 0,\n     t8 = 0,  t9 = 0, t10 = 0, t11 = 0, t12 = 0, t13 = 0, t14 = 0, t15 = 0,\n    t16 = 0, t17 = 0, t18 = 0, t19 = 0, t20 = 0, t21 = 0, t22 = 0, t23 = 0,\n    t24 = 0, t25 = 0, t26 = 0, t27 = 0, t28 = 0, t29 = 0, t30 = 0,\n    b0 = b[0],\n    b1 = b[1],\n    b2 = b[2],\n    b3 = b[3],\n    b4 = b[4],\n    b5 = b[5],\n    b6 = b[6],\n    b7 = b[7],\n    b8 = b[8],\n    b9 = b[9],\n    b10 = b[10],\n    b11 = b[11],\n    b12 = b[12],\n    b13 = b[13],\n    b14 = b[14],\n    b15 = b[15];\n\n  v = a[0];\n  t0 += v * b0;\n  t1 += v * b1;\n  t2 += v * b2;\n  t3 += v * b3;\n  t4 += v * b4;\n  t5 += v * b5;\n  t6 += v * b6;\n  t7 += v * b7;\n  t8 += v * b8;\n  t9 += v * b9;\n  t10 += v * b10;\n  t11 += v * b11;\n  t12 += v * b12;\n  t13 += v * b13;\n  t14 += v * b14;\n  t15 += v * b15;\n  v = a[1];\n  t1 += v * b0;\n  t2 += v * b1;\n  t3 += v * b2;\n  t4 += v * b3;\n  t5 += v * b4;\n  t6 += v * b5;\n  t7 += v * b6;\n  t8 += v * b7;\n  t9 += v * b8;\n  t10 += v * b9;\n  t11 += v * b10;\n  t12 += v * b11;\n  t13 += v * b12;\n  t14 += v * b13;\n  t15 += v * b14;\n  t16 += v * b15;\n  v = a[2];\n  t2 += v * b0;\n  t3 += v * b1;\n  t4 += v * b2;\n  t5 += v * b3;\n  t6 += v * b4;\n  t7 += v * b5;\n  t8 += v * b6;\n  t9 += v * b7;\n  t10 += v * b8;\n  t11 += v * b9;\n  t12 += v * b10;\n  t13 += v * b11;\n  t14 += v * b12;\n  t15 += v * b13;\n  t16 += v * b14;\n  t17 += v * b15;\n  v = a[3];\n  t3 += v * b0;\n  t4 += v * b1;\n  t5 += v * b2;\n  t6 += v * b3;\n  t7 += v * b4;\n  t8 += v * b5;\n  t9 += v * b6;\n  t10 += v * b7;\n  t11 += v * b8;\n  t12 += v * b9;\n  t13 += v * b10;\n  t14 += v * b11;\n  t15 += v * b12;\n  t16 += v * b13;\n  t17 += v * b14;\n  t18 += v * b15;\n  v = a[4];\n  t4 += v * b0;\n  t5 += v * b1;\n  t6 += v * b2;\n  t7 += v * b3;\n  t8 += v * b4;\n  t9 += v * b5;\n  t10 += v * b6;\n  t11 += v * b7;\n  t12 += v * b8;\n  t13 += v * b9;\n  t14 += v * b10;\n  t15 += v * b11;\n  t16 += v * b12;\n  t17 += v * b13;\n  t18 += v * b14;\n  t19 += v * b15;\n  v = a[5];\n  t5 += v * b0;\n  t6 += v * b1;\n  t7 += v * b2;\n  t8 += v * b3;\n  t9 += v * b4;\n  t10 += v * b5;\n  t11 += v * b6;\n  t12 += v * b7;\n  t13 += v * b8;\n  t14 += v * b9;\n  t15 += v * b10;\n  t16 += v * b11;\n  t17 += v * b12;\n  t18 += v * b13;\n  t19 += v * b14;\n  t20 += v * b15;\n  v = a[6];\n  t6 += v * b0;\n  t7 += v * b1;\n  t8 += v * b2;\n  t9 += v * b3;\n  t10 += v * b4;\n  t11 += v * b5;\n  t12 += v * b6;\n  t13 += v * b7;\n  t14 += v * b8;\n  t15 += v * b9;\n  t16 += v * b10;\n  t17 += v * b11;\n  t18 += v * b12;\n  t19 += v * b13;\n  t20 += v * b14;\n  t21 += v * b15;\n  v = a[7];\n  t7 += v * b0;\n  t8 += v * b1;\n  t9 += v * b2;\n  t10 += v * b3;\n  t11 += v * b4;\n  t12 += v * b5;\n  t13 += v * b6;\n  t14 += v * b7;\n  t15 += v * b8;\n  t16 += v * b9;\n  t17 += v * b10;\n  t18 += v * b11;\n  t19 += v * b12;\n  t20 += v * b13;\n  t21 += v * b14;\n  t22 += v * b15;\n  v = a[8];\n  t8 += v * b0;\n  t9 += v * b1;\n  t10 += v * b2;\n  t11 += v * b3;\n  t12 += v * b4;\n  t13 += v * b5;\n  t14 += v * b6;\n  t15 += v * b7;\n  t16 += v * b8;\n  t17 += v * b9;\n  t18 += v * b10;\n  t19 += v * b11;\n  t20 += v * b12;\n  t21 += v * b13;\n  t22 += v * b14;\n  t23 += v * b15;\n  v = a[9];\n  t9 += v * b0;\n  t10 += v * b1;\n  t11 += v * b2;\n  t12 += v * b3;\n  t13 += v * b4;\n  t14 += v * b5;\n  t15 += v * b6;\n  t16 += v * b7;\n  t17 += v * b8;\n  t18 += v * b9;\n  t19 += v * b10;\n  t20 += v * b11;\n  t21 += v * b12;\n  t22 += v * b13;\n  t23 += v * b14;\n  t24 += v * b15;\n  v = a[10];\n  t10 += v * b0;\n  t11 += v * b1;\n  t12 += v * b2;\n  t13 += v * b3;\n  t14 += v * b4;\n  t15 += v * b5;\n  t16 += v * b6;\n  t17 += v * b7;\n  t18 += v * b8;\n  t19 += v * b9;\n  t20 += v * b10;\n  t21 += v * b11;\n  t22 += v * b12;\n  t23 += v * b13;\n  t24 += v * b14;\n  t25 += v * b15;\n  v = a[11];\n  t11 += v * b0;\n  t12 += v * b1;\n  t13 += v * b2;\n  t14 += v * b3;\n  t15 += v * b4;\n  t16 += v * b5;\n  t17 += v * b6;\n  t18 += v * b7;\n  t19 += v * b8;\n  t20 += v * b9;\n  t21 += v * b10;\n  t22 += v * b11;\n  t23 += v * b12;\n  t24 += v * b13;\n  t25 += v * b14;\n  t26 += v * b15;\n  v = a[12];\n  t12 += v * b0;\n  t13 += v * b1;\n  t14 += v * b2;\n  t15 += v * b3;\n  t16 += v * b4;\n  t17 += v * b5;\n  t18 += v * b6;\n  t19 += v * b7;\n  t20 += v * b8;\n  t21 += v * b9;\n  t22 += v * b10;\n  t23 += v * b11;\n  t24 += v * b12;\n  t25 += v * b13;\n  t26 += v * b14;\n  t27 += v * b15;\n  v = a[13];\n  t13 += v * b0;\n  t14 += v * b1;\n  t15 += v * b2;\n  t16 += v * b3;\n  t17 += v * b4;\n  t18 += v * b5;\n  t19 += v * b6;\n  t20 += v * b7;\n  t21 += v * b8;\n  t22 += v * b9;\n  t23 += v * b10;\n  t24 += v * b11;\n  t25 += v * b12;\n  t26 += v * b13;\n  t27 += v * b14;\n  t28 += v * b15;\n  v = a[14];\n  t14 += v * b0;\n  t15 += v * b1;\n  t16 += v * b2;\n  t17 += v * b3;\n  t18 += v * b4;\n  t19 += v * b5;\n  t20 += v * b6;\n  t21 += v * b7;\n  t22 += v * b8;\n  t23 += v * b9;\n  t24 += v * b10;\n  t25 += v * b11;\n  t26 += v * b12;\n  t27 += v * b13;\n  t28 += v * b14;\n  t29 += v * b15;\n  v = a[15];\n  t15 += v * b0;\n  t16 += v * b1;\n  t17 += v * b2;\n  t18 += v * b3;\n  t19 += v * b4;\n  t20 += v * b5;\n  t21 += v * b6;\n  t22 += v * b7;\n  t23 += v * b8;\n  t24 += v * b9;\n  t25 += v * b10;\n  t26 += v * b11;\n  t27 += v * b12;\n  t28 += v * b13;\n  t29 += v * b14;\n  t30 += v * b15;\n\n  t0  += 38 * t16;\n  t1  += 38 * t17;\n  t2  += 38 * t18;\n  t3  += 38 * t19;\n  t4  += 38 * t20;\n  t5  += 38 * t21;\n  t6  += 38 * t22;\n  t7  += 38 * t23;\n  t8  += 38 * t24;\n  t9  += 38 * t25;\n  t10 += 38 * t26;\n  t11 += 38 * t27;\n  t12 += 38 * t28;\n  t13 += 38 * t29;\n  t14 += 38 * t30;\n  // t15 left as is\n\n  // first car\n  c = 1;\n  v =  t0 + c + 65535; c = Math.floor(v / 65536);  t0 = v - c * 65536;\n  v =  t1 + c + 65535; c = Math.floor(v / 65536);  t1 = v - c * 65536;\n  v =  t2 + c + 65535; c = Math.floor(v / 65536);  t2 = v - c * 65536;\n  v =  t3 + c + 65535; c = Math.floor(v / 65536);  t3 = v - c * 65536;\n  v =  t4 + c + 65535; c = Math.floor(v / 65536);  t4 = v - c * 65536;\n  v =  t5 + c + 65535; c = Math.floor(v / 65536);  t5 = v - c * 65536;\n  v =  t6 + c + 65535; c = Math.floor(v / 65536);  t6 = v - c * 65536;\n  v =  t7 + c + 65535; c = Math.floor(v / 65536);  t7 = v - c * 65536;\n  v =  t8 + c + 65535; c = Math.floor(v / 65536);  t8 = v - c * 65536;\n  v =  t9 + c + 65535; c = Math.floor(v / 65536);  t9 = v - c * 65536;\n  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n  t0 += c-1 + 37 * (c-1);\n\n  // second car\n  c = 1;\n  v =  t0 + c + 65535; c = Math.floor(v / 65536);  t0 = v - c * 65536;\n  v =  t1 + c + 65535; c = Math.floor(v / 65536);  t1 = v - c * 65536;\n  v =  t2 + c + 65535; c = Math.floor(v / 65536);  t2 = v - c * 65536;\n  v =  t3 + c + 65535; c = Math.floor(v / 65536);  t3 = v - c * 65536;\n  v =  t4 + c + 65535; c = Math.floor(v / 65536);  t4 = v - c * 65536;\n  v =  t5 + c + 65535; c = Math.floor(v / 65536);  t5 = v - c * 65536;\n  v =  t6 + c + 65535; c = Math.floor(v / 65536);  t6 = v - c * 65536;\n  v =  t7 + c + 65535; c = Math.floor(v / 65536);  t7 = v - c * 65536;\n  v =  t8 + c + 65535; c = Math.floor(v / 65536);  t8 = v - c * 65536;\n  v =  t9 + c + 65535; c = Math.floor(v / 65536);  t9 = v - c * 65536;\n  v = t10 + c + 65535; c = Math.floor(v / 65536); t10 = v - c * 65536;\n  v = t11 + c + 65535; c = Math.floor(v / 65536); t11 = v - c * 65536;\n  v = t12 + c + 65535; c = Math.floor(v / 65536); t12 = v - c * 65536;\n  v = t13 + c + 65535; c = Math.floor(v / 65536); t13 = v - c * 65536;\n  v = t14 + c + 65535; c = Math.floor(v / 65536); t14 = v - c * 65536;\n  v = t15 + c + 65535; c = Math.floor(v / 65536); t15 = v - c * 65536;\n  t0 += c-1 + 37 * (c-1);\n\n  o[ 0] = t0;\n  o[ 1] = t1;\n  o[ 2] = t2;\n  o[ 3] = t3;\n  o[ 4] = t4;\n  o[ 5] = t5;\n  o[ 6] = t6;\n  o[ 7] = t7;\n  o[ 8] = t8;\n  o[ 9] = t9;\n  o[10] = t10;\n  o[11] = t11;\n  o[12] = t12;\n  o[13] = t13;\n  o[14] = t14;\n  o[15] = t15;\n}\n\nfunction S(o, a) {\n  M(o, a, a);\n}\n\nfunction inv25519(o, i) {\n  var c = gf();\n  var a;\n  for (a = 0; a < 16; a++) c[a] = i[a];\n  for (a = 253; a >= 0; a--) {\n    S(c, c);\n    if(a !== 2 && a !== 4) M(c, c, i);\n  }\n  for (a = 0; a < 16; a++) o[a] = c[a];\n}\n\nfunction pow2523(o, i) {\n  var c = gf();\n  var a;\n  for (a = 0; a < 16; a++) c[a] = i[a];\n  for (a = 250; a >= 0; a--) {\n      S(c, c);\n      if(a !== 1) M(c, c, i);\n  }\n  for (a = 0; a < 16; a++) o[a] = c[a];\n}\n\nfunction crypto_scalarmult(q, n, p) {\n  var z = new Uint8Array(32);\n  var x = new Float64Array(80), r, i;\n  var a = gf(), b = gf(), c = gf(),\n      d = gf(), e = gf(), f = gf();\n  for (i = 0; i < 31; i++) z[i] = n[i];\n  z[31]=(n[31]&127)|64;\n  z[0]&=248;\n  unpack25519(x,p);\n  for (i = 0; i < 16; i++) {\n    b[i]=x[i];\n    d[i]=a[i]=c[i]=0;\n  }\n  a[0]=d[0]=1;\n  for (i=254; i>=0; --i) {\n    r=(z[i>>>3]>>>(i&7))&1;\n    sel25519(a,b,r);\n    sel25519(c,d,r);\n    A(e,a,c);\n    Z(a,a,c);\n    A(c,b,d);\n    Z(b,b,d);\n    S(d,e);\n    S(f,a);\n    M(a,c,a);\n    M(c,b,e);\n    A(e,a,c);\n    Z(a,a,c);\n    S(b,a);\n    Z(c,d,f);\n    M(a,c,_121665);\n    A(a,a,d);\n    M(c,c,a);\n    M(a,d,f);\n    M(d,b,x);\n    S(b,e);\n    sel25519(a,b,r);\n    sel25519(c,d,r);\n  }\n  for (i = 0; i < 16; i++) {\n    x[i+16]=a[i];\n    x[i+32]=c[i];\n    x[i+48]=b[i];\n    x[i+64]=d[i];\n  }\n  var x32 = x.subarray(32);\n  var x16 = x.subarray(16);\n  inv25519(x32,x32);\n  M(x16,x16,x32);\n  pack25519(q,x16);\n  return 0;\n}\n\nfunction crypto_scalarmult_base(q, n) {\n  return crypto_scalarmult(q, n, _9);\n}\n\nfunction crypto_box_keypair(y, x) {\n  randombytes(x, 32);\n  return crypto_scalarmult_base(y, x);\n}\n\nfunction crypto_box_beforenm(k, y, x) {\n  var s = new Uint8Array(32);\n  crypto_scalarmult(s, x, y);\n  return crypto_core_hsalsa20(k, _0, s, sigma);\n}\n\nvar crypto_box_afternm = crypto_secretbox;\nvar crypto_box_open_afternm = crypto_secretbox_open;\n\nfunction crypto_box(c, m, d, n, y, x) {\n  var k = new Uint8Array(32);\n  crypto_box_beforenm(k, y, x);\n  return crypto_box_afternm(c, m, d, n, k);\n}\n\nfunction crypto_box_open(m, c, d, n, y, x) {\n  var k = new Uint8Array(32);\n  crypto_box_beforenm(k, y, x);\n  return crypto_box_open_afternm(m, c, d, n, k);\n}\n\nvar K = [\n  0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd,\n  0xb5c0fbcf, 0xec4d3b2f, 0xe9b5dba5, 0x8189dbbc,\n  0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,\n  0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118,\n  0xd807aa98, 0xa3030242, 0x12835b01, 0x45706fbe,\n  0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,\n  0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1,\n  0x9bdc06a7, 0x25c71235, 0xc19bf174, 0xcf692694,\n  0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,\n  0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65,\n  0x2de92c6f, 0x592b0275, 0x4a7484aa, 0x6ea6e483,\n  0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,\n  0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210,\n  0xb00327c8, 0x98fb213f, 0xbf597fc7, 0xbeef0ee4,\n  0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,\n  0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70,\n  0x27b70a85, 0x46d22ffc, 0x2e1b2138, 0x5c26c926,\n  0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,\n  0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8,\n  0x81c2c92e, 0x47edaee6, 0x92722c85, 0x1482353b,\n  0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,\n  0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30,\n  0xd192e819, 0xd6ef5218, 0xd6990624, 0x5565a910,\n  0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,\n  0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53,\n  0x2748774c, 0xdf8eeb99, 0x34b0bcb5, 0xe19b48a8,\n  0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,\n  0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3,\n  0x748f82ee, 0x5defb2fc, 0x78a5636f, 0x43172f60,\n  0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,\n  0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9,\n  0xbef9a3f7, 0xb2c67915, 0xc67178f2, 0xe372532b,\n  0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,\n  0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178,\n  0x06f067aa, 0x72176fba, 0x0a637dc5, 0xa2c898a6,\n  0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,\n  0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493,\n  0x3c9ebe0a, 0x15c9bebc, 0x431d67c4, 0x9c100d4c,\n  0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,\n  0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817\n];\n\nfunction crypto_hashblocks_hl(hh, hl, m, n) {\n  var wh = new Int32Array(16), wl = new Int32Array(16),\n      bh0, bh1, bh2, bh3, bh4, bh5, bh6, bh7,\n      bl0, bl1, bl2, bl3, bl4, bl5, bl6, bl7,\n      th, tl, i, j, h, l, a, b, c, d;\n\n  var ah0 = hh[0],\n      ah1 = hh[1],\n      ah2 = hh[2],\n      ah3 = hh[3],\n      ah4 = hh[4],\n      ah5 = hh[5],\n      ah6 = hh[6],\n      ah7 = hh[7],\n\n      al0 = hl[0],\n      al1 = hl[1],\n      al2 = hl[2],\n      al3 = hl[3],\n      al4 = hl[4],\n      al5 = hl[5],\n      al6 = hl[6],\n      al7 = hl[7];\n\n  var pos = 0;\n  while (n >= 128) {\n    for (i = 0; i < 16; i++) {\n      j = 8 * i + pos;\n      wh[i] = (m[j+0] << 24) | (m[j+1] << 16) | (m[j+2] << 8) | m[j+3];\n      wl[i] = (m[j+4] << 24) | (m[j+5] << 16) | (m[j+6] << 8) | m[j+7];\n    }\n    for (i = 0; i < 80; i++) {\n      bh0 = ah0;\n      bh1 = ah1;\n      bh2 = ah2;\n      bh3 = ah3;\n      bh4 = ah4;\n      bh5 = ah5;\n      bh6 = ah6;\n      bh7 = ah7;\n\n      bl0 = al0;\n      bl1 = al1;\n      bl2 = al2;\n      bl3 = al3;\n      bl4 = al4;\n      bl5 = al5;\n      bl6 = al6;\n      bl7 = al7;\n\n      // add\n      h = ah7;\n      l = al7;\n\n      a = l & 0xffff; b = l >>> 16;\n      c = h & 0xffff; d = h >>> 16;\n\n      // Sigma1\n      h = ((ah4 >>> 14) | (al4 << (32-14))) ^ ((ah4 >>> 18) | (al4 << (32-18))) ^ ((al4 >>> (41-32)) | (ah4 << (32-(41-32))));\n      l = ((al4 >>> 14) | (ah4 << (32-14))) ^ ((al4 >>> 18) | (ah4 << (32-18))) ^ ((ah4 >>> (41-32)) | (al4 << (32-(41-32))));\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      // Ch\n      h = (ah4 & ah5) ^ (~ah4 & ah6);\n      l = (al4 & al5) ^ (~al4 & al6);\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      // K\n      h = K[i*2];\n      l = K[i*2+1];\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      // w\n      h = wh[i%16];\n      l = wl[i%16];\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      b += a >>> 16;\n      c += b >>> 16;\n      d += c >>> 16;\n\n      th = c & 0xffff | d << 16;\n      tl = a & 0xffff | b << 16;\n\n      // add\n      h = th;\n      l = tl;\n\n      a = l & 0xffff; b = l >>> 16;\n      c = h & 0xffff; d = h >>> 16;\n\n      // Sigma0\n      h = ((ah0 >>> 28) | (al0 << (32-28))) ^ ((al0 >>> (34-32)) | (ah0 << (32-(34-32)))) ^ ((al0 >>> (39-32)) | (ah0 << (32-(39-32))));\n      l = ((al0 >>> 28) | (ah0 << (32-28))) ^ ((ah0 >>> (34-32)) | (al0 << (32-(34-32)))) ^ ((ah0 >>> (39-32)) | (al0 << (32-(39-32))));\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      // Maj\n      h = (ah0 & ah1) ^ (ah0 & ah2) ^ (ah1 & ah2);\n      l = (al0 & al1) ^ (al0 & al2) ^ (al1 & al2);\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      b += a >>> 16;\n      c += b >>> 16;\n      d += c >>> 16;\n\n      bh7 = (c & 0xffff) | (d << 16);\n      bl7 = (a & 0xffff) | (b << 16);\n\n      // add\n      h = bh3;\n      l = bl3;\n\n      a = l & 0xffff; b = l >>> 16;\n      c = h & 0xffff; d = h >>> 16;\n\n      h = th;\n      l = tl;\n\n      a += l & 0xffff; b += l >>> 16;\n      c += h & 0xffff; d += h >>> 16;\n\n      b += a >>> 16;\n      c += b >>> 16;\n      d += c >>> 16;\n\n      bh3 = (c & 0xffff) | (d << 16);\n      bl3 = (a & 0xffff) | (b << 16);\n\n      ah1 = bh0;\n      ah2 = bh1;\n      ah3 = bh2;\n      ah4 = bh3;\n      ah5 = bh4;\n      ah6 = bh5;\n      ah7 = bh6;\n      ah0 = bh7;\n\n      al1 = bl0;\n      al2 = bl1;\n      al3 = bl2;\n      al4 = bl3;\n      al5 = bl4;\n      al6 = bl5;\n      al7 = bl6;\n      al0 = bl7;\n\n      if (i%16 === 15) {\n        for (j = 0; j < 16; j++) {\n          // add\n          h = wh[j];\n          l = wl[j];\n\n          a = l & 0xffff; b = l >>> 16;\n          c = h & 0xffff; d = h >>> 16;\n\n          h = wh[(j+9)%16];\n          l = wl[(j+9)%16];\n\n          a += l & 0xffff; b += l >>> 16;\n          c += h & 0xffff; d += h >>> 16;\n\n          // sigma0\n          th = wh[(j+1)%16];\n          tl = wl[(j+1)%16];\n          h = ((th >>> 1) | (tl << (32-1))) ^ ((th >>> 8) | (tl << (32-8))) ^ (th >>> 7);\n          l = ((tl >>> 1) | (th << (32-1))) ^ ((tl >>> 8) | (th << (32-8))) ^ ((tl >>> 7) | (th << (32-7)));\n\n          a += l & 0xffff; b += l >>> 16;\n          c += h & 0xffff; d += h >>> 16;\n\n          // sigma1\n          th = wh[(j+14)%16];\n          tl = wl[(j+14)%16];\n          h = ((th >>> 19) | (tl << (32-19))) ^ ((tl >>> (61-32)) | (th << (32-(61-32)))) ^ (th >>> 6);\n          l = ((tl >>> 19) | (th << (32-19))) ^ ((th >>> (61-32)) | (tl << (32-(61-32)))) ^ ((tl >>> 6) | (th << (32-6)));\n\n          a += l & 0xffff; b += l >>> 16;\n          c += h & 0xffff; d += h >>> 16;\n\n          b += a >>> 16;\n          c += b >>> 16;\n          d += c >>> 16;\n\n          wh[j] = (c & 0xffff) | (d << 16);\n          wl[j] = (a & 0xffff) | (b << 16);\n        }\n      }\n    }\n\n    // add\n    h = ah0;\n    l = al0;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[0];\n    l = hl[0];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[0] = ah0 = (c & 0xffff) | (d << 16);\n    hl[0] = al0 = (a & 0xffff) | (b << 16);\n\n    h = ah1;\n    l = al1;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[1];\n    l = hl[1];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[1] = ah1 = (c & 0xffff) | (d << 16);\n    hl[1] = al1 = (a & 0xffff) | (b << 16);\n\n    h = ah2;\n    l = al2;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[2];\n    l = hl[2];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[2] = ah2 = (c & 0xffff) | (d << 16);\n    hl[2] = al2 = (a & 0xffff) | (b << 16);\n\n    h = ah3;\n    l = al3;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[3];\n    l = hl[3];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[3] = ah3 = (c & 0xffff) | (d << 16);\n    hl[3] = al3 = (a & 0xffff) | (b << 16);\n\n    h = ah4;\n    l = al4;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[4];\n    l = hl[4];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[4] = ah4 = (c & 0xffff) | (d << 16);\n    hl[4] = al4 = (a & 0xffff) | (b << 16);\n\n    h = ah5;\n    l = al5;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[5];\n    l = hl[5];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[5] = ah5 = (c & 0xffff) | (d << 16);\n    hl[5] = al5 = (a & 0xffff) | (b << 16);\n\n    h = ah6;\n    l = al6;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[6];\n    l = hl[6];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[6] = ah6 = (c & 0xffff) | (d << 16);\n    hl[6] = al6 = (a & 0xffff) | (b << 16);\n\n    h = ah7;\n    l = al7;\n\n    a = l & 0xffff; b = l >>> 16;\n    c = h & 0xffff; d = h >>> 16;\n\n    h = hh[7];\n    l = hl[7];\n\n    a += l & 0xffff; b += l >>> 16;\n    c += h & 0xffff; d += h >>> 16;\n\n    b += a >>> 16;\n    c += b >>> 16;\n    d += c >>> 16;\n\n    hh[7] = ah7 = (c & 0xffff) | (d << 16);\n    hl[7] = al7 = (a & 0xffff) | (b << 16);\n\n    pos += 128;\n    n -= 128;\n  }\n\n  return n;\n}\n\nfunction crypto_hash(out, m, n) {\n  var hh = new Int32Array(8),\n      hl = new Int32Array(8),\n      x = new Uint8Array(256),\n      i, b = n;\n\n  hh[0] = 0x6a09e667;\n  hh[1] = 0xbb67ae85;\n  hh[2] = 0x3c6ef372;\n  hh[3] = 0xa54ff53a;\n  hh[4] = 0x510e527f;\n  hh[5] = 0x9b05688c;\n  hh[6] = 0x1f83d9ab;\n  hh[7] = 0x5be0cd19;\n\n  hl[0] = 0xf3bcc908;\n  hl[1] = 0x84caa73b;\n  hl[2] = 0xfe94f82b;\n  hl[3] = 0x5f1d36f1;\n  hl[4] = 0xade682d1;\n  hl[5] = 0x2b3e6c1f;\n  hl[6] = 0xfb41bd6b;\n  hl[7] = 0x137e2179;\n\n  crypto_hashblocks_hl(hh, hl, m, n);\n  n %= 128;\n\n  for (i = 0; i < n; i++) x[i] = m[b-n+i];\n  x[n] = 128;\n\n  n = 256-128*(n<112?1:0);\n  x[n-9] = 0;\n  ts64(x, n-8,  (b / 0x20000000) | 0, b << 3);\n  crypto_hashblocks_hl(hh, hl, x, n);\n\n  for (i = 0; i < 8; i++) ts64(out, 8*i, hh[i], hl[i]);\n\n  return 0;\n}\n\nfunction add(p, q) {\n  var a = gf(), b = gf(), c = gf(),\n      d = gf(), e = gf(), f = gf(),\n      g = gf(), h = gf(), t = gf();\n\n  Z(a, p[1], p[0]);\n  Z(t, q[1], q[0]);\n  M(a, a, t);\n  A(b, p[0], p[1]);\n  A(t, q[0], q[1]);\n  M(b, b, t);\n  M(c, p[3], q[3]);\n  M(c, c, D2);\n  M(d, p[2], q[2]);\n  A(d, d, d);\n  Z(e, b, a);\n  Z(f, d, c);\n  A(g, d, c);\n  A(h, b, a);\n\n  M(p[0], e, f);\n  M(p[1], h, g);\n  M(p[2], g, f);\n  M(p[3], e, h);\n}\n\nfunction cswap(p, q, b) {\n  var i;\n  for (i = 0; i < 4; i++) {\n    sel25519(p[i], q[i], b);\n  }\n}\n\nfunction pack(r, p) {\n  var tx = gf(), ty = gf(), zi = gf();\n  inv25519(zi, p[2]);\n  M(tx, p[0], zi);\n  M(ty, p[1], zi);\n  pack25519(r, ty);\n  r[31] ^= par25519(tx) << 7;\n}\n\nfunction scalarmult(p, q, s) {\n  var b, i;\n  set25519(p[0], gf0);\n  set25519(p[1], gf1);\n  set25519(p[2], gf1);\n  set25519(p[3], gf0);\n  for (i = 255; i >= 0; --i) {\n    b = (s[(i/8)|0] >> (i&7)) & 1;\n    cswap(p, q, b);\n    add(q, p);\n    add(p, p);\n    cswap(p, q, b);\n  }\n}\n\nfunction scalarbase(p, s) {\n  var q = [gf(), gf(), gf(), gf()];\n  set25519(q[0], X);\n  set25519(q[1], Y);\n  set25519(q[2], gf1);\n  M(q[3], X, Y);\n  scalarmult(p, q, s);\n}\n\nfunction crypto_sign_keypair(pk, sk, seeded) {\n  var d = new Uint8Array(64);\n  var p = [gf(), gf(), gf(), gf()];\n  var i;\n\n  if (!seeded) randombytes(sk, 32);\n  crypto_hash(d, sk, 32);\n  d[0] &= 248;\n  d[31] &= 127;\n  d[31] |= 64;\n\n  scalarbase(p, d);\n  pack(pk, p);\n\n  for (i = 0; i < 32; i++) sk[i+32] = pk[i];\n  return 0;\n}\n\nvar L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);\n\nfunction modL(r, x) {\n  var carry, i, j, k;\n  for (i = 63; i >= 32; --i) {\n    carry = 0;\n    for (j = i - 32, k = i - 12; j < k; ++j) {\n      x[j] += carry - 16 * x[i] * L[j - (i - 32)];\n      carry = (x[j] + 128) >> 8;\n      x[j] -= carry * 256;\n    }\n    x[j] += carry;\n    x[i] = 0;\n  }\n  carry = 0;\n  for (j = 0; j < 32; j++) {\n    x[j] += carry - (x[31] >> 4) * L[j];\n    carry = x[j] >> 8;\n    x[j] &= 255;\n  }\n  for (j = 0; j < 32; j++) x[j] -= carry * L[j];\n  for (i = 0; i < 32; i++) {\n    x[i+1] += x[i] >> 8;\n    r[i] = x[i] & 255;\n  }\n}\n\nfunction reduce(r) {\n  var x = new Float64Array(64), i;\n  for (i = 0; i < 64; i++) x[i] = r[i];\n  for (i = 0; i < 64; i++) r[i] = 0;\n  modL(r, x);\n}\n\n// Note: difference from C - smlen returned, not passed as argument.\nfunction crypto_sign(sm, m, n, sk) {\n  var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);\n  var i, j, x = new Float64Array(64);\n  var p = [gf(), gf(), gf(), gf()];\n\n  crypto_hash(d, sk, 32);\n  d[0] &= 248;\n  d[31] &= 127;\n  d[31] |= 64;\n\n  var smlen = n + 64;\n  for (i = 0; i < n; i++) sm[64 + i] = m[i];\n  for (i = 0; i < 32; i++) sm[32 + i] = d[32 + i];\n\n  crypto_hash(r, sm.subarray(32), n+32);\n  reduce(r);\n  scalarbase(p, r);\n  pack(sm, p);\n\n  for (i = 32; i < 64; i++) sm[i] = sk[i];\n  crypto_hash(h, sm, n + 64);\n  reduce(h);\n\n  for (i = 0; i < 64; i++) x[i] = 0;\n  for (i = 0; i < 32; i++) x[i] = r[i];\n  for (i = 0; i < 32; i++) {\n    for (j = 0; j < 32; j++) {\n      x[i+j] += h[i] * d[j];\n    }\n  }\n\n  modL(sm.subarray(32), x);\n  return smlen;\n}\n\nfunction unpackneg(r, p) {\n  var t = gf(), chk = gf(), num = gf(),\n      den = gf(), den2 = gf(), den4 = gf(),\n      den6 = gf();\n\n  set25519(r[2], gf1);\n  unpack25519(r[1], p);\n  S(num, r[1]);\n  M(den, num, D);\n  Z(num, num, r[2]);\n  A(den, r[2], den);\n\n  S(den2, den);\n  S(den4, den2);\n  M(den6, den4, den2);\n  M(t, den6, num);\n  M(t, t, den);\n\n  pow2523(t, t);\n  M(t, t, num);\n  M(t, t, den);\n  M(t, t, den);\n  M(r[0], t, den);\n\n  S(chk, r[0]);\n  M(chk, chk, den);\n  if (neq25519(chk, num)) M(r[0], r[0], I);\n\n  S(chk, r[0]);\n  M(chk, chk, den);\n  if (neq25519(chk, num)) return -1;\n\n  if (par25519(r[0]) === (p[31]>>7)) Z(r[0], gf0, r[0]);\n\n  M(r[3], r[0], r[1]);\n  return 0;\n}\n\nfunction crypto_sign_open(m, sm, n, pk) {\n  var i, mlen;\n  var t = new Uint8Array(32), h = new Uint8Array(64);\n  var p = [gf(), gf(), gf(), gf()],\n      q = [gf(), gf(), gf(), gf()];\n\n  mlen = -1;\n  if (n < 64) return -1;\n\n  if (unpackneg(q, pk)) return -1;\n\n  for (i = 0; i < n; i++) m[i] = sm[i];\n  for (i = 0; i < 32; i++) m[i+32] = pk[i];\n  crypto_hash(h, m, n);\n  reduce(h);\n  scalarmult(p, q, h);\n\n  scalarbase(q, sm.subarray(32));\n  add(p, q);\n  pack(t, p);\n\n  n -= 64;\n  if (crypto_verify_32(sm, 0, t, 0)) {\n    for (i = 0; i < n; i++) m[i] = 0;\n    return -1;\n  }\n\n  for (i = 0; i < n; i++) m[i] = sm[i + 64];\n  mlen = n;\n  return mlen;\n}\n\nvar crypto_secretbox_KEYBYTES = 32,\n    crypto_secretbox_NONCEBYTES = 24,\n    crypto_secretbox_ZEROBYTES = 32,\n    crypto_secretbox_BOXZEROBYTES = 16,\n    crypto_scalarmult_BYTES = 32,\n    crypto_scalarmult_SCALARBYTES = 32,\n    crypto_box_PUBLICKEYBYTES = 32,\n    crypto_box_SECRETKEYBYTES = 32,\n    crypto_box_BEFORENMBYTES = 32,\n    crypto_box_NONCEBYTES = crypto_secretbox_NONCEBYTES,\n    crypto_box_ZEROBYTES = crypto_secretbox_ZEROBYTES,\n    crypto_box_BOXZEROBYTES = crypto_secretbox_BOXZEROBYTES,\n    crypto_sign_BYTES = 64,\n    crypto_sign_PUBLICKEYBYTES = 32,\n    crypto_sign_SECRETKEYBYTES = 64,\n    crypto_sign_SEEDBYTES = 32,\n    crypto_hash_BYTES = 64;\n\nnacl.lowlevel = {\n  crypto_core_hsalsa20: crypto_core_hsalsa20,\n  crypto_stream_xor: crypto_stream_xor,\n  crypto_stream: crypto_stream,\n  crypto_stream_salsa20_xor: crypto_stream_salsa20_xor,\n  crypto_stream_salsa20: crypto_stream_salsa20,\n  crypto_onetimeauth: crypto_onetimeauth,\n  crypto_onetimeauth_verify: crypto_onetimeauth_verify,\n  crypto_verify_16: crypto_verify_16,\n  crypto_verify_32: crypto_verify_32,\n  crypto_secretbox: crypto_secretbox,\n  crypto_secretbox_open: crypto_secretbox_open,\n  crypto_scalarmult: crypto_scalarmult,\n  crypto_scalarmult_base: crypto_scalarmult_base,\n  crypto_box_beforenm: crypto_box_beforenm,\n  crypto_box_afternm: crypto_box_afternm,\n  crypto_box: crypto_box,\n  crypto_box_open: crypto_box_open,\n  crypto_box_keypair: crypto_box_keypair,\n  crypto_hash: crypto_hash,\n  crypto_sign: crypto_sign,\n  crypto_sign_keypair: crypto_sign_keypair,\n  crypto_sign_open: crypto_sign_open,\n\n  crypto_secretbox_KEYBYTES: crypto_secretbox_KEYBYTES,\n  crypto_secretbox_NONCEBYTES: crypto_secretbox_NONCEBYTES,\n  crypto_secretbox_ZEROBYTES: crypto_secretbox_ZEROBYTES,\n  crypto_secretbox_BOXZEROBYTES: crypto_secretbox_BOXZEROBYTES,\n  crypto_scalarmult_BYTES: crypto_scalarmult_BYTES,\n  crypto_scalarmult_SCALARBYTES: crypto_scalarmult_SCALARBYTES,\n  crypto_box_PUBLICKEYBYTES: crypto_box_PUBLICKEYBYTES,\n  crypto_box_SECRETKEYBYTES: crypto_box_SECRETKEYBYTES,\n  crypto_box_BEFORENMBYTES: crypto_box_BEFORENMBYTES,\n  crypto_box_NONCEBYTES: crypto_box_NONCEBYTES,\n  crypto_box_ZEROBYTES: crypto_box_ZEROBYTES,\n  crypto_box_BOXZEROBYTES: crypto_box_BOXZEROBYTES,\n  crypto_sign_BYTES: crypto_sign_BYTES,\n  crypto_sign_PUBLICKEYBYTES: crypto_sign_PUBLICKEYBYTES,\n  crypto_sign_SECRETKEYBYTES: crypto_sign_SECRETKEYBYTES,\n  crypto_sign_SEEDBYTES: crypto_sign_SEEDBYTES,\n  crypto_hash_BYTES: crypto_hash_BYTES\n};\n\n/* High-level API */\n\nfunction checkLengths(k, n) {\n  if (k.length !== crypto_secretbox_KEYBYTES) throw new Error('bad key size');\n  if (n.length !== crypto_secretbox_NONCEBYTES) throw new Error('bad nonce size');\n}\n\nfunction checkBoxLengths(pk, sk) {\n  if (pk.length !== crypto_box_PUBLICKEYBYTES) throw new Error('bad public key size');\n  if (sk.length !== crypto_box_SECRETKEYBYTES) throw new Error('bad secret key size');\n}\n\nfunction checkArrayTypes() {\n  var t, i;\n  for (i = 0; i < arguments.length; i++) {\n     if ((t = Object.prototype.toString.call(arguments[i])) !== '[object Uint8Array]')\n       throw new TypeError('unexpected type ' + t + ', use Uint8Array');\n  }\n}\n\nfunction cleanup(arr) {\n  for (var i = 0; i < arr.length; i++) arr[i] = 0;\n}\n\n// TODO: Completely remove this in v0.15.\nif (!nacl.util) {\n  nacl.util = {};\n  nacl.util.decodeUTF8 = nacl.util.encodeUTF8 = nacl.util.encodeBase64 = nacl.util.decodeBase64 = function() {\n    throw new Error('nacl.util moved into separate package: https://github.com/dchest/tweetnacl-util-js');\n  };\n}\n\nnacl.randomBytes = function(n) {\n  var b = new Uint8Array(n);\n  randombytes(b, n);\n  return b;\n};\n\nnacl.secretbox = function(msg, nonce, key) {\n  checkArrayTypes(msg, nonce, key);\n  checkLengths(key, nonce);\n  var m = new Uint8Array(crypto_secretbox_ZEROBYTES + msg.length);\n  var c = new Uint8Array(m.length);\n  for (var i = 0; i < msg.length; i++) m[i+crypto_secretbox_ZEROBYTES] = msg[i];\n  crypto_secretbox(c, m, m.length, nonce, key);\n  return c.subarray(crypto_secretbox_BOXZEROBYTES);\n};\n\nnacl.secretbox.open = function(box, nonce, key) {\n  checkArrayTypes(box, nonce, key);\n  checkLengths(key, nonce);\n  var c = new Uint8Array(crypto_secretbox_BOXZEROBYTES + box.length);\n  var m = new Uint8Array(c.length);\n  for (var i = 0; i < box.length; i++) c[i+crypto_secretbox_BOXZEROBYTES] = box[i];\n  if (c.length < 32) return false;\n  if (crypto_secretbox_open(m, c, c.length, nonce, key) !== 0) return false;\n  return m.subarray(crypto_secretbox_ZEROBYTES);\n};\n\nnacl.secretbox.keyLength = crypto_secretbox_KEYBYTES;\nnacl.secretbox.nonceLength = crypto_secretbox_NONCEBYTES;\nnacl.secretbox.overheadLength = crypto_secretbox_BOXZEROBYTES;\n\nnacl.scalarMult = function(n, p) {\n  checkArrayTypes(n, p);\n  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');\n  if (p.length !== crypto_scalarmult_BYTES) throw new Error('bad p size');\n  var q = new Uint8Array(crypto_scalarmult_BYTES);\n  crypto_scalarmult(q, n, p);\n  return q;\n};\n\nnacl.scalarMult.base = function(n) {\n  checkArrayTypes(n);\n  if (n.length !== crypto_scalarmult_SCALARBYTES) throw new Error('bad n size');\n  var q = new Uint8Array(crypto_scalarmult_BYTES);\n  crypto_scalarmult_base(q, n);\n  return q;\n};\n\nnacl.scalarMult.scalarLength = crypto_scalarmult_SCALARBYTES;\nnacl.scalarMult.groupElementLength = crypto_scalarmult_BYTES;\n\nnacl.box = function(msg, nonce, publicKey, secretKey) {\n  var k = nacl.box.before(publicKey, secretKey);\n  return nacl.secretbox(msg, nonce, k);\n};\n\nnacl.box.before = function(publicKey, secretKey) {\n  checkArrayTypes(publicKey, secretKey);\n  checkBoxLengths(publicKey, secretKey);\n  var k = new Uint8Array(crypto_box_BEFORENMBYTES);\n  crypto_box_beforenm(k, publicKey, secretKey);\n  return k;\n};\n\nnacl.box.after = nacl.secretbox;\n\nnacl.box.open = function(msg, nonce, publicKey, secretKey) {\n  var k = nacl.box.before(publicKey, secretKey);\n  return nacl.secretbox.open(msg, nonce, k);\n};\n\nnacl.box.open.after = nacl.secretbox.open;\n\nnacl.box.keyPair = function() {\n  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);\n  var sk = new Uint8Array(crypto_box_SECRETKEYBYTES);\n  crypto_box_keypair(pk, sk);\n  return {publicKey: pk, secretKey: sk};\n};\n\nnacl.box.keyPair.fromSecretKey = function(secretKey) {\n  checkArrayTypes(secretKey);\n  if (secretKey.length !== crypto_box_SECRETKEYBYTES)\n    throw new Error('bad secret key size');\n  var pk = new Uint8Array(crypto_box_PUBLICKEYBYTES);\n  crypto_scalarmult_base(pk, secretKey);\n  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};\n};\n\nnacl.box.publicKeyLength = crypto_box_PUBLICKEYBYTES;\nnacl.box.secretKeyLength = crypto_box_SECRETKEYBYTES;\nnacl.box.sharedKeyLength = crypto_box_BEFORENMBYTES;\nnacl.box.nonceLength = crypto_box_NONCEBYTES;\nnacl.box.overheadLength = nacl.secretbox.overheadLength;\n\nnacl.sign = function(msg, secretKey) {\n  checkArrayTypes(msg, secretKey);\n  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)\n    throw new Error('bad secret key size');\n  var signedMsg = new Uint8Array(crypto_sign_BYTES+msg.length);\n  crypto_sign(signedMsg, msg, msg.length, secretKey);\n  return signedMsg;\n};\n\nnacl.sign.open = function(signedMsg, publicKey) {\n  if (arguments.length !== 2)\n    throw new Error('nacl.sign.open accepts 2 arguments; did you mean to use nacl.sign.detached.verify?');\n  checkArrayTypes(signedMsg, publicKey);\n  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)\n    throw new Error('bad public key size');\n  var tmp = new Uint8Array(signedMsg.length);\n  var mlen = crypto_sign_open(tmp, signedMsg, signedMsg.length, publicKey);\n  if (mlen < 0) return null;\n  var m = new Uint8Array(mlen);\n  for (var i = 0; i < m.length; i++) m[i] = tmp[i];\n  return m;\n};\n\nnacl.sign.detached = function(msg, secretKey) {\n  var signedMsg = nacl.sign(msg, secretKey);\n  var sig = new Uint8Array(crypto_sign_BYTES);\n  for (var i = 0; i < sig.length; i++) sig[i] = signedMsg[i];\n  return sig;\n};\n\nnacl.sign.detached.verify = function(msg, sig, publicKey) {\n  checkArrayTypes(msg, sig, publicKey);\n  if (sig.length !== crypto_sign_BYTES)\n    throw new Error('bad signature size');\n  if (publicKey.length !== crypto_sign_PUBLICKEYBYTES)\n    throw new Error('bad public key size');\n  var sm = new Uint8Array(crypto_sign_BYTES + msg.length);\n  var m = new Uint8Array(crypto_sign_BYTES + msg.length);\n  var i;\n  for (i = 0; i < crypto_sign_BYTES; i++) sm[i] = sig[i];\n  for (i = 0; i < msg.length; i++) sm[i+crypto_sign_BYTES] = msg[i];\n  return (crypto_sign_open(m, sm, sm.length, publicKey) >= 0);\n};\n\nnacl.sign.keyPair = function() {\n  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);\n  crypto_sign_keypair(pk, sk);\n  return {publicKey: pk, secretKey: sk};\n};\n\nnacl.sign.keyPair.fromSecretKey = function(secretKey) {\n  checkArrayTypes(secretKey);\n  if (secretKey.length !== crypto_sign_SECRETKEYBYTES)\n    throw new Error('bad secret key size');\n  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n  for (var i = 0; i < pk.length; i++) pk[i] = secretKey[32+i];\n  return {publicKey: pk, secretKey: new Uint8Array(secretKey)};\n};\n\nnacl.sign.keyPair.fromSeed = function(seed) {\n  checkArrayTypes(seed);\n  if (seed.length !== crypto_sign_SEEDBYTES)\n    throw new Error('bad seed size');\n  var pk = new Uint8Array(crypto_sign_PUBLICKEYBYTES);\n  var sk = new Uint8Array(crypto_sign_SECRETKEYBYTES);\n  for (var i = 0; i < 32; i++) sk[i] = seed[i];\n  crypto_sign_keypair(pk, sk, true);\n  return {publicKey: pk, secretKey: sk};\n};\n\nnacl.sign.publicKeyLength = crypto_sign_PUBLICKEYBYTES;\nnacl.sign.secretKeyLength = crypto_sign_SECRETKEYBYTES;\nnacl.sign.seedLength = crypto_sign_SEEDBYTES;\nnacl.sign.signatureLength = crypto_sign_BYTES;\n\nnacl.hash = function(msg) {\n  checkArrayTypes(msg);\n  var h = new Uint8Array(crypto_hash_BYTES);\n  crypto_hash(h, msg, msg.length);\n  return h;\n};\n\nnacl.hash.hashLength = crypto_hash_BYTES;\n\nnacl.verify = function(x, y) {\n  checkArrayTypes(x, y);\n  // Zero length arguments are considered not equal.\n  if (x.length === 0 || y.length === 0) return false;\n  if (x.length !== y.length) return false;\n  return (vn(x, 0, y, 0, x.length) === 0) ? true : false;\n};\n\nnacl.setPRNG = function(fn) {\n  randombytes = fn;\n};\n\n(function() {\n  // Initialize PRNG if environment provides CSPRNG.\n  // If not, methods calling randombytes will throw.\n  var crypto = typeof self !== 'undefined' ? (self.crypto || self.msCrypto) : null;\n  if (crypto && crypto.getRandomValues) {\n    // Browsers.\n    var QUOTA = 65536;\n    nacl.setPRNG(function(x, n) {\n      var i, v = new Uint8Array(n);\n      for (i = 0; i < n; i += QUOTA) {\n        crypto.getRandomValues(v.subarray(i, i + Math.min(n - i, QUOTA)));\n      }\n      for (i = 0; i < n; i++) x[i] = v[i];\n      cleanup(v);\n    });\n  } else if (true) {\n    // Node.js.\n    crypto = __webpack_require__(11);\n    if (crypto && crypto.randomBytes) {\n      nacl.setPRNG(function(x, n) {\n        var i, v = crypto.randomBytes(n);\n        for (i = 0; i < n; i++) x[i] = v[i];\n        cleanup(v);\n      });\n    }\n  }\n})();\n\n})(typeof module !== 'undefined' && module.exports ? module.exports : (self.nacl = self.nacl || {}));\n\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"events\");\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.hostedGit = exports.registries = undefined;\nexports.getExoticResolver = getExoticResolver;\nexports.hostedGitFragmentToGitUrl = hostedGitFragmentToGitUrl;\n\nvar _baseResolver;\n\nfunction _load_baseResolver() {\n  return _baseResolver = _interopRequireDefault(__webpack_require__(124));\n}\n\nvar _npmResolver;\n\nfunction _load_npmResolver() {\n  return _npmResolver = _interopRequireDefault(__webpack_require__(215));\n}\n\nvar _yarnResolver;\n\nfunction _load_yarnResolver() {\n  return _yarnResolver = _interopRequireDefault(__webpack_require__(544));\n}\n\nvar _gitResolver;\n\nfunction _load_gitResolver() {\n  return _gitResolver = _interopRequireDefault(__webpack_require__(125));\n}\n\nvar _tarballResolver;\n\nfunction _load_tarballResolver() {\n  return _tarballResolver = _interopRequireDefault(__webpack_require__(542));\n}\n\nvar _githubResolver;\n\nfunction _load_githubResolver() {\n  return _githubResolver = _interopRequireDefault(__webpack_require__(361));\n}\n\nvar _fileResolver;\n\nfunction _load_fileResolver() {\n  return _fileResolver = _interopRequireDefault(__webpack_require__(213));\n}\n\nvar _linkResolver;\n\nfunction _load_linkResolver() {\n  return _linkResolver = _interopRequireDefault(__webpack_require__(362));\n}\n\nvar _gitlabResolver;\n\nfunction _load_gitlabResolver() {\n  return _gitlabResolver = _interopRequireDefault(__webpack_require__(540));\n}\n\nvar _gistResolver;\n\nfunction _load_gistResolver() {\n  return _gistResolver = _interopRequireDefault(__webpack_require__(214));\n}\n\nvar _bitbucketResolver;\n\nfunction _load_bitbucketResolver() {\n  return _bitbucketResolver = _interopRequireDefault(__webpack_require__(539));\n}\n\nvar _hostedGitResolver;\n\nfunction _load_hostedGitResolver() {\n  return _hostedGitResolver = __webpack_require__(109);\n}\n\nvar _registryResolver;\n\nfunction _load_registryResolver() {\n  return _registryResolver = _interopRequireDefault(__webpack_require__(541));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst registries = exports.registries = {\n  npm: (_npmResolver || _load_npmResolver()).default,\n  yarn: (_yarnResolver || _load_yarnResolver()).default\n};\n\n//\n\nconst exotics = new Set([(_gitResolver || _load_gitResolver()).default, (_tarballResolver || _load_tarballResolver()).default, (_githubResolver || _load_githubResolver()).default, (_fileResolver || _load_fileResolver()).default, (_linkResolver || _load_linkResolver()).default, (_gitlabResolver || _load_gitlabResolver()).default, (_gistResolver || _load_gistResolver()).default, (_bitbucketResolver || _load_bitbucketResolver()).default]);\n\nfunction getExoticResolver(pattern) {\n  for (var _iterator = exotics, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n    var _ref;\n\n    if (_isArray) {\n      if (_i >= _iterator.length) break;\n      _ref = _iterator[_i++];\n    } else {\n      _i = _iterator.next();\n      if (_i.done) break;\n      _ref = _i.value;\n    }\n\n    const Resolver = _ref;\n\n    if (Resolver.isVersion(pattern)) {\n      return Resolver;\n    }\n  }\n  return null;\n}\n\n//\n\nconst hostedGit = exports.hostedGit = {\n  github: (_githubResolver || _load_githubResolver()).default,\n  gitlab: (_gitlabResolver || _load_gitlabResolver()).default,\n  bitbucket: (_bitbucketResolver || _load_bitbucketResolver()).default\n};\n\nfunction hostedGitFragmentToGitUrl(fragment, reporter) {\n  for (const key in hostedGit) {\n    const Resolver = hostedGit[key];\n    if (Resolver.isVersion(fragment)) {\n      return Resolver.getGitHTTPUrl((0, (_hostedGitResolver || _load_hostedGitResolver()).explodeHostedGitFragment)(fragment, reporter));\n    }\n  }\n\n  return fragment;\n}\n\n//\n\nfor (const key in registries) {\n  var _class, _temp;\n\n  const RegistryResolver = registries[key];\n\n  exotics.add((_temp = _class = class extends (_registryResolver || _load_registryResolver()).default {}, _class.protocol = key, _class.factory = RegistryResolver, _temp));\n}\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * Base prompt implementation\n * Should be extended by prompt types.\n */\n\nvar _ = __webpack_require__(38);\nvar chalk = __webpack_require__(27);\nvar runAsync = __webpack_require__(182);\nvar { filter, flatMap, share, take, takeUntil } = __webpack_require__(63);\nvar Choices = __webpack_require__(686);\nvar ScreenManager = __webpack_require__(697);\n\nclass Prompt {\n  constructor(question, rl, answers) {\n    // Setup instance defaults property\n    _.assign(this, {\n      answers: answers,\n      status: 'pending'\n    });\n\n    // Set defaults prompt options\n    this.opt = _.defaults(_.clone(question), {\n      validate: () => true,\n      filter: val => val,\n      when: () => true,\n      suffix: '',\n      prefix: chalk.green('?')\n    });\n\n    // Make sure name is present\n    if (!this.opt.name) {\n      this.throwParamError('name');\n    }\n\n    // Set default message if no message defined\n    if (!this.opt.message) {\n      this.opt.message = this.opt.name + ':';\n    }\n\n    // Normalize choices\n    if (Array.isArray(this.opt.choices)) {\n      this.opt.choices = new Choices(this.opt.choices, answers);\n    }\n\n    this.rl = rl;\n    this.screen = new ScreenManager(this.rl);\n  }\n\n  /**\n   * Start the Inquiry session and manage output value filtering\n   * @return {Promise}\n   */\n\n  run() {\n    return new Promise(resolve => {\n      this._run(value => resolve(value));\n    });\n  }\n\n  // Default noop (this one should be overwritten in prompts)\n  _run(cb) {\n    cb();\n  }\n\n  /**\n   * Throw an error telling a required parameter is missing\n   * @param  {String} name Name of the missing param\n   * @return {Throw Error}\n   */\n\n  throwParamError(name) {\n    throw new Error('You must provide a `' + name + '` parameter');\n  }\n\n  /**\n   * Called when the UI closes. Override to do any specific cleanup necessary\n   */\n  close() {\n    this.screen.releaseCursor();\n  }\n\n  /**\n   * Run the provided validation method each time a submit event occur.\n   * @param  {Rx.Observable} submit - submit event flow\n   * @return {Object}        Object containing two observables: `success` and `error`\n   */\n  handleSubmitEvents(submit) {\n    var self = this;\n    var validate = runAsync(this.opt.validate);\n    var asyncFilter = runAsync(this.opt.filter);\n    var validation = submit.pipe(\n      flatMap(value =>\n        asyncFilter(value, self.answers).then(\n          filteredValue =>\n            validate(filteredValue, self.answers).then(\n              isValid => ({ isValid: isValid, value: filteredValue }),\n              err => ({ isValid: err })\n            ),\n          err => ({ isValid: err })\n        )\n      ),\n      share()\n    );\n\n    var success = validation.pipe(\n      filter(state => state.isValid === true),\n      take(1)\n    );\n    var error = validation.pipe(\n      filter(state => state.isValid !== true),\n      takeUntil(success)\n    );\n\n    return {\n      success: success,\n      error: error\n    };\n  }\n\n  /**\n   * Generate the prompt question string\n   * @return {String} prompt question string\n   */\n\n  getQuestion() {\n    var message =\n      this.opt.prefix +\n      ' ' +\n      chalk.bold(this.opt.message) +\n      this.opt.suffix +\n      chalk.reset(' ');\n\n    // Append the default if available, and if question isn't answered\n    if (this.opt.default != null && this.status !== 'answered') {\n      // If default password is supplied, hide it\n      if (this.opt.type === 'password') {\n        message += chalk.italic.dim('[hidden] ');\n      } else {\n        message += chalk.dim('(' + this.opt.default + ') ');\n      }\n    }\n\n    return message;\n  }\n}\n\nmodule.exports = Prompt;\n\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar { fromEvent } = __webpack_require__(183);\nvar { filter, map, share } = __webpack_require__(63);\n\nfunction normalizeKeypressEvents(value, key) {\n  return { value: value, key: key || {} };\n}\n\nmodule.exports = function(rl) {\n  var keypress = fromEvent(rl.input, 'keypress', normalizeKeypressEvents)\n    // Ignore `enter` key. On the readline, we only care about the `line` event.\n    .pipe(filter(({ key }) => key.name !== 'enter' && key.name !== 'return'));\n\n  return {\n    line: fromEvent(rl, 'line'),\n    keypress: keypress,\n\n    normalizedUpKey: keypress.pipe(\n      filter(\n        ({ key }) =>\n          key.name === 'up' || key.name === 'k' || (key.name === 'p' && key.ctrl)\n      ),\n      share()\n    ),\n\n    normalizedDownKey: keypress.pipe(\n      filter(\n        ({ key }) =>\n          key.name === 'down' || key.name === 'j' || (key.name === 'n' && key.ctrl)\n      ),\n      share()\n    ),\n\n    numberKey: keypress.pipe(\n      filter(e => e.value && '123456789'.indexOf(e.value) >= 0),\n      map(e => Number(e.value)),\n      share()\n    ),\n\n    spaceKey: keypress.pipe(\n      filter(({ key }) => key && key.name === 'space'),\n      share()\n    ),\n    aKey: keypress.pipe(\n      filter(({ key }) => key && key.name === 'a'),\n      share()\n    ),\n    iKey: keypress.pipe(\n      filter(({ key }) => key && key.name === 'i'),\n      share()\n    )\n  };\n};\n\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n(function(){\n\n    // Copyright (c) 2005  Tom Wu\n    // All Rights Reserved.\n    // See \"LICENSE\" for details.\n\n    // Basic JavaScript BN library - subset useful for RSA encryption.\n\n    // Bits per digit\n    var dbits;\n\n    // JavaScript engine analysis\n    var canary = 0xdeadbeefcafe;\n    var j_lm = ((canary&0xffffff)==0xefcafe);\n\n    // (public) Constructor\n    function BigInteger(a,b,c) {\n      if(a != null)\n        if(\"number\" == typeof a) this.fromNumber(a,b,c);\n        else if(b == null && \"string\" != typeof a) this.fromString(a,256);\n        else this.fromString(a,b);\n    }\n\n    // return new, unset BigInteger\n    function nbi() { return new BigInteger(null); }\n\n    // am: Compute w_j += (x*this_i), propagate carries,\n    // c is initial carry, returns final carry.\n    // c < 3*dvalue, x < 2*dvalue, this_i < dvalue\n    // We need to select the fastest one that works in this environment.\n\n    // am1: use a single mult and divide to get the high bits,\n    // max digit bits should be 26 because\n    // max internal value = 2*dvalue^2-2*dvalue (< 2^53)\n    function am1(i,x,w,j,c,n) {\n      while(--n >= 0) {\n        var v = x*this[i++]+w[j]+c;\n        c = Math.floor(v/0x4000000);\n        w[j++] = v&0x3ffffff;\n      }\n      return c;\n    }\n    // am2 avoids a big mult-and-extract completely.\n    // Max digit bits should be <= 30 because we do bitwise ops\n    // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)\n    function am2(i,x,w,j,c,n) {\n      var xl = x&0x7fff, xh = x>>15;\n      while(--n >= 0) {\n        var l = this[i]&0x7fff;\n        var h = this[i++]>>15;\n        var m = xh*l+h*xl;\n        l = xl*l+((m&0x7fff)<<15)+w[j]+(c&0x3fffffff);\n        c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);\n        w[j++] = l&0x3fffffff;\n      }\n      return c;\n    }\n    // Alternately, set max digit bits to 28 since some\n    // browsers slow down when dealing with 32-bit numbers.\n    function am3(i,x,w,j,c,n) {\n      var xl = x&0x3fff, xh = x>>14;\n      while(--n >= 0) {\n        var l = this[i]&0x3fff;\n        var h = this[i++]>>14;\n        var m = xh*l+h*xl;\n        l = xl*l+((m&0x3fff)<<14)+w[j]+c;\n        c = (l>>28)+(m>>14)+xh*h;\n        w[j++] = l&0xfffffff;\n      }\n      return c;\n    }\n    var inBrowser = typeof navigator !== \"undefined\";\n    if(inBrowser && j_lm && (navigator.appName == \"Microsoft Internet Explorer\")) {\n      BigInteger.prototype.am = am2;\n      dbits = 30;\n    }\n    else if(inBrowser && j_lm && (navigator.appName != \"Netscape\")) {\n      BigInteger.prototype.am = am1;\n      dbits = 26;\n    }\n    else { // Mozilla/Netscape seems to prefer am3\n      BigInteger.prototype.am = am3;\n      dbits = 28;\n    }\n\n    BigInteger.prototype.DB = dbits;\n    BigInteger.prototype.DM = ((1<<dbits)-1);\n    BigInteger.prototype.DV = (1<<dbits);\n\n    var BI_FP = 52;\n    BigInteger.prototype.FV = Math.pow(2,BI_FP);\n    BigInteger.prototype.F1 = BI_FP-dbits;\n    BigInteger.prototype.F2 = 2*dbits-BI_FP;\n\n    // Digit conversions\n    var BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\n    var BI_RC = new Array();\n    var rr,vv;\n    rr = \"0\".charCodeAt(0);\n    for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;\n    rr = \"a\".charCodeAt(0);\n    for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n    rr = \"A\".charCodeAt(0);\n    for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;\n\n    function int2char(n) { return BI_RM.charAt(n); }\n    function intAt(s,i) {\n      var c = BI_RC[s.charCodeAt(i)];\n      return (c==null)?-1:c;\n    }\n\n    // (protected) copy this to r\n    function bnpCopyTo(r) {\n      for(var i = this.t-1; i >= 0; --i) r[i] = this[i];\n      r.t = this.t;\n      r.s = this.s;\n    }\n\n    // (protected) set from integer value x, -DV <= x < DV\n    function bnpFromInt(x) {\n      this.t = 1;\n      this.s = (x<0)?-1:0;\n      if(x > 0) this[0] = x;\n      else if(x < -1) this[0] = x+this.DV;\n      else this.t = 0;\n    }\n\n    // return bigint initialized to value\n    function nbv(i) { var r = nbi(); r.fromInt(i); return r; }\n\n    // (protected) set from string and radix\n    function bnpFromString(s,b) {\n      var k;\n      if(b == 16) k = 4;\n      else if(b == 8) k = 3;\n      else if(b == 256) k = 8; // byte array\n      else if(b == 2) k = 1;\n      else if(b == 32) k = 5;\n      else if(b == 4) k = 2;\n      else { this.fromRadix(s,b); return; }\n      this.t = 0;\n      this.s = 0;\n      var i = s.length, mi = false, sh = 0;\n      while(--i >= 0) {\n        var x = (k==8)?s[i]&0xff:intAt(s,i);\n        if(x < 0) {\n          if(s.charAt(i) == \"-\") mi = true;\n          continue;\n        }\n        mi = false;\n        if(sh == 0)\n          this[this.t++] = x;\n        else if(sh+k > this.DB) {\n          this[this.t-1] |= (x&((1<<(this.DB-sh))-1))<<sh;\n          this[this.t++] = (x>>(this.DB-sh));\n        }\n        else\n          this[this.t-1] |= x<<sh;\n        sh += k;\n        if(sh >= this.DB) sh -= this.DB;\n      }\n      if(k == 8 && (s[0]&0x80) != 0) {\n        this.s = -1;\n        if(sh > 0) this[this.t-1] |= ((1<<(this.DB-sh))-1)<<sh;\n      }\n      this.clamp();\n      if(mi) BigInteger.ZERO.subTo(this,this);\n    }\n\n    // (protected) clamp off excess high words\n    function bnpClamp() {\n      var c = this.s&this.DM;\n      while(this.t > 0 && this[this.t-1] == c) --this.t;\n    }\n\n    // (public) return string representation in given radix\n    function bnToString(b) {\n      if(this.s < 0) return \"-\"+this.negate().toString(b);\n      var k;\n      if(b == 16) k = 4;\n      else if(b == 8) k = 3;\n      else if(b == 2) k = 1;\n      else if(b == 32) k = 5;\n      else if(b == 4) k = 2;\n      else return this.toRadix(b);\n      var km = (1<<k)-1, d, m = false, r = \"\", i = this.t;\n      var p = this.DB-(i*this.DB)%k;\n      if(i-- > 0) {\n        if(p < this.DB && (d = this[i]>>p) > 0) { m = true; r = int2char(d); }\n        while(i >= 0) {\n          if(p < k) {\n            d = (this[i]&((1<<p)-1))<<(k-p);\n            d |= this[--i]>>(p+=this.DB-k);\n          }\n          else {\n            d = (this[i]>>(p-=k))&km;\n            if(p <= 0) { p += this.DB; --i; }\n          }\n          if(d > 0) m = true;\n          if(m) r += int2char(d);\n        }\n      }\n      return m?r:\"0\";\n    }\n\n    // (public) -this\n    function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }\n\n    // (public) |this|\n    function bnAbs() { return (this.s<0)?this.negate():this; }\n\n    // (public) return + if this > a, - if this < a, 0 if equal\n    function bnCompareTo(a) {\n      var r = this.s-a.s;\n      if(r != 0) return r;\n      var i = this.t;\n      r = i-a.t;\n      if(r != 0) return (this.s<0)?-r:r;\n      while(--i >= 0) if((r=this[i]-a[i]) != 0) return r;\n      return 0;\n    }\n\n    // returns bit length of the integer x\n    function nbits(x) {\n      var r = 1, t;\n      if((t=x>>>16) != 0) { x = t; r += 16; }\n      if((t=x>>8) != 0) { x = t; r += 8; }\n      if((t=x>>4) != 0) { x = t; r += 4; }\n      if((t=x>>2) != 0) { x = t; r += 2; }\n      if((t=x>>1) != 0) { x = t; r += 1; }\n      return r;\n    }\n\n    // (public) return the number of bits in \"this\"\n    function bnBitLength() {\n      if(this.t <= 0) return 0;\n      return this.DB*(this.t-1)+nbits(this[this.t-1]^(this.s&this.DM));\n    }\n\n    // (protected) r = this << n*DB\n    function bnpDLShiftTo(n,r) {\n      var i;\n      for(i = this.t-1; i >= 0; --i) r[i+n] = this[i];\n      for(i = n-1; i >= 0; --i) r[i] = 0;\n      r.t = this.t+n;\n      r.s = this.s;\n    }\n\n    // (protected) r = this >> n*DB\n    function bnpDRShiftTo(n,r) {\n      for(var i = n; i < this.t; ++i) r[i-n] = this[i];\n      r.t = Math.max(this.t-n,0);\n      r.s = this.s;\n    }\n\n    // (protected) r = this << n\n    function bnpLShiftTo(n,r) {\n      var bs = n%this.DB;\n      var cbs = this.DB-bs;\n      var bm = (1<<cbs)-1;\n      var ds = Math.floor(n/this.DB), c = (this.s<<bs)&this.DM, i;\n      for(i = this.t-1; i >= 0; --i) {\n        r[i+ds+1] = (this[i]>>cbs)|c;\n        c = (this[i]&bm)<<bs;\n      }\n      for(i = ds-1; i >= 0; --i) r[i] = 0;\n      r[ds] = c;\n      r.t = this.t+ds+1;\n      r.s = this.s;\n      r.clamp();\n    }\n\n    // (protected) r = this >> n\n    function bnpRShiftTo(n,r) {\n      r.s = this.s;\n      var ds = Math.floor(n/this.DB);\n      if(ds >= this.t) { r.t = 0; return; }\n      var bs = n%this.DB;\n      var cbs = this.DB-bs;\n      var bm = (1<<bs)-1;\n      r[0] = this[ds]>>bs;\n      for(var i = ds+1; i < this.t; ++i) {\n        r[i-ds-1] |= (this[i]&bm)<<cbs;\n        r[i-ds] = this[i]>>bs;\n      }\n      if(bs > 0) r[this.t-ds-1] |= (this.s&bm)<<cbs;\n      r.t = this.t-ds;\n      r.clamp();\n    }\n\n    // (protected) r = this - a\n    function bnpSubTo(a,r) {\n      var i = 0, c = 0, m = Math.min(a.t,this.t);\n      while(i < m) {\n        c += this[i]-a[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      if(a.t < this.t) {\n        c -= a.s;\n        while(i < this.t) {\n          c += this[i];\n          r[i++] = c&this.DM;\n          c >>= this.DB;\n        }\n        c += this.s;\n      }\n      else {\n        c += this.s;\n        while(i < a.t) {\n          c -= a[i];\n          r[i++] = c&this.DM;\n          c >>= this.DB;\n        }\n        c -= a.s;\n      }\n      r.s = (c<0)?-1:0;\n      if(c < -1) r[i++] = this.DV+c;\n      else if(c > 0) r[i++] = c;\n      r.t = i;\n      r.clamp();\n    }\n\n    // (protected) r = this * a, r != this,a (HAC 14.12)\n    // \"this\" should be the larger one if appropriate.\n    function bnpMultiplyTo(a,r) {\n      var x = this.abs(), y = a.abs();\n      var i = x.t;\n      r.t = i+y.t;\n      while(--i >= 0) r[i] = 0;\n      for(i = 0; i < y.t; ++i) r[i+x.t] = x.am(0,y[i],r,i,0,x.t);\n      r.s = 0;\n      r.clamp();\n      if(this.s != a.s) BigInteger.ZERO.subTo(r,r);\n    }\n\n    // (protected) r = this^2, r != this (HAC 14.16)\n    function bnpSquareTo(r) {\n      var x = this.abs();\n      var i = r.t = 2*x.t;\n      while(--i >= 0) r[i] = 0;\n      for(i = 0; i < x.t-1; ++i) {\n        var c = x.am(i,x[i],r,2*i,0,1);\n        if((r[i+x.t]+=x.am(i+1,2*x[i],r,2*i+1,c,x.t-i-1)) >= x.DV) {\n          r[i+x.t] -= x.DV;\n          r[i+x.t+1] = 1;\n        }\n      }\n      if(r.t > 0) r[r.t-1] += x.am(i,x[i],r,2*i,0,1);\n      r.s = 0;\n      r.clamp();\n    }\n\n    // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)\n    // r != q, this != m.  q or r may be null.\n    function bnpDivRemTo(m,q,r) {\n      var pm = m.abs();\n      if(pm.t <= 0) return;\n      var pt = this.abs();\n      if(pt.t < pm.t) {\n        if(q != null) q.fromInt(0);\n        if(r != null) this.copyTo(r);\n        return;\n      }\n      if(r == null) r = nbi();\n      var y = nbi(), ts = this.s, ms = m.s;\n      var nsh = this.DB-nbits(pm[pm.t-1]);   // normalize modulus\n      if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }\n      else { pm.copyTo(y); pt.copyTo(r); }\n      var ys = y.t;\n      var y0 = y[ys-1];\n      if(y0 == 0) return;\n      var yt = y0*(1<<this.F1)+((ys>1)?y[ys-2]>>this.F2:0);\n      var d1 = this.FV/yt, d2 = (1<<this.F1)/yt, e = 1<<this.F2;\n      var i = r.t, j = i-ys, t = (q==null)?nbi():q;\n      y.dlShiftTo(j,t);\n      if(r.compareTo(t) >= 0) {\n        r[r.t++] = 1;\n        r.subTo(t,r);\n      }\n      BigInteger.ONE.dlShiftTo(ys,t);\n      t.subTo(y,y);  // \"negative\" y so we can replace sub with am later\n      while(y.t < ys) y[y.t++] = 0;\n      while(--j >= 0) {\n        // Estimate quotient digit\n        var qd = (r[--i]==y0)?this.DM:Math.floor(r[i]*d1+(r[i-1]+e)*d2);\n        if((r[i]+=y.am(0,qd,r,j,0,ys)) < qd) {   // Try it out\n          y.dlShiftTo(j,t);\n          r.subTo(t,r);\n          while(r[i] < --qd) r.subTo(t,r);\n        }\n      }\n      if(q != null) {\n        r.drShiftTo(ys,q);\n        if(ts != ms) BigInteger.ZERO.subTo(q,q);\n      }\n      r.t = ys;\n      r.clamp();\n      if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder\n      if(ts < 0) BigInteger.ZERO.subTo(r,r);\n    }\n\n    // (public) this mod a\n    function bnMod(a) {\n      var r = nbi();\n      this.abs().divRemTo(a,null,r);\n      if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);\n      return r;\n    }\n\n    // Modular reduction using \"classic\" algorithm\n    function Classic(m) { this.m = m; }\n    function cConvert(x) {\n      if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);\n      else return x;\n    }\n    function cRevert(x) { return x; }\n    function cReduce(x) { x.divRemTo(this.m,null,x); }\n    function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n    function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n    Classic.prototype.convert = cConvert;\n    Classic.prototype.revert = cRevert;\n    Classic.prototype.reduce = cReduce;\n    Classic.prototype.mulTo = cMulTo;\n    Classic.prototype.sqrTo = cSqrTo;\n\n    // (protected) return \"-1/this % 2^DB\"; useful for Mont. reduction\n    // justification:\n    //         xy == 1 (mod m)\n    //         xy =  1+km\n    //   xy(2-xy) = (1+km)(1-km)\n    // x[y(2-xy)] = 1-k^2m^2\n    // x[y(2-xy)] == 1 (mod m^2)\n    // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2\n    // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.\n    // JS multiply \"overflows\" differently from C/C++, so care is needed here.\n    function bnpInvDigit() {\n      if(this.t < 1) return 0;\n      var x = this[0];\n      if((x&1) == 0) return 0;\n      var y = x&3;       // y == 1/x mod 2^2\n      y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4\n      y = (y*(2-(x&0xff)*y))&0xff;   // y == 1/x mod 2^8\n      y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff;    // y == 1/x mod 2^16\n      // last step - calculate inverse mod DV directly;\n      // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints\n      y = (y*(2-x*y%this.DV))%this.DV;       // y == 1/x mod 2^dbits\n      // we really want the negative inverse, and -DV < y < DV\n      return (y>0)?this.DV-y:-y;\n    }\n\n    // Montgomery reduction\n    function Montgomery(m) {\n      this.m = m;\n      this.mp = m.invDigit();\n      this.mpl = this.mp&0x7fff;\n      this.mph = this.mp>>15;\n      this.um = (1<<(m.DB-15))-1;\n      this.mt2 = 2*m.t;\n    }\n\n    // xR mod m\n    function montConvert(x) {\n      var r = nbi();\n      x.abs().dlShiftTo(this.m.t,r);\n      r.divRemTo(this.m,null,r);\n      if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);\n      return r;\n    }\n\n    // x/R mod m\n    function montRevert(x) {\n      var r = nbi();\n      x.copyTo(r);\n      this.reduce(r);\n      return r;\n    }\n\n    // x = x/R mod m (HAC 14.32)\n    function montReduce(x) {\n      while(x.t <= this.mt2) // pad x so am has enough room later\n        x[x.t++] = 0;\n      for(var i = 0; i < this.m.t; ++i) {\n        // faster way of calculating u0 = x[i]*mp mod DV\n        var j = x[i]&0x7fff;\n        var u0 = (j*this.mpl+(((j*this.mph+(x[i]>>15)*this.mpl)&this.um)<<15))&x.DM;\n        // use am to combine the multiply-shift-add into one call\n        j = i+this.m.t;\n        x[j] += this.m.am(0,u0,x,i,0,this.m.t);\n        // propagate carry\n        while(x[j] >= x.DV) { x[j] -= x.DV; x[++j]++; }\n      }\n      x.clamp();\n      x.drShiftTo(this.m.t,x);\n      if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n    }\n\n    // r = \"x^2/R mod m\"; x != r\n    function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n    // r = \"xy/R mod m\"; x,y != r\n    function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\n    Montgomery.prototype.convert = montConvert;\n    Montgomery.prototype.revert = montRevert;\n    Montgomery.prototype.reduce = montReduce;\n    Montgomery.prototype.mulTo = montMulTo;\n    Montgomery.prototype.sqrTo = montSqrTo;\n\n    // (protected) true iff this is even\n    function bnpIsEven() { return ((this.t>0)?(this[0]&1):this.s) == 0; }\n\n    // (protected) this^e, e < 2^32, doing sqr and mul with \"r\" (HAC 14.79)\n    function bnpExp(e,z) {\n      if(e > 0xffffffff || e < 1) return BigInteger.ONE;\n      var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;\n      g.copyTo(r);\n      while(--i >= 0) {\n        z.sqrTo(r,r2);\n        if((e&(1<<i)) > 0) z.mulTo(r2,g,r);\n        else { var t = r; r = r2; r2 = t; }\n      }\n      return z.revert(r);\n    }\n\n    // (public) this^e % m, 0 <= e < 2^32\n    function bnModPowInt(e,m) {\n      var z;\n      if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);\n      return this.exp(e,z);\n    }\n\n    // protected\n    BigInteger.prototype.copyTo = bnpCopyTo;\n    BigInteger.prototype.fromInt = bnpFromInt;\n    BigInteger.prototype.fromString = bnpFromString;\n    BigInteger.prototype.clamp = bnpClamp;\n    BigInteger.prototype.dlShiftTo = bnpDLShiftTo;\n    BigInteger.prototype.drShiftTo = bnpDRShiftTo;\n    BigInteger.prototype.lShiftTo = bnpLShiftTo;\n    BigInteger.prototype.rShiftTo = bnpRShiftTo;\n    BigInteger.prototype.subTo = bnpSubTo;\n    BigInteger.prototype.multiplyTo = bnpMultiplyTo;\n    BigInteger.prototype.squareTo = bnpSquareTo;\n    BigInteger.prototype.divRemTo = bnpDivRemTo;\n    BigInteger.prototype.invDigit = bnpInvDigit;\n    BigInteger.prototype.isEven = bnpIsEven;\n    BigInteger.prototype.exp = bnpExp;\n\n    // public\n    BigInteger.prototype.toString = bnToString;\n    BigInteger.prototype.negate = bnNegate;\n    BigInteger.prototype.abs = bnAbs;\n    BigInteger.prototype.compareTo = bnCompareTo;\n    BigInteger.prototype.bitLength = bnBitLength;\n    BigInteger.prototype.mod = bnMod;\n    BigInteger.prototype.modPowInt = bnModPowInt;\n\n    // \"constants\"\n    BigInteger.ZERO = nbv(0);\n    BigInteger.ONE = nbv(1);\n\n    // Copyright (c) 2005-2009  Tom Wu\n    // All Rights Reserved.\n    // See \"LICENSE\" for details.\n\n    // Extended JavaScript BN functions, required for RSA private ops.\n\n    // Version 1.1: new BigInteger(\"0\", 10) returns \"proper\" zero\n    // Version 1.2: square() API, isProbablePrime fix\n\n    // (public)\n    function bnClone() { var r = nbi(); this.copyTo(r); return r; }\n\n    // (public) return value as integer\n    function bnIntValue() {\n      if(this.s < 0) {\n        if(this.t == 1) return this[0]-this.DV;\n        else if(this.t == 0) return -1;\n      }\n      else if(this.t == 1) return this[0];\n      else if(this.t == 0) return 0;\n      // assumes 16 < DB < 32\n      return ((this[1]&((1<<(32-this.DB))-1))<<this.DB)|this[0];\n    }\n\n    // (public) return value as byte\n    function bnByteValue() { return (this.t==0)?this.s:(this[0]<<24)>>24; }\n\n    // (public) return value as short (assumes DB>=16)\n    function bnShortValue() { return (this.t==0)?this.s:(this[0]<<16)>>16; }\n\n    // (protected) return x s.t. r^x < DV\n    function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }\n\n    // (public) 0 if this == 0, 1 if this > 0\n    function bnSigNum() {\n      if(this.s < 0) return -1;\n      else if(this.t <= 0 || (this.t == 1 && this[0] <= 0)) return 0;\n      else return 1;\n    }\n\n    // (protected) convert to radix string\n    function bnpToRadix(b) {\n      if(b == null) b = 10;\n      if(this.signum() == 0 || b < 2 || b > 36) return \"0\";\n      var cs = this.chunkSize(b);\n      var a = Math.pow(b,cs);\n      var d = nbv(a), y = nbi(), z = nbi(), r = \"\";\n      this.divRemTo(d,y,z);\n      while(y.signum() > 0) {\n        r = (a+z.intValue()).toString(b).substr(1) + r;\n        y.divRemTo(d,y,z);\n      }\n      return z.intValue().toString(b) + r;\n    }\n\n    // (protected) convert from radix string\n    function bnpFromRadix(s,b) {\n      this.fromInt(0);\n      if(b == null) b = 10;\n      var cs = this.chunkSize(b);\n      var d = Math.pow(b,cs), mi = false, j = 0, w = 0;\n      for(var i = 0; i < s.length; ++i) {\n        var x = intAt(s,i);\n        if(x < 0) {\n          if(s.charAt(i) == \"-\" && this.signum() == 0) mi = true;\n          continue;\n        }\n        w = b*w+x;\n        if(++j >= cs) {\n          this.dMultiply(d);\n          this.dAddOffset(w,0);\n          j = 0;\n          w = 0;\n        }\n      }\n      if(j > 0) {\n        this.dMultiply(Math.pow(b,j));\n        this.dAddOffset(w,0);\n      }\n      if(mi) BigInteger.ZERO.subTo(this,this);\n    }\n\n    // (protected) alternate constructor\n    function bnpFromNumber(a,b,c) {\n      if(\"number\" == typeof b) {\n        // new BigInteger(int,int,RNG)\n        if(a < 2) this.fromInt(1);\n        else {\n          this.fromNumber(a,c);\n          if(!this.testBit(a-1))\t// force MSB set\n            this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);\n          if(this.isEven()) this.dAddOffset(1,0); // force odd\n          while(!this.isProbablePrime(b)) {\n            this.dAddOffset(2,0);\n            if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);\n          }\n        }\n      }\n      else {\n        // new BigInteger(int,RNG)\n        var x = new Array(), t = a&7;\n        x.length = (a>>3)+1;\n        b.nextBytes(x);\n        if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;\n        this.fromString(x,256);\n      }\n    }\n\n    // (public) convert to bigendian byte array\n    function bnToByteArray() {\n      var i = this.t, r = new Array();\n      r[0] = this.s;\n      var p = this.DB-(i*this.DB)%8, d, k = 0;\n      if(i-- > 0) {\n        if(p < this.DB && (d = this[i]>>p) != (this.s&this.DM)>>p)\n          r[k++] = d|(this.s<<(this.DB-p));\n        while(i >= 0) {\n          if(p < 8) {\n            d = (this[i]&((1<<p)-1))<<(8-p);\n            d |= this[--i]>>(p+=this.DB-8);\n          }\n          else {\n            d = (this[i]>>(p-=8))&0xff;\n            if(p <= 0) { p += this.DB; --i; }\n          }\n          if((d&0x80) != 0) d |= -256;\n          if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;\n          if(k > 0 || d != this.s) r[k++] = d;\n        }\n      }\n      return r;\n    }\n\n    function bnEquals(a) { return(this.compareTo(a)==0); }\n    function bnMin(a) { return(this.compareTo(a)<0)?this:a; }\n    function bnMax(a) { return(this.compareTo(a)>0)?this:a; }\n\n    // (protected) r = this op a (bitwise)\n    function bnpBitwiseTo(a,op,r) {\n      var i, f, m = Math.min(a.t,this.t);\n      for(i = 0; i < m; ++i) r[i] = op(this[i],a[i]);\n      if(a.t < this.t) {\n        f = a.s&this.DM;\n        for(i = m; i < this.t; ++i) r[i] = op(this[i],f);\n        r.t = this.t;\n      }\n      else {\n        f = this.s&this.DM;\n        for(i = m; i < a.t; ++i) r[i] = op(f,a[i]);\n        r.t = a.t;\n      }\n      r.s = op(this.s,a.s);\n      r.clamp();\n    }\n\n    // (public) this & a\n    function op_and(x,y) { return x&y; }\n    function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }\n\n    // (public) this | a\n    function op_or(x,y) { return x|y; }\n    function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }\n\n    // (public) this ^ a\n    function op_xor(x,y) { return x^y; }\n    function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }\n\n    // (public) this & ~a\n    function op_andnot(x,y) { return x&~y; }\n    function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }\n\n    // (public) ~this\n    function bnNot() {\n      var r = nbi();\n      for(var i = 0; i < this.t; ++i) r[i] = this.DM&~this[i];\n      r.t = this.t;\n      r.s = ~this.s;\n      return r;\n    }\n\n    // (public) this << n\n    function bnShiftLeft(n) {\n      var r = nbi();\n      if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);\n      return r;\n    }\n\n    // (public) this >> n\n    function bnShiftRight(n) {\n      var r = nbi();\n      if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);\n      return r;\n    }\n\n    // return index of lowest 1-bit in x, x < 2^31\n    function lbit(x) {\n      if(x == 0) return -1;\n      var r = 0;\n      if((x&0xffff) == 0) { x >>= 16; r += 16; }\n      if((x&0xff) == 0) { x >>= 8; r += 8; }\n      if((x&0xf) == 0) { x >>= 4; r += 4; }\n      if((x&3) == 0) { x >>= 2; r += 2; }\n      if((x&1) == 0) ++r;\n      return r;\n    }\n\n    // (public) returns index of lowest 1-bit (or -1 if none)\n    function bnGetLowestSetBit() {\n      for(var i = 0; i < this.t; ++i)\n        if(this[i] != 0) return i*this.DB+lbit(this[i]);\n      if(this.s < 0) return this.t*this.DB;\n      return -1;\n    }\n\n    // return number of 1 bits in x\n    function cbit(x) {\n      var r = 0;\n      while(x != 0) { x &= x-1; ++r; }\n      return r;\n    }\n\n    // (public) return number of set bits\n    function bnBitCount() {\n      var r = 0, x = this.s&this.DM;\n      for(var i = 0; i < this.t; ++i) r += cbit(this[i]^x);\n      return r;\n    }\n\n    // (public) true iff nth bit is set\n    function bnTestBit(n) {\n      var j = Math.floor(n/this.DB);\n      if(j >= this.t) return(this.s!=0);\n      return((this[j]&(1<<(n%this.DB)))!=0);\n    }\n\n    // (protected) this op (1<<n)\n    function bnpChangeBit(n,op) {\n      var r = BigInteger.ONE.shiftLeft(n);\n      this.bitwiseTo(r,op,r);\n      return r;\n    }\n\n    // (public) this | (1<<n)\n    function bnSetBit(n) { return this.changeBit(n,op_or); }\n\n    // (public) this & ~(1<<n)\n    function bnClearBit(n) { return this.changeBit(n,op_andnot); }\n\n    // (public) this ^ (1<<n)\n    function bnFlipBit(n) { return this.changeBit(n,op_xor); }\n\n    // (protected) r = this + a\n    function bnpAddTo(a,r) {\n      var i = 0, c = 0, m = Math.min(a.t,this.t);\n      while(i < m) {\n        c += this[i]+a[i];\n        r[i++] = c&this.DM;\n        c >>= this.DB;\n      }\n      if(a.t < this.t) {\n        c += a.s;\n        while(i < this.t) {\n          c += this[i];\n          r[i++] = c&this.DM;\n          c >>= this.DB;\n        }\n        c += this.s;\n      }\n      else {\n        c += this.s;\n        while(i < a.t) {\n          c += a[i];\n          r[i++] = c&this.DM;\n          c >>= this.DB;\n        }\n        c += a.s;\n      }\n      r.s = (c<0)?-1:0;\n      if(c > 0) r[i++] = c;\n      else if(c < -1) r[i++] = this.DV+c;\n      r.t = i;\n      r.clamp();\n    }\n\n    // (public) this + a\n    function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }\n\n    // (public) this - a\n    function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }\n\n    // (public) this * a\n    function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }\n\n    // (public) this^2\n    function bnSquare() { var r = nbi(); this.squareTo(r); return r; }\n\n    // (public) this / a\n    function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }\n\n    // (public) this % a\n    function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }\n\n    // (public) [this/a,this%a]\n    function bnDivideAndRemainder(a) {\n      var q = nbi(), r = nbi();\n      this.divRemTo(a,q,r);\n      return new Array(q,r);\n    }\n\n    // (protected) this *= n, this >= 0, 1 < n < DV\n    function bnpDMultiply(n) {\n      this[this.t] = this.am(0,n-1,this,0,0,this.t);\n      ++this.t;\n      this.clamp();\n    }\n\n    // (protected) this += n << w words, this >= 0\n    function bnpDAddOffset(n,w) {\n      if(n == 0) return;\n      while(this.t <= w) this[this.t++] = 0;\n      this[w] += n;\n      while(this[w] >= this.DV) {\n        this[w] -= this.DV;\n        if(++w >= this.t) this[this.t++] = 0;\n        ++this[w];\n      }\n    }\n\n    // A \"null\" reducer\n    function NullExp() {}\n    function nNop(x) { return x; }\n    function nMulTo(x,y,r) { x.multiplyTo(y,r); }\n    function nSqrTo(x,r) { x.squareTo(r); }\n\n    NullExp.prototype.convert = nNop;\n    NullExp.prototype.revert = nNop;\n    NullExp.prototype.mulTo = nMulTo;\n    NullExp.prototype.sqrTo = nSqrTo;\n\n    // (public) this^e\n    function bnPow(e) { return this.exp(e,new NullExp()); }\n\n    // (protected) r = lower n words of \"this * a\", a.t <= n\n    // \"this\" should be the larger one if appropriate.\n    function bnpMultiplyLowerTo(a,n,r) {\n      var i = Math.min(this.t+a.t,n);\n      r.s = 0; // assumes a,this >= 0\n      r.t = i;\n      while(i > 0) r[--i] = 0;\n      var j;\n      for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(0,a[i],r,i,0,this.t);\n      for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a[i],r,i,0,n-i);\n      r.clamp();\n    }\n\n    // (protected) r = \"this * a\" without lower n words, n > 0\n    // \"this\" should be the larger one if appropriate.\n    function bnpMultiplyUpperTo(a,n,r) {\n      --n;\n      var i = r.t = this.t+a.t-n;\n      r.s = 0; // assumes a,this >= 0\n      while(--i >= 0) r[i] = 0;\n      for(i = Math.max(n-this.t,0); i < a.t; ++i)\n        r[this.t+i-n] = this.am(n-i,a[i],r,0,0,this.t+i-n);\n      r.clamp();\n      r.drShiftTo(1,r);\n    }\n\n    // Barrett modular reduction\n    function Barrett(m) {\n      // setup Barrett\n      this.r2 = nbi();\n      this.q3 = nbi();\n      BigInteger.ONE.dlShiftTo(2*m.t,this.r2);\n      this.mu = this.r2.divide(m);\n      this.m = m;\n    }\n\n    function barrettConvert(x) {\n      if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);\n      else if(x.compareTo(this.m) < 0) return x;\n      else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }\n    }\n\n    function barrettRevert(x) { return x; }\n\n    // x = x mod m (HAC 14.42)\n    function barrettReduce(x) {\n      x.drShiftTo(this.m.t-1,this.r2);\n      if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }\n      this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);\n      this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);\n      while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);\n      x.subTo(this.r2,x);\n      while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);\n    }\n\n    // r = x^2 mod m; x != r\n    function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }\n\n    // r = x*y mod m; x,y != r\n    function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }\n\n    Barrett.prototype.convert = barrettConvert;\n    Barrett.prototype.revert = barrettRevert;\n    Barrett.prototype.reduce = barrettReduce;\n    Barrett.prototype.mulTo = barrettMulTo;\n    Barrett.prototype.sqrTo = barrettSqrTo;\n\n    // (public) this^e % m (HAC 14.85)\n    function bnModPow(e,m) {\n      var i = e.bitLength(), k, r = nbv(1), z;\n      if(i <= 0) return r;\n      else if(i < 18) k = 1;\n      else if(i < 48) k = 3;\n      else if(i < 144) k = 4;\n      else if(i < 768) k = 5;\n      else k = 6;\n      if(i < 8)\n        z = new Classic(m);\n      else if(m.isEven())\n        z = new Barrett(m);\n      else\n        z = new Montgomery(m);\n\n      // precomputation\n      var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;\n      g[1] = z.convert(this);\n      if(k > 1) {\n        var g2 = nbi();\n        z.sqrTo(g[1],g2);\n        while(n <= km) {\n          g[n] = nbi();\n          z.mulTo(g2,g[n-2],g[n]);\n          n += 2;\n        }\n      }\n\n      var j = e.t-1, w, is1 = true, r2 = nbi(), t;\n      i = nbits(e[j])-1;\n      while(j >= 0) {\n        if(i >= k1) w = (e[j]>>(i-k1))&km;\n        else {\n          w = (e[j]&((1<<(i+1))-1))<<(k1-i);\n          if(j > 0) w |= e[j-1]>>(this.DB+i-k1);\n        }\n\n        n = k;\n        while((w&1) == 0) { w >>= 1; --n; }\n        if((i -= n) < 0) { i += this.DB; --j; }\n        if(is1) {\t// ret == 1, don't bother squaring or multiplying it\n          g[w].copyTo(r);\n          is1 = false;\n        }\n        else {\n          while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }\n          if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }\n          z.mulTo(r2,g[w],r);\n        }\n\n        while(j >= 0 && (e[j]&(1<<i)) == 0) {\n          z.sqrTo(r,r2); t = r; r = r2; r2 = t;\n          if(--i < 0) { i = this.DB-1; --j; }\n        }\n      }\n      return z.revert(r);\n    }\n\n    // (public) gcd(this,a) (HAC 14.54)\n    function bnGCD(a) {\n      var x = (this.s<0)?this.negate():this.clone();\n      var y = (a.s<0)?a.negate():a.clone();\n      if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }\n      var i = x.getLowestSetBit(), g = y.getLowestSetBit();\n      if(g < 0) return x;\n      if(i < g) g = i;\n      if(g > 0) {\n        x.rShiftTo(g,x);\n        y.rShiftTo(g,y);\n      }\n      while(x.signum() > 0) {\n        if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);\n        if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);\n        if(x.compareTo(y) >= 0) {\n          x.subTo(y,x);\n          x.rShiftTo(1,x);\n        }\n        else {\n          y.subTo(x,y);\n          y.rShiftTo(1,y);\n        }\n      }\n      if(g > 0) y.lShiftTo(g,y);\n      return y;\n    }\n\n    // (protected) this % n, n < 2^26\n    function bnpModInt(n) {\n      if(n <= 0) return 0;\n      var d = this.DV%n, r = (this.s<0)?n-1:0;\n      if(this.t > 0)\n        if(d == 0) r = this[0]%n;\n        else for(var i = this.t-1; i >= 0; --i) r = (d*r+this[i])%n;\n      return r;\n    }\n\n    // (public) 1/this % m (HAC 14.61)\n    function bnModInverse(m) {\n      var ac = m.isEven();\n      if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;\n      var u = m.clone(), v = this.clone();\n      var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);\n      while(u.signum() != 0) {\n        while(u.isEven()) {\n          u.rShiftTo(1,u);\n          if(ac) {\n            if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }\n            a.rShiftTo(1,a);\n          }\n          else if(!b.isEven()) b.subTo(m,b);\n          b.rShiftTo(1,b);\n        }\n        while(v.isEven()) {\n          v.rShiftTo(1,v);\n          if(ac) {\n            if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }\n            c.rShiftTo(1,c);\n          }\n          else if(!d.isEven()) d.subTo(m,d);\n          d.rShiftTo(1,d);\n        }\n        if(u.compareTo(v) >= 0) {\n          u.subTo(v,u);\n          if(ac) a.subTo(c,a);\n          b.subTo(d,b);\n        }\n        else {\n          v.subTo(u,v);\n          if(ac) c.subTo(a,c);\n          d.subTo(b,d);\n        }\n      }\n      if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;\n      if(d.compareTo(m) >= 0) return d.subtract(m);\n      if(d.signum() < 0) d.addTo(m,d); else return d;\n      if(d.signum() < 0) return d.add(m); else return d;\n    }\n\n    var lowprimes = [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997];\n    var lplim = (1<<26)/lowprimes[lowprimes.length-1];\n\n    // (public) test primality with certainty >= 1-.5^t\n    function bnIsProbablePrime(t) {\n      var i, x = this.abs();\n      if(x.t == 1 && x[0] <= lowprimes[lowprimes.length-1]) {\n        for(i = 0; i < lowprimes.length; ++i)\n          if(x[0] == lowprimes[i]) return true;\n        return false;\n      }\n      if(x.isEven()) return false;\n      i = 1;\n      while(i < lowprimes.length) {\n        var m = lowprimes[i], j = i+1;\n        while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];\n        m = x.modInt(m);\n        while(i < j) if(m%lowprimes[i++] == 0) return false;\n      }\n      return x.millerRabin(t);\n    }\n\n    // (protected) true if probably prime (HAC 4.24, Miller-Rabin)\n    function bnpMillerRabin(t) {\n      var n1 = this.subtract(BigInteger.ONE);\n      var k = n1.getLowestSetBit();\n      if(k <= 0) return false;\n      var r = n1.shiftRight(k);\n      t = (t+1)>>1;\n      if(t > lowprimes.length) t = lowprimes.length;\n      var a = nbi();\n      for(var i = 0; i < t; ++i) {\n        //Pick bases at random, instead of starting at 2\n        a.fromInt(lowprimes[Math.floor(Math.random()*lowprimes.length)]);\n        var y = a.modPow(r,this);\n        if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {\n          var j = 1;\n          while(j++ < k && y.compareTo(n1) != 0) {\n            y = y.modPowInt(2,this);\n            if(y.compareTo(BigInteger.ONE) == 0) return false;\n          }\n          if(y.compareTo(n1) != 0) return false;\n        }\n      }\n      return true;\n    }\n\n    // protected\n    BigInteger.prototype.chunkSize = bnpChunkSize;\n    BigInteger.prototype.toRadix = bnpToRadix;\n    BigInteger.prototype.fromRadix = bnpFromRadix;\n    BigInteger.prototype.fromNumber = bnpFromNumber;\n    BigInteger.prototype.bitwiseTo = bnpBitwiseTo;\n    BigInteger.prototype.changeBit = bnpChangeBit;\n    BigInteger.prototype.addTo = bnpAddTo;\n    BigInteger.prototype.dMultiply = bnpDMultiply;\n    BigInteger.prototype.dAddOffset = bnpDAddOffset;\n    BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;\n    BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;\n    BigInteger.prototype.modInt = bnpModInt;\n    BigInteger.prototype.millerRabin = bnpMillerRabin;\n\n    // public\n    BigInteger.prototype.clone = bnClone;\n    BigInteger.prototype.intValue = bnIntValue;\n    BigInteger.prototype.byteValue = bnByteValue;\n    BigInteger.prototype.shortValue = bnShortValue;\n    BigInteger.prototype.signum = bnSigNum;\n    BigInteger.prototype.toByteArray = bnToByteArray;\n    BigInteger.prototype.equals = bnEquals;\n    BigInteger.prototype.min = bnMin;\n    BigInteger.prototype.max = bnMax;\n    BigInteger.prototype.and = bnAnd;\n    BigInteger.prototype.or = bnOr;\n    BigInteger.prototype.xor = bnXor;\n    BigInteger.prototype.andNot = bnAndNot;\n    BigInteger.prototype.not = bnNot;\n    BigInteger.prototype.shiftLeft = bnShiftLeft;\n    BigInteger.prototype.shiftRight = bnShiftRight;\n    BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;\n    BigInteger.prototype.bitCount = bnBitCount;\n    BigInteger.prototype.testBit = bnTestBit;\n    BigInteger.prototype.setBit = bnSetBit;\n    BigInteger.prototype.clearBit = bnClearBit;\n    BigInteger.prototype.flipBit = bnFlipBit;\n    BigInteger.prototype.add = bnAdd;\n    BigInteger.prototype.subtract = bnSubtract;\n    BigInteger.prototype.multiply = bnMultiply;\n    BigInteger.prototype.divide = bnDivide;\n    BigInteger.prototype.remainder = bnRemainder;\n    BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;\n    BigInteger.prototype.modPow = bnModPow;\n    BigInteger.prototype.modInverse = bnModInverse;\n    BigInteger.prototype.pow = bnPow;\n    BigInteger.prototype.gcd = bnGCD;\n    BigInteger.prototype.isProbablePrime = bnIsProbablePrime;\n\n    // JSBN-specific extension\n    BigInteger.prototype.square = bnSquare;\n\n    // Expose the Barrett function\n    BigInteger.prototype.Barrett = Barrett\n\n    // BigInteger interfaces not implemented in jsbn:\n\n    // BigInteger(int signum, byte[] magnitude)\n    // double doubleValue()\n    // float floatValue()\n    // int hashCode()\n    // long longValue()\n    // static BigInteger valueOf(long val)\n\n\t// Random number generator - requires a PRNG backend, e.g. prng4.js\n\n\t// For best results, put code like\n\t// <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>\n\t// in your main HTML document.\n\n\tvar rng_state;\n\tvar rng_pool;\n\tvar rng_pptr;\n\n\t// Mix in a 32-bit integer into the pool\n\tfunction rng_seed_int(x) {\n\t  rng_pool[rng_pptr++] ^= x & 255;\n\t  rng_pool[rng_pptr++] ^= (x >> 8) & 255;\n\t  rng_pool[rng_pptr++] ^= (x >> 16) & 255;\n\t  rng_pool[rng_pptr++] ^= (x >> 24) & 255;\n\t  if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;\n\t}\n\n\t// Mix in the current time (w/milliseconds) into the pool\n\tfunction rng_seed_time() {\n\t  rng_seed_int(new Date().getTime());\n\t}\n\n\t// Initialize the pool with junk if needed.\n\tif(rng_pool == null) {\n\t  rng_pool = new Array();\n\t  rng_pptr = 0;\n\t  var t;\n\t  if(typeof window !== \"undefined\" && window.crypto) {\n\t\tif (window.crypto.getRandomValues) {\n\t\t  // Use webcrypto if available\n\t\t  var ua = new Uint8Array(32);\n\t\t  window.crypto.getRandomValues(ua);\n\t\t  for(t = 0; t < 32; ++t)\n\t\t\trng_pool[rng_pptr++] = ua[t];\n\t\t}\n\t\telse if(navigator.appName == \"Netscape\" && navigator.appVersion < \"5\") {\n\t\t  // Extract entropy (256 bits) from NS4 RNG if available\n\t\t  var z = window.crypto.random(32);\n\t\t  for(t = 0; t < z.length; ++t)\n\t\t\trng_pool[rng_pptr++] = z.charCodeAt(t) & 255;\n\t\t}\n\t  }\n\t  while(rng_pptr < rng_psize) {  // extract some randomness from Math.random()\n\t\tt = Math.floor(65536 * Math.random());\n\t\trng_pool[rng_pptr++] = t >>> 8;\n\t\trng_pool[rng_pptr++] = t & 255;\n\t  }\n\t  rng_pptr = 0;\n\t  rng_seed_time();\n\t  //rng_seed_int(window.screenX);\n\t  //rng_seed_int(window.screenY);\n\t}\n\n\tfunction rng_get_byte() {\n\t  if(rng_state == null) {\n\t\trng_seed_time();\n\t\trng_state = prng_newstate();\n\t\trng_state.init(rng_pool);\n\t\tfor(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)\n\t\t  rng_pool[rng_pptr] = 0;\n\t\trng_pptr = 0;\n\t\t//rng_pool = null;\n\t  }\n\t  // TODO: allow reseeding after first request\n\t  return rng_state.next();\n\t}\n\n\tfunction rng_get_bytes(ba) {\n\t  var i;\n\t  for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();\n\t}\n\n\tfunction SecureRandom() {}\n\n\tSecureRandom.prototype.nextBytes = rng_get_bytes;\n\n\t// prng4.js - uses Arcfour as a PRNG\n\n\tfunction Arcfour() {\n\t  this.i = 0;\n\t  this.j = 0;\n\t  this.S = new Array();\n\t}\n\n\t// Initialize arcfour context from key, an array of ints, each from [0..255]\n\tfunction ARC4init(key) {\n\t  var i, j, t;\n\t  for(i = 0; i < 256; ++i)\n\t\tthis.S[i] = i;\n\t  j = 0;\n\t  for(i = 0; i < 256; ++i) {\n\t\tj = (j + this.S[i] + key[i % key.length]) & 255;\n\t\tt = this.S[i];\n\t\tthis.S[i] = this.S[j];\n\t\tthis.S[j] = t;\n\t  }\n\t  this.i = 0;\n\t  this.j = 0;\n\t}\n\n\tfunction ARC4next() {\n\t  var t;\n\t  this.i = (this.i + 1) & 255;\n\t  this.j = (this.j + this.S[this.i]) & 255;\n\t  t = this.S[this.i];\n\t  this.S[this.i] = this.S[this.j];\n\t  this.S[this.j] = t;\n\t  return this.S[(t + this.S[this.i]) & 255];\n\t}\n\n\tArcfour.prototype.init = ARC4init;\n\tArcfour.prototype.next = ARC4next;\n\n\t// Plug in your RNG constructor here\n\tfunction prng_newstate() {\n\t  return new Arcfour();\n\t}\n\n\t// Pool size must be a multiple of 4 and greater than 32.\n\t// An array of bytes the size of the pool will be passed to init()\n\tvar rng_psize = 256;\n\n  BigInteger.SecureRandom = SecureRandom;\n  BigInteger.BigInteger = BigInteger;\n  if (true) {\n    exports = module.exports = BigInteger;\n  } else {\n    this.BigInteger = BigInteger;\n    this.SecureRandom = SecureRandom;\n  }\n\n}).call(this);\n\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = minimatch\nminimatch.Minimatch = Minimatch\n\nvar path = { sep: '/' }\ntry {\n  path = __webpack_require__(0)\n} catch (er) {}\n\nvar GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}\nvar expand = __webpack_require__(226)\n\nvar plTypes = {\n  '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},\n  '?': { open: '(?:', close: ')?' },\n  '+': { open: '(?:', close: ')+' },\n  '*': { open: '(?:', close: ')*' },\n  '@': { open: '(?:', close: ')' }\n}\n\n// any single thing other than /\n// don't need to escape / when using new RegExp()\nvar qmark = '[^/]'\n\n// * => any number of characters\nvar star = qmark + '*?'\n\n// ** when dots are allowed.  Anything goes, except .. and .\n// not (^ or / followed by one or two dots followed by $ or /),\n// followed by anything, any number of times.\nvar twoStarDot = '(?:(?!(?:\\\\\\/|^)(?:\\\\.{1,2})($|\\\\\\/)).)*?'\n\n// not a ^ or / followed by a dot,\n// followed by anything, any number of times.\nvar twoStarNoDot = '(?:(?!(?:\\\\\\/|^)\\\\.).)*?'\n\n// characters that need to be escaped in RegExp.\nvar reSpecials = charSet('().*{}+?[]^$\\\\!')\n\n// \"abc\" -> { a:true, b:true, c:true }\nfunction charSet (s) {\n  return s.split('').reduce(function (set, c) {\n    set[c] = true\n    return set\n  }, {})\n}\n\n// normalizes slashes.\nvar slashSplit = /\\/+/\n\nminimatch.filter = filter\nfunction filter (pattern, options) {\n  options = options || {}\n  return function (p, i, list) {\n    return minimatch(p, pattern, options)\n  }\n}\n\nfunction ext (a, b) {\n  a = a || {}\n  b = b || {}\n  var t = {}\n  Object.keys(b).forEach(function (k) {\n    t[k] = b[k]\n  })\n  Object.keys(a).forEach(function (k) {\n    t[k] = a[k]\n  })\n  return t\n}\n\nminimatch.defaults = function (def) {\n  if (!def || !Object.keys(def).length) return minimatch\n\n  var orig = minimatch\n\n  var m = function minimatch (p, pattern, options) {\n    return orig.minimatch(p, pattern, ext(def, options))\n  }\n\n  m.Minimatch = function Minimatch (pattern, options) {\n    return new orig.Minimatch(pattern, ext(def, options))\n  }\n\n  return m\n}\n\nMinimatch.defaults = function (def) {\n  if (!def || !Object.keys(def).length) return Minimatch\n  return minimatch.defaults(def).Minimatch\n}\n\nfunction minimatch (p, pattern, options) {\n  if (typeof pattern !== 'string') {\n    throw new TypeError('glob pattern string required')\n  }\n\n  if (!options) options = {}\n\n  // shortcut: comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    return false\n  }\n\n  // \"\" only matches \"\"\n  if (pattern.trim() === '') return p === ''\n\n  return new Minimatch(pattern, options).match(p)\n}\n\nfunction Minimatch (pattern, options) {\n  if (!(this instanceof Minimatch)) {\n    return new Minimatch(pattern, options)\n  }\n\n  if (typeof pattern !== 'string') {\n    throw new TypeError('glob pattern string required')\n  }\n\n  if (!options) options = {}\n  pattern = pattern.trim()\n\n  // windows support: need to use /, not \\\n  if (path.sep !== '/') {\n    pattern = pattern.split(path.sep).join('/')\n  }\n\n  this.options = options\n  this.set = []\n  this.pattern = pattern\n  this.regexp = null\n  this.negate = false\n  this.comment = false\n  this.empty = false\n\n  // make the set of regexps etc.\n  this.make()\n}\n\nMinimatch.prototype.debug = function () {}\n\nMinimatch.prototype.make = make\nfunction make () {\n  // don't do it more than once.\n  if (this._made) return\n\n  var pattern = this.pattern\n  var options = this.options\n\n  // empty patterns and comments match nothing.\n  if (!options.nocomment && pattern.charAt(0) === '#') {\n    this.comment = true\n    return\n  }\n  if (!pattern) {\n    this.empty = true\n    return\n  }\n\n  // step 1: figure out negation, etc.\n  this.parseNegate()\n\n  // step 2: expand braces\n  var set = this.globSet = this.braceExpand()\n\n  if (options.debug) this.debug = console.error\n\n  this.debug(this.pattern, set)\n\n  // step 3: now we have a set, so turn each one into a series of path-portion\n  // matching patterns.\n  // These will be regexps, except in the case of \"**\", which is\n  // set to the GLOBSTAR object for globstar behavior,\n  // and will not contain any / characters\n  set = this.globParts = set.map(function (s) {\n    return s.split(slashSplit)\n  })\n\n  this.debug(this.pattern, set)\n\n  // glob --> regexps\n  set = set.map(function (s, si, set) {\n    return s.map(this.parse, this)\n  }, this)\n\n  this.debug(this.pattern, set)\n\n  // filter out everything that didn't compile properly.\n  set = set.filter(function (s) {\n    return s.indexOf(false) === -1\n  })\n\n  this.debug(this.pattern, set)\n\n  this.set = set\n}\n\nMinimatch.prototype.parseNegate = parseNegate\nfunction parseNegate () {\n  var pattern = this.pattern\n  var negate = false\n  var options = this.options\n  var negateOffset = 0\n\n  if (options.nonegate) return\n\n  for (var i = 0, l = pattern.length\n    ; i < l && pattern.charAt(i) === '!'\n    ; i++) {\n    negate = !negate\n    negateOffset++\n  }\n\n  if (negateOffset) this.pattern = pattern.substr(negateOffset)\n  this.negate = negate\n}\n\n// Brace expansion:\n// a{b,c}d -> abd acd\n// a{b,}c -> abc ac\n// a{0..3}d -> a0d a1d a2d a3d\n// a{b,c{d,e}f}g -> abg acdfg acefg\n// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg\n//\n// Invalid sets are not expanded.\n// a{2..}b -> a{2..}b\n// a{b}c -> a{b}c\nminimatch.braceExpand = function (pattern, options) {\n  return braceExpand(pattern, options)\n}\n\nMinimatch.prototype.braceExpand = braceExpand\n\nfunction braceExpand (pattern, options) {\n  if (!options) {\n    if (this instanceof Minimatch) {\n      options = this.options\n    } else {\n      options = {}\n    }\n  }\n\n  pattern = typeof pattern === 'undefined'\n    ? this.pattern : pattern\n\n  if (typeof pattern === 'undefined') {\n    throw new TypeError('undefined pattern')\n  }\n\n  if (options.nobrace ||\n    !pattern.match(/\\{.*\\}/)) {\n    // shortcut. no need to expand.\n    return [pattern]\n  }\n\n  return expand(pattern)\n}\n\n// parse a component of the expanded set.\n// At this point, no pattern may contain \"/\" in it\n// so we're going to return a 2d array, where each entry is the full\n// pattern, split on '/', and then turned into a regular expression.\n// A regexp is made at the end which joins each array with an\n// escaped /, and another full one which joins each regexp with |.\n//\n// Following the lead of Bash 4.1, note that \"**\" only has special meaning\n// when it is the *only* thing in a path portion.  Otherwise, any series\n// of * is equivalent to a single *.  Globstar behavior is enabled by\n// default, and can be disabled by setting options.noglobstar.\nMinimatch.prototype.parse = parse\nvar SUBPARSE = {}\nfunction parse (pattern, isSub) {\n  if (pattern.length > 1024 * 64) {\n    throw new TypeError('pattern is too long')\n  }\n\n  var options = this.options\n\n  // shortcuts\n  if (!options.noglobstar && pattern === '**') return GLOBSTAR\n  if (pattern === '') return ''\n\n  var re = ''\n  var hasMagic = !!options.nocase\n  var escaping = false\n  // ? => one single character\n  var patternListStack = []\n  var negativeLists = []\n  var stateChar\n  var inClass = false\n  var reClassStart = -1\n  var classStart = -1\n  // . and .. never match anything that doesn't start with .,\n  // even when options.dot is set.\n  var patternStart = pattern.charAt(0) === '.' ? '' // anything\n  // not (start or / followed by . or .. followed by / or end)\n  : options.dot ? '(?!(?:^|\\\\\\/)\\\\.{1,2}(?:$|\\\\\\/))'\n  : '(?!\\\\.)'\n  var self = this\n\n  function clearStateChar () {\n    if (stateChar) {\n      // we had some state-tracking character\n      // that wasn't consumed by this pass.\n      switch (stateChar) {\n        case '*':\n          re += star\n          hasMagic = true\n        break\n        case '?':\n          re += qmark\n          hasMagic = true\n        break\n        default:\n          re += '\\\\' + stateChar\n        break\n      }\n      self.debug('clearStateChar %j %j', stateChar, re)\n      stateChar = false\n    }\n  }\n\n  for (var i = 0, len = pattern.length, c\n    ; (i < len) && (c = pattern.charAt(i))\n    ; i++) {\n    this.debug('%s\\t%s %s %j', pattern, i, re, c)\n\n    // skip over any that are escaped.\n    if (escaping && reSpecials[c]) {\n      re += '\\\\' + c\n      escaping = false\n      continue\n    }\n\n    switch (c) {\n      case '/':\n        // completely not allowed, even escaped.\n        // Should already be path-split by now.\n        return false\n\n      case '\\\\':\n        clearStateChar()\n        escaping = true\n      continue\n\n      // the various stateChar values\n      // for the \"extglob\" stuff.\n      case '?':\n      case '*':\n      case '+':\n      case '@':\n      case '!':\n        this.debug('%s\\t%s %s %j <-- stateChar', pattern, i, re, c)\n\n        // all of those are literals inside a class, except that\n        // the glob [!a] means [^a] in regexp\n        if (inClass) {\n          this.debug('  in class')\n          if (c === '!' && i === classStart + 1) c = '^'\n          re += c\n          continue\n        }\n\n        // if we already have a stateChar, then it means\n        // that there was something like ** or +? in there.\n        // Handle the stateChar, then proceed with this one.\n        self.debug('call clearStateChar %j', stateChar)\n        clearStateChar()\n        stateChar = c\n        // if extglob is disabled, then +(asdf|foo) isn't a thing.\n        // just clear the statechar *now*, rather than even diving into\n        // the patternList stuff.\n        if (options.noext) clearStateChar()\n      continue\n\n      case '(':\n        if (inClass) {\n          re += '('\n          continue\n        }\n\n        if (!stateChar) {\n          re += '\\\\('\n          continue\n        }\n\n        patternListStack.push({\n          type: stateChar,\n          start: i - 1,\n          reStart: re.length,\n          open: plTypes[stateChar].open,\n          close: plTypes[stateChar].close\n        })\n        // negation is (?:(?!js)[^/]*)\n        re += stateChar === '!' ? '(?:(?!(?:' : '(?:'\n        this.debug('plType %j %j', stateChar, re)\n        stateChar = false\n      continue\n\n      case ')':\n        if (inClass || !patternListStack.length) {\n          re += '\\\\)'\n          continue\n        }\n\n        clearStateChar()\n        hasMagic = true\n        var pl = patternListStack.pop()\n        // negation is (?:(?!js)[^/]*)\n        // The others are (?:<pattern>)<type>\n        re += pl.close\n        if (pl.type === '!') {\n          negativeLists.push(pl)\n        }\n        pl.reEnd = re.length\n      continue\n\n      case '|':\n        if (inClass || !patternListStack.length || escaping) {\n          re += '\\\\|'\n          escaping = false\n          continue\n        }\n\n        clearStateChar()\n        re += '|'\n      continue\n\n      // these are mostly the same in regexp and glob\n      case '[':\n        // swallow any state-tracking char before the [\n        clearStateChar()\n\n        if (inClass) {\n          re += '\\\\' + c\n          continue\n        }\n\n        inClass = true\n        classStart = i\n        reClassStart = re.length\n        re += c\n      continue\n\n      case ']':\n        //  a right bracket shall lose its special\n        //  meaning and represent itself in\n        //  a bracket expression if it occurs\n        //  first in the list.  -- POSIX.2 2.8.3.2\n        if (i === classStart + 1 || !inClass) {\n          re += '\\\\' + c\n          escaping = false\n          continue\n        }\n\n        // handle the case where we left a class open.\n        // \"[z-a]\" is valid, equivalent to \"\\[z-a\\]\"\n        if (inClass) {\n          // split where the last [ was, make sure we don't have\n          // an invalid re. if so, re-walk the contents of the\n          // would-be class to re-translate any characters that\n          // were passed through as-is\n          // TODO: It would probably be faster to determine this\n          // without a try/catch and a new RegExp, but it's tricky\n          // to do safely.  For now, this is safe and works.\n          var cs = pattern.substring(classStart + 1, i)\n          try {\n            RegExp('[' + cs + ']')\n          } catch (er) {\n            // not a valid class!\n            var sp = this.parse(cs, SUBPARSE)\n            re = re.substr(0, reClassStart) + '\\\\[' + sp[0] + '\\\\]'\n            hasMagic = hasMagic || sp[1]\n            inClass = false\n            continue\n          }\n        }\n\n        // finish up the class.\n        hasMagic = true\n        inClass = false\n        re += c\n      continue\n\n      default:\n        // swallow any state char that wasn't consumed\n        clearStateChar()\n\n        if (escaping) {\n          // no need\n          escaping = false\n        } else if (reSpecials[c]\n          && !(c === '^' && inClass)) {\n          re += '\\\\'\n        }\n\n        re += c\n\n    } // switch\n  } // for\n\n  // handle the case where we left a class open.\n  // \"[abc\" is valid, equivalent to \"\\[abc\"\n  if (inClass) {\n    // split where the last [ was, and escape it\n    // this is a huge pita.  We now have to re-walk\n    // the contents of the would-be class to re-translate\n    // any characters that were passed through as-is\n    cs = pattern.substr(classStart + 1)\n    sp = this.parse(cs, SUBPARSE)\n    re = re.substr(0, reClassStart) + '\\\\[' + sp[0]\n    hasMagic = hasMagic || sp[1]\n  }\n\n  // handle the case where we had a +( thing at the *end*\n  // of the pattern.\n  // each pattern list stack adds 3 chars, and we need to go through\n  // and escape any | chars that were passed through as-is for the regexp.\n  // Go through and escape them, taking care not to double-escape any\n  // | chars that were already escaped.\n  for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {\n    var tail = re.slice(pl.reStart + pl.open.length)\n    this.debug('setting tail', re, pl)\n    // maybe some even number of \\, then maybe 1 \\, followed by a |\n    tail = tail.replace(/((?:\\\\{2}){0,64})(\\\\?)\\|/g, function (_, $1, $2) {\n      if (!$2) {\n        // the | isn't already escaped, so escape it.\n        $2 = '\\\\'\n      }\n\n      // need to escape all those slashes *again*, without escaping the\n      // one that we need for escaping the | character.  As it works out,\n      // escaping an even number of slashes can be done by simply repeating\n      // it exactly after itself.  That's why this trick works.\n      //\n      // I am sorry that you have to see this.\n      return $1 + $1 + $2 + '|'\n    })\n\n    this.debug('tail=%j\\n   %s', tail, tail, pl, re)\n    var t = pl.type === '*' ? star\n      : pl.type === '?' ? qmark\n      : '\\\\' + pl.type\n\n    hasMagic = true\n    re = re.slice(0, pl.reStart) + t + '\\\\(' + tail\n  }\n\n  // handle trailing things that only matter at the very end.\n  clearStateChar()\n  if (escaping) {\n    // trailing \\\\\n    re += '\\\\\\\\'\n  }\n\n  // only need to apply the nodot start if the re starts with\n  // something that could conceivably capture a dot\n  var addPatternStart = false\n  switch (re.charAt(0)) {\n    case '.':\n    case '[':\n    case '(': addPatternStart = true\n  }\n\n  // Hack to work around lack of negative lookbehind in JS\n  // A pattern like: *.!(x).!(y|z) needs to ensure that a name\n  // like 'a.xyz.yz' doesn't match.  So, the first negative\n  // lookahead, has to look ALL the way ahead, to the end of\n  // the pattern.\n  for (var n = negativeLists.length - 1; n > -1; n--) {\n    var nl = negativeLists[n]\n\n    var nlBefore = re.slice(0, nl.reStart)\n    var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)\n    var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)\n    var nlAfter = re.slice(nl.reEnd)\n\n    nlLast += nlAfter\n\n    // Handle nested stuff like *(*.js|!(*.json)), where open parens\n    // mean that we should *not* include the ) in the bit that is considered\n    // \"after\" the negated section.\n    var openParensBefore = nlBefore.split('(').length - 1\n    var cleanAfter = nlAfter\n    for (i = 0; i < openParensBefore; i++) {\n      cleanAfter = cleanAfter.replace(/\\)[+*?]?/, '')\n    }\n    nlAfter = cleanAfter\n\n    var dollar = ''\n    if (nlAfter === '' && isSub !== SUBPARSE) {\n      dollar = '$'\n    }\n    var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast\n    re = newRe\n  }\n\n  // if the re is not \"\" at this point, then we need to make sure\n  // it doesn't match against an empty path part.\n  // Otherwise a/* will match a/, which it should not.\n  if (re !== '' && hasMagic) {\n    re = '(?=.)' + re\n  }\n\n  if (addPatternStart) {\n    re = patternStart + re\n  }\n\n  // parsing just a piece of a larger pattern.\n  if (isSub === SUBPARSE) {\n    return [re, hasMagic]\n  }\n\n  // skip the regexp for non-magical patterns\n  // unescape anything in it, though, so that it'll be\n  // an exact match against a file etc.\n  if (!hasMagic) {\n    return globUnescape(pattern)\n  }\n\n  var flags = options.nocase ? 'i' : ''\n  try {\n    var regExp = new RegExp('^' + re + '$', flags)\n  } catch (er) {\n    // If it was an invalid regular expression, then it can't match\n    // anything.  This trick looks for a character after the end of\n    // the string, which is of course impossible, except in multi-line\n    // mode, but it's not a /m regex.\n    return new RegExp('$.')\n  }\n\n  regExp._glob = pattern\n  regExp._src = re\n\n  return regExp\n}\n\nminimatch.makeRe = function (pattern, options) {\n  return new Minimatch(pattern, options || {}).makeRe()\n}\n\nMinimatch.prototype.makeRe = makeRe\nfunction makeRe () {\n  if (this.regexp || this.regexp === false) return this.regexp\n\n  // at this point, this.set is a 2d array of partial\n  // pattern strings, or \"**\".\n  //\n  // It's better to use .match().  This function shouldn't\n  // be used, really, but it's pretty convenient sometimes,\n  // when you just want to work with a regex.\n  var set = this.set\n\n  if (!set.length) {\n    this.regexp = false\n    return this.regexp\n  }\n  var options = this.options\n\n  var twoStar = options.noglobstar ? star\n    : options.dot ? twoStarDot\n    : twoStarNoDot\n  var flags = options.nocase ? 'i' : ''\n\n  var re = set.map(function (pattern) {\n    return pattern.map(function (p) {\n      return (p === GLOBSTAR) ? twoStar\n      : (typeof p === 'string') ? regExpEscape(p)\n      : p._src\n    }).join('\\\\\\/')\n  }).join('|')\n\n  // must match entire pattern\n  // ending in a * or ** will make it less strict.\n  re = '^(?:' + re + ')$'\n\n  // can match anything, as long as it's not this.\n  if (this.negate) re = '^(?!' + re + ').*$'\n\n  try {\n    this.regexp = new RegExp(re, flags)\n  } catch (ex) {\n    this.regexp = false\n  }\n  return this.regexp\n}\n\nminimatch.match = function (list, pattern, options) {\n  options = options || {}\n  var mm = new Minimatch(pattern, options)\n  list = list.filter(function (f) {\n    return mm.match(f)\n  })\n  if (mm.options.nonull && !list.length) {\n    list.push(pattern)\n  }\n  return list\n}\n\nMinimatch.prototype.match = match\nfunction match (f, partial) {\n  this.debug('match', f, this.pattern)\n  // short-circuit in the case of busted things.\n  // comments, etc.\n  if (this.comment) return false\n  if (this.empty) return f === ''\n\n  if (f === '/' && partial) return true\n\n  var options = this.options\n\n  // windows: need to use /, not \\\n  if (path.sep !== '/') {\n    f = f.split(path.sep).join('/')\n  }\n\n  // treat the test path as a set of pathparts.\n  f = f.split(slashSplit)\n  this.debug(this.pattern, 'split', f)\n\n  // just ONE of the pattern sets in this.set needs to match\n  // in order for it to be valid.  If negating, then just one\n  // match means that we have failed.\n  // Either way, return on the first hit.\n\n  var set = this.set\n  this.debug(this.pattern, 'set', set)\n\n  // Find the basename of the path by looking for the last non-empty segment\n  var filename\n  var i\n  for (i = f.length - 1; i >= 0; i--) {\n    filename = f[i]\n    if (filename) break\n  }\n\n  for (i = 0; i < set.length; i++) {\n    var pattern = set[i]\n    var file = f\n    if (options.matchBase && pattern.length === 1) {\n      file = [filename]\n    }\n    var hit = this.matchOne(file, pattern, partial)\n    if (hit) {\n      if (options.flipNegate) return true\n      return !this.negate\n    }\n  }\n\n  // didn't get any hits.  this is success if it's a negative\n  // pattern, failure otherwise.\n  if (options.flipNegate) return false\n  return this.negate\n}\n\n// set partial to true to test if, for example,\n// \"/a/b\" matches the start of \"/*/b/*/d\"\n// Partial means, if you run out of file before you run\n// out of pattern, then that's fine, as long as all\n// the parts match.\nMinimatch.prototype.matchOne = function (file, pattern, partial) {\n  var options = this.options\n\n  this.debug('matchOne',\n    { 'this': this, file: file, pattern: pattern })\n\n  this.debug('matchOne', file.length, pattern.length)\n\n  for (var fi = 0,\n      pi = 0,\n      fl = file.length,\n      pl = pattern.length\n      ; (fi < fl) && (pi < pl)\n      ; fi++, pi++) {\n    this.debug('matchOne loop')\n    var p = pattern[pi]\n    var f = file[fi]\n\n    this.debug(pattern, p, f)\n\n    // should be impossible.\n    // some invalid regexp stuff in the set.\n    if (p === false) return false\n\n    if (p === GLOBSTAR) {\n      this.debug('GLOBSTAR', [pattern, p, f])\n\n      // \"**\"\n      // a/**/b/**/c would match the following:\n      // a/b/x/y/z/c\n      // a/x/y/z/b/c\n      // a/b/x/b/x/c\n      // a/b/c\n      // To do this, take the rest of the pattern after\n      // the **, and see if it would match the file remainder.\n      // If so, return success.\n      // If not, the ** \"swallows\" a segment, and try again.\n      // This is recursively awful.\n      //\n      // a/**/b/**/c matching a/b/x/y/z/c\n      // - a matches a\n      // - doublestar\n      //   - matchOne(b/x/y/z/c, b/**/c)\n      //     - b matches b\n      //     - doublestar\n      //       - matchOne(x/y/z/c, c) -> no\n      //       - matchOne(y/z/c, c) -> no\n      //       - matchOne(z/c, c) -> no\n      //       - matchOne(c, c) yes, hit\n      var fr = fi\n      var pr = pi + 1\n      if (pr === pl) {\n        this.debug('** at the end')\n        // a ** at the end will just swallow the rest.\n        // We have found a match.\n        // however, it will not swallow /.x, unless\n        // options.dot is set.\n        // . and .. are *never* matched by **, for explosively\n        // exponential reasons.\n        for (; fi < fl; fi++) {\n          if (file[fi] === '.' || file[fi] === '..' ||\n            (!options.dot && file[fi].charAt(0) === '.')) return false\n        }\n        return true\n      }\n\n      // ok, let's see if we can swallow whatever we can.\n      while (fr < fl) {\n        var swallowee = file[fr]\n\n        this.debug('\\nglobstar while', file, fr, pattern, pr, swallowee)\n\n        // XXX remove this slice.  Just pass the start index.\n        if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {\n          this.debug('globstar found match!', fr, fl, swallowee)\n          // found a match.\n          return true\n        } else {\n          // can't swallow \".\" or \"..\" ever.\n          // can only swallow \".foo\" when explicitly asked.\n          if (swallowee === '.' || swallowee === '..' ||\n            (!options.dot && swallowee.charAt(0) === '.')) {\n            this.debug('dot detected!', file, fr, pattern, pr)\n            break\n          }\n\n          // ** swallows a segment, and continue.\n          this.debug('globstar swallow a segment, and continue')\n          fr++\n        }\n      }\n\n      // no match was found.\n      // However, in partial mode, we can't say this is necessarily over.\n      // If there's more *pattern* left, then\n      if (partial) {\n        // ran out of file\n        this.debug('\\n>>> no match, partial?', file, fr, pattern, pr)\n        if (fr === fl) return true\n      }\n      return false\n    }\n\n    // something other than **\n    // non-magic patterns just have to match exactly\n    // patterns with magic have been turned into regexps.\n    var hit\n    if (typeof p === 'string') {\n      if (options.nocase) {\n        hit = f.toLowerCase() === p.toLowerCase()\n      } else {\n        hit = f === p\n      }\n      this.debug('string match', p, f, hit)\n    } else {\n      hit = f.match(p)\n      this.debug('pattern match', p, f, hit)\n    }\n\n    if (!hit) return false\n  }\n\n  // Note: ending in / means that we'll get a final \"\"\n  // at the end of the pattern.  This can only match a\n  // corresponding \"\" at the end of the file.\n  // If the file ends in /, then it can only match a\n  // a pattern that ends in /, unless the pattern just\n  // doesn't have any more for it. But, a/b/ should *not*\n  // match \"a/b/*\", even though \"\" matches against the\n  // [^/]*? pattern, except in partial mode, where it might\n  // simply not be reached yet.\n  // However, a/b/ should still satisfy a/*\n\n  // now either we fell off the end of the pattern, or we're done.\n  if (fi === fl && pi === pl) {\n    // ran out of pattern and filename at the same time.\n    // an exact hit!\n    return true\n  } else if (fi === fl) {\n    // ran out of file, but still had pattern left.\n    // this is ok if we're doing the match as part of\n    // a glob fs traversal.\n    return partial\n  } else if (pi === pl) {\n    // ran out of pattern, still have file left.\n    // this is only acceptable if we're on the very last\n    // empty segment of a file with a trailing slash.\n    // a/* should match a/b/\n    var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')\n    return emptyFileEnd\n  }\n\n  // should be unreachable.\n  throw new Error('wtf?')\n}\n\n// replace stuff like \\* with *\nfunction globUnescape (s) {\n  return s.replace(/\\\\(.)/g, '$1')\n}\n\nfunction regExpEscape (s) {\n  return s.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar wrappy = __webpack_require__(162)\nmodule.exports = wrappy(once)\nmodule.exports.strict = wrappy(onceStrict)\n\nonce.proto = once(function () {\n  Object.defineProperty(Function.prototype, 'once', {\n    value: function () {\n      return once(this)\n    },\n    configurable: true\n  })\n\n  Object.defineProperty(Function.prototype, 'onceStrict', {\n    value: function () {\n      return onceStrict(this)\n    },\n    configurable: true\n  })\n})\n\nfunction once (fn) {\n  var f = function () {\n    if (f.called) return f.value\n    f.called = true\n    return f.value = fn.apply(this, arguments)\n  }\n  f.called = false\n  return f\n}\n\nfunction onceStrict (fn) {\n  var f = function () {\n    if (f.called)\n      throw new Error(f.onceError)\n    f.called = true\n    return f.value = fn.apply(this, arguments)\n  }\n  var name = fn.name || 'Function wrapped with `once`'\n  f.onceError = name + \" shouldn't be called more than once\"\n  f.called = false\n  return f\n}\n\n\n/***/ }),\n/* 84 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return InnerSubscriber; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nvar InnerSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](InnerSubscriber, _super);\n    function InnerSubscriber(parent, outerValue, outerIndex) {\n        var _this = _super.call(this) || this;\n        _this.parent = parent;\n        _this.outerValue = outerValue;\n        _this.outerIndex = outerIndex;\n        _this.index = 0;\n        return _this;\n    }\n    InnerSubscriber.prototype._next = function (value) {\n        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);\n    };\n    InnerSubscriber.prototype._error = function (error) {\n        this.parent.notifyError(error, this);\n        this.unsubscribe();\n    };\n    InnerSubscriber.prototype._complete = function () {\n        this.parent.notifyComplete(this);\n        this.unsubscribe();\n    };\n    return InnerSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n\n//# sourceMappingURL=InnerSubscriber.js.map\n\n\n/***/ }),\n/* 85 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = fromArray;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscription__ = __webpack_require__(25);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_subscribeToArray__ = __webpack_require__(447);\n/** PURE_IMPORTS_START _Observable,_Subscription,_util_subscribeToArray PURE_IMPORTS_END */\n\n\n\nfunction fromArray(input, scheduler) {\n    if (!scheduler) {\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_subscribeToArray__[\"a\" /* subscribeToArray */])(input));\n    }\n    else {\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n            var sub = new __WEBPACK_IMPORTED_MODULE_1__Subscription__[\"a\" /* Subscription */]();\n            var i = 0;\n            sub.add(scheduler.schedule(function () {\n                if (i === input.length) {\n                    subscriber.complete();\n                    return;\n                }\n                subscriber.next(input[i++]);\n                if (!subscriber.closed) {\n                    sub.add(this.schedule());\n                }\n            }));\n            return sub;\n        });\n    }\n}\n//# sourceMappingURL=fromArray.js.map\n\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nmodule.exports = {\n\tread: read,\n\twrite: write\n};\n\nvar assert = __webpack_require__(16);\nvar asn1 = __webpack_require__(66);\nvar crypto = __webpack_require__(11);\nvar Buffer = __webpack_require__(15).Buffer;\nvar algs = __webpack_require__(32);\nvar utils = __webpack_require__(26);\nvar Key = __webpack_require__(28);\nvar PrivateKey = __webpack_require__(33);\n\nvar pkcs1 = __webpack_require__(328);\nvar pkcs8 = __webpack_require__(158);\nvar sshpriv = __webpack_require__(193);\nvar rfc4253 = __webpack_require__(103);\n\nvar errors = __webpack_require__(74);\n\n/*\n * For reading we support both PKCS#1 and PKCS#8. If we find a private key,\n * we just take the public component of it and use that.\n */\nfunction read(buf, options, forceType) {\n\tvar input = buf;\n\tif (typeof (buf) !== 'string') {\n\t\tassert.buffer(buf, 'buf');\n\t\tbuf = buf.toString('ascii');\n\t}\n\n\tvar lines = buf.trim().split('\\n');\n\n\tvar m = lines[0].match(/*JSSTYLED*/\n\t    /[-]+[ ]*BEGIN ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/);\n\tassert.ok(m, 'invalid PEM header');\n\n\tvar m2 = lines[lines.length - 1].match(/*JSSTYLED*/\n\t    /[-]+[ ]*END ([A-Z0-9][A-Za-z0-9]+ )?(PUBLIC|PRIVATE) KEY[ ]*[-]+/);\n\tassert.ok(m2, 'invalid PEM footer');\n\n\t/* Begin and end banners must match key type */\n\tassert.equal(m[2], m2[2]);\n\tvar type = m[2].toLowerCase();\n\n\tvar alg;\n\tif (m[1]) {\n\t\t/* They also must match algorithms, if given */\n\t\tassert.equal(m[1], m2[1], 'PEM header and footer mismatch');\n\t\talg = m[1].trim();\n\t}\n\n\tvar headers = {};\n\twhile (true) {\n\t\tlines = lines.slice(1);\n\t\tm = lines[0].match(/*JSSTYLED*/\n\t\t    /^([A-Za-z0-9-]+): (.+)$/);\n\t\tif (!m)\n\t\t\tbreak;\n\t\theaders[m[1].toLowerCase()] = m[2];\n\t}\n\n\tvar cipher, key, iv;\n\tif (headers['proc-type']) {\n\t\tvar parts = headers['proc-type'].split(',');\n\t\tif (parts[0] === '4' && parts[1] === 'ENCRYPTED') {\n\t\t\tif (typeof (options.passphrase) === 'string') {\n\t\t\t\toptions.passphrase = Buffer.from(\n\t\t\t\t    options.passphrase, 'utf-8');\n\t\t\t}\n\t\t\tif (!Buffer.isBuffer(options.passphrase)) {\n\t\t\t\tthrow (new errors.KeyEncryptedError(\n\t\t\t\t    options.filename, 'PEM'));\n\t\t\t} else {\n\t\t\t\tparts = headers['dek-info'].split(',');\n\t\t\t\tassert.ok(parts.length === 2);\n\t\t\t\tcipher = parts[0].toLowerCase();\n\t\t\t\tiv = Buffer.from(parts[1], 'hex');\n\t\t\t\tkey = utils.opensslKeyDeriv(cipher, iv,\n\t\t\t\t    options.passphrase, 1).key;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* Chop off the first and last lines */\n\tlines = lines.slice(0, -1).join('');\n\tbuf = Buffer.from(lines, 'base64');\n\n\tif (cipher && key && iv) {\n\t\tvar cipherStream = crypto.createDecipheriv(cipher, key, iv);\n\t\tvar chunk, chunks = [];\n\t\tcipherStream.once('error', function (e) {\n\t\t\tif (e.toString().indexOf('bad decrypt') !== -1) {\n\t\t\t\tthrow (new Error('Incorrect passphrase ' +\n\t\t\t\t    'supplied, could not decrypt key'));\n\t\t\t}\n\t\t\tthrow (e);\n\t\t});\n\t\tcipherStream.write(buf);\n\t\tcipherStream.end();\n\t\twhile ((chunk = cipherStream.read()) !== null)\n\t\t\tchunks.push(chunk);\n\t\tbuf = Buffer.concat(chunks);\n\t}\n\n\t/* The new OpenSSH internal format abuses PEM headers */\n\tif (alg && alg.toLowerCase() === 'openssh')\n\t\treturn (sshpriv.readSSHPrivate(type, buf, options));\n\tif (alg && alg.toLowerCase() === 'ssh2')\n\t\treturn (rfc4253.readType(type, buf, options));\n\n\tvar der = new asn1.BerReader(buf);\n\tder.originalInput = input;\n\n\t/*\n\t * All of the PEM file types start with a sequence tag, so chop it\n\t * off here\n\t */\n\tder.readSequence();\n\n\t/* PKCS#1 type keys name an algorithm in the banner explicitly */\n\tif (alg) {\n\t\tif (forceType)\n\t\t\tassert.strictEqual(forceType, 'pkcs1');\n\t\treturn (pkcs1.readPkcs1(alg, type, der));\n\t} else {\n\t\tif (forceType)\n\t\t\tassert.strictEqual(forceType, 'pkcs8');\n\t\treturn (pkcs8.readPkcs8(alg, type, der));\n\t}\n}\n\nfunction write(key, options, type) {\n\tassert.object(key);\n\n\tvar alg = {\n\t    'ecdsa': 'EC',\n\t    'rsa': 'RSA',\n\t    'dsa': 'DSA',\n\t    'ed25519': 'EdDSA'\n\t}[key.type];\n\tvar header;\n\n\tvar der = new asn1.BerWriter();\n\n\tif (PrivateKey.isPrivateKey(key)) {\n\t\tif (type && type === 'pkcs8') {\n\t\t\theader = 'PRIVATE KEY';\n\t\t\tpkcs8.writePkcs8(der, key);\n\t\t} else {\n\t\t\tif (type)\n\t\t\t\tassert.strictEqual(type, 'pkcs1');\n\t\t\theader = alg + ' PRIVATE KEY';\n\t\t\tpkcs1.writePkcs1(der, key);\n\t\t}\n\n\t} else if (Key.isKey(key)) {\n\t\tif (type && type === 'pkcs1') {\n\t\t\theader = alg + ' PUBLIC KEY';\n\t\t\tpkcs1.writePkcs1(der, key);\n\t\t} else {\n\t\t\tif (type)\n\t\t\t\tassert.strictEqual(type, 'pkcs8');\n\t\t\theader = 'PUBLIC KEY';\n\t\t\tpkcs8.writePkcs8(der, key);\n\t\t}\n\n\t} else {\n\t\tthrow (new Error('key is not a Key or PrivateKey'));\n\t}\n\n\tvar tmp = der.buffer.toString('base64');\n\tvar len = tmp.length + (tmp.length / 64) +\n\t    18 + 16 + header.length*2 + 10;\n\tvar buf = Buffer.alloc(len);\n\tvar o = 0;\n\to += buf.write('-----BEGIN ' + header + '-----\\n', o);\n\tfor (var i = 0; i < tmp.length; ) {\n\t\tvar limit = i + 64;\n\t\tif (limit > tmp.length)\n\t\t\tlimit = tmp.length;\n\t\to += buf.write(tmp.slice(i, limit), o);\n\t\tbuf[o++] = 10;\n\t\ti = limit;\n\t}\n\to += buf.write('-----END ' + header + '-----\\n', o);\n\n\treturn (buf.slice(0, o));\n}\n\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"http\");\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SCOPE_SEPARATOR = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _npmResolver;\n\nfunction _load_npmResolver() {\n  return _npmResolver = _interopRequireDefault(__webpack_require__(215));\n}\n\nvar _envReplace;\n\nfunction _load_envReplace() {\n  return _envReplace = _interopRequireDefault(__webpack_require__(545));\n}\n\nvar _baseRegistry;\n\nfunction _load_baseRegistry() {\n  return _baseRegistry = _interopRequireDefault(__webpack_require__(526));\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nvar _path;\n\nfunction _load_path() {\n  return _path = __webpack_require__(371);\n}\n\nvar _normalizeUrl;\n\nfunction _load_normalizeUrl() {\n  return _normalizeUrl = _interopRequireDefault(__webpack_require__(402));\n}\n\nvar _userHomeDir;\n\nfunction _load_userHomeDir() {\n  return _userHomeDir = _interopRequireDefault(__webpack_require__(67));\n}\n\nvar _userHomeDir2;\n\nfunction _load_userHomeDir2() {\n  return _userHomeDir2 = __webpack_require__(67);\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _login;\n\nfunction _load_login() {\n  return _login = __webpack_require__(107);\n}\n\nvar _path2;\n\nfunction _load_path2() {\n  return _path2 = _interopRequireDefault(__webpack_require__(0));\n}\n\nvar _url;\n\nfunction _load_url() {\n  return _url = _interopRequireDefault(__webpack_require__(24));\n}\n\nvar _ini;\n\nfunction _load_ini() {\n  return _ini = _interopRequireDefault(__webpack_require__(684));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst DEFAULT_REGISTRY = 'https://registry.npmjs.org/';\nconst REGEX_REGISTRY_ENFORCED_HTTPS = /^https?:\\/\\/([^\\/]+\\.)?(yarnpkg\\.com|npmjs\\.(org|com))(\\/|$)/;\nconst REGEX_REGISTRY_HTTP_PROTOCOL = /^https?:/i;\nconst REGEX_REGISTRY_PREFIX = /^(https?:)?\\/\\//i;\nconst REGEX_REGISTRY_SUFFIX = /registry\\/?$/;\n\nconst SCOPE_SEPARATOR = exports.SCOPE_SEPARATOR = '%2f';\n// All scoped package names are of the format `@scope%2fpkg` from the use of NpmRegistry.escapeName\n// `(?:^|\\/)` Match either the start of the string or a `/` but don't capture\n// `[^\\/?]+?` Match any character that is not '/' or '?' and capture, up until the first occurrence of:\n// `(?=%2f|\\/)` Match SCOPE_SEPARATOR, the escaped '/', or a raw `/` and don't capture\n// The reason for matching a plain `/` is NPM registry being inconsistent about escaping `/` in\n// scoped package names: when you're fetching a tarball, it is not escaped, when you want info\n// about the package, it is escaped.\nconst SCOPED_PKG_REGEXP = /(?:^|\\/)(@[^\\/?]+?)(?=%2f|\\/)/;\n\n// TODO: Use the method from src/cli/commands/global.js for this instead\nfunction getGlobalPrefix() {\n  if (process.env.PREFIX) {\n    return process.env.PREFIX;\n  } else if (process.platform === 'win32') {\n    // c:\\node\\node.exe --> prefix=c:\\node\\\n    return (_path2 || _load_path2()).default.dirname(process.execPath);\n  } else {\n    // /usr/local/bin/node --> prefix=/usr/local\n    let prefix = (_path2 || _load_path2()).default.dirname((_path2 || _load_path2()).default.dirname(process.execPath));\n\n    // destdir only is respected on Unix\n    if (process.env.DESTDIR) {\n      prefix = (_path2 || _load_path2()).default.join(process.env.DESTDIR, prefix);\n    }\n\n    return prefix;\n  }\n}\n\nconst PATH_CONFIG_OPTIONS = new Set(['cache', 'cafile', 'prefix', 'userconfig']);\n\nfunction isPathConfigOption(key) {\n  return PATH_CONFIG_OPTIONS.has(key);\n}\n\nfunction normalizePath(val) {\n  if (val === undefined) {\n    return undefined;\n  }\n\n  if (typeof val !== 'string') {\n    val = String(val);\n  }\n\n  return (0, (_path || _load_path()).resolveWithHome)(val);\n}\n\nfunction urlParts(requestUrl) {\n  const normalizedUrl = (0, (_normalizeUrl || _load_normalizeUrl()).default)(requestUrl);\n  const parsed = (_url || _load_url()).default.parse(normalizedUrl);\n  const host = parsed.host || '';\n  const path = parsed.path || '';\n  return { host, path };\n}\n\nclass NpmRegistry extends (_baseRegistry || _load_baseRegistry()).default {\n  constructor(cwd, registries, requestManager, reporter, enableDefaultRc, extraneousRcFiles) {\n    super(cwd, registries, requestManager, reporter, enableDefaultRc, extraneousRcFiles);\n    this.folder = 'node_modules';\n  }\n\n  static escapeName(name) {\n    // scoped packages contain slashes and the npm registry expects them to be escaped\n    return name.replace('/', SCOPE_SEPARATOR);\n  }\n\n  isScopedPackage(packageIdent) {\n    return SCOPED_PKG_REGEXP.test(packageIdent);\n  }\n\n  getRequestUrl(registry, pathname) {\n    let resolved = pathname;\n\n    if (!REGEX_REGISTRY_PREFIX.test(pathname)) {\n      resolved = (_url || _load_url()).default.resolve((0, (_misc || _load_misc()).addSuffix)(registry, '/'), `./${pathname}`);\n    }\n\n    if (REGEX_REGISTRY_ENFORCED_HTTPS.test(resolved)) {\n      resolved = resolved.replace(/^http:\\/\\//, 'https://');\n    }\n\n    return resolved;\n  }\n\n  isRequestToRegistry(requestUrl, registryUrl) {\n    const request = urlParts(requestUrl);\n    const registry = urlParts(registryUrl);\n    const customHostSuffix = this.getRegistryOrGlobalOption(registryUrl, 'custom-host-suffix');\n\n    const requestToRegistryHost = request.host === registry.host;\n    const requestToYarn = (_constants || _load_constants()).YARN_REGISTRY.includes(request.host) && DEFAULT_REGISTRY.includes(registry.host);\n    const requestToRegistryPath = request.path.startsWith(registry.path);\n    // For some registries, the package path does not prefix with the registry path\n    const customHostSuffixInUse = typeof customHostSuffix === 'string' && request.host.endsWith(customHostSuffix);\n\n    return (requestToRegistryHost || requestToYarn) && (requestToRegistryPath || customHostSuffixInUse);\n  }\n\n  request(pathname, opts = {}, packageName) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      // packageName needs to be escaped when if it is passed\n      const packageIdent = packageName && NpmRegistry.escapeName(packageName) || pathname;\n      const registry = opts.registry || _this.getRegistry(packageIdent);\n      const requestUrl = _this.getRequestUrl(registry, pathname);\n\n      const alwaysAuth = _this.getRegistryOrGlobalOption(registry, 'always-auth');\n\n      const headers = (0, (_extends2 || _load_extends()).default)({\n        Accept:\n        // This is to use less bandwidth unless we really need to get the full response.\n        // See https://github.com/npm/npm-registry-client#requests\n        opts.unfiltered ? 'application/json' : 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*'\n      }, opts.headers);\n\n      const isToRegistry = _this.isRequestToRegistry(requestUrl, registry) || _this.requestNeedsAuth(requestUrl);\n\n      // this.token must be checked to account for publish requests on non-scoped packages\n      if (_this.token || isToRegistry && (alwaysAuth || _this.isScopedPackage(packageIdent))) {\n        const authorization = _this.getAuth(packageIdent);\n        if (authorization) {\n          headers.authorization = authorization;\n        }\n      }\n\n      if (_this.otp) {\n        headers['npm-otp'] = _this.otp;\n      }\n\n      try {\n        return yield _this.requestManager.request({\n          url: requestUrl,\n          method: opts.method,\n          body: opts.body,\n          auth: opts.auth,\n          headers,\n          json: !opts.buffer,\n          buffer: opts.buffer,\n          process: opts.process,\n          gzip: true\n        });\n      } catch (error) {\n        if (error instanceof (_errors || _load_errors()).OneTimePasswordError) {\n          if (_this.otp) {\n            throw new (_errors || _load_errors()).MessageError(_this.reporter.lang('incorrectOneTimePassword'));\n          }\n\n          _this.reporter.info(_this.reporter.lang('twoFactorAuthenticationEnabled'));\n          if (error.notice) {\n            _this.reporter.info(error.notice);\n          }\n\n          _this.otp = yield (0, (_login || _load_login()).getOneTimePassword)(_this.reporter);\n\n          _this.requestManager.clearCache();\n\n          return _this.request(pathname, opts, packageName);\n        } else {\n          throw error;\n        }\n      }\n    })();\n  }\n\n  requestNeedsAuth(requestUrl) {\n    const config = this.config;\n    const requestParts = urlParts(requestUrl);\n    return !!Object.keys(config).find(option => {\n      const parts = option.split(':');\n      if (parts.length === 2 && parts[1] === '_authToken' || parts[1] === '_password') {\n        const registryParts = urlParts(parts[0]);\n        if (requestParts.host === registryParts.host && requestParts.path.startsWith(registryParts.path)) {\n          return true;\n        }\n      }\n      return false;\n    });\n  }\n\n  checkOutdated(config, name, range) {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const escapedName = NpmRegistry.escapeName(name);\n      const req = yield _this2.request(escapedName, { unfiltered: true });\n      if (!req) {\n        throw new Error(`couldn't find ${name}`);\n      }\n\n      // By default use top level 'repository' and 'homepage' values\n      let repository = req.repository,\n          homepage = req.homepage;\n\n      const wantedPkg = yield (_npmResolver || _load_npmResolver()).default.findVersionInRegistryResponse(config, escapedName, range, req);\n\n      // But some local repositories like Verdaccio do not return 'repository' nor 'homepage'\n      // in top level data structure, so we fallback to wanted package manifest\n      if (!repository && !homepage) {\n        repository = wantedPkg.repository;\n        homepage = wantedPkg.homepage;\n      }\n\n      let latest = req['dist-tags'].latest;\n      // In certain cases, registries do not return a 'latest' tag.\n      if (!latest) {\n        latest = wantedPkg.version;\n      }\n\n      const url = homepage || repository && repository.url || '';\n\n      return {\n        latest,\n        wanted: wantedPkg.version,\n        url\n      };\n    })();\n  }\n\n  getPossibleConfigLocations(filename, reporter) {\n    var _this3 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      let possibles = [];\n\n      for (var _iterator = _this3.extraneousRcFiles.slice().reverse(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref = _i.value;\n        }\n\n        const rcFile = _ref;\n\n        possibles.push([false, (_path2 || _load_path2()).default.resolve(process.cwd(), rcFile)]);\n      }\n\n      if (_this3.enableDefaultRc) {\n        // npmrc --> ./.npmrc, ~/.npmrc, ${prefix}/etc/npmrc\n        const localfile = '.' + filename;\n        possibles = possibles.concat([[false, (_path2 || _load_path2()).default.join(_this3.cwd, localfile)], [true, _this3.config.userconfig || (_path2 || _load_path2()).default.join((_userHomeDir || _load_userHomeDir()).default, localfile)], [false, (_path2 || _load_path2()).default.join(getGlobalPrefix(), 'etc', filename)]]);\n\n        // When home directory for global install is different from where $HOME/npmrc is stored,\n        // E.g. /usr/local/share vs /root on linux machines, check the additional location\n        if ((_userHomeDir2 || _load_userHomeDir2()).home !== (_userHomeDir || _load_userHomeDir()).default) {\n          possibles.push([true, (_path2 || _load_path2()).default.join((_userHomeDir2 || _load_userHomeDir2()).home, localfile)]);\n        }\n\n        // npmrc --> ../.npmrc, ../../.npmrc, etc.\n        const foldersFromRootToCwd = (0, (_path || _load_path()).getPosixPath)(_this3.cwd).split('/');\n        while (foldersFromRootToCwd.length > 1) {\n          possibles.push([false, (_path2 || _load_path2()).default.join(foldersFromRootToCwd.join((_path2 || _load_path2()).default.sep), localfile)]);\n          foldersFromRootToCwd.pop();\n        }\n      }\n\n      const actuals = [];\n      for (var _iterator2 = possibles, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref3;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref3 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref3 = _i2.value;\n        }\n\n        const _ref2 = _ref3;\n        const isHome = _ref2[0];\n        const loc = _ref2[1];\n\n        reporter.verbose(reporter.lang('configPossibleFile', loc));\n        if (yield (_fs || _load_fs()).exists(loc)) {\n          reporter.verbose(reporter.lang('configFileFound', loc));\n          actuals.push([isHome, loc, yield (_fs || _load_fs()).readFile(loc)]);\n        }\n      }\n\n      return actuals;\n    })();\n  }\n\n  static getConfigEnv(env = process.env) {\n    // To match NPM's behavior, HOME is always the user's home directory.\n    const overrideEnv = {\n      HOME: (_userHomeDir2 || _load_userHomeDir2()).home\n    };\n    return Object.assign({}, env, overrideEnv);\n  }\n\n  static normalizeConfig(config) {\n    const env = NpmRegistry.getConfigEnv();\n    config = (_baseRegistry || _load_baseRegistry()).default.normalizeConfig(config);\n\n    for (const key in config) {\n      config[key] = (0, (_envReplace || _load_envReplace()).default)(config[key], env);\n      if (isPathConfigOption(key)) {\n        config[key] = normalizePath(config[key]);\n      }\n    }\n\n    return config;\n  }\n\n  loadConfig() {\n    var _this4 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      // docs: https://docs.npmjs.com/misc/config\n      _this4.mergeEnv('npm_config_');\n\n      for (var _iterator3 = yield _this4.getPossibleConfigLocations('npmrc', _this4.reporter), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n        var _ref5;\n\n        if (_isArray3) {\n          if (_i3 >= _iterator3.length) break;\n          _ref5 = _iterator3[_i3++];\n        } else {\n          _i3 = _iterator3.next();\n          if (_i3.done) break;\n          _ref5 = _i3.value;\n        }\n\n        const _ref4 = _ref5;\n        const loc = _ref4[1];\n        const file = _ref4[2];\n\n        const config = NpmRegistry.normalizeConfig((_ini || _load_ini()).default.parse(file));\n\n        // normalize offline mirror path relative to the current npmrc\n        const offlineLoc = config['yarn-offline-mirror'];\n        // don't normalize if we already have a mirror path\n        if (!_this4.config['yarn-offline-mirror'] && offlineLoc) {\n          const mirrorLoc = config['yarn-offline-mirror'] = (_path2 || _load_path2()).default.resolve((_path2 || _load_path2()).default.dirname(loc), offlineLoc);\n          yield (_fs || _load_fs()).mkdirp(mirrorLoc);\n        }\n\n        _this4.config = Object.assign({}, config, _this4.config);\n      }\n    })();\n  }\n\n  getScope(packageIdent) {\n    const match = packageIdent.match(SCOPED_PKG_REGEXP);\n    return match && match[1] || '';\n  }\n\n  getRegistry(packageIdent) {\n    // Try extracting registry from the url, then scoped registry, and default registry\n    if (packageIdent.match(REGEX_REGISTRY_PREFIX)) {\n      const availableRegistries = this.getAvailableRegistries();\n      const registry = availableRegistries.find(registry => packageIdent.startsWith(registry));\n      if (registry) {\n        return String(registry);\n      }\n    }\n\n    var _arr = [this.getScope(packageIdent), ''];\n    for (var _i4 = 0; _i4 < _arr.length; _i4++) {\n      const scope = _arr[_i4];\n      const registry = this.getScopedOption(scope, 'registry') || this.registries.yarn.getScopedOption(scope, 'registry');\n      if (registry) {\n        return String(registry);\n      }\n    }\n\n    return DEFAULT_REGISTRY;\n  }\n\n  getAuthByRegistry(registry) {\n    // Check for bearer token.\n    const authToken = this.getRegistryOrGlobalOption(registry, '_authToken');\n    if (authToken) {\n      return `Bearer ${String(authToken)}`;\n    }\n\n    // Check for basic auth token.\n    const auth = this.getRegistryOrGlobalOption(registry, '_auth');\n    if (auth) {\n      return `Basic ${String(auth)}`;\n    }\n\n    // Check for basic username/password auth.\n    const username = this.getRegistryOrGlobalOption(registry, 'username');\n    const password = this.getRegistryOrGlobalOption(registry, '_password');\n    if (username && password) {\n      const pw = Buffer.from(String(password), 'base64').toString();\n      return 'Basic ' + Buffer.from(String(username) + ':' + pw).toString('base64');\n    }\n\n    return '';\n  }\n\n  getAuth(packageIdent) {\n    if (this.token) {\n      return this.token;\n    }\n\n    const baseRegistry = this.getRegistry(packageIdent);\n    const registries = [baseRegistry];\n\n    // If sending a request to the Yarn registry, we must also send it the auth token for the npm registry\n    if (baseRegistry === (_constants || _load_constants()).YARN_REGISTRY) {\n      registries.push(DEFAULT_REGISTRY);\n    }\n\n    for (var _iterator4 = registries, _isArray4 = Array.isArray(_iterator4), _i5 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n      var _ref6;\n\n      if (_isArray4) {\n        if (_i5 >= _iterator4.length) break;\n        _ref6 = _iterator4[_i5++];\n      } else {\n        _i5 = _iterator4.next();\n        if (_i5.done) break;\n        _ref6 = _i5.value;\n      }\n\n      const registry = _ref6;\n\n      const auth = this.getAuthByRegistry(registry);\n\n      if (auth) {\n        return auth;\n      }\n    }\n\n    return '';\n  }\n\n  getScopedOption(scope, option) {\n    return this.getOption(scope + (scope ? ':' : '') + option);\n  }\n\n  getRegistryOption(registry, option) {\n    const pre = REGEX_REGISTRY_HTTP_PROTOCOL;\n    const suf = REGEX_REGISTRY_SUFFIX;\n\n    // When registry is used config scope, the trailing '/' is required\n    const reg = (0, (_misc || _load_misc()).addSuffix)(registry, '/');\n\n    // 1st attempt, try to get option for the given registry URL\n    // 2nd attempt, remove the 'https?:' prefix of the registry URL\n    // 3nd attempt, remove the 'registry/?' suffix of the registry URL\n    return this.getScopedOption(reg, option) || pre.test(reg) && this.getRegistryOption(reg.replace(pre, ''), option) || suf.test(reg) && this.getRegistryOption(reg.replace(suf, ''), option);\n  }\n\n  getRegistryOrGlobalOption(registry, option) {\n    return this.getRegistryOption(registry, option) || this.getOption(option);\n  }\n}\nexports.default = NpmRegistry;\nNpmRegistry.filename = 'package.json';\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _baseResolver;\n\nfunction _load_baseResolver() {\n  return _baseResolver = _interopRequireDefault(__webpack_require__(124));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass ExoticResolver extends (_baseResolver || _load_baseResolver()).default {\n\n  static isVersion(pattern) {\n    const proto = this.protocol;\n    if (proto) {\n      return pattern.startsWith(`${proto}:`);\n    } else {\n      throw new Error('No protocol specified');\n    }\n  }\n}\nexports.default = ExoticResolver;\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _normalizePattern2;\n\nfunction _load_normalizePattern() {\n  return _normalizePattern2 = __webpack_require__(37);\n}\n\nconst semver = __webpack_require__(22);\n\nclass WorkspaceLayout {\n  constructor(workspaces, config) {\n    this.workspaces = workspaces;\n    this.config = config;\n  }\n\n  getWorkspaceManifest(key) {\n    return this.workspaces[key];\n  }\n\n  getManifestByPattern(pattern) {\n    var _normalizePattern = (0, (_normalizePattern2 || _load_normalizePattern()).normalizePattern)(pattern);\n\n    const name = _normalizePattern.name,\n          range = _normalizePattern.range;\n\n    const workspace = this.getWorkspaceManifest(name);\n    if (!workspace || !semver.satisfies(workspace.manifest.version, range, this.config.looseSemver)) {\n      return null;\n    }\n    return workspace;\n  }\n}\nexports.default = WorkspaceLayout;\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports) {\n\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(53);\nvar document = __webpack_require__(17).document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports) {\n\nmodule.exports = true;\n\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = __webpack_require__(68);\n\nfunction PromiseCapability(C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aFunction(resolve);\n  this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n  return new PromiseCapability(C);\n};\n\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar def = __webpack_require__(72).f;\nvar has = __webpack_require__(71);\nvar TAG = __webpack_require__(21)('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar shared = __webpack_require__(134)('keys');\nvar uid = __webpack_require__(138);\nmodule.exports = function (key) {\n  return shared[key] || (shared[key] = uid(key));\n};\n\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports) {\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = __webpack_require__(171);\nvar defined = __webpack_require__(91);\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Approach:\n//\n// 1. Get the minimatch set\n// 2. For each pattern in the set, PROCESS(pattern, false)\n// 3. Store matches per-set, then uniq them\n//\n// PROCESS(pattern, inGlobStar)\n// Get the first [n] items from pattern that are all strings\n// Join these together.  This is PREFIX.\n//   If there is no more remaining, then stat(PREFIX) and\n//   add to matches if it succeeds.  END.\n//\n// If inGlobStar and PREFIX is symlink and points to dir\n//   set ENTRIES = []\n// else readdir(PREFIX) as ENTRIES\n//   If fail, END\n//\n// with ENTRIES\n//   If pattern[n] is GLOBSTAR\n//     // handle the case where the globstar match is empty\n//     // by pruning it out, and testing the resulting pattern\n//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false)\n//     // handle other cases.\n//     for ENTRY in ENTRIES (not dotfiles)\n//       // attach globstar + tail onto the entry\n//       // Mark that this entry is a globstar match\n//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true)\n//\n//   else // not globstar\n//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)\n//       Test ENTRY against pattern[n]\n//       If fails, continue\n//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])\n//\n// Caveat:\n//   Cache all stats and readdirs results to minimize syscall.  Since all\n//   we ever care about is existence and directory-ness, we can just keep\n//   `true` for files, and [children,...] for directories, or `false` for\n//   things that don't exist.\n\nmodule.exports = glob\n\nvar fs = __webpack_require__(4)\nvar rp = __webpack_require__(141)\nvar minimatch = __webpack_require__(82)\nvar Minimatch = minimatch.Minimatch\nvar inherits = __webpack_require__(61)\nvar EE = __webpack_require__(77).EventEmitter\nvar path = __webpack_require__(0)\nvar assert = __webpack_require__(29)\nvar isAbsolute = __webpack_require__(101)\nvar globSync = __webpack_require__(269)\nvar common = __webpack_require__(142)\nvar alphasort = common.alphasort\nvar alphasorti = common.alphasorti\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar inflight = __webpack_require__(274)\nvar util = __webpack_require__(3)\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nvar once = __webpack_require__(83)\n\nfunction glob (pattern, options, cb) {\n  if (typeof options === 'function') cb = options, options = {}\n  if (!options) options = {}\n\n  if (options.sync) {\n    if (cb)\n      throw new TypeError('callback provided to sync glob')\n    return globSync(pattern, options)\n  }\n\n  return new Glob(pattern, options, cb)\n}\n\nglob.sync = globSync\nvar GlobSync = glob.GlobSync = globSync.GlobSync\n\n// old api surface\nglob.glob = glob\n\nfunction extend (origin, add) {\n  if (add === null || typeof add !== 'object') {\n    return origin\n  }\n\n  var keys = Object.keys(add)\n  var i = keys.length\n  while (i--) {\n    origin[keys[i]] = add[keys[i]]\n  }\n  return origin\n}\n\nglob.hasMagic = function (pattern, options_) {\n  var options = extend({}, options_)\n  options.noprocess = true\n\n  var g = new Glob(pattern, options)\n  var set = g.minimatch.set\n\n  if (!pattern)\n    return false\n\n  if (set.length > 1)\n    return true\n\n  for (var j = 0; j < set[0].length; j++) {\n    if (typeof set[0][j] !== 'string')\n      return true\n  }\n\n  return false\n}\n\nglob.Glob = Glob\ninherits(Glob, EE)\nfunction Glob (pattern, options, cb) {\n  if (typeof options === 'function') {\n    cb = options\n    options = null\n  }\n\n  if (options && options.sync) {\n    if (cb)\n      throw new TypeError('callback provided to sync glob')\n    return new GlobSync(pattern, options)\n  }\n\n  if (!(this instanceof Glob))\n    return new Glob(pattern, options, cb)\n\n  setopts(this, pattern, options)\n  this._didRealPath = false\n\n  // process each pattern in the minimatch set\n  var n = this.minimatch.set.length\n\n  // The matches are stored as {<filename>: true,...} so that\n  // duplicates are automagically pruned.\n  // Later, we do an Object.keys() on these.\n  // Keep them as a list so we can fill in when nonull is set.\n  this.matches = new Array(n)\n\n  if (typeof cb === 'function') {\n    cb = once(cb)\n    this.on('error', cb)\n    this.on('end', function (matches) {\n      cb(null, matches)\n    })\n  }\n\n  var self = this\n  this._processing = 0\n\n  this._emitQueue = []\n  this._processQueue = []\n  this.paused = false\n\n  if (this.noprocess)\n    return this\n\n  if (n === 0)\n    return done()\n\n  var sync = true\n  for (var i = 0; i < n; i ++) {\n    this._process(this.minimatch.set[i], i, false, done)\n  }\n  sync = false\n\n  function done () {\n    --self._processing\n    if (self._processing <= 0) {\n      if (sync) {\n        process.nextTick(function () {\n          self._finish()\n        })\n      } else {\n        self._finish()\n      }\n    }\n  }\n}\n\nGlob.prototype._finish = function () {\n  assert(this instanceof Glob)\n  if (this.aborted)\n    return\n\n  if (this.realpath && !this._didRealpath)\n    return this._realpath()\n\n  common.finish(this)\n  this.emit('end', this.found)\n}\n\nGlob.prototype._realpath = function () {\n  if (this._didRealpath)\n    return\n\n  this._didRealpath = true\n\n  var n = this.matches.length\n  if (n === 0)\n    return this._finish()\n\n  var self = this\n  for (var i = 0; i < this.matches.length; i++)\n    this._realpathSet(i, next)\n\n  function next () {\n    if (--n === 0)\n      self._finish()\n  }\n}\n\nGlob.prototype._realpathSet = function (index, cb) {\n  var matchset = this.matches[index]\n  if (!matchset)\n    return cb()\n\n  var found = Object.keys(matchset)\n  var self = this\n  var n = found.length\n\n  if (n === 0)\n    return cb()\n\n  var set = this.matches[index] = Object.create(null)\n  found.forEach(function (p, i) {\n    // If there's a problem with the stat, then it means that\n    // one or more of the links in the realpath couldn't be\n    // resolved.  just return the abs value in that case.\n    p = self._makeAbs(p)\n    rp.realpath(p, self.realpathCache, function (er, real) {\n      if (!er)\n        set[real] = true\n      else if (er.syscall === 'stat')\n        set[p] = true\n      else\n        self.emit('error', er) // srsly wtf right here\n\n      if (--n === 0) {\n        self.matches[index] = set\n        cb()\n      }\n    })\n  })\n}\n\nGlob.prototype._mark = function (p) {\n  return common.mark(this, p)\n}\n\nGlob.prototype._makeAbs = function (f) {\n  return common.makeAbs(this, f)\n}\n\nGlob.prototype.abort = function () {\n  this.aborted = true\n  this.emit('abort')\n}\n\nGlob.prototype.pause = function () {\n  if (!this.paused) {\n    this.paused = true\n    this.emit('pause')\n  }\n}\n\nGlob.prototype.resume = function () {\n  if (this.paused) {\n    this.emit('resume')\n    this.paused = false\n    if (this._emitQueue.length) {\n      var eq = this._emitQueue.slice(0)\n      this._emitQueue.length = 0\n      for (var i = 0; i < eq.length; i ++) {\n        var e = eq[i]\n        this._emitMatch(e[0], e[1])\n      }\n    }\n    if (this._processQueue.length) {\n      var pq = this._processQueue.slice(0)\n      this._processQueue.length = 0\n      for (var i = 0; i < pq.length; i ++) {\n        var p = pq[i]\n        this._processing--\n        this._process(p[0], p[1], p[2], p[3])\n      }\n    }\n  }\n}\n\nGlob.prototype._process = function (pattern, index, inGlobStar, cb) {\n  assert(this instanceof Glob)\n  assert(typeof cb === 'function')\n\n  if (this.aborted)\n    return\n\n  this._processing++\n  if (this.paused) {\n    this._processQueue.push([pattern, index, inGlobStar, cb])\n    return\n  }\n\n  //console.error('PROCESS %d', this._processing, pattern)\n\n  // Get the first [n] parts of pattern that are all strings.\n  var n = 0\n  while (typeof pattern[n] === 'string') {\n    n ++\n  }\n  // now n is the index of the first one that is *not* a string.\n\n  // see if there's anything else\n  var prefix\n  switch (n) {\n    // if not, then this is rather simple\n    case pattern.length:\n      this._processSimple(pattern.join('/'), index, cb)\n      return\n\n    case 0:\n      // pattern *starts* with some non-trivial item.\n      // going to readdir(cwd), but not include the prefix in matches.\n      prefix = null\n      break\n\n    default:\n      // pattern has some string bits in the front.\n      // whatever it starts with, whether that's 'absolute' like /foo/bar,\n      // or 'relative' like '../baz'\n      prefix = pattern.slice(0, n).join('/')\n      break\n  }\n\n  var remain = pattern.slice(n)\n\n  // get the list of entries.\n  var read\n  if (prefix === null)\n    read = '.'\n  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {\n    if (!prefix || !isAbsolute(prefix))\n      prefix = '/' + prefix\n    read = prefix\n  } else\n    read = prefix\n\n  var abs = this._makeAbs(read)\n\n  //if ignored, skip _processing\n  if (childrenIgnored(this, read))\n    return cb()\n\n  var isGlobStar = remain[0] === minimatch.GLOBSTAR\n  if (isGlobStar)\n    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb)\n  else\n    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb)\n}\n\nGlob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n  var self = this\n  this._readdir(abs, inGlobStar, function (er, entries) {\n    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n  })\n}\n\nGlob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n\n  // if the abs isn't a dir, then nothing can match!\n  if (!entries)\n    return cb()\n\n  // It will only match dot entries if it starts with a dot, or if\n  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.\n  var pn = remain[0]\n  var negate = !!this.minimatch.negate\n  var rawGlob = pn._glob\n  var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n  var matchedEntries = []\n  for (var i = 0; i < entries.length; i++) {\n    var e = entries[i]\n    if (e.charAt(0) !== '.' || dotOk) {\n      var m\n      if (negate && !prefix) {\n        m = !e.match(pn)\n      } else {\n        m = e.match(pn)\n      }\n      if (m)\n        matchedEntries.push(e)\n    }\n  }\n\n  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries)\n\n  var len = matchedEntries.length\n  // If there are no matched entries, then nothing matches.\n  if (len === 0)\n    return cb()\n\n  // if this is the last remaining pattern bit, then no need for\n  // an additional stat *unless* the user has specified mark or\n  // stat explicitly.  We know they exist, since readdir returned\n  // them.\n\n  if (remain.length === 1 && !this.mark && !this.stat) {\n    if (!this.matches[index])\n      this.matches[index] = Object.create(null)\n\n    for (var i = 0; i < len; i ++) {\n      var e = matchedEntries[i]\n      if (prefix) {\n        if (prefix !== '/')\n          e = prefix + '/' + e\n        else\n          e = prefix + e\n      }\n\n      if (e.charAt(0) === '/' && !this.nomount) {\n        e = path.join(this.root, e)\n      }\n      this._emitMatch(index, e)\n    }\n    // This was the last one, and no stats were needed\n    return cb()\n  }\n\n  // now test all matched entries as stand-ins for that part\n  // of the pattern.\n  remain.shift()\n  for (var i = 0; i < len; i ++) {\n    var e = matchedEntries[i]\n    var newPattern\n    if (prefix) {\n      if (prefix !== '/')\n        e = prefix + '/' + e\n      else\n        e = prefix + e\n    }\n    this._process([e].concat(remain), index, inGlobStar, cb)\n  }\n  cb()\n}\n\nGlob.prototype._emitMatch = function (index, e) {\n  if (this.aborted)\n    return\n\n  if (isIgnored(this, e))\n    return\n\n  if (this.paused) {\n    this._emitQueue.push([index, e])\n    return\n  }\n\n  var abs = isAbsolute(e) ? e : this._makeAbs(e)\n\n  if (this.mark)\n    e = this._mark(e)\n\n  if (this.absolute)\n    e = abs\n\n  if (this.matches[index][e])\n    return\n\n  if (this.nodir) {\n    var c = this.cache[abs]\n    if (c === 'DIR' || Array.isArray(c))\n      return\n  }\n\n  this.matches[index][e] = true\n\n  var st = this.statCache[abs]\n  if (st)\n    this.emit('stat', e, st)\n\n  this.emit('match', e)\n}\n\nGlob.prototype._readdirInGlobStar = function (abs, cb) {\n  if (this.aborted)\n    return\n\n  // follow all symlinked directories forever\n  // just proceed as if this is a non-globstar situation\n  if (this.follow)\n    return this._readdir(abs, false, cb)\n\n  var lstatkey = 'lstat\\0' + abs\n  var self = this\n  var lstatcb = inflight(lstatkey, lstatcb_)\n\n  if (lstatcb)\n    fs.lstat(abs, lstatcb)\n\n  function lstatcb_ (er, lstat) {\n    if (er && er.code === 'ENOENT')\n      return cb()\n\n    var isSym = lstat && lstat.isSymbolicLink()\n    self.symlinks[abs] = isSym\n\n    // If it's not a symlink or a dir, then it's definitely a regular file.\n    // don't bother doing a readdir in that case.\n    if (!isSym && lstat && !lstat.isDirectory()) {\n      self.cache[abs] = 'FILE'\n      cb()\n    } else\n      self._readdir(abs, false, cb)\n  }\n}\n\nGlob.prototype._readdir = function (abs, inGlobStar, cb) {\n  if (this.aborted)\n    return\n\n  cb = inflight('readdir\\0'+abs+'\\0'+inGlobStar, cb)\n  if (!cb)\n    return\n\n  //console.error('RD %j %j', +inGlobStar, abs)\n  if (inGlobStar && !ownProp(this.symlinks, abs))\n    return this._readdirInGlobStar(abs, cb)\n\n  if (ownProp(this.cache, abs)) {\n    var c = this.cache[abs]\n    if (!c || c === 'FILE')\n      return cb()\n\n    if (Array.isArray(c))\n      return cb(null, c)\n  }\n\n  var self = this\n  fs.readdir(abs, readdirCb(this, abs, cb))\n}\n\nfunction readdirCb (self, abs, cb) {\n  return function (er, entries) {\n    if (er)\n      self._readdirError(abs, er, cb)\n    else\n      self._readdirEntries(abs, entries, cb)\n  }\n}\n\nGlob.prototype._readdirEntries = function (abs, entries, cb) {\n  if (this.aborted)\n    return\n\n  // if we haven't asked to stat everything, then just\n  // assume that everything in there exists, so we can avoid\n  // having to stat it a second time.\n  if (!this.mark && !this.stat) {\n    for (var i = 0; i < entries.length; i ++) {\n      var e = entries[i]\n      if (abs === '/')\n        e = abs + e\n      else\n        e = abs + '/' + e\n      this.cache[e] = true\n    }\n  }\n\n  this.cache[abs] = entries\n  return cb(null, entries)\n}\n\nGlob.prototype._readdirError = function (f, er, cb) {\n  if (this.aborted)\n    return\n\n  // handle errors, and cache the information\n  switch (er.code) {\n    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n    case 'ENOTDIR': // totally normal. means it *does* exist.\n      var abs = this._makeAbs(f)\n      this.cache[abs] = 'FILE'\n      if (abs === this.cwdAbs) {\n        var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n        error.path = this.cwd\n        error.code = er.code\n        this.emit('error', error)\n        this.abort()\n      }\n      break\n\n    case 'ENOENT': // not terribly unusual\n    case 'ELOOP':\n    case 'ENAMETOOLONG':\n    case 'UNKNOWN':\n      this.cache[this._makeAbs(f)] = false\n      break\n\n    default: // some unusual error.  Treat as failure.\n      this.cache[this._makeAbs(f)] = false\n      if (this.strict) {\n        this.emit('error', er)\n        // If the error is handled, then we abort\n        // if not, we threw out of here\n        this.abort()\n      }\n      if (!this.silent)\n        console.error('glob error', er)\n      break\n  }\n\n  return cb()\n}\n\nGlob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) {\n  var self = this\n  this._readdir(abs, inGlobStar, function (er, entries) {\n    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb)\n  })\n}\n\n\nGlob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) {\n  //console.error('pgs2', prefix, remain[0], entries)\n\n  // no entries means not a dir, so it can never have matches\n  // foo.txt/** doesn't match foo.txt\n  if (!entries)\n    return cb()\n\n  // test without the globstar, and with every child both below\n  // and replacing the globstar.\n  var remainWithoutGlobStar = remain.slice(1)\n  var gspref = prefix ? [ prefix ] : []\n  var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n  // the noGlobStar pattern exits the inGlobStar state\n  this._process(noGlobStar, index, false, cb)\n\n  var isSym = this.symlinks[abs]\n  var len = entries.length\n\n  // If it's a symlink, and we're in a globstar, then stop\n  if (isSym && inGlobStar)\n    return cb()\n\n  for (var i = 0; i < len; i++) {\n    var e = entries[i]\n    if (e.charAt(0) === '.' && !this.dot)\n      continue\n\n    // these two cases enter the inGlobStar state\n    var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n    this._process(instead, index, true, cb)\n\n    var below = gspref.concat(entries[i], remain)\n    this._process(below, index, true, cb)\n  }\n\n  cb()\n}\n\nGlob.prototype._processSimple = function (prefix, index, cb) {\n  // XXX review this.  Shouldn't it be doing the mounting etc\n  // before doing stat?  kinda weird?\n  var self = this\n  this._stat(prefix, function (er, exists) {\n    self._processSimple2(prefix, index, er, exists, cb)\n  })\n}\nGlob.prototype._processSimple2 = function (prefix, index, er, exists, cb) {\n\n  //console.error('ps2', prefix, exists)\n\n  if (!this.matches[index])\n    this.matches[index] = Object.create(null)\n\n  // If it doesn't exist, then just mark the lack of results\n  if (!exists)\n    return cb()\n\n  if (prefix && isAbsolute(prefix) && !this.nomount) {\n    var trail = /[\\/\\\\]$/.test(prefix)\n    if (prefix.charAt(0) === '/') {\n      prefix = path.join(this.root, prefix)\n    } else {\n      prefix = path.resolve(this.root, prefix)\n      if (trail)\n        prefix += '/'\n    }\n  }\n\n  if (process.platform === 'win32')\n    prefix = prefix.replace(/\\\\/g, '/')\n\n  // Mark this as a match\n  this._emitMatch(index, prefix)\n  cb()\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlob.prototype._stat = function (f, cb) {\n  var abs = this._makeAbs(f)\n  var needDir = f.slice(-1) === '/'\n\n  if (f.length > this.maxLength)\n    return cb()\n\n  if (!this.stat && ownProp(this.cache, abs)) {\n    var c = this.cache[abs]\n\n    if (Array.isArray(c))\n      c = 'DIR'\n\n    // It exists, but maybe not how we need it\n    if (!needDir || c === 'DIR')\n      return cb(null, c)\n\n    if (needDir && c === 'FILE')\n      return cb()\n\n    // otherwise we have to stat, because maybe c=true\n    // if we know it exists, but not what it is.\n  }\n\n  var exists\n  var stat = this.statCache[abs]\n  if (stat !== undefined) {\n    if (stat === false)\n      return cb(null, stat)\n    else {\n      var type = stat.isDirectory() ? 'DIR' : 'FILE'\n      if (needDir && type === 'FILE')\n        return cb()\n      else\n        return cb(null, type, stat)\n    }\n  }\n\n  var self = this\n  var statcb = inflight('stat\\0' + abs, lstatcb_)\n  if (statcb)\n    fs.lstat(abs, statcb)\n\n  function lstatcb_ (er, lstat) {\n    if (lstat && lstat.isSymbolicLink()) {\n      // If it's a symlink, then treat it as the target, unless\n      // the target does not exist, then treat it as a file.\n      return fs.stat(abs, function (er, stat) {\n        if (er)\n          self._stat2(f, abs, null, lstat, cb)\n        else\n          self._stat2(f, abs, er, stat, cb)\n      })\n    } else {\n      self._stat2(f, abs, er, lstat, cb)\n    }\n  }\n}\n\nGlob.prototype._stat2 = function (f, abs, er, stat, cb) {\n  if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n    this.statCache[abs] = false\n    return cb()\n  }\n\n  var needDir = f.slice(-1) === '/'\n  this.statCache[abs] = stat\n\n  if (abs.slice(-1) === '/' && stat && !stat.isDirectory())\n    return cb(null, false, stat)\n\n  var c = true\n  if (stat)\n    c = stat.isDirectory() ? 'DIR' : 'FILE'\n  this.cache[abs] = this.cache[abs] || c\n\n  if (needDir && c === 'FILE')\n    return cb()\n\n  return cb(null, c, stat)\n}\n\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Standard YAML's Failsafe schema.\n// http://www.yaml.org/spec/1.2/spec.html#id2802346\n\n\n\n\n\nvar Schema = __webpack_require__(45);\n\n\nmodule.exports = new Schema({\n  explicit: [\n    __webpack_require__(298),\n    __webpack_require__(296),\n    __webpack_require__(291)\n  ]\n});\n\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction posix(path) {\n\treturn path.charAt(0) === '/';\n}\n\nfunction win32(path) {\n\t// https://github.com/nodejs/node/blob/b3fcc245fb25539909ef1d5eaa01dbf92e168633/lib/path.js#L56\n\tvar splitDeviceRe = /^([a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/]+[^\\\\\\/]+)?([\\\\\\/])?([\\s\\S]*?)$/;\n\tvar result = splitDeviceRe.exec(path);\n\tvar device = result[1] || '';\n\tvar isUnc = Boolean(device && device.charAt(1) !== ':');\n\n\t// UNC paths are always absolute\n\treturn Boolean(result[2] || isUnc);\n}\n\nmodule.exports = process.platform === 'win32' ? win32 : posix;\nmodule.exports.posix = posix;\nmodule.exports.win32 = win32;\n\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Stream = __webpack_require__(23);\nif (process.env.READABLE_STREAM === 'disable' && Stream) {\n  module.exports = Stream;\n  exports = module.exports = Stream.Readable;\n  exports.Readable = Stream.Readable;\n  exports.Writable = Stream.Writable;\n  exports.Duplex = Stream.Duplex;\n  exports.Transform = Stream.Transform;\n  exports.PassThrough = Stream.PassThrough;\n  exports.Stream = Stream;\n} else {\n  exports = module.exports = __webpack_require__(406);\n  exports.Stream = Stream || exports;\n  exports.Readable = exports;\n  exports.Writable = __webpack_require__(408);\n  exports.Duplex = __webpack_require__(116);\n  exports.Transform = __webpack_require__(407);\n  exports.PassThrough = __webpack_require__(792);\n}\n\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nmodule.exports = {\n\tread: read.bind(undefined, false, undefined),\n\treadType: read.bind(undefined, false),\n\twrite: write,\n\t/* semi-private api, used by sshpk-agent */\n\treadPartial: read.bind(undefined, true),\n\n\t/* shared with ssh format */\n\treadInternal: read,\n\tkeyTypeToAlg: keyTypeToAlg,\n\talgToKeyType: algToKeyType\n};\n\nvar assert = __webpack_require__(16);\nvar Buffer = __webpack_require__(15).Buffer;\nvar algs = __webpack_require__(32);\nvar utils = __webpack_require__(26);\nvar Key = __webpack_require__(28);\nvar PrivateKey = __webpack_require__(33);\nvar SSHBuffer = __webpack_require__(160);\n\nfunction algToKeyType(alg) {\n\tassert.string(alg);\n\tif (alg === 'ssh-dss')\n\t\treturn ('dsa');\n\telse if (alg === 'ssh-rsa')\n\t\treturn ('rsa');\n\telse if (alg === 'ssh-ed25519')\n\t\treturn ('ed25519');\n\telse if (alg === 'ssh-curve25519')\n\t\treturn ('curve25519');\n\telse if (alg.match(/^ecdsa-sha2-/))\n\t\treturn ('ecdsa');\n\telse\n\t\tthrow (new Error('Unknown algorithm ' + alg));\n}\n\nfunction keyTypeToAlg(key) {\n\tassert.object(key);\n\tif (key.type === 'dsa')\n\t\treturn ('ssh-dss');\n\telse if (key.type === 'rsa')\n\t\treturn ('ssh-rsa');\n\telse if (key.type === 'ed25519')\n\t\treturn ('ssh-ed25519');\n\telse if (key.type === 'curve25519')\n\t\treturn ('ssh-curve25519');\n\telse if (key.type === 'ecdsa')\n\t\treturn ('ecdsa-sha2-' + key.part.curve.data.toString());\n\telse\n\t\tthrow (new Error('Unknown key type ' + key.type));\n}\n\nfunction read(partial, type, buf, options) {\n\tif (typeof (buf) === 'string')\n\t\tbuf = Buffer.from(buf);\n\tassert.buffer(buf, 'buf');\n\n\tvar key = {};\n\n\tvar parts = key.parts = [];\n\tvar sshbuf = new SSHBuffer({buffer: buf});\n\n\tvar alg = sshbuf.readString();\n\tassert.ok(!sshbuf.atEnd(), 'key must have at least one part');\n\n\tkey.type = algToKeyType(alg);\n\n\tvar partCount = algs.info[key.type].parts.length;\n\tif (type && type === 'private')\n\t\tpartCount = algs.privInfo[key.type].parts.length;\n\n\twhile (!sshbuf.atEnd() && parts.length < partCount)\n\t\tparts.push(sshbuf.readPart());\n\twhile (!partial && !sshbuf.atEnd())\n\t\tparts.push(sshbuf.readPart());\n\n\tassert.ok(parts.length >= 1,\n\t    'key must have at least one part');\n\tassert.ok(partial || sshbuf.atEnd(),\n\t    'leftover bytes at end of key');\n\n\tvar Constructor = Key;\n\tvar algInfo = algs.info[key.type];\n\tif (type === 'private' || algInfo.parts.length !== parts.length) {\n\t\talgInfo = algs.privInfo[key.type];\n\t\tConstructor = PrivateKey;\n\t}\n\tassert.strictEqual(algInfo.parts.length, parts.length);\n\n\tif (key.type === 'ecdsa') {\n\t\tvar res = /^ecdsa-sha2-(.+)$/.exec(alg);\n\t\tassert.ok(res !== null);\n\t\tassert.strictEqual(res[1], parts[0].data.toString());\n\t}\n\n\tvar normalized = true;\n\tfor (var i = 0; i < algInfo.parts.length; ++i) {\n\t\tvar p = parts[i];\n\t\tp.name = algInfo.parts[i];\n\t\t/*\n\t\t * OpenSSH stores ed25519 \"private\" keys as seed + public key\n\t\t * concat'd together (k followed by A). We want to keep them\n\t\t * separate for other formats that don't do this.\n\t\t */\n\t\tif (key.type === 'ed25519' && p.name === 'k')\n\t\t\tp.data = p.data.slice(0, 32);\n\n\t\tif (p.name !== 'curve' && algInfo.normalize !== false) {\n\t\t\tvar nd;\n\t\t\tif (key.type === 'ed25519') {\n\t\t\t\tnd = utils.zeroPadToLength(p.data, 32);\n\t\t\t} else {\n\t\t\t\tnd = utils.mpNormalize(p.data);\n\t\t\t}\n\t\t\tif (nd.toString('binary') !==\n\t\t\t    p.data.toString('binary')) {\n\t\t\t\tp.data = nd;\n\t\t\t\tnormalized = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (normalized)\n\t\tkey._rfc4253Cache = sshbuf.toBuffer();\n\n\tif (partial && typeof (partial) === 'object') {\n\t\tpartial.remainder = sshbuf.remainder();\n\t\tpartial.consumed = sshbuf._offset;\n\t}\n\n\treturn (new Constructor(key));\n}\n\nfunction write(key, options) {\n\tassert.object(key);\n\n\tvar alg = keyTypeToAlg(key);\n\tvar i;\n\n\tvar algInfo = algs.info[key.type];\n\tif (PrivateKey.isPrivateKey(key))\n\t\talgInfo = algs.privInfo[key.type];\n\tvar parts = algInfo.parts;\n\n\tvar buf = new SSHBuffer({});\n\n\tbuf.writeString(alg);\n\n\tfor (i = 0; i < parts.length; ++i) {\n\t\tvar data = key.part[parts[i]].data;\n\t\tif (algInfo.normalize !== false) {\n\t\t\tif (key.type === 'ed25519')\n\t\t\t\tdata = utils.zeroPadToLength(data, 32);\n\t\t\telse\n\t\t\t\tdata = utils.mpNormalize(data);\n\t\t}\n\t\tif (key.type === 'ed25519' && parts[i] === 'k')\n\t\t\tdata = Buffer.concat([data, key.part.A.data]);\n\t\tbuf.writeBuffer(data);\n\t}\n\n\treturn (buf.toBuffer());\n}\n\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"tty\");\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getInstallationMethod = exports.version = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet getInstallationMethod = exports.getInstallationMethod = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n    let installationMethod = originalInstallationMethod;\n\n    // If there's a package.json in the parent directory, it could have an\n    // override for the installation method, so we should prefer that over\n    // whatever was originally in Yarn's package.json. This is the case with\n    // systems such as Homebrew, which take the tarball and modify the\n    // installation method so we're aware of the fact that Yarn was installed via\n    // Homebrew (so things like update notifications can point out the correct\n    // command to upgrade).\n    try {\n      const manifestPath = (_path || _load_path()).default.join(__dirname, '..', 'package.json');\n      if ((_fs2 || _load_fs2()).default.existsSync(manifestPath)) {\n        // non-async version is deprecated\n        const manifest = yield (0, (_fs || _load_fs()).readJson)(manifestPath);\n        if (manifest.installationMethod) {\n          installationMethod = manifest.installationMethod;\n        }\n      }\n    } catch (e) {\n      // Ignore any errors; this is not critical functionality.\n    }\n    return installationMethod;\n  });\n\n  return function getInstallationMethod() {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = __webpack_require__(5);\n}\n\nvar _fs2;\n\nfunction _load_fs2() {\n  return _fs2 = _interopRequireDefault(__webpack_require__(4));\n}\n\nvar _path;\n\nfunction _load_path() {\n  return _path = _interopRequireDefault(__webpack_require__(0));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This will be bundled directly in the .js file for production builds\nvar _require = __webpack_require__(195); /**\n                                               * Determines the current version of Yarn itself.\n                                               * \n                                               */\n\nconst version = _require.version,\n      originalInstallationMethod = _require.installationMethod;\nexports.version = version;\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (str, fileLoc = 'lockfile') {\n  str = (0, (_stripBom || _load_stripBom()).default)(str);\n  return hasMergeConflicts(str) ? parseWithConflict(str, fileLoc) : { type: 'success', object: parse(str, fileLoc) };\n};\n\nvar _util;\n\nfunction _load_util() {\n  return _util = _interopRequireDefault(__webpack_require__(3));\n}\n\nvar _invariant;\n\nfunction _load_invariant() {\n  return _invariant = _interopRequireDefault(__webpack_require__(9));\n}\n\nvar _stripBom;\n\nfunction _load_stripBom() {\n  return _stripBom = _interopRequireDefault(__webpack_require__(161));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _map;\n\nfunction _load_map() {\n  return _map = _interopRequireDefault(__webpack_require__(30));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint quotes: 0 */\n\nvar _require = __webpack_require__(279);\n\nconst safeLoad = _require.safeLoad,\n      FAILSAFE_SCHEMA = _require.FAILSAFE_SCHEMA;\n\n\nconst VERSION_REGEX = /^yarn lockfile v(\\d+)$/;\n\nconst TOKEN_TYPES = {\n  boolean: 'BOOLEAN',\n  string: 'STRING',\n  identifier: 'IDENTIFIER',\n  eof: 'EOF',\n  colon: 'COLON',\n  newline: 'NEWLINE',\n  comment: 'COMMENT',\n  indent: 'INDENT',\n  invalid: 'INVALID',\n  number: 'NUMBER',\n  comma: 'COMMA'\n};\n\nconst VALID_PROP_VALUE_TOKENS = [TOKEN_TYPES.boolean, TOKEN_TYPES.string, TOKEN_TYPES.number];\n\nfunction isValidPropValueToken(token) {\n  return VALID_PROP_VALUE_TOKENS.indexOf(token.type) >= 0;\n}\n\nfunction* tokenise(input) {\n  let lastNewline = false;\n  let line = 1;\n  let col = 0;\n\n  function buildToken(type, value) {\n    return { line, col, type, value };\n  }\n\n  while (input.length) {\n    let chop = 0;\n\n    if (input[0] === '\\n' || input[0] === '\\r') {\n      chop++;\n      // If this is a \\r\\n line, ignore both chars but only add one new line\n      if (input[1] === '\\n') {\n        chop++;\n      }\n      line++;\n      col = 0;\n      yield buildToken(TOKEN_TYPES.newline);\n    } else if (input[0] === '#') {\n      chop++;\n\n      let nextNewline = input.indexOf('\\n', chop);\n      if (nextNewline === -1) {\n        nextNewline = input.length;\n      }\n      const val = input.substring(chop, nextNewline);\n      chop = nextNewline;\n      yield buildToken(TOKEN_TYPES.comment, val);\n    } else if (input[0] === ' ') {\n      if (lastNewline) {\n        let indentSize = 1;\n        for (let i = 1; input[i] === ' '; i++) {\n          indentSize++;\n        }\n\n        if (indentSize % 2) {\n          throw new TypeError('Invalid number of spaces');\n        } else {\n          chop = indentSize;\n          yield buildToken(TOKEN_TYPES.indent, indentSize / 2);\n        }\n      } else {\n        chop++;\n      }\n    } else if (input[0] === '\"') {\n      let i = 1;\n      for (; i < input.length; i++) {\n        if (input[i] === '\"') {\n          const isEscaped = input[i - 1] === '\\\\' && input[i - 2] !== '\\\\';\n          if (!isEscaped) {\n            i++;\n            break;\n          }\n        }\n      }\n      const val = input.substring(0, i);\n\n      chop = i;\n\n      try {\n        yield buildToken(TOKEN_TYPES.string, JSON.parse(val));\n      } catch (err) {\n        if (err instanceof SyntaxError) {\n          yield buildToken(TOKEN_TYPES.invalid);\n        } else {\n          throw err;\n        }\n      }\n    } else if (/^[0-9]/.test(input)) {\n      const val = /^[0-9]+/.exec(input)[0];\n      chop = val.length;\n\n      yield buildToken(TOKEN_TYPES.number, +val);\n    } else if (/^true/.test(input)) {\n      yield buildToken(TOKEN_TYPES.boolean, true);\n      chop = 4;\n    } else if (/^false/.test(input)) {\n      yield buildToken(TOKEN_TYPES.boolean, false);\n      chop = 5;\n    } else if (input[0] === ':') {\n      yield buildToken(TOKEN_TYPES.colon);\n      chop++;\n    } else if (input[0] === ',') {\n      yield buildToken(TOKEN_TYPES.comma);\n      chop++;\n    } else if (/^[a-zA-Z\\/.-]/g.test(input)) {\n      let i = 0;\n      for (; i < input.length; i++) {\n        const char = input[i];\n        if (char === ':' || char === ' ' || char === '\\n' || char === '\\r' || char === ',') {\n          break;\n        }\n      }\n      const name = input.substring(0, i);\n      chop = i;\n\n      yield buildToken(TOKEN_TYPES.string, name);\n    } else {\n      yield buildToken(TOKEN_TYPES.invalid);\n    }\n\n    if (!chop) {\n      // will trigger infinite recursion\n      yield buildToken(TOKEN_TYPES.invalid);\n    }\n\n    col += chop;\n    lastNewline = input[0] === '\\n' || input[0] === '\\r' && input[1] === '\\n';\n    input = input.slice(chop);\n  }\n\n  yield buildToken(TOKEN_TYPES.eof);\n}\n\nclass Parser {\n  constructor(input, fileLoc = 'lockfile') {\n    this.comments = [];\n    this.tokens = tokenise(input);\n    this.fileLoc = fileLoc;\n  }\n\n  onComment(token) {\n    const value = token.value;\n    (0, (_invariant || _load_invariant()).default)(typeof value === 'string', 'expected token value to be a string');\n\n    const comment = value.trim();\n\n    const versionMatch = comment.match(VERSION_REGEX);\n    if (versionMatch) {\n      const version = +versionMatch[1];\n      if (version > (_constants || _load_constants()).LOCKFILE_VERSION) {\n        throw new (_errors || _load_errors()).MessageError(`Can't install from a lockfile of version ${version} as you're on an old yarn version that only supports ` + `versions up to ${(_constants || _load_constants()).LOCKFILE_VERSION}. Run \\`$ yarn self-update\\` to upgrade to the latest version.`);\n      }\n    }\n\n    this.comments.push(comment);\n  }\n\n  next() {\n    const item = this.tokens.next();\n    (0, (_invariant || _load_invariant()).default)(item, 'expected a token');\n\n    const done = item.done,\n          value = item.value;\n\n    if (done || !value) {\n      throw new Error('No more tokens');\n    } else if (value.type === TOKEN_TYPES.comment) {\n      this.onComment(value);\n      return this.next();\n    } else {\n      return this.token = value;\n    }\n  }\n\n  unexpected(msg = 'Unexpected token') {\n    throw new SyntaxError(`${msg} ${this.token.line}:${this.token.col} in ${this.fileLoc}`);\n  }\n\n  expect(tokType) {\n    if (this.token.type === tokType) {\n      this.next();\n    } else {\n      this.unexpected();\n    }\n  }\n\n  eat(tokType) {\n    if (this.token.type === tokType) {\n      this.next();\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  parse(indent = 0) {\n    const obj = (0, (_map || _load_map()).default)();\n\n    while (true) {\n      const propToken = this.token;\n\n      if (propToken.type === TOKEN_TYPES.newline) {\n        const nextToken = this.next();\n        if (!indent) {\n          // if we have 0 indentation then the next token doesn't matter\n          continue;\n        }\n\n        if (nextToken.type !== TOKEN_TYPES.indent) {\n          // if we have no indentation after a newline then we've gone down a level\n          break;\n        }\n\n        if (nextToken.value === indent) {\n          // all is good, the indent is on our level\n          this.next();\n        } else {\n          // the indentation is less than our level\n          break;\n        }\n      } else if (propToken.type === TOKEN_TYPES.indent) {\n        if (propToken.value === indent) {\n          this.next();\n        } else {\n          break;\n        }\n      } else if (propToken.type === TOKEN_TYPES.eof) {\n        break;\n      } else if (propToken.type === TOKEN_TYPES.string) {\n        // property key\n        const key = propToken.value;\n        (0, (_invariant || _load_invariant()).default)(key, 'Expected a key');\n\n        const keys = [key];\n        this.next();\n\n        // support multiple keys\n        while (this.token.type === TOKEN_TYPES.comma) {\n          this.next(); // skip comma\n\n          const keyToken = this.token;\n          if (keyToken.type !== TOKEN_TYPES.string) {\n            this.unexpected('Expected string');\n          }\n\n          const key = keyToken.value;\n          (0, (_invariant || _load_invariant()).default)(key, 'Expected a key');\n          keys.push(key);\n          this.next();\n        }\n\n        const wasColon = this.token.type === TOKEN_TYPES.colon;\n        if (wasColon) {\n          this.next();\n        }\n\n        if (isValidPropValueToken(this.token)) {\n          // plain value\n          for (var _iterator = keys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n            var _ref;\n\n            if (_isArray) {\n              if (_i >= _iterator.length) break;\n              _ref = _iterator[_i++];\n            } else {\n              _i = _iterator.next();\n              if (_i.done) break;\n              _ref = _i.value;\n            }\n\n            const key = _ref;\n\n            obj[key] = this.token.value;\n          }\n\n          this.next();\n        } else if (wasColon) {\n          // parse object\n          const val = this.parse(indent + 1);\n\n          for (var _iterator2 = keys, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n            var _ref2;\n\n            if (_isArray2) {\n              if (_i2 >= _iterator2.length) break;\n              _ref2 = _iterator2[_i2++];\n            } else {\n              _i2 = _iterator2.next();\n              if (_i2.done) break;\n              _ref2 = _i2.value;\n            }\n\n            const key = _ref2;\n\n            obj[key] = val;\n          }\n\n          if (indent && this.token.type !== TOKEN_TYPES.indent) {\n            break;\n          }\n        } else {\n          this.unexpected('Invalid value type');\n        }\n      } else {\n        this.unexpected(`Unknown token: ${(_util || _load_util()).default.inspect(propToken)}`);\n      }\n    }\n\n    return obj;\n  }\n}\n\nconst MERGE_CONFLICT_ANCESTOR = '|||||||';\nconst MERGE_CONFLICT_END = '>>>>>>>';\nconst MERGE_CONFLICT_SEP = '=======';\nconst MERGE_CONFLICT_START = '<<<<<<<';\n\n/**\n * Extract the two versions of the lockfile from a merge conflict.\n */\nfunction extractConflictVariants(str) {\n  const variants = [[], []];\n  const lines = str.split(/\\r?\\n/g);\n  let skip = false;\n\n  while (lines.length) {\n    const line = lines.shift();\n    if (line.startsWith(MERGE_CONFLICT_START)) {\n      // get the first variant\n      while (lines.length) {\n        const conflictLine = lines.shift();\n        if (conflictLine === MERGE_CONFLICT_SEP) {\n          skip = false;\n          break;\n        } else if (skip || conflictLine.startsWith(MERGE_CONFLICT_ANCESTOR)) {\n          skip = true;\n          continue;\n        } else {\n          variants[0].push(conflictLine);\n        }\n      }\n\n      // get the second variant\n      while (lines.length) {\n        const conflictLine = lines.shift();\n        if (conflictLine.startsWith(MERGE_CONFLICT_END)) {\n          break;\n        } else {\n          variants[1].push(conflictLine);\n        }\n      }\n    } else {\n      variants[0].push(line);\n      variants[1].push(line);\n    }\n  }\n\n  return [variants[0].join('\\n'), variants[1].join('\\n')];\n}\n\n/**\n * Check if a lockfile has merge conflicts.\n */\nfunction hasMergeConflicts(str) {\n  return str.includes(MERGE_CONFLICT_START) && str.includes(MERGE_CONFLICT_SEP) && str.includes(MERGE_CONFLICT_END);\n}\n\n/**\n * Parse the lockfile.\n */\nfunction parse(str, fileLoc) {\n  const parser = new Parser(str, fileLoc);\n  parser.next();\n\n  if (!fileLoc.endsWith(`.yml`)) {\n    try {\n      return parser.parse();\n    } catch (error1) {\n      try {\n        return safeLoad(str, {\n          schema: FAILSAFE_SCHEMA\n        });\n      } catch (error2) {\n        throw error1;\n      }\n    }\n  } else {\n    const result = safeLoad(str, {\n      schema: FAILSAFE_SCHEMA\n    });\n    if (typeof result === 'object') {\n      return result;\n    } else {\n      return {};\n    }\n  }\n}\n\n/**\n * Parse and merge the two variants in a conflicted lockfile.\n */\nfunction parseWithConflict(str, fileLoc) {\n  const variants = extractConflictVariants(str);\n  try {\n    return { type: 'merge', object: Object.assign({}, parse(variants[0], fileLoc), parse(variants[1], fileLoc)) };\n  } catch (err) {\n    if (err instanceof SyntaxError) {\n      return { type: 'conflict', object: {} };\n    } else {\n      throw err;\n    }\n  }\n}\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.getToken = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet getCredentials = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter) {\n    var _config$registries$ya = config.registries.yarn.config;\n    let username = _config$registries$ya.username,\n        email = _config$registries$ya.email;\n\n\n    if (username) {\n      reporter.info(`${reporter.lang('npmUsername')}: ${username}`);\n    } else {\n      username = yield reporter.question(reporter.lang('npmUsername'));\n      if (!username) {\n        return null;\n      }\n    }\n\n    if (email) {\n      reporter.info(`${reporter.lang('npmEmail')}: ${email}`);\n    } else {\n      email = yield reporter.question(reporter.lang('npmEmail'));\n      if (!email) {\n        return null;\n      }\n    }\n\n    yield config.registries.yarn.saveHomeConfig({ username, email });\n\n    return { username, email };\n  });\n\n  return function getCredentials(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet getToken = exports.getToken = (() => {\n  var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, name = '', flags = {}, registry = '') {\n    const auth = registry ? config.registries.npm.getAuthByRegistry(registry) : config.registries.npm.getAuth(name);\n\n    if (config.otp) {\n      config.registries.npm.setOtp(config.otp);\n    }\n\n    if (auth) {\n      config.registries.npm.setToken(auth);\n      return function revoke() {\n        reporter.info(reporter.lang('notRevokingConfigToken'));\n        return Promise.resolve();\n      };\n    }\n\n    const env = process.env.YARN_AUTH_TOKEN || process.env.NPM_AUTH_TOKEN;\n    if (env) {\n      config.registries.npm.setToken(`Bearer ${env}`);\n      return function revoke() {\n        reporter.info(reporter.lang('notRevokingEnvToken'));\n        return Promise.resolve();\n      };\n    }\n\n    // make sure we're not running in non-interactive mode before asking for login\n    if (flags.nonInteractive || config.nonInteractive) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('nonInteractiveNoToken'));\n    }\n\n    //\n    const creds = yield getCredentials(config, reporter);\n    if (!creds) {\n      reporter.warn(reporter.lang('loginAsPublic'));\n      return function revoke() {\n        reporter.info(reporter.lang('noTokenToRevoke'));\n        return Promise.resolve();\n      };\n    }\n\n    const username = creds.username,\n          email = creds.email;\n\n    const password = yield reporter.question(reporter.lang('npmPassword'), {\n      password: true,\n      required: true\n    });\n\n    //\n    const userobj = {\n      _id: `org.couchdb.user:${username}`,\n      name: username,\n      password,\n      email,\n      type: 'user',\n      roles: [],\n      date: new Date().toISOString()\n    };\n\n    //\n    const res = yield config.registries.npm.request(`-/user/org.couchdb.user:${encodeURIComponent(username)}`, {\n      method: 'PUT',\n      registry,\n      body: userobj,\n      auth: { username, password, email }\n    });\n\n    if (res && res.ok) {\n      reporter.success(reporter.lang('loggedIn'));\n\n      const token = res.token;\n      config.registries.npm.setToken(`Bearer ${token}`);\n\n      return (() => {\n        var _ref3 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n          reporter.success(reporter.lang('revokedToken'));\n          yield config.registries.npm.request(`-/user/token/${token}`, {\n            method: 'DELETE',\n            registry\n          });\n        });\n\n        function revoke() {\n          return _ref3.apply(this, arguments);\n        }\n\n        return revoke;\n      })();\n    } else {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('incorrectCredentials'));\n    }\n  });\n\n  return function getToken(_x3, _x4) {\n    return _ref2.apply(this, arguments);\n  };\n})();\n\nlet run = exports.run = (() => {\n  var _ref4 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    yield getCredentials(config, reporter);\n  });\n\n  return function run(_x5, _x6, _x7, _x8) {\n    return _ref4.apply(this, arguments);\n  };\n})();\n\nexports.getOneTimePassword = getOneTimePassword;\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getOneTimePassword(reporter) {\n  return reporter.question(reporter.lang('npmOneTimePassword'));\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\nfunction setFlags(commander) {\n  commander.description('Stores registry username and email.');\n}\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nexports.stringifyLangArgs = stringifyLangArgs;\n\nvar _format;\n\nfunction _load_format() {\n  return _format = __webpack_require__(534);\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = _interopRequireWildcard(__webpack_require__(536));\n}\n\nvar _isCi;\n\nfunction _load_isCi() {\n  return _isCi = _interopRequireDefault(__webpack_require__(397));\n}\n\nvar _os;\n\nfunction _load_os() {\n  return _os = _interopRequireDefault(__webpack_require__(42));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint no-unused-vars: 0 */\n\nconst util = __webpack_require__(3);\nconst EventEmitter = __webpack_require__(77).EventEmitter;\n\nfunction stringifyLangArgs(args) {\n  return args.map(function (val) {\n    if (val != null && val.inspect) {\n      return val.inspect();\n    } else {\n      try {\n        const str = JSON.stringify(val) || val + '';\n        // should match all literal line breaks and\n        // \"u001b\" that follow an odd number of backslashes and convert them to ESC\n        // we do this because the JSON.stringify process has escaped these characters\n        return str.replace(/((?:^|[^\\\\])(?:\\\\{2})*)\\\\u001[bB]/g, '$1\\u001b').replace(/[\\\\]r[\\\\]n|([\\\\])?[\\\\]n/g, (match, precededBacklash) => {\n          // precededBacklash not null when \"\\n\" is preceded by a backlash (\"\\\\n\")\n          // match will be \"\\\\n\" and we don't replace it with os.EOL\n          return precededBacklash ? match : (_os || _load_os()).default.EOL;\n        });\n      } catch (e) {\n        return util.inspect(val);\n      }\n    }\n  });\n}\n\nclass BaseReporter {\n  constructor(opts = {}) {\n    const lang = 'en';\n    this.language = lang;\n\n    this.stdout = opts.stdout || process.stdout;\n    this.stderr = opts.stderr || process.stderr;\n    this.stdin = opts.stdin || this._getStandardInput();\n    this.emoji = !!opts.emoji;\n    this.nonInteractive = !!opts.nonInteractive;\n    this.noProgress = !!opts.noProgress || (_isCi || _load_isCi()).default;\n    this.isVerbose = !!opts.verbose;\n\n    // $FlowFixMe: this is valid!\n    this.isTTY = this.stdout.isTTY;\n\n    this.peakMemory = 0;\n    this.startTime = Date.now();\n    this.format = (_format || _load_format()).defaultFormatter;\n  }\n\n  lang(key, ...args) {\n    const msg = (_index || _load_index())[this.language][key] || (_index || _load_index()).en[key];\n    if (!msg) {\n      throw new ReferenceError(`No message defined for language key ${key}`);\n    }\n\n    // stringify args\n    const stringifiedArgs = stringifyLangArgs(args);\n\n    // replace $0 placeholders with args\n    return msg.replace(/\\$(\\d+)/g, (str, i) => {\n      return stringifiedArgs[i];\n    });\n  }\n\n  /**\n   * `stringifyLangArgs` run `JSON.stringify` on strings too causing\n   * them to appear quoted. This marks them as \"raw\" and prevents\n   * the quoting and escaping\n   */\n  rawText(str) {\n    return {\n      inspect() {\n        return str;\n      }\n    };\n  }\n\n  verbose(msg) {\n    if (this.isVerbose) {\n      this._verbose(msg);\n    }\n  }\n\n  verboseInspect(val) {\n    if (this.isVerbose) {\n      this._verboseInspect(val);\n    }\n  }\n\n  _verbose(msg) {}\n  _verboseInspect(val) {}\n\n  _getStandardInput() {\n    let standardInput;\n\n    // Accessing stdin in a win32 headless process (e.g., Visual Studio) may throw an exception.\n    try {\n      standardInput = process.stdin;\n    } catch (e) {\n      console.warn(e.message);\n      delete process.stdin;\n      // $FlowFixMe: this is valid!\n      process.stdin = new EventEmitter();\n      standardInput = process.stdin;\n    }\n\n    return standardInput;\n  }\n\n  initPeakMemoryCounter() {\n    this.checkPeakMemory();\n    this.peakMemoryInterval = setInterval(() => {\n      this.checkPeakMemory();\n    }, 1000);\n    // $FlowFixMe: Node's setInterval returns a Timeout, not a Number\n    this.peakMemoryInterval.unref();\n  }\n\n  checkPeakMemory() {\n    var _process$memoryUsage = process.memoryUsage();\n\n    const heapTotal = _process$memoryUsage.heapTotal;\n\n    if (heapTotal > this.peakMemory) {\n      this.peakMemory = heapTotal;\n    }\n  }\n\n  close() {\n    if (this.peakMemoryInterval) {\n      clearInterval(this.peakMemoryInterval);\n      this.peakMemoryInterval = null;\n    }\n  }\n\n  getTotalTime() {\n    return Date.now() - this.startTime;\n  }\n\n  // TODO\n  list(key, items, hints) {}\n\n  // Outputs basic tree structure to console\n  tree(key, obj, { force = false } = {}) {}\n\n  // called whenever we begin a step in the CLI.\n  step(current, total, message, emoji) {}\n\n  // a error message has been triggered. this however does not always meant an abrupt\n  // program end.\n  error(message) {}\n\n  // an info message has been triggered. this provides things like stats and diagnostics.\n  info(message) {}\n\n  // a warning message has been triggered.\n  warn(message) {}\n\n  // a success message has been triggered.\n  success(message) {}\n\n  // a simple log message\n  // TODO: rethink the {force} parameter. In the meantime, please don't use it (cf comments in #4143).\n  log(message, { force = false } = {}) {}\n\n  // a shell command has been executed\n  command(command) {}\n\n  // inspect and pretty-print any value\n  inspect(value) {}\n\n  // the screen shown at the very start of the CLI\n  header(command, pkg) {}\n\n  // the screen shown at the very end of the CLI\n  footer(showPeakMemory) {}\n\n  // a table structure\n  table(head, body) {}\n\n  // security audit action to resolve advisories\n  auditAction(recommendation) {}\n\n  // security audit requires manual review\n  auditManualReview() {}\n\n  // security audit advisory\n  auditAdvisory(resolution, auditAdvisory) {}\n\n  // summary for security audit report\n  auditSummary(auditMetadata) {}\n\n  // render an activity spinner and return a function that will trigger an update\n  activity() {\n    return {\n      tick(name) {},\n      end() {}\n    };\n  }\n\n  //\n  activitySet(total, workers) {\n    return {\n      spinners: Array(workers).fill({\n        clear() {},\n        setPrefix() {},\n        tick() {},\n        end() {}\n      }),\n      end() {}\n    };\n  }\n\n  //\n  question(question, options = {}) {\n    return Promise.reject(new Error('Not implemented'));\n  }\n\n  //\n  questionAffirm(question) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const condition = true; // trick eslint\n      if (_this.nonInteractive) {\n        return true;\n      }\n\n      while (condition) {\n        let answer = yield _this.question(question);\n        answer = answer.toLowerCase();\n\n        if (answer === 'y' || answer === 'yes') {\n          return true;\n        }\n        if (answer === 'n' || answer === 'no') {\n          return false;\n        }\n\n        _this.error('Invalid answer for question');\n      }\n\n      return false;\n    })();\n  }\n\n  // prompt the user to select an option from an array\n  select(header, question, options) {\n    return Promise.reject(new Error('Not implemented'));\n  }\n\n  // render a progress bar and return a function which when called will trigger an update\n  progress(total) {\n    return function () {};\n  }\n\n  // utility function to disable progress bar\n  disableProgress() {\n    this.noProgress = true;\n  }\n\n  //\n  prompt(message, choices, options = {}) {\n    return Promise.reject(new Error('Not implemented'));\n  }\n}\nexports.default = BaseReporter;\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nexports.explodeHostedGitFragment = explodeHostedGitFragment;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = __webpack_require__(58);\n}\n\nvar _gitResolver;\n\nfunction _load_gitResolver() {\n  return _gitResolver = _interopRequireDefault(__webpack_require__(125));\n}\n\nvar _exoticResolver;\n\nfunction _load_exoticResolver() {\n  return _exoticResolver = _interopRequireDefault(__webpack_require__(89));\n}\n\nvar _git;\n\nfunction _load_git() {\n  return _git = _interopRequireDefault(__webpack_require__(217));\n}\n\nvar _guessName;\n\nfunction _load_guessName() {\n  return _guessName = _interopRequireDefault(__webpack_require__(169));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction parseHash(fragment) {\n  const hashPosition = fragment.indexOf('#');\n  return hashPosition === -1 ? '' : fragment.substr(hashPosition + 1);\n}\n\nfunction explodeHostedGitFragment(fragment, reporter) {\n  const hash = parseHash(fragment);\n\n  const preParts = fragment.split('@');\n  if (preParts.length > 2) {\n    fragment = preParts[1] + '@' + preParts[2];\n  }\n\n  const parts = fragment.replace(/(.*?)#.*/, '$1') // Strip hash\n  .replace(/.*:(.*)/, '$1') // Strip prefixed protocols\n  .replace(/.git$/, '') // Strip the .git suffix\n  .split('/');\n\n  const user = parts[parts.length - 2];\n  const repo = parts[parts.length - 1];\n\n  if (user === undefined || repo === undefined) {\n    throw new (_errors || _load_errors()).MessageError(reporter.lang('invalidHostedGitFragment', fragment));\n  }\n\n  return {\n    user,\n    repo,\n    hash\n  };\n}\n\nclass HostedGitResolver extends (_exoticResolver || _load_exoticResolver()).default {\n  constructor(request, fragment) {\n    super(request, fragment);\n\n    const exploded = this.exploded = explodeHostedGitFragment(fragment, this.reporter);\n    const user = exploded.user,\n          repo = exploded.repo,\n          hash = exploded.hash;\n\n    this.user = user;\n    this.repo = repo;\n    this.hash = hash;\n  }\n\n  static getTarballUrl(exploded, commit) {\n    exploded;\n    commit;\n    throw new Error('Not implemented');\n  }\n\n  static getGitHTTPUrl(exploded) {\n    exploded;\n    throw new Error('Not implemented');\n  }\n\n  static getGitHTTPBaseUrl(exploded) {\n    exploded;\n    throw new Error('Not implemented');\n  }\n\n  static getGitSSHUrl(exploded) {\n    exploded;\n    throw new Error('Not implemented');\n  }\n\n  static getHTTPFileUrl(exploded, filename, commit) {\n    exploded;\n    filename;\n    commit;\n    throw new Error('Not implemented');\n  }\n\n  getRefOverHTTP(url) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const gitUrl = (_git || _load_git()).default.npmUrlToGitUrl(url);\n      const client = new (_git || _load_git()).default(_this.config, gitUrl, _this.hash);\n\n      let out = yield _this.config.requestManager.request({\n        url: `${url}/info/refs?service=git-upload-pack`,\n        queue: _this.resolver.fetchingQueue\n      });\n\n      if (out) {\n        // clean up output\n        let lines = out.trim().split('\\n');\n\n        // remove first two lines which contains compatibility info etc\n        lines = lines.slice(2);\n\n        // remove last line which contains the terminator \"0000\"\n        lines.pop();\n\n        // remove line lengths from start of each line\n        lines = lines.map(function (line) {\n          return line.slice(4);\n        });\n\n        out = lines.join('\\n');\n      } else {\n        throw new Error(_this.reporter.lang('hostedGitResolveError'));\n      }\n\n      return client.setRefHosted(out);\n    })();\n  }\n\n  resolveOverHTTP(url) {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const commit = yield _this2.getRefOverHTTP(url);\n      const config = _this2.config;\n\n\n      const tarballUrl = _this2.constructor.getTarballUrl(_this2.exploded, commit);\n\n      const tryRegistry = (() => {\n        var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (registry) {\n          const filename = (_index || _load_index()).registries[registry].filename;\n\n          const href = _this2.constructor.getHTTPFileUrl(_this2.exploded, filename, commit);\n          const file = yield config.requestManager.request({\n            url: href,\n            queue: _this2.resolver.fetchingQueue\n          });\n          if (!file) {\n            return null;\n          }\n\n          const json = yield config.readJson(href, function () {\n            return JSON.parse(file);\n          });\n          json._uid = commit;\n          json._remote = {\n            resolved: tarballUrl,\n            type: 'tarball',\n            reference: tarballUrl,\n            registry\n          };\n          return json;\n        });\n\n        return function tryRegistry(_x) {\n          return _ref.apply(this, arguments);\n        };\n      })();\n\n      const file = yield tryRegistry(_this2.registry);\n      if (file) {\n        return file;\n      }\n\n      for (const registry in (_index || _load_index()).registries) {\n        if (registry === _this2.registry) {\n          continue;\n        }\n\n        const file = yield tryRegistry(registry);\n        if (file) {\n          return file;\n        }\n      }\n\n      return {\n        name: (0, (_guessName || _load_guessName()).default)(url),\n        version: '0.0.0',\n        _uid: commit,\n        _remote: {\n          resolved: tarballUrl,\n          type: 'tarball',\n          reference: tarballUrl,\n          registry: 'npm',\n          hash: undefined\n        }\n      };\n    })();\n  }\n\n  hasHTTPCapability(url) {\n    var _this3 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      return (yield _this3.config.requestManager.request({\n        url,\n        method: 'HEAD',\n        queue: _this3.resolver.fetchingQueue,\n        followRedirect: false\n      })) !== false;\n    })();\n  }\n\n  resolve() {\n    var _this4 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      // If we already have the tarball, just return it without having to make any HTTP requests.\n      const shrunk = _this4.request.getLocked('tarball');\n      if (shrunk) {\n        return shrunk;\n      }\n\n      const httpUrl = _this4.constructor.getGitHTTPUrl(_this4.exploded);\n      const httpBaseUrl = _this4.constructor.getGitHTTPBaseUrl(_this4.exploded);\n      const sshUrl = _this4.constructor.getGitSSHUrl(_this4.exploded);\n\n      // If we can access the files over HTTP then we should as it's MUCH faster than git\n      // archive and tarball unarchiving. The HTTP API is only available for public repos\n      // though.\n      if (yield _this4.hasHTTPCapability(httpBaseUrl)) {\n        return _this4.resolveOverHTTP(httpUrl);\n      }\n\n      // If the url is accessible over git archive then we should immediately delegate to\n      // the git resolver.\n      //\n      // NOTE: Here we use a different url than when we delegate to the git resolver later on.\n      // This is because `git archive` requires access over ssh and github only allows that\n      // if you have write permissions\n      const sshGitUrl = (_git || _load_git()).default.npmUrlToGitUrl(sshUrl);\n      if (yield (_git || _load_git()).default.hasArchiveCapability(sshGitUrl)) {\n        const archiveClient = new (_git || _load_git()).default(_this4.config, sshGitUrl, _this4.hash);\n        const commit = yield archiveClient.init();\n        return _this4.fork((_gitResolver || _load_gitResolver()).default, true, `${sshUrl}#${commit}`);\n      }\n\n      // fallback to the plain git resolver\n      return _this4.fork((_gitResolver || _load_gitResolver()).default, true, sshUrl);\n    })();\n  }\n}\nexports.default = HostedGitResolver;\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _map;\n\nfunction _load_map() {\n  return _map = _interopRequireDefault(__webpack_require__(30));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst debug = __webpack_require__(263)('yarn');\n\nclass BlockingQueue {\n  constructor(alias, maxConcurrency = Infinity) {\n    this.concurrencyQueue = [];\n    this.maxConcurrency = maxConcurrency;\n    this.runningCount = 0;\n    this.warnedStuck = false;\n    this.alias = alias;\n    this.first = true;\n\n    this.running = (0, (_map || _load_map()).default)();\n    this.queue = (0, (_map || _load_map()).default)();\n\n    this.stuckTick = this.stuckTick.bind(this);\n  }\n\n  stillActive() {\n    if (this.stuckTimer) {\n      clearTimeout(this.stuckTimer);\n    }\n\n    this.stuckTimer = setTimeout(this.stuckTick, 5000);\n\n    // We need to check the existence of unref because of https://github.com/facebook/jest/issues/4559\n    // $FlowFixMe: Node's setInterval returns a Timeout, not a Number\n    this.stuckTimer.unref && this.stuckTimer.unref();\n  }\n\n  stuckTick() {\n    if (this.runningCount === 1) {\n      this.warnedStuck = true;\n      debug(`The ${JSON.stringify(this.alias)} blocking queue may be stuck. 5 seconds ` + `without any activity with 1 worker: ${Object.keys(this.running)[0]}`);\n    }\n  }\n\n  push(key, factory) {\n    if (this.first) {\n      this.first = false;\n    } else {\n      this.stillActive();\n    }\n\n    return new Promise((resolve, reject) => {\n      // we're already running so push ourselves to the queue\n      const queue = this.queue[key] = this.queue[key] || [];\n      queue.push({ factory, resolve, reject });\n\n      if (!this.running[key]) {\n        this.shift(key);\n      }\n    });\n  }\n\n  shift(key) {\n    if (this.running[key]) {\n      delete this.running[key];\n      this.runningCount--;\n\n      if (this.stuckTimer) {\n        clearTimeout(this.stuckTimer);\n        this.stuckTimer = null;\n      }\n\n      if (this.warnedStuck) {\n        this.warnedStuck = false;\n        debug(`${JSON.stringify(this.alias)} blocking queue finally resolved. Nothing to worry about.`);\n      }\n    }\n\n    const queue = this.queue[key];\n    if (!queue) {\n      return;\n    }\n\n    var _queue$shift = queue.shift();\n\n    const resolve = _queue$shift.resolve,\n          reject = _queue$shift.reject,\n          factory = _queue$shift.factory;\n\n    if (!queue.length) {\n      delete this.queue[key];\n    }\n\n    const next = () => {\n      this.shift(key);\n      this.shiftConcurrencyQueue();\n    };\n\n    const run = () => {\n      this.running[key] = true;\n      this.runningCount++;\n\n      factory().then(function (val) {\n        resolve(val);\n        next();\n        return null;\n      }).catch(function (err) {\n        reject(err);\n        next();\n      });\n    };\n\n    this.maybePushConcurrencyQueue(run);\n  }\n\n  maybePushConcurrencyQueue(run) {\n    if (this.runningCount < this.maxConcurrency) {\n      run();\n    } else {\n      this.concurrencyQueue.push(run);\n    }\n  }\n\n  shiftConcurrencyQueue() {\n    if (this.runningCount < this.maxConcurrency) {\n      const fn = this.concurrencyQueue.shift();\n      if (fn) {\n        fn();\n      }\n    }\n  }\n}\nexports.default = BlockingQueue;\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.execCommand = exports.execFromManifest = exports.executeLifecycleScript = exports.makeEnv = exports.getWrappersFolder = exports.IGNORE_MANIFEST_KEYS = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet getWrappersFolder = exports.getWrappersFolder = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config) {\n    if (wrappersFolder) {\n      return wrappersFolder;\n    }\n\n    wrappersFolder = yield (_fs || _load_fs()).makeTempDir();\n\n    yield (0, (_portableScript || _load_portableScript()).makePortableProxyScript)(process.execPath, wrappersFolder, {\n      proxyBasename: 'node'\n    });\n\n    yield (0, (_portableScript || _load_portableScript()).makePortableProxyScript)(process.execPath, wrappersFolder, {\n      proxyBasename: 'yarn',\n      prependArguments: [process.argv[1]]\n    });\n\n    return wrappersFolder;\n  });\n\n  return function getWrappersFolder(_x) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet makeEnv = exports.makeEnv = (() => {\n  var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (stage, cwd, config) {\n    const env = (0, (_extends2 || _load_extends()).default)({\n      NODE: process.execPath,\n      INIT_CWD: process.cwd()\n    }, process.env);\n\n    // Merge in the `env` object specified in .yarnrc\n    const customEnv = config.getOption('env');\n    if (customEnv && typeof customEnv === 'object') {\n      Object.assign(env, customEnv);\n    }\n\n    env.npm_lifecycle_event = stage;\n    env.npm_node_execpath = env.NODE;\n    env.npm_execpath = env.npm_execpath || process.mainModule && process.mainModule.filename;\n\n    // Set the env to production for npm compat if production mode.\n    // https://github.com/npm/npm/blob/30d75e738b9cb7a6a3f9b50e971adcbe63458ed3/lib/utils/lifecycle.js#L336\n    if (config.production) {\n      env.NODE_ENV = 'production';\n    }\n\n    // Note: npm_config_argv environment variable contains output of nopt - command-line\n    // parser used by npm. Since we use other parser, we just roughly emulate it's output. (See: #684)\n    env.npm_config_argv = JSON.stringify({\n      remain: [],\n      cooked: config.commandName === 'run' ? [config.commandName, stage] : [config.commandName],\n      original: process.argv.slice(2)\n    });\n\n    const manifest = yield config.maybeReadManifest(cwd);\n    if (manifest) {\n      if (manifest.scripts && Object.prototype.hasOwnProperty.call(manifest.scripts, stage)) {\n        env.npm_lifecycle_script = manifest.scripts[stage];\n      }\n\n      // add npm_package_*\n      const queue = [['', manifest]];\n      while (queue.length) {\n        var _queue$pop = queue.pop();\n\n        const key = _queue$pop[0],\n              val = _queue$pop[1];\n\n        if (typeof val === 'object') {\n          for (const subKey in val) {\n            const fullKey = [key, subKey].filter(Boolean).join('_');\n            if (fullKey && fullKey[0] !== '_' && !IGNORE_MANIFEST_KEYS.has(fullKey)) {\n              queue.push([fullKey, val[subKey]]);\n            }\n          }\n        } else {\n          let cleanVal = String(val);\n          if (cleanVal.indexOf('\\n') >= 0) {\n            cleanVal = JSON.stringify(cleanVal);\n          }\n\n          //replacing invalid chars with underscore\n          const cleanKey = key.replace(INVALID_CHAR_REGEX, '_');\n\n          env[`npm_package_${cleanKey}`] = cleanVal;\n        }\n      }\n    }\n\n    // add npm_config_* and npm_package_config_* from yarn config\n    const keys = new Set([...Object.keys(config.registries.yarn.config), ...Object.keys(config.registries.npm.config)]);\n    const cleaned = Array.from(keys).filter(function (key) {\n      return !key.match(/:_/) && IGNORE_CONFIG_KEYS.indexOf(key) === -1;\n    }).map(function (key) {\n      let val = config.getOption(key);\n      if (!val) {\n        val = '';\n      } else if (typeof val === 'number') {\n        val = '' + val;\n      } else if (typeof val !== 'string') {\n        val = JSON.stringify(val);\n      }\n\n      if (val.indexOf('\\n') >= 0) {\n        val = JSON.stringify(val);\n      }\n      return [key, val];\n    });\n    // add npm_config_*\n    for (var _iterator = cleaned, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref4;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref4 = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref4 = _i.value;\n      }\n\n      const _ref3 = _ref4;\n      const key = _ref3[0];\n      const val = _ref3[1];\n\n      const cleanKey = key.replace(/^_+/, '');\n      const envKey = `npm_config_${cleanKey}`.replace(INVALID_CHAR_REGEX, '_');\n      env[envKey] = val;\n    }\n    // add npm_package_config_*\n    if (manifest && manifest.name) {\n      const packageConfigPrefix = `${manifest.name}:`;\n      for (var _iterator2 = cleaned, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref6;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref6 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref6 = _i2.value;\n        }\n\n        const _ref5 = _ref6;\n        const key = _ref5[0];\n        const val = _ref5[1];\n\n        if (key.indexOf(packageConfigPrefix) !== 0) {\n          continue;\n        }\n        const cleanKey = key.replace(/^_+/, '').replace(packageConfigPrefix, '');\n        const envKey = `npm_package_config_${cleanKey}`.replace(INVALID_CHAR_REGEX, '_');\n        env[envKey] = val;\n      }\n    }\n\n    // split up the path\n    const envPath = env[(_constants || _load_constants()).ENV_PATH_KEY];\n    const pathParts = envPath ? envPath.split(path.delimiter) : [];\n\n    // Include node-gyp version that was bundled with the current Node.js version,\n    // if available.\n    pathParts.unshift(path.join(path.dirname(process.execPath), 'node_modules', 'npm', 'bin', 'node-gyp-bin'));\n    pathParts.unshift(path.join(path.dirname(process.execPath), '..', 'lib', 'node_modules', 'npm', 'bin', 'node-gyp-bin'));\n    // Include node-gyp version from homebrew managed npm, if available.\n    pathParts.unshift(path.join(path.dirname(process.execPath), '..', 'libexec', 'lib', 'node_modules', 'npm', 'bin', 'node-gyp-bin'));\n\n    // Add global bin folder if it is not present already, as some packages depend\n    // on a globally-installed version of node-gyp.\n    const globalBin = yield (0, (_global || _load_global()).getBinFolder)(config, {});\n    if (pathParts.indexOf(globalBin) === -1) {\n      pathParts.unshift(globalBin);\n    }\n\n    // Add node_modules .bin folders to the PATH\n    for (var _iterator3 = config.registryFolders, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n      var _ref7;\n\n      if (_isArray3) {\n        if (_i3 >= _iterator3.length) break;\n        _ref7 = _iterator3[_i3++];\n      } else {\n        _i3 = _iterator3.next();\n        if (_i3.done) break;\n        _ref7 = _i3.value;\n      }\n\n      const registryFolder = _ref7;\n\n      const binFolder = path.join(registryFolder, '.bin');\n      if (config.workspacesEnabled && config.workspaceRootFolder) {\n        pathParts.unshift(path.join(config.workspaceRootFolder, binFolder));\n      }\n      pathParts.unshift(path.join(config.linkFolder, binFolder));\n      pathParts.unshift(path.join(cwd, binFolder));\n    }\n\n    let pnpFile;\n\n    if (process.versions.pnp) {\n      pnpFile = (_dynamicRequire || _load_dynamicRequire()).dynamicRequire.resolve('pnpapi');\n    } else {\n      const candidate = `${config.lockfileFolder}/${(_constants || _load_constants()).PNP_FILENAME}`;\n      if (yield (_fs || _load_fs()).exists(candidate)) {\n        pnpFile = candidate;\n      }\n    }\n\n    if (pnpFile) {\n      const pnpApi = (0, (_dynamicRequire || _load_dynamicRequire()).dynamicRequire)(pnpFile);\n\n      const packageLocator = pnpApi.findPackageLocator(`${cwd}/`);\n      const packageInformation = pnpApi.getPackageInformation(packageLocator);\n\n      for (var _iterator4 = packageInformation.packageDependencies.entries(), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n        var _ref9;\n\n        if (_isArray4) {\n          if (_i4 >= _iterator4.length) break;\n          _ref9 = _iterator4[_i4++];\n        } else {\n          _i4 = _iterator4.next();\n          if (_i4.done) break;\n          _ref9 = _i4.value;\n        }\n\n        const _ref8 = _ref9;\n        const name = _ref8[0];\n        const reference = _ref8[1];\n\n        const dependencyInformation = pnpApi.getPackageInformation({ name, reference });\n\n        if (!dependencyInformation || !dependencyInformation.packageLocation) {\n          continue;\n        }\n\n        const binFolder = `${dependencyInformation.packageLocation}/.bin`;\n        if (yield (_fs || _load_fs()).exists(binFolder)) {\n          pathParts.unshift(binFolder);\n        }\n      }\n\n      // Note that NODE_OPTIONS doesn't support any style of quoting its arguments at the moment\n      // For this reason, it won't work if the user has a space inside its $PATH\n      env.NODE_OPTIONS = env.NODE_OPTIONS || '';\n      env.NODE_OPTIONS = `--require ${pnpFile} ${env.NODE_OPTIONS}`;\n    }\n\n    pathParts.unshift((yield getWrappersFolder(config)));\n\n    // join path back together\n    env[(_constants || _load_constants()).ENV_PATH_KEY] = pathParts.join(path.delimiter);\n\n    return env;\n  });\n\n  return function makeEnv(_x2, _x3, _x4) {\n    return _ref2.apply(this, arguments);\n  };\n})();\n\nlet executeLifecycleScript = exports.executeLifecycleScript = (() => {\n  var _ref10 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ({\n    stage,\n    config,\n    cwd,\n    cmd,\n    isInteractive,\n    onProgress,\n    customShell\n  }) {\n    const env = yield makeEnv(stage, cwd, config);\n\n    yield checkForGypIfNeeded(config, cmd, env[(_constants || _load_constants()).ENV_PATH_KEY].split(path.delimiter));\n\n    if (process.platform === 'win32' && (!customShell || customShell === 'cmd')) {\n      // handle windows run scripts starting with a relative path\n      cmd = (0, (_fixCmdWinSlashes || _load_fixCmdWinSlashes()).fixCmdWinSlashes)(cmd);\n    }\n\n    // By default (non-interactive), pipe everything to the terminal and run child process detached\n    // as long as it's not Windows (since windows does not have /dev/tty)\n    let stdio = ['ignore', 'pipe', 'pipe'];\n    let detached = process.platform !== 'win32';\n\n    if (isInteractive) {\n      stdio = 'inherit';\n      detached = false;\n    }\n\n    const shell = customShell || true;\n    const stdout = yield (_child || _load_child()).spawn(cmd, [], { cwd, env, stdio, detached, shell }, onProgress);\n\n    return { cwd, command: cmd, stdout };\n  });\n\n  return function executeLifecycleScript(_x5) {\n    return _ref10.apply(this, arguments);\n  };\n})();\n\nlet _checkForGyp = (() => {\n  var _ref11 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, paths) {\n    const reporter = config.reporter;\n\n    // Check every directory in the PATH\n\n    const allChecks = yield Promise.all(paths.map(function (dir) {\n      return (_fs || _load_fs()).exists(path.join(dir, 'node-gyp'));\n    }));\n    if (allChecks.some(Boolean)) {\n      // node-gyp is available somewhere\n      return;\n    }\n\n    reporter.info(reporter.lang('packageRequiresNodeGyp'));\n\n    try {\n      yield (0, (_global || _load_global()).run)(config, reporter, {}, ['add', 'node-gyp']);\n    } catch (e) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('nodeGypAutoInstallFailed', e.message));\n    }\n  });\n\n  return function _checkForGyp(_x6, _x7) {\n    return _ref11.apply(this, arguments);\n  };\n})();\n\nlet execFromManifest = exports.execFromManifest = (() => {\n  var _ref12 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, commandName, cwd) {\n    const pkg = yield config.maybeReadManifest(cwd);\n    if (!pkg || !pkg.scripts) {\n      return;\n    }\n\n    const cmd = pkg.scripts[commandName];\n    if (cmd) {\n      yield execCommand({ stage: commandName, config, cmd, cwd, isInteractive: true });\n    }\n  });\n\n  return function execFromManifest(_x8, _x9, _x10) {\n    return _ref12.apply(this, arguments);\n  };\n})();\n\nlet execCommand = exports.execCommand = (() => {\n  var _ref13 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ({\n    stage,\n    config,\n    cmd,\n    cwd,\n    isInteractive,\n    customShell\n  }) {\n    const reporter = config.reporter;\n\n    try {\n      reporter.command(cmd);\n      yield executeLifecycleScript({ stage, config, cwd, cmd, isInteractive, customShell });\n      return Promise.resolve();\n    } catch (err) {\n      if (err instanceof (_errors || _load_errors()).ProcessTermError) {\n        const formattedError = new (_errors || _load_errors()).ProcessTermError(err.EXIT_SIGNAL ? reporter.lang('commandFailedWithSignal', err.EXIT_SIGNAL) : reporter.lang('commandFailedWithCode', err.EXIT_CODE));\n        formattedError.EXIT_CODE = err.EXIT_CODE;\n        formattedError.EXIT_SIGNAL = err.EXIT_SIGNAL;\n        throw formattedError;\n      } else {\n        throw err;\n      }\n    }\n  });\n\n  return function execCommand(_x11) {\n    return _ref13.apply(this, arguments);\n  };\n})();\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _child;\n\nfunction _load_child() {\n  return _child = _interopRequireWildcard(__webpack_require__(50));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _dynamicRequire;\n\nfunction _load_dynamicRequire() {\n  return _dynamicRequire = __webpack_require__(365);\n}\n\nvar _portableScript;\n\nfunction _load_portableScript() {\n  return _portableScript = __webpack_require__(557);\n}\n\nvar _fixCmdWinSlashes;\n\nfunction _load_fixCmdWinSlashes() {\n  return _fixCmdWinSlashes = __webpack_require__(546);\n}\n\nvar _global;\n\nfunction _load_global() {\n  return _global = __webpack_require__(122);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst path = __webpack_require__(0);\n\nconst IGNORE_MANIFEST_KEYS = exports.IGNORE_MANIFEST_KEYS = new Set(['readme', 'notice', 'licenseText', 'activationEvents', 'contributes']);\n\n// We treat these configs as internal, thus not expose them to process.env.\n// This helps us avoid some gyp issues when building native modules.\n// See https://github.com/yarnpkg/yarn/issues/2286.\nconst IGNORE_CONFIG_KEYS = ['lastUpdateCheck'];\n\nlet wrappersFolder = null;\n\nconst INVALID_CHAR_REGEX = /\\W/g;\n\nexports.default = executeLifecycleScript;\n\n\nlet checkGypPromise = null;\n/**\n * Special case: Some packages depend on node-gyp, but don't specify this in\n * their package.json dependencies. They assume that node-gyp is available\n * globally. We need to detect this case and show an error message.\n */\nfunction checkForGypIfNeeded(config, cmd, paths) {\n  if (cmd.substr(0, cmd.indexOf(' ')) !== 'node-gyp') {\n    return Promise.resolve();\n  }\n\n  // Ensure this only runs once, rather than multiple times in parallel.\n  if (!checkGypPromise) {\n    checkGypPromise = _checkForGyp(config, paths);\n  }\n  return checkGypPromise;\n}\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports) {\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\n\nfunction isArray(arg) {\n  if (Array.isArray) {\n    return Array.isArray(arg);\n  }\n  return objectToString(arg) === '[object Array]';\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = Buffer.isBuffer;\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n\nmodule.exports = {\n  copy: copy,\n  checkDataType: checkDataType,\n  checkDataTypes: checkDataTypes,\n  coerceToTypes: coerceToTypes,\n  toHash: toHash,\n  getProperty: getProperty,\n  escapeQuotes: escapeQuotes,\n  equal: __webpack_require__(272),\n  ucs2length: __webpack_require__(654),\n  varOccurences: varOccurences,\n  varReplace: varReplace,\n  cleanUpCode: cleanUpCode,\n  finalCleanUpCode: finalCleanUpCode,\n  schemaHasRules: schemaHasRules,\n  schemaHasRulesExcept: schemaHasRulesExcept,\n  toQuotedString: toQuotedString,\n  getPathExpr: getPathExpr,\n  getPath: getPath,\n  getData: getData,\n  unescapeFragment: unescapeFragment,\n  unescapeJsonPointer: unescapeJsonPointer,\n  escapeFragment: escapeFragment,\n  escapeJsonPointer: escapeJsonPointer\n};\n\n\nfunction copy(o, to) {\n  to = to || {};\n  for (var key in o) to[key] = o[key];\n  return to;\n}\n\n\nfunction checkDataType(dataType, data, negate) {\n  var EQUAL = negate ? ' !== ' : ' === '\n    , AND = negate ? ' || ' : ' && '\n    , OK = negate ? '!' : ''\n    , NOT = negate ? '' : '!';\n  switch (dataType) {\n    case 'null': return data + EQUAL + 'null';\n    case 'array': return OK + 'Array.isArray(' + data + ')';\n    case 'object': return '(' + OK + data + AND +\n                          'typeof ' + data + EQUAL + '\"object\"' + AND +\n                          NOT + 'Array.isArray(' + data + '))';\n    case 'integer': return '(typeof ' + data + EQUAL + '\"number\"' + AND +\n                           NOT + '(' + data + ' % 1)' +\n                           AND + data + EQUAL + data + ')';\n    default: return 'typeof ' + data + EQUAL + '\"' + dataType + '\"';\n  }\n}\n\n\nfunction checkDataTypes(dataTypes, data) {\n  switch (dataTypes.length) {\n    case 1: return checkDataType(dataTypes[0], data, true);\n    default:\n      var code = '';\n      var types = toHash(dataTypes);\n      if (types.array && types.object) {\n        code = types.null ? '(': '(!' + data + ' || ';\n        code += 'typeof ' + data + ' !== \"object\")';\n        delete types.null;\n        delete types.array;\n        delete types.object;\n      }\n      if (types.number) delete types.integer;\n      for (var t in types)\n        code += (code ? ' && ' : '' ) + checkDataType(t, data, true);\n\n      return code;\n  }\n}\n\n\nvar COERCE_TO_TYPES = toHash([ 'string', 'number', 'integer', 'boolean', 'null' ]);\nfunction coerceToTypes(optionCoerceTypes, dataTypes) {\n  if (Array.isArray(dataTypes)) {\n    var types = [];\n    for (var i=0; i<dataTypes.length; i++) {\n      var t = dataTypes[i];\n      if (COERCE_TO_TYPES[t]) types[types.length] = t;\n      else if (optionCoerceTypes === 'array' && t === 'array') types[types.length] = t;\n    }\n    if (types.length) return types;\n  } else if (COERCE_TO_TYPES[dataTypes]) {\n    return [dataTypes];\n  } else if (optionCoerceTypes === 'array' && dataTypes === 'array') {\n    return ['array'];\n  }\n}\n\n\nfunction toHash(arr) {\n  var hash = {};\n  for (var i=0; i<arr.length; i++) hash[arr[i]] = true;\n  return hash;\n}\n\n\nvar IDENTIFIER = /^[a-z$_][a-z$_0-9]*$/i;\nvar SINGLE_QUOTE = /'|\\\\/g;\nfunction getProperty(key) {\n  return typeof key == 'number'\n          ? '[' + key + ']'\n          : IDENTIFIER.test(key)\n            ? '.' + key\n            : \"['\" + escapeQuotes(key) + \"']\";\n}\n\n\nfunction escapeQuotes(str) {\n  return str.replace(SINGLE_QUOTE, '\\\\$&')\n            .replace(/\\n/g, '\\\\n')\n            .replace(/\\r/g, '\\\\r')\n            .replace(/\\f/g, '\\\\f')\n            .replace(/\\t/g, '\\\\t');\n}\n\n\nfunction varOccurences(str, dataVar) {\n  dataVar += '[^0-9]';\n  var matches = str.match(new RegExp(dataVar, 'g'));\n  return matches ? matches.length : 0;\n}\n\n\nfunction varReplace(str, dataVar, expr) {\n  dataVar += '([^0-9])';\n  expr = expr.replace(/\\$/g, '$$$$');\n  return str.replace(new RegExp(dataVar, 'g'), expr + '$1');\n}\n\n\nvar EMPTY_ELSE = /else\\s*{\\s*}/g\n  , EMPTY_IF_NO_ELSE = /if\\s*\\([^)]+\\)\\s*\\{\\s*\\}(?!\\s*else)/g\n  , EMPTY_IF_WITH_ELSE = /if\\s*\\(([^)]+)\\)\\s*\\{\\s*\\}\\s*else(?!\\s*if)/g;\nfunction cleanUpCode(out) {\n  return out.replace(EMPTY_ELSE, '')\n            .replace(EMPTY_IF_NO_ELSE, '')\n            .replace(EMPTY_IF_WITH_ELSE, 'if (!($1))');\n}\n\n\nvar ERRORS_REGEXP = /[^v.]errors/g\n  , REMOVE_ERRORS = /var errors = 0;|var vErrors = null;|validate.errors = vErrors;/g\n  , REMOVE_ERRORS_ASYNC = /var errors = 0;|var vErrors = null;/g\n  , RETURN_VALID = 'return errors === 0;'\n  , RETURN_TRUE = 'validate.errors = null; return true;'\n  , RETURN_ASYNC = /if \\(errors === 0\\) return data;\\s*else throw new ValidationError\\(vErrors\\);/\n  , RETURN_DATA_ASYNC = 'return data;'\n  , ROOTDATA_REGEXP = /[^A-Za-z_$]rootData[^A-Za-z0-9_$]/g\n  , REMOVE_ROOTDATA = /if \\(rootData === undefined\\) rootData = data;/;\n\nfunction finalCleanUpCode(out, async) {\n  var matches = out.match(ERRORS_REGEXP);\n  if (matches && matches.length == 2) {\n    out = async\n          ? out.replace(REMOVE_ERRORS_ASYNC, '')\n               .replace(RETURN_ASYNC, RETURN_DATA_ASYNC)\n          : out.replace(REMOVE_ERRORS, '')\n               .replace(RETURN_VALID, RETURN_TRUE);\n  }\n\n  matches = out.match(ROOTDATA_REGEXP);\n  if (!matches || matches.length !== 3) return out;\n  return out.replace(REMOVE_ROOTDATA, '');\n}\n\n\nfunction schemaHasRules(schema, rules) {\n  if (typeof schema == 'boolean') return !schema;\n  for (var key in schema) if (rules[key]) return true;\n}\n\n\nfunction schemaHasRulesExcept(schema, rules, exceptKeyword) {\n  if (typeof schema == 'boolean') return !schema && exceptKeyword != 'not';\n  for (var key in schema) if (key != exceptKeyword && rules[key]) return true;\n}\n\n\nfunction toQuotedString(str) {\n  return '\\'' + escapeQuotes(str) + '\\'';\n}\n\n\nfunction getPathExpr(currentPath, expr, jsonPointers, isNumber) {\n  var path = jsonPointers // false by default\n              ? '\\'/\\' + ' + expr + (isNumber ? '' : '.replace(/~/g, \\'~0\\').replace(/\\\\//g, \\'~1\\')')\n              : (isNumber ? '\\'[\\' + ' + expr + ' + \\']\\'' : '\\'[\\\\\\'\\' + ' + expr + ' + \\'\\\\\\']\\'');\n  return joinPaths(currentPath, path);\n}\n\n\nfunction getPath(currentPath, prop, jsonPointers) {\n  var path = jsonPointers // false by default\n              ? toQuotedString('/' + escapeJsonPointer(prop))\n              : toQuotedString(getProperty(prop));\n  return joinPaths(currentPath, path);\n}\n\n\nvar JSON_POINTER = /^\\/(?:[^~]|~0|~1)*$/;\nvar RELATIVE_JSON_POINTER = /^([0-9]+)(#|\\/(?:[^~]|~0|~1)*)?$/;\nfunction getData($data, lvl, paths) {\n  var up, jsonPointer, data, matches;\n  if ($data === '') return 'rootData';\n  if ($data[0] == '/') {\n    if (!JSON_POINTER.test($data)) throw new Error('Invalid JSON-pointer: ' + $data);\n    jsonPointer = $data;\n    data = 'rootData';\n  } else {\n    matches = $data.match(RELATIVE_JSON_POINTER);\n    if (!matches) throw new Error('Invalid JSON-pointer: ' + $data);\n    up = +matches[1];\n    jsonPointer = matches[2];\n    if (jsonPointer == '#') {\n      if (up >= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);\n      return paths[lvl - up];\n    }\n\n    if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);\n    data = 'data' + ((lvl - up) || '');\n    if (!jsonPointer) return data;\n  }\n\n  var expr = data;\n  var segments = jsonPointer.split('/');\n  for (var i=0; i<segments.length; i++) {\n    var segment = segments[i];\n    if (segment) {\n      data += getProperty(unescapeJsonPointer(segment));\n      expr += ' && ' + data;\n    }\n  }\n  return expr;\n}\n\n\nfunction joinPaths (a, b) {\n  if (a == '\"\"') return b;\n  return (a + ' + ' + b).replace(/' \\+ '/g, '');\n}\n\n\nfunction unescapeFragment(str) {\n  return unescapeJsonPointer(decodeURIComponent(str));\n}\n\n\nfunction escapeFragment(str) {\n  return encodeURIComponent(escapeJsonPointer(str));\n}\n\n\nfunction escapeJsonPointer(str) {\n  return str.replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n\n\nfunction unescapeJsonPointer(str) {\n  return str.replace(/~1/g, '/').replace(/~0/g, '~');\n}\n\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * micromatch <https://github.com/jonschlinkert/micromatch>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n\n\nvar expand = __webpack_require__(753);\nvar utils = __webpack_require__(300);\n\n/**\n * The main function. Pass an array of filepaths,\n * and a string or array of glob patterns\n *\n * @param  {Array|String} `files`\n * @param  {Array|String} `patterns`\n * @param  {Object} `opts`\n * @return {Array} Array of matches\n */\n\nfunction micromatch(files, patterns, opts) {\n  if (!files || !patterns) return [];\n  opts = opts || {};\n\n  if (typeof opts.cache === 'undefined') {\n    opts.cache = true;\n  }\n\n  if (!Array.isArray(patterns)) {\n    return match(files, patterns, opts);\n  }\n\n  var len = patterns.length, i = 0;\n  var omit = [], keep = [];\n\n  while (len--) {\n    var glob = patterns[i++];\n    if (typeof glob === 'string' && glob.charCodeAt(0) === 33 /* ! */) {\n      omit.push.apply(omit, match(files, glob.slice(1), opts));\n    } else {\n      keep.push.apply(keep, match(files, glob, opts));\n    }\n  }\n  return utils.diff(keep, omit);\n}\n\n/**\n * Return an array of files that match the given glob pattern.\n *\n * This function is called by the main `micromatch` function If you only\n * need to pass a single pattern you might get very minor speed improvements\n * using this function.\n *\n * @param  {Array} `files`\n * @param  {String} `pattern`\n * @param  {Object} `options`\n * @return {Array}\n */\n\nfunction match(files, pattern, opts) {\n  if (utils.typeOf(files) !== 'string' && !Array.isArray(files)) {\n    throw new Error(msg('match', 'files', 'a string or array'));\n  }\n\n  files = utils.arrayify(files);\n  opts = opts || {};\n\n  var negate = opts.negate || false;\n  var orig = pattern;\n\n  if (typeof pattern === 'string') {\n    negate = pattern.charAt(0) === '!';\n    if (negate) {\n      pattern = pattern.slice(1);\n    }\n\n    // we need to remove the character regardless,\n    // so the above logic is still needed\n    if (opts.nonegate === true) {\n      negate = false;\n    }\n  }\n\n  var _isMatch = matcher(pattern, opts);\n  var len = files.length, i = 0;\n  var res = [];\n\n  while (i < len) {\n    var file = files[i++];\n    var fp = utils.unixify(file, opts);\n\n    if (!_isMatch(fp)) { continue; }\n    res.push(fp);\n  }\n\n  if (res.length === 0) {\n    if (opts.failglob === true) {\n      throw new Error('micromatch.match() found no matches for: \"' + orig + '\".');\n    }\n\n    if (opts.nonull || opts.nullglob) {\n      res.push(utils.unescapeGlob(orig));\n    }\n  }\n\n  // if `negate` was defined, diff negated files\n  if (negate) { res = utils.diff(files, res); }\n\n  // if `ignore` was defined, diff ignored filed\n  if (opts.ignore && opts.ignore.length) {\n    pattern = opts.ignore;\n    opts = utils.omit(opts, ['ignore']);\n    res = utils.diff(res, micromatch(res, pattern, opts));\n  }\n\n  if (opts.nodupes) {\n    return utils.unique(res);\n  }\n  return res;\n}\n\n/**\n * Returns a function that takes a glob pattern or array of glob patterns\n * to be used with `Array#filter()`. (Internally this function generates\n * the matching function using the [matcher] method).\n *\n * ```js\n * var fn = mm.filter('[a-c]');\n * ['a', 'b', 'c', 'd', 'e'].filter(fn);\n * //=> ['a', 'b', 'c']\n * ```\n * @param  {String|Array} `patterns` Can be a glob or array of globs.\n * @param  {Options} `opts` Options to pass to the [matcher] method.\n * @return {Function} Filter function to be passed to `Array#filter()`.\n */\n\nfunction filter(patterns, opts) {\n  if (!Array.isArray(patterns) && typeof patterns !== 'string') {\n    throw new TypeError(msg('filter', 'patterns', 'a string or array'));\n  }\n\n  patterns = utils.arrayify(patterns);\n  var len = patterns.length, i = 0;\n  var patternMatchers = Array(len);\n  while (i < len) {\n    patternMatchers[i] = matcher(patterns[i++], opts);\n  }\n\n  return function(fp) {\n    if (fp == null) return [];\n    var len = patternMatchers.length, i = 0;\n    var res = true;\n\n    fp = utils.unixify(fp, opts);\n    while (i < len) {\n      var fn = patternMatchers[i++];\n      if (!fn(fp)) {\n        res = false;\n        break;\n      }\n    }\n    return res;\n  };\n}\n\n/**\n * Returns true if the filepath contains the given\n * pattern. Can also return a function for matching.\n *\n * ```js\n * isMatch('foo.md', '*.md', {});\n * //=> true\n *\n * isMatch('*.md', {})('foo.md')\n * //=> true\n * ```\n * @param  {String} `fp`\n * @param  {String} `pattern`\n * @param  {Object} `opts`\n * @return {Boolean}\n */\n\nfunction isMatch(fp, pattern, opts) {\n  if (typeof fp !== 'string') {\n    throw new TypeError(msg('isMatch', 'filepath', 'a string'));\n  }\n\n  fp = utils.unixify(fp, opts);\n  if (utils.typeOf(pattern) === 'object') {\n    return matcher(fp, pattern);\n  }\n  return matcher(pattern, opts)(fp);\n}\n\n/**\n * Returns true if the filepath matches the\n * given pattern.\n */\n\nfunction contains(fp, pattern, opts) {\n  if (typeof fp !== 'string') {\n    throw new TypeError(msg('contains', 'pattern', 'a string'));\n  }\n\n  opts = opts || {};\n  opts.contains = (pattern !== '');\n  fp = utils.unixify(fp, opts);\n\n  if (opts.contains && !utils.isGlob(pattern)) {\n    return fp.indexOf(pattern) !== -1;\n  }\n  return matcher(pattern, opts)(fp);\n}\n\n/**\n * Returns true if a file path matches any of the\n * given patterns.\n *\n * @param  {String} `fp` The filepath to test.\n * @param  {String|Array} `patterns` Glob patterns to use.\n * @param  {Object} `opts` Options to pass to the `matcher()` function.\n * @return {String}\n */\n\nfunction any(fp, patterns, opts) {\n  if (!Array.isArray(patterns) && typeof patterns !== 'string') {\n    throw new TypeError(msg('any', 'patterns', 'a string or array'));\n  }\n\n  patterns = utils.arrayify(patterns);\n  var len = patterns.length;\n\n  fp = utils.unixify(fp, opts);\n  while (len--) {\n    var isMatch = matcher(patterns[len], opts);\n    if (isMatch(fp)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Filter the keys of an object with the given `glob` pattern\n * and `options`\n *\n * @param  {Object} `object`\n * @param  {Pattern} `object`\n * @return {Array}\n */\n\nfunction matchKeys(obj, glob, options) {\n  if (utils.typeOf(obj) !== 'object') {\n    throw new TypeError(msg('matchKeys', 'first argument', 'an object'));\n  }\n\n  var fn = matcher(glob, options);\n  var res = {};\n\n  for (var key in obj) {\n    if (obj.hasOwnProperty(key) && fn(key)) {\n      res[key] = obj[key];\n    }\n  }\n  return res;\n}\n\n/**\n * Return a function for matching based on the\n * given `pattern` and `options`.\n *\n * @param  {String} `pattern`\n * @param  {Object} `options`\n * @return {Function}\n */\n\nfunction matcher(pattern, opts) {\n  // pattern is a function\n  if (typeof pattern === 'function') {\n    return pattern;\n  }\n  // pattern is a regex\n  if (pattern instanceof RegExp) {\n    return function(fp) {\n      return pattern.test(fp);\n    };\n  }\n\n  if (typeof pattern !== 'string') {\n    throw new TypeError(msg('matcher', 'pattern', 'a string, regex, or function'));\n  }\n\n  // strings, all the way down...\n  pattern = utils.unixify(pattern, opts);\n\n  // pattern is a non-glob string\n  if (!utils.isGlob(pattern)) {\n    return utils.matchPath(pattern, opts);\n  }\n  // pattern is a glob string\n  var re = makeRe(pattern, opts);\n\n  // `matchBase` is defined\n  if (opts && opts.matchBase) {\n    return utils.hasFilename(re, opts);\n  }\n  // `matchBase` is not defined\n  return function(fp) {\n    fp = utils.unixify(fp, opts);\n    return re.test(fp);\n  };\n}\n\n/**\n * Create and cache a regular expression for matching\n * file paths.\n *\n * If the leading character in the `glob` is `!`, a negation\n * regex is returned.\n *\n * @param  {String} `glob`\n * @param  {Object} `options`\n * @return {RegExp}\n */\n\nfunction toRegex(glob, options) {\n  // clone options to prevent  mutating the original object\n  var opts = Object.create(options || {});\n  var flags = opts.flags || '';\n  if (opts.nocase && flags.indexOf('i') === -1) {\n    flags += 'i';\n  }\n\n  var parsed = expand(glob, opts);\n\n  // pass in tokens to avoid parsing more than once\n  opts.negated = opts.negated || parsed.negated;\n  opts.negate = opts.negated;\n  glob = wrapGlob(parsed.pattern, opts);\n  var re;\n\n  try {\n    re = new RegExp(glob, flags);\n    return re;\n  } catch (err) {\n    err.reason = 'micromatch invalid regex: (' + re + ')';\n    if (opts.strict) throw new SyntaxError(err);\n  }\n\n  // we're only here if a bad pattern was used and the user\n  // passed `options.silent`, so match nothing\n  return /$^/;\n}\n\n/**\n * Create the regex to do the matching. If the leading\n * character in the `glob` is `!` a negation regex is returned.\n *\n * @param {String} `glob`\n * @param {Boolean} `negate`\n */\n\nfunction wrapGlob(glob, opts) {\n  var prefix = (opts && !opts.contains) ? '^' : '';\n  var after = (opts && !opts.contains) ? '$' : '';\n  glob = ('(?:' + glob + ')' + after);\n  if (opts && opts.negate) {\n    return prefix + ('(?!^' + glob + ').*$');\n  }\n  return prefix + glob;\n}\n\n/**\n * Create and cache a regular expression for matching file paths.\n * If the leading character in the `glob` is `!`, a negation\n * regex is returned.\n *\n * @param  {String} `glob`\n * @param  {Object} `options`\n * @return {RegExp}\n */\n\nfunction makeRe(glob, opts) {\n  if (utils.typeOf(glob) !== 'string') {\n    throw new Error(msg('makeRe', 'glob', 'a string'));\n  }\n  return utils.cache(toRegex, glob, opts);\n}\n\n/**\n * Make error messages consistent. Follows this format:\n *\n * ```js\n * msg(methodName, argNumber, nativeType);\n * // example:\n * msg('matchKeys', 'first', 'an object');\n * ```\n *\n * @param  {String} `method`\n * @param  {String} `num`\n * @param  {String} `type`\n * @return {String}\n */\n\nfunction msg(method, what, type) {\n  return 'micromatch.' + method + '(): ' + what + ' should be ' + type + '.';\n}\n\n/**\n * Public methods\n */\n\n/* eslint no-multi-spaces: 0 */\nmicromatch.any       = any;\nmicromatch.braces    = micromatch.braceExpand = utils.braces;\nmicromatch.contains  = contains;\nmicromatch.expand    = expand;\nmicromatch.filter    = filter;\nmicromatch.isMatch   = isMatch;\nmicromatch.makeRe    = makeRe;\nmicromatch.match     = match;\nmicromatch.matcher   = matcher;\nmicromatch.matchKeys = matchKeys;\n\n/**\n * Expose `micromatch`\n */\n\nmodule.exports = micromatch;\n\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a duplex stream is just a stream that is both readable and writable.\n// Since JS doesn't have multiple prototypal inheritance, this class\n// prototypally inherits from Readable, and then parasitically from\n// Writable.\n\n\n\n/*<replacement>*/\n\nvar pna = __webpack_require__(181);\n/*</replacement>*/\n\n/*<replacement>*/\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n  for (var key in obj) {\n    keys.push(key);\n  }return keys;\n};\n/*</replacement>*/\n\nmodule.exports = Duplex;\n\n/*<replacement>*/\nvar util = __webpack_require__(113);\nutil.inherits = __webpack_require__(61);\n/*</replacement>*/\n\nvar Readable = __webpack_require__(406);\nvar Writable = __webpack_require__(408);\n\nutil.inherits(Duplex, Readable);\n\n{\n  // avoid scope creep, the keys array can then be collected\n  var keys = objectKeys(Writable.prototype);\n  for (var v = 0; v < keys.length; v++) {\n    var method = keys[v];\n    if (!Duplex.prototype[method]) Duplex.prototype[method] = Writable.prototype[method];\n  }\n}\n\nfunction Duplex(options) {\n  if (!(this instanceof Duplex)) return new Duplex(options);\n\n  Readable.call(this, options);\n  Writable.call(this, options);\n\n  if (options && options.readable === false) this.readable = false;\n\n  if (options && options.writable === false) this.writable = false;\n\n  this.allowHalfOpen = true;\n  if (options && options.allowHalfOpen === false) this.allowHalfOpen = false;\n\n  this.once('end', onend);\n}\n\nObject.defineProperty(Duplex.prototype, 'writableHighWaterMark', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function () {\n    return this._writableState.highWaterMark;\n  }\n});\n\n// the no-half-open enforcer\nfunction onend() {\n  // if we allow half-open state, or if the writable side ended,\n  // then we're ok.\n  if (this.allowHalfOpen || this._writableState.ended) return;\n\n  // no more data can be written.\n  // But allow more writes to happen in this tick.\n  pna.nextTick(onEndNT, this);\n}\n\nfunction onEndNT(self) {\n  self.end();\n}\n\nObject.defineProperty(Duplex.prototype, 'destroyed', {\n  get: function () {\n    if (this._readableState === undefined || this._writableState === undefined) {\n      return false;\n    }\n    return this._readableState.destroyed && this._writableState.destroyed;\n  },\n  set: function (value) {\n    // we ignore the value if the stream\n    // has not been initialized yet\n    if (this._readableState === undefined || this._writableState === undefined) {\n      return;\n    }\n\n    // backward compatibility, the user is explicitly\n    // managing destroyed\n    this._readableState.destroyed = value;\n    this._writableState.destroyed = value;\n  }\n});\n\nDuplex.prototype._destroy = function (err, cb) {\n  this.push(null);\n  this.end();\n\n  pna.nextTick(cb, err);\n};\n\n/***/ }),\n/* 117 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = multicast;\n/* unused harmony export MulticastOperator */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_ConnectableObservable__ = __webpack_require__(423);\n/** PURE_IMPORTS_START _observable_ConnectableObservable PURE_IMPORTS_END */\n\nfunction multicast(subjectOrSubjectFactory, selector) {\n    return function multicastOperatorFunction(source) {\n        var subjectFactory;\n        if (typeof subjectOrSubjectFactory === 'function') {\n            subjectFactory = subjectOrSubjectFactory;\n        }\n        else {\n            subjectFactory = function subjectFactory() {\n                return subjectOrSubjectFactory;\n            };\n        }\n        if (typeof selector === 'function') {\n            return source.lift(new MulticastOperator(subjectFactory, selector));\n        }\n        var connectable = Object.create(source, __WEBPACK_IMPORTED_MODULE_0__observable_ConnectableObservable__[\"b\" /* connectableObservableDescriptor */]);\n        connectable.source = source;\n        connectable.subjectFactory = subjectFactory;\n        return connectable;\n    };\n}\nvar MulticastOperator = /*@__PURE__*/ (function () {\n    function MulticastOperator(subjectFactory, selector) {\n        this.subjectFactory = subjectFactory;\n        this.selector = selector;\n    }\n    MulticastOperator.prototype.call = function (subscriber, source) {\n        var selector = this.selector;\n        var subject = this.subjectFactory();\n        var subscription = selector(subject).subscribe(subscriber);\n        subscription.add(source.subscribe(subject));\n        return subscription;\n    };\n    return MulticastOperator;\n}());\n\n//# sourceMappingURL=multicast.js.map\n\n\n/***/ }),\n/* 118 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return observable; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nvar observable = typeof Symbol === 'function' && Symbol.observable || '@@observable';\n//# sourceMappingURL=observable.js.map\n\n\n/***/ }),\n/* 119 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = identity;\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction identity(x) {\n    return x;\n}\n//# sourceMappingURL=identity.js.map\n\n\n/***/ }),\n/* 120 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar v1 = __webpack_require__(957);\nvar v4 = __webpack_require__(958);\n\nvar uuid = v4;\nuuid.v1 = v1;\nuuid.v4 = v4;\n\nmodule.exports = uuid;\n\n\n/***/ }),\n/* 121 */\n/***/ (function(module, exports) {\n\nmodule.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n\n\n/***/ }),\n/* 122 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.getBinFolder = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet updateCwd = (() => {\n  var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config) {\n    yield (_fs || _load_fs()).mkdirp(config.globalFolder);\n\n    yield config.init({\n      cwd: config.globalFolder,\n      offline: config.offline,\n      binLinks: true,\n      globalFolder: config.globalFolder,\n      cacheFolder: config._cacheRootFolder,\n      linkFolder: config.linkFolder,\n      enableDefaultRc: config.enableDefaultRc,\n      extraneousYarnrcFiles: config.extraneousYarnrcFiles\n    });\n  });\n\n  return function updateCwd(_x) {\n    return _ref2.apply(this, arguments);\n  };\n})();\n\nlet getBins = (() => {\n  var _ref3 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config) {\n    // build up list of registry folders to search for binaries\n    const dirs = [];\n    for (var _iterator2 = Object.keys((_index || _load_index()).registries), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n      var _ref4;\n\n      if (_isArray2) {\n        if (_i2 >= _iterator2.length) break;\n        _ref4 = _iterator2[_i2++];\n      } else {\n        _i2 = _iterator2.next();\n        if (_i2.done) break;\n        _ref4 = _i2.value;\n      }\n\n      const registryName = _ref4;\n\n      const registry = config.registries[registryName];\n      dirs.push(registry.loc);\n    }\n\n    // build up list of binary files\n    const paths = new Set();\n    for (var _iterator3 = dirs, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n      var _ref5;\n\n      if (_isArray3) {\n        if (_i3 >= _iterator3.length) break;\n        _ref5 = _iterator3[_i3++];\n      } else {\n        _i3 = _iterator3.next();\n        if (_i3.done) break;\n        _ref5 = _i3.value;\n      }\n\n      const dir = _ref5;\n\n      const binDir = path.join(dir, '.bin');\n      if (!(yield (_fs || _load_fs()).exists(binDir))) {\n        continue;\n      }\n\n      for (var _iterator4 = yield (_fs || _load_fs()).readdir(binDir), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n        var _ref6;\n\n        if (_isArray4) {\n          if (_i4 >= _iterator4.length) break;\n          _ref6 = _iterator4[_i4++];\n        } else {\n          _i4 = _iterator4.next();\n          if (_i4.done) break;\n          _ref6 = _i4.value;\n        }\n\n        const name = _ref6;\n\n        paths.add(path.join(binDir, name));\n      }\n    }\n    return paths;\n  });\n\n  return function getBins(_x2) {\n    return _ref3.apply(this, arguments);\n  };\n})();\n\nlet getGlobalPrefix = (() => {\n  var _ref7 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, flags) {\n    if (flags.prefix) {\n      return flags.prefix;\n    } else if (config.getOption('prefix', true)) {\n      return String(config.getOption('prefix', true));\n    } else if (process.env.PREFIX) {\n      return process.env.PREFIX;\n    }\n\n    const potentialPrefixFolders = [(_constants || _load_constants()).FALLBACK_GLOBAL_PREFIX];\n    if (process.platform === 'win32') {\n      // %LOCALAPPDATA%\\Yarn --> C:\\Users\\Alice\\AppData\\Local\\Yarn\n      if (process.env.LOCALAPPDATA) {\n        potentialPrefixFolders.unshift(path.join(process.env.LOCALAPPDATA, 'Yarn'));\n      }\n    } else {\n      potentialPrefixFolders.unshift((_constants || _load_constants()).POSIX_GLOBAL_PREFIX);\n    }\n\n    const binFolders = potentialPrefixFolders.map(function (prefix) {\n      return path.join(prefix, 'bin');\n    });\n    const prefixFolderQueryResult = yield (_fs || _load_fs()).getFirstSuitableFolder(binFolders);\n    const prefix = prefixFolderQueryResult.folder && path.dirname(prefixFolderQueryResult.folder);\n\n    if (!prefix) {\n      config.reporter.warn(config.reporter.lang('noGlobalFolder', prefixFolderQueryResult.skipped.map(function (item) {\n        return path.dirname(item.folder);\n      }).join(', ')));\n\n      return (_constants || _load_constants()).FALLBACK_GLOBAL_PREFIX;\n    }\n\n    return prefix;\n  });\n\n  return function getGlobalPrefix(_x3, _x4) {\n    return _ref7.apply(this, arguments);\n  };\n})();\n\nlet getBinFolder = exports.getBinFolder = (() => {\n  var _ref8 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, flags) {\n    const prefix = yield getGlobalPrefix(config, flags);\n    return path.resolve(prefix, 'bin');\n  });\n\n  return function getBinFolder(_x5, _x6) {\n    return _ref8.apply(this, arguments);\n  };\n})();\n\nlet initUpdateBins = (() => {\n  var _ref9 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags) {\n    const beforeBins = yield getBins(config);\n    const binFolder = yield getBinFolder(config, flags);\n\n    function throwPermError(err, dest) {\n      if (err.code === 'EACCES') {\n        throw new (_errors || _load_errors()).MessageError(reporter.lang('noPermission', dest));\n      } else {\n        throw err;\n      }\n    }\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      try {\n        yield (_fs || _load_fs()).mkdirp(binFolder);\n      } catch (err) {\n        throwPermError(err, binFolder);\n      }\n\n      const afterBins = yield getBins(config);\n\n      // remove old bins\n      for (var _iterator5 = beforeBins, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n        var _ref11;\n\n        if (_isArray5) {\n          if (_i5 >= _iterator5.length) break;\n          _ref11 = _iterator5[_i5++];\n        } else {\n          _i5 = _iterator5.next();\n          if (_i5.done) break;\n          _ref11 = _i5.value;\n        }\n\n        const src = _ref11;\n\n        if (afterBins.has(src)) {\n          // not old\n          continue;\n        }\n\n        // remove old bin\n        const dest = path.join(binFolder, path.basename(src));\n        try {\n          yield (_fs || _load_fs()).unlink(dest);\n        } catch (err) {\n          throwPermError(err, dest);\n        }\n      }\n\n      // add new bins\n      for (var _iterator6 = afterBins, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n        var _ref12;\n\n        if (_isArray6) {\n          if (_i6 >= _iterator6.length) break;\n          _ref12 = _iterator6[_i6++];\n        } else {\n          _i6 = _iterator6.next();\n          if (_i6.done) break;\n          _ref12 = _i6.value;\n        }\n\n        const src = _ref12;\n\n        // insert new bin\n        const dest = path.join(binFolder, path.basename(src));\n        try {\n          yield (_fs || _load_fs()).unlink(dest);\n          yield (0, (_packageLinker || _load_packageLinker()).linkBin)(src, dest);\n          if (process.platform === 'win32' && dest.indexOf('.cmd') !== -1) {\n            yield (_fs || _load_fs()).rename(dest + '.cmd', dest);\n          }\n        } catch (err) {\n          throwPermError(err, dest);\n        }\n      }\n    });\n  });\n\n  return function initUpdateBins(_x7, _x8, _x9) {\n    return _ref9.apply(this, arguments);\n  };\n})();\n\nlet list = (() => {\n  var _ref13 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    yield updateCwd(config);\n\n    // install so we get hard file paths\n    const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.cwd);\n    const install = new (_install || _load_install()).Install({}, config, new (_baseReporter || _load_baseReporter()).default(), lockfile);\n    const patterns = yield install.getFlattenedDeps();\n\n    // dump global modules\n    for (var _iterator7 = patterns, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {\n      var _ref14;\n\n      if (_isArray7) {\n        if (_i7 >= _iterator7.length) break;\n        _ref14 = _iterator7[_i7++];\n      } else {\n        _i7 = _iterator7.next();\n        if (_i7.done) break;\n        _ref14 = _i7.value;\n      }\n\n      const pattern = _ref14;\n\n      const manifest = install.resolver.getStrictResolvedPattern(pattern);\n      ls(manifest, reporter, false);\n    }\n  });\n\n  return function list(_x10, _x11, _x12, _x13) {\n    return _ref13.apply(this, arguments);\n  };\n})();\n\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = __webpack_require__(58);\n}\n\nvar _baseReporter;\n\nfunction _load_baseReporter() {\n  return _baseReporter = _interopRequireDefault(__webpack_require__(108));\n}\n\nvar _buildSubCommands2;\n\nfunction _load_buildSubCommands() {\n  return _buildSubCommands2 = _interopRequireDefault(__webpack_require__(59));\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nvar _add;\n\nfunction _load_add() {\n  return _add = __webpack_require__(165);\n}\n\nvar _remove;\n\nfunction _load_remove() {\n  return _remove = __webpack_require__(353);\n}\n\nvar _upgrade;\n\nfunction _load_upgrade() {\n  return _upgrade = __webpack_require__(205);\n}\n\nvar _upgradeInteractive;\n\nfunction _load_upgradeInteractive() {\n  return _upgradeInteractive = __webpack_require__(356);\n}\n\nvar _packageLinker;\n\nfunction _load_packageLinker() {\n  return _packageLinker = __webpack_require__(209);\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass GlobalAdd extends (_add || _load_add()).Add {\n  constructor(args, flags, config, reporter, lockfile) {\n    super(args, flags, config, reporter, lockfile);\n\n    this.linker.setTopLevelBinLinking(false);\n  }\n\n  maybeOutputSaveTree() {\n    for (var _iterator = this.addedPatterns, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const pattern = _ref;\n\n      const manifest = this.resolver.getStrictResolvedPattern(pattern);\n      ls(manifest, this.reporter, true);\n    }\n    return Promise.resolve();\n  }\n\n  _logSuccessSaveLockfile() {\n    // noop\n  }\n}\n\nconst path = __webpack_require__(0);\n\nfunction hasWrapper(flags, args) {\n  return args[0] !== 'bin' && args[0] !== 'dir';\n}\n\nfunction ls(manifest, reporter, saved) {\n  const bins = manifest.bin ? Object.keys(manifest.bin) : [];\n  const human = `${manifest.name}@${manifest.version}`;\n  if (bins.length) {\n    if (saved) {\n      reporter.success(reporter.lang('packageInstalledWithBinaries', human));\n    } else {\n      reporter.info(reporter.lang('packageHasBinaries', human));\n    }\n    reporter.list(`bins-${manifest.name}`, bins);\n  } else if (saved) {\n    reporter.warn(reporter.lang('packageHasNoBinaries', human));\n  }\n}\n\nvar _buildSubCommands = (0, (_buildSubCommands2 || _load_buildSubCommands()).default)('global', {\n  add(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield updateCwd(config);\n\n      const updateBins = yield initUpdateBins(config, reporter, flags);\n      if (args.indexOf('yarn') !== -1) {\n        reporter.warn(reporter.lang('packageContainsYarnAsGlobal'));\n      }\n\n      // install module\n      const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.cwd);\n      const install = new GlobalAdd(args, flags, config, reporter, lockfile);\n      yield install.init();\n\n      // link binaries\n      yield updateBins();\n    })();\n  },\n\n  bin(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      reporter.log((yield getBinFolder(config, flags)), { force: true });\n    })();\n  },\n\n  dir(config, reporter, flags, args) {\n    reporter.log(config.globalFolder, { force: true });\n    return Promise.resolve();\n  },\n\n  ls(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      reporter.warn(`\\`yarn global ls\\` is deprecated. Please use \\`yarn global list\\`.`);\n      yield list(config, reporter, flags, args);\n    })();\n  },\n\n  list(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield list(config, reporter, flags, args);\n    })();\n  },\n\n  remove(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield updateCwd(config);\n\n      const updateBins = yield initUpdateBins(config, reporter, flags);\n\n      // remove module\n      yield (0, (_remove || _load_remove()).run)(config, reporter, flags, args);\n\n      // remove binaries\n      yield updateBins();\n    })();\n  },\n\n  upgrade(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield updateCwd(config);\n\n      const updateBins = yield initUpdateBins(config, reporter, flags);\n\n      // upgrade module\n      yield (0, (_upgrade || _load_upgrade()).run)(config, reporter, flags, args);\n\n      // update binaries\n      yield updateBins();\n    })();\n  },\n\n  upgradeInteractive(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield updateCwd(config);\n\n      const updateBins = yield initUpdateBins(config, reporter, flags);\n\n      // upgrade module\n      yield (0, (_upgradeInteractive || _load_upgradeInteractive()).run)(config, reporter, flags, args);\n\n      // update binaries\n      yield updateBins();\n    })();\n  }\n});\n\nconst run = _buildSubCommands.run,\n      _setFlags = _buildSubCommands.setFlags;\nexports.run = run;\nfunction setFlags(commander) {\n  _setFlags(commander);\n  commander.description('Installs packages globally on your operating system.');\n  commander.option('--prefix <prefix>', 'bin prefix to use to install binaries');\n  commander.option('--latest', 'upgrade to the latest version of packages');\n}\n\n/***/ }),\n/* 123 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _path;\n\nfunction _load_path() {\n  return _path = _interopRequireDefault(__webpack_require__(0));\n}\n\nvar _invariant;\n\nfunction _load_invariant() {\n  return _invariant = _interopRequireDefault(__webpack_require__(9));\n}\n\nvar _semver;\n\nfunction _load_semver() {\n  return _semver = _interopRequireDefault(__webpack_require__(22));\n}\n\nvar _validate;\n\nfunction _load_validate() {\n  return _validate = __webpack_require__(126);\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _packageReference;\n\nfunction _load_packageReference() {\n  return _packageReference = _interopRequireDefault(__webpack_require__(359));\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = __webpack_require__(78);\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _version;\n\nfunction _load_version() {\n  return _version = _interopRequireWildcard(__webpack_require__(223));\n}\n\nvar _workspaceResolver;\n\nfunction _load_workspaceResolver() {\n  return _workspaceResolver = _interopRequireDefault(__webpack_require__(538));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _normalizePattern4;\n\nfunction _load_normalizePattern() {\n  return _normalizePattern4 = __webpack_require__(37);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst micromatch = __webpack_require__(115);\n\nclass PackageRequest {\n  constructor(req, resolver) {\n    this.parentRequest = req.parentRequest;\n    this.parentNames = req.parentNames || [];\n    this.lockfile = resolver.lockfile;\n    this.registry = req.registry;\n    this.reporter = resolver.reporter;\n    this.resolver = resolver;\n    this.optional = req.optional;\n    this.hint = req.hint;\n    this.pattern = req.pattern;\n    this.config = resolver.config;\n    this.foundInfo = null;\n  }\n\n  init() {\n    this.resolver.usedRegistries.add(this.registry);\n  }\n\n  getLocked(remoteType) {\n    // always prioritise root lockfile\n    const shrunk = this.lockfile.getLocked(this.pattern);\n\n    if (shrunk && shrunk.resolved) {\n      const resolvedParts = (_version || _load_version()).explodeHashedUrl(shrunk.resolved);\n\n      // Detect Git protocols (git://HOST/PATH or git+PROTOCOL://HOST/PATH)\n      const preferredRemoteType = /^git(\\+[a-z0-9]+)?:\\/\\//.test(resolvedParts.url) ? 'git' : remoteType;\n\n      return {\n        name: shrunk.name,\n        version: shrunk.version,\n        _uid: shrunk.uid,\n        _remote: {\n          resolved: shrunk.resolved,\n          type: preferredRemoteType,\n          reference: resolvedParts.url,\n          hash: resolvedParts.hash,\n          integrity: shrunk.integrity,\n          registry: shrunk.registry,\n          packageName: shrunk.name\n        },\n        optionalDependencies: shrunk.optionalDependencies || {},\n        dependencies: shrunk.dependencies || {},\n        prebuiltVariants: shrunk.prebuiltVariants || {}\n      };\n    } else {\n      return null;\n    }\n  }\n\n  /**\n   * If the input pattern matches a registry one then attempt to find it on the registry.\n   * Otherwise fork off to an exotic resolver if one matches.\n   */\n\n  findVersionOnRegistry(pattern) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      var _ref = yield _this.normalize(pattern);\n\n      const range = _ref.range,\n            name = _ref.name;\n\n\n      const exoticResolver = (0, (_index || _load_index()).getExoticResolver)(range);\n      if (exoticResolver) {\n        let data = yield _this.findExoticVersionInfo(exoticResolver, range);\n\n        // clone data as we're manipulating it in place and this could be resolved multiple\n        // times\n        data = Object.assign({}, data);\n\n        // this is so the returned package response uses the overridden name. ie. if the\n        // package's actual name is `bar`, but it's been specified in the manifest like:\n        //   \"foo\": \"http://foo.com/bar.tar.gz\"\n        // then we use the foo name\n        data.name = name;\n        return data;\n      }\n\n      const Resolver = _this.getRegistryResolver();\n      const resolver = new Resolver(_this, name, range);\n      try {\n        return yield resolver.resolve();\n      } catch (err) {\n        // if it is not an error thrown by yarn and it has a parent request,\n        // thow a more readable error\n        if (!(err instanceof (_errors || _load_errors()).MessageError) && _this.parentRequest && _this.parentRequest.pattern) {\n          throw new (_errors || _load_errors()).MessageError(_this.reporter.lang('requiredPackageNotFoundRegistry', pattern, _this.parentRequest.pattern, _this.registry));\n        }\n        throw err;\n      }\n    })();\n  }\n\n  /**\n   * Get the registry resolver associated with this package request.\n   */\n\n  getRegistryResolver() {\n    const Resolver = (_index || _load_index()).registries[this.registry];\n    if (Resolver) {\n      return Resolver;\n    } else {\n      throw new (_errors || _load_errors()).MessageError(this.reporter.lang('unknownRegistryResolver', this.registry));\n    }\n  }\n\n  normalizeRange(pattern) {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      if (pattern.indexOf(':') > -1 || pattern.indexOf('@') > -1 || (0, (_index || _load_index()).getExoticResolver)(pattern)) {\n        return pattern;\n      }\n\n      if (!(_semver || _load_semver()).default.validRange(pattern)) {\n        try {\n          if (yield (_fs || _load_fs()).exists((_path || _load_path()).default.join(_this2.config.cwd, pattern, (_constants || _load_constants()).NODE_PACKAGE_JSON))) {\n            _this2.reporter.warn(_this2.reporter.lang('implicitFileDeprecated', pattern));\n            return `file:${pattern}`;\n          }\n        } catch (err) {\n          // pass\n        }\n      }\n\n      return pattern;\n    })();\n  }\n\n  normalize(pattern) {\n    var _this3 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      var _normalizePattern = (0, (_normalizePattern4 || _load_normalizePattern()).normalizePattern)(pattern);\n\n      const name = _normalizePattern.name,\n            range = _normalizePattern.range,\n            hasVersion = _normalizePattern.hasVersion;\n\n      const newRange = yield _this3.normalizeRange(range);\n      return { name, range: newRange, hasVersion };\n    })();\n  }\n\n  /**\n   * Construct an exotic resolver instance with the input `ExoticResolver` and `range`.\n   */\n\n  findExoticVersionInfo(ExoticResolver, range) {\n    const resolver = new ExoticResolver(this, range);\n    return resolver.resolve();\n  }\n\n  /**\n   * If the current pattern matches an exotic resolver then delegate to it or else try\n   * the registry.\n   */\n\n  findVersionInfo() {\n    var _this4 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const exoticResolver = (0, (_index || _load_index()).getExoticResolver)(_this4.pattern);\n      if (exoticResolver) {\n        return _this4.findExoticVersionInfo(exoticResolver, _this4.pattern);\n      } else if ((_workspaceResolver || _load_workspaceResolver()).default.isWorkspace(_this4.pattern, _this4.resolver.workspaceLayout)) {\n        (0, (_invariant || _load_invariant()).default)(_this4.resolver.workspaceLayout, 'expected workspaceLayout');\n        const resolver = new (_workspaceResolver || _load_workspaceResolver()).default(_this4, _this4.pattern, _this4.resolver.workspaceLayout);\n        let manifest;\n        if (_this4.config.focus && !_this4.pattern.includes(_this4.resolver.workspaceLayout.virtualManifestName) && !_this4.pattern.startsWith(_this4.config.focusedWorkspaceName + '@')) {\n          const localInfo = _this4.resolver.workspaceLayout.getManifestByPattern(_this4.pattern);\n          (0, (_invariant || _load_invariant()).default)(localInfo, 'expected local info for ' + _this4.pattern);\n          const localManifest = localInfo.manifest;\n          const requestPattern = localManifest.name + '@' + localManifest.version;\n          manifest = yield _this4.findVersionOnRegistry(requestPattern);\n        }\n        return resolver.resolve(manifest);\n      } else {\n        return _this4.findVersionOnRegistry(_this4.pattern);\n      }\n    })();\n  }\n\n  reportResolvedRangeMatch(info, resolved) {}\n\n  /**\n   * Do the final resolve of a package that had a match with an existing version.\n   * After all unique versions have been discovered, so the best available version\n   * is found.\n   */\n  resolveToExistingVersion(info) {\n    // get final resolved version\n    var _normalizePattern2 = (0, (_normalizePattern4 || _load_normalizePattern()).normalizePattern)(this.pattern);\n\n    const range = _normalizePattern2.range,\n          name = _normalizePattern2.name;\n\n    const solvedRange = (_semver || _load_semver()).default.validRange(range) ? info.version : range;\n    const resolved = this.resolver.getHighestRangeVersionMatch(name, solvedRange, info);\n    (0, (_invariant || _load_invariant()).default)(resolved, 'should have a resolved reference');\n\n    this.reportResolvedRangeMatch(info, resolved);\n    const ref = resolved._reference;\n    (0, (_invariant || _load_invariant()).default)(ref, 'Resolved package info has no package reference');\n    ref.addRequest(this);\n    ref.addPattern(this.pattern, resolved);\n    ref.addOptional(this.optional);\n  }\n\n  /**\n   * TODO description\n   */\n  find({ fresh, frozen }) {\n    var _this5 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      // find version info for this package pattern\n      const info = yield _this5.findVersionInfo();\n\n      if (!(_semver || _load_semver()).default.valid(info.version)) {\n        throw new (_errors || _load_errors()).MessageError(_this5.reporter.lang('invalidPackageVersion', info.name, info.version));\n      }\n\n      info.fresh = fresh;\n      (0, (_validate || _load_validate()).cleanDependencies)(info, false, _this5.reporter, function () {\n        // swallow warnings\n      });\n\n      // check if while we were resolving this dep we've already resolved one that satisfies\n      // the same range\n\n      var _normalizePattern3 = (0, (_normalizePattern4 || _load_normalizePattern()).normalizePattern)(_this5.pattern);\n\n      const range = _normalizePattern3.range,\n            name = _normalizePattern3.name;\n\n      const solvedRange = (_semver || _load_semver()).default.validRange(range) ? info.version : range;\n      const resolved = !info.fresh || frozen ? _this5.resolver.getExactVersionMatch(name, solvedRange, info) : _this5.resolver.getHighestRangeVersionMatch(name, solvedRange, info);\n\n      if (resolved) {\n        _this5.resolver.reportPackageWithExistingVersion(_this5, info);\n        return;\n      }\n\n      if (info.flat && !_this5.resolver.flat) {\n        throw new (_errors || _load_errors()).MessageError(_this5.reporter.lang('flatGlobalError', `${info.name}@${info.version}`));\n      }\n\n      // validate version info\n      PackageRequest.validateVersionInfo(info, _this5.reporter);\n\n      //\n      const remote = info._remote;\n      (0, (_invariant || _load_invariant()).default)(remote, 'Missing remote');\n\n      // set package reference\n      const ref = new (_packageReference || _load_packageReference()).default(_this5, info, remote);\n      ref.addPattern(_this5.pattern, info);\n      ref.addOptional(_this5.optional);\n      ref.setFresh(fresh);\n      info._reference = ref;\n      info._remote = remote;\n      // start installation of dependencies\n      const promises = [];\n      const deps = [];\n      const parentNames = [..._this5.parentNames, name];\n      // normal deps\n      for (const depName in info.dependencies) {\n        const depPattern = depName + '@' + info.dependencies[depName];\n        deps.push(depPattern);\n        promises.push(_this5.resolver.find({\n          pattern: depPattern,\n          registry: remote.registry,\n          // dependencies of optional dependencies should themselves be optional\n          optional: _this5.optional,\n          parentRequest: _this5,\n          parentNames\n        }));\n      }\n\n      // optional deps\n      for (const depName in info.optionalDependencies) {\n        const depPattern = depName + '@' + info.optionalDependencies[depName];\n        deps.push(depPattern);\n        promises.push(_this5.resolver.find({\n          hint: 'optional',\n          pattern: depPattern,\n          registry: remote.registry,\n          optional: true,\n          parentRequest: _this5,\n          parentNames\n        }));\n      }\n      if (remote.type === 'workspace' && !_this5.config.production) {\n        // workspaces support dev dependencies\n        for (const depName in info.devDependencies) {\n          const depPattern = depName + '@' + info.devDependencies[depName];\n          deps.push(depPattern);\n          promises.push(_this5.resolver.find({\n            hint: 'dev',\n            pattern: depPattern,\n            registry: remote.registry,\n            optional: false,\n            parentRequest: _this5,\n            parentNames\n          }));\n        }\n      }\n\n      for (var _iterator = promises, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref2;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref2 = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref2 = _i.value;\n        }\n\n        const promise = _ref2;\n\n        yield promise;\n      }\n\n      ref.addDependencies(deps);\n\n      // Now that we have all dependencies, it's safe to propagate optional\n      for (var _iterator2 = ref.requests.slice(1), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref3;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref3 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref3 = _i2.value;\n        }\n\n        const otherRequest = _ref3;\n\n        ref.addOptional(otherRequest.optional);\n      }\n    })();\n  }\n\n  /**\n   * TODO description\n   */\n\n  static validateVersionInfo(info, reporter) {\n    // human readable name to use in errors\n    const human = `${info.name}@${info.version}`;\n\n    info.version = PackageRequest.getPackageVersion(info);\n\n    for (var _iterator3 = (_constants || _load_constants()).REQUIRED_PACKAGE_KEYS, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n      var _ref4;\n\n      if (_isArray3) {\n        if (_i3 >= _iterator3.length) break;\n        _ref4 = _iterator3[_i3++];\n      } else {\n        _i3 = _iterator3.next();\n        if (_i3.done) break;\n        _ref4 = _i3.value;\n      }\n\n      const key = _ref4;\n\n      if (!info[key]) {\n        throw new (_errors || _load_errors()).MessageError(reporter.lang('missingRequiredPackageKey', human, key));\n      }\n    }\n  }\n\n  /**\n   * Returns the package version if present, else defaults to the uid\n   */\n\n  static getPackageVersion(info) {\n    // TODO possibly reconsider this behaviour\n    return info.version === undefined ? info._uid : info.version;\n  }\n\n  /**\n   * Gets all of the outdated packages and sorts them appropriately\n   */\n\n  static getOutdatedPackages(lockfile, install, config, reporter, filterByPatterns, flags) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      var _ref5 = yield install.fetchRequestFromCwd();\n\n      const reqPatterns = _ref5.requests,\n            workspaceLayout = _ref5.workspaceLayout;\n\n      // Filter out workspace patterns if necessary\n\n      let depReqPatterns = workspaceLayout ? reqPatterns.filter(function (p) {\n        return !workspaceLayout.getManifestByPattern(p.pattern);\n      }) : reqPatterns;\n\n      // filter the list down to just the packages requested.\n      // prevents us from having to query the metadata for all packages.\n      if (filterByPatterns && filterByPatterns.length || flags && flags.pattern) {\n        const filterByNames = filterByPatterns && filterByPatterns.length ? filterByPatterns.map(function (pattern) {\n          return (0, (_normalizePattern4 || _load_normalizePattern()).normalizePattern)(pattern).name;\n        }) : [];\n        depReqPatterns = depReqPatterns.filter(function (dep) {\n          return filterByNames.indexOf((0, (_normalizePattern4 || _load_normalizePattern()).normalizePattern)(dep.pattern).name) >= 0 || flags && flags.pattern && micromatch.contains((0, (_normalizePattern4 || _load_normalizePattern()).normalizePattern)(dep.pattern).name, flags.pattern);\n        });\n      }\n\n      const deps = yield Promise.all(depReqPatterns.map((() => {\n        var _ref6 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ({ pattern, hint, workspaceName, workspaceLoc }) {\n          const locked = lockfile.getLocked(pattern);\n          if (!locked) {\n            throw new (_errors || _load_errors()).MessageError(reporter.lang('lockfileOutdated'));\n          }\n\n          const name = locked.name,\n                current = locked.version;\n\n          let latest = '';\n          let wanted = '';\n          let url = '';\n\n          const normalized = (0, (_normalizePattern4 || _load_normalizePattern()).normalizePattern)(pattern);\n\n          if ((0, (_index || _load_index()).getExoticResolver)(pattern) || (0, (_index || _load_index()).getExoticResolver)(normalized.range)) {\n            latest = wanted = 'exotic';\n            url = normalized.range;\n          } else {\n            const registry = config.registries[locked.registry];\n\n            var _ref7 = yield registry.checkOutdated(config, name, normalized.range);\n\n            latest = _ref7.latest;\n            wanted = _ref7.wanted;\n            url = _ref7.url;\n          }\n\n          return {\n            name,\n            current,\n            wanted,\n            latest,\n            url,\n            hint,\n            range: normalized.range,\n            upgradeTo: '',\n            workspaceName: workspaceName || '',\n            workspaceLoc: workspaceLoc || ''\n          };\n        });\n\n        return function (_x) {\n          return _ref6.apply(this, arguments);\n        };\n      })()));\n\n      // Make sure to always output `exotic` versions to be compatible with npm\n      const isDepOld = function isDepOld({ current, latest, wanted }) {\n        return latest === 'exotic' || (_semver || _load_semver()).default.lt(current, wanted) || (_semver || _load_semver()).default.lt(current, latest);\n      };\n      const orderByName = function orderByName(depA, depB) {\n        return depA.name.localeCompare(depB.name);\n      };\n      return deps.filter(isDepOld).sort(orderByName);\n    })();\n  }\n}\nexports.default = PackageRequest;\n\n/***/ }),\n/* 124 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nclass BaseResolver {\n  constructor(request, fragment) {\n    this.resolver = request.resolver;\n    this.reporter = request.reporter;\n    this.fragment = fragment;\n    this.registry = request.registry;\n    this.request = request;\n    this.pattern = request.pattern;\n    this.config = request.config;\n  }\n\n  fork(Resolver, resolveArg, ...args) {\n    const resolver = new Resolver(this.request, ...args);\n    resolver.registry = this.registry;\n    return resolver.resolve(resolveArg);\n  }\n\n  resolve(resolveArg) {\n    throw new Error('Not implemented');\n  }\n}\nexports.default = BaseResolver;\n\n/***/ }),\n/* 125 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = __webpack_require__(78);\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = _interopRequireWildcard(__webpack_require__(18));\n}\n\nvar _version;\n\nfunction _load_version() {\n  return _version = _interopRequireWildcard(__webpack_require__(223));\n}\n\nvar _guessName;\n\nfunction _load_guessName() {\n  return _guessName = _interopRequireDefault(__webpack_require__(169));\n}\n\nvar _index2;\n\nfunction _load_index2() {\n  return _index2 = __webpack_require__(58);\n}\n\nvar _exoticResolver;\n\nfunction _load_exoticResolver() {\n  return _exoticResolver = _interopRequireDefault(__webpack_require__(89));\n}\n\nvar _git;\n\nfunction _load_git() {\n  return _git = _interopRequireDefault(__webpack_require__(217));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst urlParse = __webpack_require__(24).parse;\n\nconst GIT_HOSTS = ['github.com', 'gitlab.com', 'bitbucket.com', 'bitbucket.org'];\n\nconst GIT_PATTERN_MATCHERS = [/^git:/, /^git\\+.+:/, /^ssh:/, /^https?:.+\\.git$/, /^https?:.+\\.git#.+/];\n\nclass GitResolver extends (_exoticResolver || _load_exoticResolver()).default {\n  constructor(request, fragment) {\n    super(request, fragment);\n\n    var _versionUtil$explodeH = (_version || _load_version()).explodeHashedUrl(fragment);\n\n    const url = _versionUtil$explodeH.url,\n          hash = _versionUtil$explodeH.hash;\n\n    this.url = url;\n    this.hash = hash;\n  }\n\n  static isVersion(pattern) {\n    for (var _iterator = GIT_PATTERN_MATCHERS, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const matcher = _ref;\n\n      if (matcher.test(pattern)) {\n        return true;\n      }\n    }\n\n    var _urlParse = urlParse(pattern);\n\n    const hostname = _urlParse.hostname,\n          path = _urlParse.path;\n\n    if (hostname && path && GIT_HOSTS.indexOf(hostname) >= 0) {\n      // only if dependency is pointing to a git repo,\n      // e.g. facebook/flow and not file in a git repo facebook/flow/archive/v1.0.0.tar.gz\n      return path.split('/').filter(p => !!p).length === 2;\n    }\n\n    return false;\n  }\n\n  resolve(forked) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      let tryRegistry = (() => {\n        var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (registry) {\n          const filename = (_index2 || _load_index2()).registries[registry].filename;\n\n          const file = yield client.getFile(filename);\n          if (!file) {\n            return null;\n          }\n\n          const json = yield config.readJson(`${url}/${filename}`, function () {\n            return JSON.parse(file);\n          });\n          json._uid = commit;\n          json._remote = {\n            resolved: `${url}#${commit}`,\n            type: 'git',\n            reference: url,\n            hash: commit,\n            registry\n          };\n          return json;\n        });\n\n        return function tryRegistry(_x) {\n          return _ref2.apply(this, arguments);\n        };\n      })();\n\n      const url = _this.url;\n\n      // shortcut for hosted git. we will fallback to a GitResolver if the hosted git\n      // optimisations fail which the `forked` flag indicates so we don't get into an\n      // infinite loop\n\n      const parts = urlParse(url);\n      if (false) {\n        // check if this git url uses any of the hostnames defined in our hosted git resolvers\n        for (const name in (_index || _load_index()).hostedGit) {\n          const Resolver = (_index || _load_index()).hostedGit[name];\n          if (Resolver.hostname !== parts.hostname) {\n            continue;\n          }\n\n          // we have a match! clean up the pathname of url artifacts\n          let pathname = parts.pathname;\n          pathname = (_misc || _load_misc()).removePrefix(pathname, '/'); // remove prefixed slash\n          pathname = (_misc || _load_misc()).removeSuffix(pathname, '.git'); // remove .git suffix if present\n\n          const url = `${pathname}${_this.hash ? '#' + decodeURIComponent(_this.hash) : ''}`;\n          return _this.fork(Resolver, false, url);\n        }\n      }\n\n      // get from lockfile\n      const shrunk = _this.request.getLocked('git');\n      if (shrunk) {\n        return shrunk;\n      }\n\n      const config = _this.config;\n\n\n      const gitUrl = (_git || _load_git()).default.npmUrlToGitUrl(url);\n      const client = new (_git || _load_git()).default(config, gitUrl, _this.hash);\n      const commit = yield client.init();\n\n      const file = yield tryRegistry(_this.registry);\n      if (file) {\n        return file;\n      }\n\n      for (const registry in (_index2 || _load_index2()).registries) {\n        if (registry === _this.registry) {\n          continue;\n        }\n\n        const file = yield tryRegistry(registry);\n        if (file) {\n          return file;\n        }\n      }\n\n      return {\n        // This is just the default, it can be overridden with key of dependencies\n        name: (0, (_guessName || _load_guessName()).default)(url),\n        version: '0.0.0',\n        _uid: commit,\n        _remote: {\n          resolved: `${url}#${commit}`,\n          type: 'git',\n          reference: url,\n          hash: commit,\n          registry: 'npm'\n        }\n      };\n    })();\n  }\n}\nexports.default = GitResolver;\n\n/***/ }),\n/* 126 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isValidPackageName = isValidPackageName;\n\nexports.default = function (info, isRoot, reporter, warn) {\n  if (isRoot) {\n    for (const key in (_typos || _load_typos()).default) {\n      if (key in info) {\n        warn(reporter.lang('manifestPotentialTypo', key, (_typos || _load_typos()).default[key]));\n      }\n    }\n  }\n\n  // validate name\n  const name = info.name;\n\n  if (typeof name === 'string') {\n    if (isRoot && isBuiltinModule(name)) {\n      warn(reporter.lang('manifestBuiltinModule', name));\n    }\n\n    // cannot start with a dot\n    if (name[0] === '.') {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('manifestNameDot'));\n    }\n\n    // cannot contain the following characters\n    if (!isValidPackageName(name)) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('manifestNameIllegalChars'));\n    }\n\n    // cannot equal node_modules or favicon.ico\n    const lower = name.toLowerCase();\n    if (lower === 'node_modules' || lower === 'favicon.ico') {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('manifestNameBlacklisted'));\n    }\n  }\n\n  // validate license\n  if (isRoot && !info.private) {\n    if (typeof info.license === 'string') {\n      const license = info.license.replace(/\\*$/g, '');\n      if (!(0, (_util || _load_util()).isValidLicense)(license)) {\n        warn(reporter.lang('manifestLicenseInvalid'));\n      }\n    } else {\n      warn(reporter.lang('manifestLicenseNone'));\n    }\n  }\n\n  // validate strings\n  for (var _iterator = strings, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n    var _ref;\n\n    if (_isArray) {\n      if (_i >= _iterator.length) break;\n      _ref = _iterator[_i++];\n    } else {\n      _i = _iterator.next();\n      if (_i.done) break;\n      _ref = _i.value;\n    }\n\n    const key = _ref;\n\n    const val = info[key];\n    if (val && typeof val !== 'string') {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('manifestStringExpected', key));\n    }\n  }\n\n  cleanDependencies(info, isRoot, reporter, warn);\n};\n\nexports.cleanDependencies = cleanDependencies;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _util;\n\nfunction _load_util() {\n  return _util = __webpack_require__(219);\n}\n\nvar _typos;\n\nfunction _load_typos() {\n  return _typos = _interopRequireDefault(__webpack_require__(555));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst isBuiltinModule = __webpack_require__(730);\n\nconst strings = ['name', 'version'];\n\nconst dependencyKeys = [\n// npm registry will include optionalDependencies in dependencies and we'll want to dedupe them from the\n// other fields first\n'optionalDependencies',\n\n// it's seemingly common to include a dependency in dependencies and devDependencies of the same name but\n// different ranges, this can cause a lot of issues with our determinism and the behaviour of npm is\n// currently unspecified.\n'dependencies', 'devDependencies'];\n\nfunction isValidName(name) {\n  return !name.match(/[\\/@\\s\\+%:]/) && encodeURIComponent(name) === name;\n}\n\nfunction isValidScopedName(name) {\n  if (name[0] !== '@') {\n    return false;\n  }\n\n  const parts = name.slice(1).split('/');\n  return parts.length === 2 && isValidName(parts[0]) && isValidName(parts[1]);\n}\n\nfunction isValidPackageName(name) {\n  return isValidName(name) || isValidScopedName(name);\n}\n\nfunction cleanDependencies(info, isRoot, reporter, warn) {\n  // get dependency objects\n  const depTypes = [];\n  for (var _iterator2 = dependencyKeys, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n    var _ref2;\n\n    if (_isArray2) {\n      if (_i2 >= _iterator2.length) break;\n      _ref2 = _iterator2[_i2++];\n    } else {\n      _i2 = _iterator2.next();\n      if (_i2.done) break;\n      _ref2 = _i2.value;\n    }\n\n    const type = _ref2;\n\n    const deps = info[type];\n    if (!deps || typeof deps !== 'object') {\n      continue;\n    }\n    depTypes.push([type, deps]);\n  }\n\n  // aggregate all non-trivial deps (not '' or '*')\n  const nonTrivialDeps = new Map();\n  for (var _iterator3 = depTypes, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n    var _ref4;\n\n    if (_isArray3) {\n      if (_i3 >= _iterator3.length) break;\n      _ref4 = _iterator3[_i3++];\n    } else {\n      _i3 = _iterator3.next();\n      if (_i3.done) break;\n      _ref4 = _i3.value;\n    }\n\n    const _ref3 = _ref4;\n    const type = _ref3[0];\n    const deps = _ref3[1];\n\n    for (var _iterator5 = Object.keys(deps), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n      var _ref7;\n\n      if (_isArray5) {\n        if (_i5 >= _iterator5.length) break;\n        _ref7 = _iterator5[_i5++];\n      } else {\n        _i5 = _iterator5.next();\n        if (_i5.done) break;\n        _ref7 = _i5.value;\n      }\n\n      const name = _ref7;\n\n      const version = deps[name];\n      if (!nonTrivialDeps.has(name) && version && version !== '*') {\n        nonTrivialDeps.set(name, { type, version });\n      }\n    }\n  }\n\n  // overwrite first dep of package with non-trivial version, remove the rest\n  const setDeps = new Set();\n  for (var _iterator4 = depTypes, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n    var _ref6;\n\n    if (_isArray4) {\n      if (_i4 >= _iterator4.length) break;\n      _ref6 = _iterator4[_i4++];\n    } else {\n      _i4 = _iterator4.next();\n      if (_i4.done) break;\n      _ref6 = _i4.value;\n    }\n\n    const _ref5 = _ref6;\n    const type = _ref5[0];\n    const deps = _ref5[1];\n\n    for (var _iterator6 = Object.keys(deps), _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n      var _ref8;\n\n      if (_isArray6) {\n        if (_i6 >= _iterator6.length) break;\n        _ref8 = _iterator6[_i6++];\n      } else {\n        _i6 = _iterator6.next();\n        if (_i6.done) break;\n        _ref8 = _i6.value;\n      }\n\n      const name = _ref8;\n\n      let version = deps[name];\n\n      const dep = nonTrivialDeps.get(name);\n      if (dep) {\n        if (version && version !== '*' && version !== dep.version && isRoot) {\n          // only throw a warning when at the root\n          warn(reporter.lang('manifestDependencyCollision', dep.type, name, dep.version, type, version));\n        }\n        version = dep.version;\n      }\n\n      if (setDeps.has(name)) {\n        delete deps[name];\n      } else {\n        deps[name] = version;\n        setDeps.add(name);\n      }\n    }\n  }\n}\n\n/***/ }),\n/* 127 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = __webpack_require__(69);\nvar TAG = __webpack_require__(21)('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n  try {\n    return it[key];\n  } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n    // @@toStringTag case\n    : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n    // builtinTag case\n    : ARG ? cof(O)\n    // ES3 arguments fallback\n    : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n\n/***/ }),\n/* 128 */\n/***/ (function(module, exports) {\n\n// IE 8- don't enum bug keys\nmodule.exports = (\n  'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n\n/***/ }),\n/* 129 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar document = __webpack_require__(17).document;\nmodule.exports = document && document.documentElement;\n\n\n/***/ }),\n/* 130 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(93);\nvar $export = __webpack_require__(60);\nvar redefine = __webpack_require__(248);\nvar hide = __webpack_require__(43);\nvar Iterators = __webpack_require__(54);\nvar $iterCreate = __webpack_require__(239);\nvar setToStringTag = __webpack_require__(95);\nvar getPrototypeOf = __webpack_require__(245);\nvar ITERATOR = __webpack_require__(21)('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function (kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS: return function keys() { return new Constructor(this, kind); };\n      case VALUES: return function values() { return new Constructor(this, kind); };\n    } return function entries() { return new Constructor(this, kind); };\n  };\n  var TAG = NAME + ' Iterator';\n  var DEF_VALUES = DEFAULT == VALUES;\n  var VALUES_BUG = false;\n  var proto = Base.prototype;\n  var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n  var $default = $native || getMethod(DEFAULT);\n  var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n  var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n  var methods, key, IteratorPrototype;\n  // Fix native\n  if ($anyNative) {\n    IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n    if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n      // Set @@toStringTag to native iterators\n      setToStringTag(IteratorPrototype, TAG, true);\n      // fix for some old engines\n      if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n    }\n  }\n  // fix Array#{values, @@iterator}.name in V8 / FF\n  if (DEF_VALUES && $native && $native.name !== VALUES) {\n    VALUES_BUG = true;\n    $default = function values() { return $native.call(this); };\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: $entries\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n\n\n/***/ }),\n/* 131 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (exec) {\n  try {\n    return { e: false, v: exec() };\n  } catch (e) {\n    return { e: true, v: e };\n  }\n};\n\n\n/***/ }),\n/* 132 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar anObject = __webpack_require__(35);\nvar isObject = __webpack_require__(53);\nvar newPromiseCapability = __webpack_require__(94);\n\nmodule.exports = function (C, x) {\n  anObject(C);\n  if (isObject(x) && x.constructor === C) return x;\n  var promiseCapability = newPromiseCapability.f(C);\n  var resolve = promiseCapability.resolve;\n  resolve(x);\n  return promiseCapability.promise;\n};\n\n\n/***/ }),\n/* 133 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n\n/***/ }),\n/* 134 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar core = __webpack_require__(31);\nvar global = __webpack_require__(17);\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n  return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n  version: core.version,\n  mode: __webpack_require__(93) ? 'pure' : 'global',\n  copyright: '© 2018 Denis Pushkarev (zloirock.ru)'\n});\n\n\n/***/ }),\n/* 135 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = __webpack_require__(35);\nvar aFunction = __webpack_require__(68);\nvar SPECIES = __webpack_require__(21)('species');\nmodule.exports = function (O, D) {\n  var C = anObject(O).constructor;\n  var S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n\n\n/***/ }),\n/* 136 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(70);\nvar invoke = __webpack_require__(236);\nvar html = __webpack_require__(129);\nvar cel = __webpack_require__(92);\nvar global = __webpack_require__(17);\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n  var id = +this;\n  // eslint-disable-next-line no-prototype-builtins\n  if (queue.hasOwnProperty(id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\nvar listener = function (event) {\n  run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n  setTask = function setImmediate(fn) {\n    var args = [];\n    var i = 1;\n    while (arguments.length > i) args.push(arguments[i++]);\n    queue[++counter] = function () {\n      // eslint-disable-next-line no-new-func\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clearTask = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (__webpack_require__(69)(process) == 'process') {\n    defer = function (id) {\n      process.nextTick(ctx(run, id, 1));\n    };\n  // Sphere (JS game engine) Dispatch API\n  } else if (Dispatch && Dispatch.now) {\n    defer = function (id) {\n      Dispatch.now(ctx(run, id, 1));\n    };\n  // Browsers with MessageChannel, includes WebWorkers\n  } else if (MessageChannel) {\n    channel = new MessageChannel();\n    port = channel.port2;\n    channel.port1.onmessage = listener;\n    defer = ctx(port.postMessage, port, 1);\n  // Browsers with postMessage, skip WebWorkers\n  // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n  } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n    defer = function (id) {\n      global.postMessage(id + '', '*');\n    };\n    global.addEventListener('message', listener, false);\n  // IE8-\n  } else if (ONREADYSTATECHANGE in cel('script')) {\n    defer = function (id) {\n      html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n        html.removeChild(this);\n        run.call(id);\n      };\n    };\n  // Rest old browsers\n  } else {\n    defer = function (id) {\n      setTimeout(ctx(run, id, 1), 0);\n    };\n  }\n}\nmodule.exports = {\n  set: setTask,\n  clear: clearTask\n};\n\n\n/***/ }),\n/* 137 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.15 ToLength\nvar toInteger = __webpack_require__(97);\nvar min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n\n/***/ }),\n/* 138 */\n/***/ (function(module, exports) {\n\nvar id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n\n/***/ }),\n/* 139 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = __webpack_require__(301);\n\n/**\n * Active `debug` instances.\n */\nexports.instances = [];\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n  var hash = 0, i;\n\n  for (i in namespace) {\n    hash  = ((hash << 5) - hash) + namespace.charCodeAt(i);\n    hash |= 0; // Convert to 32bit integer\n  }\n\n  return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n  var prevTime;\n\n  function debug() {\n    // disabled?\n    if (!debug.enabled) return;\n\n    var self = debug;\n\n    // set `diff` timestamp\n    var curr = +new Date();\n    var ms = curr - (prevTime || curr);\n    self.diff = ms;\n    self.prev = prevTime;\n    self.curr = curr;\n    prevTime = curr;\n\n    // turn the `arguments` into a proper Array\n    var args = new Array(arguments.length);\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i];\n    }\n\n    args[0] = exports.coerce(args[0]);\n\n    if ('string' !== typeof args[0]) {\n      // anything else let's inspect with %O\n      args.unshift('%O');\n    }\n\n    // apply any `formatters` transformations\n    var index = 0;\n    args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n      // if we encounter an escaped % then don't increase the array index\n      if (match === '%%') return match;\n      index++;\n      var formatter = exports.formatters[format];\n      if ('function' === typeof formatter) {\n        var val = args[index];\n        match = formatter.call(self, val);\n\n        // now we need to remove `args[index]` since it's inlined in the `format`\n        args.splice(index, 1);\n        index--;\n      }\n      return match;\n    });\n\n    // apply env-specific formatting (colors, etc.)\n    exports.formatArgs.call(self, args);\n\n    var logFn = debug.log || exports.log || console.log.bind(console);\n    logFn.apply(self, args);\n  }\n\n  debug.namespace = namespace;\n  debug.enabled = exports.enabled(namespace);\n  debug.useColors = exports.useColors();\n  debug.color = selectColor(namespace);\n  debug.destroy = destroy;\n\n  // env-specific initialization logic for debug instances\n  if ('function' === typeof exports.init) {\n    exports.init(debug);\n  }\n\n  exports.instances.push(debug);\n\n  return debug;\n}\n\nfunction destroy () {\n  var index = exports.instances.indexOf(this);\n  if (index !== -1) {\n    exports.instances.splice(index, 1);\n    return true;\n  } else {\n    return false;\n  }\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n  exports.save(namespaces);\n\n  exports.names = [];\n  exports.skips = [];\n\n  var i;\n  var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n  var len = split.length;\n\n  for (i = 0; i < len; i++) {\n    if (!split[i]) continue; // ignore empty strings\n    namespaces = split[i].replace(/\\*/g, '.*?');\n    if (namespaces[0] === '-') {\n      exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n    } else {\n      exports.names.push(new RegExp('^' + namespaces + '$'));\n    }\n  }\n\n  for (i = 0; i < exports.instances.length; i++) {\n    var instance = exports.instances[i];\n    instance.enabled = exports.enabled(instance.namespace);\n  }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n  exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n  if (name[name.length - 1] === '*') {\n    return true;\n  }\n  var i, len;\n  for (i = 0, len = exports.skips.length; i < len; i++) {\n    if (exports.skips[i].test(name)) {\n      return false;\n    }\n  }\n  for (i = 0, len = exports.names.length; i < len; i++) {\n    if (exports.names[i].test(name)) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n  if (val instanceof Error) return val.stack || val.message;\n  return val;\n}\n\n\n/***/ }),\n/* 140 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Basic Javascript Elliptic Curve implementation\n// Ported loosely from BouncyCastle's Java EC code\n// Only Fp curves implemented for now\n\n// Requires jsbn.js and jsbn2.js\nvar BigInteger = __webpack_require__(81).BigInteger\nvar Barrett = BigInteger.prototype.Barrett\n\n// ----------------\n// ECFieldElementFp\n\n// constructor\nfunction ECFieldElementFp(q,x) {\n    this.x = x;\n    // TODO if(x.compareTo(q) >= 0) error\n    this.q = q;\n}\n\nfunction feFpEquals(other) {\n    if(other == this) return true;\n    return (this.q.equals(other.q) && this.x.equals(other.x));\n}\n\nfunction feFpToBigInteger() {\n    return this.x;\n}\n\nfunction feFpNegate() {\n    return new ECFieldElementFp(this.q, this.x.negate().mod(this.q));\n}\n\nfunction feFpAdd(b) {\n    return new ECFieldElementFp(this.q, this.x.add(b.toBigInteger()).mod(this.q));\n}\n\nfunction feFpSubtract(b) {\n    return new ECFieldElementFp(this.q, this.x.subtract(b.toBigInteger()).mod(this.q));\n}\n\nfunction feFpMultiply(b) {\n    return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger()).mod(this.q));\n}\n\nfunction feFpSquare() {\n    return new ECFieldElementFp(this.q, this.x.square().mod(this.q));\n}\n\nfunction feFpDivide(b) {\n    return new ECFieldElementFp(this.q, this.x.multiply(b.toBigInteger().modInverse(this.q)).mod(this.q));\n}\n\nECFieldElementFp.prototype.equals = feFpEquals;\nECFieldElementFp.prototype.toBigInteger = feFpToBigInteger;\nECFieldElementFp.prototype.negate = feFpNegate;\nECFieldElementFp.prototype.add = feFpAdd;\nECFieldElementFp.prototype.subtract = feFpSubtract;\nECFieldElementFp.prototype.multiply = feFpMultiply;\nECFieldElementFp.prototype.square = feFpSquare;\nECFieldElementFp.prototype.divide = feFpDivide;\n\n// ----------------\n// ECPointFp\n\n// constructor\nfunction ECPointFp(curve,x,y,z) {\n    this.curve = curve;\n    this.x = x;\n    this.y = y;\n    // Projective coordinates: either zinv == null or z * zinv == 1\n    // z and zinv are just BigIntegers, not fieldElements\n    if(z == null) {\n      this.z = BigInteger.ONE;\n    }\n    else {\n      this.z = z;\n    }\n    this.zinv = null;\n    //TODO: compression flag\n}\n\nfunction pointFpGetX() {\n    if(this.zinv == null) {\n      this.zinv = this.z.modInverse(this.curve.q);\n    }\n    var r = this.x.toBigInteger().multiply(this.zinv);\n    this.curve.reduce(r);\n    return this.curve.fromBigInteger(r);\n}\n\nfunction pointFpGetY() {\n    if(this.zinv == null) {\n      this.zinv = this.z.modInverse(this.curve.q);\n    }\n    var r = this.y.toBigInteger().multiply(this.zinv);\n    this.curve.reduce(r);\n    return this.curve.fromBigInteger(r);\n}\n\nfunction pointFpEquals(other) {\n    if(other == this) return true;\n    if(this.isInfinity()) return other.isInfinity();\n    if(other.isInfinity()) return this.isInfinity();\n    var u, v;\n    // u = Y2 * Z1 - Y1 * Z2\n    u = other.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(other.z)).mod(this.curve.q);\n    if(!u.equals(BigInteger.ZERO)) return false;\n    // v = X2 * Z1 - X1 * Z2\n    v = other.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(other.z)).mod(this.curve.q);\n    return v.equals(BigInteger.ZERO);\n}\n\nfunction pointFpIsInfinity() {\n    if((this.x == null) && (this.y == null)) return true;\n    return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO);\n}\n\nfunction pointFpNegate() {\n    return new ECPointFp(this.curve, this.x, this.y.negate(), this.z);\n}\n\nfunction pointFpAdd(b) {\n    if(this.isInfinity()) return b;\n    if(b.isInfinity()) return this;\n\n    // u = Y2 * Z1 - Y1 * Z2\n    var u = b.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(b.z)).mod(this.curve.q);\n    // v = X2 * Z1 - X1 * Z2\n    var v = b.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(b.z)).mod(this.curve.q);\n\n    if(BigInteger.ZERO.equals(v)) {\n        if(BigInteger.ZERO.equals(u)) {\n            return this.twice(); // this == b, so double\n        }\n\treturn this.curve.getInfinity(); // this = -b, so infinity\n    }\n\n    var THREE = new BigInteger(\"3\");\n    var x1 = this.x.toBigInteger();\n    var y1 = this.y.toBigInteger();\n    var x2 = b.x.toBigInteger();\n    var y2 = b.y.toBigInteger();\n\n    var v2 = v.square();\n    var v3 = v2.multiply(v);\n    var x1v2 = x1.multiply(v2);\n    var zu2 = u.square().multiply(this.z);\n\n    // x3 = v * (z2 * (z1 * u^2 - 2 * x1 * v^2) - v^3)\n    var x3 = zu2.subtract(x1v2.shiftLeft(1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.q);\n    // y3 = z2 * (3 * x1 * u * v^2 - y1 * v^3 - z1 * u^3) + u * v^3\n    var y3 = x1v2.multiply(THREE).multiply(u).subtract(y1.multiply(v3)).subtract(zu2.multiply(u)).multiply(b.z).add(u.multiply(v3)).mod(this.curve.q);\n    // z3 = v^3 * z1 * z2\n    var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.q);\n\n    return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);\n}\n\nfunction pointFpTwice() {\n    if(this.isInfinity()) return this;\n    if(this.y.toBigInteger().signum() == 0) return this.curve.getInfinity();\n\n    // TODO: optimized handling of constants\n    var THREE = new BigInteger(\"3\");\n    var x1 = this.x.toBigInteger();\n    var y1 = this.y.toBigInteger();\n\n    var y1z1 = y1.multiply(this.z);\n    var y1sqz1 = y1z1.multiply(y1).mod(this.curve.q);\n    var a = this.curve.a.toBigInteger();\n\n    // w = 3 * x1^2 + a * z1^2\n    var w = x1.square().multiply(THREE);\n    if(!BigInteger.ZERO.equals(a)) {\n      w = w.add(this.z.square().multiply(a));\n    }\n    w = w.mod(this.curve.q);\n    //this.curve.reduce(w);\n    // x3 = 2 * y1 * z1 * (w^2 - 8 * x1 * y1^2 * z1)\n    var x3 = w.square().subtract(x1.shiftLeft(3).multiply(y1sqz1)).shiftLeft(1).multiply(y1z1).mod(this.curve.q);\n    // y3 = 4 * y1^2 * z1 * (3 * w * x1 - 2 * y1^2 * z1) - w^3\n    var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(1)).shiftLeft(2).multiply(y1sqz1).subtract(w.square().multiply(w)).mod(this.curve.q);\n    // z3 = 8 * (y1 * z1)^3\n    var z3 = y1z1.square().multiply(y1z1).shiftLeft(3).mod(this.curve.q);\n\n    return new ECPointFp(this.curve, this.curve.fromBigInteger(x3), this.curve.fromBigInteger(y3), z3);\n}\n\n// Simple NAF (Non-Adjacent Form) multiplication algorithm\n// TODO: modularize the multiplication algorithm\nfunction pointFpMultiply(k) {\n    if(this.isInfinity()) return this;\n    if(k.signum() == 0) return this.curve.getInfinity();\n\n    var e = k;\n    var h = e.multiply(new BigInteger(\"3\"));\n\n    var neg = this.negate();\n    var R = this;\n\n    var i;\n    for(i = h.bitLength() - 2; i > 0; --i) {\n\tR = R.twice();\n\n\tvar hBit = h.testBit(i);\n\tvar eBit = e.testBit(i);\n\n\tif (hBit != eBit) {\n\t    R = R.add(hBit ? this : neg);\n\t}\n    }\n\n    return R;\n}\n\n// Compute this*j + x*k (simultaneous multiplication)\nfunction pointFpMultiplyTwo(j,x,k) {\n  var i;\n  if(j.bitLength() > k.bitLength())\n    i = j.bitLength() - 1;\n  else\n    i = k.bitLength() - 1;\n\n  var R = this.curve.getInfinity();\n  var both = this.add(x);\n  while(i >= 0) {\n    R = R.twice();\n    if(j.testBit(i)) {\n      if(k.testBit(i)) {\n        R = R.add(both);\n      }\n      else {\n        R = R.add(this);\n      }\n    }\n    else {\n      if(k.testBit(i)) {\n        R = R.add(x);\n      }\n    }\n    --i;\n  }\n\n  return R;\n}\n\nECPointFp.prototype.getX = pointFpGetX;\nECPointFp.prototype.getY = pointFpGetY;\nECPointFp.prototype.equals = pointFpEquals;\nECPointFp.prototype.isInfinity = pointFpIsInfinity;\nECPointFp.prototype.negate = pointFpNegate;\nECPointFp.prototype.add = pointFpAdd;\nECPointFp.prototype.twice = pointFpTwice;\nECPointFp.prototype.multiply = pointFpMultiply;\nECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo;\n\n// ----------------\n// ECCurveFp\n\n// constructor\nfunction ECCurveFp(q,a,b) {\n    this.q = q;\n    this.a = this.fromBigInteger(a);\n    this.b = this.fromBigInteger(b);\n    this.infinity = new ECPointFp(this, null, null);\n    this.reducer = new Barrett(this.q);\n}\n\nfunction curveFpGetQ() {\n    return this.q;\n}\n\nfunction curveFpGetA() {\n    return this.a;\n}\n\nfunction curveFpGetB() {\n    return this.b;\n}\n\nfunction curveFpEquals(other) {\n    if(other == this) return true;\n    return(this.q.equals(other.q) && this.a.equals(other.a) && this.b.equals(other.b));\n}\n\nfunction curveFpGetInfinity() {\n    return this.infinity;\n}\n\nfunction curveFpFromBigInteger(x) {\n    return new ECFieldElementFp(this.q, x);\n}\n\nfunction curveReduce(x) {\n    this.reducer.reduce(x);\n}\n\n// for now, work with hex strings because they're easier in JS\nfunction curveFpDecodePointHex(s) {\n    switch(parseInt(s.substr(0,2), 16)) { // first byte\n    case 0:\n\treturn this.infinity;\n    case 2:\n    case 3:\n\t// point compression not supported yet\n\treturn null;\n    case 4:\n    case 6:\n    case 7:\n\tvar len = (s.length - 2) / 2;\n\tvar xHex = s.substr(2, len);\n\tvar yHex = s.substr(len+2, len);\n\n\treturn new ECPointFp(this,\n\t\t\t     this.fromBigInteger(new BigInteger(xHex, 16)),\n\t\t\t     this.fromBigInteger(new BigInteger(yHex, 16)));\n\n    default: // unsupported\n\treturn null;\n    }\n}\n\nfunction curveFpEncodePointHex(p) {\n\tif (p.isInfinity()) return \"00\";\n\tvar xHex = p.getX().toBigInteger().toString(16);\n\tvar yHex = p.getY().toBigInteger().toString(16);\n\tvar oLen = this.getQ().toString(16).length;\n\tif ((oLen % 2) != 0) oLen++;\n\twhile (xHex.length < oLen) {\n\t\txHex = \"0\" + xHex;\n\t}\n\twhile (yHex.length < oLen) {\n\t\tyHex = \"0\" + yHex;\n\t}\n\treturn \"04\" + xHex + yHex;\n}\n\nECCurveFp.prototype.getQ = curveFpGetQ;\nECCurveFp.prototype.getA = curveFpGetA;\nECCurveFp.prototype.getB = curveFpGetB;\nECCurveFp.prototype.equals = curveFpEquals;\nECCurveFp.prototype.getInfinity = curveFpGetInfinity;\nECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger;\nECCurveFp.prototype.reduce = curveReduce;\n//ECCurveFp.prototype.decodePointHex = curveFpDecodePointHex;\nECCurveFp.prototype.encodePointHex = curveFpEncodePointHex;\n\n// from: https://github.com/kaielvin/jsbn-ec-point-compression\nECCurveFp.prototype.decodePointHex = function(s)\n{\n\tvar yIsEven;\n    switch(parseInt(s.substr(0,2), 16)) { // first byte\n    case 0:\n\treturn this.infinity;\n    case 2:\n\tyIsEven = false;\n    case 3:\n\tif(yIsEven == undefined) yIsEven = true;\n\tvar len = s.length - 2;\n\tvar xHex = s.substr(2, len);\n\tvar x = this.fromBigInteger(new BigInteger(xHex,16));\n\tvar alpha = x.multiply(x.square().add(this.getA())).add(this.getB());\n\tvar beta = alpha.sqrt();\n\n    if (beta == null) throw \"Invalid point compression\";\n\n    var betaValue = beta.toBigInteger();\n    if (betaValue.testBit(0) != yIsEven)\n    {\n        // Use the other root\n        beta = this.fromBigInteger(this.getQ().subtract(betaValue));\n    }\n    return new ECPointFp(this,x,beta);\n    case 4:\n    case 6:\n    case 7:\n\tvar len = (s.length - 2) / 2;\n\tvar xHex = s.substr(2, len);\n\tvar yHex = s.substr(len+2, len);\n\n\treturn new ECPointFp(this,\n\t\t\t     this.fromBigInteger(new BigInteger(xHex, 16)),\n\t\t\t     this.fromBigInteger(new BigInteger(yHex, 16)));\n\n    default: // unsupported\n\treturn null;\n    }\n}\nECCurveFp.prototype.encodeCompressedPointHex = function(p)\n{\n\tif (p.isInfinity()) return \"00\";\n\tvar xHex = p.getX().toBigInteger().toString(16);\n\tvar oLen = this.getQ().toString(16).length;\n\tif ((oLen % 2) != 0) oLen++;\n\twhile (xHex.length < oLen)\n\t\txHex = \"0\" + xHex;\n\tvar yPrefix;\n\tif(p.getY().toBigInteger().isEven()) yPrefix = \"02\";\n\telse                                 yPrefix = \"03\";\n\n\treturn yPrefix + xHex;\n}\n\n\nECFieldElementFp.prototype.getR = function()\n{\n\tif(this.r != undefined) return this.r;\n\n    this.r = null;\n    var bitLength = this.q.bitLength();\n    if (bitLength > 128)\n    {\n        var firstWord = this.q.shiftRight(bitLength - 64);\n        if (firstWord.intValue() == -1)\n        {\n            this.r = BigInteger.ONE.shiftLeft(bitLength).subtract(this.q);\n        }\n    }\n    return this.r;\n}\nECFieldElementFp.prototype.modMult = function(x1,x2)\n{\n    return this.modReduce(x1.multiply(x2));\n}\nECFieldElementFp.prototype.modReduce = function(x)\n{\n    if (this.getR() != null)\n    {\n        var qLen = q.bitLength();\n        while (x.bitLength() > (qLen + 1))\n        {\n            var u = x.shiftRight(qLen);\n            var v = x.subtract(u.shiftLeft(qLen));\n            if (!this.getR().equals(BigInteger.ONE))\n            {\n                u = u.multiply(this.getR());\n            }\n            x = u.add(v); \n        }\n        while (x.compareTo(q) >= 0)\n        {\n            x = x.subtract(q);\n        }\n    }\n    else\n    {\n        x = x.mod(q);\n    }\n    return x;\n}\nECFieldElementFp.prototype.sqrt = function()\n{\n    if (!this.q.testBit(0)) throw \"unsupported\";\n\n    // p mod 4 == 3\n    if (this.q.testBit(1))\n    {\n    \tvar z = new ECFieldElementFp(this.q,this.x.modPow(this.q.shiftRight(2).add(BigInteger.ONE),this.q));\n    \treturn z.square().equals(this) ? z : null;\n    }\n\n    // p mod 4 == 1\n    var qMinusOne = this.q.subtract(BigInteger.ONE);\n\n    var legendreExponent = qMinusOne.shiftRight(1);\n    if (!(this.x.modPow(legendreExponent, this.q).equals(BigInteger.ONE)))\n    {\n        return null;\n    }\n\n    var u = qMinusOne.shiftRight(2);\n    var k = u.shiftLeft(1).add(BigInteger.ONE);\n\n    var Q = this.x;\n    var fourQ = modDouble(modDouble(Q));\n\n    var U, V;\n    do\n    {\n        var P;\n        do\n        {\n            P = new BigInteger(this.q.bitLength(), new SecureRandom());\n        }\n        while (P.compareTo(this.q) >= 0\n            || !(P.multiply(P).subtract(fourQ).modPow(legendreExponent, this.q).equals(qMinusOne)));\n\n        var result = this.lucasSequence(P, Q, k);\n        U = result[0];\n        V = result[1];\n\n        if (this.modMult(V, V).equals(fourQ))\n        {\n            // Integer division by 2, mod q\n            if (V.testBit(0))\n            {\n                V = V.add(q);\n            }\n\n            V = V.shiftRight(1);\n\n            return new ECFieldElementFp(q,V);\n        }\n    }\n    while (U.equals(BigInteger.ONE) || U.equals(qMinusOne));\n\n    return null;\n}\nECFieldElementFp.prototype.lucasSequence = function(P,Q,k)\n{\n    var n = k.bitLength();\n    var s = k.getLowestSetBit();\n\n    var Uh = BigInteger.ONE;\n    var Vl = BigInteger.TWO;\n    var Vh = P;\n    var Ql = BigInteger.ONE;\n    var Qh = BigInteger.ONE;\n\n    for (var j = n - 1; j >= s + 1; --j)\n    {\n        Ql = this.modMult(Ql, Qh);\n\n        if (k.testBit(j))\n        {\n            Qh = this.modMult(Ql, Q);\n            Uh = this.modMult(Uh, Vh);\n            Vl = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql)));\n            Vh = this.modReduce(Vh.multiply(Vh).subtract(Qh.shiftLeft(1)));\n        }\n        else\n        {\n            Qh = Ql;\n            Uh = this.modReduce(Uh.multiply(Vl).subtract(Ql));\n            Vh = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql)));\n            Vl = this.modReduce(Vl.multiply(Vl).subtract(Ql.shiftLeft(1)));\n        }\n    }\n\n    Ql = this.modMult(Ql, Qh);\n    Qh = this.modMult(Ql, Q);\n    Uh = this.modReduce(Uh.multiply(Vl).subtract(Ql));\n    Vl = this.modReduce(Vh.multiply(Vl).subtract(P.multiply(Ql)));\n    Ql = this.modMult(Ql, Qh);\n\n    for (var j = 1; j <= s; ++j)\n    {\n        Uh = this.modMult(Uh, Vl);\n        Vl = this.modReduce(Vl.multiply(Vl).subtract(Ql.shiftLeft(1)));\n        Ql = this.modMult(Ql, Ql);\n    }\n\n    return [ Uh, Vl ];\n}\n\nvar exports = {\n  ECCurveFp: ECCurveFp,\n  ECPointFp: ECPointFp,\n  ECFieldElementFp: ECFieldElementFp\n}\n\nmodule.exports = exports\n\n\n/***/ }),\n/* 141 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = realpath\nrealpath.realpath = realpath\nrealpath.sync = realpathSync\nrealpath.realpathSync = realpathSync\nrealpath.monkeypatch = monkeypatch\nrealpath.unmonkeypatch = unmonkeypatch\n\nvar fs = __webpack_require__(4)\nvar origRealpath = fs.realpath\nvar origRealpathSync = fs.realpathSync\n\nvar version = process.version\nvar ok = /^v[0-5]\\./.test(version)\nvar old = __webpack_require__(268)\n\nfunction newError (er) {\n  return er && er.syscall === 'realpath' && (\n    er.code === 'ELOOP' ||\n    er.code === 'ENOMEM' ||\n    er.code === 'ENAMETOOLONG'\n  )\n}\n\nfunction realpath (p, cache, cb) {\n  if (ok) {\n    return origRealpath(p, cache, cb)\n  }\n\n  if (typeof cache === 'function') {\n    cb = cache\n    cache = null\n  }\n  origRealpath(p, cache, function (er, result) {\n    if (newError(er)) {\n      old.realpath(p, cache, cb)\n    } else {\n      cb(er, result)\n    }\n  })\n}\n\nfunction realpathSync (p, cache) {\n  if (ok) {\n    return origRealpathSync(p, cache)\n  }\n\n  try {\n    return origRealpathSync(p, cache)\n  } catch (er) {\n    if (newError(er)) {\n      return old.realpathSync(p, cache)\n    } else {\n      throw er\n    }\n  }\n}\n\nfunction monkeypatch () {\n  fs.realpath = realpath\n  fs.realpathSync = realpathSync\n}\n\nfunction unmonkeypatch () {\n  fs.realpath = origRealpath\n  fs.realpathSync = origRealpathSync\n}\n\n\n/***/ }),\n/* 142 */\n/***/ (function(module, exports, __webpack_require__) {\n\nexports.alphasort = alphasort\nexports.alphasorti = alphasorti\nexports.setopts = setopts\nexports.ownProp = ownProp\nexports.makeAbs = makeAbs\nexports.finish = finish\nexports.mark = mark\nexports.isIgnored = isIgnored\nexports.childrenIgnored = childrenIgnored\n\nfunction ownProp (obj, field) {\n  return Object.prototype.hasOwnProperty.call(obj, field)\n}\n\nvar path = __webpack_require__(0)\nvar minimatch = __webpack_require__(82)\nvar isAbsolute = __webpack_require__(101)\nvar Minimatch = minimatch.Minimatch\n\nfunction alphasorti (a, b) {\n  return a.toLowerCase().localeCompare(b.toLowerCase())\n}\n\nfunction alphasort (a, b) {\n  return a.localeCompare(b)\n}\n\nfunction setupIgnores (self, options) {\n  self.ignore = options.ignore || []\n\n  if (!Array.isArray(self.ignore))\n    self.ignore = [self.ignore]\n\n  if (self.ignore.length) {\n    self.ignore = self.ignore.map(ignoreMap)\n  }\n}\n\n// ignore patterns are always in dot:true mode.\nfunction ignoreMap (pattern) {\n  var gmatcher = null\n  if (pattern.slice(-3) === '/**') {\n    var gpattern = pattern.replace(/(\\/\\*\\*)+$/, '')\n    gmatcher = new Minimatch(gpattern, { dot: true })\n  }\n\n  return {\n    matcher: new Minimatch(pattern, { dot: true }),\n    gmatcher: gmatcher\n  }\n}\n\nfunction setopts (self, pattern, options) {\n  if (!options)\n    options = {}\n\n  // base-matching: just use globstar for that.\n  if (options.matchBase && -1 === pattern.indexOf(\"/\")) {\n    if (options.noglobstar) {\n      throw new Error(\"base matching requires globstar\")\n    }\n    pattern = \"**/\" + pattern\n  }\n\n  self.silent = !!options.silent\n  self.pattern = pattern\n  self.strict = options.strict !== false\n  self.realpath = !!options.realpath\n  self.realpathCache = options.realpathCache || Object.create(null)\n  self.follow = !!options.follow\n  self.dot = !!options.dot\n  self.mark = !!options.mark\n  self.nodir = !!options.nodir\n  if (self.nodir)\n    self.mark = true\n  self.sync = !!options.sync\n  self.nounique = !!options.nounique\n  self.nonull = !!options.nonull\n  self.nosort = !!options.nosort\n  self.nocase = !!options.nocase\n  self.stat = !!options.stat\n  self.noprocess = !!options.noprocess\n  self.absolute = !!options.absolute\n\n  self.maxLength = options.maxLength || Infinity\n  self.cache = options.cache || Object.create(null)\n  self.statCache = options.statCache || Object.create(null)\n  self.symlinks = options.symlinks || Object.create(null)\n\n  setupIgnores(self, options)\n\n  self.changedCwd = false\n  var cwd = process.cwd()\n  if (!ownProp(options, \"cwd\"))\n    self.cwd = cwd\n  else {\n    self.cwd = path.resolve(options.cwd)\n    self.changedCwd = self.cwd !== cwd\n  }\n\n  self.root = options.root || path.resolve(self.cwd, \"/\")\n  self.root = path.resolve(self.root)\n  if (process.platform === \"win32\")\n    self.root = self.root.replace(/\\\\/g, \"/\")\n\n  // TODO: is an absolute `cwd` supposed to be resolved against `root`?\n  // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test')\n  self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd)\n  if (process.platform === \"win32\")\n    self.cwdAbs = self.cwdAbs.replace(/\\\\/g, \"/\")\n  self.nomount = !!options.nomount\n\n  // disable comments and negation in Minimatch.\n  // Note that they are not supported in Glob itself anyway.\n  options.nonegate = true\n  options.nocomment = true\n\n  self.minimatch = new Minimatch(pattern, options)\n  self.options = self.minimatch.options\n}\n\nfunction finish (self) {\n  var nou = self.nounique\n  var all = nou ? [] : Object.create(null)\n\n  for (var i = 0, l = self.matches.length; i < l; i ++) {\n    var matches = self.matches[i]\n    if (!matches || Object.keys(matches).length === 0) {\n      if (self.nonull) {\n        // do like the shell, and spit out the literal glob\n        var literal = self.minimatch.globSet[i]\n        if (nou)\n          all.push(literal)\n        else\n          all[literal] = true\n      }\n    } else {\n      // had matches\n      var m = Object.keys(matches)\n      if (nou)\n        all.push.apply(all, m)\n      else\n        m.forEach(function (m) {\n          all[m] = true\n        })\n    }\n  }\n\n  if (!nou)\n    all = Object.keys(all)\n\n  if (!self.nosort)\n    all = all.sort(self.nocase ? alphasorti : alphasort)\n\n  // at *some* point we statted all of these\n  if (self.mark) {\n    for (var i = 0; i < all.length; i++) {\n      all[i] = self._mark(all[i])\n    }\n    if (self.nodir) {\n      all = all.filter(function (e) {\n        var notDir = !(/\\/$/.test(e))\n        var c = self.cache[e] || self.cache[makeAbs(self, e)]\n        if (notDir && c)\n          notDir = c !== 'DIR' && !Array.isArray(c)\n        return notDir\n      })\n    }\n  }\n\n  if (self.ignore.length)\n    all = all.filter(function(m) {\n      return !isIgnored(self, m)\n    })\n\n  self.found = all\n}\n\nfunction mark (self, p) {\n  var abs = makeAbs(self, p)\n  var c = self.cache[abs]\n  var m = p\n  if (c) {\n    var isDir = c === 'DIR' || Array.isArray(c)\n    var slash = p.slice(-1) === '/'\n\n    if (isDir && !slash)\n      m += '/'\n    else if (!isDir && slash)\n      m = m.slice(0, -1)\n\n    if (m !== p) {\n      var mabs = makeAbs(self, m)\n      self.statCache[mabs] = self.statCache[abs]\n      self.cache[mabs] = self.cache[abs]\n    }\n  }\n\n  return m\n}\n\n// lotta situps...\nfunction makeAbs (self, f) {\n  var abs = f\n  if (f.charAt(0) === '/') {\n    abs = path.join(self.root, f)\n  } else if (isAbsolute(f) || f === '') {\n    abs = f\n  } else if (self.changedCwd) {\n    abs = path.resolve(self.cwd, f)\n  } else {\n    abs = path.resolve(f)\n  }\n\n  if (process.platform === 'win32')\n    abs = abs.replace(/\\\\/g, '/')\n\n  return abs\n}\n\n\n// Return true, if pattern ends with globstar '**', for the accompanying parent directory.\n// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents\nfunction isIgnored (self, path) {\n  if (!self.ignore.length)\n    return false\n\n  return self.ignore.some(function(item) {\n    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path))\n  })\n}\n\nfunction childrenIgnored (self, path) {\n  if (!self.ignore.length)\n    return false\n\n  return self.ignore.some(function(item) {\n    return !!(item.gmatcher && item.gmatcher.match(path))\n  })\n}\n\n\n/***/ }),\n/* 143 */\n/***/ (function(module, exports) {\n\n\nmodule.exports = function(det, rec, confidence, name, lang) {\n  this.confidence = confidence;\n  this.name = name || rec.name(det);\n  this.lang = lang;\n};\n\n\n/***/ }),\n/* 144 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Standard YAML's Core schema.\n// http://www.yaml.org/spec/1.2/spec.html#id2804923\n//\n// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.\n// So, Core schema has no distinctions from JSON schema is JS-YAML.\n\n\n\n\n\nvar Schema = __webpack_require__(45);\n\n\nmodule.exports = new Schema({\n  include: [\n    __webpack_require__(145)\n  ]\n});\n\n\n/***/ }),\n/* 145 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Standard YAML's JSON schema.\n// http://www.yaml.org/spec/1.2/spec.html#id2803231\n//\n// NOTE: JS-YAML does not support schema-specific tag resolution restrictions.\n// So, this schema is not such strict as defined in the YAML specification.\n// It allows numbers in binary notaion, use `Null` and `NULL` as `null`, etc.\n\n\n\n\n\nvar Schema = __webpack_require__(45);\n\n\nmodule.exports = new Schema({\n  include: [\n    __webpack_require__(100)\n  ],\n  implicit: [\n    __webpack_require__(293),\n    __webpack_require__(285),\n    __webpack_require__(287),\n    __webpack_require__(286)\n  ]\n});\n\n\n/***/ }),\n/* 146 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar path = __webpack_require__(0);\nvar fs = __webpack_require__(4);\nvar _0777 = parseInt('0777', 8);\n\nmodule.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP;\n\nfunction mkdirP (p, opts, f, made) {\n    if (typeof opts === 'function') {\n        f = opts;\n        opts = {};\n    }\n    else if (!opts || typeof opts !== 'object') {\n        opts = { mode: opts };\n    }\n    \n    var mode = opts.mode;\n    var xfs = opts.fs || fs;\n    \n    if (mode === undefined) {\n        mode = _0777 & (~process.umask());\n    }\n    if (!made) made = null;\n    \n    var cb = f || function () {};\n    p = path.resolve(p);\n    \n    xfs.mkdir(p, mode, function (er) {\n        if (!er) {\n            made = made || p;\n            return cb(null, made);\n        }\n        switch (er.code) {\n            case 'ENOENT':\n                mkdirP(path.dirname(p), opts, function (er, made) {\n                    if (er) cb(er, made);\n                    else mkdirP(p, opts, cb, made);\n                });\n                break;\n\n            // In the case of any other error, just see if there's a dir\n            // there already.  If so, then hooray!  If not, then something\n            // is borked.\n            default:\n                xfs.stat(p, function (er2, stat) {\n                    // if the stat fails, then that's super weird.\n                    // let the original error be the failure reason.\n                    if (er2 || !stat.isDirectory()) cb(er, made)\n                    else cb(null, made);\n                });\n                break;\n        }\n    });\n}\n\nmkdirP.sync = function sync (p, opts, made) {\n    if (!opts || typeof opts !== 'object') {\n        opts = { mode: opts };\n    }\n    \n    var mode = opts.mode;\n    var xfs = opts.fs || fs;\n    \n    if (mode === undefined) {\n        mode = _0777 & (~process.umask());\n    }\n    if (!made) made = null;\n\n    p = path.resolve(p);\n\n    try {\n        xfs.mkdirSync(p, mode);\n        made = made || p;\n    }\n    catch (err0) {\n        switch (err0.code) {\n            case 'ENOENT' :\n                made = sync(path.dirname(p), opts, made);\n                sync(p, opts, made);\n                break;\n\n            // In the case of any other error, just see if there's a dir\n            // there already.  If so, then hooray!  If not, then something\n            // is borked.\n            default:\n                var stat;\n                try {\n                    stat = xfs.statSync(p);\n                }\n                catch (err1) {\n                    throw err0;\n                }\n                if (!stat.isDirectory()) throw err0;\n                break;\n        }\n    }\n\n    return made;\n};\n\n\n/***/ }),\n/* 147 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = defaultIfEmpty;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction defaultIfEmpty(defaultValue) {\n    if (defaultValue === void 0) {\n        defaultValue = null;\n    }\n    return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); };\n}\nvar DefaultIfEmptyOperator = /*@__PURE__*/ (function () {\n    function DefaultIfEmptyOperator(defaultValue) {\n        this.defaultValue = defaultValue;\n    }\n    DefaultIfEmptyOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));\n    };\n    return DefaultIfEmptyOperator;\n}());\nvar DefaultIfEmptySubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](DefaultIfEmptySubscriber, _super);\n    function DefaultIfEmptySubscriber(destination, defaultValue) {\n        var _this = _super.call(this, destination) || this;\n        _this.defaultValue = defaultValue;\n        _this.isEmpty = true;\n        return _this;\n    }\n    DefaultIfEmptySubscriber.prototype._next = function (value) {\n        this.isEmpty = false;\n        this.destination.next(value);\n    };\n    DefaultIfEmptySubscriber.prototype._complete = function () {\n        if (this.isEmpty) {\n            this.destination.next(this.defaultValue);\n        }\n        this.destination.complete();\n    };\n    return DefaultIfEmptySubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=defaultIfEmpty.js.map\n\n\n/***/ }),\n/* 148 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = filter;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction filter(predicate, thisArg) {\n    return function filterOperatorFunction(source) {\n        return source.lift(new FilterOperator(predicate, thisArg));\n    };\n}\nvar FilterOperator = /*@__PURE__*/ (function () {\n    function FilterOperator(predicate, thisArg) {\n        this.predicate = predicate;\n        this.thisArg = thisArg;\n    }\n    FilterOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));\n    };\n    return FilterOperator;\n}());\nvar FilterSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](FilterSubscriber, _super);\n    function FilterSubscriber(destination, predicate, thisArg) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.thisArg = thisArg;\n        _this.count = 0;\n        return _this;\n    }\n    FilterSubscriber.prototype._next = function (value) {\n        var result;\n        try {\n            result = this.predicate.call(this.thisArg, value, this.count++);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (result) {\n            this.destination.next(value);\n        }\n    };\n    return FilterSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=filter.js.map\n\n\n/***/ }),\n/* 149 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = mergeMap;\n/* unused harmony export MergeMapOperator */\n/* unused harmony export MergeMapSubscriber */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_subscribeToResult__ = __webpack_require__(14);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__InnerSubscriber__ = __webpack_require__(84);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__map__ = __webpack_require__(47);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__observable_from__ = __webpack_require__(62);\n/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber,_map,_observable_from PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction mergeMap(project, resultSelector, concurrent) {\n    if (concurrent === void 0) {\n        concurrent = Number.POSITIVE_INFINITY;\n    }\n    if (typeof resultSelector === 'function') {\n        return function (source) { return source.pipe(mergeMap(function (a, i) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__observable_from__[\"a\" /* from */])(project(a, i)).pipe(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__map__[\"a\" /* map */])(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); };\n    }\n    else if (typeof resultSelector === 'number') {\n        concurrent = resultSelector;\n    }\n    return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); };\n}\nvar MergeMapOperator = /*@__PURE__*/ (function () {\n    function MergeMapOperator(project, concurrent) {\n        if (concurrent === void 0) {\n            concurrent = Number.POSITIVE_INFINITY;\n        }\n        this.project = project;\n        this.concurrent = concurrent;\n    }\n    MergeMapOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent));\n    };\n    return MergeMapOperator;\n}());\n\nvar MergeMapSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](MergeMapSubscriber, _super);\n    function MergeMapSubscriber(destination, project, concurrent) {\n        if (concurrent === void 0) {\n            concurrent = Number.POSITIVE_INFINITY;\n        }\n        var _this = _super.call(this, destination) || this;\n        _this.project = project;\n        _this.concurrent = concurrent;\n        _this.hasCompleted = false;\n        _this.buffer = [];\n        _this.active = 0;\n        _this.index = 0;\n        return _this;\n    }\n    MergeMapSubscriber.prototype._next = function (value) {\n        if (this.active < this.concurrent) {\n            this._tryNext(value);\n        }\n        else {\n            this.buffer.push(value);\n        }\n    };\n    MergeMapSubscriber.prototype._tryNext = function (value) {\n        var result;\n        var index = this.index++;\n        try {\n            result = this.project(value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.active++;\n        this._innerSub(result, value, index);\n    };\n    MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {\n        var innerSubscriber = new __WEBPACK_IMPORTED_MODULE_3__InnerSubscriber__[\"a\" /* InnerSubscriber */](this, undefined, undefined);\n        var destination = this.destination;\n        destination.add(innerSubscriber);\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, ish, value, index, innerSubscriber);\n    };\n    MergeMapSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (this.active === 0 && this.buffer.length === 0) {\n            this.destination.complete();\n        }\n        this.unsubscribe();\n    };\n    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.destination.next(innerValue);\n    };\n    MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {\n        var buffer = this.buffer;\n        this.remove(innerSub);\n        this.active--;\n        if (buffer.length > 0) {\n            this._next(buffer.shift());\n        }\n        else if (this.active === 0 && this.hasCompleted) {\n            this.destination.complete();\n        }\n    };\n    return MergeMapSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_2__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n\n//# sourceMappingURL=mergeMap.js.map\n\n\n/***/ }),\n/* 150 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AsyncAction; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Action__ = __webpack_require__(918);\n/** PURE_IMPORTS_START tslib,_Action PURE_IMPORTS_END */\n\n\nvar AsyncAction = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](AsyncAction, _super);\n    function AsyncAction(scheduler, work) {\n        var _this = _super.call(this, scheduler, work) || this;\n        _this.scheduler = scheduler;\n        _this.work = work;\n        _this.pending = false;\n        return _this;\n    }\n    AsyncAction.prototype.schedule = function (state, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        if (this.closed) {\n            return this;\n        }\n        this.state = state;\n        var id = this.id;\n        var scheduler = this.scheduler;\n        if (id != null) {\n            this.id = this.recycleAsyncId(scheduler, id, delay);\n        }\n        this.pending = true;\n        this.delay = delay;\n        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);\n        return this;\n    };\n    AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        return setInterval(scheduler.flush.bind(scheduler, this), delay);\n    };\n    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        if (delay !== null && this.delay === delay && this.pending === false) {\n            return id;\n        }\n        clearInterval(id);\n    };\n    AsyncAction.prototype.execute = function (state, delay) {\n        if (this.closed) {\n            return new Error('executing a cancelled action');\n        }\n        this.pending = false;\n        var error = this._execute(state, delay);\n        if (error) {\n            return error;\n        }\n        else if (this.pending === false && this.id != null) {\n            this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n        }\n    };\n    AsyncAction.prototype._execute = function (state, delay) {\n        var errored = false;\n        var errorValue = undefined;\n        try {\n            this.work(state);\n        }\n        catch (e) {\n            errored = true;\n            errorValue = !!e && e || new Error(e);\n        }\n        if (errored) {\n            this.unsubscribe();\n            return errorValue;\n        }\n    };\n    AsyncAction.prototype._unsubscribe = function () {\n        var id = this.id;\n        var scheduler = this.scheduler;\n        var actions = scheduler.actions;\n        var index = actions.indexOf(this);\n        this.work = null;\n        this.state = null;\n        this.pending = false;\n        this.scheduler = null;\n        if (index !== -1) {\n            actions.splice(index, 1);\n        }\n        if (id != null) {\n            this.id = this.recycleAsyncId(scheduler, id, null);\n        }\n        this.delay = null;\n    };\n    return AsyncAction;\n}(__WEBPACK_IMPORTED_MODULE_1__Action__[\"a\" /* Action */]));\n\n//# sourceMappingURL=AsyncAction.js.map\n\n\n/***/ }),\n/* 151 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AsyncScheduler; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Scheduler__ = __webpack_require__(421);\n/** PURE_IMPORTS_START tslib,_Scheduler PURE_IMPORTS_END */\n\n\nvar AsyncScheduler = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](AsyncScheduler, _super);\n    function AsyncScheduler(SchedulerAction, now) {\n        if (now === void 0) {\n            now = __WEBPACK_IMPORTED_MODULE_1__Scheduler__[\"a\" /* Scheduler */].now;\n        }\n        var _this = _super.call(this, SchedulerAction, function () {\n            if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) {\n                return AsyncScheduler.delegate.now();\n            }\n            else {\n                return now();\n            }\n        }) || this;\n        _this.actions = [];\n        _this.active = false;\n        _this.scheduled = undefined;\n        return _this;\n    }\n    AsyncScheduler.prototype.schedule = function (work, delay, state) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {\n            return AsyncScheduler.delegate.schedule(work, delay, state);\n        }\n        else {\n            return _super.prototype.schedule.call(this, work, delay, state);\n        }\n    };\n    AsyncScheduler.prototype.flush = function (action) {\n        var actions = this.actions;\n        if (this.active) {\n            actions.push(action);\n            return;\n        }\n        var error;\n        this.active = true;\n        do {\n            if (error = action.execute(action.state, action.delay)) {\n                break;\n            }\n        } while (action = actions.shift());\n        this.active = false;\n        if (error) {\n            while (action = actions.shift()) {\n                action.unsubscribe();\n            }\n            throw error;\n        }\n    };\n    return AsyncScheduler;\n}(__WEBPACK_IMPORTED_MODULE_1__Scheduler__[\"a\" /* Scheduler */]));\n\n//# sourceMappingURL=AsyncScheduler.js.map\n\n\n/***/ }),\n/* 152 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* unused harmony export getSymbolIterator */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return iterator; });\n/* unused harmony export $$iterator */\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction getSymbolIterator() {\n    if (typeof Symbol !== 'function' || !Symbol.iterator) {\n        return '@@iterator';\n    }\n    return Symbol.iterator;\n}\nvar iterator = /*@__PURE__*/ getSymbolIterator();\nvar $$iterator = iterator;\n//# sourceMappingURL=iterator.js.map\n\n\n/***/ }),\n/* 153 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ArgumentOutOfRangeError; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction ArgumentOutOfRangeErrorImpl() {\n    Error.call(this);\n    this.message = 'argument out of range';\n    this.name = 'ArgumentOutOfRangeError';\n    return this;\n}\nArgumentOutOfRangeErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype);\nvar ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl;\n//# sourceMappingURL=ArgumentOutOfRangeError.js.map\n\n\n/***/ }),\n/* 154 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return EmptyError; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction EmptyErrorImpl() {\n    Error.call(this);\n    this.message = 'no elements in sequence';\n    this.name = 'EmptyError';\n    return this;\n}\nEmptyErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype);\nvar EmptyError = EmptyErrorImpl;\n//# sourceMappingURL=EmptyError.js.map\n\n\n/***/ }),\n/* 155 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = isFunction;\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction isFunction(x) {\n    return typeof x === 'function';\n}\n//# sourceMappingURL=isFunction.js.map\n\n\n/***/ }),\n/* 156 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2016 Joyent, Inc.\n\nmodule.exports = Certificate;\n\nvar assert = __webpack_require__(16);\nvar Buffer = __webpack_require__(15).Buffer;\nvar algs = __webpack_require__(32);\nvar crypto = __webpack_require__(11);\nvar Fingerprint = __webpack_require__(157);\nvar Signature = __webpack_require__(75);\nvar errs = __webpack_require__(74);\nvar util = __webpack_require__(3);\nvar utils = __webpack_require__(26);\nvar Key = __webpack_require__(28);\nvar PrivateKey = __webpack_require__(33);\nvar Identity = __webpack_require__(159);\n\nvar formats = {};\nformats['openssh'] = __webpack_require__(940);\nformats['x509'] = __webpack_require__(457);\nformats['pem'] = __webpack_require__(941);\n\nvar CertificateParseError = errs.CertificateParseError;\nvar InvalidAlgorithmError = errs.InvalidAlgorithmError;\n\nfunction Certificate(opts) {\n\tassert.object(opts, 'options');\n\tassert.arrayOfObject(opts.subjects, 'options.subjects');\n\tutils.assertCompatible(opts.subjects[0], Identity, [1, 0],\n\t    'options.subjects');\n\tutils.assertCompatible(opts.subjectKey, Key, [1, 0],\n\t    'options.subjectKey');\n\tutils.assertCompatible(opts.issuer, Identity, [1, 0], 'options.issuer');\n\tif (opts.issuerKey !== undefined) {\n\t\tutils.assertCompatible(opts.issuerKey, Key, [1, 0],\n\t\t    'options.issuerKey');\n\t}\n\tassert.object(opts.signatures, 'options.signatures');\n\tassert.buffer(opts.serial, 'options.serial');\n\tassert.date(opts.validFrom, 'options.validFrom');\n\tassert.date(opts.validUntil, 'optons.validUntil');\n\n\tassert.optionalArrayOfString(opts.purposes, 'options.purposes');\n\n\tthis._hashCache = {};\n\n\tthis.subjects = opts.subjects;\n\tthis.issuer = opts.issuer;\n\tthis.subjectKey = opts.subjectKey;\n\tthis.issuerKey = opts.issuerKey;\n\tthis.signatures = opts.signatures;\n\tthis.serial = opts.serial;\n\tthis.validFrom = opts.validFrom;\n\tthis.validUntil = opts.validUntil;\n\tthis.purposes = opts.purposes;\n}\n\nCertificate.formats = formats;\n\nCertificate.prototype.toBuffer = function (format, options) {\n\tif (format === undefined)\n\t\tformat = 'x509';\n\tassert.string(format, 'format');\n\tassert.object(formats[format], 'formats[format]');\n\tassert.optionalObject(options, 'options');\n\n\treturn (formats[format].write(this, options));\n};\n\nCertificate.prototype.toString = function (format, options) {\n\tif (format === undefined)\n\t\tformat = 'pem';\n\treturn (this.toBuffer(format, options).toString());\n};\n\nCertificate.prototype.fingerprint = function (algo) {\n\tif (algo === undefined)\n\t\talgo = 'sha256';\n\tassert.string(algo, 'algorithm');\n\tvar opts = {\n\t\ttype: 'certificate',\n\t\thash: this.hash(algo),\n\t\talgorithm: algo\n\t};\n\treturn (new Fingerprint(opts));\n};\n\nCertificate.prototype.hash = function (algo) {\n\tassert.string(algo, 'algorithm');\n\talgo = algo.toLowerCase();\n\tif (algs.hashAlgs[algo] === undefined)\n\t\tthrow (new InvalidAlgorithmError(algo));\n\n\tif (this._hashCache[algo])\n\t\treturn (this._hashCache[algo]);\n\n\tvar hash = crypto.createHash(algo).\n\t    update(this.toBuffer('x509')).digest();\n\tthis._hashCache[algo] = hash;\n\treturn (hash);\n};\n\nCertificate.prototype.isExpired = function (when) {\n\tif (when === undefined)\n\t\twhen = new Date();\n\treturn (!((when.getTime() >= this.validFrom.getTime()) &&\n\t\t(when.getTime() < this.validUntil.getTime())));\n};\n\nCertificate.prototype.isSignedBy = function (issuerCert) {\n\tutils.assertCompatible(issuerCert, Certificate, [1, 0], 'issuer');\n\n\tif (!this.issuer.equals(issuerCert.subjects[0]))\n\t\treturn (false);\n\tif (this.issuer.purposes && this.issuer.purposes.length > 0 &&\n\t    this.issuer.purposes.indexOf('ca') === -1) {\n\t\treturn (false);\n\t}\n\n\treturn (this.isSignedByKey(issuerCert.subjectKey));\n};\n\nCertificate.prototype.isSignedByKey = function (issuerKey) {\n\tutils.assertCompatible(issuerKey, Key, [1, 2], 'issuerKey');\n\n\tif (this.issuerKey !== undefined) {\n\t\treturn (this.issuerKey.\n\t\t    fingerprint('sha512').matches(issuerKey));\n\t}\n\n\tvar fmt = Object.keys(this.signatures)[0];\n\tvar valid = formats[fmt].verify(this, issuerKey);\n\tif (valid)\n\t\tthis.issuerKey = issuerKey;\n\treturn (valid);\n};\n\nCertificate.prototype.signWith = function (key) {\n\tutils.assertCompatible(key, PrivateKey, [1, 2], 'key');\n\tvar fmts = Object.keys(formats);\n\tvar didOne = false;\n\tfor (var i = 0; i < fmts.length; ++i) {\n\t\tif (fmts[i] !== 'pem') {\n\t\t\tvar ret = formats[fmts[i]].sign(this, key);\n\t\t\tif (ret === true)\n\t\t\t\tdidOne = true;\n\t\t}\n\t}\n\tif (!didOne) {\n\t\tthrow (new Error('Failed to sign the certificate for any ' +\n\t\t    'available certificate formats'));\n\t}\n};\n\nCertificate.createSelfSigned = function (subjectOrSubjects, key, options) {\n\tvar subjects;\n\tif (Array.isArray(subjectOrSubjects))\n\t\tsubjects = subjectOrSubjects;\n\telse\n\t\tsubjects = [subjectOrSubjects];\n\n\tassert.arrayOfObject(subjects);\n\tsubjects.forEach(function (subject) {\n\t\tutils.assertCompatible(subject, Identity, [1, 0], 'subject');\n\t});\n\n\tutils.assertCompatible(key, PrivateKey, [1, 2], 'private key');\n\n\tassert.optionalObject(options, 'options');\n\tif (options === undefined)\n\t\toptions = {};\n\tassert.optionalObject(options.validFrom, 'options.validFrom');\n\tassert.optionalObject(options.validUntil, 'options.validUntil');\n\tvar validFrom = options.validFrom;\n\tvar validUntil = options.validUntil;\n\tif (validFrom === undefined)\n\t\tvalidFrom = new Date();\n\tif (validUntil === undefined) {\n\t\tassert.optionalNumber(options.lifetime, 'options.lifetime');\n\t\tvar lifetime = options.lifetime;\n\t\tif (lifetime === undefined)\n\t\t\tlifetime = 10*365*24*3600;\n\t\tvalidUntil = new Date();\n\t\tvalidUntil.setTime(validUntil.getTime() + lifetime*1000);\n\t}\n\tassert.optionalBuffer(options.serial, 'options.serial');\n\tvar serial = options.serial;\n\tif (serial === undefined)\n\t\tserial = Buffer.from('0000000000000001', 'hex');\n\n\tvar purposes = options.purposes;\n\tif (purposes === undefined)\n\t\tpurposes = [];\n\n\tif (purposes.indexOf('signature') === -1)\n\t\tpurposes.push('signature');\n\n\t/* Self-signed certs are always CAs. */\n\tif (purposes.indexOf('ca') === -1)\n\t\tpurposes.push('ca');\n\tif (purposes.indexOf('crl') === -1)\n\t\tpurposes.push('crl');\n\n\t/*\n\t * If we weren't explicitly given any other purposes, do the sensible\n\t * thing and add some basic ones depending on the subject type.\n\t */\n\tif (purposes.length <= 3) {\n\t\tvar hostSubjects = subjects.filter(function (subject) {\n\t\t\treturn (subject.type === 'host');\n\t\t});\n\t\tvar userSubjects = subjects.filter(function (subject) {\n\t\t\treturn (subject.type === 'user');\n\t\t});\n\t\tif (hostSubjects.length > 0) {\n\t\t\tif (purposes.indexOf('serverAuth') === -1)\n\t\t\t\tpurposes.push('serverAuth');\n\t\t}\n\t\tif (userSubjects.length > 0) {\n\t\t\tif (purposes.indexOf('clientAuth') === -1)\n\t\t\t\tpurposes.push('clientAuth');\n\t\t}\n\t\tif (userSubjects.length > 0 || hostSubjects.length > 0) {\n\t\t\tif (purposes.indexOf('keyAgreement') === -1)\n\t\t\t\tpurposes.push('keyAgreement');\n\t\t\tif (key.type === 'rsa' &&\n\t\t\t    purposes.indexOf('encryption') === -1)\n\t\t\t\tpurposes.push('encryption');\n\t\t}\n\t}\n\n\tvar cert = new Certificate({\n\t\tsubjects: subjects,\n\t\tissuer: subjects[0],\n\t\tsubjectKey: key.toPublic(),\n\t\tissuerKey: key.toPublic(),\n\t\tsignatures: {},\n\t\tserial: serial,\n\t\tvalidFrom: validFrom,\n\t\tvalidUntil: validUntil,\n\t\tpurposes: purposes\n\t});\n\tcert.signWith(key);\n\n\treturn (cert);\n};\n\nCertificate.create =\n    function (subjectOrSubjects, key, issuer, issuerKey, options) {\n\tvar subjects;\n\tif (Array.isArray(subjectOrSubjects))\n\t\tsubjects = subjectOrSubjects;\n\telse\n\t\tsubjects = [subjectOrSubjects];\n\n\tassert.arrayOfObject(subjects);\n\tsubjects.forEach(function (subject) {\n\t\tutils.assertCompatible(subject, Identity, [1, 0], 'subject');\n\t});\n\n\tutils.assertCompatible(key, Key, [1, 0], 'key');\n\tif (PrivateKey.isPrivateKey(key))\n\t\tkey = key.toPublic();\n\tutils.assertCompatible(issuer, Identity, [1, 0], 'issuer');\n\tutils.assertCompatible(issuerKey, PrivateKey, [1, 2], 'issuer key');\n\n\tassert.optionalObject(options, 'options');\n\tif (options === undefined)\n\t\toptions = {};\n\tassert.optionalObject(options.validFrom, 'options.validFrom');\n\tassert.optionalObject(options.validUntil, 'options.validUntil');\n\tvar validFrom = options.validFrom;\n\tvar validUntil = options.validUntil;\n\tif (validFrom === undefined)\n\t\tvalidFrom = new Date();\n\tif (validUntil === undefined) {\n\t\tassert.optionalNumber(options.lifetime, 'options.lifetime');\n\t\tvar lifetime = options.lifetime;\n\t\tif (lifetime === undefined)\n\t\t\tlifetime = 10*365*24*3600;\n\t\tvalidUntil = new Date();\n\t\tvalidUntil.setTime(validUntil.getTime() + lifetime*1000);\n\t}\n\tassert.optionalBuffer(options.serial, 'options.serial');\n\tvar serial = options.serial;\n\tif (serial === undefined)\n\t\tserial = Buffer.from('0000000000000001', 'hex');\n\n\tvar purposes = options.purposes;\n\tif (purposes === undefined)\n\t\tpurposes = [];\n\n\tif (purposes.indexOf('signature') === -1)\n\t\tpurposes.push('signature');\n\n\tif (options.ca === true) {\n\t\tif (purposes.indexOf('ca') === -1)\n\t\t\tpurposes.push('ca');\n\t\tif (purposes.indexOf('crl') === -1)\n\t\t\tpurposes.push('crl');\n\t}\n\n\tvar hostSubjects = subjects.filter(function (subject) {\n\t\treturn (subject.type === 'host');\n\t});\n\tvar userSubjects = subjects.filter(function (subject) {\n\t\treturn (subject.type === 'user');\n\t});\n\tif (hostSubjects.length > 0) {\n\t\tif (purposes.indexOf('serverAuth') === -1)\n\t\t\tpurposes.push('serverAuth');\n\t}\n\tif (userSubjects.length > 0) {\n\t\tif (purposes.indexOf('clientAuth') === -1)\n\t\t\tpurposes.push('clientAuth');\n\t}\n\tif (userSubjects.length > 0 || hostSubjects.length > 0) {\n\t\tif (purposes.indexOf('keyAgreement') === -1)\n\t\t\tpurposes.push('keyAgreement');\n\t\tif (key.type === 'rsa' &&\n\t\t    purposes.indexOf('encryption') === -1)\n\t\t\tpurposes.push('encryption');\n\t}\n\n\tvar cert = new Certificate({\n\t\tsubjects: subjects,\n\t\tissuer: issuer,\n\t\tsubjectKey: key,\n\t\tissuerKey: issuerKey.toPublic(),\n\t\tsignatures: {},\n\t\tserial: serial,\n\t\tvalidFrom: validFrom,\n\t\tvalidUntil: validUntil,\n\t\tpurposes: purposes\n\t});\n\tcert.signWith(issuerKey);\n\n\treturn (cert);\n};\n\nCertificate.parse = function (data, format, options) {\n\tif (typeof (data) !== 'string')\n\t\tassert.buffer(data, 'data');\n\tif (format === undefined)\n\t\tformat = 'auto';\n\tassert.string(format, 'format');\n\tif (typeof (options) === 'string')\n\t\toptions = { filename: options };\n\tassert.optionalObject(options, 'options');\n\tif (options === undefined)\n\t\toptions = {};\n\tassert.optionalString(options.filename, 'options.filename');\n\tif (options.filename === undefined)\n\t\toptions.filename = '(unnamed)';\n\n\tassert.object(formats[format], 'formats[format]');\n\n\ttry {\n\t\tvar k = formats[format].read(data, options);\n\t\treturn (k);\n\t} catch (e) {\n\t\tthrow (new CertificateParseError(options.filename, format, e));\n\t}\n};\n\nCertificate.isCertificate = function (obj, ver) {\n\treturn (utils.isCompatible(obj, Certificate, ver));\n};\n\n/*\n * API versions for Certificate:\n * [1,0] -- initial ver\n */\nCertificate.prototype._sshpkApiVersion = [1, 0];\n\nCertificate._oldVersionDetect = function (obj) {\n\treturn ([1, 0]);\n};\n\n\n/***/ }),\n/* 157 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nmodule.exports = Fingerprint;\n\nvar assert = __webpack_require__(16);\nvar Buffer = __webpack_require__(15).Buffer;\nvar algs = __webpack_require__(32);\nvar crypto = __webpack_require__(11);\nvar errs = __webpack_require__(74);\nvar Key = __webpack_require__(28);\nvar Certificate = __webpack_require__(156);\nvar utils = __webpack_require__(26);\n\nvar FingerprintFormatError = errs.FingerprintFormatError;\nvar InvalidAlgorithmError = errs.InvalidAlgorithmError;\n\nfunction Fingerprint(opts) {\n\tassert.object(opts, 'options');\n\tassert.string(opts.type, 'options.type');\n\tassert.buffer(opts.hash, 'options.hash');\n\tassert.string(opts.algorithm, 'options.algorithm');\n\n\tthis.algorithm = opts.algorithm.toLowerCase();\n\tif (algs.hashAlgs[this.algorithm] !== true)\n\t\tthrow (new InvalidAlgorithmError(this.algorithm));\n\n\tthis.hash = opts.hash;\n\tthis.type = opts.type;\n}\n\nFingerprint.prototype.toString = function (format) {\n\tif (format === undefined) {\n\t\tif (this.algorithm === 'md5')\n\t\t\tformat = 'hex';\n\t\telse\n\t\t\tformat = 'base64';\n\t}\n\tassert.string(format);\n\n\tswitch (format) {\n\tcase 'hex':\n\t\treturn (addColons(this.hash.toString('hex')));\n\tcase 'base64':\n\t\treturn (sshBase64Format(this.algorithm,\n\t\t    this.hash.toString('base64')));\n\tdefault:\n\t\tthrow (new FingerprintFormatError(undefined, format));\n\t}\n};\n\nFingerprint.prototype.matches = function (other) {\n\tassert.object(other, 'key or certificate');\n\tif (this.type === 'key') {\n\t\tutils.assertCompatible(other, Key, [1, 0], 'key');\n\t} else {\n\t\tutils.assertCompatible(other, Certificate, [1, 0],\n\t\t    'certificate');\n\t}\n\n\tvar theirHash = other.hash(this.algorithm);\n\tvar theirHash2 = crypto.createHash(this.algorithm).\n\t    update(theirHash).digest('base64');\n\n\tif (this.hash2 === undefined)\n\t\tthis.hash2 = crypto.createHash(this.algorithm).\n\t\t    update(this.hash).digest('base64');\n\n\treturn (this.hash2 === theirHash2);\n};\n\nFingerprint.parse = function (fp, options) {\n\tassert.string(fp, 'fingerprint');\n\n\tvar alg, hash, enAlgs;\n\tif (Array.isArray(options)) {\n\t\tenAlgs = options;\n\t\toptions = {};\n\t}\n\tassert.optionalObject(options, 'options');\n\tif (options === undefined)\n\t\toptions = {};\n\tif (options.enAlgs !== undefined)\n\t\tenAlgs = options.enAlgs;\n\tassert.optionalArrayOfString(enAlgs, 'algorithms');\n\n\tvar parts = fp.split(':');\n\tif (parts.length == 2) {\n\t\talg = parts[0].toLowerCase();\n\t\t/*JSSTYLED*/\n\t\tvar base64RE = /^[A-Za-z0-9+\\/=]+$/;\n\t\tif (!base64RE.test(parts[1]))\n\t\t\tthrow (new FingerprintFormatError(fp));\n\t\ttry {\n\t\t\thash = Buffer.from(parts[1], 'base64');\n\t\t} catch (e) {\n\t\t\tthrow (new FingerprintFormatError(fp));\n\t\t}\n\t} else if (parts.length > 2) {\n\t\talg = 'md5';\n\t\tif (parts[0].toLowerCase() === 'md5')\n\t\t\tparts = parts.slice(1);\n\t\tparts = parts.join('');\n\t\t/*JSSTYLED*/\n\t\tvar md5RE = /^[a-fA-F0-9]+$/;\n\t\tif (!md5RE.test(parts))\n\t\t\tthrow (new FingerprintFormatError(fp));\n\t\ttry {\n\t\t\thash = Buffer.from(parts, 'hex');\n\t\t} catch (e) {\n\t\t\tthrow (new FingerprintFormatError(fp));\n\t\t}\n\t}\n\n\tif (alg === undefined)\n\t\tthrow (new FingerprintFormatError(fp));\n\n\tif (algs.hashAlgs[alg] === undefined)\n\t\tthrow (new InvalidAlgorithmError(alg));\n\n\tif (enAlgs !== undefined) {\n\t\tenAlgs = enAlgs.map(function (a) { return a.toLowerCase(); });\n\t\tif (enAlgs.indexOf(alg) === -1)\n\t\t\tthrow (new InvalidAlgorithmError(alg));\n\t}\n\n\treturn (new Fingerprint({\n\t\talgorithm: alg,\n\t\thash: hash,\n\t\ttype: options.type || 'key'\n\t}));\n};\n\nfunction addColons(s) {\n\t/*JSSTYLED*/\n\treturn (s.replace(/(.{2})(?=.)/g, '$1:'));\n}\n\nfunction base64Strip(s) {\n\t/*JSSTYLED*/\n\treturn (s.replace(/=*$/, ''));\n}\n\nfunction sshBase64Format(alg, h) {\n\treturn (alg.toUpperCase() + ':' + base64Strip(h));\n}\n\nFingerprint.isFingerprint = function (obj, ver) {\n\treturn (utils.isCompatible(obj, Fingerprint, ver));\n};\n\n/*\n * API versions for Fingerprint:\n * [1,0] -- initial ver\n * [1,1] -- first tagged ver\n */\nFingerprint.prototype._sshpkApiVersion = [1, 1];\n\nFingerprint._oldVersionDetect = function (obj) {\n\tassert.func(obj.toString);\n\tassert.func(obj.matches);\n\treturn ([1, 0]);\n};\n\n\n/***/ }),\n/* 158 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nmodule.exports = {\n\tread: read,\n\treadPkcs8: readPkcs8,\n\twrite: write,\n\twritePkcs8: writePkcs8,\n\n\treadECDSACurve: readECDSACurve,\n\twriteECDSACurve: writeECDSACurve\n};\n\nvar assert = __webpack_require__(16);\nvar asn1 = __webpack_require__(66);\nvar Buffer = __webpack_require__(15).Buffer;\nvar algs = __webpack_require__(32);\nvar utils = __webpack_require__(26);\nvar Key = __webpack_require__(28);\nvar PrivateKey = __webpack_require__(33);\nvar pem = __webpack_require__(86);\n\nfunction read(buf, options) {\n\treturn (pem.read(buf, options, 'pkcs8'));\n}\n\nfunction write(key, options) {\n\treturn (pem.write(key, options, 'pkcs8'));\n}\n\n/* Helper to read in a single mpint */\nfunction readMPInt(der, nm) {\n\tassert.strictEqual(der.peek(), asn1.Ber.Integer,\n\t    nm + ' is not an Integer');\n\treturn (utils.mpNormalize(der.readString(asn1.Ber.Integer, true)));\n}\n\nfunction readPkcs8(alg, type, der) {\n\t/* Private keys in pkcs#8 format have a weird extra int */\n\tif (der.peek() === asn1.Ber.Integer) {\n\t\tassert.strictEqual(type, 'private',\n\t\t    'unexpected Integer at start of public key');\n\t\tder.readString(asn1.Ber.Integer, true);\n\t}\n\n\tder.readSequence();\n\tvar next = der.offset + der.length;\n\n\tvar oid = der.readOID();\n\tswitch (oid) {\n\tcase '1.2.840.113549.1.1.1':\n\t\tder._offset = next;\n\t\tif (type === 'public')\n\t\t\treturn (readPkcs8RSAPublic(der));\n\t\telse\n\t\t\treturn (readPkcs8RSAPrivate(der));\n\tcase '1.2.840.10040.4.1':\n\t\tif (type === 'public')\n\t\t\treturn (readPkcs8DSAPublic(der));\n\t\telse\n\t\t\treturn (readPkcs8DSAPrivate(der));\n\tcase '1.2.840.10045.2.1':\n\t\tif (type === 'public')\n\t\t\treturn (readPkcs8ECDSAPublic(der));\n\t\telse\n\t\t\treturn (readPkcs8ECDSAPrivate(der));\n\tcase '1.3.101.112':\n\t\tif (type === 'public') {\n\t\t\treturn (readPkcs8EdDSAPublic(der));\n\t\t} else {\n\t\t\treturn (readPkcs8EdDSAPrivate(der));\n\t\t}\n\tcase '1.3.101.110':\n\t\tif (type === 'public') {\n\t\t\treturn (readPkcs8X25519Public(der));\n\t\t} else {\n\t\t\treturn (readPkcs8X25519Private(der));\n\t\t}\n\tdefault:\n\t\tthrow (new Error('Unknown key type OID ' + oid));\n\t}\n}\n\nfunction readPkcs8RSAPublic(der) {\n\t// bit string sequence\n\tder.readSequence(asn1.Ber.BitString);\n\tder.readByte();\n\tder.readSequence();\n\n\t// modulus\n\tvar n = readMPInt(der, 'modulus');\n\tvar e = readMPInt(der, 'exponent');\n\n\t// now, make the key\n\tvar key = {\n\t\ttype: 'rsa',\n\t\tsource: der.originalInput,\n\t\tparts: [\n\t\t\t{ name: 'e', data: e },\n\t\t\t{ name: 'n', data: n }\n\t\t]\n\t};\n\n\treturn (new Key(key));\n}\n\nfunction readPkcs8RSAPrivate(der) {\n\tder.readSequence(asn1.Ber.OctetString);\n\tder.readSequence();\n\n\tvar ver = readMPInt(der, 'version');\n\tassert.equal(ver[0], 0x0, 'unknown RSA private key version');\n\n\t// modulus then public exponent\n\tvar n = readMPInt(der, 'modulus');\n\tvar e = readMPInt(der, 'public exponent');\n\tvar d = readMPInt(der, 'private exponent');\n\tvar p = readMPInt(der, 'prime1');\n\tvar q = readMPInt(der, 'prime2');\n\tvar dmodp = readMPInt(der, 'exponent1');\n\tvar dmodq = readMPInt(der, 'exponent2');\n\tvar iqmp = readMPInt(der, 'iqmp');\n\n\t// now, make the key\n\tvar key = {\n\t\ttype: 'rsa',\n\t\tparts: [\n\t\t\t{ name: 'n', data: n },\n\t\t\t{ name: 'e', data: e },\n\t\t\t{ name: 'd', data: d },\n\t\t\t{ name: 'iqmp', data: iqmp },\n\t\t\t{ name: 'p', data: p },\n\t\t\t{ name: 'q', data: q },\n\t\t\t{ name: 'dmodp', data: dmodp },\n\t\t\t{ name: 'dmodq', data: dmodq }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction readPkcs8DSAPublic(der) {\n\tder.readSequence();\n\n\tvar p = readMPInt(der, 'p');\n\tvar q = readMPInt(der, 'q');\n\tvar g = readMPInt(der, 'g');\n\n\t// bit string sequence\n\tder.readSequence(asn1.Ber.BitString);\n\tder.readByte();\n\n\tvar y = readMPInt(der, 'y');\n\n\t// now, make the key\n\tvar key = {\n\t\ttype: 'dsa',\n\t\tparts: [\n\t\t\t{ name: 'p', data: p },\n\t\t\t{ name: 'q', data: q },\n\t\t\t{ name: 'g', data: g },\n\t\t\t{ name: 'y', data: y }\n\t\t]\n\t};\n\n\treturn (new Key(key));\n}\n\nfunction readPkcs8DSAPrivate(der) {\n\tder.readSequence();\n\n\tvar p = readMPInt(der, 'p');\n\tvar q = readMPInt(der, 'q');\n\tvar g = readMPInt(der, 'g');\n\n\tder.readSequence(asn1.Ber.OctetString);\n\tvar x = readMPInt(der, 'x');\n\n\t/* The pkcs#8 format does not include the public key */\n\tvar y = utils.calculateDSAPublic(g, p, x);\n\n\tvar key = {\n\t\ttype: 'dsa',\n\t\tparts: [\n\t\t\t{ name: 'p', data: p },\n\t\t\t{ name: 'q', data: q },\n\t\t\t{ name: 'g', data: g },\n\t\t\t{ name: 'y', data: y },\n\t\t\t{ name: 'x', data: x }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction readECDSACurve(der) {\n\tvar curveName, curveNames;\n\tvar j, c, cd;\n\n\tif (der.peek() === asn1.Ber.OID) {\n\t\tvar oid = der.readOID();\n\n\t\tcurveNames = Object.keys(algs.curves);\n\t\tfor (j = 0; j < curveNames.length; ++j) {\n\t\t\tc = curveNames[j];\n\t\t\tcd = algs.curves[c];\n\t\t\tif (cd.pkcs8oid === oid) {\n\t\t\t\tcurveName = c;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t} else {\n\t\t// ECParameters sequence\n\t\tder.readSequence();\n\t\tvar version = der.readString(asn1.Ber.Integer, true);\n\t\tassert.strictEqual(version[0], 1, 'ECDSA key not version 1');\n\n\t\tvar curve = {};\n\n\t\t// FieldID sequence\n\t\tder.readSequence();\n\t\tvar fieldTypeOid = der.readOID();\n\t\tassert.strictEqual(fieldTypeOid, '1.2.840.10045.1.1',\n\t\t    'ECDSA key is not from a prime-field');\n\t\tvar p = curve.p = utils.mpNormalize(\n\t\t    der.readString(asn1.Ber.Integer, true));\n\t\t/*\n\t\t * p always starts with a 1 bit, so count the zeros to get its\n\t\t * real size.\n\t\t */\n\t\tcurve.size = p.length * 8 - utils.countZeros(p);\n\n\t\t// Curve sequence\n\t\tder.readSequence();\n\t\tcurve.a = utils.mpNormalize(\n\t\t    der.readString(asn1.Ber.OctetString, true));\n\t\tcurve.b = utils.mpNormalize(\n\t\t    der.readString(asn1.Ber.OctetString, true));\n\t\tif (der.peek() === asn1.Ber.BitString)\n\t\t\tcurve.s = der.readString(asn1.Ber.BitString, true);\n\n\t\t// Combined Gx and Gy\n\t\tcurve.G = der.readString(asn1.Ber.OctetString, true);\n\t\tassert.strictEqual(curve.G[0], 0x4,\n\t\t    'uncompressed G is required');\n\n\t\tcurve.n = utils.mpNormalize(\n\t\t    der.readString(asn1.Ber.Integer, true));\n\t\tcurve.h = utils.mpNormalize(\n\t\t    der.readString(asn1.Ber.Integer, true));\n\t\tassert.strictEqual(curve.h[0], 0x1, 'a cofactor=1 curve is ' +\n\t\t    'required');\n\n\t\tcurveNames = Object.keys(algs.curves);\n\t\tvar ks = Object.keys(curve);\n\t\tfor (j = 0; j < curveNames.length; ++j) {\n\t\t\tc = curveNames[j];\n\t\t\tcd = algs.curves[c];\n\t\t\tvar equal = true;\n\t\t\tfor (var i = 0; i < ks.length; ++i) {\n\t\t\t\tvar k = ks[i];\n\t\t\t\tif (cd[k] === undefined)\n\t\t\t\t\tcontinue;\n\t\t\t\tif (typeof (cd[k]) === 'object' &&\n\t\t\t\t    cd[k].equals !== undefined) {\n\t\t\t\t\tif (!cd[k].equals(curve[k])) {\n\t\t\t\t\t\tequal = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else if (Buffer.isBuffer(cd[k])) {\n\t\t\t\t\tif (cd[k].toString('binary')\n\t\t\t\t\t    !== curve[k].toString('binary')) {\n\t\t\t\t\t\tequal = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (cd[k] !== curve[k]) {\n\t\t\t\t\t\tequal = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (equal) {\n\t\t\t\tcurveName = c;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn (curveName);\n}\n\nfunction readPkcs8ECDSAPrivate(der) {\n\tvar curveName = readECDSACurve(der);\n\tassert.string(curveName, 'a known elliptic curve');\n\n\tder.readSequence(asn1.Ber.OctetString);\n\tder.readSequence();\n\n\tvar version = readMPInt(der, 'version');\n\tassert.equal(version[0], 1, 'unknown version of ECDSA key');\n\n\tvar d = der.readString(asn1.Ber.OctetString, true);\n\tder.readSequence(0xa1);\n\n\tvar Q = der.readString(asn1.Ber.BitString, true);\n\tQ = utils.ecNormalize(Q);\n\n\tvar key = {\n\t\ttype: 'ecdsa',\n\t\tparts: [\n\t\t\t{ name: 'curve', data: Buffer.from(curveName) },\n\t\t\t{ name: 'Q', data: Q },\n\t\t\t{ name: 'd', data: d }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction readPkcs8ECDSAPublic(der) {\n\tvar curveName = readECDSACurve(der);\n\tassert.string(curveName, 'a known elliptic curve');\n\n\tvar Q = der.readString(asn1.Ber.BitString, true);\n\tQ = utils.ecNormalize(Q);\n\n\tvar key = {\n\t\ttype: 'ecdsa',\n\t\tparts: [\n\t\t\t{ name: 'curve', data: Buffer.from(curveName) },\n\t\t\t{ name: 'Q', data: Q }\n\t\t]\n\t};\n\n\treturn (new Key(key));\n}\n\nfunction readPkcs8EdDSAPublic(der) {\n\tif (der.peek() === 0x00)\n\t\tder.readByte();\n\n\tvar A = utils.readBitString(der);\n\n\tvar key = {\n\t\ttype: 'ed25519',\n\t\tparts: [\n\t\t\t{ name: 'A', data: utils.zeroPadToLength(A, 32) }\n\t\t]\n\t};\n\n\treturn (new Key(key));\n}\n\nfunction readPkcs8X25519Public(der) {\n\tvar A = utils.readBitString(der);\n\n\tvar key = {\n\t\ttype: 'curve25519',\n\t\tparts: [\n\t\t\t{ name: 'A', data: utils.zeroPadToLength(A, 32) }\n\t\t]\n\t};\n\n\treturn (new Key(key));\n}\n\nfunction readPkcs8EdDSAPrivate(der) {\n\tif (der.peek() === 0x00)\n\t\tder.readByte();\n\n\tder.readSequence(asn1.Ber.OctetString);\n\tvar k = der.readString(asn1.Ber.OctetString, true);\n\tk = utils.zeroPadToLength(k, 32);\n\n\tvar A;\n\tif (der.peek() === asn1.Ber.BitString) {\n\t\tA = utils.readBitString(der);\n\t\tA = utils.zeroPadToLength(A, 32);\n\t} else {\n\t\tA = utils.calculateED25519Public(k);\n\t}\n\n\tvar key = {\n\t\ttype: 'ed25519',\n\t\tparts: [\n\t\t\t{ name: 'A', data: utils.zeroPadToLength(A, 32) },\n\t\t\t{ name: 'k', data: utils.zeroPadToLength(k, 32) }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction readPkcs8X25519Private(der) {\n\tif (der.peek() === 0x00)\n\t\tder.readByte();\n\n\tder.readSequence(asn1.Ber.OctetString);\n\tvar k = der.readString(asn1.Ber.OctetString, true);\n\tk = utils.zeroPadToLength(k, 32);\n\n\tvar A = utils.calculateX25519Public(k);\n\n\tvar key = {\n\t\ttype: 'curve25519',\n\t\tparts: [\n\t\t\t{ name: 'A', data: utils.zeroPadToLength(A, 32) },\n\t\t\t{ name: 'k', data: utils.zeroPadToLength(k, 32) }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction writePkcs8(der, key) {\n\tder.startSequence();\n\n\tif (PrivateKey.isPrivateKey(key)) {\n\t\tvar sillyInt = Buffer.from([0]);\n\t\tder.writeBuffer(sillyInt, asn1.Ber.Integer);\n\t}\n\n\tder.startSequence();\n\tswitch (key.type) {\n\tcase 'rsa':\n\t\tder.writeOID('1.2.840.113549.1.1.1');\n\t\tif (PrivateKey.isPrivateKey(key))\n\t\t\twritePkcs8RSAPrivate(key, der);\n\t\telse\n\t\t\twritePkcs8RSAPublic(key, der);\n\t\tbreak;\n\tcase 'dsa':\n\t\tder.writeOID('1.2.840.10040.4.1');\n\t\tif (PrivateKey.isPrivateKey(key))\n\t\t\twritePkcs8DSAPrivate(key, der);\n\t\telse\n\t\t\twritePkcs8DSAPublic(key, der);\n\t\tbreak;\n\tcase 'ecdsa':\n\t\tder.writeOID('1.2.840.10045.2.1');\n\t\tif (PrivateKey.isPrivateKey(key))\n\t\t\twritePkcs8ECDSAPrivate(key, der);\n\t\telse\n\t\t\twritePkcs8ECDSAPublic(key, der);\n\t\tbreak;\n\tcase 'ed25519':\n\t\tder.writeOID('1.3.101.112');\n\t\tif (PrivateKey.isPrivateKey(key))\n\t\t\tthrow (new Error('Ed25519 private keys in pkcs8 ' +\n\t\t\t    'format are not supported'));\n\t\twritePkcs8EdDSAPublic(key, der);\n\t\tbreak;\n\tdefault:\n\t\tthrow (new Error('Unsupported key type: ' + key.type));\n\t}\n\n\tder.endSequence();\n}\n\nfunction writePkcs8RSAPrivate(key, der) {\n\tder.writeNull();\n\tder.endSequence();\n\n\tder.startSequence(asn1.Ber.OctetString);\n\tder.startSequence();\n\n\tvar version = Buffer.from([0]);\n\tder.writeBuffer(version, asn1.Ber.Integer);\n\n\tder.writeBuffer(key.part.n.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.e.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.d.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.p.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.q.data, asn1.Ber.Integer);\n\tif (!key.part.dmodp || !key.part.dmodq)\n\t\tutils.addRSAMissing(key);\n\tder.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer);\n\n\tder.endSequence();\n\tder.endSequence();\n}\n\nfunction writePkcs8RSAPublic(key, der) {\n\tder.writeNull();\n\tder.endSequence();\n\n\tder.startSequence(asn1.Ber.BitString);\n\tder.writeByte(0x00);\n\n\tder.startSequence();\n\tder.writeBuffer(key.part.n.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.e.data, asn1.Ber.Integer);\n\tder.endSequence();\n\n\tder.endSequence();\n}\n\nfunction writePkcs8DSAPrivate(key, der) {\n\tder.startSequence();\n\tder.writeBuffer(key.part.p.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.q.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.g.data, asn1.Ber.Integer);\n\tder.endSequence();\n\n\tder.endSequence();\n\n\tder.startSequence(asn1.Ber.OctetString);\n\tder.writeBuffer(key.part.x.data, asn1.Ber.Integer);\n\tder.endSequence();\n}\n\nfunction writePkcs8DSAPublic(key, der) {\n\tder.startSequence();\n\tder.writeBuffer(key.part.p.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.q.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.g.data, asn1.Ber.Integer);\n\tder.endSequence();\n\tder.endSequence();\n\n\tder.startSequence(asn1.Ber.BitString);\n\tder.writeByte(0x00);\n\tder.writeBuffer(key.part.y.data, asn1.Ber.Integer);\n\tder.endSequence();\n}\n\nfunction writeECDSACurve(key, der) {\n\tvar curve = algs.curves[key.curve];\n\tif (curve.pkcs8oid) {\n\t\t/* This one has a name in pkcs#8, so just write the oid */\n\t\tder.writeOID(curve.pkcs8oid);\n\n\t} else {\n\t\t// ECParameters sequence\n\t\tder.startSequence();\n\n\t\tvar version = Buffer.from([1]);\n\t\tder.writeBuffer(version, asn1.Ber.Integer);\n\n\t\t// FieldID sequence\n\t\tder.startSequence();\n\t\tder.writeOID('1.2.840.10045.1.1'); // prime-field\n\t\tder.writeBuffer(curve.p, asn1.Ber.Integer);\n\t\tder.endSequence();\n\n\t\t// Curve sequence\n\t\tder.startSequence();\n\t\tvar a = curve.p;\n\t\tif (a[0] === 0x0)\n\t\t\ta = a.slice(1);\n\t\tder.writeBuffer(a, asn1.Ber.OctetString);\n\t\tder.writeBuffer(curve.b, asn1.Ber.OctetString);\n\t\tder.writeBuffer(curve.s, asn1.Ber.BitString);\n\t\tder.endSequence();\n\n\t\tder.writeBuffer(curve.G, asn1.Ber.OctetString);\n\t\tder.writeBuffer(curve.n, asn1.Ber.Integer);\n\t\tvar h = curve.h;\n\t\tif (!h) {\n\t\t\th = Buffer.from([1]);\n\t\t}\n\t\tder.writeBuffer(h, asn1.Ber.Integer);\n\n\t\t// ECParameters\n\t\tder.endSequence();\n\t}\n}\n\nfunction writePkcs8ECDSAPublic(key, der) {\n\twriteECDSACurve(key, der);\n\tder.endSequence();\n\n\tvar Q = utils.ecNormalize(key.part.Q.data, true);\n\tder.writeBuffer(Q, asn1.Ber.BitString);\n}\n\nfunction writePkcs8ECDSAPrivate(key, der) {\n\twriteECDSACurve(key, der);\n\tder.endSequence();\n\n\tder.startSequence(asn1.Ber.OctetString);\n\tder.startSequence();\n\n\tvar version = Buffer.from([1]);\n\tder.writeBuffer(version, asn1.Ber.Integer);\n\n\tder.writeBuffer(key.part.d.data, asn1.Ber.OctetString);\n\n\tder.startSequence(0xa1);\n\tvar Q = utils.ecNormalize(key.part.Q.data, true);\n\tder.writeBuffer(Q, asn1.Ber.BitString);\n\tder.endSequence();\n\n\tder.endSequence();\n\tder.endSequence();\n}\n\nfunction writePkcs8EdDSAPublic(key, der) {\n\tder.endSequence();\n\n\tutils.writeBitString(der, key.part.A.data);\n}\n\nfunction writePkcs8EdDSAPrivate(key, der) {\n\tder.endSequence();\n\n\tvar k = utils.mpNormalize(key.part.k.data, true);\n\tder.startSequence(asn1.Ber.OctetString);\n\tder.writeBuffer(k, asn1.Ber.OctetString);\n\tder.endSequence();\n}\n\n\n/***/ }),\n/* 159 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2017 Joyent, Inc.\n\nmodule.exports = Identity;\n\nvar assert = __webpack_require__(16);\nvar algs = __webpack_require__(32);\nvar crypto = __webpack_require__(11);\nvar Fingerprint = __webpack_require__(157);\nvar Signature = __webpack_require__(75);\nvar errs = __webpack_require__(74);\nvar util = __webpack_require__(3);\nvar utils = __webpack_require__(26);\nvar asn1 = __webpack_require__(66);\nvar Buffer = __webpack_require__(15).Buffer;\n\n/*JSSTYLED*/\nvar DNS_NAME_RE = /^([*]|[a-z0-9][a-z0-9\\-]{0,62})(?:\\.([*]|[a-z0-9][a-z0-9\\-]{0,62}))*$/i;\n\nvar oids = {};\noids.cn = '2.5.4.3';\noids.o = '2.5.4.10';\noids.ou = '2.5.4.11';\noids.l = '2.5.4.7';\noids.s = '2.5.4.8';\noids.c = '2.5.4.6';\noids.sn = '2.5.4.4';\noids.dc = '0.9.2342.19200300.100.1.25';\noids.uid = '0.9.2342.19200300.100.1.1';\noids.mail = '0.9.2342.19200300.100.1.3';\n\nvar unoids = {};\nObject.keys(oids).forEach(function (k) {\n\tunoids[oids[k]] = k;\n});\n\nfunction Identity(opts) {\n\tvar self = this;\n\tassert.object(opts, 'options');\n\tassert.arrayOfObject(opts.components, 'options.components');\n\tthis.components = opts.components;\n\tthis.componentLookup = {};\n\tthis.components.forEach(function (c) {\n\t\tif (c.name && !c.oid)\n\t\t\tc.oid = oids[c.name];\n\t\tif (c.oid && !c.name)\n\t\t\tc.name = unoids[c.oid];\n\t\tif (self.componentLookup[c.name] === undefined)\n\t\t\tself.componentLookup[c.name] = [];\n\t\tself.componentLookup[c.name].push(c);\n\t});\n\tif (this.componentLookup.cn && this.componentLookup.cn.length > 0) {\n\t\tthis.cn = this.componentLookup.cn[0].value;\n\t}\n\tassert.optionalString(opts.type, 'options.type');\n\tif (opts.type === undefined) {\n\t\tif (this.components.length === 1 &&\n\t\t    this.componentLookup.cn &&\n\t\t    this.componentLookup.cn.length === 1 &&\n\t\t    this.componentLookup.cn[0].value.match(DNS_NAME_RE)) {\n\t\t\tthis.type = 'host';\n\t\t\tthis.hostname = this.componentLookup.cn[0].value;\n\n\t\t} else if (this.componentLookup.dc &&\n\t\t    this.components.length === this.componentLookup.dc.length) {\n\t\t\tthis.type = 'host';\n\t\t\tthis.hostname = this.componentLookup.dc.map(\n\t\t\t    function (c) {\n\t\t\t\treturn (c.value);\n\t\t\t}).join('.');\n\n\t\t} else if (this.componentLookup.uid &&\n\t\t    this.components.length ===\n\t\t    this.componentLookup.uid.length) {\n\t\t\tthis.type = 'user';\n\t\t\tthis.uid = this.componentLookup.uid[0].value;\n\n\t\t} else if (this.componentLookup.cn &&\n\t\t    this.componentLookup.cn.length === 1 &&\n\t\t    this.componentLookup.cn[0].value.match(DNS_NAME_RE)) {\n\t\t\tthis.type = 'host';\n\t\t\tthis.hostname = this.componentLookup.cn[0].value;\n\n\t\t} else if (this.componentLookup.uid &&\n\t\t    this.componentLookup.uid.length === 1) {\n\t\t\tthis.type = 'user';\n\t\t\tthis.uid = this.componentLookup.uid[0].value;\n\n\t\t} else if (this.componentLookup.mail &&\n\t\t    this.componentLookup.mail.length === 1) {\n\t\t\tthis.type = 'email';\n\t\t\tthis.email = this.componentLookup.mail[0].value;\n\n\t\t} else if (this.componentLookup.cn &&\n\t\t    this.componentLookup.cn.length === 1) {\n\t\t\tthis.type = 'user';\n\t\t\tthis.uid = this.componentLookup.cn[0].value;\n\n\t\t} else {\n\t\t\tthis.type = 'unknown';\n\t\t}\n\t} else {\n\t\tthis.type = opts.type;\n\t\tif (this.type === 'host')\n\t\t\tthis.hostname = opts.hostname;\n\t\telse if (this.type === 'user')\n\t\t\tthis.uid = opts.uid;\n\t\telse if (this.type === 'email')\n\t\t\tthis.email = opts.email;\n\t\telse\n\t\t\tthrow (new Error('Unknown type ' + this.type));\n\t}\n}\n\nIdentity.prototype.toString = function () {\n\treturn (this.components.map(function (c) {\n\t\treturn (c.name.toUpperCase() + '=' + c.value);\n\t}).join(', '));\n};\n\n/*\n * These are from X.680 -- PrintableString allowed chars are in section 37.4\n * table 8. Spec for IA5Strings is \"1,6 + SPACE + DEL\" where 1 refers to\n * ISO IR #001 (standard ASCII control characters) and 6 refers to ISO IR #006\n * (the basic ASCII character set).\n */\n/* JSSTYLED */\nvar NOT_PRINTABLE = /[^a-zA-Z0-9 '(),+.\\/:=?-]/;\n/* JSSTYLED */\nvar NOT_IA5 = /[^\\x00-\\x7f]/;\n\nIdentity.prototype.toAsn1 = function (der, tag) {\n\tder.startSequence(tag);\n\tthis.components.forEach(function (c) {\n\t\tder.startSequence(asn1.Ber.Constructor | asn1.Ber.Set);\n\t\tder.startSequence();\n\t\tder.writeOID(c.oid);\n\t\t/*\n\t\t * If we fit in a PrintableString, use that. Otherwise use an\n\t\t * IA5String or UTF8String.\n\t\t *\n\t\t * If this identity was parsed from a DN, use the ASN.1 types\n\t\t * from the original representation (otherwise this might not\n\t\t * be a full match for the original in some validators).\n\t\t */\n\t\tif (c.asn1type === asn1.Ber.Utf8String ||\n\t\t    c.value.match(NOT_IA5)) {\n\t\t\tvar v = Buffer.from(c.value, 'utf8');\n\t\t\tder.writeBuffer(v, asn1.Ber.Utf8String);\n\n\t\t} else if (c.asn1type === asn1.Ber.IA5String ||\n\t\t    c.value.match(NOT_PRINTABLE)) {\n\t\t\tder.writeString(c.value, asn1.Ber.IA5String);\n\n\t\t} else {\n\t\t\tvar type = asn1.Ber.PrintableString;\n\t\t\tif (c.asn1type !== undefined)\n\t\t\t\ttype = c.asn1type;\n\t\t\tder.writeString(c.value, type);\n\t\t}\n\t\tder.endSequence();\n\t\tder.endSequence();\n\t});\n\tder.endSequence();\n};\n\nfunction globMatch(a, b) {\n\tif (a === '**' || b === '**')\n\t\treturn (true);\n\tvar aParts = a.split('.');\n\tvar bParts = b.split('.');\n\tif (aParts.length !== bParts.length)\n\t\treturn (false);\n\tfor (var i = 0; i < aParts.length; ++i) {\n\t\tif (aParts[i] === '*' || bParts[i] === '*')\n\t\t\tcontinue;\n\t\tif (aParts[i] !== bParts[i])\n\t\t\treturn (false);\n\t}\n\treturn (true);\n}\n\nIdentity.prototype.equals = function (other) {\n\tif (!Identity.isIdentity(other, [1, 0]))\n\t\treturn (false);\n\tif (other.components.length !== this.components.length)\n\t\treturn (false);\n\tfor (var i = 0; i < this.components.length; ++i) {\n\t\tif (this.components[i].oid !== other.components[i].oid)\n\t\t\treturn (false);\n\t\tif (!globMatch(this.components[i].value,\n\t\t    other.components[i].value)) {\n\t\t\treturn (false);\n\t\t}\n\t}\n\treturn (true);\n};\n\nIdentity.forHost = function (hostname) {\n\tassert.string(hostname, 'hostname');\n\treturn (new Identity({\n\t\ttype: 'host',\n\t\thostname: hostname,\n\t\tcomponents: [ { name: 'cn', value: hostname } ]\n\t}));\n};\n\nIdentity.forUser = function (uid) {\n\tassert.string(uid, 'uid');\n\treturn (new Identity({\n\t\ttype: 'user',\n\t\tuid: uid,\n\t\tcomponents: [ { name: 'uid', value: uid } ]\n\t}));\n};\n\nIdentity.forEmail = function (email) {\n\tassert.string(email, 'email');\n\treturn (new Identity({\n\t\ttype: 'email',\n\t\temail: email,\n\t\tcomponents: [ { name: 'mail', value: email } ]\n\t}));\n};\n\nIdentity.parseDN = function (dn) {\n\tassert.string(dn, 'dn');\n\tvar parts = dn.split(',');\n\tvar cmps = parts.map(function (c) {\n\t\tc = c.trim();\n\t\tvar eqPos = c.indexOf('=');\n\t\tvar name = c.slice(0, eqPos).toLowerCase();\n\t\tvar value = c.slice(eqPos + 1);\n\t\treturn ({ name: name, value: value });\n\t});\n\treturn (new Identity({ components: cmps }));\n};\n\nIdentity.parseAsn1 = function (der, top) {\n\tvar components = [];\n\tder.readSequence(top);\n\tvar end = der.offset + der.length;\n\twhile (der.offset < end) {\n\t\tder.readSequence(asn1.Ber.Constructor | asn1.Ber.Set);\n\t\tvar after = der.offset + der.length;\n\t\tder.readSequence();\n\t\tvar oid = der.readOID();\n\t\tvar type = der.peek();\n\t\tvar value;\n\t\tswitch (type) {\n\t\tcase asn1.Ber.PrintableString:\n\t\tcase asn1.Ber.IA5String:\n\t\tcase asn1.Ber.OctetString:\n\t\tcase asn1.Ber.T61String:\n\t\t\tvalue = der.readString(type);\n\t\t\tbreak;\n\t\tcase asn1.Ber.Utf8String:\n\t\t\tvalue = der.readString(type, true);\n\t\t\tvalue = value.toString('utf8');\n\t\t\tbreak;\n\t\tcase asn1.Ber.CharacterString:\n\t\tcase asn1.Ber.BMPString:\n\t\t\tvalue = der.readString(type, true);\n\t\t\tvalue = value.toString('utf16le');\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthrow (new Error('Unknown asn1 type ' + type));\n\t\t}\n\t\tcomponents.push({ oid: oid, asn1type: type, value: value });\n\t\tder._offset = after;\n\t}\n\tder._offset = end;\n\treturn (new Identity({\n\t\tcomponents: components\n\t}));\n};\n\nIdentity.isIdentity = function (obj, ver) {\n\treturn (utils.isCompatible(obj, Identity, ver));\n};\n\n/*\n * API versions for Identity:\n * [1,0] -- initial ver\n */\nIdentity.prototype._sshpkApiVersion = [1, 0];\n\nIdentity._oldVersionDetect = function (obj) {\n\treturn ([1, 0]);\n};\n\n\n/***/ }),\n/* 160 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nmodule.exports = SSHBuffer;\n\nvar assert = __webpack_require__(16);\nvar Buffer = __webpack_require__(15).Buffer;\n\nfunction SSHBuffer(opts) {\n\tassert.object(opts, 'options');\n\tif (opts.buffer !== undefined)\n\t\tassert.buffer(opts.buffer, 'options.buffer');\n\n\tthis._size = opts.buffer ? opts.buffer.length : 1024;\n\tthis._buffer = opts.buffer || Buffer.alloc(this._size);\n\tthis._offset = 0;\n}\n\nSSHBuffer.prototype.toBuffer = function () {\n\treturn (this._buffer.slice(0, this._offset));\n};\n\nSSHBuffer.prototype.atEnd = function () {\n\treturn (this._offset >= this._buffer.length);\n};\n\nSSHBuffer.prototype.remainder = function () {\n\treturn (this._buffer.slice(this._offset));\n};\n\nSSHBuffer.prototype.skip = function (n) {\n\tthis._offset += n;\n};\n\nSSHBuffer.prototype.expand = function () {\n\tthis._size *= 2;\n\tvar buf = Buffer.alloc(this._size);\n\tthis._buffer.copy(buf, 0);\n\tthis._buffer = buf;\n};\n\nSSHBuffer.prototype.readPart = function () {\n\treturn ({data: this.readBuffer()});\n};\n\nSSHBuffer.prototype.readBuffer = function () {\n\tvar len = this._buffer.readUInt32BE(this._offset);\n\tthis._offset += 4;\n\tassert.ok(this._offset + len <= this._buffer.length,\n\t    'length out of bounds at +0x' + this._offset.toString(16) +\n\t    ' (data truncated?)');\n\tvar buf = this._buffer.slice(this._offset, this._offset + len);\n\tthis._offset += len;\n\treturn (buf);\n};\n\nSSHBuffer.prototype.readString = function () {\n\treturn (this.readBuffer().toString());\n};\n\nSSHBuffer.prototype.readCString = function () {\n\tvar offset = this._offset;\n\twhile (offset < this._buffer.length &&\n\t    this._buffer[offset] !== 0x00)\n\t\toffset++;\n\tassert.ok(offset < this._buffer.length, 'c string does not terminate');\n\tvar str = this._buffer.slice(this._offset, offset).toString();\n\tthis._offset = offset + 1;\n\treturn (str);\n};\n\nSSHBuffer.prototype.readInt = function () {\n\tvar v = this._buffer.readUInt32BE(this._offset);\n\tthis._offset += 4;\n\treturn (v);\n};\n\nSSHBuffer.prototype.readInt64 = function () {\n\tassert.ok(this._offset + 8 < this._buffer.length,\n\t    'buffer not long enough to read Int64');\n\tvar v = this._buffer.slice(this._offset, this._offset + 8);\n\tthis._offset += 8;\n\treturn (v);\n};\n\nSSHBuffer.prototype.readChar = function () {\n\tvar v = this._buffer[this._offset++];\n\treturn (v);\n};\n\nSSHBuffer.prototype.writeBuffer = function (buf) {\n\twhile (this._offset + 4 + buf.length > this._size)\n\t\tthis.expand();\n\tthis._buffer.writeUInt32BE(buf.length, this._offset);\n\tthis._offset += 4;\n\tbuf.copy(this._buffer, this._offset);\n\tthis._offset += buf.length;\n};\n\nSSHBuffer.prototype.writeString = function (str) {\n\tthis.writeBuffer(Buffer.from(str, 'utf8'));\n};\n\nSSHBuffer.prototype.writeCString = function (str) {\n\twhile (this._offset + 1 + str.length > this._size)\n\t\tthis.expand();\n\tthis._buffer.write(str, this._offset);\n\tthis._offset += str.length;\n\tthis._buffer[this._offset++] = 0;\n};\n\nSSHBuffer.prototype.writeInt = function (v) {\n\twhile (this._offset + 4 > this._size)\n\t\tthis.expand();\n\tthis._buffer.writeUInt32BE(v, this._offset);\n\tthis._offset += 4;\n};\n\nSSHBuffer.prototype.writeInt64 = function (v) {\n\tassert.buffer(v, 'value');\n\tif (v.length > 8) {\n\t\tvar lead = v.slice(0, v.length - 8);\n\t\tfor (var i = 0; i < lead.length; ++i) {\n\t\t\tassert.strictEqual(lead[i], 0,\n\t\t\t    'must fit in 64 bits of precision');\n\t\t}\n\t\tv = v.slice(v.length - 8, v.length);\n\t}\n\twhile (this._offset + 8 > this._size)\n\t\tthis.expand();\n\tv.copy(this._buffer, this._offset);\n\tthis._offset += 8;\n};\n\nSSHBuffer.prototype.writeChar = function (v) {\n\twhile (this._offset + 1 > this._size)\n\t\tthis.expand();\n\tthis._buffer[this._offset++] = v;\n};\n\nSSHBuffer.prototype.writePart = function (p) {\n\tthis.writeBuffer(p.data);\n};\n\nSSHBuffer.prototype.write = function (buf) {\n\twhile (this._offset + buf.length > this._size)\n\t\tthis.expand();\n\tbuf.copy(this._buffer, this._offset);\n\tthis._offset += buf.length;\n};\n\n\n/***/ }),\n/* 161 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = x => {\n\tif (typeof x !== 'string') {\n\t\tthrow new TypeError('Expected a string, got ' + typeof x);\n\t}\n\n\t// Catches EFBBBF (UTF-8 BOM) because the buffer-to-string\n\t// conversion translates it to FEFF (UTF-16 BOM)\n\tif (x.charCodeAt(0) === 0xFEFF) {\n\t\treturn x.slice(1);\n\t}\n\n\treturn x;\n};\n\n\n/***/ }),\n/* 162 */\n/***/ (function(module, exports) {\n\n// Returns a wrapper function that returns a wrapped callback\n// The wrapper function should do some stuff, and return a\n// presumably different callback function.\n// This makes sure that own properties are retained, so that\n// decorations and such are not lost along the way.\nmodule.exports = wrappy\nfunction wrappy (fn, cb) {\n  if (fn && cb) return wrappy(fn)(cb)\n\n  if (typeof fn !== 'function')\n    throw new TypeError('need wrapper function')\n\n  Object.keys(fn).forEach(function (k) {\n    wrapper[k] = fn[k]\n  })\n\n  return wrapper\n\n  function wrapper() {\n    var args = new Array(arguments.length)\n    for (var i = 0; i < args.length; i++) {\n      args[i] = arguments[i]\n    }\n    var ret = fn.apply(this, args)\n    var cb = args[args.length-1]\n    if (typeof ret === 'function' && ret !== cb) {\n      Object.keys(cb).forEach(function (k) {\n        ret[k] = cb[k]\n      })\n    }\n    return ret\n  }\n}\n\n\n/***/ }),\n/* 163 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nexports.extractWorkspaces = extractWorkspaces;\n\nvar _executeLifecycleScript;\n\nfunction _load_executeLifecycleScript() {\n  return _executeLifecycleScript = __webpack_require__(111);\n}\n\nvar _path;\n\nfunction _load_path() {\n  return _path = __webpack_require__(371);\n}\n\nvar _conversion;\n\nfunction _load_conversion() {\n  return _conversion = __webpack_require__(336);\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = _interopRequireDefault(__webpack_require__(218));\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _packageConstraintResolver;\n\nfunction _load_packageConstraintResolver() {\n  return _packageConstraintResolver = _interopRequireDefault(__webpack_require__(523));\n}\n\nvar _requestManager;\n\nfunction _load_requestManager() {\n  return _requestManager = _interopRequireDefault(__webpack_require__(372));\n}\n\nvar _index2;\n\nfunction _load_index2() {\n  return _index2 = __webpack_require__(58);\n}\n\nvar _index3;\n\nfunction _load_index3() {\n  return _index3 = __webpack_require__(201);\n}\n\nvar _map;\n\nfunction _load_map() {\n  return _map = _interopRequireDefault(__webpack_require__(30));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst crypto = __webpack_require__(11);\nconst detectIndent = __webpack_require__(603);\nconst invariant = __webpack_require__(9);\nconst path = __webpack_require__(0);\nconst micromatch = __webpack_require__(115);\nconst isCi = __webpack_require__(397);\n\nfunction sortObject(object) {\n  const sortedObject = {};\n  Object.keys(object).sort().forEach(item => {\n    sortedObject[item] = object[item];\n  });\n  return sortedObject;\n}\n\nclass Config {\n  constructor(reporter) {\n    this.constraintResolver = new (_packageConstraintResolver || _load_packageConstraintResolver()).default(this, reporter);\n    this.requestManager = new (_requestManager || _load_requestManager()).default(reporter);\n    this.reporter = reporter;\n    this._init({});\n  }\n\n  //\n\n\n  //\n\n\n  // cache packages in offline mirror folder as new .tgz files\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  // Whether we should ignore executing lifecycle scripts\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  /**\n   * Execute a promise produced by factory if it doesn't exist in our cache with\n   * the associated key.\n   */\n\n  getCache(key, factory) {\n    const cached = this.cache[key];\n    if (cached) {\n      return cached;\n    }\n\n    return this.cache[key] = factory().catch(err => {\n      this.cache[key] = null;\n      throw err;\n    });\n  }\n\n  /**\n   * Get a config option from our yarn config.\n   */\n\n  getOption(key, resolve = false) {\n    const value = this.registries.yarn.getOption(key);\n\n    if (resolve && typeof value === 'string' && value.length) {\n      return (0, (_path || _load_path()).resolveWithHome)(value);\n    }\n\n    return value;\n  }\n\n  /**\n   * Reduce a list of versions to a single one based on an input range.\n   */\n\n  resolveConstraints(versions, range) {\n    return this.constraintResolver.reduce(versions, range);\n  }\n\n  /**\n   * Initialise config. Fetch registry options, find package roots.\n   */\n\n  init(opts = {}) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      _this._init(opts);\n\n      _this.workspaceRootFolder = yield _this.findWorkspaceRoot(_this.cwd);\n      _this.lockfileFolder = _this.workspaceRootFolder || _this.cwd;\n\n      // using focus in a workspace root is not allowed\n      if (_this.focus && (!_this.workspaceRootFolder || _this.cwd === _this.workspaceRootFolder)) {\n        throw new (_errors || _load_errors()).MessageError(_this.reporter.lang('workspacesFocusRootCheck'));\n      }\n\n      if (_this.focus) {\n        const focusedWorkspaceManifest = yield _this.readRootManifest();\n        _this.focusedWorkspaceName = focusedWorkspaceManifest.name;\n      }\n\n      _this.linkedModules = [];\n\n      let linkedModules;\n      try {\n        linkedModules = yield (_fs || _load_fs()).readdir(_this.linkFolder);\n      } catch (err) {\n        if (err.code === 'ENOENT') {\n          linkedModules = [];\n        } else {\n          throw err;\n        }\n      }\n\n      for (var _iterator = linkedModules, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref = _i.value;\n        }\n\n        const dir = _ref;\n\n        const linkedPath = path.join(_this.linkFolder, dir);\n\n        if (dir[0] === '@') {\n          // it's a scope, not a package\n          const scopedLinked = yield (_fs || _load_fs()).readdir(linkedPath);\n          _this.linkedModules.push(...scopedLinked.map(function (scopedDir) {\n            return path.join(dir, scopedDir);\n          }));\n        } else {\n          _this.linkedModules.push(dir);\n        }\n      }\n\n      for (var _iterator2 = Object.keys((_index2 || _load_index2()).registries), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref2;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref2 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref2 = _i2.value;\n        }\n\n        const key = _ref2;\n\n        const Registry = (_index2 || _load_index2()).registries[key];\n\n        const extraneousRcFiles = Registry === (_index2 || _load_index2()).registries.yarn ? _this.extraneousYarnrcFiles : [];\n\n        // instantiate registry\n        const registry = new Registry(_this.cwd, _this.registries, _this.requestManager, _this.reporter, _this.enableDefaultRc, extraneousRcFiles);\n        yield registry.init({\n          registry: opts.registry\n        });\n\n        _this.registries[key] = registry;\n        if (_this.registryFolders.indexOf(registry.folder) === -1) {\n          _this.registryFolders.push(registry.folder);\n        }\n      }\n\n      if (_this.modulesFolder) {\n        _this.registryFolders = [_this.modulesFolder];\n      }\n\n      _this.networkConcurrency = opts.networkConcurrency || Number(_this.getOption('network-concurrency')) || (_constants || _load_constants()).NETWORK_CONCURRENCY;\n\n      _this.childConcurrency = opts.childConcurrency || Number(_this.getOption('child-concurrency')) || Number(process.env.CHILD_CONCURRENCY) || (_constants || _load_constants()).CHILD_CONCURRENCY;\n\n      _this.networkTimeout = opts.networkTimeout || Number(_this.getOption('network-timeout')) || (_constants || _load_constants()).NETWORK_TIMEOUT;\n\n      const httpProxy = opts.httpProxy || _this.getOption('proxy');\n      const httpsProxy = opts.httpsProxy || _this.getOption('https-proxy');\n      _this.requestManager.setOptions({\n        userAgent: String(_this.getOption('user-agent')),\n        httpProxy: httpProxy === false ? false : String(httpProxy || ''),\n        httpsProxy: httpsProxy === false ? false : String(httpsProxy || ''),\n        strictSSL: Boolean(_this.getOption('strict-ssl')),\n        ca: Array.prototype.concat(opts.ca || _this.getOption('ca') || []).map(String),\n        cafile: String(opts.cafile || _this.getOption('cafile', true) || ''),\n        cert: String(opts.cert || _this.getOption('cert') || ''),\n        key: String(opts.key || _this.getOption('key') || ''),\n        networkConcurrency: _this.networkConcurrency,\n        networkTimeout: _this.networkTimeout\n      });\n\n      _this.globalFolder = opts.globalFolder || String(_this.getOption('global-folder', true));\n      if (_this.globalFolder === 'undefined') {\n        _this.globalFolder = (_constants || _load_constants()).GLOBAL_MODULE_DIRECTORY;\n      }\n\n      let cacheRootFolder = opts.cacheFolder || _this.getOption('cache-folder', true);\n\n      if (!cacheRootFolder) {\n        let preferredCacheFolders = (_constants || _load_constants()).PREFERRED_MODULE_CACHE_DIRECTORIES;\n        const preferredCacheFolder = opts.preferredCacheFolder || _this.getOption('preferred-cache-folder', true);\n\n        if (preferredCacheFolder) {\n          preferredCacheFolders = [String(preferredCacheFolder)].concat(preferredCacheFolders);\n        }\n\n        const cacheFolderQuery = yield (_fs || _load_fs()).getFirstSuitableFolder(preferredCacheFolders, (_fs || _load_fs()).constants.W_OK | (_fs || _load_fs()).constants.X_OK | (_fs || _load_fs()).constants.R_OK // eslint-disable-line no-bitwise\n        );\n        for (var _iterator3 = cacheFolderQuery.skipped, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n          var _ref3;\n\n          if (_isArray3) {\n            if (_i3 >= _iterator3.length) break;\n            _ref3 = _iterator3[_i3++];\n          } else {\n            _i3 = _iterator3.next();\n            if (_i3.done) break;\n            _ref3 = _i3.value;\n          }\n\n          const skippedEntry = _ref3;\n\n          _this.reporter.warn(_this.reporter.lang('cacheFolderSkipped', skippedEntry.folder));\n        }\n\n        cacheRootFolder = cacheFolderQuery.folder;\n        if (cacheRootFolder && cacheFolderQuery.skipped.length > 0) {\n          _this.reporter.warn(_this.reporter.lang('cacheFolderSelected', cacheRootFolder));\n        }\n      }\n\n      if (!cacheRootFolder) {\n        throw new (_errors || _load_errors()).MessageError(_this.reporter.lang('cacheFolderMissing'));\n      } else {\n        _this._cacheRootFolder = String(cacheRootFolder);\n      }\n\n      const manifest = yield _this.maybeReadManifest(_this.lockfileFolder);\n\n      const plugnplayByEnv = _this.getOption('plugnplay-override');\n      if (plugnplayByEnv != null) {\n        _this.plugnplayEnabled = plugnplayByEnv !== 'false' && plugnplayByEnv !== '0';\n        _this.plugnplayPersist = false;\n      } else if (opts.enablePnp || opts.disablePnp) {\n        _this.plugnplayEnabled = !!opts.enablePnp;\n        _this.plugnplayPersist = true;\n      } else if (manifest && manifest.installConfig && manifest.installConfig.pnp) {\n        _this.plugnplayEnabled = !!manifest.installConfig.pnp;\n        _this.plugnplayPersist = false;\n      } else {\n        _this.plugnplayEnabled = false;\n        _this.plugnplayPersist = false;\n      }\n\n      if (process.platform === 'win32') {\n        const cacheRootFolderDrive = path.parse(_this._cacheRootFolder).root.toLowerCase();\n        const lockfileFolderDrive = path.parse(_this.lockfileFolder).root.toLowerCase();\n\n        if (cacheRootFolderDrive !== lockfileFolderDrive) {\n          if (_this.plugnplayEnabled) {\n            _this.reporter.warn(_this.reporter.lang('plugnplayWindowsSupport'));\n          }\n          _this.plugnplayEnabled = false;\n          _this.plugnplayPersist = false;\n        }\n      }\n\n      _this.plugnplayShebang = String(_this.getOption('plugnplay-shebang') || '') || '/usr/bin/env node';\n      _this.plugnplayBlacklist = String(_this.getOption('plugnplay-blacklist') || '') || null;\n\n      _this.ignoreScripts = opts.ignoreScripts || Boolean(_this.getOption('ignore-scripts', false));\n\n      _this.workspacesEnabled = _this.getOption('workspaces-experimental') !== false;\n      _this.workspacesNohoistEnabled = _this.getOption('workspaces-nohoist-experimental') !== false;\n\n      _this.offlineCacheFolder = String(_this.getOption('offline-cache-folder') || '') || null;\n\n      _this.pruneOfflineMirror = Boolean(_this.getOption('yarn-offline-mirror-pruning'));\n      _this.enableMetaFolder = Boolean(_this.getOption('enable-meta-folder'));\n      _this.enableLockfileVersions = Boolean(_this.getOption('yarn-enable-lockfile-versions'));\n      _this.linkFileDependencies = Boolean(_this.getOption('yarn-link-file-dependencies'));\n      _this.packBuiltPackages = Boolean(_this.getOption('experimental-pack-script-packages-in-mirror'));\n\n      _this.autoAddIntegrity = !(0, (_conversion || _load_conversion()).boolifyWithDefault)(String(_this.getOption('unsafe-disable-integrity-migration')), true);\n\n      //init & create cacheFolder, tempFolder\n      _this.cacheFolder = path.join(_this._cacheRootFolder, 'v' + String((_constants || _load_constants()).CACHE_VERSION));\n      _this.tempFolder = opts.tempFolder || path.join(_this.cacheFolder, '.tmp');\n      yield (_fs || _load_fs()).mkdirp(_this.cacheFolder);\n      yield (_fs || _load_fs()).mkdirp(_this.tempFolder);\n\n      if (opts.production !== undefined) {\n        _this.production = Boolean(opts.production);\n      } else {\n        _this.production = Boolean(_this.getOption('production')) || process.env.NODE_ENV === 'production' && process.env.NPM_CONFIG_PRODUCTION !== 'false' && process.env.YARN_PRODUCTION !== 'false';\n      }\n\n      if (_this.workspaceRootFolder && !_this.workspacesEnabled) {\n        throw new (_errors || _load_errors()).MessageError(_this.reporter.lang('workspacesDisabled'));\n      }\n    })();\n  }\n\n  _init(opts) {\n    this.registryFolders = [];\n    this.linkedModules = [];\n\n    this.registries = (0, (_map || _load_map()).default)();\n    this.cache = (0, (_map || _load_map()).default)();\n\n    // Ensure the cwd is always an absolute path.\n    this.cwd = path.resolve(opts.cwd || this.cwd || process.cwd());\n\n    this.looseSemver = opts.looseSemver == undefined ? true : opts.looseSemver;\n\n    this.commandName = opts.commandName || '';\n\n    this.enableDefaultRc = opts.enableDefaultRc !== false;\n    this.extraneousYarnrcFiles = opts.extraneousYarnrcFiles || [];\n\n    this.preferOffline = !!opts.preferOffline;\n    this.modulesFolder = opts.modulesFolder;\n    this.linkFolder = opts.linkFolder || (_constants || _load_constants()).LINK_REGISTRY_DIRECTORY;\n    this.offline = !!opts.offline;\n    this.binLinks = !!opts.binLinks;\n    this.updateChecksums = !!opts.updateChecksums;\n    this.plugnplayUnplugged = [];\n    this.plugnplayPurgeUnpluggedPackages = false;\n\n    this.ignorePlatform = !!opts.ignorePlatform;\n    this.ignoreScripts = !!opts.ignoreScripts;\n\n    this.disablePrepublish = !!opts.disablePrepublish;\n\n    // $FlowFixMe$\n    this.nonInteractive = !!opts.nonInteractive || isCi || !process.stdout.isTTY;\n\n    this.requestManager.setOptions({\n      offline: !!opts.offline && !opts.preferOffline,\n      captureHar: !!opts.captureHar\n    });\n\n    this.focus = !!opts.focus;\n    this.focusedWorkspaceName = '';\n\n    this.otp = opts.otp || '';\n  }\n\n  /**\n   * Generate a name suitable as unique filesystem identifier for the specified package.\n   */\n\n  generateUniquePackageSlug(pkg) {\n    let slug = pkg.name;\n\n    slug = slug.replace(/[^@a-z0-9]+/g, '-');\n    slug = slug.replace(/^-+|-+$/g, '');\n\n    if (pkg.registry) {\n      slug = `${pkg.registry}-${slug}`;\n    } else {\n      slug = `unknown-${slug}`;\n    }\n\n    const hash = pkg.remote.hash;\n\n\n    if (pkg.version) {\n      slug += `-${pkg.version}`;\n    }\n\n    if (pkg.uid && pkg.version !== pkg.uid) {\n      slug += `-${pkg.uid}`;\n    } else if (hash) {\n      slug += `-${hash}`;\n    }\n\n    if (pkg.remote.integrity) {\n      slug += `-integrity`;\n    }\n\n    return slug;\n  }\n\n  /**\n   * Generate an absolute module path.\n   */\n\n  generateModuleCachePath(pkg) {\n    invariant(this.cacheFolder, 'No package root');\n    invariant(pkg, 'Undefined package');\n\n    const slug = this.generateUniquePackageSlug(pkg);\n    return path.join(this.cacheFolder, slug, 'node_modules', pkg.name);\n  }\n\n  /**\n   */\n\n  getUnpluggedPath() {\n    return path.join(this.lockfileFolder, '.pnp', 'unplugged');\n  }\n\n  /**\n    */\n\n  generatePackageUnpluggedPath(pkg) {\n    const slug = this.generateUniquePackageSlug(pkg);\n    return path.join(this.getUnpluggedPath(), slug, 'node_modules', pkg.name);\n  }\n\n  /**\n   */\n\n  listUnpluggedPackageFolders() {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const unpluggedPackages = new Map();\n      const unpluggedPath = _this2.getUnpluggedPath();\n\n      if (!(yield (_fs || _load_fs()).exists(unpluggedPath))) {\n        return unpluggedPackages;\n      }\n\n      for (var _iterator4 = yield (_fs || _load_fs()).readdir(unpluggedPath), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n        var _ref4;\n\n        if (_isArray4) {\n          if (_i4 >= _iterator4.length) break;\n          _ref4 = _iterator4[_i4++];\n        } else {\n          _i4 = _iterator4.next();\n          if (_i4.done) break;\n          _ref4 = _i4.value;\n        }\n\n        const unpluggedName = _ref4;\n\n        const nmListing = yield (_fs || _load_fs()).readdir(path.join(unpluggedPath, unpluggedName, 'node_modules'));\n        invariant(nmListing.length === 1, 'A single folder should be in the unplugged directory');\n\n        const target = path.join(unpluggedPath, unpluggedName, `node_modules`, nmListing[0]);\n        unpluggedPackages.set(unpluggedName, target);\n      }\n\n      return unpluggedPackages;\n    })();\n  }\n\n  /**\n   * Execute lifecycle scripts in the specified directory. Ignoring when the --ignore-scripts flag has been\n   * passed.\n   */\n\n  executeLifecycleScript(commandName, cwd) {\n    if (this.ignoreScripts) {\n      return Promise.resolve();\n    } else {\n      return (0, (_executeLifecycleScript || _load_executeLifecycleScript()).execFromManifest)(this, commandName, cwd || this.cwd);\n    }\n  }\n\n  /**\n   * Generate an absolute temporary filename location based on the input filename.\n   */\n\n  getTemp(filename) {\n    invariant(this.tempFolder, 'No temp folder');\n    return path.join(this.tempFolder, filename);\n  }\n\n  /**\n   * Remote packages may be cached in a file system to be available for offline installation.\n   * Second time the same package needs to be installed it will be loaded from there.\n   * Given a package's filename, return a path in the offline mirror location.\n   */\n\n  getOfflineMirrorPath(packageFilename) {\n    let mirrorPath;\n\n    var _arr = ['npm', 'yarn'];\n    for (var _i5 = 0; _i5 < _arr.length; _i5++) {\n      const key = _arr[_i5];\n      const registry = this.registries[key];\n\n      if (registry == null) {\n        continue;\n      }\n\n      const registryMirrorPath = registry.config['yarn-offline-mirror'];\n\n      if (registryMirrorPath === false) {\n        return null;\n      }\n\n      if (registryMirrorPath == null) {\n        continue;\n      }\n\n      mirrorPath = registryMirrorPath;\n    }\n\n    if (mirrorPath == null) {\n      return null;\n    }\n\n    if (packageFilename == null) {\n      return mirrorPath;\n    }\n\n    return path.join(mirrorPath, path.basename(packageFilename));\n  }\n\n  /**\n   * Checker whether the folder input is a valid module folder. We output a yarn metadata\n   * file when we've successfully setup a folder so use this as a marker.\n   */\n\n  isValidModuleDest(dest) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      if (!(yield (_fs || _load_fs()).exists(dest))) {\n        return false;\n      }\n\n      if (!(yield (_fs || _load_fs()).exists(path.join(dest, (_constants || _load_constants()).METADATA_FILENAME)))) {\n        return false;\n      }\n\n      return true;\n    })();\n  }\n\n  /**\n   * Read package metadata and normalized package info.\n   */\n\n  readPackageMetadata(dir) {\n    var _this3 = this;\n\n    return this.getCache(`metadata-${dir}`, (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const metadata = yield _this3.readJson(path.join(dir, (_constants || _load_constants()).METADATA_FILENAME));\n      const pkg = yield _this3.readManifest(dir, metadata.registry);\n\n      return {\n        package: pkg,\n        artifacts: metadata.artifacts || [],\n        hash: metadata.hash,\n        remote: metadata.remote,\n        registry: metadata.registry\n      };\n    }));\n  }\n\n  /**\n   * Read normalized package info according yarn-metadata.json\n   * throw an error if package.json was not found\n   */\n\n  readManifest(dir, priorityRegistry, isRoot = false) {\n    var _this4 = this;\n\n    return this.getCache(`manifest-${dir}`, (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const manifest = yield _this4.maybeReadManifest(dir, priorityRegistry, isRoot);\n\n      if (manifest) {\n        return manifest;\n      } else {\n        throw new (_errors || _load_errors()).MessageError(_this4.reporter.lang('couldntFindPackagejson', dir), 'ENOENT');\n      }\n    }));\n  }\n\n  /**\n   * try get the manifest file by looking\n   * 1. manifest file in cache\n   * 2. manifest file in registry\n   */\n  maybeReadManifest(dir, priorityRegistry, isRoot = false) {\n    var _this5 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const metadataLoc = path.join(dir, (_constants || _load_constants()).METADATA_FILENAME);\n\n      if (yield (_fs || _load_fs()).exists(metadataLoc)) {\n        const metadata = yield _this5.readJson(metadataLoc);\n\n        if (!priorityRegistry) {\n          priorityRegistry = metadata.priorityRegistry;\n        }\n\n        if (typeof metadata.manifest !== 'undefined') {\n          return metadata.manifest;\n        }\n      }\n\n      if (priorityRegistry) {\n        const file = yield _this5.tryManifest(dir, priorityRegistry, isRoot);\n        if (file) {\n          return file;\n        }\n      }\n\n      for (var _iterator5 = Object.keys((_index2 || _load_index2()).registries), _isArray5 = Array.isArray(_iterator5), _i6 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n        var _ref7;\n\n        if (_isArray5) {\n          if (_i6 >= _iterator5.length) break;\n          _ref7 = _iterator5[_i6++];\n        } else {\n          _i6 = _iterator5.next();\n          if (_i6.done) break;\n          _ref7 = _i6.value;\n        }\n\n        const registry = _ref7;\n\n        if (priorityRegistry === registry) {\n          continue;\n        }\n\n        const file = yield _this5.tryManifest(dir, registry, isRoot);\n        if (file) {\n          return file;\n        }\n      }\n\n      return null;\n    })();\n  }\n\n  /**\n   * Read the root manifest.\n   */\n\n  readRootManifest() {\n    return this.readManifest(this.cwd, 'npm', true);\n  }\n\n  /**\n   * Try and find package info with the input directory and registry.\n   */\n\n  tryManifest(dir, registry, isRoot) {\n    var _this6 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const filename = (_index2 || _load_index2()).registries[registry].filename;\n\n      const loc = path.join(dir, filename);\n      if (yield (_fs || _load_fs()).exists(loc)) {\n        const data = yield _this6.readJson(loc);\n        data._registry = registry;\n        data._loc = loc;\n        return (0, (_index || _load_index()).default)(data, dir, _this6, isRoot);\n      } else {\n        return null;\n      }\n    })();\n  }\n\n  findManifest(dir, isRoot) {\n    var _this7 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      for (var _iterator6 = (_index2 || _load_index2()).registryNames, _isArray6 = Array.isArray(_iterator6), _i7 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n        var _ref8;\n\n        if (_isArray6) {\n          if (_i7 >= _iterator6.length) break;\n          _ref8 = _iterator6[_i7++];\n        } else {\n          _i7 = _iterator6.next();\n          if (_i7.done) break;\n          _ref8 = _i7.value;\n        }\n\n        const registry = _ref8;\n\n        const manifest = yield _this7.tryManifest(dir, registry, isRoot);\n\n        if (manifest) {\n          return manifest;\n        }\n      }\n\n      return null;\n    })();\n  }\n\n  findWorkspaceRoot(initial) {\n    var _this8 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      let previous = null;\n      let current = path.normalize(initial);\n      if (!(yield (_fs || _load_fs()).exists(current))) {\n        throw new (_errors || _load_errors()).MessageError(_this8.reporter.lang('folderMissing', current));\n      }\n\n      do {\n        const manifest = yield _this8.findManifest(current, true);\n        const ws = extractWorkspaces(manifest);\n        if (ws && ws.packages) {\n          const relativePath = path.relative(current, initial);\n          if (relativePath === '' || micromatch([relativePath], ws.packages).length > 0) {\n            return current;\n          } else {\n            return null;\n          }\n        }\n\n        previous = current;\n        current = path.dirname(current);\n      } while (current !== previous);\n\n      return null;\n    })();\n  }\n\n  resolveWorkspaces(root, rootManifest) {\n    var _this9 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const workspaces = {};\n      if (!_this9.workspacesEnabled) {\n        return workspaces;\n      }\n\n      const ws = _this9.getWorkspaces(rootManifest, true);\n      const patterns = ws && ws.packages ? ws.packages : [];\n\n      if (!Array.isArray(patterns)) {\n        throw new (_errors || _load_errors()).MessageError(_this9.reporter.lang('workspacesSettingMustBeArray'));\n      }\n\n      const registryFilenames = (_index2 || _load_index2()).registryNames.map(function (registryName) {\n        return _this9.registries[registryName].constructor.filename;\n      }).join('|');\n      const trailingPattern = `/+(${registryFilenames})`;\n      // anything under folder (node_modules) should be ignored, thus use the '**' instead of shallow match \"*\"\n      const ignorePatterns = _this9.registryFolders.map(function (folder) {\n        return `/${folder}/**/+(${registryFilenames})`;\n      });\n\n      const files = yield Promise.all(patterns.map(function (pattern) {\n        return (_fs || _load_fs()).glob(pattern.replace(/\\/?$/, trailingPattern), {\n          cwd: root,\n          ignore: ignorePatterns.map(function (ignorePattern) {\n            return pattern.replace(/\\/?$/, ignorePattern);\n          })\n        });\n      }));\n\n      for (var _iterator7 = new Set([].concat(...files)), _isArray7 = Array.isArray(_iterator7), _i8 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {\n        var _ref9;\n\n        if (_isArray7) {\n          if (_i8 >= _iterator7.length) break;\n          _ref9 = _iterator7[_i8++];\n        } else {\n          _i8 = _iterator7.next();\n          if (_i8.done) break;\n          _ref9 = _i8.value;\n        }\n\n        const file = _ref9;\n\n        const loc = path.join(root, path.dirname(file));\n        const manifest = yield _this9.findManifest(loc, false);\n\n        if (!manifest) {\n          continue;\n        }\n\n        if (!manifest.name) {\n          _this9.reporter.warn(_this9.reporter.lang('workspaceNameMandatory', loc));\n          continue;\n        }\n        if (!manifest.version) {\n          _this9.reporter.warn(_this9.reporter.lang('workspaceVersionMandatory', loc));\n          continue;\n        }\n\n        if (Object.prototype.hasOwnProperty.call(workspaces, manifest.name)) {\n          throw new (_errors || _load_errors()).MessageError(_this9.reporter.lang('workspaceNameDuplicate', manifest.name));\n        }\n\n        workspaces[manifest.name] = { loc, manifest };\n      }\n\n      return workspaces;\n    })();\n  }\n\n  // workspaces functions\n  getWorkspaces(manifest, shouldThrow = false) {\n    if (!manifest || !this.workspacesEnabled) {\n      return undefined;\n    }\n\n    const ws = extractWorkspaces(manifest);\n\n    if (!ws) {\n      return ws;\n    }\n\n    // validate eligibility\n    let wsCopy = (0, (_extends2 || _load_extends()).default)({}, ws);\n    const warnings = [];\n    const errors = [];\n\n    // packages\n    if (wsCopy.packages && wsCopy.packages.length > 0 && !manifest.private) {\n      errors.push(this.reporter.lang('workspacesRequirePrivateProjects'));\n      wsCopy = undefined;\n    }\n    // nohoist\n    if (wsCopy && wsCopy.nohoist && wsCopy.nohoist.length > 0) {\n      if (!this.workspacesNohoistEnabled) {\n        warnings.push(this.reporter.lang('workspacesNohoistDisabled', manifest.name));\n        wsCopy.nohoist = undefined;\n      } else if (!manifest.private) {\n        errors.push(this.reporter.lang('workspacesNohoistRequirePrivatePackages', manifest.name));\n        wsCopy.nohoist = undefined;\n      }\n    }\n\n    if (errors.length > 0 && shouldThrow) {\n      throw new (_errors || _load_errors()).MessageError(errors.join('\\n'));\n    }\n\n    const msg = errors.concat(warnings).join('\\n');\n    if (msg.length > 0) {\n      this.reporter.warn(msg);\n    }\n\n    return wsCopy;\n  }\n\n  /**\n   * Description\n   */\n\n  getFolder(pkg) {\n    let registryName = pkg._registry;\n    if (!registryName) {\n      const ref = pkg._reference;\n      invariant(ref, 'expected reference');\n      registryName = ref.registry;\n    }\n    return this.registries[registryName].folder;\n  }\n\n  /**\n   * Get root manifests.\n   */\n\n  getRootManifests() {\n    var _this10 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const manifests = {};\n      for (var _iterator8 = (_index2 || _load_index2()).registryNames, _isArray8 = Array.isArray(_iterator8), _i9 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {\n        var _ref10;\n\n        if (_isArray8) {\n          if (_i9 >= _iterator8.length) break;\n          _ref10 = _iterator8[_i9++];\n        } else {\n          _i9 = _iterator8.next();\n          if (_i9.done) break;\n          _ref10 = _i9.value;\n        }\n\n        const registryName = _ref10;\n\n        const registry = (_index2 || _load_index2()).registries[registryName];\n        const jsonLoc = path.join(_this10.cwd, registry.filename);\n\n        let object = {};\n        let exists = false;\n        let indent;\n        if (yield (_fs || _load_fs()).exists(jsonLoc)) {\n          exists = true;\n\n          const info = yield _this10.readJson(jsonLoc, (_fs || _load_fs()).readJsonAndFile);\n          object = info.object;\n          indent = detectIndent(info.content).indent || undefined;\n        }\n        manifests[registryName] = { loc: jsonLoc, object, exists, indent };\n      }\n      return manifests;\n    })();\n  }\n\n  /**\n   * Save root manifests.\n   */\n\n  saveRootManifests(manifests) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      for (var _iterator9 = (_index2 || _load_index2()).registryNames, _isArray9 = Array.isArray(_iterator9), _i10 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {\n        var _ref11;\n\n        if (_isArray9) {\n          if (_i10 >= _iterator9.length) break;\n          _ref11 = _iterator9[_i10++];\n        } else {\n          _i10 = _iterator9.next();\n          if (_i10.done) break;\n          _ref11 = _i10.value;\n        }\n\n        const registryName = _ref11;\n        var _manifests$registryNa = manifests[registryName];\n        const loc = _manifests$registryNa.loc,\n              object = _manifests$registryNa.object,\n              exists = _manifests$registryNa.exists,\n              indent = _manifests$registryNa.indent;\n\n        if (!exists && !Object.keys(object).length) {\n          continue;\n        }\n\n        for (var _iterator10 = (_constants || _load_constants()).DEPENDENCY_TYPES, _isArray10 = Array.isArray(_iterator10), _i11 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) {\n          var _ref12;\n\n          if (_isArray10) {\n            if (_i11 >= _iterator10.length) break;\n            _ref12 = _iterator10[_i11++];\n          } else {\n            _i11 = _iterator10.next();\n            if (_i11.done) break;\n            _ref12 = _i11.value;\n          }\n\n          const field = _ref12;\n\n          if (object[field]) {\n            object[field] = sortObject(object[field]);\n          }\n        }\n\n        yield (_fs || _load_fs()).writeFilePreservingEol(loc, JSON.stringify(object, null, indent || (_constants || _load_constants()).DEFAULT_INDENT) + '\\n');\n      }\n    })();\n  }\n\n  /**\n   * Call the passed factory (defaults to fs.readJson) and rethrow a pretty error message if it was the result\n   * of a syntax error.\n   */\n\n  readJson(loc, factory = (_fs || _load_fs()).readJson) {\n    try {\n      return factory(loc);\n    } catch (err) {\n      if (err instanceof SyntaxError) {\n        throw new (_errors || _load_errors()).MessageError(this.reporter.lang('jsonError', loc, err.message));\n      } else {\n        throw err;\n      }\n    }\n  }\n\n  static create(opts = {}, reporter = new (_index3 || _load_index3()).NoopReporter()) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const config = new Config(reporter);\n      yield config.init(opts);\n      return config;\n    })();\n  }\n}\n\nexports.default = Config;\nfunction extractWorkspaces(manifest) {\n  if (!manifest || !manifest.workspaces) {\n    return undefined;\n  }\n\n  if (Array.isArray(manifest.workspaces)) {\n    return { packages: manifest.workspaces };\n  }\n\n  if (manifest.workspaces.packages && Array.isArray(manifest.workspaces.packages) || manifest.workspaces.nohoist && Array.isArray(manifest.workspaces.nohoist)) {\n    return manifest.workspaces;\n  }\n\n  return undefined;\n}\n\n/***/ }),\n/* 164 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"net\");\n\n/***/ }),\n/* 165 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.Add = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nlet run = exports.run = (() => {\n  var _ref7 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    if (!args.length) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('missingAddDependencies'));\n    }\n\n    const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.lockfileFolder, reporter);\n\n    yield (0, (_install || _load_install()).wrapLifecycle)(config, flags, (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const install = new Add(args, flags, config, reporter, lockfile);\n      yield install.init();\n    }));\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref7.apply(this, arguments);\n  };\n})();\n\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _normalizePattern2;\n\nfunction _load_normalizePattern() {\n  return _normalizePattern2 = __webpack_require__(37);\n}\n\nvar _workspaceLayout;\n\nfunction _load_workspaceLayout() {\n  return _workspaceLayout = _interopRequireDefault(__webpack_require__(90));\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = __webpack_require__(78);\n}\n\nvar _list;\n\nfunction _load_list() {\n  return _list = __webpack_require__(352);\n}\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _invariant;\n\nfunction _load_invariant() {\n  return _invariant = _interopRequireDefault(__webpack_require__(9));\n}\n\nvar _path;\n\nfunction _load_path() {\n  return _path = _interopRequireDefault(__webpack_require__(0));\n}\n\nvar _semver;\n\nfunction _load_semver() {\n  return _semver = _interopRequireDefault(__webpack_require__(22));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst SILENCE_DEPENDENCY_TYPE_WARNINGS = ['upgrade', 'upgrade-interactive'];\n\nclass Add extends (_install || _load_install()).Install {\n  constructor(args, flags, config, reporter, lockfile) {\n    const workspaceRootIsCwd = config.cwd === config.lockfileFolder;\n    const _flags = flags ? (0, (_extends2 || _load_extends()).default)({}, flags, { workspaceRootIsCwd }) : { workspaceRootIsCwd };\n    super(_flags, config, reporter, lockfile);\n    this.args = args;\n    // only one flag is supported, so we can figure out which one was passed to `yarn add`\n    this.flagToOrigin = [flags.dev && 'devDependencies', flags.optional && 'optionalDependencies', flags.peer && 'peerDependencies', 'dependencies'].filter(Boolean).shift();\n  }\n\n  /**\n   * TODO\n   */\n\n  prepareRequests(requests) {\n    const requestsWithArgs = requests.slice();\n\n    for (var _iterator = this.args, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const pattern = _ref;\n\n      requestsWithArgs.push({\n        pattern,\n        registry: 'npm',\n        optional: false\n      });\n    }\n    return requestsWithArgs;\n  }\n\n  /**\n   * returns version for a pattern based on Manifest\n   */\n  getPatternVersion(pattern, pkg) {\n    const tilde = this.flags.tilde;\n    const configPrefix = String(this.config.getOption('save-prefix'));\n    const exact = this.flags.exact || Boolean(this.config.getOption('save-exact')) || configPrefix === '';\n\n    var _normalizePattern = (0, (_normalizePattern2 || _load_normalizePattern()).normalizePattern)(pattern);\n\n    const hasVersion = _normalizePattern.hasVersion,\n          range = _normalizePattern.range;\n\n    let version;\n\n    if ((0, (_index || _load_index()).getExoticResolver)(pattern)) {\n      // wasn't a name/range tuple so this is just a raw exotic pattern\n      version = pattern;\n    } else if (hasVersion && range && ((_semver || _load_semver()).default.satisfies(pkg.version, range) || (0, (_index || _load_index()).getExoticResolver)(range))) {\n      // if the user specified a range then use it verbatim\n      version = range;\n    }\n\n    if (!version || (_semver || _load_semver()).default.valid(version)) {\n      let prefix = configPrefix || '^';\n\n      if (tilde) {\n        prefix = '~';\n      } else if (version || exact) {\n        prefix = '';\n      }\n      version = `${prefix}${pkg.version}`;\n    }\n\n    return version;\n  }\n\n  preparePatterns(patterns) {\n    const preparedPatterns = patterns.slice();\n    for (var _iterator2 = this.resolver.dedupePatterns(this.args), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n      var _ref2;\n\n      if (_isArray2) {\n        if (_i2 >= _iterator2.length) break;\n        _ref2 = _iterator2[_i2++];\n      } else {\n        _i2 = _iterator2.next();\n        if (_i2.done) break;\n        _ref2 = _i2.value;\n      }\n\n      const pattern = _ref2;\n\n      const pkg = this.resolver.getResolvedPattern(pattern);\n      (0, (_invariant || _load_invariant()).default)(pkg, `missing package ${pattern}`);\n      const version = this.getPatternVersion(pattern, pkg);\n      const newPattern = `${pkg.name}@${version}`;\n      preparedPatterns.push(newPattern);\n      this.addedPatterns.push(newPattern);\n      if (newPattern === pattern) {\n        continue;\n      }\n      this.resolver.replacePattern(pattern, newPattern);\n    }\n    return preparedPatterns;\n  }\n\n  preparePatternsForLinking(patterns, cwdManifest, cwdIsRoot) {\n    // remove the newly added patterns if cwd != root and update the in-memory package dependency instead\n    if (cwdIsRoot) {\n      return patterns;\n    }\n\n    let manifest;\n    const cwdPackage = `${cwdManifest.name}@${cwdManifest.version}`;\n    try {\n      manifest = this.resolver.getStrictResolvedPattern(cwdPackage);\n    } catch (e) {\n      this.reporter.warn(this.reporter.lang('unknownPackage', cwdPackage));\n      return patterns;\n    }\n\n    let newPatterns = patterns;\n    this._iterateAddedPackages((pattern, registry, dependencyType, pkgName, version) => {\n      // remove added package from patterns list\n      const filtered = newPatterns.filter(p => p !== pattern);\n      (0, (_invariant || _load_invariant()).default)(newPatterns.length - filtered.length > 0, `expect added pattern '${pattern}' in the list: ${patterns.toString()}`);\n      newPatterns = filtered;\n\n      // add new package into in-memory manifest so they can be linked properly\n      manifest[dependencyType] = manifest[dependencyType] || {};\n      if (manifest[dependencyType][pkgName] === version) {\n        // package already existed\n        return;\n      }\n\n      // update dependencies in the manifest\n      (0, (_invariant || _load_invariant()).default)(manifest._reference, 'manifest._reference should not be null');\n      const ref = manifest._reference;\n\n      ref['dependencies'] = ref['dependencies'] || [];\n      ref['dependencies'].push(pattern);\n    });\n\n    return newPatterns;\n  }\n\n  bailout(patterns, workspaceLayout) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const lockfileCache = _this.lockfile.cache;\n      if (!lockfileCache) {\n        return false;\n      }\n      const match = yield _this.integrityChecker.check(patterns, lockfileCache, _this.flags, workspaceLayout);\n      const haveLockfile = yield (_fs || _load_fs()).exists((_path || _load_path()).default.join(_this.config.lockfileFolder, (_constants || _load_constants()).LOCKFILE_FILENAME));\n      if (match.integrityFileMissing && haveLockfile) {\n        // Integrity file missing, force script installations\n        _this.scripts.setForce(true);\n      }\n      return false;\n    })();\n  }\n\n  /**\n   * Description\n   */\n\n  init() {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const isWorkspaceRoot = _this2.config.workspaceRootFolder && _this2.config.cwd === _this2.config.workspaceRootFolder;\n\n      // running \"yarn add something\" in a workspace root is often a mistake\n      if (isWorkspaceRoot && !_this2.flags.ignoreWorkspaceRootCheck) {\n        throw new (_errors || _load_errors()).MessageError(_this2.reporter.lang('workspacesAddRootCheck'));\n      }\n\n      _this2.addedPatterns = [];\n      const patterns = yield (_install || _load_install()).Install.prototype.init.call(_this2);\n      yield _this2.maybeOutputSaveTree(patterns);\n      return patterns;\n    })();\n  }\n\n  applyChanges(manifests) {\n    var _this3 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield (_install || _load_install()).Install.prototype.applyChanges.call(_this3, manifests);\n\n      // fill rootPatternsToOrigin without `excludePatterns`\n      yield (_install || _load_install()).Install.prototype.fetchRequestFromCwd.call(_this3);\n\n      _this3._iterateAddedPackages(function (pattern, registry, dependencyType, pkgName, version) {\n        // add it to manifest\n        const object = manifests[registry].object;\n\n\n        object[dependencyType] = object[dependencyType] || {};\n        object[dependencyType][pkgName] = version;\n        if (SILENCE_DEPENDENCY_TYPE_WARNINGS.indexOf(_this3.config.commandName) === -1 && dependencyType !== _this3.flagToOrigin) {\n          _this3.reporter.warn(_this3.reporter.lang('moduleAlreadyInManifest', pkgName, dependencyType, _this3.flagToOrigin));\n        }\n      });\n\n      return true;\n    })();\n  }\n\n  /**\n   * Description\n   */\n\n  fetchRequestFromCwd() {\n    return (_install || _load_install()).Install.prototype.fetchRequestFromCwd.call(this, this.args);\n  }\n\n  /**\n   * Output a tree of any newly added dependencies.\n   */\n\n  maybeOutputSaveTree(patterns) {\n    var _this4 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      // don't limit the shown tree depth\n      const opts = {\n        reqDepth: 0\n      };\n\n      // restore the original patterns\n      const merged = [...patterns, ..._this4.addedPatterns];\n\n      var _ref3 = yield (0, (_list || _load_list()).buildTree)(_this4.resolver, _this4.linker, merged, opts, true, true);\n\n      const trees = _ref3.trees,\n            count = _ref3.count;\n\n\n      if (count === 1) {\n        _this4.reporter.success(_this4.reporter.lang('savedNewDependency'));\n      } else {\n        _this4.reporter.success(_this4.reporter.lang('savedNewDependencies', count));\n      }\n\n      if (!count) {\n        return;\n      }\n\n      const resolverPatterns = new Set();\n      for (var _iterator3 = patterns, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n        var _ref4;\n\n        if (_isArray3) {\n          if (_i3 >= _iterator3.length) break;\n          _ref4 = _iterator3[_i3++];\n        } else {\n          _i3 = _iterator3.next();\n          if (_i3.done) break;\n          _ref4 = _i3.value;\n        }\n\n        const pattern = _ref4;\n\n        var _ref5 = _this4.resolver.getResolvedPattern(pattern) || {};\n\n        const version = _ref5.version,\n              name = _ref5.name;\n\n        resolverPatterns.add(`${name}@${version}`);\n      }\n      const directRequireDependencies = trees.filter(function ({ name }) {\n        return resolverPatterns.has(name);\n      });\n\n      _this4.reporter.info(_this4.reporter.lang('directDependencies'));\n      _this4.reporter.tree('newDirectDependencies', directRequireDependencies);\n      _this4.reporter.info(_this4.reporter.lang('allDependencies'));\n      _this4.reporter.tree('newAllDependencies', trees);\n    })();\n  }\n\n  /**\n   * Save added packages to manifest if any of the --save flags were used.\n   */\n\n  savePackages() {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {})();\n  }\n\n  _iterateAddedPackages(f) {\n    const patternOrigins = Object.keys(this.rootPatternsToOrigin);\n\n    // add new patterns to their appropriate registry manifest\n    for (var _iterator4 = this.addedPatterns, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n      var _ref6;\n\n      if (_isArray4) {\n        if (_i4 >= _iterator4.length) break;\n        _ref6 = _iterator4[_i4++];\n      } else {\n        _i4 = _iterator4.next();\n        if (_i4.done) break;\n        _ref6 = _i4.value;\n      }\n\n      const pattern = _ref6;\n\n      const pkg = this.resolver.getResolvedPattern(pattern);\n      (0, (_invariant || _load_invariant()).default)(pkg, `missing package ${pattern}`);\n      const version = this.getPatternVersion(pattern, pkg);\n      const ref = pkg._reference;\n      (0, (_invariant || _load_invariant()).default)(ref, 'expected package reference');\n      // lookup the package to determine dependency type; used during `yarn upgrade`\n      const depType = patternOrigins.reduce((acc, prev) => {\n        if (prev.indexOf(`${pkg.name}@`) === 0) {\n          return this.rootPatternsToOrigin[prev];\n        }\n        return acc;\n      }, null);\n\n      // depType is calculated when `yarn upgrade` command is used\n      const target = depType || this.flagToOrigin;\n\n      f(pattern, ref.registry, target, pkg.name, version);\n    }\n  }\n}\n\nexports.Add = Add;\nfunction hasWrapper(commander) {\n  return true;\n}\n\nfunction setFlags(commander) {\n  commander.description('Installs a package and any packages that it depends on.');\n  commander.usage('add [packages ...] [flags]');\n  commander.option('-W, --ignore-workspace-root-check', 'required to run yarn add inside a workspace root');\n  commander.option('-D, --dev', 'save package to your `devDependencies`');\n  commander.option('-P, --peer', 'save package to your `peerDependencies`');\n  commander.option('-O, --optional', 'save package to your `optionalDependencies`');\n  commander.option('-E, --exact', 'install exact version');\n  commander.option('-T, --tilde', 'install most recent release with the same minor version');\n  commander.option('-A, --audit', 'Run vulnerability audit on installed packages');\n}\n\n/***/ }),\n/* 166 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.pack = exports.packTarball = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet packTarball = exports.packTarball = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, { mapHeader } = {}) {\n    const pkg = yield config.readRootManifest();\n    const bundleDependencies = pkg.bundleDependencies,\n          main = pkg.main,\n          onlyFiles = pkg.files;\n\n    // include required files\n\n    let filters = NEVER_IGNORE.slice();\n    // include default filters unless `files` is used\n    if (!onlyFiles) {\n      filters = filters.concat(DEFAULT_IGNORE);\n    }\n    if (main) {\n      filters = filters.concat((0, (_filter || _load_filter()).ignoreLinesToRegex)(['!/' + main]));\n    }\n\n    // include bundleDependencies\n    let bundleDependenciesFiles = [];\n    if (bundleDependencies) {\n      for (var _iterator = bundleDependencies, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref2;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref2 = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref2 = _i.value;\n        }\n\n        const dependency = _ref2;\n\n        const dependencyList = depsFor(dependency, config.cwd);\n\n        for (var _iterator2 = dependencyList, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n          var _ref3;\n\n          if (_isArray2) {\n            if (_i2 >= _iterator2.length) break;\n            _ref3 = _iterator2[_i2++];\n          } else {\n            _i2 = _iterator2.next();\n            if (_i2.done) break;\n            _ref3 = _i2.value;\n          }\n\n          const dep = _ref3;\n\n          const filesForBundledDep = yield (_fs || _load_fs()).walk(dep.baseDir, null, new Set(FOLDERS_IGNORE));\n          bundleDependenciesFiles = bundleDependenciesFiles.concat(filesForBundledDep);\n        }\n      }\n    }\n\n    // `files` field\n    if (onlyFiles) {\n      let lines = ['*'];\n      lines = lines.concat(onlyFiles.map(function (filename) {\n        return `!${filename}`;\n      }), onlyFiles.map(function (filename) {\n        return `!${path.join(filename, '**')}`;\n      }));\n      const regexes = (0, (_filter || _load_filter()).ignoreLinesToRegex)(lines, './');\n      filters = filters.concat(regexes);\n    }\n\n    const files = yield (_fs || _load_fs()).walk(config.cwd, null, new Set(FOLDERS_IGNORE));\n    const dotIgnoreFiles = (0, (_filter || _load_filter()).filterOverridenGitignores)(files);\n\n    // create ignores\n    for (var _iterator3 = dotIgnoreFiles, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n      var _ref4;\n\n      if (_isArray3) {\n        if (_i3 >= _iterator3.length) break;\n        _ref4 = _iterator3[_i3++];\n      } else {\n        _i3 = _iterator3.next();\n        if (_i3.done) break;\n        _ref4 = _i3.value;\n      }\n\n      const file = _ref4;\n\n      const raw = yield (_fs || _load_fs()).readFile(file.absolute);\n      const lines = raw.split('\\n');\n\n      const regexes = (0, (_filter || _load_filter()).ignoreLinesToRegex)(lines, path.dirname(file.relative));\n      filters = filters.concat(regexes);\n    }\n\n    // files to definitely keep, takes precedence over ignore filter\n    const keepFiles = new Set();\n\n    // files to definitely ignore\n    const ignoredFiles = new Set();\n\n    // list of files that didn't match any of our patterns, if a directory in the chain above was matched\n    // then we should inherit it\n    const possibleKeepFiles = new Set();\n\n    // apply filters\n    (0, (_filter || _load_filter()).sortFilter)(files, filters, keepFiles, possibleKeepFiles, ignoredFiles);\n\n    // add the files for the bundled dependencies to the set of files to keep\n    for (var _iterator4 = bundleDependenciesFiles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n      var _ref5;\n\n      if (_isArray4) {\n        if (_i4 >= _iterator4.length) break;\n        _ref5 = _iterator4[_i4++];\n      } else {\n        _i4 = _iterator4.next();\n        if (_i4.done) break;\n        _ref5 = _i4.value;\n      }\n\n      const file = _ref5;\n\n      const realPath = yield (_fs || _load_fs()).realpath(config.cwd);\n      keepFiles.add(path.relative(realPath, file.absolute));\n    }\n\n    return packWithIgnoreAndHeaders(config.cwd, function (name) {\n      const relative = path.relative(config.cwd, name);\n      // Don't ignore directories, since we need to recurse inside them to check for unignored files.\n      if (fs2.lstatSync(name).isDirectory()) {\n        const isParentOfKeptFile = Array.from(keepFiles).some(function (name) {\n          return !path.relative(relative, name).startsWith('..');\n        });\n        return !isParentOfKeptFile;\n      }\n      // Otherwise, ignore a file if we're not supposed to keep it.\n      return !keepFiles.has(relative);\n    }, { mapHeader });\n  });\n\n  return function packTarball(_x) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet pack = exports.pack = (() => {\n  var _ref6 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config) {\n    const packer = yield packTarball(config);\n    const compressor = packer.pipe(new zlib.Gzip());\n\n    return compressor;\n  });\n\n  return function pack(_x2) {\n    return _ref6.apply(this, arguments);\n  };\n})();\n\nlet run = exports.run = (() => {\n  var _ref7 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const pkg = yield config.readRootManifest();\n    if (!pkg.name) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('noName'));\n    }\n    if (!pkg.version) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('noVersion'));\n    }\n\n    const normaliseScope = function normaliseScope(name) {\n      return name[0] === '@' ? name.substr(1).replace('/', '-') : name;\n    };\n    const filename = flags.filename || path.join(config.cwd, `${normaliseScope(pkg.name)}-v${pkg.version}.tgz`);\n\n    yield config.executeLifecycleScript('prepack');\n\n    const stream = yield pack(config);\n\n    yield new Promise(function (resolve, reject) {\n      stream.pipe(fs2.createWriteStream(filename));\n      stream.on('error', reject);\n      stream.on('close', resolve);\n    });\n\n    yield config.executeLifecycleScript('postpack');\n\n    reporter.success(reporter.lang('packWroteTarball', filename));\n  });\n\n  return function run(_x3, _x4, _x5, _x6) {\n    return _ref7.apply(this, arguments);\n  };\n})();\n\nexports.packWithIgnoreAndHeaders = packWithIgnoreAndHeaders;\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _filter;\n\nfunction _load_filter() {\n  return _filter = __webpack_require__(366);\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst zlib = __webpack_require__(199);\nconst path = __webpack_require__(0);\nconst tar = __webpack_require__(194);\nconst fs2 = __webpack_require__(4);\nconst depsFor = __webpack_require__(678);\n\nconst FOLDERS_IGNORE = [\n// never allow version control folders\n'.git', 'CVS', '.svn', '.hg', 'node_modules'];\n\nconst DEFAULT_IGNORE = (0, (_filter || _load_filter()).ignoreLinesToRegex)([...FOLDERS_IGNORE,\n\n// ignore cruft\n'yarn.lock', '.lock-wscript', '.wafpickle-{0..9}', '*.swp', '._*', 'npm-debug.log', 'yarn-error.log', '.npmrc', '.yarnrc', '.yarnrc.yml', '.npmignore', '.gitignore', '.DS_Store']);\n\nconst NEVER_IGNORE = (0, (_filter || _load_filter()).ignoreLinesToRegex)([\n// never ignore these files\n'!/package.json', '!/readme*', '!/+(license|licence)*', '!/+(changes|changelog|history)*']);\n\nfunction packWithIgnoreAndHeaders(cwd, ignoreFunction, { mapHeader } = {}) {\n  return tar.pack(cwd, {\n    ignore: ignoreFunction,\n    sort: true,\n    map: header => {\n      const suffix = header.name === '.' ? '' : `/${header.name}`;\n      header.name = `package${suffix}`;\n      delete header.uid;\n      delete header.gid;\n      return mapHeader ? mapHeader(header) : header;\n    }\n  });\n}\n\nfunction setFlags(commander) {\n  commander.description('Creates a compressed gzip archive of package dependencies.');\n  commander.option('-f, --filename <filename>', 'filename');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 167 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = _interopRequireDefault(__webpack_require__(218));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _mutex;\n\nfunction _load_mutex() {\n  return _mutex = _interopRequireDefault(__webpack_require__(369));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint no-unused-vars: 0 */\n\nconst cmdShim = __webpack_require__(202);\nconst path = __webpack_require__(0);\n\nclass BaseFetcher {\n  constructor(dest, remote, config) {\n    this.reporter = config.reporter;\n    this.packageName = remote.packageName;\n    this.reference = remote.reference;\n    this.registry = remote.registry;\n    this.hash = remote.hash;\n    this.remote = remote;\n    this.config = config;\n    this.dest = dest;\n  }\n\n  setupMirrorFromCache() {\n    // fetcher subclasses may use this to perform actions such as copying over a cached tarball to the offline\n    // mirror etc\n    return Promise.resolve();\n  }\n\n  _fetch() {\n    return Promise.reject(new Error('Not implemented'));\n  }\n\n  fetch(defaultManifest) {\n    var _this = this;\n\n    return (_fs || _load_fs()).lockQueue.push(this.dest, (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield (_fs || _load_fs()).mkdirp(_this.dest);\n\n      // fetch package and get the hash\n\n      var _ref2 = yield _this._fetch();\n\n      const hash = _ref2.hash;\n\n\n      const pkg = yield (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n        // load the new normalized manifest\n        try {\n          return yield _this.config.readManifest(_this.dest, _this.registry);\n        } catch (e) {\n          if (e.code === 'ENOENT' && defaultManifest) {\n            return (0, (_index || _load_index()).default)(defaultManifest, _this.dest, _this.config, false);\n          } else {\n            throw e;\n          }\n        }\n      })();\n\n      if (pkg.bin) {\n        for (var _iterator = Object.keys(pkg.bin), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n          var _ref4;\n\n          if (_isArray) {\n            if (_i >= _iterator.length) break;\n            _ref4 = _iterator[_i++];\n          } else {\n            _i = _iterator.next();\n            if (_i.done) break;\n            _ref4 = _i.value;\n          }\n\n          const binName = _ref4;\n\n          const binDest = `${_this.dest}/.bin`;\n\n          // Using any sort of absolute path here would prevent makePortableProxyScript from preserving symlinks when\n          // calling the binary\n          const src = path.resolve(_this.dest, pkg.bin[binName]);\n\n          if (yield (_fs || _load_fs()).exists(src)) {\n            // We ensure that the target is executable\n            yield (_fs || _load_fs()).chmod(src, 0o755);\n          }\n\n          yield (_fs || _load_fs()).mkdirp(binDest);\n          if (process.platform === 'win32') {\n            const unlockMutex = yield (0, (_mutex || _load_mutex()).default)(src);\n            try {\n              yield cmdShim.ifExists(src, `${binDest}/${binName}`, { createPwshFile: false });\n            } finally {\n              unlockMutex();\n            }\n          } else {\n            yield (_fs || _load_fs()).symlink(src, `${binDest}/${binName}`);\n          }\n        }\n      }\n\n      yield (_fs || _load_fs()).writeFile(path.join(_this.dest, (_constants || _load_constants()).METADATA_FILENAME), JSON.stringify({\n        manifest: pkg,\n        artifacts: [],\n        remote: _this.remote,\n        registry: _this.registry,\n        hash\n      }, null, '  '));\n\n      return {\n        hash,\n        dest: _this.dest,\n        package: pkg,\n        cached: false\n      };\n    }));\n  }\n}\nexports.default = BaseFetcher;\n\n/***/ }),\n/* 168 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.hash = hash;\nconst crypto = __webpack_require__(11);\nconst stream = __webpack_require__(23);\n\nfunction hash(content, type = 'md5') {\n  return crypto.createHash(type).update(content).digest('hex');\n}\n\nclass HashStream extends stream.Transform {\n  constructor(options) {\n    super(options);\n    this._hash = crypto.createHash('sha1');\n    this._updated = false;\n  }\n\n  _transform(chunk, encoding, callback) {\n    this._updated = true;\n    this._hash.update(chunk);\n    callback(null, chunk);\n  }\n\n  getHash() {\n    return this._hash.digest('hex');\n  }\n\n  test(sum) {\n    return this._updated && sum === this.getHash();\n  }\n}\nexports.HashStream = HashStream;\n\n/***/ }),\n/* 169 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = guessName;\n\nvar _url;\n\nfunction _load_url() {\n  return _url = _interopRequireDefault(__webpack_require__(24));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction cleanup(name) {\n  name = name.replace(/-\\d+\\.\\d+\\.\\d+/, '');\n  return name.replace(/\\.git$|\\.zip$|\\.tar\\.gz$|\\.tar\\.bz2$/, '');\n}\n\nfunction guessNameFallback(source) {\n  // If cannot parse as url, just return cleaned up last part\n  const parts = source.split('/');\n  return cleanup(parts[parts.length - 1]);\n}\n\nfunction guessName(source) {\n  try {\n    const parsed = (_url || _load_url()).default.parse(source);\n\n    if (!parsed.pathname) {\n      return guessNameFallback(source);\n    }\n\n    const parts = parsed.pathname.split('/');\n\n    // Priority goes to part that ends with .git\n    for (var _iterator = parts, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const part = _ref;\n\n      if (part.match(/\\.git$/)) {\n        return cleanup(part);\n      }\n    }\n\n    // Most likely a directory\n    if (parsed.host == null) {\n      return cleanup(parts[parts.length - 1]);\n    }\n\n    // A site like github or gitlab\n    if (parts.length > 2) {\n      return cleanup(parts[2]);\n    }\n\n    // Privately hosted package?\n    if (parts.length > 1) {\n      return cleanup(parts[1]);\n    }\n\n    return guessNameFallback(source);\n  } catch (e) {\n    return guessNameFallback(source);\n  }\n}\n\n/***/ }),\n/* 170 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.satisfiesWithPrereleases = satisfiesWithPrereleases;\nexports.diffWithUnstable = diffWithUnstable;\n\nvar _semver;\n\nfunction _load_semver() {\n  return _semver = _interopRequireDefault(__webpack_require__(22));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Returns whether the given semver version satisfies the given range. Notably this supports\n * prerelease versions so that \"2.0.0-rc.0\" satisfies the range \">=1.0.0\", for example.\n */\n\nfunction satisfiesWithPrereleases(version, range, loose = false) {\n  let semverRange;\n  try {\n    // $FlowFixMe: Add a definition for the Range class\n    semverRange = new (_semver || _load_semver()).default.Range(range, loose);\n  } catch (err) {\n    return false;\n  }\n\n  if (!version) {\n    return false;\n  }\n  let semverVersion;\n  try {\n    semverVersion = new (_semver || _load_semver()).default.SemVer(version, semverRange.loose);\n  } catch (err) {\n    return false;\n  }\n\n  // A range has multiple sets of comparators. A version must satisfy all comparators in a set\n  // and at least one set to satisfy the range.\n  return semverRange.set.some(comparatorSet => {\n    // node-semver converts ~ and ^ ranges into pairs of >= and < ranges but the upper bounds don't\n    // properly exclude prerelease versions. For example, \"^1.0.0\" is converted to \">=1.0.0 <2.0.0\",\n    // which includes \"2.0.0-pre\" since prerelease versions are lower than their non-prerelease\n    // counterparts. As a practical workaround we make upper-bound ranges exclude prereleases and\n    // convert \"<2.0.0\" to \"<2.0.0-0\", for example.\n    comparatorSet = comparatorSet.map(comparator => {\n      if (comparator.operator !== '<' || !comparator.value || comparator.semver.prerelease.length) {\n        return comparator;\n      }\n\n      // \"0\" is the lowest prerelease version\n      comparator.semver.inc('pre', 0);\n\n      const comparatorString = comparator.operator + comparator.semver.version;\n      // $FlowFixMe: Add a definition for the Comparator class\n      return new (_semver || _load_semver()).default.Comparator(comparatorString, comparator.loose);\n    });\n\n    return !comparatorSet.some(comparator => !comparator.test(semverVersion));\n  });\n}\n\nconst PRE_RELEASES = {\n  major: 'premajor',\n  minor: 'preminor',\n  patch: 'prepatch'\n};\n\n/**\n * Returns the difference between two versions as a semantic string representation.\n * Similar to the `diff` method in node-semver, but it also accounts for unstable versions,\n * like 0.x.x or 0.0.x.\n */\n\nfunction diffWithUnstable(version1, version2) {\n  if ((_semver || _load_semver()).default.eq(version1, version2) === false) {\n    const v1 = (_semver || _load_semver()).default.parse(version1);\n    const v2 = (_semver || _load_semver()).default.parse(version2);\n\n    if (v1 != null && v2 != null) {\n      const isPreRelease = v1.prerelease.length > 0 || v2.prerelease.length > 0;\n      const preMajor = v1.major === 0 || v2.major === 0;\n      const preMinor = preMajor && (v1.minor === 0 || v2.minor === 0);\n\n      let diff = null;\n\n      if (v1.major !== v2.major) {\n        diff = 'major';\n      } else if (v1.minor !== v2.minor) {\n        if (preMajor) {\n          // If the major version number is zero (0.x.x), treat a change\n          // of the minor version number as a major change.\n          diff = 'major';\n        } else {\n          diff = 'minor';\n        }\n      } else if (v1.patch !== v2.patch) {\n        if (preMinor) {\n          // If the major & minor version numbers are zero (0.0.x), treat a change\n          // of the patch version number as a major change.\n          diff = 'major';\n        } else if (preMajor) {\n          // If the major version number is zero (0.x.x), treat a change\n          // of the patch version number as a minor change.\n          diff = 'minor';\n        } else {\n          diff = 'patch';\n        }\n      }\n\n      if (isPreRelease) {\n        if (diff != null) {\n          diff = PRE_RELEASES[diff];\n        } else {\n          diff = 'prerelease';\n        }\n      }\n\n      return diff;\n    }\n  }\n\n  return null;\n}\n\n/***/ }),\n/* 171 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = __webpack_require__(69);\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n\n/***/ }),\n/* 172 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = __webpack_require__(246);\nvar enumBugKeys = __webpack_require__(128);\n\nmodule.exports = Object.keys || function keys(O) {\n  return $keys(O, enumBugKeys);\n};\n\n\n/***/ }),\n/* 173 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.13 ToObject(argument)\nvar defined = __webpack_require__(91);\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n\n\n/***/ }),\n/* 174 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar once = __webpack_require__(83);\n\nvar noop = function() {};\n\nvar isRequest = function(stream) {\n\treturn stream.setHeader && typeof stream.abort === 'function';\n};\n\nvar isChildProcess = function(stream) {\n\treturn stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3\n};\n\nvar eos = function(stream, opts, callback) {\n\tif (typeof opts === 'function') return eos(stream, null, opts);\n\tif (!opts) opts = {};\n\n\tcallback = once(callback || noop);\n\n\tvar ws = stream._writableState;\n\tvar rs = stream._readableState;\n\tvar readable = opts.readable || (opts.readable !== false && stream.readable);\n\tvar writable = opts.writable || (opts.writable !== false && stream.writable);\n\n\tvar onlegacyfinish = function() {\n\t\tif (!stream.writable) onfinish();\n\t};\n\n\tvar onfinish = function() {\n\t\twritable = false;\n\t\tif (!readable) callback.call(stream);\n\t};\n\n\tvar onend = function() {\n\t\treadable = false;\n\t\tif (!writable) callback.call(stream);\n\t};\n\n\tvar onexit = function(exitCode) {\n\t\tcallback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null);\n\t};\n\n\tvar onerror = function(err) {\n\t\tcallback.call(stream, err);\n\t};\n\n\tvar onclose = function() {\n\t\tif (readable && !(rs && rs.ended)) return callback.call(stream, new Error('premature close'));\n\t\tif (writable && !(ws && ws.ended)) return callback.call(stream, new Error('premature close'));\n\t};\n\n\tvar onrequest = function() {\n\t\tstream.req.on('finish', onfinish);\n\t};\n\n\tif (isRequest(stream)) {\n\t\tstream.on('complete', onfinish);\n\t\tstream.on('abort', onclose);\n\t\tif (stream.req) onrequest();\n\t\telse stream.on('request', onrequest);\n\t} else if (writable && !ws) { // legacy streams\n\t\tstream.on('end', onlegacyfinish);\n\t\tstream.on('close', onlegacyfinish);\n\t}\n\n\tif (isChildProcess(stream)) stream.on('exit', onexit);\n\n\tstream.on('end', onend);\n\tstream.on('finish', onfinish);\n\tif (opts.error !== false) stream.on('error', onerror);\n\tstream.on('close', onclose);\n\n\treturn function() {\n\t\tstream.removeListener('complete', onfinish);\n\t\tstream.removeListener('abort', onclose);\n\t\tstream.removeListener('request', onrequest);\n\t\tif (stream.req) stream.req.removeListener('finish', onfinish);\n\t\tstream.removeListener('end', onlegacyfinish);\n\t\tstream.removeListener('close', onlegacyfinish);\n\t\tstream.removeListener('finish', onfinish);\n\t\tstream.removeListener('exit', onexit);\n\t\tstream.removeListener('end', onend);\n\t\tstream.removeListener('error', onerror);\n\t\tstream.removeListener('close', onclose);\n\t};\n};\n\nmodule.exports = eos;\n\n\n/***/ }),\n/* 175 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2012 Joyent, Inc.  All rights reserved.\n\nvar assert = __webpack_require__(16);\nvar sshpk = __webpack_require__(329);\nvar util = __webpack_require__(3);\n\nvar HASH_ALGOS = {\n  'sha1': true,\n  'sha256': true,\n  'sha512': true\n};\n\nvar PK_ALGOS = {\n  'rsa': true,\n  'dsa': true,\n  'ecdsa': true\n};\n\nfunction HttpSignatureError(message, caller) {\n  if (Error.captureStackTrace)\n    Error.captureStackTrace(this, caller || HttpSignatureError);\n\n  this.message = message;\n  this.name = caller.name;\n}\nutil.inherits(HttpSignatureError, Error);\n\nfunction InvalidAlgorithmError(message) {\n  HttpSignatureError.call(this, message, InvalidAlgorithmError);\n}\nutil.inherits(InvalidAlgorithmError, HttpSignatureError);\n\nfunction validateAlgorithm(algorithm) {\n  var alg = algorithm.toLowerCase().split('-');\n\n  if (alg.length !== 2) {\n    throw (new InvalidAlgorithmError(alg[0].toUpperCase() + ' is not a ' +\n      'valid algorithm'));\n  }\n\n  if (alg[0] !== 'hmac' && !PK_ALGOS[alg[0]]) {\n    throw (new InvalidAlgorithmError(alg[0].toUpperCase() + ' type keys ' +\n      'are not supported'));\n  }\n\n  if (!HASH_ALGOS[alg[1]]) {\n    throw (new InvalidAlgorithmError(alg[1].toUpperCase() + ' is not a ' +\n      'supported hash algorithm'));\n  }\n\n  return (alg);\n}\n\n///--- API\n\nmodule.exports = {\n\n  HASH_ALGOS: HASH_ALGOS,\n  PK_ALGOS: PK_ALGOS,\n\n  HttpSignatureError: HttpSignatureError,\n  InvalidAlgorithmError: InvalidAlgorithmError,\n\n  validateAlgorithm: validateAlgorithm,\n\n  /**\n   * Converts an OpenSSH public key (rsa only) to a PKCS#8 PEM file.\n   *\n   * The intent of this module is to interoperate with OpenSSL only,\n   * specifically the node crypto module's `verify` method.\n   *\n   * @param {String} key an OpenSSH public key.\n   * @return {String} PEM encoded form of the RSA public key.\n   * @throws {TypeError} on bad input.\n   * @throws {Error} on invalid ssh key formatted data.\n   */\n  sshKeyToPEM: function sshKeyToPEM(key) {\n    assert.string(key, 'ssh_key');\n\n    var k = sshpk.parseKey(key, 'ssh');\n    return (k.toString('pem'));\n  },\n\n\n  /**\n   * Generates an OpenSSH fingerprint from an ssh public key.\n   *\n   * @param {String} key an OpenSSH public key.\n   * @return {String} key fingerprint.\n   * @throws {TypeError} on bad input.\n   * @throws {Error} if what you passed doesn't look like an ssh public key.\n   */\n  fingerprint: function fingerprint(key) {\n    assert.string(key, 'ssh_key');\n\n    var k = sshpk.parseKey(key, 'ssh');\n    return (k.fingerprint('md5').toString('hex'));\n  },\n\n  /**\n   * Converts a PKGCS#8 PEM file to an OpenSSH public key (rsa)\n   *\n   * The reverse of the above function.\n   */\n  pemToRsaSSHKey: function pemToRsaSSHKey(pem, comment) {\n    assert.equal('string', typeof (pem), 'typeof pem');\n\n    var k = sshpk.parseKey(pem, 'pem');\n    k.comment = comment;\n    return (k.toString('ssh'));\n  }\n};\n\n\n/***/ }),\n/* 176 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar chalk = __webpack_require__(27);\nvar figures = __webpack_require__(267);\n\n/**\n * Separator object\n * Used to space/separate choices group\n * @constructor\n * @param {String} line   Separation line content (facultative)\n */\n\nclass Separator {\n  constructor(line) {\n    this.type = 'separator';\n    this.line = chalk.dim(line || new Array(15).join(figures.line));\n  }\n\n  /**\n   * Stringify separator\n   * @return {String} the separator display string\n   */\n  toString() {\n    return this.line;\n  }\n}\n\n/**\n * Helper function returning false if object is a separator\n * @param  {Object} obj object to test against\n * @return {Boolean}    `false` if object is a separator\n */\n\nSeparator.exclude = function(obj) {\n  return obj.type !== 'separator';\n};\n\nmodule.exports = Separator;\n\n\n/***/ }),\n/* 177 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _ = __webpack_require__(38);\nvar chalk = __webpack_require__(27);\n\n/**\n * The paginator keeps track of a pointer index in a list and returns\n * a subset of the choices if the list is too long.\n */\n\nclass Paginator {\n  constructor(screen) {\n    this.pointer = 0;\n    this.lastIndex = 0;\n    this.screen = screen;\n  }\n\n  paginate(output, active, pageSize) {\n    pageSize = pageSize || 7;\n    var middleOfList = Math.floor(pageSize / 2);\n    var lines = output.split('\\n');\n\n    if (this.screen) {\n      lines = this.screen.breakLines(lines);\n      active = _.sum(lines.map(lineParts => lineParts.length).splice(0, active));\n      lines = _.flatten(lines);\n    }\n\n    // Make sure there's enough lines to paginate\n    if (lines.length <= pageSize) {\n      return output;\n    }\n\n    // Move the pointer only when the user go down and limit it to the middle of the list\n    if (\n      this.pointer < middleOfList &&\n      this.lastIndex < active &&\n      active - this.lastIndex < pageSize\n    ) {\n      this.pointer = Math.min(middleOfList, this.pointer + active - this.lastIndex);\n    }\n    this.lastIndex = active;\n\n    // Duplicate the lines so it give an infinite list look\n    var infinite = _.flatten([lines, lines, lines]);\n    var topIndex = Math.max(0, active + lines.length - this.pointer);\n\n    var section = infinite.splice(topIndex, pageSize).join('\\n');\n    return section + '\\n' + chalk.dim('(Move up and down to reveal more choices)');\n  }\n}\n\nmodule.exports = Paginator;\n\n\n/***/ }),\n/* 178 */\n/***/ (function(module, exports) {\n\n/*!\n * is-extglob <https://github.com/jonschlinkert/is-extglob>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\nmodule.exports = function isExtglob(str) {\n  return typeof str === 'string'\n    && /[@?!+*]\\(/.test(str);\n};\n\n\n/***/ }),\n/* 179 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*!\n * is-glob <https://github.com/jonschlinkert/is-glob>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\nvar isExtglob = __webpack_require__(178);\n\nmodule.exports = function isGlob(str) {\n  return typeof str === 'string'\n    && (/[*!?{}(|)[\\]]/.test(str)\n     || isExtglob(str));\n};\n\n/***/ }),\n/* 180 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isBuffer = __webpack_require__(729);\nvar toString = Object.prototype.toString;\n\n/**\n * Get the native `typeof` a value.\n *\n * @param  {*} `val`\n * @return {*} Native javascript type\n */\n\nmodule.exports = function kindOf(val) {\n  // primitivies\n  if (typeof val === 'undefined') {\n    return 'undefined';\n  }\n  if (val === null) {\n    return 'null';\n  }\n  if (val === true || val === false || val instanceof Boolean) {\n    return 'boolean';\n  }\n  if (typeof val === 'string' || val instanceof String) {\n    return 'string';\n  }\n  if (typeof val === 'number' || val instanceof Number) {\n    return 'number';\n  }\n\n  // functions\n  if (typeof val === 'function' || val instanceof Function) {\n    return 'function';\n  }\n\n  // array\n  if (typeof Array.isArray !== 'undefined' && Array.isArray(val)) {\n    return 'array';\n  }\n\n  // check for instances of RegExp and Date before calling `toString`\n  if (val instanceof RegExp) {\n    return 'regexp';\n  }\n  if (val instanceof Date) {\n    return 'date';\n  }\n\n  // other objects\n  var type = toString.call(val);\n\n  if (type === '[object RegExp]') {\n    return 'regexp';\n  }\n  if (type === '[object Date]') {\n    return 'date';\n  }\n  if (type === '[object Arguments]') {\n    return 'arguments';\n  }\n  if (type === '[object Error]') {\n    return 'error';\n  }\n\n  // buffer\n  if (isBuffer(val)) {\n    return 'buffer';\n  }\n\n  // es6: Map, WeakMap, Set, WeakSet\n  if (type === '[object Set]') {\n    return 'set';\n  }\n  if (type === '[object WeakSet]') {\n    return 'weakset';\n  }\n  if (type === '[object Map]') {\n    return 'map';\n  }\n  if (type === '[object WeakMap]') {\n    return 'weakmap';\n  }\n  if (type === '[object Symbol]') {\n    return 'symbol';\n  }\n\n  // typed arrays\n  if (type === '[object Int8Array]') {\n    return 'int8array';\n  }\n  if (type === '[object Uint8Array]') {\n    return 'uint8array';\n  }\n  if (type === '[object Uint8ClampedArray]') {\n    return 'uint8clampedarray';\n  }\n  if (type === '[object Int16Array]') {\n    return 'int16array';\n  }\n  if (type === '[object Uint16Array]') {\n    return 'uint16array';\n  }\n  if (type === '[object Int32Array]') {\n    return 'int32array';\n  }\n  if (type === '[object Uint32Array]') {\n    return 'uint32array';\n  }\n  if (type === '[object Float32Array]') {\n    return 'float32array';\n  }\n  if (type === '[object Float64Array]') {\n    return 'float64array';\n  }\n\n  // must be a plain object\n  return 'object';\n};\n\n\n/***/ }),\n/* 181 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nif (!process.version ||\n    process.version.indexOf('v0.') === 0 ||\n    process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) {\n  module.exports = { nextTick: nextTick };\n} else {\n  module.exports = process\n}\n\nfunction nextTick(fn, arg1, arg2, arg3) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('\"callback\" argument must be a function');\n  }\n  var len = arguments.length;\n  var args, i;\n  switch (len) {\n  case 0:\n  case 1:\n    return process.nextTick(fn);\n  case 2:\n    return process.nextTick(function afterTickOne() {\n      fn.call(null, arg1);\n    });\n  case 3:\n    return process.nextTick(function afterTickTwo() {\n      fn.call(null, arg1, arg2);\n    });\n  case 4:\n    return process.nextTick(function afterTickThree() {\n      fn.call(null, arg1, arg2, arg3);\n    });\n  default:\n    args = new Array(len - 1);\n    i = 0;\n    while (i < args.length) {\n      args[i++] = arguments[i];\n    }\n    return process.nextTick(function afterTick() {\n      fn.apply(null, args);\n    });\n  }\n}\n\n\n\n/***/ }),\n/* 182 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar isPromise = __webpack_require__(741);\n\n/**\n * Return a function that will run a function asynchronously or synchronously\n *\n * example:\n * runAsync(wrappedFunction, callback)(...args);\n *\n * @param   {Function} func  Function to run\n * @param   {Function} cb    Callback function passed the `func` returned value\n * @return  {Function(arguments)} Arguments to pass to `func`. This function will in turn\n *                                return a Promise (Node >= 0.12) or call the callbacks.\n */\n\nvar runAsync = module.exports = function (func, cb) {\n  cb = cb || function () {};\n\n  return function () {\n    var async = false;\n    var args = arguments;\n\n    var promise = new Promise(function (resolve, reject) {\n      var answer = func.apply({\n        async: function () {\n          async = true;\n          return function (err, value) {\n            if (err) {\n              reject(err);\n            } else {\n              resolve(value);\n            }\n          };\n        }\n      }, Array.prototype.slice.call(args));\n\n      if (!async) {\n        if (isPromise(answer)) {\n          answer.then(resolve, reject);\n        } else {\n          resolve(answer);\n        }\n      }\n    });\n\n    promise.then(cb.bind(null, null), cb);\n\n    return promise;\n  }\n};\n\nrunAsync.cb = function (func, cb) {\n  return runAsync(function () {\n    var args = Array.prototype.slice.call(arguments);\n    if (args.length === func.length - 1) {\n      args.push(this.async());\n    }\n    return func.apply(this, args);\n  }, cb);\n};\n\n\n/***/ }),\n/* 183 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__internal_Observable__ = __webpack_require__(12);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Observable\", function() { return __WEBPACK_IMPORTED_MODULE_0__internal_Observable__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__internal_observable_ConnectableObservable__ = __webpack_require__(423);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"ConnectableObservable\", function() { return __WEBPACK_IMPORTED_MODULE_1__internal_observable_ConnectableObservable__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__internal_operators_groupBy__ = __webpack_require__(433);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"GroupedObservable\", function() { return __WEBPACK_IMPORTED_MODULE_2__internal_operators_groupBy__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__internal_symbol_observable__ = __webpack_require__(118);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"observable\", function() { return __WEBPACK_IMPORTED_MODULE_3__internal_symbol_observable__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__internal_Subject__ = __webpack_require__(36);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Subject\", function() { return __WEBPACK_IMPORTED_MODULE_4__internal_Subject__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__internal_BehaviorSubject__ = __webpack_require__(419);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"BehaviorSubject\", function() { return __WEBPACK_IMPORTED_MODULE_5__internal_BehaviorSubject__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__internal_ReplaySubject__ = __webpack_require__(309);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"ReplaySubject\", function() { return __WEBPACK_IMPORTED_MODULE_6__internal_ReplaySubject__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__internal_AsyncSubject__ = __webpack_require__(184);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"AsyncSubject\", function() { return __WEBPACK_IMPORTED_MODULE_7__internal_AsyncSubject__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__internal_scheduler_asap__ = __webpack_require__(438);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"asapScheduler\", function() { return __WEBPACK_IMPORTED_MODULE_8__internal_scheduler_asap__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__internal_scheduler_async__ = __webpack_require__(40);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"asyncScheduler\", function() { return __WEBPACK_IMPORTED_MODULE_9__internal_scheduler_async__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__internal_scheduler_queue__ = __webpack_require__(439);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"queueScheduler\", function() { return __WEBPACK_IMPORTED_MODULE_10__internal_scheduler_queue__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_11__internal_scheduler_animationFrame__ = __webpack_require__(926);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"animationFrameScheduler\", function() { return __WEBPACK_IMPORTED_MODULE_11__internal_scheduler_animationFrame__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_12__internal_scheduler_VirtualTimeScheduler__ = __webpack_require__(925);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"VirtualTimeScheduler\", function() { return __WEBPACK_IMPORTED_MODULE_12__internal_scheduler_VirtualTimeScheduler__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"VirtualAction\", function() { return __WEBPACK_IMPORTED_MODULE_12__internal_scheduler_VirtualTimeScheduler__[\"b\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_13__internal_Scheduler__ = __webpack_require__(421);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Scheduler\", function() { return __WEBPACK_IMPORTED_MODULE_13__internal_Scheduler__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_14__internal_Subscription__ = __webpack_require__(25);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Subscription\", function() { return __WEBPACK_IMPORTED_MODULE_14__internal_Subscription__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_15__internal_Subscriber__ = __webpack_require__(7);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Subscriber\", function() { return __WEBPACK_IMPORTED_MODULE_15__internal_Subscriber__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_16__internal_Notification__ = __webpack_require__(185);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"Notification\", function() { return __WEBPACK_IMPORTED_MODULE_16__internal_Notification__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_17__internal_util_pipe__ = __webpack_require__(325);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"pipe\", function() { return __WEBPACK_IMPORTED_MODULE_17__internal_util_pipe__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_18__internal_util_noop__ = __webpack_require__(192);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"noop\", function() { return __WEBPACK_IMPORTED_MODULE_18__internal_util_noop__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_19__internal_util_identity__ = __webpack_require__(119);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"identity\", function() { return __WEBPACK_IMPORTED_MODULE_19__internal_util_identity__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_20__internal_util_isObservable__ = __webpack_require__(930);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"isObservable\", function() { return __WEBPACK_IMPORTED_MODULE_20__internal_util_isObservable__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_21__internal_util_ArgumentOutOfRangeError__ = __webpack_require__(153);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"ArgumentOutOfRangeError\", function() { return __WEBPACK_IMPORTED_MODULE_21__internal_util_ArgumentOutOfRangeError__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_22__internal_util_EmptyError__ = __webpack_require__(154);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"EmptyError\", function() { return __WEBPACK_IMPORTED_MODULE_22__internal_util_EmptyError__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_23__internal_util_ObjectUnsubscribedError__ = __webpack_require__(190);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"ObjectUnsubscribedError\", function() { return __WEBPACK_IMPORTED_MODULE_23__internal_util_ObjectUnsubscribedError__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_24__internal_util_UnsubscriptionError__ = __webpack_require__(441);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"UnsubscriptionError\", function() { return __WEBPACK_IMPORTED_MODULE_24__internal_util_UnsubscriptionError__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_25__internal_util_TimeoutError__ = __webpack_require__(440);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"TimeoutError\", function() { return __WEBPACK_IMPORTED_MODULE_25__internal_util_TimeoutError__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_26__internal_observable_bindCallback__ = __webpack_require__(823);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"bindCallback\", function() { return __WEBPACK_IMPORTED_MODULE_26__internal_observable_bindCallback__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_27__internal_observable_bindNodeCallback__ = __webpack_require__(824);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"bindNodeCallback\", function() { return __WEBPACK_IMPORTED_MODULE_27__internal_observable_bindNodeCallback__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_28__internal_observable_combineLatest__ = __webpack_require__(310);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"combineLatest\", function() { return __WEBPACK_IMPORTED_MODULE_28__internal_observable_combineLatest__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_29__internal_observable_concat__ = __webpack_require__(187);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"concat\", function() { return __WEBPACK_IMPORTED_MODULE_29__internal_observable_concat__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_30__internal_observable_defer__ = __webpack_require__(311);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"defer\", function() { return __WEBPACK_IMPORTED_MODULE_30__internal_observable_defer__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_31__internal_observable_empty__ = __webpack_require__(39);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"empty\", function() { return __WEBPACK_IMPORTED_MODULE_31__internal_observable_empty__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_32__internal_observable_forkJoin__ = __webpack_require__(825);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"forkJoin\", function() { return __WEBPACK_IMPORTED_MODULE_32__internal_observable_forkJoin__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_33__internal_observable_from__ = __webpack_require__(62);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"from\", function() { return __WEBPACK_IMPORTED_MODULE_33__internal_observable_from__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_34__internal_observable_fromEvent__ = __webpack_require__(826);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"fromEvent\", function() { return __WEBPACK_IMPORTED_MODULE_34__internal_observable_fromEvent__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_35__internal_observable_fromEventPattern__ = __webpack_require__(827);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"fromEventPattern\", function() { return __WEBPACK_IMPORTED_MODULE_35__internal_observable_fromEventPattern__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_36__internal_observable_generate__ = __webpack_require__(831);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"generate\", function() { return __WEBPACK_IMPORTED_MODULE_36__internal_observable_generate__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_37__internal_observable_iif__ = __webpack_require__(832);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"iif\", function() { return __WEBPACK_IMPORTED_MODULE_37__internal_observable_iif__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_38__internal_observable_interval__ = __webpack_require__(833);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"interval\", function() { return __WEBPACK_IMPORTED_MODULE_38__internal_observable_interval__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_39__internal_observable_merge__ = __webpack_require__(424);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"merge\", function() { return __WEBPACK_IMPORTED_MODULE_39__internal_observable_merge__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_40__internal_observable_never__ = __webpack_require__(425);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"never\", function() { return __WEBPACK_IMPORTED_MODULE_40__internal_observable_never__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_41__internal_observable_of__ = __webpack_require__(312);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"of\", function() { return __WEBPACK_IMPORTED_MODULE_41__internal_observable_of__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_42__internal_observable_onErrorResumeNext__ = __webpack_require__(834);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"onErrorResumeNext\", function() { return __WEBPACK_IMPORTED_MODULE_42__internal_observable_onErrorResumeNext__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_43__internal_observable_pairs__ = __webpack_require__(835);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"pairs\", function() { return __WEBPACK_IMPORTED_MODULE_43__internal_observable_pairs__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_44__internal_observable_race__ = __webpack_require__(426);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"race\", function() { return __WEBPACK_IMPORTED_MODULE_44__internal_observable_race__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_45__internal_observable_range__ = __webpack_require__(836);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"range\", function() { return __WEBPACK_IMPORTED_MODULE_45__internal_observable_range__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_46__internal_observable_throwError__ = __webpack_require__(314);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"throwError\", function() { return __WEBPACK_IMPORTED_MODULE_46__internal_observable_throwError__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_47__internal_observable_timer__ = __webpack_require__(427);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"timer\", function() { return __WEBPACK_IMPORTED_MODULE_47__internal_observable_timer__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_48__internal_observable_using__ = __webpack_require__(837);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"using\", function() { return __WEBPACK_IMPORTED_MODULE_48__internal_observable_using__[\"a\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_49__internal_observable_zip__ = __webpack_require__(315);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"zip\", function() { return __WEBPACK_IMPORTED_MODULE_49__internal_observable_zip__[\"a\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"EMPTY\", function() { return __WEBPACK_IMPORTED_MODULE_31__internal_observable_empty__[\"b\"]; });\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"NEVER\", function() { return __WEBPACK_IMPORTED_MODULE_40__internal_observable_never__[\"b\"]; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_50__internal_config__ = __webpack_require__(186);\n/* harmony reexport (binding) */ __webpack_require__.d(__webpack_exports__, \"config\", function() { return __WEBPACK_IMPORTED_MODULE_50__internal_config__[\"a\"]; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceMappingURL=index.js.map\n\n\n/***/ }),\n/* 184 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AsyncSubject; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subscription__ = __webpack_require__(25);\n/** PURE_IMPORTS_START tslib,_Subject,_Subscription PURE_IMPORTS_END */\n\n\n\nvar AsyncSubject = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](AsyncSubject, _super);\n    function AsyncSubject() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.value = null;\n        _this.hasNext = false;\n        _this.hasCompleted = false;\n        return _this;\n    }\n    AsyncSubject.prototype._subscribe = function (subscriber) {\n        if (this.hasError) {\n            subscriber.error(this.thrownError);\n            return __WEBPACK_IMPORTED_MODULE_2__Subscription__[\"a\" /* Subscription */].EMPTY;\n        }\n        else if (this.hasCompleted && this.hasNext) {\n            subscriber.next(this.value);\n            subscriber.complete();\n            return __WEBPACK_IMPORTED_MODULE_2__Subscription__[\"a\" /* Subscription */].EMPTY;\n        }\n        return _super.prototype._subscribe.call(this, subscriber);\n    };\n    AsyncSubject.prototype.next = function (value) {\n        if (!this.hasCompleted) {\n            this.value = value;\n            this.hasNext = true;\n        }\n    };\n    AsyncSubject.prototype.error = function (error) {\n        if (!this.hasCompleted) {\n            _super.prototype.error.call(this, error);\n        }\n    };\n    AsyncSubject.prototype.complete = function () {\n        this.hasCompleted = true;\n        if (this.hasNext) {\n            _super.prototype.next.call(this, this.value);\n        }\n        _super.prototype.complete.call(this);\n    };\n    return AsyncSubject;\n}(__WEBPACK_IMPORTED_MODULE_1__Subject__[\"a\" /* Subject */]));\n\n//# sourceMappingURL=AsyncSubject.js.map\n\n\n/***/ }),\n/* 185 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Notification; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_empty__ = __webpack_require__(39);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__observable_of__ = __webpack_require__(312);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__observable_throwError__ = __webpack_require__(314);\n/** PURE_IMPORTS_START _observable_empty,_observable_of,_observable_throwError PURE_IMPORTS_END */\n\n\n\nvar Notification = /*@__PURE__*/ (function () {\n    function Notification(kind, value, error) {\n        this.kind = kind;\n        this.value = value;\n        this.error = error;\n        this.hasValue = kind === 'N';\n    }\n    Notification.prototype.observe = function (observer) {\n        switch (this.kind) {\n            case 'N':\n                return observer.next && observer.next(this.value);\n            case 'E':\n                return observer.error && observer.error(this.error);\n            case 'C':\n                return observer.complete && observer.complete();\n        }\n    };\n    Notification.prototype.do = function (next, error, complete) {\n        var kind = this.kind;\n        switch (kind) {\n            case 'N':\n                return next && next(this.value);\n            case 'E':\n                return error && error(this.error);\n            case 'C':\n                return complete && complete();\n        }\n    };\n    Notification.prototype.accept = function (nextOrObserver, error, complete) {\n        if (nextOrObserver && typeof nextOrObserver.next === 'function') {\n            return this.observe(nextOrObserver);\n        }\n        else {\n            return this.do(nextOrObserver, error, complete);\n        }\n    };\n    Notification.prototype.toObservable = function () {\n        var kind = this.kind;\n        switch (kind) {\n            case 'N':\n                return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__observable_of__[\"a\" /* of */])(this.value);\n            case 'E':\n                return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__observable_throwError__[\"a\" /* throwError */])(this.error);\n            case 'C':\n                return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__observable_empty__[\"a\" /* empty */])();\n        }\n        throw new Error('unexpected notification kind value');\n    };\n    Notification.createNext = function (value) {\n        if (typeof value !== 'undefined') {\n            return new Notification('N', value);\n        }\n        return Notification.undefinedValueNotification;\n    };\n    Notification.createError = function (err) {\n        return new Notification('E', undefined, err);\n    };\n    Notification.createComplete = function () {\n        return Notification.completeNotification;\n    };\n    Notification.completeNotification = new Notification('C');\n    Notification.undefinedValueNotification = new Notification('N', undefined);\n    return Notification;\n}());\n\n//# sourceMappingURL=Notification.js.map\n\n\n/***/ }),\n/* 186 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return config; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nvar _enable_super_gross_mode_that_will_cause_bad_things = false;\nvar config = {\n    Promise: undefined,\n    set useDeprecatedSynchronousErrorHandling(value) {\n        if (value) {\n            var error = /*@__PURE__*/ new Error();\n            /*@__PURE__*/ console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \\n' + error.stack);\n        }\n        else if (_enable_super_gross_mode_that_will_cause_bad_things) {\n            /*@__PURE__*/ console.log('RxJS: Back to a better error behavior. Thank you. <3');\n        }\n        _enable_super_gross_mode_that_will_cause_bad_things = value;\n    },\n    get useDeprecatedSynchronousErrorHandling() {\n        return _enable_super_gross_mode_that_will_cause_bad_things;\n    },\n};\n//# sourceMappingURL=config.js.map\n\n\n/***/ }),\n/* 187 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = concat;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_isScheduler__ = __webpack_require__(49);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__of__ = __webpack_require__(312);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__from__ = __webpack_require__(62);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__operators_concatAll__ = __webpack_require__(429);\n/** PURE_IMPORTS_START _util_isScheduler,_of,_from,_operators_concatAll PURE_IMPORTS_END */\n\n\n\n\nfunction concat() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    if (observables.length === 1 || (observables.length === 2 && __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__util_isScheduler__[\"a\" /* isScheduler */])(observables[1]))) {\n        return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__from__[\"a\" /* from */])(observables[0]);\n    }\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__operators_concatAll__[\"a\" /* concatAll */])()(__WEBPACK_IMPORTED_MODULE_1__of__[\"a\" /* of */].apply(void 0, observables));\n}\n//# sourceMappingURL=concat.js.map\n\n\n/***/ }),\n/* 188 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = reduce;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__scan__ = __webpack_require__(318);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__takeLast__ = __webpack_require__(321);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__defaultIfEmpty__ = __webpack_require__(147);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_pipe__ = __webpack_require__(325);\n/** PURE_IMPORTS_START _scan,_takeLast,_defaultIfEmpty,_util_pipe PURE_IMPORTS_END */\n\n\n\n\nfunction reduce(accumulator, seed) {\n    if (arguments.length >= 2) {\n        return function reduceOperatorFunctionWithSeed(source) {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_pipe__[\"a\" /* pipe */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__scan__[\"a\" /* scan */])(accumulator, seed), __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__takeLast__[\"a\" /* takeLast */])(1), __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__defaultIfEmpty__[\"a\" /* defaultIfEmpty */])(seed))(source);\n        };\n    }\n    return function reduceOperatorFunction(source) {\n        return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_pipe__[\"a\" /* pipe */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__scan__[\"a\" /* scan */])(function (acc, value, index) { return accumulator(acc, value, index + 1); }), __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__takeLast__[\"a\" /* takeLast */])(1))(source);\n    };\n}\n//# sourceMappingURL=reduce.js.map\n\n\n/***/ }),\n/* 189 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return throwIfEmpty; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__tap__ = __webpack_require__(435);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_EmptyError__ = __webpack_require__(154);\n/** PURE_IMPORTS_START _tap,_util_EmptyError PURE_IMPORTS_END */\n\n\nvar throwIfEmpty = function (errorFactory) {\n    if (errorFactory === void 0) {\n        errorFactory = defaultErrorFactory;\n    }\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__tap__[\"a\" /* tap */])({\n        hasValue: false,\n        next: function () { this.hasValue = true; },\n        complete: function () {\n            if (!this.hasValue) {\n                throw errorFactory();\n            }\n        }\n    });\n};\nfunction defaultErrorFactory() {\n    return new __WEBPACK_IMPORTED_MODULE_1__util_EmptyError__[\"a\" /* EmptyError */]();\n}\n//# sourceMappingURL=throwIfEmpty.js.map\n\n\n/***/ }),\n/* 190 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ObjectUnsubscribedError; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction ObjectUnsubscribedErrorImpl() {\n    Error.call(this);\n    this.message = 'object unsubscribed';\n    this.name = 'ObjectUnsubscribedError';\n    return this;\n}\nObjectUnsubscribedErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype);\nvar ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl;\n//# sourceMappingURL=ObjectUnsubscribedError.js.map\n\n\n/***/ }),\n/* 191 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = isNumeric;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__isArray__ = __webpack_require__(41);\n/** PURE_IMPORTS_START _isArray PURE_IMPORTS_END */\n\nfunction isNumeric(val) {\n    return !__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__isArray__[\"a\" /* isArray */])(val) && (val - parseFloat(val) + 1) >= 0;\n}\n//# sourceMappingURL=isNumeric.js.map\n\n\n/***/ }),\n/* 192 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = noop;\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction noop() { }\n//# sourceMappingURL=noop.js.map\n\n\n/***/ }),\n/* 193 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nmodule.exports = {\n\tread: read,\n\treadSSHPrivate: readSSHPrivate,\n\twrite: write\n};\n\nvar assert = __webpack_require__(16);\nvar asn1 = __webpack_require__(66);\nvar Buffer = __webpack_require__(15).Buffer;\nvar algs = __webpack_require__(32);\nvar utils = __webpack_require__(26);\nvar crypto = __webpack_require__(11);\n\nvar Key = __webpack_require__(28);\nvar PrivateKey = __webpack_require__(33);\nvar pem = __webpack_require__(86);\nvar rfc4253 = __webpack_require__(103);\nvar SSHBuffer = __webpack_require__(160);\nvar errors = __webpack_require__(74);\n\nvar bcrypt;\n\nfunction read(buf, options) {\n\treturn (pem.read(buf, options));\n}\n\nvar MAGIC = 'openssh-key-v1';\n\nfunction readSSHPrivate(type, buf, options) {\n\tbuf = new SSHBuffer({buffer: buf});\n\n\tvar magic = buf.readCString();\n\tassert.strictEqual(magic, MAGIC, 'bad magic string');\n\n\tvar cipher = buf.readString();\n\tvar kdf = buf.readString();\n\tvar kdfOpts = buf.readBuffer();\n\n\tvar nkeys = buf.readInt();\n\tif (nkeys !== 1) {\n\t\tthrow (new Error('OpenSSH-format key file contains ' +\n\t\t    'multiple keys: this is unsupported.'));\n\t}\n\n\tvar pubKey = buf.readBuffer();\n\n\tif (type === 'public') {\n\t\tassert.ok(buf.atEnd(), 'excess bytes left after key');\n\t\treturn (rfc4253.read(pubKey));\n\t}\n\n\tvar privKeyBlob = buf.readBuffer();\n\tassert.ok(buf.atEnd(), 'excess bytes left after key');\n\n\tvar kdfOptsBuf = new SSHBuffer({ buffer: kdfOpts });\n\tswitch (kdf) {\n\tcase 'none':\n\t\tif (cipher !== 'none') {\n\t\t\tthrow (new Error('OpenSSH-format key uses KDF \"none\" ' +\n\t\t\t     'but specifies a cipher other than \"none\"'));\n\t\t}\n\t\tbreak;\n\tcase 'bcrypt':\n\t\tvar salt = kdfOptsBuf.readBuffer();\n\t\tvar rounds = kdfOptsBuf.readInt();\n\t\tvar cinf = utils.opensshCipherInfo(cipher);\n\t\tif (bcrypt === undefined) {\n\t\t\tbcrypt = __webpack_require__(373);\n\t\t}\n\n\t\tif (typeof (options.passphrase) === 'string') {\n\t\t\toptions.passphrase = Buffer.from(options.passphrase,\n\t\t\t    'utf-8');\n\t\t}\n\t\tif (!Buffer.isBuffer(options.passphrase)) {\n\t\t\tthrow (new errors.KeyEncryptedError(\n\t\t\t    options.filename, 'OpenSSH'));\n\t\t}\n\n\t\tvar pass = new Uint8Array(options.passphrase);\n\t\tvar salti = new Uint8Array(salt);\n\t\t/* Use the pbkdf to derive both the key and the IV. */\n\t\tvar out = new Uint8Array(cinf.keySize + cinf.blockSize);\n\t\tvar res = bcrypt.pbkdf(pass, pass.length, salti, salti.length,\n\t\t    out, out.length, rounds);\n\t\tif (res !== 0) {\n\t\t\tthrow (new Error('bcrypt_pbkdf function returned ' +\n\t\t\t    'failure, parameters invalid'));\n\t\t}\n\t\tout = Buffer.from(out);\n\t\tvar ckey = out.slice(0, cinf.keySize);\n\t\tvar iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize);\n\t\tvar cipherStream = crypto.createDecipheriv(cinf.opensslName,\n\t\t    ckey, iv);\n\t\tcipherStream.setAutoPadding(false);\n\t\tvar chunk, chunks = [];\n\t\tcipherStream.once('error', function (e) {\n\t\t\tif (e.toString().indexOf('bad decrypt') !== -1) {\n\t\t\t\tthrow (new Error('Incorrect passphrase ' +\n\t\t\t\t    'supplied, could not decrypt key'));\n\t\t\t}\n\t\t\tthrow (e);\n\t\t});\n\t\tcipherStream.write(privKeyBlob);\n\t\tcipherStream.end();\n\t\twhile ((chunk = cipherStream.read()) !== null)\n\t\t\tchunks.push(chunk);\n\t\tprivKeyBlob = Buffer.concat(chunks);\n\t\tbreak;\n\tdefault:\n\t\tthrow (new Error(\n\t\t    'OpenSSH-format key uses unknown KDF \"' + kdf + '\"'));\n\t}\n\n\tbuf = new SSHBuffer({buffer: privKeyBlob});\n\n\tvar checkInt1 = buf.readInt();\n\tvar checkInt2 = buf.readInt();\n\tif (checkInt1 !== checkInt2) {\n\t\tthrow (new Error('Incorrect passphrase supplied, could not ' +\n\t\t    'decrypt key'));\n\t}\n\n\tvar ret = {};\n\tvar key = rfc4253.readInternal(ret, 'private', buf.remainder());\n\n\tbuf.skip(ret.consumed);\n\n\tvar comment = buf.readString();\n\tkey.comment = comment;\n\n\treturn (key);\n}\n\nfunction write(key, options) {\n\tvar pubKey;\n\tif (PrivateKey.isPrivateKey(key))\n\t\tpubKey = key.toPublic();\n\telse\n\t\tpubKey = key;\n\n\tvar cipher = 'none';\n\tvar kdf = 'none';\n\tvar kdfopts = Buffer.alloc(0);\n\tvar cinf = { blockSize: 8 };\n\tvar passphrase;\n\tif (options !== undefined) {\n\t\tpassphrase = options.passphrase;\n\t\tif (typeof (passphrase) === 'string')\n\t\t\tpassphrase = Buffer.from(passphrase, 'utf-8');\n\t\tif (passphrase !== undefined) {\n\t\t\tassert.buffer(passphrase, 'options.passphrase');\n\t\t\tassert.optionalString(options.cipher, 'options.cipher');\n\t\t\tcipher = options.cipher;\n\t\t\tif (cipher === undefined)\n\t\t\t\tcipher = 'aes128-ctr';\n\t\t\tcinf = utils.opensshCipherInfo(cipher);\n\t\t\tkdf = 'bcrypt';\n\t\t}\n\t}\n\n\tvar privBuf;\n\tif (PrivateKey.isPrivateKey(key)) {\n\t\tprivBuf = new SSHBuffer({});\n\t\tvar checkInt = crypto.randomBytes(4).readUInt32BE(0);\n\t\tprivBuf.writeInt(checkInt);\n\t\tprivBuf.writeInt(checkInt);\n\t\tprivBuf.write(key.toBuffer('rfc4253'));\n\t\tprivBuf.writeString(key.comment || '');\n\n\t\tvar n = 1;\n\t\twhile (privBuf._offset % cinf.blockSize !== 0)\n\t\t\tprivBuf.writeChar(n++);\n\t\tprivBuf = privBuf.toBuffer();\n\t}\n\n\tswitch (kdf) {\n\tcase 'none':\n\t\tbreak;\n\tcase 'bcrypt':\n\t\tvar salt = crypto.randomBytes(16);\n\t\tvar rounds = 16;\n\t\tvar kdfssh = new SSHBuffer({});\n\t\tkdfssh.writeBuffer(salt);\n\t\tkdfssh.writeInt(rounds);\n\t\tkdfopts = kdfssh.toBuffer();\n\n\t\tif (bcrypt === undefined) {\n\t\t\tbcrypt = __webpack_require__(373);\n\t\t}\n\t\tvar pass = new Uint8Array(passphrase);\n\t\tvar salti = new Uint8Array(salt);\n\t\t/* Use the pbkdf to derive both the key and the IV. */\n\t\tvar out = new Uint8Array(cinf.keySize + cinf.blockSize);\n\t\tvar res = bcrypt.pbkdf(pass, pass.length, salti, salti.length,\n\t\t    out, out.length, rounds);\n\t\tif (res !== 0) {\n\t\t\tthrow (new Error('bcrypt_pbkdf function returned ' +\n\t\t\t    'failure, parameters invalid'));\n\t\t}\n\t\tout = Buffer.from(out);\n\t\tvar ckey = out.slice(0, cinf.keySize);\n\t\tvar iv = out.slice(cinf.keySize, cinf.keySize + cinf.blockSize);\n\n\t\tvar cipherStream = crypto.createCipheriv(cinf.opensslName,\n\t\t    ckey, iv);\n\t\tcipherStream.setAutoPadding(false);\n\t\tvar chunk, chunks = [];\n\t\tcipherStream.once('error', function (e) {\n\t\t\tthrow (e);\n\t\t});\n\t\tcipherStream.write(privBuf);\n\t\tcipherStream.end();\n\t\twhile ((chunk = cipherStream.read()) !== null)\n\t\t\tchunks.push(chunk);\n\t\tprivBuf = Buffer.concat(chunks);\n\t\tbreak;\n\tdefault:\n\t\tthrow (new Error('Unsupported kdf ' + kdf));\n\t}\n\n\tvar buf = new SSHBuffer({});\n\n\tbuf.writeCString(MAGIC);\n\tbuf.writeString(cipher);\t/* cipher */\n\tbuf.writeString(kdf);\t\t/* kdf */\n\tbuf.writeBuffer(kdfopts);\t/* kdfoptions */\n\n\tbuf.writeInt(1);\t\t/* nkeys */\n\tbuf.writeBuffer(pubKey.toBuffer('rfc4253'));\n\n\tif (privBuf)\n\t\tbuf.writeBuffer(privBuf);\n\n\tbuf = buf.toBuffer();\n\n\tvar header;\n\tif (PrivateKey.isPrivateKey(key))\n\t\theader = 'OPENSSH PRIVATE KEY';\n\telse\n\t\theader = 'OPENSSH PUBLIC KEY';\n\n\tvar tmp = buf.toString('base64');\n\tvar len = tmp.length + (tmp.length / 70) +\n\t    18 + 16 + header.length*2 + 10;\n\tbuf = Buffer.alloc(len);\n\tvar o = 0;\n\to += buf.write('-----BEGIN ' + header + '-----\\n', o);\n\tfor (var i = 0; i < tmp.length; ) {\n\t\tvar limit = i + 70;\n\t\tif (limit > tmp.length)\n\t\t\tlimit = tmp.length;\n\t\to += buf.write(tmp.slice(i, limit), o);\n\t\tbuf[o++] = 10;\n\t\ti = limit;\n\t}\n\to += buf.write('-----END ' + header + '-----\\n', o);\n\n\treturn (buf.slice(0, o));\n}\n\n\n/***/ }),\n/* 194 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar chownr = __webpack_require__(568)\nvar tar = __webpack_require__(460)\nvar pump = __webpack_require__(781)\nvar mkdirp = __webpack_require__(146)\nvar fs = __webpack_require__(4)\nvar path = __webpack_require__(0)\nvar os = __webpack_require__(42)\n\nvar win32 = os.platform() === 'win32'\n\nvar noop = function () {}\n\nvar echo = function (name) {\n  return name\n}\n\nvar normalize = !win32 ? echo : function (name) {\n  return name.replace(/\\\\/g, '/').replace(/[:?<>|]/g, '_')\n}\n\nvar statAll = function (fs, stat, cwd, ignore, entries, sort) {\n  var queue = entries || ['.']\n\n  return function loop (callback) {\n    if (!queue.length) return callback()\n    var next = queue.shift()\n    var nextAbs = path.join(cwd, next)\n\n    stat(nextAbs, function (err, stat) {\n      if (err) return callback(err)\n\n      if (!stat.isDirectory()) return callback(null, next, stat)\n\n      fs.readdir(nextAbs, function (err, files) {\n        if (err) return callback(err)\n\n        if (sort) files.sort()\n        for (var i = 0; i < files.length; i++) {\n          if (!ignore(path.join(cwd, next, files[i]))) queue.push(path.join(next, files[i]))\n        }\n\n        callback(null, next, stat)\n      })\n    })\n  }\n}\n\nvar strip = function (map, level) {\n  return function (header) {\n    header.name = header.name.split('/').slice(level).join('/')\n\n    var linkname = header.linkname\n    if (linkname && (header.type === 'link' || path.isAbsolute(linkname))) {\n      header.linkname = linkname.split('/').slice(level).join('/')\n    }\n\n    return map(header)\n  }\n}\n\nexports.pack = function (cwd, opts) {\n  if (!cwd) cwd = '.'\n  if (!opts) opts = {}\n\n  var xfs = opts.fs || fs\n  var ignore = opts.ignore || opts.filter || noop\n  var map = opts.map || noop\n  var mapStream = opts.mapStream || echo\n  var statNext = statAll(xfs, opts.dereference ? xfs.stat : xfs.lstat, cwd, ignore, opts.entries, opts.sort)\n  var strict = opts.strict !== false\n  var umask = typeof opts.umask === 'number' ? ~opts.umask : ~processUmask()\n  var dmode = typeof opts.dmode === 'number' ? opts.dmode : 0\n  var fmode = typeof opts.fmode === 'number' ? opts.fmode : 0\n  var pack = opts.pack || tar.pack()\n  var finish = opts.finish || noop\n\n  if (opts.strip) map = strip(map, opts.strip)\n\n  if (opts.readable) {\n    dmode |= parseInt(555, 8)\n    fmode |= parseInt(444, 8)\n  }\n  if (opts.writable) {\n    dmode |= parseInt(333, 8)\n    fmode |= parseInt(222, 8)\n  }\n\n  var onsymlink = function (filename, header) {\n    xfs.readlink(path.join(cwd, filename), function (err, linkname) {\n      if (err) return pack.destroy(err)\n      header.linkname = normalize(linkname)\n      pack.entry(header, onnextentry)\n    })\n  }\n\n  var onstat = function (err, filename, stat) {\n    if (err) return pack.destroy(err)\n    if (!filename) {\n      if (opts.finalize !== false) pack.finalize()\n      return finish(pack)\n    }\n\n    if (stat.isSocket()) return onnextentry() // tar does not support sockets...\n\n    var header = {\n      name: normalize(filename),\n      mode: (stat.mode | (stat.isDirectory() ? dmode : fmode)) & umask,\n      mtime: stat.mtime,\n      size: stat.size,\n      type: 'file',\n      uid: stat.uid,\n      gid: stat.gid\n    }\n\n    if (stat.isDirectory()) {\n      header.size = 0\n      header.type = 'directory'\n      header = map(header) || header\n      return pack.entry(header, onnextentry)\n    }\n\n    if (stat.isSymbolicLink()) {\n      header.size = 0\n      header.type = 'symlink'\n      header = map(header) || header\n      return onsymlink(filename, header)\n    }\n\n    // TODO: add fifo etc...\n\n    header = map(header) || header\n\n    if (!stat.isFile()) {\n      if (strict) return pack.destroy(new Error('unsupported type for ' + filename))\n      return onnextentry()\n    }\n\n    var entry = pack.entry(header, onnextentry)\n    if (!entry) return\n\n    var rs = mapStream(xfs.createReadStream(path.join(cwd, filename)), header)\n\n    rs.on('error', function (err) { // always forward errors on destroy\n      entry.destroy(err)\n    })\n\n    pump(rs, entry)\n  }\n\n  var onnextentry = function (err) {\n    if (err) return pack.destroy(err)\n    statNext(onstat)\n  }\n\n  onnextentry()\n\n  return pack\n}\n\nvar head = function (list) {\n  return list.length ? list[list.length - 1] : null\n}\n\nvar processGetuid = function () {\n  return process.getuid ? process.getuid() : -1\n}\n\nvar processUmask = function () {\n  return process.umask ? process.umask() : 0\n}\n\nexports.extract = function (cwd, opts) {\n  if (!cwd) cwd = '.'\n  if (!opts) opts = {}\n\n  var xfs = opts.fs || fs\n  var ignore = opts.ignore || opts.filter || noop\n  var map = opts.map || noop\n  var mapStream = opts.mapStream || echo\n  var own = opts.chown !== false && !win32 && processGetuid() === 0\n  var extract = opts.extract || tar.extract()\n  var stack = []\n  var now = new Date()\n  var umask = typeof opts.umask === 'number' ? ~opts.umask : ~processUmask()\n  var dmode = typeof opts.dmode === 'number' ? opts.dmode : 0\n  var fmode = typeof opts.fmode === 'number' ? opts.fmode : 0\n  var strict = opts.strict !== false\n\n  if (opts.strip) map = strip(map, opts.strip)\n\n  if (opts.readable) {\n    dmode |= parseInt(555, 8)\n    fmode |= parseInt(444, 8)\n  }\n  if (opts.writable) {\n    dmode |= parseInt(333, 8)\n    fmode |= parseInt(222, 8)\n  }\n\n  var utimesParent = function (name, cb) { // we just set the mtime on the parent dir again everytime we write an entry\n    var top\n    while ((top = head(stack)) && name.slice(0, top[0].length) !== top[0]) stack.pop()\n    if (!top) return cb()\n    xfs.utimes(top[0], now, top[1], cb)\n  }\n\n  var utimes = function (name, header, cb) {\n    if (opts.utimes === false) return cb()\n\n    if (header.type === 'directory') return xfs.utimes(name, now, header.mtime, cb)\n    if (header.type === 'symlink') return utimesParent(name, cb) // TODO: how to set mtime on link?\n\n    xfs.utimes(name, now, header.mtime, function (err) {\n      if (err) return cb(err)\n      utimesParent(name, cb)\n    })\n  }\n\n  var chperm = function (name, header, cb) {\n    var link = header.type === 'symlink'\n    var chmod = link ? xfs.lchmod : xfs.chmod\n    var chown = link ? xfs.lchown : xfs.chown\n\n    if (!chmod) return cb()\n\n    var mode = (header.mode | (header.type === 'directory' ? dmode : fmode)) & umask\n    chmod(name, mode, function (err) {\n      if (err) return cb(err)\n      if (!own) return cb()\n      if (!chown) return cb()\n      chown(name, header.uid, header.gid, cb)\n    })\n  }\n\n  extract.on('entry', function (header, stream, next) {\n    header = map(header) || header\n    header.name = normalize(header.name)\n    var name = path.join(cwd, path.join('/', header.name))\n\n    if (ignore(name, header)) {\n      stream.resume()\n      return next()\n    }\n\n    var stat = function (err) {\n      if (err) return next(err)\n      utimes(name, header, function (err) {\n        if (err) return next(err)\n        if (win32) return next()\n        chperm(name, header, next)\n      })\n    }\n\n    var onsymlink = function () {\n      if (win32) return next() // skip symlinks on win for now before it can be tested\n      xfs.unlink(name, function () {\n        xfs.symlink(header.linkname, name, stat)\n      })\n    }\n\n    var onlink = function () {\n      if (win32) return next() // skip links on win for now before it can be tested\n      xfs.unlink(name, function () {\n        var srcpath = path.join(cwd, path.join('/', header.linkname))\n\n        xfs.link(srcpath, name, function (err) {\n          if (err && err.code === 'EPERM' && opts.hardlinkAsFilesFallback) {\n            stream = xfs.createReadStream(srcpath)\n            return onfile()\n          }\n\n          stat(err)\n        })\n      })\n    }\n\n    var onfile = function () {\n      var ws = xfs.createWriteStream(name)\n      var rs = mapStream(stream, header)\n\n      ws.on('error', function (err) { // always forward errors on destroy\n        rs.destroy(err)\n      })\n\n      pump(rs, ws, function (err) {\n        if (err) return next(err)\n        ws.on('close', stat)\n      })\n    }\n\n    if (header.type === 'directory') {\n      stack.push([name, header.mtime])\n      return mkdirfix(name, {\n        fs: xfs, own: own, uid: header.uid, gid: header.gid\n      }, stat)\n    }\n\n    var dir = path.dirname(name)\n\n    validate(xfs, dir, path.join(cwd, '.'), function (err, valid) {\n      if (err) return next(err)\n      if (!valid) return next(new Error(dir + ' is not a valid path'))\n\n      mkdirfix(dir, {\n        fs: xfs, own: own, uid: header.uid, gid: header.gid\n      }, function (err) {\n        if (err) return next(err)\n\n        switch (header.type) {\n          case 'file': return onfile()\n          case 'link': return onlink()\n          case 'symlink': return onsymlink()\n        }\n\n        if (strict) return next(new Error('unsupported type for ' + name + ' (' + header.type + ')'))\n\n        stream.resume()\n        next()\n      })\n    })\n  })\n\n  if (opts.finish) extract.on('finish', opts.finish)\n\n  return extract\n}\n\nfunction validate (fs, name, root, cb) {\n  if (name === root) return cb(null, true)\n  fs.lstat(name, function (err, st) {\n    if (err && err.code !== 'ENOENT') return cb(err)\n    if (err || st.isDirectory()) return validate(fs, path.join(name, '..'), root, cb)\n    cb(null, false)\n  })\n}\n\nfunction mkdirfix (name, opts, cb) {\n  mkdirp(name, {fs: opts.fs}, function (err, made) {\n    if (!err && made && opts.own) {\n      chownr(made, opts.uid, opts.gid, cb)\n    } else {\n      cb(err)\n    }\n  })\n}\n\n\n/***/ }),\n/* 195 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"name\":\"yarn\",\"installationMethod\":\"unknown\",\"version\":\"1.22.22\",\"packageManager\":\"yarn@1.22.17\",\"license\":\"BSD-2-Clause\",\"preferGlobal\":true,\"description\":\"📦🐈 Fast, reliable, and secure dependency management.\",\"dependencies\":{\"@zkochan/cmd-shim\":\"^3.1.0\",\"babel-runtime\":\"^6.26.0\",\"bytes\":\"^3.0.0\",\"camelcase\":\"^4.0.0\",\"chalk\":\"^2.1.0\",\"cli-table3\":\"^0.4.0\",\"commander\":\"^2.9.0\",\"death\":\"^1.0.0\",\"debug\":\"^3.0.0\",\"deep-equal\":\"^1.0.1\",\"detect-indent\":\"^5.0.0\",\"dnscache\":\"^1.0.1\",\"glob\":\"^7.1.1\",\"gunzip-maybe\":\"^1.4.0\",\"hash-for-dep\":\"^1.2.3\",\"imports-loader\":\"^0.8.0\",\"ini\":\"^1.3.4\",\"inquirer\":\"^6.2.0\",\"invariant\":\"^2.2.0\",\"is-builtin-module\":\"^2.0.0\",\"is-ci\":\"^1.0.10\",\"is-webpack-bundle\":\"^1.0.0\",\"js-yaml\":\"^3.13.1\",\"leven\":\"^2.0.0\",\"loud-rejection\":\"^1.2.0\",\"micromatch\":\"^2.3.11\",\"mkdirp\":\"^0.5.1\",\"node-emoji\":\"^1.6.1\",\"normalize-url\":\"^2.0.0\",\"npm-logical-tree\":\"^1.2.1\",\"object-path\":\"^0.11.2\",\"proper-lockfile\":\"^2.0.0\",\"puka\":\"^1.0.0\",\"punycode\":\"1.4.1\",\"read\":\"^1.0.7\",\"request\":\"^2.87.0\",\"request-capture-har\":\"^1.2.2\",\"rimraf\":\"^2.5.0\",\"semver\":\"^5.1.0\",\"ssri\":\"^5.3.0\",\"strip-ansi\":\"^4.0.0\",\"strip-bom\":\"^3.0.0\",\"tar-fs\":\"^1.16.0\",\"tar-stream\":\"^1.6.1\",\"uuid\":\"^3.0.1\",\"v8-compile-cache\":\"^2.0.0\",\"validate-npm-package-license\":\"^3.0.4\",\"yn\":\"^2.0.0\"},\"devDependencies\":{\"babel-core\":\"^6.26.0\",\"babel-eslint\":\"^7.2.3\",\"babel-loader\":\"^6.2.5\",\"babel-plugin-array-includes\":\"^2.0.3\",\"babel-plugin-inline-import\":\"^3.0.0\",\"babel-plugin-transform-builtin-extend\":\"^1.1.2\",\"babel-plugin-transform-inline-imports-commonjs\":\"^1.0.0\",\"babel-plugin-transform-runtime\":\"^6.4.3\",\"babel-preset-env\":\"^1.6.0\",\"babel-preset-flow\":\"^6.23.0\",\"babel-preset-stage-0\":\"^6.0.0\",\"babylon\":\"^6.5.0\",\"commitizen\":\"^2.9.6\",\"cz-conventional-changelog\":\"^2.0.0\",\"eslint\":\"^4.3.0\",\"eslint-config-fb-strict\":\"^22.0.0\",\"eslint-plugin-babel\":\"^5.0.0\",\"eslint-plugin-flowtype\":\"^2.35.0\",\"eslint-plugin-jasmine\":\"^2.6.2\",\"eslint-plugin-jest\":\"^21.0.0\",\"eslint-plugin-jsx-a11y\":\"^6.0.2\",\"eslint-plugin-prefer-object-spread\":\"^1.2.1\",\"eslint-plugin-prettier\":\"^2.1.2\",\"eslint-plugin-react\":\"^7.1.0\",\"eslint-plugin-relay\":\"^0.0.28\",\"eslint-plugin-yarn-internal\":\"file:scripts/eslint-rules\",\"execa\":\"^0.11.0\",\"fancy-log\":\"^1.3.2\",\"flow-bin\":\"^0.66.0\",\"git-release-notes\":\"^3.0.0\",\"gulp\":\"^4.0.0\",\"gulp-babel\":\"^7.0.0\",\"gulp-if\":\"^2.0.1\",\"gulp-newer\":\"^1.0.0\",\"gulp-plumber\":\"^1.0.1\",\"gulp-sourcemaps\":\"^2.2.0\",\"jest\":\"^22.4.4\",\"jsinspect\":\"^0.12.6\",\"minimatch\":\"^3.0.4\",\"mock-stdin\":\"^0.3.0\",\"prettier\":\"^1.5.2\",\"string-replace-loader\":\"^2.1.1\",\"temp\":\"^0.8.3\",\"webpack\":\"^2.1.0-beta.25\",\"yargs\":\"^6.3.0\"},\"resolutions\":{\"sshpk\":\"^1.14.2\"},\"engines\":{\"node\":\">=4.0.0\"},\"repository\":\"yarnpkg/yarn\",\"bin\":{\"yarn\":\"./bin/yarn.js\",\"yarnpkg\":\"./bin/yarn.js\"},\"scripts\":{\"build\":\"gulp build\",\"build-bundle\":\"node ./scripts/build-webpack.js\",\"build-chocolatey\":\"powershell ./scripts/build-chocolatey.ps1\",\"build-deb\":\"./scripts/build-deb.sh\",\"build-dist\":\"bash ./scripts/build-dist.sh\",\"build-win-installer\":\"scripts\\\\build-windows-installer.bat\",\"changelog\":\"git-release-notes $(git describe --tags --abbrev=0 $(git describe --tags --abbrev=0)^)..$(git describe --tags --abbrev=0) scripts/changelog.md\",\"dupe-check\":\"yarn jsinspect ./src\",\"lint\":\"eslint . && flow check\",\"pkg-tests\":\"yarn --cwd packages/pkg-tests jest yarn.test.js\",\"prettier\":\"eslint src __tests__ --fix\",\"release-branch\":\"./scripts/release-branch.sh\",\"test\":\"yarn lint && yarn test-only\",\"test-only\":\"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --verbose\",\"test-only-debug\":\"node --inspect-brk --max_old_space_size=4096 node_modules/jest/bin/jest.js --runInBand --verbose\",\"test-coverage\":\"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --coverage --verbose\",\"watch\":\"gulp watch\",\"commit\":\"git-cz\"},\"jest\":{\"collectCoverageFrom\":[\"src/**/*.js\"],\"testEnvironment\":\"node\",\"modulePathIgnorePatterns\":[\"__tests__/fixtures/\",\"packages/pkg-tests/pkg-tests-fixtures\",\"dist/\"],\"testPathIgnorePatterns\":[\"__tests__/(fixtures|__mocks__)/\",\"updates/\",\"_(temp|mock|install|init|helpers).js$\",\"packages/pkg-tests\"]},\"config\":{\"commitizen\":{\"path\":\"./node_modules/cz-conventional-changelog\"}}}\n\n/***/ }),\n/* 196 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"https\");\n\n/***/ }),\n/* 197 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"querystring\");\n\n/***/ }),\n/* 198 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"readline\");\n\n/***/ }),\n/* 199 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"zlib\");\n\n/***/ }),\n/* 200 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = stringify;\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nvar _package;\n\nfunction _load_package() {\n  return _package = __webpack_require__(195);\n}\n\nconst NODE_VERSION = process.version;\n\nfunction shouldWrapKey(str) {\n  return str.indexOf('true') === 0 || str.indexOf('false') === 0 || /[:\\s\\n\\\\\",\\[\\]]/g.test(str) || /^[0-9]/g.test(str) || !/^[a-zA-Z]/g.test(str);\n}\n\nfunction maybeWrap(str) {\n  if (typeof str === 'boolean' || typeof str === 'number' || shouldWrapKey(str)) {\n    return JSON.stringify(str);\n  } else {\n    return str;\n  }\n}\n\nconst priorities = {\n  name: 1,\n  version: 2,\n  uid: 3,\n  resolved: 4,\n  integrity: 5,\n  registry: 6,\n  dependencies: 7\n};\n\nfunction priorityThenAlphaSort(a, b) {\n  if (priorities[a] || priorities[b]) {\n    return (priorities[a] || 100) > (priorities[b] || 100) ? 1 : -1;\n  } else {\n    return (0, (_misc || _load_misc()).sortAlpha)(a, b);\n  }\n}\n\nfunction _stringify(obj, options) {\n  if (typeof obj !== 'object') {\n    throw new TypeError();\n  }\n\n  const indent = options.indent;\n  const lines = [];\n\n  // Sorting order needs to be consistent between runs, we run native sort by name because there are no\n  // problems with it being unstable because there are no to keys the same\n  // However priorities can be duplicated and native sort can shuffle things from run to run\n  const keys = Object.keys(obj).sort(priorityThenAlphaSort);\n\n  let addedKeys = [];\n\n  for (let i = 0; i < keys.length; i++) {\n    const key = keys[i];\n    const val = obj[key];\n    if (val == null || addedKeys.indexOf(key) >= 0) {\n      continue;\n    }\n\n    const valKeys = [key];\n\n    // get all keys that have the same value equality, we only want this for objects\n    if (typeof val === 'object') {\n      for (let j = i + 1; j < keys.length; j++) {\n        const key = keys[j];\n        if (val === obj[key]) {\n          valKeys.push(key);\n        }\n      }\n    }\n\n    const keyLine = valKeys.sort((_misc || _load_misc()).sortAlpha).map(maybeWrap).join(', ');\n\n    if (typeof val === 'string' || typeof val === 'boolean' || typeof val === 'number') {\n      lines.push(`${keyLine} ${maybeWrap(val)}`);\n    } else if (typeof val === 'object') {\n      lines.push(`${keyLine}:\\n${_stringify(val, { indent: indent + '  ' })}` + (options.topLevel ? '\\n' : ''));\n    } else {\n      throw new TypeError();\n    }\n\n    addedKeys = addedKeys.concat(valKeys);\n  }\n\n  return indent + lines.join(`\\n${indent}`);\n}\n\nfunction stringify(obj, noHeader, enableVersions) {\n  const val = _stringify(obj, {\n    indent: '',\n    topLevel: true\n  });\n  if (noHeader) {\n    return val;\n  }\n\n  const lines = [];\n  lines.push('# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.');\n  lines.push(`# yarn lockfile v${(_constants || _load_constants()).LOCKFILE_VERSION}`);\n  if (enableVersions) {\n    lines.push(`# yarn v${(_package || _load_package()).version}`);\n    lines.push(`# node ${NODE_VERSION}`);\n  }\n  lines.push('\\n');\n  lines.push(val);\n\n  return lines.join('\\n');\n}\n\n/***/ }),\n/* 201 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _consoleReporter;\n\nfunction _load_consoleReporter() {\n  return _consoleReporter = __webpack_require__(529);\n}\n\nObject.defineProperty(exports, 'ConsoleReporter', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_consoleReporter || _load_consoleReporter()).default;\n  }\n});\n\nvar _bufferReporter;\n\nfunction _load_bufferReporter() {\n  return _bufferReporter = __webpack_require__(528);\n}\n\nObject.defineProperty(exports, 'BufferReporter', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_bufferReporter || _load_bufferReporter()).default;\n  }\n});\n\nvar _eventReporter;\n\nfunction _load_eventReporter() {\n  return _eventReporter = __webpack_require__(533);\n}\n\nObject.defineProperty(exports, 'EventReporter', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_eventReporter || _load_eventReporter()).default;\n  }\n});\n\nvar _jsonReporter;\n\nfunction _load_jsonReporter() {\n  return _jsonReporter = __webpack_require__(211);\n}\n\nObject.defineProperty(exports, 'JSONReporter', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_jsonReporter || _load_jsonReporter()).default;\n  }\n});\n\nvar _noopReporter;\n\nfunction _load_noopReporter() {\n  return _noopReporter = __webpack_require__(537);\n}\n\nObject.defineProperty(exports, 'NoopReporter', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_noopReporter || _load_noopReporter()).default;\n  }\n});\n\nvar _baseReporter;\n\nfunction _load_baseReporter() {\n  return _baseReporter = __webpack_require__(108);\n}\n\nObject.defineProperty(exports, 'Reporter', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_baseReporter || _load_baseReporter()).default;\n  }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 202 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// On windows, create a .cmd file.\n// Read the #! in the file to see what it uses.  The vast majority\n// of the time, this will be either:\n// \"#!/usr/bin/env <prog> <args...>\"\n// or:\n// \"#!<prog> <args...>\"\n//\n// Write a binroot/pkg.bin + \".cmd\" file that has this line in it:\n// @<prog> <args...> %~dp0<target> %*\n\nmodule.exports = cmdShim\ncmdShim.ifExists = cmdShimIfExists\n\nconst fs = __webpack_require__(762)\n\nconst mkdir = __webpack_require__(761)\nconst path = __webpack_require__(0)\nconst isWindows = __webpack_require__(743)\nconst shebangExpr = /^#!\\s*(?:\\/usr\\/bin\\/env)?\\s*([^ \\t]+)(.*)$/\nconst DEFAULT_OPTIONS = {\n  // Create PowerShell file by default if the option hasn't been specified\n  createPwshFile: true,\n  createCmdFile: isWindows()\n}\n\nfunction cmdShimIfExists (src, to, opts) {\n  opts = Object.assign({}, DEFAULT_OPTIONS, opts)\n  return fs.stat(src)\n    .then(() => cmdShim(src, to, opts))\n    .catch(() => {})\n}\n\n// Try to unlink, but ignore errors.\n// Any problems will surface later.\nfunction rm (path) {\n  return fs.unlink(path).catch(() => {})\n}\n\nfunction cmdShim (src, to, opts) {\n  opts = Object.assign({}, DEFAULT_OPTIONS, opts)\n  return fs.stat(src)\n    .then(() => cmdShim_(src, to, opts))\n}\n\nfunction cmdShim_ (src, to, opts) {\n  return Promise.all([\n    rm(to),\n    rm(`${to}.ps1`),\n    opts.createCmdFile && rm(`${to}.cmd`)\n  ])\n    .then(() => writeShim(src, to, opts))\n}\n\nfunction writeShim (src, to, opts) {\n  opts = Object.assign({}, DEFAULT_OPTIONS, opts)\n  const defaultArgs = opts.preserveSymlinks ? '--preserve-symlinks' : ''\n  // make a cmd file and a sh script\n  // First, check if the bin is a #! of some sort.\n  // If not, then assume it's something that'll be compiled, or some other\n  // sort of script, and just call it directly.\n  return mkdir(path.dirname(to))\n    .then(() => {\n      return fs.readFile(src, 'utf8')\n        .then(data => {\n          const firstLine = data.trim().split(/\\r*\\n/)[0]\n          const shebang = firstLine.match(shebangExpr)\n          if (!shebang) return writeShim_(src, to, Object.assign({}, opts, {args: defaultArgs}))\n          const prog = shebang[1]\n          const args = (shebang[2] && ((defaultArgs && (shebang[2] + ' ' + defaultArgs)) || shebang[2])) || defaultArgs\n          return writeShim_(src, to, Object.assign({}, opts, {prog, args}))\n        })\n        .catch(() => writeShim_(src, to, Object.assign({}, opts, {args: defaultArgs})))\n    })\n}\n\nfunction writeShim_ (src, to, opts) {\n  opts = Object.assign({}, DEFAULT_OPTIONS, opts)\n  let shTarget = path.relative(path.dirname(to), src)\n  let target = shTarget.split('/').join('\\\\')\n  let longProg\n  let prog = opts.prog\n  let shProg = prog && prog.split('\\\\').join('/')\n  let shLongProg\n  let pwshProg = shProg && `\"${shProg}$exe\"`\n  let pwshLongProg\n  shTarget = shTarget.split('\\\\').join('/')\n  let args = opts.args || ''\n  let {\n    win32: nodePath,\n    posix: shNodePath\n  } = normalizePathEnvVar(opts.nodePath)\n  if (!prog) {\n    prog = `\"%~dp0\\\\${target}\"`\n    shProg = `\"$basedir/${shTarget}\"`\n    pwshProg = shProg\n    args = ''\n    target = ''\n    shTarget = ''\n  } else {\n    longProg = `\"%~dp0\\\\${prog}.exe\"`\n    shLongProg = '\"$basedir/' + prog + '\"'\n    pwshLongProg = `\"$basedir/${prog}$exe\"`\n    target = `\"%~dp0\\\\${target}\"`\n    shTarget = `\"$basedir/${shTarget}\"`\n  }\n\n  let cmd\n  if (opts.createCmdFile) {\n    // @IF EXIST \"%~dp0\\node.exe\" (\n    //   \"%~dp0\\node.exe\" \"%~dp0\\.\\node_modules\\npm\\bin\\npm-cli.js\" %*\n    // ) ELSE (\n    //   SETLOCAL\n    //   SET PATHEXT=%PATHEXT:;.JS;=;%\n    //   node \"%~dp0\\.\\node_modules\\npm\\bin\\npm-cli.js\" %*\n    // )\n    cmd = nodePath ? `@SET NODE_PATH=${nodePath}\\r\\n` : ''\n    if (longProg) {\n      cmd += '@IF EXIST ' + longProg + ' (\\r\\n' +\n        '  ' + longProg + ' ' + args + ' ' + target + ' %*\\r\\n' +\n        ') ELSE (\\r\\n' +\n        '  @SETLOCAL\\r\\n' +\n        '  @SET PATHEXT=%PATHEXT:;.JS;=;%\\r\\n' +\n        '  ' + prog + ' ' + args + ' ' + target + ' %*\\r\\n' +\n        ')'\n    } else {\n      cmd += `@${prog} ${args} ${target} %*\\r\\n`\n    }\n  }\n\n  // #!/bin/sh\n  // basedir=`dirname \"$0\"`\n  //\n  // case `uname` in\n  //     *CYGWIN*) basedir=`cygpath -w \"$basedir\"`;;\n  // esac\n  //\n  // if [ -x \"$basedir/node.exe\" ]; then\n  //   \"$basedir/node.exe\" \"$basedir/node_modules/npm/bin/npm-cli.js\" \"$@\"\n  //   ret=$?\n  // else\n  //   node \"$basedir/node_modules/npm/bin/npm-cli.js\" \"$@\"\n  //   ret=$?\n  // fi\n  // exit $ret\n\n  let sh = '#!/bin/sh\\n'\n  sh = sh +\n    \"basedir=$(dirname \\\"$(echo \\\"$0\\\" | sed -e 's,\\\\\\\\,/,g')\\\")\\n\" +\n    '\\n' +\n    'case `uname` in\\n' +\n    '    *CYGWIN*) basedir=`cygpath -w \"$basedir\"`;;\\n' +\n    'esac\\n' +\n    '\\n'\n  const env = opts.nodePath ? `NODE_PATH=\"${shNodePath}\" ` : ''\n\n  if (shLongProg) {\n    sh = sh +\n      'if [ -x ' + shLongProg + ' ]; then\\n' +\n      '  ' + env + shLongProg + ' ' + args + ' ' + shTarget + ' \"$@\"\\n' +\n      '  ret=$?\\n' +\n      'else \\n' +\n      '  ' + env + shProg + ' ' + args + ' ' + shTarget + ' \"$@\"\\n' +\n      '  ret=$?\\n' +\n      'fi\\n' +\n      'exit $ret\\n'\n  } else {\n    sh = sh + env + shProg + ' ' + args + ' ' + shTarget + ' \"$@\"\\n' +\n      'exit $?\\n'\n  }\n\n  // #!/usr/bin/env pwsh\n  // $basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\n  //\n  // $ret=0\n  // $exe = \"\"\n  // if ($PSVersionTable.PSVersion -lt \"6.0\" -or $IsWindows) {\n  //   # Fix case when both the Windows and Linux builds of Node\n  //   # are installed in the same directory\n  //   $exe = \".exe\"\n  // }\n  // if (Test-Path \"$basedir/node\") {\n  //   & \"$basedir/node$exe\" \"$basedir/node_modules/npm/bin/npm-cli.js\" $args\n  //   $ret=$LASTEXITCODE\n  // } else {\n  //   & \"node$exe\" \"$basedir/node_modules/npm/bin/npm-cli.js\" $args\n  //   $ret=$LASTEXITCODE\n  // }\n  // exit $ret\n  let pwsh = '#!/usr/bin/env pwsh\\n' +\n    '$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent\\n' +\n    '\\n' +\n    '$exe=\"\"\\n' +\n    (opts.nodePath ? '$env_node_path=$env:NODE_PATH\\n' +\n      `$env:NODE_PATH=\"${nodePath}\"\\n` : '') +\n    'if ($PSVersionTable.PSVersion -lt \"6.0\" -or $IsWindows) {\\n' +\n    '  # Fix case when both the Windows and Linux builds of Node\\n' +\n    '  # are installed in the same directory\\n' +\n    '  $exe=\".exe\"\\n' +\n    '}'\n  if (opts.nodePath) {\n    pwsh = pwsh +\n      ' else {\\n' +\n      `  $env:NODE_PATH=\"${shNodePath}\"\\n` +\n      '}'\n  }\n  pwsh += '\\n'\n  if (shLongProg) {\n    pwsh = pwsh +\n      '$ret=0\\n' +\n      `if (Test-Path ${pwshLongProg}) {\\n` +\n      `  & ${pwshLongProg} ${args} ${shTarget} $args\\n` +\n      '  $ret=$LASTEXITCODE\\n' +\n      '} else {\\n' +\n      `  & ${pwshProg} ${args} ${shTarget} $args\\n` +\n      '  $ret=$LASTEXITCODE\\n' +\n      '}\\n' +\n      (opts.nodePath ? '$env:NODE_PATH=$env_node_path\\n' : '') +\n      'exit $ret\\n'\n  } else {\n    pwsh = pwsh +\n      `& ${pwshProg} ${args} ${shTarget} $args\\n` +\n      (opts.nodePath ? '$env:NODE_PATH=$env_node_path\\n' : '') +\n      'exit $LASTEXITCODE\\n'\n  }\n\n  return Promise.all([\n    opts.createCmdFile && fs.writeFile(to + '.cmd', cmd, 'utf8'),\n    opts.createPwshFile && fs.writeFile(`${to}.ps1`, pwsh, 'utf8'),\n    fs.writeFile(to, sh, 'utf8')\n  ])\n    .then(() => chmodShim(to, opts))\n}\n\nfunction chmodShim (to, {createCmdFile, createPwshFile}) {\n  return Promise.all([\n    fs.chmod(to, 0o755),\n    createPwshFile && fs.chmod(`${to}.ps1`, 0o755),\n    createCmdFile && fs.chmod(`${to}.cmd`, 0o755)\n  ])\n}\n\n/**\n * @param {string|string[]} nodePath\n * @returns {{win32:string,posix:string}}\n */\nfunction normalizePathEnvVar (nodePath) {\n  if (!nodePath) {\n    return {\n      win32: nodePath,\n      posix: nodePath\n    }\n  }\n  let split = (typeof nodePath === 'string' ? nodePath.split(path.delimiter) : Array.from(nodePath))\n  let result = {}\n  for (let i = 0; i < split.length; i++) {\n    const win32 = split[i].split('/').join('\\\\')\n    const posix = isWindows() ? split[i].split('\\\\').join('/').replace(/^([^:\\\\/]*):/, (_, $1) => `/mnt/${$1.toLowerCase()}`) : split[i]\n\n    result.win32 = result.win32 ? `${result.win32};${win32}` : win32\n    result.posix = result.posix ? `${result.posix}:${posix}` : posix\n\n    result[i] = {win32, posix}\n  }\n  return result\n}\n\n\n/***/ }),\n/* 203 */\n/***/ (function(module, exports) {\n\n// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\n\nmodule.exports = {\n\n  newInvalidAsn1Error: function (msg) {\n    var e = new Error();\n    e.name = 'InvalidAsn1Error';\n    e.message = msg || '';\n    return e;\n  }\n\n};\n\n\n/***/ }),\n/* 204 */\n/***/ (function(module, exports) {\n\n// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\n\nmodule.exports = {\n  EOC: 0,\n  Boolean: 1,\n  Integer: 2,\n  BitString: 3,\n  OctetString: 4,\n  Null: 5,\n  OID: 6,\n  ObjectDescriptor: 7,\n  External: 8,\n  Real: 9, // float\n  Enumeration: 10,\n  PDV: 11,\n  Utf8String: 12,\n  RelativeOID: 13,\n  Sequence: 16,\n  Set: 17,\n  NumericString: 18,\n  PrintableString: 19,\n  T61String: 20,\n  VideotexString: 21,\n  IA5String: 22,\n  UTCTime: 23,\n  GeneralizedTime: 24,\n  GraphicString: 25,\n  VisibleString: 26,\n  GeneralString: 28,\n  UniversalString: 29,\n  CharacterString: 30,\n  BMPString: 31,\n  Constructor: 32,\n  Context: 128\n};\n\n\n/***/ }),\n/* 205 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getOutdated = exports.run = exports.requireLockfile = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    let addArgs = [];\n    const upgradeAll = args.length === 0 && typeof flags.scope === 'undefined' && typeof flags.pattern === 'undefined';\n    const addFlags = Object.assign({}, flags, {\n      force: true,\n      ignoreWorkspaceRootCheck: true,\n      workspaceRootIsCwd: config.cwd === config.lockfileFolder\n    });\n    const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.lockfileFolder, reporter);\n    const deps = yield getOutdated(config, reporter, flags, lockfile, args);\n    const install = new (_install || _load_install()).Install(flags, config, reporter, lockfile);\n\n    var _ref2 = yield install.fetchRequestFromCwd();\n\n    const packagePatterns = _ref2.requests;\n\n\n    setUserRequestedPackageVersions(deps, args, flags.latest, packagePatterns, reporter);\n    cleanLockfile(lockfile, deps, packagePatterns, reporter);\n    addArgs = deps.map(function (dep) {\n      return dep.upgradeTo;\n    });\n\n    if (flags.scope && validScopeRegex.test(flags.scope)) {\n      addArgs = addArgs.filter(function (depName) {\n        return depName.startsWith(flags.scope);\n      });\n    }\n\n    const add = new (_add || _load_add()).Add(addArgs, addFlags, config, reporter, upgradeAll ? new (_lockfile || _load_lockfile()).default() : lockfile);\n    yield add.init();\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet getOutdated = exports.getOutdated = (() => {\n  var _ref3 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, lockfile, patterns) {\n    const install = new (_install || _load_install()).Install(flags, config, reporter, lockfile);\n    const outdatedFieldName = flags.latest ? 'latest' : 'wanted';\n\n    // ensure scope is of the form `@scope/`\n    const normalizeScope = function normalizeScope() {\n      if (flags.scope) {\n        if (!flags.scope.startsWith('@')) {\n          flags.scope = '@' + flags.scope;\n        }\n\n        if (!flags.scope.endsWith('/')) {\n          flags.scope += '/';\n        }\n      }\n    };\n\n    const versionFilter = function versionFilter(dep) {\n      return dep.current !== dep[outdatedFieldName];\n    };\n\n    if (!flags.latest) {\n      // these flags only have an affect when --latest is used\n      flags.tilde = false;\n      flags.exact = false;\n      flags.caret = false;\n    }\n\n    normalizeScope();\n\n    const deps = (yield (_packageRequest || _load_packageRequest()).default.getOutdatedPackages(lockfile, install, config, reporter, patterns, flags)).filter(versionFilter).filter(scopeFilter.bind(this, flags));\n    deps.forEach(function (dep) {\n      dep.upgradeTo = buildPatternToUpgradeTo(dep, flags);\n      reporter.verbose(reporter.lang('verboseUpgradeBecauseOutdated', dep.name, dep.upgradeTo));\n    });\n\n    return deps;\n  });\n\n  return function getOutdated(_x5, _x6, _x7, _x8, _x9) {\n    return _ref3.apply(this, arguments);\n  };\n})();\n\nexports.cleanLockfile = cleanLockfile;\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _add;\n\nfunction _load_add() {\n  return _add = __webpack_require__(165);\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _packageRequest;\n\nfunction _load_packageRequest() {\n  return _packageRequest = _interopRequireDefault(__webpack_require__(123));\n}\n\nvar _normalizePattern;\n\nfunction _load_normalizePattern() {\n  return _normalizePattern = __webpack_require__(37);\n}\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// used to detect whether a semver range is simple enough to preserve when doing a --latest upgrade.\n// when not matched, the upgraded version range will default to `^` the same as the `add` command would.\nconst basicSemverOperatorRegex = new RegExp('^(\\\\^|~|>=|<=)?[^ |&,]+$');\n\n// used to detect if a passed parameter is a scope or a package name.\n\n\nconst validScopeRegex = /^@[a-zA-Z0-9-][a-zA-Z0-9_.-]*\\/$/;\n\n// If specific versions were requested for packages, override what getOutdated reported as the latest to install\n// Also add ones that are missing, since the requested packages may not have been outdated at all.\nfunction setUserRequestedPackageVersions(deps, args, latest, packagePatterns, reporter) {\n  args.forEach(requestedPattern => {\n    let found = false;\n    let normalized = (0, (_normalizePattern || _load_normalizePattern()).normalizePattern)(requestedPattern);\n\n    // if the user specified a package name without a version range, then that implies \"latest\"\n    // but if the latest flag is not passed then we need to use the version range from package.json\n    if (!normalized.hasVersion && !latest) {\n      packagePatterns.forEach(packagePattern => {\n        const packageNormalized = (0, (_normalizePattern || _load_normalizePattern()).normalizePattern)(packagePattern.pattern);\n        if (packageNormalized.name === normalized.name) {\n          normalized = packageNormalized;\n        }\n      });\n    }\n\n    const newPattern = `${normalized.name}@${normalized.range}`;\n\n    // if this dependency is already in the outdated list,\n    // just update the upgradeTo to whatever version the user requested.\n    deps.forEach(dep => {\n      if (normalized.hasVersion && dep.name === normalized.name) {\n        found = true;\n        dep.upgradeTo = newPattern;\n        reporter.verbose(reporter.lang('verboseUpgradeBecauseRequested', requestedPattern, newPattern));\n      }\n    });\n\n    // if this dependency was not in the outdated list,\n    // then add a new entry\n    if (normalized.hasVersion && !found) {\n      deps.push({\n        name: normalized.name,\n        wanted: '',\n        latest: '',\n        url: '',\n        hint: '',\n        range: '',\n        current: '',\n        upgradeTo: newPattern,\n        workspaceName: '',\n        workspaceLoc: ''\n      });\n      reporter.verbose(reporter.lang('verboseUpgradeBecauseRequested', requestedPattern, newPattern));\n    }\n  });\n}\n\n// this function attempts to determine the range operator on the semver range.\n// this will only handle the simple cases of a semver starting with '^', '~', '>=', '<=', or an exact version.\n// \"exotic\" semver ranges will not be handled.\nfunction getRangeOperator(version) {\n  const result = basicSemverOperatorRegex.exec(version);\n  return result ? result[1] || '' : '^';\n}\n\n// Attempt to preserve the range operator from the package.json specified semver range.\n// If an explicit operator was specified using --exact, --tilde, --caret, then that will take precedence.\nfunction buildPatternToUpgradeTo(dep, flags) {\n  if (dep.latest === 'exotic') {\n    return `${dep.name}@${dep.url}`;\n  }\n\n  const toLatest = flags.latest;\n  const toVersion = toLatest ? dep.latest : dep.range;\n  let rangeOperator = '';\n\n  if (toLatest) {\n    if (flags.caret) {\n      rangeOperator = '^';\n    } else if (flags.tilde) {\n      rangeOperator = '~';\n    } else if (flags.exact) {\n      rangeOperator = '';\n    } else {\n      rangeOperator = getRangeOperator(dep.range);\n    }\n  }\n\n  return `${dep.name}@${rangeOperator}${toVersion}`;\n}\n\nfunction scopeFilter(flags, dep) {\n  if (validScopeRegex.test(flags.scope)) {\n    return dep.name.startsWith(flags.scope);\n  }\n  return true;\n}\n\n// Remove deps being upgraded from the lockfile, or else Add will use the already-installed version\n// instead of the latest for the range.\n// We do this recursively so that when Yarn installs the potentially updated transitive deps,\n// it may upgrade them too instead of just using the \"locked\" version from the lockfile.\n// Transitive dependencies that are also a direct dependency are skipped.\nfunction cleanLockfile(lockfile, deps, packagePatterns, reporter) {\n  function cleanDepFromLockfile(pattern, depth) {\n    const lockManifest = lockfile.getLocked(pattern);\n    if (!lockManifest || depth > 1 && packagePatterns.some(packagePattern => packagePattern.pattern === pattern)) {\n      reporter.verbose(reporter.lang('verboseUpgradeNotUnlocking', pattern));\n      return;\n    }\n\n    const dependencies = Object.assign({}, lockManifest.dependencies || {}, lockManifest.optionalDependencies || {});\n    const depPatterns = Object.keys(dependencies).map(key => `${key}@${dependencies[key]}`);\n    reporter.verbose(reporter.lang('verboseUpgradeUnlocking', pattern));\n    lockfile.removePattern(pattern);\n    depPatterns.forEach(pattern => cleanDepFromLockfile(pattern, depth + 1));\n  }\n\n  const patterns = deps.map(dep => dep.upgradeTo);\n  patterns.forEach(pattern => cleanDepFromLockfile(pattern, 1));\n}\n\nfunction setFlags(commander) {\n  commander.description('Upgrades packages to their latest version based on the specified range.');\n  commander.usage('upgrade [flags]');\n  commander.option('-S, --scope <scope>', 'upgrade packages under the specified scope');\n  commander.option('-L, --latest', 'list the latest version of packages, ignoring version ranges in package.json');\n  commander.option('-E, --exact', 'install exact version. Only used when --latest is specified.');\n  commander.option('-P, --pattern [pattern]', 'upgrade packages that match pattern');\n  commander.option('-T, --tilde', 'install most recent release with the same minor version. Only used when --latest is specified.');\n  commander.option('-C, --caret', 'install most recent release with the same major version. Only used when --latest is specified.');\n  commander.option('-A, --audit', 'Run vulnerability audit on installed packages');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\nconst requireLockfile = exports.requireLockfile = true;\n\n/***/ }),\n/* 206 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.integrityErrors = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nvar _packageNameUtils;\n\nfunction _load_packageNameUtils() {\n  return _packageNameUtils = __webpack_require__(220);\n}\n\nvar _workspaceLayout;\n\nfunction _load_workspaceLayout() {\n  return _workspaceLayout = _interopRequireDefault(__webpack_require__(90));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nconst path = __webpack_require__(0);\n\nconst integrityErrors = exports.integrityErrors = {\n  EXPECTED_IS_NOT_A_JSON: 'integrityFailedExpectedIsNotAJSON',\n  FILES_MISSING: 'integrityFailedFilesMissing',\n  LOCKFILE_DONT_MATCH: 'integrityLockfilesDontMatch',\n  FLAGS_DONT_MATCH: 'integrityFlagsDontMatch',\n  LINKED_MODULES_DONT_MATCH: 'integrityCheckLinkedModulesDontMatch',\n  PATTERNS_DONT_MATCH: 'integrityPatternsDontMatch',\n  MODULES_FOLDERS_MISSING: 'integrityModulesFoldersMissing',\n  SYSTEM_PARAMS_DONT_MATCH: 'integritySystemParamsDontMatch'\n};\n\nconst INTEGRITY_FILE_DEFAULTS = () => ({\n  systemParams: (0, (_packageNameUtils || _load_packageNameUtils()).getSystemParams)(),\n  modulesFolders: [],\n  flags: [],\n  linkedModules: [],\n  topLevelPatterns: [],\n  lockfileEntries: {},\n  files: []\n});\n\n/**\n *\n */\nclass InstallationIntegrityChecker {\n  constructor(config) {\n    this.config = config;\n  }\n\n  /**\n   * Get the common ancestor of every node_modules - it may be a node_modules directory itself, but isn't required to.\n   */\n\n  _getModulesRootFolder() {\n    if (this.config.modulesFolder) {\n      return this.config.modulesFolder;\n    } else if (this.config.workspaceRootFolder) {\n      return this.config.workspaceRootFolder;\n    } else {\n      return path.join(this.config.lockfileFolder, (_constants || _load_constants()).NODE_MODULES_FOLDER);\n    }\n  }\n\n  /**\n   * Get the directory in which the yarn-integrity file should be written.\n   */\n\n  _getIntegrityFileFolder() {\n    if (this.config.modulesFolder) {\n      return this.config.modulesFolder;\n    } else if (this.config.enableMetaFolder) {\n      return path.join(this.config.lockfileFolder, (_constants || _load_constants()).META_FOLDER);\n    } else {\n      return path.join(this.config.lockfileFolder, (_constants || _load_constants()).NODE_MODULES_FOLDER);\n    }\n  }\n\n  /**\n   * Get the full path of the yarn-integrity file.\n   */\n\n  _getIntegrityFileLocation() {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const locationFolder = _this._getIntegrityFileFolder();\n      const locationPath = path.join(locationFolder, (_constants || _load_constants()).INTEGRITY_FILENAME);\n\n      const exists = yield (_fs || _load_fs()).exists(locationPath);\n\n      return {\n        locationFolder,\n        locationPath,\n        exists\n      };\n    })();\n  }\n\n  /**\n   * Get the list of the directories that contain our modules (there might be multiple such folders b/c of workspaces).\n   */\n\n  _getModulesFolders({ workspaceLayout } = {}) {\n    const locations = [];\n\n    if (this.config.modulesFolder) {\n      locations.push(this.config.modulesFolder);\n    } else {\n      locations.push(path.join(this.config.lockfileFolder, (_constants || _load_constants()).NODE_MODULES_FOLDER));\n    }\n\n    if (workspaceLayout) {\n      for (var _iterator = Object.keys(workspaceLayout.workspaces), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref = _i.value;\n        }\n\n        const workspaceName = _ref;\n\n        const loc = workspaceLayout.workspaces[workspaceName].loc;\n\n        if (loc) {\n          locations.push(path.join(loc, (_constants || _load_constants()).NODE_MODULES_FOLDER));\n        }\n      }\n    }\n\n    return locations.sort((_misc || _load_misc()).sortAlpha);\n  }\n\n  /**\n   * Get a list of the files that are located inside our module folders.\n   */\n  _getIntegrityListing({ workspaceLayout } = {}) {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const files = [];\n\n      const recurse = (() => {\n        var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (dir) {\n          for (var _iterator2 = yield (_fs || _load_fs()).readdir(dir), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n            var _ref3;\n\n            if (_isArray2) {\n              if (_i2 >= _iterator2.length) break;\n              _ref3 = _iterator2[_i2++];\n            } else {\n              _i2 = _iterator2.next();\n              if (_i2.done) break;\n              _ref3 = _i2.value;\n            }\n\n            const file = _ref3;\n\n            const entry = path.join(dir, file);\n            const stat = yield (_fs || _load_fs()).lstat(entry);\n\n            if (stat.isDirectory()) {\n              yield recurse(entry);\n            } else {\n              files.push(entry);\n            }\n          }\n        });\n\n        return function recurse(_x) {\n          return _ref2.apply(this, arguments);\n        };\n      })();\n\n      for (var _iterator3 = _this2._getModulesFolders({ workspaceLayout }), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n        var _ref4;\n\n        if (_isArray3) {\n          if (_i3 >= _iterator3.length) break;\n          _ref4 = _iterator3[_i3++];\n        } else {\n          _i3 = _iterator3.next();\n          if (_i3.done) break;\n          _ref4 = _i3.value;\n        }\n\n        const modulesFolder = _ref4;\n\n        if (yield (_fs || _load_fs()).exists(modulesFolder)) {\n          yield recurse(modulesFolder);\n        }\n      }\n\n      return files;\n    })();\n  }\n\n  /**\n   * Generate integrity hash of input lockfile.\n   */\n\n  _generateIntegrityFile(lockfile, patterns, flags, workspaceLayout, artifacts) {\n    var _this3 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const result = (0, (_extends2 || _load_extends()).default)({}, INTEGRITY_FILE_DEFAULTS(), {\n        artifacts\n      });\n\n      result.topLevelPatterns = patterns;\n\n      // If using workspaces, we also need to add the workspaces patterns to the top-level, so that we'll know if a\n      // dependency is added or removed into one of them. We must take care not to read the aggregator (if !loc).\n      //\n      // Also note that we can't use of workspaceLayout.workspaces[].manifest._reference.patterns, because when\n      // doing a \"yarn check\", the _reference property hasn't yet been properly initialized.\n\n      if (workspaceLayout) {\n        result.topLevelPatterns = result.topLevelPatterns.filter(function (p) {\n          // $FlowFixMe\n          return !workspaceLayout.getManifestByPattern(p);\n        });\n\n        for (var _iterator4 = Object.keys(workspaceLayout.workspaces), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n          var _ref5;\n\n          if (_isArray4) {\n            if (_i4 >= _iterator4.length) break;\n            _ref5 = _iterator4[_i4++];\n          } else {\n            _i4 = _iterator4.next();\n            if (_i4.done) break;\n            _ref5 = _i4.value;\n          }\n\n          const name = _ref5;\n\n          if (!workspaceLayout.workspaces[name].loc) {\n            continue;\n          }\n\n          const manifest = workspaceLayout.workspaces[name].manifest;\n\n          if (manifest) {\n            for (var _iterator5 = (_constants || _load_constants()).DEPENDENCY_TYPES, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n              var _ref6;\n\n              if (_isArray5) {\n                if (_i5 >= _iterator5.length) break;\n                _ref6 = _iterator5[_i5++];\n              } else {\n                _i5 = _iterator5.next();\n                if (_i5.done) break;\n                _ref6 = _i5.value;\n              }\n\n              const dependencyType = _ref6;\n\n              const dependencies = manifest[dependencyType];\n\n              if (!dependencies) {\n                continue;\n              }\n\n              for (var _iterator6 = Object.keys(dependencies), _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n                var _ref7;\n\n                if (_isArray6) {\n                  if (_i6 >= _iterator6.length) break;\n                  _ref7 = _iterator6[_i6++];\n                } else {\n                  _i6 = _iterator6.next();\n                  if (_i6.done) break;\n                  _ref7 = _i6.value;\n                }\n\n                const dep = _ref7;\n\n                result.topLevelPatterns.push(`${dep}@${dependencies[dep]}`);\n              }\n            }\n          }\n        }\n      }\n\n      result.topLevelPatterns.sort((_misc || _load_misc()).sortAlpha);\n\n      if (flags.checkFiles) {\n        result.flags.push('checkFiles');\n      }\n\n      if (flags.flat) {\n        result.flags.push('flat');\n      }\n\n      if (_this3.config.ignoreScripts) {\n        result.flags.push('ignoreScripts');\n      }\n      if (_this3.config.focus) {\n        result.flags.push('focus: ' + _this3.config.focusedWorkspaceName);\n      }\n\n      if (_this3.config.production) {\n        result.flags.push('production');\n      }\n\n      if (_this3.config.plugnplayEnabled) {\n        result.flags.push('plugnplay');\n      }\n\n      const linkedModules = _this3.config.linkedModules;\n\n      if (linkedModules.length) {\n        result.linkedModules = linkedModules.sort((_misc || _load_misc()).sortAlpha);\n      }\n\n      for (var _iterator7 = Object.keys(lockfile), _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {\n        var _ref8;\n\n        if (_isArray7) {\n          if (_i7 >= _iterator7.length) break;\n          _ref8 = _iterator7[_i7++];\n        } else {\n          _i7 = _iterator7.next();\n          if (_i7.done) break;\n          _ref8 = _i7.value;\n        }\n\n        const key = _ref8;\n\n        result.lockfileEntries[key] = lockfile[key].resolved || '';\n      }\n\n      for (var _iterator8 = _this3._getModulesFolders({ workspaceLayout }), _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {\n        var _ref9;\n\n        if (_isArray8) {\n          if (_i8 >= _iterator8.length) break;\n          _ref9 = _iterator8[_i8++];\n        } else {\n          _i8 = _iterator8.next();\n          if (_i8.done) break;\n          _ref9 = _i8.value;\n        }\n\n        const modulesFolder = _ref9;\n\n        if (yield (_fs || _load_fs()).exists(modulesFolder)) {\n          result.modulesFolders.push(path.relative(_this3.config.lockfileFolder, modulesFolder));\n        }\n      }\n\n      if (flags.checkFiles) {\n        const modulesRoot = _this3._getModulesRootFolder();\n\n        result.files = (yield _this3._getIntegrityListing({ workspaceLayout })).map(function (entry) {\n          return path.relative(modulesRoot, entry);\n        }).sort((_misc || _load_misc()).sortAlpha);\n      }\n\n      return result;\n    })();\n  }\n\n  _getIntegrityFile(locationPath) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const expectedRaw = yield (_fs || _load_fs()).readFile(locationPath);\n      try {\n        return (0, (_extends2 || _load_extends()).default)({}, INTEGRITY_FILE_DEFAULTS(), JSON.parse(expectedRaw));\n      } catch (e) {\n        // ignore JSON parsing for legacy text integrity files compatibility\n      }\n      return null;\n    })();\n  }\n\n  _compareIntegrityFiles(actual, expected, checkFiles, workspaceLayout) {\n    if (!expected) {\n      return 'EXPECTED_IS_NOT_A_JSON';\n    }\n\n    if (!(0, (_misc || _load_misc()).compareSortedArrays)(actual.linkedModules, expected.linkedModules)) {\n      return 'LINKED_MODULES_DONT_MATCH';\n    }\n\n    if (actual.systemParams !== expected.systemParams) {\n      return 'SYSTEM_PARAMS_DONT_MATCH';\n    }\n\n    let relevantExpectedFlags = expected.flags.slice();\n\n    // If we run \"yarn\" after \"yarn --check-files\", we shouldn't fail the less strict validation\n    if (actual.flags.indexOf('checkFiles') === -1) {\n      relevantExpectedFlags = relevantExpectedFlags.filter(flag => flag !== 'checkFiles');\n    }\n\n    if (!(0, (_misc || _load_misc()).compareSortedArrays)(actual.flags, relevantExpectedFlags)) {\n      return 'FLAGS_DONT_MATCH';\n    }\n\n    if (!(0, (_misc || _load_misc()).compareSortedArrays)(actual.topLevelPatterns, expected.topLevelPatterns || [])) {\n      return 'PATTERNS_DONT_MATCH';\n    }\n\n    for (var _iterator9 = Object.keys(actual.lockfileEntries), _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {\n      var _ref10;\n\n      if (_isArray9) {\n        if (_i9 >= _iterator9.length) break;\n        _ref10 = _iterator9[_i9++];\n      } else {\n        _i9 = _iterator9.next();\n        if (_i9.done) break;\n        _ref10 = _i9.value;\n      }\n\n      const key = _ref10;\n\n      if (actual.lockfileEntries[key] !== expected.lockfileEntries[key]) {\n        return 'LOCKFILE_DONT_MATCH';\n      }\n    }\n\n    for (var _iterator10 = Object.keys(expected.lockfileEntries), _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) {\n      var _ref11;\n\n      if (_isArray10) {\n        if (_i10 >= _iterator10.length) break;\n        _ref11 = _iterator10[_i10++];\n      } else {\n        _i10 = _iterator10.next();\n        if (_i10.done) break;\n        _ref11 = _i10.value;\n      }\n\n      const key = _ref11;\n\n      if (actual.lockfileEntries[key] !== expected.lockfileEntries[key]) {\n        return 'LOCKFILE_DONT_MATCH';\n      }\n    }\n\n    if (checkFiles) {\n      // Early bailout if we expect more files than what we have\n      if (expected.files.length > actual.files.length) {\n        return 'FILES_MISSING';\n      }\n\n      // Since we know the \"files\" array is sorted (alphabetically), we can optimize the thing\n      // Instead of storing the files in a Set, we can just iterate both arrays at once. O(n)!\n      for (let u = 0, v = 0; u < expected.files.length; ++u) {\n        // Index that, if reached, means that we won't have enough food to match the remaining expected entries anyway\n        const max = v + (actual.files.length - v) - (expected.files.length - u) + 1;\n\n        // Skip over files that have been added (ie not present in 'expected')\n        while (v < max && actual.files[v] !== expected.files[u]) {\n          v += 1;\n        }\n\n        // If we've reached the index defined above, the file is either missing or we can early exit\n        if (v === max) {\n          return 'FILES_MISSING';\n        }\n      }\n    }\n    return 'OK';\n  }\n\n  check(patterns, lockfile, flags, workspaceLayout) {\n    var _this4 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      // check if patterns exist in lockfile\n      const missingPatterns = patterns.filter(function (p) {\n        return !lockfile[p] && (!workspaceLayout || !workspaceLayout.getManifestByPattern(p));\n      });\n\n      const loc = yield _this4._getIntegrityFileLocation();\n      if (missingPatterns.length || !loc.exists) {\n        return {\n          integrityFileMissing: !loc.exists,\n          missingPatterns\n        };\n      }\n\n      const actual = yield _this4._generateIntegrityFile(lockfile, patterns, flags, workspaceLayout);\n\n      const expected = yield _this4._getIntegrityFile(loc.locationPath);\n      let integrityMatches = _this4._compareIntegrityFiles(actual, expected, flags.checkFiles, workspaceLayout);\n\n      if (integrityMatches === 'OK') {\n        invariant(expected, \"The integrity shouldn't pass without integrity file\");\n        for (var _iterator11 = expected.modulesFolders, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) {\n          var _ref12;\n\n          if (_isArray11) {\n            if (_i11 >= _iterator11.length) break;\n            _ref12 = _iterator11[_i11++];\n          } else {\n            _i11 = _iterator11.next();\n            if (_i11.done) break;\n            _ref12 = _i11.value;\n          }\n\n          const modulesFolder = _ref12;\n\n          if (!(yield (_fs || _load_fs()).exists(path.join(_this4.config.lockfileFolder, modulesFolder)))) {\n            integrityMatches = 'MODULES_FOLDERS_MISSING';\n          }\n        }\n      }\n\n      return {\n        integrityFileMissing: false,\n        integrityMatches: integrityMatches === 'OK',\n        integrityError: integrityMatches === 'OK' ? undefined : integrityMatches,\n        missingPatterns,\n        hardRefreshRequired: integrityMatches === 'SYSTEM_PARAMS_DONT_MATCH'\n      };\n    })();\n  }\n\n  /**\n   * Get artifacts from integrity file if it exists.\n   */\n  getArtifacts() {\n    var _this5 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const loc = yield _this5._getIntegrityFileLocation();\n      if (!loc.exists) {\n        return null;\n      }\n\n      const expectedRaw = yield (_fs || _load_fs()).readFile(loc.locationPath);\n      let expected;\n      try {\n        expected = JSON.parse(expectedRaw);\n      } catch (e) {\n        // ignore JSON parsing for legacy text integrity files compatibility\n      }\n\n      return expected ? expected.artifacts : null;\n    })();\n  }\n\n  /**\n   * Write the integrity hash of the current install to disk.\n   */\n  save(patterns, lockfile, flags, workspaceLayout, artifacts) {\n    var _this6 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const integrityFile = yield _this6._generateIntegrityFile(lockfile, patterns, flags, workspaceLayout, artifacts);\n\n      const loc = yield _this6._getIntegrityFileLocation();\n      invariant(loc.locationPath, 'expected integrity hash location');\n\n      yield (_fs || _load_fs()).mkdirp(path.dirname(loc.locationPath));\n      yield (_fs || _load_fs()).writeFile(loc.locationPath, JSON.stringify(integrityFile, null, 2));\n    })();\n  }\n\n  removeIntegrityFile() {\n    var _this7 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const loc = yield _this7._getIntegrityFileLocation();\n      if (loc.exists) {\n        yield (_fs || _load_fs()).unlink(loc.locationPath);\n      }\n    })();\n  }\n}\nexports.default = InstallationIntegrityChecker;\n\n/***/ }),\n/* 207 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.testEngine = testEngine;\nexports.checkOne = checkOne;\nexports.check = check;\nexports.shouldCheck = shouldCheck;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _map;\n\nfunction _load_map() {\n  return _map = _interopRequireDefault(__webpack_require__(30));\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nvar _yarnVersion;\n\nfunction _load_yarnVersion() {\n  return _yarnVersion = __webpack_require__(105);\n}\n\nvar _semver;\n\nfunction _load_semver() {\n  return _semver = __webpack_require__(170);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst semver = __webpack_require__(22);\n\nconst VERSIONS = Object.assign({}, process.versions, {\n  yarn: (_yarnVersion || _load_yarnVersion()).version\n});\n\nfunction isValid(items, actual) {\n  let isNotWhitelist = true;\n  let isBlacklist = false;\n\n  for (var _iterator = items, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n    var _ref;\n\n    if (_isArray) {\n      if (_i >= _iterator.length) break;\n      _ref = _iterator[_i++];\n    } else {\n      _i = _iterator.next();\n      if (_i.done) break;\n      _ref = _i.value;\n    }\n\n    const item = _ref;\n\n    // blacklist\n    if (item[0] === '!') {\n      isBlacklist = true;\n\n      if (actual === item.slice(1)) {\n        return false;\n      }\n      // whitelist\n    } else {\n      isNotWhitelist = false;\n\n      if (item === actual) {\n        return true;\n      }\n    }\n  }\n\n  // npm allows blacklists and whitelists to be mixed. Blacklists with\n  // whitelisted items should be treated as whitelists.\n  return isBlacklist && isNotWhitelist;\n}\n\nconst aliases = (0, (_map || _load_map()).default)({\n  iojs: 'node' // we should probably prompt these libraries to fix this\n});\n\nconst ignore = ['npm', // we'll never satisfy this for obvious reasons\n'teleport', // a module bundler used by some modules\n'rhino', // once a target for older modules\n'cordovaDependencies', // http://bit.ly/2tkUePg\n'parcel'];\n\nfunction testEngine(name, range, versions, looseSemver) {\n  const actual = versions[name];\n  if (!actual) {\n    return false;\n  }\n\n  if (!semver.valid(actual, looseSemver)) {\n    return false;\n  }\n\n  if (semver.satisfies(actual, range, looseSemver)) {\n    return true;\n  }\n\n  if (name === 'yarn' && (0, (_semver || _load_semver()).satisfiesWithPrereleases)(actual, range, looseSemver)) {\n    return true;\n  }\n\n  if (name === 'node' && semver.gt(actual, '1.0.0', looseSemver)) {\n    // WARNING: this is a massive hack and is super gross but necessary for compatibility\n    // some modules have the `engines.node` field set to a caret version below semver major v1\n    // eg. ^0.12.0. this is problematic as we enforce engines checks and node is now on version >=1\n    // to allow this pattern we transform the node version to fake ones in the minor range 10-13\n    const major = semver.major(actual, looseSemver);\n    const fakes = [`0.10.${major}`, `0.11.${major}`, `0.12.${major}`, `0.13.${major}`];\n    for (var _iterator2 = fakes, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n      var _ref2;\n\n      if (_isArray2) {\n        if (_i2 >= _iterator2.length) break;\n        _ref2 = _iterator2[_i2++];\n      } else {\n        _i2 = _iterator2.next();\n        if (_i2.done) break;\n        _ref2 = _i2.value;\n      }\n\n      const actualFake = _ref2;\n\n      if (semver.satisfies(actualFake, range, looseSemver)) {\n        return true;\n      }\n    }\n  }\n\n  // incompatible version\n  return false;\n}\n\nfunction isValidArch(archs) {\n  return isValid(archs, process.arch);\n}\n\nfunction isValidPlatform(platforms) {\n  return isValid(platforms, process.platform);\n}\n\nfunction checkOne(info, config, ignoreEngines) {\n  let didIgnore = false;\n  let didError = false;\n  const reporter = config.reporter;\n  const human = `${info.name}@${info.version}`;\n\n  const pushError = msg => {\n    const ref = info._reference;\n\n    if (ref && ref.optional) {\n      ref.ignore = true;\n      ref.incompatible = true;\n\n      if (!didIgnore) {\n        didIgnore = true;\n      }\n    } else {\n      reporter.error(`${human}: ${msg}`);\n      didError = true;\n    }\n  };\n\n  const os = info.os,\n        cpu = info.cpu,\n        engines = info.engines;\n\n\n  if (shouldCheckPlatform(os, config.ignorePlatform) && !isValidPlatform(os)) {\n    pushError(reporter.lang('incompatibleOS', process.platform));\n  }\n\n  if (shouldCheckCpu(cpu, config.ignorePlatform) && !isValidArch(cpu)) {\n    pushError(reporter.lang('incompatibleCPU', process.arch));\n  }\n\n  if (shouldCheckEngines(engines, ignoreEngines)) {\n    for (var _iterator3 = (0, (_misc || _load_misc()).entries)(info.engines), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n      var _ref3;\n\n      if (_isArray3) {\n        if (_i3 >= _iterator3.length) break;\n        _ref3 = _iterator3[_i3++];\n      } else {\n        _i3 = _iterator3.next();\n        if (_i3.done) break;\n        _ref3 = _i3.value;\n      }\n\n      const entry = _ref3;\n\n      let name = entry[0];\n      const range = entry[1];\n\n      if (aliases[name]) {\n        name = aliases[name];\n      }\n\n      if (VERSIONS[name]) {\n        if (!testEngine(name, range, VERSIONS, config.looseSemver)) {\n          pushError(reporter.lang('incompatibleEngine', name, range, VERSIONS[name]));\n        }\n      } else if (ignore.indexOf(name) < 0) {\n        reporter.warn(`${human}: ${reporter.lang('invalidEngine', name)}`);\n      }\n    }\n  }\n\n  if (didError) {\n    throw new (_errors || _load_errors()).MessageError(reporter.lang('foundIncompatible'));\n  }\n}\n\nfunction check(infos, config, ignoreEngines) {\n  for (var _iterator4 = infos, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n    var _ref4;\n\n    if (_isArray4) {\n      if (_i4 >= _iterator4.length) break;\n      _ref4 = _iterator4[_i4++];\n    } else {\n      _i4 = _iterator4.next();\n      if (_i4.done) break;\n      _ref4 = _i4.value;\n    }\n\n    const info = _ref4;\n\n    checkOne(info, config, ignoreEngines);\n  }\n}\n\nfunction shouldCheckCpu(cpu, ignorePlatform) {\n  return !ignorePlatform && Array.isArray(cpu) && cpu.length > 0;\n}\n\nfunction shouldCheckPlatform(os, ignorePlatform) {\n  return !ignorePlatform && Array.isArray(os) && os.length > 0;\n}\n\nfunction shouldCheckEngines(engines, ignoreEngines) {\n  return !ignoreEngines && typeof engines === 'object';\n}\n\nfunction shouldCheck(manifest, options) {\n  return shouldCheckCpu(manifest.cpu, options.ignorePlatform) || shouldCheckPlatform(manifest.os, options.ignorePlatform) || shouldCheckEngines(manifest.engines, options.ignoreEngines);\n}\n\n/***/ }),\n/* 208 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fetchOneRemote = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet fetchCache = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (dest, fetcher, config, remote) {\n    // $FlowFixMe: This error doesn't make sense\n    var _ref2 = yield config.readPackageMetadata(dest);\n\n    const hash = _ref2.hash,\n          pkg = _ref2.package,\n          cacheRemote = _ref2.remote;\n\n\n    const cacheIntegrity = cacheRemote.cacheIntegrity || cacheRemote.integrity;\n    const cacheHash = cacheRemote.hash;\n\n    if (remote.integrity) {\n      if (!cacheIntegrity || !ssri.parse(cacheIntegrity).match(remote.integrity)) {\n        throw new (_errors || _load_errors()).SecurityError(config.reporter.lang('fetchBadIntegrityCache', pkg.name, cacheIntegrity, remote.integrity));\n      }\n    }\n\n    if (remote.hash) {\n      if (!cacheHash || cacheHash !== remote.hash) {\n        throw new (_errors || _load_errors()).SecurityError(config.reporter.lang('fetchBadHashCache', pkg.name, cacheHash, remote.hash));\n      }\n    }\n\n    yield fetcher.setupMirrorFromCache();\n    return {\n      package: pkg,\n      hash,\n      dest,\n      cached: true\n    };\n  });\n\n  return function fetchCache(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet fetchOneRemote = exports.fetchOneRemote = (() => {\n  var _ref3 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (remote, name, version, dest, config) {\n    // Mock metadata for symlinked dependencies\n    if (remote.type === 'link') {\n      const mockPkg = { _uid: '', name: '', version: '0.0.0' };\n      return Promise.resolve({ resolved: null, hash: '', dest, package: mockPkg, cached: false });\n    }\n\n    const Fetcher = (_index || _load_index())[remote.type];\n    if (!Fetcher) {\n      throw new (_errors || _load_errors()).MessageError(config.reporter.lang('unknownFetcherFor', remote.type));\n    }\n\n    const fetcher = new Fetcher(dest, remote, config);\n    if (yield config.isValidModuleDest(dest)) {\n      return fetchCache(dest, fetcher, config, remote);\n    }\n\n    // remove as the module may be invalid\n    yield (_fs || _load_fs()).unlink(dest);\n\n    try {\n      return yield fetcher.fetch({\n        name,\n        version\n      });\n    } catch (err) {\n      try {\n        yield (_fs || _load_fs()).unlink(dest);\n      } catch (err2) {\n        // what do?\n      }\n      throw err;\n    }\n  });\n\n  return function fetchOneRemote(_x5, _x6, _x7, _x8, _x9) {\n    return _ref3.apply(this, arguments);\n  };\n})();\n\nlet maybeFetchOne = (() => {\n  var _ref4 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (ref, config) {\n    try {\n      return yield fetchOne(ref, config);\n    } catch (err) {\n      if (ref.optional) {\n        config.reporter.error(err.message);\n        return null;\n      } else {\n        throw err;\n      }\n    }\n  });\n\n  return function maybeFetchOne(_x10, _x11) {\n    return _ref4.apply(this, arguments);\n  };\n})();\n\nexports.fetch = fetch;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = _interopRequireWildcard(__webpack_require__(520));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _promise;\n\nfunction _load_promise() {\n  return _promise = _interopRequireWildcard(__webpack_require__(51));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst ssri = __webpack_require__(65);\n\nfunction fetchOne(ref, config) {\n  const dest = config.generateModuleCachePath(ref);\n\n  return fetchOneRemote(ref.remote, ref.name, ref.version, dest, config);\n}\n\nfunction fetch(pkgs, config) {\n  const pkgsPerDest = new Map();\n  pkgs = pkgs.filter(pkg => {\n    const ref = pkg._reference;\n    if (!ref) {\n      return false;\n    }\n    const dest = config.generateModuleCachePath(ref);\n    const otherPkg = pkgsPerDest.get(dest);\n    if (otherPkg) {\n      config.reporter.warn(config.reporter.lang('multiplePackagesCantUnpackInSameDestination', ref.patterns, dest, otherPkg.patterns));\n      return false;\n    }\n    pkgsPerDest.set(dest, ref);\n    return true;\n  });\n  const tick = config.reporter.progress(pkgs.length);\n\n  return (_promise || _load_promise()).queue(pkgs, (() => {\n    var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (pkg) {\n      const ref = pkg._reference;\n      if (!ref) {\n        return pkg;\n      }\n\n      const res = yield maybeFetchOne(ref, config);\n      let newPkg;\n\n      if (res) {\n        newPkg = res.package;\n\n        // update with new remote\n        // but only if there was a hash previously as the tarball fetcher does not provide a hash.\n        if (ref.remote.hash) {\n          // if the checksum was updated, also update resolved and cache\n          if (ref.remote.hash !== res.hash && config.updateChecksums) {\n            const oldHash = ref.remote.hash;\n            if (ref.remote.resolved) {\n              ref.remote.resolved = ref.remote.resolved.replace(oldHash, res.hash);\n            }\n            ref.config.cache = Object.keys(ref.config.cache).reduce(function (cache, entry) {\n              const entryWithNewHash = entry.replace(oldHash, res.hash);\n              cache[entryWithNewHash] = ref.config.cache[entry];\n              return cache;\n            }, {});\n          }\n          ref.remote.hash = res.hash || ref.remote.hash;\n        }\n      }\n\n      if (tick) {\n        tick();\n      }\n\n      if (newPkg) {\n        newPkg._reference = ref;\n        newPkg._remote = ref.remote;\n        newPkg.name = pkg.name;\n        newPkg.fresh = pkg.fresh;\n        return newPkg;\n      }\n\n      return pkg;\n    });\n\n    return function (_x12) {\n      return _ref5.apply(this, arguments);\n    };\n  })(), config.networkConcurrency);\n}\n\n/***/ }),\n/* 209 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.linkBin = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet linkBin = exports.linkBin = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (src, dest) {\n    if (process.platform === 'win32') {\n      const unlockMutex = yield (0, (_mutex || _load_mutex()).default)(src);\n      try {\n        yield cmdShim(src, dest, { createPwshFile: false });\n      } finally {\n        unlockMutex();\n      }\n    } else {\n      yield (_fs || _load_fs()).mkdirp(path.dirname(dest));\n      yield (_fs || _load_fs()).symlink(src, dest);\n      yield (_fs || _load_fs()).chmod(dest, '755');\n    }\n  });\n\n  return function linkBin(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nvar _packageHoister;\n\nfunction _load_packageHoister() {\n  return _packageHoister = _interopRequireDefault(__webpack_require__(524));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _promise;\n\nfunction _load_promise() {\n  return _promise = _interopRequireWildcard(__webpack_require__(51));\n}\n\nvar _normalizePattern2;\n\nfunction _load_normalizePattern() {\n  return _normalizePattern2 = __webpack_require__(37);\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _mutex;\n\nfunction _load_mutex() {\n  return _mutex = _interopRequireDefault(__webpack_require__(369));\n}\n\nvar _semver;\n\nfunction _load_semver() {\n  return _semver = __webpack_require__(170);\n}\n\nvar _workspaceLayout;\n\nfunction _load_workspaceLayout() {\n  return _workspaceLayout = _interopRequireDefault(__webpack_require__(90));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nconst cmdShim = __webpack_require__(202);\nconst path = __webpack_require__(0);\nconst semver = __webpack_require__(22);\n// Concurrency for creating bin links disabled because of the issue #1961\nconst linkBinConcurrency = 1;\n\nclass PackageLinker {\n  constructor(config, resolver) {\n    this.resolver = resolver;\n    this.reporter = config.reporter;\n    this.config = config;\n    this.artifacts = {};\n    this.topLevelBinLinking = true;\n    this.unplugged = [];\n  }\n\n  setArtifacts(artifacts) {\n    this.artifacts = artifacts;\n  }\n\n  setTopLevelBinLinking(topLevelBinLinking) {\n    this.topLevelBinLinking = topLevelBinLinking;\n  }\n\n  linkSelfDependencies(pkg, pkgLoc, targetBinLoc, override = false) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      targetBinLoc = path.join(targetBinLoc, '.bin');\n      yield (_fs || _load_fs()).mkdirp(targetBinLoc);\n      targetBinLoc = yield (_fs || _load_fs()).realpath(targetBinLoc);\n      pkgLoc = yield (_fs || _load_fs()).realpath(pkgLoc);\n      for (var _iterator = (0, (_misc || _load_misc()).entries)(pkg.bin), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref3;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref3 = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref3 = _i.value;\n        }\n\n        const _ref2 = _ref3;\n        const scriptName = _ref2[0];\n        const scriptCmd = _ref2[1];\n\n        const dest = path.join(targetBinLoc, scriptName);\n        const src = path.join(pkgLoc, scriptCmd);\n        if (!(yield (_fs || _load_fs()).exists(src))) {\n          if (!override) {\n            // TODO maybe throw an error\n            continue;\n          }\n        }\n        yield linkBin(src, dest);\n      }\n    })();\n  }\n\n  linkBinDependencies(pkg, dir) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const deps = [];\n\n      const ref = pkg._reference;\n      invariant(ref, 'Package reference is missing');\n\n      const remote = pkg._remote;\n      invariant(remote, 'Package remote is missing');\n\n      // link up `bin scripts` in `dependencies`\n      for (var _iterator2 = ref.dependencies, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref4;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref4 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref4 = _i2.value;\n        }\n\n        const pattern = _ref4;\n\n        const dep = _this.resolver.getStrictResolvedPattern(pattern);\n        if (\n        // Missing locations means not installed inside node_modules\n        dep._reference && dep._reference.locations.length && dep.bin && Object.keys(dep.bin).length) {\n          const loc = yield _this.findNearestInstalledVersionOfPackage(dep, dir);\n          deps.push({ dep, loc });\n        }\n      }\n\n      // link up the `bin` scripts in bundled dependencies\n      if (pkg.bundleDependencies) {\n        for (var _iterator3 = pkg.bundleDependencies, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n          var _ref5;\n\n          if (_isArray3) {\n            if (_i3 >= _iterator3.length) break;\n            _ref5 = _iterator3[_i3++];\n          } else {\n            _i3 = _iterator3.next();\n            if (_i3.done) break;\n            _ref5 = _i3.value;\n          }\n\n          const depName = _ref5;\n\n          const locs = ref.locations.map(function (loc) {\n            return path.join(loc, _this.config.getFolder(pkg), depName);\n          });\n          try {\n            const dep = yield _this.config.readManifest(locs[0], remote.registry); //all of them should be the same\n\n            if (dep.bin && Object.keys(dep.bin).length) {\n              deps.push(...locs.map(function (loc) {\n                return { dep, loc };\n              }));\n            }\n          } catch (ex) {\n            if (ex.code !== 'ENOENT') {\n              throw ex;\n            }\n            // intentionally ignoring ENOENT error.\n            // bundledDependency either does not exist or does not contain a package.json\n          }\n        }\n      }\n\n      // no deps to link\n      if (!deps.length) {\n        return;\n      }\n\n      // write the executables\n      for (var _iterator4 = deps, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n        var _ref7;\n\n        if (_isArray4) {\n          if (_i4 >= _iterator4.length) break;\n          _ref7 = _iterator4[_i4++];\n        } else {\n          _i4 = _iterator4.next();\n          if (_i4.done) break;\n          _ref7 = _i4.value;\n        }\n\n        const _ref6 = _ref7;\n        const dep = _ref6.dep,\n              loc = _ref6.loc;\n\n        if (dep._reference && dep._reference.locations.length) {\n          invariant(!dep._reference.isPlugnplay, \"Plug'n'play packages should not be referenced here\");\n          yield _this.linkSelfDependencies(dep, loc, dir);\n        }\n      }\n    })();\n  }\n\n  //find the installation location of ref that would be used in binLoc based on node module resolution\n  findNearestInstalledVersionOfPackage(pkg, binLoc) {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const ref = pkg._reference;\n      invariant(ref, 'expected pkg reference for ' + pkg.name);\n      const moduleFolder = _this2.config.getFolder(pkg);\n      yield (_fs || _load_fs()).mkdirp(binLoc);\n      const realBinLoc = yield (_fs || _load_fs()).realpath(binLoc);\n\n      const allLocations = [...ref.locations];\n      const realLocations = yield Promise.all(ref.locations.map(function (loc) {\n        return (_fs || _load_fs()).realpath(loc);\n      }));\n      realLocations.forEach(function (loc) {\n        return allLocations.indexOf(loc) !== -1 || allLocations.push(loc);\n      });\n\n      const locationBinLocPairs = allLocations.map(function (loc) {\n        return [loc, binLoc];\n      });\n      if (binLoc !== realBinLoc) {\n        locationBinLocPairs.push(...allLocations.map(function (loc) {\n          return [loc, realBinLoc];\n        }));\n      }\n\n      const distancePairs = locationBinLocPairs.map(function ([loc, curBinLoc]) {\n        let distance = 0;\n        let curLoc = curBinLoc;\n        let notFound = false;\n\n        while (path.join(curLoc, ref.name) !== loc && path.join(curLoc, moduleFolder, ref.name) !== loc) {\n          const next = path.dirname(curLoc);\n          if (curLoc === next) {\n            notFound = true;\n            break;\n          }\n\n          distance++;\n          curLoc = next;\n        }\n        return notFound ? null : [loc, distance];\n      });\n\n      //remove items where path was not found\n      const filteredDistancePairs = distancePairs.filter(function (d) {\n        return d;\n      });\n      filteredDistancePairs;\n\n      invariant(filteredDistancePairs.length > 0, `could not find a copy of ${pkg.name} to link in ${binLoc}`);\n\n      //get smallest distance from package location\n      const minItem = filteredDistancePairs.reduce(function (min, cur) {\n        return cur[1] < min[1] ? cur : min;\n      });\n\n      invariant(minItem[1] >= 0, 'could not find a target for bin dir of ' + minItem.toString());\n      return minItem[0];\n    })();\n  }\n\n  getFlatHoistedTree(patterns, workspaceLayout, { ignoreOptional } = {}) {\n    const hoister = new (_packageHoister || _load_packageHoister()).default(this.config, this.resolver, { ignoreOptional, workspaceLayout });\n    hoister.seed(patterns);\n    if (this.config.focus) {\n      hoister.markShallowWorkspaceEntries();\n    }\n    return hoister.init();\n  }\n\n  copyModules(patterns, workspaceLayout, { linkDuplicates, ignoreOptional } = {}) {\n    var _this3 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      let flatTree = _this3.getFlatHoistedTree(patterns, workspaceLayout, { ignoreOptional });\n      // sorted tree makes file creation and copying not to interfere with each other\n      flatTree = flatTree.sort(function (dep1, dep2) {\n        return dep1[0].localeCompare(dep2[0]);\n      });\n\n      // list of artifacts in modules to remove from extraneous removal\n      const artifactFiles = [];\n\n      const copyQueue = new Map();\n      const hardlinkQueue = new Map();\n      const hardlinksEnabled = linkDuplicates && (yield (_fs || _load_fs()).hardlinksWork(_this3.config.cwd));\n\n      const copiedSrcs = new Map();\n      const symlinkPaths = new Map();\n      for (var _iterator5 = flatTree, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n        var _ref9;\n\n        if (_isArray5) {\n          if (_i5 >= _iterator5.length) break;\n          _ref9 = _iterator5[_i5++];\n        } else {\n          _i5 = _iterator5.next();\n          if (_i5.done) break;\n          _ref9 = _i5.value;\n        }\n\n        const _ref8 = _ref9;\n        const folder = _ref8[0];\n        var _ref8$ = _ref8[1];\n        const pkg = _ref8$.pkg;\n        const loc = _ref8$.loc;\n        const isShallow = _ref8$.isShallow;\n\n        const remote = pkg._remote || { type: '' };\n        const ref = pkg._reference;\n        let dest = folder;\n        invariant(ref, 'expected package reference');\n\n        let src = loc;\n        let type = '';\n        if (remote.type === 'link') {\n          // replace package source from incorrect cache location (workspaces and link: are not cached)\n          // with a symlink source\n          src = remote.reference;\n          type = 'symlink';\n        } else if (workspaceLayout && remote.type === 'workspace' && !isShallow) {\n          src = remote.reference;\n          type = 'symlink';\n          // to get real path for non hoisted dependencies\n          symlinkPaths.set(dest, src);\n        } else {\n          // backwards compatibility: get build artifacts from metadata\n          // does not apply to symlinked dependencies\n          const metadata = yield _this3.config.readPackageMetadata(src);\n          for (var _iterator15 = metadata.artifacts, _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) {\n            var _ref23;\n\n            if (_isArray15) {\n              if (_i15 >= _iterator15.length) break;\n              _ref23 = _iterator15[_i15++];\n            } else {\n              _i15 = _iterator15.next();\n              if (_i15.done) break;\n              _ref23 = _i15.value;\n            }\n\n            const file = _ref23;\n\n            artifactFiles.push(path.join(dest, file));\n          }\n        }\n\n        for (var _iterator16 = symlinkPaths.entries(), _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator]();;) {\n          var _ref25;\n\n          if (_isArray16) {\n            if (_i16 >= _iterator16.length) break;\n            _ref25 = _iterator16[_i16++];\n          } else {\n            _i16 = _iterator16.next();\n            if (_i16.done) break;\n            _ref25 = _i16.value;\n          }\n\n          const _ref24 = _ref25;\n          const symlink = _ref24[0];\n          const realpath = _ref24[1];\n\n          if (dest.indexOf(symlink + path.sep) === 0) {\n            // after hoisting we end up with this structure\n            // root/node_modules/workspace-package(symlink)/node_modules/package-a\n            // fs.copy operations can't copy files through a symlink, so all the paths under workspace-package\n            // need to be replaced with a real path, except for the symlink root/node_modules/workspace-package\n            dest = dest.replace(symlink, realpath);\n          }\n        }\n\n        if (_this3.config.plugnplayEnabled) {\n          ref.isPlugnplay = true;\n          if (yield _this3._isUnplugged(pkg, ref)) {\n            dest = _this3.config.generatePackageUnpluggedPath(ref);\n\n            // We don't skip the copy if the unplugged package isn't materialized yet\n            if (yield (_fs || _load_fs()).exists(dest)) {\n              ref.addLocation(dest);\n              continue;\n            }\n          } else {\n            ref.addLocation(src);\n            continue;\n          }\n        }\n\n        ref.addLocation(dest);\n\n        const integrityArtifacts = _this3.artifacts[`${pkg.name}@${pkg.version}`];\n        if (integrityArtifacts) {\n          for (var _iterator17 = integrityArtifacts, _isArray17 = Array.isArray(_iterator17), _i17 = 0, _iterator17 = _isArray17 ? _iterator17 : _iterator17[Symbol.iterator]();;) {\n            var _ref26;\n\n            if (_isArray17) {\n              if (_i17 >= _iterator17.length) break;\n              _ref26 = _iterator17[_i17++];\n            } else {\n              _i17 = _iterator17.next();\n              if (_i17.done) break;\n              _ref26 = _i17.value;\n            }\n\n            const file = _ref26;\n\n            artifactFiles.push(path.join(dest, file));\n          }\n        }\n\n        const copiedDest = copiedSrcs.get(src);\n        if (!copiedDest) {\n          // no point to hardlink to a symlink\n          if (hardlinksEnabled && type !== 'symlink') {\n            copiedSrcs.set(src, dest);\n          }\n          copyQueue.set(dest, {\n            src,\n            dest,\n            type,\n            onFresh() {\n              if (ref) {\n                ref.setFresh(true);\n              }\n            }\n          });\n        } else {\n          hardlinkQueue.set(dest, {\n            src: copiedDest,\n            dest,\n            onFresh() {\n              if (ref) {\n                ref.setFresh(true);\n              }\n            }\n          });\n        }\n      }\n\n      const possibleExtraneous = new Set();\n      const scopedPaths = new Set();\n\n      const findExtraneousFiles = (() => {\n        var _ref10 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (basePath) {\n          for (var _iterator6 = _this3.config.registryFolders, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n            var _ref11;\n\n            if (_isArray6) {\n              if (_i6 >= _iterator6.length) break;\n              _ref11 = _iterator6[_i6++];\n            } else {\n              _i6 = _iterator6.next();\n              if (_i6.done) break;\n              _ref11 = _i6.value;\n            }\n\n            const folder = _ref11;\n\n            const loc = path.resolve(basePath, folder);\n\n            if (yield (_fs || _load_fs()).exists(loc)) {\n              const files = yield (_fs || _load_fs()).readdir(loc);\n\n              for (var _iterator7 = files, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {\n                var _ref12;\n\n                if (_isArray7) {\n                  if (_i7 >= _iterator7.length) break;\n                  _ref12 = _iterator7[_i7++];\n                } else {\n                  _i7 = _iterator7.next();\n                  if (_i7.done) break;\n                  _ref12 = _i7.value;\n                }\n\n                const file = _ref12;\n\n                const filepath = path.join(loc, file);\n\n                // it's a scope, not a package\n                if (file[0] === '@') {\n                  scopedPaths.add(filepath);\n\n                  for (var _iterator8 = yield (_fs || _load_fs()).readdir(filepath), _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {\n                    var _ref13;\n\n                    if (_isArray8) {\n                      if (_i8 >= _iterator8.length) break;\n                      _ref13 = _iterator8[_i8++];\n                    } else {\n                      _i8 = _iterator8.next();\n                      if (_i8.done) break;\n                      _ref13 = _i8.value;\n                    }\n\n                    const subfile = _ref13;\n\n                    possibleExtraneous.add(path.join(filepath, subfile));\n                  }\n                } else if (file[0] === '.' && file !== '.bin') {\n                  if (!(yield (_fs || _load_fs()).lstat(filepath)).isDirectory()) {\n                    possibleExtraneous.add(filepath);\n                  }\n                } else {\n                  possibleExtraneous.add(filepath);\n                }\n              }\n            }\n          }\n        });\n\n        return function findExtraneousFiles(_x3) {\n          return _ref10.apply(this, arguments);\n        };\n      })();\n\n      yield findExtraneousFiles(_this3.config.lockfileFolder);\n      if (workspaceLayout) {\n        for (var _iterator9 = Object.keys(workspaceLayout.workspaces), _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {\n          var _ref14;\n\n          if (_isArray9) {\n            if (_i9 >= _iterator9.length) break;\n            _ref14 = _iterator9[_i9++];\n          } else {\n            _i9 = _iterator9.next();\n            if (_i9.done) break;\n            _ref14 = _i9.value;\n          }\n\n          const workspaceName = _ref14;\n\n          yield findExtraneousFiles(workspaceLayout.workspaces[workspaceName].loc);\n        }\n      }\n\n      // If an Extraneous is an entry created via \"yarn link\", we prevent it from being overwritten.\n      // Unfortunately, the only way we can know if they have been created this way is to check if they\n      // are symlinks - problem is that it then conflicts with the newly introduced \"link:\" protocol,\n      // which also creates symlinks :( a somewhat weak fix is to check if the symlink target is registered\n      // inside the linkFolder, in which case we assume it has been created via \"yarn link\". Otherwise, we\n      // assume it's a link:-managed dependency, and overwrite it as usual.\n      const linkTargets = new Map();\n\n      let linkedModules;\n      try {\n        linkedModules = yield (_fs || _load_fs()).readdir(_this3.config.linkFolder);\n      } catch (err) {\n        if (err.code === 'ENOENT') {\n          linkedModules = [];\n        } else {\n          throw err;\n        }\n      }\n\n      // TODO: Consolidate this logic with `this.config.linkedModules` logic\n      for (var _iterator10 = linkedModules, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) {\n        var _ref15;\n\n        if (_isArray10) {\n          if (_i10 >= _iterator10.length) break;\n          _ref15 = _iterator10[_i10++];\n        } else {\n          _i10 = _iterator10.next();\n          if (_i10.done) break;\n          _ref15 = _i10.value;\n        }\n\n        const entry = _ref15;\n\n        const entryPath = path.join(_this3.config.linkFolder, entry);\n        const stat = yield (_fs || _load_fs()).lstat(entryPath);\n\n        if (stat.isSymbolicLink()) {\n          try {\n            const entryTarget = yield (_fs || _load_fs()).realpath(entryPath);\n            linkTargets.set(entry, entryTarget);\n          } catch (err) {\n            _this3.reporter.warn(_this3.reporter.lang('linkTargetMissing', entry));\n            yield (_fs || _load_fs()).unlink(entryPath);\n          }\n        } else if (stat.isDirectory() && entry[0] === '@') {\n          // if the entry is directory beginning with '@', then we're dealing with a package scope, which\n          // means we must iterate inside to retrieve the package names it contains\n          const scopeName = entry;\n\n          for (var _iterator18 = yield (_fs || _load_fs()).readdir(entryPath), _isArray18 = Array.isArray(_iterator18), _i18 = 0, _iterator18 = _isArray18 ? _iterator18 : _iterator18[Symbol.iterator]();;) {\n            var _ref27;\n\n            if (_isArray18) {\n              if (_i18 >= _iterator18.length) break;\n              _ref27 = _iterator18[_i18++];\n            } else {\n              _i18 = _iterator18.next();\n              if (_i18.done) break;\n              _ref27 = _i18.value;\n            }\n\n            const entry2 = _ref27;\n\n            const entryPath2 = path.join(entryPath, entry2);\n            const stat2 = yield (_fs || _load_fs()).lstat(entryPath2);\n\n            if (stat2.isSymbolicLink()) {\n              const packageName = `${scopeName}/${entry2}`;\n              try {\n                const entryTarget = yield (_fs || _load_fs()).realpath(entryPath2);\n                linkTargets.set(packageName, entryTarget);\n              } catch (err) {\n                _this3.reporter.warn(_this3.reporter.lang('linkTargetMissing', packageName));\n                yield (_fs || _load_fs()).unlink(entryPath2);\n              }\n            }\n          }\n        }\n      }\n\n      for (var _iterator11 = possibleExtraneous, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) {\n        var _ref16;\n\n        if (_isArray11) {\n          if (_i11 >= _iterator11.length) break;\n          _ref16 = _iterator11[_i11++];\n        } else {\n          _i11 = _iterator11.next();\n          if (_i11.done) break;\n          _ref16 = _i11.value;\n        }\n\n        const loc = _ref16;\n\n        let packageName = path.basename(loc);\n        const scopeName = path.basename(path.dirname(loc));\n\n        if (scopeName[0] === `@`) {\n          packageName = `${scopeName}/${packageName}`;\n        }\n\n        if ((yield (_fs || _load_fs()).lstat(loc)).isSymbolicLink() && linkTargets.has(packageName) && linkTargets.get(packageName) === (yield (_fs || _load_fs()).realpath(loc))) {\n          possibleExtraneous.delete(loc);\n          copyQueue.delete(loc);\n        }\n      }\n\n      //\n      let tick;\n      yield (_fs || _load_fs()).copyBulk(Array.from(copyQueue.values()), _this3.reporter, {\n        possibleExtraneous,\n        artifactFiles,\n\n        ignoreBasenames: [(_constants || _load_constants()).METADATA_FILENAME, (_constants || _load_constants()).TARBALL_FILENAME, '.bin'],\n\n        onStart: function onStart(num) {\n          tick = _this3.reporter.progress(num);\n        },\n\n        onProgress(src) {\n          if (tick) {\n            tick();\n          }\n        }\n      });\n\n      yield (_fs || _load_fs()).hardlinkBulk(Array.from(hardlinkQueue.values()), _this3.reporter, {\n        possibleExtraneous,\n        artifactFiles,\n\n        onStart: function onStart(num) {\n          tick = _this3.reporter.progress(num);\n        },\n\n        onProgress(src) {\n          if (tick) {\n            tick();\n          }\n        }\n      });\n\n      // remove all extraneous files that weren't in the tree\n      for (var _iterator12 = possibleExtraneous, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) {\n        var _ref17;\n\n        if (_isArray12) {\n          if (_i12 >= _iterator12.length) break;\n          _ref17 = _iterator12[_i12++];\n        } else {\n          _i12 = _iterator12.next();\n          if (_i12.done) break;\n          _ref17 = _i12.value;\n        }\n\n        const loc = _ref17;\n\n        _this3.reporter.verbose(_this3.reporter.lang('verboseFileRemoveExtraneous', loc));\n        yield (_fs || _load_fs()).unlink(loc);\n      }\n\n      // remove any empty scoped directories\n      for (var _iterator13 = scopedPaths, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) {\n        var _ref18;\n\n        if (_isArray13) {\n          if (_i13 >= _iterator13.length) break;\n          _ref18 = _iterator13[_i13++];\n        } else {\n          _i13 = _iterator13.next();\n          if (_i13.done) break;\n          _ref18 = _i13.value;\n        }\n\n        const scopedPath = _ref18;\n\n        const files = yield (_fs || _load_fs()).readdir(scopedPath);\n        if (files.length === 0) {\n          yield (_fs || _load_fs()).unlink(scopedPath);\n        }\n      }\n\n      // create binary links\n      if (_this3.config.getOption('bin-links') && _this3.config.binLinks !== false) {\n        const topLevelDependencies = _this3.determineTopLevelBinLinkOrder(flatTree);\n        const tickBin = _this3.reporter.progress(flatTree.length + topLevelDependencies.length);\n\n        // create links in transient dependencies\n        yield (_promise || _load_promise()).queue(flatTree, (() => {\n          var _ref19 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ([dest, { pkg, isNohoist, parts }]) {\n            if (pkg._reference && pkg._reference.locations.length && !pkg._reference.isPlugnplay) {\n              const binLoc = path.join(dest, _this3.config.getFolder(pkg));\n              yield _this3.linkBinDependencies(pkg, binLoc);\n              if (isNohoist) {\n                // if nohoist, we need to override the binLink to point to the local destination\n                const parentBinLoc = _this3.getParentBinLoc(parts, flatTree);\n                yield _this3.linkSelfDependencies(pkg, dest, parentBinLoc, true);\n              }\n              tickBin();\n            }\n            tickBin();\n          });\n\n          return function (_x4) {\n            return _ref19.apply(this, arguments);\n          };\n        })(), linkBinConcurrency);\n\n        // create links at top level for all dependencies.\n        yield (_promise || _load_promise()).queue(topLevelDependencies, (() => {\n          var _ref20 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ([dest, { pkg }]) {\n            if (pkg._reference && pkg._reference.locations.length && !pkg._reference.isPlugnplay && pkg.bin && Object.keys(pkg.bin).length) {\n              let binLoc;\n              if (_this3.config.modulesFolder) {\n                binLoc = path.join(_this3.config.modulesFolder);\n              } else {\n                binLoc = path.join(_this3.config.lockfileFolder, _this3.config.getFolder(pkg));\n              }\n              yield _this3.linkSelfDependencies(pkg, dest, binLoc);\n            }\n            tickBin();\n          });\n\n          return function (_x5) {\n            return _ref20.apply(this, arguments);\n          };\n        })(), linkBinConcurrency);\n      }\n\n      for (var _iterator14 = flatTree, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) {\n        var _ref22;\n\n        if (_isArray14) {\n          if (_i14 >= _iterator14.length) break;\n          _ref22 = _iterator14[_i14++];\n        } else {\n          _i14 = _iterator14.next();\n          if (_i14.done) break;\n          _ref22 = _i14.value;\n        }\n\n        const _ref21 = _ref22;\n        const pkg = _ref21[1].pkg;\n\n        yield _this3._warnForMissingBundledDependencies(pkg);\n      }\n    })();\n  }\n\n  _buildTreeHash(flatTree) {\n    const hash = new Map();\n    for (var _iterator19 = flatTree, _isArray19 = Array.isArray(_iterator19), _i19 = 0, _iterator19 = _isArray19 ? _iterator19 : _iterator19[Symbol.iterator]();;) {\n      var _ref29;\n\n      if (_isArray19) {\n        if (_i19 >= _iterator19.length) break;\n        _ref29 = _iterator19[_i19++];\n      } else {\n        _i19 = _iterator19.next();\n        if (_i19.done) break;\n        _ref29 = _i19.value;\n      }\n\n      const _ref28 = _ref29;\n      const dest = _ref28[0];\n      const hoistManifest = _ref28[1];\n\n      const key = hoistManifest.parts.join('#');\n      hash.set(key, [dest, hoistManifest]);\n    }\n    this._treeHash = hash;\n    return hash;\n  }\n\n  getParentBinLoc(parts, flatTree) {\n    const hash = this._treeHash || this._buildTreeHash(flatTree);\n    const parent = parts.slice(0, -1).join('#');\n    const tuple = hash.get(parent);\n    if (!tuple) {\n      throw new Error(`failed to get parent '${parent}' binLoc`);\n    }\n    const dest = tuple[0],\n          hoistManifest = tuple[1];\n\n    const parentBinLoc = path.join(dest, this.config.getFolder(hoistManifest.pkg));\n\n    return parentBinLoc;\n  }\n\n  determineTopLevelBinLinkOrder(flatTree) {\n    const linksToCreate = new Map();\n    for (var _iterator20 = flatTree, _isArray20 = Array.isArray(_iterator20), _i20 = 0, _iterator20 = _isArray20 ? _iterator20 : _iterator20[Symbol.iterator]();;) {\n      var _ref31;\n\n      if (_isArray20) {\n        if (_i20 >= _iterator20.length) break;\n        _ref31 = _iterator20[_i20++];\n      } else {\n        _i20 = _iterator20.next();\n        if (_i20.done) break;\n        _ref31 = _i20.value;\n      }\n\n      const _ref30 = _ref31;\n      const dest = _ref30[0];\n      const hoistManifest = _ref30[1];\n      const pkg = hoistManifest.pkg,\n            isDirectRequire = hoistManifest.isDirectRequire,\n            isNohoist = hoistManifest.isNohoist,\n            isShallow = hoistManifest.isShallow;\n      const name = pkg.name;\n\n      // nohoist and shallow packages should not be linked at topLevel bin\n\n      if (!isNohoist && !isShallow && (isDirectRequire || this.topLevelBinLinking && !linksToCreate.has(name))) {\n        linksToCreate.set(name, [dest, hoistManifest]);\n      }\n    }\n\n    // Sort the array so that direct dependencies will be linked last.\n    // Bin links are overwritten if they already exist, so this will cause direct deps to take precedence.\n    // If someone finds this to be incorrect later, you could also consider sorting descending by\n    //   `linkToCreate.level` which is the dependency tree depth. Direct deps will have level 0 and transitive\n    //   deps will have level > 0.\n    const transientBins = [];\n    const topLevelBins = [];\n    for (var _iterator21 = Array.from(linksToCreate.values()), _isArray21 = Array.isArray(_iterator21), _i21 = 0, _iterator21 = _isArray21 ? _iterator21 : _iterator21[Symbol.iterator]();;) {\n      var _ref32;\n\n      if (_isArray21) {\n        if (_i21 >= _iterator21.length) break;\n        _ref32 = _iterator21[_i21++];\n      } else {\n        _i21 = _iterator21.next();\n        if (_i21.done) break;\n        _ref32 = _i21.value;\n      }\n\n      const linkToCreate = _ref32;\n\n      if (linkToCreate[1].isDirectRequire) {\n        topLevelBins.push(linkToCreate);\n      } else {\n        transientBins.push(linkToCreate);\n      }\n    }\n    return [...transientBins, ...topLevelBins];\n  }\n\n  resolvePeerModules() {\n    for (var _iterator22 = this.resolver.getManifests(), _isArray22 = Array.isArray(_iterator22), _i22 = 0, _iterator22 = _isArray22 ? _iterator22 : _iterator22[Symbol.iterator]();;) {\n      var _ref33;\n\n      if (_isArray22) {\n        if (_i22 >= _iterator22.length) break;\n        _ref33 = _iterator22[_i22++];\n      } else {\n        _i22 = _iterator22.next();\n        if (_i22.done) break;\n        _ref33 = _i22.value;\n      }\n\n      const pkg = _ref33;\n\n      const peerDeps = pkg.peerDependencies;\n      const peerDepsMeta = pkg.peerDependenciesMeta;\n\n      if (!peerDeps) {\n        continue;\n      }\n\n      const ref = pkg._reference;\n      invariant(ref, 'Package reference is missing');\n\n      // TODO: We are taking the \"shortest\" ref tree but there may be multiple ref trees with the same length\n      const refTree = ref.requests.map(req => req.parentNames).sort((arr1, arr2) => arr1.length - arr2.length)[0];\n\n      const getLevelDistance = pkgRef => {\n        let minDistance = Infinity;\n        for (var _iterator23 = pkgRef.requests, _isArray23 = Array.isArray(_iterator23), _i23 = 0, _iterator23 = _isArray23 ? _iterator23 : _iterator23[Symbol.iterator]();;) {\n          var _ref34;\n\n          if (_isArray23) {\n            if (_i23 >= _iterator23.length) break;\n            _ref34 = _iterator23[_i23++];\n          } else {\n            _i23 = _iterator23.next();\n            if (_i23.done) break;\n            _ref34 = _i23.value;\n          }\n\n          const req = _ref34;\n\n          const distance = refTree.length - req.parentNames.length;\n\n          if (distance >= 0 && distance < minDistance && req.parentNames.every((name, idx) => name === refTree[idx])) {\n            minDistance = distance;\n          }\n        }\n\n        return minDistance;\n      };\n\n      for (const peerDepName in peerDeps) {\n        const range = peerDeps[peerDepName];\n        const meta = peerDepsMeta && peerDepsMeta[peerDepName];\n\n        const isOptional = !!(meta && meta.optional);\n\n        const peerPkgs = this.resolver.getAllInfoForPackageName(peerDepName);\n\n        let peerError = 'unmetPeer';\n        let resolvedLevelDistance = Infinity;\n        let resolvedPeerPkg;\n        for (var _iterator24 = peerPkgs, _isArray24 = Array.isArray(_iterator24), _i24 = 0, _iterator24 = _isArray24 ? _iterator24 : _iterator24[Symbol.iterator]();;) {\n          var _ref35;\n\n          if (_isArray24) {\n            if (_i24 >= _iterator24.length) break;\n            _ref35 = _iterator24[_i24++];\n          } else {\n            _i24 = _iterator24.next();\n            if (_i24.done) break;\n            _ref35 = _i24.value;\n          }\n\n          const peerPkg = _ref35;\n\n          const peerPkgRef = peerPkg._reference;\n          if (!(peerPkgRef && peerPkgRef.patterns)) {\n            continue;\n          }\n          const levelDistance = getLevelDistance(peerPkgRef);\n          if (isFinite(levelDistance) && levelDistance < resolvedLevelDistance) {\n            if (this._satisfiesPeerDependency(range, peerPkgRef.version)) {\n              resolvedLevelDistance = levelDistance;\n              resolvedPeerPkg = peerPkgRef;\n            } else {\n              peerError = 'incorrectPeer';\n            }\n          }\n        }\n\n        if (resolvedPeerPkg) {\n          ref.addDependencies(resolvedPeerPkg.patterns);\n          this.reporter.verbose(this.reporter.lang('selectedPeer', `${pkg.name}@${pkg.version}`, `${peerDepName}@${resolvedPeerPkg.version}`, resolvedPeerPkg.level));\n        } else if (!isOptional) {\n          this.reporter.warn(this.reporter.lang(peerError, `${refTree.join(' > ')} > ${pkg.name}@${pkg.version}`, `${peerDepName}@${range}`));\n        }\n      }\n    }\n  }\n\n  _satisfiesPeerDependency(range, version) {\n    return range === '*' || (0, (_semver || _load_semver()).satisfiesWithPrereleases)(version, range, this.config.looseSemver);\n  }\n\n  _warnForMissingBundledDependencies(pkg) {\n    var _this4 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const ref = pkg._reference;\n      invariant(ref, 'missing package ref ' + pkg.name);\n\n      if (pkg.bundleDependencies) {\n        for (var _iterator25 = pkg.bundleDependencies, _isArray25 = Array.isArray(_iterator25), _i25 = 0, _iterator25 = _isArray25 ? _iterator25 : _iterator25[Symbol.iterator]();;) {\n          var _ref36;\n\n          if (_isArray25) {\n            if (_i25 >= _iterator25.length) break;\n            _ref36 = _iterator25[_i25++];\n          } else {\n            _i25 = _iterator25.next();\n            if (_i25.done) break;\n            _ref36 = _i25.value;\n          }\n\n          const depName = _ref36;\n\n          const locs = ref.locations.map(function (loc) {\n            return path.join(loc, _this4.config.getFolder(pkg), depName);\n          });\n          const locsExist = yield Promise.all(locs.map(function (loc) {\n            return (_fs || _load_fs()).exists(loc);\n          }));\n          if (locsExist.some(function (e) {\n            return !e;\n          })) {\n            //if any of the locs do not exist\n            const pkgHuman = `${pkg.name}@${pkg.version}`;\n            _this4.reporter.warn(_this4.reporter.lang('missingBundledDependency', pkgHuman, depName));\n          }\n        }\n      }\n    })();\n  }\n\n  _isUnplugged(pkg, ref) {\n    var _this5 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      // If an unplugged folder exists for the specified package, we simply use it\n      if (yield (_fs || _load_fs()).exists(_this5.config.generatePackageUnpluggedPath(ref))) {\n        return true;\n      }\n\n      // If the package has a postinstall script, we also unplug it (otherwise they would run into the cache)\n      if (!_this5.config.ignoreScripts && pkg.scripts && (pkg.scripts.preinstall || pkg.scripts.install || pkg.scripts.postinstall)) {\n        return true;\n      }\n\n      // Check whether the user explicitly requested for the package to be unplugged\n      return _this5.unplugged.some(function (patternToUnplug) {\n        var _normalizePattern = (0, (_normalizePattern2 || _load_normalizePattern()).normalizePattern)(patternToUnplug);\n\n        const name = _normalizePattern.name,\n              range = _normalizePattern.range,\n              hasVersion = _normalizePattern.hasVersion;\n\n        const satisfiesSemver = hasVersion ? semver.satisfies(ref.version, range) : true;\n        return name === ref.name && satisfiesSemver;\n      });\n    })();\n  }\n\n  init(patterns, workspaceLayout, { linkDuplicates, ignoreOptional } = {}) {\n    var _this6 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      _this6.resolvePeerModules();\n      yield _this6.copyModules(patterns, workspaceLayout, { linkDuplicates, ignoreOptional });\n\n      if (!_this6.config.plugnplayEnabled) {\n        yield (_fs || _load_fs()).unlink(`${_this6.config.lockfileFolder}/${(_constants || _load_constants()).PNP_FILENAME}`);\n      }\n    })();\n  }\n}\nexports.default = PackageLinker;\n\n/***/ }),\n/* 210 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.clearLine = clearLine;\nexports.toStartOfLine = toStartOfLine;\nexports.writeOnNthLine = writeOnNthLine;\nexports.clearNthLine = clearNthLine;\n\nvar _tty;\n\nfunction _load_tty() {\n  return _tty = _interopRequireDefault(__webpack_require__(104));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst readline = __webpack_require__(198);\n\nvar _require = __webpack_require__(27);\n\nconst supportsColor = _require.supportsColor;\n\n\nconst CLEAR_WHOLE_LINE = 0;\nconst CLEAR_RIGHT_OF_CURSOR = 1;\n\nfunction clearLine(stdout) {\n  if (!supportsColor) {\n    if (stdout instanceof (_tty || _load_tty()).default.WriteStream) {\n      if (stdout.columns > 0) {\n        stdout.write(`\\r${' '.repeat(stdout.columns - 1)}`);\n      }\n      stdout.write(`\\r`);\n    }\n    return;\n  }\n\n  readline.clearLine(stdout, CLEAR_WHOLE_LINE);\n  readline.cursorTo(stdout, 0);\n}\n\nfunction toStartOfLine(stdout) {\n  if (!supportsColor) {\n    stdout.write('\\r');\n    return;\n  }\n\n  readline.cursorTo(stdout, 0);\n}\n\nfunction writeOnNthLine(stdout, n, msg) {\n  if (!supportsColor) {\n    return;\n  }\n\n  if (n == 0) {\n    readline.cursorTo(stdout, 0);\n    stdout.write(msg);\n    readline.clearLine(stdout, CLEAR_RIGHT_OF_CURSOR);\n    return;\n  }\n  readline.cursorTo(stdout, 0);\n  readline.moveCursor(stdout, 0, -n);\n  stdout.write(msg);\n  readline.clearLine(stdout, CLEAR_RIGHT_OF_CURSOR);\n  readline.cursorTo(stdout, 0);\n  readline.moveCursor(stdout, 0, n);\n}\n\nfunction clearNthLine(stdout, n) {\n  if (!supportsColor) {\n    return;\n  }\n\n  if (n == 0) {\n    clearLine(stdout);\n    return;\n  }\n  readline.cursorTo(stdout, 0);\n  readline.moveCursor(stdout, 0, -n);\n  readline.clearLine(stdout, CLEAR_WHOLE_LINE);\n  readline.moveCursor(stdout, 0, n);\n}\n\n/***/ }),\n/* 211 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _baseReporter;\n\nfunction _load_baseReporter() {\n  return _baseReporter = _interopRequireDefault(__webpack_require__(108));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass JSONReporter extends (_baseReporter || _load_baseReporter()).default {\n  constructor(opts) {\n    super(opts);\n\n    this._activityId = 0;\n    this._progressId = 0;\n  }\n\n  _dump(type, data, error) {\n    let stdout = this.stdout;\n    if (error) {\n      stdout = this.stderr;\n    }\n    stdout.write(`${JSON.stringify({ type, data })}\\n`);\n  }\n\n  _verbose(msg) {\n    this._dump('verbose', msg);\n  }\n\n  list(type, items, hints) {\n    this._dump('list', { type, items, hints });\n  }\n\n  tree(type, trees) {\n    this._dump('tree', { type, trees });\n  }\n\n  step(current, total, message) {\n    this._dump('step', { message, current, total });\n  }\n\n  inspect(value) {\n    this._dump('inspect', value);\n  }\n\n  footer(showPeakMemory) {\n    this._dump('finished', this.getTotalTime());\n  }\n\n  log(msg) {\n    this._dump('log', msg);\n  }\n\n  command(msg) {\n    this._dump('command', msg);\n  }\n\n  table(head, body) {\n    this._dump('table', { head, body });\n  }\n\n  success(msg) {\n    this._dump('success', msg);\n  }\n\n  error(msg) {\n    this._dump('error', msg, true);\n  }\n\n  warn(msg) {\n    this._dump('warning', msg, true);\n  }\n\n  info(msg) {\n    this._dump('info', msg);\n  }\n\n  activitySet(total, workers) {\n    if (!this.isTTY || this.noProgress) {\n      return super.activitySet(total, workers);\n    }\n\n    const id = this._activityId++;\n    this._dump('activitySetStart', { id, total, workers });\n\n    const spinners = [];\n    for (let i = 0; i < workers; i++) {\n      let current = 0;\n      let header = '';\n\n      spinners.push({\n        clear() {},\n        setPrefix(_current, _header) {\n          current = _current;\n          header = _header;\n        },\n        tick: msg => {\n          this._dump('activitySetTick', {\n            id,\n            header,\n            current,\n            worker: i,\n            message: msg\n          });\n        },\n        end() {}\n      });\n    }\n\n    return {\n      spinners,\n      end: () => {\n        this._dump('activitySetEnd', { id });\n      }\n    };\n  }\n\n  activity() {\n    return this._activity({});\n  }\n\n  _activity(data) {\n    if (!this.isTTY || this.noProgress) {\n      return {\n        tick() {},\n        end() {}\n      };\n    }\n\n    const id = this._activityId++;\n    this._dump('activityStart', (0, (_extends2 || _load_extends()).default)({ id }, data));\n\n    return {\n      tick: name => {\n        this._dump('activityTick', { id, name });\n      },\n\n      end: () => {\n        this._dump('activityEnd', { id });\n      }\n    };\n  }\n\n  progress(total) {\n    if (this.noProgress) {\n      return function () {\n        // noop\n      };\n    }\n\n    const id = this._progressId++;\n    let current = 0;\n    this._dump('progressStart', { id, total });\n\n    return () => {\n      current++;\n      this._dump('progressTick', { id, current });\n\n      if (current === total) {\n        this._dump('progressFinish', { id });\n      }\n    };\n  }\n\n  auditAction(recommendation) {\n    this._dump('auditAction', recommendation);\n  }\n\n  auditAdvisory(resolution, auditAdvisory) {\n    this._dump('auditAdvisory', { resolution, advisory: auditAdvisory });\n  }\n\n  auditSummary(auditMetadata) {\n    this._dump('auditSummary', auditMetadata);\n  }\n}\nexports.default = JSONReporter;\n\n/***/ }),\n/* 212 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.shouldUpdateLockfile = undefined;\n\nvar _semver;\n\nfunction _load_semver() {\n  return _semver = _interopRequireDefault(__webpack_require__(22));\n}\n\nvar _minimatch;\n\nfunction _load_minimatch() {\n  return _minimatch = _interopRequireDefault(__webpack_require__(82));\n}\n\nvar _map;\n\nfunction _load_map() {\n  return _map = _interopRequireDefault(__webpack_require__(30));\n}\n\nvar _normalizePattern2;\n\nfunction _load_normalizePattern() {\n  return _normalizePattern2 = __webpack_require__(37);\n}\n\nvar _parsePackagePath;\n\nfunction _load_parsePackagePath() {\n  return _parsePackagePath = _interopRequireDefault(__webpack_require__(370));\n}\n\nvar _parsePackagePath2;\n\nfunction _load_parsePackagePath2() {\n  return _parsePackagePath2 = __webpack_require__(370);\n}\n\nvar _resolvers;\n\nfunction _load_resolvers() {\n  return _resolvers = __webpack_require__(78);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst DIRECTORY_SEPARATOR = '/';\nconst GLOBAL_NESTED_DEP_PATTERN = '**/';\n\nclass ResolutionMap {\n  constructor(config) {\n    this.resolutionsByPackage = (0, (_map || _load_map()).default)();\n    this.config = config;\n    this.reporter = config.reporter;\n    this.delayQueue = new Set();\n  }\n\n  init(resolutions = {}) {\n    for (const globPattern in resolutions) {\n      const info = this.parsePatternInfo(globPattern, resolutions[globPattern]);\n\n      if (info) {\n        const resolution = this.resolutionsByPackage[info.name] || [];\n        this.resolutionsByPackage[info.name] = [...resolution, info];\n      }\n    }\n  }\n\n  addToDelayQueue(req) {\n    this.delayQueue.add(req);\n  }\n\n  parsePatternInfo(globPattern, range) {\n    if (!(0, (_parsePackagePath2 || _load_parsePackagePath2()).isValidPackagePath)(globPattern)) {\n      this.reporter.warn(this.reporter.lang('invalidResolutionName', globPattern));\n      return null;\n    }\n\n    const directories = (0, (_parsePackagePath || _load_parsePackagePath()).default)(globPattern);\n    const name = directories.pop();\n\n    if (!(_semver || _load_semver()).default.validRange(range) && !(0, (_resolvers || _load_resolvers()).getExoticResolver)(range)) {\n      this.reporter.warn(this.reporter.lang('invalidResolutionVersion', range));\n      return null;\n    }\n\n    // For legacy support of resolutions, replace `name` with `**/name`\n    if (name === globPattern) {\n      globPattern = `${GLOBAL_NESTED_DEP_PATTERN}${name}`;\n    }\n\n    return {\n      name,\n      range,\n      globPattern,\n      pattern: `${name}@${range}`\n    };\n  }\n\n  find(reqPattern, parentNames) {\n    var _normalizePattern = (0, (_normalizePattern2 || _load_normalizePattern()).normalizePattern)(reqPattern);\n\n    const name = _normalizePattern.name,\n          reqRange = _normalizePattern.range;\n\n    const resolutions = this.resolutionsByPackage[name];\n\n    if (!resolutions) {\n      return '';\n    }\n\n    const modulePath = [...parentNames, name].join(DIRECTORY_SEPARATOR);\n\n    var _ref = resolutions.find(({ globPattern }) => (0, (_minimatch || _load_minimatch()).default)(modulePath, globPattern)) || {};\n\n    const pattern = _ref.pattern,\n          range = _ref.range;\n\n\n    if (pattern) {\n      if ((_semver || _load_semver()).default.validRange(reqRange) && (_semver || _load_semver()).default.valid(range) && !(_semver || _load_semver()).default.satisfies(range, reqRange)) {\n        this.reporter.warn(this.reporter.lang('incompatibleResolutionVersion', pattern, reqPattern));\n      }\n    }\n\n    return pattern;\n  }\n}\n\nexports.default = ResolutionMap;\nconst shouldUpdateLockfile = exports.shouldUpdateLockfile = (lockfileEntry, resolutionEntry) => {\n  if (!lockfileEntry || !resolutionEntry) {\n    return false;\n  }\n\n  return lockfileEntry.resolved !== resolutionEntry.remote.resolved;\n};\n\n/***/ }),\n/* 213 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.FILE_PROTOCOL_PREFIX = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _path;\n\nfunction _load_path() {\n  return _path = _interopRequireDefault(__webpack_require__(0));\n}\n\nvar _invariant;\n\nfunction _load_invariant() {\n  return _invariant = _interopRequireDefault(__webpack_require__(9));\n}\n\nvar _uuid;\n\nfunction _load_uuid() {\n  return _uuid = _interopRequireDefault(__webpack_require__(120));\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _exoticResolver;\n\nfunction _load_exoticResolver() {\n  return _exoticResolver = _interopRequireDefault(__webpack_require__(89));\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = _interopRequireWildcard(__webpack_require__(18));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst FILE_PROTOCOL_PREFIX = exports.FILE_PROTOCOL_PREFIX = 'file:';\n\nclass FileResolver extends (_exoticResolver || _load_exoticResolver()).default {\n  constructor(request, fragment) {\n    super(request, fragment);\n    this.loc = (_misc || _load_misc()).removePrefix(fragment, FILE_PROTOCOL_PREFIX);\n  }\n\n  static isVersion(pattern) {\n    return super.isVersion.call(this, pattern) || this.prefixMatcher.test(pattern) || (_path || _load_path()).default.isAbsolute(pattern);\n  }\n\n  resolve() {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      let loc = _this.loc;\n      if (!(_path || _load_path()).default.isAbsolute(loc)) {\n        loc = (_path || _load_path()).default.resolve(_this.config.lockfileFolder, loc);\n      }\n\n      if (_this.config.linkFileDependencies) {\n        const registry = 'npm';\n        const manifest = { _uid: '', name: '', version: '0.0.0', _registry: registry };\n        manifest._remote = {\n          type: 'link',\n          registry,\n          hash: null,\n          reference: loc\n        };\n        manifest._uid = manifest.version;\n        return manifest;\n      }\n      if (!(yield (_fs || _load_fs()).exists(loc))) {\n        throw new (_errors || _load_errors()).MessageError(_this.reporter.lang('doesntExist', loc, _this.pattern.split('@')[0]));\n      }\n\n      const manifest = yield (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n        try {\n          return yield _this.config.readManifest(loc, _this.registry);\n        } catch (e) {\n          if (e.code === 'ENOENT') {\n            return {\n              // This is just the default, it can be overridden with key of dependencies\n              name: (_path || _load_path()).default.dirname(loc),\n              version: '0.0.0',\n              _uid: '0.0.0',\n              _registry: 'npm'\n            };\n          }\n\n          throw e;\n        }\n      })();\n      const registry = manifest._registry;\n      (0, (_invariant || _load_invariant()).default)(registry, 'expected registry');\n\n      manifest._remote = {\n        type: 'copy',\n        registry,\n        hash: `${(_uuid || _load_uuid()).default.v4()}-${new Date().getTime()}`,\n        reference: loc\n      };\n\n      manifest._uid = manifest.version;\n\n      return manifest;\n    })();\n  }\n}\nexports.default = FileResolver;\nFileResolver.protocol = 'file';\nFileResolver.prefixMatcher = /^\\.{1,2}\\//;\n\n/***/ }),\n/* 214 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.explodeGistFragment = explodeGistFragment;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _gitResolver;\n\nfunction _load_gitResolver() {\n  return _gitResolver = _interopRequireDefault(__webpack_require__(125));\n}\n\nvar _exoticResolver;\n\nfunction _load_exoticResolver() {\n  return _exoticResolver = _interopRequireDefault(__webpack_require__(89));\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = _interopRequireWildcard(__webpack_require__(18));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction explodeGistFragment(fragment, reporter) {\n  fragment = (_misc || _load_misc()).removePrefix(fragment, 'gist:');\n\n  const parts = fragment.split('#');\n\n  if (parts.length <= 2) {\n    return {\n      id: parts[0],\n      hash: parts[1] || ''\n    };\n  } else {\n    throw new (_errors || _load_errors()).MessageError(reporter.lang('invalidGistFragment', fragment));\n  }\n}\n\nclass GistResolver extends (_exoticResolver || _load_exoticResolver()).default {\n\n  constructor(request, fragment) {\n    super(request, fragment);\n\n    var _explodeGistFragment = explodeGistFragment(fragment, this.reporter);\n\n    const id = _explodeGistFragment.id,\n          hash = _explodeGistFragment.hash;\n\n    this.id = id;\n    this.hash = hash;\n  }\n\n  resolve() {\n    return this.fork((_gitResolver || _load_gitResolver()).default, false, `https://gist.github.com/${this.id}.git#${this.hash}`);\n  }\n}\nexports.default = GistResolver;\nGistResolver.protocol = 'gist';\n\n/***/ }),\n/* 215 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _cache;\n\nfunction _load_cache() {\n  return _cache = __webpack_require__(349);\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _registryResolver;\n\nfunction _load_registryResolver() {\n  return _registryResolver = _interopRequireDefault(__webpack_require__(543));\n}\n\nvar _npmRegistry;\n\nfunction _load_npmRegistry() {\n  return _npmRegistry = _interopRequireDefault(__webpack_require__(88));\n}\n\nvar _map;\n\nfunction _load_map() {\n  return _map = _interopRequireDefault(__webpack_require__(30));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nvar _packageNameUtils;\n\nfunction _load_packageNameUtils() {\n  return _packageNameUtils = __webpack_require__(220);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst inquirer = __webpack_require__(276);\nconst tty = __webpack_require__(104);\nconst path = __webpack_require__(0);\nconst semver = __webpack_require__(22);\nconst ssri = __webpack_require__(65);\n\nconst NPM_REGISTRY_ID = 'npm';\n\nclass NpmResolver extends (_registryResolver || _load_registryResolver()).default {\n\n  static findVersionInRegistryResponse(config, name, range, body, request) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      if (body.versions && Object.keys(body.versions).length === 0) {\n        throw new (_errors || _load_errors()).MessageError(config.reporter.lang('registryNoVersions', body.name));\n      }\n\n      if (!body['dist-tags'] || !body.versions) {\n        throw new (_errors || _load_errors()).MessageError(config.reporter.lang('malformedRegistryResponse', name));\n      }\n\n      if (range in body['dist-tags']) {\n        range = body['dist-tags'][range];\n      }\n\n      // If the latest tag in the registry satisfies the requested range, then use that.\n      // Otherwise we will fall back to semver maxSatisfying.\n      // This mimics logic in NPM. See issue #3560\n      const latestVersion = body['dist-tags'] ? body['dist-tags'].latest : undefined;\n      if (latestVersion && semver.satisfies(latestVersion, range)) {\n        return body.versions[latestVersion];\n      }\n\n      const satisfied = yield config.resolveConstraints(Object.keys(body.versions), range);\n      if (satisfied) {\n        return body.versions[satisfied];\n      } else if (request && !config.nonInteractive) {\n        if (request.resolver && request.resolver.activity) {\n          request.resolver.activity.end();\n        }\n        config.reporter.log(config.reporter.lang('couldntFindVersionThatMatchesRange', body.name, range));\n        let pageSize;\n        if (process.stdout instanceof tty.WriteStream) {\n          pageSize = process.stdout.rows - 2;\n        }\n        const response = yield inquirer.prompt([{\n          name: 'package',\n          type: 'list',\n          message: config.reporter.lang('chooseVersionFromList', body.name),\n          choices: semver.rsort(Object.keys(body.versions)),\n          pageSize\n        }]);\n        if (response && response.package) {\n          return body.versions[response.package];\n        }\n      }\n      throw new (_errors || _load_errors()).MessageError(config.reporter.lang('couldntFindVersionThatMatchesRange', body.name, range));\n    })();\n  }\n\n  resolveRequest(desiredVersion) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      if (_this.config.offline) {\n        const res = yield _this.resolveRequestOffline();\n        if (res != null) {\n          return res;\n        }\n      }\n\n      const escapedName = (_npmRegistry || _load_npmRegistry()).default.escapeName(_this.name);\n      const desiredRange = desiredVersion || _this.range;\n      const body = yield _this.config.registries.npm.request(escapedName);\n\n      if (body) {\n        return NpmResolver.findVersionInRegistryResponse(_this.config, escapedName, desiredRange, body, _this.request);\n      } else {\n        return null;\n      }\n    })();\n  }\n\n  resolveRequestOffline() {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const packageDirs = yield _this2.config.getCache('cachedPackages', function () {\n        return (0, (_cache || _load_cache()).getCachedPackagesDirs)(_this2.config, _this2.config.cacheFolder);\n      });\n\n      const versions = (0, (_map || _load_map()).default)();\n\n      for (var _iterator = packageDirs, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref = _i.value;\n        }\n\n        const dir = _ref;\n\n        // check if folder contains the registry prefix\n        if (dir.indexOf(`${NPM_REGISTRY_ID}-`) === -1) {\n          continue;\n        }\n\n        // read manifest and validate correct name\n        const pkg = yield _this2.config.readManifest(dir, NPM_REGISTRY_ID);\n        if (pkg.name !== _this2.name) {\n          continue;\n        }\n\n        // read package metadata\n        const metadata = yield _this2.config.readPackageMetadata(dir);\n        if (!metadata.remote) {\n          continue; // old yarn metadata\n        }\n\n        versions[pkg.version] = Object.assign({}, pkg, {\n          _remote: metadata.remote\n        });\n      }\n\n      const satisfied = yield _this2.config.resolveConstraints(Object.keys(versions), _this2.range);\n      if (satisfied) {\n        return versions[satisfied];\n      } else if (!_this2.config.preferOffline) {\n        throw new (_errors || _load_errors()).MessageError(_this2.reporter.lang('couldntFindPackageInCache', _this2.name, _this2.range, Object.keys(versions).join(', ')));\n      } else {\n        return null;\n      }\n    })();\n  }\n\n  cleanRegistry(url) {\n    if (this.config.getOption('registry') === (_constants || _load_constants()).YARN_REGISTRY) {\n      return url.replace((_constants || _load_constants()).NPM_REGISTRY_RE, (_constants || _load_constants()).YARN_REGISTRY);\n    } else {\n      return url;\n    }\n  }\n\n  resolve() {\n    var _this3 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      // lockfile\n      const shrunk = _this3.request.getLocked('tarball');\n      if (shrunk) {\n        if (_this3.config.packBuiltPackages && shrunk.prebuiltVariants && shrunk._remote) {\n          const prebuiltVariants = shrunk.prebuiltVariants;\n          const prebuiltName = (0, (_packageNameUtils || _load_packageNameUtils()).getPlatformSpecificPackageFilename)(shrunk);\n          const offlineMirrorPath = _this3.config.getOfflineMirrorPath();\n          if (prebuiltVariants[prebuiltName] && offlineMirrorPath) {\n            const filename = path.join(offlineMirrorPath, 'prebuilt', prebuiltName + '.tgz');\n            const _remote = shrunk._remote;\n\n            if (_remote && (yield (_fs || _load_fs()).exists(filename))) {\n              _remote.reference = `file:${filename}`;\n              _remote.hash = prebuiltVariants[prebuiltName];\n              _remote.integrity = ssri.fromHex(_remote.hash, 'sha1').toString();\n            }\n          }\n        }\n      }\n      if (shrunk && shrunk._remote && (shrunk._remote.integrity || _this3.config.offline || !_this3.config.autoAddIntegrity)) {\n        // if the integrity field does not exist, we're not network-restricted, and the\n        // migration hasn't been disabled, it needs to be created\n        return shrunk;\n      }\n\n      const desiredVersion = shrunk && shrunk.version ? shrunk.version : null;\n      const info = yield _this3.resolveRequest(desiredVersion);\n      if (info == null) {\n        throw new (_errors || _load_errors()).MessageError(_this3.reporter.lang('packageNotFoundRegistry', _this3.name, NPM_REGISTRY_ID));\n      }\n\n      const deprecated = info.deprecated,\n            dist = info.dist;\n\n      if (shrunk && shrunk._remote) {\n        shrunk._remote.integrity = dist && dist.integrity ? ssri.parse(dist.integrity) : ssri.fromHex(dist && dist.shasum ? dist.shasum : '', 'sha1');\n        return shrunk;\n      }\n\n      if (typeof deprecated === 'string') {\n        let human = `${info.name}@${info.version}`;\n        const parentNames = _this3.request.parentNames;\n        if (parentNames.length) {\n          human = parentNames.concat(human).join(' > ');\n        }\n        _this3.reporter.warn(`${human}: ${deprecated}`);\n      }\n\n      if (dist != null && dist.tarball) {\n        info._remote = {\n          resolved: `${_this3.cleanRegistry(dist.tarball)}#${dist.shasum}`,\n          type: 'tarball',\n          reference: _this3.cleanRegistry(dist.tarball),\n          hash: dist.shasum,\n          integrity: dist.integrity ? ssri.parse(dist.integrity) : ssri.fromHex(dist.shasum, 'sha1'),\n          registry: NPM_REGISTRY_ID,\n          packageName: info.name\n        };\n      }\n\n      info._uid = info.version;\n\n      return info;\n    })();\n  }\n}\nexports.default = NpmResolver;\nNpmResolver.registry = NPM_REGISTRY_ID;\n\n/***/ }),\n/* 216 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fileDatesEqual = exports.copyFile = exports.unlink = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\n// We want to preserve file timestamps when copying a file, since yarn uses them to decide if a file has\n// changed compared to the cache.\n// There are some OS specific cases here:\n// * On linux, fs.copyFile does not preserve timestamps, but does on OSX and Win.\n// * On windows, you must open a file with write permissions to call `fs.futimes`.\n// * On OSX you can open with read permissions and still call `fs.futimes`.\nlet fixTimes = (() => {\n  var _ref3 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (fd, dest, data) {\n    const doOpen = fd === undefined;\n    let openfd = fd ? fd : -1;\n\n    if (disableTimestampCorrection === undefined) {\n      // if timestamps match already, no correction is needed.\n      // the need to correct timestamps varies based on OS and node versions.\n      const destStat = yield lstat(dest);\n      disableTimestampCorrection = fileDatesEqual(destStat.mtime, data.mtime);\n    }\n\n    if (disableTimestampCorrection) {\n      return;\n    }\n\n    if (doOpen) {\n      try {\n        openfd = yield open(dest, 'a', data.mode);\n      } catch (er) {\n        // file is likely read-only\n        try {\n          openfd = yield open(dest, 'r', data.mode);\n        } catch (err) {\n          // We can't even open this file for reading.\n          return;\n        }\n      }\n    }\n\n    try {\n      if (openfd) {\n        yield futimes(openfd, data.atime, data.mtime);\n      }\n    } catch (er) {\n      // If `futimes` throws an exception, we probably have a case of a read-only file on Windows.\n      // In this case we can just return. The incorrect timestamp will just cause that file to be recopied\n      // on subsequent installs, which will effect yarn performance but not break anything.\n    } finally {\n      if (doOpen && openfd) {\n        yield close(openfd);\n      }\n    }\n  });\n\n  return function fixTimes(_x7, _x8, _x9) {\n    return _ref3.apply(this, arguments);\n  };\n})();\n\n// Compare file timestamps.\n// Some versions of Node on windows zero the milliseconds when utime is used.\n\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireDefault(__webpack_require__(4));\n}\n\nvar _promise;\n\nfunction _load_promise() {\n  return _promise = __webpack_require__(51);\n}\n\nvar _fs2;\n\nfunction _load_fs2() {\n  return _fs2 = __webpack_require__(5);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nlet disableTimestampCorrection = undefined; // OS dependent. will be detected on first file copy.\n\n// This module serves as a wrapper for file operations that are inconsistant across node and OS versions.\n\nconst readFileBuffer = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.readFile);\nconst close = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.close);\nconst lstat = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.lstat);\nconst open = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.open);\nconst futimes = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.futimes);\n\nconst write = (0, (_promise || _load_promise()).promisify)((_fs || _load_fs()).default.write);\n\nconst unlink = exports.unlink = (0, (_promise || _load_promise()).promisify)(__webpack_require__(308));\n\n/**\n * Unlinks the destination to force a recreation. This is needed on case-insensitive file systems\n * to force the correct naming when the filename has changed only in character-casing. (Jest -> jest).\n */\nconst copyFile = exports.copyFile = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data, cleanup) {\n    // $FlowFixMe: Flow doesn't currently support COPYFILE_FICLONE\n    const ficloneFlag = (_fs2 || _load_fs2()).constants.COPYFILE_FICLONE || 0;\n    try {\n      yield unlink(data.dest);\n      yield copyFilePoly(data.src, data.dest, ficloneFlag, data);\n    } finally {\n      if (cleanup) {\n        cleanup();\n      }\n    }\n  });\n\n  return function copyFile(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\n// Node 8.5.0 introduced `fs.copyFile` which is much faster, so use that when available.\n// Otherwise we fall back to reading and writing files as buffers.\nconst copyFilePoly = (src, dest, flags, data) => {\n  if ((_fs || _load_fs()).default.copyFile) {\n    return new Promise((resolve, reject) => (_fs || _load_fs()).default.copyFile(src, dest, flags, err => {\n      if (err) {\n        reject(err);\n      } else {\n        fixTimes(undefined, dest, data).then(() => resolve()).catch(ex => reject(ex));\n      }\n    }));\n  } else {\n    return copyWithBuffer(src, dest, flags, data);\n  }\n};\n\nconst copyWithBuffer = (() => {\n  var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (src, dest, flags, data) {\n    // Use open -> write -> futimes -> close sequence to avoid opening the file twice:\n    // one with writeFile and one with utimes\n    const fd = yield open(dest, 'w', data.mode);\n    try {\n      const buffer = yield readFileBuffer(src);\n      yield write(fd, buffer, 0, buffer.length);\n      yield fixTimes(fd, dest, data);\n    } finally {\n      yield close(fd);\n    }\n  });\n\n  return function copyWithBuffer(_x3, _x4, _x5, _x6) {\n    return _ref2.apply(this, arguments);\n  };\n})();const fileDatesEqual = exports.fileDatesEqual = (a, b) => {\n  const aTime = a.getTime();\n  const bTime = b.getTime();\n\n  if (process.platform !== 'win32') {\n    return aTime === bTime;\n  }\n\n  // See https://github.com/nodejs/node/pull/12607\n  // Submillisecond times from stat and utimes are truncated on Windows,\n  // causing a file with mtime 8.0079998 and 8.0081144 to become 8.007 and 8.008\n  // and making it impossible to update these files to their correct timestamps.\n  if (Math.abs(aTime - bTime) <= 1) {\n    return true;\n  }\n\n  const aTimeSec = Math.floor(aTime / 1000);\n  const bTimeSec = Math.floor(bTime / 1000);\n\n  // See https://github.com/nodejs/node/issues/2069\n  // Some versions of Node on windows zero the milliseconds when utime is used\n  // So if any of the time has a milliseconds part of zero we suspect that the\n  // bug is present and compare only seconds.\n  if (aTime - aTimeSec * 1000 === 0 || bTime - bTimeSec * 1000 === 0) {\n    return aTimeSec === bTimeSec;\n  }\n\n  return aTime === bTime;\n};\n\n/***/ }),\n/* 217 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _invariant;\n\nfunction _load_invariant() {\n  return _invariant = _interopRequireDefault(__webpack_require__(9));\n}\n\nvar _string_decoder;\n\nfunction _load_string_decoder() {\n  return _string_decoder = __webpack_require__(333);\n}\n\nvar _tarFs;\n\nfunction _load_tarFs() {\n  return _tarFs = _interopRequireDefault(__webpack_require__(194));\n}\n\nvar _tarStream;\n\nfunction _load_tarStream() {\n  return _tarStream = _interopRequireDefault(__webpack_require__(460));\n}\n\nvar _url;\n\nfunction _load_url() {\n  return _url = _interopRequireDefault(__webpack_require__(24));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = __webpack_require__(4);\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _gitSpawn;\n\nfunction _load_gitSpawn() {\n  return _gitSpawn = __webpack_require__(367);\n}\n\nvar _gitRefResolver;\n\nfunction _load_gitRefResolver() {\n  return _gitRefResolver = __webpack_require__(549);\n}\n\nvar _crypto;\n\nfunction _load_crypto() {\n  return _crypto = _interopRequireWildcard(__webpack_require__(168));\n}\n\nvar _fs2;\n\nfunction _load_fs2() {\n  return _fs2 = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _map;\n\nfunction _load_map() {\n  return _map = _interopRequireDefault(__webpack_require__(30));\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst GIT_PROTOCOL_PREFIX = 'git+';\n\nconst SSH_PROTOCOL = 'ssh:';\nconst SCP_PATH_PREFIX = '/:';\nconst FILE_PROTOCOL = 'file:';\nconst GIT_VALID_REF_LINE_REGEXP = /^([a-fA-F0-9]+|ref)/;\n\nconst validRef = line => {\n  return GIT_VALID_REF_LINE_REGEXP.exec(line);\n};\n\nconst supportsArchiveCache = (0, (_map || _load_map()).default)({\n  'github.com': false // not support, doubt they will ever support it\n});\n\nconst handleSpawnError = err => {\n  if (err instanceof (_errors || _load_errors()).ProcessSpawnError) {\n    throw err;\n  }\n};\n\nconst SHORTHAND_SERVICES = (0, (_map || _load_map()).default)({\n  'github:': parsedUrl => (0, (_extends2 || _load_extends()).default)({}, parsedUrl, {\n    slashes: true,\n    auth: 'git',\n    protocol: SSH_PROTOCOL,\n    host: 'github.com',\n    hostname: 'github.com',\n    pathname: `/${parsedUrl.hostname}${parsedUrl.pathname}`\n  }),\n  'bitbucket:': parsedUrl => (0, (_extends2 || _load_extends()).default)({}, parsedUrl, {\n    slashes: true,\n    auth: 'git',\n    protocol: SSH_PROTOCOL,\n    host: 'bitbucket.com',\n    hostname: 'bitbucket.com',\n    pathname: `/${parsedUrl.hostname}${parsedUrl.pathname}`\n  })\n});\n\nclass Git {\n  constructor(config, gitUrl, hash) {\n    this.supportsArchive = false;\n    this.fetched = false;\n    this.config = config;\n    this.reporter = config.reporter;\n    this.hash = hash;\n    this.ref = hash;\n    this.gitUrl = gitUrl;\n    this.cwd = this.config.getTemp((_crypto || _load_crypto()).hash(this.gitUrl.repository));\n  }\n\n  /**\n   * npm URLs contain a 'git+' scheme prefix, which is not understood by git.\n   * git \"URLs\" also allow an alternative scp-like syntax, so they're not standard URLs.\n   */\n  static npmUrlToGitUrl(npmUrl) {\n    npmUrl = (0, (_misc || _load_misc()).removePrefix)(npmUrl, GIT_PROTOCOL_PREFIX);\n\n    let parsed = (_url || _load_url()).default.parse(npmUrl);\n    const expander = parsed.protocol && SHORTHAND_SERVICES[parsed.protocol];\n\n    if (expander) {\n      parsed = expander(parsed);\n    }\n\n    // Special case in npm, where ssh:// prefix is stripped to pass scp-like syntax\n    // which in git works as remote path only if there are no slashes before ':'.\n    // See #3146.\n    if (parsed.protocol === SSH_PROTOCOL && parsed.hostname && parsed.path && parsed.path.startsWith(SCP_PATH_PREFIX) && parsed.port === null) {\n      const auth = parsed.auth ? parsed.auth + '@' : '';\n      const pathname = parsed.path.slice(SCP_PATH_PREFIX.length);\n      return {\n        hostname: parsed.hostname,\n        protocol: parsed.protocol,\n        repository: `${auth}${parsed.hostname}:${pathname}`\n      };\n    }\n\n    // git local repos are specified as `git+file:` and a filesystem path, not a url.\n    let repository;\n    if (parsed.protocol === FILE_PROTOCOL) {\n      repository = parsed.path;\n    } else {\n      repository = (_url || _load_url()).default.format((0, (_extends2 || _load_extends()).default)({}, parsed, { hash: '' }));\n    }\n\n    return {\n      hostname: parsed.hostname || null,\n      protocol: parsed.protocol || FILE_PROTOCOL,\n      repository: repository || ''\n    };\n  }\n\n  /**\n   * Check if the host specified in the input `gitUrl` has archive capability.\n   */\n\n  static hasArchiveCapability(ref) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const hostname = ref.hostname;\n      if (ref.protocol !== 'ssh:' || hostname == null) {\n        return false;\n      }\n\n      if (hostname in supportsArchiveCache) {\n        return supportsArchiveCache[hostname];\n      }\n\n      try {\n        yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['archive', `--remote=${ref.repository}`, 'HEAD', Date.now() + '']);\n        throw new Error();\n      } catch (err) {\n        handleSpawnError(err);\n        const supports = err.message.indexOf('did not match any files') >= 0;\n        return supportsArchiveCache[hostname] = supports;\n      }\n    })();\n  }\n\n  /**\n   * Check if the input `target` is a 5-40 character hex commit hash.\n   */\n\n  static repoExists(ref) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const isLocal = ref.protocol === FILE_PROTOCOL;\n\n      try {\n        if (isLocal) {\n          yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['show-ref', '-t'], { cwd: ref.repository });\n        } else {\n          yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['ls-remote', '-t', ref.repository]);\n        }\n        return true;\n      } catch (err) {\n        handleSpawnError(err);\n        return false;\n      }\n    })();\n  }\n\n  static replaceProtocol(ref, protocol) {\n    return {\n      hostname: ref.hostname,\n      protocol,\n      repository: ref.repository.replace(/^(?:git|http):/, protocol)\n    };\n  }\n\n  /**\n   * Attempt to upgrade insecure protocols to secure protocol\n   */\n  static secureGitUrl(ref, hash, reporter) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      if ((0, (_gitRefResolver || _load_gitRefResolver()).isCommitSha)(hash)) {\n        // this is cryptographically secure\n        return ref;\n      }\n\n      if (ref.protocol === 'git:') {\n        const secureUrl = Git.replaceProtocol(ref, 'https:');\n        if (yield Git.repoExists(secureUrl)) {\n          return secureUrl;\n        } else {\n          reporter.warn(reporter.lang('downloadGitWithoutCommit', ref.repository));\n          return ref;\n        }\n      }\n\n      if (ref.protocol === 'http:') {\n        const secureRef = Git.replaceProtocol(ref, 'https:');\n        if (yield Git.repoExists(secureRef)) {\n          return secureRef;\n        } else {\n          reporter.warn(reporter.lang('downloadHTTPWithoutCommit', ref.repository));\n          return ref;\n        }\n      }\n\n      return ref;\n    })();\n  }\n\n  /**\n   * Archive a repo to destination\n   */\n\n  archive(dest) {\n    if (this.supportsArchive) {\n      return this._archiveViaRemoteArchive(dest);\n    } else {\n      return this._archiveViaLocalFetched(dest);\n    }\n  }\n\n  _archiveViaRemoteArchive(dest) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const hashStream = new (_crypto || _load_crypto()).HashStream();\n      yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['archive', `--remote=${_this.gitUrl.repository}`, _this.ref], {\n        process(proc, resolve, reject, done) {\n          const writeStream = (0, (_fs || _load_fs()).createWriteStream)(dest);\n          proc.on('error', reject);\n          writeStream.on('error', reject);\n          writeStream.on('end', done);\n          writeStream.on('open', function () {\n            proc.stdout.pipe(hashStream).pipe(writeStream);\n          });\n          writeStream.once('finish', done);\n        }\n      });\n      return hashStream.getHash();\n    })();\n  }\n\n  _archiveViaLocalFetched(dest) {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const hashStream = new (_crypto || _load_crypto()).HashStream();\n      yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['archive', _this2.hash], {\n        cwd: _this2.cwd,\n        process(proc, resolve, reject, done) {\n          const writeStream = (0, (_fs || _load_fs()).createWriteStream)(dest);\n          proc.on('error', reject);\n          writeStream.on('error', reject);\n          writeStream.on('open', function () {\n            proc.stdout.pipe(hashStream).pipe(writeStream);\n          });\n          writeStream.once('finish', done);\n        }\n      });\n      return hashStream.getHash();\n    })();\n  }\n\n  /**\n   * Clone a repo to the input `dest`. Use `git archive` if it's available, otherwise fall\n   * back to `git clone`.\n   */\n\n  clone(dest) {\n    if (this.supportsArchive) {\n      return this._cloneViaRemoteArchive(dest);\n    } else {\n      return this._cloneViaLocalFetched(dest);\n    }\n  }\n\n  _cloneViaRemoteArchive(dest) {\n    var _this3 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['archive', `--remote=${_this3.gitUrl.repository}`, _this3.ref], {\n        process(proc, update, reject, done) {\n          const extractor = (_tarFs || _load_tarFs()).default.extract(dest, {\n            dmode: 0o555, // all dirs should be readable\n            fmode: 0o444 // all files should be readable\n          });\n          extractor.on('error', reject);\n          extractor.on('finish', done);\n\n          proc.stdout.pipe(extractor);\n          proc.on('error', reject);\n        }\n      });\n    })();\n  }\n\n  _cloneViaLocalFetched(dest) {\n    var _this4 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['archive', _this4.hash], {\n        cwd: _this4.cwd,\n        process(proc, resolve, reject, done) {\n          const extractor = (_tarFs || _load_tarFs()).default.extract(dest, {\n            dmode: 0o555, // all dirs should be readable\n            fmode: 0o444 // all files should be readable\n          });\n\n          extractor.on('error', reject);\n          extractor.on('finish', done);\n\n          proc.stdout.pipe(extractor);\n        }\n      });\n    })();\n  }\n\n  /**\n   * Clone this repo.\n   */\n\n  fetch() {\n    var _this5 = this;\n\n    const gitUrl = this.gitUrl,\n          cwd = this.cwd;\n\n\n    return (_fs2 || _load_fs2()).lockQueue.push(gitUrl.repository, (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      if (yield (_fs2 || _load_fs2()).exists(cwd)) {\n        yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['fetch', '--tags'], { cwd });\n        yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['pull'], { cwd });\n      } else {\n        yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['clone', gitUrl.repository, cwd]);\n      }\n\n      _this5.fetched = true;\n    }));\n  }\n\n  /**\n   * Fetch the file by cloning the repo and reading it.\n   */\n\n  getFile(filename) {\n    if (this.supportsArchive) {\n      return this._getFileFromArchive(filename);\n    } else {\n      return this._getFileFromClone(filename);\n    }\n  }\n\n  _getFileFromArchive(filename) {\n    var _this6 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      try {\n        return yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['archive', `--remote=${_this6.gitUrl.repository}`, _this6.ref, filename], {\n          process(proc, update, reject, done) {\n            const parser = (_tarStream || _load_tarStream()).default.extract();\n\n            parser.on('error', reject);\n            parser.on('finish', done);\n\n            parser.on('entry', (header, stream, next) => {\n              const decoder = new (_string_decoder || _load_string_decoder()).StringDecoder('utf8');\n              let fileContent = '';\n\n              stream.on('data', buffer => {\n                fileContent += decoder.write(buffer);\n              });\n              stream.on('end', () => {\n                const remaining = decoder.end();\n                update(fileContent + remaining);\n                next();\n              });\n              stream.resume();\n            });\n\n            proc.stdout.pipe(parser);\n          }\n        });\n      } catch (err) {\n        if (err.message.indexOf('did not match any files') >= 0) {\n          return false;\n        } else {\n          throw err;\n        }\n      }\n    })();\n  }\n\n  _getFileFromClone(filename) {\n    var _this7 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      (0, (_invariant || _load_invariant()).default)(_this7.fetched, 'Repo not fetched');\n\n      try {\n        return yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['show', `${_this7.hash}:${filename}`], {\n          cwd: _this7.cwd\n        });\n      } catch (err) {\n        handleSpawnError(err);\n        // file doesn't exist\n        return false;\n      }\n    })();\n  }\n\n  /**\n   * Initialize the repo, find a secure url to use and\n   * set the ref to match an input `target`.\n   */\n  init() {\n    var _this8 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      _this8.gitUrl = yield Git.secureGitUrl(_this8.gitUrl, _this8.hash, _this8.reporter);\n\n      yield _this8.setRefRemote();\n\n      // check capabilities\n      if (_this8.ref !== '' && (yield Git.hasArchiveCapability(_this8.gitUrl))) {\n        _this8.supportsArchive = true;\n      } else {\n        yield _this8.fetch();\n      }\n\n      return _this8.hash;\n    })();\n  }\n\n  setRefRemote() {\n    var _this9 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const isLocal = _this9.gitUrl.protocol === FILE_PROTOCOL;\n      let stdout;\n\n      if (isLocal) {\n        stdout = yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['show-ref', '--tags', '--heads'], { cwd: _this9.gitUrl.repository });\n      } else {\n        stdout = yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['ls-remote', '--tags', '--heads', _this9.gitUrl.repository]);\n      }\n\n      const refs = (0, (_gitRefResolver || _load_gitRefResolver()).parseRefs)(stdout);\n      return _this9.setRef(refs);\n    })();\n  }\n\n  setRefHosted(hostedRefsList) {\n    const refs = (0, (_gitRefResolver || _load_gitRefResolver()).parseRefs)(hostedRefsList);\n    return this.setRef(refs);\n  }\n\n  /**\n   * Resolves the default branch of a remote repository (not always \"master\")\n   */\n\n  resolveDefaultBranch() {\n    var _this10 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const isLocal = _this10.gitUrl.protocol === FILE_PROTOCOL;\n\n      try {\n        let stdout;\n        if (isLocal) {\n          stdout = yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['show-ref', 'HEAD'], { cwd: _this10.gitUrl.repository });\n          const refs = (0, (_gitRefResolver || _load_gitRefResolver()).parseRefs)(stdout);\n          const sha = refs.values().next().value;\n          if (sha) {\n            return { sha, ref: undefined };\n          } else {\n            throw new Error('Unable to find SHA for git HEAD');\n          }\n        } else {\n          stdout = yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['ls-remote', '--symref', _this10.gitUrl.repository, 'HEAD']);\n          const lines = stdout.split('\\n').filter(validRef);\n\n          var _lines$0$split = lines[0].split(/\\s+/);\n\n          const ref = _lines$0$split[1];\n\n          var _lines$1$split = lines[1].split(/\\s+/);\n\n          const sha = _lines$1$split[0];\n\n          return { sha, ref };\n        }\n      } catch (err) {\n        handleSpawnError(err);\n        // older versions of git don't support \"--symref\"\n        const stdout = yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['ls-remote', _this10.gitUrl.repository, 'HEAD']);\n        const lines = stdout.split('\\n').filter(validRef);\n\n        var _lines$0$split2 = lines[0].split(/\\s+/);\n\n        const sha = _lines$0$split2[0];\n\n        return { sha, ref: undefined };\n      }\n    })();\n  }\n\n  /**\n   * Resolve a git commit to it's 40-chars format and ensure it exists in the repository\n   * We need to use the 40-chars format to avoid multiple folders in the cache\n   */\n\n  resolveCommit(shaToResolve) {\n    var _this11 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      try {\n        yield _this11.fetch();\n        const revListArgs = ['rev-list', '-n', '1', '--no-abbrev-commit', '--format=oneline', shaToResolve];\n        const stdout = yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(revListArgs, { cwd: _this11.cwd });\n\n        var _stdout$split = stdout.split(/\\s+/);\n\n        const sha = _stdout$split[0];\n\n        return { sha, ref: undefined };\n      } catch (err) {\n        handleSpawnError(err);\n        // assuming commit not found, let's try something else\n        return null;\n      }\n    })();\n  }\n\n  /**\n   * Resolves the input hash / ref / semver range to a valid commit sha\n   * If possible also resolves the sha to a valid ref in order to use \"git archive\"\n   */\n\n  setRef(refs) {\n    var _this12 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      // get commit ref\n      const version = _this12.hash;\n\n\n      const resolvedResult = yield (0, (_gitRefResolver || _load_gitRefResolver()).resolveVersion)({\n        config: _this12.config,\n        git: _this12,\n        version,\n        refs\n      });\n      if (!resolvedResult) {\n        throw new (_errors || _load_errors()).MessageError(_this12.reporter.lang('couldntFindMatch', version, Array.from(refs.keys()).join(','), _this12.gitUrl.repository));\n      }\n\n      _this12.hash = resolvedResult.sha;\n      _this12.ref = resolvedResult.ref || '';\n      return _this12.hash;\n    })();\n  }\n}\nexports.default = Git;\n\n/***/ }),\n/* 218 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _resolveRelative;\n\nfunction _load_resolveRelative() {\n  return _resolveRelative = _interopRequireDefault(__webpack_require__(554));\n}\n\nvar _validate;\n\nfunction _load_validate() {\n  return _validate = _interopRequireDefault(__webpack_require__(126));\n}\n\nvar _fix;\n\nfunction _load_fix() {\n  return _fix = _interopRequireDefault(__webpack_require__(551));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst path = __webpack_require__(0);\n\nexports.default = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (info, moduleLoc, config, isRoot) {\n    // create human readable name\n    const name = info.name,\n          version = info.version;\n\n    let human;\n    if (typeof name === 'string') {\n      human = name;\n    }\n    if (human && typeof version === 'string' && version) {\n      human += `@${version}`;\n    }\n    if (isRoot && info._loc) {\n      human = path.relative(config.cwd, info._loc);\n    }\n\n    function warn(msg) {\n      if (human) {\n        msg = `${human}: ${msg}`;\n      }\n      config.reporter.warn(msg);\n    }\n\n    yield (0, (_fix || _load_fix()).default)(info, moduleLoc, config.reporter, warn, config.looseSemver);\n    (0, (_resolveRelative || _load_resolveRelative()).default)(info, moduleLoc, config.lockfileFolder);\n\n    if (config.cwd === config.globalFolder) {\n      return info;\n    }\n\n    try {\n      (0, (_validate || _load_validate()).default)(info, isRoot, config.reporter, warn);\n    } catch (err) {\n      if (human) {\n        err.message = `${human}: ${err.message}`;\n      }\n      throw err;\n    }\n\n    return info;\n  });\n\n  return function (_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\n/***/ }),\n/* 219 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isValidLicense = isValidLicense;\nexports.isValidBin = isValidBin;\nexports.stringifyPerson = stringifyPerson;\nexports.parsePerson = parsePerson;\nexports.normalizePerson = normalizePerson;\nexports.extractDescription = extractDescription;\nexports.extractRepositoryUrl = extractRepositoryUrl;\n\n\nconst path = __webpack_require__(0);\n\nconst validateLicense = __webpack_require__(959);\n\nconst PARENT_PATH = /^\\.\\.([\\\\\\/]|$)/;\n\nfunction isValidLicense(license) {\n  return !!license && validateLicense(license).validForNewPackages;\n}\n\nfunction isValidBin(bin) {\n  return !path.isAbsolute(bin) && !PARENT_PATH.test(path.normalize(bin));\n}\n\nfunction stringifyPerson(person) {\n  if (!person || typeof person !== 'object') {\n    return person;\n  }\n\n  const parts = [];\n  if (person.name) {\n    parts.push(person.name);\n  }\n\n  const email = person.email || person.mail;\n  if (typeof email === 'string') {\n    parts.push(`<${email}>`);\n  }\n\n  const url = person.url || person.web;\n  if (typeof url === 'string') {\n    parts.push(`(${url})`);\n  }\n\n  return parts.join(' ');\n}\n\nfunction parsePerson(person) {\n  if (typeof person !== 'string') {\n    return person;\n  }\n\n  // format: name (url) <email>\n  const obj = {};\n\n  let name = person.match(/^([^\\(<]+)/);\n  if (name) {\n    name = name[0].trim();\n    if (name) {\n      obj.name = name;\n    }\n  }\n\n  const email = person.match(/<([^>]+)>/);\n  if (email) {\n    obj.email = email[1];\n  }\n\n  const url = person.match(/\\(([^\\)]+)\\)/);\n  if (url) {\n    obj.url = url[1];\n  }\n\n  return obj;\n}\n\nfunction normalizePerson(person) {\n  return parsePerson(stringifyPerson(person));\n}\n\nfunction extractDescription(readme) {\n  if (typeof readme !== 'string' || readme === '') {\n    return undefined;\n  }\n\n  // split into lines\n  const lines = readme.trim().split('\\n').map(line => line.trim());\n\n  // find the start of the first paragraph, ignore headings\n  let start = 0;\n  for (; start < lines.length; start++) {\n    const line = lines[start];\n    if (line && line.match(/^(#|$)/)) {\n      // line isn't empty and isn't a heading so this is the start of a paragraph\n      start++;\n      break;\n    }\n  }\n\n  // skip newlines from the header to the first line\n  while (start < lines.length && !lines[start]) {\n    start++;\n  }\n\n  // continue to the first non empty line\n  let end = start;\n  while (end < lines.length && lines[end]) {\n    end++;\n  }\n\n  return lines.slice(start, end).join(' ');\n}\n\nfunction extractRepositoryUrl(repository) {\n  if (!repository || typeof repository !== 'object') {\n    return repository;\n  }\n  return repository.url;\n}\n\n/***/ }),\n/* 220 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getPlatformSpecificPackageFilename = getPlatformSpecificPackageFilename;\nexports.getSystemParams = getSystemParams;\nfunction getPlatformSpecificPackageFilename(pkg) {\n  // TODO support hash for all subdependencies that have installs scripts\n  const normalizeScope = name => name[0] === '@' ? name.substr(1).replace('/', '-') : name;\n  const suffix = getSystemParams();\n  return `${normalizeScope(pkg.name)}-v${pkg.version}-${suffix}`;\n}\n\nfunction getSystemParams() {\n  // TODO support platform variant for linux\n  return `${process.platform}-${process.arch}-${process.versions.modules || ''}`;\n}\n\n/***/ }),\n/* 221 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isFakeRoot = isFakeRoot;\nexports.isRootUser = isRootUser;\nfunction getUid() {\n  if (process.platform !== 'win32' && process.getuid) {\n    return process.getuid();\n  }\n  return null;\n}\n\nexports.default = isRootUser(getUid()) && !isFakeRoot();\nfunction isFakeRoot() {\n  return Boolean(process.env.FAKEROOTKEY);\n}\n\nfunction isRootUser(uid) {\n  return uid === 0;\n}\n\n/***/ }),\n/* 222 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getDataDir = getDataDir;\nexports.getCacheDir = getCacheDir;\nexports.getConfigDir = getConfigDir;\nconst path = __webpack_require__(0);\nconst userHome = __webpack_require__(67).default;\n\nconst FALLBACK_CONFIG_DIR = path.join(userHome, '.config', 'yarn');\nconst FALLBACK_CACHE_DIR = path.join(userHome, '.cache', 'yarn');\n\nfunction getDataDir() {\n  if (process.platform === 'win32') {\n    const WIN32_APPDATA_DIR = getLocalAppDataDir();\n    return WIN32_APPDATA_DIR == null ? FALLBACK_CONFIG_DIR : path.join(WIN32_APPDATA_DIR, 'Data');\n  } else if (process.env.XDG_DATA_HOME) {\n    return path.join(process.env.XDG_DATA_HOME, 'yarn');\n  } else {\n    // This could arguably be ~/Library/Application Support/Yarn on Macs,\n    // but that feels unintuitive for a cli tool\n\n    // Instead, use our prior fallback. Some day this could be\n    // path.join(userHome, '.local', 'share', 'yarn')\n    // or return path.join(WIN32_APPDATA_DIR, 'Data') on win32\n    return FALLBACK_CONFIG_DIR;\n  }\n}\n\nfunction getCacheDir() {\n  if (process.platform === 'win32') {\n    // process.env.TEMP also exists, but most apps put caches here\n    return path.join(getLocalAppDataDir() || path.join(userHome, 'AppData', 'Local', 'Yarn'), 'Cache');\n  } else if (process.env.XDG_CACHE_HOME) {\n    return path.join(process.env.XDG_CACHE_HOME, 'yarn');\n  } else if (process.platform === 'darwin') {\n    return path.join(userHome, 'Library', 'Caches', 'Yarn');\n  } else {\n    return FALLBACK_CACHE_DIR;\n  }\n}\n\nfunction getConfigDir() {\n  if (process.platform === 'win32') {\n    // Use our prior fallback. Some day this could be\n    // return path.join(WIN32_APPDATA_DIR, 'Config')\n    const WIN32_APPDATA_DIR = getLocalAppDataDir();\n    return WIN32_APPDATA_DIR == null ? FALLBACK_CONFIG_DIR : path.join(WIN32_APPDATA_DIR, 'Config');\n  } else if (process.env.XDG_CONFIG_HOME) {\n    return path.join(process.env.XDG_CONFIG_HOME, 'yarn');\n  } else {\n    return FALLBACK_CONFIG_DIR;\n  }\n}\n\nfunction getLocalAppDataDir() {\n  return process.env.LOCALAPPDATA ? path.join(process.env.LOCALAPPDATA, 'Yarn') : null;\n}\n\n/***/ }),\n/* 223 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.explodeHashedUrl = explodeHashedUrl;\nfunction explodeHashedUrl(url) {\n  const parts = url.split('#');\n\n  return {\n    hash: parts[1] || '',\n    url: parts[0]\n  };\n}\n\n/***/ }),\n/* 224 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(230), __esModule: true };\n\n/***/ }),\n/* 225 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = balanced;\nfunction balanced(a, b, str) {\n  if (a instanceof RegExp) a = maybeMatch(a, str);\n  if (b instanceof RegExp) b = maybeMatch(b, str);\n\n  var r = range(a, b, str);\n\n  return r && {\n    start: r[0],\n    end: r[1],\n    pre: str.slice(0, r[0]),\n    body: str.slice(r[0] + a.length, r[1]),\n    post: str.slice(r[1] + b.length)\n  };\n}\n\nfunction maybeMatch(reg, str) {\n  var m = str.match(reg);\n  return m ? m[0] : null;\n}\n\nbalanced.range = range;\nfunction range(a, b, str) {\n  var begs, beg, left, right, result;\n  var ai = str.indexOf(a);\n  var bi = str.indexOf(b, ai + 1);\n  var i = ai;\n\n  if (ai >= 0 && bi > 0) {\n    begs = [];\n    left = str.length;\n\n    while (i >= 0 && !result) {\n      if (i == ai) {\n        begs.push(i);\n        ai = str.indexOf(a, i + 1);\n      } else if (begs.length == 1) {\n        result = [ begs.pop(), bi ];\n      } else {\n        beg = begs.pop();\n        if (beg < left) {\n          left = beg;\n          right = bi;\n        }\n\n        bi = str.indexOf(b, i + 1);\n      }\n\n      i = ai < bi && ai >= 0 ? ai : bi;\n    }\n\n    if (begs.length) {\n      result = [ left, right ];\n    }\n  }\n\n  return result;\n}\n\n\n/***/ }),\n/* 226 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar concatMap = __webpack_require__(229);\nvar balanced = __webpack_require__(225);\n\nmodule.exports = expandTop;\n\nvar escSlash = '\\0SLASH'+Math.random()+'\\0';\nvar escOpen = '\\0OPEN'+Math.random()+'\\0';\nvar escClose = '\\0CLOSE'+Math.random()+'\\0';\nvar escComma = '\\0COMMA'+Math.random()+'\\0';\nvar escPeriod = '\\0PERIOD'+Math.random()+'\\0';\n\nfunction numeric(str) {\n  return parseInt(str, 10) == str\n    ? parseInt(str, 10)\n    : str.charCodeAt(0);\n}\n\nfunction escapeBraces(str) {\n  return str.split('\\\\\\\\').join(escSlash)\n            .split('\\\\{').join(escOpen)\n            .split('\\\\}').join(escClose)\n            .split('\\\\,').join(escComma)\n            .split('\\\\.').join(escPeriod);\n}\n\nfunction unescapeBraces(str) {\n  return str.split(escSlash).join('\\\\')\n            .split(escOpen).join('{')\n            .split(escClose).join('}')\n            .split(escComma).join(',')\n            .split(escPeriod).join('.');\n}\n\n\n// Basically just str.split(\",\"), but handling cases\n// where we have nested braced sections, which should be\n// treated as individual members, like {a,{b,c},d}\nfunction parseCommaParts(str) {\n  if (!str)\n    return [''];\n\n  var parts = [];\n  var m = balanced('{', '}', str);\n\n  if (!m)\n    return str.split(',');\n\n  var pre = m.pre;\n  var body = m.body;\n  var post = m.post;\n  var p = pre.split(',');\n\n  p[p.length-1] += '{' + body + '}';\n  var postParts = parseCommaParts(post);\n  if (post.length) {\n    p[p.length-1] += postParts.shift();\n    p.push.apply(p, postParts);\n  }\n\n  parts.push.apply(parts, p);\n\n  return parts;\n}\n\nfunction expandTop(str) {\n  if (!str)\n    return [];\n\n  // I don't know why Bash 4.3 does this, but it does.\n  // Anything starting with {} will have the first two bytes preserved\n  // but *only* at the top level, so {},a}b will not expand to anything,\n  // but a{},b}c will be expanded to [a}c,abc].\n  // One could argue that this is a bug in Bash, but since the goal of\n  // this module is to match Bash's rules, we escape a leading {}\n  if (str.substr(0, 2) === '{}') {\n    str = '\\\\{\\\\}' + str.substr(2);\n  }\n\n  return expand(escapeBraces(str), true).map(unescapeBraces);\n}\n\nfunction identity(e) {\n  return e;\n}\n\nfunction embrace(str) {\n  return '{' + str + '}';\n}\nfunction isPadded(el) {\n  return /^-?0\\d/.test(el);\n}\n\nfunction lte(i, y) {\n  return i <= y;\n}\nfunction gte(i, y) {\n  return i >= y;\n}\n\nfunction expand(str, isTop) {\n  var expansions = [];\n\n  var m = balanced('{', '}', str);\n  if (!m || /\\$$/.test(m.pre)) return [str];\n\n  var isNumericSequence = /^-?\\d+\\.\\.-?\\d+(?:\\.\\.-?\\d+)?$/.test(m.body);\n  var isAlphaSequence = /^[a-zA-Z]\\.\\.[a-zA-Z](?:\\.\\.-?\\d+)?$/.test(m.body);\n  var isSequence = isNumericSequence || isAlphaSequence;\n  var isOptions = m.body.indexOf(',') >= 0;\n  if (!isSequence && !isOptions) {\n    // {a},b}\n    if (m.post.match(/,.*\\}/)) {\n      str = m.pre + '{' + m.body + escClose + m.post;\n      return expand(str);\n    }\n    return [str];\n  }\n\n  var n;\n  if (isSequence) {\n    n = m.body.split(/\\.\\./);\n  } else {\n    n = parseCommaParts(m.body);\n    if (n.length === 1) {\n      // x{{a,b}}y ==> x{a}y x{b}y\n      n = expand(n[0], false).map(embrace);\n      if (n.length === 1) {\n        var post = m.post.length\n          ? expand(m.post, false)\n          : [''];\n        return post.map(function(p) {\n          return m.pre + n[0] + p;\n        });\n      }\n    }\n  }\n\n  // at this point, n is the parts, and we know it's not a comma set\n  // with a single entry.\n\n  // no need to expand pre, since it is guaranteed to be free of brace-sets\n  var pre = m.pre;\n  var post = m.post.length\n    ? expand(m.post, false)\n    : [''];\n\n  var N;\n\n  if (isSequence) {\n    var x = numeric(n[0]);\n    var y = numeric(n[1]);\n    var width = Math.max(n[0].length, n[1].length)\n    var incr = n.length == 3\n      ? Math.abs(numeric(n[2]))\n      : 1;\n    var test = lte;\n    var reverse = y < x;\n    if (reverse) {\n      incr *= -1;\n      test = gte;\n    }\n    var pad = n.some(isPadded);\n\n    N = [];\n\n    for (var i = x; test(i, y); i += incr) {\n      var c;\n      if (isAlphaSequence) {\n        c = String.fromCharCode(i);\n        if (c === '\\\\')\n          c = '';\n      } else {\n        c = String(i);\n        if (pad) {\n          var need = width - c.length;\n          if (need > 0) {\n            var z = new Array(need + 1).join('0');\n            if (i < 0)\n              c = '-' + z + c.slice(1);\n            else\n              c = z + c;\n          }\n        }\n      }\n      N.push(c);\n    }\n  } else {\n    N = concatMap(n, function(el) { return expand(el, false) });\n  }\n\n  for (var j = 0; j < N.length; j++) {\n    for (var k = 0; k < post.length; k++) {\n      var expansion = pre + N[j] + post[k];\n      if (!isTop || isSequence || expansion)\n        expansions.push(expansion);\n    }\n  }\n\n  return expansions;\n}\n\n\n\n/***/ }),\n/* 227 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction preserveCamelCase(str) {\n\tlet isLastCharLower = false;\n\tlet isLastCharUpper = false;\n\tlet isLastLastCharUpper = false;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst c = str[i];\n\n\t\tif (isLastCharLower && /[a-zA-Z]/.test(c) && c.toUpperCase() === c) {\n\t\t\tstr = str.substr(0, i) + '-' + str.substr(i);\n\t\t\tisLastCharLower = false;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = true;\n\t\t\ti++;\n\t\t} else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(c) && c.toLowerCase() === c) {\n\t\t\tstr = str.substr(0, i - 1) + '-' + str.substr(i - 1);\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = false;\n\t\t\tisLastCharLower = true;\n\t\t} else {\n\t\t\tisLastCharLower = c.toLowerCase() === c;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = c.toUpperCase() === c;\n\t\t}\n\t}\n\n\treturn str;\n}\n\nmodule.exports = function (str) {\n\tif (arguments.length > 1) {\n\t\tstr = Array.from(arguments)\n\t\t\t.map(x => x.trim())\n\t\t\t.filter(x => x.length)\n\t\t\t.join('-');\n\t} else {\n\t\tstr = str.trim();\n\t}\n\n\tif (str.length === 0) {\n\t\treturn '';\n\t}\n\n\tif (str.length === 1) {\n\t\treturn str.toLowerCase();\n\t}\n\n\tif (/^[a-z0-9]+$/.test(str)) {\n\t\treturn str;\n\t}\n\n\tconst hasUpperCase = str !== str.toLowerCase();\n\n\tif (hasUpperCase) {\n\t\tstr = preserveCamelCase(str);\n\t}\n\n\treturn str\n\t\t.replace(/^[_.\\- ]+/, '')\n\t\t.toLowerCase()\n\t\t.replace(/[_.\\- ]+(\\w|$)/g, (m, p1) => p1.toUpperCase());\n};\n\n\n/***/ }),\n/* 228 */\n/***/ (function(module, exports) {\n\nfunction Caseless (dict) {\n  this.dict = dict || {}\n}\nCaseless.prototype.set = function (name, value, clobber) {\n  if (typeof name === 'object') {\n    for (var i in name) {\n      this.set(i, name[i], value)\n    }\n  } else {\n    if (typeof clobber === 'undefined') clobber = true\n    var has = this.has(name)\n\n    if (!clobber && has) this.dict[has] = this.dict[has] + ',' + value\n    else this.dict[has || name] = value\n    return has\n  }\n}\nCaseless.prototype.has = function (name) {\n  var keys = Object.keys(this.dict)\n    , name = name.toLowerCase()\n    ;\n  for (var i=0;i<keys.length;i++) {\n    if (keys[i].toLowerCase() === name) return keys[i]\n  }\n  return false\n}\nCaseless.prototype.get = function (name) {\n  name = name.toLowerCase()\n  var result, _key\n  var headers = this.dict\n  Object.keys(headers).forEach(function (key) {\n    _key = key.toLowerCase()\n    if (name === _key) result = headers[key]\n  })\n  return result\n}\nCaseless.prototype.swap = function (name) {\n  var has = this.has(name)\n  if (has === name) return\n  if (!has) throw new Error('There is no header than matches \"'+name+'\"')\n  this.dict[name] = this.dict[has]\n  delete this.dict[has]\n}\nCaseless.prototype.del = function (name) {\n  var has = this.has(name)\n  return delete this.dict[has || name]\n}\n\nmodule.exports = function (dict) {return new Caseless(dict)}\nmodule.exports.httpify = function (resp, headers) {\n  var c = new Caseless(headers)\n  resp.setHeader = function (key, value, clobber) {\n    if (typeof value === 'undefined') return\n    return c.set(key, value, clobber)\n  }\n  resp.hasHeader = function (key) {\n    return c.has(key)\n  }\n  resp.getHeader = function (key) {\n    return c.get(key)\n  }\n  resp.removeHeader = function (key) {\n    return c.del(key)\n  }\n  resp.headers = c.dict\n  return c\n}\n\n\n/***/ }),\n/* 229 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (xs, fn) {\n    var res = [];\n    for (var i = 0; i < xs.length; i++) {\n        var x = fn(xs[i], i);\n        if (isArray(x)) res.push.apply(res, x);\n        else res.push(x);\n    }\n    return res;\n};\n\nvar isArray = Array.isArray || function (xs) {\n    return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\n\n/***/ }),\n/* 230 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(256);\n__webpack_require__(258);\n__webpack_require__(261);\n__webpack_require__(257);\n__webpack_require__(259);\n__webpack_require__(260);\nmodule.exports = __webpack_require__(31).Promise;\n\n\n/***/ }),\n/* 231 */\n/***/ (function(module, exports) {\n\nmodule.exports = function () { /* empty */ };\n\n\n/***/ }),\n/* 232 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (it, Constructor, name, forbiddenField) {\n  if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n    throw TypeError(name + ': incorrect invocation!');\n  } return it;\n};\n\n\n/***/ }),\n/* 233 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = __webpack_require__(98);\nvar toLength = __webpack_require__(137);\nvar toAbsoluteIndex = __webpack_require__(251);\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this);\n    var length = toLength(O.length);\n    var index = toAbsoluteIndex(fromIndex, length);\n    var value;\n    // Array#includes uses SameValueZero equality algorithm\n    // eslint-disable-next-line no-self-compare\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      // eslint-disable-next-line no-self-compare\n      if (value != value) return true;\n    // Array#indexOf ignores holes, Array#includes - not\n    } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n      if (O[index] === el) return IS_INCLUDES || index || 0;\n    } return !IS_INCLUDES && -1;\n  };\n};\n\n\n/***/ }),\n/* 234 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ctx = __webpack_require__(70);\nvar call = __webpack_require__(238);\nvar isArrayIter = __webpack_require__(237);\nvar anObject = __webpack_require__(35);\nvar toLength = __webpack_require__(137);\nvar getIterFn = __webpack_require__(254);\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n  var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n  var f = ctx(fn, that, entries ? 2 : 1);\n  var index = 0;\n  var length, step, iterator, result;\n  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n  // fast case for arrays with default iterator\n  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n    result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n    if (result === BREAK || result === RETURN) return result;\n  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n    result = call(iterator, f, step.value, entries);\n    if (result === BREAK || result === RETURN) return result;\n  }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n\n\n/***/ }),\n/* 235 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = !__webpack_require__(52) && !__webpack_require__(112)(function () {\n  return Object.defineProperty(__webpack_require__(92)('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n\n/***/ }),\n/* 236 */\n/***/ (function(module, exports) {\n\n// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n  var un = that === undefined;\n  switch (args.length) {\n    case 0: return un ? fn()\n                      : fn.call(that);\n    case 1: return un ? fn(args[0])\n                      : fn.call(that, args[0]);\n    case 2: return un ? fn(args[0], args[1])\n                      : fn.call(that, args[0], args[1]);\n    case 3: return un ? fn(args[0], args[1], args[2])\n                      : fn.call(that, args[0], args[1], args[2]);\n    case 4: return un ? fn(args[0], args[1], args[2], args[3])\n                      : fn.call(that, args[0], args[1], args[2], args[3]);\n  } return fn.apply(that, args);\n};\n\n\n/***/ }),\n/* 237 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// check on default Array iterator\nvar Iterators = __webpack_require__(54);\nvar ITERATOR = __webpack_require__(21)('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n\n\n/***/ }),\n/* 238 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// call something on iterator step with safe closing on error\nvar anObject = __webpack_require__(35);\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n  // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n\n\n/***/ }),\n/* 239 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar create = __webpack_require__(243);\nvar descriptor = __webpack_require__(133);\nvar setToStringTag = __webpack_require__(95);\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__webpack_require__(43)(IteratorPrototype, __webpack_require__(21)('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n\n/***/ }),\n/* 240 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar ITERATOR = __webpack_require__(21)('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function () { SAFE_CLOSING = true; };\n  // eslint-disable-next-line no-throw-literal\n  Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n  try {\n    var arr = [7];\n    var iter = arr[ITERATOR]();\n    iter.next = function () { return { done: safe = true }; };\n    arr[ITERATOR] = function () { return iter; };\n    exec(arr);\n  } catch (e) { /* empty */ }\n  return safe;\n};\n\n\n/***/ }),\n/* 241 */\n/***/ (function(module, exports) {\n\nmodule.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n\n\n/***/ }),\n/* 242 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(17);\nvar macrotask = __webpack_require__(136).set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = __webpack_require__(69)(process) == 'process';\n\nmodule.exports = function () {\n  var head, last, notify;\n\n  var flush = function () {\n    var parent, fn;\n    if (isNode && (parent = process.domain)) parent.exit();\n    while (head) {\n      fn = head.fn;\n      head = head.next;\n      try {\n        fn();\n      } catch (e) {\n        if (head) notify();\n        else last = undefined;\n        throw e;\n      }\n    } last = undefined;\n    if (parent) parent.enter();\n  };\n\n  // Node.js\n  if (isNode) {\n    notify = function () {\n      process.nextTick(flush);\n    };\n  // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n  } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n    var toggle = true;\n    var node = document.createTextNode('');\n    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n    notify = function () {\n      node.data = toggle = !toggle;\n    };\n  // environments with maybe non-completely correct, but existent Promise\n  } else if (Promise && Promise.resolve) {\n    // Promise.resolve without an argument throws an error in LG WebOS 2\n    var promise = Promise.resolve(undefined);\n    notify = function () {\n      promise.then(flush);\n    };\n  // for other environments - macrotask based on:\n  // - setImmediate\n  // - MessageChannel\n  // - window.postMessag\n  // - onreadystatechange\n  // - setTimeout\n  } else {\n    notify = function () {\n      // strange IE + webpack dev server bug - use .call(global)\n      macrotask.call(global, flush);\n    };\n  }\n\n  return function (fn) {\n    var task = { fn: fn, next: undefined };\n    if (last) last.next = task;\n    if (!head) {\n      head = task;\n      notify();\n    } last = task;\n  };\n};\n\n\n/***/ }),\n/* 243 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = __webpack_require__(35);\nvar dPs = __webpack_require__(244);\nvar enumBugKeys = __webpack_require__(128);\nvar IE_PROTO = __webpack_require__(96)('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = __webpack_require__(92)('iframe');\n  var i = enumBugKeys.length;\n  var lt = '<';\n  var gt = '>';\n  var iframeDocument;\n  iframe.style.display = 'none';\n  __webpack_require__(129).appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n  iframeDocument.close();\n  createDict = iframeDocument.F;\n  while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n  return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n  var result;\n  if (O !== null) {\n    Empty[PROTOTYPE] = anObject(O);\n    result = new Empty();\n    Empty[PROTOTYPE] = null;\n    // add \"__proto__\" for Object.getPrototypeOf polyfill\n    result[IE_PROTO] = O;\n  } else result = createDict();\n  return Properties === undefined ? result : dPs(result, Properties);\n};\n\n\n/***/ }),\n/* 244 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar dP = __webpack_require__(72);\nvar anObject = __webpack_require__(35);\nvar getKeys = __webpack_require__(172);\n\nmodule.exports = __webpack_require__(52) ? Object.defineProperties : function defineProperties(O, Properties) {\n  anObject(O);\n  var keys = getKeys(Properties);\n  var length = keys.length;\n  var i = 0;\n  var P;\n  while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n  return O;\n};\n\n\n/***/ }),\n/* 245 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = __webpack_require__(71);\nvar toObject = __webpack_require__(173);\nvar IE_PROTO = __webpack_require__(96)('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n  O = toObject(O);\n  if (has(O, IE_PROTO)) return O[IE_PROTO];\n  if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n    return O.constructor.prototype;\n  } return O instanceof Object ? ObjectProto : null;\n};\n\n\n/***/ }),\n/* 246 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar has = __webpack_require__(71);\nvar toIObject = __webpack_require__(98);\nvar arrayIndexOf = __webpack_require__(233)(false);\nvar IE_PROTO = __webpack_require__(96)('IE_PROTO');\n\nmodule.exports = function (object, names) {\n  var O = toIObject(object);\n  var i = 0;\n  var result = [];\n  var key;\n  for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n  // Don't enum bug & hidden keys\n  while (names.length > i) if (has(O, key = names[i++])) {\n    ~arrayIndexOf(result, key) || result.push(key);\n  }\n  return result;\n};\n\n\n/***/ }),\n/* 247 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar hide = __webpack_require__(43);\nmodule.exports = function (target, src, safe) {\n  for (var key in src) {\n    if (safe && target[key]) target[key] = src[key];\n    else hide(target, key, src[key]);\n  } return target;\n};\n\n\n/***/ }),\n/* 248 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(43);\n\n\n/***/ }),\n/* 249 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar global = __webpack_require__(17);\nvar core = __webpack_require__(31);\nvar dP = __webpack_require__(72);\nvar DESCRIPTORS = __webpack_require__(52);\nvar SPECIES = __webpack_require__(21)('species');\n\nmodule.exports = function (KEY) {\n  var C = typeof core[KEY] == 'function' ? core[KEY] : global[KEY];\n  if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n    configurable: true,\n    get: function () { return this; }\n  });\n};\n\n\n/***/ }),\n/* 250 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(97);\nvar defined = __webpack_require__(91);\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that));\n    var i = toInteger(pos);\n    var l = s.length;\n    var a, b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n      ? TO_STRING ? s.charAt(i) : a\n      : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n\n/***/ }),\n/* 251 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toInteger = __webpack_require__(97);\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n\n/***/ }),\n/* 252 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = __webpack_require__(53);\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n\n/***/ }),\n/* 253 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar global = __webpack_require__(17);\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n\n\n/***/ }),\n/* 254 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar classof = __webpack_require__(127);\nvar ITERATOR = __webpack_require__(21)('iterator');\nvar Iterators = __webpack_require__(54);\nmodule.exports = __webpack_require__(31).getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR]\n    || it['@@iterator']\n    || Iterators[classof(it)];\n};\n\n\n/***/ }),\n/* 255 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar addToUnscopables = __webpack_require__(231);\nvar step = __webpack_require__(241);\nvar Iterators = __webpack_require__(54);\nvar toIObject = __webpack_require__(98);\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = __webpack_require__(130)(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0;                   // next index\n  this._k = kind;                // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var kind = this._k;\n  var index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n\n/***/ }),\n/* 256 */\n/***/ (function(module, exports) {\n\n\n\n/***/ }),\n/* 257 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar LIBRARY = __webpack_require__(93);\nvar global = __webpack_require__(17);\nvar ctx = __webpack_require__(70);\nvar classof = __webpack_require__(127);\nvar $export = __webpack_require__(60);\nvar isObject = __webpack_require__(53);\nvar aFunction = __webpack_require__(68);\nvar anInstance = __webpack_require__(232);\nvar forOf = __webpack_require__(234);\nvar speciesConstructor = __webpack_require__(135);\nvar task = __webpack_require__(136).set;\nvar microtask = __webpack_require__(242)();\nvar newPromiseCapabilityModule = __webpack_require__(94);\nvar perform = __webpack_require__(131);\nvar userAgent = __webpack_require__(253);\nvar promiseResolve = __webpack_require__(132);\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n  try {\n    // correct subclassing with @@species support\n    var promise = $Promise.resolve(1);\n    var FakePromise = (promise.constructor = {})[__webpack_require__(21)('species')] = function (exec) {\n      exec(empty, empty);\n    };\n    // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n    return (isNode || typeof PromiseRejectionEvent == 'function')\n      && promise.then(empty) instanceof FakePromise\n      // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n      // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n      // we can't detect it synchronously, so just check versions\n      && v8.indexOf('6.6') !== 0\n      && userAgent.indexOf('Chrome/66') === -1;\n  } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n  if (promise._n) return;\n  promise._n = true;\n  var chain = promise._c;\n  microtask(function () {\n    var value = promise._v;\n    var ok = promise._s == 1;\n    var i = 0;\n    var run = function (reaction) {\n      var handler = ok ? reaction.ok : reaction.fail;\n      var resolve = reaction.resolve;\n      var reject = reaction.reject;\n      var domain = reaction.domain;\n      var result, then, exited;\n      try {\n        if (handler) {\n          if (!ok) {\n            if (promise._h == 2) onHandleUnhandled(promise);\n            promise._h = 1;\n          }\n          if (handler === true) result = value;\n          else {\n            if (domain) domain.enter();\n            result = handler(value); // may throw\n            if (domain) {\n              domain.exit();\n              exited = true;\n            }\n          }\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (e) {\n        if (domain && !exited) domain.exit();\n        reject(e);\n      }\n    };\n    while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n    promise._c = [];\n    promise._n = false;\n    if (isReject && !promise._h) onUnhandled(promise);\n  });\n};\nvar onUnhandled = function (promise) {\n  task.call(global, function () {\n    var value = promise._v;\n    var unhandled = isUnhandled(promise);\n    var result, handler, console;\n    if (unhandled) {\n      result = perform(function () {\n        if (isNode) {\n          process.emit('unhandledRejection', value, promise);\n        } else if (handler = global.onunhandledrejection) {\n          handler({ promise: promise, reason: value });\n        } else if ((console = global.console) && console.error) {\n          console.error('Unhandled promise rejection', value);\n        }\n      });\n      // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n      promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n    } promise._a = undefined;\n    if (unhandled && result.e) throw result.v;\n  });\n};\nvar isUnhandled = function (promise) {\n  return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n  task.call(global, function () {\n    var handler;\n    if (isNode) {\n      process.emit('rejectionHandled', promise);\n    } else if (handler = global.onrejectionhandled) {\n      handler({ promise: promise, reason: promise._v });\n    }\n  });\n};\nvar $reject = function (value) {\n  var promise = this;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  promise._v = value;\n  promise._s = 2;\n  if (!promise._a) promise._a = promise._c.slice();\n  notify(promise, true);\n};\nvar $resolve = function (value) {\n  var promise = this;\n  var then;\n  if (promise._d) return;\n  promise._d = true;\n  promise = promise._w || promise; // unwrap\n  try {\n    if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n    if (then = isThenable(value)) {\n      microtask(function () {\n        var wrapper = { _w: promise, _d: false }; // wrap\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch (e) {\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      promise._v = value;\n      promise._s = 1;\n      notify(promise, false);\n    }\n  } catch (e) {\n    $reject.call({ _w: promise, _d: false }, e); // wrap\n  }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n  // 25.4.3.1 Promise(executor)\n  $Promise = function Promise(executor) {\n    anInstance(this, $Promise, PROMISE, '_h');\n    aFunction(executor);\n    Internal.call(this);\n    try {\n      executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n    } catch (err) {\n      $reject.call(this, err);\n    }\n  };\n  // eslint-disable-next-line no-unused-vars\n  Internal = function Promise(executor) {\n    this._c = [];             // <- awaiting reactions\n    this._a = undefined;      // <- checked in isUnhandled reactions\n    this._s = 0;              // <- state\n    this._d = false;          // <- done\n    this._v = undefined;      // <- value\n    this._h = 0;              // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n    this._n = false;          // <- notify\n  };\n  Internal.prototype = __webpack_require__(247)($Promise.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected) {\n      var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      reaction.domain = isNode ? process.domain : undefined;\n      this._c.push(reaction);\n      if (this._a) this._a.push(reaction);\n      if (this._s) notify(this, false);\n      return reaction.promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function (onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n  OwnPromiseCapability = function () {\n    var promise = new Internal();\n    this.promise = promise;\n    this.resolve = ctx($resolve, promise, 1);\n    this.reject = ctx($reject, promise, 1);\n  };\n  newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n    return C === $Promise || C === Wrapper\n      ? new OwnPromiseCapability(C)\n      : newGenericPromiseCapability(C);\n  };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\n__webpack_require__(95)($Promise, PROMISE);\n__webpack_require__(249)(PROMISE);\nWrapper = __webpack_require__(31)[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r) {\n    var capability = newPromiseCapability(this);\n    var $$reject = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x) {\n    return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(240)(function (iter) {\n  $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var resolve = capability.resolve;\n    var reject = capability.reject;\n    var result = perform(function () {\n      var values = [];\n      var index = 0;\n      var remaining = 1;\n      forOf(iterable, false, function (promise) {\n        var $index = index++;\n        var alreadyCalled = false;\n        values.push(undefined);\n        remaining++;\n        C.resolve(promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          values[$index] = value;\n          --remaining || resolve(values);\n        }, reject);\n      });\n      --remaining || resolve(values);\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable) {\n    var C = this;\n    var capability = newPromiseCapability(C);\n    var reject = capability.reject;\n    var result = perform(function () {\n      forOf(iterable, false, function (promise) {\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if (result.e) reject(result.v);\n    return capability.promise;\n  }\n});\n\n\n/***/ }),\n/* 258 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar $at = __webpack_require__(250)(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\n__webpack_require__(130)(String, 'String', function (iterated) {\n  this._t = String(iterated); // target\n  this._i = 0;                // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n  var O = this._t;\n  var index = this._i;\n  var point;\n  if (index >= O.length) return { value: undefined, done: true };\n  point = $at(O, index);\n  this._i += point.length;\n  return { value: point, done: false };\n});\n\n\n/***/ }),\n/* 259 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// https://github.com/tc39/proposal-promise-finally\n\nvar $export = __webpack_require__(60);\nvar core = __webpack_require__(31);\nvar global = __webpack_require__(17);\nvar speciesConstructor = __webpack_require__(135);\nvar promiseResolve = __webpack_require__(132);\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n  var C = speciesConstructor(this, core.Promise || global.Promise);\n  var isFunction = typeof onFinally == 'function';\n  return this.then(\n    isFunction ? function (x) {\n      return promiseResolve(C, onFinally()).then(function () { return x; });\n    } : onFinally,\n    isFunction ? function (e) {\n      return promiseResolve(C, onFinally()).then(function () { throw e; });\n    } : onFinally\n  );\n} });\n\n\n/***/ }),\n/* 260 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// https://github.com/tc39/proposal-promise-try\nvar $export = __webpack_require__(60);\nvar newPromiseCapability = __webpack_require__(94);\nvar perform = __webpack_require__(131);\n\n$export($export.S, 'Promise', { 'try': function (callbackfn) {\n  var promiseCapability = newPromiseCapability.f(this);\n  var result = perform(callbackfn);\n  (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);\n  return promiseCapability.promise;\n} });\n\n\n/***/ }),\n/* 261 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(255);\nvar global = __webpack_require__(17);\nvar hide = __webpack_require__(43);\nvar Iterators = __webpack_require__(54);\nvar TO_STRING_TAG = __webpack_require__(21)('toStringTag');\n\nvar DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +\n  'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +\n  'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +\n  'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +\n  'TextTrackList,TouchList').split(',');\n\nfor (var i = 0; i < DOMIterables.length; i++) {\n  var NAME = DOMIterables[i];\n  var Collection = global[NAME];\n  var proto = Collection && Collection.prototype;\n  if (proto && !proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n  Iterators[NAME] = Iterators.Array;\n}\n\n\n/***/ }),\n/* 262 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = __webpack_require__(139);\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n               && 'undefined' != typeof chrome.storage\n                  ? chrome.storage.local\n                  : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n  '#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC',\n  '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF',\n  '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC',\n  '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF',\n  '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC',\n  '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033',\n  '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366',\n  '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933',\n  '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC',\n  '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF',\n  '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n  // NB: In an Electron preload script, document will be defined but not fully\n  // initialized. Since we know we're in Chrome, we'll just detect this case\n  // explicitly\n  if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n    return true;\n  }\n\n  // Internet Explorer and Edge do not support colors.\n  if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n    return false;\n  }\n\n  // is webkit? http://stackoverflow.com/a/16459606/376773\n  // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n  return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n    // is firebug? http://stackoverflow.com/a/398120/376773\n    (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n    // is firefox >= v31?\n    // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n    // double check webkit in userAgent just in case we are in a worker\n    (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n  try {\n    return JSON.stringify(v);\n  } catch (err) {\n    return '[UnexpectedJSONParseError]: ' + err.message;\n  }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n  var useColors = this.useColors;\n\n  args[0] = (useColors ? '%c' : '')\n    + this.namespace\n    + (useColors ? ' %c' : ' ')\n    + args[0]\n    + (useColors ? '%c ' : ' ')\n    + '+' + exports.humanize(this.diff);\n\n  if (!useColors) return;\n\n  var c = 'color: ' + this.color;\n  args.splice(1, 0, c, 'color: inherit')\n\n  // the final \"%c\" is somewhat tricky, because there could be other\n  // arguments passed either before or after the %c, so we need to\n  // figure out the correct index to insert the CSS into\n  var index = 0;\n  var lastC = 0;\n  args[0].replace(/%[a-zA-Z%]/g, function(match) {\n    if ('%%' === match) return;\n    index++;\n    if ('%c' === match) {\n      // we only are interested in the *last* %c\n      // (the user may have provided their own)\n      lastC = index;\n    }\n  });\n\n  args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n  // this hackery is required for IE8/9, where\n  // the `console.log` function doesn't have 'apply'\n  return 'object' === typeof console\n    && console.log\n    && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n  try {\n    if (null == namespaces) {\n      exports.storage.removeItem('debug');\n    } else {\n      exports.storage.debug = namespaces;\n    }\n  } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n  var r;\n  try {\n    r = exports.storage.debug;\n  } catch(e) {}\n\n  // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n  if (!r && typeof process !== 'undefined' && 'env' in process) {\n    r = process.env.DEBUG;\n  }\n\n  return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n  try {\n    return window.localStorage;\n  } catch (e) {}\n}\n\n\n/***/ }),\n/* 263 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n * Detect Electron renderer process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer') {\n  module.exports = __webpack_require__(262);\n} else {\n  module.exports = __webpack_require__(264);\n}\n\n\n/***/ }),\n/* 264 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n * Module dependencies.\n */\n\nvar tty = __webpack_require__(104);\nvar util = __webpack_require__(3);\n\n/**\n * This is the Node.js implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = __webpack_require__(139);\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\n\n/**\n * Colors.\n */\n\nexports.colors = [ 6, 2, 3, 4, 5, 1 ];\n\ntry {\n  var supportsColor = __webpack_require__(331);\n  if (supportsColor && supportsColor.level >= 2) {\n    exports.colors = [\n      20, 21, 26, 27, 32, 33, 38, 39, 40, 41, 42, 43, 44, 45, 56, 57, 62, 63, 68,\n      69, 74, 75, 76, 77, 78, 79, 80, 81, 92, 93, 98, 99, 112, 113, 128, 129, 134,\n      135, 148, 149, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171,\n      172, 173, 178, 179, 184, 185, 196, 197, 198, 199, 200, 201, 202, 203, 204,\n      205, 206, 207, 208, 209, 214, 215, 220, 221\n    ];\n  }\n} catch (err) {\n  // swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(function (key) {\n  return /^debug_/i.test(key);\n}).reduce(function (obj, key) {\n  // camel-case\n  var prop = key\n    .substring(6)\n    .toLowerCase()\n    .replace(/_([a-z])/g, function (_, k) { return k.toUpperCase() });\n\n  // coerce string value into JS value\n  var val = process.env[key];\n  if (/^(yes|on|true|enabled)$/i.test(val)) val = true;\n  else if (/^(no|off|false|disabled)$/i.test(val)) val = false;\n  else if (val === 'null') val = null;\n  else val = Number(val);\n\n  obj[prop] = val;\n  return obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n  return 'colors' in exports.inspectOpts\n    ? Boolean(exports.inspectOpts.colors)\n    : tty.isatty(process.stderr.fd);\n}\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nexports.formatters.o = function(v) {\n  this.inspectOpts.colors = this.useColors;\n  return util.inspect(v, this.inspectOpts)\n    .split('\\n').map(function(str) {\n      return str.trim()\n    }).join(' ');\n};\n\n/**\n * Map %o to `util.inspect()`, allowing multiple lines if needed.\n */\n\nexports.formatters.O = function(v) {\n  this.inspectOpts.colors = this.useColors;\n  return util.inspect(v, this.inspectOpts);\n};\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n  var name = this.namespace;\n  var useColors = this.useColors;\n\n  if (useColors) {\n    var c = this.color;\n    var colorCode = '\\u001b[3' + (c < 8 ? c : '8;5;' + c);\n    var prefix = '  ' + colorCode + ';1m' + name + ' ' + '\\u001b[0m';\n\n    args[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n    args.push(colorCode + 'm+' + exports.humanize(this.diff) + '\\u001b[0m');\n  } else {\n    args[0] = getDate() + name + ' ' + args[0];\n  }\n}\n\nfunction getDate() {\n  if (exports.inspectOpts.hideDate) {\n    return '';\n  } else {\n    return new Date().toISOString() + ' ';\n  }\n}\n\n/**\n * Invokes `util.format()` with the specified arguments and writes to stderr.\n */\n\nfunction log() {\n  return process.stderr.write(util.format.apply(util, arguments) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n  if (null == namespaces) {\n    // If you set a process.env field to null or undefined, it gets cast to the\n    // string 'null' or 'undefined'. Just delete instead.\n    delete process.env.DEBUG;\n  } else {\n    process.env.DEBUG = namespaces;\n  }\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n  return process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init (debug) {\n  debug.inspectOpts = {};\n\n  var keys = Object.keys(exports.inspectOpts);\n  for (var i = 0; i < keys.length; i++) {\n    debug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n  }\n}\n\n/**\n * Enable namespaces listed in `process.env.DEBUG` initially.\n */\n\nexports.enable(load());\n\n\n/***/ }),\n/* 265 */\n/***/ (function(module, exports, __webpack_require__) {\n\n(function webpackUniversalModuleDefinition(root, factory) {\n/* istanbul ignore next */\n\tif(true)\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n/* istanbul ignore next */\n\telse if(typeof exports === 'object')\n\t\texports[\"esprima\"] = factory();\n\telse\n\t\troot[\"esprima\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n\n/******/ \t\t// Check if module is in cache\n/* istanbul ignore if */\n/******/ \t\tif(installedModules[moduleId])\n/******/ \t\t\treturn installedModules[moduleId].exports;\n\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\texports: {},\n/******/ \t\t\tid: moduleId,\n/******/ \t\t\tloaded: false\n/******/ \t\t};\n\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.loaded = true;\n\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n\n\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\t/*\n\t  Copyright JS Foundation and other contributors, https://js.foundation/\n\n\t  Redistribution and use in source and binary forms, with or without\n\t  modification, are permitted provided that the following conditions are met:\n\n\t    * Redistributions of source code must retain the above copyright\n\t      notice, this list of conditions and the following disclaimer.\n\t    * Redistributions in binary form must reproduce the above copyright\n\t      notice, this list of conditions and the following disclaimer in the\n\t      documentation and/or other materials provided with the distribution.\n\n\t  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n\t  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n\t  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n\t  ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n\t  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n\t  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n\t  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n\t  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n\t  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t*/\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar comment_handler_1 = __webpack_require__(1);\n\tvar jsx_parser_1 = __webpack_require__(3);\n\tvar parser_1 = __webpack_require__(8);\n\tvar tokenizer_1 = __webpack_require__(15);\n\tfunction parse(code, options, delegate) {\n\t    var commentHandler = null;\n\t    var proxyDelegate = function (node, metadata) {\n\t        if (delegate) {\n\t            delegate(node, metadata);\n\t        }\n\t        if (commentHandler) {\n\t            commentHandler.visit(node, metadata);\n\t        }\n\t    };\n\t    var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null;\n\t    var collectComment = false;\n\t    if (options) {\n\t        collectComment = (typeof options.comment === 'boolean' && options.comment);\n\t        var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment);\n\t        if (collectComment || attachComment) {\n\t            commentHandler = new comment_handler_1.CommentHandler();\n\t            commentHandler.attach = attachComment;\n\t            options.comment = true;\n\t            parserDelegate = proxyDelegate;\n\t        }\n\t    }\n\t    var isModule = false;\n\t    if (options && typeof options.sourceType === 'string') {\n\t        isModule = (options.sourceType === 'module');\n\t    }\n\t    var parser;\n\t    if (options && typeof options.jsx === 'boolean' && options.jsx) {\n\t        parser = new jsx_parser_1.JSXParser(code, options, parserDelegate);\n\t    }\n\t    else {\n\t        parser = new parser_1.Parser(code, options, parserDelegate);\n\t    }\n\t    var program = isModule ? parser.parseModule() : parser.parseScript();\n\t    var ast = program;\n\t    if (collectComment && commentHandler) {\n\t        ast.comments = commentHandler.comments;\n\t    }\n\t    if (parser.config.tokens) {\n\t        ast.tokens = parser.tokens;\n\t    }\n\t    if (parser.config.tolerant) {\n\t        ast.errors = parser.errorHandler.errors;\n\t    }\n\t    return ast;\n\t}\n\texports.parse = parse;\n\tfunction parseModule(code, options, delegate) {\n\t    var parsingOptions = options || {};\n\t    parsingOptions.sourceType = 'module';\n\t    return parse(code, parsingOptions, delegate);\n\t}\n\texports.parseModule = parseModule;\n\tfunction parseScript(code, options, delegate) {\n\t    var parsingOptions = options || {};\n\t    parsingOptions.sourceType = 'script';\n\t    return parse(code, parsingOptions, delegate);\n\t}\n\texports.parseScript = parseScript;\n\tfunction tokenize(code, options, delegate) {\n\t    var tokenizer = new tokenizer_1.Tokenizer(code, options);\n\t    var tokens;\n\t    tokens = [];\n\t    try {\n\t        while (true) {\n\t            var token = tokenizer.getNextToken();\n\t            if (!token) {\n\t                break;\n\t            }\n\t            if (delegate) {\n\t                token = delegate(token);\n\t            }\n\t            tokens.push(token);\n\t        }\n\t    }\n\t    catch (e) {\n\t        tokenizer.errorHandler.tolerate(e);\n\t    }\n\t    if (tokenizer.errorHandler.tolerant) {\n\t        tokens.errors = tokenizer.errors();\n\t    }\n\t    return tokens;\n\t}\n\texports.tokenize = tokenize;\n\tvar syntax_1 = __webpack_require__(2);\n\texports.Syntax = syntax_1.Syntax;\n\t// Sync with *.json manifests.\n\texports.version = '4.0.1';\n\n\n/***/ },\n/* 1 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar syntax_1 = __webpack_require__(2);\n\tvar CommentHandler = (function () {\n\t    function CommentHandler() {\n\t        this.attach = false;\n\t        this.comments = [];\n\t        this.stack = [];\n\t        this.leading = [];\n\t        this.trailing = [];\n\t    }\n\t    CommentHandler.prototype.insertInnerComments = function (node, metadata) {\n\t        //  innnerComments for properties empty block\n\t        //  `function a() {/** comments **\\/}`\n\t        if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) {\n\t            var innerComments = [];\n\t            for (var i = this.leading.length - 1; i >= 0; --i) {\n\t                var entry = this.leading[i];\n\t                if (metadata.end.offset >= entry.start) {\n\t                    innerComments.unshift(entry.comment);\n\t                    this.leading.splice(i, 1);\n\t                    this.trailing.splice(i, 1);\n\t                }\n\t            }\n\t            if (innerComments.length) {\n\t                node.innerComments = innerComments;\n\t            }\n\t        }\n\t    };\n\t    CommentHandler.prototype.findTrailingComments = function (metadata) {\n\t        var trailingComments = [];\n\t        if (this.trailing.length > 0) {\n\t            for (var i = this.trailing.length - 1; i >= 0; --i) {\n\t                var entry_1 = this.trailing[i];\n\t                if (entry_1.start >= metadata.end.offset) {\n\t                    trailingComments.unshift(entry_1.comment);\n\t                }\n\t            }\n\t            this.trailing.length = 0;\n\t            return trailingComments;\n\t        }\n\t        var entry = this.stack[this.stack.length - 1];\n\t        if (entry && entry.node.trailingComments) {\n\t            var firstComment = entry.node.trailingComments[0];\n\t            if (firstComment && firstComment.range[0] >= metadata.end.offset) {\n\t                trailingComments = entry.node.trailingComments;\n\t                delete entry.node.trailingComments;\n\t            }\n\t        }\n\t        return trailingComments;\n\t    };\n\t    CommentHandler.prototype.findLeadingComments = function (metadata) {\n\t        var leadingComments = [];\n\t        var target;\n\t        while (this.stack.length > 0) {\n\t            var entry = this.stack[this.stack.length - 1];\n\t            if (entry && entry.start >= metadata.start.offset) {\n\t                target = entry.node;\n\t                this.stack.pop();\n\t            }\n\t            else {\n\t                break;\n\t            }\n\t        }\n\t        if (target) {\n\t            var count = target.leadingComments ? target.leadingComments.length : 0;\n\t            for (var i = count - 1; i >= 0; --i) {\n\t                var comment = target.leadingComments[i];\n\t                if (comment.range[1] <= metadata.start.offset) {\n\t                    leadingComments.unshift(comment);\n\t                    target.leadingComments.splice(i, 1);\n\t                }\n\t            }\n\t            if (target.leadingComments && target.leadingComments.length === 0) {\n\t                delete target.leadingComments;\n\t            }\n\t            return leadingComments;\n\t        }\n\t        for (var i = this.leading.length - 1; i >= 0; --i) {\n\t            var entry = this.leading[i];\n\t            if (entry.start <= metadata.start.offset) {\n\t                leadingComments.unshift(entry.comment);\n\t                this.leading.splice(i, 1);\n\t            }\n\t        }\n\t        return leadingComments;\n\t    };\n\t    CommentHandler.prototype.visitNode = function (node, metadata) {\n\t        if (node.type === syntax_1.Syntax.Program && node.body.length > 0) {\n\t            return;\n\t        }\n\t        this.insertInnerComments(node, metadata);\n\t        var trailingComments = this.findTrailingComments(metadata);\n\t        var leadingComments = this.findLeadingComments(metadata);\n\t        if (leadingComments.length > 0) {\n\t            node.leadingComments = leadingComments;\n\t        }\n\t        if (trailingComments.length > 0) {\n\t            node.trailingComments = trailingComments;\n\t        }\n\t        this.stack.push({\n\t            node: node,\n\t            start: metadata.start.offset\n\t        });\n\t    };\n\t    CommentHandler.prototype.visitComment = function (node, metadata) {\n\t        var type = (node.type[0] === 'L') ? 'Line' : 'Block';\n\t        var comment = {\n\t            type: type,\n\t            value: node.value\n\t        };\n\t        if (node.range) {\n\t            comment.range = node.range;\n\t        }\n\t        if (node.loc) {\n\t            comment.loc = node.loc;\n\t        }\n\t        this.comments.push(comment);\n\t        if (this.attach) {\n\t            var entry = {\n\t                comment: {\n\t                    type: type,\n\t                    value: node.value,\n\t                    range: [metadata.start.offset, metadata.end.offset]\n\t                },\n\t                start: metadata.start.offset\n\t            };\n\t            if (node.loc) {\n\t                entry.comment.loc = node.loc;\n\t            }\n\t            node.type = type;\n\t            this.leading.push(entry);\n\t            this.trailing.push(entry);\n\t        }\n\t    };\n\t    CommentHandler.prototype.visit = function (node, metadata) {\n\t        if (node.type === 'LineComment') {\n\t            this.visitComment(node, metadata);\n\t        }\n\t        else if (node.type === 'BlockComment') {\n\t            this.visitComment(node, metadata);\n\t        }\n\t        else if (this.attach) {\n\t            this.visitNode(node, metadata);\n\t        }\n\t    };\n\t    return CommentHandler;\n\t}());\n\texports.CommentHandler = CommentHandler;\n\n\n/***/ },\n/* 2 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.Syntax = {\n\t    AssignmentExpression: 'AssignmentExpression',\n\t    AssignmentPattern: 'AssignmentPattern',\n\t    ArrayExpression: 'ArrayExpression',\n\t    ArrayPattern: 'ArrayPattern',\n\t    ArrowFunctionExpression: 'ArrowFunctionExpression',\n\t    AwaitExpression: 'AwaitExpression',\n\t    BlockStatement: 'BlockStatement',\n\t    BinaryExpression: 'BinaryExpression',\n\t    BreakStatement: 'BreakStatement',\n\t    CallExpression: 'CallExpression',\n\t    CatchClause: 'CatchClause',\n\t    ClassBody: 'ClassBody',\n\t    ClassDeclaration: 'ClassDeclaration',\n\t    ClassExpression: 'ClassExpression',\n\t    ConditionalExpression: 'ConditionalExpression',\n\t    ContinueStatement: 'ContinueStatement',\n\t    DoWhileStatement: 'DoWhileStatement',\n\t    DebuggerStatement: 'DebuggerStatement',\n\t    EmptyStatement: 'EmptyStatement',\n\t    ExportAllDeclaration: 'ExportAllDeclaration',\n\t    ExportDefaultDeclaration: 'ExportDefaultDeclaration',\n\t    ExportNamedDeclaration: 'ExportNamedDeclaration',\n\t    ExportSpecifier: 'ExportSpecifier',\n\t    ExpressionStatement: 'ExpressionStatement',\n\t    ForStatement: 'ForStatement',\n\t    ForOfStatement: 'ForOfStatement',\n\t    ForInStatement: 'ForInStatement',\n\t    FunctionDeclaration: 'FunctionDeclaration',\n\t    FunctionExpression: 'FunctionExpression',\n\t    Identifier: 'Identifier',\n\t    IfStatement: 'IfStatement',\n\t    ImportDeclaration: 'ImportDeclaration',\n\t    ImportDefaultSpecifier: 'ImportDefaultSpecifier',\n\t    ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',\n\t    ImportSpecifier: 'ImportSpecifier',\n\t    Literal: 'Literal',\n\t    LabeledStatement: 'LabeledStatement',\n\t    LogicalExpression: 'LogicalExpression',\n\t    MemberExpression: 'MemberExpression',\n\t    MetaProperty: 'MetaProperty',\n\t    MethodDefinition: 'MethodDefinition',\n\t    NewExpression: 'NewExpression',\n\t    ObjectExpression: 'ObjectExpression',\n\t    ObjectPattern: 'ObjectPattern',\n\t    Program: 'Program',\n\t    Property: 'Property',\n\t    RestElement: 'RestElement',\n\t    ReturnStatement: 'ReturnStatement',\n\t    SequenceExpression: 'SequenceExpression',\n\t    SpreadElement: 'SpreadElement',\n\t    Super: 'Super',\n\t    SwitchCase: 'SwitchCase',\n\t    SwitchStatement: 'SwitchStatement',\n\t    TaggedTemplateExpression: 'TaggedTemplateExpression',\n\t    TemplateElement: 'TemplateElement',\n\t    TemplateLiteral: 'TemplateLiteral',\n\t    ThisExpression: 'ThisExpression',\n\t    ThrowStatement: 'ThrowStatement',\n\t    TryStatement: 'TryStatement',\n\t    UnaryExpression: 'UnaryExpression',\n\t    UpdateExpression: 'UpdateExpression',\n\t    VariableDeclaration: 'VariableDeclaration',\n\t    VariableDeclarator: 'VariableDeclarator',\n\t    WhileStatement: 'WhileStatement',\n\t    WithStatement: 'WithStatement',\n\t    YieldExpression: 'YieldExpression'\n\t};\n\n\n/***/ },\n/* 3 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n/* istanbul ignore next */\n\tvar __extends = (this && this.__extends) || (function () {\n\t    var extendStatics = Object.setPrototypeOf ||\n\t        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n\t        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n\t    return function (d, b) {\n\t        extendStatics(d, b);\n\t        function __() { this.constructor = d; }\n\t        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t    };\n\t})();\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar character_1 = __webpack_require__(4);\n\tvar JSXNode = __webpack_require__(5);\n\tvar jsx_syntax_1 = __webpack_require__(6);\n\tvar Node = __webpack_require__(7);\n\tvar parser_1 = __webpack_require__(8);\n\tvar token_1 = __webpack_require__(13);\n\tvar xhtml_entities_1 = __webpack_require__(14);\n\ttoken_1.TokenName[100 /* Identifier */] = 'JSXIdentifier';\n\ttoken_1.TokenName[101 /* Text */] = 'JSXText';\n\t// Fully qualified element name, e.g. <svg:path> returns \"svg:path\"\n\tfunction getQualifiedElementName(elementName) {\n\t    var qualifiedName;\n\t    switch (elementName.type) {\n\t        case jsx_syntax_1.JSXSyntax.JSXIdentifier:\n\t            var id = elementName;\n\t            qualifiedName = id.name;\n\t            break;\n\t        case jsx_syntax_1.JSXSyntax.JSXNamespacedName:\n\t            var ns = elementName;\n\t            qualifiedName = getQualifiedElementName(ns.namespace) + ':' +\n\t                getQualifiedElementName(ns.name);\n\t            break;\n\t        case jsx_syntax_1.JSXSyntax.JSXMemberExpression:\n\t            var expr = elementName;\n\t            qualifiedName = getQualifiedElementName(expr.object) + '.' +\n\t                getQualifiedElementName(expr.property);\n\t            break;\n\t        /* istanbul ignore next */\n\t        default:\n\t            break;\n\t    }\n\t    return qualifiedName;\n\t}\n\tvar JSXParser = (function (_super) {\n\t    __extends(JSXParser, _super);\n\t    function JSXParser(code, options, delegate) {\n\t        return _super.call(this, code, options, delegate) || this;\n\t    }\n\t    JSXParser.prototype.parsePrimaryExpression = function () {\n\t        return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this);\n\t    };\n\t    JSXParser.prototype.startJSX = function () {\n\t        // Unwind the scanner before the lookahead token.\n\t        this.scanner.index = this.startMarker.index;\n\t        this.scanner.lineNumber = this.startMarker.line;\n\t        this.scanner.lineStart = this.startMarker.index - this.startMarker.column;\n\t    };\n\t    JSXParser.prototype.finishJSX = function () {\n\t        // Prime the next lookahead.\n\t        this.nextToken();\n\t    };\n\t    JSXParser.prototype.reenterJSX = function () {\n\t        this.startJSX();\n\t        this.expectJSX('}');\n\t        // Pop the closing '}' added from the lookahead.\n\t        if (this.config.tokens) {\n\t            this.tokens.pop();\n\t        }\n\t    };\n\t    JSXParser.prototype.createJSXNode = function () {\n\t        this.collectComments();\n\t        return {\n\t            index: this.scanner.index,\n\t            line: this.scanner.lineNumber,\n\t            column: this.scanner.index - this.scanner.lineStart\n\t        };\n\t    };\n\t    JSXParser.prototype.createJSXChildNode = function () {\n\t        return {\n\t            index: this.scanner.index,\n\t            line: this.scanner.lineNumber,\n\t            column: this.scanner.index - this.scanner.lineStart\n\t        };\n\t    };\n\t    JSXParser.prototype.scanXHTMLEntity = function (quote) {\n\t        var result = '&';\n\t        var valid = true;\n\t        var terminated = false;\n\t        var numeric = false;\n\t        var hex = false;\n\t        while (!this.scanner.eof() && valid && !terminated) {\n\t            var ch = this.scanner.source[this.scanner.index];\n\t            if (ch === quote) {\n\t                break;\n\t            }\n\t            terminated = (ch === ';');\n\t            result += ch;\n\t            ++this.scanner.index;\n\t            if (!terminated) {\n\t                switch (result.length) {\n\t                    case 2:\n\t                        // e.g. '&#123;'\n\t                        numeric = (ch === '#');\n\t                        break;\n\t                    case 3:\n\t                        if (numeric) {\n\t                            // e.g. '&#x41;'\n\t                            hex = (ch === 'x');\n\t                            valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0));\n\t                            numeric = numeric && !hex;\n\t                        }\n\t                        break;\n\t                    default:\n\t                        valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0)));\n\t                        valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0)));\n\t                        break;\n\t                }\n\t            }\n\t        }\n\t        if (valid && terminated && result.length > 2) {\n\t            // e.g. '&#x41;' becomes just '#x41'\n\t            var str = result.substr(1, result.length - 2);\n\t            if (numeric && str.length > 1) {\n\t                result = String.fromCharCode(parseInt(str.substr(1), 10));\n\t            }\n\t            else if (hex && str.length > 2) {\n\t                result = String.fromCharCode(parseInt('0' + str.substr(1), 16));\n\t            }\n\t            else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) {\n\t                result = xhtml_entities_1.XHTMLEntities[str];\n\t            }\n\t        }\n\t        return result;\n\t    };\n\t    // Scan the next JSX token. This replaces Scanner#lex when in JSX mode.\n\t    JSXParser.prototype.lexJSX = function () {\n\t        var cp = this.scanner.source.charCodeAt(this.scanner.index);\n\t        // < > / : = { }\n\t        if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) {\n\t            var value = this.scanner.source[this.scanner.index++];\n\t            return {\n\t                type: 7 /* Punctuator */,\n\t                value: value,\n\t                lineNumber: this.scanner.lineNumber,\n\t                lineStart: this.scanner.lineStart,\n\t                start: this.scanner.index - 1,\n\t                end: this.scanner.index\n\t            };\n\t        }\n\t        // \" '\n\t        if (cp === 34 || cp === 39) {\n\t            var start = this.scanner.index;\n\t            var quote = this.scanner.source[this.scanner.index++];\n\t            var str = '';\n\t            while (!this.scanner.eof()) {\n\t                var ch = this.scanner.source[this.scanner.index++];\n\t                if (ch === quote) {\n\t                    break;\n\t                }\n\t                else if (ch === '&') {\n\t                    str += this.scanXHTMLEntity(quote);\n\t                }\n\t                else {\n\t                    str += ch;\n\t                }\n\t            }\n\t            return {\n\t                type: 8 /* StringLiteral */,\n\t                value: str,\n\t                lineNumber: this.scanner.lineNumber,\n\t                lineStart: this.scanner.lineStart,\n\t                start: start,\n\t                end: this.scanner.index\n\t            };\n\t        }\n\t        // ... or .\n\t        if (cp === 46) {\n\t            var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1);\n\t            var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2);\n\t            var value = (n1 === 46 && n2 === 46) ? '...' : '.';\n\t            var start = this.scanner.index;\n\t            this.scanner.index += value.length;\n\t            return {\n\t                type: 7 /* Punctuator */,\n\t                value: value,\n\t                lineNumber: this.scanner.lineNumber,\n\t                lineStart: this.scanner.lineStart,\n\t                start: start,\n\t                end: this.scanner.index\n\t            };\n\t        }\n\t        // `\n\t        if (cp === 96) {\n\t            // Only placeholder, since it will be rescanned as a real assignment expression.\n\t            return {\n\t                type: 10 /* Template */,\n\t                value: '',\n\t                lineNumber: this.scanner.lineNumber,\n\t                lineStart: this.scanner.lineStart,\n\t                start: this.scanner.index,\n\t                end: this.scanner.index\n\t            };\n\t        }\n\t        // Identifer can not contain backslash (char code 92).\n\t        if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) {\n\t            var start = this.scanner.index;\n\t            ++this.scanner.index;\n\t            while (!this.scanner.eof()) {\n\t                var ch = this.scanner.source.charCodeAt(this.scanner.index);\n\t                if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) {\n\t                    ++this.scanner.index;\n\t                }\n\t                else if (ch === 45) {\n\t                    // Hyphen (char code 45) can be part of an identifier.\n\t                    ++this.scanner.index;\n\t                }\n\t                else {\n\t                    break;\n\t                }\n\t            }\n\t            var id = this.scanner.source.slice(start, this.scanner.index);\n\t            return {\n\t                type: 100 /* Identifier */,\n\t                value: id,\n\t                lineNumber: this.scanner.lineNumber,\n\t                lineStart: this.scanner.lineStart,\n\t                start: start,\n\t                end: this.scanner.index\n\t            };\n\t        }\n\t        return this.scanner.lex();\n\t    };\n\t    JSXParser.prototype.nextJSXToken = function () {\n\t        this.collectComments();\n\t        this.startMarker.index = this.scanner.index;\n\t        this.startMarker.line = this.scanner.lineNumber;\n\t        this.startMarker.column = this.scanner.index - this.scanner.lineStart;\n\t        var token = this.lexJSX();\n\t        this.lastMarker.index = this.scanner.index;\n\t        this.lastMarker.line = this.scanner.lineNumber;\n\t        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;\n\t        if (this.config.tokens) {\n\t            this.tokens.push(this.convertToken(token));\n\t        }\n\t        return token;\n\t    };\n\t    JSXParser.prototype.nextJSXText = function () {\n\t        this.startMarker.index = this.scanner.index;\n\t        this.startMarker.line = this.scanner.lineNumber;\n\t        this.startMarker.column = this.scanner.index - this.scanner.lineStart;\n\t        var start = this.scanner.index;\n\t        var text = '';\n\t        while (!this.scanner.eof()) {\n\t            var ch = this.scanner.source[this.scanner.index];\n\t            if (ch === '{' || ch === '<') {\n\t                break;\n\t            }\n\t            ++this.scanner.index;\n\t            text += ch;\n\t            if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                ++this.scanner.lineNumber;\n\t                if (ch === '\\r' && this.scanner.source[this.scanner.index] === '\\n') {\n\t                    ++this.scanner.index;\n\t                }\n\t                this.scanner.lineStart = this.scanner.index;\n\t            }\n\t        }\n\t        this.lastMarker.index = this.scanner.index;\n\t        this.lastMarker.line = this.scanner.lineNumber;\n\t        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;\n\t        var token = {\n\t            type: 101 /* Text */,\n\t            value: text,\n\t            lineNumber: this.scanner.lineNumber,\n\t            lineStart: this.scanner.lineStart,\n\t            start: start,\n\t            end: this.scanner.index\n\t        };\n\t        if ((text.length > 0) && this.config.tokens) {\n\t            this.tokens.push(this.convertToken(token));\n\t        }\n\t        return token;\n\t    };\n\t    JSXParser.prototype.peekJSXToken = function () {\n\t        var state = this.scanner.saveState();\n\t        this.scanner.scanComments();\n\t        var next = this.lexJSX();\n\t        this.scanner.restoreState(state);\n\t        return next;\n\t    };\n\t    // Expect the next JSX token to match the specified punctuator.\n\t    // If not, an exception will be thrown.\n\t    JSXParser.prototype.expectJSX = function (value) {\n\t        var token = this.nextJSXToken();\n\t        if (token.type !== 7 /* Punctuator */ || token.value !== value) {\n\t            this.throwUnexpectedToken(token);\n\t        }\n\t    };\n\t    // Return true if the next JSX token matches the specified punctuator.\n\t    JSXParser.prototype.matchJSX = function (value) {\n\t        var next = this.peekJSXToken();\n\t        return next.type === 7 /* Punctuator */ && next.value === value;\n\t    };\n\t    JSXParser.prototype.parseJSXIdentifier = function () {\n\t        var node = this.createJSXNode();\n\t        var token = this.nextJSXToken();\n\t        if (token.type !== 100 /* Identifier */) {\n\t            this.throwUnexpectedToken(token);\n\t        }\n\t        return this.finalize(node, new JSXNode.JSXIdentifier(token.value));\n\t    };\n\t    JSXParser.prototype.parseJSXElementName = function () {\n\t        var node = this.createJSXNode();\n\t        var elementName = this.parseJSXIdentifier();\n\t        if (this.matchJSX(':')) {\n\t            var namespace = elementName;\n\t            this.expectJSX(':');\n\t            var name_1 = this.parseJSXIdentifier();\n\t            elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1));\n\t        }\n\t        else if (this.matchJSX('.')) {\n\t            while (this.matchJSX('.')) {\n\t                var object = elementName;\n\t                this.expectJSX('.');\n\t                var property = this.parseJSXIdentifier();\n\t                elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property));\n\t            }\n\t        }\n\t        return elementName;\n\t    };\n\t    JSXParser.prototype.parseJSXAttributeName = function () {\n\t        var node = this.createJSXNode();\n\t        var attributeName;\n\t        var identifier = this.parseJSXIdentifier();\n\t        if (this.matchJSX(':')) {\n\t            var namespace = identifier;\n\t            this.expectJSX(':');\n\t            var name_2 = this.parseJSXIdentifier();\n\t            attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2));\n\t        }\n\t        else {\n\t            attributeName = identifier;\n\t        }\n\t        return attributeName;\n\t    };\n\t    JSXParser.prototype.parseJSXStringLiteralAttribute = function () {\n\t        var node = this.createJSXNode();\n\t        var token = this.nextJSXToken();\n\t        if (token.type !== 8 /* StringLiteral */) {\n\t            this.throwUnexpectedToken(token);\n\t        }\n\t        var raw = this.getTokenRaw(token);\n\t        return this.finalize(node, new Node.Literal(token.value, raw));\n\t    };\n\t    JSXParser.prototype.parseJSXExpressionAttribute = function () {\n\t        var node = this.createJSXNode();\n\t        this.expectJSX('{');\n\t        this.finishJSX();\n\t        if (this.match('}')) {\n\t            this.tolerateError('JSX attributes must only be assigned a non-empty expression');\n\t        }\n\t        var expression = this.parseAssignmentExpression();\n\t        this.reenterJSX();\n\t        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));\n\t    };\n\t    JSXParser.prototype.parseJSXAttributeValue = function () {\n\t        return this.matchJSX('{') ? this.parseJSXExpressionAttribute() :\n\t            this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute();\n\t    };\n\t    JSXParser.prototype.parseJSXNameValueAttribute = function () {\n\t        var node = this.createJSXNode();\n\t        var name = this.parseJSXAttributeName();\n\t        var value = null;\n\t        if (this.matchJSX('=')) {\n\t            this.expectJSX('=');\n\t            value = this.parseJSXAttributeValue();\n\t        }\n\t        return this.finalize(node, new JSXNode.JSXAttribute(name, value));\n\t    };\n\t    JSXParser.prototype.parseJSXSpreadAttribute = function () {\n\t        var node = this.createJSXNode();\n\t        this.expectJSX('{');\n\t        this.expectJSX('...');\n\t        this.finishJSX();\n\t        var argument = this.parseAssignmentExpression();\n\t        this.reenterJSX();\n\t        return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument));\n\t    };\n\t    JSXParser.prototype.parseJSXAttributes = function () {\n\t        var attributes = [];\n\t        while (!this.matchJSX('/') && !this.matchJSX('>')) {\n\t            var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() :\n\t                this.parseJSXNameValueAttribute();\n\t            attributes.push(attribute);\n\t        }\n\t        return attributes;\n\t    };\n\t    JSXParser.prototype.parseJSXOpeningElement = function () {\n\t        var node = this.createJSXNode();\n\t        this.expectJSX('<');\n\t        var name = this.parseJSXElementName();\n\t        var attributes = this.parseJSXAttributes();\n\t        var selfClosing = this.matchJSX('/');\n\t        if (selfClosing) {\n\t            this.expectJSX('/');\n\t        }\n\t        this.expectJSX('>');\n\t        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));\n\t    };\n\t    JSXParser.prototype.parseJSXBoundaryElement = function () {\n\t        var node = this.createJSXNode();\n\t        this.expectJSX('<');\n\t        if (this.matchJSX('/')) {\n\t            this.expectJSX('/');\n\t            var name_3 = this.parseJSXElementName();\n\t            this.expectJSX('>');\n\t            return this.finalize(node, new JSXNode.JSXClosingElement(name_3));\n\t        }\n\t        var name = this.parseJSXElementName();\n\t        var attributes = this.parseJSXAttributes();\n\t        var selfClosing = this.matchJSX('/');\n\t        if (selfClosing) {\n\t            this.expectJSX('/');\n\t        }\n\t        this.expectJSX('>');\n\t        return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes));\n\t    };\n\t    JSXParser.prototype.parseJSXEmptyExpression = function () {\n\t        var node = this.createJSXChildNode();\n\t        this.collectComments();\n\t        this.lastMarker.index = this.scanner.index;\n\t        this.lastMarker.line = this.scanner.lineNumber;\n\t        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;\n\t        return this.finalize(node, new JSXNode.JSXEmptyExpression());\n\t    };\n\t    JSXParser.prototype.parseJSXExpressionContainer = function () {\n\t        var node = this.createJSXNode();\n\t        this.expectJSX('{');\n\t        var expression;\n\t        if (this.matchJSX('}')) {\n\t            expression = this.parseJSXEmptyExpression();\n\t            this.expectJSX('}');\n\t        }\n\t        else {\n\t            this.finishJSX();\n\t            expression = this.parseAssignmentExpression();\n\t            this.reenterJSX();\n\t        }\n\t        return this.finalize(node, new JSXNode.JSXExpressionContainer(expression));\n\t    };\n\t    JSXParser.prototype.parseJSXChildren = function () {\n\t        var children = [];\n\t        while (!this.scanner.eof()) {\n\t            var node = this.createJSXChildNode();\n\t            var token = this.nextJSXText();\n\t            if (token.start < token.end) {\n\t                var raw = this.getTokenRaw(token);\n\t                var child = this.finalize(node, new JSXNode.JSXText(token.value, raw));\n\t                children.push(child);\n\t            }\n\t            if (this.scanner.source[this.scanner.index] === '{') {\n\t                var container = this.parseJSXExpressionContainer();\n\t                children.push(container);\n\t            }\n\t            else {\n\t                break;\n\t            }\n\t        }\n\t        return children;\n\t    };\n\t    JSXParser.prototype.parseComplexJSXElement = function (el) {\n\t        var stack = [];\n\t        while (!this.scanner.eof()) {\n\t            el.children = el.children.concat(this.parseJSXChildren());\n\t            var node = this.createJSXChildNode();\n\t            var element = this.parseJSXBoundaryElement();\n\t            if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) {\n\t                var opening = element;\n\t                if (opening.selfClosing) {\n\t                    var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null));\n\t                    el.children.push(child);\n\t                }\n\t                else {\n\t                    stack.push(el);\n\t                    el = { node: node, opening: opening, closing: null, children: [] };\n\t                }\n\t            }\n\t            if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) {\n\t                el.closing = element;\n\t                var open_1 = getQualifiedElementName(el.opening.name);\n\t                var close_1 = getQualifiedElementName(el.closing.name);\n\t                if (open_1 !== close_1) {\n\t                    this.tolerateError('Expected corresponding JSX closing tag for %0', open_1);\n\t                }\n\t                if (stack.length > 0) {\n\t                    var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing));\n\t                    el = stack[stack.length - 1];\n\t                    el.children.push(child);\n\t                    stack.pop();\n\t                }\n\t                else {\n\t                    break;\n\t                }\n\t            }\n\t        }\n\t        return el;\n\t    };\n\t    JSXParser.prototype.parseJSXElement = function () {\n\t        var node = this.createJSXNode();\n\t        var opening = this.parseJSXOpeningElement();\n\t        var children = [];\n\t        var closing = null;\n\t        if (!opening.selfClosing) {\n\t            var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children });\n\t            children = el.children;\n\t            closing = el.closing;\n\t        }\n\t        return this.finalize(node, new JSXNode.JSXElement(opening, children, closing));\n\t    };\n\t    JSXParser.prototype.parseJSXRoot = function () {\n\t        // Pop the opening '<' added from the lookahead.\n\t        if (this.config.tokens) {\n\t            this.tokens.pop();\n\t        }\n\t        this.startJSX();\n\t        var element = this.parseJSXElement();\n\t        this.finishJSX();\n\t        return element;\n\t    };\n\t    JSXParser.prototype.isStartOfExpression = function () {\n\t        return _super.prototype.isStartOfExpression.call(this) || this.match('<');\n\t    };\n\t    return JSXParser;\n\t}(parser_1.Parser));\n\texports.JSXParser = JSXParser;\n\n\n/***/ },\n/* 4 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\t// See also tools/generate-unicode-regex.js.\n\tvar Regex = {\n\t    // Unicode v8.0.0 NonAsciiIdentifierStart:\n\t    NonAsciiIdentifierStart: /[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B4\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309B-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA\\uDF00-\\uDF19]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]/,\n\t    // Unicode v8.0.0 NonAsciiIdentifierPart:\n\t    NonAsciiIdentifierPart: /[\\xAA\\xB5\\xB7\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B4\\u08E3-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0AF9\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58-\\u0C5A\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D5F-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1369-\\u1371\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FD5\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7AD\\uA7B0-\\uA7B7\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA8FD\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB65\\uAB70-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2F\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDCA-\\uDDCC\\uDDD0-\\uDDDA\\uDDDC\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF00-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF50\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDDD8-\\uDDDD\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9\\uDF00-\\uDF19\\uDF1D-\\uDF2B\\uDF30-\\uDF39]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD836[\\uDE00-\\uDE36\\uDE3B-\\uDE6C\\uDE75\\uDE84\\uDE9B-\\uDE9F\\uDEA1-\\uDEAF]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/\n\t};\n\texports.Character = {\n\t    /* tslint:disable:no-bitwise */\n\t    fromCodePoint: function (cp) {\n\t        return (cp < 0x10000) ? String.fromCharCode(cp) :\n\t            String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) +\n\t                String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023));\n\t    },\n\t    // https://tc39.github.io/ecma262/#sec-white-space\n\t    isWhiteSpace: function (cp) {\n\t        return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) ||\n\t            (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0);\n\t    },\n\t    // https://tc39.github.io/ecma262/#sec-line-terminators\n\t    isLineTerminator: function (cp) {\n\t        return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029);\n\t    },\n\t    // https://tc39.github.io/ecma262/#sec-names-and-keywords\n\t    isIdentifierStart: function (cp) {\n\t        return (cp === 0x24) || (cp === 0x5F) ||\n\t            (cp >= 0x41 && cp <= 0x5A) ||\n\t            (cp >= 0x61 && cp <= 0x7A) ||\n\t            (cp === 0x5C) ||\n\t            ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp)));\n\t    },\n\t    isIdentifierPart: function (cp) {\n\t        return (cp === 0x24) || (cp === 0x5F) ||\n\t            (cp >= 0x41 && cp <= 0x5A) ||\n\t            (cp >= 0x61 && cp <= 0x7A) ||\n\t            (cp >= 0x30 && cp <= 0x39) ||\n\t            (cp === 0x5C) ||\n\t            ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp)));\n\t    },\n\t    // https://tc39.github.io/ecma262/#sec-literals-numeric-literals\n\t    isDecimalDigit: function (cp) {\n\t        return (cp >= 0x30 && cp <= 0x39); // 0..9\n\t    },\n\t    isHexDigit: function (cp) {\n\t        return (cp >= 0x30 && cp <= 0x39) ||\n\t            (cp >= 0x41 && cp <= 0x46) ||\n\t            (cp >= 0x61 && cp <= 0x66); // a..f\n\t    },\n\t    isOctalDigit: function (cp) {\n\t        return (cp >= 0x30 && cp <= 0x37); // 0..7\n\t    }\n\t};\n\n\n/***/ },\n/* 5 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar jsx_syntax_1 = __webpack_require__(6);\n\t/* tslint:disable:max-classes-per-file */\n\tvar JSXClosingElement = (function () {\n\t    function JSXClosingElement(name) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement;\n\t        this.name = name;\n\t    }\n\t    return JSXClosingElement;\n\t}());\n\texports.JSXClosingElement = JSXClosingElement;\n\tvar JSXElement = (function () {\n\t    function JSXElement(openingElement, children, closingElement) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXElement;\n\t        this.openingElement = openingElement;\n\t        this.children = children;\n\t        this.closingElement = closingElement;\n\t    }\n\t    return JSXElement;\n\t}());\n\texports.JSXElement = JSXElement;\n\tvar JSXEmptyExpression = (function () {\n\t    function JSXEmptyExpression() {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression;\n\t    }\n\t    return JSXEmptyExpression;\n\t}());\n\texports.JSXEmptyExpression = JSXEmptyExpression;\n\tvar JSXExpressionContainer = (function () {\n\t    function JSXExpressionContainer(expression) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer;\n\t        this.expression = expression;\n\t    }\n\t    return JSXExpressionContainer;\n\t}());\n\texports.JSXExpressionContainer = JSXExpressionContainer;\n\tvar JSXIdentifier = (function () {\n\t    function JSXIdentifier(name) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier;\n\t        this.name = name;\n\t    }\n\t    return JSXIdentifier;\n\t}());\n\texports.JSXIdentifier = JSXIdentifier;\n\tvar JSXMemberExpression = (function () {\n\t    function JSXMemberExpression(object, property) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression;\n\t        this.object = object;\n\t        this.property = property;\n\t    }\n\t    return JSXMemberExpression;\n\t}());\n\texports.JSXMemberExpression = JSXMemberExpression;\n\tvar JSXAttribute = (function () {\n\t    function JSXAttribute(name, value) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXAttribute;\n\t        this.name = name;\n\t        this.value = value;\n\t    }\n\t    return JSXAttribute;\n\t}());\n\texports.JSXAttribute = JSXAttribute;\n\tvar JSXNamespacedName = (function () {\n\t    function JSXNamespacedName(namespace, name) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName;\n\t        this.namespace = namespace;\n\t        this.name = name;\n\t    }\n\t    return JSXNamespacedName;\n\t}());\n\texports.JSXNamespacedName = JSXNamespacedName;\n\tvar JSXOpeningElement = (function () {\n\t    function JSXOpeningElement(name, selfClosing, attributes) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement;\n\t        this.name = name;\n\t        this.selfClosing = selfClosing;\n\t        this.attributes = attributes;\n\t    }\n\t    return JSXOpeningElement;\n\t}());\n\texports.JSXOpeningElement = JSXOpeningElement;\n\tvar JSXSpreadAttribute = (function () {\n\t    function JSXSpreadAttribute(argument) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute;\n\t        this.argument = argument;\n\t    }\n\t    return JSXSpreadAttribute;\n\t}());\n\texports.JSXSpreadAttribute = JSXSpreadAttribute;\n\tvar JSXText = (function () {\n\t    function JSXText(value, raw) {\n\t        this.type = jsx_syntax_1.JSXSyntax.JSXText;\n\t        this.value = value;\n\t        this.raw = raw;\n\t    }\n\t    return JSXText;\n\t}());\n\texports.JSXText = JSXText;\n\n\n/***/ },\n/* 6 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.JSXSyntax = {\n\t    JSXAttribute: 'JSXAttribute',\n\t    JSXClosingElement: 'JSXClosingElement',\n\t    JSXElement: 'JSXElement',\n\t    JSXEmptyExpression: 'JSXEmptyExpression',\n\t    JSXExpressionContainer: 'JSXExpressionContainer',\n\t    JSXIdentifier: 'JSXIdentifier',\n\t    JSXMemberExpression: 'JSXMemberExpression',\n\t    JSXNamespacedName: 'JSXNamespacedName',\n\t    JSXOpeningElement: 'JSXOpeningElement',\n\t    JSXSpreadAttribute: 'JSXSpreadAttribute',\n\t    JSXText: 'JSXText'\n\t};\n\n\n/***/ },\n/* 7 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar syntax_1 = __webpack_require__(2);\n\t/* tslint:disable:max-classes-per-file */\n\tvar ArrayExpression = (function () {\n\t    function ArrayExpression(elements) {\n\t        this.type = syntax_1.Syntax.ArrayExpression;\n\t        this.elements = elements;\n\t    }\n\t    return ArrayExpression;\n\t}());\n\texports.ArrayExpression = ArrayExpression;\n\tvar ArrayPattern = (function () {\n\t    function ArrayPattern(elements) {\n\t        this.type = syntax_1.Syntax.ArrayPattern;\n\t        this.elements = elements;\n\t    }\n\t    return ArrayPattern;\n\t}());\n\texports.ArrayPattern = ArrayPattern;\n\tvar ArrowFunctionExpression = (function () {\n\t    function ArrowFunctionExpression(params, body, expression) {\n\t        this.type = syntax_1.Syntax.ArrowFunctionExpression;\n\t        this.id = null;\n\t        this.params = params;\n\t        this.body = body;\n\t        this.generator = false;\n\t        this.expression = expression;\n\t        this.async = false;\n\t    }\n\t    return ArrowFunctionExpression;\n\t}());\n\texports.ArrowFunctionExpression = ArrowFunctionExpression;\n\tvar AssignmentExpression = (function () {\n\t    function AssignmentExpression(operator, left, right) {\n\t        this.type = syntax_1.Syntax.AssignmentExpression;\n\t        this.operator = operator;\n\t        this.left = left;\n\t        this.right = right;\n\t    }\n\t    return AssignmentExpression;\n\t}());\n\texports.AssignmentExpression = AssignmentExpression;\n\tvar AssignmentPattern = (function () {\n\t    function AssignmentPattern(left, right) {\n\t        this.type = syntax_1.Syntax.AssignmentPattern;\n\t        this.left = left;\n\t        this.right = right;\n\t    }\n\t    return AssignmentPattern;\n\t}());\n\texports.AssignmentPattern = AssignmentPattern;\n\tvar AsyncArrowFunctionExpression = (function () {\n\t    function AsyncArrowFunctionExpression(params, body, expression) {\n\t        this.type = syntax_1.Syntax.ArrowFunctionExpression;\n\t        this.id = null;\n\t        this.params = params;\n\t        this.body = body;\n\t        this.generator = false;\n\t        this.expression = expression;\n\t        this.async = true;\n\t    }\n\t    return AsyncArrowFunctionExpression;\n\t}());\n\texports.AsyncArrowFunctionExpression = AsyncArrowFunctionExpression;\n\tvar AsyncFunctionDeclaration = (function () {\n\t    function AsyncFunctionDeclaration(id, params, body) {\n\t        this.type = syntax_1.Syntax.FunctionDeclaration;\n\t        this.id = id;\n\t        this.params = params;\n\t        this.body = body;\n\t        this.generator = false;\n\t        this.expression = false;\n\t        this.async = true;\n\t    }\n\t    return AsyncFunctionDeclaration;\n\t}());\n\texports.AsyncFunctionDeclaration = AsyncFunctionDeclaration;\n\tvar AsyncFunctionExpression = (function () {\n\t    function AsyncFunctionExpression(id, params, body) {\n\t        this.type = syntax_1.Syntax.FunctionExpression;\n\t        this.id = id;\n\t        this.params = params;\n\t        this.body = body;\n\t        this.generator = false;\n\t        this.expression = false;\n\t        this.async = true;\n\t    }\n\t    return AsyncFunctionExpression;\n\t}());\n\texports.AsyncFunctionExpression = AsyncFunctionExpression;\n\tvar AwaitExpression = (function () {\n\t    function AwaitExpression(argument) {\n\t        this.type = syntax_1.Syntax.AwaitExpression;\n\t        this.argument = argument;\n\t    }\n\t    return AwaitExpression;\n\t}());\n\texports.AwaitExpression = AwaitExpression;\n\tvar BinaryExpression = (function () {\n\t    function BinaryExpression(operator, left, right) {\n\t        var logical = (operator === '||' || operator === '&&');\n\t        this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression;\n\t        this.operator = operator;\n\t        this.left = left;\n\t        this.right = right;\n\t    }\n\t    return BinaryExpression;\n\t}());\n\texports.BinaryExpression = BinaryExpression;\n\tvar BlockStatement = (function () {\n\t    function BlockStatement(body) {\n\t        this.type = syntax_1.Syntax.BlockStatement;\n\t        this.body = body;\n\t    }\n\t    return BlockStatement;\n\t}());\n\texports.BlockStatement = BlockStatement;\n\tvar BreakStatement = (function () {\n\t    function BreakStatement(label) {\n\t        this.type = syntax_1.Syntax.BreakStatement;\n\t        this.label = label;\n\t    }\n\t    return BreakStatement;\n\t}());\n\texports.BreakStatement = BreakStatement;\n\tvar CallExpression = (function () {\n\t    function CallExpression(callee, args) {\n\t        this.type = syntax_1.Syntax.CallExpression;\n\t        this.callee = callee;\n\t        this.arguments = args;\n\t    }\n\t    return CallExpression;\n\t}());\n\texports.CallExpression = CallExpression;\n\tvar CatchClause = (function () {\n\t    function CatchClause(param, body) {\n\t        this.type = syntax_1.Syntax.CatchClause;\n\t        this.param = param;\n\t        this.body = body;\n\t    }\n\t    return CatchClause;\n\t}());\n\texports.CatchClause = CatchClause;\n\tvar ClassBody = (function () {\n\t    function ClassBody(body) {\n\t        this.type = syntax_1.Syntax.ClassBody;\n\t        this.body = body;\n\t    }\n\t    return ClassBody;\n\t}());\n\texports.ClassBody = ClassBody;\n\tvar ClassDeclaration = (function () {\n\t    function ClassDeclaration(id, superClass, body) {\n\t        this.type = syntax_1.Syntax.ClassDeclaration;\n\t        this.id = id;\n\t        this.superClass = superClass;\n\t        this.body = body;\n\t    }\n\t    return ClassDeclaration;\n\t}());\n\texports.ClassDeclaration = ClassDeclaration;\n\tvar ClassExpression = (function () {\n\t    function ClassExpression(id, superClass, body) {\n\t        this.type = syntax_1.Syntax.ClassExpression;\n\t        this.id = id;\n\t        this.superClass = superClass;\n\t        this.body = body;\n\t    }\n\t    return ClassExpression;\n\t}());\n\texports.ClassExpression = ClassExpression;\n\tvar ComputedMemberExpression = (function () {\n\t    function ComputedMemberExpression(object, property) {\n\t        this.type = syntax_1.Syntax.MemberExpression;\n\t        this.computed = true;\n\t        this.object = object;\n\t        this.property = property;\n\t    }\n\t    return ComputedMemberExpression;\n\t}());\n\texports.ComputedMemberExpression = ComputedMemberExpression;\n\tvar ConditionalExpression = (function () {\n\t    function ConditionalExpression(test, consequent, alternate) {\n\t        this.type = syntax_1.Syntax.ConditionalExpression;\n\t        this.test = test;\n\t        this.consequent = consequent;\n\t        this.alternate = alternate;\n\t    }\n\t    return ConditionalExpression;\n\t}());\n\texports.ConditionalExpression = ConditionalExpression;\n\tvar ContinueStatement = (function () {\n\t    function ContinueStatement(label) {\n\t        this.type = syntax_1.Syntax.ContinueStatement;\n\t        this.label = label;\n\t    }\n\t    return ContinueStatement;\n\t}());\n\texports.ContinueStatement = ContinueStatement;\n\tvar DebuggerStatement = (function () {\n\t    function DebuggerStatement() {\n\t        this.type = syntax_1.Syntax.DebuggerStatement;\n\t    }\n\t    return DebuggerStatement;\n\t}());\n\texports.DebuggerStatement = DebuggerStatement;\n\tvar Directive = (function () {\n\t    function Directive(expression, directive) {\n\t        this.type = syntax_1.Syntax.ExpressionStatement;\n\t        this.expression = expression;\n\t        this.directive = directive;\n\t    }\n\t    return Directive;\n\t}());\n\texports.Directive = Directive;\n\tvar DoWhileStatement = (function () {\n\t    function DoWhileStatement(body, test) {\n\t        this.type = syntax_1.Syntax.DoWhileStatement;\n\t        this.body = body;\n\t        this.test = test;\n\t    }\n\t    return DoWhileStatement;\n\t}());\n\texports.DoWhileStatement = DoWhileStatement;\n\tvar EmptyStatement = (function () {\n\t    function EmptyStatement() {\n\t        this.type = syntax_1.Syntax.EmptyStatement;\n\t    }\n\t    return EmptyStatement;\n\t}());\n\texports.EmptyStatement = EmptyStatement;\n\tvar ExportAllDeclaration = (function () {\n\t    function ExportAllDeclaration(source) {\n\t        this.type = syntax_1.Syntax.ExportAllDeclaration;\n\t        this.source = source;\n\t    }\n\t    return ExportAllDeclaration;\n\t}());\n\texports.ExportAllDeclaration = ExportAllDeclaration;\n\tvar ExportDefaultDeclaration = (function () {\n\t    function ExportDefaultDeclaration(declaration) {\n\t        this.type = syntax_1.Syntax.ExportDefaultDeclaration;\n\t        this.declaration = declaration;\n\t    }\n\t    return ExportDefaultDeclaration;\n\t}());\n\texports.ExportDefaultDeclaration = ExportDefaultDeclaration;\n\tvar ExportNamedDeclaration = (function () {\n\t    function ExportNamedDeclaration(declaration, specifiers, source) {\n\t        this.type = syntax_1.Syntax.ExportNamedDeclaration;\n\t        this.declaration = declaration;\n\t        this.specifiers = specifiers;\n\t        this.source = source;\n\t    }\n\t    return ExportNamedDeclaration;\n\t}());\n\texports.ExportNamedDeclaration = ExportNamedDeclaration;\n\tvar ExportSpecifier = (function () {\n\t    function ExportSpecifier(local, exported) {\n\t        this.type = syntax_1.Syntax.ExportSpecifier;\n\t        this.exported = exported;\n\t        this.local = local;\n\t    }\n\t    return ExportSpecifier;\n\t}());\n\texports.ExportSpecifier = ExportSpecifier;\n\tvar ExpressionStatement = (function () {\n\t    function ExpressionStatement(expression) {\n\t        this.type = syntax_1.Syntax.ExpressionStatement;\n\t        this.expression = expression;\n\t    }\n\t    return ExpressionStatement;\n\t}());\n\texports.ExpressionStatement = ExpressionStatement;\n\tvar ForInStatement = (function () {\n\t    function ForInStatement(left, right, body) {\n\t        this.type = syntax_1.Syntax.ForInStatement;\n\t        this.left = left;\n\t        this.right = right;\n\t        this.body = body;\n\t        this.each = false;\n\t    }\n\t    return ForInStatement;\n\t}());\n\texports.ForInStatement = ForInStatement;\n\tvar ForOfStatement = (function () {\n\t    function ForOfStatement(left, right, body) {\n\t        this.type = syntax_1.Syntax.ForOfStatement;\n\t        this.left = left;\n\t        this.right = right;\n\t        this.body = body;\n\t    }\n\t    return ForOfStatement;\n\t}());\n\texports.ForOfStatement = ForOfStatement;\n\tvar ForStatement = (function () {\n\t    function ForStatement(init, test, update, body) {\n\t        this.type = syntax_1.Syntax.ForStatement;\n\t        this.init = init;\n\t        this.test = test;\n\t        this.update = update;\n\t        this.body = body;\n\t    }\n\t    return ForStatement;\n\t}());\n\texports.ForStatement = ForStatement;\n\tvar FunctionDeclaration = (function () {\n\t    function FunctionDeclaration(id, params, body, generator) {\n\t        this.type = syntax_1.Syntax.FunctionDeclaration;\n\t        this.id = id;\n\t        this.params = params;\n\t        this.body = body;\n\t        this.generator = generator;\n\t        this.expression = false;\n\t        this.async = false;\n\t    }\n\t    return FunctionDeclaration;\n\t}());\n\texports.FunctionDeclaration = FunctionDeclaration;\n\tvar FunctionExpression = (function () {\n\t    function FunctionExpression(id, params, body, generator) {\n\t        this.type = syntax_1.Syntax.FunctionExpression;\n\t        this.id = id;\n\t        this.params = params;\n\t        this.body = body;\n\t        this.generator = generator;\n\t        this.expression = false;\n\t        this.async = false;\n\t    }\n\t    return FunctionExpression;\n\t}());\n\texports.FunctionExpression = FunctionExpression;\n\tvar Identifier = (function () {\n\t    function Identifier(name) {\n\t        this.type = syntax_1.Syntax.Identifier;\n\t        this.name = name;\n\t    }\n\t    return Identifier;\n\t}());\n\texports.Identifier = Identifier;\n\tvar IfStatement = (function () {\n\t    function IfStatement(test, consequent, alternate) {\n\t        this.type = syntax_1.Syntax.IfStatement;\n\t        this.test = test;\n\t        this.consequent = consequent;\n\t        this.alternate = alternate;\n\t    }\n\t    return IfStatement;\n\t}());\n\texports.IfStatement = IfStatement;\n\tvar ImportDeclaration = (function () {\n\t    function ImportDeclaration(specifiers, source) {\n\t        this.type = syntax_1.Syntax.ImportDeclaration;\n\t        this.specifiers = specifiers;\n\t        this.source = source;\n\t    }\n\t    return ImportDeclaration;\n\t}());\n\texports.ImportDeclaration = ImportDeclaration;\n\tvar ImportDefaultSpecifier = (function () {\n\t    function ImportDefaultSpecifier(local) {\n\t        this.type = syntax_1.Syntax.ImportDefaultSpecifier;\n\t        this.local = local;\n\t    }\n\t    return ImportDefaultSpecifier;\n\t}());\n\texports.ImportDefaultSpecifier = ImportDefaultSpecifier;\n\tvar ImportNamespaceSpecifier = (function () {\n\t    function ImportNamespaceSpecifier(local) {\n\t        this.type = syntax_1.Syntax.ImportNamespaceSpecifier;\n\t        this.local = local;\n\t    }\n\t    return ImportNamespaceSpecifier;\n\t}());\n\texports.ImportNamespaceSpecifier = ImportNamespaceSpecifier;\n\tvar ImportSpecifier = (function () {\n\t    function ImportSpecifier(local, imported) {\n\t        this.type = syntax_1.Syntax.ImportSpecifier;\n\t        this.local = local;\n\t        this.imported = imported;\n\t    }\n\t    return ImportSpecifier;\n\t}());\n\texports.ImportSpecifier = ImportSpecifier;\n\tvar LabeledStatement = (function () {\n\t    function LabeledStatement(label, body) {\n\t        this.type = syntax_1.Syntax.LabeledStatement;\n\t        this.label = label;\n\t        this.body = body;\n\t    }\n\t    return LabeledStatement;\n\t}());\n\texports.LabeledStatement = LabeledStatement;\n\tvar Literal = (function () {\n\t    function Literal(value, raw) {\n\t        this.type = syntax_1.Syntax.Literal;\n\t        this.value = value;\n\t        this.raw = raw;\n\t    }\n\t    return Literal;\n\t}());\n\texports.Literal = Literal;\n\tvar MetaProperty = (function () {\n\t    function MetaProperty(meta, property) {\n\t        this.type = syntax_1.Syntax.MetaProperty;\n\t        this.meta = meta;\n\t        this.property = property;\n\t    }\n\t    return MetaProperty;\n\t}());\n\texports.MetaProperty = MetaProperty;\n\tvar MethodDefinition = (function () {\n\t    function MethodDefinition(key, computed, value, kind, isStatic) {\n\t        this.type = syntax_1.Syntax.MethodDefinition;\n\t        this.key = key;\n\t        this.computed = computed;\n\t        this.value = value;\n\t        this.kind = kind;\n\t        this.static = isStatic;\n\t    }\n\t    return MethodDefinition;\n\t}());\n\texports.MethodDefinition = MethodDefinition;\n\tvar Module = (function () {\n\t    function Module(body) {\n\t        this.type = syntax_1.Syntax.Program;\n\t        this.body = body;\n\t        this.sourceType = 'module';\n\t    }\n\t    return Module;\n\t}());\n\texports.Module = Module;\n\tvar NewExpression = (function () {\n\t    function NewExpression(callee, args) {\n\t        this.type = syntax_1.Syntax.NewExpression;\n\t        this.callee = callee;\n\t        this.arguments = args;\n\t    }\n\t    return NewExpression;\n\t}());\n\texports.NewExpression = NewExpression;\n\tvar ObjectExpression = (function () {\n\t    function ObjectExpression(properties) {\n\t        this.type = syntax_1.Syntax.ObjectExpression;\n\t        this.properties = properties;\n\t    }\n\t    return ObjectExpression;\n\t}());\n\texports.ObjectExpression = ObjectExpression;\n\tvar ObjectPattern = (function () {\n\t    function ObjectPattern(properties) {\n\t        this.type = syntax_1.Syntax.ObjectPattern;\n\t        this.properties = properties;\n\t    }\n\t    return ObjectPattern;\n\t}());\n\texports.ObjectPattern = ObjectPattern;\n\tvar Property = (function () {\n\t    function Property(kind, key, computed, value, method, shorthand) {\n\t        this.type = syntax_1.Syntax.Property;\n\t        this.key = key;\n\t        this.computed = computed;\n\t        this.value = value;\n\t        this.kind = kind;\n\t        this.method = method;\n\t        this.shorthand = shorthand;\n\t    }\n\t    return Property;\n\t}());\n\texports.Property = Property;\n\tvar RegexLiteral = (function () {\n\t    function RegexLiteral(value, raw, pattern, flags) {\n\t        this.type = syntax_1.Syntax.Literal;\n\t        this.value = value;\n\t        this.raw = raw;\n\t        this.regex = { pattern: pattern, flags: flags };\n\t    }\n\t    return RegexLiteral;\n\t}());\n\texports.RegexLiteral = RegexLiteral;\n\tvar RestElement = (function () {\n\t    function RestElement(argument) {\n\t        this.type = syntax_1.Syntax.RestElement;\n\t        this.argument = argument;\n\t    }\n\t    return RestElement;\n\t}());\n\texports.RestElement = RestElement;\n\tvar ReturnStatement = (function () {\n\t    function ReturnStatement(argument) {\n\t        this.type = syntax_1.Syntax.ReturnStatement;\n\t        this.argument = argument;\n\t    }\n\t    return ReturnStatement;\n\t}());\n\texports.ReturnStatement = ReturnStatement;\n\tvar Script = (function () {\n\t    function Script(body) {\n\t        this.type = syntax_1.Syntax.Program;\n\t        this.body = body;\n\t        this.sourceType = 'script';\n\t    }\n\t    return Script;\n\t}());\n\texports.Script = Script;\n\tvar SequenceExpression = (function () {\n\t    function SequenceExpression(expressions) {\n\t        this.type = syntax_1.Syntax.SequenceExpression;\n\t        this.expressions = expressions;\n\t    }\n\t    return SequenceExpression;\n\t}());\n\texports.SequenceExpression = SequenceExpression;\n\tvar SpreadElement = (function () {\n\t    function SpreadElement(argument) {\n\t        this.type = syntax_1.Syntax.SpreadElement;\n\t        this.argument = argument;\n\t    }\n\t    return SpreadElement;\n\t}());\n\texports.SpreadElement = SpreadElement;\n\tvar StaticMemberExpression = (function () {\n\t    function StaticMemberExpression(object, property) {\n\t        this.type = syntax_1.Syntax.MemberExpression;\n\t        this.computed = false;\n\t        this.object = object;\n\t        this.property = property;\n\t    }\n\t    return StaticMemberExpression;\n\t}());\n\texports.StaticMemberExpression = StaticMemberExpression;\n\tvar Super = (function () {\n\t    function Super() {\n\t        this.type = syntax_1.Syntax.Super;\n\t    }\n\t    return Super;\n\t}());\n\texports.Super = Super;\n\tvar SwitchCase = (function () {\n\t    function SwitchCase(test, consequent) {\n\t        this.type = syntax_1.Syntax.SwitchCase;\n\t        this.test = test;\n\t        this.consequent = consequent;\n\t    }\n\t    return SwitchCase;\n\t}());\n\texports.SwitchCase = SwitchCase;\n\tvar SwitchStatement = (function () {\n\t    function SwitchStatement(discriminant, cases) {\n\t        this.type = syntax_1.Syntax.SwitchStatement;\n\t        this.discriminant = discriminant;\n\t        this.cases = cases;\n\t    }\n\t    return SwitchStatement;\n\t}());\n\texports.SwitchStatement = SwitchStatement;\n\tvar TaggedTemplateExpression = (function () {\n\t    function TaggedTemplateExpression(tag, quasi) {\n\t        this.type = syntax_1.Syntax.TaggedTemplateExpression;\n\t        this.tag = tag;\n\t        this.quasi = quasi;\n\t    }\n\t    return TaggedTemplateExpression;\n\t}());\n\texports.TaggedTemplateExpression = TaggedTemplateExpression;\n\tvar TemplateElement = (function () {\n\t    function TemplateElement(value, tail) {\n\t        this.type = syntax_1.Syntax.TemplateElement;\n\t        this.value = value;\n\t        this.tail = tail;\n\t    }\n\t    return TemplateElement;\n\t}());\n\texports.TemplateElement = TemplateElement;\n\tvar TemplateLiteral = (function () {\n\t    function TemplateLiteral(quasis, expressions) {\n\t        this.type = syntax_1.Syntax.TemplateLiteral;\n\t        this.quasis = quasis;\n\t        this.expressions = expressions;\n\t    }\n\t    return TemplateLiteral;\n\t}());\n\texports.TemplateLiteral = TemplateLiteral;\n\tvar ThisExpression = (function () {\n\t    function ThisExpression() {\n\t        this.type = syntax_1.Syntax.ThisExpression;\n\t    }\n\t    return ThisExpression;\n\t}());\n\texports.ThisExpression = ThisExpression;\n\tvar ThrowStatement = (function () {\n\t    function ThrowStatement(argument) {\n\t        this.type = syntax_1.Syntax.ThrowStatement;\n\t        this.argument = argument;\n\t    }\n\t    return ThrowStatement;\n\t}());\n\texports.ThrowStatement = ThrowStatement;\n\tvar TryStatement = (function () {\n\t    function TryStatement(block, handler, finalizer) {\n\t        this.type = syntax_1.Syntax.TryStatement;\n\t        this.block = block;\n\t        this.handler = handler;\n\t        this.finalizer = finalizer;\n\t    }\n\t    return TryStatement;\n\t}());\n\texports.TryStatement = TryStatement;\n\tvar UnaryExpression = (function () {\n\t    function UnaryExpression(operator, argument) {\n\t        this.type = syntax_1.Syntax.UnaryExpression;\n\t        this.operator = operator;\n\t        this.argument = argument;\n\t        this.prefix = true;\n\t    }\n\t    return UnaryExpression;\n\t}());\n\texports.UnaryExpression = UnaryExpression;\n\tvar UpdateExpression = (function () {\n\t    function UpdateExpression(operator, argument, prefix) {\n\t        this.type = syntax_1.Syntax.UpdateExpression;\n\t        this.operator = operator;\n\t        this.argument = argument;\n\t        this.prefix = prefix;\n\t    }\n\t    return UpdateExpression;\n\t}());\n\texports.UpdateExpression = UpdateExpression;\n\tvar VariableDeclaration = (function () {\n\t    function VariableDeclaration(declarations, kind) {\n\t        this.type = syntax_1.Syntax.VariableDeclaration;\n\t        this.declarations = declarations;\n\t        this.kind = kind;\n\t    }\n\t    return VariableDeclaration;\n\t}());\n\texports.VariableDeclaration = VariableDeclaration;\n\tvar VariableDeclarator = (function () {\n\t    function VariableDeclarator(id, init) {\n\t        this.type = syntax_1.Syntax.VariableDeclarator;\n\t        this.id = id;\n\t        this.init = init;\n\t    }\n\t    return VariableDeclarator;\n\t}());\n\texports.VariableDeclarator = VariableDeclarator;\n\tvar WhileStatement = (function () {\n\t    function WhileStatement(test, body) {\n\t        this.type = syntax_1.Syntax.WhileStatement;\n\t        this.test = test;\n\t        this.body = body;\n\t    }\n\t    return WhileStatement;\n\t}());\n\texports.WhileStatement = WhileStatement;\n\tvar WithStatement = (function () {\n\t    function WithStatement(object, body) {\n\t        this.type = syntax_1.Syntax.WithStatement;\n\t        this.object = object;\n\t        this.body = body;\n\t    }\n\t    return WithStatement;\n\t}());\n\texports.WithStatement = WithStatement;\n\tvar YieldExpression = (function () {\n\t    function YieldExpression(argument, delegate) {\n\t        this.type = syntax_1.Syntax.YieldExpression;\n\t        this.argument = argument;\n\t        this.delegate = delegate;\n\t    }\n\t    return YieldExpression;\n\t}());\n\texports.YieldExpression = YieldExpression;\n\n\n/***/ },\n/* 8 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar assert_1 = __webpack_require__(9);\n\tvar error_handler_1 = __webpack_require__(10);\n\tvar messages_1 = __webpack_require__(11);\n\tvar Node = __webpack_require__(7);\n\tvar scanner_1 = __webpack_require__(12);\n\tvar syntax_1 = __webpack_require__(2);\n\tvar token_1 = __webpack_require__(13);\n\tvar ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder';\n\tvar Parser = (function () {\n\t    function Parser(code, options, delegate) {\n\t        if (options === void 0) { options = {}; }\n\t        this.config = {\n\t            range: (typeof options.range === 'boolean') && options.range,\n\t            loc: (typeof options.loc === 'boolean') && options.loc,\n\t            source: null,\n\t            tokens: (typeof options.tokens === 'boolean') && options.tokens,\n\t            comment: (typeof options.comment === 'boolean') && options.comment,\n\t            tolerant: (typeof options.tolerant === 'boolean') && options.tolerant\n\t        };\n\t        if (this.config.loc && options.source && options.source !== null) {\n\t            this.config.source = String(options.source);\n\t        }\n\t        this.delegate = delegate;\n\t        this.errorHandler = new error_handler_1.ErrorHandler();\n\t        this.errorHandler.tolerant = this.config.tolerant;\n\t        this.scanner = new scanner_1.Scanner(code, this.errorHandler);\n\t        this.scanner.trackComment = this.config.comment;\n\t        this.operatorPrecedence = {\n\t            ')': 0,\n\t            ';': 0,\n\t            ',': 0,\n\t            '=': 0,\n\t            ']': 0,\n\t            '||': 1,\n\t            '&&': 2,\n\t            '|': 3,\n\t            '^': 4,\n\t            '&': 5,\n\t            '==': 6,\n\t            '!=': 6,\n\t            '===': 6,\n\t            '!==': 6,\n\t            '<': 7,\n\t            '>': 7,\n\t            '<=': 7,\n\t            '>=': 7,\n\t            '<<': 8,\n\t            '>>': 8,\n\t            '>>>': 8,\n\t            '+': 9,\n\t            '-': 9,\n\t            '*': 11,\n\t            '/': 11,\n\t            '%': 11\n\t        };\n\t        this.lookahead = {\n\t            type: 2 /* EOF */,\n\t            value: '',\n\t            lineNumber: this.scanner.lineNumber,\n\t            lineStart: 0,\n\t            start: 0,\n\t            end: 0\n\t        };\n\t        this.hasLineTerminator = false;\n\t        this.context = {\n\t            isModule: false,\n\t            await: false,\n\t            allowIn: true,\n\t            allowStrictDirective: true,\n\t            allowYield: true,\n\t            firstCoverInitializedNameError: null,\n\t            isAssignmentTarget: false,\n\t            isBindingElement: false,\n\t            inFunctionBody: false,\n\t            inIteration: false,\n\t            inSwitch: false,\n\t            labelSet: {},\n\t            strict: false\n\t        };\n\t        this.tokens = [];\n\t        this.startMarker = {\n\t            index: 0,\n\t            line: this.scanner.lineNumber,\n\t            column: 0\n\t        };\n\t        this.lastMarker = {\n\t            index: 0,\n\t            line: this.scanner.lineNumber,\n\t            column: 0\n\t        };\n\t        this.nextToken();\n\t        this.lastMarker = {\n\t            index: this.scanner.index,\n\t            line: this.scanner.lineNumber,\n\t            column: this.scanner.index - this.scanner.lineStart\n\t        };\n\t    }\n\t    Parser.prototype.throwError = function (messageFormat) {\n\t        var values = [];\n\t        for (var _i = 1; _i < arguments.length; _i++) {\n\t            values[_i - 1] = arguments[_i];\n\t        }\n\t        var args = Array.prototype.slice.call(arguments, 1);\n\t        var msg = messageFormat.replace(/%(\\d)/g, function (whole, idx) {\n\t            assert_1.assert(idx < args.length, 'Message reference must be in range');\n\t            return args[idx];\n\t        });\n\t        var index = this.lastMarker.index;\n\t        var line = this.lastMarker.line;\n\t        var column = this.lastMarker.column + 1;\n\t        throw this.errorHandler.createError(index, line, column, msg);\n\t    };\n\t    Parser.prototype.tolerateError = function (messageFormat) {\n\t        var values = [];\n\t        for (var _i = 1; _i < arguments.length; _i++) {\n\t            values[_i - 1] = arguments[_i];\n\t        }\n\t        var args = Array.prototype.slice.call(arguments, 1);\n\t        var msg = messageFormat.replace(/%(\\d)/g, function (whole, idx) {\n\t            assert_1.assert(idx < args.length, 'Message reference must be in range');\n\t            return args[idx];\n\t        });\n\t        var index = this.lastMarker.index;\n\t        var line = this.scanner.lineNumber;\n\t        var column = this.lastMarker.column + 1;\n\t        this.errorHandler.tolerateError(index, line, column, msg);\n\t    };\n\t    // Throw an exception because of the token.\n\t    Parser.prototype.unexpectedTokenError = function (token, message) {\n\t        var msg = message || messages_1.Messages.UnexpectedToken;\n\t        var value;\n\t        if (token) {\n\t            if (!message) {\n\t                msg = (token.type === 2 /* EOF */) ? messages_1.Messages.UnexpectedEOS :\n\t                    (token.type === 3 /* Identifier */) ? messages_1.Messages.UnexpectedIdentifier :\n\t                        (token.type === 6 /* NumericLiteral */) ? messages_1.Messages.UnexpectedNumber :\n\t                            (token.type === 8 /* StringLiteral */) ? messages_1.Messages.UnexpectedString :\n\t                                (token.type === 10 /* Template */) ? messages_1.Messages.UnexpectedTemplate :\n\t                                    messages_1.Messages.UnexpectedToken;\n\t                if (token.type === 4 /* Keyword */) {\n\t                    if (this.scanner.isFutureReservedWord(token.value)) {\n\t                        msg = messages_1.Messages.UnexpectedReserved;\n\t                    }\n\t                    else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) {\n\t                        msg = messages_1.Messages.StrictReservedWord;\n\t                    }\n\t                }\n\t            }\n\t            value = token.value;\n\t        }\n\t        else {\n\t            value = 'ILLEGAL';\n\t        }\n\t        msg = msg.replace('%0', value);\n\t        if (token && typeof token.lineNumber === 'number') {\n\t            var index = token.start;\n\t            var line = token.lineNumber;\n\t            var lastMarkerLineStart = this.lastMarker.index - this.lastMarker.column;\n\t            var column = token.start - lastMarkerLineStart + 1;\n\t            return this.errorHandler.createError(index, line, column, msg);\n\t        }\n\t        else {\n\t            var index = this.lastMarker.index;\n\t            var line = this.lastMarker.line;\n\t            var column = this.lastMarker.column + 1;\n\t            return this.errorHandler.createError(index, line, column, msg);\n\t        }\n\t    };\n\t    Parser.prototype.throwUnexpectedToken = function (token, message) {\n\t        throw this.unexpectedTokenError(token, message);\n\t    };\n\t    Parser.prototype.tolerateUnexpectedToken = function (token, message) {\n\t        this.errorHandler.tolerate(this.unexpectedTokenError(token, message));\n\t    };\n\t    Parser.prototype.collectComments = function () {\n\t        if (!this.config.comment) {\n\t            this.scanner.scanComments();\n\t        }\n\t        else {\n\t            var comments = this.scanner.scanComments();\n\t            if (comments.length > 0 && this.delegate) {\n\t                for (var i = 0; i < comments.length; ++i) {\n\t                    var e = comments[i];\n\t                    var node = void 0;\n\t                    node = {\n\t                        type: e.multiLine ? 'BlockComment' : 'LineComment',\n\t                        value: this.scanner.source.slice(e.slice[0], e.slice[1])\n\t                    };\n\t                    if (this.config.range) {\n\t                        node.range = e.range;\n\t                    }\n\t                    if (this.config.loc) {\n\t                        node.loc = e.loc;\n\t                    }\n\t                    var metadata = {\n\t                        start: {\n\t                            line: e.loc.start.line,\n\t                            column: e.loc.start.column,\n\t                            offset: e.range[0]\n\t                        },\n\t                        end: {\n\t                            line: e.loc.end.line,\n\t                            column: e.loc.end.column,\n\t                            offset: e.range[1]\n\t                        }\n\t                    };\n\t                    this.delegate(node, metadata);\n\t                }\n\t            }\n\t        }\n\t    };\n\t    // From internal representation to an external structure\n\t    Parser.prototype.getTokenRaw = function (token) {\n\t        return this.scanner.source.slice(token.start, token.end);\n\t    };\n\t    Parser.prototype.convertToken = function (token) {\n\t        var t = {\n\t            type: token_1.TokenName[token.type],\n\t            value: this.getTokenRaw(token)\n\t        };\n\t        if (this.config.range) {\n\t            t.range = [token.start, token.end];\n\t        }\n\t        if (this.config.loc) {\n\t            t.loc = {\n\t                start: {\n\t                    line: this.startMarker.line,\n\t                    column: this.startMarker.column\n\t                },\n\t                end: {\n\t                    line: this.scanner.lineNumber,\n\t                    column: this.scanner.index - this.scanner.lineStart\n\t                }\n\t            };\n\t        }\n\t        if (token.type === 9 /* RegularExpression */) {\n\t            var pattern = token.pattern;\n\t            var flags = token.flags;\n\t            t.regex = { pattern: pattern, flags: flags };\n\t        }\n\t        return t;\n\t    };\n\t    Parser.prototype.nextToken = function () {\n\t        var token = this.lookahead;\n\t        this.lastMarker.index = this.scanner.index;\n\t        this.lastMarker.line = this.scanner.lineNumber;\n\t        this.lastMarker.column = this.scanner.index - this.scanner.lineStart;\n\t        this.collectComments();\n\t        if (this.scanner.index !== this.startMarker.index) {\n\t            this.startMarker.index = this.scanner.index;\n\t            this.startMarker.line = this.scanner.lineNumber;\n\t            this.startMarker.column = this.scanner.index - this.scanner.lineStart;\n\t        }\n\t        var next = this.scanner.lex();\n\t        this.hasLineTerminator = (token.lineNumber !== next.lineNumber);\n\t        if (next && this.context.strict && next.type === 3 /* Identifier */) {\n\t            if (this.scanner.isStrictModeReservedWord(next.value)) {\n\t                next.type = 4 /* Keyword */;\n\t            }\n\t        }\n\t        this.lookahead = next;\n\t        if (this.config.tokens && next.type !== 2 /* EOF */) {\n\t            this.tokens.push(this.convertToken(next));\n\t        }\n\t        return token;\n\t    };\n\t    Parser.prototype.nextRegexToken = function () {\n\t        this.collectComments();\n\t        var token = this.scanner.scanRegExp();\n\t        if (this.config.tokens) {\n\t            // Pop the previous token, '/' or '/='\n\t            // This is added from the lookahead token.\n\t            this.tokens.pop();\n\t            this.tokens.push(this.convertToken(token));\n\t        }\n\t        // Prime the next lookahead.\n\t        this.lookahead = token;\n\t        this.nextToken();\n\t        return token;\n\t    };\n\t    Parser.prototype.createNode = function () {\n\t        return {\n\t            index: this.startMarker.index,\n\t            line: this.startMarker.line,\n\t            column: this.startMarker.column\n\t        };\n\t    };\n\t    Parser.prototype.startNode = function (token, lastLineStart) {\n\t        if (lastLineStart === void 0) { lastLineStart = 0; }\n\t        var column = token.start - token.lineStart;\n\t        var line = token.lineNumber;\n\t        if (column < 0) {\n\t            column += lastLineStart;\n\t            line--;\n\t        }\n\t        return {\n\t            index: token.start,\n\t            line: line,\n\t            column: column\n\t        };\n\t    };\n\t    Parser.prototype.finalize = function (marker, node) {\n\t        if (this.config.range) {\n\t            node.range = [marker.index, this.lastMarker.index];\n\t        }\n\t        if (this.config.loc) {\n\t            node.loc = {\n\t                start: {\n\t                    line: marker.line,\n\t                    column: marker.column,\n\t                },\n\t                end: {\n\t                    line: this.lastMarker.line,\n\t                    column: this.lastMarker.column\n\t                }\n\t            };\n\t            if (this.config.source) {\n\t                node.loc.source = this.config.source;\n\t            }\n\t        }\n\t        if (this.delegate) {\n\t            var metadata = {\n\t                start: {\n\t                    line: marker.line,\n\t                    column: marker.column,\n\t                    offset: marker.index\n\t                },\n\t                end: {\n\t                    line: this.lastMarker.line,\n\t                    column: this.lastMarker.column,\n\t                    offset: this.lastMarker.index\n\t                }\n\t            };\n\t            this.delegate(node, metadata);\n\t        }\n\t        return node;\n\t    };\n\t    // Expect the next token to match the specified punctuator.\n\t    // If not, an exception will be thrown.\n\t    Parser.prototype.expect = function (value) {\n\t        var token = this.nextToken();\n\t        if (token.type !== 7 /* Punctuator */ || token.value !== value) {\n\t            this.throwUnexpectedToken(token);\n\t        }\n\t    };\n\t    // Quietly expect a comma when in tolerant mode, otherwise delegates to expect().\n\t    Parser.prototype.expectCommaSeparator = function () {\n\t        if (this.config.tolerant) {\n\t            var token = this.lookahead;\n\t            if (token.type === 7 /* Punctuator */ && token.value === ',') {\n\t                this.nextToken();\n\t            }\n\t            else if (token.type === 7 /* Punctuator */ && token.value === ';') {\n\t                this.nextToken();\n\t                this.tolerateUnexpectedToken(token);\n\t            }\n\t            else {\n\t                this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken);\n\t            }\n\t        }\n\t        else {\n\t            this.expect(',');\n\t        }\n\t    };\n\t    // Expect the next token to match the specified keyword.\n\t    // If not, an exception will be thrown.\n\t    Parser.prototype.expectKeyword = function (keyword) {\n\t        var token = this.nextToken();\n\t        if (token.type !== 4 /* Keyword */ || token.value !== keyword) {\n\t            this.throwUnexpectedToken(token);\n\t        }\n\t    };\n\t    // Return true if the next token matches the specified punctuator.\n\t    Parser.prototype.match = function (value) {\n\t        return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value;\n\t    };\n\t    // Return true if the next token matches the specified keyword\n\t    Parser.prototype.matchKeyword = function (keyword) {\n\t        return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword;\n\t    };\n\t    // Return true if the next token matches the specified contextual keyword\n\t    // (where an identifier is sometimes a keyword depending on the context)\n\t    Parser.prototype.matchContextualKeyword = function (keyword) {\n\t        return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword;\n\t    };\n\t    // Return true if the next token is an assignment operator\n\t    Parser.prototype.matchAssign = function () {\n\t        if (this.lookahead.type !== 7 /* Punctuator */) {\n\t            return false;\n\t        }\n\t        var op = this.lookahead.value;\n\t        return op === '=' ||\n\t            op === '*=' ||\n\t            op === '**=' ||\n\t            op === '/=' ||\n\t            op === '%=' ||\n\t            op === '+=' ||\n\t            op === '-=' ||\n\t            op === '<<=' ||\n\t            op === '>>=' ||\n\t            op === '>>>=' ||\n\t            op === '&=' ||\n\t            op === '^=' ||\n\t            op === '|=';\n\t    };\n\t    // Cover grammar support.\n\t    //\n\t    // When an assignment expression position starts with an left parenthesis, the determination of the type\n\t    // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead)\n\t    // or the first comma. This situation also defers the determination of all the expressions nested in the pair.\n\t    //\n\t    // There are three productions that can be parsed in a parentheses pair that needs to be determined\n\t    // after the outermost pair is closed. They are:\n\t    //\n\t    //   1. AssignmentExpression\n\t    //   2. BindingElements\n\t    //   3. AssignmentTargets\n\t    //\n\t    // In order to avoid exponential backtracking, we use two flags to denote if the production can be\n\t    // binding element or assignment target.\n\t    //\n\t    // The three productions have the relationship:\n\t    //\n\t    //   BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression\n\t    //\n\t    // with a single exception that CoverInitializedName when used directly in an Expression, generates\n\t    // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the\n\t    // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair.\n\t    //\n\t    // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not\n\t    // effect the current flags. This means the production the parser parses is only used as an expression. Therefore\n\t    // the CoverInitializedName check is conducted.\n\t    //\n\t    // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates\n\t    // the flags outside of the parser. This means the production the parser parses is used as a part of a potential\n\t    // pattern. The CoverInitializedName check is deferred.\n\t    Parser.prototype.isolateCoverGrammar = function (parseFunction) {\n\t        var previousIsBindingElement = this.context.isBindingElement;\n\t        var previousIsAssignmentTarget = this.context.isAssignmentTarget;\n\t        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;\n\t        this.context.isBindingElement = true;\n\t        this.context.isAssignmentTarget = true;\n\t        this.context.firstCoverInitializedNameError = null;\n\t        var result = parseFunction.call(this);\n\t        if (this.context.firstCoverInitializedNameError !== null) {\n\t            this.throwUnexpectedToken(this.context.firstCoverInitializedNameError);\n\t        }\n\t        this.context.isBindingElement = previousIsBindingElement;\n\t        this.context.isAssignmentTarget = previousIsAssignmentTarget;\n\t        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError;\n\t        return result;\n\t    };\n\t    Parser.prototype.inheritCoverGrammar = function (parseFunction) {\n\t        var previousIsBindingElement = this.context.isBindingElement;\n\t        var previousIsAssignmentTarget = this.context.isAssignmentTarget;\n\t        var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError;\n\t        this.context.isBindingElement = true;\n\t        this.context.isAssignmentTarget = true;\n\t        this.context.firstCoverInitializedNameError = null;\n\t        var result = parseFunction.call(this);\n\t        this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement;\n\t        this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget;\n\t        this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError;\n\t        return result;\n\t    };\n\t    Parser.prototype.consumeSemicolon = function () {\n\t        if (this.match(';')) {\n\t            this.nextToken();\n\t        }\n\t        else if (!this.hasLineTerminator) {\n\t            if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) {\n\t                this.throwUnexpectedToken(this.lookahead);\n\t            }\n\t            this.lastMarker.index = this.startMarker.index;\n\t            this.lastMarker.line = this.startMarker.line;\n\t            this.lastMarker.column = this.startMarker.column;\n\t        }\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-primary-expression\n\t    Parser.prototype.parsePrimaryExpression = function () {\n\t        var node = this.createNode();\n\t        var expr;\n\t        var token, raw;\n\t        switch (this.lookahead.type) {\n\t            case 3 /* Identifier */:\n\t                if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') {\n\t                    this.tolerateUnexpectedToken(this.lookahead);\n\t                }\n\t                expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value));\n\t                break;\n\t            case 6 /* NumericLiteral */:\n\t            case 8 /* StringLiteral */:\n\t                if (this.context.strict && this.lookahead.octal) {\n\t                    this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral);\n\t                }\n\t                this.context.isAssignmentTarget = false;\n\t                this.context.isBindingElement = false;\n\t                token = this.nextToken();\n\t                raw = this.getTokenRaw(token);\n\t                expr = this.finalize(node, new Node.Literal(token.value, raw));\n\t                break;\n\t            case 1 /* BooleanLiteral */:\n\t                this.context.isAssignmentTarget = false;\n\t                this.context.isBindingElement = false;\n\t                token = this.nextToken();\n\t                raw = this.getTokenRaw(token);\n\t                expr = this.finalize(node, new Node.Literal(token.value === 'true', raw));\n\t                break;\n\t            case 5 /* NullLiteral */:\n\t                this.context.isAssignmentTarget = false;\n\t                this.context.isBindingElement = false;\n\t                token = this.nextToken();\n\t                raw = this.getTokenRaw(token);\n\t                expr = this.finalize(node, new Node.Literal(null, raw));\n\t                break;\n\t            case 10 /* Template */:\n\t                expr = this.parseTemplateLiteral();\n\t                break;\n\t            case 7 /* Punctuator */:\n\t                switch (this.lookahead.value) {\n\t                    case '(':\n\t                        this.context.isBindingElement = false;\n\t                        expr = this.inheritCoverGrammar(this.parseGroupExpression);\n\t                        break;\n\t                    case '[':\n\t                        expr = this.inheritCoverGrammar(this.parseArrayInitializer);\n\t                        break;\n\t                    case '{':\n\t                        expr = this.inheritCoverGrammar(this.parseObjectInitializer);\n\t                        break;\n\t                    case '/':\n\t                    case '/=':\n\t                        this.context.isAssignmentTarget = false;\n\t                        this.context.isBindingElement = false;\n\t                        this.scanner.index = this.startMarker.index;\n\t                        token = this.nextRegexToken();\n\t                        raw = this.getTokenRaw(token);\n\t                        expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags));\n\t                        break;\n\t                    default:\n\t                        expr = this.throwUnexpectedToken(this.nextToken());\n\t                }\n\t                break;\n\t            case 4 /* Keyword */:\n\t                if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) {\n\t                    expr = this.parseIdentifierName();\n\t                }\n\t                else if (!this.context.strict && this.matchKeyword('let')) {\n\t                    expr = this.finalize(node, new Node.Identifier(this.nextToken().value));\n\t                }\n\t                else {\n\t                    this.context.isAssignmentTarget = false;\n\t                    this.context.isBindingElement = false;\n\t                    if (this.matchKeyword('function')) {\n\t                        expr = this.parseFunctionExpression();\n\t                    }\n\t                    else if (this.matchKeyword('this')) {\n\t                        this.nextToken();\n\t                        expr = this.finalize(node, new Node.ThisExpression());\n\t                    }\n\t                    else if (this.matchKeyword('class')) {\n\t                        expr = this.parseClassExpression();\n\t                    }\n\t                    else {\n\t                        expr = this.throwUnexpectedToken(this.nextToken());\n\t                    }\n\t                }\n\t                break;\n\t            default:\n\t                expr = this.throwUnexpectedToken(this.nextToken());\n\t        }\n\t        return expr;\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-array-initializer\n\t    Parser.prototype.parseSpreadElement = function () {\n\t        var node = this.createNode();\n\t        this.expect('...');\n\t        var arg = this.inheritCoverGrammar(this.parseAssignmentExpression);\n\t        return this.finalize(node, new Node.SpreadElement(arg));\n\t    };\n\t    Parser.prototype.parseArrayInitializer = function () {\n\t        var node = this.createNode();\n\t        var elements = [];\n\t        this.expect('[');\n\t        while (!this.match(']')) {\n\t            if (this.match(',')) {\n\t                this.nextToken();\n\t                elements.push(null);\n\t            }\n\t            else if (this.match('...')) {\n\t                var element = this.parseSpreadElement();\n\t                if (!this.match(']')) {\n\t                    this.context.isAssignmentTarget = false;\n\t                    this.context.isBindingElement = false;\n\t                    this.expect(',');\n\t                }\n\t                elements.push(element);\n\t            }\n\t            else {\n\t                elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression));\n\t                if (!this.match(']')) {\n\t                    this.expect(',');\n\t                }\n\t            }\n\t        }\n\t        this.expect(']');\n\t        return this.finalize(node, new Node.ArrayExpression(elements));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-object-initializer\n\t    Parser.prototype.parsePropertyMethod = function (params) {\n\t        this.context.isAssignmentTarget = false;\n\t        this.context.isBindingElement = false;\n\t        var previousStrict = this.context.strict;\n\t        var previousAllowStrictDirective = this.context.allowStrictDirective;\n\t        this.context.allowStrictDirective = params.simple;\n\t        var body = this.isolateCoverGrammar(this.parseFunctionSourceElements);\n\t        if (this.context.strict && params.firstRestricted) {\n\t            this.tolerateUnexpectedToken(params.firstRestricted, params.message);\n\t        }\n\t        if (this.context.strict && params.stricted) {\n\t            this.tolerateUnexpectedToken(params.stricted, params.message);\n\t        }\n\t        this.context.strict = previousStrict;\n\t        this.context.allowStrictDirective = previousAllowStrictDirective;\n\t        return body;\n\t    };\n\t    Parser.prototype.parsePropertyMethodFunction = function () {\n\t        var isGenerator = false;\n\t        var node = this.createNode();\n\t        var previousAllowYield = this.context.allowYield;\n\t        this.context.allowYield = true;\n\t        var params = this.parseFormalParameters();\n\t        var method = this.parsePropertyMethod(params);\n\t        this.context.allowYield = previousAllowYield;\n\t        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));\n\t    };\n\t    Parser.prototype.parsePropertyMethodAsyncFunction = function () {\n\t        var node = this.createNode();\n\t        var previousAllowYield = this.context.allowYield;\n\t        var previousAwait = this.context.await;\n\t        this.context.allowYield = false;\n\t        this.context.await = true;\n\t        var params = this.parseFormalParameters();\n\t        var method = this.parsePropertyMethod(params);\n\t        this.context.allowYield = previousAllowYield;\n\t        this.context.await = previousAwait;\n\t        return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method));\n\t    };\n\t    Parser.prototype.parseObjectPropertyKey = function () {\n\t        var node = this.createNode();\n\t        var token = this.nextToken();\n\t        var key;\n\t        switch (token.type) {\n\t            case 8 /* StringLiteral */:\n\t            case 6 /* NumericLiteral */:\n\t                if (this.context.strict && token.octal) {\n\t                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral);\n\t                }\n\t                var raw = this.getTokenRaw(token);\n\t                key = this.finalize(node, new Node.Literal(token.value, raw));\n\t                break;\n\t            case 3 /* Identifier */:\n\t            case 1 /* BooleanLiteral */:\n\t            case 5 /* NullLiteral */:\n\t            case 4 /* Keyword */:\n\t                key = this.finalize(node, new Node.Identifier(token.value));\n\t                break;\n\t            case 7 /* Punctuator */:\n\t                if (token.value === '[') {\n\t                    key = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t                    this.expect(']');\n\t                }\n\t                else {\n\t                    key = this.throwUnexpectedToken(token);\n\t                }\n\t                break;\n\t            default:\n\t                key = this.throwUnexpectedToken(token);\n\t        }\n\t        return key;\n\t    };\n\t    Parser.prototype.isPropertyKey = function (key, value) {\n\t        return (key.type === syntax_1.Syntax.Identifier && key.name === value) ||\n\t            (key.type === syntax_1.Syntax.Literal && key.value === value);\n\t    };\n\t    Parser.prototype.parseObjectProperty = function (hasProto) {\n\t        var node = this.createNode();\n\t        var token = this.lookahead;\n\t        var kind;\n\t        var key = null;\n\t        var value = null;\n\t        var computed = false;\n\t        var method = false;\n\t        var shorthand = false;\n\t        var isAsync = false;\n\t        if (token.type === 3 /* Identifier */) {\n\t            var id = token.value;\n\t            this.nextToken();\n\t            computed = this.match('[');\n\t            isAsync = !this.hasLineTerminator && (id === 'async') &&\n\t                !this.match(':') && !this.match('(') && !this.match('*') && !this.match(',');\n\t            key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id));\n\t        }\n\t        else if (this.match('*')) {\n\t            this.nextToken();\n\t        }\n\t        else {\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t        }\n\t        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);\n\t        if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) {\n\t            kind = 'get';\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t            this.context.allowYield = false;\n\t            value = this.parseGetterMethod();\n\t        }\n\t        else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) {\n\t            kind = 'set';\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t            value = this.parseSetterMethod();\n\t        }\n\t        else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {\n\t            kind = 'init';\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t            value = this.parseGeneratorMethod();\n\t            method = true;\n\t        }\n\t        else {\n\t            if (!key) {\n\t                this.throwUnexpectedToken(this.lookahead);\n\t            }\n\t            kind = 'init';\n\t            if (this.match(':') && !isAsync) {\n\t                if (!computed && this.isPropertyKey(key, '__proto__')) {\n\t                    if (hasProto.value) {\n\t                        this.tolerateError(messages_1.Messages.DuplicateProtoProperty);\n\t                    }\n\t                    hasProto.value = true;\n\t                }\n\t                this.nextToken();\n\t                value = this.inheritCoverGrammar(this.parseAssignmentExpression);\n\t            }\n\t            else if (this.match('(')) {\n\t                value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();\n\t                method = true;\n\t            }\n\t            else if (token.type === 3 /* Identifier */) {\n\t                var id = this.finalize(node, new Node.Identifier(token.value));\n\t                if (this.match('=')) {\n\t                    this.context.firstCoverInitializedNameError = this.lookahead;\n\t                    this.nextToken();\n\t                    shorthand = true;\n\t                    var init = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t                    value = this.finalize(node, new Node.AssignmentPattern(id, init));\n\t                }\n\t                else {\n\t                    shorthand = true;\n\t                    value = id;\n\t                }\n\t            }\n\t            else {\n\t                this.throwUnexpectedToken(this.nextToken());\n\t            }\n\t        }\n\t        return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand));\n\t    };\n\t    Parser.prototype.parseObjectInitializer = function () {\n\t        var node = this.createNode();\n\t        this.expect('{');\n\t        var properties = [];\n\t        var hasProto = { value: false };\n\t        while (!this.match('}')) {\n\t            properties.push(this.parseObjectProperty(hasProto));\n\t            if (!this.match('}')) {\n\t                this.expectCommaSeparator();\n\t            }\n\t        }\n\t        this.expect('}');\n\t        return this.finalize(node, new Node.ObjectExpression(properties));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-template-literals\n\t    Parser.prototype.parseTemplateHead = function () {\n\t        assert_1.assert(this.lookahead.head, 'Template literal must start with a template head');\n\t        var node = this.createNode();\n\t        var token = this.nextToken();\n\t        var raw = token.value;\n\t        var cooked = token.cooked;\n\t        return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));\n\t    };\n\t    Parser.prototype.parseTemplateElement = function () {\n\t        if (this.lookahead.type !== 10 /* Template */) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        var node = this.createNode();\n\t        var token = this.nextToken();\n\t        var raw = token.value;\n\t        var cooked = token.cooked;\n\t        return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail));\n\t    };\n\t    Parser.prototype.parseTemplateLiteral = function () {\n\t        var node = this.createNode();\n\t        var expressions = [];\n\t        var quasis = [];\n\t        var quasi = this.parseTemplateHead();\n\t        quasis.push(quasi);\n\t        while (!quasi.tail) {\n\t            expressions.push(this.parseExpression());\n\t            quasi = this.parseTemplateElement();\n\t            quasis.push(quasi);\n\t        }\n\t        return this.finalize(node, new Node.TemplateLiteral(quasis, expressions));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-grouping-operator\n\t    Parser.prototype.reinterpretExpressionAsPattern = function (expr) {\n\t        switch (expr.type) {\n\t            case syntax_1.Syntax.Identifier:\n\t            case syntax_1.Syntax.MemberExpression:\n\t            case syntax_1.Syntax.RestElement:\n\t            case syntax_1.Syntax.AssignmentPattern:\n\t                break;\n\t            case syntax_1.Syntax.SpreadElement:\n\t                expr.type = syntax_1.Syntax.RestElement;\n\t                this.reinterpretExpressionAsPattern(expr.argument);\n\t                break;\n\t            case syntax_1.Syntax.ArrayExpression:\n\t                expr.type = syntax_1.Syntax.ArrayPattern;\n\t                for (var i = 0; i < expr.elements.length; i++) {\n\t                    if (expr.elements[i] !== null) {\n\t                        this.reinterpretExpressionAsPattern(expr.elements[i]);\n\t                    }\n\t                }\n\t                break;\n\t            case syntax_1.Syntax.ObjectExpression:\n\t                expr.type = syntax_1.Syntax.ObjectPattern;\n\t                for (var i = 0; i < expr.properties.length; i++) {\n\t                    this.reinterpretExpressionAsPattern(expr.properties[i].value);\n\t                }\n\t                break;\n\t            case syntax_1.Syntax.AssignmentExpression:\n\t                expr.type = syntax_1.Syntax.AssignmentPattern;\n\t                delete expr.operator;\n\t                this.reinterpretExpressionAsPattern(expr.left);\n\t                break;\n\t            default:\n\t                // Allow other node type for tolerant parsing.\n\t                break;\n\t        }\n\t    };\n\t    Parser.prototype.parseGroupExpression = function () {\n\t        var expr;\n\t        this.expect('(');\n\t        if (this.match(')')) {\n\t            this.nextToken();\n\t            if (!this.match('=>')) {\n\t                this.expect('=>');\n\t            }\n\t            expr = {\n\t                type: ArrowParameterPlaceHolder,\n\t                params: [],\n\t                async: false\n\t            };\n\t        }\n\t        else {\n\t            var startToken = this.lookahead;\n\t            var params = [];\n\t            if (this.match('...')) {\n\t                expr = this.parseRestElement(params);\n\t                this.expect(')');\n\t                if (!this.match('=>')) {\n\t                    this.expect('=>');\n\t                }\n\t                expr = {\n\t                    type: ArrowParameterPlaceHolder,\n\t                    params: [expr],\n\t                    async: false\n\t                };\n\t            }\n\t            else {\n\t                var arrow = false;\n\t                this.context.isBindingElement = true;\n\t                expr = this.inheritCoverGrammar(this.parseAssignmentExpression);\n\t                if (this.match(',')) {\n\t                    var expressions = [];\n\t                    this.context.isAssignmentTarget = false;\n\t                    expressions.push(expr);\n\t                    while (this.lookahead.type !== 2 /* EOF */) {\n\t                        if (!this.match(',')) {\n\t                            break;\n\t                        }\n\t                        this.nextToken();\n\t                        if (this.match(')')) {\n\t                            this.nextToken();\n\t                            for (var i = 0; i < expressions.length; i++) {\n\t                                this.reinterpretExpressionAsPattern(expressions[i]);\n\t                            }\n\t                            arrow = true;\n\t                            expr = {\n\t                                type: ArrowParameterPlaceHolder,\n\t                                params: expressions,\n\t                                async: false\n\t                            };\n\t                        }\n\t                        else if (this.match('...')) {\n\t                            if (!this.context.isBindingElement) {\n\t                                this.throwUnexpectedToken(this.lookahead);\n\t                            }\n\t                            expressions.push(this.parseRestElement(params));\n\t                            this.expect(')');\n\t                            if (!this.match('=>')) {\n\t                                this.expect('=>');\n\t                            }\n\t                            this.context.isBindingElement = false;\n\t                            for (var i = 0; i < expressions.length; i++) {\n\t                                this.reinterpretExpressionAsPattern(expressions[i]);\n\t                            }\n\t                            arrow = true;\n\t                            expr = {\n\t                                type: ArrowParameterPlaceHolder,\n\t                                params: expressions,\n\t                                async: false\n\t                            };\n\t                        }\n\t                        else {\n\t                            expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression));\n\t                        }\n\t                        if (arrow) {\n\t                            break;\n\t                        }\n\t                    }\n\t                    if (!arrow) {\n\t                        expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));\n\t                    }\n\t                }\n\t                if (!arrow) {\n\t                    this.expect(')');\n\t                    if (this.match('=>')) {\n\t                        if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') {\n\t                            arrow = true;\n\t                            expr = {\n\t                                type: ArrowParameterPlaceHolder,\n\t                                params: [expr],\n\t                                async: false\n\t                            };\n\t                        }\n\t                        if (!arrow) {\n\t                            if (!this.context.isBindingElement) {\n\t                                this.throwUnexpectedToken(this.lookahead);\n\t                            }\n\t                            if (expr.type === syntax_1.Syntax.SequenceExpression) {\n\t                                for (var i = 0; i < expr.expressions.length; i++) {\n\t                                    this.reinterpretExpressionAsPattern(expr.expressions[i]);\n\t                                }\n\t                            }\n\t                            else {\n\t                                this.reinterpretExpressionAsPattern(expr);\n\t                            }\n\t                            var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]);\n\t                            expr = {\n\t                                type: ArrowParameterPlaceHolder,\n\t                                params: parameters,\n\t                                async: false\n\t                            };\n\t                        }\n\t                    }\n\t                    this.context.isBindingElement = false;\n\t                }\n\t            }\n\t        }\n\t        return expr;\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions\n\t    Parser.prototype.parseArguments = function () {\n\t        this.expect('(');\n\t        var args = [];\n\t        if (!this.match(')')) {\n\t            while (true) {\n\t                var expr = this.match('...') ? this.parseSpreadElement() :\n\t                    this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t                args.push(expr);\n\t                if (this.match(')')) {\n\t                    break;\n\t                }\n\t                this.expectCommaSeparator();\n\t                if (this.match(')')) {\n\t                    break;\n\t                }\n\t            }\n\t        }\n\t        this.expect(')');\n\t        return args;\n\t    };\n\t    Parser.prototype.isIdentifierName = function (token) {\n\t        return token.type === 3 /* Identifier */ ||\n\t            token.type === 4 /* Keyword */ ||\n\t            token.type === 1 /* BooleanLiteral */ ||\n\t            token.type === 5 /* NullLiteral */;\n\t    };\n\t    Parser.prototype.parseIdentifierName = function () {\n\t        var node = this.createNode();\n\t        var token = this.nextToken();\n\t        if (!this.isIdentifierName(token)) {\n\t            this.throwUnexpectedToken(token);\n\t        }\n\t        return this.finalize(node, new Node.Identifier(token.value));\n\t    };\n\t    Parser.prototype.parseNewExpression = function () {\n\t        var node = this.createNode();\n\t        var id = this.parseIdentifierName();\n\t        assert_1.assert(id.name === 'new', 'New expression must start with `new`');\n\t        var expr;\n\t        if (this.match('.')) {\n\t            this.nextToken();\n\t            if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') {\n\t                var property = this.parseIdentifierName();\n\t                expr = new Node.MetaProperty(id, property);\n\t            }\n\t            else {\n\t                this.throwUnexpectedToken(this.lookahead);\n\t            }\n\t        }\n\t        else {\n\t            var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression);\n\t            var args = this.match('(') ? this.parseArguments() : [];\n\t            expr = new Node.NewExpression(callee, args);\n\t            this.context.isAssignmentTarget = false;\n\t            this.context.isBindingElement = false;\n\t        }\n\t        return this.finalize(node, expr);\n\t    };\n\t    Parser.prototype.parseAsyncArgument = function () {\n\t        var arg = this.parseAssignmentExpression();\n\t        this.context.firstCoverInitializedNameError = null;\n\t        return arg;\n\t    };\n\t    Parser.prototype.parseAsyncArguments = function () {\n\t        this.expect('(');\n\t        var args = [];\n\t        if (!this.match(')')) {\n\t            while (true) {\n\t                var expr = this.match('...') ? this.parseSpreadElement() :\n\t                    this.isolateCoverGrammar(this.parseAsyncArgument);\n\t                args.push(expr);\n\t                if (this.match(')')) {\n\t                    break;\n\t                }\n\t                this.expectCommaSeparator();\n\t                if (this.match(')')) {\n\t                    break;\n\t                }\n\t            }\n\t        }\n\t        this.expect(')');\n\t        return args;\n\t    };\n\t    Parser.prototype.parseLeftHandSideExpressionAllowCall = function () {\n\t        var startToken = this.lookahead;\n\t        var maybeAsync = this.matchContextualKeyword('async');\n\t        var previousAllowIn = this.context.allowIn;\n\t        this.context.allowIn = true;\n\t        var expr;\n\t        if (this.matchKeyword('super') && this.context.inFunctionBody) {\n\t            expr = this.createNode();\n\t            this.nextToken();\n\t            expr = this.finalize(expr, new Node.Super());\n\t            if (!this.match('(') && !this.match('.') && !this.match('[')) {\n\t                this.throwUnexpectedToken(this.lookahead);\n\t            }\n\t        }\n\t        else {\n\t            expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);\n\t        }\n\t        while (true) {\n\t            if (this.match('.')) {\n\t                this.context.isBindingElement = false;\n\t                this.context.isAssignmentTarget = true;\n\t                this.expect('.');\n\t                var property = this.parseIdentifierName();\n\t                expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property));\n\t            }\n\t            else if (this.match('(')) {\n\t                var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber);\n\t                this.context.isBindingElement = false;\n\t                this.context.isAssignmentTarget = false;\n\t                var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments();\n\t                expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args));\n\t                if (asyncArrow && this.match('=>')) {\n\t                    for (var i = 0; i < args.length; ++i) {\n\t                        this.reinterpretExpressionAsPattern(args[i]);\n\t                    }\n\t                    expr = {\n\t                        type: ArrowParameterPlaceHolder,\n\t                        params: args,\n\t                        async: true\n\t                    };\n\t                }\n\t            }\n\t            else if (this.match('[')) {\n\t                this.context.isBindingElement = false;\n\t                this.context.isAssignmentTarget = true;\n\t                this.expect('[');\n\t                var property = this.isolateCoverGrammar(this.parseExpression);\n\t                this.expect(']');\n\t                expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property));\n\t            }\n\t            else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {\n\t                var quasi = this.parseTemplateLiteral();\n\t                expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi));\n\t            }\n\t            else {\n\t                break;\n\t            }\n\t        }\n\t        this.context.allowIn = previousAllowIn;\n\t        return expr;\n\t    };\n\t    Parser.prototype.parseSuper = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('super');\n\t        if (!this.match('[') && !this.match('.')) {\n\t            this.throwUnexpectedToken(this.lookahead);\n\t        }\n\t        return this.finalize(node, new Node.Super());\n\t    };\n\t    Parser.prototype.parseLeftHandSideExpression = function () {\n\t        assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.');\n\t        var node = this.startNode(this.lookahead);\n\t        var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() :\n\t            this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression);\n\t        while (true) {\n\t            if (this.match('[')) {\n\t                this.context.isBindingElement = false;\n\t                this.context.isAssignmentTarget = true;\n\t                this.expect('[');\n\t                var property = this.isolateCoverGrammar(this.parseExpression);\n\t                this.expect(']');\n\t                expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property));\n\t            }\n\t            else if (this.match('.')) {\n\t                this.context.isBindingElement = false;\n\t                this.context.isAssignmentTarget = true;\n\t                this.expect('.');\n\t                var property = this.parseIdentifierName();\n\t                expr = this.finalize(node, new Node.StaticMemberExpression(expr, property));\n\t            }\n\t            else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) {\n\t                var quasi = this.parseTemplateLiteral();\n\t                expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi));\n\t            }\n\t            else {\n\t                break;\n\t            }\n\t        }\n\t        return expr;\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-update-expressions\n\t    Parser.prototype.parseUpdateExpression = function () {\n\t        var expr;\n\t        var startToken = this.lookahead;\n\t        if (this.match('++') || this.match('--')) {\n\t            var node = this.startNode(startToken);\n\t            var token = this.nextToken();\n\t            expr = this.inheritCoverGrammar(this.parseUnaryExpression);\n\t            if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {\n\t                this.tolerateError(messages_1.Messages.StrictLHSPrefix);\n\t            }\n\t            if (!this.context.isAssignmentTarget) {\n\t                this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);\n\t            }\n\t            var prefix = true;\n\t            expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix));\n\t            this.context.isAssignmentTarget = false;\n\t            this.context.isBindingElement = false;\n\t        }\n\t        else {\n\t            expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall);\n\t            if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) {\n\t                if (this.match('++') || this.match('--')) {\n\t                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) {\n\t                        this.tolerateError(messages_1.Messages.StrictLHSPostfix);\n\t                    }\n\t                    if (!this.context.isAssignmentTarget) {\n\t                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);\n\t                    }\n\t                    this.context.isAssignmentTarget = false;\n\t                    this.context.isBindingElement = false;\n\t                    var operator = this.nextToken().value;\n\t                    var prefix = false;\n\t                    expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix));\n\t                }\n\t            }\n\t        }\n\t        return expr;\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-unary-operators\n\t    Parser.prototype.parseAwaitExpression = function () {\n\t        var node = this.createNode();\n\t        this.nextToken();\n\t        var argument = this.parseUnaryExpression();\n\t        return this.finalize(node, new Node.AwaitExpression(argument));\n\t    };\n\t    Parser.prototype.parseUnaryExpression = function () {\n\t        var expr;\n\t        if (this.match('+') || this.match('-') || this.match('~') || this.match('!') ||\n\t            this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) {\n\t            var node = this.startNode(this.lookahead);\n\t            var token = this.nextToken();\n\t            expr = this.inheritCoverGrammar(this.parseUnaryExpression);\n\t            expr = this.finalize(node, new Node.UnaryExpression(token.value, expr));\n\t            if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) {\n\t                this.tolerateError(messages_1.Messages.StrictDelete);\n\t            }\n\t            this.context.isAssignmentTarget = false;\n\t            this.context.isBindingElement = false;\n\t        }\n\t        else if (this.context.await && this.matchContextualKeyword('await')) {\n\t            expr = this.parseAwaitExpression();\n\t        }\n\t        else {\n\t            expr = this.parseUpdateExpression();\n\t        }\n\t        return expr;\n\t    };\n\t    Parser.prototype.parseExponentiationExpression = function () {\n\t        var startToken = this.lookahead;\n\t        var expr = this.inheritCoverGrammar(this.parseUnaryExpression);\n\t        if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) {\n\t            this.nextToken();\n\t            this.context.isAssignmentTarget = false;\n\t            this.context.isBindingElement = false;\n\t            var left = expr;\n\t            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);\n\t            expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right));\n\t        }\n\t        return expr;\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-exp-operator\n\t    // https://tc39.github.io/ecma262/#sec-multiplicative-operators\n\t    // https://tc39.github.io/ecma262/#sec-additive-operators\n\t    // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators\n\t    // https://tc39.github.io/ecma262/#sec-relational-operators\n\t    // https://tc39.github.io/ecma262/#sec-equality-operators\n\t    // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators\n\t    // https://tc39.github.io/ecma262/#sec-binary-logical-operators\n\t    Parser.prototype.binaryPrecedence = function (token) {\n\t        var op = token.value;\n\t        var precedence;\n\t        if (token.type === 7 /* Punctuator */) {\n\t            precedence = this.operatorPrecedence[op] || 0;\n\t        }\n\t        else if (token.type === 4 /* Keyword */) {\n\t            precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0;\n\t        }\n\t        else {\n\t            precedence = 0;\n\t        }\n\t        return precedence;\n\t    };\n\t    Parser.prototype.parseBinaryExpression = function () {\n\t        var startToken = this.lookahead;\n\t        var expr = this.inheritCoverGrammar(this.parseExponentiationExpression);\n\t        var token = this.lookahead;\n\t        var prec = this.binaryPrecedence(token);\n\t        if (prec > 0) {\n\t            this.nextToken();\n\t            this.context.isAssignmentTarget = false;\n\t            this.context.isBindingElement = false;\n\t            var markers = [startToken, this.lookahead];\n\t            var left = expr;\n\t            var right = this.isolateCoverGrammar(this.parseExponentiationExpression);\n\t            var stack = [left, token.value, right];\n\t            var precedences = [prec];\n\t            while (true) {\n\t                prec = this.binaryPrecedence(this.lookahead);\n\t                if (prec <= 0) {\n\t                    break;\n\t                }\n\t                // Reduce: make a binary expression from the three topmost entries.\n\t                while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) {\n\t                    right = stack.pop();\n\t                    var operator = stack.pop();\n\t                    precedences.pop();\n\t                    left = stack.pop();\n\t                    markers.pop();\n\t                    var node = this.startNode(markers[markers.length - 1]);\n\t                    stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right)));\n\t                }\n\t                // Shift.\n\t                stack.push(this.nextToken().value);\n\t                precedences.push(prec);\n\t                markers.push(this.lookahead);\n\t                stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression));\n\t            }\n\t            // Final reduce to clean-up the stack.\n\t            var i = stack.length - 1;\n\t            expr = stack[i];\n\t            var lastMarker = markers.pop();\n\t            while (i > 1) {\n\t                var marker = markers.pop();\n\t                var lastLineStart = lastMarker && lastMarker.lineStart;\n\t                var node = this.startNode(marker, lastLineStart);\n\t                var operator = stack[i - 1];\n\t                expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr));\n\t                i -= 2;\n\t                lastMarker = marker;\n\t            }\n\t        }\n\t        return expr;\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-conditional-operator\n\t    Parser.prototype.parseConditionalExpression = function () {\n\t        var startToken = this.lookahead;\n\t        var expr = this.inheritCoverGrammar(this.parseBinaryExpression);\n\t        if (this.match('?')) {\n\t            this.nextToken();\n\t            var previousAllowIn = this.context.allowIn;\n\t            this.context.allowIn = true;\n\t            var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t            this.context.allowIn = previousAllowIn;\n\t            this.expect(':');\n\t            var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t            expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate));\n\t            this.context.isAssignmentTarget = false;\n\t            this.context.isBindingElement = false;\n\t        }\n\t        return expr;\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-assignment-operators\n\t    Parser.prototype.checkPatternParam = function (options, param) {\n\t        switch (param.type) {\n\t            case syntax_1.Syntax.Identifier:\n\t                this.validateParam(options, param, param.name);\n\t                break;\n\t            case syntax_1.Syntax.RestElement:\n\t                this.checkPatternParam(options, param.argument);\n\t                break;\n\t            case syntax_1.Syntax.AssignmentPattern:\n\t                this.checkPatternParam(options, param.left);\n\t                break;\n\t            case syntax_1.Syntax.ArrayPattern:\n\t                for (var i = 0; i < param.elements.length; i++) {\n\t                    if (param.elements[i] !== null) {\n\t                        this.checkPatternParam(options, param.elements[i]);\n\t                    }\n\t                }\n\t                break;\n\t            case syntax_1.Syntax.ObjectPattern:\n\t                for (var i = 0; i < param.properties.length; i++) {\n\t                    this.checkPatternParam(options, param.properties[i].value);\n\t                }\n\t                break;\n\t            default:\n\t                break;\n\t        }\n\t        options.simple = options.simple && (param instanceof Node.Identifier);\n\t    };\n\t    Parser.prototype.reinterpretAsCoverFormalsList = function (expr) {\n\t        var params = [expr];\n\t        var options;\n\t        var asyncArrow = false;\n\t        switch (expr.type) {\n\t            case syntax_1.Syntax.Identifier:\n\t                break;\n\t            case ArrowParameterPlaceHolder:\n\t                params = expr.params;\n\t                asyncArrow = expr.async;\n\t                break;\n\t            default:\n\t                return null;\n\t        }\n\t        options = {\n\t            simple: true,\n\t            paramSet: {}\n\t        };\n\t        for (var i = 0; i < params.length; ++i) {\n\t            var param = params[i];\n\t            if (param.type === syntax_1.Syntax.AssignmentPattern) {\n\t                if (param.right.type === syntax_1.Syntax.YieldExpression) {\n\t                    if (param.right.argument) {\n\t                        this.throwUnexpectedToken(this.lookahead);\n\t                    }\n\t                    param.right.type = syntax_1.Syntax.Identifier;\n\t                    param.right.name = 'yield';\n\t                    delete param.right.argument;\n\t                    delete param.right.delegate;\n\t                }\n\t            }\n\t            else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') {\n\t                this.throwUnexpectedToken(this.lookahead);\n\t            }\n\t            this.checkPatternParam(options, param);\n\t            params[i] = param;\n\t        }\n\t        if (this.context.strict || !this.context.allowYield) {\n\t            for (var i = 0; i < params.length; ++i) {\n\t                var param = params[i];\n\t                if (param.type === syntax_1.Syntax.YieldExpression) {\n\t                    this.throwUnexpectedToken(this.lookahead);\n\t                }\n\t            }\n\t        }\n\t        if (options.message === messages_1.Messages.StrictParamDupe) {\n\t            var token = this.context.strict ? options.stricted : options.firstRestricted;\n\t            this.throwUnexpectedToken(token, options.message);\n\t        }\n\t        return {\n\t            simple: options.simple,\n\t            params: params,\n\t            stricted: options.stricted,\n\t            firstRestricted: options.firstRestricted,\n\t            message: options.message\n\t        };\n\t    };\n\t    Parser.prototype.parseAssignmentExpression = function () {\n\t        var expr;\n\t        if (!this.context.allowYield && this.matchKeyword('yield')) {\n\t            expr = this.parseYieldExpression();\n\t        }\n\t        else {\n\t            var startToken = this.lookahead;\n\t            var token = startToken;\n\t            expr = this.parseConditionalExpression();\n\t            if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') {\n\t                if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) {\n\t                    var arg = this.parsePrimaryExpression();\n\t                    this.reinterpretExpressionAsPattern(arg);\n\t                    expr = {\n\t                        type: ArrowParameterPlaceHolder,\n\t                        params: [arg],\n\t                        async: true\n\t                    };\n\t                }\n\t            }\n\t            if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) {\n\t                // https://tc39.github.io/ecma262/#sec-arrow-function-definitions\n\t                this.context.isAssignmentTarget = false;\n\t                this.context.isBindingElement = false;\n\t                var isAsync = expr.async;\n\t                var list = this.reinterpretAsCoverFormalsList(expr);\n\t                if (list) {\n\t                    if (this.hasLineTerminator) {\n\t                        this.tolerateUnexpectedToken(this.lookahead);\n\t                    }\n\t                    this.context.firstCoverInitializedNameError = null;\n\t                    var previousStrict = this.context.strict;\n\t                    var previousAllowStrictDirective = this.context.allowStrictDirective;\n\t                    this.context.allowStrictDirective = list.simple;\n\t                    var previousAllowYield = this.context.allowYield;\n\t                    var previousAwait = this.context.await;\n\t                    this.context.allowYield = true;\n\t                    this.context.await = isAsync;\n\t                    var node = this.startNode(startToken);\n\t                    this.expect('=>');\n\t                    var body = void 0;\n\t                    if (this.match('{')) {\n\t                        var previousAllowIn = this.context.allowIn;\n\t                        this.context.allowIn = true;\n\t                        body = this.parseFunctionSourceElements();\n\t                        this.context.allowIn = previousAllowIn;\n\t                    }\n\t                    else {\n\t                        body = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t                    }\n\t                    var expression = body.type !== syntax_1.Syntax.BlockStatement;\n\t                    if (this.context.strict && list.firstRestricted) {\n\t                        this.throwUnexpectedToken(list.firstRestricted, list.message);\n\t                    }\n\t                    if (this.context.strict && list.stricted) {\n\t                        this.tolerateUnexpectedToken(list.stricted, list.message);\n\t                    }\n\t                    expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) :\n\t                        this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression));\n\t                    this.context.strict = previousStrict;\n\t                    this.context.allowStrictDirective = previousAllowStrictDirective;\n\t                    this.context.allowYield = previousAllowYield;\n\t                    this.context.await = previousAwait;\n\t                }\n\t            }\n\t            else {\n\t                if (this.matchAssign()) {\n\t                    if (!this.context.isAssignmentTarget) {\n\t                        this.tolerateError(messages_1.Messages.InvalidLHSInAssignment);\n\t                    }\n\t                    if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) {\n\t                        var id = expr;\n\t                        if (this.scanner.isRestrictedWord(id.name)) {\n\t                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment);\n\t                        }\n\t                        if (this.scanner.isStrictModeReservedWord(id.name)) {\n\t                            this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);\n\t                        }\n\t                    }\n\t                    if (!this.match('=')) {\n\t                        this.context.isAssignmentTarget = false;\n\t                        this.context.isBindingElement = false;\n\t                    }\n\t                    else {\n\t                        this.reinterpretExpressionAsPattern(expr);\n\t                    }\n\t                    token = this.nextToken();\n\t                    var operator = token.value;\n\t                    var right = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t                    expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right));\n\t                    this.context.firstCoverInitializedNameError = null;\n\t                }\n\t            }\n\t        }\n\t        return expr;\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-comma-operator\n\t    Parser.prototype.parseExpression = function () {\n\t        var startToken = this.lookahead;\n\t        var expr = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t        if (this.match(',')) {\n\t            var expressions = [];\n\t            expressions.push(expr);\n\t            while (this.lookahead.type !== 2 /* EOF */) {\n\t                if (!this.match(',')) {\n\t                    break;\n\t                }\n\t                this.nextToken();\n\t                expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression));\n\t            }\n\t            expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions));\n\t        }\n\t        return expr;\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-block\n\t    Parser.prototype.parseStatementListItem = function () {\n\t        var statement;\n\t        this.context.isAssignmentTarget = true;\n\t        this.context.isBindingElement = true;\n\t        if (this.lookahead.type === 4 /* Keyword */) {\n\t            switch (this.lookahead.value) {\n\t                case 'export':\n\t                    if (!this.context.isModule) {\n\t                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration);\n\t                    }\n\t                    statement = this.parseExportDeclaration();\n\t                    break;\n\t                case 'import':\n\t                    if (!this.context.isModule) {\n\t                        this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration);\n\t                    }\n\t                    statement = this.parseImportDeclaration();\n\t                    break;\n\t                case 'const':\n\t                    statement = this.parseLexicalDeclaration({ inFor: false });\n\t                    break;\n\t                case 'function':\n\t                    statement = this.parseFunctionDeclaration();\n\t                    break;\n\t                case 'class':\n\t                    statement = this.parseClassDeclaration();\n\t                    break;\n\t                case 'let':\n\t                    statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement();\n\t                    break;\n\t                default:\n\t                    statement = this.parseStatement();\n\t                    break;\n\t            }\n\t        }\n\t        else {\n\t            statement = this.parseStatement();\n\t        }\n\t        return statement;\n\t    };\n\t    Parser.prototype.parseBlock = function () {\n\t        var node = this.createNode();\n\t        this.expect('{');\n\t        var block = [];\n\t        while (true) {\n\t            if (this.match('}')) {\n\t                break;\n\t            }\n\t            block.push(this.parseStatementListItem());\n\t        }\n\t        this.expect('}');\n\t        return this.finalize(node, new Node.BlockStatement(block));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-let-and-const-declarations\n\t    Parser.prototype.parseLexicalBinding = function (kind, options) {\n\t        var node = this.createNode();\n\t        var params = [];\n\t        var id = this.parsePattern(params, kind);\n\t        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {\n\t            if (this.scanner.isRestrictedWord(id.name)) {\n\t                this.tolerateError(messages_1.Messages.StrictVarName);\n\t            }\n\t        }\n\t        var init = null;\n\t        if (kind === 'const') {\n\t            if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) {\n\t                if (this.match('=')) {\n\t                    this.nextToken();\n\t                    init = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t                }\n\t                else {\n\t                    this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const');\n\t                }\n\t            }\n\t        }\n\t        else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) {\n\t            this.expect('=');\n\t            init = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t        }\n\t        return this.finalize(node, new Node.VariableDeclarator(id, init));\n\t    };\n\t    Parser.prototype.parseBindingList = function (kind, options) {\n\t        var list = [this.parseLexicalBinding(kind, options)];\n\t        while (this.match(',')) {\n\t            this.nextToken();\n\t            list.push(this.parseLexicalBinding(kind, options));\n\t        }\n\t        return list;\n\t    };\n\t    Parser.prototype.isLexicalDeclaration = function () {\n\t        var state = this.scanner.saveState();\n\t        this.scanner.scanComments();\n\t        var next = this.scanner.lex();\n\t        this.scanner.restoreState(state);\n\t        return (next.type === 3 /* Identifier */) ||\n\t            (next.type === 7 /* Punctuator */ && next.value === '[') ||\n\t            (next.type === 7 /* Punctuator */ && next.value === '{') ||\n\t            (next.type === 4 /* Keyword */ && next.value === 'let') ||\n\t            (next.type === 4 /* Keyword */ && next.value === 'yield');\n\t    };\n\t    Parser.prototype.parseLexicalDeclaration = function (options) {\n\t        var node = this.createNode();\n\t        var kind = this.nextToken().value;\n\t        assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const');\n\t        var declarations = this.parseBindingList(kind, options);\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.VariableDeclaration(declarations, kind));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns\n\t    Parser.prototype.parseBindingRestElement = function (params, kind) {\n\t        var node = this.createNode();\n\t        this.expect('...');\n\t        var arg = this.parsePattern(params, kind);\n\t        return this.finalize(node, new Node.RestElement(arg));\n\t    };\n\t    Parser.prototype.parseArrayPattern = function (params, kind) {\n\t        var node = this.createNode();\n\t        this.expect('[');\n\t        var elements = [];\n\t        while (!this.match(']')) {\n\t            if (this.match(',')) {\n\t                this.nextToken();\n\t                elements.push(null);\n\t            }\n\t            else {\n\t                if (this.match('...')) {\n\t                    elements.push(this.parseBindingRestElement(params, kind));\n\t                    break;\n\t                }\n\t                else {\n\t                    elements.push(this.parsePatternWithDefault(params, kind));\n\t                }\n\t                if (!this.match(']')) {\n\t                    this.expect(',');\n\t                }\n\t            }\n\t        }\n\t        this.expect(']');\n\t        return this.finalize(node, new Node.ArrayPattern(elements));\n\t    };\n\t    Parser.prototype.parsePropertyPattern = function (params, kind) {\n\t        var node = this.createNode();\n\t        var computed = false;\n\t        var shorthand = false;\n\t        var method = false;\n\t        var key;\n\t        var value;\n\t        if (this.lookahead.type === 3 /* Identifier */) {\n\t            var keyToken = this.lookahead;\n\t            key = this.parseVariableIdentifier();\n\t            var init = this.finalize(node, new Node.Identifier(keyToken.value));\n\t            if (this.match('=')) {\n\t                params.push(keyToken);\n\t                shorthand = true;\n\t                this.nextToken();\n\t                var expr = this.parseAssignmentExpression();\n\t                value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr));\n\t            }\n\t            else if (!this.match(':')) {\n\t                params.push(keyToken);\n\t                shorthand = true;\n\t                value = init;\n\t            }\n\t            else {\n\t                this.expect(':');\n\t                value = this.parsePatternWithDefault(params, kind);\n\t            }\n\t        }\n\t        else {\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t            this.expect(':');\n\t            value = this.parsePatternWithDefault(params, kind);\n\t        }\n\t        return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand));\n\t    };\n\t    Parser.prototype.parseObjectPattern = function (params, kind) {\n\t        var node = this.createNode();\n\t        var properties = [];\n\t        this.expect('{');\n\t        while (!this.match('}')) {\n\t            properties.push(this.parsePropertyPattern(params, kind));\n\t            if (!this.match('}')) {\n\t                this.expect(',');\n\t            }\n\t        }\n\t        this.expect('}');\n\t        return this.finalize(node, new Node.ObjectPattern(properties));\n\t    };\n\t    Parser.prototype.parsePattern = function (params, kind) {\n\t        var pattern;\n\t        if (this.match('[')) {\n\t            pattern = this.parseArrayPattern(params, kind);\n\t        }\n\t        else if (this.match('{')) {\n\t            pattern = this.parseObjectPattern(params, kind);\n\t        }\n\t        else {\n\t            if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) {\n\t                this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding);\n\t            }\n\t            params.push(this.lookahead);\n\t            pattern = this.parseVariableIdentifier(kind);\n\t        }\n\t        return pattern;\n\t    };\n\t    Parser.prototype.parsePatternWithDefault = function (params, kind) {\n\t        var startToken = this.lookahead;\n\t        var pattern = this.parsePattern(params, kind);\n\t        if (this.match('=')) {\n\t            this.nextToken();\n\t            var previousAllowYield = this.context.allowYield;\n\t            this.context.allowYield = true;\n\t            var right = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t            this.context.allowYield = previousAllowYield;\n\t            pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right));\n\t        }\n\t        return pattern;\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-variable-statement\n\t    Parser.prototype.parseVariableIdentifier = function (kind) {\n\t        var node = this.createNode();\n\t        var token = this.nextToken();\n\t        if (token.type === 4 /* Keyword */ && token.value === 'yield') {\n\t            if (this.context.strict) {\n\t                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);\n\t            }\n\t            else if (!this.context.allowYield) {\n\t                this.throwUnexpectedToken(token);\n\t            }\n\t        }\n\t        else if (token.type !== 3 /* Identifier */) {\n\t            if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) {\n\t                this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord);\n\t            }\n\t            else {\n\t                if (this.context.strict || token.value !== 'let' || kind !== 'var') {\n\t                    this.throwUnexpectedToken(token);\n\t                }\n\t            }\n\t        }\n\t        else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') {\n\t            this.tolerateUnexpectedToken(token);\n\t        }\n\t        return this.finalize(node, new Node.Identifier(token.value));\n\t    };\n\t    Parser.prototype.parseVariableDeclaration = function (options) {\n\t        var node = this.createNode();\n\t        var params = [];\n\t        var id = this.parsePattern(params, 'var');\n\t        if (this.context.strict && id.type === syntax_1.Syntax.Identifier) {\n\t            if (this.scanner.isRestrictedWord(id.name)) {\n\t                this.tolerateError(messages_1.Messages.StrictVarName);\n\t            }\n\t        }\n\t        var init = null;\n\t        if (this.match('=')) {\n\t            this.nextToken();\n\t            init = this.isolateCoverGrammar(this.parseAssignmentExpression);\n\t        }\n\t        else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) {\n\t            this.expect('=');\n\t        }\n\t        return this.finalize(node, new Node.VariableDeclarator(id, init));\n\t    };\n\t    Parser.prototype.parseVariableDeclarationList = function (options) {\n\t        var opt = { inFor: options.inFor };\n\t        var list = [];\n\t        list.push(this.parseVariableDeclaration(opt));\n\t        while (this.match(',')) {\n\t            this.nextToken();\n\t            list.push(this.parseVariableDeclaration(opt));\n\t        }\n\t        return list;\n\t    };\n\t    Parser.prototype.parseVariableStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('var');\n\t        var declarations = this.parseVariableDeclarationList({ inFor: false });\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.VariableDeclaration(declarations, 'var'));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-empty-statement\n\t    Parser.prototype.parseEmptyStatement = function () {\n\t        var node = this.createNode();\n\t        this.expect(';');\n\t        return this.finalize(node, new Node.EmptyStatement());\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-expression-statement\n\t    Parser.prototype.parseExpressionStatement = function () {\n\t        var node = this.createNode();\n\t        var expr = this.parseExpression();\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.ExpressionStatement(expr));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-if-statement\n\t    Parser.prototype.parseIfClause = function () {\n\t        if (this.context.strict && this.matchKeyword('function')) {\n\t            this.tolerateError(messages_1.Messages.StrictFunction);\n\t        }\n\t        return this.parseStatement();\n\t    };\n\t    Parser.prototype.parseIfStatement = function () {\n\t        var node = this.createNode();\n\t        var consequent;\n\t        var alternate = null;\n\t        this.expectKeyword('if');\n\t        this.expect('(');\n\t        var test = this.parseExpression();\n\t        if (!this.match(')') && this.config.tolerant) {\n\t            this.tolerateUnexpectedToken(this.nextToken());\n\t            consequent = this.finalize(this.createNode(), new Node.EmptyStatement());\n\t        }\n\t        else {\n\t            this.expect(')');\n\t            consequent = this.parseIfClause();\n\t            if (this.matchKeyword('else')) {\n\t                this.nextToken();\n\t                alternate = this.parseIfClause();\n\t            }\n\t        }\n\t        return this.finalize(node, new Node.IfStatement(test, consequent, alternate));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-do-while-statement\n\t    Parser.prototype.parseDoWhileStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('do');\n\t        var previousInIteration = this.context.inIteration;\n\t        this.context.inIteration = true;\n\t        var body = this.parseStatement();\n\t        this.context.inIteration = previousInIteration;\n\t        this.expectKeyword('while');\n\t        this.expect('(');\n\t        var test = this.parseExpression();\n\t        if (!this.match(')') && this.config.tolerant) {\n\t            this.tolerateUnexpectedToken(this.nextToken());\n\t        }\n\t        else {\n\t            this.expect(')');\n\t            if (this.match(';')) {\n\t                this.nextToken();\n\t            }\n\t        }\n\t        return this.finalize(node, new Node.DoWhileStatement(body, test));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-while-statement\n\t    Parser.prototype.parseWhileStatement = function () {\n\t        var node = this.createNode();\n\t        var body;\n\t        this.expectKeyword('while');\n\t        this.expect('(');\n\t        var test = this.parseExpression();\n\t        if (!this.match(')') && this.config.tolerant) {\n\t            this.tolerateUnexpectedToken(this.nextToken());\n\t            body = this.finalize(this.createNode(), new Node.EmptyStatement());\n\t        }\n\t        else {\n\t            this.expect(')');\n\t            var previousInIteration = this.context.inIteration;\n\t            this.context.inIteration = true;\n\t            body = this.parseStatement();\n\t            this.context.inIteration = previousInIteration;\n\t        }\n\t        return this.finalize(node, new Node.WhileStatement(test, body));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-for-statement\n\t    // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements\n\t    Parser.prototype.parseForStatement = function () {\n\t        var init = null;\n\t        var test = null;\n\t        var update = null;\n\t        var forIn = true;\n\t        var left, right;\n\t        var node = this.createNode();\n\t        this.expectKeyword('for');\n\t        this.expect('(');\n\t        if (this.match(';')) {\n\t            this.nextToken();\n\t        }\n\t        else {\n\t            if (this.matchKeyword('var')) {\n\t                init = this.createNode();\n\t                this.nextToken();\n\t                var previousAllowIn = this.context.allowIn;\n\t                this.context.allowIn = false;\n\t                var declarations = this.parseVariableDeclarationList({ inFor: true });\n\t                this.context.allowIn = previousAllowIn;\n\t                if (declarations.length === 1 && this.matchKeyword('in')) {\n\t                    var decl = declarations[0];\n\t                    if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) {\n\t                        this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in');\n\t                    }\n\t                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));\n\t                    this.nextToken();\n\t                    left = init;\n\t                    right = this.parseExpression();\n\t                    init = null;\n\t                }\n\t                else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {\n\t                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));\n\t                    this.nextToken();\n\t                    left = init;\n\t                    right = this.parseAssignmentExpression();\n\t                    init = null;\n\t                    forIn = false;\n\t                }\n\t                else {\n\t                    init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var'));\n\t                    this.expect(';');\n\t                }\n\t            }\n\t            else if (this.matchKeyword('const') || this.matchKeyword('let')) {\n\t                init = this.createNode();\n\t                var kind = this.nextToken().value;\n\t                if (!this.context.strict && this.lookahead.value === 'in') {\n\t                    init = this.finalize(init, new Node.Identifier(kind));\n\t                    this.nextToken();\n\t                    left = init;\n\t                    right = this.parseExpression();\n\t                    init = null;\n\t                }\n\t                else {\n\t                    var previousAllowIn = this.context.allowIn;\n\t                    this.context.allowIn = false;\n\t                    var declarations = this.parseBindingList(kind, { inFor: true });\n\t                    this.context.allowIn = previousAllowIn;\n\t                    if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) {\n\t                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));\n\t                        this.nextToken();\n\t                        left = init;\n\t                        right = this.parseExpression();\n\t                        init = null;\n\t                    }\n\t                    else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) {\n\t                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));\n\t                        this.nextToken();\n\t                        left = init;\n\t                        right = this.parseAssignmentExpression();\n\t                        init = null;\n\t                        forIn = false;\n\t                    }\n\t                    else {\n\t                        this.consumeSemicolon();\n\t                        init = this.finalize(init, new Node.VariableDeclaration(declarations, kind));\n\t                    }\n\t                }\n\t            }\n\t            else {\n\t                var initStartToken = this.lookahead;\n\t                var previousAllowIn = this.context.allowIn;\n\t                this.context.allowIn = false;\n\t                init = this.inheritCoverGrammar(this.parseAssignmentExpression);\n\t                this.context.allowIn = previousAllowIn;\n\t                if (this.matchKeyword('in')) {\n\t                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {\n\t                        this.tolerateError(messages_1.Messages.InvalidLHSInForIn);\n\t                    }\n\t                    this.nextToken();\n\t                    this.reinterpretExpressionAsPattern(init);\n\t                    left = init;\n\t                    right = this.parseExpression();\n\t                    init = null;\n\t                }\n\t                else if (this.matchContextualKeyword('of')) {\n\t                    if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) {\n\t                        this.tolerateError(messages_1.Messages.InvalidLHSInForLoop);\n\t                    }\n\t                    this.nextToken();\n\t                    this.reinterpretExpressionAsPattern(init);\n\t                    left = init;\n\t                    right = this.parseAssignmentExpression();\n\t                    init = null;\n\t                    forIn = false;\n\t                }\n\t                else {\n\t                    if (this.match(',')) {\n\t                        var initSeq = [init];\n\t                        while (this.match(',')) {\n\t                            this.nextToken();\n\t                            initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression));\n\t                        }\n\t                        init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq));\n\t                    }\n\t                    this.expect(';');\n\t                }\n\t            }\n\t        }\n\t        if (typeof left === 'undefined') {\n\t            if (!this.match(';')) {\n\t                test = this.parseExpression();\n\t            }\n\t            this.expect(';');\n\t            if (!this.match(')')) {\n\t                update = this.parseExpression();\n\t            }\n\t        }\n\t        var body;\n\t        if (!this.match(')') && this.config.tolerant) {\n\t            this.tolerateUnexpectedToken(this.nextToken());\n\t            body = this.finalize(this.createNode(), new Node.EmptyStatement());\n\t        }\n\t        else {\n\t            this.expect(')');\n\t            var previousInIteration = this.context.inIteration;\n\t            this.context.inIteration = true;\n\t            body = this.isolateCoverGrammar(this.parseStatement);\n\t            this.context.inIteration = previousInIteration;\n\t        }\n\t        return (typeof left === 'undefined') ?\n\t            this.finalize(node, new Node.ForStatement(init, test, update, body)) :\n\t            forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) :\n\t                this.finalize(node, new Node.ForOfStatement(left, right, body));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-continue-statement\n\t    Parser.prototype.parseContinueStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('continue');\n\t        var label = null;\n\t        if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {\n\t            var id = this.parseVariableIdentifier();\n\t            label = id;\n\t            var key = '$' + id.name;\n\t            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {\n\t                this.throwError(messages_1.Messages.UnknownLabel, id.name);\n\t            }\n\t        }\n\t        this.consumeSemicolon();\n\t        if (label === null && !this.context.inIteration) {\n\t            this.throwError(messages_1.Messages.IllegalContinue);\n\t        }\n\t        return this.finalize(node, new Node.ContinueStatement(label));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-break-statement\n\t    Parser.prototype.parseBreakStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('break');\n\t        var label = null;\n\t        if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) {\n\t            var id = this.parseVariableIdentifier();\n\t            var key = '$' + id.name;\n\t            if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {\n\t                this.throwError(messages_1.Messages.UnknownLabel, id.name);\n\t            }\n\t            label = id;\n\t        }\n\t        this.consumeSemicolon();\n\t        if (label === null && !this.context.inIteration && !this.context.inSwitch) {\n\t            this.throwError(messages_1.Messages.IllegalBreak);\n\t        }\n\t        return this.finalize(node, new Node.BreakStatement(label));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-return-statement\n\t    Parser.prototype.parseReturnStatement = function () {\n\t        if (!this.context.inFunctionBody) {\n\t            this.tolerateError(messages_1.Messages.IllegalReturn);\n\t        }\n\t        var node = this.createNode();\n\t        this.expectKeyword('return');\n\t        var hasArgument = (!this.match(';') && !this.match('}') &&\n\t            !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */) ||\n\t            this.lookahead.type === 8 /* StringLiteral */ ||\n\t            this.lookahead.type === 10 /* Template */;\n\t        var argument = hasArgument ? this.parseExpression() : null;\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.ReturnStatement(argument));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-with-statement\n\t    Parser.prototype.parseWithStatement = function () {\n\t        if (this.context.strict) {\n\t            this.tolerateError(messages_1.Messages.StrictModeWith);\n\t        }\n\t        var node = this.createNode();\n\t        var body;\n\t        this.expectKeyword('with');\n\t        this.expect('(');\n\t        var object = this.parseExpression();\n\t        if (!this.match(')') && this.config.tolerant) {\n\t            this.tolerateUnexpectedToken(this.nextToken());\n\t            body = this.finalize(this.createNode(), new Node.EmptyStatement());\n\t        }\n\t        else {\n\t            this.expect(')');\n\t            body = this.parseStatement();\n\t        }\n\t        return this.finalize(node, new Node.WithStatement(object, body));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-switch-statement\n\t    Parser.prototype.parseSwitchCase = function () {\n\t        var node = this.createNode();\n\t        var test;\n\t        if (this.matchKeyword('default')) {\n\t            this.nextToken();\n\t            test = null;\n\t        }\n\t        else {\n\t            this.expectKeyword('case');\n\t            test = this.parseExpression();\n\t        }\n\t        this.expect(':');\n\t        var consequent = [];\n\t        while (true) {\n\t            if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) {\n\t                break;\n\t            }\n\t            consequent.push(this.parseStatementListItem());\n\t        }\n\t        return this.finalize(node, new Node.SwitchCase(test, consequent));\n\t    };\n\t    Parser.prototype.parseSwitchStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('switch');\n\t        this.expect('(');\n\t        var discriminant = this.parseExpression();\n\t        this.expect(')');\n\t        var previousInSwitch = this.context.inSwitch;\n\t        this.context.inSwitch = true;\n\t        var cases = [];\n\t        var defaultFound = false;\n\t        this.expect('{');\n\t        while (true) {\n\t            if (this.match('}')) {\n\t                break;\n\t            }\n\t            var clause = this.parseSwitchCase();\n\t            if (clause.test === null) {\n\t                if (defaultFound) {\n\t                    this.throwError(messages_1.Messages.MultipleDefaultsInSwitch);\n\t                }\n\t                defaultFound = true;\n\t            }\n\t            cases.push(clause);\n\t        }\n\t        this.expect('}');\n\t        this.context.inSwitch = previousInSwitch;\n\t        return this.finalize(node, new Node.SwitchStatement(discriminant, cases));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-labelled-statements\n\t    Parser.prototype.parseLabelledStatement = function () {\n\t        var node = this.createNode();\n\t        var expr = this.parseExpression();\n\t        var statement;\n\t        if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) {\n\t            this.nextToken();\n\t            var id = expr;\n\t            var key = '$' + id.name;\n\t            if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) {\n\t                this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name);\n\t            }\n\t            this.context.labelSet[key] = true;\n\t            var body = void 0;\n\t            if (this.matchKeyword('class')) {\n\t                this.tolerateUnexpectedToken(this.lookahead);\n\t                body = this.parseClassDeclaration();\n\t            }\n\t            else if (this.matchKeyword('function')) {\n\t                var token = this.lookahead;\n\t                var declaration = this.parseFunctionDeclaration();\n\t                if (this.context.strict) {\n\t                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction);\n\t                }\n\t                else if (declaration.generator) {\n\t                    this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext);\n\t                }\n\t                body = declaration;\n\t            }\n\t            else {\n\t                body = this.parseStatement();\n\t            }\n\t            delete this.context.labelSet[key];\n\t            statement = new Node.LabeledStatement(id, body);\n\t        }\n\t        else {\n\t            this.consumeSemicolon();\n\t            statement = new Node.ExpressionStatement(expr);\n\t        }\n\t        return this.finalize(node, statement);\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-throw-statement\n\t    Parser.prototype.parseThrowStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('throw');\n\t        if (this.hasLineTerminator) {\n\t            this.throwError(messages_1.Messages.NewlineAfterThrow);\n\t        }\n\t        var argument = this.parseExpression();\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.ThrowStatement(argument));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-try-statement\n\t    Parser.prototype.parseCatchClause = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('catch');\n\t        this.expect('(');\n\t        if (this.match(')')) {\n\t            this.throwUnexpectedToken(this.lookahead);\n\t        }\n\t        var params = [];\n\t        var param = this.parsePattern(params);\n\t        var paramMap = {};\n\t        for (var i = 0; i < params.length; i++) {\n\t            var key = '$' + params[i].value;\n\t            if (Object.prototype.hasOwnProperty.call(paramMap, key)) {\n\t                this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value);\n\t            }\n\t            paramMap[key] = true;\n\t        }\n\t        if (this.context.strict && param.type === syntax_1.Syntax.Identifier) {\n\t            if (this.scanner.isRestrictedWord(param.name)) {\n\t                this.tolerateError(messages_1.Messages.StrictCatchVariable);\n\t            }\n\t        }\n\t        this.expect(')');\n\t        var body = this.parseBlock();\n\t        return this.finalize(node, new Node.CatchClause(param, body));\n\t    };\n\t    Parser.prototype.parseFinallyClause = function () {\n\t        this.expectKeyword('finally');\n\t        return this.parseBlock();\n\t    };\n\t    Parser.prototype.parseTryStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('try');\n\t        var block = this.parseBlock();\n\t        var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null;\n\t        var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null;\n\t        if (!handler && !finalizer) {\n\t            this.throwError(messages_1.Messages.NoCatchOrFinally);\n\t        }\n\t        return this.finalize(node, new Node.TryStatement(block, handler, finalizer));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-debugger-statement\n\t    Parser.prototype.parseDebuggerStatement = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('debugger');\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.DebuggerStatement());\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations\n\t    Parser.prototype.parseStatement = function () {\n\t        var statement;\n\t        switch (this.lookahead.type) {\n\t            case 1 /* BooleanLiteral */:\n\t            case 5 /* NullLiteral */:\n\t            case 6 /* NumericLiteral */:\n\t            case 8 /* StringLiteral */:\n\t            case 10 /* Template */:\n\t            case 9 /* RegularExpression */:\n\t                statement = this.parseExpressionStatement();\n\t                break;\n\t            case 7 /* Punctuator */:\n\t                var value = this.lookahead.value;\n\t                if (value === '{') {\n\t                    statement = this.parseBlock();\n\t                }\n\t                else if (value === '(') {\n\t                    statement = this.parseExpressionStatement();\n\t                }\n\t                else if (value === ';') {\n\t                    statement = this.parseEmptyStatement();\n\t                }\n\t                else {\n\t                    statement = this.parseExpressionStatement();\n\t                }\n\t                break;\n\t            case 3 /* Identifier */:\n\t                statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement();\n\t                break;\n\t            case 4 /* Keyword */:\n\t                switch (this.lookahead.value) {\n\t                    case 'break':\n\t                        statement = this.parseBreakStatement();\n\t                        break;\n\t                    case 'continue':\n\t                        statement = this.parseContinueStatement();\n\t                        break;\n\t                    case 'debugger':\n\t                        statement = this.parseDebuggerStatement();\n\t                        break;\n\t                    case 'do':\n\t                        statement = this.parseDoWhileStatement();\n\t                        break;\n\t                    case 'for':\n\t                        statement = this.parseForStatement();\n\t                        break;\n\t                    case 'function':\n\t                        statement = this.parseFunctionDeclaration();\n\t                        break;\n\t                    case 'if':\n\t                        statement = this.parseIfStatement();\n\t                        break;\n\t                    case 'return':\n\t                        statement = this.parseReturnStatement();\n\t                        break;\n\t                    case 'switch':\n\t                        statement = this.parseSwitchStatement();\n\t                        break;\n\t                    case 'throw':\n\t                        statement = this.parseThrowStatement();\n\t                        break;\n\t                    case 'try':\n\t                        statement = this.parseTryStatement();\n\t                        break;\n\t                    case 'var':\n\t                        statement = this.parseVariableStatement();\n\t                        break;\n\t                    case 'while':\n\t                        statement = this.parseWhileStatement();\n\t                        break;\n\t                    case 'with':\n\t                        statement = this.parseWithStatement();\n\t                        break;\n\t                    default:\n\t                        statement = this.parseExpressionStatement();\n\t                        break;\n\t                }\n\t                break;\n\t            default:\n\t                statement = this.throwUnexpectedToken(this.lookahead);\n\t        }\n\t        return statement;\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-function-definitions\n\t    Parser.prototype.parseFunctionSourceElements = function () {\n\t        var node = this.createNode();\n\t        this.expect('{');\n\t        var body = this.parseDirectivePrologues();\n\t        var previousLabelSet = this.context.labelSet;\n\t        var previousInIteration = this.context.inIteration;\n\t        var previousInSwitch = this.context.inSwitch;\n\t        var previousInFunctionBody = this.context.inFunctionBody;\n\t        this.context.labelSet = {};\n\t        this.context.inIteration = false;\n\t        this.context.inSwitch = false;\n\t        this.context.inFunctionBody = true;\n\t        while (this.lookahead.type !== 2 /* EOF */) {\n\t            if (this.match('}')) {\n\t                break;\n\t            }\n\t            body.push(this.parseStatementListItem());\n\t        }\n\t        this.expect('}');\n\t        this.context.labelSet = previousLabelSet;\n\t        this.context.inIteration = previousInIteration;\n\t        this.context.inSwitch = previousInSwitch;\n\t        this.context.inFunctionBody = previousInFunctionBody;\n\t        return this.finalize(node, new Node.BlockStatement(body));\n\t    };\n\t    Parser.prototype.validateParam = function (options, param, name) {\n\t        var key = '$' + name;\n\t        if (this.context.strict) {\n\t            if (this.scanner.isRestrictedWord(name)) {\n\t                options.stricted = param;\n\t                options.message = messages_1.Messages.StrictParamName;\n\t            }\n\t            if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {\n\t                options.stricted = param;\n\t                options.message = messages_1.Messages.StrictParamDupe;\n\t            }\n\t        }\n\t        else if (!options.firstRestricted) {\n\t            if (this.scanner.isRestrictedWord(name)) {\n\t                options.firstRestricted = param;\n\t                options.message = messages_1.Messages.StrictParamName;\n\t            }\n\t            else if (this.scanner.isStrictModeReservedWord(name)) {\n\t                options.firstRestricted = param;\n\t                options.message = messages_1.Messages.StrictReservedWord;\n\t            }\n\t            else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) {\n\t                options.stricted = param;\n\t                options.message = messages_1.Messages.StrictParamDupe;\n\t            }\n\t        }\n\t        /* istanbul ignore next */\n\t        if (typeof Object.defineProperty === 'function') {\n\t            Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true });\n\t        }\n\t        else {\n\t            options.paramSet[key] = true;\n\t        }\n\t    };\n\t    Parser.prototype.parseRestElement = function (params) {\n\t        var node = this.createNode();\n\t        this.expect('...');\n\t        var arg = this.parsePattern(params);\n\t        if (this.match('=')) {\n\t            this.throwError(messages_1.Messages.DefaultRestParameter);\n\t        }\n\t        if (!this.match(')')) {\n\t            this.throwError(messages_1.Messages.ParameterAfterRestParameter);\n\t        }\n\t        return this.finalize(node, new Node.RestElement(arg));\n\t    };\n\t    Parser.prototype.parseFormalParameter = function (options) {\n\t        var params = [];\n\t        var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params);\n\t        for (var i = 0; i < params.length; i++) {\n\t            this.validateParam(options, params[i], params[i].value);\n\t        }\n\t        options.simple = options.simple && (param instanceof Node.Identifier);\n\t        options.params.push(param);\n\t    };\n\t    Parser.prototype.parseFormalParameters = function (firstRestricted) {\n\t        var options;\n\t        options = {\n\t            simple: true,\n\t            params: [],\n\t            firstRestricted: firstRestricted\n\t        };\n\t        this.expect('(');\n\t        if (!this.match(')')) {\n\t            options.paramSet = {};\n\t            while (this.lookahead.type !== 2 /* EOF */) {\n\t                this.parseFormalParameter(options);\n\t                if (this.match(')')) {\n\t                    break;\n\t                }\n\t                this.expect(',');\n\t                if (this.match(')')) {\n\t                    break;\n\t                }\n\t            }\n\t        }\n\t        this.expect(')');\n\t        return {\n\t            simple: options.simple,\n\t            params: options.params,\n\t            stricted: options.stricted,\n\t            firstRestricted: options.firstRestricted,\n\t            message: options.message\n\t        };\n\t    };\n\t    Parser.prototype.matchAsyncFunction = function () {\n\t        var match = this.matchContextualKeyword('async');\n\t        if (match) {\n\t            var state = this.scanner.saveState();\n\t            this.scanner.scanComments();\n\t            var next = this.scanner.lex();\n\t            this.scanner.restoreState(state);\n\t            match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function');\n\t        }\n\t        return match;\n\t    };\n\t    Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) {\n\t        var node = this.createNode();\n\t        var isAsync = this.matchContextualKeyword('async');\n\t        if (isAsync) {\n\t            this.nextToken();\n\t        }\n\t        this.expectKeyword('function');\n\t        var isGenerator = isAsync ? false : this.match('*');\n\t        if (isGenerator) {\n\t            this.nextToken();\n\t        }\n\t        var message;\n\t        var id = null;\n\t        var firstRestricted = null;\n\t        if (!identifierIsOptional || !this.match('(')) {\n\t            var token = this.lookahead;\n\t            id = this.parseVariableIdentifier();\n\t            if (this.context.strict) {\n\t                if (this.scanner.isRestrictedWord(token.value)) {\n\t                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);\n\t                }\n\t            }\n\t            else {\n\t                if (this.scanner.isRestrictedWord(token.value)) {\n\t                    firstRestricted = token;\n\t                    message = messages_1.Messages.StrictFunctionName;\n\t                }\n\t                else if (this.scanner.isStrictModeReservedWord(token.value)) {\n\t                    firstRestricted = token;\n\t                    message = messages_1.Messages.StrictReservedWord;\n\t                }\n\t            }\n\t        }\n\t        var previousAllowAwait = this.context.await;\n\t        var previousAllowYield = this.context.allowYield;\n\t        this.context.await = isAsync;\n\t        this.context.allowYield = !isGenerator;\n\t        var formalParameters = this.parseFormalParameters(firstRestricted);\n\t        var params = formalParameters.params;\n\t        var stricted = formalParameters.stricted;\n\t        firstRestricted = formalParameters.firstRestricted;\n\t        if (formalParameters.message) {\n\t            message = formalParameters.message;\n\t        }\n\t        var previousStrict = this.context.strict;\n\t        var previousAllowStrictDirective = this.context.allowStrictDirective;\n\t        this.context.allowStrictDirective = formalParameters.simple;\n\t        var body = this.parseFunctionSourceElements();\n\t        if (this.context.strict && firstRestricted) {\n\t            this.throwUnexpectedToken(firstRestricted, message);\n\t        }\n\t        if (this.context.strict && stricted) {\n\t            this.tolerateUnexpectedToken(stricted, message);\n\t        }\n\t        this.context.strict = previousStrict;\n\t        this.context.allowStrictDirective = previousAllowStrictDirective;\n\t        this.context.await = previousAllowAwait;\n\t        this.context.allowYield = previousAllowYield;\n\t        return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) :\n\t            this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator));\n\t    };\n\t    Parser.prototype.parseFunctionExpression = function () {\n\t        var node = this.createNode();\n\t        var isAsync = this.matchContextualKeyword('async');\n\t        if (isAsync) {\n\t            this.nextToken();\n\t        }\n\t        this.expectKeyword('function');\n\t        var isGenerator = isAsync ? false : this.match('*');\n\t        if (isGenerator) {\n\t            this.nextToken();\n\t        }\n\t        var message;\n\t        var id = null;\n\t        var firstRestricted;\n\t        var previousAllowAwait = this.context.await;\n\t        var previousAllowYield = this.context.allowYield;\n\t        this.context.await = isAsync;\n\t        this.context.allowYield = !isGenerator;\n\t        if (!this.match('(')) {\n\t            var token = this.lookahead;\n\t            id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier();\n\t            if (this.context.strict) {\n\t                if (this.scanner.isRestrictedWord(token.value)) {\n\t                    this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName);\n\t                }\n\t            }\n\t            else {\n\t                if (this.scanner.isRestrictedWord(token.value)) {\n\t                    firstRestricted = token;\n\t                    message = messages_1.Messages.StrictFunctionName;\n\t                }\n\t                else if (this.scanner.isStrictModeReservedWord(token.value)) {\n\t                    firstRestricted = token;\n\t                    message = messages_1.Messages.StrictReservedWord;\n\t                }\n\t            }\n\t        }\n\t        var formalParameters = this.parseFormalParameters(firstRestricted);\n\t        var params = formalParameters.params;\n\t        var stricted = formalParameters.stricted;\n\t        firstRestricted = formalParameters.firstRestricted;\n\t        if (formalParameters.message) {\n\t            message = formalParameters.message;\n\t        }\n\t        var previousStrict = this.context.strict;\n\t        var previousAllowStrictDirective = this.context.allowStrictDirective;\n\t        this.context.allowStrictDirective = formalParameters.simple;\n\t        var body = this.parseFunctionSourceElements();\n\t        if (this.context.strict && firstRestricted) {\n\t            this.throwUnexpectedToken(firstRestricted, message);\n\t        }\n\t        if (this.context.strict && stricted) {\n\t            this.tolerateUnexpectedToken(stricted, message);\n\t        }\n\t        this.context.strict = previousStrict;\n\t        this.context.allowStrictDirective = previousAllowStrictDirective;\n\t        this.context.await = previousAllowAwait;\n\t        this.context.allowYield = previousAllowYield;\n\t        return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) :\n\t            this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive\n\t    Parser.prototype.parseDirective = function () {\n\t        var token = this.lookahead;\n\t        var node = this.createNode();\n\t        var expr = this.parseExpression();\n\t        var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null;\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr));\n\t    };\n\t    Parser.prototype.parseDirectivePrologues = function () {\n\t        var firstRestricted = null;\n\t        var body = [];\n\t        while (true) {\n\t            var token = this.lookahead;\n\t            if (token.type !== 8 /* StringLiteral */) {\n\t                break;\n\t            }\n\t            var statement = this.parseDirective();\n\t            body.push(statement);\n\t            var directive = statement.directive;\n\t            if (typeof directive !== 'string') {\n\t                break;\n\t            }\n\t            if (directive === 'use strict') {\n\t                this.context.strict = true;\n\t                if (firstRestricted) {\n\t                    this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral);\n\t                }\n\t                if (!this.context.allowStrictDirective) {\n\t                    this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective);\n\t                }\n\t            }\n\t            else {\n\t                if (!firstRestricted && token.octal) {\n\t                    firstRestricted = token;\n\t                }\n\t            }\n\t        }\n\t        return body;\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-method-definitions\n\t    Parser.prototype.qualifiedPropertyName = function (token) {\n\t        switch (token.type) {\n\t            case 3 /* Identifier */:\n\t            case 8 /* StringLiteral */:\n\t            case 1 /* BooleanLiteral */:\n\t            case 5 /* NullLiteral */:\n\t            case 6 /* NumericLiteral */:\n\t            case 4 /* Keyword */:\n\t                return true;\n\t            case 7 /* Punctuator */:\n\t                return token.value === '[';\n\t            default:\n\t                break;\n\t        }\n\t        return false;\n\t    };\n\t    Parser.prototype.parseGetterMethod = function () {\n\t        var node = this.createNode();\n\t        var isGenerator = false;\n\t        var previousAllowYield = this.context.allowYield;\n\t        this.context.allowYield = !isGenerator;\n\t        var formalParameters = this.parseFormalParameters();\n\t        if (formalParameters.params.length > 0) {\n\t            this.tolerateError(messages_1.Messages.BadGetterArity);\n\t        }\n\t        var method = this.parsePropertyMethod(formalParameters);\n\t        this.context.allowYield = previousAllowYield;\n\t        return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));\n\t    };\n\t    Parser.prototype.parseSetterMethod = function () {\n\t        var node = this.createNode();\n\t        var isGenerator = false;\n\t        var previousAllowYield = this.context.allowYield;\n\t        this.context.allowYield = !isGenerator;\n\t        var formalParameters = this.parseFormalParameters();\n\t        if (formalParameters.params.length !== 1) {\n\t            this.tolerateError(messages_1.Messages.BadSetterArity);\n\t        }\n\t        else if (formalParameters.params[0] instanceof Node.RestElement) {\n\t            this.tolerateError(messages_1.Messages.BadSetterRestParameter);\n\t        }\n\t        var method = this.parsePropertyMethod(formalParameters);\n\t        this.context.allowYield = previousAllowYield;\n\t        return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator));\n\t    };\n\t    Parser.prototype.parseGeneratorMethod = function () {\n\t        var node = this.createNode();\n\t        var isGenerator = true;\n\t        var previousAllowYield = this.context.allowYield;\n\t        this.context.allowYield = true;\n\t        var params = this.parseFormalParameters();\n\t        this.context.allowYield = false;\n\t        var method = this.parsePropertyMethod(params);\n\t        this.context.allowYield = previousAllowYield;\n\t        return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-generator-function-definitions\n\t    Parser.prototype.isStartOfExpression = function () {\n\t        var start = true;\n\t        var value = this.lookahead.value;\n\t        switch (this.lookahead.type) {\n\t            case 7 /* Punctuator */:\n\t                start = (value === '[') || (value === '(') || (value === '{') ||\n\t                    (value === '+') || (value === '-') ||\n\t                    (value === '!') || (value === '~') ||\n\t                    (value === '++') || (value === '--') ||\n\t                    (value === '/') || (value === '/='); // regular expression literal\n\t                break;\n\t            case 4 /* Keyword */:\n\t                start = (value === 'class') || (value === 'delete') ||\n\t                    (value === 'function') || (value === 'let') || (value === 'new') ||\n\t                    (value === 'super') || (value === 'this') || (value === 'typeof') ||\n\t                    (value === 'void') || (value === 'yield');\n\t                break;\n\t            default:\n\t                break;\n\t        }\n\t        return start;\n\t    };\n\t    Parser.prototype.parseYieldExpression = function () {\n\t        var node = this.createNode();\n\t        this.expectKeyword('yield');\n\t        var argument = null;\n\t        var delegate = false;\n\t        if (!this.hasLineTerminator) {\n\t            var previousAllowYield = this.context.allowYield;\n\t            this.context.allowYield = false;\n\t            delegate = this.match('*');\n\t            if (delegate) {\n\t                this.nextToken();\n\t                argument = this.parseAssignmentExpression();\n\t            }\n\t            else if (this.isStartOfExpression()) {\n\t                argument = this.parseAssignmentExpression();\n\t            }\n\t            this.context.allowYield = previousAllowYield;\n\t        }\n\t        return this.finalize(node, new Node.YieldExpression(argument, delegate));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-class-definitions\n\t    Parser.prototype.parseClassElement = function (hasConstructor) {\n\t        var token = this.lookahead;\n\t        var node = this.createNode();\n\t        var kind = '';\n\t        var key = null;\n\t        var value = null;\n\t        var computed = false;\n\t        var method = false;\n\t        var isStatic = false;\n\t        var isAsync = false;\n\t        if (this.match('*')) {\n\t            this.nextToken();\n\t        }\n\t        else {\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t            var id = key;\n\t            if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) {\n\t                token = this.lookahead;\n\t                isStatic = true;\n\t                computed = this.match('[');\n\t                if (this.match('*')) {\n\t                    this.nextToken();\n\t                }\n\t                else {\n\t                    key = this.parseObjectPropertyKey();\n\t                }\n\t            }\n\t            if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) {\n\t                var punctuator = this.lookahead.value;\n\t                if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') {\n\t                    isAsync = true;\n\t                    token = this.lookahead;\n\t                    key = this.parseObjectPropertyKey();\n\t                    if (token.type === 3 /* Identifier */ && token.value === 'constructor') {\n\t                        this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync);\n\t                    }\n\t                }\n\t            }\n\t        }\n\t        var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead);\n\t        if (token.type === 3 /* Identifier */) {\n\t            if (token.value === 'get' && lookaheadPropertyKey) {\n\t                kind = 'get';\n\t                computed = this.match('[');\n\t                key = this.parseObjectPropertyKey();\n\t                this.context.allowYield = false;\n\t                value = this.parseGetterMethod();\n\t            }\n\t            else if (token.value === 'set' && lookaheadPropertyKey) {\n\t                kind = 'set';\n\t                computed = this.match('[');\n\t                key = this.parseObjectPropertyKey();\n\t                value = this.parseSetterMethod();\n\t            }\n\t        }\n\t        else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) {\n\t            kind = 'init';\n\t            computed = this.match('[');\n\t            key = this.parseObjectPropertyKey();\n\t            value = this.parseGeneratorMethod();\n\t            method = true;\n\t        }\n\t        if (!kind && key && this.match('(')) {\n\t            kind = 'init';\n\t            value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction();\n\t            method = true;\n\t        }\n\t        if (!kind) {\n\t            this.throwUnexpectedToken(this.lookahead);\n\t        }\n\t        if (kind === 'init') {\n\t            kind = 'method';\n\t        }\n\t        if (!computed) {\n\t            if (isStatic && this.isPropertyKey(key, 'prototype')) {\n\t                this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype);\n\t            }\n\t            if (!isStatic && this.isPropertyKey(key, 'constructor')) {\n\t                if (kind !== 'method' || !method || (value && value.generator)) {\n\t                    this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod);\n\t                }\n\t                if (hasConstructor.value) {\n\t                    this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor);\n\t                }\n\t                else {\n\t                    hasConstructor.value = true;\n\t                }\n\t                kind = 'constructor';\n\t            }\n\t        }\n\t        return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic));\n\t    };\n\t    Parser.prototype.parseClassElementList = function () {\n\t        var body = [];\n\t        var hasConstructor = { value: false };\n\t        this.expect('{');\n\t        while (!this.match('}')) {\n\t            if (this.match(';')) {\n\t                this.nextToken();\n\t            }\n\t            else {\n\t                body.push(this.parseClassElement(hasConstructor));\n\t            }\n\t        }\n\t        this.expect('}');\n\t        return body;\n\t    };\n\t    Parser.prototype.parseClassBody = function () {\n\t        var node = this.createNode();\n\t        var elementList = this.parseClassElementList();\n\t        return this.finalize(node, new Node.ClassBody(elementList));\n\t    };\n\t    Parser.prototype.parseClassDeclaration = function (identifierIsOptional) {\n\t        var node = this.createNode();\n\t        var previousStrict = this.context.strict;\n\t        this.context.strict = true;\n\t        this.expectKeyword('class');\n\t        var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier();\n\t        var superClass = null;\n\t        if (this.matchKeyword('extends')) {\n\t            this.nextToken();\n\t            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);\n\t        }\n\t        var classBody = this.parseClassBody();\n\t        this.context.strict = previousStrict;\n\t        return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody));\n\t    };\n\t    Parser.prototype.parseClassExpression = function () {\n\t        var node = this.createNode();\n\t        var previousStrict = this.context.strict;\n\t        this.context.strict = true;\n\t        this.expectKeyword('class');\n\t        var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null;\n\t        var superClass = null;\n\t        if (this.matchKeyword('extends')) {\n\t            this.nextToken();\n\t            superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall);\n\t        }\n\t        var classBody = this.parseClassBody();\n\t        this.context.strict = previousStrict;\n\t        return this.finalize(node, new Node.ClassExpression(id, superClass, classBody));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-scripts\n\t    // https://tc39.github.io/ecma262/#sec-modules\n\t    Parser.prototype.parseModule = function () {\n\t        this.context.strict = true;\n\t        this.context.isModule = true;\n\t        this.scanner.isModule = true;\n\t        var node = this.createNode();\n\t        var body = this.parseDirectivePrologues();\n\t        while (this.lookahead.type !== 2 /* EOF */) {\n\t            body.push(this.parseStatementListItem());\n\t        }\n\t        return this.finalize(node, new Node.Module(body));\n\t    };\n\t    Parser.prototype.parseScript = function () {\n\t        var node = this.createNode();\n\t        var body = this.parseDirectivePrologues();\n\t        while (this.lookahead.type !== 2 /* EOF */) {\n\t            body.push(this.parseStatementListItem());\n\t        }\n\t        return this.finalize(node, new Node.Script(body));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-imports\n\t    Parser.prototype.parseModuleSpecifier = function () {\n\t        var node = this.createNode();\n\t        if (this.lookahead.type !== 8 /* StringLiteral */) {\n\t            this.throwError(messages_1.Messages.InvalidModuleSpecifier);\n\t        }\n\t        var token = this.nextToken();\n\t        var raw = this.getTokenRaw(token);\n\t        return this.finalize(node, new Node.Literal(token.value, raw));\n\t    };\n\t    // import {<foo as bar>} ...;\n\t    Parser.prototype.parseImportSpecifier = function () {\n\t        var node = this.createNode();\n\t        var imported;\n\t        var local;\n\t        if (this.lookahead.type === 3 /* Identifier */) {\n\t            imported = this.parseVariableIdentifier();\n\t            local = imported;\n\t            if (this.matchContextualKeyword('as')) {\n\t                this.nextToken();\n\t                local = this.parseVariableIdentifier();\n\t            }\n\t        }\n\t        else {\n\t            imported = this.parseIdentifierName();\n\t            local = imported;\n\t            if (this.matchContextualKeyword('as')) {\n\t                this.nextToken();\n\t                local = this.parseVariableIdentifier();\n\t            }\n\t            else {\n\t                this.throwUnexpectedToken(this.nextToken());\n\t            }\n\t        }\n\t        return this.finalize(node, new Node.ImportSpecifier(local, imported));\n\t    };\n\t    // {foo, bar as bas}\n\t    Parser.prototype.parseNamedImports = function () {\n\t        this.expect('{');\n\t        var specifiers = [];\n\t        while (!this.match('}')) {\n\t            specifiers.push(this.parseImportSpecifier());\n\t            if (!this.match('}')) {\n\t                this.expect(',');\n\t            }\n\t        }\n\t        this.expect('}');\n\t        return specifiers;\n\t    };\n\t    // import <foo> ...;\n\t    Parser.prototype.parseImportDefaultSpecifier = function () {\n\t        var node = this.createNode();\n\t        var local = this.parseIdentifierName();\n\t        return this.finalize(node, new Node.ImportDefaultSpecifier(local));\n\t    };\n\t    // import <* as foo> ...;\n\t    Parser.prototype.parseImportNamespaceSpecifier = function () {\n\t        var node = this.createNode();\n\t        this.expect('*');\n\t        if (!this.matchContextualKeyword('as')) {\n\t            this.throwError(messages_1.Messages.NoAsAfterImportNamespace);\n\t        }\n\t        this.nextToken();\n\t        var local = this.parseIdentifierName();\n\t        return this.finalize(node, new Node.ImportNamespaceSpecifier(local));\n\t    };\n\t    Parser.prototype.parseImportDeclaration = function () {\n\t        if (this.context.inFunctionBody) {\n\t            this.throwError(messages_1.Messages.IllegalImportDeclaration);\n\t        }\n\t        var node = this.createNode();\n\t        this.expectKeyword('import');\n\t        var src;\n\t        var specifiers = [];\n\t        if (this.lookahead.type === 8 /* StringLiteral */) {\n\t            // import 'foo';\n\t            src = this.parseModuleSpecifier();\n\t        }\n\t        else {\n\t            if (this.match('{')) {\n\t                // import {bar}\n\t                specifiers = specifiers.concat(this.parseNamedImports());\n\t            }\n\t            else if (this.match('*')) {\n\t                // import * as foo\n\t                specifiers.push(this.parseImportNamespaceSpecifier());\n\t            }\n\t            else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) {\n\t                // import foo\n\t                specifiers.push(this.parseImportDefaultSpecifier());\n\t                if (this.match(',')) {\n\t                    this.nextToken();\n\t                    if (this.match('*')) {\n\t                        // import foo, * as foo\n\t                        specifiers.push(this.parseImportNamespaceSpecifier());\n\t                    }\n\t                    else if (this.match('{')) {\n\t                        // import foo, {bar}\n\t                        specifiers = specifiers.concat(this.parseNamedImports());\n\t                    }\n\t                    else {\n\t                        this.throwUnexpectedToken(this.lookahead);\n\t                    }\n\t                }\n\t            }\n\t            else {\n\t                this.throwUnexpectedToken(this.nextToken());\n\t            }\n\t            if (!this.matchContextualKeyword('from')) {\n\t                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;\n\t                this.throwError(message, this.lookahead.value);\n\t            }\n\t            this.nextToken();\n\t            src = this.parseModuleSpecifier();\n\t        }\n\t        this.consumeSemicolon();\n\t        return this.finalize(node, new Node.ImportDeclaration(specifiers, src));\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-exports\n\t    Parser.prototype.parseExportSpecifier = function () {\n\t        var node = this.createNode();\n\t        var local = this.parseIdentifierName();\n\t        var exported = local;\n\t        if (this.matchContextualKeyword('as')) {\n\t            this.nextToken();\n\t            exported = this.parseIdentifierName();\n\t        }\n\t        return this.finalize(node, new Node.ExportSpecifier(local, exported));\n\t    };\n\t    Parser.prototype.parseExportDeclaration = function () {\n\t        if (this.context.inFunctionBody) {\n\t            this.throwError(messages_1.Messages.IllegalExportDeclaration);\n\t        }\n\t        var node = this.createNode();\n\t        this.expectKeyword('export');\n\t        var exportDeclaration;\n\t        if (this.matchKeyword('default')) {\n\t            // export default ...\n\t            this.nextToken();\n\t            if (this.matchKeyword('function')) {\n\t                // export default function foo () {}\n\t                // export default function () {}\n\t                var declaration = this.parseFunctionDeclaration(true);\n\t                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));\n\t            }\n\t            else if (this.matchKeyword('class')) {\n\t                // export default class foo {}\n\t                var declaration = this.parseClassDeclaration(true);\n\t                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));\n\t            }\n\t            else if (this.matchContextualKeyword('async')) {\n\t                // export default async function f () {}\n\t                // export default async function () {}\n\t                // export default async x => x\n\t                var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression();\n\t                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));\n\t            }\n\t            else {\n\t                if (this.matchContextualKeyword('from')) {\n\t                    this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value);\n\t                }\n\t                // export default {};\n\t                // export default [];\n\t                // export default (1 + 2);\n\t                var declaration = this.match('{') ? this.parseObjectInitializer() :\n\t                    this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression();\n\t                this.consumeSemicolon();\n\t                exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration));\n\t            }\n\t        }\n\t        else if (this.match('*')) {\n\t            // export * from 'foo';\n\t            this.nextToken();\n\t            if (!this.matchContextualKeyword('from')) {\n\t                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;\n\t                this.throwError(message, this.lookahead.value);\n\t            }\n\t            this.nextToken();\n\t            var src = this.parseModuleSpecifier();\n\t            this.consumeSemicolon();\n\t            exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src));\n\t        }\n\t        else if (this.lookahead.type === 4 /* Keyword */) {\n\t            // export var f = 1;\n\t            var declaration = void 0;\n\t            switch (this.lookahead.value) {\n\t                case 'let':\n\t                case 'const':\n\t                    declaration = this.parseLexicalDeclaration({ inFor: false });\n\t                    break;\n\t                case 'var':\n\t                case 'class':\n\t                case 'function':\n\t                    declaration = this.parseStatementListItem();\n\t                    break;\n\t                default:\n\t                    this.throwUnexpectedToken(this.lookahead);\n\t            }\n\t            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));\n\t        }\n\t        else if (this.matchAsyncFunction()) {\n\t            var declaration = this.parseFunctionDeclaration();\n\t            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null));\n\t        }\n\t        else {\n\t            var specifiers = [];\n\t            var source = null;\n\t            var isExportFromIdentifier = false;\n\t            this.expect('{');\n\t            while (!this.match('}')) {\n\t                isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default');\n\t                specifiers.push(this.parseExportSpecifier());\n\t                if (!this.match('}')) {\n\t                    this.expect(',');\n\t                }\n\t            }\n\t            this.expect('}');\n\t            if (this.matchContextualKeyword('from')) {\n\t                // export {default} from 'foo';\n\t                // export {foo} from 'foo';\n\t                this.nextToken();\n\t                source = this.parseModuleSpecifier();\n\t                this.consumeSemicolon();\n\t            }\n\t            else if (isExportFromIdentifier) {\n\t                // export {default}; // missing fromClause\n\t                var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause;\n\t                this.throwError(message, this.lookahead.value);\n\t            }\n\t            else {\n\t                // export {foo};\n\t                this.consumeSemicolon();\n\t            }\n\t            exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source));\n\t        }\n\t        return exportDeclaration;\n\t    };\n\t    return Parser;\n\t}());\n\texports.Parser = Parser;\n\n\n/***/ },\n/* 9 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t// Ensure the condition is true, otherwise throw an error.\n\t// This is only to have a better contract semantic, i.e. another safety net\n\t// to catch a logic error. The condition shall be fulfilled in normal case.\n\t// Do NOT use this to enforce a certain condition on any user input.\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tfunction assert(condition, message) {\n\t    /* istanbul ignore if */\n\t    if (!condition) {\n\t        throw new Error('ASSERT: ' + message);\n\t    }\n\t}\n\texports.assert = assert;\n\n\n/***/ },\n/* 10 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t/* tslint:disable:max-classes-per-file */\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar ErrorHandler = (function () {\n\t    function ErrorHandler() {\n\t        this.errors = [];\n\t        this.tolerant = false;\n\t    }\n\t    ErrorHandler.prototype.recordError = function (error) {\n\t        this.errors.push(error);\n\t    };\n\t    ErrorHandler.prototype.tolerate = function (error) {\n\t        if (this.tolerant) {\n\t            this.recordError(error);\n\t        }\n\t        else {\n\t            throw error;\n\t        }\n\t    };\n\t    ErrorHandler.prototype.constructError = function (msg, column) {\n\t        var error = new Error(msg);\n\t        try {\n\t            throw error;\n\t        }\n\t        catch (base) {\n\t            /* istanbul ignore else */\n\t            if (Object.create && Object.defineProperty) {\n\t                error = Object.create(base);\n\t                Object.defineProperty(error, 'column', { value: column });\n\t            }\n\t        }\n\t        /* istanbul ignore next */\n\t        return error;\n\t    };\n\t    ErrorHandler.prototype.createError = function (index, line, col, description) {\n\t        var msg = 'Line ' + line + ': ' + description;\n\t        var error = this.constructError(msg, col);\n\t        error.index = index;\n\t        error.lineNumber = line;\n\t        error.description = description;\n\t        return error;\n\t    };\n\t    ErrorHandler.prototype.throwError = function (index, line, col, description) {\n\t        throw this.createError(index, line, col, description);\n\t    };\n\t    ErrorHandler.prototype.tolerateError = function (index, line, col, description) {\n\t        var error = this.createError(index, line, col, description);\n\t        if (this.tolerant) {\n\t            this.recordError(error);\n\t        }\n\t        else {\n\t            throw error;\n\t        }\n\t    };\n\t    return ErrorHandler;\n\t}());\n\texports.ErrorHandler = ErrorHandler;\n\n\n/***/ },\n/* 11 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\t// Error messages should be identical to V8.\n\texports.Messages = {\n\t    BadGetterArity: 'Getter must not have any formal parameters',\n\t    BadSetterArity: 'Setter must have exactly one formal parameter',\n\t    BadSetterRestParameter: 'Setter function argument must not be a rest parameter',\n\t    ConstructorIsAsync: 'Class constructor may not be an async method',\n\t    ConstructorSpecialMethod: 'Class constructor may not be an accessor',\n\t    DeclarationMissingInitializer: 'Missing initializer in %0 declaration',\n\t    DefaultRestParameter: 'Unexpected token =',\n\t    DuplicateBinding: 'Duplicate binding %0',\n\t    DuplicateConstructor: 'A class may only have one constructor',\n\t    DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals',\n\t    ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer',\n\t    GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts',\n\t    IllegalBreak: 'Illegal break statement',\n\t    IllegalContinue: 'Illegal continue statement',\n\t    IllegalExportDeclaration: 'Unexpected token',\n\t    IllegalImportDeclaration: 'Unexpected token',\n\t    IllegalLanguageModeDirective: 'Illegal \\'use strict\\' directive in function with non-simple parameter list',\n\t    IllegalReturn: 'Illegal return statement',\n\t    InvalidEscapedReservedWord: 'Keyword must not contain escaped characters',\n\t    InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence',\n\t    InvalidLHSInAssignment: 'Invalid left-hand side in assignment',\n\t    InvalidLHSInForIn: 'Invalid left-hand side in for-in',\n\t    InvalidLHSInForLoop: 'Invalid left-hand side in for-loop',\n\t    InvalidModuleSpecifier: 'Unexpected token',\n\t    InvalidRegExp: 'Invalid regular expression',\n\t    LetInLexicalBinding: 'let is disallowed as a lexically bound name',\n\t    MissingFromClause: 'Unexpected token',\n\t    MultipleDefaultsInSwitch: 'More than one default clause in switch statement',\n\t    NewlineAfterThrow: 'Illegal newline after throw',\n\t    NoAsAfterImportNamespace: 'Unexpected token',\n\t    NoCatchOrFinally: 'Missing catch or finally after try',\n\t    ParameterAfterRestParameter: 'Rest parameter must be last formal parameter',\n\t    Redeclaration: '%0 \\'%1\\' has already been declared',\n\t    StaticPrototype: 'Classes may not have static property named prototype',\n\t    StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode',\n\t    StrictDelete: 'Delete of an unqualified identifier in strict mode.',\n\t    StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block',\n\t    StrictFunctionName: 'Function name may not be eval or arguments in strict mode',\n\t    StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode',\n\t    StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode',\n\t    StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode',\n\t    StrictModeWith: 'Strict mode code may not include a with statement',\n\t    StrictOctalLiteral: 'Octal literals are not allowed in strict mode.',\n\t    StrictParamDupe: 'Strict mode function may not have duplicate parameter names',\n\t    StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode',\n\t    StrictReservedWord: 'Use of future reserved word in strict mode',\n\t    StrictVarName: 'Variable name may not be eval or arguments in strict mode',\n\t    TemplateOctalLiteral: 'Octal literals are not allowed in template strings.',\n\t    UnexpectedEOS: 'Unexpected end of input',\n\t    UnexpectedIdentifier: 'Unexpected identifier',\n\t    UnexpectedNumber: 'Unexpected number',\n\t    UnexpectedReserved: 'Unexpected reserved word',\n\t    UnexpectedString: 'Unexpected string',\n\t    UnexpectedTemplate: 'Unexpected quasi %0',\n\t    UnexpectedToken: 'Unexpected token %0',\n\t    UnexpectedTokenIllegal: 'Unexpected token ILLEGAL',\n\t    UnknownLabel: 'Undefined label \\'%0\\'',\n\t    UnterminatedRegExp: 'Invalid regular expression: missing /'\n\t};\n\n\n/***/ },\n/* 12 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar assert_1 = __webpack_require__(9);\n\tvar character_1 = __webpack_require__(4);\n\tvar messages_1 = __webpack_require__(11);\n\tfunction hexValue(ch) {\n\t    return '0123456789abcdef'.indexOf(ch.toLowerCase());\n\t}\n\tfunction octalValue(ch) {\n\t    return '01234567'.indexOf(ch);\n\t}\n\tvar Scanner = (function () {\n\t    function Scanner(code, handler) {\n\t        this.source = code;\n\t        this.errorHandler = handler;\n\t        this.trackComment = false;\n\t        this.isModule = false;\n\t        this.length = code.length;\n\t        this.index = 0;\n\t        this.lineNumber = (code.length > 0) ? 1 : 0;\n\t        this.lineStart = 0;\n\t        this.curlyStack = [];\n\t    }\n\t    Scanner.prototype.saveState = function () {\n\t        return {\n\t            index: this.index,\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart\n\t        };\n\t    };\n\t    Scanner.prototype.restoreState = function (state) {\n\t        this.index = state.index;\n\t        this.lineNumber = state.lineNumber;\n\t        this.lineStart = state.lineStart;\n\t    };\n\t    Scanner.prototype.eof = function () {\n\t        return this.index >= this.length;\n\t    };\n\t    Scanner.prototype.throwUnexpectedToken = function (message) {\n\t        if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }\n\t        return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);\n\t    };\n\t    Scanner.prototype.tolerateUnexpectedToken = function (message) {\n\t        if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; }\n\t        this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message);\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-comments\n\t    Scanner.prototype.skipSingleLineComment = function (offset) {\n\t        var comments = [];\n\t        var start, loc;\n\t        if (this.trackComment) {\n\t            comments = [];\n\t            start = this.index - offset;\n\t            loc = {\n\t                start: {\n\t                    line: this.lineNumber,\n\t                    column: this.index - this.lineStart - offset\n\t                },\n\t                end: {}\n\t            };\n\t        }\n\t        while (!this.eof()) {\n\t            var ch = this.source.charCodeAt(this.index);\n\t            ++this.index;\n\t            if (character_1.Character.isLineTerminator(ch)) {\n\t                if (this.trackComment) {\n\t                    loc.end = {\n\t                        line: this.lineNumber,\n\t                        column: this.index - this.lineStart - 1\n\t                    };\n\t                    var entry = {\n\t                        multiLine: false,\n\t                        slice: [start + offset, this.index - 1],\n\t                        range: [start, this.index - 1],\n\t                        loc: loc\n\t                    };\n\t                    comments.push(entry);\n\t                }\n\t                if (ch === 13 && this.source.charCodeAt(this.index) === 10) {\n\t                    ++this.index;\n\t                }\n\t                ++this.lineNumber;\n\t                this.lineStart = this.index;\n\t                return comments;\n\t            }\n\t        }\n\t        if (this.trackComment) {\n\t            loc.end = {\n\t                line: this.lineNumber,\n\t                column: this.index - this.lineStart\n\t            };\n\t            var entry = {\n\t                multiLine: false,\n\t                slice: [start + offset, this.index],\n\t                range: [start, this.index],\n\t                loc: loc\n\t            };\n\t            comments.push(entry);\n\t        }\n\t        return comments;\n\t    };\n\t    Scanner.prototype.skipMultiLineComment = function () {\n\t        var comments = [];\n\t        var start, loc;\n\t        if (this.trackComment) {\n\t            comments = [];\n\t            start = this.index - 2;\n\t            loc = {\n\t                start: {\n\t                    line: this.lineNumber,\n\t                    column: this.index - this.lineStart - 2\n\t                },\n\t                end: {}\n\t            };\n\t        }\n\t        while (!this.eof()) {\n\t            var ch = this.source.charCodeAt(this.index);\n\t            if (character_1.Character.isLineTerminator(ch)) {\n\t                if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) {\n\t                    ++this.index;\n\t                }\n\t                ++this.lineNumber;\n\t                ++this.index;\n\t                this.lineStart = this.index;\n\t            }\n\t            else if (ch === 0x2A) {\n\t                // Block comment ends with '*/'.\n\t                if (this.source.charCodeAt(this.index + 1) === 0x2F) {\n\t                    this.index += 2;\n\t                    if (this.trackComment) {\n\t                        loc.end = {\n\t                            line: this.lineNumber,\n\t                            column: this.index - this.lineStart\n\t                        };\n\t                        var entry = {\n\t                            multiLine: true,\n\t                            slice: [start + 2, this.index - 2],\n\t                            range: [start, this.index],\n\t                            loc: loc\n\t                        };\n\t                        comments.push(entry);\n\t                    }\n\t                    return comments;\n\t                }\n\t                ++this.index;\n\t            }\n\t            else {\n\t                ++this.index;\n\t            }\n\t        }\n\t        // Ran off the end of the file - the whole thing is a comment\n\t        if (this.trackComment) {\n\t            loc.end = {\n\t                line: this.lineNumber,\n\t                column: this.index - this.lineStart\n\t            };\n\t            var entry = {\n\t                multiLine: true,\n\t                slice: [start + 2, this.index],\n\t                range: [start, this.index],\n\t                loc: loc\n\t            };\n\t            comments.push(entry);\n\t        }\n\t        this.tolerateUnexpectedToken();\n\t        return comments;\n\t    };\n\t    Scanner.prototype.scanComments = function () {\n\t        var comments;\n\t        if (this.trackComment) {\n\t            comments = [];\n\t        }\n\t        var start = (this.index === 0);\n\t        while (!this.eof()) {\n\t            var ch = this.source.charCodeAt(this.index);\n\t            if (character_1.Character.isWhiteSpace(ch)) {\n\t                ++this.index;\n\t            }\n\t            else if (character_1.Character.isLineTerminator(ch)) {\n\t                ++this.index;\n\t                if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) {\n\t                    ++this.index;\n\t                }\n\t                ++this.lineNumber;\n\t                this.lineStart = this.index;\n\t                start = true;\n\t            }\n\t            else if (ch === 0x2F) {\n\t                ch = this.source.charCodeAt(this.index + 1);\n\t                if (ch === 0x2F) {\n\t                    this.index += 2;\n\t                    var comment = this.skipSingleLineComment(2);\n\t                    if (this.trackComment) {\n\t                        comments = comments.concat(comment);\n\t                    }\n\t                    start = true;\n\t                }\n\t                else if (ch === 0x2A) {\n\t                    this.index += 2;\n\t                    var comment = this.skipMultiLineComment();\n\t                    if (this.trackComment) {\n\t                        comments = comments.concat(comment);\n\t                    }\n\t                }\n\t                else {\n\t                    break;\n\t                }\n\t            }\n\t            else if (start && ch === 0x2D) {\n\t                // U+003E is '>'\n\t                if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) {\n\t                    // '-->' is a single-line comment\n\t                    this.index += 3;\n\t                    var comment = this.skipSingleLineComment(3);\n\t                    if (this.trackComment) {\n\t                        comments = comments.concat(comment);\n\t                    }\n\t                }\n\t                else {\n\t                    break;\n\t                }\n\t            }\n\t            else if (ch === 0x3C && !this.isModule) {\n\t                if (this.source.slice(this.index + 1, this.index + 4) === '!--') {\n\t                    this.index += 4; // `<!--`\n\t                    var comment = this.skipSingleLineComment(4);\n\t                    if (this.trackComment) {\n\t                        comments = comments.concat(comment);\n\t                    }\n\t                }\n\t                else {\n\t                    break;\n\t                }\n\t            }\n\t            else {\n\t                break;\n\t            }\n\t        }\n\t        return comments;\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-future-reserved-words\n\t    Scanner.prototype.isFutureReservedWord = function (id) {\n\t        switch (id) {\n\t            case 'enum':\n\t            case 'export':\n\t            case 'import':\n\t            case 'super':\n\t                return true;\n\t            default:\n\t                return false;\n\t        }\n\t    };\n\t    Scanner.prototype.isStrictModeReservedWord = function (id) {\n\t        switch (id) {\n\t            case 'implements':\n\t            case 'interface':\n\t            case 'package':\n\t            case 'private':\n\t            case 'protected':\n\t            case 'public':\n\t            case 'static':\n\t            case 'yield':\n\t            case 'let':\n\t                return true;\n\t            default:\n\t                return false;\n\t        }\n\t    };\n\t    Scanner.prototype.isRestrictedWord = function (id) {\n\t        return id === 'eval' || id === 'arguments';\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-keywords\n\t    Scanner.prototype.isKeyword = function (id) {\n\t        switch (id.length) {\n\t            case 2:\n\t                return (id === 'if') || (id === 'in') || (id === 'do');\n\t            case 3:\n\t                return (id === 'var') || (id === 'for') || (id === 'new') ||\n\t                    (id === 'try') || (id === 'let');\n\t            case 4:\n\t                return (id === 'this') || (id === 'else') || (id === 'case') ||\n\t                    (id === 'void') || (id === 'with') || (id === 'enum');\n\t            case 5:\n\t                return (id === 'while') || (id === 'break') || (id === 'catch') ||\n\t                    (id === 'throw') || (id === 'const') || (id === 'yield') ||\n\t                    (id === 'class') || (id === 'super');\n\t            case 6:\n\t                return (id === 'return') || (id === 'typeof') || (id === 'delete') ||\n\t                    (id === 'switch') || (id === 'export') || (id === 'import');\n\t            case 7:\n\t                return (id === 'default') || (id === 'finally') || (id === 'extends');\n\t            case 8:\n\t                return (id === 'function') || (id === 'continue') || (id === 'debugger');\n\t            case 10:\n\t                return (id === 'instanceof');\n\t            default:\n\t                return false;\n\t        }\n\t    };\n\t    Scanner.prototype.codePointAt = function (i) {\n\t        var cp = this.source.charCodeAt(i);\n\t        if (cp >= 0xD800 && cp <= 0xDBFF) {\n\t            var second = this.source.charCodeAt(i + 1);\n\t            if (second >= 0xDC00 && second <= 0xDFFF) {\n\t                var first = cp;\n\t                cp = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n\t            }\n\t        }\n\t        return cp;\n\t    };\n\t    Scanner.prototype.scanHexEscape = function (prefix) {\n\t        var len = (prefix === 'u') ? 4 : 2;\n\t        var code = 0;\n\t        for (var i = 0; i < len; ++i) {\n\t            if (!this.eof() && character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {\n\t                code = code * 16 + hexValue(this.source[this.index++]);\n\t            }\n\t            else {\n\t                return null;\n\t            }\n\t        }\n\t        return String.fromCharCode(code);\n\t    };\n\t    Scanner.prototype.scanUnicodeCodePointEscape = function () {\n\t        var ch = this.source[this.index];\n\t        var code = 0;\n\t        // At least, one hex digit is required.\n\t        if (ch === '}') {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        while (!this.eof()) {\n\t            ch = this.source[this.index++];\n\t            if (!character_1.Character.isHexDigit(ch.charCodeAt(0))) {\n\t                break;\n\t            }\n\t            code = code * 16 + hexValue(ch);\n\t        }\n\t        if (code > 0x10FFFF || ch !== '}') {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        return character_1.Character.fromCodePoint(code);\n\t    };\n\t    Scanner.prototype.getIdentifier = function () {\n\t        var start = this.index++;\n\t        while (!this.eof()) {\n\t            var ch = this.source.charCodeAt(this.index);\n\t            if (ch === 0x5C) {\n\t                // Blackslash (U+005C) marks Unicode escape sequence.\n\t                this.index = start;\n\t                return this.getComplexIdentifier();\n\t            }\n\t            else if (ch >= 0xD800 && ch < 0xDFFF) {\n\t                // Need to handle surrogate pairs.\n\t                this.index = start;\n\t                return this.getComplexIdentifier();\n\t            }\n\t            if (character_1.Character.isIdentifierPart(ch)) {\n\t                ++this.index;\n\t            }\n\t            else {\n\t                break;\n\t            }\n\t        }\n\t        return this.source.slice(start, this.index);\n\t    };\n\t    Scanner.prototype.getComplexIdentifier = function () {\n\t        var cp = this.codePointAt(this.index);\n\t        var id = character_1.Character.fromCodePoint(cp);\n\t        this.index += id.length;\n\t        // '\\u' (U+005C, U+0075) denotes an escaped character.\n\t        var ch;\n\t        if (cp === 0x5C) {\n\t            if (this.source.charCodeAt(this.index) !== 0x75) {\n\t                this.throwUnexpectedToken();\n\t            }\n\t            ++this.index;\n\t            if (this.source[this.index] === '{') {\n\t                ++this.index;\n\t                ch = this.scanUnicodeCodePointEscape();\n\t            }\n\t            else {\n\t                ch = this.scanHexEscape('u');\n\t                if (ch === null || ch === '\\\\' || !character_1.Character.isIdentifierStart(ch.charCodeAt(0))) {\n\t                    this.throwUnexpectedToken();\n\t                }\n\t            }\n\t            id = ch;\n\t        }\n\t        while (!this.eof()) {\n\t            cp = this.codePointAt(this.index);\n\t            if (!character_1.Character.isIdentifierPart(cp)) {\n\t                break;\n\t            }\n\t            ch = character_1.Character.fromCodePoint(cp);\n\t            id += ch;\n\t            this.index += ch.length;\n\t            // '\\u' (U+005C, U+0075) denotes an escaped character.\n\t            if (cp === 0x5C) {\n\t                id = id.substr(0, id.length - 1);\n\t                if (this.source.charCodeAt(this.index) !== 0x75) {\n\t                    this.throwUnexpectedToken();\n\t                }\n\t                ++this.index;\n\t                if (this.source[this.index] === '{') {\n\t                    ++this.index;\n\t                    ch = this.scanUnicodeCodePointEscape();\n\t                }\n\t                else {\n\t                    ch = this.scanHexEscape('u');\n\t                    if (ch === null || ch === '\\\\' || !character_1.Character.isIdentifierPart(ch.charCodeAt(0))) {\n\t                        this.throwUnexpectedToken();\n\t                    }\n\t                }\n\t                id += ch;\n\t            }\n\t        }\n\t        return id;\n\t    };\n\t    Scanner.prototype.octalToDecimal = function (ch) {\n\t        // \\0 is not octal escape sequence\n\t        var octal = (ch !== '0');\n\t        var code = octalValue(ch);\n\t        if (!this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {\n\t            octal = true;\n\t            code = code * 8 + octalValue(this.source[this.index++]);\n\t            // 3 digits are only allowed when string starts\n\t            // with 0, 1, 2, 3\n\t            if ('0123'.indexOf(ch) >= 0 && !this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {\n\t                code = code * 8 + octalValue(this.source[this.index++]);\n\t            }\n\t        }\n\t        return {\n\t            code: code,\n\t            octal: octal\n\t        };\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-names-and-keywords\n\t    Scanner.prototype.scanIdentifier = function () {\n\t        var type;\n\t        var start = this.index;\n\t        // Backslash (U+005C) starts an escaped character.\n\t        var id = (this.source.charCodeAt(start) === 0x5C) ? this.getComplexIdentifier() : this.getIdentifier();\n\t        // There is no keyword or literal with only one character.\n\t        // Thus, it must be an identifier.\n\t        if (id.length === 1) {\n\t            type = 3 /* Identifier */;\n\t        }\n\t        else if (this.isKeyword(id)) {\n\t            type = 4 /* Keyword */;\n\t        }\n\t        else if (id === 'null') {\n\t            type = 5 /* NullLiteral */;\n\t        }\n\t        else if (id === 'true' || id === 'false') {\n\t            type = 1 /* BooleanLiteral */;\n\t        }\n\t        else {\n\t            type = 3 /* Identifier */;\n\t        }\n\t        if (type !== 3 /* Identifier */ && (start + id.length !== this.index)) {\n\t            var restore = this.index;\n\t            this.index = start;\n\t            this.tolerateUnexpectedToken(messages_1.Messages.InvalidEscapedReservedWord);\n\t            this.index = restore;\n\t        }\n\t        return {\n\t            type: type,\n\t            value: id,\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-punctuators\n\t    Scanner.prototype.scanPunctuator = function () {\n\t        var start = this.index;\n\t        // Check for most common single-character punctuators.\n\t        var str = this.source[this.index];\n\t        switch (str) {\n\t            case '(':\n\t            case '{':\n\t                if (str === '{') {\n\t                    this.curlyStack.push('{');\n\t                }\n\t                ++this.index;\n\t                break;\n\t            case '.':\n\t                ++this.index;\n\t                if (this.source[this.index] === '.' && this.source[this.index + 1] === '.') {\n\t                    // Spread operator: ...\n\t                    this.index += 2;\n\t                    str = '...';\n\t                }\n\t                break;\n\t            case '}':\n\t                ++this.index;\n\t                this.curlyStack.pop();\n\t                break;\n\t            case ')':\n\t            case ';':\n\t            case ',':\n\t            case '[':\n\t            case ']':\n\t            case ':':\n\t            case '?':\n\t            case '~':\n\t                ++this.index;\n\t                break;\n\t            default:\n\t                // 4-character punctuator.\n\t                str = this.source.substr(this.index, 4);\n\t                if (str === '>>>=') {\n\t                    this.index += 4;\n\t                }\n\t                else {\n\t                    // 3-character punctuators.\n\t                    str = str.substr(0, 3);\n\t                    if (str === '===' || str === '!==' || str === '>>>' ||\n\t                        str === '<<=' || str === '>>=' || str === '**=') {\n\t                        this.index += 3;\n\t                    }\n\t                    else {\n\t                        // 2-character punctuators.\n\t                        str = str.substr(0, 2);\n\t                        if (str === '&&' || str === '||' || str === '==' || str === '!=' ||\n\t                            str === '+=' || str === '-=' || str === '*=' || str === '/=' ||\n\t                            str === '++' || str === '--' || str === '<<' || str === '>>' ||\n\t                            str === '&=' || str === '|=' || str === '^=' || str === '%=' ||\n\t                            str === '<=' || str === '>=' || str === '=>' || str === '**') {\n\t                            this.index += 2;\n\t                        }\n\t                        else {\n\t                            // 1-character punctuators.\n\t                            str = this.source[this.index];\n\t                            if ('<>=!+-*%&|^/'.indexOf(str) >= 0) {\n\t                                ++this.index;\n\t                            }\n\t                        }\n\t                    }\n\t                }\n\t        }\n\t        if (this.index === start) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        return {\n\t            type: 7 /* Punctuator */,\n\t            value: str,\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-literals-numeric-literals\n\t    Scanner.prototype.scanHexLiteral = function (start) {\n\t        var num = '';\n\t        while (!this.eof()) {\n\t            if (!character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) {\n\t                break;\n\t            }\n\t            num += this.source[this.index++];\n\t        }\n\t        if (num.length === 0) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        return {\n\t            type: 6 /* NumericLiteral */,\n\t            value: parseInt('0x' + num, 16),\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    Scanner.prototype.scanBinaryLiteral = function (start) {\n\t        var num = '';\n\t        var ch;\n\t        while (!this.eof()) {\n\t            ch = this.source[this.index];\n\t            if (ch !== '0' && ch !== '1') {\n\t                break;\n\t            }\n\t            num += this.source[this.index++];\n\t        }\n\t        if (num.length === 0) {\n\t            // only 0b or 0B\n\t            this.throwUnexpectedToken();\n\t        }\n\t        if (!this.eof()) {\n\t            ch = this.source.charCodeAt(this.index);\n\t            /* istanbul ignore else */\n\t            if (character_1.Character.isIdentifierStart(ch) || character_1.Character.isDecimalDigit(ch)) {\n\t                this.throwUnexpectedToken();\n\t            }\n\t        }\n\t        return {\n\t            type: 6 /* NumericLiteral */,\n\t            value: parseInt(num, 2),\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    Scanner.prototype.scanOctalLiteral = function (prefix, start) {\n\t        var num = '';\n\t        var octal = false;\n\t        if (character_1.Character.isOctalDigit(prefix.charCodeAt(0))) {\n\t            octal = true;\n\t            num = '0' + this.source[this.index++];\n\t        }\n\t        else {\n\t            ++this.index;\n\t        }\n\t        while (!this.eof()) {\n\t            if (!character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) {\n\t                break;\n\t            }\n\t            num += this.source[this.index++];\n\t        }\n\t        if (!octal && num.length === 0) {\n\t            // only 0o or 0O\n\t            this.throwUnexpectedToken();\n\t        }\n\t        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index)) || character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        return {\n\t            type: 6 /* NumericLiteral */,\n\t            value: parseInt(num, 8),\n\t            octal: octal,\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    Scanner.prototype.isImplicitOctalLiteral = function () {\n\t        // Implicit octal, unless there is a non-octal digit.\n\t        // (Annex B.1.1 on Numeric Literals)\n\t        for (var i = this.index + 1; i < this.length; ++i) {\n\t            var ch = this.source[i];\n\t            if (ch === '8' || ch === '9') {\n\t                return false;\n\t            }\n\t            if (!character_1.Character.isOctalDigit(ch.charCodeAt(0))) {\n\t                return true;\n\t            }\n\t        }\n\t        return true;\n\t    };\n\t    Scanner.prototype.scanNumericLiteral = function () {\n\t        var start = this.index;\n\t        var ch = this.source[start];\n\t        assert_1.assert(character_1.Character.isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'), 'Numeric literal must start with a decimal digit or a decimal point');\n\t        var num = '';\n\t        if (ch !== '.') {\n\t            num = this.source[this.index++];\n\t            ch = this.source[this.index];\n\t            // Hex number starts with '0x'.\n\t            // Octal number starts with '0'.\n\t            // Octal number in ES6 starts with '0o'.\n\t            // Binary number in ES6 starts with '0b'.\n\t            if (num === '0') {\n\t                if (ch === 'x' || ch === 'X') {\n\t                    ++this.index;\n\t                    return this.scanHexLiteral(start);\n\t                }\n\t                if (ch === 'b' || ch === 'B') {\n\t                    ++this.index;\n\t                    return this.scanBinaryLiteral(start);\n\t                }\n\t                if (ch === 'o' || ch === 'O') {\n\t                    return this.scanOctalLiteral(ch, start);\n\t                }\n\t                if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {\n\t                    if (this.isImplicitOctalLiteral()) {\n\t                        return this.scanOctalLiteral(ch, start);\n\t                    }\n\t                }\n\t            }\n\t            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {\n\t                num += this.source[this.index++];\n\t            }\n\t            ch = this.source[this.index];\n\t        }\n\t        if (ch === '.') {\n\t            num += this.source[this.index++];\n\t            while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {\n\t                num += this.source[this.index++];\n\t            }\n\t            ch = this.source[this.index];\n\t        }\n\t        if (ch === 'e' || ch === 'E') {\n\t            num += this.source[this.index++];\n\t            ch = this.source[this.index];\n\t            if (ch === '+' || ch === '-') {\n\t                num += this.source[this.index++];\n\t            }\n\t            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {\n\t                while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {\n\t                    num += this.source[this.index++];\n\t                }\n\t            }\n\t            else {\n\t                this.throwUnexpectedToken();\n\t            }\n\t        }\n\t        if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        return {\n\t            type: 6 /* NumericLiteral */,\n\t            value: parseFloat(num),\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-literals-string-literals\n\t    Scanner.prototype.scanStringLiteral = function () {\n\t        var start = this.index;\n\t        var quote = this.source[start];\n\t        assert_1.assert((quote === '\\'' || quote === '\"'), 'String literal must starts with a quote');\n\t        ++this.index;\n\t        var octal = false;\n\t        var str = '';\n\t        while (!this.eof()) {\n\t            var ch = this.source[this.index++];\n\t            if (ch === quote) {\n\t                quote = '';\n\t                break;\n\t            }\n\t            else if (ch === '\\\\') {\n\t                ch = this.source[this.index++];\n\t                if (!ch || !character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                    switch (ch) {\n\t                        case 'u':\n\t                            if (this.source[this.index] === '{') {\n\t                                ++this.index;\n\t                                str += this.scanUnicodeCodePointEscape();\n\t                            }\n\t                            else {\n\t                                var unescaped_1 = this.scanHexEscape(ch);\n\t                                if (unescaped_1 === null) {\n\t                                    this.throwUnexpectedToken();\n\t                                }\n\t                                str += unescaped_1;\n\t                            }\n\t                            break;\n\t                        case 'x':\n\t                            var unescaped = this.scanHexEscape(ch);\n\t                            if (unescaped === null) {\n\t                                this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence);\n\t                            }\n\t                            str += unescaped;\n\t                            break;\n\t                        case 'n':\n\t                            str += '\\n';\n\t                            break;\n\t                        case 'r':\n\t                            str += '\\r';\n\t                            break;\n\t                        case 't':\n\t                            str += '\\t';\n\t                            break;\n\t                        case 'b':\n\t                            str += '\\b';\n\t                            break;\n\t                        case 'f':\n\t                            str += '\\f';\n\t                            break;\n\t                        case 'v':\n\t                            str += '\\x0B';\n\t                            break;\n\t                        case '8':\n\t                        case '9':\n\t                            str += ch;\n\t                            this.tolerateUnexpectedToken();\n\t                            break;\n\t                        default:\n\t                            if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) {\n\t                                var octToDec = this.octalToDecimal(ch);\n\t                                octal = octToDec.octal || octal;\n\t                                str += String.fromCharCode(octToDec.code);\n\t                            }\n\t                            else {\n\t                                str += ch;\n\t                            }\n\t                            break;\n\t                    }\n\t                }\n\t                else {\n\t                    ++this.lineNumber;\n\t                    if (ch === '\\r' && this.source[this.index] === '\\n') {\n\t                        ++this.index;\n\t                    }\n\t                    this.lineStart = this.index;\n\t                }\n\t            }\n\t            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                break;\n\t            }\n\t            else {\n\t                str += ch;\n\t            }\n\t        }\n\t        if (quote !== '') {\n\t            this.index = start;\n\t            this.throwUnexpectedToken();\n\t        }\n\t        return {\n\t            type: 8 /* StringLiteral */,\n\t            value: str,\n\t            octal: octal,\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-template-literal-lexical-components\n\t    Scanner.prototype.scanTemplate = function () {\n\t        var cooked = '';\n\t        var terminated = false;\n\t        var start = this.index;\n\t        var head = (this.source[start] === '`');\n\t        var tail = false;\n\t        var rawOffset = 2;\n\t        ++this.index;\n\t        while (!this.eof()) {\n\t            var ch = this.source[this.index++];\n\t            if (ch === '`') {\n\t                rawOffset = 1;\n\t                tail = true;\n\t                terminated = true;\n\t                break;\n\t            }\n\t            else if (ch === '$') {\n\t                if (this.source[this.index] === '{') {\n\t                    this.curlyStack.push('${');\n\t                    ++this.index;\n\t                    terminated = true;\n\t                    break;\n\t                }\n\t                cooked += ch;\n\t            }\n\t            else if (ch === '\\\\') {\n\t                ch = this.source[this.index++];\n\t                if (!character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                    switch (ch) {\n\t                        case 'n':\n\t                            cooked += '\\n';\n\t                            break;\n\t                        case 'r':\n\t                            cooked += '\\r';\n\t                            break;\n\t                        case 't':\n\t                            cooked += '\\t';\n\t                            break;\n\t                        case 'u':\n\t                            if (this.source[this.index] === '{') {\n\t                                ++this.index;\n\t                                cooked += this.scanUnicodeCodePointEscape();\n\t                            }\n\t                            else {\n\t                                var restore = this.index;\n\t                                var unescaped_2 = this.scanHexEscape(ch);\n\t                                if (unescaped_2 !== null) {\n\t                                    cooked += unescaped_2;\n\t                                }\n\t                                else {\n\t                                    this.index = restore;\n\t                                    cooked += ch;\n\t                                }\n\t                            }\n\t                            break;\n\t                        case 'x':\n\t                            var unescaped = this.scanHexEscape(ch);\n\t                            if (unescaped === null) {\n\t                                this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence);\n\t                            }\n\t                            cooked += unescaped;\n\t                            break;\n\t                        case 'b':\n\t                            cooked += '\\b';\n\t                            break;\n\t                        case 'f':\n\t                            cooked += '\\f';\n\t                            break;\n\t                        case 'v':\n\t                            cooked += '\\v';\n\t                            break;\n\t                        default:\n\t                            if (ch === '0') {\n\t                                if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) {\n\t                                    // Illegal: \\01 \\02 and so on\n\t                                    this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);\n\t                                }\n\t                                cooked += '\\0';\n\t                            }\n\t                            else if (character_1.Character.isOctalDigit(ch.charCodeAt(0))) {\n\t                                // Illegal: \\1 \\2\n\t                                this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral);\n\t                            }\n\t                            else {\n\t                                cooked += ch;\n\t                            }\n\t                            break;\n\t                    }\n\t                }\n\t                else {\n\t                    ++this.lineNumber;\n\t                    if (ch === '\\r' && this.source[this.index] === '\\n') {\n\t                        ++this.index;\n\t                    }\n\t                    this.lineStart = this.index;\n\t                }\n\t            }\n\t            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                ++this.lineNumber;\n\t                if (ch === '\\r' && this.source[this.index] === '\\n') {\n\t                    ++this.index;\n\t                }\n\t                this.lineStart = this.index;\n\t                cooked += '\\n';\n\t            }\n\t            else {\n\t                cooked += ch;\n\t            }\n\t        }\n\t        if (!terminated) {\n\t            this.throwUnexpectedToken();\n\t        }\n\t        if (!head) {\n\t            this.curlyStack.pop();\n\t        }\n\t        return {\n\t            type: 10 /* Template */,\n\t            value: this.source.slice(start + 1, this.index - rawOffset),\n\t            cooked: cooked,\n\t            head: head,\n\t            tail: tail,\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals\n\t    Scanner.prototype.testRegExp = function (pattern, flags) {\n\t        // The BMP character to use as a replacement for astral symbols when\n\t        // translating an ES6 \"u\"-flagged pattern to an ES5-compatible\n\t        // approximation.\n\t        // Note: replacing with '\\uFFFF' enables false positives in unlikely\n\t        // scenarios. For example, `[\\u{1044f}-\\u{10440}]` is an invalid\n\t        // pattern that would not be detected by this substitution.\n\t        var astralSubstitute = '\\uFFFF';\n\t        var tmp = pattern;\n\t        var self = this;\n\t        if (flags.indexOf('u') >= 0) {\n\t            tmp = tmp\n\t                .replace(/\\\\u\\{([0-9a-fA-F]+)\\}|\\\\u([a-fA-F0-9]{4})/g, function ($0, $1, $2) {\n\t                var codePoint = parseInt($1 || $2, 16);\n\t                if (codePoint > 0x10FFFF) {\n\t                    self.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);\n\t                }\n\t                if (codePoint <= 0xFFFF) {\n\t                    return String.fromCharCode(codePoint);\n\t                }\n\t                return astralSubstitute;\n\t            })\n\t                .replace(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g, astralSubstitute);\n\t        }\n\t        // First, detect invalid regular expressions.\n\t        try {\n\t            RegExp(tmp);\n\t        }\n\t        catch (e) {\n\t            this.throwUnexpectedToken(messages_1.Messages.InvalidRegExp);\n\t        }\n\t        // Return a regular expression object for this pattern-flag pair, or\n\t        // `null` in case the current environment doesn't support the flags it\n\t        // uses.\n\t        try {\n\t            return new RegExp(pattern, flags);\n\t        }\n\t        catch (exception) {\n\t            /* istanbul ignore next */\n\t            return null;\n\t        }\n\t    };\n\t    Scanner.prototype.scanRegExpBody = function () {\n\t        var ch = this.source[this.index];\n\t        assert_1.assert(ch === '/', 'Regular expression literal must start with a slash');\n\t        var str = this.source[this.index++];\n\t        var classMarker = false;\n\t        var terminated = false;\n\t        while (!this.eof()) {\n\t            ch = this.source[this.index++];\n\t            str += ch;\n\t            if (ch === '\\\\') {\n\t                ch = this.source[this.index++];\n\t                // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals\n\t                if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                    this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);\n\t                }\n\t                str += ch;\n\t            }\n\t            else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) {\n\t                this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);\n\t            }\n\t            else if (classMarker) {\n\t                if (ch === ']') {\n\t                    classMarker = false;\n\t                }\n\t            }\n\t            else {\n\t                if (ch === '/') {\n\t                    terminated = true;\n\t                    break;\n\t                }\n\t                else if (ch === '[') {\n\t                    classMarker = true;\n\t                }\n\t            }\n\t        }\n\t        if (!terminated) {\n\t            this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp);\n\t        }\n\t        // Exclude leading and trailing slash.\n\t        return str.substr(1, str.length - 2);\n\t    };\n\t    Scanner.prototype.scanRegExpFlags = function () {\n\t        var str = '';\n\t        var flags = '';\n\t        while (!this.eof()) {\n\t            var ch = this.source[this.index];\n\t            if (!character_1.Character.isIdentifierPart(ch.charCodeAt(0))) {\n\t                break;\n\t            }\n\t            ++this.index;\n\t            if (ch === '\\\\' && !this.eof()) {\n\t                ch = this.source[this.index];\n\t                if (ch === 'u') {\n\t                    ++this.index;\n\t                    var restore = this.index;\n\t                    var char = this.scanHexEscape('u');\n\t                    if (char !== null) {\n\t                        flags += char;\n\t                        for (str += '\\\\u'; restore < this.index; ++restore) {\n\t                            str += this.source[restore];\n\t                        }\n\t                    }\n\t                    else {\n\t                        this.index = restore;\n\t                        flags += 'u';\n\t                        str += '\\\\u';\n\t                    }\n\t                    this.tolerateUnexpectedToken();\n\t                }\n\t                else {\n\t                    str += '\\\\';\n\t                    this.tolerateUnexpectedToken();\n\t                }\n\t            }\n\t            else {\n\t                flags += ch;\n\t                str += ch;\n\t            }\n\t        }\n\t        return flags;\n\t    };\n\t    Scanner.prototype.scanRegExp = function () {\n\t        var start = this.index;\n\t        var pattern = this.scanRegExpBody();\n\t        var flags = this.scanRegExpFlags();\n\t        var value = this.testRegExp(pattern, flags);\n\t        return {\n\t            type: 9 /* RegularExpression */,\n\t            value: '',\n\t            pattern: pattern,\n\t            flags: flags,\n\t            regex: value,\n\t            lineNumber: this.lineNumber,\n\t            lineStart: this.lineStart,\n\t            start: start,\n\t            end: this.index\n\t        };\n\t    };\n\t    Scanner.prototype.lex = function () {\n\t        if (this.eof()) {\n\t            return {\n\t                type: 2 /* EOF */,\n\t                value: '',\n\t                lineNumber: this.lineNumber,\n\t                lineStart: this.lineStart,\n\t                start: this.index,\n\t                end: this.index\n\t            };\n\t        }\n\t        var cp = this.source.charCodeAt(this.index);\n\t        if (character_1.Character.isIdentifierStart(cp)) {\n\t            return this.scanIdentifier();\n\t        }\n\t        // Very common: ( and ) and ;\n\t        if (cp === 0x28 || cp === 0x29 || cp === 0x3B) {\n\t            return this.scanPunctuator();\n\t        }\n\t        // String literal starts with single quote (U+0027) or double quote (U+0022).\n\t        if (cp === 0x27 || cp === 0x22) {\n\t            return this.scanStringLiteral();\n\t        }\n\t        // Dot (.) U+002E can also start a floating-point number, hence the need\n\t        // to check the next character.\n\t        if (cp === 0x2E) {\n\t            if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index + 1))) {\n\t                return this.scanNumericLiteral();\n\t            }\n\t            return this.scanPunctuator();\n\t        }\n\t        if (character_1.Character.isDecimalDigit(cp)) {\n\t            return this.scanNumericLiteral();\n\t        }\n\t        // Template literals start with ` (U+0060) for template head\n\t        // or } (U+007D) for template middle or template tail.\n\t        if (cp === 0x60 || (cp === 0x7D && this.curlyStack[this.curlyStack.length - 1] === '${')) {\n\t            return this.scanTemplate();\n\t        }\n\t        // Possible identifier start in a surrogate pair.\n\t        if (cp >= 0xD800 && cp < 0xDFFF) {\n\t            if (character_1.Character.isIdentifierStart(this.codePointAt(this.index))) {\n\t                return this.scanIdentifier();\n\t            }\n\t        }\n\t        return this.scanPunctuator();\n\t    };\n\t    return Scanner;\n\t}());\n\texports.Scanner = Scanner;\n\n\n/***/ },\n/* 13 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.TokenName = {};\n\texports.TokenName[1 /* BooleanLiteral */] = 'Boolean';\n\texports.TokenName[2 /* EOF */] = '<end>';\n\texports.TokenName[3 /* Identifier */] = 'Identifier';\n\texports.TokenName[4 /* Keyword */] = 'Keyword';\n\texports.TokenName[5 /* NullLiteral */] = 'Null';\n\texports.TokenName[6 /* NumericLiteral */] = 'Numeric';\n\texports.TokenName[7 /* Punctuator */] = 'Punctuator';\n\texports.TokenName[8 /* StringLiteral */] = 'String';\n\texports.TokenName[9 /* RegularExpression */] = 'RegularExpression';\n\texports.TokenName[10 /* Template */] = 'Template';\n\n\n/***/ },\n/* 14 */\n/***/ function(module, exports) {\n\n\t\"use strict\";\n\t// Generated by generate-xhtml-entities.js. DO NOT MODIFY!\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\texports.XHTMLEntities = {\n\t    quot: '\\u0022',\n\t    amp: '\\u0026',\n\t    apos: '\\u0027',\n\t    gt: '\\u003E',\n\t    nbsp: '\\u00A0',\n\t    iexcl: '\\u00A1',\n\t    cent: '\\u00A2',\n\t    pound: '\\u00A3',\n\t    curren: '\\u00A4',\n\t    yen: '\\u00A5',\n\t    brvbar: '\\u00A6',\n\t    sect: '\\u00A7',\n\t    uml: '\\u00A8',\n\t    copy: '\\u00A9',\n\t    ordf: '\\u00AA',\n\t    laquo: '\\u00AB',\n\t    not: '\\u00AC',\n\t    shy: '\\u00AD',\n\t    reg: '\\u00AE',\n\t    macr: '\\u00AF',\n\t    deg: '\\u00B0',\n\t    plusmn: '\\u00B1',\n\t    sup2: '\\u00B2',\n\t    sup3: '\\u00B3',\n\t    acute: '\\u00B4',\n\t    micro: '\\u00B5',\n\t    para: '\\u00B6',\n\t    middot: '\\u00B7',\n\t    cedil: '\\u00B8',\n\t    sup1: '\\u00B9',\n\t    ordm: '\\u00BA',\n\t    raquo: '\\u00BB',\n\t    frac14: '\\u00BC',\n\t    frac12: '\\u00BD',\n\t    frac34: '\\u00BE',\n\t    iquest: '\\u00BF',\n\t    Agrave: '\\u00C0',\n\t    Aacute: '\\u00C1',\n\t    Acirc: '\\u00C2',\n\t    Atilde: '\\u00C3',\n\t    Auml: '\\u00C4',\n\t    Aring: '\\u00C5',\n\t    AElig: '\\u00C6',\n\t    Ccedil: '\\u00C7',\n\t    Egrave: '\\u00C8',\n\t    Eacute: '\\u00C9',\n\t    Ecirc: '\\u00CA',\n\t    Euml: '\\u00CB',\n\t    Igrave: '\\u00CC',\n\t    Iacute: '\\u00CD',\n\t    Icirc: '\\u00CE',\n\t    Iuml: '\\u00CF',\n\t    ETH: '\\u00D0',\n\t    Ntilde: '\\u00D1',\n\t    Ograve: '\\u00D2',\n\t    Oacute: '\\u00D3',\n\t    Ocirc: '\\u00D4',\n\t    Otilde: '\\u00D5',\n\t    Ouml: '\\u00D6',\n\t    times: '\\u00D7',\n\t    Oslash: '\\u00D8',\n\t    Ugrave: '\\u00D9',\n\t    Uacute: '\\u00DA',\n\t    Ucirc: '\\u00DB',\n\t    Uuml: '\\u00DC',\n\t    Yacute: '\\u00DD',\n\t    THORN: '\\u00DE',\n\t    szlig: '\\u00DF',\n\t    agrave: '\\u00E0',\n\t    aacute: '\\u00E1',\n\t    acirc: '\\u00E2',\n\t    atilde: '\\u00E3',\n\t    auml: '\\u00E4',\n\t    aring: '\\u00E5',\n\t    aelig: '\\u00E6',\n\t    ccedil: '\\u00E7',\n\t    egrave: '\\u00E8',\n\t    eacute: '\\u00E9',\n\t    ecirc: '\\u00EA',\n\t    euml: '\\u00EB',\n\t    igrave: '\\u00EC',\n\t    iacute: '\\u00ED',\n\t    icirc: '\\u00EE',\n\t    iuml: '\\u00EF',\n\t    eth: '\\u00F0',\n\t    ntilde: '\\u00F1',\n\t    ograve: '\\u00F2',\n\t    oacute: '\\u00F3',\n\t    ocirc: '\\u00F4',\n\t    otilde: '\\u00F5',\n\t    ouml: '\\u00F6',\n\t    divide: '\\u00F7',\n\t    oslash: '\\u00F8',\n\t    ugrave: '\\u00F9',\n\t    uacute: '\\u00FA',\n\t    ucirc: '\\u00FB',\n\t    uuml: '\\u00FC',\n\t    yacute: '\\u00FD',\n\t    thorn: '\\u00FE',\n\t    yuml: '\\u00FF',\n\t    OElig: '\\u0152',\n\t    oelig: '\\u0153',\n\t    Scaron: '\\u0160',\n\t    scaron: '\\u0161',\n\t    Yuml: '\\u0178',\n\t    fnof: '\\u0192',\n\t    circ: '\\u02C6',\n\t    tilde: '\\u02DC',\n\t    Alpha: '\\u0391',\n\t    Beta: '\\u0392',\n\t    Gamma: '\\u0393',\n\t    Delta: '\\u0394',\n\t    Epsilon: '\\u0395',\n\t    Zeta: '\\u0396',\n\t    Eta: '\\u0397',\n\t    Theta: '\\u0398',\n\t    Iota: '\\u0399',\n\t    Kappa: '\\u039A',\n\t    Lambda: '\\u039B',\n\t    Mu: '\\u039C',\n\t    Nu: '\\u039D',\n\t    Xi: '\\u039E',\n\t    Omicron: '\\u039F',\n\t    Pi: '\\u03A0',\n\t    Rho: '\\u03A1',\n\t    Sigma: '\\u03A3',\n\t    Tau: '\\u03A4',\n\t    Upsilon: '\\u03A5',\n\t    Phi: '\\u03A6',\n\t    Chi: '\\u03A7',\n\t    Psi: '\\u03A8',\n\t    Omega: '\\u03A9',\n\t    alpha: '\\u03B1',\n\t    beta: '\\u03B2',\n\t    gamma: '\\u03B3',\n\t    delta: '\\u03B4',\n\t    epsilon: '\\u03B5',\n\t    zeta: '\\u03B6',\n\t    eta: '\\u03B7',\n\t    theta: '\\u03B8',\n\t    iota: '\\u03B9',\n\t    kappa: '\\u03BA',\n\t    lambda: '\\u03BB',\n\t    mu: '\\u03BC',\n\t    nu: '\\u03BD',\n\t    xi: '\\u03BE',\n\t    omicron: '\\u03BF',\n\t    pi: '\\u03C0',\n\t    rho: '\\u03C1',\n\t    sigmaf: '\\u03C2',\n\t    sigma: '\\u03C3',\n\t    tau: '\\u03C4',\n\t    upsilon: '\\u03C5',\n\t    phi: '\\u03C6',\n\t    chi: '\\u03C7',\n\t    psi: '\\u03C8',\n\t    omega: '\\u03C9',\n\t    thetasym: '\\u03D1',\n\t    upsih: '\\u03D2',\n\t    piv: '\\u03D6',\n\t    ensp: '\\u2002',\n\t    emsp: '\\u2003',\n\t    thinsp: '\\u2009',\n\t    zwnj: '\\u200C',\n\t    zwj: '\\u200D',\n\t    lrm: '\\u200E',\n\t    rlm: '\\u200F',\n\t    ndash: '\\u2013',\n\t    mdash: '\\u2014',\n\t    lsquo: '\\u2018',\n\t    rsquo: '\\u2019',\n\t    sbquo: '\\u201A',\n\t    ldquo: '\\u201C',\n\t    rdquo: '\\u201D',\n\t    bdquo: '\\u201E',\n\t    dagger: '\\u2020',\n\t    Dagger: '\\u2021',\n\t    bull: '\\u2022',\n\t    hellip: '\\u2026',\n\t    permil: '\\u2030',\n\t    prime: '\\u2032',\n\t    Prime: '\\u2033',\n\t    lsaquo: '\\u2039',\n\t    rsaquo: '\\u203A',\n\t    oline: '\\u203E',\n\t    frasl: '\\u2044',\n\t    euro: '\\u20AC',\n\t    image: '\\u2111',\n\t    weierp: '\\u2118',\n\t    real: '\\u211C',\n\t    trade: '\\u2122',\n\t    alefsym: '\\u2135',\n\t    larr: '\\u2190',\n\t    uarr: '\\u2191',\n\t    rarr: '\\u2192',\n\t    darr: '\\u2193',\n\t    harr: '\\u2194',\n\t    crarr: '\\u21B5',\n\t    lArr: '\\u21D0',\n\t    uArr: '\\u21D1',\n\t    rArr: '\\u21D2',\n\t    dArr: '\\u21D3',\n\t    hArr: '\\u21D4',\n\t    forall: '\\u2200',\n\t    part: '\\u2202',\n\t    exist: '\\u2203',\n\t    empty: '\\u2205',\n\t    nabla: '\\u2207',\n\t    isin: '\\u2208',\n\t    notin: '\\u2209',\n\t    ni: '\\u220B',\n\t    prod: '\\u220F',\n\t    sum: '\\u2211',\n\t    minus: '\\u2212',\n\t    lowast: '\\u2217',\n\t    radic: '\\u221A',\n\t    prop: '\\u221D',\n\t    infin: '\\u221E',\n\t    ang: '\\u2220',\n\t    and: '\\u2227',\n\t    or: '\\u2228',\n\t    cap: '\\u2229',\n\t    cup: '\\u222A',\n\t    int: '\\u222B',\n\t    there4: '\\u2234',\n\t    sim: '\\u223C',\n\t    cong: '\\u2245',\n\t    asymp: '\\u2248',\n\t    ne: '\\u2260',\n\t    equiv: '\\u2261',\n\t    le: '\\u2264',\n\t    ge: '\\u2265',\n\t    sub: '\\u2282',\n\t    sup: '\\u2283',\n\t    nsub: '\\u2284',\n\t    sube: '\\u2286',\n\t    supe: '\\u2287',\n\t    oplus: '\\u2295',\n\t    otimes: '\\u2297',\n\t    perp: '\\u22A5',\n\t    sdot: '\\u22C5',\n\t    lceil: '\\u2308',\n\t    rceil: '\\u2309',\n\t    lfloor: '\\u230A',\n\t    rfloor: '\\u230B',\n\t    loz: '\\u25CA',\n\t    spades: '\\u2660',\n\t    clubs: '\\u2663',\n\t    hearts: '\\u2665',\n\t    diams: '\\u2666',\n\t    lang: '\\u27E8',\n\t    rang: '\\u27E9'\n\t};\n\n\n/***/ },\n/* 15 */\n/***/ function(module, exports, __webpack_require__) {\n\n\t\"use strict\";\n\tObject.defineProperty(exports, \"__esModule\", { value: true });\n\tvar error_handler_1 = __webpack_require__(10);\n\tvar scanner_1 = __webpack_require__(12);\n\tvar token_1 = __webpack_require__(13);\n\tvar Reader = (function () {\n\t    function Reader() {\n\t        this.values = [];\n\t        this.curly = this.paren = -1;\n\t    }\n\t    // A function following one of those tokens is an expression.\n\t    Reader.prototype.beforeFunctionExpression = function (t) {\n\t        return ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new',\n\t            'return', 'case', 'delete', 'throw', 'void',\n\t            // assignment operators\n\t            '=', '+=', '-=', '*=', '**=', '/=', '%=', '<<=', '>>=', '>>>=',\n\t            '&=', '|=', '^=', ',',\n\t            // binary/unary operators\n\t            '+', '-', '*', '**', '/', '%', '++', '--', '<<', '>>', '>>>', '&',\n\t            '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=',\n\t            '<=', '<', '>', '!=', '!=='].indexOf(t) >= 0;\n\t    };\n\t    // Determine if forward slash (/) is an operator or part of a regular expression\n\t    // https://github.com/mozilla/sweet.js/wiki/design\n\t    Reader.prototype.isRegexStart = function () {\n\t        var previous = this.values[this.values.length - 1];\n\t        var regex = (previous !== null);\n\t        switch (previous) {\n\t            case 'this':\n\t            case ']':\n\t                regex = false;\n\t                break;\n\t            case ')':\n\t                var keyword = this.values[this.paren - 1];\n\t                regex = (keyword === 'if' || keyword === 'while' || keyword === 'for' || keyword === 'with');\n\t                break;\n\t            case '}':\n\t                // Dividing a function by anything makes little sense,\n\t                // but we have to check for that.\n\t                regex = false;\n\t                if (this.values[this.curly - 3] === 'function') {\n\t                    // Anonymous function, e.g. function(){} /42\n\t                    var check = this.values[this.curly - 4];\n\t                    regex = check ? !this.beforeFunctionExpression(check) : false;\n\t                }\n\t                else if (this.values[this.curly - 4] === 'function') {\n\t                    // Named function, e.g. function f(){} /42/\n\t                    var check = this.values[this.curly - 5];\n\t                    regex = check ? !this.beforeFunctionExpression(check) : true;\n\t                }\n\t                break;\n\t            default:\n\t                break;\n\t        }\n\t        return regex;\n\t    };\n\t    Reader.prototype.push = function (token) {\n\t        if (token.type === 7 /* Punctuator */ || token.type === 4 /* Keyword */) {\n\t            if (token.value === '{') {\n\t                this.curly = this.values.length;\n\t            }\n\t            else if (token.value === '(') {\n\t                this.paren = this.values.length;\n\t            }\n\t            this.values.push(token.value);\n\t        }\n\t        else {\n\t            this.values.push(null);\n\t        }\n\t    };\n\t    return Reader;\n\t}());\n\tvar Tokenizer = (function () {\n\t    function Tokenizer(code, config) {\n\t        this.errorHandler = new error_handler_1.ErrorHandler();\n\t        this.errorHandler.tolerant = config ? (typeof config.tolerant === 'boolean' && config.tolerant) : false;\n\t        this.scanner = new scanner_1.Scanner(code, this.errorHandler);\n\t        this.scanner.trackComment = config ? (typeof config.comment === 'boolean' && config.comment) : false;\n\t        this.trackRange = config ? (typeof config.range === 'boolean' && config.range) : false;\n\t        this.trackLoc = config ? (typeof config.loc === 'boolean' && config.loc) : false;\n\t        this.buffer = [];\n\t        this.reader = new Reader();\n\t    }\n\t    Tokenizer.prototype.errors = function () {\n\t        return this.errorHandler.errors;\n\t    };\n\t    Tokenizer.prototype.getNextToken = function () {\n\t        if (this.buffer.length === 0) {\n\t            var comments = this.scanner.scanComments();\n\t            if (this.scanner.trackComment) {\n\t                for (var i = 0; i < comments.length; ++i) {\n\t                    var e = comments[i];\n\t                    var value = this.scanner.source.slice(e.slice[0], e.slice[1]);\n\t                    var comment = {\n\t                        type: e.multiLine ? 'BlockComment' : 'LineComment',\n\t                        value: value\n\t                    };\n\t                    if (this.trackRange) {\n\t                        comment.range = e.range;\n\t                    }\n\t                    if (this.trackLoc) {\n\t                        comment.loc = e.loc;\n\t                    }\n\t                    this.buffer.push(comment);\n\t                }\n\t            }\n\t            if (!this.scanner.eof()) {\n\t                var loc = void 0;\n\t                if (this.trackLoc) {\n\t                    loc = {\n\t                        start: {\n\t                            line: this.scanner.lineNumber,\n\t                            column: this.scanner.index - this.scanner.lineStart\n\t                        },\n\t                        end: {}\n\t                    };\n\t                }\n\t                var startRegex = (this.scanner.source[this.scanner.index] === '/') && this.reader.isRegexStart();\n\t                var token = startRegex ? this.scanner.scanRegExp() : this.scanner.lex();\n\t                this.reader.push(token);\n\t                var entry = {\n\t                    type: token_1.TokenName[token.type],\n\t                    value: this.scanner.source.slice(token.start, token.end)\n\t                };\n\t                if (this.trackRange) {\n\t                    entry.range = [token.start, token.end];\n\t                }\n\t                if (this.trackLoc) {\n\t                    loc.end = {\n\t                        line: this.scanner.lineNumber,\n\t                        column: this.scanner.index - this.scanner.lineStart\n\t                    };\n\t                    entry.loc = loc;\n\t                }\n\t                if (token.type === 9 /* RegularExpression */) {\n\t                    var pattern = token.pattern;\n\t                    var flags = token.flags;\n\t                    entry.regex = { pattern: pattern, flags: flags };\n\t                }\n\t                this.buffer.push(entry);\n\t            }\n\t        }\n\t        return this.buffer.shift();\n\t    };\n\t    return Tokenizer;\n\t}());\n\texports.Tokenizer = Tokenizer;\n\n\n/***/ }\n/******/ ])\n});\n;\n\n/***/ }),\n/* 266 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar toStr = Object.prototype.toString;\nvar defineProperty = Object.defineProperty;\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nvar isArray = function isArray(arr) {\n\tif (typeof Array.isArray === 'function') {\n\t\treturn Array.isArray(arr);\n\t}\n\n\treturn toStr.call(arr) === '[object Array]';\n};\n\nvar isPlainObject = function isPlainObject(obj) {\n\tif (!obj || toStr.call(obj) !== '[object Object]') {\n\t\treturn false;\n\t}\n\n\tvar hasOwnConstructor = hasOwn.call(obj, 'constructor');\n\tvar hasIsPrototypeOf = obj.constructor && obj.constructor.prototype && hasOwn.call(obj.constructor.prototype, 'isPrototypeOf');\n\t// Not own constructor property must be Object\n\tif (obj.constructor && !hasOwnConstructor && !hasIsPrototypeOf) {\n\t\treturn false;\n\t}\n\n\t// Own properties are enumerated firstly, so to speed up,\n\t// if last one is own, then all properties are own.\n\tvar key;\n\tfor (key in obj) { /**/ }\n\n\treturn typeof key === 'undefined' || hasOwn.call(obj, key);\n};\n\n// If name is '__proto__', and Object.defineProperty is available, define __proto__ as an own property on target\nvar setProperty = function setProperty(target, options) {\n\tif (defineProperty && options.name === '__proto__') {\n\t\tdefineProperty(target, options.name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\t\t\tvalue: options.newValue,\n\t\t\twritable: true\n\t\t});\n\t} else {\n\t\ttarget[options.name] = options.newValue;\n\t}\n};\n\n// Return undefined instead of __proto__ if '__proto__' is not an own property\nvar getProperty = function getProperty(obj, name) {\n\tif (name === '__proto__') {\n\t\tif (!hasOwn.call(obj, name)) {\n\t\t\treturn void 0;\n\t\t} else if (gOPD) {\n\t\t\t// In early versions of node, obj['__proto__'] is buggy when obj has\n\t\t\t// __proto__ as an own property. Object.getOwnPropertyDescriptor() works.\n\t\t\treturn gOPD(obj, name).value;\n\t\t}\n\t}\n\n\treturn obj[name];\n};\n\nmodule.exports = function extend() {\n\tvar options, name, src, copy, copyIsArray, clone;\n\tvar target = arguments[0];\n\tvar i = 1;\n\tvar length = arguments.length;\n\tvar deep = false;\n\n\t// Handle a deep copy situation\n\tif (typeof target === 'boolean') {\n\t\tdeep = target;\n\t\ttarget = arguments[1] || {};\n\t\t// skip the boolean and the target\n\t\ti = 2;\n\t}\n\tif (target == null || (typeof target !== 'object' && typeof target !== 'function')) {\n\t\ttarget = {};\n\t}\n\n\tfor (; i < length; ++i) {\n\t\toptions = arguments[i];\n\t\t// Only deal with non-null/undefined values\n\t\tif (options != null) {\n\t\t\t// Extend the base object\n\t\t\tfor (name in options) {\n\t\t\t\tsrc = getProperty(target, name);\n\t\t\t\tcopy = getProperty(options, name);\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif (target !== copy) {\n\t\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\t\tif (deep && copy && (isPlainObject(copy) || (copyIsArray = isArray(copy)))) {\n\t\t\t\t\t\tif (copyIsArray) {\n\t\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\t\tclone = src && isArray(src) ? src : [];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tclone = src && isPlainObject(src) ? src : {};\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: extend(deep, clone, copy) });\n\n\t\t\t\t\t// Don't bring in undefined values\n\t\t\t\t\t} else if (typeof copy !== 'undefined') {\n\t\t\t\t\t\tsetProperty(target, { name: name, newValue: copy });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\n\n/***/ }),\n/* 267 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst escapeStringRegexp = __webpack_require__(382);\n\nconst platform = process.platform;\n\nconst main = {\n\ttick: '✔',\n\tcross: '✖',\n\tstar: '★',\n\tsquare: '▇',\n\tsquareSmall: '◻',\n\tsquareSmallFilled: '◼',\n\tplay: '▶',\n\tcircle: '◯',\n\tcircleFilled: '◉',\n\tcircleDotted: '◌',\n\tcircleDouble: '◎',\n\tcircleCircle: 'ⓞ',\n\tcircleCross: 'ⓧ',\n\tcirclePipe: 'Ⓘ',\n\tcircleQuestionMark: '?⃝',\n\tbullet: '●',\n\tdot: '․',\n\tline: '─',\n\tellipsis: '…',\n\tpointer: '❯',\n\tpointerSmall: '›',\n\tinfo: 'ℹ',\n\twarning: '⚠',\n\thamburger: '☰',\n\tsmiley: '㋡',\n\tmustache: '෴',\n\theart: '♥',\n\tarrowUp: '↑',\n\tarrowDown: '↓',\n\tarrowLeft: '←',\n\tarrowRight: '→',\n\tradioOn: '◉',\n\tradioOff: '◯',\n\tcheckboxOn: '☒',\n\tcheckboxOff: '☐',\n\tcheckboxCircleOn: 'ⓧ',\n\tcheckboxCircleOff: 'Ⓘ',\n\tquestionMarkPrefix: '?⃝',\n\toneHalf: '½',\n\toneThird: '⅓',\n\toneQuarter: '¼',\n\toneFifth: '⅕',\n\toneSixth: '⅙',\n\toneSeventh: '⅐',\n\toneEighth: '⅛',\n\toneNinth: '⅑',\n\toneTenth: '⅒',\n\ttwoThirds: '⅔',\n\ttwoFifths: '⅖',\n\tthreeQuarters: '¾',\n\tthreeFifths: '⅗',\n\tthreeEighths: '⅜',\n\tfourFifths: '⅘',\n\tfiveSixths: '⅚',\n\tfiveEighths: '⅝',\n\tsevenEighths: '⅞'\n};\n\nconst win = {\n\ttick: '√',\n\tcross: '×',\n\tstar: '*',\n\tsquare: '█',\n\tsquareSmall: '[ ]',\n\tsquareSmallFilled: '[█]',\n\tplay: '►',\n\tcircle: '( )',\n\tcircleFilled: '(*)',\n\tcircleDotted: '( )',\n\tcircleDouble: '( )',\n\tcircleCircle: '(○)',\n\tcircleCross: '(×)',\n\tcirclePipe: '(│)',\n\tcircleQuestionMark: '(?)',\n\tbullet: '*',\n\tdot: '.',\n\tline: '─',\n\tellipsis: '...',\n\tpointer: '>',\n\tpointerSmall: '»',\n\tinfo: 'i',\n\twarning: '‼',\n\thamburger: '≡',\n\tsmiley: '☺',\n\tmustache: '┌─┐',\n\theart: main.heart,\n\tarrowUp: main.arrowUp,\n\tarrowDown: main.arrowDown,\n\tarrowLeft: main.arrowLeft,\n\tarrowRight: main.arrowRight,\n\tradioOn: '(*)',\n\tradioOff: '( )',\n\tcheckboxOn: '[×]',\n\tcheckboxOff: '[ ]',\n\tcheckboxCircleOn: '(×)',\n\tcheckboxCircleOff: '( )',\n\tquestionMarkPrefix: '？',\n\toneHalf: '1/2',\n\toneThird: '1/3',\n\toneQuarter: '1/4',\n\toneFifth: '1/5',\n\toneSixth: '1/6',\n\toneSeventh: '1/7',\n\toneEighth: '1/8',\n\toneNinth: '1/9',\n\toneTenth: '1/10',\n\ttwoThirds: '2/3',\n\ttwoFifths: '2/5',\n\tthreeQuarters: '3/4',\n\tthreeFifths: '3/5',\n\tthreeEighths: '3/8',\n\tfourFifths: '4/5',\n\tfiveSixths: '5/6',\n\tfiveEighths: '5/8',\n\tsevenEighths: '7/8'\n};\n\nif (platform === 'linux') {\n\t// the main one doesn't look that good on Ubuntu\n\tmain.questionMarkPrefix = '?';\n}\n\nconst figures = platform === 'win32' ? win : main;\n\nconst fn = str => {\n\tif (figures === main) {\n\t\treturn str;\n\t}\n\n\tObject.keys(main).forEach(key => {\n\t\tif (main[key] === figures[key]) {\n\t\t\treturn;\n\t\t}\n\n\t\tstr = str.replace(new RegExp(escapeStringRegexp(main[key]), 'g'), figures[key]);\n\t});\n\n\treturn str;\n};\n\nmodule.exports = Object.assign(fn, figures);\n\n\n/***/ }),\n/* 268 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar pathModule = __webpack_require__(0);\nvar isWindows = process.platform === 'win32';\nvar fs = __webpack_require__(4);\n\n// JavaScript implementation of realpath, ported from node pre-v6\n\nvar DEBUG = process.env.NODE_DEBUG && /fs/.test(process.env.NODE_DEBUG);\n\nfunction rethrow() {\n  // Only enable in debug mode. A backtrace uses ~1000 bytes of heap space and\n  // is fairly slow to generate.\n  var callback;\n  if (DEBUG) {\n    var backtrace = new Error;\n    callback = debugCallback;\n  } else\n    callback = missingCallback;\n\n  return callback;\n\n  function debugCallback(err) {\n    if (err) {\n      backtrace.message = err.message;\n      err = backtrace;\n      missingCallback(err);\n    }\n  }\n\n  function missingCallback(err) {\n    if (err) {\n      if (process.throwDeprecation)\n        throw err;  // Forgot a callback but don't know where? Use NODE_DEBUG=fs\n      else if (!process.noDeprecation) {\n        var msg = 'fs: missing callback ' + (err.stack || err.message);\n        if (process.traceDeprecation)\n          console.trace(msg);\n        else\n          console.error(msg);\n      }\n    }\n  }\n}\n\nfunction maybeCallback(cb) {\n  return typeof cb === 'function' ? cb : rethrow();\n}\n\nvar normalize = pathModule.normalize;\n\n// Regexp that finds the next partion of a (partial) path\n// result is [base_with_slash, base], e.g. ['somedir/', 'somedir']\nif (isWindows) {\n  var nextPartRe = /(.*?)(?:[\\/\\\\]+|$)/g;\n} else {\n  var nextPartRe = /(.*?)(?:[\\/]+|$)/g;\n}\n\n// Regex to find the device root, including trailing slash. E.g. 'c:\\\\'.\nif (isWindows) {\n  var splitRootRe = /^(?:[a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/][^\\\\\\/]+)?[\\\\\\/]*/;\n} else {\n  var splitRootRe = /^[\\/]*/;\n}\n\nexports.realpathSync = function realpathSync(p, cache) {\n  // make p is absolute\n  p = pathModule.resolve(p);\n\n  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {\n    return cache[p];\n  }\n\n  var original = p,\n      seenLinks = {},\n      knownHard = {};\n\n  // current character position in p\n  var pos;\n  // the partial path so far, including a trailing slash if any\n  var current;\n  // the partial path without a trailing slash (except when pointing at a root)\n  var base;\n  // the partial path scanned in the previous round, with slash\n  var previous;\n\n  start();\n\n  function start() {\n    // Skip over roots\n    var m = splitRootRe.exec(p);\n    pos = m[0].length;\n    current = m[0];\n    base = m[0];\n    previous = '';\n\n    // On windows, check that the root exists. On unix there is no need.\n    if (isWindows && !knownHard[base]) {\n      fs.lstatSync(base);\n      knownHard[base] = true;\n    }\n  }\n\n  // walk down the path, swapping out linked pathparts for their real\n  // values\n  // NB: p.length changes.\n  while (pos < p.length) {\n    // find the next part\n    nextPartRe.lastIndex = pos;\n    var result = nextPartRe.exec(p);\n    previous = current;\n    current += result[0];\n    base = previous + result[1];\n    pos = nextPartRe.lastIndex;\n\n    // continue if not a symlink\n    if (knownHard[base] || (cache && cache[base] === base)) {\n      continue;\n    }\n\n    var resolvedLink;\n    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {\n      // some known symbolic link.  no need to stat again.\n      resolvedLink = cache[base];\n    } else {\n      var stat = fs.lstatSync(base);\n      if (!stat.isSymbolicLink()) {\n        knownHard[base] = true;\n        if (cache) cache[base] = base;\n        continue;\n      }\n\n      // read the link if it wasn't read before\n      // dev/ino always return 0 on windows, so skip the check.\n      var linkTarget = null;\n      if (!isWindows) {\n        var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);\n        if (seenLinks.hasOwnProperty(id)) {\n          linkTarget = seenLinks[id];\n        }\n      }\n      if (linkTarget === null) {\n        fs.statSync(base);\n        linkTarget = fs.readlinkSync(base);\n      }\n      resolvedLink = pathModule.resolve(previous, linkTarget);\n      // track this, if given a cache.\n      if (cache) cache[base] = resolvedLink;\n      if (!isWindows) seenLinks[id] = linkTarget;\n    }\n\n    // resolve the link, then start over\n    p = pathModule.resolve(resolvedLink, p.slice(pos));\n    start();\n  }\n\n  if (cache) cache[original] = p;\n\n  return p;\n};\n\n\nexports.realpath = function realpath(p, cache, cb) {\n  if (typeof cb !== 'function') {\n    cb = maybeCallback(cache);\n    cache = null;\n  }\n\n  // make p is absolute\n  p = pathModule.resolve(p);\n\n  if (cache && Object.prototype.hasOwnProperty.call(cache, p)) {\n    return process.nextTick(cb.bind(null, null, cache[p]));\n  }\n\n  var original = p,\n      seenLinks = {},\n      knownHard = {};\n\n  // current character position in p\n  var pos;\n  // the partial path so far, including a trailing slash if any\n  var current;\n  // the partial path without a trailing slash (except when pointing at a root)\n  var base;\n  // the partial path scanned in the previous round, with slash\n  var previous;\n\n  start();\n\n  function start() {\n    // Skip over roots\n    var m = splitRootRe.exec(p);\n    pos = m[0].length;\n    current = m[0];\n    base = m[0];\n    previous = '';\n\n    // On windows, check that the root exists. On unix there is no need.\n    if (isWindows && !knownHard[base]) {\n      fs.lstat(base, function(err) {\n        if (err) return cb(err);\n        knownHard[base] = true;\n        LOOP();\n      });\n    } else {\n      process.nextTick(LOOP);\n    }\n  }\n\n  // walk down the path, swapping out linked pathparts for their real\n  // values\n  function LOOP() {\n    // stop if scanned past end of path\n    if (pos >= p.length) {\n      if (cache) cache[original] = p;\n      return cb(null, p);\n    }\n\n    // find the next part\n    nextPartRe.lastIndex = pos;\n    var result = nextPartRe.exec(p);\n    previous = current;\n    current += result[0];\n    base = previous + result[1];\n    pos = nextPartRe.lastIndex;\n\n    // continue if not a symlink\n    if (knownHard[base] || (cache && cache[base] === base)) {\n      return process.nextTick(LOOP);\n    }\n\n    if (cache && Object.prototype.hasOwnProperty.call(cache, base)) {\n      // known symbolic link.  no need to stat again.\n      return gotResolvedLink(cache[base]);\n    }\n\n    return fs.lstat(base, gotStat);\n  }\n\n  function gotStat(err, stat) {\n    if (err) return cb(err);\n\n    // if not a symlink, skip to the next path part\n    if (!stat.isSymbolicLink()) {\n      knownHard[base] = true;\n      if (cache) cache[base] = base;\n      return process.nextTick(LOOP);\n    }\n\n    // stat & read the link if not read before\n    // call gotTarget as soon as the link target is known\n    // dev/ino always return 0 on windows, so skip the check.\n    if (!isWindows) {\n      var id = stat.dev.toString(32) + ':' + stat.ino.toString(32);\n      if (seenLinks.hasOwnProperty(id)) {\n        return gotTarget(null, seenLinks[id], base);\n      }\n    }\n    fs.stat(base, function(err) {\n      if (err) return cb(err);\n\n      fs.readlink(base, function(err, target) {\n        if (!isWindows) seenLinks[id] = target;\n        gotTarget(err, target);\n      });\n    });\n  }\n\n  function gotTarget(err, target, base) {\n    if (err) return cb(err);\n\n    var resolvedLink = pathModule.resolve(previous, target);\n    if (cache) cache[base] = resolvedLink;\n    gotResolvedLink(resolvedLink);\n  }\n\n  function gotResolvedLink(resolvedLink) {\n    // resolve the link, then start over\n    p = pathModule.resolve(resolvedLink, p.slice(pos));\n    start();\n  }\n};\n\n\n/***/ }),\n/* 269 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = globSync\nglobSync.GlobSync = GlobSync\n\nvar fs = __webpack_require__(4)\nvar rp = __webpack_require__(141)\nvar minimatch = __webpack_require__(82)\nvar Minimatch = minimatch.Minimatch\nvar Glob = __webpack_require__(99).Glob\nvar util = __webpack_require__(3)\nvar path = __webpack_require__(0)\nvar assert = __webpack_require__(29)\nvar isAbsolute = __webpack_require__(101)\nvar common = __webpack_require__(142)\nvar alphasort = common.alphasort\nvar alphasorti = common.alphasorti\nvar setopts = common.setopts\nvar ownProp = common.ownProp\nvar childrenIgnored = common.childrenIgnored\nvar isIgnored = common.isIgnored\n\nfunction globSync (pattern, options) {\n  if (typeof options === 'function' || arguments.length === 3)\n    throw new TypeError('callback provided to sync glob\\n'+\n                        'See: https://github.com/isaacs/node-glob/issues/167')\n\n  return new GlobSync(pattern, options).found\n}\n\nfunction GlobSync (pattern, options) {\n  if (!pattern)\n    throw new Error('must provide pattern')\n\n  if (typeof options === 'function' || arguments.length === 3)\n    throw new TypeError('callback provided to sync glob\\n'+\n                        'See: https://github.com/isaacs/node-glob/issues/167')\n\n  if (!(this instanceof GlobSync))\n    return new GlobSync(pattern, options)\n\n  setopts(this, pattern, options)\n\n  if (this.noprocess)\n    return this\n\n  var n = this.minimatch.set.length\n  this.matches = new Array(n)\n  for (var i = 0; i < n; i ++) {\n    this._process(this.minimatch.set[i], i, false)\n  }\n  this._finish()\n}\n\nGlobSync.prototype._finish = function () {\n  assert(this instanceof GlobSync)\n  if (this.realpath) {\n    var self = this\n    this.matches.forEach(function (matchset, index) {\n      var set = self.matches[index] = Object.create(null)\n      for (var p in matchset) {\n        try {\n          p = self._makeAbs(p)\n          var real = rp.realpathSync(p, self.realpathCache)\n          set[real] = true\n        } catch (er) {\n          if (er.syscall === 'stat')\n            set[self._makeAbs(p)] = true\n          else\n            throw er\n        }\n      }\n    })\n  }\n  common.finish(this)\n}\n\n\nGlobSync.prototype._process = function (pattern, index, inGlobStar) {\n  assert(this instanceof GlobSync)\n\n  // Get the first [n] parts of pattern that are all strings.\n  var n = 0\n  while (typeof pattern[n] === 'string') {\n    n ++\n  }\n  // now n is the index of the first one that is *not* a string.\n\n  // See if there's anything else\n  var prefix\n  switch (n) {\n    // if not, then this is rather simple\n    case pattern.length:\n      this._processSimple(pattern.join('/'), index)\n      return\n\n    case 0:\n      // pattern *starts* with some non-trivial item.\n      // going to readdir(cwd), but not include the prefix in matches.\n      prefix = null\n      break\n\n    default:\n      // pattern has some string bits in the front.\n      // whatever it starts with, whether that's 'absolute' like /foo/bar,\n      // or 'relative' like '../baz'\n      prefix = pattern.slice(0, n).join('/')\n      break\n  }\n\n  var remain = pattern.slice(n)\n\n  // get the list of entries.\n  var read\n  if (prefix === null)\n    read = '.'\n  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) {\n    if (!prefix || !isAbsolute(prefix))\n      prefix = '/' + prefix\n    read = prefix\n  } else\n    read = prefix\n\n  var abs = this._makeAbs(read)\n\n  //if ignored, skip processing\n  if (childrenIgnored(this, read))\n    return\n\n  var isGlobStar = remain[0] === minimatch.GLOBSTAR\n  if (isGlobStar)\n    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar)\n  else\n    this._processReaddir(prefix, read, abs, remain, index, inGlobStar)\n}\n\n\nGlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) {\n  var entries = this._readdir(abs, inGlobStar)\n\n  // if the abs isn't a dir, then nothing can match!\n  if (!entries)\n    return\n\n  // It will only match dot entries if it starts with a dot, or if\n  // dot is set.  Stuff like @(.foo|.bar) isn't allowed.\n  var pn = remain[0]\n  var negate = !!this.minimatch.negate\n  var rawGlob = pn._glob\n  var dotOk = this.dot || rawGlob.charAt(0) === '.'\n\n  var matchedEntries = []\n  for (var i = 0; i < entries.length; i++) {\n    var e = entries[i]\n    if (e.charAt(0) !== '.' || dotOk) {\n      var m\n      if (negate && !prefix) {\n        m = !e.match(pn)\n      } else {\n        m = e.match(pn)\n      }\n      if (m)\n        matchedEntries.push(e)\n    }\n  }\n\n  var len = matchedEntries.length\n  // If there are no matched entries, then nothing matches.\n  if (len === 0)\n    return\n\n  // if this is the last remaining pattern bit, then no need for\n  // an additional stat *unless* the user has specified mark or\n  // stat explicitly.  We know they exist, since readdir returned\n  // them.\n\n  if (remain.length === 1 && !this.mark && !this.stat) {\n    if (!this.matches[index])\n      this.matches[index] = Object.create(null)\n\n    for (var i = 0; i < len; i ++) {\n      var e = matchedEntries[i]\n      if (prefix) {\n        if (prefix.slice(-1) !== '/')\n          e = prefix + '/' + e\n        else\n          e = prefix + e\n      }\n\n      if (e.charAt(0) === '/' && !this.nomount) {\n        e = path.join(this.root, e)\n      }\n      this._emitMatch(index, e)\n    }\n    // This was the last one, and no stats were needed\n    return\n  }\n\n  // now test all matched entries as stand-ins for that part\n  // of the pattern.\n  remain.shift()\n  for (var i = 0; i < len; i ++) {\n    var e = matchedEntries[i]\n    var newPattern\n    if (prefix)\n      newPattern = [prefix, e]\n    else\n      newPattern = [e]\n    this._process(newPattern.concat(remain), index, inGlobStar)\n  }\n}\n\n\nGlobSync.prototype._emitMatch = function (index, e) {\n  if (isIgnored(this, e))\n    return\n\n  var abs = this._makeAbs(e)\n\n  if (this.mark)\n    e = this._mark(e)\n\n  if (this.absolute) {\n    e = abs\n  }\n\n  if (this.matches[index][e])\n    return\n\n  if (this.nodir) {\n    var c = this.cache[abs]\n    if (c === 'DIR' || Array.isArray(c))\n      return\n  }\n\n  this.matches[index][e] = true\n\n  if (this.stat)\n    this._stat(e)\n}\n\n\nGlobSync.prototype._readdirInGlobStar = function (abs) {\n  // follow all symlinked directories forever\n  // just proceed as if this is a non-globstar situation\n  if (this.follow)\n    return this._readdir(abs, false)\n\n  var entries\n  var lstat\n  var stat\n  try {\n    lstat = fs.lstatSync(abs)\n  } catch (er) {\n    if (er.code === 'ENOENT') {\n      // lstat failed, doesn't exist\n      return null\n    }\n  }\n\n  var isSym = lstat && lstat.isSymbolicLink()\n  this.symlinks[abs] = isSym\n\n  // If it's not a symlink or a dir, then it's definitely a regular file.\n  // don't bother doing a readdir in that case.\n  if (!isSym && lstat && !lstat.isDirectory())\n    this.cache[abs] = 'FILE'\n  else\n    entries = this._readdir(abs, false)\n\n  return entries\n}\n\nGlobSync.prototype._readdir = function (abs, inGlobStar) {\n  var entries\n\n  if (inGlobStar && !ownProp(this.symlinks, abs))\n    return this._readdirInGlobStar(abs)\n\n  if (ownProp(this.cache, abs)) {\n    var c = this.cache[abs]\n    if (!c || c === 'FILE')\n      return null\n\n    if (Array.isArray(c))\n      return c\n  }\n\n  try {\n    return this._readdirEntries(abs, fs.readdirSync(abs))\n  } catch (er) {\n    this._readdirError(abs, er)\n    return null\n  }\n}\n\nGlobSync.prototype._readdirEntries = function (abs, entries) {\n  // if we haven't asked to stat everything, then just\n  // assume that everything in there exists, so we can avoid\n  // having to stat it a second time.\n  if (!this.mark && !this.stat) {\n    for (var i = 0; i < entries.length; i ++) {\n      var e = entries[i]\n      if (abs === '/')\n        e = abs + e\n      else\n        e = abs + '/' + e\n      this.cache[e] = true\n    }\n  }\n\n  this.cache[abs] = entries\n\n  // mark and cache dir-ness\n  return entries\n}\n\nGlobSync.prototype._readdirError = function (f, er) {\n  // handle errors, and cache the information\n  switch (er.code) {\n    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205\n    case 'ENOTDIR': // totally normal. means it *does* exist.\n      var abs = this._makeAbs(f)\n      this.cache[abs] = 'FILE'\n      if (abs === this.cwdAbs) {\n        var error = new Error(er.code + ' invalid cwd ' + this.cwd)\n        error.path = this.cwd\n        error.code = er.code\n        throw error\n      }\n      break\n\n    case 'ENOENT': // not terribly unusual\n    case 'ELOOP':\n    case 'ENAMETOOLONG':\n    case 'UNKNOWN':\n      this.cache[this._makeAbs(f)] = false\n      break\n\n    default: // some unusual error.  Treat as failure.\n      this.cache[this._makeAbs(f)] = false\n      if (this.strict)\n        throw er\n      if (!this.silent)\n        console.error('glob error', er)\n      break\n  }\n}\n\nGlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) {\n\n  var entries = this._readdir(abs, inGlobStar)\n\n  // no entries means not a dir, so it can never have matches\n  // foo.txt/** doesn't match foo.txt\n  if (!entries)\n    return\n\n  // test without the globstar, and with every child both below\n  // and replacing the globstar.\n  var remainWithoutGlobStar = remain.slice(1)\n  var gspref = prefix ? [ prefix ] : []\n  var noGlobStar = gspref.concat(remainWithoutGlobStar)\n\n  // the noGlobStar pattern exits the inGlobStar state\n  this._process(noGlobStar, index, false)\n\n  var len = entries.length\n  var isSym = this.symlinks[abs]\n\n  // If it's a symlink, and we're in a globstar, then stop\n  if (isSym && inGlobStar)\n    return\n\n  for (var i = 0; i < len; i++) {\n    var e = entries[i]\n    if (e.charAt(0) === '.' && !this.dot)\n      continue\n\n    // these two cases enter the inGlobStar state\n    var instead = gspref.concat(entries[i], remainWithoutGlobStar)\n    this._process(instead, index, true)\n\n    var below = gspref.concat(entries[i], remain)\n    this._process(below, index, true)\n  }\n}\n\nGlobSync.prototype._processSimple = function (prefix, index) {\n  // XXX review this.  Shouldn't it be doing the mounting etc\n  // before doing stat?  kinda weird?\n  var exists = this._stat(prefix)\n\n  if (!this.matches[index])\n    this.matches[index] = Object.create(null)\n\n  // If it doesn't exist, then just mark the lack of results\n  if (!exists)\n    return\n\n  if (prefix && isAbsolute(prefix) && !this.nomount) {\n    var trail = /[\\/\\\\]$/.test(prefix)\n    if (prefix.charAt(0) === '/') {\n      prefix = path.join(this.root, prefix)\n    } else {\n      prefix = path.resolve(this.root, prefix)\n      if (trail)\n        prefix += '/'\n    }\n  }\n\n  if (process.platform === 'win32')\n    prefix = prefix.replace(/\\\\/g, '/')\n\n  // Mark this as a match\n  this._emitMatch(index, prefix)\n}\n\n// Returns either 'DIR', 'FILE', or false\nGlobSync.prototype._stat = function (f) {\n  var abs = this._makeAbs(f)\n  var needDir = f.slice(-1) === '/'\n\n  if (f.length > this.maxLength)\n    return false\n\n  if (!this.stat && ownProp(this.cache, abs)) {\n    var c = this.cache[abs]\n\n    if (Array.isArray(c))\n      c = 'DIR'\n\n    // It exists, but maybe not how we need it\n    if (!needDir || c === 'DIR')\n      return c\n\n    if (needDir && c === 'FILE')\n      return false\n\n    // otherwise we have to stat, because maybe c=true\n    // if we know it exists, but not what it is.\n  }\n\n  var exists\n  var stat = this.statCache[abs]\n  if (!stat) {\n    var lstat\n    try {\n      lstat = fs.lstatSync(abs)\n    } catch (er) {\n      if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) {\n        this.statCache[abs] = false\n        return false\n      }\n    }\n\n    if (lstat && lstat.isSymbolicLink()) {\n      try {\n        stat = fs.statSync(abs)\n      } catch (er) {\n        stat = lstat\n      }\n    } else {\n      stat = lstat\n    }\n  }\n\n  this.statCache[abs] = stat\n\n  var c = true\n  if (stat)\n    c = stat.isDirectory() ? 'DIR' : 'FILE'\n\n  this.cache[abs] = this.cache[abs] || c\n\n  if (needDir && c === 'FILE')\n    return false\n\n  return c\n}\n\nGlobSync.prototype._mark = function (p) {\n  return common.mark(this, p)\n}\n\nGlobSync.prototype._makeAbs = function (f) {\n  return common.makeAbs(this, f)\n}\n\n\n/***/ }),\n/* 270 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar resolve = __webpack_require__(271);\n\nmodule.exports = {\n  Validation: errorSubclass(ValidationError),\n  MissingRef: errorSubclass(MissingRefError)\n};\n\n\nfunction ValidationError(errors) {\n  this.message = 'validation failed';\n  this.errors = errors;\n  this.ajv = this.validation = true;\n}\n\n\nMissingRefError.message = function (baseId, ref) {\n  return 'can\\'t resolve reference ' + ref + ' from id ' + baseId;\n};\n\n\nfunction MissingRefError(baseId, ref, message) {\n  this.message = message || MissingRefError.message(baseId, ref);\n  this.missingRef = resolve.url(baseId, ref);\n  this.missingSchema = resolve.normalizeId(resolve.fullPath(this.missingRef));\n}\n\n\nfunction errorSubclass(Subclass) {\n  Subclass.prototype = Object.create(Error.prototype);\n  Subclass.prototype.constructor = Subclass;\n  return Subclass;\n}\n\n\n/***/ }),\n/* 271 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar url = __webpack_require__(24)\n  , equal = __webpack_require__(272)\n  , util = __webpack_require__(114)\n  , SchemaObject = __webpack_require__(386)\n  , traverse = __webpack_require__(677);\n\nmodule.exports = resolve;\n\nresolve.normalizeId = normalizeId;\nresolve.fullPath = getFullPath;\nresolve.url = resolveUrl;\nresolve.ids = resolveIds;\nresolve.inlineRef = inlineRef;\nresolve.schema = resolveSchema;\n\n/**\n * [resolve and compile the references ($ref)]\n * @this   Ajv\n * @param  {Function} compile reference to schema compilation funciton (localCompile)\n * @param  {Object} root object with information about the root schema for the current schema\n * @param  {String} ref reference to resolve\n * @return {Object|Function} schema object (if the schema can be inlined) or validation function\n */\nfunction resolve(compile, root, ref) {\n  /* jshint validthis: true */\n  var refVal = this._refs[ref];\n  if (typeof refVal == 'string') {\n    if (this._refs[refVal]) refVal = this._refs[refVal];\n    else return resolve.call(this, compile, root, refVal);\n  }\n\n  refVal = refVal || this._schemas[ref];\n  if (refVal instanceof SchemaObject) {\n    return inlineRef(refVal.schema, this._opts.inlineRefs)\n            ? refVal.schema\n            : refVal.validate || this._compile(refVal);\n  }\n\n  var res = resolveSchema.call(this, root, ref);\n  var schema, v, baseId;\n  if (res) {\n    schema = res.schema;\n    root = res.root;\n    baseId = res.baseId;\n  }\n\n  if (schema instanceof SchemaObject) {\n    v = schema.validate || compile.call(this, schema.schema, root, undefined, baseId);\n  } else if (schema !== undefined) {\n    v = inlineRef(schema, this._opts.inlineRefs)\n        ? schema\n        : compile.call(this, schema, root, undefined, baseId);\n  }\n\n  return v;\n}\n\n\n/**\n * Resolve schema, its root and baseId\n * @this Ajv\n * @param  {Object} root root object with properties schema, refVal, refs\n * @param  {String} ref  reference to resolve\n * @return {Object} object with properties schema, root, baseId\n */\nfunction resolveSchema(root, ref) {\n  /* jshint validthis: true */\n  var p = url.parse(ref, false, true)\n    , refPath = _getFullPath(p)\n    , baseId = getFullPath(this._getId(root.schema));\n  if (refPath !== baseId) {\n    var id = normalizeId(refPath);\n    var refVal = this._refs[id];\n    if (typeof refVal == 'string') {\n      return resolveRecursive.call(this, root, refVal, p);\n    } else if (refVal instanceof SchemaObject) {\n      if (!refVal.validate) this._compile(refVal);\n      root = refVal;\n    } else {\n      refVal = this._schemas[id];\n      if (refVal instanceof SchemaObject) {\n        if (!refVal.validate) this._compile(refVal);\n        if (id == normalizeId(ref))\n          return { schema: refVal, root: root, baseId: baseId };\n        root = refVal;\n      } else {\n        return;\n      }\n    }\n    if (!root.schema) return;\n    baseId = getFullPath(this._getId(root.schema));\n  }\n  return getJsonPointer.call(this, p, baseId, root.schema, root);\n}\n\n\n/* @this Ajv */\nfunction resolveRecursive(root, ref, parsedRef) {\n  /* jshint validthis: true */\n  var res = resolveSchema.call(this, root, ref);\n  if (res) {\n    var schema = res.schema;\n    var baseId = res.baseId;\n    root = res.root;\n    var id = this._getId(schema);\n    if (id) baseId = resolveUrl(baseId, id);\n    return getJsonPointer.call(this, parsedRef, baseId, schema, root);\n  }\n}\n\n\nvar PREVENT_SCOPE_CHANGE = util.toHash(['properties', 'patternProperties', 'enum', 'dependencies', 'definitions']);\n/* @this Ajv */\nfunction getJsonPointer(parsedRef, baseId, schema, root) {\n  /* jshint validthis: true */\n  parsedRef.hash = parsedRef.hash || '';\n  if (parsedRef.hash.slice(0,2) != '#/') return;\n  var parts = parsedRef.hash.split('/');\n\n  for (var i = 1; i < parts.length; i++) {\n    var part = parts[i];\n    if (part) {\n      part = util.unescapeFragment(part);\n      schema = schema[part];\n      if (schema === undefined) break;\n      var id;\n      if (!PREVENT_SCOPE_CHANGE[part]) {\n        id = this._getId(schema);\n        if (id) baseId = resolveUrl(baseId, id);\n        if (schema.$ref) {\n          var $ref = resolveUrl(baseId, schema.$ref);\n          var res = resolveSchema.call(this, root, $ref);\n          if (res) {\n            schema = res.schema;\n            root = res.root;\n            baseId = res.baseId;\n          }\n        }\n      }\n    }\n  }\n  if (schema !== undefined && schema !== root.schema)\n    return { schema: schema, root: root, baseId: baseId };\n}\n\n\nvar SIMPLE_INLINED = util.toHash([\n  'type', 'format', 'pattern',\n  'maxLength', 'minLength',\n  'maxProperties', 'minProperties',\n  'maxItems', 'minItems',\n  'maximum', 'minimum',\n  'uniqueItems', 'multipleOf',\n  'required', 'enum'\n]);\nfunction inlineRef(schema, limit) {\n  if (limit === false) return false;\n  if (limit === undefined || limit === true) return checkNoRef(schema);\n  else if (limit) return countKeys(schema) <= limit;\n}\n\n\nfunction checkNoRef(schema) {\n  var item;\n  if (Array.isArray(schema)) {\n    for (var i=0; i<schema.length; i++) {\n      item = schema[i];\n      if (typeof item == 'object' && !checkNoRef(item)) return false;\n    }\n  } else {\n    for (var key in schema) {\n      if (key == '$ref') return false;\n      item = schema[key];\n      if (typeof item == 'object' && !checkNoRef(item)) return false;\n    }\n  }\n  return true;\n}\n\n\nfunction countKeys(schema) {\n  var count = 0, item;\n  if (Array.isArray(schema)) {\n    for (var i=0; i<schema.length; i++) {\n      item = schema[i];\n      if (typeof item == 'object') count += countKeys(item);\n      if (count == Infinity) return Infinity;\n    }\n  } else {\n    for (var key in schema) {\n      if (key == '$ref') return Infinity;\n      if (SIMPLE_INLINED[key]) {\n        count++;\n      } else {\n        item = schema[key];\n        if (typeof item == 'object') count += countKeys(item) + 1;\n        if (count == Infinity) return Infinity;\n      }\n    }\n  }\n  return count;\n}\n\n\nfunction getFullPath(id, normalize) {\n  if (normalize !== false) id = normalizeId(id);\n  var p = url.parse(id, false, true);\n  return _getFullPath(p);\n}\n\n\nfunction _getFullPath(p) {\n  var protocolSeparator = p.protocol || p.href.slice(0,2) == '//' ? '//' : '';\n  return (p.protocol||'') + protocolSeparator + (p.host||'') + (p.path||'')  + '#';\n}\n\n\nvar TRAILING_SLASH_HASH = /#\\/?$/;\nfunction normalizeId(id) {\n  return id ? id.replace(TRAILING_SLASH_HASH, '') : '';\n}\n\n\nfunction resolveUrl(baseId, id) {\n  id = normalizeId(id);\n  return url.resolve(baseId, id);\n}\n\n\n/* @this Ajv */\nfunction resolveIds(schema) {\n  var schemaId = normalizeId(this._getId(schema));\n  var baseIds = {'': schemaId};\n  var fullPaths = {'': getFullPath(schemaId, false)};\n  var localRefs = {};\n  var self = this;\n\n  traverse(schema, {allKeys: true}, function(sch, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {\n    if (jsonPtr === '') return;\n    var id = self._getId(sch);\n    var baseId = baseIds[parentJsonPtr];\n    var fullPath = fullPaths[parentJsonPtr] + '/' + parentKeyword;\n    if (keyIndex !== undefined)\n      fullPath += '/' + (typeof keyIndex == 'number' ? keyIndex : util.escapeFragment(keyIndex));\n\n    if (typeof id == 'string') {\n      id = baseId = normalizeId(baseId ? url.resolve(baseId, id) : id);\n\n      var refVal = self._refs[id];\n      if (typeof refVal == 'string') refVal = self._refs[refVal];\n      if (refVal && refVal.schema) {\n        if (!equal(sch, refVal.schema))\n          throw new Error('id \"' + id + '\" resolves to more than one schema');\n      } else if (id != normalizeId(fullPath)) {\n        if (id[0] == '#') {\n          if (localRefs[id] && !equal(sch, localRefs[id]))\n            throw new Error('id \"' + id + '\" resolves to more than one schema');\n          localRefs[id] = sch;\n        } else {\n          self._refs[id] = fullPath;\n        }\n      }\n    }\n    baseIds[jsonPtr] = baseId;\n    fullPaths[jsonPtr] = fullPath;\n  });\n\n  return localRefs;\n}\n\n\n/***/ }),\n/* 272 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar isArray = Array.isArray;\nvar keyList = Object.keys;\nvar hasProp = Object.prototype.hasOwnProperty;\n\nmodule.exports = function equal(a, b) {\n  if (a === b) return true;\n\n  var arrA = isArray(a)\n    , arrB = isArray(b)\n    , i\n    , length\n    , key;\n\n  if (arrA && arrB) {\n    length = a.length;\n    if (length != b.length) return false;\n    for (i = 0; i < length; i++)\n      if (!equal(a[i], b[i])) return false;\n    return true;\n  }\n\n  if (arrA != arrB) return false;\n\n  var dateA = a instanceof Date\n    , dateB = b instanceof Date;\n  if (dateA != dateB) return false;\n  if (dateA && dateB) return a.getTime() == b.getTime();\n\n  var regexpA = a instanceof RegExp\n    , regexpB = b instanceof RegExp;\n  if (regexpA != regexpB) return false;\n  if (regexpA && regexpB) return a.toString() == b.toString();\n\n  if (a instanceof Object && b instanceof Object) {\n    var keys = keyList(a);\n    length = keys.length;\n\n    if (length !== keyList(b).length)\n      return false;\n\n    for (i = 0; i < length; i++)\n      if (!hasProp.call(b, keys[i])) return false;\n\n    for (i = 0; i < length; i++) {\n      key = keys[i];\n      if (!equal(a[key], b[key])) return false;\n    }\n\n    return true;\n  }\n\n  return false;\n};\n\n\n/***/ }),\n/* 273 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function (flag, argv) {\n\targv = argv || process.argv;\n\n\tvar terminatorPos = argv.indexOf('--');\n\tvar prefix = /^--/.test(flag) ? '' : '--';\n\tvar pos = argv.indexOf(prefix + flag);\n\n\treturn pos !== -1 && (terminatorPos !== -1 ? pos < terminatorPos : true);\n};\n\n\n/***/ }),\n/* 274 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar wrappy = __webpack_require__(162)\nvar reqs = Object.create(null)\nvar once = __webpack_require__(83)\n\nmodule.exports = wrappy(inflight)\n\nfunction inflight (key, cb) {\n  if (reqs[key]) {\n    reqs[key].push(cb)\n    return null\n  } else {\n    reqs[key] = [cb]\n    return makeres(key)\n  }\n}\n\nfunction makeres (key) {\n  return once(function RES () {\n    var cbs = reqs[key]\n    var len = cbs.length\n    var args = slice(arguments)\n\n    // XXX It's somewhat ambiguous whether a new callback added in this\n    // pass should be queued for later execution if something in the\n    // list of callbacks throws, or if it should just be discarded.\n    // However, it's such an edge case that it hardly matters, and either\n    // choice is likely as surprising as the other.\n    // As it happens, we do go ahead and schedule it for later execution.\n    try {\n      for (var i = 0; i < len; i++) {\n        cbs[i].apply(null, args)\n      }\n    } finally {\n      if (cbs.length > len) {\n        // added more in the interim.\n        // de-zalgo, just in case, but don't call again.\n        cbs.splice(0, len)\n        process.nextTick(function () {\n          RES.apply(null, args)\n        })\n      } else {\n        delete reqs[key]\n      }\n    }\n  })\n}\n\nfunction slice (args) {\n  var length = args.length\n  var array = []\n\n  for (var i = 0; i < length; i++) array[i] = args[i]\n  return array\n}\n\n\n/***/ }),\n/* 275 */\n/***/ (function(module, exports) {\n\nif (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    ctor.super_ = superCtor\n    var TempCtor = function () {}\n    TempCtor.prototype = superCtor.prototype\n    ctor.prototype = new TempCtor()\n    ctor.prototype.constructor = ctor\n  }\n}\n\n\n/***/ }),\n/* 276 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * Inquirer.js\n * A collection of common interactive command line user interfaces.\n */\n\nvar inquirer = module.exports;\n\n/**\n * Client interfaces\n */\n\ninquirer.prompts = {};\n\ninquirer.Separator = __webpack_require__(176);\n\ninquirer.ui = {\n  BottomBar: __webpack_require__(695),\n  Prompt: __webpack_require__(696)\n};\n\n/**\n * Create a new self-contained prompt module.\n */\ninquirer.createPromptModule = function(opt) {\n  var promptModule = function(questions) {\n    var ui = new inquirer.ui.Prompt(promptModule.prompts, opt);\n    var promise = ui.run(questions);\n\n    // Monkey patch the UI on the promise object so\n    // that it remains publicly accessible.\n    promise.ui = ui;\n\n    return promise;\n  };\n  promptModule.prompts = {};\n\n  /**\n   * Register a prompt type\n   * @param {String} name     Prompt type name\n   * @param {Function} prompt Prompt constructor\n   * @return {inquirer}\n   */\n\n  promptModule.registerPrompt = function(name, prompt) {\n    promptModule.prompts[name] = prompt;\n    return this;\n  };\n\n  /**\n   * Register the defaults provider prompts\n   */\n\n  promptModule.restoreDefaultPrompts = function() {\n    this.registerPrompt('list', __webpack_require__(691));\n    this.registerPrompt('input', __webpack_require__(392));\n    this.registerPrompt('number', __webpack_require__(692));\n    this.registerPrompt('confirm', __webpack_require__(688));\n    this.registerPrompt('rawlist', __webpack_require__(694));\n    this.registerPrompt('expand', __webpack_require__(690));\n    this.registerPrompt('checkbox', __webpack_require__(687));\n    this.registerPrompt('password', __webpack_require__(693));\n    this.registerPrompt('editor', __webpack_require__(689));\n  };\n\n  promptModule.restoreDefaultPrompts();\n\n  return promptModule;\n};\n\n/**\n * Public CLI helper interface\n * @param  {Array|Object|Rx.Observable} questions - Questions settings array\n * @param  {Function} cb - Callback being passed the user answers\n * @return {inquirer.ui.Prompt}\n */\n\ninquirer.prompt = inquirer.createPromptModule();\n\n// Expose helper functions on the top level for easiest usage by common users\ninquirer.registerPrompt = function(name, prompt) {\n  inquirer.prompt.registerPrompt(name, prompt);\n};\ninquirer.restoreDefaultPrompts = function() {\n  inquirer.prompt.restoreDefaultPrompts();\n};\n\n\n/***/ }),\n/* 277 */\n/***/ (function(module, exports) {\n\nmodule.exports = [[\"0\",\"\\u0000\",127,\"€\"],[\"8140\",\"丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪\",5,\"乲乴\",9,\"乿\",6,\"亇亊\"],[\"8180\",\"亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂\",6,\"伋伌伒\",4,\"伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾\",4,\"佄佅佇\",5,\"佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢\"],[\"8240\",\"侤侫侭侰\",4,\"侶\",8,\"俀俁係俆俇俈俉俋俌俍俒\",4,\"俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿\",11],[\"8280\",\"個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯\",10,\"倻倽倿偀偁偂偄偅偆偉偊偋偍偐\",4,\"偖偗偘偙偛偝\",7,\"偦\",5,\"偭\",8,\"偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎\",20,\"傤傦傪傫傭\",4,\"傳\",6,\"傼\"],[\"8340\",\"傽\",17,\"僐\",5,\"僗僘僙僛\",10,\"僨僩僪僫僯僰僱僲僴僶\",4,\"僼\",9,\"儈\"],[\"8380\",\"儉儊儌\",5,\"儓\",13,\"儢\",28,\"兂兇兊兌兎兏児兒兓兗兘兙兛兝\",4,\"兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦\",4,\"冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒\",5],[\"8440\",\"凘凙凚凜凞凟凢凣凥\",5,\"凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄\",5,\"剋剎剏剒剓剕剗剘\"],[\"8480\",\"剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳\",9,\"剾劀劃\",4,\"劉\",6,\"劑劒劔\",6,\"劜劤劥劦劧劮劯劰労\",9,\"勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務\",5,\"勠勡勢勣勥\",10,\"勱\",7,\"勻勼勽匁匂匃匄匇匉匊匋匌匎\"],[\"8540\",\"匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯\",9,\"匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏\"],[\"8580\",\"厐\",4,\"厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯\",6,\"厷厸厹厺厼厽厾叀參\",4,\"収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝\",4,\"呣呥呧呩\",7,\"呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡\"],[\"8640\",\"咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠\",4,\"哫哬哯哰哱哴\",5,\"哻哾唀唂唃唄唅唈唊\",4,\"唒唓唕\",5,\"唜唝唞唟唡唥唦\"],[\"8680\",\"唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋\",4,\"啑啒啓啔啗\",4,\"啝啞啟啠啢啣啨啩啫啯\",5,\"啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠\",6,\"喨\",8,\"喲喴営喸喺喼喿\",4,\"嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗\",4,\"嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸\",4,\"嗿嘂嘃嘄嘅\"],[\"8740\",\"嘆嘇嘊嘋嘍嘐\",7,\"嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀\",11,\"噏\",4,\"噕噖噚噛噝\",4],[\"8780\",\"噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽\",7,\"嚇\",6,\"嚐嚑嚒嚔\",14,\"嚤\",10,\"嚰\",6,\"嚸嚹嚺嚻嚽\",12,\"囋\",8,\"囕囖囘囙囜団囥\",5,\"囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國\",6],[\"8840\",\"園\",9,\"圝圞圠圡圢圤圥圦圧圫圱圲圴\",4,\"圼圽圿坁坃坄坅坆坈坉坋坒\",4,\"坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀\"],[\"8880\",\"垁垇垈垉垊垍\",4,\"垔\",6,\"垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹\",8,\"埄\",6,\"埌埍埐埑埓埖埗埛埜埞埡埢埣埥\",7,\"埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥\",4,\"堫\",4,\"報堲堳場堶\",7],[\"8940\",\"堾\",5,\"塅\",6,\"塎塏塐塒塓塕塖塗塙\",4,\"塟\",5,\"塦\",4,\"塭\",16,\"塿墂墄墆墇墈墊墋墌\"],[\"8980\",\"墍\",4,\"墔\",4,\"墛墜墝墠\",7,\"墪\",17,\"墽墾墿壀壂壃壄壆\",10,\"壒壓壔壖\",13,\"壥\",5,\"壭壯壱売壴壵壷壸壺\",7,\"夃夅夆夈\",4,\"夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻\"],[\"8a40\",\"夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛\",4,\"奡奣奤奦\",12,\"奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦\"],[\"8a80\",\"妧妬妭妰妱妳\",5,\"妺妼妽妿\",6,\"姇姈姉姌姍姎姏姕姖姙姛姞\",4,\"姤姦姧姩姪姫姭\",11,\"姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪\",6,\"娳娵娷\",4,\"娽娾娿婁\",4,\"婇婈婋\",9,\"婖婗婘婙婛\",5],[\"8b40\",\"婡婣婤婥婦婨婩婫\",8,\"婸婹婻婼婽婾媀\",17,\"媓\",6,\"媜\",13,\"媫媬\"],[\"8b80\",\"媭\",4,\"媴媶媷媹\",4,\"媿嫀嫃\",5,\"嫊嫋嫍\",4,\"嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬\",4,\"嫲\",22,\"嬊\",11,\"嬘\",25,\"嬳嬵嬶嬸\",7,\"孁\",6],[\"8c40\",\"孈\",7,\"孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏\"],[\"8c80\",\"寑寔\",8,\"寠寢寣實寧審\",4,\"寯寱\",6,\"寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧\",6,\"屰屲\",6,\"屻屼屽屾岀岃\",4,\"岉岊岋岎岏岒岓岕岝\",4,\"岤\",4],[\"8d40\",\"岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅\",5,\"峌\",5,\"峓\",5,\"峚\",6,\"峢峣峧峩峫峬峮峯峱\",9,\"峼\",4],[\"8d80\",\"崁崄崅崈\",5,\"崏\",4,\"崕崗崘崙崚崜崝崟\",4,\"崥崨崪崫崬崯\",4,\"崵\",7,\"崿\",7,\"嵈嵉嵍\",10,\"嵙嵚嵜嵞\",10,\"嵪嵭嵮嵰嵱嵲嵳嵵\",12,\"嶃\",21,\"嶚嶛嶜嶞嶟嶠\"],[\"8e40\",\"嶡\",21,\"嶸\",12,\"巆\",6,\"巎\",12,\"巜巟巠巣巤巪巬巭\"],[\"8e80\",\"巰巵巶巸\",4,\"巿帀帄帇帉帊帋帍帎帒帓帗帞\",7,\"帨\",4,\"帯帰帲\",4,\"帹帺帾帿幀幁幃幆\",5,\"幍\",6,\"幖\",4,\"幜幝幟幠幣\",14,\"幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨\",4,\"庮\",4,\"庴庺庻庼庽庿\",6],[\"8f40\",\"廆廇廈廋\",5,\"廔廕廗廘廙廚廜\",11,\"廩廫\",8,\"廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤\"],[\"8f80\",\"弨弫弬弮弰弲\",6,\"弻弽弾弿彁\",14,\"彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢\",5,\"復徫徬徯\",5,\"徶徸徹徺徻徾\",4,\"忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇\"],[\"9040\",\"怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰\",4,\"怶\",4,\"怽怾恀恄\",6,\"恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀\"],[\"9080\",\"悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽\",7,\"惇惈惉惌\",4,\"惒惓惔惖惗惙惛惞惡\",4,\"惪惱惲惵惷惸惻\",4,\"愂愃愄愅愇愊愋愌愐\",4,\"愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬\",18,\"慀\",6],[\"9140\",\"慇慉態慍慏慐慒慓慔慖\",6,\"慞慟慠慡慣慤慥慦慩\",6,\"慱慲慳慴慶慸\",18,\"憌憍憏\",4,\"憕\"],[\"9180\",\"憖\",6,\"憞\",8,\"憪憫憭\",9,\"憸\",5,\"憿懀懁懃\",4,\"應懌\",4,\"懓懕\",16,\"懧\",13,\"懶\",8,\"戀\",5,\"戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸\",4,\"扂扄扅扆扊\"],[\"9240\",\"扏扐払扖扗扙扚扜\",6,\"扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋\",5,\"抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁\"],[\"9280\",\"拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳\",5,\"挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖\",7,\"捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙\",6,\"採掤掦掫掯掱掲掵掶掹掻掽掿揀\"],[\"9340\",\"揁揂揃揅揇揈揊揋揌揑揓揔揕揗\",6,\"揟揢揤\",4,\"揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆\",4,\"損搎搑搒搕\",5,\"搝搟搢搣搤\"],[\"9380\",\"搥搧搨搩搫搮\",5,\"搵\",4,\"搻搼搾摀摂摃摉摋\",6,\"摓摕摖摗摙\",4,\"摟\",7,\"摨摪摫摬摮\",9,\"摻\",6,\"撃撆撈\",8,\"撓撔撗撘撚撛撜撝撟\",4,\"撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆\",6,\"擏擑擓擔擕擖擙據\"],[\"9440\",\"擛擜擝擟擠擡擣擥擧\",24,\"攁\",7,\"攊\",7,\"攓\",4,\"攙\",8],[\"9480\",\"攢攣攤攦\",4,\"攬攭攰攱攲攳攷攺攼攽敀\",4,\"敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數\",14,\"斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱\",7,\"斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘\",7,\"旡旣旤旪旫\"],[\"9540\",\"旲旳旴旵旸旹旻\",4,\"昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷\",4,\"昽昿晀時晄\",6,\"晍晎晐晑晘\"],[\"9580\",\"晙晛晜晝晞晠晢晣晥晧晩\",4,\"晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘\",4,\"暞\",8,\"暩\",4,\"暯\",4,\"暵暶暷暸暺暻暼暽暿\",25,\"曚曞\",7,\"曧曨曪\",5,\"曱曵曶書曺曻曽朁朂會\"],[\"9640\",\"朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠\",5,\"朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗\",4,\"杝杢杣杤杦杧杫杬杮東杴杶\"],[\"9680\",\"杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹\",7,\"柂柅\",9,\"柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵\",7,\"柾栁栂栃栄栆栍栐栒栔栕栘\",4,\"栞栟栠栢\",6,\"栫\",6,\"栴栵栶栺栻栿桇桋桍桏桒桖\",5],[\"9740\",\"桜桝桞桟桪桬\",7,\"桵桸\",8,\"梂梄梇\",7,\"梐梑梒梔梕梖梘\",9,\"梣梤梥梩梪梫梬梮梱梲梴梶梷梸\"],[\"9780\",\"梹\",6,\"棁棃\",5,\"棊棌棎棏棐棑棓棔棖棗棙棛\",4,\"棡棢棤\",9,\"棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆\",4,\"椌椏椑椓\",11,\"椡椢椣椥\",7,\"椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃\",16,\"楕楖楘楙楛楜楟\"],[\"9840\",\"楡楢楤楥楧楨楩楪楬業楯楰楲\",4,\"楺楻楽楾楿榁榃榅榊榋榌榎\",5,\"榖榗榙榚榝\",9,\"榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽\"],[\"9880\",\"榾榿槀槂\",7,\"構槍槏槑槒槓槕\",5,\"槜槝槞槡\",11,\"槮槯槰槱槳\",9,\"槾樀\",9,\"樋\",11,\"標\",5,\"樠樢\",5,\"権樫樬樭樮樰樲樳樴樶\",6,\"樿\",4,\"橅橆橈\",7,\"橑\",6,\"橚\"],[\"9940\",\"橜\",4,\"橢橣橤橦\",10,\"橲\",6,\"橺橻橽橾橿檁檂檃檅\",8,\"檏檒\",4,\"檘\",7,\"檡\",5],[\"9980\",\"檧檨檪檭\",114,\"欥欦欨\",6],[\"9a40\",\"欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍\",11,\"歚\",7,\"歨歩歫\",13,\"歺歽歾歿殀殅殈\"],[\"9a80\",\"殌殎殏殐殑殔殕殗殘殙殜\",4,\"殢\",7,\"殫\",7,\"殶殸\",6,\"毀毃毄毆\",4,\"毌毎毐毑毘毚毜\",4,\"毢\",7,\"毬毭毮毰毱毲毴毶毷毸毺毻毼毾\",6,\"氈\",4,\"氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋\",4,\"汑汒汓汖汘\"],[\"9b40\",\"汙汚汢汣汥汦汧汫\",4,\"汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘\"],[\"9b80\",\"泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟\",5,\"洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽\",4,\"涃涄涆涇涊涋涍涏涐涒涖\",4,\"涜涢涥涬涭涰涱涳涴涶涷涹\",5,\"淁淂淃淈淉淊\"],[\"9c40\",\"淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽\",7,\"渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵\"],[\"9c80\",\"渶渷渹渻\",7,\"湅\",7,\"湏湐湑湒湕湗湙湚湜湝湞湠\",10,\"湬湭湯\",14,\"満溁溂溄溇溈溊\",4,\"溑\",6,\"溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪\",5],[\"9d40\",\"滰滱滲滳滵滶滷滸滺\",7,\"漃漄漅漇漈漊\",4,\"漐漑漒漖\",9,\"漡漢漣漥漦漧漨漬漮漰漲漴漵漷\",6,\"漿潀潁潂\"],[\"9d80\",\"潃潄潅潈潉潊潌潎\",9,\"潙潚潛潝潟潠潡潣潤潥潧\",5,\"潯潰潱潳潵潶潷潹潻潽\",6,\"澅澆澇澊澋澏\",12,\"澝澞澟澠澢\",4,\"澨\",10,\"澴澵澷澸澺\",5,\"濁濃\",5,\"濊\",6,\"濓\",10,\"濟濢濣濤濥\"],[\"9e40\",\"濦\",7,\"濰\",32,\"瀒\",7,\"瀜\",6,\"瀤\",6],[\"9e80\",\"瀫\",9,\"瀶瀷瀸瀺\",17,\"灍灎灐\",13,\"灟\",11,\"灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞\",12,\"炰炲炴炵炶為炾炿烄烅烆烇烉烋\",12,\"烚\"],[\"9f40\",\"烜烝烞烠烡烢烣烥烪烮烰\",6,\"烸烺烻烼烾\",10,\"焋\",4,\"焑焒焔焗焛\",10,\"焧\",7,\"焲焳焴\"],[\"9f80\",\"焵焷\",13,\"煆煇煈煉煋煍煏\",12,\"煝煟\",4,\"煥煩\",4,\"煯煰煱煴煵煶煷煹煻煼煾\",5,\"熅\",4,\"熋熌熍熎熐熑熒熓熕熖熗熚\",4,\"熡\",6,\"熩熪熫熭\",5,\"熴熶熷熸熺\",8,\"燄\",9,\"燏\",4],[\"a040\",\"燖\",9,\"燡燢燣燤燦燨\",5,\"燯\",9,\"燺\",11,\"爇\",19],[\"a080\",\"爛爜爞\",9,\"爩爫爭爮爯爲爳爴爺爼爾牀\",6,\"牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅\",4,\"犌犎犐犑犓\",11,\"犠\",11,\"犮犱犲犳犵犺\",6,\"狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛\"],[\"a1a1\",\"　、。·ˉˇ¨〃々—～‖…‘’“”〔〕〈\",7,\"〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃＄¤￠￡‰§№☆★○●◎◇◆□■△▲※→←↑↓〓\"],[\"a2a1\",\"ⅰ\",9],[\"a2b1\",\"⒈\",19,\"⑴\",19,\"①\",9],[\"a2e5\",\"㈠\",9],[\"a2f1\",\"Ⅰ\",11],[\"a3a1\",\"！＂＃￥％\",88,\"￣\"],[\"a4a1\",\"ぁ\",82],[\"a5a1\",\"ァ\",85],[\"a6a1\",\"Α\",16,\"Σ\",6],[\"a6c1\",\"α\",16,\"σ\",6],[\"a6e0\",\"︵︶︹︺︿﹀︽︾﹁﹂﹃﹄\"],[\"a6ee\",\"︻︼︷︸︱\"],[\"a6f4\",\"︳︴\"],[\"a7a1\",\"А\",5,\"ЁЖ\",25],[\"a7d1\",\"а\",5,\"ёж\",25],[\"a840\",\"ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═\",35,\"▁\",6],[\"a880\",\"█\",7,\"▓▔▕▼▽◢◣◤◥☉⊕〒〝〞\"],[\"a8a1\",\"āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ\"],[\"a8bd\",\"ńň\"],[\"a8c0\",\"ɡ\"],[\"a8c5\",\"ㄅ\",36],[\"a940\",\"〡\",8,\"㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰￢￤\"],[\"a959\",\"℡㈱\"],[\"a95c\",\"‐\"],[\"a960\",\"ー゛゜ヽヾ〆ゝゞ﹉\",9,\"﹔﹕﹖﹗﹙\",8],[\"a980\",\"﹢\",4,\"﹨﹩﹪﹫\"],[\"a996\",\"〇\"],[\"a9a4\",\"─\",75],[\"aa40\",\"狜狝狟狢\",5,\"狪狫狵狶狹狽狾狿猀猂猄\",5,\"猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀\",8],[\"aa80\",\"獉獊獋獌獎獏獑獓獔獕獖獘\",7,\"獡\",10,\"獮獰獱\"],[\"ab40\",\"獲\",11,\"獿\",4,\"玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣\",5,\"玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃\",4],[\"ab80\",\"珋珌珎珒\",6,\"珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳\",4],[\"ac40\",\"珸\",10,\"琄琇琈琋琌琍琎琑\",8,\"琜\",5,\"琣琤琧琩琫琭琯琱琲琷\",4,\"琽琾琿瑀瑂\",11],[\"ac80\",\"瑎\",6,\"瑖瑘瑝瑠\",12,\"瑮瑯瑱\",4,\"瑸瑹瑺\"],[\"ad40\",\"瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑\",10,\"璝璟\",7,\"璪\",15,\"璻\",12],[\"ad80\",\"瓈\",9,\"瓓\",8,\"瓝瓟瓡瓥瓧\",6,\"瓰瓱瓲\"],[\"ae40\",\"瓳瓵瓸\",6,\"甀甁甂甃甅\",7,\"甎甐甒甔甕甖甗甛甝甞甠\",4,\"甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘\"],[\"ae80\",\"畝\",7,\"畧畨畩畫\",6,\"畳畵當畷畺\",4,\"疀疁疂疄疅疇\"],[\"af40\",\"疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦\",4,\"疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇\"],[\"af80\",\"瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄\"],[\"b040\",\"癅\",6,\"癎\",5,\"癕癗\",4,\"癝癟癠癡癢癤\",6,\"癬癭癮癰\",7,\"癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛\"],[\"b080\",\"皜\",7,\"皥\",8,\"皯皰皳皵\",9,\"盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥\"],[\"b140\",\"盄盇盉盋盌盓盕盙盚盜盝盞盠\",4,\"盦\",7,\"盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎\",10,\"眛眜眝眞眡眣眤眥眧眪眫\"],[\"b180\",\"眬眮眰\",4,\"眹眻眽眾眿睂睄睅睆睈\",7,\"睒\",7,\"睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳\"],[\"b240\",\"睝睞睟睠睤睧睩睪睭\",11,\"睺睻睼瞁瞂瞃瞆\",5,\"瞏瞐瞓\",11,\"瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶\",4],[\"b280\",\"瞼瞾矀\",12,\"矎\",8,\"矘矙矚矝\",4,\"矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖\"],[\"b340\",\"矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃\",5,\"砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚\"],[\"b380\",\"硛硜硞\",11,\"硯\",7,\"硸硹硺硻硽\",6,\"场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚\"],[\"b440\",\"碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨\",7,\"碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚\",9],[\"b480\",\"磤磥磦磧磩磪磫磭\",4,\"磳磵磶磸磹磻\",5,\"礂礃礄礆\",6,\"础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮\"],[\"b540\",\"礍\",5,\"礔\",9,\"礟\",4,\"礥\",14,\"礵\",4,\"礽礿祂祃祄祅祇祊\",8,\"祔祕祘祙祡祣\"],[\"b580\",\"祤祦祩祪祫祬祮祰\",6,\"祹祻\",4,\"禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠\"],[\"b640\",\"禓\",6,\"禛\",11,\"禨\",10,\"禴\",4,\"禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙\",5,\"秠秡秢秥秨秪\"],[\"b680\",\"秬秮秱\",6,\"秹秺秼秾秿稁稄稅稇稈稉稊稌稏\",4,\"稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二\"],[\"b740\",\"稝稟稡稢稤\",14,\"稴稵稶稸稺稾穀\",5,\"穇\",9,\"穒\",4,\"穘\",16],[\"b780\",\"穩\",6,\"穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服\"],[\"b840\",\"窣窤窧窩窪窫窮\",4,\"窴\",10,\"竀\",10,\"竌\",9,\"竗竘竚竛竜竝竡竢竤竧\",5,\"竮竰竱竲竳\"],[\"b880\",\"竴\",4,\"竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹\"],[\"b940\",\"笯笰笲笴笵笶笷笹笻笽笿\",5,\"筆筈筊筍筎筓筕筗筙筜筞筟筡筣\",10,\"筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆\",6,\"箎箏\"],[\"b980\",\"箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹\",7,\"篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈\"],[\"ba40\",\"篅篈築篊篋篍篎篏篐篒篔\",4,\"篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲\",4,\"篸篹篺篻篽篿\",7,\"簈簉簊簍簎簐\",5,\"簗簘簙\"],[\"ba80\",\"簚\",4,\"簠\",5,\"簨簩簫\",12,\"簹\",5,\"籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖\"],[\"bb40\",\"籃\",9,\"籎\",36,\"籵\",5,\"籾\",9],[\"bb80\",\"粈粊\",6,\"粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴\",4,\"粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕\"],[\"bc40\",\"粿糀糂糃糄糆糉糋糎\",6,\"糘糚糛糝糞糡\",6,\"糩\",5,\"糰\",7,\"糹糺糼\",13,\"紋\",5],[\"bc80\",\"紑\",14,\"紡紣紤紥紦紨紩紪紬紭紮細\",6,\"肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件\"],[\"bd40\",\"紷\",54,\"絯\",7],[\"bd80\",\"絸\",32,\"健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸\"],[\"be40\",\"継\",12,\"綧\",6,\"綯\",42],[\"be80\",\"線\",32,\"尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻\"],[\"bf40\",\"緻\",62],[\"bf80\",\"縺縼\",4,\"繂\",4,\"繈\",21,\"俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀\"],[\"c040\",\"繞\",35,\"纃\",23,\"纜纝纞\"],[\"c080\",\"纮纴纻纼绖绤绬绹缊缐缞缷缹缻\",6,\"罃罆\",9,\"罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐\"],[\"c140\",\"罖罙罛罜罝罞罠罣\",4,\"罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂\",7,\"羋羍羏\",4,\"羕\",4,\"羛羜羠羢羣羥羦羨\",6,\"羱\"],[\"c180\",\"羳\",4,\"羺羻羾翀翂翃翄翆翇翈翉翋翍翏\",4,\"翖翗翙\",5,\"翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿\"],[\"c240\",\"翤翧翨翪翫翬翭翯翲翴\",6,\"翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫\",5,\"耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗\"],[\"c280\",\"聙聛\",13,\"聫\",5,\"聲\",11,\"隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫\"],[\"c340\",\"聾肁肂肅肈肊肍\",5,\"肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇\",4,\"胏\",6,\"胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋\"],[\"c380\",\"脌脕脗脙脛脜脝脟\",12,\"脭脮脰脳脴脵脷脹\",4,\"脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸\"],[\"c440\",\"腀\",5,\"腇腉腍腎腏腒腖腗腘腛\",4,\"腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃\",4,\"膉膋膌膍膎膐膒\",5,\"膙膚膞\",4,\"膤膥\"],[\"c480\",\"膧膩膫\",7,\"膴\",5,\"膼膽膾膿臄臅臇臈臉臋臍\",6,\"摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁\"],[\"c540\",\"臔\",14,\"臤臥臦臨臩臫臮\",4,\"臵\",5,\"臽臿舃與\",4,\"舎舏舑舓舕\",5,\"舝舠舤舥舦舧舩舮舲舺舼舽舿\"],[\"c580\",\"艀艁艂艃艅艆艈艊艌艍艎艐\",7,\"艙艛艜艝艞艠\",7,\"艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗\"],[\"c640\",\"艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸\"],[\"c680\",\"苺苼\",4,\"茊茋茍茐茒茓茖茘茙茝\",9,\"茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐\"],[\"c740\",\"茾茿荁荂荄荅荈荊\",4,\"荓荕\",4,\"荝荢荰\",6,\"荹荺荾\",6,\"莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡\",6,\"莬莭莮\"],[\"c780\",\"莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠\"],[\"c840\",\"菮華菳\",4,\"菺菻菼菾菿萀萂萅萇萈萉萊萐萒\",5,\"萙萚萛萞\",5,\"萩\",7,\"萲\",5,\"萹萺萻萾\",7,\"葇葈葉\"],[\"c880\",\"葊\",6,\"葒\",4,\"葘葝葞葟葠葢葤\",4,\"葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁\"],[\"c940\",\"葽\",4,\"蒃蒄蒅蒆蒊蒍蒏\",7,\"蒘蒚蒛蒝蒞蒟蒠蒢\",12,\"蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗\"],[\"c980\",\"蓘\",4,\"蓞蓡蓢蓤蓧\",4,\"蓭蓮蓯蓱\",10,\"蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳\"],[\"ca40\",\"蔃\",8,\"蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢\",8,\"蔭\",9,\"蔾\",4,\"蕄蕅蕆蕇蕋\",10],[\"ca80\",\"蕗蕘蕚蕛蕜蕝蕟\",4,\"蕥蕦蕧蕩\",8,\"蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱\"],[\"cb40\",\"薂薃薆薈\",6,\"薐\",10,\"薝\",6,\"薥薦薧薩薫薬薭薱\",5,\"薸薺\",6,\"藂\",6,\"藊\",4,\"藑藒\"],[\"cb80\",\"藔藖\",5,\"藝\",6,\"藥藦藧藨藪\",14,\"恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔\"],[\"cc40\",\"藹藺藼藽藾蘀\",4,\"蘆\",10,\"蘒蘓蘔蘕蘗\",15,\"蘨蘪\",13,\"蘹蘺蘻蘽蘾蘿虀\"],[\"cc80\",\"虁\",11,\"虒虓處\",4,\"虛虜虝號虠虡虣\",7,\"獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃\"],[\"cd40\",\"虭虯虰虲\",6,\"蚃\",6,\"蚎\",4,\"蚔蚖\",5,\"蚞\",4,\"蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻\",4,\"蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜\"],[\"cd80\",\"蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威\"],[\"ce40\",\"蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀\",6,\"蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚\",5,\"蝡蝢蝦\",7,\"蝯蝱蝲蝳蝵\"],[\"ce80\",\"蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎\",4,\"螔螕螖螘\",6,\"螠\",4,\"巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺\"],[\"cf40\",\"螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁\",4,\"蟇蟈蟉蟌\",4,\"蟔\",6,\"蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯\",9],[\"cf80\",\"蟺蟻蟼蟽蟿蠀蠁蠂蠄\",5,\"蠋\",7,\"蠔蠗蠘蠙蠚蠜\",4,\"蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓\"],[\"d040\",\"蠤\",13,\"蠳\",5,\"蠺蠻蠽蠾蠿衁衂衃衆\",5,\"衎\",5,\"衕衖衘衚\",6,\"衦衧衪衭衯衱衳衴衵衶衸衹衺\"],[\"d080\",\"衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗\",4,\"袝\",4,\"袣袥\",5,\"小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄\"],[\"d140\",\"袬袮袯袰袲\",4,\"袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚\",4,\"裠裡裦裧裩\",6,\"裲裵裶裷裺裻製裿褀褁褃\",5],[\"d180\",\"褉褋\",4,\"褑褔\",4,\"褜\",4,\"褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶\"],[\"d240\",\"褸\",8,\"襂襃襅\",24,\"襠\",5,\"襧\",19,\"襼\"],[\"d280\",\"襽襾覀覂覄覅覇\",26,\"摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐\"],[\"d340\",\"覢\",30,\"觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴\",6],[\"d380\",\"觻\",4,\"訁\",5,\"計\",21,\"印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉\"],[\"d440\",\"訞\",31,\"訿\",8,\"詉\",21],[\"d480\",\"詟\",25,\"詺\",6,\"浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧\"],[\"d540\",\"誁\",7,\"誋\",7,\"誔\",46],[\"d580\",\"諃\",32,\"铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政\"],[\"d640\",\"諤\",34,\"謈\",27],[\"d680\",\"謤謥謧\",30,\"帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑\"],[\"d740\",\"譆\",31,\"譧\",4,\"譭\",25],[\"d780\",\"讇\",24,\"讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座\"],[\"d840\",\"谸\",8,\"豂豃豄豅豈豊豋豍\",7,\"豖豗豘豙豛\",5,\"豣\",6,\"豬\",6,\"豴豵豶豷豻\",6,\"貃貄貆貇\"],[\"d880\",\"貈貋貍\",6,\"貕貖貗貙\",20,\"亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝\"],[\"d940\",\"貮\",62],[\"d980\",\"賭\",32,\"佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼\"],[\"da40\",\"贎\",14,\"贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸\",8,\"趂趃趆趇趈趉趌\",4,\"趒趓趕\",9,\"趠趡\"],[\"da80\",\"趢趤\",12,\"趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺\"],[\"db40\",\"跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾\",6,\"踆踇踈踋踍踎踐踑踒踓踕\",7,\"踠踡踤\",4,\"踫踭踰踲踳踴踶踷踸踻踼踾\"],[\"db80\",\"踿蹃蹅蹆蹌\",4,\"蹓\",5,\"蹚\",11,\"蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝\"],[\"dc40\",\"蹳蹵蹷\",4,\"蹽蹾躀躂躃躄躆躈\",6,\"躑躒躓躕\",6,\"躝躟\",11,\"躭躮躰躱躳\",6,\"躻\",7],[\"dc80\",\"軃\",10,\"軏\",21,\"堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥\"],[\"dd40\",\"軥\",62],[\"dd80\",\"輤\",32,\"荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺\"],[\"de40\",\"轅\",32,\"轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆\"],[\"de80\",\"迉\",4,\"迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖\"],[\"df40\",\"這逜連逤逥逧\",5,\"逰\",4,\"逷逹逺逽逿遀遃遅遆遈\",4,\"過達違遖遙遚遜\",5,\"遤遦遧適遪遫遬遯\",4,\"遶\",6,\"遾邁\"],[\"df80\",\"還邅邆邇邉邊邌\",4,\"邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼\"],[\"e040\",\"郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅\",19,\"鄚鄛鄜\"],[\"e080\",\"鄝鄟鄠鄡鄤\",10,\"鄰鄲\",6,\"鄺\",8,\"酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼\"],[\"e140\",\"酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀\",4,\"醆醈醊醎醏醓\",6,\"醜\",5,\"醤\",5,\"醫醬醰醱醲醳醶醷醸醹醻\"],[\"e180\",\"醼\",10,\"釈釋釐釒\",9,\"針\",8,\"帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺\"],[\"e240\",\"釦\",62],[\"e280\",\"鈥\",32,\"狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧\",5,\"饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂\"],[\"e340\",\"鉆\",45,\"鉵\",16],[\"e380\",\"銆\",7,\"銏\",24,\"恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾\"],[\"e440\",\"銨\",5,\"銯\",24,\"鋉\",31],[\"e480\",\"鋩\",32,\"洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑\"],[\"e540\",\"錊\",51,\"錿\",10],[\"e580\",\"鍊\",31,\"鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣\"],[\"e640\",\"鍬\",34,\"鎐\",27],[\"e680\",\"鎬\",29,\"鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩\"],[\"e740\",\"鏎\",7,\"鏗\",54],[\"e780\",\"鐎\",32,\"纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡\",6,\"缪缫缬缭缯\",4,\"缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬\"],[\"e840\",\"鐯\",14,\"鐿\",43,\"鑬鑭鑮鑯\"],[\"e880\",\"鑰\",20,\"钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹\"],[\"e940\",\"锧锳锽镃镈镋镕镚镠镮镴镵長\",7,\"門\",42],[\"e980\",\"閫\",32,\"椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋\"],[\"ea40\",\"闌\",27,\"闬闿阇阓阘阛阞阠阣\",6,\"阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗\"],[\"ea80\",\"陘陙陚陜陝陞陠陣陥陦陫陭\",4,\"陳陸\",12,\"隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰\"],[\"eb40\",\"隌階隑隒隓隕隖隚際隝\",9,\"隨\",7,\"隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖\",9,\"雡\",6,\"雫\"],[\"eb80\",\"雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗\",4,\"霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻\"],[\"ec40\",\"霡\",8,\"霫霬霮霯霱霳\",4,\"霺霻霼霽霿\",18,\"靔靕靗靘靚靜靝靟靣靤靦靧靨靪\",7],[\"ec80\",\"靲靵靷\",4,\"靽\",7,\"鞆\",4,\"鞌鞎鞏鞐鞓鞕鞖鞗鞙\",4,\"臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐\"],[\"ed40\",\"鞞鞟鞡鞢鞤\",6,\"鞬鞮鞰鞱鞳鞵\",46],[\"ed80\",\"韤韥韨韮\",4,\"韴韷\",23,\"怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨\"],[\"ee40\",\"頏\",62],[\"ee80\",\"顎\",32,\"睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶\",4,\"钼钽钿铄铈\",6,\"铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪\"],[\"ef40\",\"顯\",5,\"颋颎颒颕颙颣風\",37,\"飏飐飔飖飗飛飜飝飠\",4],[\"ef80\",\"飥飦飩\",30,\"铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒\",4,\"锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤\",8,\"镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔\"],[\"f040\",\"餈\",4,\"餎餏餑\",28,\"餯\",26],[\"f080\",\"饊\",9,\"饖\",12,\"饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨\",4,\"鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦\",6,\"鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙\"],[\"f140\",\"馌馎馚\",10,\"馦馧馩\",47],[\"f180\",\"駙\",32,\"瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃\"],[\"f240\",\"駺\",62],[\"f280\",\"騹\",32,\"颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒\"],[\"f340\",\"驚\",17,\"驲骃骉骍骎骔骕骙骦骩\",6,\"骲骳骴骵骹骻骽骾骿髃髄髆\",4,\"髍髎髏髐髒體髕髖髗髙髚髛髜\"],[\"f380\",\"髝髞髠髢髣髤髥髧髨髩髪髬髮髰\",8,\"髺髼\",6,\"鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋\"],[\"f440\",\"鬇鬉\",5,\"鬐鬑鬒鬔\",10,\"鬠鬡鬢鬤\",10,\"鬰鬱鬳\",7,\"鬽鬾鬿魀魆魊魋魌魎魐魒魓魕\",5],[\"f480\",\"魛\",32,\"簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤\"],[\"f540\",\"魼\",62],[\"f580\",\"鮻\",32,\"酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜\"],[\"f640\",\"鯜\",62],[\"f680\",\"鰛\",32,\"觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅\",5,\"龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞\",5,\"鲥\",4,\"鲫鲭鲮鲰\",7,\"鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋\"],[\"f740\",\"鰼\",62],[\"f780\",\"鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾\",4,\"鳈鳉鳑鳒鳚鳛鳠鳡鳌\",4,\"鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄\"],[\"f840\",\"鳣\",62],[\"f880\",\"鴢\",32],[\"f940\",\"鵃\",62],[\"f980\",\"鶂\",32],[\"fa40\",\"鶣\",62],[\"fa80\",\"鷢\",32],[\"fb40\",\"鸃\",27,\"鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴\",9,\"麀\"],[\"fb80\",\"麁麃麄麅麆麉麊麌\",5,\"麔\",8,\"麞麠\",5,\"麧麨麩麪\"],[\"fc40\",\"麫\",8,\"麵麶麷麹麺麼麿\",4,\"黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰\",8,\"黺黽黿\",6],[\"fc80\",\"鼆\",4,\"鼌鼏鼑鼒鼔鼕鼖鼘鼚\",5,\"鼡鼣\",8,\"鼭鼮鼰鼱\"],[\"fd40\",\"鼲\",4,\"鼸鼺鼼鼿\",4,\"齅\",10,\"齒\",38],[\"fd80\",\"齹\",5,\"龁龂龍\",11,\"龜龝龞龡\",4,\"郎凉秊裏隣\"],[\"fe40\",\"兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩\"]]\n\n/***/ }),\n/* 278 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// @flow\n\n/*::\ndeclare var __webpack_require__: mixed;\n*/\n\nmodule.exports = typeof __webpack_require__ !== \"undefined\";\n\n\n/***/ }),\n/* 279 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n\nvar yaml = __webpack_require__(280);\n\n\nmodule.exports = yaml;\n\n\n/***/ }),\n/* 280 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n\nvar loader = __webpack_require__(282);\nvar dumper = __webpack_require__(281);\n\n\nfunction deprecated(name) {\n  return function () {\n    throw new Error('Function ' + name + ' is deprecated and cannot be used.');\n  };\n}\n\n\nmodule.exports.Type                = __webpack_require__(10);\nmodule.exports.Schema              = __webpack_require__(45);\nmodule.exports.FAILSAFE_SCHEMA     = __webpack_require__(100);\nmodule.exports.JSON_SCHEMA         = __webpack_require__(145);\nmodule.exports.CORE_SCHEMA         = __webpack_require__(144);\nmodule.exports.DEFAULT_SAFE_SCHEMA = __webpack_require__(56);\nmodule.exports.DEFAULT_FULL_SCHEMA = __webpack_require__(73);\nmodule.exports.load                = loader.load;\nmodule.exports.loadAll             = loader.loadAll;\nmodule.exports.safeLoad            = loader.safeLoad;\nmodule.exports.safeLoadAll         = loader.safeLoadAll;\nmodule.exports.dump                = dumper.dump;\nmodule.exports.safeDump            = dumper.safeDump;\nmodule.exports.YAMLException       = __webpack_require__(55);\n\n// Deprecated schema names from JS-YAML 2.0.x\nmodule.exports.MINIMAL_SCHEMA = __webpack_require__(100);\nmodule.exports.SAFE_SCHEMA    = __webpack_require__(56);\nmodule.exports.DEFAULT_SCHEMA = __webpack_require__(73);\n\n// Deprecated functions from JS-YAML 1.x.x\nmodule.exports.scan           = deprecated('scan');\nmodule.exports.parse          = deprecated('parse');\nmodule.exports.compose        = deprecated('compose');\nmodule.exports.addConstructor = deprecated('addConstructor');\n\n\n/***/ }),\n/* 281 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/*eslint-disable no-use-before-define*/\n\nvar common              = __webpack_require__(44);\nvar YAMLException       = __webpack_require__(55);\nvar DEFAULT_FULL_SCHEMA = __webpack_require__(73);\nvar DEFAULT_SAFE_SCHEMA = __webpack_require__(56);\n\nvar _toString       = Object.prototype.toString;\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar CHAR_TAB                  = 0x09; /* Tab */\nvar CHAR_LINE_FEED            = 0x0A; /* LF */\nvar CHAR_SPACE                = 0x20; /* Space */\nvar CHAR_EXCLAMATION          = 0x21; /* ! */\nvar CHAR_DOUBLE_QUOTE         = 0x22; /* \" */\nvar CHAR_SHARP                = 0x23; /* # */\nvar CHAR_PERCENT              = 0x25; /* % */\nvar CHAR_AMPERSAND            = 0x26; /* & */\nvar CHAR_SINGLE_QUOTE         = 0x27; /* ' */\nvar CHAR_ASTERISK             = 0x2A; /* * */\nvar CHAR_COMMA                = 0x2C; /* , */\nvar CHAR_MINUS                = 0x2D; /* - */\nvar CHAR_COLON                = 0x3A; /* : */\nvar CHAR_GREATER_THAN         = 0x3E; /* > */\nvar CHAR_QUESTION             = 0x3F; /* ? */\nvar CHAR_COMMERCIAL_AT        = 0x40; /* @ */\nvar CHAR_LEFT_SQUARE_BRACKET  = 0x5B; /* [ */\nvar CHAR_RIGHT_SQUARE_BRACKET = 0x5D; /* ] */\nvar CHAR_GRAVE_ACCENT         = 0x60; /* ` */\nvar CHAR_LEFT_CURLY_BRACKET   = 0x7B; /* { */\nvar CHAR_VERTICAL_LINE        = 0x7C; /* | */\nvar CHAR_RIGHT_CURLY_BRACKET  = 0x7D; /* } */\n\nvar ESCAPE_SEQUENCES = {};\n\nESCAPE_SEQUENCES[0x00]   = '\\\\0';\nESCAPE_SEQUENCES[0x07]   = '\\\\a';\nESCAPE_SEQUENCES[0x08]   = '\\\\b';\nESCAPE_SEQUENCES[0x09]   = '\\\\t';\nESCAPE_SEQUENCES[0x0A]   = '\\\\n';\nESCAPE_SEQUENCES[0x0B]   = '\\\\v';\nESCAPE_SEQUENCES[0x0C]   = '\\\\f';\nESCAPE_SEQUENCES[0x0D]   = '\\\\r';\nESCAPE_SEQUENCES[0x1B]   = '\\\\e';\nESCAPE_SEQUENCES[0x22]   = '\\\\\"';\nESCAPE_SEQUENCES[0x5C]   = '\\\\\\\\';\nESCAPE_SEQUENCES[0x85]   = '\\\\N';\nESCAPE_SEQUENCES[0xA0]   = '\\\\_';\nESCAPE_SEQUENCES[0x2028] = '\\\\L';\nESCAPE_SEQUENCES[0x2029] = '\\\\P';\n\nvar DEPRECATED_BOOLEANS_SYNTAX = [\n  'y', 'Y', 'yes', 'Yes', 'YES', 'on', 'On', 'ON',\n  'n', 'N', 'no', 'No', 'NO', 'off', 'Off', 'OFF'\n];\n\nfunction compileStyleMap(schema, map) {\n  var result, keys, index, length, tag, style, type;\n\n  if (map === null) return {};\n\n  result = {};\n  keys = Object.keys(map);\n\n  for (index = 0, length = keys.length; index < length; index += 1) {\n    tag = keys[index];\n    style = String(map[tag]);\n\n    if (tag.slice(0, 2) === '!!') {\n      tag = 'tag:yaml.org,2002:' + tag.slice(2);\n    }\n    type = schema.compiledTypeMap['fallback'][tag];\n\n    if (type && _hasOwnProperty.call(type.styleAliases, style)) {\n      style = type.styleAliases[style];\n    }\n\n    result[tag] = style;\n  }\n\n  return result;\n}\n\nfunction encodeHex(character) {\n  var string, handle, length;\n\n  string = character.toString(16).toUpperCase();\n\n  if (character <= 0xFF) {\n    handle = 'x';\n    length = 2;\n  } else if (character <= 0xFFFF) {\n    handle = 'u';\n    length = 4;\n  } else if (character <= 0xFFFFFFFF) {\n    handle = 'U';\n    length = 8;\n  } else {\n    throw new YAMLException('code point within a string may not be greater than 0xFFFFFFFF');\n  }\n\n  return '\\\\' + handle + common.repeat('0', length - string.length) + string;\n}\n\nfunction State(options) {\n  this.schema        = options['schema'] || DEFAULT_FULL_SCHEMA;\n  this.indent        = Math.max(1, (options['indent'] || 2));\n  this.noArrayIndent = options['noArrayIndent'] || false;\n  this.skipInvalid   = options['skipInvalid'] || false;\n  this.flowLevel     = (common.isNothing(options['flowLevel']) ? -1 : options['flowLevel']);\n  this.styleMap      = compileStyleMap(this.schema, options['styles'] || null);\n  this.sortKeys      = options['sortKeys'] || false;\n  this.lineWidth     = options['lineWidth'] || 80;\n  this.noRefs        = options['noRefs'] || false;\n  this.noCompatMode  = options['noCompatMode'] || false;\n  this.condenseFlow  = options['condenseFlow'] || false;\n\n  this.implicitTypes = this.schema.compiledImplicit;\n  this.explicitTypes = this.schema.compiledExplicit;\n\n  this.tag = null;\n  this.result = '';\n\n  this.duplicates = [];\n  this.usedDuplicates = null;\n}\n\n// Indents every line in a string. Empty lines (\\n only) are not indented.\nfunction indentString(string, spaces) {\n  var ind = common.repeat(' ', spaces),\n      position = 0,\n      next = -1,\n      result = '',\n      line,\n      length = string.length;\n\n  while (position < length) {\n    next = string.indexOf('\\n', position);\n    if (next === -1) {\n      line = string.slice(position);\n      position = length;\n    } else {\n      line = string.slice(position, next + 1);\n      position = next + 1;\n    }\n\n    if (line.length && line !== '\\n') result += ind;\n\n    result += line;\n  }\n\n  return result;\n}\n\nfunction generateNextLine(state, level) {\n  return '\\n' + common.repeat(' ', state.indent * level);\n}\n\nfunction testImplicitResolving(state, str) {\n  var index, length, type;\n\n  for (index = 0, length = state.implicitTypes.length; index < length; index += 1) {\n    type = state.implicitTypes[index];\n\n    if (type.resolve(str)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\n// [33] s-white ::= s-space | s-tab\nfunction isWhitespace(c) {\n  return c === CHAR_SPACE || c === CHAR_TAB;\n}\n\n// Returns true if the character can be printed without escaping.\n// From YAML 1.2: \"any allowed characters known to be non-printable\n// should also be escaped. [However,] This isn’t mandatory\"\n// Derived from nb-char - \\t - #x85 - #xA0 - #x2028 - #x2029.\nfunction isPrintable(c) {\n  return  (0x00020 <= c && c <= 0x00007E)\n      || ((0x000A1 <= c && c <= 0x00D7FF) && c !== 0x2028 && c !== 0x2029)\n      || ((0x0E000 <= c && c <= 0x00FFFD) && c !== 0xFEFF /* BOM */)\n      ||  (0x10000 <= c && c <= 0x10FFFF);\n}\n\n// Simplified test for values allowed after the first character in plain style.\nfunction isPlainSafe(c) {\n  // Uses a subset of nb-char - c-flow-indicator - \":\" - \"#\"\n  // where nb-char ::= c-printable - b-char - c-byte-order-mark.\n  return isPrintable(c) && c !== 0xFEFF\n    // - c-flow-indicator\n    && c !== CHAR_COMMA\n    && c !== CHAR_LEFT_SQUARE_BRACKET\n    && c !== CHAR_RIGHT_SQUARE_BRACKET\n    && c !== CHAR_LEFT_CURLY_BRACKET\n    && c !== CHAR_RIGHT_CURLY_BRACKET\n    // - \":\" - \"#\"\n    && c !== CHAR_COLON\n    && c !== CHAR_SHARP;\n}\n\n// Simplified test for values allowed as the first character in plain style.\nfunction isPlainSafeFirst(c) {\n  // Uses a subset of ns-char - c-indicator\n  // where ns-char = nb-char - s-white.\n  return isPrintable(c) && c !== 0xFEFF\n    && !isWhitespace(c) // - s-white\n    // - (c-indicator ::=\n    // “-” | “?” | “:” | “,” | “[” | “]” | “{” | “}”\n    && c !== CHAR_MINUS\n    && c !== CHAR_QUESTION\n    && c !== CHAR_COLON\n    && c !== CHAR_COMMA\n    && c !== CHAR_LEFT_SQUARE_BRACKET\n    && c !== CHAR_RIGHT_SQUARE_BRACKET\n    && c !== CHAR_LEFT_CURLY_BRACKET\n    && c !== CHAR_RIGHT_CURLY_BRACKET\n    // | “#” | “&” | “*” | “!” | “|” | “>” | “'” | “\"”\n    && c !== CHAR_SHARP\n    && c !== CHAR_AMPERSAND\n    && c !== CHAR_ASTERISK\n    && c !== CHAR_EXCLAMATION\n    && c !== CHAR_VERTICAL_LINE\n    && c !== CHAR_GREATER_THAN\n    && c !== CHAR_SINGLE_QUOTE\n    && c !== CHAR_DOUBLE_QUOTE\n    // | “%” | “@” | “`”)\n    && c !== CHAR_PERCENT\n    && c !== CHAR_COMMERCIAL_AT\n    && c !== CHAR_GRAVE_ACCENT;\n}\n\n// Determines whether block indentation indicator is required.\nfunction needIndentIndicator(string) {\n  var leadingSpaceRe = /^\\n* /;\n  return leadingSpaceRe.test(string);\n}\n\nvar STYLE_PLAIN   = 1,\n    STYLE_SINGLE  = 2,\n    STYLE_LITERAL = 3,\n    STYLE_FOLDED  = 4,\n    STYLE_DOUBLE  = 5;\n\n// Determines which scalar styles are possible and returns the preferred style.\n// lineWidth = -1 => no limit.\n// Pre-conditions: str.length > 0.\n// Post-conditions:\n//    STYLE_PLAIN or STYLE_SINGLE => no \\n are in the string.\n//    STYLE_LITERAL => no lines are suitable for folding (or lineWidth is -1).\n//    STYLE_FOLDED => a line > lineWidth and can be folded (and lineWidth != -1).\nfunction chooseScalarStyle(string, singleLineOnly, indentPerLevel, lineWidth, testAmbiguousType) {\n  var i;\n  var char;\n  var hasLineBreak = false;\n  var hasFoldableLine = false; // only checked if shouldTrackWidth\n  var shouldTrackWidth = lineWidth !== -1;\n  var previousLineBreak = -1; // count the first line correctly\n  var plain = isPlainSafeFirst(string.charCodeAt(0))\n          && !isWhitespace(string.charCodeAt(string.length - 1));\n\n  if (singleLineOnly) {\n    // Case: no block styles.\n    // Check for disallowed characters to rule out plain and single.\n    for (i = 0; i < string.length; i++) {\n      char = string.charCodeAt(i);\n      if (!isPrintable(char)) {\n        return STYLE_DOUBLE;\n      }\n      plain = plain && isPlainSafe(char);\n    }\n  } else {\n    // Case: block styles permitted.\n    for (i = 0; i < string.length; i++) {\n      char = string.charCodeAt(i);\n      if (char === CHAR_LINE_FEED) {\n        hasLineBreak = true;\n        // Check if any line can be folded.\n        if (shouldTrackWidth) {\n          hasFoldableLine = hasFoldableLine ||\n            // Foldable line = too long, and not more-indented.\n            (i - previousLineBreak - 1 > lineWidth &&\n             string[previousLineBreak + 1] !== ' ');\n          previousLineBreak = i;\n        }\n      } else if (!isPrintable(char)) {\n        return STYLE_DOUBLE;\n      }\n      plain = plain && isPlainSafe(char);\n    }\n    // in case the end is missing a \\n\n    hasFoldableLine = hasFoldableLine || (shouldTrackWidth &&\n      (i - previousLineBreak - 1 > lineWidth &&\n       string[previousLineBreak + 1] !== ' '));\n  }\n  // Although every style can represent \\n without escaping, prefer block styles\n  // for multiline, since they're more readable and they don't add empty lines.\n  // Also prefer folding a super-long line.\n  if (!hasLineBreak && !hasFoldableLine) {\n    // Strings interpretable as another type have to be quoted;\n    // e.g. the string 'true' vs. the boolean true.\n    return plain && !testAmbiguousType(string)\n      ? STYLE_PLAIN : STYLE_SINGLE;\n  }\n  // Edge case: block indentation indicator can only have one digit.\n  if (indentPerLevel > 9 && needIndentIndicator(string)) {\n    return STYLE_DOUBLE;\n  }\n  // At this point we know block styles are valid.\n  // Prefer literal style unless we want to fold.\n  return hasFoldableLine ? STYLE_FOLDED : STYLE_LITERAL;\n}\n\n// Note: line breaking/folding is implemented for only the folded style.\n// NB. We drop the last trailing newline (if any) of a returned block scalar\n//  since the dumper adds its own newline. This always works:\n//    • No ending newline => unaffected; already using strip \"-\" chomping.\n//    • Ending newline    => removed then restored.\n//  Importantly, this keeps the \"+\" chomp indicator from gaining an extra line.\nfunction writeScalar(state, string, level, iskey) {\n  state.dump = (function () {\n    if (string.length === 0) {\n      return \"''\";\n    }\n    if (!state.noCompatMode &&\n        DEPRECATED_BOOLEANS_SYNTAX.indexOf(string) !== -1) {\n      return \"'\" + string + \"'\";\n    }\n\n    var indent = state.indent * Math.max(1, level); // no 0-indent scalars\n    // As indentation gets deeper, let the width decrease monotonically\n    // to the lower bound min(state.lineWidth, 40).\n    // Note that this implies\n    //  state.lineWidth ≤ 40 + state.indent: width is fixed at the lower bound.\n    //  state.lineWidth > 40 + state.indent: width decreases until the lower bound.\n    // This behaves better than a constant minimum width which disallows narrower options,\n    // or an indent threshold which causes the width to suddenly increase.\n    var lineWidth = state.lineWidth === -1\n      ? -1 : Math.max(Math.min(state.lineWidth, 40), state.lineWidth - indent);\n\n    // Without knowing if keys are implicit/explicit, assume implicit for safety.\n    var singleLineOnly = iskey\n      // No block styles in flow mode.\n      || (state.flowLevel > -1 && level >= state.flowLevel);\n    function testAmbiguity(string) {\n      return testImplicitResolving(state, string);\n    }\n\n    switch (chooseScalarStyle(string, singleLineOnly, state.indent, lineWidth, testAmbiguity)) {\n      case STYLE_PLAIN:\n        return string;\n      case STYLE_SINGLE:\n        return \"'\" + string.replace(/'/g, \"''\") + \"'\";\n      case STYLE_LITERAL:\n        return '|' + blockHeader(string, state.indent)\n          + dropEndingNewline(indentString(string, indent));\n      case STYLE_FOLDED:\n        return '>' + blockHeader(string, state.indent)\n          + dropEndingNewline(indentString(foldString(string, lineWidth), indent));\n      case STYLE_DOUBLE:\n        return '\"' + escapeString(string, lineWidth) + '\"';\n      default:\n        throw new YAMLException('impossible error: invalid scalar style');\n    }\n  }());\n}\n\n// Pre-conditions: string is valid for a block scalar, 1 <= indentPerLevel <= 9.\nfunction blockHeader(string, indentPerLevel) {\n  var indentIndicator = needIndentIndicator(string) ? String(indentPerLevel) : '';\n\n  // note the special case: the string '\\n' counts as a \"trailing\" empty line.\n  var clip =          string[string.length - 1] === '\\n';\n  var keep = clip && (string[string.length - 2] === '\\n' || string === '\\n');\n  var chomp = keep ? '+' : (clip ? '' : '-');\n\n  return indentIndicator + chomp + '\\n';\n}\n\n// (See the note for writeScalar.)\nfunction dropEndingNewline(string) {\n  return string[string.length - 1] === '\\n' ? string.slice(0, -1) : string;\n}\n\n// Note: a long line without a suitable break point will exceed the width limit.\n// Pre-conditions: every char in str isPrintable, str.length > 0, width > 0.\nfunction foldString(string, width) {\n  // In folded style, $k$ consecutive newlines output as $k+1$ newlines—\n  // unless they're before or after a more-indented line, or at the very\n  // beginning or end, in which case $k$ maps to $k$.\n  // Therefore, parse each chunk as newline(s) followed by a content line.\n  var lineRe = /(\\n+)([^\\n]*)/g;\n\n  // first line (possibly an empty line)\n  var result = (function () {\n    var nextLF = string.indexOf('\\n');\n    nextLF = nextLF !== -1 ? nextLF : string.length;\n    lineRe.lastIndex = nextLF;\n    return foldLine(string.slice(0, nextLF), width);\n  }());\n  // If we haven't reached the first content line yet, don't add an extra \\n.\n  var prevMoreIndented = string[0] === '\\n' || string[0] === ' ';\n  var moreIndented;\n\n  // rest of the lines\n  var match;\n  while ((match = lineRe.exec(string))) {\n    var prefix = match[1], line = match[2];\n    moreIndented = (line[0] === ' ');\n    result += prefix\n      + (!prevMoreIndented && !moreIndented && line !== ''\n        ? '\\n' : '')\n      + foldLine(line, width);\n    prevMoreIndented = moreIndented;\n  }\n\n  return result;\n}\n\n// Greedy line breaking.\n// Picks the longest line under the limit each time,\n// otherwise settles for the shortest line over the limit.\n// NB. More-indented lines *cannot* be folded, as that would add an extra \\n.\nfunction foldLine(line, width) {\n  if (line === '' || line[0] === ' ') return line;\n\n  // Since a more-indented line adds a \\n, breaks can't be followed by a space.\n  var breakRe = / [^ ]/g; // note: the match index will always be <= length-2.\n  var match;\n  // start is an inclusive index. end, curr, and next are exclusive.\n  var start = 0, end, curr = 0, next = 0;\n  var result = '';\n\n  // Invariants: 0 <= start <= length-1.\n  //   0 <= curr <= next <= max(0, length-2). curr - start <= width.\n  // Inside the loop:\n  //   A match implies length >= 2, so curr and next are <= length-2.\n  while ((match = breakRe.exec(line))) {\n    next = match.index;\n    // maintain invariant: curr - start <= width\n    if (next - start > width) {\n      end = (curr > start) ? curr : next; // derive end <= length-2\n      result += '\\n' + line.slice(start, end);\n      // skip the space that was output as \\n\n      start = end + 1;                    // derive start <= length-1\n    }\n    curr = next;\n  }\n\n  // By the invariants, start <= length-1, so there is something left over.\n  // It is either the whole string or a part starting from non-whitespace.\n  result += '\\n';\n  // Insert a break if the remainder is too long and there is a break available.\n  if (line.length - start > width && curr > start) {\n    result += line.slice(start, curr) + '\\n' + line.slice(curr + 1);\n  } else {\n    result += line.slice(start);\n  }\n\n  return result.slice(1); // drop extra \\n joiner\n}\n\n// Escapes a double-quoted string.\nfunction escapeString(string) {\n  var result = '';\n  var char, nextChar;\n  var escapeSeq;\n\n  for (var i = 0; i < string.length; i++) {\n    char = string.charCodeAt(i);\n    // Check for surrogate pairs (reference Unicode 3.0 section \"3.7 Surrogates\").\n    if (char >= 0xD800 && char <= 0xDBFF/* high surrogate */) {\n      nextChar = string.charCodeAt(i + 1);\n      if (nextChar >= 0xDC00 && nextChar <= 0xDFFF/* low surrogate */) {\n        // Combine the surrogate pair and store it escaped.\n        result += encodeHex((char - 0xD800) * 0x400 + nextChar - 0xDC00 + 0x10000);\n        // Advance index one extra since we already used that char here.\n        i++; continue;\n      }\n    }\n    escapeSeq = ESCAPE_SEQUENCES[char];\n    result += !escapeSeq && isPrintable(char)\n      ? string[i]\n      : escapeSeq || encodeHex(char);\n  }\n\n  return result;\n}\n\nfunction writeFlowSequence(state, level, object) {\n  var _result = '',\n      _tag    = state.tag,\n      index,\n      length;\n\n  for (index = 0, length = object.length; index < length; index += 1) {\n    // Write only valid elements.\n    if (writeNode(state, level, object[index], false, false)) {\n      if (index !== 0) _result += ',' + (!state.condenseFlow ? ' ' : '');\n      _result += state.dump;\n    }\n  }\n\n  state.tag = _tag;\n  state.dump = '[' + _result + ']';\n}\n\nfunction writeBlockSequence(state, level, object, compact) {\n  var _result = '',\n      _tag    = state.tag,\n      index,\n      length;\n\n  for (index = 0, length = object.length; index < length; index += 1) {\n    // Write only valid elements.\n    if (writeNode(state, level + 1, object[index], true, true)) {\n      if (!compact || index !== 0) {\n        _result += generateNextLine(state, level);\n      }\n\n      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n        _result += '-';\n      } else {\n        _result += '- ';\n      }\n\n      _result += state.dump;\n    }\n  }\n\n  state.tag = _tag;\n  state.dump = _result || '[]'; // Empty sequence if no valid values.\n}\n\nfunction writeFlowMapping(state, level, object) {\n  var _result       = '',\n      _tag          = state.tag,\n      objectKeyList = Object.keys(object),\n      index,\n      length,\n      objectKey,\n      objectValue,\n      pairBuffer;\n\n  for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n    pairBuffer = state.condenseFlow ? '\"' : '';\n\n    if (index !== 0) pairBuffer += ', ';\n\n    objectKey = objectKeyList[index];\n    objectValue = object[objectKey];\n\n    if (!writeNode(state, level, objectKey, false, false)) {\n      continue; // Skip this pair because of invalid key;\n    }\n\n    if (state.dump.length > 1024) pairBuffer += '? ';\n\n    pairBuffer += state.dump + (state.condenseFlow ? '\"' : '') + ':' + (state.condenseFlow ? '' : ' ');\n\n    if (!writeNode(state, level, objectValue, false, false)) {\n      continue; // Skip this pair because of invalid value.\n    }\n\n    pairBuffer += state.dump;\n\n    // Both key and value are valid.\n    _result += pairBuffer;\n  }\n\n  state.tag = _tag;\n  state.dump = '{' + _result + '}';\n}\n\nfunction writeBlockMapping(state, level, object, compact) {\n  var _result       = '',\n      _tag          = state.tag,\n      objectKeyList = Object.keys(object),\n      index,\n      length,\n      objectKey,\n      objectValue,\n      explicitPair,\n      pairBuffer;\n\n  // Allow sorting keys so that the output file is deterministic\n  if (state.sortKeys === true) {\n    // Default sorting\n    objectKeyList.sort();\n  } else if (typeof state.sortKeys === 'function') {\n    // Custom sort function\n    objectKeyList.sort(state.sortKeys);\n  } else if (state.sortKeys) {\n    // Something is wrong\n    throw new YAMLException('sortKeys must be a boolean or a function');\n  }\n\n  for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n    pairBuffer = '';\n\n    if (!compact || index !== 0) {\n      pairBuffer += generateNextLine(state, level);\n    }\n\n    objectKey = objectKeyList[index];\n    objectValue = object[objectKey];\n\n    if (!writeNode(state, level + 1, objectKey, true, true, true)) {\n      continue; // Skip this pair because of invalid key.\n    }\n\n    explicitPair = (state.tag !== null && state.tag !== '?') ||\n                   (state.dump && state.dump.length > 1024);\n\n    if (explicitPair) {\n      if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n        pairBuffer += '?';\n      } else {\n        pairBuffer += '? ';\n      }\n    }\n\n    pairBuffer += state.dump;\n\n    if (explicitPair) {\n      pairBuffer += generateNextLine(state, level);\n    }\n\n    if (!writeNode(state, level + 1, objectValue, true, explicitPair)) {\n      continue; // Skip this pair because of invalid value.\n    }\n\n    if (state.dump && CHAR_LINE_FEED === state.dump.charCodeAt(0)) {\n      pairBuffer += ':';\n    } else {\n      pairBuffer += ': ';\n    }\n\n    pairBuffer += state.dump;\n\n    // Both key and value are valid.\n    _result += pairBuffer;\n  }\n\n  state.tag = _tag;\n  state.dump = _result || '{}'; // Empty mapping if no valid pairs.\n}\n\nfunction detectType(state, object, explicit) {\n  var _result, typeList, index, length, type, style;\n\n  typeList = explicit ? state.explicitTypes : state.implicitTypes;\n\n  for (index = 0, length = typeList.length; index < length; index += 1) {\n    type = typeList[index];\n\n    if ((type.instanceOf  || type.predicate) &&\n        (!type.instanceOf || ((typeof object === 'object') && (object instanceof type.instanceOf))) &&\n        (!type.predicate  || type.predicate(object))) {\n\n      state.tag = explicit ? type.tag : '?';\n\n      if (type.represent) {\n        style = state.styleMap[type.tag] || type.defaultStyle;\n\n        if (_toString.call(type.represent) === '[object Function]') {\n          _result = type.represent(object, style);\n        } else if (_hasOwnProperty.call(type.represent, style)) {\n          _result = type.represent[style](object, style);\n        } else {\n          throw new YAMLException('!<' + type.tag + '> tag resolver accepts not \"' + style + '\" style');\n        }\n\n        state.dump = _result;\n      }\n\n      return true;\n    }\n  }\n\n  return false;\n}\n\n// Serializes `object` and writes it to global `result`.\n// Returns true on success, or false on invalid object.\n//\nfunction writeNode(state, level, object, block, compact, iskey) {\n  state.tag = null;\n  state.dump = object;\n\n  if (!detectType(state, object, false)) {\n    detectType(state, object, true);\n  }\n\n  var type = _toString.call(state.dump);\n\n  if (block) {\n    block = (state.flowLevel < 0 || state.flowLevel > level);\n  }\n\n  var objectOrArray = type === '[object Object]' || type === '[object Array]',\n      duplicateIndex,\n      duplicate;\n\n  if (objectOrArray) {\n    duplicateIndex = state.duplicates.indexOf(object);\n    duplicate = duplicateIndex !== -1;\n  }\n\n  if ((state.tag !== null && state.tag !== '?') || duplicate || (state.indent !== 2 && level > 0)) {\n    compact = false;\n  }\n\n  if (duplicate && state.usedDuplicates[duplicateIndex]) {\n    state.dump = '*ref_' + duplicateIndex;\n  } else {\n    if (objectOrArray && duplicate && !state.usedDuplicates[duplicateIndex]) {\n      state.usedDuplicates[duplicateIndex] = true;\n    }\n    if (type === '[object Object]') {\n      if (block && (Object.keys(state.dump).length !== 0)) {\n        writeBlockMapping(state, level, state.dump, compact);\n        if (duplicate) {\n          state.dump = '&ref_' + duplicateIndex + state.dump;\n        }\n      } else {\n        writeFlowMapping(state, level, state.dump);\n        if (duplicate) {\n          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n        }\n      }\n    } else if (type === '[object Array]') {\n      var arrayLevel = (state.noArrayIndent && (level > 0)) ? level - 1 : level;\n      if (block && (state.dump.length !== 0)) {\n        writeBlockSequence(state, arrayLevel, state.dump, compact);\n        if (duplicate) {\n          state.dump = '&ref_' + duplicateIndex + state.dump;\n        }\n      } else {\n        writeFlowSequence(state, arrayLevel, state.dump);\n        if (duplicate) {\n          state.dump = '&ref_' + duplicateIndex + ' ' + state.dump;\n        }\n      }\n    } else if (type === '[object String]') {\n      if (state.tag !== '?') {\n        writeScalar(state, state.dump, level, iskey);\n      }\n    } else {\n      if (state.skipInvalid) return false;\n      throw new YAMLException('unacceptable kind of an object to dump ' + type);\n    }\n\n    if (state.tag !== null && state.tag !== '?') {\n      state.dump = '!<' + state.tag + '> ' + state.dump;\n    }\n  }\n\n  return true;\n}\n\nfunction getDuplicateReferences(object, state) {\n  var objects = [],\n      duplicatesIndexes = [],\n      index,\n      length;\n\n  inspectNode(object, objects, duplicatesIndexes);\n\n  for (index = 0, length = duplicatesIndexes.length; index < length; index += 1) {\n    state.duplicates.push(objects[duplicatesIndexes[index]]);\n  }\n  state.usedDuplicates = new Array(length);\n}\n\nfunction inspectNode(object, objects, duplicatesIndexes) {\n  var objectKeyList,\n      index,\n      length;\n\n  if (object !== null && typeof object === 'object') {\n    index = objects.indexOf(object);\n    if (index !== -1) {\n      if (duplicatesIndexes.indexOf(index) === -1) {\n        duplicatesIndexes.push(index);\n      }\n    } else {\n      objects.push(object);\n\n      if (Array.isArray(object)) {\n        for (index = 0, length = object.length; index < length; index += 1) {\n          inspectNode(object[index], objects, duplicatesIndexes);\n        }\n      } else {\n        objectKeyList = Object.keys(object);\n\n        for (index = 0, length = objectKeyList.length; index < length; index += 1) {\n          inspectNode(object[objectKeyList[index]], objects, duplicatesIndexes);\n        }\n      }\n    }\n  }\n}\n\nfunction dump(input, options) {\n  options = options || {};\n\n  var state = new State(options);\n\n  if (!state.noRefs) getDuplicateReferences(input, state);\n\n  if (writeNode(state, 0, input, true, true)) return state.dump + '\\n';\n\n  return '';\n}\n\nfunction safeDump(input, options) {\n  return dump(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));\n}\n\nmodule.exports.dump     = dump;\nmodule.exports.safeDump = safeDump;\n\n\n/***/ }),\n/* 282 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/*eslint-disable max-len,no-use-before-define*/\n\nvar common              = __webpack_require__(44);\nvar YAMLException       = __webpack_require__(55);\nvar Mark                = __webpack_require__(283);\nvar DEFAULT_SAFE_SCHEMA = __webpack_require__(56);\nvar DEFAULT_FULL_SCHEMA = __webpack_require__(73);\n\n\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\n\nvar CONTEXT_FLOW_IN   = 1;\nvar CONTEXT_FLOW_OUT  = 2;\nvar CONTEXT_BLOCK_IN  = 3;\nvar CONTEXT_BLOCK_OUT = 4;\n\n\nvar CHOMPING_CLIP  = 1;\nvar CHOMPING_STRIP = 2;\nvar CHOMPING_KEEP  = 3;\n\n\nvar PATTERN_NON_PRINTABLE         = /[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x84\\x86-\\x9F\\uFFFE\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\nvar PATTERN_NON_ASCII_LINE_BREAKS = /[\\x85\\u2028\\u2029]/;\nvar PATTERN_FLOW_INDICATORS       = /[,\\[\\]\\{\\}]/;\nvar PATTERN_TAG_HANDLE            = /^(?:!|!!|![a-z\\-]+!)$/i;\nvar PATTERN_TAG_URI               = /^(?:!|[^,\\[\\]\\{\\}])(?:%[0-9a-f]{2}|[0-9a-z\\-#;\\/\\?:@&=\\+\\$,_\\.!~\\*'\\(\\)\\[\\]])*$/i;\n\n\nfunction _class(obj) { return Object.prototype.toString.call(obj); }\n\nfunction is_EOL(c) {\n  return (c === 0x0A/* LF */) || (c === 0x0D/* CR */);\n}\n\nfunction is_WHITE_SPACE(c) {\n  return (c === 0x09/* Tab */) || (c === 0x20/* Space */);\n}\n\nfunction is_WS_OR_EOL(c) {\n  return (c === 0x09/* Tab */) ||\n         (c === 0x20/* Space */) ||\n         (c === 0x0A/* LF */) ||\n         (c === 0x0D/* CR */);\n}\n\nfunction is_FLOW_INDICATOR(c) {\n  return c === 0x2C/* , */ ||\n         c === 0x5B/* [ */ ||\n         c === 0x5D/* ] */ ||\n         c === 0x7B/* { */ ||\n         c === 0x7D/* } */;\n}\n\nfunction fromHexCode(c) {\n  var lc;\n\n  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n    return c - 0x30;\n  }\n\n  /*eslint-disable no-bitwise*/\n  lc = c | 0x20;\n\n  if ((0x61/* a */ <= lc) && (lc <= 0x66/* f */)) {\n    return lc - 0x61 + 10;\n  }\n\n  return -1;\n}\n\nfunction escapedHexLen(c) {\n  if (c === 0x78/* x */) { return 2; }\n  if (c === 0x75/* u */) { return 4; }\n  if (c === 0x55/* U */) { return 8; }\n  return 0;\n}\n\nfunction fromDecimalCode(c) {\n  if ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) {\n    return c - 0x30;\n  }\n\n  return -1;\n}\n\nfunction simpleEscapeSequence(c) {\n  /* eslint-disable indent */\n  return (c === 0x30/* 0 */) ? '\\x00' :\n        (c === 0x61/* a */) ? '\\x07' :\n        (c === 0x62/* b */) ? '\\x08' :\n        (c === 0x74/* t */) ? '\\x09' :\n        (c === 0x09/* Tab */) ? '\\x09' :\n        (c === 0x6E/* n */) ? '\\x0A' :\n        (c === 0x76/* v */) ? '\\x0B' :\n        (c === 0x66/* f */) ? '\\x0C' :\n        (c === 0x72/* r */) ? '\\x0D' :\n        (c === 0x65/* e */) ? '\\x1B' :\n        (c === 0x20/* Space */) ? ' ' :\n        (c === 0x22/* \" */) ? '\\x22' :\n        (c === 0x2F/* / */) ? '/' :\n        (c === 0x5C/* \\ */) ? '\\x5C' :\n        (c === 0x4E/* N */) ? '\\x85' :\n        (c === 0x5F/* _ */) ? '\\xA0' :\n        (c === 0x4C/* L */) ? '\\u2028' :\n        (c === 0x50/* P */) ? '\\u2029' : '';\n}\n\nfunction charFromCodepoint(c) {\n  if (c <= 0xFFFF) {\n    return String.fromCharCode(c);\n  }\n  // Encode UTF-16 surrogate pair\n  // https://en.wikipedia.org/wiki/UTF-16#Code_points_U.2B010000_to_U.2B10FFFF\n  return String.fromCharCode(\n    ((c - 0x010000) >> 10) + 0xD800,\n    ((c - 0x010000) & 0x03FF) + 0xDC00\n  );\n}\n\nvar simpleEscapeCheck = new Array(256); // integer, for fast access\nvar simpleEscapeMap = new Array(256);\nfor (var i = 0; i < 256; i++) {\n  simpleEscapeCheck[i] = simpleEscapeSequence(i) ? 1 : 0;\n  simpleEscapeMap[i] = simpleEscapeSequence(i);\n}\n\n\nfunction State(input, options) {\n  this.input = input;\n\n  this.filename  = options['filename']  || null;\n  this.schema    = options['schema']    || DEFAULT_FULL_SCHEMA;\n  this.onWarning = options['onWarning'] || null;\n  this.legacy    = options['legacy']    || false;\n  this.json      = options['json']      || false;\n  this.listener  = options['listener']  || null;\n\n  this.implicitTypes = this.schema.compiledImplicit;\n  this.typeMap       = this.schema.compiledTypeMap;\n\n  this.length     = input.length;\n  this.position   = 0;\n  this.line       = 0;\n  this.lineStart  = 0;\n  this.lineIndent = 0;\n\n  this.documents = [];\n\n  /*\n  this.version;\n  this.checkLineBreaks;\n  this.tagMap;\n  this.anchorMap;\n  this.tag;\n  this.anchor;\n  this.kind;\n  this.result;*/\n\n}\n\n\nfunction generateError(state, message) {\n  return new YAMLException(\n    message,\n    new Mark(state.filename, state.input, state.position, state.line, (state.position - state.lineStart)));\n}\n\nfunction throwError(state, message) {\n  throw generateError(state, message);\n}\n\nfunction throwWarning(state, message) {\n  if (state.onWarning) {\n    state.onWarning.call(null, generateError(state, message));\n  }\n}\n\n\nvar directiveHandlers = {\n\n  YAML: function handleYamlDirective(state, name, args) {\n\n    var match, major, minor;\n\n    if (state.version !== null) {\n      throwError(state, 'duplication of %YAML directive');\n    }\n\n    if (args.length !== 1) {\n      throwError(state, 'YAML directive accepts exactly one argument');\n    }\n\n    match = /^([0-9]+)\\.([0-9]+)$/.exec(args[0]);\n\n    if (match === null) {\n      throwError(state, 'ill-formed argument of the YAML directive');\n    }\n\n    major = parseInt(match[1], 10);\n    minor = parseInt(match[2], 10);\n\n    if (major !== 1) {\n      throwError(state, 'unacceptable YAML version of the document');\n    }\n\n    state.version = args[0];\n    state.checkLineBreaks = (minor < 2);\n\n    if (minor !== 1 && minor !== 2) {\n      throwWarning(state, 'unsupported YAML version of the document');\n    }\n  },\n\n  TAG: function handleTagDirective(state, name, args) {\n\n    var handle, prefix;\n\n    if (args.length !== 2) {\n      throwError(state, 'TAG directive accepts exactly two arguments');\n    }\n\n    handle = args[0];\n    prefix = args[1];\n\n    if (!PATTERN_TAG_HANDLE.test(handle)) {\n      throwError(state, 'ill-formed tag handle (first argument) of the TAG directive');\n    }\n\n    if (_hasOwnProperty.call(state.tagMap, handle)) {\n      throwError(state, 'there is a previously declared suffix for \"' + handle + '\" tag handle');\n    }\n\n    if (!PATTERN_TAG_URI.test(prefix)) {\n      throwError(state, 'ill-formed tag prefix (second argument) of the TAG directive');\n    }\n\n    state.tagMap[handle] = prefix;\n  }\n};\n\n\nfunction captureSegment(state, start, end, checkJson) {\n  var _position, _length, _character, _result;\n\n  if (start < end) {\n    _result = state.input.slice(start, end);\n\n    if (checkJson) {\n      for (_position = 0, _length = _result.length; _position < _length; _position += 1) {\n        _character = _result.charCodeAt(_position);\n        if (!(_character === 0x09 ||\n              (0x20 <= _character && _character <= 0x10FFFF))) {\n          throwError(state, 'expected valid JSON character');\n        }\n      }\n    } else if (PATTERN_NON_PRINTABLE.test(_result)) {\n      throwError(state, 'the stream contains non-printable characters');\n    }\n\n    state.result += _result;\n  }\n}\n\nfunction mergeMappings(state, destination, source, overridableKeys) {\n  var sourceKeys, key, index, quantity;\n\n  if (!common.isObject(source)) {\n    throwError(state, 'cannot merge mappings; the provided source object is unacceptable');\n  }\n\n  sourceKeys = Object.keys(source);\n\n  for (index = 0, quantity = sourceKeys.length; index < quantity; index += 1) {\n    key = sourceKeys[index];\n\n    if (!_hasOwnProperty.call(destination, key)) {\n      destination[key] = source[key];\n      overridableKeys[key] = true;\n    }\n  }\n}\n\nfunction storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, startLine, startPos) {\n  var index, quantity;\n\n  // The output is a plain object here, so keys can only be strings.\n  // We need to convert keyNode to a string, but doing so can hang the process\n  // (deeply nested arrays that explode exponentially using aliases).\n  if (Array.isArray(keyNode)) {\n    keyNode = Array.prototype.slice.call(keyNode);\n\n    for (index = 0, quantity = keyNode.length; index < quantity; index += 1) {\n      if (Array.isArray(keyNode[index])) {\n        throwError(state, 'nested arrays are not supported inside keys');\n      }\n\n      if (typeof keyNode === 'object' && _class(keyNode[index]) === '[object Object]') {\n        keyNode[index] = '[object Object]';\n      }\n    }\n  }\n\n  // Avoid code execution in load() via toString property\n  // (still use its own toString for arrays, timestamps,\n  // and whatever user schema extensions happen to have @@toStringTag)\n  if (typeof keyNode === 'object' && _class(keyNode) === '[object Object]') {\n    keyNode = '[object Object]';\n  }\n\n\n  keyNode = String(keyNode);\n\n  if (_result === null) {\n    _result = {};\n  }\n\n  if (keyTag === 'tag:yaml.org,2002:merge') {\n    if (Array.isArray(valueNode)) {\n      for (index = 0, quantity = valueNode.length; index < quantity; index += 1) {\n        mergeMappings(state, _result, valueNode[index], overridableKeys);\n      }\n    } else {\n      mergeMappings(state, _result, valueNode, overridableKeys);\n    }\n  } else {\n    if (!state.json &&\n        !_hasOwnProperty.call(overridableKeys, keyNode) &&\n        _hasOwnProperty.call(_result, keyNode)) {\n      state.line = startLine || state.line;\n      state.position = startPos || state.position;\n      throwError(state, 'duplicated mapping key');\n    }\n    _result[keyNode] = valueNode;\n    delete overridableKeys[keyNode];\n  }\n\n  return _result;\n}\n\nfunction readLineBreak(state) {\n  var ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch === 0x0A/* LF */) {\n    state.position++;\n  } else if (ch === 0x0D/* CR */) {\n    state.position++;\n    if (state.input.charCodeAt(state.position) === 0x0A/* LF */) {\n      state.position++;\n    }\n  } else {\n    throwError(state, 'a line break is expected');\n  }\n\n  state.line += 1;\n  state.lineStart = state.position;\n}\n\nfunction skipSeparationSpace(state, allowComments, checkIndent) {\n  var lineBreaks = 0,\n      ch = state.input.charCodeAt(state.position);\n\n  while (ch !== 0) {\n    while (is_WHITE_SPACE(ch)) {\n      ch = state.input.charCodeAt(++state.position);\n    }\n\n    if (allowComments && ch === 0x23/* # */) {\n      do {\n        ch = state.input.charCodeAt(++state.position);\n      } while (ch !== 0x0A/* LF */ && ch !== 0x0D/* CR */ && ch !== 0);\n    }\n\n    if (is_EOL(ch)) {\n      readLineBreak(state);\n\n      ch = state.input.charCodeAt(state.position);\n      lineBreaks++;\n      state.lineIndent = 0;\n\n      while (ch === 0x20/* Space */) {\n        state.lineIndent++;\n        ch = state.input.charCodeAt(++state.position);\n      }\n    } else {\n      break;\n    }\n  }\n\n  if (checkIndent !== -1 && lineBreaks !== 0 && state.lineIndent < checkIndent) {\n    throwWarning(state, 'deficient indentation');\n  }\n\n  return lineBreaks;\n}\n\nfunction testDocumentSeparator(state) {\n  var _position = state.position,\n      ch;\n\n  ch = state.input.charCodeAt(_position);\n\n  // Condition state.position === state.lineStart is tested\n  // in parent on each call, for efficiency. No needs to test here again.\n  if ((ch === 0x2D/* - */ || ch === 0x2E/* . */) &&\n      ch === state.input.charCodeAt(_position + 1) &&\n      ch === state.input.charCodeAt(_position + 2)) {\n\n    _position += 3;\n\n    ch = state.input.charCodeAt(_position);\n\n    if (ch === 0 || is_WS_OR_EOL(ch)) {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nfunction writeFoldedLines(state, count) {\n  if (count === 1) {\n    state.result += ' ';\n  } else if (count > 1) {\n    state.result += common.repeat('\\n', count - 1);\n  }\n}\n\n\nfunction readPlainScalar(state, nodeIndent, withinFlowCollection) {\n  var preceding,\n      following,\n      captureStart,\n      captureEnd,\n      hasPendingContent,\n      _line,\n      _lineStart,\n      _lineIndent,\n      _kind = state.kind,\n      _result = state.result,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (is_WS_OR_EOL(ch)      ||\n      is_FLOW_INDICATOR(ch) ||\n      ch === 0x23/* # */    ||\n      ch === 0x26/* & */    ||\n      ch === 0x2A/* * */    ||\n      ch === 0x21/* ! */    ||\n      ch === 0x7C/* | */    ||\n      ch === 0x3E/* > */    ||\n      ch === 0x27/* ' */    ||\n      ch === 0x22/* \" */    ||\n      ch === 0x25/* % */    ||\n      ch === 0x40/* @ */    ||\n      ch === 0x60/* ` */) {\n    return false;\n  }\n\n  if (ch === 0x3F/* ? */ || ch === 0x2D/* - */) {\n    following = state.input.charCodeAt(state.position + 1);\n\n    if (is_WS_OR_EOL(following) ||\n        withinFlowCollection && is_FLOW_INDICATOR(following)) {\n      return false;\n    }\n  }\n\n  state.kind = 'scalar';\n  state.result = '';\n  captureStart = captureEnd = state.position;\n  hasPendingContent = false;\n\n  while (ch !== 0) {\n    if (ch === 0x3A/* : */) {\n      following = state.input.charCodeAt(state.position + 1);\n\n      if (is_WS_OR_EOL(following) ||\n          withinFlowCollection && is_FLOW_INDICATOR(following)) {\n        break;\n      }\n\n    } else if (ch === 0x23/* # */) {\n      preceding = state.input.charCodeAt(state.position - 1);\n\n      if (is_WS_OR_EOL(preceding)) {\n        break;\n      }\n\n    } else if ((state.position === state.lineStart && testDocumentSeparator(state)) ||\n               withinFlowCollection && is_FLOW_INDICATOR(ch)) {\n      break;\n\n    } else if (is_EOL(ch)) {\n      _line = state.line;\n      _lineStart = state.lineStart;\n      _lineIndent = state.lineIndent;\n      skipSeparationSpace(state, false, -1);\n\n      if (state.lineIndent >= nodeIndent) {\n        hasPendingContent = true;\n        ch = state.input.charCodeAt(state.position);\n        continue;\n      } else {\n        state.position = captureEnd;\n        state.line = _line;\n        state.lineStart = _lineStart;\n        state.lineIndent = _lineIndent;\n        break;\n      }\n    }\n\n    if (hasPendingContent) {\n      captureSegment(state, captureStart, captureEnd, false);\n      writeFoldedLines(state, state.line - _line);\n      captureStart = captureEnd = state.position;\n      hasPendingContent = false;\n    }\n\n    if (!is_WHITE_SPACE(ch)) {\n      captureEnd = state.position + 1;\n    }\n\n    ch = state.input.charCodeAt(++state.position);\n  }\n\n  captureSegment(state, captureStart, captureEnd, false);\n\n  if (state.result) {\n    return true;\n  }\n\n  state.kind = _kind;\n  state.result = _result;\n  return false;\n}\n\nfunction readSingleQuotedScalar(state, nodeIndent) {\n  var ch,\n      captureStart, captureEnd;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch !== 0x27/* ' */) {\n    return false;\n  }\n\n  state.kind = 'scalar';\n  state.result = '';\n  state.position++;\n  captureStart = captureEnd = state.position;\n\n  while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n    if (ch === 0x27/* ' */) {\n      captureSegment(state, captureStart, state.position, true);\n      ch = state.input.charCodeAt(++state.position);\n\n      if (ch === 0x27/* ' */) {\n        captureStart = state.position;\n        state.position++;\n        captureEnd = state.position;\n      } else {\n        return true;\n      }\n\n    } else if (is_EOL(ch)) {\n      captureSegment(state, captureStart, captureEnd, true);\n      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n      captureStart = captureEnd = state.position;\n\n    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n      throwError(state, 'unexpected end of the document within a single quoted scalar');\n\n    } else {\n      state.position++;\n      captureEnd = state.position;\n    }\n  }\n\n  throwError(state, 'unexpected end of the stream within a single quoted scalar');\n}\n\nfunction readDoubleQuotedScalar(state, nodeIndent) {\n  var captureStart,\n      captureEnd,\n      hexLength,\n      hexResult,\n      tmp,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch !== 0x22/* \" */) {\n    return false;\n  }\n\n  state.kind = 'scalar';\n  state.result = '';\n  state.position++;\n  captureStart = captureEnd = state.position;\n\n  while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n    if (ch === 0x22/* \" */) {\n      captureSegment(state, captureStart, state.position, true);\n      state.position++;\n      return true;\n\n    } else if (ch === 0x5C/* \\ */) {\n      captureSegment(state, captureStart, state.position, true);\n      ch = state.input.charCodeAt(++state.position);\n\n      if (is_EOL(ch)) {\n        skipSeparationSpace(state, false, nodeIndent);\n\n        // TODO: rework to inline fn with no type cast?\n      } else if (ch < 256 && simpleEscapeCheck[ch]) {\n        state.result += simpleEscapeMap[ch];\n        state.position++;\n\n      } else if ((tmp = escapedHexLen(ch)) > 0) {\n        hexLength = tmp;\n        hexResult = 0;\n\n        for (; hexLength > 0; hexLength--) {\n          ch = state.input.charCodeAt(++state.position);\n\n          if ((tmp = fromHexCode(ch)) >= 0) {\n            hexResult = (hexResult << 4) + tmp;\n\n          } else {\n            throwError(state, 'expected hexadecimal character');\n          }\n        }\n\n        state.result += charFromCodepoint(hexResult);\n\n        state.position++;\n\n      } else {\n        throwError(state, 'unknown escape sequence');\n      }\n\n      captureStart = captureEnd = state.position;\n\n    } else if (is_EOL(ch)) {\n      captureSegment(state, captureStart, captureEnd, true);\n      writeFoldedLines(state, skipSeparationSpace(state, false, nodeIndent));\n      captureStart = captureEnd = state.position;\n\n    } else if (state.position === state.lineStart && testDocumentSeparator(state)) {\n      throwError(state, 'unexpected end of the document within a double quoted scalar');\n\n    } else {\n      state.position++;\n      captureEnd = state.position;\n    }\n  }\n\n  throwError(state, 'unexpected end of the stream within a double quoted scalar');\n}\n\nfunction readFlowCollection(state, nodeIndent) {\n  var readNext = true,\n      _line,\n      _tag     = state.tag,\n      _result,\n      _anchor  = state.anchor,\n      following,\n      terminator,\n      isPair,\n      isExplicitPair,\n      isMapping,\n      overridableKeys = {},\n      keyNode,\n      keyTag,\n      valueNode,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch === 0x5B/* [ */) {\n    terminator = 0x5D;/* ] */\n    isMapping = false;\n    _result = [];\n  } else if (ch === 0x7B/* { */) {\n    terminator = 0x7D;/* } */\n    isMapping = true;\n    _result = {};\n  } else {\n    return false;\n  }\n\n  if (state.anchor !== null) {\n    state.anchorMap[state.anchor] = _result;\n  }\n\n  ch = state.input.charCodeAt(++state.position);\n\n  while (ch !== 0) {\n    skipSeparationSpace(state, true, nodeIndent);\n\n    ch = state.input.charCodeAt(state.position);\n\n    if (ch === terminator) {\n      state.position++;\n      state.tag = _tag;\n      state.anchor = _anchor;\n      state.kind = isMapping ? 'mapping' : 'sequence';\n      state.result = _result;\n      return true;\n    } else if (!readNext) {\n      throwError(state, 'missed comma between flow collection entries');\n    }\n\n    keyTag = keyNode = valueNode = null;\n    isPair = isExplicitPair = false;\n\n    if (ch === 0x3F/* ? */) {\n      following = state.input.charCodeAt(state.position + 1);\n\n      if (is_WS_OR_EOL(following)) {\n        isPair = isExplicitPair = true;\n        state.position++;\n        skipSeparationSpace(state, true, nodeIndent);\n      }\n    }\n\n    _line = state.line;\n    composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n    keyTag = state.tag;\n    keyNode = state.result;\n    skipSeparationSpace(state, true, nodeIndent);\n\n    ch = state.input.charCodeAt(state.position);\n\n    if ((isExplicitPair || state.line === _line) && ch === 0x3A/* : */) {\n      isPair = true;\n      ch = state.input.charCodeAt(++state.position);\n      skipSeparationSpace(state, true, nodeIndent);\n      composeNode(state, nodeIndent, CONTEXT_FLOW_IN, false, true);\n      valueNode = state.result;\n    }\n\n    if (isMapping) {\n      storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode);\n    } else if (isPair) {\n      _result.push(storeMappingPair(state, null, overridableKeys, keyTag, keyNode, valueNode));\n    } else {\n      _result.push(keyNode);\n    }\n\n    skipSeparationSpace(state, true, nodeIndent);\n\n    ch = state.input.charCodeAt(state.position);\n\n    if (ch === 0x2C/* , */) {\n      readNext = true;\n      ch = state.input.charCodeAt(++state.position);\n    } else {\n      readNext = false;\n    }\n  }\n\n  throwError(state, 'unexpected end of the stream within a flow collection');\n}\n\nfunction readBlockScalar(state, nodeIndent) {\n  var captureStart,\n      folding,\n      chomping       = CHOMPING_CLIP,\n      didReadContent = false,\n      detectedIndent = false,\n      textIndent     = nodeIndent,\n      emptyLines     = 0,\n      atMoreIndented = false,\n      tmp,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch === 0x7C/* | */) {\n    folding = false;\n  } else if (ch === 0x3E/* > */) {\n    folding = true;\n  } else {\n    return false;\n  }\n\n  state.kind = 'scalar';\n  state.result = '';\n\n  while (ch !== 0) {\n    ch = state.input.charCodeAt(++state.position);\n\n    if (ch === 0x2B/* + */ || ch === 0x2D/* - */) {\n      if (CHOMPING_CLIP === chomping) {\n        chomping = (ch === 0x2B/* + */) ? CHOMPING_KEEP : CHOMPING_STRIP;\n      } else {\n        throwError(state, 'repeat of a chomping mode identifier');\n      }\n\n    } else if ((tmp = fromDecimalCode(ch)) >= 0) {\n      if (tmp === 0) {\n        throwError(state, 'bad explicit indentation width of a block scalar; it cannot be less than one');\n      } else if (!detectedIndent) {\n        textIndent = nodeIndent + tmp - 1;\n        detectedIndent = true;\n      } else {\n        throwError(state, 'repeat of an indentation width identifier');\n      }\n\n    } else {\n      break;\n    }\n  }\n\n  if (is_WHITE_SPACE(ch)) {\n    do { ch = state.input.charCodeAt(++state.position); }\n    while (is_WHITE_SPACE(ch));\n\n    if (ch === 0x23/* # */) {\n      do { ch = state.input.charCodeAt(++state.position); }\n      while (!is_EOL(ch) && (ch !== 0));\n    }\n  }\n\n  while (ch !== 0) {\n    readLineBreak(state);\n    state.lineIndent = 0;\n\n    ch = state.input.charCodeAt(state.position);\n\n    while ((!detectedIndent || state.lineIndent < textIndent) &&\n           (ch === 0x20/* Space */)) {\n      state.lineIndent++;\n      ch = state.input.charCodeAt(++state.position);\n    }\n\n    if (!detectedIndent && state.lineIndent > textIndent) {\n      textIndent = state.lineIndent;\n    }\n\n    if (is_EOL(ch)) {\n      emptyLines++;\n      continue;\n    }\n\n    // End of the scalar.\n    if (state.lineIndent < textIndent) {\n\n      // Perform the chomping.\n      if (chomping === CHOMPING_KEEP) {\n        state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n      } else if (chomping === CHOMPING_CLIP) {\n        if (didReadContent) { // i.e. only if the scalar is not empty.\n          state.result += '\\n';\n        }\n      }\n\n      // Break this `while` cycle and go to the funciton's epilogue.\n      break;\n    }\n\n    // Folded style: use fancy rules to handle line breaks.\n    if (folding) {\n\n      // Lines starting with white space characters (more-indented lines) are not folded.\n      if (is_WHITE_SPACE(ch)) {\n        atMoreIndented = true;\n        // except for the first content line (cf. Example 8.1)\n        state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n\n      // End of more-indented block.\n      } else if (atMoreIndented) {\n        atMoreIndented = false;\n        state.result += common.repeat('\\n', emptyLines + 1);\n\n      // Just one line break - perceive as the same line.\n      } else if (emptyLines === 0) {\n        if (didReadContent) { // i.e. only if we have already read some scalar content.\n          state.result += ' ';\n        }\n\n      // Several line breaks - perceive as different lines.\n      } else {\n        state.result += common.repeat('\\n', emptyLines);\n      }\n\n    // Literal style: just add exact number of line breaks between content lines.\n    } else {\n      // Keep all line breaks except the header line break.\n      state.result += common.repeat('\\n', didReadContent ? 1 + emptyLines : emptyLines);\n    }\n\n    didReadContent = true;\n    detectedIndent = true;\n    emptyLines = 0;\n    captureStart = state.position;\n\n    while (!is_EOL(ch) && (ch !== 0)) {\n      ch = state.input.charCodeAt(++state.position);\n    }\n\n    captureSegment(state, captureStart, state.position, false);\n  }\n\n  return true;\n}\n\nfunction readBlockSequence(state, nodeIndent) {\n  var _line,\n      _tag      = state.tag,\n      _anchor   = state.anchor,\n      _result   = [],\n      following,\n      detected  = false,\n      ch;\n\n  if (state.anchor !== null) {\n    state.anchorMap[state.anchor] = _result;\n  }\n\n  ch = state.input.charCodeAt(state.position);\n\n  while (ch !== 0) {\n\n    if (ch !== 0x2D/* - */) {\n      break;\n    }\n\n    following = state.input.charCodeAt(state.position + 1);\n\n    if (!is_WS_OR_EOL(following)) {\n      break;\n    }\n\n    detected = true;\n    state.position++;\n\n    if (skipSeparationSpace(state, true, -1)) {\n      if (state.lineIndent <= nodeIndent) {\n        _result.push(null);\n        ch = state.input.charCodeAt(state.position);\n        continue;\n      }\n    }\n\n    _line = state.line;\n    composeNode(state, nodeIndent, CONTEXT_BLOCK_IN, false, true);\n    _result.push(state.result);\n    skipSeparationSpace(state, true, -1);\n\n    ch = state.input.charCodeAt(state.position);\n\n    if ((state.line === _line || state.lineIndent > nodeIndent) && (ch !== 0)) {\n      throwError(state, 'bad indentation of a sequence entry');\n    } else if (state.lineIndent < nodeIndent) {\n      break;\n    }\n  }\n\n  if (detected) {\n    state.tag = _tag;\n    state.anchor = _anchor;\n    state.kind = 'sequence';\n    state.result = _result;\n    return true;\n  }\n  return false;\n}\n\nfunction readBlockMapping(state, nodeIndent, flowIndent) {\n  var following,\n      allowCompact,\n      _line,\n      _pos,\n      _tag          = state.tag,\n      _anchor       = state.anchor,\n      _result       = {},\n      overridableKeys = {},\n      keyTag        = null,\n      keyNode       = null,\n      valueNode     = null,\n      atExplicitKey = false,\n      detected      = false,\n      ch;\n\n  if (state.anchor !== null) {\n    state.anchorMap[state.anchor] = _result;\n  }\n\n  ch = state.input.charCodeAt(state.position);\n\n  while (ch !== 0) {\n    following = state.input.charCodeAt(state.position + 1);\n    _line = state.line; // Save the current line.\n    _pos = state.position;\n\n    //\n    // Explicit notation case. There are two separate blocks:\n    // first for the key (denoted by \"?\") and second for the value (denoted by \":\")\n    //\n    if ((ch === 0x3F/* ? */ || ch === 0x3A/* : */) && is_WS_OR_EOL(following)) {\n\n      if (ch === 0x3F/* ? */) {\n        if (atExplicitKey) {\n          storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n          keyTag = keyNode = valueNode = null;\n        }\n\n        detected = true;\n        atExplicitKey = true;\n        allowCompact = true;\n\n      } else if (atExplicitKey) {\n        // i.e. 0x3A/* : */ === character after the explicit key.\n        atExplicitKey = false;\n        allowCompact = true;\n\n      } else {\n        throwError(state, 'incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line');\n      }\n\n      state.position += 1;\n      ch = following;\n\n    //\n    // Implicit notation case. Flow-style node as the key first, then \":\", and the value.\n    //\n    } else if (composeNode(state, flowIndent, CONTEXT_FLOW_OUT, false, true)) {\n\n      if (state.line === _line) {\n        ch = state.input.charCodeAt(state.position);\n\n        while (is_WHITE_SPACE(ch)) {\n          ch = state.input.charCodeAt(++state.position);\n        }\n\n        if (ch === 0x3A/* : */) {\n          ch = state.input.charCodeAt(++state.position);\n\n          if (!is_WS_OR_EOL(ch)) {\n            throwError(state, 'a whitespace character is expected after the key-value separator within a block mapping');\n          }\n\n          if (atExplicitKey) {\n            storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n            keyTag = keyNode = valueNode = null;\n          }\n\n          detected = true;\n          atExplicitKey = false;\n          allowCompact = false;\n          keyTag = state.tag;\n          keyNode = state.result;\n\n        } else if (detected) {\n          throwError(state, 'can not read an implicit mapping pair; a colon is missed');\n\n        } else {\n          state.tag = _tag;\n          state.anchor = _anchor;\n          return true; // Keep the result of `composeNode`.\n        }\n\n      } else if (detected) {\n        throwError(state, 'can not read a block mapping entry; a multiline key may not be an implicit key');\n\n      } else {\n        state.tag = _tag;\n        state.anchor = _anchor;\n        return true; // Keep the result of `composeNode`.\n      }\n\n    } else {\n      break; // Reading is done. Go to the epilogue.\n    }\n\n    //\n    // Common reading code for both explicit and implicit notations.\n    //\n    if (state.line === _line || state.lineIndent > nodeIndent) {\n      if (composeNode(state, nodeIndent, CONTEXT_BLOCK_OUT, true, allowCompact)) {\n        if (atExplicitKey) {\n          keyNode = state.result;\n        } else {\n          valueNode = state.result;\n        }\n      }\n\n      if (!atExplicitKey) {\n        storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, valueNode, _line, _pos);\n        keyTag = keyNode = valueNode = null;\n      }\n\n      skipSeparationSpace(state, true, -1);\n      ch = state.input.charCodeAt(state.position);\n    }\n\n    if (state.lineIndent > nodeIndent && (ch !== 0)) {\n      throwError(state, 'bad indentation of a mapping entry');\n    } else if (state.lineIndent < nodeIndent) {\n      break;\n    }\n  }\n\n  //\n  // Epilogue.\n  //\n\n  // Special case: last mapping's node contains only the key in explicit notation.\n  if (atExplicitKey) {\n    storeMappingPair(state, _result, overridableKeys, keyTag, keyNode, null);\n  }\n\n  // Expose the resulting mapping.\n  if (detected) {\n    state.tag = _tag;\n    state.anchor = _anchor;\n    state.kind = 'mapping';\n    state.result = _result;\n  }\n\n  return detected;\n}\n\nfunction readTagProperty(state) {\n  var _position,\n      isVerbatim = false,\n      isNamed    = false,\n      tagHandle,\n      tagName,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch !== 0x21/* ! */) return false;\n\n  if (state.tag !== null) {\n    throwError(state, 'duplication of a tag property');\n  }\n\n  ch = state.input.charCodeAt(++state.position);\n\n  if (ch === 0x3C/* < */) {\n    isVerbatim = true;\n    ch = state.input.charCodeAt(++state.position);\n\n  } else if (ch === 0x21/* ! */) {\n    isNamed = true;\n    tagHandle = '!!';\n    ch = state.input.charCodeAt(++state.position);\n\n  } else {\n    tagHandle = '!';\n  }\n\n  _position = state.position;\n\n  if (isVerbatim) {\n    do { ch = state.input.charCodeAt(++state.position); }\n    while (ch !== 0 && ch !== 0x3E/* > */);\n\n    if (state.position < state.length) {\n      tagName = state.input.slice(_position, state.position);\n      ch = state.input.charCodeAt(++state.position);\n    } else {\n      throwError(state, 'unexpected end of the stream within a verbatim tag');\n    }\n  } else {\n    while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n\n      if (ch === 0x21/* ! */) {\n        if (!isNamed) {\n          tagHandle = state.input.slice(_position - 1, state.position + 1);\n\n          if (!PATTERN_TAG_HANDLE.test(tagHandle)) {\n            throwError(state, 'named tag handle cannot contain such characters');\n          }\n\n          isNamed = true;\n          _position = state.position + 1;\n        } else {\n          throwError(state, 'tag suffix cannot contain exclamation marks');\n        }\n      }\n\n      ch = state.input.charCodeAt(++state.position);\n    }\n\n    tagName = state.input.slice(_position, state.position);\n\n    if (PATTERN_FLOW_INDICATORS.test(tagName)) {\n      throwError(state, 'tag suffix cannot contain flow indicator characters');\n    }\n  }\n\n  if (tagName && !PATTERN_TAG_URI.test(tagName)) {\n    throwError(state, 'tag name cannot contain such characters: ' + tagName);\n  }\n\n  if (isVerbatim) {\n    state.tag = tagName;\n\n  } else if (_hasOwnProperty.call(state.tagMap, tagHandle)) {\n    state.tag = state.tagMap[tagHandle] + tagName;\n\n  } else if (tagHandle === '!') {\n    state.tag = '!' + tagName;\n\n  } else if (tagHandle === '!!') {\n    state.tag = 'tag:yaml.org,2002:' + tagName;\n\n  } else {\n    throwError(state, 'undeclared tag handle \"' + tagHandle + '\"');\n  }\n\n  return true;\n}\n\nfunction readAnchorProperty(state) {\n  var _position,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch !== 0x26/* & */) return false;\n\n  if (state.anchor !== null) {\n    throwError(state, 'duplication of an anchor property');\n  }\n\n  ch = state.input.charCodeAt(++state.position);\n  _position = state.position;\n\n  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n    ch = state.input.charCodeAt(++state.position);\n  }\n\n  if (state.position === _position) {\n    throwError(state, 'name of an anchor node must contain at least one character');\n  }\n\n  state.anchor = state.input.slice(_position, state.position);\n  return true;\n}\n\nfunction readAlias(state) {\n  var _position, alias,\n      ch;\n\n  ch = state.input.charCodeAt(state.position);\n\n  if (ch !== 0x2A/* * */) return false;\n\n  ch = state.input.charCodeAt(++state.position);\n  _position = state.position;\n\n  while (ch !== 0 && !is_WS_OR_EOL(ch) && !is_FLOW_INDICATOR(ch)) {\n    ch = state.input.charCodeAt(++state.position);\n  }\n\n  if (state.position === _position) {\n    throwError(state, 'name of an alias node must contain at least one character');\n  }\n\n  alias = state.input.slice(_position, state.position);\n\n  if (!state.anchorMap.hasOwnProperty(alias)) {\n    throwError(state, 'unidentified alias \"' + alias + '\"');\n  }\n\n  state.result = state.anchorMap[alias];\n  skipSeparationSpace(state, true, -1);\n  return true;\n}\n\nfunction composeNode(state, parentIndent, nodeContext, allowToSeek, allowCompact) {\n  var allowBlockStyles,\n      allowBlockScalars,\n      allowBlockCollections,\n      indentStatus = 1, // 1: this>parent, 0: this=parent, -1: this<parent\n      atNewLine  = false,\n      hasContent = false,\n      typeIndex,\n      typeQuantity,\n      type,\n      flowIndent,\n      blockIndent;\n\n  if (state.listener !== null) {\n    state.listener('open', state);\n  }\n\n  state.tag    = null;\n  state.anchor = null;\n  state.kind   = null;\n  state.result = null;\n\n  allowBlockStyles = allowBlockScalars = allowBlockCollections =\n    CONTEXT_BLOCK_OUT === nodeContext ||\n    CONTEXT_BLOCK_IN  === nodeContext;\n\n  if (allowToSeek) {\n    if (skipSeparationSpace(state, true, -1)) {\n      atNewLine = true;\n\n      if (state.lineIndent > parentIndent) {\n        indentStatus = 1;\n      } else if (state.lineIndent === parentIndent) {\n        indentStatus = 0;\n      } else if (state.lineIndent < parentIndent) {\n        indentStatus = -1;\n      }\n    }\n  }\n\n  if (indentStatus === 1) {\n    while (readTagProperty(state) || readAnchorProperty(state)) {\n      if (skipSeparationSpace(state, true, -1)) {\n        atNewLine = true;\n        allowBlockCollections = allowBlockStyles;\n\n        if (state.lineIndent > parentIndent) {\n          indentStatus = 1;\n        } else if (state.lineIndent === parentIndent) {\n          indentStatus = 0;\n        } else if (state.lineIndent < parentIndent) {\n          indentStatus = -1;\n        }\n      } else {\n        allowBlockCollections = false;\n      }\n    }\n  }\n\n  if (allowBlockCollections) {\n    allowBlockCollections = atNewLine || allowCompact;\n  }\n\n  if (indentStatus === 1 || CONTEXT_BLOCK_OUT === nodeContext) {\n    if (CONTEXT_FLOW_IN === nodeContext || CONTEXT_FLOW_OUT === nodeContext) {\n      flowIndent = parentIndent;\n    } else {\n      flowIndent = parentIndent + 1;\n    }\n\n    blockIndent = state.position - state.lineStart;\n\n    if (indentStatus === 1) {\n      if (allowBlockCollections &&\n          (readBlockSequence(state, blockIndent) ||\n           readBlockMapping(state, blockIndent, flowIndent)) ||\n          readFlowCollection(state, flowIndent)) {\n        hasContent = true;\n      } else {\n        if ((allowBlockScalars && readBlockScalar(state, flowIndent)) ||\n            readSingleQuotedScalar(state, flowIndent) ||\n            readDoubleQuotedScalar(state, flowIndent)) {\n          hasContent = true;\n\n        } else if (readAlias(state)) {\n          hasContent = true;\n\n          if (state.tag !== null || state.anchor !== null) {\n            throwError(state, 'alias node should not have any properties');\n          }\n\n        } else if (readPlainScalar(state, flowIndent, CONTEXT_FLOW_IN === nodeContext)) {\n          hasContent = true;\n\n          if (state.tag === null) {\n            state.tag = '?';\n          }\n        }\n\n        if (state.anchor !== null) {\n          state.anchorMap[state.anchor] = state.result;\n        }\n      }\n    } else if (indentStatus === 0) {\n      // Special case: block sequences are allowed to have same indentation level as the parent.\n      // http://www.yaml.org/spec/1.2/spec.html#id2799784\n      hasContent = allowBlockCollections && readBlockSequence(state, blockIndent);\n    }\n  }\n\n  if (state.tag !== null && state.tag !== '!') {\n    if (state.tag === '?') {\n      for (typeIndex = 0, typeQuantity = state.implicitTypes.length; typeIndex < typeQuantity; typeIndex += 1) {\n        type = state.implicitTypes[typeIndex];\n\n        // Implicit resolving is not allowed for non-scalar types, and '?'\n        // non-specific tag is only assigned to plain scalars. So, it isn't\n        // needed to check for 'kind' conformity.\n\n        if (type.resolve(state.result)) { // `state.result` updated in resolver if matched\n          state.result = type.construct(state.result);\n          state.tag = type.tag;\n          if (state.anchor !== null) {\n            state.anchorMap[state.anchor] = state.result;\n          }\n          break;\n        }\n      }\n    } else if (_hasOwnProperty.call(state.typeMap[state.kind || 'fallback'], state.tag)) {\n      type = state.typeMap[state.kind || 'fallback'][state.tag];\n\n      if (state.result !== null && type.kind !== state.kind) {\n        throwError(state, 'unacceptable node kind for !<' + state.tag + '> tag; it should be \"' + type.kind + '\", not \"' + state.kind + '\"');\n      }\n\n      if (!type.resolve(state.result)) { // `state.result` updated in resolver if matched\n        throwError(state, 'cannot resolve a node with !<' + state.tag + '> explicit tag');\n      } else {\n        state.result = type.construct(state.result);\n        if (state.anchor !== null) {\n          state.anchorMap[state.anchor] = state.result;\n        }\n      }\n    } else {\n      throwError(state, 'unknown tag !<' + state.tag + '>');\n    }\n  }\n\n  if (state.listener !== null) {\n    state.listener('close', state);\n  }\n  return state.tag !== null ||  state.anchor !== null || hasContent;\n}\n\nfunction readDocument(state) {\n  var documentStart = state.position,\n      _position,\n      directiveName,\n      directiveArgs,\n      hasDirectives = false,\n      ch;\n\n  state.version = null;\n  state.checkLineBreaks = state.legacy;\n  state.tagMap = {};\n  state.anchorMap = {};\n\n  while ((ch = state.input.charCodeAt(state.position)) !== 0) {\n    skipSeparationSpace(state, true, -1);\n\n    ch = state.input.charCodeAt(state.position);\n\n    if (state.lineIndent > 0 || ch !== 0x25/* % */) {\n      break;\n    }\n\n    hasDirectives = true;\n    ch = state.input.charCodeAt(++state.position);\n    _position = state.position;\n\n    while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n      ch = state.input.charCodeAt(++state.position);\n    }\n\n    directiveName = state.input.slice(_position, state.position);\n    directiveArgs = [];\n\n    if (directiveName.length < 1) {\n      throwError(state, 'directive name must not be less than one character in length');\n    }\n\n    while (ch !== 0) {\n      while (is_WHITE_SPACE(ch)) {\n        ch = state.input.charCodeAt(++state.position);\n      }\n\n      if (ch === 0x23/* # */) {\n        do { ch = state.input.charCodeAt(++state.position); }\n        while (ch !== 0 && !is_EOL(ch));\n        break;\n      }\n\n      if (is_EOL(ch)) break;\n\n      _position = state.position;\n\n      while (ch !== 0 && !is_WS_OR_EOL(ch)) {\n        ch = state.input.charCodeAt(++state.position);\n      }\n\n      directiveArgs.push(state.input.slice(_position, state.position));\n    }\n\n    if (ch !== 0) readLineBreak(state);\n\n    if (_hasOwnProperty.call(directiveHandlers, directiveName)) {\n      directiveHandlers[directiveName](state, directiveName, directiveArgs);\n    } else {\n      throwWarning(state, 'unknown document directive \"' + directiveName + '\"');\n    }\n  }\n\n  skipSeparationSpace(state, true, -1);\n\n  if (state.lineIndent === 0 &&\n      state.input.charCodeAt(state.position)     === 0x2D/* - */ &&\n      state.input.charCodeAt(state.position + 1) === 0x2D/* - */ &&\n      state.input.charCodeAt(state.position + 2) === 0x2D/* - */) {\n    state.position += 3;\n    skipSeparationSpace(state, true, -1);\n\n  } else if (hasDirectives) {\n    throwError(state, 'directives end mark is expected');\n  }\n\n  composeNode(state, state.lineIndent - 1, CONTEXT_BLOCK_OUT, false, true);\n  skipSeparationSpace(state, true, -1);\n\n  if (state.checkLineBreaks &&\n      PATTERN_NON_ASCII_LINE_BREAKS.test(state.input.slice(documentStart, state.position))) {\n    throwWarning(state, 'non-ASCII line breaks are interpreted as content');\n  }\n\n  state.documents.push(state.result);\n\n  if (state.position === state.lineStart && testDocumentSeparator(state)) {\n\n    if (state.input.charCodeAt(state.position) === 0x2E/* . */) {\n      state.position += 3;\n      skipSeparationSpace(state, true, -1);\n    }\n    return;\n  }\n\n  if (state.position < (state.length - 1)) {\n    throwError(state, 'end of the stream or a document separator is expected');\n  } else {\n    return;\n  }\n}\n\n\nfunction loadDocuments(input, options) {\n  input = String(input);\n  options = options || {};\n\n  if (input.length !== 0) {\n\n    // Add tailing `\\n` if not exists\n    if (input.charCodeAt(input.length - 1) !== 0x0A/* LF */ &&\n        input.charCodeAt(input.length - 1) !== 0x0D/* CR */) {\n      input += '\\n';\n    }\n\n    // Strip BOM\n    if (input.charCodeAt(0) === 0xFEFF) {\n      input = input.slice(1);\n    }\n  }\n\n  var state = new State(input, options);\n\n  // Use 0 as string terminator. That significantly simplifies bounds check.\n  state.input += '\\0';\n\n  while (state.input.charCodeAt(state.position) === 0x20/* Space */) {\n    state.lineIndent += 1;\n    state.position += 1;\n  }\n\n  while (state.position < (state.length - 1)) {\n    readDocument(state);\n  }\n\n  return state.documents;\n}\n\n\nfunction loadAll(input, iterator, options) {\n  var documents = loadDocuments(input, options), index, length;\n\n  if (typeof iterator !== 'function') {\n    return documents;\n  }\n\n  for (index = 0, length = documents.length; index < length; index += 1) {\n    iterator(documents[index]);\n  }\n}\n\n\nfunction load(input, options) {\n  var documents = loadDocuments(input, options);\n\n  if (documents.length === 0) {\n    /*eslint-disable no-undefined*/\n    return undefined;\n  } else if (documents.length === 1) {\n    return documents[0];\n  }\n  throw new YAMLException('expected a single document in the stream, but found more');\n}\n\n\nfunction safeLoadAll(input, output, options) {\n  if (typeof output === 'function') {\n    loadAll(input, output, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));\n  } else {\n    return loadAll(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));\n  }\n}\n\n\nfunction safeLoad(input, options) {\n  return load(input, common.extend({ schema: DEFAULT_SAFE_SCHEMA }, options));\n}\n\n\nmodule.exports.loadAll     = loadAll;\nmodule.exports.load        = load;\nmodule.exports.safeLoadAll = safeLoadAll;\nmodule.exports.safeLoad    = safeLoad;\n\n\n/***/ }),\n/* 283 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n\nvar common = __webpack_require__(44);\n\n\nfunction Mark(name, buffer, position, line, column) {\n  this.name     = name;\n  this.buffer   = buffer;\n  this.position = position;\n  this.line     = line;\n  this.column   = column;\n}\n\n\nMark.prototype.getSnippet = function getSnippet(indent, maxLength) {\n  var head, start, tail, end, snippet;\n\n  if (!this.buffer) return null;\n\n  indent = indent || 4;\n  maxLength = maxLength || 75;\n\n  head = '';\n  start = this.position;\n\n  while (start > 0 && '\\x00\\r\\n\\x85\\u2028\\u2029'.indexOf(this.buffer.charAt(start - 1)) === -1) {\n    start -= 1;\n    if (this.position - start > (maxLength / 2 - 1)) {\n      head = ' ... ';\n      start += 5;\n      break;\n    }\n  }\n\n  tail = '';\n  end = this.position;\n\n  while (end < this.buffer.length && '\\x00\\r\\n\\x85\\u2028\\u2029'.indexOf(this.buffer.charAt(end)) === -1) {\n    end += 1;\n    if (end - this.position > (maxLength / 2 - 1)) {\n      tail = ' ... ';\n      end -= 5;\n      break;\n    }\n  }\n\n  snippet = this.buffer.slice(start, end);\n\n  return common.repeat(' ', indent) + head + snippet + tail + '\\n' +\n         common.repeat(' ', indent + this.position - start + head.length) + '^';\n};\n\n\nMark.prototype.toString = function toString(compact) {\n  var snippet, where = '';\n\n  if (this.name) {\n    where += 'in \"' + this.name + '\" ';\n  }\n\n  where += 'at line ' + (this.line + 1) + ', column ' + (this.column + 1);\n\n  if (!compact) {\n    snippet = this.getSnippet();\n\n    if (snippet) {\n      where += ':\\n' + snippet;\n    }\n  }\n\n  return where;\n};\n\n\nmodule.exports = Mark;\n\n\n/***/ }),\n/* 284 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar require;\n\n/*eslint-disable no-bitwise*/\n\nvar NodeBuffer;\n\ntry {\n  // A trick for browserified version, to not include `Buffer` shim\n  var _require = require;\n  NodeBuffer = __webpack_require__(64).Buffer;\n} catch (__) {}\n\nvar Type       = __webpack_require__(10);\n\n\n// [ 64, 65, 66 ] -> [ padding, CR, LF ]\nvar BASE64_MAP = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\\n\\r';\n\n\nfunction resolveYamlBinary(data) {\n  if (data === null) return false;\n\n  var code, idx, bitlen = 0, max = data.length, map = BASE64_MAP;\n\n  // Convert one by one.\n  for (idx = 0; idx < max; idx++) {\n    code = map.indexOf(data.charAt(idx));\n\n    // Skip CR/LF\n    if (code > 64) continue;\n\n    // Fail on illegal characters\n    if (code < 0) return false;\n\n    bitlen += 6;\n  }\n\n  // If there are any bits left, source was corrupted\n  return (bitlen % 8) === 0;\n}\n\nfunction constructYamlBinary(data) {\n  var idx, tailbits,\n      input = data.replace(/[\\r\\n=]/g, ''), // remove CR/LF & padding to simplify scan\n      max = input.length,\n      map = BASE64_MAP,\n      bits = 0,\n      result = [];\n\n  // Collect by 6*4 bits (3 bytes)\n\n  for (idx = 0; idx < max; idx++) {\n    if ((idx % 4 === 0) && idx) {\n      result.push((bits >> 16) & 0xFF);\n      result.push((bits >> 8) & 0xFF);\n      result.push(bits & 0xFF);\n    }\n\n    bits = (bits << 6) | map.indexOf(input.charAt(idx));\n  }\n\n  // Dump tail\n\n  tailbits = (max % 4) * 6;\n\n  if (tailbits === 0) {\n    result.push((bits >> 16) & 0xFF);\n    result.push((bits >> 8) & 0xFF);\n    result.push(bits & 0xFF);\n  } else if (tailbits === 18) {\n    result.push((bits >> 10) & 0xFF);\n    result.push((bits >> 2) & 0xFF);\n  } else if (tailbits === 12) {\n    result.push((bits >> 4) & 0xFF);\n  }\n\n  // Wrap into Buffer for NodeJS and leave Array for browser\n  if (NodeBuffer) {\n    // Support node 6.+ Buffer API when available\n    return NodeBuffer.from ? NodeBuffer.from(result) : new NodeBuffer(result);\n  }\n\n  return result;\n}\n\nfunction representYamlBinary(object /*, style*/) {\n  var result = '', bits = 0, idx, tail,\n      max = object.length,\n      map = BASE64_MAP;\n\n  // Convert every three bytes to 4 ASCII characters.\n\n  for (idx = 0; idx < max; idx++) {\n    if ((idx % 3 === 0) && idx) {\n      result += map[(bits >> 18) & 0x3F];\n      result += map[(bits >> 12) & 0x3F];\n      result += map[(bits >> 6) & 0x3F];\n      result += map[bits & 0x3F];\n    }\n\n    bits = (bits << 8) + object[idx];\n  }\n\n  // Dump tail\n\n  tail = max % 3;\n\n  if (tail === 0) {\n    result += map[(bits >> 18) & 0x3F];\n    result += map[(bits >> 12) & 0x3F];\n    result += map[(bits >> 6) & 0x3F];\n    result += map[bits & 0x3F];\n  } else if (tail === 2) {\n    result += map[(bits >> 10) & 0x3F];\n    result += map[(bits >> 4) & 0x3F];\n    result += map[(bits << 2) & 0x3F];\n    result += map[64];\n  } else if (tail === 1) {\n    result += map[(bits >> 2) & 0x3F];\n    result += map[(bits << 4) & 0x3F];\n    result += map[64];\n    result += map[64];\n  }\n\n  return result;\n}\n\nfunction isBinary(object) {\n  return NodeBuffer && NodeBuffer.isBuffer(object);\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:binary', {\n  kind: 'scalar',\n  resolve: resolveYamlBinary,\n  construct: constructYamlBinary,\n  predicate: isBinary,\n  represent: representYamlBinary\n});\n\n\n/***/ }),\n/* 285 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Type = __webpack_require__(10);\n\nfunction resolveYamlBoolean(data) {\n  if (data === null) return false;\n\n  var max = data.length;\n\n  return (max === 4 && (data === 'true' || data === 'True' || data === 'TRUE')) ||\n         (max === 5 && (data === 'false' || data === 'False' || data === 'FALSE'));\n}\n\nfunction constructYamlBoolean(data) {\n  return data === 'true' ||\n         data === 'True' ||\n         data === 'TRUE';\n}\n\nfunction isBoolean(object) {\n  return Object.prototype.toString.call(object) === '[object Boolean]';\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:bool', {\n  kind: 'scalar',\n  resolve: resolveYamlBoolean,\n  construct: constructYamlBoolean,\n  predicate: isBoolean,\n  represent: {\n    lowercase: function (object) { return object ? 'true' : 'false'; },\n    uppercase: function (object) { return object ? 'TRUE' : 'FALSE'; },\n    camelcase: function (object) { return object ? 'True' : 'False'; }\n  },\n  defaultStyle: 'lowercase'\n});\n\n\n/***/ }),\n/* 286 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar common = __webpack_require__(44);\nvar Type   = __webpack_require__(10);\n\nvar YAML_FLOAT_PATTERN = new RegExp(\n  // 2.5e4, 2.5 and integers\n  '^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?' +\n  // .2e4, .2\n  // special case, seems not from spec\n  '|\\\\.[0-9_]+(?:[eE][-+]?[0-9]+)?' +\n  // 20:59\n  '|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\\\.[0-9_]*' +\n  // .inf\n  '|[-+]?\\\\.(?:inf|Inf|INF)' +\n  // .nan\n  '|\\\\.(?:nan|NaN|NAN))$');\n\nfunction resolveYamlFloat(data) {\n  if (data === null) return false;\n\n  if (!YAML_FLOAT_PATTERN.test(data) ||\n      // Quick hack to not allow integers end with `_`\n      // Probably should update regexp & check speed\n      data[data.length - 1] === '_') {\n    return false;\n  }\n\n  return true;\n}\n\nfunction constructYamlFloat(data) {\n  var value, sign, base, digits;\n\n  value  = data.replace(/_/g, '').toLowerCase();\n  sign   = value[0] === '-' ? -1 : 1;\n  digits = [];\n\n  if ('+-'.indexOf(value[0]) >= 0) {\n    value = value.slice(1);\n  }\n\n  if (value === '.inf') {\n    return (sign === 1) ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;\n\n  } else if (value === '.nan') {\n    return NaN;\n\n  } else if (value.indexOf(':') >= 0) {\n    value.split(':').forEach(function (v) {\n      digits.unshift(parseFloat(v, 10));\n    });\n\n    value = 0.0;\n    base = 1;\n\n    digits.forEach(function (d) {\n      value += d * base;\n      base *= 60;\n    });\n\n    return sign * value;\n\n  }\n  return sign * parseFloat(value, 10);\n}\n\n\nvar SCIENTIFIC_WITHOUT_DOT = /^[-+]?[0-9]+e/;\n\nfunction representYamlFloat(object, style) {\n  var res;\n\n  if (isNaN(object)) {\n    switch (style) {\n      case 'lowercase': return '.nan';\n      case 'uppercase': return '.NAN';\n      case 'camelcase': return '.NaN';\n    }\n  } else if (Number.POSITIVE_INFINITY === object) {\n    switch (style) {\n      case 'lowercase': return '.inf';\n      case 'uppercase': return '.INF';\n      case 'camelcase': return '.Inf';\n    }\n  } else if (Number.NEGATIVE_INFINITY === object) {\n    switch (style) {\n      case 'lowercase': return '-.inf';\n      case 'uppercase': return '-.INF';\n      case 'camelcase': return '-.Inf';\n    }\n  } else if (common.isNegativeZero(object)) {\n    return '-0.0';\n  }\n\n  res = object.toString(10);\n\n  // JS stringifier can build scientific format without dots: 5e-100,\n  // while YAML requres dot: 5.e-100. Fix it with simple hack\n\n  return SCIENTIFIC_WITHOUT_DOT.test(res) ? res.replace('e', '.e') : res;\n}\n\nfunction isFloat(object) {\n  return (Object.prototype.toString.call(object) === '[object Number]') &&\n         (object % 1 !== 0 || common.isNegativeZero(object));\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:float', {\n  kind: 'scalar',\n  resolve: resolveYamlFloat,\n  construct: constructYamlFloat,\n  predicate: isFloat,\n  represent: representYamlFloat,\n  defaultStyle: 'lowercase'\n});\n\n\n/***/ }),\n/* 287 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar common = __webpack_require__(44);\nvar Type   = __webpack_require__(10);\n\nfunction isHexCode(c) {\n  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */)) ||\n         ((0x41/* A */ <= c) && (c <= 0x46/* F */)) ||\n         ((0x61/* a */ <= c) && (c <= 0x66/* f */));\n}\n\nfunction isOctCode(c) {\n  return ((0x30/* 0 */ <= c) && (c <= 0x37/* 7 */));\n}\n\nfunction isDecCode(c) {\n  return ((0x30/* 0 */ <= c) && (c <= 0x39/* 9 */));\n}\n\nfunction resolveYamlInteger(data) {\n  if (data === null) return false;\n\n  var max = data.length,\n      index = 0,\n      hasDigits = false,\n      ch;\n\n  if (!max) return false;\n\n  ch = data[index];\n\n  // sign\n  if (ch === '-' || ch === '+') {\n    ch = data[++index];\n  }\n\n  if (ch === '0') {\n    // 0\n    if (index + 1 === max) return true;\n    ch = data[++index];\n\n    // base 2, base 8, base 16\n\n    if (ch === 'b') {\n      // base 2\n      index++;\n\n      for (; index < max; index++) {\n        ch = data[index];\n        if (ch === '_') continue;\n        if (ch !== '0' && ch !== '1') return false;\n        hasDigits = true;\n      }\n      return hasDigits && ch !== '_';\n    }\n\n\n    if (ch === 'x') {\n      // base 16\n      index++;\n\n      for (; index < max; index++) {\n        ch = data[index];\n        if (ch === '_') continue;\n        if (!isHexCode(data.charCodeAt(index))) return false;\n        hasDigits = true;\n      }\n      return hasDigits && ch !== '_';\n    }\n\n    // base 8\n    for (; index < max; index++) {\n      ch = data[index];\n      if (ch === '_') continue;\n      if (!isOctCode(data.charCodeAt(index))) return false;\n      hasDigits = true;\n    }\n    return hasDigits && ch !== '_';\n  }\n\n  // base 10 (except 0) or base 60\n\n  // value should not start with `_`;\n  if (ch === '_') return false;\n\n  for (; index < max; index++) {\n    ch = data[index];\n    if (ch === '_') continue;\n    if (ch === ':') break;\n    if (!isDecCode(data.charCodeAt(index))) {\n      return false;\n    }\n    hasDigits = true;\n  }\n\n  // Should have digits and should not end with `_`\n  if (!hasDigits || ch === '_') return false;\n\n  // if !base60 - done;\n  if (ch !== ':') return true;\n\n  // base60 almost not used, no needs to optimize\n  return /^(:[0-5]?[0-9])+$/.test(data.slice(index));\n}\n\nfunction constructYamlInteger(data) {\n  var value = data, sign = 1, ch, base, digits = [];\n\n  if (value.indexOf('_') !== -1) {\n    value = value.replace(/_/g, '');\n  }\n\n  ch = value[0];\n\n  if (ch === '-' || ch === '+') {\n    if (ch === '-') sign = -1;\n    value = value.slice(1);\n    ch = value[0];\n  }\n\n  if (value === '0') return 0;\n\n  if (ch === '0') {\n    if (value[1] === 'b') return sign * parseInt(value.slice(2), 2);\n    if (value[1] === 'x') return sign * parseInt(value, 16);\n    return sign * parseInt(value, 8);\n  }\n\n  if (value.indexOf(':') !== -1) {\n    value.split(':').forEach(function (v) {\n      digits.unshift(parseInt(v, 10));\n    });\n\n    value = 0;\n    base = 1;\n\n    digits.forEach(function (d) {\n      value += (d * base);\n      base *= 60;\n    });\n\n    return sign * value;\n\n  }\n\n  return sign * parseInt(value, 10);\n}\n\nfunction isInteger(object) {\n  return (Object.prototype.toString.call(object)) === '[object Number]' &&\n         (object % 1 === 0 && !common.isNegativeZero(object));\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:int', {\n  kind: 'scalar',\n  resolve: resolveYamlInteger,\n  construct: constructYamlInteger,\n  predicate: isInteger,\n  represent: {\n    binary:      function (obj) { return obj >= 0 ? '0b' + obj.toString(2) : '-0b' + obj.toString(2).slice(1); },\n    octal:       function (obj) { return obj >= 0 ? '0'  + obj.toString(8) : '-0'  + obj.toString(8).slice(1); },\n    decimal:     function (obj) { return obj.toString(10); },\n    /* eslint-disable max-len */\n    hexadecimal: function (obj) { return obj >= 0 ? '0x' + obj.toString(16).toUpperCase() :  '-0x' + obj.toString(16).toUpperCase().slice(1); }\n  },\n  defaultStyle: 'decimal',\n  styleAliases: {\n    binary:      [ 2,  'bin' ],\n    octal:       [ 8,  'oct' ],\n    decimal:     [ 10, 'dec' ],\n    hexadecimal: [ 16, 'hex' ]\n  }\n});\n\n\n/***/ }),\n/* 288 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\nvar require;\n\nvar esprima;\n\n// Browserified version does not have esprima\n//\n// 1. For node.js just require module as deps\n// 2. For browser try to require mudule via external AMD system.\n//    If not found - try to fallback to window.esprima. If not\n//    found too - then fail to parse.\n//\ntry {\n  // workaround to exclude package from browserify list.\n  var _require = require;\n  esprima = __webpack_require__(265);\n} catch (_) {\n  /*global window */\n  if (typeof window !== 'undefined') esprima = window.esprima;\n}\n\nvar Type = __webpack_require__(10);\n\nfunction resolveJavascriptFunction(data) {\n  if (data === null) return false;\n\n  try {\n    var source = '(' + data + ')',\n        ast    = esprima.parse(source, { range: true });\n\n    if (ast.type                    !== 'Program'             ||\n        ast.body.length             !== 1                     ||\n        ast.body[0].type            !== 'ExpressionStatement' ||\n        (ast.body[0].expression.type !== 'ArrowFunctionExpression' &&\n          ast.body[0].expression.type !== 'FunctionExpression')) {\n      return false;\n    }\n\n    return true;\n  } catch (err) {\n    return false;\n  }\n}\n\nfunction constructJavascriptFunction(data) {\n  /*jslint evil:true*/\n\n  var source = '(' + data + ')',\n      ast    = esprima.parse(source, { range: true }),\n      params = [],\n      body;\n\n  if (ast.type                    !== 'Program'             ||\n      ast.body.length             !== 1                     ||\n      ast.body[0].type            !== 'ExpressionStatement' ||\n      (ast.body[0].expression.type !== 'ArrowFunctionExpression' &&\n        ast.body[0].expression.type !== 'FunctionExpression')) {\n    throw new Error('Failed to resolve function');\n  }\n\n  ast.body[0].expression.params.forEach(function (param) {\n    params.push(param.name);\n  });\n\n  body = ast.body[0].expression.body.range;\n\n  // Esprima's ranges include the first '{' and the last '}' characters on\n  // function expressions. So cut them out.\n  if (ast.body[0].expression.body.type === 'BlockStatement') {\n    /*eslint-disable no-new-func*/\n    return new Function(params, source.slice(body[0] + 1, body[1] - 1));\n  }\n  // ES6 arrow functions can omit the BlockStatement. In that case, just return\n  // the body.\n  /*eslint-disable no-new-func*/\n  return new Function(params, 'return ' + source.slice(body[0], body[1]));\n}\n\nfunction representJavascriptFunction(object /*, style*/) {\n  return object.toString();\n}\n\nfunction isFunction(object) {\n  return Object.prototype.toString.call(object) === '[object Function]';\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:js/function', {\n  kind: 'scalar',\n  resolve: resolveJavascriptFunction,\n  construct: constructJavascriptFunction,\n  predicate: isFunction,\n  represent: representJavascriptFunction\n});\n\n\n/***/ }),\n/* 289 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Type = __webpack_require__(10);\n\nfunction resolveJavascriptRegExp(data) {\n  if (data === null) return false;\n  if (data.length === 0) return false;\n\n  var regexp = data,\n      tail   = /\\/([gim]*)$/.exec(data),\n      modifiers = '';\n\n  // if regexp starts with '/' it can have modifiers and must be properly closed\n  // `/foo/gim` - modifiers tail can be maximum 3 chars\n  if (regexp[0] === '/') {\n    if (tail) modifiers = tail[1];\n\n    if (modifiers.length > 3) return false;\n    // if expression starts with /, is should be properly terminated\n    if (regexp[regexp.length - modifiers.length - 1] !== '/') return false;\n  }\n\n  return true;\n}\n\nfunction constructJavascriptRegExp(data) {\n  var regexp = data,\n      tail   = /\\/([gim]*)$/.exec(data),\n      modifiers = '';\n\n  // `/foo/gim` - tail can be maximum 4 chars\n  if (regexp[0] === '/') {\n    if (tail) modifiers = tail[1];\n    regexp = regexp.slice(1, regexp.length - modifiers.length - 1);\n  }\n\n  return new RegExp(regexp, modifiers);\n}\n\nfunction representJavascriptRegExp(object /*, style*/) {\n  var result = '/' + object.source + '/';\n\n  if (object.global) result += 'g';\n  if (object.multiline) result += 'm';\n  if (object.ignoreCase) result += 'i';\n\n  return result;\n}\n\nfunction isRegExp(object) {\n  return Object.prototype.toString.call(object) === '[object RegExp]';\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:js/regexp', {\n  kind: 'scalar',\n  resolve: resolveJavascriptRegExp,\n  construct: constructJavascriptRegExp,\n  predicate: isRegExp,\n  represent: representJavascriptRegExp\n});\n\n\n/***/ }),\n/* 290 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Type = __webpack_require__(10);\n\nfunction resolveJavascriptUndefined() {\n  return true;\n}\n\nfunction constructJavascriptUndefined() {\n  /*eslint-disable no-undefined*/\n  return undefined;\n}\n\nfunction representJavascriptUndefined() {\n  return '';\n}\n\nfunction isUndefined(object) {\n  return typeof object === 'undefined';\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:js/undefined', {\n  kind: 'scalar',\n  resolve: resolveJavascriptUndefined,\n  construct: constructJavascriptUndefined,\n  predicate: isUndefined,\n  represent: representJavascriptUndefined\n});\n\n\n/***/ }),\n/* 291 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Type = __webpack_require__(10);\n\nmodule.exports = new Type('tag:yaml.org,2002:map', {\n  kind: 'mapping',\n  construct: function (data) { return data !== null ? data : {}; }\n});\n\n\n/***/ }),\n/* 292 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Type = __webpack_require__(10);\n\nfunction resolveYamlMerge(data) {\n  return data === '<<' || data === null;\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:merge', {\n  kind: 'scalar',\n  resolve: resolveYamlMerge\n});\n\n\n/***/ }),\n/* 293 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Type = __webpack_require__(10);\n\nfunction resolveYamlNull(data) {\n  if (data === null) return true;\n\n  var max = data.length;\n\n  return (max === 1 && data === '~') ||\n         (max === 4 && (data === 'null' || data === 'Null' || data === 'NULL'));\n}\n\nfunction constructYamlNull() {\n  return null;\n}\n\nfunction isNull(object) {\n  return object === null;\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:null', {\n  kind: 'scalar',\n  resolve: resolveYamlNull,\n  construct: constructYamlNull,\n  predicate: isNull,\n  represent: {\n    canonical: function () { return '~';    },\n    lowercase: function () { return 'null'; },\n    uppercase: function () { return 'NULL'; },\n    camelcase: function () { return 'Null'; }\n  },\n  defaultStyle: 'lowercase'\n});\n\n\n/***/ }),\n/* 294 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Type = __webpack_require__(10);\n\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\nvar _toString       = Object.prototype.toString;\n\nfunction resolveYamlOmap(data) {\n  if (data === null) return true;\n\n  var objectKeys = [], index, length, pair, pairKey, pairHasKey,\n      object = data;\n\n  for (index = 0, length = object.length; index < length; index += 1) {\n    pair = object[index];\n    pairHasKey = false;\n\n    if (_toString.call(pair) !== '[object Object]') return false;\n\n    for (pairKey in pair) {\n      if (_hasOwnProperty.call(pair, pairKey)) {\n        if (!pairHasKey) pairHasKey = true;\n        else return false;\n      }\n    }\n\n    if (!pairHasKey) return false;\n\n    if (objectKeys.indexOf(pairKey) === -1) objectKeys.push(pairKey);\n    else return false;\n  }\n\n  return true;\n}\n\nfunction constructYamlOmap(data) {\n  return data !== null ? data : [];\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:omap', {\n  kind: 'sequence',\n  resolve: resolveYamlOmap,\n  construct: constructYamlOmap\n});\n\n\n/***/ }),\n/* 295 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Type = __webpack_require__(10);\n\nvar _toString = Object.prototype.toString;\n\nfunction resolveYamlPairs(data) {\n  if (data === null) return true;\n\n  var index, length, pair, keys, result,\n      object = data;\n\n  result = new Array(object.length);\n\n  for (index = 0, length = object.length; index < length; index += 1) {\n    pair = object[index];\n\n    if (_toString.call(pair) !== '[object Object]') return false;\n\n    keys = Object.keys(pair);\n\n    if (keys.length !== 1) return false;\n\n    result[index] = [ keys[0], pair[keys[0]] ];\n  }\n\n  return true;\n}\n\nfunction constructYamlPairs(data) {\n  if (data === null) return [];\n\n  var index, length, pair, keys, result,\n      object = data;\n\n  result = new Array(object.length);\n\n  for (index = 0, length = object.length; index < length; index += 1) {\n    pair = object[index];\n\n    keys = Object.keys(pair);\n\n    result[index] = [ keys[0], pair[keys[0]] ];\n  }\n\n  return result;\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:pairs', {\n  kind: 'sequence',\n  resolve: resolveYamlPairs,\n  construct: constructYamlPairs\n});\n\n\n/***/ }),\n/* 296 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Type = __webpack_require__(10);\n\nmodule.exports = new Type('tag:yaml.org,2002:seq', {\n  kind: 'sequence',\n  construct: function (data) { return data !== null ? data : []; }\n});\n\n\n/***/ }),\n/* 297 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Type = __webpack_require__(10);\n\nvar _hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction resolveYamlSet(data) {\n  if (data === null) return true;\n\n  var key, object = data;\n\n  for (key in object) {\n    if (_hasOwnProperty.call(object, key)) {\n      if (object[key] !== null) return false;\n    }\n  }\n\n  return true;\n}\n\nfunction constructYamlSet(data) {\n  return data !== null ? data : {};\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:set', {\n  kind: 'mapping',\n  resolve: resolveYamlSet,\n  construct: constructYamlSet\n});\n\n\n/***/ }),\n/* 298 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Type = __webpack_require__(10);\n\nmodule.exports = new Type('tag:yaml.org,2002:str', {\n  kind: 'scalar',\n  construct: function (data) { return data !== null ? data : ''; }\n});\n\n\n/***/ }),\n/* 299 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Type = __webpack_require__(10);\n\nvar YAML_DATE_REGEXP = new RegExp(\n  '^([0-9][0-9][0-9][0-9])'          + // [1] year\n  '-([0-9][0-9])'                    + // [2] month\n  '-([0-9][0-9])$');                   // [3] day\n\nvar YAML_TIMESTAMP_REGEXP = new RegExp(\n  '^([0-9][0-9][0-9][0-9])'          + // [1] year\n  '-([0-9][0-9]?)'                   + // [2] month\n  '-([0-9][0-9]?)'                   + // [3] day\n  '(?:[Tt]|[ \\\\t]+)'                 + // ...\n  '([0-9][0-9]?)'                    + // [4] hour\n  ':([0-9][0-9])'                    + // [5] minute\n  ':([0-9][0-9])'                    + // [6] second\n  '(?:\\\\.([0-9]*))?'                 + // [7] fraction\n  '(?:[ \\\\t]*(Z|([-+])([0-9][0-9]?)' + // [8] tz [9] tz_sign [10] tz_hour\n  '(?::([0-9][0-9]))?))?$');           // [11] tz_minute\n\nfunction resolveYamlTimestamp(data) {\n  if (data === null) return false;\n  if (YAML_DATE_REGEXP.exec(data) !== null) return true;\n  if (YAML_TIMESTAMP_REGEXP.exec(data) !== null) return true;\n  return false;\n}\n\nfunction constructYamlTimestamp(data) {\n  var match, year, month, day, hour, minute, second, fraction = 0,\n      delta = null, tz_hour, tz_minute, date;\n\n  match = YAML_DATE_REGEXP.exec(data);\n  if (match === null) match = YAML_TIMESTAMP_REGEXP.exec(data);\n\n  if (match === null) throw new Error('Date resolve error');\n\n  // match: [1] year [2] month [3] day\n\n  year = +(match[1]);\n  month = +(match[2]) - 1; // JS month starts with 0\n  day = +(match[3]);\n\n  if (!match[4]) { // no hour\n    return new Date(Date.UTC(year, month, day));\n  }\n\n  // match: [4] hour [5] minute [6] second [7] fraction\n\n  hour = +(match[4]);\n  minute = +(match[5]);\n  second = +(match[6]);\n\n  if (match[7]) {\n    fraction = match[7].slice(0, 3);\n    while (fraction.length < 3) { // milli-seconds\n      fraction += '0';\n    }\n    fraction = +fraction;\n  }\n\n  // match: [8] tz [9] tz_sign [10] tz_hour [11] tz_minute\n\n  if (match[9]) {\n    tz_hour = +(match[10]);\n    tz_minute = +(match[11] || 0);\n    delta = (tz_hour * 60 + tz_minute) * 60000; // delta in mili-seconds\n    if (match[9] === '-') delta = -delta;\n  }\n\n  date = new Date(Date.UTC(year, month, day, hour, minute, second, fraction));\n\n  if (delta) date.setTime(date.getTime() - delta);\n\n  return date;\n}\n\nfunction representYamlTimestamp(object /*, style*/) {\n  return object.toISOString();\n}\n\nmodule.exports = new Type('tag:yaml.org,2002:timestamp', {\n  kind: 'scalar',\n  resolve: resolveYamlTimestamp,\n  construct: constructYamlTimestamp,\n  instanceOf: Date,\n  represent: representYamlTimestamp\n});\n\n\n/***/ }),\n/* 300 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar win32 = process && process.platform === 'win32';\nvar path = __webpack_require__(0);\nvar fileRe = __webpack_require__(614);\nvar utils = module.exports;\n\n/**\n * Module dependencies\n */\n\nutils.diff = __webpack_require__(755);\nutils.unique = __webpack_require__(756);\nutils.braces = __webpack_require__(757);\nutils.brackets = __webpack_require__(607);\nutils.extglob = __webpack_require__(612);\nutils.isExtglob = __webpack_require__(178);\nutils.isGlob = __webpack_require__(179);\nutils.typeOf = __webpack_require__(180);\nutils.normalize = __webpack_require__(765);\nutils.omit = __webpack_require__(769);\nutils.parseGlob = __webpack_require__(773);\nutils.cache = __webpack_require__(795);\n\n/**\n * Get the filename of a filepath\n *\n * @param {String} `string`\n * @return {String}\n */\n\nutils.filename = function filename(fp) {\n  var seg = fp.match(fileRe());\n  return seg && seg[0];\n};\n\n/**\n * Returns a function that returns true if the given\n * pattern is the same as a given `filepath`\n *\n * @param {String} `pattern`\n * @return {Function}\n */\n\nutils.isPath = function isPath(pattern, opts) {\n  opts = opts || {};\n  return function(fp) {\n    var unixified = utils.unixify(fp, opts);\n    if(opts.nocase){\n      return pattern.toLowerCase() === unixified.toLowerCase();\n    }\n    return pattern === unixified;\n  };\n};\n\n/**\n * Returns a function that returns true if the given\n * pattern contains a `filepath`\n *\n * @param {String} `pattern`\n * @return {Function}\n */\n\nutils.hasPath = function hasPath(pattern, opts) {\n  return function(fp) {\n    return utils.unixify(pattern, opts).indexOf(fp) !== -1;\n  };\n};\n\n/**\n * Returns a function that returns true if the given\n * pattern matches or contains a `filepath`\n *\n * @param {String} `pattern`\n * @return {Function}\n */\n\nutils.matchPath = function matchPath(pattern, opts) {\n  var fn = (opts && opts.contains)\n    ? utils.hasPath(pattern, opts)\n    : utils.isPath(pattern, opts);\n  return fn;\n};\n\n/**\n * Returns a function that returns true if the given\n * regex matches the `filename` of a file path.\n *\n * @param {RegExp} `re`\n * @return {Boolean}\n */\n\nutils.hasFilename = function hasFilename(re) {\n  return function(fp) {\n    var name = utils.filename(fp);\n    return name && re.test(name);\n  };\n};\n\n/**\n * Coerce `val` to an array\n *\n * @param  {*} val\n * @return {Array}\n */\n\nutils.arrayify = function arrayify(val) {\n  return !Array.isArray(val)\n    ? [val]\n    : val;\n};\n\n/**\n * Normalize all slashes in a file path or glob pattern to\n * forward slashes.\n */\n\nutils.unixify = function unixify(fp, opts) {\n  if (opts && opts.unixify === false) return fp;\n  if (opts && opts.unixify === true || win32 || path.sep === '\\\\') {\n    return utils.normalize(fp, false);\n  }\n  if (opts && opts.unescape === true) {\n    return fp ? fp.toString().replace(/\\\\(\\w)/g, '$1') : '';\n  }\n  return fp;\n};\n\n/**\n * Escape/unescape utils\n */\n\nutils.escapePath = function escapePath(fp) {\n  return fp.replace(/[\\\\.]/g, '\\\\$&');\n};\n\nutils.unescapeGlob = function unescapeGlob(fp) {\n  return fp.replace(/[\\\\\"']/g, '');\n};\n\nutils.escapeRe = function escapeRe(str) {\n  return str.replace(/[-[\\\\$*+?.#^\\s{}(|)\\]]/g, '\\\\$&');\n};\n\n/**\n * Expose `utils`\n */\n\nmodule.exports = utils;\n\n\n/***/ }),\n/* 301 */\n/***/ (function(module, exports) {\n\n/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isNaN(val) === false) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  if (ms >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (ms >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (ms >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (ms >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  return plural(ms, d, 'day') ||\n    plural(ms, h, 'hour') ||\n    plural(ms, m, 'minute') ||\n    plural(ms, s, 'second') ||\n    ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n  if (ms < n) {\n    return;\n  }\n  if (ms < n * 1.5) {\n    return Math.floor(ms / n) + ' ' + name;\n  }\n  return Math.ceil(ms / n) + ' ' + name + 's';\n}\n\n\n/***/ }),\n/* 302 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(763);\n\n/***/ }),\n/* 303 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc');  // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n/***/ }),\n/* 304 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;(function (root, factory){\n  'use strict';\n\n  /*istanbul ignore next:cant test*/\n  if (typeof module === 'object' && typeof module.exports === 'object') {\n    module.exports = factory();\n  } else if (true) {\n    // AMD. Register as an anonymous module.\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else {\n    // Browser globals\n    root.objectPath = factory();\n  }\n})(this, function(){\n  'use strict';\n\n  var toStr = Object.prototype.toString;\n  function hasOwnProperty(obj, prop) {\n    if(obj == null) {\n      return false\n    }\n    //to handle objects with null prototypes (too edge case?)\n    return Object.prototype.hasOwnProperty.call(obj, prop)\n  }\n\n  function isEmpty(value){\n    if (!value) {\n      return true;\n    }\n    if (isArray(value) && value.length === 0) {\n        return true;\n    } else if (typeof value !== 'string') {\n        for (var i in value) {\n            if (hasOwnProperty(value, i)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    return false;\n  }\n\n  function toString(type){\n    return toStr.call(type);\n  }\n\n  function isObject(obj){\n    return typeof obj === 'object' && toString(obj) === \"[object Object]\";\n  }\n\n  var isArray = Array.isArray || function(obj){\n    /*istanbul ignore next:cant test*/\n    return toStr.call(obj) === '[object Array]';\n  }\n\n  function isBoolean(obj){\n    return typeof obj === 'boolean' || toString(obj) === '[object Boolean]';\n  }\n\n  function getKey(key){\n    var intKey = parseInt(key);\n    if (intKey.toString() === key) {\n      return intKey;\n    }\n    return key;\n  }\n\n  function factory(options) {\n    options = options || {}\n\n    var objectPath = function(obj) {\n      return Object.keys(objectPath).reduce(function(proxy, prop) {\n        if(prop === 'create') {\n          return proxy;\n        }\n\n        /*istanbul ignore else*/\n        if (typeof objectPath[prop] === 'function') {\n          proxy[prop] = objectPath[prop].bind(objectPath, obj);\n        }\n\n        return proxy;\n      }, {});\n    };\n\n    function hasShallowProperty(obj, prop) {\n      return (options.includeInheritedProps || (typeof prop === 'number' && Array.isArray(obj)) || hasOwnProperty(obj, prop))\n    }\n\n    function getShallowProperty(obj, prop) {\n      if (hasShallowProperty(obj, prop)) {\n        return obj[prop];\n      }\n    }\n\n    function set(obj, path, value, doNotReplace){\n      if (typeof path === 'number') {\n        path = [path];\n      }\n      if (!path || path.length === 0) {\n        return obj;\n      }\n      if (typeof path === 'string') {\n        return set(obj, path.split('.').map(getKey), value, doNotReplace);\n      }\n      var currentPath = path[0];\n      var currentValue = getShallowProperty(obj, currentPath);\n      if (path.length === 1) {\n        if (currentValue === void 0 || !doNotReplace) {\n          obj[currentPath] = value;\n        }\n        return currentValue;\n      }\n\n      if (currentValue === void 0) {\n        //check if we assume an array\n        if(typeof path[1] === 'number') {\n          obj[currentPath] = [];\n        } else {\n          obj[currentPath] = {};\n        }\n      }\n\n      return set(obj[currentPath], path.slice(1), value, doNotReplace);\n    }\n\n    objectPath.has = function (obj, path) {\n      if (typeof path === 'number') {\n        path = [path];\n      } else if (typeof path === 'string') {\n        path = path.split('.');\n      }\n\n      if (!path || path.length === 0) {\n        return !!obj;\n      }\n\n      for (var i = 0; i < path.length; i++) {\n        var j = getKey(path[i]);\n\n        if((typeof j === 'number' && isArray(obj) && j < obj.length) ||\n          (options.includeInheritedProps ? (j in Object(obj)) : hasOwnProperty(obj, j))) {\n          obj = obj[j];\n        } else {\n          return false;\n        }\n      }\n\n      return true;\n    };\n\n    objectPath.ensureExists = function (obj, path, value){\n      return set(obj, path, value, true);\n    };\n\n    objectPath.set = function (obj, path, value, doNotReplace){\n      return set(obj, path, value, doNotReplace);\n    };\n\n    objectPath.insert = function (obj, path, value, at){\n      var arr = objectPath.get(obj, path);\n      at = ~~at;\n      if (!isArray(arr)) {\n        arr = [];\n        objectPath.set(obj, path, arr);\n      }\n      arr.splice(at, 0, value);\n    };\n\n    objectPath.empty = function(obj, path) {\n      if (isEmpty(path)) {\n        return void 0;\n      }\n      if (obj == null) {\n        return void 0;\n      }\n\n      var value, i;\n      if (!(value = objectPath.get(obj, path))) {\n        return void 0;\n      }\n\n      if (typeof value === 'string') {\n        return objectPath.set(obj, path, '');\n      } else if (isBoolean(value)) {\n        return objectPath.set(obj, path, false);\n      } else if (typeof value === 'number') {\n        return objectPath.set(obj, path, 0);\n      } else if (isArray(value)) {\n        value.length = 0;\n      } else if (isObject(value)) {\n        for (i in value) {\n          if (hasShallowProperty(value, i)) {\n            delete value[i];\n          }\n        }\n      } else {\n        return objectPath.set(obj, path, null);\n      }\n    };\n\n    objectPath.push = function (obj, path /*, values */){\n      var arr = objectPath.get(obj, path);\n      if (!isArray(arr)) {\n        arr = [];\n        objectPath.set(obj, path, arr);\n      }\n\n      arr.push.apply(arr, Array.prototype.slice.call(arguments, 2));\n    };\n\n    objectPath.coalesce = function (obj, paths, defaultValue) {\n      var value;\n\n      for (var i = 0, len = paths.length; i < len; i++) {\n        if ((value = objectPath.get(obj, paths[i])) !== void 0) {\n          return value;\n        }\n      }\n\n      return defaultValue;\n    };\n\n    objectPath.get = function (obj, path, defaultValue){\n      if (typeof path === 'number') {\n        path = [path];\n      }\n      if (!path || path.length === 0) {\n        return obj;\n      }\n      if (obj == null) {\n        return defaultValue;\n      }\n      if (typeof path === 'string') {\n        return objectPath.get(obj, path.split('.'), defaultValue);\n      }\n\n      var currentPath = getKey(path[0]);\n      var nextObj = getShallowProperty(obj, currentPath)\n      if (nextObj === void 0) {\n        return defaultValue;\n      }\n\n      if (path.length === 1) {\n        return nextObj;\n      }\n\n      return objectPath.get(obj[currentPath], path.slice(1), defaultValue);\n    };\n\n    objectPath.del = function del(obj, path) {\n      if (typeof path === 'number') {\n        path = [path];\n      }\n\n      if (obj == null) {\n        return obj;\n      }\n\n      if (isEmpty(path)) {\n        return obj;\n      }\n      if(typeof path === 'string') {\n        return objectPath.del(obj, path.split('.'));\n      }\n\n      var currentPath = getKey(path[0]);\n      if (!hasShallowProperty(obj, currentPath)) {\n        return obj;\n      }\n\n      if(path.length === 1) {\n        if (isArray(obj)) {\n          obj.splice(currentPath, 1);\n        } else {\n          delete obj[currentPath];\n        }\n      } else {\n        return objectPath.del(obj[currentPath], path.slice(1));\n      }\n\n      return obj;\n    }\n\n    return objectPath;\n  }\n\n  var mod = factory();\n  mod.create = factory;\n  mod.withInheritedProps = factory({includeInheritedProps: true})\n  return mod;\n});\n\n\n/***/ }),\n/* 305 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_RESULT__;/*! https://mths.be/punycode v1.4.1 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow new RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t    counter = 0,\n\t\t    length = string.length,\n\t\t    value,\n\t\t    extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t//  0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t    inputLength = input.length,\n\t\t    out,\n\t\t    i = 0,\n\t\t    n = initialN,\n\t\t    bias = initialBias,\n\t\t    basic,\n\t\t    j,\n\t\t    index,\n\t\t    oldi,\n\t\t    w,\n\t\t    k,\n\t\t    digit,\n\t\t    t,\n\t\t    /** Cached calculation results */\n\t\t    baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t    delta,\n\t\t    handledCPCount,\n\t\t    basicLength,\n\t\t    bias,\n\t\t    j,\n\t\t    m,\n\t\t    q,\n\t\t    k,\n\t\t    t,\n\t\t    currentValue,\n\t\t    output = [],\n\t\t    /** `inputLength` will hold the number of code points in `input`. */\n\t\t    inputLength,\n\t\t    /** Cached calculation results */\n\t\t    handledCPCountPlusOne,\n\t\t    baseMinusT,\n\t\t    qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.4.1',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttrue\n\t) {\n\t\t!(__WEBPACK_AMD_DEFINE_RESULT__ = function() {\n\t\t\treturn punycode;\n\t\t}.call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) {\n\t\t\t// in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else {\n\t\t\t// in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(121)(module)))\n\n/***/ }),\n/* 306 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar jsonSafeStringify = __webpack_require__(745)\nvar crypto = __webpack_require__(11)\nvar Buffer = __webpack_require__(46).Buffer\n\nvar defer = typeof setImmediate === 'undefined'\n  ? process.nextTick\n  : setImmediate\n\nfunction paramsHaveRequestBody (params) {\n  return (\n    params.body ||\n    params.requestBodyStream ||\n    (params.json && typeof params.json !== 'boolean') ||\n    params.multipart\n  )\n}\n\nfunction safeStringify (obj, replacer) {\n  var ret\n  try {\n    ret = JSON.stringify(obj, replacer)\n  } catch (e) {\n    ret = jsonSafeStringify(obj, replacer)\n  }\n  return ret\n}\n\nfunction md5 (str) {\n  return crypto.createHash('md5').update(str).digest('hex')\n}\n\nfunction isReadStream (rs) {\n  return rs.readable && rs.path && rs.mode\n}\n\nfunction toBase64 (str) {\n  return Buffer.from(str || '', 'utf8').toString('base64')\n}\n\nfunction copy (obj) {\n  var o = {}\n  Object.keys(obj).forEach(function (i) {\n    o[i] = obj[i]\n  })\n  return o\n}\n\nfunction version () {\n  var numbers = process.version.replace('v', '').split('.')\n  return {\n    major: parseInt(numbers[0], 10),\n    minor: parseInt(numbers[1], 10),\n    patch: parseInt(numbers[2], 10)\n  }\n}\n\nexports.paramsHaveRequestBody = paramsHaveRequestBody\nexports.safeStringify = safeStringify\nexports.md5 = md5\nexports.isReadStream = isReadStream\nexports.toBase64 = toBase64\nexports.copy = copy\nexports.version = version\nexports.defer = defer\n\n\n/***/ }),\n/* 307 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar current = (process.versions && process.versions.node && process.versions.node.split('.')) || [];\n\nfunction specifierIncluded(specifier) {\n    var parts = specifier.split(' ');\n    var op = parts.length > 1 ? parts[0] : '=';\n    var versionParts = (parts.length > 1 ? parts[1] : parts[0]).split('.');\n\n    for (var i = 0; i < 3; ++i) {\n        var cur = Number(current[i] || 0);\n        var ver = Number(versionParts[i] || 0);\n        if (cur === ver) {\n            continue; // eslint-disable-line no-restricted-syntax, no-continue\n        }\n        if (op === '<') {\n            return cur < ver;\n        } else if (op === '>=') {\n            return cur >= ver;\n        } else {\n            return false;\n        }\n    }\n    return op === '>=';\n}\n\nfunction matchesRange(range) {\n    var specifiers = range.split(/ ?&& ?/);\n    if (specifiers.length === 0) { return false; }\n    for (var i = 0; i < specifiers.length; ++i) {\n        if (!specifierIncluded(specifiers[i])) { return false; }\n    }\n    return true;\n}\n\nfunction versionIncluded(specifierValue) {\n    if (typeof specifierValue === 'boolean') { return specifierValue; }\n    if (specifierValue && typeof specifierValue === 'object') {\n        for (var i = 0; i < specifierValue.length; ++i) {\n            if (matchesRange(specifierValue[i])) { return true; }\n        }\n        return false;\n    }\n    return matchesRange(specifierValue);\n}\n\nvar data = __webpack_require__(816);\n\nvar core = {};\nfor (var mod in data) { // eslint-disable-line no-restricted-syntax\n    if (Object.prototype.hasOwnProperty.call(data, mod)) {\n        core[mod] = versionIncluded(data[mod]);\n    }\n}\nmodule.exports = core;\n\n\n/***/ }),\n/* 308 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = rimraf\nrimraf.sync = rimrafSync\n\nvar assert = __webpack_require__(29)\nvar path = __webpack_require__(0)\nvar fs = __webpack_require__(4)\nvar glob = __webpack_require__(99)\nvar _0666 = parseInt('666', 8)\n\nvar defaultGlobOpts = {\n  nosort: true,\n  silent: true\n}\n\n// for EMFILE handling\nvar timeout = 0\n\nvar isWindows = (process.platform === \"win32\")\n\nfunction defaults (options) {\n  var methods = [\n    'unlink',\n    'chmod',\n    'stat',\n    'lstat',\n    'rmdir',\n    'readdir'\n  ]\n  methods.forEach(function(m) {\n    options[m] = options[m] || fs[m]\n    m = m + 'Sync'\n    options[m] = options[m] || fs[m]\n  })\n\n  options.maxBusyTries = options.maxBusyTries || 3\n  options.emfileWait = options.emfileWait || 1000\n  if (options.glob === false) {\n    options.disableGlob = true\n  }\n  options.disableGlob = options.disableGlob || false\n  options.glob = options.glob || defaultGlobOpts\n}\n\nfunction rimraf (p, options, cb) {\n  if (typeof options === 'function') {\n    cb = options\n    options = {}\n  }\n\n  assert(p, 'rimraf: missing path')\n  assert.equal(typeof p, 'string', 'rimraf: path should be a string')\n  assert.equal(typeof cb, 'function', 'rimraf: callback function required')\n  assert(options, 'rimraf: invalid options argument provided')\n  assert.equal(typeof options, 'object', 'rimraf: options should be object')\n\n  defaults(options)\n\n  var busyTries = 0\n  var errState = null\n  var n = 0\n\n  if (options.disableGlob || !glob.hasMagic(p))\n    return afterGlob(null, [p])\n\n  options.lstat(p, function (er, stat) {\n    if (!er)\n      return afterGlob(null, [p])\n\n    glob(p, options.glob, afterGlob)\n  })\n\n  function next (er) {\n    errState = errState || er\n    if (--n === 0)\n      cb(errState)\n  }\n\n  function afterGlob (er, results) {\n    if (er)\n      return cb(er)\n\n    n = results.length\n    if (n === 0)\n      return cb()\n\n    results.forEach(function (p) {\n      rimraf_(p, options, function CB (er) {\n        if (er) {\n          if ((er.code === \"EBUSY\" || er.code === \"ENOTEMPTY\" || er.code === \"EPERM\") &&\n              busyTries < options.maxBusyTries) {\n            busyTries ++\n            var time = busyTries * 100\n            // try again, with the same exact callback as this one.\n            return setTimeout(function () {\n              rimraf_(p, options, CB)\n            }, time)\n          }\n\n          // this one won't happen if graceful-fs is used.\n          if (er.code === \"EMFILE\" && timeout < options.emfileWait) {\n            return setTimeout(function () {\n              rimraf_(p, options, CB)\n            }, timeout ++)\n          }\n\n          // already gone\n          if (er.code === \"ENOENT\") er = null\n        }\n\n        timeout = 0\n        next(er)\n      })\n    })\n  }\n}\n\n// Two possible strategies.\n// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR\n// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR\n//\n// Both result in an extra syscall when you guess wrong.  However, there\n// are likely far more normal files in the world than directories.  This\n// is based on the assumption that a the average number of files per\n// directory is >= 1.\n//\n// If anyone ever complains about this, then I guess the strategy could\n// be made configurable somehow.  But until then, YAGNI.\nfunction rimraf_ (p, options, cb) {\n  assert(p)\n  assert(options)\n  assert(typeof cb === 'function')\n\n  // sunos lets the root user unlink directories, which is... weird.\n  // so we have to lstat here and make sure it's not a dir.\n  options.lstat(p, function (er, st) {\n    if (er && er.code === \"ENOENT\")\n      return cb(null)\n\n    // Windows can EPERM on stat.  Life is suffering.\n    if (er && er.code === \"EPERM\" && isWindows)\n      fixWinEPERM(p, options, er, cb)\n\n    if (st && st.isDirectory())\n      return rmdir(p, options, er, cb)\n\n    options.unlink(p, function (er) {\n      if (er) {\n        if (er.code === \"ENOENT\")\n          return cb(null)\n        if (er.code === \"EPERM\")\n          return (isWindows)\n            ? fixWinEPERM(p, options, er, cb)\n            : rmdir(p, options, er, cb)\n        if (er.code === \"EISDIR\")\n          return rmdir(p, options, er, cb)\n      }\n      return cb(er)\n    })\n  })\n}\n\nfunction fixWinEPERM (p, options, er, cb) {\n  assert(p)\n  assert(options)\n  assert(typeof cb === 'function')\n  if (er)\n    assert(er instanceof Error)\n\n  options.chmod(p, _0666, function (er2) {\n    if (er2)\n      cb(er2.code === \"ENOENT\" ? null : er)\n    else\n      options.stat(p, function(er3, stats) {\n        if (er3)\n          cb(er3.code === \"ENOENT\" ? null : er)\n        else if (stats.isDirectory())\n          rmdir(p, options, er, cb)\n        else\n          options.unlink(p, cb)\n      })\n  })\n}\n\nfunction fixWinEPERMSync (p, options, er) {\n  assert(p)\n  assert(options)\n  if (er)\n    assert(er instanceof Error)\n\n  try {\n    options.chmodSync(p, _0666)\n  } catch (er2) {\n    if (er2.code === \"ENOENT\")\n      return\n    else\n      throw er\n  }\n\n  try {\n    var stats = options.statSync(p)\n  } catch (er3) {\n    if (er3.code === \"ENOENT\")\n      return\n    else\n      throw er\n  }\n\n  if (stats.isDirectory())\n    rmdirSync(p, options, er)\n  else\n    options.unlinkSync(p)\n}\n\nfunction rmdir (p, options, originalEr, cb) {\n  assert(p)\n  assert(options)\n  if (originalEr)\n    assert(originalEr instanceof Error)\n  assert(typeof cb === 'function')\n\n  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)\n  // if we guessed wrong, and it's not a directory, then\n  // raise the original error.\n  options.rmdir(p, function (er) {\n    if (er && (er.code === \"ENOTEMPTY\" || er.code === \"EEXIST\" || er.code === \"EPERM\"))\n      rmkids(p, options, cb)\n    else if (er && er.code === \"ENOTDIR\")\n      cb(originalEr)\n    else\n      cb(er)\n  })\n}\n\nfunction rmkids(p, options, cb) {\n  assert(p)\n  assert(options)\n  assert(typeof cb === 'function')\n\n  options.readdir(p, function (er, files) {\n    if (er)\n      return cb(er)\n    var n = files.length\n    if (n === 0)\n      return options.rmdir(p, cb)\n    var errState\n    files.forEach(function (f) {\n      rimraf(path.join(p, f), options, function (er) {\n        if (errState)\n          return\n        if (er)\n          return cb(errState = er)\n        if (--n === 0)\n          options.rmdir(p, cb)\n      })\n    })\n  })\n}\n\n// this looks simpler, and is strictly *faster*, but will\n// tie up the JavaScript thread and fail on excessively\n// deep directory trees.\nfunction rimrafSync (p, options) {\n  options = options || {}\n  defaults(options)\n\n  assert(p, 'rimraf: missing path')\n  assert.equal(typeof p, 'string', 'rimraf: path should be a string')\n  assert(options, 'rimraf: missing options')\n  assert.equal(typeof options, 'object', 'rimraf: options should be object')\n\n  var results\n\n  if (options.disableGlob || !glob.hasMagic(p)) {\n    results = [p]\n  } else {\n    try {\n      options.lstatSync(p)\n      results = [p]\n    } catch (er) {\n      results = glob.sync(p, options.glob)\n    }\n  }\n\n  if (!results.length)\n    return\n\n  for (var i = 0; i < results.length; i++) {\n    var p = results[i]\n\n    try {\n      var st = options.lstatSync(p)\n    } catch (er) {\n      if (er.code === \"ENOENT\")\n        return\n\n      // Windows can EPERM on stat.  Life is suffering.\n      if (er.code === \"EPERM\" && isWindows)\n        fixWinEPERMSync(p, options, er)\n    }\n\n    try {\n      // sunos lets the root user unlink directories, which is... weird.\n      if (st && st.isDirectory())\n        rmdirSync(p, options, null)\n      else\n        options.unlinkSync(p)\n    } catch (er) {\n      if (er.code === \"ENOENT\")\n        return\n      if (er.code === \"EPERM\")\n        return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)\n      if (er.code !== \"EISDIR\")\n        throw er\n\n      rmdirSync(p, options, er)\n    }\n  }\n}\n\nfunction rmdirSync (p, options, originalEr) {\n  assert(p)\n  assert(options)\n  if (originalEr)\n    assert(originalEr instanceof Error)\n\n  try {\n    options.rmdirSync(p)\n  } catch (er) {\n    if (er.code === \"ENOENT\")\n      return\n    if (er.code === \"ENOTDIR\")\n      throw originalEr\n    if (er.code === \"ENOTEMPTY\" || er.code === \"EEXIST\" || er.code === \"EPERM\")\n      rmkidsSync(p, options)\n  }\n}\n\nfunction rmkidsSync (p, options) {\n  assert(p)\n  assert(options)\n  options.readdirSync(p).forEach(function (f) {\n    rimrafSync(path.join(p, f), options)\n  })\n\n  // We only end up here once we got ENOTEMPTY at least once, and\n  // at this point, we are guaranteed to have removed all the kids.\n  // So, we know that it won't be ENOENT or ENOTDIR or anything else.\n  // try really hard to delete stuff on windows, because it has a\n  // PROFOUNDLY annoying habit of not closing handles promptly when\n  // files are deleted, resulting in spurious ENOTEMPTY errors.\n  var retries = isWindows ? 100 : 1\n  var i = 0\n  do {\n    var threw = true\n    try {\n      var ret = options.rmdirSync(p, options)\n      threw = false\n      return ret\n    } finally {\n      if (++i < retries && threw)\n        continue\n    }\n  } while (true)\n}\n\n\n/***/ }),\n/* 309 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ReplaySubject; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__scheduler_queue__ = __webpack_require__(439);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscription__ = __webpack_require__(25);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__operators_observeOn__ = __webpack_require__(434);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_ObjectUnsubscribedError__ = __webpack_require__(190);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__SubjectSubscription__ = __webpack_require__(422);\n/** PURE_IMPORTS_START tslib,_Subject,_scheduler_queue,_Subscription,_operators_observeOn,_util_ObjectUnsubscribedError,_SubjectSubscription PURE_IMPORTS_END */\n\n\n\n\n\n\n\nvar ReplaySubject = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](ReplaySubject, _super);\n    function ReplaySubject(bufferSize, windowTime, scheduler) {\n        if (bufferSize === void 0) {\n            bufferSize = Number.POSITIVE_INFINITY;\n        }\n        if (windowTime === void 0) {\n            windowTime = Number.POSITIVE_INFINITY;\n        }\n        var _this = _super.call(this) || this;\n        _this.scheduler = scheduler;\n        _this._events = [];\n        _this._infiniteTimeWindow = false;\n        _this._bufferSize = bufferSize < 1 ? 1 : bufferSize;\n        _this._windowTime = windowTime < 1 ? 1 : windowTime;\n        if (windowTime === Number.POSITIVE_INFINITY) {\n            _this._infiniteTimeWindow = true;\n            _this.next = _this.nextInfiniteTimeWindow;\n        }\n        else {\n            _this.next = _this.nextTimeWindow;\n        }\n        return _this;\n    }\n    ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) {\n        var _events = this._events;\n        _events.push(value);\n        if (_events.length > this._bufferSize) {\n            _events.shift();\n        }\n        _super.prototype.next.call(this, value);\n    };\n    ReplaySubject.prototype.nextTimeWindow = function (value) {\n        this._events.push(new ReplayEvent(this._getNow(), value));\n        this._trimBufferThenGetEvents();\n        _super.prototype.next.call(this, value);\n    };\n    ReplaySubject.prototype._subscribe = function (subscriber) {\n        var _infiniteTimeWindow = this._infiniteTimeWindow;\n        var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();\n        var scheduler = this.scheduler;\n        var len = _events.length;\n        var subscription;\n        if (this.closed) {\n            throw new __WEBPACK_IMPORTED_MODULE_5__util_ObjectUnsubscribedError__[\"a\" /* ObjectUnsubscribedError */]();\n        }\n        else if (this.isStopped || this.hasError) {\n            subscription = __WEBPACK_IMPORTED_MODULE_3__Subscription__[\"a\" /* Subscription */].EMPTY;\n        }\n        else {\n            this.observers.push(subscriber);\n            subscription = new __WEBPACK_IMPORTED_MODULE_6__SubjectSubscription__[\"a\" /* SubjectSubscription */](this, subscriber);\n        }\n        if (scheduler) {\n            subscriber.add(subscriber = new __WEBPACK_IMPORTED_MODULE_4__operators_observeOn__[\"a\" /* ObserveOnSubscriber */](subscriber, scheduler));\n        }\n        if (_infiniteTimeWindow) {\n            for (var i = 0; i < len && !subscriber.closed; i++) {\n                subscriber.next(_events[i]);\n            }\n        }\n        else {\n            for (var i = 0; i < len && !subscriber.closed; i++) {\n                subscriber.next(_events[i].value);\n            }\n        }\n        if (this.hasError) {\n            subscriber.error(this.thrownError);\n        }\n        else if (this.isStopped) {\n            subscriber.complete();\n        }\n        return subscription;\n    };\n    ReplaySubject.prototype._getNow = function () {\n        return (this.scheduler || __WEBPACK_IMPORTED_MODULE_2__scheduler_queue__[\"a\" /* queue */]).now();\n    };\n    ReplaySubject.prototype._trimBufferThenGetEvents = function () {\n        var now = this._getNow();\n        var _bufferSize = this._bufferSize;\n        var _windowTime = this._windowTime;\n        var _events = this._events;\n        var eventsCount = _events.length;\n        var spliceCount = 0;\n        while (spliceCount < eventsCount) {\n            if ((now - _events[spliceCount].time) < _windowTime) {\n                break;\n            }\n            spliceCount++;\n        }\n        if (eventsCount > _bufferSize) {\n            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);\n        }\n        if (spliceCount > 0) {\n            _events.splice(0, spliceCount);\n        }\n        return _events;\n    };\n    return ReplaySubject;\n}(__WEBPACK_IMPORTED_MODULE_1__Subject__[\"a\" /* Subject */]));\n\nvar ReplayEvent = /*@__PURE__*/ (function () {\n    function ReplayEvent(time, value) {\n        this.time = time;\n        this.value = value;\n    }\n    return ReplayEvent;\n}());\n//# sourceMappingURL=ReplaySubject.js.map\n\n\n/***/ }),\n/* 310 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = combineLatest;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return CombineLatestOperator; });\n/* unused harmony export CombineLatestSubscriber */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isScheduler__ = __webpack_require__(49);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isArray__ = __webpack_require__(41);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__ = __webpack_require__(14);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__fromArray__ = __webpack_require__(85);\n/** PURE_IMPORTS_START tslib,_util_isScheduler,_util_isArray,_OuterSubscriber,_util_subscribeToResult,_fromArray PURE_IMPORTS_END */\n\n\n\n\n\n\nvar NONE = {};\nfunction combineLatest() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    var resultSelector = null;\n    var scheduler = null;\n    if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isScheduler__[\"a\" /* isScheduler */])(observables[observables.length - 1])) {\n        scheduler = observables.pop();\n    }\n    if (typeof observables[observables.length - 1] === 'function') {\n        resultSelector = observables.pop();\n    }\n    if (observables.length === 1 && __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isArray__[\"a\" /* isArray */])(observables[0])) {\n        observables = observables[0];\n    }\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__fromArray__[\"a\" /* fromArray */])(observables, scheduler).lift(new CombineLatestOperator(resultSelector));\n}\nvar CombineLatestOperator = /*@__PURE__*/ (function () {\n    function CombineLatestOperator(resultSelector) {\n        this.resultSelector = resultSelector;\n    }\n    CombineLatestOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector));\n    };\n    return CombineLatestOperator;\n}());\n\nvar CombineLatestSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](CombineLatestSubscriber, _super);\n    function CombineLatestSubscriber(destination, resultSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.resultSelector = resultSelector;\n        _this.active = 0;\n        _this.values = [];\n        _this.observables = [];\n        return _this;\n    }\n    CombineLatestSubscriber.prototype._next = function (observable) {\n        this.values.push(NONE);\n        this.observables.push(observable);\n    };\n    CombineLatestSubscriber.prototype._complete = function () {\n        var observables = this.observables;\n        var len = observables.length;\n        if (len === 0) {\n            this.destination.complete();\n        }\n        else {\n            this.active = len;\n            this.toRespond = len;\n            for (var i = 0; i < len; i++) {\n                var observable = observables[i];\n                this.add(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, observable, observable, i));\n            }\n        }\n    };\n    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {\n        if ((this.active -= 1) === 0) {\n            this.destination.complete();\n        }\n    };\n    CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var values = this.values;\n        var oldVal = values[outerIndex];\n        var toRespond = !this.toRespond\n            ? 0\n            : oldVal === NONE ? --this.toRespond : this.toRespond;\n        values[outerIndex] = innerValue;\n        if (toRespond === 0) {\n            if (this.resultSelector) {\n                this._tryResultSelector(values);\n            }\n            else {\n                this.destination.next(values.slice());\n            }\n        }\n    };\n    CombineLatestSubscriber.prototype._tryResultSelector = function (values) {\n        var result;\n        try {\n            result = this.resultSelector.apply(this, values);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return CombineLatestSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n\n//# sourceMappingURL=combineLatest.js.map\n\n\n/***/ }),\n/* 311 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = defer;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__from__ = __webpack_require__(62);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__empty__ = __webpack_require__(39);\n/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */\n\n\n\nfunction defer(observableFactory) {\n    return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n        var input;\n        try {\n            input = observableFactory();\n        }\n        catch (err) {\n            subscriber.error(err);\n            return undefined;\n        }\n        var source = input ? __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__from__[\"a\" /* from */])(input) : __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__empty__[\"a\" /* empty */])();\n        return source.subscribe(subscriber);\n    });\n}\n//# sourceMappingURL=defer.js.map\n\n\n/***/ }),\n/* 312 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = of;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_isScheduler__ = __webpack_require__(49);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__fromArray__ = __webpack_require__(85);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__empty__ = __webpack_require__(39);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__scalar__ = __webpack_require__(313);\n/** PURE_IMPORTS_START _util_isScheduler,_fromArray,_empty,_scalar PURE_IMPORTS_END */\n\n\n\n\nfunction of() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    var scheduler = args[args.length - 1];\n    if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__util_isScheduler__[\"a\" /* isScheduler */])(scheduler)) {\n        args.pop();\n    }\n    else {\n        scheduler = undefined;\n    }\n    switch (args.length) {\n        case 0:\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__empty__[\"a\" /* empty */])(scheduler);\n        case 1:\n            return scheduler ? __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__fromArray__[\"a\" /* fromArray */])(args, scheduler) : __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__scalar__[\"a\" /* scalar */])(args[0]);\n        default:\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__fromArray__[\"a\" /* fromArray */])(args, scheduler);\n    }\n}\n//# sourceMappingURL=of.js.map\n\n\n/***/ }),\n/* 313 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = scalar;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */\n\nfunction scalar(value) {\n    var result = new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n        subscriber.next(value);\n        subscriber.complete();\n    });\n    result._isScalar = true;\n    result.value = value;\n    return result;\n}\n//# sourceMappingURL=scalar.js.map\n\n\n/***/ }),\n/* 314 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = throwError;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */\n\nfunction throwError(error, scheduler) {\n    if (!scheduler) {\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) { return subscriber.error(error); });\n    }\n    else {\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); });\n    }\n}\nfunction dispatch(_a) {\n    var error = _a.error, subscriber = _a.subscriber;\n    subscriber.error(error);\n}\n//# sourceMappingURL=throwError.js.map\n\n\n/***/ }),\n/* 315 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = zip;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return ZipOperator; });\n/* unused harmony export ZipSubscriber */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__fromArray__ = __webpack_require__(85);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isArray__ = __webpack_require__(41);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__ = __webpack_require__(14);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__internal_symbol_iterator__ = __webpack_require__(152);\n/** PURE_IMPORTS_START tslib,_fromArray,_util_isArray,_Subscriber,_OuterSubscriber,_util_subscribeToResult,_.._internal_symbol_iterator PURE_IMPORTS_END */\n\n\n\n\n\n\n\nfunction zip() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    var resultSelector = observables[observables.length - 1];\n    if (typeof resultSelector === 'function') {\n        observables.pop();\n    }\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__fromArray__[\"a\" /* fromArray */])(observables, undefined).lift(new ZipOperator(resultSelector));\n}\nvar ZipOperator = /*@__PURE__*/ (function () {\n    function ZipOperator(resultSelector) {\n        this.resultSelector = resultSelector;\n    }\n    ZipOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));\n    };\n    return ZipOperator;\n}());\n\nvar ZipSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](ZipSubscriber, _super);\n    function ZipSubscriber(destination, resultSelector, values) {\n        if (values === void 0) {\n            values = Object.create(null);\n        }\n        var _this = _super.call(this, destination) || this;\n        _this.iterators = [];\n        _this.active = 0;\n        _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null;\n        _this.values = values;\n        return _this;\n    }\n    ZipSubscriber.prototype._next = function (value) {\n        var iterators = this.iterators;\n        if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isArray__[\"a\" /* isArray */])(value)) {\n            iterators.push(new StaticArrayIterator(value));\n        }\n        else if (typeof value[__WEBPACK_IMPORTED_MODULE_6__internal_symbol_iterator__[\"a\" /* iterator */]] === 'function') {\n            iterators.push(new StaticIterator(value[__WEBPACK_IMPORTED_MODULE_6__internal_symbol_iterator__[\"a\" /* iterator */]]()));\n        }\n        else {\n            iterators.push(new ZipBufferIterator(this.destination, this, value));\n        }\n    };\n    ZipSubscriber.prototype._complete = function () {\n        var iterators = this.iterators;\n        var len = iterators.length;\n        this.unsubscribe();\n        if (len === 0) {\n            this.destination.complete();\n            return;\n        }\n        this.active = len;\n        for (var i = 0; i < len; i++) {\n            var iterator = iterators[i];\n            if (iterator.stillUnsubscribed) {\n                var destination = this.destination;\n                destination.add(iterator.subscribe(iterator, i));\n            }\n            else {\n                this.active--;\n            }\n        }\n    };\n    ZipSubscriber.prototype.notifyInactive = function () {\n        this.active--;\n        if (this.active === 0) {\n            this.destination.complete();\n        }\n    };\n    ZipSubscriber.prototype.checkIterators = function () {\n        var iterators = this.iterators;\n        var len = iterators.length;\n        var destination = this.destination;\n        for (var i = 0; i < len; i++) {\n            var iterator = iterators[i];\n            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {\n                return;\n            }\n        }\n        var shouldComplete = false;\n        var args = [];\n        for (var i = 0; i < len; i++) {\n            var iterator = iterators[i];\n            var result = iterator.next();\n            if (iterator.hasCompleted()) {\n                shouldComplete = true;\n            }\n            if (result.done) {\n                destination.complete();\n                return;\n            }\n            args.push(result.value);\n        }\n        if (this.resultSelector) {\n            this._tryresultSelector(args);\n        }\n        else {\n            destination.next(args);\n        }\n        if (shouldComplete) {\n            destination.complete();\n        }\n    };\n    ZipSubscriber.prototype._tryresultSelector = function (args) {\n        var result;\n        try {\n            result = this.resultSelector.apply(this, args);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return ZipSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_3__Subscriber__[\"a\" /* Subscriber */]));\n\nvar StaticIterator = /*@__PURE__*/ (function () {\n    function StaticIterator(iterator) {\n        this.iterator = iterator;\n        this.nextResult = iterator.next();\n    }\n    StaticIterator.prototype.hasValue = function () {\n        return true;\n    };\n    StaticIterator.prototype.next = function () {\n        var result = this.nextResult;\n        this.nextResult = this.iterator.next();\n        return result;\n    };\n    StaticIterator.prototype.hasCompleted = function () {\n        var nextResult = this.nextResult;\n        return nextResult && nextResult.done;\n    };\n    return StaticIterator;\n}());\nvar StaticArrayIterator = /*@__PURE__*/ (function () {\n    function StaticArrayIterator(array) {\n        this.array = array;\n        this.index = 0;\n        this.length = 0;\n        this.length = array.length;\n    }\n    StaticArrayIterator.prototype[__WEBPACK_IMPORTED_MODULE_6__internal_symbol_iterator__[\"a\" /* iterator */]] = function () {\n        return this;\n    };\n    StaticArrayIterator.prototype.next = function (value) {\n        var i = this.index++;\n        var array = this.array;\n        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };\n    };\n    StaticArrayIterator.prototype.hasValue = function () {\n        return this.array.length > this.index;\n    };\n    StaticArrayIterator.prototype.hasCompleted = function () {\n        return this.array.length === this.index;\n    };\n    return StaticArrayIterator;\n}());\nvar ZipBufferIterator = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](ZipBufferIterator, _super);\n    function ZipBufferIterator(destination, parent, observable) {\n        var _this = _super.call(this, destination) || this;\n        _this.parent = parent;\n        _this.observable = observable;\n        _this.stillUnsubscribed = true;\n        _this.buffer = [];\n        _this.isComplete = false;\n        return _this;\n    }\n    ZipBufferIterator.prototype[__WEBPACK_IMPORTED_MODULE_6__internal_symbol_iterator__[\"a\" /* iterator */]] = function () {\n        return this;\n    };\n    ZipBufferIterator.prototype.next = function () {\n        var buffer = this.buffer;\n        if (buffer.length === 0 && this.isComplete) {\n            return { value: null, done: true };\n        }\n        else {\n            return { value: buffer.shift(), done: false };\n        }\n    };\n    ZipBufferIterator.prototype.hasValue = function () {\n        return this.buffer.length > 0;\n    };\n    ZipBufferIterator.prototype.hasCompleted = function () {\n        return this.buffer.length === 0 && this.isComplete;\n    };\n    ZipBufferIterator.prototype.notifyComplete = function () {\n        if (this.buffer.length > 0) {\n            this.isComplete = true;\n            this.parent.notifyInactive();\n        }\n        else {\n            this.destination.complete();\n        }\n    };\n    ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.buffer.push(innerValue);\n        this.parent.checkIterators();\n    };\n    ZipBufferIterator.prototype.subscribe = function (value, index) {\n        return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, this.observable, this, index);\n    };\n    return ZipBufferIterator;\n}(__WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=zip.js.map\n\n\n/***/ }),\n/* 316 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = mergeAll;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__mergeMap__ = __webpack_require__(149);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_identity__ = __webpack_require__(119);\n/** PURE_IMPORTS_START _mergeMap,_util_identity PURE_IMPORTS_END */\n\n\nfunction mergeAll(concurrent) {\n    if (concurrent === void 0) {\n        concurrent = Number.POSITIVE_INFINITY;\n    }\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__mergeMap__[\"a\" /* mergeMap */])(__WEBPACK_IMPORTED_MODULE_1__util_identity__[\"a\" /* identity */], concurrent);\n}\n//# sourceMappingURL=mergeAll.js.map\n\n\n/***/ }),\n/* 317 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = refCount;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction refCount() {\n    return function refCountOperatorFunction(source) {\n        return source.lift(new RefCountOperator(source));\n    };\n}\nvar RefCountOperator = /*@__PURE__*/ (function () {\n    function RefCountOperator(connectable) {\n        this.connectable = connectable;\n    }\n    RefCountOperator.prototype.call = function (subscriber, source) {\n        var connectable = this.connectable;\n        connectable._refCount++;\n        var refCounter = new RefCountSubscriber(subscriber, connectable);\n        var subscription = source.subscribe(refCounter);\n        if (!refCounter.closed) {\n            refCounter.connection = connectable.connect();\n        }\n        return subscription;\n    };\n    return RefCountOperator;\n}());\nvar RefCountSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](RefCountSubscriber, _super);\n    function RefCountSubscriber(destination, connectable) {\n        var _this = _super.call(this, destination) || this;\n        _this.connectable = connectable;\n        return _this;\n    }\n    RefCountSubscriber.prototype._unsubscribe = function () {\n        var connectable = this.connectable;\n        if (!connectable) {\n            this.connection = null;\n            return;\n        }\n        this.connectable = null;\n        var refCount = connectable._refCount;\n        if (refCount <= 0) {\n            this.connection = null;\n            return;\n        }\n        connectable._refCount = refCount - 1;\n        if (refCount > 1) {\n            this.connection = null;\n            return;\n        }\n        var connection = this.connection;\n        var sharedConnection = connectable._connection;\n        this.connection = null;\n        if (sharedConnection && (!connection || sharedConnection === connection)) {\n            sharedConnection.unsubscribe();\n        }\n    };\n    return RefCountSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=refCount.js.map\n\n\n/***/ }),\n/* 318 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = scan;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction scan(accumulator, seed) {\n    var hasSeed = false;\n    if (arguments.length >= 2) {\n        hasSeed = true;\n    }\n    return function scanOperatorFunction(source) {\n        return source.lift(new ScanOperator(accumulator, seed, hasSeed));\n    };\n}\nvar ScanOperator = /*@__PURE__*/ (function () {\n    function ScanOperator(accumulator, seed, hasSeed) {\n        if (hasSeed === void 0) {\n            hasSeed = false;\n        }\n        this.accumulator = accumulator;\n        this.seed = seed;\n        this.hasSeed = hasSeed;\n    }\n    ScanOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));\n    };\n    return ScanOperator;\n}());\nvar ScanSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](ScanSubscriber, _super);\n    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {\n        var _this = _super.call(this, destination) || this;\n        _this.accumulator = accumulator;\n        _this._seed = _seed;\n        _this.hasSeed = hasSeed;\n        _this.index = 0;\n        return _this;\n    }\n    Object.defineProperty(ScanSubscriber.prototype, \"seed\", {\n        get: function () {\n            return this._seed;\n        },\n        set: function (value) {\n            this.hasSeed = true;\n            this._seed = value;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ScanSubscriber.prototype._next = function (value) {\n        if (!this.hasSeed) {\n            this.seed = value;\n            this.destination.next(value);\n        }\n        else {\n            return this._tryNext(value);\n        }\n    };\n    ScanSubscriber.prototype._tryNext = function (value) {\n        var index = this.index++;\n        var result;\n        try {\n            result = this.accumulator(this.seed, value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n        this.seed = result;\n        this.destination.next(result);\n    };\n    return ScanSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=scan.js.map\n\n\n/***/ }),\n/* 319 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = switchMap;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__InnerSubscriber__ = __webpack_require__(84);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_subscribeToResult__ = __webpack_require__(14);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__map__ = __webpack_require__(47);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__observable_from__ = __webpack_require__(62);\n/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction switchMap(project, resultSelector) {\n    if (typeof resultSelector === 'function') {\n        return function (source) { return source.pipe(switchMap(function (a, i) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__observable_from__[\"a\" /* from */])(project(a, i)).pipe(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__map__[\"a\" /* map */])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };\n    }\n    return function (source) { return source.lift(new SwitchMapOperator(project)); };\n}\nvar SwitchMapOperator = /*@__PURE__*/ (function () {\n    function SwitchMapOperator(project) {\n        this.project = project;\n    }\n    SwitchMapOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project));\n    };\n    return SwitchMapOperator;\n}());\nvar SwitchMapSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SwitchMapSubscriber, _super);\n    function SwitchMapSubscriber(destination, project) {\n        var _this = _super.call(this, destination) || this;\n        _this.project = project;\n        _this.index = 0;\n        return _this;\n    }\n    SwitchMapSubscriber.prototype._next = function (value) {\n        var result;\n        var index = this.index++;\n        try {\n            result = this.project(value, index);\n        }\n        catch (error) {\n            this.destination.error(error);\n            return;\n        }\n        this._innerSub(result, value, index);\n    };\n    SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {\n        var innerSubscription = this.innerSubscription;\n        if (innerSubscription) {\n            innerSubscription.unsubscribe();\n        }\n        var innerSubscriber = new __WEBPACK_IMPORTED_MODULE_2__InnerSubscriber__[\"a\" /* InnerSubscriber */](this, undefined, undefined);\n        var destination = this.destination;\n        destination.add(innerSubscriber);\n        this.innerSubscription = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, result, value, index, innerSubscriber);\n    };\n    SwitchMapSubscriber.prototype._complete = function () {\n        var innerSubscription = this.innerSubscription;\n        if (!innerSubscription || innerSubscription.closed) {\n            _super.prototype._complete.call(this);\n        }\n        this.unsubscribe();\n    };\n    SwitchMapSubscriber.prototype._unsubscribe = function () {\n        this.innerSubscription = null;\n    };\n    SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {\n        var destination = this.destination;\n        destination.remove(innerSub);\n        this.innerSubscription = null;\n        if (this.isStopped) {\n            _super.prototype._complete.call(this);\n        }\n    };\n    SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.destination.next(innerValue);\n    };\n    return SwitchMapSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=switchMap.js.map\n\n\n/***/ }),\n/* 320 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = take;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_ArgumentOutOfRangeError__ = __webpack_require__(153);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__observable_empty__ = __webpack_require__(39);\n/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */\n\n\n\n\nfunction take(count) {\n    return function (source) {\n        if (count === 0) {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__observable_empty__[\"a\" /* empty */])();\n        }\n        else {\n            return source.lift(new TakeOperator(count));\n        }\n    };\n}\nvar TakeOperator = /*@__PURE__*/ (function () {\n    function TakeOperator(total) {\n        this.total = total;\n        if (this.total < 0) {\n            throw new __WEBPACK_IMPORTED_MODULE_2__util_ArgumentOutOfRangeError__[\"a\" /* ArgumentOutOfRangeError */];\n        }\n    }\n    TakeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeSubscriber(subscriber, this.total));\n    };\n    return TakeOperator;\n}());\nvar TakeSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](TakeSubscriber, _super);\n    function TakeSubscriber(destination, total) {\n        var _this = _super.call(this, destination) || this;\n        _this.total = total;\n        _this.count = 0;\n        return _this;\n    }\n    TakeSubscriber.prototype._next = function (value) {\n        var total = this.total;\n        var count = ++this.count;\n        if (count <= total) {\n            this.destination.next(value);\n            if (count === total) {\n                this.destination.complete();\n                this.unsubscribe();\n            }\n        }\n    };\n    return TakeSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=take.js.map\n\n\n/***/ }),\n/* 321 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = takeLast;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_ArgumentOutOfRangeError__ = __webpack_require__(153);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__observable_empty__ = __webpack_require__(39);\n/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */\n\n\n\n\nfunction takeLast(count) {\n    return function takeLastOperatorFunction(source) {\n        if (count === 0) {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__observable_empty__[\"a\" /* empty */])();\n        }\n        else {\n            return source.lift(new TakeLastOperator(count));\n        }\n    };\n}\nvar TakeLastOperator = /*@__PURE__*/ (function () {\n    function TakeLastOperator(total) {\n        this.total = total;\n        if (this.total < 0) {\n            throw new __WEBPACK_IMPORTED_MODULE_2__util_ArgumentOutOfRangeError__[\"a\" /* ArgumentOutOfRangeError */];\n        }\n    }\n    TakeLastOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeLastSubscriber(subscriber, this.total));\n    };\n    return TakeLastOperator;\n}());\nvar TakeLastSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](TakeLastSubscriber, _super);\n    function TakeLastSubscriber(destination, total) {\n        var _this = _super.call(this, destination) || this;\n        _this.total = total;\n        _this.ring = new Array();\n        _this.count = 0;\n        return _this;\n    }\n    TakeLastSubscriber.prototype._next = function (value) {\n        var ring = this.ring;\n        var total = this.total;\n        var count = this.count++;\n        if (ring.length < total) {\n            ring.push(value);\n        }\n        else {\n            var index = count % total;\n            ring[index] = value;\n        }\n    };\n    TakeLastSubscriber.prototype._complete = function () {\n        var destination = this.destination;\n        var count = this.count;\n        if (count > 0) {\n            var total = this.count >= this.total ? this.total : this.count;\n            var ring = this.ring;\n            for (var i = 0; i < total; i++) {\n                var idx = (count++) % total;\n                destination.next(ring[idx]);\n            }\n        }\n        destination.complete();\n    };\n    return TakeLastSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=takeLast.js.map\n\n\n/***/ }),\n/* 322 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return rxSubscriber; });\n/* unused harmony export $$rxSubscriber */\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nvar rxSubscriber = typeof Symbol === 'function'\n    ? /*@__PURE__*/ Symbol('rxSubscriber')\n    : '@@rxSubscriber_' + /*@__PURE__*/ Math.random();\nvar $$rxSubscriber = rxSubscriber;\n//# sourceMappingURL=rxSubscriber.js.map\n\n\n/***/ }),\n/* 323 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = canReportError;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START _Subscriber PURE_IMPORTS_END */\n\nfunction canReportError(observer) {\n    while (observer) {\n        var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped;\n        if (closed_1 || isStopped) {\n            return false;\n        }\n        else if (destination && destination instanceof __WEBPACK_IMPORTED_MODULE_0__Subscriber__[\"a\" /* Subscriber */]) {\n            observer = destination;\n        }\n        else {\n            observer = null;\n        }\n    }\n    return true;\n}\n//# sourceMappingURL=canReportError.js.map\n\n\n/***/ }),\n/* 324 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = hostReportError;\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction hostReportError(err) {\n    setTimeout(function () { throw err; });\n}\n//# sourceMappingURL=hostReportError.js.map\n\n\n/***/ }),\n/* 325 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = pipe;\n/* harmony export (immutable) */ __webpack_exports__[\"b\"] = pipeFromArray;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__noop__ = __webpack_require__(192);\n/** PURE_IMPORTS_START _noop PURE_IMPORTS_END */\n\nfunction pipe() {\n    var fns = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        fns[_i] = arguments[_i];\n    }\n    return pipeFromArray(fns);\n}\nfunction pipeFromArray(fns) {\n    if (!fns) {\n        return __WEBPACK_IMPORTED_MODULE_0__noop__[\"a\" /* noop */];\n    }\n    if (fns.length === 1) {\n        return fns[0];\n    }\n    return function piped(input) {\n        return fns.reduce(function (prev, fn) { return fn(prev); }, input);\n    };\n}\n//# sourceMappingURL=pipe.js.map\n\n\n/***/ }),\n/* 326 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2017 Joyent, Inc.\n\nmodule.exports = {\n\tDiffieHellman: DiffieHellman,\n\tgenerateECDSA: generateECDSA,\n\tgenerateED25519: generateED25519\n};\n\nvar assert = __webpack_require__(16);\nvar crypto = __webpack_require__(11);\nvar Buffer = __webpack_require__(15).Buffer;\nvar algs = __webpack_require__(32);\nvar utils = __webpack_require__(26);\nvar nacl;\n\nvar Key = __webpack_require__(28);\nvar PrivateKey = __webpack_require__(33);\n\nvar CRYPTO_HAVE_ECDH = (crypto.createECDH !== undefined);\n\nvar ecdh, ec, jsbn;\n\nfunction DiffieHellman(key) {\n\tutils.assertCompatible(key, Key, [1, 4], 'key');\n\tthis._isPriv = PrivateKey.isPrivateKey(key, [1, 3]);\n\tthis._algo = key.type;\n\tthis._curve = key.curve;\n\tthis._key = key;\n\tif (key.type === 'dsa') {\n\t\tif (!CRYPTO_HAVE_ECDH) {\n\t\t\tthrow (new Error('Due to bugs in the node 0.10 ' +\n\t\t\t    'crypto API, node 0.12.x or later is required ' +\n\t\t\t    'to use DH'));\n\t\t}\n\t\tthis._dh = crypto.createDiffieHellman(\n\t\t    key.part.p.data, undefined,\n\t\t    key.part.g.data, undefined);\n\t\tthis._p = key.part.p;\n\t\tthis._g = key.part.g;\n\t\tif (this._isPriv)\n\t\t\tthis._dh.setPrivateKey(key.part.x.data);\n\t\tthis._dh.setPublicKey(key.part.y.data);\n\n\t} else if (key.type === 'ecdsa') {\n\t\tif (!CRYPTO_HAVE_ECDH) {\n\t\t\tif (ecdh === undefined)\n\t\t\t\tecdh = __webpack_require__(381);\n\t\t\tif (ec === undefined)\n\t\t\t\tec = __webpack_require__(140);\n\t\t\tif (jsbn === undefined)\n\t\t\t\tjsbn = __webpack_require__(81).BigInteger;\n\n\t\t\tthis._ecParams = new X9ECParameters(this._curve);\n\n\t\t\tif (this._isPriv) {\n\t\t\t\tthis._priv = new ECPrivate(\n\t\t\t\t    this._ecParams, key.part.d.data);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tvar curve = {\n\t\t\t'nistp256': 'prime256v1',\n\t\t\t'nistp384': 'secp384r1',\n\t\t\t'nistp521': 'secp521r1'\n\t\t}[key.curve];\n\t\tthis._dh = crypto.createECDH(curve);\n\t\tif (typeof (this._dh) !== 'object' ||\n\t\t    typeof (this._dh.setPrivateKey) !== 'function') {\n\t\t\tCRYPTO_HAVE_ECDH = false;\n\t\t\tDiffieHellman.call(this, key);\n\t\t\treturn;\n\t\t}\n\t\tif (this._isPriv)\n\t\t\tthis._dh.setPrivateKey(key.part.d.data);\n\t\tthis._dh.setPublicKey(key.part.Q.data);\n\n\t} else if (key.type === 'curve25519') {\n\t\tif (nacl === undefined)\n\t\t\tnacl = __webpack_require__(76);\n\n\t\tif (this._isPriv) {\n\t\t\tutils.assertCompatible(key, PrivateKey, [1, 5], 'key');\n\t\t\tthis._priv = key.part.k.data;\n\t\t}\n\n\t} else {\n\t\tthrow (new Error('DH not supported for ' + key.type + ' keys'));\n\t}\n}\n\nDiffieHellman.prototype.getPublicKey = function () {\n\tif (this._isPriv)\n\t\treturn (this._key.toPublic());\n\treturn (this._key);\n};\n\nDiffieHellman.prototype.getPrivateKey = function () {\n\tif (this._isPriv)\n\t\treturn (this._key);\n\telse\n\t\treturn (undefined);\n};\nDiffieHellman.prototype.getKey = DiffieHellman.prototype.getPrivateKey;\n\nDiffieHellman.prototype._keyCheck = function (pk, isPub) {\n\tassert.object(pk, 'key');\n\tif (!isPub)\n\t\tutils.assertCompatible(pk, PrivateKey, [1, 3], 'key');\n\tutils.assertCompatible(pk, Key, [1, 4], 'key');\n\n\tif (pk.type !== this._algo) {\n\t\tthrow (new Error('A ' + pk.type + ' key cannot be used in ' +\n\t\t    this._algo + ' Diffie-Hellman'));\n\t}\n\n\tif (pk.curve !== this._curve) {\n\t\tthrow (new Error('A key from the ' + pk.curve + ' curve ' +\n\t\t    'cannot be used with a ' + this._curve +\n\t\t    ' Diffie-Hellman'));\n\t}\n\n\tif (pk.type === 'dsa') {\n\t\tassert.deepEqual(pk.part.p, this._p,\n\t\t    'DSA key prime does not match');\n\t\tassert.deepEqual(pk.part.g, this._g,\n\t\t    'DSA key generator does not match');\n\t}\n};\n\nDiffieHellman.prototype.setKey = function (pk) {\n\tthis._keyCheck(pk);\n\n\tif (pk.type === 'dsa') {\n\t\tthis._dh.setPrivateKey(pk.part.x.data);\n\t\tthis._dh.setPublicKey(pk.part.y.data);\n\n\t} else if (pk.type === 'ecdsa') {\n\t\tif (CRYPTO_HAVE_ECDH) {\n\t\t\tthis._dh.setPrivateKey(pk.part.d.data);\n\t\t\tthis._dh.setPublicKey(pk.part.Q.data);\n\t\t} else {\n\t\t\tthis._priv = new ECPrivate(\n\t\t\t    this._ecParams, pk.part.d.data);\n\t\t}\n\n\t} else if (pk.type === 'curve25519') {\n\t\tvar k = pk.part.k;\n\t\tif (!pk.part.k)\n\t\t\tk = pk.part.r;\n\t\tthis._priv = k.data;\n\t\tif (this._priv[0] === 0x00)\n\t\t\tthis._priv = this._priv.slice(1);\n\t\tthis._priv = this._priv.slice(0, 32);\n\t}\n\tthis._key = pk;\n\tthis._isPriv = true;\n};\nDiffieHellman.prototype.setPrivateKey = DiffieHellman.prototype.setKey;\n\nDiffieHellman.prototype.computeSecret = function (otherpk) {\n\tthis._keyCheck(otherpk, true);\n\tif (!this._isPriv)\n\t\tthrow (new Error('DH exchange has not been initialized with ' +\n\t\t    'a private key yet'));\n\n\tvar pub;\n\tif (this._algo === 'dsa') {\n\t\treturn (this._dh.computeSecret(\n\t\t    otherpk.part.y.data));\n\n\t} else if (this._algo === 'ecdsa') {\n\t\tif (CRYPTO_HAVE_ECDH) {\n\t\t\treturn (this._dh.computeSecret(\n\t\t\t    otherpk.part.Q.data));\n\t\t} else {\n\t\t\tpub = new ECPublic(\n\t\t\t    this._ecParams, otherpk.part.Q.data);\n\t\t\treturn (this._priv.deriveSharedSecret(pub));\n\t\t}\n\n\t} else if (this._algo === 'curve25519') {\n\t\tpub = otherpk.part.A.data;\n\t\twhile (pub[0] === 0x00 && pub.length > 32)\n\t\t\tpub = pub.slice(1);\n\t\tvar priv = this._priv;\n\t\tassert.strictEqual(pub.length, 32);\n\t\tassert.strictEqual(priv.length, 32);\n\n\t\tvar secret = nacl.box.before(new Uint8Array(pub),\n\t\t    new Uint8Array(priv));\n\n\t\treturn (Buffer.from(secret));\n\t}\n\n\tthrow (new Error('Invalid algorithm: ' + this._algo));\n};\n\nDiffieHellman.prototype.generateKey = function () {\n\tvar parts = [];\n\tvar priv, pub;\n\tif (this._algo === 'dsa') {\n\t\tthis._dh.generateKeys();\n\n\t\tparts.push({name: 'p', data: this._p.data});\n\t\tparts.push({name: 'q', data: this._key.part.q.data});\n\t\tparts.push({name: 'g', data: this._g.data});\n\t\tparts.push({name: 'y', data: this._dh.getPublicKey()});\n\t\tparts.push({name: 'x', data: this._dh.getPrivateKey()});\n\t\tthis._key = new PrivateKey({\n\t\t\ttype: 'dsa',\n\t\t\tparts: parts\n\t\t});\n\t\tthis._isPriv = true;\n\t\treturn (this._key);\n\n\t} else if (this._algo === 'ecdsa') {\n\t\tif (CRYPTO_HAVE_ECDH) {\n\t\t\tthis._dh.generateKeys();\n\n\t\t\tparts.push({name: 'curve',\n\t\t\t    data: Buffer.from(this._curve)});\n\t\t\tparts.push({name: 'Q', data: this._dh.getPublicKey()});\n\t\t\tparts.push({name: 'd', data: this._dh.getPrivateKey()});\n\t\t\tthis._key = new PrivateKey({\n\t\t\t\ttype: 'ecdsa',\n\t\t\t\tcurve: this._curve,\n\t\t\t\tparts: parts\n\t\t\t});\n\t\t\tthis._isPriv = true;\n\t\t\treturn (this._key);\n\n\t\t} else {\n\t\t\tvar n = this._ecParams.getN();\n\t\t\tvar r = new jsbn(crypto.randomBytes(n.bitLength()));\n\t\t\tvar n1 = n.subtract(jsbn.ONE);\n\t\t\tpriv = r.mod(n1).add(jsbn.ONE);\n\t\t\tpub = this._ecParams.getG().multiply(priv);\n\n\t\t\tpriv = Buffer.from(priv.toByteArray());\n\t\t\tpub = Buffer.from(this._ecParams.getCurve().\n\t\t\t    encodePointHex(pub), 'hex');\n\n\t\t\tthis._priv = new ECPrivate(this._ecParams, priv);\n\n\t\t\tparts.push({name: 'curve',\n\t\t\t    data: Buffer.from(this._curve)});\n\t\t\tparts.push({name: 'Q', data: pub});\n\t\t\tparts.push({name: 'd', data: priv});\n\n\t\t\tthis._key = new PrivateKey({\n\t\t\t\ttype: 'ecdsa',\n\t\t\t\tcurve: this._curve,\n\t\t\t\tparts: parts\n\t\t\t});\n\t\t\tthis._isPriv = true;\n\t\t\treturn (this._key);\n\t\t}\n\n\t} else if (this._algo === 'curve25519') {\n\t\tvar pair = nacl.box.keyPair();\n\t\tpriv = Buffer.from(pair.secretKey);\n\t\tpub = Buffer.from(pair.publicKey);\n\t\tpriv = Buffer.concat([priv, pub]);\n\t\tassert.strictEqual(priv.length, 64);\n\t\tassert.strictEqual(pub.length, 32);\n\n\t\tparts.push({name: 'A', data: pub});\n\t\tparts.push({name: 'k', data: priv});\n\t\tthis._key = new PrivateKey({\n\t\t\ttype: 'curve25519',\n\t\t\tparts: parts\n\t\t});\n\t\tthis._isPriv = true;\n\t\treturn (this._key);\n\t}\n\n\tthrow (new Error('Invalid algorithm: ' + this._algo));\n};\nDiffieHellman.prototype.generateKeys = DiffieHellman.prototype.generateKey;\n\n/* These are helpers for using ecc-jsbn (for node 0.10 compatibility). */\n\nfunction X9ECParameters(name) {\n\tvar params = algs.curves[name];\n\tassert.object(params);\n\n\tvar p = new jsbn(params.p);\n\tvar a = new jsbn(params.a);\n\tvar b = new jsbn(params.b);\n\tvar n = new jsbn(params.n);\n\tvar h = jsbn.ONE;\n\tvar curve = new ec.ECCurveFp(p, a, b);\n\tvar G = curve.decodePointHex(params.G.toString('hex'));\n\n\tthis.curve = curve;\n\tthis.g = G;\n\tthis.n = n;\n\tthis.h = h;\n}\nX9ECParameters.prototype.getCurve = function () { return (this.curve); };\nX9ECParameters.prototype.getG = function () { return (this.g); };\nX9ECParameters.prototype.getN = function () { return (this.n); };\nX9ECParameters.prototype.getH = function () { return (this.h); };\n\nfunction ECPublic(params, buffer) {\n\tthis._params = params;\n\tif (buffer[0] === 0x00)\n\t\tbuffer = buffer.slice(1);\n\tthis._pub = params.getCurve().decodePointHex(buffer.toString('hex'));\n}\n\nfunction ECPrivate(params, buffer) {\n\tthis._params = params;\n\tthis._priv = new jsbn(utils.mpNormalize(buffer));\n}\nECPrivate.prototype.deriveSharedSecret = function (pubKey) {\n\tassert.ok(pubKey instanceof ECPublic);\n\tvar S = pubKey._pub.multiply(this._priv);\n\treturn (Buffer.from(S.getX().toBigInteger().toByteArray()));\n};\n\nfunction generateED25519() {\n\tif (nacl === undefined)\n\t\tnacl = __webpack_require__(76);\n\n\tvar pair = nacl.sign.keyPair();\n\tvar priv = Buffer.from(pair.secretKey);\n\tvar pub = Buffer.from(pair.publicKey);\n\tassert.strictEqual(priv.length, 64);\n\tassert.strictEqual(pub.length, 32);\n\n\tvar parts = [];\n\tparts.push({name: 'A', data: pub});\n\tparts.push({name: 'k', data: priv.slice(0, 32)});\n\tvar key = new PrivateKey({\n\t\ttype: 'ed25519',\n\t\tparts: parts\n\t});\n\treturn (key);\n}\n\n/* Generates a new ECDSA private key on a given curve. */\nfunction generateECDSA(curve) {\n\tvar parts = [];\n\tvar key;\n\n\tif (CRYPTO_HAVE_ECDH) {\n\t\t/*\n\t\t * Node crypto doesn't expose key generation directly, but the\n\t\t * ECDH instances can generate keys. It turns out this just\n\t\t * calls into the OpenSSL generic key generator, and we can\n\t\t * read its output happily without doing an actual DH. So we\n\t\t * use that here.\n\t\t */\n\t\tvar osCurve = {\n\t\t\t'nistp256': 'prime256v1',\n\t\t\t'nistp384': 'secp384r1',\n\t\t\t'nistp521': 'secp521r1'\n\t\t}[curve];\n\n\t\tvar dh = crypto.createECDH(osCurve);\n\t\tdh.generateKeys();\n\n\t\tparts.push({name: 'curve',\n\t\t    data: Buffer.from(curve)});\n\t\tparts.push({name: 'Q', data: dh.getPublicKey()});\n\t\tparts.push({name: 'd', data: dh.getPrivateKey()});\n\n\t\tkey = new PrivateKey({\n\t\t\ttype: 'ecdsa',\n\t\t\tcurve: curve,\n\t\t\tparts: parts\n\t\t});\n\t\treturn (key);\n\t} else {\n\t\tif (ecdh === undefined)\n\t\t\tecdh = __webpack_require__(381);\n\t\tif (ec === undefined)\n\t\t\tec = __webpack_require__(140);\n\t\tif (jsbn === undefined)\n\t\t\tjsbn = __webpack_require__(81).BigInteger;\n\n\t\tvar ecParams = new X9ECParameters(curve);\n\n\t\t/* This algorithm taken from FIPS PUB 186-4 (section B.4.1) */\n\t\tvar n = ecParams.getN();\n\t\t/*\n\t\t * The crypto.randomBytes() function can only give us whole\n\t\t * bytes, so taking a nod from X9.62, we round up.\n\t\t */\n\t\tvar cByteLen = Math.ceil((n.bitLength() + 64) / 8);\n\t\tvar c = new jsbn(crypto.randomBytes(cByteLen));\n\n\t\tvar n1 = n.subtract(jsbn.ONE);\n\t\tvar priv = c.mod(n1).add(jsbn.ONE);\n\t\tvar pub = ecParams.getG().multiply(priv);\n\n\t\tpriv = Buffer.from(priv.toByteArray());\n\t\tpub = Buffer.from(ecParams.getCurve().\n\t\t    encodePointHex(pub), 'hex');\n\n\t\tparts.push({name: 'curve', data: Buffer.from(curve)});\n\t\tparts.push({name: 'Q', data: pub});\n\t\tparts.push({name: 'd', data: priv});\n\n\t\tkey = new PrivateKey({\n\t\t\ttype: 'ecdsa',\n\t\t\tcurve: curve,\n\t\t\tparts: parts\n\t\t});\n\t\treturn (key);\n\t}\n}\n\n\n/***/ }),\n/* 327 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2017 Joyent, Inc.\n\nmodule.exports = {\n\tread: read,\n\twrite: write\n};\n\nvar assert = __webpack_require__(16);\nvar Buffer = __webpack_require__(15).Buffer;\nvar Key = __webpack_require__(28);\nvar PrivateKey = __webpack_require__(33);\nvar utils = __webpack_require__(26);\nvar SSHBuffer = __webpack_require__(160);\nvar Dhe = __webpack_require__(326);\n\nvar supportedAlgos = {\n\t'rsa-sha1' : 5,\n\t'rsa-sha256' : 8,\n\t'rsa-sha512' : 10,\n\t'ecdsa-p256-sha256' : 13,\n\t'ecdsa-p384-sha384' : 14\n\t/*\n\t * ed25519 is hypothetically supported with id 15\n\t * but the common tools available don't appear to be\n\t * capable of generating/using ed25519 keys\n\t */\n};\n\nvar supportedAlgosById = {};\nObject.keys(supportedAlgos).forEach(function (k) {\n\tsupportedAlgosById[supportedAlgos[k]] = k.toUpperCase();\n});\n\nfunction read(buf, options) {\n\tif (typeof (buf) !== 'string') {\n\t\tassert.buffer(buf, 'buf');\n\t\tbuf = buf.toString('ascii');\n\t}\n\tvar lines = buf.split('\\n');\n\tif (lines[0].match(/^Private-key-format\\: v1/)) {\n\t\tvar algElems = lines[1].split(' ');\n\t\tvar algoNum = parseInt(algElems[1], 10);\n\t\tvar algoName = algElems[2];\n\t\tif (!supportedAlgosById[algoNum])\n\t\t\tthrow (new Error('Unsupported algorithm: ' + algoName));\n\t\treturn (readDNSSECPrivateKey(algoNum, lines.slice(2)));\n\t}\n\n\t// skip any comment-lines\n\tvar line = 0;\n\t/* JSSTYLED */\n\twhile (lines[line].match(/^\\;/))\n\t\tline++;\n\t// we should now have *one single* line left with our KEY on it.\n\tif ((lines[line].match(/\\. IN KEY /) ||\n\t    lines[line].match(/\\. IN DNSKEY /)) && lines[line+1].length === 0) {\n\t\treturn (readRFC3110(lines[line]));\n\t}\n\tthrow (new Error('Cannot parse dnssec key'));\n}\n\nfunction readRFC3110(keyString) {\n\tvar elems = keyString.split(' ');\n\t//unused var flags = parseInt(elems[3], 10);\n\t//unused var protocol = parseInt(elems[4], 10);\n\tvar algorithm = parseInt(elems[5], 10);\n\tif (!supportedAlgosById[algorithm])\n\t\tthrow (new Error('Unsupported algorithm: ' + algorithm));\n\tvar base64key = elems.slice(6, elems.length).join();\n\tvar keyBuffer = Buffer.from(base64key, 'base64');\n\tif (supportedAlgosById[algorithm].match(/^RSA-/)) {\n\t\t// join the rest of the body into a single base64-blob\n\t\tvar publicExponentLen = keyBuffer.readUInt8(0);\n\t\tif (publicExponentLen != 3 && publicExponentLen != 1)\n\t\t\tthrow (new Error('Cannot parse dnssec key: ' +\n\t\t\t    'unsupported exponent length'));\n\n\t\tvar publicExponent = keyBuffer.slice(1, publicExponentLen+1);\n\t\tpublicExponent = utils.mpNormalize(publicExponent);\n\t\tvar modulus = keyBuffer.slice(1+publicExponentLen);\n\t\tmodulus = utils.mpNormalize(modulus);\n\t\t// now, make the key\n\t\tvar rsaKey = {\n\t\t\ttype: 'rsa',\n\t\t\tparts: []\n\t\t};\n\t\trsaKey.parts.push({ name: 'e', data: publicExponent});\n\t\trsaKey.parts.push({ name: 'n', data: modulus});\n\t\treturn (new Key(rsaKey));\n\t}\n\tif (supportedAlgosById[algorithm] === 'ECDSA-P384-SHA384' ||\n\t    supportedAlgosById[algorithm] === 'ECDSA-P256-SHA256') {\n\t\tvar curve = 'nistp384';\n\t\tvar size = 384;\n\t\tif (supportedAlgosById[algorithm].match(/^ECDSA-P256-SHA256/)) {\n\t\t\tcurve = 'nistp256';\n\t\t\tsize = 256;\n\t\t}\n\n\t\tvar ecdsaKey = {\n\t\t\ttype: 'ecdsa',\n\t\t\tcurve: curve,\n\t\t\tsize: size,\n\t\t\tparts: [\n\t\t\t\t{name: 'curve', data: Buffer.from(curve) },\n\t\t\t\t{name: 'Q', data: utils.ecNormalize(keyBuffer) }\n\t\t\t]\n\t\t};\n\t\treturn (new Key(ecdsaKey));\n\t}\n\tthrow (new Error('Unsupported algorithm: ' +\n\t    supportedAlgosById[algorithm]));\n}\n\nfunction elementToBuf(e) {\n\treturn (Buffer.from(e.split(' ')[1], 'base64'));\n}\n\nfunction readDNSSECRSAPrivateKey(elements) {\n\tvar rsaParams = {};\n\telements.forEach(function (element) {\n\t\tif (element.split(' ')[0] === 'Modulus:')\n\t\t\trsaParams['n'] = elementToBuf(element);\n\t\telse if (element.split(' ')[0] === 'PublicExponent:')\n\t\t\trsaParams['e'] = elementToBuf(element);\n\t\telse if (element.split(' ')[0] === 'PrivateExponent:')\n\t\t\trsaParams['d'] = elementToBuf(element);\n\t\telse if (element.split(' ')[0] === 'Prime1:')\n\t\t\trsaParams['p'] = elementToBuf(element);\n\t\telse if (element.split(' ')[0] === 'Prime2:')\n\t\t\trsaParams['q'] = elementToBuf(element);\n\t\telse if (element.split(' ')[0] === 'Exponent1:')\n\t\t\trsaParams['dmodp'] = elementToBuf(element);\n\t\telse if (element.split(' ')[0] === 'Exponent2:')\n\t\t\trsaParams['dmodq'] = elementToBuf(element);\n\t\telse if (element.split(' ')[0] === 'Coefficient:')\n\t\t\trsaParams['iqmp'] = elementToBuf(element);\n\t});\n\t// now, make the key\n\tvar key = {\n\t\ttype: 'rsa',\n\t\tparts: [\n\t\t\t{ name: 'e', data: utils.mpNormalize(rsaParams['e'])},\n\t\t\t{ name: 'n', data: utils.mpNormalize(rsaParams['n'])},\n\t\t\t{ name: 'd', data: utils.mpNormalize(rsaParams['d'])},\n\t\t\t{ name: 'p', data: utils.mpNormalize(rsaParams['p'])},\n\t\t\t{ name: 'q', data: utils.mpNormalize(rsaParams['q'])},\n\t\t\t{ name: 'dmodp',\n\t\t\t    data: utils.mpNormalize(rsaParams['dmodp'])},\n\t\t\t{ name: 'dmodq',\n\t\t\t    data: utils.mpNormalize(rsaParams['dmodq'])},\n\t\t\t{ name: 'iqmp',\n\t\t\t    data: utils.mpNormalize(rsaParams['iqmp'])}\n\t\t]\n\t};\n\treturn (new PrivateKey(key));\n}\n\nfunction readDNSSECPrivateKey(alg, elements) {\n\tif (supportedAlgosById[alg].match(/^RSA-/)) {\n\t\treturn (readDNSSECRSAPrivateKey(elements));\n\t}\n\tif (supportedAlgosById[alg] === 'ECDSA-P384-SHA384' ||\n\t    supportedAlgosById[alg] === 'ECDSA-P256-SHA256') {\n\t\tvar d = Buffer.from(elements[0].split(' ')[1], 'base64');\n\t\tvar curve = 'nistp384';\n\t\tvar size = 384;\n\t\tif (supportedAlgosById[alg] === 'ECDSA-P256-SHA256') {\n\t\t\tcurve = 'nistp256';\n\t\t\tsize = 256;\n\t\t}\n\t\t// DNSSEC generates the public-key on the fly (go calculate it)\n\t\tvar publicKey = utils.publicFromPrivateECDSA(curve, d);\n\t\tvar Q = publicKey.part['Q'].data;\n\t\tvar ecdsaKey = {\n\t\t\ttype: 'ecdsa',\n\t\t\tcurve: curve,\n\t\t\tsize: size,\n\t\t\tparts: [\n\t\t\t\t{name: 'curve', data: Buffer.from(curve) },\n\t\t\t\t{name: 'd', data: d },\n\t\t\t\t{name: 'Q', data: Q }\n\t\t\t]\n\t\t};\n\t\treturn (new PrivateKey(ecdsaKey));\n\t}\n\tthrow (new Error('Unsupported algorithm: ' + supportedAlgosById[alg]));\n}\n\nfunction dnssecTimestamp(date) {\n\tvar year = date.getFullYear() + ''; //stringify\n\tvar month = (date.getMonth() + 1);\n\tvar timestampStr = year + month + date.getUTCDate();\n\ttimestampStr += '' + date.getUTCHours() + date.getUTCMinutes();\n\ttimestampStr += date.getUTCSeconds();\n\treturn (timestampStr);\n}\n\nfunction rsaAlgFromOptions(opts) {\n\tif (!opts || !opts.hashAlgo || opts.hashAlgo === 'sha1')\n\t\treturn ('5 (RSASHA1)');\n\telse if (opts.hashAlgo === 'sha256')\n\t\treturn ('8 (RSASHA256)');\n\telse if (opts.hashAlgo === 'sha512')\n\t\treturn ('10 (RSASHA512)');\n\telse\n\t\tthrow (new Error('Unknown or unsupported hash: ' +\n\t\t    opts.hashAlgo));\n}\n\nfunction writeRSA(key, options) {\n\t// if we're missing parts, add them.\n\tif (!key.part.dmodp || !key.part.dmodq) {\n\t\tutils.addRSAMissing(key);\n\t}\n\n\tvar out = '';\n\tout += 'Private-key-format: v1.3\\n';\n\tout += 'Algorithm: ' + rsaAlgFromOptions(options) + '\\n';\n\tvar n = utils.mpDenormalize(key.part['n'].data);\n\tout += 'Modulus: ' + n.toString('base64') + '\\n';\n\tvar e = utils.mpDenormalize(key.part['e'].data);\n\tout += 'PublicExponent: ' + e.toString('base64') + '\\n';\n\tvar d = utils.mpDenormalize(key.part['d'].data);\n\tout += 'PrivateExponent: ' + d.toString('base64') + '\\n';\n\tvar p = utils.mpDenormalize(key.part['p'].data);\n\tout += 'Prime1: ' + p.toString('base64') + '\\n';\n\tvar q = utils.mpDenormalize(key.part['q'].data);\n\tout += 'Prime2: ' + q.toString('base64') + '\\n';\n\tvar dmodp = utils.mpDenormalize(key.part['dmodp'].data);\n\tout += 'Exponent1: ' + dmodp.toString('base64') + '\\n';\n\tvar dmodq = utils.mpDenormalize(key.part['dmodq'].data);\n\tout += 'Exponent2: ' + dmodq.toString('base64') + '\\n';\n\tvar iqmp = utils.mpDenormalize(key.part['iqmp'].data);\n\tout += 'Coefficient: ' + iqmp.toString('base64') + '\\n';\n\t// Assume that we're valid as-of now\n\tvar timestamp = new Date();\n\tout += 'Created: ' + dnssecTimestamp(timestamp) + '\\n';\n\tout += 'Publish: ' + dnssecTimestamp(timestamp) + '\\n';\n\tout += 'Activate: ' + dnssecTimestamp(timestamp) + '\\n';\n\treturn (Buffer.from(out, 'ascii'));\n}\n\nfunction writeECDSA(key, options) {\n\tvar out = '';\n\tout += 'Private-key-format: v1.3\\n';\n\n\tif (key.curve === 'nistp256') {\n\t\tout += 'Algorithm: 13 (ECDSAP256SHA256)\\n';\n\t} else if (key.curve === 'nistp384') {\n\t\tout += 'Algorithm: 14 (ECDSAP384SHA384)\\n';\n\t} else {\n\t\tthrow (new Error('Unsupported curve'));\n\t}\n\tvar base64Key = key.part['d'].data.toString('base64');\n\tout += 'PrivateKey: ' + base64Key + '\\n';\n\n\t// Assume that we're valid as-of now\n\tvar timestamp = new Date();\n\tout += 'Created: ' + dnssecTimestamp(timestamp) + '\\n';\n\tout += 'Publish: ' + dnssecTimestamp(timestamp) + '\\n';\n\tout += 'Activate: ' + dnssecTimestamp(timestamp) + '\\n';\n\n\treturn (Buffer.from(out, 'ascii'));\n}\n\nfunction write(key, options) {\n\tif (PrivateKey.isPrivateKey(key)) {\n\t\tif (key.type === 'rsa') {\n\t\t\treturn (writeRSA(key, options));\n\t\t} else if (key.type === 'ecdsa') {\n\t\t\treturn (writeECDSA(key, options));\n\t\t} else {\n\t\t\tthrow (new Error('Unsupported algorithm: ' + key.type));\n\t\t}\n\t} else if (Key.isKey(key)) {\n\t\t/*\n\t\t * RFC3110 requires a keyname, and a keytype, which we\n\t\t * don't really have a mechanism for specifying such\n\t\t * additional metadata.\n\t\t */\n\t\tthrow (new Error('Format \"dnssec\" only supports ' +\n\t\t    'writing private keys'));\n\t} else {\n\t\tthrow (new Error('key is not a Key or PrivateKey'));\n\t}\n}\n\n\n/***/ }),\n/* 328 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nmodule.exports = {\n\tread: read,\n\treadPkcs1: readPkcs1,\n\twrite: write,\n\twritePkcs1: writePkcs1\n};\n\nvar assert = __webpack_require__(16);\nvar asn1 = __webpack_require__(66);\nvar Buffer = __webpack_require__(15).Buffer;\nvar algs = __webpack_require__(32);\nvar utils = __webpack_require__(26);\n\nvar Key = __webpack_require__(28);\nvar PrivateKey = __webpack_require__(33);\nvar pem = __webpack_require__(86);\n\nvar pkcs8 = __webpack_require__(158);\nvar readECDSACurve = pkcs8.readECDSACurve;\n\nfunction read(buf, options) {\n\treturn (pem.read(buf, options, 'pkcs1'));\n}\n\nfunction write(key, options) {\n\treturn (pem.write(key, options, 'pkcs1'));\n}\n\n/* Helper to read in a single mpint */\nfunction readMPInt(der, nm) {\n\tassert.strictEqual(der.peek(), asn1.Ber.Integer,\n\t    nm + ' is not an Integer');\n\treturn (utils.mpNormalize(der.readString(asn1.Ber.Integer, true)));\n}\n\nfunction readPkcs1(alg, type, der) {\n\tswitch (alg) {\n\tcase 'RSA':\n\t\tif (type === 'public')\n\t\t\treturn (readPkcs1RSAPublic(der));\n\t\telse if (type === 'private')\n\t\t\treturn (readPkcs1RSAPrivate(der));\n\t\tthrow (new Error('Unknown key type: ' + type));\n\tcase 'DSA':\n\t\tif (type === 'public')\n\t\t\treturn (readPkcs1DSAPublic(der));\n\t\telse if (type === 'private')\n\t\t\treturn (readPkcs1DSAPrivate(der));\n\t\tthrow (new Error('Unknown key type: ' + type));\n\tcase 'EC':\n\tcase 'ECDSA':\n\t\tif (type === 'private')\n\t\t\treturn (readPkcs1ECDSAPrivate(der));\n\t\telse if (type === 'public')\n\t\t\treturn (readPkcs1ECDSAPublic(der));\n\t\tthrow (new Error('Unknown key type: ' + type));\n\tcase 'EDDSA':\n\tcase 'EdDSA':\n\t\tif (type === 'private')\n\t\t\treturn (readPkcs1EdDSAPrivate(der));\n\t\tthrow (new Error(type + ' keys not supported with EdDSA'));\n\tdefault:\n\t\tthrow (new Error('Unknown key algo: ' + alg));\n\t}\n}\n\nfunction readPkcs1RSAPublic(der) {\n\t// modulus and exponent\n\tvar n = readMPInt(der, 'modulus');\n\tvar e = readMPInt(der, 'exponent');\n\n\t// now, make the key\n\tvar key = {\n\t\ttype: 'rsa',\n\t\tparts: [\n\t\t\t{ name: 'e', data: e },\n\t\t\t{ name: 'n', data: n }\n\t\t]\n\t};\n\n\treturn (new Key(key));\n}\n\nfunction readPkcs1RSAPrivate(der) {\n\tvar version = readMPInt(der, 'version');\n\tassert.strictEqual(version[0], 0);\n\n\t// modulus then public exponent\n\tvar n = readMPInt(der, 'modulus');\n\tvar e = readMPInt(der, 'public exponent');\n\tvar d = readMPInt(der, 'private exponent');\n\tvar p = readMPInt(der, 'prime1');\n\tvar q = readMPInt(der, 'prime2');\n\tvar dmodp = readMPInt(der, 'exponent1');\n\tvar dmodq = readMPInt(der, 'exponent2');\n\tvar iqmp = readMPInt(der, 'iqmp');\n\n\t// now, make the key\n\tvar key = {\n\t\ttype: 'rsa',\n\t\tparts: [\n\t\t\t{ name: 'n', data: n },\n\t\t\t{ name: 'e', data: e },\n\t\t\t{ name: 'd', data: d },\n\t\t\t{ name: 'iqmp', data: iqmp },\n\t\t\t{ name: 'p', data: p },\n\t\t\t{ name: 'q', data: q },\n\t\t\t{ name: 'dmodp', data: dmodp },\n\t\t\t{ name: 'dmodq', data: dmodq }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction readPkcs1DSAPrivate(der) {\n\tvar version = readMPInt(der, 'version');\n\tassert.strictEqual(version.readUInt8(0), 0);\n\n\tvar p = readMPInt(der, 'p');\n\tvar q = readMPInt(der, 'q');\n\tvar g = readMPInt(der, 'g');\n\tvar y = readMPInt(der, 'y');\n\tvar x = readMPInt(der, 'x');\n\n\t// now, make the key\n\tvar key = {\n\t\ttype: 'dsa',\n\t\tparts: [\n\t\t\t{ name: 'p', data: p },\n\t\t\t{ name: 'q', data: q },\n\t\t\t{ name: 'g', data: g },\n\t\t\t{ name: 'y', data: y },\n\t\t\t{ name: 'x', data: x }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction readPkcs1EdDSAPrivate(der) {\n\tvar version = readMPInt(der, 'version');\n\tassert.strictEqual(version.readUInt8(0), 1);\n\n\t// private key\n\tvar k = der.readString(asn1.Ber.OctetString, true);\n\n\tder.readSequence(0xa0);\n\tvar oid = der.readOID();\n\tassert.strictEqual(oid, '1.3.101.112', 'the ed25519 curve identifier');\n\n\tder.readSequence(0xa1);\n\tvar A = utils.readBitString(der);\n\n\tvar key = {\n\t\ttype: 'ed25519',\n\t\tparts: [\n\t\t\t{ name: 'A', data: utils.zeroPadToLength(A, 32) },\n\t\t\t{ name: 'k', data: k }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction readPkcs1DSAPublic(der) {\n\tvar y = readMPInt(der, 'y');\n\tvar p = readMPInt(der, 'p');\n\tvar q = readMPInt(der, 'q');\n\tvar g = readMPInt(der, 'g');\n\n\tvar key = {\n\t\ttype: 'dsa',\n\t\tparts: [\n\t\t\t{ name: 'y', data: y },\n\t\t\t{ name: 'p', data: p },\n\t\t\t{ name: 'q', data: q },\n\t\t\t{ name: 'g', data: g }\n\t\t]\n\t};\n\n\treturn (new Key(key));\n}\n\nfunction readPkcs1ECDSAPublic(der) {\n\tder.readSequence();\n\n\tvar oid = der.readOID();\n\tassert.strictEqual(oid, '1.2.840.10045.2.1', 'must be ecPublicKey');\n\n\tvar curveOid = der.readOID();\n\n\tvar curve;\n\tvar curves = Object.keys(algs.curves);\n\tfor (var j = 0; j < curves.length; ++j) {\n\t\tvar c = curves[j];\n\t\tvar cd = algs.curves[c];\n\t\tif (cd.pkcs8oid === curveOid) {\n\t\t\tcurve = c;\n\t\t\tbreak;\n\t\t}\n\t}\n\tassert.string(curve, 'a known ECDSA named curve');\n\n\tvar Q = der.readString(asn1.Ber.BitString, true);\n\tQ = utils.ecNormalize(Q);\n\n\tvar key = {\n\t\ttype: 'ecdsa',\n\t\tparts: [\n\t\t\t{ name: 'curve', data: Buffer.from(curve) },\n\t\t\t{ name: 'Q', data: Q }\n\t\t]\n\t};\n\n\treturn (new Key(key));\n}\n\nfunction readPkcs1ECDSAPrivate(der) {\n\tvar version = readMPInt(der, 'version');\n\tassert.strictEqual(version.readUInt8(0), 1);\n\n\t// private key\n\tvar d = der.readString(asn1.Ber.OctetString, true);\n\n\tder.readSequence(0xa0);\n\tvar curve = readECDSACurve(der);\n\tassert.string(curve, 'a known elliptic curve');\n\n\tder.readSequence(0xa1);\n\tvar Q = der.readString(asn1.Ber.BitString, true);\n\tQ = utils.ecNormalize(Q);\n\n\tvar key = {\n\t\ttype: 'ecdsa',\n\t\tparts: [\n\t\t\t{ name: 'curve', data: Buffer.from(curve) },\n\t\t\t{ name: 'Q', data: Q },\n\t\t\t{ name: 'd', data: d }\n\t\t]\n\t};\n\n\treturn (new PrivateKey(key));\n}\n\nfunction writePkcs1(der, key) {\n\tder.startSequence();\n\n\tswitch (key.type) {\n\tcase 'rsa':\n\t\tif (PrivateKey.isPrivateKey(key))\n\t\t\twritePkcs1RSAPrivate(der, key);\n\t\telse\n\t\t\twritePkcs1RSAPublic(der, key);\n\t\tbreak;\n\tcase 'dsa':\n\t\tif (PrivateKey.isPrivateKey(key))\n\t\t\twritePkcs1DSAPrivate(der, key);\n\t\telse\n\t\t\twritePkcs1DSAPublic(der, key);\n\t\tbreak;\n\tcase 'ecdsa':\n\t\tif (PrivateKey.isPrivateKey(key))\n\t\t\twritePkcs1ECDSAPrivate(der, key);\n\t\telse\n\t\t\twritePkcs1ECDSAPublic(der, key);\n\t\tbreak;\n\tcase 'ed25519':\n\t\tif (PrivateKey.isPrivateKey(key))\n\t\t\twritePkcs1EdDSAPrivate(der, key);\n\t\telse\n\t\t\twritePkcs1EdDSAPublic(der, key);\n\t\tbreak;\n\tdefault:\n\t\tthrow (new Error('Unknown key algo: ' + key.type));\n\t}\n\n\tder.endSequence();\n}\n\nfunction writePkcs1RSAPublic(der, key) {\n\tder.writeBuffer(key.part.n.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.e.data, asn1.Ber.Integer);\n}\n\nfunction writePkcs1RSAPrivate(der, key) {\n\tvar ver = Buffer.from([0]);\n\tder.writeBuffer(ver, asn1.Ber.Integer);\n\n\tder.writeBuffer(key.part.n.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.e.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.d.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.p.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.q.data, asn1.Ber.Integer);\n\tif (!key.part.dmodp || !key.part.dmodq)\n\t\tutils.addRSAMissing(key);\n\tder.writeBuffer(key.part.dmodp.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.dmodq.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.iqmp.data, asn1.Ber.Integer);\n}\n\nfunction writePkcs1DSAPrivate(der, key) {\n\tvar ver = Buffer.from([0]);\n\tder.writeBuffer(ver, asn1.Ber.Integer);\n\n\tder.writeBuffer(key.part.p.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.q.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.g.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.y.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.x.data, asn1.Ber.Integer);\n}\n\nfunction writePkcs1DSAPublic(der, key) {\n\tder.writeBuffer(key.part.y.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.p.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.q.data, asn1.Ber.Integer);\n\tder.writeBuffer(key.part.g.data, asn1.Ber.Integer);\n}\n\nfunction writePkcs1ECDSAPublic(der, key) {\n\tder.startSequence();\n\n\tder.writeOID('1.2.840.10045.2.1'); /* ecPublicKey */\n\tvar curve = key.part.curve.data.toString();\n\tvar curveOid = algs.curves[curve].pkcs8oid;\n\tassert.string(curveOid, 'a known ECDSA named curve');\n\tder.writeOID(curveOid);\n\n\tder.endSequence();\n\n\tvar Q = utils.ecNormalize(key.part.Q.data, true);\n\tder.writeBuffer(Q, asn1.Ber.BitString);\n}\n\nfunction writePkcs1ECDSAPrivate(der, key) {\n\tvar ver = Buffer.from([1]);\n\tder.writeBuffer(ver, asn1.Ber.Integer);\n\n\tder.writeBuffer(key.part.d.data, asn1.Ber.OctetString);\n\n\tder.startSequence(0xa0);\n\tvar curve = key.part.curve.data.toString();\n\tvar curveOid = algs.curves[curve].pkcs8oid;\n\tassert.string(curveOid, 'a known ECDSA named curve');\n\tder.writeOID(curveOid);\n\tder.endSequence();\n\n\tder.startSequence(0xa1);\n\tvar Q = utils.ecNormalize(key.part.Q.data, true);\n\tder.writeBuffer(Q, asn1.Ber.BitString);\n\tder.endSequence();\n}\n\nfunction writePkcs1EdDSAPrivate(der, key) {\n\tvar ver = Buffer.from([1]);\n\tder.writeBuffer(ver, asn1.Ber.Integer);\n\n\tder.writeBuffer(key.part.k.data, asn1.Ber.OctetString);\n\n\tder.startSequence(0xa0);\n\tder.writeOID('1.3.101.112');\n\tder.endSequence();\n\n\tder.startSequence(0xa1);\n\tutils.writeBitString(der, key.part.A.data);\n\tder.endSequence();\n}\n\nfunction writePkcs1EdDSAPublic(der, key) {\n\tthrow (new Error('Public keys are not supported for EdDSA PKCS#1'));\n}\n\n\n/***/ }),\n/* 329 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nvar Key = __webpack_require__(28);\nvar Fingerprint = __webpack_require__(157);\nvar Signature = __webpack_require__(75);\nvar PrivateKey = __webpack_require__(33);\nvar Certificate = __webpack_require__(156);\nvar Identity = __webpack_require__(159);\nvar errs = __webpack_require__(74);\n\nmodule.exports = {\n\t/* top-level classes */\n\tKey: Key,\n\tparseKey: Key.parse,\n\tFingerprint: Fingerprint,\n\tparseFingerprint: Fingerprint.parse,\n\tSignature: Signature,\n\tparseSignature: Signature.parse,\n\tPrivateKey: PrivateKey,\n\tparsePrivateKey: PrivateKey.parse,\n\tgeneratePrivateKey: PrivateKey.generate,\n\tCertificate: Certificate,\n\tparseCertificate: Certificate.parse,\n\tcreateSelfSignedCertificate: Certificate.createSelfSigned,\n\tcreateCertificate: Certificate.create,\n\tIdentity: Identity,\n\tidentityFromDN: Identity.parseDN,\n\tidentityForHost: Identity.forHost,\n\tidentityForUser: Identity.forUser,\n\tidentityForEmail: Identity.forEmail,\n\n\t/* errors */\n\tFingerprintFormatError: errs.FingerprintFormatError,\n\tInvalidAlgorithmError: errs.InvalidAlgorithmError,\n\tKeyParseError: errs.KeyParseError,\n\tSignatureParseError: errs.SignatureParseError,\n\tKeyEncryptedError: errs.KeyEncryptedError,\n\tCertificateParseError: errs.CertificateParseError\n};\n\n\n/***/ }),\n/* 330 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst ansiRegex = __webpack_require__(948);\n\nmodule.exports = input => typeof input === 'string' ? input.replace(ansiRegex(), '') : input;\n\n\n/***/ }),\n/* 331 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar hasFlag = __webpack_require__(273);\n\nvar support = function (level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel: level,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n};\n\nvar supportLevel = (function () {\n\tif (hasFlag('no-color') ||\n\t\thasFlag('no-colors') ||\n\t\thasFlag('color=false')) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (hasFlag('color') ||\n\t\thasFlag('colors') ||\n\t\thasFlag('color=true') ||\n\t\thasFlag('color=always')) {\n\t\treturn 1;\n\t}\n\n\tif (process.stdout && !process.stdout.isTTY) {\n\t\treturn 0;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn 1;\n\t}\n\n\tif ('CI' in process.env) {\n\t\tif ('TRAVIS' in process.env || process.env.CI === 'Travis') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn 0;\n\t}\n\n\tif ('TEAMCITY_VERSION' in process.env) {\n\t\treturn process.env.TEAMCITY_VERSION.match(/^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/) === null ? 0 : 1;\n\t}\n\n\tif (/^(screen|xterm)-256(?:color)?/.test(process.env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in process.env) {\n\t\treturn 1;\n\t}\n\n\tif (process.env.TERM === 'dumb') {\n\t\treturn 0;\n\t}\n\n\treturn 0;\n})();\n\nif (supportLevel === 0 && 'FORCE_COLOR' in process.env) {\n\tsupportLevel = 1;\n}\n\nmodule.exports = process && support(supportLevel);\n\n\n/***/ }),\n/* 332 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"child_process\");\n\n/***/ }),\n/* 333 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"string_decoder\");\n\n/***/ }),\n/* 334 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _access;\n\nfunction _load_access() {\n  return _access = _interopRequireWildcard(__webpack_require__(493));\n}\n\nvar _add;\n\nfunction _load_add() {\n  return _add = _interopRequireWildcard(__webpack_require__(165));\n}\n\nvar _audit;\n\nfunction _load_audit() {\n  return _audit = _interopRequireWildcard(__webpack_require__(347));\n}\n\nvar _autoclean;\n\nfunction _load_autoclean() {\n  return _autoclean = _interopRequireWildcard(__webpack_require__(348));\n}\n\nvar _bin;\n\nfunction _load_bin() {\n  return _bin = _interopRequireWildcard(__webpack_require__(494));\n}\n\nvar _cache;\n\nfunction _load_cache() {\n  return _cache = _interopRequireWildcard(__webpack_require__(349));\n}\n\nvar _check;\n\nfunction _load_check() {\n  return _check = _interopRequireWildcard(__webpack_require__(350));\n}\n\nvar _config;\n\nfunction _load_config() {\n  return _config = _interopRequireWildcard(__webpack_require__(495));\n}\n\nvar _create;\n\nfunction _load_create() {\n  return _create = _interopRequireWildcard(__webpack_require__(496));\n}\n\nvar _exec;\n\nfunction _load_exec() {\n  return _exec = _interopRequireWildcard(__webpack_require__(497));\n}\n\nvar _generateLockEntry;\n\nfunction _load_generateLockEntry() {\n  return _generateLockEntry = _interopRequireWildcard(__webpack_require__(498));\n}\n\nvar _global;\n\nfunction _load_global() {\n  return _global = _interopRequireWildcard(__webpack_require__(122));\n}\n\nvar _help;\n\nfunction _load_help() {\n  return _help = _interopRequireWildcard(__webpack_require__(499));\n}\n\nvar _import;\n\nfunction _load_import() {\n  return _import = _interopRequireWildcard(__webpack_require__(500));\n}\n\nvar _info;\n\nfunction _load_info() {\n  return _info = _interopRequireWildcard(__webpack_require__(501));\n}\n\nvar _init;\n\nfunction _load_init() {\n  return _init = _interopRequireWildcard(__webpack_require__(502));\n}\n\nvar _install;\n\nfunction _load_install() {\n  return _install = _interopRequireWildcard(__webpack_require__(34));\n}\n\nvar _licenses;\n\nfunction _load_licenses() {\n  return _licenses = _interopRequireWildcard(__webpack_require__(503));\n}\n\nvar _link;\n\nfunction _load_link() {\n  return _link = _interopRequireWildcard(__webpack_require__(351));\n}\n\nvar _login;\n\nfunction _load_login() {\n  return _login = _interopRequireWildcard(__webpack_require__(107));\n}\n\nvar _logout;\n\nfunction _load_logout() {\n  return _logout = _interopRequireWildcard(__webpack_require__(504));\n}\n\nvar _list;\n\nfunction _load_list() {\n  return _list = _interopRequireWildcard(__webpack_require__(352));\n}\n\nvar _node;\n\nfunction _load_node() {\n  return _node = _interopRequireWildcard(__webpack_require__(505));\n}\n\nvar _outdated;\n\nfunction _load_outdated() {\n  return _outdated = _interopRequireWildcard(__webpack_require__(506));\n}\n\nvar _owner;\n\nfunction _load_owner() {\n  return _owner = _interopRequireWildcard(__webpack_require__(507));\n}\n\nvar _pack;\n\nfunction _load_pack() {\n  return _pack = _interopRequireWildcard(__webpack_require__(166));\n}\n\nvar _policies;\n\nfunction _load_policies() {\n  return _policies = _interopRequireWildcard(__webpack_require__(508));\n}\n\nvar _publish;\n\nfunction _load_publish() {\n  return _publish = _interopRequireWildcard(__webpack_require__(509));\n}\n\nvar _remove;\n\nfunction _load_remove() {\n  return _remove = _interopRequireWildcard(__webpack_require__(353));\n}\n\nvar _run;\n\nfunction _load_run() {\n  return _run = _interopRequireWildcard(__webpack_require__(354));\n}\n\nvar _tag;\n\nfunction _load_tag() {\n  return _tag = _interopRequireWildcard(__webpack_require__(355));\n}\n\nvar _team;\n\nfunction _load_team() {\n  return _team = _interopRequireWildcard(__webpack_require__(510));\n}\n\nvar _unplug;\n\nfunction _load_unplug() {\n  return _unplug = _interopRequireWildcard(__webpack_require__(512));\n}\n\nvar _unlink;\n\nfunction _load_unlink() {\n  return _unlink = _interopRequireWildcard(__webpack_require__(511));\n}\n\nvar _upgrade;\n\nfunction _load_upgrade() {\n  return _upgrade = _interopRequireWildcard(__webpack_require__(205));\n}\n\nvar _version;\n\nfunction _load_version() {\n  return _version = _interopRequireWildcard(__webpack_require__(357));\n}\n\nvar _versions;\n\nfunction _load_versions() {\n  return _versions = _interopRequireWildcard(__webpack_require__(513));\n}\n\nvar _why;\n\nfunction _load_why() {\n  return _why = _interopRequireWildcard(__webpack_require__(514));\n}\n\nvar _workspaces;\n\nfunction _load_workspaces() {\n  return _workspaces = _interopRequireWildcard(__webpack_require__(516));\n}\n\nvar _workspace;\n\nfunction _load_workspace() {\n  return _workspace = _interopRequireWildcard(__webpack_require__(515));\n}\n\nvar _upgradeInteractive;\n\nfunction _load_upgradeInteractive() {\n  return _upgradeInteractive = _interopRequireWildcard(__webpack_require__(356));\n}\n\nvar _useless;\n\nfunction _load_useless() {\n  return _useless = _interopRequireDefault(__webpack_require__(492));\n}\n\nvar _aliases;\n\nfunction _load_aliases() {\n  return _aliases = _interopRequireDefault(__webpack_require__(346));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nconst chalk = __webpack_require__(27);\n\n\nconst getDocsLink = name => `${(_constants || _load_constants()).YARN_DOCS}${name || ''}`;\nconst getDocsInfo = name => 'Visit ' + chalk.bold(getDocsLink(name)) + ' for documentation about this command.';\n\nconst commands = {\n  access: _access || _load_access(),\n  add: _add || _load_add(),\n  audit: _audit || _load_audit(),\n  autoclean: _autoclean || _load_autoclean(),\n  bin: _bin || _load_bin(),\n  cache: _cache || _load_cache(),\n  check: _check || _load_check(),\n  config: _config || _load_config(),\n  create: _create || _load_create(),\n  dedupe: (0, (_useless || _load_useless()).default)(\"The dedupe command isn't necessary. `yarn install` will already dedupe.\"),\n  exec: _exec || _load_exec(),\n  generateLockEntry: _generateLockEntry || _load_generateLockEntry(),\n  global: _global || _load_global(),\n  help: _help || _load_help(),\n  import: _import || _load_import(),\n  info: _info || _load_info(),\n  init: _init || _load_init(),\n  install: _install || _load_install(),\n  licenses: _licenses || _load_licenses(),\n  link: _link || _load_link(),\n  lockfile: (0, (_useless || _load_useless()).default)(\"The lockfile command isn't necessary. `yarn install` will produce a lockfile.\"),\n  login: _login || _load_login(),\n  logout: _logout || _load_logout(),\n  list: _list || _load_list(),\n  node: _node || _load_node(),\n  outdated: _outdated || _load_outdated(),\n  owner: _owner || _load_owner(),\n  pack: _pack || _load_pack(),\n  policies: _policies || _load_policies(),\n  prune: (0, (_useless || _load_useless()).default)(\"The prune command isn't necessary. `yarn install` will prune extraneous packages.\"),\n  publish: _publish || _load_publish(),\n  remove: _remove || _load_remove(),\n  run: _run || _load_run(),\n  tag: _tag || _load_tag(),\n  team: _team || _load_team(),\n  unplug: _unplug || _load_unplug(),\n  unlink: _unlink || _load_unlink(),\n  upgrade: _upgrade || _load_upgrade(),\n  version: _version || _load_version(),\n  versions: _versions || _load_versions(),\n  why: _why || _load_why(),\n  workspaces: _workspaces || _load_workspaces(),\n  workspace: _workspace || _load_workspace(),\n  upgradeInteractive: _upgradeInteractive || _load_upgradeInteractive()\n};\n\nfor (const key in commands) {\n  commands[key].getDocsInfo = getDocsInfo(key);\n}\n\nfor (const key in (_aliases || _load_aliases()).default) {\n  commands[key] = commands[(_aliases || _load_aliases()).default[key]];\n  commands[key].getDocsInfo = getDocsInfo(key);\n}\n\nexports.default = commands;\n\n/***/ }),\n/* 335 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getRcConfigForCwd = getRcConfigForCwd;\nexports.getRcConfigForFolder = getRcConfigForFolder;\nexports.getRcArgs = getRcArgs;\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = __webpack_require__(4);\n}\n\nvar _path;\n\nfunction _load_path() {\n  return _path = __webpack_require__(0);\n}\n\nvar _commander;\n\nfunction _load_commander() {\n  return _commander = _interopRequireDefault(__webpack_require__(338));\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = __webpack_require__(19);\n}\n\nvar _rc;\n\nfunction _load_rc() {\n  return _rc = _interopRequireWildcard(__webpack_require__(558));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Keys that will get resolved relative to the path of the rc file they belong to\nconst PATH_KEYS = new Set(['yarn-path', 'cache-folder', 'global-folder', 'modules-folder', 'cwd', 'offline-cache-folder']);\n\n// given a cwd, load all .yarnrc files relative to it\n\n\nfunction getRcConfigForCwd(cwd, args) {\n  const config = {};\n\n  if (args.indexOf('--no-default-rc') === -1) {\n    Object.assign(config, (_rc || _load_rc()).findRc('yarn', cwd, (fileText, filePath) => {\n      return loadRcFile(fileText, filePath);\n    }));\n  }\n\n  for (let index = args.indexOf('--use-yarnrc'); index !== -1; index = args.indexOf('--use-yarnrc', index + 1)) {\n    const value = args[index + 1];\n\n    if (value && value.charAt(0) !== '-') {\n      Object.assign(config, loadRcFile((0, (_fs || _load_fs()).readFileSync)(value, 'utf8'), value));\n    }\n  }\n\n  return config;\n}\n\nfunction getRcConfigForFolder(cwd) {\n  const filePath = (0, (_path || _load_path()).resolve)(cwd, '.yarnrc');\n  if (!(0, (_fs || _load_fs()).existsSync)(filePath)) {\n    return {};\n  }\n\n  const fileText = (0, (_fs || _load_fs()).readFileSync)(filePath, 'utf8');\n  return loadRcFile(fileText, filePath);\n}\n\nfunction loadRcFile(fileText, filePath) {\n  var _parse = (0, (_lockfile || _load_lockfile()).parse)(fileText, filePath);\n\n  let values = _parse.object;\n\n\n  if (filePath.match(/\\.yml$/) && values && typeof values.yarnPath === 'string') {\n    values = { 'yarn-path': values.yarnPath };\n  }\n\n  // some keys reference directories so keep their relativity\n  for (const key in values) {\n    if (PATH_KEYS.has(key.replace(/^(--)?([^.]+\\.)*/, ''))) {\n      values[key] = (0, (_path || _load_path()).resolve)((0, (_path || _load_path()).dirname)(filePath), values[key]);\n    }\n  }\n\n  return values;\n}\n\n// get the built of arguments of a .yarnrc chain of the passed cwd\nfunction buildRcArgs(cwd, args) {\n  const config = getRcConfigForCwd(cwd, args);\n\n  const argsForCommands = new Map();\n\n  for (const key in config) {\n    // args can be prefixed with the command name they're meant for, eg.\n    // `--install.check-files true`\n    const keyMatch = key.match(/^--(?:([^.]+)\\.)?(.*)$/);\n    if (!keyMatch) {\n      continue;\n    }\n\n    const commandName = keyMatch[1] || '*';\n    const arg = keyMatch[2];\n    const value = config[key];\n\n    // create args for this command name if we didn't previously have them\n    const args = argsForCommands.get(commandName) || [];\n    argsForCommands.set(commandName, args);\n\n    // turn config value into appropriate cli flag\n    const option = (_commander || _load_commander()).default.optionFor(`--${arg}`);\n\n    // If commander doesn't recognize the option or it takes a value after it\n    if (!option || option.optional || option.required) {\n      args.push(`--${arg}`, value);\n    } else if (value === true) {\n      // we can't force remove an arg from cli\n      args.push(`--${arg}`);\n    }\n  }\n\n  return argsForCommands;\n}\n\n// extract the value of a --cwd arg if present\nfunction extractCwdArg(args) {\n  for (let i = 0, I = args.length; i < I; ++i) {\n    const arg = args[i];\n    if (arg === '--') {\n      return null;\n    } else if (arg === '--cwd') {\n      return args[i + 1];\n    }\n  }\n  return null;\n}\n\n// get a list of arguments from .yarnrc that apply to this commandName\nfunction getRcArgs(commandName, args, previousCwds = []) {\n  // for the cwd, use the --cwd arg if it was passed or else use process.cwd()\n  const origCwd = extractCwdArg(args) || process.cwd();\n\n  // get a map of command names and their arguments\n  const argMap = buildRcArgs(origCwd, args);\n\n  // concat wildcard arguments and arguments meant for this specific command\n  const newArgs = [...(argMap.get('*') || []), ...(argMap.get(commandName) || [])];\n\n  // check if the .yarnrc args specified a cwd\n  const newCwd = extractCwdArg(newArgs);\n  if (newCwd && newCwd !== origCwd) {\n    // ensure that we don't enter into a loop\n    if (previousCwds.indexOf(newCwd) !== -1) {\n      throw new Error(`Recursive .yarnrc files specifying --cwd flags. Bailing out.`);\n    }\n\n    //  if we have a new cwd then let's refetch the .yarnrc args relative to it\n    return getRcArgs(commandName, newArgs, previousCwds.concat(origCwd));\n  }\n\n  return newArgs;\n}\n\n/***/ }),\n/* 336 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.boolify = boolify;\nexports.boolifyWithDefault = boolifyWithDefault;\nconst FALSY_STRINGS = new Set(['0', 'false']);\n\nfunction boolify(val) {\n  return !FALSY_STRINGS.has(val.toString().toLowerCase());\n}\n\nfunction boolifyWithDefault(val, defaultResult) {\n  return val === '' || val === null || val === undefined ? defaultResult : boolify(val);\n}\n\n/***/ }),\n/* 337 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isOffline = isOffline;\nconst os = __webpack_require__(42);\n\nconst IGNORE_INTERFACES = ['lo0', 'awdl0', 'bridge0'];\nconst LOCAL_IPS = ['127.0.0.1', '::1'];\n\nfunction isOffline() {\n  let interfaces;\n\n  try {\n    interfaces = os.networkInterfaces();\n  } catch (e) {\n    // As of October 2016, Windows Subsystem for Linux (WSL) does not support\n    // the os.networkInterfaces() call and throws instead. For this platform,\n    // assume we are online.\n    if (e.syscall === 'uv_interface_addresses') {\n      return false;\n    } else {\n      throw e;\n    }\n  }\n\n  for (const name in interfaces) {\n    if (IGNORE_INTERFACES.indexOf(name) >= 0) {\n      continue;\n    }\n\n    const addrs = interfaces[name];\n    for (var _iterator = addrs, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const addr = _ref;\n\n      if (LOCAL_IPS.indexOf(addr.address) < 0) {\n        // found a possible remote ip\n        return false;\n      }\n    }\n  }\n\n  return true;\n}\n\n/***/ }),\n/* 338 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n * Module dependencies.\n */\n\nvar EventEmitter = __webpack_require__(77).EventEmitter;\nvar spawn = __webpack_require__(332).spawn;\nvar path = __webpack_require__(0);\nvar dirname = path.dirname;\nvar basename = path.basename;\nvar fs = __webpack_require__(4);\n\n/**\n * Inherit `Command` from `EventEmitter.prototype`.\n */\n\n__webpack_require__(3).inherits(Command, EventEmitter);\n\n/**\n * Expose the root command.\n */\n\nexports = module.exports = new Command();\n\n/**\n * Expose `Command`.\n */\n\nexports.Command = Command;\n\n/**\n * Expose `Option`.\n */\n\nexports.Option = Option;\n\n/**\n * Initialize a new `Option` with the given `flags` and `description`.\n *\n * @param {String} flags\n * @param {String} description\n * @api public\n */\n\nfunction Option(flags, description) {\n  this.flags = flags;\n  this.required = flags.indexOf('<') >= 0;\n  this.optional = flags.indexOf('[') >= 0;\n  this.bool = flags.indexOf('-no-') === -1;\n  flags = flags.split(/[ ,|]+/);\n  if (flags.length > 1 && !/^[[<]/.test(flags[1])) this.short = flags.shift();\n  this.long = flags.shift();\n  this.description = description || '';\n}\n\n/**\n * Return option name.\n *\n * @return {String}\n * @api private\n */\n\nOption.prototype.name = function() {\n  return this.long\n    .replace('--', '')\n    .replace('no-', '');\n};\n\n/**\n * Return option name, in a camelcase format that can be used\n * as a object attribute key.\n *\n * @return {String}\n * @api private\n */\n\nOption.prototype.attributeName = function() {\n  return camelcase(this.name());\n};\n\n/**\n * Check if `arg` matches the short or long flag.\n *\n * @param {String} arg\n * @return {Boolean}\n * @api private\n */\n\nOption.prototype.is = function(arg) {\n  return this.short === arg || this.long === arg;\n};\n\n/**\n * Initialize a new `Command`.\n *\n * @param {String} name\n * @api public\n */\n\nfunction Command(name) {\n  this.commands = [];\n  this.options = [];\n  this._execs = {};\n  this._allowUnknownOption = false;\n  this._args = [];\n  this._name = name || '';\n}\n\n/**\n * Add command `name`.\n *\n * The `.action()` callback is invoked when the\n * command `name` is specified via __ARGV__,\n * and the remaining arguments are applied to the\n * function for access.\n *\n * When the `name` is \"*\" an un-matched command\n * will be passed as the first arg, followed by\n * the rest of __ARGV__ remaining.\n *\n * Examples:\n *\n *      program\n *        .version('0.0.1')\n *        .option('-C, --chdir <path>', 'change the working directory')\n *        .option('-c, --config <path>', 'set config path. defaults to ./deploy.conf')\n *        .option('-T, --no-tests', 'ignore test hook')\n *\n *      program\n *        .command('setup')\n *        .description('run remote setup commands')\n *        .action(function() {\n *          console.log('setup');\n *        });\n *\n *      program\n *        .command('exec <cmd>')\n *        .description('run the given remote command')\n *        .action(function(cmd) {\n *          console.log('exec \"%s\"', cmd);\n *        });\n *\n *      program\n *        .command('teardown <dir> [otherDirs...]')\n *        .description('run teardown commands')\n *        .action(function(dir, otherDirs) {\n *          console.log('dir \"%s\"', dir);\n *          if (otherDirs) {\n *            otherDirs.forEach(function (oDir) {\n *              console.log('dir \"%s\"', oDir);\n *            });\n *          }\n *        });\n *\n *      program\n *        .command('*')\n *        .description('deploy the given env')\n *        .action(function(env) {\n *          console.log('deploying \"%s\"', env);\n *        });\n *\n *      program.parse(process.argv);\n  *\n * @param {String} name\n * @param {String} [desc] for git-style sub-commands\n * @return {Command} the new command\n * @api public\n */\n\nCommand.prototype.command = function(name, desc, opts) {\n  if (typeof desc === 'object' && desc !== null) {\n    opts = desc;\n    desc = null;\n  }\n  opts = opts || {};\n  var args = name.split(/ +/);\n  var cmd = new Command(args.shift());\n\n  if (desc) {\n    cmd.description(desc);\n    this.executables = true;\n    this._execs[cmd._name] = true;\n    if (opts.isDefault) this.defaultExecutable = cmd._name;\n  }\n  cmd._noHelp = !!opts.noHelp;\n  this.commands.push(cmd);\n  cmd.parseExpectedArgs(args);\n  cmd.parent = this;\n\n  if (desc) return this;\n  return cmd;\n};\n\n/**\n * Define argument syntax for the top-level command.\n *\n * @api public\n */\n\nCommand.prototype.arguments = function(desc) {\n  return this.parseExpectedArgs(desc.split(/ +/));\n};\n\n/**\n * Add an implicit `help [cmd]` subcommand\n * which invokes `--help` for the given command.\n *\n * @api private\n */\n\nCommand.prototype.addImplicitHelpCommand = function() {\n  this.command('help [cmd]', 'display help for [cmd]');\n};\n\n/**\n * Parse expected `args`.\n *\n * For example `[\"[type]\"]` becomes `[{ required: false, name: 'type' }]`.\n *\n * @param {Array} args\n * @return {Command} for chaining\n * @api public\n */\n\nCommand.prototype.parseExpectedArgs = function(args) {\n  if (!args.length) return;\n  var self = this;\n  args.forEach(function(arg) {\n    var argDetails = {\n      required: false,\n      name: '',\n      variadic: false\n    };\n\n    switch (arg[0]) {\n      case '<':\n        argDetails.required = true;\n        argDetails.name = arg.slice(1, -1);\n        break;\n      case '[':\n        argDetails.name = arg.slice(1, -1);\n        break;\n    }\n\n    if (argDetails.name.length > 3 && argDetails.name.slice(-3) === '...') {\n      argDetails.variadic = true;\n      argDetails.name = argDetails.name.slice(0, -3);\n    }\n    if (argDetails.name) {\n      self._args.push(argDetails);\n    }\n  });\n  return this;\n};\n\n/**\n * Register callback `fn` for the command.\n *\n * Examples:\n *\n *      program\n *        .command('help')\n *        .description('display verbose help')\n *        .action(function() {\n *           // output help here\n *        });\n *\n * @param {Function} fn\n * @return {Command} for chaining\n * @api public\n */\n\nCommand.prototype.action = function(fn) {\n  var self = this;\n  var listener = function(args, unknown) {\n    // Parse any so-far unknown options\n    args = args || [];\n    unknown = unknown || [];\n\n    var parsed = self.parseOptions(unknown);\n\n    // Output help if necessary\n    outputHelpIfNecessary(self, parsed.unknown);\n\n    // If there are still any unknown options, then we simply\n    // die, unless someone asked for help, in which case we give it\n    // to them, and then we die.\n    if (parsed.unknown.length > 0) {\n      self.unknownOption(parsed.unknown[0]);\n    }\n\n    // Leftover arguments need to be pushed back. Fixes issue #56\n    if (parsed.args.length) args = parsed.args.concat(args);\n\n    self._args.forEach(function(arg, i) {\n      if (arg.required && args[i] == null) {\n        self.missingArgument(arg.name);\n      } else if (arg.variadic) {\n        if (i !== self._args.length - 1) {\n          self.variadicArgNotLast(arg.name);\n        }\n\n        args[i] = args.splice(i);\n      }\n    });\n\n    // Always append ourselves to the end of the arguments,\n    // to make sure we match the number of arguments the user\n    // expects\n    if (self._args.length) {\n      args[self._args.length] = self;\n    } else {\n      args.push(self);\n    }\n\n    fn.apply(self, args);\n  };\n  var parent = this.parent || this;\n  var name = parent === this ? '*' : this._name;\n  parent.on('command:' + name, listener);\n  if (this._alias) parent.on('command:' + this._alias, listener);\n  return this;\n};\n\n/**\n * Define option with `flags`, `description` and optional\n * coercion `fn`.\n *\n * The `flags` string should contain both the short and long flags,\n * separated by comma, a pipe or space. The following are all valid\n * all will output this way when `--help` is used.\n *\n *    \"-p, --pepper\"\n *    \"-p|--pepper\"\n *    \"-p --pepper\"\n *\n * Examples:\n *\n *     // simple boolean defaulting to false\n *     program.option('-p, --pepper', 'add pepper');\n *\n *     --pepper\n *     program.pepper\n *     // => Boolean\n *\n *     // simple boolean defaulting to true\n *     program.option('-C, --no-cheese', 'remove cheese');\n *\n *     program.cheese\n *     // => true\n *\n *     --no-cheese\n *     program.cheese\n *     // => false\n *\n *     // required argument\n *     program.option('-C, --chdir <path>', 'change the working directory');\n *\n *     --chdir /tmp\n *     program.chdir\n *     // => \"/tmp\"\n *\n *     // optional argument\n *     program.option('-c, --cheese [type]', 'add cheese [marble]');\n *\n * @param {String} flags\n * @param {String} description\n * @param {Function|*} [fn] or default\n * @param {*} [defaultValue]\n * @return {Command} for chaining\n * @api public\n */\n\nCommand.prototype.option = function(flags, description, fn, defaultValue) {\n  var self = this,\n    option = new Option(flags, description),\n    oname = option.name(),\n    name = option.attributeName();\n\n  // default as 3rd arg\n  if (typeof fn !== 'function') {\n    if (fn instanceof RegExp) {\n      var regex = fn;\n      fn = function(val, def) {\n        var m = regex.exec(val);\n        return m ? m[0] : def;\n      };\n    } else {\n      defaultValue = fn;\n      fn = null;\n    }\n  }\n\n  // preassign default value only for --no-*, [optional], or <required>\n  if (!option.bool || option.optional || option.required) {\n    // when --no-* we make sure default is true\n    if (!option.bool) defaultValue = true;\n    // preassign only if we have a default\n    if (defaultValue !== undefined) {\n      self[name] = defaultValue;\n      option.defaultValue = defaultValue;\n    }\n  }\n\n  // register the option\n  this.options.push(option);\n\n  // when it's passed assign the value\n  // and conditionally invoke the callback\n  this.on('option:' + oname, function(val) {\n    // coercion\n    if (val !== null && fn) {\n      val = fn(val, self[name] === undefined ? defaultValue : self[name]);\n    }\n\n    // unassigned or bool\n    if (typeof self[name] === 'boolean' || typeof self[name] === 'undefined') {\n      // if no value, bool true, and we have a default, then use it!\n      if (val == null) {\n        self[name] = option.bool\n          ? defaultValue || true\n          : false;\n      } else {\n        self[name] = val;\n      }\n    } else if (val !== null) {\n      // reassign\n      self[name] = val;\n    }\n  });\n\n  return this;\n};\n\n/**\n * Allow unknown options on the command line.\n *\n * @param {Boolean} arg if `true` or omitted, no error will be thrown\n * for unknown options.\n * @api public\n */\nCommand.prototype.allowUnknownOption = function(arg) {\n  this._allowUnknownOption = arguments.length === 0 || arg;\n  return this;\n};\n\n/**\n * Parse `argv`, settings options and invoking commands when defined.\n *\n * @param {Array} argv\n * @return {Command} for chaining\n * @api public\n */\n\nCommand.prototype.parse = function(argv) {\n  // implicit help\n  if (this.executables) this.addImplicitHelpCommand();\n\n  // store raw args\n  this.rawArgs = argv;\n\n  // guess name\n  this._name = this._name || basename(argv[1], '.js');\n\n  // github-style sub-commands with no sub-command\n  if (this.executables && argv.length < 3 && !this.defaultExecutable) {\n    // this user needs help\n    argv.push('--help');\n  }\n\n  // process argv\n  var parsed = this.parseOptions(this.normalize(argv.slice(2)));\n  var args = this.args = parsed.args;\n\n  var result = this.parseArgs(this.args, parsed.unknown);\n\n  // executable sub-commands\n  var name = result.args[0];\n\n  var aliasCommand = null;\n  // check alias of sub commands\n  if (name) {\n    aliasCommand = this.commands.filter(function(command) {\n      return command.alias() === name;\n    })[0];\n  }\n\n  if (this._execs[name] && typeof this._execs[name] !== 'function') {\n    return this.executeSubCommand(argv, args, parsed.unknown);\n  } else if (aliasCommand) {\n    // is alias of a subCommand\n    args[0] = aliasCommand._name;\n    return this.executeSubCommand(argv, args, parsed.unknown);\n  } else if (this.defaultExecutable) {\n    // use the default subcommand\n    args.unshift(this.defaultExecutable);\n    return this.executeSubCommand(argv, args, parsed.unknown);\n  }\n\n  return result;\n};\n\n/**\n * Execute a sub-command executable.\n *\n * @param {Array} argv\n * @param {Array} args\n * @param {Array} unknown\n * @api private\n */\n\nCommand.prototype.executeSubCommand = function(argv, args, unknown) {\n  args = args.concat(unknown);\n\n  if (!args.length) this.help();\n  if (args[0] === 'help' && args.length === 1) this.help();\n\n  // <cmd> --help\n  if (args[0] === 'help') {\n    args[0] = args[1];\n    args[1] = '--help';\n  }\n\n  // executable\n  var f = argv[1];\n  // name of the subcommand, link `pm-install`\n  var bin = basename(f, '.js') + '-' + args[0];\n\n  // In case of globally installed, get the base dir where executable\n  //  subcommand file should be located at\n  var baseDir,\n    link = fs.lstatSync(f).isSymbolicLink() ? fs.readlinkSync(f) : f;\n\n  // when symbolink is relative path\n  if (link !== f && link.charAt(0) !== '/') {\n    link = path.join(dirname(f), link);\n  }\n  baseDir = dirname(link);\n\n  // prefer local `./<bin>` to bin in the $PATH\n  var localBin = path.join(baseDir, bin);\n\n  // whether bin file is a js script with explicit `.js` extension\n  var isExplicitJS = false;\n  if (exists(localBin + '.js')) {\n    bin = localBin + '.js';\n    isExplicitJS = true;\n  } else if (exists(localBin)) {\n    bin = localBin;\n  }\n\n  args = args.slice(1);\n\n  var proc;\n  if (process.platform !== 'win32') {\n    if (isExplicitJS) {\n      args.unshift(bin);\n      // add executable arguments to spawn\n      args = (process.execArgv || []).concat(args);\n\n      proc = spawn(process.argv[0], args, { stdio: 'inherit', customFds: [0, 1, 2] });\n    } else {\n      proc = spawn(bin, args, { stdio: 'inherit', customFds: [0, 1, 2] });\n    }\n  } else {\n    args.unshift(bin);\n    proc = spawn(process.execPath, args, { stdio: 'inherit' });\n  }\n\n  var signals = ['SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGINT', 'SIGHUP'];\n  signals.forEach(function(signal) {\n    process.on(signal, function() {\n      if (proc.killed === false && proc.exitCode === null) {\n        proc.kill(signal);\n      }\n    });\n  });\n  proc.on('close', process.exit.bind(process));\n  proc.on('error', function(err) {\n    if (err.code === 'ENOENT') {\n      console.error('\\n  %s(1) does not exist, try --help\\n', bin);\n    } else if (err.code === 'EACCES') {\n      console.error('\\n  %s(1) not executable. try chmod or run with root\\n', bin);\n    }\n    process.exit(1);\n  });\n\n  // Store the reference to the child process\n  this.runningCommand = proc;\n};\n\n/**\n * Normalize `args`, splitting joined short flags. For example\n * the arg \"-abc\" is equivalent to \"-a -b -c\".\n * This also normalizes equal sign and splits \"--abc=def\" into \"--abc def\".\n *\n * @param {Array} args\n * @return {Array}\n * @api private\n */\n\nCommand.prototype.normalize = function(args) {\n  var ret = [],\n    arg,\n    lastOpt,\n    index;\n\n  for (var i = 0, len = args.length; i < len; ++i) {\n    arg = args[i];\n    if (i > 0) {\n      lastOpt = this.optionFor(args[i - 1]);\n    }\n\n    if (arg === '--') {\n      // Honor option terminator\n      ret = ret.concat(args.slice(i));\n      break;\n    } else if (lastOpt && lastOpt.required) {\n      ret.push(arg);\n    } else if (arg.length > 1 && arg[0] === '-' && arg[1] !== '-') {\n      arg.slice(1).split('').forEach(function(c) {\n        ret.push('-' + c);\n      });\n    } else if (/^--/.test(arg) && ~(index = arg.indexOf('='))) {\n      ret.push(arg.slice(0, index), arg.slice(index + 1));\n    } else {\n      ret.push(arg);\n    }\n  }\n\n  return ret;\n};\n\n/**\n * Parse command `args`.\n *\n * When listener(s) are available those\n * callbacks are invoked, otherwise the \"*\"\n * event is emitted and those actions are invoked.\n *\n * @param {Array} args\n * @return {Command} for chaining\n * @api private\n */\n\nCommand.prototype.parseArgs = function(args, unknown) {\n  var name;\n\n  if (args.length) {\n    name = args[0];\n    if (this.listeners('command:' + name).length) {\n      this.emit('command:' + args.shift(), args, unknown);\n    } else {\n      this.emit('command:*', args);\n    }\n  } else {\n    outputHelpIfNecessary(this, unknown);\n\n    // If there were no args and we have unknown options,\n    // then they are extraneous and we need to error.\n    if (unknown.length > 0) {\n      this.unknownOption(unknown[0]);\n    }\n  }\n\n  return this;\n};\n\n/**\n * Return an option matching `arg` if any.\n *\n * @param {String} arg\n * @return {Option}\n * @api private\n */\n\nCommand.prototype.optionFor = function(arg) {\n  for (var i = 0, len = this.options.length; i < len; ++i) {\n    if (this.options[i].is(arg)) {\n      return this.options[i];\n    }\n  }\n};\n\n/**\n * Parse options from `argv` returning `argv`\n * void of these options.\n *\n * @param {Array} argv\n * @return {Array}\n * @api public\n */\n\nCommand.prototype.parseOptions = function(argv) {\n  var args = [],\n    len = argv.length,\n    literal,\n    option,\n    arg;\n\n  var unknownOptions = [];\n\n  // parse options\n  for (var i = 0; i < len; ++i) {\n    arg = argv[i];\n\n    // literal args after --\n    if (literal) {\n      args.push(arg);\n      continue;\n    }\n\n    if (arg === '--') {\n      literal = true;\n      continue;\n    }\n\n    // find matching Option\n    option = this.optionFor(arg);\n\n    // option is defined\n    if (option) {\n      // requires arg\n      if (option.required) {\n        arg = argv[++i];\n        if (arg == null) return this.optionMissingArgument(option);\n        this.emit('option:' + option.name(), arg);\n      // optional arg\n      } else if (option.optional) {\n        arg = argv[i + 1];\n        if (arg == null || (arg[0] === '-' && arg !== '-')) {\n          arg = null;\n        } else {\n          ++i;\n        }\n        this.emit('option:' + option.name(), arg);\n      // bool\n      } else {\n        this.emit('option:' + option.name());\n      }\n      continue;\n    }\n\n    // looks like an option\n    if (arg.length > 1 && arg[0] === '-') {\n      unknownOptions.push(arg);\n\n      // If the next argument looks like it might be\n      // an argument for this option, we pass it on.\n      // If it isn't, then it'll simply be ignored\n      if ((i + 1) < argv.length && argv[i + 1][0] !== '-') {\n        unknownOptions.push(argv[++i]);\n      }\n      continue;\n    }\n\n    // arg\n    args.push(arg);\n  }\n\n  return { args: args, unknown: unknownOptions };\n};\n\n/**\n * Return an object containing options as key-value pairs\n *\n * @return {Object}\n * @api public\n */\nCommand.prototype.opts = function() {\n  var result = {},\n    len = this.options.length;\n\n  for (var i = 0; i < len; i++) {\n    var key = this.options[i].attributeName();\n    result[key] = key === this._versionOptionName ? this._version : this[key];\n  }\n  return result;\n};\n\n/**\n * Argument `name` is missing.\n *\n * @param {String} name\n * @api private\n */\n\nCommand.prototype.missingArgument = function(name) {\n  console.error();\n  console.error(\"  error: missing required argument `%s'\", name);\n  console.error();\n  process.exit(1);\n};\n\n/**\n * `Option` is missing an argument, but received `flag` or nothing.\n *\n * @param {String} option\n * @param {String} flag\n * @api private\n */\n\nCommand.prototype.optionMissingArgument = function(option, flag) {\n  console.error();\n  if (flag) {\n    console.error(\"  error: option `%s' argument missing, got `%s'\", option.flags, flag);\n  } else {\n    console.error(\"  error: option `%s' argument missing\", option.flags);\n  }\n  console.error();\n  process.exit(1);\n};\n\n/**\n * Unknown option `flag`.\n *\n * @param {String} flag\n * @api private\n */\n\nCommand.prototype.unknownOption = function(flag) {\n  if (this._allowUnknownOption) return;\n  console.error();\n  console.error(\"  error: unknown option `%s'\", flag);\n  console.error();\n  process.exit(1);\n};\n\n/**\n * Variadic argument with `name` is not the last argument as required.\n *\n * @param {String} name\n * @api private\n */\n\nCommand.prototype.variadicArgNotLast = function(name) {\n  console.error();\n  console.error(\"  error: variadic arguments must be last `%s'\", name);\n  console.error();\n  process.exit(1);\n};\n\n/**\n * Set the program version to `str`.\n *\n * This method auto-registers the \"-V, --version\" flag\n * which will print the version number when passed.\n *\n * @param {String} str\n * @param {String} [flags]\n * @return {Command} for chaining\n * @api public\n */\n\nCommand.prototype.version = function(str, flags) {\n  if (arguments.length === 0) return this._version;\n  this._version = str;\n  flags = flags || '-V, --version';\n  var versionOption = new Option(flags, 'output the version number');\n  this._versionOptionName = versionOption.long.substr(2) || 'version';\n  this.options.push(versionOption);\n  this.on('option:' + this._versionOptionName, function() {\n    process.stdout.write(str + '\\n');\n    process.exit(0);\n  });\n  return this;\n};\n\n/**\n * Set the description to `str`.\n *\n * @param {String} str\n * @param {Object} argsDescription\n * @return {String|Command}\n * @api public\n */\n\nCommand.prototype.description = function(str, argsDescription) {\n  if (arguments.length === 0) return this._description;\n  this._description = str;\n  this._argsDescription = argsDescription;\n  return this;\n};\n\n/**\n * Set an alias for the command\n *\n * @param {String} alias\n * @return {String|Command}\n * @api public\n */\n\nCommand.prototype.alias = function(alias) {\n  var command = this;\n  if (this.commands.length !== 0) {\n    command = this.commands[this.commands.length - 1];\n  }\n\n  if (arguments.length === 0) return command._alias;\n\n  if (alias === command._name) throw new Error('Command alias can\\'t be the same as its name');\n\n  command._alias = alias;\n  return this;\n};\n\n/**\n * Set / get the command usage `str`.\n *\n * @param {String} str\n * @return {String|Command}\n * @api public\n */\n\nCommand.prototype.usage = function(str) {\n  var args = this._args.map(function(arg) {\n    return humanReadableArgName(arg);\n  });\n\n  var usage = '[options]' +\n    (this.commands.length ? ' [command]' : '') +\n    (this._args.length ? ' ' + args.join(' ') : '');\n\n  if (arguments.length === 0) return this._usage || usage;\n  this._usage = str;\n\n  return this;\n};\n\n/**\n * Get or set the name of the command\n *\n * @param {String} str\n * @return {String|Command}\n * @api public\n */\n\nCommand.prototype.name = function(str) {\n  if (arguments.length === 0) return this._name;\n  this._name = str;\n  return this;\n};\n\n/**\n * Return prepared commands.\n *\n * @return {Array}\n * @api private\n */\n\nCommand.prototype.prepareCommands = function() {\n  return this.commands.filter(function(cmd) {\n    return !cmd._noHelp;\n  }).map(function(cmd) {\n    var args = cmd._args.map(function(arg) {\n      return humanReadableArgName(arg);\n    }).join(' ');\n\n    return [\n      cmd._name +\n        (cmd._alias ? '|' + cmd._alias : '') +\n        (cmd.options.length ? ' [options]' : '') +\n        (args ? ' ' + args : ''),\n      cmd._description\n    ];\n  });\n};\n\n/**\n * Return the largest command length.\n *\n * @return {Number}\n * @api private\n */\n\nCommand.prototype.largestCommandLength = function() {\n  var commands = this.prepareCommands();\n  return commands.reduce(function(max, command) {\n    return Math.max(max, command[0].length);\n  }, 0);\n};\n\n/**\n * Return the largest option length.\n *\n * @return {Number}\n * @api private\n */\n\nCommand.prototype.largestOptionLength = function() {\n  var options = [].slice.call(this.options);\n  options.push({\n    flags: '-h, --help'\n  });\n  return options.reduce(function(max, option) {\n    return Math.max(max, option.flags.length);\n  }, 0);\n};\n\n/**\n * Return the largest arg length.\n *\n * @return {Number}\n * @api private\n */\n\nCommand.prototype.largestArgLength = function() {\n  return this._args.reduce(function(max, arg) {\n    return Math.max(max, arg.name.length);\n  }, 0);\n};\n\n/**\n * Return the pad width.\n *\n * @return {Number}\n * @api private\n */\n\nCommand.prototype.padWidth = function() {\n  var width = this.largestOptionLength();\n  if (this._argsDescription && this._args.length) {\n    if (this.largestArgLength() > width) {\n      width = this.largestArgLength();\n    }\n  }\n\n  if (this.commands && this.commands.length) {\n    if (this.largestCommandLength() > width) {\n      width = this.largestCommandLength();\n    }\n  }\n\n  return width;\n};\n\n/**\n * Return help for options.\n *\n * @return {String}\n * @api private\n */\n\nCommand.prototype.optionHelp = function() {\n  var width = this.padWidth();\n\n  // Append the help information\n  return this.options.map(function(option) {\n    return pad(option.flags, width) + '  ' + option.description +\n      ((option.bool && option.defaultValue !== undefined) ? ' (default: ' + option.defaultValue + ')' : '');\n  }).concat([pad('-h, --help', width) + '  ' + 'output usage information'])\n    .join('\\n');\n};\n\n/**\n * Return command help documentation.\n *\n * @return {String}\n * @api private\n */\n\nCommand.prototype.commandHelp = function() {\n  if (!this.commands.length) return '';\n\n  var commands = this.prepareCommands();\n  var width = this.padWidth();\n\n  return [\n    '  Commands:',\n    '',\n    commands.map(function(cmd) {\n      var desc = cmd[1] ? '  ' + cmd[1] : '';\n      return (desc ? pad(cmd[0], width) : cmd[0]) + desc;\n    }).join('\\n').replace(/^/gm, '    '),\n    ''\n  ].join('\\n');\n};\n\n/**\n * Return program help documentation.\n *\n * @return {String}\n * @api private\n */\n\nCommand.prototype.helpInformation = function() {\n  var desc = [];\n  if (this._description) {\n    desc = [\n      '  ' + this._description,\n      ''\n    ];\n\n    var argsDescription = this._argsDescription;\n    if (argsDescription && this._args.length) {\n      var width = this.padWidth();\n      desc.push('  Arguments:');\n      desc.push('');\n      this._args.forEach(function(arg) {\n        desc.push('    ' + pad(arg.name, width) + '  ' + argsDescription[arg.name]);\n      });\n      desc.push('');\n    }\n  }\n\n  var cmdName = this._name;\n  if (this._alias) {\n    cmdName = cmdName + '|' + this._alias;\n  }\n  var usage = [\n    '',\n    '  Usage: ' + cmdName + ' ' + this.usage(),\n    ''\n  ];\n\n  var cmds = [];\n  var commandHelp = this.commandHelp();\n  if (commandHelp) cmds = [commandHelp];\n\n  var options = [\n    '  Options:',\n    '',\n    '' + this.optionHelp().replace(/^/gm, '    '),\n    ''\n  ];\n\n  return usage\n    .concat(desc)\n    .concat(options)\n    .concat(cmds)\n    .join('\\n');\n};\n\n/**\n * Output help information for this command\n *\n * @api public\n */\n\nCommand.prototype.outputHelp = function(cb) {\n  if (!cb) {\n    cb = function(passthru) {\n      return passthru;\n    };\n  }\n  process.stdout.write(cb(this.helpInformation()));\n  this.emit('--help');\n};\n\n/**\n * Output help information and exit.\n *\n * @api public\n */\n\nCommand.prototype.help = function(cb) {\n  this.outputHelp(cb);\n  process.exit();\n};\n\n/**\n * Camel-case the given `flag`\n *\n * @param {String} flag\n * @return {String}\n * @api private\n */\n\nfunction camelcase(flag) {\n  return flag.split('-').reduce(function(str, word) {\n    return str + word[0].toUpperCase() + word.slice(1);\n  });\n}\n\n/**\n * Pad `str` to `width`.\n *\n * @param {String} str\n * @param {Number} width\n * @return {String}\n * @api private\n */\n\nfunction pad(str, width) {\n  var len = Math.max(0, width - str.length);\n  return str + Array(len + 1).join(' ');\n}\n\n/**\n * Output help information if necessary\n *\n * @param {Command} command to output help for\n * @param {Array} array of options to search for -h or --help\n * @api private\n */\n\nfunction outputHelpIfNecessary(cmd, options) {\n  options = options || [];\n  for (var i = 0; i < options.length; i++) {\n    if (options[i] === '--help' || options[i] === '-h') {\n      cmd.outputHelp();\n      process.exit(0);\n    }\n  }\n}\n\n/**\n * Takes an argument an returns its human readable equivalent for help usage.\n *\n * @param {Object} arg\n * @return {String}\n * @api private\n */\n\nfunction humanReadableArgName(arg) {\n  var nameOutput = arg.name + (arg.variadic === true ? '...' : '');\n\n  return arg.required\n    ? '<' + nameOutput + '>'\n    : '[' + nameOutput + ']';\n}\n\n// for versions before node v0.8 when there weren't `fs.existsSync`\nfunction exists(file) {\n  try {\n    if (fs.statSync(file).isFile()) {\n      return true;\n    }\n  } catch (e) {\n    return false;\n  }\n}\n\n\n/***/ }),\n/* 339 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(477)().Promise\n\n\n/***/ }),\n/* 340 */\n/***/ (function(module, exports) {\n\n// API\nmodule.exports = abort;\n\n/**\n * Aborts leftover active jobs\n *\n * @param {object} state - current state object\n */\nfunction abort(state)\n{\n  Object.keys(state.jobs).forEach(clean.bind(state));\n\n  // reset leftover jobs\n  state.jobs = {};\n}\n\n/**\n * Cleans up leftover job by invoking abort function for the provided job id\n *\n * @this  state\n * @param {string|number} key - job id to abort\n */\nfunction clean(key)\n{\n  if (typeof this.jobs[key] == 'function')\n  {\n    this.jobs[key]();\n  }\n}\n\n\n/***/ }),\n/* 341 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar defer = __webpack_require__(486);\n\n// API\nmodule.exports = async;\n\n/**\n * Runs provided callback asynchronously\n * even if callback itself is not\n *\n * @param   {function} callback - callback to invoke\n * @returns {function} - augmented callback\n */\nfunction async(callback)\n{\n  var isAsync = false;\n\n  // check if async happened\n  defer(function() { isAsync = true; });\n\n  return function async_callback(err, result)\n  {\n    if (isAsync)\n    {\n      callback(err, result);\n    }\n    else\n    {\n      defer(function nextTick_callback()\n      {\n        callback(err, result);\n      });\n    }\n  };\n}\n\n\n/***/ }),\n/* 342 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar async = __webpack_require__(341)\n  , abort = __webpack_require__(340)\n  ;\n\n// API\nmodule.exports = iterate;\n\n/**\n * Iterates over each job object\n *\n * @param {array|object} list - array or object (named list) to iterate over\n * @param {function} iterator - iterator to run\n * @param {object} state - current job status\n * @param {function} callback - invoked when all elements processed\n */\nfunction iterate(list, iterator, state, callback)\n{\n  // store current index\n  var key = state['keyedList'] ? state['keyedList'][state.index] : state.index;\n\n  state.jobs[key] = runJob(iterator, key, list[key], function(error, output)\n  {\n    // don't repeat yourself\n    // skip secondary callbacks\n    if (!(key in state.jobs))\n    {\n      return;\n    }\n\n    // clean up jobs\n    delete state.jobs[key];\n\n    if (error)\n    {\n      // don't process rest of the results\n      // stop still active jobs\n      // and reset the list\n      abort(state);\n    }\n    else\n    {\n      state.results[key] = output;\n    }\n\n    // return salvaged results\n    callback(error, state.results);\n  });\n}\n\n/**\n * Runs iterator over provided job element\n *\n * @param   {function} iterator - iterator to invoke\n * @param   {string|number} key - key/index of the element in the list of jobs\n * @param   {mixed} item - job description\n * @param   {function} callback - invoked after iterator is done with the job\n * @returns {function|mixed} - job abort function or something else\n */\nfunction runJob(iterator, key, item, callback)\n{\n  var aborter;\n\n  // allow shortcut if iterator expects only two arguments\n  if (iterator.length == 2)\n  {\n    aborter = iterator(item, async(callback));\n  }\n  // otherwise go with full three arguments\n  else\n  {\n    aborter = iterator(item, key, async(callback));\n  }\n\n  return aborter;\n}\n\n\n/***/ }),\n/* 343 */\n/***/ (function(module, exports) {\n\n// API\nmodule.exports = state;\n\n/**\n * Creates initial state object\n * for iteration over list\n *\n * @param   {array|object} list - list to iterate over\n * @param   {function|null} sortMethod - function to use for keys sort,\n *                                     or `null` to keep them as is\n * @returns {object} - initial state object\n */\nfunction state(list, sortMethod)\n{\n  var isNamedList = !Array.isArray(list)\n    , initState =\n    {\n      index    : 0,\n      keyedList: isNamedList || sortMethod ? Object.keys(list) : null,\n      jobs     : {},\n      results  : isNamedList ? {} : [],\n      size     : isNamedList ? Object.keys(list).length : list.length\n    }\n    ;\n\n  if (sortMethod)\n  {\n    // sort array keys based on it's values\n    // sort object's keys just on own merit\n    initState.keyedList.sort(isNamedList ? sortMethod : function(a, b)\n    {\n      return sortMethod(list[a], list[b]);\n    });\n  }\n\n  return initState;\n}\n\n\n/***/ }),\n/* 344 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar abort = __webpack_require__(340)\n  , async = __webpack_require__(341)\n  ;\n\n// API\nmodule.exports = terminator;\n\n/**\n * Terminates jobs in the attached state context\n *\n * @this  AsyncKitState#\n * @param {function} callback - final callback to invoke after termination\n */\nfunction terminator(callback)\n{\n  if (!Object.keys(this.jobs).length)\n  {\n    return;\n  }\n\n  // fast forward iteration index\n  this.index = this.size;\n\n  // abort jobs\n  abort(this);\n\n  // send back results we have so far\n  async(callback)(null, this.results);\n}\n\n\n/***/ }),\n/* 345 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar iterate    = __webpack_require__(342)\n  , initState  = __webpack_require__(343)\n  , terminator = __webpack_require__(344)\n  ;\n\n// Public API\nmodule.exports = serialOrdered;\n// sorting helpers\nmodule.exports.ascending  = ascending;\nmodule.exports.descending = descending;\n\n/**\n * Runs iterator over provided sorted array elements in series\n *\n * @param   {array|object} list - array or object (named list) to iterate over\n * @param   {function} iterator - iterator to run\n * @param   {function} sortMethod - custom sort function\n * @param   {function} callback - invoked when all elements processed\n * @returns {function} - jobs terminator\n */\nfunction serialOrdered(list, iterator, sortMethod, callback)\n{\n  var state = initState(list, sortMethod);\n\n  iterate(list, iterator, state, function iteratorHandler(error, result)\n  {\n    if (error)\n    {\n      callback(error, result);\n      return;\n    }\n\n    state.index++;\n\n    // are we there yet?\n    if (state.index < (state['keyedList'] || list).length)\n    {\n      iterate(list, iterator, state, iteratorHandler);\n      return;\n    }\n\n    // done here\n    callback(null, state.results);\n  });\n\n  return terminator.bind(state, callback);\n}\n\n/*\n * -- Sort methods\n */\n\n/**\n * sort helper to sort array elements in ascending order\n *\n * @param   {mixed} a - an item to compare\n * @param   {mixed} b - an item to compare\n * @returns {number} - comparison result\n */\nfunction ascending(a, b)\n{\n  return a < b ? -1 : a > b ? 1 : 0;\n}\n\n/**\n * sort helper to sort array elements in descending order\n *\n * @param   {mixed} a - an item to compare\n * @param   {mixed} b - an item to compare\n * @returns {number} - comparison result\n */\nfunction descending(a, b)\n{\n  return -1 * ascending(a, b);\n}\n\n\n/***/ }),\n/* 346 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = {\n  'upgrade-interactive': 'upgradeInteractive',\n  'generate-lock-entry': 'generateLockEntry'\n};\n\n/***/ }),\n/* 347 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const DEFAULT_LOG_LEVEL = 'info';\n    const audit = new Audit(config, reporter, {\n      groups: flags.groups || (_constants || _load_constants()).OWNED_DEPENDENCY_TYPES,\n      level: flags.level || DEFAULT_LOG_LEVEL\n    });\n    const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.lockfileFolder, reporter);\n    const install = new (_install || _load_install()).Install({}, config, reporter, lockfile);\n\n    var _ref2 = yield install.fetchRequestFromCwd();\n\n    const manifest = _ref2.manifest,\n          requests = _ref2.requests,\n          patterns = _ref2.patterns,\n          workspaceLayout = _ref2.workspaceLayout;\n\n    yield install.resolver.init(requests, {\n      workspaceLayout\n    });\n\n    const vulnerabilities = yield audit.performAudit(manifest, lockfile, install.resolver, install.linker, patterns);\n\n    const EXIT_INFO = 1;\n    const EXIT_LOW = 2;\n    const EXIT_MODERATE = 4;\n    const EXIT_HIGH = 8;\n    const EXIT_CRITICAL = 16;\n\n    const exitCode = (vulnerabilities.info ? EXIT_INFO : 0) + (vulnerabilities.low ? EXIT_LOW : 0) + (vulnerabilities.moderate ? EXIT_MODERATE : 0) + (vulnerabilities.high ? EXIT_HIGH : 0) + (vulnerabilities.critical ? EXIT_CRITICAL : 0);\n\n    if (flags.summary) {\n      audit.summary();\n    } else {\n      audit.report();\n    }\n\n    return exitCode;\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _promise;\n\nfunction _load_promise() {\n  return _promise = __webpack_require__(51);\n}\n\nvar _hoistedTreeBuilder;\n\nfunction _load_hoistedTreeBuilder() {\n  return _hoistedTreeBuilder = __webpack_require__(522);\n}\n\nvar _getTransitiveDevDependencies;\n\nfunction _load_getTransitiveDevDependencies() {\n  return _getTransitiveDevDependencies = __webpack_require__(548);\n}\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst zlib = __webpack_require__(199);\n\nconst gzip = (0, (_promise || _load_promise()).promisify)(zlib.gzip);\n\nfunction setFlags(commander) {\n  commander.description('Checks for known security issues with the installed packages.');\n  commander.option('--summary', 'Only print the summary.');\n  commander.option('--groups <group_name> [<group_name> ...]', `Only audit dependencies from listed groups. Default: ${(_constants || _load_constants()).OWNED_DEPENDENCY_TYPES.join(', ')}`, groups => groups.split(' '), (_constants || _load_constants()).OWNED_DEPENDENCY_TYPES);\n  commander.option('--level <severity>', `Only print advisories with severity greater than or equal to one of the following: \\\n    info|low|moderate|high|critical. Default: info`, 'info');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\nclass Audit {\n\n  constructor(config, reporter, options) {\n    this.severityLevels = ['info', 'low', 'moderate', 'high', 'critical'];\n\n    this.config = config;\n    this.reporter = reporter;\n    this.options = options;\n  }\n\n  _mapHoistedNodes(auditNode, hoistedNodes, transitiveDevDeps) {\n    for (var _iterator = hoistedNodes, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref3;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref3 = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref3 = _i.value;\n      }\n\n      const node = _ref3;\n\n      const pkg = node.manifest.pkg;\n      const requires = Object.assign({}, pkg.dependencies || {}, pkg.optionalDependencies || {});\n      for (var _iterator2 = Object.keys(requires), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref4;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref4 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref4 = _i2.value;\n        }\n\n        const name = _ref4;\n\n        if (!requires[name]) {\n          requires[name] = '*';\n        }\n      }\n      auditNode.dependencies[node.name] = {\n        version: node.version,\n        integrity: pkg._remote ? pkg._remote.integrity || '' : '',\n        requires,\n        dependencies: {},\n        dev: transitiveDevDeps.has(`${node.name}@${node.version}`)\n      };\n      if (node.children) {\n        this._mapHoistedNodes(auditNode.dependencies[node.name], node.children, transitiveDevDeps);\n      }\n    }\n  }\n\n  _mapHoistedTreesToAuditTree(manifest, hoistedTrees, transitiveDevDeps) {\n    const requiresGroups = this.options.groups.map(function (group) {\n      return manifest[group] || {};\n    });\n\n    const auditTree = {\n      name: manifest.name || undefined,\n      version: manifest.version || undefined,\n      install: [],\n      remove: [],\n      metadata: {\n        //TODO: What do we send here? npm sends npm version, node version, etc.\n      },\n      requires: Object.assign({}, ...requiresGroups),\n      integrity: undefined,\n      dependencies: {},\n      dev: false\n    };\n\n    this._mapHoistedNodes(auditTree, hoistedTrees, transitiveDevDeps);\n    return auditTree;\n  }\n\n  _fetchAudit(auditTree) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      let responseJson;\n      const registry = (_constants || _load_constants()).YARN_REGISTRY;\n      _this.reporter.verbose(`Audit Request: ${JSON.stringify(auditTree, null, 2)}`);\n      const requestBody = yield gzip(JSON.stringify(auditTree));\n      const response = yield _this.config.requestManager.request({\n        url: `${registry}/-/npm/v1/security/audits`,\n        method: 'POST',\n        body: requestBody,\n        headers: {\n          'Content-Encoding': 'gzip',\n          'Content-Type': 'application/json',\n          Accept: 'application/json'\n        }\n      });\n\n      try {\n        responseJson = JSON.parse(response);\n      } catch (ex) {\n        throw new Error(`Unexpected audit response (Invalid JSON): ${response}`);\n      }\n      if (!responseJson.metadata) {\n        throw new Error(`Unexpected audit response (Missing Metadata): ${JSON.stringify(responseJson, null, 2)}`);\n      }\n      _this.reporter.verbose(`Audit Response: ${JSON.stringify(responseJson, null, 2)}`);\n      return responseJson;\n    })();\n  }\n\n  _insertWorkspacePackagesIntoManifest(manifest, resolver) {\n    if (resolver.workspaceLayout) {\n      const workspaceAggregatorName = resolver.workspaceLayout.virtualManifestName;\n      const workspaceManifest = resolver.workspaceLayout.workspaces[workspaceAggregatorName].manifest;\n\n      manifest.dependencies = Object.assign(manifest.dependencies || {}, workspaceManifest.dependencies);\n      manifest.devDependencies = Object.assign(manifest.devDependencies || {}, workspaceManifest.devDependencies);\n      manifest.optionalDependencies = Object.assign(manifest.optionalDependencies || {}, workspaceManifest.optionalDependencies);\n    }\n  }\n\n  performAudit(manifest, lockfile, resolver, linker, patterns) {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      _this2._insertWorkspacePackagesIntoManifest(manifest, resolver);\n      const transitiveDevDeps = (0, (_getTransitiveDevDependencies || _load_getTransitiveDevDependencies()).getTransitiveDevDependencies)(manifest, resolver.workspaceLayout, lockfile);\n      const hoistedTrees = yield (0, (_hoistedTreeBuilder || _load_hoistedTreeBuilder()).buildTree)(resolver, linker, patterns);\n      const auditTree = _this2._mapHoistedTreesToAuditTree(manifest, hoistedTrees, transitiveDevDeps);\n      _this2.auditData = yield _this2._fetchAudit(auditTree);\n      return _this2.auditData.metadata.vulnerabilities;\n    })();\n  }\n\n  summary() {\n    if (!this.auditData) {\n      return;\n    }\n    this.reporter.auditSummary(this.auditData.metadata);\n  }\n\n  report() {\n    if (!this.auditData) {\n      return;\n    }\n\n    const startLoggingAt = Math.max(0, this.severityLevels.indexOf(this.options.level));\n\n    const reportAdvisory = resolution => {\n      const advisory = this.auditData.advisories[resolution.id.toString()];\n\n      if (this.severityLevels.indexOf(advisory.severity) >= startLoggingAt) {\n        this.reporter.auditAdvisory(resolution, advisory);\n      }\n    };\n\n    if (Object.keys(this.auditData.advisories).length !== 0) {\n      // let printedManualReviewHeader = false;\n\n      this.auditData.actions.forEach(action => {\n        action.resolves.forEach(reportAdvisory);\n\n        /* The following block has been temporarily removed\n         * because the actions returned by npm are not valid for yarn.\n         * Removing this action reporting until we can come up with a way\n         * to correctly resolve issues.\n         */\n        // if (action.action === 'update' || action.action === 'install') {\n        //   // these advisories can be resolved automatically by running a yarn command\n        //   const recommendation: AuditActionRecommendation = {\n        //     cmd: `yarn upgrade ${action.module}@${action.target}`,\n        //     isBreaking: action.isMajor,\n        //     action,\n        //   };\n        //   this.reporter.auditAction(recommendation);\n        //   action.resolves.forEach(reportAdvisory);\n        // }\n\n        // if (action.action === 'review') {\n        //   // these advisories cannot be resolved automatically and require manual review\n        //   if (!printedManualReviewHeader) {\n        //     this.reporter.auditManualReview();\n        //   }\n        //   printedManualReviewHeader = true;\n        //   action.resolves.forEach(reportAdvisory);\n        // }\n      });\n    }\n\n    this.summary();\n  }\n}\nexports.default = Audit;\n\n/***/ }),\n/* 348 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.clean = exports.noArguments = exports.requireLockfile = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet clean = exports.clean = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter) {\n    const loc = path.join(config.lockfileFolder, (_constants || _load_constants()).CLEAN_FILENAME);\n    const file = yield (_fs || _load_fs()).readFile(loc);\n    const lines = file.split('\\n');\n    const filters = (0, (_filter || _load_filter()).ignoreLinesToRegex)(lines);\n\n    let removedFiles = 0;\n    let removedSize = 0;\n\n    // build list of possible module folders\n    const locs = new Set();\n    for (var _iterator = config.registryFolders, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref2;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref2 = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref2 = _i.value;\n      }\n\n      const registryFolder = _ref2;\n\n      locs.add(path.resolve(config.lockfileFolder, registryFolder));\n    }\n\n    const workspaceRootFolder = config.workspaceRootFolder;\n    if (workspaceRootFolder) {\n      const manifest = yield config.findManifest(workspaceRootFolder, false);\n      invariant(manifest && manifest.workspaces, 'We must find a manifest with a \"workspaces\" property');\n\n      const workspaces = yield config.resolveWorkspaces(workspaceRootFolder, manifest);\n\n      for (var _iterator2 = Object.keys(workspaces), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref3;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref3 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref3 = _i2.value;\n        }\n\n        const workspaceName = _ref3;\n\n        for (var _iterator3 = (_index || _load_index()).registryNames, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n          var _ref4;\n\n          if (_isArray3) {\n            if (_i3 >= _iterator3.length) break;\n            _ref4 = _iterator3[_i3++];\n          } else {\n            _i3 = _iterator3.next();\n            if (_i3.done) break;\n            _ref4 = _i3.value;\n          }\n\n          const name = _ref4;\n\n          const registry = config.registries[name];\n          locs.add(path.join(workspaces[workspaceName].loc, registry.folder));\n        }\n      }\n    }\n\n    for (var _iterator4 = locs, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n      var _ref5;\n\n      if (_isArray4) {\n        if (_i4 >= _iterator4.length) break;\n        _ref5 = _iterator4[_i4++];\n      } else {\n        _i4 = _iterator4.next();\n        if (_i4.done) break;\n        _ref5 = _i4.value;\n      }\n\n      const folder = _ref5;\n\n      if (!(yield (_fs || _load_fs()).exists(folder))) {\n        continue;\n      }\n\n      const spinner = reporter.activity();\n      const files = yield (_fs || _load_fs()).walk(folder);\n\n      var _sortFilter = (0, (_filter || _load_filter()).sortFilter)(files, filters);\n\n      const ignoreFiles = _sortFilter.ignoreFiles;\n\n      spinner.end();\n\n      const tick = reporter.progress(ignoreFiles.size);\n      // TODO make sure `main` field of all modules isn't ignored\n\n      for (var _iterator5 = ignoreFiles, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n        var _ref6;\n\n        if (_isArray5) {\n          if (_i5 >= _iterator5.length) break;\n          _ref6 = _iterator5[_i5++];\n        } else {\n          _i5 = _iterator5.next();\n          if (_i5.done) break;\n          _ref6 = _i5.value;\n        }\n\n        const file = _ref6;\n\n        const loc = path.join(folder, file);\n        const stat = yield (_fs || _load_fs()).lstat(loc);\n        removedSize += stat.size;\n        removedFiles++;\n      }\n\n      for (var _iterator6 = ignoreFiles, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n        var _ref7;\n\n        if (_isArray6) {\n          if (_i6 >= _iterator6.length) break;\n          _ref7 = _iterator6[_i6++];\n        } else {\n          _i6 = _iterator6.next();\n          if (_i6.done) break;\n          _ref7 = _i6.value;\n        }\n\n        const file = _ref7;\n\n        const loc = path.join(folder, file);\n        yield (_fs || _load_fs()).unlink(loc);\n        tick();\n      }\n    }\n\n    return { removedFiles, removedSize };\n  });\n\n  return function clean(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet runInit = (() => {\n  var _ref8 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (cwd, reporter) {\n    reporter.step(1, 1, reporter.lang('cleanCreatingFile', (_constants || _load_constants()).CLEAN_FILENAME));\n    const cleanLoc = path.join(cwd, (_constants || _load_constants()).CLEAN_FILENAME);\n    yield (_fs || _load_fs()).writeFile(cleanLoc, `${DEFAULT_FILTER}\\n`, { flag: 'wx' });\n    reporter.info(reporter.lang('cleanCreatedFile', (_constants || _load_constants()).CLEAN_FILENAME));\n  });\n\n  return function runInit(_x3, _x4) {\n    return _ref8.apply(this, arguments);\n  };\n})();\n\nlet runAutoClean = (() => {\n  var _ref9 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter) {\n    reporter.step(1, 1, reporter.lang('cleaning'));\n\n    var _ref10 = yield clean(config, reporter);\n\n    const removedFiles = _ref10.removedFiles,\n          removedSize = _ref10.removedSize;\n\n    reporter.info(reporter.lang('cleanRemovedFiles', removedFiles));\n    reporter.info(reporter.lang('cleanSavedSize', Number((removedSize / 1024 / 1024).toFixed(2))));\n  });\n\n  return function runAutoClean(_x5, _x6) {\n    return _ref9.apply(this, arguments);\n  };\n})();\n\nlet checkForCleanFile = (() => {\n  var _ref11 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (cwd) {\n    const cleanLoc = path.join(cwd, (_constants || _load_constants()).CLEAN_FILENAME);\n    const exists = yield (_fs || _load_fs()).exists(cleanLoc);\n    return exists;\n  });\n\n  return function checkForCleanFile(_x7) {\n    return _ref11.apply(this, arguments);\n  };\n})();\n\nlet run = exports.run = (() => {\n  var _ref12 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const cleanFileExists = yield checkForCleanFile(config.cwd);\n\n    if (flags.init && cleanFileExists) {\n      reporter.info(reporter.lang('cleanAlreadyExists', (_constants || _load_constants()).CLEAN_FILENAME));\n    } else if (flags.init) {\n      yield runInit(config.cwd, reporter);\n    } else if (flags.force && cleanFileExists) {\n      yield runAutoClean(config, reporter);\n    } else if (cleanFileExists) {\n      reporter.info(reporter.lang('cleanRequiresForce', (_constants || _load_constants()).CLEAN_FILENAME));\n    } else {\n      reporter.info(reporter.lang('cleanDoesNotExist', (_constants || _load_constants()).CLEAN_FILENAME));\n    }\n  });\n\n  return function run(_x8, _x9, _x10, _x11) {\n    return _ref12.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _index;\n\nfunction _load_index() {\n  return _index = __webpack_require__(58);\n}\n\nvar _filter;\n\nfunction _load_filter() {\n  return _filter = __webpack_require__(366);\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\nconst path = __webpack_require__(0);\n\nconst requireLockfile = exports.requireLockfile = true;\nconst noArguments = exports.noArguments = true;\n\nconst DEFAULT_FILTER = `\n# test directories\n__tests__\ntest\ntests\npowered-test\n\n# asset directories\ndocs\ndoc\nwebsite\nimages\nassets\n\n# examples\nexample\nexamples\n\n# code coverage directories\ncoverage\n.nyc_output\n\n# build scripts\nMakefile\nGulpfile.js\nGruntfile.js\n\n# configs\nappveyor.yml\ncircle.yml\ncodeship-services.yml\ncodeship-steps.yml\nwercker.yml\n.tern-project\n.gitattributes\n.editorconfig\n.*ignore\n.eslintrc\n.jshintrc\n.flowconfig\n.documentup.json\n.yarn-metadata.json\n.travis.yml\n\n# misc\n*.md\n`.trim();\n\nfunction setFlags(commander) {\n  commander.description('Cleans and removes unnecessary files from package dependencies.');\n  commander.usage('autoclean [flags]');\n  commander.option('-I, --init', `Create \"${(_constants || _load_constants()).CLEAN_FILENAME}\" file with the default entries.`);\n  commander.option('-F, --force', `Run autoclean using the existing \"${(_constants || _load_constants()).CLEAN_FILENAME}\" file.`);\n}\n\nfunction hasWrapper(commander) {\n  return true;\n}\n\n/***/ }),\n/* 349 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.examples = exports.run = exports.getCachedPackagesDirs = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet getCachedPackagesDirs = exports.getCachedPackagesDirs = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, currentPath) {\n    const results = [];\n    const stat = yield (_fs || _load_fs()).lstat(currentPath);\n\n    if (!stat.isDirectory()) {\n      return results;\n    }\n\n    const folders = yield (_fs || _load_fs()).readdir(currentPath);\n    for (var _iterator = folders, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref2;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref2 = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref2 = _i.value;\n      }\n\n      const folder = _ref2;\n\n      if (folder[0] === '.') {\n        continue;\n      }\n      const packageParentPath = path.join(currentPath, folder, 'node_modules');\n\n      const candidates = yield (_fs || _load_fs()).readdir(packageParentPath);\n      invariant(candidates.length === 1, `There should only be one folder in a package cache (got ${candidates.join(',')} in ${packageParentPath})`);\n\n      for (var _iterator2 = candidates, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref3;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref3 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref3 = _i2.value;\n        }\n\n        const candidate = _ref3;\n\n        const candidatePath = path.join(packageParentPath, candidate);\n        if (candidate.charAt(0) === '@') {\n          const subCandidates = yield (_fs || _load_fs()).readdir(candidatePath);\n          invariant(subCandidates.length === 1, `There should only be one folder in a package cache (got ${subCandidates.join(',')} in ${candidatePath})`);\n\n          for (var _iterator3 = subCandidates, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n            var _ref4;\n\n            if (_isArray3) {\n              if (_i3 >= _iterator3.length) break;\n              _ref4 = _iterator3[_i3++];\n            } else {\n              _i3 = _iterator3.next();\n              if (_i3.done) break;\n              _ref4 = _i3.value;\n            }\n\n            const subCandidate = _ref4;\n\n            const subCandidatePath = path.join(candidatePath, subCandidate);\n            results.push(subCandidatePath);\n          }\n        } else {\n          results.push(candidatePath);\n        }\n      }\n    }\n\n    return results;\n  });\n\n  return function getCachedPackagesDirs(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet getCachedPackages = (() => {\n  var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config) {\n    const paths = yield getCachedPackagesDirs(config, config.cacheFolder);\n    return _getMetadataWithPath(config.readPackageMetadata.bind(config), paths).then(function (packages) {\n      return packages.filter(function (p) {\n        return !!p;\n      });\n    });\n  });\n\n  return function getCachedPackages(_x3) {\n    return _ref5.apply(this, arguments);\n  };\n})();\n\nlet list = (() => {\n  var _ref6 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const filterOut = function filterOut({ registry, package: manifest, remote } = {}) {\n      if (flags.pattern && !micromatch.contains(manifest.name, flags.pattern)) {\n        return false;\n      }\n      return true;\n    };\n\n    const forReport = function forReport({ registry, package: manifest, remote } = {}) {\n      return [manifest.name, manifest.version, registry, remote && remote.resolved || ''];\n    };\n\n    const packages = yield getCachedPackages(config);\n    const body = packages.filter(filterOut).map(forReport);\n    reporter.table(['Name', 'Version', 'Registry', 'Resolved'], body);\n  });\n\n  return function list(_x4, _x5, _x6, _x7) {\n    return _ref6.apply(this, arguments);\n  };\n})();\n\nlet clean = (() => {\n  var _ref7 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    if (config.cacheFolder) {\n      const activity = reporter.activity();\n\n      if (args.length > 0) {\n        // Clear named packages from cache\n        const packages = yield getCachedPackages(config);\n        const shouldDelete = function shouldDelete({ registry, package: manifest, remote } = {}) {\n          return args.indexOf(manifest.name) !== -1;\n        };\n        const packagesToDelete = packages.filter(shouldDelete);\n\n        for (var _iterator4 = packagesToDelete, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n          var _ref8;\n\n          if (_isArray4) {\n            if (_i4 >= _iterator4.length) break;\n            _ref8 = _iterator4[_i4++];\n          } else {\n            _i4 = _iterator4.next();\n            if (_i4.done) break;\n            _ref8 = _i4.value;\n          }\n\n          const manifest = _ref8;\n\n          let relativePath = path.relative(config.cacheFolder, manifest._path);\n          while (relativePath && relativePath !== '.') {\n            yield (_fs || _load_fs()).unlink(path.resolve(config.cacheFolder, relativePath));\n            relativePath = path.dirname(relativePath);\n          }\n        }\n\n        activity.end();\n        reporter.success(reporter.lang('clearedPackageFromCache', args[0]));\n      } else {\n        // Clear all cache\n        yield (_fs || _load_fs()).unlink(config._cacheRootFolder);\n        yield (_fs || _load_fs()).mkdirp(config.cacheFolder);\n        activity.end();\n        reporter.success(reporter.lang('clearedCache'));\n      }\n    }\n  });\n\n  return function clean(_x8, _x9, _x10, _x11) {\n    return _ref7.apply(this, arguments);\n  };\n})();\n\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\n\nvar _buildSubCommands2;\n\nfunction _load_buildSubCommands() {\n  return _buildSubCommands2 = _interopRequireDefault(__webpack_require__(59));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\nconst path = __webpack_require__(0);\nconst micromatch = __webpack_require__(115);\n\nfunction hasWrapper(flags, args) {\n  return args[0] !== 'dir';\n}\n\nfunction _getMetadataWithPath(getMetadataFn, paths) {\n  return Promise.all(paths.map(path => getMetadataFn(path).then(r => {\n    r._path = path;\n    return r;\n  }).catch(error => undefined)));\n}\n\nvar _buildSubCommands = (0, (_buildSubCommands2 || _load_buildSubCommands()).default)('cache', {\n  ls(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      reporter.warn(`\\`yarn cache ls\\` is deprecated. Please use \\`yarn cache list\\`.`);\n      yield list(config, reporter, flags, args);\n    })();\n  },\n  list,\n  clean,\n  dir(config, reporter) {\n    reporter.log(config.cacheFolder, { force: true });\n  }\n});\n\nconst run = _buildSubCommands.run,\n      _setFlags = _buildSubCommands.setFlags,\n      examples = _buildSubCommands.examples;\nexports.run = run;\nexports.examples = examples;\nfunction setFlags(commander) {\n  _setFlags(commander);\n  commander.description('Yarn cache list will print out every cached package.');\n  commander.option('--pattern [pattern]', 'filter cached packages by pattern');\n}\n\n/***/ }),\n/* 350 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.verifyTreeCheck = exports.noArguments = exports.requireLockfile = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet verifyTreeCheck = exports.verifyTreeCheck = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    let errCount = 0;\n    function reportError(msg, ...vars) {\n      reporter.error(reporter.lang(msg, ...vars));\n      errCount++;\n    }\n    // check all dependencies recursively without relying on internal resolver\n    const registryName = 'yarn';\n    const registryFolder = config.registryFolders[0];\n    const cwd = config.workspaceRootFolder ? config.lockfileFolder : config.cwd;\n    const rootManifest = yield config.readManifest(cwd, registryName);\n\n    const dependenciesToCheckVersion = [];\n    if (rootManifest.dependencies) {\n      for (const name in rootManifest.dependencies) {\n        const version = rootManifest.dependencies[name];\n        // skip linked dependencies\n        const isLinkedDependency = /^link:/i.test(version) || /^file:/i.test(version) && config.linkFileDependencies;\n        if (isLinkedDependency) {\n          continue;\n        }\n        dependenciesToCheckVersion.push({\n          name,\n          originalKey: name,\n          parentCwd: cwd,\n          version\n        });\n      }\n    }\n    if (rootManifest.devDependencies && !config.production) {\n      for (const name in rootManifest.devDependencies) {\n        const version = rootManifest.devDependencies[name];\n        // skip linked dependencies\n        const isLinkedDependency = /^link:/i.test(version) || /^file:/i.test(version) && config.linkFileDependencies;\n        if (isLinkedDependency) {\n          continue;\n        }\n        dependenciesToCheckVersion.push({\n          name,\n          originalKey: name,\n          parentCwd: cwd,\n          version\n        });\n      }\n    }\n\n    const locationsVisited = new Set();\n    while (dependenciesToCheckVersion.length) {\n      const dep = dependenciesToCheckVersion.shift();\n      const manifestLoc = path.resolve(dep.parentCwd, registryFolder, dep.name);\n      if (locationsVisited.has(manifestLoc + `@${dep.version}`)) {\n        continue;\n      }\n      locationsVisited.add(manifestLoc + `@${dep.version}`);\n      // When plugnplay is enabled, packages aren't copied to the node_modules folder, so this check doesn't make sense\n      // TODO: We ideally should check that the packages are located inside the cache instead\n      if (config.plugnplayEnabled) {\n        continue;\n      }\n      if (!(yield (_fs || _load_fs()).exists(manifestLoc))) {\n        reportError('packageNotInstalled', `${dep.originalKey}`);\n        continue;\n      }\n      if (!(yield (_fs || _load_fs()).exists(path.join(manifestLoc, 'package.json')))) {\n        continue;\n      }\n      const pkg = yield config.readManifest(manifestLoc, registryName);\n      if (semver.validRange(dep.version, config.looseSemver) && !semver.satisfies(pkg.version, dep.version, config.looseSemver)) {\n        reportError('packageWrongVersion', dep.originalKey, dep.version, pkg.version);\n        continue;\n      }\n      const dependencies = pkg.dependencies;\n      if (dependencies) {\n        for (const subdep in dependencies) {\n          const subDepPath = path.resolve(manifestLoc, registryFolder, subdep);\n          let found = false;\n          const relative = path.relative(cwd, subDepPath);\n          const locations = path.normalize(relative).split(registryFolder + path.sep).filter(function (dir) {\n            return !!dir;\n          });\n          locations.pop();\n          while (locations.length >= 0) {\n            let possiblePath;\n            if (locations.length > 0) {\n              possiblePath = path.join(cwd, registryFolder, locations.join(path.sep + registryFolder + path.sep));\n            } else {\n              possiblePath = cwd;\n            }\n            if (yield (_fs || _load_fs()).exists(path.resolve(possiblePath, registryFolder, subdep))) {\n              dependenciesToCheckVersion.push({\n                name: subdep,\n                originalKey: `${dep.originalKey}#${subdep}`,\n                parentCwd: possiblePath,\n                version: dependencies[subdep]\n              });\n              found = true;\n              break;\n            }\n            if (!locations.length) {\n              break;\n            }\n            locations.pop();\n          }\n          if (!found) {\n            reportError('packageNotInstalled', `${dep.originalKey}#${subdep}`);\n          }\n        }\n      }\n    }\n\n    if (errCount > 0) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('foundErrors', errCount));\n    } else {\n      reporter.success(reporter.lang('folderInSync'));\n    }\n  });\n\n  return function verifyTreeCheck(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet integrityHashCheck = (() => {\n  var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    let errCount = 0;\n    function reportError(msg, ...vars) {\n      reporter.error(reporter.lang(msg, ...vars));\n      errCount++;\n    }\n    const integrityChecker = new (_integrityChecker || _load_integrityChecker()).default(config);\n\n    const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.cwd);\n    const install = new (_install || _load_install()).Install(flags, config, reporter, lockfile);\n\n    // get patterns that are installed when running `yarn install`\n\n    var _ref3 = yield install.fetchRequestFromCwd();\n\n    const patterns = _ref3.patterns,\n          workspaceLayout = _ref3.workspaceLayout;\n\n\n    const match = yield integrityChecker.check(patterns, lockfile.cache, flags, workspaceLayout);\n    for (var _iterator = match.missingPatterns, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref4;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref4 = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref4 = _i.value;\n      }\n\n      const pattern = _ref4;\n\n      reportError('lockfileNotContainPattern', pattern);\n    }\n    if (match.integrityFileMissing) {\n      reportError('noIntegrityFile');\n    }\n    if (match.integrityMatches === false) {\n      reporter.warn(reporter.lang((_integrityChecker2 || _load_integrityChecker2()).integrityErrors[match.integrityError]));\n      reportError('integrityCheckFailed');\n    }\n\n    if (errCount > 0) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('foundErrors', errCount));\n    } else {\n      reporter.success(reporter.lang('folderInSync'));\n    }\n  });\n\n  return function integrityHashCheck(_x5, _x6, _x7, _x8) {\n    return _ref2.apply(this, arguments);\n  };\n})();\n\nlet run = exports.run = (() => {\n  var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    if (flags.verifyTree) {\n      yield verifyTreeCheck(config, reporter, flags, args);\n      return;\n    } else if (flags.integrity) {\n      yield integrityHashCheck(config, reporter, flags, args);\n      return;\n    }\n\n    const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.cwd);\n    const install = new (_install || _load_install()).Install(flags, config, reporter, lockfile);\n\n    function humaniseLocation(loc) {\n      const relative = path.relative(path.join(config.cwd, 'node_modules'), loc);\n      const normalized = path.normalize(relative).split(path.sep);\n      return normalized.filter(p => p !== 'node_modules').reduce((result, part) => {\n        const length = result.length;\n        if (length && result[length - 1].startsWith('@') && result[length - 1].indexOf(path.sep) === -1) {\n          result[length - 1] += path.sep + part;\n        } else {\n          result.push(part);\n        }\n        return result;\n      }, []);\n    }\n\n    let warningCount = 0;\n    let errCount = 0;\n    function reportError(msg, ...vars) {\n      reporter.error(reporter.lang(msg, ...vars));\n      errCount++;\n    }\n\n    // get patterns that are installed when running `yarn install`\n\n    var _ref6 = yield install.hydrate();\n\n    const rawPatterns = _ref6.patterns,\n          workspaceLayout = _ref6.workspaceLayout;\n\n    const patterns = yield install.flatten(rawPatterns);\n\n    // check if patterns exist in lockfile\n    for (var _iterator2 = patterns, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n      var _ref7;\n\n      if (_isArray2) {\n        if (_i2 >= _iterator2.length) break;\n        _ref7 = _iterator2[_i2++];\n      } else {\n        _i2 = _iterator2.next();\n        if (_i2.done) break;\n        _ref7 = _i2.value;\n      }\n\n      const pattern = _ref7;\n\n      if (!lockfile.getLocked(pattern) && (!workspaceLayout || !workspaceLayout.getManifestByPattern(pattern))) {\n        reportError('lockfileNotContainPattern', pattern);\n      }\n    }\n\n    const bundledDeps = {};\n    // check if any of the node_modules are out of sync\n    const res = yield install.linker.getFlatHoistedTree(patterns, workspaceLayout);\n    for (var _iterator3 = res, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n      var _ref9;\n\n      if (_isArray3) {\n        if (_i3 >= _iterator3.length) break;\n        _ref9 = _iterator3[_i3++];\n      } else {\n        _i3 = _iterator3.next();\n        if (_i3.done) break;\n        _ref9 = _i3.value;\n      }\n\n      const _ref8 = _ref9;\n      const loc = _ref8[0];\n      var _ref8$ = _ref8[1];\n      const originalKey = _ref8$.originalKey;\n      const pkg = _ref8$.pkg;\n      const ignore = _ref8$.ignore;\n\n      if (ignore) {\n        continue;\n      }\n\n      const parts = humaniseLocation(loc);\n\n      // grey out hoisted portions of key\n      let human = originalKey;\n      const hoistedParts = parts.slice();\n      const hoistedKey = parts.join('#');\n      if (human !== hoistedKey) {\n        const humanParts = human.split('#');\n\n        for (let i = 0; i < humanParts.length; i++) {\n          const humanPart = humanParts[i];\n\n          if (hoistedParts[0] === humanPart) {\n            hoistedParts.shift();\n\n            if (i < humanParts.length - 1) {\n              humanParts[i] += '#';\n            }\n          } else {\n            humanParts[i] = reporter.format.dim(`${humanPart}#`);\n          }\n        }\n\n        human = humanParts.join('');\n      }\n\n      // skip unnecessary checks for linked dependencies\n      const remoteType = pkg._reference.remote.type;\n      const isLinkedDependency = remoteType === 'link' || remoteType === 'workspace' || remoteType === 'file' && config.linkFileDependencies;\n      const isResolution = pkg._reference.hint === 'resolution';\n      if (isLinkedDependency || isResolution) {\n        continue;\n      }\n\n      if (!(yield (_fs || _load_fs()).exists(loc))) {\n        if (pkg._reference.optional) {\n          reporter.warn(reporter.lang('optionalDepNotInstalled', human));\n        } else {\n          reportError('packageNotInstalled', human);\n        }\n        continue;\n      }\n\n      const pkgLoc = path.join(loc, 'package.json');\n\n      if (yield (_fs || _load_fs()).exists(pkgLoc)) {\n        const packageJson = yield config.readJson(pkgLoc);\n        packageJson.version = semver.clean(packageJson.version);\n\n        if (pkg.version !== packageJson.version) {\n          // node_modules contains wrong version\n          reportError('packageWrongVersion', human, pkg.version, packageJson.version);\n        }\n\n        const deps = Object.assign({}, packageJson.dependencies, packageJson.peerDependencies);\n        bundledDeps[packageJson.name] = packageJson.bundledDependencies || [];\n\n        for (const name in deps) {\n          const range = deps[name];\n          if (!semver.validRange(range, config.looseSemver)) {\n            continue; // exotic\n          }\n\n          const subHuman = `${human}#${name}@${range}`;\n\n          // find the package that this will resolve to, factoring in hoisting\n          const possibles = [];\n          let depLoc;\n          for (let i = parts.length; i >= 0; i--) {\n            const myParts = parts.slice(0, i).concat(name);\n\n            // build package.json location for this position\n            const myDepPkgLoc = path.join(config.cwd, 'node_modules', myParts.join(`${path.sep}node_modules${path.sep}`));\n\n            possibles.push(myDepPkgLoc);\n          }\n          while (possibles.length) {\n            const myDepPkgLoc = possibles.shift();\n            if (yield (_fs || _load_fs()).exists(myDepPkgLoc)) {\n              depLoc = myDepPkgLoc;\n              break;\n            }\n          }\n          if (!depLoc) {\n            // we'll hit the module not install error above when this module is hit\n            continue;\n          }\n\n          const depPkgLoc = path.join(depLoc, 'package.json');\n\n          if (yield (_fs || _load_fs()).exists(depPkgLoc)) {\n            const depPkg = yield config.readJson(depPkgLoc);\n            const foundHuman = `${humaniseLocation(path.dirname(depPkgLoc)).join('#')}@${depPkg.version}`;\n            if (!semver.satisfies(depPkg.version, range, config.looseSemver)) {\n              // module isn't correct semver\n              const resPattern = install.resolutionMap.find(name, originalKey.split('#'));\n              if (resPattern) {\n                const resHuman = `${human}#${resPattern}`;\n\n                var _normalizePattern = (0, (_normalizePattern2 || _load_normalizePattern()).normalizePattern)(resPattern);\n\n                const resRange = _normalizePattern.range;\n\n\n                if (semver.satisfies(depPkg.version, resRange, config.looseSemver)) {\n                  reporter.warn(reporter.lang('incompatibleResolutionVersion', foundHuman, subHuman));\n                  warningCount++;\n                } else {\n                  reportError('packageDontSatisfy', resHuman, foundHuman);\n                }\n              } else {\n                reportError('packageDontSatisfy', subHuman, foundHuman);\n              }\n\n              continue;\n            }\n\n            // check for modules above us that this could be deduped to\n            for (var _iterator4 = possibles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n              var _ref10;\n\n              if (_isArray4) {\n                if (_i4 >= _iterator4.length) break;\n                _ref10 = _iterator4[_i4++];\n              } else {\n                _i4 = _iterator4.next();\n                if (_i4.done) break;\n                _ref10 = _i4.value;\n              }\n\n              const loc = _ref10;\n\n              const locPkg = path.join(loc, 'package.json');\n\n              if (!(yield (_fs || _load_fs()).exists(locPkg))) {\n                continue;\n              }\n\n              const packageJson = yield config.readJson(locPkg);\n              const packagePath = originalKey.split('#');\n              const rootDep = packagePath[0];\n              const packageName = packagePath[1] || packageJson.name;\n\n              const bundledDep = bundledDeps[rootDep] && bundledDeps[rootDep].indexOf(packageName) !== -1;\n              if (!bundledDep && (packageJson.version === depPkg.version || semver.satisfies(packageJson.version, range, config.looseSemver) && semver.gt(packageJson.version, depPkg.version, config.looseSemver))) {\n                reporter.warn(reporter.lang('couldBeDeduped', subHuman, packageJson.version, `${humaniseLocation(path.dirname(locPkg)).join('#')}@${packageJson.version}`));\n                warningCount++;\n              }\n              break;\n            }\n          }\n        }\n      }\n    }\n\n    if (warningCount > 1) {\n      reporter.info(reporter.lang('foundWarnings', warningCount));\n    }\n\n    if (errCount > 0) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('foundErrors', errCount));\n    } else {\n      reporter.success(reporter.lang('folderInSync'));\n    }\n  });\n\n  return function run(_x9, _x10, _x11, _x12) {\n    return _ref5.apply(this, arguments);\n  };\n})();\n\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _integrityChecker;\n\nfunction _load_integrityChecker() {\n  return _integrityChecker = _interopRequireDefault(__webpack_require__(206));\n}\n\nvar _integrityChecker2;\n\nfunction _load_integrityChecker2() {\n  return _integrityChecker2 = __webpack_require__(206);\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nvar _normalizePattern2;\n\nfunction _load_normalizePattern() {\n  return _normalizePattern2 = __webpack_require__(37);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst semver = __webpack_require__(22);\nconst path = __webpack_require__(0);\n\nconst requireLockfile = exports.requireLockfile = false;\nconst noArguments = exports.noArguments = true;\n\nfunction hasWrapper(commander) {\n  return true;\n}\n\nfunction setFlags(commander) {\n  commander.description('Verifies if versions in the current project’s package.json match that of yarn’s lock file.');\n  commander.option('--integrity');\n  commander.option('--verify-tree');\n}\n\n/***/ }),\n/* 351 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.getRegistryFolder = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet getRegistryFolder = exports.getRegistryFolder = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, name) {\n    if (config.modulesFolder) {\n      return config.modulesFolder;\n    }\n\n    const src = path.join(config.linkFolder, name);\n\n    var _ref2 = yield config.readManifest(src);\n\n    const _registry = _ref2._registry;\n\n    invariant(_registry, 'expected registry');\n\n    const registryFolder = config.registries[_registry].folder;\n    return path.join(config.cwd, registryFolder);\n  });\n\n  return function getRegistryFolder(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet run = exports.run = (() => {\n  var _ref3 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    if (args.length) {\n      for (var _iterator = args, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref4;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref4 = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref4 = _i.value;\n        }\n\n        const name = _ref4;\n\n        const src = path.join(config.linkFolder, name);\n\n        if (yield (_fs || _load_fs()).exists(src)) {\n          const folder = yield getRegistryFolder(config, name);\n          const dest = path.join(folder, name);\n\n          yield (_fs || _load_fs()).unlink(dest);\n          yield (_fs || _load_fs()).mkdirp(path.dirname(dest));\n          yield (_fs || _load_fs()).symlink(src, dest);\n          reporter.success(reporter.lang('linkUsing', name));\n        } else {\n          throw new (_errors || _load_errors()).MessageError(reporter.lang('linkMissing', name));\n        }\n      }\n    } else {\n      // add cwd module to the global registry\n      const manifest = yield config.readRootManifest();\n      const name = manifest.name;\n      if (!name) {\n        throw new (_errors || _load_errors()).MessageError(reporter.lang('unknownPackageName'));\n      }\n\n      const linkLoc = path.join(config.linkFolder, name);\n      if (yield (_fs || _load_fs()).exists(linkLoc)) {\n        reporter.warn(reporter.lang('linkCollision', name));\n      } else {\n        yield (_fs || _load_fs()).mkdirp(path.dirname(linkLoc));\n        yield (_fs || _load_fs()).symlink(config.cwd, linkLoc);\n\n        // If there is a `bin` defined in the package.json,\n        // link each bin to the global bin\n        if (manifest.bin) {\n          const globalBinFolder = yield (0, (_global || _load_global()).getBinFolder)(config, flags);\n          for (const binName in manifest.bin) {\n            const binSrc = manifest.bin[binName];\n            const binSrcLoc = path.join(linkLoc, binSrc);\n            const binDestLoc = path.join(globalBinFolder, binName);\n            if (yield (_fs || _load_fs()).exists(binDestLoc)) {\n              reporter.warn(reporter.lang('binLinkCollision', binName));\n            } else {\n              if (process.platform === 'win32') {\n                yield cmdShim(binSrcLoc, binDestLoc, { createPwshFile: false });\n              } else {\n                yield (_fs || _load_fs()).symlink(binSrcLoc, binDestLoc);\n              }\n            }\n          }\n        }\n\n        reporter.success(reporter.lang('linkRegistered', name));\n        reporter.info(reporter.lang('linkRegisteredMessage', name));\n      }\n    }\n  });\n\n  return function run(_x3, _x4, _x5, _x6) {\n    return _ref3.apply(this, arguments);\n  };\n})();\n\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _global;\n\nfunction _load_global() {\n  return _global = __webpack_require__(122);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nconst cmdShim = __webpack_require__(202);\nconst path = __webpack_require__(0);\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\nfunction setFlags(commander) {\n  commander.description('Symlink a package folder during development.');\n}\n\n/***/ }),\n/* 352 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.buildTree = exports.requireLockfile = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet buildTree = exports.buildTree = (() => {\n  var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (resolver, linker, patterns, opts, onlyFresh, ignoreHoisted) {\n    const treesByKey = {};\n    const trees = [];\n    const flatTree = yield linker.getFlatHoistedTree(patterns);\n\n    // If using workspaces, filter out the virtual manifest\n    const workspaceLayout = resolver.workspaceLayout;\n\n    const hoisted = workspaceLayout && workspaceLayout.virtualManifestName ? flatTree.filter(function ([key]) {\n      return key.indexOf(workspaceLayout.virtualManifestName) === -1;\n    }) : flatTree;\n\n    const hoistedByKey = {};\n    for (var _iterator2 = hoisted, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n      var _ref4;\n\n      if (_isArray2) {\n        if (_i2 >= _iterator2.length) break;\n        _ref4 = _iterator2[_i2++];\n      } else {\n        _i2 = _iterator2.next();\n        if (_i2.done) break;\n        _ref4 = _i2.value;\n      }\n\n      const _ref3 = _ref4;\n      const key = _ref3[0];\n      const info = _ref3[1];\n\n      hoistedByKey[key] = info;\n    }\n\n    // build initial trees\n    for (var _iterator3 = hoisted, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n      var _ref6;\n\n      if (_isArray3) {\n        if (_i3 >= _iterator3.length) break;\n        _ref6 = _iterator3[_i3++];\n      } else {\n        _i3 = _iterator3.next();\n        if (_i3.done) break;\n        _ref6 = _i3.value;\n      }\n\n      const _ref5 = _ref6;\n      const info = _ref5[1];\n\n      const ref = info.pkg._reference;\n      const hint = null;\n      const parent = getParent(info.key, treesByKey);\n      const children = [];\n      let depth = 0;\n      let color = 'bold';\n      invariant(ref, 'expected reference');\n\n      if (onlyFresh) {\n        let isFresh = false;\n        for (var _iterator5 = ref.patterns, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n          var _ref9;\n\n          if (_isArray5) {\n            if (_i5 >= _iterator5.length) break;\n            _ref9 = _iterator5[_i5++];\n          } else {\n            _i5 = _iterator5.next();\n            if (_i5.done) break;\n            _ref9 = _i5.value;\n          }\n\n          const pattern = _ref9;\n\n          if (resolver.isNewPattern(pattern)) {\n            isFresh = true;\n            break;\n          }\n        }\n        if (!isFresh) {\n          continue;\n        }\n      }\n\n      if (info.originalKey !== info.key || opts.reqDepth === 0) {\n        // was hoisted\n        color = null;\n      }\n      // check parent to obtain next depth\n      if (parent && parent.depth > 0) {\n        depth = parent.depth + 1;\n      } else {\n        depth = 0;\n      }\n\n      const topLevel = opts.reqDepth === 0 && !parent;\n      const showAll = opts.reqDepth === -1;\n      const nextDepthIsValid = depth + 1 <= Number(opts.reqDepth);\n\n      if (topLevel || nextDepthIsValid || showAll) {\n        treesByKey[info.key] = {\n          name: `${info.pkg.name}@${info.pkg.version}`,\n          children,\n          hint,\n          color,\n          depth\n        };\n      }\n\n      // add in dummy children for hoisted dependencies\n      const nextChildDepthIsValid = depth + 1 < Number(opts.reqDepth);\n      invariant(ref, 'expected reference');\n      if (!ignoreHoisted && nextDepthIsValid || showAll) {\n        for (var _iterator6 = resolver.dedupePatterns(ref.dependencies), _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n          var _ref10;\n\n          if (_isArray6) {\n            if (_i6 >= _iterator6.length) break;\n            _ref10 = _iterator6[_i6++];\n          } else {\n            _i6 = _iterator6.next();\n            if (_i6.done) break;\n            _ref10 = _i6.value;\n          }\n\n          const pattern = _ref10;\n\n          const pkg = resolver.getStrictResolvedPattern(pattern);\n\n          if (!hoistedByKey[`${info.key}#${pkg.name}`] && (nextChildDepthIsValid || showAll)) {\n            children.push({\n              name: pattern,\n              color: 'dim',\n              shadow: true\n            });\n          }\n        }\n      }\n    }\n\n    // add children\n    for (var _iterator4 = hoisted, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n      var _ref8;\n\n      if (_isArray4) {\n        if (_i4 >= _iterator4.length) break;\n        _ref8 = _iterator4[_i4++];\n      } else {\n        _i4 = _iterator4.next();\n        if (_i4.done) break;\n        _ref8 = _i4.value;\n      }\n\n      const _ref7 = _ref8;\n      const info = _ref7[1];\n\n      const tree = treesByKey[info.key];\n      const parent = getParent(info.key, treesByKey);\n      if (!tree) {\n        continue;\n      }\n\n      if (info.key.split('#').length === 1) {\n        trees.push(tree);\n        continue;\n      }\n\n      if (parent) {\n        parent.children.push(tree);\n      }\n    }\n\n    return { trees, count: buildCount(trees) };\n  });\n\n  return function buildTree(_x, _x2, _x3, _x4, _x5, _x6) {\n    return _ref2.apply(this, arguments);\n  };\n})();\n\nlet run = exports.run = (() => {\n  var _ref11 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.lockfileFolder, reporter);\n    const install = new (_install || _load_install()).Install(flags, config, reporter, lockfile);\n\n    var _ref12 = yield install.fetchRequestFromCwd();\n\n    const depRequests = _ref12.requests,\n          patterns = _ref12.patterns,\n          manifest = _ref12.manifest,\n          workspaceLayout = _ref12.workspaceLayout;\n\n    yield install.resolver.init(depRequests, {\n      isFlat: install.flags.flat,\n      isFrozen: install.flags.frozenLockfile,\n      workspaceLayout\n    });\n\n    let activePatterns = [];\n    if (config.production) {\n      const devDeps = getDevDeps(manifest);\n      activePatterns = patterns.filter(function (pattern) {\n        return !devDeps.has(pattern);\n      });\n    } else {\n      activePatterns = patterns;\n    }\n\n    const opts = {\n      reqDepth: getReqDepth(flags.depth)\n    };\n\n    var _ref13 = yield buildTree(install.resolver, install.linker, activePatterns, opts);\n\n    let trees = _ref13.trees;\n\n\n    if (args.length) {\n      reporter.warn(reporter.lang('deprecatedListArgs'));\n    }\n    if (args.length || flags.pattern) {\n      trees = trees.filter(function (tree) {\n        return filterTree(tree, args, flags.pattern);\n      });\n    }\n\n    reporter.tree('list', trees, { force: true });\n  });\n\n  return function run(_x7, _x8, _x9, _x10) {\n    return _ref11.apply(this, arguments);\n  };\n})();\n\nexports.getParent = getParent;\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\nexports.getReqDepth = getReqDepth;\nexports.filterTree = filterTree;\nexports.getDevDeps = getDevDeps;\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nconst micromatch = __webpack_require__(115);\n\nconst requireLockfile = exports.requireLockfile = true;\n\nfunction buildCount(trees) {\n  if (!trees || !trees.length) {\n    return 0;\n  }\n\n  let count = 0;\n\n  for (var _iterator = trees, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n    var _ref;\n\n    if (_isArray) {\n      if (_i >= _iterator.length) break;\n      _ref = _iterator[_i++];\n    } else {\n      _i = _iterator.next();\n      if (_i.done) break;\n      _ref = _i.value;\n    }\n\n    const tree = _ref;\n\n    if (tree.shadow) {\n      continue;\n    }\n\n    count++;\n    count += buildCount(tree.children);\n  }\n\n  return count;\n}\n\nfunction getParent(key, treesByKey) {\n  const parentKey = key.slice(0, key.lastIndexOf('#'));\n  return treesByKey[parentKey];\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\nfunction setFlags(commander) {\n  commander.description('Lists installed packages.');\n  commander.option('--depth [depth]', 'Limit the depth of the shown dependencies');\n  commander.option('--pattern [pattern]', 'Filter dependencies by pattern');\n}\n\nfunction getReqDepth(inputDepth) {\n  return inputDepth && /^\\d+$/.test(inputDepth) ? Number(inputDepth) : -1;\n}\n\nfunction filterTree(tree, filters, pattern = '') {\n  if (tree.children) {\n    tree.children = tree.children.filter(child => filterTree(child, filters, pattern));\n  }\n\n  const notDim = tree.color !== 'dim';\n  const hasChildren = tree.children == null ? false : tree.children.length > 0;\n  const name = tree.name.slice(0, tree.name.lastIndexOf('@'));\n  const found = micromatch.any(name, filters) || micromatch.contains(name, pattern);\n\n  return notDim && (found || hasChildren);\n}\n\nfunction getDevDeps(manifest) {\n  if (manifest.devDependencies) {\n    return new Set(Object.keys(manifest.devDependencies).map(key => `${key}@${manifest.devDependencies[key]}`));\n  } else {\n    return new Set();\n  }\n}\n\n/***/ }),\n/* 353 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.requireLockfile = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const isWorkspaceRoot = config.workspaceRootFolder && config.cwd === config.workspaceRootFolder;\n\n    if (!args.length) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('tooFewArguments', 1));\n    }\n\n    // running \"yarn remove something\" in a workspace root is often a mistake\n    if (isWorkspaceRoot && !flags.ignoreWorkspaceRootCheck) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('workspacesRemoveRootCheck'));\n    }\n\n    const totalSteps = args.length + 1;\n    let step = 0;\n\n    // load manifests\n    const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.lockfileFolder);\n    const rootManifests = yield config.getRootManifests();\n    const manifests = [];\n\n    for (var _iterator = args, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref2;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref2 = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref2 = _i.value;\n      }\n\n      const name = _ref2;\n\n      reporter.step(++step, totalSteps, `Removing module ${name}`, emoji.get('wastebasket'));\n\n      let found = false;\n\n      for (var _iterator2 = Object.keys((_index || _load_index()).registries), _isArray2 = Array.isArray(_iterator2), _i3 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref3;\n\n        if (_isArray2) {\n          if (_i3 >= _iterator2.length) break;\n          _ref3 = _iterator2[_i3++];\n        } else {\n          _i3 = _iterator2.next();\n          if (_i3.done) break;\n          _ref3 = _i3.value;\n        }\n\n        const registryName = _ref3;\n\n        const registry = config.registries[registryName];\n        const object = rootManifests[registryName].object;\n\n        for (var _iterator3 = (_constants || _load_constants()).DEPENDENCY_TYPES, _isArray3 = Array.isArray(_iterator3), _i4 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n          var _ref4;\n\n          if (_isArray3) {\n            if (_i4 >= _iterator3.length) break;\n            _ref4 = _iterator3[_i4++];\n          } else {\n            _i4 = _iterator3.next();\n            if (_i4.done) break;\n            _ref4 = _i4.value;\n          }\n\n          const type = _ref4;\n\n          const deps = object[type];\n          if (deps && deps[name]) {\n            found = true;\n            delete deps[name];\n          }\n        }\n\n        const possibleManifestLoc = path.join(config.cwd, registry.folder, name);\n        if (yield (_fs || _load_fs()).exists(possibleManifestLoc)) {\n          const manifest = yield config.maybeReadManifest(possibleManifestLoc, registryName);\n          if (manifest) {\n            manifests.push([possibleManifestLoc, manifest]);\n          }\n        }\n      }\n\n      if (!found) {\n        throw new (_errors || _load_errors()).MessageError(reporter.lang('moduleNotInManifest'));\n      }\n    }\n\n    // save manifests\n    yield config.saveRootManifests(rootManifests);\n\n    // run hooks - npm runs these one after another\n    var _arr = ['preuninstall', 'uninstall', 'postuninstall'];\n    for (var _i2 = 0; _i2 < _arr.length; _i2++) {\n      const action = _arr[_i2];\n      for (var _iterator4 = manifests, _isArray4 = Array.isArray(_iterator4), _i5 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n        var _ref6;\n\n        if (_isArray4) {\n          if (_i5 >= _iterator4.length) break;\n          _ref6 = _iterator4[_i5++];\n        } else {\n          _i5 = _iterator4.next();\n          if (_i5.done) break;\n          _ref6 = _i5.value;\n        }\n\n        const _ref5 = _ref6;\n        const loc = _ref5[0];\n\n        yield config.executeLifecycleScript(action, loc);\n      }\n    }\n\n    // reinstall so we can get the updated lockfile\n    reporter.step(++step, totalSteps, reporter.lang('uninstallRegenerate'), emoji.get('hammer'));\n    const installFlags = (0, (_extends2 || _load_extends()).default)({ force: true, workspaceRootIsCwd: true }, flags);\n    const reinstall = new (_install || _load_install()).Install(installFlags, config, new (_index2 || _load_index2()).NoopReporter(), lockfile);\n    yield reinstall.init();\n\n    //\n    reporter.success(reporter.lang('uninstalledPackages'));\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = __webpack_require__(58);\n}\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _index2;\n\nfunction _load_index2() {\n  return _index2 = __webpack_require__(201);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst path = __webpack_require__(0);\n\nconst emoji = __webpack_require__(302);\n\nconst requireLockfile = exports.requireLockfile = true;\n\nfunction setFlags(commander) {\n  commander.description('Removes a package from your direct dependencies updating your package.json and yarn.lock.');\n  commander.usage('remove [packages ...] [flags]');\n  commander.option('-W, --ignore-workspace-root-check', 'required to run yarn remove inside a workspace root');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 354 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.getBinEntries = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet getBinEntries = exports.getBinEntries = (() => {\n  var _ref3 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config) {\n    const binFolders = new Set();\n    const binEntries = new Map();\n\n    // Setup the node_modules/.bin folders for analysis\n    for (var _iterator2 = config.registryFolders, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n      var _ref4;\n\n      if (_isArray2) {\n        if (_i2 >= _iterator2.length) break;\n        _ref4 = _iterator2[_i2++];\n      } else {\n        _i2 = _iterator2.next();\n        if (_i2.done) break;\n        _ref4 = _i2.value;\n      }\n\n      const registryFolder = _ref4;\n\n      binFolders.add(path.resolve(config.cwd, registryFolder, '.bin'));\n      binFolders.add(path.resolve(config.lockfileFolder, registryFolder, '.bin'));\n    }\n\n    // Same thing, but for the pnp dependencies, located inside the cache\n    if (yield (_fs || _load_fs()).exists(`${config.lockfileFolder}/${(_constants || _load_constants()).PNP_FILENAME}`)) {\n      const pnpApi = (0, (_dynamicRequire || _load_dynamicRequire()).dynamicRequire)(`${config.lockfileFolder}/${(_constants || _load_constants()).PNP_FILENAME}`);\n\n      const packageLocator = pnpApi.findPackageLocator(`${config.cwd}/`);\n      const packageInformation = pnpApi.getPackageInformation(packageLocator);\n\n      for (var _iterator3 = packageInformation.packageDependencies.entries(), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n        var _ref6;\n\n        if (_isArray3) {\n          if (_i3 >= _iterator3.length) break;\n          _ref6 = _iterator3[_i3++];\n        } else {\n          _i3 = _iterator3.next();\n          if (_i3.done) break;\n          _ref6 = _i3.value;\n        }\n\n        const _ref5 = _ref6;\n        const name = _ref5[0];\n        const reference = _ref5[1];\n\n        const dependencyInformation = pnpApi.getPackageInformation({ name, reference });\n\n        if (dependencyInformation.packageLocation) {\n          binFolders.add(`${dependencyInformation.packageLocation}/.bin`);\n        }\n      }\n    }\n\n    // Build up a list of possible scripts by exploring the folders marked for analysis\n    for (var _iterator4 = binFolders, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n      var _ref7;\n\n      if (_isArray4) {\n        if (_i4 >= _iterator4.length) break;\n        _ref7 = _iterator4[_i4++];\n      } else {\n        _i4 = _iterator4.next();\n        if (_i4.done) break;\n        _ref7 = _i4.value;\n      }\n\n      const binFolder = _ref7;\n\n      if (yield (_fs || _load_fs()).exists(binFolder)) {\n        for (var _iterator5 = yield (_fs || _load_fs()).readdir(binFolder), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n          var _ref8;\n\n          if (_isArray5) {\n            if (_i5 >= _iterator5.length) break;\n            _ref8 = _iterator5[_i5++];\n          } else {\n            _i5 = _iterator5.next();\n            if (_i5.done) break;\n            _ref8 = _i5.value;\n          }\n\n          const name = _ref8;\n\n          binEntries.set(name, path.join(binFolder, name));\n        }\n      }\n    }\n\n    return binEntries;\n  });\n\n  return function getBinEntries(_x) {\n    return _ref3.apply(this, arguments);\n  };\n})();\n\nlet run = exports.run = (() => {\n  var _ref9 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    let realRunCommand = (() => {\n      var _ref13 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (action, args) {\n        // build up list of commands\n        const cmds = [];\n\n        if (pkgScripts && action in pkgScripts) {\n          const preAction = `pre${action}`;\n          if (preAction in pkgScripts) {\n            cmds.push([preAction, pkgScripts[preAction]]);\n          }\n\n          const script = scripts.get(action);\n          invariant(script, 'Script must exist');\n          cmds.push([action, script]);\n\n          const postAction = `post${action}`;\n          if (postAction in pkgScripts) {\n            cmds.push([postAction, pkgScripts[postAction]]);\n          }\n        } else if (scripts.has(action)) {\n          const script = scripts.get(action);\n          invariant(script, 'Script must exist');\n          cmds.push([action, script]);\n        }\n\n        if (cmds.length) {\n          const ignoreEngines = !!(flags.ignoreEngines || config.getOption('ignore-engines'));\n          try {\n            yield (0, (_packageCompatibility || _load_packageCompatibility()).checkOne)(pkg, config, ignoreEngines);\n          } catch (err) {\n            throw err instanceof (_errors || _load_errors()).MessageError ? new (_errors || _load_errors()).MessageError(reporter.lang('cannotRunWithIncompatibleEnv')) : err;\n          }\n\n          // Disable wrapper in executed commands\n          process.env.YARN_WRAP_OUTPUT = 'false';\n          for (var _iterator8 = cmds, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {\n            var _ref15;\n\n            if (_isArray8) {\n              if (_i8 >= _iterator8.length) break;\n              _ref15 = _iterator8[_i8++];\n            } else {\n              _i8 = _iterator8.next();\n              if (_i8.done) break;\n              _ref15 = _i8.value;\n            }\n\n            const _ref14 = _ref15;\n            const stage = _ref14[0];\n            const cmd = _ref14[1];\n\n            // only tack on trailing arguments for default script, ignore for pre and post - #1595\n            const cmdWithArgs = stage === action ? sh`${unquoted(cmd)} ${args}` : cmd;\n            const customShell = config.getOption('script-shell');\n            yield (0, (_executeLifecycleScript || _load_executeLifecycleScript()).execCommand)({\n              stage,\n              config,\n              cmd: cmdWithArgs,\n              cwd: flags.into || config.cwd,\n              isInteractive: true,\n              customShell: customShell ? String(customShell) : undefined\n            });\n          }\n        } else if (action === 'env') {\n          reporter.log(JSON.stringify((yield (0, (_executeLifecycleScript || _load_executeLifecycleScript()).makeEnv)('env', config.cwd, config)), null, 2), { force: true });\n        } else {\n          let suggestion;\n\n          for (var _iterator9 = scripts.keys(), _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {\n            var _ref16;\n\n            if (_isArray9) {\n              if (_i9 >= _iterator9.length) break;\n              _ref16 = _iterator9[_i9++];\n            } else {\n              _i9 = _iterator9.next();\n              if (_i9.done) break;\n              _ref16 = _i9.value;\n            }\n\n            const commandName = _ref16;\n\n            const steps = leven(commandName, action);\n            if (steps < 2) {\n              suggestion = commandName;\n            }\n          }\n\n          let msg = `Command ${JSON.stringify(action)} not found.`;\n          if (suggestion) {\n            msg += ` Did you mean ${JSON.stringify(suggestion)}?`;\n          }\n          throw new (_errors || _load_errors()).MessageError(msg);\n        }\n      });\n\n      return function realRunCommand(_x6, _x7) {\n        return _ref13.apply(this, arguments);\n      };\n    })();\n\n    // list possible scripts if none specified\n\n\n    const pkg = yield config.readManifest(config.cwd);\n\n    const binCommands = new Set();\n    const pkgCommands = new Set();\n\n    const scripts = new Map();\n\n    for (var _iterator6 = yield getBinEntries(config), _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n      var _ref11;\n\n      if (_isArray6) {\n        if (_i6 >= _iterator6.length) break;\n        _ref11 = _iterator6[_i6++];\n      } else {\n        _i6 = _iterator6.next();\n        if (_i6.done) break;\n        _ref11 = _i6.value;\n      }\n\n      const _ref10 = _ref11;\n      const name = _ref10[0];\n      const loc = _ref10[1];\n\n      scripts.set(name, quoteForShell(loc));\n      binCommands.add(name);\n    }\n\n    const pkgScripts = pkg.scripts;\n\n    if (pkgScripts) {\n      for (var _iterator7 = Object.keys(pkgScripts).sort(), _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {\n        var _ref12;\n\n        if (_isArray7) {\n          if (_i7 >= _iterator7.length) break;\n          _ref12 = _iterator7[_i7++];\n        } else {\n          _i7 = _iterator7.next();\n          if (_i7.done) break;\n          _ref12 = _i7.value;\n        }\n\n        const name = _ref12;\n\n        scripts.set(name, pkgScripts[name] || '');\n        pkgCommands.add(name);\n      }\n    }\n\n    function runCommand([action, ...args]) {\n      return (0, (_hooks || _load_hooks()).callThroughHook)('runScript', () => realRunCommand(action, args), { action, args });\n    }\n\n    if (args.length === 0) {\n      if (binCommands.size > 0) {\n        reporter.info(`${reporter.lang('binCommands') + Array.from(binCommands).join(', ')}`);\n      } else {\n        reporter.error(reporter.lang('noBinAvailable'));\n      }\n\n      const printedCommands = new Map();\n\n      for (var _iterator10 = pkgCommands, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) {\n        var _ref17;\n\n        if (_isArray10) {\n          if (_i10 >= _iterator10.length) break;\n          _ref17 = _iterator10[_i10++];\n        } else {\n          _i10 = _iterator10.next();\n          if (_i10.done) break;\n          _ref17 = _i10.value;\n        }\n\n        const pkgCommand = _ref17;\n\n        const action = scripts.get(pkgCommand);\n        invariant(action, 'Action must exists');\n        printedCommands.set(pkgCommand, action);\n      }\n\n      if (pkgCommands.size > 0) {\n        reporter.info(`${reporter.lang('possibleCommands')}`);\n        reporter.list('possibleCommands', Array.from(pkgCommands), toObject(printedCommands));\n        if (!flags.nonInteractive) {\n          yield reporter.question(reporter.lang('commandQuestion')).then(function (answer) {\n            return runCommand(answer.trim().split(' '));\n          }, function () {\n            return reporter.error(reporter.lang('commandNotSpecified'));\n          });\n        }\n      } else {\n        reporter.error(reporter.lang('noScriptsAvailable'));\n      }\n      return Promise.resolve();\n    } else {\n      return runCommand(args);\n    }\n  });\n\n  return function run(_x2, _x3, _x4, _x5) {\n    return _ref9.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _executeLifecycleScript;\n\nfunction _load_executeLifecycleScript() {\n  return _executeLifecycleScript = __webpack_require__(111);\n}\n\nvar _dynamicRequire;\n\nfunction _load_dynamicRequire() {\n  return _dynamicRequire = __webpack_require__(365);\n}\n\nvar _hooks;\n\nfunction _load_hooks() {\n  return _hooks = __webpack_require__(368);\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _packageCompatibility;\n\nfunction _load_packageCompatibility() {\n  return _packageCompatibility = __webpack_require__(207);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nconst leven = __webpack_require__(747);\nconst path = __webpack_require__(0);\n\nvar _require = __webpack_require__(780);\n\nconst quoteForShell = _require.quoteForShell,\n      sh = _require.sh,\n      unquoted = _require.unquoted;\n\n\nfunction toObject(input) {\n  const output = Object.create(null);\n\n  for (var _iterator = input.entries(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n    var _ref2;\n\n    if (_isArray) {\n      if (_i >= _iterator.length) break;\n      _ref2 = _iterator[_i++];\n    } else {\n      _i = _iterator.next();\n      if (_i.done) break;\n      _ref2 = _i.value;\n    }\n\n    const _ref = _ref2;\n    const key = _ref[0];\n    const val = _ref[1];\n\n    output[key] = val;\n  }\n\n  return output;\n}\n\nfunction setFlags(commander) {\n  commander.description('Runs a defined package script.');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 355 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.examples = exports.hasWrapper = exports.run = exports.getName = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet getName = exports.getName = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (args, config) {\n    let name = args.shift();\n\n    if (!name) {\n      const pkg = yield config.readRootManifest();\n      name = pkg.name;\n    }\n\n    if (name) {\n      if (!(0, (_validate || _load_validate()).isValidPackageName)(name)) {\n        throw new (_errors || _load_errors()).MessageError(config.reporter.lang('invalidPackageName'));\n      }\n\n      return (_npmRegistry || _load_npmRegistry()).default.escapeName(name);\n    } else {\n      throw new (_errors || _load_errors()).MessageError(config.reporter.lang('unknownPackageName'));\n    }\n  });\n\n  return function getName(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet list = (() => {\n  var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const name = yield getName(args, config);\n\n    reporter.step(1, 1, reporter.lang('gettingTags'));\n    const tags = yield config.registries.npm.request(`-/package/${name}/dist-tags`);\n\n    if (tags) {\n      reporter.info(`Package ${name}`);\n      for (const name in tags) {\n        reporter.info(`${name}: ${tags[name]}`);\n      }\n    }\n\n    if (!tags) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('packageNotFoundRegistry', name, 'npm'));\n    }\n  });\n\n  return function list(_x3, _x4, _x5, _x6) {\n    return _ref2.apply(this, arguments);\n  };\n})();\n\nlet remove = (() => {\n  var _ref3 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    if (args.length !== 2) {\n      return false;\n    }\n\n    const name = yield getName(args, config);\n    const tag = args.shift();\n\n    reporter.step(1, 3, reporter.lang('loggingIn'));\n    const revoke = yield (0, (_login || _load_login()).getToken)(config, reporter, name);\n\n    reporter.step(2, 3, reporter.lang('deletingTags'));\n    const result = yield config.registries.npm.request(`-/package/${name}/dist-tags/${encodeURI(tag)}`, {\n      method: 'DELETE'\n    });\n\n    if (result === false) {\n      reporter.error(reporter.lang('deletedTagFail'));\n    } else {\n      reporter.success(reporter.lang('deletedTag'));\n    }\n\n    reporter.step(3, 3, reporter.lang('revokingToken'));\n    yield revoke();\n\n    if (result === false) {\n      throw new Error();\n    } else {\n      return true;\n    }\n  });\n\n  return function remove(_x7, _x8, _x9, _x10) {\n    return _ref3.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\n\nvar _buildSubCommands2;\n\nfunction _load_buildSubCommands() {\n  return _buildSubCommands2 = _interopRequireDefault(__webpack_require__(59));\n}\n\nvar _login;\n\nfunction _load_login() {\n  return _login = __webpack_require__(107);\n}\n\nvar _npmRegistry;\n\nfunction _load_npmRegistry() {\n  return _npmRegistry = _interopRequireDefault(__webpack_require__(88));\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _normalizePattern2;\n\nfunction _load_normalizePattern() {\n  return _normalizePattern2 = __webpack_require__(37);\n}\n\nvar _validate;\n\nfunction _load_validate() {\n  return _validate = __webpack_require__(126);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction setFlags(commander) {\n  commander.description('Add, remove, or list tags on a package.');\n}\n\nvar _buildSubCommands = (0, (_buildSubCommands2 || _load_buildSubCommands()).default)('tag', {\n  add(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      if (args.length !== 2) {\n        return false;\n      }\n\n      var _normalizePattern = (0, (_normalizePattern2 || _load_normalizePattern()).normalizePattern)(args.shift());\n\n      const name = _normalizePattern.name,\n            range = _normalizePattern.range,\n            hasVersion = _normalizePattern.hasVersion;\n\n      if (!hasVersion) {\n        throw new (_errors || _load_errors()).MessageError(reporter.lang('requiredVersionInRange'));\n      }\n      if (!(0, (_validate || _load_validate()).isValidPackageName)(name)) {\n        throw new (_errors || _load_errors()).MessageError(reporter.lang('invalidPackageName'));\n      }\n\n      const tag = args.shift();\n\n      reporter.step(1, 3, reporter.lang('loggingIn'));\n      const revoke = yield (0, (_login || _load_login()).getToken)(config, reporter, name);\n\n      reporter.step(2, 3, reporter.lang('creatingTag', tag, range));\n      const result = yield config.registries.npm.request(`-/package/${(_npmRegistry || _load_npmRegistry()).default.escapeName(name)}/dist-tags/${encodeURI(tag)}`, {\n        method: 'PUT',\n        body: range\n      });\n\n      if (result != null && result.ok) {\n        reporter.success(reporter.lang('createdTag'));\n      } else {\n        reporter.error(reporter.lang('createdTagFail'));\n      }\n\n      reporter.step(3, 3, reporter.lang('revokingToken'));\n      yield revoke();\n\n      if (result != null && result.ok) {\n        return true;\n      } else {\n        throw new Error();\n      }\n    })();\n  },\n\n  rm(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      reporter.warn(`\\`yarn tag rm\\` is deprecated. Please use \\`yarn tag remove\\`.`);\n      yield remove(config, reporter, flags, args);\n    })();\n  },\n\n  remove(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield remove(config, reporter, flags, args);\n    })();\n  },\n\n  ls(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      reporter.warn(`\\`yarn tag ls\\` is deprecated. Please use \\`yarn tag list\\`.`);\n      yield list(config, reporter, flags, args);\n    })();\n  },\n\n  list(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield list(config, reporter, flags, args);\n    })();\n  }\n}, ['add <pkg>@<version> [<tag>]', 'remove <pkg> <tag>', 'list [<pkg>]']);\n\nconst run = _buildSubCommands.run,\n      hasWrapper = _buildSubCommands.hasWrapper,\n      examples = _buildSubCommands.examples;\nexports.run = run;\nexports.hasWrapper = hasWrapper;\nexports.examples = examples;\n\n/***/ }),\n/* 356 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.requireLockfile = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const outdatedFieldName = flags.latest ? 'latest' : 'wanted';\n    const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.lockfileFolder);\n\n    const deps = yield (0, (_upgrade || _load_upgrade()).getOutdated)(config, reporter, (0, (_extends2 || _load_extends()).default)({}, flags, { includeWorkspaceDeps: true }), lockfile, args);\n\n    if (deps.length === 0) {\n      reporter.success(reporter.lang('allDependenciesUpToDate'));\n      return;\n    }\n\n    // Fail early with runtime compatibility checks so that it doesn't fail after you've made your selections\n    const install = new (_install || _load_install()).Install(flags, config, reporter, lockfile);\n    yield install.checkCompatibility();\n\n    const usesWorkspaces = !!config.workspaceRootFolder;\n\n    const maxLengthArr = {\n      name: 'name'.length,\n      current: 'from'.length,\n      range: 'latest'.length,\n      [outdatedFieldName]: 'to'.length,\n      workspaceName: 'workspace'.length\n    };\n\n    const keysWithDynamicLength = ['name', 'current', outdatedFieldName];\n\n    if (!flags.latest) {\n      maxLengthArr.range = 'range'.length;\n      keysWithDynamicLength.push('range');\n    }\n\n    if (usesWorkspaces) {\n      keysWithDynamicLength.push('workspaceName');\n    }\n\n    deps.forEach(function (dep) {\n      return keysWithDynamicLength.forEach(function (key) {\n        maxLengthArr[key] = Math.max(maxLengthArr[key], dep[key].length);\n      });\n    });\n\n    // Depends on maxLengthArr\n    const addPadding = function addPadding(dep) {\n      return function (key) {\n        return `${dep[key]}${' '.repeat(maxLengthArr[key] - dep[key].length)}`;\n      };\n    };\n    const headerPadding = function headerPadding(header, key) {\n      return `${reporter.format.bold.underline(header)}${' '.repeat(maxLengthArr[key] - header.length)}`;\n    };\n\n    const colorizeName = function colorizeName(from, to) {\n      return reporter.format[(0, (_colorForVersions || _load_colorForVersions()).default)(from, to)];\n    };\n\n    const getNameFromHint = function getNameFromHint(hint) {\n      return hint ? `${hint}Dependencies` : 'dependencies';\n    };\n\n    const makeRow = function makeRow(dep) {\n      const padding = addPadding(dep);\n      const name = colorizeName(dep.current, dep[outdatedFieldName])(padding('name'));\n      const current = reporter.format.blue(padding('current'));\n      const latest = (0, (_colorizeDiff || _load_colorizeDiff()).default)(dep.current, padding(outdatedFieldName), reporter);\n      const url = reporter.format.cyan(dep.url);\n      const range = reporter.format.blue(flags.latest ? 'latest' : padding('range'));\n      if (usesWorkspaces) {\n        const workspace = padding('workspaceName');\n        return `${name}  ${range}  ${current}  ❯  ${latest}  ${workspace}  ${url}`;\n      } else {\n        return `${name}  ${range}  ${current}  ❯  ${latest}  ${url}`;\n      }\n    };\n\n    const makeHeaderRow = function makeHeaderRow() {\n      const name = headerPadding('name', 'name');\n      const range = headerPadding('range', 'range');\n      const from = headerPadding('from', 'current');\n      const to = headerPadding('to', outdatedFieldName);\n      const url = reporter.format.bold.underline('url');\n      if (usesWorkspaces) {\n        const workspace = headerPadding('workspace', 'workspaceName');\n        return `  ${name}  ${range}  ${from}     ${to}  ${workspace}  ${url}`;\n      } else {\n        return `  ${name}  ${range}  ${from}     ${to}  ${url}`;\n      }\n    };\n\n    const groupedDeps = deps.reduce(function (acc, dep) {\n      const hint = dep.hint,\n            name = dep.name,\n            upgradeTo = dep.upgradeTo;\n\n      const version = dep[outdatedFieldName];\n      const key = getNameFromHint(hint);\n      const xs = acc[key] || [];\n      acc[key] = xs.concat({\n        name: makeRow(dep),\n        value: dep,\n        short: `${name}@${version}`,\n        upgradeTo\n      });\n      return acc;\n    }, {});\n\n    const flatten = function flatten(xs) {\n      return xs.reduce(function (ys, y) {\n        return ys.concat(Array.isArray(y) ? flatten(y) : y);\n      }, []);\n    };\n\n    const choices = flatten(Object.keys(groupedDeps).map(function (key) {\n      return [new (_inquirer || _load_inquirer()).default.Separator(reporter.format.bold.underline.green(key)), new (_inquirer || _load_inquirer()).default.Separator(makeHeaderRow()), groupedDeps[key], new (_inquirer || _load_inquirer()).default.Separator(' ')];\n    }));\n\n    try {\n      const red = reporter.format.red('<red>');\n      const yellow = reporter.format.yellow('<yellow>');\n      const green = reporter.format.green('<green>');\n      reporter.info(reporter.lang('legendColorsForVersionUpdates', red, yellow, green));\n\n      const answers = yield reporter.prompt('Choose which packages to update.', choices, {\n        name: 'packages',\n        type: 'checkbox',\n        validate: function validate(answer) {\n          return !!answer.length || 'You must choose at least one package.';\n        }\n      });\n\n      const getPattern = function getPattern({ upgradeTo }) {\n        return upgradeTo;\n      };\n      const isHint = function isHint(x) {\n        return function ({ hint }) {\n          return hint === x;\n        };\n      };\n\n      var _arr = [null, 'dev', 'optional', 'peer'];\n      for (var _i = 0; _i < _arr.length; _i++) {\n        const hint = _arr[_i];\n        // Reset dependency flags\n        flags.dev = hint === 'dev';\n        flags.peer = hint === 'peer';\n        flags.optional = hint === 'optional';\n        flags.ignoreWorkspaceRootCheck = true;\n        flags.includeWorkspaceDeps = false;\n        flags.workspaceRootIsCwd = false;\n        const deps = answers.filter(isHint(hint));\n        if (deps.length) {\n          const install = new (_install || _load_install()).Install(flags, config, reporter, lockfile);\n\n          var _ref2 = yield install.fetchRequestFromCwd();\n\n          const packagePatterns = _ref2.requests;\n\n          const depsByWorkspace = deps.reduce(function (acc, dep) {\n            const workspaceLoc = dep.workspaceLoc;\n\n            const xs = acc[workspaceLoc] || [];\n            acc[workspaceLoc] = xs.concat(dep);\n            return acc;\n          }, {});\n          const cwd = config.cwd;\n          for (var _iterator = Object.keys(depsByWorkspace), _isArray = Array.isArray(_iterator), _i2 = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n            var _ref3;\n\n            if (_isArray) {\n              if (_i2 >= _iterator.length) break;\n              _ref3 = _iterator[_i2++];\n            } else {\n              _i2 = _iterator.next();\n              if (_i2.done) break;\n              _ref3 = _i2.value;\n            }\n\n            const loc = _ref3;\n\n            const patterns = depsByWorkspace[loc].map(getPattern);\n            (0, (_upgrade || _load_upgrade()).cleanLockfile)(lockfile, deps, packagePatterns, reporter);\n            reporter.info(reporter.lang('updateInstalling', getNameFromHint(hint)));\n            if (loc !== '') {\n              config.cwd = path.resolve(path.dirname(loc));\n            }\n            const add = new (_add || _load_add()).Add(patterns, flags, config, reporter, lockfile);\n            yield add.init();\n            config.cwd = cwd;\n          }\n        }\n      }\n    } catch (e) {\n      Promise.reject(e);\n    }\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _inquirer;\n\nfunction _load_inquirer() {\n  return _inquirer = _interopRequireDefault(__webpack_require__(276));\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _add;\n\nfunction _load_add() {\n  return _add = __webpack_require__(165);\n}\n\nvar _upgrade;\n\nfunction _load_upgrade() {\n  return _upgrade = __webpack_require__(205);\n}\n\nvar _colorForVersions;\n\nfunction _load_colorForVersions() {\n  return _colorForVersions = _interopRequireDefault(__webpack_require__(363));\n}\n\nvar _colorizeDiff;\n\nfunction _load_colorizeDiff() {\n  return _colorizeDiff = _interopRequireDefault(__webpack_require__(364));\n}\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst path = __webpack_require__(0);\n\nconst requireLockfile = exports.requireLockfile = true;\n\nfunction setFlags(commander) {\n  commander.description('Provides an easy way to update outdated packages.');\n  commander.usage('upgrade-interactive [flags]');\n  commander.option('-S, --scope <scope>', 'upgrade packages under the specified scope');\n  commander.option('--latest', 'list the latest version of packages, ignoring version ranges in package.json');\n  commander.option('-E, --exact', 'install exact version. Only used when --latest is specified.');\n  commander.option('-T, --tilde', 'install most recent release with the same minor version. Only used when --latest is specified.');\n  commander.option('-C, --caret', 'install most recent release with the same major version. Only used when --latest is specified.');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 357 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.setVersion = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet setVersion = exports.setVersion = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args, required) {\n    const pkg = yield config.readRootManifest();\n    const pkgLoc = pkg._loc;\n    const scripts = (0, (_map || _load_map()).default)();\n    let newVersion = flags.newVersion;\n    let identifier = undefined;\n    if (flags.preid) {\n      identifier = flags.preid;\n    }\n    invariant(pkgLoc, 'expected package location');\n\n    if (args.length && !newVersion) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('invalidVersionArgument', NEW_VERSION_FLAG));\n    }\n\n    function runLifecycle(lifecycle) {\n      if (scripts[lifecycle]) {\n        return (0, (_executeLifecycleScript || _load_executeLifecycleScript()).execCommand)({ stage: lifecycle, config, cmd: scripts[lifecycle], cwd: config.cwd, isInteractive: true });\n      }\n\n      return Promise.resolve();\n    }\n\n    function isCommitHooksDisabled() {\n      return flags.commitHooks === false || config.getOption('version-commit-hooks') === false;\n    }\n\n    if (pkg.scripts) {\n      // inherit `scripts` from manifest\n      Object.assign(scripts, pkg.scripts);\n    }\n\n    // get old version\n    let oldVersion = pkg.version;\n    if (oldVersion) {\n      reporter.info(`${reporter.lang('currentVersion')}: ${oldVersion}`);\n    } else {\n      oldVersion = '0.0.0';\n    }\n\n    // get new version\n    if (newVersion && !isValidNewVersion(oldVersion, newVersion, config.looseSemver, identifier)) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('invalidVersion'));\n    }\n\n    // get new version by bumping old version, if requested\n    if (!newVersion) {\n      if (flags.major) {\n        newVersion = semver.inc(oldVersion, 'major');\n      } else if (flags.minor) {\n        newVersion = semver.inc(oldVersion, 'minor');\n      } else if (flags.patch) {\n        newVersion = semver.inc(oldVersion, 'patch');\n      } else if (flags.premajor) {\n        newVersion = semver.inc(oldVersion, 'premajor', identifier);\n      } else if (flags.preminor) {\n        newVersion = semver.inc(oldVersion, 'preminor', identifier);\n      } else if (flags.prepatch) {\n        newVersion = semver.inc(oldVersion, 'prepatch', identifier);\n      } else if (flags.prerelease) {\n        newVersion = semver.inc(oldVersion, 'prerelease', identifier);\n      }\n    }\n\n    // wasn't passed a version arg so ask interactively\n    while (!newVersion) {\n      // make sure we're not running in non-interactive mode before asking for new version\n      if (flags.nonInteractive || config.nonInteractive) {\n        // if no version is specified, use current version in package.json\n        newVersion = oldVersion;\n        break;\n      }\n\n      // Make sure we dont exit with an error message when pressing Ctrl-C or enter to abort\n      try {\n        newVersion = yield reporter.question(reporter.lang('newVersion'));\n        if (!newVersion) {\n          newVersion = oldVersion;\n        }\n      } catch (err) {\n        newVersion = oldVersion;\n      }\n\n      if (!required && !newVersion) {\n        reporter.info(`${reporter.lang('noVersionOnPublish')}: ${oldVersion}`);\n        return function () {\n          return Promise.resolve();\n        };\n      }\n\n      if (isValidNewVersion(oldVersion, newVersion, config.looseSemver, identifier)) {\n        break;\n      } else {\n        newVersion = null;\n        reporter.error(reporter.lang('invalidSemver'));\n      }\n    }\n    if (newVersion) {\n      newVersion = semver.inc(oldVersion, newVersion, config.looseSemver, identifier) || newVersion;\n    }\n    invariant(newVersion, 'expected new version');\n\n    if (newVersion === pkg.version) {\n      return function () {\n        return Promise.resolve();\n      };\n    }\n\n    yield runLifecycle('preversion');\n\n    // update version\n    reporter.info(`${reporter.lang('newVersion')}: ${newVersion}`);\n    pkg.version = newVersion;\n\n    // update versions in manifests\n    const manifests = yield config.getRootManifests();\n    for (var _iterator = (_index || _load_index()).registryNames, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref2;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref2 = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref2 = _i.value;\n      }\n\n      const registryName = _ref2;\n\n      const manifest = manifests[registryName];\n      if (manifest.exists) {\n        manifest.object.version = newVersion;\n      }\n    }\n    yield config.saveRootManifests(manifests);\n\n    yield runLifecycle('version');\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      invariant(newVersion, 'expected version');\n\n      // check if a new git tag should be created\n      if (flags.gitTagVersion && config.getOption('version-git-tag')) {\n        // add git commit and tag\n        let isGit = false;\n        const parts = config.cwd.split(path.sep);\n        while (parts.length) {\n          isGit = yield (_fs || _load_fs()).exists(path.join(parts.join(path.sep), '.git'));\n          if (isGit) {\n            break;\n          } else {\n            parts.pop();\n          }\n        }\n\n        if (isGit) {\n          const message = (flags.message || String(config.getOption('version-git-message'))).replace(/%s/g, newVersion);\n          const sign = Boolean(config.getOption('version-sign-git-tag'));\n          const flag = sign ? '-sm' : '-am';\n          const prefix = String(config.getOption('version-tag-prefix'));\n          const args = ['commit', '-m', message, ...(isCommitHooksDisabled() ? ['-n'] : [])];\n\n          const gitRoot = (yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['rev-parse', '--show-toplevel'], { cwd: config.cwd })).trim();\n\n          // add manifest\n          yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['add', path.relative(gitRoot, pkgLoc)], { cwd: gitRoot });\n\n          // create git commit\n          yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(args, { cwd: gitRoot });\n\n          // create git tag\n          yield (0, (_gitSpawn || _load_gitSpawn()).spawn)(['tag', `${prefix}${newVersion}`, flag, message], { cwd: gitRoot });\n        }\n      }\n\n      yield runLifecycle('postversion');\n    });\n  });\n\n  return function setVersion(_x, _x2, _x3, _x4, _x5) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet run = exports.run = (() => {\n  var _ref4 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const commit = yield setVersion(config, reporter, flags, args, true);\n    yield commit();\n  });\n\n  return function run(_x6, _x7, _x8, _x9) {\n    return _ref4.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _index;\n\nfunction _load_index() {\n  return _index = __webpack_require__(58);\n}\n\nvar _executeLifecycleScript;\n\nfunction _load_executeLifecycleScript() {\n  return _executeLifecycleScript = __webpack_require__(111);\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _gitSpawn;\n\nfunction _load_gitSpawn() {\n  return _gitSpawn = __webpack_require__(367);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _map;\n\nfunction _load_map() {\n  return _map = _interopRequireDefault(__webpack_require__(30));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\nconst semver = __webpack_require__(22);\nconst path = __webpack_require__(0);\n\nconst NEW_VERSION_FLAG = '--new-version [version]';\nfunction isValidNewVersion(oldVersion, newVersion, looseSemver, identifier) {\n  return !!(semver.valid(newVersion, looseSemver) || semver.inc(oldVersion, newVersion, looseSemver, identifier));\n}\n\nfunction setFlags(commander) {\n  commander.description('Update the version of your package via the command line.');\n  commander.option(NEW_VERSION_FLAG, 'new version');\n  commander.option('--major', 'auto-increment major version number');\n  commander.option('--minor', 'auto-increment minor version number');\n  commander.option('--patch', 'auto-increment patch version number');\n  commander.option('--premajor', 'auto-increment premajor version number');\n  commander.option('--preminor', 'auto-increment preminor version number');\n  commander.option('--prepatch', 'auto-increment prepatch version number');\n  commander.option('--prerelease', 'auto-increment prerelease version number');\n  commander.option('--preid [preid]', 'add a custom identifier to the prerelease');\n  commander.option('--message [message]', 'message');\n  commander.option('--no-git-tag-version', 'no git tag version');\n  commander.option('--no-commit-hooks', 'bypass git hooks when committing new version');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 358 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LocalTarballFetcher = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _baseFetcher;\n\nfunction _load_baseFetcher() {\n  return _baseFetcher = _interopRequireDefault(__webpack_require__(167));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nvar _normalizeUrl;\n\nfunction _load_normalizeUrl() {\n  return _normalizeUrl = _interopRequireDefault(__webpack_require__(402));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst crypto = __webpack_require__(11);\nconst path = __webpack_require__(0);\nconst tarFs = __webpack_require__(194);\nconst url = __webpack_require__(24);\nconst fs = __webpack_require__(4);\nconst stream = __webpack_require__(23);\nconst gunzip = __webpack_require__(624);\nconst invariant = __webpack_require__(9);\nconst ssri = __webpack_require__(65);\n\nconst RE_URL_NAME_MATCH = /\\/(?:(@[^/]+)(?:\\/|%2f))?[^/]+\\/(?:-|_attachments)\\/(?:@[^/]+\\/)?([^/]+)$/;\n\nconst isHashAlgorithmSupported = name => {\n  const cachedResult = isHashAlgorithmSupported.__cache[name];\n  if (cachedResult != null) {\n    return cachedResult;\n  }\n  let supported = true;\n  try {\n    crypto.createHash(name);\n  } catch (error) {\n    if (error.message !== 'Digest method not supported') {\n      throw error;\n    }\n    supported = false;\n  }\n\n  isHashAlgorithmSupported.__cache[name] = supported;\n  return supported;\n};\nisHashAlgorithmSupported.__cache = {};\n\nclass TarballFetcher extends (_baseFetcher || _load_baseFetcher()).default {\n  constructor(...args) {\n    var _temp;\n\n    return _temp = super(...args), this.validateError = null, this.validateIntegrity = null, _temp;\n  }\n\n  setupMirrorFromCache() {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const tarballMirrorPath = _this.getTarballMirrorPath();\n      const tarballCachePath = _this.getTarballCachePath();\n\n      if (tarballMirrorPath == null) {\n        return;\n      }\n\n      if (!(yield (_fs || _load_fs()).exists(tarballMirrorPath)) && (yield (_fs || _load_fs()).exists(tarballCachePath))) {\n        // The tarball doesn't exists in the offline cache but does in the cache; we import it to the mirror\n        yield (_fs || _load_fs()).mkdirp(path.dirname(tarballMirrorPath));\n        yield (_fs || _load_fs()).copy(tarballCachePath, tarballMirrorPath, _this.reporter);\n      }\n    })();\n  }\n\n  getTarballCachePath() {\n    return path.join(this.dest, (_constants || _load_constants()).TARBALL_FILENAME);\n  }\n\n  getTarballMirrorPath() {\n    var _url$parse = url.parse(this.reference);\n\n    const pathname = _url$parse.pathname;\n\n\n    if (pathname == null) {\n      return null;\n    }\n\n    const match = pathname.match(RE_URL_NAME_MATCH);\n\n    let packageFilename;\n    if (match) {\n      const scope = match[1],\n            tarballBasename = match[2];\n\n      packageFilename = scope ? `${scope}-${tarballBasename}` : tarballBasename;\n    } else {\n      // fallback to base name\n      packageFilename = path.basename(pathname);\n    }\n\n    return this.config.getOfflineMirrorPath(packageFilename);\n  }\n\n  createExtractor(resolve, reject, tarballPath) {\n    const hashInfo = this._supportedIntegrity({ hashOnly: true });\n    const integrityInfo = this._supportedIntegrity({ hashOnly: false });\n\n    const now = new Date();\n\n    const fs = __webpack_require__(4);\n    const patchedFs = Object.assign({}, fs, {\n      utimes: (path, atime, mtime, cb) => {\n        fs.stat(path, (err, stat) => {\n          if (err) {\n            cb(err);\n            return;\n          }\n          if (stat.isDirectory()) {\n            fs.utimes(path, atime, mtime, cb);\n            return;\n          }\n          fs.open(path, 'a', (err, fd) => {\n            if (err) {\n              cb(err);\n              return;\n            }\n            fs.futimes(fd, atime, mtime, err => {\n              if (err) {\n                fs.close(fd, () => cb(err));\n              } else {\n                fs.close(fd, err => cb(err));\n              }\n            });\n          });\n        });\n      }\n    });\n\n    const hashValidateStream = new ssri.integrityStream(hashInfo);\n    const integrityValidateStream = new ssri.integrityStream(integrityInfo);\n\n    const untarStream = tarFs.extract(this.dest, {\n      strip: 1,\n      dmode: 0o755, // all dirs should be readable\n      fmode: 0o644, // all files should be readable\n      chown: false, // don't chown. just leave as it is\n      map: header => {\n        header.mtime = now;\n        if (header.linkname) {\n          const basePath = path.posix.dirname(path.join('/', header.name));\n          const jailPath = path.posix.join(basePath, header.linkname);\n          header.linkname = path.posix.relative('/', jailPath);\n        }\n        return header;\n      },\n      fs: patchedFs\n    });\n    const extractorStream = gunzip();\n\n    hashValidateStream.once('error', err => {\n      this.validateError = err;\n    });\n    integrityValidateStream.once('error', err => {\n      this.validateError = err;\n    });\n    integrityValidateStream.once('integrity', sri => {\n      this.validateIntegrity = sri;\n    });\n\n    untarStream.on('error', err => {\n      reject(new (_errors || _load_errors()).MessageError(this.config.reporter.lang('errorExtractingTarball', err.message, tarballPath)));\n    });\n\n    extractorStream.pipe(untarStream).on('finish', () => {\n      const error = this.validateError;\n      const hexDigest = this.validateIntegrity ? this.validateIntegrity.hexDigest() : '';\n      if (this.config.updateChecksums && this.remote.integrity && this.validateIntegrity && this.remote.integrity !== this.validateIntegrity.toString()) {\n        this.remote.integrity = this.validateIntegrity.toString();\n      } else if (this.validateIntegrity) {\n        this.remote.cacheIntegrity = this.validateIntegrity.toString();\n      }\n\n      if (integrityInfo.integrity && Object.keys(integrityInfo.integrity).length === 0) {\n        return reject(new (_errors || _load_errors()).SecurityError(this.config.reporter.lang('fetchBadIntegrityAlgorithm', this.packageName, this.remote.reference)));\n      }\n\n      if (error) {\n        if (this.config.updateChecksums) {\n          this.remote.integrity = error.found.toString();\n        } else {\n          return reject(new (_errors || _load_errors()).SecurityError(this.config.reporter.lang('fetchBadHashWithPath', this.packageName, this.remote.reference, error.found.toString(), error.expected.toString())));\n        }\n      }\n\n      return resolve({\n        hash: this.hash || hexDigest\n      });\n    });\n\n    return { hashValidateStream, integrityValidateStream, extractorStream };\n  }\n\n  getLocalPaths(override) {\n    const paths = [override ? path.resolve(this.config.cwd, override) : null, this.getTarballMirrorPath(), this.getTarballCachePath()];\n    // $FlowFixMe: https://github.com/facebook/flow/issues/1414\n    return paths.filter(path => path != null);\n  }\n\n  fetchFromLocal(override) {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const tarPaths = _this2.getLocalPaths(override);\n      const stream = yield (_fs || _load_fs()).readFirstAvailableStream(tarPaths);\n\n      return new Promise(function (resolve, reject) {\n        if (!stream) {\n          reject(new (_errors || _load_errors()).MessageError(_this2.reporter.lang('tarballNotInNetworkOrCache', _this2.reference, tarPaths)));\n          return;\n        }\n        invariant(stream, 'stream should be available at this point');\n        // $FlowFixMe - This is available https://nodejs.org/api/fs.html#fs_readstream_path\n        const tarballPath = stream.path;\n\n        var _createExtractor = _this2.createExtractor(resolve, reject, tarballPath);\n\n        const hashValidateStream = _createExtractor.hashValidateStream,\n              integrityValidateStream = _createExtractor.integrityValidateStream,\n              extractorStream = _createExtractor.extractorStream;\n\n\n        stream.pipe(hashValidateStream);\n        hashValidateStream.pipe(integrityValidateStream);\n\n        integrityValidateStream.pipe(extractorStream).on('error', function (err) {\n          reject(new (_errors || _load_errors()).MessageError(_this2.config.reporter.lang('fetchErrorCorrupt', err.message, tarballPath)));\n        });\n      });\n    })();\n  }\n\n  fetchFromExternal() {\n    var _this3 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const registry = _this3.config.registries[_this3.registry];\n\n      try {\n        const headers = _this3.requestHeaders();\n        return yield registry.request(_this3.reference, {\n          headers: (0, (_extends2 || _load_extends()).default)({\n            'Accept-Encoding': 'gzip'\n          }, headers),\n          buffer: true,\n          process: function process(req, resolve, reject) {\n            // should we save this to the offline cache?\n            const tarballMirrorPath = _this3.getTarballMirrorPath();\n            const tarballCachePath = _this3.getTarballCachePath();\n\n            var _createExtractor2 = _this3.createExtractor(resolve, reject);\n\n            const hashValidateStream = _createExtractor2.hashValidateStream,\n                  integrityValidateStream = _createExtractor2.integrityValidateStream,\n                  extractorStream = _createExtractor2.extractorStream;\n\n\n            req.pipe(hashValidateStream);\n            hashValidateStream.pipe(integrityValidateStream);\n\n            if (tarballMirrorPath) {\n              integrityValidateStream.pipe(fs.createWriteStream(tarballMirrorPath)).on('error', reject);\n            }\n\n            if (tarballCachePath) {\n              integrityValidateStream.pipe(fs.createWriteStream(tarballCachePath)).on('error', reject);\n            }\n\n            integrityValidateStream.pipe(extractorStream).on('error', reject);\n          }\n        }, _this3.packageName);\n      } catch (err) {\n        const tarballMirrorPath = _this3.getTarballMirrorPath();\n        const tarballCachePath = _this3.getTarballCachePath();\n\n        if (tarballMirrorPath && (yield (_fs || _load_fs()).exists(tarballMirrorPath))) {\n          yield (_fs || _load_fs()).unlink(tarballMirrorPath);\n        }\n\n        if (tarballCachePath && (yield (_fs || _load_fs()).exists(tarballCachePath))) {\n          yield (_fs || _load_fs()).unlink(tarballCachePath);\n        }\n\n        throw err;\n      }\n    })();\n  }\n\n  requestHeaders() {\n    const registry = this.config.registries.yarn;\n    const config = registry.config;\n    const requestParts = urlParts(this.reference);\n    return Object.keys(config).reduce((headers, option) => {\n      const parts = option.split(':');\n      if (parts.length === 3 && parts[1] === '_header') {\n        const registryParts = urlParts(parts[0]);\n        if (requestParts.host === registryParts.host && requestParts.path.startsWith(registryParts.path)) {\n          const headerName = parts[2];\n          const headerValue = config[option];\n          headers[headerName] = headerValue;\n        }\n      }\n      return headers;\n    }, {});\n  }\n\n  _fetch() {\n    const isFilePath = this.reference.startsWith('file:');\n    this.reference = (0, (_misc || _load_misc()).removePrefix)(this.reference, 'file:');\n    const urlParse = url.parse(this.reference);\n\n    // legacy support for local paths in yarn.lock entries\n    const isRelativePath = urlParse.protocol ? urlParse.protocol.match(/^[a-z]:$/i) : urlParse.pathname ? urlParse.pathname.match(/^(?:\\.{1,2})?[\\\\\\/]/) : false;\n\n    if (isFilePath || isRelativePath) {\n      return this.fetchFromLocal(this.reference);\n    }\n\n    return this.fetchFromLocal().catch(err => this.fetchFromExternal());\n  }\n\n  _findIntegrity({ hashOnly }) {\n    if (this.remote.integrity && !hashOnly) {\n      return ssri.parse(this.remote.integrity);\n    }\n    if (this.hash) {\n      return ssri.fromHex(this.hash, 'sha1');\n    }\n    return null;\n  }\n\n  _supportedIntegrity({ hashOnly }) {\n    const expectedIntegrity = this._findIntegrity({ hashOnly }) || {};\n    const expectedIntegrityAlgorithms = Object.keys(expectedIntegrity);\n    const shouldValidateIntegrity = (this.hash || this.remote.integrity) && !this.config.updateChecksums;\n\n    if (expectedIntegrityAlgorithms.length === 0 && (!shouldValidateIntegrity || hashOnly)) {\n      const algorithms = this.config.updateChecksums ? ['sha512'] : ['sha1'];\n      // for consistency, return sha1 for packages without a remote integrity (eg. github)\n      return { integrity: null, algorithms };\n    }\n\n    const algorithms = new Set(['sha512', 'sha1']);\n    const integrity = {};\n    for (var _iterator = expectedIntegrityAlgorithms, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const algorithm = _ref;\n\n      if (isHashAlgorithmSupported(algorithm)) {\n        algorithms.add(algorithm);\n        integrity[algorithm] = expectedIntegrity[algorithm];\n      }\n    }\n\n    return { integrity, algorithms: Array.from(algorithms) };\n  }\n}\n\nexports.default = TarballFetcher;\nclass LocalTarballFetcher extends TarballFetcher {\n  _fetch() {\n    return this.fetchFromLocal(this.reference);\n  }\n}\n\nexports.LocalTarballFetcher = LocalTarballFetcher;\n\n\nfunction urlParts(requestUrl) {\n  const normalizedUrl = (0, (_normalizeUrl || _load_normalizeUrl()).default)(requestUrl);\n  const parsed = url.parse(normalizedUrl);\n  const host = parsed.host || '';\n  const path = parsed.path || '';\n  return { host, path };\n}\n\n/***/ }),\n/* 359 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nclass PackageReference {\n  constructor(request, info, remote) {\n    this.resolver = request.resolver;\n    this.lockfile = request.lockfile;\n    this.requests = [];\n    this.config = request.config;\n    this.hint = request.hint;\n\n    this.isPlugnplay = false;\n\n    this.registry = remote.registry;\n    this.version = info.version;\n    this.name = info.name;\n    this.uid = info._uid;\n\n    this.remote = remote;\n\n    this.dependencies = [];\n\n    this.permissions = {};\n    this.patterns = [];\n    this.optional = null;\n    this.level = Infinity;\n    this.ignore = false;\n    this.incompatible = false;\n    this.fresh = false;\n    this.locations = [];\n    this.addRequest(request);\n  }\n\n  setFresh(fresh) {\n    this.fresh = fresh;\n  }\n\n  addLocation(loc) {\n    if (this.locations.indexOf(loc) === -1) {\n      this.locations.push(loc);\n    }\n  }\n\n  addRequest(request) {\n    this.requests.push(request);\n\n    this.level = Math.min(this.level, request.parentNames.length);\n  }\n\n  prune() {\n    for (var _iterator = this.patterns, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const selfPattern = _ref;\n\n      // remove ourselves from the resolver\n      this.resolver.removePattern(selfPattern);\n    }\n  }\n\n  addDependencies(deps) {\n    this.dependencies = this.dependencies.concat(deps);\n  }\n\n  setPermission(key, val) {\n    this.permissions[key] = val;\n  }\n\n  hasPermission(key) {\n    if (key in this.permissions) {\n      return this.permissions[key];\n    } else {\n      return false;\n    }\n  }\n\n  addPattern(pattern, manifest) {\n    this.resolver.addPattern(pattern, manifest);\n\n    this.patterns.push(pattern);\n\n    const shrunk = this.lockfile.getLocked(pattern);\n    if (shrunk && shrunk.permissions) {\n      for (var _iterator2 = (0, (_misc || _load_misc()).entries)(shrunk.permissions), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref3;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref3 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref3 = _i2.value;\n        }\n\n        const _ref2 = _ref3;\n        const key = _ref2[0];\n        const perm = _ref2[1];\n\n        this.setPermission(key, perm);\n      }\n    }\n  }\n\n  addOptional(optional) {\n    if (this.optional == null) {\n      // optional is uninitialised\n      this.optional = optional;\n    } else if (!optional) {\n      // otherwise, ignore all subsequent optional assignments and only accept ones making\n      // this not optional\n      this.optional = false;\n    }\n  }\n}\nexports.default = PackageReference;\n\n/***/ }),\n/* 360 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = __webpack_require__(78);\n}\n\nvar _packageRequest;\n\nfunction _load_packageRequest() {\n  return _packageRequest = _interopRequireDefault(__webpack_require__(123));\n}\n\nvar _normalizePattern2;\n\nfunction _load_normalizePattern() {\n  return _normalizePattern2 = __webpack_require__(37);\n}\n\nvar _requestManager;\n\nfunction _load_requestManager() {\n  return _requestManager = _interopRequireDefault(__webpack_require__(372));\n}\n\nvar _blockingQueue;\n\nfunction _load_blockingQueue() {\n  return _blockingQueue = _interopRequireDefault(__webpack_require__(110));\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _map;\n\nfunction _load_map() {\n  return _map = _interopRequireDefault(__webpack_require__(30));\n}\n\nvar _workspaceLayout;\n\nfunction _load_workspaceLayout() {\n  return _workspaceLayout = _interopRequireDefault(__webpack_require__(90));\n}\n\nvar _resolutionMap;\n\nfunction _load_resolutionMap() {\n  return _resolutionMap = _interopRequireDefault(__webpack_require__(212));\n}\n\nvar _resolutionMap2;\n\nfunction _load_resolutionMap2() {\n  return _resolutionMap2 = __webpack_require__(212);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nconst semver = __webpack_require__(22);\n\nclass PackageResolver {\n  constructor(config, lockfile, resolutionMap = new (_resolutionMap || _load_resolutionMap()).default(config)) {\n    this.patternsByPackage = (0, (_map || _load_map()).default)();\n    this.fetchingPatterns = new Set();\n    this.fetchingQueue = new (_blockingQueue || _load_blockingQueue()).default('resolver fetching');\n    this.patterns = (0, (_map || _load_map()).default)();\n    this.resolutionMap = resolutionMap;\n    this.usedRegistries = new Set();\n    this.flat = false;\n\n    this.reporter = config.reporter;\n    this.lockfile = lockfile;\n    this.config = config;\n    this.delayedResolveQueue = [];\n  }\n\n  // whether the dependency graph will be flattened\n\n\n  // list of registries that have been used in this resolution\n\n\n  // activity monitor\n\n\n  // patterns we've already resolved or are in the process of resolving\n\n\n  // TODO\n\n\n  // manages and throttles json api http requests\n\n\n  // list of patterns associated with a package\n\n\n  // lockfile instance which we can use to retrieve version info\n\n\n  // a map of dependency patterns to packages\n\n\n  // reporter instance, abstracts out display logic\n\n\n  // environment specific config methods and options\n\n\n  // list of packages need to be resolved later (they found a matching version in the\n  // resolver, but better matches can still arrive later in the resolve process)\n\n\n  /**\n   * TODO description\n   */\n\n  isNewPattern(pattern) {\n    return !!this.patterns[pattern].fresh;\n  }\n\n  updateManifest(ref, newPkg) {\n    // inherit fields\n    const oldPkg = this.patterns[ref.patterns[0]];\n    newPkg._reference = ref;\n    newPkg._remote = ref.remote;\n    newPkg.name = oldPkg.name;\n    newPkg.fresh = oldPkg.fresh;\n    newPkg.prebuiltVariants = oldPkg.prebuiltVariants;\n\n    // update patterns\n    for (var _iterator = ref.patterns, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const pattern = _ref;\n\n      this.patterns[pattern] = newPkg;\n    }\n\n    return Promise.resolve();\n  }\n\n  updateManifests(newPkgs) {\n    for (var _iterator2 = newPkgs, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n      var _ref2;\n\n      if (_isArray2) {\n        if (_i2 >= _iterator2.length) break;\n        _ref2 = _iterator2[_i2++];\n      } else {\n        _i2 = _iterator2.next();\n        if (_i2.done) break;\n        _ref2 = _i2.value;\n      }\n\n      const newPkg = _ref2;\n\n      if (newPkg._reference) {\n        for (var _iterator3 = newPkg._reference.patterns, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n          var _ref3;\n\n          if (_isArray3) {\n            if (_i3 >= _iterator3.length) break;\n            _ref3 = _iterator3[_i3++];\n          } else {\n            _i3 = _iterator3.next();\n            if (_i3.done) break;\n            _ref3 = _i3.value;\n          }\n\n          const pattern = _ref3;\n\n          const oldPkg = this.patterns[pattern];\n          newPkg.prebuiltVariants = oldPkg.prebuiltVariants;\n\n          this.patterns[pattern] = newPkg;\n        }\n      }\n    }\n\n    return Promise.resolve();\n  }\n\n  /**\n   * Given a list of patterns, dedupe them to a list of unique patterns.\n   */\n\n  dedupePatterns(patterns) {\n    const deduped = [];\n    const seen = new Set();\n\n    for (var _iterator4 = patterns, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n      var _ref4;\n\n      if (_isArray4) {\n        if (_i4 >= _iterator4.length) break;\n        _ref4 = _iterator4[_i4++];\n      } else {\n        _i4 = _iterator4.next();\n        if (_i4.done) break;\n        _ref4 = _i4.value;\n      }\n\n      const pattern = _ref4;\n\n      const info = this.getResolvedPattern(pattern);\n      if (seen.has(info)) {\n        continue;\n      }\n\n      seen.add(info);\n      deduped.push(pattern);\n    }\n\n    return deduped;\n  }\n\n  /**\n   * Get a list of all manifests by topological order.\n   */\n\n  getTopologicalManifests(seedPatterns) {\n    const pkgs = new Set();\n    const skip = new Set();\n\n    const add = seedPatterns => {\n      for (var _iterator5 = seedPatterns, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n        var _ref5;\n\n        if (_isArray5) {\n          if (_i5 >= _iterator5.length) break;\n          _ref5 = _iterator5[_i5++];\n        } else {\n          _i5 = _iterator5.next();\n          if (_i5.done) break;\n          _ref5 = _i5.value;\n        }\n\n        const pattern = _ref5;\n\n        const pkg = this.getStrictResolvedPattern(pattern);\n        if (skip.has(pkg)) {\n          continue;\n        }\n\n        const ref = pkg._reference;\n        invariant(ref, 'expected reference');\n        skip.add(pkg);\n        add(ref.dependencies);\n        pkgs.add(pkg);\n      }\n    };\n\n    add(seedPatterns);\n\n    return pkgs;\n  }\n\n  /**\n   * Get a list of all manifests by level sort order.\n   */\n\n  getLevelOrderManifests(seedPatterns) {\n    const pkgs = new Set();\n    const skip = new Set();\n\n    const add = seedPatterns => {\n      const refs = [];\n\n      for (var _iterator6 = seedPatterns, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n        var _ref6;\n\n        if (_isArray6) {\n          if (_i6 >= _iterator6.length) break;\n          _ref6 = _iterator6[_i6++];\n        } else {\n          _i6 = _iterator6.next();\n          if (_i6.done) break;\n          _ref6 = _i6.value;\n        }\n\n        const pattern = _ref6;\n\n        const pkg = this.getStrictResolvedPattern(pattern);\n        if (skip.has(pkg)) {\n          continue;\n        }\n\n        const ref = pkg._reference;\n        invariant(ref, 'expected reference');\n\n        refs.push(ref);\n        skip.add(pkg);\n        pkgs.add(pkg);\n      }\n\n      for (var _iterator7 = refs, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {\n        var _ref7;\n\n        if (_isArray7) {\n          if (_i7 >= _iterator7.length) break;\n          _ref7 = _iterator7[_i7++];\n        } else {\n          _i7 = _iterator7.next();\n          if (_i7.done) break;\n          _ref7 = _i7.value;\n        }\n\n        const ref = _ref7;\n\n        add(ref.dependencies);\n      }\n    };\n\n    add(seedPatterns);\n\n    return pkgs;\n  }\n\n  /**\n   * Get a list of all package names in the dependency graph.\n   */\n\n  getAllDependencyNamesByLevelOrder(seedPatterns) {\n    const names = new Set();\n    for (var _iterator8 = this.getLevelOrderManifests(seedPatterns), _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {\n      var _ref9;\n\n      if (_isArray8) {\n        if (_i8 >= _iterator8.length) break;\n        _ref9 = _iterator8[_i8++];\n      } else {\n        _i8 = _iterator8.next();\n        if (_i8.done) break;\n        _ref9 = _i8.value;\n      }\n\n      const _ref8 = _ref9;\n      const name = _ref8.name;\n\n      names.add(name);\n    }\n    return names;\n  }\n\n  /**\n   * Retrieve all the package info stored for this package name.\n   */\n\n  getAllInfoForPackageName(name) {\n    const patterns = this.patternsByPackage[name] || [];\n    return this.getAllInfoForPatterns(patterns);\n  }\n\n  /**\n   * Retrieve all the package info stored for a list of patterns.\n   */\n\n  getAllInfoForPatterns(patterns) {\n    const infos = [];\n    const seen = new Set();\n\n    for (var _iterator9 = patterns, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {\n      var _ref10;\n\n      if (_isArray9) {\n        if (_i9 >= _iterator9.length) break;\n        _ref10 = _iterator9[_i9++];\n      } else {\n        _i9 = _iterator9.next();\n        if (_i9.done) break;\n        _ref10 = _i9.value;\n      }\n\n      const pattern = _ref10;\n\n      const info = this.patterns[pattern];\n      if (seen.has(info)) {\n        continue;\n      }\n\n      seen.add(info);\n      infos.push(info);\n    }\n\n    return infos;\n  }\n\n  /**\n   * Get a flat list of all package info.\n   */\n\n  getManifests() {\n    const infos = [];\n    const seen = new Set();\n\n    for (const pattern in this.patterns) {\n      const info = this.patterns[pattern];\n      if (seen.has(info)) {\n        continue;\n      }\n\n      infos.push(info);\n      seen.add(info);\n    }\n\n    return infos;\n  }\n\n  /**\n   * replace pattern in resolver, e.g. `name` is replaced with `name@^1.0.1`\n   */\n  replacePattern(pattern, newPattern) {\n    const pkg = this.getResolvedPattern(pattern);\n    invariant(pkg, `missing package ${pattern}`);\n    const ref = pkg._reference;\n    invariant(ref, 'expected package reference');\n    ref.patterns = [newPattern];\n    this.addPattern(newPattern, pkg);\n    this.removePattern(pattern);\n  }\n\n  /**\n   * Make all versions of this package resolve to it.\n   */\n\n  collapseAllVersionsOfPackage(name, version) {\n    const patterns = this.dedupePatterns(this.patternsByPackage[name]);\n    return this.collapsePackageVersions(name, version, patterns);\n  }\n\n  /**\n   * Make all given patterns resolve to version.\n   */\n  collapsePackageVersions(name, version, patterns) {\n    const human = `${name}@${version}`;\n\n    // get manifest that matches the version we're collapsing too\n    let collapseToReference;\n    let collapseToManifest;\n    let collapseToPattern;\n    for (var _iterator10 = patterns, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) {\n      var _ref11;\n\n      if (_isArray10) {\n        if (_i10 >= _iterator10.length) break;\n        _ref11 = _iterator10[_i10++];\n      } else {\n        _i10 = _iterator10.next();\n        if (_i10.done) break;\n        _ref11 = _i10.value;\n      }\n\n      const pattern = _ref11;\n\n      const _manifest = this.patterns[pattern];\n      if (_manifest.version === version) {\n        collapseToReference = _manifest._reference;\n        collapseToManifest = _manifest;\n        collapseToPattern = pattern;\n        break;\n      }\n    }\n\n    invariant(collapseToReference && collapseToManifest && collapseToPattern, `Couldn't find package manifest for ${human}`);\n\n    for (var _iterator11 = patterns, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) {\n      var _ref12;\n\n      if (_isArray11) {\n        if (_i11 >= _iterator11.length) break;\n        _ref12 = _iterator11[_i11++];\n      } else {\n        _i11 = _iterator11.next();\n        if (_i11.done) break;\n        _ref12 = _i11.value;\n      }\n\n      const pattern = _ref12;\n\n      // don't touch the pattern we're collapsing to\n      if (pattern === collapseToPattern) {\n        continue;\n      }\n\n      // remove this pattern\n      const ref = this.getStrictResolvedPattern(pattern)._reference;\n      invariant(ref, 'expected package reference');\n      const refPatterns = ref.patterns.slice();\n      ref.prune();\n\n      // add pattern to the manifest we're collapsing to\n      for (var _iterator12 = refPatterns, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) {\n        var _ref13;\n\n        if (_isArray12) {\n          if (_i12 >= _iterator12.length) break;\n          _ref13 = _iterator12[_i12++];\n        } else {\n          _i12 = _iterator12.next();\n          if (_i12.done) break;\n          _ref13 = _i12.value;\n        }\n\n        const pattern = _ref13;\n\n        collapseToReference.addPattern(pattern, collapseToManifest);\n      }\n    }\n\n    return collapseToPattern;\n  }\n\n  /**\n   * TODO description\n   */\n\n  addPattern(pattern, info) {\n    this.patterns[pattern] = info;\n\n    const byName = this.patternsByPackage[info.name] = this.patternsByPackage[info.name] || [];\n    if (byName.indexOf(pattern) === -1) {\n      byName.push(pattern);\n    }\n  }\n\n  /**\n   * TODO description\n   */\n\n  removePattern(pattern) {\n    const pkg = this.patterns[pattern];\n    if (!pkg) {\n      return;\n    }\n\n    const byName = this.patternsByPackage[pkg.name];\n    if (!byName) {\n      return;\n    }\n\n    byName.splice(byName.indexOf(pattern), 1);\n    delete this.patterns[pattern];\n  }\n\n  /**\n   * TODO description\n   */\n\n  getResolvedPattern(pattern) {\n    return this.patterns[pattern];\n  }\n\n  /**\n   * TODO description\n   */\n\n  getStrictResolvedPattern(pattern) {\n    const manifest = this.getResolvedPattern(pattern);\n    invariant(manifest, 'expected manifest');\n    return manifest;\n  }\n\n  /**\n   * TODO description\n   */\n\n  getExactVersionMatch(name, version, manifest) {\n    const patterns = this.patternsByPackage[name];\n    if (!patterns) {\n      return null;\n    }\n\n    for (var _iterator13 = patterns, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) {\n      var _ref14;\n\n      if (_isArray13) {\n        if (_i13 >= _iterator13.length) break;\n        _ref14 = _iterator13[_i13++];\n      } else {\n        _i13 = _iterator13.next();\n        if (_i13.done) break;\n        _ref14 = _i13.value;\n      }\n\n      const pattern = _ref14;\n\n      const info = this.getStrictResolvedPattern(pattern);\n      if (info.version === version) {\n        return info;\n      }\n    }\n\n    if (manifest && (0, (_index || _load_index()).getExoticResolver)(version)) {\n      return this.exoticRangeMatch(patterns.map(this.getStrictResolvedPattern.bind(this)), manifest);\n    }\n\n    return null;\n  }\n\n  /**\n   * Get the manifest of the highest known version that satisfies a package range\n   */\n\n  getHighestRangeVersionMatch(name, range, manifest) {\n    const patterns = this.patternsByPackage[name];\n\n    if (!patterns) {\n      return null;\n    }\n\n    const versionNumbers = [];\n    const resolvedPatterns = patterns.map(pattern => {\n      const info = this.getStrictResolvedPattern(pattern);\n      versionNumbers.push(info.version);\n\n      return info;\n    });\n\n    const maxValidRange = semver.maxSatisfying(versionNumbers, range);\n\n    if (!maxValidRange) {\n      return manifest && (0, (_index || _load_index()).getExoticResolver)(range) ? this.exoticRangeMatch(resolvedPatterns, manifest) : null;\n    }\n\n    const indexOfmaxValidRange = versionNumbers.indexOf(maxValidRange);\n    const maxValidRangeManifest = resolvedPatterns[indexOfmaxValidRange];\n\n    return maxValidRangeManifest;\n  }\n\n  /**\n   * Get the manifest of the package that matches an exotic range\n   */\n\n  exoticRangeMatch(resolvedPkgs, manifest) {\n    const remote = manifest._remote;\n    if (!(remote && remote.reference && remote.type === 'copy')) {\n      return null;\n    }\n\n    const matchedPkg = resolvedPkgs.find(({ _remote: pkgRemote }) => pkgRemote && pkgRemote.reference === remote.reference && pkgRemote.type === 'copy');\n\n    if (matchedPkg) {\n      manifest._remote = matchedPkg._remote;\n    }\n\n    return matchedPkg;\n  }\n\n  /**\n   * Determine if LockfileEntry is incorrect, remove it from lockfile cache and consider the pattern as new\n   */\n  isLockfileEntryOutdated(version, range, hasVersion) {\n    return !!(semver.validRange(range) && semver.valid(version) && !(0, (_index || _load_index()).getExoticResolver)(range) && hasVersion && !semver.satisfies(version, range));\n  }\n\n  /**\n   * TODO description\n   */\n\n  find(initialReq) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const req = _this.resolveToResolution(initialReq);\n\n      // we've already resolved it with a resolution\n      if (!req) {\n        return;\n      }\n\n      const request = new (_packageRequest || _load_packageRequest()).default(req, _this);\n      const fetchKey = `${req.registry}:${req.pattern}:${String(req.optional)}`;\n      const initialFetch = !_this.fetchingPatterns.has(fetchKey);\n      let fresh = false;\n\n      if (_this.activity) {\n        _this.activity.tick(req.pattern);\n      }\n\n      if (initialFetch) {\n        _this.fetchingPatterns.add(fetchKey);\n\n        const lockfileEntry = _this.lockfile.getLocked(req.pattern);\n\n        if (lockfileEntry) {\n          var _normalizePattern = (0, (_normalizePattern2 || _load_normalizePattern()).normalizePattern)(req.pattern);\n\n          const range = _normalizePattern.range,\n                hasVersion = _normalizePattern.hasVersion;\n\n\n          if (_this.isLockfileEntryOutdated(lockfileEntry.version, range, hasVersion)) {\n            _this.reporter.warn(_this.reporter.lang('incorrectLockfileEntry', req.pattern));\n            _this.removePattern(req.pattern);\n            _this.lockfile.removePattern(req.pattern);\n            fresh = true;\n          }\n        } else {\n          fresh = true;\n        }\n\n        request.init();\n      }\n\n      yield request.find({ fresh, frozen: _this.frozen });\n    })();\n  }\n\n  /**\n   * TODO description\n   */\n\n  init(deps, { isFlat, isFrozen, workspaceLayout } = {\n    isFlat: false,\n    isFrozen: false,\n    workspaceLayout: undefined\n  }) {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      _this2.flat = Boolean(isFlat);\n      _this2.frozen = Boolean(isFrozen);\n      _this2.workspaceLayout = workspaceLayout;\n      const activity = _this2.activity = _this2.reporter.activity();\n\n      for (var _iterator14 = deps, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) {\n        var _ref15;\n\n        if (_isArray14) {\n          if (_i14 >= _iterator14.length) break;\n          _ref15 = _iterator14[_i14++];\n        } else {\n          _i14 = _iterator14.next();\n          if (_i14.done) break;\n          _ref15 = _i14.value;\n        }\n\n        const req = _ref15;\n\n        yield _this2.find(req);\n      }\n\n      // all required package versions have been discovered, so now packages that\n      // resolved to existing versions can be resolved to their best available version\n      _this2.resolvePackagesWithExistingVersions();\n\n      for (var _iterator15 = _this2.resolutionMap.delayQueue, _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) {\n        var _ref16;\n\n        if (_isArray15) {\n          if (_i15 >= _iterator15.length) break;\n          _ref16 = _iterator15[_i15++];\n        } else {\n          _i15 = _iterator15.next();\n          if (_i15.done) break;\n          _ref16 = _i15.value;\n        }\n\n        const req = _ref16;\n\n        _this2.resolveToResolution(req);\n      }\n\n      if (isFlat) {\n        for (var _iterator16 = deps, _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator]();;) {\n          var _ref17;\n\n          if (_isArray16) {\n            if (_i16 >= _iterator16.length) break;\n            _ref17 = _iterator16[_i16++];\n          } else {\n            _i16 = _iterator16.next();\n            if (_i16.done) break;\n            _ref17 = _i16.value;\n          }\n\n          const dep = _ref17;\n\n          const name = (0, (_normalizePattern2 || _load_normalizePattern()).normalizePattern)(dep.pattern).name;\n          _this2.optimizeResolutions(name);\n        }\n      }\n\n      activity.end();\n      _this2.activity = null;\n    })();\n  }\n\n  // for a given package, see if a single manifest can satisfy all ranges\n  optimizeResolutions(name) {\n    const patterns = this.dedupePatterns(this.patternsByPackage[name] || []);\n\n    // don't optimize things that already have a lockfile entry:\n    // https://github.com/yarnpkg/yarn/issues/79\n    const collapsablePatterns = patterns.filter(pattern => {\n      const remote = this.patterns[pattern]._remote;\n      return !this.lockfile.getLocked(pattern) && (!remote || remote.type !== 'workspace');\n    });\n    if (collapsablePatterns.length < 2) {\n      return;\n    }\n\n    // reverse sort, so we'll find the maximum satisfying version first\n    const availableVersions = this.getAllInfoForPatterns(collapsablePatterns).map(manifest => manifest.version);\n    availableVersions.sort(semver.rcompare);\n\n    const ranges = collapsablePatterns.map(pattern => (0, (_normalizePattern2 || _load_normalizePattern()).normalizePattern)(pattern).range);\n\n    // find the most recent version that satisfies all patterns (if one exists), and\n    // collapse to that version.\n    for (var _iterator17 = availableVersions, _isArray17 = Array.isArray(_iterator17), _i17 = 0, _iterator17 = _isArray17 ? _iterator17 : _iterator17[Symbol.iterator]();;) {\n      var _ref18;\n\n      if (_isArray17) {\n        if (_i17 >= _iterator17.length) break;\n        _ref18 = _iterator17[_i17++];\n      } else {\n        _i17 = _iterator17.next();\n        if (_i17.done) break;\n        _ref18 = _i17.value;\n      }\n\n      const version = _ref18;\n\n      if (ranges.every(range => semver.satisfies(version, range))) {\n        this.collapsePackageVersions(name, version, collapsablePatterns);\n        return;\n      }\n    }\n  }\n\n  /**\n    * Called by the package requester for packages that this resolver already had\n    * a matching version for. Delay the resolve, because better matches can still be\n    * discovered.\n    */\n\n  reportPackageWithExistingVersion(req, info) {\n    this.delayedResolveQueue.push({ req, info });\n  }\n\n  /**\n    * Executes the resolve to existing versions for packages after the find process,\n    * when all versions that are going to be used have been discovered.\n    */\n\n  resolvePackagesWithExistingVersions() {\n    for (var _iterator18 = this.delayedResolveQueue, _isArray18 = Array.isArray(_iterator18), _i18 = 0, _iterator18 = _isArray18 ? _iterator18 : _iterator18[Symbol.iterator]();;) {\n      var _ref20;\n\n      if (_isArray18) {\n        if (_i18 >= _iterator18.length) break;\n        _ref20 = _iterator18[_i18++];\n      } else {\n        _i18 = _iterator18.next();\n        if (_i18.done) break;\n        _ref20 = _i18.value;\n      }\n\n      const _ref19 = _ref20;\n      const req = _ref19.req,\n            info = _ref19.info;\n\n      req.resolveToExistingVersion(info);\n    }\n  }\n\n  resolveToResolution(req) {\n    const parentNames = req.parentNames,\n          pattern = req.pattern;\n\n\n    if (!parentNames || this.flat) {\n      return req;\n    }\n\n    const resolution = this.resolutionMap.find(pattern, parentNames);\n\n    if (resolution) {\n      const resolutionManifest = this.getResolvedPattern(resolution);\n\n      if (resolutionManifest) {\n        invariant(resolutionManifest._reference, 'resolutions should have a resolved reference');\n        resolutionManifest._reference.patterns.push(pattern);\n        this.addPattern(pattern, resolutionManifest);\n        const lockManifest = this.lockfile.getLocked(pattern);\n        if ((0, (_resolutionMap2 || _load_resolutionMap2()).shouldUpdateLockfile)(lockManifest, resolutionManifest._reference)) {\n          this.lockfile.removePattern(pattern);\n        }\n      } else {\n        this.resolutionMap.addToDelayQueue(req);\n      }\n      return null;\n    }\n\n    return req;\n  }\n}\nexports.default = PackageResolver;\n\n/***/ }),\n/* 361 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _hostedGitResolver;\n\nfunction _load_hostedGitResolver() {\n  return _hostedGitResolver = _interopRequireDefault(__webpack_require__(109));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass GitHubResolver extends (_hostedGitResolver || _load_hostedGitResolver()).default {\n\n  static isVersion(pattern) {\n    // github proto\n    if (pattern.startsWith('github:')) {\n      return true;\n    }\n\n    // github shorthand\n    if (/^[^:@%/\\s.-][^:@%/\\s]*[/][^:@\\s/%]+(?:#.*)?$/.test(pattern)) {\n      return true;\n    }\n\n    return false;\n  }\n\n  static getTarballUrl(parts, hash) {\n    return `https://codeload.${this.hostname}/${parts.user}/${parts.repo}/tar.gz/${hash}`;\n  }\n\n  static getGitSSHUrl(parts) {\n    return `git+ssh://git@${this.hostname}/${parts.user}/${parts.repo}.git` + `${parts.hash ? '#' + decodeURIComponent(parts.hash) : ''}`;\n  }\n\n  static getGitHTTPBaseUrl(parts) {\n    return `https://${this.hostname}/${parts.user}/${parts.repo}`;\n  }\n\n  static getGitHTTPUrl(parts) {\n    return `${GitHubResolver.getGitHTTPBaseUrl(parts)}.git`;\n  }\n\n  static getHTTPFileUrl(parts, filename, commit) {\n    return `https://raw.githubusercontent.com/${parts.user}/${parts.repo}/${commit}/${filename}`;\n  }\n}\nexports.default = GitHubResolver;\nGitHubResolver.protocol = 'github';\nGitHubResolver.hostname = 'github.com';\n\n/***/ }),\n/* 362 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LINK_PROTOCOL_PREFIX = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _exoticResolver;\n\nfunction _load_exoticResolver() {\n  return _exoticResolver = _interopRequireDefault(__webpack_require__(89));\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = _interopRequireWildcard(__webpack_require__(18));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst path = __webpack_require__(0);\n\nconst LINK_PROTOCOL_PREFIX = exports.LINK_PROTOCOL_PREFIX = 'link:';\n\nclass LinkResolver extends (_exoticResolver || _load_exoticResolver()).default {\n  constructor(request, fragment) {\n    super(request, fragment);\n    this.loc = (_misc || _load_misc()).removePrefix(fragment, LINK_PROTOCOL_PREFIX);\n  }\n\n  resolve() {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      let loc = _this.loc;\n      if (!path.isAbsolute(loc)) {\n        loc = path.resolve(_this.config.lockfileFolder, loc);\n      }\n\n      const name = path.basename(loc);\n      const registry = 'npm';\n\n      const manifest = !(yield (_fs || _load_fs()).exists(`${loc}/package.json`)) || loc === _this.config.lockfileFolder ? { _uid: '', name, version: '0.0.0', _registry: registry } : yield _this.config.readManifest(loc, _this.registry);\n\n      manifest._remote = {\n        type: 'link',\n        registry,\n        hash: null,\n        reference: loc\n      };\n\n      manifest._uid = manifest.version;\n\n      return manifest;\n    })();\n  }\n}\nexports.default = LinkResolver;\nLinkResolver.protocol = 'link';\n\n/***/ }),\n/* 363 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (from, to) {\n  const validFrom = (_semver || _load_semver()).default.valid(from);\n  const validTo = (_semver || _load_semver()).default.valid(to);\n  let versionBump = 'unknown';\n  if (validFrom && validTo) {\n    versionBump = (0, (_semver2 || _load_semver2()).diffWithUnstable)(validFrom, validTo) || 'unchanged';\n  }\n  return (_constants || _load_constants()).VERSION_COLOR_SCHEME[versionBump];\n};\n\nvar _semver;\n\nfunction _load_semver() {\n  return _semver = _interopRequireDefault(__webpack_require__(22));\n}\n\nvar _semver2;\n\nfunction _load_semver2() {\n  return _semver2 = __webpack_require__(170);\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 364 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (from, to, reporter) {\n  const parts = to.split('.');\n  const fromParts = from.split('.');\n\n  const splitIndex = parts.findIndex((part, i) => part !== fromParts[i]);\n  if (splitIndex === -1) {\n    return from;\n  }\n\n  const colorized = reporter.format.green(parts.slice(splitIndex).join('.'));\n  return parts.slice(0, splitIndex).concat(colorized).join('.');\n};\n\n/***/ }),\n/* 365 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// $FlowFixMe We want this require to be dynamic\nexports.dynamicRequire =  true ? require : require; // eslint-disable-line\n\n/***/ }),\n/* 366 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sortFilter = sortFilter;\nexports.matchesFilter = matchesFilter;\nexports.ignoreLinesToRegex = ignoreLinesToRegex;\nexports.filterOverridenGitignores = filterOverridenGitignores;\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nconst mm = __webpack_require__(115);\nconst path = __webpack_require__(0);\n\nconst WHITESPACE_RE = /^\\s+$/;\n\nfunction sortFilter(files, filters, keepFiles = new Set(), possibleKeepFiles = new Set(), ignoreFiles = new Set()) {\n  for (var _iterator = files, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n    var _ref;\n\n    if (_isArray) {\n      if (_i >= _iterator.length) break;\n      _ref = _iterator[_i++];\n    } else {\n      _i = _iterator.next();\n      if (_i.done) break;\n      _ref = _i.value;\n    }\n\n    const file = _ref;\n\n    let keep = false;\n\n    // always keep a file if a ! pattern matches it\n    for (var _iterator5 = filters, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n      var _ref5;\n\n      if (_isArray5) {\n        if (_i5 >= _iterator5.length) break;\n        _ref5 = _iterator5[_i5++];\n      } else {\n        _i5 = _iterator5.next();\n        if (_i5.done) break;\n        _ref5 = _i5.value;\n      }\n\n      const filter = _ref5;\n\n      if (filter.isNegation && matchesFilter(filter, file.basename, file.relative)) {\n        keep = true;\n        break;\n      }\n    }\n\n    //\n    if (keep) {\n      keepFiles.add(file.relative);\n      continue;\n    }\n\n    // otherwise don't keep it if a pattern matches it\n    keep = true;\n    for (var _iterator6 = filters, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n      var _ref6;\n\n      if (_isArray6) {\n        if (_i6 >= _iterator6.length) break;\n        _ref6 = _iterator6[_i6++];\n      } else {\n        _i6 = _iterator6.next();\n        if (_i6.done) break;\n        _ref6 = _i6.value;\n      }\n\n      const filter = _ref6;\n\n      if (!filter.isNegation && matchesFilter(filter, file.basename, file.relative)) {\n        keep = false;\n        break;\n      }\n    }\n\n    if (keep) {\n      possibleKeepFiles.add(file.relative);\n    } else {\n      ignoreFiles.add(file.relative);\n    }\n  }\n\n  // exclude file\n  for (var _iterator2 = possibleKeepFiles, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n    var _ref2;\n\n    if (_isArray2) {\n      if (_i2 >= _iterator2.length) break;\n      _ref2 = _iterator2[_i2++];\n    } else {\n      _i2 = _iterator2.next();\n      if (_i2.done) break;\n      _ref2 = _i2.value;\n    }\n\n    const file = _ref2;\n\n    const parts = path.dirname(file).split(path.sep);\n\n    while (parts.length) {\n      const folder = parts.join(path.sep);\n      if (ignoreFiles.has(folder)) {\n        ignoreFiles.add(file);\n        break;\n      }\n      parts.pop();\n    }\n  }\n\n  //\n  for (var _iterator3 = possibleKeepFiles, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n    var _ref3;\n\n    if (_isArray3) {\n      if (_i3 >= _iterator3.length) break;\n      _ref3 = _iterator3[_i3++];\n    } else {\n      _i3 = _iterator3.next();\n      if (_i3.done) break;\n      _ref3 = _i3.value;\n    }\n\n    const file = _ref3;\n\n    if (!ignoreFiles.has(file)) {\n      keepFiles.add(file);\n    }\n  }\n\n  //\n  for (var _iterator4 = keepFiles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n    var _ref4;\n\n    if (_isArray4) {\n      if (_i4 >= _iterator4.length) break;\n      _ref4 = _iterator4[_i4++];\n    } else {\n      _i4 = _iterator4.next();\n      if (_i4.done) break;\n      _ref4 = _i4.value;\n    }\n\n    const file = _ref4;\n\n    const parts = path.dirname(file).split(path.sep);\n\n    while (parts.length) {\n      // deregister this folder from being ignored, any files inside\n      // will still be marked as ignored\n      ignoreFiles.delete(parts.join(path.sep));\n      parts.pop();\n    }\n  }\n\n  return { ignoreFiles, keepFiles };\n}\n\nfunction matchesFilter(filter, basename, loc) {\n  let filterByBasename = true;\n  if (filter.base && filter.base !== '.') {\n    loc = path.relative(filter.base, loc);\n    filterByBasename = false;\n  }\n  // the micromatch regex expects unix path separators\n  loc = loc.replace(/\\\\/g, '/');\n\n  return filter.regex.test(loc) || filter.regex.test(`/${loc}`) || filterByBasename && filter.regex.test(basename) || mm.isMatch(loc, filter.pattern);\n}\n\nfunction ignoreLinesToRegex(lines, base = '.') {\n  return lines\n  // create regex\n  .map(line => {\n    // remove empty lines, comments, etc\n    if (line === '' || line === '!' || line[0] === '#' || WHITESPACE_RE.test(line)) {\n      return null;\n    }\n\n    let pattern = line;\n    let isNegation = false;\n\n    // hide the fact that it's a negation from minimatch since we'll handle this specifically\n    // ourselves\n    if (pattern[0] === '!') {\n      isNegation = true;\n      pattern = pattern.slice(1);\n    }\n\n    // remove trailing slash\n    pattern = (0, (_misc || _load_misc()).removeSuffix)(pattern, '/');\n\n    const regex = mm.makeRe(pattern.trim(), { dot: true, nocase: true });\n\n    if (regex) {\n      return {\n        base,\n        isNegation,\n        pattern,\n        regex\n      };\n    } else {\n      return null;\n    }\n  }).filter(Boolean);\n}\n\nfunction filterOverridenGitignores(files) {\n  const IGNORE_FILENAMES = ['.yarnignore', '.npmignore', '.gitignore'];\n  const GITIGNORE_NAME = IGNORE_FILENAMES[2];\n  return files.filter(file => IGNORE_FILENAMES.indexOf(file.basename) > -1).reduce((acc, file) => {\n    if (file.basename !== GITIGNORE_NAME) {\n      return [...acc, file];\n    } else {\n      //don't include .gitignore if .npmignore or .yarnignore are present\n      const dir = path.dirname(file.absolute);\n      const higherPriorityIgnoreFilePaths = [path.join(dir, IGNORE_FILENAMES[0]), path.join(dir, IGNORE_FILENAMES[1])];\n      const hasHigherPriorityFiles = files.find(file => higherPriorityIgnoreFilePaths.indexOf(path.normalize(file.absolute)) > -1);\n      if (!hasHigherPriorityFiles) {\n        return [...acc, file];\n      }\n    }\n    return acc;\n  }, []);\n}\n\n/***/ }),\n/* 367 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.spawn = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _path;\n\nfunction _load_path() {\n  return _path = _interopRequireDefault(__webpack_require__(0));\n}\n\nvar _child;\n\nfunction _load_child() {\n  return _child = _interopRequireWildcard(__webpack_require__(50));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst BATCH_MODE_ARGS = new Map([['ssh', '-oBatchMode=yes'], ['plink', '-batch']]);\n\n// Suppress any password prompts since we run these in the background\nconst env = (0, (_extends2 || _load_extends()).default)({\n  GIT_ASKPASS: '',\n  GIT_TERMINAL_PROMPT: 0\n}, process.env);\n\nconst sshCommand = env.GIT_SSH || 'ssh';\nconst sshExecutable = (_path || _load_path()).default.basename(sshCommand.toLowerCase(), '.exe');\nconst sshBatchArgs = BATCH_MODE_ARGS.get(sshExecutable);\n\nif (!env.GIT_SSH_COMMAND && sshBatchArgs) {\n  // We have to manually specify `GIT_SSH_VARIANT`,\n  // because it's not automatically set when using `GIT_SSH_COMMAND` instead of `GIT_SSH`\n  // See: https://github.com/yarnpkg/yarn/issues/4729\n  env.GIT_SSH_VARIANT = sshExecutable;\n  env.GIT_SSH_COMMAND = `\"${sshCommand}\" ${sshBatchArgs}`;\n}\n\nconst spawn = exports.spawn = (args, opts = {}) => {\n  return (_child || _load_child()).spawn('git', args, (0, (_extends2 || _load_extends()).default)({}, opts, { env }));\n};\n\n/***/ }),\n/* 368 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.callThroughHook = callThroughHook;\n\n\nconst YARN_HOOKS_KEY = 'experimentalYarnHooks';\n\nfunction callThroughHook(type, fn, context) {\n  if (typeof global === 'undefined') {\n    return fn();\n  }\n\n  if (typeof global[YARN_HOOKS_KEY] !== 'object' || !global[YARN_HOOKS_KEY]) {\n    return fn();\n  }\n\n  const hook = global[YARN_HOOKS_KEY][type];\n\n  if (!hook) {\n    return fn();\n  }\n\n  return hook(fn, context);\n}\n\n/***/ }),\n/* 369 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nconst lockPromises = new Map();\n\n/**\n * Acquires a mutex lock over the given key. If the lock can't be acquired, it waits until it's available.\n * @param key Key to get the lock for.\n * @return {Promise.<Function>} A Promise that resolves when the lock is acquired, with the function that\n * must be called to release the lock.\n */\n\nexports.default = key => {\n  let unlockNext;\n  const willLock = new Promise(resolve => unlockNext = resolve);\n  const lockPromise = lockPromises.get(key) || Promise.resolve();\n  const willUnlock = lockPromise.then(() => unlockNext);\n  lockPromises.set(key, lockPromise.then(() => willLock));\n  return willUnlock;\n};\n\n/***/ }),\n/* 370 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = parsePackagePath;\nexports.isValidPackagePath = isValidPackagePath;\n\n\n/**\n * Parse input strings like `package-1/package-2` to an array of packages\n */\nfunction parsePackagePath(input) {\n  return input.match(/(@[^\\/]+\\/)?([^/]+)/g) || [];\n}\n\nconst WRONG_PATTERNS = /\\/$|\\/{2,}|\\*+$/;\n\nfunction isValidPackagePath(input) {\n  return !WRONG_PATTERNS.test(input);\n}\n\n/***/ }),\n/* 371 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getPosixPath = getPosixPath;\nexports.resolveWithHome = resolveWithHome;\n\nvar _path;\n\nfunction _load_path() {\n  return _path = __webpack_require__(0);\n}\n\nconst userHome = __webpack_require__(67).default;\n\nfunction getPosixPath(path) {\n  return path.replace(/\\\\/g, '/');\n}\n\nfunction resolveWithHome(path) {\n  const homePattern = process.platform === 'win32' ? /^~(\\/|\\\\)/ : /^~\\//;\n  if (homePattern.test(path)) {\n    return (0, (_path || _load_path()).resolve)(userHome, path.substr(2));\n  }\n\n  return (0, (_path || _load_path()).resolve)(path);\n}\n\n/***/ }),\n/* 372 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireDefault(__webpack_require__(4));\n}\n\nvar _http;\n\nfunction _load_http() {\n  return _http = _interopRequireDefault(__webpack_require__(87));\n}\n\nvar _url;\n\nfunction _load_url() {\n  return _url = _interopRequireDefault(__webpack_require__(24));\n}\n\nvar _dnscache;\n\nfunction _load_dnscache() {\n  return _dnscache = _interopRequireDefault(__webpack_require__(605));\n}\n\nvar _invariant;\n\nfunction _load_invariant() {\n  return _invariant = _interopRequireDefault(__webpack_require__(9));\n}\n\nvar _requestCaptureHar;\n\nfunction _load_requestCaptureHar() {\n  return _requestCaptureHar = _interopRequireDefault(__webpack_require__(799));\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _blockingQueue;\n\nfunction _load_blockingQueue() {\n  return _blockingQueue = _interopRequireDefault(__webpack_require__(110));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _network;\n\nfunction _load_network() {\n  return _network = _interopRequireWildcard(__webpack_require__(337));\n}\n\nvar _map;\n\nfunction _load_map() {\n  return _map = _interopRequireDefault(__webpack_require__(30));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Initialize DNS cache so we don't look up the same\n// domains like registry.yarnpkg.com over and over again\n// for each request.\n(0, (_dnscache || _load_dnscache()).default)({\n  enable: true,\n  ttl: 300,\n  cachesize: 10\n});\n\nconst successHosts = (0, (_map || _load_map()).default)();\nconst controlOffline = (_network || _load_network()).isOffline();\n\nclass RequestManager {\n  constructor(reporter) {\n    this.offlineNoRequests = false;\n    this._requestCaptureHar = null;\n    this._requestModule = null;\n    this.offlineQueue = [];\n    this.captureHar = false;\n    this.httpsProxy = '';\n    this.ca = null;\n    this.httpProxy = '';\n    this.strictSSL = true;\n    this.userAgent = '';\n    this.reporter = reporter;\n    this.running = 0;\n    this.queue = [];\n    this.cache = {};\n    this.max = (_constants || _load_constants()).NETWORK_CONCURRENCY;\n    this.maxRetryAttempts = 5;\n  }\n\n  setOptions(opts) {\n    if (opts.userAgent != null) {\n      this.userAgent = opts.userAgent;\n    }\n\n    if (opts.offline != null) {\n      this.offlineNoRequests = opts.offline;\n    }\n\n    if (opts.captureHar != null) {\n      this.captureHar = opts.captureHar;\n    }\n\n    if (opts.httpProxy != null) {\n      this.httpProxy = opts.httpProxy || '';\n    }\n\n    if (opts.httpsProxy === '') {\n      this.httpsProxy = opts.httpProxy || '';\n    } else if (opts.httpsProxy === false) {\n      this.httpsProxy = false;\n    } else {\n      this.httpsProxy = opts.httpsProxy || '';\n    }\n\n    if (opts.strictSSL !== null && typeof opts.strictSSL !== 'undefined') {\n      this.strictSSL = opts.strictSSL;\n    }\n\n    if (opts.ca != null && opts.ca.length > 0) {\n      this.ca = opts.ca;\n    }\n\n    if (opts.networkConcurrency != null) {\n      this.max = opts.networkConcurrency;\n    }\n\n    if (opts.networkTimeout != null) {\n      this.timeout = opts.networkTimeout;\n    }\n\n    if (opts.maxRetryAttempts != null) {\n      this.maxRetryAttempts = opts.maxRetryAttempts;\n    }\n\n    if (opts.cafile != null && opts.cafile != '') {\n      // The CA bundle file can contain one or more certificates with comments/text between each PEM block.\n      // tls.connect wants an array of certificates without any comments/text, so we need to split the string\n      // and strip out any text in between the certificates\n      try {\n        const bundle = (_fs || _load_fs()).default.readFileSync(opts.cafile).toString();\n        const hasPemPrefix = block => block.startsWith('-----BEGIN ');\n        // opts.cafile overrides opts.ca, this matches with npm behavior\n        this.ca = bundle.split(/(-----BEGIN .*\\r?\\n[^-]+\\r?\\n--.*)/).filter(hasPemPrefix);\n      } catch (err) {\n        this.reporter.error(`Could not open cafile: ${err.message}`);\n      }\n    }\n\n    if (opts.cert != null) {\n      this.cert = opts.cert;\n    }\n\n    if (opts.key != null) {\n      this.key = opts.key;\n    }\n  }\n\n  /**\n   * Lazy load `request` since it is exceptionally expensive to load and is\n   * often not needed at all.\n   */\n\n  _getRequestModule() {\n    if (!this._requestModule) {\n      const request = __webpack_require__(800);\n      if (this.captureHar) {\n        this._requestCaptureHar = new (_requestCaptureHar || _load_requestCaptureHar()).default(request);\n        this._requestModule = this._requestCaptureHar.request.bind(this._requestCaptureHar);\n      } else {\n        this._requestModule = request;\n      }\n    }\n    return this._requestModule;\n  }\n\n  /**\n   * Queue up a request.\n   */\n\n  request(params) {\n    if (this.offlineNoRequests) {\n      return Promise.reject(new (_errors || _load_errors()).MessageError(this.reporter.lang('cantRequestOffline', params.url)));\n    }\n\n    const cached = this.cache[params.url];\n    if (cached) {\n      return cached;\n    }\n\n    params.method = params.method || 'GET';\n    params.forever = true;\n    params.retryAttempts = 0;\n    params.strictSSL = this.strictSSL;\n    params.headers = Object.assign({\n      'User-Agent': this.userAgent\n    }, params.headers);\n\n    const promise = new Promise((resolve, reject) => {\n      this.queue.push({ params, reject, resolve });\n      this.shiftQueue();\n    });\n\n    // we can't cache a request with a processor\n    if (!params.process) {\n      this.cache[params.url] = promise;\n    }\n\n    return promise;\n  }\n\n  /**\n   * Clear the request cache. This is important as we cache all HTTP requests so you'll\n   * want to do this as soon as you can.\n   */\n\n  clearCache() {\n    this.cache = {};\n    if (this._requestCaptureHar != null) {\n      this._requestCaptureHar.clear();\n    }\n  }\n\n  /**\n   * Check if an error is possibly due to lost or poor network connectivity.\n   */\n\n  isPossibleOfflineError(err) {\n    const code = err.code,\n          hostname = err.hostname;\n\n    if (!code) {\n      return false;\n    }\n\n    // network was previously online but now we're offline\n    const possibleOfflineChange = !controlOffline && !(_network || _load_network()).isOffline();\n    if (code === 'ENOTFOUND' && possibleOfflineChange) {\n      // can't resolve a domain\n      return true;\n    }\n\n    // used to be able to resolve this domain! something is wrong\n    if (code === 'ENOTFOUND' && hostname && successHosts[hostname]) {\n      // can't resolve this domain but we've successfully resolved it before\n      return true;\n    }\n\n    // network was previously offline and we can't resolve the domain\n    if (code === 'ENOTFOUND' && controlOffline) {\n      return true;\n    }\n\n    // connection was reset or dropped\n    if (code === 'ECONNRESET') {\n      return true;\n    }\n\n    // TCP timeout\n    if (code === 'ESOCKETTIMEDOUT' || code === 'ETIMEDOUT') {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Queue up request arguments to be retried. Start a network connectivity timer if there\n   * isn't already one.\n   */\n\n  queueForRetry(opts) {\n    if (opts.retryReason) {\n      let containsReason = false;\n\n      for (var _iterator = this.offlineQueue, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref = _i.value;\n        }\n\n        const queuedOpts = _ref;\n\n        if (queuedOpts.retryReason === opts.retryReason) {\n          containsReason = true;\n          break;\n        }\n      }\n\n      if (!containsReason) {\n        this.reporter.info(opts.retryReason);\n      }\n    }\n\n    if (!this.offlineQueue.length) {\n      this.initOfflineRetry();\n    }\n\n    this.offlineQueue.push(opts);\n  }\n\n  /**\n   * Begin timers to retry failed requests when we possibly establish network connectivity\n   * again.\n   */\n\n  initOfflineRetry() {\n    setTimeout(() => {\n      const queue = this.offlineQueue;\n      this.offlineQueue = [];\n      for (var _iterator2 = queue, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref2;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref2 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref2 = _i2.value;\n        }\n\n        const opts = _ref2;\n\n        this.execute(opts);\n      }\n    }, 3000);\n  }\n\n  /**\n   * Execute a request.\n   */\n\n  execute(opts) {\n    const params = opts.params;\n    const reporter = this.reporter;\n\n\n    const buildNext = fn => data => {\n      fn(data);\n      this.running--;\n      this.shiftQueue();\n    };\n\n    const resolve = buildNext(opts.resolve);\n\n    const rejectNext = buildNext(opts.reject);\n    const reject = function reject(err) {\n      err.message = `${params.url}: ${err.message}`;\n      rejectNext(err);\n    };\n\n    const rejectWithoutUrl = function rejectWithoutUrl(err) {\n      err.message = err.message;\n      rejectNext(err);\n    };\n\n    const queueForRetry = reason => {\n      const attempts = params.retryAttempts || 0;\n      if (attempts >= this.maxRetryAttempts - 1) {\n        return false;\n      }\n      if (opts.params.method && opts.params.method.toUpperCase() !== 'GET') {\n        return false;\n      }\n      params.retryAttempts = attempts + 1;\n      if (typeof params.cleanup === 'function') {\n        params.cleanup();\n      }\n      opts.retryReason = reason;\n      this.queueForRetry(opts);\n      return true;\n    };\n\n    let calledOnError = false;\n    const onError = err => {\n      if (calledOnError) {\n        return;\n      }\n      calledOnError = true;\n\n      if (this.isPossibleOfflineError(err)) {\n        if (!queueForRetry(this.reporter.lang('offlineRetrying'))) {\n          reject(err);\n        }\n      } else {\n        reject(err);\n      }\n    };\n\n    if (!params.process) {\n      const parts = (_url || _load_url()).default.parse(params.url);\n\n      params.callback = (err, res, body) => {\n        if (err) {\n          onError(err);\n          return;\n        }\n\n        successHosts[parts.hostname] = true;\n\n        this.reporter.verbose(this.reporter.lang('verboseRequestFinish', params.url, res.statusCode));\n\n        if (res.statusCode === 408 || res.statusCode >= 500) {\n          const description = `${res.statusCode} ${(_http || _load_http()).default.STATUS_CODES[res.statusCode]}`;\n          if (!queueForRetry(this.reporter.lang('internalServerErrorRetrying', description))) {\n            throw new (_errors || _load_errors()).ResponseError(this.reporter.lang('requestFailed', description), res.statusCode);\n          } else {\n            return;\n          }\n        }\n\n        if (res.statusCode === 401 && res.caseless && res.caseless.get('server') === 'GitHub.com') {\n          const message = `${res.body.message}. If using GITHUB_TOKEN in your env, check that it is valid.`;\n          rejectWithoutUrl(new Error(this.reporter.lang('unauthorizedResponse', res.caseless.get('server'), message)));\n        }\n\n        if (res.statusCode === 401 && res.headers['www-authenticate']) {\n          const authMethods = res.headers['www-authenticate'].split(/,\\s*/).map(s => s.toLowerCase());\n          if (authMethods.indexOf('otp') !== -1) {\n            reject(new (_errors || _load_errors()).OneTimePasswordError(res.headers['npm-notice']));\n            return;\n          }\n        }\n\n        if (body && typeof body.error === 'string') {\n          reject(new Error(body.error));\n          return;\n        }\n\n        if ([400, 401, 404].concat(params.rejectStatusCode || []).indexOf(res.statusCode) !== -1) {\n          // So this is actually a rejection ... the hosted git resolver uses this to know whether http is supported\n          resolve(false);\n        } else if (res.statusCode >= 400) {\n          const errMsg = body && body.message || reporter.lang('requestError', params.url, res.statusCode);\n          reject(new Error(errMsg));\n        } else {\n          resolve(body);\n        }\n      };\n    }\n\n    if (params.buffer) {\n      params.encoding = null;\n    }\n\n    let proxy = this.httpProxy;\n    if (params.url.startsWith('https:')) {\n      proxy = this.httpsProxy;\n    }\n\n    if (proxy) {\n      // if no proxy is set, do not pass a proxy down to request.\n      // the request library will internally check the HTTP_PROXY and HTTPS_PROXY env vars.\n      params.proxy = String(proxy);\n    } else if (proxy === false) {\n      // passing empty string prevents the underlying library from falling back to the env vars.\n      // an explicit false in the yarn config should override the env var. See #4546.\n      params.proxy = '';\n    }\n\n    if (this.ca != null) {\n      params.ca = this.ca;\n    }\n\n    if (this.cert != null) {\n      params.cert = this.cert;\n    }\n\n    if (this.key != null) {\n      params.key = this.key;\n    }\n\n    if (this.timeout != null) {\n      params.timeout = this.timeout;\n    }\n\n    const request = this._getRequestModule();\n    const req = request(params);\n    this.reporter.verbose(this.reporter.lang('verboseRequestStart', params.method, params.url));\n\n    req.on('error', onError);\n\n    const queue = params.queue;\n    if (queue) {\n      req.on('data', queue.stillActive.bind(queue));\n    }\n\n    const process = params.process;\n    if (process) {\n      req.on('response', res => {\n        if (res.statusCode >= 200 && res.statusCode < 300) {\n          return;\n        }\n\n        const description = `${res.statusCode} ${(_http || _load_http()).default.STATUS_CODES[res.statusCode]}`;\n        reject(new (_errors || _load_errors()).ResponseError(this.reporter.lang('requestFailed', description), res.statusCode));\n\n        req.abort();\n      });\n      process(req, resolve, reject);\n    }\n  }\n\n  /**\n   * Remove an item from the queue. Create it's request options and execute it.\n   */\n\n  shiftQueue() {\n    if (this.running >= this.max || !this.queue.length) {\n      return;\n    }\n\n    const opts = this.queue.shift();\n\n    this.running++;\n    this.execute(opts);\n  }\n\n  saveHar(filename) {\n    if (!this.captureHar) {\n      throw new Error(this.reporter.lang('requestManagerNotSetupHAR'));\n    }\n    // No request may have occurred at all.\n    this._getRequestModule();\n    (0, (_invariant || _load_invariant()).default)(this._requestCaptureHar != null, 'request-capture-har not setup');\n    this._requestCaptureHar.saveHar(filename);\n  }\n}\nexports.default = RequestManager;\n\n/***/ }),\n/* 373 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar crypto_hash_sha512 = __webpack_require__(76).lowlevel.crypto_hash;\n\n/*\n * This file is a 1:1 port from the OpenBSD blowfish.c and bcrypt_pbkdf.c. As a\n * result, it retains the original copyright and license. The two files are\n * under slightly different (but compatible) licenses, and are here combined in\n * one file.\n *\n * Credit for the actual porting work goes to:\n *  Devi Mandiri <me@devi.web.id>\n */\n\n/*\n * The Blowfish portions are under the following license:\n *\n * Blowfish block cipher for OpenBSD\n * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>\n * All rights reserved.\n *\n * Implementation advice by David Mazieres <dm@lcs.mit.edu>.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * The bcrypt_pbkdf portions are under the following license:\n *\n * Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n/*\n * Performance improvements (Javascript-specific):\n *\n * Copyright 2016, Joyent Inc\n * Author: Alex Wilson <alex.wilson@joyent.com>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n// Ported from OpenBSD bcrypt_pbkdf.c v1.9\n\nvar BLF_J = 0;\n\nvar Blowfish = function() {\n  this.S = [\n    new Uint32Array([\n      0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,\n      0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,\n      0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,\n      0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,\n      0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,\n      0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,\n      0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,\n      0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,\n      0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,\n      0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,\n      0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,\n      0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,\n      0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,\n      0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,\n      0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,\n      0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,\n      0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,\n      0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,\n      0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,\n      0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,\n      0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,\n      0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,\n      0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,\n      0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,\n      0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,\n      0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,\n      0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,\n      0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,\n      0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,\n      0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,\n      0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,\n      0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,\n      0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,\n      0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,\n      0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,\n      0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,\n      0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,\n      0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,\n      0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,\n      0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,\n      0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,\n      0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,\n      0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,\n      0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,\n      0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,\n      0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,\n      0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,\n      0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,\n      0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,\n      0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,\n      0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,\n      0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,\n      0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,\n      0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,\n      0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,\n      0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,\n      0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,\n      0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,\n      0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,\n      0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,\n      0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,\n      0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,\n      0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,\n      0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a]),\n    new Uint32Array([\n      0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,\n      0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,\n      0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,\n      0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,\n      0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,\n      0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,\n      0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,\n      0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,\n      0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,\n      0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,\n      0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,\n      0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,\n      0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,\n      0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,\n      0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,\n      0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,\n      0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,\n      0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,\n      0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,\n      0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,\n      0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,\n      0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,\n      0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,\n      0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,\n      0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,\n      0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,\n      0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,\n      0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,\n      0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,\n      0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,\n      0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,\n      0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,\n      0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,\n      0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,\n      0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,\n      0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,\n      0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,\n      0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,\n      0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,\n      0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,\n      0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,\n      0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,\n      0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,\n      0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,\n      0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,\n      0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,\n      0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,\n      0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,\n      0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,\n      0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,\n      0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,\n      0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,\n      0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,\n      0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,\n      0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,\n      0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,\n      0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,\n      0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,\n      0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,\n      0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,\n      0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,\n      0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,\n      0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,\n      0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7]),\n    new Uint32Array([\n      0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,\n      0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,\n      0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,\n      0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,\n      0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,\n      0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,\n      0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,\n      0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,\n      0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,\n      0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,\n      0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,\n      0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,\n      0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,\n      0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,\n      0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,\n      0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,\n      0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,\n      0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,\n      0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,\n      0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,\n      0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,\n      0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,\n      0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,\n      0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,\n      0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,\n      0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,\n      0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,\n      0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,\n      0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,\n      0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,\n      0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,\n      0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,\n      0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,\n      0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,\n      0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,\n      0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,\n      0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,\n      0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,\n      0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,\n      0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,\n      0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,\n      0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,\n      0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,\n      0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,\n      0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,\n      0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,\n      0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,\n      0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,\n      0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,\n      0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,\n      0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,\n      0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,\n      0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,\n      0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,\n      0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,\n      0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,\n      0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,\n      0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,\n      0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,\n      0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,\n      0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,\n      0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,\n      0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,\n      0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0]),\n    new Uint32Array([\n      0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,\n      0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,\n      0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,\n      0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,\n      0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,\n      0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,\n      0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,\n      0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,\n      0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,\n      0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,\n      0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,\n      0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,\n      0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,\n      0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,\n      0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,\n      0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,\n      0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,\n      0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,\n      0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,\n      0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,\n      0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,\n      0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,\n      0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,\n      0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,\n      0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,\n      0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,\n      0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,\n      0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,\n      0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,\n      0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,\n      0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,\n      0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,\n      0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,\n      0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,\n      0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,\n      0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,\n      0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,\n      0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,\n      0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,\n      0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,\n      0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,\n      0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,\n      0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,\n      0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,\n      0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,\n      0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,\n      0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,\n      0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,\n      0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,\n      0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,\n      0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,\n      0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,\n      0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,\n      0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,\n      0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,\n      0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,\n      0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,\n      0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,\n      0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,\n      0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,\n      0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,\n      0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,\n      0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,\n      0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6])\n    ];\n  this.P = new Uint32Array([\n    0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,\n    0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,\n    0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,\n    0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,\n    0x9216d5d9, 0x8979fb1b]);\n};\n\nfunction F(S, x8, i) {\n  return (((S[0][x8[i+3]] +\n            S[1][x8[i+2]]) ^\n            S[2][x8[i+1]]) +\n            S[3][x8[i]]);\n};\n\nBlowfish.prototype.encipher = function(x, x8) {\n  if (x8 === undefined) {\n    x8 = new Uint8Array(x.buffer);\n    if (x.byteOffset !== 0)\n      x8 = x8.subarray(x.byteOffset);\n  }\n  x[0] ^= this.P[0];\n  for (var i = 1; i < 16; i += 2) {\n    x[1] ^= F(this.S, x8, 0) ^ this.P[i];\n    x[0] ^= F(this.S, x8, 4) ^ this.P[i+1];\n  }\n  var t = x[0];\n  x[0] = x[1] ^ this.P[17];\n  x[1] = t;\n};\n\nBlowfish.prototype.decipher = function(x) {\n  var x8 = new Uint8Array(x.buffer);\n  if (x.byteOffset !== 0)\n    x8 = x8.subarray(x.byteOffset);\n  x[0] ^= this.P[17];\n  for (var i = 16; i > 0; i -= 2) {\n    x[1] ^= F(this.S, x8, 0) ^ this.P[i];\n    x[0] ^= F(this.S, x8, 4) ^ this.P[i-1];\n  }\n  var t = x[0];\n  x[0] = x[1] ^ this.P[0];\n  x[1] = t;\n};\n\nfunction stream2word(data, databytes){\n  var i, temp = 0;\n  for (i = 0; i < 4; i++, BLF_J++) {\n    if (BLF_J >= databytes) BLF_J = 0;\n    temp = (temp << 8) | data[BLF_J];\n  }\n  return temp;\n};\n\nBlowfish.prototype.expand0state = function(key, keybytes) {\n  var d = new Uint32Array(2), i, k;\n  var d8 = new Uint8Array(d.buffer);\n\n  for (i = 0, BLF_J = 0; i < 18; i++) {\n    this.P[i] ^= stream2word(key, keybytes);\n  }\n  BLF_J = 0;\n\n  for (i = 0; i < 18; i += 2) {\n    this.encipher(d, d8);\n    this.P[i]   = d[0];\n    this.P[i+1] = d[1];\n  }\n\n  for (i = 0; i < 4; i++) {\n    for (k = 0; k < 256; k += 2) {\n      this.encipher(d, d8);\n      this.S[i][k]   = d[0];\n      this.S[i][k+1] = d[1];\n    }\n  }\n};\n\nBlowfish.prototype.expandstate = function(data, databytes, key, keybytes) {\n  var d = new Uint32Array(2), i, k;\n\n  for (i = 0, BLF_J = 0; i < 18; i++) {\n    this.P[i] ^= stream2word(key, keybytes);\n  }\n\n  for (i = 0, BLF_J = 0; i < 18; i += 2) {\n    d[0] ^= stream2word(data, databytes);\n    d[1] ^= stream2word(data, databytes);\n    this.encipher(d);\n    this.P[i]   = d[0];\n    this.P[i+1] = d[1];\n  }\n\n  for (i = 0; i < 4; i++) {\n    for (k = 0; k < 256; k += 2) {\n      d[0] ^= stream2word(data, databytes);\n      d[1] ^= stream2word(data, databytes);\n      this.encipher(d);\n      this.S[i][k]   = d[0];\n      this.S[i][k+1] = d[1];\n    }\n  }\n  BLF_J = 0;\n};\n\nBlowfish.prototype.enc = function(data, blocks) {\n  for (var i = 0; i < blocks; i++) {\n    this.encipher(data.subarray(i*2));\n  }\n};\n\nBlowfish.prototype.dec = function(data, blocks) {\n  for (var i = 0; i < blocks; i++) {\n    this.decipher(data.subarray(i*2));\n  }\n};\n\nvar BCRYPT_BLOCKS = 8,\n    BCRYPT_HASHSIZE = 32;\n\nfunction bcrypt_hash(sha2pass, sha2salt, out) {\n  var state = new Blowfish(),\n      cdata = new Uint32Array(BCRYPT_BLOCKS), i,\n      ciphertext = new Uint8Array([79,120,121,99,104,114,111,109,97,116,105,\n            99,66,108,111,119,102,105,115,104,83,119,97,116,68,121,110,97,109,\n            105,116,101]); //\"OxychromaticBlowfishSwatDynamite\"\n\n  state.expandstate(sha2salt, 64, sha2pass, 64);\n  for (i = 0; i < 64; i++) {\n    state.expand0state(sha2salt, 64);\n    state.expand0state(sha2pass, 64);\n  }\n\n  for (i = 0; i < BCRYPT_BLOCKS; i++)\n    cdata[i] = stream2word(ciphertext, ciphertext.byteLength);\n  for (i = 0; i < 64; i++)\n    state.enc(cdata, cdata.byteLength / 8);\n\n  for (i = 0; i < BCRYPT_BLOCKS; i++) {\n    out[4*i+3] = cdata[i] >>> 24;\n    out[4*i+2] = cdata[i] >>> 16;\n    out[4*i+1] = cdata[i] >>> 8;\n    out[4*i+0] = cdata[i];\n  }\n};\n\nfunction bcrypt_pbkdf(pass, passlen, salt, saltlen, key, keylen, rounds) {\n  var sha2pass = new Uint8Array(64),\n      sha2salt = new Uint8Array(64),\n      out = new Uint8Array(BCRYPT_HASHSIZE),\n      tmpout = new Uint8Array(BCRYPT_HASHSIZE),\n      countsalt = new Uint8Array(saltlen+4),\n      i, j, amt, stride, dest, count,\n      origkeylen = keylen;\n\n  if (rounds < 1)\n    return -1;\n  if (passlen === 0 || saltlen === 0 || keylen === 0 ||\n      keylen > (out.byteLength * out.byteLength) || saltlen > (1<<20))\n    return -1;\n\n  stride = Math.floor((keylen + out.byteLength - 1) / out.byteLength);\n  amt = Math.floor((keylen + stride - 1) / stride);\n\n  for (i = 0; i < saltlen; i++)\n    countsalt[i] = salt[i];\n\n  crypto_hash_sha512(sha2pass, pass, passlen);\n\n  for (count = 1; keylen > 0; count++) {\n    countsalt[saltlen+0] = count >>> 24;\n    countsalt[saltlen+1] = count >>> 16;\n    countsalt[saltlen+2] = count >>>  8;\n    countsalt[saltlen+3] = count;\n\n    crypto_hash_sha512(sha2salt, countsalt, saltlen + 4);\n    bcrypt_hash(sha2pass, sha2salt, tmpout);\n    for (i = out.byteLength; i--;)\n      out[i] = tmpout[i];\n\n    for (i = 1; i < rounds; i++) {\n      crypto_hash_sha512(sha2salt, tmpout, tmpout.byteLength);\n      bcrypt_hash(sha2pass, sha2salt, tmpout);\n      for (j = 0; j < out.byteLength; j++)\n        out[j] ^= tmpout[j];\n    }\n\n    amt = Math.min(amt, keylen);\n    for (i = 0; i < amt; i++) {\n      dest = i * stride + (count - 1);\n      if (dest >= origkeylen)\n        break;\n      key[dest] = out[i];\n    }\n    keylen -= i;\n  }\n\n  return 0;\n};\n\nmodule.exports = {\n      BLOCKS: BCRYPT_BLOCKS,\n      HASHSIZE: BCRYPT_HASHSIZE,\n      hash: bcrypt_hash,\n      pbkdf: bcrypt_pbkdf\n};\n\n\n/***/ }),\n/* 374 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar bufferFill = __webpack_require__(562)\nvar allocUnsafe = __webpack_require__(561)\n\nmodule.exports = function alloc (size, fill, encoding) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  }\n\n  if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n\n  if (Buffer.alloc) {\n    return Buffer.alloc(size, fill, encoding)\n  }\n\n  var buffer = allocUnsafe(size)\n\n  if (size === 0) {\n    return buffer\n  }\n\n  if (fill === undefined) {\n    return bufferFill(buffer, 0)\n  }\n\n  if (typeof encoding !== 'string') {\n    encoding = undefined\n  }\n\n  return bufferFill(buffer, fill, encoding)\n}\n\n\n/***/ }),\n/* 375 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst restoreCursor = __webpack_require__(818);\n\nlet hidden = false;\n\nexports.show = stream => {\n\tconst s = stream || process.stderr;\n\n\tif (!s.isTTY) {\n\t\treturn;\n\t}\n\n\thidden = false;\n\ts.write('\\u001b[?25h');\n};\n\nexports.hide = stream => {\n\tconst s = stream || process.stderr;\n\n\tif (!s.isTTY) {\n\t\treturn;\n\t}\n\n\trestoreCursor();\n\thidden = true;\n\ts.write('\\u001b[?25l');\n};\n\nexports.toggle = (force, stream) => {\n\tif (force !== undefined) {\n\t\thidden = force;\n\t}\n\n\tif (hidden) {\n\t\texports.show(stream);\n\t} else {\n\t\texports.hide(stream);\n\t}\n};\n\n\n/***/ }),\n/* 376 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar objectAssign = __webpack_require__(303);\nvar stringWidth = __webpack_require__(945);\n\nfunction codeRegex(capture){\n  return capture ? /\\u001b\\[((?:\\d*;){0,5}\\d*)m/g : /\\u001b\\[(?:\\d*;){0,5}\\d*m/g\n}\n\nfunction strlen(str){\n  var code = codeRegex();\n  var stripped = (\"\" + str).replace(code,'');\n  var split = stripped.split(\"\\n\");\n  return split.reduce(function (memo, s) { return (stringWidth(s) > memo) ? stringWidth(s) : memo }, 0);\n}\n\nfunction repeat(str,times){\n  return Array(times + 1).join(str);\n}\n\nfunction pad(str, len, pad, dir) {\n  var length = strlen(str);\n  if (len + 1 >= length) {\n    var padlen = len - length;\n    switch (dir) {\n      case 'right':\n        str = repeat(pad, padlen) + str;\n        break;\n\n      case 'center':\n        var right = Math.ceil((padlen) / 2);\n        var left = padlen - right;\n        str = repeat(pad, left) + str + repeat(pad, right);\n        break;\n\n      default :\n        str = str + repeat(pad,padlen);\n        break;\n    }\n  }\n  return str;\n}\n\nvar codeCache = {};\n\nfunction addToCodeCache(name,on,off){\n  on = '\\u001b[' + on + 'm';\n  off = '\\u001b[' + off + 'm';\n  codeCache[on] = {set:name,to:true};\n  codeCache[off] = {set:name,to:false};\n  codeCache[name] = {on:on,off:off};\n}\n\n//https://github.com/Marak/colors.js/blob/master/lib/styles.js\naddToCodeCache('bold', 1, 22);\naddToCodeCache('italics', 3, 23);\naddToCodeCache('underline', 4, 24);\naddToCodeCache('inverse', 7, 27);\naddToCodeCache('strikethrough', 9, 29);\n\n\nfunction updateState(state, controlChars){\n  var controlCode = controlChars[1] ? parseInt(controlChars[1].split(';')[0]) : 0;\n  if ( (controlCode >= 30 && controlCode <= 39)\n     || (controlCode >= 90 && controlCode <= 97)\n  ) {\n    state.lastForegroundAdded = controlChars[0];\n    return;\n  }\n  if ( (controlCode >= 40 && controlCode <= 49)\n     || (controlCode >= 100 && controlCode <= 107)\n  ) {\n    state.lastBackgroundAdded = controlChars[0];\n    return;\n  }\n  if (controlCode === 0) {\n    for (var i in state) {\n      /* istanbul ignore else */\n      if (state.hasOwnProperty(i)) {\n        delete state[i];\n      }\n    }\n    return;\n  }\n  var info = codeCache[controlChars[0]];\n  if (info) {\n    state[info.set] = info.to;\n  }\n}\n\nfunction readState(line){\n  var code = codeRegex(true);\n  var controlChars = code.exec(line);\n  var state = {};\n  while(controlChars !== null){\n    updateState(state, controlChars);\n    controlChars = code.exec(line);\n  }\n  return state;\n}\n\nfunction unwindState(state,ret){\n  var lastBackgroundAdded = state.lastBackgroundAdded;\n  var lastForegroundAdded = state.lastForegroundAdded;\n\n  delete state.lastBackgroundAdded;\n  delete state.lastForegroundAdded;\n\n  Object.keys(state).forEach(function(key){\n    if(state[key]){\n      ret += codeCache[key].off;\n    }\n  });\n\n  if(lastBackgroundAdded && (lastBackgroundAdded != '\\u001b[49m')){\n    ret += '\\u001b[49m';\n  }\n  if(lastForegroundAdded && (lastForegroundAdded != '\\u001b[39m')){\n    ret += '\\u001b[39m';\n  }\n\n  return ret;\n}\n\nfunction rewindState(state,ret){\n  var lastBackgroundAdded = state.lastBackgroundAdded;\n  var lastForegroundAdded = state.lastForegroundAdded;\n\n  delete state.lastBackgroundAdded;\n  delete state.lastForegroundAdded;\n\n  Object.keys(state).forEach(function(key){\n    if(state[key]){\n      ret = codeCache[key].on + ret;\n    }\n  });\n\n  if(lastBackgroundAdded && (lastBackgroundAdded != '\\u001b[49m')){\n    ret = lastBackgroundAdded + ret;\n  }\n  if(lastForegroundAdded && (lastForegroundAdded != '\\u001b[39m')){\n    ret = lastForegroundAdded + ret;\n  }\n\n  return ret;\n}\n\nfunction truncateWidth(str, desiredLength){\n  if (str.length === strlen(str)) {\n    return str.substr(0, desiredLength);\n  }\n\n  while (strlen(str) > desiredLength){\n    str = str.slice(0, -1);\n  }\n\n  return str;\n}\n\nfunction truncateWidthWithAnsi(str, desiredLength){\n  var code = codeRegex(true);\n  var split = str.split(codeRegex());\n  var splitIndex = 0;\n  var retLen = 0;\n  var ret = '';\n  var myArray;\n  var state = {};\n\n  while(retLen < desiredLength){\n    myArray = code.exec(str);\n    var toAdd = split[splitIndex];\n    splitIndex++;\n    if (retLen + strlen(toAdd) > desiredLength){\n      toAdd = truncateWidth(toAdd, desiredLength - retLen);\n    }\n    ret += toAdd;\n    retLen += strlen(toAdd);\n\n    if(retLen < desiredLength){\n      if (!myArray) { break; }  // full-width chars may cause a whitespace which cannot be filled\n      ret += myArray[0];\n      updateState(state,myArray);\n    }\n  }\n\n  return unwindState(state,ret);\n}\n\nfunction truncate(str, desiredLength, truncateChar){\n  truncateChar = truncateChar || '…';\n  var lengthOfStr = strlen(str);\n  if(lengthOfStr <= desiredLength){\n    return str;\n  }\n  desiredLength -= strlen(truncateChar);\n\n  var ret = truncateWidthWithAnsi(str, desiredLength);\n\n  return ret + truncateChar;\n}\n\n\nfunction defaultOptions(){\n  return{\n    chars: {\n      'top': '─'\n      , 'top-mid': '┬'\n      , 'top-left': '┌'\n      , 'top-right': '┐'\n      , 'bottom': '─'\n      , 'bottom-mid': '┴'\n      , 'bottom-left': '└'\n      , 'bottom-right': '┘'\n      , 'left': '│'\n      , 'left-mid': '├'\n      , 'mid': '─'\n      , 'mid-mid': '┼'\n      , 'right': '│'\n      , 'right-mid': '┤'\n      , 'middle': '│'\n    }\n    , truncate: '…'\n    , colWidths: []\n    , rowHeights: []\n    , colAligns: []\n    , rowAligns: []\n    , style: {\n      'padding-left': 1\n      , 'padding-right': 1\n      , head: ['red']\n      , border: ['grey']\n      , compact : false\n    }\n    , head: []\n  };\n}\n\nfunction mergeOptions(options,defaults){\n  options = options || {};\n  defaults = defaults || defaultOptions();\n  var ret = objectAssign({}, defaults, options);\n  ret.chars = objectAssign({}, defaults.chars, options.chars);\n  ret.style = objectAssign({}, defaults.style, options.style);\n  return ret;\n}\n\nfunction wordWrap(maxLength,input){\n  var lines = [];\n  var split = input.split(/(\\s+)/g);\n  var line = [];\n  var lineLength = 0;\n  var whitespace;\n  for (var i = 0; i < split.length; i += 2) {\n    var word = split[i];\n    var newLength = lineLength + strlen(word);\n    if (lineLength > 0 && whitespace) {\n      newLength += whitespace.length;\n    }\n    if(newLength > maxLength){\n      if(lineLength !== 0){\n        lines.push(line.join(''));\n      }\n      line = [word];\n      lineLength = strlen(word);\n    } else {\n      line.push(whitespace || '', word);\n      lineLength = newLength;\n    }\n    whitespace = split[i+1];\n  }\n  if(lineLength){\n    lines.push(line.join(''));\n  }\n  return lines;\n}\n\nfunction multiLineWordWrap(maxLength, input){\n  var output = [];\n  input = input.split('\\n');\n  for(var i = 0; i < input.length; i++){\n    output.push.apply(output,wordWrap(maxLength,input[i]));\n  }\n  return output;\n}\n\nfunction colorizeLines(input){\n  var state = {};\n  var output = [];\n  for(var i = 0; i < input.length; i++){\n    var line = rewindState(state,input[i]) ;\n    state = readState(line);\n    var temp = objectAssign({},state);\n    output.push(unwindState(temp,line));\n  }\n  return output;\n}\n\nmodule.exports = {\n  strlen:strlen,\n  repeat:repeat,\n  pad:pad,\n  truncate:truncate,\n  mergeOptions:mergeOptions,\n  wordWrap:multiLineWordWrap,\n  colorizeLines:colorizeLines\n};\n\n\n/***/ }),\n/* 377 */\n/***/ (function(module, exports) {\n\n\n/**\n * slice() reference.\n */\n\nvar slice = Array.prototype.slice;\n\n/**\n * Expose `co`.\n */\n\nmodule.exports = co['default'] = co.co = co;\n\n/**\n * Wrap the given generator `fn` into a\n * function that returns a promise.\n * This is a separate function so that\n * every `co()` call doesn't create a new,\n * unnecessary closure.\n *\n * @param {GeneratorFunction} fn\n * @return {Function}\n * @api public\n */\n\nco.wrap = function (fn) {\n  createPromise.__generatorFunction__ = fn;\n  return createPromise;\n  function createPromise() {\n    return co.call(this, fn.apply(this, arguments));\n  }\n};\n\n/**\n * Execute the generator function or a generator\n * and return a promise.\n *\n * @param {Function} fn\n * @return {Promise}\n * @api public\n */\n\nfunction co(gen) {\n  var ctx = this;\n  var args = slice.call(arguments, 1)\n\n  // we wrap everything in a promise to avoid promise chaining,\n  // which leads to memory leak errors.\n  // see https://github.com/tj/co/issues/180\n  return new Promise(function(resolve, reject) {\n    if (typeof gen === 'function') gen = gen.apply(ctx, args);\n    if (!gen || typeof gen.next !== 'function') return resolve(gen);\n\n    onFulfilled();\n\n    /**\n     * @param {Mixed} res\n     * @return {Promise}\n     * @api private\n     */\n\n    function onFulfilled(res) {\n      var ret;\n      try {\n        ret = gen.next(res);\n      } catch (e) {\n        return reject(e);\n      }\n      next(ret);\n    }\n\n    /**\n     * @param {Error} err\n     * @return {Promise}\n     * @api private\n     */\n\n    function onRejected(err) {\n      var ret;\n      try {\n        ret = gen.throw(err);\n      } catch (e) {\n        return reject(e);\n      }\n      next(ret);\n    }\n\n    /**\n     * Get the next value in the generator,\n     * return a promise.\n     *\n     * @param {Object} ret\n     * @return {Promise}\n     * @api private\n     */\n\n    function next(ret) {\n      if (ret.done) return resolve(ret.value);\n      var value = toPromise.call(ctx, ret.value);\n      if (value && isPromise(value)) return value.then(onFulfilled, onRejected);\n      return onRejected(new TypeError('You may only yield a function, promise, generator, array, or object, '\n        + 'but the following object was passed: \"' + String(ret.value) + '\"'));\n    }\n  });\n}\n\n/**\n * Convert a `yield`ed value into a promise.\n *\n * @param {Mixed} obj\n * @return {Promise}\n * @api private\n */\n\nfunction toPromise(obj) {\n  if (!obj) return obj;\n  if (isPromise(obj)) return obj;\n  if (isGeneratorFunction(obj) || isGenerator(obj)) return co.call(this, obj);\n  if ('function' == typeof obj) return thunkToPromise.call(this, obj);\n  if (Array.isArray(obj)) return arrayToPromise.call(this, obj);\n  if (isObject(obj)) return objectToPromise.call(this, obj);\n  return obj;\n}\n\n/**\n * Convert a thunk to a promise.\n *\n * @param {Function}\n * @return {Promise}\n * @api private\n */\n\nfunction thunkToPromise(fn) {\n  var ctx = this;\n  return new Promise(function (resolve, reject) {\n    fn.call(ctx, function (err, res) {\n      if (err) return reject(err);\n      if (arguments.length > 2) res = slice.call(arguments, 1);\n      resolve(res);\n    });\n  });\n}\n\n/**\n * Convert an array of \"yieldables\" to a promise.\n * Uses `Promise.all()` internally.\n *\n * @param {Array} obj\n * @return {Promise}\n * @api private\n */\n\nfunction arrayToPromise(obj) {\n  return Promise.all(obj.map(toPromise, this));\n}\n\n/**\n * Convert an object of \"yieldables\" to a promise.\n * Uses `Promise.all()` internally.\n *\n * @param {Object} obj\n * @return {Promise}\n * @api private\n */\n\nfunction objectToPromise(obj){\n  var results = new obj.constructor();\n  var keys = Object.keys(obj);\n  var promises = [];\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    var promise = toPromise.call(this, obj[key]);\n    if (promise && isPromise(promise)) defer(promise, key);\n    else results[key] = obj[key];\n  }\n  return Promise.all(promises).then(function () {\n    return results;\n  });\n\n  function defer(promise, key) {\n    // predefine the key in the result\n    results[key] = undefined;\n    promises.push(promise.then(function (res) {\n      results[key] = res;\n    }));\n  }\n}\n\n/**\n * Check if `obj` is a promise.\n *\n * @param {Object} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isPromise(obj) {\n  return 'function' == typeof obj.then;\n}\n\n/**\n * Check if `obj` is a generator.\n *\n * @param {Mixed} obj\n * @return {Boolean}\n * @api private\n */\n\nfunction isGenerator(obj) {\n  return 'function' == typeof obj.next && 'function' == typeof obj.throw;\n}\n\n/**\n * Check if `obj` is a generator function.\n *\n * @param {Mixed} obj\n * @return {Boolean}\n * @api private\n */\nfunction isGeneratorFunction(obj) {\n  var constructor = obj.constructor;\n  if (!constructor) return false;\n  if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true;\n  return isGenerator(constructor.prototype);\n}\n\n/**\n * Check for plain object.\n *\n * @param {Mixed} val\n * @return {Boolean}\n * @api private\n */\n\nfunction isObject(val) {\n  return Object == val.constructor;\n}\n\n\n/***/ }),\n/* 378 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* MIT license */\nvar cssKeywords = __webpack_require__(578);\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n//       values that give correct `typeof` results).\n//       do not use box values types (i.e. Number(), String(), etc.)\n\nvar reverseKeywords = {};\nfor (var key in cssKeywords) {\n\tif (cssKeywords.hasOwnProperty(key)) {\n\t\treverseKeywords[cssKeywords[key]] = key;\n\t}\n}\n\nvar convert = module.exports = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\n// hide .channels and .labels properties\nfor (var model in convert) {\n\tif (convert.hasOwnProperty(model)) {\n\t\tif (!('channels' in convert[model])) {\n\t\t\tthrow new Error('missing channels property: ' + model);\n\t\t}\n\n\t\tif (!('labels' in convert[model])) {\n\t\t\tthrow new Error('missing channel labels property: ' + model);\n\t\t}\n\n\t\tif (convert[model].labels.length !== convert[model].channels) {\n\t\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t\t}\n\n\t\tvar channels = convert[model].channels;\n\t\tvar labels = convert[model].labels;\n\t\tdelete convert[model].channels;\n\t\tdelete convert[model].labels;\n\t\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\t\tObject.defineProperty(convert[model], 'labels', {value: labels});\n\t}\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar l;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tvar rdif;\n\tvar gdif;\n\tvar bdif;\n\tvar h;\n\tvar s;\n\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar v = Math.max(r, g, b);\n\tvar diff = v - Math.min(r, g, b);\n\tvar diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = s = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar h = convert.rgb.hsl(rgb)[0];\n\tvar w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar c;\n\tvar m;\n\tvar y;\n\tvar k;\n\n\tk = Math.min(1 - r, 1 - g, 1 - b);\n\tc = (1 - r - k) / (1 - k) || 0;\n\tm = (1 - g - k) / (1 - k) || 0;\n\ty = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\n/**\n * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n * */\nfunction comparativeDistance(x, y) {\n\treturn (\n\t\tMath.pow(x[0] - y[0], 2) +\n\t\tMath.pow(x[1] - y[1], 2) +\n\t\tMath.pow(x[2] - y[2], 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tvar reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tvar currentClosestDistance = Infinity;\n\tvar currentClosestKeyword;\n\n\tfor (var keyword in cssKeywords) {\n\t\tif (cssKeywords.hasOwnProperty(keyword)) {\n\t\t\tvar value = cssKeywords[keyword];\n\n\t\t\t// Compute comparative distance\n\t\t\tvar distance = comparativeDistance(rgb, value);\n\n\t\t\t// Check if its less, if so set as closest\n\t\t\tif (distance < currentClosestDistance) {\n\t\t\t\tcurrentClosestDistance = distance;\n\t\t\t\tcurrentClosestKeyword = keyword;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn cssKeywords[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tvar y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tvar z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tvar xyz = convert.rgb.xyz(rgb);\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tvar h = hsl[0] / 360;\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar t1;\n\tvar t2;\n\tvar t3;\n\tvar rgb;\n\tvar val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tt1 = 2 * l - t2;\n\n\trgb = [0, 0, 0];\n\tfor (var i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tvar h = hsl[0];\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar smin = s;\n\tvar lmin = Math.max(l, 0.01);\n\tvar sv;\n\tvar v;\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tv = (l + s) / 2;\n\tsv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tvar h = hsv[0] / 60;\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar hi = Math.floor(h) % 6;\n\n\tvar f = h - Math.floor(h);\n\tvar p = 255 * v * (1 - s);\n\tvar q = 255 * v * (1 - (s * f));\n\tvar t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tvar h = hsv[0];\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar vmin = Math.max(v, 0.01);\n\tvar lmin;\n\tvar sl;\n\tvar l;\n\n\tl = (2 - s) * v;\n\tlmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tvar h = hwb[0] / 360;\n\tvar wh = hwb[1] / 100;\n\tvar bl = hwb[2] / 100;\n\tvar ratio = wh + bl;\n\tvar i;\n\tvar v;\n\tvar f;\n\tvar n;\n\n\t// wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\ti = Math.floor(6 * h);\n\tv = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tn = wh + f * (v - wh); // linear interpolation\n\n\tvar r;\n\tvar g;\n\tvar b;\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tvar c = cmyk[0] / 100;\n\tvar m = cmyk[1] / 100;\n\tvar y = cmyk[2] / 100;\n\tvar k = cmyk[3] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = 1 - Math.min(1, c * (1 - k) + k);\n\tg = 1 - Math.min(1, m * (1 - k) + k);\n\tb = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tvar x = xyz[0] / 100;\n\tvar y = xyz[1] / 100;\n\tvar z = xyz[2] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar x;\n\tvar y;\n\tvar z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tvar y2 = Math.pow(y, 3);\n\tvar x2 = Math.pow(x, 3);\n\tvar z2 = Math.pow(z, 3);\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar hr;\n\tvar h;\n\tvar c;\n\n\thr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tc = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tvar l = lch[0];\n\tvar c = lch[1];\n\tvar h = lch[2];\n\tvar a;\n\tvar b;\n\tvar hr;\n\n\thr = h / 360 * 2 * Math.PI;\n\ta = c * Math.cos(hr);\n\tb = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\tvar value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tvar ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\n\t// we use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tvar ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tvar color = args % 10;\n\n\t// handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tvar mult = (~~(args > 50) + 1) * 0.5;\n\tvar r = ((color & 1) * mult) * 255;\n\tvar g = (((color >> 1) & 1) * mult) * 255;\n\tvar b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// handle greyscale\n\tif (args >= 232) {\n\t\tvar c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tvar rem;\n\tvar r = Math.floor(args / 36) / 5 * 255;\n\tvar g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tvar b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tvar integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tvar match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tvar colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(function (char) {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tvar integer = parseInt(colorString, 16);\n\tvar r = (integer >> 16) & 0xFF;\n\tvar g = (integer >> 8) & 0xFF;\n\tvar b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar max = Math.max(Math.max(r, g), b);\n\tvar min = Math.min(Math.min(r, g), b);\n\tvar chroma = (max - min);\n\tvar grayscale;\n\tvar hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma + 4;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar c = 1;\n\tvar f = 0;\n\n\tif (l < 0.5) {\n\t\tc = 2.0 * s * l;\n\t} else {\n\t\tc = 2.0 * s * (1.0 - l);\n\t}\n\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\n\tvar c = s * v;\n\tvar f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tvar h = hcg[0] / 360;\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tvar pure = [0, 0, 0];\n\tvar hi = (h % 1) * 6;\n\tvar v = hi % 1;\n\tvar w = 1 - v;\n\tvar mg = 0;\n\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar v = c + g * (1.0 - c);\n\tvar f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar l = g * (1.0 - c) + 0.5 * c;\n\tvar s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\tvar v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tvar w = hwb[1] / 100;\n\tvar b = hwb[2] / 100;\n\tvar v = 1 - b;\n\tvar c = v - w;\n\tvar g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = convert.gray.hsv = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tvar val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tvar integer = (val << 16) + (val << 8) + val;\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tvar val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n\n\n/***/ }),\n/* 379 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar util = __webpack_require__(3);\nvar Stream = __webpack_require__(23).Stream;\nvar DelayedStream = __webpack_require__(602);\nvar defer = __webpack_require__(590);\n\nmodule.exports = CombinedStream;\nfunction CombinedStream() {\n  this.writable = false;\n  this.readable = true;\n  this.dataSize = 0;\n  this.maxDataSize = 2 * 1024 * 1024;\n  this.pauseStreams = true;\n\n  this._released = false;\n  this._streams = [];\n  this._currentStream = null;\n}\nutil.inherits(CombinedStream, Stream);\n\nCombinedStream.create = function(options) {\n  var combinedStream = new this();\n\n  options = options || {};\n  for (var option in options) {\n    combinedStream[option] = options[option];\n  }\n\n  return combinedStream;\n};\n\nCombinedStream.isStreamLike = function(stream) {\n  return (typeof stream !== 'function')\n    && (typeof stream !== 'string')\n    && (typeof stream !== 'boolean')\n    && (typeof stream !== 'number')\n    && (!Buffer.isBuffer(stream));\n};\n\nCombinedStream.prototype.append = function(stream) {\n  var isStreamLike = CombinedStream.isStreamLike(stream);\n\n  if (isStreamLike) {\n    if (!(stream instanceof DelayedStream)) {\n      var newStream = DelayedStream.create(stream, {\n        maxDataSize: Infinity,\n        pauseStream: this.pauseStreams,\n      });\n      stream.on('data', this._checkDataSize.bind(this));\n      stream = newStream;\n    }\n\n    this._handleErrors(stream);\n\n    if (this.pauseStreams) {\n      stream.pause();\n    }\n  }\n\n  this._streams.push(stream);\n  return this;\n};\n\nCombinedStream.prototype.pipe = function(dest, options) {\n  Stream.prototype.pipe.call(this, dest, options);\n  this.resume();\n  return dest;\n};\n\nCombinedStream.prototype._getNext = function() {\n  this._currentStream = null;\n  var stream = this._streams.shift();\n\n\n  if (typeof stream == 'undefined') {\n    this.end();\n    return;\n  }\n\n  if (typeof stream !== 'function') {\n    this._pipeNext(stream);\n    return;\n  }\n\n  var getStream = stream;\n  getStream(function(stream) {\n    var isStreamLike = CombinedStream.isStreamLike(stream);\n    if (isStreamLike) {\n      stream.on('data', this._checkDataSize.bind(this));\n      this._handleErrors(stream);\n    }\n\n    defer(this._pipeNext.bind(this, stream));\n  }.bind(this));\n};\n\nCombinedStream.prototype._pipeNext = function(stream) {\n  this._currentStream = stream;\n\n  var isStreamLike = CombinedStream.isStreamLike(stream);\n  if (isStreamLike) {\n    stream.on('end', this._getNext.bind(this));\n    stream.pipe(this, {end: false});\n    return;\n  }\n\n  var value = stream;\n  this.write(value);\n  this._getNext();\n};\n\nCombinedStream.prototype._handleErrors = function(stream) {\n  var self = this;\n  stream.on('error', function(err) {\n    self._emitError(err);\n  });\n};\n\nCombinedStream.prototype.write = function(data) {\n  this.emit('data', data);\n};\n\nCombinedStream.prototype.pause = function() {\n  if (!this.pauseStreams) {\n    return;\n  }\n\n  if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause();\n  this.emit('pause');\n};\n\nCombinedStream.prototype.resume = function() {\n  if (!this._released) {\n    this._released = true;\n    this.writable = true;\n    this._getNext();\n  }\n\n  if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume();\n  this.emit('resume');\n};\n\nCombinedStream.prototype.end = function() {\n  this._reset();\n  this.emit('end');\n};\n\nCombinedStream.prototype.destroy = function() {\n  this._reset();\n  this.emit('close');\n};\n\nCombinedStream.prototype._reset = function() {\n  this.writable = false;\n  this._streams = [];\n  this._currentStream = null;\n};\n\nCombinedStream.prototype._checkDataSize = function() {\n  this._updateDataSize();\n  if (this.dataSize <= this.maxDataSize) {\n    return;\n  }\n\n  var message =\n    'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.';\n  this._emitError(new Error(message));\n};\n\nCombinedStream.prototype._updateDataSize = function() {\n  this.dataSize = 0;\n\n  var self = this;\n  this._streams.forEach(function(stream) {\n    if (!stream.dataSize) {\n      return;\n    }\n\n    self.dataSize += stream.dataSize;\n  });\n\n  if (this._currentStream && this._currentStream.dataSize) {\n    this.dataSize += this._currentStream.dataSize;\n  }\n};\n\nCombinedStream.prototype._emitError = function(err) {\n  this._reset();\n  this.emit('error', err);\n};\n\n\n/***/ }),\n/* 380 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar stream = __webpack_require__(102)\nvar eos = __webpack_require__(174)\nvar inherits = __webpack_require__(61)\nvar shift = __webpack_require__(942)\n\nvar SIGNAL_FLUSH = (Buffer.from && Buffer.from !== Uint8Array.from)\n  ? Buffer.from([0])\n  : new Buffer([0])\n\nvar onuncork = function(self, fn) {\n  if (self._corked) self.once('uncork', fn)\n  else fn()\n}\n\nvar autoDestroy = function (self, err) {\n  if (self._autoDestroy) self.destroy(err)\n}\n\nvar destroyer = function(self, end) {\n  return function(err) {\n    if (err) autoDestroy(self, err.message === 'premature close' ? null : err)\n    else if (end && !self._ended) self.end()\n  }\n}\n\nvar end = function(ws, fn) {\n  if (!ws) return fn()\n  if (ws._writableState && ws._writableState.finished) return fn()\n  if (ws._writableState) return ws.end(fn)\n  ws.end()\n  fn()\n}\n\nvar toStreams2 = function(rs) {\n  return new (stream.Readable)({objectMode:true, highWaterMark:16}).wrap(rs)\n}\n\nvar Duplexify = function(writable, readable, opts) {\n  if (!(this instanceof Duplexify)) return new Duplexify(writable, readable, opts)\n  stream.Duplex.call(this, opts)\n\n  this._writable = null\n  this._readable = null\n  this._readable2 = null\n\n  this._autoDestroy = !opts || opts.autoDestroy !== false\n  this._forwardDestroy = !opts || opts.destroy !== false\n  this._forwardEnd = !opts || opts.end !== false\n  this._corked = 1 // start corked\n  this._ondrain = null\n  this._drained = false\n  this._forwarding = false\n  this._unwrite = null\n  this._unread = null\n  this._ended = false\n\n  this.destroyed = false\n\n  if (writable) this.setWritable(writable)\n  if (readable) this.setReadable(readable)\n}\n\ninherits(Duplexify, stream.Duplex)\n\nDuplexify.obj = function(writable, readable, opts) {\n  if (!opts) opts = {}\n  opts.objectMode = true\n  opts.highWaterMark = 16\n  return new Duplexify(writable, readable, opts)\n}\n\nDuplexify.prototype.cork = function() {\n  if (++this._corked === 1) this.emit('cork')\n}\n\nDuplexify.prototype.uncork = function() {\n  if (this._corked && --this._corked === 0) this.emit('uncork')\n}\n\nDuplexify.prototype.setWritable = function(writable) {\n  if (this._unwrite) this._unwrite()\n\n  if (this.destroyed) {\n    if (writable && writable.destroy) writable.destroy()\n    return\n  }\n\n  if (writable === null || writable === false) {\n    this.end()\n    return\n  }\n\n  var self = this\n  var unend = eos(writable, {writable:true, readable:false}, destroyer(this, this._forwardEnd))\n\n  var ondrain = function() {\n    var ondrain = self._ondrain\n    self._ondrain = null\n    if (ondrain) ondrain()\n  }\n\n  var clear = function() {\n    self._writable.removeListener('drain', ondrain)\n    unend()\n  }\n\n  if (this._unwrite) process.nextTick(ondrain) // force a drain on stream reset to avoid livelocks\n\n  this._writable = writable\n  this._writable.on('drain', ondrain)\n  this._unwrite = clear\n\n  this.uncork() // always uncork setWritable\n}\n\nDuplexify.prototype.setReadable = function(readable) {\n  if (this._unread) this._unread()\n\n  if (this.destroyed) {\n    if (readable && readable.destroy) readable.destroy()\n    return\n  }\n\n  if (readable === null || readable === false) {\n    this.push(null)\n    this.resume()\n    return\n  }\n\n  var self = this\n  var unend = eos(readable, {writable:false, readable:true}, destroyer(this))\n\n  var onreadable = function() {\n    self._forward()\n  }\n\n  var onend = function() {\n    self.push(null)\n  }\n\n  var clear = function() {\n    self._readable2.removeListener('readable', onreadable)\n    self._readable2.removeListener('end', onend)\n    unend()\n  }\n\n  this._drained = true\n  this._readable = readable\n  this._readable2 = readable._readableState ? readable : toStreams2(readable)\n  this._readable2.on('readable', onreadable)\n  this._readable2.on('end', onend)\n  this._unread = clear\n\n  this._forward()\n}\n\nDuplexify.prototype._read = function() {\n  this._drained = true\n  this._forward()\n}\n\nDuplexify.prototype._forward = function() {\n  if (this._forwarding || !this._readable2 || !this._drained) return\n  this._forwarding = true\n\n  var data\n\n  while (this._drained && (data = shift(this._readable2)) !== null) {\n    if (this.destroyed) continue\n    this._drained = this.push(data)\n  }\n\n  this._forwarding = false\n}\n\nDuplexify.prototype.destroy = function(err) {\n  if (this.destroyed) return\n  this.destroyed = true\n\n  var self = this\n  process.nextTick(function() {\n    self._destroy(err)\n  })\n}\n\nDuplexify.prototype._destroy = function(err) {\n  if (err) {\n    var ondrain = this._ondrain\n    this._ondrain = null\n    if (ondrain) ondrain(err)\n    else this.emit('error', err)\n  }\n\n  if (this._forwardDestroy) {\n    if (this._readable && this._readable.destroy) this._readable.destroy()\n    if (this._writable && this._writable.destroy) this._writable.destroy()\n  }\n\n  this.emit('close')\n}\n\nDuplexify.prototype._write = function(data, enc, cb) {\n  if (this.destroyed) return cb()\n  if (this._corked) return onuncork(this, this._write.bind(this, data, enc, cb))\n  if (data === SIGNAL_FLUSH) return this._finish(cb)\n  if (!this._writable) return cb()\n\n  if (this._writable.write(data) === false) this._ondrain = cb\n  else cb()\n}\n\n\nDuplexify.prototype._finish = function(cb) {\n  var self = this\n  this.emit('preend')\n  onuncork(this, function() {\n    end(self._forwardEnd && self._writable, function() {\n      // haxx to not emit prefinish twice\n      if (self._writableState.prefinished === false) self._writableState.prefinished = true\n      self.emit('prefinish')\n      onuncork(self, cb)\n    })\n  })\n}\n\nDuplexify.prototype.end = function(data, enc, cb) {\n  if (typeof data === 'function') return this.end(null, null, data)\n  if (typeof enc === 'function') return this.end(data, null, enc)\n  this._ended = true\n  if (data) this.write(data)\n  if (!this._writableState.ending) this.write(SIGNAL_FLUSH)\n  return stream.Writable.prototype.end.call(this, cb)\n}\n\nmodule.exports = Duplexify\n\n\n/***/ }),\n/* 381 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar crypto = __webpack_require__(11);\nvar BigInteger = __webpack_require__(81).BigInteger;\nvar ECPointFp = __webpack_require__(140).ECPointFp;\nvar Buffer = __webpack_require__(15).Buffer;\nexports.ECCurves = __webpack_require__(606);\n\n// zero prepad\nfunction unstupid(hex,len)\n{\n\treturn (hex.length >= len) ? hex : unstupid(\"0\"+hex,len);\n}\n\nexports.ECKey = function(curve, key, isPublic)\n{\n  var priv;\n\tvar c = curve();\n\tvar n = c.getN();\n  var bytes = Math.floor(n.bitLength()/8);\n\n  if(key)\n  {\n    if(isPublic)\n    {\n      var curve = c.getCurve();\n//      var x = key.slice(1,bytes+1); // skip the 04 for uncompressed format\n//      var y = key.slice(bytes+1);\n//      this.P = new ECPointFp(curve,\n//        curve.fromBigInteger(new BigInteger(x.toString(\"hex\"), 16)),\n//        curve.fromBigInteger(new BigInteger(y.toString(\"hex\"), 16)));      \n      this.P = curve.decodePointHex(key.toString(\"hex\"));\n    }else{\n      if(key.length != bytes) return false;\n      priv = new BigInteger(key.toString(\"hex\"), 16);      \n    }\n  }else{\n    var n1 = n.subtract(BigInteger.ONE);\n    var r = new BigInteger(crypto.randomBytes(n.bitLength()));\n    priv = r.mod(n1).add(BigInteger.ONE);\n    this.P = c.getG().multiply(priv);\n  }\n  if(this.P)\n  {\n//  var pubhex = unstupid(this.P.getX().toBigInteger().toString(16),bytes*2)+unstupid(this.P.getY().toBigInteger().toString(16),bytes*2);\n//  this.PublicKey = Buffer.from(\"04\"+pubhex,\"hex\");\n    this.PublicKey = Buffer.from(c.getCurve().encodeCompressedPointHex(this.P),\"hex\");\n  }\n  if(priv)\n  {\n    this.PrivateKey = Buffer.from(unstupid(priv.toString(16),bytes*2),\"hex\");\n    this.deriveSharedSecret = function(key)\n    {\n      if(!key || !key.P) return false;\n      var S = key.P.multiply(priv);\n      return Buffer.from(unstupid(S.getX().toBigInteger().toString(16),bytes*2),\"hex\");\n   }     \n  }\n}\n\n\n\n/***/ }),\n/* 382 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar matchOperatorsRe = /[|\\\\{}()[\\]^$+*?.]/g;\n\nmodule.exports = function (str) {\n\tif (typeof str !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\treturn str.replace(matchOperatorsRe, '\\\\$&');\n};\n\n\n/***/ }),\n/* 383 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (data, opts) {\n    if (!opts) opts = {};\n    if (typeof opts === 'function') opts = { cmp: opts };\n    var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;\n\n    var cmp = opts.cmp && (function (f) {\n        return function (node) {\n            return function (a, b) {\n                var aobj = { key: a, value: node[a] };\n                var bobj = { key: b, value: node[b] };\n                return f(aobj, bobj);\n            };\n        };\n    })(opts.cmp);\n\n    var seen = [];\n    return (function stringify (node) {\n        if (node && node.toJSON && typeof node.toJSON === 'function') {\n            node = node.toJSON();\n        }\n\n        if (node === undefined) return;\n        if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';\n        if (typeof node !== 'object') return JSON.stringify(node);\n\n        var i, out;\n        if (Array.isArray(node)) {\n            out = '[';\n            for (i = 0; i < node.length; i++) {\n                if (i) out += ',';\n                out += stringify(node[i]) || 'null';\n            }\n            return out + ']';\n        }\n\n        if (node === null) return 'null';\n\n        if (seen.indexOf(node) !== -1) {\n            if (cycles) return JSON.stringify('__cycle__');\n            throw new TypeError('Converting circular structure to JSON');\n        }\n\n        var seenIndex = seen.push(node) - 1;\n        var keys = Object.keys(node).sort(cmp && cmp(node));\n        out = '';\n        for (i = 0; i < keys.length; i++) {\n            var key = keys[i];\n            var value = stringify(node[key]);\n\n            if (!value) continue;\n            if (out) out += ',';\n            out += JSON.stringify(key) + ':' + value;\n        }\n        seen.splice(seenIndex, 1);\n        return '{' + out + '}';\n    })(data);\n};\n\n\n/***/ }),\n/* 384 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar fs = __webpack_require__(4)\n\nmodule.exports = clone(fs)\n\nfunction clone (obj) {\n  if (obj === null || typeof obj !== 'object')\n    return obj\n\n  if (obj instanceof Object)\n    var copy = { __proto__: obj.__proto__ }\n  else\n    var copy = Object.create(null)\n\n  Object.getOwnPropertyNames(obj).forEach(function (key) {\n    Object.defineProperty(copy, key, Object.getOwnPropertyDescriptor(obj, key))\n  })\n\n  return copy\n}\n\n\n/***/ }),\n/* 385 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar fs = __webpack_require__(4)\nvar polyfills = __webpack_require__(623)\nvar legacy = __webpack_require__(622)\nvar queue = []\n\nvar util = __webpack_require__(3)\n\nfunction noop () {}\n\nvar debug = noop\nif (util.debuglog)\n  debug = util.debuglog('gfs4')\nelse if (/\\bgfs4\\b/i.test(process.env.NODE_DEBUG || ''))\n  debug = function() {\n    var m = util.format.apply(util, arguments)\n    m = 'GFS4: ' + m.split(/\\n/).join('\\nGFS4: ')\n    console.error(m)\n  }\n\nif (/\\bgfs4\\b/i.test(process.env.NODE_DEBUG || '')) {\n  process.on('exit', function() {\n    debug(queue)\n    __webpack_require__(29).equal(queue.length, 0)\n  })\n}\n\nmodule.exports = patch(__webpack_require__(384))\nif (process.env.TEST_GRACEFUL_FS_GLOBAL_PATCH) {\n  module.exports = patch(fs)\n}\n\n// Always patch fs.close/closeSync, because we want to\n// retry() whenever a close happens *anywhere* in the program.\n// This is essential when multiple graceful-fs instances are\n// in play at the same time.\nmodule.exports.close =\nfs.close = (function (fs$close) { return function (fd, cb) {\n  return fs$close.call(fs, fd, function (err) {\n    if (!err)\n      retry()\n\n    if (typeof cb === 'function')\n      cb.apply(this, arguments)\n  })\n}})(fs.close)\n\nmodule.exports.closeSync =\nfs.closeSync = (function (fs$closeSync) { return function (fd) {\n  // Note that graceful-fs also retries when fs.closeSync() fails.\n  // Looks like a bug to me, although it's probably a harmless one.\n  var rval = fs$closeSync.apply(fs, arguments)\n  retry()\n  return rval\n}})(fs.closeSync)\n\nfunction patch (fs) {\n  // Everything that references the open() function needs to be in here\n  polyfills(fs)\n  fs.gracefulify = patch\n  fs.FileReadStream = ReadStream;  // Legacy name.\n  fs.FileWriteStream = WriteStream;  // Legacy name.\n  fs.createReadStream = createReadStream\n  fs.createWriteStream = createWriteStream\n  var fs$readFile = fs.readFile\n  fs.readFile = readFile\n  function readFile (path, options, cb) {\n    if (typeof options === 'function')\n      cb = options, options = null\n\n    return go$readFile(path, options, cb)\n\n    function go$readFile (path, options, cb) {\n      return fs$readFile(path, options, function (err) {\n        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n          enqueue([go$readFile, [path, options, cb]])\n        else {\n          if (typeof cb === 'function')\n            cb.apply(this, arguments)\n          retry()\n        }\n      })\n    }\n  }\n\n  var fs$writeFile = fs.writeFile\n  fs.writeFile = writeFile\n  function writeFile (path, data, options, cb) {\n    if (typeof options === 'function')\n      cb = options, options = null\n\n    return go$writeFile(path, data, options, cb)\n\n    function go$writeFile (path, data, options, cb) {\n      return fs$writeFile(path, data, options, function (err) {\n        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n          enqueue([go$writeFile, [path, data, options, cb]])\n        else {\n          if (typeof cb === 'function')\n            cb.apply(this, arguments)\n          retry()\n        }\n      })\n    }\n  }\n\n  var fs$appendFile = fs.appendFile\n  if (fs$appendFile)\n    fs.appendFile = appendFile\n  function appendFile (path, data, options, cb) {\n    if (typeof options === 'function')\n      cb = options, options = null\n\n    return go$appendFile(path, data, options, cb)\n\n    function go$appendFile (path, data, options, cb) {\n      return fs$appendFile(path, data, options, function (err) {\n        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n          enqueue([go$appendFile, [path, data, options, cb]])\n        else {\n          if (typeof cb === 'function')\n            cb.apply(this, arguments)\n          retry()\n        }\n      })\n    }\n  }\n\n  var fs$readdir = fs.readdir\n  fs.readdir = readdir\n  function readdir (path, options, cb) {\n    var args = [path]\n    if (typeof options !== 'function') {\n      args.push(options)\n    } else {\n      cb = options\n    }\n    args.push(go$readdir$cb)\n\n    return go$readdir(args)\n\n    function go$readdir$cb (err, files) {\n      if (files && files.sort)\n        files.sort()\n\n      if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n        enqueue([go$readdir, [args]])\n      else {\n        if (typeof cb === 'function')\n          cb.apply(this, arguments)\n        retry()\n      }\n    }\n  }\n\n  function go$readdir (args) {\n    return fs$readdir.apply(fs, args)\n  }\n\n  if (process.version.substr(0, 4) === 'v0.8') {\n    var legStreams = legacy(fs)\n    ReadStream = legStreams.ReadStream\n    WriteStream = legStreams.WriteStream\n  }\n\n  var fs$ReadStream = fs.ReadStream\n  ReadStream.prototype = Object.create(fs$ReadStream.prototype)\n  ReadStream.prototype.open = ReadStream$open\n\n  var fs$WriteStream = fs.WriteStream\n  WriteStream.prototype = Object.create(fs$WriteStream.prototype)\n  WriteStream.prototype.open = WriteStream$open\n\n  fs.ReadStream = ReadStream\n  fs.WriteStream = WriteStream\n\n  function ReadStream (path, options) {\n    if (this instanceof ReadStream)\n      return fs$ReadStream.apply(this, arguments), this\n    else\n      return ReadStream.apply(Object.create(ReadStream.prototype), arguments)\n  }\n\n  function ReadStream$open () {\n    var that = this\n    open(that.path, that.flags, that.mode, function (err, fd) {\n      if (err) {\n        if (that.autoClose)\n          that.destroy()\n\n        that.emit('error', err)\n      } else {\n        that.fd = fd\n        that.emit('open', fd)\n        that.read()\n      }\n    })\n  }\n\n  function WriteStream (path, options) {\n    if (this instanceof WriteStream)\n      return fs$WriteStream.apply(this, arguments), this\n    else\n      return WriteStream.apply(Object.create(WriteStream.prototype), arguments)\n  }\n\n  function WriteStream$open () {\n    var that = this\n    open(that.path, that.flags, that.mode, function (err, fd) {\n      if (err) {\n        that.destroy()\n        that.emit('error', err)\n      } else {\n        that.fd = fd\n        that.emit('open', fd)\n      }\n    })\n  }\n\n  function createReadStream (path, options) {\n    return new ReadStream(path, options)\n  }\n\n  function createWriteStream (path, options) {\n    return new WriteStream(path, options)\n  }\n\n  var fs$open = fs.open\n  fs.open = open\n  function open (path, flags, mode, cb) {\n    if (typeof mode === 'function')\n      cb = mode, mode = null\n\n    return go$open(path, flags, mode, cb)\n\n    function go$open (path, flags, mode, cb) {\n      return fs$open(path, flags, mode, function (err, fd) {\n        if (err && (err.code === 'EMFILE' || err.code === 'ENFILE'))\n          enqueue([go$open, [path, flags, mode, cb]])\n        else {\n          if (typeof cb === 'function')\n            cb.apply(this, arguments)\n          retry()\n        }\n      })\n    }\n  }\n\n  return fs\n}\n\nfunction enqueue (elem) {\n  debug('ENQUEUE', elem[0].name, elem[1])\n  queue.push(elem)\n}\n\nfunction retry () {\n  var elem = queue.shift()\n  if (elem) {\n    debug('RETRY', elem[0].name, elem[1])\n    elem[0].apply(null, elem[1])\n  }\n}\n\n\n/***/ }),\n/* 386 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(114);\n\nmodule.exports = SchemaObject;\n\nfunction SchemaObject(obj) {\n  util.copy(obj, this);\n}\n\n\n/***/ }),\n/* 387 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate__limit(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $errorKeyword;\n  var $data = 'data' + ($dataLvl || '');\n  var $isData = it.opts.$data && $schema && $schema.$data,\n    $schemaValue;\n  if ($isData) {\n    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n    $schemaValue = 'schema' + $lvl;\n  } else {\n    $schemaValue = $schema;\n  }\n  var $isMax = $keyword == 'maximum',\n    $exclusiveKeyword = $isMax ? 'exclusiveMaximum' : 'exclusiveMinimum',\n    $schemaExcl = it.schema[$exclusiveKeyword],\n    $isDataExcl = it.opts.$data && $schemaExcl && $schemaExcl.$data,\n    $op = $isMax ? '<' : '>',\n    $notOp = $isMax ? '>' : '<',\n    $errorKeyword = undefined;\n  if ($isDataExcl) {\n    var $schemaValueExcl = it.util.getData($schemaExcl.$data, $dataLvl, it.dataPathArr),\n      $exclusive = 'exclusive' + $lvl,\n      $exclType = 'exclType' + $lvl,\n      $exclIsNumber = 'exclIsNumber' + $lvl,\n      $opExpr = 'op' + $lvl,\n      $opStr = '\\' + ' + $opExpr + ' + \\'';\n    out += ' var schemaExcl' + ($lvl) + ' = ' + ($schemaValueExcl) + '; ';\n    $schemaValueExcl = 'schemaExcl' + $lvl;\n    out += ' var ' + ($exclusive) + '; var ' + ($exclType) + ' = typeof ' + ($schemaValueExcl) + '; if (' + ($exclType) + ' != \\'boolean\\' && ' + ($exclType) + ' != \\'undefined\\' && ' + ($exclType) + ' != \\'number\\') { ';\n    var $errorKeyword = $exclusiveKeyword;\n    var $$outStack = $$outStack || [];\n    $$outStack.push(out);\n    out = ''; /* istanbul ignore else */\n    if (it.createErrors !== false) {\n      out += ' { keyword: \\'' + ($errorKeyword || '_exclusiveLimit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n      if (it.opts.messages !== false) {\n        out += ' , message: \\'' + ($exclusiveKeyword) + ' should be boolean\\' ';\n      }\n      if (it.opts.verbose) {\n        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n      }\n      out += ' } ';\n    } else {\n      out += ' {} ';\n    }\n    var __err = out;\n    out = $$outStack.pop();\n    if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n      if (it.async) {\n        out += ' throw new ValidationError([' + (__err) + ']); ';\n      } else {\n        out += ' validate.errors = [' + (__err) + ']; return false; ';\n      }\n    } else {\n      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n    }\n    out += ' } else if ( ';\n    if ($isData) {\n      out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n    }\n    out += ' ' + ($exclType) + ' == \\'number\\' ? ( (' + ($exclusive) + ' = ' + ($schemaValue) + ' === undefined || ' + ($schemaValueExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ') ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValueExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) : ( (' + ($exclusive) + ' = ' + ($schemaValueExcl) + ' === true) ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaValue) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { var op' + ($lvl) + ' = ' + ($exclusive) + ' ? \\'' + ($op) + '\\' : \\'' + ($op) + '=\\';';\n  } else {\n    var $exclIsNumber = typeof $schemaExcl == 'number',\n      $opStr = $op;\n    if ($exclIsNumber && $isData) {\n      var $opExpr = '\\'' + $opStr + '\\'';\n      out += ' if ( ';\n      if ($isData) {\n        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n      }\n      out += ' ( ' + ($schemaValue) + ' === undefined || ' + ($schemaExcl) + ' ' + ($op) + '= ' + ($schemaValue) + ' ? ' + ($data) + ' ' + ($notOp) + '= ' + ($schemaExcl) + ' : ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' ) || ' + ($data) + ' !== ' + ($data) + ') { ';\n    } else {\n      if ($exclIsNumber && $schema === undefined) {\n        $exclusive = true;\n        $errorKeyword = $exclusiveKeyword;\n        $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;\n        $schemaValue = $schemaExcl;\n        $notOp += '=';\n      } else {\n        if ($exclIsNumber) $schemaValue = Math[$isMax ? 'min' : 'max']($schemaExcl, $schema);\n        if ($schemaExcl === ($exclIsNumber ? $schemaValue : true)) {\n          $exclusive = true;\n          $errorKeyword = $exclusiveKeyword;\n          $errSchemaPath = it.errSchemaPath + '/' + $exclusiveKeyword;\n          $notOp += '=';\n        } else {\n          $exclusive = false;\n          $opStr += '=';\n        }\n      }\n      var $opExpr = '\\'' + $opStr + '\\'';\n      out += ' if ( ';\n      if ($isData) {\n        out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n      }\n      out += ' ' + ($data) + ' ' + ($notOp) + ' ' + ($schemaValue) + ' || ' + ($data) + ' !== ' + ($data) + ') { ';\n    }\n  }\n  $errorKeyword = $errorKeyword || $keyword;\n  var $$outStack = $$outStack || [];\n  $$outStack.push(out);\n  out = ''; /* istanbul ignore else */\n  if (it.createErrors !== false) {\n    out += ' { keyword: \\'' + ($errorKeyword || '_limit') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { comparison: ' + ($opExpr) + ', limit: ' + ($schemaValue) + ', exclusive: ' + ($exclusive) + ' } ';\n    if (it.opts.messages !== false) {\n      out += ' , message: \\'should be ' + ($opStr) + ' ';\n      if ($isData) {\n        out += '\\' + ' + ($schemaValue);\n      } else {\n        out += '' + ($schemaValue) + '\\'';\n      }\n    }\n    if (it.opts.verbose) {\n      out += ' , schema:  ';\n      if ($isData) {\n        out += 'validate.schema' + ($schemaPath);\n      } else {\n        out += '' + ($schema);\n      }\n      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n    }\n    out += ' } ';\n  } else {\n    out += ' {} ';\n  }\n  var __err = out;\n  out = $$outStack.pop();\n  if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n    if (it.async) {\n      out += ' throw new ValidationError([' + (__err) + ']); ';\n    } else {\n      out += ' validate.errors = [' + (__err) + ']; return false; ';\n    }\n  } else {\n    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n  }\n  out += ' } ';\n  if ($breakOnError) {\n    out += ' else { ';\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 388 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate__limitItems(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $errorKeyword;\n  var $data = 'data' + ($dataLvl || '');\n  var $isData = it.opts.$data && $schema && $schema.$data,\n    $schemaValue;\n  if ($isData) {\n    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n    $schemaValue = 'schema' + $lvl;\n  } else {\n    $schemaValue = $schema;\n  }\n  var $op = $keyword == 'maxItems' ? '>' : '<';\n  out += 'if ( ';\n  if ($isData) {\n    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n  }\n  out += ' ' + ($data) + '.length ' + ($op) + ' ' + ($schemaValue) + ') { ';\n  var $errorKeyword = $keyword;\n  var $$outStack = $$outStack || [];\n  $$outStack.push(out);\n  out = ''; /* istanbul ignore else */\n  if (it.createErrors !== false) {\n    out += ' { keyword: \\'' + ($errorKeyword || '_limitItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n    if (it.opts.messages !== false) {\n      out += ' , message: \\'should NOT have ';\n      if ($keyword == 'maxItems') {\n        out += 'more';\n      } else {\n        out += 'less';\n      }\n      out += ' than ';\n      if ($isData) {\n        out += '\\' + ' + ($schemaValue) + ' + \\'';\n      } else {\n        out += '' + ($schema);\n      }\n      out += ' items\\' ';\n    }\n    if (it.opts.verbose) {\n      out += ' , schema:  ';\n      if ($isData) {\n        out += 'validate.schema' + ($schemaPath);\n      } else {\n        out += '' + ($schema);\n      }\n      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n    }\n    out += ' } ';\n  } else {\n    out += ' {} ';\n  }\n  var __err = out;\n  out = $$outStack.pop();\n  if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n    if (it.async) {\n      out += ' throw new ValidationError([' + (__err) + ']); ';\n    } else {\n      out += ' validate.errors = [' + (__err) + ']; return false; ';\n    }\n  } else {\n    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n  }\n  out += '} ';\n  if ($breakOnError) {\n    out += ' else { ';\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 389 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate__limitLength(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $errorKeyword;\n  var $data = 'data' + ($dataLvl || '');\n  var $isData = it.opts.$data && $schema && $schema.$data,\n    $schemaValue;\n  if ($isData) {\n    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n    $schemaValue = 'schema' + $lvl;\n  } else {\n    $schemaValue = $schema;\n  }\n  var $op = $keyword == 'maxLength' ? '>' : '<';\n  out += 'if ( ';\n  if ($isData) {\n    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n  }\n  if (it.opts.unicode === false) {\n    out += ' ' + ($data) + '.length ';\n  } else {\n    out += ' ucs2length(' + ($data) + ') ';\n  }\n  out += ' ' + ($op) + ' ' + ($schemaValue) + ') { ';\n  var $errorKeyword = $keyword;\n  var $$outStack = $$outStack || [];\n  $$outStack.push(out);\n  out = ''; /* istanbul ignore else */\n  if (it.createErrors !== false) {\n    out += ' { keyword: \\'' + ($errorKeyword || '_limitLength') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n    if (it.opts.messages !== false) {\n      out += ' , message: \\'should NOT be ';\n      if ($keyword == 'maxLength') {\n        out += 'longer';\n      } else {\n        out += 'shorter';\n      }\n      out += ' than ';\n      if ($isData) {\n        out += '\\' + ' + ($schemaValue) + ' + \\'';\n      } else {\n        out += '' + ($schema);\n      }\n      out += ' characters\\' ';\n    }\n    if (it.opts.verbose) {\n      out += ' , schema:  ';\n      if ($isData) {\n        out += 'validate.schema' + ($schemaPath);\n      } else {\n        out += '' + ($schema);\n      }\n      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n    }\n    out += ' } ';\n  } else {\n    out += ' {} ';\n  }\n  var __err = out;\n  out = $$outStack.pop();\n  if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n    if (it.async) {\n      out += ' throw new ValidationError([' + (__err) + ']); ';\n    } else {\n      out += ' validate.errors = [' + (__err) + ']; return false; ';\n    }\n  } else {\n    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n  }\n  out += '} ';\n  if ($breakOnError) {\n    out += ' else { ';\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 390 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate__limitProperties(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $errorKeyword;\n  var $data = 'data' + ($dataLvl || '');\n  var $isData = it.opts.$data && $schema && $schema.$data,\n    $schemaValue;\n  if ($isData) {\n    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n    $schemaValue = 'schema' + $lvl;\n  } else {\n    $schemaValue = $schema;\n  }\n  var $op = $keyword == 'maxProperties' ? '>' : '<';\n  out += 'if ( ';\n  if ($isData) {\n    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'number\\') || ';\n  }\n  out += ' Object.keys(' + ($data) + ').length ' + ($op) + ' ' + ($schemaValue) + ') { ';\n  var $errorKeyword = $keyword;\n  var $$outStack = $$outStack || [];\n  $$outStack.push(out);\n  out = ''; /* istanbul ignore else */\n  if (it.createErrors !== false) {\n    out += ' { keyword: \\'' + ($errorKeyword || '_limitProperties') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schemaValue) + ' } ';\n    if (it.opts.messages !== false) {\n      out += ' , message: \\'should NOT have ';\n      if ($keyword == 'maxProperties') {\n        out += 'more';\n      } else {\n        out += 'less';\n      }\n      out += ' than ';\n      if ($isData) {\n        out += '\\' + ' + ($schemaValue) + ' + \\'';\n      } else {\n        out += '' + ($schema);\n      }\n      out += ' properties\\' ';\n    }\n    if (it.opts.verbose) {\n      out += ' , schema:  ';\n      if ($isData) {\n        out += 'validate.schema' + ($schemaPath);\n      } else {\n        out += '' + ($schema);\n      }\n      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n    }\n    out += ' } ';\n  } else {\n    out += ' {} ';\n  }\n  var __err = out;\n  out = $$outStack.pop();\n  if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n    if (it.async) {\n      out += ' throw new ValidationError([' + (__err) + ']); ';\n    } else {\n      out += ' validate.errors = [' + (__err) + ']; return false; ';\n    }\n  } else {\n    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n  }\n  out += '} ';\n  if ($breakOnError) {\n    out += ' else { ';\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 391 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_validate(it, $keyword, $ruleType) {\n  var out = '';\n  var $async = it.schema.$async === true,\n    $refKeywords = it.util.schemaHasRulesExcept(it.schema, it.RULES.all, '$ref'),\n    $id = it.self._getId(it.schema);\n  if (it.isTop) {\n    if ($async) {\n      it.async = true;\n      var $es7 = it.opts.async == 'es7';\n      it.yieldAwait = $es7 ? 'await' : 'yield';\n    }\n    out += ' var validate = ';\n    if ($async) {\n      if ($es7) {\n        out += ' (async function ';\n      } else {\n        if (it.opts.async != '*') {\n          out += 'co.wrap';\n        }\n        out += '(function* ';\n      }\n    } else {\n      out += ' (function ';\n    }\n    out += ' (data, dataPath, parentData, parentDataProperty, rootData) { \\'use strict\\'; ';\n    if ($id && (it.opts.sourceCode || it.opts.processCode)) {\n      out += ' ' + ('/\\*# sourceURL=' + $id + ' */') + ' ';\n    }\n  }\n  if (typeof it.schema == 'boolean' || !($refKeywords || it.schema.$ref)) {\n    var $keyword = 'false schema';\n    var $lvl = it.level;\n    var $dataLvl = it.dataLevel;\n    var $schema = it.schema[$keyword];\n    var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n    var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n    var $breakOnError = !it.opts.allErrors;\n    var $errorKeyword;\n    var $data = 'data' + ($dataLvl || '');\n    var $valid = 'valid' + $lvl;\n    if (it.schema === false) {\n      if (it.isTop) {\n        $breakOnError = true;\n      } else {\n        out += ' var ' + ($valid) + ' = false; ';\n      }\n      var $$outStack = $$outStack || [];\n      $$outStack.push(out);\n      out = ''; /* istanbul ignore else */\n      if (it.createErrors !== false) {\n        out += ' { keyword: \\'' + ($errorKeyword || 'false schema') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n        if (it.opts.messages !== false) {\n          out += ' , message: \\'boolean schema is false\\' ';\n        }\n        if (it.opts.verbose) {\n          out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n        }\n        out += ' } ';\n      } else {\n        out += ' {} ';\n      }\n      var __err = out;\n      out = $$outStack.pop();\n      if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n        if (it.async) {\n          out += ' throw new ValidationError([' + (__err) + ']); ';\n        } else {\n          out += ' validate.errors = [' + (__err) + ']; return false; ';\n        }\n      } else {\n        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n      }\n    } else {\n      if (it.isTop) {\n        if ($async) {\n          out += ' return data; ';\n        } else {\n          out += ' validate.errors = null; return true; ';\n        }\n      } else {\n        out += ' var ' + ($valid) + ' = true; ';\n      }\n    }\n    if (it.isTop) {\n      out += ' }); return validate; ';\n    }\n    return out;\n  }\n  if (it.isTop) {\n    var $top = it.isTop,\n      $lvl = it.level = 0,\n      $dataLvl = it.dataLevel = 0,\n      $data = 'data';\n    it.rootId = it.resolve.fullPath(it.self._getId(it.root.schema));\n    it.baseId = it.baseId || it.rootId;\n    delete it.isTop;\n    it.dataPathArr = [undefined];\n    out += ' var vErrors = null; ';\n    out += ' var errors = 0;     ';\n    out += ' if (rootData === undefined) rootData = data; ';\n  } else {\n    var $lvl = it.level,\n      $dataLvl = it.dataLevel,\n      $data = 'data' + ($dataLvl || '');\n    if ($id) it.baseId = it.resolve.url(it.baseId, $id);\n    if ($async && !it.async) throw new Error('async schema in sync schema');\n    out += ' var errs_' + ($lvl) + ' = errors;';\n  }\n  var $valid = 'valid' + $lvl,\n    $breakOnError = !it.opts.allErrors,\n    $closingBraces1 = '',\n    $closingBraces2 = '';\n  var $errorKeyword;\n  var $typeSchema = it.schema.type,\n    $typeIsArray = Array.isArray($typeSchema);\n  if ($typeIsArray && $typeSchema.length == 1) {\n    $typeSchema = $typeSchema[0];\n    $typeIsArray = false;\n  }\n  if (it.schema.$ref && $refKeywords) {\n    if (it.opts.extendRefs == 'fail') {\n      throw new Error('$ref: validation keywords used in schema at path \"' + it.errSchemaPath + '\" (see option extendRefs)');\n    } else if (it.opts.extendRefs !== true) {\n      $refKeywords = false;\n      it.logger.warn('$ref: keywords ignored in schema at path \"' + it.errSchemaPath + '\"');\n    }\n  }\n  if ($typeSchema) {\n    if (it.opts.coerceTypes) {\n      var $coerceToTypes = it.util.coerceToTypes(it.opts.coerceTypes, $typeSchema);\n    }\n    var $rulesGroup = it.RULES.types[$typeSchema];\n    if ($coerceToTypes || $typeIsArray || $rulesGroup === true || ($rulesGroup && !$shouldUseGroup($rulesGroup))) {\n      var $schemaPath = it.schemaPath + '.type',\n        $errSchemaPath = it.errSchemaPath + '/type';\n      var $schemaPath = it.schemaPath + '.type',\n        $errSchemaPath = it.errSchemaPath + '/type',\n        $method = $typeIsArray ? 'checkDataTypes' : 'checkDataType';\n      out += ' if (' + (it.util[$method]($typeSchema, $data, true)) + ') { ';\n      if ($coerceToTypes) {\n        var $dataType = 'dataType' + $lvl,\n          $coerced = 'coerced' + $lvl;\n        out += ' var ' + ($dataType) + ' = typeof ' + ($data) + '; ';\n        if (it.opts.coerceTypes == 'array') {\n          out += ' if (' + ($dataType) + ' == \\'object\\' && Array.isArray(' + ($data) + ')) ' + ($dataType) + ' = \\'array\\'; ';\n        }\n        out += ' var ' + ($coerced) + ' = undefined; ';\n        var $bracesCoercion = '';\n        var arr1 = $coerceToTypes;\n        if (arr1) {\n          var $type, $i = -1,\n            l1 = arr1.length - 1;\n          while ($i < l1) {\n            $type = arr1[$i += 1];\n            if ($i) {\n              out += ' if (' + ($coerced) + ' === undefined) { ';\n              $bracesCoercion += '}';\n            }\n            if (it.opts.coerceTypes == 'array' && $type != 'array') {\n              out += ' if (' + ($dataType) + ' == \\'array\\' && ' + ($data) + '.length == 1) { ' + ($coerced) + ' = ' + ($data) + ' = ' + ($data) + '[0]; ' + ($dataType) + ' = typeof ' + ($data) + ';  } ';\n            }\n            if ($type == 'string') {\n              out += ' if (' + ($dataType) + ' == \\'number\\' || ' + ($dataType) + ' == \\'boolean\\') ' + ($coerced) + ' = \\'\\' + ' + ($data) + '; else if (' + ($data) + ' === null) ' + ($coerced) + ' = \\'\\'; ';\n            } else if ($type == 'number' || $type == 'integer') {\n              out += ' if (' + ($dataType) + ' == \\'boolean\\' || ' + ($data) + ' === null || (' + ($dataType) + ' == \\'string\\' && ' + ($data) + ' && ' + ($data) + ' == +' + ($data) + ' ';\n              if ($type == 'integer') {\n                out += ' && !(' + ($data) + ' % 1)';\n              }\n              out += ')) ' + ($coerced) + ' = +' + ($data) + '; ';\n            } else if ($type == 'boolean') {\n              out += ' if (' + ($data) + ' === \\'false\\' || ' + ($data) + ' === 0 || ' + ($data) + ' === null) ' + ($coerced) + ' = false; else if (' + ($data) + ' === \\'true\\' || ' + ($data) + ' === 1) ' + ($coerced) + ' = true; ';\n            } else if ($type == 'null') {\n              out += ' if (' + ($data) + ' === \\'\\' || ' + ($data) + ' === 0 || ' + ($data) + ' === false) ' + ($coerced) + ' = null; ';\n            } else if (it.opts.coerceTypes == 'array' && $type == 'array') {\n              out += ' if (' + ($dataType) + ' == \\'string\\' || ' + ($dataType) + ' == \\'number\\' || ' + ($dataType) + ' == \\'boolean\\' || ' + ($data) + ' == null) ' + ($coerced) + ' = [' + ($data) + ']; ';\n            }\n          }\n        }\n        out += ' ' + ($bracesCoercion) + ' if (' + ($coerced) + ' === undefined) {   ';\n        var $$outStack = $$outStack || [];\n        $$outStack.push(out);\n        out = ''; /* istanbul ignore else */\n        if (it.createErrors !== false) {\n          out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n          if ($typeIsArray) {\n            out += '' + ($typeSchema.join(\",\"));\n          } else {\n            out += '' + ($typeSchema);\n          }\n          out += '\\' } ';\n          if (it.opts.messages !== false) {\n            out += ' , message: \\'should be ';\n            if ($typeIsArray) {\n              out += '' + ($typeSchema.join(\",\"));\n            } else {\n              out += '' + ($typeSchema);\n            }\n            out += '\\' ';\n          }\n          if (it.opts.verbose) {\n            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n          }\n          out += ' } ';\n        } else {\n          out += ' {} ';\n        }\n        var __err = out;\n        out = $$outStack.pop();\n        if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n          if (it.async) {\n            out += ' throw new ValidationError([' + (__err) + ']); ';\n          } else {\n            out += ' validate.errors = [' + (__err) + ']; return false; ';\n          }\n        } else {\n          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n        }\n        out += ' } else {  ';\n        var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',\n          $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';\n        out += ' ' + ($data) + ' = ' + ($coerced) + '; ';\n        if (!$dataLvl) {\n          out += 'if (' + ($parentData) + ' !== undefined)';\n        }\n        out += ' ' + ($parentData) + '[' + ($parentDataProperty) + '] = ' + ($coerced) + '; } ';\n      } else {\n        var $$outStack = $$outStack || [];\n        $$outStack.push(out);\n        out = ''; /* istanbul ignore else */\n        if (it.createErrors !== false) {\n          out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n          if ($typeIsArray) {\n            out += '' + ($typeSchema.join(\",\"));\n          } else {\n            out += '' + ($typeSchema);\n          }\n          out += '\\' } ';\n          if (it.opts.messages !== false) {\n            out += ' , message: \\'should be ';\n            if ($typeIsArray) {\n              out += '' + ($typeSchema.join(\",\"));\n            } else {\n              out += '' + ($typeSchema);\n            }\n            out += '\\' ';\n          }\n          if (it.opts.verbose) {\n            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n          }\n          out += ' } ';\n        } else {\n          out += ' {} ';\n        }\n        var __err = out;\n        out = $$outStack.pop();\n        if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n          if (it.async) {\n            out += ' throw new ValidationError([' + (__err) + ']); ';\n          } else {\n            out += ' validate.errors = [' + (__err) + ']; return false; ';\n          }\n        } else {\n          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n        }\n      }\n      out += ' } ';\n    }\n  }\n  if (it.schema.$ref && !$refKeywords) {\n    out += ' ' + (it.RULES.all.$ref.code(it, '$ref')) + ' ';\n    if ($breakOnError) {\n      out += ' } if (errors === ';\n      if ($top) {\n        out += '0';\n      } else {\n        out += 'errs_' + ($lvl);\n      }\n      out += ') { ';\n      $closingBraces2 += '}';\n    }\n  } else {\n    if (it.opts.v5 && it.schema.patternGroups) {\n      it.logger.warn('keyword \"patternGroups\" is deprecated and disabled. Use option patternGroups: true to enable.');\n    }\n    var arr2 = it.RULES;\n    if (arr2) {\n      var $rulesGroup, i2 = -1,\n        l2 = arr2.length - 1;\n      while (i2 < l2) {\n        $rulesGroup = arr2[i2 += 1];\n        if ($shouldUseGroup($rulesGroup)) {\n          if ($rulesGroup.type) {\n            out += ' if (' + (it.util.checkDataType($rulesGroup.type, $data)) + ') { ';\n          }\n          if (it.opts.useDefaults && !it.compositeRule) {\n            if ($rulesGroup.type == 'object' && it.schema.properties) {\n              var $schema = it.schema.properties,\n                $schemaKeys = Object.keys($schema);\n              var arr3 = $schemaKeys;\n              if (arr3) {\n                var $propertyKey, i3 = -1,\n                  l3 = arr3.length - 1;\n                while (i3 < l3) {\n                  $propertyKey = arr3[i3 += 1];\n                  var $sch = $schema[$propertyKey];\n                  if ($sch.default !== undefined) {\n                    var $passData = $data + it.util.getProperty($propertyKey);\n                    out += '  if (' + ($passData) + ' === undefined) ' + ($passData) + ' = ';\n                    if (it.opts.useDefaults == 'shared') {\n                      out += ' ' + (it.useDefault($sch.default)) + ' ';\n                    } else {\n                      out += ' ' + (JSON.stringify($sch.default)) + ' ';\n                    }\n                    out += '; ';\n                  }\n                }\n              }\n            } else if ($rulesGroup.type == 'array' && Array.isArray(it.schema.items)) {\n              var arr4 = it.schema.items;\n              if (arr4) {\n                var $sch, $i = -1,\n                  l4 = arr4.length - 1;\n                while ($i < l4) {\n                  $sch = arr4[$i += 1];\n                  if ($sch.default !== undefined) {\n                    var $passData = $data + '[' + $i + ']';\n                    out += '  if (' + ($passData) + ' === undefined) ' + ($passData) + ' = ';\n                    if (it.opts.useDefaults == 'shared') {\n                      out += ' ' + (it.useDefault($sch.default)) + ' ';\n                    } else {\n                      out += ' ' + (JSON.stringify($sch.default)) + ' ';\n                    }\n                    out += '; ';\n                  }\n                }\n              }\n            }\n          }\n          var arr5 = $rulesGroup.rules;\n          if (arr5) {\n            var $rule, i5 = -1,\n              l5 = arr5.length - 1;\n            while (i5 < l5) {\n              $rule = arr5[i5 += 1];\n              if ($shouldUseRule($rule)) {\n                var $code = $rule.code(it, $rule.keyword, $rulesGroup.type);\n                if ($code) {\n                  out += ' ' + ($code) + ' ';\n                  if ($breakOnError) {\n                    $closingBraces1 += '}';\n                  }\n                }\n              }\n            }\n          }\n          if ($breakOnError) {\n            out += ' ' + ($closingBraces1) + ' ';\n            $closingBraces1 = '';\n          }\n          if ($rulesGroup.type) {\n            out += ' } ';\n            if ($typeSchema && $typeSchema === $rulesGroup.type && !$coerceToTypes) {\n              out += ' else { ';\n              var $schemaPath = it.schemaPath + '.type',\n                $errSchemaPath = it.errSchemaPath + '/type';\n              var $$outStack = $$outStack || [];\n              $$outStack.push(out);\n              out = ''; /* istanbul ignore else */\n              if (it.createErrors !== false) {\n                out += ' { keyword: \\'' + ($errorKeyword || 'type') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { type: \\'';\n                if ($typeIsArray) {\n                  out += '' + ($typeSchema.join(\",\"));\n                } else {\n                  out += '' + ($typeSchema);\n                }\n                out += '\\' } ';\n                if (it.opts.messages !== false) {\n                  out += ' , message: \\'should be ';\n                  if ($typeIsArray) {\n                    out += '' + ($typeSchema.join(\",\"));\n                  } else {\n                    out += '' + ($typeSchema);\n                  }\n                  out += '\\' ';\n                }\n                if (it.opts.verbose) {\n                  out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n                }\n                out += ' } ';\n              } else {\n                out += ' {} ';\n              }\n              var __err = out;\n              out = $$outStack.pop();\n              if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n                if (it.async) {\n                  out += ' throw new ValidationError([' + (__err) + ']); ';\n                } else {\n                  out += ' validate.errors = [' + (__err) + ']; return false; ';\n                }\n              } else {\n                out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n              }\n              out += ' } ';\n            }\n          }\n          if ($breakOnError) {\n            out += ' if (errors === ';\n            if ($top) {\n              out += '0';\n            } else {\n              out += 'errs_' + ($lvl);\n            }\n            out += ') { ';\n            $closingBraces2 += '}';\n          }\n        }\n      }\n    }\n  }\n  if ($breakOnError) {\n    out += ' ' + ($closingBraces2) + ' ';\n  }\n  if ($top) {\n    if ($async) {\n      out += ' if (errors === 0) return data;           ';\n      out += ' else throw new ValidationError(vErrors); ';\n    } else {\n      out += ' validate.errors = vErrors; ';\n      out += ' return errors === 0;       ';\n    }\n    out += ' }); return validate;';\n  } else {\n    out += ' var ' + ($valid) + ' = errors === errs_' + ($lvl) + ';';\n  }\n  out = it.util.cleanUpCode(out);\n  if ($top) {\n    out = it.util.finalCleanUpCode(out, $async);\n  }\n\n  function $shouldUseGroup($rulesGroup) {\n    var rules = $rulesGroup.rules;\n    for (var i = 0; i < rules.length; i++)\n      if ($shouldUseRule(rules[i])) return true;\n  }\n\n  function $shouldUseRule($rule) {\n    return it.schema[$rule.keyword] !== undefined || ($rule.implements && $ruleImplementsSomeKeyword($rule));\n  }\n\n  function $ruleImplementsSomeKeyword($rule) {\n    var impl = $rule.implements;\n    for (var i = 0; i < impl.length; i++)\n      if (it.schema[impl[i]] !== undefined) return true;\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 392 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * `input` type prompt\n */\n\nvar chalk = __webpack_require__(27);\nvar { map, takeUntil } = __webpack_require__(63);\nvar Base = __webpack_require__(79);\nvar observe = __webpack_require__(80);\n\nclass InputPrompt extends Base {\n  /**\n   * Start the Inquiry session\n   * @param  {Function} cb      Callback when prompt is done\n   * @return {this}\n   */\n\n  _run(cb) {\n    this.done = cb;\n\n    // Once user confirm (enter key)\n    var events = observe(this.rl);\n    var submit = events.line.pipe(map(this.filterInput.bind(this)));\n\n    var validation = this.handleSubmitEvents(submit);\n    validation.success.forEach(this.onEnd.bind(this));\n    validation.error.forEach(this.onError.bind(this));\n\n    events.keypress\n      .pipe(takeUntil(validation.success))\n      .forEach(this.onKeypress.bind(this));\n\n    // Init\n    this.render();\n\n    return this;\n  }\n\n  /**\n   * Render the prompt to screen\n   * @return {InputPrompt} self\n   */\n\n  render(error) {\n    var bottomContent = '';\n    var appendContent = '';\n    var message = this.getQuestion();\n    var transformer = this.opt.transformer;\n    var isFinal = this.status === 'answered';\n\n    if (isFinal) {\n      appendContent = this.answer;\n    } else {\n      appendContent = this.rl.line;\n    }\n\n    if (transformer) {\n      message += transformer(appendContent, this.answers, { isFinal });\n    } else {\n      message += isFinal ? chalk.cyan(appendContent) : appendContent;\n    }\n\n    if (error) {\n      bottomContent = chalk.red('>> ') + error;\n    }\n\n    this.screen.render(message, bottomContent);\n  }\n\n  /**\n   * When user press `enter` key\n   */\n\n  filterInput(input) {\n    if (!input) {\n      return this.opt.default == null ? '' : this.opt.default;\n    }\n    return input;\n  }\n\n  onEnd(state) {\n    this.answer = state.value;\n    this.status = 'answered';\n\n    // Re-render prompt\n    this.render();\n\n    this.screen.done();\n    this.done(state.value);\n  }\n\n  onError(state) {\n    this.render(state.isValid);\n  }\n\n  /**\n   * When user press a key\n   */\n\n  onKeypress() {\n    // If user press a key, just clear the default value\n    if (this.opt.default) {\n      this.opt.default = undefined;\n    }\n\n    this.render();\n  }\n}\n\nmodule.exports = InputPrompt;\n\n\n/***/ }),\n/* 393 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar _ = __webpack_require__(38);\nvar MuteStream = __webpack_require__(401);\nvar readline = __webpack_require__(198);\n\n/**\n * Base interface class other can inherits from\n */\n\nclass UI {\n  constructor(opt) {\n    // Instantiate the Readline interface\n    // @Note: Don't reassign if already present (allow test to override the Stream)\n    if (!this.rl) {\n      this.rl = readline.createInterface(setupReadlineOptions(opt));\n    }\n    this.rl.resume();\n\n    this.onForceClose = this.onForceClose.bind(this);\n\n    // Make sure new prompt start on a newline when closing\n    process.on('exit', this.onForceClose);\n\n    // Terminate process on SIGINT (which will call process.on('exit') in return)\n    this.rl.on('SIGINT', this.onForceClose);\n  }\n\n  /**\n   * Handle the ^C exit\n   * @return {null}\n   */\n\n  onForceClose() {\n    this.close();\n    process.kill(process.pid, 'SIGINT');\n    console.log('');\n  }\n\n  /**\n   * Close the interface and cleanup listeners\n   */\n\n  close() {\n    // Remove events listeners\n    this.rl.removeListener('SIGINT', this.onForceClose);\n    process.removeListener('exit', this.onForceClose);\n\n    this.rl.output.unmute();\n\n    if (this.activePrompt && typeof this.activePrompt.close === 'function') {\n      this.activePrompt.close();\n    }\n\n    // Close the readline\n    this.rl.output.end();\n    this.rl.pause();\n    this.rl.close();\n  }\n}\n\nfunction setupReadlineOptions(opt) {\n  opt = opt || {};\n\n  // Default `input` to stdin\n  var input = opt.input || process.stdin;\n\n  // Add mute capabilities to the output\n  var ms = new MuteStream();\n  ms.pipe(opt.output || process.stdout);\n  var output = ms;\n\n  return _.extend(\n    {\n      terminal: true,\n      input: input,\n      output: output\n    },\n    _.omit(opt, ['input', 'output'])\n  );\n}\n\nmodule.exports = UI;\n\n\n/***/ }),\n/* 394 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar ansiEscapes = __webpack_require__(472);\n\n/**\n * Move cursor left by `x`\n * @param  {Readline} rl - Readline instance\n * @param  {Number}   x  - How far to go left (default to 1)\n */\n\nexports.left = function(rl, x) {\n  rl.output.write(ansiEscapes.cursorBackward(x));\n};\n\n/**\n * Move cursor right by `x`\n * @param  {Readline} rl - Readline instance\n * @param  {Number}   x  - How far to go left (default to 1)\n */\n\nexports.right = function(rl, x) {\n  rl.output.write(ansiEscapes.cursorForward(x));\n};\n\n/**\n * Move cursor up by `x`\n * @param  {Readline} rl - Readline instance\n * @param  {Number}   x  - How far to go up (default to 1)\n */\n\nexports.up = function(rl, x) {\n  rl.output.write(ansiEscapes.cursorUp(x));\n};\n\n/**\n * Move cursor down by `x`\n * @param  {Readline} rl - Readline instance\n * @param  {Number}   x  - How far to go down (default to 1)\n */\n\nexports.down = function(rl, x) {\n  rl.output.write(ansiEscapes.cursorDown(x));\n};\n\n/**\n * Clear current line\n * @param  {Readline} rl  - Readline instance\n * @param  {Number}   len - number of line to delete\n */\nexports.clearLine = function(rl, len) {\n  rl.output.write(ansiEscapes.eraseLines(len));\n};\n\n\n/***/ }),\n/* 395 */\n/***/ (function(module, exports) {\n\nmodule.exports = [[\"0\",\"\\u0000\",127],[\"a140\",\"　，、。．‧；：？！︰…‥﹐﹑﹒·﹔﹕﹖﹗｜–︱—︳╴︴﹏（）︵︶｛｝︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚\"],[\"a1a1\",\"﹛﹜﹝﹞‘’“”〝〞‵′＃＆＊※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯￣＿ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡＋－×÷±√＜＞＝≦≧≠∞≒≡﹢\",4,\"～∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣／\"],[\"a240\",\"＼∕﹨＄￥〒￠￡％＠℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁\",7,\"▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭\"],[\"a2a1\",\"╮╰╯═╞╪╡◢◣◥◤╱╲╳０\",9,\"Ⅰ\",9,\"〡\",8,\"十卄卅Ａ\",25,\"ａ\",21],[\"a340\",\"ｗｘｙｚΑ\",16,\"Σ\",6,\"α\",16,\"σ\",6,\"ㄅ\",10],[\"a3a1\",\"ㄐ\",25,\"˙ˉˊˇˋ\"],[\"a3e1\",\"€\"],[\"a440\",\"一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才\"],[\"a4a1\",\"丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙\"],[\"a540\",\"世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外\"],[\"a5a1\",\"央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全\"],[\"a640\",\"共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年\"],[\"a6a1\",\"式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣\"],[\"a740\",\"作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍\"],[\"a7a1\",\"均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠\"],[\"a840\",\"杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒\"],[\"a8a1\",\"芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵\"],[\"a940\",\"咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居\"],[\"a9a1\",\"屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊\"],[\"aa40\",\"昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠\"],[\"aaa1\",\"炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附\"],[\"ab40\",\"陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品\"],[\"aba1\",\"哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷\"],[\"ac40\",\"拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗\"],[\"aca1\",\"活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄\"],[\"ad40\",\"耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥\"],[\"ada1\",\"迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪\"],[\"ae40\",\"哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙\"],[\"aea1\",\"恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓\"],[\"af40\",\"浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷\"],[\"afa1\",\"砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃\"],[\"b040\",\"虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡\"],[\"b0a1\",\"陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀\"],[\"b140\",\"娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽\"],[\"b1a1\",\"情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺\"],[\"b240\",\"毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶\"],[\"b2a1\",\"瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼\"],[\"b340\",\"莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途\"],[\"b3a1\",\"部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠\"],[\"b440\",\"婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍\"],[\"b4a1\",\"插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋\"],[\"b540\",\"溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘\"],[\"b5a1\",\"窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁\"],[\"b640\",\"詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑\"],[\"b6a1\",\"間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼\"],[\"b740\",\"媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業\"],[\"b7a1\",\"楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督\"],[\"b840\",\"睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫\"],[\"b8a1\",\"腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊\"],[\"b940\",\"辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴\"],[\"b9a1\",\"飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇\"],[\"ba40\",\"愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢\"],[\"baa1\",\"滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬\"],[\"bb40\",\"罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤\"],[\"bba1\",\"說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜\"],[\"bc40\",\"劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂\"],[\"bca1\",\"慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃\"],[\"bd40\",\"瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯\"],[\"bda1\",\"翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞\"],[\"be40\",\"輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉\"],[\"bea1\",\"鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡\"],[\"bf40\",\"濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊\"],[\"bfa1\",\"縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚\"],[\"c040\",\"錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇\"],[\"c0a1\",\"嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬\"],[\"c140\",\"瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪\"],[\"c1a1\",\"薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁\"],[\"c240\",\"駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘\"],[\"c2a1\",\"癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦\"],[\"c340\",\"鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸\"],[\"c3a1\",\"獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類\"],[\"c440\",\"願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼\"],[\"c4a1\",\"纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴\"],[\"c540\",\"護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬\"],[\"c5a1\",\"禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒\"],[\"c640\",\"讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲\"],[\"c940\",\"乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕\"],[\"c9a1\",\"氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋\"],[\"ca40\",\"汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘\"],[\"caa1\",\"吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇\"],[\"cb40\",\"杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓\"],[\"cba1\",\"芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢\"],[\"cc40\",\"坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋\"],[\"cca1\",\"怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲\"],[\"cd40\",\"泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺\"],[\"cda1\",\"矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏\"],[\"ce40\",\"哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛\"],[\"cea1\",\"峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺\"],[\"cf40\",\"柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂\"],[\"cfa1\",\"洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀\"],[\"d040\",\"穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪\"],[\"d0a1\",\"苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱\"],[\"d140\",\"唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧\"],[\"d1a1\",\"恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤\"],[\"d240\",\"毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸\"],[\"d2a1\",\"牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐\"],[\"d340\",\"笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢\"],[\"d3a1\",\"荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐\"],[\"d440\",\"酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅\"],[\"d4a1\",\"唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏\"],[\"d540\",\"崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟\"],[\"d5a1\",\"捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉\"],[\"d640\",\"淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏\"],[\"d6a1\",\"痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟\"],[\"d740\",\"耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷\"],[\"d7a1\",\"蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪\"],[\"d840\",\"釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷\"],[\"d8a1\",\"堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔\"],[\"d940\",\"惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒\"],[\"d9a1\",\"晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞\"],[\"da40\",\"湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖\"],[\"daa1\",\"琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥\"],[\"db40\",\"罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳\"],[\"dba1\",\"菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺\"],[\"dc40\",\"軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈\"],[\"dca1\",\"隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆\"],[\"dd40\",\"媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤\"],[\"dda1\",\"搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼\"],[\"de40\",\"毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓\"],[\"dea1\",\"煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓\"],[\"df40\",\"稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯\"],[\"dfa1\",\"腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤\"],[\"e040\",\"觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿\"],[\"e0a1\",\"遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠\"],[\"e140\",\"凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠\"],[\"e1a1\",\"寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉\"],[\"e240\",\"榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊\"],[\"e2a1\",\"漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓\"],[\"e340\",\"禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞\"],[\"e3a1\",\"耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻\"],[\"e440\",\"裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍\"],[\"e4a1\",\"銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘\"],[\"e540\",\"噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉\"],[\"e5a1\",\"憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒\"],[\"e640\",\"澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙\"],[\"e6a1\",\"獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟\"],[\"e740\",\"膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢\"],[\"e7a1\",\"蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧\"],[\"e840\",\"踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓\"],[\"e8a1\",\"銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮\"],[\"e940\",\"噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺\"],[\"e9a1\",\"憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸\"],[\"ea40\",\"澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙\"],[\"eaa1\",\"瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘\"],[\"eb40\",\"蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠\"],[\"eba1\",\"諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌\"],[\"ec40\",\"錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕\"],[\"eca1\",\"魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎\"],[\"ed40\",\"檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶\"],[\"eda1\",\"瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞\"],[\"ee40\",\"蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞\"],[\"eea1\",\"謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜\"],[\"ef40\",\"鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰\"],[\"efa1\",\"鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶\"],[\"f040\",\"璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒\"],[\"f0a1\",\"臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧\"],[\"f140\",\"蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪\"],[\"f1a1\",\"鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰\"],[\"f240\",\"徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛\"],[\"f2a1\",\"礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕\"],[\"f340\",\"譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦\"],[\"f3a1\",\"鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲\"],[\"f440\",\"嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩\"],[\"f4a1\",\"禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿\"],[\"f540\",\"鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛\"],[\"f5a1\",\"鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥\"],[\"f640\",\"蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺\"],[\"f6a1\",\"騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚\"],[\"f740\",\"糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊\"],[\"f7a1\",\"驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾\"],[\"f840\",\"讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏\"],[\"f8a1\",\"齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚\"],[\"f940\",\"纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊\"],[\"f9a1\",\"龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓\"]]\n\n/***/ }),\n/* 396 */\n/***/ (function(module, exports) {\n\nmodule.exports = [[\"a140\",\"\",62],[\"a180\",\"\",32],[\"a240\",\"\",62],[\"a280\",\"\",32],[\"a2ab\",\"\",5],[\"a2e3\",\"€\"],[\"a2ef\",\"\"],[\"a2fd\",\"\"],[\"a340\",\"\",62],[\"a380\",\"\",31,\"　\"],[\"a440\",\"\",62],[\"a480\",\"\",32],[\"a4f4\",\"\",10],[\"a540\",\"\",62],[\"a580\",\"\",32],[\"a5f7\",\"\",7],[\"a640\",\"\",62],[\"a680\",\"\",32],[\"a6b9\",\"\",7],[\"a6d9\",\"\",6],[\"a6ec\",\"\"],[\"a6f3\",\"\"],[\"a6f6\",\"\",8],[\"a740\",\"\",62],[\"a780\",\"\",32],[\"a7c2\",\"\",14],[\"a7f2\",\"\",12],[\"a896\",\"\",10],[\"a8bc\",\"\"],[\"a8bf\",\"ǹ\"],[\"a8c1\",\"\"],[\"a8ea\",\"\",20],[\"a958\",\"\"],[\"a95b\",\"\"],[\"a95d\",\"\"],[\"a989\",\"〾⿰\",11],[\"a997\",\"\",12],[\"a9f0\",\"\",14],[\"aaa1\",\"\",93],[\"aba1\",\"\",93],[\"aca1\",\"\",93],[\"ada1\",\"\",93],[\"aea1\",\"\",93],[\"afa1\",\"\",93],[\"d7fa\",\"\",4],[\"f8a1\",\"\",93],[\"f9a1\",\"\",93],[\"faa1\",\"\",93],[\"fba1\",\"\",93],[\"fca1\",\"\",93],[\"fda1\",\"\",93],[\"fe50\",\"⺁⺄㑳㑇⺈⺋㖞㘚㘎⺌⺗㥮㤘㧏㧟㩳㧐㭎㱮㳠⺧⺪䁖䅟⺮䌷⺳⺶⺷䎱䎬⺻䏝䓖䙡䙌\"],[\"fe80\",\"䜣䜩䝼䞍⻊䥇䥺䥽䦂䦃䦅䦆䦟䦛䦷䦶䲣䲟䲠䲡䱷䲢䴓\",6,\"䶮\",93]]\n\n/***/ }),\n/* 397 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = __webpack_require__(569).isCI\n\n\n/***/ }),\n/* 398 */\n/***/ (function(module, exports) {\n\nvar toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n\n\n/***/ }),\n/* 399 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar stream = __webpack_require__(23)\n\n\nfunction isStream (obj) {\n  return obj instanceof stream.Stream\n}\n\n\nfunction isReadable (obj) {\n  return isStream(obj) && typeof obj._read == 'function' && typeof obj._readableState == 'object'\n}\n\n\nfunction isWritable (obj) {\n  return isStream(obj) && typeof obj._write == 'function' && typeof obj._writableState == 'object'\n}\n\n\nfunction isDuplex (obj) {\n  return isReadable(obj) && isWritable(obj)\n}\n\n\nmodule.exports            = isStream\nmodule.exports.isReadable = isReadable\nmodule.exports.isWritable = isWritable\nmodule.exports.isDuplex   = isDuplex\n\n\n/***/ }),\n/* 400 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * mime-types\n * Copyright(c) 2014 Jonathan Ong\n * Copyright(c) 2015 Douglas Christopher Wilson\n * MIT Licensed\n */\n\n\n\n/**\n * Module dependencies.\n * @private\n */\n\nvar db = __webpack_require__(759)\nvar extname = __webpack_require__(0).extname\n\n/**\n * Module variables.\n * @private\n */\n\nvar EXTRACT_TYPE_REGEXP = /^\\s*([^;\\s]*)(?:;|\\s|$)/\nvar TEXT_TYPE_REGEXP = /^text\\//i\n\n/**\n * Module exports.\n * @public\n */\n\nexports.charset = charset\nexports.charsets = { lookup: charset }\nexports.contentType = contentType\nexports.extension = extension\nexports.extensions = Object.create(null)\nexports.lookup = lookup\nexports.types = Object.create(null)\n\n// Populate the extensions/types maps\npopulateMaps(exports.extensions, exports.types)\n\n/**\n * Get the default charset for a MIME type.\n *\n * @param {string} type\n * @return {boolean|string}\n */\n\nfunction charset (type) {\n  if (!type || typeof type !== 'string') {\n    return false\n  }\n\n  // TODO: use media-typer\n  var match = EXTRACT_TYPE_REGEXP.exec(type)\n  var mime = match && db[match[1].toLowerCase()]\n\n  if (mime && mime.charset) {\n    return mime.charset\n  }\n\n  // default text/* to utf-8\n  if (match && TEXT_TYPE_REGEXP.test(match[1])) {\n    return 'UTF-8'\n  }\n\n  return false\n}\n\n/**\n * Create a full Content-Type header given a MIME type or extension.\n *\n * @param {string} str\n * @return {boolean|string}\n */\n\nfunction contentType (str) {\n  // TODO: should this even be in this module?\n  if (!str || typeof str !== 'string') {\n    return false\n  }\n\n  var mime = str.indexOf('/') === -1\n    ? exports.lookup(str)\n    : str\n\n  if (!mime) {\n    return false\n  }\n\n  // TODO: use content-type or other module\n  if (mime.indexOf('charset') === -1) {\n    var charset = exports.charset(mime)\n    if (charset) mime += '; charset=' + charset.toLowerCase()\n  }\n\n  return mime\n}\n\n/**\n * Get the default extension for a MIME type.\n *\n * @param {string} type\n * @return {boolean|string}\n */\n\nfunction extension (type) {\n  if (!type || typeof type !== 'string') {\n    return false\n  }\n\n  // TODO: use media-typer\n  var match = EXTRACT_TYPE_REGEXP.exec(type)\n\n  // get extensions\n  var exts = match && exports.extensions[match[1].toLowerCase()]\n\n  if (!exts || !exts.length) {\n    return false\n  }\n\n  return exts[0]\n}\n\n/**\n * Lookup the MIME type for a file path/extension.\n *\n * @param {string} path\n * @return {boolean|string}\n */\n\nfunction lookup (path) {\n  if (!path || typeof path !== 'string') {\n    return false\n  }\n\n  // get the extension (\"ext\" or \".ext\" or full path)\n  var extension = extname('x.' + path)\n    .toLowerCase()\n    .substr(1)\n\n  if (!extension) {\n    return false\n  }\n\n  return exports.types[extension] || false\n}\n\n/**\n * Populate the extensions and types maps.\n * @private\n */\n\nfunction populateMaps (extensions, types) {\n  // source preference (least -> most)\n  var preference = ['nginx', 'apache', undefined, 'iana']\n\n  Object.keys(db).forEach(function forEachMimeType (type) {\n    var mime = db[type]\n    var exts = mime.extensions\n\n    if (!exts || !exts.length) {\n      return\n    }\n\n    // mime -> extensions\n    extensions[type] = exts\n\n    // extension -> mime\n    for (var i = 0; i < exts.length; i++) {\n      var extension = exts[i]\n\n      if (types[extension]) {\n        var from = preference.indexOf(db[types[extension]].source)\n        var to = preference.indexOf(mime.source)\n\n        if (types[extension] !== 'application/octet-stream' &&\n          (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) {\n          // skip the remapping\n          continue\n        }\n      }\n\n      // set the extension -> mime\n      types[extension] = type\n    }\n  })\n}\n\n\n/***/ }),\n/* 401 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Stream = __webpack_require__(23)\n\nmodule.exports = MuteStream\n\n// var out = new MuteStream(process.stdout)\n// argument auto-pipes\nfunction MuteStream (opts) {\n  Stream.apply(this)\n  opts = opts || {}\n  this.writable = this.readable = true\n  this.muted = false\n  this.on('pipe', this._onpipe)\n  this.replace = opts.replace\n\n  // For readline-type situations\n  // This much at the start of a line being redrawn after a ctrl char\n  // is seen (such as backspace) won't be redrawn as the replacement\n  this._prompt = opts.prompt || null\n  this._hadControl = false\n}\n\nMuteStream.prototype = Object.create(Stream.prototype)\n\nObject.defineProperty(MuteStream.prototype, 'constructor', {\n  value: MuteStream,\n  enumerable: false\n})\n\nMuteStream.prototype.mute = function () {\n  this.muted = true\n}\n\nMuteStream.prototype.unmute = function () {\n  this.muted = false\n}\n\nObject.defineProperty(MuteStream.prototype, '_onpipe', {\n  value: onPipe,\n  enumerable: false,\n  writable: true,\n  configurable: true\n})\n\nfunction onPipe (src) {\n  this._src = src\n}\n\nObject.defineProperty(MuteStream.prototype, 'isTTY', {\n  get: getIsTTY,\n  set: setIsTTY,\n  enumerable: true,\n  configurable: true\n})\n\nfunction getIsTTY () {\n  return( (this._dest) ? this._dest.isTTY\n        : (this._src) ? this._src.isTTY\n        : false\n        )\n}\n\n// basically just get replace the getter/setter with a regular value\nfunction setIsTTY (isTTY) {\n  Object.defineProperty(this, 'isTTY', {\n    value: isTTY,\n    enumerable: true,\n    writable: true,\n    configurable: true\n  })\n}\n\nObject.defineProperty(MuteStream.prototype, 'rows', {\n  get: function () {\n    return( this._dest ? this._dest.rows\n          : this._src ? this._src.rows\n          : undefined )\n  }, enumerable: true, configurable: true })\n\nObject.defineProperty(MuteStream.prototype, 'columns', {\n  get: function () {\n    return( this._dest ? this._dest.columns\n          : this._src ? this._src.columns\n          : undefined )\n  }, enumerable: true, configurable: true })\n\n\nMuteStream.prototype.pipe = function (dest, options) {\n  this._dest = dest\n  return Stream.prototype.pipe.call(this, dest, options)\n}\n\nMuteStream.prototype.pause = function () {\n  if (this._src) return this._src.pause()\n}\n\nMuteStream.prototype.resume = function () {\n  if (this._src) return this._src.resume()\n}\n\nMuteStream.prototype.write = function (c) {\n  if (this.muted) {\n    if (!this.replace) return true\n    if (c.match(/^\\u001b/)) {\n      if(c.indexOf(this._prompt) === 0) {\n        c = c.substr(this._prompt.length);\n        c = c.replace(/./g, this.replace);\n        c = this._prompt + c;\n      }\n      this._hadControl = true\n      return this.emit('data', c)\n    } else {\n      if (this._prompt && this._hadControl &&\n          c.indexOf(this._prompt) === 0) {\n        this._hadControl = false\n        this.emit('data', this._prompt)\n        c = c.substr(this._prompt.length)\n      }\n      c = c.toString().replace(/./g, this.replace)\n    }\n  }\n  this.emit('data', c)\n}\n\nMuteStream.prototype.end = function (c) {\n  if (this.muted) {\n    if (c && this.replace) {\n      c = c.toString().replace(/./g, this.replace)\n    } else {\n      c = null\n    }\n  }\n  if (c) this.emit('data', c)\n  this.emit('end')\n}\n\nfunction proxy (fn) { return function () {\n  var d = this._dest\n  var s = this._src\n  if (d && d[fn]) d[fn].apply(d, arguments)\n  if (s && s[fn]) s[fn].apply(s, arguments)\n}}\n\nMuteStream.prototype.destroy = proxy('destroy')\nMuteStream.prototype.destroySoon = proxy('destroySoon')\nMuteStream.prototype.close = proxy('close')\n\n\n/***/ }),\n/* 402 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst url = __webpack_require__(24);\nconst punycode = __webpack_require__(305);\nconst queryString = __webpack_require__(786);\nconst prependHttp = __webpack_require__(777);\nconst sortKeys = __webpack_require__(934);\n\nconst DEFAULT_PORTS = {\n\t'http:': 80,\n\t'https:': 443,\n\t'ftp:': 21\n};\n\n// Protocols that always contain a `//`` bit\nconst slashedProtocol = {\n\thttp: true,\n\thttps: true,\n\tftp: true,\n\tgopher: true,\n\tfile: true,\n\t'http:': true,\n\t'https:': true,\n\t'ftp:': true,\n\t'gopher:': true,\n\t'file:': true\n};\n\nfunction testParameter(name, filters) {\n\treturn filters.some(filter => filter instanceof RegExp ? filter.test(name) : filter === name);\n}\n\nmodule.exports = (str, opts) => {\n\topts = Object.assign({\n\t\tnormalizeProtocol: true,\n\t\tnormalizeHttps: false,\n\t\tstripFragment: true,\n\t\tstripWWW: true,\n\t\tremoveQueryParameters: [/^utm_\\w+/i],\n\t\tremoveTrailingSlash: true,\n\t\tremoveDirectoryIndex: false,\n\t\tsortQueryParameters: true\n\t}, opts);\n\n\tif (typeof str !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\tconst hasRelativeProtocol = str.startsWith('//');\n\n\t// Prepend protocol\n\tstr = prependHttp(str.trim()).replace(/^\\/\\//, 'http://');\n\n\tconst urlObj = url.parse(str);\n\n\tif (opts.normalizeHttps && urlObj.protocol === 'https:') {\n\t\turlObj.protocol = 'http:';\n\t}\n\n\tif (!urlObj.hostname && !urlObj.pathname) {\n\t\tthrow new Error('Invalid URL');\n\t}\n\n\t// Prevent these from being used by `url.format`\n\tdelete urlObj.host;\n\tdelete urlObj.query;\n\n\t// Remove fragment\n\tif (opts.stripFragment) {\n\t\tdelete urlObj.hash;\n\t}\n\n\t// Remove default port\n\tconst port = DEFAULT_PORTS[urlObj.protocol];\n\tif (Number(urlObj.port) === port) {\n\t\tdelete urlObj.port;\n\t}\n\n\t// Remove duplicate slashes\n\tif (urlObj.pathname) {\n\t\turlObj.pathname = urlObj.pathname.replace(/\\/{2,}/g, '/');\n\t}\n\n\t// Decode URI octets\n\tif (urlObj.pathname) {\n\t\turlObj.pathname = decodeURI(urlObj.pathname);\n\t}\n\n\t// Remove directory index\n\tif (opts.removeDirectoryIndex === true) {\n\t\topts.removeDirectoryIndex = [/^index\\.[a-z]+$/];\n\t}\n\n\tif (Array.isArray(opts.removeDirectoryIndex) && opts.removeDirectoryIndex.length > 0) {\n\t\tlet pathComponents = urlObj.pathname.split('/');\n\t\tconst lastComponent = pathComponents[pathComponents.length - 1];\n\n\t\tif (testParameter(lastComponent, opts.removeDirectoryIndex)) {\n\t\t\tpathComponents = pathComponents.slice(0, pathComponents.length - 1);\n\t\t\turlObj.pathname = pathComponents.slice(1).join('/') + '/';\n\t\t}\n\t}\n\n\t// Resolve relative paths, but only for slashed protocols\n\tif (slashedProtocol[urlObj.protocol]) {\n\t\tconst domain = urlObj.protocol + '//' + urlObj.hostname;\n\t\tconst relative = url.resolve(domain, urlObj.pathname);\n\t\turlObj.pathname = relative.replace(domain, '');\n\t}\n\n\tif (urlObj.hostname) {\n\t\t// IDN to Unicode\n\t\turlObj.hostname = punycode.toUnicode(urlObj.hostname).toLowerCase();\n\n\t\t// Remove trailing dot\n\t\turlObj.hostname = urlObj.hostname.replace(/\\.$/, '');\n\n\t\t// Remove `www.`\n\t\tif (opts.stripWWW) {\n\t\t\turlObj.hostname = urlObj.hostname.replace(/^www\\./, '');\n\t\t}\n\t}\n\n\t// Remove URL with empty query string\n\tif (urlObj.search === '?') {\n\t\tdelete urlObj.search;\n\t}\n\n\tconst queryParameters = queryString.parse(urlObj.search);\n\n\t// Remove query unwanted parameters\n\tif (Array.isArray(opts.removeQueryParameters)) {\n\t\tfor (const key in queryParameters) {\n\t\t\tif (testParameter(key, opts.removeQueryParameters)) {\n\t\t\t\tdelete queryParameters[key];\n\t\t\t}\n\t\t}\n\t}\n\n\t// Sort query parameters\n\tif (opts.sortQueryParameters) {\n\t\turlObj.search = queryString.stringify(sortKeys(queryParameters));\n\t}\n\n\t// Decode query parameters\n\tif (urlObj.search !== null) {\n\t\turlObj.search = decodeURIComponent(urlObj.search);\n\t}\n\n\t// Take advantage of many of the Node `url` normalizations\n\tstr = url.format(urlObj);\n\n\t// Remove ending `/`\n\tif (opts.removeTrailingSlash || urlObj.pathname === '/') {\n\t\tstr = str.replace(/\\/$/, '');\n\t}\n\n\t// Restore relative protocol, if applicable\n\tif (hasRelativeProtocol && !opts.normalizeProtocol) {\n\t\tstr = str.replace(/^http:\\/\\//, '//');\n\t}\n\n\treturn str;\n};\n\n\n/***/ }),\n/* 403 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nmodule.exports = {\n    'default': 'RFC3986',\n    formatters: {\n        RFC1738: function (value) {\n            return replace.call(value, percentTwenties, '+');\n        },\n        RFC3986: function (value) {\n            return value;\n        }\n    },\n    RFC1738: 'RFC1738',\n    RFC3986: 'RFC3986'\n};\n\n\n/***/ }),\n/* 404 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar stringify = __webpack_require__(785);\nvar parse = __webpack_require__(784);\nvar formats = __webpack_require__(403);\n\nmodule.exports = {\n    formats: formats,\n    parse: parse,\n    stringify: stringify\n};\n\n\n/***/ }),\n/* 405 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar hexTable = (function () {\n    var array = [];\n    for (var i = 0; i < 256; ++i) {\n        array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n    }\n\n    return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n    var obj;\n\n    while (queue.length) {\n        var item = queue.pop();\n        obj = item.obj[item.prop];\n\n        if (Array.isArray(obj)) {\n            var compacted = [];\n\n            for (var j = 0; j < obj.length; ++j) {\n                if (typeof obj[j] !== 'undefined') {\n                    compacted.push(obj[j]);\n                }\n            }\n\n            item.obj[item.prop] = compacted;\n        }\n    }\n\n    return obj;\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n    var obj = options && options.plainObjects ? Object.create(null) : {};\n    for (var i = 0; i < source.length; ++i) {\n        if (typeof source[i] !== 'undefined') {\n            obj[i] = source[i];\n        }\n    }\n\n    return obj;\n};\n\nvar merge = function merge(target, source, options) {\n    if (!source) {\n        return target;\n    }\n\n    if (typeof source !== 'object') {\n        if (Array.isArray(target)) {\n            target.push(source);\n        } else if (typeof target === 'object') {\n            if (options.plainObjects || options.allowPrototypes || !has.call(Object.prototype, source)) {\n                target[source] = true;\n            }\n        } else {\n            return [target, source];\n        }\n\n        return target;\n    }\n\n    if (typeof target !== 'object') {\n        return [target].concat(source);\n    }\n\n    var mergeTarget = target;\n    if (Array.isArray(target) && !Array.isArray(source)) {\n        mergeTarget = arrayToObject(target, options);\n    }\n\n    if (Array.isArray(target) && Array.isArray(source)) {\n        source.forEach(function (item, i) {\n            if (has.call(target, i)) {\n                if (target[i] && typeof target[i] === 'object') {\n                    target[i] = merge(target[i], item, options);\n                } else {\n                    target.push(item);\n                }\n            } else {\n                target[i] = item;\n            }\n        });\n        return target;\n    }\n\n    return Object.keys(source).reduce(function (acc, key) {\n        var value = source[key];\n\n        if (has.call(acc, key)) {\n            acc[key] = merge(acc[key], value, options);\n        } else {\n            acc[key] = value;\n        }\n        return acc;\n    }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n    return Object.keys(source).reduce(function (acc, key) {\n        acc[key] = source[key];\n        return acc;\n    }, target);\n};\n\nvar decode = function (str) {\n    try {\n        return decodeURIComponent(str.replace(/\\+/g, ' '));\n    } catch (e) {\n        return str;\n    }\n};\n\nvar encode = function encode(str) {\n    // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n    // It has been adapted here for stricter adherence to RFC 3986\n    if (str.length === 0) {\n        return str;\n    }\n\n    var string = typeof str === 'string' ? str : String(str);\n\n    var out = '';\n    for (var i = 0; i < string.length; ++i) {\n        var c = string.charCodeAt(i);\n\n        if (\n            c === 0x2D // -\n            || c === 0x2E // .\n            || c === 0x5F // _\n            || c === 0x7E // ~\n            || (c >= 0x30 && c <= 0x39) // 0-9\n            || (c >= 0x41 && c <= 0x5A) // a-z\n            || (c >= 0x61 && c <= 0x7A) // A-Z\n        ) {\n            out += string.charAt(i);\n            continue;\n        }\n\n        if (c < 0x80) {\n            out = out + hexTable[c];\n            continue;\n        }\n\n        if (c < 0x800) {\n            out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);\n            continue;\n        }\n\n        if (c < 0xD800 || c >= 0xE000) {\n            out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);\n            continue;\n        }\n\n        i += 1;\n        c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));\n        out += hexTable[0xF0 | (c >> 18)]\n            + hexTable[0x80 | ((c >> 12) & 0x3F)]\n            + hexTable[0x80 | ((c >> 6) & 0x3F)]\n            + hexTable[0x80 | (c & 0x3F)];\n    }\n\n    return out;\n};\n\nvar compact = function compact(value) {\n    var queue = [{ obj: { o: value }, prop: 'o' }];\n    var refs = [];\n\n    for (var i = 0; i < queue.length; ++i) {\n        var item = queue[i];\n        var obj = item.obj[item.prop];\n\n        var keys = Object.keys(obj);\n        for (var j = 0; j < keys.length; ++j) {\n            var key = keys[j];\n            var val = obj[key];\n            if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n                queue.push({ obj: obj, prop: key });\n                refs.push(val);\n            }\n        }\n    }\n\n    return compactQueue(queue);\n};\n\nvar isRegExp = function isRegExp(obj) {\n    return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n    if (obj === null || typeof obj === 'undefined') {\n        return false;\n    }\n\n    return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nmodule.exports = {\n    arrayToObject: arrayToObject,\n    assign: assign,\n    compact: compact,\n    decode: decode,\n    encode: encode,\n    isBuffer: isBuffer,\n    isRegExp: isRegExp,\n    merge: merge\n};\n\n\n/***/ }),\n/* 406 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n/*<replacement>*/\n\nvar pna = __webpack_require__(181);\n/*</replacement>*/\n\nmodule.exports = Readable;\n\n/*<replacement>*/\nvar isArray = __webpack_require__(398);\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nReadable.ReadableState = ReadableState;\n\n/*<replacement>*/\nvar EE = __webpack_require__(77).EventEmitter;\n\nvar EElistenerCount = function (emitter, type) {\n  return emitter.listeners(type).length;\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream = __webpack_require__(410);\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar Buffer = __webpack_require__(46).Buffer;\nvar OurUint8Array = global.Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n  return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/*</replacement>*/\n\n/*<replacement>*/\nvar util = __webpack_require__(113);\nutil.inherits = __webpack_require__(61);\n/*</replacement>*/\n\n/*<replacement>*/\nvar debugUtil = __webpack_require__(3);\nvar debug = void 0;\nif (debugUtil && debugUtil.debuglog) {\n  debug = debugUtil.debuglog('stream');\n} else {\n  debug = function () {};\n}\n/*</replacement>*/\n\nvar BufferList = __webpack_require__(793);\nvar destroyImpl = __webpack_require__(409);\nvar StringDecoder;\n\nutil.inherits(Readable, Stream);\n\nvar kProxyEvents = ['error', 'close', 'destroy', 'pause', 'resume'];\n\nfunction prependListener(emitter, event, fn) {\n  // Sadly this is not cacheable as some libraries bundle their own\n  // event emitter implementation with them.\n  if (typeof emitter.prependListener === 'function') return emitter.prependListener(event, fn);\n\n  // This is a hack to make sure that our error handler is attached before any\n  // userland ones.  NEVER DO THIS. This is here only because this code needs\n  // to continue to work with older versions of Node.js that do not include\n  // the prependListener() method. The goal is to eventually remove this hack.\n  if (!emitter._events || !emitter._events[event]) emitter.on(event, fn);else if (isArray(emitter._events[event])) emitter._events[event].unshift(fn);else emitter._events[event] = [fn, emitter._events[event]];\n}\n\nfunction ReadableState(options, stream) {\n  Duplex = Duplex || __webpack_require__(116);\n\n  options = options || {};\n\n  // Duplex streams are both readable and writable, but share\n  // the same options object.\n  // However, some cases require setting options to different\n  // values for the readable and the writable sides of the duplex stream.\n  // These options can be provided separately as readableXXX and writableXXX.\n  var isDuplex = stream instanceof Duplex;\n\n  // object stream flag. Used to make read(n) ignore n and to\n  // make all the buffer merging and length checks go away\n  this.objectMode = !!options.objectMode;\n\n  if (isDuplex) this.objectMode = this.objectMode || !!options.readableObjectMode;\n\n  // the point at which it stops calling _read() to fill the buffer\n  // Note: 0 is a valid value, means \"don't call _read preemptively ever\"\n  var hwm = options.highWaterMark;\n  var readableHwm = options.readableHighWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (readableHwm || readableHwm === 0)) this.highWaterMark = readableHwm;else this.highWaterMark = defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = Math.floor(this.highWaterMark);\n\n  // A linked list is used to store data chunks instead of an array because the\n  // linked list can remove elements from the beginning faster than\n  // array.shift()\n  this.buffer = new BufferList();\n  this.length = 0;\n  this.pipes = null;\n  this.pipesCount = 0;\n  this.flowing = null;\n  this.ended = false;\n  this.endEmitted = false;\n  this.reading = false;\n\n  // a flag to be able to tell if the event 'readable'/'data' is emitted\n  // immediately, or on a later tick.  We set this to true at first, because\n  // any actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first read call.\n  this.sync = true;\n\n  // whenever we return null, then we set a flag to say\n  // that we're awaiting a 'readable' event emission.\n  this.needReadable = false;\n  this.emittedReadable = false;\n  this.readableListening = false;\n  this.resumeScheduled = false;\n\n  // has it been destroyed\n  this.destroyed = false;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // the number of writers that are awaiting a drain event in .pipe()s\n  this.awaitDrain = 0;\n\n  // if true, a maybeReadMore has been scheduled\n  this.readingMore = false;\n\n  this.decoder = null;\n  this.encoding = null;\n  if (options.encoding) {\n    if (!StringDecoder) StringDecoder = __webpack_require__(458).StringDecoder;\n    this.decoder = new StringDecoder(options.encoding);\n    this.encoding = options.encoding;\n  }\n}\n\nfunction Readable(options) {\n  Duplex = Duplex || __webpack_require__(116);\n\n  if (!(this instanceof Readable)) return new Readable(options);\n\n  this._readableState = new ReadableState(options, this);\n\n  // legacy\n  this.readable = true;\n\n  if (options) {\n    if (typeof options.read === 'function') this._read = options.read;\n\n    if (typeof options.destroy === 'function') this._destroy = options.destroy;\n  }\n\n  Stream.call(this);\n}\n\nObject.defineProperty(Readable.prototype, 'destroyed', {\n  get: function () {\n    if (this._readableState === undefined) {\n      return false;\n    }\n    return this._readableState.destroyed;\n  },\n  set: function (value) {\n    // we ignore the value if the stream\n    // has not been initialized yet\n    if (!this._readableState) {\n      return;\n    }\n\n    // backward compatibility, the user is explicitly\n    // managing destroyed\n    this._readableState.destroyed = value;\n  }\n});\n\nReadable.prototype.destroy = destroyImpl.destroy;\nReadable.prototype._undestroy = destroyImpl.undestroy;\nReadable.prototype._destroy = function (err, cb) {\n  this.push(null);\n  cb(err);\n};\n\n// Manually shove something into the read() buffer.\n// This returns true if the highWaterMark has not been hit yet,\n// similar to how Writable.write() returns true if you should\n// write() some more.\nReadable.prototype.push = function (chunk, encoding) {\n  var state = this._readableState;\n  var skipChunkCheck;\n\n  if (!state.objectMode) {\n    if (typeof chunk === 'string') {\n      encoding = encoding || state.defaultEncoding;\n      if (encoding !== state.encoding) {\n        chunk = Buffer.from(chunk, encoding);\n        encoding = '';\n      }\n      skipChunkCheck = true;\n    }\n  } else {\n    skipChunkCheck = true;\n  }\n\n  return readableAddChunk(this, chunk, encoding, false, skipChunkCheck);\n};\n\n// Unshift should *always* be something directly out of read()\nReadable.prototype.unshift = function (chunk) {\n  return readableAddChunk(this, chunk, null, true, false);\n};\n\nfunction readableAddChunk(stream, chunk, encoding, addToFront, skipChunkCheck) {\n  var state = stream._readableState;\n  if (chunk === null) {\n    state.reading = false;\n    onEofChunk(stream, state);\n  } else {\n    var er;\n    if (!skipChunkCheck) er = chunkInvalid(state, chunk);\n    if (er) {\n      stream.emit('error', er);\n    } else if (state.objectMode || chunk && chunk.length > 0) {\n      if (typeof chunk !== 'string' && !state.objectMode && Object.getPrototypeOf(chunk) !== Buffer.prototype) {\n        chunk = _uint8ArrayToBuffer(chunk);\n      }\n\n      if (addToFront) {\n        if (state.endEmitted) stream.emit('error', new Error('stream.unshift() after end event'));else addChunk(stream, state, chunk, true);\n      } else if (state.ended) {\n        stream.emit('error', new Error('stream.push() after EOF'));\n      } else {\n        state.reading = false;\n        if (state.decoder && !encoding) {\n          chunk = state.decoder.write(chunk);\n          if (state.objectMode || chunk.length !== 0) addChunk(stream, state, chunk, false);else maybeReadMore(stream, state);\n        } else {\n          addChunk(stream, state, chunk, false);\n        }\n      }\n    } else if (!addToFront) {\n      state.reading = false;\n    }\n  }\n\n  return needMoreData(state);\n}\n\nfunction addChunk(stream, state, chunk, addToFront) {\n  if (state.flowing && state.length === 0 && !state.sync) {\n    stream.emit('data', chunk);\n    stream.read(0);\n  } else {\n    // update the buffer info.\n    state.length += state.objectMode ? 1 : chunk.length;\n    if (addToFront) state.buffer.unshift(chunk);else state.buffer.push(chunk);\n\n    if (state.needReadable) emitReadable(stream);\n  }\n  maybeReadMore(stream, state);\n}\n\nfunction chunkInvalid(state, chunk) {\n  var er;\n  if (!_isUint8Array(chunk) && typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  return er;\n}\n\n// if it's past the high water mark, we can push in some more.\n// Also, if we have no data yet, we can stand some\n// more bytes.  This is to work around cases where hwm=0,\n// such as the repl.  Also, if the push() triggered a\n// readable event, and the user called read(largeNumber) such that\n// needReadable was set, then we ought to push more, so that another\n// 'readable' event will be triggered.\nfunction needMoreData(state) {\n  return !state.ended && (state.needReadable || state.length < state.highWaterMark || state.length === 0);\n}\n\nReadable.prototype.isPaused = function () {\n  return this._readableState.flowing === false;\n};\n\n// backwards compatibility.\nReadable.prototype.setEncoding = function (enc) {\n  if (!StringDecoder) StringDecoder = __webpack_require__(458).StringDecoder;\n  this._readableState.decoder = new StringDecoder(enc);\n  this._readableState.encoding = enc;\n  return this;\n};\n\n// Don't raise the hwm > 8MB\nvar MAX_HWM = 0x800000;\nfunction computeNewHighWaterMark(n) {\n  if (n >= MAX_HWM) {\n    n = MAX_HWM;\n  } else {\n    // Get the next highest power of 2 to prevent increasing hwm excessively in\n    // tiny amounts\n    n--;\n    n |= n >>> 1;\n    n |= n >>> 2;\n    n |= n >>> 4;\n    n |= n >>> 8;\n    n |= n >>> 16;\n    n++;\n  }\n  return n;\n}\n\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction howMuchToRead(n, state) {\n  if (n <= 0 || state.length === 0 && state.ended) return 0;\n  if (state.objectMode) return 1;\n  if (n !== n) {\n    // Only flow one buffer at a time\n    if (state.flowing && state.length) return state.buffer.head.data.length;else return state.length;\n  }\n  // If we're asking for more than the current hwm, then raise the hwm.\n  if (n > state.highWaterMark) state.highWaterMark = computeNewHighWaterMark(n);\n  if (n <= state.length) return n;\n  // Don't have enough\n  if (!state.ended) {\n    state.needReadable = true;\n    return 0;\n  }\n  return state.length;\n}\n\n// you can override either this method, or the async _read(n) below.\nReadable.prototype.read = function (n) {\n  debug('read', n);\n  n = parseInt(n, 10);\n  var state = this._readableState;\n  var nOrig = n;\n\n  if (n !== 0) state.emittedReadable = false;\n\n  // if we're doing read(0) to trigger a readable event, but we\n  // already have a bunch of data in the buffer, then just trigger\n  // the 'readable' event and move on.\n  if (n === 0 && state.needReadable && (state.length >= state.highWaterMark || state.ended)) {\n    debug('read: emitReadable', state.length, state.ended);\n    if (state.length === 0 && state.ended) endReadable(this);else emitReadable(this);\n    return null;\n  }\n\n  n = howMuchToRead(n, state);\n\n  // if we've ended, and we're now clear, then finish it up.\n  if (n === 0 && state.ended) {\n    if (state.length === 0) endReadable(this);\n    return null;\n  }\n\n  // All the actual chunk generation logic needs to be\n  // *below* the call to _read.  The reason is that in certain\n  // synthetic stream cases, such as passthrough streams, _read\n  // may be a completely synchronous operation which may change\n  // the state of the read buffer, providing enough data when\n  // before there was *not* enough.\n  //\n  // So, the steps are:\n  // 1. Figure out what the state of things will be after we do\n  // a read from the buffer.\n  //\n  // 2. If that resulting state will trigger a _read, then call _read.\n  // Note that this may be asynchronous, or synchronous.  Yes, it is\n  // deeply ugly to write APIs this way, but that still doesn't mean\n  // that the Readable class should behave improperly, as streams are\n  // designed to be sync/async agnostic.\n  // Take note if the _read call is sync or async (ie, if the read call\n  // has returned yet), so that we know whether or not it's safe to emit\n  // 'readable' etc.\n  //\n  // 3. Actually pull the requested chunks out of the buffer and return.\n\n  // if we need a readable event, then we need to do some reading.\n  var doRead = state.needReadable;\n  debug('need readable', doRead);\n\n  // if we currently have less than the highWaterMark, then also read some\n  if (state.length === 0 || state.length - n < state.highWaterMark) {\n    doRead = true;\n    debug('length less than watermark', doRead);\n  }\n\n  // however, if we've ended, then there's no point, and if we're already\n  // reading, then it's unnecessary.\n  if (state.ended || state.reading) {\n    doRead = false;\n    debug('reading or ended', doRead);\n  } else if (doRead) {\n    debug('do read');\n    state.reading = true;\n    state.sync = true;\n    // if the length is currently zero, then we *need* a readable event.\n    if (state.length === 0) state.needReadable = true;\n    // call internal read method\n    this._read(state.highWaterMark);\n    state.sync = false;\n    // If _read pushed data synchronously, then `reading` will be false,\n    // and we need to re-evaluate how much data we can return to the user.\n    if (!state.reading) n = howMuchToRead(nOrig, state);\n  }\n\n  var ret;\n  if (n > 0) ret = fromList(n, state);else ret = null;\n\n  if (ret === null) {\n    state.needReadable = true;\n    n = 0;\n  } else {\n    state.length -= n;\n  }\n\n  if (state.length === 0) {\n    // If we have nothing in the buffer, then we want to know\n    // as soon as we *do* get something into the buffer.\n    if (!state.ended) state.needReadable = true;\n\n    // If we tried to read() past the EOF, then emit end on the next tick.\n    if (nOrig !== n && state.ended) endReadable(this);\n  }\n\n  if (ret !== null) this.emit('data', ret);\n\n  return ret;\n};\n\nfunction onEofChunk(stream, state) {\n  if (state.ended) return;\n  if (state.decoder) {\n    var chunk = state.decoder.end();\n    if (chunk && chunk.length) {\n      state.buffer.push(chunk);\n      state.length += state.objectMode ? 1 : chunk.length;\n    }\n  }\n  state.ended = true;\n\n  // emit 'readable' now to make sure it gets picked up.\n  emitReadable(stream);\n}\n\n// Don't emit readable right away in sync mode, because this can trigger\n// another read() call => stack overflow.  This way, it might trigger\n// a nextTick recursion warning, but that's not so bad.\nfunction emitReadable(stream) {\n  var state = stream._readableState;\n  state.needReadable = false;\n  if (!state.emittedReadable) {\n    debug('emitReadable', state.flowing);\n    state.emittedReadable = true;\n    if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream);\n  }\n}\n\nfunction emitReadable_(stream) {\n  debug('emit readable');\n  stream.emit('readable');\n  flow(stream);\n}\n\n// at this point, the user has presumably seen the 'readable' event,\n// and called read() to consume some data.  that may have triggered\n// in turn another _read(n) call, in which case reading = true if\n// it's in progress.\n// However, if we're not ended, or reading, and the length < hwm,\n// then go ahead and try to read some more preemptively.\nfunction maybeReadMore(stream, state) {\n  if (!state.readingMore) {\n    state.readingMore = true;\n    pna.nextTick(maybeReadMore_, stream, state);\n  }\n}\n\nfunction maybeReadMore_(stream, state) {\n  var len = state.length;\n  while (!state.reading && !state.flowing && !state.ended && state.length < state.highWaterMark) {\n    debug('maybeReadMore read 0');\n    stream.read(0);\n    if (len === state.length)\n      // didn't get any data, stop spinning.\n      break;else len = state.length;\n  }\n  state.readingMore = false;\n}\n\n// abstract method.  to be overridden in specific implementation classes.\n// call cb(er, data) where data is <= n in length.\n// for virtual (non-string, non-buffer) streams, \"length\" is somewhat\n// arbitrary, and perhaps not very meaningful.\nReadable.prototype._read = function (n) {\n  this.emit('error', new Error('_read() is not implemented'));\n};\n\nReadable.prototype.pipe = function (dest, pipeOpts) {\n  var src = this;\n  var state = this._readableState;\n\n  switch (state.pipesCount) {\n    case 0:\n      state.pipes = dest;\n      break;\n    case 1:\n      state.pipes = [state.pipes, dest];\n      break;\n    default:\n      state.pipes.push(dest);\n      break;\n  }\n  state.pipesCount += 1;\n  debug('pipe count=%d opts=%j', state.pipesCount, pipeOpts);\n\n  var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr;\n\n  var endFn = doEnd ? onend : unpipe;\n  if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn);\n\n  dest.on('unpipe', onunpipe);\n  function onunpipe(readable, unpipeInfo) {\n    debug('onunpipe');\n    if (readable === src) {\n      if (unpipeInfo && unpipeInfo.hasUnpiped === false) {\n        unpipeInfo.hasUnpiped = true;\n        cleanup();\n      }\n    }\n  }\n\n  function onend() {\n    debug('onend');\n    dest.end();\n  }\n\n  // when the dest drains, it reduces the awaitDrain counter\n  // on the source.  This would be more elegant with a .once()\n  // handler in flow(), but adding and removing repeatedly is\n  // too slow.\n  var ondrain = pipeOnDrain(src);\n  dest.on('drain', ondrain);\n\n  var cleanedUp = false;\n  function cleanup() {\n    debug('cleanup');\n    // cleanup event handlers once the pipe is broken\n    dest.removeListener('close', onclose);\n    dest.removeListener('finish', onfinish);\n    dest.removeListener('drain', ondrain);\n    dest.removeListener('error', onerror);\n    dest.removeListener('unpipe', onunpipe);\n    src.removeListener('end', onend);\n    src.removeListener('end', unpipe);\n    src.removeListener('data', ondata);\n\n    cleanedUp = true;\n\n    // if the reader is waiting for a drain event from this\n    // specific writer, then it would cause it to never start\n    // flowing again.\n    // So, if this is awaiting a drain, then we just call it now.\n    // If we don't know, then assume that we are waiting for one.\n    if (state.awaitDrain && (!dest._writableState || dest._writableState.needDrain)) ondrain();\n  }\n\n  // If the user pushes more data while we're writing to dest then we'll end up\n  // in ondata again. However, we only want to increase awaitDrain once because\n  // dest will only emit one 'drain' event for the multiple writes.\n  // => Introduce a guard on increasing awaitDrain.\n  var increasedAwaitDrain = false;\n  src.on('data', ondata);\n  function ondata(chunk) {\n    debug('ondata');\n    increasedAwaitDrain = false;\n    var ret = dest.write(chunk);\n    if (false === ret && !increasedAwaitDrain) {\n      // If the user unpiped during `dest.write()`, it is possible\n      // to get stuck in a permanently paused state if that write\n      // also returned false.\n      // => Check whether `dest` is still a piping destination.\n      if ((state.pipesCount === 1 && state.pipes === dest || state.pipesCount > 1 && indexOf(state.pipes, dest) !== -1) && !cleanedUp) {\n        debug('false write response, pause', src._readableState.awaitDrain);\n        src._readableState.awaitDrain++;\n        increasedAwaitDrain = true;\n      }\n      src.pause();\n    }\n  }\n\n  // if the dest has an error, then stop piping into it.\n  // however, don't suppress the throwing behavior for this.\n  function onerror(er) {\n    debug('onerror', er);\n    unpipe();\n    dest.removeListener('error', onerror);\n    if (EElistenerCount(dest, 'error') === 0) dest.emit('error', er);\n  }\n\n  // Make sure our error handler is attached before userland ones.\n  prependListener(dest, 'error', onerror);\n\n  // Both close and finish should trigger unpipe, but only once.\n  function onclose() {\n    dest.removeListener('finish', onfinish);\n    unpipe();\n  }\n  dest.once('close', onclose);\n  function onfinish() {\n    debug('onfinish');\n    dest.removeListener('close', onclose);\n    unpipe();\n  }\n  dest.once('finish', onfinish);\n\n  function unpipe() {\n    debug('unpipe');\n    src.unpipe(dest);\n  }\n\n  // tell the dest that it's being piped to\n  dest.emit('pipe', src);\n\n  // start the flow if it hasn't been started already.\n  if (!state.flowing) {\n    debug('pipe resume');\n    src.resume();\n  }\n\n  return dest;\n};\n\nfunction pipeOnDrain(src) {\n  return function () {\n    var state = src._readableState;\n    debug('pipeOnDrain', state.awaitDrain);\n    if (state.awaitDrain) state.awaitDrain--;\n    if (state.awaitDrain === 0 && EElistenerCount(src, 'data')) {\n      state.flowing = true;\n      flow(src);\n    }\n  };\n}\n\nReadable.prototype.unpipe = function (dest) {\n  var state = this._readableState;\n  var unpipeInfo = { hasUnpiped: false };\n\n  // if we're not piping anywhere, then do nothing.\n  if (state.pipesCount === 0) return this;\n\n  // just one destination.  most common case.\n  if (state.pipesCount === 1) {\n    // passed in one, but it's not the right one.\n    if (dest && dest !== state.pipes) return this;\n\n    if (!dest) dest = state.pipes;\n\n    // got a match.\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n    if (dest) dest.emit('unpipe', this, unpipeInfo);\n    return this;\n  }\n\n  // slow case. multiple pipe destinations.\n\n  if (!dest) {\n    // remove all.\n    var dests = state.pipes;\n    var len = state.pipesCount;\n    state.pipes = null;\n    state.pipesCount = 0;\n    state.flowing = false;\n\n    for (var i = 0; i < len; i++) {\n      dests[i].emit('unpipe', this, unpipeInfo);\n    }return this;\n  }\n\n  // try to find the right one.\n  var index = indexOf(state.pipes, dest);\n  if (index === -1) return this;\n\n  state.pipes.splice(index, 1);\n  state.pipesCount -= 1;\n  if (state.pipesCount === 1) state.pipes = state.pipes[0];\n\n  dest.emit('unpipe', this, unpipeInfo);\n\n  return this;\n};\n\n// set up data events if they are asked for\n// Ensure readable listeners eventually get something\nReadable.prototype.on = function (ev, fn) {\n  var res = Stream.prototype.on.call(this, ev, fn);\n\n  if (ev === 'data') {\n    // Start flowing on next tick if stream isn't explicitly paused\n    if (this._readableState.flowing !== false) this.resume();\n  } else if (ev === 'readable') {\n    var state = this._readableState;\n    if (!state.endEmitted && !state.readableListening) {\n      state.readableListening = state.needReadable = true;\n      state.emittedReadable = false;\n      if (!state.reading) {\n        pna.nextTick(nReadingNextTick, this);\n      } else if (state.length) {\n        emitReadable(this);\n      }\n    }\n  }\n\n  return res;\n};\nReadable.prototype.addListener = Readable.prototype.on;\n\nfunction nReadingNextTick(self) {\n  debug('readable nexttick read 0');\n  self.read(0);\n}\n\n// pause() and resume() are remnants of the legacy readable stream API\n// If the user uses them, then switch into old mode.\nReadable.prototype.resume = function () {\n  var state = this._readableState;\n  if (!state.flowing) {\n    debug('resume');\n    state.flowing = true;\n    resume(this, state);\n  }\n  return this;\n};\n\nfunction resume(stream, state) {\n  if (!state.resumeScheduled) {\n    state.resumeScheduled = true;\n    pna.nextTick(resume_, stream, state);\n  }\n}\n\nfunction resume_(stream, state) {\n  if (!state.reading) {\n    debug('resume read 0');\n    stream.read(0);\n  }\n\n  state.resumeScheduled = false;\n  state.awaitDrain = 0;\n  stream.emit('resume');\n  flow(stream);\n  if (state.flowing && !state.reading) stream.read(0);\n}\n\nReadable.prototype.pause = function () {\n  debug('call pause flowing=%j', this._readableState.flowing);\n  if (false !== this._readableState.flowing) {\n    debug('pause');\n    this._readableState.flowing = false;\n    this.emit('pause');\n  }\n  return this;\n};\n\nfunction flow(stream) {\n  var state = stream._readableState;\n  debug('flow', state.flowing);\n  while (state.flowing && stream.read() !== null) {}\n}\n\n// wrap an old-style stream as the async data source.\n// This is *not* part of the readable stream interface.\n// It is an ugly unfortunate mess of history.\nReadable.prototype.wrap = function (stream) {\n  var _this = this;\n\n  var state = this._readableState;\n  var paused = false;\n\n  stream.on('end', function () {\n    debug('wrapped end');\n    if (state.decoder && !state.ended) {\n      var chunk = state.decoder.end();\n      if (chunk && chunk.length) _this.push(chunk);\n    }\n\n    _this.push(null);\n  });\n\n  stream.on('data', function (chunk) {\n    debug('wrapped data');\n    if (state.decoder) chunk = state.decoder.write(chunk);\n\n    // don't skip over falsy values in objectMode\n    if (state.objectMode && (chunk === null || chunk === undefined)) return;else if (!state.objectMode && (!chunk || !chunk.length)) return;\n\n    var ret = _this.push(chunk);\n    if (!ret) {\n      paused = true;\n      stream.pause();\n    }\n  });\n\n  // proxy all the other methods.\n  // important when wrapping filters and duplexes.\n  for (var i in stream) {\n    if (this[i] === undefined && typeof stream[i] === 'function') {\n      this[i] = function (method) {\n        return function () {\n          return stream[method].apply(stream, arguments);\n        };\n      }(i);\n    }\n  }\n\n  // proxy certain important events.\n  for (var n = 0; n < kProxyEvents.length; n++) {\n    stream.on(kProxyEvents[n], this.emit.bind(this, kProxyEvents[n]));\n  }\n\n  // when we try to consume some more bytes, simply unpause the\n  // underlying stream.\n  this._read = function (n) {\n    debug('wrapped _read', n);\n    if (paused) {\n      paused = false;\n      stream.resume();\n    }\n  };\n\n  return this;\n};\n\nObject.defineProperty(Readable.prototype, 'readableHighWaterMark', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function () {\n    return this._readableState.highWaterMark;\n  }\n});\n\n// exposed for testing purposes only.\nReadable._fromList = fromList;\n\n// Pluck off n bytes from an array of buffers.\n// Length is the combined lengths of all the buffers in the list.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromList(n, state) {\n  // nothing buffered\n  if (state.length === 0) return null;\n\n  var ret;\n  if (state.objectMode) ret = state.buffer.shift();else if (!n || n >= state.length) {\n    // read it all, truncate the list\n    if (state.decoder) ret = state.buffer.join('');else if (state.buffer.length === 1) ret = state.buffer.head.data;else ret = state.buffer.concat(state.length);\n    state.buffer.clear();\n  } else {\n    // read part of list\n    ret = fromListPartial(n, state.buffer, state.decoder);\n  }\n\n  return ret;\n}\n\n// Extracts only enough buffered data to satisfy the amount requested.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction fromListPartial(n, list, hasStrings) {\n  var ret;\n  if (n < list.head.data.length) {\n    // slice is the same for buffers and strings\n    ret = list.head.data.slice(0, n);\n    list.head.data = list.head.data.slice(n);\n  } else if (n === list.head.data.length) {\n    // first chunk is a perfect match\n    ret = list.shift();\n  } else {\n    // result spans more than one buffer\n    ret = hasStrings ? copyFromBufferString(n, list) : copyFromBuffer(n, list);\n  }\n  return ret;\n}\n\n// Copies a specified amount of characters from the list of buffered data\n// chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBufferString(n, list) {\n  var p = list.head;\n  var c = 1;\n  var ret = p.data;\n  n -= ret.length;\n  while (p = p.next) {\n    var str = p.data;\n    var nb = n > str.length ? str.length : n;\n    if (nb === str.length) ret += str;else ret += str.slice(0, n);\n    n -= nb;\n    if (n === 0) {\n      if (nb === str.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = str.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\n// Copies a specified amount of bytes from the list of buffered data chunks.\n// This function is designed to be inlinable, so please take care when making\n// changes to the function body.\nfunction copyFromBuffer(n, list) {\n  var ret = Buffer.allocUnsafe(n);\n  var p = list.head;\n  var c = 1;\n  p.data.copy(ret);\n  n -= p.data.length;\n  while (p = p.next) {\n    var buf = p.data;\n    var nb = n > buf.length ? buf.length : n;\n    buf.copy(ret, ret.length - n, 0, nb);\n    n -= nb;\n    if (n === 0) {\n      if (nb === buf.length) {\n        ++c;\n        if (p.next) list.head = p.next;else list.head = list.tail = null;\n      } else {\n        list.head = p;\n        p.data = buf.slice(nb);\n      }\n      break;\n    }\n    ++c;\n  }\n  list.length -= c;\n  return ret;\n}\n\nfunction endReadable(stream) {\n  var state = stream._readableState;\n\n  // If we get here before consuming all the bytes, then that is a\n  // bug in node.  Should never happen.\n  if (state.length > 0) throw new Error('\"endReadable()\" called on non-empty stream');\n\n  if (!state.endEmitted) {\n    state.ended = true;\n    pna.nextTick(endReadableNT, state, stream);\n  }\n}\n\nfunction endReadableNT(state, stream) {\n  // Check that we didn't get one last unshift.\n  if (!state.endEmitted && state.length === 0) {\n    state.endEmitted = true;\n    stream.readable = false;\n    stream.emit('end');\n  }\n}\n\nfunction indexOf(xs, x) {\n  for (var i = 0, l = xs.length; i < l; i++) {\n    if (xs[i] === x) return i;\n  }\n  return -1;\n}\n\n/***/ }),\n/* 407 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a transform stream is a readable/writable stream where you do\n// something with the data.  Sometimes it's called a \"filter\",\n// but that's not a great name for it, since that implies a thing where\n// some bits pass through, and others are simply ignored.  (That would\n// be a valid example of a transform, of course.)\n//\n// While the output is causally related to the input, it's not a\n// necessarily symmetric or synchronous transformation.  For example,\n// a zlib stream might take multiple plain-text writes(), and then\n// emit a single compressed chunk some time in the future.\n//\n// Here's how this works:\n//\n// The Transform stream has all the aspects of the readable and writable\n// stream classes.  When you write(chunk), that calls _write(chunk,cb)\n// internally, and returns false if there's a lot of pending writes\n// buffered up.  When you call read(), that calls _read(n) until\n// there's enough pending readable data buffered up.\n//\n// In a transform stream, the written data is placed in a buffer.  When\n// _read(n) is called, it transforms the queued up data, calling the\n// buffered _write cb's as it consumes chunks.  If consuming a single\n// written chunk would result in multiple output chunks, then the first\n// outputted bit calls the readcb, and subsequent chunks just go into\n// the read buffer, and will cause it to emit 'readable' if necessary.\n//\n// This way, back-pressure is actually determined by the reading side,\n// since _read has to be called to start processing a new chunk.  However,\n// a pathological inflate type of transform can cause excessive buffering\n// here.  For example, imagine a stream where every byte of input is\n// interpreted as an integer from 0-255, and then results in that many\n// bytes of output.  Writing the 4 bytes {ff,ff,ff,ff} would result in\n// 1kb of data being output.  In this case, you could write a very small\n// amount of input, and end up with a very large amount of output.  In\n// such a pathological inflating mechanism, there'd be no way to tell\n// the system to stop doing the transform.  A single 4MB write could\n// cause the system to run out of memory.\n//\n// However, even in such a pathological case, only a single written chunk\n// would be consumed, and then the rest would wait (un-transformed) until\n// the results of the previous transformed chunk were consumed.\n\n\n\nmodule.exports = Transform;\n\nvar Duplex = __webpack_require__(116);\n\n/*<replacement>*/\nvar util = __webpack_require__(113);\nutil.inherits = __webpack_require__(61);\n/*</replacement>*/\n\nutil.inherits(Transform, Duplex);\n\nfunction afterTransform(er, data) {\n  var ts = this._transformState;\n  ts.transforming = false;\n\n  var cb = ts.writecb;\n\n  if (!cb) {\n    return this.emit('error', new Error('write callback called multiple times'));\n  }\n\n  ts.writechunk = null;\n  ts.writecb = null;\n\n  if (data != null) // single equals check for both `null` and `undefined`\n    this.push(data);\n\n  cb(er);\n\n  var rs = this._readableState;\n  rs.reading = false;\n  if (rs.needReadable || rs.length < rs.highWaterMark) {\n    this._read(rs.highWaterMark);\n  }\n}\n\nfunction Transform(options) {\n  if (!(this instanceof Transform)) return new Transform(options);\n\n  Duplex.call(this, options);\n\n  this._transformState = {\n    afterTransform: afterTransform.bind(this),\n    needTransform: false,\n    transforming: false,\n    writecb: null,\n    writechunk: null,\n    writeencoding: null\n  };\n\n  // start out asking for a readable event once data is transformed.\n  this._readableState.needReadable = true;\n\n  // we have implemented the _read method, and done the other things\n  // that Readable wants before the first _read call, so unset the\n  // sync guard flag.\n  this._readableState.sync = false;\n\n  if (options) {\n    if (typeof options.transform === 'function') this._transform = options.transform;\n\n    if (typeof options.flush === 'function') this._flush = options.flush;\n  }\n\n  // When the writable side finishes, then flush out anything remaining.\n  this.on('prefinish', prefinish);\n}\n\nfunction prefinish() {\n  var _this = this;\n\n  if (typeof this._flush === 'function') {\n    this._flush(function (er, data) {\n      done(_this, er, data);\n    });\n  } else {\n    done(this, null, null);\n  }\n}\n\nTransform.prototype.push = function (chunk, encoding) {\n  this._transformState.needTransform = false;\n  return Duplex.prototype.push.call(this, chunk, encoding);\n};\n\n// This is the part where you do stuff!\n// override this function in implementation classes.\n// 'chunk' is an input chunk.\n//\n// Call `push(newChunk)` to pass along transformed output\n// to the readable side.  You may call 'push' zero or more times.\n//\n// Call `cb(err)` when you are done with this chunk.  If you pass\n// an error, then that'll put the hurt on the whole operation.  If you\n// never call cb(), then you'll never get another chunk.\nTransform.prototype._transform = function (chunk, encoding, cb) {\n  throw new Error('_transform() is not implemented');\n};\n\nTransform.prototype._write = function (chunk, encoding, cb) {\n  var ts = this._transformState;\n  ts.writecb = cb;\n  ts.writechunk = chunk;\n  ts.writeencoding = encoding;\n  if (!ts.transforming) {\n    var rs = this._readableState;\n    if (ts.needTransform || rs.needReadable || rs.length < rs.highWaterMark) this._read(rs.highWaterMark);\n  }\n};\n\n// Doesn't matter what the args are here.\n// _transform does all the work.\n// That we got here means that the readable side wants more data.\nTransform.prototype._read = function (n) {\n  var ts = this._transformState;\n\n  if (ts.writechunk !== null && ts.writecb && !ts.transforming) {\n    ts.transforming = true;\n    this._transform(ts.writechunk, ts.writeencoding, ts.afterTransform);\n  } else {\n    // mark that we need a transform, so that any data that comes in\n    // will get processed, now that we've asked for it.\n    ts.needTransform = true;\n  }\n};\n\nTransform.prototype._destroy = function (err, cb) {\n  var _this2 = this;\n\n  Duplex.prototype._destroy.call(this, err, function (err2) {\n    cb(err2);\n    _this2.emit('close');\n  });\n};\n\nfunction done(stream, er, data) {\n  if (er) return stream.emit('error', er);\n\n  if (data != null) // single equals check for both `null` and `undefined`\n    stream.push(data);\n\n  // if there's nothing in the write buffer, then that means\n  // that nothing more will ever be provided\n  if (stream._writableState.length) throw new Error('Calling transform done when ws.length != 0');\n\n  if (stream._transformState.transforming) throw new Error('Calling transform done when still transforming');\n\n  return stream.push(null);\n}\n\n/***/ }),\n/* 408 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// A bit simpler than readable streams.\n// Implement an async ._write(chunk, encoding, cb), and it'll handle all\n// the drain event emission and buffering.\n\n\n\n/*<replacement>*/\n\nvar pna = __webpack_require__(181);\n/*</replacement>*/\n\nmodule.exports = Writable;\n\n/* <replacement> */\nfunction WriteReq(chunk, encoding, cb) {\n  this.chunk = chunk;\n  this.encoding = encoding;\n  this.callback = cb;\n  this.next = null;\n}\n\n// It seems a linked list but it is not\n// there will be only 2 of these for each stream\nfunction CorkedRequest(state) {\n  var _this = this;\n\n  this.next = null;\n  this.entry = null;\n  this.finish = function () {\n    onCorkedFinish(_this, state);\n  };\n}\n/* </replacement> */\n\n/*<replacement>*/\nvar asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick;\n/*</replacement>*/\n\n/*<replacement>*/\nvar Duplex;\n/*</replacement>*/\n\nWritable.WritableState = WritableState;\n\n/*<replacement>*/\nvar util = __webpack_require__(113);\nutil.inherits = __webpack_require__(61);\n/*</replacement>*/\n\n/*<replacement>*/\nvar internalUtil = {\n  deprecate: __webpack_require__(956)\n};\n/*</replacement>*/\n\n/*<replacement>*/\nvar Stream = __webpack_require__(410);\n/*</replacement>*/\n\n/*<replacement>*/\n\nvar Buffer = __webpack_require__(46).Buffer;\nvar OurUint8Array = global.Uint8Array || function () {};\nfunction _uint8ArrayToBuffer(chunk) {\n  return Buffer.from(chunk);\n}\nfunction _isUint8Array(obj) {\n  return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;\n}\n\n/*</replacement>*/\n\nvar destroyImpl = __webpack_require__(409);\n\nutil.inherits(Writable, Stream);\n\nfunction nop() {}\n\nfunction WritableState(options, stream) {\n  Duplex = Duplex || __webpack_require__(116);\n\n  options = options || {};\n\n  // Duplex streams are both readable and writable, but share\n  // the same options object.\n  // However, some cases require setting options to different\n  // values for the readable and the writable sides of the duplex stream.\n  // These options can be provided separately as readableXXX and writableXXX.\n  var isDuplex = stream instanceof Duplex;\n\n  // object stream flag to indicate whether or not this stream\n  // contains buffers or objects.\n  this.objectMode = !!options.objectMode;\n\n  if (isDuplex) this.objectMode = this.objectMode || !!options.writableObjectMode;\n\n  // the point at which write() starts returning false\n  // Note: 0 is a valid value, means that we always return false if\n  // the entire buffer is not flushed immediately on write()\n  var hwm = options.highWaterMark;\n  var writableHwm = options.writableHighWaterMark;\n  var defaultHwm = this.objectMode ? 16 : 16 * 1024;\n\n  if (hwm || hwm === 0) this.highWaterMark = hwm;else if (isDuplex && (writableHwm || writableHwm === 0)) this.highWaterMark = writableHwm;else this.highWaterMark = defaultHwm;\n\n  // cast to ints.\n  this.highWaterMark = Math.floor(this.highWaterMark);\n\n  // if _final has been called\n  this.finalCalled = false;\n\n  // drain event flag.\n  this.needDrain = false;\n  // at the start of calling end()\n  this.ending = false;\n  // when end() has been called, and returned\n  this.ended = false;\n  // when 'finish' is emitted\n  this.finished = false;\n\n  // has it been destroyed\n  this.destroyed = false;\n\n  // should we decode strings into buffers before passing to _write?\n  // this is here so that some node-core streams can optimize string\n  // handling at a lower level.\n  var noDecode = options.decodeStrings === false;\n  this.decodeStrings = !noDecode;\n\n  // Crypto is kind of old and crusty.  Historically, its default string\n  // encoding is 'binary' so we have to make this configurable.\n  // Everything else in the universe uses 'utf8', though.\n  this.defaultEncoding = options.defaultEncoding || 'utf8';\n\n  // not an actual buffer we keep track of, but a measurement\n  // of how much we're waiting to get pushed to some underlying\n  // socket or file.\n  this.length = 0;\n\n  // a flag to see when we're in the middle of a write.\n  this.writing = false;\n\n  // when true all writes will be buffered until .uncork() call\n  this.corked = 0;\n\n  // a flag to be able to tell if the onwrite cb is called immediately,\n  // or on a later tick.  We set this to true at first, because any\n  // actions that shouldn't happen until \"later\" should generally also\n  // not happen before the first write call.\n  this.sync = true;\n\n  // a flag to know if we're processing previously buffered items, which\n  // may call the _write() callback in the same tick, so that we don't\n  // end up in an overlapped onwrite situation.\n  this.bufferProcessing = false;\n\n  // the callback that's passed to _write(chunk,cb)\n  this.onwrite = function (er) {\n    onwrite(stream, er);\n  };\n\n  // the callback that the user supplies to write(chunk,encoding,cb)\n  this.writecb = null;\n\n  // the amount that is being written when _write is called.\n  this.writelen = 0;\n\n  this.bufferedRequest = null;\n  this.lastBufferedRequest = null;\n\n  // number of pending user-supplied write callbacks\n  // this must be 0 before 'finish' can be emitted\n  this.pendingcb = 0;\n\n  // emit prefinish if the only thing we're waiting for is _write cbs\n  // This is relevant for synchronous Transform streams\n  this.prefinished = false;\n\n  // True if the error was already emitted and should not be thrown again\n  this.errorEmitted = false;\n\n  // count buffered requests\n  this.bufferedRequestCount = 0;\n\n  // allocate the first CorkedRequest, there is always\n  // one allocated and free to use, and we maintain at most two\n  this.corkedRequestsFree = new CorkedRequest(this);\n}\n\nWritableState.prototype.getBuffer = function getBuffer() {\n  var current = this.bufferedRequest;\n  var out = [];\n  while (current) {\n    out.push(current);\n    current = current.next;\n  }\n  return out;\n};\n\n(function () {\n  try {\n    Object.defineProperty(WritableState.prototype, 'buffer', {\n      get: internalUtil.deprecate(function () {\n        return this.getBuffer();\n      }, '_writableState.buffer is deprecated. Use _writableState.getBuffer ' + 'instead.', 'DEP0003')\n    });\n  } catch (_) {}\n})();\n\n// Test _writableState for inheritance to account for Duplex streams,\n// whose prototype chain only points to Readable.\nvar realHasInstance;\nif (typeof Symbol === 'function' && Symbol.hasInstance && typeof Function.prototype[Symbol.hasInstance] === 'function') {\n  realHasInstance = Function.prototype[Symbol.hasInstance];\n  Object.defineProperty(Writable, Symbol.hasInstance, {\n    value: function (object) {\n      if (realHasInstance.call(this, object)) return true;\n      if (this !== Writable) return false;\n\n      return object && object._writableState instanceof WritableState;\n    }\n  });\n} else {\n  realHasInstance = function (object) {\n    return object instanceof this;\n  };\n}\n\nfunction Writable(options) {\n  Duplex = Duplex || __webpack_require__(116);\n\n  // Writable ctor is applied to Duplexes, too.\n  // `realHasInstance` is necessary because using plain `instanceof`\n  // would return false, as no `_writableState` property is attached.\n\n  // Trying to use the custom `instanceof` for Writable here will also break the\n  // Node.js LazyTransform implementation, which has a non-trivial getter for\n  // `_writableState` that would lead to infinite recursion.\n  if (!realHasInstance.call(Writable, this) && !(this instanceof Duplex)) {\n    return new Writable(options);\n  }\n\n  this._writableState = new WritableState(options, this);\n\n  // legacy.\n  this.writable = true;\n\n  if (options) {\n    if (typeof options.write === 'function') this._write = options.write;\n\n    if (typeof options.writev === 'function') this._writev = options.writev;\n\n    if (typeof options.destroy === 'function') this._destroy = options.destroy;\n\n    if (typeof options.final === 'function') this._final = options.final;\n  }\n\n  Stream.call(this);\n}\n\n// Otherwise people can pipe Writable streams, which is just wrong.\nWritable.prototype.pipe = function () {\n  this.emit('error', new Error('Cannot pipe, not readable'));\n};\n\nfunction writeAfterEnd(stream, cb) {\n  var er = new Error('write after end');\n  // TODO: defer error events consistently everywhere, not just the cb\n  stream.emit('error', er);\n  pna.nextTick(cb, er);\n}\n\n// Checks that a user-supplied chunk is valid, especially for the particular\n// mode the stream is in. Currently this means that `null` is never accepted\n// and undefined/non-string values are only allowed in object mode.\nfunction validChunk(stream, state, chunk, cb) {\n  var valid = true;\n  var er = false;\n\n  if (chunk === null) {\n    er = new TypeError('May not write null values to stream');\n  } else if (typeof chunk !== 'string' && chunk !== undefined && !state.objectMode) {\n    er = new TypeError('Invalid non-string/buffer chunk');\n  }\n  if (er) {\n    stream.emit('error', er);\n    pna.nextTick(cb, er);\n    valid = false;\n  }\n  return valid;\n}\n\nWritable.prototype.write = function (chunk, encoding, cb) {\n  var state = this._writableState;\n  var ret = false;\n  var isBuf = !state.objectMode && _isUint8Array(chunk);\n\n  if (isBuf && !Buffer.isBuffer(chunk)) {\n    chunk = _uint8ArrayToBuffer(chunk);\n  }\n\n  if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (isBuf) encoding = 'buffer';else if (!encoding) encoding = state.defaultEncoding;\n\n  if (typeof cb !== 'function') cb = nop;\n\n  if (state.ended) writeAfterEnd(this, cb);else if (isBuf || validChunk(this, state, chunk, cb)) {\n    state.pendingcb++;\n    ret = writeOrBuffer(this, state, isBuf, chunk, encoding, cb);\n  }\n\n  return ret;\n};\n\nWritable.prototype.cork = function () {\n  var state = this._writableState;\n\n  state.corked++;\n};\n\nWritable.prototype.uncork = function () {\n  var state = this._writableState;\n\n  if (state.corked) {\n    state.corked--;\n\n    if (!state.writing && !state.corked && !state.finished && !state.bufferProcessing && state.bufferedRequest) clearBuffer(this, state);\n  }\n};\n\nWritable.prototype.setDefaultEncoding = function setDefaultEncoding(encoding) {\n  // node::ParseEncoding() requires lower case.\n  if (typeof encoding === 'string') encoding = encoding.toLowerCase();\n  if (!(['hex', 'utf8', 'utf-8', 'ascii', 'binary', 'base64', 'ucs2', 'ucs-2', 'utf16le', 'utf-16le', 'raw'].indexOf((encoding + '').toLowerCase()) > -1)) throw new TypeError('Unknown encoding: ' + encoding);\n  this._writableState.defaultEncoding = encoding;\n  return this;\n};\n\nfunction decodeChunk(state, chunk, encoding) {\n  if (!state.objectMode && state.decodeStrings !== false && typeof chunk === 'string') {\n    chunk = Buffer.from(chunk, encoding);\n  }\n  return chunk;\n}\n\nObject.defineProperty(Writable.prototype, 'writableHighWaterMark', {\n  // making it explicit this property is not enumerable\n  // because otherwise some prototype manipulation in\n  // userland will fail\n  enumerable: false,\n  get: function () {\n    return this._writableState.highWaterMark;\n  }\n});\n\n// if we're already writing something, then just put this\n// in the queue, and wait our turn.  Otherwise, call _write\n// If we return false, then we need a drain event, so set that flag.\nfunction writeOrBuffer(stream, state, isBuf, chunk, encoding, cb) {\n  if (!isBuf) {\n    var newChunk = decodeChunk(state, chunk, encoding);\n    if (chunk !== newChunk) {\n      isBuf = true;\n      encoding = 'buffer';\n      chunk = newChunk;\n    }\n  }\n  var len = state.objectMode ? 1 : chunk.length;\n\n  state.length += len;\n\n  var ret = state.length < state.highWaterMark;\n  // we must ensure that previous needDrain will not be reset to false.\n  if (!ret) state.needDrain = true;\n\n  if (state.writing || state.corked) {\n    var last = state.lastBufferedRequest;\n    state.lastBufferedRequest = {\n      chunk: chunk,\n      encoding: encoding,\n      isBuf: isBuf,\n      callback: cb,\n      next: null\n    };\n    if (last) {\n      last.next = state.lastBufferedRequest;\n    } else {\n      state.bufferedRequest = state.lastBufferedRequest;\n    }\n    state.bufferedRequestCount += 1;\n  } else {\n    doWrite(stream, state, false, len, chunk, encoding, cb);\n  }\n\n  return ret;\n}\n\nfunction doWrite(stream, state, writev, len, chunk, encoding, cb) {\n  state.writelen = len;\n  state.writecb = cb;\n  state.writing = true;\n  state.sync = true;\n  if (writev) stream._writev(chunk, state.onwrite);else stream._write(chunk, encoding, state.onwrite);\n  state.sync = false;\n}\n\nfunction onwriteError(stream, state, sync, er, cb) {\n  --state.pendingcb;\n\n  if (sync) {\n    // defer the callback if we are being called synchronously\n    // to avoid piling up things on the stack\n    pna.nextTick(cb, er);\n    // this can emit finish, and it will always happen\n    // after error\n    pna.nextTick(finishMaybe, stream, state);\n    stream._writableState.errorEmitted = true;\n    stream.emit('error', er);\n  } else {\n    // the caller expect this to happen before if\n    // it is async\n    cb(er);\n    stream._writableState.errorEmitted = true;\n    stream.emit('error', er);\n    // this can emit finish, but finish must\n    // always follow error\n    finishMaybe(stream, state);\n  }\n}\n\nfunction onwriteStateUpdate(state) {\n  state.writing = false;\n  state.writecb = null;\n  state.length -= state.writelen;\n  state.writelen = 0;\n}\n\nfunction onwrite(stream, er) {\n  var state = stream._writableState;\n  var sync = state.sync;\n  var cb = state.writecb;\n\n  onwriteStateUpdate(state);\n\n  if (er) onwriteError(stream, state, sync, er, cb);else {\n    // Check if we're actually ready to finish, but don't emit yet\n    var finished = needFinish(state);\n\n    if (!finished && !state.corked && !state.bufferProcessing && state.bufferedRequest) {\n      clearBuffer(stream, state);\n    }\n\n    if (sync) {\n      /*<replacement>*/\n      asyncWrite(afterWrite, stream, state, finished, cb);\n      /*</replacement>*/\n    } else {\n      afterWrite(stream, state, finished, cb);\n    }\n  }\n}\n\nfunction afterWrite(stream, state, finished, cb) {\n  if (!finished) onwriteDrain(stream, state);\n  state.pendingcb--;\n  cb();\n  finishMaybe(stream, state);\n}\n\n// Must force callback to be called on nextTick, so that we don't\n// emit 'drain' before the write() consumer gets the 'false' return\n// value, and has a chance to attach a 'drain' listener.\nfunction onwriteDrain(stream, state) {\n  if (state.length === 0 && state.needDrain) {\n    state.needDrain = false;\n    stream.emit('drain');\n  }\n}\n\n// if there's something in the buffer waiting, then process it\nfunction clearBuffer(stream, state) {\n  state.bufferProcessing = true;\n  var entry = state.bufferedRequest;\n\n  if (stream._writev && entry && entry.next) {\n    // Fast case, write everything using _writev()\n    var l = state.bufferedRequestCount;\n    var buffer = new Array(l);\n    var holder = state.corkedRequestsFree;\n    holder.entry = entry;\n\n    var count = 0;\n    var allBuffers = true;\n    while (entry) {\n      buffer[count] = entry;\n      if (!entry.isBuf) allBuffers = false;\n      entry = entry.next;\n      count += 1;\n    }\n    buffer.allBuffers = allBuffers;\n\n    doWrite(stream, state, true, state.length, buffer, '', holder.finish);\n\n    // doWrite is almost always async, defer these to save a bit of time\n    // as the hot path ends with doWrite\n    state.pendingcb++;\n    state.lastBufferedRequest = null;\n    if (holder.next) {\n      state.corkedRequestsFree = holder.next;\n      holder.next = null;\n    } else {\n      state.corkedRequestsFree = new CorkedRequest(state);\n    }\n    state.bufferedRequestCount = 0;\n  } else {\n    // Slow case, write chunks one-by-one\n    while (entry) {\n      var chunk = entry.chunk;\n      var encoding = entry.encoding;\n      var cb = entry.callback;\n      var len = state.objectMode ? 1 : chunk.length;\n\n      doWrite(stream, state, false, len, chunk, encoding, cb);\n      entry = entry.next;\n      state.bufferedRequestCount--;\n      // if we didn't call the onwrite immediately, then\n      // it means that we need to wait until it does.\n      // also, that means that the chunk and cb are currently\n      // being processed, so move the buffer counter past them.\n      if (state.writing) {\n        break;\n      }\n    }\n\n    if (entry === null) state.lastBufferedRequest = null;\n  }\n\n  state.bufferedRequest = entry;\n  state.bufferProcessing = false;\n}\n\nWritable.prototype._write = function (chunk, encoding, cb) {\n  cb(new Error('_write() is not implemented'));\n};\n\nWritable.prototype._writev = null;\n\nWritable.prototype.end = function (chunk, encoding, cb) {\n  var state = this._writableState;\n\n  if (typeof chunk === 'function') {\n    cb = chunk;\n    chunk = null;\n    encoding = null;\n  } else if (typeof encoding === 'function') {\n    cb = encoding;\n    encoding = null;\n  }\n\n  if (chunk !== null && chunk !== undefined) this.write(chunk, encoding);\n\n  // .end() fully uncorks\n  if (state.corked) {\n    state.corked = 1;\n    this.uncork();\n  }\n\n  // ignore unnecessary end() calls.\n  if (!state.ending && !state.finished) endWritable(this, state, cb);\n};\n\nfunction needFinish(state) {\n  return state.ending && state.length === 0 && state.bufferedRequest === null && !state.finished && !state.writing;\n}\nfunction callFinal(stream, state) {\n  stream._final(function (err) {\n    state.pendingcb--;\n    if (err) {\n      stream.emit('error', err);\n    }\n    state.prefinished = true;\n    stream.emit('prefinish');\n    finishMaybe(stream, state);\n  });\n}\nfunction prefinish(stream, state) {\n  if (!state.prefinished && !state.finalCalled) {\n    if (typeof stream._final === 'function') {\n      state.pendingcb++;\n      state.finalCalled = true;\n      pna.nextTick(callFinal, stream, state);\n    } else {\n      state.prefinished = true;\n      stream.emit('prefinish');\n    }\n  }\n}\n\nfunction finishMaybe(stream, state) {\n  var need = needFinish(state);\n  if (need) {\n    prefinish(stream, state);\n    if (state.pendingcb === 0) {\n      state.finished = true;\n      stream.emit('finish');\n    }\n  }\n  return need;\n}\n\nfunction endWritable(stream, state, cb) {\n  state.ending = true;\n  finishMaybe(stream, state);\n  if (cb) {\n    if (state.finished) pna.nextTick(cb);else stream.once('finish', cb);\n  }\n  state.ended = true;\n  stream.writable = false;\n}\n\nfunction onCorkedFinish(corkReq, state, err) {\n  var entry = corkReq.entry;\n  corkReq.entry = null;\n  while (entry) {\n    var cb = entry.callback;\n    state.pendingcb--;\n    cb(err);\n    entry = entry.next;\n  }\n  if (state.corkedRequestsFree) {\n    state.corkedRequestsFree.next = corkReq;\n  } else {\n    state.corkedRequestsFree = corkReq;\n  }\n}\n\nObject.defineProperty(Writable.prototype, 'destroyed', {\n  get: function () {\n    if (this._writableState === undefined) {\n      return false;\n    }\n    return this._writableState.destroyed;\n  },\n  set: function (value) {\n    // we ignore the value if the stream\n    // has not been initialized yet\n    if (!this._writableState) {\n      return;\n    }\n\n    // backward compatibility, the user is explicitly\n    // managing destroyed\n    this._writableState.destroyed = value;\n  }\n});\n\nWritable.prototype.destroy = destroyImpl.destroy;\nWritable.prototype._undestroy = destroyImpl.undestroy;\nWritable.prototype._destroy = function (err, cb) {\n  this.end();\n  cb(err);\n};\n\n/***/ }),\n/* 409 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/*<replacement>*/\n\nvar pna = __webpack_require__(181);\n/*</replacement>*/\n\n// undocumented cb() API, needed for core, not for public API\nfunction destroy(err, cb) {\n  var _this = this;\n\n  var readableDestroyed = this._readableState && this._readableState.destroyed;\n  var writableDestroyed = this._writableState && this._writableState.destroyed;\n\n  if (readableDestroyed || writableDestroyed) {\n    if (cb) {\n      cb(err);\n    } else if (err && (!this._writableState || !this._writableState.errorEmitted)) {\n      pna.nextTick(emitErrorNT, this, err);\n    }\n    return this;\n  }\n\n  // we set destroyed to true before firing error callbacks in order\n  // to make it re-entrance safe in case destroy() is called within callbacks\n\n  if (this._readableState) {\n    this._readableState.destroyed = true;\n  }\n\n  // if this is a duplex stream mark the writable part as destroyed as well\n  if (this._writableState) {\n    this._writableState.destroyed = true;\n  }\n\n  this._destroy(err || null, function (err) {\n    if (!cb && err) {\n      pna.nextTick(emitErrorNT, _this, err);\n      if (_this._writableState) {\n        _this._writableState.errorEmitted = true;\n      }\n    } else if (cb) {\n      cb(err);\n    }\n  });\n\n  return this;\n}\n\nfunction undestroy() {\n  if (this._readableState) {\n    this._readableState.destroyed = false;\n    this._readableState.reading = false;\n    this._readableState.ended = false;\n    this._readableState.endEmitted = false;\n  }\n\n  if (this._writableState) {\n    this._writableState.destroyed = false;\n    this._writableState.ended = false;\n    this._writableState.ending = false;\n    this._writableState.finished = false;\n    this._writableState.errorEmitted = false;\n  }\n}\n\nfunction emitErrorNT(self, err) {\n  self.emit('error', err);\n}\n\nmodule.exports = {\n  destroy: destroy,\n  undestroy: undestroy\n};\n\n/***/ }),\n/* 410 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(23);\n\n\n/***/ }),\n/* 411 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * repeat-element <https://github.com/jonschlinkert/repeat-element>\n *\n * Copyright (c) 2015 Jon Schlinkert.\n * Licensed under the MIT license.\n */\n\n\n\nmodule.exports = function repeat(ele, num) {\n  var arr = new Array(num);\n\n  for (var i = 0; i < num; i++) {\n    arr[i] = ele;\n  }\n\n  return arr;\n};\n\n\n/***/ }),\n/* 412 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar tough = __webpack_require__(810)\n\nvar Cookie = tough.Cookie\nvar CookieJar = tough.CookieJar\n\nexports.parse = function (str) {\n  if (str && str.uri) {\n    str = str.uri\n  }\n  if (typeof str !== 'string') {\n    throw new Error('The cookie function only accepts STRING as param')\n  }\n  return Cookie.parse(str, {loose: true})\n}\n\n// Adapt the sometimes-Async api of tough.CookieJar to our requirements\nfunction RequestJar (store) {\n  var self = this\n  self._jar = new CookieJar(store, {looseMode: true})\n}\nRequestJar.prototype.setCookie = function (cookieOrStr, uri, options) {\n  var self = this\n  return self._jar.setCookieSync(cookieOrStr, uri, options || {})\n}\nRequestJar.prototype.getCookieString = function (uri) {\n  var self = this\n  return self._jar.getCookieStringSync(uri)\n}\nRequestJar.prototype.getCookies = function (uri) {\n  var self = this\n  return self._jar.getCookiesSync(uri)\n}\n\nexports.jar = function (store) {\n  return new RequestJar(store)\n}\n\n\n/***/ }),\n/* 413 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * Copyright (c) 2015, Salesforce.com, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. Neither the name of Salesforce.com nor the names of its contributors may\n * be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * \"A request-path path-matches a given cookie-path if at least one of the\n * following conditions holds:\"\n */\nfunction pathMatch (reqPath, cookiePath) {\n  // \"o  The cookie-path and the request-path are identical.\"\n  if (cookiePath === reqPath) {\n    return true;\n  }\n\n  var idx = reqPath.indexOf(cookiePath);\n  if (idx === 0) {\n    // \"o  The cookie-path is a prefix of the request-path, and the last\n    // character of the cookie-path is %x2F (\"/\").\"\n    if (cookiePath.substr(-1) === \"/\") {\n      return true;\n    }\n\n    // \" o  The cookie-path is a prefix of the request-path, and the first\n    // character of the request-path that is not included in the cookie- path\n    // is a %x2F (\"/\") character.\"\n    if (reqPath.substr(cookiePath.length, 1) === \"/\") {\n      return true;\n    }\n  }\n\n  return false;\n}\n\nexports.pathMatch = pathMatch;\n\n\n/***/ }),\n/* 414 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * Copyright (c) 2015, Salesforce.com, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. Neither the name of Salesforce.com nor the names of its contributors may\n * be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar pubsuffix = __webpack_require__(415);\n\n// Gives the permutation of all possible domainMatch()es of a given domain. The\n// array is in shortest-to-longest order.  Handy for indexing.\nfunction permuteDomain (domain) {\n  var pubSuf = pubsuffix.getPublicSuffix(domain);\n  if (!pubSuf) {\n    return null;\n  }\n  if (pubSuf == domain) {\n    return [domain];\n  }\n\n  var prefix = domain.slice(0, -(pubSuf.length + 1)); // \".example.com\"\n  var parts = prefix.split('.').reverse();\n  var cur = pubSuf;\n  var permutations = [cur];\n  while (parts.length) {\n    cur = parts.shift() + '.' + cur;\n    permutations.push(cur);\n  }\n  return permutations;\n}\n\nexports.permuteDomain = permuteDomain;\n\n\n/***/ }),\n/* 415 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/****************************************************\n * AUTOMATICALLY GENERATED by generate-pubsuffix.js *\n *                  DO NOT EDIT!                    *\n ****************************************************/\n\n\n\nvar punycode = __webpack_require__(305);\n\nmodule.exports.getPublicSuffix = function getPublicSuffix(domain) {\n  /*!\n   * Copyright (c) 2015, Salesforce.com, Inc.\n   * All rights reserved.\n   *\n   * Redistribution and use in source and binary forms, with or without\n   * modification, are permitted provided that the following conditions are met:\n   *\n   * 1. Redistributions of source code must retain the above copyright notice,\n   * this list of conditions and the following disclaimer.\n   *\n   * 2. Redistributions in binary form must reproduce the above copyright notice,\n   * this list of conditions and the following disclaimer in the documentation\n   * and/or other materials provided with the distribution.\n   *\n   * 3. Neither the name of Salesforce.com nor the names of its contributors may\n   * be used to endorse or promote products derived from this software without\n   * specific prior written permission.\n   *\n   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n   * POSSIBILITY OF SUCH DAMAGE.\n   */\n  if (!domain) {\n    return null;\n  }\n  if (domain.match(/^\\./)) {\n    return null;\n  }\n  var asciiDomain = punycode.toASCII(domain);\n  var converted = false;\n  if (asciiDomain !== domain) {\n    domain = asciiDomain;\n    converted = true;\n  }\n  if (index[domain]) {\n    return null;\n  }\n\n  domain = domain.toLowerCase();\n  var parts = domain.split('.').reverse();\n\n  var suffix = '';\n  var suffixLen = 0;\n  for (var i=0; i<parts.length; i++) {\n    var part = parts[i];\n    var starstr = '*'+suffix;\n    var partstr = part+suffix;\n\n    if (index[starstr]) { // star rule matches\n      suffixLen = i+1;\n      if (index[partstr] === false) { // exception rule matches (NB: false, not undefined)\n        suffixLen--;\n      }\n    } else if (index[partstr]) { // exact match, not exception\n      suffixLen = i+1;\n    }\n\n    suffix = '.'+partstr;\n  }\n\n  if (index['*'+suffix]) { // *.domain exists (e.g. *.kyoto.jp for domain='kyoto.jp');\n    return null;\n  }\n\n  suffixLen = suffixLen || 1;\n  if (parts.length > suffixLen) {\n    var publicSuffix = parts.slice(0,suffixLen+1).reverse().join('.');\n    return converted ? punycode.toUnicode(publicSuffix) : publicSuffix;\n  }\n\n  return null;\n};\n\n// The following generated structure is used under the MPL version 2.0\n// See public-suffix.txt for more information\n\nvar index = module.exports.index = Object.freeze(\n{\"ac\":true,\"com.ac\":true,\"edu.ac\":true,\"gov.ac\":true,\"net.ac\":true,\"mil.ac\":true,\"org.ac\":true,\"ad\":true,\"nom.ad\":true,\"ae\":true,\"co.ae\":true,\"net.ae\":true,\"org.ae\":true,\"sch.ae\":true,\"ac.ae\":true,\"gov.ae\":true,\"mil.ae\":true,\"aero\":true,\"accident-investigation.aero\":true,\"accident-prevention.aero\":true,\"aerobatic.aero\":true,\"aeroclub.aero\":true,\"aerodrome.aero\":true,\"agents.aero\":true,\"aircraft.aero\":true,\"airline.aero\":true,\"airport.aero\":true,\"air-surveillance.aero\":true,\"airtraffic.aero\":true,\"air-traffic-control.aero\":true,\"ambulance.aero\":true,\"amusement.aero\":true,\"association.aero\":true,\"author.aero\":true,\"ballooning.aero\":true,\"broker.aero\":true,\"caa.aero\":true,\"cargo.aero\":true,\"catering.aero\":true,\"certification.aero\":true,\"championship.aero\":true,\"charter.aero\":true,\"civilaviation.aero\":true,\"club.aero\":true,\"conference.aero\":true,\"consultant.aero\":true,\"consulting.aero\":true,\"control.aero\":true,\"council.aero\":true,\"crew.aero\":true,\"design.aero\":true,\"dgca.aero\":true,\"educator.aero\":true,\"emergency.aero\":true,\"engine.aero\":true,\"engineer.aero\":true,\"entertainment.aero\":true,\"equipment.aero\":true,\"exchange.aero\":true,\"express.aero\":true,\"federation.aero\":true,\"flight.aero\":true,\"freight.aero\":true,\"fuel.aero\":true,\"gliding.aero\":true,\"government.aero\":true,\"groundhandling.aero\":true,\"group.aero\":true,\"hanggliding.aero\":true,\"homebuilt.aero\":true,\"insurance.aero\":true,\"journal.aero\":true,\"journalist.aero\":true,\"leasing.aero\":true,\"logistics.aero\":true,\"magazine.aero\":true,\"maintenance.aero\":true,\"media.aero\":true,\"microlight.aero\":true,\"modelling.aero\":true,\"navigation.aero\":true,\"parachuting.aero\":true,\"paragliding.aero\":true,\"passenger-association.aero\":true,\"pilot.aero\":true,\"press.aero\":true,\"production.aero\":true,\"recreation.aero\":true,\"repbody.aero\":true,\"res.aero\":true,\"research.aero\":true,\"rotorcraft.aero\":true,\"safety.aero\":true,\"scientist.aero\":true,\"services.aero\":true,\"show.aero\":true,\"skydiving.aero\":true,\"software.aero\":true,\"student.aero\":true,\"trader.aero\":true,\"trading.aero\":true,\"trainer.aero\":true,\"union.aero\":true,\"workinggroup.aero\":true,\"works.aero\":true,\"af\":true,\"gov.af\":true,\"com.af\":true,\"org.af\":true,\"net.af\":true,\"edu.af\":true,\"ag\":true,\"com.ag\":true,\"org.ag\":true,\"net.ag\":true,\"co.ag\":true,\"nom.ag\":true,\"ai\":true,\"off.ai\":true,\"com.ai\":true,\"net.ai\":true,\"org.ai\":true,\"al\":true,\"com.al\":true,\"edu.al\":true,\"gov.al\":true,\"mil.al\":true,\"net.al\":true,\"org.al\":true,\"am\":true,\"ao\":true,\"ed.ao\":true,\"gv.ao\":true,\"og.ao\":true,\"co.ao\":true,\"pb.ao\":true,\"it.ao\":true,\"aq\":true,\"ar\":true,\"com.ar\":true,\"edu.ar\":true,\"gob.ar\":true,\"gov.ar\":true,\"int.ar\":true,\"mil.ar\":true,\"musica.ar\":true,\"net.ar\":true,\"org.ar\":true,\"tur.ar\":true,\"arpa\":true,\"e164.arpa\":true,\"in-addr.arpa\":true,\"ip6.arpa\":true,\"iris.arpa\":true,\"uri.arpa\":true,\"urn.arpa\":true,\"as\":true,\"gov.as\":true,\"asia\":true,\"at\":true,\"ac.at\":true,\"co.at\":true,\"gv.at\":true,\"or.at\":true,\"au\":true,\"com.au\":true,\"net.au\":true,\"org.au\":true,\"edu.au\":true,\"gov.au\":true,\"asn.au\":true,\"id.au\":true,\"info.au\":true,\"conf.au\":true,\"oz.au\":true,\"act.au\":true,\"nsw.au\":true,\"nt.au\":true,\"qld.au\":true,\"sa.au\":true,\"tas.au\":true,\"vic.au\":true,\"wa.au\":true,\"act.edu.au\":true,\"nsw.edu.au\":true,\"nt.edu.au\":true,\"qld.edu.au\":true,\"sa.edu.au\":true,\"tas.edu.au\":true,\"vic.edu.au\":true,\"wa.edu.au\":true,\"qld.gov.au\":true,\"sa.gov.au\":true,\"tas.gov.au\":true,\"vic.gov.au\":true,\"wa.gov.au\":true,\"aw\":true,\"com.aw\":true,\"ax\":true,\"az\":true,\"com.az\":true,\"net.az\":true,\"int.az\":true,\"gov.az\":true,\"org.az\":true,\"edu.az\":true,\"info.az\":true,\"pp.az\":true,\"mil.az\":true,\"name.az\":true,\"pro.az\":true,\"biz.az\":true,\"ba\":true,\"com.ba\":true,\"edu.ba\":true,\"gov.ba\":true,\"mil.ba\":true,\"net.ba\":true,\"org.ba\":true,\"bb\":true,\"biz.bb\":true,\"co.bb\":true,\"com.bb\":true,\"edu.bb\":true,\"gov.bb\":true,\"info.bb\":true,\"net.bb\":true,\"org.bb\":true,\"store.bb\":true,\"tv.bb\":true,\"*.bd\":true,\"be\":true,\"ac.be\":true,\"bf\":true,\"gov.bf\":true,\"bg\":true,\"a.bg\":true,\"b.bg\":true,\"c.bg\":true,\"d.bg\":true,\"e.bg\":true,\"f.bg\":true,\"g.bg\":true,\"h.bg\":true,\"i.bg\":true,\"j.bg\":true,\"k.bg\":true,\"l.bg\":true,\"m.bg\":true,\"n.bg\":true,\"o.bg\":true,\"p.bg\":true,\"q.bg\":true,\"r.bg\":true,\"s.bg\":true,\"t.bg\":true,\"u.bg\":true,\"v.bg\":true,\"w.bg\":true,\"x.bg\":true,\"y.bg\":true,\"z.bg\":true,\"0.bg\":true,\"1.bg\":true,\"2.bg\":true,\"3.bg\":true,\"4.bg\":true,\"5.bg\":true,\"6.bg\":true,\"7.bg\":true,\"8.bg\":true,\"9.bg\":true,\"bh\":true,\"com.bh\":true,\"edu.bh\":true,\"net.bh\":true,\"org.bh\":true,\"gov.bh\":true,\"bi\":true,\"co.bi\":true,\"com.bi\":true,\"edu.bi\":true,\"or.bi\":true,\"org.bi\":true,\"biz\":true,\"bj\":true,\"asso.bj\":true,\"barreau.bj\":true,\"gouv.bj\":true,\"bm\":true,\"com.bm\":true,\"edu.bm\":true,\"gov.bm\":true,\"net.bm\":true,\"org.bm\":true,\"*.bn\":true,\"bo\":true,\"com.bo\":true,\"edu.bo\":true,\"gob.bo\":true,\"int.bo\":true,\"org.bo\":true,\"net.bo\":true,\"mil.bo\":true,\"tv.bo\":true,\"web.bo\":true,\"academia.bo\":true,\"agro.bo\":true,\"arte.bo\":true,\"blog.bo\":true,\"bolivia.bo\":true,\"ciencia.bo\":true,\"cooperativa.bo\":true,\"democracia.bo\":true,\"deporte.bo\":true,\"ecologia.bo\":true,\"economia.bo\":true,\"empresa.bo\":true,\"indigena.bo\":true,\"industria.bo\":true,\"info.bo\":true,\"medicina.bo\":true,\"movimiento.bo\":true,\"musica.bo\":true,\"natural.bo\":true,\"nombre.bo\":true,\"noticias.bo\":true,\"patria.bo\":true,\"politica.bo\":true,\"profesional.bo\":true,\"plurinacional.bo\":true,\"pueblo.bo\":true,\"revista.bo\":true,\"salud.bo\":true,\"tecnologia.bo\":true,\"tksat.bo\":true,\"transporte.bo\":true,\"wiki.bo\":true,\"br\":true,\"9guacu.br\":true,\"abc.br\":true,\"adm.br\":true,\"adv.br\":true,\"agr.br\":true,\"aju.br\":true,\"am.br\":true,\"anani.br\":true,\"aparecida.br\":true,\"arq.br\":true,\"art.br\":true,\"ato.br\":true,\"b.br\":true,\"belem.br\":true,\"bhz.br\":true,\"bio.br\":true,\"blog.br\":true,\"bmd.br\":true,\"boavista.br\":true,\"bsb.br\":true,\"campinagrande.br\":true,\"campinas.br\":true,\"caxias.br\":true,\"cim.br\":true,\"cng.br\":true,\"cnt.br\":true,\"com.br\":true,\"contagem.br\":true,\"coop.br\":true,\"cri.br\":true,\"cuiaba.br\":true,\"curitiba.br\":true,\"def.br\":true,\"ecn.br\":true,\"eco.br\":true,\"edu.br\":true,\"emp.br\":true,\"eng.br\":true,\"esp.br\":true,\"etc.br\":true,\"eti.br\":true,\"far.br\":true,\"feira.br\":true,\"flog.br\":true,\"floripa.br\":true,\"fm.br\":true,\"fnd.br\":true,\"fortal.br\":true,\"fot.br\":true,\"foz.br\":true,\"fst.br\":true,\"g12.br\":true,\"ggf.br\":true,\"goiania.br\":true,\"gov.br\":true,\"ac.gov.br\":true,\"al.gov.br\":true,\"am.gov.br\":true,\"ap.gov.br\":true,\"ba.gov.br\":true,\"ce.gov.br\":true,\"df.gov.br\":true,\"es.gov.br\":true,\"go.gov.br\":true,\"ma.gov.br\":true,\"mg.gov.br\":true,\"ms.gov.br\":true,\"mt.gov.br\":true,\"pa.gov.br\":true,\"pb.gov.br\":true,\"pe.gov.br\":true,\"pi.gov.br\":true,\"pr.gov.br\":true,\"rj.gov.br\":true,\"rn.gov.br\":true,\"ro.gov.br\":true,\"rr.gov.br\":true,\"rs.gov.br\":true,\"sc.gov.br\":true,\"se.gov.br\":true,\"sp.gov.br\":true,\"to.gov.br\":true,\"gru.br\":true,\"imb.br\":true,\"ind.br\":true,\"inf.br\":true,\"jab.br\":true,\"jampa.br\":true,\"jdf.br\":true,\"joinville.br\":true,\"jor.br\":true,\"jus.br\":true,\"leg.br\":true,\"lel.br\":true,\"londrina.br\":true,\"macapa.br\":true,\"maceio.br\":true,\"manaus.br\":true,\"maringa.br\":true,\"mat.br\":true,\"med.br\":true,\"mil.br\":true,\"morena.br\":true,\"mp.br\":true,\"mus.br\":true,\"natal.br\":true,\"net.br\":true,\"niteroi.br\":true,\"*.nom.br\":true,\"not.br\":true,\"ntr.br\":true,\"odo.br\":true,\"org.br\":true,\"osasco.br\":true,\"palmas.br\":true,\"poa.br\":true,\"ppg.br\":true,\"pro.br\":true,\"psc.br\":true,\"psi.br\":true,\"pvh.br\":true,\"qsl.br\":true,\"radio.br\":true,\"rec.br\":true,\"recife.br\":true,\"ribeirao.br\":true,\"rio.br\":true,\"riobranco.br\":true,\"riopreto.br\":true,\"salvador.br\":true,\"sampa.br\":true,\"santamaria.br\":true,\"santoandre.br\":true,\"saobernardo.br\":true,\"saogonca.br\":true,\"sjc.br\":true,\"slg.br\":true,\"slz.br\":true,\"sorocaba.br\":true,\"srv.br\":true,\"taxi.br\":true,\"teo.br\":true,\"the.br\":true,\"tmp.br\":true,\"trd.br\":true,\"tur.br\":true,\"tv.br\":true,\"udi.br\":true,\"vet.br\":true,\"vix.br\":true,\"vlog.br\":true,\"wiki.br\":true,\"zlg.br\":true,\"bs\":true,\"com.bs\":true,\"net.bs\":true,\"org.bs\":true,\"edu.bs\":true,\"gov.bs\":true,\"bt\":true,\"com.bt\":true,\"edu.bt\":true,\"gov.bt\":true,\"net.bt\":true,\"org.bt\":true,\"bv\":true,\"bw\":true,\"co.bw\":true,\"org.bw\":true,\"by\":true,\"gov.by\":true,\"mil.by\":true,\"com.by\":true,\"of.by\":true,\"bz\":true,\"com.bz\":true,\"net.bz\":true,\"org.bz\":true,\"edu.bz\":true,\"gov.bz\":true,\"ca\":true,\"ab.ca\":true,\"bc.ca\":true,\"mb.ca\":true,\"nb.ca\":true,\"nf.ca\":true,\"nl.ca\":true,\"ns.ca\":true,\"nt.ca\":true,\"nu.ca\":true,\"on.ca\":true,\"pe.ca\":true,\"qc.ca\":true,\"sk.ca\":true,\"yk.ca\":true,\"gc.ca\":true,\"cat\":true,\"cc\":true,\"cd\":true,\"gov.cd\":true,\"cf\":true,\"cg\":true,\"ch\":true,\"ci\":true,\"org.ci\":true,\"or.ci\":true,\"com.ci\":true,\"co.ci\":true,\"edu.ci\":true,\"ed.ci\":true,\"ac.ci\":true,\"net.ci\":true,\"go.ci\":true,\"asso.ci\":true,\"xn--aroport-bya.ci\":true,\"int.ci\":true,\"presse.ci\":true,\"md.ci\":true,\"gouv.ci\":true,\"*.ck\":true,\"www.ck\":false,\"cl\":true,\"gov.cl\":true,\"gob.cl\":true,\"co.cl\":true,\"mil.cl\":true,\"cm\":true,\"co.cm\":true,\"com.cm\":true,\"gov.cm\":true,\"net.cm\":true,\"cn\":true,\"ac.cn\":true,\"com.cn\":true,\"edu.cn\":true,\"gov.cn\":true,\"net.cn\":true,\"org.cn\":true,\"mil.cn\":true,\"xn--55qx5d.cn\":true,\"xn--io0a7i.cn\":true,\"xn--od0alg.cn\":true,\"ah.cn\":true,\"bj.cn\":true,\"cq.cn\":true,\"fj.cn\":true,\"gd.cn\":true,\"gs.cn\":true,\"gz.cn\":true,\"gx.cn\":true,\"ha.cn\":true,\"hb.cn\":true,\"he.cn\":true,\"hi.cn\":true,\"hl.cn\":true,\"hn.cn\":true,\"jl.cn\":true,\"js.cn\":true,\"jx.cn\":true,\"ln.cn\":true,\"nm.cn\":true,\"nx.cn\":true,\"qh.cn\":true,\"sc.cn\":true,\"sd.cn\":true,\"sh.cn\":true,\"sn.cn\":true,\"sx.cn\":true,\"tj.cn\":true,\"xj.cn\":true,\"xz.cn\":true,\"yn.cn\":true,\"zj.cn\":true,\"hk.cn\":true,\"mo.cn\":true,\"tw.cn\":true,\"co\":true,\"arts.co\":true,\"com.co\":true,\"edu.co\":true,\"firm.co\":true,\"gov.co\":true,\"info.co\":true,\"int.co\":true,\"mil.co\":true,\"net.co\":true,\"nom.co\":true,\"org.co\":true,\"rec.co\":true,\"web.co\":true,\"com\":true,\"coop\":true,\"cr\":true,\"ac.cr\":true,\"co.cr\":true,\"ed.cr\":true,\"fi.cr\":true,\"go.cr\":true,\"or.cr\":true,\"sa.cr\":true,\"cu\":true,\"com.cu\":true,\"edu.cu\":true,\"org.cu\":true,\"net.cu\":true,\"gov.cu\":true,\"inf.cu\":true,\"cv\":true,\"cw\":true,\"com.cw\":true,\"edu.cw\":true,\"net.cw\":true,\"org.cw\":true,\"cx\":true,\"gov.cx\":true,\"cy\":true,\"ac.cy\":true,\"biz.cy\":true,\"com.cy\":true,\"ekloges.cy\":true,\"gov.cy\":true,\"ltd.cy\":true,\"name.cy\":true,\"net.cy\":true,\"org.cy\":true,\"parliament.cy\":true,\"press.cy\":true,\"pro.cy\":true,\"tm.cy\":true,\"cz\":true,\"de\":true,\"dj\":true,\"dk\":true,\"dm\":true,\"com.dm\":true,\"net.dm\":true,\"org.dm\":true,\"edu.dm\":true,\"gov.dm\":true,\"do\":true,\"art.do\":true,\"com.do\":true,\"edu.do\":true,\"gob.do\":true,\"gov.do\":true,\"mil.do\":true,\"net.do\":true,\"org.do\":true,\"sld.do\":true,\"web.do\":true,\"dz\":true,\"com.dz\":true,\"org.dz\":true,\"net.dz\":true,\"gov.dz\":true,\"edu.dz\":true,\"asso.dz\":true,\"pol.dz\":true,\"art.dz\":true,\"ec\":true,\"com.ec\":true,\"info.ec\":true,\"net.ec\":true,\"fin.ec\":true,\"k12.ec\":true,\"med.ec\":true,\"pro.ec\":true,\"org.ec\":true,\"edu.ec\":true,\"gov.ec\":true,\"gob.ec\":true,\"mil.ec\":true,\"edu\":true,\"ee\":true,\"edu.ee\":true,\"gov.ee\":true,\"riik.ee\":true,\"lib.ee\":true,\"med.ee\":true,\"com.ee\":true,\"pri.ee\":true,\"aip.ee\":true,\"org.ee\":true,\"fie.ee\":true,\"eg\":true,\"com.eg\":true,\"edu.eg\":true,\"eun.eg\":true,\"gov.eg\":true,\"mil.eg\":true,\"name.eg\":true,\"net.eg\":true,\"org.eg\":true,\"sci.eg\":true,\"*.er\":true,\"es\":true,\"com.es\":true,\"nom.es\":true,\"org.es\":true,\"gob.es\":true,\"edu.es\":true,\"et\":true,\"com.et\":true,\"gov.et\":true,\"org.et\":true,\"edu.et\":true,\"biz.et\":true,\"name.et\":true,\"info.et\":true,\"net.et\":true,\"eu\":true,\"fi\":true,\"aland.fi\":true,\"*.fj\":true,\"*.fk\":true,\"fm\":true,\"fo\":true,\"fr\":true,\"com.fr\":true,\"asso.fr\":true,\"nom.fr\":true,\"prd.fr\":true,\"presse.fr\":true,\"tm.fr\":true,\"aeroport.fr\":true,\"assedic.fr\":true,\"avocat.fr\":true,\"avoues.fr\":true,\"cci.fr\":true,\"chambagri.fr\":true,\"chirurgiens-dentistes.fr\":true,\"experts-comptables.fr\":true,\"geometre-expert.fr\":true,\"gouv.fr\":true,\"greta.fr\":true,\"huissier-justice.fr\":true,\"medecin.fr\":true,\"notaires.fr\":true,\"pharmacien.fr\":true,\"port.fr\":true,\"veterinaire.fr\":true,\"ga\":true,\"gb\":true,\"gd\":true,\"ge\":true,\"com.ge\":true,\"edu.ge\":true,\"gov.ge\":true,\"org.ge\":true,\"mil.ge\":true,\"net.ge\":true,\"pvt.ge\":true,\"gf\":true,\"gg\":true,\"co.gg\":true,\"net.gg\":true,\"org.gg\":true,\"gh\":true,\"com.gh\":true,\"edu.gh\":true,\"gov.gh\":true,\"org.gh\":true,\"mil.gh\":true,\"gi\":true,\"com.gi\":true,\"ltd.gi\":true,\"gov.gi\":true,\"mod.gi\":true,\"edu.gi\":true,\"org.gi\":true,\"gl\":true,\"co.gl\":true,\"com.gl\":true,\"edu.gl\":true,\"net.gl\":true,\"org.gl\":true,\"gm\":true,\"gn\":true,\"ac.gn\":true,\"com.gn\":true,\"edu.gn\":true,\"gov.gn\":true,\"org.gn\":true,\"net.gn\":true,\"gov\":true,\"gp\":true,\"com.gp\":true,\"net.gp\":true,\"mobi.gp\":true,\"edu.gp\":true,\"org.gp\":true,\"asso.gp\":true,\"gq\":true,\"gr\":true,\"com.gr\":true,\"edu.gr\":true,\"net.gr\":true,\"org.gr\":true,\"gov.gr\":true,\"gs\":true,\"gt\":true,\"com.gt\":true,\"edu.gt\":true,\"gob.gt\":true,\"ind.gt\":true,\"mil.gt\":true,\"net.gt\":true,\"org.gt\":true,\"*.gu\":true,\"gw\":true,\"gy\":true,\"co.gy\":true,\"com.gy\":true,\"edu.gy\":true,\"gov.gy\":true,\"net.gy\":true,\"org.gy\":true,\"hk\":true,\"com.hk\":true,\"edu.hk\":true,\"gov.hk\":true,\"idv.hk\":true,\"net.hk\":true,\"org.hk\":true,\"xn--55qx5d.hk\":true,\"xn--wcvs22d.hk\":true,\"xn--lcvr32d.hk\":true,\"xn--mxtq1m.hk\":true,\"xn--gmqw5a.hk\":true,\"xn--ciqpn.hk\":true,\"xn--gmq050i.hk\":true,\"xn--zf0avx.hk\":true,\"xn--io0a7i.hk\":true,\"xn--mk0axi.hk\":true,\"xn--od0alg.hk\":true,\"xn--od0aq3b.hk\":true,\"xn--tn0ag.hk\":true,\"xn--uc0atv.hk\":true,\"xn--uc0ay4a.hk\":true,\"hm\":true,\"hn\":true,\"com.hn\":true,\"edu.hn\":true,\"org.hn\":true,\"net.hn\":true,\"mil.hn\":true,\"gob.hn\":true,\"hr\":true,\"iz.hr\":true,\"from.hr\":true,\"name.hr\":true,\"com.hr\":true,\"ht\":true,\"com.ht\":true,\"shop.ht\":true,\"firm.ht\":true,\"info.ht\":true,\"adult.ht\":true,\"net.ht\":true,\"pro.ht\":true,\"org.ht\":true,\"med.ht\":true,\"art.ht\":true,\"coop.ht\":true,\"pol.ht\":true,\"asso.ht\":true,\"edu.ht\":true,\"rel.ht\":true,\"gouv.ht\":true,\"perso.ht\":true,\"hu\":true,\"co.hu\":true,\"info.hu\":true,\"org.hu\":true,\"priv.hu\":true,\"sport.hu\":true,\"tm.hu\":true,\"2000.hu\":true,\"agrar.hu\":true,\"bolt.hu\":true,\"casino.hu\":true,\"city.hu\":true,\"erotica.hu\":true,\"erotika.hu\":true,\"film.hu\":true,\"forum.hu\":true,\"games.hu\":true,\"hotel.hu\":true,\"ingatlan.hu\":true,\"jogasz.hu\":true,\"konyvelo.hu\":true,\"lakas.hu\":true,\"media.hu\":true,\"news.hu\":true,\"reklam.hu\":true,\"sex.hu\":true,\"shop.hu\":true,\"suli.hu\":true,\"szex.hu\":true,\"tozsde.hu\":true,\"utazas.hu\":true,\"video.hu\":true,\"id\":true,\"ac.id\":true,\"biz.id\":true,\"co.id\":true,\"desa.id\":true,\"go.id\":true,\"mil.id\":true,\"my.id\":true,\"net.id\":true,\"or.id\":true,\"sch.id\":true,\"web.id\":true,\"ie\":true,\"gov.ie\":true,\"il\":true,\"ac.il\":true,\"co.il\":true,\"gov.il\":true,\"idf.il\":true,\"k12.il\":true,\"muni.il\":true,\"net.il\":true,\"org.il\":true,\"im\":true,\"ac.im\":true,\"co.im\":true,\"com.im\":true,\"ltd.co.im\":true,\"net.im\":true,\"org.im\":true,\"plc.co.im\":true,\"tt.im\":true,\"tv.im\":true,\"in\":true,\"co.in\":true,\"firm.in\":true,\"net.in\":true,\"org.in\":true,\"gen.in\":true,\"ind.in\":true,\"nic.in\":true,\"ac.in\":true,\"edu.in\":true,\"res.in\":true,\"gov.in\":true,\"mil.in\":true,\"info\":true,\"int\":true,\"eu.int\":true,\"io\":true,\"com.io\":true,\"iq\":true,\"gov.iq\":true,\"edu.iq\":true,\"mil.iq\":true,\"com.iq\":true,\"org.iq\":true,\"net.iq\":true,\"ir\":true,\"ac.ir\":true,\"co.ir\":true,\"gov.ir\":true,\"id.ir\":true,\"net.ir\":true,\"org.ir\":true,\"sch.ir\":true,\"xn--mgba3a4f16a.ir\":true,\"xn--mgba3a4fra.ir\":true,\"is\":true,\"net.is\":true,\"com.is\":true,\"edu.is\":true,\"gov.is\":true,\"org.is\":true,\"int.is\":true,\"it\":true,\"gov.it\":true,\"edu.it\":true,\"abr.it\":true,\"abruzzo.it\":true,\"aosta-valley.it\":true,\"aostavalley.it\":true,\"bas.it\":true,\"basilicata.it\":true,\"cal.it\":true,\"calabria.it\":true,\"cam.it\":true,\"campania.it\":true,\"emilia-romagna.it\":true,\"emiliaromagna.it\":true,\"emr.it\":true,\"friuli-v-giulia.it\":true,\"friuli-ve-giulia.it\":true,\"friuli-vegiulia.it\":true,\"friuli-venezia-giulia.it\":true,\"friuli-veneziagiulia.it\":true,\"friuli-vgiulia.it\":true,\"friuliv-giulia.it\":true,\"friulive-giulia.it\":true,\"friulivegiulia.it\":true,\"friulivenezia-giulia.it\":true,\"friuliveneziagiulia.it\":true,\"friulivgiulia.it\":true,\"fvg.it\":true,\"laz.it\":true,\"lazio.it\":true,\"lig.it\":true,\"liguria.it\":true,\"lom.it\":true,\"lombardia.it\":true,\"lombardy.it\":true,\"lucania.it\":true,\"mar.it\":true,\"marche.it\":true,\"mol.it\":true,\"molise.it\":true,\"piedmont.it\":true,\"piemonte.it\":true,\"pmn.it\":true,\"pug.it\":true,\"puglia.it\":true,\"sar.it\":true,\"sardegna.it\":true,\"sardinia.it\":true,\"sic.it\":true,\"sicilia.it\":true,\"sicily.it\":true,\"taa.it\":true,\"tos.it\":true,\"toscana.it\":true,\"trentino-a-adige.it\":true,\"trentino-aadige.it\":true,\"trentino-alto-adige.it\":true,\"trentino-altoadige.it\":true,\"trentino-s-tirol.it\":true,\"trentino-stirol.it\":true,\"trentino-sud-tirol.it\":true,\"trentino-sudtirol.it\":true,\"trentino-sued-tirol.it\":true,\"trentino-suedtirol.it\":true,\"trentinoa-adige.it\":true,\"trentinoaadige.it\":true,\"trentinoalto-adige.it\":true,\"trentinoaltoadige.it\":true,\"trentinos-tirol.it\":true,\"trentinostirol.it\":true,\"trentinosud-tirol.it\":true,\"trentinosudtirol.it\":true,\"trentinosued-tirol.it\":true,\"trentinosuedtirol.it\":true,\"tuscany.it\":true,\"umb.it\":true,\"umbria.it\":true,\"val-d-aosta.it\":true,\"val-daosta.it\":true,\"vald-aosta.it\":true,\"valdaosta.it\":true,\"valle-aosta.it\":true,\"valle-d-aosta.it\":true,\"valle-daosta.it\":true,\"valleaosta.it\":true,\"valled-aosta.it\":true,\"valledaosta.it\":true,\"vallee-aoste.it\":true,\"valleeaoste.it\":true,\"vao.it\":true,\"vda.it\":true,\"ven.it\":true,\"veneto.it\":true,\"ag.it\":true,\"agrigento.it\":true,\"al.it\":true,\"alessandria.it\":true,\"alto-adige.it\":true,\"altoadige.it\":true,\"an.it\":true,\"ancona.it\":true,\"andria-barletta-trani.it\":true,\"andria-trani-barletta.it\":true,\"andriabarlettatrani.it\":true,\"andriatranibarletta.it\":true,\"ao.it\":true,\"aosta.it\":true,\"aoste.it\":true,\"ap.it\":true,\"aq.it\":true,\"aquila.it\":true,\"ar.it\":true,\"arezzo.it\":true,\"ascoli-piceno.it\":true,\"ascolipiceno.it\":true,\"asti.it\":true,\"at.it\":true,\"av.it\":true,\"avellino.it\":true,\"ba.it\":true,\"balsan.it\":true,\"bari.it\":true,\"barletta-trani-andria.it\":true,\"barlettatraniandria.it\":true,\"belluno.it\":true,\"benevento.it\":true,\"bergamo.it\":true,\"bg.it\":true,\"bi.it\":true,\"biella.it\":true,\"bl.it\":true,\"bn.it\":true,\"bo.it\":true,\"bologna.it\":true,\"bolzano.it\":true,\"bozen.it\":true,\"br.it\":true,\"brescia.it\":true,\"brindisi.it\":true,\"bs.it\":true,\"bt.it\":true,\"bz.it\":true,\"ca.it\":true,\"cagliari.it\":true,\"caltanissetta.it\":true,\"campidano-medio.it\":true,\"campidanomedio.it\":true,\"campobasso.it\":true,\"carbonia-iglesias.it\":true,\"carboniaiglesias.it\":true,\"carrara-massa.it\":true,\"carraramassa.it\":true,\"caserta.it\":true,\"catania.it\":true,\"catanzaro.it\":true,\"cb.it\":true,\"ce.it\":true,\"cesena-forli.it\":true,\"cesenaforli.it\":true,\"ch.it\":true,\"chieti.it\":true,\"ci.it\":true,\"cl.it\":true,\"cn.it\":true,\"co.it\":true,\"como.it\":true,\"cosenza.it\":true,\"cr.it\":true,\"cremona.it\":true,\"crotone.it\":true,\"cs.it\":true,\"ct.it\":true,\"cuneo.it\":true,\"cz.it\":true,\"dell-ogliastra.it\":true,\"dellogliastra.it\":true,\"en.it\":true,\"enna.it\":true,\"fc.it\":true,\"fe.it\":true,\"fermo.it\":true,\"ferrara.it\":true,\"fg.it\":true,\"fi.it\":true,\"firenze.it\":true,\"florence.it\":true,\"fm.it\":true,\"foggia.it\":true,\"forli-cesena.it\":true,\"forlicesena.it\":true,\"fr.it\":true,\"frosinone.it\":true,\"ge.it\":true,\"genoa.it\":true,\"genova.it\":true,\"go.it\":true,\"gorizia.it\":true,\"gr.it\":true,\"grosseto.it\":true,\"iglesias-carbonia.it\":true,\"iglesiascarbonia.it\":true,\"im.it\":true,\"imperia.it\":true,\"is.it\":true,\"isernia.it\":true,\"kr.it\":true,\"la-spezia.it\":true,\"laquila.it\":true,\"laspezia.it\":true,\"latina.it\":true,\"lc.it\":true,\"le.it\":true,\"lecce.it\":true,\"lecco.it\":true,\"li.it\":true,\"livorno.it\":true,\"lo.it\":true,\"lodi.it\":true,\"lt.it\":true,\"lu.it\":true,\"lucca.it\":true,\"macerata.it\":true,\"mantova.it\":true,\"massa-carrara.it\":true,\"massacarrara.it\":true,\"matera.it\":true,\"mb.it\":true,\"mc.it\":true,\"me.it\":true,\"medio-campidano.it\":true,\"mediocampidano.it\":true,\"messina.it\":true,\"mi.it\":true,\"milan.it\":true,\"milano.it\":true,\"mn.it\":true,\"mo.it\":true,\"modena.it\":true,\"monza-brianza.it\":true,\"monza-e-della-brianza.it\":true,\"monza.it\":true,\"monzabrianza.it\":true,\"monzaebrianza.it\":true,\"monzaedellabrianza.it\":true,\"ms.it\":true,\"mt.it\":true,\"na.it\":true,\"naples.it\":true,\"napoli.it\":true,\"no.it\":true,\"novara.it\":true,\"nu.it\":true,\"nuoro.it\":true,\"og.it\":true,\"ogliastra.it\":true,\"olbia-tempio.it\":true,\"olbiatempio.it\":true,\"or.it\":true,\"oristano.it\":true,\"ot.it\":true,\"pa.it\":true,\"padova.it\":true,\"padua.it\":true,\"palermo.it\":true,\"parma.it\":true,\"pavia.it\":true,\"pc.it\":true,\"pd.it\":true,\"pe.it\":true,\"perugia.it\":true,\"pesaro-urbino.it\":true,\"pesarourbino.it\":true,\"pescara.it\":true,\"pg.it\":true,\"pi.it\":true,\"piacenza.it\":true,\"pisa.it\":true,\"pistoia.it\":true,\"pn.it\":true,\"po.it\":true,\"pordenone.it\":true,\"potenza.it\":true,\"pr.it\":true,\"prato.it\":true,\"pt.it\":true,\"pu.it\":true,\"pv.it\":true,\"pz.it\":true,\"ra.it\":true,\"ragusa.it\":true,\"ravenna.it\":true,\"rc.it\":true,\"re.it\":true,\"reggio-calabria.it\":true,\"reggio-emilia.it\":true,\"reggiocalabria.it\":true,\"reggioemilia.it\":true,\"rg.it\":true,\"ri.it\":true,\"rieti.it\":true,\"rimini.it\":true,\"rm.it\":true,\"rn.it\":true,\"ro.it\":true,\"roma.it\":true,\"rome.it\":true,\"rovigo.it\":true,\"sa.it\":true,\"salerno.it\":true,\"sassari.it\":true,\"savona.it\":true,\"si.it\":true,\"siena.it\":true,\"siracusa.it\":true,\"so.it\":true,\"sondrio.it\":true,\"sp.it\":true,\"sr.it\":true,\"ss.it\":true,\"suedtirol.it\":true,\"sv.it\":true,\"ta.it\":true,\"taranto.it\":true,\"te.it\":true,\"tempio-olbia.it\":true,\"tempioolbia.it\":true,\"teramo.it\":true,\"terni.it\":true,\"tn.it\":true,\"to.it\":true,\"torino.it\":true,\"tp.it\":true,\"tr.it\":true,\"trani-andria-barletta.it\":true,\"trani-barletta-andria.it\":true,\"traniandriabarletta.it\":true,\"tranibarlettaandria.it\":true,\"trapani.it\":true,\"trentino.it\":true,\"trento.it\":true,\"treviso.it\":true,\"trieste.it\":true,\"ts.it\":true,\"turin.it\":true,\"tv.it\":true,\"ud.it\":true,\"udine.it\":true,\"urbino-pesaro.it\":true,\"urbinopesaro.it\":true,\"va.it\":true,\"varese.it\":true,\"vb.it\":true,\"vc.it\":true,\"ve.it\":true,\"venezia.it\":true,\"venice.it\":true,\"verbania.it\":true,\"vercelli.it\":true,\"verona.it\":true,\"vi.it\":true,\"vibo-valentia.it\":true,\"vibovalentia.it\":true,\"vicenza.it\":true,\"viterbo.it\":true,\"vr.it\":true,\"vs.it\":true,\"vt.it\":true,\"vv.it\":true,\"je\":true,\"co.je\":true,\"net.je\":true,\"org.je\":true,\"*.jm\":true,\"jo\":true,\"com.jo\":true,\"org.jo\":true,\"net.jo\":true,\"edu.jo\":true,\"sch.jo\":true,\"gov.jo\":true,\"mil.jo\":true,\"name.jo\":true,\"jobs\":true,\"jp\":true,\"ac.jp\":true,\"ad.jp\":true,\"co.jp\":true,\"ed.jp\":true,\"go.jp\":true,\"gr.jp\":true,\"lg.jp\":true,\"ne.jp\":true,\"or.jp\":true,\"aichi.jp\":true,\"akita.jp\":true,\"aomori.jp\":true,\"chiba.jp\":true,\"ehime.jp\":true,\"fukui.jp\":true,\"fukuoka.jp\":true,\"fukushima.jp\":true,\"gifu.jp\":true,\"gunma.jp\":true,\"hiroshima.jp\":true,\"hokkaido.jp\":true,\"hyogo.jp\":true,\"ibaraki.jp\":true,\"ishikawa.jp\":true,\"iwate.jp\":true,\"kagawa.jp\":true,\"kagoshima.jp\":true,\"kanagawa.jp\":true,\"kochi.jp\":true,\"kumamoto.jp\":true,\"kyoto.jp\":true,\"mie.jp\":true,\"miyagi.jp\":true,\"miyazaki.jp\":true,\"nagano.jp\":true,\"nagasaki.jp\":true,\"nara.jp\":true,\"niigata.jp\":true,\"oita.jp\":true,\"okayama.jp\":true,\"okinawa.jp\":true,\"osaka.jp\":true,\"saga.jp\":true,\"saitama.jp\":true,\"shiga.jp\":true,\"shimane.jp\":true,\"shizuoka.jp\":true,\"tochigi.jp\":true,\"tokushima.jp\":true,\"tokyo.jp\":true,\"tottori.jp\":true,\"toyama.jp\":true,\"wakayama.jp\":true,\"yamagata.jp\":true,\"yamaguchi.jp\":true,\"yamanashi.jp\":true,\"xn--4pvxs.jp\":true,\"xn--vgu402c.jp\":true,\"xn--c3s14m.jp\":true,\"xn--f6qx53a.jp\":true,\"xn--8pvr4u.jp\":true,\"xn--uist22h.jp\":true,\"xn--djrs72d6uy.jp\":true,\"xn--mkru45i.jp\":true,\"xn--0trq7p7nn.jp\":true,\"xn--8ltr62k.jp\":true,\"xn--2m4a15e.jp\":true,\"xn--efvn9s.jp\":true,\"xn--32vp30h.jp\":true,\"xn--4it797k.jp\":true,\"xn--1lqs71d.jp\":true,\"xn--5rtp49c.jp\":true,\"xn--5js045d.jp\":true,\"xn--ehqz56n.jp\":true,\"xn--1lqs03n.jp\":true,\"xn--qqqt11m.jp\":true,\"xn--kbrq7o.jp\":true,\"xn--pssu33l.jp\":true,\"xn--ntsq17g.jp\":true,\"xn--uisz3g.jp\":true,\"xn--6btw5a.jp\":true,\"xn--1ctwo.jp\":true,\"xn--6orx2r.jp\":true,\"xn--rht61e.jp\":true,\"xn--rht27z.jp\":true,\"xn--djty4k.jp\":true,\"xn--nit225k.jp\":true,\"xn--rht3d.jp\":true,\"xn--klty5x.jp\":true,\"xn--kltx9a.jp\":true,\"xn--kltp7d.jp\":true,\"xn--uuwu58a.jp\":true,\"xn--zbx025d.jp\":true,\"xn--ntso0iqx3a.jp\":true,\"xn--elqq16h.jp\":true,\"xn--4it168d.jp\":true,\"xn--klt787d.jp\":true,\"xn--rny31h.jp\":true,\"xn--7t0a264c.jp\":true,\"xn--5rtq34k.jp\":true,\"xn--k7yn95e.jp\":true,\"xn--tor131o.jp\":true,\"xn--d5qv7z876c.jp\":true,\"*.kawasaki.jp\":true,\"*.kitakyushu.jp\":true,\"*.kobe.jp\":true,\"*.nagoya.jp\":true,\"*.sapporo.jp\":true,\"*.sendai.jp\":true,\"*.yokohama.jp\":true,\"city.kawasaki.jp\":false,\"city.kitakyushu.jp\":false,\"city.kobe.jp\":false,\"city.nagoya.jp\":false,\"city.sapporo.jp\":false,\"city.sendai.jp\":false,\"city.yokohama.jp\":false,\"aisai.aichi.jp\":true,\"ama.aichi.jp\":true,\"anjo.aichi.jp\":true,\"asuke.aichi.jp\":true,\"chiryu.aichi.jp\":true,\"chita.aichi.jp\":true,\"fuso.aichi.jp\":true,\"gamagori.aichi.jp\":true,\"handa.aichi.jp\":true,\"hazu.aichi.jp\":true,\"hekinan.aichi.jp\":true,\"higashiura.aichi.jp\":true,\"ichinomiya.aichi.jp\":true,\"inazawa.aichi.jp\":true,\"inuyama.aichi.jp\":true,\"isshiki.aichi.jp\":true,\"iwakura.aichi.jp\":true,\"kanie.aichi.jp\":true,\"kariya.aichi.jp\":true,\"kasugai.aichi.jp\":true,\"kira.aichi.jp\":true,\"kiyosu.aichi.jp\":true,\"komaki.aichi.jp\":true,\"konan.aichi.jp\":true,\"kota.aichi.jp\":true,\"mihama.aichi.jp\":true,\"miyoshi.aichi.jp\":true,\"nishio.aichi.jp\":true,\"nisshin.aichi.jp\":true,\"obu.aichi.jp\":true,\"oguchi.aichi.jp\":true,\"oharu.aichi.jp\":true,\"okazaki.aichi.jp\":true,\"owariasahi.aichi.jp\":true,\"seto.aichi.jp\":true,\"shikatsu.aichi.jp\":true,\"shinshiro.aichi.jp\":true,\"shitara.aichi.jp\":true,\"tahara.aichi.jp\":true,\"takahama.aichi.jp\":true,\"tobishima.aichi.jp\":true,\"toei.aichi.jp\":true,\"togo.aichi.jp\":true,\"tokai.aichi.jp\":true,\"tokoname.aichi.jp\":true,\"toyoake.aichi.jp\":true,\"toyohashi.aichi.jp\":true,\"toyokawa.aichi.jp\":true,\"toyone.aichi.jp\":true,\"toyota.aichi.jp\":true,\"tsushima.aichi.jp\":true,\"yatomi.aichi.jp\":true,\"akita.akita.jp\":true,\"daisen.akita.jp\":true,\"fujisato.akita.jp\":true,\"gojome.akita.jp\":true,\"hachirogata.akita.jp\":true,\"happou.akita.jp\":true,\"higashinaruse.akita.jp\":true,\"honjo.akita.jp\":true,\"honjyo.akita.jp\":true,\"ikawa.akita.jp\":true,\"kamikoani.akita.jp\":true,\"kamioka.akita.jp\":true,\"katagami.akita.jp\":true,\"kazuno.akita.jp\":true,\"kitaakita.akita.jp\":true,\"kosaka.akita.jp\":true,\"kyowa.akita.jp\":true,\"misato.akita.jp\":true,\"mitane.akita.jp\":true,\"moriyoshi.akita.jp\":true,\"nikaho.akita.jp\":true,\"noshiro.akita.jp\":true,\"odate.akita.jp\":true,\"oga.akita.jp\":true,\"ogata.akita.jp\":true,\"semboku.akita.jp\":true,\"yokote.akita.jp\":true,\"yurihonjo.akita.jp\":true,\"aomori.aomori.jp\":true,\"gonohe.aomori.jp\":true,\"hachinohe.aomori.jp\":true,\"hashikami.aomori.jp\":true,\"hiranai.aomori.jp\":true,\"hirosaki.aomori.jp\":true,\"itayanagi.aomori.jp\":true,\"kuroishi.aomori.jp\":true,\"misawa.aomori.jp\":true,\"mutsu.aomori.jp\":true,\"nakadomari.aomori.jp\":true,\"noheji.aomori.jp\":true,\"oirase.aomori.jp\":true,\"owani.aomori.jp\":true,\"rokunohe.aomori.jp\":true,\"sannohe.aomori.jp\":true,\"shichinohe.aomori.jp\":true,\"shingo.aomori.jp\":true,\"takko.aomori.jp\":true,\"towada.aomori.jp\":true,\"tsugaru.aomori.jp\":true,\"tsuruta.aomori.jp\":true,\"abiko.chiba.jp\":true,\"asahi.chiba.jp\":true,\"chonan.chiba.jp\":true,\"chosei.chiba.jp\":true,\"choshi.chiba.jp\":true,\"chuo.chiba.jp\":true,\"funabashi.chiba.jp\":true,\"futtsu.chiba.jp\":true,\"hanamigawa.chiba.jp\":true,\"ichihara.chiba.jp\":true,\"ichikawa.chiba.jp\":true,\"ichinomiya.chiba.jp\":true,\"inzai.chiba.jp\":true,\"isumi.chiba.jp\":true,\"kamagaya.chiba.jp\":true,\"kamogawa.chiba.jp\":true,\"kashiwa.chiba.jp\":true,\"katori.chiba.jp\":true,\"katsuura.chiba.jp\":true,\"kimitsu.chiba.jp\":true,\"kisarazu.chiba.jp\":true,\"kozaki.chiba.jp\":true,\"kujukuri.chiba.jp\":true,\"kyonan.chiba.jp\":true,\"matsudo.chiba.jp\":true,\"midori.chiba.jp\":true,\"mihama.chiba.jp\":true,\"minamiboso.chiba.jp\":true,\"mobara.chiba.jp\":true,\"mutsuzawa.chiba.jp\":true,\"nagara.chiba.jp\":true,\"nagareyama.chiba.jp\":true,\"narashino.chiba.jp\":true,\"narita.chiba.jp\":true,\"noda.chiba.jp\":true,\"oamishirasato.chiba.jp\":true,\"omigawa.chiba.jp\":true,\"onjuku.chiba.jp\":true,\"otaki.chiba.jp\":true,\"sakae.chiba.jp\":true,\"sakura.chiba.jp\":true,\"shimofusa.chiba.jp\":true,\"shirako.chiba.jp\":true,\"shiroi.chiba.jp\":true,\"shisui.chiba.jp\":true,\"sodegaura.chiba.jp\":true,\"sosa.chiba.jp\":true,\"tako.chiba.jp\":true,\"tateyama.chiba.jp\":true,\"togane.chiba.jp\":true,\"tohnosho.chiba.jp\":true,\"tomisato.chiba.jp\":true,\"urayasu.chiba.jp\":true,\"yachimata.chiba.jp\":true,\"yachiyo.chiba.jp\":true,\"yokaichiba.chiba.jp\":true,\"yokoshibahikari.chiba.jp\":true,\"yotsukaido.chiba.jp\":true,\"ainan.ehime.jp\":true,\"honai.ehime.jp\":true,\"ikata.ehime.jp\":true,\"imabari.ehime.jp\":true,\"iyo.ehime.jp\":true,\"kamijima.ehime.jp\":true,\"kihoku.ehime.jp\":true,\"kumakogen.ehime.jp\":true,\"masaki.ehime.jp\":true,\"matsuno.ehime.jp\":true,\"matsuyama.ehime.jp\":true,\"namikata.ehime.jp\":true,\"niihama.ehime.jp\":true,\"ozu.ehime.jp\":true,\"saijo.ehime.jp\":true,\"seiyo.ehime.jp\":true,\"shikokuchuo.ehime.jp\":true,\"tobe.ehime.jp\":true,\"toon.ehime.jp\":true,\"uchiko.ehime.jp\":true,\"uwajima.ehime.jp\":true,\"yawatahama.ehime.jp\":true,\"echizen.fukui.jp\":true,\"eiheiji.fukui.jp\":true,\"fukui.fukui.jp\":true,\"ikeda.fukui.jp\":true,\"katsuyama.fukui.jp\":true,\"mihama.fukui.jp\":true,\"minamiechizen.fukui.jp\":true,\"obama.fukui.jp\":true,\"ohi.fukui.jp\":true,\"ono.fukui.jp\":true,\"sabae.fukui.jp\":true,\"sakai.fukui.jp\":true,\"takahama.fukui.jp\":true,\"tsuruga.fukui.jp\":true,\"wakasa.fukui.jp\":true,\"ashiya.fukuoka.jp\":true,\"buzen.fukuoka.jp\":true,\"chikugo.fukuoka.jp\":true,\"chikuho.fukuoka.jp\":true,\"chikujo.fukuoka.jp\":true,\"chikushino.fukuoka.jp\":true,\"chikuzen.fukuoka.jp\":true,\"chuo.fukuoka.jp\":true,\"dazaifu.fukuoka.jp\":true,\"fukuchi.fukuoka.jp\":true,\"hakata.fukuoka.jp\":true,\"higashi.fukuoka.jp\":true,\"hirokawa.fukuoka.jp\":true,\"hisayama.fukuoka.jp\":true,\"iizuka.fukuoka.jp\":true,\"inatsuki.fukuoka.jp\":true,\"kaho.fukuoka.jp\":true,\"kasuga.fukuoka.jp\":true,\"kasuya.fukuoka.jp\":true,\"kawara.fukuoka.jp\":true,\"keisen.fukuoka.jp\":true,\"koga.fukuoka.jp\":true,\"kurate.fukuoka.jp\":true,\"kurogi.fukuoka.jp\":true,\"kurume.fukuoka.jp\":true,\"minami.fukuoka.jp\":true,\"miyako.fukuoka.jp\":true,\"miyama.fukuoka.jp\":true,\"miyawaka.fukuoka.jp\":true,\"mizumaki.fukuoka.jp\":true,\"munakata.fukuoka.jp\":true,\"nakagawa.fukuoka.jp\":true,\"nakama.fukuoka.jp\":true,\"nishi.fukuoka.jp\":true,\"nogata.fukuoka.jp\":true,\"ogori.fukuoka.jp\":true,\"okagaki.fukuoka.jp\":true,\"okawa.fukuoka.jp\":true,\"oki.fukuoka.jp\":true,\"omuta.fukuoka.jp\":true,\"onga.fukuoka.jp\":true,\"onojo.fukuoka.jp\":true,\"oto.fukuoka.jp\":true,\"saigawa.fukuoka.jp\":true,\"sasaguri.fukuoka.jp\":true,\"shingu.fukuoka.jp\":true,\"shinyoshitomi.fukuoka.jp\":true,\"shonai.fukuoka.jp\":true,\"soeda.fukuoka.jp\":true,\"sue.fukuoka.jp\":true,\"tachiarai.fukuoka.jp\":true,\"tagawa.fukuoka.jp\":true,\"takata.fukuoka.jp\":true,\"toho.fukuoka.jp\":true,\"toyotsu.fukuoka.jp\":true,\"tsuiki.fukuoka.jp\":true,\"ukiha.fukuoka.jp\":true,\"umi.fukuoka.jp\":true,\"usui.fukuoka.jp\":true,\"yamada.fukuoka.jp\":true,\"yame.fukuoka.jp\":true,\"yanagawa.fukuoka.jp\":true,\"yukuhashi.fukuoka.jp\":true,\"aizubange.fukushima.jp\":true,\"aizumisato.fukushima.jp\":true,\"aizuwakamatsu.fukushima.jp\":true,\"asakawa.fukushima.jp\":true,\"bandai.fukushima.jp\":true,\"date.fukushima.jp\":true,\"fukushima.fukushima.jp\":true,\"furudono.fukushima.jp\":true,\"futaba.fukushima.jp\":true,\"hanawa.fukushima.jp\":true,\"higashi.fukushima.jp\":true,\"hirata.fukushima.jp\":true,\"hirono.fukushima.jp\":true,\"iitate.fukushima.jp\":true,\"inawashiro.fukushima.jp\":true,\"ishikawa.fukushima.jp\":true,\"iwaki.fukushima.jp\":true,\"izumizaki.fukushima.jp\":true,\"kagamiishi.fukushima.jp\":true,\"kaneyama.fukushima.jp\":true,\"kawamata.fukushima.jp\":true,\"kitakata.fukushima.jp\":true,\"kitashiobara.fukushima.jp\":true,\"koori.fukushima.jp\":true,\"koriyama.fukushima.jp\":true,\"kunimi.fukushima.jp\":true,\"miharu.fukushima.jp\":true,\"mishima.fukushima.jp\":true,\"namie.fukushima.jp\":true,\"nango.fukushima.jp\":true,\"nishiaizu.fukushima.jp\":true,\"nishigo.fukushima.jp\":true,\"okuma.fukushima.jp\":true,\"omotego.fukushima.jp\":true,\"ono.fukushima.jp\":true,\"otama.fukushima.jp\":true,\"samegawa.fukushima.jp\":true,\"shimogo.fukushima.jp\":true,\"shirakawa.fukushima.jp\":true,\"showa.fukushima.jp\":true,\"soma.fukushima.jp\":true,\"sukagawa.fukushima.jp\":true,\"taishin.fukushima.jp\":true,\"tamakawa.fukushima.jp\":true,\"tanagura.fukushima.jp\":true,\"tenei.fukushima.jp\":true,\"yabuki.fukushima.jp\":true,\"yamato.fukushima.jp\":true,\"yamatsuri.fukushima.jp\":true,\"yanaizu.fukushima.jp\":true,\"yugawa.fukushima.jp\":true,\"anpachi.gifu.jp\":true,\"ena.gifu.jp\":true,\"gifu.gifu.jp\":true,\"ginan.gifu.jp\":true,\"godo.gifu.jp\":true,\"gujo.gifu.jp\":true,\"hashima.gifu.jp\":true,\"hichiso.gifu.jp\":true,\"hida.gifu.jp\":true,\"higashishirakawa.gifu.jp\":true,\"ibigawa.gifu.jp\":true,\"ikeda.gifu.jp\":true,\"kakamigahara.gifu.jp\":true,\"kani.gifu.jp\":true,\"kasahara.gifu.jp\":true,\"kasamatsu.gifu.jp\":true,\"kawaue.gifu.jp\":true,\"kitagata.gifu.jp\":true,\"mino.gifu.jp\":true,\"minokamo.gifu.jp\":true,\"mitake.gifu.jp\":true,\"mizunami.gifu.jp\":true,\"motosu.gifu.jp\":true,\"nakatsugawa.gifu.jp\":true,\"ogaki.gifu.jp\":true,\"sakahogi.gifu.jp\":true,\"seki.gifu.jp\":true,\"sekigahara.gifu.jp\":true,\"shirakawa.gifu.jp\":true,\"tajimi.gifu.jp\":true,\"takayama.gifu.jp\":true,\"tarui.gifu.jp\":true,\"toki.gifu.jp\":true,\"tomika.gifu.jp\":true,\"wanouchi.gifu.jp\":true,\"yamagata.gifu.jp\":true,\"yaotsu.gifu.jp\":true,\"yoro.gifu.jp\":true,\"annaka.gunma.jp\":true,\"chiyoda.gunma.jp\":true,\"fujioka.gunma.jp\":true,\"higashiagatsuma.gunma.jp\":true,\"isesaki.gunma.jp\":true,\"itakura.gunma.jp\":true,\"kanna.gunma.jp\":true,\"kanra.gunma.jp\":true,\"katashina.gunma.jp\":true,\"kawaba.gunma.jp\":true,\"kiryu.gunma.jp\":true,\"kusatsu.gunma.jp\":true,\"maebashi.gunma.jp\":true,\"meiwa.gunma.jp\":true,\"midori.gunma.jp\":true,\"minakami.gunma.jp\":true,\"naganohara.gunma.jp\":true,\"nakanojo.gunma.jp\":true,\"nanmoku.gunma.jp\":true,\"numata.gunma.jp\":true,\"oizumi.gunma.jp\":true,\"ora.gunma.jp\":true,\"ota.gunma.jp\":true,\"shibukawa.gunma.jp\":true,\"shimonita.gunma.jp\":true,\"shinto.gunma.jp\":true,\"showa.gunma.jp\":true,\"takasaki.gunma.jp\":true,\"takayama.gunma.jp\":true,\"tamamura.gunma.jp\":true,\"tatebayashi.gunma.jp\":true,\"tomioka.gunma.jp\":true,\"tsukiyono.gunma.jp\":true,\"tsumagoi.gunma.jp\":true,\"ueno.gunma.jp\":true,\"yoshioka.gunma.jp\":true,\"asaminami.hiroshima.jp\":true,\"daiwa.hiroshima.jp\":true,\"etajima.hiroshima.jp\":true,\"fuchu.hiroshima.jp\":true,\"fukuyama.hiroshima.jp\":true,\"hatsukaichi.hiroshima.jp\":true,\"higashihiroshima.hiroshima.jp\":true,\"hongo.hiroshima.jp\":true,\"jinsekikogen.hiroshima.jp\":true,\"kaita.hiroshima.jp\":true,\"kui.hiroshima.jp\":true,\"kumano.hiroshima.jp\":true,\"kure.hiroshima.jp\":true,\"mihara.hiroshima.jp\":true,\"miyoshi.hiroshima.jp\":true,\"naka.hiroshima.jp\":true,\"onomichi.hiroshima.jp\":true,\"osakikamijima.hiroshima.jp\":true,\"otake.hiroshima.jp\":true,\"saka.hiroshima.jp\":true,\"sera.hiroshima.jp\":true,\"seranishi.hiroshima.jp\":true,\"shinichi.hiroshima.jp\":true,\"shobara.hiroshima.jp\":true,\"takehara.hiroshima.jp\":true,\"abashiri.hokkaido.jp\":true,\"abira.hokkaido.jp\":true,\"aibetsu.hokkaido.jp\":true,\"akabira.hokkaido.jp\":true,\"akkeshi.hokkaido.jp\":true,\"asahikawa.hokkaido.jp\":true,\"ashibetsu.hokkaido.jp\":true,\"ashoro.hokkaido.jp\":true,\"assabu.hokkaido.jp\":true,\"atsuma.hokkaido.jp\":true,\"bibai.hokkaido.jp\":true,\"biei.hokkaido.jp\":true,\"bifuka.hokkaido.jp\":true,\"bihoro.hokkaido.jp\":true,\"biratori.hokkaido.jp\":true,\"chippubetsu.hokkaido.jp\":true,\"chitose.hokkaido.jp\":true,\"date.hokkaido.jp\":true,\"ebetsu.hokkaido.jp\":true,\"embetsu.hokkaido.jp\":true,\"eniwa.hokkaido.jp\":true,\"erimo.hokkaido.jp\":true,\"esan.hokkaido.jp\":true,\"esashi.hokkaido.jp\":true,\"fukagawa.hokkaido.jp\":true,\"fukushima.hokkaido.jp\":true,\"furano.hokkaido.jp\":true,\"furubira.hokkaido.jp\":true,\"haboro.hokkaido.jp\":true,\"hakodate.hokkaido.jp\":true,\"hamatonbetsu.hokkaido.jp\":true,\"hidaka.hokkaido.jp\":true,\"higashikagura.hokkaido.jp\":true,\"higashikawa.hokkaido.jp\":true,\"hiroo.hokkaido.jp\":true,\"hokuryu.hokkaido.jp\":true,\"hokuto.hokkaido.jp\":true,\"honbetsu.hokkaido.jp\":true,\"horokanai.hokkaido.jp\":true,\"horonobe.hokkaido.jp\":true,\"ikeda.hokkaido.jp\":true,\"imakane.hokkaido.jp\":true,\"ishikari.hokkaido.jp\":true,\"iwamizawa.hokkaido.jp\":true,\"iwanai.hokkaido.jp\":true,\"kamifurano.hokkaido.jp\":true,\"kamikawa.hokkaido.jp\":true,\"kamishihoro.hokkaido.jp\":true,\"kamisunagawa.hokkaido.jp\":true,\"kamoenai.hokkaido.jp\":true,\"kayabe.hokkaido.jp\":true,\"kembuchi.hokkaido.jp\":true,\"kikonai.hokkaido.jp\":true,\"kimobetsu.hokkaido.jp\":true,\"kitahiroshima.hokkaido.jp\":true,\"kitami.hokkaido.jp\":true,\"kiyosato.hokkaido.jp\":true,\"koshimizu.hokkaido.jp\":true,\"kunneppu.hokkaido.jp\":true,\"kuriyama.hokkaido.jp\":true,\"kuromatsunai.hokkaido.jp\":true,\"kushiro.hokkaido.jp\":true,\"kutchan.hokkaido.jp\":true,\"kyowa.hokkaido.jp\":true,\"mashike.hokkaido.jp\":true,\"matsumae.hokkaido.jp\":true,\"mikasa.hokkaido.jp\":true,\"minamifurano.hokkaido.jp\":true,\"mombetsu.hokkaido.jp\":true,\"moseushi.hokkaido.jp\":true,\"mukawa.hokkaido.jp\":true,\"muroran.hokkaido.jp\":true,\"naie.hokkaido.jp\":true,\"nakagawa.hokkaido.jp\":true,\"nakasatsunai.hokkaido.jp\":true,\"nakatombetsu.hokkaido.jp\":true,\"nanae.hokkaido.jp\":true,\"nanporo.hokkaido.jp\":true,\"nayoro.hokkaido.jp\":true,\"nemuro.hokkaido.jp\":true,\"niikappu.hokkaido.jp\":true,\"niki.hokkaido.jp\":true,\"nishiokoppe.hokkaido.jp\":true,\"noboribetsu.hokkaido.jp\":true,\"numata.hokkaido.jp\":true,\"obihiro.hokkaido.jp\":true,\"obira.hokkaido.jp\":true,\"oketo.hokkaido.jp\":true,\"okoppe.hokkaido.jp\":true,\"otaru.hokkaido.jp\":true,\"otobe.hokkaido.jp\":true,\"otofuke.hokkaido.jp\":true,\"otoineppu.hokkaido.jp\":true,\"oumu.hokkaido.jp\":true,\"ozora.hokkaido.jp\":true,\"pippu.hokkaido.jp\":true,\"rankoshi.hokkaido.jp\":true,\"rebun.hokkaido.jp\":true,\"rikubetsu.hokkaido.jp\":true,\"rishiri.hokkaido.jp\":true,\"rishirifuji.hokkaido.jp\":true,\"saroma.hokkaido.jp\":true,\"sarufutsu.hokkaido.jp\":true,\"shakotan.hokkaido.jp\":true,\"shari.hokkaido.jp\":true,\"shibecha.hokkaido.jp\":true,\"shibetsu.hokkaido.jp\":true,\"shikabe.hokkaido.jp\":true,\"shikaoi.hokkaido.jp\":true,\"shimamaki.hokkaido.jp\":true,\"shimizu.hokkaido.jp\":true,\"shimokawa.hokkaido.jp\":true,\"shinshinotsu.hokkaido.jp\":true,\"shintoku.hokkaido.jp\":true,\"shiranuka.hokkaido.jp\":true,\"shiraoi.hokkaido.jp\":true,\"shiriuchi.hokkaido.jp\":true,\"sobetsu.hokkaido.jp\":true,\"sunagawa.hokkaido.jp\":true,\"taiki.hokkaido.jp\":true,\"takasu.hokkaido.jp\":true,\"takikawa.hokkaido.jp\":true,\"takinoue.hokkaido.jp\":true,\"teshikaga.hokkaido.jp\":true,\"tobetsu.hokkaido.jp\":true,\"tohma.hokkaido.jp\":true,\"tomakomai.hokkaido.jp\":true,\"tomari.hokkaido.jp\":true,\"toya.hokkaido.jp\":true,\"toyako.hokkaido.jp\":true,\"toyotomi.hokkaido.jp\":true,\"toyoura.hokkaido.jp\":true,\"tsubetsu.hokkaido.jp\":true,\"tsukigata.hokkaido.jp\":true,\"urakawa.hokkaido.jp\":true,\"urausu.hokkaido.jp\":true,\"uryu.hokkaido.jp\":true,\"utashinai.hokkaido.jp\":true,\"wakkanai.hokkaido.jp\":true,\"wassamu.hokkaido.jp\":true,\"yakumo.hokkaido.jp\":true,\"yoichi.hokkaido.jp\":true,\"aioi.hyogo.jp\":true,\"akashi.hyogo.jp\":true,\"ako.hyogo.jp\":true,\"amagasaki.hyogo.jp\":true,\"aogaki.hyogo.jp\":true,\"asago.hyogo.jp\":true,\"ashiya.hyogo.jp\":true,\"awaji.hyogo.jp\":true,\"fukusaki.hyogo.jp\":true,\"goshiki.hyogo.jp\":true,\"harima.hyogo.jp\":true,\"himeji.hyogo.jp\":true,\"ichikawa.hyogo.jp\":true,\"inagawa.hyogo.jp\":true,\"itami.hyogo.jp\":true,\"kakogawa.hyogo.jp\":true,\"kamigori.hyogo.jp\":true,\"kamikawa.hyogo.jp\":true,\"kasai.hyogo.jp\":true,\"kasuga.hyogo.jp\":true,\"kawanishi.hyogo.jp\":true,\"miki.hyogo.jp\":true,\"minamiawaji.hyogo.jp\":true,\"nishinomiya.hyogo.jp\":true,\"nishiwaki.hyogo.jp\":true,\"ono.hyogo.jp\":true,\"sanda.hyogo.jp\":true,\"sannan.hyogo.jp\":true,\"sasayama.hyogo.jp\":true,\"sayo.hyogo.jp\":true,\"shingu.hyogo.jp\":true,\"shinonsen.hyogo.jp\":true,\"shiso.hyogo.jp\":true,\"sumoto.hyogo.jp\":true,\"taishi.hyogo.jp\":true,\"taka.hyogo.jp\":true,\"takarazuka.hyogo.jp\":true,\"takasago.hyogo.jp\":true,\"takino.hyogo.jp\":true,\"tamba.hyogo.jp\":true,\"tatsuno.hyogo.jp\":true,\"toyooka.hyogo.jp\":true,\"yabu.hyogo.jp\":true,\"yashiro.hyogo.jp\":true,\"yoka.hyogo.jp\":true,\"yokawa.hyogo.jp\":true,\"ami.ibaraki.jp\":true,\"asahi.ibaraki.jp\":true,\"bando.ibaraki.jp\":true,\"chikusei.ibaraki.jp\":true,\"daigo.ibaraki.jp\":true,\"fujishiro.ibaraki.jp\":true,\"hitachi.ibaraki.jp\":true,\"hitachinaka.ibaraki.jp\":true,\"hitachiomiya.ibaraki.jp\":true,\"hitachiota.ibaraki.jp\":true,\"ibaraki.ibaraki.jp\":true,\"ina.ibaraki.jp\":true,\"inashiki.ibaraki.jp\":true,\"itako.ibaraki.jp\":true,\"iwama.ibaraki.jp\":true,\"joso.ibaraki.jp\":true,\"kamisu.ibaraki.jp\":true,\"kasama.ibaraki.jp\":true,\"kashima.ibaraki.jp\":true,\"kasumigaura.ibaraki.jp\":true,\"koga.ibaraki.jp\":true,\"miho.ibaraki.jp\":true,\"mito.ibaraki.jp\":true,\"moriya.ibaraki.jp\":true,\"naka.ibaraki.jp\":true,\"namegata.ibaraki.jp\":true,\"oarai.ibaraki.jp\":true,\"ogawa.ibaraki.jp\":true,\"omitama.ibaraki.jp\":true,\"ryugasaki.ibaraki.jp\":true,\"sakai.ibaraki.jp\":true,\"sakuragawa.ibaraki.jp\":true,\"shimodate.ibaraki.jp\":true,\"shimotsuma.ibaraki.jp\":true,\"shirosato.ibaraki.jp\":true,\"sowa.ibaraki.jp\":true,\"suifu.ibaraki.jp\":true,\"takahagi.ibaraki.jp\":true,\"tamatsukuri.ibaraki.jp\":true,\"tokai.ibaraki.jp\":true,\"tomobe.ibaraki.jp\":true,\"tone.ibaraki.jp\":true,\"toride.ibaraki.jp\":true,\"tsuchiura.ibaraki.jp\":true,\"tsukuba.ibaraki.jp\":true,\"uchihara.ibaraki.jp\":true,\"ushiku.ibaraki.jp\":true,\"yachiyo.ibaraki.jp\":true,\"yamagata.ibaraki.jp\":true,\"yawara.ibaraki.jp\":true,\"yuki.ibaraki.jp\":true,\"anamizu.ishikawa.jp\":true,\"hakui.ishikawa.jp\":true,\"hakusan.ishikawa.jp\":true,\"kaga.ishikawa.jp\":true,\"kahoku.ishikawa.jp\":true,\"kanazawa.ishikawa.jp\":true,\"kawakita.ishikawa.jp\":true,\"komatsu.ishikawa.jp\":true,\"nakanoto.ishikawa.jp\":true,\"nanao.ishikawa.jp\":true,\"nomi.ishikawa.jp\":true,\"nonoichi.ishikawa.jp\":true,\"noto.ishikawa.jp\":true,\"shika.ishikawa.jp\":true,\"suzu.ishikawa.jp\":true,\"tsubata.ishikawa.jp\":true,\"tsurugi.ishikawa.jp\":true,\"uchinada.ishikawa.jp\":true,\"wajima.ishikawa.jp\":true,\"fudai.iwate.jp\":true,\"fujisawa.iwate.jp\":true,\"hanamaki.iwate.jp\":true,\"hiraizumi.iwate.jp\":true,\"hirono.iwate.jp\":true,\"ichinohe.iwate.jp\":true,\"ichinoseki.iwate.jp\":true,\"iwaizumi.iwate.jp\":true,\"iwate.iwate.jp\":true,\"joboji.iwate.jp\":true,\"kamaishi.iwate.jp\":true,\"kanegasaki.iwate.jp\":true,\"karumai.iwate.jp\":true,\"kawai.iwate.jp\":true,\"kitakami.iwate.jp\":true,\"kuji.iwate.jp\":true,\"kunohe.iwate.jp\":true,\"kuzumaki.iwate.jp\":true,\"miyako.iwate.jp\":true,\"mizusawa.iwate.jp\":true,\"morioka.iwate.jp\":true,\"ninohe.iwate.jp\":true,\"noda.iwate.jp\":true,\"ofunato.iwate.jp\":true,\"oshu.iwate.jp\":true,\"otsuchi.iwate.jp\":true,\"rikuzentakata.iwate.jp\":true,\"shiwa.iwate.jp\":true,\"shizukuishi.iwate.jp\":true,\"sumita.iwate.jp\":true,\"tanohata.iwate.jp\":true,\"tono.iwate.jp\":true,\"yahaba.iwate.jp\":true,\"yamada.iwate.jp\":true,\"ayagawa.kagawa.jp\":true,\"higashikagawa.kagawa.jp\":true,\"kanonji.kagawa.jp\":true,\"kotohira.kagawa.jp\":true,\"manno.kagawa.jp\":true,\"marugame.kagawa.jp\":true,\"mitoyo.kagawa.jp\":true,\"naoshima.kagawa.jp\":true,\"sanuki.kagawa.jp\":true,\"tadotsu.kagawa.jp\":true,\"takamatsu.kagawa.jp\":true,\"tonosho.kagawa.jp\":true,\"uchinomi.kagawa.jp\":true,\"utazu.kagawa.jp\":true,\"zentsuji.kagawa.jp\":true,\"akune.kagoshima.jp\":true,\"amami.kagoshima.jp\":true,\"hioki.kagoshima.jp\":true,\"isa.kagoshima.jp\":true,\"isen.kagoshima.jp\":true,\"izumi.kagoshima.jp\":true,\"kagoshima.kagoshima.jp\":true,\"kanoya.kagoshima.jp\":true,\"kawanabe.kagoshima.jp\":true,\"kinko.kagoshima.jp\":true,\"kouyama.kagoshima.jp\":true,\"makurazaki.kagoshima.jp\":true,\"matsumoto.kagoshima.jp\":true,\"minamitane.kagoshima.jp\":true,\"nakatane.kagoshima.jp\":true,\"nishinoomote.kagoshima.jp\":true,\"satsumasendai.kagoshima.jp\":true,\"soo.kagoshima.jp\":true,\"tarumizu.kagoshima.jp\":true,\"yusui.kagoshima.jp\":true,\"aikawa.kanagawa.jp\":true,\"atsugi.kanagawa.jp\":true,\"ayase.kanagawa.jp\":true,\"chigasaki.kanagawa.jp\":true,\"ebina.kanagawa.jp\":true,\"fujisawa.kanagawa.jp\":true,\"hadano.kanagawa.jp\":true,\"hakone.kanagawa.jp\":true,\"hiratsuka.kanagawa.jp\":true,\"isehara.kanagawa.jp\":true,\"kaisei.kanagawa.jp\":true,\"kamakura.kanagawa.jp\":true,\"kiyokawa.kanagawa.jp\":true,\"matsuda.kanagawa.jp\":true,\"minamiashigara.kanagawa.jp\":true,\"miura.kanagawa.jp\":true,\"nakai.kanagawa.jp\":true,\"ninomiya.kanagawa.jp\":true,\"odawara.kanagawa.jp\":true,\"oi.kanagawa.jp\":true,\"oiso.kanagawa.jp\":true,\"sagamihara.kanagawa.jp\":true,\"samukawa.kanagawa.jp\":true,\"tsukui.kanagawa.jp\":true,\"yamakita.kanagawa.jp\":true,\"yamato.kanagawa.jp\":true,\"yokosuka.kanagawa.jp\":true,\"yugawara.kanagawa.jp\":true,\"zama.kanagawa.jp\":true,\"zushi.kanagawa.jp\":true,\"aki.kochi.jp\":true,\"geisei.kochi.jp\":true,\"hidaka.kochi.jp\":true,\"higashitsuno.kochi.jp\":true,\"ino.kochi.jp\":true,\"kagami.kochi.jp\":true,\"kami.kochi.jp\":true,\"kitagawa.kochi.jp\":true,\"kochi.kochi.jp\":true,\"mihara.kochi.jp\":true,\"motoyama.kochi.jp\":true,\"muroto.kochi.jp\":true,\"nahari.kochi.jp\":true,\"nakamura.kochi.jp\":true,\"nankoku.kochi.jp\":true,\"nishitosa.kochi.jp\":true,\"niyodogawa.kochi.jp\":true,\"ochi.kochi.jp\":true,\"okawa.kochi.jp\":true,\"otoyo.kochi.jp\":true,\"otsuki.kochi.jp\":true,\"sakawa.kochi.jp\":true,\"sukumo.kochi.jp\":true,\"susaki.kochi.jp\":true,\"tosa.kochi.jp\":true,\"tosashimizu.kochi.jp\":true,\"toyo.kochi.jp\":true,\"tsuno.kochi.jp\":true,\"umaji.kochi.jp\":true,\"yasuda.kochi.jp\":true,\"yusuhara.kochi.jp\":true,\"amakusa.kumamoto.jp\":true,\"arao.kumamoto.jp\":true,\"aso.kumamoto.jp\":true,\"choyo.kumamoto.jp\":true,\"gyokuto.kumamoto.jp\":true,\"kamiamakusa.kumamoto.jp\":true,\"kikuchi.kumamoto.jp\":true,\"kumamoto.kumamoto.jp\":true,\"mashiki.kumamoto.jp\":true,\"mifune.kumamoto.jp\":true,\"minamata.kumamoto.jp\":true,\"minamioguni.kumamoto.jp\":true,\"nagasu.kumamoto.jp\":true,\"nishihara.kumamoto.jp\":true,\"oguni.kumamoto.jp\":true,\"ozu.kumamoto.jp\":true,\"sumoto.kumamoto.jp\":true,\"takamori.kumamoto.jp\":true,\"uki.kumamoto.jp\":true,\"uto.kumamoto.jp\":true,\"yamaga.kumamoto.jp\":true,\"yamato.kumamoto.jp\":true,\"yatsushiro.kumamoto.jp\":true,\"ayabe.kyoto.jp\":true,\"fukuchiyama.kyoto.jp\":true,\"higashiyama.kyoto.jp\":true,\"ide.kyoto.jp\":true,\"ine.kyoto.jp\":true,\"joyo.kyoto.jp\":true,\"kameoka.kyoto.jp\":true,\"kamo.kyoto.jp\":true,\"kita.kyoto.jp\":true,\"kizu.kyoto.jp\":true,\"kumiyama.kyoto.jp\":true,\"kyotamba.kyoto.jp\":true,\"kyotanabe.kyoto.jp\":true,\"kyotango.kyoto.jp\":true,\"maizuru.kyoto.jp\":true,\"minami.kyoto.jp\":true,\"minamiyamashiro.kyoto.jp\":true,\"miyazu.kyoto.jp\":true,\"muko.kyoto.jp\":true,\"nagaokakyo.kyoto.jp\":true,\"nakagyo.kyoto.jp\":true,\"nantan.kyoto.jp\":true,\"oyamazaki.kyoto.jp\":true,\"sakyo.kyoto.jp\":true,\"seika.kyoto.jp\":true,\"tanabe.kyoto.jp\":true,\"uji.kyoto.jp\":true,\"ujitawara.kyoto.jp\":true,\"wazuka.kyoto.jp\":true,\"yamashina.kyoto.jp\":true,\"yawata.kyoto.jp\":true,\"asahi.mie.jp\":true,\"inabe.mie.jp\":true,\"ise.mie.jp\":true,\"kameyama.mie.jp\":true,\"kawagoe.mie.jp\":true,\"kiho.mie.jp\":true,\"kisosaki.mie.jp\":true,\"kiwa.mie.jp\":true,\"komono.mie.jp\":true,\"kumano.mie.jp\":true,\"kuwana.mie.jp\":true,\"matsusaka.mie.jp\":true,\"meiwa.mie.jp\":true,\"mihama.mie.jp\":true,\"minamiise.mie.jp\":true,\"misugi.mie.jp\":true,\"miyama.mie.jp\":true,\"nabari.mie.jp\":true,\"shima.mie.jp\":true,\"suzuka.mie.jp\":true,\"tado.mie.jp\":true,\"taiki.mie.jp\":true,\"taki.mie.jp\":true,\"tamaki.mie.jp\":true,\"toba.mie.jp\":true,\"tsu.mie.jp\":true,\"udono.mie.jp\":true,\"ureshino.mie.jp\":true,\"watarai.mie.jp\":true,\"yokkaichi.mie.jp\":true,\"furukawa.miyagi.jp\":true,\"higashimatsushima.miyagi.jp\":true,\"ishinomaki.miyagi.jp\":true,\"iwanuma.miyagi.jp\":true,\"kakuda.miyagi.jp\":true,\"kami.miyagi.jp\":true,\"kawasaki.miyagi.jp\":true,\"marumori.miyagi.jp\":true,\"matsushima.miyagi.jp\":true,\"minamisanriku.miyagi.jp\":true,\"misato.miyagi.jp\":true,\"murata.miyagi.jp\":true,\"natori.miyagi.jp\":true,\"ogawara.miyagi.jp\":true,\"ohira.miyagi.jp\":true,\"onagawa.miyagi.jp\":true,\"osaki.miyagi.jp\":true,\"rifu.miyagi.jp\":true,\"semine.miyagi.jp\":true,\"shibata.miyagi.jp\":true,\"shichikashuku.miyagi.jp\":true,\"shikama.miyagi.jp\":true,\"shiogama.miyagi.jp\":true,\"shiroishi.miyagi.jp\":true,\"tagajo.miyagi.jp\":true,\"taiwa.miyagi.jp\":true,\"tome.miyagi.jp\":true,\"tomiya.miyagi.jp\":true,\"wakuya.miyagi.jp\":true,\"watari.miyagi.jp\":true,\"yamamoto.miyagi.jp\":true,\"zao.miyagi.jp\":true,\"aya.miyazaki.jp\":true,\"ebino.miyazaki.jp\":true,\"gokase.miyazaki.jp\":true,\"hyuga.miyazaki.jp\":true,\"kadogawa.miyazaki.jp\":true,\"kawaminami.miyazaki.jp\":true,\"kijo.miyazaki.jp\":true,\"kitagawa.miyazaki.jp\":true,\"kitakata.miyazaki.jp\":true,\"kitaura.miyazaki.jp\":true,\"kobayashi.miyazaki.jp\":true,\"kunitomi.miyazaki.jp\":true,\"kushima.miyazaki.jp\":true,\"mimata.miyazaki.jp\":true,\"miyakonojo.miyazaki.jp\":true,\"miyazaki.miyazaki.jp\":true,\"morotsuka.miyazaki.jp\":true,\"nichinan.miyazaki.jp\":true,\"nishimera.miyazaki.jp\":true,\"nobeoka.miyazaki.jp\":true,\"saito.miyazaki.jp\":true,\"shiiba.miyazaki.jp\":true,\"shintomi.miyazaki.jp\":true,\"takaharu.miyazaki.jp\":true,\"takanabe.miyazaki.jp\":true,\"takazaki.miyazaki.jp\":true,\"tsuno.miyazaki.jp\":true,\"achi.nagano.jp\":true,\"agematsu.nagano.jp\":true,\"anan.nagano.jp\":true,\"aoki.nagano.jp\":true,\"asahi.nagano.jp\":true,\"azumino.nagano.jp\":true,\"chikuhoku.nagano.jp\":true,\"chikuma.nagano.jp\":true,\"chino.nagano.jp\":true,\"fujimi.nagano.jp\":true,\"hakuba.nagano.jp\":true,\"hara.nagano.jp\":true,\"hiraya.nagano.jp\":true,\"iida.nagano.jp\":true,\"iijima.nagano.jp\":true,\"iiyama.nagano.jp\":true,\"iizuna.nagano.jp\":true,\"ikeda.nagano.jp\":true,\"ikusaka.nagano.jp\":true,\"ina.nagano.jp\":true,\"karuizawa.nagano.jp\":true,\"kawakami.nagano.jp\":true,\"kiso.nagano.jp\":true,\"kisofukushima.nagano.jp\":true,\"kitaaiki.nagano.jp\":true,\"komagane.nagano.jp\":true,\"komoro.nagano.jp\":true,\"matsukawa.nagano.jp\":true,\"matsumoto.nagano.jp\":true,\"miasa.nagano.jp\":true,\"minamiaiki.nagano.jp\":true,\"minamimaki.nagano.jp\":true,\"minamiminowa.nagano.jp\":true,\"minowa.nagano.jp\":true,\"miyada.nagano.jp\":true,\"miyota.nagano.jp\":true,\"mochizuki.nagano.jp\":true,\"nagano.nagano.jp\":true,\"nagawa.nagano.jp\":true,\"nagiso.nagano.jp\":true,\"nakagawa.nagano.jp\":true,\"nakano.nagano.jp\":true,\"nozawaonsen.nagano.jp\":true,\"obuse.nagano.jp\":true,\"ogawa.nagano.jp\":true,\"okaya.nagano.jp\":true,\"omachi.nagano.jp\":true,\"omi.nagano.jp\":true,\"ookuwa.nagano.jp\":true,\"ooshika.nagano.jp\":true,\"otaki.nagano.jp\":true,\"otari.nagano.jp\":true,\"sakae.nagano.jp\":true,\"sakaki.nagano.jp\":true,\"saku.nagano.jp\":true,\"sakuho.nagano.jp\":true,\"shimosuwa.nagano.jp\":true,\"shinanomachi.nagano.jp\":true,\"shiojiri.nagano.jp\":true,\"suwa.nagano.jp\":true,\"suzaka.nagano.jp\":true,\"takagi.nagano.jp\":true,\"takamori.nagano.jp\":true,\"takayama.nagano.jp\":true,\"tateshina.nagano.jp\":true,\"tatsuno.nagano.jp\":true,\"togakushi.nagano.jp\":true,\"togura.nagano.jp\":true,\"tomi.nagano.jp\":true,\"ueda.nagano.jp\":true,\"wada.nagano.jp\":true,\"yamagata.nagano.jp\":true,\"yamanouchi.nagano.jp\":true,\"yasaka.nagano.jp\":true,\"yasuoka.nagano.jp\":true,\"chijiwa.nagasaki.jp\":true,\"futsu.nagasaki.jp\":true,\"goto.nagasaki.jp\":true,\"hasami.nagasaki.jp\":true,\"hirado.nagasaki.jp\":true,\"iki.nagasaki.jp\":true,\"isahaya.nagasaki.jp\":true,\"kawatana.nagasaki.jp\":true,\"kuchinotsu.nagasaki.jp\":true,\"matsuura.nagasaki.jp\":true,\"nagasaki.nagasaki.jp\":true,\"obama.nagasaki.jp\":true,\"omura.nagasaki.jp\":true,\"oseto.nagasaki.jp\":true,\"saikai.nagasaki.jp\":true,\"sasebo.nagasaki.jp\":true,\"seihi.nagasaki.jp\":true,\"shimabara.nagasaki.jp\":true,\"shinkamigoto.nagasaki.jp\":true,\"togitsu.nagasaki.jp\":true,\"tsushima.nagasaki.jp\":true,\"unzen.nagasaki.jp\":true,\"ando.nara.jp\":true,\"gose.nara.jp\":true,\"heguri.nara.jp\":true,\"higashiyoshino.nara.jp\":true,\"ikaruga.nara.jp\":true,\"ikoma.nara.jp\":true,\"kamikitayama.nara.jp\":true,\"kanmaki.nara.jp\":true,\"kashiba.nara.jp\":true,\"kashihara.nara.jp\":true,\"katsuragi.nara.jp\":true,\"kawai.nara.jp\":true,\"kawakami.nara.jp\":true,\"kawanishi.nara.jp\":true,\"koryo.nara.jp\":true,\"kurotaki.nara.jp\":true,\"mitsue.nara.jp\":true,\"miyake.nara.jp\":true,\"nara.nara.jp\":true,\"nosegawa.nara.jp\":true,\"oji.nara.jp\":true,\"ouda.nara.jp\":true,\"oyodo.nara.jp\":true,\"sakurai.nara.jp\":true,\"sango.nara.jp\":true,\"shimoichi.nara.jp\":true,\"shimokitayama.nara.jp\":true,\"shinjo.nara.jp\":true,\"soni.nara.jp\":true,\"takatori.nara.jp\":true,\"tawaramoto.nara.jp\":true,\"tenkawa.nara.jp\":true,\"tenri.nara.jp\":true,\"uda.nara.jp\":true,\"yamatokoriyama.nara.jp\":true,\"yamatotakada.nara.jp\":true,\"yamazoe.nara.jp\":true,\"yoshino.nara.jp\":true,\"aga.niigata.jp\":true,\"agano.niigata.jp\":true,\"gosen.niigata.jp\":true,\"itoigawa.niigata.jp\":true,\"izumozaki.niigata.jp\":true,\"joetsu.niigata.jp\":true,\"kamo.niigata.jp\":true,\"kariwa.niigata.jp\":true,\"kashiwazaki.niigata.jp\":true,\"minamiuonuma.niigata.jp\":true,\"mitsuke.niigata.jp\":true,\"muika.niigata.jp\":true,\"murakami.niigata.jp\":true,\"myoko.niigata.jp\":true,\"nagaoka.niigata.jp\":true,\"niigata.niigata.jp\":true,\"ojiya.niigata.jp\":true,\"omi.niigata.jp\":true,\"sado.niigata.jp\":true,\"sanjo.niigata.jp\":true,\"seiro.niigata.jp\":true,\"seirou.niigata.jp\":true,\"sekikawa.niigata.jp\":true,\"shibata.niigata.jp\":true,\"tagami.niigata.jp\":true,\"tainai.niigata.jp\":true,\"tochio.niigata.jp\":true,\"tokamachi.niigata.jp\":true,\"tsubame.niigata.jp\":true,\"tsunan.niigata.jp\":true,\"uonuma.niigata.jp\":true,\"yahiko.niigata.jp\":true,\"yoita.niigata.jp\":true,\"yuzawa.niigata.jp\":true,\"beppu.oita.jp\":true,\"bungoono.oita.jp\":true,\"bungotakada.oita.jp\":true,\"hasama.oita.jp\":true,\"hiji.oita.jp\":true,\"himeshima.oita.jp\":true,\"hita.oita.jp\":true,\"kamitsue.oita.jp\":true,\"kokonoe.oita.jp\":true,\"kuju.oita.jp\":true,\"kunisaki.oita.jp\":true,\"kusu.oita.jp\":true,\"oita.oita.jp\":true,\"saiki.oita.jp\":true,\"taketa.oita.jp\":true,\"tsukumi.oita.jp\":true,\"usa.oita.jp\":true,\"usuki.oita.jp\":true,\"yufu.oita.jp\":true,\"akaiwa.okayama.jp\":true,\"asakuchi.okayama.jp\":true,\"bizen.okayama.jp\":true,\"hayashima.okayama.jp\":true,\"ibara.okayama.jp\":true,\"kagamino.okayama.jp\":true,\"kasaoka.okayama.jp\":true,\"kibichuo.okayama.jp\":true,\"kumenan.okayama.jp\":true,\"kurashiki.okayama.jp\":true,\"maniwa.okayama.jp\":true,\"misaki.okayama.jp\":true,\"nagi.okayama.jp\":true,\"niimi.okayama.jp\":true,\"nishiawakura.okayama.jp\":true,\"okayama.okayama.jp\":true,\"satosho.okayama.jp\":true,\"setouchi.okayama.jp\":true,\"shinjo.okayama.jp\":true,\"shoo.okayama.jp\":true,\"soja.okayama.jp\":true,\"takahashi.okayama.jp\":true,\"tamano.okayama.jp\":true,\"tsuyama.okayama.jp\":true,\"wake.okayama.jp\":true,\"yakage.okayama.jp\":true,\"aguni.okinawa.jp\":true,\"ginowan.okinawa.jp\":true,\"ginoza.okinawa.jp\":true,\"gushikami.okinawa.jp\":true,\"haebaru.okinawa.jp\":true,\"higashi.okinawa.jp\":true,\"hirara.okinawa.jp\":true,\"iheya.okinawa.jp\":true,\"ishigaki.okinawa.jp\":true,\"ishikawa.okinawa.jp\":true,\"itoman.okinawa.jp\":true,\"izena.okinawa.jp\":true,\"kadena.okinawa.jp\":true,\"kin.okinawa.jp\":true,\"kitadaito.okinawa.jp\":true,\"kitanakagusuku.okinawa.jp\":true,\"kumejima.okinawa.jp\":true,\"kunigami.okinawa.jp\":true,\"minamidaito.okinawa.jp\":true,\"motobu.okinawa.jp\":true,\"nago.okinawa.jp\":true,\"naha.okinawa.jp\":true,\"nakagusuku.okinawa.jp\":true,\"nakijin.okinawa.jp\":true,\"nanjo.okinawa.jp\":true,\"nishihara.okinawa.jp\":true,\"ogimi.okinawa.jp\":true,\"okinawa.okinawa.jp\":true,\"onna.okinawa.jp\":true,\"shimoji.okinawa.jp\":true,\"taketomi.okinawa.jp\":true,\"tarama.okinawa.jp\":true,\"tokashiki.okinawa.jp\":true,\"tomigusuku.okinawa.jp\":true,\"tonaki.okinawa.jp\":true,\"urasoe.okinawa.jp\":true,\"uruma.okinawa.jp\":true,\"yaese.okinawa.jp\":true,\"yomitan.okinawa.jp\":true,\"yonabaru.okinawa.jp\":true,\"yonaguni.okinawa.jp\":true,\"zamami.okinawa.jp\":true,\"abeno.osaka.jp\":true,\"chihayaakasaka.osaka.jp\":true,\"chuo.osaka.jp\":true,\"daito.osaka.jp\":true,\"fujiidera.osaka.jp\":true,\"habikino.osaka.jp\":true,\"hannan.osaka.jp\":true,\"higashiosaka.osaka.jp\":true,\"higashisumiyoshi.osaka.jp\":true,\"higashiyodogawa.osaka.jp\":true,\"hirakata.osaka.jp\":true,\"ibaraki.osaka.jp\":true,\"ikeda.osaka.jp\":true,\"izumi.osaka.jp\":true,\"izumiotsu.osaka.jp\":true,\"izumisano.osaka.jp\":true,\"kadoma.osaka.jp\":true,\"kaizuka.osaka.jp\":true,\"kanan.osaka.jp\":true,\"kashiwara.osaka.jp\":true,\"katano.osaka.jp\":true,\"kawachinagano.osaka.jp\":true,\"kishiwada.osaka.jp\":true,\"kita.osaka.jp\":true,\"kumatori.osaka.jp\":true,\"matsubara.osaka.jp\":true,\"minato.osaka.jp\":true,\"minoh.osaka.jp\":true,\"misaki.osaka.jp\":true,\"moriguchi.osaka.jp\":true,\"neyagawa.osaka.jp\":true,\"nishi.osaka.jp\":true,\"nose.osaka.jp\":true,\"osakasayama.osaka.jp\":true,\"sakai.osaka.jp\":true,\"sayama.osaka.jp\":true,\"sennan.osaka.jp\":true,\"settsu.osaka.jp\":true,\"shijonawate.osaka.jp\":true,\"shimamoto.osaka.jp\":true,\"suita.osaka.jp\":true,\"tadaoka.osaka.jp\":true,\"taishi.osaka.jp\":true,\"tajiri.osaka.jp\":true,\"takaishi.osaka.jp\":true,\"takatsuki.osaka.jp\":true,\"tondabayashi.osaka.jp\":true,\"toyonaka.osaka.jp\":true,\"toyono.osaka.jp\":true,\"yao.osaka.jp\":true,\"ariake.saga.jp\":true,\"arita.saga.jp\":true,\"fukudomi.saga.jp\":true,\"genkai.saga.jp\":true,\"hamatama.saga.jp\":true,\"hizen.saga.jp\":true,\"imari.saga.jp\":true,\"kamimine.saga.jp\":true,\"kanzaki.saga.jp\":true,\"karatsu.saga.jp\":true,\"kashima.saga.jp\":true,\"kitagata.saga.jp\":true,\"kitahata.saga.jp\":true,\"kiyama.saga.jp\":true,\"kouhoku.saga.jp\":true,\"kyuragi.saga.jp\":true,\"nishiarita.saga.jp\":true,\"ogi.saga.jp\":true,\"omachi.saga.jp\":true,\"ouchi.saga.jp\":true,\"saga.saga.jp\":true,\"shiroishi.saga.jp\":true,\"taku.saga.jp\":true,\"tara.saga.jp\":true,\"tosu.saga.jp\":true,\"yoshinogari.saga.jp\":true,\"arakawa.saitama.jp\":true,\"asaka.saitama.jp\":true,\"chichibu.saitama.jp\":true,\"fujimi.saitama.jp\":true,\"fujimino.saitama.jp\":true,\"fukaya.saitama.jp\":true,\"hanno.saitama.jp\":true,\"hanyu.saitama.jp\":true,\"hasuda.saitama.jp\":true,\"hatogaya.saitama.jp\":true,\"hatoyama.saitama.jp\":true,\"hidaka.saitama.jp\":true,\"higashichichibu.saitama.jp\":true,\"higashimatsuyama.saitama.jp\":true,\"honjo.saitama.jp\":true,\"ina.saitama.jp\":true,\"iruma.saitama.jp\":true,\"iwatsuki.saitama.jp\":true,\"kamiizumi.saitama.jp\":true,\"kamikawa.saitama.jp\":true,\"kamisato.saitama.jp\":true,\"kasukabe.saitama.jp\":true,\"kawagoe.saitama.jp\":true,\"kawaguchi.saitama.jp\":true,\"kawajima.saitama.jp\":true,\"kazo.saitama.jp\":true,\"kitamoto.saitama.jp\":true,\"koshigaya.saitama.jp\":true,\"kounosu.saitama.jp\":true,\"kuki.saitama.jp\":true,\"kumagaya.saitama.jp\":true,\"matsubushi.saitama.jp\":true,\"minano.saitama.jp\":true,\"misato.saitama.jp\":true,\"miyashiro.saitama.jp\":true,\"miyoshi.saitama.jp\":true,\"moroyama.saitama.jp\":true,\"nagatoro.saitama.jp\":true,\"namegawa.saitama.jp\":true,\"niiza.saitama.jp\":true,\"ogano.saitama.jp\":true,\"ogawa.saitama.jp\":true,\"ogose.saitama.jp\":true,\"okegawa.saitama.jp\":true,\"omiya.saitama.jp\":true,\"otaki.saitama.jp\":true,\"ranzan.saitama.jp\":true,\"ryokami.saitama.jp\":true,\"saitama.saitama.jp\":true,\"sakado.saitama.jp\":true,\"satte.saitama.jp\":true,\"sayama.saitama.jp\":true,\"shiki.saitama.jp\":true,\"shiraoka.saitama.jp\":true,\"soka.saitama.jp\":true,\"sugito.saitama.jp\":true,\"toda.saitama.jp\":true,\"tokigawa.saitama.jp\":true,\"tokorozawa.saitama.jp\":true,\"tsurugashima.saitama.jp\":true,\"urawa.saitama.jp\":true,\"warabi.saitama.jp\":true,\"yashio.saitama.jp\":true,\"yokoze.saitama.jp\":true,\"yono.saitama.jp\":true,\"yorii.saitama.jp\":true,\"yoshida.saitama.jp\":true,\"yoshikawa.saitama.jp\":true,\"yoshimi.saitama.jp\":true,\"aisho.shiga.jp\":true,\"gamo.shiga.jp\":true,\"higashiomi.shiga.jp\":true,\"hikone.shiga.jp\":true,\"koka.shiga.jp\":true,\"konan.shiga.jp\":true,\"kosei.shiga.jp\":true,\"koto.shiga.jp\":true,\"kusatsu.shiga.jp\":true,\"maibara.shiga.jp\":true,\"moriyama.shiga.jp\":true,\"nagahama.shiga.jp\":true,\"nishiazai.shiga.jp\":true,\"notogawa.shiga.jp\":true,\"omihachiman.shiga.jp\":true,\"otsu.shiga.jp\":true,\"ritto.shiga.jp\":true,\"ryuoh.shiga.jp\":true,\"takashima.shiga.jp\":true,\"takatsuki.shiga.jp\":true,\"torahime.shiga.jp\":true,\"toyosato.shiga.jp\":true,\"yasu.shiga.jp\":true,\"akagi.shimane.jp\":true,\"ama.shimane.jp\":true,\"gotsu.shimane.jp\":true,\"hamada.shimane.jp\":true,\"higashiizumo.shimane.jp\":true,\"hikawa.shimane.jp\":true,\"hikimi.shimane.jp\":true,\"izumo.shimane.jp\":true,\"kakinoki.shimane.jp\":true,\"masuda.shimane.jp\":true,\"matsue.shimane.jp\":true,\"misato.shimane.jp\":true,\"nishinoshima.shimane.jp\":true,\"ohda.shimane.jp\":true,\"okinoshima.shimane.jp\":true,\"okuizumo.shimane.jp\":true,\"shimane.shimane.jp\":true,\"tamayu.shimane.jp\":true,\"tsuwano.shimane.jp\":true,\"unnan.shimane.jp\":true,\"yakumo.shimane.jp\":true,\"yasugi.shimane.jp\":true,\"yatsuka.shimane.jp\":true,\"arai.shizuoka.jp\":true,\"atami.shizuoka.jp\":true,\"fuji.shizuoka.jp\":true,\"fujieda.shizuoka.jp\":true,\"fujikawa.shizuoka.jp\":true,\"fujinomiya.shizuoka.jp\":true,\"fukuroi.shizuoka.jp\":true,\"gotemba.shizuoka.jp\":true,\"haibara.shizuoka.jp\":true,\"hamamatsu.shizuoka.jp\":true,\"higashiizu.shizuoka.jp\":true,\"ito.shizuoka.jp\":true,\"iwata.shizuoka.jp\":true,\"izu.shizuoka.jp\":true,\"izunokuni.shizuoka.jp\":true,\"kakegawa.shizuoka.jp\":true,\"kannami.shizuoka.jp\":true,\"kawanehon.shizuoka.jp\":true,\"kawazu.shizuoka.jp\":true,\"kikugawa.shizuoka.jp\":true,\"kosai.shizuoka.jp\":true,\"makinohara.shizuoka.jp\":true,\"matsuzaki.shizuoka.jp\":true,\"minamiizu.shizuoka.jp\":true,\"mishima.shizuoka.jp\":true,\"morimachi.shizuoka.jp\":true,\"nishiizu.shizuoka.jp\":true,\"numazu.shizuoka.jp\":true,\"omaezaki.shizuoka.jp\":true,\"shimada.shizuoka.jp\":true,\"shimizu.shizuoka.jp\":true,\"shimoda.shizuoka.jp\":true,\"shizuoka.shizuoka.jp\":true,\"susono.shizuoka.jp\":true,\"yaizu.shizuoka.jp\":true,\"yoshida.shizuoka.jp\":true,\"ashikaga.tochigi.jp\":true,\"bato.tochigi.jp\":true,\"haga.tochigi.jp\":true,\"ichikai.tochigi.jp\":true,\"iwafune.tochigi.jp\":true,\"kaminokawa.tochigi.jp\":true,\"kanuma.tochigi.jp\":true,\"karasuyama.tochigi.jp\":true,\"kuroiso.tochigi.jp\":true,\"mashiko.tochigi.jp\":true,\"mibu.tochigi.jp\":true,\"moka.tochigi.jp\":true,\"motegi.tochigi.jp\":true,\"nasu.tochigi.jp\":true,\"nasushiobara.tochigi.jp\":true,\"nikko.tochigi.jp\":true,\"nishikata.tochigi.jp\":true,\"nogi.tochigi.jp\":true,\"ohira.tochigi.jp\":true,\"ohtawara.tochigi.jp\":true,\"oyama.tochigi.jp\":true,\"sakura.tochigi.jp\":true,\"sano.tochigi.jp\":true,\"shimotsuke.tochigi.jp\":true,\"shioya.tochigi.jp\":true,\"takanezawa.tochigi.jp\":true,\"tochigi.tochigi.jp\":true,\"tsuga.tochigi.jp\":true,\"ujiie.tochigi.jp\":true,\"utsunomiya.tochigi.jp\":true,\"yaita.tochigi.jp\":true,\"aizumi.tokushima.jp\":true,\"anan.tokushima.jp\":true,\"ichiba.tokushima.jp\":true,\"itano.tokushima.jp\":true,\"kainan.tokushima.jp\":true,\"komatsushima.tokushima.jp\":true,\"matsushige.tokushima.jp\":true,\"mima.tokushima.jp\":true,\"minami.tokushima.jp\":true,\"miyoshi.tokushima.jp\":true,\"mugi.tokushima.jp\":true,\"nakagawa.tokushima.jp\":true,\"naruto.tokushima.jp\":true,\"sanagochi.tokushima.jp\":true,\"shishikui.tokushima.jp\":true,\"tokushima.tokushima.jp\":true,\"wajiki.tokushima.jp\":true,\"adachi.tokyo.jp\":true,\"akiruno.tokyo.jp\":true,\"akishima.tokyo.jp\":true,\"aogashima.tokyo.jp\":true,\"arakawa.tokyo.jp\":true,\"bunkyo.tokyo.jp\":true,\"chiyoda.tokyo.jp\":true,\"chofu.tokyo.jp\":true,\"chuo.tokyo.jp\":true,\"edogawa.tokyo.jp\":true,\"fuchu.tokyo.jp\":true,\"fussa.tokyo.jp\":true,\"hachijo.tokyo.jp\":true,\"hachioji.tokyo.jp\":true,\"hamura.tokyo.jp\":true,\"higashikurume.tokyo.jp\":true,\"higashimurayama.tokyo.jp\":true,\"higashiyamato.tokyo.jp\":true,\"hino.tokyo.jp\":true,\"hinode.tokyo.jp\":true,\"hinohara.tokyo.jp\":true,\"inagi.tokyo.jp\":true,\"itabashi.tokyo.jp\":true,\"katsushika.tokyo.jp\":true,\"kita.tokyo.jp\":true,\"kiyose.tokyo.jp\":true,\"kodaira.tokyo.jp\":true,\"koganei.tokyo.jp\":true,\"kokubunji.tokyo.jp\":true,\"komae.tokyo.jp\":true,\"koto.tokyo.jp\":true,\"kouzushima.tokyo.jp\":true,\"kunitachi.tokyo.jp\":true,\"machida.tokyo.jp\":true,\"meguro.tokyo.jp\":true,\"minato.tokyo.jp\":true,\"mitaka.tokyo.jp\":true,\"mizuho.tokyo.jp\":true,\"musashimurayama.tokyo.jp\":true,\"musashino.tokyo.jp\":true,\"nakano.tokyo.jp\":true,\"nerima.tokyo.jp\":true,\"ogasawara.tokyo.jp\":true,\"okutama.tokyo.jp\":true,\"ome.tokyo.jp\":true,\"oshima.tokyo.jp\":true,\"ota.tokyo.jp\":true,\"setagaya.tokyo.jp\":true,\"shibuya.tokyo.jp\":true,\"shinagawa.tokyo.jp\":true,\"shinjuku.tokyo.jp\":true,\"suginami.tokyo.jp\":true,\"sumida.tokyo.jp\":true,\"tachikawa.tokyo.jp\":true,\"taito.tokyo.jp\":true,\"tama.tokyo.jp\":true,\"toshima.tokyo.jp\":true,\"chizu.tottori.jp\":true,\"hino.tottori.jp\":true,\"kawahara.tottori.jp\":true,\"koge.tottori.jp\":true,\"kotoura.tottori.jp\":true,\"misasa.tottori.jp\":true,\"nanbu.tottori.jp\":true,\"nichinan.tottori.jp\":true,\"sakaiminato.tottori.jp\":true,\"tottori.tottori.jp\":true,\"wakasa.tottori.jp\":true,\"yazu.tottori.jp\":true,\"yonago.tottori.jp\":true,\"asahi.toyama.jp\":true,\"fuchu.toyama.jp\":true,\"fukumitsu.toyama.jp\":true,\"funahashi.toyama.jp\":true,\"himi.toyama.jp\":true,\"imizu.toyama.jp\":true,\"inami.toyama.jp\":true,\"johana.toyama.jp\":true,\"kamiichi.toyama.jp\":true,\"kurobe.toyama.jp\":true,\"nakaniikawa.toyama.jp\":true,\"namerikawa.toyama.jp\":true,\"nanto.toyama.jp\":true,\"nyuzen.toyama.jp\":true,\"oyabe.toyama.jp\":true,\"taira.toyama.jp\":true,\"takaoka.toyama.jp\":true,\"tateyama.toyama.jp\":true,\"toga.toyama.jp\":true,\"tonami.toyama.jp\":true,\"toyama.toyama.jp\":true,\"unazuki.toyama.jp\":true,\"uozu.toyama.jp\":true,\"yamada.toyama.jp\":true,\"arida.wakayama.jp\":true,\"aridagawa.wakayama.jp\":true,\"gobo.wakayama.jp\":true,\"hashimoto.wakayama.jp\":true,\"hidaka.wakayama.jp\":true,\"hirogawa.wakayama.jp\":true,\"inami.wakayama.jp\":true,\"iwade.wakayama.jp\":true,\"kainan.wakayama.jp\":true,\"kamitonda.wakayama.jp\":true,\"katsuragi.wakayama.jp\":true,\"kimino.wakayama.jp\":true,\"kinokawa.wakayama.jp\":true,\"kitayama.wakayama.jp\":true,\"koya.wakayama.jp\":true,\"koza.wakayama.jp\":true,\"kozagawa.wakayama.jp\":true,\"kudoyama.wakayama.jp\":true,\"kushimoto.wakayama.jp\":true,\"mihama.wakayama.jp\":true,\"misato.wakayama.jp\":true,\"nachikatsuura.wakayama.jp\":true,\"shingu.wakayama.jp\":true,\"shirahama.wakayama.jp\":true,\"taiji.wakayama.jp\":true,\"tanabe.wakayama.jp\":true,\"wakayama.wakayama.jp\":true,\"yuasa.wakayama.jp\":true,\"yura.wakayama.jp\":true,\"asahi.yamagata.jp\":true,\"funagata.yamagata.jp\":true,\"higashine.yamagata.jp\":true,\"iide.yamagata.jp\":true,\"kahoku.yamagata.jp\":true,\"kaminoyama.yamagata.jp\":true,\"kaneyama.yamagata.jp\":true,\"kawanishi.yamagata.jp\":true,\"mamurogawa.yamagata.jp\":true,\"mikawa.yamagata.jp\":true,\"murayama.yamagata.jp\":true,\"nagai.yamagata.jp\":true,\"nakayama.yamagata.jp\":true,\"nanyo.yamagata.jp\":true,\"nishikawa.yamagata.jp\":true,\"obanazawa.yamagata.jp\":true,\"oe.yamagata.jp\":true,\"oguni.yamagata.jp\":true,\"ohkura.yamagata.jp\":true,\"oishida.yamagata.jp\":true,\"sagae.yamagata.jp\":true,\"sakata.yamagata.jp\":true,\"sakegawa.yamagata.jp\":true,\"shinjo.yamagata.jp\":true,\"shirataka.yamagata.jp\":true,\"shonai.yamagata.jp\":true,\"takahata.yamagata.jp\":true,\"tendo.yamagata.jp\":true,\"tozawa.yamagata.jp\":true,\"tsuruoka.yamagata.jp\":true,\"yamagata.yamagata.jp\":true,\"yamanobe.yamagata.jp\":true,\"yonezawa.yamagata.jp\":true,\"yuza.yamagata.jp\":true,\"abu.yamaguchi.jp\":true,\"hagi.yamaguchi.jp\":true,\"hikari.yamaguchi.jp\":true,\"hofu.yamaguchi.jp\":true,\"iwakuni.yamaguchi.jp\":true,\"kudamatsu.yamaguchi.jp\":true,\"mitou.yamaguchi.jp\":true,\"nagato.yamaguchi.jp\":true,\"oshima.yamaguchi.jp\":true,\"shimonoseki.yamaguchi.jp\":true,\"shunan.yamaguchi.jp\":true,\"tabuse.yamaguchi.jp\":true,\"tokuyama.yamaguchi.jp\":true,\"toyota.yamaguchi.jp\":true,\"ube.yamaguchi.jp\":true,\"yuu.yamaguchi.jp\":true,\"chuo.yamanashi.jp\":true,\"doshi.yamanashi.jp\":true,\"fuefuki.yamanashi.jp\":true,\"fujikawa.yamanashi.jp\":true,\"fujikawaguchiko.yamanashi.jp\":true,\"fujiyoshida.yamanashi.jp\":true,\"hayakawa.yamanashi.jp\":true,\"hokuto.yamanashi.jp\":true,\"ichikawamisato.yamanashi.jp\":true,\"kai.yamanashi.jp\":true,\"kofu.yamanashi.jp\":true,\"koshu.yamanashi.jp\":true,\"kosuge.yamanashi.jp\":true,\"minami-alps.yamanashi.jp\":true,\"minobu.yamanashi.jp\":true,\"nakamichi.yamanashi.jp\":true,\"nanbu.yamanashi.jp\":true,\"narusawa.yamanashi.jp\":true,\"nirasaki.yamanashi.jp\":true,\"nishikatsura.yamanashi.jp\":true,\"oshino.yamanashi.jp\":true,\"otsuki.yamanashi.jp\":true,\"showa.yamanashi.jp\":true,\"tabayama.yamanashi.jp\":true,\"tsuru.yamanashi.jp\":true,\"uenohara.yamanashi.jp\":true,\"yamanakako.yamanashi.jp\":true,\"yamanashi.yamanashi.jp\":true,\"ke\":true,\"ac.ke\":true,\"co.ke\":true,\"go.ke\":true,\"info.ke\":true,\"me.ke\":true,\"mobi.ke\":true,\"ne.ke\":true,\"or.ke\":true,\"sc.ke\":true,\"kg\":true,\"org.kg\":true,\"net.kg\":true,\"com.kg\":true,\"edu.kg\":true,\"gov.kg\":true,\"mil.kg\":true,\"*.kh\":true,\"ki\":true,\"edu.ki\":true,\"biz.ki\":true,\"net.ki\":true,\"org.ki\":true,\"gov.ki\":true,\"info.ki\":true,\"com.ki\":true,\"km\":true,\"org.km\":true,\"nom.km\":true,\"gov.km\":true,\"prd.km\":true,\"tm.km\":true,\"edu.km\":true,\"mil.km\":true,\"ass.km\":true,\"com.km\":true,\"coop.km\":true,\"asso.km\":true,\"presse.km\":true,\"medecin.km\":true,\"notaires.km\":true,\"pharmaciens.km\":true,\"veterinaire.km\":true,\"gouv.km\":true,\"kn\":true,\"net.kn\":true,\"org.kn\":true,\"edu.kn\":true,\"gov.kn\":true,\"kp\":true,\"com.kp\":true,\"edu.kp\":true,\"gov.kp\":true,\"org.kp\":true,\"rep.kp\":true,\"tra.kp\":true,\"kr\":true,\"ac.kr\":true,\"co.kr\":true,\"es.kr\":true,\"go.kr\":true,\"hs.kr\":true,\"kg.kr\":true,\"mil.kr\":true,\"ms.kr\":true,\"ne.kr\":true,\"or.kr\":true,\"pe.kr\":true,\"re.kr\":true,\"sc.kr\":true,\"busan.kr\":true,\"chungbuk.kr\":true,\"chungnam.kr\":true,\"daegu.kr\":true,\"daejeon.kr\":true,\"gangwon.kr\":true,\"gwangju.kr\":true,\"gyeongbuk.kr\":true,\"gyeonggi.kr\":true,\"gyeongnam.kr\":true,\"incheon.kr\":true,\"jeju.kr\":true,\"jeonbuk.kr\":true,\"jeonnam.kr\":true,\"seoul.kr\":true,\"ulsan.kr\":true,\"*.kw\":true,\"ky\":true,\"edu.ky\":true,\"gov.ky\":true,\"com.ky\":true,\"org.ky\":true,\"net.ky\":true,\"kz\":true,\"org.kz\":true,\"edu.kz\":true,\"net.kz\":true,\"gov.kz\":true,\"mil.kz\":true,\"com.kz\":true,\"la\":true,\"int.la\":true,\"net.la\":true,\"info.la\":true,\"edu.la\":true,\"gov.la\":true,\"per.la\":true,\"com.la\":true,\"org.la\":true,\"lb\":true,\"com.lb\":true,\"edu.lb\":true,\"gov.lb\":true,\"net.lb\":true,\"org.lb\":true,\"lc\":true,\"com.lc\":true,\"net.lc\":true,\"co.lc\":true,\"org.lc\":true,\"edu.lc\":true,\"gov.lc\":true,\"li\":true,\"lk\":true,\"gov.lk\":true,\"sch.lk\":true,\"net.lk\":true,\"int.lk\":true,\"com.lk\":true,\"org.lk\":true,\"edu.lk\":true,\"ngo.lk\":true,\"soc.lk\":true,\"web.lk\":true,\"ltd.lk\":true,\"assn.lk\":true,\"grp.lk\":true,\"hotel.lk\":true,\"ac.lk\":true,\"lr\":true,\"com.lr\":true,\"edu.lr\":true,\"gov.lr\":true,\"org.lr\":true,\"net.lr\":true,\"ls\":true,\"co.ls\":true,\"org.ls\":true,\"lt\":true,\"gov.lt\":true,\"lu\":true,\"lv\":true,\"com.lv\":true,\"edu.lv\":true,\"gov.lv\":true,\"org.lv\":true,\"mil.lv\":true,\"id.lv\":true,\"net.lv\":true,\"asn.lv\":true,\"conf.lv\":true,\"ly\":true,\"com.ly\":true,\"net.ly\":true,\"gov.ly\":true,\"plc.ly\":true,\"edu.ly\":true,\"sch.ly\":true,\"med.ly\":true,\"org.ly\":true,\"id.ly\":true,\"ma\":true,\"co.ma\":true,\"net.ma\":true,\"gov.ma\":true,\"org.ma\":true,\"ac.ma\":true,\"press.ma\":true,\"mc\":true,\"tm.mc\":true,\"asso.mc\":true,\"md\":true,\"me\":true,\"co.me\":true,\"net.me\":true,\"org.me\":true,\"edu.me\":true,\"ac.me\":true,\"gov.me\":true,\"its.me\":true,\"priv.me\":true,\"mg\":true,\"org.mg\":true,\"nom.mg\":true,\"gov.mg\":true,\"prd.mg\":true,\"tm.mg\":true,\"edu.mg\":true,\"mil.mg\":true,\"com.mg\":true,\"co.mg\":true,\"mh\":true,\"mil\":true,\"mk\":true,\"com.mk\":true,\"org.mk\":true,\"net.mk\":true,\"edu.mk\":true,\"gov.mk\":true,\"inf.mk\":true,\"name.mk\":true,\"ml\":true,\"com.ml\":true,\"edu.ml\":true,\"gouv.ml\":true,\"gov.ml\":true,\"net.ml\":true,\"org.ml\":true,\"presse.ml\":true,\"*.mm\":true,\"mn\":true,\"gov.mn\":true,\"edu.mn\":true,\"org.mn\":true,\"mo\":true,\"com.mo\":true,\"net.mo\":true,\"org.mo\":true,\"edu.mo\":true,\"gov.mo\":true,\"mobi\":true,\"mp\":true,\"mq\":true,\"mr\":true,\"gov.mr\":true,\"ms\":true,\"com.ms\":true,\"edu.ms\":true,\"gov.ms\":true,\"net.ms\":true,\"org.ms\":true,\"mt\":true,\"com.mt\":true,\"edu.mt\":true,\"net.mt\":true,\"org.mt\":true,\"mu\":true,\"com.mu\":true,\"net.mu\":true,\"org.mu\":true,\"gov.mu\":true,\"ac.mu\":true,\"co.mu\":true,\"or.mu\":true,\"museum\":true,\"academy.museum\":true,\"agriculture.museum\":true,\"air.museum\":true,\"airguard.museum\":true,\"alabama.museum\":true,\"alaska.museum\":true,\"amber.museum\":true,\"ambulance.museum\":true,\"american.museum\":true,\"americana.museum\":true,\"americanantiques.museum\":true,\"americanart.museum\":true,\"amsterdam.museum\":true,\"and.museum\":true,\"annefrank.museum\":true,\"anthro.museum\":true,\"anthropology.museum\":true,\"antiques.museum\":true,\"aquarium.museum\":true,\"arboretum.museum\":true,\"archaeological.museum\":true,\"archaeology.museum\":true,\"architecture.museum\":true,\"art.museum\":true,\"artanddesign.museum\":true,\"artcenter.museum\":true,\"artdeco.museum\":true,\"arteducation.museum\":true,\"artgallery.museum\":true,\"arts.museum\":true,\"artsandcrafts.museum\":true,\"asmatart.museum\":true,\"assassination.museum\":true,\"assisi.museum\":true,\"association.museum\":true,\"astronomy.museum\":true,\"atlanta.museum\":true,\"austin.museum\":true,\"australia.museum\":true,\"automotive.museum\":true,\"aviation.museum\":true,\"axis.museum\":true,\"badajoz.museum\":true,\"baghdad.museum\":true,\"bahn.museum\":true,\"bale.museum\":true,\"baltimore.museum\":true,\"barcelona.museum\":true,\"baseball.museum\":true,\"basel.museum\":true,\"baths.museum\":true,\"bauern.museum\":true,\"beauxarts.museum\":true,\"beeldengeluid.museum\":true,\"bellevue.museum\":true,\"bergbau.museum\":true,\"berkeley.museum\":true,\"berlin.museum\":true,\"bern.museum\":true,\"bible.museum\":true,\"bilbao.museum\":true,\"bill.museum\":true,\"birdart.museum\":true,\"birthplace.museum\":true,\"bonn.museum\":true,\"boston.museum\":true,\"botanical.museum\":true,\"botanicalgarden.museum\":true,\"botanicgarden.museum\":true,\"botany.museum\":true,\"brandywinevalley.museum\":true,\"brasil.museum\":true,\"bristol.museum\":true,\"british.museum\":true,\"britishcolumbia.museum\":true,\"broadcast.museum\":true,\"brunel.museum\":true,\"brussel.museum\":true,\"brussels.museum\":true,\"bruxelles.museum\":true,\"building.museum\":true,\"burghof.museum\":true,\"bus.museum\":true,\"bushey.museum\":true,\"cadaques.museum\":true,\"california.museum\":true,\"cambridge.museum\":true,\"can.museum\":true,\"canada.museum\":true,\"capebreton.museum\":true,\"carrier.museum\":true,\"cartoonart.museum\":true,\"casadelamoneda.museum\":true,\"castle.museum\":true,\"castres.museum\":true,\"celtic.museum\":true,\"center.museum\":true,\"chattanooga.museum\":true,\"cheltenham.museum\":true,\"chesapeakebay.museum\":true,\"chicago.museum\":true,\"children.museum\":true,\"childrens.museum\":true,\"childrensgarden.museum\":true,\"chiropractic.museum\":true,\"chocolate.museum\":true,\"christiansburg.museum\":true,\"cincinnati.museum\":true,\"cinema.museum\":true,\"circus.museum\":true,\"civilisation.museum\":true,\"civilization.museum\":true,\"civilwar.museum\":true,\"clinton.museum\":true,\"clock.museum\":true,\"coal.museum\":true,\"coastaldefence.museum\":true,\"cody.museum\":true,\"coldwar.museum\":true,\"collection.museum\":true,\"colonialwilliamsburg.museum\":true,\"coloradoplateau.museum\":true,\"columbia.museum\":true,\"columbus.museum\":true,\"communication.museum\":true,\"communications.museum\":true,\"community.museum\":true,\"computer.museum\":true,\"computerhistory.museum\":true,\"xn--comunicaes-v6a2o.museum\":true,\"contemporary.museum\":true,\"contemporaryart.museum\":true,\"convent.museum\":true,\"copenhagen.museum\":true,\"corporation.museum\":true,\"xn--correios-e-telecomunicaes-ghc29a.museum\":true,\"corvette.museum\":true,\"costume.museum\":true,\"countryestate.museum\":true,\"county.museum\":true,\"crafts.museum\":true,\"cranbrook.museum\":true,\"creation.museum\":true,\"cultural.museum\":true,\"culturalcenter.museum\":true,\"culture.museum\":true,\"cyber.museum\":true,\"cymru.museum\":true,\"dali.museum\":true,\"dallas.museum\":true,\"database.museum\":true,\"ddr.museum\":true,\"decorativearts.museum\":true,\"delaware.museum\":true,\"delmenhorst.museum\":true,\"denmark.museum\":true,\"depot.museum\":true,\"design.museum\":true,\"detroit.museum\":true,\"dinosaur.museum\":true,\"discovery.museum\":true,\"dolls.museum\":true,\"donostia.museum\":true,\"durham.museum\":true,\"eastafrica.museum\":true,\"eastcoast.museum\":true,\"education.museum\":true,\"educational.museum\":true,\"egyptian.museum\":true,\"eisenbahn.museum\":true,\"elburg.museum\":true,\"elvendrell.museum\":true,\"embroidery.museum\":true,\"encyclopedic.museum\":true,\"england.museum\":true,\"entomology.museum\":true,\"environment.museum\":true,\"environmentalconservation.museum\":true,\"epilepsy.museum\":true,\"essex.museum\":true,\"estate.museum\":true,\"ethnology.museum\":true,\"exeter.museum\":true,\"exhibition.museum\":true,\"family.museum\":true,\"farm.museum\":true,\"farmequipment.museum\":true,\"farmers.museum\":true,\"farmstead.museum\":true,\"field.museum\":true,\"figueres.museum\":true,\"filatelia.museum\":true,\"film.museum\":true,\"fineart.museum\":true,\"finearts.museum\":true,\"finland.museum\":true,\"flanders.museum\":true,\"florida.museum\":true,\"force.museum\":true,\"fortmissoula.museum\":true,\"fortworth.museum\":true,\"foundation.museum\":true,\"francaise.museum\":true,\"frankfurt.museum\":true,\"franziskaner.museum\":true,\"freemasonry.museum\":true,\"freiburg.museum\":true,\"fribourg.museum\":true,\"frog.museum\":true,\"fundacio.museum\":true,\"furniture.museum\":true,\"gallery.museum\":true,\"garden.museum\":true,\"gateway.museum\":true,\"geelvinck.museum\":true,\"gemological.museum\":true,\"geology.museum\":true,\"georgia.museum\":true,\"giessen.museum\":true,\"glas.museum\":true,\"glass.museum\":true,\"gorge.museum\":true,\"grandrapids.museum\":true,\"graz.museum\":true,\"guernsey.museum\":true,\"halloffame.museum\":true,\"hamburg.museum\":true,\"handson.museum\":true,\"harvestcelebration.museum\":true,\"hawaii.museum\":true,\"health.museum\":true,\"heimatunduhren.museum\":true,\"hellas.museum\":true,\"helsinki.museum\":true,\"hembygdsforbund.museum\":true,\"heritage.museum\":true,\"histoire.museum\":true,\"historical.museum\":true,\"historicalsociety.museum\":true,\"historichouses.museum\":true,\"historisch.museum\":true,\"historisches.museum\":true,\"history.museum\":true,\"historyofscience.museum\":true,\"horology.museum\":true,\"house.museum\":true,\"humanities.museum\":true,\"illustration.museum\":true,\"imageandsound.museum\":true,\"indian.museum\":true,\"indiana.museum\":true,\"indianapolis.museum\":true,\"indianmarket.museum\":true,\"intelligence.museum\":true,\"interactive.museum\":true,\"iraq.museum\":true,\"iron.museum\":true,\"isleofman.museum\":true,\"jamison.museum\":true,\"jefferson.museum\":true,\"jerusalem.museum\":true,\"jewelry.museum\":true,\"jewish.museum\":true,\"jewishart.museum\":true,\"jfk.museum\":true,\"journalism.museum\":true,\"judaica.museum\":true,\"judygarland.museum\":true,\"juedisches.museum\":true,\"juif.museum\":true,\"karate.museum\":true,\"karikatur.museum\":true,\"kids.museum\":true,\"koebenhavn.museum\":true,\"koeln.museum\":true,\"kunst.museum\":true,\"kunstsammlung.museum\":true,\"kunstunddesign.museum\":true,\"labor.museum\":true,\"labour.museum\":true,\"lajolla.museum\":true,\"lancashire.museum\":true,\"landes.museum\":true,\"lans.museum\":true,\"xn--lns-qla.museum\":true,\"larsson.museum\":true,\"lewismiller.museum\":true,\"lincoln.museum\":true,\"linz.museum\":true,\"living.museum\":true,\"livinghistory.museum\":true,\"localhistory.museum\":true,\"london.museum\":true,\"losangeles.museum\":true,\"louvre.museum\":true,\"loyalist.museum\":true,\"lucerne.museum\":true,\"luxembourg.museum\":true,\"luzern.museum\":true,\"mad.museum\":true,\"madrid.museum\":true,\"mallorca.museum\":true,\"manchester.museum\":true,\"mansion.museum\":true,\"mansions.museum\":true,\"manx.museum\":true,\"marburg.museum\":true,\"maritime.museum\":true,\"maritimo.museum\":true,\"maryland.museum\":true,\"marylhurst.museum\":true,\"media.museum\":true,\"medical.museum\":true,\"medizinhistorisches.museum\":true,\"meeres.museum\":true,\"memorial.museum\":true,\"mesaverde.museum\":true,\"michigan.museum\":true,\"midatlantic.museum\":true,\"military.museum\":true,\"mill.museum\":true,\"miners.museum\":true,\"mining.museum\":true,\"minnesota.museum\":true,\"missile.museum\":true,\"missoula.museum\":true,\"modern.museum\":true,\"moma.museum\":true,\"money.museum\":true,\"monmouth.museum\":true,\"monticello.museum\":true,\"montreal.museum\":true,\"moscow.museum\":true,\"motorcycle.museum\":true,\"muenchen.museum\":true,\"muenster.museum\":true,\"mulhouse.museum\":true,\"muncie.museum\":true,\"museet.museum\":true,\"museumcenter.museum\":true,\"museumvereniging.museum\":true,\"music.museum\":true,\"national.museum\":true,\"nationalfirearms.museum\":true,\"nationalheritage.museum\":true,\"nativeamerican.museum\":true,\"naturalhistory.museum\":true,\"naturalhistorymuseum.museum\":true,\"naturalsciences.museum\":true,\"nature.museum\":true,\"naturhistorisches.museum\":true,\"natuurwetenschappen.museum\":true,\"naumburg.museum\":true,\"naval.museum\":true,\"nebraska.museum\":true,\"neues.museum\":true,\"newhampshire.museum\":true,\"newjersey.museum\":true,\"newmexico.museum\":true,\"newport.museum\":true,\"newspaper.museum\":true,\"newyork.museum\":true,\"niepce.museum\":true,\"norfolk.museum\":true,\"north.museum\":true,\"nrw.museum\":true,\"nuernberg.museum\":true,\"nuremberg.museum\":true,\"nyc.museum\":true,\"nyny.museum\":true,\"oceanographic.museum\":true,\"oceanographique.museum\":true,\"omaha.museum\":true,\"online.museum\":true,\"ontario.museum\":true,\"openair.museum\":true,\"oregon.museum\":true,\"oregontrail.museum\":true,\"otago.museum\":true,\"oxford.museum\":true,\"pacific.museum\":true,\"paderborn.museum\":true,\"palace.museum\":true,\"paleo.museum\":true,\"palmsprings.museum\":true,\"panama.museum\":true,\"paris.museum\":true,\"pasadena.museum\":true,\"pharmacy.museum\":true,\"philadelphia.museum\":true,\"philadelphiaarea.museum\":true,\"philately.museum\":true,\"phoenix.museum\":true,\"photography.museum\":true,\"pilots.museum\":true,\"pittsburgh.museum\":true,\"planetarium.museum\":true,\"plantation.museum\":true,\"plants.museum\":true,\"plaza.museum\":true,\"portal.museum\":true,\"portland.museum\":true,\"portlligat.museum\":true,\"posts-and-telecommunications.museum\":true,\"preservation.museum\":true,\"presidio.museum\":true,\"press.museum\":true,\"project.museum\":true,\"public.museum\":true,\"pubol.museum\":true,\"quebec.museum\":true,\"railroad.museum\":true,\"railway.museum\":true,\"research.museum\":true,\"resistance.museum\":true,\"riodejaneiro.museum\":true,\"rochester.museum\":true,\"rockart.museum\":true,\"roma.museum\":true,\"russia.museum\":true,\"saintlouis.museum\":true,\"salem.museum\":true,\"salvadordali.museum\":true,\"salzburg.museum\":true,\"sandiego.museum\":true,\"sanfrancisco.museum\":true,\"santabarbara.museum\":true,\"santacruz.museum\":true,\"santafe.museum\":true,\"saskatchewan.museum\":true,\"satx.museum\":true,\"savannahga.museum\":true,\"schlesisches.museum\":true,\"schoenbrunn.museum\":true,\"schokoladen.museum\":true,\"school.museum\":true,\"schweiz.museum\":true,\"science.museum\":true,\"scienceandhistory.museum\":true,\"scienceandindustry.museum\":true,\"sciencecenter.museum\":true,\"sciencecenters.museum\":true,\"science-fiction.museum\":true,\"sciencehistory.museum\":true,\"sciences.museum\":true,\"sciencesnaturelles.museum\":true,\"scotland.museum\":true,\"seaport.museum\":true,\"settlement.museum\":true,\"settlers.museum\":true,\"shell.museum\":true,\"sherbrooke.museum\":true,\"sibenik.museum\":true,\"silk.museum\":true,\"ski.museum\":true,\"skole.museum\":true,\"society.museum\":true,\"sologne.museum\":true,\"soundandvision.museum\":true,\"southcarolina.museum\":true,\"southwest.museum\":true,\"space.museum\":true,\"spy.museum\":true,\"square.museum\":true,\"stadt.museum\":true,\"stalbans.museum\":true,\"starnberg.museum\":true,\"state.museum\":true,\"stateofdelaware.museum\":true,\"station.museum\":true,\"steam.museum\":true,\"steiermark.museum\":true,\"stjohn.museum\":true,\"stockholm.museum\":true,\"stpetersburg.museum\":true,\"stuttgart.museum\":true,\"suisse.museum\":true,\"surgeonshall.museum\":true,\"surrey.museum\":true,\"svizzera.museum\":true,\"sweden.museum\":true,\"sydney.museum\":true,\"tank.museum\":true,\"tcm.museum\":true,\"technology.museum\":true,\"telekommunikation.museum\":true,\"television.museum\":true,\"texas.museum\":true,\"textile.museum\":true,\"theater.museum\":true,\"time.museum\":true,\"timekeeping.museum\":true,\"topology.museum\":true,\"torino.museum\":true,\"touch.museum\":true,\"town.museum\":true,\"transport.museum\":true,\"tree.museum\":true,\"trolley.museum\":true,\"trust.museum\":true,\"trustee.museum\":true,\"uhren.museum\":true,\"ulm.museum\":true,\"undersea.museum\":true,\"university.museum\":true,\"usa.museum\":true,\"usantiques.museum\":true,\"usarts.museum\":true,\"uscountryestate.museum\":true,\"usculture.museum\":true,\"usdecorativearts.museum\":true,\"usgarden.museum\":true,\"ushistory.museum\":true,\"ushuaia.museum\":true,\"uslivinghistory.museum\":true,\"utah.museum\":true,\"uvic.museum\":true,\"valley.museum\":true,\"vantaa.museum\":true,\"versailles.museum\":true,\"viking.museum\":true,\"village.museum\":true,\"virginia.museum\":true,\"virtual.museum\":true,\"virtuel.museum\":true,\"vlaanderen.museum\":true,\"volkenkunde.museum\":true,\"wales.museum\":true,\"wallonie.museum\":true,\"war.museum\":true,\"washingtondc.museum\":true,\"watchandclock.museum\":true,\"watch-and-clock.museum\":true,\"western.museum\":true,\"westfalen.museum\":true,\"whaling.museum\":true,\"wildlife.museum\":true,\"williamsburg.museum\":true,\"windmill.museum\":true,\"workshop.museum\":true,\"york.museum\":true,\"yorkshire.museum\":true,\"yosemite.museum\":true,\"youth.museum\":true,\"zoological.museum\":true,\"zoology.museum\":true,\"xn--9dbhblg6di.museum\":true,\"xn--h1aegh.museum\":true,\"mv\":true,\"aero.mv\":true,\"biz.mv\":true,\"com.mv\":true,\"coop.mv\":true,\"edu.mv\":true,\"gov.mv\":true,\"info.mv\":true,\"int.mv\":true,\"mil.mv\":true,\"museum.mv\":true,\"name.mv\":true,\"net.mv\":true,\"org.mv\":true,\"pro.mv\":true,\"mw\":true,\"ac.mw\":true,\"biz.mw\":true,\"co.mw\":true,\"com.mw\":true,\"coop.mw\":true,\"edu.mw\":true,\"gov.mw\":true,\"int.mw\":true,\"museum.mw\":true,\"net.mw\":true,\"org.mw\":true,\"mx\":true,\"com.mx\":true,\"org.mx\":true,\"gob.mx\":true,\"edu.mx\":true,\"net.mx\":true,\"my\":true,\"com.my\":true,\"net.my\":true,\"org.my\":true,\"gov.my\":true,\"edu.my\":true,\"mil.my\":true,\"name.my\":true,\"mz\":true,\"ac.mz\":true,\"adv.mz\":true,\"co.mz\":true,\"edu.mz\":true,\"gov.mz\":true,\"mil.mz\":true,\"net.mz\":true,\"org.mz\":true,\"na\":true,\"info.na\":true,\"pro.na\":true,\"name.na\":true,\"school.na\":true,\"or.na\":true,\"dr.na\":true,\"us.na\":true,\"mx.na\":true,\"ca.na\":true,\"in.na\":true,\"cc.na\":true,\"tv.na\":true,\"ws.na\":true,\"mobi.na\":true,\"co.na\":true,\"com.na\":true,\"org.na\":true,\"name\":true,\"nc\":true,\"asso.nc\":true,\"nom.nc\":true,\"ne\":true,\"net\":true,\"nf\":true,\"com.nf\":true,\"net.nf\":true,\"per.nf\":true,\"rec.nf\":true,\"web.nf\":true,\"arts.nf\":true,\"firm.nf\":true,\"info.nf\":true,\"other.nf\":true,\"store.nf\":true,\"ng\":true,\"com.ng\":true,\"edu.ng\":true,\"gov.ng\":true,\"i.ng\":true,\"mil.ng\":true,\"mobi.ng\":true,\"name.ng\":true,\"net.ng\":true,\"org.ng\":true,\"sch.ng\":true,\"ni\":true,\"ac.ni\":true,\"biz.ni\":true,\"co.ni\":true,\"com.ni\":true,\"edu.ni\":true,\"gob.ni\":true,\"in.ni\":true,\"info.ni\":true,\"int.ni\":true,\"mil.ni\":true,\"net.ni\":true,\"nom.ni\":true,\"org.ni\":true,\"web.ni\":true,\"nl\":true,\"bv.nl\":true,\"no\":true,\"fhs.no\":true,\"vgs.no\":true,\"fylkesbibl.no\":true,\"folkebibl.no\":true,\"museum.no\":true,\"idrett.no\":true,\"priv.no\":true,\"mil.no\":true,\"stat.no\":true,\"dep.no\":true,\"kommune.no\":true,\"herad.no\":true,\"aa.no\":true,\"ah.no\":true,\"bu.no\":true,\"fm.no\":true,\"hl.no\":true,\"hm.no\":true,\"jan-mayen.no\":true,\"mr.no\":true,\"nl.no\":true,\"nt.no\":true,\"of.no\":true,\"ol.no\":true,\"oslo.no\":true,\"rl.no\":true,\"sf.no\":true,\"st.no\":true,\"svalbard.no\":true,\"tm.no\":true,\"tr.no\":true,\"va.no\":true,\"vf.no\":true,\"gs.aa.no\":true,\"gs.ah.no\":true,\"gs.bu.no\":true,\"gs.fm.no\":true,\"gs.hl.no\":true,\"gs.hm.no\":true,\"gs.jan-mayen.no\":true,\"gs.mr.no\":true,\"gs.nl.no\":true,\"gs.nt.no\":true,\"gs.of.no\":true,\"gs.ol.no\":true,\"gs.oslo.no\":true,\"gs.rl.no\":true,\"gs.sf.no\":true,\"gs.st.no\":true,\"gs.svalbard.no\":true,\"gs.tm.no\":true,\"gs.tr.no\":true,\"gs.va.no\":true,\"gs.vf.no\":true,\"akrehamn.no\":true,\"xn--krehamn-dxa.no\":true,\"algard.no\":true,\"xn--lgrd-poac.no\":true,\"arna.no\":true,\"brumunddal.no\":true,\"bryne.no\":true,\"bronnoysund.no\":true,\"xn--brnnysund-m8ac.no\":true,\"drobak.no\":true,\"xn--drbak-wua.no\":true,\"egersund.no\":true,\"fetsund.no\":true,\"floro.no\":true,\"xn--flor-jra.no\":true,\"fredrikstad.no\":true,\"hokksund.no\":true,\"honefoss.no\":true,\"xn--hnefoss-q1a.no\":true,\"jessheim.no\":true,\"jorpeland.no\":true,\"xn--jrpeland-54a.no\":true,\"kirkenes.no\":true,\"kopervik.no\":true,\"krokstadelva.no\":true,\"langevag.no\":true,\"xn--langevg-jxa.no\":true,\"leirvik.no\":true,\"mjondalen.no\":true,\"xn--mjndalen-64a.no\":true,\"mo-i-rana.no\":true,\"mosjoen.no\":true,\"xn--mosjen-eya.no\":true,\"nesoddtangen.no\":true,\"orkanger.no\":true,\"osoyro.no\":true,\"xn--osyro-wua.no\":true,\"raholt.no\":true,\"xn--rholt-mra.no\":true,\"sandnessjoen.no\":true,\"xn--sandnessjen-ogb.no\":true,\"skedsmokorset.no\":true,\"slattum.no\":true,\"spjelkavik.no\":true,\"stathelle.no\":true,\"stavern.no\":true,\"stjordalshalsen.no\":true,\"xn--stjrdalshalsen-sqb.no\":true,\"tananger.no\":true,\"tranby.no\":true,\"vossevangen.no\":true,\"afjord.no\":true,\"xn--fjord-lra.no\":true,\"agdenes.no\":true,\"al.no\":true,\"xn--l-1fa.no\":true,\"alesund.no\":true,\"xn--lesund-hua.no\":true,\"alstahaug.no\":true,\"alta.no\":true,\"xn--lt-liac.no\":true,\"alaheadju.no\":true,\"xn--laheadju-7ya.no\":true,\"alvdal.no\":true,\"amli.no\":true,\"xn--mli-tla.no\":true,\"amot.no\":true,\"xn--mot-tla.no\":true,\"andebu.no\":true,\"andoy.no\":true,\"xn--andy-ira.no\":true,\"andasuolo.no\":true,\"ardal.no\":true,\"xn--rdal-poa.no\":true,\"aremark.no\":true,\"arendal.no\":true,\"xn--s-1fa.no\":true,\"aseral.no\":true,\"xn--seral-lra.no\":true,\"asker.no\":true,\"askim.no\":true,\"askvoll.no\":true,\"askoy.no\":true,\"xn--asky-ira.no\":true,\"asnes.no\":true,\"xn--snes-poa.no\":true,\"audnedaln.no\":true,\"aukra.no\":true,\"aure.no\":true,\"aurland.no\":true,\"aurskog-holand.no\":true,\"xn--aurskog-hland-jnb.no\":true,\"austevoll.no\":true,\"austrheim.no\":true,\"averoy.no\":true,\"xn--avery-yua.no\":true,\"balestrand.no\":true,\"ballangen.no\":true,\"balat.no\":true,\"xn--blt-elab.no\":true,\"balsfjord.no\":true,\"bahccavuotna.no\":true,\"xn--bhccavuotna-k7a.no\":true,\"bamble.no\":true,\"bardu.no\":true,\"beardu.no\":true,\"beiarn.no\":true,\"bajddar.no\":true,\"xn--bjddar-pta.no\":true,\"baidar.no\":true,\"xn--bidr-5nac.no\":true,\"berg.no\":true,\"bergen.no\":true,\"berlevag.no\":true,\"xn--berlevg-jxa.no\":true,\"bearalvahki.no\":true,\"xn--bearalvhki-y4a.no\":true,\"bindal.no\":true,\"birkenes.no\":true,\"bjarkoy.no\":true,\"xn--bjarky-fya.no\":true,\"bjerkreim.no\":true,\"bjugn.no\":true,\"bodo.no\":true,\"xn--bod-2na.no\":true,\"badaddja.no\":true,\"xn--bdddj-mrabd.no\":true,\"budejju.no\":true,\"bokn.no\":true,\"bremanger.no\":true,\"bronnoy.no\":true,\"xn--brnny-wuac.no\":true,\"bygland.no\":true,\"bykle.no\":true,\"barum.no\":true,\"xn--brum-voa.no\":true,\"bo.telemark.no\":true,\"xn--b-5ga.telemark.no\":true,\"bo.nordland.no\":true,\"xn--b-5ga.nordland.no\":true,\"bievat.no\":true,\"xn--bievt-0qa.no\":true,\"bomlo.no\":true,\"xn--bmlo-gra.no\":true,\"batsfjord.no\":true,\"xn--btsfjord-9za.no\":true,\"bahcavuotna.no\":true,\"xn--bhcavuotna-s4a.no\":true,\"dovre.no\":true,\"drammen.no\":true,\"drangedal.no\":true,\"dyroy.no\":true,\"xn--dyry-ira.no\":true,\"donna.no\":true,\"xn--dnna-gra.no\":true,\"eid.no\":true,\"eidfjord.no\":true,\"eidsberg.no\":true,\"eidskog.no\":true,\"eidsvoll.no\":true,\"eigersund.no\":true,\"elverum.no\":true,\"enebakk.no\":true,\"engerdal.no\":true,\"etne.no\":true,\"etnedal.no\":true,\"evenes.no\":true,\"evenassi.no\":true,\"xn--eveni-0qa01ga.no\":true,\"evje-og-hornnes.no\":true,\"farsund.no\":true,\"fauske.no\":true,\"fuossko.no\":true,\"fuoisku.no\":true,\"fedje.no\":true,\"fet.no\":true,\"finnoy.no\":true,\"xn--finny-yua.no\":true,\"fitjar.no\":true,\"fjaler.no\":true,\"fjell.no\":true,\"flakstad.no\":true,\"flatanger.no\":true,\"flekkefjord.no\":true,\"flesberg.no\":true,\"flora.no\":true,\"fla.no\":true,\"xn--fl-zia.no\":true,\"folldal.no\":true,\"forsand.no\":true,\"fosnes.no\":true,\"frei.no\":true,\"frogn.no\":true,\"froland.no\":true,\"frosta.no\":true,\"frana.no\":true,\"xn--frna-woa.no\":true,\"froya.no\":true,\"xn--frya-hra.no\":true,\"fusa.no\":true,\"fyresdal.no\":true,\"forde.no\":true,\"xn--frde-gra.no\":true,\"gamvik.no\":true,\"gangaviika.no\":true,\"xn--ggaviika-8ya47h.no\":true,\"gaular.no\":true,\"gausdal.no\":true,\"gildeskal.no\":true,\"xn--gildeskl-g0a.no\":true,\"giske.no\":true,\"gjemnes.no\":true,\"gjerdrum.no\":true,\"gjerstad.no\":true,\"gjesdal.no\":true,\"gjovik.no\":true,\"xn--gjvik-wua.no\":true,\"gloppen.no\":true,\"gol.no\":true,\"gran.no\":true,\"grane.no\":true,\"granvin.no\":true,\"gratangen.no\":true,\"grimstad.no\":true,\"grong.no\":true,\"kraanghke.no\":true,\"xn--kranghke-b0a.no\":true,\"grue.no\":true,\"gulen.no\":true,\"hadsel.no\":true,\"halden.no\":true,\"halsa.no\":true,\"hamar.no\":true,\"hamaroy.no\":true,\"habmer.no\":true,\"xn--hbmer-xqa.no\":true,\"hapmir.no\":true,\"xn--hpmir-xqa.no\":true,\"hammerfest.no\":true,\"hammarfeasta.no\":true,\"xn--hmmrfeasta-s4ac.no\":true,\"haram.no\":true,\"hareid.no\":true,\"harstad.no\":true,\"hasvik.no\":true,\"aknoluokta.no\":true,\"xn--koluokta-7ya57h.no\":true,\"hattfjelldal.no\":true,\"aarborte.no\":true,\"haugesund.no\":true,\"hemne.no\":true,\"hemnes.no\":true,\"hemsedal.no\":true,\"heroy.more-og-romsdal.no\":true,\"xn--hery-ira.xn--mre-og-romsdal-qqb.no\":true,\"heroy.nordland.no\":true,\"xn--hery-ira.nordland.no\":true,\"hitra.no\":true,\"hjartdal.no\":true,\"hjelmeland.no\":true,\"hobol.no\":true,\"xn--hobl-ira.no\":true,\"hof.no\":true,\"hol.no\":true,\"hole.no\":true,\"holmestrand.no\":true,\"holtalen.no\":true,\"xn--holtlen-hxa.no\":true,\"hornindal.no\":true,\"horten.no\":true,\"hurdal.no\":true,\"hurum.no\":true,\"hvaler.no\":true,\"hyllestad.no\":true,\"hagebostad.no\":true,\"xn--hgebostad-g3a.no\":true,\"hoyanger.no\":true,\"xn--hyanger-q1a.no\":true,\"hoylandet.no\":true,\"xn--hylandet-54a.no\":true,\"ha.no\":true,\"xn--h-2fa.no\":true,\"ibestad.no\":true,\"inderoy.no\":true,\"xn--indery-fya.no\":true,\"iveland.no\":true,\"jevnaker.no\":true,\"jondal.no\":true,\"jolster.no\":true,\"xn--jlster-bya.no\":true,\"karasjok.no\":true,\"karasjohka.no\":true,\"xn--krjohka-hwab49j.no\":true,\"karlsoy.no\":true,\"galsa.no\":true,\"xn--gls-elac.no\":true,\"karmoy.no\":true,\"xn--karmy-yua.no\":true,\"kautokeino.no\":true,\"guovdageaidnu.no\":true,\"klepp.no\":true,\"klabu.no\":true,\"xn--klbu-woa.no\":true,\"kongsberg.no\":true,\"kongsvinger.no\":true,\"kragero.no\":true,\"xn--krager-gya.no\":true,\"kristiansand.no\":true,\"kristiansund.no\":true,\"krodsherad.no\":true,\"xn--krdsherad-m8a.no\":true,\"kvalsund.no\":true,\"rahkkeravju.no\":true,\"xn--rhkkervju-01af.no\":true,\"kvam.no\":true,\"kvinesdal.no\":true,\"kvinnherad.no\":true,\"kviteseid.no\":true,\"kvitsoy.no\":true,\"xn--kvitsy-fya.no\":true,\"kvafjord.no\":true,\"xn--kvfjord-nxa.no\":true,\"giehtavuoatna.no\":true,\"kvanangen.no\":true,\"xn--kvnangen-k0a.no\":true,\"navuotna.no\":true,\"xn--nvuotna-hwa.no\":true,\"kafjord.no\":true,\"xn--kfjord-iua.no\":true,\"gaivuotna.no\":true,\"xn--givuotna-8ya.no\":true,\"larvik.no\":true,\"lavangen.no\":true,\"lavagis.no\":true,\"loabat.no\":true,\"xn--loabt-0qa.no\":true,\"lebesby.no\":true,\"davvesiida.no\":true,\"leikanger.no\":true,\"leirfjord.no\":true,\"leka.no\":true,\"leksvik.no\":true,\"lenvik.no\":true,\"leangaviika.no\":true,\"xn--leagaviika-52b.no\":true,\"lesja.no\":true,\"levanger.no\":true,\"lier.no\":true,\"lierne.no\":true,\"lillehammer.no\":true,\"lillesand.no\":true,\"lindesnes.no\":true,\"lindas.no\":true,\"xn--linds-pra.no\":true,\"lom.no\":true,\"loppa.no\":true,\"lahppi.no\":true,\"xn--lhppi-xqa.no\":true,\"lund.no\":true,\"lunner.no\":true,\"luroy.no\":true,\"xn--lury-ira.no\":true,\"luster.no\":true,\"lyngdal.no\":true,\"lyngen.no\":true,\"ivgu.no\":true,\"lardal.no\":true,\"lerdal.no\":true,\"xn--lrdal-sra.no\":true,\"lodingen.no\":true,\"xn--ldingen-q1a.no\":true,\"lorenskog.no\":true,\"xn--lrenskog-54a.no\":true,\"loten.no\":true,\"xn--lten-gra.no\":true,\"malvik.no\":true,\"masoy.no\":true,\"xn--msy-ula0h.no\":true,\"muosat.no\":true,\"xn--muost-0qa.no\":true,\"mandal.no\":true,\"marker.no\":true,\"marnardal.no\":true,\"masfjorden.no\":true,\"meland.no\":true,\"meldal.no\":true,\"melhus.no\":true,\"meloy.no\":true,\"xn--mely-ira.no\":true,\"meraker.no\":true,\"xn--merker-kua.no\":true,\"moareke.no\":true,\"xn--moreke-jua.no\":true,\"midsund.no\":true,\"midtre-gauldal.no\":true,\"modalen.no\":true,\"modum.no\":true,\"molde.no\":true,\"moskenes.no\":true,\"moss.no\":true,\"mosvik.no\":true,\"malselv.no\":true,\"xn--mlselv-iua.no\":true,\"malatvuopmi.no\":true,\"xn--mlatvuopmi-s4a.no\":true,\"namdalseid.no\":true,\"aejrie.no\":true,\"namsos.no\":true,\"namsskogan.no\":true,\"naamesjevuemie.no\":true,\"xn--nmesjevuemie-tcba.no\":true,\"laakesvuemie.no\":true,\"nannestad.no\":true,\"narvik.no\":true,\"narviika.no\":true,\"naustdal.no\":true,\"nedre-eiker.no\":true,\"nes.akershus.no\":true,\"nes.buskerud.no\":true,\"nesna.no\":true,\"nesodden.no\":true,\"nesseby.no\":true,\"unjarga.no\":true,\"xn--unjrga-rta.no\":true,\"nesset.no\":true,\"nissedal.no\":true,\"nittedal.no\":true,\"nord-aurdal.no\":true,\"nord-fron.no\":true,\"nord-odal.no\":true,\"norddal.no\":true,\"nordkapp.no\":true,\"davvenjarga.no\":true,\"xn--davvenjrga-y4a.no\":true,\"nordre-land.no\":true,\"nordreisa.no\":true,\"raisa.no\":true,\"xn--risa-5na.no\":true,\"nore-og-uvdal.no\":true,\"notodden.no\":true,\"naroy.no\":true,\"xn--nry-yla5g.no\":true,\"notteroy.no\":true,\"xn--nttery-byae.no\":true,\"odda.no\":true,\"oksnes.no\":true,\"xn--ksnes-uua.no\":true,\"oppdal.no\":true,\"oppegard.no\":true,\"xn--oppegrd-ixa.no\":true,\"orkdal.no\":true,\"orland.no\":true,\"xn--rland-uua.no\":true,\"orskog.no\":true,\"xn--rskog-uua.no\":true,\"orsta.no\":true,\"xn--rsta-fra.no\":true,\"os.hedmark.no\":true,\"os.hordaland.no\":true,\"osen.no\":true,\"osteroy.no\":true,\"xn--ostery-fya.no\":true,\"ostre-toten.no\":true,\"xn--stre-toten-zcb.no\":true,\"overhalla.no\":true,\"ovre-eiker.no\":true,\"xn--vre-eiker-k8a.no\":true,\"oyer.no\":true,\"xn--yer-zna.no\":true,\"oygarden.no\":true,\"xn--ygarden-p1a.no\":true,\"oystre-slidre.no\":true,\"xn--ystre-slidre-ujb.no\":true,\"porsanger.no\":true,\"porsangu.no\":true,\"xn--porsgu-sta26f.no\":true,\"porsgrunn.no\":true,\"radoy.no\":true,\"xn--rady-ira.no\":true,\"rakkestad.no\":true,\"rana.no\":true,\"ruovat.no\":true,\"randaberg.no\":true,\"rauma.no\":true,\"rendalen.no\":true,\"rennebu.no\":true,\"rennesoy.no\":true,\"xn--rennesy-v1a.no\":true,\"rindal.no\":true,\"ringebu.no\":true,\"ringerike.no\":true,\"ringsaker.no\":true,\"rissa.no\":true,\"risor.no\":true,\"xn--risr-ira.no\":true,\"roan.no\":true,\"rollag.no\":true,\"rygge.no\":true,\"ralingen.no\":true,\"xn--rlingen-mxa.no\":true,\"rodoy.no\":true,\"xn--rdy-0nab.no\":true,\"romskog.no\":true,\"xn--rmskog-bya.no\":true,\"roros.no\":true,\"xn--rros-gra.no\":true,\"rost.no\":true,\"xn--rst-0na.no\":true,\"royken.no\":true,\"xn--ryken-vua.no\":true,\"royrvik.no\":true,\"xn--ryrvik-bya.no\":true,\"rade.no\":true,\"xn--rde-ula.no\":true,\"salangen.no\":true,\"siellak.no\":true,\"saltdal.no\":true,\"salat.no\":true,\"xn--slt-elab.no\":true,\"xn--slat-5na.no\":true,\"samnanger.no\":true,\"sande.more-og-romsdal.no\":true,\"sande.xn--mre-og-romsdal-qqb.no\":true,\"sande.vestfold.no\":true,\"sandefjord.no\":true,\"sandnes.no\":true,\"sandoy.no\":true,\"xn--sandy-yua.no\":true,\"sarpsborg.no\":true,\"sauda.no\":true,\"sauherad.no\":true,\"sel.no\":true,\"selbu.no\":true,\"selje.no\":true,\"seljord.no\":true,\"sigdal.no\":true,\"siljan.no\":true,\"sirdal.no\":true,\"skaun.no\":true,\"skedsmo.no\":true,\"ski.no\":true,\"skien.no\":true,\"skiptvet.no\":true,\"skjervoy.no\":true,\"xn--skjervy-v1a.no\":true,\"skierva.no\":true,\"xn--skierv-uta.no\":true,\"skjak.no\":true,\"xn--skjk-soa.no\":true,\"skodje.no\":true,\"skanland.no\":true,\"xn--sknland-fxa.no\":true,\"skanit.no\":true,\"xn--sknit-yqa.no\":true,\"smola.no\":true,\"xn--smla-hra.no\":true,\"snillfjord.no\":true,\"snasa.no\":true,\"xn--snsa-roa.no\":true,\"snoasa.no\":true,\"snaase.no\":true,\"xn--snase-nra.no\":true,\"sogndal.no\":true,\"sokndal.no\":true,\"sola.no\":true,\"solund.no\":true,\"songdalen.no\":true,\"sortland.no\":true,\"spydeberg.no\":true,\"stange.no\":true,\"stavanger.no\":true,\"steigen.no\":true,\"steinkjer.no\":true,\"stjordal.no\":true,\"xn--stjrdal-s1a.no\":true,\"stokke.no\":true,\"stor-elvdal.no\":true,\"stord.no\":true,\"stordal.no\":true,\"storfjord.no\":true,\"omasvuotna.no\":true,\"strand.no\":true,\"stranda.no\":true,\"stryn.no\":true,\"sula.no\":true,\"suldal.no\":true,\"sund.no\":true,\"sunndal.no\":true,\"surnadal.no\":true,\"sveio.no\":true,\"svelvik.no\":true,\"sykkylven.no\":true,\"sogne.no\":true,\"xn--sgne-gra.no\":true,\"somna.no\":true,\"xn--smna-gra.no\":true,\"sondre-land.no\":true,\"xn--sndre-land-0cb.no\":true,\"sor-aurdal.no\":true,\"xn--sr-aurdal-l8a.no\":true,\"sor-fron.no\":true,\"xn--sr-fron-q1a.no\":true,\"sor-odal.no\":true,\"xn--sr-odal-q1a.no\":true,\"sor-varanger.no\":true,\"xn--sr-varanger-ggb.no\":true,\"matta-varjjat.no\":true,\"xn--mtta-vrjjat-k7af.no\":true,\"sorfold.no\":true,\"xn--srfold-bya.no\":true,\"sorreisa.no\":true,\"xn--srreisa-q1a.no\":true,\"sorum.no\":true,\"xn--srum-gra.no\":true,\"tana.no\":true,\"deatnu.no\":true,\"time.no\":true,\"tingvoll.no\":true,\"tinn.no\":true,\"tjeldsund.no\":true,\"dielddanuorri.no\":true,\"tjome.no\":true,\"xn--tjme-hra.no\":true,\"tokke.no\":true,\"tolga.no\":true,\"torsken.no\":true,\"tranoy.no\":true,\"xn--trany-yua.no\":true,\"tromso.no\":true,\"xn--troms-zua.no\":true,\"tromsa.no\":true,\"romsa.no\":true,\"trondheim.no\":true,\"troandin.no\":true,\"trysil.no\":true,\"trana.no\":true,\"xn--trna-woa.no\":true,\"trogstad.no\":true,\"xn--trgstad-r1a.no\":true,\"tvedestrand.no\":true,\"tydal.no\":true,\"tynset.no\":true,\"tysfjord.no\":true,\"divtasvuodna.no\":true,\"divttasvuotna.no\":true,\"tysnes.no\":true,\"tysvar.no\":true,\"xn--tysvr-vra.no\":true,\"tonsberg.no\":true,\"xn--tnsberg-q1a.no\":true,\"ullensaker.no\":true,\"ullensvang.no\":true,\"ulvik.no\":true,\"utsira.no\":true,\"vadso.no\":true,\"xn--vads-jra.no\":true,\"cahcesuolo.no\":true,\"xn--hcesuolo-7ya35b.no\":true,\"vaksdal.no\":true,\"valle.no\":true,\"vang.no\":true,\"vanylven.no\":true,\"vardo.no\":true,\"xn--vard-jra.no\":true,\"varggat.no\":true,\"xn--vrggt-xqad.no\":true,\"vefsn.no\":true,\"vaapste.no\":true,\"vega.no\":true,\"vegarshei.no\":true,\"xn--vegrshei-c0a.no\":true,\"vennesla.no\":true,\"verdal.no\":true,\"verran.no\":true,\"vestby.no\":true,\"vestnes.no\":true,\"vestre-slidre.no\":true,\"vestre-toten.no\":true,\"vestvagoy.no\":true,\"xn--vestvgy-ixa6o.no\":true,\"vevelstad.no\":true,\"vik.no\":true,\"vikna.no\":true,\"vindafjord.no\":true,\"volda.no\":true,\"voss.no\":true,\"varoy.no\":true,\"xn--vry-yla5g.no\":true,\"vagan.no\":true,\"xn--vgan-qoa.no\":true,\"voagat.no\":true,\"vagsoy.no\":true,\"xn--vgsy-qoa0j.no\":true,\"vaga.no\":true,\"xn--vg-yiab.no\":true,\"valer.ostfold.no\":true,\"xn--vler-qoa.xn--stfold-9xa.no\":true,\"valer.hedmark.no\":true,\"xn--vler-qoa.hedmark.no\":true,\"*.np\":true,\"nr\":true,\"biz.nr\":true,\"info.nr\":true,\"gov.nr\":true,\"edu.nr\":true,\"org.nr\":true,\"net.nr\":true,\"com.nr\":true,\"nu\":true,\"nz\":true,\"ac.nz\":true,\"co.nz\":true,\"cri.nz\":true,\"geek.nz\":true,\"gen.nz\":true,\"govt.nz\":true,\"health.nz\":true,\"iwi.nz\":true,\"kiwi.nz\":true,\"maori.nz\":true,\"mil.nz\":true,\"xn--mori-qsa.nz\":true,\"net.nz\":true,\"org.nz\":true,\"parliament.nz\":true,\"school.nz\":true,\"om\":true,\"co.om\":true,\"com.om\":true,\"edu.om\":true,\"gov.om\":true,\"med.om\":true,\"museum.om\":true,\"net.om\":true,\"org.om\":true,\"pro.om\":true,\"onion\":true,\"org\":true,\"pa\":true,\"ac.pa\":true,\"gob.pa\":true,\"com.pa\":true,\"org.pa\":true,\"sld.pa\":true,\"edu.pa\":true,\"net.pa\":true,\"ing.pa\":true,\"abo.pa\":true,\"med.pa\":true,\"nom.pa\":true,\"pe\":true,\"edu.pe\":true,\"gob.pe\":true,\"nom.pe\":true,\"mil.pe\":true,\"org.pe\":true,\"com.pe\":true,\"net.pe\":true,\"pf\":true,\"com.pf\":true,\"org.pf\":true,\"edu.pf\":true,\"*.pg\":true,\"ph\":true,\"com.ph\":true,\"net.ph\":true,\"org.ph\":true,\"gov.ph\":true,\"edu.ph\":true,\"ngo.ph\":true,\"mil.ph\":true,\"i.ph\":true,\"pk\":true,\"com.pk\":true,\"net.pk\":true,\"edu.pk\":true,\"org.pk\":true,\"fam.pk\":true,\"biz.pk\":true,\"web.pk\":true,\"gov.pk\":true,\"gob.pk\":true,\"gok.pk\":true,\"gon.pk\":true,\"gop.pk\":true,\"gos.pk\":true,\"info.pk\":true,\"pl\":true,\"com.pl\":true,\"net.pl\":true,\"org.pl\":true,\"aid.pl\":true,\"agro.pl\":true,\"atm.pl\":true,\"auto.pl\":true,\"biz.pl\":true,\"edu.pl\":true,\"gmina.pl\":true,\"gsm.pl\":true,\"info.pl\":true,\"mail.pl\":true,\"miasta.pl\":true,\"media.pl\":true,\"mil.pl\":true,\"nieruchomosci.pl\":true,\"nom.pl\":true,\"pc.pl\":true,\"powiat.pl\":true,\"priv.pl\":true,\"realestate.pl\":true,\"rel.pl\":true,\"sex.pl\":true,\"shop.pl\":true,\"sklep.pl\":true,\"sos.pl\":true,\"szkola.pl\":true,\"targi.pl\":true,\"tm.pl\":true,\"tourism.pl\":true,\"travel.pl\":true,\"turystyka.pl\":true,\"gov.pl\":true,\"ap.gov.pl\":true,\"ic.gov.pl\":true,\"is.gov.pl\":true,\"us.gov.pl\":true,\"kmpsp.gov.pl\":true,\"kppsp.gov.pl\":true,\"kwpsp.gov.pl\":true,\"psp.gov.pl\":true,\"wskr.gov.pl\":true,\"kwp.gov.pl\":true,\"mw.gov.pl\":true,\"ug.gov.pl\":true,\"um.gov.pl\":true,\"umig.gov.pl\":true,\"ugim.gov.pl\":true,\"upow.gov.pl\":true,\"uw.gov.pl\":true,\"starostwo.gov.pl\":true,\"pa.gov.pl\":true,\"po.gov.pl\":true,\"psse.gov.pl\":true,\"pup.gov.pl\":true,\"rzgw.gov.pl\":true,\"sa.gov.pl\":true,\"so.gov.pl\":true,\"sr.gov.pl\":true,\"wsa.gov.pl\":true,\"sko.gov.pl\":true,\"uzs.gov.pl\":true,\"wiih.gov.pl\":true,\"winb.gov.pl\":true,\"pinb.gov.pl\":true,\"wios.gov.pl\":true,\"witd.gov.pl\":true,\"wzmiuw.gov.pl\":true,\"piw.gov.pl\":true,\"wiw.gov.pl\":true,\"griw.gov.pl\":true,\"wif.gov.pl\":true,\"oum.gov.pl\":true,\"sdn.gov.pl\":true,\"zp.gov.pl\":true,\"uppo.gov.pl\":true,\"mup.gov.pl\":true,\"wuoz.gov.pl\":true,\"konsulat.gov.pl\":true,\"oirm.gov.pl\":true,\"augustow.pl\":true,\"babia-gora.pl\":true,\"bedzin.pl\":true,\"beskidy.pl\":true,\"bialowieza.pl\":true,\"bialystok.pl\":true,\"bielawa.pl\":true,\"bieszczady.pl\":true,\"boleslawiec.pl\":true,\"bydgoszcz.pl\":true,\"bytom.pl\":true,\"cieszyn.pl\":true,\"czeladz.pl\":true,\"czest.pl\":true,\"dlugoleka.pl\":true,\"elblag.pl\":true,\"elk.pl\":true,\"glogow.pl\":true,\"gniezno.pl\":true,\"gorlice.pl\":true,\"grajewo.pl\":true,\"ilawa.pl\":true,\"jaworzno.pl\":true,\"jelenia-gora.pl\":true,\"jgora.pl\":true,\"kalisz.pl\":true,\"kazimierz-dolny.pl\":true,\"karpacz.pl\":true,\"kartuzy.pl\":true,\"kaszuby.pl\":true,\"katowice.pl\":true,\"kepno.pl\":true,\"ketrzyn.pl\":true,\"klodzko.pl\":true,\"kobierzyce.pl\":true,\"kolobrzeg.pl\":true,\"konin.pl\":true,\"konskowola.pl\":true,\"kutno.pl\":true,\"lapy.pl\":true,\"lebork.pl\":true,\"legnica.pl\":true,\"lezajsk.pl\":true,\"limanowa.pl\":true,\"lomza.pl\":true,\"lowicz.pl\":true,\"lubin.pl\":true,\"lukow.pl\":true,\"malbork.pl\":true,\"malopolska.pl\":true,\"mazowsze.pl\":true,\"mazury.pl\":true,\"mielec.pl\":true,\"mielno.pl\":true,\"mragowo.pl\":true,\"naklo.pl\":true,\"nowaruda.pl\":true,\"nysa.pl\":true,\"olawa.pl\":true,\"olecko.pl\":true,\"olkusz.pl\":true,\"olsztyn.pl\":true,\"opoczno.pl\":true,\"opole.pl\":true,\"ostroda.pl\":true,\"ostroleka.pl\":true,\"ostrowiec.pl\":true,\"ostrowwlkp.pl\":true,\"pila.pl\":true,\"pisz.pl\":true,\"podhale.pl\":true,\"podlasie.pl\":true,\"polkowice.pl\":true,\"pomorze.pl\":true,\"pomorskie.pl\":true,\"prochowice.pl\":true,\"pruszkow.pl\":true,\"przeworsk.pl\":true,\"pulawy.pl\":true,\"radom.pl\":true,\"rawa-maz.pl\":true,\"rybnik.pl\":true,\"rzeszow.pl\":true,\"sanok.pl\":true,\"sejny.pl\":true,\"slask.pl\":true,\"slupsk.pl\":true,\"sosnowiec.pl\":true,\"stalowa-wola.pl\":true,\"skoczow.pl\":true,\"starachowice.pl\":true,\"stargard.pl\":true,\"suwalki.pl\":true,\"swidnica.pl\":true,\"swiebodzin.pl\":true,\"swinoujscie.pl\":true,\"szczecin.pl\":true,\"szczytno.pl\":true,\"tarnobrzeg.pl\":true,\"tgory.pl\":true,\"turek.pl\":true,\"tychy.pl\":true,\"ustka.pl\":true,\"walbrzych.pl\":true,\"warmia.pl\":true,\"warszawa.pl\":true,\"waw.pl\":true,\"wegrow.pl\":true,\"wielun.pl\":true,\"wlocl.pl\":true,\"wloclawek.pl\":true,\"wodzislaw.pl\":true,\"wolomin.pl\":true,\"wroclaw.pl\":true,\"zachpomor.pl\":true,\"zagan.pl\":true,\"zarow.pl\":true,\"zgora.pl\":true,\"zgorzelec.pl\":true,\"pm\":true,\"pn\":true,\"gov.pn\":true,\"co.pn\":true,\"org.pn\":true,\"edu.pn\":true,\"net.pn\":true,\"post\":true,\"pr\":true,\"com.pr\":true,\"net.pr\":true,\"org.pr\":true,\"gov.pr\":true,\"edu.pr\":true,\"isla.pr\":true,\"pro.pr\":true,\"biz.pr\":true,\"info.pr\":true,\"name.pr\":true,\"est.pr\":true,\"prof.pr\":true,\"ac.pr\":true,\"pro\":true,\"aaa.pro\":true,\"aca.pro\":true,\"acct.pro\":true,\"avocat.pro\":true,\"bar.pro\":true,\"cpa.pro\":true,\"eng.pro\":true,\"jur.pro\":true,\"law.pro\":true,\"med.pro\":true,\"recht.pro\":true,\"ps\":true,\"edu.ps\":true,\"gov.ps\":true,\"sec.ps\":true,\"plo.ps\":true,\"com.ps\":true,\"org.ps\":true,\"net.ps\":true,\"pt\":true,\"net.pt\":true,\"gov.pt\":true,\"org.pt\":true,\"edu.pt\":true,\"int.pt\":true,\"publ.pt\":true,\"com.pt\":true,\"nome.pt\":true,\"pw\":true,\"co.pw\":true,\"ne.pw\":true,\"or.pw\":true,\"ed.pw\":true,\"go.pw\":true,\"belau.pw\":true,\"py\":true,\"com.py\":true,\"coop.py\":true,\"edu.py\":true,\"gov.py\":true,\"mil.py\":true,\"net.py\":true,\"org.py\":true,\"qa\":true,\"com.qa\":true,\"edu.qa\":true,\"gov.qa\":true,\"mil.qa\":true,\"name.qa\":true,\"net.qa\":true,\"org.qa\":true,\"sch.qa\":true,\"re\":true,\"asso.re\":true,\"com.re\":true,\"nom.re\":true,\"ro\":true,\"arts.ro\":true,\"com.ro\":true,\"firm.ro\":true,\"info.ro\":true,\"nom.ro\":true,\"nt.ro\":true,\"org.ro\":true,\"rec.ro\":true,\"store.ro\":true,\"tm.ro\":true,\"www.ro\":true,\"rs\":true,\"ac.rs\":true,\"co.rs\":true,\"edu.rs\":true,\"gov.rs\":true,\"in.rs\":true,\"org.rs\":true,\"ru\":true,\"ac.ru\":true,\"edu.ru\":true,\"gov.ru\":true,\"int.ru\":true,\"mil.ru\":true,\"test.ru\":true,\"rw\":true,\"gov.rw\":true,\"net.rw\":true,\"edu.rw\":true,\"ac.rw\":true,\"com.rw\":true,\"co.rw\":true,\"int.rw\":true,\"mil.rw\":true,\"gouv.rw\":true,\"sa\":true,\"com.sa\":true,\"net.sa\":true,\"org.sa\":true,\"gov.sa\":true,\"med.sa\":true,\"pub.sa\":true,\"edu.sa\":true,\"sch.sa\":true,\"sb\":true,\"com.sb\":true,\"edu.sb\":true,\"gov.sb\":true,\"net.sb\":true,\"org.sb\":true,\"sc\":true,\"com.sc\":true,\"gov.sc\":true,\"net.sc\":true,\"org.sc\":true,\"edu.sc\":true,\"sd\":true,\"com.sd\":true,\"net.sd\":true,\"org.sd\":true,\"edu.sd\":true,\"med.sd\":true,\"tv.sd\":true,\"gov.sd\":true,\"info.sd\":true,\"se\":true,\"a.se\":true,\"ac.se\":true,\"b.se\":true,\"bd.se\":true,\"brand.se\":true,\"c.se\":true,\"d.se\":true,\"e.se\":true,\"f.se\":true,\"fh.se\":true,\"fhsk.se\":true,\"fhv.se\":true,\"g.se\":true,\"h.se\":true,\"i.se\":true,\"k.se\":true,\"komforb.se\":true,\"kommunalforbund.se\":true,\"komvux.se\":true,\"l.se\":true,\"lanbib.se\":true,\"m.se\":true,\"n.se\":true,\"naturbruksgymn.se\":true,\"o.se\":true,\"org.se\":true,\"p.se\":true,\"parti.se\":true,\"pp.se\":true,\"press.se\":true,\"r.se\":true,\"s.se\":true,\"t.se\":true,\"tm.se\":true,\"u.se\":true,\"w.se\":true,\"x.se\":true,\"y.se\":true,\"z.se\":true,\"sg\":true,\"com.sg\":true,\"net.sg\":true,\"org.sg\":true,\"gov.sg\":true,\"edu.sg\":true,\"per.sg\":true,\"sh\":true,\"com.sh\":true,\"net.sh\":true,\"gov.sh\":true,\"org.sh\":true,\"mil.sh\":true,\"si\":true,\"sj\":true,\"sk\":true,\"sl\":true,\"com.sl\":true,\"net.sl\":true,\"edu.sl\":true,\"gov.sl\":true,\"org.sl\":true,\"sm\":true,\"sn\":true,\"art.sn\":true,\"com.sn\":true,\"edu.sn\":true,\"gouv.sn\":true,\"org.sn\":true,\"perso.sn\":true,\"univ.sn\":true,\"so\":true,\"com.so\":true,\"net.so\":true,\"org.so\":true,\"sr\":true,\"st\":true,\"co.st\":true,\"com.st\":true,\"consulado.st\":true,\"edu.st\":true,\"embaixada.st\":true,\"gov.st\":true,\"mil.st\":true,\"net.st\":true,\"org.st\":true,\"principe.st\":true,\"saotome.st\":true,\"store.st\":true,\"su\":true,\"sv\":true,\"com.sv\":true,\"edu.sv\":true,\"gob.sv\":true,\"org.sv\":true,\"red.sv\":true,\"sx\":true,\"gov.sx\":true,\"sy\":true,\"edu.sy\":true,\"gov.sy\":true,\"net.sy\":true,\"mil.sy\":true,\"com.sy\":true,\"org.sy\":true,\"sz\":true,\"co.sz\":true,\"ac.sz\":true,\"org.sz\":true,\"tc\":true,\"td\":true,\"tel\":true,\"tf\":true,\"tg\":true,\"th\":true,\"ac.th\":true,\"co.th\":true,\"go.th\":true,\"in.th\":true,\"mi.th\":true,\"net.th\":true,\"or.th\":true,\"tj\":true,\"ac.tj\":true,\"biz.tj\":true,\"co.tj\":true,\"com.tj\":true,\"edu.tj\":true,\"go.tj\":true,\"gov.tj\":true,\"int.tj\":true,\"mil.tj\":true,\"name.tj\":true,\"net.tj\":true,\"nic.tj\":true,\"org.tj\":true,\"test.tj\":true,\"web.tj\":true,\"tk\":true,\"tl\":true,\"gov.tl\":true,\"tm\":true,\"com.tm\":true,\"co.tm\":true,\"org.tm\":true,\"net.tm\":true,\"nom.tm\":true,\"gov.tm\":true,\"mil.tm\":true,\"edu.tm\":true,\"tn\":true,\"com.tn\":true,\"ens.tn\":true,\"fin.tn\":true,\"gov.tn\":true,\"ind.tn\":true,\"intl.tn\":true,\"nat.tn\":true,\"net.tn\":true,\"org.tn\":true,\"info.tn\":true,\"perso.tn\":true,\"tourism.tn\":true,\"edunet.tn\":true,\"rnrt.tn\":true,\"rns.tn\":true,\"rnu.tn\":true,\"mincom.tn\":true,\"agrinet.tn\":true,\"defense.tn\":true,\"turen.tn\":true,\"to\":true,\"com.to\":true,\"gov.to\":true,\"net.to\":true,\"org.to\":true,\"edu.to\":true,\"mil.to\":true,\"tr\":true,\"com.tr\":true,\"info.tr\":true,\"biz.tr\":true,\"net.tr\":true,\"org.tr\":true,\"web.tr\":true,\"gen.tr\":true,\"tv.tr\":true,\"av.tr\":true,\"dr.tr\":true,\"bbs.tr\":true,\"name.tr\":true,\"tel.tr\":true,\"gov.tr\":true,\"bel.tr\":true,\"pol.tr\":true,\"mil.tr\":true,\"k12.tr\":true,\"edu.tr\":true,\"kep.tr\":true,\"nc.tr\":true,\"gov.nc.tr\":true,\"travel\":true,\"tt\":true,\"co.tt\":true,\"com.tt\":true,\"org.tt\":true,\"net.tt\":true,\"biz.tt\":true,\"info.tt\":true,\"pro.tt\":true,\"int.tt\":true,\"coop.tt\":true,\"jobs.tt\":true,\"mobi.tt\":true,\"travel.tt\":true,\"museum.tt\":true,\"aero.tt\":true,\"name.tt\":true,\"gov.tt\":true,\"edu.tt\":true,\"tv\":true,\"tw\":true,\"edu.tw\":true,\"gov.tw\":true,\"mil.tw\":true,\"com.tw\":true,\"net.tw\":true,\"org.tw\":true,\"idv.tw\":true,\"game.tw\":true,\"ebiz.tw\":true,\"club.tw\":true,\"xn--zf0ao64a.tw\":true,\"xn--uc0atv.tw\":true,\"xn--czrw28b.tw\":true,\"tz\":true,\"ac.tz\":true,\"co.tz\":true,\"go.tz\":true,\"hotel.tz\":true,\"info.tz\":true,\"me.tz\":true,\"mil.tz\":true,\"mobi.tz\":true,\"ne.tz\":true,\"or.tz\":true,\"sc.tz\":true,\"tv.tz\":true,\"ua\":true,\"com.ua\":true,\"edu.ua\":true,\"gov.ua\":true,\"in.ua\":true,\"net.ua\":true,\"org.ua\":true,\"cherkassy.ua\":true,\"cherkasy.ua\":true,\"chernigov.ua\":true,\"chernihiv.ua\":true,\"chernivtsi.ua\":true,\"chernovtsy.ua\":true,\"ck.ua\":true,\"cn.ua\":true,\"cr.ua\":true,\"crimea.ua\":true,\"cv.ua\":true,\"dn.ua\":true,\"dnepropetrovsk.ua\":true,\"dnipropetrovsk.ua\":true,\"dominic.ua\":true,\"donetsk.ua\":true,\"dp.ua\":true,\"if.ua\":true,\"ivano-frankivsk.ua\":true,\"kh.ua\":true,\"kharkiv.ua\":true,\"kharkov.ua\":true,\"kherson.ua\":true,\"khmelnitskiy.ua\":true,\"khmelnytskyi.ua\":true,\"kiev.ua\":true,\"kirovograd.ua\":true,\"km.ua\":true,\"kr.ua\":true,\"krym.ua\":true,\"ks.ua\":true,\"kv.ua\":true,\"kyiv.ua\":true,\"lg.ua\":true,\"lt.ua\":true,\"lugansk.ua\":true,\"lutsk.ua\":true,\"lv.ua\":true,\"lviv.ua\":true,\"mk.ua\":true,\"mykolaiv.ua\":true,\"nikolaev.ua\":true,\"od.ua\":true,\"odesa.ua\":true,\"odessa.ua\":true,\"pl.ua\":true,\"poltava.ua\":true,\"rivne.ua\":true,\"rovno.ua\":true,\"rv.ua\":true,\"sb.ua\":true,\"sebastopol.ua\":true,\"sevastopol.ua\":true,\"sm.ua\":true,\"sumy.ua\":true,\"te.ua\":true,\"ternopil.ua\":true,\"uz.ua\":true,\"uzhgorod.ua\":true,\"vinnica.ua\":true,\"vinnytsia.ua\":true,\"vn.ua\":true,\"volyn.ua\":true,\"yalta.ua\":true,\"zaporizhzhe.ua\":true,\"zaporizhzhia.ua\":true,\"zhitomir.ua\":true,\"zhytomyr.ua\":true,\"zp.ua\":true,\"zt.ua\":true,\"ug\":true,\"co.ug\":true,\"or.ug\":true,\"ac.ug\":true,\"sc.ug\":true,\"go.ug\":true,\"ne.ug\":true,\"com.ug\":true,\"org.ug\":true,\"uk\":true,\"ac.uk\":true,\"co.uk\":true,\"gov.uk\":true,\"ltd.uk\":true,\"me.uk\":true,\"net.uk\":true,\"nhs.uk\":true,\"org.uk\":true,\"plc.uk\":true,\"police.uk\":true,\"*.sch.uk\":true,\"us\":true,\"dni.us\":true,\"fed.us\":true,\"isa.us\":true,\"kids.us\":true,\"nsn.us\":true,\"ak.us\":true,\"al.us\":true,\"ar.us\":true,\"as.us\":true,\"az.us\":true,\"ca.us\":true,\"co.us\":true,\"ct.us\":true,\"dc.us\":true,\"de.us\":true,\"fl.us\":true,\"ga.us\":true,\"gu.us\":true,\"hi.us\":true,\"ia.us\":true,\"id.us\":true,\"il.us\":true,\"in.us\":true,\"ks.us\":true,\"ky.us\":true,\"la.us\":true,\"ma.us\":true,\"md.us\":true,\"me.us\":true,\"mi.us\":true,\"mn.us\":true,\"mo.us\":true,\"ms.us\":true,\"mt.us\":true,\"nc.us\":true,\"nd.us\":true,\"ne.us\":true,\"nh.us\":true,\"nj.us\":true,\"nm.us\":true,\"nv.us\":true,\"ny.us\":true,\"oh.us\":true,\"ok.us\":true,\"or.us\":true,\"pa.us\":true,\"pr.us\":true,\"ri.us\":true,\"sc.us\":true,\"sd.us\":true,\"tn.us\":true,\"tx.us\":true,\"ut.us\":true,\"vi.us\":true,\"vt.us\":true,\"va.us\":true,\"wa.us\":true,\"wi.us\":true,\"wv.us\":true,\"wy.us\":true,\"k12.ak.us\":true,\"k12.al.us\":true,\"k12.ar.us\":true,\"k12.as.us\":true,\"k12.az.us\":true,\"k12.ca.us\":true,\"k12.co.us\":true,\"k12.ct.us\":true,\"k12.dc.us\":true,\"k12.de.us\":true,\"k12.fl.us\":true,\"k12.ga.us\":true,\"k12.gu.us\":true,\"k12.ia.us\":true,\"k12.id.us\":true,\"k12.il.us\":true,\"k12.in.us\":true,\"k12.ks.us\":true,\"k12.ky.us\":true,\"k12.la.us\":true,\"k12.ma.us\":true,\"k12.md.us\":true,\"k12.me.us\":true,\"k12.mi.us\":true,\"k12.mn.us\":true,\"k12.mo.us\":true,\"k12.ms.us\":true,\"k12.mt.us\":true,\"k12.nc.us\":true,\"k12.ne.us\":true,\"k12.nh.us\":true,\"k12.nj.us\":true,\"k12.nm.us\":true,\"k12.nv.us\":true,\"k12.ny.us\":true,\"k12.oh.us\":true,\"k12.ok.us\":true,\"k12.or.us\":true,\"k12.pa.us\":true,\"k12.pr.us\":true,\"k12.ri.us\":true,\"k12.sc.us\":true,\"k12.tn.us\":true,\"k12.tx.us\":true,\"k12.ut.us\":true,\"k12.vi.us\":true,\"k12.vt.us\":true,\"k12.va.us\":true,\"k12.wa.us\":true,\"k12.wi.us\":true,\"k12.wy.us\":true,\"cc.ak.us\":true,\"cc.al.us\":true,\"cc.ar.us\":true,\"cc.as.us\":true,\"cc.az.us\":true,\"cc.ca.us\":true,\"cc.co.us\":true,\"cc.ct.us\":true,\"cc.dc.us\":true,\"cc.de.us\":true,\"cc.fl.us\":true,\"cc.ga.us\":true,\"cc.gu.us\":true,\"cc.hi.us\":true,\"cc.ia.us\":true,\"cc.id.us\":true,\"cc.il.us\":true,\"cc.in.us\":true,\"cc.ks.us\":true,\"cc.ky.us\":true,\"cc.la.us\":true,\"cc.ma.us\":true,\"cc.md.us\":true,\"cc.me.us\":true,\"cc.mi.us\":true,\"cc.mn.us\":true,\"cc.mo.us\":true,\"cc.ms.us\":true,\"cc.mt.us\":true,\"cc.nc.us\":true,\"cc.nd.us\":true,\"cc.ne.us\":true,\"cc.nh.us\":true,\"cc.nj.us\":true,\"cc.nm.us\":true,\"cc.nv.us\":true,\"cc.ny.us\":true,\"cc.oh.us\":true,\"cc.ok.us\":true,\"cc.or.us\":true,\"cc.pa.us\":true,\"cc.pr.us\":true,\"cc.ri.us\":true,\"cc.sc.us\":true,\"cc.sd.us\":true,\"cc.tn.us\":true,\"cc.tx.us\":true,\"cc.ut.us\":true,\"cc.vi.us\":true,\"cc.vt.us\":true,\"cc.va.us\":true,\"cc.wa.us\":true,\"cc.wi.us\":true,\"cc.wv.us\":true,\"cc.wy.us\":true,\"lib.ak.us\":true,\"lib.al.us\":true,\"lib.ar.us\":true,\"lib.as.us\":true,\"lib.az.us\":true,\"lib.ca.us\":true,\"lib.co.us\":true,\"lib.ct.us\":true,\"lib.dc.us\":true,\"lib.fl.us\":true,\"lib.ga.us\":true,\"lib.gu.us\":true,\"lib.hi.us\":true,\"lib.ia.us\":true,\"lib.id.us\":true,\"lib.il.us\":true,\"lib.in.us\":true,\"lib.ks.us\":true,\"lib.ky.us\":true,\"lib.la.us\":true,\"lib.ma.us\":true,\"lib.md.us\":true,\"lib.me.us\":true,\"lib.mi.us\":true,\"lib.mn.us\":true,\"lib.mo.us\":true,\"lib.ms.us\":true,\"lib.mt.us\":true,\"lib.nc.us\":true,\"lib.nd.us\":true,\"lib.ne.us\":true,\"lib.nh.us\":true,\"lib.nj.us\":true,\"lib.nm.us\":true,\"lib.nv.us\":true,\"lib.ny.us\":true,\"lib.oh.us\":true,\"lib.ok.us\":true,\"lib.or.us\":true,\"lib.pa.us\":true,\"lib.pr.us\":true,\"lib.ri.us\":true,\"lib.sc.us\":true,\"lib.sd.us\":true,\"lib.tn.us\":true,\"lib.tx.us\":true,\"lib.ut.us\":true,\"lib.vi.us\":true,\"lib.vt.us\":true,\"lib.va.us\":true,\"lib.wa.us\":true,\"lib.wi.us\":true,\"lib.wy.us\":true,\"pvt.k12.ma.us\":true,\"chtr.k12.ma.us\":true,\"paroch.k12.ma.us\":true,\"ann-arbor.mi.us\":true,\"cog.mi.us\":true,\"dst.mi.us\":true,\"eaton.mi.us\":true,\"gen.mi.us\":true,\"mus.mi.us\":true,\"tec.mi.us\":true,\"washtenaw.mi.us\":true,\"uy\":true,\"com.uy\":true,\"edu.uy\":true,\"gub.uy\":true,\"mil.uy\":true,\"net.uy\":true,\"org.uy\":true,\"uz\":true,\"co.uz\":true,\"com.uz\":true,\"net.uz\":true,\"org.uz\":true,\"va\":true,\"vc\":true,\"com.vc\":true,\"net.vc\":true,\"org.vc\":true,\"gov.vc\":true,\"mil.vc\":true,\"edu.vc\":true,\"ve\":true,\"arts.ve\":true,\"co.ve\":true,\"com.ve\":true,\"e12.ve\":true,\"edu.ve\":true,\"firm.ve\":true,\"gob.ve\":true,\"gov.ve\":true,\"info.ve\":true,\"int.ve\":true,\"mil.ve\":true,\"net.ve\":true,\"org.ve\":true,\"rec.ve\":true,\"store.ve\":true,\"tec.ve\":true,\"web.ve\":true,\"vg\":true,\"vi\":true,\"co.vi\":true,\"com.vi\":true,\"k12.vi\":true,\"net.vi\":true,\"org.vi\":true,\"vn\":true,\"com.vn\":true,\"net.vn\":true,\"org.vn\":true,\"edu.vn\":true,\"gov.vn\":true,\"int.vn\":true,\"ac.vn\":true,\"biz.vn\":true,\"info.vn\":true,\"name.vn\":true,\"pro.vn\":true,\"health.vn\":true,\"vu\":true,\"com.vu\":true,\"edu.vu\":true,\"net.vu\":true,\"org.vu\":true,\"wf\":true,\"ws\":true,\"com.ws\":true,\"net.ws\":true,\"org.ws\":true,\"gov.ws\":true,\"edu.ws\":true,\"yt\":true,\"xn--mgbaam7a8h\":true,\"xn--y9a3aq\":true,\"xn--54b7fta0cc\":true,\"xn--90ae\":true,\"xn--90ais\":true,\"xn--fiqs8s\":true,\"xn--fiqz9s\":true,\"xn--lgbbat1ad8j\":true,\"xn--wgbh1c\":true,\"xn--e1a4c\":true,\"xn--node\":true,\"xn--qxam\":true,\"xn--j6w193g\":true,\"xn--2scrj9c\":true,\"xn--3hcrj9c\":true,\"xn--45br5cyl\":true,\"xn--h2breg3eve\":true,\"xn--h2brj9c8c\":true,\"xn--mgbgu82a\":true,\"xn--rvc1e0am3e\":true,\"xn--h2brj9c\":true,\"xn--mgbbh1a71e\":true,\"xn--fpcrj9c3d\":true,\"xn--gecrj9c\":true,\"xn--s9brj9c\":true,\"xn--45brj9c\":true,\"xn--xkc2dl3a5ee0h\":true,\"xn--mgba3a4f16a\":true,\"xn--mgba3a4fra\":true,\"xn--mgbtx2b\":true,\"xn--mgbayh7gpa\":true,\"xn--3e0b707e\":true,\"xn--80ao21a\":true,\"xn--fzc2c9e2c\":true,\"xn--xkc2al3hye2a\":true,\"xn--mgbc0a9azcg\":true,\"xn--d1alf\":true,\"xn--l1acc\":true,\"xn--mix891f\":true,\"xn--mix082f\":true,\"xn--mgbx4cd0ab\":true,\"xn--mgb9awbf\":true,\"xn--mgbai9azgqp6j\":true,\"xn--mgbai9a5eva00b\":true,\"xn--ygbi2ammx\":true,\"xn--90a3ac\":true,\"xn--o1ac.xn--90a3ac\":true,\"xn--c1avg.xn--90a3ac\":true,\"xn--90azh.xn--90a3ac\":true,\"xn--d1at.xn--90a3ac\":true,\"xn--o1ach.xn--90a3ac\":true,\"xn--80au.xn--90a3ac\":true,\"xn--p1ai\":true,\"xn--wgbl6a\":true,\"xn--mgberp4a5d4ar\":true,\"xn--mgberp4a5d4a87g\":true,\"xn--mgbqly7c0a67fbc\":true,\"xn--mgbqly7cvafr\":true,\"xn--mgbpl2fh\":true,\"xn--yfro4i67o\":true,\"xn--clchc0ea0b2g2a9gcd\":true,\"xn--ogbpf8fl\":true,\"xn--mgbtf8fl\":true,\"xn--o3cw4h\":true,\"xn--12c1fe0br.xn--o3cw4h\":true,\"xn--12co0c3b4eva.xn--o3cw4h\":true,\"xn--h3cuzk1di.xn--o3cw4h\":true,\"xn--o3cyx2a.xn--o3cw4h\":true,\"xn--m3ch0j3a.xn--o3cw4h\":true,\"xn--12cfi8ixb8l.xn--o3cw4h\":true,\"xn--pgbs0dh\":true,\"xn--kpry57d\":true,\"xn--kprw13d\":true,\"xn--nnx388a\":true,\"xn--j1amh\":true,\"xn--mgb2ddes\":true,\"xxx\":true,\"*.ye\":true,\"ac.za\":true,\"agric.za\":true,\"alt.za\":true,\"co.za\":true,\"edu.za\":true,\"gov.za\":true,\"grondar.za\":true,\"law.za\":true,\"mil.za\":true,\"net.za\":true,\"ngo.za\":true,\"nis.za\":true,\"nom.za\":true,\"org.za\":true,\"school.za\":true,\"tm.za\":true,\"web.za\":true,\"zm\":true,\"ac.zm\":true,\"biz.zm\":true,\"co.zm\":true,\"com.zm\":true,\"edu.zm\":true,\"gov.zm\":true,\"info.zm\":true,\"mil.zm\":true,\"net.zm\":true,\"org.zm\":true,\"sch.zm\":true,\"zw\":true,\"ac.zw\":true,\"co.zw\":true,\"gov.zw\":true,\"mil.zw\":true,\"org.zw\":true,\"aaa\":true,\"aarp\":true,\"abarth\":true,\"abb\":true,\"abbott\":true,\"abbvie\":true,\"abc\":true,\"able\":true,\"abogado\":true,\"abudhabi\":true,\"academy\":true,\"accenture\":true,\"accountant\":true,\"accountants\":true,\"aco\":true,\"active\":true,\"actor\":true,\"adac\":true,\"ads\":true,\"adult\":true,\"aeg\":true,\"aetna\":true,\"afamilycompany\":true,\"afl\":true,\"africa\":true,\"agakhan\":true,\"agency\":true,\"aig\":true,\"aigo\":true,\"airbus\":true,\"airforce\":true,\"airtel\":true,\"akdn\":true,\"alfaromeo\":true,\"alibaba\":true,\"alipay\":true,\"allfinanz\":true,\"allstate\":true,\"ally\":true,\"alsace\":true,\"alstom\":true,\"americanexpress\":true,\"americanfamily\":true,\"amex\":true,\"amfam\":true,\"amica\":true,\"amsterdam\":true,\"analytics\":true,\"android\":true,\"anquan\":true,\"anz\":true,\"aol\":true,\"apartments\":true,\"app\":true,\"apple\":true,\"aquarelle\":true,\"arab\":true,\"aramco\":true,\"archi\":true,\"army\":true,\"art\":true,\"arte\":true,\"asda\":true,\"associates\":true,\"athleta\":true,\"attorney\":true,\"auction\":true,\"audi\":true,\"audible\":true,\"audio\":true,\"auspost\":true,\"author\":true,\"auto\":true,\"autos\":true,\"avianca\":true,\"aws\":true,\"axa\":true,\"azure\":true,\"baby\":true,\"baidu\":true,\"banamex\":true,\"bananarepublic\":true,\"band\":true,\"bank\":true,\"bar\":true,\"barcelona\":true,\"barclaycard\":true,\"barclays\":true,\"barefoot\":true,\"bargains\":true,\"baseball\":true,\"basketball\":true,\"bauhaus\":true,\"bayern\":true,\"bbc\":true,\"bbt\":true,\"bbva\":true,\"bcg\":true,\"bcn\":true,\"beats\":true,\"beauty\":true,\"beer\":true,\"bentley\":true,\"berlin\":true,\"best\":true,\"bestbuy\":true,\"bet\":true,\"bharti\":true,\"bible\":true,\"bid\":true,\"bike\":true,\"bing\":true,\"bingo\":true,\"bio\":true,\"black\":true,\"blackfriday\":true,\"blanco\":true,\"blockbuster\":true,\"blog\":true,\"bloomberg\":true,\"blue\":true,\"bms\":true,\"bmw\":true,\"bnl\":true,\"bnpparibas\":true,\"boats\":true,\"boehringer\":true,\"bofa\":true,\"bom\":true,\"bond\":true,\"boo\":true,\"book\":true,\"booking\":true,\"boots\":true,\"bosch\":true,\"bostik\":true,\"boston\":true,\"bot\":true,\"boutique\":true,\"box\":true,\"bradesco\":true,\"bridgestone\":true,\"broadway\":true,\"broker\":true,\"brother\":true,\"brussels\":true,\"budapest\":true,\"bugatti\":true,\"build\":true,\"builders\":true,\"business\":true,\"buy\":true,\"buzz\":true,\"bzh\":true,\"cab\":true,\"cafe\":true,\"cal\":true,\"call\":true,\"calvinklein\":true,\"cam\":true,\"camera\":true,\"camp\":true,\"cancerresearch\":true,\"canon\":true,\"capetown\":true,\"capital\":true,\"capitalone\":true,\"car\":true,\"caravan\":true,\"cards\":true,\"care\":true,\"career\":true,\"careers\":true,\"cars\":true,\"cartier\":true,\"casa\":true,\"case\":true,\"caseih\":true,\"cash\":true,\"casino\":true,\"catering\":true,\"catholic\":true,\"cba\":true,\"cbn\":true,\"cbre\":true,\"cbs\":true,\"ceb\":true,\"center\":true,\"ceo\":true,\"cern\":true,\"cfa\":true,\"cfd\":true,\"chanel\":true,\"channel\":true,\"chase\":true,\"chat\":true,\"cheap\":true,\"chintai\":true,\"christmas\":true,\"chrome\":true,\"chrysler\":true,\"church\":true,\"cipriani\":true,\"circle\":true,\"cisco\":true,\"citadel\":true,\"citi\":true,\"citic\":true,\"city\":true,\"cityeats\":true,\"claims\":true,\"cleaning\":true,\"click\":true,\"clinic\":true,\"clinique\":true,\"clothing\":true,\"cloud\":true,\"club\":true,\"clubmed\":true,\"coach\":true,\"codes\":true,\"coffee\":true,\"college\":true,\"cologne\":true,\"comcast\":true,\"commbank\":true,\"community\":true,\"company\":true,\"compare\":true,\"computer\":true,\"comsec\":true,\"condos\":true,\"construction\":true,\"consulting\":true,\"contact\":true,\"contractors\":true,\"cooking\":true,\"cookingchannel\":true,\"cool\":true,\"corsica\":true,\"country\":true,\"coupon\":true,\"coupons\":true,\"courses\":true,\"credit\":true,\"creditcard\":true,\"creditunion\":true,\"cricket\":true,\"crown\":true,\"crs\":true,\"cruise\":true,\"cruises\":true,\"csc\":true,\"cuisinella\":true,\"cymru\":true,\"cyou\":true,\"dabur\":true,\"dad\":true,\"dance\":true,\"data\":true,\"date\":true,\"dating\":true,\"datsun\":true,\"day\":true,\"dclk\":true,\"dds\":true,\"deal\":true,\"dealer\":true,\"deals\":true,\"degree\":true,\"delivery\":true,\"dell\":true,\"deloitte\":true,\"delta\":true,\"democrat\":true,\"dental\":true,\"dentist\":true,\"desi\":true,\"design\":true,\"dev\":true,\"dhl\":true,\"diamonds\":true,\"diet\":true,\"digital\":true,\"direct\":true,\"directory\":true,\"discount\":true,\"discover\":true,\"dish\":true,\"diy\":true,\"dnp\":true,\"docs\":true,\"doctor\":true,\"dodge\":true,\"dog\":true,\"doha\":true,\"domains\":true,\"dot\":true,\"download\":true,\"drive\":true,\"dtv\":true,\"dubai\":true,\"duck\":true,\"dunlop\":true,\"duns\":true,\"dupont\":true,\"durban\":true,\"dvag\":true,\"dvr\":true,\"earth\":true,\"eat\":true,\"eco\":true,\"edeka\":true,\"education\":true,\"email\":true,\"emerck\":true,\"energy\":true,\"engineer\":true,\"engineering\":true,\"enterprises\":true,\"epost\":true,\"epson\":true,\"equipment\":true,\"ericsson\":true,\"erni\":true,\"esq\":true,\"estate\":true,\"esurance\":true,\"etisalat\":true,\"eurovision\":true,\"eus\":true,\"events\":true,\"everbank\":true,\"exchange\":true,\"expert\":true,\"exposed\":true,\"express\":true,\"extraspace\":true,\"fage\":true,\"fail\":true,\"fairwinds\":true,\"faith\":true,\"family\":true,\"fan\":true,\"fans\":true,\"farm\":true,\"farmers\":true,\"fashion\":true,\"fast\":true,\"fedex\":true,\"feedback\":true,\"ferrari\":true,\"ferrero\":true,\"fiat\":true,\"fidelity\":true,\"fido\":true,\"film\":true,\"final\":true,\"finance\":true,\"financial\":true,\"fire\":true,\"firestone\":true,\"firmdale\":true,\"fish\":true,\"fishing\":true,\"fit\":true,\"fitness\":true,\"flickr\":true,\"flights\":true,\"flir\":true,\"florist\":true,\"flowers\":true,\"fly\":true,\"foo\":true,\"food\":true,\"foodnetwork\":true,\"football\":true,\"ford\":true,\"forex\":true,\"forsale\":true,\"forum\":true,\"foundation\":true,\"fox\":true,\"free\":true,\"fresenius\":true,\"frl\":true,\"frogans\":true,\"frontdoor\":true,\"frontier\":true,\"ftr\":true,\"fujitsu\":true,\"fujixerox\":true,\"fun\":true,\"fund\":true,\"furniture\":true,\"futbol\":true,\"fyi\":true,\"gal\":true,\"gallery\":true,\"gallo\":true,\"gallup\":true,\"game\":true,\"games\":true,\"gap\":true,\"garden\":true,\"gbiz\":true,\"gdn\":true,\"gea\":true,\"gent\":true,\"genting\":true,\"george\":true,\"ggee\":true,\"gift\":true,\"gifts\":true,\"gives\":true,\"giving\":true,\"glade\":true,\"glass\":true,\"gle\":true,\"global\":true,\"globo\":true,\"gmail\":true,\"gmbh\":true,\"gmo\":true,\"gmx\":true,\"godaddy\":true,\"gold\":true,\"goldpoint\":true,\"golf\":true,\"goo\":true,\"goodhands\":true,\"goodyear\":true,\"goog\":true,\"google\":true,\"gop\":true,\"got\":true,\"grainger\":true,\"graphics\":true,\"gratis\":true,\"green\":true,\"gripe\":true,\"grocery\":true,\"group\":true,\"guardian\":true,\"gucci\":true,\"guge\":true,\"guide\":true,\"guitars\":true,\"guru\":true,\"hair\":true,\"hamburg\":true,\"hangout\":true,\"haus\":true,\"hbo\":true,\"hdfc\":true,\"hdfcbank\":true,\"health\":true,\"healthcare\":true,\"help\":true,\"helsinki\":true,\"here\":true,\"hermes\":true,\"hgtv\":true,\"hiphop\":true,\"hisamitsu\":true,\"hitachi\":true,\"hiv\":true,\"hkt\":true,\"hockey\":true,\"holdings\":true,\"holiday\":true,\"homedepot\":true,\"homegoods\":true,\"homes\":true,\"homesense\":true,\"honda\":true,\"honeywell\":true,\"horse\":true,\"hospital\":true,\"host\":true,\"hosting\":true,\"hot\":true,\"hoteles\":true,\"hotels\":true,\"hotmail\":true,\"house\":true,\"how\":true,\"hsbc\":true,\"hughes\":true,\"hyatt\":true,\"hyundai\":true,\"ibm\":true,\"icbc\":true,\"ice\":true,\"icu\":true,\"ieee\":true,\"ifm\":true,\"ikano\":true,\"imamat\":true,\"imdb\":true,\"immo\":true,\"immobilien\":true,\"industries\":true,\"infiniti\":true,\"ing\":true,\"ink\":true,\"institute\":true,\"insurance\":true,\"insure\":true,\"intel\":true,\"international\":true,\"intuit\":true,\"investments\":true,\"ipiranga\":true,\"irish\":true,\"iselect\":true,\"ismaili\":true,\"ist\":true,\"istanbul\":true,\"itau\":true,\"itv\":true,\"iveco\":true,\"iwc\":true,\"jaguar\":true,\"java\":true,\"jcb\":true,\"jcp\":true,\"jeep\":true,\"jetzt\":true,\"jewelry\":true,\"jio\":true,\"jlc\":true,\"jll\":true,\"jmp\":true,\"jnj\":true,\"joburg\":true,\"jot\":true,\"joy\":true,\"jpmorgan\":true,\"jprs\":true,\"juegos\":true,\"juniper\":true,\"kaufen\":true,\"kddi\":true,\"kerryhotels\":true,\"kerrylogistics\":true,\"kerryproperties\":true,\"kfh\":true,\"kia\":true,\"kim\":true,\"kinder\":true,\"kindle\":true,\"kitchen\":true,\"kiwi\":true,\"koeln\":true,\"komatsu\":true,\"kosher\":true,\"kpmg\":true,\"kpn\":true,\"krd\":true,\"kred\":true,\"kuokgroup\":true,\"kyoto\":true,\"lacaixa\":true,\"ladbrokes\":true,\"lamborghini\":true,\"lamer\":true,\"lancaster\":true,\"lancia\":true,\"lancome\":true,\"land\":true,\"landrover\":true,\"lanxess\":true,\"lasalle\":true,\"lat\":true,\"latino\":true,\"latrobe\":true,\"law\":true,\"lawyer\":true,\"lds\":true,\"lease\":true,\"leclerc\":true,\"lefrak\":true,\"legal\":true,\"lego\":true,\"lexus\":true,\"lgbt\":true,\"liaison\":true,\"lidl\":true,\"life\":true,\"lifeinsurance\":true,\"lifestyle\":true,\"lighting\":true,\"like\":true,\"lilly\":true,\"limited\":true,\"limo\":true,\"lincoln\":true,\"linde\":true,\"link\":true,\"lipsy\":true,\"live\":true,\"living\":true,\"lixil\":true,\"loan\":true,\"loans\":true,\"locker\":true,\"locus\":true,\"loft\":true,\"lol\":true,\"london\":true,\"lotte\":true,\"lotto\":true,\"love\":true,\"lpl\":true,\"lplfinancial\":true,\"ltd\":true,\"ltda\":true,\"lundbeck\":true,\"lupin\":true,\"luxe\":true,\"luxury\":true,\"macys\":true,\"madrid\":true,\"maif\":true,\"maison\":true,\"makeup\":true,\"man\":true,\"management\":true,\"mango\":true,\"map\":true,\"market\":true,\"marketing\":true,\"markets\":true,\"marriott\":true,\"marshalls\":true,\"maserati\":true,\"mattel\":true,\"mba\":true,\"mckinsey\":true,\"med\":true,\"media\":true,\"meet\":true,\"melbourne\":true,\"meme\":true,\"memorial\":true,\"men\":true,\"menu\":true,\"meo\":true,\"merckmsd\":true,\"metlife\":true,\"miami\":true,\"microsoft\":true,\"mini\":true,\"mint\":true,\"mit\":true,\"mitsubishi\":true,\"mlb\":true,\"mls\":true,\"mma\":true,\"mobile\":true,\"mobily\":true,\"moda\":true,\"moe\":true,\"moi\":true,\"mom\":true,\"monash\":true,\"money\":true,\"monster\":true,\"mopar\":true,\"mormon\":true,\"mortgage\":true,\"moscow\":true,\"moto\":true,\"motorcycles\":true,\"mov\":true,\"movie\":true,\"movistar\":true,\"msd\":true,\"mtn\":true,\"mtpc\":true,\"mtr\":true,\"mutual\":true,\"nab\":true,\"nadex\":true,\"nagoya\":true,\"nationwide\":true,\"natura\":true,\"navy\":true,\"nba\":true,\"nec\":true,\"netbank\":true,\"netflix\":true,\"network\":true,\"neustar\":true,\"new\":true,\"newholland\":true,\"news\":true,\"next\":true,\"nextdirect\":true,\"nexus\":true,\"nfl\":true,\"ngo\":true,\"nhk\":true,\"nico\":true,\"nike\":true,\"nikon\":true,\"ninja\":true,\"nissan\":true,\"nissay\":true,\"nokia\":true,\"northwesternmutual\":true,\"norton\":true,\"now\":true,\"nowruz\":true,\"nowtv\":true,\"nra\":true,\"nrw\":true,\"ntt\":true,\"nyc\":true,\"obi\":true,\"observer\":true,\"off\":true,\"office\":true,\"okinawa\":true,\"olayan\":true,\"olayangroup\":true,\"oldnavy\":true,\"ollo\":true,\"omega\":true,\"one\":true,\"ong\":true,\"onl\":true,\"online\":true,\"onyourside\":true,\"ooo\":true,\"open\":true,\"oracle\":true,\"orange\":true,\"organic\":true,\"origins\":true,\"osaka\":true,\"otsuka\":true,\"ott\":true,\"ovh\":true,\"page\":true,\"panasonic\":true,\"panerai\":true,\"paris\":true,\"pars\":true,\"partners\":true,\"parts\":true,\"party\":true,\"passagens\":true,\"pay\":true,\"pccw\":true,\"pet\":true,\"pfizer\":true,\"pharmacy\":true,\"phd\":true,\"philips\":true,\"phone\":true,\"photo\":true,\"photography\":true,\"photos\":true,\"physio\":true,\"piaget\":true,\"pics\":true,\"pictet\":true,\"pictures\":true,\"pid\":true,\"pin\":true,\"ping\":true,\"pink\":true,\"pioneer\":true,\"pizza\":true,\"place\":true,\"play\":true,\"playstation\":true,\"plumbing\":true,\"plus\":true,\"pnc\":true,\"pohl\":true,\"poker\":true,\"politie\":true,\"porn\":true,\"pramerica\":true,\"praxi\":true,\"press\":true,\"prime\":true,\"prod\":true,\"productions\":true,\"prof\":true,\"progressive\":true,\"promo\":true,\"properties\":true,\"property\":true,\"protection\":true,\"pru\":true,\"prudential\":true,\"pub\":true,\"pwc\":true,\"qpon\":true,\"quebec\":true,\"quest\":true,\"qvc\":true,\"racing\":true,\"radio\":true,\"raid\":true,\"read\":true,\"realestate\":true,\"realtor\":true,\"realty\":true,\"recipes\":true,\"red\":true,\"redstone\":true,\"redumbrella\":true,\"rehab\":true,\"reise\":true,\"reisen\":true,\"reit\":true,\"reliance\":true,\"ren\":true,\"rent\":true,\"rentals\":true,\"repair\":true,\"report\":true,\"republican\":true,\"rest\":true,\"restaurant\":true,\"review\":true,\"reviews\":true,\"rexroth\":true,\"rich\":true,\"richardli\":true,\"ricoh\":true,\"rightathome\":true,\"ril\":true,\"rio\":true,\"rip\":true,\"rmit\":true,\"rocher\":true,\"rocks\":true,\"rodeo\":true,\"rogers\":true,\"room\":true,\"rsvp\":true,\"rugby\":true,\"ruhr\":true,\"run\":true,\"rwe\":true,\"ryukyu\":true,\"saarland\":true,\"safe\":true,\"safety\":true,\"sakura\":true,\"sale\":true,\"salon\":true,\"samsclub\":true,\"samsung\":true,\"sandvik\":true,\"sandvikcoromant\":true,\"sanofi\":true,\"sap\":true,\"sapo\":true,\"sarl\":true,\"sas\":true,\"save\":true,\"saxo\":true,\"sbi\":true,\"sbs\":true,\"sca\":true,\"scb\":true,\"schaeffler\":true,\"schmidt\":true,\"scholarships\":true,\"school\":true,\"schule\":true,\"schwarz\":true,\"science\":true,\"scjohnson\":true,\"scor\":true,\"scot\":true,\"search\":true,\"seat\":true,\"secure\":true,\"security\":true,\"seek\":true,\"select\":true,\"sener\":true,\"services\":true,\"ses\":true,\"seven\":true,\"sew\":true,\"sex\":true,\"sexy\":true,\"sfr\":true,\"shangrila\":true,\"sharp\":true,\"shaw\":true,\"shell\":true,\"shia\":true,\"shiksha\":true,\"shoes\":true,\"shop\":true,\"shopping\":true,\"shouji\":true,\"show\":true,\"showtime\":true,\"shriram\":true,\"silk\":true,\"sina\":true,\"singles\":true,\"site\":true,\"ski\":true,\"skin\":true,\"sky\":true,\"skype\":true,\"sling\":true,\"smart\":true,\"smile\":true,\"sncf\":true,\"soccer\":true,\"social\":true,\"softbank\":true,\"software\":true,\"sohu\":true,\"solar\":true,\"solutions\":true,\"song\":true,\"sony\":true,\"soy\":true,\"space\":true,\"spiegel\":true,\"spot\":true,\"spreadbetting\":true,\"srl\":true,\"srt\":true,\"stada\":true,\"staples\":true,\"star\":true,\"starhub\":true,\"statebank\":true,\"statefarm\":true,\"statoil\":true,\"stc\":true,\"stcgroup\":true,\"stockholm\":true,\"storage\":true,\"store\":true,\"stream\":true,\"studio\":true,\"study\":true,\"style\":true,\"sucks\":true,\"supplies\":true,\"supply\":true,\"support\":true,\"surf\":true,\"surgery\":true,\"suzuki\":true,\"swatch\":true,\"swiftcover\":true,\"swiss\":true,\"sydney\":true,\"symantec\":true,\"systems\":true,\"tab\":true,\"taipei\":true,\"talk\":true,\"taobao\":true,\"target\":true,\"tatamotors\":true,\"tatar\":true,\"tattoo\":true,\"tax\":true,\"taxi\":true,\"tci\":true,\"tdk\":true,\"team\":true,\"tech\":true,\"technology\":true,\"telecity\":true,\"telefonica\":true,\"temasek\":true,\"tennis\":true,\"teva\":true,\"thd\":true,\"theater\":true,\"theatre\":true,\"tiaa\":true,\"tickets\":true,\"tienda\":true,\"tiffany\":true,\"tips\":true,\"tires\":true,\"tirol\":true,\"tjmaxx\":true,\"tjx\":true,\"tkmaxx\":true,\"tmall\":true,\"today\":true,\"tokyo\":true,\"tools\":true,\"top\":true,\"toray\":true,\"toshiba\":true,\"total\":true,\"tours\":true,\"town\":true,\"toyota\":true,\"toys\":true,\"trade\":true,\"trading\":true,\"training\":true,\"travelchannel\":true,\"travelers\":true,\"travelersinsurance\":true,\"trust\":true,\"trv\":true,\"tube\":true,\"tui\":true,\"tunes\":true,\"tushu\":true,\"tvs\":true,\"ubank\":true,\"ubs\":true,\"uconnect\":true,\"unicom\":true,\"university\":true,\"uno\":true,\"uol\":true,\"ups\":true,\"vacations\":true,\"vana\":true,\"vanguard\":true,\"vegas\":true,\"ventures\":true,\"verisign\":true,\"versicherung\":true,\"vet\":true,\"viajes\":true,\"video\":true,\"vig\":true,\"viking\":true,\"villas\":true,\"vin\":true,\"vip\":true,\"virgin\":true,\"visa\":true,\"vision\":true,\"vista\":true,\"vistaprint\":true,\"viva\":true,\"vivo\":true,\"vlaanderen\":true,\"vodka\":true,\"volkswagen\":true,\"volvo\":true,\"vote\":true,\"voting\":true,\"voto\":true,\"voyage\":true,\"vuelos\":true,\"wales\":true,\"walmart\":true,\"walter\":true,\"wang\":true,\"wanggou\":true,\"warman\":true,\"watch\":true,\"watches\":true,\"weather\":true,\"weatherchannel\":true,\"webcam\":true,\"weber\":true,\"website\":true,\"wed\":true,\"wedding\":true,\"weibo\":true,\"weir\":true,\"whoswho\":true,\"wien\":true,\"wiki\":true,\"williamhill\":true,\"win\":true,\"windows\":true,\"wine\":true,\"winners\":true,\"wme\":true,\"wolterskluwer\":true,\"woodside\":true,\"work\":true,\"works\":true,\"world\":true,\"wow\":true,\"wtc\":true,\"wtf\":true,\"xbox\":true,\"xerox\":true,\"xfinity\":true,\"xihuan\":true,\"xin\":true,\"xn--11b4c3d\":true,\"xn--1ck2e1b\":true,\"xn--1qqw23a\":true,\"xn--30rr7y\":true,\"xn--3bst00m\":true,\"xn--3ds443g\":true,\"xn--3oq18vl8pn36a\":true,\"xn--3pxu8k\":true,\"xn--42c2d9a\":true,\"xn--45q11c\":true,\"xn--4gbrim\":true,\"xn--55qw42g\":true,\"xn--55qx5d\":true,\"xn--5su34j936bgsg\":true,\"xn--5tzm5g\":true,\"xn--6frz82g\":true,\"xn--6qq986b3xl\":true,\"xn--80adxhks\":true,\"xn--80aqecdr1a\":true,\"xn--80asehdb\":true,\"xn--80aswg\":true,\"xn--8y0a063a\":true,\"xn--9dbq2a\":true,\"xn--9et52u\":true,\"xn--9krt00a\":true,\"xn--b4w605ferd\":true,\"xn--bck1b9a5dre4c\":true,\"xn--c1avg\":true,\"xn--c2br7g\":true,\"xn--cck2b3b\":true,\"xn--cg4bki\":true,\"xn--czr694b\":true,\"xn--czrs0t\":true,\"xn--czru2d\":true,\"xn--d1acj3b\":true,\"xn--eckvdtc9d\":true,\"xn--efvy88h\":true,\"xn--estv75g\":true,\"xn--fct429k\":true,\"xn--fhbei\":true,\"xn--fiq228c5hs\":true,\"xn--fiq64b\":true,\"xn--fjq720a\":true,\"xn--flw351e\":true,\"xn--fzys8d69uvgm\":true,\"xn--g2xx48c\":true,\"xn--gckr3f0f\":true,\"xn--gk3at1e\":true,\"xn--hxt814e\":true,\"xn--i1b6b1a6a2e\":true,\"xn--imr513n\":true,\"xn--io0a7i\":true,\"xn--j1aef\":true,\"xn--jlq61u9w7b\":true,\"xn--jvr189m\":true,\"xn--kcrx77d1x4a\":true,\"xn--kpu716f\":true,\"xn--kput3i\":true,\"xn--mgba3a3ejt\":true,\"xn--mgba7c0bbn0a\":true,\"xn--mgbaakc7dvf\":true,\"xn--mgbab2bd\":true,\"xn--mgbb9fbpob\":true,\"xn--mgbca7dzdo\":true,\"xn--mgbi4ecexp\":true,\"xn--mgbt3dhd\":true,\"xn--mk1bu44c\":true,\"xn--mxtq1m\":true,\"xn--ngbc5azd\":true,\"xn--ngbe9e0a\":true,\"xn--ngbrx\":true,\"xn--nqv7f\":true,\"xn--nqv7fs00ema\":true,\"xn--nyqy26a\":true,\"xn--p1acf\":true,\"xn--pbt977c\":true,\"xn--pssy2u\":true,\"xn--q9jyb4c\":true,\"xn--qcka1pmc\":true,\"xn--rhqv96g\":true,\"xn--rovu88b\":true,\"xn--ses554g\":true,\"xn--t60b56a\":true,\"xn--tckwe\":true,\"xn--tiq49xqyj\":true,\"xn--unup4y\":true,\"xn--vermgensberater-ctb\":true,\"xn--vermgensberatung-pwb\":true,\"xn--vhquv\":true,\"xn--vuq861b\":true,\"xn--w4r85el8fhu5dnra\":true,\"xn--w4rs40l\":true,\"xn--xhq521b\":true,\"xn--zfr164b\":true,\"xperia\":true,\"xyz\":true,\"yachts\":true,\"yahoo\":true,\"yamaxun\":true,\"yandex\":true,\"yodobashi\":true,\"yoga\":true,\"yokohama\":true,\"you\":true,\"youtube\":true,\"yun\":true,\"zappos\":true,\"zara\":true,\"zero\":true,\"zip\":true,\"zippo\":true,\"zone\":true,\"zuerich\":true,\"cc.ua\":true,\"inf.ua\":true,\"ltd.ua\":true,\"1password.ca\":true,\"1password.com\":true,\"1password.eu\":true,\"beep.pl\":true,\"*.compute.estate\":true,\"*.alces.network\":true,\"alwaysdata.net\":true,\"cloudfront.net\":true,\"*.compute.amazonaws.com\":true,\"*.compute-1.amazonaws.com\":true,\"*.compute.amazonaws.com.cn\":true,\"us-east-1.amazonaws.com\":true,\"cn-north-1.eb.amazonaws.com.cn\":true,\"elasticbeanstalk.com\":true,\"ap-northeast-1.elasticbeanstalk.com\":true,\"ap-northeast-2.elasticbeanstalk.com\":true,\"ap-south-1.elasticbeanstalk.com\":true,\"ap-southeast-1.elasticbeanstalk.com\":true,\"ap-southeast-2.elasticbeanstalk.com\":true,\"ca-central-1.elasticbeanstalk.com\":true,\"eu-central-1.elasticbeanstalk.com\":true,\"eu-west-1.elasticbeanstalk.com\":true,\"eu-west-2.elasticbeanstalk.com\":true,\"eu-west-3.elasticbeanstalk.com\":true,\"sa-east-1.elasticbeanstalk.com\":true,\"us-east-1.elasticbeanstalk.com\":true,\"us-east-2.elasticbeanstalk.com\":true,\"us-gov-west-1.elasticbeanstalk.com\":true,\"us-west-1.elasticbeanstalk.com\":true,\"us-west-2.elasticbeanstalk.com\":true,\"*.elb.amazonaws.com\":true,\"*.elb.amazonaws.com.cn\":true,\"s3.amazonaws.com\":true,\"s3-ap-northeast-1.amazonaws.com\":true,\"s3-ap-northeast-2.amazonaws.com\":true,\"s3-ap-south-1.amazonaws.com\":true,\"s3-ap-southeast-1.amazonaws.com\":true,\"s3-ap-southeast-2.amazonaws.com\":true,\"s3-ca-central-1.amazonaws.com\":true,\"s3-eu-central-1.amazonaws.com\":true,\"s3-eu-west-1.amazonaws.com\":true,\"s3-eu-west-2.amazonaws.com\":true,\"s3-eu-west-3.amazonaws.com\":true,\"s3-external-1.amazonaws.com\":true,\"s3-fips-us-gov-west-1.amazonaws.com\":true,\"s3-sa-east-1.amazonaws.com\":true,\"s3-us-gov-west-1.amazonaws.com\":true,\"s3-us-east-2.amazonaws.com\":true,\"s3-us-west-1.amazonaws.com\":true,\"s3-us-west-2.amazonaws.com\":true,\"s3.ap-northeast-2.amazonaws.com\":true,\"s3.ap-south-1.amazonaws.com\":true,\"s3.cn-north-1.amazonaws.com.cn\":true,\"s3.ca-central-1.amazonaws.com\":true,\"s3.eu-central-1.amazonaws.com\":true,\"s3.eu-west-2.amazonaws.com\":true,\"s3.eu-west-3.amazonaws.com\":true,\"s3.us-east-2.amazonaws.com\":true,\"s3.dualstack.ap-northeast-1.amazonaws.com\":true,\"s3.dualstack.ap-northeast-2.amazonaws.com\":true,\"s3.dualstack.ap-south-1.amazonaws.com\":true,\"s3.dualstack.ap-southeast-1.amazonaws.com\":true,\"s3.dualstack.ap-southeast-2.amazonaws.com\":true,\"s3.dualstack.ca-central-1.amazonaws.com\":true,\"s3.dualstack.eu-central-1.amazonaws.com\":true,\"s3.dualstack.eu-west-1.amazonaws.com\":true,\"s3.dualstack.eu-west-2.amazonaws.com\":true,\"s3.dualstack.eu-west-3.amazonaws.com\":true,\"s3.dualstack.sa-east-1.amazonaws.com\":true,\"s3.dualstack.us-east-1.amazonaws.com\":true,\"s3.dualstack.us-east-2.amazonaws.com\":true,\"s3-website-us-east-1.amazonaws.com\":true,\"s3-website-us-west-1.amazonaws.com\":true,\"s3-website-us-west-2.amazonaws.com\":true,\"s3-website-ap-northeast-1.amazonaws.com\":true,\"s3-website-ap-southeast-1.amazonaws.com\":true,\"s3-website-ap-southeast-2.amazonaws.com\":true,\"s3-website-eu-west-1.amazonaws.com\":true,\"s3-website-sa-east-1.amazonaws.com\":true,\"s3-website.ap-northeast-2.amazonaws.com\":true,\"s3-website.ap-south-1.amazonaws.com\":true,\"s3-website.ca-central-1.amazonaws.com\":true,\"s3-website.eu-central-1.amazonaws.com\":true,\"s3-website.eu-west-2.amazonaws.com\":true,\"s3-website.eu-west-3.amazonaws.com\":true,\"s3-website.us-east-2.amazonaws.com\":true,\"t3l3p0rt.net\":true,\"tele.amune.org\":true,\"on-aptible.com\":true,\"user.party.eus\":true,\"pimienta.org\":true,\"poivron.org\":true,\"potager.org\":true,\"sweetpepper.org\":true,\"myasustor.com\":true,\"myfritz.net\":true,\"*.awdev.ca\":true,\"*.advisor.ws\":true,\"backplaneapp.io\":true,\"betainabox.com\":true,\"bnr.la\":true,\"boomla.net\":true,\"boxfuse.io\":true,\"square7.ch\":true,\"bplaced.com\":true,\"bplaced.de\":true,\"square7.de\":true,\"bplaced.net\":true,\"square7.net\":true,\"browsersafetymark.io\":true,\"mycd.eu\":true,\"ae.org\":true,\"ar.com\":true,\"br.com\":true,\"cn.com\":true,\"com.de\":true,\"com.se\":true,\"de.com\":true,\"eu.com\":true,\"gb.com\":true,\"gb.net\":true,\"hu.com\":true,\"hu.net\":true,\"jp.net\":true,\"jpn.com\":true,\"kr.com\":true,\"mex.com\":true,\"no.com\":true,\"qc.com\":true,\"ru.com\":true,\"sa.com\":true,\"se.com\":true,\"se.net\":true,\"uk.com\":true,\"uk.net\":true,\"us.com\":true,\"uy.com\":true,\"za.bz\":true,\"za.com\":true,\"africa.com\":true,\"gr.com\":true,\"in.net\":true,\"us.org\":true,\"co.com\":true,\"c.la\":true,\"certmgr.org\":true,\"xenapponazure.com\":true,\"virtueeldomein.nl\":true,\"c66.me\":true,\"cloud66.ws\":true,\"jdevcloud.com\":true,\"wpdevcloud.com\":true,\"cloudaccess.host\":true,\"freesite.host\":true,\"cloudaccess.net\":true,\"cloudcontrolled.com\":true,\"cloudcontrolapp.com\":true,\"co.ca\":true,\"co.cz\":true,\"c.cdn77.org\":true,\"cdn77-ssl.net\":true,\"r.cdn77.net\":true,\"rsc.cdn77.org\":true,\"ssl.origin.cdn77-secure.org\":true,\"cloudns.asia\":true,\"cloudns.biz\":true,\"cloudns.club\":true,\"cloudns.cc\":true,\"cloudns.eu\":true,\"cloudns.in\":true,\"cloudns.info\":true,\"cloudns.org\":true,\"cloudns.pro\":true,\"cloudns.pw\":true,\"cloudns.us\":true,\"co.nl\":true,\"co.no\":true,\"webhosting.be\":true,\"hosting-cluster.nl\":true,\"dyn.cosidns.de\":true,\"dynamisches-dns.de\":true,\"dnsupdater.de\":true,\"internet-dns.de\":true,\"l-o-g-i-n.de\":true,\"dynamic-dns.info\":true,\"feste-ip.net\":true,\"knx-server.net\":true,\"static-access.net\":true,\"realm.cz\":true,\"*.cryptonomic.net\":true,\"cupcake.is\":true,\"cyon.link\":true,\"cyon.site\":true,\"daplie.me\":true,\"localhost.daplie.me\":true,\"biz.dk\":true,\"co.dk\":true,\"firm.dk\":true,\"reg.dk\":true,\"store.dk\":true,\"debian.net\":true,\"dedyn.io\":true,\"dnshome.de\":true,\"drayddns.com\":true,\"dreamhosters.com\":true,\"mydrobo.com\":true,\"drud.io\":true,\"drud.us\":true,\"duckdns.org\":true,\"dy.fi\":true,\"tunk.org\":true,\"dyndns-at-home.com\":true,\"dyndns-at-work.com\":true,\"dyndns-blog.com\":true,\"dyndns-free.com\":true,\"dyndns-home.com\":true,\"dyndns-ip.com\":true,\"dyndns-mail.com\":true,\"dyndns-office.com\":true,\"dyndns-pics.com\":true,\"dyndns-remote.com\":true,\"dyndns-server.com\":true,\"dyndns-web.com\":true,\"dyndns-wiki.com\":true,\"dyndns-work.com\":true,\"dyndns.biz\":true,\"dyndns.info\":true,\"dyndns.org\":true,\"dyndns.tv\":true,\"at-band-camp.net\":true,\"ath.cx\":true,\"barrel-of-knowledge.info\":true,\"barrell-of-knowledge.info\":true,\"better-than.tv\":true,\"blogdns.com\":true,\"blogdns.net\":true,\"blogdns.org\":true,\"blogsite.org\":true,\"boldlygoingnowhere.org\":true,\"broke-it.net\":true,\"buyshouses.net\":true,\"cechire.com\":true,\"dnsalias.com\":true,\"dnsalias.net\":true,\"dnsalias.org\":true,\"dnsdojo.com\":true,\"dnsdojo.net\":true,\"dnsdojo.org\":true,\"does-it.net\":true,\"doesntexist.com\":true,\"doesntexist.org\":true,\"dontexist.com\":true,\"dontexist.net\":true,\"dontexist.org\":true,\"doomdns.com\":true,\"doomdns.org\":true,\"dvrdns.org\":true,\"dyn-o-saur.com\":true,\"dynalias.com\":true,\"dynalias.net\":true,\"dynalias.org\":true,\"dynathome.net\":true,\"dyndns.ws\":true,\"endofinternet.net\":true,\"endofinternet.org\":true,\"endoftheinternet.org\":true,\"est-a-la-maison.com\":true,\"est-a-la-masion.com\":true,\"est-le-patron.com\":true,\"est-mon-blogueur.com\":true,\"for-better.biz\":true,\"for-more.biz\":true,\"for-our.info\":true,\"for-some.biz\":true,\"for-the.biz\":true,\"forgot.her.name\":true,\"forgot.his.name\":true,\"from-ak.com\":true,\"from-al.com\":true,\"from-ar.com\":true,\"from-az.net\":true,\"from-ca.com\":true,\"from-co.net\":true,\"from-ct.com\":true,\"from-dc.com\":true,\"from-de.com\":true,\"from-fl.com\":true,\"from-ga.com\":true,\"from-hi.com\":true,\"from-ia.com\":true,\"from-id.com\":true,\"from-il.com\":true,\"from-in.com\":true,\"from-ks.com\":true,\"from-ky.com\":true,\"from-la.net\":true,\"from-ma.com\":true,\"from-md.com\":true,\"from-me.org\":true,\"from-mi.com\":true,\"from-mn.com\":true,\"from-mo.com\":true,\"from-ms.com\":true,\"from-mt.com\":true,\"from-nc.com\":true,\"from-nd.com\":true,\"from-ne.com\":true,\"from-nh.com\":true,\"from-nj.com\":true,\"from-nm.com\":true,\"from-nv.com\":true,\"from-ny.net\":true,\"from-oh.com\":true,\"from-ok.com\":true,\"from-or.com\":true,\"from-pa.com\":true,\"from-pr.com\":true,\"from-ri.com\":true,\"from-sc.com\":true,\"from-sd.com\":true,\"from-tn.com\":true,\"from-tx.com\":true,\"from-ut.com\":true,\"from-va.com\":true,\"from-vt.com\":true,\"from-wa.com\":true,\"from-wi.com\":true,\"from-wv.com\":true,\"from-wy.com\":true,\"ftpaccess.cc\":true,\"fuettertdasnetz.de\":true,\"game-host.org\":true,\"game-server.cc\":true,\"getmyip.com\":true,\"gets-it.net\":true,\"go.dyndns.org\":true,\"gotdns.com\":true,\"gotdns.org\":true,\"groks-the.info\":true,\"groks-this.info\":true,\"ham-radio-op.net\":true,\"here-for-more.info\":true,\"hobby-site.com\":true,\"hobby-site.org\":true,\"home.dyndns.org\":true,\"homedns.org\":true,\"homeftp.net\":true,\"homeftp.org\":true,\"homeip.net\":true,\"homelinux.com\":true,\"homelinux.net\":true,\"homelinux.org\":true,\"homeunix.com\":true,\"homeunix.net\":true,\"homeunix.org\":true,\"iamallama.com\":true,\"in-the-band.net\":true,\"is-a-anarchist.com\":true,\"is-a-blogger.com\":true,\"is-a-bookkeeper.com\":true,\"is-a-bruinsfan.org\":true,\"is-a-bulls-fan.com\":true,\"is-a-candidate.org\":true,\"is-a-caterer.com\":true,\"is-a-celticsfan.org\":true,\"is-a-chef.com\":true,\"is-a-chef.net\":true,\"is-a-chef.org\":true,\"is-a-conservative.com\":true,\"is-a-cpa.com\":true,\"is-a-cubicle-slave.com\":true,\"is-a-democrat.com\":true,\"is-a-designer.com\":true,\"is-a-doctor.com\":true,\"is-a-financialadvisor.com\":true,\"is-a-geek.com\":true,\"is-a-geek.net\":true,\"is-a-geek.org\":true,\"is-a-green.com\":true,\"is-a-guru.com\":true,\"is-a-hard-worker.com\":true,\"is-a-hunter.com\":true,\"is-a-knight.org\":true,\"is-a-landscaper.com\":true,\"is-a-lawyer.com\":true,\"is-a-liberal.com\":true,\"is-a-libertarian.com\":true,\"is-a-linux-user.org\":true,\"is-a-llama.com\":true,\"is-a-musician.com\":true,\"is-a-nascarfan.com\":true,\"is-a-nurse.com\":true,\"is-a-painter.com\":true,\"is-a-patsfan.org\":true,\"is-a-personaltrainer.com\":true,\"is-a-photographer.com\":true,\"is-a-player.com\":true,\"is-a-republican.com\":true,\"is-a-rockstar.com\":true,\"is-a-socialist.com\":true,\"is-a-soxfan.org\":true,\"is-a-student.com\":true,\"is-a-teacher.com\":true,\"is-a-techie.com\":true,\"is-a-therapist.com\":true,\"is-an-accountant.com\":true,\"is-an-actor.com\":true,\"is-an-actress.com\":true,\"is-an-anarchist.com\":true,\"is-an-artist.com\":true,\"is-an-engineer.com\":true,\"is-an-entertainer.com\":true,\"is-by.us\":true,\"is-certified.com\":true,\"is-found.org\":true,\"is-gone.com\":true,\"is-into-anime.com\":true,\"is-into-cars.com\":true,\"is-into-cartoons.com\":true,\"is-into-games.com\":true,\"is-leet.com\":true,\"is-lost.org\":true,\"is-not-certified.com\":true,\"is-saved.org\":true,\"is-slick.com\":true,\"is-uberleet.com\":true,\"is-very-bad.org\":true,\"is-very-evil.org\":true,\"is-very-good.org\":true,\"is-very-nice.org\":true,\"is-very-sweet.org\":true,\"is-with-theband.com\":true,\"isa-geek.com\":true,\"isa-geek.net\":true,\"isa-geek.org\":true,\"isa-hockeynut.com\":true,\"issmarterthanyou.com\":true,\"isteingeek.de\":true,\"istmein.de\":true,\"kicks-ass.net\":true,\"kicks-ass.org\":true,\"knowsitall.info\":true,\"land-4-sale.us\":true,\"lebtimnetz.de\":true,\"leitungsen.de\":true,\"likes-pie.com\":true,\"likescandy.com\":true,\"merseine.nu\":true,\"mine.nu\":true,\"misconfused.org\":true,\"mypets.ws\":true,\"myphotos.cc\":true,\"neat-url.com\":true,\"office-on-the.net\":true,\"on-the-web.tv\":true,\"podzone.net\":true,\"podzone.org\":true,\"readmyblog.org\":true,\"saves-the-whales.com\":true,\"scrapper-site.net\":true,\"scrapping.cc\":true,\"selfip.biz\":true,\"selfip.com\":true,\"selfip.info\":true,\"selfip.net\":true,\"selfip.org\":true,\"sells-for-less.com\":true,\"sells-for-u.com\":true,\"sells-it.net\":true,\"sellsyourhome.org\":true,\"servebbs.com\":true,\"servebbs.net\":true,\"servebbs.org\":true,\"serveftp.net\":true,\"serveftp.org\":true,\"servegame.org\":true,\"shacknet.nu\":true,\"simple-url.com\":true,\"space-to-rent.com\":true,\"stuff-4-sale.org\":true,\"stuff-4-sale.us\":true,\"teaches-yoga.com\":true,\"thruhere.net\":true,\"traeumtgerade.de\":true,\"webhop.biz\":true,\"webhop.info\":true,\"webhop.net\":true,\"webhop.org\":true,\"worse-than.tv\":true,\"writesthisblog.com\":true,\"ddnss.de\":true,\"dyn.ddnss.de\":true,\"dyndns.ddnss.de\":true,\"dyndns1.de\":true,\"dyn-ip24.de\":true,\"home-webserver.de\":true,\"dyn.home-webserver.de\":true,\"myhome-server.de\":true,\"ddnss.org\":true,\"definima.net\":true,\"definima.io\":true,\"ddnsfree.com\":true,\"ddnsgeek.com\":true,\"giize.com\":true,\"gleeze.com\":true,\"kozow.com\":true,\"loseyourip.com\":true,\"ooguy.com\":true,\"theworkpc.com\":true,\"casacam.net\":true,\"dynu.net\":true,\"accesscam.org\":true,\"camdvr.org\":true,\"freeddns.org\":true,\"mywire.org\":true,\"webredirect.org\":true,\"myddns.rocks\":true,\"blogsite.xyz\":true,\"dynv6.net\":true,\"e4.cz\":true,\"mytuleap.com\":true,\"enonic.io\":true,\"customer.enonic.io\":true,\"eu.org\":true,\"al.eu.org\":true,\"asso.eu.org\":true,\"at.eu.org\":true,\"au.eu.org\":true,\"be.eu.org\":true,\"bg.eu.org\":true,\"ca.eu.org\":true,\"cd.eu.org\":true,\"ch.eu.org\":true,\"cn.eu.org\":true,\"cy.eu.org\":true,\"cz.eu.org\":true,\"de.eu.org\":true,\"dk.eu.org\":true,\"edu.eu.org\":true,\"ee.eu.org\":true,\"es.eu.org\":true,\"fi.eu.org\":true,\"fr.eu.org\":true,\"gr.eu.org\":true,\"hr.eu.org\":true,\"hu.eu.org\":true,\"ie.eu.org\":true,\"il.eu.org\":true,\"in.eu.org\":true,\"int.eu.org\":true,\"is.eu.org\":true,\"it.eu.org\":true,\"jp.eu.org\":true,\"kr.eu.org\":true,\"lt.eu.org\":true,\"lu.eu.org\":true,\"lv.eu.org\":true,\"mc.eu.org\":true,\"me.eu.org\":true,\"mk.eu.org\":true,\"mt.eu.org\":true,\"my.eu.org\":true,\"net.eu.org\":true,\"ng.eu.org\":true,\"nl.eu.org\":true,\"no.eu.org\":true,\"nz.eu.org\":true,\"paris.eu.org\":true,\"pl.eu.org\":true,\"pt.eu.org\":true,\"q-a.eu.org\":true,\"ro.eu.org\":true,\"ru.eu.org\":true,\"se.eu.org\":true,\"si.eu.org\":true,\"sk.eu.org\":true,\"tr.eu.org\":true,\"uk.eu.org\":true,\"us.eu.org\":true,\"eu-1.evennode.com\":true,\"eu-2.evennode.com\":true,\"eu-3.evennode.com\":true,\"eu-4.evennode.com\":true,\"us-1.evennode.com\":true,\"us-2.evennode.com\":true,\"us-3.evennode.com\":true,\"us-4.evennode.com\":true,\"twmail.cc\":true,\"twmail.net\":true,\"twmail.org\":true,\"mymailer.com.tw\":true,\"url.tw\":true,\"apps.fbsbx.com\":true,\"ru.net\":true,\"adygeya.ru\":true,\"bashkiria.ru\":true,\"bir.ru\":true,\"cbg.ru\":true,\"com.ru\":true,\"dagestan.ru\":true,\"grozny.ru\":true,\"kalmykia.ru\":true,\"kustanai.ru\":true,\"marine.ru\":true,\"mordovia.ru\":true,\"msk.ru\":true,\"mytis.ru\":true,\"nalchik.ru\":true,\"nov.ru\":true,\"pyatigorsk.ru\":true,\"spb.ru\":true,\"vladikavkaz.ru\":true,\"vladimir.ru\":true,\"abkhazia.su\":true,\"adygeya.su\":true,\"aktyubinsk.su\":true,\"arkhangelsk.su\":true,\"armenia.su\":true,\"ashgabad.su\":true,\"azerbaijan.su\":true,\"balashov.su\":true,\"bashkiria.su\":true,\"bryansk.su\":true,\"bukhara.su\":true,\"chimkent.su\":true,\"dagestan.su\":true,\"east-kazakhstan.su\":true,\"exnet.su\":true,\"georgia.su\":true,\"grozny.su\":true,\"ivanovo.su\":true,\"jambyl.su\":true,\"kalmykia.su\":true,\"kaluga.su\":true,\"karacol.su\":true,\"karaganda.su\":true,\"karelia.su\":true,\"khakassia.su\":true,\"krasnodar.su\":true,\"kurgan.su\":true,\"kustanai.su\":true,\"lenug.su\":true,\"mangyshlak.su\":true,\"mordovia.su\":true,\"msk.su\":true,\"murmansk.su\":true,\"nalchik.su\":true,\"navoi.su\":true,\"north-kazakhstan.su\":true,\"nov.su\":true,\"obninsk.su\":true,\"penza.su\":true,\"pokrovsk.su\":true,\"sochi.su\":true,\"spb.su\":true,\"tashkent.su\":true,\"termez.su\":true,\"togliatti.su\":true,\"troitsk.su\":true,\"tselinograd.su\":true,\"tula.su\":true,\"tuva.su\":true,\"vladikavkaz.su\":true,\"vladimir.su\":true,\"vologda.su\":true,\"channelsdvr.net\":true,\"fastlylb.net\":true,\"map.fastlylb.net\":true,\"freetls.fastly.net\":true,\"map.fastly.net\":true,\"a.prod.fastly.net\":true,\"global.prod.fastly.net\":true,\"a.ssl.fastly.net\":true,\"b.ssl.fastly.net\":true,\"global.ssl.fastly.net\":true,\"fhapp.xyz\":true,\"fedorainfracloud.org\":true,\"fedorapeople.org\":true,\"cloud.fedoraproject.org\":true,\"app.os.fedoraproject.org\":true,\"app.os.stg.fedoraproject.org\":true,\"filegear.me\":true,\"firebaseapp.com\":true,\"flynnhub.com\":true,\"flynnhosting.net\":true,\"freebox-os.com\":true,\"freeboxos.com\":true,\"fbx-os.fr\":true,\"fbxos.fr\":true,\"freebox-os.fr\":true,\"freeboxos.fr\":true,\"*.futurecms.at\":true,\"futurehosting.at\":true,\"futuremailing.at\":true,\"*.ex.ortsinfo.at\":true,\"*.kunden.ortsinfo.at\":true,\"*.statics.cloud\":true,\"service.gov.uk\":true,\"github.io\":true,\"githubusercontent.com\":true,\"gitlab.io\":true,\"homeoffice.gov.uk\":true,\"ro.im\":true,\"shop.ro\":true,\"goip.de\":true,\"*.0emm.com\":true,\"appspot.com\":true,\"blogspot.ae\":true,\"blogspot.al\":true,\"blogspot.am\":true,\"blogspot.ba\":true,\"blogspot.be\":true,\"blogspot.bg\":true,\"blogspot.bj\":true,\"blogspot.ca\":true,\"blogspot.cf\":true,\"blogspot.ch\":true,\"blogspot.cl\":true,\"blogspot.co.at\":true,\"blogspot.co.id\":true,\"blogspot.co.il\":true,\"blogspot.co.ke\":true,\"blogspot.co.nz\":true,\"blogspot.co.uk\":true,\"blogspot.co.za\":true,\"blogspot.com\":true,\"blogspot.com.ar\":true,\"blogspot.com.au\":true,\"blogspot.com.br\":true,\"blogspot.com.by\":true,\"blogspot.com.co\":true,\"blogspot.com.cy\":true,\"blogspot.com.ee\":true,\"blogspot.com.eg\":true,\"blogspot.com.es\":true,\"blogspot.com.mt\":true,\"blogspot.com.ng\":true,\"blogspot.com.tr\":true,\"blogspot.com.uy\":true,\"blogspot.cv\":true,\"blogspot.cz\":true,\"blogspot.de\":true,\"blogspot.dk\":true,\"blogspot.fi\":true,\"blogspot.fr\":true,\"blogspot.gr\":true,\"blogspot.hk\":true,\"blogspot.hr\":true,\"blogspot.hu\":true,\"blogspot.ie\":true,\"blogspot.in\":true,\"blogspot.is\":true,\"blogspot.it\":true,\"blogspot.jp\":true,\"blogspot.kr\":true,\"blogspot.li\":true,\"blogspot.lt\":true,\"blogspot.lu\":true,\"blogspot.md\":true,\"blogspot.mk\":true,\"blogspot.mr\":true,\"blogspot.mx\":true,\"blogspot.my\":true,\"blogspot.nl\":true,\"blogspot.no\":true,\"blogspot.pe\":true,\"blogspot.pt\":true,\"blogspot.qa\":true,\"blogspot.re\":true,\"blogspot.ro\":true,\"blogspot.rs\":true,\"blogspot.ru\":true,\"blogspot.se\":true,\"blogspot.sg\":true,\"blogspot.si\":true,\"blogspot.sk\":true,\"blogspot.sn\":true,\"blogspot.td\":true,\"blogspot.tw\":true,\"blogspot.ug\":true,\"blogspot.vn\":true,\"cloudfunctions.net\":true,\"cloud.goog\":true,\"codespot.com\":true,\"googleapis.com\":true,\"googlecode.com\":true,\"pagespeedmobilizer.com\":true,\"publishproxy.com\":true,\"withgoogle.com\":true,\"withyoutube.com\":true,\"hashbang.sh\":true,\"hasura-app.io\":true,\"hepforge.org\":true,\"herokuapp.com\":true,\"herokussl.com\":true,\"moonscale.net\":true,\"iki.fi\":true,\"biz.at\":true,\"info.at\":true,\"info.cx\":true,\"ac.leg.br\":true,\"al.leg.br\":true,\"am.leg.br\":true,\"ap.leg.br\":true,\"ba.leg.br\":true,\"ce.leg.br\":true,\"df.leg.br\":true,\"es.leg.br\":true,\"go.leg.br\":true,\"ma.leg.br\":true,\"mg.leg.br\":true,\"ms.leg.br\":true,\"mt.leg.br\":true,\"pa.leg.br\":true,\"pb.leg.br\":true,\"pe.leg.br\":true,\"pi.leg.br\":true,\"pr.leg.br\":true,\"rj.leg.br\":true,\"rn.leg.br\":true,\"ro.leg.br\":true,\"rr.leg.br\":true,\"rs.leg.br\":true,\"sc.leg.br\":true,\"se.leg.br\":true,\"sp.leg.br\":true,\"to.leg.br\":true,\"pixolino.com\":true,\"ipifony.net\":true,\"*.triton.zone\":true,\"*.cns.joyent.com\":true,\"js.org\":true,\"keymachine.de\":true,\"knightpoint.systems\":true,\"co.krd\":true,\"edu.krd\":true,\"git-repos.de\":true,\"lcube-server.de\":true,\"svn-repos.de\":true,\"linkyard.cloud\":true,\"linkyard-cloud.ch\":true,\"we.bs\":true,\"barsy.bg\":true,\"barsyonline.com\":true,\"barsy.de\":true,\"barsy.eu\":true,\"barsy.in\":true,\"barsy.net\":true,\"barsy.online\":true,\"barsy.support\":true,\"*.magentosite.cloud\":true,\"hb.cldmail.ru\":true,\"cloud.metacentrum.cz\":true,\"custom.metacentrum.cz\":true,\"meteorapp.com\":true,\"eu.meteorapp.com\":true,\"co.pl\":true,\"azurewebsites.net\":true,\"azure-mobile.net\":true,\"cloudapp.net\":true,\"mozilla-iot.org\":true,\"bmoattachments.org\":true,\"net.ru\":true,\"org.ru\":true,\"pp.ru\":true,\"bitballoon.com\":true,\"netlify.com\":true,\"4u.com\":true,\"ngrok.io\":true,\"nh-serv.co.uk\":true,\"nfshost.com\":true,\"nsupdate.info\":true,\"nerdpol.ovh\":true,\"blogsyte.com\":true,\"brasilia.me\":true,\"cable-modem.org\":true,\"ciscofreak.com\":true,\"collegefan.org\":true,\"couchpotatofries.org\":true,\"damnserver.com\":true,\"ddns.me\":true,\"ditchyourip.com\":true,\"dnsfor.me\":true,\"dnsiskinky.com\":true,\"dvrcam.info\":true,\"dynns.com\":true,\"eating-organic.net\":true,\"fantasyleague.cc\":true,\"geekgalaxy.com\":true,\"golffan.us\":true,\"health-carereform.com\":true,\"homesecuritymac.com\":true,\"homesecuritypc.com\":true,\"hopto.me\":true,\"ilovecollege.info\":true,\"loginto.me\":true,\"mlbfan.org\":true,\"mmafan.biz\":true,\"myactivedirectory.com\":true,\"mydissent.net\":true,\"myeffect.net\":true,\"mymediapc.net\":true,\"mypsx.net\":true,\"mysecuritycamera.com\":true,\"mysecuritycamera.net\":true,\"mysecuritycamera.org\":true,\"net-freaks.com\":true,\"nflfan.org\":true,\"nhlfan.net\":true,\"no-ip.ca\":true,\"no-ip.co.uk\":true,\"no-ip.net\":true,\"noip.us\":true,\"onthewifi.com\":true,\"pgafan.net\":true,\"point2this.com\":true,\"pointto.us\":true,\"privatizehealthinsurance.net\":true,\"quicksytes.com\":true,\"read-books.org\":true,\"securitytactics.com\":true,\"serveexchange.com\":true,\"servehumour.com\":true,\"servep2p.com\":true,\"servesarcasm.com\":true,\"stufftoread.com\":true,\"ufcfan.org\":true,\"unusualperson.com\":true,\"workisboring.com\":true,\"3utilities.com\":true,\"bounceme.net\":true,\"ddns.net\":true,\"ddnsking.com\":true,\"gotdns.ch\":true,\"hopto.org\":true,\"myftp.biz\":true,\"myftp.org\":true,\"myvnc.com\":true,\"no-ip.biz\":true,\"no-ip.info\":true,\"no-ip.org\":true,\"noip.me\":true,\"redirectme.net\":true,\"servebeer.com\":true,\"serveblog.net\":true,\"servecounterstrike.com\":true,\"serveftp.com\":true,\"servegame.com\":true,\"servehalflife.com\":true,\"servehttp.com\":true,\"serveirc.com\":true,\"serveminecraft.net\":true,\"servemp3.com\":true,\"servepics.com\":true,\"servequake.com\":true,\"sytes.net\":true,\"webhop.me\":true,\"zapto.org\":true,\"stage.nodeart.io\":true,\"nodum.co\":true,\"nodum.io\":true,\"nyc.mn\":true,\"nom.ae\":true,\"nom.ai\":true,\"nom.al\":true,\"nym.by\":true,\"nym.bz\":true,\"nom.cl\":true,\"nom.gd\":true,\"nom.gl\":true,\"nym.gr\":true,\"nom.gt\":true,\"nom.hn\":true,\"nom.im\":true,\"nym.kz\":true,\"nym.la\":true,\"nom.li\":true,\"nym.li\":true,\"nym.lt\":true,\"nym.lu\":true,\"nym.me\":true,\"nom.mk\":true,\"nym.mx\":true,\"nom.nu\":true,\"nym.nz\":true,\"nym.pe\":true,\"nym.pt\":true,\"nom.pw\":true,\"nom.qa\":true,\"nom.rs\":true,\"nom.si\":true,\"nym.sk\":true,\"nym.su\":true,\"nym.sx\":true,\"nym.tw\":true,\"nom.ug\":true,\"nom.uy\":true,\"nom.vc\":true,\"nom.vg\":true,\"cya.gg\":true,\"nid.io\":true,\"opencraft.hosting\":true,\"operaunite.com\":true,\"outsystemscloud.com\":true,\"ownprovider.com\":true,\"oy.lc\":true,\"pgfog.com\":true,\"pagefrontapp.com\":true,\"art.pl\":true,\"gliwice.pl\":true,\"krakow.pl\":true,\"poznan.pl\":true,\"wroc.pl\":true,\"zakopane.pl\":true,\"pantheonsite.io\":true,\"gotpantheon.com\":true,\"mypep.link\":true,\"on-web.fr\":true,\"*.platform.sh\":true,\"*.platformsh.site\":true,\"xen.prgmr.com\":true,\"priv.at\":true,\"protonet.io\":true,\"chirurgiens-dentistes-en-france.fr\":true,\"byen.site\":true,\"qa2.com\":true,\"dev-myqnapcloud.com\":true,\"alpha-myqnapcloud.com\":true,\"myqnapcloud.com\":true,\"*.quipelements.com\":true,\"vapor.cloud\":true,\"vaporcloud.io\":true,\"rackmaze.com\":true,\"rackmaze.net\":true,\"rhcloud.com\":true,\"resindevice.io\":true,\"devices.resinstaging.io\":true,\"hzc.io\":true,\"wellbeingzone.eu\":true,\"ptplus.fit\":true,\"wellbeingzone.co.uk\":true,\"sandcats.io\":true,\"logoip.de\":true,\"logoip.com\":true,\"schokokeks.net\":true,\"scrysec.com\":true,\"firewall-gateway.com\":true,\"firewall-gateway.de\":true,\"my-gateway.de\":true,\"my-router.de\":true,\"spdns.de\":true,\"spdns.eu\":true,\"firewall-gateway.net\":true,\"my-firewall.org\":true,\"myfirewall.org\":true,\"spdns.org\":true,\"*.s5y.io\":true,\"*.sensiosite.cloud\":true,\"biz.ua\":true,\"co.ua\":true,\"pp.ua\":true,\"shiftedit.io\":true,\"myshopblocks.com\":true,\"1kapp.com\":true,\"appchizi.com\":true,\"applinzi.com\":true,\"sinaapp.com\":true,\"vipsinaapp.com\":true,\"bounty-full.com\":true,\"alpha.bounty-full.com\":true,\"beta.bounty-full.com\":true,\"static.land\":true,\"dev.static.land\":true,\"sites.static.land\":true,\"apps.lair.io\":true,\"*.stolos.io\":true,\"spacekit.io\":true,\"stackspace.space\":true,\"storj.farm\":true,\"temp-dns.com\":true,\"diskstation.me\":true,\"dscloud.biz\":true,\"dscloud.me\":true,\"dscloud.mobi\":true,\"dsmynas.com\":true,\"dsmynas.net\":true,\"dsmynas.org\":true,\"familyds.com\":true,\"familyds.net\":true,\"familyds.org\":true,\"i234.me\":true,\"myds.me\":true,\"synology.me\":true,\"vpnplus.to\":true,\"taifun-dns.de\":true,\"gda.pl\":true,\"gdansk.pl\":true,\"gdynia.pl\":true,\"med.pl\":true,\"sopot.pl\":true,\"cust.dev.thingdust.io\":true,\"cust.disrec.thingdust.io\":true,\"cust.prod.thingdust.io\":true,\"cust.testing.thingdust.io\":true,\"bloxcms.com\":true,\"townnews-staging.com\":true,\"12hp.at\":true,\"2ix.at\":true,\"4lima.at\":true,\"lima-city.at\":true,\"12hp.ch\":true,\"2ix.ch\":true,\"4lima.ch\":true,\"lima-city.ch\":true,\"trafficplex.cloud\":true,\"de.cool\":true,\"12hp.de\":true,\"2ix.de\":true,\"4lima.de\":true,\"lima-city.de\":true,\"1337.pictures\":true,\"clan.rip\":true,\"lima-city.rocks\":true,\"webspace.rocks\":true,\"lima.zone\":true,\"*.transurl.be\":true,\"*.transurl.eu\":true,\"*.transurl.nl\":true,\"tuxfamily.org\":true,\"dd-dns.de\":true,\"diskstation.eu\":true,\"diskstation.org\":true,\"dray-dns.de\":true,\"draydns.de\":true,\"dyn-vpn.de\":true,\"dynvpn.de\":true,\"mein-vigor.de\":true,\"my-vigor.de\":true,\"my-wan.de\":true,\"syno-ds.de\":true,\"synology-diskstation.de\":true,\"synology-ds.de\":true,\"uber.space\":true,\"hk.com\":true,\"hk.org\":true,\"ltd.hk\":true,\"inc.hk\":true,\"lib.de.us\":true,\"2038.io\":true,\"router.management\":true,\"v-info.info\":true,\"wedeploy.io\":true,\"wedeploy.me\":true,\"wedeploy.sh\":true,\"remotewd.com\":true,\"wmflabs.org\":true,\"cistron.nl\":true,\"demon.nl\":true,\"xs4all.space\":true,\"official.academy\":true,\"yolasite.com\":true,\"ybo.faith\":true,\"yombo.me\":true,\"homelink.one\":true,\"ybo.party\":true,\"ybo.review\":true,\"ybo.science\":true,\"ybo.trade\":true,\"za.net\":true,\"za.org\":true,\"now.sh\":true});\n\n// END of automatically generated file\n\n\n/***/ }),\n/* 416 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * Copyright (c) 2015, Salesforce.com, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. Neither the name of Salesforce.com nor the names of its contributors may\n * be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*jshint unused:false */\n\nfunction Store() {\n}\nexports.Store = Store;\n\n// Stores may be synchronous, but are still required to use a\n// Continuation-Passing Style API.  The CookieJar itself will expose a \"*Sync\"\n// API that converts from synchronous-callbacks to imperative style.\nStore.prototype.synchronous = false;\n\nStore.prototype.findCookie = function(domain, path, key, cb) {\n  throw new Error('findCookie is not implemented');\n};\n\nStore.prototype.findCookies = function(domain, path, cb) {\n  throw new Error('findCookies is not implemented');\n};\n\nStore.prototype.putCookie = function(cookie, cb) {\n  throw new Error('putCookie is not implemented');\n};\n\nStore.prototype.updateCookie = function(oldCookie, newCookie, cb) {\n  // recommended default implementation:\n  // return this.putCookie(newCookie, cb);\n  throw new Error('updateCookie is not implemented');\n};\n\nStore.prototype.removeCookie = function(domain, path, key, cb) {\n  throw new Error('removeCookie is not implemented');\n};\n\nStore.prototype.removeCookies = function(domain, path, cb) {\n  throw new Error('removeCookies is not implemented');\n};\n\nStore.prototype.getAllCookies = function(cb) {\n  throw new Error('getAllCookies is not implemented (therefore jar cannot be serialized)');\n};\n\n\n/***/ }),\n/* 417 */\n/***/ (function(module, exports) {\n\nmodule.exports = function () {\n    // see https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi\n    var origPrepareStackTrace = Error.prepareStackTrace;\n    Error.prepareStackTrace = function (_, stack) { return stack; };\n    var stack = (new Error()).stack;\n    Error.prepareStackTrace = origPrepareStackTrace;\n    return stack[2].getFileName();\n};\n\n\n/***/ }),\n/* 418 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar path = __webpack_require__(0);\nvar fs = __webpack_require__(4);\nvar parse = path.parse || __webpack_require__(774);\n\nmodule.exports = function nodeModulesPaths(start, opts) {\n    var modules = opts && opts.moduleDirectory\n        ? [].concat(opts.moduleDirectory)\n        : ['node_modules'];\n\n    // ensure that `start` is an absolute path at this point,\n    // resolving against the process' current working directory\n    var absoluteStart = path.resolve(start);\n\n    if (opts && opts.preserveSymlinks === false) {\n        try {\n            absoluteStart = fs.realpathSync(absoluteStart);\n        } catch (err) {\n            if (err.code !== 'ENOENT') {\n                throw err;\n            }\n        }\n    }\n\n    var prefix = '/';\n    if (/^([A-Za-z]:)/.test(absoluteStart)) {\n        prefix = '';\n    } else if (/^\\\\\\\\/.test(absoluteStart)) {\n        prefix = '\\\\\\\\';\n    }\n\n    var paths = [absoluteStart];\n    var parsed = parse(absoluteStart);\n    while (parsed.dir !== paths[paths.length - 1]) {\n        paths.push(parsed.dir);\n        parsed = parse(parsed.dir);\n    }\n\n    var dirs = paths.reduce(function (dirs, aPath) {\n        return dirs.concat(modules.map(function (moduleDir) {\n            return path.join(prefix, aPath, moduleDir);\n        }));\n    }, []);\n\n    return opts && opts.paths ? dirs.concat(opts.paths) : dirs;\n};\n\n\n/***/ }),\n/* 419 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return BehaviorSubject; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_ObjectUnsubscribedError__ = __webpack_require__(190);\n/** PURE_IMPORTS_START tslib,_Subject,_util_ObjectUnsubscribedError PURE_IMPORTS_END */\n\n\n\nvar BehaviorSubject = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](BehaviorSubject, _super);\n    function BehaviorSubject(_value) {\n        var _this = _super.call(this) || this;\n        _this._value = _value;\n        return _this;\n    }\n    Object.defineProperty(BehaviorSubject.prototype, \"value\", {\n        get: function () {\n            return this.getValue();\n        },\n        enumerable: true,\n        configurable: true\n    });\n    BehaviorSubject.prototype._subscribe = function (subscriber) {\n        var subscription = _super.prototype._subscribe.call(this, subscriber);\n        if (subscription && !subscription.closed) {\n            subscriber.next(this._value);\n        }\n        return subscription;\n    };\n    BehaviorSubject.prototype.getValue = function () {\n        if (this.hasError) {\n            throw this.thrownError;\n        }\n        else if (this.closed) {\n            throw new __WEBPACK_IMPORTED_MODULE_2__util_ObjectUnsubscribedError__[\"a\" /* ObjectUnsubscribedError */]();\n        }\n        else {\n            return this._value;\n        }\n    };\n    BehaviorSubject.prototype.next = function (value) {\n        _super.prototype.next.call(this, this._value = value);\n    };\n    return BehaviorSubject;\n}(__WEBPACK_IMPORTED_MODULE_1__Subject__[\"a\" /* Subject */]));\n\n//# sourceMappingURL=BehaviorSubject.js.map\n\n\n/***/ }),\n/* 420 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return empty; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__config__ = __webpack_require__(186);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_hostReportError__ = __webpack_require__(324);\n/** PURE_IMPORTS_START _config,_util_hostReportError PURE_IMPORTS_END */\n\n\nvar empty = {\n    closed: true,\n    next: function (value) { },\n    error: function (err) {\n        if (__WEBPACK_IMPORTED_MODULE_0__config__[\"a\" /* config */].useDeprecatedSynchronousErrorHandling) {\n            throw err;\n        }\n        else {\n            __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_hostReportError__[\"a\" /* hostReportError */])(err);\n        }\n    },\n    complete: function () { }\n};\n//# sourceMappingURL=Observer.js.map\n\n\n/***/ }),\n/* 421 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Scheduler; });\nvar Scheduler = /*@__PURE__*/ (function () {\n    function Scheduler(SchedulerAction, now) {\n        if (now === void 0) {\n            now = Scheduler.now;\n        }\n        this.SchedulerAction = SchedulerAction;\n        this.now = now;\n    }\n    Scheduler.prototype.schedule = function (work, delay, state) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        return new this.SchedulerAction(this, work).schedule(state, delay);\n    };\n    Scheduler.now = function () { return Date.now(); };\n    return Scheduler;\n}());\n\n//# sourceMappingURL=Scheduler.js.map\n\n\n/***/ }),\n/* 422 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return SubjectSubscription; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscription__ = __webpack_require__(25);\n/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */\n\n\nvar SubjectSubscription = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SubjectSubscription, _super);\n    function SubjectSubscription(subject, subscriber) {\n        var _this = _super.call(this) || this;\n        _this.subject = subject;\n        _this.subscriber = subscriber;\n        _this.closed = false;\n        return _this;\n    }\n    SubjectSubscription.prototype.unsubscribe = function () {\n        if (this.closed) {\n            return;\n        }\n        this.closed = true;\n        var subject = this.subject;\n        var observers = subject.observers;\n        this.subject = null;\n        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {\n            return;\n        }\n        var subscriberIndex = observers.indexOf(this.subscriber);\n        if (subscriberIndex !== -1) {\n            observers.splice(subscriberIndex, 1);\n        }\n    };\n    return SubjectSubscription;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscription__[\"a\" /* Subscription */]));\n\n//# sourceMappingURL=SubjectSubscription.js.map\n\n\n/***/ }),\n/* 423 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ConnectableObservable; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return connectableObservableDescriptor; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Subscription__ = __webpack_require__(25);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__operators_refCount__ = __webpack_require__(317);\n/** PURE_IMPORTS_START tslib,_Subject,_Observable,_Subscriber,_Subscription,_operators_refCount PURE_IMPORTS_END */\n\n\n\n\n\n\nvar ConnectableObservable = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](ConnectableObservable, _super);\n    function ConnectableObservable(source, subjectFactory) {\n        var _this = _super.call(this) || this;\n        _this.source = source;\n        _this.subjectFactory = subjectFactory;\n        _this._refCount = 0;\n        _this._isComplete = false;\n        return _this;\n    }\n    ConnectableObservable.prototype._subscribe = function (subscriber) {\n        return this.getSubject().subscribe(subscriber);\n    };\n    ConnectableObservable.prototype.getSubject = function () {\n        var subject = this._subject;\n        if (!subject || subject.isStopped) {\n            this._subject = this.subjectFactory();\n        }\n        return this._subject;\n    };\n    ConnectableObservable.prototype.connect = function () {\n        var connection = this._connection;\n        if (!connection) {\n            this._isComplete = false;\n            connection = this._connection = new __WEBPACK_IMPORTED_MODULE_4__Subscription__[\"a\" /* Subscription */]();\n            connection.add(this.source\n                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));\n            if (connection.closed) {\n                this._connection = null;\n                connection = __WEBPACK_IMPORTED_MODULE_4__Subscription__[\"a\" /* Subscription */].EMPTY;\n            }\n            else {\n                this._connection = connection;\n            }\n        }\n        return connection;\n    };\n    ConnectableObservable.prototype.refCount = function () {\n        return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__operators_refCount__[\"a\" /* refCount */])()(this);\n    };\n    return ConnectableObservable;\n}(__WEBPACK_IMPORTED_MODULE_2__Observable__[\"a\" /* Observable */]));\n\nvar connectableProto = ConnectableObservable.prototype;\nvar connectableObservableDescriptor = {\n    operator: { value: null },\n    _refCount: { value: 0, writable: true },\n    _subject: { value: null, writable: true },\n    _connection: { value: null, writable: true },\n    _subscribe: { value: connectableProto._subscribe },\n    _isComplete: { value: connectableProto._isComplete, writable: true },\n    getSubject: { value: connectableProto.getSubject },\n    connect: { value: connectableProto.connect },\n    refCount: { value: connectableProto.refCount }\n};\nvar ConnectableSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](ConnectableSubscriber, _super);\n    function ConnectableSubscriber(destination, connectable) {\n        var _this = _super.call(this, destination) || this;\n        _this.connectable = connectable;\n        return _this;\n    }\n    ConnectableSubscriber.prototype._error = function (err) {\n        this._unsubscribe();\n        _super.prototype._error.call(this, err);\n    };\n    ConnectableSubscriber.prototype._complete = function () {\n        this.connectable._isComplete = true;\n        this._unsubscribe();\n        _super.prototype._complete.call(this);\n    };\n    ConnectableSubscriber.prototype._unsubscribe = function () {\n        var connectable = this.connectable;\n        if (connectable) {\n            this.connectable = null;\n            var connection = connectable._connection;\n            connectable._refCount = 0;\n            connectable._subject = null;\n            connectable._connection = null;\n            if (connection) {\n                connection.unsubscribe();\n            }\n        }\n    };\n    return ConnectableSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subject__[\"b\" /* SubjectSubscriber */]));\nvar RefCountOperator = /*@__PURE__*/ (function () {\n    function RefCountOperator(connectable) {\n        this.connectable = connectable;\n    }\n    RefCountOperator.prototype.call = function (subscriber, source) {\n        var connectable = this.connectable;\n        connectable._refCount++;\n        var refCounter = new RefCountSubscriber(subscriber, connectable);\n        var subscription = source.subscribe(refCounter);\n        if (!refCounter.closed) {\n            refCounter.connection = connectable.connect();\n        }\n        return subscription;\n    };\n    return RefCountOperator;\n}());\nvar RefCountSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](RefCountSubscriber, _super);\n    function RefCountSubscriber(destination, connectable) {\n        var _this = _super.call(this, destination) || this;\n        _this.connectable = connectable;\n        return _this;\n    }\n    RefCountSubscriber.prototype._unsubscribe = function () {\n        var connectable = this.connectable;\n        if (!connectable) {\n            this.connection = null;\n            return;\n        }\n        this.connectable = null;\n        var refCount = connectable._refCount;\n        if (refCount <= 0) {\n            this.connection = null;\n            return;\n        }\n        connectable._refCount = refCount - 1;\n        if (refCount > 1) {\n            this.connection = null;\n            return;\n        }\n        var connection = this.connection;\n        var sharedConnection = connectable._connection;\n        this.connection = null;\n        if (sharedConnection && (!connection || sharedConnection === connection)) {\n            sharedConnection.unsubscribe();\n        }\n    };\n    return RefCountSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_3__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=ConnectableObservable.js.map\n\n\n/***/ }),\n/* 424 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = merge;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isScheduler__ = __webpack_require__(49);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__operators_mergeAll__ = __webpack_require__(316);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__fromArray__ = __webpack_require__(85);\n/** PURE_IMPORTS_START _Observable,_util_isScheduler,_operators_mergeAll,_fromArray PURE_IMPORTS_END */\n\n\n\n\nfunction merge() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    var concurrent = Number.POSITIVE_INFINITY;\n    var scheduler = null;\n    var last = observables[observables.length - 1];\n    if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isScheduler__[\"a\" /* isScheduler */])(last)) {\n        scheduler = observables.pop();\n        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {\n            concurrent = observables.pop();\n        }\n    }\n    else if (typeof last === 'number') {\n        concurrent = observables.pop();\n    }\n    if (scheduler === null && observables.length === 1 && observables[0] instanceof __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */]) {\n        return observables[0];\n    }\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__operators_mergeAll__[\"a\" /* mergeAll */])(concurrent)(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__fromArray__[\"a\" /* fromArray */])(observables, scheduler));\n}\n//# sourceMappingURL=merge.js.map\n\n\n/***/ }),\n/* 425 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return NEVER; });\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = never;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_noop__ = __webpack_require__(192);\n/** PURE_IMPORTS_START _Observable,_util_noop PURE_IMPORTS_END */\n\n\nvar NEVER = /*@__PURE__*/ new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](__WEBPACK_IMPORTED_MODULE_1__util_noop__[\"a\" /* noop */]);\nfunction never() {\n    return NEVER;\n}\n//# sourceMappingURL=never.js.map\n\n\n/***/ }),\n/* 426 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = race;\n/* unused harmony export RaceOperator */\n/* unused harmony export RaceSubscriber */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isArray__ = __webpack_require__(41);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__fromArray__ = __webpack_require__(85);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_util_isArray,_fromArray,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\n\nfunction race() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    if (observables.length === 1) {\n        if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isArray__[\"a\" /* isArray */])(observables[0])) {\n            observables = observables[0];\n        }\n        else {\n            return observables[0];\n        }\n    }\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__fromArray__[\"a\" /* fromArray */])(observables, undefined).lift(new RaceOperator());\n}\nvar RaceOperator = /*@__PURE__*/ (function () {\n    function RaceOperator() {\n    }\n    RaceOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new RaceSubscriber(subscriber));\n    };\n    return RaceOperator;\n}());\n\nvar RaceSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](RaceSubscriber, _super);\n    function RaceSubscriber(destination) {\n        var _this = _super.call(this, destination) || this;\n        _this.hasFirst = false;\n        _this.observables = [];\n        _this.subscriptions = [];\n        return _this;\n    }\n    RaceSubscriber.prototype._next = function (observable) {\n        this.observables.push(observable);\n    };\n    RaceSubscriber.prototype._complete = function () {\n        var observables = this.observables;\n        var len = observables.length;\n        if (len === 0) {\n            this.destination.complete();\n        }\n        else {\n            for (var i = 0; i < len && !this.hasFirst; i++) {\n                var observable = observables[i];\n                var subscription = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, observable, observable, i);\n                if (this.subscriptions) {\n                    this.subscriptions.push(subscription);\n                }\n                this.add(subscription);\n            }\n            this.observables = null;\n        }\n    };\n    RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        if (!this.hasFirst) {\n            this.hasFirst = true;\n            for (var i = 0; i < this.subscriptions.length; i++) {\n                if (i !== outerIndex) {\n                    var subscription = this.subscriptions[i];\n                    subscription.unsubscribe();\n                    this.remove(subscription);\n                }\n            }\n            this.subscriptions = null;\n        }\n        this.destination.next(innerValue);\n    };\n    return RaceSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n\n//# sourceMappingURL=race.js.map\n\n\n/***/ }),\n/* 427 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = timer;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__scheduler_async__ = __webpack_require__(40);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isNumeric__ = __webpack_require__(191);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_isScheduler__ = __webpack_require__(49);\n/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */\n\n\n\n\nfunction timer(dueTime, periodOrScheduler, scheduler) {\n    if (dueTime === void 0) {\n        dueTime = 0;\n    }\n    var period = -1;\n    if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isNumeric__[\"a\" /* isNumeric */])(periodOrScheduler)) {\n        period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler);\n    }\n    else if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_isScheduler__[\"a\" /* isScheduler */])(periodOrScheduler)) {\n        scheduler = periodOrScheduler;\n    }\n    if (!__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_isScheduler__[\"a\" /* isScheduler */])(scheduler)) {\n        scheduler = __WEBPACK_IMPORTED_MODULE_1__scheduler_async__[\"a\" /* async */];\n    }\n    return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n        var due = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isNumeric__[\"a\" /* isNumeric */])(dueTime)\n            ? dueTime\n            : (+dueTime - scheduler.now());\n        return scheduler.schedule(dispatch, due, {\n            index: 0, period: period, subscriber: subscriber\n        });\n    });\n}\nfunction dispatch(state) {\n    var index = state.index, period = state.period, subscriber = state.subscriber;\n    subscriber.next(index);\n    if (subscriber.closed) {\n        return;\n    }\n    else if (period === -1) {\n        return subscriber.complete();\n    }\n    state.index = index + 1;\n    this.schedule(state, period);\n}\n//# sourceMappingURL=timer.js.map\n\n\n/***/ }),\n/* 428 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = audit;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_tryCatch__ = __webpack_require__(57);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_errorObject__ = __webpack_require__(48);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_util_tryCatch,_util_errorObject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\n\nfunction audit(durationSelector) {\n    return function auditOperatorFunction(source) {\n        return source.lift(new AuditOperator(durationSelector));\n    };\n}\nvar AuditOperator = /*@__PURE__*/ (function () {\n    function AuditOperator(durationSelector) {\n        this.durationSelector = durationSelector;\n    }\n    AuditOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector));\n    };\n    return AuditOperator;\n}());\nvar AuditSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](AuditSubscriber, _super);\n    function AuditSubscriber(destination, durationSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.durationSelector = durationSelector;\n        _this.hasValue = false;\n        return _this;\n    }\n    AuditSubscriber.prototype._next = function (value) {\n        this.value = value;\n        this.hasValue = true;\n        if (!this.throttled) {\n            var duration = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_tryCatch__[\"a\" /* tryCatch */])(this.durationSelector)(value);\n            if (duration === __WEBPACK_IMPORTED_MODULE_2__util_errorObject__[\"a\" /* errorObject */]) {\n                this.destination.error(__WEBPACK_IMPORTED_MODULE_2__util_errorObject__[\"a\" /* errorObject */].e);\n            }\n            else {\n                var innerSubscription = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, duration);\n                if (!innerSubscription || innerSubscription.closed) {\n                    this.clearThrottle();\n                }\n                else {\n                    this.add(this.throttled = innerSubscription);\n                }\n            }\n        }\n    };\n    AuditSubscriber.prototype.clearThrottle = function () {\n        var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled;\n        if (throttled) {\n            this.remove(throttled);\n            this.throttled = null;\n            throttled.unsubscribe();\n        }\n        if (hasValue) {\n            this.value = null;\n            this.hasValue = false;\n            this.destination.next(value);\n        }\n    };\n    AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {\n        this.clearThrottle();\n    };\n    AuditSubscriber.prototype.notifyComplete = function () {\n        this.clearThrottle();\n    };\n    return AuditSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=audit.js.map\n\n\n/***/ }),\n/* 429 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = concatAll;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__mergeAll__ = __webpack_require__(316);\n/** PURE_IMPORTS_START _mergeAll PURE_IMPORTS_END */\n\nfunction concatAll() {\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__mergeAll__[\"a\" /* mergeAll */])(1);\n}\n//# sourceMappingURL=concatAll.js.map\n\n\n/***/ }),\n/* 430 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = concatMap;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__mergeMap__ = __webpack_require__(149);\n/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */\n\nfunction concatMap(project, resultSelector) {\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__mergeMap__[\"a\" /* mergeMap */])(project, resultSelector, 1);\n}\n//# sourceMappingURL=concatMap.js.map\n\n\n/***/ }),\n/* 431 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = distinctUntilChanged;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(57);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_errorObject__ = __webpack_require__(48);\n/** PURE_IMPORTS_START tslib,_Subscriber,_util_tryCatch,_util_errorObject PURE_IMPORTS_END */\n\n\n\n\nfunction distinctUntilChanged(compare, keySelector) {\n    return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); };\n}\nvar DistinctUntilChangedOperator = /*@__PURE__*/ (function () {\n    function DistinctUntilChangedOperator(compare, keySelector) {\n        this.compare = compare;\n        this.keySelector = keySelector;\n    }\n    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));\n    };\n    return DistinctUntilChangedOperator;\n}());\nvar DistinctUntilChangedSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](DistinctUntilChangedSubscriber, _super);\n    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.keySelector = keySelector;\n        _this.hasKey = false;\n        if (typeof compare === 'function') {\n            _this.compare = compare;\n        }\n        return _this;\n    }\n    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {\n        return x === y;\n    };\n    DistinctUntilChangedSubscriber.prototype._next = function (value) {\n        var keySelector = this.keySelector;\n        var key = value;\n        if (keySelector) {\n            key = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_tryCatch__[\"a\" /* tryCatch */])(this.keySelector)(value);\n            if (key === __WEBPACK_IMPORTED_MODULE_3__util_errorObject__[\"a\" /* errorObject */]) {\n                return this.destination.error(__WEBPACK_IMPORTED_MODULE_3__util_errorObject__[\"a\" /* errorObject */].e);\n            }\n        }\n        var result = false;\n        if (this.hasKey) {\n            result = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_tryCatch__[\"a\" /* tryCatch */])(this.compare)(this.key, key);\n            if (result === __WEBPACK_IMPORTED_MODULE_3__util_errorObject__[\"a\" /* errorObject */]) {\n                return this.destination.error(__WEBPACK_IMPORTED_MODULE_3__util_errorObject__[\"a\" /* errorObject */].e);\n            }\n        }\n        else {\n            this.hasKey = true;\n        }\n        if (Boolean(result) === false) {\n            this.key = key;\n            this.destination.next(value);\n        }\n    };\n    return DistinctUntilChangedSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=distinctUntilChanged.js.map\n\n\n/***/ }),\n/* 432 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = find;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return FindValueOperator; });\n/* unused harmony export FindValueSubscriber */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction find(predicate, thisArg) {\n    if (typeof predicate !== 'function') {\n        throw new TypeError('predicate is not a function');\n    }\n    return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); };\n}\nvar FindValueOperator = /*@__PURE__*/ (function () {\n    function FindValueOperator(predicate, source, yieldIndex, thisArg) {\n        this.predicate = predicate;\n        this.source = source;\n        this.yieldIndex = yieldIndex;\n        this.thisArg = thisArg;\n    }\n    FindValueOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));\n    };\n    return FindValueOperator;\n}());\n\nvar FindValueSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](FindValueSubscriber, _super);\n    function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.source = source;\n        _this.yieldIndex = yieldIndex;\n        _this.thisArg = thisArg;\n        _this.index = 0;\n        return _this;\n    }\n    FindValueSubscriber.prototype.notifyComplete = function (value) {\n        var destination = this.destination;\n        destination.next(value);\n        destination.complete();\n        this.unsubscribe();\n    };\n    FindValueSubscriber.prototype._next = function (value) {\n        var _a = this, predicate = _a.predicate, thisArg = _a.thisArg;\n        var index = this.index++;\n        try {\n            var result = predicate.call(thisArg || this, value, index, this.source);\n            if (result) {\n                this.notifyComplete(this.yieldIndex ? index : value);\n            }\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n    };\n    FindValueSubscriber.prototype._complete = function () {\n        this.notifyComplete(this.yieldIndex ? -1 : undefined);\n    };\n    return FindValueSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n\n//# sourceMappingURL=find.js.map\n\n\n/***/ }),\n/* 433 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"b\"] = groupBy;\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return GroupedObservable; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subscription__ = __webpack_require__(25);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Subject__ = __webpack_require__(36);\n/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription,_Observable,_Subject PURE_IMPORTS_END */\n\n\n\n\n\nfunction groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {\n    return function (source) {\n        return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));\n    };\n}\nvar GroupByOperator = /*@__PURE__*/ (function () {\n    function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) {\n        this.keySelector = keySelector;\n        this.elementSelector = elementSelector;\n        this.durationSelector = durationSelector;\n        this.subjectSelector = subjectSelector;\n    }\n    GroupByOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector));\n    };\n    return GroupByOperator;\n}());\nvar GroupBySubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](GroupBySubscriber, _super);\n    function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.keySelector = keySelector;\n        _this.elementSelector = elementSelector;\n        _this.durationSelector = durationSelector;\n        _this.subjectSelector = subjectSelector;\n        _this.groups = null;\n        _this.attemptedToUnsubscribe = false;\n        _this.count = 0;\n        return _this;\n    }\n    GroupBySubscriber.prototype._next = function (value) {\n        var key;\n        try {\n            key = this.keySelector(value);\n        }\n        catch (err) {\n            this.error(err);\n            return;\n        }\n        this._group(value, key);\n    };\n    GroupBySubscriber.prototype._group = function (value, key) {\n        var groups = this.groups;\n        if (!groups) {\n            groups = this.groups = new Map();\n        }\n        var group = groups.get(key);\n        var element;\n        if (this.elementSelector) {\n            try {\n                element = this.elementSelector(value);\n            }\n            catch (err) {\n                this.error(err);\n            }\n        }\n        else {\n            element = value;\n        }\n        if (!group) {\n            group = (this.subjectSelector ? this.subjectSelector() : new __WEBPACK_IMPORTED_MODULE_4__Subject__[\"a\" /* Subject */]());\n            groups.set(key, group);\n            var groupedObservable = new GroupedObservable(key, group, this);\n            this.destination.next(groupedObservable);\n            if (this.durationSelector) {\n                var duration = void 0;\n                try {\n                    duration = this.durationSelector(new GroupedObservable(key, group));\n                }\n                catch (err) {\n                    this.error(err);\n                    return;\n                }\n                this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));\n            }\n        }\n        if (!group.closed) {\n            group.next(element);\n        }\n    };\n    GroupBySubscriber.prototype._error = function (err) {\n        var groups = this.groups;\n        if (groups) {\n            groups.forEach(function (group, key) {\n                group.error(err);\n            });\n            groups.clear();\n        }\n        this.destination.error(err);\n    };\n    GroupBySubscriber.prototype._complete = function () {\n        var groups = this.groups;\n        if (groups) {\n            groups.forEach(function (group, key) {\n                group.complete();\n            });\n            groups.clear();\n        }\n        this.destination.complete();\n    };\n    GroupBySubscriber.prototype.removeGroup = function (key) {\n        this.groups.delete(key);\n    };\n    GroupBySubscriber.prototype.unsubscribe = function () {\n        if (!this.closed) {\n            this.attemptedToUnsubscribe = true;\n            if (this.count === 0) {\n                _super.prototype.unsubscribe.call(this);\n            }\n        }\n    };\n    return GroupBySubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\nvar GroupDurationSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](GroupDurationSubscriber, _super);\n    function GroupDurationSubscriber(key, group, parent) {\n        var _this = _super.call(this, group) || this;\n        _this.key = key;\n        _this.group = group;\n        _this.parent = parent;\n        return _this;\n    }\n    GroupDurationSubscriber.prototype._next = function (value) {\n        this.complete();\n    };\n    GroupDurationSubscriber.prototype._unsubscribe = function () {\n        var _a = this, parent = _a.parent, key = _a.key;\n        this.key = this.parent = null;\n        if (parent) {\n            parent.removeGroup(key);\n        }\n    };\n    return GroupDurationSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\nvar GroupedObservable = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](GroupedObservable, _super);\n    function GroupedObservable(key, groupSubject, refCountSubscription) {\n        var _this = _super.call(this) || this;\n        _this.key = key;\n        _this.groupSubject = groupSubject;\n        _this.refCountSubscription = refCountSubscription;\n        return _this;\n    }\n    GroupedObservable.prototype._subscribe = function (subscriber) {\n        var subscription = new __WEBPACK_IMPORTED_MODULE_2__Subscription__[\"a\" /* Subscription */]();\n        var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject;\n        if (refCountSubscription && !refCountSubscription.closed) {\n            subscription.add(new InnerRefCountSubscription(refCountSubscription));\n        }\n        subscription.add(groupSubject.subscribe(subscriber));\n        return subscription;\n    };\n    return GroupedObservable;\n}(__WEBPACK_IMPORTED_MODULE_3__Observable__[\"a\" /* Observable */]));\n\nvar InnerRefCountSubscription = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](InnerRefCountSubscription, _super);\n    function InnerRefCountSubscription(parent) {\n        var _this = _super.call(this) || this;\n        _this.parent = parent;\n        parent.count++;\n        return _this;\n    }\n    InnerRefCountSubscription.prototype.unsubscribe = function () {\n        var parent = this.parent;\n        if (!parent.closed && !this.closed) {\n            _super.prototype.unsubscribe.call(this);\n            parent.count -= 1;\n            if (parent.count === 0 && parent.attemptedToUnsubscribe) {\n                parent.unsubscribe();\n            }\n        }\n    };\n    return InnerRefCountSubscription;\n}(__WEBPACK_IMPORTED_MODULE_2__Subscription__[\"a\" /* Subscription */]));\n//# sourceMappingURL=groupBy.js.map\n\n\n/***/ }),\n/* 434 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"b\"] = observeOn;\n/* unused harmony export ObserveOnOperator */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ObserveOnSubscriber; });\n/* unused harmony export ObserveOnMessage */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Notification__ = __webpack_require__(185);\n/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */\n\n\n\nfunction observeOn(scheduler, delay) {\n    if (delay === void 0) {\n        delay = 0;\n    }\n    return function observeOnOperatorFunction(source) {\n        return source.lift(new ObserveOnOperator(scheduler, delay));\n    };\n}\nvar ObserveOnOperator = /*@__PURE__*/ (function () {\n    function ObserveOnOperator(scheduler, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        this.scheduler = scheduler;\n        this.delay = delay;\n    }\n    ObserveOnOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));\n    };\n    return ObserveOnOperator;\n}());\n\nvar ObserveOnSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](ObserveOnSubscriber, _super);\n    function ObserveOnSubscriber(destination, scheduler, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        var _this = _super.call(this, destination) || this;\n        _this.scheduler = scheduler;\n        _this.delay = delay;\n        return _this;\n    }\n    ObserveOnSubscriber.dispatch = function (arg) {\n        var notification = arg.notification, destination = arg.destination;\n        notification.observe(destination);\n        this.unsubscribe();\n    };\n    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {\n        var destination = this.destination;\n        destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));\n    };\n    ObserveOnSubscriber.prototype._next = function (value) {\n        this.scheduleMessage(__WEBPACK_IMPORTED_MODULE_2__Notification__[\"a\" /* Notification */].createNext(value));\n    };\n    ObserveOnSubscriber.prototype._error = function (err) {\n        this.scheduleMessage(__WEBPACK_IMPORTED_MODULE_2__Notification__[\"a\" /* Notification */].createError(err));\n        this.unsubscribe();\n    };\n    ObserveOnSubscriber.prototype._complete = function () {\n        this.scheduleMessage(__WEBPACK_IMPORTED_MODULE_2__Notification__[\"a\" /* Notification */].createComplete());\n        this.unsubscribe();\n    };\n    return ObserveOnSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n\nvar ObserveOnMessage = /*@__PURE__*/ (function () {\n    function ObserveOnMessage(notification, destination) {\n        this.notification = notification;\n        this.destination = destination;\n    }\n    return ObserveOnMessage;\n}());\n\n//# sourceMappingURL=observeOn.js.map\n\n\n/***/ }),\n/* 435 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = tap;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_noop__ = __webpack_require__(192);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_isFunction__ = __webpack_require__(155);\n/** PURE_IMPORTS_START tslib,_Subscriber,_util_noop,_util_isFunction PURE_IMPORTS_END */\n\n\n\n\nfunction tap(nextOrObserver, error, complete) {\n    return function tapOperatorFunction(source) {\n        return source.lift(new DoOperator(nextOrObserver, error, complete));\n    };\n}\nvar DoOperator = /*@__PURE__*/ (function () {\n    function DoOperator(nextOrObserver, error, complete) {\n        this.nextOrObserver = nextOrObserver;\n        this.error = error;\n        this.complete = complete;\n    }\n    DoOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));\n    };\n    return DoOperator;\n}());\nvar TapSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](TapSubscriber, _super);\n    function TapSubscriber(destination, observerOrNext, error, complete) {\n        var _this = _super.call(this, destination) || this;\n        _this._tapNext = __WEBPACK_IMPORTED_MODULE_2__util_noop__[\"a\" /* noop */];\n        _this._tapError = __WEBPACK_IMPORTED_MODULE_2__util_noop__[\"a\" /* noop */];\n        _this._tapComplete = __WEBPACK_IMPORTED_MODULE_2__util_noop__[\"a\" /* noop */];\n        _this._tapError = error || __WEBPACK_IMPORTED_MODULE_2__util_noop__[\"a\" /* noop */];\n        _this._tapComplete = complete || __WEBPACK_IMPORTED_MODULE_2__util_noop__[\"a\" /* noop */];\n        if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_isFunction__[\"a\" /* isFunction */])(observerOrNext)) {\n            _this._context = _this;\n            _this._tapNext = observerOrNext;\n        }\n        else if (observerOrNext) {\n            _this._context = observerOrNext;\n            _this._tapNext = observerOrNext.next || __WEBPACK_IMPORTED_MODULE_2__util_noop__[\"a\" /* noop */];\n            _this._tapError = observerOrNext.error || __WEBPACK_IMPORTED_MODULE_2__util_noop__[\"a\" /* noop */];\n            _this._tapComplete = observerOrNext.complete || __WEBPACK_IMPORTED_MODULE_2__util_noop__[\"a\" /* noop */];\n        }\n        return _this;\n    }\n    TapSubscriber.prototype._next = function (value) {\n        try {\n            this._tapNext.call(this._context, value);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(value);\n    };\n    TapSubscriber.prototype._error = function (err) {\n        try {\n            this._tapError.call(this._context, err);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.error(err);\n    };\n    TapSubscriber.prototype._complete = function () {\n        try {\n            this._tapComplete.call(this._context);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        return this.destination.complete();\n    };\n    return TapSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=tap.js.map\n\n\n/***/ }),\n/* 436 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return defaultThrottleConfig; });\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = throttle;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\nvar defaultThrottleConfig = {\n    leading: true,\n    trailing: false\n};\nfunction throttle(durationSelector, config) {\n    if (config === void 0) {\n        config = defaultThrottleConfig;\n    }\n    return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); };\n}\nvar ThrottleOperator = /*@__PURE__*/ (function () {\n    function ThrottleOperator(durationSelector, leading, trailing) {\n        this.durationSelector = durationSelector;\n        this.leading = leading;\n        this.trailing = trailing;\n    }\n    ThrottleOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));\n    };\n    return ThrottleOperator;\n}());\nvar ThrottleSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](ThrottleSubscriber, _super);\n    function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) {\n        var _this = _super.call(this, destination) || this;\n        _this.destination = destination;\n        _this.durationSelector = durationSelector;\n        _this._leading = _leading;\n        _this._trailing = _trailing;\n        _this._hasValue = false;\n        return _this;\n    }\n    ThrottleSubscriber.prototype._next = function (value) {\n        this._hasValue = true;\n        this._sendValue = value;\n        if (!this._throttled) {\n            if (this._leading) {\n                this.send();\n            }\n            else {\n                this.throttle(value);\n            }\n        }\n    };\n    ThrottleSubscriber.prototype.send = function () {\n        var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue;\n        if (_hasValue) {\n            this.destination.next(_sendValue);\n            this.throttle(_sendValue);\n        }\n        this._hasValue = false;\n        this._sendValue = null;\n    };\n    ThrottleSubscriber.prototype.throttle = function (value) {\n        var duration = this.tryDurationSelector(value);\n        if (duration) {\n            this.add(this._throttled = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, duration));\n        }\n    };\n    ThrottleSubscriber.prototype.tryDurationSelector = function (value) {\n        try {\n            return this.durationSelector(value);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return null;\n        }\n    };\n    ThrottleSubscriber.prototype.throttlingDone = function () {\n        var _a = this, _throttled = _a._throttled, _trailing = _a._trailing;\n        if (_throttled) {\n            _throttled.unsubscribe();\n        }\n        this._throttled = null;\n        if (_trailing) {\n            this.send();\n        }\n    };\n    ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.throttlingDone();\n    };\n    ThrottleSubscriber.prototype.notifyComplete = function () {\n        this.throttlingDone();\n    };\n    return ThrottleSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=throttle.js.map\n\n\n/***/ }),\n/* 437 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = timeoutWith;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__scheduler_async__ = __webpack_require__(40);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isDate__ = __webpack_require__(443);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\n\nfunction timeoutWith(due, withObservable, scheduler) {\n    if (scheduler === void 0) {\n        scheduler = __WEBPACK_IMPORTED_MODULE_1__scheduler_async__[\"a\" /* async */];\n    }\n    return function (source) {\n        var absoluteTimeout = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isDate__[\"a\" /* isDate */])(due);\n        var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);\n        return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler));\n    };\n}\nvar TimeoutWithOperator = /*@__PURE__*/ (function () {\n    function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) {\n        this.waitFor = waitFor;\n        this.absoluteTimeout = absoluteTimeout;\n        this.withObservable = withObservable;\n        this.scheduler = scheduler;\n    }\n    TimeoutWithOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler));\n    };\n    return TimeoutWithOperator;\n}());\nvar TimeoutWithSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](TimeoutWithSubscriber, _super);\n    function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.absoluteTimeout = absoluteTimeout;\n        _this.waitFor = waitFor;\n        _this.withObservable = withObservable;\n        _this.scheduler = scheduler;\n        _this.action = null;\n        _this.scheduleTimeout();\n        return _this;\n    }\n    TimeoutWithSubscriber.dispatchTimeout = function (subscriber) {\n        var withObservable = subscriber.withObservable;\n        subscriber._unsubscribeAndRecycle();\n        subscriber.add(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__[\"a\" /* subscribeToResult */])(subscriber, withObservable));\n    };\n    TimeoutWithSubscriber.prototype.scheduleTimeout = function () {\n        var action = this.action;\n        if (action) {\n            this.action = action.schedule(this, this.waitFor);\n        }\n        else {\n            this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this));\n        }\n    };\n    TimeoutWithSubscriber.prototype._next = function (value) {\n        if (!this.absoluteTimeout) {\n            this.scheduleTimeout();\n        }\n        _super.prototype._next.call(this, value);\n    };\n    TimeoutWithSubscriber.prototype._unsubscribe = function () {\n        this.action = null;\n        this.scheduler = null;\n        this.withObservable = null;\n    };\n    return TimeoutWithSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=timeoutWith.js.map\n\n\n/***/ }),\n/* 438 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return asap; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AsapAction__ = __webpack_require__(921);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsapScheduler__ = __webpack_require__(922);\n/** PURE_IMPORTS_START _AsapAction,_AsapScheduler PURE_IMPORTS_END */\n\n\nvar asap = /*@__PURE__*/ new __WEBPACK_IMPORTED_MODULE_1__AsapScheduler__[\"a\" /* AsapScheduler */](__WEBPACK_IMPORTED_MODULE_0__AsapAction__[\"a\" /* AsapAction */]);\n//# sourceMappingURL=asap.js.map\n\n\n/***/ }),\n/* 439 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return queue; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__QueueAction__ = __webpack_require__(923);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__QueueScheduler__ = __webpack_require__(924);\n/** PURE_IMPORTS_START _QueueAction,_QueueScheduler PURE_IMPORTS_END */\n\n\nvar queue = /*@__PURE__*/ new __WEBPACK_IMPORTED_MODULE_1__QueueScheduler__[\"a\" /* QueueScheduler */](__WEBPACK_IMPORTED_MODULE_0__QueueAction__[\"a\" /* QueueAction */]);\n//# sourceMappingURL=queue.js.map\n\n\n/***/ }),\n/* 440 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return TimeoutError; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction TimeoutErrorImpl() {\n    Error.call(this);\n    this.message = 'Timeout has occurred';\n    this.name = 'TimeoutError';\n    return this;\n}\nTimeoutErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype);\nvar TimeoutError = TimeoutErrorImpl;\n//# sourceMappingURL=TimeoutError.js.map\n\n\n/***/ }),\n/* 441 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return UnsubscriptionError; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction UnsubscriptionErrorImpl(errors) {\n    Error.call(this);\n    this.message = errors ?\n        errors.length + \" errors occurred during unsubscription:\\n\" + errors.map(function (err, i) { return i + 1 + \") \" + err.toString(); }).join('\\n  ') : '';\n    this.name = 'UnsubscriptionError';\n    this.errors = errors;\n    return this;\n}\nUnsubscriptionErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype);\nvar UnsubscriptionError = UnsubscriptionErrorImpl;\n//# sourceMappingURL=UnsubscriptionError.js.map\n\n\n/***/ }),\n/* 442 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return isArrayLike; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nvar isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });\n//# sourceMappingURL=isArrayLike.js.map\n\n\n/***/ }),\n/* 443 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = isDate;\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction isDate(value) {\n    return value instanceof Date && !isNaN(+value);\n}\n//# sourceMappingURL=isDate.js.map\n\n\n/***/ }),\n/* 444 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = isObject;\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction isObject(x) {\n    return x != null && typeof x === 'object';\n}\n//# sourceMappingURL=isObject.js.map\n\n\n/***/ }),\n/* 445 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = isPromise;\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction isPromise(value) {\n    return value && typeof value.subscribe !== 'function' && typeof value.then === 'function';\n}\n//# sourceMappingURL=isPromise.js.map\n\n\n/***/ }),\n/* 446 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return subscribeTo; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__subscribeToArray__ = __webpack_require__(447);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__subscribeToPromise__ = __webpack_require__(450);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__subscribeToIterable__ = __webpack_require__(448);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__subscribeToObservable__ = __webpack_require__(449);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__isArrayLike__ = __webpack_require__(442);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__isPromise__ = __webpack_require__(445);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__isObject__ = __webpack_require__(444);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__symbol_iterator__ = __webpack_require__(152);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__symbol_observable__ = __webpack_require__(118);\n/** PURE_IMPORTS_START _Observable,_subscribeToArray,_subscribeToPromise,_subscribeToIterable,_subscribeToObservable,_isArrayLike,_isPromise,_isObject,_symbol_iterator,_symbol_observable PURE_IMPORTS_END */\n\n\n\n\n\n\n\n\n\n\nvar subscribeTo = function (result) {\n    if (result instanceof __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */]) {\n        return function (subscriber) {\n            if (result._isScalar) {\n                subscriber.next(result.value);\n                subscriber.complete();\n                return undefined;\n            }\n            else {\n                return result.subscribe(subscriber);\n            }\n        };\n    }\n    else if (result && typeof result[__WEBPACK_IMPORTED_MODULE_9__symbol_observable__[\"a\" /* observable */]] === 'function') {\n        return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__subscribeToObservable__[\"a\" /* subscribeToObservable */])(result);\n    }\n    else if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__isArrayLike__[\"a\" /* isArrayLike */])(result)) {\n        return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__subscribeToArray__[\"a\" /* subscribeToArray */])(result);\n    }\n    else if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__isPromise__[\"a\" /* isPromise */])(result)) {\n        return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__subscribeToPromise__[\"a\" /* subscribeToPromise */])(result);\n    }\n    else if (result && typeof result[__WEBPACK_IMPORTED_MODULE_8__symbol_iterator__[\"a\" /* iterator */]] === 'function') {\n        return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__subscribeToIterable__[\"a\" /* subscribeToIterable */])(result);\n    }\n    else {\n        var value = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_7__isObject__[\"a\" /* isObject */])(result) ? 'an invalid object' : \"'\" + result + \"'\";\n        var msg = \"You provided \" + value + \" where a stream was expected.\"\n            + ' You can provide an Observable, Promise, Array, or Iterable.';\n        throw new TypeError(msg);\n    }\n};\n//# sourceMappingURL=subscribeTo.js.map\n\n\n/***/ }),\n/* 447 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return subscribeToArray; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nvar subscribeToArray = function (array) {\n    return function (subscriber) {\n        for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) {\n            subscriber.next(array[i]);\n        }\n        if (!subscriber.closed) {\n            subscriber.complete();\n        }\n    };\n};\n//# sourceMappingURL=subscribeToArray.js.map\n\n\n/***/ }),\n/* 448 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return subscribeToIterable; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__symbol_iterator__ = __webpack_require__(152);\n/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */\n\nvar subscribeToIterable = function (iterable) {\n    return function (subscriber) {\n        var iterator = iterable[__WEBPACK_IMPORTED_MODULE_0__symbol_iterator__[\"a\" /* iterator */]]();\n        do {\n            var item = iterator.next();\n            if (item.done) {\n                subscriber.complete();\n                break;\n            }\n            subscriber.next(item.value);\n            if (subscriber.closed) {\n                break;\n            }\n        } while (true);\n        if (typeof iterator.return === 'function') {\n            subscriber.add(function () {\n                if (iterator.return) {\n                    iterator.return();\n                }\n            });\n        }\n        return subscriber;\n    };\n};\n//# sourceMappingURL=subscribeToIterable.js.map\n\n\n/***/ }),\n/* 449 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return subscribeToObservable; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__symbol_observable__ = __webpack_require__(118);\n/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */\n\nvar subscribeToObservable = function (obj) {\n    return function (subscriber) {\n        var obs = obj[__WEBPACK_IMPORTED_MODULE_0__symbol_observable__[\"a\" /* observable */]]();\n        if (typeof obs.subscribe !== 'function') {\n            throw new TypeError('Provided object does not correctly implement Symbol.observable');\n        }\n        else {\n            return obs.subscribe(subscriber);\n        }\n    };\n};\n//# sourceMappingURL=subscribeToObservable.js.map\n\n\n/***/ }),\n/* 450 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return subscribeToPromise; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__hostReportError__ = __webpack_require__(324);\n/** PURE_IMPORTS_START _hostReportError PURE_IMPORTS_END */\n\nvar subscribeToPromise = function (promise) {\n    return function (subscriber) {\n        promise.then(function (value) {\n            if (!subscriber.closed) {\n                subscriber.next(value);\n                subscriber.complete();\n            }\n        }, function (err) { return subscriber.error(err); })\n            .then(null, __WEBPACK_IMPORTED_MODULE_0__hostReportError__[\"a\" /* hostReportError */]);\n        return subscriber;\n    };\n};\n//# sourceMappingURL=subscribeToPromise.js.map\n\n\n/***/ }),\n/* 451 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Note: since nyc uses this module to output coverage, any lines\n// that are in the direct sync flow of nyc's outputCoverage are\n// ignored, since we can never get coverage for them.\nvar assert = __webpack_require__(29)\nvar signals = __webpack_require__(933)\n\nvar EE = __webpack_require__(77)\n/* istanbul ignore if */\nif (typeof EE !== 'function') {\n  EE = EE.EventEmitter\n}\n\nvar emitter\nif (process.__signal_exit_emitter__) {\n  emitter = process.__signal_exit_emitter__\n} else {\n  emitter = process.__signal_exit_emitter__ = new EE()\n  emitter.count = 0\n  emitter.emitted = {}\n}\n\n// Because this emitter is a global, we have to check to see if a\n// previous version of this library failed to enable infinite listeners.\n// I know what you're about to say.  But literally everything about\n// signal-exit is a compromise with evil.  Get used to it.\nif (!emitter.infinite) {\n  emitter.setMaxListeners(Infinity)\n  emitter.infinite = true\n}\n\nmodule.exports = function (cb, opts) {\n  assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler')\n\n  if (loaded === false) {\n    load()\n  }\n\n  var ev = 'exit'\n  if (opts && opts.alwaysLast) {\n    ev = 'afterexit'\n  }\n\n  var remove = function () {\n    emitter.removeListener(ev, cb)\n    if (emitter.listeners('exit').length === 0 &&\n        emitter.listeners('afterexit').length === 0) {\n      unload()\n    }\n  }\n  emitter.on(ev, cb)\n\n  return remove\n}\n\nmodule.exports.unload = unload\nfunction unload () {\n  if (!loaded) {\n    return\n  }\n  loaded = false\n\n  signals.forEach(function (sig) {\n    try {\n      process.removeListener(sig, sigListeners[sig])\n    } catch (er) {}\n  })\n  process.emit = originalProcessEmit\n  process.reallyExit = originalProcessReallyExit\n  emitter.count -= 1\n}\n\nfunction emit (event, code, signal) {\n  if (emitter.emitted[event]) {\n    return\n  }\n  emitter.emitted[event] = true\n  emitter.emit(event, code, signal)\n}\n\n// { <signal>: <listener fn>, ... }\nvar sigListeners = {}\nsignals.forEach(function (sig) {\n  sigListeners[sig] = function listener () {\n    // If there are no other listeners, an exit is coming!\n    // Simplest way: remove us and then re-send the signal.\n    // We know that this will kill the process, so we can\n    // safely emit now.\n    var listeners = process.listeners(sig)\n    if (listeners.length === emitter.count) {\n      unload()\n      emit('exit', null, sig)\n      /* istanbul ignore next */\n      emit('afterexit', null, sig)\n      /* istanbul ignore next */\n      process.kill(process.pid, sig)\n    }\n  }\n})\n\nmodule.exports.signals = function () {\n  return signals\n}\n\nmodule.exports.load = load\n\nvar loaded = false\n\nfunction load () {\n  if (loaded) {\n    return\n  }\n  loaded = true\n\n  // This is the number of onSignalExit's that are in play.\n  // It's important so that we can count the correct number of\n  // listeners on signals, and don't wait for the other one to\n  // handle it instead of us.\n  emitter.count += 1\n\n  signals = signals.filter(function (sig) {\n    try {\n      process.on(sig, sigListeners[sig])\n      return true\n    } catch (er) {\n      return false\n    }\n  })\n\n  process.emit = processEmit\n  process.reallyExit = processReallyExit\n}\n\nvar originalProcessReallyExit = process.reallyExit\nfunction processReallyExit (code) {\n  process.exitCode = code || 0\n  emit('exit', process.exitCode, null)\n  /* istanbul ignore next */\n  emit('afterexit', process.exitCode, null)\n  /* istanbul ignore next */\n  originalProcessReallyExit.call(process, process.exitCode)\n}\n\nvar originalProcessEmit = process.emit\nfunction processEmit (ev, arg) {\n  if (ev === 'exit') {\n    if (arg !== undefined) {\n      process.exitCode = arg\n    }\n    var ret = originalProcessEmit.apply(this, arguments)\n    emit('exit', process.exitCode, null)\n    /* istanbul ignore next */\n    emit('afterexit', process.exitCode, null)\n    return ret\n  } else {\n    return originalProcessEmit.apply(this, arguments)\n  }\n}\n\n\n/***/ }),\n/* 452 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar scan = __webpack_require__(938)\nvar parse = __webpack_require__(937)\n\nmodule.exports = function (source) {\n  return parse(scan(source))\n}\n\n\n/***/ }),\n/* 453 */\n/***/ (function(module, exports) {\n\nmodule.exports = [\"0BSD\",\"AAL\",\"Abstyles\",\"Adobe-2006\",\"Adobe-Glyph\",\"ADSL\",\"AFL-1.1\",\"AFL-1.2\",\"AFL-2.0\",\"AFL-2.1\",\"AFL-3.0\",\"Afmparse\",\"AGPL-1.0\",\"AGPL-3.0-only\",\"AGPL-3.0-or-later\",\"Aladdin\",\"AMDPLPA\",\"AML\",\"AMPAS\",\"ANTLR-PD\",\"Apache-1.0\",\"Apache-1.1\",\"Apache-2.0\",\"APAFML\",\"APL-1.0\",\"APSL-1.0\",\"APSL-1.1\",\"APSL-1.2\",\"APSL-2.0\",\"Artistic-1.0-cl8\",\"Artistic-1.0-Perl\",\"Artistic-1.0\",\"Artistic-2.0\",\"Bahyph\",\"Barr\",\"Beerware\",\"BitTorrent-1.0\",\"BitTorrent-1.1\",\"Borceux\",\"BSD-1-Clause\",\"BSD-2-Clause-FreeBSD\",\"BSD-2-Clause-NetBSD\",\"BSD-2-Clause-Patent\",\"BSD-2-Clause\",\"BSD-3-Clause-Attribution\",\"BSD-3-Clause-Clear\",\"BSD-3-Clause-LBNL\",\"BSD-3-Clause-No-Nuclear-License-2014\",\"BSD-3-Clause-No-Nuclear-License\",\"BSD-3-Clause-No-Nuclear-Warranty\",\"BSD-3-Clause\",\"BSD-4-Clause-UC\",\"BSD-4-Clause\",\"BSD-Protection\",\"BSD-Source-Code\",\"BSL-1.0\",\"bzip2-1.0.5\",\"bzip2-1.0.6\",\"Caldera\",\"CATOSL-1.1\",\"CC-BY-1.0\",\"CC-BY-2.0\",\"CC-BY-2.5\",\"CC-BY-3.0\",\"CC-BY-4.0\",\"CC-BY-NC-1.0\",\"CC-BY-NC-2.0\",\"CC-BY-NC-2.5\",\"CC-BY-NC-3.0\",\"CC-BY-NC-4.0\",\"CC-BY-NC-ND-1.0\",\"CC-BY-NC-ND-2.0\",\"CC-BY-NC-ND-2.5\",\"CC-BY-NC-ND-3.0\",\"CC-BY-NC-ND-4.0\",\"CC-BY-NC-SA-1.0\",\"CC-BY-NC-SA-2.0\",\"CC-BY-NC-SA-2.5\",\"CC-BY-NC-SA-3.0\",\"CC-BY-NC-SA-4.0\",\"CC-BY-ND-1.0\",\"CC-BY-ND-2.0\",\"CC-BY-ND-2.5\",\"CC-BY-ND-3.0\",\"CC-BY-ND-4.0\",\"CC-BY-SA-1.0\",\"CC-BY-SA-2.0\",\"CC-BY-SA-2.5\",\"CC-BY-SA-3.0\",\"CC-BY-SA-4.0\",\"CC0-1.0\",\"CDDL-1.0\",\"CDDL-1.1\",\"CDLA-Permissive-1.0\",\"CDLA-Sharing-1.0\",\"CECILL-1.0\",\"CECILL-1.1\",\"CECILL-2.0\",\"CECILL-2.1\",\"CECILL-B\",\"CECILL-C\",\"ClArtistic\",\"CNRI-Jython\",\"CNRI-Python-GPL-Compatible\",\"CNRI-Python\",\"Condor-1.1\",\"CPAL-1.0\",\"CPL-1.0\",\"CPOL-1.02\",\"Crossword\",\"CrystalStacker\",\"CUA-OPL-1.0\",\"Cube\",\"curl\",\"D-FSL-1.0\",\"diffmark\",\"DOC\",\"Dotseqn\",\"DSDP\",\"dvipdfm\",\"ECL-1.0\",\"ECL-2.0\",\"EFL-1.0\",\"EFL-2.0\",\"eGenix\",\"Entessa\",\"EPL-1.0\",\"EPL-2.0\",\"ErlPL-1.1\",\"EUDatagrid\",\"EUPL-1.0\",\"EUPL-1.1\",\"EUPL-1.2\",\"Eurosym\",\"Fair\",\"Frameworx-1.0\",\"FreeImage\",\"FSFAP\",\"FSFUL\",\"FSFULLR\",\"FTL\",\"GFDL-1.1-only\",\"GFDL-1.1-or-later\",\"GFDL-1.2-only\",\"GFDL-1.2-or-later\",\"GFDL-1.3-only\",\"GFDL-1.3-or-later\",\"Giftware\",\"GL2PS\",\"Glide\",\"Glulxe\",\"gnuplot\",\"GPL-1.0-only\",\"GPL-1.0-or-later\",\"GPL-2.0-only\",\"GPL-2.0-or-later\",\"GPL-3.0-only\",\"GPL-3.0-or-later\",\"gSOAP-1.3b\",\"HaskellReport\",\"HPND\",\"IBM-pibs\",\"ICU\",\"IJG\",\"ImageMagick\",\"iMatix\",\"Imlib2\",\"Info-ZIP\",\"Intel-ACPI\",\"Intel\",\"Interbase-1.0\",\"IPA\",\"IPL-1.0\",\"ISC\",\"JasPer-2.0\",\"JSON\",\"LAL-1.2\",\"LAL-1.3\",\"Latex2e\",\"Leptonica\",\"LGPL-2.0-only\",\"LGPL-2.0-or-later\",\"LGPL-2.1-only\",\"LGPL-2.1-or-later\",\"LGPL-3.0-only\",\"LGPL-3.0-or-later\",\"LGPLLR\",\"Libpng\",\"libtiff\",\"LiLiQ-P-1.1\",\"LiLiQ-R-1.1\",\"LiLiQ-Rplus-1.1\",\"LPL-1.0\",\"LPL-1.02\",\"LPPL-1.0\",\"LPPL-1.1\",\"LPPL-1.2\",\"LPPL-1.3a\",\"LPPL-1.3c\",\"MakeIndex\",\"MirOS\",\"MIT-advertising\",\"MIT-CMU\",\"MIT-enna\",\"MIT-feh\",\"MIT\",\"MITNFA\",\"Motosoto\",\"mpich2\",\"MPL-1.0\",\"MPL-1.1\",\"MPL-2.0-no-copyleft-exception\",\"MPL-2.0\",\"MS-PL\",\"MS-RL\",\"MTLL\",\"Multics\",\"Mup\",\"NASA-1.3\",\"Naumen\",\"NBPL-1.0\",\"NCSA\",\"Net-SNMP\",\"NetCDF\",\"Newsletr\",\"NGPL\",\"NLOD-1.0\",\"NLPL\",\"Nokia\",\"NOSL\",\"Noweb\",\"NPL-1.0\",\"NPL-1.1\",\"NPOSL-3.0\",\"NRL\",\"NTP\",\"OCCT-PL\",\"OCLC-2.0\",\"ODbL-1.0\",\"OFL-1.0\",\"OFL-1.1\",\"OGTSL\",\"OLDAP-1.1\",\"OLDAP-1.2\",\"OLDAP-1.3\",\"OLDAP-1.4\",\"OLDAP-2.0.1\",\"OLDAP-2.0\",\"OLDAP-2.1\",\"OLDAP-2.2.1\",\"OLDAP-2.2.2\",\"OLDAP-2.2\",\"OLDAP-2.3\",\"OLDAP-2.4\",\"OLDAP-2.5\",\"OLDAP-2.6\",\"OLDAP-2.7\",\"OLDAP-2.8\",\"OML\",\"OpenSSL\",\"OPL-1.0\",\"OSET-PL-2.1\",\"OSL-1.0\",\"OSL-1.1\",\"OSL-2.0\",\"OSL-2.1\",\"OSL-3.0\",\"PDDL-1.0\",\"PHP-3.0\",\"PHP-3.01\",\"Plexus\",\"PostgreSQL\",\"psfrag\",\"psutils\",\"Python-2.0\",\"Qhull\",\"QPL-1.0\",\"Rdisc\",\"RHeCos-1.1\",\"RPL-1.1\",\"RPL-1.5\",\"RPSL-1.0\",\"RSA-MD\",\"RSCPL\",\"Ruby\",\"SAX-PD\",\"Saxpath\",\"SCEA\",\"Sendmail\",\"SGI-B-1.0\",\"SGI-B-1.1\",\"SGI-B-2.0\",\"SimPL-2.0\",\"SISSL-1.2\",\"SISSL\",\"Sleepycat\",\"SMLNJ\",\"SMPPL\",\"SNIA\",\"Spencer-86\",\"Spencer-94\",\"Spencer-99\",\"SPL-1.0\",\"SugarCRM-1.1.3\",\"SWL\",\"TCL\",\"TCP-wrappers\",\"TMate\",\"TORQUE-1.1\",\"TOSL\",\"Unicode-DFS-2015\",\"Unicode-DFS-2016\",\"Unicode-TOU\",\"Unlicense\",\"UPL-1.0\",\"Vim\",\"VOSTROM\",\"VSL-1.0\",\"W3C-19980720\",\"W3C-20150513\",\"W3C\",\"Watcom-1.0\",\"Wsuipa\",\"WTFPL\",\"X11\",\"Xerox\",\"XFree86-1.1\",\"xinetd\",\"Xnet\",\"xpp\",\"XSkat\",\"YPL-1.0\",\"YPL-1.1\",\"Zed\",\"Zend-2.0\",\"Zimbra-1.3\",\"Zimbra-1.4\",\"zlib-acknowledgement\",\"Zlib\",\"ZPL-1.1\",\"ZPL-2.0\",\"ZPL-2.1\"]\n\n/***/ }),\n/* 454 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nmodule.exports = {\n\tVerifier: Verifier,\n\tSigner: Signer\n};\n\nvar nacl;\nvar stream = __webpack_require__(23);\nvar util = __webpack_require__(3);\nvar assert = __webpack_require__(16);\nvar Buffer = __webpack_require__(15).Buffer;\nvar Signature = __webpack_require__(75);\n\nfunction Verifier(key, hashAlgo) {\n\tif (nacl === undefined)\n\t\tnacl = __webpack_require__(76);\n\n\tif (hashAlgo.toLowerCase() !== 'sha512')\n\t\tthrow (new Error('ED25519 only supports the use of ' +\n\t\t    'SHA-512 hashes'));\n\n\tthis.key = key;\n\tthis.chunks = [];\n\n\tstream.Writable.call(this, {});\n}\nutil.inherits(Verifier, stream.Writable);\n\nVerifier.prototype._write = function (chunk, enc, cb) {\n\tthis.chunks.push(chunk);\n\tcb();\n};\n\nVerifier.prototype.update = function (chunk) {\n\tif (typeof (chunk) === 'string')\n\t\tchunk = Buffer.from(chunk, 'binary');\n\tthis.chunks.push(chunk);\n};\n\nVerifier.prototype.verify = function (signature, fmt) {\n\tvar sig;\n\tif (Signature.isSignature(signature, [2, 0])) {\n\t\tif (signature.type !== 'ed25519')\n\t\t\treturn (false);\n\t\tsig = signature.toBuffer('raw');\n\n\t} else if (typeof (signature) === 'string') {\n\t\tsig = Buffer.from(signature, 'base64');\n\n\t} else if (Signature.isSignature(signature, [1, 0])) {\n\t\tthrow (new Error('signature was created by too old ' +\n\t\t    'a version of sshpk and cannot be verified'));\n\t}\n\n\tassert.buffer(sig);\n\treturn (nacl.sign.detached.verify(\n\t    new Uint8Array(Buffer.concat(this.chunks)),\n\t    new Uint8Array(sig),\n\t    new Uint8Array(this.key.part.A.data)));\n};\n\nfunction Signer(key, hashAlgo) {\n\tif (nacl === undefined)\n\t\tnacl = __webpack_require__(76);\n\n\tif (hashAlgo.toLowerCase() !== 'sha512')\n\t\tthrow (new Error('ED25519 only supports the use of ' +\n\t\t    'SHA-512 hashes'));\n\n\tthis.key = key;\n\tthis.chunks = [];\n\n\tstream.Writable.call(this, {});\n}\nutil.inherits(Signer, stream.Writable);\n\nSigner.prototype._write = function (chunk, enc, cb) {\n\tthis.chunks.push(chunk);\n\tcb();\n};\n\nSigner.prototype.update = function (chunk) {\n\tif (typeof (chunk) === 'string')\n\t\tchunk = Buffer.from(chunk, 'binary');\n\tthis.chunks.push(chunk);\n};\n\nSigner.prototype.sign = function () {\n\tvar sig = nacl.sign.detached(\n\t    new Uint8Array(Buffer.concat(this.chunks)),\n\t    new Uint8Array(Buffer.concat([\n\t\tthis.key.part.k.data, this.key.part.A.data])));\n\tvar sigBuf = Buffer.from(sig);\n\tvar sigObj = Signature.parse(sigBuf, 'ed25519', 'raw');\n\tsigObj.hashAlgorithm = 'sha512';\n\treturn (sigObj);\n};\n\n\n/***/ }),\n/* 455 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nmodule.exports = {\n\tread: read,\n\twrite: write\n};\n\nvar assert = __webpack_require__(16);\nvar Buffer = __webpack_require__(15).Buffer;\nvar utils = __webpack_require__(26);\nvar Key = __webpack_require__(28);\nvar PrivateKey = __webpack_require__(33);\n\nvar pem = __webpack_require__(86);\nvar ssh = __webpack_require__(456);\nvar rfc4253 = __webpack_require__(103);\nvar dnssec = __webpack_require__(327);\n\nvar DNSSEC_PRIVKEY_HEADER_PREFIX = 'Private-key-format: v1';\n\nfunction read(buf, options) {\n\tif (typeof (buf) === 'string') {\n\t\tif (buf.trim().match(/^[-]+[ ]*BEGIN/))\n\t\t\treturn (pem.read(buf, options));\n\t\tif (buf.match(/^\\s*ssh-[a-z]/))\n\t\t\treturn (ssh.read(buf, options));\n\t\tif (buf.match(/^\\s*ecdsa-/))\n\t\t\treturn (ssh.read(buf, options));\n\t\tif (findDNSSECHeader(buf))\n\t\t\treturn (dnssec.read(buf, options));\n\t\tbuf = Buffer.from(buf, 'binary');\n\t} else {\n\t\tassert.buffer(buf);\n\t\tif (findPEMHeader(buf))\n\t\t\treturn (pem.read(buf, options));\n\t\tif (findSSHHeader(buf))\n\t\t\treturn (ssh.read(buf, options));\n\t\tif (findDNSSECHeader(buf))\n\t\t\treturn (dnssec.read(buf, options));\n\t}\n\tif (buf.readUInt32BE(0) < buf.length)\n\t\treturn (rfc4253.read(buf, options));\n\tthrow (new Error('Failed to auto-detect format of key'));\n}\n\nfunction findSSHHeader(buf) {\n\tvar offset = 0;\n\twhile (offset < buf.length &&\n\t    (buf[offset] === 32 || buf[offset] === 10 || buf[offset] === 9))\n\t\t++offset;\n\tif (offset + 4 <= buf.length &&\n\t    buf.slice(offset, offset + 4).toString('ascii') === 'ssh-')\n\t\treturn (true);\n\tif (offset + 6 <= buf.length &&\n\t    buf.slice(offset, offset + 6).toString('ascii') === 'ecdsa-')\n\t\treturn (true);\n\treturn (false);\n}\n\nfunction findPEMHeader(buf) {\n\tvar offset = 0;\n\twhile (offset < buf.length &&\n\t    (buf[offset] === 32 || buf[offset] === 10))\n\t\t++offset;\n\tif (buf[offset] !== 45)\n\t\treturn (false);\n\twhile (offset < buf.length &&\n\t    (buf[offset] === 45))\n\t\t++offset;\n\twhile (offset < buf.length &&\n\t    (buf[offset] === 32))\n\t\t++offset;\n\tif (offset + 5 > buf.length ||\n\t    buf.slice(offset, offset + 5).toString('ascii') !== 'BEGIN')\n\t\treturn (false);\n\treturn (true);\n}\n\nfunction findDNSSECHeader(buf) {\n\t// private case first\n\tif (buf.length <= DNSSEC_PRIVKEY_HEADER_PREFIX.length)\n\t\treturn (false);\n\tvar headerCheck = buf.slice(0, DNSSEC_PRIVKEY_HEADER_PREFIX.length);\n\tif (headerCheck.toString('ascii') === DNSSEC_PRIVKEY_HEADER_PREFIX)\n\t\treturn (true);\n\n\t// public-key RFC3110 ?\n\t// 'domain.com. IN KEY ...' or 'domain.com. IN DNSKEY ...'\n\t// skip any comment-lines\n\tif (typeof (buf) !== 'string') {\n\t\tbuf = buf.toString('ascii');\n\t}\n\tvar lines = buf.split('\\n');\n\tvar line = 0;\n\t/* JSSTYLED */\n\twhile (lines[line].match(/^\\;/))\n\t\tline++;\n\tif (lines[line].toString('ascii').match(/\\. IN KEY /))\n\t\treturn (true);\n\tif (lines[line].toString('ascii').match(/\\. IN DNSKEY /))\n\t\treturn (true);\n\treturn (false);\n}\n\nfunction write(key, options) {\n\tthrow (new Error('\"auto\" format cannot be used for writing'));\n}\n\n\n/***/ }),\n/* 456 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nmodule.exports = {\n\tread: read,\n\twrite: write\n};\n\nvar assert = __webpack_require__(16);\nvar Buffer = __webpack_require__(15).Buffer;\nvar rfc4253 = __webpack_require__(103);\nvar utils = __webpack_require__(26);\nvar Key = __webpack_require__(28);\nvar PrivateKey = __webpack_require__(33);\n\nvar sshpriv = __webpack_require__(193);\n\n/*JSSTYLED*/\nvar SSHKEY_RE = /^([a-z0-9-]+)[ \\t]+([a-zA-Z0-9+\\/]+[=]*)([ \\t]+([^ \\t][^\\n]*[\\n]*)?)?$/;\n/*JSSTYLED*/\nvar SSHKEY_RE2 = /^([a-z0-9-]+)[ \\t\\n]+([a-zA-Z0-9+\\/][a-zA-Z0-9+\\/ \\t\\n=]*)([^a-zA-Z0-9+\\/ \\t\\n=].*)?$/;\n\nfunction read(buf, options) {\n\tif (typeof (buf) !== 'string') {\n\t\tassert.buffer(buf, 'buf');\n\t\tbuf = buf.toString('ascii');\n\t}\n\n\tvar trimmed = buf.trim().replace(/[\\\\\\r]/g, '');\n\tvar m = trimmed.match(SSHKEY_RE);\n\tif (!m)\n\t\tm = trimmed.match(SSHKEY_RE2);\n\tassert.ok(m, 'key must match regex');\n\n\tvar type = rfc4253.algToKeyType(m[1]);\n\tvar kbuf = Buffer.from(m[2], 'base64');\n\n\t/*\n\t * This is a bit tricky. If we managed to parse the key and locate the\n\t * key comment with the regex, then do a non-partial read and assert\n\t * that we have consumed all bytes. If we couldn't locate the key\n\t * comment, though, there may be whitespace shenanigans going on that\n\t * have conjoined the comment to the rest of the key. We do a partial\n\t * read in this case to try to make the best out of a sorry situation.\n\t */\n\tvar key;\n\tvar ret = {};\n\tif (m[4]) {\n\t\ttry {\n\t\t\tkey = rfc4253.read(kbuf);\n\n\t\t} catch (e) {\n\t\t\tm = trimmed.match(SSHKEY_RE2);\n\t\t\tassert.ok(m, 'key must match regex');\n\t\t\tkbuf = Buffer.from(m[2], 'base64');\n\t\t\tkey = rfc4253.readInternal(ret, 'public', kbuf);\n\t\t}\n\t} else {\n\t\tkey = rfc4253.readInternal(ret, 'public', kbuf);\n\t}\n\n\tassert.strictEqual(type, key.type);\n\n\tif (m[4] && m[4].length > 0) {\n\t\tkey.comment = m[4];\n\n\t} else if (ret.consumed) {\n\t\t/*\n\t\t * Now the magic: trying to recover the key comment when it's\n\t\t * gotten conjoined to the key or otherwise shenanigan'd.\n\t\t *\n\t\t * Work out how much base64 we used, then drop all non-base64\n\t\t * chars from the beginning up to this point in the the string.\n\t\t * Then offset in this and try to make up for missing = chars.\n\t\t */\n\t\tvar data = m[2] + (m[3] ? m[3] : '');\n\t\tvar realOffset = Math.ceil(ret.consumed / 3) * 4;\n\t\tdata = data.slice(0, realOffset - 2). /*JSSTYLED*/\n\t\t    replace(/[^a-zA-Z0-9+\\/=]/g, '') +\n\t\t    data.slice(realOffset - 2);\n\n\t\tvar padding = ret.consumed % 3;\n\t\tif (padding > 0 &&\n\t\t    data.slice(realOffset - 1, realOffset) !== '=')\n\t\t\trealOffset--;\n\t\twhile (data.slice(realOffset, realOffset + 1) === '=')\n\t\t\trealOffset++;\n\n\t\t/* Finally, grab what we think is the comment & clean it up. */\n\t\tvar trailer = data.slice(realOffset);\n\t\ttrailer = trailer.replace(/[\\r\\n]/g, ' ').\n\t\t    replace(/^\\s+/, '');\n\t\tif (trailer.match(/^[a-zA-Z0-9]/))\n\t\t\tkey.comment = trailer;\n\t}\n\n\treturn (key);\n}\n\nfunction write(key, options) {\n\tassert.object(key);\n\tif (!Key.isKey(key))\n\t\tthrow (new Error('Must be a public key'));\n\n\tvar parts = [];\n\tvar alg = rfc4253.keyTypeToAlg(key);\n\tparts.push(alg);\n\n\tvar buf = rfc4253.write(key);\n\tparts.push(buf.toString('base64'));\n\n\tif (key.comment)\n\t\tparts.push(key.comment);\n\n\treturn (Buffer.from(parts.join(' ')));\n}\n\n\n/***/ }),\n/* 457 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2017 Joyent, Inc.\n\nmodule.exports = {\n\tread: read,\n\tverify: verify,\n\tsign: sign,\n\tsignAsync: signAsync,\n\twrite: write\n};\n\nvar assert = __webpack_require__(16);\nvar asn1 = __webpack_require__(66);\nvar Buffer = __webpack_require__(15).Buffer;\nvar algs = __webpack_require__(32);\nvar utils = __webpack_require__(26);\nvar Key = __webpack_require__(28);\nvar PrivateKey = __webpack_require__(33);\nvar pem = __webpack_require__(86);\nvar Identity = __webpack_require__(159);\nvar Signature = __webpack_require__(75);\nvar Certificate = __webpack_require__(156);\nvar pkcs8 = __webpack_require__(158);\n\n/*\n * This file is based on RFC5280 (X.509).\n */\n\n/* Helper to read in a single mpint */\nfunction readMPInt(der, nm) {\n\tassert.strictEqual(der.peek(), asn1.Ber.Integer,\n\t    nm + ' is not an Integer');\n\treturn (utils.mpNormalize(der.readString(asn1.Ber.Integer, true)));\n}\n\nfunction verify(cert, key) {\n\tvar sig = cert.signatures.x509;\n\tassert.object(sig, 'x509 signature');\n\n\tvar algParts = sig.algo.split('-');\n\tif (algParts[0] !== key.type)\n\t\treturn (false);\n\n\tvar blob = sig.cache;\n\tif (blob === undefined) {\n\t\tvar der = new asn1.BerWriter();\n\t\twriteTBSCert(cert, der);\n\t\tblob = der.buffer;\n\t}\n\n\tvar verifier = key.createVerify(algParts[1]);\n\tverifier.write(blob);\n\treturn (verifier.verify(sig.signature));\n}\n\nfunction Local(i) {\n\treturn (asn1.Ber.Context | asn1.Ber.Constructor | i);\n}\n\nfunction Context(i) {\n\treturn (asn1.Ber.Context | i);\n}\n\nvar SIGN_ALGS = {\n\t'rsa-md5': '1.2.840.113549.1.1.4',\n\t'rsa-sha1': '1.2.840.113549.1.1.5',\n\t'rsa-sha256': '1.2.840.113549.1.1.11',\n\t'rsa-sha384': '1.2.840.113549.1.1.12',\n\t'rsa-sha512': '1.2.840.113549.1.1.13',\n\t'dsa-sha1': '1.2.840.10040.4.3',\n\t'dsa-sha256': '2.16.840.1.101.3.4.3.2',\n\t'ecdsa-sha1': '1.2.840.10045.4.1',\n\t'ecdsa-sha256': '1.2.840.10045.4.3.2',\n\t'ecdsa-sha384': '1.2.840.10045.4.3.3',\n\t'ecdsa-sha512': '1.2.840.10045.4.3.4',\n\t'ed25519-sha512': '1.3.101.112'\n};\nObject.keys(SIGN_ALGS).forEach(function (k) {\n\tSIGN_ALGS[SIGN_ALGS[k]] = k;\n});\nSIGN_ALGS['1.3.14.3.2.3'] = 'rsa-md5';\nSIGN_ALGS['1.3.14.3.2.29'] = 'rsa-sha1';\n\nvar EXTS = {\n\t'issuerKeyId': '2.5.29.35',\n\t'altName': '2.5.29.17',\n\t'basicConstraints': '2.5.29.19',\n\t'keyUsage': '2.5.29.15',\n\t'extKeyUsage': '2.5.29.37'\n};\n\nfunction read(buf, options) {\n\tif (typeof (buf) === 'string') {\n\t\tbuf = Buffer.from(buf, 'binary');\n\t}\n\tassert.buffer(buf, 'buf');\n\n\tvar der = new asn1.BerReader(buf);\n\n\tder.readSequence();\n\tif (Math.abs(der.length - der.remain) > 1) {\n\t\tthrow (new Error('DER sequence does not contain whole byte ' +\n\t\t    'stream'));\n\t}\n\n\tvar tbsStart = der.offset;\n\tder.readSequence();\n\tvar sigOffset = der.offset + der.length;\n\tvar tbsEnd = sigOffset;\n\n\tif (der.peek() === Local(0)) {\n\t\tder.readSequence(Local(0));\n\t\tvar version = der.readInt();\n\t\tassert.ok(version <= 3,\n\t\t    'only x.509 versions up to v3 supported');\n\t}\n\n\tvar cert = {};\n\tcert.signatures = {};\n\tvar sig = (cert.signatures.x509 = {});\n\tsig.extras = {};\n\n\tcert.serial = readMPInt(der, 'serial');\n\n\tder.readSequence();\n\tvar after = der.offset + der.length;\n\tvar certAlgOid = der.readOID();\n\tvar certAlg = SIGN_ALGS[certAlgOid];\n\tif (certAlg === undefined)\n\t\tthrow (new Error('unknown signature algorithm ' + certAlgOid));\n\n\tder._offset = after;\n\tcert.issuer = Identity.parseAsn1(der);\n\n\tder.readSequence();\n\tcert.validFrom = readDate(der);\n\tcert.validUntil = readDate(der);\n\n\tcert.subjects = [Identity.parseAsn1(der)];\n\n\tder.readSequence();\n\tafter = der.offset + der.length;\n\tcert.subjectKey = pkcs8.readPkcs8(undefined, 'public', der);\n\tder._offset = after;\n\n\t/* issuerUniqueID */\n\tif (der.peek() === Local(1)) {\n\t\tder.readSequence(Local(1));\n\t\tsig.extras.issuerUniqueID =\n\t\t    buf.slice(der.offset, der.offset + der.length);\n\t\tder._offset += der.length;\n\t}\n\n\t/* subjectUniqueID */\n\tif (der.peek() === Local(2)) {\n\t\tder.readSequence(Local(2));\n\t\tsig.extras.subjectUniqueID =\n\t\t    buf.slice(der.offset, der.offset + der.length);\n\t\tder._offset += der.length;\n\t}\n\n\t/* extensions */\n\tif (der.peek() === Local(3)) {\n\t\tder.readSequence(Local(3));\n\t\tvar extEnd = der.offset + der.length;\n\t\tder.readSequence();\n\n\t\twhile (der.offset < extEnd)\n\t\t\treadExtension(cert, buf, der);\n\n\t\tassert.strictEqual(der.offset, extEnd);\n\t}\n\n\tassert.strictEqual(der.offset, sigOffset);\n\n\tder.readSequence();\n\tafter = der.offset + der.length;\n\tvar sigAlgOid = der.readOID();\n\tvar sigAlg = SIGN_ALGS[sigAlgOid];\n\tif (sigAlg === undefined)\n\t\tthrow (new Error('unknown signature algorithm ' + sigAlgOid));\n\tder._offset = after;\n\n\tvar sigData = der.readString(asn1.Ber.BitString, true);\n\tif (sigData[0] === 0)\n\t\tsigData = sigData.slice(1);\n\tvar algParts = sigAlg.split('-');\n\n\tsig.signature = Signature.parse(sigData, algParts[0], 'asn1');\n\tsig.signature.hashAlgorithm = algParts[1];\n\tsig.algo = sigAlg;\n\tsig.cache = buf.slice(tbsStart, tbsEnd);\n\n\treturn (new Certificate(cert));\n}\n\nfunction readDate(der) {\n\tif (der.peek() === asn1.Ber.UTCTime) {\n\t\treturn (utcTimeToDate(der.readString(asn1.Ber.UTCTime)));\n\t} else if (der.peek() === asn1.Ber.GeneralizedTime) {\n\t\treturn (gTimeToDate(der.readString(asn1.Ber.GeneralizedTime)));\n\t} else {\n\t\tthrow (new Error('Unsupported date format'));\n\t}\n}\n\n/* RFC5280, section 4.2.1.6 (GeneralName type) */\nvar ALTNAME = {\n\tOtherName: Local(0),\n\tRFC822Name: Context(1),\n\tDNSName: Context(2),\n\tX400Address: Local(3),\n\tDirectoryName: Local(4),\n\tEDIPartyName: Local(5),\n\tURI: Context(6),\n\tIPAddress: Context(7),\n\tOID: Context(8)\n};\n\n/* RFC5280, section 4.2.1.12 (KeyPurposeId) */\nvar EXTPURPOSE = {\n\t'serverAuth': '1.3.6.1.5.5.7.3.1',\n\t'clientAuth': '1.3.6.1.5.5.7.3.2',\n\t'codeSigning': '1.3.6.1.5.5.7.3.3',\n\n\t/* See https://github.com/joyent/oid-docs/blob/master/root.md */\n\t'joyentDocker': '1.3.6.1.4.1.38678.1.4.1',\n\t'joyentCmon': '1.3.6.1.4.1.38678.1.4.2'\n};\nvar EXTPURPOSE_REV = {};\nObject.keys(EXTPURPOSE).forEach(function (k) {\n\tEXTPURPOSE_REV[EXTPURPOSE[k]] = k;\n});\n\nvar KEYUSEBITS = [\n\t'signature', 'identity', 'keyEncryption',\n\t'encryption', 'keyAgreement', 'ca', 'crl'\n];\n\nfunction readExtension(cert, buf, der) {\n\tder.readSequence();\n\tvar after = der.offset + der.length;\n\tvar extId = der.readOID();\n\tvar id;\n\tvar sig = cert.signatures.x509;\n\tsig.extras.exts = [];\n\n\tvar critical;\n\tif (der.peek() === asn1.Ber.Boolean)\n\t\tcritical = der.readBoolean();\n\n\tswitch (extId) {\n\tcase (EXTS.basicConstraints):\n\t\tder.readSequence(asn1.Ber.OctetString);\n\t\tder.readSequence();\n\t\tvar bcEnd = der.offset + der.length;\n\t\tvar ca = false;\n\t\tif (der.peek() === asn1.Ber.Boolean)\n\t\t\tca = der.readBoolean();\n\t\tif (cert.purposes === undefined)\n\t\t\tcert.purposes = [];\n\t\tif (ca === true)\n\t\t\tcert.purposes.push('ca');\n\t\tvar bc = { oid: extId, critical: critical };\n\t\tif (der.offset < bcEnd && der.peek() === asn1.Ber.Integer)\n\t\t\tbc.pathLen = der.readInt();\n\t\tsig.extras.exts.push(bc);\n\t\tbreak;\n\tcase (EXTS.extKeyUsage):\n\t\tder.readSequence(asn1.Ber.OctetString);\n\t\tder.readSequence();\n\t\tif (cert.purposes === undefined)\n\t\t\tcert.purposes = [];\n\t\tvar ekEnd = der.offset + der.length;\n\t\twhile (der.offset < ekEnd) {\n\t\t\tvar oid = der.readOID();\n\t\t\tcert.purposes.push(EXTPURPOSE_REV[oid] || oid);\n\t\t}\n\t\t/*\n\t\t * This is a bit of a hack: in the case where we have a cert\n\t\t * that's only allowed to do serverAuth or clientAuth (and not\n\t\t * the other), we want to make sure all our Subjects are of\n\t\t * the right type. But we already parsed our Subjects and\n\t\t * decided if they were hosts or users earlier (since it appears\n\t\t * first in the cert).\n\t\t *\n\t\t * So we go through and mutate them into the right kind here if\n\t\t * it doesn't match. This might not be hugely beneficial, as it\n\t\t * seems that single-purpose certs are not often seen in the\n\t\t * wild.\n\t\t */\n\t\tif (cert.purposes.indexOf('serverAuth') !== -1 &&\n\t\t    cert.purposes.indexOf('clientAuth') === -1) {\n\t\t\tcert.subjects.forEach(function (ide) {\n\t\t\t\tif (ide.type !== 'host') {\n\t\t\t\t\tide.type = 'host';\n\t\t\t\t\tide.hostname = ide.uid ||\n\t\t\t\t\t    ide.email ||\n\t\t\t\t\t    ide.components[0].value;\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (cert.purposes.indexOf('clientAuth') !== -1 &&\n\t\t    cert.purposes.indexOf('serverAuth') === -1) {\n\t\t\tcert.subjects.forEach(function (ide) {\n\t\t\t\tif (ide.type !== 'user') {\n\t\t\t\t\tide.type = 'user';\n\t\t\t\t\tide.uid = ide.hostname ||\n\t\t\t\t\t    ide.email ||\n\t\t\t\t\t    ide.components[0].value;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\tsig.extras.exts.push({ oid: extId, critical: critical });\n\t\tbreak;\n\tcase (EXTS.keyUsage):\n\t\tder.readSequence(asn1.Ber.OctetString);\n\t\tvar bits = der.readString(asn1.Ber.BitString, true);\n\t\tvar setBits = readBitField(bits, KEYUSEBITS);\n\t\tsetBits.forEach(function (bit) {\n\t\t\tif (cert.purposes === undefined)\n\t\t\t\tcert.purposes = [];\n\t\t\tif (cert.purposes.indexOf(bit) === -1)\n\t\t\t\tcert.purposes.push(bit);\n\t\t});\n\t\tsig.extras.exts.push({ oid: extId, critical: critical,\n\t\t    bits: bits });\n\t\tbreak;\n\tcase (EXTS.altName):\n\t\tder.readSequence(asn1.Ber.OctetString);\n\t\tder.readSequence();\n\t\tvar aeEnd = der.offset + der.length;\n\t\twhile (der.offset < aeEnd) {\n\t\t\tswitch (der.peek()) {\n\t\t\tcase ALTNAME.OtherName:\n\t\t\tcase ALTNAME.EDIPartyName:\n\t\t\t\tder.readSequence();\n\t\t\t\tder._offset += der.length;\n\t\t\t\tbreak;\n\t\t\tcase ALTNAME.OID:\n\t\t\t\tder.readOID(ALTNAME.OID);\n\t\t\t\tbreak;\n\t\t\tcase ALTNAME.RFC822Name:\n\t\t\t\t/* RFC822 specifies email addresses */\n\t\t\t\tvar email = der.readString(ALTNAME.RFC822Name);\n\t\t\t\tid = Identity.forEmail(email);\n\t\t\t\tif (!cert.subjects[0].equals(id))\n\t\t\t\t\tcert.subjects.push(id);\n\t\t\t\tbreak;\n\t\t\tcase ALTNAME.DirectoryName:\n\t\t\t\tder.readSequence(ALTNAME.DirectoryName);\n\t\t\t\tid = Identity.parseAsn1(der);\n\t\t\t\tif (!cert.subjects[0].equals(id))\n\t\t\t\t\tcert.subjects.push(id);\n\t\t\t\tbreak;\n\t\t\tcase ALTNAME.DNSName:\n\t\t\t\tvar host = der.readString(\n\t\t\t\t    ALTNAME.DNSName);\n\t\t\t\tid = Identity.forHost(host);\n\t\t\t\tif (!cert.subjects[0].equals(id))\n\t\t\t\t\tcert.subjects.push(id);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tder.readString(der.peek());\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tsig.extras.exts.push({ oid: extId, critical: critical });\n\t\tbreak;\n\tdefault:\n\t\tsig.extras.exts.push({\n\t\t\toid: extId,\n\t\t\tcritical: critical,\n\t\t\tdata: der.readString(asn1.Ber.OctetString, true)\n\t\t});\n\t\tbreak;\n\t}\n\n\tder._offset = after;\n}\n\nvar UTCTIME_RE =\n    /^([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/;\nfunction utcTimeToDate(t) {\n\tvar m = t.match(UTCTIME_RE);\n\tassert.ok(m, 'timestamps must be in UTC');\n\tvar d = new Date();\n\n\tvar thisYear = d.getUTCFullYear();\n\tvar century = Math.floor(thisYear / 100) * 100;\n\n\tvar year = parseInt(m[1], 10);\n\tif (thisYear % 100 < 50 && year >= 60)\n\t\tyear += (century - 1);\n\telse\n\t\tyear += century;\n\td.setUTCFullYear(year, parseInt(m[2], 10) - 1, parseInt(m[3], 10));\n\td.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10));\n\tif (m[6] && m[6].length > 0)\n\t\td.setUTCSeconds(parseInt(m[6], 10));\n\treturn (d);\n}\n\nvar GTIME_RE =\n    /^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})?Z$/;\nfunction gTimeToDate(t) {\n\tvar m = t.match(GTIME_RE);\n\tassert.ok(m);\n\tvar d = new Date();\n\n\td.setUTCFullYear(parseInt(m[1], 10), parseInt(m[2], 10) - 1,\n\t    parseInt(m[3], 10));\n\td.setUTCHours(parseInt(m[4], 10), parseInt(m[5], 10));\n\tif (m[6] && m[6].length > 0)\n\t\td.setUTCSeconds(parseInt(m[6], 10));\n\treturn (d);\n}\n\nfunction zeroPad(n) {\n\tvar s = '' + n;\n\twhile (s.length < 2)\n\t\ts = '0' + s;\n\treturn (s);\n}\n\nfunction dateToUTCTime(d) {\n\tvar s = '';\n\ts += zeroPad(d.getUTCFullYear() % 100);\n\ts += zeroPad(d.getUTCMonth() + 1);\n\ts += zeroPad(d.getUTCDate());\n\ts += zeroPad(d.getUTCHours());\n\ts += zeroPad(d.getUTCMinutes());\n\ts += zeroPad(d.getUTCSeconds());\n\ts += 'Z';\n\treturn (s);\n}\n\nfunction sign(cert, key) {\n\tif (cert.signatures.x509 === undefined)\n\t\tcert.signatures.x509 = {};\n\tvar sig = cert.signatures.x509;\n\n\tsig.algo = key.type + '-' + key.defaultHashAlgorithm();\n\tif (SIGN_ALGS[sig.algo] === undefined)\n\t\treturn (false);\n\n\tvar der = new asn1.BerWriter();\n\twriteTBSCert(cert, der);\n\tvar blob = der.buffer;\n\tsig.cache = blob;\n\n\tvar signer = key.createSign();\n\tsigner.write(blob);\n\tcert.signatures.x509.signature = signer.sign();\n\n\treturn (true);\n}\n\nfunction signAsync(cert, signer, done) {\n\tif (cert.signatures.x509 === undefined)\n\t\tcert.signatures.x509 = {};\n\tvar sig = cert.signatures.x509;\n\n\tvar der = new asn1.BerWriter();\n\twriteTBSCert(cert, der);\n\tvar blob = der.buffer;\n\tsig.cache = blob;\n\n\tsigner(blob, function (err, signature) {\n\t\tif (err) {\n\t\t\tdone(err);\n\t\t\treturn;\n\t\t}\n\t\tsig.algo = signature.type + '-' + signature.hashAlgorithm;\n\t\tif (SIGN_ALGS[sig.algo] === undefined) {\n\t\t\tdone(new Error('Invalid signing algorithm \"' +\n\t\t\t    sig.algo + '\"'));\n\t\t\treturn;\n\t\t}\n\t\tsig.signature = signature;\n\t\tdone();\n\t});\n}\n\nfunction write(cert, options) {\n\tvar sig = cert.signatures.x509;\n\tassert.object(sig, 'x509 signature');\n\n\tvar der = new asn1.BerWriter();\n\tder.startSequence();\n\tif (sig.cache) {\n\t\tder._ensure(sig.cache.length);\n\t\tsig.cache.copy(der._buf, der._offset);\n\t\tder._offset += sig.cache.length;\n\t} else {\n\t\twriteTBSCert(cert, der);\n\t}\n\n\tder.startSequence();\n\tder.writeOID(SIGN_ALGS[sig.algo]);\n\tif (sig.algo.match(/^rsa-/))\n\t\tder.writeNull();\n\tder.endSequence();\n\n\tvar sigData = sig.signature.toBuffer('asn1');\n\tvar data = Buffer.alloc(sigData.length + 1);\n\tdata[0] = 0;\n\tsigData.copy(data, 1);\n\tder.writeBuffer(data, asn1.Ber.BitString);\n\tder.endSequence();\n\n\treturn (der.buffer);\n}\n\nfunction writeTBSCert(cert, der) {\n\tvar sig = cert.signatures.x509;\n\tassert.object(sig, 'x509 signature');\n\n\tder.startSequence();\n\n\tder.startSequence(Local(0));\n\tder.writeInt(2);\n\tder.endSequence();\n\n\tder.writeBuffer(utils.mpNormalize(cert.serial), asn1.Ber.Integer);\n\n\tder.startSequence();\n\tder.writeOID(SIGN_ALGS[sig.algo]);\n\tif (sig.algo.match(/^rsa-/))\n\t\tder.writeNull();\n\tder.endSequence();\n\n\tcert.issuer.toAsn1(der);\n\n\tder.startSequence();\n\tder.writeString(dateToUTCTime(cert.validFrom), asn1.Ber.UTCTime);\n\tder.writeString(dateToUTCTime(cert.validUntil), asn1.Ber.UTCTime);\n\tder.endSequence();\n\n\tvar subject = cert.subjects[0];\n\tvar altNames = cert.subjects.slice(1);\n\tsubject.toAsn1(der);\n\n\tpkcs8.writePkcs8(der, cert.subjectKey);\n\n\tif (sig.extras && sig.extras.issuerUniqueID) {\n\t\tder.writeBuffer(sig.extras.issuerUniqueID, Local(1));\n\t}\n\n\tif (sig.extras && sig.extras.subjectUniqueID) {\n\t\tder.writeBuffer(sig.extras.subjectUniqueID, Local(2));\n\t}\n\n\tif (altNames.length > 0 || subject.type === 'host' ||\n\t    (cert.purposes !== undefined && cert.purposes.length > 0) ||\n\t    (sig.extras && sig.extras.exts)) {\n\t\tder.startSequence(Local(3));\n\t\tder.startSequence();\n\n\t\tvar exts = [];\n\t\tif (cert.purposes !== undefined && cert.purposes.length > 0) {\n\t\t\texts.push({\n\t\t\t\toid: EXTS.basicConstraints,\n\t\t\t\tcritical: true\n\t\t\t});\n\t\t\texts.push({\n\t\t\t\toid: EXTS.keyUsage,\n\t\t\t\tcritical: true\n\t\t\t});\n\t\t\texts.push({\n\t\t\t\toid: EXTS.extKeyUsage,\n\t\t\t\tcritical: true\n\t\t\t});\n\t\t}\n\t\texts.push({ oid: EXTS.altName });\n\t\tif (sig.extras && sig.extras.exts)\n\t\t\texts = sig.extras.exts;\n\n\t\tfor (var i = 0; i < exts.length; ++i) {\n\t\t\tder.startSequence();\n\t\t\tder.writeOID(exts[i].oid);\n\n\t\t\tif (exts[i].critical !== undefined)\n\t\t\t\tder.writeBoolean(exts[i].critical);\n\n\t\t\tif (exts[i].oid === EXTS.altName) {\n\t\t\t\tder.startSequence(asn1.Ber.OctetString);\n\t\t\t\tder.startSequence();\n\t\t\t\tif (subject.type === 'host') {\n\t\t\t\t\tder.writeString(subject.hostname,\n\t\t\t\t\t    Context(2));\n\t\t\t\t}\n\t\t\t\tfor (var j = 0; j < altNames.length; ++j) {\n\t\t\t\t\tif (altNames[j].type === 'host') {\n\t\t\t\t\t\tder.writeString(\n\t\t\t\t\t\t    altNames[j].hostname,\n\t\t\t\t\t\t    ALTNAME.DNSName);\n\t\t\t\t\t} else if (altNames[j].type ===\n\t\t\t\t\t    'email') {\n\t\t\t\t\t\tder.writeString(\n\t\t\t\t\t\t    altNames[j].email,\n\t\t\t\t\t\t    ALTNAME.RFC822Name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Encode anything else as a\n\t\t\t\t\t\t * DN style name for now.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tder.startSequence(\n\t\t\t\t\t\t    ALTNAME.DirectoryName);\n\t\t\t\t\t\taltNames[j].toAsn1(der);\n\t\t\t\t\t\tder.endSequence();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tder.endSequence();\n\t\t\t\tder.endSequence();\n\t\t\t} else if (exts[i].oid === EXTS.basicConstraints) {\n\t\t\t\tder.startSequence(asn1.Ber.OctetString);\n\t\t\t\tder.startSequence();\n\t\t\t\tvar ca = (cert.purposes.indexOf('ca') !== -1);\n\t\t\t\tvar pathLen = exts[i].pathLen;\n\t\t\t\tder.writeBoolean(ca);\n\t\t\t\tif (pathLen !== undefined)\n\t\t\t\t\tder.writeInt(pathLen);\n\t\t\t\tder.endSequence();\n\t\t\t\tder.endSequence();\n\t\t\t} else if (exts[i].oid === EXTS.extKeyUsage) {\n\t\t\t\tder.startSequence(asn1.Ber.OctetString);\n\t\t\t\tder.startSequence();\n\t\t\t\tcert.purposes.forEach(function (purpose) {\n\t\t\t\t\tif (purpose === 'ca')\n\t\t\t\t\t\treturn;\n\t\t\t\t\tif (KEYUSEBITS.indexOf(purpose) !== -1)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tvar oid = purpose;\n\t\t\t\t\tif (EXTPURPOSE[purpose] !== undefined)\n\t\t\t\t\t\toid = EXTPURPOSE[purpose];\n\t\t\t\t\tder.writeOID(oid);\n\t\t\t\t});\n\t\t\t\tder.endSequence();\n\t\t\t\tder.endSequence();\n\t\t\t} else if (exts[i].oid === EXTS.keyUsage) {\n\t\t\t\tder.startSequence(asn1.Ber.OctetString);\n\t\t\t\t/*\n\t\t\t\t * If we parsed this certificate from a byte\n\t\t\t\t * stream (i.e. we didn't generate it in sshpk)\n\t\t\t\t * then we'll have a \".bits\" property on the\n\t\t\t\t * ext with the original raw byte contents.\n\t\t\t\t *\n\t\t\t\t * If we have this, use it here instead of\n\t\t\t\t * regenerating it. This guarantees we output\n\t\t\t\t * the same data we parsed, so signatures still\n\t\t\t\t * validate.\n\t\t\t\t */\n\t\t\t\tif (exts[i].bits !== undefined) {\n\t\t\t\t\tder.writeBuffer(exts[i].bits,\n\t\t\t\t\t    asn1.Ber.BitString);\n\t\t\t\t} else {\n\t\t\t\t\tvar bits = writeBitField(cert.purposes,\n\t\t\t\t\t    KEYUSEBITS);\n\t\t\t\t\tder.writeBuffer(bits,\n\t\t\t\t\t    asn1.Ber.BitString);\n\t\t\t\t}\n\t\t\t\tder.endSequence();\n\t\t\t} else {\n\t\t\t\tder.writeBuffer(exts[i].data,\n\t\t\t\t    asn1.Ber.OctetString);\n\t\t\t}\n\n\t\t\tder.endSequence();\n\t\t}\n\n\t\tder.endSequence();\n\t\tder.endSequence();\n\t}\n\n\tder.endSequence();\n}\n\n/*\n * Reads an ASN.1 BER bitfield out of the Buffer produced by doing\n * `BerReader#readString(asn1.Ber.BitString)`. That function gives us the raw\n * contents of the BitString tag, which is a count of unused bits followed by\n * the bits as a right-padded byte string.\n *\n * `bits` is the Buffer, `bitIndex` should contain an array of string names\n * for the bits in the string, ordered starting with bit #0 in the ASN.1 spec.\n *\n * Returns an array of Strings, the names of the bits that were set to 1.\n */\nfunction readBitField(bits, bitIndex) {\n\tvar bitLen = 8 * (bits.length - 1) - bits[0];\n\tvar setBits = {};\n\tfor (var i = 0; i < bitLen; ++i) {\n\t\tvar byteN = 1 + Math.floor(i / 8);\n\t\tvar bit = 7 - (i % 8);\n\t\tvar mask = 1 << bit;\n\t\tvar bitVal = ((bits[byteN] & mask) !== 0);\n\t\tvar name = bitIndex[i];\n\t\tif (bitVal && typeof (name) === 'string') {\n\t\t\tsetBits[name] = true;\n\t\t}\n\t}\n\treturn (Object.keys(setBits));\n}\n\n/*\n * `setBits` is an array of strings, containing the names for each bit that\n * sould be set to 1. `bitIndex` is same as in `readBitField()`.\n *\n * Returns a Buffer, ready to be written out with `BerWriter#writeString()`.\n */\nfunction writeBitField(setBits, bitIndex) {\n\tvar bitLen = bitIndex.length;\n\tvar blen = Math.ceil(bitLen / 8);\n\tvar unused = blen * 8 - bitLen;\n\tvar bits = Buffer.alloc(1 + blen); // zero-filled\n\tbits[0] = unused;\n\tfor (var i = 0; i < bitLen; ++i) {\n\t\tvar byteN = 1 + Math.floor(i / 8);\n\t\tvar bit = 7 - (i % 8);\n\t\tvar mask = 1 << bit;\n\t\tvar name = bitIndex[i];\n\t\tif (name === undefined)\n\t\t\tcontinue;\n\t\tvar bitVal = (setBits.indexOf(name) !== -1);\n\t\tif (bitVal) {\n\t\t\tbits[byteN] |= mask;\n\t\t}\n\t}\n\treturn (bits);\n}\n\n\n/***/ }),\n/* 458 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n\n\n/*<replacement>*/\n\nvar Buffer = __webpack_require__(46).Buffer;\n/*</replacement>*/\n\nvar isEncoding = Buffer.isEncoding || function (encoding) {\n  encoding = '' + encoding;\n  switch (encoding && encoding.toLowerCase()) {\n    case 'hex':case 'utf8':case 'utf-8':case 'ascii':case 'binary':case 'base64':case 'ucs2':case 'ucs-2':case 'utf16le':case 'utf-16le':case 'raw':\n      return true;\n    default:\n      return false;\n  }\n};\n\nfunction _normalizeEncoding(enc) {\n  if (!enc) return 'utf8';\n  var retried;\n  while (true) {\n    switch (enc) {\n      case 'utf8':\n      case 'utf-8':\n        return 'utf8';\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return 'utf16le';\n      case 'latin1':\n      case 'binary':\n        return 'latin1';\n      case 'base64':\n      case 'ascii':\n      case 'hex':\n        return enc;\n      default:\n        if (retried) return; // undefined\n        enc = ('' + enc).toLowerCase();\n        retried = true;\n    }\n  }\n};\n\n// Do not cache `Buffer.isEncoding` when checking encoding names as some\n// modules monkey-patch it to support additional encodings\nfunction normalizeEncoding(enc) {\n  var nenc = _normalizeEncoding(enc);\n  if (typeof nenc !== 'string' && (Buffer.isEncoding === isEncoding || !isEncoding(enc))) throw new Error('Unknown encoding: ' + enc);\n  return nenc || enc;\n}\n\n// StringDecoder provides an interface for efficiently splitting a series of\n// buffers into a series of JS strings without breaking apart multi-byte\n// characters.\nexports.StringDecoder = StringDecoder;\nfunction StringDecoder(encoding) {\n  this.encoding = normalizeEncoding(encoding);\n  var nb;\n  switch (this.encoding) {\n    case 'utf16le':\n      this.text = utf16Text;\n      this.end = utf16End;\n      nb = 4;\n      break;\n    case 'utf8':\n      this.fillLast = utf8FillLast;\n      nb = 4;\n      break;\n    case 'base64':\n      this.text = base64Text;\n      this.end = base64End;\n      nb = 3;\n      break;\n    default:\n      this.write = simpleWrite;\n      this.end = simpleEnd;\n      return;\n  }\n  this.lastNeed = 0;\n  this.lastTotal = 0;\n  this.lastChar = Buffer.allocUnsafe(nb);\n}\n\nStringDecoder.prototype.write = function (buf) {\n  if (buf.length === 0) return '';\n  var r;\n  var i;\n  if (this.lastNeed) {\n    r = this.fillLast(buf);\n    if (r === undefined) return '';\n    i = this.lastNeed;\n    this.lastNeed = 0;\n  } else {\n    i = 0;\n  }\n  if (i < buf.length) return r ? r + this.text(buf, i) : this.text(buf, i);\n  return r || '';\n};\n\nStringDecoder.prototype.end = utf8End;\n\n// Returns only complete characters in a Buffer\nStringDecoder.prototype.text = utf8Text;\n\n// Attempts to complete a partial non-UTF-8 character using bytes from a Buffer\nStringDecoder.prototype.fillLast = function (buf) {\n  if (this.lastNeed <= buf.length) {\n    buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, this.lastNeed);\n    return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n  }\n  buf.copy(this.lastChar, this.lastTotal - this.lastNeed, 0, buf.length);\n  this.lastNeed -= buf.length;\n};\n\n// Checks the type of a UTF-8 byte, whether it's ASCII, a leading byte, or a\n// continuation byte. If an invalid byte is detected, -2 is returned.\nfunction utf8CheckByte(byte) {\n  if (byte <= 0x7F) return 0;else if (byte >> 5 === 0x06) return 2;else if (byte >> 4 === 0x0E) return 3;else if (byte >> 3 === 0x1E) return 4;\n  return byte >> 6 === 0x02 ? -1 : -2;\n}\n\n// Checks at most 3 bytes at the end of a Buffer in order to detect an\n// incomplete multi-byte UTF-8 character. The total number of bytes (2, 3, or 4)\n// needed to complete the UTF-8 character (if applicable) are returned.\nfunction utf8CheckIncomplete(self, buf, i) {\n  var j = buf.length - 1;\n  if (j < i) return 0;\n  var nb = utf8CheckByte(buf[j]);\n  if (nb >= 0) {\n    if (nb > 0) self.lastNeed = nb - 1;\n    return nb;\n  }\n  if (--j < i || nb === -2) return 0;\n  nb = utf8CheckByte(buf[j]);\n  if (nb >= 0) {\n    if (nb > 0) self.lastNeed = nb - 2;\n    return nb;\n  }\n  if (--j < i || nb === -2) return 0;\n  nb = utf8CheckByte(buf[j]);\n  if (nb >= 0) {\n    if (nb > 0) {\n      if (nb === 2) nb = 0;else self.lastNeed = nb - 3;\n    }\n    return nb;\n  }\n  return 0;\n}\n\n// Validates as many continuation bytes for a multi-byte UTF-8 character as\n// needed or are available. If we see a non-continuation byte where we expect\n// one, we \"replace\" the validated continuation bytes we've seen so far with\n// a single UTF-8 replacement character ('\\ufffd'), to match v8's UTF-8 decoding\n// behavior. The continuation byte check is included three times in the case\n// where all of the continuation bytes for a character exist in the same buffer.\n// It is also done this way as a slight performance increase instead of using a\n// loop.\nfunction utf8CheckExtraBytes(self, buf, p) {\n  if ((buf[0] & 0xC0) !== 0x80) {\n    self.lastNeed = 0;\n    return '\\ufffd';\n  }\n  if (self.lastNeed > 1 && buf.length > 1) {\n    if ((buf[1] & 0xC0) !== 0x80) {\n      self.lastNeed = 1;\n      return '\\ufffd';\n    }\n    if (self.lastNeed > 2 && buf.length > 2) {\n      if ((buf[2] & 0xC0) !== 0x80) {\n        self.lastNeed = 2;\n        return '\\ufffd';\n      }\n    }\n  }\n}\n\n// Attempts to complete a multi-byte UTF-8 character using bytes from a Buffer.\nfunction utf8FillLast(buf) {\n  var p = this.lastTotal - this.lastNeed;\n  var r = utf8CheckExtraBytes(this, buf, p);\n  if (r !== undefined) return r;\n  if (this.lastNeed <= buf.length) {\n    buf.copy(this.lastChar, p, 0, this.lastNeed);\n    return this.lastChar.toString(this.encoding, 0, this.lastTotal);\n  }\n  buf.copy(this.lastChar, p, 0, buf.length);\n  this.lastNeed -= buf.length;\n}\n\n// Returns all complete UTF-8 characters in a Buffer. If the Buffer ended on a\n// partial character, the character's bytes are buffered until the required\n// number of bytes are available.\nfunction utf8Text(buf, i) {\n  var total = utf8CheckIncomplete(this, buf, i);\n  if (!this.lastNeed) return buf.toString('utf8', i);\n  this.lastTotal = total;\n  var end = buf.length - (total - this.lastNeed);\n  buf.copy(this.lastChar, 0, end);\n  return buf.toString('utf8', i, end);\n}\n\n// For UTF-8, a replacement character is added when ending on a partial\n// character.\nfunction utf8End(buf) {\n  var r = buf && buf.length ? this.write(buf) : '';\n  if (this.lastNeed) return r + '\\ufffd';\n  return r;\n}\n\n// UTF-16LE typically needs two bytes per character, but even if we have an even\n// number of bytes available, we need to check if we end on a leading/high\n// surrogate. In that case, we need to wait for the next two bytes in order to\n// decode the last character properly.\nfunction utf16Text(buf, i) {\n  if ((buf.length - i) % 2 === 0) {\n    var r = buf.toString('utf16le', i);\n    if (r) {\n      var c = r.charCodeAt(r.length - 1);\n      if (c >= 0xD800 && c <= 0xDBFF) {\n        this.lastNeed = 2;\n        this.lastTotal = 4;\n        this.lastChar[0] = buf[buf.length - 2];\n        this.lastChar[1] = buf[buf.length - 1];\n        return r.slice(0, -1);\n      }\n    }\n    return r;\n  }\n  this.lastNeed = 1;\n  this.lastTotal = 2;\n  this.lastChar[0] = buf[buf.length - 1];\n  return buf.toString('utf16le', i, buf.length - 1);\n}\n\n// For UTF-16LE we do not explicitly append special replacement characters if we\n// end on a partial character, we simply let v8 handle that.\nfunction utf16End(buf) {\n  var r = buf && buf.length ? this.write(buf) : '';\n  if (this.lastNeed) {\n    var end = this.lastTotal - this.lastNeed;\n    return r + this.lastChar.toString('utf16le', 0, end);\n  }\n  return r;\n}\n\nfunction base64Text(buf, i) {\n  var n = (buf.length - i) % 3;\n  if (n === 0) return buf.toString('base64', i);\n  this.lastNeed = 3 - n;\n  this.lastTotal = 3;\n  if (n === 1) {\n    this.lastChar[0] = buf[buf.length - 1];\n  } else {\n    this.lastChar[0] = buf[buf.length - 2];\n    this.lastChar[1] = buf[buf.length - 1];\n  }\n  return buf.toString('base64', i, buf.length - n);\n}\n\nfunction base64End(buf) {\n  var r = buf && buf.length ? this.write(buf) : '';\n  if (this.lastNeed) return r + this.lastChar.toString('base64', 0, 3 - this.lastNeed);\n  return r;\n}\n\n// Pass bytes on through for single-byte encodings (e.g. ascii, latin1, hex)\nfunction simpleWrite(buf) {\n  return buf.toString(this.encoding);\n}\n\nfunction simpleEnd(buf) {\n  return buf && buf.length ? this.write(buf) : '';\n}\n\n/***/ }),\n/* 459 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar toBuffer = __webpack_require__(462)\nvar alloc = __webpack_require__(374)\n\nvar ZEROS = '0000000000000000000'\nvar SEVENS = '7777777777777777777'\nvar ZERO_OFFSET = '0'.charCodeAt(0)\nvar USTAR = 'ustar\\x0000'\nvar MASK = parseInt('7777', 8)\n\nvar clamp = function (index, len, defaultValue) {\n  if (typeof index !== 'number') return defaultValue\n  index = ~~index // Coerce to integer.\n  if (index >= len) return len\n  if (index >= 0) return index\n  index += len\n  if (index >= 0) return index\n  return 0\n}\n\nvar toType = function (flag) {\n  switch (flag) {\n    case 0:\n      return 'file'\n    case 1:\n      return 'link'\n    case 2:\n      return 'symlink'\n    case 3:\n      return 'character-device'\n    case 4:\n      return 'block-device'\n    case 5:\n      return 'directory'\n    case 6:\n      return 'fifo'\n    case 7:\n      return 'contiguous-file'\n    case 72:\n      return 'pax-header'\n    case 55:\n      return 'pax-global-header'\n    case 27:\n      return 'gnu-long-link-path'\n    case 28:\n    case 30:\n      return 'gnu-long-path'\n  }\n\n  return null\n}\n\nvar toTypeflag = function (flag) {\n  switch (flag) {\n    case 'file':\n      return 0\n    case 'link':\n      return 1\n    case 'symlink':\n      return 2\n    case 'character-device':\n      return 3\n    case 'block-device':\n      return 4\n    case 'directory':\n      return 5\n    case 'fifo':\n      return 6\n    case 'contiguous-file':\n      return 7\n    case 'pax-header':\n      return 72\n  }\n\n  return 0\n}\n\nvar indexOf = function (block, num, offset, end) {\n  for (; offset < end; offset++) {\n    if (block[offset] === num) return offset\n  }\n  return end\n}\n\nvar cksum = function (block) {\n  var sum = 8 * 32\n  for (var i = 0; i < 148; i++) sum += block[i]\n  for (var j = 156; j < 512; j++) sum += block[j]\n  return sum\n}\n\nvar encodeOct = function (val, n) {\n  val = val.toString(8)\n  if (val.length > n) return SEVENS.slice(0, n) + ' '\n  else return ZEROS.slice(0, n - val.length) + val + ' '\n}\n\n/* Copied from the node-tar repo and modified to meet\n * tar-stream coding standard.\n *\n * Source: https://github.com/npm/node-tar/blob/51b6627a1f357d2eb433e7378e5f05e83b7aa6cd/lib/header.js#L349\n */\nfunction parse256 (buf) {\n  // first byte MUST be either 80 or FF\n  // 80 for positive, FF for 2's comp\n  var positive\n  if (buf[0] === 0x80) positive = true\n  else if (buf[0] === 0xFF) positive = false\n  else return null\n\n  // build up a base-256 tuple from the least sig to the highest\n  var zero = false\n  var tuple = []\n  for (var i = buf.length - 1; i > 0; i--) {\n    var byte = buf[i]\n    if (positive) tuple.push(byte)\n    else if (zero && byte === 0) tuple.push(0)\n    else if (zero) {\n      zero = false\n      tuple.push(0x100 - byte)\n    } else tuple.push(0xFF - byte)\n  }\n\n  var sum = 0\n  var l = tuple.length\n  for (i = 0; i < l; i++) {\n    sum += tuple[i] * Math.pow(256, i)\n  }\n\n  return positive ? sum : -1 * sum\n}\n\nvar decodeOct = function (val, offset, length) {\n  val = val.slice(offset, offset + length)\n  offset = 0\n\n  // If prefixed with 0x80 then parse as a base-256 integer\n  if (val[offset] & 0x80) {\n    return parse256(val)\n  } else {\n    // Older versions of tar can prefix with spaces\n    while (offset < val.length && val[offset] === 32) offset++\n    var end = clamp(indexOf(val, 32, offset, val.length), val.length, val.length)\n    while (offset < end && val[offset] === 0) offset++\n    if (end === offset) return 0\n    return parseInt(val.slice(offset, end).toString(), 8)\n  }\n}\n\nvar decodeStr = function (val, offset, length, encoding) {\n  return val.slice(offset, indexOf(val, 0, offset, offset + length)).toString(encoding)\n}\n\nvar addLength = function (str) {\n  var len = Buffer.byteLength(str)\n  var digits = Math.floor(Math.log(len) / Math.log(10)) + 1\n  if (len + digits >= Math.pow(10, digits)) digits++\n\n  return (len + digits) + str\n}\n\nexports.decodeLongPath = function (buf, encoding) {\n  return decodeStr(buf, 0, buf.length, encoding)\n}\n\nexports.encodePax = function (opts) { // TODO: encode more stuff in pax\n  var result = ''\n  if (opts.name) result += addLength(' path=' + opts.name + '\\n')\n  if (opts.linkname) result += addLength(' linkpath=' + opts.linkname + '\\n')\n  var pax = opts.pax\n  if (pax) {\n    for (var key in pax) {\n      result += addLength(' ' + key + '=' + pax[key] + '\\n')\n    }\n  }\n  return toBuffer(result)\n}\n\nexports.decodePax = function (buf) {\n  var result = {}\n\n  while (buf.length) {\n    var i = 0\n    while (i < buf.length && buf[i] !== 32) i++\n    var len = parseInt(buf.slice(0, i).toString(), 10)\n    if (!len) return result\n\n    var b = buf.slice(i + 1, len - 1).toString()\n    var keyIndex = b.indexOf('=')\n    if (keyIndex === -1) return result\n    result[b.slice(0, keyIndex)] = b.slice(keyIndex + 1)\n\n    buf = buf.slice(len)\n  }\n\n  return result\n}\n\nexports.encode = function (opts) {\n  var buf = alloc(512)\n  var name = opts.name\n  var prefix = ''\n\n  if (opts.typeflag === 5 && name[name.length - 1] !== '/') name += '/'\n  if (Buffer.byteLength(name) !== name.length) return null // utf-8\n\n  while (Buffer.byteLength(name) > 100) {\n    var i = name.indexOf('/')\n    if (i === -1) return null\n    prefix += prefix ? '/' + name.slice(0, i) : name.slice(0, i)\n    name = name.slice(i + 1)\n  }\n\n  if (Buffer.byteLength(name) > 100 || Buffer.byteLength(prefix) > 155) return null\n  if (opts.linkname && Buffer.byteLength(opts.linkname) > 100) return null\n\n  buf.write(name)\n  buf.write(encodeOct(opts.mode & MASK, 6), 100)\n  buf.write(encodeOct(opts.uid, 6), 108)\n  buf.write(encodeOct(opts.gid, 6), 116)\n  buf.write(encodeOct(opts.size, 11), 124)\n  buf.write(encodeOct((opts.mtime.getTime() / 1000) | 0, 11), 136)\n\n  buf[156] = ZERO_OFFSET + toTypeflag(opts.type)\n\n  if (opts.linkname) buf.write(opts.linkname, 157)\n\n  buf.write(USTAR, 257)\n  if (opts.uname) buf.write(opts.uname, 265)\n  if (opts.gname) buf.write(opts.gname, 297)\n  buf.write(encodeOct(opts.devmajor || 0, 6), 329)\n  buf.write(encodeOct(opts.devminor || 0, 6), 337)\n\n  if (prefix) buf.write(prefix, 345)\n\n  buf.write(encodeOct(cksum(buf), 6), 148)\n\n  return buf\n}\n\nexports.decode = function (buf, filenameEncoding) {\n  var typeflag = buf[156] === 0 ? 0 : buf[156] - ZERO_OFFSET\n\n  var name = decodeStr(buf, 0, 100, filenameEncoding)\n  var mode = decodeOct(buf, 100, 8)\n  var uid = decodeOct(buf, 108, 8)\n  var gid = decodeOct(buf, 116, 8)\n  var size = decodeOct(buf, 124, 12)\n  var mtime = decodeOct(buf, 136, 12)\n  var type = toType(typeflag)\n  var linkname = buf[157] === 0 ? null : decodeStr(buf, 157, 100, filenameEncoding)\n  var uname = decodeStr(buf, 265, 32)\n  var gname = decodeStr(buf, 297, 32)\n  var devmajor = decodeOct(buf, 329, 8)\n  var devminor = decodeOct(buf, 337, 8)\n\n  if (buf[345]) name = decodeStr(buf, 345, 155, filenameEncoding) + '/' + name\n\n  // to support old tar versions that use trailing / to indicate dirs\n  if (typeflag === 0 && name && name[name.length - 1] === '/') typeflag = 5\n\n  var c = cksum(buf)\n\n  // checksum is still initial value if header was null.\n  if (c === 8 * 32) return null\n\n  // valid checksum\n  if (c !== decodeOct(buf, 148, 8)) throw new Error('Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?')\n\n  return {\n    name: name,\n    mode: mode,\n    uid: uid,\n    gid: gid,\n    size: size,\n    mtime: new Date(1000 * mtime),\n    type: type,\n    linkname: linkname,\n    uname: uname,\n    gname: gname,\n    devmajor: devmajor,\n    devminor: devminor\n  }\n}\n\n\n/***/ }),\n/* 460 */\n/***/ (function(module, exports, __webpack_require__) {\n\nexports.extract = __webpack_require__(949)\nexports.pack = __webpack_require__(950)\n\n\n/***/ }),\n/* 461 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Transform = __webpack_require__(794)\n  , inherits  = __webpack_require__(3).inherits\n  , xtend     = __webpack_require__(465)\n\nfunction DestroyableTransform(opts) {\n  Transform.call(this, opts)\n  this._destroyed = false\n}\n\ninherits(DestroyableTransform, Transform)\n\nDestroyableTransform.prototype.destroy = function(err) {\n  if (this._destroyed) return\n  this._destroyed = true\n  \n  var self = this\n  process.nextTick(function() {\n    if (err)\n      self.emit('error', err)\n    self.emit('close')\n  })\n}\n\n// a noop _transform function\nfunction noop (chunk, enc, callback) {\n  callback(null, chunk)\n}\n\n\n// create a new export function, used by both the main export and\n// the .ctor export, contains common logic for dealing with arguments\nfunction through2 (construct) {\n  return function (options, transform, flush) {\n    if (typeof options == 'function') {\n      flush     = transform\n      transform = options\n      options   = {}\n    }\n\n    if (typeof transform != 'function')\n      transform = noop\n\n    if (typeof flush != 'function')\n      flush = null\n\n    return construct(options, transform, flush)\n  }\n}\n\n\n// main export, just make me a transform stream!\nmodule.exports = through2(function (options, transform, flush) {\n  var t2 = new DestroyableTransform(options)\n\n  t2._transform = transform\n\n  if (flush)\n    t2._flush = flush\n\n  return t2\n})\n\n\n// make me a reusable prototype that I can `new`, or implicitly `new`\n// with a constructor call\nmodule.exports.ctor = through2(function (options, transform, flush) {\n  function Through2 (override) {\n    if (!(this instanceof Through2))\n      return new Through2(override)\n\n    this.options = xtend(options, override)\n\n    DestroyableTransform.call(this, this.options)\n  }\n\n  inherits(Through2, DestroyableTransform)\n\n  Through2.prototype._transform = transform\n\n  if (flush)\n    Through2.prototype._flush = flush\n\n  return Through2\n})\n\n\nmodule.exports.obj = through2(function (options, transform, flush) {\n  var t2 = new DestroyableTransform(xtend({ objectMode: true, highWaterMark: 16 }, options))\n\n  t2._transform = transform\n\n  if (flush)\n    t2._flush = flush\n\n  return t2\n})\n\n\n/***/ }),\n/* 462 */\n/***/ (function(module, exports) {\n\nmodule.exports = toBuffer\n\nvar makeBuffer = Buffer.from && Buffer.from !== Uint8Array.from ? Buffer.from : bufferFrom\n\nfunction bufferFrom (buf, enc) {\n  return new Buffer(buf, enc)\n}\n\nfunction toBuffer (buf, enc) {\n  if (Buffer.isBuffer(buf)) return buf\n  if (typeof buf === 'string') return makeBuffer(buf, enc)\n  if (Array.isArray(buf)) return makeBuffer(buf)\n  throw new Error('Input should be a buffer or a string')\n}\n\n\n/***/ }),\n/* 463 */\n/***/ (function(module, exports) {\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\nvar byteToHex = [];\nfor (var i = 0; i < 256; ++i) {\n  byteToHex[i] = (i + 0x100).toString(16).substr(1);\n}\n\nfunction bytesToUuid(buf, offset) {\n  var i = offset || 0;\n  var bth = byteToHex;\n  // join used to fix memory issue caused by concatenation: https://bugs.chromium.org/p/v8/issues/detail?id=3175#c4\n  return ([bth[buf[i++]], bth[buf[i++]], \n\tbth[buf[i++]], bth[buf[i++]], '-',\n\tbth[buf[i++]], bth[buf[i++]], '-',\n\tbth[buf[i++]], bth[buf[i++]], '-',\n\tbth[buf[i++]], bth[buf[i++]], '-',\n\tbth[buf[i++]], bth[buf[i++]],\n\tbth[buf[i++]], bth[buf[i++]],\n\tbth[buf[i++]], bth[buf[i++]]]).join('');\n}\n\nmodule.exports = bytesToUuid;\n\n\n/***/ }),\n/* 464 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Unique ID creation requires a high quality random # generator.  In node.js\n// this is pretty straight-forward - we use the crypto API.\n\nvar crypto = __webpack_require__(11);\n\nmodule.exports = function nodeRNG() {\n  return crypto.randomBytes(16);\n};\n\n\n/***/ }),\n/* 465 */\n/***/ (function(module, exports) {\n\nmodule.exports = extend\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction extend() {\n    var target = {}\n\n    for (var i = 0; i < arguments.length; i++) {\n        var source = arguments[i]\n\n        for (var key in source) {\n            if (hasOwnProperty.call(source, key)) {\n                target[key] = source[key]\n            }\n        }\n    }\n\n    return target\n}\n\n\n/***/ }),\n/* 466 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"constants\");\n\n/***/ }),\n/* 467 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"tls\");\n\n/***/ }),\n/* 468 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = handleSignals;\n\nvar _child;\n\nfunction _load_child() {\n  return _child = __webpack_require__(50);\n}\n\nfunction forwardSignalAndExit(signal) {\n  (0, (_child || _load_child()).forwardSignalToSpawnedProcesses)(signal);\n  // We want to exit immediately here since `SIGTERM` means that\n  // If we lose stdout messages due to abrupt exit, shoot the messenger?\n  process.exit(1); // eslint-disable-line no-process-exit\n}\nfunction handleSignals() {\n  process.on('SIGTERM', () => {\n    forwardSignalAndExit('SIGTERM');\n  });\n}\n\n/***/ }),\n/* 469 */\n/***/ (function(module, exports) {\n\n\nvar defaultConfig = {\n  uncaughtException: false,\n  SIGINT: true,\n  SIGTERM: true,\n  SIGQUIT: true\n}\n\nvar DEBUG = false\n\nfunction ON_DEATH (callback) {\n  var handlers = [];\n  Object.keys(defaultConfig).forEach(function(key) {\n    var val = defaultConfig[key]\n    var handler = null;\n    if (val) {\n      if (DEBUG) {\n        handler = function() {\n          var args = Array.prototype.slice.call(arguments, 0)\n          args.unshift(key)\n          console.log('Trapped ' + key)\n          callback.apply(null, args)\n        };\n        process.on(key, handler)\n      } else {\n        handler = function() {\n          var args = Array.prototype.slice.call(arguments, 0)\n          args.unshift(key)\n          callback.apply(null, args)\n        }\n        process.on(key, handler)\n      }\n      handlers.push([key, handler])\n    }\n  })\n  return function OFF_DEATH() {\n    handlers.forEach(function (args) {\n      var key = args[0];\n      var handler = args[1];\n      process.removeListener(key, handler);\n    })\n  }\n}\n\nmodule.exports = function (arg) {\n  if (typeof arg === 'object') {\n    if (arg['debug'])\n      DEBUG = arg.debug\n    if (arg['DEBUG'])\n      DEBUG = arg.DEBUG\n    delete arg.debug; delete arg.DEBUG;\n\n    Object.keys(arg).forEach(function(key) {\n      defaultConfig[key] = arg[key]\n    })\n\n    if (DEBUG)\n      console.log('ON_DEATH: debug mode enabled for pid [%d]', process.pid)\n\n    return ON_DEATH\n   } else if (typeof arg === 'function') {\n    return ON_DEATH(arg)\n  }\n}\n\n\n\n/***/ }),\n/* 470 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar util = __webpack_require__(3);\nvar onExit = __webpack_require__(451);\nvar currentlyUnhandled = __webpack_require__(597);\n\nvar installed = false;\n\nmodule.exports = function (log) {\n\tif (installed) {\n\t\treturn;\n\t}\n\n\tinstalled = true;\n\n\tlog = log || console.error;\n\n\tvar listUnhandled = currentlyUnhandled();\n\n\tonExit(function () {\n\t\tvar unhandledRejections = listUnhandled();\n\n\t\tif (unhandledRejections.length > 0) {\n\t\t\tunhandledRejections.forEach(function (x) {\n\t\t\t\tvar err = x.reason;\n\n\t\t\t\tif (!(err instanceof Error)) {\n\t\t\t\t\terr = new Error('Promise rejected with value: ' + util.inspect(err));\n\t\t\t\t}\n\n\t\t\t\tlog(err.stack);\n\t\t\t});\n\n\t\t\tprocess.exitCode = 1;\n\t\t}\n\t});\n};\n\n\n/***/ }),\n/* 471 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nconst fs = __webpack_require__(385);\nconst path = __webpack_require__(0);\nconst retry = __webpack_require__(819);\nconst syncFs = __webpack_require__(779);\n\nconst locks = {};\n\nfunction getLockFile(file) {\n    return `${file}.lock`;\n}\n\nfunction canonicalPath(file, options, callback) {\n    if (!options.realpath) {\n        return callback(null, path.resolve(file));\n    }\n\n    // Use realpath to resolve symlinks\n    // It also resolves relative paths\n    options.fs.realpath(file, callback);\n}\n\nfunction acquireLock(file, options, callback) {\n    // Use mkdir to create the lockfile (atomic operation)\n    options.fs.mkdir(getLockFile(file), (err) => {\n        // If successful, we are done\n        if (!err) {\n            return callback();\n        }\n\n        // If error is not EEXIST then some other error occurred while locking\n        if (err.code !== 'EEXIST') {\n            return callback(err);\n        }\n\n        // Otherwise, check if lock is stale by analyzing the file mtime\n        if (options.stale <= 0) {\n            return callback(Object.assign(new Error('Lock file is already being hold'), { code: 'ELOCKED', file }));\n        }\n\n        options.fs.stat(getLockFile(file), (err, stat) => {\n            if (err) {\n                // Retry if the lockfile has been removed (meanwhile)\n                // Skip stale check to avoid recursiveness\n                if (err.code === 'ENOENT') {\n                    return acquireLock(file, Object.assign({}, options, { stale: 0 }), callback);\n                }\n\n                return callback(err);\n            }\n\n            if (!isLockStale(stat, options)) {\n                return callback(Object.assign(new Error('Lock file is already being hold'), { code: 'ELOCKED', file }));\n            }\n\n            // If it's stale, remove it and try again!\n            // Skip stale check to avoid recursiveness\n            removeLock(file, options, (err) => {\n                if (err) {\n                    return callback(err);\n                }\n\n                acquireLock(file, Object.assign({}, options, { stale: 0 }), callback);\n            });\n        });\n    });\n}\n\nfunction isLockStale(stat, options) {\n    return stat.mtime.getTime() < Date.now() - options.stale;\n}\n\nfunction removeLock(file, options, callback) {\n    // Remove lockfile, ignoring ENOENT errors\n    options.fs.rmdir(getLockFile(file), (err) => {\n        if (err && err.code !== 'ENOENT') {\n            return callback(err);\n        }\n\n        callback();\n    });\n}\n\nfunction updateLock(file, options) {\n    const lock = locks[file];\n\n    /* istanbul ignore next */\n    if (lock.updateTimeout) {\n        return;\n    }\n\n    lock.updateDelay = lock.updateDelay || options.update;\n    lock.updateTimeout = setTimeout(() => {\n        const mtime = Date.now() / 1000;\n\n        lock.updateTimeout = null;\n\n        options.fs.utimes(getLockFile(file), mtime, mtime, (err) => {\n            // Ignore if the lock was released\n            if (lock.released) {\n                return;\n            }\n\n            // Verify if we are within the stale threshold\n            if (lock.lastUpdate <= Date.now() - options.stale &&\n                lock.lastUpdate > Date.now() - options.stale * 2) {\n                return compromisedLock(file, lock, Object.assign(new Error(lock.updateError || 'Unable to update lock within the stale \\\nthreshold'), { code: 'ECOMPROMISED' }));\n            }\n\n            // If the file is older than (stale * 2), we assume the clock is moved manually,\n            // which we consider a valid case\n\n            // If it failed to update the lockfile, keep trying unless\n            // the lockfile was deleted!\n            if (err) {\n                if (err.code === 'ENOENT') {\n                    return compromisedLock(file, lock, Object.assign(err, { code: 'ECOMPROMISED' }));\n                }\n\n                lock.updateError = err;\n                lock.updateDelay = 1000;\n                return updateLock(file, options);\n            }\n\n            // All ok, keep updating..\n            lock.lastUpdate = Date.now();\n            lock.updateError = null;\n            lock.updateDelay = null;\n            updateLock(file, options);\n        });\n    }, lock.updateDelay);\n\n    // Unref the timer so that the nodejs process can exit freely\n    // This is safe because all acquired locks will be automatically released\n    // on process exit\n\n    // We first check that `lock.updateTimeout.unref` exists because some users\n    // may be using this module outside of NodeJS (e.g., in an electron app), \n    // and in those cases `setTimeout` return an integer.\n    if (lock.updateTimeout.unref) {\n        lock.updateTimeout.unref();\n    }\n}\n\nfunction compromisedLock(file, lock, err) {\n    lock.released = true;                                    // Signal the lock has been released\n    /* istanbul ignore next */\n    lock.updateTimeout && clearTimeout(lock.updateTimeout);  // Cancel lock mtime update\n\n    if (locks[file] === lock) {\n        delete locks[file];\n    }\n\n    lock.compromised(err);\n}\n\n// -----------------------------------------\n\nfunction lock(file, options, compromised, callback) {\n    if (typeof options === 'function') {\n        callback = compromised;\n        compromised = options;\n        options = null;\n    }\n\n    if (!callback) {\n        callback = compromised;\n        compromised = null;\n    }\n\n    options = Object.assign({\n        stale: 10000,\n        update: null,\n        realpath: true,\n        retries: 0,\n        fs,\n    }, options);\n\n    options.retries = options.retries || 0;\n    options.retries = typeof options.retries === 'number' ? { retries: options.retries } : options.retries;\n    options.stale = Math.max(options.stale || 0, 2000);\n    options.update = options.update == null ? options.stale / 2 : options.update || 0;\n    options.update = Math.max(Math.min(options.update, options.stale / 2), 1000);\n    compromised = compromised || function (err) { throw err; };\n\n    // Resolve to a canonical file path\n    canonicalPath(file, options, (err, file) => {\n        if (err) {\n            return callback(err);\n        }\n\n        // Attempt to acquire the lock\n        const operation = retry.operation(options.retries);\n\n        operation.attempt(() => {\n            acquireLock(file, options, (err) => {\n                if (operation.retry(err)) {\n                    return;\n                }\n\n                if (err) {\n                    return callback(operation.mainError());\n                }\n\n                // We now own the lock\n                const lock = locks[file] = {\n                    options,\n                    compromised,\n                    lastUpdate: Date.now(),\n                };\n\n                // We must keep the lock fresh to avoid staleness\n                updateLock(file, options);\n\n                callback(null, (releasedCallback) => {\n                    if (lock.released) {\n                        return releasedCallback &&\n                            releasedCallback(Object.assign(new Error('Lock is already released'), { code: 'ERELEASED' }));\n                    }\n\n                    // Not necessary to use realpath twice when unlocking\n                    unlock(file, Object.assign({}, options, { realpath: false }), releasedCallback);\n                });\n            });\n        });\n    });\n}\n\nfunction unlock(file, options, callback) {\n    if (typeof options === 'function') {\n        callback = options;\n        options = null;\n    }\n\n    options = Object.assign({\n        fs,\n        realpath: true,\n    }, options);\n\n    callback = callback || function () {};\n\n    // Resolve to a canonical file path\n    canonicalPath(file, options, (err, file) => {\n        if (err) {\n            return callback(err);\n        }\n\n        // Skip if the lock is not acquired\n        const lock = locks[file];\n\n        if (!lock) {\n            return callback(Object.assign(new Error('Lock is not acquired/owned by you'), { code: 'ENOTACQUIRED' }));\n        }\n\n        lock.updateTimeout && clearTimeout(lock.updateTimeout);  // Cancel lock mtime update\n        lock.released = true;                                    // Signal the lock has been released\n        delete locks[file];                                      // Delete from locks\n\n        removeLock(file, options, callback);\n    });\n}\n\nfunction lockSync(file, options, compromised) {\n    if (typeof options === 'function') {\n        compromised = options;\n        options = null;\n    }\n\n    options = options || {};\n    options.fs = syncFs(options.fs || fs);\n    options.retries = options.retries || 0;\n    options.retries = typeof options.retries === 'number' ? { retries: options.retries } : options.retries;\n\n    // Retries are not allowed because it requires the flow to be sync\n    if (options.retries.retries) {\n        throw Object.assign(new Error('Cannot use retries with the sync api'), { code: 'ESYNC' });\n    }\n\n    let err;\n    let release;\n\n    lock(file, options, compromised, (_err, _release) => {\n        err = _err;\n        release = _release;\n    });\n\n    if (err) {\n        throw err;\n    }\n\n    return release;\n}\n\nfunction unlockSync(file, options) {\n    options = options || {};\n    options.fs = syncFs(options.fs || fs);\n\n    let err;\n\n    unlock(file, options, (_err) => {\n        err = _err;\n    });\n\n    if (err) {\n        throw err;\n    }\n}\n\nfunction check(file, options, callback) {\n    if (typeof options === 'function') {\n        callback = options;\n        options = null;\n    }\n\n    options = Object.assign({\n        stale: 10000,\n        realpath: true,\n        fs,\n    }, options);\n\n    options.stale = Math.max(options.stale || 0, 2000);\n\n    // Resolve to a canonical file path\n    canonicalPath(file, options, (err, file) => {\n        if (err) {\n            return callback(err);\n        }\n\n        // Check if lockfile exists\n        options.fs.stat(getLockFile(file), (err, stat) => {\n            if (err) {\n                // if does not exist, file is not locked. Otherwise, callback with error\n                return (err.code === 'ENOENT') ? callback(null, false) : callback(err);\n            }\n\n            if (options.stale <= 0) { return callback(null, true); }\n\n            // Otherwise, check if lock is stale by analyzing the file mtime\n            return callback(null, !isLockStale(stat, options));\n        });\n    });\n}\n\nfunction checkSync(file, options) {\n    options = options || {};\n    options.fs = syncFs(options.fs || fs);\n\n    let err;\n    let locked;\n\n    check(file, options, (_err, _locked) => {\n        err = _err;\n        locked = _locked;\n    });\n\n    if (err) {\n        throw err;\n    }\n\n    return locked;\n}\n\n\n// Remove acquired locks on exit\n/* istanbul ignore next */\nprocess.on('exit', () => {\n    Object.keys(locks).forEach((file) => {\n        try { locks[file].options.fs.rmdirSync(getLockFile(file)); } catch (e) { /* empty */ }\n    });\n});\n\nmodule.exports = lock;\nmodule.exports.lock = lock;\nmodule.exports.unlock = unlock;\nmodule.exports.lockSync = lockSync;\nmodule.exports.unlockSync = unlockSync;\nmodule.exports.check = check;\nmodule.exports.checkSync = checkSync;\n\n\n/***/ }),\n/* 472 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst x = module.exports;\nconst ESC = '\\u001B[';\nconst OSC = '\\u001B]';\nconst BEL = '\\u0007';\nconst SEP = ';';\nconst isTerminalApp = process.env.TERM_PROGRAM === 'Apple_Terminal';\n\nx.cursorTo = (x, y) => {\n\tif (typeof x !== 'number') {\n\t\tthrow new TypeError('The `x` argument is required');\n\t}\n\n\tif (typeof y !== 'number') {\n\t\treturn ESC + (x + 1) + 'G';\n\t}\n\n\treturn ESC + (y + 1) + ';' + (x + 1) + 'H';\n};\n\nx.cursorMove = (x, y) => {\n\tif (typeof x !== 'number') {\n\t\tthrow new TypeError('The `x` argument is required');\n\t}\n\n\tlet ret = '';\n\n\tif (x < 0) {\n\t\tret += ESC + (-x) + 'D';\n\t} else if (x > 0) {\n\t\tret += ESC + x + 'C';\n\t}\n\n\tif (y < 0) {\n\t\tret += ESC + (-y) + 'A';\n\t} else if (y > 0) {\n\t\tret += ESC + y + 'B';\n\t}\n\n\treturn ret;\n};\n\nx.cursorUp = count => ESC + (typeof count === 'number' ? count : 1) + 'A';\nx.cursorDown = count => ESC + (typeof count === 'number' ? count : 1) + 'B';\nx.cursorForward = count => ESC + (typeof count === 'number' ? count : 1) + 'C';\nx.cursorBackward = count => ESC + (typeof count === 'number' ? count : 1) + 'D';\n\nx.cursorLeft = ESC + 'G';\nx.cursorSavePosition = ESC + (isTerminalApp ? '7' : 's');\nx.cursorRestorePosition = ESC + (isTerminalApp ? '8' : 'u');\nx.cursorGetPosition = ESC + '6n';\nx.cursorNextLine = ESC + 'E';\nx.cursorPrevLine = ESC + 'F';\nx.cursorHide = ESC + '?25l';\nx.cursorShow = ESC + '?25h';\n\nx.eraseLines = count => {\n\tlet clear = '';\n\n\tfor (let i = 0; i < count; i++) {\n\t\tclear += x.eraseLine + (i < count - 1 ? x.cursorUp() : '');\n\t}\n\n\tif (count) {\n\t\tclear += x.cursorLeft;\n\t}\n\n\treturn clear;\n};\n\nx.eraseEndLine = ESC + 'K';\nx.eraseStartLine = ESC + '1K';\nx.eraseLine = ESC + '2K';\nx.eraseDown = ESC + 'J';\nx.eraseUp = ESC + '1J';\nx.eraseScreen = ESC + '2J';\nx.scrollUp = ESC + 'S';\nx.scrollDown = ESC + 'T';\n\nx.clearScreen = '\\u001Bc';\nx.beep = BEL;\n\nx.link = (text, url) => {\n\treturn [\n\t\tOSC,\n\t\t'8',\n\t\tSEP,\n\t\tSEP,\n\t\turl,\n\t\tBEL,\n\t\ttext,\n\t\tOSC,\n\t\t'8',\n\t\tSEP,\n\t\tSEP,\n\t\tBEL\n\t].join('');\n};\n\nx.image = (buf, opts) => {\n\topts = opts || {};\n\n\tlet ret = OSC + '1337;File=inline=1';\n\n\tif (opts.width) {\n\t\tret += `;width=${opts.width}`;\n\t}\n\n\tif (opts.height) {\n\t\tret += `;height=${opts.height}`;\n\t}\n\n\tif (opts.preserveAspectRatio === false) {\n\t\tret += ';preserveAspectRatio=0';\n\t}\n\n\treturn ret + ':' + buf.toString('base64') + BEL;\n};\n\nx.iTerm = {};\n\nx.iTerm.setCwd = cwd => OSC + '50;CurrentDir=' + (cwd || process.cwd()) + BEL;\n\n\n/***/ }),\n/* 473 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function () {\n\treturn /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g;\n};\n\n\n/***/ }),\n/* 474 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(module) {\nconst colorConvert = __webpack_require__(576);\n\nconst wrapAnsi16 = (fn, offset) => function () {\n\tconst code = fn.apply(colorConvert, arguments);\n\treturn `\\u001B[${code + offset}m`;\n};\n\nconst wrapAnsi256 = (fn, offset) => function () {\n\tconst code = fn.apply(colorConvert, arguments);\n\treturn `\\u001B[${38 + offset};5;${code}m`;\n};\n\nconst wrapAnsi16m = (fn, offset) => function () {\n\tconst rgb = fn.apply(colorConvert, arguments);\n\treturn `\\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;\n};\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\tconst styles = {\n\t\tmodifier: {\n\t\t\treset: [0, 0],\n\t\t\t// 21 isn't widely supported and 22 does the same thing\n\t\t\tbold: [1, 22],\n\t\t\tdim: [2, 22],\n\t\t\titalic: [3, 23],\n\t\t\tunderline: [4, 24],\n\t\t\tinverse: [7, 27],\n\t\t\thidden: [8, 28],\n\t\t\tstrikethrough: [9, 29]\n\t\t},\n\t\tcolor: {\n\t\t\tblack: [30, 39],\n\t\t\tred: [31, 39],\n\t\t\tgreen: [32, 39],\n\t\t\tyellow: [33, 39],\n\t\t\tblue: [34, 39],\n\t\t\tmagenta: [35, 39],\n\t\t\tcyan: [36, 39],\n\t\t\twhite: [37, 39],\n\t\t\tgray: [90, 39],\n\n\t\t\t// Bright color\n\t\t\tredBright: [91, 39],\n\t\t\tgreenBright: [92, 39],\n\t\t\tyellowBright: [93, 39],\n\t\t\tblueBright: [94, 39],\n\t\t\tmagentaBright: [95, 39],\n\t\t\tcyanBright: [96, 39],\n\t\t\twhiteBright: [97, 39]\n\t\t},\n\t\tbgColor: {\n\t\t\tbgBlack: [40, 49],\n\t\t\tbgRed: [41, 49],\n\t\t\tbgGreen: [42, 49],\n\t\t\tbgYellow: [43, 49],\n\t\t\tbgBlue: [44, 49],\n\t\t\tbgMagenta: [45, 49],\n\t\t\tbgCyan: [46, 49],\n\t\t\tbgWhite: [47, 49],\n\n\t\t\t// Bright color\n\t\t\tbgBlackBright: [100, 49],\n\t\t\tbgRedBright: [101, 49],\n\t\t\tbgGreenBright: [102, 49],\n\t\t\tbgYellowBright: [103, 49],\n\t\t\tbgBlueBright: [104, 49],\n\t\t\tbgMagentaBright: [105, 49],\n\t\t\tbgCyanBright: [106, 49],\n\t\t\tbgWhiteBright: [107, 49]\n\t\t}\n\t};\n\n\t// Fix humans\n\tstyles.color.grey = styles.color.gray;\n\n\tfor (const groupName of Object.keys(styles)) {\n\t\tconst group = styles[groupName];\n\n\t\tfor (const styleName of Object.keys(group)) {\n\t\t\tconst style = group[styleName];\n\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false\n\t\t});\n\n\t\tObject.defineProperty(styles, 'codes', {\n\t\t\tvalue: codes,\n\t\t\tenumerable: false\n\t\t});\n\t}\n\n\tconst ansi2ansi = n => n;\n\tconst rgb2rgb = (r, g, b) => [r, g, b];\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = {\n\t\tansi: wrapAnsi16(ansi2ansi, 0)\n\t};\n\tstyles.color.ansi256 = {\n\t\tansi256: wrapAnsi256(ansi2ansi, 0)\n\t};\n\tstyles.color.ansi16m = {\n\t\trgb: wrapAnsi16m(rgb2rgb, 0)\n\t};\n\n\tstyles.bgColor.ansi = {\n\t\tansi: wrapAnsi16(ansi2ansi, 10)\n\t};\n\tstyles.bgColor.ansi256 = {\n\t\tansi256: wrapAnsi256(ansi2ansi, 10)\n\t};\n\tstyles.bgColor.ansi16m = {\n\t\trgb: wrapAnsi16m(rgb2rgb, 10)\n\t};\n\n\tfor (let key of Object.keys(colorConvert)) {\n\t\tif (typeof colorConvert[key] !== 'object') {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst suite = colorConvert[key];\n\n\t\tif (key === 'ansi16') {\n\t\t\tkey = 'ansi';\n\t\t}\n\n\t\tif ('ansi16' in suite) {\n\t\t\tstyles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0);\n\t\t\tstyles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10);\n\t\t}\n\n\t\tif ('ansi256' in suite) {\n\t\t\tstyles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0);\n\t\t\tstyles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10);\n\t\t}\n\n\t\tif ('rgb' in suite) {\n\t\t\tstyles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0);\n\t\t\tstyles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10);\n\t\t}\n\t}\n\n\treturn styles;\n}\n\n// Make the export immutable\nObject.defineProperty(module, 'exports', {\n\tenumerable: true,\n\tget: assembleStyles\n});\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(121)(module)))\n\n/***/ }),\n/* 475 */\n/***/ (function(module, exports) {\n\nfunction webpackEmptyContext(req) {\n\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n}\nwebpackEmptyContext.keys = function() { return []; };\nwebpackEmptyContext.resolve = webpackEmptyContext;\nmodule.exports = webpackEmptyContext;\nwebpackEmptyContext.id = 475;\n\n/***/ }),\n/* 476 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n    // global key for user preferred registration\nvar REGISTRATION_KEY = '@@any-promise/REGISTRATION',\n    // Prior registration (preferred or detected)\n    registered = null\n\n/**\n * Registers the given implementation.  An implementation must\n * be registered prior to any call to `require(\"any-promise\")`,\n * typically on application load.\n *\n * If called with no arguments, will return registration in\n * following priority:\n *\n * For Node.js:\n *\n * 1. Previous registration\n * 2. global.Promise if node.js version >= 0.12\n * 3. Auto detected promise based on first sucessful require of\n *    known promise libraries. Note this is a last resort, as the\n *    loaded library is non-deterministic. node.js >= 0.12 will\n *    always use global.Promise over this priority list.\n * 4. Throws error.\n *\n * For Browser:\n *\n * 1. Previous registration\n * 2. window.Promise\n * 3. Throws error.\n *\n * Options:\n *\n * Promise: Desired Promise constructor\n * global: Boolean - Should the registration be cached in a global variable to\n * allow cross dependency/bundle registration?  (default true)\n */\nmodule.exports = function(root, loadImplementation){\n  return function register(implementation, opts){\n    implementation = implementation || null\n    opts = opts || {}\n    // global registration unless explicitly  {global: false} in options (default true)\n    var registerGlobal = opts.global !== false;\n\n    // load any previous global registration\n    if(registered === null && registerGlobal){\n      registered = root[REGISTRATION_KEY] || null\n    }\n\n    if(registered !== null\n        && implementation !== null\n        && registered.implementation !== implementation){\n      // Throw error if attempting to redefine implementation\n      throw new Error('any-promise already defined as \"'+registered.implementation+\n        '\".  You can only register an implementation before the first '+\n        ' call to require(\"any-promise\") and an implementation cannot be changed')\n    }\n\n    if(registered === null){\n      // use provided implementation\n      if(implementation !== null && typeof opts.Promise !== 'undefined'){\n        registered = {\n          Promise: opts.Promise,\n          implementation: implementation\n        }\n      } else {\n        // require implementation if implementation is specified but not provided\n        registered = loadImplementation(implementation)\n      }\n\n      if(registerGlobal){\n        // register preference globally in case multiple installations\n        root[REGISTRATION_KEY] = registered\n      }\n    }\n\n    return registered\n  }\n}\n\n\n/***/ }),\n/* 477 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = __webpack_require__(476)(global, loadImplementation);\n\n/**\n * Node.js version of loadImplementation.\n *\n * Requires the given implementation and returns the registration\n * containing {Promise, implementation}\n *\n * If implementation is undefined or global.Promise, loads it\n * Otherwise uses require\n */\nfunction loadImplementation(implementation){\n  var impl = null\n\n  if(shouldPreferGlobalPromise(implementation)){\n    // if no implementation or env specified use global.Promise\n    impl = {\n      Promise: global.Promise,\n      implementation: 'global.Promise'\n    }\n  } else if(implementation){\n    // if implementation specified, require it\n    var lib = !(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\".\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }())\n    impl = {\n      Promise: lib.Promise || lib,\n      implementation: implementation\n    }\n  } else {\n    // try to auto detect implementation. This is non-deterministic\n    // and should prefer other branches, but this is our last chance\n    // to load something without throwing error\n    impl = tryAutoDetect()\n  }\n\n  if(impl === null){\n    throw new Error('Cannot find any-promise implementation nor'+\n      ' global.Promise. You must install polyfill or call'+\n      ' require(\"any-promise/register\") with your preferred'+\n      ' implementation, e.g. require(\"any-promise/register/bluebird\")'+\n      ' on application load prior to any require(\"any-promise\").')\n  }\n\n  return impl\n}\n\n/**\n * Determines if the global.Promise should be preferred if an implementation\n * has not been registered.\n */\nfunction shouldPreferGlobalPromise(implementation){\n  if(implementation){\n    return implementation === 'global.Promise'\n  } else if(typeof global.Promise !== 'undefined'){\n    // Load global promise if implementation not specified\n    // Versions < 0.11 did not have global Promise\n    // Do not use for version < 0.12 as version 0.11 contained buggy versions\n    var version = (/v(\\d+)\\.(\\d+)\\.(\\d+)/).exec(process.version)\n    return !(version && +version[1] == 0 && +version[2] < 12)\n  }\n\n  // do not have global.Promise or another implementation was specified\n  return false\n}\n\n/**\n * Look for common libs as last resort there is no guarantee that\n * this will return a desired implementation or even be deterministic.\n * The priority is also nearly arbitrary. We are only doing this\n * for older versions of Node.js <0.12 that do not have a reasonable\n * global.Promise implementation and we the user has not registered\n * the preference. This preserves the behavior of any-promise <= 0.1\n * and may be deprecated or removed in the future\n */\nfunction tryAutoDetect(){\n  var libs = [\n      \"es6-promise\",\n      \"promise\",\n      \"native-promise-only\",\n      \"bluebird\",\n      \"rsvp\",\n      \"when\",\n      \"q\",\n      \"pinkie\",\n      \"lie\",\n      \"vow\"]\n  var i = 0, len = libs.length\n  for(; i < len; i++){\n    try {\n      return loadImplementation(libs[i])\n    } catch(e){}\n  }\n  return null\n}\n\n\n/***/ }),\n/* 478 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * arr-flatten <https://github.com/jonschlinkert/arr-flatten>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n\n\nmodule.exports = function (arr) {\n  return flat(arr, []);\n};\n\nfunction flat(arr, res) {\n  var i = 0, cur;\n  var len = arr.length;\n  for (; i < len; i++) {\n    cur = arr[i];\n    Array.isArray(cur) ? flat(cur, res) : res.push(cur);\n  }\n  return res;\n}\n\n\n/***/ }),\n/* 479 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function (arr, predicate, ctx) {\n\tif (typeof Array.prototype.findIndex === 'function') {\n\t\treturn arr.findIndex(predicate, ctx);\n\t}\n\n\tif (typeof predicate !== 'function') {\n\t\tthrow new TypeError('predicate must be a function');\n\t}\n\n\tvar list = Object(arr);\n\tvar len = list.length;\n\n\tif (len === 0) {\n\t\treturn -1;\n\t}\n\n\tfor (var i = 0; i < len; i++) {\n\t\tif (predicate.call(ctx, list[i], i, list)) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n};\n\n\n/***/ }),\n/* 480 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar rawAsap = __webpack_require__(481);\nvar freeTasks = [];\n\n/**\n * Calls a task as soon as possible after returning, in its own event, with\n * priority over IO events. An exception thrown in a task can be handled by\n * `process.on(\"uncaughtException\") or `domain.on(\"error\")`, but will otherwise\n * crash the process. If the error is handled, all subsequent tasks will\n * resume.\n *\n * @param {{call}} task A callable object, typically a function that takes no\n * arguments.\n */\nmodule.exports = asap;\nfunction asap(task) {\n    var rawTask;\n    if (freeTasks.length) {\n        rawTask = freeTasks.pop();\n    } else {\n        rawTask = new RawTask();\n    }\n    rawTask.task = task;\n    rawTask.domain = process.domain;\n    rawAsap(rawTask);\n}\n\nfunction RawTask() {\n    this.task = null;\n    this.domain = null;\n}\n\nRawTask.prototype.call = function () {\n    if (this.domain) {\n        this.domain.enter();\n    }\n    var threw = true;\n    try {\n        this.task.call();\n        threw = false;\n        // If the task throws an exception (presumably) Node.js restores the\n        // domain stack for the next event.\n        if (this.domain) {\n            this.domain.exit();\n        }\n    } finally {\n        // We use try/finally and a threw flag to avoid messing up stack traces\n        // when we catch and release errors.\n        if (threw) {\n            // In Node.js, uncaught exceptions are considered fatal errors.\n            // Re-throw them to interrupt flushing!\n            // Ensure that flushing continues if an uncaught exception is\n            // suppressed listening process.on(\"uncaughtException\") or\n            // domain.on(\"error\").\n            rawAsap.requestFlush();\n        }\n        // If the task threw an error, we do not want to exit the domain here.\n        // Exiting the domain would prevent the domain from catching the error.\n        this.task = null;\n        this.domain = null;\n        freeTasks.push(this);\n    }\n};\n\n\n\n/***/ }),\n/* 481 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar domain; // The domain module is executed on demand\nvar hasSetImmediate = typeof setImmediate === \"function\";\n\n// Use the fastest means possible to execute a task in its own turn, with\n// priority over other events including network IO events in Node.js.\n//\n// An exception thrown by a task will permanently interrupt the processing of\n// subsequent tasks. The higher level `asap` function ensures that if an\n// exception is thrown by a task, that the task queue will continue flushing as\n// soon as possible, but if you use `rawAsap` directly, you are responsible to\n// either ensure that no exceptions are thrown from your task, or to manually\n// call `rawAsap.requestFlush` if an exception is thrown.\nmodule.exports = rawAsap;\nfunction rawAsap(task) {\n    if (!queue.length) {\n        requestFlush();\n        flushing = true;\n    }\n    // Avoids a function call\n    queue[queue.length] = task;\n}\n\nvar queue = [];\n// Once a flush has been requested, no further calls to `requestFlush` are\n// necessary until the next `flush` completes.\nvar flushing = false;\n// The position of the next task to execute in the task queue. This is\n// preserved between calls to `flush` so that it can be resumed if\n// a task throws an exception.\nvar index = 0;\n// If a task schedules additional tasks recursively, the task queue can grow\n// unbounded. To prevent memory excaustion, the task queue will periodically\n// truncate already-completed tasks.\nvar capacity = 1024;\n\n// The flush function processes all tasks that have been scheduled with\n// `rawAsap` unless and until one of those tasks throws an exception.\n// If a task throws an exception, `flush` ensures that its state will remain\n// consistent and will resume where it left off when called again.\n// However, `flush` does not make any arrangements to be called again if an\n// exception is thrown.\nfunction flush() {\n    while (index < queue.length) {\n        var currentIndex = index;\n        // Advance the index before calling the task. This ensures that we will\n        // begin flushing on the next task the task throws an error.\n        index = index + 1;\n        queue[currentIndex].call();\n        // Prevent leaking memory for long chains of recursive calls to `asap`.\n        // If we call `asap` within tasks scheduled by `asap`, the queue will\n        // grow, but to avoid an O(n) walk for every task we execute, we don't\n        // shift tasks off the queue after they have been executed.\n        // Instead, we periodically shift 1024 tasks off the queue.\n        if (index > capacity) {\n            // Manually shift all values starting at the index back to the\n            // beginning of the queue.\n            for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {\n                queue[scan] = queue[scan + index];\n            }\n            queue.length -= index;\n            index = 0;\n        }\n    }\n    queue.length = 0;\n    index = 0;\n    flushing = false;\n}\n\nrawAsap.requestFlush = requestFlush;\nfunction requestFlush() {\n    // Ensure flushing is not bound to any domain.\n    // It is not sufficient to exit the domain, because domains exist on a stack.\n    // To execute code outside of any domain, the following dance is necessary.\n    var parentDomain = process.domain;\n    if (parentDomain) {\n        if (!domain) {\n            // Lazy execute the domain module.\n            // Only employed if the user elects to use domains.\n            domain = __webpack_require__(965);\n        }\n        domain.active = process.domain = null;\n    }\n\n    // `setImmediate` is slower that `process.nextTick`, but `process.nextTick`\n    // cannot handle recursion.\n    // `requestFlush` will only be called recursively from `asap.js`, to resume\n    // flushing after an error is thrown into a domain.\n    // Conveniently, `setImmediate` was introduced in the same version\n    // `process.nextTick` started throwing recursion errors.\n    if (flushing && hasSetImmediate) {\n        setImmediate(flush);\n    } else {\n        process.nextTick(flush);\n    }\n\n    if (parentDomain) {\n        domain.active = process.domain = parentDomain;\n    }\n}\n\n\n/***/ }),\n/* 482 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\nvar errors = __webpack_require__(203);\nvar types = __webpack_require__(204);\n\nvar Reader = __webpack_require__(483);\nvar Writer = __webpack_require__(484);\n\n\n// --- Exports\n\nmodule.exports = {\n\n  Reader: Reader,\n\n  Writer: Writer\n\n};\n\nfor (var t in types) {\n  if (types.hasOwnProperty(t))\n    module.exports[t] = types[t];\n}\nfor (var e in errors) {\n  if (errors.hasOwnProperty(e))\n    module.exports[e] = errors[e];\n}\n\n\n/***/ }),\n/* 483 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\nvar assert = __webpack_require__(29);\nvar Buffer = __webpack_require__(15).Buffer;\n\nvar ASN1 = __webpack_require__(204);\nvar errors = __webpack_require__(203);\n\n\n// --- Globals\n\nvar newInvalidAsn1Error = errors.newInvalidAsn1Error;\n\n\n\n// --- API\n\nfunction Reader(data) {\n  if (!data || !Buffer.isBuffer(data))\n    throw new TypeError('data must be a node Buffer');\n\n  this._buf = data;\n  this._size = data.length;\n\n  // These hold the \"current\" state\n  this._len = 0;\n  this._offset = 0;\n}\n\nObject.defineProperty(Reader.prototype, 'length', {\n  enumerable: true,\n  get: function () { return (this._len); }\n});\n\nObject.defineProperty(Reader.prototype, 'offset', {\n  enumerable: true,\n  get: function () { return (this._offset); }\n});\n\nObject.defineProperty(Reader.prototype, 'remain', {\n  get: function () { return (this._size - this._offset); }\n});\n\nObject.defineProperty(Reader.prototype, 'buffer', {\n  get: function () { return (this._buf.slice(this._offset)); }\n});\n\n\n/**\n * Reads a single byte and advances offset; you can pass in `true` to make this\n * a \"peek\" operation (i.e., get the byte, but don't advance the offset).\n *\n * @param {Boolean} peek true means don't move offset.\n * @return {Number} the next byte, null if not enough data.\n */\nReader.prototype.readByte = function (peek) {\n  if (this._size - this._offset < 1)\n    return null;\n\n  var b = this._buf[this._offset] & 0xff;\n\n  if (!peek)\n    this._offset += 1;\n\n  return b;\n};\n\n\nReader.prototype.peek = function () {\n  return this.readByte(true);\n};\n\n\n/**\n * Reads a (potentially) variable length off the BER buffer.  This call is\n * not really meant to be called directly, as callers have to manipulate\n * the internal buffer afterwards.\n *\n * As a result of this call, you can call `Reader.length`, until the\n * next thing called that does a readLength.\n *\n * @return {Number} the amount of offset to advance the buffer.\n * @throws {InvalidAsn1Error} on bad ASN.1\n */\nReader.prototype.readLength = function (offset) {\n  if (offset === undefined)\n    offset = this._offset;\n\n  if (offset >= this._size)\n    return null;\n\n  var lenB = this._buf[offset++] & 0xff;\n  if (lenB === null)\n    return null;\n\n  if ((lenB & 0x80) === 0x80) {\n    lenB &= 0x7f;\n\n    if (lenB === 0)\n      throw newInvalidAsn1Error('Indefinite length not supported');\n\n    if (lenB > 4)\n      throw newInvalidAsn1Error('encoding too long');\n\n    if (this._size - offset < lenB)\n      return null;\n\n    this._len = 0;\n    for (var i = 0; i < lenB; i++)\n      this._len = (this._len << 8) + (this._buf[offset++] & 0xff);\n\n  } else {\n    // Wasn't a variable length\n    this._len = lenB;\n  }\n\n  return offset;\n};\n\n\n/**\n * Parses the next sequence in this BER buffer.\n *\n * To get the length of the sequence, call `Reader.length`.\n *\n * @return {Number} the sequence's tag.\n */\nReader.prototype.readSequence = function (tag) {\n  var seq = this.peek();\n  if (seq === null)\n    return null;\n  if (tag !== undefined && tag !== seq)\n    throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +\n                              ': got 0x' + seq.toString(16));\n\n  var o = this.readLength(this._offset + 1); // stored in `length`\n  if (o === null)\n    return null;\n\n  this._offset = o;\n  return seq;\n};\n\n\nReader.prototype.readInt = function () {\n  return this._readTag(ASN1.Integer);\n};\n\n\nReader.prototype.readBoolean = function () {\n  return (this._readTag(ASN1.Boolean) === 0 ? false : true);\n};\n\n\nReader.prototype.readEnumeration = function () {\n  return this._readTag(ASN1.Enumeration);\n};\n\n\nReader.prototype.readString = function (tag, retbuf) {\n  if (!tag)\n    tag = ASN1.OctetString;\n\n  var b = this.peek();\n  if (b === null)\n    return null;\n\n  if (b !== tag)\n    throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +\n                              ': got 0x' + b.toString(16));\n\n  var o = this.readLength(this._offset + 1); // stored in `length`\n\n  if (o === null)\n    return null;\n\n  if (this.length > this._size - o)\n    return null;\n\n  this._offset = o;\n\n  if (this.length === 0)\n    return retbuf ? Buffer.alloc(0) : '';\n\n  var str = this._buf.slice(this._offset, this._offset + this.length);\n  this._offset += this.length;\n\n  return retbuf ? str : str.toString('utf8');\n};\n\nReader.prototype.readOID = function (tag) {\n  if (!tag)\n    tag = ASN1.OID;\n\n  var b = this.readString(tag, true);\n  if (b === null)\n    return null;\n\n  var values = [];\n  var value = 0;\n\n  for (var i = 0; i < b.length; i++) {\n    var byte = b[i] & 0xff;\n\n    value <<= 7;\n    value += byte & 0x7f;\n    if ((byte & 0x80) === 0) {\n      values.push(value);\n      value = 0;\n    }\n  }\n\n  value = values.shift();\n  values.unshift(value % 40);\n  values.unshift((value / 40) >> 0);\n\n  return values.join('.');\n};\n\n\nReader.prototype._readTag = function (tag) {\n  assert.ok(tag !== undefined);\n\n  var b = this.peek();\n\n  if (b === null)\n    return null;\n\n  if (b !== tag)\n    throw newInvalidAsn1Error('Expected 0x' + tag.toString(16) +\n                              ': got 0x' + b.toString(16));\n\n  var o = this.readLength(this._offset + 1); // stored in `length`\n  if (o === null)\n    return null;\n\n  if (this.length > 4)\n    throw newInvalidAsn1Error('Integer too long: ' + this.length);\n\n  if (this.length > this._size - o)\n    return null;\n  this._offset = o;\n\n  var fb = this._buf[this._offset];\n  var value = 0;\n\n  for (var i = 0; i < this.length; i++) {\n    value <<= 8;\n    value |= (this._buf[this._offset++] & 0xff);\n  }\n\n  if ((fb & 0x80) === 0x80 && i !== 4)\n    value -= (1 << (i * 8));\n\n  return value >> 0;\n};\n\n\n\n// --- Exported API\n\nmodule.exports = Reader;\n\n\n/***/ }),\n/* 484 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2011 Mark Cavage <mcavage@gmail.com> All rights reserved.\n\nvar assert = __webpack_require__(29);\nvar Buffer = __webpack_require__(15).Buffer;\nvar ASN1 = __webpack_require__(204);\nvar errors = __webpack_require__(203);\n\n\n// --- Globals\n\nvar newInvalidAsn1Error = errors.newInvalidAsn1Error;\n\nvar DEFAULT_OPTS = {\n  size: 1024,\n  growthFactor: 8\n};\n\n\n// --- Helpers\n\nfunction merge(from, to) {\n  assert.ok(from);\n  assert.equal(typeof (from), 'object');\n  assert.ok(to);\n  assert.equal(typeof (to), 'object');\n\n  var keys = Object.getOwnPropertyNames(from);\n  keys.forEach(function (key) {\n    if (to[key])\n      return;\n\n    var value = Object.getOwnPropertyDescriptor(from, key);\n    Object.defineProperty(to, key, value);\n  });\n\n  return to;\n}\n\n\n\n// --- API\n\nfunction Writer(options) {\n  options = merge(DEFAULT_OPTS, options || {});\n\n  this._buf = Buffer.alloc(options.size || 1024);\n  this._size = this._buf.length;\n  this._offset = 0;\n  this._options = options;\n\n  // A list of offsets in the buffer where we need to insert\n  // sequence tag/len pairs.\n  this._seq = [];\n}\n\nObject.defineProperty(Writer.prototype, 'buffer', {\n  get: function () {\n    if (this._seq.length)\n      throw newInvalidAsn1Error(this._seq.length + ' unended sequence(s)');\n\n    return (this._buf.slice(0, this._offset));\n  }\n});\n\nWriter.prototype.writeByte = function (b) {\n  if (typeof (b) !== 'number')\n    throw new TypeError('argument must be a Number');\n\n  this._ensure(1);\n  this._buf[this._offset++] = b;\n};\n\n\nWriter.prototype.writeInt = function (i, tag) {\n  if (typeof (i) !== 'number')\n    throw new TypeError('argument must be a Number');\n  if (typeof (tag) !== 'number')\n    tag = ASN1.Integer;\n\n  var sz = 4;\n\n  while ((((i & 0xff800000) === 0) || ((i & 0xff800000) === 0xff800000 >> 0)) &&\n        (sz > 1)) {\n    sz--;\n    i <<= 8;\n  }\n\n  if (sz > 4)\n    throw newInvalidAsn1Error('BER ints cannot be > 0xffffffff');\n\n  this._ensure(2 + sz);\n  this._buf[this._offset++] = tag;\n  this._buf[this._offset++] = sz;\n\n  while (sz-- > 0) {\n    this._buf[this._offset++] = ((i & 0xff000000) >>> 24);\n    i <<= 8;\n  }\n\n};\n\n\nWriter.prototype.writeNull = function () {\n  this.writeByte(ASN1.Null);\n  this.writeByte(0x00);\n};\n\n\nWriter.prototype.writeEnumeration = function (i, tag) {\n  if (typeof (i) !== 'number')\n    throw new TypeError('argument must be a Number');\n  if (typeof (tag) !== 'number')\n    tag = ASN1.Enumeration;\n\n  return this.writeInt(i, tag);\n};\n\n\nWriter.prototype.writeBoolean = function (b, tag) {\n  if (typeof (b) !== 'boolean')\n    throw new TypeError('argument must be a Boolean');\n  if (typeof (tag) !== 'number')\n    tag = ASN1.Boolean;\n\n  this._ensure(3);\n  this._buf[this._offset++] = tag;\n  this._buf[this._offset++] = 0x01;\n  this._buf[this._offset++] = b ? 0xff : 0x00;\n};\n\n\nWriter.prototype.writeString = function (s, tag) {\n  if (typeof (s) !== 'string')\n    throw new TypeError('argument must be a string (was: ' + typeof (s) + ')');\n  if (typeof (tag) !== 'number')\n    tag = ASN1.OctetString;\n\n  var len = Buffer.byteLength(s);\n  this.writeByte(tag);\n  this.writeLength(len);\n  if (len) {\n    this._ensure(len);\n    this._buf.write(s, this._offset);\n    this._offset += len;\n  }\n};\n\n\nWriter.prototype.writeBuffer = function (buf, tag) {\n  if (typeof (tag) !== 'number')\n    throw new TypeError('tag must be a number');\n  if (!Buffer.isBuffer(buf))\n    throw new TypeError('argument must be a buffer');\n\n  this.writeByte(tag);\n  this.writeLength(buf.length);\n  this._ensure(buf.length);\n  buf.copy(this._buf, this._offset, 0, buf.length);\n  this._offset += buf.length;\n};\n\n\nWriter.prototype.writeStringArray = function (strings) {\n  if ((!strings instanceof Array))\n    throw new TypeError('argument must be an Array[String]');\n\n  var self = this;\n  strings.forEach(function (s) {\n    self.writeString(s);\n  });\n};\n\n// This is really to solve DER cases, but whatever for now\nWriter.prototype.writeOID = function (s, tag) {\n  if (typeof (s) !== 'string')\n    throw new TypeError('argument must be a string');\n  if (typeof (tag) !== 'number')\n    tag = ASN1.OID;\n\n  if (!/^([0-9]+\\.){3,}[0-9]+$/.test(s))\n    throw new Error('argument is not a valid OID string');\n\n  function encodeOctet(bytes, octet) {\n    if (octet < 128) {\n        bytes.push(octet);\n    } else if (octet < 16384) {\n        bytes.push((octet >>> 7) | 0x80);\n        bytes.push(octet & 0x7F);\n    } else if (octet < 2097152) {\n      bytes.push((octet >>> 14) | 0x80);\n      bytes.push(((octet >>> 7) | 0x80) & 0xFF);\n      bytes.push(octet & 0x7F);\n    } else if (octet < 268435456) {\n      bytes.push((octet >>> 21) | 0x80);\n      bytes.push(((octet >>> 14) | 0x80) & 0xFF);\n      bytes.push(((octet >>> 7) | 0x80) & 0xFF);\n      bytes.push(octet & 0x7F);\n    } else {\n      bytes.push(((octet >>> 28) | 0x80) & 0xFF);\n      bytes.push(((octet >>> 21) | 0x80) & 0xFF);\n      bytes.push(((octet >>> 14) | 0x80) & 0xFF);\n      bytes.push(((octet >>> 7) | 0x80) & 0xFF);\n      bytes.push(octet & 0x7F);\n    }\n  }\n\n  var tmp = s.split('.');\n  var bytes = [];\n  bytes.push(parseInt(tmp[0], 10) * 40 + parseInt(tmp[1], 10));\n  tmp.slice(2).forEach(function (b) {\n    encodeOctet(bytes, parseInt(b, 10));\n  });\n\n  var self = this;\n  this._ensure(2 + bytes.length);\n  this.writeByte(tag);\n  this.writeLength(bytes.length);\n  bytes.forEach(function (b) {\n    self.writeByte(b);\n  });\n};\n\n\nWriter.prototype.writeLength = function (len) {\n  if (typeof (len) !== 'number')\n    throw new TypeError('argument must be a Number');\n\n  this._ensure(4);\n\n  if (len <= 0x7f) {\n    this._buf[this._offset++] = len;\n  } else if (len <= 0xff) {\n    this._buf[this._offset++] = 0x81;\n    this._buf[this._offset++] = len;\n  } else if (len <= 0xffff) {\n    this._buf[this._offset++] = 0x82;\n    this._buf[this._offset++] = len >> 8;\n    this._buf[this._offset++] = len;\n  } else if (len <= 0xffffff) {\n    this._buf[this._offset++] = 0x83;\n    this._buf[this._offset++] = len >> 16;\n    this._buf[this._offset++] = len >> 8;\n    this._buf[this._offset++] = len;\n  } else {\n    throw newInvalidAsn1Error('Length too long (> 4 bytes)');\n  }\n};\n\nWriter.prototype.startSequence = function (tag) {\n  if (typeof (tag) !== 'number')\n    tag = ASN1.Sequence | ASN1.Constructor;\n\n  this.writeByte(tag);\n  this._seq.push(this._offset);\n  this._ensure(3);\n  this._offset += 3;\n};\n\n\nWriter.prototype.endSequence = function () {\n  var seq = this._seq.pop();\n  var start = seq + 3;\n  var len = this._offset - start;\n\n  if (len <= 0x7f) {\n    this._shift(start, len, -2);\n    this._buf[seq] = len;\n  } else if (len <= 0xff) {\n    this._shift(start, len, -1);\n    this._buf[seq] = 0x81;\n    this._buf[seq + 1] = len;\n  } else if (len <= 0xffff) {\n    this._buf[seq] = 0x82;\n    this._buf[seq + 1] = len >> 8;\n    this._buf[seq + 2] = len;\n  } else if (len <= 0xffffff) {\n    this._shift(start, len, 1);\n    this._buf[seq] = 0x83;\n    this._buf[seq + 1] = len >> 16;\n    this._buf[seq + 2] = len >> 8;\n    this._buf[seq + 3] = len;\n  } else {\n    throw newInvalidAsn1Error('Sequence too long');\n  }\n};\n\n\nWriter.prototype._shift = function (start, len, shift) {\n  assert.ok(start !== undefined);\n  assert.ok(len !== undefined);\n  assert.ok(shift);\n\n  this._buf.copy(this._buf, start + shift, start, start + len);\n  this._offset += shift;\n};\n\nWriter.prototype._ensure = function (len) {\n  assert.ok(len);\n\n  if (this._size - this._offset < len) {\n    var sz = this._size * this._options.growthFactor;\n    if (sz - this._offset < len)\n      sz += len;\n\n    var buf = Buffer.alloc(sz);\n\n    this._buf.copy(buf, 0, 0, this._offset);\n    this._buf = buf;\n    this._size = sz;\n  }\n};\n\n\n\n// --- Exported API\n\nmodule.exports = Writer;\n\n\n/***/ }),\n/* 485 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports =\n{\n  parallel      : __webpack_require__(487),\n  serial        : __webpack_require__(488),\n  serialOrdered : __webpack_require__(345)\n};\n\n\n/***/ }),\n/* 486 */\n/***/ (function(module, exports) {\n\nmodule.exports = defer;\n\n/**\n * Runs provided function on next iteration of the event loop\n *\n * @param {function} fn - function to run\n */\nfunction defer(fn)\n{\n  var nextTick = typeof setImmediate == 'function'\n    ? setImmediate\n    : (\n      typeof process == 'object' && typeof process.nextTick == 'function'\n      ? process.nextTick\n      : null\n    );\n\n  if (nextTick)\n  {\n    nextTick(fn);\n  }\n  else\n  {\n    setTimeout(fn, 0);\n  }\n}\n\n\n/***/ }),\n/* 487 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar iterate    = __webpack_require__(342)\n  , initState  = __webpack_require__(343)\n  , terminator = __webpack_require__(344)\n  ;\n\n// Public API\nmodule.exports = parallel;\n\n/**\n * Runs iterator over provided array elements in parallel\n *\n * @param   {array|object} list - array or object (named list) to iterate over\n * @param   {function} iterator - iterator to run\n * @param   {function} callback - invoked when all elements processed\n * @returns {function} - jobs terminator\n */\nfunction parallel(list, iterator, callback)\n{\n  var state = initState(list);\n\n  while (state.index < (state['keyedList'] || list).length)\n  {\n    iterate(list, iterator, state, function(error, result)\n    {\n      if (error)\n      {\n        callback(error, result);\n        return;\n      }\n\n      // looks like it's the last one\n      if (Object.keys(state.jobs).length === 0)\n      {\n        callback(null, state.results);\n        return;\n      }\n    });\n\n    state.index++;\n  }\n\n  return terminator.bind(state, callback);\n}\n\n\n/***/ }),\n/* 488 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar serialOrdered = __webpack_require__(345);\n\n// Public API\nmodule.exports = serial;\n\n/**\n * Runs iterator over provided array elements in series\n *\n * @param   {array|object} list - array or object (named list) to iterate over\n * @param   {function} iterator - iterator to run\n * @param   {function} callback - invoked when all elements processed\n * @returns {function} - jobs terminator\n */\nfunction serial(list, iterator, callback)\n{\n  return serialOrdered(list, iterator, null, callback);\n}\n\n\n/***/ }),\n/* 489 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\n/*!\n *  Copyright 2010 LearnBoost <dev@learnboost.com>\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Module dependencies.\n */\n\nvar crypto = __webpack_require__(11)\n  , parse = __webpack_require__(24).parse\n  ;\n\n/**\n * Valid keys.\n */\n\nvar keys = \n  [ 'acl'\n  , 'location'\n  , 'logging'\n  , 'notification'\n  , 'partNumber'\n  , 'policy'\n  , 'requestPayment'\n  , 'torrent'\n  , 'uploadId'\n  , 'uploads'\n  , 'versionId'\n  , 'versioning'\n  , 'versions'\n  , 'website'\n  ]\n\n/**\n * Return an \"Authorization\" header value with the given `options`\n * in the form of \"AWS <key>:<signature>\"\n *\n * @param {Object} options\n * @return {String}\n * @api private\n */\n\nfunction authorization (options) {\n  return 'AWS ' + options.key + ':' + sign(options)\n}\n\nmodule.exports = authorization\nmodule.exports.authorization = authorization\n\n/**\n * Simple HMAC-SHA1 Wrapper\n *\n * @param {Object} options\n * @return {String}\n * @api private\n */ \n\nfunction hmacSha1 (options) {\n  return crypto.createHmac('sha1', options.secret).update(options.message).digest('base64')\n}\n\nmodule.exports.hmacSha1 = hmacSha1\n\n/**\n * Create a base64 sha1 HMAC for `options`. \n * \n * @param {Object} options\n * @return {String}\n * @api private\n */\n\nfunction sign (options) {\n  options.message = stringToSign(options)\n  return hmacSha1(options)\n}\nmodule.exports.sign = sign\n\n/**\n * Create a base64 sha1 HMAC for `options`. \n *\n * Specifically to be used with S3 presigned URLs\n * \n * @param {Object} options\n * @return {String}\n * @api private\n */\n\nfunction signQuery (options) {\n  options.message = queryStringToSign(options)\n  return hmacSha1(options)\n}\nmodule.exports.signQuery= signQuery\n\n/**\n * Return a string for sign() with the given `options`.\n *\n * Spec:\n * \n *    <verb>\\n\n *    <md5>\\n\n *    <content-type>\\n\n *    <date>\\n\n *    [headers\\n]\n *    <resource>\n *\n * @param {Object} options\n * @return {String}\n * @api private\n */\n\nfunction stringToSign (options) {\n  var headers = options.amazonHeaders || ''\n  if (headers) headers += '\\n'\n  var r = \n    [ options.verb\n    , options.md5\n    , options.contentType\n    , options.date ? options.date.toUTCString() : ''\n    , headers + options.resource\n    ]\n  return r.join('\\n')\n}\nmodule.exports.stringToSign = stringToSign\n\n/**\n * Return a string for sign() with the given `options`, but is meant exclusively\n * for S3 presigned URLs\n *\n * Spec:\n * \n *    <date>\\n\n *    <resource>\n *\n * @param {Object} options\n * @return {String}\n * @api private\n */\n\nfunction queryStringToSign (options){\n  return 'GET\\n\\n\\n' + options.date + '\\n' + options.resource\n}\nmodule.exports.queryStringToSign = queryStringToSign\n\n/**\n * Perform the following:\n *\n *  - ignore non-amazon headers\n *  - lowercase fields\n *  - sort lexicographically\n *  - trim whitespace between \":\"\n *  - join with newline\n *\n * @param {Object} headers\n * @return {String}\n * @api private\n */\n\nfunction canonicalizeHeaders (headers) {\n  var buf = []\n    , fields = Object.keys(headers)\n    ;\n  for (var i = 0, len = fields.length; i < len; ++i) {\n    var field = fields[i]\n      , val = headers[field]\n      , field = field.toLowerCase()\n      ;\n    if (0 !== field.indexOf('x-amz')) continue\n    buf.push(field + ':' + val)\n  }\n  return buf.sort().join('\\n')\n}\nmodule.exports.canonicalizeHeaders = canonicalizeHeaders\n\n/**\n * Perform the following:\n *\n *  - ignore non sub-resources\n *  - sort lexicographically\n *\n * @param {String} resource\n * @return {String}\n * @api private\n */\n\nfunction canonicalizeResource (resource) {\n  var url = parse(resource, true)\n    , path = url.pathname\n    , buf = []\n    ;\n\n  Object.keys(url.query).forEach(function(key){\n    if (!~keys.indexOf(key)) return\n    var val = '' == url.query[key] ? '' : '=' + encodeURIComponent(url.query[key])\n    buf.push(key + val)\n  })\n\n  return path + (buf.length ? '?' + buf.sort().join('&') : '')\n}\nmodule.exports.canonicalizeResource = canonicalizeResource\n\n\n/***/ }),\n/* 490 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar aws4 = exports,\n    url = __webpack_require__(24),\n    querystring = __webpack_require__(197),\n    crypto = __webpack_require__(11),\n    lru = __webpack_require__(491),\n    credentialsCache = lru(1000)\n\n// http://docs.amazonwebservices.com/general/latest/gr/signature-version-4.html\n\nfunction hmac(key, string, encoding) {\n  return crypto.createHmac('sha256', key).update(string, 'utf8').digest(encoding)\n}\n\nfunction hash(string, encoding) {\n  return crypto.createHash('sha256').update(string, 'utf8').digest(encoding)\n}\n\n// This function assumes the string has already been percent encoded\nfunction encodeRfc3986(urlEncodedString) {\n  return urlEncodedString.replace(/[!'()*]/g, function(c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\n// request: { path | body, [host], [method], [headers], [service], [region] }\n// credentials: { accessKeyId, secretAccessKey, [sessionToken] }\nfunction RequestSigner(request, credentials) {\n\n  if (typeof request === 'string') request = url.parse(request)\n\n  var headers = request.headers = (request.headers || {}),\n      hostParts = this.matchHost(request.hostname || request.host || headers.Host || headers.host)\n\n  this.request = request\n  this.credentials = credentials || this.defaultCredentials()\n\n  this.service = request.service || hostParts[0] || ''\n  this.region = request.region || hostParts[1] || 'us-east-1'\n\n  // SES uses a different domain from the service name\n  if (this.service === 'email') this.service = 'ses'\n\n  if (!request.method && request.body)\n    request.method = 'POST'\n\n  if (!headers.Host && !headers.host) {\n    headers.Host = request.hostname || request.host || this.createHost()\n\n    // If a port is specified explicitly, use it as is\n    if (request.port)\n      headers.Host += ':' + request.port\n  }\n  if (!request.hostname && !request.host)\n    request.hostname = headers.Host || headers.host\n\n  this.isCodeCommitGit = this.service === 'codecommit' && request.method === 'GIT'\n}\n\nRequestSigner.prototype.matchHost = function(host) {\n  var match = (host || '').match(/([^\\.]+)\\.(?:([^\\.]*)\\.)?amazonaws\\.com$/)\n  var hostParts = (match || []).slice(1, 3)\n\n  // ES's hostParts are sometimes the other way round, if the value that is expected\n  // to be region equals ‘es’ switch them back\n  // e.g. search-cluster-name-aaaa00aaaa0aaa0aaaaaaa0aaa.us-east-1.es.amazonaws.com\n  if (hostParts[1] === 'es')\n    hostParts = hostParts.reverse()\n\n  return hostParts\n}\n\n// http://docs.aws.amazon.com/general/latest/gr/rande.html\nRequestSigner.prototype.isSingleRegion = function() {\n  // Special case for S3 and SimpleDB in us-east-1\n  if (['s3', 'sdb'].indexOf(this.service) >= 0 && this.region === 'us-east-1') return true\n\n  return ['cloudfront', 'ls', 'route53', 'iam', 'importexport', 'sts']\n    .indexOf(this.service) >= 0\n}\n\nRequestSigner.prototype.createHost = function() {\n  var region = this.isSingleRegion() ? '' :\n        (this.service === 's3' && this.region !== 'us-east-1' ? '-' : '.') + this.region,\n      service = this.service === 'ses' ? 'email' : this.service\n  return service + region + '.amazonaws.com'\n}\n\nRequestSigner.prototype.prepareRequest = function() {\n  this.parsePath()\n\n  var request = this.request, headers = request.headers, query\n\n  if (request.signQuery) {\n\n    this.parsedPath.query = query = this.parsedPath.query || {}\n\n    if (this.credentials.sessionToken)\n      query['X-Amz-Security-Token'] = this.credentials.sessionToken\n\n    if (this.service === 's3' && !query['X-Amz-Expires'])\n      query['X-Amz-Expires'] = 86400\n\n    if (query['X-Amz-Date'])\n      this.datetime = query['X-Amz-Date']\n    else\n      query['X-Amz-Date'] = this.getDateTime()\n\n    query['X-Amz-Algorithm'] = 'AWS4-HMAC-SHA256'\n    query['X-Amz-Credential'] = this.credentials.accessKeyId + '/' + this.credentialString()\n    query['X-Amz-SignedHeaders'] = this.signedHeaders()\n\n  } else {\n\n    if (!request.doNotModifyHeaders && !this.isCodeCommitGit) {\n      if (request.body && !headers['Content-Type'] && !headers['content-type'])\n        headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8'\n\n      if (request.body && !headers['Content-Length'] && !headers['content-length'])\n        headers['Content-Length'] = Buffer.byteLength(request.body)\n\n      if (this.credentials.sessionToken && !headers['X-Amz-Security-Token'] && !headers['x-amz-security-token'])\n        headers['X-Amz-Security-Token'] = this.credentials.sessionToken\n\n      if (this.service === 's3' && !headers['X-Amz-Content-Sha256'] && !headers['x-amz-content-sha256'])\n        headers['X-Amz-Content-Sha256'] = hash(this.request.body || '', 'hex')\n\n      if (headers['X-Amz-Date'] || headers['x-amz-date'])\n        this.datetime = headers['X-Amz-Date'] || headers['x-amz-date']\n      else\n        headers['X-Amz-Date'] = this.getDateTime()\n    }\n\n    delete headers.Authorization\n    delete headers.authorization\n  }\n}\n\nRequestSigner.prototype.sign = function() {\n  if (!this.parsedPath) this.prepareRequest()\n\n  if (this.request.signQuery) {\n    this.parsedPath.query['X-Amz-Signature'] = this.signature()\n  } else {\n    this.request.headers.Authorization = this.authHeader()\n  }\n\n  this.request.path = this.formatPath()\n\n  return this.request\n}\n\nRequestSigner.prototype.getDateTime = function() {\n  if (!this.datetime) {\n    var headers = this.request.headers,\n      date = new Date(headers.Date || headers.date || new Date)\n\n    this.datetime = date.toISOString().replace(/[:\\-]|\\.\\d{3}/g, '')\n\n    // Remove the trailing 'Z' on the timestamp string for CodeCommit git access\n    if (this.isCodeCommitGit) this.datetime = this.datetime.slice(0, -1)\n  }\n  return this.datetime\n}\n\nRequestSigner.prototype.getDate = function() {\n  return this.getDateTime().substr(0, 8)\n}\n\nRequestSigner.prototype.authHeader = function() {\n  return [\n    'AWS4-HMAC-SHA256 Credential=' + this.credentials.accessKeyId + '/' + this.credentialString(),\n    'SignedHeaders=' + this.signedHeaders(),\n    'Signature=' + this.signature(),\n  ].join(', ')\n}\n\nRequestSigner.prototype.signature = function() {\n  var date = this.getDate(),\n      cacheKey = [this.credentials.secretAccessKey, date, this.region, this.service].join(),\n      kDate, kRegion, kService, kCredentials = credentialsCache.get(cacheKey)\n  if (!kCredentials) {\n    kDate = hmac('AWS4' + this.credentials.secretAccessKey, date)\n    kRegion = hmac(kDate, this.region)\n    kService = hmac(kRegion, this.service)\n    kCredentials = hmac(kService, 'aws4_request')\n    credentialsCache.set(cacheKey, kCredentials)\n  }\n  return hmac(kCredentials, this.stringToSign(), 'hex')\n}\n\nRequestSigner.prototype.stringToSign = function() {\n  return [\n    'AWS4-HMAC-SHA256',\n    this.getDateTime(),\n    this.credentialString(),\n    hash(this.canonicalString(), 'hex'),\n  ].join('\\n')\n}\n\nRequestSigner.prototype.canonicalString = function() {\n  if (!this.parsedPath) this.prepareRequest()\n\n  var pathStr = this.parsedPath.path,\n      query = this.parsedPath.query,\n      headers = this.request.headers,\n      queryStr = '',\n      normalizePath = this.service !== 's3',\n      decodePath = this.service === 's3' || this.request.doNotEncodePath,\n      decodeSlashesInPath = this.service === 's3',\n      firstValOnly = this.service === 's3',\n      bodyHash\n\n  if (this.service === 's3' && this.request.signQuery) {\n    bodyHash = 'UNSIGNED-PAYLOAD'\n  } else if (this.isCodeCommitGit) {\n    bodyHash = ''\n  } else {\n    bodyHash = headers['X-Amz-Content-Sha256'] || headers['x-amz-content-sha256'] ||\n      hash(this.request.body || '', 'hex')\n  }\n\n  if (query) {\n    queryStr = encodeRfc3986(querystring.stringify(Object.keys(query).sort().reduce(function(obj, key) {\n      if (!key) return obj\n      obj[key] = !Array.isArray(query[key]) ? query[key] :\n        (firstValOnly ? query[key][0] : query[key].slice().sort())\n      return obj\n    }, {})))\n  }\n  if (pathStr !== '/') {\n    if (normalizePath) pathStr = pathStr.replace(/\\/{2,}/g, '/')\n    pathStr = pathStr.split('/').reduce(function(path, piece) {\n      if (normalizePath && piece === '..') {\n        path.pop()\n      } else if (!normalizePath || piece !== '.') {\n        if (decodePath) piece = decodeURIComponent(piece)\n        path.push(encodeRfc3986(encodeURIComponent(piece)))\n      }\n      return path\n    }, []).join('/')\n    if (pathStr[0] !== '/') pathStr = '/' + pathStr\n    if (decodeSlashesInPath) pathStr = pathStr.replace(/%2F/g, '/')\n  }\n\n  return [\n    this.request.method || 'GET',\n    pathStr,\n    queryStr,\n    this.canonicalHeaders() + '\\n',\n    this.signedHeaders(),\n    bodyHash,\n  ].join('\\n')\n}\n\nRequestSigner.prototype.canonicalHeaders = function() {\n  var headers = this.request.headers\n  function trimAll(header) {\n    return header.toString().trim().replace(/\\s+/g, ' ')\n  }\n  return Object.keys(headers)\n    .sort(function(a, b) { return a.toLowerCase() < b.toLowerCase() ? -1 : 1 })\n    .map(function(key) { return key.toLowerCase() + ':' + trimAll(headers[key]) })\n    .join('\\n')\n}\n\nRequestSigner.prototype.signedHeaders = function() {\n  return Object.keys(this.request.headers)\n    .map(function(key) { return key.toLowerCase() })\n    .sort()\n    .join(';')\n}\n\nRequestSigner.prototype.credentialString = function() {\n  return [\n    this.getDate(),\n    this.region,\n    this.service,\n    'aws4_request',\n  ].join('/')\n}\n\nRequestSigner.prototype.defaultCredentials = function() {\n  var env = process.env\n  return {\n    accessKeyId: env.AWS_ACCESS_KEY_ID || env.AWS_ACCESS_KEY,\n    secretAccessKey: env.AWS_SECRET_ACCESS_KEY || env.AWS_SECRET_KEY,\n    sessionToken: env.AWS_SESSION_TOKEN,\n  }\n}\n\nRequestSigner.prototype.parsePath = function() {\n  var path = this.request.path || '/',\n      queryIx = path.indexOf('?'),\n      query = null\n\n  if (queryIx >= 0) {\n    query = querystring.parse(path.slice(queryIx + 1))\n    path = path.slice(0, queryIx)\n  }\n\n  // S3 doesn't always encode characters > 127 correctly and\n  // all services don't encode characters > 255 correctly\n  // So if there are non-reserved chars (and it's not already all % encoded), just encode them all\n  if (/[^0-9A-Za-z!'()*\\-._~%/]/.test(path)) {\n    path = path.split('/').map(function(piece) {\n      return encodeURIComponent(decodeURIComponent(piece))\n    }).join('/')\n  }\n\n  this.parsedPath = {\n    path: path,\n    query: query,\n  }\n}\n\nRequestSigner.prototype.formatPath = function() {\n  var path = this.parsedPath.path,\n      query = this.parsedPath.query\n\n  if (!query) return path\n\n  // Services don't support empty query string keys\n  if (query[''] != null) delete query['']\n\n  return path + '?' + encodeRfc3986(querystring.stringify(query))\n}\n\naws4.RequestSigner = RequestSigner\n\naws4.sign = function(request, credentials) {\n  return new RequestSigner(request, credentials).sign()\n}\n\n\n/***/ }),\n/* 491 */\n/***/ (function(module, exports) {\n\nmodule.exports = function(size) {\n  return new LruCache(size)\n}\n\nfunction LruCache(size) {\n  this.capacity = size | 0\n  this.map = Object.create(null)\n  this.list = new DoublyLinkedList()\n}\n\nLruCache.prototype.get = function(key) {\n  var node = this.map[key]\n  if (node == null) return undefined\n  this.used(node)\n  return node.val\n}\n\nLruCache.prototype.set = function(key, val) {\n  var node = this.map[key]\n  if (node != null) {\n    node.val = val\n  } else {\n    if (!this.capacity) this.prune()\n    if (!this.capacity) return false\n    node = new DoublyLinkedNode(key, val)\n    this.map[key] = node\n    this.capacity--\n  }\n  this.used(node)\n  return true\n}\n\nLruCache.prototype.used = function(node) {\n  this.list.moveToFront(node)\n}\n\nLruCache.prototype.prune = function() {\n  var node = this.list.pop()\n  if (node != null) {\n    delete this.map[node.key]\n    this.capacity++\n  }\n}\n\n\nfunction DoublyLinkedList() {\n  this.firstNode = null\n  this.lastNode = null\n}\n\nDoublyLinkedList.prototype.moveToFront = function(node) {\n  if (this.firstNode == node) return\n\n  this.remove(node)\n\n  if (this.firstNode == null) {\n    this.firstNode = node\n    this.lastNode = node\n    node.prev = null\n    node.next = null\n  } else {\n    node.prev = null\n    node.next = this.firstNode\n    node.next.prev = node\n    this.firstNode = node\n  }\n}\n\nDoublyLinkedList.prototype.pop = function() {\n  var lastNode = this.lastNode\n  if (lastNode != null) {\n    this.remove(lastNode)\n  }\n  return lastNode\n}\n\nDoublyLinkedList.prototype.remove = function(node) {\n  if (this.firstNode == node) {\n    this.firstNode = node.next\n  } else if (node.prev != null) {\n    node.prev.next = node.next\n  }\n  if (this.lastNode == node) {\n    this.lastNode = node.prev\n  } else if (node.next != null) {\n    node.next.prev = node.prev\n  }\n}\n\n\nfunction DoublyLinkedNode(key, val) {\n  this.key = key\n  this.val = val\n  this.prev = null\n  this.next = null\n}\n\n\n/***/ }),\n/* 492 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (message) {\n  return {\n    useless: true,\n    run() {\n      throw new (_errors || _load_errors()).MessageError(message);\n    },\n    setFlags: () => {},\n    hasWrapper: () => true\n  };\n};\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\n/***/ }),\n/* 493 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.examples = exports.hasWrapper = exports.run = undefined;\nexports.setFlags = setFlags;\n\nvar _buildSubCommands2;\n\nfunction _load_buildSubCommands() {\n  return _buildSubCommands2 = _interopRequireDefault(__webpack_require__(59));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst notYetImplemented = () => Promise.reject(new Error('This command is not implemented yet.'));\n\nfunction setFlags(commander) {\n  commander.description('Has not been implemented yet');\n}\n\nvar _buildSubCommands = (0, (_buildSubCommands2 || _load_buildSubCommands()).default)('access', {\n  public: notYetImplemented,\n  restricted: notYetImplemented,\n  grant: notYetImplemented,\n  revoke: notYetImplemented,\n  lsPackages: notYetImplemented,\n  lsCollaborators: notYetImplemented,\n  edit: notYetImplemented\n}, ['WARNING: This command yet to be implemented.', 'public [<package>]', 'restricted [<package>]', 'grant <read-only|read-write> <scope:team> [<package>]', 'revoke <scope:team> [<package>]', 'ls-packages [<user>|<scope>|<scope:team>]', 'ls-collaborators [<package> [<user>]]', 'edit [<package>]']);\n\nconst run = _buildSubCommands.run,\n      hasWrapper = _buildSubCommands.hasWrapper,\n      examples = _buildSubCommands.examples;\nexports.run = run;\nexports.hasWrapper = hasWrapper;\nexports.examples = examples;\n\n/***/ }),\n/* 494 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const binFolder = path.join(config.cwd, config.registryFolders[0], '.bin');\n    if (args.length === 0) {\n      reporter.log(binFolder, { force: true });\n    } else {\n      const binEntries = yield (0, (_run || _load_run()).getBinEntries)(config);\n\n      const binName = args[0];\n      const binPath = binEntries.get(binName);\n\n      if (binPath) {\n        reporter.log(binPath, { force: true });\n      } else {\n        reporter.error(reporter.lang('packageBinaryNotFound', binName));\n      }\n    }\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\n\nvar _run;\n\nfunction _load_run() {\n  return _run = __webpack_require__(354);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst path = __webpack_require__(0);\n\nfunction hasWrapper(commander) {\n  return false;\n}\n\nfunction setFlags(commander) {\n  commander.description('Displays the location of the yarn bin folder.');\n}\n\n/***/ }),\n/* 495 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.examples = exports.run = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\n\nvar _buildSubCommands2;\n\nfunction _load_buildSubCommands() {\n  return _buildSubCommands2 = _interopRequireDefault(__webpack_require__(59));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst CONFIG_KEYS = [\n// 'reporter',\n'registryFolders', 'linkedModules',\n// 'registries',\n'cache', 'cwd', 'looseSemver', 'commandName', 'preferOffline', 'modulesFolder', 'globalFolder', 'linkFolder', 'offline', 'binLinks', 'ignorePlatform', 'ignoreScripts', 'disablePrepublish', 'nonInteractive', 'workspaceRootFolder', 'lockfileFolder', 'networkConcurrency', 'childConcurrency', 'networkTimeout', 'workspacesEnabled', 'workspacesNohoistEnabled', 'pruneOfflineMirror', 'enableMetaFolder', 'enableLockfileVersions', 'linkFileDependencies', 'cacheFolder', 'tempFolder', 'production'];\n/* eslint object-shorthand: 0 */\n\nfunction hasWrapper(flags, args) {\n  return args[0] !== 'get';\n}\n\nfunction setFlags(commander) {\n  commander.description('Manages the yarn configuration files.');\n}\n\nvar _buildSubCommands = (0, (_buildSubCommands2 || _load_buildSubCommands()).default)('config', {\n  set(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      if (args.length === 0 || args.length > 2) {\n        return false;\n      }\n      const key = args[0];\n      var _args$ = args[1];\n      const val = _args$ === undefined ? true : _args$;\n\n      const yarnConfig = config.registries.yarn;\n      yield yarnConfig.saveHomeConfig({ [key]: val });\n      reporter.success(reporter.lang('configSet', key, val));\n      return true;\n    })();\n  },\n\n  get(config, reporter, flags, args) {\n    if (args.length !== 1) {\n      return false;\n    }\n\n    reporter.log(String(config.getOption(args[0])), { force: true });\n    return true;\n  },\n\n  delete: (() => {\n    var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n      if (args.length !== 1) {\n        return false;\n      }\n\n      const key = args[0];\n      const yarnConfig = config.registries.yarn;\n      yield yarnConfig.saveHomeConfig({ [key]: undefined });\n      reporter.success(reporter.lang('configDelete', key));\n      return true;\n    });\n\n    function _delete(_x, _x2, _x3, _x4) {\n      return _ref.apply(this, arguments);\n    }\n\n    return _delete;\n  })(),\n\n  list(config, reporter, flags, args) {\n    if (args.length) {\n      return false;\n    }\n\n    reporter.info(reporter.lang('configYarn'));\n    reporter.inspect(config.registries.yarn.config);\n\n    reporter.info(reporter.lang('configNpm'));\n    reporter.inspect(config.registries.npm.config);\n\n    return true;\n  },\n\n  current(config, reporter, flags, args) {\n    if (args.length) {\n      return false;\n    }\n\n    reporter.log(JSON.stringify(config, CONFIG_KEYS, 2), { force: true });\n\n    return true;\n  }\n});\n\nconst run = _buildSubCommands.run,\n      examples = _buildSubCommands.examples;\nexports.run = run;\nexports.examples = examples;\n\n/***/ }),\n/* 496 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const builderName = args[0],\n          rest = args.slice(1);\n\n\n    if (!builderName) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('invalidPackageName'));\n    }\n\n    var _coerceCreatePackageN = coerceCreatePackageName(builderName);\n\n    const packageName = _coerceCreatePackageN.fullName,\n          commandName = _coerceCreatePackageN.name;\n\n\n    const linkLoc = path.join(config.linkFolder, commandName);\n    if (yield (_fs || _load_fs()).exists(linkLoc)) {\n      reporter.info(reporter.lang('linkUsing', packageName));\n    } else {\n      yield (0, (_global || _load_global()).run)(config, reporter, {}, ['add', packageName]);\n    }\n\n    const binFolder = yield (0, (_global || _load_global()).getBinFolder)(config, {});\n    const command = path.resolve(binFolder, commandName);\n    const env = yield (0, (_executeLifecycleScript || _load_executeLifecycleScript()).makeEnv)('create', config.cwd, config);\n\n    yield (_child || _load_child()).spawn(command, rest, { stdio: `inherit`, shell: true, env });\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\nexports.parsePackageName = parsePackageName;\nexports.coerceCreatePackageName = coerceCreatePackageName;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _child;\n\nfunction _load_child() {\n  return _child = _interopRequireWildcard(__webpack_require__(50));\n}\n\nvar _executeLifecycleScript;\n\nfunction _load_executeLifecycleScript() {\n  return _executeLifecycleScript = __webpack_require__(111);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _global;\n\nfunction _load_global() {\n  return _global = __webpack_require__(122);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst path = __webpack_require__(0);\n\nfunction setFlags(commander) {\n  commander.description('Creates new projects from any create-* starter kits.');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\nfunction parsePackageName(str) {\n  if (str.charAt(0) === '/') {\n    throw new Error(`Name should not start with \"/\", got \"${str}\"`);\n  }\n  if (str.charAt(0) === '.') {\n    throw new Error(`Name should not start with \".\", got \"${str}\"`);\n  }\n  const parts = str.split('/');\n  const isScoped = str.charAt(0) === '@';\n  if (isScoped && parts[0] === '@') {\n    throw new Error(`Scope should not be empty, got \"${str}\"`);\n  }\n  const scope = isScoped ? parts[0] : '';\n  const name = parts[isScoped ? 1 : 0] || '';\n  const path = parts.slice(isScoped ? 2 : 1).join('/');\n  const fullName = [scope, name].filter(Boolean).join('/');\n  const full = [scope, name, path].filter(Boolean).join('/');\n\n  return { fullName, name, scope, path, full };\n}\n\nfunction coerceCreatePackageName(str) {\n  const pkgNameObj = parsePackageName(str);\n  const coercedName = pkgNameObj.name !== '' ? `create-${pkgNameObj.name}` : `create`;\n  const coercedPkgNameObj = (0, (_extends2 || _load_extends()).default)({}, pkgNameObj, {\n    name: coercedName,\n    fullName: [pkgNameObj.scope, coercedName].filter(Boolean).join('/'),\n    full: [pkgNameObj.scope, coercedName, pkgNameObj.path].filter(Boolean).join('/')\n  });\n  return coercedPkgNameObj;\n}\n\n/***/ }),\n/* 497 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const env = yield (0, (_executeLifecycleScript || _load_executeLifecycleScript()).makeEnv)(`exec`, config.cwd, config);\n\n    if (args.length < 1) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('execMissingCommand'));\n    }\n\n    const execName = args[0],\n          rest = args.slice(1);\n\n    yield (_child || _load_child()).spawn(execName, rest, { stdio: 'inherit', env });\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _child;\n\nfunction _load_child() {\n  return _child = _interopRequireWildcard(__webpack_require__(50));\n}\n\nvar _executeLifecycleScript;\n\nfunction _load_executeLifecycleScript() {\n  return _executeLifecycleScript = __webpack_require__(111);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction setFlags(commander) {}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 498 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.examples = exports.run = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    let manifest;\n    if (flags.useManifest) {\n      manifest = yield config.readJson(flags.useManifest);\n    } else {\n      manifest = yield config.readRootManifest();\n    }\n    if (!manifest.name) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('noName'));\n    }\n    if (!manifest.version) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('noVersion'));\n    }\n\n    const entry = {\n      name: manifest.name,\n      version: manifest.version,\n      resolved: flags.resolved,\n      registry: flags.registry || manifest._registry,\n      optionalDependencies: manifest.optionalDependencies,\n      dependencies: manifest.dependencies\n    };\n    const pattern = flags.pattern || `${entry.name}@${entry.version}`;\n    reporter.log((0, (_lockfile || _load_lockfile()).stringify)({\n      [pattern]: (0, (_lockfile || _load_lockfile()).implodeEntry)(pattern, entry)\n    }));\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = __webpack_require__(19);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction hasWrapper(commander, args) {\n  return false;\n}\n\nfunction setFlags(commander) {\n  commander.description('Generates a lock file entry.');\n  commander.option('--use-manifest <location>', 'description');\n  commander.option('--resolved <resolved>', 'description');\n  commander.option('--registry <registry>', 'description');\n}\n\nconst examples = exports.examples = ['generate-lock-entry', 'generate-lock-entry --use-manifest ./package.json', 'generate-lock-entry --resolved local-file.tgz#hash'];\n\n/***/ }),\n/* 499 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\nexports.run = run;\n\nvar _index;\n\nfunction _load_index() {\n  return _index = _interopRequireDefault(__webpack_require__(334));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nvar _aliases;\n\nfunction _load_aliases() {\n  return _aliases = _interopRequireDefault(__webpack_require__(346));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst chalk = __webpack_require__(27);\n\nfunction hasWrapper(flags, args) {\n  return false;\n}\n\nfunction setFlags(commander) {\n  commander.description('Displays help information.');\n}\n\nfunction run(config, reporter, commander, args) {\n  if (args.length) {\n    const commandName = args.shift();\n    if (Object.prototype.hasOwnProperty.call((_index || _load_index()).default, commandName)) {\n      const command = (_index || _load_index()).default[commandName];\n      if (command) {\n        command.setFlags(commander);\n        const examples = (command.examples || []).map(example => `    $ yarn ${example}`);\n        if (examples.length) {\n          commander.on('--help', () => {\n            reporter.log(reporter.lang('helpExamples', reporter.rawText(examples.join('\\n'))));\n          });\n        }\n        // eslint-disable-next-line yarn-internal/warn-language\n        commander.on('--help', () => reporter.log('  ' + command.getDocsInfo + '\\n'));\n        commander.help();\n        return Promise.resolve();\n      }\n    }\n  }\n\n  commander.on('--help', () => {\n    const commandsText = [];\n    for (var _iterator = Object.keys((_index || _load_index()).default).sort((_misc || _load_misc()).sortAlpha), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const name = _ref;\n\n      if ((_index || _load_index()).default[name].useless || Object.keys((_aliases || _load_aliases()).default).map(key => (_aliases || _load_aliases()).default[key]).indexOf(name) > -1) {\n        continue;\n      }\n      if ((_aliases || _load_aliases()).default[name]) {\n        commandsText.push(`    - ${(0, (_misc || _load_misc()).hyphenate)(name)} / ${(_aliases || _load_aliases()).default[name]}`);\n      } else {\n        commandsText.push(`    - ${(0, (_misc || _load_misc()).hyphenate)(name)}`);\n      }\n    }\n    reporter.log(reporter.lang('helpCommands', reporter.rawText(commandsText.join('\\n'))));\n    reporter.log(reporter.lang('helpCommandsMore', reporter.rawText(chalk.bold('yarn help COMMAND'))));\n    reporter.log(reporter.lang('helpLearnMore', reporter.rawText(chalk.bold((_constants || _load_constants()).YARN_DOCS))));\n  });\n\n  commander.options.sort((_misc || _load_misc()).sortOptionsByFlags);\n\n  commander.help();\n  return Promise.resolve();\n}\n\n/***/ }),\n/* 500 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.Import = exports.noArguments = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const imp = new Import(flags, config, reporter, new (_lockfile || _load_lockfile()).default({ cache: {} }));\n    yield imp.init();\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref5.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nvar _check;\n\nfunction _load_check() {\n  return _check = __webpack_require__(350);\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = __webpack_require__(78);\n}\n\nvar _baseResolver;\n\nfunction _load_baseResolver() {\n  return _baseResolver = _interopRequireDefault(__webpack_require__(124));\n}\n\nvar _hostedGitResolver;\n\nfunction _load_hostedGitResolver() {\n  return _hostedGitResolver = _interopRequireDefault(__webpack_require__(109));\n}\n\nvar _hostedGitResolver2;\n\nfunction _load_hostedGitResolver2() {\n  return _hostedGitResolver2 = __webpack_require__(109);\n}\n\nvar _gistResolver;\n\nfunction _load_gistResolver() {\n  return _gistResolver = _interopRequireDefault(__webpack_require__(214));\n}\n\nvar _gistResolver2;\n\nfunction _load_gistResolver2() {\n  return _gistResolver2 = __webpack_require__(214);\n}\n\nvar _gitResolver;\n\nfunction _load_gitResolver() {\n  return _gitResolver = _interopRequireDefault(__webpack_require__(125));\n}\n\nvar _fileResolver;\n\nfunction _load_fileResolver() {\n  return _fileResolver = _interopRequireDefault(__webpack_require__(213));\n}\n\nvar _packageResolver;\n\nfunction _load_packageResolver() {\n  return _packageResolver = _interopRequireDefault(__webpack_require__(360));\n}\n\nvar _packageRequest;\n\nfunction _load_packageRequest() {\n  return _packageRequest = _interopRequireDefault(__webpack_require__(123));\n}\n\nvar _packageReference;\n\nfunction _load_packageReference() {\n  return _packageReference = _interopRequireDefault(__webpack_require__(359));\n}\n\nvar _packageFetcher;\n\nfunction _load_packageFetcher() {\n  return _packageFetcher = _interopRequireWildcard(__webpack_require__(208));\n}\n\nvar _packageLinker;\n\nfunction _load_packageLinker() {\n  return _packageLinker = _interopRequireDefault(__webpack_require__(209));\n}\n\nvar _packageCompatibility;\n\nfunction _load_packageCompatibility() {\n  return _packageCompatibility = _interopRequireWildcard(__webpack_require__(207));\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _normalizePattern9;\n\nfunction _load_normalizePattern() {\n  return _normalizePattern9 = __webpack_require__(37);\n}\n\nvar _logicalDependencyTree;\n\nfunction _load_logicalDependencyTree() {\n  return _logicalDependencyTree = __webpack_require__(550);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = _interopRequireWildcard(__webpack_require__(18));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nvar _semver;\n\nfunction _load_semver() {\n  return _semver = _interopRequireDefault(__webpack_require__(22));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\nconst path = __webpack_require__(0);\nconst uuid = __webpack_require__(120);\nconst ssri = __webpack_require__(65);\nconst nodeVersion = process.versions.node.split('-')[0];\n\nconst noArguments = exports.noArguments = true;\n\nclass ImportResolver extends (_baseResolver || _load_baseResolver()).default {\n  getCwd() {\n    if (this.request.parentRequest) {\n      const parent = this.resolver.getStrictResolvedPattern(this.request.parentRequest.pattern);\n      invariant(parent._loc, 'expected package location');\n      return path.dirname(parent._loc);\n    }\n    return this.config.cwd;\n  }\n\n  resolveHostedGit(info, Resolver) {\n    var _normalizePattern = (0, (_normalizePattern9 || _load_normalizePattern()).normalizePattern)(this.pattern);\n\n    const range = _normalizePattern.range;\n\n    const exploded = (0, (_hostedGitResolver2 || _load_hostedGitResolver2()).explodeHostedGitFragment)(range, this.reporter);\n    const hash = info.gitHead;\n    invariant(hash, 'expected package gitHead');\n    const url = Resolver.getTarballUrl(exploded, hash);\n    info._uid = hash;\n    info._remote = {\n      resolved: url,\n      type: 'tarball',\n      registry: this.registry,\n      reference: url,\n      hash: null\n    };\n    return info;\n  }\n\n  resolveGist(info, Resolver) {\n    var _normalizePattern2 = (0, (_normalizePattern9 || _load_normalizePattern()).normalizePattern)(this.pattern);\n\n    const range = _normalizePattern2.range;\n\n    var _explodeGistFragment = (0, (_gistResolver2 || _load_gistResolver2()).explodeGistFragment)(range, this.reporter);\n\n    const id = _explodeGistFragment.id;\n\n    const hash = info.gitHead;\n    invariant(hash, 'expected package gitHead');\n    const url = `https://gist.github.com/${id}.git`;\n    info._uid = hash;\n    info._remote = {\n      resolved: `${url}#${hash}`,\n      type: 'git',\n      registry: this.registry,\n      reference: url,\n      hash\n    };\n    return info;\n  }\n\n  resolveGit(info, Resolver) {\n    const url = info._resolved;\n    const hash = info.gitHead;\n    invariant(url, 'expected package _resolved');\n    invariant(hash, 'expected package gitHead');\n    info._uid = hash;\n    info._remote = {\n      resolved: `${url}#${hash}`,\n      type: 'git',\n      registry: this.registry,\n      reference: url,\n      hash\n    };\n    return info;\n  }\n\n  resolveFile(info, Resolver) {\n    var _normalizePattern3 = (0, (_normalizePattern9 || _load_normalizePattern()).normalizePattern)(this.pattern);\n\n    const range = _normalizePattern3.range;\n\n    let loc = (_misc || _load_misc()).removePrefix(range, 'file:');\n    if (!path.isAbsolute(loc)) {\n      loc = path.join(this.config.cwd, loc);\n    }\n    info._uid = info.version;\n    info._remote = {\n      type: 'copy',\n      registry: this.registry,\n      hash: `${uuid.v4()}-${new Date().getTime()}`,\n      reference: loc\n    };\n    return info;\n  }\n\n  resolveRegistry(info) {\n    let url = info._resolved;\n    const hash = info._shasum;\n    invariant(url, 'expected package _resolved');\n    invariant(hash, 'expected package _shasum');\n    if (this.config.getOption('registry') === (_constants || _load_constants()).YARN_REGISTRY) {\n      url = url.replace((_constants || _load_constants()).NPM_REGISTRY_RE, (_constants || _load_constants()).YARN_REGISTRY);\n    }\n    info._uid = info.version;\n    info._remote = {\n      resolved: `${url}#${hash}`,\n      type: 'tarball',\n      registry: this.registry,\n      reference: url,\n      integrity: info._integrity ? ssri.parse(info._integrity) : ssri.fromHex(hash, 'sha1'),\n      hash\n    };\n    return info;\n  }\n\n  resolveImport(info) {\n    var _normalizePattern4 = (0, (_normalizePattern9 || _load_normalizePattern()).normalizePattern)(this.pattern);\n\n    const range = _normalizePattern4.range;\n\n    const Resolver = (0, (_index || _load_index()).getExoticResolver)(range);\n    if (Resolver && Resolver.prototype instanceof (_hostedGitResolver || _load_hostedGitResolver()).default) {\n      return this.resolveHostedGit(info, Resolver);\n    } else if (Resolver && Resolver === (_gistResolver || _load_gistResolver()).default) {\n      return this.resolveGist(info, Resolver);\n    } else if (Resolver && Resolver === (_gitResolver || _load_gitResolver()).default) {\n      return this.resolveGit(info, Resolver);\n    } else if (Resolver && Resolver === (_fileResolver || _load_fileResolver()).default) {\n      return this.resolveFile(info, Resolver);\n    }\n    return this.resolveRegistry(info);\n  }\n\n  resolveLocation(loc) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const info = yield _this.config.tryManifest(loc, 'npm', false);\n      if (!info) {\n        return null;\n      }\n      return _this.resolveImport(info);\n    })();\n  }\n\n  resolveFixedVersion(fixedVersionPattern) {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      var _normalizePattern5 = (0, (_normalizePattern9 || _load_normalizePattern()).normalizePattern)(fixedVersionPattern);\n\n      const range = _normalizePattern5.range;\n\n      const exoticResolver = (0, (_index || _load_index()).getExoticResolver)(range);\n      const manifest = exoticResolver ? yield _this2.request.findExoticVersionInfo(exoticResolver, range) : yield _this2.request.findVersionOnRegistry(fixedVersionPattern);\n      return manifest;\n    })();\n  }\n\n  _resolveFromFixedVersions() {\n    var _this3 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      invariant(_this3.request instanceof ImportPackageRequest, 'request must be ImportPackageRequest');\n\n      var _normalizePattern6 = (0, (_normalizePattern9 || _load_normalizePattern()).normalizePattern)(_this3.pattern);\n\n      const name = _normalizePattern6.name;\n\n      invariant(_this3.request.dependencyTree instanceof (_logicalDependencyTree || _load_logicalDependencyTree()).LogicalDependencyTree, 'dependencyTree on request must be LogicalDependencyTree');\n      const fixedVersionPattern = _this3.request.dependencyTree.getFixedVersionPattern(name, _this3.request.parentNames);\n      const info = yield _this3.config.getCache(`import-resolver-${fixedVersionPattern}`, function () {\n        return _this3.resolveFixedVersion(fixedVersionPattern);\n      });\n      if (info) {\n        return info;\n      }\n      throw new (_errors || _load_errors()).MessageError(_this3.reporter.lang('importResolveFailed', name, _this3.getCwd()));\n    })();\n  }\n\n  _resolveFromNodeModules() {\n    var _this4 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      var _normalizePattern7 = (0, (_normalizePattern9 || _load_normalizePattern()).normalizePattern)(_this4.pattern);\n\n      const name = _normalizePattern7.name;\n\n      let cwd = _this4.getCwd();\n      while (!path.relative(_this4.config.cwd, cwd).startsWith('..')) {\n        const loc = path.join(cwd, 'node_modules', name);\n        const info = yield _this4.config.getCache(`import-resolver-${loc}`, function () {\n          return _this4.resolveLocation(loc);\n        });\n        if (info) {\n          return info;\n        }\n        cwd = path.resolve(cwd, '../..');\n      }\n      throw new (_errors || _load_errors()).MessageError(_this4.reporter.lang('importResolveFailed', name, _this4.getCwd()));\n    })();\n  }\n\n  resolve() {\n    if (this.request instanceof ImportPackageRequest && this.request.dependencyTree) {\n      return this._resolveFromFixedVersions();\n    } else {\n      return this._resolveFromNodeModules();\n    }\n  }\n}\n\nclass ImportPackageRequest extends (_packageRequest || _load_packageRequest()).default {\n  constructor(req, dependencyTree, resolver) {\n    super(req, resolver);\n    this.import = this.parentRequest instanceof ImportPackageRequest ? this.parentRequest.import : true;\n    this.dependencyTree = dependencyTree;\n  }\n\n  getRootName() {\n    return this.resolver instanceof ImportPackageResolver && this.resolver.rootName || 'root';\n  }\n\n  getParentHumanName() {\n    return [this.getRootName()].concat(this.parentNames).join(' > ');\n  }\n\n  reportResolvedRangeMatch(info, resolved) {\n    if (info.version === resolved.version) {\n      return;\n    }\n    this.reporter.warn(this.reporter.lang('importResolvedRangeMatch', resolved.version, resolved.name, info.version, this.getParentHumanName()));\n  }\n\n  _findResolvedManifest(info) {\n    var _normalizePattern8 = (0, (_normalizePattern9 || _load_normalizePattern()).normalizePattern)(this.pattern);\n\n    const range = _normalizePattern8.range,\n          name = _normalizePattern8.name;\n\n    const solvedRange = (_semver || _load_semver()).default.validRange(range) ? info.version : range;\n    const resolved = this.resolver.getExactVersionMatch(name, solvedRange, info);\n    if (resolved) {\n      return resolved;\n    }\n    invariant(info._remote, 'expected package remote');\n    const ref = new (_packageReference || _load_packageReference()).default(this, info, info._remote);\n    info._reference = ref;\n    return info;\n  }\n\n  resolveToExistingVersion(info) {\n    const resolved = this._findResolvedManifest(info);\n    invariant(resolved, 'should have found a resolved reference');\n    const ref = resolved._reference;\n    invariant(ref, 'should have a package reference');\n    ref.addRequest(this);\n    ref.addPattern(this.pattern, resolved);\n    ref.addOptional(this.optional);\n  }\n\n  findVersionInfo() {\n    if (!this.import) {\n      this.reporter.verbose(this.reporter.lang('skippingImport', this.pattern, this.getParentHumanName()));\n      return super.findVersionInfo();\n    }\n    const resolver = new ImportResolver(this, this.pattern);\n    return resolver.resolve().catch(() => {\n      this.import = false;\n      this.reporter.warn(this.reporter.lang('importFailed', this.pattern, this.getParentHumanName()));\n      return super.findVersionInfo();\n    });\n  }\n}\n\nclass ImportPackageResolver extends (_packageResolver || _load_packageResolver()).default {\n  constructor(config, lockfile) {\n    super(config, lockfile);\n    this.next = [];\n    this.rootName = 'root';\n  }\n\n  find(req) {\n    this.next.push(req);\n    return Promise.resolve();\n  }\n\n  findOne(req) {\n    var _this5 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      if (_this5.activity) {\n        _this5.activity.tick(req.pattern);\n      }\n      const request = new ImportPackageRequest(req, _this5.dependencyTree, _this5);\n      yield request.find({ fresh: false });\n    })();\n  }\n\n  findAll(deps) {\n    var _this6 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield Promise.all(deps.map(function (dep) {\n        return _this6.findOne(dep);\n      }));\n      deps = _this6.next;\n      _this6.next = [];\n      if (!deps.length) {\n        // all required package versions have been discovered, so now packages that\n        // resolved to existing versions can be resolved to their best available version\n        _this6.resolvePackagesWithExistingVersions();\n        return;\n      }\n      yield _this6.findAll(deps);\n    })();\n  }\n\n  resetOptional() {\n    for (const pattern in this.patterns) {\n      const ref = this.patterns[pattern]._reference;\n      invariant(ref, 'expected reference');\n      ref.optional = null;\n      for (var _iterator = ref.requests, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref = _i.value;\n        }\n\n        const req = _ref;\n\n        ref.addOptional(req.optional);\n      }\n    }\n  }\n\n  init(deps, { isFlat, isFrozen, workspaceLayout } = { isFlat: false, isFrozen: false, workspaceLayout: undefined }) {\n    var _this7 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      _this7.flat = Boolean(isFlat);\n      const activity = _this7.activity = _this7.reporter.activity();\n      yield _this7.findAll(deps);\n      _this7.resetOptional();\n      activity.end();\n      _this7.activity = null;\n    })();\n  }\n}\n\nclass Import extends (_install || _load_install()).Install {\n  constructor(flags, config, reporter, lockfile) {\n    super(flags, config, reporter, lockfile);\n    this.resolver = new ImportPackageResolver(this.config, this.lockfile);\n    this.linker = new (_packageLinker || _load_packageLinker()).default(config, this.resolver);\n  }\n  createLogicalDependencyTree(packageJson, packageLock) {\n    invariant(packageJson, 'package.json should exist');\n    invariant(packageLock, 'package-lock.json should exist');\n    invariant(this.resolver instanceof ImportPackageResolver, 'resolver should be an ImportPackageResolver');\n    try {\n      this.resolver.dependencyTree = new (_logicalDependencyTree || _load_logicalDependencyTree()).LogicalDependencyTree(packageJson, packageLock);\n    } catch (e) {\n      throw new (_errors || _load_errors()).MessageError(this.reporter.lang('importSourceFilesCorrupted'));\n    }\n  }\n  getExternalLockfileContents() {\n    var _this8 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      try {\n        var _ref2 = yield Promise.all([(_fs || _load_fs()).readFile(path.join(_this8.config.cwd, (_constants || _load_constants()).NODE_PACKAGE_JSON)), (_fs || _load_fs()).readFile(path.join(_this8.config.cwd, (_constants || _load_constants()).NPM_LOCK_FILENAME))]);\n\n        const packageJson = _ref2[0],\n              packageLock = _ref2[1];\n\n        return { packageJson, packageLock };\n      } catch (e) {\n        return { packageJson: null, packageLock: null };\n      }\n    })();\n  }\n  init() {\n    var _this9 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      if (yield (_fs || _load_fs()).exists(path.join(_this9.config.cwd, (_constants || _load_constants()).LOCKFILE_FILENAME))) {\n        throw new (_errors || _load_errors()).MessageError(_this9.reporter.lang('lockfileExists'));\n      }\n\n      var _ref3 = yield _this9.getExternalLockfileContents();\n\n      const packageJson = _ref3.packageJson,\n            packageLock = _ref3.packageLock;\n\n      const importSource = packageJson && packageLock && (_semver || _load_semver()).default.satisfies(nodeVersion, '>=5.0.0') ? 'package-lock.json' : 'node_modules';\n      if (importSource === 'package-lock.json') {\n        _this9.reporter.info(_this9.reporter.lang('importPackageLock'));\n        _this9.createLogicalDependencyTree(packageJson, packageLock);\n      }\n      if (importSource === 'node_modules') {\n        _this9.reporter.info(_this9.reporter.lang('importNodeModules'));\n        yield (0, (_check || _load_check()).verifyTreeCheck)(_this9.config, _this9.reporter, {}, []);\n      }\n\n      var _ref4 = yield _this9.fetchRequestFromCwd();\n\n      const requests = _ref4.requests,\n            patterns = _ref4.patterns,\n            manifest = _ref4.manifest;\n\n      if (manifest.name && _this9.resolver instanceof ImportPackageResolver) {\n        _this9.resolver.rootName = manifest.name;\n      }\n      yield _this9.resolver.init(requests, { isFlat: _this9.flags.flat, isFrozen: _this9.flags.frozenLockfile });\n      const manifests = yield (_packageFetcher || _load_packageFetcher()).fetch(_this9.resolver.getManifests(), _this9.config);\n      _this9.resolver.updateManifests(manifests);\n      yield (_packageCompatibility || _load_packageCompatibility()).check(_this9.resolver.getManifests(), _this9.config, _this9.flags.ignoreEngines);\n      yield _this9.linker.resolvePeerModules();\n      yield _this9.saveLockfileAndIntegrity(patterns);\n      return patterns;\n    })();\n  }\n}\n\nexports.Import = Import;\nfunction setFlags(commander) {\n  commander.description('Generates yarn.lock from an npm package-lock.json file or an existing npm-installed node_modules folder.');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 501 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    if (args.length > 2) {\n      reporter.error(reporter.lang('tooManyArguments', 2));\n      return;\n    }\n\n    let packageName = args.shift() || '.';\n\n    // Handle the case when we are referencing a local package.\n    if (packageName === '.') {\n      packageName = (yield config.readRootManifest()).name;\n    }\n\n    const packageInput = (_npmRegistry || _load_npmRegistry()).default.escapeName(packageName);\n\n    var _parsePackageName = (0, (_parsePackageName2 || _load_parsePackageName()).default)(packageInput);\n\n    const name = _parsePackageName.name,\n          version = _parsePackageName.version;\n\n\n    let result;\n    try {\n      result = yield config.registries.npm.request(name, { unfiltered: true });\n    } catch (e) {\n      reporter.error(reporter.lang('infoFail'));\n      return;\n    }\n    if (!result) {\n      reporter.error(reporter.lang('infoFail'));\n      return;\n    }\n\n    result = clean(result);\n\n    const versions = result.versions;\n    // $FlowFixMe\n    result.versions = Object.keys(versions).sort(semver.compareLoose);\n    result.version = version || result['dist-tags'].latest;\n    result = Object.assign(result, versions[result.version]);\n\n    const fieldPath = args.shift();\n    const fields = fieldPath ? fieldPath.split('.') : [];\n\n    // Readmes can be long so exclude them unless explicitly asked for.\n    if (fields[0] !== 'readme') {\n      delete result.readme;\n    }\n\n    result = fields.reduce(function (prev, cur) {\n      return prev && prev[cur];\n    }, result);\n    reporter.inspect(result);\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _npmRegistry;\n\nfunction _load_npmRegistry() {\n  return _npmRegistry = _interopRequireDefault(__webpack_require__(88));\n}\n\nvar _parsePackageName2;\n\nfunction _load_parsePackageName() {\n  return _parsePackageName2 = _interopRequireDefault(__webpack_require__(556));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst semver = __webpack_require__(22);\n\nfunction clean(object) {\n  if (Array.isArray(object)) {\n    const result = [];\n    object.forEach(item => {\n      item = clean(item);\n      if (item) {\n        result.push(item);\n      }\n    });\n    return result;\n  } else if (typeof object === 'object') {\n    const result = {};\n    for (const key in object) {\n      if (key.startsWith('_')) {\n        continue;\n      }\n\n      const item = clean(object[key]);\n      if (item) {\n        result[key] = item;\n      }\n    }\n    return result;\n  } else if (object) {\n    return object;\n  } else {\n    return null;\n  }\n}\n\nfunction setFlags(commander) {\n  commander.description('Shows information about a package.');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 502 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getGitConfigInfo = exports.run = exports.shouldRunInCurrentCwd = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const installVersion = flags[`2`] ? `berry` : flags.install;\n    const forwardedArgs = process.argv.slice(process.argv.indexOf('init', 2) + 1);\n\n    if (installVersion) {\n      if (flags[`2`] && process.env.COREPACK_ROOT) {\n        yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, [path.join(process.env.COREPACK_ROOT, 'dist/corepack.js'), `yarn@${flags.install || `stable`}`, `init`, ...forwardedArgs, `--install=self`], {\n          stdio: 'inherit',\n          cwd: config.cwd\n        });\n      } else {\n        const lockfilePath = path.resolve(config.cwd, 'yarn.lock');\n        if (!(yield (_fs || _load_fs()).exists(lockfilePath))) {\n          yield (_fs || _load_fs()).writeFile(lockfilePath, '');\n        }\n        yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, [process.argv[1], 'policies', 'set-version', installVersion, '--silent'], {\n          stdio: 'inherit',\n          cwd: config.cwd\n        });\n        yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, [process.argv[1], 'init', ...forwardedArgs], {\n          stdio: 'inherit',\n          cwd: config.cwd\n        });\n      }\n      return;\n    }\n\n    const manifests = yield config.getRootManifests();\n\n    let repository = {};\n    const author = {\n      name: config.getOption('init-author-name'),\n      email: config.getOption('init-author-email'),\n      url: config.getOption('init-author-url')\n    };\n    if (yield (_fs || _load_fs()).exists(path.join(config.cwd, '.git'))) {\n      // get git origin of the cwd\n      try {\n        repository = {\n          type: 'git',\n          url: yield (_child || _load_child()).spawn('git', ['config', 'remote.origin.url'], {\n            cwd: config.cwd\n          })\n        };\n      } catch (ex) {\n        // Ignore - Git repo may not have an origin URL yet (eg. if it only exists locally)\n      }\n\n      if (author.name === undefined) {\n        author.name = yield getGitConfigInfo('user.name');\n      }\n\n      if (author.email === undefined) {\n        author.email = yield getGitConfigInfo('user.email');\n      }\n    }\n\n    const keys = [{\n      key: 'name',\n      question: 'name',\n      default: path.basename(config.cwd),\n      validation: (_validate || _load_validate()).isValidPackageName,\n      validationError: 'invalidPackageName'\n    }, {\n      key: 'version',\n      question: 'version',\n      default: String(config.getOption('init-version'))\n    }, {\n      key: 'description',\n      question: 'description',\n      default: ''\n    }, {\n      key: 'main',\n      question: 'entry point',\n      default: 'index.js'\n    }, {\n      key: 'repository',\n      question: 'repository url',\n      default: (0, (_util || _load_util()).extractRepositoryUrl)(repository)\n    }, {\n      key: 'author',\n      question: 'author',\n      default: (0, (_util || _load_util()).stringifyPerson)(author)\n    }, {\n      key: 'license',\n      question: 'license',\n      default: String(config.getOption('init-license'))\n    }, {\n      key: 'private',\n      question: 'private',\n      default: config.getOption('init-private') || '',\n      inputFormatter: yn\n    }];\n\n    // get answers\n    const pkg = {};\n    for (var _iterator = keys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref2;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref2 = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref2 = _i.value;\n      }\n\n      const entry = _ref2;\n      const yes = flags.yes,\n            privateFlag = flags.private;\n      const manifestKey = entry.key;\n      let question = entry.question,\n          def = entry.default;\n\n\n      for (var _iterator4 = (_index || _load_index()).registryNames, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n        var _ref5;\n\n        if (_isArray4) {\n          if (_i4 >= _iterator4.length) break;\n          _ref5 = _iterator4[_i4++];\n        } else {\n          _i4 = _iterator4.next();\n          if (_i4.done) break;\n          _ref5 = _i4.value;\n        }\n\n        const registryName = _ref5;\n        const object = manifests[registryName].object;\n\n        let val = objectPath.get(object, manifestKey);\n        if (!val) {\n          break;\n        }\n        if (typeof val === 'object') {\n          if (manifestKey === 'author') {\n            val = (0, (_util || _load_util()).stringifyPerson)(val);\n          } else if (manifestKey === 'repository') {\n            val = (0, (_util || _load_util()).extractRepositoryUrl)(val);\n          }\n        }\n        def = val;\n      }\n\n      if (manifestKey === 'private' && privateFlag) {\n        def = true;\n      }\n\n      if (def) {\n        question += ` (${String(def)})`;\n      }\n\n      let answer;\n      let validAnswer = false;\n\n      if (yes) {\n        answer = def;\n      } else {\n        // loop until a valid answer is provided, if validation is on entry\n        if (entry.validation) {\n          while (!validAnswer) {\n            answer = (yield reporter.question(question)) || def;\n            // validate answer\n            if (entry.validation(String(answer))) {\n              validAnswer = true;\n            } else {\n              reporter.error(reporter.lang('invalidPackageName'));\n            }\n          }\n        } else {\n          answer = (yield reporter.question(question)) || def;\n        }\n      }\n\n      if (answer) {\n        if (entry.inputFormatter) {\n          answer = entry.inputFormatter(answer);\n        }\n        objectPath.set(pkg, manifestKey, answer);\n      }\n    }\n\n    if (pkg.repository && (_githubResolver || _load_githubResolver()).default.isVersion(pkg.repository)) {\n      pkg.repository = `https://github.com/${pkg.repository}`;\n    }\n\n    // save answers\n    const targetManifests = [];\n    for (var _iterator2 = (_index || _load_index()).registryNames, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n      var _ref3;\n\n      if (_isArray2) {\n        if (_i2 >= _iterator2.length) break;\n        _ref3 = _iterator2[_i2++];\n      } else {\n        _i2 = _iterator2.next();\n        if (_i2.done) break;\n        _ref3 = _i2.value;\n      }\n\n      const registryName = _ref3;\n\n      const info = manifests[registryName];\n      if (info.exists) {\n        targetManifests.push(info);\n      }\n    }\n    if (!targetManifests.length) {\n      targetManifests.push(manifests.npm);\n    }\n    for (var _iterator3 = targetManifests, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n      var _ref4;\n\n      if (_isArray3) {\n        if (_i3 >= _iterator3.length) break;\n        _ref4 = _iterator3[_i3++];\n      } else {\n        _i3 = _iterator3.next();\n        if (_i3.done) break;\n        _ref4 = _i3.value;\n      }\n\n      const targetManifest = _ref4;\n\n      Object.assign(targetManifest.object, pkg);\n      reporter.success(`Saved ${path.basename(targetManifest.loc)}`);\n    }\n\n    yield config.saveRootManifests(manifests);\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet getGitConfigInfo = exports.getGitConfigInfo = (() => {\n  var _ref6 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (credential, spawn = (_child || _load_child()).spawn) {\n    try {\n      // try to get author default based on git config\n      return yield spawn('git', ['config', credential]);\n    } catch (e) {\n      return '';\n    }\n  });\n\n  return function getGitConfigInfo(_x5) {\n    return _ref6.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _util;\n\nfunction _load_util() {\n  return _util = __webpack_require__(219);\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = __webpack_require__(58);\n}\n\nvar _githubResolver;\n\nfunction _load_githubResolver() {\n  return _githubResolver = _interopRequireDefault(__webpack_require__(361));\n}\n\nvar _child;\n\nfunction _load_child() {\n  return _child = _interopRequireWildcard(__webpack_require__(50));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _validate;\n\nfunction _load_validate() {\n  return _validate = _interopRequireWildcard(__webpack_require__(126));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst objectPath = __webpack_require__(304);\n\nconst path = __webpack_require__(0);\nconst yn = __webpack_require__(962);\n\nfunction setFlags(commander) {\n  commander.description('Interactively creates or updates a package.json file.');\n  commander.option('-y, --yes', 'use default options');\n  commander.option('-p, --private', 'use default options and private true');\n  commander.option('-i, --install <value>', 'install a specific Yarn release');\n  commander.option('-2', 'generates the project using Yarn 2');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\nconst shouldRunInCurrentCwd = exports.shouldRunInCurrentCwd = true;\n\n/***/ }),\n/* 503 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.examples = exports.run = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet getManifests = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, flags) {\n    const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.cwd);\n    const install = new (_install || _load_install()).Install((0, (_extends2 || _load_extends()).default)({ skipIntegrityCheck: true }, flags), config, new (_baseReporter || _load_baseReporter()).default(), lockfile);\n    yield install.hydrate(true);\n\n    let manifests = install.resolver.getManifests();\n\n    // sort by name\n    manifests = manifests.sort(function (a, b) {\n      if (!a.name && !b.name) {\n        return 0;\n      }\n\n      if (!a.name) {\n        return 1;\n      }\n\n      if (!b.name) {\n        return -1;\n      }\n\n      return a.name.localeCompare(b.name);\n    });\n\n    // filter ignored manifests\n    manifests = manifests.filter(function (manifest) {\n      const ref = manifest._reference;\n      return !!ref && !ref.ignore;\n    });\n\n    return manifests;\n  });\n\n  return function getManifests(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet list = (() => {\n  var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const manifests = yield getManifests(config, flags);\n    const manifestsByLicense = new Map();\n\n    for (var _iterator = manifests, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref4;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref4 = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref4 = _i.value;\n      }\n\n      const _ref3 = _ref4;\n      const name = _ref3.name,\n            version = _ref3.version,\n            license = _ref3.license,\n            repository = _ref3.repository,\n            homepage = _ref3.homepage,\n            author = _ref3.author;\n\n      const licenseKey = license || 'UNKNOWN';\n      const url = repository ? repository.url : homepage;\n      const vendorUrl = homepage || author && author.url;\n      const vendorName = author && author.name;\n\n      if (!manifestsByLicense.has(licenseKey)) {\n        manifestsByLicense.set(licenseKey, new Map());\n      }\n\n      const byLicense = manifestsByLicense.get(licenseKey);\n      invariant(byLicense, 'expected value');\n      byLicense.set(`${name}@${version}`, {\n        name,\n        version,\n        url,\n        vendorUrl,\n        vendorName\n      });\n    }\n\n    if (flags.json) {\n      const body = [];\n\n      manifestsByLicense.forEach(function (license, licenseKey) {\n        license.forEach(function ({ name, version, url, vendorUrl, vendorName }) {\n          body.push([name, version, licenseKey, url || 'Unknown', vendorUrl || 'Unknown', vendorName || 'Unknown']);\n        });\n      });\n\n      reporter.table(['Name', 'Version', 'License', 'URL', 'VendorUrl', 'VendorName'], body);\n    } else {\n      const trees = [];\n\n      manifestsByLicense.forEach(function (license, licenseKey) {\n        const licenseTree = [];\n\n        license.forEach(function ({ name, version, url, vendorUrl, vendorName }) {\n          const children = [];\n\n          if (url) {\n            children.push({ name: `${reporter.format.bold('URL:')} ${url}` });\n          }\n\n          if (vendorUrl) {\n            children.push({ name: `${reporter.format.bold('VendorUrl:')} ${vendorUrl}` });\n          }\n\n          if (vendorName) {\n            children.push({ name: `${reporter.format.bold('VendorName:')} ${vendorName}` });\n          }\n\n          licenseTree.push({\n            name: `${name}@${version}`,\n            children\n          });\n        });\n\n        trees.push({\n          name: licenseKey,\n          children: licenseTree\n        });\n      });\n\n      reporter.tree('licenses', trees, { force: true });\n    }\n  });\n\n  return function list(_x3, _x4, _x5, _x6) {\n    return _ref2.apply(this, arguments);\n  };\n})();\n\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\n\nvar _baseReporter;\n\nfunction _load_baseReporter() {\n  return _baseReporter = _interopRequireDefault(__webpack_require__(108));\n}\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _buildSubCommands2;\n\nfunction _load_buildSubCommands() {\n  return _buildSubCommands2 = _interopRequireDefault(__webpack_require__(59));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nfunction hasWrapper(flags, args) {\n  return args[0] != 'generate-disclaimer';\n}\n\nfunction setFlags(commander) {\n  commander.description('Lists licenses for installed packages.');\n}\n\nvar _buildSubCommands = (0, (_buildSubCommands2 || _load_buildSubCommands()).default)('licenses', {\n  ls(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      reporter.warn(`\\`yarn licenses ls\\` is deprecated. Please use \\`yarn licenses list\\`.`);\n      yield list(config, reporter, flags, args);\n    })();\n  },\n\n  list(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield list(config, reporter, flags, args);\n    })();\n  },\n\n  generateDisclaimer(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      /* eslint-disable no-console */\n\n      // `reporter.log` dumps a bunch of ANSI escapes to clear the current line and\n      // is for abstracting the console output so it can be consumed by other tools\n      // (JSON output being the primary one). This command is only for text consumption\n      // and you should just be dumping it to a TXT file. Using a reporter here has the\n      // potential to mess up the output since it might print ansi escapes.\n      const manifests = yield getManifests(config, flags);\n      const manifest = yield config.readRootManifest();\n\n      // Create a map of license text to manifest so that packages with exactly\n      // the same license text are grouped together.\n      const manifestsByLicense = new Map();\n      for (var _iterator2 = manifests, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref5;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref5 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref5 = _i2.value;\n        }\n\n        const manifest = _ref5;\n        const licenseText = manifest.licenseText,\n              noticeText = manifest.noticeText;\n\n        let licenseKey;\n        if (!licenseText) {\n          continue;\n        }\n\n        if (!noticeText) {\n          licenseKey = licenseText;\n        } else {\n          licenseKey = `${licenseText}\\n\\nNOTICE\\n\\n${noticeText}`;\n        }\n\n        if (!manifestsByLicense.has(licenseKey)) {\n          manifestsByLicense.set(licenseKey, new Map());\n        }\n\n        const byLicense = manifestsByLicense.get(licenseKey);\n        invariant(byLicense, 'expected value');\n        byLicense.set(manifest.name, manifest);\n      }\n\n      console.log('THE FOLLOWING SETS FORTH ATTRIBUTION NOTICES FOR THIRD PARTY SOFTWARE THAT MAY BE CONTAINED ' + `IN PORTIONS OF THE ${String(manifest.name).toUpperCase().replace(/-/g, ' ')} PRODUCT.`);\n      console.log();\n\n      for (var _iterator3 = manifestsByLicense, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n        var _ref7;\n\n        if (_isArray3) {\n          if (_i3 >= _iterator3.length) break;\n          _ref7 = _iterator3[_i3++];\n        } else {\n          _i3 = _iterator3.next();\n          if (_i3.done) break;\n          _ref7 = _i3.value;\n        }\n\n        const _ref6 = _ref7;\n        const licenseKey = _ref6[0];\n        const manifests = _ref6[1];\n\n        console.log('-----');\n        console.log();\n\n        const names = [];\n        const urls = [];\n        for (var _iterator4 = manifests, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n          var _ref9;\n\n          if (_isArray4) {\n            if (_i4 >= _iterator4.length) break;\n            _ref9 = _iterator4[_i4++];\n          } else {\n            _i4 = _iterator4.next();\n            if (_i4.done) break;\n            _ref9 = _i4.value;\n          }\n\n          const _ref8 = _ref9;\n          const name = _ref8[0];\n          const repository = _ref8[1].repository;\n\n          names.push(name);\n          if (repository && repository.url) {\n            urls.push(manifests.size === 1 ? repository.url : `${repository.url} (${name})`);\n          }\n        }\n\n        const heading = [];\n        heading.push(`The following software may be included in this product: ${names.join(', ')}.`);\n        if (urls.length > 0) {\n          heading.push(`A copy of the source code may be downloaded from ${urls.join(', ')}.`);\n        }\n        heading.push('This software contains the following license and notice below:');\n\n        console.log(heading.join(' '));\n        console.log();\n\n        if (licenseKey) {\n          console.log(licenseKey.trim());\n        } else {\n          // what do we do here? base it on `license`?\n        }\n\n        console.log();\n      }\n    })();\n  }\n});\n\nconst run = _buildSubCommands.run,\n      examples = _buildSubCommands.examples;\nexports.run = run;\nexports.examples = examples;\n\n/***/ }),\n/* 504 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    yield config.registries.yarn.saveHomeConfig({\n      username: undefined,\n      email: undefined\n    });\n\n    reporter.success(reporter.lang('clearedCredentials'));\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction setFlags(commander) {\n  commander.description('Clears registry username and email.');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 505 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const pnpPath = `${config.lockfileFolder}/${(_constants || _load_constants()).PNP_FILENAME}`;\n\n    let nodeOptions = process.env.NODE_OPTIONS || '';\n    if (yield (_fs || _load_fs()).exists(pnpPath)) {\n      nodeOptions = `--require ${pnpPath} ${nodeOptions}`;\n    }\n\n    try {\n      yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, args, {\n        stdio: 'inherit',\n        cwd: flags.into || config.cwd,\n        env: (0, (_extends2 || _load_extends()).default)({}, process.env, { NODE_OPTIONS: nodeOptions })\n      });\n    } catch (err) {\n      throw err;\n    }\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _child;\n\nfunction _load_child() {\n  return _child = _interopRequireWildcard(__webpack_require__(50));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction setFlags(commander) {\n  commander.description('Runs Node with the same version that the one used by Yarn itself, and by default from the project root');\n  commander.usage('node [--into PATH] [... args]');\n  commander.option('--into <path>', 'Sets the cwd to the specified location');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 506 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.requireLockfile = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.lockfileFolder);\n    const install = new (_install || _load_install()).Install((0, (_extends2 || _load_extends()).default)({}, flags, { includeWorkspaceDeps: true }), config, reporter, lockfile);\n    let deps = yield (_packageRequest || _load_packageRequest()).default.getOutdatedPackages(lockfile, install, config, reporter);\n\n    if (args.length) {\n      const requested = new Set(args);\n\n      deps = deps.filter(function ({ name }) {\n        return requested.has(name);\n      });\n    }\n\n    const getNameFromHint = function getNameFromHint(hint) {\n      return hint ? `${hint}Dependencies` : 'dependencies';\n    };\n    const colorizeName = function colorizeName({ current, latest, name }) {\n      return reporter.format[(0, (_colorForVersions || _load_colorForVersions()).default)(current, latest)](name);\n    };\n\n    if (deps.length) {\n      const usesWorkspaces = !!config.workspaceRootFolder;\n      const body = deps.map(function (info) {\n        const row = [colorizeName(info), info.current, (0, (_colorizeDiff || _load_colorizeDiff()).default)(info.current, info.wanted, reporter), reporter.format.cyan(info.latest), info.workspaceName || '', getNameFromHint(info.hint), reporter.format.cyan(info.url)];\n        if (!usesWorkspaces) {\n          row.splice(4, 1);\n        }\n        return row;\n      });\n\n      const red = reporter.format.red('<red>');\n      const yellow = reporter.format.yellow('<yellow>');\n      const green = reporter.format.green('<green>');\n      reporter.info(reporter.lang('legendColorsForVersionUpdates', red, yellow, green));\n\n      const header = ['Package', 'Current', 'Wanted', 'Latest', 'Workspace', 'Package Type', 'URL'];\n      if (!usesWorkspaces) {\n        header.splice(4, 1);\n      }\n      reporter.table(header, body);\n\n      return 1;\n    }\n    return 0;\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _packageRequest;\n\nfunction _load_packageRequest() {\n  return _packageRequest = _interopRequireDefault(__webpack_require__(123));\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nvar _colorForVersions;\n\nfunction _load_colorForVersions() {\n  return _colorForVersions = _interopRequireDefault(__webpack_require__(363));\n}\n\nvar _colorizeDiff;\n\nfunction _load_colorizeDiff() {\n  return _colorizeDiff = _interopRequireDefault(__webpack_require__(364));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst requireLockfile = exports.requireLockfile = true;\n\nfunction setFlags(commander) {\n  commander.description('Checks for outdated package dependencies.');\n  commander.usage('outdated [packages ...]');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 507 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.examples = exports.hasWrapper = exports.run = exports.mutate = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet mutate = exports.mutate = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (args, config, reporter, buildMessages, mutator) {\n    if (args.length !== 2 && args.length !== 1) {\n      return false;\n    }\n\n    const username = args.shift();\n    const name = yield (0, (_tag || _load_tag()).getName)(args, config);\n    if (!(0, (_validate || _load_validate()).isValidPackageName)(name)) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('invalidPackageName'));\n    }\n\n    const msgs = buildMessages(username, name);\n    reporter.step(1, 3, reporter.lang('loggingIn'));\n    const revoke = yield (0, (_login || _load_login()).getToken)(config, reporter, name);\n\n    reporter.step(2, 3, msgs.info);\n    const user = yield config.registries.npm.request(`-/user/org.couchdb.user:${username}`);\n    let error = false;\n    if (user) {\n      // get package\n      const pkg = yield config.registries.npm.request((_npmRegistry || _load_npmRegistry()).default.escapeName(name));\n      if (pkg) {\n        pkg.maintainers = pkg.maintainers || [];\n        error = mutator({ name: user.name, email: user.email }, pkg);\n      } else {\n        error = true;\n        reporter.error(reporter.lang('unknownPackage', name));\n      }\n\n      // update package\n      if (pkg && !error) {\n        const res = yield config.registries.npm.request(`${(_npmRegistry || _load_npmRegistry()).default.escapeName(name)}/-rev/${pkg._rev}`, {\n          method: 'PUT',\n          body: {\n            _id: pkg._id,\n            _rev: pkg._rev,\n            maintainers: pkg.maintainers\n          }\n        });\n\n        if (res != null && res.success) {\n          reporter.success(msgs.success);\n        } else {\n          error = true;\n          reporter.error(msgs.error);\n        }\n      }\n    } else {\n      error = true;\n      reporter.error(reporter.lang('unknownUser', username));\n    }\n\n    reporter.step(3, 3, reporter.lang('revokingToken'));\n    yield revoke();\n\n    if (error) {\n      throw new Error();\n    } else {\n      return true;\n    }\n  });\n\n  return function mutate(_x, _x2, _x3, _x4, _x5) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet list = (() => {\n  var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    if (args.length > 1) {\n      return false;\n    }\n    const name = yield (0, (_tag || _load_tag()).getName)(args, config);\n    reporter.step(1, 1, reporter.lang('ownerGetting', name));\n    const pkg = yield config.registries.npm.request(name, { unfiltered: true });\n    if (pkg) {\n      const owners = pkg.maintainers;\n      if (!owners || !owners.length) {\n        reporter.warn(reporter.lang('ownerNone'));\n      } else {\n        for (var _iterator = owners, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n          var _ref3;\n\n          if (_isArray) {\n            if (_i >= _iterator.length) break;\n            _ref3 = _iterator[_i++];\n          } else {\n            _i = _iterator.next();\n            if (_i.done) break;\n            _ref3 = _i.value;\n          }\n\n          const owner = _ref3;\n\n          reporter.info(`${owner.name} <${owner.email}>`);\n        }\n      }\n    } else {\n      reporter.error(reporter.lang('ownerGettingFailed'));\n    }\n\n    if (pkg) {\n      return true;\n    } else {\n      throw new Error();\n    }\n  });\n\n  return function list(_x6, _x7, _x8, _x9) {\n    return _ref2.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _buildSubCommands2;\n\nfunction _load_buildSubCommands() {\n  return _buildSubCommands2 = _interopRequireDefault(__webpack_require__(59));\n}\n\nvar _validate;\n\nfunction _load_validate() {\n  return _validate = __webpack_require__(126);\n}\n\nvar _tag;\n\nfunction _load_tag() {\n  return _tag = __webpack_require__(355);\n}\n\nvar _login;\n\nfunction _load_login() {\n  return _login = __webpack_require__(107);\n}\n\nvar _npmRegistry;\n\nfunction _load_npmRegistry() {\n  return _npmRegistry = _interopRequireDefault(__webpack_require__(88));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction remove(config, reporter, flags, args) {\n  return mutate(args, config, reporter, (username, name) => ({\n    info: reporter.lang('ownerRemoving', username, name),\n    success: reporter.lang('ownerRemoved'),\n    error: reporter.lang('ownerRemoveError')\n  }), (user, pkg) => {\n    let found = false;\n\n    pkg.maintainers = pkg.maintainers.filter(o => {\n      const match = o.name === user.name;\n      found = found || match;\n      return !match;\n    });\n\n    if (!found) {\n      reporter.error(reporter.lang('userNotAnOwner', user.name));\n    }\n\n    return found;\n  });\n}\n\nfunction setFlags(commander) {\n  commander.description('Manages package owners.');\n}\n\nvar _buildSubCommands = (0, (_buildSubCommands2 || _load_buildSubCommands()).default)('owner', {\n  add(config, reporter, flags, args) {\n    return mutate(args, config, reporter, (username, name) => ({\n      info: reporter.lang('ownerAdding', username, name),\n      success: reporter.lang('ownerAdded'),\n      error: reporter.lang('ownerAddingFailed')\n    }), (user, pkg) => {\n      for (var _iterator2 = pkg.maintainers, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref4;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref4 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref4 = _i2.value;\n        }\n\n        const owner = _ref4;\n\n        if (owner.name === user) {\n          reporter.error(reporter.lang('ownerAlready'));\n          return true;\n        }\n      }\n\n      pkg.maintainers.push(user);\n\n      return false;\n    });\n  },\n\n  rm(config, reporter, flags, args) {\n    reporter.warn(`\\`yarn owner rm\\` is deprecated. Please use \\`yarn owner remove\\`.`);\n    return remove(config, reporter, flags, args);\n  },\n\n  remove(config, reporter, flags, args) {\n    return remove(config, reporter, flags, args);\n  },\n\n  ls(config, reporter, flags, args) {\n    reporter.warn(`\\`yarn owner ls\\` is deprecated. Please use \\`yarn owner list\\`.`);\n    return list(config, reporter, flags, args);\n  },\n\n  list(config, reporter, flags, args) {\n    return list(config, reporter, flags, args);\n  }\n}, ['add <user> [[<@scope>/]<pkg>]', 'remove <user> [[<@scope>/]<pkg>]', 'list [<@scope>/]<pkg>']);\n\nconst run = _buildSubCommands.run,\n      hasWrapper = _buildSubCommands.hasWrapper,\n      examples = _buildSubCommands.examples;\nexports.run = run;\nexports.hasWrapper = hasWrapper;\nexports.examples = examples;\n\n/***/ }),\n/* 508 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.examples = exports.setFlags = exports.run = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet fetchReleases = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, { includePrereleases = false } = {}) {\n    const token = process.env.GITHUB_TOKEN;\n    const tokenUrlParameter = token ? `?access_token=${token}` : '';\n\n    const request = yield config.requestManager.request({\n      url: `https://api.github.com/repos/yarnpkg/yarn/releases${tokenUrlParameter}`,\n      json: true\n    });\n\n    const releases = request.filter(function (release) {\n      if (release.draft) {\n        return false;\n      }\n\n      if (release.prerelease && !includePrereleases) {\n        return false;\n      }\n\n      // $FlowFixMe\n      release.version = semver.coerce(release.tag_name);\n\n      if (!release.version) {\n        return false;\n      }\n\n      if (!getBundleAsset(release)) {\n        return false;\n      }\n\n      return true;\n    });\n\n    releases.sort(function (a, b) {\n      // $FlowFixMe\n      return -semver.compare(a.version, b.version);\n    });\n\n    return releases;\n  });\n\n  return function fetchReleases(_x) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.hasWrapper = hasWrapper;\n\nvar _yarnVersion;\n\nfunction _load_yarnVersion() {\n  return _yarnVersion = __webpack_require__(105);\n}\n\nvar _child;\n\nfunction _load_child() {\n  return _child = _interopRequireWildcard(__webpack_require__(50));\n}\n\nvar _buildSubCommands2;\n\nfunction _load_buildSubCommands() {\n  return _buildSubCommands2 = _interopRequireDefault(__webpack_require__(59));\n}\n\nvar _rc;\n\nfunction _load_rc() {\n  return _rc = __webpack_require__(335);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = __webpack_require__(19);\n}\n\nvar _semver;\n\nfunction _load_semver() {\n  return _semver = __webpack_require__(170);\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint-disable max-len */\n\nconst V2_NAMES = ['berry', 'stable', 'canary', 'v2', '2'];\n\nconst isLocalFile = version => version.match(/^\\.{0,2}[\\\\/]/) || path.isAbsolute(version);\nconst isV2Version = version => (0, (_semver || _load_semver()).satisfiesWithPrereleases)(version, '>=2.0.0');\n\nconst chalk = __webpack_require__(27);\nconst invariant = __webpack_require__(9);\nconst path = __webpack_require__(0);\nconst semver = __webpack_require__(22);\n\nfunction getBundleAsset(release) {\n  return release.assets.find(asset => {\n    return asset.name.match(/^yarn-[0-9]+\\.[0-9]+\\.[0-9]+\\.js$/);\n  });\n}\n\nfunction fetchBundle(config, url) {\n  return config.requestManager.request({\n    url,\n    buffer: true\n  });\n}\n\nfunction hasWrapper(flags, args) {\n  return false;\n}\n\nvar _buildSubCommands = (0, (_buildSubCommands2 || _load_buildSubCommands()).default)('policies', {\n  setVersion(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const initialRange = args[0] || 'latest';\n      let range = initialRange;\n\n      let allowRc = flags.rc;\n\n      if (range === 'rc') {\n        reporter.log(`${chalk.yellow(`Warning:`)} Your current Yarn binary is currently Yarn ${(_yarnVersion || _load_yarnVersion()).version}; to avoid potential breaking changes, 'set version rc' won't receive upgrades past the 1.22.x branch.\\n         To upgrade to the latest versions, run ${chalk.cyan(`yarn set version`)} ${chalk.yellow.underline(`canary`)} instead. Sorry for the inconvenience.\\n`);\n\n        range = '*';\n        allowRc = true;\n      }\n\n      if (range === 'latest') {\n        reporter.log(`${chalk.yellow(`Warning:`)} Your current Yarn binary is currently Yarn ${(_yarnVersion || _load_yarnVersion()).version}; to avoid potential breaking changes, 'set version latest' won't receive upgrades past the 1.22.x branch.\\n         To upgrade to the latest versions, run ${chalk.cyan(`yarn set version`)} ${chalk.yellow.underline(`stable`)} instead. Sorry for the inconvenience.\\n`);\n\n        range = '*';\n      }\n\n      if (range === 'classic') {\n        range = '*';\n      }\n\n      let bundleUrl;\n      let bundleVersion;\n      const isV2 = false;\n\n      if (range === 'nightly' || range === 'nightlies') {\n        reporter.log(`${chalk.yellow(`Warning:`)} Nightlies only exist for Yarn 1.x; starting from 2.x onwards, you should use 'canary' instead`);\n\n        bundleUrl = 'https://nightly.yarnpkg.com/latest.js';\n        bundleVersion = 'nightly';\n      } else if (V2_NAMES.includes(range) || isLocalFile(range) || isV2Version(range)) {\n        const normalizedRange = isV2Version(range) ? range : range === `canary` ? `canary` : `stable`;\n\n        if (process.env.COREPACK_ROOT) {\n          yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, [path.join(process.env.COREPACK_ROOT, 'dist/corepack.js'), `yarn@${normalizedRange}`, `set`, `version`, normalizedRange], {\n            stdio: 'inherit',\n            cwd: config.cwd\n          });\n\n          return;\n        } else {\n          const bundle = yield fetchBundle(config, 'https://github.com/yarnpkg/berry/raw/master/packages/yarnpkg-cli/bin/yarn.js');\n\n          const yarnPath = path.resolve(config.lockfileFolder, `.yarn/releases/yarn-stable-temp.cjs`);\n          yield (_fs || _load_fs()).mkdirp(path.dirname(yarnPath));\n          yield (_fs || _load_fs()).writeFile(yarnPath, bundle);\n          yield (_fs || _load_fs()).chmod(yarnPath, 0o755);\n\n          try {\n            yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, [yarnPath, 'set', 'version', range], {\n              stdio: 'inherit',\n              cwd: config.lockfileFolder,\n              env: (0, (_extends2 || _load_extends()).default)({}, process.env, {\n                YARN_IGNORE_PATH: `1`\n              })\n            });\n          } catch (err) {\n            // eslint-disable-next-line no-process-exit\n            process.exit(1);\n          }\n\n          return;\n        }\n      } else {\n        reporter.log(`Resolving ${chalk.yellow(initialRange)} to a url...`);\n\n        let releases = [];\n\n        try {\n          releases = yield fetchReleases(config, {\n            includePrereleases: allowRc\n          });\n        } catch (e) {\n          reporter.error(e.message);\n          return;\n        }\n\n        const release = releases.find(function (release) {\n          // $FlowFixMe\n          return semver.satisfies(release.version, range);\n        });\n\n        if (!release) {\n          throw new Error(`Release not found: ${range}`);\n        }\n\n        const asset = getBundleAsset(release);\n        invariant(asset, 'The bundle asset should exist');\n\n        bundleUrl = asset.browser_download_url;\n        bundleVersion = release.version.version;\n      }\n\n      reporter.log(`Downloading ${chalk.green(bundleUrl)}...`);\n\n      const bundle = yield fetchBundle(config, bundleUrl);\n\n      const yarnPath = path.resolve(config.lockfileFolder, `.yarn/releases/yarn-${bundleVersion}.cjs`);\n      reporter.log(`Saving it into ${chalk.magenta(yarnPath)}...`);\n      yield (_fs || _load_fs()).mkdirp(path.dirname(yarnPath));\n      yield (_fs || _load_fs()).writeFile(yarnPath, bundle);\n      yield (_fs || _load_fs()).chmod(yarnPath, 0o755);\n\n      const targetPath = path.relative(config.lockfileFolder, yarnPath).replace(/\\\\/g, '/');\n\n      if (isV2) {\n        const rcPath = `${config.lockfileFolder}/.yarnrc.yml`;\n        reporter.log(`Updating ${chalk.magenta(rcPath)}...`);\n\n        yield (_fs || _load_fs()).writeFilePreservingEol(rcPath, `yarnPath: ${JSON.stringify(targetPath)}\\n`);\n      } else {\n        const rcPath = `${config.lockfileFolder}/.yarnrc`;\n        reporter.log(`Updating ${chalk.magenta(rcPath)}...`);\n\n        const rc = (0, (_rc || _load_rc()).getRcConfigForFolder)(config.lockfileFolder);\n        rc['yarn-path'] = targetPath;\n\n        yield (_fs || _load_fs()).writeFilePreservingEol(rcPath, `${(0, (_lockfile || _load_lockfile()).stringify)(rc)}\\n`);\n      }\n\n      reporter.log(`Done!`);\n    })();\n  }\n});\n\nconst run = _buildSubCommands.run,\n      setFlags = _buildSubCommands.setFlags,\n      examples = _buildSubCommands.examples;\nexports.run = run;\nexports.setFlags = setFlags;\nexports.examples = examples;\n\n/***/ }),\n/* 509 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet publish = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, pkg, flags, dir) {\n    let access = flags.access;\n\n    // if no access level is provided, check package.json for `publishConfig.access`\n    // see: https://docs.npmjs.com/files/package.json#publishconfig\n    if (!access && pkg && pkg.publishConfig && pkg.publishConfig.access) {\n      access = pkg.publishConfig.access;\n    }\n\n    // validate access argument\n    if (access && access !== 'public' && access !== 'restricted') {\n      throw new (_errors || _load_errors()).MessageError(config.reporter.lang('invalidAccess'));\n    }\n\n    // TODO this might modify package.json, do we need to reload it?\n    yield config.executeLifecycleScript('prepublish');\n    yield config.executeLifecycleScript('prepare');\n    yield config.executeLifecycleScript('prepublishOnly');\n    yield config.executeLifecycleScript('prepack');\n\n    // get tarball stream\n    const stat = yield (_fs || _load_fs()).lstat(dir);\n    let stream;\n    if (stat.isDirectory()) {\n      stream = yield (0, (_pack || _load_pack()).pack)(config);\n    } else if (stat.isFile()) {\n      stream = fs2.createReadStream(dir);\n    } else {\n      throw new Error(\"Don't know how to handle this file type\");\n    }\n    const buffer = yield new Promise(function (resolve, reject) {\n      const data = [];\n      invariant(stream, 'expected stream');\n      stream.on('data', data.push.bind(data)).on('end', function () {\n        return resolve(Buffer.concat(data));\n      }).on('error', reject);\n    });\n\n    yield config.executeLifecycleScript('postpack');\n\n    // copy normalized package and remove internal keys as they may be sensitive or yarn specific\n    pkg = Object.assign({}, pkg);\n    for (const key in pkg) {\n      if (key[0] === '_') {\n        delete pkg[key];\n      }\n    }\n\n    const tag = flags.tag || 'latest';\n    const tbName = `${pkg.name}-${pkg.version}.tgz`;\n    const tbURI = `${pkg.name}/-/${tbName}`;\n\n    // create body\n    const root = {\n      _id: pkg.name,\n      access,\n      name: pkg.name,\n      description: pkg.description,\n      'dist-tags': {\n        [tag]: pkg.version\n      },\n      versions: {\n        [pkg.version]: pkg\n      },\n      readme: pkg.readme || '',\n      _attachments: {\n        [tbName]: {\n          content_type: 'application/octet-stream',\n          data: buffer.toString('base64'),\n          length: buffer.length\n        }\n      }\n    };\n\n    pkg._id = `${pkg.name}@${pkg.version}`;\n    pkg.dist = pkg.dist || {};\n    pkg.dist.shasum = crypto.createHash('sha1').update(buffer).digest('hex');\n    pkg.dist.integrity = ssri.fromData(buffer).toString();\n\n    const registry = String(config.getOption('registry'));\n    pkg.dist.tarball = url.resolve(registry, tbURI).replace(/^https:\\/\\//, 'http://');\n\n    // publish package\n    try {\n      yield config.registries.npm.request((_npmRegistry || _load_npmRegistry()).default.escapeName(pkg.name), {\n        registry: pkg && pkg.publishConfig && pkg.publishConfig.registry,\n        method: 'PUT',\n        body: root\n      });\n    } catch (error) {\n      throw new (_errors || _load_errors()).MessageError(config.reporter.lang('publishFail', error.message));\n    }\n\n    yield config.executeLifecycleScript('publish');\n    yield config.executeLifecycleScript('postpublish');\n  });\n\n  return function publish(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet run = exports.run = (() => {\n  var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    // validate arguments\n    const dir = args[0] ? (_path || _load_path()).default.resolve(config.cwd, args[0]) : config.cwd;\n    if (args.length > 1) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('tooManyArguments', 1));\n    }\n    if (!(yield (_fs || _load_fs()).exists(dir))) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('unknownFolderOrTarball'));\n    }\n\n    const stat = yield (_fs || _load_fs()).lstat(dir);\n    let publishPath = dir;\n    if (stat.isDirectory()) {\n      config.cwd = (_path || _load_path()).default.resolve(dir);\n      publishPath = config.cwd;\n    }\n\n    // validate package fields that are required for publishing\n    // $FlowFixMe\n    const pkg = yield config.readRootManifest();\n    if (pkg.private) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('publishPrivate'));\n    }\n    if (!pkg.name) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('noName'));\n    }\n\n    let registry = '';\n\n    if (pkg && pkg.publishConfig && pkg.publishConfig.registry) {\n      registry = pkg.publishConfig.registry;\n    }\n\n    reporter.step(1, 4, reporter.lang('bumpingVersion'));\n    const commitVersion = yield (0, (_version || _load_version()).setVersion)(config, reporter, flags, [], false);\n\n    //\n    reporter.step(2, 4, reporter.lang('loggingIn'));\n    const revoke = yield (0, (_login || _load_login()).getToken)(config, reporter, pkg.name, flags, registry);\n\n    //\n    reporter.step(3, 4, reporter.lang('publishing'));\n    yield publish(config, pkg, flags, publishPath);\n    yield commitVersion();\n    reporter.success(reporter.lang('published'));\n\n    //\n    reporter.step(4, 4, reporter.lang('revokingToken'));\n    yield revoke();\n  });\n\n  return function run(_x5, _x6, _x7, _x8) {\n    return _ref2.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _npmRegistry;\n\nfunction _load_npmRegistry() {\n  return _npmRegistry = _interopRequireDefault(__webpack_require__(88));\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _version;\n\nfunction _load_version() {\n  return _version = __webpack_require__(357);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _pack;\n\nfunction _load_pack() {\n  return _pack = __webpack_require__(166);\n}\n\nvar _login;\n\nfunction _load_login() {\n  return _login = __webpack_require__(107);\n}\n\nvar _path;\n\nfunction _load_path() {\n  return _path = _interopRequireDefault(__webpack_require__(0));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nconst crypto = __webpack_require__(11);\nconst url = __webpack_require__(24);\nconst fs2 = __webpack_require__(4);\nconst ssri = __webpack_require__(65);\n\nfunction setFlags(commander) {\n  (0, (_version || _load_version()).setFlags)(commander);\n  commander.description('Publishes a package to the npm registry.');\n  commander.usage('publish [<tarball>|<folder>] [--tag <tag>] [--access <public|restricted>]');\n  commander.option('--access [access]', 'access');\n  commander.option('--tag [tag]', 'tag');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 510 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.examples = exports.hasWrapper = exports.run = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet removeTeamUser = (() => {\n  var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (parts, config, reporter) {\n    reporter.step(2, 3, reporter.lang('teamRemovingUser'));\n    reporter.inspect((yield config.registries.npm.request(`team/${parts.scope}/${parts.team}/user`, {\n      method: 'DELETE',\n      body: {\n        user: parts.user\n      }\n    })));\n    return true;\n  });\n\n  return function removeTeamUser(_x5, _x6, _x7) {\n    return _ref2.apply(this, arguments);\n  };\n})();\n\nlet list = (() => {\n  var _ref3 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (parts, config, reporter) {\n    reporter.step(2, 3, reporter.lang('teamListing'));\n    const uriParams = '?format=cli';\n    if (parts.team) {\n      reporter.inspect((yield config.registries.npm.request(`team/${parts.scope}/${parts.team}/user${uriParams}`)));\n    } else {\n      reporter.inspect((yield config.registries.npm.request(`org/${parts.scope}/team${uriParams}`)));\n    }\n    return true;\n  });\n\n  return function list(_x8, _x9, _x10) {\n    return _ref3.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\n\nvar _buildSubCommands2;\n\nfunction _load_buildSubCommands() {\n  return _buildSubCommands2 = _interopRequireDefault(__webpack_require__(59));\n}\n\nvar _login;\n\nfunction _load_login() {\n  return _login = __webpack_require__(107);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction explodeScopeTeam(arg, requireTeam, reporter) {\n  var _arg$split = arg.split(':');\n\n  const scope = _arg$split[0],\n        team = _arg$split[1],\n        parts = _arg$split.slice(2);\n\n  if (parts.length) {\n    return false;\n  }\n\n  if (requireTeam && !team) {\n    return false;\n  }\n\n  return {\n    scope: scope || '',\n    team: team || '',\n    user: ''\n  };\n}\n\nfunction warnDeprecation(reporter, deprecationWarning) {\n  const command = 'yarn team';\n  reporter.warn(reporter.lang('deprecatedCommand', `${command} ${deprecationWarning.deprecatedCommand}`, `${command} ${deprecationWarning.currentCommand}`));\n}\n\nfunction wrapRequired(callback, requireTeam, deprecationInfo) {\n  return (() => {\n    var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n      if (deprecationInfo) {\n        warnDeprecation(reporter, deprecationInfo);\n      }\n\n      if (!args.length) {\n        return false;\n      }\n\n      const parts = explodeScopeTeam(args[0], requireTeam, reporter);\n      if (!parts) {\n        return false;\n      }\n\n      reporter.step(1, 3, reporter.lang('loggingIn'));\n      const revoke = yield (0, (_login || _load_login()).getToken)(config, reporter);\n\n      const res = yield callback(parts, config, reporter, flags, args);\n      if (!res) {\n        return res;\n      }\n\n      reporter.step(3, 3, reporter.lang('revokingToken'));\n      yield revoke();\n      return true;\n    });\n\n    return function (_x, _x2, _x3, _x4) {\n      return _ref.apply(this, arguments);\n    };\n  })();\n}\n\nfunction wrapRequiredTeam(callback, requireTeam = true, subCommandDeprecated) {\n  return wrapRequired(function (parts, config, reporter, flags, args) {\n    if (args.length === 1) {\n      return callback(parts, config, reporter, flags, args);\n    } else {\n      return false;\n    }\n  }, requireTeam, subCommandDeprecated);\n}\n\nfunction wrapRequiredUser(callback, subCommandDeprecated) {\n  return wrapRequired(function (parts, config, reporter, flags, args) {\n    if (args.length === 2) {\n      return callback((0, (_extends2 || _load_extends()).default)({\n        user: args[1]\n      }, parts), config, reporter, flags, args);\n    } else {\n      return false;\n    }\n  }, true, subCommandDeprecated);\n}\n\nfunction setFlags(commander) {\n  commander.description('Maintain team memberships');\n}\n\nvar _buildSubCommands = (0, (_buildSubCommands2 || _load_buildSubCommands()).default)('team', {\n  create: wrapRequiredTeam((() => {\n    var _ref4 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (parts, config, reporter, flags, args) {\n      reporter.step(2, 3, reporter.lang('teamCreating'));\n      reporter.inspect((yield config.registries.npm.request(`team/${parts.scope}`, {\n        method: 'PUT',\n        body: {\n          team: parts.team\n        }\n      })));\n      return true;\n    });\n\n    return function (_x11, _x12, _x13, _x14, _x15) {\n      return _ref4.apply(this, arguments);\n    };\n  })()),\n\n  destroy: wrapRequiredTeam((() => {\n    var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (parts, config, reporter, flags, args) {\n      reporter.step(2, 3, reporter.lang('teamRemoving'));\n      reporter.inspect((yield config.registries.npm.request(`team/${parts.scope}/${parts.team}`, {\n        method: 'DELETE'\n      })));\n      return true;\n    });\n\n    return function (_x16, _x17, _x18, _x19, _x20) {\n      return _ref5.apply(this, arguments);\n    };\n  })()),\n\n  add: wrapRequiredUser((() => {\n    var _ref6 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (parts, config, reporter, flags, args) {\n      reporter.step(2, 3, reporter.lang('teamAddingUser'));\n      reporter.inspect((yield config.registries.npm.request(`team/${parts.scope}/${parts.team}/user`, {\n        method: 'PUT',\n        body: {\n          user: parts.user\n        }\n      })));\n      return true;\n    });\n\n    return function (_x21, _x22, _x23, _x24, _x25) {\n      return _ref6.apply(this, arguments);\n    };\n  })()),\n\n  rm: wrapRequiredUser(function (parts, config, reporter, flags, args) {\n    removeTeamUser(parts, config, reporter);\n  }, {\n    deprecatedCommand: 'rm',\n    currentCommand: 'remove'\n  }),\n\n  remove: wrapRequiredUser(function (parts, config, reporter, flags, args) {\n    removeTeamUser(parts, config, reporter);\n  }),\n\n  ls: wrapRequiredTeam(function (parts, config, reporter, flags, args) {\n    list(parts, config, reporter);\n  }, false, {\n    deprecatedCommand: 'ls',\n    currentCommand: 'list'\n  }),\n\n  list: wrapRequiredTeam(function (parts, config, reporter, flags, args) {\n    list(parts, config, reporter);\n  }, false)\n}, ['create <scope:team>', 'destroy <scope:team>', 'add <scope:team> <user>', 'remove <scope:team> <user>', 'list <scope>|<scope:team>']);\n\nconst run = _buildSubCommands.run,\n      hasWrapper = _buildSubCommands.hasWrapper,\n      examples = _buildSubCommands.examples;\nexports.run = run;\nexports.hasWrapper = hasWrapper;\nexports.examples = examples;\n\n/***/ }),\n/* 511 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    if (args.length) {\n      for (var _iterator = args, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref2;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref2 = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref2 = _i.value;\n        }\n\n        const name = _ref2;\n\n        const linkLoc = path.join(config.linkFolder, name);\n        if (yield (_fs || _load_fs()).exists(linkLoc)) {\n          yield (_fs || _load_fs()).unlink(path.join((yield (0, (_link || _load_link()).getRegistryFolder)(config, name)), name));\n          reporter.success(reporter.lang('linkDisusing', name));\n          reporter.info(reporter.lang('linkDisusingMessage', name));\n        } else {\n          throw new (_errors || _load_errors()).MessageError(reporter.lang('linkMissing', name));\n        }\n      }\n    } else {\n      // remove from registry\n      const manifest = yield config.readRootManifest();\n      const name = manifest.name;\n      if (!name) {\n        throw new (_errors || _load_errors()).MessageError(reporter.lang('unknownPackageName'));\n      }\n\n      const linkLoc = path.join(config.linkFolder, name);\n      if (yield (_fs || _load_fs()).exists(linkLoc)) {\n        // If there is a `bin` defined in the package.json,\n        // link each bin to the global bin\n        if (manifest.bin) {\n          const globalBinFolder = yield (0, (_global || _load_global()).getBinFolder)(config, flags);\n          for (const binName in manifest.bin) {\n            const binDestLoc = path.join(globalBinFolder, binName);\n            if (yield (_fs || _load_fs()).exists(binDestLoc)) {\n              yield (_fs || _load_fs()).unlink(binDestLoc);\n              if (process.platform === 'win32') {\n                yield (_fs || _load_fs()).unlink(binDestLoc + '.cmd');\n              }\n            }\n          }\n        }\n\n        yield (_fs || _load_fs()).unlink(linkLoc);\n\n        reporter.success(reporter.lang('linkUnregistered', name));\n        reporter.info(reporter.lang('linkUnregisteredMessage', name));\n      } else {\n        throw new (_errors || _load_errors()).MessageError(reporter.lang('linkMissing', name));\n      }\n    }\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _link;\n\nfunction _load_link() {\n  return _link = __webpack_require__(351);\n}\n\nvar _global;\n\nfunction _load_global() {\n  return _global = __webpack_require__(122);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst path = __webpack_require__(0);\n\nfunction setFlags(commander) {\n  commander.description('Unlink a previously created symlink for a package.');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 512 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.clearAll = exports.clearSome = exports.run = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    if (!config.plugnplayEnabled) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('unplugDisabled'));\n    }\n    if (!args.length && flags.clear) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('tooFewArguments', 1));\n    }\n    if (args.length && flags.clearAll) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('noArguments'));\n    }\n\n    if (flags.clearAll) {\n      yield clearAll(config);\n    } else if (flags.clear) {\n      yield clearSome(config, new Set(args));\n    } else if (args.length > 0) {\n      const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.lockfileFolder, reporter);\n      yield (0, (_install || _load_install()).wrapLifecycle)(config, flags, (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n        const install = new (_install || _load_install()).Install(flags, config, reporter, lockfile);\n        install.linker.unplugged = args;\n        yield install.init();\n      }));\n    }\n\n    const unpluggedPackageFolders = yield config.listUnpluggedPackageFolders();\n\n    for (var _iterator = unpluggedPackageFolders.values(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref3;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref3 = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref3 = _i.value;\n      }\n\n      const target = _ref3;\n\n      reporter.log(target, { force: true });\n    }\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet clearSome = exports.clearSome = (() => {\n  var _ref4 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, filters) {\n    const unpluggedPackageFolders = yield config.listUnpluggedPackageFolders();\n    const removeList = [];\n\n    for (var _iterator2 = unpluggedPackageFolders.entries(), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n      var _ref6;\n\n      if (_isArray2) {\n        if (_i2 >= _iterator2.length) break;\n        _ref6 = _iterator2[_i2++];\n      } else {\n        _i2 = _iterator2.next();\n        if (_i2.done) break;\n        _ref6 = _i2.value;\n      }\n\n      const _ref5 = _ref6;\n      const unpluggedName = _ref5[0];\n      const target = _ref5[1];\n\n      var _ref8 = yield (_fs || _load_fs()).readJson(path.join(target, 'package.json'));\n\n      const name = _ref8.name;\n\n      const toBeRemoved = filters.has(name);\n\n      if (toBeRemoved) {\n        removeList.push(path.join(config.getUnpluggedPath(), unpluggedName));\n      }\n    }\n\n    if (removeList.length === unpluggedPackageFolders.size) {\n      yield (_fs || _load_fs()).unlink(config.getUnpluggedPath());\n    } else {\n      for (var _iterator3 = removeList, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n        var _ref7;\n\n        if (_isArray3) {\n          if (_i3 >= _iterator3.length) break;\n          _ref7 = _iterator3[_i3++];\n        } else {\n          _i3 = _iterator3.next();\n          if (_i3.done) break;\n          _ref7 = _i3.value;\n        }\n\n        const unpluggedPackagePath = _ref7;\n\n        yield (_fs || _load_fs()).unlink(unpluggedPackagePath);\n      }\n    }\n  });\n\n  return function clearSome(_x5, _x6) {\n    return _ref4.apply(this, arguments);\n  };\n})();\n\nlet clearAll = exports.clearAll = (() => {\n  var _ref9 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config) {\n    yield (_fs || _load_fs()).unlink(config.getUnpluggedPath());\n  });\n\n  return function clearAll(_x7) {\n    return _ref9.apply(this, arguments);\n  };\n})();\n\nexports.hasWrapper = hasWrapper;\nexports.setFlags = setFlags;\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst path = __webpack_require__(0);\n\nfunction hasWrapper(commander) {\n  return true;\n}\n\nfunction setFlags(commander) {\n  commander.description('Temporarily copies a package (with an optional @range suffix) outside of the global cache for debugging purposes');\n  commander.usage('unplug [packages ...] [flags]');\n  commander.option('--clear', 'Delete the selected packages');\n  commander.option('--clear-all', 'Delete all unplugged packages');\n}\n\n/***/ }),\n/* 513 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const versions = { yarn: (_yarnVersion || _load_yarnVersion()).version };\n\n    const pkg = yield config.maybeReadManifest(config.cwd);\n    if (pkg && pkg.name && pkg.version) {\n      versions[pkg.name] = pkg.version;\n    }\n\n    Object.assign(versions, process.versions);\n\n    reporter.inspect(versions);\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _yarnVersion;\n\nfunction _load_yarnVersion() {\n  return _yarnVersion = __webpack_require__(105);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction setFlags(commander) {\n  commander.description('Displays version information of currently installed Yarn, Node.js, and its dependencies.');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 514 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = exports.requireLockfile = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet cleanQuery = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, query) {\n    // if a location was passed then turn it into a hash query\n    if (path.isAbsolute(query) && (yield (_fs || _load_fs()).exists(query))) {\n      // absolute path\n      query = path.relative(config.cwd, query);\n    }\n\n    // remove references to node_modules with hashes\n    query = query.replace(/([\\\\/]|^)node_modules[\\\\/]/g, '#');\n\n    // remove trailing hashes\n    query = query.replace(/^#+/g, '');\n\n    // remove trailing paths from each part of the query, skip second part of path for scoped packages\n    let queryParts = query.split('#');\n    queryParts = queryParts.map(function (part) {\n      let parts = part.split(/[\\\\/]/g);\n\n      if (part[0] === '@') {\n        parts = parts.slice(0, 2);\n      } else {\n        parts = parts.slice(0, 1);\n      }\n\n      return parts.join('/');\n    });\n    query = queryParts.join('#');\n\n    return query;\n  });\n\n  return function cleanQuery(_x, _x2) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet getPackageSize = (() => {\n  var _ref2 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (tuple) {\n    const loc = tuple[0];\n\n\n    const files = yield (_fs || _load_fs()).walk(loc, null, new Set([(_constants || _load_constants()).METADATA_FILENAME, (_constants || _load_constants()).TARBALL_FILENAME]));\n\n    const sizes = yield Promise.all(files.map(function (walkFile) {\n      return (_fs || _load_fs()).getFileSizeOnDisk(walkFile.absolute);\n    }));\n\n    return sum(sizes);\n  });\n\n  return function getPackageSize(_x3) {\n    return _ref2.apply(this, arguments);\n  };\n})();\n\nlet run = exports.run = (() => {\n  var _ref6 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    if (!args.length) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('missingWhyDependency'));\n    }\n    if (args.length > 1) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('tooManyArguments', 1));\n    }\n\n    const query = yield cleanQuery(config, args[0]);\n\n    reporter.step(1, 4, reporter.lang('whyStart', args[0]), emoji.get('thinking_face'));\n\n    // init\n    reporter.step(2, 4, reporter.lang('whyInitGraph'), emoji.get('truck'));\n    const lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.lockfileFolder, reporter);\n    const install = new (_install || _load_install()).Install(flags, config, reporter, lockfile);\n\n    var _ref7 = yield install.fetchRequestFromCwd();\n\n    const depRequests = _ref7.requests,\n          patterns = _ref7.patterns,\n          workspaceLayout = _ref7.workspaceLayout;\n\n    yield install.resolver.init(depRequests, {\n      isFlat: install.flags.flat,\n      isFrozen: install.flags.frozenLockfile,\n      workspaceLayout\n    });\n    const hoisted = yield install.linker.getFlatHoistedTree(patterns);\n\n    // finding\n    reporter.step(3, 4, reporter.lang('whyFinding'), emoji.get('mag'));\n\n    const matches = queryWhy(query, hoisted);\n\n    if (matches.length <= 0) {\n      reporter.error(reporter.lang('whyUnknownMatch'));\n      return;\n    }\n\n    const processMatch = (() => {\n      var _ref8 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (match) {\n        const matchInfo = match[1];\n\n        const matchRef = matchInfo.pkg._reference;\n        invariant(matchRef, 'expected reference');\n\n        const distinctMatchPatterns = new Set(matchRef.patterns);\n        const reasons = [];\n\n        // reason: dependency of these modules\n        if (matchInfo.originalParentPath.length > 0) {\n          reasons.push({\n            type: 'whyDependedOn',\n            typeSimple: 'whyDependedOnSimple',\n            value: toStandardPathString(matchInfo.originalParentPath)\n          });\n        }\n\n        // reason: exists in manifest\n        let rootType;\n        for (var _iterator3 = distinctMatchPatterns, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n          var _ref9;\n\n          if (_isArray3) {\n            if (_i3 >= _iterator3.length) break;\n            _ref9 = _iterator3[_i3++];\n          } else {\n            _i3 = _iterator3.next();\n            if (_i3.done) break;\n            _ref9 = _i3.value;\n          }\n\n          const pattern = _ref9;\n\n          rootType = install.rootPatternsToOrigin[pattern];\n          if (rootType) {\n            reasons.push({\n              type: 'whySpecified',\n              typeSimple: 'whySpecifiedSimple',\n              value: rootType\n            });\n          }\n        }\n\n        // reason: this is hoisted from these modules\n        for (var _iterator4 = matchInfo.previousPaths, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n          var _ref10;\n\n          if (_isArray4) {\n            if (_i4 >= _iterator4.length) break;\n            _ref10 = _iterator4[_i4++];\n          } else {\n            _i4 = _iterator4.next();\n            if (_i4.done) break;\n            _ref10 = _i4.value;\n          }\n\n          const path = _ref10;\n\n          reasons.push({\n            type: 'whyHoistedFrom',\n            typeSimple: 'whyHoistedFromSimple',\n            value: toStandardPathString(path)\n          });\n        }\n\n        // package sizes\n        let packageSize = 0;\n        let directSizes = [];\n        let transitiveSizes = [];\n        try {\n          packageSize = yield getPackageSize(match);\n        } catch (e) {}\n\n        const dependencies = Array.from(collect(hoisted, new Set(), match));\n        const transitiveDependencies = Array.from(collect(hoisted, new Set(), match, { recursive: true }));\n\n        try {\n          directSizes = yield Promise.all(dependencies.map(getPackageSize));\n          transitiveSizes = yield Promise.all(transitiveDependencies.map(getPackageSize));\n        } catch (e) {}\n\n        const transitiveKeys = new Set(transitiveDependencies.map(function ([, info]) {\n          return info.key;\n        }));\n        const sharedDependencies = getSharedDependencies(hoisted, transitiveKeys);\n\n        // prepare output: populate reporter\n        reporter.info(reporter.lang('whyMatch', `${matchInfo.key}@${matchInfo.pkg.version}`));\n        //\n        // reason: hoisted/nohoist\n        if (matchInfo.isNohoist) {\n          reasons.push({\n            type: 'whyNotHoisted',\n            typeSimple: 'whyNotHoistedSimple',\n            value: matchInfo.nohoistList\n          });\n        } else if (query === matchInfo.originalKey) {\n          reporter.info(reporter.lang('whyHoistedTo', matchInfo.key));\n        }\n\n        if (reasons.length === 1) {\n          reporter.info(reporter.lang(reasons[0].typeSimple, reasons[0].value));\n        } else if (reasons.length > 1) {\n          reporter.info(reporter.lang('whyReasons'));\n          reporter.list('reasons', reasons.map(function (reason) {\n            return reporter.lang(reason.type, reason.value);\n          }));\n        } else {\n          reporter.error(reporter.lang('whyWhoKnows'));\n        }\n\n        if (packageSize) {\n          // stats: file size of this dependency without any dependencies\n          reporter.info(reporter.lang('whyDiskSizeWithout', bytes(packageSize)));\n\n          // stats: file size of this dependency including dependencies that aren't shared\n          reporter.info(reporter.lang('whyDiskSizeUnique', bytes(packageSize + sum(directSizes))));\n\n          // stats: file size of this dependency including dependencies\n          reporter.info(reporter.lang('whyDiskSizeTransitive', bytes(packageSize + sum(transitiveSizes))));\n\n          // stats: shared transitive dependencies\n          reporter.info(reporter.lang('whySharedDependencies', sharedDependencies.size));\n        }\n      });\n\n      return function processMatch(_x8) {\n        return _ref8.apply(this, arguments);\n      };\n    })();\n\n    reporter.step(4, 4, reporter.lang('whyCalculating'), emoji.get('aerial_tramway'));\n    for (var _iterator5 = matches, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n      var _ref11;\n\n      if (_isArray5) {\n        if (_i5 >= _iterator5.length) break;\n        _ref11 = _iterator5[_i5++];\n      } else {\n        _i5 = _iterator5.next();\n        if (_i5.done) break;\n        _ref11 = _i5.value;\n      }\n\n      const match = _ref11;\n\n      yield processMatch(match);\n    }\n  });\n\n  return function run(_x4, _x5, _x6, _x7) {\n    return _ref6.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\nexports.queryWhy = queryWhy;\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst requireLockfile = exports.requireLockfile = true;\n\nconst invariant = __webpack_require__(9);\nconst bytes = __webpack_require__(564);\nconst emoji = __webpack_require__(302);\nconst path = __webpack_require__(0);\n\nfunction sum(array) {\n  return array.length ? array.reduce((a, b) => a + b, 0) : 0;\n}\n\nfunction collect(hoistManifests, allDependencies, dependency, { recursive } = { recursive: false }) {\n  const depInfo = dependency[1];\n\n  const deps = depInfo.pkg.dependencies;\n\n  if (!deps) {\n    return allDependencies;\n  }\n\n  const dependencyKeys = new Set(Object.keys(deps));\n  const directDependencies = [];\n\n  for (var _iterator = hoistManifests, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n    var _ref3;\n\n    if (_isArray) {\n      if (_i >= _iterator.length) break;\n      _ref3 = _iterator[_i++];\n    } else {\n      _i = _iterator.next();\n      if (_i.done) break;\n      _ref3 = _i.value;\n    }\n\n    const dep = _ref3;\n    const info = dep[1];\n\n\n    if (!allDependencies.has(dep) && dependencyKeys.has(info.key)) {\n      allDependencies.add(dep);\n      directDependencies.push(dep);\n    }\n  }\n\n  if (recursive) {\n    directDependencies.forEach(dependency => collect(hoistManifests, allDependencies, dependency, { recursive: true }));\n  }\n\n  return allDependencies;\n}\n\nfunction getSharedDependencies(hoistManifests, transitiveKeys) {\n  const sharedDependencies = new Set();\n  for (var _iterator2 = hoistManifests, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n    var _ref5;\n\n    if (_isArray2) {\n      if (_i2 >= _iterator2.length) break;\n      _ref5 = _iterator2[_i2++];\n    } else {\n      _i2 = _iterator2.next();\n      if (_i2.done) break;\n      _ref5 = _i2.value;\n    }\n\n    const _ref4 = _ref5;\n    const info = _ref4[1];\n\n    if (!transitiveKeys.has(info.key) && info.pkg.dependencies) {\n      Object.keys(info.pkg.dependencies).forEach(dependency => {\n        if (transitiveKeys.has(dependency) && !sharedDependencies.has(dependency)) {\n          sharedDependencies.add(dependency);\n        }\n      });\n    }\n  }\n  return sharedDependencies;\n}\n\nfunction setFlags(commander) {\n  commander.description('Identifies why a package has been installed, detailing which other packages depend on it.');\n}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n// to conform to the current standard '#' as package tree separator\nfunction toStandardPathString(pathString) {\n  const str = pathString.replace(/\\//g, '#');\n  if (str[0] === '#') {\n    return str.slice(1);\n  }\n  return str;\n}\n\nfunction queryWhy(pattern, hoisted) {\n  const nohoistPattern = `#${pattern}`;\n  const found = [];\n  for (var _iterator6 = hoisted, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n    var _ref13;\n\n    if (_isArray6) {\n      if (_i6 >= _iterator6.length) break;\n      _ref13 = _iterator6[_i6++];\n    } else {\n      _i6 = _iterator6.next();\n      if (_i6.done) break;\n      _ref13 = _i6.value;\n    }\n\n    const _ref12 = _ref13;\n    const loc = _ref12[0];\n    const info = _ref12[1];\n\n    if (info.key === pattern || info.previousPaths.indexOf(pattern) >= 0 || info.key.endsWith(nohoistPattern)) {\n      found.push([loc, info]);\n    }\n  }\n  return found;\n}\n\n/***/ }),\n/* 515 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.run = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet run = exports.run = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const workspaceRootFolder = config.workspaceRootFolder;\n\n\n    if (!workspaceRootFolder) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('workspaceRootNotFound', config.cwd));\n    }\n\n    if (args.length < 1) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('workspaceMissingWorkspace'));\n    }\n\n    if (args.length < 2) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('workspaceMissingCommand'));\n    }\n\n    const manifest = yield config.findManifest(workspaceRootFolder, false);\n    invariant(manifest && manifest.workspaces, 'We must find a manifest with a \"workspaces\" property');\n\n    const workspaces = yield config.resolveWorkspaces(workspaceRootFolder, manifest);\n\n    var _ref2 = args || [];\n\n    const workspaceName = _ref2[0],\n          rest = _ref2.slice(1);\n\n    if (!Object.prototype.hasOwnProperty.call(workspaces, workspaceName)) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('workspaceUnknownWorkspace', workspaceName));\n    }\n\n    const workspace = workspaces[workspaceName];\n\n    try {\n      yield (_child || _load_child()).spawn((_constants || _load_constants()).NODE_BIN_PATH, [(_constants || _load_constants()).YARN_BIN_PATH, ...rest], {\n        stdio: 'inherit',\n        cwd: workspace.loc\n      });\n    } catch (err) {\n      throw err;\n    }\n  });\n\n  return function run(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.setFlags = setFlags;\nexports.hasWrapper = hasWrapper;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _child;\n\nfunction _load_child() {\n  return _child = _interopRequireWildcard(__webpack_require__(50));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nfunction setFlags(commander) {}\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\n/***/ }),\n/* 516 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.examples = exports.setFlags = exports.run = exports.runScript = exports.info = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet info = exports.info = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const workspaceRootFolder = config.workspaceRootFolder;\n\n\n    if (!workspaceRootFolder) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('workspaceRootNotFound', config.cwd));\n    }\n\n    const manifest = yield config.findManifest(workspaceRootFolder, false);\n    invariant(manifest && manifest.workspaces, 'We must find a manifest with a \"workspaces\" property');\n\n    const workspaces = yield config.resolveWorkspaces(workspaceRootFolder, manifest);\n\n    const publicData = {};\n\n    for (var _iterator = Object.keys(workspaces), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref2;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref2 = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref2 = _i.value;\n      }\n\n      const workspaceName = _ref2;\n      var _workspaces$workspace = workspaces[workspaceName];\n      const loc = _workspaces$workspace.loc,\n            manifest = _workspaces$workspace.manifest;\n\n\n      const workspaceDependencies = new Set();\n      const mismatchedWorkspaceDependencies = new Set();\n\n      for (var _iterator2 = (_constants || _load_constants()).DEPENDENCY_TYPES, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref3;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref3 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref3 = _i2.value;\n        }\n\n        const dependencyType = _ref3;\n\n        if (dependencyType !== 'peerDependencies') {\n          for (var _iterator3 = Object.keys(manifest[dependencyType] || {}), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n            var _ref4;\n\n            if (_isArray3) {\n              if (_i3 >= _iterator3.length) break;\n              _ref4 = _iterator3[_i3++];\n            } else {\n              _i3 = _iterator3.next();\n              if (_i3.done) break;\n              _ref4 = _i3.value;\n            }\n\n            const dependencyName = _ref4;\n\n            if (Object.prototype.hasOwnProperty.call(workspaces, dependencyName)) {\n              invariant(manifest && manifest[dependencyType], 'The request should exist');\n              const requestedRange = manifest[dependencyType][dependencyName];\n              if (semver.satisfies(workspaces[dependencyName].manifest.version, requestedRange)) {\n                workspaceDependencies.add(dependencyName);\n              } else {\n                mismatchedWorkspaceDependencies.add(dependencyName);\n              }\n            }\n          }\n        }\n      }\n\n      publicData[workspaceName] = {\n        location: path.relative(config.lockfileFolder, loc).replace(/\\\\/g, '/'),\n        workspaceDependencies: Array.from(workspaceDependencies),\n        mismatchedWorkspaceDependencies: Array.from(mismatchedWorkspaceDependencies)\n      };\n    }\n\n    reporter.log(JSON.stringify(publicData, null, 2), { force: true });\n  });\n\n  return function info(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet runScript = exports.runScript = (() => {\n  var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) {\n    const workspaceRootFolder = config.workspaceRootFolder;\n\n\n    if (!workspaceRootFolder) {\n      throw new (_errors || _load_errors()).MessageError(reporter.lang('workspaceRootNotFound', config.cwd));\n    }\n\n    const manifest = yield config.findManifest(workspaceRootFolder, false);\n    invariant(manifest && manifest.workspaces, 'We must find a manifest with a \"workspaces\" property');\n\n    const workspaces = yield config.resolveWorkspaces(workspaceRootFolder, manifest);\n\n    try {\n      for (var _iterator4 = Object.keys(workspaces), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n        var _ref6;\n\n        if (_isArray4) {\n          if (_i4 >= _iterator4.length) break;\n          _ref6 = _iterator4[_i4++];\n        } else {\n          _i4 = _iterator4.next();\n          if (_i4.done) break;\n          _ref6 = _i4.value;\n        }\n\n        const workspaceName = _ref6;\n        const loc = workspaces[workspaceName].loc;\n\n        reporter.log(`${os.EOL}> ${workspaceName}`);\n        yield (_child || _load_child()).spawn((_constants2 || _load_constants2()).NODE_BIN_PATH, [(_constants2 || _load_constants2()).YARN_BIN_PATH, 'run', ...args], {\n          stdio: 'inherit',\n          cwd: loc\n        });\n      }\n    } catch (err) {\n      throw err;\n    }\n  });\n\n  return function runScript(_x5, _x6, _x7, _x8) {\n    return _ref5.apply(this, arguments);\n  };\n})();\n\nexports.hasWrapper = hasWrapper;\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _buildSubCommands2;\n\nfunction _load_buildSubCommands() {\n  return _buildSubCommands2 = _interopRequireDefault(__webpack_require__(59));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nvar _child;\n\nfunction _load_child() {\n  return _child = _interopRequireWildcard(__webpack_require__(50));\n}\n\nvar _constants2;\n\nfunction _load_constants2() {\n  return _constants2 = __webpack_require__(8);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\nconst path = __webpack_require__(0);\nconst os = __webpack_require__(42);\nconst semver = __webpack_require__(22);\n\nfunction hasWrapper(commander, args) {\n  return true;\n}\n\nvar _buildSubCommands = (0, (_buildSubCommands2 || _load_buildSubCommands()).default)('workspaces', {\n  info(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield info(config, reporter, flags, args);\n    })();\n  },\n  run(config, reporter, flags, args) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield runScript(config, reporter, flags, args);\n    })();\n  }\n});\n\nconst run = _buildSubCommands.run,\n      setFlags = _buildSubCommands.setFlags,\n      examples = _buildSubCommands.examples;\nexports.run = run;\nexports.setFlags = setFlags;\nexports.examples = examples;\n\n/***/ }),\n/* 517 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* WEBPACK VAR INJECTION */(function(module) {\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.autoRun = exports.main = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet main = exports.main = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ({\n    startArgs,\n    args,\n    endArgs\n  }) {\n    const collect = function collect(val, acc) {\n      acc.push(val);\n      return acc;\n    };\n\n    (0, (_loudRejection || _load_loudRejection()).default)();\n    (0, (_signalHandler || _load_signalHandler()).default)();\n\n    // set global options\n    (_commander || _load_commander()).default.version((_yarnVersion || _load_yarnVersion()).version, '-v, --version');\n    (_commander || _load_commander()).default.usage('[command] [flags]');\n    (_commander || _load_commander()).default.option('--no-default-rc', 'prevent Yarn from automatically detecting yarnrc and npmrc files');\n    (_commander || _load_commander()).default.option('--use-yarnrc <path>', 'specifies a yarnrc file that Yarn should use (.yarnrc only, not .npmrc)', collect, []);\n    (_commander || _load_commander()).default.option('--verbose', 'output verbose messages on internal operations');\n    (_commander || _load_commander()).default.option('--offline', 'trigger an error if any required dependencies are not available in local cache');\n    (_commander || _load_commander()).default.option('--prefer-offline', 'use network only if dependencies are not available in local cache');\n    (_commander || _load_commander()).default.option('--enable-pnp, --pnp', \"enable the Plug'n'Play installation\");\n    (_commander || _load_commander()).default.option('--disable-pnp', \"disable the Plug'n'Play installation\");\n    (_commander || _load_commander()).default.option('--strict-semver');\n    (_commander || _load_commander()).default.option('--json', 'format Yarn log messages as lines of JSON (see jsonlines.org)');\n    (_commander || _load_commander()).default.option('--ignore-scripts', \"don't run lifecycle scripts\");\n    (_commander || _load_commander()).default.option('--har', 'save HAR output of network traffic');\n    (_commander || _load_commander()).default.option('--ignore-platform', 'ignore platform checks');\n    (_commander || _load_commander()).default.option('--ignore-engines', 'ignore engines check');\n    (_commander || _load_commander()).default.option('--ignore-optional', 'ignore optional dependencies');\n    (_commander || _load_commander()).default.option('--force', 'install and build packages even if they were built before, overwrite lockfile');\n    (_commander || _load_commander()).default.option('--skip-integrity-check', 'run install without checking if node_modules is installed');\n    (_commander || _load_commander()).default.option('--check-files', 'install will verify file tree of packages for consistency');\n    (_commander || _load_commander()).default.option('--no-bin-links', \"don't generate bin links when setting up packages\");\n    (_commander || _load_commander()).default.option('--flat', 'only allow one version of a package');\n    (_commander || _load_commander()).default.option('--prod, --production [prod]', '', (_conversion || _load_conversion()).boolify);\n    (_commander || _load_commander()).default.option('--no-lockfile', \"don't read or generate a lockfile\");\n    (_commander || _load_commander()).default.option('--pure-lockfile', \"don't generate a lockfile\");\n    (_commander || _load_commander()).default.option('--frozen-lockfile', \"don't generate a lockfile and fail if an update is needed\");\n    (_commander || _load_commander()).default.option('--update-checksums', 'update package checksums from current repository');\n    (_commander || _load_commander()).default.option('--link-duplicates', 'create hardlinks to the repeated modules in node_modules');\n    (_commander || _load_commander()).default.option('--link-folder <path>', 'specify a custom folder to store global links');\n    (_commander || _load_commander()).default.option('--global-folder <path>', 'specify a custom folder to store global packages');\n    (_commander || _load_commander()).default.option('--modules-folder <path>', 'rather than installing modules into the node_modules folder relative to the cwd, output them here');\n    (_commander || _load_commander()).default.option('--preferred-cache-folder <path>', 'specify a custom folder to store the yarn cache if possible');\n    (_commander || _load_commander()).default.option('--cache-folder <path>', 'specify a custom folder that must be used to store the yarn cache');\n    (_commander || _load_commander()).default.option('--mutex <type>[:specifier]', 'use a mutex to ensure only one yarn instance is executing');\n    (_commander || _load_commander()).default.option('--emoji [bool]', 'enable emoji in output', (_conversion || _load_conversion()).boolify, process.platform === 'darwin' || process.env.TERM_PROGRAM === 'Hyper' || process.env.TERM_PROGRAM === 'HyperTerm' || process.env.TERM_PROGRAM === 'Terminus');\n    (_commander || _load_commander()).default.option('-s, --silent', 'skip Yarn console logs, other types of logs (script output) will be printed');\n    (_commander || _load_commander()).default.option('--cwd <cwd>', 'working directory to use', process.cwd());\n    (_commander || _load_commander()).default.option('--proxy <host>', '');\n    (_commander || _load_commander()).default.option('--https-proxy <host>', '');\n    (_commander || _load_commander()).default.option('--registry <url>', 'override configuration registry');\n    (_commander || _load_commander()).default.option('--no-progress', 'disable progress bar');\n    (_commander || _load_commander()).default.option('--network-concurrency <number>', 'maximum number of concurrent network requests', parseInt);\n    (_commander || _load_commander()).default.option('--network-timeout <milliseconds>', 'TCP timeout for network requests', parseInt);\n    (_commander || _load_commander()).default.option('--non-interactive', 'do not show interactive prompts');\n    (_commander || _load_commander()).default.option('--scripts-prepend-node-path [bool]', 'prepend the node executable dir to the PATH in scripts', (_conversion || _load_conversion()).boolify);\n    (_commander || _load_commander()).default.option('--no-node-version-check', 'do not warn when using a potentially unsupported Node version');\n    (_commander || _load_commander()).default.option('--focus', 'Focus on a single workspace by installing remote copies of its sibling workspaces.');\n    (_commander || _load_commander()).default.option('--otp <otpcode>', 'one-time password for two factor authentication');\n\n    // if -v is the first command, then always exit after returning the version\n    if (args[0] === '-v') {\n      console.log((_yarnVersion || _load_yarnVersion()).version.trim());\n      process.exitCode = 0;\n      return;\n    }\n\n    // get command name\n    const firstNonFlagIndex = args.findIndex(function (arg, idx, arr) {\n      const isOption = arg.startsWith('-');\n      const prev = idx > 0 && arr[idx - 1];\n      const prevOption = prev && prev.startsWith('-') && (_commander || _load_commander()).default.optionFor(prev);\n      const boundToPrevOption = prevOption && (prevOption.optional || prevOption.required);\n\n      return !isOption && !boundToPrevOption;\n    });\n    let preCommandArgs;\n    let commandName = '';\n    if (firstNonFlagIndex > -1) {\n      preCommandArgs = args.slice(0, firstNonFlagIndex);\n      commandName = args[firstNonFlagIndex];\n      args = args.slice(firstNonFlagIndex + 1);\n    } else {\n      preCommandArgs = args;\n      args = [];\n    }\n\n    let isKnownCommand = Object.prototype.hasOwnProperty.call((_index3 || _load_index3()).default, commandName);\n    const isHelp = function isHelp(arg) {\n      return arg === '--help' || arg === '-h';\n    };\n    const helpInPre = preCommandArgs.findIndex(isHelp);\n    const helpInArgs = args.findIndex(isHelp);\n    const setHelpMode = function setHelpMode() {\n      if (isKnownCommand) {\n        args.unshift(commandName);\n      }\n      commandName = 'help';\n      isKnownCommand = true;\n    };\n\n    if (helpInPre > -1) {\n      preCommandArgs.splice(helpInPre);\n      setHelpMode();\n    } else if (isKnownCommand && helpInArgs === 0) {\n      args.splice(helpInArgs);\n      setHelpMode();\n    }\n\n    if (!commandName) {\n      commandName = 'install';\n      isKnownCommand = true;\n    }\n    if (commandName === 'set' && args[0] === 'version') {\n      commandName = 'policies';\n      args.splice(0, 1, 'set-version');\n      isKnownCommand = true;\n    }\n    if (!isKnownCommand) {\n      // if command is not recognized, then set default to `run`\n      args.unshift(commandName);\n      commandName = 'run';\n    }\n    const command = (_index3 || _load_index3()).default[commandName];\n\n    let warnAboutRunDashDash = false;\n    // we are using \"yarn <script> -abc\", \"yarn run <script> -abc\", or \"yarn node -abc\", we want -abc\n    // to be script options, not yarn options\n\n    // PROXY_COMMANDS is a map of command name to the number of preservedArgs\n    const PROXY_COMMANDS = {\n      run: 1, // yarn run {command}\n      create: 1, // yarn create {project}\n      node: 0, // yarn node\n      workspaces: 1, // yarn workspaces {command}\n      workspace: 2 // yarn workspace {package} {command}\n    };\n    if (PROXY_COMMANDS.hasOwnProperty(commandName)) {\n      if (endArgs.length === 0) {\n        // $FlowFixMe doesn't like that PROXY_COMMANDS doesn't have keys for all commands.\n        let preservedArgs = PROXY_COMMANDS[commandName];\n\n        // If the --into option immediately follows the command (or the script name in the \"run/create\"\n        // case), we parse them as regular options so that we can cd into them\n        if (args[preservedArgs] === `--into`) {\n          preservedArgs += 2;\n        }\n        endArgs = ['--', ...args.splice(preservedArgs)];\n      } else {\n        warnAboutRunDashDash = true;\n      }\n    }\n\n    args = [...preCommandArgs, ...args];\n\n    command.setFlags((_commander || _load_commander()).default);\n    (_commander || _load_commander()).default.parse([...startArgs,\n    // we use this for https://github.com/tj/commander.js/issues/346, otherwise\n    // it will strip some args that match with any options\n    'this-arg-will-get-stripped-later', ...(0, (_rc || _load_rc()).getRcArgs)(commandName, args), ...args]);\n    (_commander || _load_commander()).default.args = (_commander || _load_commander()).default.args.concat(endArgs.slice(1));\n\n    // we strip cmd\n    console.assert((_commander || _load_commander()).default.args.length >= 1);\n    console.assert((_commander || _load_commander()).default.args[0] === 'this-arg-will-get-stripped-later');\n    (_commander || _load_commander()).default.args.shift();\n\n    //\n    const Reporter = (_commander || _load_commander()).default.json ? (_index || _load_index()).JSONReporter : (_index || _load_index()).ConsoleReporter;\n    const reporter = new Reporter({\n      emoji: process.stdout.isTTY && (_commander || _load_commander()).default.emoji,\n      verbose: (_commander || _load_commander()).default.verbose,\n      noProgress: !(_commander || _load_commander()).default.progress,\n      isSilent: (0, (_conversion || _load_conversion()).boolifyWithDefault)(process.env.YARN_SILENT, false) || (_commander || _load_commander()).default.silent,\n      nonInteractive: (_commander || _load_commander()).default.nonInteractive\n    });\n\n    const exit = function exit(exitCode) {\n      process.exitCode = exitCode || 0;\n      reporter.close();\n    };\n\n    reporter.initPeakMemoryCounter();\n\n    const config = new (_config || _load_config()).default(reporter);\n\n    if (!process.env.COREPACK_ROOT && !process.env.SKIP_YARN_COREPACK_CHECK) {\n      const packageManager = findPackageManager((_commander || _load_commander()).default.cwd);\n      if (packageManager !== null) {\n        if (!packageManager.match(/^yarn@[01]\\./)) {\n          reporter.error(`This project's package.json defines ${chalk.gray('\"packageManager\": \"yarn@')}${chalk.yellow(`${packageManager.replace(/^yarn@/, ``).replace(/\\+.*/, ``)}`)}${chalk.gray(`\"`)}. However the current global version of Yarn is ${chalk.yellow((_yarnVersion || _load_yarnVersion()).version)}.`);\n\n          process.stderr.write(`\\n`);\n          process.stderr.write(`Presence of the ${chalk.gray(`\"packageManager\"`\n          // eslint-disable-next-line max-len\n          )} field indicates that the project is meant to be used with Corepack, a tool included by default with all official Node.js distributions starting from 16.9 and 14.19.\\n`);\n\n          process.stderr.write(`Corepack must currently be enabled by running ${chalk.magenta(`corepack enable`\n          // $FlowIgnore\n          )} in your terminal. For more information, check out ${chalk.blueBright(`https://yarnpkg.com/corepack`)}.\\n`);\n\n          exit(1);\n          return;\n        }\n      }\n    }\n\n    const outputWrapperEnabled = (0, (_conversion || _load_conversion()).boolifyWithDefault)(process.env.YARN_WRAP_OUTPUT, true);\n    const shouldWrapOutput = outputWrapperEnabled && !(_commander || _load_commander()).default.json && command.hasWrapper((_commander || _load_commander()).default, (_commander || _load_commander()).default.args) && !(commandName === 'init' && (_commander || _load_commander()).default[`2`]);\n\n    if (shouldWrapOutput) {\n      reporter.header(commandName, { name: 'yarn', version: (_yarnVersion || _load_yarnVersion()).version });\n    }\n\n    if ((_commander || _load_commander()).default.nodeVersionCheck && !(_semver || _load_semver()).default.satisfies(process.versions.node, (_constants || _load_constants()).SUPPORTED_NODE_VERSIONS)) {\n      reporter.warn(reporter.lang('unsupportedNodeVersion', process.versions.node, (_constants || _load_constants()).SUPPORTED_NODE_VERSIONS));\n    }\n\n    if (command.noArguments && (_commander || _load_commander()).default.args.length) {\n      reporter.error(reporter.lang('noArguments'));\n      reporter.info(command.getDocsInfo);\n      exit(1);\n      return;\n    }\n\n    //\n    if ((_commander || _load_commander()).default.yes) {\n      reporter.warn(reporter.lang('yesWarning'));\n    }\n\n    //\n    if (!(_commander || _load_commander()).default.offline && (_network || _load_network()).isOffline()) {\n      reporter.warn(reporter.lang('networkWarning'));\n    }\n\n    //\n    const run = function run() {\n      (0, (_invariant || _load_invariant()).default)(command, 'missing command');\n\n      if (warnAboutRunDashDash) {\n        reporter.warn(reporter.lang('dashDashDeprecation'));\n      }\n\n      return command.run(config, reporter, (_commander || _load_commander()).default, (_commander || _load_commander()).default.args).then(function (exitCode) {\n        if (shouldWrapOutput) {\n          reporter.footer(false);\n        }\n        return exitCode;\n      });\n    };\n\n    //\n    const runEventuallyWithFile = function runEventuallyWithFile(mutexFilename, isFirstTime) {\n      return new Promise(function (resolve) {\n        const lockFilename = mutexFilename || (_path || _load_path()).default.join(config.cwd, (_constants || _load_constants()).SINGLE_INSTANCE_FILENAME);\n        (_properLockfile || _load_properLockfile()).default.lock(lockFilename, { realpath: false }, function (err, release) {\n          if (err) {\n            if (isFirstTime) {\n              reporter.warn(reporter.lang('waitingInstance'));\n            }\n            setTimeout(function () {\n              resolve(runEventuallyWithFile(mutexFilename, false));\n            }, 200); // do not starve the CPU\n          } else {\n            (0, (_death || _load_death()).default)(function () {\n              process.exitCode = 1;\n            });\n            resolve(run().then(function () {\n              return new Promise(function (resolve) {\n                return release(resolve);\n              });\n            }));\n          }\n        });\n      });\n    };\n\n    const runEventuallyWithNetwork = function runEventuallyWithNetwork(mutexPort) {\n      return new Promise(function (resolve, reject) {\n        const connectionOptions = {\n          port: +mutexPort || (_constants || _load_constants()).SINGLE_INSTANCE_PORT,\n          host: 'localhost'\n        };\n\n        function startServer() {\n          const clients = new Set();\n          const server = (_http || _load_http()).default.createServer(manager);\n\n          // The server must not prevent us from exiting\n          server.unref();\n\n          // No socket must timeout, so that they aren't closed before we exit\n          server.timeout = 0;\n\n          // If we fail to setup the server, we ask the existing one for its name\n          server.on('error', () => {\n            reportServerName();\n          });\n\n          // If we succeed, keep track of all the connected sockets to close them later\n          server.on('connection', socket => {\n            clients.add(socket);\n            socket.on('close', () => {\n              clients.delete(socket);\n            });\n          });\n\n          server.listen(connectionOptions, () => {\n            // Don't forget to kill the sockets if we're being killed via signals\n            (0, (_death || _load_death()).default)(killSockets);\n\n            // Also kill the sockets if we finish, whether it's a success or a failure\n            run().then(res => {\n              killSockets();\n              resolve(res);\n            }, err => {\n              killSockets();\n              reject(err);\n            });\n          });\n\n          function manager(request, response) {\n            response.writeHead(200);\n            response.end(JSON.stringify({ cwd: config.cwd, pid: process.pid }));\n          }\n\n          function killSockets() {\n            try {\n              server.close();\n            } catch (err) {\n              // best effort\n            }\n\n            for (var _iterator = clients, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n              var _ref2;\n\n              if (_isArray) {\n                if (_i >= _iterator.length) break;\n                _ref2 = _iterator[_i++];\n              } else {\n                _i = _iterator.next();\n                if (_i.done) break;\n                _ref2 = _i.value;\n              }\n\n              const socket = _ref2;\n\n              try {\n                socket.destroy();\n              } catch (err) {\n                // best effort\n              }\n            }\n\n            // If the process hasn't exited in the next 5s, it has stalled and we abort\n            const timeout = setTimeout(() => {\n              console.error('Process stalled');\n              if (process._getActiveHandles) {\n                console.error('Active handles:');\n                // $FlowFixMe: getActiveHandles is undocumented, but it exists\n                for (var _iterator2 = process._getActiveHandles(), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n                  var _ref3;\n\n                  if (_isArray2) {\n                    if (_i2 >= _iterator2.length) break;\n                    _ref3 = _iterator2[_i2++];\n                  } else {\n                    _i2 = _iterator2.next();\n                    if (_i2.done) break;\n                    _ref3 = _i2.value;\n                  }\n\n                  const handle = _ref3;\n\n                  console.error(`  - ${handle.constructor.name}`);\n                }\n              }\n              // eslint-disable-next-line no-process-exit\n              process.exit(1);\n            }, 5000);\n\n            // This timeout must not prevent us from exiting\n            // $FlowFixMe: Node's setTimeout returns a Timeout, not a Number\n            timeout.unref();\n          }\n        }\n\n        function reportServerName() {\n          const request = (_http || _load_http()).default.get(connectionOptions, response => {\n            const buffers = [];\n\n            response.on('data', buffer => {\n              buffers.push(buffer);\n            });\n\n            response.on('end', () => {\n              try {\n                var _JSON$parse = JSON.parse(Buffer.concat(buffers).toString());\n\n                const cwd = _JSON$parse.cwd,\n                      pid = _JSON$parse.pid;\n\n                reporter.warn(reporter.lang('waitingNamedInstance', pid, cwd));\n              } catch (error) {\n                reporter.verbose(error);\n                reject(new Error(reporter.lang('mutexPortBusy', connectionOptions.port)));\n                return;\n              }\n              waitForTheNetwork();\n            });\n\n            response.on('error', () => {\n              startServer();\n            });\n          });\n\n          request.on('error', () => {\n            startServer();\n          });\n        }\n\n        function waitForTheNetwork() {\n          const socket = (_net || _load_net()).default.createConnection(connectionOptions);\n\n          socket.on('error', () => {\n            // catch & ignore, the retry is handled in 'close'\n          });\n\n          socket.on('close', () => {\n            startServer();\n          });\n        }\n\n        startServer();\n      });\n    };\n\n    const cwd = command.shouldRunInCurrentCwd ? (_commander || _load_commander()).default.cwd : findProjectRoot((_commander || _load_commander()).default.cwd);\n\n    const folderOptionKeys = ['linkFolder', 'globalFolder', 'preferredCacheFolder', 'cacheFolder', 'modulesFolder'];\n\n    // Resolve all folder options relative to cwd\n    const resolvedFolderOptions = {};\n    folderOptionKeys.forEach(function (folderOptionKey) {\n      const folderOption = (_commander || _load_commander()).default[folderOptionKey];\n      const resolvedFolderOption = folderOption ? (_path || _load_path()).default.resolve((_commander || _load_commander()).default.cwd, folderOption) : folderOption;\n      resolvedFolderOptions[folderOptionKey] = resolvedFolderOption;\n    });\n\n    yield config.init((0, (_extends2 || _load_extends()).default)({\n      cwd,\n      commandName\n    }, resolvedFolderOptions, {\n      enablePnp: (_commander || _load_commander()).default.pnp,\n      disablePnp: (_commander || _load_commander()).default.disablePnp,\n      enableDefaultRc: (_commander || _load_commander()).default.defaultRc,\n      extraneousYarnrcFiles: (_commander || _load_commander()).default.useYarnrc,\n      binLinks: (_commander || _load_commander()).default.binLinks,\n      preferOffline: (_commander || _load_commander()).default.preferOffline,\n      captureHar: (_commander || _load_commander()).default.har,\n      ignorePlatform: (_commander || _load_commander()).default.ignorePlatform,\n      ignoreEngines: (_commander || _load_commander()).default.ignoreEngines,\n      ignoreScripts: (_commander || _load_commander()).default.ignoreScripts,\n      offline: (_commander || _load_commander()).default.preferOffline || (_commander || _load_commander()).default.offline,\n      looseSemver: !(_commander || _load_commander()).default.strictSemver,\n      production: (_commander || _load_commander()).default.production,\n      httpProxy: (_commander || _load_commander()).default.proxy,\n      httpsProxy: (_commander || _load_commander()).default.httpsProxy,\n      registry: (_commander || _load_commander()).default.registry,\n      networkConcurrency: (_commander || _load_commander()).default.networkConcurrency,\n      networkTimeout: (_commander || _load_commander()).default.networkTimeout,\n      nonInteractive: (_commander || _load_commander()).default.nonInteractive,\n      updateChecksums: (_commander || _load_commander()).default.updateChecksums,\n      focus: (_commander || _load_commander()).default.focus,\n      otp: (_commander || _load_commander()).default.otp\n    })).then(function () {\n      // lockfile check must happen after config.init sets lockfileFolder\n      if (command.requireLockfile && !(_fs || _load_fs()).default.existsSync((_path || _load_path()).default.join(config.lockfileFolder, (_constants || _load_constants()).LOCKFILE_FILENAME))) {\n        throw new (_errors || _load_errors()).MessageError(reporter.lang('noRequiredLockfile'));\n      }\n\n      // option \"no-progress\" stored in yarn config\n      const noProgressConfig = config.registries.yarn.getOption('no-progress');\n\n      if (noProgressConfig) {\n        reporter.disableProgress();\n      }\n\n      // verbose logs outputs process.uptime() with this line we can sync uptime to absolute time on the computer\n      reporter.verbose(`current time: ${new Date().toISOString()}`);\n\n      const mutex = (_commander || _load_commander()).default.mutex;\n      if (mutex && typeof mutex === 'string') {\n        const separatorLoc = mutex.indexOf(':');\n        let mutexType;\n        let mutexSpecifier;\n        if (separatorLoc === -1) {\n          mutexType = mutex;\n          mutexSpecifier = undefined;\n        } else {\n          mutexType = mutex.substring(0, separatorLoc);\n          mutexSpecifier = mutex.substring(separatorLoc + 1);\n        }\n\n        if (mutexType === 'file') {\n          return runEventuallyWithFile(mutexSpecifier, true).then(exit);\n        } else if (mutexType === 'network') {\n          return runEventuallyWithNetwork(mutexSpecifier).then(exit);\n        } else {\n          throw new (_errors || _load_errors()).MessageError(`Unknown single instance type ${mutexType}`);\n        }\n      } else {\n        return run().then(exit);\n      }\n    }).catch(function (err) {\n      reporter.verbose(err.stack);\n\n      if (err instanceof (_errors2 || _load_errors2()).ProcessTermError && reporter.isSilent) {\n        return exit(err.EXIT_CODE || 1);\n      }\n\n      if (err instanceof (_errors || _load_errors()).MessageError) {\n        reporter.error(err.message);\n      } else {\n        reporter.error(err.stack);\n      }\n\n      if (command.getDocsInfo) {\n        reporter.info(command.getDocsInfo);\n      }\n\n      if (err instanceof (_errors2 || _load_errors2()).ProcessTermError) {\n        return exit(err.EXIT_CODE || 1);\n      }\n\n      return exit(1);\n    });\n  });\n\n  return function main(_x) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nlet start = (() => {\n  var _ref4 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n    const rc = (0, (_rc || _load_rc()).getRcConfigForCwd)(process.cwd(), process.argv.slice(2));\n    const yarnPath = rc['yarn-path'] || rc['yarnPath'];\n\n    if (yarnPath && !(0, (_conversion || _load_conversion()).boolifyWithDefault)(process.env.YARN_IGNORE_PATH, false)) {\n      const argv = process.argv.slice(2);\n      const opts = { stdio: 'inherit', env: Object.assign({}, process.env, { YARN_IGNORE_PATH: 1 }) };\n      let exitCode = 0;\n\n      process.on(`SIGINT`, function () {\n        // We don't want SIGINT to kill our process; we want it to kill the\n        // innermost process, whose end will cause our own to exit.\n      });\n\n      (0, (_signalHandler || _load_signalHandler()).default)();\n\n      try {\n        if (/\\.[cm]?js$/.test(yarnPath)) {\n          exitCode = yield (0, (_child || _load_child()).spawnp)(process.execPath, [yarnPath, ...argv], opts);\n        } else {\n          exitCode = yield (0, (_child || _load_child()).spawnp)(yarnPath, argv, opts);\n        }\n      } catch (firstError) {\n        try {\n          exitCode = yield (0, (_child || _load_child()).forkp)(yarnPath, argv, opts);\n        } catch (error) {\n          throw firstError;\n        }\n      }\n\n      process.exitCode = exitCode;\n    } else {\n      // ignore all arguments after a --\n      const doubleDashIndex = process.argv.findIndex(function (element) {\n        return element === '--';\n      });\n      const startArgs = process.argv.slice(0, 2);\n      const args = process.argv.slice(2, doubleDashIndex === -1 ? process.argv.length : doubleDashIndex);\n      const endArgs = doubleDashIndex === -1 ? [] : process.argv.slice(doubleDashIndex);\n\n      yield main({ startArgs, args, endArgs });\n    }\n  });\n\n  return function start() {\n    return _ref4.apply(this, arguments);\n  };\n})();\n\n// When this module is compiled via Webpack, its child\n// count will be 0 since it is a single-file bundle.\n\n\nvar _http;\n\nfunction _load_http() {\n  return _http = _interopRequireDefault(__webpack_require__(87));\n}\n\nvar _net;\n\nfunction _load_net() {\n  return _net = _interopRequireDefault(__webpack_require__(164));\n}\n\nvar _path;\n\nfunction _load_path() {\n  return _path = _interopRequireDefault(__webpack_require__(0));\n}\n\nvar _commander;\n\nfunction _load_commander() {\n  return _commander = _interopRequireDefault(__webpack_require__(338));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireDefault(__webpack_require__(4));\n}\n\nvar _invariant;\n\nfunction _load_invariant() {\n  return _invariant = _interopRequireDefault(__webpack_require__(9));\n}\n\nvar _properLockfile;\n\nfunction _load_properLockfile() {\n  return _properLockfile = _interopRequireDefault(__webpack_require__(471));\n}\n\nvar _loudRejection;\n\nfunction _load_loudRejection() {\n  return _loudRejection = _interopRequireDefault(__webpack_require__(470));\n}\n\nvar _death;\n\nfunction _load_death() {\n  return _death = _interopRequireDefault(__webpack_require__(469));\n}\n\nvar _semver;\n\nfunction _load_semver() {\n  return _semver = _interopRequireDefault(__webpack_require__(22));\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = __webpack_require__(201);\n}\n\nvar _index2;\n\nfunction _load_index2() {\n  return _index2 = __webpack_require__(58);\n}\n\nvar _index3;\n\nfunction _load_index3() {\n  return _index3 = _interopRequireDefault(__webpack_require__(334));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _network;\n\nfunction _load_network() {\n  return _network = _interopRequireWildcard(__webpack_require__(337));\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _config;\n\nfunction _load_config() {\n  return _config = _interopRequireDefault(__webpack_require__(163));\n}\n\nvar _rc;\n\nfunction _load_rc() {\n  return _rc = __webpack_require__(335);\n}\n\nvar _child;\n\nfunction _load_child() {\n  return _child = __webpack_require__(50);\n}\n\nvar _yarnVersion;\n\nfunction _load_yarnVersion() {\n  return _yarnVersion = __webpack_require__(105);\n}\n\nvar _signalHandler;\n\nfunction _load_signalHandler() {\n  return _signalHandler = _interopRequireDefault(__webpack_require__(468));\n}\n\nvar _conversion;\n\nfunction _load_conversion() {\n  return _conversion = __webpack_require__(336);\n}\n\nvar _errors2;\n\nfunction _load_errors2() {\n  return _errors2 = __webpack_require__(6);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst chalk = __webpack_require__(27);\n\nprocess.stdout.prependListener('error', err => {\n  // swallow err only if downstream consumer process closed pipe early\n  if (err.code === 'EPIPE' || err.code === 'ERR_STREAM_DESTROYED') {\n    return;\n  }\n  throw err;\n});\n\nfunction findPackageManager(base) {\n  let prev = null;\n  let dir = base;\n\n  do {\n    const p = (_path || _load_path()).default.join(dir, (_constants || _load_constants()).NODE_PACKAGE_JSON);\n\n    let data;\n    try {\n      data = JSON.parse((_fs || _load_fs()).default.readFileSync(p, `utf8`));\n    } catch (err) {}\n\n    if (data && typeof data.packageManager === `string`) {\n      return data.packageManager;\n    }\n\n    prev = dir;\n    dir = (_path || _load_path()).default.dirname(dir);\n  } while (dir !== prev);\n\n  return null;\n}\n\nfunction findProjectRoot(base) {\n  let prev = null;\n  let dir = base;\n\n  do {\n    if ((_fs || _load_fs()).default.existsSync((_path || _load_path()).default.join(dir, (_constants || _load_constants()).NODE_PACKAGE_JSON))) {\n      return dir;\n    }\n\n    prev = dir;\n    dir = (_path || _load_path()).default.dirname(dir);\n  } while (dir !== prev);\n\n  return base;\n}\n\nconst autoRun = exports.autoRun = module.children.length === 0;\n\nif (__webpack_require__.c[__webpack_require__.s] === module) {\n  start().catch(error => {\n    console.error(error.stack || error.message || error);\n    process.exitCode = 1;\n  });\n}\n\nexports.default = start;\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(121)(module)))\n\n/***/ }),\n/* 518 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _baseFetcher;\n\nfunction _load_baseFetcher() {\n  return _baseFetcher = _interopRequireDefault(__webpack_require__(167));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass CopyFetcher extends (_baseFetcher || _load_baseFetcher()).default {\n  _fetch() {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield (_fs || _load_fs()).copy(_this.reference, _this.dest, _this.reporter);\n      return {\n        hash: _this.hash || '',\n        resolved: null\n      };\n    })();\n  }\n}\nexports.default = CopyFetcher;\n\n/***/ }),\n/* 519 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _baseFetcher;\n\nfunction _load_baseFetcher() {\n  return _baseFetcher = _interopRequireDefault(__webpack_require__(167));\n}\n\nvar _git;\n\nfunction _load_git() {\n  return _git = _interopRequireDefault(__webpack_require__(217));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = _interopRequireWildcard(__webpack_require__(8));\n}\n\nvar _crypto;\n\nfunction _load_crypto() {\n  return _crypto = _interopRequireWildcard(__webpack_require__(168));\n}\n\nvar _install;\n\nfunction _load_install() {\n  return _install = __webpack_require__(34);\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = _interopRequireDefault(__webpack_require__(19));\n}\n\nvar _config;\n\nfunction _load_config() {\n  return _config = _interopRequireDefault(__webpack_require__(163));\n}\n\nvar _pack;\n\nfunction _load_pack() {\n  return _pack = __webpack_require__(166);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst tarFs = __webpack_require__(194);\nconst url = __webpack_require__(24);\nconst path = __webpack_require__(0);\nconst fs = __webpack_require__(4);\n\nconst invariant = __webpack_require__(9);\n\nconst PACKED_FLAG = '1';\n\nclass GitFetcher extends (_baseFetcher || _load_baseFetcher()).default {\n  setupMirrorFromCache() {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const tarballMirrorPath = _this.getTarballMirrorPath();\n      const tarballCachePath = _this.getTarballCachePath();\n\n      if (tarballMirrorPath == null) {\n        return;\n      }\n\n      if (!(yield (_fs || _load_fs()).exists(tarballMirrorPath)) && (yield (_fs || _load_fs()).exists(tarballCachePath))) {\n        // The tarball doesn't exists in the offline cache but does in the cache; we import it to the mirror\n        yield (_fs || _load_fs()).mkdirp(path.dirname(tarballMirrorPath));\n        yield (_fs || _load_fs()).copy(tarballCachePath, tarballMirrorPath, _this.reporter);\n      }\n    })();\n  }\n\n  getTarballMirrorPath({ withCommit = true } = {}) {\n    var _url$parse = url.parse(this.reference);\n\n    const pathname = _url$parse.pathname;\n\n\n    if (pathname == null) {\n      return null;\n    }\n\n    const hash = this.hash;\n\n    let packageFilename = withCommit && hash ? `${path.basename(pathname)}-${hash}` : `${path.basename(pathname)}`;\n\n    if (packageFilename.startsWith(':')) {\n      packageFilename = packageFilename.substr(1);\n    }\n\n    return this.config.getOfflineMirrorPath(packageFilename);\n  }\n\n  getTarballCachePath() {\n    return path.join(this.dest, (_constants || _load_constants()).TARBALL_FILENAME);\n  }\n\n  getLocalPaths(override) {\n    const paths = [override ? path.resolve(this.config.cwd, override) : null, this.getTarballMirrorPath(), this.getTarballMirrorPath({ withCommit: false }), this.getTarballCachePath()];\n    // $FlowFixMe: https://github.com/facebook/flow/issues/1414\n    return paths.filter(path => path != null);\n  }\n\n  fetchFromLocal(override) {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const tarPaths = _this2.getLocalPaths(override);\n      const stream = yield (_fs || _load_fs()).readFirstAvailableStream(tarPaths);\n\n      return new Promise(function (resolve, reject) {\n        if (!stream) {\n          reject(new (_errors || _load_errors()).MessageError(_this2.reporter.lang('tarballNotInNetworkOrCache', _this2.reference, tarPaths)));\n          return;\n        }\n        invariant(stream, 'cachedStream should be available at this point');\n        // $FlowFixMe - This is available https://nodejs.org/api/fs.html#fs_readstream_path\n        const tarballPath = stream.path;\n\n        const untarStream = _this2._createUntarStream(_this2.dest);\n\n        const hashStream = new (_crypto || _load_crypto()).HashStream();\n        stream.pipe(hashStream).pipe(untarStream).on('finish', function () {\n          const expectHash = _this2.hash;\n          invariant(expectHash, 'Commit hash required');\n\n          const actualHash = hashStream.getHash();\n\n          // This condition is disabled because \"expectHash\" actually is the commit hash\n          // This is a design issue that we'll need to fix (https://github.com/yarnpkg/yarn/pull/3449)\n          if (true) {\n            resolve({\n              hash: expectHash\n            });\n          } else {\n            reject(new (_errors || _load_errors()).SecurityError(_this2.config.reporter.lang('fetchBadHashWithPath', _this2.packageName, _this2.remote.reference, expectHash, actualHash)));\n          }\n        }).on('error', function (err) {\n          reject(new (_errors || _load_errors()).MessageError(this.reporter.lang('fetchErrorCorrupt', err.message, tarballPath)));\n        });\n      });\n    })();\n  }\n\n  hasPrepareScript(git) {\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const manifestFile = yield git.getFile('package.json');\n\n      if (manifestFile) {\n        const scripts = JSON.parse(manifestFile).scripts;\n        const hasPrepareScript = Boolean(scripts && scripts.prepare);\n        return hasPrepareScript;\n      }\n\n      return false;\n    })();\n  }\n\n  fetchFromExternal() {\n    var _this3 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const hash = _this3.hash;\n      invariant(hash, 'Commit hash required');\n\n      const gitUrl = (_git || _load_git()).default.npmUrlToGitUrl(_this3.reference);\n      const git = new (_git || _load_git()).default(_this3.config, gitUrl, hash);\n      yield git.init();\n\n      if (yield _this3.hasPrepareScript(git)) {\n        yield _this3.fetchFromInstallAndPack(git);\n      } else {\n        yield _this3.fetchFromGitArchive(git);\n      }\n\n      return {\n        hash\n      };\n    })();\n  }\n\n  fetchFromInstallAndPack(git) {\n    var _this4 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const prepareDirectory = _this4.config.getTemp(`${(_crypto || _load_crypto()).hash(git.gitUrl.repository)}.${git.hash}.prepare`);\n      yield (_fs || _load_fs()).unlink(prepareDirectory);\n\n      yield git.clone(prepareDirectory);\n\n      var _ref = yield Promise.all([(_config || _load_config()).default.create({\n        binLinks: true,\n        cwd: prepareDirectory,\n        disablePrepublish: true,\n        production: false\n      }, _this4.reporter), (_lockfile || _load_lockfile()).default.fromDirectory(prepareDirectory, _this4.reporter)]);\n\n      const prepareConfig = _ref[0],\n            prepareLockFile = _ref[1];\n\n      yield (0, (_install || _load_install()).install)(prepareConfig, _this4.reporter, {}, prepareLockFile);\n\n      const tarballMirrorPath = _this4.getTarballMirrorPath();\n      const tarballCachePath = _this4.getTarballCachePath();\n\n      if (tarballMirrorPath) {\n        yield _this4._packToTarball(prepareConfig, tarballMirrorPath);\n      }\n      if (tarballCachePath) {\n        yield _this4._packToTarball(prepareConfig, tarballCachePath);\n      }\n\n      yield _this4._packToDirectory(prepareConfig, _this4.dest);\n\n      yield (_fs || _load_fs()).unlink(prepareDirectory);\n    })();\n  }\n\n  _packToTarball(config, path) {\n    var _this5 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const tarballStream = yield _this5._createTarballStream(config);\n      yield new Promise(function (resolve, reject) {\n        const writeStream = fs.createWriteStream(path);\n        tarballStream.on('error', reject);\n        writeStream.on('error', reject);\n        writeStream.on('end', resolve);\n        writeStream.on('open', function () {\n          tarballStream.pipe(writeStream);\n        });\n        writeStream.once('finish', resolve);\n      });\n    })();\n  }\n\n  _packToDirectory(config, dest) {\n    var _this6 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const tarballStream = yield _this6._createTarballStream(config);\n      yield new Promise(function (resolve, reject) {\n        const untarStream = _this6._createUntarStream(dest);\n        tarballStream.on('error', reject);\n        untarStream.on('error', reject);\n        untarStream.on('end', resolve);\n        untarStream.once('finish', resolve);\n        tarballStream.pipe(untarStream);\n      });\n    })();\n  }\n\n  _createTarballStream(config) {\n    let savedPackedHeader = false;\n    return (0, (_pack || _load_pack()).packTarball)(config, {\n      mapHeader(header) {\n        if (!savedPackedHeader) {\n          savedPackedHeader = true;\n          header.pax = header.pax || {};\n          // add a custom data on the first header\n          // in order to distinguish a tar from \"git archive\" and a tar from \"pack\" command\n          header.pax.packed = PACKED_FLAG;\n        }\n        return header;\n      }\n    });\n  }\n\n  _createUntarStream(dest) {\n    const PREFIX = 'package/';\n    let isPackedTarball = undefined;\n    return tarFs.extract(dest, {\n      dmode: 0o555, // all dirs should be readable\n      fmode: 0o444, // all files should be readable\n      chown: false, // don't chown. just leave as it is\n      map: header => {\n        if (isPackedTarball === undefined) {\n          isPackedTarball = header.pax && header.pax.packed === PACKED_FLAG;\n        }\n        if (isPackedTarball) {\n          header.name = header.name.substr(PREFIX.length);\n        }\n      }\n    });\n  }\n\n  fetchFromGitArchive(git) {\n    var _this7 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield git.clone(_this7.dest);\n      const tarballMirrorPath = _this7.getTarballMirrorPath();\n      const tarballCachePath = _this7.getTarballCachePath();\n\n      if (tarballMirrorPath) {\n        yield git.archive(tarballMirrorPath);\n      }\n\n      if (tarballCachePath) {\n        yield git.archive(tarballCachePath);\n      }\n    })();\n  }\n\n  _fetch() {\n    return this.fetchFromLocal().catch(err => this.fetchFromExternal());\n  }\n}\nexports.default = GitFetcher;\n\n/***/ }),\n/* 520 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.workspace = exports.tarball = exports.git = exports.copy = exports.base = undefined;\n\nvar _baseFetcher;\n\nfunction _load_baseFetcher() {\n  return _baseFetcher = _interopRequireDefault(__webpack_require__(167));\n}\n\nvar _copyFetcher;\n\nfunction _load_copyFetcher() {\n  return _copyFetcher = _interopRequireDefault(__webpack_require__(518));\n}\n\nvar _gitFetcher;\n\nfunction _load_gitFetcher() {\n  return _gitFetcher = _interopRequireDefault(__webpack_require__(519));\n}\n\nvar _tarballFetcher;\n\nfunction _load_tarballFetcher() {\n  return _tarballFetcher = _interopRequireDefault(__webpack_require__(358));\n}\n\nvar _workspaceFetcher;\n\nfunction _load_workspaceFetcher() {\n  return _workspaceFetcher = _interopRequireDefault(__webpack_require__(521));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.base = (_baseFetcher || _load_baseFetcher()).default;\nexports.copy = (_copyFetcher || _load_copyFetcher()).default;\nexports.git = (_gitFetcher || _load_gitFetcher()).default;\nexports.tarball = (_tarballFetcher || _load_tarballFetcher()).default;\nexports.workspace = (_workspaceFetcher || _load_workspaceFetcher()).default;\n\n/***/ }),\n/* 521 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _packageFetcher;\n\nfunction _load_packageFetcher() {\n  return _packageFetcher = __webpack_require__(208);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass WorkspaceFetcher {\n  constructor(dest, remote, config) {\n    this.config = config;\n    this.dest = dest;\n    this.registry = remote.registry;\n    this.workspaceDir = remote.reference;\n    this.registryRemote = remote.registryRemote;\n  }\n\n  setupMirrorFromCache() {\n    return Promise.resolve();\n  }\n\n  fetch() {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const pkg = yield _this.config.readManifest(_this.workspaceDir, _this.registry);\n\n      if (_this.registryRemote) {\n        yield _this.fetchRemoteWorkspace(_this.registryRemote, pkg);\n      }\n\n      return {\n        resolved: null,\n        hash: '',\n        cached: false,\n        dest: _this.dest,\n        package: (0, (_extends2 || _load_extends()).default)({}, pkg, {\n          _uid: pkg.version\n        })\n      };\n    })();\n  }\n\n  fetchRemoteWorkspace(remote, manifest) {\n    return (0, (_packageFetcher || _load_packageFetcher()).fetchOneRemote)(remote, manifest.name, manifest.version, this.dest, this.config);\n  }\n}\nexports.default = WorkspaceFetcher;\n\n/***/ }),\n/* 522 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.buildTree = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet buildTree = exports.buildTree = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (resolver, linker, patterns, ignoreHoisted) {\n    const treesByKey = {};\n    const trees = [];\n    const flatTree = yield linker.getFlatHoistedTree(patterns);\n\n    // If using workspaces, filter out the virtual manifest\n    const workspaceLayout = resolver.workspaceLayout;\n\n    const hoisted = workspaceLayout && workspaceLayout.virtualManifestName ? flatTree.filter(function ([key]) {\n      return key.indexOf(workspaceLayout.virtualManifestName) === -1;\n    }) : flatTree;\n\n    const hoistedByKey = {};\n    for (var _iterator = hoisted, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref3;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref3 = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref3 = _i.value;\n      }\n\n      const _ref2 = _ref3;\n      const key = _ref2[0];\n      const info = _ref2[1];\n\n      hoistedByKey[key] = info;\n    }\n\n    // build initial trees\n    for (var _iterator2 = hoisted, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n      var _ref5;\n\n      if (_isArray2) {\n        if (_i2 >= _iterator2.length) break;\n        _ref5 = _iterator2[_i2++];\n      } else {\n        _i2 = _iterator2.next();\n        if (_i2.done) break;\n        _ref5 = _i2.value;\n      }\n\n      const _ref4 = _ref5;\n      const info = _ref4[1];\n\n      const ref = info.pkg._reference;\n      // const parent = getParent(info.key, treesByKey);\n      const children = [];\n      // let depth = 0;\n      invariant(ref, 'expected reference');\n\n      // check parent to obtain next depth\n      // if (parent && parent.depth > 0) {\n      //   depth = parent.depth + 1;\n      // } else {\n      //   depth = 0;\n      // }\n\n      treesByKey[info.key] = {\n        name: info.pkg.name,\n        version: info.pkg.version,\n        children,\n        manifest: info\n      };\n    }\n\n    // add children\n    for (var _iterator3 = hoisted, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n      var _ref7;\n\n      if (_isArray3) {\n        if (_i3 >= _iterator3.length) break;\n        _ref7 = _iterator3[_i3++];\n      } else {\n        _i3 = _iterator3.next();\n        if (_i3.done) break;\n        _ref7 = _i3.value;\n      }\n\n      const _ref6 = _ref7;\n      const info = _ref6[1];\n\n      const tree = treesByKey[info.key];\n      const parent = getParent(info.key, treesByKey);\n      if (!tree) {\n        continue;\n      }\n\n      if (info.key.split('#').length === 1) {\n        trees.push(tree);\n        continue;\n      }\n\n      if (parent) {\n        parent.children.push(tree);\n      }\n    }\n\n    return trees;\n  });\n\n  return function buildTree(_x, _x2, _x3, _x4) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.getParent = getParent;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nfunction getParent(key, treesByKey) {\n  const parentKey = key.slice(0, key.lastIndexOf('#'));\n  return treesByKey[parentKey];\n}\n\n/***/ }),\n/* 523 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nconst semver = __webpack_require__(22);\n\n// This isn't really a \"proper\" constraint resolver. We just return the highest semver\n// version in the versions passed that satisfies the input range. This vastly reduces\n// the complexity and is very efficient for package resolution.\n\nclass PackageConstraintResolver {\n  constructor(config, reporter) {\n    this.reporter = reporter;\n    this.config = config;\n  }\n\n  reduce(versions, range) {\n    if (range === 'latest') {\n      // Usually versions are already ordered and the last one is the latest\n      return Promise.resolve(versions[versions.length - 1]);\n    } else {\n      return Promise.resolve(semver.maxSatisfying(versions, range, this.config.looseSemver));\n    }\n  }\n}\nexports.default = PackageConstraintResolver;\n\n/***/ }),\n/* 524 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.NohoistResolver = exports.HoistManifest = undefined;\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _config;\n\nfunction _load_config() {\n  return _config = _interopRequireDefault(__webpack_require__(163));\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nvar _micromatch;\n\nfunction _load_micromatch() {\n  return _micromatch = _interopRequireDefault(__webpack_require__(115));\n}\n\nvar _workspaceLayout2;\n\nfunction _load_workspaceLayout() {\n  return _workspaceLayout2 = _interopRequireDefault(__webpack_require__(90));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nconst path = __webpack_require__(0);\n\nlet historyCounter = 0;\n\nconst LINK_TYPES = new Set(['workspace', 'link']);\nclass HoistManifest {\n  constructor(key, parts, pkg, loc, isDirectRequire, isRequired, isIncompatible) {\n    this.isDirectRequire = isDirectRequire;\n    this.isRequired = isRequired;\n    this.isIncompatible = isIncompatible;\n\n    this.loc = loc;\n    this.pkg = pkg;\n    this.key = key;\n    this.parts = parts;\n    this.originalKey = key;\n    this.previousPaths = [];\n\n    this.history = [];\n    this.addHistory(`Start position = ${key}`);\n\n    this.isNohoist = false;\n    this.originalParentPath = '';\n\n    this.shallowPaths = [];\n    this.isShallow = false;\n  }\n\n  //focus\n\n\n  // nohoist info\n\n\n  addHistory(msg) {\n    this.history.push(`${++historyCounter}: ${msg}`);\n  }\n}\n\nexports.HoistManifest = HoistManifest;\nclass PackageHoister {\n  constructor(config, resolver, { ignoreOptional, workspaceLayout } = {}) {\n    this.resolver = resolver;\n    this.config = config;\n\n    this.ignoreOptional = ignoreOptional;\n\n    this.taintedKeys = new Map();\n    this.levelQueue = [];\n    this.tree = new Map();\n\n    this.workspaceLayout = workspaceLayout;\n\n    this.nohoistResolver = new NohoistResolver(config, resolver);\n  }\n\n  /**\n   * Taint this key and prevent any modules from being hoisted to it.\n   */\n\n  taintKey(key, info) {\n    const existingTaint = this.taintedKeys.get(key);\n    if (existingTaint && existingTaint.loc !== info.loc) {\n      return false;\n    } else {\n      this.taintedKeys.set(key, info);\n      return true;\n    }\n  }\n\n  /**\n   * Implode an array of ancestry parts into a key.\n   */\n\n  implodeKey(parts) {\n    return parts.join('#');\n  }\n\n  /**\n   * Seed the hoister with patterns taken from the included resolver.\n   */\n\n  seed(patterns) {\n    this.prepass(patterns);\n\n    for (var _iterator = this.resolver.dedupePatterns(patterns), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const pattern = _ref;\n\n      this._seed(pattern, { isDirectRequire: true });\n    }\n\n    while (true) {\n      let queue = this.levelQueue;\n      if (!queue.length) {\n        this._propagateRequired();\n        return;\n      }\n\n      this.levelQueue = [];\n\n      // sort queue to get determinism between runs\n      queue = queue.sort(([aPattern], [bPattern]) => {\n        return (0, (_misc || _load_misc()).sortAlpha)(aPattern, bPattern);\n      });\n\n      // sort the queue again to hoist packages without peer dependencies first\n      let sortedQueue = [];\n      const availableSet = new Set();\n\n      let hasChanged = true;\n      while (queue.length > 0 && hasChanged) {\n        hasChanged = false;\n\n        const queueCopy = queue;\n        queue = [];\n        for (let t = 0; t < queueCopy.length; ++t) {\n          const queueItem = queueCopy[t];\n          const pattern = queueItem[0];\n          const pkg = this.resolver.getStrictResolvedPattern(pattern);\n\n          const peerDependencies = Object.keys(pkg.peerDependencies || {});\n          const areDependenciesFulfilled = peerDependencies.every(peerDependency => availableSet.has(peerDependency));\n\n          if (areDependenciesFulfilled) {\n            // Move the package inside our sorted queue\n            sortedQueue.push(queueItem);\n\n            // Add it to our set, so that we know it is available\n            availableSet.add(pattern);\n\n            // Schedule a next pass, in case other packages had peer dependencies on this one\n            hasChanged = true;\n          } else {\n            queue.push(queueItem);\n          }\n        }\n      }\n\n      // We might end up with some packages left in the queue, that have not been sorted. We reach this codepath if two\n      // packages have a cyclic dependency, or if the peer dependency is provided by a parent package. In these case,\n      // nothing we can do, so we just add all of these packages to the end of the sorted queue.\n      sortedQueue = sortedQueue.concat(queue);\n\n      for (var _iterator2 = sortedQueue, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref3;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref3 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref3 = _i2.value;\n        }\n\n        const _ref2 = _ref3;\n        const pattern = _ref2[0];\n        const parent = _ref2[1];\n\n        const info = this._seed(pattern, { isDirectRequire: false, parent });\n        if (info) {\n          this.hoist(info);\n        }\n      }\n    }\n  }\n\n  /**\n   * Seed the hoister with a specific pattern.\n   */\n\n  _seed(pattern, { isDirectRequire, parent }) {\n    //\n    const pkg = this.resolver.getStrictResolvedPattern(pattern);\n    const ref = pkg._reference;\n    invariant(ref, 'expected reference');\n\n    //\n    let parentParts = [];\n\n    const isIncompatible = ref.incompatible;\n    const isMarkedAsOptional = ref.optional && this.ignoreOptional;\n\n    let isRequired = isDirectRequire && !ref.ignore && !isIncompatible && !isMarkedAsOptional;\n\n    if (parent) {\n      if (!this.tree.get(parent.key)) {\n        return null;\n      }\n      // non ignored dependencies inherit parent's ignored status\n      // parent may transition from ignored to non ignored when hoisted if it is used in another non ignored branch\n      if (!isDirectRequire && !isIncompatible && parent.isRequired && !isMarkedAsOptional) {\n        isRequired = true;\n      }\n      parentParts = parent.parts;\n    }\n\n    //\n    const loc = this.config.generateModuleCachePath(ref);\n    const parts = parentParts.concat(pkg.name);\n    const key = this.implodeKey(parts);\n    const info = new HoistManifest(key, parts, pkg, loc, isDirectRequire, isRequired, isIncompatible);\n\n    this.nohoistResolver.initNohoist(info, parent);\n\n    this.tree.set(key, info);\n    this.taintKey(key, info);\n\n    //\n    const pushed = new Set();\n    for (var _iterator3 = ref.dependencies, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n      var _ref4;\n\n      if (_isArray3) {\n        if (_i3 >= _iterator3.length) break;\n        _ref4 = _iterator3[_i3++];\n      } else {\n        _i3 = _iterator3.next();\n        if (_i3.done) break;\n        _ref4 = _i3.value;\n      }\n\n      const depPattern = _ref4;\n\n      if (!pushed.has(depPattern)) {\n        this.levelQueue.push([depPattern, info]);\n        pushed.add(depPattern);\n      }\n    }\n\n    return info;\n  }\n\n  /**\n   * Propagate inherited ignore statuses from non-ignored to ignored packages\n   */\n\n  _propagateRequired() {\n    //\n    const toVisit = [];\n\n    // enumerate all non-ignored packages\n    for (var _iterator4 = this.tree.entries(), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n      var _ref5;\n\n      if (_isArray4) {\n        if (_i4 >= _iterator4.length) break;\n        _ref5 = _iterator4[_i4++];\n      } else {\n        _i4 = _iterator4.next();\n        if (_i4.done) break;\n        _ref5 = _i4.value;\n      }\n\n      const entry = _ref5;\n\n      if (entry[1].isRequired) {\n        toVisit.push(entry[1]);\n      }\n    }\n\n    // visit them\n    while (toVisit.length) {\n      const info = toVisit.shift();\n      const ref = info.pkg._reference;\n      invariant(ref, 'expected reference');\n\n      for (var _iterator5 = ref.dependencies, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n        var _ref6;\n\n        if (_isArray5) {\n          if (_i5 >= _iterator5.length) break;\n          _ref6 = _iterator5[_i5++];\n        } else {\n          _i5 = _iterator5.next();\n          if (_i5.done) break;\n          _ref6 = _i5.value;\n        }\n\n        const depPattern = _ref6;\n\n        const depinfo = this._lookupDependency(info, depPattern);\n\n        if (!depinfo) {\n          continue;\n        }\n\n        const depRef = depinfo.pkg._reference;\n\n        // If it's marked as optional, but the parent is required and the\n        // dependency was not listed in `optionalDependencies`, then we mark the\n        // dependency as required.\n        const isMarkedAsOptional = depRef && depRef.optional && this.ignoreOptional && !(info.isRequired && depRef.hint !== 'optional');\n\n        if (!depinfo.isRequired && !depinfo.isIncompatible && !isMarkedAsOptional) {\n          depinfo.isRequired = true;\n          depinfo.addHistory(`Mark as non-ignored because of usage by ${info.key}`);\n          toVisit.push(depinfo);\n        }\n      }\n    }\n  }\n\n  /**\n   * Looks up the package a dependency resolves to\n   */\n\n  _lookupDependency(info, depPattern) {\n    //\n    const pkg = this.resolver.getStrictResolvedPattern(depPattern);\n    const ref = pkg._reference;\n    invariant(ref, 'expected reference');\n\n    //\n    for (let i = info.parts.length; i >= 0; i--) {\n      const checkParts = info.parts.slice(0, i).concat(pkg.name);\n      const checkKey = this.implodeKey(checkParts);\n      const existing = this.tree.get(checkKey);\n      if (existing) {\n        return existing;\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Find the highest position we can hoist this module to.\n   */\n\n  getNewParts(key, info, parts) {\n    let stepUp = false;\n\n    const highestHoistingPoint = this.nohoistResolver.highestHoistingPoint(info) || 0;\n    const fullKey = this.implodeKey(parts);\n    const stack = []; // stack of removed parts\n    const name = parts.pop();\n\n    if (info.isNohoist) {\n      info.addHistory(`Marked as nohoist, will not be hoisted above '${parts[highestHoistingPoint]}'`);\n    }\n\n    for (let i = parts.length - 1; i >= highestHoistingPoint; i--) {\n      const checkParts = parts.slice(0, i).concat(name);\n      const checkKey = this.implodeKey(checkParts);\n      info.addHistory(`Looked at ${checkKey} for a match`);\n\n      const existing = this.tree.get(checkKey);\n\n      if (existing) {\n        if (existing.loc === info.loc) {\n          // switch to non ignored if earlier deduped version was ignored (must be compatible)\n          if (!existing.isRequired && info.isRequired) {\n            existing.addHistory(`Deduped ${fullKey} to this item, marking as required`);\n            existing.isRequired = true;\n          } else {\n            existing.addHistory(`Deduped ${fullKey} to this item`);\n          }\n\n          return { parts: checkParts, duplicate: true };\n        } else {\n          // everything above will be shadowed and this is a conflict\n          info.addHistory(`Found a collision at ${checkKey}`);\n          break;\n        }\n      }\n\n      const existingTaint = this.taintedKeys.get(checkKey);\n      if (existingTaint && existingTaint.loc !== info.loc) {\n        info.addHistory(`Broken by ${checkKey}`);\n        break;\n      }\n    }\n\n    const peerDependencies = Object.keys(info.pkg.peerDependencies || {});\n\n    // remove redundant parts that wont collide\n    hoistLoop: while (parts.length > highestHoistingPoint) {\n      // we must not hoist a package higher than its peer dependencies\n      for (var _iterator6 = peerDependencies, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n        var _ref7;\n\n        if (_isArray6) {\n          if (_i6 >= _iterator6.length) break;\n          _ref7 = _iterator6[_i6++];\n        } else {\n          _i6 = _iterator6.next();\n          if (_i6.done) break;\n          _ref7 = _i6.value;\n        }\n\n        const peerDependency = _ref7;\n\n        const checkParts = parts.concat(peerDependency);\n        const checkKey = this.implodeKey(checkParts);\n        info.addHistory(`Looked at ${checkKey} for a peer dependency match`);\n\n        const existing = this.tree.get(checkKey);\n\n        if (existing) {\n          info.addHistory(`Found a peer dependency requirement at ${checkKey}`);\n          break hoistLoop;\n        }\n      }\n\n      const checkParts = parts.concat(name);\n      const checkKey = this.implodeKey(checkParts);\n\n      //\n      const existing = this.tree.get(checkKey);\n      if (existing) {\n        stepUp = true;\n        break;\n      }\n\n      // check if we're trying to hoist ourselves to a previously unflattened module key,\n      // this will result in a conflict and we'll need to move ourselves up\n      if (key !== checkKey && this.taintedKeys.has(checkKey)) {\n        stepUp = true;\n        break;\n      }\n\n      //\n      stack.push(parts.pop());\n    }\n\n    //\n    parts.push(name);\n\n    //\n    const isValidPosition = parts => {\n      // nohoist package can't be hoisted to the \"root\"\n      if (parts.length <= highestHoistingPoint) {\n        return false;\n      }\n      const key = this.implodeKey(parts);\n      const existing = this.tree.get(key);\n      if (existing && existing.loc === info.loc) {\n        return true;\n      }\n\n      // ensure there's no taint or the taint is us\n      const existingTaint = this.taintedKeys.get(key);\n      if (existingTaint && existingTaint.loc !== info.loc) {\n        return false;\n      }\n\n      return true;\n    };\n\n    // we need to special case when we attempt to hoist to the top level as the `existing` logic\n    // wont be hit in the above `while` loop and we could conflict\n    if (!isValidPosition(parts)) {\n      stepUp = true;\n    }\n\n    // sometimes we need to step up to a parent module to install ourselves\n    while (stepUp && stack.length) {\n      info.addHistory(`Stepping up from ${this.implodeKey(parts)}`);\n\n      parts.pop(); // remove `name`\n      parts.push(stack.pop(), name);\n\n      if (isValidPosition(parts)) {\n        info.addHistory(`Found valid position ${this.implodeKey(parts)}`);\n        stepUp = false;\n      }\n    }\n\n    return { parts, duplicate: false };\n  }\n\n  /**\n   * Hoist all seeded patterns to their highest positions.\n   */\n\n  hoist(info) {\n    const oldKey = info.key,\n          rawParts = info.parts;\n\n    // remove this item from the `tree` map so we can ignore it\n\n    this.tree.delete(oldKey);\n\n    var _getNewParts = this.getNewParts(oldKey, info, rawParts.slice());\n\n    const parts = _getNewParts.parts,\n          duplicate = _getNewParts.duplicate;\n\n\n    const newKey = this.implodeKey(parts);\n    if (duplicate) {\n      info.addHistory(`Satisfied from above by ${newKey}`);\n      this.declareRename(info, rawParts, parts);\n      this.updateHoistHistory(this.nohoistResolver._originalPath(info), this.implodeKey(parts));\n      return;\n    }\n\n    // update to the new key\n    if (oldKey === newKey) {\n      info.addHistory(`Didn't hoist - see reason above`);\n      this.setKey(info, oldKey, rawParts);\n      return;\n    }\n\n    //\n    this.declareRename(info, rawParts, parts);\n    this.setKey(info, newKey, parts);\n  }\n\n  /**\n   * Declare that a module has been hoisted and update our internal references.\n   */\n\n  declareRename(info, oldParts, newParts) {\n    // go down the tree from our new position reserving our name\n    this.taintParents(info, oldParts.slice(0, -1), newParts.length - 1);\n  }\n\n  /**\n   * Crawl upwards through a list of ancestry parts and taint a package name.\n   */\n\n  taintParents(info, processParts, start) {\n    for (let i = start; i < processParts.length; i++) {\n      const parts = processParts.slice(0, i).concat(info.pkg.name);\n      const key = this.implodeKey(parts);\n\n      if (this.taintKey(key, info)) {\n        info.addHistory(`Tainted ${key} to prevent collisions`);\n      }\n    }\n  }\n\n  updateHoistHistory(fromPath, toKey) {\n    const info = this.tree.get(toKey);\n    invariant(info, `expect to find hoist-to ${toKey}`);\n    info.previousPaths.push(fromPath);\n  }\n\n  /**\n   * Update the key of a module and update our references.\n   */\n\n  setKey(info, newKey, parts) {\n    const oldKey = info.key;\n\n    info.key = newKey;\n    info.parts = parts;\n    this.tree.set(newKey, info);\n\n    if (oldKey === newKey) {\n      return;\n    }\n\n    const fromInfo = this.tree.get(newKey);\n    invariant(fromInfo, `expect to find hoist-from ${newKey}`);\n    info.previousPaths.push(this.nohoistResolver._originalPath(fromInfo));\n    info.addHistory(`New position = ${newKey}`);\n  }\n\n  /**\n   * Perform a prepass and if there's multiple versions of the same package, hoist the one with\n   * the most dependents to the top.\n   */\n\n  prepass(patterns) {\n    patterns = this.resolver.dedupePatterns(patterns).sort();\n\n    const visited = new Map();\n\n    const occurences = {};\n\n    // visitor to be used inside add() to mark occurences of packages\n    const visitAdd = (pkg, ancestry, pattern) => {\n      const versions = occurences[pkg.name] = occurences[pkg.name] || {};\n      const version = versions[pkg.version] = versions[pkg.version] || {\n        occurences: new Set(),\n        pattern\n      };\n\n      if (ancestry.length) {\n        version.occurences.add(ancestry[ancestry.length - 1]);\n      }\n    };\n\n    // add an occurring package to the above data structure\n    const add = (pattern, ancestry, ancestryPatterns) => {\n      const pkg = this.resolver.getStrictResolvedPattern(pattern);\n      if (ancestry.indexOf(pkg) >= 0) {\n        // prevent recursive dependencies\n        return;\n      }\n\n      let visitedPattern = visited.get(pattern);\n\n      if (visitedPattern) {\n        // if a package has been visited before, simply increment occurrences of packages\n        // like last time this package was visited\n        visitedPattern.forEach(visitPkg => {\n          visitAdd(visitPkg.pkg, visitPkg.ancestry, visitPkg.pattern);\n        });\n\n        visitAdd(pkg, ancestry, pattern);\n\n        return;\n      }\n\n      const ref = pkg._reference;\n      invariant(ref, 'expected reference');\n\n      visitAdd(pkg, ancestry, pattern);\n\n      for (var _iterator7 = ref.dependencies, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {\n        var _ref8;\n\n        if (_isArray7) {\n          if (_i7 >= _iterator7.length) break;\n          _ref8 = _iterator7[_i7++];\n        } else {\n          _i7 = _iterator7.next();\n          if (_i7.done) break;\n          _ref8 = _i7.value;\n        }\n\n        const depPattern = _ref8;\n\n        const depAncestry = ancestry.concat(pkg);\n        const depAncestryPatterns = ancestryPatterns.concat(depPattern);\n        add(depPattern, depAncestry, depAncestryPatterns);\n      }\n\n      visitedPattern = visited.get(pattern) || [];\n      visited.set(pattern, visitedPattern);\n      visitedPattern.push({ pkg, ancestry, pattern });\n\n      ancestryPatterns.forEach(ancestryPattern => {\n        const visitedAncestryPattern = visited.get(ancestryPattern);\n        if (visitedAncestryPattern) {\n          visitedAncestryPattern.push({ pkg, ancestry, pattern });\n        }\n      });\n    };\n\n    // get a list of root package names since we can't hoist other dependencies to these spots!\n    const rootPackageNames = new Set();\n    for (var _iterator8 = patterns, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {\n      var _ref9;\n\n      if (_isArray8) {\n        if (_i8 >= _iterator8.length) break;\n        _ref9 = _iterator8[_i8++];\n      } else {\n        _i8 = _iterator8.next();\n        if (_i8.done) break;\n        _ref9 = _i8.value;\n      }\n\n      const pattern = _ref9;\n\n      const pkg = this.resolver.getStrictResolvedPattern(pattern);\n      rootPackageNames.add(pkg.name);\n      add(pattern, [], []);\n    }\n\n    for (var _iterator9 = Object.keys(occurences).sort(), _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {\n      var _ref10;\n\n      if (_isArray9) {\n        if (_i9 >= _iterator9.length) break;\n        _ref10 = _iterator9[_i9++];\n      } else {\n        _i9 = _iterator9.next();\n        if (_i9.done) break;\n        _ref10 = _i9.value;\n      }\n\n      const packageName = _ref10;\n\n      const versionOccurences = occurences[packageName];\n      const versions = Object.keys(versionOccurences);\n\n      if (versions.length === 1) {\n        // only one package type so we'll hoist this to the top anyway\n        continue;\n      }\n\n      if (this.tree.get(packageName)) {\n        // a transitive dependency of a previously hoisted dependency exists\n        continue;\n      }\n\n      if (rootPackageNames.has(packageName)) {\n        // can't replace top level packages\n        continue;\n      }\n\n      let mostOccurenceCount;\n      let mostOccurencePattern;\n      for (var _iterator10 = Object.keys(versionOccurences).sort(), _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) {\n        var _ref11;\n\n        if (_isArray10) {\n          if (_i10 >= _iterator10.length) break;\n          _ref11 = _iterator10[_i10++];\n        } else {\n          _i10 = _iterator10.next();\n          if (_i10.done) break;\n          _ref11 = _i10.value;\n        }\n\n        const version = _ref11;\n        var _versionOccurences$ve = versionOccurences[version];\n        const occurences = _versionOccurences$ve.occurences,\n              pattern = _versionOccurences$ve.pattern;\n\n        const occurenceCount = occurences.size;\n\n        if (!mostOccurenceCount || occurenceCount > mostOccurenceCount) {\n          mostOccurenceCount = occurenceCount;\n          mostOccurencePattern = pattern;\n        }\n      }\n      invariant(mostOccurencePattern, 'expected most occurring pattern');\n      invariant(mostOccurenceCount, 'expected most occurring count');\n\n      // only hoist this module if it occured more than once\n      if (mostOccurenceCount > 1) {\n        this._seed(mostOccurencePattern, { isDirectRequire: false });\n      }\n    }\n  }\n\n  markShallowWorkspaceEntries() {\n    const targetWorkspace = this.config.focusedWorkspaceName;\n    const targetHoistManifest = this.tree.get(targetWorkspace);\n    invariant(targetHoistManifest, `targetHoistManifest from ${targetWorkspace} missing`);\n\n    //dedupe with a set\n    const dependentWorkspaces = Array.from(new Set(this._getDependentWorkspaces(targetHoistManifest)));\n\n    const entries = Array.from(this.tree);\n    entries.forEach(([key, info]) => {\n      const splitPath = key.split('#');\n\n      //mark the workspace and any un-hoisted dependencies it has for shallow installation\n      const isShallowDependency = dependentWorkspaces.some(w => {\n        if (splitPath[0] !== w) {\n          //entry is not related to the workspace\n          return false;\n        }\n        if (!splitPath[1]) {\n          //entry is the workspace\n          return true;\n        }\n        //don't bother marking dev dependencies or nohoist packages for shallow installation\n        const treeEntry = this.tree.get(w);\n        invariant(treeEntry, 'treeEntry is not defined for ' + w);\n        const pkg = treeEntry.pkg;\n        return !info.isNohoist && (!pkg.devDependencies || !(splitPath[1] in pkg.devDependencies));\n      });\n\n      if (isShallowDependency) {\n        info.shallowPaths = [null];\n        return;\n      }\n\n      //if package foo is at TARGET_WORKSPACE/node_modules/foo, the hoisted version of foo\n      //should be installed under each shallow workspace that uses it\n      //(unless that workspace has its own version of foo, in which case that should be installed)\n      if (splitPath.length !== 2 || splitPath[0] !== targetWorkspace) {\n        return;\n      }\n      const unhoistedDependency = splitPath[1];\n      const unhoistedInfo = this.tree.get(unhoistedDependency);\n      if (!unhoistedInfo) {\n        return;\n      }\n      dependentWorkspaces.forEach(w => {\n        if (this._packageDependsOnHoistedPackage(w, unhoistedDependency, false)) {\n          unhoistedInfo.shallowPaths.push(w);\n        }\n      });\n    });\n  }\n\n  _getDependentWorkspaces(parent, allowDevDeps = true, alreadySeen = new Set()) {\n    const parentName = parent.pkg.name;\n    if (alreadySeen.has(parentName)) {\n      return [];\n    }\n\n    alreadySeen.add(parentName);\n    invariant(this.workspaceLayout, 'missing workspaceLayout');\n    var _workspaceLayout = this.workspaceLayout;\n    const virtualManifestName = _workspaceLayout.virtualManifestName,\n          workspaces = _workspaceLayout.workspaces;\n\n\n    const directDependencies = [];\n    const ignored = [];\n    Object.keys(workspaces).forEach(workspace => {\n      if (alreadySeen.has(workspace) || workspace === virtualManifestName) {\n        return;\n      }\n\n      //skip a workspace if a different version of it is already being installed under the parent workspace\n      let info = this.tree.get(`${parentName}#${workspace}`);\n      if (info) {\n        const workspaceVersion = workspaces[workspace].manifest.version;\n        if (info.isNohoist && info.originalParentPath.startsWith(`/${WS_ROOT_ALIAS}/${parentName}`) && info.pkg.version === workspaceVersion) {\n          //nohoist installations are exceptions\n          directDependencies.push(info.key);\n        } else {\n          ignored.push(workspace);\n        }\n        return;\n      }\n\n      const searchPath = `/${WS_ROOT_ALIAS}/${parentName}`;\n      info = this.tree.get(workspace);\n      invariant(info, 'missing workspace tree entry ' + workspace);\n      if (!info.previousPaths.some(p => p.startsWith(searchPath))) {\n        return;\n      }\n      if (allowDevDeps || !parent.pkg.devDependencies || !(workspace in parent.pkg.devDependencies)) {\n        directDependencies.push(workspace);\n      }\n    });\n\n    let nested = directDependencies.map(d => {\n      const dependencyEntry = this.tree.get(d);\n      invariant(dependencyEntry, 'missing dependencyEntry ' + d);\n      return this._getDependentWorkspaces(dependencyEntry, false, alreadySeen);\n    });\n    nested = [].concat.apply([], nested); //flatten\n\n    const directDependencyNames = directDependencies.map(d => d.split('#').slice(-1)[0]);\n\n    return directDependencyNames.concat(nested).filter(w => ignored.indexOf(w) === -1);\n  }\n\n  _packageDependsOnHoistedPackage(p, hoisted, checkDevDeps = true, checked = new Set()) {\n    //don't check the same package more than once, and ignore any package that has its own version of hoisted\n    if (checked.has(p) || this.tree.has(`${p}#${hoisted}`)) {\n      return false;\n    }\n    checked.add(p);\n    const info = this.tree.get(p);\n    if (!info) {\n      return false;\n    }\n\n    const pkg = info.pkg;\n    if (!pkg) {\n      return false;\n    }\n\n    let deps = [];\n    if (pkg.dependencies) {\n      deps = deps.concat(Object.keys(pkg.dependencies));\n    }\n    if (checkDevDeps && pkg.devDependencies) {\n      deps = deps.concat(Object.keys(pkg.devDependencies));\n    }\n\n    if (deps.indexOf(hoisted) !== -1) {\n      return true;\n    }\n    return deps.some(dep => this._packageDependsOnHoistedPackage(dep, hoisted, false, checked));\n  }\n\n  /**\n   * Produce a flattened list of module locations and manifests.\n   */\n\n  init() {\n    const flatTree = [];\n\n    //\n    for (var _iterator11 = this.tree.entries(), _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) {\n      var _ref13;\n\n      if (_isArray11) {\n        if (_i11 >= _iterator11.length) break;\n        _ref13 = _iterator11[_i11++];\n      } else {\n        _i11 = _iterator11.next();\n        if (_i11.done) break;\n        _ref13 = _i11.value;\n      }\n\n      const _ref12 = _ref13;\n      const key = _ref12[0];\n      const info = _ref12[1];\n\n      // decompress the location and push it to the flat tree. this path could be made\n      const parts = [];\n      const keyParts = key.split('#');\n      const isWorkspaceEntry = this.workspaceLayout && keyParts[0] === this.workspaceLayout.virtualManifestName;\n\n      // Don't add the virtual manifest (keyParts.length === 1)\n      // or ws childs which were not hoisted to the root (keyParts.length === 2).\n      // If a ws child was hoisted its key would not contain the virtual manifest name\n      if (isWorkspaceEntry && keyParts.length <= 2) {\n        continue;\n      }\n\n      for (let i = 0; i < keyParts.length; i++) {\n        const key = keyParts.slice(0, i + 1).join('#');\n        const hoisted = this.tree.get(key);\n        invariant(hoisted, `expected hoisted manifest for \"${key}\"`);\n        parts.push(this.config.getFolder(hoisted.pkg));\n        parts.push(keyParts[i]);\n      }\n\n      // Check if the destination is pointing to a sub folder of the virtualManifestName\n      // e.g. _project_/node_modules/workspace-aggregator-123456/node_modules/workspaceChild/node_modules/dependency\n      // This probably happened because the hoister was not able to hoist the workspace child to the root\n      // So we have to change the folder to the workspace package location\n      if (this.workspaceLayout && isWorkspaceEntry) {\n        const wspPkg = this.workspaceLayout.workspaces[keyParts[1]];\n        invariant(wspPkg, `expected workspace package to exist for \"${keyParts[1]}\"`);\n        parts.splice(0, 4, wspPkg.loc);\n      } else {\n        if (this.config.modulesFolder) {\n          // remove the first part which will be the folder name and replace it with a\n          // hardcoded modules folder\n          parts.splice(0, 1, this.config.modulesFolder);\n        } else {\n          // first part will be the registry-specific module folder\n          parts.splice(0, 0, this.config.lockfileFolder);\n        }\n      }\n\n      const shallowLocs = [];\n      info.shallowPaths.forEach(shallowPath => {\n        const shallowCopyParts = parts.slice();\n        shallowCopyParts[0] = this.config.cwd;\n        if (this.config.modulesFolder) {\n          //add back the module folder name for the shallow installation\n          const treeEntry = this.tree.get(keyParts[0]);\n          invariant(treeEntry, 'expected treeEntry for ' + keyParts[0]);\n          const moduleFolderName = this.config.getFolder(treeEntry.pkg);\n          shallowCopyParts.splice(1, 0, moduleFolderName);\n        }\n\n        if (shallowPath) {\n          const targetWorkspace = this.config.focusedWorkspaceName;\n          const treeEntry = this.tree.get(`${targetWorkspace}#${shallowPath}`) || this.tree.get(shallowPath);\n          invariant(treeEntry, 'expected treeEntry for ' + shallowPath);\n          const moduleFolderName = this.config.getFolder(treeEntry.pkg);\n          shallowCopyParts.splice(1, 0, moduleFolderName, shallowPath);\n        }\n        shallowLocs.push(path.join(...shallowCopyParts));\n      });\n\n      const loc = path.join(...parts);\n      flatTree.push([loc, info]);\n      shallowLocs.forEach(shallowLoc => {\n        const newManifest = (0, (_extends2 || _load_extends()).default)({}, info, { isShallow: true });\n        flatTree.push([shallowLoc, newManifest]);\n      });\n    }\n\n    // remove ignored modules from the tree\n    const visibleFlatTree = [];\n    for (var _iterator12 = flatTree, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) {\n      var _ref15;\n\n      if (_isArray12) {\n        if (_i12 >= _iterator12.length) break;\n        _ref15 = _iterator12[_i12++];\n      } else {\n        _i12 = _iterator12.next();\n        if (_i12.done) break;\n        _ref15 = _i12.value;\n      }\n\n      const _ref14 = _ref15;\n      const loc = _ref14[0];\n      const info = _ref14[1];\n\n      const ref = info.pkg._reference;\n      invariant(ref, 'expected reference');\n      if (!info.isRequired) {\n        info.addHistory('Deleted as this module was ignored');\n      } else {\n        visibleFlatTree.push([loc, info]);\n      }\n    }\n    return visibleFlatTree;\n  }\n}\n\nexports.default = PackageHoister;\nconst WS_ROOT_ALIAS = '_project_';\nclass NohoistResolver {\n  constructor(config, resolver) {\n    this.initNohoist = (info, parent) => {\n      let parentNohoistList;\n      let originalParentPath = info.originalParentPath;\n\n      if (parent) {\n        parentNohoistList = parent.nohoistList;\n        originalParentPath = this._originalPath(parent);\n      } else {\n        invariant(this._isTopPackage(info), `${info.key} doesn't have parent nor a top package`);\n        if (info.pkg.name !== this._wsRootPackageName) {\n          parentNohoistList = this._wsRootNohoistList;\n          originalParentPath = this._wsRootPackageName || '';\n        }\n      }\n\n      info.originalParentPath = originalParentPath;\n      let nohoistList = this._extractNohoistList(info.pkg, this._originalPath(info)) || [];\n      if (parentNohoistList) {\n        nohoistList = nohoistList.concat(parentNohoistList);\n      }\n      info.nohoistList = nohoistList.length > 0 ? nohoistList : null;\n      info.isNohoist = this._isNohoist(info);\n    };\n\n    this.highestHoistingPoint = info => {\n      return info.isNohoist && info.parts.length > 1 ? 1 : null;\n    };\n\n    this._isNohoist = info => {\n      if (this._isTopPackage(info)) {\n        return false;\n      }\n      if (info.nohoistList && info.nohoistList.length > 0 && (_micromatch || _load_micromatch()).default.any(this._originalPath(info), info.nohoistList)) {\n        return true;\n      }\n      if (this._config.plugnplayEnabled) {\n        return true;\n      }\n      return false;\n    };\n\n    this._isRootPackage = pkg => {\n      return pkg.name === this._wsRootPackageName;\n    };\n\n    this._originalPath = info => {\n      return this._makePath(info.originalParentPath, info.pkg.name);\n    };\n\n    this._isTopPackage = info => {\n      const parentParts = info.parts.slice(0, -1);\n      const result = !parentParts || parentParts.length <= 0 || parentParts.length === 1 && parentParts[0] === this._wsRootPackageName;\n      return result;\n    };\n\n    this._isLink = info => {\n      return info.pkg._remote != null && LINK_TYPES.has(info.pkg._remote.type);\n    };\n\n    this._extractNohoistList = (pkg, pathPrefix) => {\n      let nohoistList;\n      const ws = this._config.getWorkspaces(pkg);\n\n      if (ws && ws.nohoist) {\n        nohoistList = ws.nohoist.map(p => this._makePath(pathPrefix, p));\n      }\n      return nohoistList;\n    };\n\n    this._resolver = resolver;\n    this._config = config;\n    if (resolver.workspaceLayout) {\n      this._wsRootPackageName = resolver.workspaceLayout.virtualManifestName;\n\n      var _resolver$workspaceLa = resolver.workspaceLayout.getWorkspaceManifest(this._wsRootPackageName);\n\n      const manifest = _resolver$workspaceLa.manifest;\n\n      this._wsRootNohoistList = this._extractNohoistList(manifest, manifest.name);\n    }\n  }\n\n  /**\n   * examine the top level packages to find the root package\n   */\n\n\n  /**\n   * find the highest hoisting point for the given HoistManifest.\n   * algorithm: a nohoist package should never be hoisted beyond the top of its branch, i.e.\n   * the first element of its parts. Therefore the highest possible hoisting index is 1,\n   * unless the package has only 1 part (itself), in such case returns null just like any hoisted package\n   *\n   */\n\n  // private functions\n\n  _makePath(...args) {\n    const parts = args.map(s => s === this._wsRootPackageName ? WS_ROOT_ALIAS : s);\n    const result = parts.join('/');\n    return result[0] === '/' ? result : '/' + result;\n  }\n\n  // extract nohoist from package.json then prefix them with branch path\n  // so we can matched against the branch tree (\"originalPath\") later\n}\n\nexports.NohoistResolver = NohoistResolver;\n\n/***/ }),\n/* 525 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _config;\n\nfunction _load_config() {\n  return _config = _interopRequireDefault(__webpack_require__(163));\n}\n\nvar _executeLifecycleScript;\n\nfunction _load_executeLifecycleScript() {\n  return _executeLifecycleScript = _interopRequireDefault(__webpack_require__(111));\n}\n\nvar _crypto;\n\nfunction _load_crypto() {\n  return _crypto = _interopRequireWildcard(__webpack_require__(168));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _packageNameUtils;\n\nfunction _load_packageNameUtils() {\n  return _packageNameUtils = __webpack_require__(220);\n}\n\nvar _pack;\n\nfunction _load_pack() {\n  return _pack = __webpack_require__(166);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst fs = __webpack_require__(4);\n\nconst invariant = __webpack_require__(9);\nconst path = __webpack_require__(0);\n\nconst INSTALL_STAGES = ['preinstall', 'install', 'postinstall'];\n\nclass PackageInstallScripts {\n  constructor(config, resolver, force) {\n    this.installed = 0;\n    this.resolver = resolver;\n    this.reporter = config.reporter;\n    this.config = config;\n    this.force = force;\n    this.artifacts = {};\n  }\n\n  setForce(force) {\n    this.force = force;\n  }\n\n  setArtifacts(artifacts) {\n    this.artifacts = artifacts;\n  }\n\n  getArtifacts() {\n    return this.artifacts;\n  }\n\n  getInstallCommands(pkg) {\n    const scripts = pkg.scripts;\n    if (scripts) {\n      const cmds = [];\n      for (var _iterator = INSTALL_STAGES, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref = _i.value;\n        }\n\n        const stage = _ref;\n\n        const cmd = scripts[stage];\n        if (cmd) {\n          cmds.push([stage, cmd]);\n        }\n      }\n      return cmds;\n    } else {\n      return [];\n    }\n  }\n\n  walk(loc) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const files = yield (_fs || _load_fs()).walk(loc, null, new Set(_this.config.registryFolders));\n      const mtimes = new Map();\n      for (var _iterator2 = files, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref2;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref2 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref2 = _i2.value;\n        }\n\n        const file = _ref2;\n\n        mtimes.set(file.relative, file.mtime);\n      }\n      return mtimes;\n    })();\n  }\n\n  saveBuildArtifacts(loc, pkg, beforeFiles, spinner) {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const afterFiles = yield _this2.walk(loc);\n\n      // work out what files have been created/modified\n      const buildArtifacts = [];\n      for (var _iterator3 = afterFiles, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n        var _ref4;\n\n        if (_isArray3) {\n          if (_i3 >= _iterator3.length) break;\n          _ref4 = _iterator3[_i3++];\n        } else {\n          _i3 = _iterator3.next();\n          if (_i3.done) break;\n          _ref4 = _i3.value;\n        }\n\n        const _ref3 = _ref4;\n        const file = _ref3[0];\n        const mtime = _ref3[1];\n\n        if (!beforeFiles.has(file) || beforeFiles.get(file) !== mtime) {\n          buildArtifacts.push(file);\n        }\n      }\n\n      if (!buildArtifacts.length) {\n        // nothing else to do here since we have no build artifacts\n        return;\n      }\n\n      // set build artifacts\n      const ref = pkg._reference;\n      invariant(ref, 'expected reference');\n      _this2.artifacts[`${pkg.name}@${pkg.version}`] = buildArtifacts;\n    })();\n  }\n\n  install(cmds, pkg, spinner) {\n    var _this3 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const ref = pkg._reference;\n      invariant(ref, 'expected reference');\n      const locs = ref.locations;\n\n      let updateProgress;\n\n      if (cmds.length > 0) {\n        updateProgress = function updateProgress(data) {\n          const dataStr = data.toString() // turn buffer into string\n          .trim(); // trim whitespace\n\n          invariant(spinner && spinner.tick, 'We should have spinner and its ticker here');\n          if (dataStr) {\n            spinner.tick(dataStr\n            // Only get the last line\n            .substr(dataStr.lastIndexOf('\\n') + 1)\n            // change tabs to spaces as they can interfere with the console\n            .replace(/\\t/g, ' '));\n          }\n        };\n      }\n\n      try {\n        for (var _iterator4 = cmds, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n          var _ref6;\n\n          if (_isArray4) {\n            if (_i4 >= _iterator4.length) break;\n            _ref6 = _iterator4[_i4++];\n          } else {\n            _i4 = _iterator4.next();\n            if (_i4.done) break;\n            _ref6 = _i4.value;\n          }\n\n          const _ref5 = _ref6;\n          const stage = _ref5[0];\n          const cmd = _ref5[1];\n\n          yield Promise.all(locs.map((() => {\n            var _ref7 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) {\n              var _ref8 = yield (0, (_executeLifecycleScript || _load_executeLifecycleScript()).default)({\n                stage,\n                config: _this3.config,\n                cwd: loc,\n                cmd,\n                isInteractive: false,\n                updateProgress\n              });\n\n              const stdout = _ref8.stdout;\n\n              _this3.reporter.verbose(stdout);\n            });\n\n            return function (_x) {\n              return _ref7.apply(this, arguments);\n            };\n          })()));\n        }\n      } catch (err) {\n        err.message = `${locs.join(', ')}: ${err.message}`;\n\n        invariant(ref, 'expected reference');\n\n        if (ref.optional) {\n          ref.ignore = true;\n          ref.incompatible = true;\n          _this3.reporter.warn(_this3.reporter.lang('optionalModuleScriptFail', err.message));\n          _this3.reporter.info(_this3.reporter.lang('optionalModuleFail'));\n\n          // Cleanup node_modules\n          try {\n            yield Promise.all(locs.map((() => {\n              var _ref9 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) {\n                yield (_fs || _load_fs()).unlink(loc);\n              });\n\n              return function (_x2) {\n                return _ref9.apply(this, arguments);\n              };\n            })()));\n          } catch (e) {\n            _this3.reporter.error(_this3.reporter.lang('optionalModuleCleanupFail', e.message));\n          }\n        } else {\n          throw err;\n        }\n      }\n    })();\n  }\n\n  packageCanBeInstalled(pkg) {\n    const cmds = this.getInstallCommands(pkg);\n    if (!cmds.length) {\n      return false;\n    }\n    if (this.config.packBuiltPackages && pkg.prebuiltVariants) {\n      for (const variant in pkg.prebuiltVariants) {\n        if (pkg._remote && pkg._remote.reference && pkg._remote.reference.includes(variant)) {\n          return false;\n        }\n      }\n    }\n    const ref = pkg._reference;\n    invariant(ref, 'Missing package reference');\n    if (!ref.fresh && !this.force) {\n      // this package hasn't been touched\n      return false;\n    }\n\n    // Don't run lifecycle scripts for hoisted packages\n    if (!ref.locations.length) {\n      return false;\n    }\n\n    // we haven't actually written this module out\n    if (ref.ignore) {\n      return false;\n    }\n    return true;\n  }\n\n  runCommand(spinner, pkg) {\n    var _this4 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const cmds = _this4.getInstallCommands(pkg);\n      spinner.setPrefix(++_this4.installed, pkg.name);\n      yield _this4.install(cmds, pkg, spinner);\n    })();\n  }\n\n  // detect if there is a circularDependency in the dependency tree\n  detectCircularDependencies(root, seenManifests, pkg) {\n    const ref = pkg._reference;\n    invariant(ref, 'expected reference');\n\n    const deps = ref.dependencies;\n    for (var _iterator5 = deps, _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n      var _ref10;\n\n      if (_isArray5) {\n        if (_i5 >= _iterator5.length) break;\n        _ref10 = _iterator5[_i5++];\n      } else {\n        _i5 = _iterator5.next();\n        if (_i5.done) break;\n        _ref10 = _i5.value;\n      }\n\n      const dep = _ref10;\n\n      const pkgDep = this.resolver.getStrictResolvedPattern(dep);\n      if (seenManifests.has(pkgDep)) {\n        // there is a cycle but not with the root\n        continue;\n      }\n      seenManifests.add(pkgDep);\n      // found a dependency pointing to root\n      if (pkgDep == root) {\n        return true;\n      }\n      if (this.detectCircularDependencies(root, seenManifests, pkgDep)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  // find the next package to be installed\n  findInstallablePackage(workQueue, installed) {\n    for (var _iterator6 = workQueue, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n      var _ref11;\n\n      if (_isArray6) {\n        if (_i6 >= _iterator6.length) break;\n        _ref11 = _iterator6[_i6++];\n      } else {\n        _i6 = _iterator6.next();\n        if (_i6.done) break;\n        _ref11 = _i6.value;\n      }\n\n      const pkg = _ref11;\n\n      const ref = pkg._reference;\n      invariant(ref, 'expected reference');\n      const deps = ref.dependencies;\n\n      let dependenciesFulfilled = true;\n      for (var _iterator7 = deps, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {\n        var _ref12;\n\n        if (_isArray7) {\n          if (_i7 >= _iterator7.length) break;\n          _ref12 = _iterator7[_i7++];\n        } else {\n          _i7 = _iterator7.next();\n          if (_i7.done) break;\n          _ref12 = _i7.value;\n        }\n\n        const dep = _ref12;\n\n        const pkgDep = this.resolver.getStrictResolvedPattern(dep);\n        if (!installed.has(pkgDep)) {\n          dependenciesFulfilled = false;\n          break;\n        }\n      }\n\n      // all dependencies are installed\n      if (dependenciesFulfilled) {\n        return pkg;\n      }\n\n      // detect circular dependency, mark this pkg as installable to break the circle\n      if (this.detectCircularDependencies(pkg, new Set(), pkg)) {\n        return pkg;\n      }\n    }\n    return null;\n  }\n\n  worker(spinner, workQueue, installed, waitQueue) {\n    var _this5 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      while (workQueue.size > 0) {\n        // find a installable package\n        const pkg = _this5.findInstallablePackage(workQueue, installed);\n\n        // can't find a package to install, register into waitQueue\n        if (pkg == null) {\n          spinner.clear();\n          yield new Promise(function (resolve) {\n            return waitQueue.add(resolve);\n          });\n          continue;\n        }\n\n        // found a package to install\n        workQueue.delete(pkg);\n        if (_this5.packageCanBeInstalled(pkg)) {\n          yield _this5.runCommand(spinner, pkg);\n        }\n        installed.add(pkg);\n        for (var _iterator8 = waitQueue, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {\n          var _ref13;\n\n          if (_isArray8) {\n            if (_i8 >= _iterator8.length) break;\n            _ref13 = _iterator8[_i8++];\n          } else {\n            _i8 = _iterator8.next();\n            if (_i8.done) break;\n            _ref13 = _i8.value;\n          }\n\n          const workerResolve = _ref13;\n\n          workerResolve();\n        }\n        waitQueue.clear();\n      }\n    })();\n  }\n\n  init(seedPatterns) {\n    var _this6 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const workQueue = new Set();\n      const installed = new Set();\n      const pkgs = _this6.resolver.getTopologicalManifests(seedPatterns);\n      let installablePkgs = 0;\n      // A map to keep track of what files exist before installation\n      const beforeFilesMap = new Map();\n      for (var _iterator9 = pkgs, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {\n        var _ref14;\n\n        if (_isArray9) {\n          if (_i9 >= _iterator9.length) break;\n          _ref14 = _iterator9[_i9++];\n        } else {\n          _i9 = _iterator9.next();\n          if (_i9.done) break;\n          _ref14 = _i9.value;\n        }\n\n        const pkg = _ref14;\n\n        if (_this6.packageCanBeInstalled(pkg)) {\n          const ref = pkg._reference;\n          invariant(ref, 'expected reference');\n          yield Promise.all(ref.locations.map((() => {\n            var _ref19 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) {\n              beforeFilesMap.set(loc, (yield _this6.walk(loc)));\n              installablePkgs += 1;\n            });\n\n            return function (_x6) {\n              return _ref19.apply(this, arguments);\n            };\n          })()));\n        }\n        workQueue.add(pkg);\n      }\n\n      const set = _this6.reporter.activitySet(installablePkgs, Math.min(installablePkgs, _this6.config.childConcurrency));\n\n      // waitQueue acts like a semaphore to allow workers to register to be notified\n      // when there are more work added to the work queue\n      const waitQueue = new Set();\n      yield Promise.all(set.spinners.map(function (spinner) {\n        return _this6.worker(spinner, workQueue, installed, waitQueue);\n      }));\n      // generate built package as prebuilt one for offline mirror\n      const offlineMirrorPath = _this6.config.getOfflineMirrorPath();\n      if (_this6.config.packBuiltPackages && offlineMirrorPath) {\n        for (var _iterator10 = pkgs, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) {\n          var _ref15;\n\n          if (_isArray10) {\n            if (_i10 >= _iterator10.length) break;\n            _ref15 = _iterator10[_i10++];\n          } else {\n            _i10 = _iterator10.next();\n            if (_i10.done) break;\n            _ref15 = _i10.value;\n          }\n\n          const pkg = _ref15;\n\n          if (_this6.packageCanBeInstalled(pkg)) {\n            let prebuiltPath = path.join(offlineMirrorPath, 'prebuilt');\n            yield (_fs || _load_fs()).mkdirp(prebuiltPath);\n            const prebuiltFilename = (0, (_packageNameUtils || _load_packageNameUtils()).getPlatformSpecificPackageFilename)(pkg);\n            prebuiltPath = path.join(prebuiltPath, prebuiltFilename + '.tgz');\n            const ref = pkg._reference;\n            invariant(ref, 'expected reference');\n            const builtPackagePaths = ref.locations;\n\n            yield Promise.all(builtPackagePaths.map((() => {\n              var _ref16 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (builtPackagePath) {\n                // don't use pack command, we want to avoid the file filters logic\n                const stream = yield (0, (_pack || _load_pack()).packWithIgnoreAndHeaders)(builtPackagePath);\n\n                const hash = yield new Promise(function (resolve, reject) {\n                  const validateStream = new (_crypto || _load_crypto()).HashStream();\n                  stream.pipe(validateStream).pipe(fs.createWriteStream(prebuiltPath)).on('error', reject).on('close', function () {\n                    return resolve(validateStream.getHash());\n                  });\n                });\n                pkg.prebuiltVariants = pkg.prebuiltVariants || {};\n                pkg.prebuiltVariants[prebuiltFilename] = hash;\n              });\n\n              return function (_x3) {\n                return _ref16.apply(this, arguments);\n              };\n            })()));\n          }\n        }\n      } else {\n        // cache all build artifacts\n        for (var _iterator11 = pkgs, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) {\n          var _ref17;\n\n          if (_isArray11) {\n            if (_i11 >= _iterator11.length) break;\n            _ref17 = _iterator11[_i11++];\n          } else {\n            _i11 = _iterator11.next();\n            if (_i11.done) break;\n            _ref17 = _i11.value;\n          }\n\n          const pkg = _ref17;\n\n          if (_this6.packageCanBeInstalled(pkg)) {\n            const ref = pkg._reference;\n            invariant(ref, 'expected reference');\n            const beforeFiles = ref.locations.map(function (loc) {\n              return beforeFilesMap.get(loc);\n            });\n            yield Promise.all(beforeFiles.map((() => {\n              var _ref18 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (b, index) {\n                invariant(b, 'files before installation should always be recorded');\n                yield _this6.saveBuildArtifacts(ref.locations[index], pkg, b, set.spinners[0]);\n              });\n\n              return function (_x4, _x5) {\n                return _ref18.apply(this, arguments);\n              };\n            })()));\n          }\n        }\n      }\n\n      set.end();\n    })();\n  }\n}\nexports.default = PackageInstallScripts;\n\n/***/ }),\n/* 526 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst objectPath = __webpack_require__(304);\n\nconst path = __webpack_require__(0);\n\nclass BaseRegistry {\n  constructor(cwd, registries, requestManager, reporter, enableDefaultRc, extraneousRcFiles) {\n    this.reporter = reporter;\n    this.requestManager = requestManager;\n    this.registries = registries;\n    this.config = {};\n    this.folder = '';\n    this.token = '';\n    this.loc = '';\n    this.cwd = cwd;\n    this.enableDefaultRc = enableDefaultRc;\n    this.extraneousRcFiles = extraneousRcFiles;\n  }\n\n  // the filename to use for package metadata\n\n\n  //\n\n\n  //\n\n  //\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  //\n\n\n  // absolute folder name to insert modules\n\n\n  // relative folder name to put these modules\n\n\n  setToken(token) {\n    this.token = token;\n  }\n\n  setOtp(otp) {\n    this.otp = otp;\n  }\n\n  getOption(key) {\n    return this.config[key];\n  }\n\n  getAvailableRegistries() {\n    const config = this.config;\n    return Object.keys(config).reduce((registries, option) => {\n      if (option === 'registry' || option.split(':')[1] === 'registry') {\n        registries.push(config[option]);\n      }\n      return registries;\n    }, []);\n  }\n\n  loadConfig() {\n    return Promise.resolve();\n  }\n\n  checkOutdated(config, name, range) {\n    return Promise.reject(new Error('unimplemented'));\n  }\n\n  saveHomeConfig(config) {\n    return Promise.reject(new Error('unimplemented'));\n  }\n\n  request(pathname, opts = {}) {\n    return this.requestManager.request((0, (_extends2 || _load_extends()).default)({\n      url: pathname\n    }, opts));\n  }\n\n  init(overrides = {}) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      _this.mergeEnv('yarn_');\n      yield _this.loadConfig();\n\n      for (var _iterator = Object.keys(overrides), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref = _i.value;\n        }\n\n        const override = _ref;\n\n        const val = overrides[override];\n\n        if (val !== undefined) {\n          _this.config[override] = val;\n        }\n      }\n      _this.loc = path.join(_this.cwd, _this.folder);\n    })();\n  }\n\n  static normalizeConfig(config) {\n    for (const key in config) {\n      config[key] = BaseRegistry.normalizeConfigOption(config[key]);\n    }\n    return config;\n  }\n\n  static normalizeConfigOption(val) {\n    if (val === 'true') {\n      return true;\n    } else if (val === 'false') {\n      return false;\n    } else {\n      return val;\n    }\n  }\n\n  mergeEnv(prefix) {\n    // try environment variables\n    for (const envKey in process.env) {\n      let key = envKey.toLowerCase();\n\n      // only accept keys prefixed with the prefix\n      if (key.indexOf(prefix.toLowerCase()) !== 0) {\n        continue;\n      }\n\n      const val = BaseRegistry.normalizeConfigOption(process.env[envKey]);\n\n      // remove config prefix\n      key = (0, (_misc || _load_misc()).removePrefix)(key, prefix.toLowerCase());\n\n      // replace dunders with dots\n      key = key.replace(/__/g, '.');\n\n      // replace underscores with dashes ignoring keys that start with an underscore\n      key = key.replace(/([^_])_/g, '$1-');\n\n      // set it via a path\n      objectPath.set(this.config, key, val);\n    }\n  }\n}\nexports.default = BaseRegistry;\n\n/***/ }),\n/* 527 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DEFAULTS = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nvar _npmRegistry;\n\nfunction _load_npmRegistry() {\n  return _npmRegistry = _interopRequireDefault(__webpack_require__(88));\n}\n\nvar _lockfile;\n\nfunction _load_lockfile() {\n  return _lockfile = __webpack_require__(19);\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nvar _yarnVersion;\n\nfunction _load_yarnVersion() {\n  return _yarnVersion = __webpack_require__(105);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst userHome = __webpack_require__(67).default;\nconst path = __webpack_require__(0);\n\nconst DEFAULTS = exports.DEFAULTS = {\n  'version-tag-prefix': 'v',\n  'version-git-tag': true,\n  'version-commit-hooks': true,\n  'version-git-sign': false,\n  'version-git-message': 'v%s',\n\n  'init-version': '1.0.0',\n  'init-license': 'MIT',\n\n  'save-prefix': '^',\n  'bin-links': true,\n  'ignore-scripts': false,\n  'ignore-optional': false,\n  registry: (_constants || _load_constants()).YARN_REGISTRY,\n  'strict-ssl': true,\n  'user-agent': [`yarn/${(_yarnVersion || _load_yarnVersion()).version}`, 'npm/?', `node/${process.version}`, process.platform, process.arch].join(' ')\n};\n\nconst RELATIVE_KEYS = ['yarn-offline-mirror', 'cache-folder', 'global-folder', 'offline-cache-folder', 'yarn-path'];\nconst FOLDER_KEY = ['yarn-offline-mirror', 'cache-folder', 'global-folder', 'offline-cache-folder'];\n\nconst npmMap = {\n  'version-git-sign': 'sign-git-tag',\n  'version-tag-prefix': 'tag-version-prefix',\n  'version-git-tag': 'git-tag-version',\n  'version-commit-hooks': 'commit-hooks',\n  'version-git-message': 'message'\n};\n\nclass YarnRegistry extends (_npmRegistry || _load_npmRegistry()).default {\n  constructor(cwd, registries, requestManager, reporter, enableDefaultRc, extraneousRcFiles) {\n    super(cwd, registries, requestManager, reporter, enableDefaultRc, extraneousRcFiles);\n\n    this.homeConfigLoc = path.join(userHome, '.yarnrc');\n    this.homeConfig = {};\n  }\n\n  getOption(key) {\n    let val = this.config[key];\n\n    // if this isn't set in a yarn config, then use npm\n    if (typeof val === 'undefined') {\n      val = this.registries.npm.getOption(npmMap[key]);\n    }\n\n    if (typeof val === 'undefined') {\n      val = this.registries.npm.getOption(key);\n    }\n\n    // if this isn't set in a yarn config or npm config, then use the default (or undefined)\n    if (typeof val === 'undefined') {\n      val = DEFAULTS[key];\n    }\n\n    return val;\n  }\n\n  loadConfig() {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const locations = yield _this.getPossibleConfigLocations('yarnrc', _this.reporter);\n\n      for (var _iterator = locations, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref2;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref2 = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref2 = _i.value;\n        }\n\n        const _ref = _ref2;\n        const isHome = _ref[0];\n        const loc = _ref[1];\n        const file = _ref[2];\n\n        var _parse = (0, (_lockfile || _load_lockfile()).parse)(file, loc);\n\n        const config = _parse.object;\n\n\n        if (isHome) {\n          _this.homeConfig = config;\n        }\n\n        for (var _iterator2 = RELATIVE_KEYS, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n          var _ref3;\n\n          if (_isArray2) {\n            if (_i2 >= _iterator2.length) break;\n            _ref3 = _iterator2[_i2++];\n          } else {\n            _i2 = _iterator2.next();\n            if (_i2.done) break;\n            _ref3 = _i2.value;\n          }\n\n          const key = _ref3;\n\n          const valueLoc = config[key];\n\n          if (!_this.config[key] && valueLoc) {\n            const resolvedLoc = config[key] = path.resolve(path.dirname(loc), valueLoc);\n\n            if (FOLDER_KEY.includes(key)) {\n              yield (_fs || _load_fs()).mkdirp(resolvedLoc);\n            }\n          }\n        }\n\n        // merge with any existing environment variables\n        const env = config.env;\n        if (env) {\n          const existingEnv = _this.config.env;\n          if (existingEnv) {\n            _this.config.env = Object.assign({}, env, existingEnv);\n          }\n        }\n\n        _this.config = Object.assign({}, config, _this.config);\n      }\n\n      // default yarn config\n      _this.config = Object.assign({}, DEFAULTS, _this.config);\n    })();\n  }\n\n  saveHomeConfig(config) {\n    var _this2 = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      YarnRegistry.normalizeConfig(config);\n\n      for (const key in config) {\n        const val = config[key];\n\n        // if the current config key was taken from home config then update\n        // the global config\n        if (_this2.homeConfig[key] === _this2.config[key]) {\n          _this2.config[key] = val;\n        }\n\n        // update just the home config\n        _this2.homeConfig[key] = config[key];\n      }\n\n      yield (_fs || _load_fs()).writeFilePreservingEol(_this2.homeConfigLoc, `${(0, (_lockfile || _load_lockfile()).stringify)(_this2.homeConfig)}\\n`);\n    })();\n  }\n}\nexports.default = YarnRegistry;\nYarnRegistry.filename = 'yarn.json';\n\n/***/ }),\n/* 528 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _jsonReporter;\n\nfunction _load_jsonReporter() {\n  return _jsonReporter = _interopRequireDefault(__webpack_require__(211));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass BufferReporter extends (_jsonReporter || _load_jsonReporter()).default {\n  constructor(opts) {\n    super(opts);\n    this._buffer = [];\n  }\n\n  _dump(type, data, error) {\n    this._buffer.push({\n      type,\n      data,\n      error: !!error\n    });\n  }\n\n  getBuffer() {\n    return this._buffer;\n  }\n\n  getBufferText() {\n    return this._buffer.map(({ data }) => typeof data === 'string' ? data : JSON.stringify(data)).join('');\n  }\n\n  getBufferJson() {\n    return JSON.parse(this.getBufferText());\n  }\n}\nexports.default = BufferReporter;\n\n/***/ }),\n/* 529 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _baseReporter;\n\nfunction _load_baseReporter() {\n  return _baseReporter = _interopRequireDefault(__webpack_require__(108));\n}\n\nvar _progressBar;\n\nfunction _load_progressBar() {\n  return _progressBar = _interopRequireDefault(__webpack_require__(531));\n}\n\nvar _spinnerProgress;\n\nfunction _load_spinnerProgress() {\n  return _spinnerProgress = _interopRequireDefault(__webpack_require__(532));\n}\n\nvar _util;\n\nfunction _load_util() {\n  return _util = __webpack_require__(210);\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nvar _treeHelper;\n\nfunction _load_treeHelper() {\n  return _treeHelper = __webpack_require__(530);\n}\n\nvar _inquirer;\n\nfunction _load_inquirer() {\n  return _inquirer = _interopRequireDefault(__webpack_require__(276));\n}\n\nvar _cliTable;\n\nfunction _load_cliTable() {\n  return _cliTable = _interopRequireDefault(__webpack_require__(570));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _require = __webpack_require__(3);\n\nconst inspect = _require.inspect;\n\nconst readline = __webpack_require__(198);\nconst chalk = __webpack_require__(27);\nconst stripAnsi = __webpack_require__(330);\nconst read = __webpack_require__(790);\nconst tty = __webpack_require__(104);\n\nconst AUDIT_COL_WIDTHS = [15, 62];\n\nconst auditSeverityColors = {\n  info: chalk.bold,\n  low: chalk.bold,\n  moderate: chalk.yellow,\n  high: chalk.red,\n  critical: chalk.bgRed\n};\n\n// fixes bold on windows\nif (process.platform === 'win32' && !(process.env.TERM && /^xterm/i.test(process.env.TERM))) {\n  chalk.bold._styles[0].close += '\\u001b[m';\n}\n\nclass ConsoleReporter extends (_baseReporter || _load_baseReporter()).default {\n  constructor(opts) {\n    super(opts);\n\n    this._lastCategorySize = 0;\n    this._spinners = new Set();\n    this.format = chalk;\n    this.format.stripColor = stripAnsi;\n    this.isSilent = !!opts.isSilent;\n  }\n\n  _prependEmoji(msg, emoji) {\n    if (this.emoji && emoji && this.isTTY) {\n      msg = `${emoji}  ${msg}`;\n    }\n    return msg;\n  }\n\n  _logCategory(category, color, msg) {\n    this._lastCategorySize = category.length;\n    this._log(`${this.format[color](category)} ${msg}`);\n  }\n\n  _verbose(msg) {\n    this._logCategory('verbose', 'grey', `${process.uptime()} ${msg}`);\n  }\n\n  _verboseInspect(obj) {\n    this.inspect(obj);\n  }\n\n  close() {\n    for (var _iterator = this._spinners, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const spinner = _ref;\n\n      spinner.stop();\n    }\n    this._spinners.clear();\n    this.stopProgress();\n    super.close();\n  }\n\n  table(head, body) {\n    //\n    head = head.map(field => this.format.underline(field));\n\n    //\n    const rows = [head].concat(body);\n\n    // get column widths\n    const cols = [];\n    for (let i = 0; i < head.length; i++) {\n      const widths = rows.map(row => this.format.stripColor(row[i]).length);\n      cols[i] = Math.max(...widths);\n    }\n\n    //\n    const builtRows = rows.map(row => {\n      for (let i = 0; i < row.length; i++) {\n        const field = row[i];\n        const padding = cols[i] - this.format.stripColor(field).length;\n\n        row[i] = field + ' '.repeat(padding);\n      }\n      return row.join(' ');\n    });\n\n    this.log(builtRows.join('\\n'));\n  }\n\n  step(current, total, msg, emoji) {\n    msg = this._prependEmoji(msg, emoji);\n\n    if (msg.endsWith('?')) {\n      msg = `${(0, (_misc || _load_misc()).removeSuffix)(msg, '?')}...?`;\n    } else {\n      msg += '...';\n    }\n\n    this.log(`${this.format.dim(`[${current}/${total}]`)} ${msg}`);\n  }\n\n  inspect(value) {\n    if (typeof value !== 'number' && typeof value !== 'string') {\n      value = inspect(value, {\n        breakLength: 0,\n        colors: this.isTTY,\n        depth: null,\n        maxArrayLength: null\n      });\n    }\n\n    this.log(String(value), { force: true });\n  }\n\n  list(key, items, hints) {\n    const gutterWidth = (this._lastCategorySize || 2) - 1;\n\n    if (hints) {\n      for (var _iterator2 = items, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref2;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref2 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref2 = _i2.value;\n        }\n\n        const item = _ref2;\n\n        this._log(`${' '.repeat(gutterWidth)}- ${this.format.bold(item)}`);\n        this._log(`  ${' '.repeat(gutterWidth)} ${hints[item]}`);\n      }\n    } else {\n      for (var _iterator3 = items, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n        var _ref3;\n\n        if (_isArray3) {\n          if (_i3 >= _iterator3.length) break;\n          _ref3 = _iterator3[_i3++];\n        } else {\n          _i3 = _iterator3.next();\n          if (_i3.done) break;\n          _ref3 = _i3.value;\n        }\n\n        const item = _ref3;\n\n        this._log(`${' '.repeat(gutterWidth)}- ${item}`);\n      }\n    }\n  }\n\n  header(command, pkg) {\n    this.log(this.format.bold(`${pkg.name} ${command} v${pkg.version}`));\n  }\n\n  footer(showPeakMemory) {\n    this.stopProgress();\n\n    const totalTime = (this.getTotalTime() / 1000).toFixed(2);\n    let msg = `Done in ${totalTime}s.`;\n    if (showPeakMemory) {\n      const peakMemory = (this.peakMemory / 1024 / 1024).toFixed(2);\n      msg += ` Peak memory usage ${peakMemory}MB.`;\n    }\n    this.log(this._prependEmoji(msg, '✨'));\n  }\n\n  log(msg, { force = false } = {}) {\n    this._lastCategorySize = 0;\n    this._log(msg, { force });\n  }\n\n  _log(msg, { force = false } = {}) {\n    if (this.isSilent && !force) {\n      return;\n    }\n    (0, (_util || _load_util()).clearLine)(this.stdout);\n    this.stdout.write(`${msg}\\n`);\n  }\n\n  success(msg) {\n    this._logCategory('success', 'green', msg);\n  }\n\n  error(msg) {\n    (0, (_util || _load_util()).clearLine)(this.stderr);\n    this.stderr.write(`${this.format.red('error')} ${msg}\\n`);\n  }\n\n  info(msg) {\n    this._logCategory('info', 'blue', msg);\n  }\n\n  command(command) {\n    this.log(this.format.dim(`$ ${command}`));\n  }\n\n  warn(msg) {\n    (0, (_util || _load_util()).clearLine)(this.stderr);\n    this.stderr.write(`${this.format.yellow('warning')} ${msg}\\n`);\n  }\n\n  question(question, options = {}) {\n    if (!process.stdout.isTTY) {\n      return Promise.reject(new Error(\"Can't answer a question unless a user TTY\"));\n    }\n\n    return new Promise((resolve, reject) => {\n      read({\n        prompt: `${this.format.dim('question')} ${question}: `,\n        silent: !!options.password,\n        output: this.stdout,\n        input: this.stdin\n      }, (err, answer) => {\n        if (err) {\n          if (err.message === 'canceled') {\n            process.exitCode = 1;\n          }\n          reject(err);\n        } else {\n          if (!answer && options.required) {\n            this.error(this.lang('answerRequired'));\n            resolve(this.question(question, options));\n          } else {\n            resolve(answer);\n          }\n        }\n      });\n    });\n  }\n  // handles basic tree output to console\n  tree(key, trees, { force = false } = {}) {\n    this.stopProgress();\n    //\n    if (this.isSilent && !force) {\n      return;\n    }\n    const output = ({ name, children, hint, color }, titlePrefix, childrenPrefix) => {\n      const formatter = this.format;\n      const out = (0, (_treeHelper || _load_treeHelper()).getFormattedOutput)({\n        prefix: titlePrefix,\n        hint,\n        color,\n        name,\n        formatter\n      });\n      this.stdout.write(out);\n\n      if (children && children.length) {\n        (0, (_treeHelper || _load_treeHelper()).recurseTree)((0, (_treeHelper || _load_treeHelper()).sortTrees)(children), childrenPrefix, output);\n      }\n    };\n    (0, (_treeHelper || _load_treeHelper()).recurseTree)((0, (_treeHelper || _load_treeHelper()).sortTrees)(trees), '', output);\n  }\n\n  activitySet(total, workers) {\n    if (!this.isTTY || this.noProgress) {\n      return super.activitySet(total, workers);\n    }\n\n    const spinners = [];\n    const reporterSpinners = this._spinners;\n\n    for (let i = 1; i < workers; i++) {\n      this.log('');\n    }\n\n    for (let i = 0; i < workers; i++) {\n      const spinner = new (_spinnerProgress || _load_spinnerProgress()).default(this.stderr, i);\n      reporterSpinners.add(spinner);\n      spinner.start();\n\n      let prefix = null;\n      let current = 0;\n      const updatePrefix = () => {\n        spinner.setPrefix(`${this.format.dim(`[${current === 0 ? '-' : current}/${total}]`)} `);\n      };\n      const clear = () => {\n        prefix = null;\n        current = 0;\n        updatePrefix();\n        spinner.setText('waiting...');\n      };\n      clear();\n\n      spinners.unshift({\n        clear,\n\n        setPrefix(_current, _prefix) {\n          current = _current;\n          prefix = _prefix;\n          spinner.setText(prefix);\n          updatePrefix();\n        },\n\n        tick(msg) {\n          if (prefix) {\n            msg = `${prefix}: ${msg}`;\n          }\n          spinner.setText(msg);\n        },\n\n        end() {\n          spinner.stop();\n          reporterSpinners.delete(spinner);\n        }\n      });\n    }\n\n    return {\n      spinners,\n      end: () => {\n        for (var _iterator4 = spinners, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n          var _ref4;\n\n          if (_isArray4) {\n            if (_i4 >= _iterator4.length) break;\n            _ref4 = _iterator4[_i4++];\n          } else {\n            _i4 = _iterator4.next();\n            if (_i4.done) break;\n            _ref4 = _i4.value;\n          }\n\n          const spinner = _ref4;\n\n          spinner.end();\n        }\n        readline.moveCursor(this.stdout, 0, -workers + 1);\n      }\n    };\n  }\n\n  activity() {\n    if (!this.isTTY) {\n      return {\n        tick() {},\n        end() {}\n      };\n    }\n    const reporterSpinners = this._spinners;\n\n    const spinner = new (_spinnerProgress || _load_spinnerProgress()).default(this.stderr);\n    spinner.start();\n\n    reporterSpinners.add(spinner);\n\n    return {\n      tick(name) {\n        spinner.setText(name);\n      },\n\n      end() {\n        spinner.stop();\n        reporterSpinners.delete(spinner);\n      }\n    };\n  }\n\n  select(header, question, options) {\n    if (!this.isTTY) {\n      return Promise.reject(new Error(\"Can't answer a question unless a user TTY\"));\n    }\n\n    const rl = readline.createInterface({\n      input: this.stdin,\n      output: this.stdout,\n      terminal: true\n    });\n\n    const questions = options.map(opt => opt.name);\n    const answers = options.map(opt => opt.value);\n\n    function toIndex(input) {\n      const index = answers.indexOf(input);\n\n      if (index >= 0) {\n        return index;\n      } else {\n        return +input;\n      }\n    }\n\n    return new Promise(resolve => {\n      this.info(header);\n\n      for (let i = 0; i < questions.length; i++) {\n        this.log(`  ${this.format.dim(`${i + 1})`)} ${questions[i]}`);\n      }\n\n      const ask = () => {\n        rl.question(`${question}: `, input => {\n          let index = toIndex(input);\n\n          if (isNaN(index)) {\n            this.log('Not a number');\n            ask();\n            return;\n          }\n\n          if (index <= 0 || index > options.length) {\n            this.log('Outside answer range');\n            ask();\n            return;\n          }\n\n          // get index\n          index--;\n          rl.close();\n          resolve(answers[index]);\n        });\n      };\n\n      ask();\n    });\n  }\n\n  progress(count) {\n    if (this.noProgress || count <= 0) {\n      return function () {\n        // noop\n      };\n    }\n\n    if (!this.isTTY) {\n      return function () {\n        // TODO what should the behaviour here be? we could buffer progress messages maybe\n      };\n    }\n\n    // Clear any potentially old progress bars\n    this.stopProgress();\n\n    const bar = this._progressBar = new (_progressBar || _load_progressBar()).default(count, this.stderr, progress => {\n      if (progress === this._progressBar) {\n        this._progressBar = null;\n      }\n    });\n\n    bar.render();\n\n    return function () {\n      bar.tick();\n    };\n  }\n\n  stopProgress() {\n    if (this._progressBar) {\n      this._progressBar.stop();\n    }\n  }\n\n  prompt(message, choices, options = {}) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      if (!process.stdout.isTTY) {\n        return Promise.reject(new Error(\"Can't answer a question unless a user TTY\"));\n      }\n\n      let pageSize;\n      if (process.stdout instanceof tty.WriteStream) {\n        pageSize = process.stdout.rows - 2;\n      }\n\n      const rl = readline.createInterface({\n        input: _this.stdin,\n        output: _this.stdout,\n        terminal: true\n      });\n\n      // $FlowFixMe: Need to update the type of Inquirer\n      const prompt = (_inquirer || _load_inquirer()).default.createPromptModule({\n        input: _this.stdin,\n        output: _this.stdout\n      });\n\n      var _options$name = options.name;\n      const name = _options$name === undefined ? 'prompt' : _options$name;\n      var _options$type = options.type;\n      const type = _options$type === undefined ? 'input' : _options$type,\n            validate = options.validate;\n\n      const answers = yield prompt([{ name, type, message, choices, pageSize, validate }]);\n\n      rl.close();\n\n      return answers[name];\n    })();\n  }\n\n  auditSummary(auditMetadata) {\n    const totalDependencies = auditMetadata.totalDependencies,\n          vulnerabilities = auditMetadata.vulnerabilities;\n\n    const totalVulnerabilities = vulnerabilities.info + vulnerabilities.low + vulnerabilities.moderate + vulnerabilities.high + vulnerabilities.critical;\n    const summary = this.lang('auditSummary', totalVulnerabilities > 0 ? this.rawText(chalk.red(totalVulnerabilities.toString())) : totalVulnerabilities, totalDependencies);\n    this._log(summary);\n\n    if (totalVulnerabilities) {\n      const severities = [];\n      if (vulnerabilities.info) {\n        severities.push(this.lang('auditInfo', vulnerabilities.info));\n      }\n      if (vulnerabilities.low) {\n        severities.push(this.lang('auditLow', vulnerabilities.low));\n      }\n      if (vulnerabilities.moderate) {\n        severities.push(this.lang('auditModerate', vulnerabilities.moderate));\n      }\n      if (vulnerabilities.high) {\n        severities.push(this.lang('auditHigh', vulnerabilities.high));\n      }\n      if (vulnerabilities.critical) {\n        severities.push(this.lang('auditCritical', vulnerabilities.critical));\n      }\n      this._log(`${this.lang('auditSummarySeverity')} ${severities.join(' | ')}`);\n    }\n  }\n\n  auditAction(recommendation) {\n    const label = recommendation.action.resolves.length === 1 ? 'vulnerability' : 'vulnerabilities';\n    this._log(this.lang('auditResolveCommand', this.rawText(chalk.inverse(recommendation.cmd)), recommendation.action.resolves.length, this.rawText(label)));\n    if (recommendation.isBreaking) {\n      this._log(this.lang('auditSemverMajorChange'));\n    }\n  }\n\n  auditManualReview() {\n    const tableOptions = {\n      colWidths: [78]\n    };\n    const table = new (_cliTable || _load_cliTable()).default(tableOptions);\n    table.push([{\n      content: this.lang('auditManualReview'),\n      vAlign: 'center',\n      hAlign: 'center'\n    }]);\n\n    this._log(table.toString());\n  }\n\n  auditAdvisory(resolution, auditAdvisory) {\n    function colorSeverity(severity, message) {\n      return auditSeverityColors[severity](message || severity);\n    }\n\n    function makeAdvisoryTableRow(patchedIn) {\n      const patchRows = [];\n\n      if (patchedIn) {\n        patchRows.push({ 'Patched in': patchedIn });\n      }\n\n      return [{ [chalk.bold(colorSeverity(auditAdvisory.severity))]: chalk.bold(auditAdvisory.title) }, { Package: auditAdvisory.module_name }, ...patchRows, { 'Dependency of': `${resolution.path.split('>')[0]} ${resolution.dev ? '[dev]' : ''}` }, { Path: resolution.path.split('>').join(' > ') }, { 'More info': `https://www.npmjs.com/advisories/${auditAdvisory.id}` }];\n    }\n\n    const tableOptions = {\n      colWidths: AUDIT_COL_WIDTHS,\n      wordWrap: true\n    };\n    const table = new (_cliTable || _load_cliTable()).default(tableOptions);\n    const patchedIn = auditAdvisory.patched_versions.replace(' ', '') === '<0.0.0' ? 'No patch available' : auditAdvisory.patched_versions;\n    table.push(...makeAdvisoryTableRow(patchedIn));\n    this._log(table.toString());\n  }\n}\nexports.default = ConsoleReporter;\n\n/***/ }),\n/* 530 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sortTrees = sortTrees;\nexports.recurseTree = recurseTree;\nexports.getFormattedOutput = getFormattedOutput;\n\n\n// public\n\n\n// types\nfunction sortTrees(trees) {\n  return trees.sort(function (tree1, tree2) {\n    return tree1.name.localeCompare(tree2.name);\n  });\n}\n\nfunction recurseTree(tree, prefix, recurseFunc) {\n  const treeLen = tree.length;\n  const treeEnd = treeLen - 1;\n  for (let i = 0; i < treeLen; i++) {\n    const atEnd = i === treeEnd;\n    recurseFunc(tree[i], prefix + getLastIndentChar(atEnd), prefix + getNextIndentChar(atEnd));\n  }\n}\n\nfunction getFormattedOutput(fmt) {\n  const item = formatColor(fmt.color, fmt.name, fmt.formatter);\n  const suffix = getSuffix(fmt.hint, fmt.formatter);\n  return `${fmt.prefix}─ ${item}${suffix}\\n`;\n}\n\nfunction getNextIndentChar(end) {\n  return end ? '   ' : '│  ';\n}\n\nfunction getLastIndentChar(end) {\n  return end ? '└' : '├';\n}\n\nfunction getSuffix(hint, formatter) {\n  return hint ? ` (${formatter.grey(hint)})` : '';\n}\n\nfunction formatColor(color, strToFormat, formatter) {\n  return color ? formatter[color](strToFormat) : strToFormat;\n}\n\n/***/ }),\n/* 531 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _util;\n\nfunction _load_util() {\n  return _util = __webpack_require__(210);\n}\n\nclass ProgressBar {\n  constructor(total, stdout = process.stderr, callback) {\n    this.stdout = stdout;\n    this.total = total;\n    this.chars = ProgressBar.bars[0];\n    this.delay = 60;\n    this.curr = 0;\n    this._callback = callback;\n    (0, (_util || _load_util()).clearLine)(stdout);\n  }\n\n  tick() {\n    if (this.curr >= this.total) {\n      return;\n    }\n\n    this.curr++;\n\n    // schedule render\n    if (!this.id) {\n      this.id = setTimeout(() => this.render(), this.delay);\n    }\n  }\n\n  cancelTick() {\n    if (this.id) {\n      clearTimeout(this.id);\n      this.id = null;\n    }\n  }\n\n  stop() {\n    // \"stop\" by setting current to end so `tick` becomes noop\n    this.curr = this.total;\n\n    this.cancelTick();\n    (0, (_util || _load_util()).clearLine)(this.stdout);\n    if (this._callback) {\n      this._callback(this);\n    }\n  }\n\n  render() {\n    // clear throttle\n    this.cancelTick();\n\n    let ratio = this.curr / this.total;\n    ratio = Math.min(Math.max(ratio, 0), 1);\n\n    // progress without bar\n    let bar = ` ${this.curr}/${this.total}`;\n\n    // calculate size of actual bar\n    // $FlowFixMe: investigate process.stderr.columns flow error\n    const availableSpace = Math.max(0, this.stdout.columns - bar.length - 3);\n    const width = Math.min(this.total, availableSpace);\n    const completeLength = Math.round(width * ratio);\n    const complete = this.chars[0].repeat(completeLength);\n    const incomplete = this.chars[1].repeat(width - completeLength);\n    bar = `[${complete}${incomplete}]${bar}`;\n\n    (0, (_util || _load_util()).toStartOfLine)(this.stdout);\n    this.stdout.write(bar);\n  }\n}\nexports.default = ProgressBar;\nProgressBar.bars = [['#', '-']];\n\n/***/ }),\n/* 532 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _util;\n\nfunction _load_util() {\n  return _util = __webpack_require__(210);\n}\n\nclass Spinner {\n  constructor(stdout = process.stderr, lineNumber = 0) {\n    this.current = 0;\n    this.prefix = '';\n    this.lineNumber = lineNumber;\n    this.stdout = stdout;\n    this.delay = 60;\n    this.chars = Spinner.spinners[28].split('');\n    this.text = '';\n    this.id = null;\n  }\n\n  setPrefix(prefix) {\n    this.prefix = prefix;\n  }\n  setText(text) {\n    this.text = text;\n  }\n  start() {\n    this.current = 0;\n    this.render();\n  }\n  render() {\n    if (this.id) {\n      clearTimeout(this.id);\n    }\n    // build line ensuring we don't wrap to the next line\n    let msg = `${this.prefix}${this.chars[this.current]} ${this.text}`;\n    const columns = typeof this.stdout.columns === 'number' ? this.stdout.columns : 100;\n    msg = msg.slice(0, columns);\n    (0, (_util || _load_util()).writeOnNthLine)(this.stdout, this.lineNumber, msg);\n    this.current = ++this.current % this.chars.length;\n    this.id = setTimeout(() => this.render(), this.delay);\n  }\n  stop() {\n    if (this.id) {\n      clearTimeout(this.id);\n      this.id = null;\n    }\n    (0, (_util || _load_util()).clearNthLine)(this.stdout, this.lineNumber);\n  }\n}\nexports.default = Spinner;\nSpinner.spinners = ['|/-\\\\', '⠂-–—–-', '◐◓◑◒', '◴◷◶◵', '◰◳◲◱', '▖▘▝▗', '■□▪▫', '▌▀▐▄', '▉▊▋▌▍▎▏▎▍▌▋▊▉', '▁▃▄▅▆▇█▇▆▅▄▃', '←↖↑↗→↘↓↙', '┤┘┴└├┌┬┐', '◢◣◤◥', '.oO°Oo.', '.oO@*', '🌍🌎🌏', '◡◡ ⊙⊙ ◠◠', '☱☲☴', '⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏', '⠋⠙⠚⠞⠖⠦⠴⠲⠳⠓', '⠄⠆⠇⠋⠙⠸⠰⠠⠰⠸⠙⠋⠇⠆', '⠋⠙⠚⠒⠂⠂⠒⠲⠴⠦⠖⠒⠐⠐⠒⠓⠋', '⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠴⠲⠒⠂⠂⠒⠚⠙⠉⠁', '⠈⠉⠋⠓⠒⠐⠐⠒⠖⠦⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈', '⠁⠁⠉⠙⠚⠒⠂⠂⠒⠲⠴⠤⠄⠄⠤⠠⠠⠤⠦⠖⠒⠐⠐⠒⠓⠋⠉⠈⠈', '⢄⢂⢁⡁⡈⡐⡠', '⢹⢺⢼⣸⣇⡧⡗⡏', '⣾⣽⣻⢿⡿⣟⣯⣷', '⠁⠂⠄⡀⢀⠠⠐⠈'];\n\n/***/ }),\n/* 533 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _jsonReporter;\n\nfunction _load_jsonReporter() {\n  return _jsonReporter = _interopRequireDefault(__webpack_require__(211));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar _require = __webpack_require__(77);\n\nconst EventEmitter = _require.EventEmitter;\nclass EventReporter extends (_jsonReporter || _load_jsonReporter()).default {\n\n  constructor(opts) {\n    super(opts);\n\n    // $FlowFixMe: looks like a flow bug\n    EventEmitter.call(this);\n  }\n\n  _dump(type, data) {\n    this.emit(type, data);\n  }\n}\n\nexports.default = EventReporter;\nObject.assign(EventReporter.prototype, EventEmitter.prototype);\n\n/***/ }),\n/* 534 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nfunction formatFunction(...strs) {\n  return strs.join(' ');\n}\n\nconst defaultFormatter = exports.defaultFormatter = {\n  bold: formatFunction,\n  dim: formatFunction,\n  italic: formatFunction,\n  underline: formatFunction,\n  inverse: formatFunction,\n  strikethrough: formatFunction,\n  black: formatFunction,\n  red: formatFunction,\n  green: formatFunction,\n  yellow: formatFunction,\n  blue: formatFunction,\n  magenta: formatFunction,\n  cyan: formatFunction,\n  white: formatFunction,\n  gray: formatFunction,\n  grey: formatFunction,\n  stripColor: formatFunction\n};\n\n/***/ }),\n/* 535 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\n/* eslint max-len: 0 */\n\nconst messages = {\n  upToDate: 'Already up-to-date.',\n  folderInSync: 'Folder in sync.',\n  nothingToInstall: 'Nothing to install.',\n  resolvingPackages: 'Resolving packages',\n  checkingManifest: 'Validating package.json',\n  fetchingPackages: 'Fetching packages',\n  linkingDependencies: 'Linking dependencies',\n  rebuildingPackages: 'Rebuilding all packages',\n  buildingFreshPackages: 'Building fresh packages',\n  cleaningModules: 'Cleaning modules',\n  bumpingVersion: 'Bumping version',\n  savingHar: 'Saving HAR file: $0',\n  answer: 'Answer?',\n  usage: 'Usage',\n  installCommandRenamed: '`install` has been replaced with `add` to add new dependencies. Run $0 instead.',\n  globalFlagRemoved: '`--global` has been deprecated. Please run $0 instead.',\n  waitingInstance: 'Waiting for the other yarn instance to finish (pid $0, inside $1)',\n  waitingNamedInstance: 'Waiting for the other yarn instance to finish ($0)',\n  offlineRetrying: 'There appears to be trouble with your network connection. Retrying...',\n  internalServerErrorRetrying: 'There appears to be trouble with the npm registry (returned $1). Retrying...',\n  clearedCache: 'Cleared cache.',\n  couldntClearPackageFromCache: \"Couldn't clear package $0 from cache\",\n  clearedPackageFromCache: 'Cleared package $0 from cache',\n  packWroteTarball: 'Wrote tarball to $0.',\n  invalidBinField: 'Invalid bin field for $0.',\n  invalidBinEntry: 'Invalid bin entry for $1 (in $0).',\n  helpExamples: '  Examples:\\n$0\\n',\n  helpCommands: '  Commands:\\n$0\\n',\n  helpCommandsMore: '  Run `$0` for more information on specific commands.',\n  helpLearnMore: '  Visit $0 to learn more about Yarn.\\n',\n\n  manifestPotentialTypo: 'Potential typo $0, did you mean $1?',\n  manifestBuiltinModule: '$0 is also the name of a node core module',\n  manifestNameDot: \"Name can't start with a dot\",\n  manifestNameIllegalChars: 'Name contains illegal characters',\n  manifestNameBlacklisted: 'Name is blacklisted',\n  manifestLicenseInvalid: 'License should be a valid SPDX license expression',\n  manifestLicenseNone: 'No license field',\n  manifestStringExpected: '$0 is not a string',\n  manifestDependencyCollision: '$0 has dependency $1 with range $2 that collides with a dependency in $3 of the same name with version $4',\n  manifestDirectoryNotFound: 'Unable to read $0 directory of module $1',\n\n  verboseFileCopy: 'Copying $0 to $1.',\n  verboseFileLink: 'Creating hardlink at $0 to $1.',\n  verboseFileSymlink: 'Creating symlink at $0 to $1.',\n  verboseFileSkip: 'Skipping copying of file $0 as the file at $1 is the same size ($2) and mtime ($3).',\n  verboseFileSkipSymlink: 'Skipping copying of $0 as the file at $1 is the same symlink ($2).',\n  verboseFileSkipHardlink: 'Skipping copying of $0 as the file at $1 is the same hardlink ($2).',\n  verboseFileRemoveExtraneous: 'Removing extraneous file $0.',\n  verboseFilePhantomExtraneous: \"File $0 would be marked as extraneous but has been removed as it's listed as a phantom file.\",\n  verboseFileSkipArtifact: 'Skipping copying of $0 as the file is marked as a built artifact and subject to change.',\n  verboseFileFolder: 'Creating directory $0.',\n\n  verboseRequestStart: 'Performing $0 request to $1.',\n  verboseRequestFinish: 'Request $0 finished with status code $1.',\n\n  configSet: 'Set $0 to $1.',\n  configDelete: 'Deleted $0.',\n  configNpm: 'npm config',\n  configYarn: 'yarn config',\n\n  couldntFindPackagejson: \"Couldn't find a package.json file in $0\",\n  couldntFindMatch: \"Couldn't find match for $0 in $1 for $2.\",\n  couldntFindPackageInCache: \"Couldn't find any versions for $0 that matches $1 in our cache (possible versions are $2). This is usually caused by a missing entry in the lockfile, running Yarn without the --offline flag may help fix this issue.\",\n  couldntFindVersionThatMatchesRange: \"Couldn't find any versions for $0 that matches $1\",\n  chooseVersionFromList: 'Please choose a version of $0 from this list:',\n  moduleNotInManifest: \"This module isn't specified in a package.json file.\",\n  moduleAlreadyInManifest: '$0 is already in $1. Please remove existing entry first before adding it to $2.',\n  unknownFolderOrTarball: \"Passed folder/tarball doesn't exist,\",\n  unknownPackage: \"Couldn't find package $0.\",\n  unknownPackageName: \"Couldn't find package name.\",\n  unknownUser: \"Couldn't find user $0.\",\n  unknownRegistryResolver: 'Unknown registry resolver $0',\n  userNotAnOwner: \"User $0 isn't an owner of this package.\",\n  invalidVersionArgument: 'Use the $0 flag to create a new version.',\n  invalidVersion: 'Invalid version supplied.',\n  requiredVersionInRange: 'Required version in range.',\n  packageNotFoundRegistry: \"Couldn't find package $0 on the $1 registry.\",\n  requiredPackageNotFoundRegistry: \"Couldn't find package $0 required by $1 on the $2 registry.\",\n  doesntExist: \"Package $1 refers to a non-existing file '$0'.\",\n  missingRequiredPackageKey: `Package $0 doesn't have a $1.`,\n  invalidAccess: 'Invalid argument for access, expected public or restricted.',\n  invalidCommand: 'Invalid subcommand. Try $0',\n  invalidGistFragment: 'Invalid gist fragment $0.',\n  invalidHostedGitFragment: 'Invalid hosted git fragment $0.',\n  invalidFragment: 'Invalid fragment $0.',\n  invalidPackageName: 'Invalid package name.',\n  invalidPackageVersion: \"Can't add $0: invalid package version $1.\",\n  couldntFindManifestIn: \"Couldn't find manifest in $0.\",\n  shrinkwrapWarning: 'npm-shrinkwrap.json found. This will not be updated or respected. See https://yarnpkg.com/en/docs/migrating-from-npm for more information.',\n  npmLockfileWarning: 'package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.',\n  lockfileOutdated: 'Outdated lockfile. Please run `yarn install` and try again.',\n  lockfileMerged: 'Merge conflict detected in yarn.lock and successfully merged.',\n  lockfileConflict: 'A merge conflict was found in yarn.lock but it could not be successfully merged, regenerating yarn.lock from scratch.',\n  ignoredScripts: 'Ignored scripts due to flag.',\n  missingAddDependencies: 'Missing list of packages to add to your project.',\n  yesWarning: 'The yes flag has been set. This will automatically answer yes to all questions, which may have security implications.',\n  networkWarning: \"You don't appear to have an internet connection. Try the --offline flag to use the cache for registry queries.\",\n  flatGlobalError: 'The package $0 requires a flat dependency graph. Add `\"flat\": true` to your package.json and try again.',\n  noName: `Package doesn't have a name.`,\n  noVersion: `Package doesn't have a version.`,\n  answerRequired: 'An answer is required.',\n  missingWhyDependency: 'Missing package name, folder or path to file to identify why a package has been installed',\n  bugReport: 'If you think this is a bug, please open a bug report with the information provided in $0.',\n  unexpectedError: 'An unexpected error occurred: $0.',\n  jsonError: 'Error parsing JSON at $0, $1.',\n  noPermission: 'Cannot create $0 due to insufficient permissions.',\n  noGlobalFolder: 'Cannot find a suitable global folder. Tried these: $0',\n  allDependenciesUpToDate: 'All of your dependencies are up to date.',\n  legendColorsForVersionUpdates: 'Color legend : \\n $0    : Major Update backward-incompatible updates \\n $1 : Minor Update backward-compatible features \\n $2  : Patch Update backward-compatible bug fixes',\n  frozenLockfileError: 'Your lockfile needs to be updated, but yarn was run with `--frozen-lockfile`.',\n  fileWriteError: 'Could not write file $0: $1',\n  multiplePackagesCantUnpackInSameDestination: 'Pattern $0 is trying to unpack in the same destination $1 as pattern $2. This could result in non-deterministic behavior, skipping.',\n  incorrectLockfileEntry: 'Lockfile has incorrect entry for $0. Ignoring it.',\n\n  invalidResolutionName: 'Resolution field $0 does not end with a valid package name and will be ignored',\n  invalidResolutionVersion: 'Resolution field $0 has an invalid version entry and may be ignored',\n  incompatibleResolutionVersion: 'Resolution field $0 is incompatible with requested version $1',\n\n  yarnOutdated: \"Your current version of Yarn is out of date. The latest version is $0, while you're on $1.\",\n  yarnOutdatedInstaller: 'To upgrade, download the latest installer at $0.',\n  yarnOutdatedCommand: 'To upgrade, run the following command:',\n\n  tooManyArguments: 'Too many arguments, maximum of $0.',\n  tooFewArguments: 'Not enough arguments, expected at least $0.',\n  noArguments: \"This command doesn't require any arguments.\",\n\n  ownerRemoving: 'Removing owner $0 from package $1.',\n  ownerRemoved: 'Owner removed.',\n  ownerRemoveError: \"Couldn't remove owner.\",\n  ownerGetting: 'Getting owners for package $0',\n  ownerGettingFailed: \"Couldn't get list of owners.\",\n  ownerAlready: 'This user is already an owner of this package.',\n  ownerAdded: 'Added owner.',\n  ownerAdding: 'Adding owner $0 to package $1',\n  ownerAddingFailed: \"Couldn't add owner.\",\n  ownerNone: 'No owners.',\n\n  teamCreating: 'Creating team',\n  teamRemoving: 'Removing team',\n  teamAddingUser: 'Adding user to team',\n  teamRemovingUser: 'Removing user from team',\n  teamListing: 'Listing teams',\n\n  cleaning: 'Cleaning modules',\n  cleanCreatingFile: 'Creating $0',\n  cleanCreatedFile: 'Created $0. Please review the contents of this file then run \"yarn autoclean --force\" to perform a clean.',\n  cleanAlreadyExists: '$0 already exists. To revert to the default file, delete $0 then rerun this command.',\n  cleanRequiresForce: 'This command required the \"--force\" flag to perform the clean. This is a destructive operation. Files specified in $0 will be deleted.',\n  cleanDoesNotExist: '$0 does not exist. Autoclean will delete files specified by $0. Run \"autoclean --init\" to create $0 with the default entries.',\n\n  binLinkCollision: \"There's already a linked binary called $0 in your global Yarn bin. Could not link this package's $0 bin entry.\",\n  linkCollision: \"There's already a package called $0 registered. This command has had no effect. If this command was run in another folder with the same name, the other folder is still linked. Please run yarn unlink in the other folder if you want to register this folder.\",\n  linkMissing: 'No registered package found called $0.',\n  linkRegistered: 'Registered $0.',\n  linkRegisteredMessage: 'You can now run `yarn link $0` in the projects where you want to use this package and it will be used instead.',\n  linkUnregistered: 'Unregistered $0.',\n  linkUnregisteredMessage: 'You can now run `yarn unlink $0` in the projects where you no longer want to use this package.',\n  linkUsing: 'Using linked package for $0.',\n  linkDisusing: 'Removed linked package $0.',\n  linkDisusingMessage: 'You will need to run `yarn install --force` to re-install the package that was linked.',\n  linkTargetMissing: 'The target of linked package $0 is missing. Removing link.',\n\n  createInvalidBin: 'Invalid bin entry found in package $0.',\n  createMissingPackage: 'Package not found - this is probably an internal error, and should be reported at https://github.com/yarnpkg/yarn/issues.',\n\n  workspacesAddRootCheck: 'Running this command will add the dependency to the workspace root rather than the workspace itself, which might not be what you want - if you really meant it, make it explicit by running this command again with the -W flag (or --ignore-workspace-root-check).',\n  workspacesRemoveRootCheck: 'Running this command will remove the dependency from the workspace root rather than the workspace itself, which might not be what you want - if you really meant it, make it explicit by running this command again with the -W flag (or --ignore-workspace-root-check).',\n  workspacesFocusRootCheck: 'This command can only be run inside an individual workspace.',\n  workspacesRequirePrivateProjects: 'Workspaces can only be enabled in private projects.',\n  workspacesSettingMustBeArray: 'The workspaces field in package.json must be an array.',\n  workspacesDisabled: 'Your project root defines workspaces but the feature is disabled in your Yarn config. Please check \"workspaces-experimental\" in your .yarnrc file.',\n\n  workspacesNohoistRequirePrivatePackages: 'nohoist config is ignored in $0 because it is not a private package. If you think nohoist should be allowed in public packages, please submit an issue for your use case.',\n  workspacesNohoistDisabled: `$0 defines nohoist but the feature is disabled in your Yarn config (\"workspaces-nohoist-experimental\" in .yarnrc file)`,\n\n  workspaceRootNotFound: \"Cannot find the root of your workspace - are you sure you're currently in a workspace?\",\n  workspaceMissingWorkspace: 'Missing workspace name.',\n  workspaceMissingCommand: 'Missing command name.',\n  workspaceUnknownWorkspace: 'Unknown workspace $0.',\n  workspaceVersionMandatory: 'Missing version in workspace at $0, ignoring.',\n  workspaceNameMandatory: 'Missing name in workspace at $0, ignoring.',\n  workspaceNameDuplicate: 'There are more than one workspace with name $0',\n\n  cacheFolderSkipped: 'Skipping preferred cache folder $0 because it is not writable.',\n  cacheFolderMissing: \"Yarn hasn't been able to find a cache folder it can use. Please use the explicit --cache-folder option to tell it what location to use, or make one of the preferred locations writable.\",\n  cacheFolderSelected: 'Selected the next writable cache folder in the list, will be $0.',\n\n  execMissingCommand: 'Missing command name.',\n\n  noScriptsAvailable: 'There are no scripts specified inside package.json.',\n  noBinAvailable: 'There are no binary scripts available.',\n  dashDashDeprecation: `From Yarn 1.0 onwards, scripts don't require \"--\" for options to be forwarded. In a future version, any explicit \"--\" will be forwarded as-is to the scripts.`,\n  commandNotSpecified: 'No command specified.',\n  binCommands: 'Commands available from binary scripts: ',\n  possibleCommands: 'Project commands',\n  commandQuestion: 'Which command would you like to run?',\n  commandFailedWithCode: 'Command failed with exit code $0.',\n  commandFailedWithSignal: 'Command failed with signal $0.',\n  packageRequiresNodeGyp: 'This package requires node-gyp, which is not currently installed. Yarn will attempt to automatically install it. If this fails, you can run \"yarn global add node-gyp\" to manually install it.',\n  nodeGypAutoInstallFailed: 'Failed to auto-install node-gyp. Please run \"yarn global add node-gyp\" manually. Error: $0',\n\n  foundIncompatible: 'Found incompatible module.',\n  incompatibleEngine: 'The engine $0 is incompatible with this module. Expected version $1. Got $2',\n  incompatibleCPU: 'The CPU architecture $0 is incompatible with this module.',\n  incompatibleOS: 'The platform $0 is incompatible with this module.',\n  invalidEngine: 'The engine $0 appears to be invalid.',\n  cannotRunWithIncompatibleEnv: 'Commands cannot run with an incompatible environment.',\n\n  optionalCompatibilityExcluded: '$0 is an optional dependency and failed compatibility check. Excluding it from installation.',\n  optionalModuleFail: 'This module is OPTIONAL, you can safely ignore this error',\n  optionalModuleScriptFail: 'Error running install script for optional dependency: $0',\n  optionalModuleCleanupFail: 'Could not cleanup build artifacts from failed install: $0',\n\n  unmetPeer: '$0 has unmet peer dependency $1.',\n  incorrectPeer: '$0 has incorrect peer dependency $1.',\n  selectedPeer: 'Selecting $1 at level $2 as the peer dependency of $0.',\n  missingBundledDependency: '$0 is missing a bundled dependency $1. This should be reported to the package maintainer.',\n\n  savedNewDependency: 'Saved 1 new dependency.',\n  savedNewDependencies: 'Saved $0 new dependencies.',\n  directDependencies: 'Direct dependencies',\n  allDependencies: 'All dependencies',\n\n  foundWarnings: 'Found $0 warnings.',\n  foundErrors: 'Found $0 errors.',\n\n  savedLockfile: 'Saved lockfile.',\n  noRequiredLockfile: 'No lockfile in this directory. Run `yarn install` to generate one.',\n  noLockfileFound: 'No lockfile found.',\n\n  invalidSemver: 'Invalid semver version',\n  newVersion: 'New version',\n  currentVersion: 'Current version',\n  noVersionOnPublish: 'Proceeding with current version',\n\n  manualVersionResolution: 'Unable to find a suitable version for $0, please choose one by typing one of the numbers below:',\n  manualVersionResolutionOption: '$0 which resolved to $1',\n\n  createdTag: 'Created tag.',\n  createdTagFail: \"Couldn't add tag.\",\n  deletedTag: 'Deleted tag.',\n  deletedTagFail: \"Couldn't delete tag.\",\n  gettingTags: 'Getting tags',\n  deletingTags: 'Deleting tag',\n  creatingTag: 'Creating tag $0 = $1',\n\n  whyStart: 'Why do we have the module $0?',\n  whyFinding: 'Finding dependency',\n  whyCalculating: 'Calculating file sizes',\n  whyUnknownMatch: \"We couldn't find a match!\",\n  whyInitGraph: 'Initialising dependency graph',\n  whyWhoKnows: \"We don't know why this module exists\",\n  whyDiskSizeWithout: 'Disk size without dependencies: $0',\n  whyDiskSizeUnique: 'Disk size with unique dependencies: $0',\n  whyDiskSizeTransitive: 'Disk size with transitive dependencies: $0',\n  whySharedDependencies: 'Number of shared dependencies: $0',\n  whyHoistedTo: `Has been hoisted to $0`,\n\n  whyHoistedFromSimple: `This module exists because it's hoisted from $0.`,\n  whyNotHoistedSimple: `This module exists here because it's in the nohoist list $0.`,\n  whyDependedOnSimple: `This module exists because $0 depends on it.`,\n  whySpecifiedSimple: `This module exists because it's specified in $0.`,\n  whyReasons: 'Reasons this module exists',\n  whyHoistedFrom: 'Hoisted from $0',\n  whyNotHoisted: `in the nohoist list $0`,\n  whyDependedOn: '$0 depends on it',\n  whySpecified: `Specified in $0`,\n\n  whyMatch: `\\r=> Found $0`,\n\n  uninstalledPackages: 'Uninstalled packages.',\n  uninstallRegenerate: 'Regenerating lockfile and installing missing dependencies',\n\n  cleanRemovedFiles: 'Removed $0 files',\n  cleanSavedSize: 'Saved $0 MB.',\n\n  configFileFound: 'Found configuration file $0.',\n  configPossibleFile: 'Checking for configuration file $0.',\n\n  npmUsername: 'npm username',\n  npmPassword: 'npm password',\n  npmEmail: 'npm email',\n  npmOneTimePassword: 'npm one-time password',\n\n  loggingIn: 'Logging in',\n  loggedIn: 'Logged in.',\n  notRevokingEnvToken: 'Not revoking login token, specified via environment variable.',\n  notRevokingConfigToken: 'Not revoking login token, specified via config file.',\n  noTokenToRevoke: 'No login token to revoke.',\n  revokingToken: 'Revoking token',\n  revokedToken: 'Revoked login token.',\n\n  loginAsPublic: 'Logging in as public',\n  incorrectCredentials: 'Incorrect username or password.',\n  incorrectOneTimePassword: 'Incorrect one-time password.',\n  twoFactorAuthenticationEnabled: 'Two factor authentication enabled.',\n  clearedCredentials: 'Cleared login credentials.',\n\n  publishFail: \"Couldn't publish package: $0\",\n  publishPrivate: 'Package marked as private, not publishing.',\n  published: 'Published.',\n  publishing: 'Publishing',\n\n  nonInteractiveNoVersionSpecified: 'You must specify a new version with --new-version when running with --non-interactive.',\n  nonInteractiveNoToken: \"No token found and can't prompt for login when running with --non-interactive.\",\n\n  infoFail: 'Received invalid response from npm.',\n  malformedRegistryResponse: 'Received malformed response from registry for $0. The registry may be down.',\n  registryNoVersions: 'No valid versions found for $0. The package may be unpublished.',\n\n  cantRequestOffline: \"Can't make a request in offline mode ($0)\",\n  requestManagerNotSetupHAR: 'RequestManager was not setup to capture HAR files',\n  requestError: 'Request $0 returned a $1',\n  requestFailed: 'Request failed $0',\n  tarballNotInNetworkOrCache: '$0: Tarball is not in network and can not be located in cache ($1)',\n  fetchBadIntegrityCache: 'Incorrect integrity when fetching from the cache for $0. Cache has $1 and remote has $2. Run `yarn cache clean` to fix the problem',\n  fetchBadHashCache: 'Incorrect hash when fetching from the cache for $0. Cache has $1 and remote has $2. Run `yarn cache clean` to fix the problem',\n  fetchBadHashWithPath: \"Integrity check failed for $0 (computed integrity doesn't match our records, got $2)\",\n  fetchBadIntegrityAlgorithm: 'Integrity checked failed for $0 (none of the specified algorithms are supported)',\n  fetchErrorCorrupt: '$0. Mirror tarball appears to be corrupt. You can resolve this by running:\\n\\n  rm -rf $1\\n  yarn install',\n  errorExtractingTarball: 'Extracting tar content of $1 failed, the file appears to be corrupt: $0',\n  updateInstalling: 'Installing $0...',\n  hostedGitResolveError: 'Error connecting to repository. Please, check the url.',\n  unauthorizedResponse: 'Received a 401 from $0. $1',\n\n  unknownFetcherFor: 'Unknown fetcher for $0',\n\n  downloadGitWithoutCommit: 'Downloading the git repo $0 over plain git without a commit hash',\n  downloadHTTPWithoutCommit: 'Downloading the git repo $0 over HTTP without a commit hash',\n\n  unplugDisabled: \"Packages can only be unplugged when Plug'n'Play is enabled.\",\n\n  plugnplaySuggestV2L1: \"Plug'n'Play support has been greatly improved on the Yarn v2 development branch.\",\n  plugnplaySuggestV2L2: 'Please give it a try and tell us what you think! - https://next.yarnpkg.com/getting-started/install',\n  plugnplayWindowsSupport: \"Plug'n'Play on Windows doesn't support the cache and project to be kept on separate drives\",\n\n  packageInstalledWithBinaries: 'Installed $0 with binaries:',\n  packageHasBinaries: '$0 has binaries:',\n  packageHasNoBinaries: '$0 has no binaries',\n  packageBinaryNotFound: \"Couldn't find a binary named $0\",\n\n  couldBeDeduped: '$0 could be deduped from $1 to $2',\n  lockfileNotContainPattern: 'Lockfile does not contain pattern: $0',\n  integrityCheckFailed: 'Integrity check failed',\n  noIntegrityFile: \"Couldn't find an integrity file\",\n  integrityFailedExpectedIsNotAJSON: 'Integrity check: integrity file is not a json',\n  integrityCheckLinkedModulesDontMatch: \"Integrity check: Linked modules don't match\",\n  integrityFlagsDontMatch: \"Integrity check: Flags don't match\",\n  integrityLockfilesDontMatch: \"Integrity check: Lock files don't match\",\n  integrityFailedFilesMissing: 'Integrity check: Files are missing',\n  integrityPatternsDontMatch: \"Integrity check: Top level patterns don't match\",\n  integrityModulesFoldersMissing: 'Integrity check: Some module folders are missing',\n  integritySystemParamsDontMatch: \"Integrity check: System parameters don't match\",\n  packageNotInstalled: '$0 not installed',\n  optionalDepNotInstalled: 'Optional dependency $0 not installed',\n  packageWrongVersion: '$0 is wrong version: expected $1, got $2',\n  packageDontSatisfy: \"$0 doesn't satisfy found match of $1\",\n\n  lockfileExists: 'Lockfile already exists, not importing.',\n  skippingImport: 'Skipping import of $0 for $1',\n  importFailed: 'Import of $0 for $1 failed, resolving normally.',\n  importResolveFailed: 'Import of $0 failed starting in $1',\n  importResolvedRangeMatch: 'Using version $0 of $1 instead of $2 for $3',\n  importSourceFilesCorrupted: 'Failed to import from package-lock.json, source file(s) corrupted',\n  importPackageLock: 'found npm package-lock.json, converting to yarn.lock',\n  importNodeModules: 'creating yarn.lock from local node_modules folder',\n  packageContainsYarnAsGlobal: 'Installing Yarn via Yarn will result in you having two separate versions of Yarn installed at the same time, which is not recommended. To update Yarn please follow https://yarnpkg.com/en/docs/install .',\n\n  scopeNotValid: 'The specified scope is not valid.',\n\n  deprecatedCommand: '$0 is deprecated. Please use $1.',\n  deprecatedListArgs: 'Filtering by arguments is deprecated. Please use the pattern option instead.',\n  implicitFileDeprecated: 'Using the \"file:\" protocol implicitly is deprecated. Please either prepend the protocol or prepend the path $0 with \"./\".',\n  unsupportedNodeVersion: 'You are using Node $0 which is not supported and may encounter bugs or unexpected behavior. Yarn supports the following semver range: $1',\n\n  verboseUpgradeBecauseRequested: 'Considering upgrade of $0 to $1 because it was directly requested.',\n  verboseUpgradeBecauseOutdated: 'Considering upgrade of $0 to $1 because a newer version exists in the registry.',\n  verboseUpgradeNotUnlocking: 'Not unlocking $0 in the lockfile because it is a new or direct dependency.',\n  verboseUpgradeUnlocking: 'Unlocking $0 in the lockfile.',\n  folderMissing: \"Directory $0 doesn't exist\",\n  mutexPortBusy: 'Cannot use the network mutex on port $0. It is probably used by another app.',\n\n  auditRunning: 'Auditing packages',\n  auditSummary: '$0 vulnerabilities found - Packages audited: $1',\n  auditSummarySeverity: 'Severity:',\n  auditCritical: '$0 Critical',\n  auditHigh: '$0 High',\n  auditModerate: '$0 Moderate',\n  auditLow: '$0 Low',\n  auditInfo: '$0 Info',\n  auditResolveCommand: '# Run $0 to resolve $1 $2',\n  auditSemverMajorChange: 'SEMVER WARNING: Recommended action is a potentially breaking change',\n  auditManualReview: 'Manual Review\\nSome vulnerabilities require your attention to resolve\\n\\nVisit https://go.npm.me/audit-guide for additional guidance',\n  auditRunAuditForDetails: 'Security audit found potential problems. Run \"yarn audit\" for additional details.',\n  auditOffline: 'Skipping audit. Security audit cannot be performed in offline mode.'\n};\n\nexports.default = messages;\n\n/***/ }),\n/* 536 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.en = undefined;\n\nvar _en;\n\nfunction _load_en() {\n  return _en = _interopRequireDefault(__webpack_require__(535));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.en = (_en || _load_en()).default;\n\n/***/ }),\n/* 537 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _baseReporter;\n\nfunction _load_baseReporter() {\n  return _baseReporter = _interopRequireDefault(__webpack_require__(108));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint no-unused-vars: 0 */\n\nclass NoopReporter extends (_baseReporter || _load_baseReporter()).default {\n  lang(key, ...args) {\n    return 'do nothing';\n  }\n  verbose(msg) {}\n  verboseInspect(val) {}\n  initPeakMemoryCounter() {}\n  checkPeakMemory() {}\n  close() {}\n  getTotalTime() {\n    return 0;\n  }\n  list(key, items, hints) {}\n  tree(key, obj) {}\n  step(current, total, message, emoji) {}\n  error(message) {}\n  info(message) {}\n  warn(message) {}\n  success(message) {}\n  log(message) {}\n  command(command) {}\n  inspect(value) {}\n  header(command, pkg) {}\n  footer(showPeakMemory) {}\n  table(head, body) {}\n\n  activity() {\n    return {\n      tick(name) {},\n      end() {}\n    };\n  }\n\n  activitySet(total, workers) {\n    return {\n      spinners: Array(workers).fill({\n        clear() {},\n        setPrefix() {},\n        tick() {},\n        end() {}\n      }),\n      end() {}\n    };\n  }\n\n  question(question, options = {}) {\n    return Promise.reject(new Error('Not implemented'));\n  }\n\n  questionAffirm(question) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      yield _this.question(question);\n      return false;\n    })();\n  }\n\n  select(header, question, options) {\n    return Promise.reject(new Error('Not implemented'));\n  }\n\n  progress(total) {\n    return function () {};\n  }\n\n  disableProgress() {\n    this.noProgress = true;\n  }\n\n  prompt(message, choices, options = {}) {\n    return Promise.reject(new Error('Not implemented'));\n  }\n}\nexports.default = NoopReporter;\n\n/***/ }),\n/* 538 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _extends2;\n\nfunction _load_extends() {\n  return _extends2 = _interopRequireDefault(__webpack_require__(20));\n}\n\nvar _packageRequest;\n\nfunction _load_packageRequest() {\n  return _packageRequest = _interopRequireDefault(__webpack_require__(123));\n}\n\nvar _baseResolver;\n\nfunction _load_baseResolver() {\n  return _baseResolver = _interopRequireDefault(__webpack_require__(124));\n}\n\nvar _workspaceLayout;\n\nfunction _load_workspaceLayout() {\n  return _workspaceLayout = _interopRequireDefault(__webpack_require__(90));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nclass WorkspaceResolver extends (_baseResolver || _load_baseResolver()).default {\n  static isWorkspace(pattern, workspaceLayout) {\n    return !!workspaceLayout && !!workspaceLayout.getManifestByPattern(pattern);\n  }\n\n  constructor(request, fragment, workspaceLayout) {\n    super(request, fragment);\n    this.workspaceLayout = workspaceLayout;\n  }\n\n  resolve(downloadedManifest) {\n    const workspace = this.workspaceLayout.getManifestByPattern(this.request.pattern);\n    invariant(workspace, 'expected workspace');\n    const manifest = workspace.manifest,\n          loc = workspace.loc;\n\n    if (manifest._remote && manifest._remote.registryRemote) {\n      return Promise.resolve(manifest); //already downloaded\n    }\n    const registry = manifest._registry;\n    invariant(registry, 'expected reference');\n    let hash = '';\n    let registryRemote;\n    if (downloadedManifest && manifest.version === downloadedManifest.version) {\n      registryRemote = downloadedManifest._remote;\n      invariant(registryRemote, 'missing remote info');\n      hash = registryRemote.hash;\n      //override any local changes to manifest\n      Object.keys(manifest).forEach(k => k.startsWith('_') || delete manifest[k]);\n      Object.assign(manifest, downloadedManifest);\n    } else if (manifest._remote && manifest._remote.hash) {\n      invariant(workspace.manifest._remote, 'missing remote info');\n      registryRemote = workspace.manifest._remote.registryRemote;\n      hash = manifest._remote.hash;\n    }\n    if (registryRemote) {\n      registryRemote = (0, (_extends2 || _load_extends()).default)({}, registryRemote);\n    }\n\n    manifest._remote = Object.assign(manifest._remote || {}, {\n      type: 'workspace',\n      registryRemote,\n      registry,\n      hash,\n      reference: loc\n    });\n\n    manifest._uid = manifest.version;\n\n    return Promise.resolve(manifest);\n  }\n}\nexports.default = WorkspaceResolver;\n\n/***/ }),\n/* 539 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _hostedGitResolver;\n\nfunction _load_hostedGitResolver() {\n  return _hostedGitResolver = _interopRequireDefault(__webpack_require__(109));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass BitbucketResolver extends (_hostedGitResolver || _load_hostedGitResolver()).default {\n\n  static getTarballUrl(parts, hash) {\n    return `https://${this.hostname}/${parts.user}/${parts.repo}/get/${hash}.tar.gz`;\n  }\n\n  static getGitHTTPBaseUrl(parts) {\n    return `https://${this.hostname}/${parts.user}/${parts.repo}`;\n  }\n\n  static getGitHTTPUrl(parts) {\n    return `${BitbucketResolver.getGitHTTPBaseUrl(parts)}.git`;\n  }\n\n  static getGitSSHUrl(parts) {\n    return `git+ssh://git@${this.hostname}/${parts.user}/${parts.repo}.git` + `${parts.hash ? '#' + decodeURIComponent(parts.hash) : ''}`;\n  }\n\n  static getHTTPFileUrl(parts, filename, commit) {\n    return `https://${this.hostname}/${parts.user}/${parts.repo}/raw/${commit}/${filename}`;\n  }\n\n  hasHTTPCapability(url) {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      // We don't follow redirects and reject a 302 since this means BitBucket\n      // won't allow us to use the HTTP protocol for `git` access.\n      // Most probably a private repo and this 302 is to a login page.\n      const bitbucketHTTPSupport = yield _this.config.requestManager.request({\n        url,\n        method: 'HEAD',\n        queue: _this.resolver.fetchingQueue,\n        followRedirect: false,\n        rejectStatusCode: 302\n      });\n      return bitbucketHTTPSupport !== false;\n    })();\n  }\n}\nexports.default = BitbucketResolver;\nBitbucketResolver.hostname = 'bitbucket.org';\nBitbucketResolver.protocol = 'bitbucket';\n\n/***/ }),\n/* 540 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _hostedGitResolver;\n\nfunction _load_hostedGitResolver() {\n  return _hostedGitResolver = _interopRequireDefault(__webpack_require__(109));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass GitLabResolver extends (_hostedGitResolver || _load_hostedGitResolver()).default {\n\n  static getTarballUrl(parts, hash) {\n    return `https://${this.hostname}/${parts.user}/${parts.repo}/repository/archive.tar.gz?ref=${hash}`;\n  }\n\n  static getGitHTTPBaseUrl(parts) {\n    return `https://${this.hostname}/${parts.user}/${parts.repo}`;\n  }\n\n  static getGitHTTPUrl(parts) {\n    return `${GitLabResolver.getGitHTTPBaseUrl(parts)}.git`;\n  }\n\n  static getGitSSHUrl(parts) {\n    return `git+ssh://git@${this.hostname}/${parts.user}/${parts.repo}.git` + `${parts.hash ? '#' + decodeURIComponent(parts.hash) : ''}`;\n  }\n\n  static getHTTPFileUrl(parts, filename, commit) {\n    return `https://${this.hostname}/${parts.user}/${parts.repo}/raw/${commit}/${filename}`;\n  }\n}\nexports.default = GitLabResolver;\nGitLabResolver.hostname = 'gitlab.com';\nGitLabResolver.protocol = 'gitlab';\n\n/***/ }),\n/* 541 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _errors;\n\nfunction _load_errors() {\n  return _errors = __webpack_require__(6);\n}\n\nvar _exoticResolver;\n\nfunction _load_exoticResolver() {\n  return _exoticResolver = _interopRequireDefault(__webpack_require__(89));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass RegistryResolver extends (_exoticResolver || _load_exoticResolver()).default {\n  constructor(request, fragment) {\n    super(request, fragment);\n\n    const match = fragment.match(/^(\\S+):(@?.*?)(@(.*?)|)$/);\n    if (match) {\n      this.range = match[4] || 'latest';\n      this.name = match[2];\n    } else {\n      throw new (_errors || _load_errors()).MessageError(this.reporter.lang('invalidFragment', fragment));\n    }\n\n    // $FlowFixMe\n    this.registry = this.constructor.protocol;\n  }\n\n  resolve() {\n    return this.fork(this.constructor.factory, false, this.name, this.range);\n  }\n}\nexports.default = RegistryResolver;\n\n/***/ }),\n/* 542 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _tarballFetcher;\n\nfunction _load_tarballFetcher() {\n  return _tarballFetcher = _interopRequireDefault(__webpack_require__(358));\n}\n\nvar _exoticResolver;\n\nfunction _load_exoticResolver() {\n  return _exoticResolver = _interopRequireDefault(__webpack_require__(89));\n}\n\nvar _gitResolver;\n\nfunction _load_gitResolver() {\n  return _gitResolver = _interopRequireDefault(__webpack_require__(125));\n}\n\nvar _guessName;\n\nfunction _load_guessName() {\n  return _guessName = _interopRequireDefault(__webpack_require__(169));\n}\n\nvar _version;\n\nfunction _load_version() {\n  return _version = _interopRequireWildcard(__webpack_require__(223));\n}\n\nvar _crypto;\n\nfunction _load_crypto() {\n  return _crypto = _interopRequireWildcard(__webpack_require__(168));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst invariant = __webpack_require__(9);\n\nclass TarballResolver extends (_exoticResolver || _load_exoticResolver()).default {\n  constructor(request, fragment) {\n    super(request, fragment);\n\n    var _versionUtil$explodeH = (_version || _load_version()).explodeHashedUrl(fragment);\n\n    const hash = _versionUtil$explodeH.hash,\n          url = _versionUtil$explodeH.url;\n\n    this.hash = hash;\n    this.url = url;\n  }\n\n  static isVersion(pattern) {\n    // we can sometimes match git urls which we don't want\n    if ((_gitResolver || _load_gitResolver()).default.isVersion(pattern)) {\n      return false;\n    }\n\n    // full http url\n    if (pattern.startsWith('http://') || pattern.startsWith('https://')) {\n      return true;\n    }\n\n    // local file reference - ignore patterns with names\n    if (pattern.indexOf('@') < 0) {\n      if (pattern.endsWith('.tgz') || pattern.endsWith('.tar.gz')) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  resolve() {\n    var _this = this;\n\n    return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () {\n      const shrunk = _this.request.getLocked('tarball');\n      if (shrunk) {\n        return shrunk;\n      }\n\n      const url = _this.url;\n      let hash = _this.hash,\n          registry = _this.registry;\n\n      let pkgJson;\n\n      // generate temp directory\n      const dest = _this.config.getTemp((_crypto || _load_crypto()).hash(url));\n\n      if (yield _this.config.isValidModuleDest(dest)) {\n        var _ref = yield _this.config.readPackageMetadata(dest);\n        // load from local cache\n\n\n        pkgJson = _ref.package;\n        hash = _ref.hash;\n        registry = _ref.registry;\n      } else {\n        // delete if invalid\n        yield (_fs || _load_fs()).unlink(dest);\n\n        const fetcher = new (_tarballFetcher || _load_tarballFetcher()).default(dest, {\n          type: 'tarball',\n          reference: url,\n          registry,\n          hash\n        }, _this.config);\n\n        // fetch file and get it's hash\n        const fetched = yield fetcher.fetch({\n          name: (0, (_guessName || _load_guessName()).default)(url),\n          version: '0.0.0',\n          _registry: 'npm'\n        });\n        pkgJson = fetched.package;\n        hash = fetched.hash;\n\n        registry = pkgJson._registry;\n        invariant(registry, 'expected registry');\n      }\n\n      // use the commit/tarball hash as the uid as we can't rely on the version as it's not\n      // in the registry\n      pkgJson._uid = hash;\n\n      // set remote so it can be \"fetched\"\n      pkgJson._remote = {\n        type: 'copy',\n        resolved: `${url}#${hash}`,\n        hash,\n        registry,\n        reference: dest\n      };\n\n      return pkgJson;\n    })();\n  }\n}\nexports.default = TarballResolver;\n\n/***/ }),\n/* 543 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _baseResolver;\n\nfunction _load_baseResolver() {\n  return _baseResolver = _interopRequireDefault(__webpack_require__(124));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass RegistryResolver extends (_baseResolver || _load_baseResolver()).default {\n  constructor(request, name, range) {\n    super(request, `${name}@${range}`);\n    this.name = name;\n    this.range = range;\n\n    this.registryConfig = request.config.registries[this.constructor.registry].config;\n  }\n\n}\nexports.default = RegistryResolver;\n\n/***/ }),\n/* 544 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _npmResolver;\n\nfunction _load_npmResolver() {\n  return _npmResolver = _interopRequireDefault(__webpack_require__(215));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass YarnResolver extends (_npmResolver || _load_npmResolver()).default {}\nexports.default = YarnResolver;\n\n/***/ }),\n/* 545 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = envReplace;\nconst ENV_EXPR = /(\\\\*)\\$\\{([^}]+)\\}/g;\n\nfunction envReplace(value, env = process.env) {\n  if (typeof value !== 'string' || !value) {\n    return value;\n  }\n\n  return value.replace(ENV_EXPR, (match, esc, envVarName) => {\n    if (esc.length && esc.length % 2) {\n      return match;\n    }\n    if (undefined === env[envVarName]) {\n      throw new Error('Failed to replace env in config: ' + match);\n    }\n    return env[envVarName] || '';\n  });\n}\n\n/***/ }),\n/* 546 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.fixCmdWinSlashes = fixCmdWinSlashes;\nfunction fixCmdWinSlashes(cmd) {\n  function findQuotes(quoteSymbol) {\n    const quotes = [];\n    const addQuote = (_, index) => {\n      quotes.push({ from: index, to: index + _.length });\n      return _;\n    };\n    const regEx = new RegExp(quoteSymbol + '.*' + quoteSymbol);\n    cmd.replace(regEx, addQuote);\n    return quotes;\n  }\n  const quotes = findQuotes('\"').concat(findQuotes(\"'\"));\n\n  function isInsideQuotes(index) {\n    return quotes.reduce((result, quote) => {\n      return result || quote.from <= index && index <= quote.to;\n    }, false);\n  }\n\n  const cmdPrePattern = '((?:^|&&|&|\\\\|\\\\||\\\\|)\\\\s*)';\n  const cmdPattern = '(\".*?\"|\\'.*?\\'|\\\\S*)';\n  const regExp = new RegExp(`${cmdPrePattern}${cmdPattern}`, 'g');\n  return cmd.replace(regExp, (whole, pre, cmd, index) => {\n    if ((pre[0] === '&' || pre[0] === '|') && isInsideQuotes(index)) {\n      return whole;\n    }\n    return pre + cmd.replace(/\\//g, '\\\\');\n  });\n}\n\n/***/ }),\n/* 547 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.generatePnpMap = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet getPackageInformationStores = (() => {\n  var _ref17 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, seedPatterns, { resolver, reporter, targetPath, workspaceLayout }) {\n    const targetDirectory = path.dirname(targetPath);\n    const offlineCacheFolder = config.offlineCacheFolder;\n\n    const packageInformationStores = new Map();\n    const blacklistedLocations = new Set();\n\n    const getCachePath = function getCachePath(fsPath) {\n      const cacheRelativePath = normalizePath(path.relative(config.cacheFolder, fsPath));\n\n      // if fsPath is not inside cacheRelativePath, we just skip it\n      if (cacheRelativePath.match(/^\\.\\.\\//)) {\n        return null;\n      }\n\n      return cacheRelativePath;\n    };\n\n    const resolveOfflineCacheFolder = function resolveOfflineCacheFolder(fsPath) {\n      if (!offlineCacheFolder) {\n        return fsPath;\n      }\n\n      const cacheRelativePath = getCachePath(fsPath);\n\n      // if fsPath is not inside the cache, we shouldn't replace it (workspace)\n      if (!cacheRelativePath) {\n        return fsPath;\n      }\n\n      const components = cacheRelativePath.split(/\\//g);\n      const cacheEntry = components[0],\n            internalPath = components.slice(1);\n\n\n      return path.resolve(offlineCacheFolder, `${cacheEntry}${OFFLINE_CACHE_EXTENSION}`, internalPath.join('/'));\n    };\n\n    const normalizePath = function normalizePath(fsPath) {\n      return process.platform === 'win32' ? fsPath.replace(backwardSlashRegExp, '/') : fsPath;\n    };\n\n    const normalizeDirectoryPath = function normalizeDirectoryPath(fsPath) {\n      let relativePath = normalizePath(path.relative(targetDirectory, resolveOfflineCacheFolder(fsPath)));\n\n      if (!relativePath.match(/^\\.{0,2}\\//) && !path.isAbsolute(relativePath)) {\n        relativePath = `./${relativePath}`;\n      }\n\n      return relativePath.replace(/\\/?$/, '/');\n    };\n\n    const getHashFrom = function getHashFrom(data) {\n      const hashGenerator = crypto.createHash('sha1');\n\n      for (var _iterator10 = data, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) {\n        var _ref18;\n\n        if (_isArray10) {\n          if (_i10 >= _iterator10.length) break;\n          _ref18 = _iterator10[_i10++];\n        } else {\n          _i10 = _iterator10.next();\n          if (_i10.done) break;\n          _ref18 = _i10.value;\n        }\n\n        const datum = _ref18;\n\n        hashGenerator.update(datum);\n      }\n\n      return hashGenerator.digest('hex');\n    };\n\n    const getResolverEntry = function getResolverEntry(pattern) {\n      const pkg = resolver.getStrictResolvedPattern(pattern);\n      const ref = pkg._reference;\n\n      if (!ref) {\n        return null;\n      }\n\n      invariant(ref.locations.length <= 1, 'Must have at most one location (usually in the cache)');\n      const loc = ref.locations[0];\n\n      if (!loc) {\n        return null;\n      }\n\n      return { pkg, ref, loc };\n    };\n\n    const visit = (() => {\n      var _ref19 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (precomputedResolutions, seedPatterns, parentData = []) {\n        const resolutions = new Map(precomputedResolutions);\n        const locations = new Map();\n\n        // This first pass will compute the package reference of each of the given patterns\n        // They will usually be the package version, but not always. We need to do this in a pre-process pass, because the\n        // dependencies might depend on one another, so if we need to replace one of them, we need to compute it first\n        for (var _iterator11 = seedPatterns, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) {\n          var _ref20;\n\n          if (_isArray11) {\n            if (_i11 >= _iterator11.length) break;\n            _ref20 = _iterator11[_i11++];\n          } else {\n            _i11 = _iterator11.next();\n            if (_i11.done) break;\n            _ref20 = _i11.value;\n          }\n\n          const pattern = _ref20;\n\n          const entry = getResolverEntry(pattern);\n\n          if (!entry) {\n            continue;\n          }\n\n          const pkg = entry.pkg,\n                ref = entry.ref;\n          let loc = entry.loc;\n\n\n          const packageName = pkg.name;\n          let packageReference = pkg.version;\n\n          // If we have peer dependencies, then we generate a new virtual reference based on the parent one\n          // We cannot generate this reference based on what those peer references resolve to, because they might not have\n          // been computed yet (for example, consider the case where A has a peer dependency on B, and B a peer dependency\n          // on A; it's valid, but it prevents us from computing A and B - and it's even worse with 3+ packages involved)\n          const peerDependencies = new Set(Array.from(Object.keys(pkg.peerDependencies || {})));\n\n          // As an optimization, we only setup virtual packages if their underlying packages are referenced multiple times\n          // in the tree. This allow us to avoid having to create symlinks in the majority of cases\n          if (peerDependencies.size > 0 && ref.requests.length > 1) {\n            const hash = getHashFrom([...parentData, packageName, packageReference]);\n\n            let symlinkSource;\n            let symlinkFile;\n\n            switch (ref.remote.type) {\n              case 'workspace':\n                {\n                  symlinkSource = loc;\n                  symlinkFile = path.resolve(config.lockfileFolder, '.pnp', 'workspaces', `pnp-${hash}`, packageName);\n\n                  loc = symlinkFile;\n                }\n                break;\n\n              default:\n                {\n                  const isFromCache = getCachePath(loc);\n\n                  const hashName = isFromCache && offlineCacheFolder ? `pnp-${hash}${OFFLINE_CACHE_EXTENSION}` : `pnp-${hash}`;\n                  const newLoc = path.resolve(config.lockfileFolder, '.pnp', 'externals', hashName, 'node_modules', packageName);\n\n                  // The `node_modules/<pkgName>` part is already there when the package comes from the cache\n                  if (isFromCache) {\n                    const getBase = function getBase(source) {\n                      return path.resolve(source, '../'.repeat(1 + packageName.split('/').length));\n                    };\n                    symlinkSource = resolveOfflineCacheFolder(getBase(loc));\n                    symlinkFile = getBase(newLoc);\n                  } else {\n                    symlinkSource = loc;\n                    symlinkFile = newLoc;\n                  }\n\n                  loc = newLoc;\n                }\n                break;\n            }\n\n            yield (_fs || _load_fs()).mkdirp(path.dirname(symlinkFile));\n            yield (_fs || _load_fs()).symlink(symlinkSource, symlinkFile);\n\n            packageReference = `pnp:${hash}`;\n\n            // We blacklist this path so that we can print a nicer error message if someone tries to require it (it usually\n            // means that they're using realpath on the return value of require.resolve)\n            blacklistedLocations.add(normalizeDirectoryPath(loc));\n          }\n\n          // Now that we have the final reference, we need to store it\n          resolutions.set(packageName, packageReference);\n          locations.set(packageName, loc);\n        }\n\n        // Now that we have the final references, we can start the main loop, which will insert the packages into the store\n        // if they aren't already there, and recurse over their own children\n        for (var _iterator12 = seedPatterns, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) {\n          var _ref21;\n\n          if (_isArray12) {\n            if (_i12 >= _iterator12.length) break;\n            _ref21 = _iterator12[_i12++];\n          } else {\n            _i12 = _iterator12.next();\n            if (_i12.done) break;\n            _ref21 = _i12.value;\n          }\n\n          const pattern = _ref21;\n\n          const entry = getResolverEntry(pattern);\n\n          if (!entry) {\n            continue;\n          }\n\n          const pkg = entry.pkg,\n                ref = entry.ref;\n\n\n          const packageName = pkg.name;\n\n          const packageReference = resolutions.get(packageName);\n          invariant(packageReference, `Package reference should have been computed during the pre-pass`);\n\n          const loc = locations.get(packageName);\n          invariant(loc, `Package location should have been computed during the pre-pass`);\n\n          // We can early exit if the package is already registered with the exact same name and reference, since even if\n          // we might get slightly different dependencies (depending on how things were optimized), both sets are valid\n          let packageInformationStore = packageInformationStores.get(packageName);\n\n          if (!packageInformationStore) {\n            packageInformationStore = new Map();\n            packageInformationStores.set(packageName, packageInformationStore);\n          }\n\n          let packageInformation = packageInformationStore.get(packageReference);\n\n          if (packageInformation) {\n            continue;\n          }\n\n          packageInformation = {\n            packageLocation: normalizeDirectoryPath(loc),\n            packageDependencies: new Map()\n          };\n\n          // Split the dependencies between direct/peer - we will only recurse on the former\n          const peerDependencies = new Set(Array.from(Object.keys(pkg.peerDependencies || {})));\n          const directDependencies = ref.dependencies.filter(function (pattern) {\n            const pkg = resolver.getStrictResolvedPattern(pattern);\n            return !pkg || !peerDependencies.has(pkg.name);\n          });\n\n          // We inject the partial information in the store right now so that we won't cycle indefinitely\n          packageInformationStore.set(packageReference, packageInformation);\n\n          // We must inject the peer dependencies before iterating; one of our dependencies might have a peer dependency\n          // on one of our peer dependencies, so it must be available from the start (we don't have to do that for direct\n          // dependencies, because the \"visit\" function that will iterate over them will automatically add the to the\n          // candidate resolutions as part of the first step, cf above)\n\n          for (var _iterator13 = peerDependencies, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) {\n            var _ref22;\n\n            if (_isArray13) {\n              if (_i13 >= _iterator13.length) break;\n              _ref22 = _iterator13[_i13++];\n            } else {\n              _i13 = _iterator13.next();\n              if (_i13.done) break;\n              _ref22 = _i13.value;\n            }\n\n            const dependencyName = _ref22;\n\n            const dependencyReference = resolutions.get(dependencyName);\n\n            if (dependencyReference) {\n              packageInformation.packageDependencies.set(dependencyName, dependencyReference);\n            }\n          }\n\n          const childResolutions = yield visit(packageInformation.packageDependencies, directDependencies, [packageName, packageReference]);\n\n          // We can now inject into our package the resolutions we got from the visit function\n          for (var _iterator14 = childResolutions.entries(), _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) {\n            var _ref24;\n\n            if (_isArray14) {\n              if (_i14 >= _iterator14.length) break;\n              _ref24 = _iterator14[_i14++];\n            } else {\n              _i14 = _iterator14.next();\n              if (_i14.done) break;\n              _ref24 = _i14.value;\n            }\n\n            const _ref23 = _ref24;\n            const name = _ref23[0];\n            const reference = _ref23[1];\n\n            packageInformation.packageDependencies.set(name, reference);\n          }\n\n          // Finally, unless a package depends on a previous version of itself (that would be weird but correct...), we\n          // inject them an implicit dependency to themselves (so that they can require themselves)\n          if (!packageInformation.packageDependencies.has(packageName)) {\n            packageInformation.packageDependencies.set(packageName, packageReference);\n          }\n        }\n\n        return resolutions;\n      });\n\n      return function visit(_x4, _x5) {\n        return _ref19.apply(this, arguments);\n      };\n    })();\n\n    // If we have workspaces, we need to iterate over them all in order to add them to the map\n    // This is because they might not be declared as dependencies of the top-level project (and with reason, since the\n    // top-level package might depend on a different than the one provided in the workspaces - cf Babel, which depends\n    // on an old version of itself in order to compile itself)\n    if (workspaceLayout) {\n      for (var _iterator15 = Object.keys(workspaceLayout.workspaces), _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) {\n        var _ref25;\n\n        if (_isArray15) {\n          if (_i15 >= _iterator15.length) break;\n          _ref25 = _iterator15[_i15++];\n        } else {\n          _i15 = _iterator15.next();\n          if (_i15.done) break;\n          _ref25 = _i15.value;\n        }\n\n        const name = _ref25;\n\n        const pkg = workspaceLayout.workspaces[name].manifest;\n\n        // Skip the aggregator, since it's essentially a duplicate of the top-level package that we'll iterate later on\n        if (pkg.workspaces) {\n          continue;\n        }\n\n        const ref = pkg._reference;\n        invariant(ref, `Workspaces should have a reference`);\n\n        invariant(ref.locations.length === 1, `Workspaces should have exactly one location`);\n        const loc = ref.locations[0];\n        invariant(loc, `Workspaces should have a location`);\n\n        let packageInformationStore = packageInformationStores.get(name);\n\n        if (!packageInformationStore) {\n          packageInformationStore = new Map();\n          packageInformationStores.set(name, packageInformationStore);\n        }\n\n        packageInformationStore.set(pkg.version, {\n          packageLocation: normalizeDirectoryPath(loc),\n          packageDependencies: yield visit(new Map(), ref.dependencies, [name, pkg.version])\n        });\n      }\n    }\n\n    // Register the top-level package in our map\n    // This will recurse on each of its dependencies as well.\n    packageInformationStores.set(null, new Map([[null, {\n      packageLocation: normalizeDirectoryPath(config.lockfileFolder),\n      packageDependencies: yield visit(new Map(), seedPatterns)\n    }]]));\n\n    return [packageInformationStores, blacklistedLocations];\n  });\n\n  return function getPackageInformationStores(_x, _x2, _x3) {\n    return _ref17.apply(this, arguments);\n  };\n})();\n\nlet generatePnpMap = exports.generatePnpMap = (() => {\n  var _ref26 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, seedPatterns, { resolver, reporter, workspaceLayout, targetPath }) {\n    var _ref27 = yield getPackageInformationStores(config, seedPatterns, {\n      resolver,\n      reporter,\n      targetPath,\n      workspaceLayout\n    });\n\n    const packageInformationStores = _ref27[0],\n          blacklistedLocations = _ref27[1];\n\n\n    const setupStaticTables = [generateMaps(packageInformationStores, blacklistedLocations), generateFindPackageLocator(packageInformationStores)].join(``);\n\n    return pnpApi.replace(/\\$\\$SHEBANG/g, config.plugnplayShebang).replace(/\\$\\$BLACKLIST/g, JSON.stringify(config.plugnplayBlacklist)).replace(/\\$\\$SETUP_STATIC_TABLES\\(\\);/g, setupStaticTables);\n  });\n\n  return function generatePnpMap(_x6, _x7, _x8) {\n    return _ref26.apply(this, arguments);\n  };\n})();\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* babel-plugin-inline-import './generate-pnp-map-api.tpl.js' */const pnpApi = '#!$$SHEBANG\\n\\n/* eslint-disable max-len, flowtype/require-valid-file-annotation, flowtype/require-return-type */\\n/* global packageInformationStores, $$BLACKLIST, $$SETUP_STATIC_TABLES */\\n\\n// Used for the resolveUnqualified part of the resolution (ie resolving folder/index.js & file extensions)\\n// Deconstructed so that they aren\\'t affected by any fs monkeypatching occuring later during the execution\\nconst {statSync, lstatSync, readlinkSync, readFileSync, existsSync, realpathSync} = require(\\'fs\\');\\n\\nconst Module = require(\\'module\\');\\nconst path = require(\\'path\\');\\nconst StringDecoder = require(\\'string_decoder\\');\\n\\nconst ignorePattern = $$BLACKLIST ? new RegExp($$BLACKLIST) : null;\\n\\nconst pnpFile = path.resolve(__dirname, __filename);\\nconst builtinModules = new Set(Module.builtinModules || Object.keys(process.binding(\\'natives\\')));\\n\\nconst topLevelLocator = {name: null, reference: null};\\nconst blacklistedLocator = {name: NaN, reference: NaN};\\n\\n// Used for compatibility purposes - cf setupCompatibilityLayer\\nconst patchedModules = [];\\nconst fallbackLocators = [topLevelLocator];\\n\\n// Matches backslashes of Windows paths\\nconst backwardSlashRegExp = /\\\\\\\\/g;\\n\\n// Matches if the path must point to a directory (ie ends with /)\\nconst isDirRegExp = /\\\\/$/;\\n\\n// Matches if the path starts with a valid path qualifier (./, ../, /)\\n// eslint-disable-next-line no-unused-vars\\nconst isStrictRegExp = /^\\\\.{0,2}\\\\//;\\n\\n// Splits a require request into its components, or return null if the request is a file path\\nconst pathRegExp = /^(?![a-zA-Z]:[\\\\\\\\\\\\/]|\\\\\\\\\\\\\\\\|\\\\.{0,2}(?:\\\\/|$))((?:@[^\\\\/]+\\\\/)?[^\\\\/]+)\\\\/?(.*|)$/;\\n\\n// Keep a reference around (\"module\" is a common name in this context, so better rename it to something more significant)\\nconst pnpModule = module;\\n\\n/**\\n * Used to disable the resolution hooks (for when we want to fallback to the previous resolution - we then need\\n * a way to \"reset\" the environment temporarily)\\n */\\n\\nlet enableNativeHooks = true;\\n\\n/**\\n * Simple helper function that assign an error code to an error, so that it can more easily be caught and used\\n * by third-parties.\\n */\\n\\nfunction makeError(code, message, data = {}) {\\n  const error = new Error(message);\\n  return Object.assign(error, {code, data});\\n}\\n\\n/**\\n * Ensures that the returned locator isn\\'t a blacklisted one.\\n *\\n * Blacklisted packages are packages that cannot be used because their dependencies cannot be deduced. This only\\n * happens with peer dependencies, which effectively have different sets of dependencies depending on their parents.\\n *\\n * In order to deambiguate those different sets of dependencies, the Yarn implementation of PnP will generate a\\n * symlink for each combination of <package name>/<package version>/<dependent package> it will find, and will\\n * blacklist the target of those symlinks. By doing this, we ensure that files loaded through a specific path\\n * will always have the same set of dependencies, provided the symlinks are correctly preserved.\\n *\\n * Unfortunately, some tools do not preserve them, and when it happens PnP isn\\'t able anymore to deduce the set of\\n * dependencies based on the path of the file that makes the require calls. But since we\\'ve blacklisted those paths,\\n * we\\'re able to print a more helpful error message that points out that a third-party package is doing something\\n * incompatible!\\n */\\n\\n// eslint-disable-next-line no-unused-vars\\nfunction blacklistCheck(locator) {\\n  if (locator === blacklistedLocator) {\\n    throw makeError(\\n      `BLACKLISTED`,\\n      [\\n        `A package has been resolved through a blacklisted path - this is usually caused by one of your tools calling`,\\n        `\"realpath\" on the return value of \"require.resolve\". Since the returned values use symlinks to disambiguate`,\\n        `peer dependencies, they must be passed untransformed to \"require\".`,\\n      ].join(` `)\\n    );\\n  }\\n\\n  return locator;\\n}\\n\\n$$SETUP_STATIC_TABLES();\\n\\n/**\\n * Returns the module that should be used to resolve require calls. It\\'s usually the direct parent, except if we\\'re\\n * inside an eval expression.\\n */\\n\\nfunction getIssuerModule(parent) {\\n  let issuer = parent;\\n\\n  while (issuer && (issuer.id === \\'[eval]\\' || issuer.id === \\'<repl>\\' || !issuer.filename)) {\\n    issuer = issuer.parent;\\n  }\\n\\n  return issuer;\\n}\\n\\n/**\\n * Returns information about a package in a safe way (will throw if they cannot be retrieved)\\n */\\n\\nfunction getPackageInformationSafe(packageLocator) {\\n  const packageInformation = exports.getPackageInformation(packageLocator);\\n\\n  if (!packageInformation) {\\n    throw makeError(\\n      `INTERNAL`,\\n      `Couldn\\'t find a matching entry in the dependency tree for the specified parent (this is probably an internal error)`\\n    );\\n  }\\n\\n  return packageInformation;\\n}\\n\\n/**\\n * Implements the node resolution for folder access and extension selection\\n */\\n\\nfunction applyNodeExtensionResolution(unqualifiedPath, {extensions}) {\\n  // We use this \"infinite while\" so that we can restart the process as long as we hit package folders\\n  while (true) {\\n    let stat;\\n\\n    try {\\n      stat = statSync(unqualifiedPath);\\n    } catch (error) {}\\n\\n    // If the file exists and is a file, we can stop right there\\n\\n    if (stat && !stat.isDirectory()) {\\n      // If the very last component of the resolved path is a symlink to a file, we then resolve it to a file. We only\\n      // do this first the last component, and not the rest of the path! This allows us to support the case of bin\\n      // symlinks, where a symlink in \"/xyz/pkg-name/.bin/bin-name\" will point somewhere else (like \"/xyz/pkg-name/index.js\").\\n      // In such a case, we want relative requires to be resolved relative to \"/xyz/pkg-name/\" rather than \"/xyz/pkg-name/.bin/\".\\n      //\\n      // Also note that the reason we must use readlink on the last component (instead of realpath on the whole path)\\n      // is that we must preserve the other symlinks, in particular those used by pnp to deambiguate packages using\\n      // peer dependencies. For example, \"/xyz/.pnp/local/pnp-01234569/.bin/bin-name\" should see its relative requires\\n      // be resolved relative to \"/xyz/.pnp/local/pnp-0123456789/\" rather than \"/xyz/pkg-with-peers/\", because otherwise\\n      // we would lose the information that would tell us what are the dependencies of pkg-with-peers relative to its\\n      // ancestors.\\n\\n      if (lstatSync(unqualifiedPath).isSymbolicLink()) {\\n        unqualifiedPath = path.normalize(path.resolve(path.dirname(unqualifiedPath), readlinkSync(unqualifiedPath)));\\n      }\\n\\n      return unqualifiedPath;\\n    }\\n\\n    // If the file is a directory, we must check if it contains a package.json with a \"main\" entry\\n\\n    if (stat && stat.isDirectory()) {\\n      let pkgJson;\\n\\n      try {\\n        pkgJson = JSON.parse(readFileSync(`${unqualifiedPath}/package.json`, \\'utf-8\\'));\\n      } catch (error) {}\\n\\n      let nextUnqualifiedPath;\\n\\n      if (pkgJson && pkgJson.main) {\\n        nextUnqualifiedPath = path.resolve(unqualifiedPath, pkgJson.main);\\n      }\\n\\n      // If the \"main\" field changed the path, we start again from this new location\\n\\n      if (nextUnqualifiedPath && nextUnqualifiedPath !== unqualifiedPath) {\\n        const resolution = applyNodeExtensionResolution(nextUnqualifiedPath, {extensions});\\n\\n        if (resolution !== null) {\\n          return resolution;\\n        }\\n      }\\n    }\\n\\n    // Otherwise we check if we find a file that match one of the supported extensions\\n\\n    const qualifiedPath = extensions\\n      .map(extension => {\\n        return `${unqualifiedPath}${extension}`;\\n      })\\n      .find(candidateFile => {\\n        return existsSync(candidateFile);\\n      });\\n\\n    if (qualifiedPath) {\\n      return qualifiedPath;\\n    }\\n\\n    // Otherwise, we check if the path is a folder - in such a case, we try to use its index\\n\\n    if (stat && stat.isDirectory()) {\\n      const indexPath = extensions\\n        .map(extension => {\\n          return `${unqualifiedPath}/index${extension}`;\\n        })\\n        .find(candidateFile => {\\n          return existsSync(candidateFile);\\n        });\\n\\n      if (indexPath) {\\n        return indexPath;\\n      }\\n    }\\n\\n    // Otherwise there\\'s nothing else we can do :(\\n\\n    return null;\\n  }\\n}\\n\\n/**\\n * This function creates fake modules that can be used with the _resolveFilename function.\\n * Ideally it would be nice to be able to avoid this, since it causes useless allocations\\n * and cannot be cached efficiently (we recompute the nodeModulePaths every time).\\n *\\n * Fortunately, this should only affect the fallback, and there hopefully shouldn\\'t be a\\n * lot of them.\\n */\\n\\nfunction makeFakeModule(path) {\\n  const fakeModule = new Module(path, false);\\n  fakeModule.filename = path;\\n  fakeModule.paths = Module._nodeModulePaths(path);\\n  return fakeModule;\\n}\\n\\n/**\\n * Normalize path to posix format.\\n */\\n\\nfunction normalizePath(fsPath) {\\n  fsPath = path.normalize(fsPath);\\n\\n  if (process.platform === \\'win32\\') {\\n    fsPath = fsPath.replace(backwardSlashRegExp, \\'/\\');\\n  }\\n\\n  return fsPath;\\n}\\n\\n/**\\n * Forward the resolution to the next resolver (usually the native one)\\n */\\n\\nfunction callNativeResolution(request, issuer) {\\n  if (issuer.endsWith(\\'/\\')) {\\n    issuer += \\'internal.js\\';\\n  }\\n\\n  try {\\n    enableNativeHooks = false;\\n\\n    // Since we would need to create a fake module anyway (to call _resolveLookupPath that\\n    // would give us the paths to give to _resolveFilename), we can as well not use\\n    // the {paths} option at all, since it internally makes _resolveFilename create another\\n    // fake module anyway.\\n    return Module._resolveFilename(request, makeFakeModule(issuer), false);\\n  } finally {\\n    enableNativeHooks = true;\\n  }\\n}\\n\\n/**\\n * This key indicates which version of the standard is implemented by this resolver. The `std` key is the\\n * Plug\\'n\\'Play standard, and any other key are third-party extensions. Third-party extensions are not allowed\\n * to override the standard, and can only offer new methods.\\n *\\n * If an new version of the Plug\\'n\\'Play standard is released and some extensions conflict with newly added\\n * functions, they\\'ll just have to fix the conflicts and bump their own version number.\\n */\\n\\nexports.VERSIONS = {std: 1};\\n\\n/**\\n * Useful when used together with getPackageInformation to fetch information about the top-level package.\\n */\\n\\nexports.topLevel = {name: null, reference: null};\\n\\n/**\\n * Gets the package information for a given locator. Returns null if they cannot be retrieved.\\n */\\n\\nexports.getPackageInformation = function getPackageInformation({name, reference}) {\\n  const packageInformationStore = packageInformationStores.get(name);\\n\\n  if (!packageInformationStore) {\\n    return null;\\n  }\\n\\n  const packageInformation = packageInformationStore.get(reference);\\n\\n  if (!packageInformation) {\\n    return null;\\n  }\\n\\n  return packageInformation;\\n};\\n\\n/**\\n * Transforms a request (what\\'s typically passed as argument to the require function) into an unqualified path.\\n * This path is called \"unqualified\" because it only changes the package name to the package location on the disk,\\n * which means that the end result still cannot be directly accessed (for example, it doesn\\'t try to resolve the\\n * file extension, or to resolve directories to their \"index.js\" content). Use the \"resolveUnqualified\" function\\n * to convert them to fully-qualified paths, or just use \"resolveRequest\" that do both operations in one go.\\n *\\n * Note that it is extremely important that the `issuer` path ends with a forward slash if the issuer is to be\\n * treated as a folder (ie. \"/tmp/foo/\" rather than \"/tmp/foo\" if \"foo\" is a directory). Otherwise relative\\n * imports won\\'t be computed correctly (they\\'ll get resolved relative to \"/tmp/\" instead of \"/tmp/foo/\").\\n */\\n\\nexports.resolveToUnqualified = function resolveToUnqualified(request, issuer, {considerBuiltins = true} = {}) {\\n  // The \\'pnpapi\\' request is reserved and will always return the path to the PnP file, from everywhere\\n\\n  if (request === `pnpapi`) {\\n    return pnpFile;\\n  }\\n\\n  // Bailout if the request is a native module\\n\\n  if (considerBuiltins && builtinModules.has(request)) {\\n    return null;\\n  }\\n\\n  // We allow disabling the pnp resolution for some subpaths. This is because some projects, often legacy,\\n  // contain multiple levels of dependencies (ie. a yarn.lock inside a subfolder of a yarn.lock). This is\\n  // typically solved using workspaces, but not all of them have been converted already.\\n\\n  if (ignorePattern && ignorePattern.test(normalizePath(issuer))) {\\n    const result = callNativeResolution(request, issuer);\\n\\n    if (result === false) {\\n      throw makeError(\\n        `BUILTIN_NODE_RESOLUTION_FAIL`,\\n        `The builtin node resolution algorithm was unable to resolve the module referenced by \"${request}\" and requested from \"${issuer}\" (it didn\\'t go through the pnp resolver because the issuer was explicitely ignored by the regexp \"$$BLACKLIST\")`,\\n        {\\n          request,\\n          issuer,\\n        }\\n      );\\n    }\\n\\n    return result;\\n  }\\n\\n  let unqualifiedPath;\\n\\n  // If the request is a relative or absolute path, we just return it normalized\\n\\n  const dependencyNameMatch = request.match(pathRegExp);\\n\\n  if (!dependencyNameMatch) {\\n    if (path.isAbsolute(request)) {\\n      unqualifiedPath = path.normalize(request);\\n    } else if (issuer.match(isDirRegExp)) {\\n      unqualifiedPath = path.normalize(path.resolve(issuer, request));\\n    } else {\\n      unqualifiedPath = path.normalize(path.resolve(path.dirname(issuer), request));\\n    }\\n  }\\n\\n  // Things are more hairy if it\\'s a package require - we then need to figure out which package is needed, and in\\n  // particular the exact version for the given location on the dependency tree\\n\\n  if (dependencyNameMatch) {\\n    const [, dependencyName, subPath] = dependencyNameMatch;\\n\\n    const issuerLocator = exports.findPackageLocator(issuer);\\n\\n    // If the issuer file doesn\\'t seem to be owned by a package managed through pnp, then we resort to using the next\\n    // resolution algorithm in the chain, usually the native Node resolution one\\n\\n    if (!issuerLocator) {\\n      const result = callNativeResolution(request, issuer);\\n\\n      if (result === false) {\\n        throw makeError(\\n          `BUILTIN_NODE_RESOLUTION_FAIL`,\\n          `The builtin node resolution algorithm was unable to resolve the module referenced by \"${request}\" and requested from \"${issuer}\" (it didn\\'t go through the pnp resolver because the issuer doesn\\'t seem to be part of the Yarn-managed dependency tree)`,\\n          {\\n            request,\\n            issuer,\\n          }\\n        );\\n      }\\n\\n      return result;\\n    }\\n\\n    const issuerInformation = getPackageInformationSafe(issuerLocator);\\n\\n    // We obtain the dependency reference in regard to the package that request it\\n\\n    let dependencyReference = issuerInformation.packageDependencies.get(dependencyName);\\n\\n    // If we can\\'t find it, we check if we can potentially load it from the packages that have been defined as potential fallbacks.\\n    // It\\'s a bit of a hack, but it improves compatibility with the existing Node ecosystem. Hopefully we should eventually be able\\n    // to kill this logic and become stricter once pnp gets enough traction and the affected packages fix themselves.\\n\\n    if (issuerLocator !== topLevelLocator) {\\n      for (let t = 0, T = fallbackLocators.length; dependencyReference === undefined && t < T; ++t) {\\n        const fallbackInformation = getPackageInformationSafe(fallbackLocators[t]);\\n        dependencyReference = fallbackInformation.packageDependencies.get(dependencyName);\\n      }\\n    }\\n\\n    // If we can\\'t find the path, and if the package making the request is the top-level, we can offer nicer error messages\\n\\n    if (!dependencyReference) {\\n      if (dependencyReference === null) {\\n        if (issuerLocator === topLevelLocator) {\\n          throw makeError(\\n            `MISSING_PEER_DEPENDENCY`,\\n            `You seem to be requiring a peer dependency (\"${dependencyName}\"), but it is not installed (which might be because you\\'re the top-level package)`,\\n            {request, issuer, dependencyName}\\n          );\\n        } else {\\n          throw makeError(\\n            `MISSING_PEER_DEPENDENCY`,\\n            `Package \"${issuerLocator.name}@${issuerLocator.reference}\" is trying to access a peer dependency (\"${dependencyName}\") that should be provided by its direct ancestor but isn\\'t`,\\n            {request, issuer, issuerLocator: Object.assign({}, issuerLocator), dependencyName}\\n          );\\n        }\\n      } else {\\n        if (issuerLocator === topLevelLocator) {\\n          throw makeError(\\n            `UNDECLARED_DEPENDENCY`,\\n            `You cannot require a package (\"${dependencyName}\") that is not declared in your dependencies (via \"${issuer}\")`,\\n            {request, issuer, dependencyName}\\n          );\\n        } else {\\n          const candidates = Array.from(issuerInformation.packageDependencies.keys());\\n          throw makeError(\\n            `UNDECLARED_DEPENDENCY`,\\n            `Package \"${issuerLocator.name}@${issuerLocator.reference}\" (via \"${issuer}\") is trying to require the package \"${dependencyName}\" (via \"${request}\") without it being listed in its dependencies (${candidates.join(\\n              `, `\\n            )})`,\\n            {request, issuer, issuerLocator: Object.assign({}, issuerLocator), dependencyName, candidates}\\n          );\\n        }\\n      }\\n    }\\n\\n    // We need to check that the package exists on the filesystem, because it might not have been installed\\n\\n    const dependencyLocator = {name: dependencyName, reference: dependencyReference};\\n    const dependencyInformation = exports.getPackageInformation(dependencyLocator);\\n    const dependencyLocation = path.resolve(__dirname, dependencyInformation.packageLocation);\\n\\n    if (!dependencyLocation) {\\n      throw makeError(\\n        `MISSING_DEPENDENCY`,\\n        `Package \"${dependencyLocator.name}@${dependencyLocator.reference}\" is a valid dependency, but hasn\\'t been installed and thus cannot be required (it might be caused if you install a partial tree, such as on production environments)`,\\n        {request, issuer, dependencyLocator: Object.assign({}, dependencyLocator)}\\n      );\\n    }\\n\\n    // Now that we know which package we should resolve to, we only have to find out the file location\\n\\n    if (subPath) {\\n      unqualifiedPath = path.resolve(dependencyLocation, subPath);\\n    } else {\\n      unqualifiedPath = dependencyLocation;\\n    }\\n  }\\n\\n  return path.normalize(unqualifiedPath);\\n};\\n\\n/**\\n * Transforms an unqualified path into a qualified path by using the Node resolution algorithm (which automatically\\n * appends \".js\" / \".json\", and transforms directory accesses into \"index.js\").\\n */\\n\\nexports.resolveUnqualified = function resolveUnqualified(\\n  unqualifiedPath,\\n  {extensions = Object.keys(Module._extensions)} = {}\\n) {\\n  const qualifiedPath = applyNodeExtensionResolution(unqualifiedPath, {extensions});\\n\\n  if (qualifiedPath) {\\n    return path.normalize(qualifiedPath);\\n  } else {\\n    throw makeError(\\n      `QUALIFIED_PATH_RESOLUTION_FAILED`,\\n      `Couldn\\'t find a suitable Node resolution for unqualified path \"${unqualifiedPath}\"`,\\n      {unqualifiedPath}\\n    );\\n  }\\n};\\n\\n/**\\n * Transforms a request into a fully qualified path.\\n *\\n * Note that it is extremely important that the `issuer` path ends with a forward slash if the issuer is to be\\n * treated as a folder (ie. \"/tmp/foo/\" rather than \"/tmp/foo\" if \"foo\" is a directory). Otherwise relative\\n * imports won\\'t be computed correctly (they\\'ll get resolved relative to \"/tmp/\" instead of \"/tmp/foo/\").\\n */\\n\\nexports.resolveRequest = function resolveRequest(request, issuer, {considerBuiltins, extensions} = {}) {\\n  let unqualifiedPath;\\n\\n  try {\\n    unqualifiedPath = exports.resolveToUnqualified(request, issuer, {considerBuiltins});\\n  } catch (originalError) {\\n    // If we get a BUILTIN_NODE_RESOLUTION_FAIL error there, it means that we\\'ve had to use the builtin node\\n    // resolution, which usually shouldn\\'t happen. It might be because the user is trying to require something\\n    // from a path loaded through a symlink (which is not possible, because we need something normalized to\\n    // figure out which package is making the require call), so we try to make the same request using a fully\\n    // resolved issuer and throws a better and more actionable error if it works.\\n    if (originalError.code === `BUILTIN_NODE_RESOLUTION_FAIL`) {\\n      let realIssuer;\\n\\n      try {\\n        realIssuer = realpathSync(issuer);\\n      } catch (error) {}\\n\\n      if (realIssuer) {\\n        if (issuer.endsWith(`/`)) {\\n          realIssuer = realIssuer.replace(/\\\\/?$/, `/`);\\n        }\\n\\n        try {\\n          exports.resolveToUnqualified(request, realIssuer, {considerBuiltins});\\n        } catch (error) {\\n          // If an error was thrown, the problem doesn\\'t seem to come from a path not being normalized, so we\\n          // can just throw the original error which was legit.\\n          throw originalError;\\n        }\\n\\n        // If we reach this stage, it means that resolveToUnqualified didn\\'t fail when using the fully resolved\\n        // file path, which is very likely caused by a module being invoked through Node with a path not being\\n        // correctly normalized (ie you should use \"node $(realpath script.js)\" instead of \"node script.js\").\\n        throw makeError(\\n          `SYMLINKED_PATH_DETECTED`,\\n          `A pnp module (\"${request}\") has been required from what seems to be a symlinked path (\"${issuer}\"). This is not possible, you must ensure that your modules are invoked through their fully resolved path on the filesystem (in this case \"${realIssuer}\").`,\\n          {\\n            request,\\n            issuer,\\n            realIssuer,\\n          }\\n        );\\n      }\\n    }\\n    throw originalError;\\n  }\\n\\n  if (unqualifiedPath === null) {\\n    return null;\\n  }\\n\\n  try {\\n    return exports.resolveUnqualified(unqualifiedPath, {extensions});\\n  } catch (resolutionError) {\\n    if (resolutionError.code === \\'QUALIFIED_PATH_RESOLUTION_FAILED\\') {\\n      Object.assign(resolutionError.data, {request, issuer});\\n    }\\n    throw resolutionError;\\n  }\\n};\\n\\n/**\\n * Setups the hook into the Node environment.\\n *\\n * From this point on, any call to `require()` will go through the \"resolveRequest\" function, and the result will\\n * be used as path of the file to load.\\n */\\n\\nexports.setup = function setup() {\\n  // A small note: we don\\'t replace the cache here (and instead use the native one). This is an effort to not\\n  // break code similar to \"delete require.cache[require.resolve(FOO)]\", where FOO is a package located outside\\n  // of the Yarn dependency tree. In this case, we defer the load to the native loader. If we were to replace the\\n  // cache by our own, the native loader would populate its own cache, which wouldn\\'t be exposed anymore, so the\\n  // delete call would be broken.\\n\\n  const originalModuleLoad = Module._load;\\n\\n  Module._load = function(request, parent, isMain) {\\n    if (!enableNativeHooks) {\\n      return originalModuleLoad.call(Module, request, parent, isMain);\\n    }\\n\\n    // Builtins are managed by the regular Node loader\\n\\n    if (builtinModules.has(request)) {\\n      try {\\n        enableNativeHooks = false;\\n        return originalModuleLoad.call(Module, request, parent, isMain);\\n      } finally {\\n        enableNativeHooks = true;\\n      }\\n    }\\n\\n    // The \\'pnpapi\\' name is reserved to return the PnP api currently in use by the program\\n\\n    if (request === `pnpapi`) {\\n      return pnpModule.exports;\\n    }\\n\\n    // Request `Module._resolveFilename` (ie. `resolveRequest`) to tell us which file we should load\\n\\n    const modulePath = Module._resolveFilename(request, parent, isMain);\\n\\n    // Check if the module has already been created for the given file\\n\\n    const cacheEntry = Module._cache[modulePath];\\n\\n    if (cacheEntry) {\\n      return cacheEntry.exports;\\n    }\\n\\n    // Create a new module and store it into the cache\\n\\n    const module = new Module(modulePath, parent);\\n    Module._cache[modulePath] = module;\\n\\n    // The main module is exposed as global variable\\n\\n    if (isMain) {\\n      process.mainModule = module;\\n      module.id = \\'.\\';\\n    }\\n\\n    // Try to load the module, and remove it from the cache if it fails\\n\\n    let hasThrown = true;\\n\\n    try {\\n      module.load(modulePath);\\n      hasThrown = false;\\n    } finally {\\n      if (hasThrown) {\\n        delete Module._cache[modulePath];\\n      }\\n    }\\n\\n    // Some modules might have to be patched for compatibility purposes\\n\\n    for (const [filter, patchFn] of patchedModules) {\\n      if (filter.test(request)) {\\n        module.exports = patchFn(exports.findPackageLocator(parent.filename), module.exports);\\n      }\\n    }\\n\\n    return module.exports;\\n  };\\n\\n  const originalModuleResolveFilename = Module._resolveFilename;\\n\\n  Module._resolveFilename = function(request, parent, isMain, options) {\\n    if (!enableNativeHooks) {\\n      return originalModuleResolveFilename.call(Module, request, parent, isMain, options);\\n    }\\n\\n    let issuers;\\n\\n    if (options) {\\n      const optionNames = new Set(Object.keys(options));\\n      optionNames.delete(\\'paths\\');\\n\\n      if (optionNames.size > 0) {\\n        throw makeError(\\n          `UNSUPPORTED`,\\n          `Some options passed to require() aren\\'t supported by PnP yet (${Array.from(optionNames).join(\\', \\')})`\\n        );\\n      }\\n\\n      if (options.paths) {\\n        issuers = options.paths.map(entry => `${path.normalize(entry)}/`);\\n      }\\n    }\\n\\n    if (!issuers) {\\n      const issuerModule = getIssuerModule(parent);\\n      const issuer = issuerModule ? issuerModule.filename : `${process.cwd()}/`;\\n\\n      issuers = [issuer];\\n    }\\n\\n    let firstError;\\n\\n    for (const issuer of issuers) {\\n      let resolution;\\n\\n      try {\\n        resolution = exports.resolveRequest(request, issuer);\\n      } catch (error) {\\n        firstError = firstError || error;\\n        continue;\\n      }\\n\\n      return resolution !== null ? resolution : request;\\n    }\\n\\n    throw firstError;\\n  };\\n\\n  const originalFindPath = Module._findPath;\\n\\n  Module._findPath = function(request, paths, isMain) {\\n    if (!enableNativeHooks) {\\n      return originalFindPath.call(Module, request, paths, isMain);\\n    }\\n\\n    for (const path of paths || []) {\\n      let resolution;\\n\\n      try {\\n        resolution = exports.resolveRequest(request, path);\\n      } catch (error) {\\n        continue;\\n      }\\n\\n      if (resolution) {\\n        return resolution;\\n      }\\n    }\\n\\n    return false;\\n  };\\n\\n  process.versions.pnp = String(exports.VERSIONS.std);\\n};\\n\\nexports.setupCompatibilityLayer = () => {\\n  // ESLint currently doesn\\'t have any portable way for shared configs to specify their own\\n  // plugins that should be used (https://github.com/eslint/eslint/issues/10125). This will\\n  // likely get fixed at some point, but it\\'ll take time and in the meantime we\\'ll just add\\n  // additional fallback entries for common shared configs.\\n\\n  for (const name of [`react-scripts`]) {\\n    const packageInformationStore = packageInformationStores.get(name);\\n    if (packageInformationStore) {\\n      for (const reference of packageInformationStore.keys()) {\\n        fallbackLocators.push({name, reference});\\n      }\\n    }\\n  }\\n\\n  // Modern versions of `resolve` support a specific entry point that custom resolvers can use\\n  // to inject a specific resolution logic without having to patch the whole package.\\n  //\\n  // Cf: https://github.com/browserify/resolve/pull/174\\n\\n  patchedModules.push([\\n    /^\\\\.\\\\/normalize-options\\\\.js$/,\\n    (issuer, normalizeOptions) => {\\n      if (!issuer || issuer.name !== \\'resolve\\') {\\n        return normalizeOptions;\\n      }\\n\\n      return (request, opts) => {\\n        opts = opts || {};\\n\\n        if (opts.forceNodeResolution) {\\n          return opts;\\n        }\\n\\n        opts.preserveSymlinks = true;\\n        opts.paths = function(request, basedir, getNodeModulesDir, opts) {\\n          // Extract the name of the package being requested (1=full name, 2=scope name, 3=local name)\\n          const parts = request.match(/^((?:(@[^\\\\/]+)\\\\/)?([^\\\\/]+))/);\\n\\n          // make sure that basedir ends with a slash\\n          if (basedir.charAt(basedir.length - 1) !== \\'/\\') {\\n            basedir = path.join(basedir, \\'/\\');\\n          }\\n          // This is guaranteed to return the path to the \"package.json\" file from the given package\\n          const manifestPath = exports.resolveToUnqualified(`${parts[1]}/package.json`, basedir);\\n\\n          // The first dirname strips the package.json, the second strips the local named folder\\n          let nodeModules = path.dirname(path.dirname(manifestPath));\\n\\n          // Strips the scope named folder if needed\\n          if (parts[2]) {\\n            nodeModules = path.dirname(nodeModules);\\n          }\\n\\n          return [nodeModules];\\n        };\\n\\n        return opts;\\n      };\\n    },\\n  ]);\\n};\\n\\nif (module.parent && module.parent.id === \\'internal/preload\\') {\\n  exports.setupCompatibilityLayer();\\n\\n  exports.setup();\\n}\\n\\nif (process.mainModule === module) {\\n  exports.setupCompatibilityLayer();\\n\\n  const reportError = (code, message, data) => {\\n    process.stdout.write(`${JSON.stringify([{code, message, data}, null])}\\\\n`);\\n  };\\n\\n  const reportSuccess = resolution => {\\n    process.stdout.write(`${JSON.stringify([null, resolution])}\\\\n`);\\n  };\\n\\n  const processResolution = (request, issuer) => {\\n    try {\\n      reportSuccess(exports.resolveRequest(request, issuer));\\n    } catch (error) {\\n      reportError(error.code, error.message, error.data);\\n    }\\n  };\\n\\n  const processRequest = data => {\\n    try {\\n      const [request, issuer] = JSON.parse(data);\\n      processResolution(request, issuer);\\n    } catch (error) {\\n      reportError(`INVALID_JSON`, error.message, error.data);\\n    }\\n  };\\n\\n  if (process.argv.length > 2) {\\n    if (process.argv.length !== 4) {\\n      process.stderr.write(`Usage: ${process.argv[0]} ${process.argv[1]} <request> <issuer>\\\\n`);\\n      process.exitCode = 64; /* EX_USAGE */\\n    } else {\\n      processResolution(process.argv[2], process.argv[3]);\\n    }\\n  } else {\\n    let buffer = \\'\\';\\n    const decoder = new StringDecoder.StringDecoder();\\n\\n    process.stdin.on(\\'data\\', chunk => {\\n      buffer += decoder.write(chunk);\\n\\n      do {\\n        const index = buffer.indexOf(\\'\\\\n\\');\\n        if (index === -1) {\\n          break;\\n        }\\n\\n        const line = buffer.slice(0, index);\\n        buffer = buffer.slice(index + 1);\\n\\n        processRequest(line);\\n      } while (true);\\n    });\\n  }\\n}\\n';\n\n\nconst crypto = __webpack_require__(11);\nconst invariant = __webpack_require__(9);\nconst path = __webpack_require__(0);\n\nconst backwardSlashRegExp = /\\\\/g;\n\nconst OFFLINE_CACHE_EXTENSION = `.zip`;\n\nfunction generateMaps(packageInformationStores, blacklistedLocations) {\n  let code = ``;\n\n  // Bake the information stores into our generated code\n  code += `let packageInformationStores = new Map([\\n`;\n  for (var _iterator = packageInformationStores, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n    var _ref2;\n\n    if (_isArray) {\n      if (_i >= _iterator.length) break;\n      _ref2 = _iterator[_i++];\n    } else {\n      _i = _iterator.next();\n      if (_i.done) break;\n      _ref2 = _i.value;\n    }\n\n    const _ref = _ref2;\n    const packageName = _ref[0];\n    const packageInformationStore = _ref[1];\n\n    code += `  [${JSON.stringify(packageName)}, new Map([\\n`;\n    for (var _iterator4 = packageInformationStore, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n      var _ref7;\n\n      if (_isArray4) {\n        if (_i4 >= _iterator4.length) break;\n        _ref7 = _iterator4[_i4++];\n      } else {\n        _i4 = _iterator4.next();\n        if (_i4.done) break;\n        _ref7 = _i4.value;\n      }\n\n      const _ref6 = _ref7;\n      const packageReference = _ref6[0];\n      var _ref6$ = _ref6[1];\n      const packageLocation = _ref6$.packageLocation;\n      const packageDependencies = _ref6$.packageDependencies;\n\n      code += `    [${JSON.stringify(packageReference)}, {\\n`;\n      code += `      packageLocation: path.resolve(__dirname, ${JSON.stringify(packageLocation)}),\\n`;\n      code += `      packageDependencies: new Map([\\n`;\n      for (var _iterator5 = packageDependencies.entries(), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n        var _ref9;\n\n        if (_isArray5) {\n          if (_i5 >= _iterator5.length) break;\n          _ref9 = _iterator5[_i5++];\n        } else {\n          _i5 = _iterator5.next();\n          if (_i5.done) break;\n          _ref9 = _i5.value;\n        }\n\n        const _ref8 = _ref9;\n        const dependencyName = _ref8[0];\n        const dependencyReference = _ref8[1];\n\n        code += `        [${JSON.stringify(dependencyName)}, ${JSON.stringify(dependencyReference)}],\\n`;\n      }\n      code += `      ]),\\n`;\n      code += `    }],\\n`;\n    }\n    code += `  ])],\\n`;\n  }\n  code += `]);\\n`;\n\n  code += `\\n`;\n\n  // Also bake an inverse map that will allow us to find the package information based on the path\n  code += `let locatorsByLocations = new Map([\\n`;\n  for (var _iterator2 = blacklistedLocations, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n    var _ref3;\n\n    if (_isArray2) {\n      if (_i2 >= _iterator2.length) break;\n      _ref3 = _iterator2[_i2++];\n    } else {\n      _i2 = _iterator2.next();\n      if (_i2.done) break;\n      _ref3 = _i2.value;\n    }\n\n    const blacklistedLocation = _ref3;\n\n    code += `  [${JSON.stringify(blacklistedLocation)}, blacklistedLocator],\\n`;\n  }\n  for (var _iterator3 = packageInformationStores, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n    var _ref5;\n\n    if (_isArray3) {\n      if (_i3 >= _iterator3.length) break;\n      _ref5 = _iterator3[_i3++];\n    } else {\n      _i3 = _iterator3.next();\n      if (_i3.done) break;\n      _ref5 = _i3.value;\n    }\n\n    const _ref4 = _ref5;\n    const packageName = _ref4[0];\n    const packageInformationStore = _ref4[1];\n\n    for (var _iterator6 = packageInformationStore, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n      var _ref11;\n\n      if (_isArray6) {\n        if (_i6 >= _iterator6.length) break;\n        _ref11 = _iterator6[_i6++];\n      } else {\n        _i6 = _iterator6.next();\n        if (_i6.done) break;\n        _ref11 = _i6.value;\n      }\n\n      const _ref10 = _ref11;\n      const packageReference = _ref10[0];\n      const packageLocation = _ref10[1].packageLocation;\n\n      if (packageName !== null) {\n        code += `  [${JSON.stringify(packageLocation)}, ${JSON.stringify({\n          name: packageName,\n          reference: packageReference\n        })}],\\n`;\n      } else {\n        code += `  [${JSON.stringify(packageLocation)}, topLevelLocator],\\n`;\n      }\n    }\n  }\n  code += `]);\\n`;\n\n  return code;\n}\n\nfunction generateFindPackageLocator(packageInformationStores) {\n  let code = ``;\n\n  // We get the list of each string length we'll need to check in order to find the current package context\n  const lengths = new Map();\n\n  for (var _iterator7 = packageInformationStores.values(), _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {\n    var _ref12;\n\n    if (_isArray7) {\n      if (_i7 >= _iterator7.length) break;\n      _ref12 = _iterator7[_i7++];\n    } else {\n      _i7 = _iterator7.next();\n      if (_i7.done) break;\n      _ref12 = _i7.value;\n    }\n\n    const packageInformationStore = _ref12;\n\n    for (var _iterator9 = packageInformationStore.values(), _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) {\n      var _ref16;\n\n      if (_isArray9) {\n        if (_i9 >= _iterator9.length) break;\n        _ref16 = _iterator9[_i9++];\n      } else {\n        _i9 = _iterator9.next();\n        if (_i9.done) break;\n        _ref16 = _i9.value;\n      }\n\n      const _ref15 = _ref16;\n      const packageLocation = _ref15.packageLocation;\n\n      if (packageLocation === null) {\n        continue;\n      }\n\n      const length = packageLocation.length;\n      const count = (lengths.get(length) || 0) + 1;\n\n      lengths.set(length, count);\n    }\n  }\n\n  // We must try the larger lengths before the smaller ones, because smaller ones might also match the longest ones\n  // (for instance, /project/path will match /project/path/.pnp/global/node_modules/pnp-cf5f9c17b8f8db)\n  const sortedLengths = Array.from(lengths.entries()).sort((a, b) => {\n    return b[0] - a[0];\n  });\n\n  // Generate a function that, given a file path, returns the associated package name\n  code += `exports.findPackageLocator = function findPackageLocator(location) {\\n`;\n  code += `  let relativeLocation = normalizePath(path.relative(__dirname, location));\\n`;\n  code += `\\n`;\n  code += `  if (!relativeLocation.match(isStrictRegExp))\\n`;\n  code += `    relativeLocation = \\`./\\${relativeLocation}\\`;\\n`;\n  code += `\\n`;\n  code += `  if (location.match(isDirRegExp) && relativeLocation.charAt(relativeLocation.length - 1) !== '/')\\n`;\n  code += `    relativeLocation = \\`\\${relativeLocation}/\\`;\\n`;\n  code += `\\n`;\n  code += `  let match;\\n`;\n\n  for (var _iterator8 = sortedLengths, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) {\n    var _ref14;\n\n    if (_isArray8) {\n      if (_i8 >= _iterator8.length) break;\n      _ref14 = _iterator8[_i8++];\n    } else {\n      _i8 = _iterator8.next();\n      if (_i8.done) break;\n      _ref14 = _i8.value;\n    }\n\n    const _ref13 = _ref14;\n    const length = _ref13[0];\n\n    code += `\\n`;\n    code += `  if (relativeLocation.length >= ${length} && relativeLocation[${length - 1}] === '/')\\n`;\n    code += `    if (match = locatorsByLocations.get(relativeLocation.substr(0, ${length})))\\n`;\n    code += `      return blacklistCheck(match);\\n`;\n  }\n\n  code += `\\n`;\n  code += `  return null;\\n`;\n  code += `};\\n`;\n\n  return code;\n}\n\n/***/ }),\n/* 548 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.getTransitiveDevDependencies = getTransitiveDevDependencies;\nfunction dependenciesObjectToPatterns(dependencies) {\n  if (!dependencies) {\n    return [];\n  }\n  return Object.keys(dependencies).map(name => `${name}@${(dependencies || {})[name]}`);\n}\n\n// Enumerate all the transitive dependencies of a set of top-level packages\nfunction getTransitiveDependencies(lockfile, roots) {\n  // Queue of dependency patterns to visit; set of already-visited patterns\n  const queue = [];\n  const patterns = new Set();\n\n  const enqueue = pattern => {\n    if (patterns.has(pattern)) {\n      return;\n    }\n    patterns.add(pattern);\n    queue.push(pattern);\n  };\n\n  roots.forEach(enqueue);\n\n  // Final result set\n  const transitiveDependencies = new Set();\n\n  while (queue.length > 0) {\n    const pattern = queue.shift();\n    const lockManifest = lockfile.getLocked(pattern);\n\n    if (!lockManifest) {\n      continue;\n    }\n\n    // Add the dependency to the result set\n    transitiveDependencies.add(`${lockManifest.name}@${lockManifest.version}`);\n\n    // Enqueue any dependencies of the dependency for processing\n\n    const dependencyPatterns = dependenciesObjectToPatterns(lockManifest.dependencies);\n    dependencyPatterns.forEach(enqueue);\n\n    const optionalDependencyPatterns = dependenciesObjectToPatterns(lockManifest.optionalDependencies);\n    optionalDependencyPatterns.forEach(enqueue);\n  }\n\n  return transitiveDependencies;\n}\n\nfunction setDifference(x, y) {\n  return new Set([...x].filter(value => !y.has(value)));\n}\n\n// Given a manifest, an optional workspace layout, and a lockfile, enumerate\n// all package versions that:\n// i) are present in the lockfile\n// ii) are a transitive dependency of some top-level devDependency\n// iii) are not a transitive dependency of some top-level production dependency\nfunction getTransitiveDevDependencies(packageManifest, workspaceLayout, lockfile) {\n  // Enumerate the top-level package manifest as well as any workspace manifests\n  const manifests = [packageManifest];\n  if (workspaceLayout) {\n    for (var _iterator = Object.keys(workspaceLayout.workspaces), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const name = _ref;\n\n      manifests.push(workspaceLayout.workspaces[name].manifest);\n    }\n  }\n\n  // Collect all the top-level production and development dependencies across all manifests\n  let productionRoots = [];\n  let developmentRoots = [];\n  for (var _iterator2 = manifests, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n    var _ref2;\n\n    if (_isArray2) {\n      if (_i2 >= _iterator2.length) break;\n      _ref2 = _iterator2[_i2++];\n    } else {\n      _i2 = _iterator2.next();\n      if (_i2.done) break;\n      _ref2 = _i2.value;\n    }\n\n    const manifest = _ref2;\n\n    productionRoots = productionRoots.concat(dependenciesObjectToPatterns(manifest.dependencies));\n    productionRoots = productionRoots.concat(dependenciesObjectToPatterns(manifest.optionalDependencies));\n    developmentRoots = developmentRoots.concat(dependenciesObjectToPatterns(manifest.devDependencies));\n  }\n\n  // Enumerate all the transitive production and development dependencies\n  const productionDependencies = getTransitiveDependencies(lockfile, productionRoots);\n  const developmentDependencies = getTransitiveDependencies(lockfile, developmentRoots);\n\n  // Exclude any development dependencies that are also production dependencies\n  return setDifference(developmentDependencies, productionDependencies);\n}\n\n/***/ }),\n/* 549 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.parseRefs = exports.resolveVersion = exports.isCommitSha = undefined;\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _misc;\n\nfunction _load_misc() {\n  return _misc = __webpack_require__(18);\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst semver = __webpack_require__(22);\n\nconst REF_PREFIX = 'refs/';\nconst REF_TAG_PREFIX = 'refs/tags/';\nconst REF_BRANCH_PREFIX = 'refs/heads/';\nconst REF_PR_PREFIX = 'refs/pull/';\n\n// This regex is designed to match output from git of the style:\n//   ebeb6eafceb61dd08441ffe086c77eb472842494  refs/tags/v0.21.0\n// and extract the hash and ref name as capture groups\nconst GIT_REF_LINE_REGEXP = /^([a-fA-F0-9]+)\\s+(refs\\/(?:tags|heads|pull|remotes)\\/.*)$/;\n\nconst COMMIT_SHA_REGEXP = /^[a-f0-9]{5,40}$/;\nconst REF_NAME_REGEXP = /^refs\\/(tags|heads)\\/(.+)$/;\n\nconst isCommitSha = exports.isCommitSha = target => COMMIT_SHA_REGEXP.test(target);\n\nconst tryVersionAsGitCommit = ({ version, refs, git }) => {\n  const lowercaseVersion = version.toLowerCase();\n  if (!isCommitSha(lowercaseVersion)) {\n    return Promise.resolve(null);\n  }\n  for (var _iterator = refs.entries(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n    var _ref2;\n\n    if (_isArray) {\n      if (_i >= _iterator.length) break;\n      _ref2 = _iterator[_i++];\n    } else {\n      _i = _iterator.next();\n      if (_i.done) break;\n      _ref2 = _i.value;\n    }\n\n    const _ref = _ref2;\n    const ref = _ref[0];\n    const sha = _ref[1];\n\n    if (sha.startsWith(lowercaseVersion)) {\n      return Promise.resolve({ sha, ref });\n    }\n  }\n  return git.resolveCommit(lowercaseVersion);\n};\n\nconst tryEmptyVersionAsDefaultBranch = ({ version, git }) => version.trim() === '' ? git.resolveDefaultBranch() : Promise.resolve(null);\n\nconst tryWildcardVersionAsDefaultBranch = ({ version, git }) => version === '*' ? git.resolveDefaultBranch() : Promise.resolve(null);\n\nconst tryRef = (refs, ref) => {\n  const sha = refs.get(ref);\n  return sha ? { sha, ref } : null;\n};\n\nconst tryVersionAsFullRef = ({ version, refs }) => version.startsWith('refs/') ? tryRef(refs, version) : null;\n\nconst tryVersionAsTagName = ({ version, refs }) => tryRef(refs, `${REF_TAG_PREFIX}${version}`);\n\nconst tryVersionAsPullRequestNo = ({ version, refs }) => tryRef(refs, `${REF_PR_PREFIX}${version}`);\n\nconst tryVersionAsBranchName = ({ version, refs }) => tryRef(refs, `${REF_BRANCH_PREFIX}${version}`);\n\nconst tryVersionAsDirectRef = ({ version, refs }) => tryRef(refs, `${REF_PREFIX}${version}`);\n\nconst computeSemverNames = ({ config, refs }) => {\n  const names = {\n    tags: [],\n    heads: []\n  };\n  for (var _iterator2 = refs.keys(), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n    var _ref3;\n\n    if (_isArray2) {\n      if (_i2 >= _iterator2.length) break;\n      _ref3 = _iterator2[_i2++];\n    } else {\n      _i2 = _iterator2.next();\n      if (_i2.done) break;\n      _ref3 = _i2.value;\n    }\n\n    const ref = _ref3;\n\n    const match = REF_NAME_REGEXP.exec(ref);\n    if (!match) {\n      continue;\n    }\n    const type = match[1],\n          name = match[2];\n\n    if (semver.valid(name, config.looseSemver)) {\n      names[type].push(name);\n    }\n  }\n  return names;\n};\n\nconst findSemver = (version, config, namesList) => config.resolveConstraints(namesList, version);\n\nconst tryVersionAsTagSemver = (() => {\n  var _ref4 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ({ version, config, refs }, names) {\n    const result = yield findSemver(version.replace(/^semver:/, ''), config, names.tags);\n    return result ? tryRef(refs, `${REF_TAG_PREFIX}${result}`) : null;\n  });\n\n  return function tryVersionAsTagSemver(_x, _x2) {\n    return _ref4.apply(this, arguments);\n  };\n})();\n\nconst tryVersionAsBranchSemver = (() => {\n  var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ({ version, config, refs }, names) {\n    const result = yield findSemver(version.replace(/^semver:/, ''), config, names.heads);\n    return result ? tryRef(refs, `${REF_BRANCH_PREFIX}${result}`) : null;\n  });\n\n  return function tryVersionAsBranchSemver(_x3, _x4) {\n    return _ref5.apply(this, arguments);\n  };\n})();\n\nconst tryVersionAsSemverRange = (() => {\n  var _ref6 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (options) {\n    const names = computeSemverNames(options);\n    return (yield tryVersionAsTagSemver(options, names)) || tryVersionAsBranchSemver(options, names);\n  });\n\n  return function tryVersionAsSemverRange(_x5) {\n    return _ref6.apply(this, arguments);\n  };\n})();\n\nconst VERSION_RESOLUTION_STEPS = [tryEmptyVersionAsDefaultBranch, tryVersionAsGitCommit, tryVersionAsFullRef, tryVersionAsTagName, tryVersionAsPullRequestNo, tryVersionAsBranchName, tryVersionAsSemverRange, tryWildcardVersionAsDefaultBranch, tryVersionAsDirectRef];\n\n/**\n * Resolve a git-url hash (version) to a git commit sha and branch/tag ref\n * Returns null if the version cannot be resolved to any commit\n */\n\nconst resolveVersion = exports.resolveVersion = (() => {\n  var _ref7 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (options) {\n    for (var _iterator3 = VERSION_RESOLUTION_STEPS, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n      var _ref8;\n\n      if (_isArray3) {\n        if (_i3 >= _iterator3.length) break;\n        _ref8 = _iterator3[_i3++];\n      } else {\n        _i3 = _iterator3.next();\n        if (_i3.done) break;\n        _ref8 = _i3.value;\n      }\n\n      const testFunction = _ref8;\n\n      const result = yield testFunction(options);\n      if (result !== null) {\n        return result;\n      }\n    }\n    return null;\n  });\n\n  return function resolveVersion(_x6) {\n    return _ref7.apply(this, arguments);\n  };\n})();\n\n/**\n * Parse Git ref lines into hash of ref names to SHA hashes\n */\n\nconst parseRefs = exports.parseRefs = stdout => {\n  // store references\n  const refs = new Map();\n\n  // line delimited\n  const refLines = stdout.split('\\n');\n\n  for (var _iterator4 = refLines, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n    var _ref9;\n\n    if (_isArray4) {\n      if (_i4 >= _iterator4.length) break;\n      _ref9 = _iterator4[_i4++];\n    } else {\n      _i4 = _iterator4.next();\n      if (_i4.done) break;\n      _ref9 = _i4.value;\n    }\n\n    const line = _ref9;\n\n    const match = GIT_REF_LINE_REGEXP.exec(line);\n\n    if (match) {\n      const sha = match[1],\n            tagName = match[2];\n\n      // As documented in gitrevisions:\n      //   https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html#_specifying_revisions\n      // \"A suffix ^ followed by an empty brace pair means the object could be a tag,\n      //   and dereference the tag recursively until a non-tag object is found.\"\n      // In other words, the hash without ^{} is the hash of the tag,\n      //   and the hash with ^{} is the hash of the commit at which the tag was made.\n\n      const name = (0, (_misc || _load_misc()).removeSuffix)(tagName, '^{}');\n\n      refs.set(name, sha);\n    }\n  }\n\n  return refs;\n};\n\n/***/ }),\n/* 550 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LogicalDependencyTree = undefined;\n\nvar _npmLogicalTree;\n\nfunction _load_npmLogicalTree() {\n  return _npmLogicalTree = _interopRequireDefault(__webpack_require__(766));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nclass LogicalDependencyTree {\n  constructor(packageJson, packageLock) {\n    this.tree = (0, (_npmLogicalTree || _load_npmLogicalTree()).default)(JSON.parse(packageJson), JSON.parse(packageLock));\n  }\n\n  _findNode(name, parentNames) {\n    const parentTree = parentNames ? parentNames.reduce((node, ancestor) => {\n      const ancestorNode = node.dependencies.get(ancestor);\n      return ancestorNode;\n    }, this.tree) : this.tree;\n    const node = parentTree.dependencies.get(name);\n    return node;\n  }\n  getFixedVersionPattern(name, parentNames) {\n    const node = this._findNode(name, parentNames);\n    const version = node.version;\n    return `${node.name}@${version}`;\n  }\n}\nexports.LogicalDependencyTree = LogicalDependencyTree;\n\n/***/ }),\n/* 551 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nvar _util;\n\nfunction _load_util() {\n  return _util = __webpack_require__(219);\n}\n\nvar _index;\n\nfunction _load_index() {\n  return _index = __webpack_require__(78);\n}\n\nvar _inferLicense;\n\nfunction _load_inferLicense() {\n  return _inferLicense = _interopRequireDefault(__webpack_require__(552));\n}\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst semver = __webpack_require__(22);\nconst path = __webpack_require__(0);\nconst url = __webpack_require__(24);\n\nconst VALID_BIN_KEYS = /^(?!\\.{0,2}$)[a-z0-9._-]+$/i;\n\nconst LICENSE_RENAMES = {\n  'MIT/X11': 'MIT',\n  X11: 'MIT'\n};\n\nexports.default = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (info, moduleLoc, reporter, warn, looseSemver) {\n    const files = yield (_fs || _load_fs()).readdir(moduleLoc);\n\n    // clean info.version\n    if (typeof info.version === 'string') {\n      info.version = semver.clean(info.version, looseSemver) || info.version;\n    }\n\n    // if name or version aren't set then set them to empty strings\n    info.name = info.name || '';\n    info.version = info.version || '';\n\n    // if the man field is a string then coerce it to an array\n    if (typeof info.man === 'string') {\n      info.man = [info.man];\n    }\n\n    // if the keywords field is a string then split it on any whitespace\n    if (typeof info.keywords === 'string') {\n      info.keywords = info.keywords.split(/\\s+/g);\n    }\n\n    // if there's no contributors field but an authors field then expand it\n    if (!info.contributors && files.indexOf('AUTHORS') >= 0) {\n      const authorsFilepath = path.join(moduleLoc, 'AUTHORS');\n      const authorsFilestats = yield (_fs || _load_fs()).stat(authorsFilepath);\n      if (authorsFilestats.isFile()) {\n        let authors = yield (_fs || _load_fs()).readFile(authorsFilepath);\n        authors = authors.split(/\\r?\\n/g) // split on lines\n        .map(function (line) {\n          return line.replace(/^\\s*#.*$/, '').trim();\n        }) // remove comments\n        .filter(function (line) {\n          return !!line;\n        }); // remove empty lines\n        info.contributors = authors;\n      }\n    }\n\n    // expand people fields to objects\n    if (typeof info.author === 'string' || typeof info.author === 'object') {\n      info.author = (0, (_util || _load_util()).normalizePerson)(info.author);\n    }\n    if (Array.isArray(info.contributors)) {\n      info.contributors = info.contributors.map((_util || _load_util()).normalizePerson);\n    }\n    if (Array.isArray(info.maintainers)) {\n      info.maintainers = info.maintainers.map((_util || _load_util()).normalizePerson);\n    }\n\n    // if there's no readme field then load the README file from the cwd\n    if (!info.readme) {\n      const readmeCandidates = files.filter(function (filename) {\n        const lower = filename.toLowerCase();\n        return lower === 'readme' || lower.indexOf('readme.') === 0;\n      }).sort(function (filename1, filename2) {\n        // favor files with extensions\n        return filename2.indexOf('.') - filename1.indexOf('.');\n      });\n\n      for (var _iterator = readmeCandidates, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n        var _ref2;\n\n        if (_isArray) {\n          if (_i >= _iterator.length) break;\n          _ref2 = _iterator[_i++];\n        } else {\n          _i = _iterator.next();\n          if (_i.done) break;\n          _ref2 = _i.value;\n        }\n\n        const readmeFilename = _ref2;\n\n        const readmeFilepath = path.join(moduleLoc, readmeFilename);\n        const readmeFileStats = yield (_fs || _load_fs()).stat(readmeFilepath);\n        if (readmeFileStats.isFile()) {\n          info.readmeFilename = readmeFilename;\n          info.readme = yield (_fs || _load_fs()).readFile(readmeFilepath);\n          break;\n        }\n      }\n    }\n\n    // if there's no description then take the first paragraph from the readme\n    if (!info.description && info.readme) {\n      const desc = (0, (_util || _load_util()).extractDescription)(info.readme);\n      if (desc) {\n        info.description = desc;\n      }\n    }\n\n    // support array of engine keys\n    if (Array.isArray(info.engines)) {\n      const engines = {};\n      for (var _iterator2 = info.engines, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n        var _ref3;\n\n        if (_isArray2) {\n          if (_i2 >= _iterator2.length) break;\n          _ref3 = _iterator2[_i2++];\n        } else {\n          _i2 = _iterator2.next();\n          if (_i2.done) break;\n          _ref3 = _i2.value;\n        }\n\n        const str = _ref3;\n\n        if (typeof str === 'string') {\n          var _str$trim$split = str.trim().split(/ +/g);\n\n          const name = _str$trim$split[0],\n                patternParts = _str$trim$split.slice(1);\n\n          engines[name] = patternParts.join(' ');\n        }\n      }\n      info.engines = engines;\n    }\n\n    // if the repository field is a string then assume it's a git repo and expand it\n    if (typeof info.repository === 'string') {\n      info.repository = {\n        type: 'git',\n        url: info.repository\n      };\n    }\n\n    const repo = info.repository;\n\n    // explode info.repository.url if it's a hosted git shorthand\n    if (repo && typeof repo === 'object' && typeof repo.url === 'string') {\n      repo.url = (0, (_index || _load_index()).hostedGitFragmentToGitUrl)(repo.url, reporter);\n    }\n\n    // allow bugs to be specified as a string, expand it to an object with a single url prop\n    if (typeof info.bugs === 'string') {\n      info.bugs = { url: info.bugs };\n    }\n\n    // normalize homepage url to http\n    if (typeof info.homepage === 'string') {\n      const parts = url.parse(info.homepage);\n      parts.protocol = parts.protocol || 'http:';\n      if (parts.pathname && !parts.hostname) {\n        parts.hostname = parts.pathname;\n        parts.pathname = '';\n      }\n      info.homepage = url.format(parts);\n    }\n\n    // if the `bin` field is as string then expand it to an object with a single property\n    // based on the original `bin` field and `name field`\n    // { name: \"foo\", bin: \"cli.js\" } -> { name: \"foo\", bin: { foo: \"cli.js\" } }\n    if (typeof info.name === 'string' && typeof info.bin === 'string' && info.bin.length > 0) {\n      // Remove scoped package name for consistency with NPM's bin field fixing behaviour\n      const name = info.name.replace(/^@[^\\/]+\\//, '');\n      info.bin = { [name]: info.bin };\n    }\n\n    // Validate that the bin entries reference only files within their package, and that\n    // their name is a valid file name\n    if (typeof info.bin === 'object' && info.bin !== null) {\n      const bin = info.bin;\n      for (var _iterator3 = Object.keys(bin), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {\n        var _ref4;\n\n        if (_isArray3) {\n          if (_i3 >= _iterator3.length) break;\n          _ref4 = _iterator3[_i3++];\n        } else {\n          _i3 = _iterator3.next();\n          if (_i3.done) break;\n          _ref4 = _i3.value;\n        }\n\n        const key = _ref4;\n\n        const target = bin[key];\n        if (!VALID_BIN_KEYS.test(key) || !(0, (_util || _load_util()).isValidBin)(target)) {\n          delete bin[key];\n          warn(reporter.lang('invalidBinEntry', info.name, key));\n        } else {\n          bin[key] = path.normalize(target);\n        }\n      }\n    } else if (typeof info.bin !== 'undefined') {\n      delete info.bin;\n      warn(reporter.lang('invalidBinField', info.name));\n    }\n\n    // bundleDependencies is an alias for bundledDependencies\n    if (info.bundledDependencies) {\n      info.bundleDependencies = info.bundledDependencies;\n      delete info.bundledDependencies;\n    }\n\n    let scripts;\n\n    // dummy script object to shove file inferred scripts onto\n    if (info.scripts && typeof info.scripts === 'object') {\n      scripts = info.scripts;\n    } else {\n      scripts = {};\n    }\n\n    // if there's a server.js file and no start script then set it to `node server.js`\n    if (!scripts.start && files.indexOf('server.js') >= 0) {\n      scripts.start = 'node server.js';\n    }\n\n    // if there's a binding.gyp file and no install script then set it to `node-gyp rebuild`\n    if (!scripts.install && files.indexOf('binding.gyp') >= 0) {\n      scripts.install = 'node-gyp rebuild';\n    }\n\n    // set scripts if we've polluted the empty object\n    if (Object.keys(scripts).length) {\n      info.scripts = scripts;\n    }\n\n    const dirs = info.directories;\n\n    if (dirs && typeof dirs === 'object') {\n      const binDir = dirs.bin;\n\n      if (!info.bin && binDir && typeof binDir === 'string') {\n        const bin = info.bin = {};\n        const fullBinDir = path.join(moduleLoc, binDir);\n\n        if (yield (_fs || _load_fs()).exists(fullBinDir)) {\n          for (var _iterator4 = yield (_fs || _load_fs()).readdir(fullBinDir), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) {\n            var _ref5;\n\n            if (_isArray4) {\n              if (_i4 >= _iterator4.length) break;\n              _ref5 = _iterator4[_i4++];\n            } else {\n              _i4 = _iterator4.next();\n              if (_i4.done) break;\n              _ref5 = _i4.value;\n            }\n\n            const scriptName = _ref5;\n\n            if (scriptName[0] === '.') {\n              continue;\n            }\n            bin[scriptName] = path.join('.', binDir, scriptName);\n          }\n        } else {\n          warn(reporter.lang('manifestDirectoryNotFound', binDir, info.name));\n        }\n      }\n\n      const manDir = dirs.man;\n\n      if (!info.man && typeof manDir === 'string') {\n        const man = info.man = [];\n        const fullManDir = path.join(moduleLoc, manDir);\n\n        if (yield (_fs || _load_fs()).exists(fullManDir)) {\n          for (var _iterator5 = yield (_fs || _load_fs()).readdir(fullManDir), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) {\n            var _ref6;\n\n            if (_isArray5) {\n              if (_i5 >= _iterator5.length) break;\n              _ref6 = _iterator5[_i5++];\n            } else {\n              _i5 = _iterator5.next();\n              if (_i5.done) break;\n              _ref6 = _i5.value;\n            }\n\n            const filename = _ref6;\n\n            if (/^(.*?)\\.[0-9]$/.test(filename)) {\n              man.push(path.join('.', manDir, filename));\n            }\n          }\n        } else {\n          warn(reporter.lang('manifestDirectoryNotFound', manDir, info.name));\n        }\n      }\n    }\n\n    delete info.directories;\n\n    // normalize licenses field\n    const licenses = info.licenses;\n    if (Array.isArray(licenses) && !info.license) {\n      let licenseTypes = [];\n\n      for (var _iterator6 = licenses, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) {\n        var _ref7;\n\n        if (_isArray6) {\n          if (_i6 >= _iterator6.length) break;\n          _ref7 = _iterator6[_i6++];\n        } else {\n          _i6 = _iterator6.next();\n          if (_i6.done) break;\n          _ref7 = _i6.value;\n        }\n\n        let license = _ref7;\n\n        if (license && typeof license === 'object') {\n          license = license.type;\n        }\n        if (typeof license === 'string') {\n          licenseTypes.push(license);\n        }\n      }\n\n      licenseTypes = licenseTypes.filter((_util || _load_util()).isValidLicense);\n\n      if (licenseTypes.length === 1) {\n        info.license = licenseTypes[0];\n      } else if (licenseTypes.length) {\n        info.license = `(${licenseTypes.join(' OR ')})`;\n      }\n    }\n\n    const license = info.license;\n\n    // normalize license\n    if (license && typeof license === 'object') {\n      info.license = license.type;\n    }\n\n    // get license file\n    const licenseFile = files.find(function (filename) {\n      const lower = filename.toLowerCase();\n      return lower === 'license' || lower.startsWith('license.') || lower === 'unlicense' || lower.startsWith('unlicense.');\n    });\n    if (licenseFile) {\n      const licenseFilepath = path.join(moduleLoc, licenseFile);\n      const licenseFileStats = yield (_fs || _load_fs()).stat(licenseFilepath);\n      if (licenseFileStats.isFile()) {\n        const licenseContent = yield (_fs || _load_fs()).readFile(licenseFilepath);\n        const inferredLicense = (0, (_inferLicense || _load_inferLicense()).default)(licenseContent);\n        info.licenseText = licenseContent;\n\n        const license = info.license;\n\n        if (typeof license === 'string') {\n          if (inferredLicense && (0, (_util || _load_util()).isValidLicense)(inferredLicense) && !(0, (_util || _load_util()).isValidLicense)(license)) {\n            // some packages don't specify their license version but we can infer it based on their license file\n            const basicLicense = license.toLowerCase().replace(/(-like|\\*)$/g, '');\n            const expandedLicense = inferredLicense.toLowerCase();\n            if (expandedLicense.startsWith(basicLicense)) {\n              // TODO consider doing something to notify the user\n              info.license = inferredLicense;\n            }\n          }\n        } else if (inferredLicense) {\n          // if there's no license then infer it based on the license file\n          info.license = inferredLicense;\n        } else {\n          // valid expression to refer to a license in a file\n          info.license = `SEE LICENSE IN ${licenseFile}`;\n        }\n      }\n    }\n\n    if (typeof info.license === 'string') {\n      // sometimes licenses are known by different names, reduce them\n      info.license = LICENSE_RENAMES[info.license] || info.license;\n    } else if (typeof info.readme === 'string') {\n      // the license might be at the bottom of the README\n      const inferredLicense = (0, (_inferLicense || _load_inferLicense()).default)(info.readme);\n      if (inferredLicense) {\n        info.license = inferredLicense;\n      }\n    }\n\n    // get notice file\n    const noticeFile = files.find(function (filename) {\n      const lower = filename.toLowerCase();\n      return lower === 'notice' || lower.startsWith('notice.');\n    });\n    if (noticeFile) {\n      const noticeFilepath = path.join(moduleLoc, noticeFile);\n      const noticeFileStats = yield (_fs || _load_fs()).stat(noticeFilepath);\n      if (noticeFileStats.isFile()) {\n        info.noticeText = yield (_fs || _load_fs()).readFile(noticeFilepath);\n      }\n    }\n\n    for (var _iterator7 = (_constants || _load_constants()).MANIFEST_FIELDS, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) {\n      var _ref8;\n\n      if (_isArray7) {\n        if (_i7 >= _iterator7.length) break;\n        _ref8 = _iterator7[_i7++];\n      } else {\n        _i7 = _iterator7.next();\n        if (_i7.done) break;\n        _ref8 = _i7.value;\n      }\n\n      const dependencyType = _ref8;\n\n      const dependencyList = info[dependencyType];\n      if (dependencyList && typeof dependencyList === 'object') {\n        delete dependencyList['//'];\n        for (const name in dependencyList) {\n          dependencyList[name] = dependencyList[name] || '';\n        }\n      }\n    }\n  });\n\n  return function (_x, _x2, _x3, _x4, _x5) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\n/***/ }),\n/* 552 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = inferLicense;\n\nvar _licenses;\n\nfunction _load_licenses() {\n  return _licenses = _interopRequireDefault(__webpack_require__(553));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction clean(str) {\n  return str.replace(/[^A-Za-z\\s]/g, ' ').replace(/[\\s]+/g, ' ').trim().toLowerCase();\n}\n\nconst REGEXES = {\n  Apache: [/Apache License\\b/],\n  BSD: [/BSD\\b/],\n  ISC: [/The ISC License/, /ISC\\b/],\n  MIT: [/MIT\\b/],\n  Unlicense: [/http:\\/\\/unlicense.org\\//],\n  WTFPL: [/DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE/, /WTFPL\\b/]\n};\n\nfunction inferLicense(license) {\n  // check if we have any explicit licenses\n  const cleanLicense = clean(license);\n  for (const licenseName in (_licenses || _load_licenses()).default) {\n    const testLicense = (_licenses || _load_licenses()).default[licenseName];\n    if (cleanLicense.search(testLicense) >= 0) {\n      return licenseName;\n    }\n  }\n\n  // infer based on some keywords\n  for (const licenseName in REGEXES) {\n    for (var _iterator = REGEXES[licenseName], _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n      var _ref;\n\n      if (_isArray) {\n        if (_i >= _iterator.length) break;\n        _ref = _iterator[_i++];\n      } else {\n        _i = _iterator.next();\n        if (_i.done) break;\n        _ref = _i.value;\n      }\n\n      const regex = _ref;\n\n      if (license.search(regex) >= 0) {\n        return `${licenseName}*`;\n      }\n    }\n  }\n\n  return null;\n}\n\n/***/ }),\n/* 553 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\n\n/* eslint-disable max-len */\n\n/**\n * DO NOT EDIT THIS FILE MANUALLY.\n * THIS FILE WAS GENERATED BY \"generate-licenses-js.js\".\n */\n\nexports.default = {\n  'Apache-2.0': new RegExp('(licensed under the apache license version the license you may not use this file except in compliance with the license you may obtain a copy of the license at http www apache org licenses license unless required by applicable law or agreed to in writing software distributed under the license is distributed on an as is basis without warranties or conditions of any kind either express or implied see the license for the specific language governing permissions and limitations under the license$|apache license version january http www apache org licenses terms and conditions for use reproduction and distribution definitions license shall mean the terms and conditions for use reproduction and distribution as defined by sections through of this document licensor shall mean the copyright owner or entity authorized by the copyright owner that is granting the license legal entity shall mean the union of the acting entity and all other entities that control are controlled by or are under common control with that entity for the purposes of this definition control means i the power direct or indirect to cause the direction or management of such entity whether by contract or otherwise or ii ownership of fifty percent or more of the outstanding shares or iii beneficial ownership of such entity you or your shall mean an individual or legal entity exercising permissions granted by this license source form shall mean the preferred form for making modifications including but not limited to software source code documentation source and configuration files object form shall mean any form resulting from mechanical transformation or translation of a source form including but not limited to compiled object code generated documentation and conversions to other media types work shall mean the work of authorship whether in source or object form made available under the license as indicated by a copyright notice that is included in or attached to the work an example is provided in the appendix below derivative works shall mean any work whether in source or object form that is based on or derived from the work and for which the editorial revisions annotations elaborations or other modifications represent as a whole an original work of authorship for the purposes of this license derivative works shall not include works that remain separable from or merely link or bind by name to the interfaces of the work and derivative works thereof contribution shall mean any work of authorship including the original version of the work and any modifications or additions to that work or derivative works thereof that is intentionally submitted to licensor for inclusion in the work by the copyright owner or by an individual or legal entity authorized to submit on behalf of the copyright owner for the purposes of this definition submitted means any form of electronic verbal or written communication sent to the licensor or its representatives including but not limited to communication on electronic mailing lists source code control systems and issue tracking systems that are managed by or on behalf of the licensor for the purpose of discussing and improving the work but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as not a contribution contributor shall mean licensor and any individual or legal entity on behalf of whom a contribution has been received by licensor and subsequently incorporated within the work grant of copyright license subject to the terms and conditions of this license each contributor hereby grants to you a perpetual worldwide non exclusive no charge royalty free irrevocable copyright license to reproduce prepare derivative works of publicly display publicly perform sublicense and distribute the work and such derivative works in source or object form grant of patent license subject to the terms and conditions of this license each contributor hereby grants to you a perpetual worldwide non exclusive no charge royalty free irrevocable except as stated in this section patent license to make have made use offer to sell sell import and otherwise transfer the work where such license applies only to those patent claims licensable by such contributor that are necessarily infringed by their contribution s alone or by combination of their contribution s with the work to which such contribution s was submitted if you institute patent litigation against any entity including a cross claim or counterclaim in a lawsuit alleging that the work or a contribution incorporated within the work constitutes direct or contributory patent infringement then any patent licenses granted to you under this license for that work shall terminate as of the date such litigation is filed redistribution you may reproduce and distribute copies of the work or derivative works thereof in any medium with or without modifications and in source or object form provided that you meet the following conditions a you must give any other recipients of the work or derivative works a copy of this license and b you must cause any modified files to carry prominent notices stating that you changed the files and c you must retain in the source form of any derivative works that you distribute all copyright patent trademark and attribution notices from the source form of the work excluding those notices that do not pertain to any part of the derivative works and d if the work includes a notice text file as part of its distribution then any derivative works that you distribute must include a readable copy of the attribution notices contained within such notice file excluding those notices that do not pertain to any part of the derivative works in at least one of the following places within a notice text file distributed as part of the derivative works within the source form or documentation if provided along with the derivative works or within a display generated by the derivative works if and wherever such third party notices normally appear the contents of the notice file are for informational purposes only and do not modify the license you may add your own attribution notices within derivative works that you distribute alongside or as an addendum to the notice text from the work provided that such additional attribution notices cannot be construed as modifying the license you may add your own copyright statement to your modifications and may provide additional or different license terms and conditions for use reproduction or distribution of your modifications or for any such derivative works as a whole provided your use reproduction and distribution of the work otherwise complies with the conditions stated in this license submission of contributions unless you explicitly state otherwise any contribution intentionally submitted for inclusion in the work by you to the licensor shall be under the terms and conditions of this license without any additional terms or conditions notwithstanding the above nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with licensor regarding such contributions trademarks this license does not grant permission to use the trade names trademarks service marks or product names of the licensor except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the notice file disclaimer of warranty unless required by applicable law or agreed to in writing licensor provides the work and each contributor provides its contributions on an as is basis without warranties or conditions of any kind either express or implied including without limitation any warranties or conditions of title non infringement merchantability or fitness for a particular purpose you are solely responsible for determining the appropriateness of using or redistributing the work and assume any risks associated with your exercise of permissions under this license limitation of liability in no event and under no legal theory whether in tort including negligence contract or otherwise unless required by applicable law such as deliberate and grossly negligent acts or agreed to in writing shall any contributor be liable to you for damages including any direct indirect special incidental or consequential damages of any character arising as a result of this license or out of the use or inability to use the work including but not limited to damages for loss of goodwill work stoppage computer failure or malfunction or any and all other commercial damages or losses even if such contributor has been advised of the possibility of such damages accepting warranty or additional liability while redistributing the work or derivative works thereof you may choose to offer and charge a fee for acceptance of support warranty indemnity or other liability obligations and or rights consistent with this license however in accepting such obligations you may act only on your own behalf and on your sole responsibility not on behalf of any other contributor and only if you agree to indemnify defend and hold each contributor harmless for any liability incurred by or claims asserted against such contributor by reason of your accepting any such warranty or additional liability end of terms and conditions$)', 'g'),\n  'BSD-2-Clause': new RegExp('(redistribution and use in source and binary forms with or without modification are permitted provided that the following conditions are met redistributions of source code must retain the above copyright notice this list of conditions and the following disclaimer redistributions in binary form must reproduce the above copyright notice this list of conditions and the following disclaimer in the documentation and or other materials provided with the distribution this(.*?| )is provided by the copyright holders and contributors as is and any express or implied warranties including but not limited to the implied warranties of merchantability and fitness for a particular purpose are disclaimed in no event shall(.*?| )be liable for any direct indirect incidental special exemplary or consequential damages including but not limited to procurement of substitute goods or services loss of use data or profits or business interruption however caused and on any theory of liability whether in contract strict liability or tort including negligence or otherwise arising in any way out of the use of this(.*?| )even if advised of the possibility of such damage$|redistribution and use in source and binary forms with or without modification are permitted provided that the following conditions are met redistributions of source code must retain the above copyright notice this list of conditions and the following disclaimer redistributions in binary form must reproduce the above copyright notice this list of conditions and the following disclaimer in the documentation and or other materials provided with the distribution this software is provided by the copyright holders and contributors as is and any express or implied warranties including but not limited to the implied warranties of merchantability and fitness for a particular purpose are disclaimed in no event shall(.*?| )be liable for any direct indirect incidental special exemplary or consequential damages including but not limited to procurement of substitute goods or services loss of use data or profits or business interruption however caused and on any theory of liability whether in contract strict liability or tort including negligence or otherwise arising in any way out of the use of this software even if advised of the possibility of such damage$)', 'g'),\n  'BSD-3-Clause': new RegExp('(redistribution and use in source and binary forms with or without modification are permitted provided that the following conditions are met redistributions of source code must retain the above copyright notice this list of conditions and the following disclaimer redistributions in binary form must reproduce the above copyright notice this list of conditions and the following disclaimer in the documentation and or other materials provided with the distribution neither the name of(.*?| )nor the names of the contributors may be used to endorse or promote products derived from this software without specific prior written permission this software is provided by the copyright holders and contributors as is and any express or implied warranties including but not limited to the implied warranties of merchantability and fitness for a particular purpose are disclaimed in no event shall(.*?| )be liable for any direct indirect incidental special exemplary or consequential damages including but not limited to procurement of substitute goods or services loss of use data or profits or business interruption however caused and on any theory of liability whether in contract strict liability or tort including negligence or otherwise arising in any way out of the use of this software even if advised of the possibility of such damage$|(redistribution and use in source and binary forms with or without modification are permitted provided that the following conditions are met redistributions of source code must retain the above copyright notice this list of conditions and the following disclaimer redistributions in binary form must reproduce the above copyright notice this list of conditions and the following disclaimer in the documentation and or other materials provided with the distribution the names of any contributors may not be used to endorse or promote products derived from this software without specific prior written permission this software is provided by the copyright holders and contributors as is and any express or implied warranties including but not limited to the implied warranties of merchantability and fitness for a particular purpose are disclaimed in no event shall the copyright holders and contributors be liable for any direct indirect incidental special exemplary or consequential damages including but not limited to procurement of substitute goods or services loss of use data or profits or business interruption however caused and on any theory of liability whether in contract strict liability or tort including negligence or otherwise arising in any way out of the use of this software even if advised of the possibility of such damage$|redistribution and use in source and binary forms with or without modification are permitted provided that the following conditions are met redistributions of source code must retain the above copyright notice this list of conditions and the following disclaimer redistributions in binary form must reproduce the above copyright notice this list of conditions and the following disclaimer in the documentation and or other materials provided with the distribution neither the name(.*?| )nor the names of(.*?| )contributors may be used to endorse or promote products derived from this software without specific prior written permission this software is provided by(.*?| )as is and any express or implied warranties including but not limited to the implied warranties of merchantability and fitness for a particular purpose are disclaimed in no event shall(.*?| )be liable for any direct indirect incidental special exemplary or consequential damages including but not limited to procurement of substitute goods or services loss of use data or profits or business interruption however caused and on any theory of liability whether in contract strict liability or tort including negligence or otherwise arising in any way out of the use of this software even if advised of the possibility of such damage$))', 'g'),\n  MIT: new RegExp('permission is hereby granted free of charge to any person obtaining a copy of this software and associated documentation files the software to deal in the software without restriction including without limitation the rights to use copy modify merge publish distribute sublicense and or sell copies of the software and to permit persons to whom the software is furnished to do so subject to the following conditions the above copyright notice and this permission notice shall be included in all copies or substantial portions of the software the software is provided as is without warranty of any kind express or implied including but not limited to the warranties of merchantability fitness for a particular purpose and noninfringement in no event shall the authors or copyright holders be liable for any claim damages or other liability whether in an action of contract tort or otherwise arising from out of or in connection with the software or the use or other dealings in the software$', 'g'),\n  Unlicense: new RegExp('this is free and unencumbered software released into the public domain anyone is free to copy modify publish use compile sell or distribute this software either in source code form or as a compiled binary for any purpose commercial or non commercial and by any means in jurisdictions that recognize copyright laws the author or authors of this software dedicate any and all copyright interest in the software to the public domain we make this dedication for the benefit of the public at large and to the detriment of our heirs and successors we intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law the software is provided as is without warranty of any kind express or implied including but not limited to the warranties of merchantability fitness for a particular purpose and noninfringement in no event shall the authors be liable for any claim damages or other liability whether in an action of contract tort or otherwise arising from out of or in connection with the software or the use or other dealings in the software for more information please refer to wildcard$', 'g')\n};\n\n/***/ }),\n/* 554 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nexports.default = function (info, moduleLoc, lockfileFolder) {\n  // It won't work if we don't yet know what's the folder we'll use as root. It's not a\n  // big deal tho, because it only happens when trying to figure out the root, and we\n  // don't need to know the dependencies / devDependencies at this time.\n  if (!lockfileFolder) {\n    return;\n  }\n\n  for (var _iterator = (_constants || _load_constants()).DEPENDENCY_TYPES, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {\n    var _ref;\n\n    if (_isArray) {\n      if (_i >= _iterator.length) break;\n      _ref = _iterator[_i++];\n    } else {\n      _i = _iterator.next();\n      if (_i.done) break;\n      _ref = _i.value;\n    }\n\n    const dependencyType = _ref;\n\n    const dependencies = info[dependencyType];\n    if (!dependencies) {\n      continue;\n    }\n\n    for (var _iterator2 = Object.keys(dependencies), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {\n      var _ref2;\n\n      if (_isArray2) {\n        if (_i2 >= _iterator2.length) break;\n        _ref2 = _iterator2[_i2++];\n      } else {\n        _i2 = _iterator2.next();\n        if (_i2.done) break;\n        _ref2 = _i2.value;\n      }\n\n      const name = _ref2;\n\n      let value = dependencies[name];\n\n      if (path.isAbsolute(value)) {\n        value = (_fileResolver || _load_fileResolver()).FILE_PROTOCOL_PREFIX + value;\n      }\n\n      let prefix;\n      if (value.startsWith((_fileResolver || _load_fileResolver()).FILE_PROTOCOL_PREFIX)) {\n        prefix = (_fileResolver || _load_fileResolver()).FILE_PROTOCOL_PREFIX;\n      } else if (value.startsWith((_linkResolver || _load_linkResolver()).LINK_PROTOCOL_PREFIX)) {\n        prefix = (_linkResolver || _load_linkResolver()).LINK_PROTOCOL_PREFIX;\n      } else {\n        continue;\n      }\n      (0, (_invariant || _load_invariant()).default)(prefix, 'prefix is definitely defined here');\n\n      const unprefixed = value.substr(prefix.length);\n      const hasPathPrefix = /^\\.(\\/|$)/.test(unprefixed);\n\n      const absoluteTarget = path.resolve(lockfileFolder, moduleLoc, unprefixed);\n      let relativeTarget = path.relative(lockfileFolder, absoluteTarget) || '.';\n\n      if (absoluteTarget === lockfileFolder) {\n        relativeTarget = '.';\n      } else if (hasPathPrefix) {\n        // TODO: This logic should be removed during the next major bump\n        // If the original value was using the \"./\" prefix, then we output a similar path.\n        // We need to do this because otherwise it would cause problems with already existing\n        // lockfile, which would see some of their entries being unrecognized.\n        relativeTarget = relativeTarget.replace(/^(?!\\.{0,2}\\/)/, `./`);\n      }\n\n      dependencies[name] = prefix + relativeTarget.replace(/\\\\/g, '/');\n    }\n  }\n};\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nvar _fileResolver;\n\nfunction _load_fileResolver() {\n  return _fileResolver = __webpack_require__(213);\n}\n\nvar _linkResolver;\n\nfunction _load_linkResolver() {\n  return _linkResolver = __webpack_require__(362);\n}\n\nvar _invariant;\n\nfunction _load_invariant() {\n  return _invariant = _interopRequireDefault(__webpack_require__(9));\n}\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst path = __webpack_require__(0);\n\n/***/ }),\n/* 555 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = {\n  autohr: 'author',\n  autor: 'author',\n  contributers: 'contributors',\n  depdenencies: 'dependencies',\n  dependancies: 'dependencies',\n  dependecies: 'dependencies',\n  depends: 'dependencies',\n  'dev-dependencies': 'devDependencies',\n  devDependences: 'devDependencies',\n  devDepenencies: 'devDependencies',\n  devEependencies: 'devDependencies',\n  devdependencies: 'devDependencies',\n  hampage: 'homepage',\n  hompage: 'homepage',\n  prefereGlobal: 'preferGlobal',\n  publicationConfig: 'publishConfig',\n  repo: 'repository',\n  repostitory: 'repository',\n  script: 'scripts'\n};\n\n/***/ }),\n/* 556 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.default = parsePackageName;\n\n\nconst PKG_INPUT = /(^\\S?[^\\s@]+)(?:@(\\S+))?$/;\n\nfunction parsePackageName(input) {\n  var _PKG_INPUT$exec = PKG_INPUT.exec(input);\n\n  const name = _PKG_INPUT$exec[1],\n        version = _PKG_INPUT$exec[2];\n\n  return { name, version };\n}\n\n/***/ }),\n/* 557 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _asyncToGenerator2;\n\nfunction _load_asyncToGenerator() {\n  return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2));\n}\n\nlet makePortableProxyScriptUnix = (() => {\n  var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (source, destination, options) {\n    const environment = options.extraEnvironment ? Array.from(options.extraEnvironment.entries()).map(function ([key, value]) {\n      return `${key}=\"${value}\"`;\n    }).join(' ') + ' ' : '';\n\n    const prependedArguments = options.prependArguments ? ' ' + options.prependArguments.map(function (arg) {\n      return `\"${arg}\"`;\n    }).join(' ') : '';\n    const appendedArguments = options.appendArguments ? ' ' + options.appendArguments.map(function (arg) {\n      return `\"${arg}\"`;\n    }).join(' ') : '';\n\n    const filePath = `${destination}/${options.proxyBasename || path.basename(source)}`;\n\n    // Unless impossible we want to preserve any symlinks used to call us when forwarding the call to the binary (so we\n    // cannot use realpath or transform relative paths into absolute ones), but we also need to tell the sh interpreter\n    // that the symlink should be resolved relative to the script directory (hence dirname \"$0\" at runtime).\n    const sourcePath = path.isAbsolute(source) ? source : `$(dirname \"$0\")/../${source}`;\n\n    yield (_fs || _load_fs()).mkdirp(destination);\n\n    if (process.platform === 'win32') {\n      yield (_fs || _load_fs()).writeFile(filePath + '.cmd', `@${environment}\"${sourcePath}\" ${prependedArguments} ${appendedArguments} %*\\r\\n`);\n    } else {\n      yield (_fs || _load_fs()).writeFile(filePath, `#!/bin/sh\\n\\n${environment}exec \"${sourcePath}\"${prependedArguments} \"$@\"${appendedArguments}\\n`);\n      yield (_fs || _load_fs()).chmod(filePath, 0o755);\n    }\n  });\n\n  return function makePortableProxyScriptUnix(_x, _x2, _x3) {\n    return _ref.apply(this, arguments);\n  };\n})();\n\nexports.makePortableProxyScript = makePortableProxyScript;\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = _interopRequireWildcard(__webpack_require__(5));\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nconst path = __webpack_require__(0);\n\nfunction makePortableProxyScript(source, destination,\n// $FlowFixMe Flow doesn't support exact types with empty default values\noptions = {}) {\n  return makePortableProxyScriptUnix(source, destination, options);\n}\n\n/***/ }),\n/* 558 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.findRc = findRc;\n\nvar _fs;\n\nfunction _load_fs() {\n  return _fs = __webpack_require__(4);\n}\n\nvar _path;\n\nfunction _load_path() {\n  return _path = _interopRequireWildcard(__webpack_require__(0));\n}\n\nvar _constants;\n\nfunction _load_constants() {\n  return _constants = __webpack_require__(8);\n}\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nconst etc = '/etc';\n\nconst isWin = process.platform === 'win32';\nconst home = isWin ? process.env.USERPROFILE : process.env.HOME;\n\nfunction getRcPaths(name, cwd) {\n  const configPaths = [];\n\n  function pushConfigPath(...segments) {\n    configPaths.push((_path || _load_path()).join(...segments));\n    if (segments[segments.length - 1] === `.${name}rc`) {\n      configPaths.push((_path || _load_path()).join(...segments.slice(0, -1), `.${name}rc.yml`));\n    }\n  }\n\n  function unshiftConfigPath(...segments) {\n    if (segments[segments.length - 1] === `.${name}rc`) {\n      configPaths.unshift((_path || _load_path()).join(...segments.slice(0, -1), `.${name}rc.yml`));\n    }\n    configPaths.unshift((_path || _load_path()).join(...segments));\n  }\n\n  if (!isWin) {\n    pushConfigPath(etc, name, 'config');\n    pushConfigPath(etc, `${name}rc`);\n  }\n\n  if (home) {\n    pushConfigPath((_constants || _load_constants()).CONFIG_DIRECTORY);\n    pushConfigPath(home, '.config', name, 'config');\n    pushConfigPath(home, '.config', name);\n    pushConfigPath(home, `.${name}`, 'config');\n    pushConfigPath(home, `.${name}rc`);\n  }\n\n  // add .yarnrc locations relative to the cwd\n  while (true) {\n    unshiftConfigPath(cwd, `.${name}rc`);\n\n    const upperCwd = (_path || _load_path()).dirname(cwd);\n    if (upperCwd === cwd) {\n      // we've reached the root\n      break;\n    } else {\n      // continue since there's still more directories to search\n      cwd = upperCwd;\n    }\n  }\n\n  const envVariable = `${name}_config`.toUpperCase();\n\n  if (process.env[envVariable]) {\n    pushConfigPath(process.env[envVariable]);\n  }\n\n  return configPaths;\n}\n\nfunction parseRcPaths(paths, parser) {\n  return Object.assign({}, ...paths.map(path => {\n    try {\n      return parser((0, (_fs || _load_fs()).readFileSync)(path).toString(), path);\n    } catch (error) {\n      if (error.code === 'ENOENT' || error.code === 'EISDIR') {\n        return {};\n      } else {\n        throw error;\n      }\n    }\n  }));\n}\n\nfunction findRc(name, cwd, parser) {\n  return parseRcPaths(getRcPaths(name, cwd), parser);\n}\n\n/***/ }),\n/* 559 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = { \"default\": __webpack_require__(591), __esModule: true };\n\n/***/ }),\n/* 560 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar DuplexStream = __webpack_require__(791)\n  , util         = __webpack_require__(3)\n  , Buffer       = __webpack_require__(46).Buffer\n\n\nfunction BufferList (callback) {\n  if (!(this instanceof BufferList))\n    return new BufferList(callback)\n\n  this._bufs  = []\n  this.length = 0\n\n  if (typeof callback == 'function') {\n    this._callback = callback\n\n    var piper = function piper (err) {\n      if (this._callback) {\n        this._callback(err)\n        this._callback = null\n      }\n    }.bind(this)\n\n    this.on('pipe', function onPipe (src) {\n      src.on('error', piper)\n    })\n    this.on('unpipe', function onUnpipe (src) {\n      src.removeListener('error', piper)\n    })\n  } else {\n    this.append(callback)\n  }\n\n  DuplexStream.call(this)\n}\n\n\nutil.inherits(BufferList, DuplexStream)\n\n\nBufferList.prototype._offset = function _offset (offset) {\n  var tot = 0, i = 0, _t\n  if (offset === 0) return [ 0, 0 ]\n  for (; i < this._bufs.length; i++) {\n    _t = tot + this._bufs[i].length\n    if (offset < _t || i == this._bufs.length - 1)\n      return [ i, offset - tot ]\n    tot = _t\n  }\n}\n\n\nBufferList.prototype.append = function append (buf) {\n  var i = 0\n\n  if (Buffer.isBuffer(buf)) {\n    this._appendBuffer(buf);\n  } else if (Array.isArray(buf)) {\n    for (; i < buf.length; i++)\n      this.append(buf[i])\n  } else if (buf instanceof BufferList) {\n    // unwrap argument into individual BufferLists\n    for (; i < buf._bufs.length; i++)\n      this.append(buf._bufs[i])\n  } else if (buf != null) {\n    // coerce number arguments to strings, since Buffer(number) does\n    // uninitialized memory allocation\n    if (typeof buf == 'number')\n      buf = buf.toString()\n\n    this._appendBuffer(Buffer.from(buf));\n  }\n\n  return this\n}\n\n\nBufferList.prototype._appendBuffer = function appendBuffer (buf) {\n  this._bufs.push(buf)\n  this.length += buf.length\n}\n\n\nBufferList.prototype._write = function _write (buf, encoding, callback) {\n  this._appendBuffer(buf)\n\n  if (typeof callback == 'function')\n    callback()\n}\n\n\nBufferList.prototype._read = function _read (size) {\n  if (!this.length)\n    return this.push(null)\n\n  size = Math.min(size, this.length)\n  this.push(this.slice(0, size))\n  this.consume(size)\n}\n\n\nBufferList.prototype.end = function end (chunk) {\n  DuplexStream.prototype.end.call(this, chunk)\n\n  if (this._callback) {\n    this._callback(null, this.slice())\n    this._callback = null\n  }\n}\n\n\nBufferList.prototype.get = function get (index) {\n  return this.slice(index, index + 1)[0]\n}\n\n\nBufferList.prototype.slice = function slice (start, end) {\n  if (typeof start == 'number' && start < 0)\n    start += this.length\n  if (typeof end == 'number' && end < 0)\n    end += this.length\n  return this.copy(null, 0, start, end)\n}\n\n\nBufferList.prototype.copy = function copy (dst, dstStart, srcStart, srcEnd) {\n  if (typeof srcStart != 'number' || srcStart < 0)\n    srcStart = 0\n  if (typeof srcEnd != 'number' || srcEnd > this.length)\n    srcEnd = this.length\n  if (srcStart >= this.length)\n    return dst || Buffer.alloc(0)\n  if (srcEnd <= 0)\n    return dst || Buffer.alloc(0)\n\n  var copy   = !!dst\n    , off    = this._offset(srcStart)\n    , len    = srcEnd - srcStart\n    , bytes  = len\n    , bufoff = (copy && dstStart) || 0\n    , start  = off[1]\n    , l\n    , i\n\n  // copy/slice everything\n  if (srcStart === 0 && srcEnd == this.length) {\n    if (!copy) { // slice, but full concat if multiple buffers\n      return this._bufs.length === 1\n        ? this._bufs[0]\n        : Buffer.concat(this._bufs, this.length)\n    }\n\n    // copy, need to copy individual buffers\n    for (i = 0; i < this._bufs.length; i++) {\n      this._bufs[i].copy(dst, bufoff)\n      bufoff += this._bufs[i].length\n    }\n\n    return dst\n  }\n\n  // easy, cheap case where it's a subset of one of the buffers\n  if (bytes <= this._bufs[off[0]].length - start) {\n    return copy\n      ? this._bufs[off[0]].copy(dst, dstStart, start, start + bytes)\n      : this._bufs[off[0]].slice(start, start + bytes)\n  }\n\n  if (!copy) // a slice, we need something to copy in to\n    dst = Buffer.allocUnsafe(len)\n\n  for (i = off[0]; i < this._bufs.length; i++) {\n    l = this._bufs[i].length - start\n\n    if (bytes > l) {\n      this._bufs[i].copy(dst, bufoff, start)\n    } else {\n      this._bufs[i].copy(dst, bufoff, start, start + bytes)\n      break\n    }\n\n    bufoff += l\n    bytes -= l\n\n    if (start)\n      start = 0\n  }\n\n  return dst\n}\n\nBufferList.prototype.shallowSlice = function shallowSlice (start, end) {\n  start = start || 0\n  end = end || this.length\n\n  if (start < 0)\n    start += this.length\n  if (end < 0)\n    end += this.length\n\n  var startOffset = this._offset(start)\n    , endOffset = this._offset(end)\n    , buffers = this._bufs.slice(startOffset[0], endOffset[0] + 1)\n\n  if (endOffset[1] == 0)\n    buffers.pop()\n  else\n    buffers[buffers.length-1] = buffers[buffers.length-1].slice(0, endOffset[1])\n\n  if (startOffset[1] != 0)\n    buffers[0] = buffers[0].slice(startOffset[1])\n\n  return new BufferList(buffers)\n}\n\nBufferList.prototype.toString = function toString (encoding, start, end) {\n  return this.slice(start, end).toString(encoding)\n}\n\nBufferList.prototype.consume = function consume (bytes) {\n  while (this._bufs.length) {\n    if (bytes >= this._bufs[0].length) {\n      bytes -= this._bufs[0].length\n      this.length -= this._bufs[0].length\n      this._bufs.shift()\n    } else {\n      this._bufs[0] = this._bufs[0].slice(bytes)\n      this.length -= bytes\n      break\n    }\n  }\n  return this\n}\n\n\nBufferList.prototype.duplicate = function duplicate () {\n  var i = 0\n    , copy = new BufferList()\n\n  for (; i < this._bufs.length; i++)\n    copy.append(this._bufs[i])\n\n  return copy\n}\n\n\nBufferList.prototype.destroy = function destroy () {\n  this._bufs.length = 0\n  this.length = 0\n  this.push(null)\n}\n\n\n;(function () {\n  var methods = {\n      'readDoubleBE' : 8\n    , 'readDoubleLE' : 8\n    , 'readFloatBE'  : 4\n    , 'readFloatLE'  : 4\n    , 'readInt32BE'  : 4\n    , 'readInt32LE'  : 4\n    , 'readUInt32BE' : 4\n    , 'readUInt32LE' : 4\n    , 'readInt16BE'  : 2\n    , 'readInt16LE'  : 2\n    , 'readUInt16BE' : 2\n    , 'readUInt16LE' : 2\n    , 'readInt8'     : 1\n    , 'readUInt8'    : 1\n  }\n\n  for (var m in methods) {\n    (function (m) {\n      BufferList.prototype[m] = function (offset) {\n        return this.slice(offset, offset + methods[m])[m](0)\n      }\n    }(m))\n  }\n}())\n\n\nmodule.exports = BufferList\n\n\n/***/ }),\n/* 561 */\n/***/ (function(module, exports) {\n\nfunction allocUnsafe (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  }\n\n  if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n\n  if (Buffer.allocUnsafe) {\n    return Buffer.allocUnsafe(size)\n  } else {\n    return new Buffer(size)\n  }\n}\n\nmodule.exports = allocUnsafe\n\n\n/***/ }),\n/* 562 */\n/***/ (function(module, exports) {\n\n/* Node.js 6.4.0 and up has full support */\nvar hasFullSupport = (function () {\n  try {\n    if (!Buffer.isEncoding('latin1')) {\n      return false\n    }\n\n    var buf = Buffer.alloc ? Buffer.alloc(4) : new Buffer(4)\n\n    buf.fill('ab', 'ucs2')\n\n    return (buf.toString('hex') === '61006200')\n  } catch (_) {\n    return false\n  }\n}())\n\nfunction isSingleByte (val) {\n  return (val.length === 1 && val.charCodeAt(0) < 256)\n}\n\nfunction fillWithNumber (buffer, val, start, end) {\n  if (start < 0 || end > buffer.length) {\n    throw new RangeError('Out of range index')\n  }\n\n  start = start >>> 0\n  end = end === undefined ? buffer.length : end >>> 0\n\n  if (end > start) {\n    buffer.fill(val, start, end)\n  }\n\n  return buffer\n}\n\nfunction fillWithBuffer (buffer, val, start, end) {\n  if (start < 0 || end > buffer.length) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return buffer\n  }\n\n  start = start >>> 0\n  end = end === undefined ? buffer.length : end >>> 0\n\n  var pos = start\n  var len = val.length\n  while (pos <= (end - len)) {\n    val.copy(buffer, pos)\n    pos += len\n  }\n\n  if (pos !== end) {\n    val.copy(buffer, pos, 0, end - pos)\n  }\n\n  return buffer\n}\n\nfunction fill (buffer, val, start, end, encoding) {\n  if (hasFullSupport) {\n    return buffer.fill(val, start, end, encoding)\n  }\n\n  if (typeof val === 'number') {\n    return fillWithNumber(buffer, val, start, end)\n  }\n\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = buffer.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = buffer.length\n    }\n\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n\n    if (encoding === 'latin1') {\n      encoding = 'binary'\n    }\n\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n\n    if (val === '') {\n      return fillWithNumber(buffer, 0, start, end)\n    }\n\n    if (isSingleByte(val)) {\n      return fillWithNumber(buffer, val.charCodeAt(0), start, end)\n    }\n\n    val = new Buffer(val, encoding)\n  }\n\n  if (Buffer.isBuffer(val)) {\n    return fillWithBuffer(buffer, val, start, end)\n  }\n\n  // Other values (e.g. undefined, boolean, object) results in zero-fill\n  return fillWithNumber(buffer, 0, start, end)\n}\n\nmodule.exports = fill\n\n\n/***/ }),\n/* 563 */\n/***/ (function(module, exports) {\n\nvar toString = Object.prototype.toString\n\nvar isModern = (\n  typeof Buffer.alloc === 'function' &&\n  typeof Buffer.allocUnsafe === 'function' &&\n  typeof Buffer.from === 'function'\n)\n\nfunction isArrayBuffer (input) {\n  return toString.call(input).slice(8, -1) === 'ArrayBuffer'\n}\n\nfunction fromArrayBuffer (obj, byteOffset, length) {\n  byteOffset >>>= 0\n\n  var maxLength = obj.byteLength - byteOffset\n\n  if (maxLength < 0) {\n    throw new RangeError(\"'offset' is out of bounds\")\n  }\n\n  if (length === undefined) {\n    length = maxLength\n  } else {\n    length >>>= 0\n\n    if (length > maxLength) {\n      throw new RangeError(\"'length' is out of bounds\")\n    }\n  }\n\n  return isModern\n    ? Buffer.from(obj.slice(byteOffset, byteOffset + length))\n    : new Buffer(new Uint8Array(obj.slice(byteOffset, byteOffset + length)))\n}\n\nfunction fromString (string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  return isModern\n    ? Buffer.from(string, encoding)\n    : new Buffer(string, encoding)\n}\n\nfunction bufferFrom (value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (isArrayBuffer(value)) {\n    return fromArrayBuffer(value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(value, encodingOrOffset)\n  }\n\n  return isModern\n    ? Buffer.from(value)\n    : new Buffer(value)\n}\n\nmodule.exports = bufferFrom\n\n\n/***/ }),\n/* 564 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * bytes\n * Copyright(c) 2012-2014 TJ Holowaychuk\n * Copyright(c) 2015 Jed Watson\n * MIT Licensed\n */\n\n\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = bytes;\nmodule.exports.format = format;\nmodule.exports.parse = parse;\n\n/**\n * Module variables.\n * @private\n */\n\nvar formatThousandsRegExp = /\\B(?=(\\d{3})+(?!\\d))/g;\n\nvar formatDecimalsRegExp = /(?:\\.0*|(\\.[^0]+)0+)$/;\n\nvar map = {\n  b:  1,\n  kb: 1 << 10,\n  mb: 1 << 20,\n  gb: 1 << 30,\n  tb: ((1 << 30) * 1024)\n};\n\nvar parseRegExp = /^((-|\\+)?(\\d+(?:\\.\\d+)?)) *(kb|mb|gb|tb)$/i;\n\n/**\n * Convert the given value in bytes into a string or parse to string to an integer in bytes.\n *\n * @param {string|number} value\n * @param {{\n *  case: [string],\n *  decimalPlaces: [number]\n *  fixedDecimals: [boolean]\n *  thousandsSeparator: [string]\n *  unitSeparator: [string]\n *  }} [options] bytes options.\n *\n * @returns {string|number|null}\n */\n\nfunction bytes(value, options) {\n  if (typeof value === 'string') {\n    return parse(value);\n  }\n\n  if (typeof value === 'number') {\n    return format(value, options);\n  }\n\n  return null;\n}\n\n/**\n * Format the given value in bytes into a string.\n *\n * If the value is negative, it is kept as such. If it is a float,\n * it is rounded.\n *\n * @param {number} value\n * @param {object} [options]\n * @param {number} [options.decimalPlaces=2]\n * @param {number} [options.fixedDecimals=false]\n * @param {string} [options.thousandsSeparator=]\n * @param {string} [options.unit=]\n * @param {string} [options.unitSeparator=]\n *\n * @returns {string|null}\n * @public\n */\n\nfunction format(value, options) {\n  if (!Number.isFinite(value)) {\n    return null;\n  }\n\n  var mag = Math.abs(value);\n  var thousandsSeparator = (options && options.thousandsSeparator) || '';\n  var unitSeparator = (options && options.unitSeparator) || '';\n  var decimalPlaces = (options && options.decimalPlaces !== undefined) ? options.decimalPlaces : 2;\n  var fixedDecimals = Boolean(options && options.fixedDecimals);\n  var unit = (options && options.unit) || '';\n\n  if (!unit || !map[unit.toLowerCase()]) {\n    if (mag >= map.tb) {\n      unit = 'TB';\n    } else if (mag >= map.gb) {\n      unit = 'GB';\n    } else if (mag >= map.mb) {\n      unit = 'MB';\n    } else if (mag >= map.kb) {\n      unit = 'KB';\n    } else {\n      unit = 'B';\n    }\n  }\n\n  var val = value / map[unit.toLowerCase()];\n  var str = val.toFixed(decimalPlaces);\n\n  if (!fixedDecimals) {\n    str = str.replace(formatDecimalsRegExp, '$1');\n  }\n\n  if (thousandsSeparator) {\n    str = str.replace(formatThousandsRegExp, thousandsSeparator);\n  }\n\n  return str + unitSeparator + unit;\n}\n\n/**\n * Parse the string value into an integer in bytes.\n *\n * If no unit is given, it is assumed the value is in bytes.\n *\n * @param {number|string} val\n *\n * @returns {number|null}\n * @public\n */\n\nfunction parse(val) {\n  if (typeof val === 'number' && !isNaN(val)) {\n    return val;\n  }\n\n  if (typeof val !== 'string') {\n    return null;\n  }\n\n  // Test if the string passed is valid\n  var results = parseRegExp.exec(val);\n  var floatValue;\n  var unit = 'b';\n\n  if (!results) {\n    // Nothing could be extracted from the given string\n    floatValue = parseInt(val, 10);\n    unit = 'b'\n  } else {\n    // Retrieve the value and the unit\n    floatValue = parseFloat(results[1]);\n    unit = results[4].toLowerCase();\n  }\n\n  return Math.floor(map[unit] * floatValue);\n}\n\n\n/***/ }),\n/* 565 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = (flag, argv) => {\n\targv = argv || process.argv;\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst pos = argv.indexOf(prefix + flag);\n\tconst terminatorPos = argv.indexOf('--');\n\treturn pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);\n};\n\n\n/***/ }),\n/* 566 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst os = __webpack_require__(42);\nconst hasFlag = __webpack_require__(565);\n\nconst env = process.env;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false')) {\n\tforceColor = false;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = true;\n}\nif ('FORCE_COLOR' in env) {\n\tforceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0;\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(stream) {\n\tif (forceColor === false) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (stream && !stream.isTTY && forceColor !== true) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor ? 1 : 0;\n\n\tif (process.platform === 'win32') {\n\t\t// Node.js 7.5.0 is the first version of Node.js to include a patch to\n\t\t// libuv that enables 256 color output on Windows. Anything earlier and it\n\t\t// won't work. However, here we target Node.js 8 at minimum as it is an LTS\n\t\t// release, and Node.js 7 is not. Windows 10 build 10586 is the first Windows\n\t\t// release that supports 256 colors. Windows 10 build 14931 is the first release\n\t\t// that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(process.versions.node.split('.')[0]) >= 8 &&\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: getSupportLevel(process.stdout),\n\tstderr: getSupportLevel(process.stderr)\n};\n\n\n/***/ }),\n/* 567 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst TEMPLATE_REGEX = /(?:\\\\(u[a-f\\d]{4}|x[a-f\\d]{2}|.))|(?:\\{(~)?(\\w+(?:\\([^)]*\\))?(?:\\.\\w+(?:\\([^)]*\\))?)*)(?:[ \\t]|(?=\\r?\\n)))|(\\})|((?:.|[\\r\\n\\f])+?)/gi;\nconst STYLE_REGEX = /(?:^|\\.)(\\w+)(?:\\(([^)]*)\\))?/g;\nconst STRING_REGEX = /^(['\"])((?:\\\\.|(?!\\1)[^\\\\])*)\\1$/;\nconst ESCAPE_REGEX = /\\\\(u[a-f\\d]{4}|x[a-f\\d]{2}|.)|([^\\\\])/gi;\n\nconst ESCAPES = new Map([\n\t['n', '\\n'],\n\t['r', '\\r'],\n\t['t', '\\t'],\n\t['b', '\\b'],\n\t['f', '\\f'],\n\t['v', '\\v'],\n\t['0', '\\0'],\n\t['\\\\', '\\\\'],\n\t['e', '\\u001B'],\n\t['a', '\\u0007']\n]);\n\nfunction unescape(c) {\n\tif ((c[0] === 'u' && c.length === 5) || (c[0] === 'x' && c.length === 3)) {\n\t\treturn String.fromCharCode(parseInt(c.slice(1), 16));\n\t}\n\n\treturn ESCAPES.get(c) || c;\n}\n\nfunction parseArguments(name, args) {\n\tconst results = [];\n\tconst chunks = args.trim().split(/\\s*,\\s*/g);\n\tlet matches;\n\n\tfor (const chunk of chunks) {\n\t\tif (!isNaN(chunk)) {\n\t\t\tresults.push(Number(chunk));\n\t\t} else if ((matches = chunk.match(STRING_REGEX))) {\n\t\t\tresults.push(matches[2].replace(ESCAPE_REGEX, (m, escape, chr) => escape ? unescape(escape) : chr));\n\t\t} else {\n\t\t\tthrow new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction parseStyle(style) {\n\tSTYLE_REGEX.lastIndex = 0;\n\n\tconst results = [];\n\tlet matches;\n\n\twhile ((matches = STYLE_REGEX.exec(style)) !== null) {\n\t\tconst name = matches[1];\n\n\t\tif (matches[2]) {\n\t\t\tconst args = parseArguments(name, matches[2]);\n\t\t\tresults.push([name].concat(args));\n\t\t} else {\n\t\t\tresults.push([name]);\n\t\t}\n\t}\n\n\treturn results;\n}\n\nfunction buildStyle(chalk, styles) {\n\tconst enabled = {};\n\n\tfor (const layer of styles) {\n\t\tfor (const style of layer.styles) {\n\t\t\tenabled[style[0]] = layer.inverse ? null : style.slice(1);\n\t\t}\n\t}\n\n\tlet current = chalk;\n\tfor (const styleName of Object.keys(enabled)) {\n\t\tif (Array.isArray(enabled[styleName])) {\n\t\t\tif (!(styleName in current)) {\n\t\t\t\tthrow new Error(`Unknown Chalk style: ${styleName}`);\n\t\t\t}\n\n\t\t\tif (enabled[styleName].length > 0) {\n\t\t\t\tcurrent = current[styleName].apply(current, enabled[styleName]);\n\t\t\t} else {\n\t\t\t\tcurrent = current[styleName];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn current;\n}\n\nmodule.exports = (chalk, tmp) => {\n\tconst styles = [];\n\tconst chunks = [];\n\tlet chunk = [];\n\n\t// eslint-disable-next-line max-params\n\ttmp.replace(TEMPLATE_REGEX, (m, escapeChar, inverse, style, close, chr) => {\n\t\tif (escapeChar) {\n\t\t\tchunk.push(unescape(escapeChar));\n\t\t} else if (style) {\n\t\t\tconst str = chunk.join('');\n\t\t\tchunk = [];\n\t\t\tchunks.push(styles.length === 0 ? str : buildStyle(chalk, styles)(str));\n\t\t\tstyles.push({inverse, styles: parseStyle(style)});\n\t\t} else if (close) {\n\t\t\tif (styles.length === 0) {\n\t\t\t\tthrow new Error('Found extraneous } in Chalk template literal');\n\t\t\t}\n\n\t\t\tchunks.push(buildStyle(chalk, styles)(chunk.join('')));\n\t\t\tchunk = [];\n\t\t\tstyles.pop();\n\t\t} else {\n\t\t\tchunk.push(chr);\n\t\t}\n\t});\n\n\tchunks.push(chunk.join(''));\n\n\tif (styles.length > 0) {\n\t\tconst errMsg = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\\`}\\`)`;\n\t\tthrow new Error(errMsg);\n\t}\n\n\treturn chunks.join('');\n};\n\n\n/***/ }),\n/* 568 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = chownr\nchownr.sync = chownrSync\n\nvar fs = __webpack_require__(4)\n, path = __webpack_require__(0)\n\nfunction chownr (p, uid, gid, cb) {\n  fs.readdir(p, function (er, children) {\n    // any error other than ENOTDIR means it's not readable, or\n    // doesn't exist.  give up.\n    if (er && er.code !== \"ENOTDIR\") return cb(er)\n    if (er || !children.length) return fs.chown(p, uid, gid, cb)\n\n    var len = children.length\n    , errState = null\n    children.forEach(function (child) {\n      var pathChild = path.resolve(p, child);\n      fs.lstat(pathChild, function(er, stats) {\n        if (er)\n          return cb(er)\n        if (!stats.isSymbolicLink())\n          chownr(pathChild, uid, gid, then)\n        else\n          then()\n        })\n    })\n    function then (er) {\n      if (errState) return\n      if (er) return cb(errState = er)\n      if (-- len === 0) return fs.chown(p, uid, gid, cb)\n    }\n  })\n}\n\nfunction chownrSync (p, uid, gid) {\n  var children\n  try {\n    children = fs.readdirSync(p)\n  } catch (er) {\n    if (er && er.code === \"ENOTDIR\") return fs.chownSync(p, uid, gid)\n    throw er\n  }\n  if (!children.length) return fs.chownSync(p, uid, gid)\n\n  children.forEach(function (child) {\n    var pathChild = path.resolve(p, child)\n    var stats = fs.lstatSync(pathChild)\n    if (!stats.isSymbolicLink())\n      chownrSync(pathChild, uid, gid)\n  })\n  return fs.chownSync(p, uid, gid)\n}\n\n\n/***/ }),\n/* 569 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar env = process.env\n\nvar vendors = [\n  // Constant, Name, Envs\n  ['TRAVIS', 'Travis CI', 'TRAVIS'],\n  ['CIRCLE', 'CircleCI', 'CIRCLECI'],\n  ['GITLAB', 'GitLab CI', 'GITLAB_CI'],\n  ['APPVEYOR', 'AppVeyor', 'APPVEYOR'],\n  ['CODESHIP', 'Codeship', {CI_NAME: 'codeship'}],\n  ['DRONE', 'Drone', 'DRONE'],\n  ['MAGNUM', 'Magnum CI', 'MAGNUM'],\n  ['SEMAPHORE', 'Semaphore', 'SEMAPHORE'],\n  ['JENKINS', 'Jenkins', 'JENKINS_URL', 'BUILD_ID'],\n  ['BAMBOO', 'Bamboo', 'bamboo_planKey'],\n  ['TFS', 'Team Foundation Server', 'TF_BUILD'],\n  ['TEAMCITY', 'TeamCity', 'TEAMCITY_VERSION'],\n  ['BUILDKITE', 'Buildkite', 'BUILDKITE'],\n  ['HUDSON', 'Hudson', 'HUDSON_URL'],\n  ['TASKCLUSTER', 'TaskCluster', 'TASK_ID', 'RUN_ID'],\n  ['GOCD', 'GoCD', 'GO_PIPELINE_LABEL'],\n  ['BITBUCKET', 'Bitbucket Pipelines', 'BITBUCKET_COMMIT'],\n  ['CODEBUILD', 'AWS CodeBuild', 'CODEBUILD_BUILD_ARN']\n]\n\nexports.name = null\n\nvendors.forEach(function (vendor) {\n  var constant = vendor.shift()\n  var name = vendor.shift()\n  var isCI = vendor.every(function (obj) {\n    if (typeof obj === 'string') return !!env[obj]\n    return Object.keys(obj).every(function (k) {\n      return env[k] === obj[k]\n    })\n  })\n  exports[constant] = isCI\n  if (isCI) exports.name = name\n})\n\nexports.isCI = !!(\n  env.CI ||                      // Travis CI, CircleCI, Gitlab CI, Appveyor, CodeShip\n  env.CONTINUOUS_INTEGRATION ||  // Travis CI\n  env.BUILD_NUMBER ||            // Jenkins, TeamCity\n  exports.name ||\n  false\n)\n\n\n/***/ }),\n/* 570 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(573);\n\n/***/ }),\n/* 571 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar kindOf = __webpack_require__(180);\nvar utils = __webpack_require__(376);\n\n/**\n * A representation of a cell within the table.\n * Implementations must have `init` and `draw` methods,\n * as well as `colSpan`, `rowSpan`, `desiredHeight` and `desiredWidth` properties.\n * @param options\n * @constructor\n */\nfunction Cell(options){\n  this.setOptions(options);\n}\n\nCell.prototype.setOptions = function(options){\n  if(['boolean', 'number', 'string'].indexOf(kindOf(options)) !== -1){\n    options = {content:''+options};\n  }\n  options = options || {};\n  this.options = options;\n  var content = options.content;\n  if (['boolean', 'number', 'string'].indexOf(kindOf(content)) !== -1) {\n    this.content = String(content);\n  } else if (!content) {\n    this.content = '';\n  } else {\n    throw new Error('Content needs to be a primitive, got: ' + (typeof  content));\n  }\n  this.colSpan = options.colSpan || 1;\n  this.rowSpan = options.rowSpan || 1;\n};\n\nCell.prototype.mergeTableOptions = function(tableOptions,cells){\n  this.cells = cells;\n\n  var optionsChars = this.options.chars || {};\n  var tableChars = tableOptions.chars;\n  var chars = this.chars = {};\n  CHAR_NAMES.forEach(function(name){\n     setOption(optionsChars,tableChars,name,chars);\n  });\n\n  this.truncate = this.options.truncate || tableOptions.truncate;\n\n  var style = this.options.style = this.options.style || {};\n  var tableStyle = tableOptions.style;\n  setOption(style, tableStyle, 'padding-left', this);\n  setOption(style, tableStyle, 'padding-right', this);\n  this.head = style.head || tableStyle.head;\n  this.border = style.border || tableStyle.border;\n\n  var fixedWidth = tableOptions.colWidths[this.x];\n  if(tableOptions.wordWrap && fixedWidth){\n    fixedWidth -= this.paddingLeft + this.paddingRight;\n    if(this.colSpan){\n      var i = 1;\n      while(i<this.colSpan){\n        fixedWidth += tableOptions.colWidths[this.x + i];\n        i++;\n      }\n    }\n    this.lines = utils.colorizeLines(utils.wordWrap(fixedWidth,this.content));\n  }\n  else {\n    this.lines = utils.colorizeLines(this.content.split('\\n'));\n  }\n\n  this.desiredWidth = utils.strlen(this.content) + this.paddingLeft + this.paddingRight;\n  this.desiredHeight = this.lines.length;\n};\n\n/**\n * Each cell will have it's `x` and `y` values set by the `layout-manager` prior to\n * `init` being called;\n * @type {Number}\n */\n\nCell.prototype.x = null;\nCell.prototype.y = null;\n\n/**\n * Initializes the Cells data structure.\n *\n * @param tableOptions - A fully populated set of tableOptions.\n * In addition to the standard default values, tableOptions must have fully populated the\n * `colWidths` and `rowWidths` arrays. Those arrays must have lengths equal to the number\n * of columns or rows (respectively) in this table, and each array item must be a Number.\n *\n */\nCell.prototype.init = function(tableOptions){\n  var x = this.x;\n  var y = this.y;\n  this.widths = tableOptions.colWidths.slice(x, x + this.colSpan);\n  this.heights = tableOptions.rowHeights.slice(y, y + this.rowSpan);\n  this.width = this.widths.reduce(sumPlusOne, -1);\n  this.height = this.heights.reduce(sumPlusOne, -1);\n\n  this.hAlign = this.options.hAlign || tableOptions.colAligns[x];\n  this.vAlign = this.options.vAlign || tableOptions.rowAligns[y];\n\n  this.drawRight = x + this.colSpan == tableOptions.colWidths.length;\n};\n\n/**\n * Draws the given line of the cell.\n * This default implementation defers to methods `drawTop`, `drawBottom`, `drawLine` and `drawEmpty`.\n * @param lineNum - can be `top`, `bottom` or a numerical line number.\n * @param spanningCell - will be a number if being called from a RowSpanCell, and will represent how\n * many rows below it's being called from. Otherwise it's undefined.\n * @returns {String} The representation of this line.\n */\nCell.prototype.draw = function(lineNum,spanningCell){\n  if(lineNum == 'top') return this.drawTop(this.drawRight);\n  if(lineNum == 'bottom') return this.drawBottom(this.drawRight);\n  var padLen = Math.max(this.height - this.lines.length, 0);\n  var padTop;\n  switch (this.vAlign){\n    case 'center':\n      padTop = Math.ceil(padLen / 2);\n      break;\n    case 'bottom':\n      padTop = padLen;\n      break;\n    default :\n      padTop = 0;\n  }\n  if( (lineNum < padTop) || (lineNum >= (padTop + this.lines.length))){\n    return this.drawEmpty(this.drawRight,spanningCell);\n  }\n  var forceTruncation = (this.lines.length > this.height) && (lineNum + 1 >= this.height);\n  return this.drawLine(lineNum - padTop, this.drawRight, forceTruncation,spanningCell);\n};\n\n/**\n * Renders the top line of the cell.\n * @param drawRight - true if this method should render the right edge of the cell.\n * @returns {String}\n */\nCell.prototype.drawTop = function(drawRight){\n  var content = [];\n  if(this.cells){  //TODO: cells should always exist - some tests don't fill it in though\n    this.widths.forEach(function(width,index){\n      content.push(this._topLeftChar(index));\n      content.push(\n        utils.repeat(this.chars[this.y == 0 ? 'top' : 'mid'],width)\n      );\n    },this);\n  }\n  else {\n    content.push(this._topLeftChar(0));\n    content.push(utils.repeat(this.chars[this.y == 0 ? 'top' : 'mid'],this.width));\n  }\n  if(drawRight){\n    content.push(this.chars[this.y == 0 ? 'topRight' : 'rightMid']);\n  }\n  return this.wrapWithStyleColors('border',content.join(''));\n};\n\nCell.prototype._topLeftChar = function(offset){\n  var x = this.x+offset;\n  var leftChar;\n  if(this.y == 0){\n    leftChar = x == 0 ? 'topLeft' : (offset == 0 ? 'topMid' : 'top');\n  } else  {\n    if(x == 0){\n      leftChar = 'leftMid';\n    }\n    else {\n      leftChar = offset == 0 ? 'midMid' : 'bottomMid';\n      if(this.cells){  //TODO: cells should always exist - some tests don't fill it in though\n        var spanAbove = this.cells[this.y-1][x] instanceof Cell.ColSpanCell;\n        if(spanAbove){\n          leftChar = offset == 0 ? 'topMid' : 'mid';\n        }\n        if(offset == 0){\n          var i = 1;\n          while(this.cells[this.y][x-i] instanceof Cell.ColSpanCell){\n            i++;\n          }\n          if(this.cells[this.y][x-i] instanceof Cell.RowSpanCell){\n            leftChar = 'leftMid';\n          }\n        }\n      }\n    }\n  }\n  return this.chars[leftChar];\n};\n\nCell.prototype.wrapWithStyleColors = function(styleProperty,content){\n  if(this[styleProperty] && this[styleProperty].length){\n    try {\n      var colors = __webpack_require__(589);\n      for(var i = this[styleProperty].length - 1; i >= 0; i--){\n        colors = colors[this[styleProperty][i]];\n      }\n      return colors(content);\n    } catch (e) {\n      return content;\n    }\n  }\n  else {\n    return content;\n  }\n};\n\n/**\n * Renders a line of text.\n * @param lineNum - Which line of text to render. This is not necessarily the line within the cell.\n * There may be top-padding above the first line of text.\n * @param drawRight - true if this method should render the right edge of the cell.\n * @param forceTruncationSymbol - `true` if the rendered text should end with the truncation symbol even\n * if the text fits. This is used when the cell is vertically truncated. If `false` the text should\n * only include the truncation symbol if the text will not fit horizontally within the cell width.\n * @param spanningCell - a number of if being called from a RowSpanCell. (how many rows below). otherwise undefined.\n * @returns {String}\n */\nCell.prototype.drawLine = function(lineNum,drawRight,forceTruncationSymbol,spanningCell){\n  var left = this.chars[this.x == 0 ? 'left' : 'middle'];\n  if(this.x && spanningCell && this.cells){\n    var cellLeft = this.cells[this.y+spanningCell][this.x-1];\n    while(cellLeft instanceof ColSpanCell){\n      cellLeft = this.cells[cellLeft.y][cellLeft.x-1];\n    }\n    if(!(cellLeft instanceof RowSpanCell)){\n      left = this.chars['rightMid'];\n    }\n  }\n  var leftPadding = utils.repeat(' ', this.paddingLeft);\n  var right = (drawRight ? this.chars['right'] : '');\n  var rightPadding = utils.repeat(' ', this.paddingRight);\n  var line = this.lines[lineNum];\n  var len = this.width - (this.paddingLeft + this.paddingRight);\n  if(forceTruncationSymbol) line += this.truncate || '…';\n  var content = utils.truncate(line,len,this.truncate);\n  content = utils.pad(content, len, ' ', this.hAlign);\n  content = leftPadding + content + rightPadding;\n  return this.stylizeLine(left,content,right);\n};\n\nCell.prototype.stylizeLine = function(left,content,right){\n  left = this.wrapWithStyleColors('border',left);\n  right = this.wrapWithStyleColors('border',right);\n  if(this.y === 0){\n    content = this.wrapWithStyleColors('head',content);\n  }\n  return left + content + right;\n};\n\n/**\n * Renders the bottom line of the cell.\n * @param drawRight - true if this method should render the right edge of the cell.\n * @returns {String}\n */\nCell.prototype.drawBottom = function(drawRight){\n  var left = this.chars[this.x == 0 ? 'bottomLeft' : 'bottomMid'];\n  var content = utils.repeat(this.chars.bottom,this.width);\n  var right = drawRight ? this.chars['bottomRight'] : '';\n  return this.wrapWithStyleColors('border',left + content + right);\n};\n\n/**\n * Renders a blank line of text within the cell. Used for top and/or bottom padding.\n * @param drawRight - true if this method should render the right edge of the cell.\n * @param spanningCell - a number of if being called from a RowSpanCell. (how many rows below). otherwise undefined.\n * @returns {String}\n */\nCell.prototype.drawEmpty = function(drawRight,spanningCell){\n  var left = this.chars[this.x == 0 ? 'left' : 'middle'];\n  if(this.x && spanningCell && this.cells){\n    var cellLeft = this.cells[this.y+spanningCell][this.x-1];\n    while(cellLeft instanceof ColSpanCell){\n      cellLeft = this.cells[cellLeft.y][cellLeft.x-1];\n    }\n    if(!(cellLeft instanceof RowSpanCell)){\n      left = this.chars['rightMid'];\n    }\n  }\n  var right = (drawRight ? this.chars['right'] : '');\n  var content = utils.repeat(' ',this.width);\n  return this.stylizeLine(left , content , right);\n};\n\n/**\n * A Cell that doesn't do anything. It just draws empty lines.\n * Used as a placeholder in column spanning.\n * @constructor\n */\nfunction ColSpanCell(){}\n\nColSpanCell.prototype.draw = function(){\n  return '';\n};\n\nColSpanCell.prototype.init = function(tableOptions){};\n\n\n/**\n * A placeholder Cell for a Cell that spans multiple rows.\n * It delegates rendering to the original cell, but adds the appropriate offset.\n * @param originalCell\n * @constructor\n */\nfunction RowSpanCell(originalCell){\n  this.originalCell = originalCell;\n}\n\nRowSpanCell.prototype.init = function(tableOptions){\n  var y = this.y;\n  var originalY = this.originalCell.y;\n  this.cellOffset = y - originalY;\n  this.offset = findDimension(tableOptions.rowHeights,originalY,this.cellOffset);\n};\n\nRowSpanCell.prototype.draw = function(lineNum){\n  if(lineNum == 'top'){\n    return this.originalCell.draw(this.offset,this.cellOffset);\n  }\n  if(lineNum == 'bottom'){\n    return this.originalCell.draw('bottom');\n  }\n  return this.originalCell.draw(this.offset + 1 + lineNum);\n};\n\nColSpanCell.prototype.mergeTableOptions =\nRowSpanCell.prototype.mergeTableOptions = function(){};\n\n// HELPER FUNCTIONS\nfunction setOption(objA,objB,nameB,targetObj){\n  var nameA = nameB.split('-');\n  if(nameA.length > 1) {\n    nameA[1] = nameA[1].charAt(0).toUpperCase() + nameA[1].substr(1);\n    nameA = nameA.join('');\n    targetObj[nameA] = objA[nameA] || objA[nameB] || objB[nameA] || objB[nameB];\n  }\n  else {\n    targetObj[nameB] = objA[nameB] || objB[nameB];\n  }\n}\n\nfunction findDimension(dimensionTable, startingIndex, span){\n  var ret = dimensionTable[startingIndex];\n  for(var i = 1; i < span; i++){\n    ret += 1 + dimensionTable[startingIndex + i];\n  }\n  return ret;\n}\n\nfunction sumPlusOne(a,b){\n  return a+b+1;\n}\n\nvar CHAR_NAMES = [  'top'\n  , 'top-mid'\n  , 'top-left'\n  , 'top-right'\n  , 'bottom'\n  , 'bottom-mid'\n  , 'bottom-left'\n  , 'bottom-right'\n  , 'left'\n  , 'left-mid'\n  , 'mid'\n  , 'mid-mid'\n  , 'right'\n  , 'right-mid'\n  , 'middle'\n];\nmodule.exports = Cell;\nmodule.exports.ColSpanCell = ColSpanCell;\nmodule.exports.RowSpanCell = RowSpanCell;\n\n\n/***/ }),\n/* 572 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar kindOf = __webpack_require__(180);\nvar objectAssign = __webpack_require__(303);\nvar Cell = __webpack_require__(571);\nvar RowSpanCell = Cell.RowSpanCell;\nvar ColSpanCell = Cell.ColSpanCell;\n\n(function(){\n  function layoutTable(table){\n    table.forEach(function(row,rowIndex){\n      row.forEach(function(cell,columnIndex){\n        cell.y = rowIndex;\n        cell.x = columnIndex;\n        for(var y = rowIndex; y >= 0; y--){\n          var row2 = table[y];\n          var xMax = (y === rowIndex) ? columnIndex : row2.length;\n          for(var x = 0; x < xMax; x++){\n            var cell2 = row2[x];\n            while(cellsConflict(cell,cell2)){\n              cell.x++;\n            }\n          }\n        }\n      });\n    });\n  }\n\n  function maxWidth(table) {\n    var mw = 0;\n    table.forEach(function (row) {\n      row.forEach(function (cell) {\n        mw = Math.max(mw,cell.x + (cell.colSpan || 1));\n      });\n    });\n    return mw;\n  }\n\n  function maxHeight(table){\n    return table.length;\n  }\n\n  function cellsConflict(cell1,cell2){\n    var yMin1 = cell1.y;\n    var yMax1 = cell1.y - 1 + (cell1.rowSpan || 1);\n    var yMin2 = cell2.y;\n    var yMax2 = cell2.y - 1 + (cell2.rowSpan || 1);\n    var yConflict = !(yMin1 > yMax2 || yMin2 > yMax1);\n\n    var xMin1= cell1.x;\n    var xMax1 = cell1.x - 1 + (cell1.colSpan || 1);\n    var xMin2= cell2.x;\n    var xMax2 = cell2.x - 1 + (cell2.colSpan || 1);\n    var xConflict = !(xMin1 > xMax2 || xMin2 > xMax1);\n\n    return yConflict && xConflict;\n  }\n\n  function conflictExists(rows,x,y){\n    var i_max = Math.min(rows.length-1,y);\n    var cell = {x:x,y:y};\n    for(var i = 0; i <= i_max; i++){\n      var row = rows[i];\n      for(var j = 0; j < row.length; j++){\n        if(cellsConflict(cell,row[j])){\n          return true;\n        }\n      }\n    }\n    return false;\n  }\n\n  function allBlank(rows,y,xMin,xMax){\n    for(var x = xMin; x < xMax; x++){\n      if(conflictExists(rows,x,y)){\n        return false;\n      }\n    }\n    return true;\n  }\n\n  function addRowSpanCells(table){\n    table.forEach(function(row,rowIndex){\n      row.forEach(function(cell){\n        for(var i = 1; i < cell.rowSpan; i++){\n          var rowSpanCell = new RowSpanCell(cell);\n          rowSpanCell.x = cell.x;\n          rowSpanCell.y = cell.y + i;\n          rowSpanCell.colSpan = cell.colSpan;\n          insertCell(rowSpanCell,table[rowIndex+i]);\n        }\n      });\n    });\n  }\n\n  function addColSpanCells(cellRows){\n    for(var rowIndex = cellRows.length-1; rowIndex >= 0; rowIndex--) {\n      var cellColumns = cellRows[rowIndex];\n      for (var columnIndex = 0; columnIndex < cellColumns.length; columnIndex++) {\n        var cell = cellColumns[columnIndex];\n        for (var k = 1; k < cell.colSpan; k++) {\n          var colSpanCell = new ColSpanCell();\n          colSpanCell.x = cell.x + k;\n          colSpanCell.y = cell.y;\n          cellColumns.splice(columnIndex + 1, 0, colSpanCell);\n        }\n      }\n    }\n  }\n\n  function insertCell(cell,row){\n    var x = 0;\n    while(x < row.length && (row[x].x < cell.x)) {\n      x++;\n    }\n    row.splice(x,0,cell);\n  }\n\n  function fillInTable(table){\n    var h_max = maxHeight(table);\n    var w_max = maxWidth(table);\n    for(var y = 0; y < h_max; y++){\n      for(var x = 0; x < w_max; x++){\n        if(!conflictExists(table,x,y)){\n          var opts = {x:x,y:y,colSpan:1,rowSpan:1};\n          x++;\n          while(x < w_max && !conflictExists(table,x,y)){\n            opts.colSpan++;\n            x++;\n          }\n          var y2 = y + 1;\n          while(y2 < h_max && allBlank(table,y2,opts.x,opts.x+opts.colSpan)){\n            opts.rowSpan++;\n            y2++;\n          }\n\n          var cell = new Cell(opts);\n          cell.x = opts.x;\n          cell.y = opts.y;\n          insertCell(cell,table[y]);\n        }\n      }\n    }\n  }\n\n  function generateCells(rows){\n    return rows.map(function(row){\n      if(kindOf(row) !== 'array'){\n        var key = Object.keys(row)[0];\n        row = row[key];\n        if(kindOf(row) === 'array'){\n          row = row.slice();\n          row.unshift(key);\n        }\n        else {\n          row = [key,row];\n        }\n      }\n      return row.map(function(cell){\n        return new Cell(cell);\n      });\n    });\n  }\n\n  function makeTableLayout(rows){\n    var cellRows = generateCells(rows);\n    layoutTable(cellRows);\n    fillInTable(cellRows);\n    addRowSpanCells(cellRows);\n    addColSpanCells(cellRows);\n    return cellRows;\n  }\n\n  module.exports = {\n    makeTableLayout: makeTableLayout,\n    layoutTable: layoutTable,\n    addRowSpanCells: addRowSpanCells,\n    maxWidth:maxWidth,\n    fillInTable:fillInTable,\n    computeWidths:makeComputeWidths('colSpan','desiredWidth','x',1),\n    computeHeights:makeComputeWidths('rowSpan','desiredHeight','y',1)\n  };\n})();\n\nfunction makeComputeWidths(colSpan,desiredWidth,x,forcedMin){\n  return function(vals,table){\n    var result = [];\n    var spanners = [];\n    table.forEach(function(row){\n      row.forEach(function(cell){\n        if((cell[colSpan] || 1) > 1){\n          spanners.push(cell);\n        }\n        else {\n          result[cell[x]] = Math.max(result[cell[x]] || 0, cell[desiredWidth] || 0, forcedMin);\n        }\n      });\n    });\n\n    vals.forEach(function(val,index){\n      if(kindOf(val) === 'number'){\n        result[index] = val;\n      }\n    });\n\n    //spanners.forEach(function(cell){\n    for(var k = spanners.length - 1; k >=0; k--){\n      var cell = spanners[k];\n      var span = cell[colSpan];\n      var col = cell[x];\n      var existingWidth = result[col];\n      var editableCols = kindOf(vals[col]) === 'number' ? 0 : 1;\n      for(var i = 1; i < span; i ++){\n        existingWidth += 1 + result[col + i];\n        if(kindOf(vals[col + i]) !== 'number'){\n          editableCols++;\n        }\n      }\n      if(cell[desiredWidth] > existingWidth){\n        i = 0;\n        while(editableCols > 0 && cell[desiredWidth] > existingWidth){\n          if(kindOf(vals[col+i]) !== 'number'){\n            var dif = Math.round( (cell[desiredWidth] - existingWidth) / editableCols );\n            existingWidth += dif;\n            result[col + i] += dif;\n            editableCols--;\n          }\n          i++;\n        }\n      }\n    }\n\n    objectAssign(vals,result);\n    for(var j = 0; j < vals.length; j++){\n      vals[j] = Math.max(forcedMin, vals[j] || 0);\n    }\n  };\n}\n\n\n/***/ }),\n/* 573 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar utils = __webpack_require__(376);\nvar tableLayout = __webpack_require__(572);\n\nfunction Table(options){\n  this.options = utils.mergeOptions(options);\n}\n\nTable.prototype.__proto__ = Array.prototype;\n\nTable.prototype.toString = function(){\n  var array = this;\n  var headersPresent = this.options.head && this.options.head.length;\n  if(headersPresent){\n    array = [this.options.head];\n    if(this.length){\n      array.push.apply(array,this);\n    }\n  }\n  else {\n    this.options.style.head=[];\n  }\n\n  var cells = tableLayout.makeTableLayout(array);\n\n  cells.forEach(function(row){\n    row.forEach(function(cell){\n      cell.mergeTableOptions(this.options,cells);\n    },this);\n  },this);\n\n  tableLayout.computeWidths(this.options.colWidths,cells);\n  tableLayout.computeHeights(this.options.rowHeights,cells);\n\n  cells.forEach(function(row,rowIndex){\n    row.forEach(function(cell,cellIndex){\n      cell.init(this.options);\n    },this);\n  },this);\n\n  var result = [];\n\n  for(var rowIndex = 0; rowIndex < cells.length; rowIndex++){\n    var row = cells[rowIndex];\n    var heightOfRow = this.options.rowHeights[rowIndex];\n\n    if(rowIndex === 0 || !this.options.style.compact || (rowIndex == 1 && headersPresent)){\n      doDraw(row,'top',result);\n    }\n\n    for(var lineNum = 0; lineNum < heightOfRow; lineNum++){\n      doDraw(row,lineNum,result);\n    }\n\n    if(rowIndex + 1 == cells.length){\n      doDraw(row,'bottom',result);\n    }\n  }\n\n  return result.join('\\n');\n};\n\nfunction doDraw(row,lineNum,result){\n  var line = [];\n  row.forEach(function(cell){\n    line.push(cell.draw(lineNum));\n  });\n  var str = line.join('');\n  if(str.length) result.push(str);\n}\n\nTable.prototype.__defineGetter__('width', function (){\n  var str = this.toString().split(\"\\n\");\n  return str[0].length;\n});\n\nmodule.exports = Table;\n\n\n/***/ }),\n/* 574 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nexports = module.exports = cliWidth;\n\nfunction normalizeOpts(options) {\n  var defaultOpts = {\n    defaultWidth: 0,\n    output: process.stdout,\n    tty: __webpack_require__(104)\n  };\n\n  if (!options) {\n    return defaultOpts;\n  } else {\n    Object.keys(defaultOpts).forEach(function (key) {\n      if (!options[key]) {\n        options[key] = defaultOpts[key];\n      }\n    });\n\n    return options;\n  }\n}\n\nfunction cliWidth(options) {\n  var opts = normalizeOpts(options);\n\n  if (opts.output.getWindowSize) {\n    return opts.output.getWindowSize()[0] || opts.defaultWidth;\n  } else {\n    if (opts.tty.getWindowSize) {\n      return opts.tty.getWindowSize()[1] || opts.defaultWidth;\n    } else {\n      if (opts.output.columns) {\n        return opts.output.columns;\n      } else {\n        if (process.env.CLI_WIDTH) {\n          var width = parseInt(process.env.CLI_WIDTH, 10);\n\n          if (!isNaN(width) && width !== 0) {\n            return width;\n          }\n        }\n      }\n\n      return opts.defaultWidth;\n    }\n  }\n};\n\n\n/***/ }),\n/* 575 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* eslint-disable babel/new-cap, xo/throw-new-error */\n\nmodule.exports = function (str, pos) {\n\tif (str === null || str === undefined) {\n\t\tthrow TypeError();\n\t}\n\n\tstr = String(str);\n\n\tvar size = str.length;\n\tvar i = pos ? Number(pos) : 0;\n\n\tif (Number.isNaN(i)) {\n\t\ti = 0;\n\t}\n\n\tif (i < 0 || i >= size) {\n\t\treturn undefined;\n\t}\n\n\tvar first = str.charCodeAt(i);\n\n\tif (first >= 0xD800 && first <= 0xDBFF && size > i + 1) {\n\t\tvar second = str.charCodeAt(i + 1);\n\n\t\tif (second >= 0xDC00 && second <= 0xDFFF) {\n\t\t\treturn ((first - 0xD800) * 0x400) + second - 0xDC00 + 0x10000;\n\t\t}\n\t}\n\n\treturn first;\n};\n\n\n/***/ }),\n/* 576 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar conversions = __webpack_require__(378);\nvar route = __webpack_require__(577);\n\nvar convert = {};\n\nvar models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\tvar result = fn(args);\n\n\t\t// we're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (var len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(function (fromModel) {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tvar routes = route(fromModel);\n\tvar routeModels = Object.keys(routes);\n\n\trouteModels.forEach(function (toModel) {\n\t\tvar fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nmodule.exports = convert;\n\n\n/***/ }),\n/* 577 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar conversions = __webpack_require__(378);\n\n/*\n\tthis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tvar graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tvar models = Object.keys(conversions);\n\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tvar graph = buildGraph();\n\tvar queue = [fromModel]; // unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tvar current = queue.pop();\n\t\tvar adjacents = Object.keys(conversions[current]);\n\n\t\tfor (var len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tvar adjacent = adjacents[i];\n\t\t\tvar node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tvar path = [graph[toModel].parent, toModel];\n\tvar fn = conversions[graph[toModel].parent][toModel];\n\n\tvar cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nmodule.exports = function (fromModel) {\n\tvar graph = deriveBFS(fromModel);\n\tvar conversion = {};\n\n\tvar models = Object.keys(graph);\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tvar toModel = models[i];\n\t\tvar node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// no possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\n\n\n/***/ }),\n/* 578 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\n\n/***/ }),\n/* 579 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n\nThe MIT License (MIT)\n\nOriginal Library\n  - Copyright (c) Marak Squires\n\nAdditional functionality\n - Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n\nvar colors = {};\nmodule['exports'] = colors;\n\ncolors.themes = {};\n\nvar util = __webpack_require__(3);\nvar ansiStyles = colors.styles = __webpack_require__(586);\nvar defineProps = Object.defineProperties;\nvar newLineRegex = new RegExp(/[\\r\\n]+/g);\n\ncolors.supportsColor = __webpack_require__(588).supportsColor;\n\nif (typeof colors.enabled === 'undefined') {\n  colors.enabled = colors.supportsColor() !== false;\n}\n\ncolors.enable = function() {\n  colors.enabled = true;\n};\n\ncolors.disable = function() {\n  colors.enabled = false;\n};\n\ncolors.stripColors = colors.strip = function(str) {\n  return ('' + str).replace(/\\x1B\\[\\d+m/g, '');\n};\n\n// eslint-disable-next-line no-unused-vars\nvar stylize = colors.stylize = function stylize(str, style) {\n  if (!colors.enabled) {\n    return str+'';\n  }\n\n  return ansiStyles[style].open + str + ansiStyles[style].close;\n};\n\nvar matchOperatorsRe = /[|\\\\{}()[\\]^$+*?.]/g;\nvar escapeStringRegexp = function(str) {\n  if (typeof str !== 'string') {\n    throw new TypeError('Expected a string');\n  }\n  return str.replace(matchOperatorsRe, '\\\\$&');\n};\n\nfunction build(_styles) {\n  var builder = function builder() {\n    return applyStyle.apply(builder, arguments);\n  };\n  builder._styles = _styles;\n  // __proto__ is used because we must return a function, but there is\n  // no way to create a function with a different prototype.\n  builder.__proto__ = proto;\n  return builder;\n}\n\nvar styles = (function() {\n  var ret = {};\n  ansiStyles.grey = ansiStyles.gray;\n  Object.keys(ansiStyles).forEach(function(key) {\n    ansiStyles[key].closeRe =\n      new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');\n    ret[key] = {\n      get: function() {\n        return build(this._styles.concat(key));\n      },\n    };\n  });\n  return ret;\n})();\n\nvar proto = defineProps(function colors() {}, styles);\n\nfunction applyStyle() {\n  var args = Array.prototype.slice.call(arguments);\n\n  var str = args.map(function(arg) {\n    if (arg != undefined && arg.constructor === String) {\n      return arg;\n    } else {\n      return util.inspect(arg);\n    }\n  }).join(' ');\n\n  if (!colors.enabled || !str) {\n    return str;\n  }\n\n  var newLinesPresent = str.indexOf('\\n') != -1;\n\n  var nestedStyles = this._styles;\n\n  var i = nestedStyles.length;\n  while (i--) {\n    var code = ansiStyles[nestedStyles[i]];\n    str = code.open + str.replace(code.closeRe, code.open) + code.close;\n    if (newLinesPresent) {\n      str = str.replace(newLineRegex, function(match) {\n        return code.close + match + code.open;\n      });\n    }\n  }\n\n  return str;\n}\n\ncolors.setTheme = function(theme) {\n  if (typeof theme === 'string') {\n    console.log('colors.setTheme now only accepts an object, not a string.  ' +\n      'If you are trying to set a theme from a file, it is now your (the ' +\n      'caller\\'s) responsibility to require the file.  The old syntax ' +\n      'looked like colors.setTheme(__dirname + ' +\n      '\\'/../themes/generic-logging.js\\'); The new syntax looks like '+\n      'colors.setTheme(require(__dirname + ' +\n      '\\'/../themes/generic-logging.js\\'));');\n    return;\n  }\n  for (var style in theme) {\n    (function(style) {\n      colors[style] = function(str) {\n        if (typeof theme[style] === 'object') {\n          var out = str;\n          for (var i in theme[style]) {\n            out = colors[theme[style][i]](out);\n          }\n          return out;\n        }\n        return colors[theme[style]](str);\n      };\n    })(style);\n  }\n};\n\nfunction init() {\n  var ret = {};\n  Object.keys(styles).forEach(function(name) {\n    ret[name] = {\n      get: function() {\n        return build([name]);\n      },\n    };\n  });\n  return ret;\n}\n\nvar sequencer = function sequencer(map, str) {\n  var exploded = str.split('');\n  exploded = exploded.map(map);\n  return exploded.join('');\n};\n\n// custom formatter methods\ncolors.trap = __webpack_require__(580);\ncolors.zalgo = __webpack_require__(581);\n\n// maps\ncolors.maps = {};\ncolors.maps.america = __webpack_require__(582)(colors);\ncolors.maps.zebra = __webpack_require__(585)(colors);\ncolors.maps.rainbow = __webpack_require__(583)(colors);\ncolors.maps.random = __webpack_require__(584)(colors);\n\nfor (var map in colors.maps) {\n  (function(map) {\n    colors[map] = function(str) {\n      return sequencer(colors.maps[map], str);\n    };\n  })(map);\n}\n\ndefineProps(colors, init());\n\n\n/***/ }),\n/* 580 */\n/***/ (function(module, exports) {\n\nmodule['exports'] = function runTheTrap(text, options) {\n  var result = '';\n  text = text || 'Run the trap, drop the bass';\n  text = text.split('');\n  var trap = {\n    a: ['\\u0040', '\\u0104', '\\u023a', '\\u0245', '\\u0394', '\\u039b', '\\u0414'],\n    b: ['\\u00df', '\\u0181', '\\u0243', '\\u026e', '\\u03b2', '\\u0e3f'],\n    c: ['\\u00a9', '\\u023b', '\\u03fe'],\n    d: ['\\u00d0', '\\u018a', '\\u0500', '\\u0501', '\\u0502', '\\u0503'],\n    e: ['\\u00cb', '\\u0115', '\\u018e', '\\u0258', '\\u03a3', '\\u03be', '\\u04bc',\n         '\\u0a6c'],\n    f: ['\\u04fa'],\n    g: ['\\u0262'],\n    h: ['\\u0126', '\\u0195', '\\u04a2', '\\u04ba', '\\u04c7', '\\u050a'],\n    i: ['\\u0f0f'],\n    j: ['\\u0134'],\n    k: ['\\u0138', '\\u04a0', '\\u04c3', '\\u051e'],\n    l: ['\\u0139'],\n    m: ['\\u028d', '\\u04cd', '\\u04ce', '\\u0520', '\\u0521', '\\u0d69'],\n    n: ['\\u00d1', '\\u014b', '\\u019d', '\\u0376', '\\u03a0', '\\u048a'],\n    o: ['\\u00d8', '\\u00f5', '\\u00f8', '\\u01fe', '\\u0298', '\\u047a', '\\u05dd',\n         '\\u06dd', '\\u0e4f'],\n    p: ['\\u01f7', '\\u048e'],\n    q: ['\\u09cd'],\n    r: ['\\u00ae', '\\u01a6', '\\u0210', '\\u024c', '\\u0280', '\\u042f'],\n    s: ['\\u00a7', '\\u03de', '\\u03df', '\\u03e8'],\n    t: ['\\u0141', '\\u0166', '\\u0373'],\n    u: ['\\u01b1', '\\u054d'],\n    v: ['\\u05d8'],\n    w: ['\\u0428', '\\u0460', '\\u047c', '\\u0d70'],\n    x: ['\\u04b2', '\\u04fe', '\\u04fc', '\\u04fd'],\n    y: ['\\u00a5', '\\u04b0', '\\u04cb'],\n    z: ['\\u01b5', '\\u0240'],\n  };\n  text.forEach(function(c) {\n    c = c.toLowerCase();\n    var chars = trap[c] || [' '];\n    var rand = Math.floor(Math.random() * chars.length);\n    if (typeof trap[c] !== 'undefined') {\n      result += trap[c][rand];\n    } else {\n      result += c;\n    }\n  });\n  return result;\n};\n\n\n/***/ }),\n/* 581 */\n/***/ (function(module, exports) {\n\n// please no\nmodule['exports'] = function zalgo(text, options) {\n  text = text || '   he is here   ';\n  var soul = {\n    'up': [\n      '̍', '̎', '̄', '̅',\n      '̿', '̑', '̆', '̐',\n      '͒', '͗', '͑', '̇',\n      '̈', '̊', '͂', '̓',\n      '̈', '͊', '͋', '͌',\n      '̃', '̂', '̌', '͐',\n      '̀', '́', '̋', '̏',\n      '̒', '̓', '̔', '̽',\n      '̉', 'ͣ', 'ͤ', 'ͥ',\n      'ͦ', 'ͧ', 'ͨ', 'ͩ',\n      'ͪ', 'ͫ', 'ͬ', 'ͭ',\n      'ͮ', 'ͯ', '̾', '͛',\n      '͆', '̚',\n    ],\n    'down': [\n      '̖', '̗', '̘', '̙',\n      '̜', '̝', '̞', '̟',\n      '̠', '̤', '̥', '̦',\n      '̩', '̪', '̫', '̬',\n      '̭', '̮', '̯', '̰',\n      '̱', '̲', '̳', '̹',\n      '̺', '̻', '̼', 'ͅ',\n      '͇', '͈', '͉', '͍',\n      '͎', '͓', '͔', '͕',\n      '͖', '͙', '͚', '̣',\n    ],\n    'mid': [\n      '̕', '̛', '̀', '́',\n      '͘', '̡', '̢', '̧',\n      '̨', '̴', '̵', '̶',\n      '͜', '͝', '͞',\n      '͟', '͠', '͢', '̸',\n      '̷', '͡', ' ҉',\n    ],\n  };\n  var all = [].concat(soul.up, soul.down, soul.mid);\n\n  function randomNumber(range) {\n    var r = Math.floor(Math.random() * range);\n    return r;\n  }\n\n  function isChar(character) {\n    var bool = false;\n    all.filter(function(i) {\n      bool = (i === character);\n    });\n    return bool;\n  }\n\n\n  function heComes(text, options) {\n    var result = '';\n    var counts;\n    var l;\n    options = options || {};\n    options['up'] =\n      typeof options['up'] !== 'undefined' ? options['up'] : true;\n    options['mid'] =\n      typeof options['mid'] !== 'undefined' ? options['mid'] : true;\n    options['down'] =\n      typeof options['down'] !== 'undefined' ? options['down'] : true;\n    options['size'] =\n      typeof options['size'] !== 'undefined' ? options['size'] : 'maxi';\n    text = text.split('');\n    for (l in text) {\n      if (isChar(l)) {\n        continue;\n      }\n      result = result + text[l];\n      counts = {'up': 0, 'down': 0, 'mid': 0};\n      switch (options.size) {\n      case 'mini':\n        counts.up = randomNumber(8);\n        counts.mid = randomNumber(2);\n        counts.down = randomNumber(8);\n        break;\n      case 'maxi':\n        counts.up = randomNumber(16) + 3;\n        counts.mid = randomNumber(4) + 1;\n        counts.down = randomNumber(64) + 3;\n        break;\n      default:\n        counts.up = randomNumber(8) + 1;\n        counts.mid = randomNumber(6) / 2;\n        counts.down = randomNumber(8) + 1;\n        break;\n      }\n\n      var arr = ['up', 'mid', 'down'];\n      for (var d in arr) {\n        var index = arr[d];\n        for (var i = 0; i <= counts[index]; i++) {\n          if (options[index]) {\n            result = result + soul[index][randomNumber(soul[index].length)];\n          }\n        }\n      }\n    }\n    return result;\n  }\n  // don't summon him\n  return heComes(text, options);\n};\n\n\n\n/***/ }),\n/* 582 */\n/***/ (function(module, exports) {\n\nmodule['exports'] = function(colors) {\n  return function(letter, i, exploded) {\n    if (letter === ' ') return letter;\n    switch (i%3) {\n      case 0: return colors.red(letter);\n      case 1: return colors.white(letter);\n      case 2: return colors.blue(letter);\n    }\n  };\n};\n\n\n/***/ }),\n/* 583 */\n/***/ (function(module, exports) {\n\nmodule['exports'] = function(colors) {\n  // RoY G BiV\n  var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta'];\n  return function(letter, i, exploded) {\n    if (letter === ' ') {\n      return letter;\n    } else {\n      return colors[rainbowColors[i++ % rainbowColors.length]](letter);\n    }\n  };\n};\n\n\n\n/***/ }),\n/* 584 */\n/***/ (function(module, exports) {\n\nmodule['exports'] = function(colors) {\n  var available = ['underline', 'inverse', 'grey', 'yellow', 'red', 'green',\n    'blue', 'white', 'cyan', 'magenta'];\n  return function(letter, i, exploded) {\n    return letter === ' ' ? letter :\n      colors[\n        available[Math.round(Math.random() * (available.length - 2))]\n      ](letter);\n  };\n};\n\n\n/***/ }),\n/* 585 */\n/***/ (function(module, exports) {\n\nmodule['exports'] = function(colors) {\n  return function(letter, i, exploded) {\n    return i % 2 === 0 ? letter : colors.inverse(letter);\n  };\n};\n\n\n/***/ }),\n/* 586 */\n/***/ (function(module, exports) {\n\n/*\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n\nvar styles = {};\nmodule['exports'] = styles;\n\nvar codes = {\n  reset: [0, 0],\n\n  bold: [1, 22],\n  dim: [2, 22],\n  italic: [3, 23],\n  underline: [4, 24],\n  inverse: [7, 27],\n  hidden: [8, 28],\n  strikethrough: [9, 29],\n\n  black: [30, 39],\n  red: [31, 39],\n  green: [32, 39],\n  yellow: [33, 39],\n  blue: [34, 39],\n  magenta: [35, 39],\n  cyan: [36, 39],\n  white: [37, 39],\n  gray: [90, 39],\n  grey: [90, 39],\n\n  bgBlack: [40, 49],\n  bgRed: [41, 49],\n  bgGreen: [42, 49],\n  bgYellow: [43, 49],\n  bgBlue: [44, 49],\n  bgMagenta: [45, 49],\n  bgCyan: [46, 49],\n  bgWhite: [47, 49],\n\n  // legacy styles for colors pre v1.0.0\n  blackBG: [40, 49],\n  redBG: [41, 49],\n  greenBG: [42, 49],\n  yellowBG: [43, 49],\n  blueBG: [44, 49],\n  magentaBG: [45, 49],\n  cyanBG: [46, 49],\n  whiteBG: [47, 49],\n\n};\n\nObject.keys(codes).forEach(function(key) {\n  var val = codes[key];\n  var style = styles[key] = [];\n  style.open = '\\u001b[' + val[0] + 'm';\n  style.close = '\\u001b[' + val[1] + 'm';\n});\n\n\n/***/ }),\n/* 587 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*\nMIT License\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n\n\nmodule.exports = function(flag, argv) {\n  argv = argv || process.argv;\n\n  var terminatorPos = argv.indexOf('--');\n  var prefix = /^-{1,2}/.test(flag) ? '' : '--';\n  var pos = argv.indexOf(prefix + flag);\n\n  return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);\n};\n\n\n/***/ }),\n/* 588 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*\nThe MIT License (MIT)\n\nCopyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n*/\n\n\n\nvar os = __webpack_require__(42);\nvar hasFlag = __webpack_require__(587);\n\nvar env = process.env;\n\nvar forceColor = void 0;\nif (hasFlag('no-color') || hasFlag('no-colors') || hasFlag('color=false')) {\n  forceColor = false;\n} else if (hasFlag('color') || hasFlag('colors') || hasFlag('color=true')\n           || hasFlag('color=always')) {\n  forceColor = true;\n}\nif ('FORCE_COLOR' in env) {\n  forceColor = env.FORCE_COLOR.length === 0\n    || parseInt(env.FORCE_COLOR, 10) !== 0;\n}\n\nfunction translateLevel(level) {\n  if (level === 0) {\n    return false;\n  }\n\n  return {\n    level: level,\n    hasBasic: true,\n    has256: level >= 2,\n    has16m: level >= 3,\n  };\n}\n\nfunction supportsColor(stream) {\n  if (forceColor === false) {\n    return 0;\n  }\n\n  if (hasFlag('color=16m') || hasFlag('color=full')\n      || hasFlag('color=truecolor')) {\n    return 3;\n  }\n\n  if (hasFlag('color=256')) {\n    return 2;\n  }\n\n  if (stream && !stream.isTTY && forceColor !== true) {\n    return 0;\n  }\n\n  var min = forceColor ? 1 : 0;\n\n  if (process.platform === 'win32') {\n    // Node.js 7.5.0 is the first version of Node.js to include a patch to\n    // libuv that enables 256 color output on Windows. Anything earlier and it\n    // won't work. However, here we target Node.js 8 at minimum as it is an LTS\n    // release, and Node.js 7 is not. Windows 10 build 10586 is the first\n    // Windows release that supports 256 colors. Windows 10 build 14931 is the\n    // first release that supports 16m/TrueColor.\n    var osRelease = os.release().split('.');\n    if (Number(process.versions.node.split('.')[0]) >= 8\n        && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) {\n      return Number(osRelease[2]) >= 14931 ? 3 : 2;\n    }\n\n    return 1;\n  }\n\n  if ('CI' in env) {\n    if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI'].some(function(sign) {\n      return sign in env;\n    }) || env.CI_NAME === 'codeship') {\n      return 1;\n    }\n\n    return min;\n  }\n\n  if ('TEAMCITY_VERSION' in env) {\n    return (/^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0\n    );\n  }\n\n  if ('TERM_PROGRAM' in env) {\n    var version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n    switch (env.TERM_PROGRAM) {\n      case 'iTerm.app':\n        return version >= 3 ? 3 : 2;\n      case 'Hyper':\n        return 3;\n      case 'Apple_Terminal':\n        return 2;\n      // No default\n    }\n  }\n\n  if (/-256(color)?$/i.test(env.TERM)) {\n    return 2;\n  }\n\n  if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n    return 1;\n  }\n\n  if ('COLORTERM' in env) {\n    return 1;\n  }\n\n  if (env.TERM === 'dumb') {\n    return min;\n  }\n\n  return min;\n}\n\nfunction getSupportLevel(stream) {\n  var level = supportsColor(stream);\n  return translateLevel(level);\n}\n\nmodule.exports = {\n  supportsColor: getSupportLevel,\n  stdout: getSupportLevel(process.stdout),\n  stderr: getSupportLevel(process.stderr),\n};\n\n\n/***/ }),\n/* 589 */\n/***/ (function(module, exports, __webpack_require__) {\n\n//\n// Remark: Requiring this file will use the \"safe\" colors API,\n// which will not touch String.prototype.\n//\n//   var colors = require('colors/safe');\n//   colors.red(\"foo\")\n//\n//\nvar colors = __webpack_require__(579);\nmodule['exports'] = colors;\n\n\n/***/ }),\n/* 590 */\n/***/ (function(module, exports) {\n\nmodule.exports = defer;\n\n/**\n * Runs provided function on next iteration of the event loop\n *\n * @param {function} fn - function to run\n */\nfunction defer(fn)\n{\n  var nextTick = typeof setImmediate == 'function'\n    ? setImmediate\n    : (\n      typeof process == 'object' && typeof process.nextTick == 'function'\n      ? process.nextTick\n      : null\n    );\n\n  if (nextTick)\n  {\n    nextTick(fn);\n  }\n  else\n  {\n    setTimeout(fn, 0);\n  }\n}\n\n\n/***/ }),\n/* 591 */\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(595);\nmodule.exports = __webpack_require__(31).Object.assign;\n\n\n/***/ }),\n/* 592 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// 19.1.2.1 Object.assign(target, source, ...)\nvar getKeys = __webpack_require__(172);\nvar gOPS = __webpack_require__(593);\nvar pIE = __webpack_require__(594);\nvar toObject = __webpack_require__(173);\nvar IObject = __webpack_require__(171);\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || __webpack_require__(112)(function () {\n  var A = {};\n  var B = {};\n  // eslint-disable-next-line no-undef\n  var S = Symbol();\n  var K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) { B[k] = k; });\n  return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n  var T = toObject(target);\n  var aLen = arguments.length;\n  var index = 1;\n  var getSymbols = gOPS.f;\n  var isEnum = pIE.f;\n  while (aLen > index) {\n    var S = IObject(arguments[index++]);\n    var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n    var length = keys.length;\n    var j = 0;\n    var key;\n    while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n  } return T;\n} : $assign;\n\n\n/***/ }),\n/* 593 */\n/***/ (function(module, exports) {\n\nexports.f = Object.getOwnPropertySymbols;\n\n\n/***/ }),\n/* 594 */\n/***/ (function(module, exports) {\n\nexports.f = {}.propertyIsEnumerable;\n\n\n/***/ }),\n/* 595 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// 19.1.3.1 Object.assign(target, source)\nvar $export = __webpack_require__(60);\n\n$export($export.S + $export.F, 'Object', { assign: __webpack_require__(592) });\n\n\n/***/ }),\n/* 596 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar arrayFindIndex = __webpack_require__(479);\n\nmodule.exports = function () {\n\tvar unhandledRejections = [];\n\n\tfunction onUnhandledRejection(reason, promise) {\n\t\tunhandledRejections.push({reason: reason, promise: promise});\n\t}\n\n\tfunction onRejectionHandled(promise) {\n\t\tvar index = arrayFindIndex(unhandledRejections, function (x) {\n\t\t\treturn x.promise === promise;\n\t\t});\n\n\t\tunhandledRejections.splice(index, 1);\n\t}\n\n\tfunction currentlyUnhandled() {\n\t\treturn unhandledRejections.map(function (entry) {\n\t\t\treturn {\n\t\t\t\treason: entry.reason,\n\t\t\t\tpromise: entry.promise\n\t\t\t};\n\t\t});\n\t}\n\n\treturn {\n\t\tonUnhandledRejection: onUnhandledRejection,\n\t\tonRejectionHandled: onRejectionHandled,\n\t\tcurrentlyUnhandled: currentlyUnhandled\n\t};\n};\n\n\n/***/ }),\n/* 597 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar core = __webpack_require__(596);\n\nmodule.exports = function (p) {\n\tp = p || process;\n\tvar c = core();\n\n\tp.on('unhandledRejection', c.onUnhandledRejection);\n\tp.on('rejectionHandled', c.onRejectionHandled);\n\n\treturn c.currentlyUnhandled;\n};\n\n\n/***/ }),\n/* 598 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar token = '%[a-f0-9]{2}';\nvar singleMatcher = new RegExp(token, 'gi');\nvar multiMatcher = new RegExp('(' + token + ')+', 'gi');\n\nfunction decodeComponents(components, split) {\n\ttry {\n\t\t// Try to decode the entire string first\n\t\treturn decodeURIComponent(components.join(''));\n\t} catch (err) {\n\t\t// Do nothing\n\t}\n\n\tif (components.length === 1) {\n\t\treturn components;\n\t}\n\n\tsplit = split || 1;\n\n\t// Split the array in 2 parts\n\tvar left = components.slice(0, split);\n\tvar right = components.slice(split);\n\n\treturn Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));\n}\n\nfunction decode(input) {\n\ttry {\n\t\treturn decodeURIComponent(input);\n\t} catch (err) {\n\t\tvar tokens = input.match(singleMatcher);\n\n\t\tfor (var i = 1; i < tokens.length; i++) {\n\t\t\tinput = decodeComponents(tokens, i).join('');\n\n\t\t\ttokens = input.match(singleMatcher);\n\t\t}\n\n\t\treturn input;\n\t}\n}\n\nfunction customDecodeURIComponent(input) {\n\t// Keep track of all the replacements and prefill the map with the `BOM`\n\tvar replaceMap = {\n\t\t'%FE%FF': '\\uFFFD\\uFFFD',\n\t\t'%FF%FE': '\\uFFFD\\uFFFD'\n\t};\n\n\tvar match = multiMatcher.exec(input);\n\twhile (match) {\n\t\ttry {\n\t\t\t// Decode as big chunks as possible\n\t\t\treplaceMap[match[0]] = decodeURIComponent(match[0]);\n\t\t} catch (err) {\n\t\t\tvar result = decode(match[0]);\n\n\t\t\tif (result !== match[0]) {\n\t\t\t\treplaceMap[match[0]] = result;\n\t\t\t}\n\t\t}\n\n\t\tmatch = multiMatcher.exec(input);\n\t}\n\n\t// Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else\n\treplaceMap['%C2'] = '\\uFFFD';\n\n\tvar entries = Object.keys(replaceMap);\n\n\tfor (var i = 0; i < entries.length; i++) {\n\t\t// Replace all decoded components\n\t\tvar key = entries[i];\n\t\tinput = input.replace(new RegExp(key, 'g'), replaceMap[key]);\n\t}\n\n\treturn input;\n}\n\nmodule.exports = function (encodedURI) {\n\tif (typeof encodedURI !== 'string') {\n\t\tthrow new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');\n\t}\n\n\ttry {\n\t\tencodedURI = encodedURI.replace(/\\+/g, ' ');\n\n\t\t// Try the built in decoder first\n\t\treturn decodeURIComponent(encodedURI);\n\t} catch (err) {\n\t\t// Fallback to a more advanced decoder\n\t\treturn customDecodeURIComponent(encodedURI);\n\t}\n};\n\n\n/***/ }),\n/* 599 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar pSlice = Array.prototype.slice;\nvar objectKeys = __webpack_require__(601);\nvar isArguments = __webpack_require__(600);\n\nvar deepEqual = module.exports = function (actual, expected, opts) {\n  if (!opts) opts = {};\n  // 7.1. All identical values are equivalent, as determined by ===.\n  if (actual === expected) {\n    return true;\n\n  } else if (actual instanceof Date && expected instanceof Date) {\n    return actual.getTime() === expected.getTime();\n\n  // 7.3. Other pairs that do not both pass typeof value == 'object',\n  // equivalence is determined by ==.\n  } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {\n    return opts.strict ? actual === expected : actual == expected;\n\n  // 7.4. For all other Object pairs, including Array objects, equivalence is\n  // determined by having the same number of owned properties (as verified\n  // with Object.prototype.hasOwnProperty.call), the same set of keys\n  // (although not necessarily the same order), equivalent values for every\n  // corresponding key, and an identical 'prototype' property. Note: this\n  // accounts for both named and indexed properties on Arrays.\n  } else {\n    return objEquiv(actual, expected, opts);\n  }\n}\n\nfunction isUndefinedOrNull(value) {\n  return value === null || value === undefined;\n}\n\nfunction isBuffer (x) {\n  if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;\n  if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {\n    return false;\n  }\n  if (x.length > 0 && typeof x[0] !== 'number') return false;\n  return true;\n}\n\nfunction objEquiv(a, b, opts) {\n  var i, key;\n  if (isUndefinedOrNull(a) || isUndefinedOrNull(b))\n    return false;\n  // an identical 'prototype' property.\n  if (a.prototype !== b.prototype) return false;\n  //~~~I've managed to break Object.keys through screwy arguments passing.\n  //   Converting to array solves the problem.\n  if (isArguments(a)) {\n    if (!isArguments(b)) {\n      return false;\n    }\n    a = pSlice.call(a);\n    b = pSlice.call(b);\n    return deepEqual(a, b, opts);\n  }\n  if (isBuffer(a)) {\n    if (!isBuffer(b)) {\n      return false;\n    }\n    if (a.length !== b.length) return false;\n    for (i = 0; i < a.length; i++) {\n      if (a[i] !== b[i]) return false;\n    }\n    return true;\n  }\n  try {\n    var ka = objectKeys(a),\n        kb = objectKeys(b);\n  } catch (e) {//happens when one is a string literal and the other isn't\n    return false;\n  }\n  // having the same number of owned properties (keys incorporates\n  // hasOwnProperty)\n  if (ka.length != kb.length)\n    return false;\n  //the same set of keys (although not necessarily the same order),\n  ka.sort();\n  kb.sort();\n  //~~~cheap key test\n  for (i = ka.length - 1; i >= 0; i--) {\n    if (ka[i] != kb[i])\n      return false;\n  }\n  //equivalent values for every corresponding key, and\n  //~~~possibly expensive deep test\n  for (i = ka.length - 1; i >= 0; i--) {\n    key = ka[i];\n    if (!deepEqual(a[key], b[key], opts)) return false;\n  }\n  return typeof a === typeof b;\n}\n\n\n/***/ }),\n/* 600 */\n/***/ (function(module, exports) {\n\nvar supportsArgumentsClass = (function(){\n  return Object.prototype.toString.call(arguments)\n})() == '[object Arguments]';\n\nexports = module.exports = supportsArgumentsClass ? supported : unsupported;\n\nexports.supported = supported;\nfunction supported(object) {\n  return Object.prototype.toString.call(object) == '[object Arguments]';\n};\n\nexports.unsupported = unsupported;\nfunction unsupported(object){\n  return object &&\n    typeof object == 'object' &&\n    typeof object.length == 'number' &&\n    Object.prototype.hasOwnProperty.call(object, 'callee') &&\n    !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||\n    false;\n};\n\n\n/***/ }),\n/* 601 */\n/***/ (function(module, exports) {\n\nexports = module.exports = typeof Object.keys === 'function'\n  ? Object.keys : shim;\n\nexports.shim = shim;\nfunction shim (obj) {\n  var keys = [];\n  for (var key in obj) keys.push(key);\n  return keys;\n}\n\n\n/***/ }),\n/* 602 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Stream = __webpack_require__(23).Stream;\nvar util = __webpack_require__(3);\n\nmodule.exports = DelayedStream;\nfunction DelayedStream() {\n  this.source = null;\n  this.dataSize = 0;\n  this.maxDataSize = 1024 * 1024;\n  this.pauseStream = true;\n\n  this._maxDataSizeExceeded = false;\n  this._released = false;\n  this._bufferedEvents = [];\n}\nutil.inherits(DelayedStream, Stream);\n\nDelayedStream.create = function(source, options) {\n  var delayedStream = new this();\n\n  options = options || {};\n  for (var option in options) {\n    delayedStream[option] = options[option];\n  }\n\n  delayedStream.source = source;\n\n  var realEmit = source.emit;\n  source.emit = function() {\n    delayedStream._handleEmit(arguments);\n    return realEmit.apply(source, arguments);\n  };\n\n  source.on('error', function() {});\n  if (delayedStream.pauseStream) {\n    source.pause();\n  }\n\n  return delayedStream;\n};\n\nObject.defineProperty(DelayedStream.prototype, 'readable', {\n  configurable: true,\n  enumerable: true,\n  get: function() {\n    return this.source.readable;\n  }\n});\n\nDelayedStream.prototype.setEncoding = function() {\n  return this.source.setEncoding.apply(this.source, arguments);\n};\n\nDelayedStream.prototype.resume = function() {\n  if (!this._released) {\n    this.release();\n  }\n\n  this.source.resume();\n};\n\nDelayedStream.prototype.pause = function() {\n  this.source.pause();\n};\n\nDelayedStream.prototype.release = function() {\n  this._released = true;\n\n  this._bufferedEvents.forEach(function(args) {\n    this.emit.apply(this, args);\n  }.bind(this));\n  this._bufferedEvents = [];\n};\n\nDelayedStream.prototype.pipe = function() {\n  var r = Stream.prototype.pipe.apply(this, arguments);\n  this.resume();\n  return r;\n};\n\nDelayedStream.prototype._handleEmit = function(args) {\n  if (this._released) {\n    this.emit.apply(this, args);\n    return;\n  }\n\n  if (args[0] === 'data') {\n    this.dataSize += args[1].length;\n    this._checkIfMaxDataSizeExceeded();\n  }\n\n  this._bufferedEvents.push(args);\n};\n\nDelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {\n  if (this._maxDataSizeExceeded) {\n    return;\n  }\n\n  if (this.dataSize <= this.maxDataSize) {\n    return;\n  }\n\n  this._maxDataSizeExceeded = true;\n  var message =\n    'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'\n  this.emit('error', new Error(message));\n};\n\n\n/***/ }),\n/* 603 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// detect either spaces or tabs but not both to properly handle tabs\n// for indentation and spaces for alignment\nconst INDENT_RE = /^(?:( )+|\\t+)/;\n\nfunction getMostUsed(indents) {\n\tlet result = 0;\n\tlet maxUsed = 0;\n\tlet maxWeight = 0;\n\n\tfor (const entry of indents) {\n\t\t// TODO: use destructuring when targeting Node.js 6\n\t\tconst key = entry[0];\n\t\tconst val = entry[1];\n\n\t\tconst u = val[0];\n\t\tconst w = val[1];\n\n\t\tif (u > maxUsed || (u === maxUsed && w > maxWeight)) {\n\t\t\tmaxUsed = u;\n\t\t\tmaxWeight = w;\n\t\t\tresult = Number(key);\n\t\t}\n\t}\n\n\treturn result;\n}\n\nmodule.exports = str => {\n\tif (typeof str !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\t// used to see if tabs or spaces are the most used\n\tlet tabs = 0;\n\tlet spaces = 0;\n\n\t// remember the size of previous line's indentation\n\tlet prev = 0;\n\n\t// remember how many indents/unindents as occurred for a given size\n\t// and how much lines follow a given indentation\n\t//\n\t// indents = {\n\t//    3: [1, 0],\n\t//    4: [1, 5],\n\t//    5: [1, 0],\n\t//   12: [1, 0],\n\t// }\n\tconst indents = new Map();\n\n\t// pointer to the array of last used indent\n\tlet current;\n\n\t// whether the last action was an indent (opposed to an unindent)\n\tlet isIndent;\n\n\tfor (const line of str.split(/\\n/g)) {\n\t\tif (!line) {\n\t\t\t// ignore empty lines\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet indent;\n\t\tconst matches = line.match(INDENT_RE);\n\n\t\tif (matches) {\n\t\t\tindent = matches[0].length;\n\n\t\t\tif (matches[1]) {\n\t\t\t\tspaces++;\n\t\t\t} else {\n\t\t\t\ttabs++;\n\t\t\t}\n\t\t} else {\n\t\t\tindent = 0;\n\t\t}\n\n\t\tconst diff = indent - prev;\n\t\tprev = indent;\n\n\t\tif (diff) {\n\t\t\t// an indent or unindent has been detected\n\n\t\t\tisIndent = diff > 0;\n\n\t\t\tcurrent = indents.get(isIndent ? diff : -diff);\n\n\t\t\tif (current) {\n\t\t\t\tcurrent[0]++;\n\t\t\t} else {\n\t\t\t\tcurrent = [1, 0];\n\t\t\t\tindents.set(diff, current);\n\t\t\t}\n\t\t} else if (current) {\n\t\t\t// if the last action was an indent, increment the weight\n\t\t\tcurrent[1] += Number(isIndent);\n\t\t}\n\t}\n\n\tconst amount = getMostUsed(indents);\n\n\tlet type;\n\tlet indent;\n\tif (!amount) {\n\t\ttype = null;\n\t\tindent = '';\n\t} else if (spaces >= tabs) {\n\t\ttype = 'space';\n\t\tindent = ' '.repeat(amount);\n\t} else {\n\t\ttype = 'tab';\n\t\tindent = '\\t'.repeat(amount);\n\t}\n\n\treturn {\n\t\tamount,\n\t\ttype,\n\t\tindent\n\t};\n};\n\n\n/***/ }),\n/* 604 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n* Copyright (c) 2013, Yahoo! Inc. All rights reserved.\n* Copyrights licensed under the New BSD License.\n* See the accompanying LICENSE file for terms.\n*/\n\nvar CacheObject = function (conf) {\n    conf = conf || {};\n    conf.ttl = parseInt(conf.ttl, 10) || 300; //0 is not permissible\n    conf.cachesize = parseInt(conf.cachesize, 10) || 1000; //0 is not permissible\n    \n    this.ttl = conf.ttl * 1000;\n    this.max = conf.cachesize;\n\n    this.count = 0;\n    this.data = {};\n    var next = __webpack_require__(480);\n\n    this.set = function (key, value, callback) {\n        var self = this;\n        next(function () {\n            if (self.data[key]) {\n                if (self.data[key].newer) {\n                    if (self.data[key].older) {\n                        self.data[key].newer.older = self.data[key].older;\n                        self.data[key].older.newer = self.data[key].newer;\n                    } else {\n                        self.tail = self.data[key].newer;\n                        delete self.tail.older;\n                    }\n\n                    self.data[key].older = self.head;\n                    self.head.newer = self.data[key];\n                    delete self.data[key].newer;\n                    self.head = self.data[key];\n                }\n\n                self.head.val = value;\n                self.head.hit = 0;\n                self.head.ts = Date.now();\n            } else {\n                // key is not exist\n                self.data[key] = {\n                    \"key\" : key,\n                    \"val\" : value,\n                    \"hit\" : 0,\n                    \"ts\" : Date.now()\n                };\n\n                if (!self.head) {\n                    // cache is empty\n                    self.head = self.data[key];\n                    self.tail = self.data[key];\n                } else {\n                    // insert the new entry to the front\n                    self.head.newer = self.data[key];\n                    self.data[key].older = self.head;\n                    self.head = self.data[key];\n                }\n\n                if (self.count >= self.max) {\n                    // remove the tail\n                    var temp = self.tail;\n                    self.tail = self.tail.newer;\n                    delete self.tail.next;\n                    delete self.data[temp.key];\n                } else {\n                    self.count = self.count + 1;\n                }\n            }\n            /* jshint -W030 */\n            callback && callback(null, value);\n        });\n    };\n\n    this.get = function (key, callback) {\n        var self = this;\n        if (!callback) {\n            throw('cache.get callback is required.');\n        }\n\n        next(function () {\n            if (!self.data[key]) {\n                return callback(null, undefined);\n            }\n            var value;\n            if (conf.ttl !== 0 && (Date.now() - self.data[key].ts) >= self.ttl) {\n                if (self.data[key].newer) {\n                    if (self.data[key].older) {\n                        // in the middle of the list\n                        self.data[key].newer.older = self.data[key].older;\n                        self.data[key].older.newer = self.data[key].newer;\n                    } else {\n                        // tail\n                        self.tail = self.data[key].newer;\n                        delete self.tail.older;\n                    }\n                } else {\n                    // the first item\n                    if (self.data[key].older) {\n                        self.head = self.data[key].older;\n                        delete self.head.newer;\n                    } else {\n                        // 1 items\n                        delete self.head;\n                        delete self.tail;\n                    }\n                }\n\n                delete self.data[key];\n                self.count = self.count - 1;\n            } else {\n                self.data[key].hit = self.data[key].hit + 1;\n                value = self.data[key].val;\n            }\n            callback(null, value);\n        });\n    };\n};\n\nmodule.exports = CacheObject;\n\n\n/***/ }),\n/* 605 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n* Copyright (c) 2013, Yahoo! Inc. All rights reserved.\n* Copyrights licensed under the New BSD License.\n* See the accompanying LICENSE file for terms.\n*/\n\nvar CacheObject = __webpack_require__(604),\n    deepCopy = __webpack_require__(749),\n    dns = __webpack_require__(964);\n\n\n// original function storage\nvar EnhanceDns = function (conf) {\n        conf = conf || {};\n        conf.ttl = parseInt(conf.ttl, 10) || 300; //0 is not allowed ie it ttl is set to 0, it will take the default\n        conf.cachesize = parseInt(conf.cachesize, 10); //0 is allowed but it will disable the caching\n\n        if (isNaN(conf.cachesize)) {\n            conf.cachesize = 1000; //set default cache size to 1000 records max\n        }\n        if (!conf.enable || conf.cachesize <= 0 || dns.internalCache) {\n            //cache already exists, means this code has already execute ie method are already overwritten\n            return dns;\n        }\n        \n        // original function storage\n        var backup_object = {\n                lookup : dns.lookup,\n                resolve : dns.resolve,\n                resolve4 : dns.resolve4,\n                resolve6 : dns.resolve6,\n                resolveMx : dns.resolveMx,\n                resolveTxt : dns.resolveTxt,\n                resolveSrv : dns.resolveSrv,\n                resolveNs : dns.resolveNs,\n                resolveCname : dns.resolveCname,\n                reverse : dns.reverse\n            },\n            // cache storage instance\n            cache = conf.cache ? /*istanbul ignore next*/ new conf.cache(conf) : new CacheObject(conf);\n        \n        // insert cache object to the instance\n        dns.internalCache = cache;\n\n        // override dns.lookup method\n        dns.lookup = function (domain, options, callback) {\n            var family = 0;\n            var hints = 0;\n            var all = false;\n            if (arguments.length === 2) {\n                callback = options;\n                options = family;\n            } else if (typeof options === 'object') {\n                if (options.family) {\n                    family = +options.family;\n                    if (family !== 4 && family !== 6) {\n                        callback(new Error('invalid argument: `family` must be 4 or 6'));\n                        return;\n                    }\n                }\n                /*istanbul ignore next - \"hints\" require node 0.12+*/\n                if (options.hints) {\n                    hints = +options.hints;\n                }\n                all = (options.all === true);\n            } else if (options) {\n                family = +options;\n                if (family !== 4 && family !== 6) {\n                    callback(new Error('invalid argument: `family` must be 4 or 6'));\n                    return;\n                }\n            }\n\n            cache.get('lookup_' + domain + '_' + family + '_' + hints + '_' + all, function (error, record) {\n                if (record) {\n                    /*istanbul ignore next - \"all\" option require node 4+*/\n                    if (Array.isArray(record)) {\n                        return callback(error, record);\n                    }\n                    return callback(error, record.address, record.family);\n                }\n\n                try{\n                    backup_object.lookup(domain, options, function (err, address, family_r) {\n                        if (err) {\n                            return callback(err);\n                        }\n                        var value;\n                        /*istanbul ignore next - \"all\" option require node 4+*/\n                        if (Array.isArray(address)) {\n                            value = address;\n                        } else {\n                            value = {\n                                'address' : address,\n                                'family' : family_r\n                            };\n                        }\n                        cache.set('lookup_' + domain + '_' + family + '_' + hints + '_' +  all, value, function () {\n                            callback(err, address, family_r);\n                        });\n                    });\n                } catch (err) {\n                    /*istanbul ignore next - doesn't throw in node 0.10*/\n                    callback(err);\n                }\n            });\n        };\n\n        // override dns.resolve method\n        dns.resolve = function (domain, type, callback) {\n            var type_new, callback_new;\n\n            if (typeof type === 'string') {\n                type_new = type;\n                callback_new = callback;\n            } else {\n                type_new = \"A\";\n                callback_new = type;\n            }\n\n            cache.get('resolve_' + domain + '_' + type_new, function (error, record) {\n                if (record) {\n                    return callback_new(error, deepCopy(record), true);\n                }\n                try {\n                    backup_object.resolve(domain, type_new, function (err, addresses) {\n                        if (err) {\n                            return callback_new(err);\n                        }\n                        cache.set('resolve_' + domain + '_' + type_new, addresses, function () {\n                            callback_new(err, deepCopy(addresses), false);\n                        });\n                    });\n                } catch (err) {\n                    /*istanbul ignore next - doesn't throw in node 0.10*/\n                    callback_new(err);\n                }\n            });\n        };\n\n        // override dns.resolve4 method\n        dns.resolve4 = function (domain, callback) {\n            cache.get('resolve4_' + domain, function (error, record) {\n                if (record) {\n                    return callback(error, deepCopy(record));\n                }\n                try {\n                    backup_object.resolve4(domain, function (err, addresses) {\n                        if (err) {\n                            return callback(err);\n                        }\n                        cache.set('resolve4_' + domain, addresses, function () {\n                            callback(err, deepCopy(addresses));\n                        });\n                    });\n                } catch (err) {\n                    /*istanbul ignore next - doesn't throw in node 0.10*/\n                    callback(err);\n                }\n            });\n        };\n\n        // override dns.resolve6 method\n        dns.resolve6 = function (domain, callback) {\n            cache.get('resolve6_' + domain, function (error, record) {\n                if (record) {\n                    return callback(error, deepCopy(record));\n                }\n                try {\n                    backup_object.resolve6(domain, function (err, addresses) {\n                        if (err) {\n                            return callback(err);\n                        }\n                        cache.set('resolve6_' + domain, addresses, function () {\n                            callback(err, deepCopy(addresses));\n                        });\n                    });\n                } catch (err) {\n                    /*istanbul ignore next - doesn't throw in node 0.10*/\n                    callback(err);\n                }\n            });\n        };\n\n        // override dns.resolveMx method\n        dns.resolveMx = function (domain, callback) {\n            cache.get('resolveMx_' + domain, function (error, record) {\n                if (record) {\n                    return callback(error, deepCopy(record));\n                }\n                try {\n                    backup_object.resolveMx(domain, function (err, addresses) {\n                        if (err) {\n                            return callback(err);\n                        }\n                        cache.set('resolveMx_' + domain, addresses, function () {\n                            callback(err, deepCopy(addresses));\n                        });\n                    });\n                } catch (err) {\n                    /*istanbul ignore next - doesn't throw in node 0.10*/\n                    callback(err);\n                }\n            });\n        };\n\n        // override dns.resolveTxt method\n        dns.resolveTxt = function (domain, callback) {\n            cache.get('resolveTxt_' + domain, function (error, record) {\n                if (record) {\n                    return callback(error, deepCopy(record));\n                }\n                try {\n                    backup_object.resolveTxt(domain, function (err, addresses) {\n                        if (err) {\n                            return callback(err);\n                        }\n                        cache.set('resolveTxt_' + domain, addresses, function () {\n                            callback(err, deepCopy(addresses));\n                        });\n                    });\n                } catch (err) {\n                    /*istanbul ignore next - doesn't throw in node 0.10*/\n                    callback(err);\n                }\n            });\n        };\n\n        // override dns.resolveSrv method\n        dns.resolveSrv = function (domain, callback) {\n            cache.get('resolveSrv_' + domain, function (error, record) {\n                if (record) {\n                    return callback(error, deepCopy(record));\n                }\n                try {\n                    backup_object.resolveSrv(domain, function (err, addresses) {\n                        if (err) {\n                            return callback(err);\n                        }\n                        cache.set('resolveSrv_' + domain, addresses, function () {\n                            callback(err, deepCopy(addresses));\n                        });\n                    });\n                } catch (err) {\n                    /*istanbul ignore next - doesn't throw in node 0.10*/\n                    callback(err);\n                }\n            });\n        };\n\n        // override dns.resolveNs method\n        dns.resolveNs = function (domain, callback) {\n            cache.get('resolveNs_' + domain, function (error, record) {\n                if (record) {\n                    return callback(error, deepCopy(record));\n                }\n                try {\n                    backup_object.resolveNs(domain, function (err, addresses) {\n                        if (err) {\n                            return callback(err);\n                        }\n                        cache.set('resolveNs_' + domain, addresses, function () {\n                            callback(err, deepCopy(addresses));\n                        });\n                    });\n                } catch (err) {\n                    /*istanbul ignore next - doesn't throw in node 0.10*/\n                    callback(err);\n                }\n            });\n        };\n\n        // override dns.resolveCname method\n        dns.resolveCname = function (domain, callback) {\n            cache.get('resolveCname_' + domain, function (error, record) {\n                if (record) {\n                    return callback(error, deepCopy(record));\n                }\n                try {\n                    backup_object.resolveCname(domain, function (err, addresses) {\n                        if (err) {\n                            return callback(err);\n                        }\n                        cache.set('resolveCname_' + domain, addresses, function () {\n                            callback(err, deepCopy(addresses));\n                        });\n                    });\n                } catch (err) {\n                    /*istanbul ignore next - doesn't throw in node 0.10*/\n                    callback(err);\n                }\n            });\n        };\n\n        // override dns.reverse method\n        dns.reverse = function (ip, callback) {\n            cache.get('reverse_' + ip, function (error, record) {\n                if (record) {\n                    return callback(error, deepCopy(record));\n                }\n                try {\n                    backup_object.reverse(ip, function (err, addresses) {\n                        if (err) {\n                            return callback(err);\n                        }\n                        cache.set('reverse_' + ip, addresses, function () {\n                            callback(err, deepCopy(addresses));\n                        });\n                    });\n                } catch (err) {\n                    /*istanbul ignore next - doesn't throw in node 0.10*/\n                    callback(err);\n                }\n            });\n        };\n        return dns;\n};\n\nmodule.exports = function(conf) {\n    return new EnhanceDns(conf);\n};\n\n\n/***/ }),\n/* 606 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Named EC curves\n\n// Requires ec.js, jsbn.js, and jsbn2.js\nvar BigInteger = __webpack_require__(81).BigInteger\nvar ECCurveFp = __webpack_require__(140).ECCurveFp\n\n\n// ----------------\n// X9ECParameters\n\n// constructor\nfunction X9ECParameters(curve,g,n,h) {\n    this.curve = curve;\n    this.g = g;\n    this.n = n;\n    this.h = h;\n}\n\nfunction x9getCurve() {\n    return this.curve;\n}\n\nfunction x9getG() {\n    return this.g;\n}\n\nfunction x9getN() {\n    return this.n;\n}\n\nfunction x9getH() {\n    return this.h;\n}\n\nX9ECParameters.prototype.getCurve = x9getCurve;\nX9ECParameters.prototype.getG = x9getG;\nX9ECParameters.prototype.getN = x9getN;\nX9ECParameters.prototype.getH = x9getH;\n\n// ----------------\n// SECNamedCurves\n\nfunction fromHex(s) { return new BigInteger(s, 16); }\n\nfunction secp128r1() {\n    // p = 2^128 - 2^97 - 1\n    var p = fromHex(\"FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF\");\n    var a = fromHex(\"FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC\");\n    var b = fromHex(\"E87579C11079F43DD824993C2CEE5ED3\");\n    //byte[] S = Hex.decode(\"000E0D4D696E6768756151750CC03A4473D03679\");\n    var n = fromHex(\"FFFFFFFE0000000075A30D1B9038A115\");\n    var h = BigInteger.ONE;\n    var curve = new ECCurveFp(p, a, b);\n    var G = curve.decodePointHex(\"04\"\n                + \"161FF7528B899B2D0C28607CA52C5B86\"\n\t\t+ \"CF5AC8395BAFEB13C02DA292DDED7A83\");\n    return new X9ECParameters(curve, G, n, h);\n}\n\nfunction secp160k1() {\n    // p = 2^160 - 2^32 - 2^14 - 2^12 - 2^9 - 2^8 - 2^7 - 2^3 - 2^2 - 1\n    var p = fromHex(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73\");\n    var a = BigInteger.ZERO;\n    var b = fromHex(\"7\");\n    //byte[] S = null;\n    var n = fromHex(\"0100000000000000000001B8FA16DFAB9ACA16B6B3\");\n    var h = BigInteger.ONE;\n    var curve = new ECCurveFp(p, a, b);\n    var G = curve.decodePointHex(\"04\"\n                + \"3B4C382CE37AA192A4019E763036F4F5DD4D7EBB\"\n                + \"938CF935318FDCED6BC28286531733C3F03C4FEE\");\n    return new X9ECParameters(curve, G, n, h);\n}\n\nfunction secp160r1() {\n    // p = 2^160 - 2^31 - 1\n    var p = fromHex(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF\");\n    var a = fromHex(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC\");\n    var b = fromHex(\"1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45\");\n    //byte[] S = Hex.decode(\"1053CDE42C14D696E67687561517533BF3F83345\");\n    var n = fromHex(\"0100000000000000000001F4C8F927AED3CA752257\");\n    var h = BigInteger.ONE;\n    var curve = new ECCurveFp(p, a, b);\n    var G = curve.decodePointHex(\"04\"\n\t\t+ \"4A96B5688EF573284664698968C38BB913CBFC82\"\n\t\t+ \"23A628553168947D59DCC912042351377AC5FB32\");\n    return new X9ECParameters(curve, G, n, h);\n}\n\nfunction secp192k1() {\n    // p = 2^192 - 2^32 - 2^12 - 2^8 - 2^7 - 2^6 - 2^3 - 1\n    var p = fromHex(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37\");\n    var a = BigInteger.ZERO;\n    var b = fromHex(\"3\");\n    //byte[] S = null;\n    var n = fromHex(\"FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D\");\n    var h = BigInteger.ONE;\n    var curve = new ECCurveFp(p, a, b);\n    var G = curve.decodePointHex(\"04\"\n                + \"DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D\"\n                + \"9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D\");\n    return new X9ECParameters(curve, G, n, h);\n}\n\nfunction secp192r1() {\n    // p = 2^192 - 2^64 - 1\n    var p = fromHex(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF\");\n    var a = fromHex(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC\");\n    var b = fromHex(\"64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1\");\n    //byte[] S = Hex.decode(\"3045AE6FC8422F64ED579528D38120EAE12196D5\");\n    var n = fromHex(\"FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831\");\n    var h = BigInteger.ONE;\n    var curve = new ECCurveFp(p, a, b);\n    var G = curve.decodePointHex(\"04\"\n                + \"188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012\"\n                + \"07192B95FFC8DA78631011ED6B24CDD573F977A11E794811\");\n    return new X9ECParameters(curve, G, n, h);\n}\n\nfunction secp224r1() {\n    // p = 2^224 - 2^96 + 1\n    var p = fromHex(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001\");\n    var a = fromHex(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE\");\n    var b = fromHex(\"B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4\");\n    //byte[] S = Hex.decode(\"BD71344799D5C7FCDC45B59FA3B9AB8F6A948BC5\");\n    var n = fromHex(\"FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D\");\n    var h = BigInteger.ONE;\n    var curve = new ECCurveFp(p, a, b);\n    var G = curve.decodePointHex(\"04\"\n                + \"B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21\"\n                + \"BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34\");\n    return new X9ECParameters(curve, G, n, h);\n}\n\nfunction secp256r1() {\n    // p = 2^224 (2^32 - 1) + 2^192 + 2^96 - 1\n    var p = fromHex(\"FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF\");\n    var a = fromHex(\"FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC\");\n    var b = fromHex(\"5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B\");\n    //byte[] S = Hex.decode(\"C49D360886E704936A6678E1139D26B7819F7E90\");\n    var n = fromHex(\"FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551\");\n    var h = BigInteger.ONE;\n    var curve = new ECCurveFp(p, a, b);\n    var G = curve.decodePointHex(\"04\"\n                + \"6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296\"\n\t\t+ \"4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5\");\n    return new X9ECParameters(curve, G, n, h);\n}\n\n// TODO: make this into a proper hashtable\nfunction getSECCurveByName(name) {\n    if(name == \"secp128r1\") return secp128r1();\n    if(name == \"secp160k1\") return secp160k1();\n    if(name == \"secp160r1\") return secp160r1();\n    if(name == \"secp192k1\") return secp192k1();\n    if(name == \"secp192r1\") return secp192r1();\n    if(name == \"secp224r1\") return secp224r1();\n    if(name == \"secp256r1\") return secp256r1();\n    return null;\n}\n\nmodule.exports = {\n  \"secp128r1\":secp128r1,\n  \"secp160k1\":secp160k1,\n  \"secp160r1\":secp160r1,\n  \"secp192k1\":secp192k1,\n  \"secp192r1\":secp192r1,\n  \"secp224r1\":secp224r1,\n  \"secp256r1\":secp256r1\n}\n\n\n/***/ }),\n/* 607 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * expand-brackets <https://github.com/jonschlinkert/expand-brackets>\n *\n * Copyright (c) 2015 Jon Schlinkert.\n * Licensed under the MIT license.\n */\n\n\n\nvar isPosixBracket = __webpack_require__(739);\n\n/**\n * POSIX character classes\n */\n\nvar POSIX = {\n  alnum: 'a-zA-Z0-9',\n  alpha: 'a-zA-Z',\n  blank: ' \\\\t',\n  cntrl: '\\\\x00-\\\\x1F\\\\x7F',\n  digit: '0-9',\n  graph: '\\\\x21-\\\\x7E',\n  lower: 'a-z',\n  print: '\\\\x20-\\\\x7E',\n  punct: '-!\"#$%&\\'()\\\\*+,./:;<=>?@[\\\\]^_`{|}~',\n  space: ' \\\\t\\\\r\\\\n\\\\v\\\\f',\n  upper: 'A-Z',\n  word:  'A-Za-z0-9_',\n  xdigit: 'A-Fa-f0-9',\n};\n\n/**\n * Expose `brackets`\n */\n\nmodule.exports = brackets;\n\nfunction brackets(str) {\n  if (!isPosixBracket(str)) {\n    return str;\n  }\n\n  var negated = false;\n  if (str.indexOf('[^') !== -1) {\n    negated = true;\n    str = str.split('[^').join('[');\n  }\n  if (str.indexOf('[!') !== -1) {\n    negated = true;\n    str = str.split('[!').join('[');\n  }\n\n  var a = str.split('[');\n  var b = str.split(']');\n  var imbalanced = a.length !== b.length;\n\n  var parts = str.split(/(?::\\]\\[:|\\[?\\[:|:\\]\\]?)/);\n  var len = parts.length, i = 0;\n  var end = '', beg = '';\n  var res = [];\n\n  // start at the end (innermost) first\n  while (len--) {\n    var inner = parts[i++];\n    if (inner === '^[!' || inner === '[!') {\n      inner = '';\n      negated = true;\n    }\n\n    var prefix = negated ? '^' : '';\n    var ch = POSIX[inner];\n\n    if (ch) {\n      res.push('[' + prefix + ch + ']');\n    } else if (inner) {\n      if (/^\\[?\\w-\\w\\]?$/.test(inner)) {\n        if (i === parts.length) {\n          res.push('[' + prefix + inner);\n        } else if (i === 1) {\n          res.push(prefix + inner + ']');\n        } else {\n          res.push(prefix + inner);\n        }\n      } else {\n        if (i === 1) {\n          beg += inner;\n        } else if (i === parts.length) {\n          end += inner;\n        } else {\n          res.push('[' + prefix + inner + ']');\n        }\n      }\n    }\n  }\n\n  var result = res.join('|');\n  var rlen = res.length || 1;\n  if (rlen > 1) {\n    result = '(?:' + result + ')';\n    rlen = 1;\n  }\n  if (beg) {\n    rlen++;\n    if (beg.charAt(0) === '[') {\n      if (imbalanced) {\n        beg = '\\\\[' + beg.slice(1);\n      } else {\n        beg += ']';\n      }\n    }\n    result = beg + result;\n  }\n  if (end) {\n    rlen++;\n    if (end.slice(-1) === ']') {\n      if (imbalanced) {\n        end = end.slice(0, end.length - 1) + '\\\\]';\n      } else {\n        end = '[' + end;\n      }\n    }\n    result += end;\n  }\n\n  if (rlen > 1) {\n    result = result.split('][').join(']|[');\n    if (result.indexOf('|') !== -1 && !/\\(\\?/.test(result)) {\n      result = '(?:' + result + ')';\n    }\n  }\n\n  result = result.replace(/\\[+=|=\\]+/g, '\\\\b');\n  return result;\n}\n\nbrackets.makeRe = function(pattern) {\n  try {\n    return new RegExp(brackets(pattern));\n  } catch (err) {}\n};\n\nbrackets.isMatch = function(str, pattern) {\n  try {\n    return brackets.makeRe(pattern).test(str);\n  } catch (err) {\n    return false;\n  }\n};\n\nbrackets.match = function(arr, pattern) {\n  var len = arr.length, i = 0;\n  var res = arr.slice();\n\n  var re = brackets.makeRe(pattern);\n  while (i < len) {\n    var ele = arr[i++];\n    if (!re.test(ele)) {\n      continue;\n    }\n    res.splice(i, 1);\n  }\n  return res;\n};\n\n\n/***/ }),\n/* 608 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * expand-range <https://github.com/jonschlinkert/expand-range>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT license.\n */\n\n\n\nvar fill = __webpack_require__(609);\n\nmodule.exports = function expandRange(str, options, fn) {\n  if (typeof str !== 'string') {\n    throw new TypeError('expand-range expects a string.');\n  }\n\n  if (typeof options === 'function') {\n    fn = options;\n    options = {};\n  }\n\n  if (typeof options === 'boolean') {\n    options = {};\n    options.makeRe = true;\n  }\n\n  // create arguments to pass to fill-range\n  var opts = options || {};\n  var args = str.split('..');\n  var len = args.length;\n  if (len > 3) { return str; }\n\n  // if only one argument, it can't expand so return it\n  if (len === 1) { return args; }\n\n  // if `true`, tell fill-range to regexify the string\n  if (typeof fn === 'boolean' && fn === true) {\n    opts.makeRe = true;\n  }\n\n  args.push(opts);\n  return fill.apply(null, args.concat(fn));\n};\n\n\n/***/ }),\n/* 609 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * fill-range <https://github.com/jonschlinkert/fill-range>\n *\n * Copyright (c) 2014-2018, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n\n\nvar isObject = __webpack_require__(611);\nvar isNumber = __webpack_require__(610);\nvar randomize = __webpack_require__(787);\nvar repeatStr = __webpack_require__(797);\nvar repeat = __webpack_require__(411);\n\n/**\n * Expose `fillRange`\n */\n\nmodule.exports = fillRange;\n\n/**\n * Return a range of numbers or letters.\n *\n * @param  {String} `a` Start of the range\n * @param  {String} `b` End of the range\n * @param  {String} `step` Increment or decrement to use.\n * @param  {Function} `fn` Custom function to modify each element in the range.\n * @return {Array}\n */\n\nfunction fillRange(a, b, step, options, fn) {\n  if (a == null || b == null) {\n    throw new Error('fill-range expects the first and second args to be strings.');\n  }\n\n  if (typeof step === 'function') {\n    fn = step; options = {}; step = null;\n  }\n\n  if (typeof options === 'function') {\n    fn = options; options = {};\n  }\n\n  if (isObject(step)) {\n    options = step; step = '';\n  }\n\n  var expand, regex = false, sep = '';\n  var opts = options || {};\n\n  if (typeof opts.silent === 'undefined') {\n    opts.silent = true;\n  }\n\n  step = step || opts.step;\n\n  // store a ref to unmodified arg\n  var origA = a, origB = b;\n\n  b = (b.toString() === '-0') ? 0 : b;\n\n  if (opts.optimize || opts.makeRe) {\n    step = step ? (step += '~') : step;\n    expand = true;\n    regex = true;\n    sep = '~';\n  }\n\n  // handle special step characters\n  if (typeof step === 'string') {\n    var match = stepRe().exec(step);\n\n    if (match) {\n      var i = match.index;\n      var m = match[0];\n\n      // repeat string\n      if (m === '+') {\n        return repeat(a, b);\n\n      // randomize a, `b` times\n      } else if (m === '?') {\n        return [randomize(a, b)];\n\n      // expand right, no regex reduction\n      } else if (m === '>') {\n        step = step.substr(0, i) + step.substr(i + 1);\n        expand = true;\n\n      // expand to an array, or if valid create a reduced\n      // string for a regex logic `or`\n      } else if (m === '|') {\n        step = step.substr(0, i) + step.substr(i + 1);\n        expand = true;\n        regex = true;\n        sep = m;\n\n      // expand to an array, or if valid create a reduced\n      // string for a regex range\n      } else if (m === '~') {\n        step = step.substr(0, i) + step.substr(i + 1);\n        expand = true;\n        regex = true;\n        sep = m;\n      }\n    } else if (!isNumber(step)) {\n      if (!opts.silent) {\n        throw new TypeError('fill-range: invalid step.');\n      }\n      return null;\n    }\n  }\n\n  if (/[.&*()[\\]^%$#@!]/.test(a) || /[.&*()[\\]^%$#@!]/.test(b)) {\n    if (!opts.silent) {\n      throw new RangeError('fill-range: invalid range arguments.');\n    }\n    return null;\n  }\n\n  // has neither a letter nor number, or has both letters and numbers\n  // this needs to be after the step logic\n  if (!noAlphaNum(a) || !noAlphaNum(b) || hasBoth(a) || hasBoth(b)) {\n    if (!opts.silent) {\n      throw new RangeError('fill-range: invalid range arguments.');\n    }\n    return null;\n  }\n\n  // validate arguments\n  var isNumA = isNumber(zeros(a));\n  var isNumB = isNumber(zeros(b));\n\n  if ((!isNumA && isNumB) || (isNumA && !isNumB)) {\n    if (!opts.silent) {\n      throw new TypeError('fill-range: first range argument is incompatible with second.');\n    }\n    return null;\n  }\n\n  // by this point both are the same, so we\n  // can use A to check going forward.\n  var isNum = isNumA;\n  var num = formatStep(step);\n\n  // is the range alphabetical? or numeric?\n  if (isNum) {\n    // if numeric, coerce to an integer\n    a = +a; b = +b;\n  } else {\n    // otherwise, get the charCode to expand alpha ranges\n    a = a.charCodeAt(0);\n    b = b.charCodeAt(0);\n  }\n\n  // is the pattern descending?\n  var isDescending = a > b;\n\n  // don't create a character class if the args are < 0\n  if (a < 0 || b < 0) {\n    expand = false;\n    regex = false;\n  }\n\n  // detect padding\n  var padding = isPadded(origA, origB);\n  var res, pad, arr = [];\n  var ii = 0;\n\n  // character classes, ranges and logical `or`\n  if (regex) {\n    if (shouldExpand(a, b, num, isNum, padding, opts)) {\n      // make sure the correct separator is used\n      if (sep === '|' || sep === '~') {\n        sep = detectSeparator(a, b, num, isNum, isDescending);\n      }\n      return wrap([origA, origB], sep, opts);\n    }\n  }\n\n  while (isDescending ? (a >= b) : (a <= b)) {\n    if (padding && isNum) {\n      pad = padding(a);\n    }\n\n    // custom function\n    if (typeof fn === 'function') {\n      res = fn(a, isNum, pad, ii++);\n\n    // letters\n    } else if (!isNum) {\n      if (regex && isInvalidChar(a)) {\n        res = null;\n      } else {\n        res = String.fromCharCode(a);\n      }\n\n    // numbers\n    } else {\n      res = formatPadding(a, pad);\n    }\n\n    // add result to the array, filtering any nulled values\n    if (res !== null) arr.push(res);\n\n    // increment or decrement\n    if (isDescending) {\n      a -= num;\n    } else {\n      a += num;\n    }\n  }\n\n  // now that the array is expanded, we need to handle regex\n  // character classes, ranges or logical `or` that wasn't\n  // already handled before the loop\n  if ((regex || expand) && !opts.noexpand) {\n    // make sure the correct separator is used\n    if (sep === '|' || sep === '~') {\n      sep = detectSeparator(a, b, num, isNum, isDescending);\n    }\n    if (arr.length === 1 || a < 0 || b < 0) { return arr; }\n    return wrap(arr, sep, opts);\n  }\n\n  return arr;\n}\n\n/**\n * Wrap the string with the correct regex\n * syntax.\n */\n\nfunction wrap(arr, sep, opts) {\n  if (sep === '~') { sep = '-'; }\n  var str = arr.join(sep);\n  var pre = opts && opts.regexPrefix;\n\n  // regex logical `or`\n  if (sep === '|') {\n    str = pre ? pre + str : str;\n    str = '(' + str + ')';\n  }\n\n  // regex character class\n  if (sep === '-') {\n    str = (pre && pre === '^')\n      ? pre + str\n      : str;\n    str = '[' + str + ']';\n  }\n  return [str];\n}\n\n/**\n * Check for invalid characters\n */\n\nfunction isCharClass(a, b, step, isNum, isDescending) {\n  if (isDescending) { return false; }\n  if (isNum) { return a <= 9 && b <= 9; }\n  if (a < b) { return step === 1; }\n  return false;\n}\n\n/**\n * Detect the correct separator to use\n */\n\nfunction shouldExpand(a, b, num, isNum, padding, opts) {\n  if (isNum && (a > 9 || b > 9)) { return false; }\n  return !padding && num === 1 && a < b;\n}\n\n/**\n * Detect the correct separator to use\n */\n\nfunction detectSeparator(a, b, step, isNum, isDescending) {\n  var isChar = isCharClass(a, b, step, isNum, isDescending);\n  if (!isChar) {\n    return '|';\n  }\n  return '~';\n}\n\n/**\n * Correctly format the step based on type\n */\n\nfunction formatStep(step) {\n  return Math.abs(step >> 0) || 1;\n}\n\n/**\n * Format padding, taking leading `-` into account\n */\n\nfunction formatPadding(ch, pad) {\n  var res = pad ? pad + ch : ch;\n  if (pad && ch.toString().charAt(0) === '-') {\n    res = '-' + pad + ch.toString().substr(1);\n  }\n  return res.toString();\n}\n\n/**\n * Check for invalid characters\n */\n\nfunction isInvalidChar(str) {\n  var ch = toStr(str);\n  return ch === '\\\\'\n    || ch === '['\n    || ch === ']'\n    || ch === '^'\n    || ch === '('\n    || ch === ')'\n    || ch === '`';\n}\n\n/**\n * Convert to a string from a charCode\n */\n\nfunction toStr(ch) {\n  return String.fromCharCode(ch);\n}\n\n\n/**\n * Step regex\n */\n\nfunction stepRe() {\n  return /\\?|>|\\||\\+|\\~/g;\n}\n\n/**\n * Return true if `val` has either a letter\n * or a number\n */\n\nfunction noAlphaNum(val) {\n  return /[a-z0-9]/i.test(val);\n}\n\n/**\n * Return true if `val` has both a letter and\n * a number (invalid)\n */\n\nfunction hasBoth(val) {\n  return /[a-z][0-9]|[0-9][a-z]/i.test(val);\n}\n\n/**\n * Normalize zeros for checks\n */\n\nfunction zeros(val) {\n  if (/^-*0+$/.test(val.toString())) {\n    return '0';\n  }\n  return val;\n}\n\n/**\n * Return true if `val` has leading zeros,\n * or a similar valid pattern.\n */\n\nfunction hasZeros(val) {\n  return /[^.]\\.|^-*0+[0-9]/.test(val);\n}\n\n/**\n * If the string is padded, returns a curried function with\n * the a cached padding string, or `false` if no padding.\n *\n * @param  {*} `origA` String or number.\n * @return {String|Boolean}\n */\n\nfunction isPadded(origA, origB) {\n  if (hasZeros(origA) || hasZeros(origB)) {\n    var alen = length(origA);\n    var blen = length(origB);\n\n    var len = alen >= blen\n      ? alen\n      : blen;\n\n    return function (a) {\n      return repeatStr('0', len - length(a));\n    };\n  }\n  return false;\n}\n\n/**\n * Get the string length of `val`\n */\n\nfunction length(val) {\n  return val.toString().length;\n}\n\n\n/***/ }),\n/* 610 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * is-number <https://github.com/jonschlinkert/is-number>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n\n\nvar typeOf = __webpack_require__(180);\n\nmodule.exports = function isNumber(num) {\n  var type = typeOf(num);\n  if (type !== 'number' && type !== 'string') {\n    return false;\n  }\n  var n = +num;\n  return (n - n + 1) >= 0 && num !== '';\n};\n\n\n/***/ }),\n/* 611 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * isobject <https://github.com/jonschlinkert/isobject>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n\n\nvar isArray = __webpack_require__(398);\n\nmodule.exports = function isObject(val) {\n  return val != null && typeof val === 'object' && isArray(val) === false;\n};\n\n\n/***/ }),\n/* 612 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * extglob <https://github.com/jonschlinkert/extglob>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n\n\n/**\n * Module dependencies\n */\n\nvar isExtglob = __webpack_require__(178);\nvar re, cache = {};\n\n/**\n * Expose `extglob`\n */\n\nmodule.exports = extglob;\n\n/**\n * Convert the given extglob `string` to a regex-compatible\n * string.\n *\n * ```js\n * var extglob = require('extglob');\n * extglob('!(a?(b))');\n * //=> '(?!a(?:b)?)[^/]*?'\n * ```\n *\n * @param {String} `str` The string to convert.\n * @param {Object} `options`\n *   @option {Boolean} [options] `esc` If `false` special characters will not be escaped. Defaults to `true`.\n *   @option {Boolean} [options] `regex` If `true` a regular expression is returned instead of a string.\n * @return {String}\n * @api public\n */\n\n\nfunction extglob(str, opts) {\n  opts = opts || {};\n  var o = {}, i = 0;\n\n  // fix common character reversals\n  // '*!(.js)' => '*.!(js)'\n  str = str.replace(/!\\(([^\\w*()])/g, '$1!(');\n\n  // support file extension negation\n  str = str.replace(/([*\\/])\\.!\\([*]\\)/g, function (m, ch) {\n    if (ch === '/') {\n      return escape('\\\\/[^.]+');\n    }\n    return escape('[^.]+');\n  });\n\n  // create a unique key for caching by\n  // combining the string and options\n  var key = str\n    + String(!!opts.regex)\n    + String(!!opts.contains)\n    + String(!!opts.escape);\n\n  if (cache.hasOwnProperty(key)) {\n    return cache[key];\n  }\n\n  if (!(re instanceof RegExp)) {\n    re = regex();\n  }\n\n  opts.negate = false;\n  var m;\n\n  while (m = re.exec(str)) {\n    var prefix = m[1];\n    var inner = m[3];\n    if (prefix === '!') {\n      opts.negate = true;\n    }\n\n    var id = '__EXTGLOB_' + (i++) + '__';\n    // use the prefix of the _last_ (outtermost) pattern\n    o[id] = wrap(inner, prefix, opts.escape);\n    str = str.split(m[0]).join(id);\n  }\n\n  var keys = Object.keys(o);\n  var len = keys.length;\n\n  // we have to loop again to allow us to convert\n  // patterns in reverse order (starting with the\n  // innermost/last pattern first)\n  while (len--) {\n    var prop = keys[len];\n    str = str.split(prop).join(o[prop]);\n  }\n\n  var result = opts.regex\n    ? toRegex(str, opts.contains, opts.negate)\n    : str;\n\n  result = result.split('.').join('\\\\.');\n\n  // cache the result and return it\n  return (cache[key] = result);\n}\n\n/**\n * Convert `string` to a regex string.\n *\n * @param  {String} `str`\n * @param  {String} `prefix` Character that determines how to wrap the string.\n * @param  {Boolean} `esc` If `false` special characters will not be escaped. Defaults to `true`.\n * @return {String}\n */\n\nfunction wrap(inner, prefix, esc) {\n  if (esc) inner = escape(inner);\n\n  switch (prefix) {\n    case '!':\n      return '(?!' + inner + ')[^/]' + (esc ? '%%%~' : '*?');\n    case '@':\n      return '(?:' + inner + ')';\n    case '+':\n      return '(?:' + inner + ')+';\n    case '*':\n      return '(?:' + inner + ')' + (esc ? '%%' : '*')\n    case '?':\n      return '(?:' + inner + '|)';\n    default:\n      return inner;\n  }\n}\n\nfunction escape(str) {\n  str = str.split('*').join('[^/]%%%~');\n  str = str.split('.').join('\\\\.');\n  return str;\n}\n\n/**\n * extglob regex.\n */\n\nfunction regex() {\n  return /(\\\\?[@?!+*$]\\\\?)(\\(([^()]*?)\\))/;\n}\n\n/**\n * Negation regex\n */\n\nfunction negate(str) {\n  return '(?!^' + str + ').*$';\n}\n\n/**\n * Create the regex to do the matching. If\n * the leading character in the `pattern` is `!`\n * a negation regex is returned.\n *\n * @param {String} `pattern`\n * @param {Boolean} `contains` Allow loose matching.\n * @param {Boolean} `isNegated` True if the pattern is a negation pattern.\n */\n\nfunction toRegex(pattern, contains, isNegated) {\n  var prefix = contains ? '^' : '';\n  var after = contains ? '$' : '';\n  pattern = ('(?:' + pattern + ')' + after);\n  if (isNegated) {\n    pattern = prefix + negate(pattern);\n  }\n  return new RegExp(prefix + pattern);\n}\n\n\n/***/ }),\n/* 613 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * extsprintf.js: extended POSIX-style sprintf\n */\n\nvar mod_assert = __webpack_require__(29);\nvar mod_util = __webpack_require__(3);\n\n/*\n * Public interface\n */\nexports.sprintf = jsSprintf;\nexports.printf = jsPrintf;\nexports.fprintf = jsFprintf;\n\n/*\n * Stripped down version of s[n]printf(3c).  We make a best effort to throw an\n * exception when given a format string we don't understand, rather than\n * ignoring it, so that we won't break existing programs if/when we go implement\n * the rest of this.\n *\n * This implementation currently supports specifying\n *\t- field alignment ('-' flag),\n * \t- zero-pad ('0' flag)\n *\t- always show numeric sign ('+' flag),\n *\t- field width\n *\t- conversions for strings, decimal integers, and floats (numbers).\n *\t- argument size specifiers.  These are all accepted but ignored, since\n *\t  Javascript has no notion of the physical size of an argument.\n *\n * Everything else is currently unsupported, most notably precision, unsigned\n * numbers, non-decimal numbers, and characters.\n */\nfunction jsSprintf(fmt)\n{\n\tvar regex = [\n\t    '([^%]*)',\t\t\t\t/* normal text */\n\t    '%',\t\t\t\t/* start of format */\n\t    '([\\'\\\\-+ #0]*?)',\t\t\t/* flags (optional) */\n\t    '([1-9]\\\\d*)?',\t\t\t/* width (optional) */\n\t    '(\\\\.([1-9]\\\\d*))?',\t\t/* precision (optional) */\n\t    '[lhjztL]*?',\t\t\t/* length mods (ignored) */\n\t    '([diouxXfFeEgGaAcCsSp%jr])'\t/* conversion */\n\t].join('');\n\n\tvar re = new RegExp(regex);\n\tvar args = Array.prototype.slice.call(arguments, 1);\n\tvar flags, width, precision, conversion;\n\tvar left, pad, sign, arg, match;\n\tvar ret = '';\n\tvar argn = 1;\n\n\tmod_assert.equal('string', typeof (fmt));\n\n\twhile ((match = re.exec(fmt)) !== null) {\n\t\tret += match[1];\n\t\tfmt = fmt.substring(match[0].length);\n\n\t\tflags = match[2] || '';\n\t\twidth = match[3] || 0;\n\t\tprecision = match[4] || '';\n\t\tconversion = match[6];\n\t\tleft = false;\n\t\tsign = false;\n\t\tpad = ' ';\n\n\t\tif (conversion == '%') {\n\t\t\tret += '%';\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (args.length === 0)\n\t\t\tthrow (new Error('too few args to sprintf'));\n\n\t\targ = args.shift();\n\t\targn++;\n\n\t\tif (flags.match(/[\\' #]/))\n\t\t\tthrow (new Error(\n\t\t\t    'unsupported flags: ' + flags));\n\n\t\tif (precision.length > 0)\n\t\t\tthrow (new Error(\n\t\t\t    'non-zero precision not supported'));\n\n\t\tif (flags.match(/-/))\n\t\t\tleft = true;\n\n\t\tif (flags.match(/0/))\n\t\t\tpad = '0';\n\n\t\tif (flags.match(/\\+/))\n\t\t\tsign = true;\n\n\t\tswitch (conversion) {\n\t\tcase 's':\n\t\t\tif (arg === undefined || arg === null)\n\t\t\t\tthrow (new Error('argument ' + argn +\n\t\t\t\t    ': attempted to print undefined or null ' +\n\t\t\t\t    'as a string'));\n\t\t\tret += doPad(pad, width, left, arg.toString());\n\t\t\tbreak;\n\n\t\tcase 'd':\n\t\t\targ = Math.floor(arg);\n\t\t\t/*jsl:fallthru*/\n\t\tcase 'f':\n\t\t\tsign = sign && arg > 0 ? '+' : '';\n\t\t\tret += sign + doPad(pad, width, left,\n\t\t\t    arg.toString());\n\t\t\tbreak;\n\n\t\tcase 'x':\n\t\t\tret += doPad(pad, width, left, arg.toString(16));\n\t\t\tbreak;\n\n\t\tcase 'j': /* non-standard */\n\t\t\tif (width === 0)\n\t\t\t\twidth = 10;\n\t\t\tret += mod_util.inspect(arg, false, width);\n\t\t\tbreak;\n\n\t\tcase 'r': /* non-standard */\n\t\t\tret += dumpException(arg);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow (new Error('unsupported conversion: ' +\n\t\t\t    conversion));\n\t\t}\n\t}\n\n\tret += fmt;\n\treturn (ret);\n}\n\nfunction jsPrintf() {\n\tvar args = Array.prototype.slice.call(arguments);\n\targs.unshift(process.stdout);\n\tjsFprintf.apply(null, args);\n}\n\nfunction jsFprintf(stream) {\n\tvar args = Array.prototype.slice.call(arguments, 1);\n\treturn (stream.write(jsSprintf.apply(this, args)));\n}\n\nfunction doPad(chr, width, left, str)\n{\n\tvar ret = str;\n\n\twhile (ret.length < width) {\n\t\tif (left)\n\t\t\tret += chr;\n\t\telse\n\t\t\tret = chr + ret;\n\t}\n\n\treturn (ret);\n}\n\n/*\n * This function dumps long stack traces for exceptions having a cause() method.\n * See node-verror for an example.\n */\nfunction dumpException(ex)\n{\n\tvar ret;\n\n\tif (!(ex instanceof Error))\n\t\tthrow (new Error(jsSprintf('invalid type for %%r: %j', ex)));\n\n\t/* Note that V8 prepends \"ex.stack\" with ex.toString(). */\n\tret = 'EXCEPTION: ' + ex.constructor.name + ': ' + ex.stack;\n\n\tif (ex.cause && typeof (ex.cause) === 'function') {\n\t\tvar cex = ex.cause();\n\t\tif (cex) {\n\t\t\tret += '\\nCaused by: ' + dumpException(cex);\n\t\t}\n\t}\n\n\treturn (ret);\n}\n\n\n/***/ }),\n/* 614 */\n/***/ (function(module, exports) {\n\n/*!\n * filename-regex <https://github.com/regexps/filename-regex>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert\n * Licensed under the MIT license.\n */\n\nmodule.exports = function filenameRegex() {\n  return /([^\\\\\\/]+)$/;\n};\n\n\n/***/ }),\n/* 615 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * for-in <https://github.com/jonschlinkert/for-in>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n\n\nmodule.exports = function forIn(obj, fn, thisArg) {\n  for (var key in obj) {\n    if (fn.call(thisArg, obj[key], key, obj) === false) {\n      break;\n    }\n  }\n};\n\n\n/***/ }),\n/* 616 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = ForeverAgent\nForeverAgent.SSL = ForeverAgentSSL\n\nvar util = __webpack_require__(3)\n  , Agent = __webpack_require__(87).Agent\n  , net = __webpack_require__(164)\n  , tls = __webpack_require__(467)\n  , AgentSSL = __webpack_require__(196).Agent\n  \nfunction getConnectionName(host, port) {  \n  var name = ''\n  if (typeof host === 'string') {\n    name = host + ':' + port\n  } else {\n    // For node.js v012.0 and iojs-v1.5.1, host is an object. And any existing localAddress is part of the connection name.\n    name = host.host + ':' + host.port + ':' + (host.localAddress ? (host.localAddress + ':') : ':')\n  }\n  return name\n}    \n\nfunction ForeverAgent(options) {\n  var self = this\n  self.options = options || {}\n  self.requests = {}\n  self.sockets = {}\n  self.freeSockets = {}\n  self.maxSockets = self.options.maxSockets || Agent.defaultMaxSockets\n  self.minSockets = self.options.minSockets || ForeverAgent.defaultMinSockets\n  self.on('free', function(socket, host, port) {\n    var name = getConnectionName(host, port)\n\n    if (self.requests[name] && self.requests[name].length) {\n      self.requests[name].shift().onSocket(socket)\n    } else if (self.sockets[name].length < self.minSockets) {\n      if (!self.freeSockets[name]) self.freeSockets[name] = []\n      self.freeSockets[name].push(socket)\n      \n      // if an error happens while we don't use the socket anyway, meh, throw the socket away\n      var onIdleError = function() {\n        socket.destroy()\n      }\n      socket._onIdleError = onIdleError\n      socket.on('error', onIdleError)\n    } else {\n      // If there are no pending requests just destroy the\n      // socket and it will get removed from the pool. This\n      // gets us out of timeout issues and allows us to\n      // default to Connection:keep-alive.\n      socket.destroy()\n    }\n  })\n\n}\nutil.inherits(ForeverAgent, Agent)\n\nForeverAgent.defaultMinSockets = 5\n\n\nForeverAgent.prototype.createConnection = net.createConnection\nForeverAgent.prototype.addRequestNoreuse = Agent.prototype.addRequest\nForeverAgent.prototype.addRequest = function(req, host, port) {\n  var name = getConnectionName(host, port)\n  \n  if (typeof host !== 'string') {\n    var options = host\n    port = options.port\n    host = options.host\n  }\n\n  if (this.freeSockets[name] && this.freeSockets[name].length > 0 && !req.useChunkedEncodingByDefault) {\n    var idleSocket = this.freeSockets[name].pop()\n    idleSocket.removeListener('error', idleSocket._onIdleError)\n    delete idleSocket._onIdleError\n    req._reusedSocket = true\n    req.onSocket(idleSocket)\n  } else {\n    this.addRequestNoreuse(req, host, port)\n  }\n}\n\nForeverAgent.prototype.removeSocket = function(s, name, host, port) {\n  if (this.sockets[name]) {\n    var index = this.sockets[name].indexOf(s)\n    if (index !== -1) {\n      this.sockets[name].splice(index, 1)\n    }\n  } else if (this.sockets[name] && this.sockets[name].length === 0) {\n    // don't leak\n    delete this.sockets[name]\n    delete this.requests[name]\n  }\n  \n  if (this.freeSockets[name]) {\n    var index = this.freeSockets[name].indexOf(s)\n    if (index !== -1) {\n      this.freeSockets[name].splice(index, 1)\n      if (this.freeSockets[name].length === 0) {\n        delete this.freeSockets[name]\n      }\n    }\n  }\n\n  if (this.requests[name] && this.requests[name].length) {\n    // If we have pending requests and a socket gets closed a new one\n    // needs to be created to take over in the pool for the one that closed.\n    this.createSocket(name, host, port).emit('free')\n  }\n}\n\nfunction ForeverAgentSSL (options) {\n  ForeverAgent.call(this, options)\n}\nutil.inherits(ForeverAgentSSL, ForeverAgent)\n\nForeverAgentSSL.prototype.createConnection = createConnectionSSL\nForeverAgentSSL.prototype.addRequestNoreuse = AgentSSL.prototype.addRequest\n\nfunction createConnectionSSL (port, host, options) {\n  if (typeof port === 'object') {\n    options = port;\n  } else if (typeof host === 'object') {\n    options = host;\n  } else if (typeof options === 'object') {\n    options = options;\n  } else {\n    options = {};\n  }\n\n  if (typeof port === 'number') {\n    options.port = port;\n  }\n\n  if (typeof host === 'string') {\n    options.host = host;\n  }\n\n  return tls.connect(options);\n}\n\n\n/***/ }),\n/* 617 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar CombinedStream = __webpack_require__(379);\nvar util = __webpack_require__(3);\nvar path = __webpack_require__(0);\nvar http = __webpack_require__(87);\nvar https = __webpack_require__(196);\nvar parseUrl = __webpack_require__(24).parse;\nvar fs = __webpack_require__(4);\nvar mime = __webpack_require__(400);\nvar asynckit = __webpack_require__(485);\nvar populate = __webpack_require__(618);\n\n// Public API\nmodule.exports = FormData;\n\n// make it a Stream\nutil.inherits(FormData, CombinedStream);\n\n/**\n * Create readable \"multipart/form-data\" streams.\n * Can be used to submit forms\n * and file uploads to other web applications.\n *\n * @constructor\n * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream\n */\nfunction FormData(options) {\n  if (!(this instanceof FormData)) {\n    return new FormData();\n  }\n\n  this._overheadLength = 0;\n  this._valueLength = 0;\n  this._valuesToMeasure = [];\n\n  CombinedStream.call(this);\n\n  options = options || {};\n  for (var option in options) {\n    this[option] = options[option];\n  }\n}\n\nFormData.LINE_BREAK = '\\r\\n';\nFormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';\n\nFormData.prototype.append = function(field, value, options) {\n\n  options = options || {};\n\n  // allow filename as single option\n  if (typeof options == 'string') {\n    options = {filename: options};\n  }\n\n  var append = CombinedStream.prototype.append.bind(this);\n\n  // all that streamy business can't handle numbers\n  if (typeof value == 'number') {\n    value = '' + value;\n  }\n\n  // https://github.com/felixge/node-form-data/issues/38\n  if (util.isArray(value)) {\n    // Please convert your array into string\n    // the way web server expects it\n    this._error(new Error('Arrays are not supported.'));\n    return;\n  }\n\n  var header = this._multiPartHeader(field, value, options);\n  var footer = this._multiPartFooter();\n\n  append(header);\n  append(value);\n  append(footer);\n\n  // pass along options.knownLength\n  this._trackLength(header, value, options);\n};\n\nFormData.prototype._trackLength = function(header, value, options) {\n  var valueLength = 0;\n\n  // used w/ getLengthSync(), when length is known.\n  // e.g. for streaming directly from a remote server,\n  // w/ a known file a size, and not wanting to wait for\n  // incoming file to finish to get its size.\n  if (options.knownLength != null) {\n    valueLength += +options.knownLength;\n  } else if (Buffer.isBuffer(value)) {\n    valueLength = value.length;\n  } else if (typeof value === 'string') {\n    valueLength = Buffer.byteLength(value);\n  }\n\n  this._valueLength += valueLength;\n\n  // @check why add CRLF? does this account for custom/multiple CRLFs?\n  this._overheadLength +=\n    Buffer.byteLength(header) +\n    FormData.LINE_BREAK.length;\n\n  // empty or either doesn't have path or not an http response\n  if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) )) {\n    return;\n  }\n\n  // no need to bother with the length\n  if (!options.knownLength) {\n    this._valuesToMeasure.push(value);\n  }\n};\n\nFormData.prototype._lengthRetriever = function(value, callback) {\n\n  if (value.hasOwnProperty('fd')) {\n\n    // take read range into a account\n    // `end` = Infinity –> read file till the end\n    //\n    // TODO: Looks like there is bug in Node fs.createReadStream\n    // it doesn't respect `end` options without `start` options\n    // Fix it when node fixes it.\n    // https://github.com/joyent/node/issues/7819\n    if (value.end != undefined && value.end != Infinity && value.start != undefined) {\n\n      // when end specified\n      // no need to calculate range\n      // inclusive, starts with 0\n      callback(null, value.end + 1 - (value.start ? value.start : 0));\n\n    // not that fast snoopy\n    } else {\n      // still need to fetch file size from fs\n      fs.stat(value.path, function(err, stat) {\n\n        var fileSize;\n\n        if (err) {\n          callback(err);\n          return;\n        }\n\n        // update final size based on the range options\n        fileSize = stat.size - (value.start ? value.start : 0);\n        callback(null, fileSize);\n      });\n    }\n\n  // or http response\n  } else if (value.hasOwnProperty('httpVersion')) {\n    callback(null, +value.headers['content-length']);\n\n  // or request stream http://github.com/mikeal/request\n  } else if (value.hasOwnProperty('httpModule')) {\n    // wait till response come back\n    value.on('response', function(response) {\n      value.pause();\n      callback(null, +response.headers['content-length']);\n    });\n    value.resume();\n\n  // something else\n  } else {\n    callback('Unknown stream');\n  }\n};\n\nFormData.prototype._multiPartHeader = function(field, value, options) {\n  // custom header specified (as string)?\n  // it becomes responsible for boundary\n  // (e.g. to handle extra CRLFs on .NET servers)\n  if (typeof options.header == 'string') {\n    return options.header;\n  }\n\n  var contentDisposition = this._getContentDisposition(value, options);\n  var contentType = this._getContentType(value, options);\n\n  var contents = '';\n  var headers  = {\n    // add custom disposition as third element or keep it two elements if not\n    'Content-Disposition': ['form-data', 'name=\"' + field + '\"'].concat(contentDisposition || []),\n    // if no content type. allow it to be empty array\n    'Content-Type': [].concat(contentType || [])\n  };\n\n  // allow custom headers.\n  if (typeof options.header == 'object') {\n    populate(headers, options.header);\n  }\n\n  var header;\n  for (var prop in headers) {\n    if (!headers.hasOwnProperty(prop)) continue;\n    header = headers[prop];\n\n    // skip nullish headers.\n    if (header == null) {\n      continue;\n    }\n\n    // convert all headers to arrays.\n    if (!Array.isArray(header)) {\n      header = [header];\n    }\n\n    // add non-empty headers.\n    if (header.length) {\n      contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;\n    }\n  }\n\n  return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;\n};\n\nFormData.prototype._getContentDisposition = function(value, options) {\n\n  var filename\n    , contentDisposition\n    ;\n\n  if (typeof options.filepath === 'string') {\n    // custom filepath for relative paths\n    filename = path.normalize(options.filepath).replace(/\\\\/g, '/');\n  } else if (options.filename || value.name || value.path) {\n    // custom filename take precedence\n    // formidable and the browser add a name property\n    // fs- and request- streams have path property\n    filename = path.basename(options.filename || value.name || value.path);\n  } else if (value.readable && value.hasOwnProperty('httpVersion')) {\n    // or try http response\n    filename = path.basename(value.client._httpMessage.path);\n  }\n\n  if (filename) {\n    contentDisposition = 'filename=\"' + filename + '\"';\n  }\n\n  return contentDisposition;\n};\n\nFormData.prototype._getContentType = function(value, options) {\n\n  // use custom content-type above all\n  var contentType = options.contentType;\n\n  // or try `name` from formidable, browser\n  if (!contentType && value.name) {\n    contentType = mime.lookup(value.name);\n  }\n\n  // or try `path` from fs-, request- streams\n  if (!contentType && value.path) {\n    contentType = mime.lookup(value.path);\n  }\n\n  // or if it's http-reponse\n  if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {\n    contentType = value.headers['content-type'];\n  }\n\n  // or guess it from the filepath or filename\n  if (!contentType && (options.filepath || options.filename)) {\n    contentType = mime.lookup(options.filepath || options.filename);\n  }\n\n  // fallback to the default content type if `value` is not simple value\n  if (!contentType && typeof value == 'object') {\n    contentType = FormData.DEFAULT_CONTENT_TYPE;\n  }\n\n  return contentType;\n};\n\nFormData.prototype._multiPartFooter = function() {\n  return function(next) {\n    var footer = FormData.LINE_BREAK;\n\n    var lastPart = (this._streams.length === 0);\n    if (lastPart) {\n      footer += this._lastBoundary();\n    }\n\n    next(footer);\n  }.bind(this);\n};\n\nFormData.prototype._lastBoundary = function() {\n  return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;\n};\n\nFormData.prototype.getHeaders = function(userHeaders) {\n  var header;\n  var formHeaders = {\n    'content-type': 'multipart/form-data; boundary=' + this.getBoundary()\n  };\n\n  for (header in userHeaders) {\n    if (userHeaders.hasOwnProperty(header)) {\n      formHeaders[header.toLowerCase()] = userHeaders[header];\n    }\n  }\n\n  return formHeaders;\n};\n\nFormData.prototype.getBoundary = function() {\n  if (!this._boundary) {\n    this._generateBoundary();\n  }\n\n  return this._boundary;\n};\n\nFormData.prototype._generateBoundary = function() {\n  // This generates a 50 character boundary similar to those used by Firefox.\n  // They are optimized for boyer-moore parsing.\n  var boundary = '--------------------------';\n  for (var i = 0; i < 24; i++) {\n    boundary += Math.floor(Math.random() * 10).toString(16);\n  }\n\n  this._boundary = boundary;\n};\n\n// Note: getLengthSync DOESN'T calculate streams length\n// As workaround one can calculate file size manually\n// and add it as knownLength option\nFormData.prototype.getLengthSync = function() {\n  var knownLength = this._overheadLength + this._valueLength;\n\n  // Don't get confused, there are 3 \"internal\" streams for each keyval pair\n  // so it basically checks if there is any value added to the form\n  if (this._streams.length) {\n    knownLength += this._lastBoundary().length;\n  }\n\n  // https://github.com/form-data/form-data/issues/40\n  if (!this.hasKnownLength()) {\n    // Some async length retrievers are present\n    // therefore synchronous length calculation is false.\n    // Please use getLength(callback) to get proper length\n    this._error(new Error('Cannot calculate proper length in synchronous way.'));\n  }\n\n  return knownLength;\n};\n\n// Public API to check if length of added values is known\n// https://github.com/form-data/form-data/issues/196\n// https://github.com/form-data/form-data/issues/262\nFormData.prototype.hasKnownLength = function() {\n  var hasKnownLength = true;\n\n  if (this._valuesToMeasure.length) {\n    hasKnownLength = false;\n  }\n\n  return hasKnownLength;\n};\n\nFormData.prototype.getLength = function(cb) {\n  var knownLength = this._overheadLength + this._valueLength;\n\n  if (this._streams.length) {\n    knownLength += this._lastBoundary().length;\n  }\n\n  if (!this._valuesToMeasure.length) {\n    process.nextTick(cb.bind(this, null, knownLength));\n    return;\n  }\n\n  asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {\n    if (err) {\n      cb(err);\n      return;\n    }\n\n    values.forEach(function(length) {\n      knownLength += length;\n    });\n\n    cb(null, knownLength);\n  });\n};\n\nFormData.prototype.submit = function(params, cb) {\n  var request\n    , options\n    , defaults = {method: 'post'}\n    ;\n\n  // parse provided url if it's string\n  // or treat it as options object\n  if (typeof params == 'string') {\n\n    params = parseUrl(params);\n    options = populate({\n      port: params.port,\n      path: params.pathname,\n      host: params.hostname,\n      protocol: params.protocol\n    }, defaults);\n\n  // use custom params\n  } else {\n\n    options = populate(params, defaults);\n    // if no port provided use default one\n    if (!options.port) {\n      options.port = options.protocol == 'https:' ? 443 : 80;\n    }\n  }\n\n  // put that good code in getHeaders to some use\n  options.headers = this.getHeaders(params.headers);\n\n  // https if specified, fallback to http in any other case\n  if (options.protocol == 'https:') {\n    request = https.request(options);\n  } else {\n    request = http.request(options);\n  }\n\n  // get content length and fire away\n  this.getLength(function(err, length) {\n    if (err) {\n      this._error(err);\n      return;\n    }\n\n    // add content length\n    request.setHeader('Content-Length', length);\n\n    this.pipe(request);\n    if (cb) {\n      request.on('error', cb);\n      request.on('response', cb.bind(this, null));\n    }\n  }.bind(this));\n\n  return request;\n};\n\nFormData.prototype._error = function(err) {\n  if (!this.error) {\n    this.error = err;\n    this.pause();\n    this.emit('error', err);\n  }\n};\n\nFormData.prototype.toString = function () {\n  return '[object FormData]';\n};\n\n\n/***/ }),\n/* 618 */\n/***/ (function(module, exports) {\n\n// populates missing values\nmodule.exports = function(dst, src) {\n\n  Object.keys(src).forEach(function(prop)\n  {\n    dst[prop] = dst[prop] || src[prop];\n  });\n\n  return dst;\n};\n\n\n/***/ }),\n/* 619 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(4).constants || __webpack_require__(466)\n\n\n/***/ }),\n/* 620 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * glob-base <https://github.com/jonschlinkert/glob-base>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n\n\nvar path = __webpack_require__(0);\nvar parent = __webpack_require__(621);\nvar isGlob = __webpack_require__(179);\n\nmodule.exports = function globBase(pattern) {\n  if (typeof pattern !== 'string') {\n    throw new TypeError('glob-base expects a string.');\n  }\n\n  var res = {};\n  res.base = parent(pattern);\n  res.isGlob = isGlob(pattern);\n\n  if (res.base !== '.') {\n    res.glob = pattern.substr(res.base.length);\n    if (res.glob.charAt(0) === '/') {\n      res.glob = res.glob.substr(1);\n    }\n  } else {\n    res.glob = pattern;\n  }\n\n  if (!res.isGlob) {\n    res.base = dirname(pattern);\n    res.glob = res.base !== '.'\n      ? pattern.substr(res.base.length)\n      : pattern;\n  }\n\n  if (res.glob.substr(0, 2) === './') {\n    res.glob = res.glob.substr(2);\n  }\n  if (res.glob.charAt(0) === '/') {\n    res.glob = res.glob.substr(1);\n  }\n  return res;\n};\n\nfunction dirname(glob) {\n  if (glob.slice(-1) === '/') return glob;\n  return path.dirname(glob);\n}\n\n\n/***/ }),\n/* 621 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar path = __webpack_require__(0);\nvar isglob = __webpack_require__(179);\n\nmodule.exports = function globParent(str) {\n\tstr += 'a'; // preserves full path in case of trailing path separator\n\tdo {str = path.dirname(str)} while (isglob(str));\n\treturn str;\n};\n\n\n/***/ }),\n/* 622 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Stream = __webpack_require__(23).Stream\n\nmodule.exports = legacy\n\nfunction legacy (fs) {\n  return {\n    ReadStream: ReadStream,\n    WriteStream: WriteStream\n  }\n\n  function ReadStream (path, options) {\n    if (!(this instanceof ReadStream)) return new ReadStream(path, options);\n\n    Stream.call(this);\n\n    var self = this;\n\n    this.path = path;\n    this.fd = null;\n    this.readable = true;\n    this.paused = false;\n\n    this.flags = 'r';\n    this.mode = 438; /*=0666*/\n    this.bufferSize = 64 * 1024;\n\n    options = options || {};\n\n    // Mixin options into this\n    var keys = Object.keys(options);\n    for (var index = 0, length = keys.length; index < length; index++) {\n      var key = keys[index];\n      this[key] = options[key];\n    }\n\n    if (this.encoding) this.setEncoding(this.encoding);\n\n    if (this.start !== undefined) {\n      if ('number' !== typeof this.start) {\n        throw TypeError('start must be a Number');\n      }\n      if (this.end === undefined) {\n        this.end = Infinity;\n      } else if ('number' !== typeof this.end) {\n        throw TypeError('end must be a Number');\n      }\n\n      if (this.start > this.end) {\n        throw new Error('start must be <= end');\n      }\n\n      this.pos = this.start;\n    }\n\n    if (this.fd !== null) {\n      process.nextTick(function() {\n        self._read();\n      });\n      return;\n    }\n\n    fs.open(this.path, this.flags, this.mode, function (err, fd) {\n      if (err) {\n        self.emit('error', err);\n        self.readable = false;\n        return;\n      }\n\n      self.fd = fd;\n      self.emit('open', fd);\n      self._read();\n    })\n  }\n\n  function WriteStream (path, options) {\n    if (!(this instanceof WriteStream)) return new WriteStream(path, options);\n\n    Stream.call(this);\n\n    this.path = path;\n    this.fd = null;\n    this.writable = true;\n\n    this.flags = 'w';\n    this.encoding = 'binary';\n    this.mode = 438; /*=0666*/\n    this.bytesWritten = 0;\n\n    options = options || {};\n\n    // Mixin options into this\n    var keys = Object.keys(options);\n    for (var index = 0, length = keys.length; index < length; index++) {\n      var key = keys[index];\n      this[key] = options[key];\n    }\n\n    if (this.start !== undefined) {\n      if ('number' !== typeof this.start) {\n        throw TypeError('start must be a Number');\n      }\n      if (this.start < 0) {\n        throw new Error('start must be >= zero');\n      }\n\n      this.pos = this.start;\n    }\n\n    this.busy = false;\n    this._queue = [];\n\n    if (this.fd === null) {\n      this._open = fs.open;\n      this._queue.push([this._open, this.path, this.flags, this.mode, undefined]);\n      this.flush();\n    }\n  }\n}\n\n\n/***/ }),\n/* 623 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar fs = __webpack_require__(384)\nvar constants = __webpack_require__(466)\n\nvar origCwd = process.cwd\nvar cwd = null\n\nvar platform = process.env.GRACEFUL_FS_PLATFORM || process.platform\n\nprocess.cwd = function() {\n  if (!cwd)\n    cwd = origCwd.call(process)\n  return cwd\n}\ntry {\n  process.cwd()\n} catch (er) {}\n\nvar chdir = process.chdir\nprocess.chdir = function(d) {\n  cwd = null\n  chdir.call(process, d)\n}\n\nmodule.exports = patch\n\nfunction patch (fs) {\n  // (re-)implement some things that are known busted or missing.\n\n  // lchmod, broken prior to 0.6.2\n  // back-port the fix here.\n  if (constants.hasOwnProperty('O_SYMLINK') &&\n      process.version.match(/^v0\\.6\\.[0-2]|^v0\\.5\\./)) {\n    patchLchmod(fs)\n  }\n\n  // lutimes implementation, or no-op\n  if (!fs.lutimes) {\n    patchLutimes(fs)\n  }\n\n  // https://github.com/isaacs/node-graceful-fs/issues/4\n  // Chown should not fail on einval or eperm if non-root.\n  // It should not fail on enosys ever, as this just indicates\n  // that a fs doesn't support the intended operation.\n\n  fs.chown = chownFix(fs.chown)\n  fs.fchown = chownFix(fs.fchown)\n  fs.lchown = chownFix(fs.lchown)\n\n  fs.chmod = chmodFix(fs.chmod)\n  fs.fchmod = chmodFix(fs.fchmod)\n  fs.lchmod = chmodFix(fs.lchmod)\n\n  fs.chownSync = chownFixSync(fs.chownSync)\n  fs.fchownSync = chownFixSync(fs.fchownSync)\n  fs.lchownSync = chownFixSync(fs.lchownSync)\n\n  fs.chmodSync = chmodFixSync(fs.chmodSync)\n  fs.fchmodSync = chmodFixSync(fs.fchmodSync)\n  fs.lchmodSync = chmodFixSync(fs.lchmodSync)\n\n  fs.stat = statFix(fs.stat)\n  fs.fstat = statFix(fs.fstat)\n  fs.lstat = statFix(fs.lstat)\n\n  fs.statSync = statFixSync(fs.statSync)\n  fs.fstatSync = statFixSync(fs.fstatSync)\n  fs.lstatSync = statFixSync(fs.lstatSync)\n\n  // if lchmod/lchown do not exist, then make them no-ops\n  if (!fs.lchmod) {\n    fs.lchmod = function (path, mode, cb) {\n      if (cb) process.nextTick(cb)\n    }\n    fs.lchmodSync = function () {}\n  }\n  if (!fs.lchown) {\n    fs.lchown = function (path, uid, gid, cb) {\n      if (cb) process.nextTick(cb)\n    }\n    fs.lchownSync = function () {}\n  }\n\n  // on Windows, A/V software can lock the directory, causing this\n  // to fail with an EACCES or EPERM if the directory contains newly\n  // created files.  Try again on failure, for up to 60 seconds.\n\n  // Set the timeout this long because some Windows Anti-Virus, such as Parity\n  // bit9, may lock files for up to a minute, causing npm package install\n  // failures. Also, take care to yield the scheduler. Windows scheduling gives\n  // CPU to a busy looping process, which can cause the program causing the lock\n  // contention to be starved of CPU by node, so the contention doesn't resolve.\n  if (platform === \"win32\") {\n    fs.rename = (function (fs$rename) { return function (from, to, cb) {\n      var start = Date.now()\n      var backoff = 0;\n      fs$rename(from, to, function CB (er) {\n        if (er\n            && (er.code === \"EACCES\" || er.code === \"EPERM\")\n            && Date.now() - start < 60000) {\n          setTimeout(function() {\n            fs.stat(to, function (stater, st) {\n              if (stater && stater.code === \"ENOENT\")\n                fs$rename(from, to, CB);\n              else\n                cb(er)\n            })\n          }, backoff)\n          if (backoff < 100)\n            backoff += 10;\n          return;\n        }\n        if (cb) cb(er)\n      })\n    }})(fs.rename)\n  }\n\n  // if read() returns EAGAIN, then just try it again.\n  fs.read = (function (fs$read) { return function (fd, buffer, offset, length, position, callback_) {\n    var callback\n    if (callback_ && typeof callback_ === 'function') {\n      var eagCounter = 0\n      callback = function (er, _, __) {\n        if (er && er.code === 'EAGAIN' && eagCounter < 10) {\n          eagCounter ++\n          return fs$read.call(fs, fd, buffer, offset, length, position, callback)\n        }\n        callback_.apply(this, arguments)\n      }\n    }\n    return fs$read.call(fs, fd, buffer, offset, length, position, callback)\n  }})(fs.read)\n\n  fs.readSync = (function (fs$readSync) { return function (fd, buffer, offset, length, position) {\n    var eagCounter = 0\n    while (true) {\n      try {\n        return fs$readSync.call(fs, fd, buffer, offset, length, position)\n      } catch (er) {\n        if (er.code === 'EAGAIN' && eagCounter < 10) {\n          eagCounter ++\n          continue\n        }\n        throw er\n      }\n    }\n  }})(fs.readSync)\n}\n\nfunction patchLchmod (fs) {\n  fs.lchmod = function (path, mode, callback) {\n    fs.open( path\n           , constants.O_WRONLY | constants.O_SYMLINK\n           , mode\n           , function (err, fd) {\n      if (err) {\n        if (callback) callback(err)\n        return\n      }\n      // prefer to return the chmod error, if one occurs,\n      // but still try to close, and report closing errors if they occur.\n      fs.fchmod(fd, mode, function (err) {\n        fs.close(fd, function(err2) {\n          if (callback) callback(err || err2)\n        })\n      })\n    })\n  }\n\n  fs.lchmodSync = function (path, mode) {\n    var fd = fs.openSync(path, constants.O_WRONLY | constants.O_SYMLINK, mode)\n\n    // prefer to return the chmod error, if one occurs,\n    // but still try to close, and report closing errors if they occur.\n    var threw = true\n    var ret\n    try {\n      ret = fs.fchmodSync(fd, mode)\n      threw = false\n    } finally {\n      if (threw) {\n        try {\n          fs.closeSync(fd)\n        } catch (er) {}\n      } else {\n        fs.closeSync(fd)\n      }\n    }\n    return ret\n  }\n}\n\nfunction patchLutimes (fs) {\n  if (constants.hasOwnProperty(\"O_SYMLINK\")) {\n    fs.lutimes = function (path, at, mt, cb) {\n      fs.open(path, constants.O_SYMLINK, function (er, fd) {\n        if (er) {\n          if (cb) cb(er)\n          return\n        }\n        fs.futimes(fd, at, mt, function (er) {\n          fs.close(fd, function (er2) {\n            if (cb) cb(er || er2)\n          })\n        })\n      })\n    }\n\n    fs.lutimesSync = function (path, at, mt) {\n      var fd = fs.openSync(path, constants.O_SYMLINK)\n      var ret\n      var threw = true\n      try {\n        ret = fs.futimesSync(fd, at, mt)\n        threw = false\n      } finally {\n        if (threw) {\n          try {\n            fs.closeSync(fd)\n          } catch (er) {}\n        } else {\n          fs.closeSync(fd)\n        }\n      }\n      return ret\n    }\n\n  } else {\n    fs.lutimes = function (_a, _b, _c, cb) { if (cb) process.nextTick(cb) }\n    fs.lutimesSync = function () {}\n  }\n}\n\nfunction chmodFix (orig) {\n  if (!orig) return orig\n  return function (target, mode, cb) {\n    return orig.call(fs, target, mode, function (er) {\n      if (chownErOk(er)) er = null\n      if (cb) cb.apply(this, arguments)\n    })\n  }\n}\n\nfunction chmodFixSync (orig) {\n  if (!orig) return orig\n  return function (target, mode) {\n    try {\n      return orig.call(fs, target, mode)\n    } catch (er) {\n      if (!chownErOk(er)) throw er\n    }\n  }\n}\n\n\nfunction chownFix (orig) {\n  if (!orig) return orig\n  return function (target, uid, gid, cb) {\n    return orig.call(fs, target, uid, gid, function (er) {\n      if (chownErOk(er)) er = null\n      if (cb) cb.apply(this, arguments)\n    })\n  }\n}\n\nfunction chownFixSync (orig) {\n  if (!orig) return orig\n  return function (target, uid, gid) {\n    try {\n      return orig.call(fs, target, uid, gid)\n    } catch (er) {\n      if (!chownErOk(er)) throw er\n    }\n  }\n}\n\n\nfunction statFix (orig) {\n  if (!orig) return orig\n  // Older versions of Node erroneously returned signed integers for\n  // uid + gid.\n  return function (target, cb) {\n    return orig.call(fs, target, function (er, stats) {\n      if (!stats) return cb.apply(this, arguments)\n      if (stats.uid < 0) stats.uid += 0x100000000\n      if (stats.gid < 0) stats.gid += 0x100000000\n      if (cb) cb.apply(this, arguments)\n    })\n  }\n}\n\nfunction statFixSync (orig) {\n  if (!orig) return orig\n  // Older versions of Node erroneously returned signed integers for\n  // uid + gid.\n  return function (target) {\n    var stats = orig.call(fs, target)\n    if (stats.uid < 0) stats.uid += 0x100000000\n    if (stats.gid < 0) stats.gid += 0x100000000\n    return stats;\n  }\n}\n\n// ENOSYS means that the fs doesn't support the op. Just ignore\n// that, because it doesn't matter.\n//\n// if there's no getuid, or if getuid() is something other\n// than 0, and the error is EINVAL or EPERM, then just ignore\n// it.\n//\n// This specific case is a silent failure in cp, install, tar,\n// and most other unix tools that manage permissions.\n//\n// When running as root, or if other types of errors are\n// encountered, then it's strict.\nfunction chownErOk (er) {\n  if (!er)\n    return true\n\n  if (er.code === \"ENOSYS\")\n    return true\n\n  var nonroot = !process.getuid || process.getuid() !== 0\n  if (nonroot) {\n    if (er.code === \"EINVAL\" || er.code === \"EPERM\")\n      return true\n  }\n\n  return false\n}\n\n\n/***/ }),\n/* 624 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar zlib = __webpack_require__(199)\nvar peek = __webpack_require__(775)\nvar through = __webpack_require__(461)\nvar pumpify = __webpack_require__(782)\nvar isGzip = __webpack_require__(737)\nvar isDeflate = __webpack_require__(732)\n\nvar isCompressed = function (data) {\n  if (isGzip(data)) return 1\n  if (isDeflate(data)) return 2\n  return 0\n}\n\nvar gunzip = function (maxRecursion) {\n  if (!(maxRecursion >= 0)) maxRecursion = 3\n\n  return peek({newline: false, maxBuffer: 10}, function (data, swap) {\n    if (maxRecursion < 0) return swap(new Error('Maximum recursion reached'))\n    switch (isCompressed(data)) {\n      case 1:\n        swap(null, pumpify(zlib.createGunzip(), gunzip(maxRecursion - 1)))\n        break\n      case 2:\n        swap(null, pumpify(zlib.createInflate(), gunzip(maxRecursion - 1)))\n        break\n      default:\n        swap(null, through())\n    }\n  })\n}\n\nmodule.exports = gunzip\n\n\n/***/ }),\n/* 625 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"afterRequest.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"optional\":true,\"required\":[\"lastAccess\",\"eTag\",\"hitCount\"],\"properties\":{\"expires\":{\"type\":\"string\",\"pattern\":\"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))?\"},\"lastAccess\":{\"type\":\"string\",\"pattern\":\"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))?\"},\"eTag\":{\"type\":\"string\"},\"hitCount\":{\"type\":\"integer\"},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 626 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"beforeRequest.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"optional\":true,\"required\":[\"lastAccess\",\"eTag\",\"hitCount\"],\"properties\":{\"expires\":{\"type\":\"string\",\"pattern\":\"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))?\"},\"lastAccess\":{\"type\":\"string\",\"pattern\":\"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))?\"},\"eTag\":{\"type\":\"string\"},\"hitCount\":{\"type\":\"integer\"},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 627 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"browser.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"required\":[\"name\",\"version\"],\"properties\":{\"name\":{\"type\":\"string\"},\"version\":{\"type\":\"string\"},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 628 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"cache.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"properties\":{\"beforeRequest\":{\"oneOf\":[{\"type\":\"null\"},{\"$ref\":\"beforeRequest.json#\"}]},\"afterRequest\":{\"oneOf\":[{\"type\":\"null\"},{\"$ref\":\"afterRequest.json#\"}]},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 629 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"content.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"required\":[\"size\",\"mimeType\"],\"properties\":{\"size\":{\"type\":\"integer\"},\"compression\":{\"type\":\"integer\"},\"mimeType\":{\"type\":\"string\"},\"text\":{\"type\":\"string\"},\"encoding\":{\"type\":\"string\"},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 630 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"cookie.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"required\":[\"name\",\"value\"],\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"},\"path\":{\"type\":\"string\"},\"domain\":{\"type\":\"string\"},\"expires\":{\"type\":[\"string\",\"null\"],\"format\":\"date-time\"},\"httpOnly\":{\"type\":\"boolean\"},\"secure\":{\"type\":\"boolean\"},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 631 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"creator.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"required\":[\"name\",\"version\"],\"properties\":{\"name\":{\"type\":\"string\"},\"version\":{\"type\":\"string\"},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 632 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"entry.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"optional\":true,\"required\":[\"startedDateTime\",\"time\",\"request\",\"response\",\"cache\",\"timings\"],\"properties\":{\"pageref\":{\"type\":\"string\"},\"startedDateTime\":{\"type\":\"string\",\"format\":\"date-time\",\"pattern\":\"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))\"},\"time\":{\"type\":\"number\",\"min\":0},\"request\":{\"$ref\":\"request.json#\"},\"response\":{\"$ref\":\"response.json#\"},\"cache\":{\"$ref\":\"cache.json#\"},\"timings\":{\"$ref\":\"timings.json#\"},\"serverIPAddress\":{\"type\":\"string\",\"oneOf\":[{\"format\":\"ipv4\"},{\"format\":\"ipv6\"}]},\"connection\":{\"type\":\"string\"},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 633 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"har.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"required\":[\"log\"],\"properties\":{\"log\":{\"$ref\":\"log.json#\"}}}\n\n/***/ }),\n/* 634 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"header.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"required\":[\"name\",\"value\"],\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 635 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = {\n  afterRequest: __webpack_require__(625),\n  beforeRequest: __webpack_require__(626),\n  browser: __webpack_require__(627),\n  cache: __webpack_require__(628),\n  content: __webpack_require__(629),\n  cookie: __webpack_require__(630),\n  creator: __webpack_require__(631),\n  entry: __webpack_require__(632),\n  har: __webpack_require__(633),\n  header: __webpack_require__(634),\n  log: __webpack_require__(636),\n  page: __webpack_require__(637),\n  pageTimings: __webpack_require__(638),\n  postData: __webpack_require__(639),\n  query: __webpack_require__(640),\n  request: __webpack_require__(641),\n  response: __webpack_require__(642),\n  timings: __webpack_require__(643)\n}\n\n\n/***/ }),\n/* 636 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"log.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"required\":[\"version\",\"creator\",\"entries\"],\"properties\":{\"version\":{\"type\":\"string\"},\"creator\":{\"$ref\":\"creator.json#\"},\"browser\":{\"$ref\":\"browser.json#\"},\"pages\":{\"type\":\"array\",\"items\":{\"$ref\":\"page.json#\"}},\"entries\":{\"type\":\"array\",\"items\":{\"$ref\":\"entry.json#\"}},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 637 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"page.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"optional\":true,\"required\":[\"startedDateTime\",\"id\",\"title\",\"pageTimings\"],\"properties\":{\"startedDateTime\":{\"type\":\"string\",\"format\":\"date-time\",\"pattern\":\"^(\\\\d{4})(-)?(\\\\d\\\\d)(-)?(\\\\d\\\\d)(T)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(:)?(\\\\d\\\\d)(\\\\.\\\\d+)?(Z|([+-])(\\\\d\\\\d)(:)?(\\\\d\\\\d))\"},\"id\":{\"type\":\"string\",\"unique\":true},\"title\":{\"type\":\"string\"},\"pageTimings\":{\"$ref\":\"pageTimings.json#\"},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 638 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"pageTimings.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"properties\":{\"onContentLoad\":{\"type\":\"number\",\"min\":-1},\"onLoad\":{\"type\":\"number\",\"min\":-1},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 639 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"postData.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"optional\":true,\"required\":[\"mimeType\"],\"properties\":{\"mimeType\":{\"type\":\"string\"},\"text\":{\"type\":\"string\"},\"params\":{\"type\":\"array\",\"required\":[\"name\"],\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"},\"fileName\":{\"type\":\"string\"},\"contentType\":{\"type\":\"string\"},\"comment\":{\"type\":\"string\"}}},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 640 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"query.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"required\":[\"name\",\"value\"],\"properties\":{\"name\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 641 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"request.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"required\":[\"method\",\"url\",\"httpVersion\",\"cookies\",\"headers\",\"queryString\",\"headersSize\",\"bodySize\"],\"properties\":{\"method\":{\"type\":\"string\"},\"url\":{\"type\":\"string\",\"format\":\"uri\"},\"httpVersion\":{\"type\":\"string\"},\"cookies\":{\"type\":\"array\",\"items\":{\"$ref\":\"cookie.json#\"}},\"headers\":{\"type\":\"array\",\"items\":{\"$ref\":\"header.json#\"}},\"queryString\":{\"type\":\"array\",\"items\":{\"$ref\":\"query.json#\"}},\"postData\":{\"$ref\":\"postData.json#\"},\"headersSize\":{\"type\":\"integer\"},\"bodySize\":{\"type\":\"integer\"},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 642 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"response.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"type\":\"object\",\"required\":[\"status\",\"statusText\",\"httpVersion\",\"cookies\",\"headers\",\"content\",\"redirectURL\",\"headersSize\",\"bodySize\"],\"properties\":{\"status\":{\"type\":\"integer\"},\"statusText\":{\"type\":\"string\"},\"httpVersion\":{\"type\":\"string\"},\"cookies\":{\"type\":\"array\",\"items\":{\"$ref\":\"cookie.json#\"}},\"headers\":{\"type\":\"array\",\"items\":{\"$ref\":\"header.json#\"}},\"content\":{\"$ref\":\"content.json#\"},\"redirectURL\":{\"type\":\"string\"},\"headersSize\":{\"type\":\"integer\"},\"bodySize\":{\"type\":\"integer\"},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 643 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$id\":\"timings.json#\",\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"required\":[\"send\",\"wait\",\"receive\"],\"properties\":{\"dns\":{\"type\":\"number\",\"min\":-1},\"connect\":{\"type\":\"number\",\"min\":-1},\"blocked\":{\"type\":\"number\",\"min\":-1},\"send\":{\"type\":\"number\",\"min\":-1},\"wait\":{\"type\":\"number\",\"min\":-1},\"receive\":{\"type\":\"number\",\"min\":-1},\"ssl\":{\"type\":\"number\",\"min\":-1},\"comment\":{\"type\":\"string\"}}}\n\n/***/ }),\n/* 644 */\n/***/ (function(module, exports) {\n\nfunction HARError (errors) {\n  var message = 'validation failed'\n\n  this.name = 'HARError'\n  this.message = message\n  this.errors = errors\n\n  if (typeof Error.captureStackTrace === 'function') {\n    Error.captureStackTrace(this, this.constructor)\n  } else {\n    this.stack = (new Error(message)).stack\n  }\n}\n\nHARError.prototype = Error.prototype\n\nmodule.exports = HARError\n\n\n/***/ }),\n/* 645 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Ajv = __webpack_require__(647)\nvar HARError = __webpack_require__(644)\nvar schemas = __webpack_require__(635)\n\nvar ajv\n\nfunction validate (name, data) {\n  data = data || {}\n\n  // validator config\n  ajv = ajv || new Ajv({\n    allErrors: true,\n    schemas: schemas\n  })\n\n  var validate = ajv.getSchema(name + '.json')\n\n  return new Promise(function (resolve, reject) {\n    var valid = validate(data)\n\n    !valid ? reject(new HARError(validate.errors)) : resolve(data)\n  })\n}\n\nexports.afterRequest = function (data) {\n  return validate('afterRequest', data)\n}\n\nexports.beforeRequest = function (data) {\n  return validate('beforeRequest', data)\n}\n\nexports.browser = function (data) {\n  return validate('browser', data)\n}\n\nexports.cache = function (data) {\n  return validate('cache', data)\n}\n\nexports.content = function (data) {\n  return validate('content', data)\n}\n\nexports.cookie = function (data) {\n  return validate('cookie', data)\n}\n\nexports.creator = function (data) {\n  return validate('creator', data)\n}\n\nexports.entry = function (data) {\n  return validate('entry', data)\n}\n\nexports.har = function (data) {\n  return validate('har', data)\n}\n\nexports.header = function (data) {\n  return validate('header', data)\n}\n\nexports.log = function (data) {\n  return validate('log', data)\n}\n\nexports.page = function (data) {\n  return validate('page', data)\n}\n\nexports.pageTimings = function (data) {\n  return validate('pageTimings', data)\n}\n\nexports.postData = function (data) {\n  return validate('postData', data)\n}\n\nexports.query = function (data) {\n  return validate('query', data)\n}\n\nexports.request = function (data) {\n  return validate('request', data)\n}\n\nexports.response = function (data) {\n  return validate('response', data)\n}\n\nexports.timings = function (data) {\n  return validate('timings', data)\n}\n\n\n/***/ }),\n/* 646 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar KEYWORDS = [\n  'multipleOf',\n  'maximum',\n  'exclusiveMaximum',\n  'minimum',\n  'exclusiveMinimum',\n  'maxLength',\n  'minLength',\n  'pattern',\n  'additionalItems',\n  'maxItems',\n  'minItems',\n  'uniqueItems',\n  'maxProperties',\n  'minProperties',\n  'required',\n  'additionalProperties',\n  'enum',\n  'format',\n  'const'\n];\n\nmodule.exports = function (metaSchema, keywordsJsonPointers) {\n  for (var i=0; i<keywordsJsonPointers.length; i++) {\n    metaSchema = JSON.parse(JSON.stringify(metaSchema));\n    var segments = keywordsJsonPointers[i].split('/');\n    var keywords = metaSchema;\n    var j;\n    for (j=1; j<segments.length; j++)\n      keywords = keywords[segments[j]];\n\n    for (j=0; j<KEYWORDS.length; j++) {\n      var key = KEYWORDS[j];\n      var schema = keywords[key];\n      if (schema) {\n        keywords[key] = {\n          anyOf: [\n            schema,\n            { $ref: 'https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/$data.json#' }\n          ]\n        };\n      }\n    }\n  }\n\n  return metaSchema;\n};\n\n\n/***/ }),\n/* 647 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar compileSchema = __webpack_require__(652)\n  , resolve = __webpack_require__(271)\n  , Cache = __webpack_require__(648)\n  , SchemaObject = __webpack_require__(386)\n  , stableStringify = __webpack_require__(383)\n  , formats = __webpack_require__(651)\n  , rules = __webpack_require__(653)\n  , $dataMetaSchema = __webpack_require__(646)\n  , patternGroups = __webpack_require__(674)\n  , util = __webpack_require__(114)\n  , co = __webpack_require__(377);\n\nmodule.exports = Ajv;\n\nAjv.prototype.validate = validate;\nAjv.prototype.compile = compile;\nAjv.prototype.addSchema = addSchema;\nAjv.prototype.addMetaSchema = addMetaSchema;\nAjv.prototype.validateSchema = validateSchema;\nAjv.prototype.getSchema = getSchema;\nAjv.prototype.removeSchema = removeSchema;\nAjv.prototype.addFormat = addFormat;\nAjv.prototype.errorsText = errorsText;\n\nAjv.prototype._addSchema = _addSchema;\nAjv.prototype._compile = _compile;\n\nAjv.prototype.compileAsync = __webpack_require__(650);\nvar customKeyword = __webpack_require__(673);\nAjv.prototype.addKeyword = customKeyword.add;\nAjv.prototype.getKeyword = customKeyword.get;\nAjv.prototype.removeKeyword = customKeyword.remove;\n\nvar errorClasses = __webpack_require__(270);\nAjv.ValidationError = errorClasses.Validation;\nAjv.MissingRefError = errorClasses.MissingRef;\nAjv.$dataMetaSchema = $dataMetaSchema;\n\nvar META_SCHEMA_ID = 'http://json-schema.org/draft-06/schema';\n\nvar META_IGNORE_OPTIONS = [ 'removeAdditional', 'useDefaults', 'coerceTypes' ];\nvar META_SUPPORT_DATA = ['/properties'];\n\n/**\n * Creates validator instance.\n * Usage: `Ajv(opts)`\n * @param {Object} opts optional options\n * @return {Object} ajv instance\n */\nfunction Ajv(opts) {\n  if (!(this instanceof Ajv)) return new Ajv(opts);\n  opts = this._opts = util.copy(opts) || {};\n  setLogger(this);\n  this._schemas = {};\n  this._refs = {};\n  this._fragments = {};\n  this._formats = formats(opts.format);\n  var schemaUriFormat = this._schemaUriFormat = this._formats['uri-reference'];\n  this._schemaUriFormatFunc = function (str) { return schemaUriFormat.test(str); };\n\n  this._cache = opts.cache || new Cache;\n  this._loadingSchemas = {};\n  this._compilations = [];\n  this.RULES = rules();\n  this._getId = chooseGetId(opts);\n\n  opts.loopRequired = opts.loopRequired || Infinity;\n  if (opts.errorDataPath == 'property') opts._errorDataPathProperty = true;\n  if (opts.serialize === undefined) opts.serialize = stableStringify;\n  this._metaOpts = getMetaSchemaOptions(this);\n\n  if (opts.formats) addInitialFormats(this);\n  addDraft6MetaSchema(this);\n  if (typeof opts.meta == 'object') this.addMetaSchema(opts.meta);\n  addInitialSchemas(this);\n  if (opts.patternGroups) patternGroups(this);\n}\n\n\n\n/**\n * Validate data using schema\n * Schema will be compiled and cached (using serialized JSON as key. [fast-json-stable-stringify](https://github.com/epoberezkin/fast-json-stable-stringify) is used to serialize.\n * @this   Ajv\n * @param  {String|Object} schemaKeyRef key, ref or schema object\n * @param  {Any} data to be validated\n * @return {Boolean} validation result. Errors from the last validation will be available in `ajv.errors` (and also in compiled schema: `schema.errors`).\n */\nfunction validate(schemaKeyRef, data) {\n  var v;\n  if (typeof schemaKeyRef == 'string') {\n    v = this.getSchema(schemaKeyRef);\n    if (!v) throw new Error('no schema with key or ref \"' + schemaKeyRef + '\"');\n  } else {\n    var schemaObj = this._addSchema(schemaKeyRef);\n    v = schemaObj.validate || this._compile(schemaObj);\n  }\n\n  var valid = v(data);\n  if (v.$async === true)\n    return this._opts.async == '*' ? co(valid) : valid;\n  this.errors = v.errors;\n  return valid;\n}\n\n\n/**\n * Create validating function for passed schema.\n * @this   Ajv\n * @param  {Object} schema schema object\n * @param  {Boolean} _meta true if schema is a meta-schema. Used internally to compile meta schemas of custom keywords.\n * @return {Function} validating function\n */\nfunction compile(schema, _meta) {\n  var schemaObj = this._addSchema(schema, undefined, _meta);\n  return schemaObj.validate || this._compile(schemaObj);\n}\n\n\n/**\n * Adds schema to the instance.\n * @this   Ajv\n * @param {Object|Array} schema schema or array of schemas. If array is passed, `key` and other parameters will be ignored.\n * @param {String} key Optional schema key. Can be passed to `validate` method instead of schema object or id/ref. One schema per instance can have empty `id` and `key`.\n * @param {Boolean} _skipValidation true to skip schema validation. Used internally, option validateSchema should be used instead.\n * @param {Boolean} _meta true if schema is a meta-schema. Used internally, addMetaSchema should be used instead.\n * @return {Ajv} this for method chaining\n */\nfunction addSchema(schema, key, _skipValidation, _meta) {\n  if (Array.isArray(schema)){\n    for (var i=0; i<schema.length; i++) this.addSchema(schema[i], undefined, _skipValidation, _meta);\n    return this;\n  }\n  var id = this._getId(schema);\n  if (id !== undefined && typeof id != 'string')\n    throw new Error('schema id must be string');\n  key = resolve.normalizeId(key || id);\n  checkUnique(this, key);\n  this._schemas[key] = this._addSchema(schema, _skipValidation, _meta, true);\n  return this;\n}\n\n\n/**\n * Add schema that will be used to validate other schemas\n * options in META_IGNORE_OPTIONS are alway set to false\n * @this   Ajv\n * @param {Object} schema schema object\n * @param {String} key optional schema key\n * @param {Boolean} skipValidation true to skip schema validation, can be used to override validateSchema option for meta-schema\n * @return {Ajv} this for method chaining\n */\nfunction addMetaSchema(schema, key, skipValidation) {\n  this.addSchema(schema, key, skipValidation, true);\n  return this;\n}\n\n\n/**\n * Validate schema\n * @this   Ajv\n * @param {Object} schema schema to validate\n * @param {Boolean} throwOrLogError pass true to throw (or log) an error if invalid\n * @return {Boolean} true if schema is valid\n */\nfunction validateSchema(schema, throwOrLogError) {\n  var $schema = schema.$schema;\n  if ($schema !== undefined && typeof $schema != 'string')\n    throw new Error('$schema must be a string');\n  $schema = $schema || this._opts.defaultMeta || defaultMeta(this);\n  if (!$schema) {\n    this.logger.warn('meta-schema not available');\n    this.errors = null;\n    return true;\n  }\n  var currentUriFormat = this._formats.uri;\n  this._formats.uri = typeof currentUriFormat == 'function'\n                      ? this._schemaUriFormatFunc\n                      : this._schemaUriFormat;\n  var valid;\n  try { valid = this.validate($schema, schema); }\n  finally { this._formats.uri = currentUriFormat; }\n  if (!valid && throwOrLogError) {\n    var message = 'schema is invalid: ' + this.errorsText();\n    if (this._opts.validateSchema == 'log') this.logger.error(message);\n    else throw new Error(message);\n  }\n  return valid;\n}\n\n\nfunction defaultMeta(self) {\n  var meta = self._opts.meta;\n  self._opts.defaultMeta = typeof meta == 'object'\n                            ? self._getId(meta) || meta\n                            : self.getSchema(META_SCHEMA_ID)\n                              ? META_SCHEMA_ID\n                              : undefined;\n  return self._opts.defaultMeta;\n}\n\n\n/**\n * Get compiled schema from the instance by `key` or `ref`.\n * @this   Ajv\n * @param  {String} keyRef `key` that was passed to `addSchema` or full schema reference (`schema.id` or resolved id).\n * @return {Function} schema validating function (with property `schema`).\n */\nfunction getSchema(keyRef) {\n  var schemaObj = _getSchemaObj(this, keyRef);\n  switch (typeof schemaObj) {\n    case 'object': return schemaObj.validate || this._compile(schemaObj);\n    case 'string': return this.getSchema(schemaObj);\n    case 'undefined': return _getSchemaFragment(this, keyRef);\n  }\n}\n\n\nfunction _getSchemaFragment(self, ref) {\n  var res = resolve.schema.call(self, { schema: {} }, ref);\n  if (res) {\n    var schema = res.schema\n      , root = res.root\n      , baseId = res.baseId;\n    var v = compileSchema.call(self, schema, root, undefined, baseId);\n    self._fragments[ref] = new SchemaObject({\n      ref: ref,\n      fragment: true,\n      schema: schema,\n      root: root,\n      baseId: baseId,\n      validate: v\n    });\n    return v;\n  }\n}\n\n\nfunction _getSchemaObj(self, keyRef) {\n  keyRef = resolve.normalizeId(keyRef);\n  return self._schemas[keyRef] || self._refs[keyRef] || self._fragments[keyRef];\n}\n\n\n/**\n * Remove cached schema(s).\n * If no parameter is passed all schemas but meta-schemas are removed.\n * If RegExp is passed all schemas with key/id matching pattern but meta-schemas are removed.\n * Even if schema is referenced by other schemas it still can be removed as other schemas have local references.\n * @this   Ajv\n * @param  {String|Object|RegExp} schemaKeyRef key, ref, pattern to match key/ref or schema object\n * @return {Ajv} this for method chaining\n */\nfunction removeSchema(schemaKeyRef) {\n  if (schemaKeyRef instanceof RegExp) {\n    _removeAllSchemas(this, this._schemas, schemaKeyRef);\n    _removeAllSchemas(this, this._refs, schemaKeyRef);\n    return this;\n  }\n  switch (typeof schemaKeyRef) {\n    case 'undefined':\n      _removeAllSchemas(this, this._schemas);\n      _removeAllSchemas(this, this._refs);\n      this._cache.clear();\n      return this;\n    case 'string':\n      var schemaObj = _getSchemaObj(this, schemaKeyRef);\n      if (schemaObj) this._cache.del(schemaObj.cacheKey);\n      delete this._schemas[schemaKeyRef];\n      delete this._refs[schemaKeyRef];\n      return this;\n    case 'object':\n      var serialize = this._opts.serialize;\n      var cacheKey = serialize ? serialize(schemaKeyRef) : schemaKeyRef;\n      this._cache.del(cacheKey);\n      var id = this._getId(schemaKeyRef);\n      if (id) {\n        id = resolve.normalizeId(id);\n        delete this._schemas[id];\n        delete this._refs[id];\n      }\n  }\n  return this;\n}\n\n\nfunction _removeAllSchemas(self, schemas, regex) {\n  for (var keyRef in schemas) {\n    var schemaObj = schemas[keyRef];\n    if (!schemaObj.meta && (!regex || regex.test(keyRef))) {\n      self._cache.del(schemaObj.cacheKey);\n      delete schemas[keyRef];\n    }\n  }\n}\n\n\n/* @this   Ajv */\nfunction _addSchema(schema, skipValidation, meta, shouldAddSchema) {\n  if (typeof schema != 'object' && typeof schema != 'boolean')\n    throw new Error('schema should be object or boolean');\n  var serialize = this._opts.serialize;\n  var cacheKey = serialize ? serialize(schema) : schema;\n  var cached = this._cache.get(cacheKey);\n  if (cached) return cached;\n\n  shouldAddSchema = shouldAddSchema || this._opts.addUsedSchema !== false;\n\n  var id = resolve.normalizeId(this._getId(schema));\n  if (id && shouldAddSchema) checkUnique(this, id);\n\n  var willValidate = this._opts.validateSchema !== false && !skipValidation;\n  var recursiveMeta;\n  if (willValidate && !(recursiveMeta = id && id == resolve.normalizeId(schema.$schema)))\n    this.validateSchema(schema, true);\n\n  var localRefs = resolve.ids.call(this, schema);\n\n  var schemaObj = new SchemaObject({\n    id: id,\n    schema: schema,\n    localRefs: localRefs,\n    cacheKey: cacheKey,\n    meta: meta\n  });\n\n  if (id[0] != '#' && shouldAddSchema) this._refs[id] = schemaObj;\n  this._cache.put(cacheKey, schemaObj);\n\n  if (willValidate && recursiveMeta) this.validateSchema(schema, true);\n\n  return schemaObj;\n}\n\n\n/* @this   Ajv */\nfunction _compile(schemaObj, root) {\n  if (schemaObj.compiling) {\n    schemaObj.validate = callValidate;\n    callValidate.schema = schemaObj.schema;\n    callValidate.errors = null;\n    callValidate.root = root ? root : callValidate;\n    if (schemaObj.schema.$async === true)\n      callValidate.$async = true;\n    return callValidate;\n  }\n  schemaObj.compiling = true;\n\n  var currentOpts;\n  if (schemaObj.meta) {\n    currentOpts = this._opts;\n    this._opts = this._metaOpts;\n  }\n\n  var v;\n  try { v = compileSchema.call(this, schemaObj.schema, root, schemaObj.localRefs); }\n  finally {\n    schemaObj.compiling = false;\n    if (schemaObj.meta) this._opts = currentOpts;\n  }\n\n  schemaObj.validate = v;\n  schemaObj.refs = v.refs;\n  schemaObj.refVal = v.refVal;\n  schemaObj.root = v.root;\n  return v;\n\n\n  function callValidate() {\n    var _validate = schemaObj.validate;\n    var result = _validate.apply(null, arguments);\n    callValidate.errors = _validate.errors;\n    return result;\n  }\n}\n\n\nfunction chooseGetId(opts) {\n  switch (opts.schemaId) {\n    case '$id': return _get$Id;\n    case 'id': return _getId;\n    default: return _get$IdOrId;\n  }\n}\n\n/* @this   Ajv */\nfunction _getId(schema) {\n  if (schema.$id) this.logger.warn('schema $id ignored', schema.$id);\n  return schema.id;\n}\n\n/* @this   Ajv */\nfunction _get$Id(schema) {\n  if (schema.id) this.logger.warn('schema id ignored', schema.id);\n  return schema.$id;\n}\n\n\nfunction _get$IdOrId(schema) {\n  if (schema.$id && schema.id && schema.$id != schema.id)\n    throw new Error('schema $id is different from id');\n  return schema.$id || schema.id;\n}\n\n\n/**\n * Convert array of error message objects to string\n * @this   Ajv\n * @param  {Array<Object>} errors optional array of validation errors, if not passed errors from the instance are used.\n * @param  {Object} options optional options with properties `separator` and `dataVar`.\n * @return {String} human readable string with all errors descriptions\n */\nfunction errorsText(errors, options) {\n  errors = errors || this.errors;\n  if (!errors) return 'No errors';\n  options = options || {};\n  var separator = options.separator === undefined ? ', ' : options.separator;\n  var dataVar = options.dataVar === undefined ? 'data' : options.dataVar;\n\n  var text = '';\n  for (var i=0; i<errors.length; i++) {\n    var e = errors[i];\n    if (e) text += dataVar + e.dataPath + ' ' + e.message + separator;\n  }\n  return text.slice(0, -separator.length);\n}\n\n\n/**\n * Add custom format\n * @this   Ajv\n * @param {String} name format name\n * @param {String|RegExp|Function} format string is converted to RegExp; function should return boolean (true when valid)\n * @return {Ajv} this for method chaining\n */\nfunction addFormat(name, format) {\n  if (typeof format == 'string') format = new RegExp(format);\n  this._formats[name] = format;\n  return this;\n}\n\n\nfunction addDraft6MetaSchema(self) {\n  var $dataSchema;\n  if (self._opts.$data) {\n    $dataSchema = __webpack_require__(675);\n    self.addMetaSchema($dataSchema, $dataSchema.$id, true);\n  }\n  if (self._opts.meta === false) return;\n  var metaSchema = __webpack_require__(676);\n  if (self._opts.$data) metaSchema = $dataMetaSchema(metaSchema, META_SUPPORT_DATA);\n  self.addMetaSchema(metaSchema, META_SCHEMA_ID, true);\n  self._refs['http://json-schema.org/schema'] = META_SCHEMA_ID;\n}\n\n\nfunction addInitialSchemas(self) {\n  var optsSchemas = self._opts.schemas;\n  if (!optsSchemas) return;\n  if (Array.isArray(optsSchemas)) self.addSchema(optsSchemas);\n  else for (var key in optsSchemas) self.addSchema(optsSchemas[key], key);\n}\n\n\nfunction addInitialFormats(self) {\n  for (var name in self._opts.formats) {\n    var format = self._opts.formats[name];\n    self.addFormat(name, format);\n  }\n}\n\n\nfunction checkUnique(self, id) {\n  if (self._schemas[id] || self._refs[id])\n    throw new Error('schema with key or id \"' + id + '\" already exists');\n}\n\n\nfunction getMetaSchemaOptions(self) {\n  var metaOpts = util.copy(self._opts);\n  for (var i=0; i<META_IGNORE_OPTIONS.length; i++)\n    delete metaOpts[META_IGNORE_OPTIONS[i]];\n  return metaOpts;\n}\n\n\nfunction setLogger(self) {\n  var logger = self._opts.logger;\n  if (logger === false) {\n    self.logger = {log: noop, warn: noop, error: noop};\n  } else {\n    if (logger === undefined) logger = console;\n    if (!(typeof logger == 'object' && logger.log && logger.warn && logger.error))\n      throw new Error('logger must implement log, warn and error methods');\n    self.logger = logger;\n  }\n}\n\n\nfunction noop() {}\n\n\n/***/ }),\n/* 648 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n\nvar Cache = module.exports = function Cache() {\n  this._cache = {};\n};\n\n\nCache.prototype.put = function Cache_put(key, value) {\n  this._cache[key] = value;\n};\n\n\nCache.prototype.get = function Cache_get(key) {\n  return this._cache[key];\n};\n\n\nCache.prototype.del = function Cache_del(key) {\n  delete this._cache[key];\n};\n\n\nCache.prototype.clear = function Cache_clear() {\n  this._cache = {};\n};\n\n\n/***/ }),\n/* 649 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n//all requires must be explicit because browserify won't work with dynamic requires\nmodule.exports = {\n  '$ref': __webpack_require__(670),\n  allOf: __webpack_require__(655),\n  anyOf: __webpack_require__(656),\n  const: __webpack_require__(657),\n  contains: __webpack_require__(658),\n  dependencies: __webpack_require__(660),\n  'enum': __webpack_require__(661),\n  format: __webpack_require__(662),\n  items: __webpack_require__(663),\n  maximum: __webpack_require__(387),\n  minimum: __webpack_require__(387),\n  maxItems: __webpack_require__(388),\n  minItems: __webpack_require__(388),\n  maxLength: __webpack_require__(389),\n  minLength: __webpack_require__(389),\n  maxProperties: __webpack_require__(390),\n  minProperties: __webpack_require__(390),\n  multipleOf: __webpack_require__(664),\n  not: __webpack_require__(665),\n  oneOf: __webpack_require__(666),\n  pattern: __webpack_require__(667),\n  properties: __webpack_require__(668),\n  propertyNames: __webpack_require__(669),\n  required: __webpack_require__(671),\n  uniqueItems: __webpack_require__(672),\n  validate: __webpack_require__(391)\n};\n\n\n/***/ }),\n/* 650 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar MissingRefError = __webpack_require__(270).MissingRef;\n\nmodule.exports = compileAsync;\n\n\n/**\n * Creates validating function for passed schema with asynchronous loading of missing schemas.\n * `loadSchema` option should be a function that accepts schema uri and returns promise that resolves with the schema.\n * @this  Ajv\n * @param {Object}   schema schema object\n * @param {Boolean}  meta optional true to compile meta-schema; this parameter can be skipped\n * @param {Function} callback an optional node-style callback, it is called with 2 parameters: error (or null) and validating function.\n * @return {Promise} promise that resolves with a validating function.\n */\nfunction compileAsync(schema, meta, callback) {\n  /* eslint no-shadow: 0 */\n  /* global Promise */\n  /* jshint validthis: true */\n  var self = this;\n  if (typeof this._opts.loadSchema != 'function')\n    throw new Error('options.loadSchema should be a function');\n\n  if (typeof meta == 'function') {\n    callback = meta;\n    meta = undefined;\n  }\n\n  var p = loadMetaSchemaOf(schema).then(function () {\n    var schemaObj = self._addSchema(schema, undefined, meta);\n    return schemaObj.validate || _compileAsync(schemaObj);\n  });\n\n  if (callback) {\n    p.then(\n      function(v) { callback(null, v); },\n      callback\n    );\n  }\n\n  return p;\n\n\n  function loadMetaSchemaOf(sch) {\n    var $schema = sch.$schema;\n    return $schema && !self.getSchema($schema)\n            ? compileAsync.call(self, { $ref: $schema }, true)\n            : Promise.resolve();\n  }\n\n\n  function _compileAsync(schemaObj) {\n    try { return self._compile(schemaObj); }\n    catch(e) {\n      if (e instanceof MissingRefError) return loadMissingSchema(e);\n      throw e;\n    }\n\n\n    function loadMissingSchema(e) {\n      var ref = e.missingSchema;\n      if (added(ref)) throw new Error('Schema ' + ref + ' is loaded but ' + e.missingRef + ' cannot be resolved');\n\n      var schemaPromise = self._loadingSchemas[ref];\n      if (!schemaPromise) {\n        schemaPromise = self._loadingSchemas[ref] = self._opts.loadSchema(ref);\n        schemaPromise.then(removePromise, removePromise);\n      }\n\n      return schemaPromise.then(function (sch) {\n        if (!added(ref)) {\n          return loadMetaSchemaOf(sch).then(function () {\n            if (!added(ref)) self.addSchema(sch, ref, undefined, meta);\n          });\n        }\n      }).then(function() {\n        return _compileAsync(schemaObj);\n      });\n\n      function removePromise() {\n        delete self._loadingSchemas[ref];\n      }\n\n      function added(ref) {\n        return self._refs[ref] || self._schemas[ref];\n      }\n    }\n  }\n}\n\n\n/***/ }),\n/* 651 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar util = __webpack_require__(114);\n\nvar DATE = /^\\d\\d\\d\\d-(\\d\\d)-(\\d\\d)$/;\nvar DAYS = [0,31,29,31,30,31,30,31,31,30,31,30,31];\nvar TIME = /^(\\d\\d):(\\d\\d):(\\d\\d)(\\.\\d+)?(z|[+-]\\d\\d:\\d\\d)?$/i;\nvar HOSTNAME = /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[-0-9a-z]{0,61}[0-9a-z])?)*$/i;\nvar URI = /^(?:[a-z][a-z0-9+\\-.]*:)(?:\\/?\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\\.[a-z0-9\\-._~!$&'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)|(?:[a-z0-9\\-._~!$&'()*+,;=]|%[0-9a-f]{2})*)(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*|\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'()*+,;=:@]|%[0-9a-f]{2})*)*)(?:\\?(?:[a-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\\-._~!$&'()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;\nvar URIREF = /^(?:[a-z][a-z0-9+\\-.]*:)?(?:\\/?\\/(?:(?:[a-z0-9\\-._~!$&'()*+,;=:]|%[0-9a-f]{2})*@)?(?:\\[(?:(?:(?:(?:[0-9a-f]{1,4}:){6}|::(?:[0-9a-f]{1,4}:){5}|(?:[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){4}|(?:(?:[0-9a-f]{1,4}:){0,1}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){3}|(?:(?:[0-9a-f]{1,4}:){0,2}[0-9a-f]{1,4})?::(?:[0-9a-f]{1,4}:){2}|(?:(?:[0-9a-f]{1,4}:){0,3}[0-9a-f]{1,4})?::[0-9a-f]{1,4}:|(?:(?:[0-9a-f]{1,4}:){0,4}[0-9a-f]{1,4})?::)(?:[0-9a-f]{1,4}:[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?))|(?:(?:[0-9a-f]{1,4}:){0,5}[0-9a-f]{1,4})?::[0-9a-f]{1,4}|(?:(?:[0-9a-f]{1,4}:){0,6}[0-9a-f]{1,4})?::)|[Vv][0-9a-f]+\\.[a-z0-9\\-._~!$&'()*+,;=:]+)\\]|(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)|(?:[a-z0-9\\-._~!$&'\"()*+,;=]|%[0-9a-f]{2})*)(?::\\d*)?(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*|\\/(?:(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*)?|(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})+(?:\\/(?:[a-z0-9\\-._~!$&'\"()*+,;=:@]|%[0-9a-f]{2})*)*)?(?:\\?(?:[a-z0-9\\-._~!$&'\"()*+,;=:@/?]|%[0-9a-f]{2})*)?(?:#(?:[a-z0-9\\-._~!$&'\"()*+,;=:@/?]|%[0-9a-f]{2})*)?$/i;\n// uri-template: https://tools.ietf.org/html/rfc6570\nvar URITEMPLATE = /^(?:(?:[^\\x00-\\x20\"'<>%\\\\^`{|}]|%[0-9a-f]{2})|\\{[+#./;?&=,!@|]?(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?(?:,(?:[a-z0-9_]|%[0-9a-f]{2})+(?::[1-9][0-9]{0,3}|\\*)?)*\\})*$/i;\n// For the source: https://gist.github.com/dperini/729294\n// For test cases: https://mathiasbynens.be/demo/url-regex\n// @todo Delete current URL in favour of the commented out URL rule when this issue is fixed https://github.com/eslint/eslint/issues/7983.\n// var URL = /^(?:(?:https?|ftp):\\/\\/)(?:\\S+(?::\\S*)?@)?(?:(?!10(?:\\.\\d{1,3}){3})(?!127(?:\\.\\d{1,3}){3})(?!169\\.254(?:\\.\\d{1,3}){2})(?!192\\.168(?:\\.\\d{1,3}){2})(?!172\\.(?:1[6-9]|2\\d|3[0-1])(?:\\.\\d{1,3}){2})(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[1-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u{00a1}-\\u{ffff}0-9]+-?)*[a-z\\u{00a1}-\\u{ffff}0-9]+)(?:\\.(?:[a-z\\u{00a1}-\\u{ffff}0-9]+-?)*[a-z\\u{00a1}-\\u{ffff}0-9]+)*(?:\\.(?:[a-z\\u{00a1}-\\u{ffff}]{2,})))(?::\\d{2,5})?(?:\\/[^\\s]*)?$/iu;\nvar URL = /^(?:(?:http[s\\u017F]?|ftp):\\/\\/)(?:(?:[\\0-\\x08\\x0E-\\x1F!-\\x9F\\xA1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uD7FF\\uE000-\\uFEFE\\uFF00-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+(?::(?:[\\0-\\x08\\x0E-\\x1F!-\\x9F\\xA1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uD7FF\\uE000-\\uFEFE\\uFF00-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])*)?@)?(?:(?!10(?:\\.[0-9]{1,3}){3})(?!127(?:\\.[0-9]{1,3}){3})(?!169\\.254(?:\\.[0-9]{1,3}){2})(?!192\\.168(?:\\.[0-9]{1,3}){2})(?!172\\.(?:1[6-9]|2[0-9]|3[01])(?:\\.[0-9]{1,3}){2})(?:[1-9][0-9]?|1[0-9][0-9]|2[01][0-9]|22[0-3])(?:\\.(?:1?[0-9]{1,2}|2[0-4][0-9]|25[0-5])){2}(?:\\.(?:[1-9][0-9]?|1[0-9][0-9]|2[0-4][0-9]|25[0-4]))|(?:(?:(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+-?)*(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+)(?:\\.(?:(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+-?)*(?:[0-9KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])+)*(?:\\.(?:(?:[KSa-z\\xA1-\\uD7FF\\uE000-\\uFFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]){2,})))(?::[0-9]{2,5})?(?:\\/(?:[\\0-\\x08\\x0E-\\x1F!-\\x9F\\xA1-\\u167F\\u1681-\\u1FFF\\u200B-\\u2027\\u202A-\\u202E\\u2030-\\u205E\\u2060-\\u2FFF\\u3001-\\uD7FF\\uE000-\\uFEFE\\uFF00-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF])*)?$/i;\nvar UUID = /^(?:urn:uuid:)?[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$/i;\nvar JSON_POINTER = /^(?:\\/(?:[^~/]|~0|~1)*)*$|^#(?:\\/(?:[a-z0-9_\\-.!$&'()*+,;:=@]|%[0-9a-f]{2}|~0|~1)*)*$/i;\nvar RELATIVE_JSON_POINTER = /^(?:0|[1-9][0-9]*)(?:#|(?:\\/(?:[^~/]|~0|~1)*)*)$/;\n\n\nmodule.exports = formats;\n\nfunction formats(mode) {\n  mode = mode == 'full' ? 'full' : 'fast';\n  return util.copy(formats[mode]);\n}\n\n\nformats.fast = {\n  // date: http://tools.ietf.org/html/rfc3339#section-5.6\n  date: /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d$/,\n  // date-time: http://tools.ietf.org/html/rfc3339#section-5.6\n  time: /^[0-2]\\d:[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:z|[+-]\\d\\d:\\d\\d)?$/i,\n  'date-time': /^\\d\\d\\d\\d-[0-1]\\d-[0-3]\\d[t\\s][0-2]\\d:[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:z|[+-]\\d\\d:\\d\\d)$/i,\n  // uri: https://github.com/mafintosh/is-my-json-valid/blob/master/formats.js\n  uri: /^(?:[a-z][a-z0-9+-.]*)(?::|\\/)\\/?[^\\s]*$/i,\n  'uri-reference': /^(?:(?:[a-z][a-z0-9+-.]*:)?\\/\\/)?[^\\s]*$/i,\n  'uri-template': URITEMPLATE,\n  url: URL,\n  // email (sources from jsen validator):\n  // http://stackoverflow.com/questions/201323/using-a-regular-expression-to-validate-an-email-address#answer-8829363\n  // http://www.w3.org/TR/html5/forms.html#valid-e-mail-address (search for 'willful violation')\n  email: /^[a-z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)*$/i,\n  hostname: HOSTNAME,\n  // optimized https://www.safaribooksonline.com/library/view/regular-expressions-cookbook/9780596802837/ch07s16.html\n  ipv4: /^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/,\n  // optimized http://stackoverflow.com/questions/53497/regular-expression-that-matches-valid-ipv6-addresses\n  ipv6: /^\\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(?:%.+)?\\s*$/i,\n  regex: regex,\n  // uuid: http://tools.ietf.org/html/rfc4122\n  uuid: UUID,\n  // JSON-pointer: https://tools.ietf.org/html/rfc6901\n  // uri fragment: https://tools.ietf.org/html/rfc3986#appendix-A\n  'json-pointer': JSON_POINTER,\n  // relative JSON-pointer: http://tools.ietf.org/html/draft-luff-relative-json-pointer-00\n  'relative-json-pointer': RELATIVE_JSON_POINTER\n};\n\n\nformats.full = {\n  date: date,\n  time: time,\n  'date-time': date_time,\n  uri: uri,\n  'uri-reference': URIREF,\n  'uri-template': URITEMPLATE,\n  url: URL,\n  email: /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&''*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i,\n  hostname: hostname,\n  ipv4: /^(?:(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$/,\n  ipv6: /^\\s*(?:(?:(?:[0-9a-f]{1,4}:){7}(?:[0-9a-f]{1,4}|:))|(?:(?:[0-9a-f]{1,4}:){6}(?::[0-9a-f]{1,4}|(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){5}(?:(?:(?::[0-9a-f]{1,4}){1,2})|:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3})|:))|(?:(?:[0-9a-f]{1,4}:){4}(?:(?:(?::[0-9a-f]{1,4}){1,3})|(?:(?::[0-9a-f]{1,4})?:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){3}(?:(?:(?::[0-9a-f]{1,4}){1,4})|(?:(?::[0-9a-f]{1,4}){0,2}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){2}(?:(?:(?::[0-9a-f]{1,4}){1,5})|(?:(?::[0-9a-f]{1,4}){0,3}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?:(?:[0-9a-f]{1,4}:){1}(?:(?:(?::[0-9a-f]{1,4}){1,6})|(?:(?::[0-9a-f]{1,4}){0,4}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:))|(?::(?:(?:(?::[0-9a-f]{1,4}){1,7})|(?:(?::[0-9a-f]{1,4}){0,5}:(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]?\\d)){3}))|:)))(?:%.+)?\\s*$/i,\n  regex: regex,\n  uuid: UUID,\n  'json-pointer': JSON_POINTER,\n  'relative-json-pointer': RELATIVE_JSON_POINTER\n};\n\n\nfunction date(str) {\n  // full-date from http://tools.ietf.org/html/rfc3339#section-5.6\n  var matches = str.match(DATE);\n  if (!matches) return false;\n\n  var month = +matches[1];\n  var day = +matches[2];\n  return month >= 1 && month <= 12 && day >= 1 && day <= DAYS[month];\n}\n\n\nfunction time(str, full) {\n  var matches = str.match(TIME);\n  if (!matches) return false;\n\n  var hour = matches[1];\n  var minute = matches[2];\n  var second = matches[3];\n  var timeZone = matches[5];\n  return hour <= 23 && minute <= 59 && second <= 59 && (!full || timeZone);\n}\n\n\nvar DATE_TIME_SEPARATOR = /t|\\s/i;\nfunction date_time(str) {\n  // http://tools.ietf.org/html/rfc3339#section-5.6\n  var dateTime = str.split(DATE_TIME_SEPARATOR);\n  return dateTime.length == 2 && date(dateTime[0]) && time(dateTime[1], true);\n}\n\n\nfunction hostname(str) {\n  // https://tools.ietf.org/html/rfc1034#section-3.5\n  // https://tools.ietf.org/html/rfc1123#section-2\n  return str.length <= 255 && HOSTNAME.test(str);\n}\n\n\nvar NOT_URI_FRAGMENT = /\\/|:/;\nfunction uri(str) {\n  // http://jmrware.com/articles/2009/uri_regexp/URI_regex.html + optional protocol + required \".\"\n  return NOT_URI_FRAGMENT.test(str) && URI.test(str);\n}\n\n\nvar Z_ANCHOR = /[^\\\\]\\\\Z/;\nfunction regex(str) {\n  if (Z_ANCHOR.test(str)) return false;\n  try {\n    new RegExp(str);\n    return true;\n  } catch(e) {\n    return false;\n  }\n}\n\n\n/***/ }),\n/* 652 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar resolve = __webpack_require__(271)\n  , util = __webpack_require__(114)\n  , errorClasses = __webpack_require__(270)\n  , stableStringify = __webpack_require__(383);\n\nvar validateGenerator = __webpack_require__(391);\n\n/**\n * Functions below are used inside compiled validations function\n */\n\nvar co = __webpack_require__(377);\nvar ucs2length = util.ucs2length;\nvar equal = __webpack_require__(272);\n\n// this error is thrown by async schemas to return validation errors via exception\nvar ValidationError = errorClasses.Validation;\n\nmodule.exports = compile;\n\n\n/**\n * Compiles schema to validation function\n * @this   Ajv\n * @param  {Object} schema schema object\n * @param  {Object} root object with information about the root schema for this schema\n * @param  {Object} localRefs the hash of local references inside the schema (created by resolve.id), used for inline resolution\n * @param  {String} baseId base ID for IDs in the schema\n * @return {Function} validation function\n */\nfunction compile(schema, root, localRefs, baseId) {\n  /* jshint validthis: true, evil: true */\n  /* eslint no-shadow: 0 */\n  var self = this\n    , opts = this._opts\n    , refVal = [ undefined ]\n    , refs = {}\n    , patterns = []\n    , patternsHash = {}\n    , defaults = []\n    , defaultsHash = {}\n    , customRules = [];\n\n  root = root || { schema: schema, refVal: refVal, refs: refs };\n\n  var c = checkCompiling.call(this, schema, root, baseId);\n  var compilation = this._compilations[c.index];\n  if (c.compiling) return (compilation.callValidate = callValidate);\n\n  var formats = this._formats;\n  var RULES = this.RULES;\n\n  try {\n    var v = localCompile(schema, root, localRefs, baseId);\n    compilation.validate = v;\n    var cv = compilation.callValidate;\n    if (cv) {\n      cv.schema = v.schema;\n      cv.errors = null;\n      cv.refs = v.refs;\n      cv.refVal = v.refVal;\n      cv.root = v.root;\n      cv.$async = v.$async;\n      if (opts.sourceCode) cv.source = v.source;\n    }\n    return v;\n  } finally {\n    endCompiling.call(this, schema, root, baseId);\n  }\n\n  function callValidate() {\n    var validate = compilation.validate;\n    var result = validate.apply(null, arguments);\n    callValidate.errors = validate.errors;\n    return result;\n  }\n\n  function localCompile(_schema, _root, localRefs, baseId) {\n    var isRoot = !_root || (_root && _root.schema == _schema);\n    if (_root.schema != root.schema)\n      return compile.call(self, _schema, _root, localRefs, baseId);\n\n    var $async = _schema.$async === true;\n\n    var sourceCode = validateGenerator({\n      isTop: true,\n      schema: _schema,\n      isRoot: isRoot,\n      baseId: baseId,\n      root: _root,\n      schemaPath: '',\n      errSchemaPath: '#',\n      errorPath: '\"\"',\n      MissingRefError: errorClasses.MissingRef,\n      RULES: RULES,\n      validate: validateGenerator,\n      util: util,\n      resolve: resolve,\n      resolveRef: resolveRef,\n      usePattern: usePattern,\n      useDefault: useDefault,\n      useCustomRule: useCustomRule,\n      opts: opts,\n      formats: formats,\n      logger: self.logger,\n      self: self\n    });\n\n    sourceCode = vars(refVal, refValCode) + vars(patterns, patternCode)\n                   + vars(defaults, defaultCode) + vars(customRules, customRuleCode)\n                   + sourceCode;\n\n    if (opts.processCode) sourceCode = opts.processCode(sourceCode);\n    // console.log('\\n\\n\\n *** \\n', JSON.stringify(sourceCode));\n    var validate;\n    try {\n      var makeValidate = new Function(\n        'self',\n        'RULES',\n        'formats',\n        'root',\n        'refVal',\n        'defaults',\n        'customRules',\n        'co',\n        'equal',\n        'ucs2length',\n        'ValidationError',\n        sourceCode\n      );\n\n      validate = makeValidate(\n        self,\n        RULES,\n        formats,\n        root,\n        refVal,\n        defaults,\n        customRules,\n        co,\n        equal,\n        ucs2length,\n        ValidationError\n      );\n\n      refVal[0] = validate;\n    } catch(e) {\n      self.logger.error('Error compiling schema, function code:', sourceCode);\n      throw e;\n    }\n\n    validate.schema = _schema;\n    validate.errors = null;\n    validate.refs = refs;\n    validate.refVal = refVal;\n    validate.root = isRoot ? validate : _root;\n    if ($async) validate.$async = true;\n    if (opts.sourceCode === true) {\n      validate.source = {\n        code: sourceCode,\n        patterns: patterns,\n        defaults: defaults\n      };\n    }\n\n    return validate;\n  }\n\n  function resolveRef(baseId, ref, isRoot) {\n    ref = resolve.url(baseId, ref);\n    var refIndex = refs[ref];\n    var _refVal, refCode;\n    if (refIndex !== undefined) {\n      _refVal = refVal[refIndex];\n      refCode = 'refVal[' + refIndex + ']';\n      return resolvedRef(_refVal, refCode);\n    }\n    if (!isRoot && root.refs) {\n      var rootRefId = root.refs[ref];\n      if (rootRefId !== undefined) {\n        _refVal = root.refVal[rootRefId];\n        refCode = addLocalRef(ref, _refVal);\n        return resolvedRef(_refVal, refCode);\n      }\n    }\n\n    refCode = addLocalRef(ref);\n    var v = resolve.call(self, localCompile, root, ref);\n    if (v === undefined) {\n      var localSchema = localRefs && localRefs[ref];\n      if (localSchema) {\n        v = resolve.inlineRef(localSchema, opts.inlineRefs)\n            ? localSchema\n            : compile.call(self, localSchema, root, localRefs, baseId);\n      }\n    }\n\n    if (v === undefined) {\n      removeLocalRef(ref);\n    } else {\n      replaceLocalRef(ref, v);\n      return resolvedRef(v, refCode);\n    }\n  }\n\n  function addLocalRef(ref, v) {\n    var refId = refVal.length;\n    refVal[refId] = v;\n    refs[ref] = refId;\n    return 'refVal' + refId;\n  }\n\n  function removeLocalRef(ref) {\n    delete refs[ref];\n  }\n\n  function replaceLocalRef(ref, v) {\n    var refId = refs[ref];\n    refVal[refId] = v;\n  }\n\n  function resolvedRef(refVal, code) {\n    return typeof refVal == 'object' || typeof refVal == 'boolean'\n            ? { code: code, schema: refVal, inline: true }\n            : { code: code, $async: refVal && refVal.$async };\n  }\n\n  function usePattern(regexStr) {\n    var index = patternsHash[regexStr];\n    if (index === undefined) {\n      index = patternsHash[regexStr] = patterns.length;\n      patterns[index] = regexStr;\n    }\n    return 'pattern' + index;\n  }\n\n  function useDefault(value) {\n    switch (typeof value) {\n      case 'boolean':\n      case 'number':\n        return '' + value;\n      case 'string':\n        return util.toQuotedString(value);\n      case 'object':\n        if (value === null) return 'null';\n        var valueStr = stableStringify(value);\n        var index = defaultsHash[valueStr];\n        if (index === undefined) {\n          index = defaultsHash[valueStr] = defaults.length;\n          defaults[index] = value;\n        }\n        return 'default' + index;\n    }\n  }\n\n  function useCustomRule(rule, schema, parentSchema, it) {\n    var validateSchema = rule.definition.validateSchema;\n    if (validateSchema && self._opts.validateSchema !== false) {\n      var valid = validateSchema(schema);\n      if (!valid) {\n        var message = 'keyword schema is invalid: ' + self.errorsText(validateSchema.errors);\n        if (self._opts.validateSchema == 'log') self.logger.error(message);\n        else throw new Error(message);\n      }\n    }\n\n    var compile = rule.definition.compile\n      , inline = rule.definition.inline\n      , macro = rule.definition.macro;\n\n    var validate;\n    if (compile) {\n      validate = compile.call(self, schema, parentSchema, it);\n    } else if (macro) {\n      validate = macro.call(self, schema, parentSchema, it);\n      if (opts.validateSchema !== false) self.validateSchema(validate, true);\n    } else if (inline) {\n      validate = inline.call(self, it, rule.keyword, schema, parentSchema);\n    } else {\n      validate = rule.definition.validate;\n      if (!validate) return;\n    }\n\n    if (validate === undefined)\n      throw new Error('custom keyword \"' + rule.keyword + '\"failed to compile');\n\n    var index = customRules.length;\n    customRules[index] = validate;\n\n    return {\n      code: 'customRule' + index,\n      validate: validate\n    };\n  }\n}\n\n\n/**\n * Checks if the schema is currently compiled\n * @this   Ajv\n * @param  {Object} schema schema to compile\n * @param  {Object} root root object\n * @param  {String} baseId base schema ID\n * @return {Object} object with properties \"index\" (compilation index) and \"compiling\" (boolean)\n */\nfunction checkCompiling(schema, root, baseId) {\n  /* jshint validthis: true */\n  var index = compIndex.call(this, schema, root, baseId);\n  if (index >= 0) return { index: index, compiling: true };\n  index = this._compilations.length;\n  this._compilations[index] = {\n    schema: schema,\n    root: root,\n    baseId: baseId\n  };\n  return { index: index, compiling: false };\n}\n\n\n/**\n * Removes the schema from the currently compiled list\n * @this   Ajv\n * @param  {Object} schema schema to compile\n * @param  {Object} root root object\n * @param  {String} baseId base schema ID\n */\nfunction endCompiling(schema, root, baseId) {\n  /* jshint validthis: true */\n  var i = compIndex.call(this, schema, root, baseId);\n  if (i >= 0) this._compilations.splice(i, 1);\n}\n\n\n/**\n * Index of schema compilation in the currently compiled list\n * @this   Ajv\n * @param  {Object} schema schema to compile\n * @param  {Object} root root object\n * @param  {String} baseId base schema ID\n * @return {Integer} compilation index\n */\nfunction compIndex(schema, root, baseId) {\n  /* jshint validthis: true */\n  for (var i=0; i<this._compilations.length; i++) {\n    var c = this._compilations[i];\n    if (c.schema == schema && c.root == root && c.baseId == baseId) return i;\n  }\n  return -1;\n}\n\n\nfunction patternCode(i, patterns) {\n  return 'var pattern' + i + ' = new RegExp(' + util.toQuotedString(patterns[i]) + ');';\n}\n\n\nfunction defaultCode(i) {\n  return 'var default' + i + ' = defaults[' + i + '];';\n}\n\n\nfunction refValCode(i, refVal) {\n  return refVal[i] === undefined ? '' : 'var refVal' + i + ' = refVal[' + i + '];';\n}\n\n\nfunction customRuleCode(i) {\n  return 'var customRule' + i + ' = customRules[' + i + '];';\n}\n\n\nfunction vars(arr, statement) {\n  if (!arr.length) return '';\n  var code = '';\n  for (var i=0; i<arr.length; i++)\n    code += statement(i, arr);\n  return code;\n}\n\n\n/***/ }),\n/* 653 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar ruleModules = __webpack_require__(649)\n  , toHash = __webpack_require__(114).toHash;\n\nmodule.exports = function rules() {\n  var RULES = [\n    { type: 'number',\n      rules: [ { 'maximum': ['exclusiveMaximum'] },\n               { 'minimum': ['exclusiveMinimum'] }, 'multipleOf', 'format'] },\n    { type: 'string',\n      rules: [ 'maxLength', 'minLength', 'pattern', 'format' ] },\n    { type: 'array',\n      rules: [ 'maxItems', 'minItems', 'uniqueItems', 'contains', 'items' ] },\n    { type: 'object',\n      rules: [ 'maxProperties', 'minProperties', 'required', 'dependencies', 'propertyNames',\n               { 'properties': ['additionalProperties', 'patternProperties'] } ] },\n    { rules: [ '$ref', 'const', 'enum', 'not', 'anyOf', 'oneOf', 'allOf' ] }\n  ];\n\n  var ALL = [ 'type' ];\n  var KEYWORDS = [\n    'additionalItems', '$schema', '$id', 'id', 'title',\n    'description', 'default', 'definitions'\n  ];\n  var TYPES = [ 'number', 'integer', 'string', 'array', 'object', 'boolean', 'null' ];\n  RULES.all = toHash(ALL);\n  RULES.types = toHash(TYPES);\n\n  RULES.forEach(function (group) {\n    group.rules = group.rules.map(function (keyword) {\n      var implKeywords;\n      if (typeof keyword == 'object') {\n        var key = Object.keys(keyword)[0];\n        implKeywords = keyword[key];\n        keyword = key;\n        implKeywords.forEach(function (k) {\n          ALL.push(k);\n          RULES.all[k] = true;\n        });\n      }\n      ALL.push(keyword);\n      var rule = RULES.all[keyword] = {\n        keyword: keyword,\n        code: ruleModules[keyword],\n        implements: implKeywords\n      };\n      return rule;\n    });\n\n    if (group.type) RULES.types[group.type] = group;\n  });\n\n  RULES.keywords = toHash(ALL.concat(KEYWORDS));\n  RULES.custom = {};\n\n  return RULES;\n};\n\n\n/***/ }),\n/* 654 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// https://mathiasbynens.be/notes/javascript-encoding\n// https://github.com/bestiejs/punycode.js - punycode.ucs2.decode\nmodule.exports = function ucs2length(str) {\n  var length = 0\n    , len = str.length\n    , pos = 0\n    , value;\n  while (pos < len) {\n    length++;\n    value = str.charCodeAt(pos++);\n    if (value >= 0xD800 && value <= 0xDBFF && pos < len) {\n      // high surrogate, and there is a next character\n      value = str.charCodeAt(pos);\n      if ((value & 0xFC00) == 0xDC00) pos++; // low surrogate\n    }\n  }\n  return length;\n};\n\n\n/***/ }),\n/* 655 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_allOf(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $it = it.util.copy(it);\n  var $closingBraces = '';\n  $it.level++;\n  var $nextValid = 'valid' + $it.level;\n  var $currentBaseId = $it.baseId,\n    $allSchemasEmpty = true;\n  var arr1 = $schema;\n  if (arr1) {\n    var $sch, $i = -1,\n      l1 = arr1.length - 1;\n    while ($i < l1) {\n      $sch = arr1[$i += 1];\n      if (it.util.schemaHasRules($sch, it.RULES.all)) {\n        $allSchemasEmpty = false;\n        $it.schema = $sch;\n        $it.schemaPath = $schemaPath + '[' + $i + ']';\n        $it.errSchemaPath = $errSchemaPath + '/' + $i;\n        out += '  ' + (it.validate($it)) + ' ';\n        $it.baseId = $currentBaseId;\n        if ($breakOnError) {\n          out += ' if (' + ($nextValid) + ') { ';\n          $closingBraces += '}';\n        }\n      }\n    }\n  }\n  if ($breakOnError) {\n    if ($allSchemasEmpty) {\n      out += ' if (true) { ';\n    } else {\n      out += ' ' + ($closingBraces.slice(0, -1)) + ' ';\n    }\n  }\n  out = it.util.cleanUpCode(out);\n  return out;\n}\n\n\n/***/ }),\n/* 656 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_anyOf(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $valid = 'valid' + $lvl;\n  var $errs = 'errs__' + $lvl;\n  var $it = it.util.copy(it);\n  var $closingBraces = '';\n  $it.level++;\n  var $nextValid = 'valid' + $it.level;\n  var $noEmptySchema = $schema.every(function($sch) {\n    return it.util.schemaHasRules($sch, it.RULES.all);\n  });\n  if ($noEmptySchema) {\n    var $currentBaseId = $it.baseId;\n    out += ' var ' + ($errs) + ' = errors; var ' + ($valid) + ' = false;  ';\n    var $wasComposite = it.compositeRule;\n    it.compositeRule = $it.compositeRule = true;\n    var arr1 = $schema;\n    if (arr1) {\n      var $sch, $i = -1,\n        l1 = arr1.length - 1;\n      while ($i < l1) {\n        $sch = arr1[$i += 1];\n        $it.schema = $sch;\n        $it.schemaPath = $schemaPath + '[' + $i + ']';\n        $it.errSchemaPath = $errSchemaPath + '/' + $i;\n        out += '  ' + (it.validate($it)) + ' ';\n        $it.baseId = $currentBaseId;\n        out += ' ' + ($valid) + ' = ' + ($valid) + ' || ' + ($nextValid) + '; if (!' + ($valid) + ') { ';\n        $closingBraces += '}';\n      }\n    }\n    it.compositeRule = $it.compositeRule = $wasComposite;\n    out += ' ' + ($closingBraces) + ' if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */\n    if (it.createErrors !== false) {\n      out += ' { keyword: \\'' + ('anyOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n      if (it.opts.messages !== false) {\n        out += ' , message: \\'should match some schema in anyOf\\' ';\n      }\n      if (it.opts.verbose) {\n        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n      }\n      out += ' } ';\n    } else {\n      out += ' {} ';\n    }\n    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n    if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n      if (it.async) {\n        out += ' throw new ValidationError(vErrors); ';\n      } else {\n        out += ' validate.errors = vErrors; return false; ';\n      }\n    }\n    out += ' } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n    if (it.opts.allErrors) {\n      out += ' } ';\n    }\n    out = it.util.cleanUpCode(out);\n  } else {\n    if ($breakOnError) {\n      out += ' if (true) { ';\n    }\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 657 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_const(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $valid = 'valid' + $lvl;\n  var $isData = it.opts.$data && $schema && $schema.$data,\n    $schemaValue;\n  if ($isData) {\n    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n    $schemaValue = 'schema' + $lvl;\n  } else {\n    $schemaValue = $schema;\n  }\n  if (!$isData) {\n    out += ' var schema' + ($lvl) + ' = validate.schema' + ($schemaPath) + ';';\n  }\n  out += 'var ' + ($valid) + ' = equal(' + ($data) + ', schema' + ($lvl) + '); if (!' + ($valid) + ') {   ';\n  var $$outStack = $$outStack || [];\n  $$outStack.push(out);\n  out = ''; /* istanbul ignore else */\n  if (it.createErrors !== false) {\n    out += ' { keyword: \\'' + ('const') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n    if (it.opts.messages !== false) {\n      out += ' , message: \\'should be equal to constant\\' ';\n    }\n    if (it.opts.verbose) {\n      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n    }\n    out += ' } ';\n  } else {\n    out += ' {} ';\n  }\n  var __err = out;\n  out = $$outStack.pop();\n  if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n    if (it.async) {\n      out += ' throw new ValidationError([' + (__err) + ']); ';\n    } else {\n      out += ' validate.errors = [' + (__err) + ']; return false; ';\n    }\n  } else {\n    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n  }\n  out += ' }';\n  if ($breakOnError) {\n    out += ' else { ';\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 658 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_contains(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $valid = 'valid' + $lvl;\n  var $errs = 'errs__' + $lvl;\n  var $it = it.util.copy(it);\n  var $closingBraces = '';\n  $it.level++;\n  var $nextValid = 'valid' + $it.level;\n  var $idx = 'i' + $lvl,\n    $dataNxt = $it.dataLevel = it.dataLevel + 1,\n    $nextData = 'data' + $dataNxt,\n    $currentBaseId = it.baseId,\n    $nonEmptySchema = it.util.schemaHasRules($schema, it.RULES.all);\n  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';\n  if ($nonEmptySchema) {\n    var $wasComposite = it.compositeRule;\n    it.compositeRule = $it.compositeRule = true;\n    $it.schema = $schema;\n    $it.schemaPath = $schemaPath;\n    $it.errSchemaPath = $errSchemaPath;\n    out += ' var ' + ($nextValid) + ' = false; for (var ' + ($idx) + ' = 0; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';\n    $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);\n    var $passData = $data + '[' + $idx + ']';\n    $it.dataPathArr[$dataNxt] = $idx;\n    var $code = it.validate($it);\n    $it.baseId = $currentBaseId;\n    if (it.util.varOccurences($code, $nextData) < 2) {\n      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n    } else {\n      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n    }\n    out += ' if (' + ($nextValid) + ') break; }  ';\n    it.compositeRule = $it.compositeRule = $wasComposite;\n    out += ' ' + ($closingBraces) + ' if (!' + ($nextValid) + ') {';\n  } else {\n    out += ' if (' + ($data) + '.length == 0) {';\n  }\n  var $$outStack = $$outStack || [];\n  $$outStack.push(out);\n  out = ''; /* istanbul ignore else */\n  if (it.createErrors !== false) {\n    out += ' { keyword: \\'' + ('contains') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n    if (it.opts.messages !== false) {\n      out += ' , message: \\'should contain a valid item\\' ';\n    }\n    if (it.opts.verbose) {\n      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n    }\n    out += ' } ';\n  } else {\n    out += ' {} ';\n  }\n  var __err = out;\n  out = $$outStack.pop();\n  if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n    if (it.async) {\n      out += ' throw new ValidationError([' + (__err) + ']); ';\n    } else {\n      out += ' validate.errors = [' + (__err) + ']; return false; ';\n    }\n  } else {\n    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n  }\n  out += ' } else { ';\n  if ($nonEmptySchema) {\n    out += '  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n  }\n  if (it.opts.allErrors) {\n    out += ' } ';\n  }\n  out = it.util.cleanUpCode(out);\n  return out;\n}\n\n\n/***/ }),\n/* 659 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_custom(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $errorKeyword;\n  var $data = 'data' + ($dataLvl || '');\n  var $valid = 'valid' + $lvl;\n  var $errs = 'errs__' + $lvl;\n  var $isData = it.opts.$data && $schema && $schema.$data,\n    $schemaValue;\n  if ($isData) {\n    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n    $schemaValue = 'schema' + $lvl;\n  } else {\n    $schemaValue = $schema;\n  }\n  var $rule = this,\n    $definition = 'definition' + $lvl,\n    $rDef = $rule.definition,\n    $closingBraces = '';\n  var $compile, $inline, $macro, $ruleValidate, $validateCode;\n  if ($isData && $rDef.$data) {\n    $validateCode = 'keywordValidate' + $lvl;\n    var $validateSchema = $rDef.validateSchema;\n    out += ' var ' + ($definition) + ' = RULES.custom[\\'' + ($keyword) + '\\'].definition; var ' + ($validateCode) + ' = ' + ($definition) + '.validate;';\n  } else {\n    $ruleValidate = it.useCustomRule($rule, $schema, it.schema, it);\n    if (!$ruleValidate) return;\n    $schemaValue = 'validate.schema' + $schemaPath;\n    $validateCode = $ruleValidate.code;\n    $compile = $rDef.compile;\n    $inline = $rDef.inline;\n    $macro = $rDef.macro;\n  }\n  var $ruleErrs = $validateCode + '.errors',\n    $i = 'i' + $lvl,\n    $ruleErr = 'ruleErr' + $lvl,\n    $asyncKeyword = $rDef.async;\n  if ($asyncKeyword && !it.async) throw new Error('async keyword in sync schema');\n  if (!($inline || $macro)) {\n    out += '' + ($ruleErrs) + ' = null;';\n  }\n  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';\n  if ($isData && $rDef.$data) {\n    $closingBraces += '}';\n    out += ' if (' + ($schemaValue) + ' === undefined) { ' + ($valid) + ' = true; } else { ';\n    if ($validateSchema) {\n      $closingBraces += '}';\n      out += ' ' + ($valid) + ' = ' + ($definition) + '.validateSchema(' + ($schemaValue) + '); if (' + ($valid) + ') { ';\n    }\n  }\n  if ($inline) {\n    if ($rDef.statements) {\n      out += ' ' + ($ruleValidate.validate) + ' ';\n    } else {\n      out += ' ' + ($valid) + ' = ' + ($ruleValidate.validate) + '; ';\n    }\n  } else if ($macro) {\n    var $it = it.util.copy(it);\n    var $closingBraces = '';\n    $it.level++;\n    var $nextValid = 'valid' + $it.level;\n    $it.schema = $ruleValidate.validate;\n    $it.schemaPath = '';\n    var $wasComposite = it.compositeRule;\n    it.compositeRule = $it.compositeRule = true;\n    var $code = it.validate($it).replace(/validate\\.schema/g, $validateCode);\n    it.compositeRule = $it.compositeRule = $wasComposite;\n    out += ' ' + ($code);\n  } else {\n    var $$outStack = $$outStack || [];\n    $$outStack.push(out);\n    out = '';\n    out += '  ' + ($validateCode) + '.call( ';\n    if (it.opts.passContext) {\n      out += 'this';\n    } else {\n      out += 'self';\n    }\n    if ($compile || $rDef.schema === false) {\n      out += ' , ' + ($data) + ' ';\n    } else {\n      out += ' , ' + ($schemaValue) + ' , ' + ($data) + ' , validate.schema' + (it.schemaPath) + ' ';\n    }\n    out += ' , (dataPath || \\'\\')';\n    if (it.errorPath != '\"\"') {\n      out += ' + ' + (it.errorPath);\n    }\n    var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',\n      $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';\n    out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ' , rootData )  ';\n    var def_callRuleValidate = out;\n    out = $$outStack.pop();\n    if ($rDef.errors === false) {\n      out += ' ' + ($valid) + ' = ';\n      if ($asyncKeyword) {\n        out += '' + (it.yieldAwait);\n      }\n      out += '' + (def_callRuleValidate) + '; ';\n    } else {\n      if ($asyncKeyword) {\n        $ruleErrs = 'customErrors' + $lvl;\n        out += ' var ' + ($ruleErrs) + ' = null; try { ' + ($valid) + ' = ' + (it.yieldAwait) + (def_callRuleValidate) + '; } catch (e) { ' + ($valid) + ' = false; if (e instanceof ValidationError) ' + ($ruleErrs) + ' = e.errors; else throw e; } ';\n      } else {\n        out += ' ' + ($ruleErrs) + ' = null; ' + ($valid) + ' = ' + (def_callRuleValidate) + '; ';\n      }\n    }\n  }\n  if ($rDef.modifying) {\n    out += ' if (' + ($parentData) + ') ' + ($data) + ' = ' + ($parentData) + '[' + ($parentDataProperty) + '];';\n  }\n  out += '' + ($closingBraces);\n  if ($rDef.valid) {\n    if ($breakOnError) {\n      out += ' if (true) { ';\n    }\n  } else {\n    out += ' if ( ';\n    if ($rDef.valid === undefined) {\n      out += ' !';\n      if ($macro) {\n        out += '' + ($nextValid);\n      } else {\n        out += '' + ($valid);\n      }\n    } else {\n      out += ' ' + (!$rDef.valid) + ' ';\n    }\n    out += ') { ';\n    $errorKeyword = $rule.keyword;\n    var $$outStack = $$outStack || [];\n    $$outStack.push(out);\n    out = '';\n    var $$outStack = $$outStack || [];\n    $$outStack.push(out);\n    out = ''; /* istanbul ignore else */\n    if (it.createErrors !== false) {\n      out += ' { keyword: \\'' + ($errorKeyword || 'custom') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \\'' + ($rule.keyword) + '\\' } ';\n      if (it.opts.messages !== false) {\n        out += ' , message: \\'should pass \"' + ($rule.keyword) + '\" keyword validation\\' ';\n      }\n      if (it.opts.verbose) {\n        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n      }\n      out += ' } ';\n    } else {\n      out += ' {} ';\n    }\n    var __err = out;\n    out = $$outStack.pop();\n    if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n      if (it.async) {\n        out += ' throw new ValidationError([' + (__err) + ']); ';\n      } else {\n        out += ' validate.errors = [' + (__err) + ']; return false; ';\n      }\n    } else {\n      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n    }\n    var def_customError = out;\n    out = $$outStack.pop();\n    if ($inline) {\n      if ($rDef.errors) {\n        if ($rDef.errors != 'full') {\n          out += '  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \\'\\') + ' + (it.errorPath) + '; if (' + ($ruleErr) + '.schemaPath === undefined) { ' + ($ruleErr) + '.schemaPath = \"' + ($errSchemaPath) + '\"; } ';\n          if (it.opts.verbose) {\n            out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';\n          }\n          out += ' } ';\n        }\n      } else {\n        if ($rDef.errors === false) {\n          out += ' ' + (def_customError) + ' ';\n        } else {\n          out += ' if (' + ($errs) + ' == errors) { ' + (def_customError) + ' } else {  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \\'\\') + ' + (it.errorPath) + '; if (' + ($ruleErr) + '.schemaPath === undefined) { ' + ($ruleErr) + '.schemaPath = \"' + ($errSchemaPath) + '\"; } ';\n          if (it.opts.verbose) {\n            out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';\n          }\n          out += ' } } ';\n        }\n      }\n    } else if ($macro) {\n      out += '   var err =   '; /* istanbul ignore else */\n      if (it.createErrors !== false) {\n        out += ' { keyword: \\'' + ($errorKeyword || 'custom') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { keyword: \\'' + ($rule.keyword) + '\\' } ';\n        if (it.opts.messages !== false) {\n          out += ' , message: \\'should pass \"' + ($rule.keyword) + '\" keyword validation\\' ';\n        }\n        if (it.opts.verbose) {\n          out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n        }\n        out += ' } ';\n      } else {\n        out += ' {} ';\n      }\n      out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n      if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n        if (it.async) {\n          out += ' throw new ValidationError(vErrors); ';\n        } else {\n          out += ' validate.errors = vErrors; return false; ';\n        }\n      }\n    } else {\n      if ($rDef.errors === false) {\n        out += ' ' + (def_customError) + ' ';\n      } else {\n        out += ' if (Array.isArray(' + ($ruleErrs) + ')) { if (vErrors === null) vErrors = ' + ($ruleErrs) + '; else vErrors = vErrors.concat(' + ($ruleErrs) + '); errors = vErrors.length;  for (var ' + ($i) + '=' + ($errs) + '; ' + ($i) + '<errors; ' + ($i) + '++) { var ' + ($ruleErr) + ' = vErrors[' + ($i) + ']; if (' + ($ruleErr) + '.dataPath === undefined) ' + ($ruleErr) + '.dataPath = (dataPath || \\'\\') + ' + (it.errorPath) + ';  ' + ($ruleErr) + '.schemaPath = \"' + ($errSchemaPath) + '\";  ';\n        if (it.opts.verbose) {\n          out += ' ' + ($ruleErr) + '.schema = ' + ($schemaValue) + '; ' + ($ruleErr) + '.data = ' + ($data) + '; ';\n        }\n        out += ' } } else { ' + (def_customError) + ' } ';\n      }\n    }\n    out += ' } ';\n    if ($breakOnError) {\n      out += ' else { ';\n    }\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 660 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_dependencies(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $errs = 'errs__' + $lvl;\n  var $it = it.util.copy(it);\n  var $closingBraces = '';\n  $it.level++;\n  var $nextValid = 'valid' + $it.level;\n  var $schemaDeps = {},\n    $propertyDeps = {},\n    $ownProperties = it.opts.ownProperties;\n  for ($property in $schema) {\n    var $sch = $schema[$property];\n    var $deps = Array.isArray($sch) ? $propertyDeps : $schemaDeps;\n    $deps[$property] = $sch;\n  }\n  out += 'var ' + ($errs) + ' = errors;';\n  var $currentErrorPath = it.errorPath;\n  out += 'var missing' + ($lvl) + ';';\n  for (var $property in $propertyDeps) {\n    $deps = $propertyDeps[$property];\n    if ($deps.length) {\n      out += ' if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';\n      if ($ownProperties) {\n        out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($property)) + '\\') ';\n      }\n      if ($breakOnError) {\n        out += ' && ( ';\n        var arr1 = $deps;\n        if (arr1) {\n          var $propertyKey, $i = -1,\n            l1 = arr1.length - 1;\n          while ($i < l1) {\n            $propertyKey = arr1[$i += 1];\n            if ($i) {\n              out += ' || ';\n            }\n            var $prop = it.util.getProperty($propertyKey),\n              $useData = $data + $prop;\n            out += ' ( ( ' + ($useData) + ' === undefined ';\n            if ($ownProperties) {\n              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n            }\n            out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';\n          }\n        }\n        out += ')) {  ';\n        var $propertyPath = 'missing' + $lvl,\n          $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n        if (it.opts._errorDataPathProperty) {\n          it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;\n        }\n        var $$outStack = $$outStack || [];\n        $$outStack.push(out);\n        out = ''; /* istanbul ignore else */\n        if (it.createErrors !== false) {\n          out += ' { keyword: \\'' + ('dependencies') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \\'' + (it.util.escapeQuotes($property)) + '\\', missingProperty: \\'' + ($missingProperty) + '\\', depsCount: ' + ($deps.length) + ', deps: \\'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(\", \"))) + '\\' } ';\n          if (it.opts.messages !== false) {\n            out += ' , message: \\'should have ';\n            if ($deps.length == 1) {\n              out += 'property ' + (it.util.escapeQuotes($deps[0]));\n            } else {\n              out += 'properties ' + (it.util.escapeQuotes($deps.join(\", \")));\n            }\n            out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\\' ';\n          }\n          if (it.opts.verbose) {\n            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n          }\n          out += ' } ';\n        } else {\n          out += ' {} ';\n        }\n        var __err = out;\n        out = $$outStack.pop();\n        if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n          if (it.async) {\n            out += ' throw new ValidationError([' + (__err) + ']); ';\n          } else {\n            out += ' validate.errors = [' + (__err) + ']; return false; ';\n          }\n        } else {\n          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n        }\n      } else {\n        out += ' ) { ';\n        var arr2 = $deps;\n        if (arr2) {\n          var $propertyKey, i2 = -1,\n            l2 = arr2.length - 1;\n          while (i2 < l2) {\n            $propertyKey = arr2[i2 += 1];\n            var $prop = it.util.getProperty($propertyKey),\n              $missingProperty = it.util.escapeQuotes($propertyKey),\n              $useData = $data + $prop;\n            if (it.opts._errorDataPathProperty) {\n              it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);\n            }\n            out += ' if ( ' + ($useData) + ' === undefined ';\n            if ($ownProperties) {\n              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n            }\n            out += ') {  var err =   '; /* istanbul ignore else */\n            if (it.createErrors !== false) {\n              out += ' { keyword: \\'' + ('dependencies') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { property: \\'' + (it.util.escapeQuotes($property)) + '\\', missingProperty: \\'' + ($missingProperty) + '\\', depsCount: ' + ($deps.length) + ', deps: \\'' + (it.util.escapeQuotes($deps.length == 1 ? $deps[0] : $deps.join(\", \"))) + '\\' } ';\n              if (it.opts.messages !== false) {\n                out += ' , message: \\'should have ';\n                if ($deps.length == 1) {\n                  out += 'property ' + (it.util.escapeQuotes($deps[0]));\n                } else {\n                  out += 'properties ' + (it.util.escapeQuotes($deps.join(\", \")));\n                }\n                out += ' when property ' + (it.util.escapeQuotes($property)) + ' is present\\' ';\n              }\n              if (it.opts.verbose) {\n                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n              }\n              out += ' } ';\n            } else {\n              out += ' {} ';\n            }\n            out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';\n          }\n        }\n      }\n      out += ' }   ';\n      if ($breakOnError) {\n        $closingBraces += '}';\n        out += ' else { ';\n      }\n    }\n  }\n  it.errorPath = $currentErrorPath;\n  var $currentBaseId = $it.baseId;\n  for (var $property in $schemaDeps) {\n    var $sch = $schemaDeps[$property];\n    if (it.util.schemaHasRules($sch, it.RULES.all)) {\n      out += ' ' + ($nextValid) + ' = true; if ( ' + ($data) + (it.util.getProperty($property)) + ' !== undefined ';\n      if ($ownProperties) {\n        out += ' && Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($property)) + '\\') ';\n      }\n      out += ') { ';\n      $it.schema = $sch;\n      $it.schemaPath = $schemaPath + it.util.getProperty($property);\n      $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($property);\n      out += '  ' + (it.validate($it)) + ' ';\n      $it.baseId = $currentBaseId;\n      out += ' }  ';\n      if ($breakOnError) {\n        out += ' if (' + ($nextValid) + ') { ';\n        $closingBraces += '}';\n      }\n    }\n  }\n  if ($breakOnError) {\n    out += '   ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n  }\n  out = it.util.cleanUpCode(out);\n  return out;\n}\n\n\n/***/ }),\n/* 661 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_enum(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $valid = 'valid' + $lvl;\n  var $isData = it.opts.$data && $schema && $schema.$data,\n    $schemaValue;\n  if ($isData) {\n    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n    $schemaValue = 'schema' + $lvl;\n  } else {\n    $schemaValue = $schema;\n  }\n  var $i = 'i' + $lvl,\n    $vSchema = 'schema' + $lvl;\n  if (!$isData) {\n    out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + ';';\n  }\n  out += 'var ' + ($valid) + ';';\n  if ($isData) {\n    out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';\n  }\n  out += '' + ($valid) + ' = false;for (var ' + ($i) + '=0; ' + ($i) + '<' + ($vSchema) + '.length; ' + ($i) + '++) if (equal(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + '])) { ' + ($valid) + ' = true; break; }';\n  if ($isData) {\n    out += '  }  ';\n  }\n  out += ' if (!' + ($valid) + ') {   ';\n  var $$outStack = $$outStack || [];\n  $$outStack.push(out);\n  out = ''; /* istanbul ignore else */\n  if (it.createErrors !== false) {\n    out += ' { keyword: \\'' + ('enum') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { allowedValues: schema' + ($lvl) + ' } ';\n    if (it.opts.messages !== false) {\n      out += ' , message: \\'should be equal to one of the allowed values\\' ';\n    }\n    if (it.opts.verbose) {\n      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n    }\n    out += ' } ';\n  } else {\n    out += ' {} ';\n  }\n  var __err = out;\n  out = $$outStack.pop();\n  if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n    if (it.async) {\n      out += ' throw new ValidationError([' + (__err) + ']); ';\n    } else {\n      out += ' validate.errors = [' + (__err) + ']; return false; ';\n    }\n  } else {\n    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n  }\n  out += ' }';\n  if ($breakOnError) {\n    out += ' else { ';\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 662 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_format(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  if (it.opts.format === false) {\n    if ($breakOnError) {\n      out += ' if (true) { ';\n    }\n    return out;\n  }\n  var $isData = it.opts.$data && $schema && $schema.$data,\n    $schemaValue;\n  if ($isData) {\n    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n    $schemaValue = 'schema' + $lvl;\n  } else {\n    $schemaValue = $schema;\n  }\n  var $unknownFormats = it.opts.unknownFormats,\n    $allowUnknown = Array.isArray($unknownFormats);\n  if ($isData) {\n    var $format = 'format' + $lvl,\n      $isObject = 'isObject' + $lvl,\n      $formatType = 'formatType' + $lvl;\n    out += ' var ' + ($format) + ' = formats[' + ($schemaValue) + ']; var ' + ($isObject) + ' = typeof ' + ($format) + ' == \\'object\\' && !(' + ($format) + ' instanceof RegExp) && ' + ($format) + '.validate; var ' + ($formatType) + ' = ' + ($isObject) + ' && ' + ($format) + '.type || \\'string\\'; if (' + ($isObject) + ') { ';\n    if (it.async) {\n      out += ' var async' + ($lvl) + ' = ' + ($format) + '.async; ';\n    }\n    out += ' ' + ($format) + ' = ' + ($format) + '.validate; } if (  ';\n    if ($isData) {\n      out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'string\\') || ';\n    }\n    out += ' (';\n    if ($unknownFormats != 'ignore') {\n      out += ' (' + ($schemaValue) + ' && !' + ($format) + ' ';\n      if ($allowUnknown) {\n        out += ' && self._opts.unknownFormats.indexOf(' + ($schemaValue) + ') == -1 ';\n      }\n      out += ') || ';\n    }\n    out += ' (' + ($format) + ' && ' + ($formatType) + ' == \\'' + ($ruleType) + '\\' && !(typeof ' + ($format) + ' == \\'function\\' ? ';\n    if (it.async) {\n      out += ' (async' + ($lvl) + ' ? ' + (it.yieldAwait) + ' ' + ($format) + '(' + ($data) + ') : ' + ($format) + '(' + ($data) + ')) ';\n    } else {\n      out += ' ' + ($format) + '(' + ($data) + ') ';\n    }\n    out += ' : ' + ($format) + '.test(' + ($data) + '))))) {';\n  } else {\n    var $format = it.formats[$schema];\n    if (!$format) {\n      if ($unknownFormats == 'ignore') {\n        it.logger.warn('unknown format \"' + $schema + '\" ignored in schema at path \"' + it.errSchemaPath + '\"');\n        if ($breakOnError) {\n          out += ' if (true) { ';\n        }\n        return out;\n      } else if ($allowUnknown && $unknownFormats.indexOf($schema) >= 0) {\n        if ($breakOnError) {\n          out += ' if (true) { ';\n        }\n        return out;\n      } else {\n        throw new Error('unknown format \"' + $schema + '\" is used in schema at path \"' + it.errSchemaPath + '\"');\n      }\n    }\n    var $isObject = typeof $format == 'object' && !($format instanceof RegExp) && $format.validate;\n    var $formatType = $isObject && $format.type || 'string';\n    if ($isObject) {\n      var $async = $format.async === true;\n      $format = $format.validate;\n    }\n    if ($formatType != $ruleType) {\n      if ($breakOnError) {\n        out += ' if (true) { ';\n      }\n      return out;\n    }\n    if ($async) {\n      if (!it.async) throw new Error('async format in sync schema');\n      var $formatRef = 'formats' + it.util.getProperty($schema) + '.validate';\n      out += ' if (!(' + (it.yieldAwait) + ' ' + ($formatRef) + '(' + ($data) + '))) { ';\n    } else {\n      out += ' if (! ';\n      var $formatRef = 'formats' + it.util.getProperty($schema);\n      if ($isObject) $formatRef += '.validate';\n      if (typeof $format == 'function') {\n        out += ' ' + ($formatRef) + '(' + ($data) + ') ';\n      } else {\n        out += ' ' + ($formatRef) + '.test(' + ($data) + ') ';\n      }\n      out += ') { ';\n    }\n  }\n  var $$outStack = $$outStack || [];\n  $$outStack.push(out);\n  out = ''; /* istanbul ignore else */\n  if (it.createErrors !== false) {\n    out += ' { keyword: \\'' + ('format') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { format:  ';\n    if ($isData) {\n      out += '' + ($schemaValue);\n    } else {\n      out += '' + (it.util.toQuotedString($schema));\n    }\n    out += '  } ';\n    if (it.opts.messages !== false) {\n      out += ' , message: \\'should match format \"';\n      if ($isData) {\n        out += '\\' + ' + ($schemaValue) + ' + \\'';\n      } else {\n        out += '' + (it.util.escapeQuotes($schema));\n      }\n      out += '\"\\' ';\n    }\n    if (it.opts.verbose) {\n      out += ' , schema:  ';\n      if ($isData) {\n        out += 'validate.schema' + ($schemaPath);\n      } else {\n        out += '' + (it.util.toQuotedString($schema));\n      }\n      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n    }\n    out += ' } ';\n  } else {\n    out += ' {} ';\n  }\n  var __err = out;\n  out = $$outStack.pop();\n  if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n    if (it.async) {\n      out += ' throw new ValidationError([' + (__err) + ']); ';\n    } else {\n      out += ' validate.errors = [' + (__err) + ']; return false; ';\n    }\n  } else {\n    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n  }\n  out += ' } ';\n  if ($breakOnError) {\n    out += ' else { ';\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 663 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_items(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $valid = 'valid' + $lvl;\n  var $errs = 'errs__' + $lvl;\n  var $it = it.util.copy(it);\n  var $closingBraces = '';\n  $it.level++;\n  var $nextValid = 'valid' + $it.level;\n  var $idx = 'i' + $lvl,\n    $dataNxt = $it.dataLevel = it.dataLevel + 1,\n    $nextData = 'data' + $dataNxt,\n    $currentBaseId = it.baseId;\n  out += 'var ' + ($errs) + ' = errors;var ' + ($valid) + ';';\n  if (Array.isArray($schema)) {\n    var $additionalItems = it.schema.additionalItems;\n    if ($additionalItems === false) {\n      out += ' ' + ($valid) + ' = ' + ($data) + '.length <= ' + ($schema.length) + '; ';\n      var $currErrSchemaPath = $errSchemaPath;\n      $errSchemaPath = it.errSchemaPath + '/additionalItems';\n      out += '  if (!' + ($valid) + ') {   ';\n      var $$outStack = $$outStack || [];\n      $$outStack.push(out);\n      out = ''; /* istanbul ignore else */\n      if (it.createErrors !== false) {\n        out += ' { keyword: \\'' + ('additionalItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { limit: ' + ($schema.length) + ' } ';\n        if (it.opts.messages !== false) {\n          out += ' , message: \\'should NOT have more than ' + ($schema.length) + ' items\\' ';\n        }\n        if (it.opts.verbose) {\n          out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n        }\n        out += ' } ';\n      } else {\n        out += ' {} ';\n      }\n      var __err = out;\n      out = $$outStack.pop();\n      if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n        if (it.async) {\n          out += ' throw new ValidationError([' + (__err) + ']); ';\n        } else {\n          out += ' validate.errors = [' + (__err) + ']; return false; ';\n        }\n      } else {\n        out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n      }\n      out += ' } ';\n      $errSchemaPath = $currErrSchemaPath;\n      if ($breakOnError) {\n        $closingBraces += '}';\n        out += ' else { ';\n      }\n    }\n    var arr1 = $schema;\n    if (arr1) {\n      var $sch, $i = -1,\n        l1 = arr1.length - 1;\n      while ($i < l1) {\n        $sch = arr1[$i += 1];\n        if (it.util.schemaHasRules($sch, it.RULES.all)) {\n          out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($i) + ') { ';\n          var $passData = $data + '[' + $i + ']';\n          $it.schema = $sch;\n          $it.schemaPath = $schemaPath + '[' + $i + ']';\n          $it.errSchemaPath = $errSchemaPath + '/' + $i;\n          $it.errorPath = it.util.getPathExpr(it.errorPath, $i, it.opts.jsonPointers, true);\n          $it.dataPathArr[$dataNxt] = $i;\n          var $code = it.validate($it);\n          $it.baseId = $currentBaseId;\n          if (it.util.varOccurences($code, $nextData) < 2) {\n            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n          } else {\n            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n          }\n          out += ' }  ';\n          if ($breakOnError) {\n            out += ' if (' + ($nextValid) + ') { ';\n            $closingBraces += '}';\n          }\n        }\n      }\n    }\n    if (typeof $additionalItems == 'object' && it.util.schemaHasRules($additionalItems, it.RULES.all)) {\n      $it.schema = $additionalItems;\n      $it.schemaPath = it.schemaPath + '.additionalItems';\n      $it.errSchemaPath = it.errSchemaPath + '/additionalItems';\n      out += ' ' + ($nextValid) + ' = true; if (' + ($data) + '.length > ' + ($schema.length) + ') {  for (var ' + ($idx) + ' = ' + ($schema.length) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';\n      $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);\n      var $passData = $data + '[' + $idx + ']';\n      $it.dataPathArr[$dataNxt] = $idx;\n      var $code = it.validate($it);\n      $it.baseId = $currentBaseId;\n      if (it.util.varOccurences($code, $nextData) < 2) {\n        out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n      } else {\n        out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n      }\n      if ($breakOnError) {\n        out += ' if (!' + ($nextValid) + ') break; ';\n      }\n      out += ' } }  ';\n      if ($breakOnError) {\n        out += ' if (' + ($nextValid) + ') { ';\n        $closingBraces += '}';\n      }\n    }\n  } else if (it.util.schemaHasRules($schema, it.RULES.all)) {\n    $it.schema = $schema;\n    $it.schemaPath = $schemaPath;\n    $it.errSchemaPath = $errSchemaPath;\n    out += '  for (var ' + ($idx) + ' = ' + (0) + '; ' + ($idx) + ' < ' + ($data) + '.length; ' + ($idx) + '++) { ';\n    $it.errorPath = it.util.getPathExpr(it.errorPath, $idx, it.opts.jsonPointers, true);\n    var $passData = $data + '[' + $idx + ']';\n    $it.dataPathArr[$dataNxt] = $idx;\n    var $code = it.validate($it);\n    $it.baseId = $currentBaseId;\n    if (it.util.varOccurences($code, $nextData) < 2) {\n      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n    } else {\n      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n    }\n    if ($breakOnError) {\n      out += ' if (!' + ($nextValid) + ') break; ';\n    }\n    out += ' }';\n  }\n  if ($breakOnError) {\n    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n  }\n  out = it.util.cleanUpCode(out);\n  return out;\n}\n\n\n/***/ }),\n/* 664 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_multipleOf(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $isData = it.opts.$data && $schema && $schema.$data,\n    $schemaValue;\n  if ($isData) {\n    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n    $schemaValue = 'schema' + $lvl;\n  } else {\n    $schemaValue = $schema;\n  }\n  out += 'var division' + ($lvl) + ';if (';\n  if ($isData) {\n    out += ' ' + ($schemaValue) + ' !== undefined && ( typeof ' + ($schemaValue) + ' != \\'number\\' || ';\n  }\n  out += ' (division' + ($lvl) + ' = ' + ($data) + ' / ' + ($schemaValue) + ', ';\n  if (it.opts.multipleOfPrecision) {\n    out += ' Math.abs(Math.round(division' + ($lvl) + ') - division' + ($lvl) + ') > 1e-' + (it.opts.multipleOfPrecision) + ' ';\n  } else {\n    out += ' division' + ($lvl) + ' !== parseInt(division' + ($lvl) + ') ';\n  }\n  out += ' ) ';\n  if ($isData) {\n    out += '  )  ';\n  }\n  out += ' ) {   ';\n  var $$outStack = $$outStack || [];\n  $$outStack.push(out);\n  out = ''; /* istanbul ignore else */\n  if (it.createErrors !== false) {\n    out += ' { keyword: \\'' + ('multipleOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { multipleOf: ' + ($schemaValue) + ' } ';\n    if (it.opts.messages !== false) {\n      out += ' , message: \\'should be multiple of ';\n      if ($isData) {\n        out += '\\' + ' + ($schemaValue);\n      } else {\n        out += '' + ($schemaValue) + '\\'';\n      }\n    }\n    if (it.opts.verbose) {\n      out += ' , schema:  ';\n      if ($isData) {\n        out += 'validate.schema' + ($schemaPath);\n      } else {\n        out += '' + ($schema);\n      }\n      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n    }\n    out += ' } ';\n  } else {\n    out += ' {} ';\n  }\n  var __err = out;\n  out = $$outStack.pop();\n  if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n    if (it.async) {\n      out += ' throw new ValidationError([' + (__err) + ']); ';\n    } else {\n      out += ' validate.errors = [' + (__err) + ']; return false; ';\n    }\n  } else {\n    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n  }\n  out += '} ';\n  if ($breakOnError) {\n    out += ' else { ';\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 665 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_not(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $errs = 'errs__' + $lvl;\n  var $it = it.util.copy(it);\n  $it.level++;\n  var $nextValid = 'valid' + $it.level;\n  if (it.util.schemaHasRules($schema, it.RULES.all)) {\n    $it.schema = $schema;\n    $it.schemaPath = $schemaPath;\n    $it.errSchemaPath = $errSchemaPath;\n    out += ' var ' + ($errs) + ' = errors;  ';\n    var $wasComposite = it.compositeRule;\n    it.compositeRule = $it.compositeRule = true;\n    $it.createErrors = false;\n    var $allErrorsOption;\n    if ($it.opts.allErrors) {\n      $allErrorsOption = $it.opts.allErrors;\n      $it.opts.allErrors = false;\n    }\n    out += ' ' + (it.validate($it)) + ' ';\n    $it.createErrors = true;\n    if ($allErrorsOption) $it.opts.allErrors = $allErrorsOption;\n    it.compositeRule = $it.compositeRule = $wasComposite;\n    out += ' if (' + ($nextValid) + ') {   ';\n    var $$outStack = $$outStack || [];\n    $$outStack.push(out);\n    out = ''; /* istanbul ignore else */\n    if (it.createErrors !== false) {\n      out += ' { keyword: \\'' + ('not') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n      if (it.opts.messages !== false) {\n        out += ' , message: \\'should NOT be valid\\' ';\n      }\n      if (it.opts.verbose) {\n        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n      }\n      out += ' } ';\n    } else {\n      out += ' {} ';\n    }\n    var __err = out;\n    out = $$outStack.pop();\n    if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n      if (it.async) {\n        out += ' throw new ValidationError([' + (__err) + ']); ';\n      } else {\n        out += ' validate.errors = [' + (__err) + ']; return false; ';\n      }\n    } else {\n      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n    }\n    out += ' } else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; } ';\n    if (it.opts.allErrors) {\n      out += ' } ';\n    }\n  } else {\n    out += '  var err =   '; /* istanbul ignore else */\n    if (it.createErrors !== false) {\n      out += ' { keyword: \\'' + ('not') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n      if (it.opts.messages !== false) {\n        out += ' , message: \\'should NOT be valid\\' ';\n      }\n      if (it.opts.verbose) {\n        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n      }\n      out += ' } ';\n    } else {\n      out += ' {} ';\n    }\n    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n    if ($breakOnError) {\n      out += ' if (false) { ';\n    }\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 666 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_oneOf(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $valid = 'valid' + $lvl;\n  var $errs = 'errs__' + $lvl;\n  var $it = it.util.copy(it);\n  var $closingBraces = '';\n  $it.level++;\n  var $nextValid = 'valid' + $it.level;\n  out += 'var ' + ($errs) + ' = errors;var prevValid' + ($lvl) + ' = false;var ' + ($valid) + ' = false;';\n  var $currentBaseId = $it.baseId;\n  var $wasComposite = it.compositeRule;\n  it.compositeRule = $it.compositeRule = true;\n  var arr1 = $schema;\n  if (arr1) {\n    var $sch, $i = -1,\n      l1 = arr1.length - 1;\n    while ($i < l1) {\n      $sch = arr1[$i += 1];\n      if (it.util.schemaHasRules($sch, it.RULES.all)) {\n        $it.schema = $sch;\n        $it.schemaPath = $schemaPath + '[' + $i + ']';\n        $it.errSchemaPath = $errSchemaPath + '/' + $i;\n        out += '  ' + (it.validate($it)) + ' ';\n        $it.baseId = $currentBaseId;\n      } else {\n        out += ' var ' + ($nextValid) + ' = true; ';\n      }\n      if ($i) {\n        out += ' if (' + ($nextValid) + ' && prevValid' + ($lvl) + ') ' + ($valid) + ' = false; else { ';\n        $closingBraces += '}';\n      }\n      out += ' if (' + ($nextValid) + ') ' + ($valid) + ' = prevValid' + ($lvl) + ' = true;';\n    }\n  }\n  it.compositeRule = $it.compositeRule = $wasComposite;\n  out += '' + ($closingBraces) + 'if (!' + ($valid) + ') {   var err =   '; /* istanbul ignore else */\n  if (it.createErrors !== false) {\n    out += ' { keyword: \\'' + ('oneOf') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: {} ';\n    if (it.opts.messages !== false) {\n      out += ' , message: \\'should match exactly one schema in oneOf\\' ';\n    }\n    if (it.opts.verbose) {\n      out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n    }\n    out += ' } ';\n  } else {\n    out += ' {} ';\n  }\n  out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n  if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n    if (it.async) {\n      out += ' throw new ValidationError(vErrors); ';\n    } else {\n      out += ' validate.errors = vErrors; return false; ';\n    }\n  }\n  out += '} else {  errors = ' + ($errs) + '; if (vErrors !== null) { if (' + ($errs) + ') vErrors.length = ' + ($errs) + '; else vErrors = null; }';\n  if (it.opts.allErrors) {\n    out += ' } ';\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 667 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_pattern(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $isData = it.opts.$data && $schema && $schema.$data,\n    $schemaValue;\n  if ($isData) {\n    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n    $schemaValue = 'schema' + $lvl;\n  } else {\n    $schemaValue = $schema;\n  }\n  var $regexp = $isData ? '(new RegExp(' + $schemaValue + '))' : it.usePattern($schema);\n  out += 'if ( ';\n  if ($isData) {\n    out += ' (' + ($schemaValue) + ' !== undefined && typeof ' + ($schemaValue) + ' != \\'string\\') || ';\n  }\n  out += ' !' + ($regexp) + '.test(' + ($data) + ') ) {   ';\n  var $$outStack = $$outStack || [];\n  $$outStack.push(out);\n  out = ''; /* istanbul ignore else */\n  if (it.createErrors !== false) {\n    out += ' { keyword: \\'' + ('pattern') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { pattern:  ';\n    if ($isData) {\n      out += '' + ($schemaValue);\n    } else {\n      out += '' + (it.util.toQuotedString($schema));\n    }\n    out += '  } ';\n    if (it.opts.messages !== false) {\n      out += ' , message: \\'should match pattern \"';\n      if ($isData) {\n        out += '\\' + ' + ($schemaValue) + ' + \\'';\n      } else {\n        out += '' + (it.util.escapeQuotes($schema));\n      }\n      out += '\"\\' ';\n    }\n    if (it.opts.verbose) {\n      out += ' , schema:  ';\n      if ($isData) {\n        out += 'validate.schema' + ($schemaPath);\n      } else {\n        out += '' + (it.util.toQuotedString($schema));\n      }\n      out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n    }\n    out += ' } ';\n  } else {\n    out += ' {} ';\n  }\n  var __err = out;\n  out = $$outStack.pop();\n  if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n    if (it.async) {\n      out += ' throw new ValidationError([' + (__err) + ']); ';\n    } else {\n      out += ' validate.errors = [' + (__err) + ']; return false; ';\n    }\n  } else {\n    out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n  }\n  out += '} ';\n  if ($breakOnError) {\n    out += ' else { ';\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 668 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_properties(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $valid = 'valid' + $lvl;\n  var $errs = 'errs__' + $lvl;\n  var $it = it.util.copy(it);\n  var $closingBraces = '';\n  $it.level++;\n  var $nextValid = 'valid' + $it.level;\n  var $key = 'key' + $lvl,\n    $idx = 'idx' + $lvl,\n    $dataNxt = $it.dataLevel = it.dataLevel + 1,\n    $nextData = 'data' + $dataNxt,\n    $dataProperties = 'dataProperties' + $lvl;\n  var $schemaKeys = Object.keys($schema || {}),\n    $pProperties = it.schema.patternProperties || {},\n    $pPropertyKeys = Object.keys($pProperties),\n    $aProperties = it.schema.additionalProperties,\n    $someProperties = $schemaKeys.length || $pPropertyKeys.length,\n    $noAdditional = $aProperties === false,\n    $additionalIsSchema = typeof $aProperties == 'object' && Object.keys($aProperties).length,\n    $removeAdditional = it.opts.removeAdditional,\n    $checkAdditional = $noAdditional || $additionalIsSchema || $removeAdditional,\n    $ownProperties = it.opts.ownProperties,\n    $currentBaseId = it.baseId;\n  var $required = it.schema.required;\n  if ($required && !(it.opts.v5 && $required.$data) && $required.length < it.opts.loopRequired) var $requiredHash = it.util.toHash($required);\n  if (it.opts.patternGroups) {\n    var $pgProperties = it.schema.patternGroups || {},\n      $pgPropertyKeys = Object.keys($pgProperties);\n  }\n  out += 'var ' + ($errs) + ' = errors;var ' + ($nextValid) + ' = true;';\n  if ($ownProperties) {\n    out += ' var ' + ($dataProperties) + ' = undefined;';\n  }\n  if ($checkAdditional) {\n    if ($ownProperties) {\n      out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';\n    } else {\n      out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';\n    }\n    if ($someProperties) {\n      out += ' var isAdditional' + ($lvl) + ' = !(false ';\n      if ($schemaKeys.length) {\n        if ($schemaKeys.length > 5) {\n          out += ' || validate.schema' + ($schemaPath) + '[' + ($key) + '] ';\n        } else {\n          var arr1 = $schemaKeys;\n          if (arr1) {\n            var $propertyKey, i1 = -1,\n              l1 = arr1.length - 1;\n            while (i1 < l1) {\n              $propertyKey = arr1[i1 += 1];\n              out += ' || ' + ($key) + ' == ' + (it.util.toQuotedString($propertyKey)) + ' ';\n            }\n          }\n        }\n      }\n      if ($pPropertyKeys.length) {\n        var arr2 = $pPropertyKeys;\n        if (arr2) {\n          var $pProperty, $i = -1,\n            l2 = arr2.length - 1;\n          while ($i < l2) {\n            $pProperty = arr2[$i += 1];\n            out += ' || ' + (it.usePattern($pProperty)) + '.test(' + ($key) + ') ';\n          }\n        }\n      }\n      if (it.opts.patternGroups && $pgPropertyKeys.length) {\n        var arr3 = $pgPropertyKeys;\n        if (arr3) {\n          var $pgProperty, $i = -1,\n            l3 = arr3.length - 1;\n          while ($i < l3) {\n            $pgProperty = arr3[$i += 1];\n            out += ' || ' + (it.usePattern($pgProperty)) + '.test(' + ($key) + ') ';\n          }\n        }\n      }\n      out += ' ); if (isAdditional' + ($lvl) + ') { ';\n    }\n    if ($removeAdditional == 'all') {\n      out += ' delete ' + ($data) + '[' + ($key) + ']; ';\n    } else {\n      var $currentErrorPath = it.errorPath;\n      var $additionalProperty = '\\' + ' + $key + ' + \\'';\n      if (it.opts._errorDataPathProperty) {\n        it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n      }\n      if ($noAdditional) {\n        if ($removeAdditional) {\n          out += ' delete ' + ($data) + '[' + ($key) + ']; ';\n        } else {\n          out += ' ' + ($nextValid) + ' = false; ';\n          var $currErrSchemaPath = $errSchemaPath;\n          $errSchemaPath = it.errSchemaPath + '/additionalProperties';\n          var $$outStack = $$outStack || [];\n          $$outStack.push(out);\n          out = ''; /* istanbul ignore else */\n          if (it.createErrors !== false) {\n            out += ' { keyword: \\'' + ('additionalProperties') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { additionalProperty: \\'' + ($additionalProperty) + '\\' } ';\n            if (it.opts.messages !== false) {\n              out += ' , message: \\'should NOT have additional properties\\' ';\n            }\n            if (it.opts.verbose) {\n              out += ' , schema: false , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n            }\n            out += ' } ';\n          } else {\n            out += ' {} ';\n          }\n          var __err = out;\n          out = $$outStack.pop();\n          if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n            if (it.async) {\n              out += ' throw new ValidationError([' + (__err) + ']); ';\n            } else {\n              out += ' validate.errors = [' + (__err) + ']; return false; ';\n            }\n          } else {\n            out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n          }\n          $errSchemaPath = $currErrSchemaPath;\n          if ($breakOnError) {\n            out += ' break; ';\n          }\n        }\n      } else if ($additionalIsSchema) {\n        if ($removeAdditional == 'failing') {\n          out += ' var ' + ($errs) + ' = errors;  ';\n          var $wasComposite = it.compositeRule;\n          it.compositeRule = $it.compositeRule = true;\n          $it.schema = $aProperties;\n          $it.schemaPath = it.schemaPath + '.additionalProperties';\n          $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';\n          $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n          var $passData = $data + '[' + $key + ']';\n          $it.dataPathArr[$dataNxt] = $key;\n          var $code = it.validate($it);\n          $it.baseId = $currentBaseId;\n          if (it.util.varOccurences($code, $nextData) < 2) {\n            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n          } else {\n            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n          }\n          out += ' if (!' + ($nextValid) + ') { errors = ' + ($errs) + '; if (validate.errors !== null) { if (errors) validate.errors.length = errors; else validate.errors = null; } delete ' + ($data) + '[' + ($key) + ']; }  ';\n          it.compositeRule = $it.compositeRule = $wasComposite;\n        } else {\n          $it.schema = $aProperties;\n          $it.schemaPath = it.schemaPath + '.additionalProperties';\n          $it.errSchemaPath = it.errSchemaPath + '/additionalProperties';\n          $it.errorPath = it.opts._errorDataPathProperty ? it.errorPath : it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n          var $passData = $data + '[' + $key + ']';\n          $it.dataPathArr[$dataNxt] = $key;\n          var $code = it.validate($it);\n          $it.baseId = $currentBaseId;\n          if (it.util.varOccurences($code, $nextData) < 2) {\n            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n          } else {\n            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n          }\n          if ($breakOnError) {\n            out += ' if (!' + ($nextValid) + ') break; ';\n          }\n        }\n      }\n      it.errorPath = $currentErrorPath;\n    }\n    if ($someProperties) {\n      out += ' } ';\n    }\n    out += ' }  ';\n    if ($breakOnError) {\n      out += ' if (' + ($nextValid) + ') { ';\n      $closingBraces += '}';\n    }\n  }\n  var $useDefaults = it.opts.useDefaults && !it.compositeRule;\n  if ($schemaKeys.length) {\n    var arr4 = $schemaKeys;\n    if (arr4) {\n      var $propertyKey, i4 = -1,\n        l4 = arr4.length - 1;\n      while (i4 < l4) {\n        $propertyKey = arr4[i4 += 1];\n        var $sch = $schema[$propertyKey];\n        if (it.util.schemaHasRules($sch, it.RULES.all)) {\n          var $prop = it.util.getProperty($propertyKey),\n            $passData = $data + $prop,\n            $hasDefault = $useDefaults && $sch.default !== undefined;\n          $it.schema = $sch;\n          $it.schemaPath = $schemaPath + $prop;\n          $it.errSchemaPath = $errSchemaPath + '/' + it.util.escapeFragment($propertyKey);\n          $it.errorPath = it.util.getPath(it.errorPath, $propertyKey, it.opts.jsonPointers);\n          $it.dataPathArr[$dataNxt] = it.util.toQuotedString($propertyKey);\n          var $code = it.validate($it);\n          $it.baseId = $currentBaseId;\n          if (it.util.varOccurences($code, $nextData) < 2) {\n            $code = it.util.varReplace($code, $nextData, $passData);\n            var $useData = $passData;\n          } else {\n            var $useData = $nextData;\n            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ';\n          }\n          if ($hasDefault) {\n            out += ' ' + ($code) + ' ';\n          } else {\n            if ($requiredHash && $requiredHash[$propertyKey]) {\n              out += ' if ( ' + ($useData) + ' === undefined ';\n              if ($ownProperties) {\n                out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n              }\n              out += ') { ' + ($nextValid) + ' = false; ';\n              var $currentErrorPath = it.errorPath,\n                $currErrSchemaPath = $errSchemaPath,\n                $missingProperty = it.util.escapeQuotes($propertyKey);\n              if (it.opts._errorDataPathProperty) {\n                it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);\n              }\n              $errSchemaPath = it.errSchemaPath + '/required';\n              var $$outStack = $$outStack || [];\n              $$outStack.push(out);\n              out = ''; /* istanbul ignore else */\n              if (it.createErrors !== false) {\n                out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n                if (it.opts.messages !== false) {\n                  out += ' , message: \\'';\n                  if (it.opts._errorDataPathProperty) {\n                    out += 'is a required property';\n                  } else {\n                    out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n                  }\n                  out += '\\' ';\n                }\n                if (it.opts.verbose) {\n                  out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n                }\n                out += ' } ';\n              } else {\n                out += ' {} ';\n              }\n              var __err = out;\n              out = $$outStack.pop();\n              if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n                if (it.async) {\n                  out += ' throw new ValidationError([' + (__err) + ']); ';\n                } else {\n                  out += ' validate.errors = [' + (__err) + ']; return false; ';\n                }\n              } else {\n                out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n              }\n              $errSchemaPath = $currErrSchemaPath;\n              it.errorPath = $currentErrorPath;\n              out += ' } else { ';\n            } else {\n              if ($breakOnError) {\n                out += ' if ( ' + ($useData) + ' === undefined ';\n                if ($ownProperties) {\n                  out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n                }\n                out += ') { ' + ($nextValid) + ' = true; } else { ';\n              } else {\n                out += ' if (' + ($useData) + ' !== undefined ';\n                if ($ownProperties) {\n                  out += ' &&   Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n                }\n                out += ' ) { ';\n              }\n            }\n            out += ' ' + ($code) + ' } ';\n          }\n        }\n        if ($breakOnError) {\n          out += ' if (' + ($nextValid) + ') { ';\n          $closingBraces += '}';\n        }\n      }\n    }\n  }\n  if ($pPropertyKeys.length) {\n    var arr5 = $pPropertyKeys;\n    if (arr5) {\n      var $pProperty, i5 = -1,\n        l5 = arr5.length - 1;\n      while (i5 < l5) {\n        $pProperty = arr5[i5 += 1];\n        var $sch = $pProperties[$pProperty];\n        if (it.util.schemaHasRules($sch, it.RULES.all)) {\n          $it.schema = $sch;\n          $it.schemaPath = it.schemaPath + '.patternProperties' + it.util.getProperty($pProperty);\n          $it.errSchemaPath = it.errSchemaPath + '/patternProperties/' + it.util.escapeFragment($pProperty);\n          if ($ownProperties) {\n            out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';\n          } else {\n            out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';\n          }\n          out += ' if (' + (it.usePattern($pProperty)) + '.test(' + ($key) + ')) { ';\n          $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n          var $passData = $data + '[' + $key + ']';\n          $it.dataPathArr[$dataNxt] = $key;\n          var $code = it.validate($it);\n          $it.baseId = $currentBaseId;\n          if (it.util.varOccurences($code, $nextData) < 2) {\n            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n          } else {\n            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n          }\n          if ($breakOnError) {\n            out += ' if (!' + ($nextValid) + ') break; ';\n          }\n          out += ' } ';\n          if ($breakOnError) {\n            out += ' else ' + ($nextValid) + ' = true; ';\n          }\n          out += ' }  ';\n          if ($breakOnError) {\n            out += ' if (' + ($nextValid) + ') { ';\n            $closingBraces += '}';\n          }\n        }\n      }\n    }\n  }\n  if (it.opts.patternGroups && $pgPropertyKeys.length) {\n    var arr6 = $pgPropertyKeys;\n    if (arr6) {\n      var $pgProperty, i6 = -1,\n        l6 = arr6.length - 1;\n      while (i6 < l6) {\n        $pgProperty = arr6[i6 += 1];\n        var $pgSchema = $pgProperties[$pgProperty],\n          $sch = $pgSchema.schema;\n        if (it.util.schemaHasRules($sch, it.RULES.all)) {\n          $it.schema = $sch;\n          $it.schemaPath = it.schemaPath + '.patternGroups' + it.util.getProperty($pgProperty) + '.schema';\n          $it.errSchemaPath = it.errSchemaPath + '/patternGroups/' + it.util.escapeFragment($pgProperty) + '/schema';\n          out += ' var pgPropCount' + ($lvl) + ' = 0;  ';\n          if ($ownProperties) {\n            out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';\n          } else {\n            out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';\n          }\n          out += ' if (' + (it.usePattern($pgProperty)) + '.test(' + ($key) + ')) { pgPropCount' + ($lvl) + '++; ';\n          $it.errorPath = it.util.getPathExpr(it.errorPath, $key, it.opts.jsonPointers);\n          var $passData = $data + '[' + $key + ']';\n          $it.dataPathArr[$dataNxt] = $key;\n          var $code = it.validate($it);\n          $it.baseId = $currentBaseId;\n          if (it.util.varOccurences($code, $nextData) < 2) {\n            out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n          } else {\n            out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n          }\n          if ($breakOnError) {\n            out += ' if (!' + ($nextValid) + ') break; ';\n          }\n          out += ' } ';\n          if ($breakOnError) {\n            out += ' else ' + ($nextValid) + ' = true; ';\n          }\n          out += ' }  ';\n          if ($breakOnError) {\n            out += ' if (' + ($nextValid) + ') { ';\n            $closingBraces += '}';\n          }\n          var $pgMin = $pgSchema.minimum,\n            $pgMax = $pgSchema.maximum;\n          if ($pgMin !== undefined || $pgMax !== undefined) {\n            out += ' var ' + ($valid) + ' = true; ';\n            var $currErrSchemaPath = $errSchemaPath;\n            if ($pgMin !== undefined) {\n              var $limit = $pgMin,\n                $reason = 'minimum',\n                $moreOrLess = 'less';\n              out += ' ' + ($valid) + ' = pgPropCount' + ($lvl) + ' >= ' + ($pgMin) + '; ';\n              $errSchemaPath = it.errSchemaPath + '/patternGroups/minimum';\n              out += '  if (!' + ($valid) + ') {   ';\n              var $$outStack = $$outStack || [];\n              $$outStack.push(out);\n              out = ''; /* istanbul ignore else */\n              if (it.createErrors !== false) {\n                out += ' { keyword: \\'' + ('patternGroups') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { reason: \\'' + ($reason) + '\\', limit: ' + ($limit) + ', pattern: \\'' + (it.util.escapeQuotes($pgProperty)) + '\\' } ';\n                if (it.opts.messages !== false) {\n                  out += ' , message: \\'should NOT have ' + ($moreOrLess) + ' than ' + ($limit) + ' properties matching pattern \"' + (it.util.escapeQuotes($pgProperty)) + '\"\\' ';\n                }\n                if (it.opts.verbose) {\n                  out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n                }\n                out += ' } ';\n              } else {\n                out += ' {} ';\n              }\n              var __err = out;\n              out = $$outStack.pop();\n              if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n                if (it.async) {\n                  out += ' throw new ValidationError([' + (__err) + ']); ';\n                } else {\n                  out += ' validate.errors = [' + (__err) + ']; return false; ';\n                }\n              } else {\n                out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n              }\n              out += ' } ';\n              if ($pgMax !== undefined) {\n                out += ' else ';\n              }\n            }\n            if ($pgMax !== undefined) {\n              var $limit = $pgMax,\n                $reason = 'maximum',\n                $moreOrLess = 'more';\n              out += ' ' + ($valid) + ' = pgPropCount' + ($lvl) + ' <= ' + ($pgMax) + '; ';\n              $errSchemaPath = it.errSchemaPath + '/patternGroups/maximum';\n              out += '  if (!' + ($valid) + ') {   ';\n              var $$outStack = $$outStack || [];\n              $$outStack.push(out);\n              out = ''; /* istanbul ignore else */\n              if (it.createErrors !== false) {\n                out += ' { keyword: \\'' + ('patternGroups') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { reason: \\'' + ($reason) + '\\', limit: ' + ($limit) + ', pattern: \\'' + (it.util.escapeQuotes($pgProperty)) + '\\' } ';\n                if (it.opts.messages !== false) {\n                  out += ' , message: \\'should NOT have ' + ($moreOrLess) + ' than ' + ($limit) + ' properties matching pattern \"' + (it.util.escapeQuotes($pgProperty)) + '\"\\' ';\n                }\n                if (it.opts.verbose) {\n                  out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n                }\n                out += ' } ';\n              } else {\n                out += ' {} ';\n              }\n              var __err = out;\n              out = $$outStack.pop();\n              if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n                if (it.async) {\n                  out += ' throw new ValidationError([' + (__err) + ']); ';\n                } else {\n                  out += ' validate.errors = [' + (__err) + ']; return false; ';\n                }\n              } else {\n                out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n              }\n              out += ' } ';\n            }\n            $errSchemaPath = $currErrSchemaPath;\n            if ($breakOnError) {\n              out += ' if (' + ($valid) + ') { ';\n              $closingBraces += '}';\n            }\n          }\n        }\n      }\n    }\n  }\n  if ($breakOnError) {\n    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n  }\n  out = it.util.cleanUpCode(out);\n  return out;\n}\n\n\n/***/ }),\n/* 669 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_propertyNames(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $errs = 'errs__' + $lvl;\n  var $it = it.util.copy(it);\n  var $closingBraces = '';\n  $it.level++;\n  var $nextValid = 'valid' + $it.level;\n  if (it.util.schemaHasRules($schema, it.RULES.all)) {\n    $it.schema = $schema;\n    $it.schemaPath = $schemaPath;\n    $it.errSchemaPath = $errSchemaPath;\n    var $key = 'key' + $lvl,\n      $idx = 'idx' + $lvl,\n      $i = 'i' + $lvl,\n      $invalidName = '\\' + ' + $key + ' + \\'',\n      $dataNxt = $it.dataLevel = it.dataLevel + 1,\n      $nextData = 'data' + $dataNxt,\n      $dataProperties = 'dataProperties' + $lvl,\n      $ownProperties = it.opts.ownProperties,\n      $currentBaseId = it.baseId;\n    out += ' var ' + ($errs) + ' = errors; ';\n    if ($ownProperties) {\n      out += ' var ' + ($dataProperties) + ' = undefined; ';\n    }\n    if ($ownProperties) {\n      out += ' ' + ($dataProperties) + ' = ' + ($dataProperties) + ' || Object.keys(' + ($data) + '); for (var ' + ($idx) + '=0; ' + ($idx) + '<' + ($dataProperties) + '.length; ' + ($idx) + '++) { var ' + ($key) + ' = ' + ($dataProperties) + '[' + ($idx) + ']; ';\n    } else {\n      out += ' for (var ' + ($key) + ' in ' + ($data) + ') { ';\n    }\n    out += ' var startErrs' + ($lvl) + ' = errors; ';\n    var $passData = $key;\n    var $wasComposite = it.compositeRule;\n    it.compositeRule = $it.compositeRule = true;\n    var $code = it.validate($it);\n    $it.baseId = $currentBaseId;\n    if (it.util.varOccurences($code, $nextData) < 2) {\n      out += ' ' + (it.util.varReplace($code, $nextData, $passData)) + ' ';\n    } else {\n      out += ' var ' + ($nextData) + ' = ' + ($passData) + '; ' + ($code) + ' ';\n    }\n    it.compositeRule = $it.compositeRule = $wasComposite;\n    out += ' if (!' + ($nextValid) + ') { for (var ' + ($i) + '=startErrs' + ($lvl) + '; ' + ($i) + '<errors; ' + ($i) + '++) { vErrors[' + ($i) + '].propertyName = ' + ($key) + '; }   var err =   '; /* istanbul ignore else */\n    if (it.createErrors !== false) {\n      out += ' { keyword: \\'' + ('propertyNames') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { propertyName: \\'' + ($invalidName) + '\\' } ';\n      if (it.opts.messages !== false) {\n        out += ' , message: \\'property name \\\\\\'' + ($invalidName) + '\\\\\\' is invalid\\' ';\n      }\n      if (it.opts.verbose) {\n        out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n      }\n      out += ' } ';\n    } else {\n      out += ' {} ';\n    }\n    out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n    if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n      if (it.async) {\n        out += ' throw new ValidationError(vErrors); ';\n      } else {\n        out += ' validate.errors = vErrors; return false; ';\n      }\n    }\n    if ($breakOnError) {\n      out += ' break; ';\n    }\n    out += ' } }';\n  }\n  if ($breakOnError) {\n    out += ' ' + ($closingBraces) + ' if (' + ($errs) + ' == errors) {';\n  }\n  out = it.util.cleanUpCode(out);\n  return out;\n}\n\n\n/***/ }),\n/* 670 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_ref(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $valid = 'valid' + $lvl;\n  var $async, $refCode;\n  if ($schema == '#' || $schema == '#/') {\n    if (it.isRoot) {\n      $async = it.async;\n      $refCode = 'validate';\n    } else {\n      $async = it.root.schema.$async === true;\n      $refCode = 'root.refVal[0]';\n    }\n  } else {\n    var $refVal = it.resolveRef(it.baseId, $schema, it.isRoot);\n    if ($refVal === undefined) {\n      var $message = it.MissingRefError.message(it.baseId, $schema);\n      if (it.opts.missingRefs == 'fail') {\n        it.logger.error($message);\n        var $$outStack = $$outStack || [];\n        $$outStack.push(out);\n        out = ''; /* istanbul ignore else */\n        if (it.createErrors !== false) {\n          out += ' { keyword: \\'' + ('$ref') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { ref: \\'' + (it.util.escapeQuotes($schema)) + '\\' } ';\n          if (it.opts.messages !== false) {\n            out += ' , message: \\'can\\\\\\'t resolve reference ' + (it.util.escapeQuotes($schema)) + '\\' ';\n          }\n          if (it.opts.verbose) {\n            out += ' , schema: ' + (it.util.toQuotedString($schema)) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n          }\n          out += ' } ';\n        } else {\n          out += ' {} ';\n        }\n        var __err = out;\n        out = $$outStack.pop();\n        if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n          if (it.async) {\n            out += ' throw new ValidationError([' + (__err) + ']); ';\n          } else {\n            out += ' validate.errors = [' + (__err) + ']; return false; ';\n          }\n        } else {\n          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n        }\n        if ($breakOnError) {\n          out += ' if (false) { ';\n        }\n      } else if (it.opts.missingRefs == 'ignore') {\n        it.logger.warn($message);\n        if ($breakOnError) {\n          out += ' if (true) { ';\n        }\n      } else {\n        throw new it.MissingRefError(it.baseId, $schema, $message);\n      }\n    } else if ($refVal.inline) {\n      var $it = it.util.copy(it);\n      $it.level++;\n      var $nextValid = 'valid' + $it.level;\n      $it.schema = $refVal.schema;\n      $it.schemaPath = '';\n      $it.errSchemaPath = $schema;\n      var $code = it.validate($it).replace(/validate\\.schema/g, $refVal.code);\n      out += ' ' + ($code) + ' ';\n      if ($breakOnError) {\n        out += ' if (' + ($nextValid) + ') { ';\n      }\n    } else {\n      $async = $refVal.$async === true;\n      $refCode = $refVal.code;\n    }\n  }\n  if ($refCode) {\n    var $$outStack = $$outStack || [];\n    $$outStack.push(out);\n    out = '';\n    if (it.opts.passContext) {\n      out += ' ' + ($refCode) + '.call(this, ';\n    } else {\n      out += ' ' + ($refCode) + '( ';\n    }\n    out += ' ' + ($data) + ', (dataPath || \\'\\')';\n    if (it.errorPath != '\"\"') {\n      out += ' + ' + (it.errorPath);\n    }\n    var $parentData = $dataLvl ? 'data' + (($dataLvl - 1) || '') : 'parentData',\n      $parentDataProperty = $dataLvl ? it.dataPathArr[$dataLvl] : 'parentDataProperty';\n    out += ' , ' + ($parentData) + ' , ' + ($parentDataProperty) + ', rootData)  ';\n    var __callValidate = out;\n    out = $$outStack.pop();\n    if ($async) {\n      if (!it.async) throw new Error('async schema referenced by sync schema');\n      if ($breakOnError) {\n        out += ' var ' + ($valid) + '; ';\n      }\n      out += ' try { ' + (it.yieldAwait) + ' ' + (__callValidate) + '; ';\n      if ($breakOnError) {\n        out += ' ' + ($valid) + ' = true; ';\n      }\n      out += ' } catch (e) { if (!(e instanceof ValidationError)) throw e; if (vErrors === null) vErrors = e.errors; else vErrors = vErrors.concat(e.errors); errors = vErrors.length; ';\n      if ($breakOnError) {\n        out += ' ' + ($valid) + ' = false; ';\n      }\n      out += ' } ';\n      if ($breakOnError) {\n        out += ' if (' + ($valid) + ') { ';\n      }\n    } else {\n      out += ' if (!' + (__callValidate) + ') { if (vErrors === null) vErrors = ' + ($refCode) + '.errors; else vErrors = vErrors.concat(' + ($refCode) + '.errors); errors = vErrors.length; } ';\n      if ($breakOnError) {\n        out += ' else { ';\n      }\n    }\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 671 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_required(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $valid = 'valid' + $lvl;\n  var $isData = it.opts.$data && $schema && $schema.$data,\n    $schemaValue;\n  if ($isData) {\n    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n    $schemaValue = 'schema' + $lvl;\n  } else {\n    $schemaValue = $schema;\n  }\n  var $vSchema = 'schema' + $lvl;\n  if (!$isData) {\n    if ($schema.length < it.opts.loopRequired && it.schema.properties && Object.keys(it.schema.properties).length) {\n      var $required = [];\n      var arr1 = $schema;\n      if (arr1) {\n        var $property, i1 = -1,\n          l1 = arr1.length - 1;\n        while (i1 < l1) {\n          $property = arr1[i1 += 1];\n          var $propertySch = it.schema.properties[$property];\n          if (!($propertySch && it.util.schemaHasRules($propertySch, it.RULES.all))) {\n            $required[$required.length] = $property;\n          }\n        }\n      }\n    } else {\n      var $required = $schema;\n    }\n  }\n  if ($isData || $required.length) {\n    var $currentErrorPath = it.errorPath,\n      $loopRequired = $isData || $required.length >= it.opts.loopRequired,\n      $ownProperties = it.opts.ownProperties;\n    if ($breakOnError) {\n      out += ' var missing' + ($lvl) + '; ';\n      if ($loopRequired) {\n        if (!$isData) {\n          out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';\n        }\n        var $i = 'i' + $lvl,\n          $propertyPath = 'schema' + $lvl + '[' + $i + ']',\n          $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n        if (it.opts._errorDataPathProperty) {\n          it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);\n        }\n        out += ' var ' + ($valid) + ' = true; ';\n        if ($isData) {\n          out += ' if (schema' + ($lvl) + ' === undefined) ' + ($valid) + ' = true; else if (!Array.isArray(schema' + ($lvl) + ')) ' + ($valid) + ' = false; else {';\n        }\n        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { ' + ($valid) + ' = ' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] !== undefined ';\n        if ($ownProperties) {\n          out += ' &&   Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';\n        }\n        out += '; if (!' + ($valid) + ') break; } ';\n        if ($isData) {\n          out += '  }  ';\n        }\n        out += '  if (!' + ($valid) + ') {   ';\n        var $$outStack = $$outStack || [];\n        $$outStack.push(out);\n        out = ''; /* istanbul ignore else */\n        if (it.createErrors !== false) {\n          out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n          if (it.opts.messages !== false) {\n            out += ' , message: \\'';\n            if (it.opts._errorDataPathProperty) {\n              out += 'is a required property';\n            } else {\n              out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n            }\n            out += '\\' ';\n          }\n          if (it.opts.verbose) {\n            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n          }\n          out += ' } ';\n        } else {\n          out += ' {} ';\n        }\n        var __err = out;\n        out = $$outStack.pop();\n        if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n          if (it.async) {\n            out += ' throw new ValidationError([' + (__err) + ']); ';\n          } else {\n            out += ' validate.errors = [' + (__err) + ']; return false; ';\n          }\n        } else {\n          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n        }\n        out += ' } else { ';\n      } else {\n        out += ' if ( ';\n        var arr2 = $required;\n        if (arr2) {\n          var $propertyKey, $i = -1,\n            l2 = arr2.length - 1;\n          while ($i < l2) {\n            $propertyKey = arr2[$i += 1];\n            if ($i) {\n              out += ' || ';\n            }\n            var $prop = it.util.getProperty($propertyKey),\n              $useData = $data + $prop;\n            out += ' ( ( ' + ($useData) + ' === undefined ';\n            if ($ownProperties) {\n              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n            }\n            out += ') && (missing' + ($lvl) + ' = ' + (it.util.toQuotedString(it.opts.jsonPointers ? $propertyKey : $prop)) + ') ) ';\n          }\n        }\n        out += ') {  ';\n        var $propertyPath = 'missing' + $lvl,\n          $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n        if (it.opts._errorDataPathProperty) {\n          it.errorPath = it.opts.jsonPointers ? it.util.getPathExpr($currentErrorPath, $propertyPath, true) : $currentErrorPath + ' + ' + $propertyPath;\n        }\n        var $$outStack = $$outStack || [];\n        $$outStack.push(out);\n        out = ''; /* istanbul ignore else */\n        if (it.createErrors !== false) {\n          out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n          if (it.opts.messages !== false) {\n            out += ' , message: \\'';\n            if (it.opts._errorDataPathProperty) {\n              out += 'is a required property';\n            } else {\n              out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n            }\n            out += '\\' ';\n          }\n          if (it.opts.verbose) {\n            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n          }\n          out += ' } ';\n        } else {\n          out += ' {} ';\n        }\n        var __err = out;\n        out = $$outStack.pop();\n        if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n          if (it.async) {\n            out += ' throw new ValidationError([' + (__err) + ']); ';\n          } else {\n            out += ' validate.errors = [' + (__err) + ']; return false; ';\n          }\n        } else {\n          out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n        }\n        out += ' } else { ';\n      }\n    } else {\n      if ($loopRequired) {\n        if (!$isData) {\n          out += ' var ' + ($vSchema) + ' = validate.schema' + ($schemaPath) + '; ';\n        }\n        var $i = 'i' + $lvl,\n          $propertyPath = 'schema' + $lvl + '[' + $i + ']',\n          $missingProperty = '\\' + ' + $propertyPath + ' + \\'';\n        if (it.opts._errorDataPathProperty) {\n          it.errorPath = it.util.getPathExpr($currentErrorPath, $propertyPath, it.opts.jsonPointers);\n        }\n        if ($isData) {\n          out += ' if (' + ($vSchema) + ' && !Array.isArray(' + ($vSchema) + ')) {  var err =   '; /* istanbul ignore else */\n          if (it.createErrors !== false) {\n            out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n            if (it.opts.messages !== false) {\n              out += ' , message: \\'';\n              if (it.opts._errorDataPathProperty) {\n                out += 'is a required property';\n              } else {\n                out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n              }\n              out += '\\' ';\n            }\n            if (it.opts.verbose) {\n              out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n            }\n            out += ' } ';\n          } else {\n            out += ' {} ';\n          }\n          out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } else if (' + ($vSchema) + ' !== undefined) { ';\n        }\n        out += ' for (var ' + ($i) + ' = 0; ' + ($i) + ' < ' + ($vSchema) + '.length; ' + ($i) + '++) { if (' + ($data) + '[' + ($vSchema) + '[' + ($i) + ']] === undefined ';\n        if ($ownProperties) {\n          out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', ' + ($vSchema) + '[' + ($i) + ']) ';\n        }\n        out += ') {  var err =   '; /* istanbul ignore else */\n        if (it.createErrors !== false) {\n          out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n          if (it.opts.messages !== false) {\n            out += ' , message: \\'';\n            if (it.opts._errorDataPathProperty) {\n              out += 'is a required property';\n            } else {\n              out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n            }\n            out += '\\' ';\n          }\n          if (it.opts.verbose) {\n            out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n          }\n          out += ' } ';\n        } else {\n          out += ' {} ';\n        }\n        out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } } ';\n        if ($isData) {\n          out += '  }  ';\n        }\n      } else {\n        var arr3 = $required;\n        if (arr3) {\n          var $propertyKey, i3 = -1,\n            l3 = arr3.length - 1;\n          while (i3 < l3) {\n            $propertyKey = arr3[i3 += 1];\n            var $prop = it.util.getProperty($propertyKey),\n              $missingProperty = it.util.escapeQuotes($propertyKey),\n              $useData = $data + $prop;\n            if (it.opts._errorDataPathProperty) {\n              it.errorPath = it.util.getPath($currentErrorPath, $propertyKey, it.opts.jsonPointers);\n            }\n            out += ' if ( ' + ($useData) + ' === undefined ';\n            if ($ownProperties) {\n              out += ' || ! Object.prototype.hasOwnProperty.call(' + ($data) + ', \\'' + (it.util.escapeQuotes($propertyKey)) + '\\') ';\n            }\n            out += ') {  var err =   '; /* istanbul ignore else */\n            if (it.createErrors !== false) {\n              out += ' { keyword: \\'' + ('required') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { missingProperty: \\'' + ($missingProperty) + '\\' } ';\n              if (it.opts.messages !== false) {\n                out += ' , message: \\'';\n                if (it.opts._errorDataPathProperty) {\n                  out += 'is a required property';\n                } else {\n                  out += 'should have required property \\\\\\'' + ($missingProperty) + '\\\\\\'';\n                }\n                out += '\\' ';\n              }\n              if (it.opts.verbose) {\n                out += ' , schema: validate.schema' + ($schemaPath) + ' , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n              }\n              out += ' } ';\n            } else {\n              out += ' {} ';\n            }\n            out += ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; } ';\n          }\n        }\n      }\n    }\n    it.errorPath = $currentErrorPath;\n  } else if ($breakOnError) {\n    out += ' if (true) {';\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 672 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function generate_uniqueItems(it, $keyword, $ruleType) {\n  var out = ' ';\n  var $lvl = it.level;\n  var $dataLvl = it.dataLevel;\n  var $schema = it.schema[$keyword];\n  var $schemaPath = it.schemaPath + it.util.getProperty($keyword);\n  var $errSchemaPath = it.errSchemaPath + '/' + $keyword;\n  var $breakOnError = !it.opts.allErrors;\n  var $data = 'data' + ($dataLvl || '');\n  var $valid = 'valid' + $lvl;\n  var $isData = it.opts.$data && $schema && $schema.$data,\n    $schemaValue;\n  if ($isData) {\n    out += ' var schema' + ($lvl) + ' = ' + (it.util.getData($schema.$data, $dataLvl, it.dataPathArr)) + '; ';\n    $schemaValue = 'schema' + $lvl;\n  } else {\n    $schemaValue = $schema;\n  }\n  if (($schema || $isData) && it.opts.uniqueItems !== false) {\n    if ($isData) {\n      out += ' var ' + ($valid) + '; if (' + ($schemaValue) + ' === false || ' + ($schemaValue) + ' === undefined) ' + ($valid) + ' = true; else if (typeof ' + ($schemaValue) + ' != \\'boolean\\') ' + ($valid) + ' = false; else { ';\n    }\n    out += ' var ' + ($valid) + ' = true; if (' + ($data) + '.length > 1) { var i = ' + ($data) + '.length, j; outer: for (;i--;) { for (j = i; j--;) { if (equal(' + ($data) + '[i], ' + ($data) + '[j])) { ' + ($valid) + ' = false; break outer; } } } } ';\n    if ($isData) {\n      out += '  }  ';\n    }\n    out += ' if (!' + ($valid) + ') {   ';\n    var $$outStack = $$outStack || [];\n    $$outStack.push(out);\n    out = ''; /* istanbul ignore else */\n    if (it.createErrors !== false) {\n      out += ' { keyword: \\'' + ('uniqueItems') + '\\' , dataPath: (dataPath || \\'\\') + ' + (it.errorPath) + ' , schemaPath: ' + (it.util.toQuotedString($errSchemaPath)) + ' , params: { i: i, j: j } ';\n      if (it.opts.messages !== false) {\n        out += ' , message: \\'should NOT have duplicate items (items ## \\' + j + \\' and \\' + i + \\' are identical)\\' ';\n      }\n      if (it.opts.verbose) {\n        out += ' , schema:  ';\n        if ($isData) {\n          out += 'validate.schema' + ($schemaPath);\n        } else {\n          out += '' + ($schema);\n        }\n        out += '         , parentSchema: validate.schema' + (it.schemaPath) + ' , data: ' + ($data) + ' ';\n      }\n      out += ' } ';\n    } else {\n      out += ' {} ';\n    }\n    var __err = out;\n    out = $$outStack.pop();\n    if (!it.compositeRule && $breakOnError) { /* istanbul ignore if */\n      if (it.async) {\n        out += ' throw new ValidationError([' + (__err) + ']); ';\n      } else {\n        out += ' validate.errors = [' + (__err) + ']; return false; ';\n      }\n    } else {\n      out += ' var err = ' + (__err) + ';  if (vErrors === null) vErrors = [err]; else vErrors.push(err); errors++; ';\n    }\n    out += ' } ';\n    if ($breakOnError) {\n      out += ' else { ';\n    }\n  } else {\n    if ($breakOnError) {\n      out += ' if (true) { ';\n    }\n  }\n  return out;\n}\n\n\n/***/ }),\n/* 673 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar IDENTIFIER = /^[a-z_$][a-z0-9_$-]*$/i;\nvar customRuleCode = __webpack_require__(659);\n\nmodule.exports = {\n  add: addKeyword,\n  get: getKeyword,\n  remove: removeKeyword\n};\n\n/**\n * Define custom keyword\n * @this  Ajv\n * @param {String} keyword custom keyword, should be unique (including different from all standard, custom and macro keywords).\n * @param {Object} definition keyword definition object with properties `type` (type(s) which the keyword applies to), `validate` or `compile`.\n * @return {Ajv} this for method chaining\n */\nfunction addKeyword(keyword, definition) {\n  /* jshint validthis: true */\n  /* eslint no-shadow: 0 */\n  var RULES = this.RULES;\n\n  if (RULES.keywords[keyword])\n    throw new Error('Keyword ' + keyword + ' is already defined');\n\n  if (!IDENTIFIER.test(keyword))\n    throw new Error('Keyword ' + keyword + ' is not a valid identifier');\n\n  if (definition) {\n    if (definition.macro && definition.valid !== undefined)\n      throw new Error('\"valid\" option cannot be used with macro keywords');\n\n    var dataType = definition.type;\n    if (Array.isArray(dataType)) {\n      var i, len = dataType.length;\n      for (i=0; i<len; i++) checkDataType(dataType[i]);\n      for (i=0; i<len; i++) _addRule(keyword, dataType[i], definition);\n    } else {\n      if (dataType) checkDataType(dataType);\n      _addRule(keyword, dataType, definition);\n    }\n\n    var $data = definition.$data === true && this._opts.$data;\n    if ($data && !definition.validate)\n      throw new Error('$data support: \"validate\" function is not defined');\n\n    var metaSchema = definition.metaSchema;\n    if (metaSchema) {\n      if ($data) {\n        metaSchema = {\n          anyOf: [\n            metaSchema,\n            { '$ref': 'https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/$data.json#' }\n          ]\n        };\n      }\n      definition.validateSchema = this.compile(metaSchema, true);\n    }\n  }\n\n  RULES.keywords[keyword] = RULES.all[keyword] = true;\n\n\n  function _addRule(keyword, dataType, definition) {\n    var ruleGroup;\n    for (var i=0; i<RULES.length; i++) {\n      var rg = RULES[i];\n      if (rg.type == dataType) {\n        ruleGroup = rg;\n        break;\n      }\n    }\n\n    if (!ruleGroup) {\n      ruleGroup = { type: dataType, rules: [] };\n      RULES.push(ruleGroup);\n    }\n\n    var rule = {\n      keyword: keyword,\n      definition: definition,\n      custom: true,\n      code: customRuleCode,\n      implements: definition.implements\n    };\n    ruleGroup.rules.push(rule);\n    RULES.custom[keyword] = rule;\n  }\n\n\n  function checkDataType(dataType) {\n    if (!RULES.types[dataType]) throw new Error('Unknown type ' + dataType);\n  }\n\n  return this;\n}\n\n\n/**\n * Get keyword\n * @this  Ajv\n * @param {String} keyword pre-defined or custom keyword.\n * @return {Object|Boolean} custom keyword definition, `true` if it is a predefined keyword, `false` otherwise.\n */\nfunction getKeyword(keyword) {\n  /* jshint validthis: true */\n  var rule = this.RULES.custom[keyword];\n  return rule ? rule.definition : this.RULES.keywords[keyword] || false;\n}\n\n\n/**\n * Remove keyword\n * @this  Ajv\n * @param {String} keyword pre-defined or custom keyword.\n * @return {Ajv} this for method chaining\n */\nfunction removeKeyword(keyword) {\n  /* jshint validthis: true */\n  var RULES = this.RULES;\n  delete RULES.keywords[keyword];\n  delete RULES.all[keyword];\n  delete RULES.custom[keyword];\n  for (var i=0; i<RULES.length; i++) {\n    var rules = RULES[i].rules;\n    for (var j=0; j<rules.length; j++) {\n      if (rules[j].keyword == keyword) {\n        rules.splice(j, 1);\n        break;\n      }\n    }\n  }\n  return this;\n}\n\n\n/***/ }),\n/* 674 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar META_SCHEMA_ID = 'http://json-schema.org/draft-06/schema';\n\nmodule.exports = function (ajv) {\n  var defaultMeta = ajv._opts.defaultMeta;\n  var metaSchemaRef = typeof defaultMeta == 'string'\n                      ? { $ref: defaultMeta }\n                      : ajv.getSchema(META_SCHEMA_ID)\n                        ? { $ref: META_SCHEMA_ID }\n                        : {};\n\n  ajv.addKeyword('patternGroups', {\n    // implemented in properties.jst\n    metaSchema: {\n      type: 'object',\n      additionalProperties: {\n        type: 'object',\n        required: [ 'schema' ],\n        properties: {\n          maximum: {\n            type: 'integer',\n            minimum: 0\n          },\n          minimum: {\n            type: 'integer',\n            minimum: 0\n          },\n          schema: metaSchemaRef\n        },\n        additionalProperties: false\n      }\n    }\n  });\n  ajv.RULES.all.properties.implements.push('patternGroups');\n};\n\n\n/***/ }),\n/* 675 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"$id\":\"https://raw.githubusercontent.com/epoberezkin/ajv/master/lib/refs/$data.json#\",\"description\":\"Meta-schema for $data reference (JSON-schema extension proposal)\",\"type\":\"object\",\"required\":[\"$data\"],\"properties\":{\"$data\":{\"type\":\"string\",\"anyOf\":[{\"format\":\"relative-json-pointer\"},{\"format\":\"json-pointer\"}]}},\"additionalProperties\":false}\n\n/***/ }),\n/* 676 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"$schema\":\"http://json-schema.org/draft-06/schema#\",\"$id\":\"http://json-schema.org/draft-06/schema#\",\"title\":\"Core schema meta-schema\",\"definitions\":{\"schemaArray\":{\"type\":\"array\",\"minItems\":1,\"items\":{\"$ref\":\"#\"}},\"nonNegativeInteger\":{\"type\":\"integer\",\"minimum\":0},\"nonNegativeIntegerDefault0\":{\"allOf\":[{\"$ref\":\"#/definitions/nonNegativeInteger\"},{\"default\":0}]},\"simpleTypes\":{\"enum\":[\"array\",\"boolean\",\"integer\",\"null\",\"number\",\"object\",\"string\"]},\"stringArray\":{\"type\":\"array\",\"items\":{\"type\":\"string\"},\"uniqueItems\":true,\"default\":[]}},\"type\":[\"object\",\"boolean\"],\"properties\":{\"$id\":{\"type\":\"string\",\"format\":\"uri-reference\"},\"$schema\":{\"type\":\"string\",\"format\":\"uri\"},\"$ref\":{\"type\":\"string\",\"format\":\"uri-reference\"},\"title\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"default\":{},\"examples\":{\"type\":\"array\",\"items\":{}},\"multipleOf\":{\"type\":\"number\",\"exclusiveMinimum\":0},\"maximum\":{\"type\":\"number\"},\"exclusiveMaximum\":{\"type\":\"number\"},\"minimum\":{\"type\":\"number\"},\"exclusiveMinimum\":{\"type\":\"number\"},\"maxLength\":{\"$ref\":\"#/definitions/nonNegativeInteger\"},\"minLength\":{\"$ref\":\"#/definitions/nonNegativeIntegerDefault0\"},\"pattern\":{\"type\":\"string\",\"format\":\"regex\"},\"additionalItems\":{\"$ref\":\"#\"},\"items\":{\"anyOf\":[{\"$ref\":\"#\"},{\"$ref\":\"#/definitions/schemaArray\"}],\"default\":{}},\"maxItems\":{\"$ref\":\"#/definitions/nonNegativeInteger\"},\"minItems\":{\"$ref\":\"#/definitions/nonNegativeIntegerDefault0\"},\"uniqueItems\":{\"type\":\"boolean\",\"default\":false},\"contains\":{\"$ref\":\"#\"},\"maxProperties\":{\"$ref\":\"#/definitions/nonNegativeInteger\"},\"minProperties\":{\"$ref\":\"#/definitions/nonNegativeIntegerDefault0\"},\"required\":{\"$ref\":\"#/definitions/stringArray\"},\"additionalProperties\":{\"$ref\":\"#\"},\"definitions\":{\"type\":\"object\",\"additionalProperties\":{\"$ref\":\"#\"},\"default\":{}},\"properties\":{\"type\":\"object\",\"additionalProperties\":{\"$ref\":\"#\"},\"default\":{}},\"patternProperties\":{\"type\":\"object\",\"additionalProperties\":{\"$ref\":\"#\"},\"default\":{}},\"dependencies\":{\"type\":\"object\",\"additionalProperties\":{\"anyOf\":[{\"$ref\":\"#\"},{\"$ref\":\"#/definitions/stringArray\"}]}},\"propertyNames\":{\"$ref\":\"#\"},\"const\":{},\"enum\":{\"type\":\"array\",\"minItems\":1,\"uniqueItems\":true},\"type\":{\"anyOf\":[{\"$ref\":\"#/definitions/simpleTypes\"},{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/simpleTypes\"},\"minItems\":1,\"uniqueItems\":true}]},\"format\":{\"type\":\"string\"},\"allOf\":{\"$ref\":\"#/definitions/schemaArray\"},\"anyOf\":{\"$ref\":\"#/definitions/schemaArray\"},\"oneOf\":{\"$ref\":\"#/definitions/schemaArray\"},\"not\":{\"$ref\":\"#\"}},\"default\":{}}\n\n/***/ }),\n/* 677 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar traverse = module.exports = function (schema, opts, cb) {\n  if (typeof opts == 'function') {\n    cb = opts;\n    opts = {};\n  }\n  _traverse(opts, cb, schema, '', schema);\n};\n\n\ntraverse.keywords = {\n  additionalItems: true,\n  items: true,\n  contains: true,\n  additionalProperties: true,\n  propertyNames: true,\n  not: true\n};\n\ntraverse.arrayKeywords = {\n  items: true,\n  allOf: true,\n  anyOf: true,\n  oneOf: true\n};\n\ntraverse.propsKeywords = {\n  definitions: true,\n  properties: true,\n  patternProperties: true,\n  dependencies: true\n};\n\ntraverse.skipKeywords = {\n  enum: true,\n  const: true,\n  required: true,\n  maximum: true,\n  minimum: true,\n  exclusiveMaximum: true,\n  exclusiveMinimum: true,\n  multipleOf: true,\n  maxLength: true,\n  minLength: true,\n  pattern: true,\n  format: true,\n  maxItems: true,\n  minItems: true,\n  uniqueItems: true,\n  maxProperties: true,\n  minProperties: true\n};\n\n\nfunction _traverse(opts, cb, schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex) {\n  if (schema && typeof schema == 'object' && !Array.isArray(schema)) {\n    cb(schema, jsonPtr, rootSchema, parentJsonPtr, parentKeyword, parentSchema, keyIndex);\n    for (var key in schema) {\n      var sch = schema[key];\n      if (Array.isArray(sch)) {\n        if (key in traverse.arrayKeywords) {\n          for (var i=0; i<sch.length; i++)\n            _traverse(opts, cb, sch[i], jsonPtr + '/' + key + '/' + i, rootSchema, jsonPtr, key, schema, i);\n        }\n      } else if (key in traverse.propsKeywords) {\n        if (sch && typeof sch == 'object') {\n          for (var prop in sch)\n            _traverse(opts, cb, sch[prop], jsonPtr + '/' + key + '/' + escapeJsonPtr(prop), rootSchema, jsonPtr, key, schema, prop);\n        }\n      } else if (key in traverse.keywords || (opts.allKeys && !(key in traverse.skipKeywords))) {\n        _traverse(opts, cb, sch, jsonPtr + '/' + key, rootSchema, jsonPtr, key, schema);\n      }\n    }\n  }\n}\n\n\nfunction escapeJsonPtr(str) {\n  return str.replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n\n\n/***/ }),\n/* 678 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar pkg = __webpack_require__(944);\n\n/* @private\n *\n * constructs a set of all dependencies recursively\n *\n * @method depsFor\n * @param {String} name of package to assemble unique deps for\n * @param {String} dir (optional) path to begin resolving from\n * @return {Array} a unique set of all deps\n */\nmodule.exports = function depsFor(name, dir) {\n  var dependencies = [];\n  var visited = Object.create(null);\n\n  (function again(name, dir) {\n    var thePackage = pkg(name, dir);\n\n    if (thePackage === null) { return; }\n\n    var key = thePackage.name + thePackage.version + thePackage.baseDir;\n\n    if (visited[key]) { return; }\n    visited[key] = true;\n\n    dependencies.push(thePackage);\n\n    return Object.keys(thePackage.dependencies || {}).forEach(function(dep) {\n      again(dep, thePackage.baseDir);\n    });\n  }(name, dir));\n\n  return dependencies;\n};\n\n\n\n/***/ }),\n/* 679 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar resolve = __webpack_require__(814);\nvar path = __webpack_require__(0);\n\n/* @private\n *\n * @method resolvePkg\n * @param {String} name\n * @param {String} dir\n * @return {String}\n */\nmodule.exports = function resolvePkg(name, dir) {\n  if (name === './') {\n    return path.resolve(name, 'package.json');\n  }\n\n  if (name[name.length - 1] !== '/') {\n    name += '/';\n  }\n\n  if (name.charAt(0) === '/') {\n    return name + 'package.json';\n  }\n\n  try {\n    return resolve.sync(name + 'package.json', {\n      basedir: dir || __dirname,\n      preserveSymlinks: false\n    });\n  } catch(err) {\n    if (err.code === 'MODULE_NOT_FOUND') {\n      return null;\n    }\n\n    throw err;\n  }\n};\n\n\n/***/ }),\n/* 680 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nvar parser = __webpack_require__(681);\nvar signer = __webpack_require__(682);\nvar verify = __webpack_require__(683);\nvar utils = __webpack_require__(175);\n\n\n\n///--- API\n\nmodule.exports = {\n\n  parse: parser.parseRequest,\n  parseRequest: parser.parseRequest,\n\n  sign: signer.signRequest,\n  signRequest: signer.signRequest,\n  createSigner: signer.createSigner,\n  isSigner: signer.isSigner,\n\n  sshKeyToPEM: utils.sshKeyToPEM,\n  sshKeyFingerprint: utils.fingerprint,\n  pemToRsaSSHKey: utils.pemToRsaSSHKey,\n\n  verify: verify.verifySignature,\n  verifySignature: verify.verifySignature,\n  verifyHMAC: verify.verifyHMAC\n};\n\n\n/***/ }),\n/* 681 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2012 Joyent, Inc.  All rights reserved.\n\nvar assert = __webpack_require__(16);\nvar util = __webpack_require__(3);\nvar utils = __webpack_require__(175);\n\n\n\n///--- Globals\n\nvar HASH_ALGOS = utils.HASH_ALGOS;\nvar PK_ALGOS = utils.PK_ALGOS;\nvar HttpSignatureError = utils.HttpSignatureError;\nvar InvalidAlgorithmError = utils.InvalidAlgorithmError;\nvar validateAlgorithm = utils.validateAlgorithm;\n\nvar State = {\n  New: 0,\n  Params: 1\n};\n\nvar ParamsState = {\n  Name: 0,\n  Quote: 1,\n  Value: 2,\n  Comma: 3\n};\n\n\n///--- Specific Errors\n\n\nfunction ExpiredRequestError(message) {\n  HttpSignatureError.call(this, message, ExpiredRequestError);\n}\nutil.inherits(ExpiredRequestError, HttpSignatureError);\n\n\nfunction InvalidHeaderError(message) {\n  HttpSignatureError.call(this, message, InvalidHeaderError);\n}\nutil.inherits(InvalidHeaderError, HttpSignatureError);\n\n\nfunction InvalidParamsError(message) {\n  HttpSignatureError.call(this, message, InvalidParamsError);\n}\nutil.inherits(InvalidParamsError, HttpSignatureError);\n\n\nfunction MissingHeaderError(message) {\n  HttpSignatureError.call(this, message, MissingHeaderError);\n}\nutil.inherits(MissingHeaderError, HttpSignatureError);\n\nfunction StrictParsingError(message) {\n  HttpSignatureError.call(this, message, StrictParsingError);\n}\nutil.inherits(StrictParsingError, HttpSignatureError);\n\n///--- Exported API\n\nmodule.exports = {\n\n  /**\n   * Parses the 'Authorization' header out of an http.ServerRequest object.\n   *\n   * Note that this API will fully validate the Authorization header, and throw\n   * on any error.  It will not however check the signature, or the keyId format\n   * as those are specific to your environment.  You can use the options object\n   * to pass in extra constraints.\n   *\n   * As a response object you can expect this:\n   *\n   *     {\n   *       \"scheme\": \"Signature\",\n   *       \"params\": {\n   *         \"keyId\": \"foo\",\n   *         \"algorithm\": \"rsa-sha256\",\n   *         \"headers\": [\n   *           \"date\" or \"x-date\",\n   *           \"digest\"\n   *         ],\n   *         \"signature\": \"base64\"\n   *       },\n   *       \"signingString\": \"ready to be passed to crypto.verify()\"\n   *     }\n   *\n   * @param {Object} request an http.ServerRequest.\n   * @param {Object} options an optional options object with:\n   *                   - clockSkew: allowed clock skew in seconds (default 300).\n   *                   - headers: required header names (def: date or x-date)\n   *                   - algorithms: algorithms to support (default: all).\n   *                   - strict: should enforce latest spec parsing\n   *                             (default: false).\n   * @return {Object} parsed out object (see above).\n   * @throws {TypeError} on invalid input.\n   * @throws {InvalidHeaderError} on an invalid Authorization header error.\n   * @throws {InvalidParamsError} if the params in the scheme are invalid.\n   * @throws {MissingHeaderError} if the params indicate a header not present,\n   *                              either in the request headers from the params,\n   *                              or not in the params from a required header\n   *                              in options.\n   * @throws {StrictParsingError} if old attributes are used in strict parsing\n   *                              mode.\n   * @throws {ExpiredRequestError} if the value of date or x-date exceeds skew.\n   */\n  parseRequest: function parseRequest(request, options) {\n    assert.object(request, 'request');\n    assert.object(request.headers, 'request.headers');\n    if (options === undefined) {\n      options = {};\n    }\n    if (options.headers === undefined) {\n      options.headers = [request.headers['x-date'] ? 'x-date' : 'date'];\n    }\n    assert.object(options, 'options');\n    assert.arrayOfString(options.headers, 'options.headers');\n    assert.optionalFinite(options.clockSkew, 'options.clockSkew');\n\n    var authzHeaderName = options.authorizationHeaderName || 'authorization';\n\n    if (!request.headers[authzHeaderName]) {\n      throw new MissingHeaderError('no ' + authzHeaderName + ' header ' +\n                                   'present in the request');\n    }\n\n    options.clockSkew = options.clockSkew || 300;\n\n\n    var i = 0;\n    var state = State.New;\n    var substate = ParamsState.Name;\n    var tmpName = '';\n    var tmpValue = '';\n\n    var parsed = {\n      scheme: '',\n      params: {},\n      signingString: ''\n    };\n\n    var authz = request.headers[authzHeaderName];\n    for (i = 0; i < authz.length; i++) {\n      var c = authz.charAt(i);\n\n      switch (Number(state)) {\n\n      case State.New:\n        if (c !== ' ') parsed.scheme += c;\n        else state = State.Params;\n        break;\n\n      case State.Params:\n        switch (Number(substate)) {\n\n        case ParamsState.Name:\n          var code = c.charCodeAt(0);\n          // restricted name of A-Z / a-z\n          if ((code >= 0x41 && code <= 0x5a) || // A-Z\n              (code >= 0x61 && code <= 0x7a)) { // a-z\n            tmpName += c;\n          } else if (c === '=') {\n            if (tmpName.length === 0)\n              throw new InvalidHeaderError('bad param format');\n            substate = ParamsState.Quote;\n          } else {\n            throw new InvalidHeaderError('bad param format');\n          }\n          break;\n\n        case ParamsState.Quote:\n          if (c === '\"') {\n            tmpValue = '';\n            substate = ParamsState.Value;\n          } else {\n            throw new InvalidHeaderError('bad param format');\n          }\n          break;\n\n        case ParamsState.Value:\n          if (c === '\"') {\n            parsed.params[tmpName] = tmpValue;\n            substate = ParamsState.Comma;\n          } else {\n            tmpValue += c;\n          }\n          break;\n\n        case ParamsState.Comma:\n          if (c === ',') {\n            tmpName = '';\n            substate = ParamsState.Name;\n          } else {\n            throw new InvalidHeaderError('bad param format');\n          }\n          break;\n\n        default:\n          throw new Error('Invalid substate');\n        }\n        break;\n\n      default:\n        throw new Error('Invalid substate');\n      }\n\n    }\n\n    if (!parsed.params.headers || parsed.params.headers === '') {\n      if (request.headers['x-date']) {\n        parsed.params.headers = ['x-date'];\n      } else {\n        parsed.params.headers = ['date'];\n      }\n    } else {\n      parsed.params.headers = parsed.params.headers.split(' ');\n    }\n\n    // Minimally validate the parsed object\n    if (!parsed.scheme || parsed.scheme !== 'Signature')\n      throw new InvalidHeaderError('scheme was not \"Signature\"');\n\n    if (!parsed.params.keyId)\n      throw new InvalidHeaderError('keyId was not specified');\n\n    if (!parsed.params.algorithm)\n      throw new InvalidHeaderError('algorithm was not specified');\n\n    if (!parsed.params.signature)\n      throw new InvalidHeaderError('signature was not specified');\n\n    // Check the algorithm against the official list\n    parsed.params.algorithm = parsed.params.algorithm.toLowerCase();\n    try {\n      validateAlgorithm(parsed.params.algorithm);\n    } catch (e) {\n      if (e instanceof InvalidAlgorithmError)\n        throw (new InvalidParamsError(parsed.params.algorithm + ' is not ' +\n          'supported'));\n      else\n        throw (e);\n    }\n\n    // Build the signingString\n    for (i = 0; i < parsed.params.headers.length; i++) {\n      var h = parsed.params.headers[i].toLowerCase();\n      parsed.params.headers[i] = h;\n\n      if (h === 'request-line') {\n        if (!options.strict) {\n          /*\n           * We allow headers from the older spec drafts if strict parsing isn't\n           * specified in options.\n           */\n          parsed.signingString +=\n            request.method + ' ' + request.url + ' HTTP/' + request.httpVersion;\n        } else {\n          /* Strict parsing doesn't allow older draft headers. */\n          throw (new StrictParsingError('request-line is not a valid header ' +\n            'with strict parsing enabled.'));\n        }\n      } else if (h === '(request-target)') {\n        parsed.signingString +=\n          '(request-target): ' + request.method.toLowerCase() + ' ' +\n          request.url;\n      } else {\n        var value = request.headers[h];\n        if (value === undefined)\n          throw new MissingHeaderError(h + ' was not in the request');\n        parsed.signingString += h + ': ' + value;\n      }\n\n      if ((i + 1) < parsed.params.headers.length)\n        parsed.signingString += '\\n';\n    }\n\n    // Check against the constraints\n    var date;\n    if (request.headers.date || request.headers['x-date']) {\n        if (request.headers['x-date']) {\n          date = new Date(request.headers['x-date']);\n        } else {\n          date = new Date(request.headers.date);\n        }\n      var now = new Date();\n      var skew = Math.abs(now.getTime() - date.getTime());\n\n      if (skew > options.clockSkew * 1000) {\n        throw new ExpiredRequestError('clock skew of ' +\n                                      (skew / 1000) +\n                                      's was greater than ' +\n                                      options.clockSkew + 's');\n      }\n    }\n\n    options.headers.forEach(function (hdr) {\n      // Remember that we already checked any headers in the params\n      // were in the request, so if this passes we're good.\n      if (parsed.params.headers.indexOf(hdr.toLowerCase()) < 0)\n        throw new MissingHeaderError(hdr + ' was not a signed header');\n    });\n\n    if (options.algorithms) {\n      if (options.algorithms.indexOf(parsed.params.algorithm) === -1)\n        throw new InvalidParamsError(parsed.params.algorithm +\n                                     ' is not a supported algorithm');\n    }\n\n    parsed.algorithm = parsed.params.algorithm.toUpperCase();\n    parsed.keyId = parsed.params.keyId;\n    return parsed;\n  }\n\n};\n\n\n/***/ }),\n/* 682 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2012 Joyent, Inc.  All rights reserved.\n\nvar assert = __webpack_require__(16);\nvar crypto = __webpack_require__(11);\nvar http = __webpack_require__(87);\nvar util = __webpack_require__(3);\nvar sshpk = __webpack_require__(329);\nvar jsprim = __webpack_require__(746);\nvar utils = __webpack_require__(175);\n\nvar sprintf = __webpack_require__(3).format;\n\nvar HASH_ALGOS = utils.HASH_ALGOS;\nvar PK_ALGOS = utils.PK_ALGOS;\nvar InvalidAlgorithmError = utils.InvalidAlgorithmError;\nvar HttpSignatureError = utils.HttpSignatureError;\nvar validateAlgorithm = utils.validateAlgorithm;\n\n///--- Globals\n\nvar AUTHZ_FMT =\n  'Signature keyId=\"%s\",algorithm=\"%s\",headers=\"%s\",signature=\"%s\"';\n\n///--- Specific Errors\n\nfunction MissingHeaderError(message) {\n  HttpSignatureError.call(this, message, MissingHeaderError);\n}\nutil.inherits(MissingHeaderError, HttpSignatureError);\n\nfunction StrictParsingError(message) {\n  HttpSignatureError.call(this, message, StrictParsingError);\n}\nutil.inherits(StrictParsingError, HttpSignatureError);\n\n/* See createSigner() */\nfunction RequestSigner(options) {\n  assert.object(options, 'options');\n\n  var alg = [];\n  if (options.algorithm !== undefined) {\n    assert.string(options.algorithm, 'options.algorithm');\n    alg = validateAlgorithm(options.algorithm);\n  }\n  this.rs_alg = alg;\n\n  /*\n   * RequestSigners come in two varieties: ones with an rs_signFunc, and ones\n   * with an rs_signer.\n   *\n   * rs_signFunc-based RequestSigners have to build up their entire signing\n   * string within the rs_lines array and give it to rs_signFunc as a single\n   * concat'd blob. rs_signer-based RequestSigners can add a line at a time to\n   * their signing state by using rs_signer.update(), thus only needing to\n   * buffer the hash function state and one line at a time.\n   */\n  if (options.sign !== undefined) {\n    assert.func(options.sign, 'options.sign');\n    this.rs_signFunc = options.sign;\n\n  } else if (alg[0] === 'hmac' && options.key !== undefined) {\n    assert.string(options.keyId, 'options.keyId');\n    this.rs_keyId = options.keyId;\n\n    if (typeof (options.key) !== 'string' && !Buffer.isBuffer(options.key))\n      throw (new TypeError('options.key for HMAC must be a string or Buffer'));\n\n    /*\n     * Make an rs_signer for HMACs, not a rs_signFunc -- HMACs digest their\n     * data in chunks rather than requiring it all to be given in one go\n     * at the end, so they are more similar to signers than signFuncs.\n     */\n    this.rs_signer = crypto.createHmac(alg[1].toUpperCase(), options.key);\n    this.rs_signer.sign = function () {\n      var digest = this.digest('base64');\n      return ({\n        hashAlgorithm: alg[1],\n        toString: function () { return (digest); }\n      });\n    };\n\n  } else if (options.key !== undefined) {\n    var key = options.key;\n    if (typeof (key) === 'string' || Buffer.isBuffer(key))\n      key = sshpk.parsePrivateKey(key);\n\n    assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]),\n      'options.key must be a sshpk.PrivateKey');\n    this.rs_key = key;\n\n    assert.string(options.keyId, 'options.keyId');\n    this.rs_keyId = options.keyId;\n\n    if (!PK_ALGOS[key.type]) {\n      throw (new InvalidAlgorithmError(key.type.toUpperCase() + ' type ' +\n        'keys are not supported'));\n    }\n\n    if (alg[0] !== undefined && key.type !== alg[0]) {\n      throw (new InvalidAlgorithmError('options.key must be a ' +\n        alg[0].toUpperCase() + ' key, was given a ' +\n        key.type.toUpperCase() + ' key instead'));\n    }\n\n    this.rs_signer = key.createSign(alg[1]);\n\n  } else {\n    throw (new TypeError('options.sign (func) or options.key is required'));\n  }\n\n  this.rs_headers = [];\n  this.rs_lines = [];\n}\n\n/**\n * Adds a header to be signed, with its value, into this signer.\n *\n * @param {String} header\n * @param {String} value\n * @return {String} value written\n */\nRequestSigner.prototype.writeHeader = function (header, value) {\n  assert.string(header, 'header');\n  header = header.toLowerCase();\n  assert.string(value, 'value');\n\n  this.rs_headers.push(header);\n\n  if (this.rs_signFunc) {\n    this.rs_lines.push(header + ': ' + value);\n\n  } else {\n    var line = header + ': ' + value;\n    if (this.rs_headers.length > 0)\n      line = '\\n' + line;\n    this.rs_signer.update(line);\n  }\n\n  return (value);\n};\n\n/**\n * Adds a default Date header, returning its value.\n *\n * @return {String}\n */\nRequestSigner.prototype.writeDateHeader = function () {\n  return (this.writeHeader('date', jsprim.rfc1123(new Date())));\n};\n\n/**\n * Adds the request target line to be signed.\n *\n * @param {String} method, HTTP method (e.g. 'get', 'post', 'put')\n * @param {String} path\n */\nRequestSigner.prototype.writeTarget = function (method, path) {\n  assert.string(method, 'method');\n  assert.string(path, 'path');\n  method = method.toLowerCase();\n  this.writeHeader('(request-target)', method + ' ' + path);\n};\n\n/**\n * Calculate the value for the Authorization header on this request\n * asynchronously.\n *\n * @param {Func} callback (err, authz)\n */\nRequestSigner.prototype.sign = function (cb) {\n  assert.func(cb, 'callback');\n\n  if (this.rs_headers.length < 1)\n    throw (new Error('At least one header must be signed'));\n\n  var alg, authz;\n  if (this.rs_signFunc) {\n    var data = this.rs_lines.join('\\n');\n    var self = this;\n    this.rs_signFunc(data, function (err, sig) {\n      if (err) {\n        cb(err);\n        return;\n      }\n      try {\n        assert.object(sig, 'signature');\n        assert.string(sig.keyId, 'signature.keyId');\n        assert.string(sig.algorithm, 'signature.algorithm');\n        assert.string(sig.signature, 'signature.signature');\n        alg = validateAlgorithm(sig.algorithm);\n\n        authz = sprintf(AUTHZ_FMT,\n          sig.keyId,\n          sig.algorithm,\n          self.rs_headers.join(' '),\n          sig.signature);\n      } catch (e) {\n        cb(e);\n        return;\n      }\n      cb(null, authz);\n    });\n\n  } else {\n    try {\n      var sigObj = this.rs_signer.sign();\n    } catch (e) {\n      cb(e);\n      return;\n    }\n    alg = (this.rs_alg[0] || this.rs_key.type) + '-' + sigObj.hashAlgorithm;\n    var signature = sigObj.toString();\n    authz = sprintf(AUTHZ_FMT,\n      this.rs_keyId,\n      alg,\n      this.rs_headers.join(' '),\n      signature);\n    cb(null, authz);\n  }\n};\n\n///--- Exported API\n\nmodule.exports = {\n  /**\n   * Identifies whether a given object is a request signer or not.\n   *\n   * @param {Object} object, the object to identify\n   * @returns {Boolean}\n   */\n  isSigner: function (obj) {\n    if (typeof (obj) === 'object' && obj instanceof RequestSigner)\n      return (true);\n    return (false);\n  },\n\n  /**\n   * Creates a request signer, used to asynchronously build a signature\n   * for a request (does not have to be an http.ClientRequest).\n   *\n   * @param {Object} options, either:\n   *                   - {String} keyId\n   *                   - {String|Buffer} key\n   *                   - {String} algorithm (optional, required for HMAC)\n   *                 or:\n   *                   - {Func} sign (data, cb)\n   * @return {RequestSigner}\n   */\n  createSigner: function createSigner(options) {\n    return (new RequestSigner(options));\n  },\n\n  /**\n   * Adds an 'Authorization' header to an http.ClientRequest object.\n   *\n   * Note that this API will add a Date header if it's not already set. Any\n   * other headers in the options.headers array MUST be present, or this\n   * will throw.\n   *\n   * You shouldn't need to check the return type; it's just there if you want\n   * to be pedantic.\n   *\n   * The optional flag indicates whether parsing should use strict enforcement\n   * of the version draft-cavage-http-signatures-04 of the spec or beyond.\n   * The default is to be loose and support\n   * older versions for compatibility.\n   *\n   * @param {Object} request an instance of http.ClientRequest.\n   * @param {Object} options signing parameters object:\n   *                   - {String} keyId required.\n   *                   - {String} key required (either a PEM or HMAC key).\n   *                   - {Array} headers optional; defaults to ['date'].\n   *                   - {String} algorithm optional (unless key is HMAC);\n   *                              default is the same as the sshpk default\n   *                              signing algorithm for the type of key given\n   *                   - {String} httpVersion optional; defaults to '1.1'.\n   *                   - {Boolean} strict optional; defaults to 'false'.\n   * @return {Boolean} true if Authorization (and optionally Date) were added.\n   * @throws {TypeError} on bad parameter types (input).\n   * @throws {InvalidAlgorithmError} if algorithm was bad or incompatible with\n   *                                 the given key.\n   * @throws {sshpk.KeyParseError} if key was bad.\n   * @throws {MissingHeaderError} if a header to be signed was specified but\n   *                              was not present.\n   */\n  signRequest: function signRequest(request, options) {\n    assert.object(request, 'request');\n    assert.object(options, 'options');\n    assert.optionalString(options.algorithm, 'options.algorithm');\n    assert.string(options.keyId, 'options.keyId');\n    assert.optionalArrayOfString(options.headers, 'options.headers');\n    assert.optionalString(options.httpVersion, 'options.httpVersion');\n\n    if (!request.getHeader('Date'))\n      request.setHeader('Date', jsprim.rfc1123(new Date()));\n    if (!options.headers)\n      options.headers = ['date'];\n    if (!options.httpVersion)\n      options.httpVersion = '1.1';\n\n    var alg = [];\n    if (options.algorithm) {\n      options.algorithm = options.algorithm.toLowerCase();\n      alg = validateAlgorithm(options.algorithm);\n    }\n\n    var i;\n    var stringToSign = '';\n    for (i = 0; i < options.headers.length; i++) {\n      if (typeof (options.headers[i]) !== 'string')\n        throw new TypeError('options.headers must be an array of Strings');\n\n      var h = options.headers[i].toLowerCase();\n\n      if (h === 'request-line') {\n        if (!options.strict) {\n          /**\n           * We allow headers from the older spec drafts if strict parsing isn't\n           * specified in options.\n           */\n          stringToSign +=\n            request.method + ' ' + request.path + ' HTTP/' +\n            options.httpVersion;\n        } else {\n          /* Strict parsing doesn't allow older draft headers. */\n          throw (new StrictParsingError('request-line is not a valid header ' +\n            'with strict parsing enabled.'));\n        }\n      } else if (h === '(request-target)') {\n        stringToSign +=\n          '(request-target): ' + request.method.toLowerCase() + ' ' +\n          request.path;\n      } else {\n        var value = request.getHeader(h);\n        if (value === undefined || value === '') {\n          throw new MissingHeaderError(h + ' was not in the request');\n        }\n        stringToSign += h + ': ' + value;\n      }\n\n      if ((i + 1) < options.headers.length)\n        stringToSign += '\\n';\n    }\n\n    /* This is just for unit tests. */\n    if (request.hasOwnProperty('_stringToSign')) {\n      request._stringToSign = stringToSign;\n    }\n\n    var signature;\n    if (alg[0] === 'hmac') {\n      if (typeof (options.key) !== 'string' && !Buffer.isBuffer(options.key))\n        throw (new TypeError('options.key must be a string or Buffer'));\n\n      var hmac = crypto.createHmac(alg[1].toUpperCase(), options.key);\n      hmac.update(stringToSign);\n      signature = hmac.digest('base64');\n\n    } else {\n      var key = options.key;\n      if (typeof (key) === 'string' || Buffer.isBuffer(key))\n        key = sshpk.parsePrivateKey(options.key);\n\n      assert.ok(sshpk.PrivateKey.isPrivateKey(key, [1, 2]),\n        'options.key must be a sshpk.PrivateKey');\n\n      if (!PK_ALGOS[key.type]) {\n        throw (new InvalidAlgorithmError(key.type.toUpperCase() + ' type ' +\n          'keys are not supported'));\n      }\n\n      if (alg[0] !== undefined && key.type !== alg[0]) {\n        throw (new InvalidAlgorithmError('options.key must be a ' +\n          alg[0].toUpperCase() + ' key, was given a ' +\n          key.type.toUpperCase() + ' key instead'));\n      }\n\n      var signer = key.createSign(alg[1]);\n      signer.update(stringToSign);\n      var sigObj = signer.sign();\n      if (!HASH_ALGOS[sigObj.hashAlgorithm]) {\n        throw (new InvalidAlgorithmError(sigObj.hashAlgorithm.toUpperCase() +\n          ' is not a supported hash algorithm'));\n      }\n      options.algorithm = key.type + '-' + sigObj.hashAlgorithm;\n      signature = sigObj.toString();\n      assert.notStrictEqual(signature, '', 'empty signature produced');\n    }\n\n    var authzHeaderName = options.authorizationHeaderName || 'Authorization';\n\n    request.setHeader(authzHeaderName, sprintf(AUTHZ_FMT,\n                                               options.keyId,\n                                               options.algorithm,\n                                               options.headers.join(' '),\n                                               signature));\n\n    return true;\n  }\n\n};\n\n\n/***/ }),\n/* 683 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2015 Joyent, Inc.\n\nvar assert = __webpack_require__(16);\nvar crypto = __webpack_require__(11);\nvar sshpk = __webpack_require__(329);\nvar utils = __webpack_require__(175);\n\nvar HASH_ALGOS = utils.HASH_ALGOS;\nvar PK_ALGOS = utils.PK_ALGOS;\nvar InvalidAlgorithmError = utils.InvalidAlgorithmError;\nvar HttpSignatureError = utils.HttpSignatureError;\nvar validateAlgorithm = utils.validateAlgorithm;\n\n///--- Exported API\n\nmodule.exports = {\n  /**\n   * Verify RSA/DSA signature against public key.  You are expected to pass in\n   * an object that was returned from `parse()`.\n   *\n   * @param {Object} parsedSignature the object you got from `parse`.\n   * @param {String} pubkey RSA/DSA private key PEM.\n   * @return {Boolean} true if valid, false otherwise.\n   * @throws {TypeError} if you pass in bad arguments.\n   * @throws {InvalidAlgorithmError}\n   */\n  verifySignature: function verifySignature(parsedSignature, pubkey) {\n    assert.object(parsedSignature, 'parsedSignature');\n    if (typeof (pubkey) === 'string' || Buffer.isBuffer(pubkey))\n      pubkey = sshpk.parseKey(pubkey);\n    assert.ok(sshpk.Key.isKey(pubkey, [1, 1]), 'pubkey must be a sshpk.Key');\n\n    var alg = validateAlgorithm(parsedSignature.algorithm);\n    if (alg[0] === 'hmac' || alg[0] !== pubkey.type)\n      return (false);\n\n    var v = pubkey.createVerify(alg[1]);\n    v.update(parsedSignature.signingString);\n    return (v.verify(parsedSignature.params.signature, 'base64'));\n  },\n\n  /**\n   * Verify HMAC against shared secret.  You are expected to pass in an object\n   * that was returned from `parse()`.\n   *\n   * @param {Object} parsedSignature the object you got from `parse`.\n   * @param {String} secret HMAC shared secret.\n   * @return {Boolean} true if valid, false otherwise.\n   * @throws {TypeError} if you pass in bad arguments.\n   * @throws {InvalidAlgorithmError}\n   */\n  verifyHMAC: function verifyHMAC(parsedSignature, secret) {\n    assert.object(parsedSignature, 'parsedHMAC');\n    assert.string(secret, 'secret');\n\n    var alg = validateAlgorithm(parsedSignature.algorithm);\n    if (alg[0] !== 'hmac')\n      return (false);\n\n    var hashAlg = alg[1].toUpperCase();\n\n    var hmac = crypto.createHmac(hashAlg, secret);\n    hmac.update(parsedSignature.signingString);\n\n    /*\n     * Now double-hash to avoid leaking timing information - there's\n     * no easy constant-time compare in JS, so we use this approach\n     * instead. See for more info:\n     * https://www.isecpartners.com/blog/2011/february/double-hmac-\n     * verification.aspx\n     */\n    var h1 = crypto.createHmac(hashAlg, secret);\n    h1.update(hmac.digest());\n    h1 = h1.digest();\n    var h2 = crypto.createHmac(hashAlg, secret);\n    h2.update(new Buffer(parsedSignature.params.signature, 'base64'));\n    h2 = h2.digest();\n\n    /* Node 0.8 returns strings from .digest(). */\n    if (typeof (h1) === 'string')\n      return (h1 === h2);\n    /* And node 0.10 lacks the .equals() method on Buffers. */\n    if (Buffer.isBuffer(h1) && !h1.equals)\n      return (h1.toString('binary') === h2.toString('binary'));\n\n    return (h1.equals(h2));\n  }\n};\n\n\n/***/ }),\n/* 684 */\n/***/ (function(module, exports) {\n\nexports.parse = exports.decode = decode\n\nexports.stringify = exports.encode = encode\n\nexports.safe = safe\nexports.unsafe = unsafe\n\nvar eol = typeof process !== 'undefined' &&\n  process.platform === 'win32' ? '\\r\\n' : '\\n'\n\nfunction encode (obj, opt) {\n  var children = []\n  var out = ''\n\n  if (typeof opt === 'string') {\n    opt = {\n      section: opt,\n      whitespace: false\n    }\n  } else {\n    opt = opt || {}\n    opt.whitespace = opt.whitespace === true\n  }\n\n  var separator = opt.whitespace ? ' = ' : '='\n\n  Object.keys(obj).forEach(function (k, _, __) {\n    var val = obj[k]\n    if (val && Array.isArray(val)) {\n      val.forEach(function (item) {\n        out += safe(k + '[]') + separator + safe(item) + '\\n'\n      })\n    } else if (val && typeof val === 'object') {\n      children.push(k)\n    } else {\n      out += safe(k) + separator + safe(val) + eol\n    }\n  })\n\n  if (opt.section && out.length) {\n    out = '[' + safe(opt.section) + ']' + eol + out\n  }\n\n  children.forEach(function (k, _, __) {\n    var nk = dotSplit(k).join('\\\\.')\n    var section = (opt.section ? opt.section + '.' : '') + nk\n    var child = encode(obj[k], {\n      section: section,\n      whitespace: opt.whitespace\n    })\n    if (out.length && child.length) {\n      out += eol\n    }\n    out += child\n  })\n\n  return out\n}\n\nfunction dotSplit (str) {\n  return str.replace(/\\1/g, '\\u0002LITERAL\\\\1LITERAL\\u0002')\n    .replace(/\\\\\\./g, '\\u0001')\n    .split(/\\./).map(function (part) {\n      return part.replace(/\\1/g, '\\\\.')\n      .replace(/\\2LITERAL\\\\1LITERAL\\2/g, '\\u0001')\n    })\n}\n\nfunction decode (str) {\n  var out = {}\n  var p = out\n  var section = null\n  //          section     |key      = value\n  var re = /^\\[([^\\]]*)\\]$|^([^=]+)(=(.*))?$/i\n  var lines = str.split(/[\\r\\n]+/g)\n\n  lines.forEach(function (line, _, __) {\n    if (!line || line.match(/^\\s*[;#]/)) return\n    var match = line.match(re)\n    if (!match) return\n    if (match[1] !== undefined) {\n      section = unsafe(match[1])\n      p = out[section] = out[section] || {}\n      return\n    }\n    var key = unsafe(match[2])\n    var value = match[3] ? unsafe(match[4]) : true\n    switch (value) {\n      case 'true':\n      case 'false':\n      case 'null': value = JSON.parse(value)\n    }\n\n    // Convert keys with '[]' suffix to an array\n    if (key.length > 2 && key.slice(-2) === '[]') {\n      key = key.substring(0, key.length - 2)\n      if (!p[key]) {\n        p[key] = []\n      } else if (!Array.isArray(p[key])) {\n        p[key] = [p[key]]\n      }\n    }\n\n    // safeguard against resetting a previously defined\n    // array by accidentally forgetting the brackets\n    if (Array.isArray(p[key])) {\n      p[key].push(value)\n    } else {\n      p[key] = value\n    }\n  })\n\n  // {a:{y:1},\"a.b\":{x:2}} --> {a:{y:1,b:{x:2}}}\n  // use a filter to return the keys that have to be deleted.\n  Object.keys(out).filter(function (k, _, __) {\n    if (!out[k] ||\n      typeof out[k] !== 'object' ||\n      Array.isArray(out[k])) {\n      return false\n    }\n    // see if the parent section is also an object.\n    // if so, add it to that, and mark this one for deletion\n    var parts = dotSplit(k)\n    var p = out\n    var l = parts.pop()\n    var nl = l.replace(/\\\\\\./g, '.')\n    parts.forEach(function (part, _, __) {\n      if (!p[part] || typeof p[part] !== 'object') p[part] = {}\n      p = p[part]\n    })\n    if (p === out && nl === l) {\n      return false\n    }\n    p[nl] = out[k]\n    return true\n  }).forEach(function (del, _, __) {\n    delete out[del]\n  })\n\n  return out\n}\n\nfunction isQuoted (val) {\n  return (val.charAt(0) === '\"' && val.slice(-1) === '\"') ||\n    (val.charAt(0) === \"'\" && val.slice(-1) === \"'\")\n}\n\nfunction safe (val) {\n  return (typeof val !== 'string' ||\n    val.match(/[=\\r\\n]/) ||\n    val.match(/^\\[/) ||\n    (val.length > 1 &&\n     isQuoted(val)) ||\n    val !== val.trim())\n      ? JSON.stringify(val)\n      : val.replace(/;/g, '\\\\;').replace(/#/g, '\\\\#')\n}\n\nfunction unsafe (val, doUnesc) {\n  val = (val || '').trim()\n  if (isQuoted(val)) {\n    // remove the single quotes before calling JSON.parse\n    if (val.charAt(0) === \"'\") {\n      val = val.substr(1, val.length - 2)\n    }\n    try { val = JSON.parse(val) } catch (_) {}\n  } else {\n    // walk the val to find the first not-escaped ; character\n    var esc = false\n    var unesc = ''\n    for (var i = 0, l = val.length; i < l; i++) {\n      var c = val.charAt(i)\n      if (esc) {\n        if ('\\\\;#'.indexOf(c) !== -1) {\n          unesc += c\n        } else {\n          unesc += '\\\\' + c\n        }\n        esc = false\n      } else if (';#'.indexOf(c) !== -1) {\n        break\n      } else if (c === '\\\\') {\n        esc = true\n      } else {\n        unesc += c\n      }\n    }\n    if (esc) {\n      unesc += '\\\\'\n    }\n    return unesc.trim()\n  }\n  return val\n}\n\n\n/***/ }),\n/* 685 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar _ = __webpack_require__(38);\n\n/**\n * Choice object\n * Normalize input as choice object\n * @constructor\n * @param {String|Object} val  Choice value. If an object is passed, it should contains\n *                             at least one of `value` or `name` property\n */\n\nmodule.exports = class Choice {\n  constructor(val, answers) {\n    // Don't process Choice and Separator object\n    if (val instanceof Choice || val.type === 'separator') {\n      return val;\n    }\n\n    if (_.isString(val)) {\n      this.name = val;\n      this.value = val;\n      this.short = val;\n    } else {\n      _.extend(this, val, {\n        name: val.name || val.value,\n        value: 'value' in val ? val.value : val.name,\n        short: val.short || val.name || val.value\n      });\n    }\n\n    if (_.isFunction(val.disabled)) {\n      this.disabled = val.disabled(answers);\n    } else {\n      this.disabled = val.disabled;\n    }\n  }\n};\n\n\n/***/ }),\n/* 686 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar assert = __webpack_require__(29);\nvar _ = __webpack_require__(38);\nvar Separator = __webpack_require__(176);\nvar Choice = __webpack_require__(685);\n\n/**\n * Choices collection\n * Collection of multiple `choice` object\n * @constructor\n * @param {Array} choices  All `choice` to keep in the collection\n */\n\nmodule.exports = class Choices {\n  constructor(choices, answers) {\n    this.choices = choices.map(val => {\n      if (val.type === 'separator') {\n        if (!(val instanceof Separator)) {\n          val = new Separator(val.line);\n        }\n        return val;\n      }\n      return new Choice(val, answers);\n    });\n\n    this.realChoices = this.choices\n      .filter(Separator.exclude)\n      .filter(item => !item.disabled);\n\n    Object.defineProperty(this, 'length', {\n      get() {\n        return this.choices.length;\n      },\n      set(val) {\n        this.choices.length = val;\n      }\n    });\n\n    Object.defineProperty(this, 'realLength', {\n      get() {\n        return this.realChoices.length;\n      },\n      set() {\n        throw new Error('Cannot set `realLength` of a Choices collection');\n      }\n    });\n  }\n\n  /**\n   * Get a valid choice from the collection\n   * @param  {Number} selector  The selected choice index\n   * @return {Choice|Undefined} Return the matched choice or undefined\n   */\n\n  getChoice(selector) {\n    assert(_.isNumber(selector));\n    return this.realChoices[selector];\n  }\n\n  /**\n   * Get a raw element from the collection\n   * @param  {Number} selector  The selected index value\n   * @return {Choice|Undefined} Return the matched choice or undefined\n   */\n\n  get(selector) {\n    assert(_.isNumber(selector));\n    return this.choices[selector];\n  }\n\n  /**\n   * Match the valid choices against a where clause\n   * @param  {Object} whereClause Lodash `where` clause\n   * @return {Array}              Matching choices or empty array\n   */\n\n  where(whereClause) {\n    return _.filter(this.realChoices, whereClause);\n  }\n\n  /**\n   * Pluck a particular key from the choices\n   * @param  {String} propertyName Property name to select\n   * @return {Array}               Selected properties\n   */\n\n  pluck(propertyName) {\n    return _.map(this.realChoices, propertyName);\n  }\n\n  // Expose usual Array methods\n  indexOf() {\n    return this.choices.indexOf.apply(this.choices, arguments);\n  }\n\n  forEach() {\n    return this.choices.forEach.apply(this.choices, arguments);\n  }\n\n  filter() {\n    return this.choices.filter.apply(this.choices, arguments);\n  }\n\n  find(func) {\n    return _.find(this.choices, func);\n  }\n\n  push() {\n    var objs = _.map(arguments, val => new Choice(val));\n    this.choices.push.apply(this.choices, objs);\n    this.realChoices = this.choices.filter(Separator.exclude);\n    return this.choices;\n  }\n};\n\n\n/***/ }),\n/* 687 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * `list` type prompt\n */\n\nvar _ = __webpack_require__(38);\nvar chalk = __webpack_require__(27);\nvar cliCursor = __webpack_require__(375);\nvar figures = __webpack_require__(267);\nvar { map, takeUntil } = __webpack_require__(63);\nvar Base = __webpack_require__(79);\nvar observe = __webpack_require__(80);\nvar Paginator = __webpack_require__(177);\n\nclass CheckboxPrompt extends Base {\n  constructor(questions, rl, answers) {\n    super(questions, rl, answers);\n\n    if (!this.opt.choices) {\n      this.throwParamError('choices');\n    }\n\n    if (_.isArray(this.opt.default)) {\n      this.opt.choices.forEach(function(choice) {\n        if (this.opt.default.indexOf(choice.value) >= 0) {\n          choice.checked = true;\n        }\n      }, this);\n    }\n\n    this.pointer = 0;\n    this.firstRender = true;\n\n    // Make sure no default is set (so it won't be printed)\n    this.opt.default = null;\n\n    this.paginator = new Paginator(this.screen);\n  }\n\n  /**\n   * Start the Inquiry session\n   * @param  {Function} cb      Callback when prompt is done\n   * @return {this}\n   */\n\n  _run(cb) {\n    this.done = cb;\n\n    var events = observe(this.rl);\n\n    var validation = this.handleSubmitEvents(\n      events.line.pipe(map(this.getCurrentValue.bind(this)))\n    );\n    validation.success.forEach(this.onEnd.bind(this));\n    validation.error.forEach(this.onError.bind(this));\n\n    events.normalizedUpKey\n      .pipe(takeUntil(validation.success))\n      .forEach(this.onUpKey.bind(this));\n    events.normalizedDownKey\n      .pipe(takeUntil(validation.success))\n      .forEach(this.onDownKey.bind(this));\n    events.numberKey\n      .pipe(takeUntil(validation.success))\n      .forEach(this.onNumberKey.bind(this));\n    events.spaceKey\n      .pipe(takeUntil(validation.success))\n      .forEach(this.onSpaceKey.bind(this));\n    events.aKey.pipe(takeUntil(validation.success)).forEach(this.onAllKey.bind(this));\n    events.iKey.pipe(takeUntil(validation.success)).forEach(this.onInverseKey.bind(this));\n\n    // Init the prompt\n    cliCursor.hide();\n    this.render();\n    this.firstRender = false;\n\n    return this;\n  }\n\n  /**\n   * Render the prompt to screen\n   * @return {CheckboxPrompt} self\n   */\n\n  render(error) {\n    // Render question\n    var message = this.getQuestion();\n    var bottomContent = '';\n\n    if (this.firstRender) {\n      message +=\n        '(Press ' +\n        chalk.cyan.bold('<space>') +\n        ' to select, ' +\n        chalk.cyan.bold('<a>') +\n        ' to toggle all, ' +\n        chalk.cyan.bold('<i>') +\n        ' to invert selection)';\n    }\n\n    // Render choices or answer depending on the state\n    if (this.status === 'answered') {\n      message += chalk.cyan(this.selection.join(', '));\n    } else {\n      var choicesStr = renderChoices(this.opt.choices, this.pointer);\n      var indexPosition = this.opt.choices.indexOf(\n        this.opt.choices.getChoice(this.pointer)\n      );\n      message +=\n        '\\n' + this.paginator.paginate(choicesStr, indexPosition, this.opt.pageSize);\n    }\n\n    if (error) {\n      bottomContent = chalk.red('>> ') + error;\n    }\n\n    this.screen.render(message, bottomContent);\n  }\n\n  /**\n   * When user press `enter` key\n   */\n\n  onEnd(state) {\n    this.status = 'answered';\n\n    // Rerender prompt (and clean subline error)\n    this.render();\n\n    this.screen.done();\n    cliCursor.show();\n    this.done(state.value);\n  }\n\n  onError(state) {\n    this.render(state.isValid);\n  }\n\n  getCurrentValue() {\n    var choices = this.opt.choices.filter(function(choice) {\n      return Boolean(choice.checked) && !choice.disabled;\n    });\n\n    this.selection = _.map(choices, 'short');\n    return _.map(choices, 'value');\n  }\n\n  onUpKey() {\n    var len = this.opt.choices.realLength;\n    this.pointer = this.pointer > 0 ? this.pointer - 1 : len - 1;\n    this.render();\n  }\n\n  onDownKey() {\n    var len = this.opt.choices.realLength;\n    this.pointer = this.pointer < len - 1 ? this.pointer + 1 : 0;\n    this.render();\n  }\n\n  onNumberKey(input) {\n    if (input <= this.opt.choices.realLength) {\n      this.pointer = input - 1;\n      this.toggleChoice(this.pointer);\n    }\n    this.render();\n  }\n\n  onSpaceKey() {\n    this.toggleChoice(this.pointer);\n    this.render();\n  }\n\n  onAllKey() {\n    var shouldBeChecked = Boolean(\n      this.opt.choices.find(function(choice) {\n        return choice.type !== 'separator' && !choice.checked;\n      })\n    );\n\n    this.opt.choices.forEach(function(choice) {\n      if (choice.type !== 'separator') {\n        choice.checked = shouldBeChecked;\n      }\n    });\n\n    this.render();\n  }\n\n  onInverseKey() {\n    this.opt.choices.forEach(function(choice) {\n      if (choice.type !== 'separator') {\n        choice.checked = !choice.checked;\n      }\n    });\n\n    this.render();\n  }\n\n  toggleChoice(index) {\n    var item = this.opt.choices.getChoice(index);\n    if (item !== undefined) {\n      this.opt.choices.getChoice(index).checked = !item.checked;\n    }\n  }\n}\n\n/**\n * Function for rendering checkbox choices\n * @param  {Number} pointer Position of the pointer\n * @return {String}         Rendered content\n */\n\nfunction renderChoices(choices, pointer) {\n  var output = '';\n  var separatorOffset = 0;\n\n  choices.forEach(function(choice, i) {\n    if (choice.type === 'separator') {\n      separatorOffset++;\n      output += ' ' + choice + '\\n';\n      return;\n    }\n\n    if (choice.disabled) {\n      separatorOffset++;\n      output += ' - ' + choice.name;\n      output += ' (' + (_.isString(choice.disabled) ? choice.disabled : 'Disabled') + ')';\n    } else {\n      var line = getCheckbox(choice.checked) + ' ' + choice.name;\n      if (i - separatorOffset === pointer) {\n        output += chalk.cyan(figures.pointer + line);\n      } else {\n        output += ' ' + line;\n      }\n    }\n\n    output += '\\n';\n  });\n\n  return output.replace(/\\n$/, '');\n}\n\n/**\n * Get the checkbox\n * @param  {Boolean} checked - add a X or not to the checkbox\n * @return {String} Composited checkbox string\n */\n\nfunction getCheckbox(checked) {\n  return checked ? chalk.green(figures.radioOn) : figures.radioOff;\n}\n\nmodule.exports = CheckboxPrompt;\n\n\n/***/ }),\n/* 688 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * `confirm` type prompt\n */\n\nvar _ = __webpack_require__(38);\nvar chalk = __webpack_require__(27);\nvar { take, takeUntil } = __webpack_require__(63);\nvar Base = __webpack_require__(79);\nvar observe = __webpack_require__(80);\n\nclass ConfirmPrompt extends Base {\n  constructor(questions, rl, answers) {\n    super(questions, rl, answers);\n\n    var rawDefault = true;\n\n    _.extend(this.opt, {\n      filter: function(input) {\n        var value = rawDefault;\n        if (input != null && input !== '') {\n          value = /^y(es)?/i.test(input);\n        }\n        return value;\n      }\n    });\n\n    if (_.isBoolean(this.opt.default)) {\n      rawDefault = this.opt.default;\n    }\n\n    this.opt.default = rawDefault ? 'Y/n' : 'y/N';\n\n    return this;\n  }\n\n  /**\n   * Start the Inquiry session\n   * @param  {Function} cb   Callback when prompt is done\n   * @return {this}\n   */\n\n  _run(cb) {\n    this.done = cb;\n\n    // Once user confirm (enter key)\n    var events = observe(this.rl);\n    events.keypress.pipe(takeUntil(events.line)).forEach(this.onKeypress.bind(this));\n\n    events.line.pipe(take(1)).forEach(this.onEnd.bind(this));\n\n    // Init\n    this.render();\n\n    return this;\n  }\n\n  /**\n   * Render the prompt to screen\n   * @return {ConfirmPrompt} self\n   */\n\n  render(answer) {\n    var message = this.getQuestion();\n\n    if (typeof answer === 'boolean') {\n      message += chalk.cyan(answer ? 'Yes' : 'No');\n    } else {\n      message += this.rl.line;\n    }\n\n    this.screen.render(message);\n\n    return this;\n  }\n\n  /**\n   * When user press `enter` key\n   */\n\n  onEnd(input) {\n    this.status = 'answered';\n\n    var output = this.opt.filter(input);\n    this.render(output);\n\n    this.screen.done();\n    this.done(output);\n  }\n\n  /**\n   * When user press a key\n   */\n\n  onKeypress() {\n    this.render();\n  }\n}\n\nmodule.exports = ConfirmPrompt;\n\n\n/***/ }),\n/* 689 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * `editor` type prompt\n */\n\nvar chalk = __webpack_require__(27);\nvar editAsync = __webpack_require__(709).editAsync;\nvar Base = __webpack_require__(79);\nvar observe = __webpack_require__(80);\nvar { Subject } = __webpack_require__(183);\n\nclass EditorPrompt extends Base {\n  /**\n   * Start the Inquiry session\n   * @param  {Function} cb      Callback when prompt is done\n   * @return {this}\n   */\n\n  _run(cb) {\n    this.done = cb;\n\n    this.editorResult = new Subject();\n\n    // Open Editor on \"line\" (Enter Key)\n    var events = observe(this.rl);\n    this.lineSubscription = events.line.subscribe(this.startExternalEditor.bind(this));\n\n    // Trigger Validation when editor closes\n    var validation = this.handleSubmitEvents(this.editorResult);\n    validation.success.forEach(this.onEnd.bind(this));\n    validation.error.forEach(this.onError.bind(this));\n\n    // Prevents default from being printed on screen (can look weird with multiple lines)\n    this.currentText = this.opt.default;\n    this.opt.default = null;\n\n    // Init\n    this.render();\n\n    return this;\n  }\n\n  /**\n   * Render the prompt to screen\n   * @return {EditorPrompt} self\n   */\n\n  render(error) {\n    var bottomContent = '';\n    var message = this.getQuestion();\n\n    if (this.status === 'answered') {\n      message += chalk.dim('Received');\n    } else {\n      message += chalk.dim('Press <enter> to launch your preferred editor.');\n    }\n\n    if (error) {\n      bottomContent = chalk.red('>> ') + error;\n    }\n\n    this.screen.render(message, bottomContent);\n  }\n\n  /**\n   * Launch $EDITOR on user press enter\n   */\n\n  startExternalEditor() {\n    // Pause Readline to prevent stdin and stdout from being modified while the editor is showing\n    this.rl.pause();\n    editAsync(this.currentText, this.endExternalEditor.bind(this));\n  }\n\n  endExternalEditor(error, result) {\n    this.rl.resume();\n    if (error) {\n      this.editorResult.error(error);\n    } else {\n      this.editorResult.next(result);\n    }\n  }\n\n  onEnd(state) {\n    this.editorResult.unsubscribe();\n    this.lineSubscription.unsubscribe();\n    this.answer = state.value;\n    this.status = 'answered';\n    // Re-render prompt\n    this.render();\n    this.screen.done();\n    this.done(this.answer);\n  }\n\n  onError(state) {\n    this.render(state.isValid);\n  }\n}\n\nmodule.exports = EditorPrompt;\n\n\n/***/ }),\n/* 690 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * `rawlist` type prompt\n */\n\nvar _ = __webpack_require__(38);\nvar chalk = __webpack_require__(27);\nvar { map, takeUntil } = __webpack_require__(63);\nvar Base = __webpack_require__(79);\nvar Separator = __webpack_require__(176);\nvar observe = __webpack_require__(80);\nvar Paginator = __webpack_require__(177);\n\nclass ExpandPrompt extends Base {\n  constructor(questions, rl, answers) {\n    super(questions, rl, answers);\n\n    if (!this.opt.choices) {\n      this.throwParamError('choices');\n    }\n\n    this.validateChoices(this.opt.choices);\n\n    // Add the default `help` (/expand) option\n    this.opt.choices.push({\n      key: 'h',\n      name: 'Help, list all options',\n      value: 'help'\n    });\n\n    this.opt.validate = choice => {\n      if (choice == null) {\n        return 'Please enter a valid command';\n      }\n\n      return choice !== 'help';\n    };\n\n    // Setup the default string (capitalize the default key)\n    this.opt.default = this.generateChoicesString(this.opt.choices, this.opt.default);\n\n    this.paginator = new Paginator(this.screen);\n  }\n\n  /**\n   * Start the Inquiry session\n   * @param  {Function} cb      Callback when prompt is done\n   * @return {this}\n   */\n\n  _run(cb) {\n    this.done = cb;\n\n    // Save user answer and update prompt to show selected option.\n    var events = observe(this.rl);\n    var validation = this.handleSubmitEvents(\n      events.line.pipe(map(this.getCurrentValue.bind(this)))\n    );\n    validation.success.forEach(this.onSubmit.bind(this));\n    validation.error.forEach(this.onError.bind(this));\n    this.keypressObs = events.keypress\n      .pipe(takeUntil(validation.success))\n      .forEach(this.onKeypress.bind(this));\n\n    // Init the prompt\n    this.render();\n\n    return this;\n  }\n\n  /**\n   * Render the prompt to screen\n   * @return {ExpandPrompt} self\n   */\n\n  render(error, hint) {\n    var message = this.getQuestion();\n    var bottomContent = '';\n\n    if (this.status === 'answered') {\n      message += chalk.cyan(this.answer);\n    } else if (this.status === 'expanded') {\n      var choicesStr = renderChoices(this.opt.choices, this.selectedKey);\n      message += this.paginator.paginate(choicesStr, this.selectedKey, this.opt.pageSize);\n      message += '\\n  Answer: ';\n    }\n\n    message += this.rl.line;\n\n    if (error) {\n      bottomContent = chalk.red('>> ') + error;\n    }\n\n    if (hint) {\n      bottomContent = chalk.cyan('>> ') + hint;\n    }\n\n    this.screen.render(message, bottomContent);\n  }\n\n  getCurrentValue(input) {\n    if (!input) {\n      input = this.rawDefault;\n    }\n    var selected = this.opt.choices.where({ key: input.toLowerCase().trim() })[0];\n    if (!selected) {\n      return null;\n    }\n\n    return selected.value;\n  }\n\n  /**\n   * Generate the prompt choices string\n   * @return {String}  Choices string\n   */\n\n  getChoices() {\n    var output = '';\n\n    this.opt.choices.forEach(choice => {\n      output += '\\n  ';\n\n      if (choice.type === 'separator') {\n        output += ' ' + choice;\n        return;\n      }\n\n      var choiceStr = choice.key + ') ' + choice.name;\n      if (this.selectedKey === choice.key) {\n        choiceStr = chalk.cyan(choiceStr);\n      }\n      output += choiceStr;\n    });\n\n    return output;\n  }\n\n  onError(state) {\n    if (state.value === 'help') {\n      this.selectedKey = '';\n      this.status = 'expanded';\n      this.render();\n      return;\n    }\n    this.render(state.isValid);\n  }\n\n  /**\n   * When user press `enter` key\n   */\n\n  onSubmit(state) {\n    this.status = 'answered';\n    var choice = this.opt.choices.where({ value: state.value })[0];\n    this.answer = choice.short || choice.name;\n\n    // Re-render prompt\n    this.render();\n    this.screen.done();\n    this.done(state.value);\n  }\n\n  /**\n   * When user press a key\n   */\n\n  onKeypress() {\n    this.selectedKey = this.rl.line.toLowerCase();\n    var selected = this.opt.choices.where({ key: this.selectedKey })[0];\n    if (this.status === 'expanded') {\n      this.render();\n    } else {\n      this.render(null, selected ? selected.name : null);\n    }\n  }\n\n  /**\n   * Validate the choices\n   * @param {Array} choices\n   */\n\n  validateChoices(choices) {\n    var formatError;\n    var errors = [];\n    var keymap = {};\n    choices.filter(Separator.exclude).forEach(choice => {\n      if (!choice.key || choice.key.length !== 1) {\n        formatError = true;\n      }\n      if (keymap[choice.key]) {\n        errors.push(choice.key);\n      }\n      keymap[choice.key] = true;\n      choice.key = String(choice.key).toLowerCase();\n    });\n\n    if (formatError) {\n      throw new Error(\n        'Format error: `key` param must be a single letter and is required.'\n      );\n    }\n    if (keymap.h) {\n      throw new Error(\n        'Reserved key error: `key` param cannot be `h` - this value is reserved.'\n      );\n    }\n    if (errors.length) {\n      throw new Error(\n        'Duplicate key error: `key` param must be unique. Duplicates: ' +\n          _.uniq(errors).join(', ')\n      );\n    }\n  }\n\n  /**\n   * Generate a string out of the choices keys\n   * @param  {Array}  choices\n   * @param  {Number|String} default - the choice index or name to capitalize\n   * @return {String} The rendered choices key string\n   */\n  generateChoicesString(choices, defaultChoice) {\n    var defIndex = choices.realLength - 1;\n    if (_.isNumber(defaultChoice) && this.opt.choices.getChoice(defaultChoice)) {\n      defIndex = defaultChoice;\n    } else if (_.isString(defaultChoice)) {\n      let index = _.findIndex(\n        choices.realChoices,\n        ({ value }) => value === defaultChoice\n      );\n      defIndex = index === -1 ? defIndex : index;\n    }\n    var defStr = this.opt.choices.pluck('key');\n    this.rawDefault = defStr[defIndex];\n    defStr[defIndex] = String(defStr[defIndex]).toUpperCase();\n    return defStr.join('');\n  }\n}\n\n/**\n * Function for rendering checkbox choices\n * @param  {String} pointer Selected key\n * @return {String}         Rendered content\n */\n\nfunction renderChoices(choices, pointer) {\n  var output = '';\n\n  choices.forEach(choice => {\n    output += '\\n  ';\n\n    if (choice.type === 'separator') {\n      output += ' ' + choice;\n      return;\n    }\n\n    var choiceStr = choice.key + ') ' + choice.name;\n    if (pointer === choice.key) {\n      choiceStr = chalk.cyan(choiceStr);\n    }\n    output += choiceStr;\n  });\n\n  return output;\n}\n\nmodule.exports = ExpandPrompt;\n\n\n/***/ }),\n/* 691 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * `list` type prompt\n */\n\nvar _ = __webpack_require__(38);\nvar chalk = __webpack_require__(27);\nvar figures = __webpack_require__(267);\nvar cliCursor = __webpack_require__(375);\nvar runAsync = __webpack_require__(182);\nvar { flatMap, map, take, takeUntil } = __webpack_require__(63);\nvar Base = __webpack_require__(79);\nvar observe = __webpack_require__(80);\nvar Paginator = __webpack_require__(177);\n\nclass ListPrompt extends Base {\n  constructor(questions, rl, answers) {\n    super(questions, rl, answers);\n\n    if (!this.opt.choices) {\n      this.throwParamError('choices');\n    }\n\n    this.firstRender = true;\n    this.selected = 0;\n\n    var def = this.opt.default;\n\n    // If def is a Number, then use as index. Otherwise, check for value.\n    if (_.isNumber(def) && def >= 0 && def < this.opt.choices.realLength) {\n      this.selected = def;\n    } else if (!_.isNumber(def) && def != null) {\n      let index = _.findIndex(this.opt.choices.realChoices, ({ value }) => value === def);\n      this.selected = Math.max(index, 0);\n    }\n\n    // Make sure no default is set (so it won't be printed)\n    this.opt.default = null;\n\n    this.paginator = new Paginator(this.screen);\n  }\n\n  /**\n   * Start the Inquiry session\n   * @param  {Function} cb      Callback when prompt is done\n   * @return {this}\n   */\n\n  _run(cb) {\n    this.done = cb;\n\n    var self = this;\n\n    var events = observe(this.rl);\n    events.normalizedUpKey.pipe(takeUntil(events.line)).forEach(this.onUpKey.bind(this));\n    events.normalizedDownKey\n      .pipe(takeUntil(events.line))\n      .forEach(this.onDownKey.bind(this));\n    events.numberKey.pipe(takeUntil(events.line)).forEach(this.onNumberKey.bind(this));\n    events.line\n      .pipe(\n        take(1),\n        map(this.getCurrentValue.bind(this)),\n        flatMap(value => runAsync(self.opt.filter)(value).catch(err => err))\n      )\n      .forEach(this.onSubmit.bind(this));\n\n    // Init the prompt\n    cliCursor.hide();\n    this.render();\n\n    return this;\n  }\n\n  /**\n   * Render the prompt to screen\n   * @return {ListPrompt} self\n   */\n\n  render() {\n    // Render question\n    var message = this.getQuestion();\n\n    if (this.firstRender) {\n      message += chalk.dim('(Use arrow keys)');\n    }\n\n    // Render choices or answer depending on the state\n    if (this.status === 'answered') {\n      message += chalk.cyan(this.opt.choices.getChoice(this.selected).short);\n    } else {\n      var choicesStr = listRender(this.opt.choices, this.selected);\n      var indexPosition = this.opt.choices.indexOf(\n        this.opt.choices.getChoice(this.selected)\n      );\n      message +=\n        '\\n' + this.paginator.paginate(choicesStr, indexPosition, this.opt.pageSize);\n    }\n\n    this.firstRender = false;\n\n    this.screen.render(message);\n  }\n\n  /**\n   * When user press `enter` key\n   */\n\n  onSubmit(value) {\n    this.status = 'answered';\n\n    // Rerender prompt\n    this.render();\n\n    this.screen.done();\n    cliCursor.show();\n    this.done(value);\n  }\n\n  getCurrentValue() {\n    return this.opt.choices.getChoice(this.selected).value;\n  }\n\n  /**\n   * When user press a key\n   */\n  onUpKey() {\n    var len = this.opt.choices.realLength;\n    this.selected = this.selected > 0 ? this.selected - 1 : len - 1;\n    this.render();\n  }\n\n  onDownKey() {\n    var len = this.opt.choices.realLength;\n    this.selected = this.selected < len - 1 ? this.selected + 1 : 0;\n    this.render();\n  }\n\n  onNumberKey(input) {\n    if (input <= this.opt.choices.realLength) {\n      this.selected = input - 1;\n    }\n    this.render();\n  }\n}\n\n/**\n * Function for rendering list choices\n * @param  {Number} pointer Position of the pointer\n * @return {String}         Rendered content\n */\nfunction listRender(choices, pointer) {\n  var output = '';\n  var separatorOffset = 0;\n\n  choices.forEach((choice, i) => {\n    if (choice.type === 'separator') {\n      separatorOffset++;\n      output += '  ' + choice + '\\n';\n      return;\n    }\n\n    if (choice.disabled) {\n      separatorOffset++;\n      output += '  - ' + choice.name;\n      output += ' (' + (_.isString(choice.disabled) ? choice.disabled : 'Disabled') + ')';\n      output += '\\n';\n      return;\n    }\n\n    var isSelected = i - separatorOffset === pointer;\n    var line = (isSelected ? figures.pointer + ' ' : '  ') + choice.name;\n    if (isSelected) {\n      line = chalk.cyan(line);\n    }\n    output += line + ' \\n';\n  });\n\n  return output.replace(/\\n$/, '');\n}\n\nmodule.exports = ListPrompt;\n\n\n/***/ }),\n/* 692 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * `input` type prompt\n */\n\nvar Input = __webpack_require__(392);\n\n/**\n * Extention of the Input prompt specifically for use with number inputs.\n */\n\nclass NumberPrompt extends Input {\n  filterInput(input) {\n    if (input && typeof input === 'string') {\n      input = input.trim();\n      // Match a number in the input\n      let numberMatch = input.match(/(^-?\\d+|^\\d+\\.\\d*|^\\d*\\.\\d+)(e\\d+)?$/);\n      // If a number is found, return that input.\n      if (numberMatch) {\n        return Number(numberMatch[0]);\n      }\n    }\n    // If the input was invalid return the default value.\n    return this.opt.default == null ? NaN : this.opt.default;\n  }\n}\n\nmodule.exports = NumberPrompt;\n\n\n/***/ }),\n/* 693 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * `password` type prompt\n */\n\nvar chalk = __webpack_require__(27);\nvar { map, takeUntil } = __webpack_require__(63);\nvar Base = __webpack_require__(79);\nvar observe = __webpack_require__(80);\n\nfunction mask(input, maskChar) {\n  input = String(input);\n  maskChar = typeof maskChar === 'string' ? maskChar : '*';\n  if (input.length === 0) {\n    return '';\n  }\n\n  return new Array(input.length + 1).join(maskChar);\n}\n\nclass PasswordPrompt extends Base {\n  /**\n   * Start the Inquiry session\n   * @param  {Function} cb      Callback when prompt is done\n   * @return {this}\n   */\n\n  _run(cb) {\n    this.done = cb;\n\n    var events = observe(this.rl);\n\n    // Once user confirm (enter key)\n    var submit = events.line.pipe(map(this.filterInput.bind(this)));\n\n    var validation = this.handleSubmitEvents(submit);\n    validation.success.forEach(this.onEnd.bind(this));\n    validation.error.forEach(this.onError.bind(this));\n\n    if (this.opt.mask) {\n      events.keypress\n        .pipe(takeUntil(validation.success))\n        .forEach(this.onKeypress.bind(this));\n    }\n\n    // Init\n    this.render();\n\n    return this;\n  }\n\n  /**\n   * Render the prompt to screen\n   * @return {PasswordPrompt} self\n   */\n\n  render(error) {\n    var message = this.getQuestion();\n    var bottomContent = '';\n\n    if (this.status === 'answered') {\n      message += this.opt.mask\n        ? chalk.cyan(mask(this.answer, this.opt.mask))\n        : chalk.italic.dim('[hidden]');\n    } else if (this.opt.mask) {\n      message += mask(this.rl.line || '', this.opt.mask);\n    } else {\n      message += chalk.italic.dim('[input is hidden] ');\n    }\n\n    if (error) {\n      bottomContent = '\\n' + chalk.red('>> ') + error;\n    }\n\n    this.screen.render(message, bottomContent);\n  }\n\n  /**\n   * When user press `enter` key\n   */\n\n  filterInput(input) {\n    if (!input) {\n      return this.opt.default == null ? '' : this.opt.default;\n    }\n    return input;\n  }\n\n  onEnd(state) {\n    this.status = 'answered';\n    this.answer = state.value;\n\n    // Re-render prompt\n    this.render();\n\n    this.screen.done();\n    this.done(state.value);\n  }\n\n  onError(state) {\n    this.render(state.isValid);\n  }\n\n  onKeypress() {\n    this.render();\n  }\n}\n\nmodule.exports = PasswordPrompt;\n\n\n/***/ }),\n/* 694 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * `rawlist` type prompt\n */\n\nvar _ = __webpack_require__(38);\nvar chalk = __webpack_require__(27);\nvar { map, takeUntil } = __webpack_require__(63);\nvar Base = __webpack_require__(79);\nvar Separator = __webpack_require__(176);\nvar observe = __webpack_require__(80);\nvar Paginator = __webpack_require__(177);\n\nclass RawListPrompt extends Base {\n  constructor(questions, rl, answers) {\n    super(questions, rl, answers);\n\n    if (!this.opt.choices) {\n      this.throwParamError('choices');\n    }\n\n    this.opt.validChoices = this.opt.choices.filter(Separator.exclude);\n\n    this.selected = 0;\n    this.rawDefault = 0;\n\n    _.extend(this.opt, {\n      validate: function(val) {\n        return val != null;\n      }\n    });\n\n    var def = this.opt.default;\n    if (_.isNumber(def) && def >= 0 && def < this.opt.choices.realLength) {\n      this.selected = def;\n      this.rawDefault = def;\n    } else if (!_.isNumber(def) && def != null) {\n      let index = _.findIndex(this.opt.choices.realChoices, ({ value }) => value === def);\n      let safeIndex = Math.max(index, 0);\n      this.selected = safeIndex;\n      this.rawDefault = safeIndex;\n    }\n\n    // Make sure no default is set (so it won't be printed)\n    this.opt.default = null;\n\n    this.paginator = new Paginator();\n  }\n\n  /**\n   * Start the Inquiry session\n   * @param  {Function} cb      Callback when prompt is done\n   * @return {this}\n   */\n\n  _run(cb) {\n    this.done = cb;\n\n    // Once user confirm (enter key)\n    var events = observe(this.rl);\n    var submit = events.line.pipe(map(this.getCurrentValue.bind(this)));\n\n    var validation = this.handleSubmitEvents(submit);\n    validation.success.forEach(this.onEnd.bind(this));\n    validation.error.forEach(this.onError.bind(this));\n\n    events.keypress\n      .pipe(takeUntil(validation.success))\n      .forEach(this.onKeypress.bind(this));\n\n    // Init the prompt\n    this.render();\n\n    return this;\n  }\n\n  /**\n   * Render the prompt to screen\n   * @return {RawListPrompt} self\n   */\n\n  render(error) {\n    // Render question\n    var message = this.getQuestion();\n    var bottomContent = '';\n\n    if (this.status === 'answered') {\n      message += chalk.cyan(this.answer);\n    } else {\n      var choicesStr = renderChoices(this.opt.choices, this.selected);\n      message += this.paginator.paginate(choicesStr, this.selected, this.opt.pageSize);\n      message += '\\n  Answer: ';\n    }\n\n    message += this.rl.line;\n\n    if (error) {\n      bottomContent = '\\n' + chalk.red('>> ') + error;\n    }\n\n    this.screen.render(message, bottomContent);\n  }\n\n  /**\n   * When user press `enter` key\n   */\n\n  getCurrentValue(index) {\n    if (index == null || index === '') {\n      index = this.rawDefault;\n    } else {\n      index -= 1;\n    }\n\n    var choice = this.opt.choices.getChoice(index);\n    return choice ? choice.value : null;\n  }\n\n  onEnd(state) {\n    this.status = 'answered';\n    this.answer = state.value;\n\n    // Re-render prompt\n    this.render();\n\n    this.screen.done();\n    this.done(state.value);\n  }\n\n  onError() {\n    this.render('Please enter a valid index');\n  }\n\n  /**\n   * When user press a key\n   */\n\n  onKeypress() {\n    var index = this.rl.line.length ? Number(this.rl.line) - 1 : 0;\n\n    if (this.opt.choices.getChoice(index)) {\n      this.selected = index;\n    } else {\n      this.selected = undefined;\n    }\n\n    this.render();\n  }\n}\n\n/**\n * Function for rendering list choices\n * @param  {Number} pointer Position of the pointer\n * @return {String}         Rendered content\n */\n\nfunction renderChoices(choices, pointer) {\n  var output = '';\n  var separatorOffset = 0;\n\n  choices.forEach(function(choice, i) {\n    output += '\\n  ';\n\n    if (choice.type === 'separator') {\n      separatorOffset++;\n      output += ' ' + choice;\n      return;\n    }\n\n    var index = i - separatorOffset;\n    var display = index + 1 + ') ' + choice.name;\n    if (index === pointer) {\n      display = chalk.cyan(display);\n    }\n    output += display;\n  });\n\n  return output;\n}\n\nmodule.exports = RawListPrompt;\n\n\n/***/ }),\n/* 695 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/**\n * Sticky bottom bar user interface\n */\n\nvar through = __webpack_require__(953);\nvar Base = __webpack_require__(393);\nvar rlUtils = __webpack_require__(394);\nvar _ = __webpack_require__(38);\n\nclass BottomBar extends Base {\n  constructor(opt) {\n    opt = opt || {};\n\n    super(opt);\n\n    this.log = through(this.writeLog.bind(this));\n    this.bottomBar = opt.bottomBar || '';\n    this.render();\n  }\n\n  /**\n   * Render the prompt to screen\n   * @return {BottomBar} self\n   */\n\n  render() {\n    this.write(this.bottomBar);\n    return this;\n  }\n\n  clean() {\n    rlUtils.clearLine(this.rl, this.bottomBar.split('\\n').length);\n    return this;\n  }\n\n  /**\n   * Update the bottom bar content and rerender\n   * @param  {String} bottomBar Bottom bar content\n   * @return {BottomBar}           self\n   */\n\n  updateBottomBar(bottomBar) {\n    rlUtils.clearLine(this.rl, 1);\n    this.rl.output.unmute();\n    this.clean();\n    this.bottomBar = bottomBar;\n    this.render();\n    this.rl.output.mute();\n    return this;\n  }\n\n  /**\n   * Write out log data\n   * @param {String} data - The log data to be output\n   * @return {BottomBar} self\n   */\n\n  writeLog(data) {\n    this.rl.output.unmute();\n    this.clean();\n    this.rl.output.write(this.enforceLF(data.toString()));\n    this.render();\n    this.rl.output.mute();\n    return this;\n  }\n\n  /**\n   * Make sure line end on a line feed\n   * @param  {String} str Input string\n   * @return {String}     The input string with a final line feed\n   */\n\n  enforceLF(str) {\n    return str.match(/[\\r\\n]$/) ? str : str + '\\n';\n  }\n\n  /**\n   * Helper for writing message in Prompt\n   * @param {BottomBar} prompt  - The Prompt object that extends tty\n   * @param {String} message - The message to be output\n   */\n  write(message) {\n    var msgLines = message.split(/\\n/);\n    this.height = msgLines.length;\n\n    // Write message to screen and setPrompt to control backspace\n    this.rl.setPrompt(_.last(msgLines));\n\n    if (this.rl.output.rows === 0 && this.rl.output.columns === 0) {\n      /* When it's a tty through serial port there's no terminal info and the render will malfunction,\n         so we need enforce the cursor to locate to the leftmost position for rendering. */\n      rlUtils.left(this.rl, message.length + this.rl.line.length);\n    }\n    this.rl.output.write(message);\n  }\n}\n\nmodule.exports = BottomBar;\n\n\n/***/ }),\n/* 696 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar _ = __webpack_require__(38);\nvar { defer, empty, from, of } = __webpack_require__(183);\nvar { concatMap, filter, publish, reduce } = __webpack_require__(63);\nvar runAsync = __webpack_require__(182);\nvar utils = __webpack_require__(698);\nvar Base = __webpack_require__(393);\n\n/**\n * Base interface class other can inherits from\n */\n\nclass PromptUI extends Base {\n  constructor(prompts, opt) {\n    super(opt);\n    this.prompts = prompts;\n  }\n\n  run(questions) {\n    // Keep global reference to the answers\n    this.answers = {};\n\n    // Make sure questions is an array.\n    if (_.isPlainObject(questions)) {\n      questions = [questions];\n    }\n\n    // Create an observable, unless we received one as parameter.\n    // Note: As this is a public interface, we cannot do an instanceof check as we won't\n    // be using the exact same object in memory.\n    var obs = _.isArray(questions) ? from(questions) : questions;\n\n    this.process = obs.pipe(\n      concatMap(this.processQuestion.bind(this)),\n      publish() // Creates a hot Observable. It prevents duplicating prompts.\n    );\n\n    this.process.connect();\n\n    return this.process\n      .pipe(\n        reduce((answers, answer) => {\n          _.set(this.answers, answer.name, answer.answer);\n          return this.answers;\n        }, {})\n      )\n      .toPromise(Promise)\n      .then(this.onCompletion.bind(this));\n  }\n\n  /**\n   * Once all prompt are over\n   */\n\n  onCompletion() {\n    this.close();\n\n    return this.answers;\n  }\n\n  processQuestion(question) {\n    question = _.clone(question);\n    return defer(() => {\n      var obs = of(question);\n\n      return obs.pipe(\n        concatMap(this.setDefaultType.bind(this)),\n        concatMap(this.filterIfRunnable.bind(this)),\n        concatMap(() =>\n          utils.fetchAsyncQuestionProperty(question, 'message', this.answers)\n        ),\n        concatMap(() =>\n          utils.fetchAsyncQuestionProperty(question, 'default', this.answers)\n        ),\n        concatMap(() =>\n          utils.fetchAsyncQuestionProperty(question, 'choices', this.answers)\n        ),\n        concatMap(this.fetchAnswer.bind(this))\n      );\n    });\n  }\n\n  fetchAnswer(question) {\n    var Prompt = this.prompts[question.type];\n    this.activePrompt = new Prompt(question, this.rl, this.answers);\n    return defer(() =>\n      from(\n        this.activePrompt.run().then(answer => ({ name: question.name, answer: answer }))\n      )\n    );\n  }\n\n  setDefaultType(question) {\n    // Default type to input\n    if (!this.prompts[question.type]) {\n      question.type = 'input';\n    }\n    return defer(() => of(question));\n  }\n\n  filterIfRunnable(question) {\n    if (question.when === false) {\n      return empty();\n    }\n\n    if (!_.isFunction(question.when)) {\n      return of(question);\n    }\n\n    var answers = this.answers;\n    return defer(() =>\n      from(\n        runAsync(question.when)(answers).then(shouldRun => {\n          if (shouldRun) {\n            return question;\n          }\n        })\n      ).pipe(filter(val => val != null))\n    );\n  }\n}\n\nmodule.exports = PromptUI;\n\n\n/***/ }),\n/* 697 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar _ = __webpack_require__(38);\nvar util = __webpack_require__(394);\nvar cliWidth = __webpack_require__(574);\nvar stripAnsi = __webpack_require__(330);\nvar stringWidth = __webpack_require__(728);\n\nfunction height(content) {\n  return content.split('\\n').length;\n}\n\nfunction lastLine(content) {\n  return _.last(content.split('\\n'));\n}\n\nclass ScreenManager {\n  constructor(rl) {\n    // These variables are keeping information to allow correct prompt re-rendering\n    this.height = 0;\n    this.extraLinesUnderPrompt = 0;\n\n    this.rl = rl;\n  }\n\n  render(content, bottomContent) {\n    this.rl.output.unmute();\n    this.clean(this.extraLinesUnderPrompt);\n\n    /**\n     * Write message to screen and setPrompt to control backspace\n     */\n\n    var promptLine = lastLine(content);\n    var rawPromptLine = stripAnsi(promptLine);\n\n    // Remove the rl.line from our prompt. We can't rely on the content of\n    // rl.line (mainly because of the password prompt), so just rely on it's\n    // length.\n    var prompt = rawPromptLine;\n    if (this.rl.line.length) {\n      prompt = prompt.slice(0, -this.rl.line.length);\n    }\n    this.rl.setPrompt(prompt);\n\n    // SetPrompt will change cursor position, now we can get correct value\n    var cursorPos = this.rl._getCursorPos();\n    var width = this.normalizedCliWidth();\n\n    content = this.forceLineReturn(content, width);\n    if (bottomContent) {\n      bottomContent = this.forceLineReturn(bottomContent, width);\n    }\n    // Manually insert an extra line if we're at the end of the line.\n    // This prevent the cursor from appearing at the beginning of the\n    // current line.\n    if (rawPromptLine.length % width === 0) {\n      content += '\\n';\n    }\n    var fullContent = content + (bottomContent ? '\\n' + bottomContent : '');\n    this.rl.output.write(fullContent);\n\n    /**\n     * Re-adjust the cursor at the correct position.\n     */\n\n    // We need to consider parts of the prompt under the cursor as part of the bottom\n    // content in order to correctly cleanup and re-render.\n    var promptLineUpDiff = Math.floor(rawPromptLine.length / width) - cursorPos.rows;\n    var bottomContentHeight =\n      promptLineUpDiff + (bottomContent ? height(bottomContent) : 0);\n    if (bottomContentHeight > 0) {\n      util.up(this.rl, bottomContentHeight);\n    }\n\n    // Reset cursor at the beginning of the line\n    util.left(this.rl, stringWidth(lastLine(fullContent)));\n\n    // Adjust cursor on the right\n    if (cursorPos.cols > 0) {\n      util.right(this.rl, cursorPos.cols);\n    }\n\n    /**\n     * Set up state for next re-rendering\n     */\n    this.extraLinesUnderPrompt = bottomContentHeight;\n    this.height = height(fullContent);\n\n    this.rl.output.mute();\n  }\n\n  clean(extraLines) {\n    if (extraLines > 0) {\n      util.down(this.rl, extraLines);\n    }\n    util.clearLine(this.rl, this.height);\n  }\n\n  done() {\n    this.rl.setPrompt('');\n    this.rl.output.unmute();\n    this.rl.output.write('\\n');\n  }\n\n  releaseCursor() {\n    if (this.extraLinesUnderPrompt > 0) {\n      util.down(this.rl, this.extraLinesUnderPrompt);\n    }\n  }\n\n  normalizedCliWidth() {\n    var width = cliWidth({\n      defaultWidth: 80,\n      output: this.rl.output\n    });\n    return width;\n  }\n\n  breakLines(lines, width) {\n    // Break lines who're longer than the cli width so we can normalize the natural line\n    // returns behavior across terminals.\n    width = width || this.normalizedCliWidth();\n    var regex = new RegExp('(?:(?:\\\\033[[0-9;]*m)*.?){1,' + width + '}', 'g');\n    return lines.map(line => {\n      var chunk = line.match(regex);\n      // Last match is always empty\n      chunk.pop();\n      return chunk || '';\n    });\n  }\n\n  forceLineReturn(content, width) {\n    width = width || this.normalizedCliWidth();\n    return _.flatten(this.breakLines(content.split('\\n'), width)).join('\\n');\n  }\n}\n\nmodule.exports = ScreenManager;\n\n\n/***/ }),\n/* 698 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar _ = __webpack_require__(38);\nvar { from, of } = __webpack_require__(183);\nvar runAsync = __webpack_require__(182);\n\n/**\n * Resolve a question property value if it is passed as a function.\n * This method will overwrite the property on the question object with the received value.\n * @param  {Object} question - Question object\n * @param  {String} prop     - Property to fetch name\n * @param  {Object} answers  - Answers object\n * @return {Rx.Observable}   - Observable emitting once value is known\n */\n\nexports.fetchAsyncQuestionProperty = function(question, prop, answers) {\n  if (!_.isFunction(question[prop])) {\n    return of(question);\n  }\n\n  return from(\n    runAsync(question[prop])(answers).then(value => {\n      question[prop] = value;\n      return question;\n    })\n  );\n};\n\n\n/***/ }),\n/* 699 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar util = __webpack_require__(3),\n  Match = __webpack_require__ (143);\n\n\n/**\n * This is a superclass for the individual detectors for\n * each of the detectable members of the ISO 2022 family\n * of encodings.\n */\n\nfunction ISO_2022() {}\n\nISO_2022.prototype.match = function(det) {\n\n  /**\n   * Matching function shared among the 2022 detectors JP, CN and KR\n   * Counts up the number of legal an unrecognized escape sequences in\n   * the sample of text, and computes a score based on the total number &\n   * the proportion that fit the encoding.\n   *\n   *\n   * @param text the byte buffer containing text to analyse\n   * @param textLen  the size of the text in the byte.\n   * @param escapeSequences the byte escape sequences to test for.\n   * @return match quality, in the range of 0-100.\n   */\n\n  var i, j;\n  var escN;\n  var hits   = 0;\n  var misses = 0;\n  var shifts = 0;\n  var quality;\n\n  // TODO: refactor me\n  var text = det.fInputBytes;\n  var textLen = det.fInputLen;\n\n  scanInput:\n    for (i = 0; i < textLen; i++) {\n      if (text[i] == 0x1b) {\n        checkEscapes:\n          for (escN = 0; escN < this.escapeSequences.length; escN++) {\n            var seq = this.escapeSequences[escN];\n\n            if ((textLen - i) < seq.length)\n              continue checkEscapes;\n\n            for (j = 1; j < seq.length; j++)\n              if (seq[j] != text[i + j])\n                continue checkEscapes;\n\n\n            hits++;\n            i += seq.length - 1;\n            continue scanInput;\n          }\n\n          misses++;\n      }\n\n      // Shift in/out\n      if (text[i] == 0x0e || text[i] == 0x0f)\n        shifts++;\n\n    }\n\n  if (hits == 0)\n    return null;\n\n  //\n  // Initial quality is based on relative proportion of recongized vs.\n  //   unrecognized escape sequences.\n  //   All good:  quality = 100;\n  //   half or less good: quality = 0;\n  //   linear inbetween.\n  quality = (100 * hits - 100 * misses) / (hits + misses);\n\n  // Back off quality if there were too few escape sequences seen.\n  //   Include shifts in this computation, so that KR does not get penalized\n  //   for having only a single Escape sequence, but many shifts.\n  if (hits + shifts < 5)\n    quality -= (5 - (hits + shifts)) * 10;\n\n  return quality <= 0 ? null : new Match(det, this, quality);\n};\n\nmodule.exports.ISO_2022_JP = function() {\n  this.name = function() {\n    return 'ISO-2022-JP';\n  };\n  this.escapeSequences = [\n    [ 0x1b, 0x24, 0x28, 0x43 ],   // KS X 1001:1992\n    [ 0x1b, 0x24, 0x28, 0x44 ],   // JIS X 212-1990\n    [ 0x1b, 0x24, 0x40 ],         // JIS C 6226-1978\n    [ 0x1b, 0x24, 0x41 ],         // GB 2312-80\n    [ 0x1b, 0x24, 0x42 ],         // JIS X 208-1983\n    [ 0x1b, 0x26, 0x40 ],         // JIS X 208 1990, 1997\n    [ 0x1b, 0x28, 0x42 ],         // ASCII\n    [ 0x1b, 0x28, 0x48 ],         // JIS-Roman\n    [ 0x1b, 0x28, 0x49 ],         // Half-width katakana\n    [ 0x1b, 0x28, 0x4a ],         // JIS-Roman\n    [ 0x1b, 0x2e, 0x41 ],         // ISO 8859-1\n    [ 0x1b, 0x2e, 0x46 ]          // ISO 8859-7\n  ];\n};\nutil.inherits(module.exports.ISO_2022_JP, ISO_2022);\n\n\n\nmodule.exports.ISO_2022_KR = function() {\n  this.name = function() {\n    return 'ISO-2022-KR';\n  };\n  this.escapeSequences = [\n    [ 0x1b, 0x24, 0x29, 0x43 ]\n  ];\n};\nutil.inherits(module.exports.ISO_2022_KR, ISO_2022);\n\n\n\nmodule.exports.ISO_2022_CN = function() {\n  this.name = function() {\n    return 'ISO-2022-CN';\n  };\n  this.escapeSequences = [\n    [ 0x1b, 0x24, 0x29, 0x41 ],   // GB 2312-80\n    [ 0x1b, 0x24, 0x29, 0x47 ],   // CNS 11643-1992 Plane 1\n    [ 0x1b, 0x24, 0x2A, 0x48 ],   // CNS 11643-1992 Plane 2\n    [ 0x1b, 0x24, 0x29, 0x45 ],   // ISO-IR-165\n    [ 0x1b, 0x24, 0x2B, 0x49 ],   // CNS 11643-1992 Plane 3\n    [ 0x1b, 0x24, 0x2B, 0x4A ],   // CNS 11643-1992 Plane 4\n    [ 0x1b, 0x24, 0x2B, 0x4B ],   // CNS 11643-1992 Plane 5\n    [ 0x1b, 0x24, 0x2B, 0x4C ],   // CNS 11643-1992 Plane 6\n    [ 0x1b, 0x24, 0x2B, 0x4D ],   // CNS 11643-1992 Plane 7\n    [ 0x1b, 0x4e ],               // SS2\n    [ 0x1b, 0x4f ]                // SS3\n  ];\n};\nutil.inherits(module.exports.ISO_2022_CN, ISO_2022);\n\n\n/***/ }),\n/* 700 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar util = __webpack_require__(3),\n  Match = __webpack_require__ (143);\n\n/**\n * Binary search implementation (recursive)\n */\nfunction binarySearch(arr, searchValue) {\n  function find(arr, searchValue, left, right) {\n    if (right < left)\n      return -1;\n\n    /*\n    int mid = mid = (left + right) / 2;\n    There is a bug in the above line;\n    Joshua Bloch suggests the following replacement:\n    */\n    var mid = Math.floor((left + right) >>> 1);\n    if (searchValue > arr[mid])\n      return find(arr, searchValue, mid + 1, right);\n\n    if (searchValue < arr[mid])\n      return find(arr, searchValue, left, mid - 1);\n\n    return mid;\n  };\n\n  return find(arr, searchValue, 0, arr.length - 1);\n};\n\n// 'Character'  iterated character class.\n//    Recognizers for specific mbcs encodings make their 'characters' available\n//    by providing a nextChar() function that fills in an instance of iteratedChar\n//    with the next char from the input.\n//    The returned characters are not converted to Unicode, but remain as the raw\n//    bytes (concatenated into an int) from the codepage data.\n//\n//  For Asian charsets, use the raw input rather than the input that has been\n//   stripped of markup.  Detection only considers multi-byte chars, effectively\n//   stripping markup anyway, and double byte chars do occur in markup too.\n//\nfunction IteratedChar() {\n\n  this.charValue = 0; // 1-4 bytes from the raw input data\n  this.index     = 0;\n  this.nextIndex = 0;\n  this.error     = false;\n  this.done      = false;\n\n  this.reset = function() {\n    this.charValue = 0;\n    this.index     = -1;\n    this.nextIndex = 0;\n    this.error     = false;\n    this.done      = false;\n  };\n\n  this.nextByte = function(det) {\n    if (this.nextIndex >= det.fRawLength) {\n      this.done = true;\n      return -1;\n    }\n    var byteValue = det.fRawInput[this.nextIndex++] & 0x00ff;\n    return byteValue;\n  };\n};\n\n\n\n/**\n * Asian double or multi-byte - charsets.\n * Match is determined mostly by the input data adhering to the\n * encoding scheme for the charset, and, optionally,\n * frequency-of-occurence of characters.\n */\n\nfunction mbcs() {};\n\n/**\n * Test the match of this charset with the input text data\n *      which is obtained via the CharsetDetector object.\n *\n * @param det  The CharsetDetector, which contains the input text\n *             to be checked for being in this charset.\n * @return     Two values packed into one int  (Damn java, anyhow)\n *             bits 0-7:  the match confidence, ranging from 0-100\n *             bits 8-15: The match reason, an enum-like value.\n */\nmbcs.prototype.match = function(det) {\n\n  var singleByteCharCount = 0,  //TODO Do we really need this?\n    doubleByteCharCount = 0,\n    commonCharCount     = 0,\n    badCharCount        = 0,\n    totalCharCount      = 0,\n    confidence          = 0;\n\n  var iter = new IteratedChar();\n\n  detectBlock: {\n    for (iter.reset(); this.nextChar(iter, det);) {\n      totalCharCount++;\n      if (iter.error) {\n        badCharCount++;\n      } else {\n        var cv = iter.charValue & 0xFFFFFFFF;\n\n        if (cv <= 0xff) {\n          singleByteCharCount++;\n        } else {\n          doubleByteCharCount++;\n          if (this.commonChars != null) {\n            // NOTE: This assumes that there are no 4-byte common chars.\n            if (binarySearch(this.commonChars, cv) >= 0) {\n              commonCharCount++;\n            }\n          }\n        }\n      }\n      if (badCharCount >= 2 && badCharCount * 5 >= doubleByteCharCount) {\n        // console.log('its here!')\n        // Bail out early if the byte data is not matching the encoding scheme.\n        break detectBlock;\n      }\n    }\n\n    if (doubleByteCharCount <= 10 && badCharCount== 0) {\n      // Not many multi-byte chars.\n      if (doubleByteCharCount == 0 && totalCharCount < 10) {\n        // There weren't any multibyte sequences, and there was a low density of non-ASCII single bytes.\n        // We don't have enough data to have any confidence.\n        // Statistical analysis of single byte non-ASCII charcters would probably help here.\n        confidence = 0;\n      }\n      else {\n        //   ASCII or ISO file?  It's probably not our encoding,\n        //   but is not incompatible with our encoding, so don't give it a zero.\n        confidence = 10;\n      }\n      break detectBlock;\n    }\n\n    //\n    //  No match if there are too many characters that don't fit the encoding scheme.\n    //    (should we have zero tolerance for these?)\n    //\n    if (doubleByteCharCount < 20 * badCharCount) {\n      confidence = 0;\n      break detectBlock;\n    }\n\n    if (this.commonChars == null) {\n      // We have no statistics on frequently occuring characters.\n      //  Assess confidence purely on having a reasonable number of\n      //  multi-byte characters (the more the better\n      confidence = 30 + doubleByteCharCount - 20 * badCharCount;\n      if (confidence > 100) {\n        confidence = 100;\n      }\n    } else {\n      //\n      // Frequency of occurence statistics exist.\n      //\n      var maxVal = Math.log(parseFloat(doubleByteCharCount) / 4);\n      var scaleFactor = 90.0 / maxVal;\n      confidence = Math.floor(Math.log(commonCharCount + 1) * scaleFactor + 10);\n      confidence = Math.min(confidence, 100);\n    }\n  }   // end of detectBlock:\n\n  return confidence == 0 ? null : new Match(det, this, confidence);\n};\n\n/**\n * Get the next character (however many bytes it is) from the input data\n *    Subclasses for specific charset encodings must implement this function\n *    to get characters according to the rules of their encoding scheme.\n *\n *  This function is not a method of class iteratedChar only because\n *   that would require a lot of extra derived classes, which is awkward.\n * @param it  The iteratedChar 'struct' into which the returned char is placed.\n * @param det The charset detector, which is needed to get at the input byte data\n *            being iterated over.\n * @return    True if a character was returned, false at end of input.\n */\n\nmbcs.prototype.nextChar = function(iter, det) {};\n\n\n\n/**\n * Shift-JIS charset recognizer.\n */\nmodule.exports.sjis = function() {\n  this.name = function() {\n    return 'Shift-JIS';\n  };\n  this.language = function() {\n    return 'ja';\n  };\n\n  // TODO:  This set of data comes from the character frequency-\n  //        of-occurence analysis tool.  The data needs to be moved\n  //        into a resource and loaded from there.\n  this.commonChars = [\n    0x8140, 0x8141, 0x8142, 0x8145, 0x815b, 0x8169, 0x816a, 0x8175, 0x8176, 0x82a0,\n    0x82a2, 0x82a4, 0x82a9, 0x82aa, 0x82ab, 0x82ad, 0x82af, 0x82b1, 0x82b3, 0x82b5,\n    0x82b7, 0x82bd, 0x82be, 0x82c1, 0x82c4, 0x82c5, 0x82c6, 0x82c8, 0x82c9, 0x82cc,\n    0x82cd, 0x82dc, 0x82e0, 0x82e7, 0x82e8, 0x82e9, 0x82ea, 0x82f0, 0x82f1, 0x8341,\n    0x8343, 0x834e, 0x834f, 0x8358, 0x835e, 0x8362, 0x8367, 0x8375, 0x8376, 0x8389,\n    0x838a, 0x838b, 0x838d, 0x8393, 0x8e96, 0x93fa, 0x95aa\n  ];\n\n  this.nextChar = function(iter, det) {\n    iter.index = iter.nextIndex;\n    iter.error = false;\n\n    var firstByte;\n    firstByte = iter.charValue = iter.nextByte(det);\n    if (firstByte < 0)\n      return false;\n\n    if (firstByte <= 0x7f || (firstByte > 0xa0 && firstByte <= 0xdf))\n      return true;\n\n    var secondByte = iter.nextByte(det);\n    if (secondByte < 0)\n      return false;\n\n    iter.charValue = (firstByte << 8) | secondByte;\n    if (! ((secondByte >= 0x40 && secondByte <= 0x7f) || (secondByte >= 0x80 && secondByte <= 0xff))) {\n      // Illegal second byte value.\n      iter.error = true;\n    }\n    return true;\n  };\n};\nutil.inherits(module.exports.sjis, mbcs);\n\n\n\n/**\n *   Big5 charset recognizer.\n */\nmodule.exports.big5 = function() {\n  this.name = function() {\n    return 'Big5';\n  };\n  this.language = function() {\n    return 'zh';\n  };\n  // TODO:  This set of data comes from the character frequency-\n  //        of-occurence analysis tool.  The data needs to be moved\n  //        into a resource and loaded from there.\n  this.commonChars = [\n    0xa140, 0xa141, 0xa142, 0xa143, 0xa147, 0xa149, 0xa175, 0xa176, 0xa440, 0xa446,\n    0xa447, 0xa448, 0xa451, 0xa454, 0xa457, 0xa464, 0xa46a, 0xa46c, 0xa477, 0xa4a3,\n    0xa4a4, 0xa4a7, 0xa4c1, 0xa4ce, 0xa4d1, 0xa4df, 0xa4e8, 0xa4fd, 0xa540, 0xa548,\n    0xa558, 0xa569, 0xa5cd, 0xa5e7, 0xa657, 0xa661, 0xa662, 0xa668, 0xa670, 0xa6a8,\n    0xa6b3, 0xa6b9, 0xa6d3, 0xa6db, 0xa6e6, 0xa6f2, 0xa740, 0xa751, 0xa759, 0xa7da,\n    0xa8a3, 0xa8a5, 0xa8ad, 0xa8d1, 0xa8d3, 0xa8e4, 0xa8fc, 0xa9c0, 0xa9d2, 0xa9f3,\n    0xaa6b, 0xaaba, 0xaabe, 0xaacc, 0xaafc, 0xac47, 0xac4f, 0xacb0, 0xacd2, 0xad59,\n    0xaec9, 0xafe0, 0xb0ea, 0xb16f, 0xb2b3, 0xb2c4, 0xb36f, 0xb44c, 0xb44e, 0xb54c,\n    0xb5a5, 0xb5bd, 0xb5d0, 0xb5d8, 0xb671, 0xb7ed, 0xb867, 0xb944, 0xbad8, 0xbb44,\n    0xbba1, 0xbdd1, 0xc2c4, 0xc3b9, 0xc440, 0xc45f\n  ];\n  this.nextChar = function(iter, det) {\n    iter.index = iter.nextIndex;\n    iter.error = false;\n\n    var firstByte = iter.charValue = iter.nextByte(det);\n\n    if (firstByte < 0)\n      return false;\n\n    // single byte character.\n    if (firstByte <= 0x7f || firstByte == 0xff)\n      return true;\n\n    var secondByte = iter.nextByte(det);\n\n    if (secondByte < 0)\n      return false;\n\n    iter.charValue = (iter.charValue << 8) | secondByte;\n\n    if (secondByte < 0x40 || secondByte == 0x7f || secondByte == 0xff)\n      iter.error = true;\n\n    return true;\n  };\n};\nutil.inherits(module.exports.big5, mbcs);\n\n\n\n/**\n *  EUC charset recognizers.  One abstract class that provides the common function\n *  for getting the next character according to the EUC encoding scheme,\n *  and nested derived classes for EUC_KR, EUC_JP, EUC_CN.\n *\n *  Get the next character value for EUC based encodings.\n *  Character 'value' is simply the raw bytes that make up the character\n *     packed into an int.\n */\nfunction eucNextChar(iter, det) {\n  iter.index = iter.nextIndex;\n  iter.error = false;\n  var firstByte  = 0;\n  var secondByte = 0;\n  var thirdByte  = 0;\n  //int fourthByte = 0;\n  buildChar: {\n    firstByte = iter.charValue = iter.nextByte(det);\n    if (firstByte < 0) {\n      // Ran off the end of the input data\n      iter.done = true;\n      break buildChar;\n    }\n    if (firstByte <= 0x8d) {\n      // single byte char\n      break buildChar;\n    }\n    secondByte = iter.nextByte(det);\n    iter.charValue = (iter.charValue << 8) | secondByte;\n    if (firstByte >= 0xA1 && firstByte <= 0xfe) {\n      // Two byte Char\n      if (secondByte < 0xa1) {\n        iter.error = true;\n      }\n      break buildChar;\n    }\n    if (firstByte == 0x8e) {\n      // Code Set 2.\n      //   In EUC-JP, total char size is 2 bytes, only one byte of actual char value.\n      //   In EUC-TW, total char size is 4 bytes, three bytes contribute to char value.\n      // We don't know which we've got.\n      // Treat it like EUC-JP.  If the data really was EUC-TW, the following two\n      //   bytes will look like a well formed 2 byte char.\n      if (secondByte < 0xa1) {\n        iter.error = true;\n      }\n      break buildChar;\n    }\n    if (firstByte == 0x8f) {\n      // Code set 3.\n      // Three byte total char size, two bytes of actual char value.\n      thirdByte = iter.nextByte(det);\n      iter.charValue = (iter.charValue << 8) | thirdByte;\n      if (thirdByte < 0xa1) {\n        iter.error = true;\n      }\n    }\n  }\n  return iter.done == false;\n};\n\n\n\n/**\n * The charset recognize for EUC-JP.  A singleton instance of this class\n *    is created and kept by the public CharsetDetector class\n */\nmodule.exports.euc_jp = function() {\n  this.name = function() {\n    return 'EUC-JP';\n  };\n  this.language = function() {\n    return 'ja';\n  };\n\n  // TODO:  This set of data comes from the character frequency-\n  //        of-occurence analysis tool.  The data needs to be moved\n  //        into a resource and loaded from there.\n  this.commonChars = [\n    0xa1a1, 0xa1a2, 0xa1a3, 0xa1a6, 0xa1bc, 0xa1ca, 0xa1cb, 0xa1d6, 0xa1d7, 0xa4a2,\n    0xa4a4, 0xa4a6, 0xa4a8, 0xa4aa, 0xa4ab, 0xa4ac, 0xa4ad, 0xa4af, 0xa4b1, 0xa4b3,\n    0xa4b5, 0xa4b7, 0xa4b9, 0xa4bb, 0xa4bd, 0xa4bf, 0xa4c0, 0xa4c1, 0xa4c3, 0xa4c4,\n    0xa4c6, 0xa4c7, 0xa4c8, 0xa4c9, 0xa4ca, 0xa4cb, 0xa4ce, 0xa4cf, 0xa4d0, 0xa4de,\n    0xa4df, 0xa4e1, 0xa4e2, 0xa4e4, 0xa4e8, 0xa4e9, 0xa4ea, 0xa4eb, 0xa4ec, 0xa4ef,\n    0xa4f2, 0xa4f3, 0xa5a2, 0xa5a3, 0xa5a4, 0xa5a6, 0xa5a7, 0xa5aa, 0xa5ad, 0xa5af,\n    0xa5b0, 0xa5b3, 0xa5b5, 0xa5b7, 0xa5b8, 0xa5b9, 0xa5bf, 0xa5c3, 0xa5c6, 0xa5c7,\n    0xa5c8, 0xa5c9, 0xa5cb, 0xa5d0, 0xa5d5, 0xa5d6, 0xa5d7, 0xa5de, 0xa5e0, 0xa5e1,\n    0xa5e5, 0xa5e9, 0xa5ea, 0xa5eb, 0xa5ec, 0xa5ed, 0xa5f3, 0xb8a9, 0xb9d4, 0xbaee,\n    0xbbc8, 0xbef0, 0xbfb7, 0xc4ea, 0xc6fc, 0xc7bd, 0xcab8, 0xcaf3, 0xcbdc, 0xcdd1\n  ];\n\n  this.nextChar = eucNextChar;\n};\nutil.inherits(module.exports.euc_jp, mbcs);\n\n\n\n/**\n * The charset recognize for EUC-KR.  A singleton instance of this class\n *    is created and kept by the public CharsetDetector class\n */\nmodule.exports.euc_kr = function() {\n  this.name = function() {\n    return 'EUC-KR';\n  };\n  this.language = function() {\n    return 'ko';\n  };\n\n  // TODO:  This set of data comes from the character frequency-\n  //        of-occurence analysis tool.  The data needs to be moved\n  //        into a resource and loaded from there.\n  this.commonChars = [\n    0xb0a1, 0xb0b3, 0xb0c5, 0xb0cd, 0xb0d4, 0xb0e6, 0xb0ed, 0xb0f8, 0xb0fa, 0xb0fc,\n    0xb1b8, 0xb1b9, 0xb1c7, 0xb1d7, 0xb1e2, 0xb3aa, 0xb3bb, 0xb4c2, 0xb4cf, 0xb4d9,\n    0xb4eb, 0xb5a5, 0xb5b5, 0xb5bf, 0xb5c7, 0xb5e9, 0xb6f3, 0xb7af, 0xb7c2, 0xb7ce,\n    0xb8a6, 0xb8ae, 0xb8b6, 0xb8b8, 0xb8bb, 0xb8e9, 0xb9ab, 0xb9ae, 0xb9cc, 0xb9ce,\n    0xb9fd, 0xbab8, 0xbace, 0xbad0, 0xbaf1, 0xbbe7, 0xbbf3, 0xbbfd, 0xbcad, 0xbcba,\n    0xbcd2, 0xbcf6, 0xbdba, 0xbdc0, 0xbdc3, 0xbdc5, 0xbec6, 0xbec8, 0xbedf, 0xbeee,\n    0xbef8, 0xbefa, 0xbfa1, 0xbfa9, 0xbfc0, 0xbfe4, 0xbfeb, 0xbfec, 0xbff8, 0xc0a7,\n    0xc0af, 0xc0b8, 0xc0ba, 0xc0bb, 0xc0bd, 0xc0c7, 0xc0cc, 0xc0ce, 0xc0cf, 0xc0d6,\n    0xc0da, 0xc0e5, 0xc0fb, 0xc0fc, 0xc1a4, 0xc1a6, 0xc1b6, 0xc1d6, 0xc1df, 0xc1f6,\n    0xc1f8, 0xc4a1, 0xc5cd, 0xc6ae, 0xc7cf, 0xc7d1, 0xc7d2, 0xc7d8, 0xc7e5, 0xc8ad\n  ];\n\n  this.nextChar = eucNextChar;\n};\nutil.inherits(module.exports.euc_kr, mbcs);\n\n\n\n/**\n *   GB-18030 recognizer. Uses simplified Chinese statistics.\n */\nmodule.exports.gb_18030 = function() {\n  this.name = function() {\n    return 'GB18030';\n  };\n  this.language = function() {\n    return 'zh';\n  };\n\n  /*\n   *  Get the next character value for EUC based encodings.\n   *  Character 'value' is simply the raw bytes that make up the character\n   *     packed into an int.\n   */\n  this.nextChar = function(iter, det) {\n    iter.index = iter.nextIndex;\n    iter.error = false;\n    var firstByte  = 0;\n    var secondByte = 0;\n    var thirdByte  = 0;\n    var fourthByte = 0;\n    buildChar: {\n      firstByte = iter.charValue = iter.nextByte(det);\n      if (firstByte < 0) {\n        // Ran off the end of the input data\n        iter.done = true;\n        break buildChar;\n      }\n      if (firstByte <= 0x80) {\n        // single byte char\n        break buildChar;\n      }\n      secondByte = iter.nextByte(det);\n      iter.charValue = (iter.charValue << 8) | secondByte;\n      if (firstByte >= 0x81 && firstByte <= 0xFE) {\n        // Two byte Char\n        if ((secondByte >= 0x40 && secondByte <= 0x7E) || (secondByte >=80 && secondByte <= 0xFE)) {\n          break buildChar;\n        }\n        // Four byte char\n        if (secondByte >= 0x30 && secondByte <= 0x39) {\n          thirdByte = iter.nextByte(det);\n          if (thirdByte >= 0x81 && thirdByte <= 0xFE) {\n            fourthByte = iter.nextByte(det);\n            if (fourthByte >= 0x30 && fourthByte <= 0x39) {\n              iter.charValue = (iter.charValue << 16) | (thirdByte << 8) | fourthByte;\n              break buildChar;\n            }\n          }\n        }\n        iter.error = true;\n        break buildChar;\n      }\n    }\n    return iter.done == false;\n  };\n\n  // TODO:  This set of data comes from the character frequency-\n  //        of-occurence analysis tool.  The data needs to be moved\n  //        into a resource and loaded from there.\n  this.commonChars = [\n    0xa1a1, 0xa1a2, 0xa1a3, 0xa1a4, 0xa1b0, 0xa1b1, 0xa1f1, 0xa1f3, 0xa3a1, 0xa3ac,\n    0xa3ba, 0xb1a8, 0xb1b8, 0xb1be, 0xb2bb, 0xb3c9, 0xb3f6, 0xb4f3, 0xb5bd, 0xb5c4,\n    0xb5e3, 0xb6af, 0xb6d4, 0xb6e0, 0xb7a2, 0xb7a8, 0xb7bd, 0xb7d6, 0xb7dd, 0xb8b4,\n    0xb8df, 0xb8f6, 0xb9ab, 0xb9c9, 0xb9d8, 0xb9fa, 0xb9fd, 0xbacd, 0xbba7, 0xbbd6,\n    0xbbe1, 0xbbfa, 0xbcbc, 0xbcdb, 0xbcfe, 0xbdcc, 0xbecd, 0xbedd, 0xbfb4, 0xbfc6,\n    0xbfc9, 0xc0b4, 0xc0ed, 0xc1cb, 0xc2db, 0xc3c7, 0xc4dc, 0xc4ea, 0xc5cc, 0xc6f7,\n    0xc7f8, 0xc8ab, 0xc8cb, 0xc8d5, 0xc8e7, 0xc9cf, 0xc9fa, 0xcab1, 0xcab5, 0xcac7,\n    0xcad0, 0xcad6, 0xcaf5, 0xcafd, 0xccec, 0xcdf8, 0xceaa, 0xcec4, 0xced2, 0xcee5,\n    0xcfb5, 0xcfc2, 0xcfd6, 0xd0c2, 0xd0c5, 0xd0d0, 0xd0d4, 0xd1a7, 0xd2aa, 0xd2b2,\n    0xd2b5, 0xd2bb, 0xd2d4, 0xd3c3, 0xd3d0, 0xd3fd, 0xd4c2, 0xd4da, 0xd5e2, 0xd6d0\n  ];\n};\nutil.inherits(module.exports.gb_18030, mbcs);\n\n\n/***/ }),\n/* 701 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar util = __webpack_require__(3),\n  Match = __webpack_require__ (143);\n\n/**\n * This class recognizes single-byte encodings. Because the encoding scheme is so\n * simple, language statistics are used to do the matching.\n */\n\nfunction NGramParser(theNgramList, theByteMap) {\n  var N_GRAM_MASK = 0xFFFFFF;\n\n  this.byteIndex = 0;\n  this.ngram = 0;\n\n  this.ngramList = theNgramList;\n  this.byteMap = theByteMap;\n\n  this.ngramCount = 0;\n  this.hitCount = 0;\n\n  this.spaceChar;\n\n  /*\n   * Binary search for value in table, which must have exactly 64 entries.\n   */\n  this.search = function(table, value) {\n    var index = 0;\n\n    if (table[index + 32] <= value) index += 32;\n    if (table[index + 16] <= value) index += 16;\n    if (table[index + 8]  <= value) index += 8;\n    if (table[index + 4]  <= value) index += 4;\n    if (table[index + 2]  <= value) index += 2;\n    if (table[index + 1]  <= value) index += 1;\n    if (table[index]      > value)  index -= 1;\n\n    if (index < 0 || table[index] != value)\n      return -1;\n\n    return index;\n  };\n\n  this.lookup = function(thisNgram) {\n    this.ngramCount += 1;\n    if (this.search(this.ngramList, thisNgram) >= 0) {\n      this.hitCount += 1;\n    }\n  };\n\n  this.addByte = function(b) {\n    this.ngram = ((this.ngram << 8) + (b & 0xFF)) & N_GRAM_MASK;\n    this.lookup(this.ngram);\n  }\n\n  this.nextByte = function(det) {\n    if (this.byteIndex >= det.fInputLen)\n      return -1;\n\n    return det.fInputBytes[this.byteIndex++] & 0xFF;\n  }\n\n  this.parse = function(det, spaceCh) {\n    var b, ignoreSpace = false;\n    this.spaceChar = spaceCh;\n\n    while ((b = this.nextByte(det)) >= 0) {\n      var mb = this.byteMap[b];\n\n      // TODO: 0x20 might not be a space in all character sets...\n      if (mb != 0) {\n        if (!(mb == this.spaceChar && ignoreSpace)) {\n          this.addByte(mb);\n        }\n\n        ignoreSpace = (mb == this.spaceChar);\n      }\n    }\n\n    // TODO: Is this OK? The buffer could have ended in the middle of a word...\n    this.addByte(this.spaceChar);\n\n    var rawPercent = this.hitCount / this.ngramCount;\n\n    // TODO - This is a bit of a hack to take care of a case\n    // were we were getting a confidence of 135...\n    if (rawPercent > 0.33)\n      return 98;\n\n    return Math.floor(rawPercent * 300.0);\n  };\n};\n\nfunction NGramsPlusLang(la, ng) {\n  this.fLang = la;\n  this.fNGrams = ng;\n};\n\nfunction sbcs() {};\nsbcs.prototype.spaceChar = 0x20;\nsbcs.prototype.ngrams = function() {};\nsbcs.prototype.byteMap = function() {};\nsbcs.prototype.match = function(det) {\n\n  var ngrams = this.ngrams();\n  var multiple = (Array.isArray(ngrams) && ngrams[0] instanceof NGramsPlusLang);\n\n  if (!multiple) {\n    var parser = new NGramParser(ngrams, this.byteMap());\n    var confidence = parser.parse(det, this.spaceChar);\n    return confidence <= 0 ? null : new Match(det, this, confidence);\n  }\n\n  var bestConfidenceSoFar = -1;\n  var lang = null;\n\n  for (var i = ngrams.length - 1; i >= 0; i--) {\n    var ngl = ngrams[i];\n\n    var parser = new NGramParser(ngl.fNGrams, this.byteMap());\n    var confidence = parser.parse(det, this.spaceChar);\n    if (confidence > bestConfidenceSoFar) {\n      bestConfidenceSoFar = confidence;\n      lang = ngl.fLang;\n    }\n  }\n\n  var name = this.name(det);\n  return bestConfidenceSoFar <= 0 ? null : new Match(det, this, bestConfidenceSoFar, name, lang);\n};\n\n\nmodule.exports.ISO_8859_1 = function() {\n  this.byteMap = function() {\n    return [\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0xAA, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0xB5, 0x20, 0x20,\n      0x20, 0x20, 0xBA, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0x20,\n      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xDF,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0x20,\n      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF\n    ];\n  };\n\n  this.ngrams = function() {\n    return [\n      new NGramsPlusLang('da', [\n        0x206166, 0x206174, 0x206465, 0x20656E, 0x206572, 0x20666F, 0x206861, 0x206920,\n        0x206D65, 0x206F67, 0x2070E5, 0x207369, 0x207374, 0x207469, 0x207669, 0x616620,\n        0x616E20, 0x616E64, 0x617220, 0x617420, 0x646520, 0x64656E, 0x646572, 0x646574,\n        0x652073, 0x656420, 0x656465, 0x656E20, 0x656E64, 0x657220, 0x657265, 0x657320,\n        0x657420, 0x666F72, 0x676520, 0x67656E, 0x676572, 0x696765, 0x696C20, 0x696E67,\n        0x6B6520, 0x6B6B65, 0x6C6572, 0x6C6967, 0x6C6C65, 0x6D6564, 0x6E6465, 0x6E6520,\n        0x6E6720, 0x6E6765, 0x6F6720, 0x6F6D20, 0x6F7220, 0x70E520, 0x722064, 0x722065,\n        0x722073, 0x726520, 0x737465, 0x742073, 0x746520, 0x746572, 0x74696C, 0x766572\n      ]),\n      new NGramsPlusLang('de', [\n        0x20616E, 0x206175, 0x206265, 0x206461, 0x206465, 0x206469, 0x206569, 0x206765,\n        0x206861, 0x20696E, 0x206D69, 0x207363, 0x207365, 0x20756E, 0x207665, 0x20766F,\n        0x207765, 0x207A75, 0x626572, 0x636820, 0x636865, 0x636874, 0x646173, 0x64656E,\n        0x646572, 0x646965, 0x652064, 0x652073, 0x65696E, 0x656974, 0x656E20, 0x657220,\n        0x657320, 0x67656E, 0x68656E, 0x687420, 0x696368, 0x696520, 0x696E20, 0x696E65,\n        0x697420, 0x6C6963, 0x6C6C65, 0x6E2061, 0x6E2064, 0x6E2073, 0x6E6420, 0x6E6465,\n        0x6E6520, 0x6E6720, 0x6E6765, 0x6E7465, 0x722064, 0x726465, 0x726569, 0x736368,\n        0x737465, 0x742064, 0x746520, 0x74656E, 0x746572, 0x756E64, 0x756E67, 0x766572\n      ]),\n      new NGramsPlusLang('en', [\n        0x206120, 0x20616E, 0x206265, 0x20636F, 0x20666F, 0x206861, 0x206865, 0x20696E,\n        0x206D61, 0x206F66, 0x207072, 0x207265, 0x207361, 0x207374, 0x207468, 0x20746F,\n        0x207768, 0x616964, 0x616C20, 0x616E20, 0x616E64, 0x617320, 0x617420, 0x617465,\n        0x617469, 0x642061, 0x642074, 0x652061, 0x652073, 0x652074, 0x656420, 0x656E74,\n        0x657220, 0x657320, 0x666F72, 0x686174, 0x686520, 0x686572, 0x696420, 0x696E20,\n        0x696E67, 0x696F6E, 0x697320, 0x6E2061, 0x6E2074, 0x6E6420, 0x6E6720, 0x6E7420,\n        0x6F6620, 0x6F6E20, 0x6F7220, 0x726520, 0x727320, 0x732061, 0x732074, 0x736169,\n        0x737420, 0x742074, 0x746572, 0x746861, 0x746865, 0x74696F, 0x746F20, 0x747320\n      ]),\n      new NGramsPlusLang('es', [\n        0x206120, 0x206361, 0x20636F, 0x206465, 0x20656C, 0x20656E, 0x206573, 0x20696E,\n        0x206C61, 0x206C6F, 0x207061, 0x20706F, 0x207072, 0x207175, 0x207265, 0x207365,\n        0x20756E, 0x207920, 0x612063, 0x612064, 0x612065, 0x61206C, 0x612070, 0x616369,\n        0x61646F, 0x616C20, 0x617220, 0x617320, 0x6369F3, 0x636F6E, 0x646520, 0x64656C,\n        0x646F20, 0x652064, 0x652065, 0x65206C, 0x656C20, 0x656E20, 0x656E74, 0x657320,\n        0x657374, 0x69656E, 0x69F36E, 0x6C6120, 0x6C6F73, 0x6E2065, 0x6E7465, 0x6F2064,\n        0x6F2065, 0x6F6E20, 0x6F7220, 0x6F7320, 0x706172, 0x717565, 0x726120, 0x726573,\n        0x732064, 0x732065, 0x732070, 0x736520, 0x746520, 0x746F20, 0x756520, 0xF36E20\n      ]),\n      new NGramsPlusLang('fr', [\n        0x206175, 0x20636F, 0x206461, 0x206465, 0x206475, 0x20656E, 0x206574, 0x206C61,\n        0x206C65, 0x207061, 0x20706F, 0x207072, 0x207175, 0x207365, 0x20736F, 0x20756E,\n        0x20E020, 0x616E74, 0x617469, 0x636520, 0x636F6E, 0x646520, 0x646573, 0x647520,\n        0x652061, 0x652063, 0x652064, 0x652065, 0x65206C, 0x652070, 0x652073, 0x656E20,\n        0x656E74, 0x657220, 0x657320, 0x657420, 0x657572, 0x696F6E, 0x697320, 0x697420,\n        0x6C6120, 0x6C6520, 0x6C6573, 0x6D656E, 0x6E2064, 0x6E6520, 0x6E7320, 0x6E7420,\n        0x6F6E20, 0x6F6E74, 0x6F7572, 0x717565, 0x72206C, 0x726520, 0x732061, 0x732064,\n        0x732065, 0x73206C, 0x732070, 0x742064, 0x746520, 0x74696F, 0x756520, 0x757220\n      ]),\n      new NGramsPlusLang('it', [\n        0x20616C, 0x206368, 0x20636F, 0x206465, 0x206469, 0x206520, 0x20696C, 0x20696E,\n        0x206C61, 0x207065, 0x207072, 0x20756E, 0x612063, 0x612064, 0x612070, 0x612073,\n        0x61746F, 0x636865, 0x636F6E, 0x64656C, 0x646920, 0x652061, 0x652063, 0x652064,\n        0x652069, 0x65206C, 0x652070, 0x652073, 0x656C20, 0x656C6C, 0x656E74, 0x657220,\n        0x686520, 0x692061, 0x692063, 0x692064, 0x692073, 0x696120, 0x696C20, 0x696E20,\n        0x696F6E, 0x6C6120, 0x6C6520, 0x6C6920, 0x6C6C61, 0x6E6520, 0x6E6920, 0x6E6F20,\n        0x6E7465, 0x6F2061, 0x6F2064, 0x6F2069, 0x6F2073, 0x6F6E20, 0x6F6E65, 0x706572,\n        0x726120, 0x726520, 0x736920, 0x746120, 0x746520, 0x746920, 0x746F20, 0x7A696F\n      ]),\n      new NGramsPlusLang('nl', [\n        0x20616C, 0x206265, 0x206461, 0x206465, 0x206469, 0x206565, 0x20656E, 0x206765,\n        0x206865, 0x20696E, 0x206D61, 0x206D65, 0x206F70, 0x207465, 0x207661, 0x207665,\n        0x20766F, 0x207765, 0x207A69, 0x61616E, 0x616172, 0x616E20, 0x616E64, 0x617220,\n        0x617420, 0x636874, 0x646520, 0x64656E, 0x646572, 0x652062, 0x652076, 0x65656E,\n        0x656572, 0x656E20, 0x657220, 0x657273, 0x657420, 0x67656E, 0x686574, 0x696520,\n        0x696E20, 0x696E67, 0x697320, 0x6E2062, 0x6E2064, 0x6E2065, 0x6E2068, 0x6E206F,\n        0x6E2076, 0x6E6465, 0x6E6720, 0x6F6E64, 0x6F6F72, 0x6F7020, 0x6F7220, 0x736368,\n        0x737465, 0x742064, 0x746520, 0x74656E, 0x746572, 0x76616E, 0x766572, 0x766F6F\n      ]),\n      new NGramsPlusLang('no', [\n        0x206174, 0x206176, 0x206465, 0x20656E, 0x206572, 0x20666F, 0x206861, 0x206920,\n        0x206D65, 0x206F67, 0x2070E5, 0x207365, 0x20736B, 0x20736F, 0x207374, 0x207469,\n        0x207669, 0x20E520, 0x616E64, 0x617220, 0x617420, 0x646520, 0x64656E, 0x646574,\n        0x652073, 0x656420, 0x656E20, 0x656E65, 0x657220, 0x657265, 0x657420, 0x657474,\n        0x666F72, 0x67656E, 0x696B6B, 0x696C20, 0x696E67, 0x6B6520, 0x6B6B65, 0x6C6520,\n        0x6C6C65, 0x6D6564, 0x6D656E, 0x6E2073, 0x6E6520, 0x6E6720, 0x6E6765, 0x6E6E65,\n        0x6F6720, 0x6F6D20, 0x6F7220, 0x70E520, 0x722073, 0x726520, 0x736F6D, 0x737465,\n        0x742073, 0x746520, 0x74656E, 0x746572, 0x74696C, 0x747420, 0x747465, 0x766572\n      ]),\n      new NGramsPlusLang('pt', [\n        0x206120, 0x20636F, 0x206461, 0x206465, 0x20646F, 0x206520, 0x206573, 0x206D61,\n        0x206E6F, 0x206F20, 0x207061, 0x20706F, 0x207072, 0x207175, 0x207265, 0x207365,\n        0x20756D, 0x612061, 0x612063, 0x612064, 0x612070, 0x616465, 0x61646F, 0x616C20,\n        0x617220, 0x617261, 0x617320, 0x636F6D, 0x636F6E, 0x646120, 0x646520, 0x646F20,\n        0x646F73, 0x652061, 0x652064, 0x656D20, 0x656E74, 0x657320, 0x657374, 0x696120,\n        0x696361, 0x6D656E, 0x6E7465, 0x6E746F, 0x6F2061, 0x6F2063, 0x6F2064, 0x6F2065,\n        0x6F2070, 0x6F7320, 0x706172, 0x717565, 0x726120, 0x726573, 0x732061, 0x732064,\n        0x732065, 0x732070, 0x737461, 0x746520, 0x746F20, 0x756520, 0xE36F20, 0xE7E36F\n      ]),\n      new NGramsPlusLang('sv', [\n        0x206174, 0x206176, 0x206465, 0x20656E, 0x2066F6, 0x206861, 0x206920, 0x20696E,\n        0x206B6F, 0x206D65, 0x206F63, 0x2070E5, 0x20736B, 0x20736F, 0x207374, 0x207469,\n        0x207661, 0x207669, 0x20E472, 0x616465, 0x616E20, 0x616E64, 0x617220, 0x617474,\n        0x636820, 0x646520, 0x64656E, 0x646572, 0x646574, 0x656420, 0x656E20, 0x657220,\n        0x657420, 0x66F672, 0x67656E, 0x696C6C, 0x696E67, 0x6B6120, 0x6C6C20, 0x6D6564,\n        0x6E2073, 0x6E6120, 0x6E6465, 0x6E6720, 0x6E6765, 0x6E696E, 0x6F6368, 0x6F6D20,\n        0x6F6E20, 0x70E520, 0x722061, 0x722073, 0x726120, 0x736B61, 0x736F6D, 0x742073,\n        0x746120, 0x746520, 0x746572, 0x74696C, 0x747420, 0x766172, 0xE47220, 0xF67220,\n      ])\n    ];\n  };\n\n  this.name = function(det) {\n    return (det && det.fC1Bytes) ? 'windows-1252' : 'ISO-8859-1';\n  };\n};\nutil.inherits(module.exports.ISO_8859_1, sbcs);\n\n\nmodule.exports.ISO_8859_2 = function() {\n  this.byteMap = function() {\n    return [\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0xB1, 0x20, 0xB3, 0x20, 0xB5, 0xB6, 0x20,\n      0x20, 0xB9, 0xBA, 0xBB, 0xBC, 0x20, 0xBE, 0xBF,\n      0x20, 0xB1, 0x20, 0xB3, 0x20, 0xB5, 0xB6, 0xB7,\n      0x20, 0xB9, 0xBA, 0xBB, 0xBC, 0x20, 0xBE, 0xBF,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0x20,\n      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xDF,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0x20,\n      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x20\n    ];\n  }\n\n  this.ngrams = function() {\n    return [\n      new NGramsPlusLang('cs', [\n        0x206120, 0x206279, 0x20646F, 0x206A65, 0x206E61, 0x206E65, 0x206F20, 0x206F64,\n        0x20706F, 0x207072, 0x2070F8, 0x20726F, 0x207365, 0x20736F, 0x207374, 0x20746F,\n        0x207620, 0x207679, 0x207A61, 0x612070, 0x636520, 0x636820, 0x652070, 0x652073,\n        0x652076, 0x656D20, 0x656EED, 0x686F20, 0x686F64, 0x697374, 0x6A6520, 0x6B7465,\n        0x6C6520, 0x6C6920, 0x6E6120, 0x6EE920, 0x6EEC20, 0x6EED20, 0x6F2070, 0x6F646E,\n        0x6F6A69, 0x6F7374, 0x6F7520, 0x6F7661, 0x706F64, 0x706F6A, 0x70726F, 0x70F865,\n        0x736520, 0x736F75, 0x737461, 0x737469, 0x73746E, 0x746572, 0x746EED, 0x746F20,\n        0x752070, 0xBE6520, 0xE16EED, 0xE9686F, 0xED2070, 0xED2073, 0xED6D20, 0xF86564,\n      ]),\n      new NGramsPlusLang('hu', [\n        0x206120, 0x20617A, 0x206265, 0x206567, 0x20656C, 0x206665, 0x206861, 0x20686F,\n        0x206973, 0x206B65, 0x206B69, 0x206BF6, 0x206C65, 0x206D61, 0x206D65, 0x206D69,\n        0x206E65, 0x20737A, 0x207465, 0x20E973, 0x612061, 0x61206B, 0x61206D, 0x612073,\n        0x616B20, 0x616E20, 0x617A20, 0x62616E, 0x62656E, 0x656779, 0x656B20, 0x656C20,\n        0x656C65, 0x656D20, 0x656E20, 0x657265, 0x657420, 0x657465, 0x657474, 0x677920,\n        0x686F67, 0x696E74, 0x697320, 0x6B2061, 0x6BF67A, 0x6D6567, 0x6D696E, 0x6E2061,\n        0x6E616B, 0x6E656B, 0x6E656D, 0x6E7420, 0x6F6779, 0x732061, 0x737A65, 0x737A74,\n        0x737AE1, 0x73E967, 0x742061, 0x747420, 0x74E173, 0x7A6572, 0xE16E20, 0xE97320,\n      ]),\n      new NGramsPlusLang('pl', [\n        0x20637A, 0x20646F, 0x206920, 0x206A65, 0x206B6F, 0x206D61, 0x206D69, 0x206E61,\n        0x206E69, 0x206F64, 0x20706F, 0x207072, 0x207369, 0x207720, 0x207769, 0x207779,\n        0x207A20, 0x207A61, 0x612070, 0x612077, 0x616E69, 0x636820, 0x637A65, 0x637A79,\n        0x646F20, 0x647A69, 0x652070, 0x652073, 0x652077, 0x65207A, 0x65676F, 0x656A20,\n        0x656D20, 0x656E69, 0x676F20, 0x696120, 0x696520, 0x69656A, 0x6B6120, 0x6B6920,\n        0x6B6965, 0x6D6965, 0x6E6120, 0x6E6961, 0x6E6965, 0x6F2070, 0x6F7761, 0x6F7769,\n        0x706F6C, 0x707261, 0x70726F, 0x70727A, 0x727A65, 0x727A79, 0x7369EA, 0x736B69,\n        0x737461, 0x776965, 0x796368, 0x796D20, 0x7A6520, 0x7A6965, 0x7A7920, 0xF37720,\n      ]),\n      new NGramsPlusLang('ro', [\n        0x206120, 0x206163, 0x206361, 0x206365, 0x20636F, 0x206375, 0x206465, 0x206469,\n        0x206C61, 0x206D61, 0x207065, 0x207072, 0x207365, 0x2073E3, 0x20756E, 0x20BA69,\n        0x20EE6E, 0x612063, 0x612064, 0x617265, 0x617420, 0x617465, 0x617520, 0x636172,\n        0x636F6E, 0x637520, 0x63E320, 0x646520, 0x652061, 0x652063, 0x652064, 0x652070,\n        0x652073, 0x656120, 0x656920, 0x656C65, 0x656E74, 0x657374, 0x692061, 0x692063,\n        0x692064, 0x692070, 0x696520, 0x696920, 0x696E20, 0x6C6120, 0x6C6520, 0x6C6F72,\n        0x6C7569, 0x6E6520, 0x6E7472, 0x6F7220, 0x70656E, 0x726520, 0x726561, 0x727520,\n        0x73E320, 0x746520, 0x747275, 0x74E320, 0x756920, 0x756C20, 0xBA6920, 0xEE6E20,\n      ])\n    ];\n  };\n\n  this.name = function(det) {\n    return (det && det.fC1Bytes) ? 'windows-1250' : 'ISO-8859-2';\n  };\n};\nutil.inherits(module.exports.ISO_8859_2, sbcs);\n\n\nmodule.exports.ISO_8859_5 = function() {\n  this.byteMap = function() {\n    return [\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,\n      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0x20, 0xFE, 0xFF,\n      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,\n      0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,\n      0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0x20, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,\n      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0x20, 0xFE, 0xFF\n    ];\n  };\n\n  this.ngrams = function() {\n    return [\n      0x20D220, 0x20D2DE, 0x20D4DE, 0x20D7D0, 0x20D820, 0x20DAD0, 0x20DADE, 0x20DDD0,\n      0x20DDD5, 0x20DED1, 0x20DFDE, 0x20DFE0, 0x20E0D0, 0x20E1DE, 0x20E1E2, 0x20E2DE,\n      0x20E7E2, 0x20EDE2, 0xD0DDD8, 0xD0E2EC, 0xD3DE20, 0xD5DBEC, 0xD5DDD8, 0xD5E1E2,\n      0xD5E220, 0xD820DF, 0xD8D520, 0xD8D820, 0xD8EF20, 0xDBD5DD, 0xDBD820, 0xDBECDD,\n      0xDDD020, 0xDDD520, 0xDDD8D5, 0xDDD8EF, 0xDDDE20, 0xDDDED2, 0xDE20D2, 0xDE20DF,\n      0xDE20E1, 0xDED220, 0xDED2D0, 0xDED3DE, 0xDED920, 0xDEDBEC, 0xDEDC20, 0xDEE1E2,\n      0xDFDEDB, 0xDFE0D5, 0xDFE0D8, 0xDFE0DE, 0xE0D0D2, 0xE0D5D4, 0xE1E2D0, 0xE1E2D2,\n      0xE1E2D8, 0xE1EF20, 0xE2D5DB, 0xE2DE20, 0xE2DEE0, 0xE2EC20, 0xE7E2DE, 0xEBE520\n    ];\n  };\n\n  this.name = function(det) {\n    return 'ISO-8859-5';\n  };\n\n  this.language = function() {\n    return 'ru';\n  };\n};\nutil.inherits(module.exports.ISO_8859_5, sbcs);\n\n\nmodule.exports.ISO_8859_6 = function() {\n  this.byteMap = function() {\n    return [\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,\n      0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,\n      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,\n      0xD8, 0xD9, 0xDA, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20\n    ];\n  };\n\n  this.ngrams = function() {\n    return [\n      0x20C7E4, 0x20C7E6, 0x20C8C7, 0x20D9E4, 0x20E1EA, 0x20E4E4, 0x20E5E6, 0x20E8C7,\n      0xC720C7, 0xC7C120, 0xC7CA20, 0xC7D120, 0xC7E420, 0xC7E4C3, 0xC7E4C7, 0xC7E4C8,\n      0xC7E4CA, 0xC7E4CC, 0xC7E4CD, 0xC7E4CF, 0xC7E4D3, 0xC7E4D9, 0xC7E4E2, 0xC7E4E5,\n      0xC7E4E8, 0xC7E4EA, 0xC7E520, 0xC7E620, 0xC7E6CA, 0xC820C7, 0xC920C7, 0xC920E1,\n      0xC920E4, 0xC920E5, 0xC920E8, 0xCA20C7, 0xCF20C7, 0xCFC920, 0xD120C7, 0xD1C920,\n      0xD320C7, 0xD920C7, 0xD9E4E9, 0xE1EA20, 0xE420C7, 0xE4C920, 0xE4E920, 0xE4EA20,\n      0xE520C7, 0xE5C720, 0xE5C920, 0xE5E620, 0xE620C7, 0xE720C7, 0xE7C720, 0xE8C7E4,\n      0xE8E620, 0xE920C7, 0xEA20C7, 0xEA20E5, 0xEA20E8, 0xEAC920, 0xEAD120, 0xEAE620\n    ];\n  };\n\n  this.name = function(det) {\n    return 'ISO-8859-6';\n  };\n\n  this.language = function() {\n    return 'ar';\n  };\n};\nutil.inherits(module.exports.ISO_8859_6, sbcs);\n\n\nmodule.exports.ISO_8859_7 = function() {\n  this.byteMap = function() {\n    return [\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0xA1, 0xA2, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xDC, 0x20,\n      0xDD, 0xDE, 0xDF, 0x20, 0xFC, 0x20, 0xFD, 0xFE,\n      0xC0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0xF0, 0xF1, 0x20, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,\n      0xF8, 0xF9, 0xFA, 0xFB, 0xDC, 0xDD, 0xDE, 0xDF,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,\n      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0x20\n    ];\n  };\n\n  this.ngrams = function() {\n    return [\n      0x20E1ED, 0x20E1F0, 0x20E3E9, 0x20E4E9, 0x20E5F0, 0x20E720, 0x20EAE1, 0x20ECE5,\n      0x20EDE1, 0x20EF20, 0x20F0E1, 0x20F0EF, 0x20F0F1, 0x20F3F4, 0x20F3F5, 0x20F4E7,\n      0x20F4EF, 0xDFE120, 0xE120E1, 0xE120F4, 0xE1E920, 0xE1ED20, 0xE1F0FC, 0xE1F220,\n      0xE3E9E1, 0xE5E920, 0xE5F220, 0xE720F4, 0xE7ED20, 0xE7F220, 0xE920F4, 0xE9E120,\n      0xE9EADE, 0xE9F220, 0xEAE1E9, 0xEAE1F4, 0xECE520, 0xED20E1, 0xED20E5, 0xED20F0,\n      0xEDE120, 0xEFF220, 0xEFF520, 0xF0EFF5, 0xF0F1EF, 0xF0FC20, 0xF220E1, 0xF220E5,\n      0xF220EA, 0xF220F0, 0xF220F4, 0xF3E520, 0xF3E720, 0xF3F4EF, 0xF4E120, 0xF4E1E9,\n      0xF4E7ED, 0xF4E7F2, 0xF4E9EA, 0xF4EF20, 0xF4EFF5, 0xF4F9ED, 0xF9ED20, 0xFEED20\n    ];\n  };\n\n  this.name = function(det) {\n    return (det && det.fC1Bytes) ? 'windows-1253' : 'ISO-8859-7';\n  };\n\n  this.language = function() {\n    return 'el';\n  };\n};\nutil.inherits(module.exports.ISO_8859_7, sbcs);\n\nmodule.exports.ISO_8859_8 = function() {\n\n  this.byteMap = function() {\n    return [\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0xB5, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,\n      0xF8, 0xF9, 0xFA, 0x20, 0x20, 0x20, 0x20, 0x20\n    ];\n  };\n\n  this.ngrams = function() {\n    return [\n      new NGramsPlusLang('he', [\n        0x20E0E5, 0x20E0E7, 0x20E0E9, 0x20E0FA, 0x20E1E9, 0x20E1EE, 0x20E4E0, 0x20E4E5,\n        0x20E4E9, 0x20E4EE, 0x20E4F2, 0x20E4F9, 0x20E4FA, 0x20ECE0, 0x20ECE4, 0x20EEE0,\n        0x20F2EC, 0x20F9EC, 0xE0FA20, 0xE420E0, 0xE420E1, 0xE420E4, 0xE420EC, 0xE420EE,\n        0xE420F9, 0xE4E5E0, 0xE5E020, 0xE5ED20, 0xE5EF20, 0xE5F820, 0xE5FA20, 0xE920E4,\n        0xE9E420, 0xE9E5FA, 0xE9E9ED, 0xE9ED20, 0xE9EF20, 0xE9F820, 0xE9FA20, 0xEC20E0,\n        0xEC20E4, 0xECE020, 0xECE420, 0xED20E0, 0xED20E1, 0xED20E4, 0xED20EC, 0xED20EE,\n        0xED20F9, 0xEEE420, 0xEF20E4, 0xF0E420, 0xF0E920, 0xF0E9ED, 0xF2EC20, 0xF820E4,\n        0xF8E9ED, 0xF9EC20, 0xFA20E0, 0xFA20E1, 0xFA20E4, 0xFA20EC, 0xFA20EE, 0xFA20F9,\n      ]),\n      new NGramsPlusLang('he', [\n        0x20E0E5, 0x20E0EC, 0x20E4E9, 0x20E4EC, 0x20E4EE, 0x20E4F0, 0x20E9F0, 0x20ECF2,\n        0x20ECF9, 0x20EDE5, 0x20EDE9, 0x20EFE5, 0x20EFE9, 0x20F8E5, 0x20F8E9, 0x20FAE0,\n        0x20FAE5, 0x20FAE9, 0xE020E4, 0xE020EC, 0xE020ED, 0xE020FA, 0xE0E420, 0xE0E5E4,\n        0xE0EC20, 0xE0EE20, 0xE120E4, 0xE120ED, 0xE120FA, 0xE420E4, 0xE420E9, 0xE420EC,\n        0xE420ED, 0xE420EF, 0xE420F8, 0xE420FA, 0xE4EC20, 0xE5E020, 0xE5E420, 0xE7E020,\n        0xE9E020, 0xE9E120, 0xE9E420, 0xEC20E4, 0xEC20ED, 0xEC20FA, 0xECF220, 0xECF920,\n        0xEDE9E9, 0xEDE9F0, 0xEDE9F8, 0xEE20E4, 0xEE20ED, 0xEE20FA, 0xEEE120, 0xEEE420,\n        0xF2E420, 0xF920E4, 0xF920ED, 0xF920FA, 0xF9E420, 0xFAE020, 0xFAE420, 0xFAE5E9,\n      ])\n    ];\n  };\n\n  this.name = function(det) {\n    return (det && det.fC1Bytes) ? 'windows-1255' : 'ISO-8859-8';\n  };\n\n  this.language = function() {\n    return 'he';\n  };\n\n};\nutil.inherits(module.exports.ISO_8859_8, sbcs);\n\n\nmodule.exports.ISO_8859_9 = function() {\n  this.byteMap = function() {\n    return [\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0xAA, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0xB5, 0x20, 0x20,\n      0x20, 0x20, 0xBA, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0x20,\n      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0x69, 0xFE, 0xDF,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0x20,\n      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF\n    ];\n  };\n\n  this.ngrams = function() {\n    return [\n      0x206261, 0x206269, 0x206275, 0x206461, 0x206465, 0x206765, 0x206861, 0x20696C,\n      0x206B61, 0x206B6F, 0x206D61, 0x206F6C, 0x207361, 0x207461, 0x207665, 0x207961,\n      0x612062, 0x616B20, 0x616C61, 0x616D61, 0x616E20, 0x616EFD, 0x617220, 0x617261,\n      0x6172FD, 0x6173FD, 0x617961, 0x626972, 0x646120, 0x646520, 0x646920, 0x652062,\n      0x65206B, 0x656469, 0x656E20, 0x657220, 0x657269, 0x657369, 0x696C65, 0x696E20,\n      0x696E69, 0x697220, 0x6C616E, 0x6C6172, 0x6C6520, 0x6C6572, 0x6E2061, 0x6E2062,\n      0x6E206B, 0x6E6461, 0x6E6465, 0x6E6520, 0x6E6920, 0x6E696E, 0x6EFD20, 0x72696E,\n      0x72FD6E, 0x766520, 0x796120, 0x796F72, 0xFD6E20, 0xFD6E64, 0xFD6EFD, 0xFDF0FD\n    ];\n  };\n\n  this.name = function(det) {\n    return (det && det.fC1Bytes) ? 'windows-1254' : 'ISO-8859-9';\n  };\n\n  this.language = function() {\n    return 'tr';\n  };\n};\nutil.inherits(module.exports.ISO_8859_9, sbcs);\n\n\nmodule.exports.windows_1251 = function() {\n  this.byteMap = function() {\n    return [\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x90, 0x83, 0x20, 0x83, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x9A, 0x20, 0x9C, 0x9D, 0x9E, 0x9F,\n      0x90, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x9A, 0x20, 0x9C, 0x9D, 0x9E, 0x9F,\n      0x20, 0xA2, 0xA2, 0xBC, 0x20, 0xB4, 0x20, 0x20,\n      0xB8, 0x20, 0xBA, 0x20, 0x20, 0x20, 0x20, 0xBF,\n      0x20, 0x20, 0xB3, 0xB3, 0xB4, 0xB5, 0x20, 0x20,\n      0xB8, 0x20, 0xBA, 0x20, 0xBC, 0xBE, 0xBE, 0xBF,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,\n      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7,\n      0xF8, 0xF9, 0xFA, 0xFB, 0xFC, 0xFD, 0xFE, 0xFF\n    ];\n  };\n\n  this.ngrams = function() {\n    return [\n      0x20E220, 0x20E2EE, 0x20E4EE, 0x20E7E0, 0x20E820, 0x20EAE0, 0x20EAEE, 0x20EDE0,\n      0x20EDE5, 0x20EEE1, 0x20EFEE, 0x20EFF0, 0x20F0E0, 0x20F1EE, 0x20F1F2, 0x20F2EE,\n      0x20F7F2, 0x20FDF2, 0xE0EDE8, 0xE0F2FC, 0xE3EE20, 0xE5EBFC, 0xE5EDE8, 0xE5F1F2,\n      0xE5F220, 0xE820EF, 0xE8E520, 0xE8E820, 0xE8FF20, 0xEBE5ED, 0xEBE820, 0xEBFCED,\n      0xEDE020, 0xEDE520, 0xEDE8E5, 0xEDE8FF, 0xEDEE20, 0xEDEEE2, 0xEE20E2, 0xEE20EF,\n      0xEE20F1, 0xEEE220, 0xEEE2E0, 0xEEE3EE, 0xEEE920, 0xEEEBFC, 0xEEEC20, 0xEEF1F2,\n      0xEFEEEB, 0xEFF0E5, 0xEFF0E8, 0xEFF0EE, 0xF0E0E2, 0xF0E5E4, 0xF1F2E0, 0xF1F2E2,\n      0xF1F2E8, 0xF1FF20, 0xF2E5EB, 0xF2EE20, 0xF2EEF0, 0xF2FC20, 0xF7F2EE, 0xFBF520\n    ];\n  };\n\n  this.name = function(det) {\n    return 'windows-1251';\n  };\n\n  this.language = function() {\n    return 'ru';\n  };\n};\nutil.inherits(module.exports.windows_1251, sbcs);\n\n\nmodule.exports.windows_1256 = function() {\n  this.byteMap = function() {\n    return [\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x81, 0x20, 0x83, 0x20, 0x20, 0x20, 0x20,\n      0x88, 0x20, 0x8A, 0x20, 0x9C, 0x8D, 0x8E, 0x8F,\n      0x90, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x98, 0x20, 0x9A, 0x20, 0x9C, 0x20, 0x20, 0x9F,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0xAA, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0xB5, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,\n      0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,\n      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0x20,\n      0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,\n      0xE0, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7,\n      0xE8, 0xE9, 0xEA, 0xEB, 0xEC, 0xED, 0xEE, 0xEF,\n      0x20, 0x20, 0x20, 0x20, 0xF4, 0x20, 0x20, 0x20,\n      0x20, 0xF9, 0x20, 0xFB, 0xFC, 0x20, 0x20, 0xFF\n    ];\n  };\n\n  this.ngrams = function() {\n    return [\n      0x20C7E1, 0x20C7E4, 0x20C8C7, 0x20DAE1, 0x20DDED, 0x20E1E1, 0x20E3E4, 0x20E6C7,\n      0xC720C7, 0xC7C120, 0xC7CA20, 0xC7D120, 0xC7E120, 0xC7E1C3, 0xC7E1C7, 0xC7E1C8,\n      0xC7E1CA, 0xC7E1CC, 0xC7E1CD, 0xC7E1CF, 0xC7E1D3, 0xC7E1DA, 0xC7E1DE, 0xC7E1E3,\n      0xC7E1E6, 0xC7E1ED, 0xC7E320, 0xC7E420, 0xC7E4CA, 0xC820C7, 0xC920C7, 0xC920DD,\n      0xC920E1, 0xC920E3, 0xC920E6, 0xCA20C7, 0xCF20C7, 0xCFC920, 0xD120C7, 0xD1C920,\n      0xD320C7, 0xDA20C7, 0xDAE1EC, 0xDDED20, 0xE120C7, 0xE1C920, 0xE1EC20, 0xE1ED20,\n      0xE320C7, 0xE3C720, 0xE3C920, 0xE3E420, 0xE420C7, 0xE520C7, 0xE5C720, 0xE6C7E1,\n      0xE6E420, 0xEC20C7, 0xED20C7, 0xED20E3, 0xED20E6, 0xEDC920, 0xEDD120, 0xEDE420\n    ];\n  };\n\n  this.name = function(det) {\n    return 'windows-1256';\n  };\n\n  this.language = function() {\n    return 'ar';\n  };\n};\nutil.inherits(module.exports.windows_1256, sbcs);\n\n\nmodule.exports.KOI8_R = function() {\n  this.byteMap = function() {\n    return [\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x00,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,\n      0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F,\n      0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,\n      0x78, 0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0xA3, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0xA3, 0x20, 0x20, 0x20, 0x20,\n      0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,\n      0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,\n      0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,\n      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,\n      0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,\n      0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7,\n      0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF,\n      0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7,\n      0xD8, 0xD9, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF\n    ];\n  };\n\n  this.ngrams = function() {\n    return [\n      0x20C4CF, 0x20C920, 0x20CBC1, 0x20CBCF, 0x20CEC1, 0x20CEC5, 0x20CFC2, 0x20D0CF,\n      0x20D0D2, 0x20D2C1, 0x20D3CF, 0x20D3D4, 0x20D4CF, 0x20D720, 0x20D7CF, 0x20DAC1,\n      0x20DCD4, 0x20DED4, 0xC1CEC9, 0xC1D4D8, 0xC5CCD8, 0xC5CEC9, 0xC5D3D4, 0xC5D420,\n      0xC7CF20, 0xC920D0, 0xC9C520, 0xC9C920, 0xC9D120, 0xCCC5CE, 0xCCC920, 0xCCD8CE,\n      0xCEC120, 0xCEC520, 0xCEC9C5, 0xCEC9D1, 0xCECF20, 0xCECFD7, 0xCF20D0, 0xCF20D3,\n      0xCF20D7, 0xCFC7CF, 0xCFCA20, 0xCFCCD8, 0xCFCD20, 0xCFD3D4, 0xCFD720, 0xCFD7C1,\n      0xD0CFCC, 0xD0D2C5, 0xD0D2C9, 0xD0D2CF, 0xD2C1D7, 0xD2C5C4, 0xD3D120, 0xD3D4C1,\n      0xD3D4C9, 0xD3D4D7, 0xD4C5CC, 0xD4CF20, 0xD4CFD2, 0xD4D820, 0xD9C820, 0xDED4CF\n    ];\n  };\n\n  this.name = function(det) {\n    return 'KOI8-R';\n  };\n\n  this.language = function() {\n    return 'ru';\n  };\n};\nutil.inherits(module.exports.KOI8_R, sbcs);\n\n\n/*\nmodule.exports.ISO_8859_7 = function() {\n  this.byteMap = function() {\n    return [\n\n    ];\n  };\n\n  this.ngrams = function() {\n    return [\n\n    ];\n  };\n\n  this.name = function(det) {\n    if (typeof det == 'undefined')\n      return 'ISO-8859-7';\n    return det.fC1Bytes ? 'windows-1253' : 'ISO-8859-7';\n  };\n\n  this.language = function() {\n    return 'el';\n  };\n};\nutil.inherits(module.exports.ISO_8859_7, sbcs);\n*/\n\n\n\n/***/ }),\n/* 702 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar util = __webpack_require__(3),\n  Match = __webpack_require__ (143);\n\n/**\n * This class matches UTF-16 and UTF-32, both big- and little-endian. The\n * BOM will be used if it is present.\n */\nmodule.exports.UTF_16BE = function() {\n  this.name = function() {\n    return 'UTF-16BE';\n  };\n  this.match = function(det) {\n    var input = det.fRawInput;\n\n    if (input.length >= 2 && ((input[0] & 0xff) == 0xfe && (input[1] & 0xff) == 0xff)) {\n      return new Match(det, this, 100); // confidence = 100\n    }\n\n    // TODO: Do some statistics to check for unsigned UTF-16BE\n    return null;\n  };\n};\n\nmodule.exports.UTF_16LE = function() {\n  this.name = function() {\n    return 'UTF-16LE';\n  };\n  this.match = function(det) {\n    var input = det.fRawInput;\n\n    if (input.length >= 2 && ((input[0] & 0xff) == 0xff && (input[1] & 0xff) == 0xfe)) {\n      // LE BOM is present.\n      if (input.length >= 4 && input[2] == 0x00 && input[3] == 0x00) {\n        // It is probably UTF-32 LE, not UTF-16\n        return null;\n      }\n      return new Match(det, this, 100); // confidence = 100\n    }\n\n    // TODO: Do some statistics to check for unsigned UTF-16LE\n    return null;\n  }\n};\n\nfunction UTF_32() {};\nUTF_32.prototype.match = function(det) {\n  var input      = det.fRawInput,\n    limit      = (det.fRawLength / 4) * 4,\n    numValid   = 0,\n    numInvalid = 0,\n    hasBOM     = false,\n    confidence = 0;\n\n  if (limit == 0) {\n    return null;\n  }\n\n  if (this.getChar(input, 0) == 0x0000FEFF) {\n    hasBOM = true;\n  }\n\n  for (var i = 0; i < limit; i += 4) {\n    var ch = this.getChar(input, i);\n\n    if (ch < 0 || ch >= 0x10FFFF || (ch >= 0xD800 && ch <= 0xDFFF)) {\n      numInvalid += 1;\n    } else {\n      numValid += 1;\n    }\n  }\n\n  // Cook up some sort of confidence score, based on presence of a BOM\n  //    and the existence of valid and/or invalid multi-byte sequences.\n  if (hasBOM && numInvalid == 0) {\n    confidence = 100;\n  } else if (hasBOM && numValid > numInvalid * 10) {\n    confidence = 80;\n  } else if (numValid > 3 && numInvalid == 0) {\n    confidence = 100;\n  } else if (numValid > 0 && numInvalid == 0) {\n    confidence = 80;\n  } else if (numValid > numInvalid * 10) {\n    // Probably corrupt UTF-32BE data.  Valid sequences aren't likely by chance.\n    confidence = 25;\n  }\n\n  // return confidence == 0 ? null : new CharsetMatch(det, this, confidence);\n  return confidence == 0 ? null : new Match(det, this, confidence);\n};\n\nmodule.exports.UTF_32BE = function() {\n  this.name = function() {\n    return 'UTF-32BE';\n  };\n  this.getChar = function(input, index) {\n    return (input[index + 0] & 0xff) << 24 | (input[index + 1] & 0xff) << 16 |\n         (input[index + 2] & 0xff) <<  8 | (input[index + 3] & 0xff);\n  };\n};\nutil.inherits(module.exports.UTF_32BE, UTF_32);\n\nmodule.exports.UTF_32LE = function() {\n  this.name = function() {\n    return 'UTF-32LE';\n  };\n  this.getChar = function(input, index) {\n    return (input[index + 3] & 0xff) << 24 | (input[index + 2] & 0xff) << 16 |\n         (input[index + 1] & 0xff) <<  8 | (input[index + 0] & 0xff);\n  };\n};\nutil.inherits(module.exports.UTF_32LE, UTF_32);\n\n\n/***/ }),\n/* 703 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar Match = __webpack_require__ (143);\n\n/**\n * Charset recognizer for UTF-8\n */\nmodule.exports = function() {\n  this.name = function() {\n    return 'UTF-8';\n  };\n  this.match = function(det) {\n\n    var hasBOM = false,\n      numValid = 0,\n      numInvalid = 0,\n      input = det.fRawInput,\n      trailBytes = 0,\n      confidence;\n\n    if (det.fRawLength >= 3 &&\n      (input[0] & 0xff) == 0xef && (input[1] & 0xff) == 0xbb && (input[2] & 0xff) == 0xbf) {\n      hasBOM = true;\n    }\n\n    // Scan for multi-byte sequences\n    for (var i = 0; i < det.fRawLength; i++) {\n      var b = input[i];\n      if ((b & 0x80) == 0)\n        continue; // ASCII\n\n      // Hi bit on char found.  Figure out how long the sequence should be\n      if ((b & 0x0e0) == 0x0c0) {\n        trailBytes = 1;\n      } else if ((b & 0x0f0) == 0x0e0) {\n        trailBytes = 2;\n      } else if ((b & 0x0f8) == 0xf0) {\n        trailBytes = 3;\n      } else {\n        numInvalid++;\n        if (numInvalid > 5)\n          break;\n        trailBytes = 0;\n      }\n\n      // Verify that we've got the right number of trail bytes in the sequence\n      for (;;) {\n        i++;\n        if (i >= det.fRawLength)\n          break;\n\n        if ((input[i] & 0xc0) != 0x080) {\n          numInvalid++;\n          break;\n        }\n        if (--trailBytes == 0) {\n          numValid++;\n          break;\n        }\n      }\n    }\n\n    // Cook up some sort of confidence score, based on presense of a BOM\n    //    and the existence of valid and/or invalid multi-byte sequences.\n    confidence = 0;\n    if (hasBOM && numInvalid == 0)\n      confidence = 100;\n    else if (hasBOM && numValid > numInvalid * 10)\n      confidence = 80;\n    else if (numValid > 3 && numInvalid == 0)\n      confidence = 100;\n    else if (numValid > 0 && numInvalid == 0)\n      confidence = 80;\n    else if (numValid == 0 && numInvalid == 0)\n      // Plain ASCII.\n      confidence = 10;\n    else if (numValid > numInvalid * 10)\n      // Probably corruput utf-8 data.  Valid sequences aren't likely by chance.\n      confidence = 25;\n    else\n      return null\n\n    return new Match(det, this, confidence);\n  };\n};\n\n\n/***/ }),\n/* 704 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar fs = __webpack_require__(4);\n\nvar utf8  = __webpack_require__(703),\n  unicode = __webpack_require__(702),\n  mbcs    = __webpack_require__(700),\n  sbcs    = __webpack_require__(701),\n  iso2022 = __webpack_require__(699);\n\nvar self = this;\n\nvar recognisers = [\n  new utf8,\n  new unicode.UTF_16BE,\n  new unicode.UTF_16LE,\n  new unicode.UTF_32BE,\n  new unicode.UTF_32LE,\n  new mbcs.sjis,\n  new mbcs.big5,\n  new mbcs.euc_jp,\n  new mbcs.euc_kr,\n  new mbcs.gb_18030,\n  new iso2022.ISO_2022_JP,\n  new iso2022.ISO_2022_KR,\n  new iso2022.ISO_2022_CN,\n  new sbcs.ISO_8859_1,\n  new sbcs.ISO_8859_2,\n  new sbcs.ISO_8859_5,\n  new sbcs.ISO_8859_6,\n  new sbcs.ISO_8859_7,\n  new sbcs.ISO_8859_8,\n  new sbcs.ISO_8859_9,\n  new sbcs.windows_1251,\n  new sbcs.windows_1256,\n  new sbcs.KOI8_R\n];\n\nmodule.exports.detect = function(buffer, opts) {\n\n  // Tally up the byte occurence statistics.\n  var fByteStats = [];\n  for (var i = 0; i < 256; i++)\n    fByteStats[i] = 0;\n\n  for (var i = buffer.length - 1; i >= 0; i--)\n    fByteStats[buffer[i] & 0x00ff]++;\n\n  var fC1Bytes = false;\n  for (var i = 0x80; i <= 0x9F; i += 1) {\n    if (fByteStats[i] != 0) {\n      fC1Bytes = true;\n      break;\n    }\n  }\n\n  var context = {\n    fByteStats:  fByteStats,\n    fC1Bytes:    fC1Bytes,\n    fRawInput:   buffer,\n    fRawLength:  buffer.length,\n    fInputBytes: buffer,\n    fInputLen:   buffer.length\n  };\n\n  var matches = recognisers.map(function(rec) {\n    return rec.match(context);\n  }).filter(function(match) {\n    return !!match;\n  }).sort(function(a, b) {\n    return b.confidence - a.confidence;\n  });\n\n  if (opts && opts.returnAllMatches === true) {\n    return matches;\n  }\n  else {\n    return matches.length > 0 ? matches[0].name : null;\n  }\n};\n\nmodule.exports.detectFile = function(filepath, opts, cb) {\n  if (typeof opts === 'function') {\n    cb = opts;\n    opts = undefined;\n  }\n\n  var fd;\n\n  var handler = function(err, buffer) {\n    if (fd) {\n      fs.closeSync(fd);\n    }\n\n    if (err) return cb(err, null);\n    cb(null, self.detect(buffer, opts));\n  };\n\n  if (opts && opts.sampleSize) {\n    fd = fs.openSync(filepath, 'r'),\n      sample = Buffer.allocUnsafe(opts.sampleSize);\n\n    fs.read(fd, sample, 0, opts.sampleSize, null, function(err) {\n      handler(err, sample);\n    });\n    return;\n  }\n\n  fs.readFile(filepath, handler);\n};\n\nmodule.exports.detectFileSync = function(filepath, opts) {\n  if (opts && opts.sampleSize) {\n    var fd = fs.openSync(filepath, 'r'),\n      sample = Buffer.allocUnsafe(opts.sampleSize);\n\n    fs.readSync(fd, sample, 0, opts.sampleSize);\n    fs.closeSync(fd);\n    return self.detect(sample, opts);\n  }\n\n  return self.detect(fs.readFileSync(filepath), opts);\n};\n\n// Wrappers for the previous functions to return all encodings\nmodule.exports.detectAll = function(buffer, opts) {\n  if (typeof opts !== 'object') {\n    opts = {};\n  }\n  opts.returnAllMatches = true;\n  return self.detect(buffer, opts);\n}\n\nmodule.exports.detectFileAll = function(filepath, opts, cb) {\n  if (typeof opts === 'function') {\n    cb = opts;\n    opts = undefined;\n  }\n  if (typeof opts !== 'object') {\n    opts = {};\n  }\n  opts.returnAllMatches = true;\n  self.detectFile(filepath, opts, cb);\n}\n\nmodule.exports.detectFileAllSync = function(filepath, opts) {\n  if (typeof opts !== 'object') {\n    opts = {};\n  }\n  opts.returnAllMatches = true;\n  return self.detectFileSync(filepath, opts);\n}\n\n\n/***/ }),\n/* 705 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/***\n * Node External Editor\n *\n * Kevin Gravier <kevin@mrkmg.com>\n * MIT 2018\n */\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    }\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar CreateFileError = /** @class */ (function (_super) {\n    __extends(CreateFileError, _super);\n    function CreateFileError(originalError) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, \"Failed to create temporary file for editor\") || this;\n        _this.originalError = originalError;\n        var proto = _newTarget.prototype;\n        if (Object.setPrototypeOf) {\n            Object.setPrototypeOf(_this, proto);\n        }\n        else {\n            _this.__proto__ = _newTarget.prototype;\n        }\n        return _this;\n    }\n    return CreateFileError;\n}(Error));\nexports.CreateFileError = CreateFileError;\n\n\n/***/ }),\n/* 706 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/***\n * Node External Editor\n *\n * Kevin Gravier <kevin@mrkmg.com>\n * MIT 2018\n */\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    }\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar LaunchEditorError = /** @class */ (function (_super) {\n    __extends(LaunchEditorError, _super);\n    function LaunchEditorError(originalError) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, \"Failed launch editor\") || this;\n        _this.originalError = originalError;\n        var proto = _newTarget.prototype;\n        if (Object.setPrototypeOf) {\n            Object.setPrototypeOf(_this, proto);\n        }\n        else {\n            _this.__proto__ = _newTarget.prototype;\n        }\n        return _this;\n    }\n    return LaunchEditorError;\n}(Error));\nexports.LaunchEditorError = LaunchEditorError;\n\n\n/***/ }),\n/* 707 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/***\n * Node External Editor\n *\n * Kevin Gravier <kevin@mrkmg.com>\n * MIT 2018\n */\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    }\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar ReadFileError = /** @class */ (function (_super) {\n    __extends(ReadFileError, _super);\n    function ReadFileError(originalError) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, \"Failed to read temporary file\") || this;\n        _this.originalError = originalError;\n        var proto = _newTarget.prototype;\n        if (Object.setPrototypeOf) {\n            Object.setPrototypeOf(_this, proto);\n        }\n        else {\n            _this.__proto__ = _newTarget.prototype;\n        }\n        return _this;\n    }\n    return ReadFileError;\n}(Error));\nexports.ReadFileError = ReadFileError;\n\n\n/***/ }),\n/* 708 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/***\n * Node External Editor\n *\n * Kevin Gravier <kevin@mrkmg.com>\n * MIT 2018\n */\nvar __extends = (this && this.__extends) || (function () {\n    var extendStatics = function (d, b) {\n        extendStatics = Object.setPrototypeOf ||\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\n        return extendStatics(d, b);\n    }\n    return function (d, b) {\n        extendStatics(d, b);\n        function __() { this.constructor = d; }\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n    };\n})();\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar RemoveFileError = /** @class */ (function (_super) {\n    __extends(RemoveFileError, _super);\n    function RemoveFileError(originalError) {\n        var _newTarget = this.constructor;\n        var _this = _super.call(this, \"Failed to cleanup temporary file\") || this;\n        _this.originalError = originalError;\n        var proto = _newTarget.prototype;\n        if (Object.setPrototypeOf) {\n            Object.setPrototypeOf(_this, proto);\n        }\n        else {\n            _this.__proto__ = _newTarget.prototype;\n        }\n        return _this;\n    }\n    return RemoveFileError;\n}(Error));\nexports.RemoveFileError = RemoveFileError;\n\n\n/***/ }),\n/* 709 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/***\n * Node External Editor\n *\n * Kevin Gravier <kevin@mrkmg.com>\n * MIT 2018\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar chardet_1 = __webpack_require__(704);\nvar child_process_1 = __webpack_require__(332);\nvar fs_1 = __webpack_require__(4);\nvar iconv_lite_1 = __webpack_require__(726);\nvar tmp_1 = __webpack_require__(954);\nvar CreateFileError_1 = __webpack_require__(705);\nexports.CreateFileError = CreateFileError_1.CreateFileError;\nvar LaunchEditorError_1 = __webpack_require__(706);\nexports.LaunchEditorError = LaunchEditorError_1.LaunchEditorError;\nvar ReadFileError_1 = __webpack_require__(707);\nexports.ReadFileError = ReadFileError_1.ReadFileError;\nvar RemoveFileError_1 = __webpack_require__(708);\nexports.RemoveFileError = RemoveFileError_1.RemoveFileError;\nfunction edit(text) {\n    if (text === void 0) { text = \"\"; }\n    var editor = new ExternalEditor(text);\n    editor.run();\n    editor.cleanup();\n    return editor.text;\n}\nexports.edit = edit;\nfunction editAsync(text, callback) {\n    if (text === void 0) { text = \"\"; }\n    var editor = new ExternalEditor(text);\n    editor.runAsync(function (err, result) {\n        if (err) {\n            setImmediate(callback, err, null);\n        }\n        else {\n            try {\n                editor.cleanup();\n                setImmediate(callback, null, result);\n            }\n            catch (cleanupError) {\n                setImmediate(callback, cleanupError, null);\n            }\n        }\n    });\n}\nexports.editAsync = editAsync;\nvar ExternalEditor = /** @class */ (function () {\n    function ExternalEditor(text) {\n        if (text === void 0) { text = \"\"; }\n        this.text = \"\";\n        this.text = text;\n        this.determineEditor();\n        this.createTemporaryFile();\n    }\n    ExternalEditor.splitStringBySpace = function (str) {\n        var pieces = [];\n        var currentString = \"\";\n        for (var strIndex = 0; strIndex < str.length; strIndex++) {\n            var currentLetter = str[strIndex];\n            if (strIndex > 0 && currentLetter === \" \" && str[strIndex - 1] !== \"\\\\\" && currentString.length > 0) {\n                pieces.push(currentString);\n                currentString = \"\";\n            }\n            else {\n                currentString += currentLetter;\n            }\n        }\n        if (currentString.length > 0) {\n            pieces.push(currentString);\n        }\n        return pieces;\n    };\n    Object.defineProperty(ExternalEditor.prototype, \"temp_file\", {\n        get: function () {\n            console.log(\"DEPRECATED: temp_file. Use tempFile moving forward.\");\n            return this.tempFile;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    Object.defineProperty(ExternalEditor.prototype, \"last_exit_status\", {\n        get: function () {\n            console.log(\"DEPRECATED: last_exit_status. Use lastExitStatus moving forward.\");\n            return this.lastExitStatus;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    ExternalEditor.prototype.run = function () {\n        this.launchEditor();\n        this.readTemporaryFile();\n        return this.text;\n    };\n    ExternalEditor.prototype.runAsync = function (callback) {\n        var _this = this;\n        try {\n            this.launchEditorAsync(function () {\n                try {\n                    _this.readTemporaryFile();\n                    setImmediate(callback, null, _this.text);\n                }\n                catch (readError) {\n                    setImmediate(callback, readError, null);\n                }\n            });\n        }\n        catch (launchError) {\n            setImmediate(callback, launchError, null);\n        }\n    };\n    ExternalEditor.prototype.cleanup = function () {\n        this.removeTemporaryFile();\n    };\n    ExternalEditor.prototype.determineEditor = function () {\n        var editor = process.env.VISUAL ? process.env.VISUAL :\n            process.env.EDITOR ? process.env.EDITOR :\n                /^win/.test(process.platform) ? \"notepad\" :\n                    \"vim\";\n        var editorOpts = ExternalEditor.splitStringBySpace(editor).map(function (piece) { return piece.replace(\"\\\\ \", \" \"); });\n        var bin = editorOpts.shift();\n        this.editor = { args: editorOpts, bin: bin };\n    };\n    ExternalEditor.prototype.createTemporaryFile = function () {\n        try {\n            this.tempFile = tmp_1.tmpNameSync({});\n            fs_1.writeFileSync(this.tempFile, this.text, { encoding: \"utf8\" });\n        }\n        catch (createFileError) {\n            throw new CreateFileError_1.CreateFileError(createFileError);\n        }\n    };\n    ExternalEditor.prototype.readTemporaryFile = function () {\n        try {\n            var tempFileBuffer = fs_1.readFileSync(this.tempFile);\n            if (tempFileBuffer.length === 0) {\n                this.text = \"\";\n            }\n            else {\n                var encoding = chardet_1.detect(tempFileBuffer).toString();\n                if (!iconv_lite_1.encodingExists(encoding)) {\n                    // Probably a bad idea, but will at least prevent crashing\n                    encoding = \"utf8\";\n                }\n                this.text = iconv_lite_1.decode(tempFileBuffer, encoding);\n            }\n        }\n        catch (readFileError) {\n            throw new ReadFileError_1.ReadFileError(readFileError);\n        }\n    };\n    ExternalEditor.prototype.removeTemporaryFile = function () {\n        try {\n            fs_1.unlinkSync(this.tempFile);\n        }\n        catch (removeFileError) {\n            throw new RemoveFileError_1.RemoveFileError(removeFileError);\n        }\n    };\n    ExternalEditor.prototype.launchEditor = function () {\n        try {\n            var editorProcess = child_process_1.spawnSync(this.editor.bin, this.editor.args.concat([this.tempFile]), { stdio: \"inherit\" });\n            this.lastExitStatus = editorProcess.status;\n        }\n        catch (launchError) {\n            throw new LaunchEditorError_1.LaunchEditorError(launchError);\n        }\n    };\n    ExternalEditor.prototype.launchEditorAsync = function (callback) {\n        var _this = this;\n        try {\n            var editorProcess = child_process_1.spawn(this.editor.bin, this.editor.args.concat([this.tempFile]), { stdio: \"inherit\" });\n            editorProcess.on(\"exit\", function (code) {\n                _this.lastExitStatus = code;\n                setImmediate(callback);\n            });\n        }\n        catch (launchError) {\n            throw new LaunchEditorError_1.LaunchEditorError(launchError);\n        }\n    };\n    return ExternalEditor;\n}());\nexports.ExternalEditor = ExternalEditor;\n\n\n/***/ }),\n/* 710 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar Buffer = __webpack_require__(15).Buffer;\n\n// Multibyte codec. In this scheme, a character is represented by 1 or more bytes.\n// Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences.\n// To save memory and loading time, we read table files only when requested.\n\nexports._dbcs = DBCSCodec;\n\nvar UNASSIGNED = -1,\n    GB18030_CODE = -2,\n    SEQ_START  = -10,\n    NODE_START = -1000,\n    UNASSIGNED_NODE = new Array(0x100),\n    DEF_CHAR = -1;\n\nfor (var i = 0; i < 0x100; i++)\n    UNASSIGNED_NODE[i] = UNASSIGNED;\n\n\n// Class DBCSCodec reads and initializes mapping tables.\nfunction DBCSCodec(codecOptions, iconv) {\n    this.encodingName = codecOptions.encodingName;\n    if (!codecOptions)\n        throw new Error(\"DBCS codec is called without the data.\")\n    if (!codecOptions.table)\n        throw new Error(\"Encoding '\" + this.encodingName + \"' has no data.\");\n\n    // Load tables.\n    var mappingTable = codecOptions.table();\n\n\n    // Decode tables: MBCS -> Unicode.\n\n    // decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256.\n    // Trie root is decodeTables[0].\n    // Values: >=  0 -> unicode character code. can be > 0xFFFF\n    //         == UNASSIGNED -> unknown/unassigned sequence.\n    //         == GB18030_CODE -> this is the end of a GB18030 4-byte sequence.\n    //         <= NODE_START -> index of the next node in our trie to process next byte.\n    //         <= SEQ_START  -> index of the start of a character code sequence, in decodeTableSeq.\n    this.decodeTables = [];\n    this.decodeTables[0] = UNASSIGNED_NODE.slice(0); // Create root node.\n\n    // Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here. \n    this.decodeTableSeq = [];\n\n    // Actual mapping tables consist of chunks. Use them to fill up decode tables.\n    for (var i = 0; i < mappingTable.length; i++)\n        this._addDecodeChunk(mappingTable[i]);\n\n    this.defaultCharUnicode = iconv.defaultCharUnicode;\n\n    \n    // Encode tables: Unicode -> DBCS.\n\n    // `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance.\n    // Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null.\n    // Values: >=  0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.).\n    //         == UNASSIGNED -> no conversion found. Output a default char.\n    //         <= SEQ_START  -> it's an index in encodeTableSeq, see below. The character starts a sequence.\n    this.encodeTable = [];\n    \n    // `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of\n    // objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key\n    // means end of sequence (needed when one sequence is a strict subsequence of another).\n    // Objects are kept separately from encodeTable to increase performance.\n    this.encodeTableSeq = [];\n\n    // Some chars can be decoded, but need not be encoded.\n    var skipEncodeChars = {};\n    if (codecOptions.encodeSkipVals)\n        for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) {\n            var val = codecOptions.encodeSkipVals[i];\n            if (typeof val === 'number')\n                skipEncodeChars[val] = true;\n            else\n                for (var j = val.from; j <= val.to; j++)\n                    skipEncodeChars[j] = true;\n        }\n        \n    // Use decode trie to recursively fill out encode tables.\n    this._fillEncodeTable(0, 0, skipEncodeChars);\n\n    // Add more encoding pairs when needed.\n    if (codecOptions.encodeAdd) {\n        for (var uChar in codecOptions.encodeAdd)\n            if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar))\n                this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]);\n    }\n\n    this.defCharSB  = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)];\n    if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]['?'];\n    if (this.defCharSB === UNASSIGNED) this.defCharSB = \"?\".charCodeAt(0);\n\n\n    // Load & create GB18030 tables when needed.\n    if (typeof codecOptions.gb18030 === 'function') {\n        this.gb18030 = codecOptions.gb18030(); // Load GB18030 ranges.\n\n        // Add GB18030 decode tables.\n        var thirdByteNodeIdx = this.decodeTables.length;\n        var thirdByteNode = this.decodeTables[thirdByteNodeIdx] = UNASSIGNED_NODE.slice(0);\n\n        var fourthByteNodeIdx = this.decodeTables.length;\n        var fourthByteNode = this.decodeTables[fourthByteNodeIdx] = UNASSIGNED_NODE.slice(0);\n\n        for (var i = 0x81; i <= 0xFE; i++) {\n            var secondByteNodeIdx = NODE_START - this.decodeTables[0][i];\n            var secondByteNode = this.decodeTables[secondByteNodeIdx];\n            for (var j = 0x30; j <= 0x39; j++)\n                secondByteNode[j] = NODE_START - thirdByteNodeIdx;\n        }\n        for (var i = 0x81; i <= 0xFE; i++)\n            thirdByteNode[i] = NODE_START - fourthByteNodeIdx;\n        for (var i = 0x30; i <= 0x39; i++)\n            fourthByteNode[i] = GB18030_CODE\n    }        \n}\n\nDBCSCodec.prototype.encoder = DBCSEncoder;\nDBCSCodec.prototype.decoder = DBCSDecoder;\n\n// Decoder helpers\nDBCSCodec.prototype._getDecodeTrieNode = function(addr) {\n    var bytes = [];\n    for (; addr > 0; addr >>= 8)\n        bytes.push(addr & 0xFF);\n    if (bytes.length == 0)\n        bytes.push(0);\n\n    var node = this.decodeTables[0];\n    for (var i = bytes.length-1; i > 0; i--) { // Traverse nodes deeper into the trie.\n        var val = node[bytes[i]];\n\n        if (val == UNASSIGNED) { // Create new node.\n            node[bytes[i]] = NODE_START - this.decodeTables.length;\n            this.decodeTables.push(node = UNASSIGNED_NODE.slice(0));\n        }\n        else if (val <= NODE_START) { // Existing node.\n            node = this.decodeTables[NODE_START - val];\n        }\n        else\n            throw new Error(\"Overwrite byte in \" + this.encodingName + \", addr: \" + addr.toString(16));\n    }\n    return node;\n}\n\n\nDBCSCodec.prototype._addDecodeChunk = function(chunk) {\n    // First element of chunk is the hex mbcs code where we start.\n    var curAddr = parseInt(chunk[0], 16);\n\n    // Choose the decoding node where we'll write our chars.\n    var writeTable = this._getDecodeTrieNode(curAddr);\n    curAddr = curAddr & 0xFF;\n\n    // Write all other elements of the chunk to the table.\n    for (var k = 1; k < chunk.length; k++) {\n        var part = chunk[k];\n        if (typeof part === \"string\") { // String, write as-is.\n            for (var l = 0; l < part.length;) {\n                var code = part.charCodeAt(l++);\n                if (0xD800 <= code && code < 0xDC00) { // Decode surrogate\n                    var codeTrail = part.charCodeAt(l++);\n                    if (0xDC00 <= codeTrail && codeTrail < 0xE000)\n                        writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00);\n                    else\n                        throw new Error(\"Incorrect surrogate pair in \"  + this.encodingName + \" at chunk \" + chunk[0]);\n                }\n                else if (0x0FF0 < code && code <= 0x0FFF) { // Character sequence (our own encoding used)\n                    var len = 0xFFF - code + 2;\n                    var seq = [];\n                    for (var m = 0; m < len; m++)\n                        seq.push(part.charCodeAt(l++)); // Simple variation: don't support surrogates or subsequences in seq.\n\n                    writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length;\n                    this.decodeTableSeq.push(seq);\n                }\n                else\n                    writeTable[curAddr++] = code; // Basic char\n            }\n        } \n        else if (typeof part === \"number\") { // Integer, meaning increasing sequence starting with prev character.\n            var charCode = writeTable[curAddr - 1] + 1;\n            for (var l = 0; l < part; l++)\n                writeTable[curAddr++] = charCode++;\n        }\n        else\n            throw new Error(\"Incorrect type '\" + typeof part + \"' given in \"  + this.encodingName + \" at chunk \" + chunk[0]);\n    }\n    if (curAddr > 0xFF)\n        throw new Error(\"Incorrect chunk in \"  + this.encodingName + \" at addr \" + chunk[0] + \": too long\" + curAddr);\n}\n\n// Encoder helpers\nDBCSCodec.prototype._getEncodeBucket = function(uCode) {\n    var high = uCode >> 8; // This could be > 0xFF because of astral characters.\n    if (this.encodeTable[high] === undefined)\n        this.encodeTable[high] = UNASSIGNED_NODE.slice(0); // Create bucket on demand.\n    return this.encodeTable[high];\n}\n\nDBCSCodec.prototype._setEncodeChar = function(uCode, dbcsCode) {\n    var bucket = this._getEncodeBucket(uCode);\n    var low = uCode & 0xFF;\n    if (bucket[low] <= SEQ_START)\n        this.encodeTableSeq[SEQ_START-bucket[low]][DEF_CHAR] = dbcsCode; // There's already a sequence, set a single-char subsequence of it.\n    else if (bucket[low] == UNASSIGNED)\n        bucket[low] = dbcsCode;\n}\n\nDBCSCodec.prototype._setEncodeSequence = function(seq, dbcsCode) {\n    \n    // Get the root of character tree according to first character of the sequence.\n    var uCode = seq[0];\n    var bucket = this._getEncodeBucket(uCode);\n    var low = uCode & 0xFF;\n\n    var node;\n    if (bucket[low] <= SEQ_START) {\n        // There's already a sequence with  - use it.\n        node = this.encodeTableSeq[SEQ_START-bucket[low]];\n    }\n    else {\n        // There was no sequence object - allocate a new one.\n        node = {};\n        if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; // If a char was set before - make it a single-char subsequence.\n        bucket[low] = SEQ_START - this.encodeTableSeq.length;\n        this.encodeTableSeq.push(node);\n    }\n\n    // Traverse the character tree, allocating new nodes as needed.\n    for (var j = 1; j < seq.length-1; j++) {\n        var oldVal = node[uCode];\n        if (typeof oldVal === 'object')\n            node = oldVal;\n        else {\n            node = node[uCode] = {}\n            if (oldVal !== undefined)\n                node[DEF_CHAR] = oldVal\n        }\n    }\n\n    // Set the leaf to given dbcsCode.\n    uCode = seq[seq.length-1];\n    node[uCode] = dbcsCode;\n}\n\nDBCSCodec.prototype._fillEncodeTable = function(nodeIdx, prefix, skipEncodeChars) {\n    var node = this.decodeTables[nodeIdx];\n    for (var i = 0; i < 0x100; i++) {\n        var uCode = node[i];\n        var mbCode = prefix + i;\n        if (skipEncodeChars[mbCode])\n            continue;\n\n        if (uCode >= 0)\n            this._setEncodeChar(uCode, mbCode);\n        else if (uCode <= NODE_START)\n            this._fillEncodeTable(NODE_START - uCode, mbCode << 8, skipEncodeChars);\n        else if (uCode <= SEQ_START)\n            this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode);\n    }\n}\n\n\n\n// == Encoder ==================================================================\n\nfunction DBCSEncoder(options, codec) {\n    // Encoder state\n    this.leadSurrogate = -1;\n    this.seqObj = undefined;\n    \n    // Static data\n    this.encodeTable = codec.encodeTable;\n    this.encodeTableSeq = codec.encodeTableSeq;\n    this.defaultCharSingleByte = codec.defCharSB;\n    this.gb18030 = codec.gb18030;\n}\n\nDBCSEncoder.prototype.write = function(str) {\n    var newBuf = Buffer.alloc(str.length * (this.gb18030 ? 4 : 3)),\n        leadSurrogate = this.leadSurrogate,\n        seqObj = this.seqObj, nextChar = -1,\n        i = 0, j = 0;\n\n    while (true) {\n        // 0. Get next character.\n        if (nextChar === -1) {\n            if (i == str.length) break;\n            var uCode = str.charCodeAt(i++);\n        }\n        else {\n            var uCode = nextChar;\n            nextChar = -1;    \n        }\n\n        // 1. Handle surrogates.\n        if (0xD800 <= uCode && uCode < 0xE000) { // Char is one of surrogates.\n            if (uCode < 0xDC00) { // We've got lead surrogate.\n                if (leadSurrogate === -1) {\n                    leadSurrogate = uCode;\n                    continue;\n                } else {\n                    leadSurrogate = uCode;\n                    // Double lead surrogate found.\n                    uCode = UNASSIGNED;\n                }\n            } else { // We've got trail surrogate.\n                if (leadSurrogate !== -1) {\n                    uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00);\n                    leadSurrogate = -1;\n                } else {\n                    // Incomplete surrogate pair - only trail surrogate found.\n                    uCode = UNASSIGNED;\n                }\n                \n            }\n        }\n        else if (leadSurrogate !== -1) {\n            // Incomplete surrogate pair - only lead surrogate found.\n            nextChar = uCode; uCode = UNASSIGNED; // Write an error, then current char.\n            leadSurrogate = -1;\n        }\n\n        // 2. Convert uCode character.\n        var dbcsCode = UNASSIGNED;\n        if (seqObj !== undefined && uCode != UNASSIGNED) { // We are in the middle of the sequence\n            var resCode = seqObj[uCode];\n            if (typeof resCode === 'object') { // Sequence continues.\n                seqObj = resCode;\n                continue;\n\n            } else if (typeof resCode == 'number') { // Sequence finished. Write it.\n                dbcsCode = resCode;\n\n            } else if (resCode == undefined) { // Current character is not part of the sequence.\n\n                // Try default character for this sequence\n                resCode = seqObj[DEF_CHAR];\n                if (resCode !== undefined) {\n                    dbcsCode = resCode; // Found. Write it.\n                    nextChar = uCode; // Current character will be written too in the next iteration.\n\n                } else {\n                    // TODO: What if we have no default? (resCode == undefined)\n                    // Then, we should write first char of the sequence as-is and try the rest recursively.\n                    // Didn't do it for now because no encoding has this situation yet.\n                    // Currently, just skip the sequence and write current char.\n                }\n            }\n            seqObj = undefined;\n        }\n        else if (uCode >= 0) {  // Regular character\n            var subtable = this.encodeTable[uCode >> 8];\n            if (subtable !== undefined)\n                dbcsCode = subtable[uCode & 0xFF];\n            \n            if (dbcsCode <= SEQ_START) { // Sequence start\n                seqObj = this.encodeTableSeq[SEQ_START-dbcsCode];\n                continue;\n            }\n\n            if (dbcsCode == UNASSIGNED && this.gb18030) {\n                // Use GB18030 algorithm to find character(s) to write.\n                var idx = findIdx(this.gb18030.uChars, uCode);\n                if (idx != -1) {\n                    var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx]);\n                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); dbcsCode = dbcsCode % 12600;\n                    newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); dbcsCode = dbcsCode % 1260;\n                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); dbcsCode = dbcsCode % 10;\n                    newBuf[j++] = 0x30 + dbcsCode;\n                    continue;\n                }\n            }\n        }\n\n        // 3. Write dbcsCode character.\n        if (dbcsCode === UNASSIGNED)\n            dbcsCode = this.defaultCharSingleByte;\n        \n        if (dbcsCode < 0x100) {\n            newBuf[j++] = dbcsCode;\n        }\n        else if (dbcsCode < 0x10000) {\n            newBuf[j++] = dbcsCode >> 8;   // high byte\n            newBuf[j++] = dbcsCode & 0xFF; // low byte\n        }\n        else {\n            newBuf[j++] = dbcsCode >> 16;\n            newBuf[j++] = (dbcsCode >> 8) & 0xFF;\n            newBuf[j++] = dbcsCode & 0xFF;\n        }\n    }\n\n    this.seqObj = seqObj;\n    this.leadSurrogate = leadSurrogate;\n    return newBuf.slice(0, j);\n}\n\nDBCSEncoder.prototype.end = function() {\n    if (this.leadSurrogate === -1 && this.seqObj === undefined)\n        return; // All clean. Most often case.\n\n    var newBuf = Buffer.alloc(10), j = 0;\n\n    if (this.seqObj) { // We're in the sequence.\n        var dbcsCode = this.seqObj[DEF_CHAR];\n        if (dbcsCode !== undefined) { // Write beginning of the sequence.\n            if (dbcsCode < 0x100) {\n                newBuf[j++] = dbcsCode;\n            }\n            else {\n                newBuf[j++] = dbcsCode >> 8;   // high byte\n                newBuf[j++] = dbcsCode & 0xFF; // low byte\n            }\n        } else {\n            // See todo above.\n        }\n        this.seqObj = undefined;\n    }\n\n    if (this.leadSurrogate !== -1) {\n        // Incomplete surrogate pair - only lead surrogate found.\n        newBuf[j++] = this.defaultCharSingleByte;\n        this.leadSurrogate = -1;\n    }\n    \n    return newBuf.slice(0, j);\n}\n\n// Export for testing\nDBCSEncoder.prototype.findIdx = findIdx;\n\n\n// == Decoder ==================================================================\n\nfunction DBCSDecoder(options, codec) {\n    // Decoder state\n    this.nodeIdx = 0;\n    this.prevBuf = Buffer.alloc(0);\n\n    // Static data\n    this.decodeTables = codec.decodeTables;\n    this.decodeTableSeq = codec.decodeTableSeq;\n    this.defaultCharUnicode = codec.defaultCharUnicode;\n    this.gb18030 = codec.gb18030;\n}\n\nDBCSDecoder.prototype.write = function(buf) {\n    var newBuf = Buffer.alloc(buf.length*2),\n        nodeIdx = this.nodeIdx, \n        prevBuf = this.prevBuf, prevBufOffset = this.prevBuf.length,\n        seqStart = -this.prevBuf.length, // idx of the start of current parsed sequence.\n        uCode;\n\n    if (prevBufOffset > 0) // Make prev buf overlap a little to make it easier to slice later.\n        prevBuf = Buffer.concat([prevBuf, buf.slice(0, 10)]);\n    \n    for (var i = 0, j = 0; i < buf.length; i++) {\n        var curByte = (i >= 0) ? buf[i] : prevBuf[i + prevBufOffset];\n\n        // Lookup in current trie node.\n        var uCode = this.decodeTables[nodeIdx][curByte];\n\n        if (uCode >= 0) { \n            // Normal character, just use it.\n        }\n        else if (uCode === UNASSIGNED) { // Unknown char.\n            // TODO: Callback with seq.\n            //var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);\n            i = seqStart; // Try to parse again, after skipping first byte of the sequence ('i' will be incremented by 'for' cycle).\n            uCode = this.defaultCharUnicode.charCodeAt(0);\n        }\n        else if (uCode === GB18030_CODE) {\n            var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);\n            var ptr = (curSeq[0]-0x81)*12600 + (curSeq[1]-0x30)*1260 + (curSeq[2]-0x81)*10 + (curSeq[3]-0x30);\n            var idx = findIdx(this.gb18030.gbChars, ptr);\n            uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx];\n        }\n        else if (uCode <= NODE_START) { // Go to next trie node.\n            nodeIdx = NODE_START - uCode;\n            continue;\n        }\n        else if (uCode <= SEQ_START) { // Output a sequence of chars.\n            var seq = this.decodeTableSeq[SEQ_START - uCode];\n            for (var k = 0; k < seq.length - 1; k++) {\n                uCode = seq[k];\n                newBuf[j++] = uCode & 0xFF;\n                newBuf[j++] = uCode >> 8;\n            }\n            uCode = seq[seq.length-1];\n        }\n        else\n            throw new Error(\"iconv-lite internal error: invalid decoding table value \" + uCode + \" at \" + nodeIdx + \"/\" + curByte);\n\n        // Write the character to buffer, handling higher planes using surrogate pair.\n        if (uCode > 0xFFFF) { \n            uCode -= 0x10000;\n            var uCodeLead = 0xD800 + Math.floor(uCode / 0x400);\n            newBuf[j++] = uCodeLead & 0xFF;\n            newBuf[j++] = uCodeLead >> 8;\n\n            uCode = 0xDC00 + uCode % 0x400;\n        }\n        newBuf[j++] = uCode & 0xFF;\n        newBuf[j++] = uCode >> 8;\n\n        // Reset trie node.\n        nodeIdx = 0; seqStart = i+1;\n    }\n\n    this.nodeIdx = nodeIdx;\n    this.prevBuf = (seqStart >= 0) ? buf.slice(seqStart) : prevBuf.slice(seqStart + prevBufOffset);\n    return newBuf.slice(0, j).toString('ucs2');\n}\n\nDBCSDecoder.prototype.end = function() {\n    var ret = '';\n\n    // Try to parse all remaining chars.\n    while (this.prevBuf.length > 0) {\n        // Skip 1 character in the buffer.\n        ret += this.defaultCharUnicode;\n        var buf = this.prevBuf.slice(1);\n\n        // Parse remaining as usual.\n        this.prevBuf = Buffer.alloc(0);\n        this.nodeIdx = 0;\n        if (buf.length > 0)\n            ret += this.write(buf);\n    }\n\n    this.nodeIdx = 0;\n    return ret;\n}\n\n// Binary search for GB18030. Returns largest i such that table[i] <= val.\nfunction findIdx(table, val) {\n    if (table[0] > val)\n        return -1;\n\n    var l = 0, r = table.length;\n    while (l < r-1) { // always table[l] <= val < table[r]\n        var mid = l + Math.floor((r-l+1)/2);\n        if (table[mid] <= val)\n            l = mid;\n        else\n            r = mid;\n    }\n    return l;\n}\n\n\n\n/***/ }),\n/* 711 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Description of supported double byte encodings and aliases.\n// Tables are not require()-d until they are needed to speed up library load.\n// require()-s are direct to support Browserify.\n\nmodule.exports = {\n    \n    // == Japanese/ShiftJIS ====================================================\n    // All japanese encodings are based on JIS X set of standards:\n    // JIS X 0201 - Single-byte encoding of ASCII + ¥ + Kana chars at 0xA1-0xDF.\n    // JIS X 0208 - Main set of 6879 characters, placed in 94x94 plane, to be encoded by 2 bytes. \n    //              Has several variations in 1978, 1983, 1990 and 1997.\n    // JIS X 0212 - Supplementary plane of 6067 chars in 94x94 plane. 1990. Effectively dead.\n    // JIS X 0213 - Extension and modern replacement of 0208 and 0212. Total chars: 11233.\n    //              2 planes, first is superset of 0208, second - revised 0212.\n    //              Introduced in 2000, revised 2004. Some characters are in Unicode Plane 2 (0x2xxxx)\n\n    // Byte encodings are:\n    //  * Shift_JIS: Compatible with 0201, uses not defined chars in top half as lead bytes for double-byte\n    //               encoding of 0208. Lead byte ranges: 0x81-0x9F, 0xE0-0xEF; Trail byte ranges: 0x40-0x7E, 0x80-0x9E, 0x9F-0xFC.\n    //               Windows CP932 is a superset of Shift_JIS. Some companies added more chars, notably KDDI.\n    //  * EUC-JP:    Up to 3 bytes per character. Used mostly on *nixes.\n    //               0x00-0x7F       - lower part of 0201\n    //               0x8E, 0xA1-0xDF - upper part of 0201\n    //               (0xA1-0xFE)x2   - 0208 plane (94x94).\n    //               0x8F, (0xA1-0xFE)x2 - 0212 plane (94x94).\n    //  * JIS X 208: 7-bit, direct encoding of 0208. Byte ranges: 0x21-0x7E (94 values). Uncommon.\n    //               Used as-is in ISO2022 family.\n    //  * ISO2022-JP: Stateful encoding, with escape sequences to switch between ASCII, \n    //                0201-1976 Roman, 0208-1978, 0208-1983.\n    //  * ISO2022-JP-1: Adds esc seq for 0212-1990.\n    //  * ISO2022-JP-2: Adds esc seq for GB2313-1980, KSX1001-1992, ISO8859-1, ISO8859-7.\n    //  * ISO2022-JP-3: Adds esc seq for 0201-1976 Kana set, 0213-2000 Planes 1, 2.\n    //  * ISO2022-JP-2004: Adds 0213-2004 Plane 1.\n    //\n    // After JIS X 0213 appeared, Shift_JIS-2004, EUC-JISX0213 and ISO2022-JP-2004 followed, with just changing the planes.\n    //\n    // Overall, it seems that it's a mess :( http://www8.plala.or.jp/tkubota1/unicode-symbols-map2.html\n\n    'shiftjis': {\n        type: '_dbcs',\n        table: function() { return __webpack_require__(721) },\n        encodeAdd: {'\\u00a5': 0x5C, '\\u203E': 0x7E},\n        encodeSkipVals: [{from: 0xED40, to: 0xF940}],\n    },\n    'csshiftjis': 'shiftjis',\n    'mskanji': 'shiftjis',\n    'sjis': 'shiftjis',\n    'windows31j': 'shiftjis',\n    'ms31j': 'shiftjis',\n    'xsjis': 'shiftjis',\n    'windows932': 'shiftjis',\n    'ms932': 'shiftjis',\n    '932': 'shiftjis',\n    'cp932': 'shiftjis',\n\n    'eucjp': {\n        type: '_dbcs',\n        table: function() { return __webpack_require__(719) },\n        encodeAdd: {'\\u00a5': 0x5C, '\\u203E': 0x7E},\n    },\n\n    // TODO: KDDI extension to Shift_JIS\n    // TODO: IBM CCSID 942 = CP932, but F0-F9 custom chars and other char changes.\n    // TODO: IBM CCSID 943 = Shift_JIS = CP932 with original Shift_JIS lower 128 chars.\n\n\n    // == Chinese/GBK ==========================================================\n    // http://en.wikipedia.org/wiki/GBK\n    // We mostly implement W3C recommendation: https://www.w3.org/TR/encoding/#gbk-encoder\n\n    // Oldest GB2312 (1981, ~7600 chars) is a subset of CP936\n    'gb2312': 'cp936',\n    'gb231280': 'cp936',\n    'gb23121980': 'cp936',\n    'csgb2312': 'cp936',\n    'csiso58gb231280': 'cp936',\n    'euccn': 'cp936',\n\n    // Microsoft's CP936 is a subset and approximation of GBK.\n    'windows936': 'cp936',\n    'ms936': 'cp936',\n    '936': 'cp936',\n    'cp936': {\n        type: '_dbcs',\n        table: function() { return __webpack_require__(277) },\n    },\n\n    // GBK (~22000 chars) is an extension of CP936 that added user-mapped chars and some other.\n    'gbk': {\n        type: '_dbcs',\n        table: function() { return __webpack_require__(277).concat(__webpack_require__(396)) },\n    },\n    'xgbk': 'gbk',\n    'isoir58': 'gbk',\n\n    // GB18030 is an algorithmic extension of GBK.\n    // Main source: https://www.w3.org/TR/encoding/#gbk-encoder\n    // http://icu-project.org/docs/papers/gb18030.html\n    // http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml\n    // http://www.khngai.com/chinese/charmap/tblgbk.php?page=0\n    'gb18030': {\n        type: '_dbcs',\n        table: function() { return __webpack_require__(277).concat(__webpack_require__(396)) },\n        gb18030: function() { return __webpack_require__(720) },\n        encodeSkipVals: [0x80],\n        encodeAdd: {'€': 0xA2E3},\n    },\n\n    'chinese': 'gb18030',\n\n\n    // == Korean ===============================================================\n    // EUC-KR, KS_C_5601 and KS X 1001 are exactly the same.\n    'windows949': 'cp949',\n    'ms949': 'cp949',\n    '949': 'cp949',\n    'cp949': {\n        type: '_dbcs',\n        table: function() { return __webpack_require__(718) },\n    },\n\n    'cseuckr': 'cp949',\n    'csksc56011987': 'cp949',\n    'euckr': 'cp949',\n    'isoir149': 'cp949',\n    'korean': 'cp949',\n    'ksc56011987': 'cp949',\n    'ksc56011989': 'cp949',\n    'ksc5601': 'cp949',\n\n\n    // == Big5/Taiwan/Hong Kong ================================================\n    // There are lots of tables for Big5 and cp950. Please see the following links for history:\n    // http://moztw.org/docs/big5/  http://www.haible.de/bruno/charsets/conversion-tables/Big5.html\n    // Variations, in roughly number of defined chars:\n    //  * Windows CP 950: Microsoft variant of Big5. Canonical: http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT\n    //  * Windows CP 951: Microsoft variant of Big5-HKSCS-2001. Seems to be never public. http://me.abelcheung.org/articles/research/what-is-cp951/\n    //  * Big5-2003 (Taiwan standard) almost superset of cp950.\n    //  * Unicode-at-on (UAO) / Mozilla 1.8. Falling out of use on the Web. Not supported by other browsers.\n    //  * Big5-HKSCS (-2001, -2004, -2008). Hong Kong standard. \n    //    many unicode code points moved from PUA to Supplementary plane (U+2XXXX) over the years.\n    //    Plus, it has 4 combining sequences.\n    //    Seems that Mozilla refused to support it for 10 yrs. https://bugzilla.mozilla.org/show_bug.cgi?id=162431 https://bugzilla.mozilla.org/show_bug.cgi?id=310299\n    //    because big5-hkscs is the only encoding to include astral characters in non-algorithmic way.\n    //    Implementations are not consistent within browsers; sometimes labeled as just big5.\n    //    MS Internet Explorer switches from big5 to big5-hkscs when a patch applied.\n    //    Great discussion & recap of what's going on https://bugzilla.mozilla.org/show_bug.cgi?id=912470#c31\n    //    In the encoder, it might make sense to support encoding old PUA mappings to Big5 bytes seq-s.\n    //    Official spec: http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/2003cmp_2008.txt\n    //                   http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/terms/doc/hkscs-2008-big5-iso.txt\n    // \n    // Current understanding of how to deal with Big5(-HKSCS) is in the Encoding Standard, http://encoding.spec.whatwg.org/#big5-encoder\n    // Unicode mapping (http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT) is said to be wrong.\n\n    'windows950': 'cp950',\n    'ms950': 'cp950',\n    '950': 'cp950',\n    'cp950': {\n        type: '_dbcs',\n        table: function() { return __webpack_require__(395) },\n    },\n\n    // Big5 has many variations and is an extension of cp950. We use Encoding Standard's as a consensus.\n    'big5': 'big5hkscs',\n    'big5hkscs': {\n        type: '_dbcs',\n        table: function() { return __webpack_require__(395).concat(__webpack_require__(717)) },\n        encodeSkipVals: [0xa2cc],\n    },\n\n    'cnbig5': 'big5hkscs',\n    'csbig5': 'big5hkscs',\n    'xxbig5': 'big5hkscs',\n};\n\n\n/***/ }),\n/* 712 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Update this array if you add/rename/remove files in this directory.\n// We support Browserify by skipping automatic module discovery and requiring modules directly.\nvar modules = [\n    __webpack_require__(713),\n    __webpack_require__(722),\n    __webpack_require__(723),\n    __webpack_require__(714),\n    __webpack_require__(716),\n    __webpack_require__(715),\n    __webpack_require__(710),\n    __webpack_require__(711),\n];\n\n// Put all encoding/alias/codec definitions to single object and export it. \nfor (var i = 0; i < modules.length; i++) {\n    var module = modules[i];\n    for (var enc in module)\n        if (Object.prototype.hasOwnProperty.call(module, enc))\n            exports[enc] = module[enc];\n}\n\n\n/***/ }),\n/* 713 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar Buffer = __webpack_require__(15).Buffer;\n\n// Export Node.js internal encodings.\n\nmodule.exports = {\n    // Encodings\n    utf8:   { type: \"_internal\", bomAware: true},\n    cesu8:  { type: \"_internal\", bomAware: true},\n    unicode11utf8: \"utf8\",\n\n    ucs2:   { type: \"_internal\", bomAware: true},\n    utf16le: \"ucs2\",\n\n    binary: { type: \"_internal\" },\n    base64: { type: \"_internal\" },\n    hex:    { type: \"_internal\" },\n\n    // Codec.\n    _internal: InternalCodec,\n};\n\n//------------------------------------------------------------------------------\n\nfunction InternalCodec(codecOptions, iconv) {\n    this.enc = codecOptions.encodingName;\n    this.bomAware = codecOptions.bomAware;\n\n    if (this.enc === \"base64\")\n        this.encoder = InternalEncoderBase64;\n    else if (this.enc === \"cesu8\") {\n        this.enc = \"utf8\"; // Use utf8 for decoding.\n        this.encoder = InternalEncoderCesu8;\n\n        // Add decoder for versions of Node not supporting CESU-8\n        if (Buffer.from('eda0bdedb2a9', 'hex').toString() !== '💩') {\n            this.decoder = InternalDecoderCesu8;\n            this.defaultCharUnicode = iconv.defaultCharUnicode;\n        }\n    }\n}\n\nInternalCodec.prototype.encoder = InternalEncoder;\nInternalCodec.prototype.decoder = InternalDecoder;\n\n//------------------------------------------------------------------------------\n\n// We use node.js internal decoder. Its signature is the same as ours.\nvar StringDecoder = __webpack_require__(333).StringDecoder;\n\nif (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method.\n    StringDecoder.prototype.end = function() {};\n\n\nfunction InternalDecoder(options, codec) {\n    StringDecoder.call(this, codec.enc);\n}\n\nInternalDecoder.prototype = StringDecoder.prototype;\n\n\n//------------------------------------------------------------------------------\n// Encoder is mostly trivial\n\nfunction InternalEncoder(options, codec) {\n    this.enc = codec.enc;\n}\n\nInternalEncoder.prototype.write = function(str) {\n    return Buffer.from(str, this.enc);\n}\n\nInternalEncoder.prototype.end = function() {\n}\n\n\n//------------------------------------------------------------------------------\n// Except base64 encoder, which must keep its state.\n\nfunction InternalEncoderBase64(options, codec) {\n    this.prevStr = '';\n}\n\nInternalEncoderBase64.prototype.write = function(str) {\n    str = this.prevStr + str;\n    var completeQuads = str.length - (str.length % 4);\n    this.prevStr = str.slice(completeQuads);\n    str = str.slice(0, completeQuads);\n\n    return Buffer.from(str, \"base64\");\n}\n\nInternalEncoderBase64.prototype.end = function() {\n    return Buffer.from(this.prevStr, \"base64\");\n}\n\n\n//------------------------------------------------------------------------------\n// CESU-8 encoder is also special.\n\nfunction InternalEncoderCesu8(options, codec) {\n}\n\nInternalEncoderCesu8.prototype.write = function(str) {\n    var buf = Buffer.alloc(str.length * 3), bufIdx = 0;\n    for (var i = 0; i < str.length; i++) {\n        var charCode = str.charCodeAt(i);\n        // Naive implementation, but it works because CESU-8 is especially easy\n        // to convert from UTF-16 (which all JS strings are encoded in).\n        if (charCode < 0x80)\n            buf[bufIdx++] = charCode;\n        else if (charCode < 0x800) {\n            buf[bufIdx++] = 0xC0 + (charCode >>> 6);\n            buf[bufIdx++] = 0x80 + (charCode & 0x3f);\n        }\n        else { // charCode will always be < 0x10000 in javascript.\n            buf[bufIdx++] = 0xE0 + (charCode >>> 12);\n            buf[bufIdx++] = 0x80 + ((charCode >>> 6) & 0x3f);\n            buf[bufIdx++] = 0x80 + (charCode & 0x3f);\n        }\n    }\n    return buf.slice(0, bufIdx);\n}\n\nInternalEncoderCesu8.prototype.end = function() {\n}\n\n//------------------------------------------------------------------------------\n// CESU-8 decoder is not implemented in Node v4.0+\n\nfunction InternalDecoderCesu8(options, codec) {\n    this.acc = 0;\n    this.contBytes = 0;\n    this.accBytes = 0;\n    this.defaultCharUnicode = codec.defaultCharUnicode;\n}\n\nInternalDecoderCesu8.prototype.write = function(buf) {\n    var acc = this.acc, contBytes = this.contBytes, accBytes = this.accBytes, \n        res = '';\n    for (var i = 0; i < buf.length; i++) {\n        var curByte = buf[i];\n        if ((curByte & 0xC0) !== 0x80) { // Leading byte\n            if (contBytes > 0) { // Previous code is invalid\n                res += this.defaultCharUnicode;\n                contBytes = 0;\n            }\n\n            if (curByte < 0x80) { // Single-byte code\n                res += String.fromCharCode(curByte);\n            } else if (curByte < 0xE0) { // Two-byte code\n                acc = curByte & 0x1F;\n                contBytes = 1; accBytes = 1;\n            } else if (curByte < 0xF0) { // Three-byte code\n                acc = curByte & 0x0F;\n                contBytes = 2; accBytes = 1;\n            } else { // Four or more are not supported for CESU-8.\n                res += this.defaultCharUnicode;\n            }\n        } else { // Continuation byte\n            if (contBytes > 0) { // We're waiting for it.\n                acc = (acc << 6) | (curByte & 0x3f);\n                contBytes--; accBytes++;\n                if (contBytes === 0) {\n                    // Check for overlong encoding, but support Modified UTF-8 (encoding NULL as C0 80)\n                    if (accBytes === 2 && acc < 0x80 && acc > 0)\n                        res += this.defaultCharUnicode;\n                    else if (accBytes === 3 && acc < 0x800)\n                        res += this.defaultCharUnicode;\n                    else\n                        // Actually add character.\n                        res += String.fromCharCode(acc);\n                }\n            } else { // Unexpected continuation byte\n                res += this.defaultCharUnicode;\n            }\n        }\n    }\n    this.acc = acc; this.contBytes = contBytes; this.accBytes = accBytes;\n    return res;\n}\n\nInternalDecoderCesu8.prototype.end = function() {\n    var res = 0;\n    if (this.contBytes > 0)\n        res += this.defaultCharUnicode;\n    return res;\n}\n\n\n/***/ }),\n/* 714 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar Buffer = __webpack_require__(15).Buffer;\n\n// Single-byte codec. Needs a 'chars' string parameter that contains 256 or 128 chars that\n// correspond to encoded bytes (if 128 - then lower half is ASCII). \n\nexports._sbcs = SBCSCodec;\nfunction SBCSCodec(codecOptions, iconv) {\n    if (!codecOptions)\n        throw new Error(\"SBCS codec is called without the data.\")\n    \n    // Prepare char buffer for decoding.\n    if (!codecOptions.chars || (codecOptions.chars.length !== 128 && codecOptions.chars.length !== 256))\n        throw new Error(\"Encoding '\"+codecOptions.type+\"' has incorrect 'chars' (must be of len 128 or 256)\");\n    \n    if (codecOptions.chars.length === 128) {\n        var asciiString = \"\";\n        for (var i = 0; i < 128; i++)\n            asciiString += String.fromCharCode(i);\n        codecOptions.chars = asciiString + codecOptions.chars;\n    }\n\n    this.decodeBuf = Buffer.from(codecOptions.chars, 'ucs2');\n    \n    // Encoding buffer.\n    var encodeBuf = Buffer.alloc(65536, iconv.defaultCharSingleByte.charCodeAt(0));\n\n    for (var i = 0; i < codecOptions.chars.length; i++)\n        encodeBuf[codecOptions.chars.charCodeAt(i)] = i;\n\n    this.encodeBuf = encodeBuf;\n}\n\nSBCSCodec.prototype.encoder = SBCSEncoder;\nSBCSCodec.prototype.decoder = SBCSDecoder;\n\n\nfunction SBCSEncoder(options, codec) {\n    this.encodeBuf = codec.encodeBuf;\n}\n\nSBCSEncoder.prototype.write = function(str) {\n    var buf = Buffer.alloc(str.length);\n    for (var i = 0; i < str.length; i++)\n        buf[i] = this.encodeBuf[str.charCodeAt(i)];\n    \n    return buf;\n}\n\nSBCSEncoder.prototype.end = function() {\n}\n\n\nfunction SBCSDecoder(options, codec) {\n    this.decodeBuf = codec.decodeBuf;\n}\n\nSBCSDecoder.prototype.write = function(buf) {\n    // Strings are immutable in JS -> we use ucs2 buffer to speed up computations.\n    var decodeBuf = this.decodeBuf;\n    var newBuf = Buffer.alloc(buf.length*2);\n    var idx1 = 0, idx2 = 0;\n    for (var i = 0; i < buf.length; i++) {\n        idx1 = buf[i]*2; idx2 = i*2;\n        newBuf[idx2] = decodeBuf[idx1];\n        newBuf[idx2+1] = decodeBuf[idx1+1];\n    }\n    return newBuf.toString('ucs2');\n}\n\nSBCSDecoder.prototype.end = function() {\n}\n\n\n/***/ }),\n/* 715 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Generated data for sbcs codec. Don't edit manually. Regenerate using generation/gen-sbcs.js script.\nmodule.exports = {\n  \"437\": \"cp437\",\n  \"737\": \"cp737\",\n  \"775\": \"cp775\",\n  \"850\": \"cp850\",\n  \"852\": \"cp852\",\n  \"855\": \"cp855\",\n  \"856\": \"cp856\",\n  \"857\": \"cp857\",\n  \"858\": \"cp858\",\n  \"860\": \"cp860\",\n  \"861\": \"cp861\",\n  \"862\": \"cp862\",\n  \"863\": \"cp863\",\n  \"864\": \"cp864\",\n  \"865\": \"cp865\",\n  \"866\": \"cp866\",\n  \"869\": \"cp869\",\n  \"874\": \"windows874\",\n  \"922\": \"cp922\",\n  \"1046\": \"cp1046\",\n  \"1124\": \"cp1124\",\n  \"1125\": \"cp1125\",\n  \"1129\": \"cp1129\",\n  \"1133\": \"cp1133\",\n  \"1161\": \"cp1161\",\n  \"1162\": \"cp1162\",\n  \"1163\": \"cp1163\",\n  \"1250\": \"windows1250\",\n  \"1251\": \"windows1251\",\n  \"1252\": \"windows1252\",\n  \"1253\": \"windows1253\",\n  \"1254\": \"windows1254\",\n  \"1255\": \"windows1255\",\n  \"1256\": \"windows1256\",\n  \"1257\": \"windows1257\",\n  \"1258\": \"windows1258\",\n  \"28591\": \"iso88591\",\n  \"28592\": \"iso88592\",\n  \"28593\": \"iso88593\",\n  \"28594\": \"iso88594\",\n  \"28595\": \"iso88595\",\n  \"28596\": \"iso88596\",\n  \"28597\": \"iso88597\",\n  \"28598\": \"iso88598\",\n  \"28599\": \"iso88599\",\n  \"28600\": \"iso885910\",\n  \"28601\": \"iso885911\",\n  \"28603\": \"iso885913\",\n  \"28604\": \"iso885914\",\n  \"28605\": \"iso885915\",\n  \"28606\": \"iso885916\",\n  \"windows874\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����\"\n  },\n  \"win874\": \"windows874\",\n  \"cp874\": \"windows874\",\n  \"windows1250\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙\"\n  },\n  \"win1250\": \"windows1250\",\n  \"cp1250\": \"windows1250\",\n  \"windows1251\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя\"\n  },\n  \"win1251\": \"windows1251\",\n  \"cp1251\": \"windows1251\",\n  \"windows1252\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"\n  },\n  \"win1252\": \"windows1252\",\n  \"cp1252\": \"windows1252\",\n  \"windows1253\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�\"\n  },\n  \"win1253\": \"windows1253\",\n  \"cp1253\": \"windows1253\",\n  \"windows1254\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ\"\n  },\n  \"win1254\": \"windows1254\",\n  \"cp1254\": \"windows1254\",\n  \"windows1255\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹֺֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�\"\n  },\n  \"win1255\": \"windows1255\",\n  \"cp1255\": \"windows1255\",\n  \"windows1256\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے\"\n  },\n  \"win1256\": \"windows1256\",\n  \"cp1256\": \"windows1256\",\n  \"windows1257\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙\"\n  },\n  \"win1257\": \"windows1257\",\n  \"cp1257\": \"windows1257\",\n  \"windows1258\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ\"\n  },\n  \"win1258\": \"windows1258\",\n  \"cp1258\": \"windows1258\",\n  \"iso88591\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"\n  },\n  \"cp28591\": \"iso88591\",\n  \"iso88592\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" Ą˘Ł¤ĽŚ§¨ŠŞŤŹ­ŽŻ°ą˛ł´ľśˇ¸šşťź˝žżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙\"\n  },\n  \"cp28592\": \"iso88592\",\n  \"iso88593\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" Ħ˘£¤�Ĥ§¨İŞĞĴ­�Ż°ħ²³´µĥ·¸ışğĵ½�żÀÁÂ�ÄĊĈÇÈÉÊËÌÍÎÏ�ÑÒÓÔĠÖ×ĜÙÚÛÜŬŜßàáâ�äċĉçèéêëìíîï�ñòóôġö÷ĝùúûüŭŝ˙\"\n  },\n  \"cp28593\": \"iso88593\",\n  \"iso88594\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ĄĸŖ¤ĨĻ§¨ŠĒĢŦ­Ž¯°ą˛ŗ´ĩļˇ¸šēģŧŊžŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎĪĐŅŌĶÔÕÖ×ØŲÚÛÜŨŪßāáâãäåæįčéęëėíîīđņōķôõö÷øųúûüũū˙\"\n  },\n  \"cp28594\": \"iso88594\",\n  \"iso88595\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ЁЂЃЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђѓєѕіїјљњћќ§ўџ\"\n  },\n  \"cp28595\": \"iso88595\",\n  \"iso88596\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ���¤�������،­�������������؛���؟�ءآأؤإئابةتثجحخدذرزسشصضطظعغ�����ـفقكلمنهوىيًٌٍَُِّْ�������������\"\n  },\n  \"cp28596\": \"iso88596\",\n  \"iso88597\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ‘’£€₯¦§¨©ͺ«¬­�―°±²³΄΅Ά·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�\"\n  },\n  \"cp28597\": \"iso88597\",\n  \"iso88598\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" �¢£¤¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾��������������������������������‗אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�\"\n  },\n  \"cp28598\": \"iso88598\",\n  \"iso88599\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖ×ØÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ\"\n  },\n  \"cp28599\": \"iso88599\",\n  \"iso885910\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ĄĒĢĪĨĶ§ĻĐŠŦŽ­ŪŊ°ąēģīĩķ·ļđšŧž―ūŋĀÁÂÃÄÅÆĮČÉĘËĖÍÎÏÐŅŌÓÔÕÖŨØŲÚÛÜÝÞßāáâãäåæįčéęëėíîïðņōóôõöũøųúûüýþĸ\"\n  },\n  \"cp28600\": \"iso885910\",\n  \"iso885911\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����\"\n  },\n  \"cp28601\": \"iso885911\",\n  \"iso885913\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ”¢£¤„¦§Ø©Ŗ«¬­®Æ°±²³“µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž’\"\n  },\n  \"cp28603\": \"iso885913\",\n  \"iso885914\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" Ḃḃ£ĊċḊ§Ẁ©ẂḋỲ­®ŸḞḟĠġṀṁ¶ṖẁṗẃṠỳẄẅṡÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŴÑÒÓÔÕÖṪØÙÚÛÜÝŶßàáâãäåæçèéêëìíîïŵñòóôõöṫøùúûüýŷÿ\"\n  },\n  \"cp28604\": \"iso885914\",\n  \"iso885915\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ¡¢£€¥Š§š©ª«¬­®¯°±²³Žµ¶·ž¹º»ŒœŸ¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"\n  },\n  \"cp28605\": \"iso885915\",\n  \"iso885916\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ĄąŁ€„Š§š©Ș«Ź­źŻ°±ČłŽ”¶·žčș»ŒœŸżÀÁÂĂÄĆÆÇÈÉÊËÌÍÎÏĐŃÒÓÔŐÖŚŰÙÚÛÜĘȚßàáâăäćæçèéêëìíîïđńòóôőöśűùúûüęțÿ\"\n  },\n  \"cp28606\": \"iso885916\",\n  \"cp437\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm437\": \"cp437\",\n  \"csibm437\": \"cp437\",\n  \"cp737\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm737\": \"cp737\",\n  \"csibm737\": \"cp737\",\n  \"cp775\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ĆüéāäģåćłēŖŗīŹÄÅÉæÆōöĢ¢ŚśÖÜø£Ø×¤ĀĪóŻżź”¦©®¬½¼Ł«»░▒▓│┤ĄČĘĖ╣║╗╝ĮŠ┐└┴┬├─┼ŲŪ╚╔╩╦╠═╬Žąčęėįšųūž┘┌█▄▌▐▀ÓßŌŃõÕµńĶķĻļņĒŅ’­±“¾¶§÷„°∙·¹³²■ \"\n  },\n  \"ibm775\": \"cp775\",\n  \"csibm775\": \"cp775\",\n  \"cp850\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñÑªº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýÝ¯´­±‗¾¶§÷¸°¨·¹³²■ \"\n  },\n  \"ibm850\": \"cp850\",\n  \"csibm850\": \"cp850\",\n  \"cp852\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘę¬źČş«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ \"\n  },\n  \"ibm852\": \"cp852\",\n  \"csibm852\": \"cp852\",\n  \"cp855\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ђЂѓЃёЁєЄѕЅіІїЇјЈљЉњЊћЋќЌўЎџЏюЮъЪаАбБцЦдДеЕфФгГ«»░▒▓│┤хХиИ╣║╗╝йЙ┐└┴┬├─┼кК╚╔╩╦╠═╬¤лЛмМнНоОп┘┌█▄Пя▀ЯрРсСтТуУжЖвВьЬ№­ыЫзЗшШэЭщЩчЧ§■ \"\n  },\n  \"ibm855\": \"cp855\",\n  \"csibm855\": \"cp855\",\n  \"cp856\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"אבגדהוזחטיךכלםמןנסעףפץצקרשת�£�×����������®¬½¼�«»░▒▓│┤���©╣║╗╝¢¥┐└┴┬├─┼��╚╔╩╦╠═╬¤���������┘┌█▄¦�▀������µ�������¯´­±‗¾¶§÷¸°¨·¹³²■ \"\n  },\n  \"ibm856\": \"cp856\",\n  \"csibm856\": \"cp856\",\n  \"cp857\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞğ¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ \"\n  },\n  \"ibm857\": \"cp857\",\n  \"csibm857\": \"cp857\",\n  \"cp858\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñÑªº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈ€ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýÝ¯´­±‗¾¶§÷¸°¨·¹³²■ \"\n  },\n  \"ibm858\": \"cp858\",\n  \"csibm858\": \"cp858\",\n  \"cp860\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâãàÁçêÊèÍÔìÃÂÉÀÈôõòÚùÌÕÜ¢£Ù₧ÓáíóúñÑªº¿Ò¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm860\": \"cp860\",\n  \"csibm860\": \"cp860\",\n  \"cp861\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm861\": \"cp861\",\n  \"csibm861\": \"cp861\",\n  \"cp862\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"אבגדהוזחטיךכלםמןנסעףפץצקרשת¢£¥₧ƒáíóúñÑªº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm862\": \"cp862\",\n  \"csibm862\": \"cp862\",\n  \"cp863\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâÂà¶çêëèïî‗À§ÉÈÊôËÏûù¤ÔÜ¢£ÙÛƒ¦´óú¨¸³¯Î⌐¬½¼¾«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm863\": \"cp863\",\n  \"csibm863\": \"cp863\",\n  \"cp864\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$٪&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~°·∙√▒─│┼┤┬├┴┐┌└┘β∞φ±½¼≈«»ﻷﻸ��ﻻﻼ� ­ﺂ£¤ﺄ��ﺎﺏﺕﺙ،ﺝﺡﺥ٠١٢٣٤٥٦٧٨٩ﻑ؛ﺱﺵﺹ؟¢ﺀﺁﺃﺅﻊﺋﺍﺑﺓﺗﺛﺟﺣﺧﺩﺫﺭﺯﺳﺷﺻﺿﻁﻅﻋﻏ¦¬÷×ﻉـﻓﻗﻛﻟﻣﻧﻫﻭﻯﻳﺽﻌﻎﻍﻡﹽّﻥﻩﻬﻰﻲﻐﻕﻵﻶﻝﻙﻱ■�\"\n  },\n  \"ibm864\": \"cp864\",\n  \"csibm864\": \"cp864\",\n  \"cp865\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñÑªº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n  },\n  \"ibm865\": \"cp865\",\n  \"csibm865\": \"cp865\",\n  \"cp866\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ \"\n  },\n  \"ibm866\": \"cp866\",\n  \"csibm866\": \"cp866\",\n  \"cp869\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"������Ά�·¬¦‘’Έ―ΉΊΪΌ��ΎΫ©Ώ²³ά£έήίϊΐόύΑΒΓΔΕΖΗ½ΘΙ«»░▒▓│┤ΚΛΜΝ╣║╗╝ΞΟ┐└┴┬├─┼ΠΡ╚╔╩╦╠═╬ΣΤΥΦΧΨΩαβγ┘┌█▄δε▀ζηθικλμνξοπρσςτ΄­±υφχ§ψ΅°¨ωϋΰώ■ \"\n  },\n  \"ibm869\": \"cp869\",\n  \"csibm869\": \"cp869\",\n  \"cp922\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ¡¢£¤¥¦§¨©ª«¬­®‾°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏŠÑÒÓÔÕÖ×ØÙÚÛÜÝŽßàáâãäåæçèéêëìíîïšñòóôõö÷øùúûüýžÿ\"\n  },\n  \"ibm922\": \"cp922\",\n  \"csibm922\": \"cp922\",\n  \"cp1046\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ﺈ×÷ﹱ■│─┐┌└┘ﹹﹻﹽﹿﹷﺊﻰﻳﻲﻎﻏﻐﻶﻸﻺﻼ ¤ﺋﺑﺗﺛﺟﺣ،­ﺧﺳ٠١٢٣٤٥٦٧٨٩ﺷ؛ﺻﺿﻊ؟ﻋءآأؤإئابةتثجحخدذرزسشصضطﻇعغﻌﺂﺄﺎﻓـفقكلمنهوىيًٌٍَُِّْﻗﻛﻟﻵﻷﻹﻻﻣﻧﻬﻩ�\"\n  },\n  \"ibm1046\": \"cp1046\",\n  \"csibm1046\": \"cp1046\",\n  \"cp1124\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ЁЂҐЄЅІЇЈЉЊЋЌ­ЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя№ёђґєѕіїјљњћќ§ўџ\"\n  },\n  \"ibm1124\": \"cp1124\",\n  \"csibm1124\": \"cp1124\",\n  \"cp1125\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёҐґЄєІіЇї·√№¤■ \"\n  },\n  \"ibm1125\": \"cp1125\",\n  \"csibm1125\": \"cp1125\",\n  \"cp1129\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ¡¢£¤¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ\"\n  },\n  \"ibm1129\": \"cp1129\",\n  \"csibm1129\": \"cp1129\",\n  \"cp1133\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ກຂຄງຈສຊຍດຕຖທນບປຜຝພຟມຢຣລວຫອຮ���ຯະາຳິີຶືຸູຼັົຽ���ເແໂໃໄ່້໊໋໌ໍໆ�ໜໝ₭����������������໐໑໒໓໔໕໖໗໘໙��¢¬¦�\"\n  },\n  \"ibm1133\": \"cp1133\",\n  \"csibm1133\": \"cp1133\",\n  \"cp1161\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"��������������������������������่กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู้๊๋€฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛¢¬¦ \"\n  },\n  \"ibm1161\": \"cp1161\",\n  \"csibm1161\": \"cp1161\",\n  \"cp1162\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"€…‘’“”•–— กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����\"\n  },\n  \"ibm1162\": \"cp1162\",\n  \"csibm1162\": \"cp1162\",\n  \"cp1163\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ¡¢£€¥¦§œ©ª«¬­®¯°±²³Ÿµ¶·Œ¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖ×ØÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ\"\n  },\n  \"ibm1163\": \"cp1163\",\n  \"csibm1163\": \"cp1163\",\n  \"maccroatian\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø¿¡¬√ƒ≈Ć«Č… ÀÃÕŒœĐ—“”‘’÷◊�©⁄¤‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ\"\n  },\n  \"maccyrillic\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤\"\n  },\n  \"macgreek\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"Ä¹²É³ÖÜ΅àâä΄¨çéèêë£™îï•½‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�\"\n  },\n  \"maciceland\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\"\n  },\n  \"macroman\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›ﬁﬂ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\"\n  },\n  \"macromania\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂŞ∞±≤≥¥µ∂∑∏π∫ªºΩăş¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›Ţţ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\"\n  },\n  \"macthai\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"«»…“”�•‘’� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู﻿​–—฿เแโใไๅๆ็่้๊๋์ํ™๏๐๑๒๓๔๕๖๗๘๙®©����\"\n  },\n  \"macturkish\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ\"\n  },\n  \"macukraine\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤\"\n  },\n  \"koi8r\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ё╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡Ё╢╣╤╥╦╧╨╩╪╫╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ\"\n  },\n  \"koi8u\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґ╝╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪Ґ╬©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ\"\n  },\n  \"koi8ru\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"─│┌┐└┘├┤┬┴┼▀▄█▌▐░▒▓⌠■∙√≈≤≥ ⌡°²·÷═║╒ёє╔ії╗╘╙╚╛ґў╞╟╠╡ЁЄ╣ІЇ╦╧╨╩╪ҐЎ©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ\"\n  },\n  \"koi8t\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"қғ‚Ғ„…†‡�‰ҳ‹ҲҷҶ�Қ‘’“”•–—�™�›�����ӯӮё¤ӣ¦§���«¬­®�°±²Ё�Ӣ¶·�№�»���©юабцдефгхийклмнопярстужвьызшэщчъЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧЪ\"\n  },\n  \"armscii8\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" �և։)(»«—.՝,-֊…՜՛՞ԱաԲբԳգԴդԵեԶզԷէԸըԹթԺժԻիԼլԽխԾծԿկՀհՁձՂղՃճՄմՅյՆնՇշՈոՉչՊպՋջՌռՍսՎվՏտՐրՑցՒւՓփՔքՕօՖֆ՚�\"\n  },\n  \"rk1048\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ЂЃ‚ѓ„…†‡€‰Љ‹ЊҚҺЏђ‘’“”•–—�™љ›њқһџ ҰұӘ¤Ө¦§Ё©Ғ«¬­®Ү°±Ііөµ¶·ё№ғ»әҢңүАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя\"\n  },\n  \"tcvn\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000ÚỤ\\u0003ỪỬỮ\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010ỨỰỲỶỸÝỴ\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÀẢÃÁẠẶẬÈẺẼÉẸỆÌỈĨÍỊÒỎÕÓỌỘỜỞỠỚỢÙỦŨ ĂÂÊÔƠƯĐăâêôơưđẶ̀̀̉̃́àảãáạẲằẳẵắẴẮẦẨẪẤỀặầẩẫấậèỂẻẽéẹềểễếệìỉỄẾỒĩíịòỔỏõóọồổỗốộờởỡớợùỖủũúụừửữứựỳỷỹýỵỐ\"\n  },\n  \"georgianacademy\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზთიკლმნოპჟრსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"\n  },\n  \"georgianps\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿აბგდევზჱთიკლმნჲოპჟრსტჳუფქღყშჩცძწჭხჴჯჰჵæçèéêëìíîïðñòóôõö÷øùúûüýþÿ\"\n  },\n  \"pt154\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ҖҒӮғ„…ҶҮҲүҠӢҢҚҺҸҗ‘’“”•–—ҳҷҡӣңқһҹ ЎўЈӨҘҰ§Ё©Ә«¬ӯ®Ҝ°ұІіҙө¶·ё№ә»јҪҫҝАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя\"\n  },\n  \"viscii\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000\\u0001Ẳ\\u0003\\u0004ẴẪ\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013Ỷ\\u0015\\u0016\\u0017\\u0018Ỹ\\u001a\\u001b\\u001c\\u001dỴ\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ẠẮẰẶẤẦẨẬẼẸẾỀỂỄỆỐỒỔỖỘỢỚỜỞỊỎỌỈỦŨỤỲÕắằặấầẩậẽẹếềểễệốồổỗỠƠộờởịỰỨỪỬơớƯÀÁÂÃẢĂẳẵÈÉÊẺÌÍĨỳĐứÒÓÔạỷừửÙÚỹỵÝỡưàáâãảăữẫèéêẻìíĩỉđựòóôõỏọụùúũủýợỮ\"\n  },\n  \"iso646cn\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������\"\n  },\n  \"iso646jp\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`abcdefghijklmnopqrstuvwxyz{|}‾��������������������������������������������������������������������������������������������������������������������������������\"\n  },\n  \"hproman8\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \" ÀÂÈÊËÎÏ´ˋˆ¨˜ÙÛ₤¯Ýý°ÇçÑñ¡¿¤£¥§ƒ¢âêôûáéóúàèòùäëöüÅîØÆåíøæÄìÖÜÉïßÔÁÃãÐðÍÌÓÒÕõŠšÚŸÿÞþ·µ¶¾—¼½ªº«■»±�\"\n  },\n  \"macintosh\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›ﬁﬂ‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ\"\n  },\n  \"ascii\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"��������������������������������������������������������������������������������������������������������������������������������\"\n  },\n  \"tis620\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"���������������������������������กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����\"\n  }\n}\n\n/***/ }),\n/* 716 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Manually added data to be used by sbcs codec in addition to generated one.\n\nmodule.exports = {\n    // Not supported by iconv, not sure why.\n    \"10029\": \"maccenteuro\",\n    \"maccenteuro\": {\n        \"type\": \"_sbcs\",\n        \"chars\": \"ÄĀāÉĄÖÜáąČäčĆćéŹźĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņŃ¬√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ\"\n    },\n\n    \"808\": \"cp808\",\n    \"ibm808\": \"cp808\",\n    \"cp808\": {\n        \"type\": \"_sbcs\",\n        \"chars\": \"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№€■ \"\n    },\n\n    \"mik\": {\n        \"type\": \"_sbcs\",\n        \"chars\": \"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя└┴┬├─┼╣║╚╔╩╦╠═╬┐░▒▓│┤№§╗╝┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ \"\n    },\n\n    // Aliases of generated encodings.\n    \"ascii8bit\": \"ascii\",\n    \"usascii\": \"ascii\",\n    \"ansix34\": \"ascii\",\n    \"ansix341968\": \"ascii\",\n    \"ansix341986\": \"ascii\",\n    \"csascii\": \"ascii\",\n    \"cp367\": \"ascii\",\n    \"ibm367\": \"ascii\",\n    \"isoir6\": \"ascii\",\n    \"iso646us\": \"ascii\",\n    \"iso646irv\": \"ascii\",\n    \"us\": \"ascii\",\n\n    \"latin1\": \"iso88591\",\n    \"latin2\": \"iso88592\",\n    \"latin3\": \"iso88593\",\n    \"latin4\": \"iso88594\",\n    \"latin5\": \"iso88599\",\n    \"latin6\": \"iso885910\",\n    \"latin7\": \"iso885913\",\n    \"latin8\": \"iso885914\",\n    \"latin9\": \"iso885915\",\n    \"latin10\": \"iso885916\",\n\n    \"csisolatin1\": \"iso88591\",\n    \"csisolatin2\": \"iso88592\",\n    \"csisolatin3\": \"iso88593\",\n    \"csisolatin4\": \"iso88594\",\n    \"csisolatincyrillic\": \"iso88595\",\n    \"csisolatinarabic\": \"iso88596\",\n    \"csisolatingreek\" : \"iso88597\",\n    \"csisolatinhebrew\": \"iso88598\",\n    \"csisolatin5\": \"iso88599\",\n    \"csisolatin6\": \"iso885910\",\n\n    \"l1\": \"iso88591\",\n    \"l2\": \"iso88592\",\n    \"l3\": \"iso88593\",\n    \"l4\": \"iso88594\",\n    \"l5\": \"iso88599\",\n    \"l6\": \"iso885910\",\n    \"l7\": \"iso885913\",\n    \"l8\": \"iso885914\",\n    \"l9\": \"iso885915\",\n    \"l10\": \"iso885916\",\n\n    \"isoir14\": \"iso646jp\",\n    \"isoir57\": \"iso646cn\",\n    \"isoir100\": \"iso88591\",\n    \"isoir101\": \"iso88592\",\n    \"isoir109\": \"iso88593\",\n    \"isoir110\": \"iso88594\",\n    \"isoir144\": \"iso88595\",\n    \"isoir127\": \"iso88596\",\n    \"isoir126\": \"iso88597\",\n    \"isoir138\": \"iso88598\",\n    \"isoir148\": \"iso88599\",\n    \"isoir157\": \"iso885910\",\n    \"isoir166\": \"tis620\",\n    \"isoir179\": \"iso885913\",\n    \"isoir199\": \"iso885914\",\n    \"isoir203\": \"iso885915\",\n    \"isoir226\": \"iso885916\",\n\n    \"cp819\": \"iso88591\",\n    \"ibm819\": \"iso88591\",\n\n    \"cyrillic\": \"iso88595\",\n\n    \"arabic\": \"iso88596\",\n    \"arabic8\": \"iso88596\",\n    \"ecma114\": \"iso88596\",\n    \"asmo708\": \"iso88596\",\n\n    \"greek\" : \"iso88597\",\n    \"greek8\" : \"iso88597\",\n    \"ecma118\" : \"iso88597\",\n    \"elot928\" : \"iso88597\",\n\n    \"hebrew\": \"iso88598\",\n    \"hebrew8\": \"iso88598\",\n\n    \"turkish\": \"iso88599\",\n    \"turkish8\": \"iso88599\",\n\n    \"thai\": \"iso885911\",\n    \"thai8\": \"iso885911\",\n\n    \"celtic\": \"iso885914\",\n    \"celtic8\": \"iso885914\",\n    \"isoceltic\": \"iso885914\",\n\n    \"tis6200\": \"tis620\",\n    \"tis62025291\": \"tis620\",\n    \"tis62025330\": \"tis620\",\n\n    \"10000\": \"macroman\",\n    \"10006\": \"macgreek\",\n    \"10007\": \"maccyrillic\",\n    \"10079\": \"maciceland\",\n    \"10081\": \"macturkish\",\n\n    \"cspc8codepage437\": \"cp437\",\n    \"cspc775baltic\": \"cp775\",\n    \"cspc850multilingual\": \"cp850\",\n    \"cspcp852\": \"cp852\",\n    \"cspc862latinhebrew\": \"cp862\",\n    \"cpgr\": \"cp869\",\n\n    \"msee\": \"cp1250\",\n    \"mscyrl\": \"cp1251\",\n    \"msansi\": \"cp1252\",\n    \"msgreek\": \"cp1253\",\n    \"msturk\": \"cp1254\",\n    \"mshebr\": \"cp1255\",\n    \"msarab\": \"cp1256\",\n    \"winbaltrim\": \"cp1257\",\n\n    \"cp20866\": \"koi8r\",\n    \"20866\": \"koi8r\",\n    \"ibm878\": \"koi8r\",\n    \"cskoi8r\": \"koi8r\",\n\n    \"cp21866\": \"koi8u\",\n    \"21866\": \"koi8u\",\n    \"ibm1168\": \"koi8u\",\n\n    \"strk10482002\": \"rk1048\",\n\n    \"tcvn5712\": \"tcvn\",\n    \"tcvn57121\": \"tcvn\",\n\n    \"gb198880\": \"iso646cn\",\n    \"cn\": \"iso646cn\",\n\n    \"csiso14jisc6220ro\": \"iso646jp\",\n    \"jisc62201969ro\": \"iso646jp\",\n    \"jp\": \"iso646jp\",\n\n    \"cshproman8\": \"hproman8\",\n    \"r8\": \"hproman8\",\n    \"roman8\": \"hproman8\",\n    \"xroman8\": \"hproman8\",\n    \"ibm1051\": \"hproman8\",\n\n    \"mac\": \"macintosh\",\n    \"csmacintosh\": \"macintosh\",\n};\n\n\n\n/***/ }),\n/* 717 */\n/***/ (function(module, exports) {\n\nmodule.exports = [[\"8740\",\"䏰䰲䘃䖦䕸𧉧䵷䖳𧲱䳢𧳅㮕䜶䝄䱇䱀𤊿𣘗𧍒𦺋𧃒䱗𪍑䝏䗚䲅𧱬䴇䪤䚡𦬣爥𥩔𡩣𣸆𣽡晍囻\"],[\"8767\",\"綕夝𨮹㷴霴𧯯寛𡵞媤㘥𩺰嫑宷峼杮薓𩥅瑡璝㡵𡵓𣚞𦀡㻬\"],[\"87a1\",\"𥣞㫵竼龗𤅡𨤍𣇪𠪊𣉞䌊蒄龖鐯䤰蘓墖靊鈘秐稲晠権袝瑌篅枂稬剏遆㓦珄𥶹瓆鿇垳䤯呌䄱𣚎堘穲𧭥讏䚮𦺈䆁𥶙箮𢒼鿈𢓁𢓉𢓌鿉蔄𣖻䂴鿊䓡𪷿拁灮鿋\"],[\"8840\",\"㇀\",4,\"𠄌㇅𠃑𠃍㇆㇇𠃋𡿨㇈𠃊㇉㇊㇋㇌𠄎㇍㇎ĀÁǍÀĒÉĚÈŌÓǑÒ࿿Ê̄Ế࿿Ê̌ỀÊāáǎàɑēéěèīíǐìōóǒòūúǔùǖǘǚ\"],[\"88a1\",\"ǜü࿿ê̄ế࿿ê̌ềêɡ⏚⏛\"],[\"8940\",\"𪎩𡅅\"],[\"8943\",\"攊\"],[\"8946\",\"丽滝鵎釟\"],[\"894c\",\"𧜵撑会伨侨兖兴农凤务动医华发变团声处备夲头学实実岚庆总斉柾栄桥济炼电纤纬纺织经统缆缷艺苏药视设询车轧轮\"],[\"89a1\",\"琑糼緍楆竉刧\"],[\"89ab\",\"醌碸酞肼\"],[\"89b0\",\"贋胶𠧧\"],[\"89b5\",\"肟黇䳍鷉鸌䰾𩷶𧀎鸊𪄳㗁\"],[\"89c1\",\"溚舾甙\"],[\"89c5\",\"䤑马骏龙禇𨑬𡷊𠗐𢫦两亁亀亇亿仫伷㑌侽㹈倃傈㑽㒓㒥円夅凛凼刅争剹劐匧㗇厩㕑厰㕓参吣㕭㕲㚁咓咣咴咹哐哯唘唣唨㖘唿㖥㖿嗗㗅\"],[\"8a40\",\"𧶄唥\"],[\"8a43\",\"𠱂𠴕𥄫喐𢳆㧬𠍁蹆𤶸𩓥䁓𨂾睺𢰸㨴䟕𨅝𦧲𤷪擝𠵼𠾴𠳕𡃴撍蹾𠺖𠰋𠽤𢲩𨉖𤓓\"],[\"8a64\",\"𠵆𩩍𨃩䟴𤺧𢳂骲㩧𩗴㿭㔆𥋇𩟔𧣈𢵄鵮頕\"],[\"8a76\",\"䏙𦂥撴哣𢵌𢯊𡁷㧻𡁯\"],[\"8aa1\",\"𦛚𦜖𧦠擪𥁒𠱃蹨𢆡𨭌𠜱\"],[\"8aac\",\"䠋𠆩㿺塳𢶍\"],[\"8ab2\",\"𤗈𠓼𦂗𠽌𠶖啹䂻䎺\"],[\"8abb\",\"䪴𢩦𡂝膪飵𠶜捹㧾𢝵跀嚡摼㹃\"],[\"8ac9\",\"𪘁𠸉𢫏𢳉\"],[\"8ace\",\"𡃈𣧂㦒㨆𨊛㕸𥹉𢃇噒𠼱𢲲𩜠㒼氽𤸻\"],[\"8adf\",\"𧕴𢺋𢈈𪙛𨳍𠹺𠰴𦠜羓𡃏𢠃𢤹㗻𥇣𠺌𠾍𠺪㾓𠼰𠵇𡅏𠹌\"],[\"8af6\",\"𠺫𠮩𠵈𡃀𡄽㿹𢚖搲𠾭\"],[\"8b40\",\"𣏴𧘹𢯎𠵾𠵿𢱑𢱕㨘𠺘𡃇𠼮𪘲𦭐𨳒𨶙𨳊閪哌苄喹\"],[\"8b55\",\"𩻃鰦骶𧝞𢷮煀腭胬尜𦕲脴㞗卟𨂽醶𠻺𠸏𠹷𠻻㗝𤷫㘉𠳖嚯𢞵𡃉𠸐𠹸𡁸𡅈𨈇𡑕𠹹𤹐𢶤婔𡀝𡀞𡃵𡃶垜𠸑\"],[\"8ba1\",\"𧚔𨋍𠾵𠹻𥅾㜃𠾶𡆀𥋘𪊽𤧚𡠺𤅷𨉼墙剨㘚𥜽箲孨䠀䬬鼧䧧鰟鮍𥭴𣄽嗻㗲嚉丨夂𡯁屮靑𠂆乛亻㔾尣彑忄㣺扌攵歺氵氺灬爫丬犭𤣩罒礻糹罓𦉪㓁\"],[\"8bde\",\"𦍋耂肀𦘒𦥑卝衤见𧢲讠贝钅镸长门𨸏韦页风飞饣𩠐鱼鸟黄歯龜丷𠂇阝户钢\"],[\"8c40\",\"倻淾𩱳龦㷉袏𤅎灷峵䬠𥇍㕙𥴰愢𨨲辧釶熑朙玺𣊁𪄇㲋𡦀䬐磤琂冮𨜏䀉橣𪊺䈣蘏𠩯稪𩥇𨫪靕灍匤𢁾鏴盙𨧣龧矝亣俰傼丯众龨吴綋墒壐𡶶庒庙忂𢜒斋\"],[\"8ca1\",\"𣏹椙橃𣱣泿\"],[\"8ca7\",\"爀𤔅玌㻛𤨓嬕璹讃𥲤𥚕窓篬糃繬苸薗龩袐龪躹龫迏蕟駠鈡龬𨶹𡐿䁱䊢娚\"],[\"8cc9\",\"顨杫䉶圽\"],[\"8cce\",\"藖𤥻芿𧄍䲁𦵴嵻𦬕𦾾龭龮宖龯曧繛湗秊㶈䓃𣉖𢞖䎚䔶\"],[\"8ce6\",\"峕𣬚諹屸㴒𣕑嵸龲煗䕘𤃬𡸣䱷㥸㑊𠆤𦱁諌侴𠈹妿腬顖𩣺弻\"],[\"8d40\",\"𠮟\"],[\"8d42\",\"𢇁𨥭䄂䚻𩁹㼇龳𪆵䃸㟖䛷𦱆䅼𨚲𧏿䕭㣔𥒚䕡䔛䶉䱻䵶䗪㿈𤬏㙡䓞䒽䇭崾嵈嵖㷼㠏嶤嶹㠠㠸幂庽弥徃㤈㤔㤿㥍惗愽峥㦉憷憹懏㦸戬抐拥挘㧸嚱\"],[\"8da1\",\"㨃揢揻搇摚㩋擀崕嘡龟㪗斆㪽旿晓㫲暒㬢朖㭂枤栀㭘桊梄㭲㭱㭻椉楃牜楤榟榅㮼槖㯝橥橴橱檂㯬檙㯲檫檵櫔櫶殁毁毪汵沪㳋洂洆洦涁㳯涤涱渕渘温溆𨧀溻滢滚齿滨滩漤漴㵆𣽁澁澾㵪㵵熷岙㶊瀬㶑灐灔灯灿炉𠌥䏁㗱𠻘\"],[\"8e40\",\"𣻗垾𦻓焾𥟠㙎榢𨯩孴穉𥣡𩓙穥穽𥦬窻窰竂竃燑𦒍䇊竚竝竪䇯咲𥰁笋筕笩𥌎𥳾箢筯莜𥮴𦱿篐萡箒箸𥴠㶭𥱥蒒篺簆簵𥳁籄粃𤢂粦晽𤕸糉糇糦籴糳糵糎\"],[\"8ea1\",\"繧䔝𦹄絝𦻖璍綉綫焵綳緒𤁗𦀩緤㴓緵𡟹緥𨍭縝𦄡𦅚繮纒䌫鑬縧罀罁罇礶𦋐駡羗𦍑羣𡙡𠁨䕜𣝦䔃𨌺翺𦒉者耈耝耨耯𪂇𦳃耻耼聡𢜔䦉𦘦𣷣𦛨朥肧𨩈脇脚墰𢛶汿𦒘𤾸擧𡒊舘𡡞橓𤩥𤪕䑺舩𠬍𦩒𣵾俹𡓽蓢荢𦬊𤦧𣔰𡝳𣷸芪椛芳䇛\"],[\"8f40\",\"蕋苐茚𠸖𡞴㛁𣅽𣕚艻苢茘𣺋𦶣𦬅𦮗𣗎㶿茝嗬莅䔋𦶥莬菁菓㑾𦻔橗蕚㒖𦹂𢻯葘𥯤葱㷓䓤檧葊𣲵祘蒨𦮖𦹷𦹃蓞萏莑䒠蒓蓤𥲑䉀𥳀䕃蔴嫲𦺙䔧蕳䔖枿蘖\"],[\"8fa1\",\"𨘥𨘻藁𧂈蘂𡖂𧃍䕫䕪蘨㙈𡢢号𧎚虾蝱𪃸蟮𢰧螱蟚蠏噡虬桖䘏衅衆𧗠𣶹𧗤衞袜䙛袴袵揁装睷𧜏覇覊覦覩覧覼𨨥觧𧤤𧪽誜瞓釾誐𧩙竩𧬺𣾏䜓𧬸煼謌謟𥐰𥕥謿譌譍誩𤩺讐讛誯𡛟䘕衏貛𧵔𧶏貫㜥𧵓賖𧶘𧶽贒贃𡤐賛灜贑𤳉㻐起\"],[\"9040\",\"趩𨀂𡀔𤦊㭼𨆼𧄌竧躭躶軃鋔輙輭𨍥𨐒辥錃𪊟𠩐辳䤪𨧞𨔽𣶻廸𣉢迹𪀔𨚼𨔁𢌥㦀𦻗逷𨔼𧪾遡𨕬𨘋邨𨜓郄𨛦邮都酧㫰醩釄粬𨤳𡺉鈎沟鉁鉢𥖹銹𨫆𣲛𨬌𥗛\"],[\"90a1\",\"𠴱錬鍫𨫡𨯫炏嫃𨫢𨫥䥥鉄𨯬𨰹𨯿鍳鑛躼閅閦鐦閠濶䊹𢙺𨛘𡉼𣸮䧟氜陻隖䅬隣𦻕懚隶磵𨫠隽双䦡𦲸𠉴𦐐𩂯𩃥𤫑𡤕𣌊霱虂霶䨏䔽䖅𤫩灵孁霛靜𩇕靗孊𩇫靟鐥僐𣂷𣂼鞉鞟鞱鞾韀韒韠𥑬韮琜𩐳響韵𩐝𧥺䫑頴頳顋顦㬎𧅵㵑𠘰𤅜\"],[\"9140\",\"𥜆飊颷飈飇䫿𦴧𡛓喰飡飦飬鍸餹𤨩䭲𩡗𩤅駵騌騻騐驘𥜥㛄𩂱𩯕髠髢𩬅髴䰎鬔鬭𨘀倴鬴𦦨㣃𣁽魐魀𩴾婅𡡣鮎𤉋鰂鯿鰌𩹨鷔𩾷𪆒𪆫𪃡𪄣𪇟鵾鶃𪄴鸎梈\"],[\"91a1\",\"鷄𢅛𪆓𪈠𡤻𪈳鴹𪂹𪊴麐麕麞麢䴴麪麯𤍤黁㭠㧥㴝伲㞾𨰫鼂鼈䮖鐤𦶢鼗鼖鼹嚟嚊齅馸𩂋韲葿齢齩竜龎爖䮾𤥵𤦻煷𤧸𤍈𤩑玞𨯚𡣺禟𨥾𨸶鍩鏳𨩄鋬鎁鏋𨥬𤒹爗㻫睲穃烐𤑳𤏸煾𡟯炣𡢾𣖙㻇𡢅𥐯𡟸㜢𡛻𡠹㛡𡝴𡣑𥽋㜣𡛀坛𤨥𡏾𡊨\"],[\"9240\",\"𡏆𡒶蔃𣚦蔃葕𤦔𧅥𣸱𥕜𣻻𧁒䓴𣛮𩦝𦼦柹㜳㰕㷧塬𡤢栐䁗𣜿𤃡𤂋𤄏𦰡哋嚞𦚱嚒𠿟𠮨𠸍鏆𨬓鎜仸儫㠙𤐶亼𠑥𠍿佋侊𥙑婨𠆫𠏋㦙𠌊𠐔㐵伩𠋀𨺳𠉵諚𠈌亘\"],[\"92a1\",\"働儍侢伃𤨎𣺊佂倮偬傁俌俥偘僼兙兛兝兞湶𣖕𣸹𣺿浲𡢄𣺉冨凃𠗠䓝𠒣𠒒𠒑赺𨪜𠜎剙劤𠡳勡鍮䙺熌𤎌𠰠𤦬𡃤槑𠸝瑹㻞璙琔瑖玘䮎𤪼𤂍叐㖄爏𤃉喴𠍅响𠯆圝鉝雴鍦埝垍坿㘾壋媙𨩆𡛺𡝯𡜐娬妸銏婾嫏娒𥥆𡧳𡡡𤊕㛵洅瑃娡𥺃\"],[\"9340\",\"媁𨯗𠐓鏠璌𡌃焅䥲鐈𨧻鎽㞠尞岞幞幈𡦖𡥼𣫮廍孏𡤃𡤄㜁𡢠㛝𡛾㛓脪𨩇𡶺𣑲𨦨弌弎𡤧𡞫婫𡜻孄蘔𧗽衠恾𢡠𢘫忛㺸𢖯𢖾𩂈𦽳懀𠀾𠁆𢘛憙憘恵𢲛𢴇𤛔𩅍\"],[\"93a1\",\"摱𤙥𢭪㨩𢬢𣑐𩣪𢹸挷𪑛撶挱揑𤧣𢵧护𢲡搻敫楲㯴𣂎𣊭𤦉𣊫唍𣋠𡣙𩐿曎𣊉𣆳㫠䆐𥖄𨬢𥖏𡛼𥕛𥐥磮𣄃𡠪𣈴㑤𣈏𣆂𤋉暎𦴤晫䮓昰𧡰𡷫晣𣋒𣋡昞𥡲㣑𣠺𣞼㮙𣞢𣏾瓐㮖枏𤘪梶栞㯄檾㡣𣟕𤒇樳橒櫉欅𡤒攑梘橌㯗橺歗𣿀𣲚鎠鋲𨯪𨫋\"],[\"9440\",\"銉𨀞𨧜鑧涥漋𤧬浧𣽿㶏渄𤀼娽渊塇洤硂焻𤌚𤉶烱牐犇犔𤞏𤜥兹𤪤𠗫瑺𣻸𣙟𤩊𤤗𥿡㼆㺱𤫟𨰣𣼵悧㻳瓌琼鎇琷䒟𦷪䕑疃㽣𤳙𤴆㽘畕癳𪗆㬙瑨𨫌𤦫𤦎㫻\"],[\"94a1\",\"㷍𤩎㻿𤧅𤣳釺圲鍂𨫣𡡤僟𥈡𥇧睸𣈲眎眏睻𤚗𣞁㩞𤣰琸璛㺿𤪺𤫇䃈𤪖𦆮錇𥖁砞碍碈磒珐祙𧝁𥛣䄎禛蒖禥樭𣻺稺秴䅮𡛦䄲鈵秱𠵌𤦌𠊙𣶺𡝮㖗啫㕰㚪𠇔𠰍竢婙𢛵𥪯𥪜娍𠉛磰娪𥯆竾䇹籝籭䈑𥮳𥺼𥺦糍𤧹𡞰粎籼粮檲緜縇緓罎𦉡\"],[\"9540\",\"𦅜𧭈綗𥺂䉪𦭵𠤖柖𠁎𣗏埄𦐒𦏸𤥢翝笧𠠬𥫩𥵃笌𥸎駦虅驣樜𣐿㧢𤧷𦖭騟𦖠蒀𧄧𦳑䓪脷䐂胆脉腂𦞴飃𦩂艢艥𦩑葓𦶧蘐𧈛媆䅿𡡀嬫𡢡嫤𡣘蚠蜨𣶏蠭𧐢娂\"],[\"95a1\",\"衮佅袇袿裦襥襍𥚃襔𧞅𧞄𨯵𨯙𨮜𨧹㺭蒣䛵䛏㟲訽訜𩑈彍鈫𤊄旔焩烄𡡅鵭貟賩𧷜妚矃姰䍮㛔踪躧𤰉輰轊䋴汘澻𢌡䢛潹溋𡟚鯩㚵𤤯邻邗啱䤆醻鐄𨩋䁢𨫼鐧𨰝𨰻蓥訫閙閧閗閖𨴴瑅㻂𤣿𤩂𤏪㻧𣈥随𨻧𨹦𨹥㻌𤧭𤩸𣿮琒瑫㻼靁𩂰\"],[\"9640\",\"桇䨝𩂓𥟟靝鍨𨦉𨰦𨬯𦎾銺嬑譩䤼珹𤈛鞛靱餸𠼦巁𨯅𤪲頟𩓚鋶𩗗釥䓀𨭐𤩧𨭤飜𨩅㼀鈪䤥萔餻饍𧬆㷽馛䭯馪驜𨭥𥣈檏騡嫾騯𩣱䮐𩥈馼䮽䮗鍽塲𡌂堢𤦸\"],[\"96a1\",\"𡓨硄𢜟𣶸棅㵽鑘㤧慐𢞁𢥫愇鱏鱓鱻鰵鰐魿鯏𩸭鮟𪇵𪃾鴡䲮𤄄鸘䲰鴌𪆴𪃭𪃳𩤯鶥蒽𦸒𦿟𦮂藼䔳𦶤𦺄𦷰萠藮𦸀𣟗𦁤秢𣖜𣙀䤭𤧞㵢鏛銾鍈𠊿碹鉷鑍俤㑀遤𥕝砽硔碶硋𡝗𣇉𤥁㚚佲濚濙瀞瀞吔𤆵垻壳垊鴖埗焴㒯𤆬燫𦱀𤾗嬨𡞵𨩉\"],[\"9740\",\"愌嫎娋䊼𤒈㜬䭻𨧼鎻鎸𡣖𠼝葲𦳀𡐓𤋺𢰦𤏁妔𣶷𦝁綨𦅛𦂤𤦹𤦋𨧺鋥珢㻩璴𨭣𡢟㻡𤪳櫘珳珻㻖𤨾𤪔𡟙𤩦𠎧𡐤𤧥瑈𤤖炥𤥶銄珦鍟𠓾錱𨫎𨨖鎆𨯧𥗕䤵𨪂煫\"],[\"97a1\",\"𤥃𠳿嚤𠘚𠯫𠲸唂秄𡟺緾𡛂𤩐𡡒䔮鐁㜊𨫀𤦭妰𡢿𡢃𧒄媡㛢𣵛㚰鉟婹𨪁𡡢鍴㳍𠪴䪖㦊僴㵩㵌𡎜煵䋻𨈘渏𩃤䓫浗𧹏灧沯㳖𣿭𣸭渂漌㵯𠏵畑㚼㓈䚀㻚䡱姄鉮䤾轁𨰜𦯀堒埈㛖𡑒烾𤍢𤩱𢿣𡊰𢎽梹楧𡎘𣓥𧯴𣛟𨪃𣟖𣏺𤲟樚𣚭𦲷萾䓟䓎\"],[\"9840\",\"𦴦𦵑𦲂𦿞漗𧄉茽𡜺菭𦲀𧁓𡟛妉媂𡞳婡婱𡤅𤇼㜭姯𡜼㛇熎鎐暚𤊥婮娫𤊓樫𣻹𧜶𤑛𤋊焝𤉙𨧡侰𦴨峂𤓎𧹍𤎽樌𤉖𡌄炦焳𤏩㶥泟勇𤩏繥姫崯㷳彜𤩝𡟟綤萦\"],[\"98a1\",\"咅𣫺𣌀𠈔坾𠣕𠘙㿥𡾞𪊶瀃𩅛嵰玏糓𨩙𩐠俈翧狍猐𧫴猸猹𥛶獁獈㺩𧬘遬燵𤣲珡臶㻊県㻑沢国琙琞琟㻢㻰㻴㻺瓓㼎㽓畂畭畲疍㽼痈痜㿀癍㿗癴㿜発𤽜熈嘣覀塩䀝睃䀹条䁅㗛瞘䁪䁯属瞾矋売砘点砜䂨砹硇硑硦葈𥔵礳栃礲䄃\"],[\"9940\",\"䄉禑禙辻稆込䅧窑䆲窼艹䇄竏竛䇏両筢筬筻簒簛䉠䉺类粜䊌粸䊔糭输烀𠳏総緔緐緽羮羴犟䎗耠耥笹耮耱联㷌垴炠肷胩䏭脌猪脎脒畠脔䐁㬹腖腙腚\"],[\"99a1\",\"䐓堺腼膄䐥膓䐭膥埯臁臤艔䒏芦艶苊苘苿䒰荗险榊萅烵葤惣蒈䔄蒾蓡蓸蔐蔸蕒䔻蕯蕰藠䕷虲蚒蚲蛯际螋䘆䘗袮裿褤襇覑𧥧訩訸誔誴豑賔賲贜䞘塟跃䟭仮踺嗘坔蹱嗵躰䠷軎転軤軭軲辷迁迊迌逳駄䢭飠鈓䤞鈨鉘鉫銱銮銿\"],[\"9a40\",\"鋣鋫鋳鋴鋽鍃鎄鎭䥅䥑麿鐗匁鐝鐭鐾䥪鑔鑹锭関䦧间阳䧥枠䨤靀䨵鞲韂噔䫤惨颹䬙飱塄餎餙冴餜餷饂饝饢䭰駅䮝騼鬏窃魩鮁鯝鯱鯴䱭鰠㝯𡯂鵉鰺\"],[\"9aa1\",\"黾噐鶓鶽鷀鷼银辶鹻麬麱麽黆铜黢黱黸竈齄𠂔𠊷𠎠椚铃妬𠓗塀铁㞹𠗕𠘕𠙶𡚺块煳𠫂𠫍𠮿呪吆𠯋咞𠯻𠰻𠱓𠱥𠱼惧𠲍噺𠲵𠳝𠳭𠵯𠶲𠷈楕鰯螥𠸄𠸎𠻗𠾐𠼭𠹳尠𠾼帋𡁜𡁏𡁶朞𡁻𡂈𡂖㙇𡂿𡃓𡄯𡄻卤蒭𡋣𡍵𡌶讁𡕷𡘙𡟃𡟇乸炻𡠭𡥪\"],[\"9b40\",\"𡨭𡩅𡰪𡱰𡲬𡻈拃𡻕𡼕熘桕𢁅槩㛈𢉼𢏗𢏺𢜪𢡱𢥏苽𢥧𢦓𢫕覥𢫨辠𢬎鞸𢬿顇骽𢱌\"],[\"9b62\",\"𢲈𢲷𥯨𢴈𢴒𢶷𢶕𢹂𢽴𢿌𣀳𣁦𣌟𣏞徱晈暿𧩹𣕧𣗳爁𤦺矗𣘚𣜖纇𠍆墵朎\"],[\"9ba1\",\"椘𣪧𧙗𥿢𣸑𣺹𧗾𢂚䣐䪸𤄙𨪚𤋮𤌍𤀻𤌴𤎖𤩅𠗊凒𠘑妟𡺨㮾𣳿𤐄𤓖垈𤙴㦛𤜯𨗨𩧉㝢𢇃譞𨭎駖𤠒𤣻𤨕爉𤫀𠱸奥𤺥𤾆𠝹軚𥀬劏圿煱𥊙𥐙𣽊𤪧喼𥑆𥑮𦭒釔㑳𥔿𧘲𥕞䜘𥕢𥕦𥟇𤤿𥡝偦㓻𣏌惞𥤃䝼𨥈𥪮𥮉𥰆𡶐垡煑澶𦄂𧰒遖𦆲𤾚譢𦐂𦑊\"],[\"9c40\",\"嵛𦯷輶𦒄𡤜諪𤧶𦒈𣿯𦔒䯀𦖿𦚵𢜛鑥𥟡憕娧晉侻嚹𤔡𦛼乪𤤴陖涏𦲽㘘襷𦞙𦡮𦐑𦡞營𦣇筂𩃀𠨑𦤦鄄𦤹穅鷰𦧺騦𦨭㙟𦑩𠀡禃𦨴𦭛崬𣔙菏𦮝䛐𦲤画补𦶮墶\"],[\"9ca1\",\"㜜𢖍𧁋𧇍㱔𧊀𧊅銁𢅺𧊋錰𧋦𤧐氹钟𧑐𠻸蠧裵𢤦𨑳𡞱溸𤨪𡠠㦤㚹尐秣䔿暶𩲭𩢤襃𧟌𧡘囖䃟𡘊㦡𣜯𨃨𡏅熭荦𧧝𩆨婧䲷𧂯𨦫𧧽𧨊𧬋𧵦𤅺筃祾𨀉澵𪋟樃𨌘厢𦸇鎿栶靝𨅯𨀣𦦵𡏭𣈯𨁈嶅𨰰𨂃圕頣𨥉嶫𤦈斾槕叒𤪥𣾁㰑朶𨂐𨃴𨄮𡾡𨅏\"],[\"9d40\",\"𨆉𨆯𨈚𨌆𨌯𨎊㗊𨑨𨚪䣺揦𨥖砈鉕𨦸䏲𨧧䏟𨧨𨭆𨯔姸𨰉輋𨿅𩃬筑𩄐𩄼㷷𩅞𤫊运犏嚋𩓧𩗩𩖰𩖸𩜲𩣑𩥉𩥪𩧃𩨨𩬎𩵚𩶛纟𩻸𩼣䲤镇𪊓熢𪋿䶑递𪗋䶜𠲜达嗁\"],[\"9da1\",\"辺𢒰边𤪓䔉繿潖檱仪㓤𨬬𧢝㜺躀𡟵𨀤𨭬𨮙𧨾𦚯㷫𧙕𣲷𥘵𥥖亚𥺁𦉘嚿𠹭踎孭𣺈𤲞揞拐𡟶𡡻攰嘭𥱊吚𥌑㷆𩶘䱽嘢嘞罉𥻘奵𣵀蝰东𠿪𠵉𣚺脗鵞贘瘻鱅癎瞹鍅吲腈苷嘥脲萘肽嗪祢噃吖𠺝㗎嘅嗱曱𨋢㘭甴嗰喺咗啲𠱁𠲖廐𥅈𠹶𢱢\"],[\"9e40\",\"𠺢麫絚嗞𡁵抝靭咔賍燶酶揼掹揾啩𢭃鱲𢺳冚㓟𠶧冧呍唞唓癦踭𦢊疱肶蠄螆裇膶萜𡃁䓬猄𤜆宐茋𦢓噻𢛴𧴯𤆣𧵳𦻐𧊶酰𡇙鈈𣳼𪚩𠺬𠻹牦𡲢䝎𤿂𧿹𠿫䃺\"],[\"9ea1\",\"鱝攟𢶠䣳𤟠𩵼𠿬𠸊恢𧖣𠿭\"],[\"9ead\",\"𦁈𡆇熣纎鵐业丄㕷嬍沲卧㚬㧜卽㚥𤘘墚𤭮舭呋垪𥪕𠥹\"],[\"9ec5\",\"㩒𢑥獴𩺬䴉鯭𣳾𩼰䱛𤾩𩖞𩿞葜𣶶𧊲𦞳𣜠挮紥𣻷𣸬㨪逈勌㹴㙺䗩𠒎癀嫰𠺶硺𧼮墧䂿噼鮋嵴癔𪐴麅䳡痹㟻愙𣃚𤏲\"],[\"9ef5\",\"噝𡊩垧𤥣𩸆刴𧂮㖭汊鵼\"],[\"9f40\",\"籖鬹埞𡝬屓擓𩓐𦌵𧅤蚭𠴨𦴢𤫢𠵱\"],[\"9f4f\",\"凾𡼏嶎霃𡷑麁遌笟鬂峑箣扨挵髿篏鬪籾鬮籂粆鰕篼鬉鼗鰛𤤾齚啳寃俽麘俲剠㸆勑坧偖妷帒韈鶫轜呩鞴饀鞺匬愰\"],[\"9fa1\",\"椬叚鰊鴂䰻陁榀傦畆𡝭駚剳\"],[\"9fae\",\"酙隁酜\"],[\"9fb2\",\"酑𨺗捿𦴣櫊嘑醎畺抅𠏼獏籰𥰡𣳽\"],[\"9fc1\",\"𤤙盖鮝个𠳔莾衂\"],[\"9fc9\",\"届槀僭坺刟巵从氱𠇲伹咜哚劚趂㗾弌㗳\"],[\"9fdb\",\"歒酼龥鮗頮颴骺麨麄煺笔\"],[\"9fe7\",\"毺蠘罸\"],[\"9feb\",\"嘠𪙊蹷齓\"],[\"9ff0\",\"跔蹏鸜踁抂𨍽踨蹵竓𤩷稾磘泪詧瘇\"],[\"a040\",\"𨩚鼦泎蟖痃𪊲硓咢贌狢獱謭猂瓱賫𤪻蘯徺袠䒷\"],[\"a055\",\"𡠻𦸅\"],[\"a058\",\"詾𢔛\"],[\"a05b\",\"惽癧髗鵄鍮鮏蟵\"],[\"a063\",\"蠏賷猬霡鮰㗖犲䰇籑饊𦅙慙䰄麖慽\"],[\"a073\",\"坟慯抦戹拎㩜懢厪𣏵捤栂㗒\"],[\"a0a1\",\"嵗𨯂迚𨸹\"],[\"a0a6\",\"僙𡵆礆匲阸𠼻䁥\"],[\"a0ae\",\"矾\"],[\"a0b0\",\"糂𥼚糚稭聦聣絍甅瓲覔舚朌聢𧒆聛瓰脃眤覉𦟌畓𦻑螩蟎臈螌詉貭譃眫瓸蓚㘵榲趦\"],[\"a0d4\",\"覩瑨涹蟁𤀑瓧㷛煶悤憜㳑煢恷\"],[\"a0e2\",\"罱𨬭牐惩䭾删㰘𣳇𥻗𧙖𥔱𡥄𡋾𩤃𦷜𧂭峁𦆭𨨏𣙷𠃮𦡆𤼎䕢嬟𦍌齐麦𦉫\"],[\"a3c0\",\"␀\",31,\"␡\"],[\"c6a1\",\"①\",9,\"⑴\",9,\"ⅰ\",9,\"丶丿亅亠冂冖冫勹匸卩厶夊宀巛⼳广廴彐彡攴无疒癶辵隶¨ˆヽヾゝゞ〃仝々〆〇ー［］✽ぁ\",23],[\"c740\",\"す\",58,\"ァアィイ\"],[\"c7a1\",\"ゥ\",81,\"А\",5,\"ЁЖ\",4],[\"c840\",\"Л\",26,\"ёж\",25,\"⇧↸↹㇏𠃌乚𠂊刂䒑\"],[\"c8a1\",\"龰冈龱𧘇\"],[\"c8cd\",\"￢￤＇＂㈱№℡゛゜⺀⺄⺆⺇⺈⺊⺌⺍⺕⺜⺝⺥⺧⺪⺬⺮⺶⺼⺾⻆⻊⻌⻍⻏⻖⻗⻞⻣\"],[\"c8f5\",\"ʃɐɛɔɵœøŋʊɪ\"],[\"f9fe\",\"￭\"],[\"fa40\",\"𠕇鋛𠗟𣿅蕌䊵珯况㙉𤥂𨧤鍄𡧛苮𣳈砼杄拟𤤳𨦪𠊠𦮳𡌅侫𢓭倈𦴩𧪄𣘀𤪱𢔓倩𠍾徤𠎀𠍇滛𠐟偽儁㑺儎顬㝃萖𤦤𠒇兠𣎴兪𠯿𢃼𠋥𢔰𠖎𣈳𡦃宂蝽𠖳𣲙冲冸\"],[\"faa1\",\"鴴凉减凑㳜凓𤪦决凢卂凭菍椾𣜭彻刋刦刼劵剗劔効勅簕蕂勠蘍𦬓包𨫞啉滙𣾀𠥔𣿬匳卄𠯢泋𡜦栛珕恊㺪㣌𡛨燝䒢卭却𨚫卾卿𡖖𡘓矦厓𨪛厠厫厮玧𥝲㽙玜叁叅汉义埾叙㪫𠮏叠𣿫𢶣叶𠱷吓灹唫晗浛呭𦭓𠵴啝咏咤䞦𡜍𠻝㶴𠵍\"],[\"fb40\",\"𨦼𢚘啇䳭启琗喆喩嘅𡣗𤀺䕒𤐵暳𡂴嘷曍𣊊暤暭噍噏磱囱鞇叾圀囯园𨭦㘣𡉏坆𤆥汮炋坂㚱𦱾埦𡐖堃𡑔𤍣堦𤯵塜墪㕡壠壜𡈼壻寿坃𪅐𤉸鏓㖡够梦㛃湙\"],[\"fba1\",\"𡘾娤啓𡚒蔅姉𠵎𦲁𦴪𡟜姙𡟻𡞲𦶦浱𡠨𡛕姹𦹅媫婣㛦𤦩婷㜈媖瑥嫓𦾡𢕔㶅𡤑㜲𡚸広勐孶斈孼𧨎䀄䡝𠈄寕慠𡨴𥧌𠖥寳宝䴐尅𡭄尓珎尔𡲥𦬨屉䣝岅峩峯嶋𡷹𡸷崐崘嵆𡺤岺巗苼㠭𤤁𢁉𢅳芇㠶㯂帮檊幵幺𤒼𠳓厦亷廐厨𡝱帉廴𨒂\"],[\"fc40\",\"廹廻㢠廼栾鐛弍𠇁弢㫞䢮𡌺强𦢈𢏐彘𢑱彣鞽𦹮彲鍀𨨶徧嶶㵟𥉐𡽪𧃸𢙨釖𠊞𨨩怱暅𡡷㥣㷇㘹垐𢞴祱㹀悞悤悳𤦂𤦏𧩓璤僡媠慤萤慂慈𦻒憁凴𠙖憇宪𣾷\"],[\"fca1\",\"𢡟懓𨮝𩥝懐㤲𢦀𢣁怣慜攞掋𠄘担𡝰拕𢸍捬𤧟㨗搸揸𡎎𡟼撐澊𢸶頔𤂌𥜝擡擥鑻㩦携㩗敍漖𤨨𤨣斅敭敟𣁾斵𤥀䬷旑䃘𡠩无旣忟𣐀昘𣇷𣇸晄𣆤𣆥晋𠹵晧𥇦晳晴𡸽𣈱𨗴𣇈𥌓矅𢣷馤朂𤎜𤨡㬫槺𣟂杞杧杢𤇍𩃭柗䓩栢湐鈼栁𣏦𦶠桝\"],[\"fd40\",\"𣑯槡樋𨫟楳棃𣗍椁椀㴲㨁𣘼㮀枬楡𨩊䋼椶榘㮡𠏉荣傐槹𣙙𢄪橅𣜃檝㯳枱櫈𩆜㰍欝𠤣惞欵歴𢟍溵𣫛𠎵𡥘㝀吡𣭚毡𣻼毜氷𢒋𤣱𦭑汚舦汹𣶼䓅𣶽𤆤𤤌𤤀\"],[\"fda1\",\"𣳉㛥㳫𠴲鮃𣇹𢒑羏样𦴥𦶡𦷫涖浜湼漄𤥿𤂅𦹲蔳𦽴凇沜渝萮𨬡港𣸯瑓𣾂秌湏媑𣁋濸㜍澝𣸰滺𡒗𤀽䕕鏰潄潜㵎潴𩅰㴻澟𤅄濓𤂑𤅕𤀹𣿰𣾴𤄿凟𤅖𤅗𤅀𦇝灋灾炧炁烌烕烖烟䄄㷨熴熖𤉷焫煅媈煊煮岜𤍥煏鍢𤋁焬𤑚𤨧𤨢熺𨯨炽爎\"],[\"fe40\",\"鑂爕夑鑃爤鍁𥘅爮牀𤥴梽牕牗㹕𣁄栍漽犂猪猫𤠣𨠫䣭𨠄猨献珏玪𠰺𦨮珉瑉𤇢𡛧𤨤昣㛅𤦷𤦍𤧻珷琕椃𤨦琹𠗃㻗瑜𢢭瑠𨺲瑇珤瑶莹瑬㜰瑴鏱樬璂䥓𤪌\"],[\"fea1\",\"𤅟𤩹𨮏孆𨰃𡢞瓈𡦈甎瓩甞𨻙𡩋寗𨺬鎅畍畊畧畮𤾂㼄𤴓疎瑝疞疴瘂瘬癑癏癯癶𦏵皐臯㟸𦤑𦤎皡皥皷盌𦾟葢𥂝𥅽𡸜眞眦着撯𥈠睘𣊬瞯𨥤𨥨𡛁矴砉𡍶𤨒棊碯磇磓隥礮𥗠磗礴碱𧘌辸袄𨬫𦂃𢘜禆褀椂禀𥡗禝𧬹礼禩渪𧄦㺨秆𩄍秔\"]]\n\n/***/ }),\n/* 718 */\n/***/ (function(module, exports) {\n\nmodule.exports = [[\"0\",\"\\u0000\",127],[\"8141\",\"갂갃갅갆갋\",4,\"갘갞갟갡갢갣갥\",6,\"갮갲갳갴\"],[\"8161\",\"갵갶갷갺갻갽갾갿걁\",9,\"걌걎\",5,\"걕\"],[\"8181\",\"걖걗걙걚걛걝\",18,\"걲걳걵걶걹걻\",4,\"겂겇겈겍겎겏겑겒겓겕\",6,\"겞겢\",5,\"겫겭겮겱\",6,\"겺겾겿곀곂곃곅곆곇곉곊곋곍\",7,\"곖곘\",7,\"곢곣곥곦곩곫곭곮곲곴곷\",4,\"곾곿괁괂괃괅괇\",4,\"괎괐괒괓\"],[\"8241\",\"괔괕괖괗괙괚괛괝괞괟괡\",7,\"괪괫괮\",5],[\"8261\",\"괶괷괹괺괻괽\",6,\"굆굈굊\",5,\"굑굒굓굕굖굗\"],[\"8281\",\"굙\",7,\"굢굤\",7,\"굮굯굱굲굷굸굹굺굾궀궃\",4,\"궊궋궍궎궏궑\",10,\"궞\",5,\"궥\",17,\"궸\",7,\"귂귃귅귆귇귉\",6,\"귒귔\",7,\"귝귞귟귡귢귣귥\",18],[\"8341\",\"귺귻귽귾긂\",5,\"긊긌긎\",5,\"긕\",7],[\"8361\",\"긝\",18,\"긲긳긵긶긹긻긼\"],[\"8381\",\"긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗\",4,\"깞깢깣깤깦깧깪깫깭깮깯깱\",6,\"깺깾\",5,\"꺆\",5,\"꺍\",46,\"꺿껁껂껃껅\",6,\"껎껒\",5,\"껚껛껝\",8],[\"8441\",\"껦껧껩껪껬껮\",5,\"껵껶껷껹껺껻껽\",8],[\"8461\",\"꼆꼉꼊꼋꼌꼎꼏꼑\",18],[\"8481\",\"꼤\",7,\"꼮꼯꼱꼳꼵\",6,\"꼾꽀꽄꽅꽆꽇꽊\",5,\"꽑\",10,\"꽞\",5,\"꽦\",18,\"꽺\",5,\"꾁꾂꾃꾅꾆꾇꾉\",6,\"꾒꾓꾔꾖\",5,\"꾝\",26,\"꾺꾻꾽꾾\"],[\"8541\",\"꾿꿁\",5,\"꿊꿌꿏\",4,\"꿕\",6,\"꿝\",4],[\"8561\",\"꿢\",5,\"꿪\",5,\"꿲꿳꿵꿶꿷꿹\",6,\"뀂뀃\"],[\"8581\",\"뀅\",6,\"뀍뀎뀏뀑뀒뀓뀕\",6,\"뀞\",9,\"뀩\",26,\"끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞\",29,\"끾끿낁낂낃낅\",6,\"낎낐낒\",5,\"낛낝낞낣낤\"],[\"8641\",\"낥낦낧낪낰낲낶낷낹낺낻낽\",6,\"냆냊\",5,\"냒\"],[\"8661\",\"냓냕냖냗냙\",6,\"냡냢냣냤냦\",10],[\"8681\",\"냱\",22,\"넊넍넎넏넑넔넕넖넗넚넞\",4,\"넦넧넩넪넫넭\",6,\"넶넺\",5,\"녂녃녅녆녇녉\",6,\"녒녓녖녗녙녚녛녝녞녟녡\",22,\"녺녻녽녾녿놁놃\",4,\"놊놌놎놏놐놑놕놖놗놙놚놛놝\"],[\"8741\",\"놞\",9,\"놩\",15],[\"8761\",\"놹\",18,\"뇍뇎뇏뇑뇒뇓뇕\"],[\"8781\",\"뇖\",5,\"뇞뇠\",7,\"뇪뇫뇭뇮뇯뇱\",7,\"뇺뇼뇾\",5,\"눆눇눉눊눍\",6,\"눖눘눚\",5,\"눡\",18,\"눵\",6,\"눽\",26,\"뉙뉚뉛뉝뉞뉟뉡\",6,\"뉪\",4],[\"8841\",\"뉯\",4,\"뉶\",5,\"뉽\",6,\"늆늇늈늊\",4],[\"8861\",\"늏늒늓늕늖늗늛\",4,\"늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷\"],[\"8881\",\"늸\",15,\"닊닋닍닎닏닑닓\",4,\"닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉\",6,\"댒댖\",5,\"댝\",54,\"덗덙덚덝덠덡덢덣\"],[\"8941\",\"덦덨덪덬덭덯덲덳덵덶덷덹\",6,\"뎂뎆\",5,\"뎍\"],[\"8961\",\"뎎뎏뎑뎒뎓뎕\",10,\"뎢\",5,\"뎩뎪뎫뎭\"],[\"8981\",\"뎮\",21,\"돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩\",18,\"돽\",18,\"됑\",6,\"됙됚됛됝됞됟됡\",6,\"됪됬\",7,\"됵\",15],[\"8a41\",\"둅\",10,\"둒둓둕둖둗둙\",6,\"둢둤둦\"],[\"8a61\",\"둧\",4,\"둭\",18,\"뒁뒂\"],[\"8a81\",\"뒃\",4,\"뒉\",19,\"뒞\",5,\"뒥뒦뒧뒩뒪뒫뒭\",7,\"뒶뒸뒺\",5,\"듁듂듃듅듆듇듉\",6,\"듑듒듓듔듖\",5,\"듞듟듡듢듥듧\",4,\"듮듰듲\",5,\"듹\",26,\"딖딗딙딚딝\"],[\"8b41\",\"딞\",5,\"딦딫\",4,\"딲딳딵딶딷딹\",6,\"땂땆\"],[\"8b61\",\"땇땈땉땊땎땏땑땒땓땕\",6,\"땞땢\",8],[\"8b81\",\"땫\",52,\"떢떣떥떦떧떩떬떭떮떯떲떶\",4,\"떾떿뗁뗂뗃뗅\",6,\"뗎뗒\",5,\"뗙\",18,\"뗭\",18],[\"8c41\",\"똀\",15,\"똒똓똕똖똗똙\",4],[\"8c61\",\"똞\",6,\"똦\",5,\"똭\",6,\"똵\",5],[\"8c81\",\"똻\",12,\"뙉\",26,\"뙥뙦뙧뙩\",50,\"뚞뚟뚡뚢뚣뚥\",5,\"뚭뚮뚯뚰뚲\",16],[\"8d41\",\"뛃\",16,\"뛕\",8],[\"8d61\",\"뛞\",17,\"뛱뛲뛳뛵뛶뛷뛹뛺\"],[\"8d81\",\"뛻\",4,\"뜂뜃뜄뜆\",33,\"뜪뜫뜭뜮뜱\",6,\"뜺뜼\",7,\"띅띆띇띉띊띋띍\",6,\"띖\",9,\"띡띢띣띥띦띧띩\",6,\"띲띴띶\",5,\"띾띿랁랂랃랅\",6,\"랎랓랔랕랚랛랝랞\"],[\"8e41\",\"랟랡\",6,\"랪랮\",5,\"랶랷랹\",8],[\"8e61\",\"럂\",4,\"럈럊\",19],[\"8e81\",\"럞\",13,\"럮럯럱럲럳럵\",6,\"럾렂\",4,\"렊렋렍렎렏렑\",6,\"렚렜렞\",5,\"렦렧렩렪렫렭\",6,\"렶렺\",5,\"롁롂롃롅\",11,\"롒롔\",7,\"롞롟롡롢롣롥\",6,\"롮롰롲\",5,\"롹롺롻롽\",7],[\"8f41\",\"뢅\",7,\"뢎\",17],[\"8f61\",\"뢠\",7,\"뢩\",6,\"뢱뢲뢳뢵뢶뢷뢹\",4],[\"8f81\",\"뢾뢿룂룄룆\",5,\"룍룎룏룑룒룓룕\",7,\"룞룠룢\",5,\"룪룫룭룮룯룱\",6,\"룺룼룾\",5,\"뤅\",18,\"뤙\",6,\"뤡\",26,\"뤾뤿륁륂륃륅\",6,\"륍륎륐륒\",5],[\"9041\",\"륚륛륝륞륟륡\",6,\"륪륬륮\",5,\"륶륷륹륺륻륽\"],[\"9061\",\"륾\",5,\"릆릈릋릌릏\",15],[\"9081\",\"릟\",12,\"릮릯릱릲릳릵\",6,\"릾맀맂\",5,\"맊맋맍맓\",4,\"맚맜맟맠맢맦맧맩맪맫맭\",6,\"맶맻\",4,\"먂\",5,\"먉\",11,\"먖\",33,\"먺먻먽먾먿멁멃멄멅멆\"],[\"9141\",\"멇멊멌멏멐멑멒멖멗멙멚멛멝\",6,\"멦멪\",5],[\"9161\",\"멲멳멵멶멷멹\",9,\"몆몈몉몊몋몍\",5],[\"9181\",\"몓\",20,\"몪몭몮몯몱몳\",4,\"몺몼몾\",5,\"뫅뫆뫇뫉\",14,\"뫚\",33,\"뫽뫾뫿묁묂묃묅\",7,\"묎묐묒\",5,\"묙묚묛묝묞묟묡\",6],[\"9241\",\"묨묪묬\",7,\"묷묹묺묿\",4,\"뭆뭈뭊뭋뭌뭎뭑뭒\"],[\"9261\",\"뭓뭕뭖뭗뭙\",7,\"뭢뭤\",7,\"뭭\",4],[\"9281\",\"뭲\",21,\"뮉뮊뮋뮍뮎뮏뮑\",18,\"뮥뮦뮧뮩뮪뮫뮭\",6,\"뮵뮶뮸\",7,\"믁믂믃믅믆믇믉\",6,\"믑믒믔\",35,\"믺믻믽믾밁\"],[\"9341\",\"밃\",4,\"밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵\"],[\"9361\",\"밶밷밹\",6,\"뱂뱆뱇뱈뱊뱋뱎뱏뱑\",8],[\"9381\",\"뱚뱛뱜뱞\",37,\"벆벇벉벊벍벏\",4,\"벖벘벛\",4,\"벢벣벥벦벩\",6,\"벲벶\",5,\"벾벿볁볂볃볅\",7,\"볎볒볓볔볖볗볙볚볛볝\",22,\"볷볹볺볻볽\"],[\"9441\",\"볾\",5,\"봆봈봊\",5,\"봑봒봓봕\",8],[\"9461\",\"봞\",5,\"봥\",6,\"봭\",12],[\"9481\",\"봺\",5,\"뵁\",6,\"뵊뵋뵍뵎뵏뵑\",6,\"뵚\",9,\"뵥뵦뵧뵩\",22,\"붂붃붅붆붋\",4,\"붒붔붖붗붘붛붝\",6,\"붥\",10,\"붱\",6,\"붹\",24],[\"9541\",\"뷒뷓뷖뷗뷙뷚뷛뷝\",11,\"뷪\",5,\"뷱\"],[\"9561\",\"뷲뷳뷵뷶뷷뷹\",6,\"븁븂븄븆\",5,\"븎븏븑븒븓\"],[\"9581\",\"븕\",6,\"븞븠\",35,\"빆빇빉빊빋빍빏\",4,\"빖빘빜빝빞빟빢빣빥빦빧빩빫\",4,\"빲빶\",4,\"빾빿뺁뺂뺃뺅\",6,\"뺎뺒\",5,\"뺚\",13,\"뺩\",14],[\"9641\",\"뺸\",23,\"뻒뻓\"],[\"9661\",\"뻕뻖뻙\",6,\"뻡뻢뻦\",5,\"뻭\",8],[\"9681\",\"뻶\",10,\"뼂\",5,\"뼊\",13,\"뼚뼞\",33,\"뽂뽃뽅뽆뽇뽉\",6,\"뽒뽓뽔뽖\",44],[\"9741\",\"뾃\",16,\"뾕\",8],[\"9761\",\"뾞\",17,\"뾱\",7],[\"9781\",\"뾹\",11,\"뿆\",5,\"뿎뿏뿑뿒뿓뿕\",6,\"뿝뿞뿠뿢\",89,\"쀽쀾쀿\"],[\"9841\",\"쁀\",16,\"쁒\",5,\"쁙쁚쁛\"],[\"9861\",\"쁝쁞쁟쁡\",6,\"쁪\",15],[\"9881\",\"쁺\",21,\"삒삓삕삖삗삙\",6,\"삢삤삦\",5,\"삮삱삲삷\",4,\"삾샂샃샄샆샇샊샋샍샎샏샑\",6,\"샚샞\",5,\"샦샧샩샪샫샭\",6,\"샶샸샺\",5,\"섁섂섃섅섆섇섉\",6,\"섑섒섓섔섖\",5,\"섡섢섥섨섩섪섫섮\"],[\"9941\",\"섲섳섴섵섷섺섻섽섾섿셁\",6,\"셊셎\",5,\"셖셗\"],[\"9961\",\"셙셚셛셝\",6,\"셦셪\",5,\"셱셲셳셵셶셷셹셺셻\"],[\"9981\",\"셼\",8,\"솆\",5,\"솏솑솒솓솕솗\",4,\"솞솠솢솣솤솦솧솪솫솭솮솯솱\",11,\"솾\",5,\"쇅쇆쇇쇉쇊쇋쇍\",6,\"쇕쇖쇙\",6,\"쇡쇢쇣쇥쇦쇧쇩\",6,\"쇲쇴\",7,\"쇾쇿숁숂숃숅\",6,\"숎숐숒\",5,\"숚숛숝숞숡숢숣\"],[\"9a41\",\"숤숥숦숧숪숬숮숰숳숵\",16],[\"9a61\",\"쉆쉇쉉\",6,\"쉒쉓쉕쉖쉗쉙\",6,\"쉡쉢쉣쉤쉦\"],[\"9a81\",\"쉧\",4,\"쉮쉯쉱쉲쉳쉵\",6,\"쉾슀슂\",5,\"슊\",5,\"슑\",6,\"슙슚슜슞\",5,\"슦슧슩슪슫슮\",5,\"슶슸슺\",33,\"싞싟싡싢싥\",5,\"싮싰싲싳싴싵싷싺싽싾싿쌁\",6,\"쌊쌋쌎쌏\"],[\"9b41\",\"쌐쌑쌒쌖쌗쌙쌚쌛쌝\",6,\"쌦쌧쌪\",8],[\"9b61\",\"쌳\",17,\"썆\",7],[\"9b81\",\"썎\",25,\"썪썫썭썮썯썱썳\",4,\"썺썻썾\",5,\"쎅쎆쎇쎉쎊쎋쎍\",50,\"쏁\",22,\"쏚\"],[\"9c41\",\"쏛쏝쏞쏡쏣\",4,\"쏪쏫쏬쏮\",5,\"쏶쏷쏹\",5],[\"9c61\",\"쏿\",8,\"쐉\",6,\"쐑\",9],[\"9c81\",\"쐛\",8,\"쐥\",6,\"쐭쐮쐯쐱쐲쐳쐵\",6,\"쐾\",9,\"쑉\",26,\"쑦쑧쑩쑪쑫쑭\",6,\"쑶쑷쑸쑺\",5,\"쒁\",18,\"쒕\",6,\"쒝\",12],[\"9d41\",\"쒪\",13,\"쒹쒺쒻쒽\",8],[\"9d61\",\"쓆\",25],[\"9d81\",\"쓠\",8,\"쓪\",5,\"쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂\",9,\"씍씎씏씑씒씓씕\",6,\"씝\",10,\"씪씫씭씮씯씱\",6,\"씺씼씾\",5,\"앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩\",6,\"앲앶\",5,\"앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔\"],[\"9e41\",\"얖얙얚얛얝얞얟얡\",7,\"얪\",9,\"얶\"],[\"9e61\",\"얷얺얿\",4,\"엋엍엏엒엓엕엖엗엙\",6,\"엢엤엦엧\"],[\"9e81\",\"엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑\",6,\"옚옝\",6,\"옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉\",6,\"왒왖\",5,\"왞왟왡\",10,\"왭왮왰왲\",5,\"왺왻왽왾왿욁\",6,\"욊욌욎\",5,\"욖욗욙욚욛욝\",6,\"욦\"],[\"9f41\",\"욨욪\",5,\"욲욳욵욶욷욻\",4,\"웂웄웆\",5,\"웎\"],[\"9f61\",\"웏웑웒웓웕\",6,\"웞웟웢\",5,\"웪웫웭웮웯웱웲\"],[\"9f81\",\"웳\",4,\"웺웻웼웾\",5,\"윆윇윉윊윋윍\",6,\"윖윘윚\",5,\"윢윣윥윦윧윩\",6,\"윲윴윶윸윹윺윻윾윿읁읂읃읅\",4,\"읋읎읐읙읚읛읝읞읟읡\",6,\"읩읪읬\",7,\"읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛\",4,\"잢잧\",4,\"잮잯잱잲잳잵잶잷\"],[\"a041\",\"잸잹잺잻잾쟂\",5,\"쟊쟋쟍쟏쟑\",6,\"쟙쟚쟛쟜\"],[\"a061\",\"쟞\",5,\"쟥쟦쟧쟩쟪쟫쟭\",13],[\"a081\",\"쟻\",4,\"젂젃젅젆젇젉젋\",4,\"젒젔젗\",4,\"젞젟젡젢젣젥\",6,\"젮젰젲\",5,\"젹젺젻젽젾젿졁\",6,\"졊졋졎\",5,\"졕\",26,\"졲졳졵졶졷졹졻\",4,\"좂좄좈좉좊좎\",5,\"좕\",7,\"좞좠좢좣좤\"],[\"a141\",\"좥좦좧좩\",18,\"좾좿죀죁\"],[\"a161\",\"죂죃죅죆죇죉죊죋죍\",6,\"죖죘죚\",5,\"죢죣죥\"],[\"a181\",\"죦\",14,\"죶\",5,\"죾죿줁줂줃줇\",4,\"줎　、。·‥…¨〃­―∥＼∼‘’“”〔〕〈\",9,\"±×÷≠≤≥∞∴°′″℃Å￠￡￥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨￢\"],[\"a241\",\"줐줒\",5,\"줙\",18],[\"a261\",\"줭\",6,\"줵\",18],[\"a281\",\"쥈\",7,\"쥒쥓쥕쥖쥗쥙\",6,\"쥢쥤\",7,\"쥭쥮쥯⇒⇔∀∃´～ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®\"],[\"a341\",\"쥱쥲쥳쥵\",6,\"쥽\",10,\"즊즋즍즎즏\"],[\"a361\",\"즑\",6,\"즚즜즞\",16],[\"a381\",\"즯\",16,\"짂짃짅짆짉짋\",4,\"짒짔짗짘짛！\",58,\"￦］\",32,\"￣\"],[\"a441\",\"짞짟짡짣짥짦짨짩짪짫짮짲\",5,\"짺짻짽짾짿쨁쨂쨃쨄\"],[\"a461\",\"쨅쨆쨇쨊쨎\",5,\"쨕쨖쨗쨙\",12],[\"a481\",\"쨦쨧쨨쨪\",28,\"ㄱ\",93],[\"a541\",\"쩇\",4,\"쩎쩏쩑쩒쩓쩕\",6,\"쩞쩢\",5,\"쩩쩪\"],[\"a561\",\"쩫\",17,\"쩾\",5,\"쪅쪆\"],[\"a581\",\"쪇\",16,\"쪙\",14,\"ⅰ\",9],[\"a5b0\",\"Ⅰ\",9],[\"a5c1\",\"Α\",16,\"Σ\",6],[\"a5e1\",\"α\",16,\"σ\",6],[\"a641\",\"쪨\",19,\"쪾쪿쫁쫂쫃쫅\"],[\"a661\",\"쫆\",5,\"쫎쫐쫒쫔쫕쫖쫗쫚\",5,\"쫡\",6],[\"a681\",\"쫨쫩쫪쫫쫭\",6,\"쫵\",18,\"쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃\",7],[\"a741\",\"쬋\",4,\"쬑쬒쬓쬕쬖쬗쬙\",6,\"쬢\",7],[\"a761\",\"쬪\",22,\"쭂쭃쭄\"],[\"a781\",\"쭅쭆쭇쭊쭋쭍쭎쭏쭑\",6,\"쭚쭛쭜쭞\",5,\"쭥\",7,\"㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙\",9,\"㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰\",9,\"㎀\",4,\"㎺\",5,\"㎐\",4,\"Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆\"],[\"a841\",\"쭭\",10,\"쭺\",14],[\"a861\",\"쮉\",18,\"쮝\",6],[\"a881\",\"쮤\",19,\"쮹\",11,\"ÆÐªĦ\"],[\"a8a6\",\"Ĳ\"],[\"a8a8\",\"ĿŁØŒºÞŦŊ\"],[\"a8b1\",\"㉠\",27,\"ⓐ\",25,\"①\",14,\"½⅓⅔¼¾⅛⅜⅝⅞\"],[\"a941\",\"쯅\",14,\"쯕\",10],[\"a961\",\"쯠쯡쯢쯣쯥쯦쯨쯪\",18],[\"a981\",\"쯽\",14,\"찎찏찑찒찓찕\",6,\"찞찟찠찣찤æđðħıĳĸŀłøœßþŧŋŉ㈀\",27,\"⒜\",25,\"⑴\",14,\"¹²³⁴ⁿ₁₂₃₄\"],[\"aa41\",\"찥찦찪찫찭찯찱\",6,\"찺찿\",4,\"챆챇챉챊챋챍챎\"],[\"aa61\",\"챏\",4,\"챖챚\",5,\"챡챢챣챥챧챩\",6,\"챱챲\"],[\"aa81\",\"챳챴챶\",29,\"ぁ\",82],[\"ab41\",\"첔첕첖첗첚첛첝첞첟첡\",6,\"첪첮\",5,\"첶첷첹\"],[\"ab61\",\"첺첻첽\",6,\"쳆쳈쳊\",5,\"쳑쳒쳓쳕\",5],[\"ab81\",\"쳛\",8,\"쳥\",6,\"쳭쳮쳯쳱\",12,\"ァ\",85],[\"ac41\",\"쳾쳿촀촂\",5,\"촊촋촍촎촏촑\",6,\"촚촜촞촟촠\"],[\"ac61\",\"촡촢촣촥촦촧촩촪촫촭\",11,\"촺\",4],[\"ac81\",\"촿\",28,\"쵝쵞쵟А\",5,\"ЁЖ\",25],[\"acd1\",\"а\",5,\"ёж\",25],[\"ad41\",\"쵡쵢쵣쵥\",6,\"쵮쵰쵲\",5,\"쵹\",7],[\"ad61\",\"춁\",6,\"춉\",10,\"춖춗춙춚춛춝춞춟\"],[\"ad81\",\"춠춡춢춣춦춨춪\",5,\"춱\",18,\"췅\"],[\"ae41\",\"췆\",5,\"췍췎췏췑\",16],[\"ae61\",\"췢\",5,\"췩췪췫췭췮췯췱\",6,\"췺췼췾\",4],[\"ae81\",\"츃츅츆츇츉츊츋츍\",6,\"츕츖츗츘츚\",5,\"츢츣츥츦츧츩츪츫\"],[\"af41\",\"츬츭츮츯츲츴츶\",19],[\"af61\",\"칊\",13,\"칚칛칝칞칢\",5,\"칪칬\"],[\"af81\",\"칮\",5,\"칶칷칹칺칻칽\",6,\"캆캈캊\",5,\"캒캓캕캖캗캙\"],[\"b041\",\"캚\",5,\"캢캦\",5,\"캮\",12],[\"b061\",\"캻\",5,\"컂\",19],[\"b081\",\"컖\",13,\"컦컧컩컪컭\",6,\"컶컺\",5,\"가각간갇갈갉갊감\",7,\"같\",4,\"갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆\"],[\"b141\",\"켂켃켅켆켇켉\",6,\"켒켔켖\",5,\"켝켞켟켡켢켣\"],[\"b161\",\"켥\",6,\"켮켲\",5,\"켹\",11],[\"b181\",\"콅\",14,\"콖콗콙콚콛콝\",6,\"콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸\"],[\"b241\",\"콭콮콯콲콳콵콶콷콹\",6,\"쾁쾂쾃쾄쾆\",5,\"쾍\"],[\"b261\",\"쾎\",18,\"쾢\",5,\"쾩\"],[\"b281\",\"쾪\",5,\"쾱\",18,\"쿅\",6,\"깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙\"],[\"b341\",\"쿌\",19,\"쿢쿣쿥쿦쿧쿩\"],[\"b361\",\"쿪\",5,\"쿲쿴쿶\",5,\"쿽쿾쿿퀁퀂퀃퀅\",5],[\"b381\",\"퀋\",5,\"퀒\",5,\"퀙\",19,\"끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫\",4,\"낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝\"],[\"b441\",\"퀮\",5,\"퀶퀷퀹퀺퀻퀽\",6,\"큆큈큊\",5],[\"b461\",\"큑큒큓큕큖큗큙\",6,\"큡\",10,\"큮큯\"],[\"b481\",\"큱큲큳큵\",6,\"큾큿킀킂\",18,\"뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫\",4,\"닳담답닷\",4,\"닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥\"],[\"b541\",\"킕\",14,\"킦킧킩킪킫킭\",5],[\"b561\",\"킳킶킸킺\",5,\"탂탃탅탆탇탊\",5,\"탒탖\",4],[\"b581\",\"탛탞탟탡탢탣탥\",6,\"탮탲\",5,\"탹\",11,\"덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸\"],[\"b641\",\"턅\",7,\"턎\",17],[\"b661\",\"턠\",15,\"턲턳턵턶턷턹턻턼턽턾\"],[\"b681\",\"턿텂텆\",5,\"텎텏텑텒텓텕\",6,\"텞텠텢\",5,\"텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗\"],[\"b741\",\"텮\",13,\"텽\",6,\"톅톆톇톉톊\"],[\"b761\",\"톋\",20,\"톢톣톥톦톧\"],[\"b781\",\"톩\",6,\"톲톴톶톷톸톹톻톽톾톿퇁\",14,\"래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩\"],[\"b841\",\"퇐\",7,\"퇙\",17],[\"b861\",\"퇫\",8,\"퇵퇶퇷퇹\",13],[\"b881\",\"툈툊\",5,\"툑\",24,\"륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많\",4,\"맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼\"],[\"b941\",\"툪툫툮툯툱툲툳툵\",6,\"툾퉀퉂\",5,\"퉉퉊퉋퉌\"],[\"b961\",\"퉍\",14,\"퉝\",6,\"퉥퉦퉧퉨\"],[\"b981\",\"퉩\",22,\"튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바\",4,\"받\",4,\"밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗\"],[\"ba41\",\"튍튎튏튒튓튔튖\",5,\"튝튞튟튡튢튣튥\",6,\"튭\"],[\"ba61\",\"튮튯튰튲\",5,\"튺튻튽튾틁틃\",4,\"틊틌\",5],[\"ba81\",\"틒틓틕틖틗틙틚틛틝\",6,\"틦\",9,\"틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤\"],[\"bb41\",\"틻\",4,\"팂팄팆\",5,\"팏팑팒팓팕팗\",4,\"팞팢팣\"],[\"bb61\",\"팤팦팧팪팫팭팮팯팱\",6,\"팺팾\",5,\"퍆퍇퍈퍉\"],[\"bb81\",\"퍊\",31,\"빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤\"],[\"bc41\",\"퍪\",17,\"퍾퍿펁펂펃펅펆펇\"],[\"bc61\",\"펈펉펊펋펎펒\",5,\"펚펛펝펞펟펡\",6,\"펪펬펮\"],[\"bc81\",\"펯\",4,\"펵펶펷펹펺펻펽\",6,\"폆폇폊\",5,\"폑\",5,\"샥샨샬샴샵샷샹섀섄섈섐섕서\",4,\"섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭\"],[\"bd41\",\"폗폙\",7,\"폢폤\",7,\"폮폯폱폲폳폵폶폷\"],[\"bd61\",\"폸폹폺폻폾퐀퐂\",5,\"퐉\",13],[\"bd81\",\"퐗\",5,\"퐞\",25,\"숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰\"],[\"be41\",\"퐸\",7,\"푁푂푃푅\",14],[\"be61\",\"푔\",7,\"푝푞푟푡푢푣푥\",7,\"푮푰푱푲\"],[\"be81\",\"푳\",4,\"푺푻푽푾풁풃\",4,\"풊풌풎\",5,\"풕\",8,\"쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄\",6,\"엌엎\"],[\"bf41\",\"풞\",10,\"풪\",14],[\"bf61\",\"풹\",18,\"퓍퓎퓏퓑퓒퓓퓕\"],[\"bf81\",\"퓖\",5,\"퓝퓞퓠\",7,\"퓩퓪퓫퓭퓮퓯퓱\",6,\"퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염\",5,\"옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨\"],[\"c041\",\"퓾\",5,\"픅픆픇픉픊픋픍\",6,\"픖픘\",5],[\"c061\",\"픞\",25],[\"c081\",\"픸픹픺픻픾픿핁핂핃핅\",6,\"핎핐핒\",5,\"핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응\",7,\"읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊\"],[\"c141\",\"핤핦핧핪핬핮\",5,\"핶핷핹핺핻핽\",6,\"햆햊햋\"],[\"c161\",\"햌햍햎햏햑\",19,\"햦햧\"],[\"c181\",\"햨\",31,\"점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓\"],[\"c241\",\"헊헋헍헎헏헑헓\",4,\"헚헜헞\",5,\"헦헧헩헪헫헭헮\"],[\"c261\",\"헯\",4,\"헶헸헺\",5,\"혂혃혅혆혇혉\",6,\"혒\"],[\"c281\",\"혖\",5,\"혝혞혟혡혢혣혥\",7,\"혮\",9,\"혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻\"],[\"c341\",\"혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝\",4],[\"c361\",\"홢\",4,\"홨홪\",5,\"홲홳홵\",11],[\"c381\",\"횁횂횄횆\",5,\"횎횏횑횒횓횕\",7,\"횞횠횢\",5,\"횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층\"],[\"c441\",\"횫횭횮횯횱\",7,\"횺횼\",7,\"훆훇훉훊훋\"],[\"c461\",\"훍훎훏훐훒훓훕훖훘훚\",5,\"훡훢훣훥훦훧훩\",4],[\"c481\",\"훮훯훱훲훳훴훶\",5,\"훾훿휁휂휃휅\",11,\"휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼\"],[\"c541\",\"휕휖휗휚휛휝휞휟휡\",6,\"휪휬휮\",5,\"휶휷휹\"],[\"c561\",\"휺휻휽\",6,\"흅흆흈흊\",5,\"흒흓흕흚\",4],[\"c581\",\"흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵\",6,\"흾흿힀힂\",5,\"힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜\"],[\"c641\",\"힍힎힏힑\",6,\"힚힜힞\",5],[\"c6a1\",\"퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁\"],[\"c7a1\",\"퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠\"],[\"c8a1\",\"혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝\"],[\"caa1\",\"伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕\"],[\"cba1\",\"匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢\"],[\"cca1\",\"瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械\"],[\"cda1\",\"棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜\"],[\"cea1\",\"科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾\"],[\"cfa1\",\"區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴\"],[\"d0a1\",\"鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣\"],[\"d1a1\",\"朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩\",5,\"那樂\",4,\"諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉\"],[\"d2a1\",\"納臘蠟衲囊娘廊\",4,\"乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧\",5,\"駑魯\",10,\"濃籠聾膿農惱牢磊腦賂雷尿壘\",7,\"嫩訥杻紐勒\",5,\"能菱陵尼泥匿溺多茶\"],[\"d3a1\",\"丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃\"],[\"d4a1\",\"棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅\"],[\"d5a1\",\"蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣\"],[\"d6a1\",\"煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼\"],[\"d7a1\",\"遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬\"],[\"d8a1\",\"立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅\"],[\"d9a1\",\"蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文\"],[\"daa1\",\"汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑\"],[\"dba1\",\"發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖\"],[\"dca1\",\"碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦\"],[\"dda1\",\"孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥\"],[\"dea1\",\"脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索\"],[\"dfa1\",\"傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署\"],[\"e0a1\",\"胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬\"],[\"e1a1\",\"聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁\"],[\"e2a1\",\"戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧\"],[\"e3a1\",\"嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁\"],[\"e4a1\",\"沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額\"],[\"e5a1\",\"櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬\"],[\"e6a1\",\"旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒\"],[\"e7a1\",\"簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳\"],[\"e8a1\",\"烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療\"],[\"e9a1\",\"窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓\"],[\"eaa1\",\"運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜\"],[\"eba1\",\"濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼\"],[\"eca1\",\"議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄\"],[\"eda1\",\"立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長\"],[\"eea1\",\"障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱\"],[\"efa1\",\"煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖\"],[\"f0a1\",\"靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫\"],[\"f1a1\",\"踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只\"],[\"f2a1\",\"咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯\"],[\"f3a1\",\"鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策\"],[\"f4a1\",\"責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢\"],[\"f5a1\",\"椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃\"],[\"f6a1\",\"贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託\"],[\"f7a1\",\"鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑\"],[\"f8a1\",\"阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃\"],[\"f9a1\",\"品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航\"],[\"faa1\",\"行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型\"],[\"fba1\",\"形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵\"],[\"fca1\",\"禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆\"],[\"fda1\",\"爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰\"]]\n\n/***/ }),\n/* 719 */\n/***/ (function(module, exports) {\n\nmodule.exports = [[\"0\",\"\\u0000\",127],[\"8ea1\",\"｡\",62],[\"a1a1\",\"　、。，．・：；？！゛゜´｀¨＾￣＿ヽヾゝゞ〃仝々〆〇ー―‐／＼～∥｜…‥‘’“”（）〔〕［］｛｝〈\",9,\"＋－±×÷＝≠＜＞≦≧∞∴♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇\"],[\"a2a1\",\"◆□■△▲▽▼※〒→←↑↓〓\"],[\"a2ba\",\"∈∋⊆⊇⊂⊃∪∩\"],[\"a2ca\",\"∧∨￢⇒⇔∀∃\"],[\"a2dc\",\"∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬\"],[\"a2f2\",\"Å‰♯♭♪†‡¶\"],[\"a2fe\",\"◯\"],[\"a3b0\",\"０\",9],[\"a3c1\",\"Ａ\",25],[\"a3e1\",\"ａ\",25],[\"a4a1\",\"ぁ\",82],[\"a5a1\",\"ァ\",85],[\"a6a1\",\"Α\",16,\"Σ\",6],[\"a6c1\",\"α\",16,\"σ\",6],[\"a7a1\",\"А\",5,\"ЁЖ\",25],[\"a7d1\",\"а\",5,\"ёж\",25],[\"a8a1\",\"─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂\"],[\"ada1\",\"①\",19,\"Ⅰ\",9],[\"adc0\",\"㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡\"],[\"addf\",\"㍻〝〟№㏍℡㊤\",4,\"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪\"],[\"b0a1\",\"亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭\"],[\"b1a1\",\"院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応\"],[\"b2a1\",\"押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改\"],[\"b3a1\",\"魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱\"],[\"b4a1\",\"粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄\"],[\"b5a1\",\"機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京\"],[\"b6a1\",\"供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈\"],[\"b7a1\",\"掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲\"],[\"b8a1\",\"検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向\"],[\"b9a1\",\"后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込\"],[\"baa1\",\"此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷\"],[\"bba1\",\"察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時\"],[\"bca1\",\"次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周\"],[\"bda1\",\"宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償\"],[\"bea1\",\"勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾\"],[\"bfa1\",\"拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾\"],[\"c0a1\",\"澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線\"],[\"c1a1\",\"繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎\"],[\"c2a1\",\"臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只\"],[\"c3a1\",\"叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵\"],[\"c4a1\",\"帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓\"],[\"c5a1\",\"邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到\"],[\"c6a1\",\"董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入\"],[\"c7a1\",\"如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦\"],[\"c8a1\",\"函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美\"],[\"c9a1\",\"鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服\"],[\"caa1\",\"福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋\"],[\"cba1\",\"法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満\"],[\"cca1\",\"漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒\"],[\"cda1\",\"諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃\"],[\"cea1\",\"痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯\"],[\"cfa1\",\"蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕\"],[\"d0a1\",\"弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲\"],[\"d1a1\",\"僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨\"],[\"d2a1\",\"辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨\"],[\"d3a1\",\"咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉\"],[\"d4a1\",\"圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩\"],[\"d5a1\",\"奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓\"],[\"d6a1\",\"屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏\"],[\"d7a1\",\"廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚\"],[\"d8a1\",\"悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛\"],[\"d9a1\",\"戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼\"],[\"daa1\",\"據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼\"],[\"dba1\",\"曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍\"],[\"dca1\",\"棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣\"],[\"dda1\",\"檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾\"],[\"dea1\",\"沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌\"],[\"dfa1\",\"漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼\"],[\"e0a1\",\"燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱\"],[\"e1a1\",\"瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰\"],[\"e2a1\",\"癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬\"],[\"e3a1\",\"磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐\"],[\"e4a1\",\"筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆\"],[\"e5a1\",\"紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺\"],[\"e6a1\",\"罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋\"],[\"e7a1\",\"隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙\"],[\"e8a1\",\"茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈\"],[\"e9a1\",\"蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙\"],[\"eaa1\",\"蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞\"],[\"eba1\",\"襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫\"],[\"eca1\",\"譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊\"],[\"eda1\",\"蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸\"],[\"eea1\",\"遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮\"],[\"efa1\",\"錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞\"],[\"f0a1\",\"陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰\"],[\"f1a1\",\"顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷\"],[\"f2a1\",\"髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈\"],[\"f3a1\",\"鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠\"],[\"f4a1\",\"堯槇遙瑤凜熙\"],[\"f9a1\",\"纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德\"],[\"faa1\",\"忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱\"],[\"fba1\",\"犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚\"],[\"fca1\",\"釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑\"],[\"fcf1\",\"ⅰ\",9,\"￢￤＇＂\"],[\"8fa2af\",\"˘ˇ¸˙˝¯˛˚～΄΅\"],[\"8fa2c2\",\"¡¦¿\"],[\"8fa2eb\",\"ºª©®™¤№\"],[\"8fa6e1\",\"ΆΈΉΊΪ\"],[\"8fa6e7\",\"Ό\"],[\"8fa6e9\",\"ΎΫ\"],[\"8fa6ec\",\"Ώ\"],[\"8fa6f1\",\"άέήίϊΐόςύϋΰώ\"],[\"8fa7c2\",\"Ђ\",10,\"ЎЏ\"],[\"8fa7f2\",\"ђ\",10,\"ўџ\"],[\"8fa9a1\",\"ÆĐ\"],[\"8fa9a4\",\"Ħ\"],[\"8fa9a6\",\"Ĳ\"],[\"8fa9a8\",\"ŁĿ\"],[\"8fa9ab\",\"ŊØŒ\"],[\"8fa9af\",\"ŦÞ\"],[\"8fa9c1\",\"æđðħıĳĸłŀŉŋøœßŧþ\"],[\"8faaa1\",\"ÁÀÄÂĂǍĀĄÅÃĆĈČÇĊĎÉÈËÊĚĖĒĘ\"],[\"8faaba\",\"ĜĞĢĠĤÍÌÏÎǏİĪĮĨĴĶĹĽĻŃŇŅÑÓÒÖÔǑŐŌÕŔŘŖŚŜŠŞŤŢÚÙÜÛŬǓŰŪŲŮŨǗǛǙǕŴÝŸŶŹŽŻ\"],[\"8faba1\",\"áàäâăǎāąåãćĉčçċďéèëêěėēęǵĝğ\"],[\"8fabbd\",\"ġĥíìïîǐ\"],[\"8fabc5\",\"īįĩĵķĺľļńňņñóòöôǒőōõŕřŗśŝšşťţúùüûŭǔűūųůũǘǜǚǖŵýÿŷźžż\"],[\"8fb0a1\",\"丂丄丅丌丒丟丣两丨丫丮丯丰丵乀乁乄乇乑乚乜乣乨乩乴乵乹乿亍亖亗亝亯亹仃仐仚仛仠仡仢仨仯仱仳仵份仾仿伀伂伃伈伋伌伒伕伖众伙伮伱你伳伵伷伹伻伾佀佂佈佉佋佌佒佔佖佘佟佣佪佬佮佱佷佸佹佺佽佾侁侂侄\"],[\"8fb1a1\",\"侅侉侊侌侎侐侒侓侔侗侙侚侞侟侲侷侹侻侼侽侾俀俁俅俆俈俉俋俌俍俏俒俜俠俢俰俲俼俽俿倀倁倄倇倊倌倎倐倓倗倘倛倜倝倞倢倧倮倰倲倳倵偀偁偂偅偆偊偌偎偑偒偓偗偙偟偠偢偣偦偧偪偭偰偱倻傁傃傄傆傊傎傏傐\"],[\"8fb2a1\",\"傒傓傔傖傛傜傞\",4,\"傪傯傰傹傺傽僀僃僄僇僌僎僐僓僔僘僜僝僟僢僤僦僨僩僯僱僶僺僾儃儆儇儈儋儌儍儎僲儐儗儙儛儜儝儞儣儧儨儬儭儯儱儳儴儵儸儹兂兊兏兓兕兗兘兟兤兦兾冃冄冋冎冘冝冡冣冭冸冺冼冾冿凂\"],[\"8fb3a1\",\"凈减凑凒凓凕凘凞凢凥凮凲凳凴凷刁刂刅划刓刕刖刘刢刨刱刲刵刼剅剉剕剗剘剚剜剟剠剡剦剮剷剸剹劀劂劅劊劌劓劕劖劗劘劚劜劤劥劦劧劯劰劶劷劸劺劻劽勀勄勆勈勌勏勑勔勖勛勜勡勥勨勩勪勬勰勱勴勶勷匀匃匊匋\"],[\"8fb4a1\",\"匌匑匓匘匛匜匞匟匥匧匨匩匫匬匭匰匲匵匼匽匾卂卌卋卙卛卡卣卥卬卭卲卹卾厃厇厈厎厓厔厙厝厡厤厪厫厯厲厴厵厷厸厺厽叀叅叏叒叓叕叚叝叞叠另叧叵吂吓吚吡吧吨吪启吱吴吵呃呄呇呍呏呞呢呤呦呧呩呫呭呮呴呿\"],[\"8fb5a1\",\"咁咃咅咈咉咍咑咕咖咜咟咡咦咧咩咪咭咮咱咷咹咺咻咿哆哊响哎哠哪哬哯哶哼哾哿唀唁唅唈唉唌唍唎唕唪唫唲唵唶唻唼唽啁啇啉啊啍啐啑啘啚啛啞啠啡啤啦啿喁喂喆喈喎喏喑喒喓喔喗喣喤喭喲喿嗁嗃嗆嗉嗋嗌嗎嗑嗒\"],[\"8fb6a1\",\"嗓嗗嗘嗛嗞嗢嗩嗶嗿嘅嘈嘊嘍\",5,\"嘙嘬嘰嘳嘵嘷嘹嘻嘼嘽嘿噀噁噃噄噆噉噋噍噏噔噞噠噡噢噣噦噩噭噯噱噲噵嚄嚅嚈嚋嚌嚕嚙嚚嚝嚞嚟嚦嚧嚨嚩嚫嚬嚭嚱嚳嚷嚾囅囉囊囋囏囐囌囍囙囜囝囟囡囤\",4,\"囱囫园\"],[\"8fb7a1\",\"囶囷圁圂圇圊圌圑圕圚圛圝圠圢圣圤圥圩圪圬圮圯圳圴圽圾圿坅坆坌坍坒坢坥坧坨坫坭\",4,\"坳坴坵坷坹坺坻坼坾垁垃垌垔垗垙垚垜垝垞垟垡垕垧垨垩垬垸垽埇埈埌埏埕埝埞埤埦埧埩埭埰埵埶埸埽埾埿堃堄堈堉埡\"],[\"8fb8a1\",\"堌堍堛堞堟堠堦堧堭堲堹堿塉塌塍塏塐塕塟塡塤塧塨塸塼塿墀墁墇墈墉墊墌墍墏墐墔墖墝墠墡墢墦墩墱墲壄墼壂壈壍壎壐壒壔壖壚壝壡壢壩壳夅夆夋夌夒夓夔虁夝夡夣夤夨夯夰夳夵夶夿奃奆奒奓奙奛奝奞奟奡奣奫奭\"],[\"8fb9a1\",\"奯奲奵奶她奻奼妋妌妎妒妕妗妟妤妧妭妮妯妰妳妷妺妼姁姃姄姈姊姍姒姝姞姟姣姤姧姮姯姱姲姴姷娀娄娌娍娎娒娓娞娣娤娧娨娪娭娰婄婅婇婈婌婐婕婞婣婥婧婭婷婺婻婾媋媐媓媖媙媜媞媟媠媢媧媬媱媲媳媵媸媺媻媿\"],[\"8fbaa1\",\"嫄嫆嫈嫏嫚嫜嫠嫥嫪嫮嫵嫶嫽嬀嬁嬈嬗嬴嬙嬛嬝嬡嬥嬭嬸孁孋孌孒孖孞孨孮孯孼孽孾孿宁宄宆宊宎宐宑宓宔宖宨宩宬宭宯宱宲宷宺宼寀寁寍寏寖\",4,\"寠寯寱寴寽尌尗尞尟尣尦尩尫尬尮尰尲尵尶屙屚屜屢屣屧屨屩\"],[\"8fbba1\",\"屭屰屴屵屺屻屼屽岇岈岊岏岒岝岟岠岢岣岦岪岲岴岵岺峉峋峒峝峗峮峱峲峴崁崆崍崒崫崣崤崦崧崱崴崹崽崿嵂嵃嵆嵈嵕嵑嵙嵊嵟嵠嵡嵢嵤嵪嵭嵰嵹嵺嵾嵿嶁嶃嶈嶊嶒嶓嶔嶕嶙嶛嶟嶠嶧嶫嶰嶴嶸嶹巃巇巋巐巎巘巙巠巤\"],[\"8fbca1\",\"巩巸巹帀帇帍帒帔帕帘帟帠帮帨帲帵帾幋幐幉幑幖幘幛幜幞幨幪\",4,\"幰庀庋庎庢庤庥庨庪庬庱庳庽庾庿廆廌廋廎廑廒廔廕廜廞廥廫异弆弇弈弎弙弜弝弡弢弣弤弨弫弬弮弰弴弶弻弽弿彀彄彅彇彍彐彔彘彛彠彣彤彧\"],[\"8fbda1\",\"彯彲彴彵彸彺彽彾徉徍徏徖徜徝徢徧徫徤徬徯徰徱徸忄忇忈忉忋忐\",4,\"忞忡忢忨忩忪忬忭忮忯忲忳忶忺忼怇怊怍怓怔怗怘怚怟怤怭怳怵恀恇恈恉恌恑恔恖恗恝恡恧恱恾恿悂悆悈悊悎悑悓悕悘悝悞悢悤悥您悰悱悷\"],[\"8fbea1\",\"悻悾惂惄惈惉惊惋惎惏惔惕惙惛惝惞惢惥惲惵惸惼惽愂愇愊愌愐\",4,\"愖愗愙愜愞愢愪愫愰愱愵愶愷愹慁慅慆慉慞慠慬慲慸慻慼慿憀憁憃憄憋憍憒憓憗憘憜憝憟憠憥憨憪憭憸憹憼懀懁懂懎懏懕懜懝懞懟懡懢懧懩懥\"],[\"8fbfa1\",\"懬懭懯戁戃戄戇戓戕戜戠戢戣戧戩戫戹戽扂扃扄扆扌扐扑扒扔扖扚扜扤扭扯扳扺扽抍抎抏抐抦抨抳抶抷抺抾抿拄拎拕拖拚拪拲拴拼拽挃挄挊挋挍挐挓挖挘挩挪挭挵挶挹挼捁捂捃捄捆捊捋捎捒捓捔捘捛捥捦捬捭捱捴捵\"],[\"8fc0a1\",\"捸捼捽捿掂掄掇掊掐掔掕掙掚掞掤掦掭掮掯掽揁揅揈揎揑揓揔揕揜揠揥揪揬揲揳揵揸揹搉搊搐搒搔搘搞搠搢搤搥搩搪搯搰搵搽搿摋摏摑摒摓摔摚摛摜摝摟摠摡摣摭摳摴摻摽撅撇撏撐撑撘撙撛撝撟撡撣撦撨撬撳撽撾撿\"],[\"8fc1a1\",\"擄擉擊擋擌擎擐擑擕擗擤擥擩擪擭擰擵擷擻擿攁攄攈攉攊攏攓攔攖攙攛攞攟攢攦攩攮攱攺攼攽敃敇敉敐敒敔敟敠敧敫敺敽斁斅斊斒斕斘斝斠斣斦斮斲斳斴斿旂旈旉旎旐旔旖旘旟旰旲旴旵旹旾旿昀昄昈昉昍昑昒昕昖昝\"],[\"8fc2a1\",\"昞昡昢昣昤昦昩昪昫昬昮昰昱昳昹昷晀晅晆晊晌晑晎晗晘晙晛晜晠晡曻晪晫晬晾晳晵晿晷晸晹晻暀晼暋暌暍暐暒暙暚暛暜暟暠暤暭暱暲暵暻暿曀曂曃曈曌曎曏曔曛曟曨曫曬曮曺朅朇朎朓朙朜朠朢朳朾杅杇杈杌杔杕杝\"],[\"8fc3a1\",\"杦杬杮杴杶杻极构枎枏枑枓枖枘枙枛枰枱枲枵枻枼枽柹柀柂柃柅柈柉柒柗柙柜柡柦柰柲柶柷桒栔栙栝栟栨栧栬栭栯栰栱栳栻栿桄桅桊桌桕桗桘桛桫桮\",4,\"桵桹桺桻桼梂梄梆梈梖梘梚梜梡梣梥梩梪梮梲梻棅棈棌棏\"],[\"8fc4a1\",\"棐棑棓棖棙棜棝棥棨棪棫棬棭棰棱棵棶棻棼棽椆椉椊椐椑椓椖椗椱椳椵椸椻楂楅楉楎楗楛楣楤楥楦楨楩楬楰楱楲楺楻楿榀榍榒榖榘榡榥榦榨榫榭榯榷榸榺榼槅槈槑槖槗槢槥槮槯槱槳槵槾樀樁樃樏樑樕樚樝樠樤樨樰樲\"],[\"8fc5a1\",\"樴樷樻樾樿橅橆橉橊橎橐橑橒橕橖橛橤橧橪橱橳橾檁檃檆檇檉檋檑檛檝檞檟檥檫檯檰檱檴檽檾檿櫆櫉櫈櫌櫐櫔櫕櫖櫜櫝櫤櫧櫬櫰櫱櫲櫼櫽欂欃欆欇欉欏欐欑欗欛欞欤欨欫欬欯欵欶欻欿歆歊歍歒歖歘歝歠歧歫歮歰歵歽\"],[\"8fc6a1\",\"歾殂殅殗殛殟殠殢殣殨殩殬殭殮殰殸殹殽殾毃毄毉毌毖毚毡毣毦毧毮毱毷毹毿氂氄氅氉氍氎氐氒氙氟氦氧氨氬氮氳氵氶氺氻氿汊汋汍汏汒汔汙汛汜汫汭汯汴汶汸汹汻沅沆沇沉沔沕沗沘沜沟沰沲沴泂泆泍泏泐泑泒泔泖\"],[\"8fc7a1\",\"泚泜泠泧泩泫泬泮泲泴洄洇洊洎洏洑洓洚洦洧洨汧洮洯洱洹洼洿浗浞浟浡浥浧浯浰浼涂涇涑涒涔涖涗涘涪涬涴涷涹涽涿淄淈淊淎淏淖淛淝淟淠淢淥淩淯淰淴淶淼渀渄渞渢渧渲渶渹渻渼湄湅湈湉湋湏湑湒湓湔湗湜湝湞\"],[\"8fc8a1\",\"湢湣湨湳湻湽溍溓溙溠溧溭溮溱溳溻溿滀滁滃滇滈滊滍滎滏滫滭滮滹滻滽漄漈漊漌漍漖漘漚漛漦漩漪漯漰漳漶漻漼漭潏潑潒潓潗潙潚潝潞潡潢潨潬潽潾澃澇澈澋澌澍澐澒澓澔澖澚澟澠澥澦澧澨澮澯澰澵澶澼濅濇濈濊\"],[\"8fc9a1\",\"濚濞濨濩濰濵濹濼濽瀀瀅瀆瀇瀍瀗瀠瀣瀯瀴瀷瀹瀼灃灄灈灉灊灋灔灕灝灞灎灤灥灬灮灵灶灾炁炅炆炔\",4,\"炛炤炫炰炱炴炷烊烑烓烔烕烖烘烜烤烺焃\",4,\"焋焌焏焞焠焫焭焯焰焱焸煁煅煆煇煊煋煐煒煗煚煜煞煠\"],[\"8fcaa1\",\"煨煹熀熅熇熌熒熚熛熠熢熯熰熲熳熺熿燀燁燄燋燌燓燖燙燚燜燸燾爀爇爈爉爓爗爚爝爟爤爫爯爴爸爹牁牂牃牅牎牏牐牓牕牖牚牜牞牠牣牨牫牮牯牱牷牸牻牼牿犄犉犍犎犓犛犨犭犮犱犴犾狁狇狉狌狕狖狘狟狥狳狴狺狻\"],[\"8fcba1\",\"狾猂猄猅猇猋猍猒猓猘猙猞猢猤猧猨猬猱猲猵猺猻猽獃獍獐獒獖獘獝獞獟獠獦獧獩獫獬獮獯獱獷獹獼玀玁玃玅玆玎玐玓玕玗玘玜玞玟玠玢玥玦玪玫玭玵玷玹玼玽玿珅珆珉珋珌珏珒珓珖珙珝珡珣珦珧珩珴珵珷珹珺珻珽\"],[\"8fcca1\",\"珿琀琁琄琇琊琑琚琛琤琦琨\",9,\"琹瑀瑃瑄瑆瑇瑋瑍瑑瑒瑗瑝瑢瑦瑧瑨瑫瑭瑮瑱瑲璀璁璅璆璇璉璏璐璑璒璘璙璚璜璟璠璡璣璦璨璩璪璫璮璯璱璲璵璹璻璿瓈瓉瓌瓐瓓瓘瓚瓛瓞瓟瓤瓨瓪瓫瓯瓴瓺瓻瓼瓿甆\"],[\"8fcda1\",\"甒甖甗甠甡甤甧甩甪甯甶甹甽甾甿畀畃畇畈畎畐畒畗畞畟畡畯畱畹\",5,\"疁疅疐疒疓疕疙疜疢疤疴疺疿痀痁痄痆痌痎痏痗痜痟痠痡痤痧痬痮痯痱痹瘀瘂瘃瘄瘇瘈瘊瘌瘏瘒瘓瘕瘖瘙瘛瘜瘝瘞瘣瘥瘦瘩瘭瘲瘳瘵瘸瘹\"],[\"8fcea1\",\"瘺瘼癊癀癁癃癄癅癉癋癕癙癟癤癥癭癮癯癱癴皁皅皌皍皕皛皜皝皟皠皢\",6,\"皪皭皽盁盅盉盋盌盎盔盙盠盦盨盬盰盱盶盹盼眀眆眊眎眒眔眕眗眙眚眜眢眨眭眮眯眴眵眶眹眽眾睂睅睆睊睍睎睏睒睖睗睜睞睟睠睢\"],[\"8fcfa1\",\"睤睧睪睬睰睲睳睴睺睽瞀瞄瞌瞍瞔瞕瞖瞚瞟瞢瞧瞪瞮瞯瞱瞵瞾矃矉矑矒矕矙矞矟矠矤矦矪矬矰矱矴矸矻砅砆砉砍砎砑砝砡砢砣砭砮砰砵砷硃硄硇硈硌硎硒硜硞硠硡硣硤硨硪确硺硾碊碏碔碘碡碝碞碟碤碨碬碭碰碱碲碳\"],[\"8fd0a1\",\"碻碽碿磇磈磉磌磎磒磓磕磖磤磛磟磠磡磦磪磲磳礀磶磷磺磻磿礆礌礐礚礜礞礟礠礥礧礩礭礱礴礵礻礽礿祄祅祆祊祋祏祑祔祘祛祜祧祩祫祲祹祻祼祾禋禌禑禓禔禕禖禘禛禜禡禨禩禫禯禱禴禸离秂秄秇秈秊秏秔秖秚秝秞\"],[\"8fd1a1\",\"秠秢秥秪秫秭秱秸秼稂稃稇稉稊稌稑稕稛稞稡稧稫稭稯稰稴稵稸稹稺穄穅穇穈穌穕穖穙穜穝穟穠穥穧穪穭穵穸穾窀窂窅窆窊窋窐窑窔窞窠窣窬窳窵窹窻窼竆竉竌竎竑竛竨竩竫竬竱竴竻竽竾笇笔笟笣笧笩笪笫笭笮笯笰\"],[\"8fd2a1\",\"笱笴笽笿筀筁筇筎筕筠筤筦筩筪筭筯筲筳筷箄箉箎箐箑箖箛箞箠箥箬箯箰箲箵箶箺箻箼箽篂篅篈篊篔篖篗篙篚篛篨篪篲篴篵篸篹篺篼篾簁簂簃簄簆簉簋簌簎簏簙簛簠簥簦簨簬簱簳簴簶簹簺籆籊籕籑籒籓籙\",5],[\"8fd3a1\",\"籡籣籧籩籭籮籰籲籹籼籽粆粇粏粔粞粠粦粰粶粷粺粻粼粿糄糇糈糉糍糏糓糔糕糗糙糚糝糦糩糫糵紃紇紈紉紏紑紒紓紖紝紞紣紦紪紭紱紼紽紾絀絁絇絈絍絑絓絗絙絚絜絝絥絧絪絰絸絺絻絿綁綂綃綅綆綈綋綌綍綑綖綗綝\"],[\"8fd4a1\",\"綞綦綧綪綳綶綷綹緂\",4,\"緌緍緎緗緙縀緢緥緦緪緫緭緱緵緶緹緺縈縐縑縕縗縜縝縠縧縨縬縭縯縳縶縿繄繅繇繎繐繒繘繟繡繢繥繫繮繯繳繸繾纁纆纇纊纍纑纕纘纚纝纞缼缻缽缾缿罃罄罇罏罒罓罛罜罝罡罣罤罥罦罭\"],[\"8fd5a1\",\"罱罽罾罿羀羋羍羏羐羑羖羗羜羡羢羦羪羭羴羼羿翀翃翈翎翏翛翟翣翥翨翬翮翯翲翺翽翾翿耇耈耊耍耎耏耑耓耔耖耝耞耟耠耤耦耬耮耰耴耵耷耹耺耼耾聀聄聠聤聦聭聱聵肁肈肎肜肞肦肧肫肸肹胈胍胏胒胔胕胗胘胠胭胮\"],[\"8fd6a1\",\"胰胲胳胶胹胺胾脃脋脖脗脘脜脞脠脤脧脬脰脵脺脼腅腇腊腌腒腗腠腡腧腨腩腭腯腷膁膐膄膅膆膋膎膖膘膛膞膢膮膲膴膻臋臃臅臊臎臏臕臗臛臝臞臡臤臫臬臰臱臲臵臶臸臹臽臿舀舃舏舓舔舙舚舝舡舢舨舲舴舺艃艄艅艆\"],[\"8fd7a1\",\"艋艎艏艑艖艜艠艣艧艭艴艻艽艿芀芁芃芄芇芉芊芎芑芔芖芘芚芛芠芡芣芤芧芨芩芪芮芰芲芴芷芺芼芾芿苆苐苕苚苠苢苤苨苪苭苯苶苷苽苾茀茁茇茈茊茋荔茛茝茞茟茡茢茬茭茮茰茳茷茺茼茽荂荃荄荇荍荎荑荕荖荗荰荸\"],[\"8fd8a1\",\"荽荿莀莂莄莆莍莒莔莕莘莙莛莜莝莦莧莩莬莾莿菀菇菉菏菐菑菔菝荓菨菪菶菸菹菼萁萆萊萏萑萕萙莭萯萹葅葇葈葊葍葏葑葒葖葘葙葚葜葠葤葥葧葪葰葳葴葶葸葼葽蒁蒅蒒蒓蒕蒞蒦蒨蒩蒪蒯蒱蒴蒺蒽蒾蓀蓂蓇蓈蓌蓏蓓\"],[\"8fd9a1\",\"蓜蓧蓪蓯蓰蓱蓲蓷蔲蓺蓻蓽蔂蔃蔇蔌蔎蔐蔜蔞蔢蔣蔤蔥蔧蔪蔫蔯蔳蔴蔶蔿蕆蕏\",4,\"蕖蕙蕜\",6,\"蕤蕫蕯蕹蕺蕻蕽蕿薁薅薆薉薋薌薏薓薘薝薟薠薢薥薧薴薶薷薸薼薽薾薿藂藇藊藋藎薭藘藚藟藠藦藨藭藳藶藼\"],[\"8fdaa1\",\"藿蘀蘄蘅蘍蘎蘐蘑蘒蘘蘙蘛蘞蘡蘧蘩蘶蘸蘺蘼蘽虀虂虆虒虓虖虗虘虙虝虠\",4,\"虩虬虯虵虶虷虺蚍蚑蚖蚘蚚蚜蚡蚦蚧蚨蚭蚱蚳蚴蚵蚷蚸蚹蚿蛀蛁蛃蛅蛑蛒蛕蛗蛚蛜蛠蛣蛥蛧蚈蛺蛼蛽蜄蜅蜇蜋蜎蜏蜐蜓蜔蜙蜞蜟蜡蜣\"],[\"8fdba1\",\"蜨蜮蜯蜱蜲蜹蜺蜼蜽蜾蝀蝃蝅蝍蝘蝝蝡蝤蝥蝯蝱蝲蝻螃\",6,\"螋螌螐螓螕螗螘螙螞螠螣螧螬螭螮螱螵螾螿蟁蟈蟉蟊蟎蟕蟖蟙蟚蟜蟟蟢蟣蟤蟪蟫蟭蟱蟳蟸蟺蟿蠁蠃蠆蠉蠊蠋蠐蠙蠒蠓蠔蠘蠚蠛蠜蠞蠟蠨蠭蠮蠰蠲蠵\"],[\"8fdca1\",\"蠺蠼衁衃衅衈衉衊衋衎衑衕衖衘衚衜衟衠衤衩衱衹衻袀袘袚袛袜袟袠袨袪袺袽袾裀裊\",4,\"裑裒裓裛裞裧裯裰裱裵裷褁褆褍褎褏褕褖褘褙褚褜褠褦褧褨褰褱褲褵褹褺褾襀襂襅襆襉襏襒襗襚襛襜襡襢襣襫襮襰襳襵襺\"],[\"8fdda1\",\"襻襼襽覉覍覐覔覕覛覜覟覠覥覰覴覵覶覷覼觔\",4,\"觥觩觫觭觱觳觶觹觽觿訄訅訇訏訑訒訔訕訞訠訢訤訦訫訬訯訵訷訽訾詀詃詅詇詉詍詎詓詖詗詘詜詝詡詥詧詵詶詷詹詺詻詾詿誀誃誆誋誏誐誒誖誗誙誟誧誩誮誯誳\"],[\"8fdea1\",\"誶誷誻誾諃諆諈諉諊諑諓諔諕諗諝諟諬諰諴諵諶諼諿謅謆謋謑謜謞謟謊謭謰謷謼譂\",4,\"譈譒譓譔譙譍譞譣譭譶譸譹譼譾讁讄讅讋讍讏讔讕讜讞讟谸谹谽谾豅豇豉豋豏豑豓豔豗豘豛豝豙豣豤豦豨豩豭豳豵豶豻豾貆\"],[\"8fdfa1\",\"貇貋貐貒貓貙貛貜貤貹貺賅賆賉賋賏賖賕賙賝賡賨賬賯賰賲賵賷賸賾賿贁贃贉贒贗贛赥赩赬赮赿趂趄趈趍趐趑趕趞趟趠趦趫趬趯趲趵趷趹趻跀跅跆跇跈跊跎跑跔跕跗跙跤跥跧跬跰趼跱跲跴跽踁踄踅踆踋踑踔踖踠踡踢\"],[\"8fe0a1\",\"踣踦踧踱踳踶踷踸踹踽蹀蹁蹋蹍蹎蹏蹔蹛蹜蹝蹞蹡蹢蹩蹬蹭蹯蹰蹱蹹蹺蹻躂躃躉躐躒躕躚躛躝躞躢躧躩躭躮躳躵躺躻軀軁軃軄軇軏軑軔軜軨軮軰軱軷軹軺軭輀輂輇輈輏輐輖輗輘輞輠輡輣輥輧輨輬輭輮輴輵輶輷輺轀轁\"],[\"8fe1a1\",\"轃轇轏轑\",4,\"轘轝轞轥辝辠辡辤辥辦辵辶辸达迀迁迆迊迋迍运迒迓迕迠迣迤迨迮迱迵迶迻迾适逄逈逌逘逛逨逩逯逪逬逭逳逴逷逿遃遄遌遛遝遢遦遧遬遰遴遹邅邈邋邌邎邐邕邗邘邙邛邠邡邢邥邰邲邳邴邶邽郌邾郃\"],[\"8fe2a1\",\"郄郅郇郈郕郗郘郙郜郝郟郥郒郶郫郯郰郴郾郿鄀鄄鄅鄆鄈鄍鄐鄔鄖鄗鄘鄚鄜鄞鄠鄥鄢鄣鄧鄩鄮鄯鄱鄴鄶鄷鄹鄺鄼鄽酃酇酈酏酓酗酙酚酛酡酤酧酭酴酹酺酻醁醃醅醆醊醎醑醓醔醕醘醞醡醦醨醬醭醮醰醱醲醳醶醻醼醽醿\"],[\"8fe3a1\",\"釂釃釅釓釔釗釙釚釞釤釥釩釪釬\",5,\"釷釹釻釽鈀鈁鈄鈅鈆鈇鈉鈊鈌鈐鈒鈓鈖鈘鈜鈝鈣鈤鈥鈦鈨鈮鈯鈰鈳鈵鈶鈸鈹鈺鈼鈾鉀鉂鉃鉆鉇鉊鉍鉎鉏鉑鉘鉙鉜鉝鉠鉡鉥鉧鉨鉩鉮鉯鉰鉵\",4,\"鉻鉼鉽鉿銈銉銊銍銎銒銗\"],[\"8fe4a1\",\"銙銟銠銤銥銧銨銫銯銲銶銸銺銻銼銽銿\",4,\"鋅鋆鋇鋈鋋鋌鋍鋎鋐鋓鋕鋗鋘鋙鋜鋝鋟鋠鋡鋣鋥鋧鋨鋬鋮鋰鋹鋻鋿錀錂錈錍錑錔錕錜錝錞錟錡錤錥錧錩錪錳錴錶錷鍇鍈鍉鍐鍑鍒鍕鍗鍘鍚鍞鍤鍥鍧鍩鍪鍭鍯鍰鍱鍳鍴鍶\"],[\"8fe5a1\",\"鍺鍽鍿鎀鎁鎂鎈鎊鎋鎍鎏鎒鎕鎘鎛鎞鎡鎣鎤鎦鎨鎫鎴鎵鎶鎺鎩鏁鏄鏅鏆鏇鏉\",4,\"鏓鏙鏜鏞鏟鏢鏦鏧鏹鏷鏸鏺鏻鏽鐁鐂鐄鐈鐉鐍鐎鐏鐕鐖鐗鐟鐮鐯鐱鐲鐳鐴鐻鐿鐽鑃鑅鑈鑊鑌鑕鑙鑜鑟鑡鑣鑨鑫鑭鑮鑯鑱鑲钄钃镸镹\"],[\"8fe6a1\",\"镾閄閈閌閍閎閝閞閟閡閦閩閫閬閴閶閺閽閿闆闈闉闋闐闑闒闓闙闚闝闞闟闠闤闦阝阞阢阤阥阦阬阱阳阷阸阹阺阼阽陁陒陔陖陗陘陡陮陴陻陼陾陿隁隂隃隄隉隑隖隚隝隟隤隥隦隩隮隯隳隺雊雒嶲雘雚雝雞雟雩雯雱雺霂\"],[\"8fe7a1\",\"霃霅霉霚霛霝霡霢霣霨霱霳靁靃靊靎靏靕靗靘靚靛靣靧靪靮靳靶靷靸靻靽靿鞀鞉鞕鞖鞗鞙鞚鞞鞟鞢鞬鞮鞱鞲鞵鞶鞸鞹鞺鞼鞾鞿韁韄韅韇韉韊韌韍韎韐韑韔韗韘韙韝韞韠韛韡韤韯韱韴韷韸韺頇頊頙頍頎頔頖頜頞頠頣頦\"],[\"8fe8a1\",\"頫頮頯頰頲頳頵頥頾顄顇顊顑顒顓顖顗顙顚顢顣顥顦顪顬颫颭颮颰颴颷颸颺颻颿飂飅飈飌飡飣飥飦飧飪飳飶餂餇餈餑餕餖餗餚餛餜餟餢餦餧餫餱\",4,\"餹餺餻餼饀饁饆饇饈饍饎饔饘饙饛饜饞饟饠馛馝馟馦馰馱馲馵\"],[\"8fe9a1\",\"馹馺馽馿駃駉駓駔駙駚駜駞駧駪駫駬駰駴駵駹駽駾騂騃騄騋騌騐騑騖騞騠騢騣騤騧騭騮騳騵騶騸驇驁驄驊驋驌驎驑驔驖驝骪骬骮骯骲骴骵骶骹骻骾骿髁髃髆髈髎髐髒髕髖髗髛髜髠髤髥髧髩髬髲髳髵髹髺髽髿\",4],[\"8feaa1\",\"鬄鬅鬈鬉鬋鬌鬍鬎鬐鬒鬖鬙鬛鬜鬠鬦鬫鬭鬳鬴鬵鬷鬹鬺鬽魈魋魌魕魖魗魛魞魡魣魥魦魨魪\",4,\"魳魵魷魸魹魿鮀鮄鮅鮆鮇鮉鮊鮋鮍鮏鮐鮔鮚鮝鮞鮦鮧鮩鮬鮰鮱鮲鮷鮸鮻鮼鮾鮿鯁鯇鯈鯎鯐鯗鯘鯝鯟鯥鯧鯪鯫鯯鯳鯷鯸\"],[\"8feba1\",\"鯹鯺鯽鯿鰀鰂鰋鰏鰑鰖鰘鰙鰚鰜鰞鰢鰣鰦\",4,\"鰱鰵鰶鰷鰽鱁鱃鱄鱅鱉鱊鱎鱏鱐鱓鱔鱖鱘鱛鱝鱞鱟鱣鱩鱪鱜鱫鱨鱮鱰鱲鱵鱷鱻鳦鳲鳷鳹鴋鴂鴑鴗鴘鴜鴝鴞鴯鴰鴲鴳鴴鴺鴼鵅鴽鵂鵃鵇鵊鵓鵔鵟鵣鵢鵥鵩鵪鵫鵰鵶鵷鵻\"],[\"8feca1\",\"鵼鵾鶃鶄鶆鶊鶍鶎鶒鶓鶕鶖鶗鶘鶡鶪鶬鶮鶱鶵鶹鶼鶿鷃鷇鷉鷊鷔鷕鷖鷗鷚鷞鷟鷠鷥鷧鷩鷫鷮鷰鷳鷴鷾鸊鸂鸇鸎鸐鸑鸒鸕鸖鸙鸜鸝鹺鹻鹼麀麂麃麄麅麇麎麏麖麘麛麞麤麨麬麮麯麰麳麴麵黆黈黋黕黟黤黧黬黭黮黰黱黲黵\"],[\"8feda1\",\"黸黿鼂鼃鼉鼏鼐鼑鼒鼔鼖鼗鼙鼚鼛鼟鼢鼦鼪鼫鼯鼱鼲鼴鼷鼹鼺鼼鼽鼿齁齃\",4,\"齓齕齖齗齘齚齝齞齨齩齭\",4,\"齳齵齺齽龏龐龑龒龔龖龗龞龡龢龣龥\"]]\n\n/***/ }),\n/* 720 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"uChars\":[128,165,169,178,184,216,226,235,238,244,248,251,253,258,276,284,300,325,329,334,364,463,465,467,469,471,473,475,477,506,594,610,712,716,730,930,938,962,970,1026,1104,1106,8209,8215,8218,8222,8231,8241,8244,8246,8252,8365,8452,8454,8458,8471,8482,8556,8570,8596,8602,8713,8720,8722,8726,8731,8737,8740,8742,8748,8751,8760,8766,8777,8781,8787,8802,8808,8816,8854,8858,8870,8896,8979,9322,9372,9548,9588,9616,9622,9634,9652,9662,9672,9676,9680,9702,9735,9738,9793,9795,11906,11909,11913,11917,11928,11944,11947,11951,11956,11960,11964,11979,12284,12292,12312,12319,12330,12351,12436,12447,12535,12543,12586,12842,12850,12964,13200,13215,13218,13253,13263,13267,13270,13384,13428,13727,13839,13851,14617,14703,14801,14816,14964,15183,15471,15585,16471,16736,17208,17325,17330,17374,17623,17997,18018,18212,18218,18301,18318,18760,18811,18814,18820,18823,18844,18848,18872,19576,19620,19738,19887,40870,59244,59336,59367,59413,59417,59423,59431,59437,59443,59452,59460,59478,59493,63789,63866,63894,63976,63986,64016,64018,64021,64025,64034,64037,64042,65074,65093,65107,65112,65127,65132,65375,65510,65536],\"gbChars\":[0,36,38,45,50,81,89,95,96,100,103,104,105,109,126,133,148,172,175,179,208,306,307,308,309,310,311,312,313,341,428,443,544,545,558,741,742,749,750,805,819,820,7922,7924,7925,7927,7934,7943,7944,7945,7950,8062,8148,8149,8152,8164,8174,8236,8240,8262,8264,8374,8380,8381,8384,8388,8390,8392,8393,8394,8396,8401,8406,8416,8419,8424,8437,8439,8445,8482,8485,8496,8521,8603,8936,8946,9046,9050,9063,9066,9076,9092,9100,9108,9111,9113,9131,9162,9164,9218,9219,11329,11331,11334,11336,11346,11361,11363,11366,11370,11372,11375,11389,11682,11686,11687,11692,11694,11714,11716,11723,11725,11730,11736,11982,11989,12102,12336,12348,12350,12384,12393,12395,12397,12510,12553,12851,12962,12973,13738,13823,13919,13933,14080,14298,14585,14698,15583,15847,16318,16434,16438,16481,16729,17102,17122,17315,17320,17402,17418,17859,17909,17911,17915,17916,17936,17939,17961,18664,18703,18814,18962,19043,33469,33470,33471,33484,33485,33490,33497,33501,33505,33513,33520,33536,33550,37845,37921,37948,38029,38038,38064,38065,38066,38069,38075,38076,38078,39108,39109,39113,39114,39115,39116,39265,39394,189000]}\n\n/***/ }),\n/* 721 */\n/***/ (function(module, exports) {\n\nmodule.exports = [[\"0\",\"\\u0000\",128],[\"a1\",\"｡\",62],[\"8140\",\"　、。，．・：；？！゛゜´｀¨＾￣＿ヽヾゝゞ〃仝々〆〇ー―‐／＼～∥｜…‥‘’“”（）〔〕［］｛｝〈\",9,\"＋－±×\"],[\"8180\",\"÷＝≠＜＞≦≧∞∴♂♀°′″℃￥＄￠￡％＃＆＊＠§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓\"],[\"81b8\",\"∈∋⊆⊇⊂⊃∪∩\"],[\"81c8\",\"∧∨￢⇒⇔∀∃\"],[\"81da\",\"∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬\"],[\"81f0\",\"Å‰♯♭♪†‡¶\"],[\"81fc\",\"◯\"],[\"824f\",\"０\",9],[\"8260\",\"Ａ\",25],[\"8281\",\"ａ\",25],[\"829f\",\"ぁ\",82],[\"8340\",\"ァ\",62],[\"8380\",\"ム\",22],[\"839f\",\"Α\",16,\"Σ\",6],[\"83bf\",\"α\",16,\"σ\",6],[\"8440\",\"А\",5,\"ЁЖ\",25],[\"8470\",\"а\",5,\"ёж\",7],[\"8480\",\"о\",17],[\"849f\",\"─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂\"],[\"8740\",\"①\",19,\"Ⅰ\",9],[\"875f\",\"㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡\"],[\"877e\",\"㍻\"],[\"8780\",\"〝〟№㏍℡㊤\",4,\"㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪\"],[\"889f\",\"亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭\"],[\"8940\",\"院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円\"],[\"8980\",\"園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改\"],[\"8a40\",\"魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫\"],[\"8a80\",\"橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄\"],[\"8b40\",\"機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救\"],[\"8b80\",\"朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈\"],[\"8c40\",\"掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨\"],[\"8c80\",\"劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向\"],[\"8d40\",\"后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降\"],[\"8d80\",\"項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷\"],[\"8e40\",\"察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止\"],[\"8e80\",\"死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周\"],[\"8f40\",\"宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳\"],[\"8f80\",\"準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾\"],[\"9040\",\"拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨\"],[\"9080\",\"逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線\"],[\"9140\",\"繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻\"],[\"9180\",\"操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只\"],[\"9240\",\"叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄\"],[\"9280\",\"逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓\"],[\"9340\",\"邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬\"],[\"9380\",\"凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入\"],[\"9440\",\"如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅\"],[\"9480\",\"楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美\"],[\"9540\",\"鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷\"],[\"9580\",\"斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋\"],[\"9640\",\"法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆\"],[\"9680\",\"摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒\"],[\"9740\",\"諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲\"],[\"9780\",\"沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯\"],[\"9840\",\"蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕\"],[\"989f\",\"弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲\"],[\"9940\",\"僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭\"],[\"9980\",\"凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨\"],[\"9a40\",\"咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸\"],[\"9a80\",\"噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩\"],[\"9b40\",\"奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀\"],[\"9b80\",\"它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏\"],[\"9c40\",\"廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠\"],[\"9c80\",\"怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛\"],[\"9d40\",\"戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫\"],[\"9d80\",\"捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼\"],[\"9e40\",\"曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎\"],[\"9e80\",\"梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣\"],[\"9f40\",\"檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯\"],[\"9f80\",\"麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌\"],[\"e040\",\"漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝\"],[\"e080\",\"烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱\"],[\"e140\",\"瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿\"],[\"e180\",\"痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬\"],[\"e240\",\"磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰\"],[\"e280\",\"窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆\"],[\"e340\",\"紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷\"],[\"e380\",\"縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋\"],[\"e440\",\"隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤\"],[\"e480\",\"艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈\"],[\"e540\",\"蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬\"],[\"e580\",\"蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞\"],[\"e640\",\"襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧\"],[\"e680\",\"諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊\"],[\"e740\",\"蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜\"],[\"e780\",\"轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮\"],[\"e840\",\"錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙\"],[\"e880\",\"閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰\"],[\"e940\",\"顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃\"],[\"e980\",\"騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈\"],[\"ea40\",\"鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯\"],[\"ea80\",\"黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙\"],[\"ed40\",\"纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏\"],[\"ed80\",\"塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱\"],[\"ee40\",\"犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙\"],[\"ee80\",\"蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑\"],[\"eeef\",\"ⅰ\",9,\"￢￤＇＂\"],[\"f040\",\"\",62],[\"f080\",\"\",124],[\"f140\",\"\",62],[\"f180\",\"\",124],[\"f240\",\"\",62],[\"f280\",\"\",124],[\"f340\",\"\",62],[\"f380\",\"\",124],[\"f440\",\"\",62],[\"f480\",\"\",124],[\"f540\",\"\",62],[\"f580\",\"\",124],[\"f640\",\"\",62],[\"f680\",\"\",124],[\"f740\",\"\",62],[\"f780\",\"\",124],[\"f840\",\"\",62],[\"f880\",\"\",124],[\"f940\",\"\"],[\"fa40\",\"ⅰ\",9,\"Ⅰ\",9,\"￢￤＇＂㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊\"],[\"fa80\",\"兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯\"],[\"fb40\",\"涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神\"],[\"fb80\",\"祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙\"],[\"fc40\",\"髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑\"]]\n\n/***/ }),\n/* 722 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar Buffer = __webpack_require__(15).Buffer;\n\n// Note: UTF16-LE (or UCS2) codec is Node.js native. See encodings/internal.js\n\n// == UTF16-BE codec. ==========================================================\n\nexports.utf16be = Utf16BECodec;\nfunction Utf16BECodec() {\n}\n\nUtf16BECodec.prototype.encoder = Utf16BEEncoder;\nUtf16BECodec.prototype.decoder = Utf16BEDecoder;\nUtf16BECodec.prototype.bomAware = true;\n\n\n// -- Encoding\n\nfunction Utf16BEEncoder() {\n}\n\nUtf16BEEncoder.prototype.write = function(str) {\n    var buf = Buffer.from(str, 'ucs2');\n    for (var i = 0; i < buf.length; i += 2) {\n        var tmp = buf[i]; buf[i] = buf[i+1]; buf[i+1] = tmp;\n    }\n    return buf;\n}\n\nUtf16BEEncoder.prototype.end = function() {\n}\n\n\n// -- Decoding\n\nfunction Utf16BEDecoder() {\n    this.overflowByte = -1;\n}\n\nUtf16BEDecoder.prototype.write = function(buf) {\n    if (buf.length == 0)\n        return '';\n\n    var buf2 = Buffer.alloc(buf.length + 1),\n        i = 0, j = 0;\n\n    if (this.overflowByte !== -1) {\n        buf2[0] = buf[0];\n        buf2[1] = this.overflowByte;\n        i = 1; j = 2;\n    }\n\n    for (; i < buf.length-1; i += 2, j+= 2) {\n        buf2[j] = buf[i+1];\n        buf2[j+1] = buf[i];\n    }\n\n    this.overflowByte = (i == buf.length-1) ? buf[buf.length-1] : -1;\n\n    return buf2.slice(0, j).toString('ucs2');\n}\n\nUtf16BEDecoder.prototype.end = function() {\n}\n\n\n// == UTF-16 codec =============================================================\n// Decoder chooses automatically from UTF-16LE and UTF-16BE using BOM and space-based heuristic.\n// Defaults to UTF-16LE, as it's prevalent and default in Node.\n// http://en.wikipedia.org/wiki/UTF-16 and http://encoding.spec.whatwg.org/#utf-16le\n// Decoder default can be changed: iconv.decode(buf, 'utf16', {defaultEncoding: 'utf-16be'});\n\n// Encoder uses UTF-16LE and prepends BOM (which can be overridden with addBOM: false).\n\nexports.utf16 = Utf16Codec;\nfunction Utf16Codec(codecOptions, iconv) {\n    this.iconv = iconv;\n}\n\nUtf16Codec.prototype.encoder = Utf16Encoder;\nUtf16Codec.prototype.decoder = Utf16Decoder;\n\n\n// -- Encoding (pass-through)\n\nfunction Utf16Encoder(options, codec) {\n    options = options || {};\n    if (options.addBOM === undefined)\n        options.addBOM = true;\n    this.encoder = codec.iconv.getEncoder('utf-16le', options);\n}\n\nUtf16Encoder.prototype.write = function(str) {\n    return this.encoder.write(str);\n}\n\nUtf16Encoder.prototype.end = function() {\n    return this.encoder.end();\n}\n\n\n// -- Decoding\n\nfunction Utf16Decoder(options, codec) {\n    this.decoder = null;\n    this.initialBytes = [];\n    this.initialBytesLen = 0;\n\n    this.options = options || {};\n    this.iconv = codec.iconv;\n}\n\nUtf16Decoder.prototype.write = function(buf) {\n    if (!this.decoder) {\n        // Codec is not chosen yet. Accumulate initial bytes.\n        this.initialBytes.push(buf);\n        this.initialBytesLen += buf.length;\n        \n        if (this.initialBytesLen < 16) // We need more bytes to use space heuristic (see below)\n            return '';\n\n        // We have enough bytes -> detect endianness.\n        var buf = Buffer.concat(this.initialBytes),\n            encoding = detectEncoding(buf, this.options.defaultEncoding);\n        this.decoder = this.iconv.getDecoder(encoding, this.options);\n        this.initialBytes.length = this.initialBytesLen = 0;\n    }\n\n    return this.decoder.write(buf);\n}\n\nUtf16Decoder.prototype.end = function() {\n    if (!this.decoder) {\n        var buf = Buffer.concat(this.initialBytes),\n            encoding = detectEncoding(buf, this.options.defaultEncoding);\n        this.decoder = this.iconv.getDecoder(encoding, this.options);\n\n        var res = this.decoder.write(buf),\n            trail = this.decoder.end();\n\n        return trail ? (res + trail) : res;\n    }\n    return this.decoder.end();\n}\n\nfunction detectEncoding(buf, defaultEncoding) {\n    var enc = defaultEncoding || 'utf-16le';\n\n    if (buf.length >= 2) {\n        // Check BOM.\n        if (buf[0] == 0xFE && buf[1] == 0xFF) // UTF-16BE BOM\n            enc = 'utf-16be';\n        else if (buf[0] == 0xFF && buf[1] == 0xFE) // UTF-16LE BOM\n            enc = 'utf-16le';\n        else {\n            // No BOM found. Try to deduce encoding from initial content.\n            // Most of the time, the content has ASCII chars (U+00**), but the opposite (U+**00) is uncommon.\n            // So, we count ASCII as if it was LE or BE, and decide from that.\n            var asciiCharsLE = 0, asciiCharsBE = 0, // Counts of chars in both positions\n                _len = Math.min(buf.length - (buf.length % 2), 64); // Len is always even.\n\n            for (var i = 0; i < _len; i += 2) {\n                if (buf[i] === 0 && buf[i+1] !== 0) asciiCharsBE++;\n                if (buf[i] !== 0 && buf[i+1] === 0) asciiCharsLE++;\n            }\n\n            if (asciiCharsBE > asciiCharsLE)\n                enc = 'utf-16be';\n            else if (asciiCharsBE < asciiCharsLE)\n                enc = 'utf-16le';\n        }\n    }\n\n    return enc;\n}\n\n\n\n\n/***/ }),\n/* 723 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar Buffer = __webpack_require__(15).Buffer;\n\n// UTF-7 codec, according to https://tools.ietf.org/html/rfc2152\n// See also below a UTF-7-IMAP codec, according to http://tools.ietf.org/html/rfc3501#section-5.1.3\n\nexports.utf7 = Utf7Codec;\nexports.unicode11utf7 = 'utf7'; // Alias UNICODE-1-1-UTF-7\nfunction Utf7Codec(codecOptions, iconv) {\n    this.iconv = iconv;\n};\n\nUtf7Codec.prototype.encoder = Utf7Encoder;\nUtf7Codec.prototype.decoder = Utf7Decoder;\nUtf7Codec.prototype.bomAware = true;\n\n\n// -- Encoding\n\nvar nonDirectChars = /[^A-Za-z0-9'\\(\\),-\\.\\/:\\? \\n\\r\\t]+/g;\n\nfunction Utf7Encoder(options, codec) {\n    this.iconv = codec.iconv;\n}\n\nUtf7Encoder.prototype.write = function(str) {\n    // Naive implementation.\n    // Non-direct chars are encoded as \"+<base64>-\"; single \"+\" char is encoded as \"+-\".\n    return Buffer.from(str.replace(nonDirectChars, function(chunk) {\n        return \"+\" + (chunk === '+' ? '' : \n            this.iconv.encode(chunk, 'utf16-be').toString('base64').replace(/=+$/, '')) \n            + \"-\";\n    }.bind(this)));\n}\n\nUtf7Encoder.prototype.end = function() {\n}\n\n\n// -- Decoding\n\nfunction Utf7Decoder(options, codec) {\n    this.iconv = codec.iconv;\n    this.inBase64 = false;\n    this.base64Accum = '';\n}\n\nvar base64Regex = /[A-Za-z0-9\\/+]/;\nvar base64Chars = [];\nfor (var i = 0; i < 256; i++)\n    base64Chars[i] = base64Regex.test(String.fromCharCode(i));\n\nvar plusChar = '+'.charCodeAt(0), \n    minusChar = '-'.charCodeAt(0),\n    andChar = '&'.charCodeAt(0);\n\nUtf7Decoder.prototype.write = function(buf) {\n    var res = \"\", lastI = 0,\n        inBase64 = this.inBase64,\n        base64Accum = this.base64Accum;\n\n    // The decoder is more involved as we must handle chunks in stream.\n\n    for (var i = 0; i < buf.length; i++) {\n        if (!inBase64) { // We're in direct mode.\n            // Write direct chars until '+'\n            if (buf[i] == plusChar) {\n                res += this.iconv.decode(buf.slice(lastI, i), \"ascii\"); // Write direct chars.\n                lastI = i+1;\n                inBase64 = true;\n            }\n        } else { // We decode base64.\n            if (!base64Chars[buf[i]]) { // Base64 ended.\n                if (i == lastI && buf[i] == minusChar) {// \"+-\" -> \"+\"\n                    res += \"+\";\n                } else {\n                    var b64str = base64Accum + buf.slice(lastI, i).toString();\n                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), \"utf16-be\");\n                }\n\n                if (buf[i] != minusChar) // Minus is absorbed after base64.\n                    i--;\n\n                lastI = i+1;\n                inBase64 = false;\n                base64Accum = '';\n            }\n        }\n    }\n\n    if (!inBase64) {\n        res += this.iconv.decode(buf.slice(lastI), \"ascii\"); // Write direct chars.\n    } else {\n        var b64str = base64Accum + buf.slice(lastI).toString();\n\n        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.\n        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.\n        b64str = b64str.slice(0, canBeDecoded);\n\n        res += this.iconv.decode(Buffer.from(b64str, 'base64'), \"utf16-be\");\n    }\n\n    this.inBase64 = inBase64;\n    this.base64Accum = base64Accum;\n\n    return res;\n}\n\nUtf7Decoder.prototype.end = function() {\n    var res = \"\";\n    if (this.inBase64 && this.base64Accum.length > 0)\n        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), \"utf16-be\");\n\n    this.inBase64 = false;\n    this.base64Accum = '';\n    return res;\n}\n\n\n// UTF-7-IMAP codec.\n// RFC3501 Sec. 5.1.3 Modified UTF-7 (http://tools.ietf.org/html/rfc3501#section-5.1.3)\n// Differences:\n//  * Base64 part is started by \"&\" instead of \"+\"\n//  * Direct characters are 0x20-0x7E, except \"&\" (0x26)\n//  * In Base64, \",\" is used instead of \"/\"\n//  * Base64 must not be used to represent direct characters.\n//  * No implicit shift back from Base64 (should always end with '-')\n//  * String must end in non-shifted position.\n//  * \"-&\" while in base64 is not allowed.\n\n\nexports.utf7imap = Utf7IMAPCodec;\nfunction Utf7IMAPCodec(codecOptions, iconv) {\n    this.iconv = iconv;\n};\n\nUtf7IMAPCodec.prototype.encoder = Utf7IMAPEncoder;\nUtf7IMAPCodec.prototype.decoder = Utf7IMAPDecoder;\nUtf7IMAPCodec.prototype.bomAware = true;\n\n\n// -- Encoding\n\nfunction Utf7IMAPEncoder(options, codec) {\n    this.iconv = codec.iconv;\n    this.inBase64 = false;\n    this.base64Accum = Buffer.alloc(6);\n    this.base64AccumIdx = 0;\n}\n\nUtf7IMAPEncoder.prototype.write = function(str) {\n    var inBase64 = this.inBase64,\n        base64Accum = this.base64Accum,\n        base64AccumIdx = this.base64AccumIdx,\n        buf = Buffer.alloc(str.length*5 + 10), bufIdx = 0;\n\n    for (var i = 0; i < str.length; i++) {\n        var uChar = str.charCodeAt(i);\n        if (0x20 <= uChar && uChar <= 0x7E) { // Direct character or '&'.\n            if (inBase64) {\n                if (base64AccumIdx > 0) {\n                    bufIdx += buf.write(base64Accum.slice(0, base64AccumIdx).toString('base64').replace(/\\//g, ',').replace(/=+$/, ''), bufIdx);\n                    base64AccumIdx = 0;\n                }\n\n                buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.\n                inBase64 = false;\n            }\n\n            if (!inBase64) {\n                buf[bufIdx++] = uChar; // Write direct character\n\n                if (uChar === andChar)  // Ampersand -> '&-'\n                    buf[bufIdx++] = minusChar;\n            }\n\n        } else { // Non-direct character\n            if (!inBase64) {\n                buf[bufIdx++] = andChar; // Write '&', then go to base64 mode.\n                inBase64 = true;\n            }\n            if (inBase64) {\n                base64Accum[base64AccumIdx++] = uChar >> 8;\n                base64Accum[base64AccumIdx++] = uChar & 0xFF;\n\n                if (base64AccumIdx == base64Accum.length) {\n                    bufIdx += buf.write(base64Accum.toString('base64').replace(/\\//g, ','), bufIdx);\n                    base64AccumIdx = 0;\n                }\n            }\n        }\n    }\n\n    this.inBase64 = inBase64;\n    this.base64AccumIdx = base64AccumIdx;\n\n    return buf.slice(0, bufIdx);\n}\n\nUtf7IMAPEncoder.prototype.end = function() {\n    var buf = Buffer.alloc(10), bufIdx = 0;\n    if (this.inBase64) {\n        if (this.base64AccumIdx > 0) {\n            bufIdx += buf.write(this.base64Accum.slice(0, this.base64AccumIdx).toString('base64').replace(/\\//g, ',').replace(/=+$/, ''), bufIdx);\n            this.base64AccumIdx = 0;\n        }\n\n        buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.\n        this.inBase64 = false;\n    }\n\n    return buf.slice(0, bufIdx);\n}\n\n\n// -- Decoding\n\nfunction Utf7IMAPDecoder(options, codec) {\n    this.iconv = codec.iconv;\n    this.inBase64 = false;\n    this.base64Accum = '';\n}\n\nvar base64IMAPChars = base64Chars.slice();\nbase64IMAPChars[','.charCodeAt(0)] = true;\n\nUtf7IMAPDecoder.prototype.write = function(buf) {\n    var res = \"\", lastI = 0,\n        inBase64 = this.inBase64,\n        base64Accum = this.base64Accum;\n\n    // The decoder is more involved as we must handle chunks in stream.\n    // It is forgiving, closer to standard UTF-7 (for example, '-' is optional at the end).\n\n    for (var i = 0; i < buf.length; i++) {\n        if (!inBase64) { // We're in direct mode.\n            // Write direct chars until '&'\n            if (buf[i] == andChar) {\n                res += this.iconv.decode(buf.slice(lastI, i), \"ascii\"); // Write direct chars.\n                lastI = i+1;\n                inBase64 = true;\n            }\n        } else { // We decode base64.\n            if (!base64IMAPChars[buf[i]]) { // Base64 ended.\n                if (i == lastI && buf[i] == minusChar) { // \"&-\" -> \"&\"\n                    res += \"&\";\n                } else {\n                    var b64str = base64Accum + buf.slice(lastI, i).toString().replace(/,/g, '/');\n                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), \"utf16-be\");\n                }\n\n                if (buf[i] != minusChar) // Minus may be absorbed after base64.\n                    i--;\n\n                lastI = i+1;\n                inBase64 = false;\n                base64Accum = '';\n            }\n        }\n    }\n\n    if (!inBase64) {\n        res += this.iconv.decode(buf.slice(lastI), \"ascii\"); // Write direct chars.\n    } else {\n        var b64str = base64Accum + buf.slice(lastI).toString().replace(/,/g, '/');\n\n        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.\n        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.\n        b64str = b64str.slice(0, canBeDecoded);\n\n        res += this.iconv.decode(Buffer.from(b64str, 'base64'), \"utf16-be\");\n    }\n\n    this.inBase64 = inBase64;\n    this.base64Accum = base64Accum;\n\n    return res;\n}\n\nUtf7IMAPDecoder.prototype.end = function() {\n    var res = \"\";\n    if (this.inBase64 && this.base64Accum.length > 0)\n        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), \"utf16-be\");\n\n    this.inBase64 = false;\n    this.base64Accum = '';\n    return res;\n}\n\n\n\n\n/***/ }),\n/* 724 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar BOMChar = '\\uFEFF';\n\nexports.PrependBOM = PrependBOMWrapper\nfunction PrependBOMWrapper(encoder, options) {\n    this.encoder = encoder;\n    this.addBOM = true;\n}\n\nPrependBOMWrapper.prototype.write = function(str) {\n    if (this.addBOM) {\n        str = BOMChar + str;\n        this.addBOM = false;\n    }\n\n    return this.encoder.write(str);\n}\n\nPrependBOMWrapper.prototype.end = function() {\n    return this.encoder.end();\n}\n\n\n//------------------------------------------------------------------------------\n\nexports.StripBOM = StripBOMWrapper;\nfunction StripBOMWrapper(decoder, options) {\n    this.decoder = decoder;\n    this.pass = false;\n    this.options = options || {};\n}\n\nStripBOMWrapper.prototype.write = function(buf) {\n    var res = this.decoder.write(buf);\n    if (this.pass || !res)\n        return res;\n\n    if (res[0] === BOMChar) {\n        res = res.slice(1);\n        if (typeof this.options.stripBOM === 'function')\n            this.options.stripBOM();\n    }\n\n    this.pass = true;\n    return res;\n}\n\nStripBOMWrapper.prototype.end = function() {\n    return this.decoder.end();\n}\n\n\n\n/***/ }),\n/* 725 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar Buffer = __webpack_require__(64).Buffer;\n// Note: not polyfilled with safer-buffer on a purpose, as overrides Buffer\n\n// == Extend Node primitives to use iconv-lite =================================\n\nmodule.exports = function (iconv) {\n    var original = undefined; // Place to keep original methods.\n\n    // Node authors rewrote Buffer internals to make it compatible with\n    // Uint8Array and we cannot patch key functions since then.\n    // Note: this does use older Buffer API on a purpose\n    iconv.supportsNodeEncodingsExtension = !(Buffer.from || new Buffer(0) instanceof Uint8Array);\n\n    iconv.extendNodeEncodings = function extendNodeEncodings() {\n        if (original) return;\n        original = {};\n\n        if (!iconv.supportsNodeEncodingsExtension) {\n            console.error(\"ACTION NEEDED: require('iconv-lite').extendNodeEncodings() is not supported in your version of Node\");\n            console.error(\"See more info at https://github.com/ashtuchkin/iconv-lite/wiki/Node-v4-compatibility\");\n            return;\n        }\n\n        var nodeNativeEncodings = {\n            'hex': true, 'utf8': true, 'utf-8': true, 'ascii': true, 'binary': true, \n            'base64': true, 'ucs2': true, 'ucs-2': true, 'utf16le': true, 'utf-16le': true,\n        };\n\n        Buffer.isNativeEncoding = function(enc) {\n            return enc && nodeNativeEncodings[enc.toLowerCase()];\n        }\n\n        // -- SlowBuffer -----------------------------------------------------------\n        var SlowBuffer = __webpack_require__(64).SlowBuffer;\n\n        original.SlowBufferToString = SlowBuffer.prototype.toString;\n        SlowBuffer.prototype.toString = function(encoding, start, end) {\n            encoding = String(encoding || 'utf8').toLowerCase();\n\n            // Use native conversion when possible\n            if (Buffer.isNativeEncoding(encoding))\n                return original.SlowBufferToString.call(this, encoding, start, end);\n\n            // Otherwise, use our decoding method.\n            if (typeof start == 'undefined') start = 0;\n            if (typeof end == 'undefined') end = this.length;\n            return iconv.decode(this.slice(start, end), encoding);\n        }\n\n        original.SlowBufferWrite = SlowBuffer.prototype.write;\n        SlowBuffer.prototype.write = function(string, offset, length, encoding) {\n            // Support both (string, offset, length, encoding)\n            // and the legacy (string, encoding, offset, length)\n            if (isFinite(offset)) {\n                if (!isFinite(length)) {\n                    encoding = length;\n                    length = undefined;\n                }\n            } else {  // legacy\n                var swap = encoding;\n                encoding = offset;\n                offset = length;\n                length = swap;\n            }\n\n            offset = +offset || 0;\n            var remaining = this.length - offset;\n            if (!length) {\n                length = remaining;\n            } else {\n                length = +length;\n                if (length > remaining) {\n                    length = remaining;\n                }\n            }\n            encoding = String(encoding || 'utf8').toLowerCase();\n\n            // Use native conversion when possible\n            if (Buffer.isNativeEncoding(encoding))\n                return original.SlowBufferWrite.call(this, string, offset, length, encoding);\n\n            if (string.length > 0 && (length < 0 || offset < 0))\n                throw new RangeError('attempt to write beyond buffer bounds');\n\n            // Otherwise, use our encoding method.\n            var buf = iconv.encode(string, encoding);\n            if (buf.length < length) length = buf.length;\n            buf.copy(this, offset, 0, length);\n            return length;\n        }\n\n        // -- Buffer ---------------------------------------------------------------\n\n        original.BufferIsEncoding = Buffer.isEncoding;\n        Buffer.isEncoding = function(encoding) {\n            return Buffer.isNativeEncoding(encoding) || iconv.encodingExists(encoding);\n        }\n\n        original.BufferByteLength = Buffer.byteLength;\n        Buffer.byteLength = SlowBuffer.byteLength = function(str, encoding) {\n            encoding = String(encoding || 'utf8').toLowerCase();\n\n            // Use native conversion when possible\n            if (Buffer.isNativeEncoding(encoding))\n                return original.BufferByteLength.call(this, str, encoding);\n\n            // Slow, I know, but we don't have a better way yet.\n            return iconv.encode(str, encoding).length;\n        }\n\n        original.BufferToString = Buffer.prototype.toString;\n        Buffer.prototype.toString = function(encoding, start, end) {\n            encoding = String(encoding || 'utf8').toLowerCase();\n\n            // Use native conversion when possible\n            if (Buffer.isNativeEncoding(encoding))\n                return original.BufferToString.call(this, encoding, start, end);\n\n            // Otherwise, use our decoding method.\n            if (typeof start == 'undefined') start = 0;\n            if (typeof end == 'undefined') end = this.length;\n            return iconv.decode(this.slice(start, end), encoding);\n        }\n\n        original.BufferWrite = Buffer.prototype.write;\n        Buffer.prototype.write = function(string, offset, length, encoding) {\n            var _offset = offset, _length = length, _encoding = encoding;\n            // Support both (string, offset, length, encoding)\n            // and the legacy (string, encoding, offset, length)\n            if (isFinite(offset)) {\n                if (!isFinite(length)) {\n                    encoding = length;\n                    length = undefined;\n                }\n            } else {  // legacy\n                var swap = encoding;\n                encoding = offset;\n                offset = length;\n                length = swap;\n            }\n\n            encoding = String(encoding || 'utf8').toLowerCase();\n\n            // Use native conversion when possible\n            if (Buffer.isNativeEncoding(encoding))\n                return original.BufferWrite.call(this, string, _offset, _length, _encoding);\n\n            offset = +offset || 0;\n            var remaining = this.length - offset;\n            if (!length) {\n                length = remaining;\n            } else {\n                length = +length;\n                if (length > remaining) {\n                    length = remaining;\n                }\n            }\n\n            if (string.length > 0 && (length < 0 || offset < 0))\n                throw new RangeError('attempt to write beyond buffer bounds');\n\n            // Otherwise, use our encoding method.\n            var buf = iconv.encode(string, encoding);\n            if (buf.length < length) length = buf.length;\n            buf.copy(this, offset, 0, length);\n            return length;\n\n            // TODO: Set _charsWritten.\n        }\n\n\n        // -- Readable -------------------------------------------------------------\n        if (iconv.supportsStreams) {\n            var Readable = __webpack_require__(23).Readable;\n\n            original.ReadableSetEncoding = Readable.prototype.setEncoding;\n            Readable.prototype.setEncoding = function setEncoding(enc, options) {\n                // Use our own decoder, it has the same interface.\n                // We cannot use original function as it doesn't handle BOM-s.\n                this._readableState.decoder = iconv.getDecoder(enc, options);\n                this._readableState.encoding = enc;\n            }\n\n            Readable.prototype.collect = iconv._collect;\n        }\n    }\n\n    // Remove iconv-lite Node primitive extensions.\n    iconv.undoExtendNodeEncodings = function undoExtendNodeEncodings() {\n        if (!iconv.supportsNodeEncodingsExtension)\n            return;\n        if (!original)\n            throw new Error(\"require('iconv-lite').undoExtendNodeEncodings(): Nothing to undo; extendNodeEncodings() is not called.\")\n\n        delete Buffer.isNativeEncoding;\n\n        var SlowBuffer = __webpack_require__(64).SlowBuffer;\n\n        SlowBuffer.prototype.toString = original.SlowBufferToString;\n        SlowBuffer.prototype.write = original.SlowBufferWrite;\n\n        Buffer.isEncoding = original.BufferIsEncoding;\n        Buffer.byteLength = original.BufferByteLength;\n        Buffer.prototype.toString = original.BufferToString;\n        Buffer.prototype.write = original.BufferWrite;\n\n        if (iconv.supportsStreams) {\n            var Readable = __webpack_require__(23).Readable;\n\n            Readable.prototype.setEncoding = original.ReadableSetEncoding;\n            delete Readable.prototype.collect;\n        }\n\n        original = undefined;\n    }\n}\n\n\n/***/ }),\n/* 726 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// Some environments don't have global Buffer (e.g. React Native).\n// Solution would be installing npm modules \"buffer\" and \"stream\" explicitly.\nvar Buffer = __webpack_require__(15).Buffer;\n\nvar bomHandling = __webpack_require__(724),\n    iconv = module.exports;\n\n// All codecs and aliases are kept here, keyed by encoding name/alias.\n// They are lazy loaded in `iconv.getCodec` from `encodings/index.js`.\niconv.encodings = null;\n\n// Characters emitted in case of error.\niconv.defaultCharUnicode = '�';\niconv.defaultCharSingleByte = '?';\n\n// Public API.\niconv.encode = function encode(str, encoding, options) {\n    str = \"\" + (str || \"\"); // Ensure string.\n\n    var encoder = iconv.getEncoder(encoding, options);\n\n    var res = encoder.write(str);\n    var trail = encoder.end();\n    \n    return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res;\n}\n\niconv.decode = function decode(buf, encoding, options) {\n    if (typeof buf === 'string') {\n        if (!iconv.skipDecodeWarning) {\n            console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding');\n            iconv.skipDecodeWarning = true;\n        }\n\n        buf = Buffer.from(\"\" + (buf || \"\"), \"binary\"); // Ensure buffer.\n    }\n\n    var decoder = iconv.getDecoder(encoding, options);\n\n    var res = decoder.write(buf);\n    var trail = decoder.end();\n\n    return trail ? (res + trail) : res;\n}\n\niconv.encodingExists = function encodingExists(enc) {\n    try {\n        iconv.getCodec(enc);\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\n\n// Legacy aliases to convert functions\niconv.toEncoding = iconv.encode;\niconv.fromEncoding = iconv.decode;\n\n// Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache.\niconv._codecDataCache = {};\niconv.getCodec = function getCodec(encoding) {\n    if (!iconv.encodings)\n        iconv.encodings = __webpack_require__(712); // Lazy load all encoding definitions.\n    \n    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.\n    var enc = iconv._canonicalizeEncoding(encoding);\n\n    // Traverse iconv.encodings to find actual codec.\n    var codecOptions = {};\n    while (true) {\n        var codec = iconv._codecDataCache[enc];\n        if (codec)\n            return codec;\n\n        var codecDef = iconv.encodings[enc];\n\n        switch (typeof codecDef) {\n            case \"string\": // Direct alias to other encoding.\n                enc = codecDef;\n                break;\n\n            case \"object\": // Alias with options. Can be layered.\n                for (var key in codecDef)\n                    codecOptions[key] = codecDef[key];\n\n                if (!codecOptions.encodingName)\n                    codecOptions.encodingName = enc;\n                \n                enc = codecDef.type;\n                break;\n\n            case \"function\": // Codec itself.\n                if (!codecOptions.encodingName)\n                    codecOptions.encodingName = enc;\n\n                // The codec function must load all tables and return object with .encoder and .decoder methods.\n                // It'll be called only once (for each different options object).\n                codec = new codecDef(codecOptions, iconv);\n\n                iconv._codecDataCache[codecOptions.encodingName] = codec; // Save it to be reused later.\n                return codec;\n\n            default:\n                throw new Error(\"Encoding not recognized: '\" + encoding + \"' (searched as: '\"+enc+\"')\");\n        }\n    }\n}\n\niconv._canonicalizeEncoding = function(encoding) {\n    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.\n    return (''+encoding).toLowerCase().replace(/:\\d{4}$|[^0-9a-z]/g, \"\");\n}\n\niconv.getEncoder = function getEncoder(encoding, options) {\n    var codec = iconv.getCodec(encoding),\n        encoder = new codec.encoder(options, codec);\n\n    if (codec.bomAware && options && options.addBOM)\n        encoder = new bomHandling.PrependBOM(encoder, options);\n\n    return encoder;\n}\n\niconv.getDecoder = function getDecoder(encoding, options) {\n    var codec = iconv.getCodec(encoding),\n        decoder = new codec.decoder(options, codec);\n\n    if (codec.bomAware && !(options && options.stripBOM === false))\n        decoder = new bomHandling.StripBOM(decoder, options);\n\n    return decoder;\n}\n\n\n// Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json.\nvar nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node;\nif (nodeVer) {\n\n    // Load streaming support in Node v0.10+\n    var nodeVerArr = nodeVer.split(\".\").map(Number);\n    if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) {\n        __webpack_require__(727)(iconv);\n    }\n\n    // Load Node primitive extensions.\n    __webpack_require__(725)(iconv);\n}\n\nif (false) {\n    console.error(\"iconv-lite warning: javascript files use encoding different from utf-8. See https://github.com/ashtuchkin/iconv-lite/wiki/Javascript-source-file-encodings for more info.\");\n}\n\n\n/***/ }),\n/* 727 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar Buffer = __webpack_require__(64).Buffer,\n    Transform = __webpack_require__(23).Transform;\n\n\n// == Exports ==================================================================\nmodule.exports = function(iconv) {\n    \n    // Additional Public API.\n    iconv.encodeStream = function encodeStream(encoding, options) {\n        return new IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options);\n    }\n\n    iconv.decodeStream = function decodeStream(encoding, options) {\n        return new IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options);\n    }\n\n    iconv.supportsStreams = true;\n\n\n    // Not published yet.\n    iconv.IconvLiteEncoderStream = IconvLiteEncoderStream;\n    iconv.IconvLiteDecoderStream = IconvLiteDecoderStream;\n    iconv._collect = IconvLiteDecoderStream.prototype.collect;\n};\n\n\n// == Encoder stream =======================================================\nfunction IconvLiteEncoderStream(conv, options) {\n    this.conv = conv;\n    options = options || {};\n    options.decodeStrings = false; // We accept only strings, so we don't need to decode them.\n    Transform.call(this, options);\n}\n\nIconvLiteEncoderStream.prototype = Object.create(Transform.prototype, {\n    constructor: { value: IconvLiteEncoderStream }\n});\n\nIconvLiteEncoderStream.prototype._transform = function(chunk, encoding, done) {\n    if (typeof chunk != 'string')\n        return done(new Error(\"Iconv encoding stream needs strings as its input.\"));\n    try {\n        var res = this.conv.write(chunk);\n        if (res && res.length) this.push(res);\n        done();\n    }\n    catch (e) {\n        done(e);\n    }\n}\n\nIconvLiteEncoderStream.prototype._flush = function(done) {\n    try {\n        var res = this.conv.end();\n        if (res && res.length) this.push(res);\n        done();\n    }\n    catch (e) {\n        done(e);\n    }\n}\n\nIconvLiteEncoderStream.prototype.collect = function(cb) {\n    var chunks = [];\n    this.on('error', cb);\n    this.on('data', function(chunk) { chunks.push(chunk); });\n    this.on('end', function() {\n        cb(null, Buffer.concat(chunks));\n    });\n    return this;\n}\n\n\n// == Decoder stream =======================================================\nfunction IconvLiteDecoderStream(conv, options) {\n    this.conv = conv;\n    options = options || {};\n    options.encoding = this.encoding = 'utf8'; // We output strings.\n    Transform.call(this, options);\n}\n\nIconvLiteDecoderStream.prototype = Object.create(Transform.prototype, {\n    constructor: { value: IconvLiteDecoderStream }\n});\n\nIconvLiteDecoderStream.prototype._transform = function(chunk, encoding, done) {\n    if (!Buffer.isBuffer(chunk))\n        return done(new Error(\"Iconv decoding stream needs buffers as its input.\"));\n    try {\n        var res = this.conv.write(chunk);\n        if (res && res.length) this.push(res, this.encoding);\n        done();\n    }\n    catch (e) {\n        done(e);\n    }\n}\n\nIconvLiteDecoderStream.prototype._flush = function(done) {\n    try {\n        var res = this.conv.end();\n        if (res && res.length) this.push(res, this.encoding);                \n        done();\n    }\n    catch (e) {\n        done(e);\n    }\n}\n\nIconvLiteDecoderStream.prototype.collect = function(cb) {\n    var res = '';\n    this.on('error', cb);\n    this.on('data', function(chunk) { res += chunk; });\n    this.on('end', function() {\n        cb(null, res);\n    });\n    return this;\n}\n\n\n\n/***/ }),\n/* 728 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst stripAnsi = __webpack_require__(330);\nconst isFullwidthCodePoint = __webpack_require__(736);\n\nmodule.exports = str => {\n\tif (typeof str !== 'string' || str.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstr = stripAnsi(str);\n\n\tlet width = 0;\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tconst code = str.codePointAt(i);\n\n\t\t// Ignore control characters\n\t\tif (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (code >= 0x300 && code <= 0x36F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Surrogates\n\t\tif (code > 0xFFFF) {\n\t\t\ti++;\n\t\t}\n\n\t\twidth += isFullwidthCodePoint(code) ? 2 : 1;\n\t}\n\n\treturn width;\n};\n\n\n/***/ }),\n/* 729 */\n/***/ (function(module, exports) {\n\n/*!\n * Determine if an object is a Buffer\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */\n\n// The _isBuffer check is for Safari 5-7 support, because it's missing\n// Object.prototype.constructor. Remove this eventually\nmodule.exports = function (obj) {\n  return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer)\n}\n\nfunction isBuffer (obj) {\n  return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n// For Node v0.10 support. Remove this eventually.\nfunction isSlowBuffer (obj) {\n  return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0))\n}\n\n\n/***/ }),\n/* 730 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst builtinModules = __webpack_require__(731);\n\nconst moduleSet = new Set(builtinModules);\n\nmodule.exports = moduleName => {\n\tif (typeof moduleName !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\treturn moduleSet.has(moduleName);\n};\n\n\n/***/ }),\n/* 731 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nconst blacklist = [\n\t'freelist',\n\t'sys'\n];\n\nmodule.exports = Object.keys(process.binding('natives'))\n\t.filter(x => !/^_|^internal|\\//.test(x) && blacklist.indexOf(x) === -1)\n\t.sort();\n\n\n/***/ }),\n/* 732 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = function (buf) {\n  if (!buf || buf.length < 2) return false\n  return buf[0] === 0x78 && (buf[1] === 1 || buf[1] === 0x9c || buf[1] === 0xda)\n}\n\n\n/***/ }),\n/* 733 */\n/***/ (function(module, exports) {\n\n/*!\n * is-dotfile <https://github.com/jonschlinkert/is-dotfile>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nmodule.exports = function(str) {\n  if (str.charCodeAt(0) === 46 /* . */ && str.indexOf('/', 1) === -1) {\n    return true;\n  }\n  var slash = str.lastIndexOf('/');\n  return slash !== -1 ? str.charCodeAt(slash + 1) === 46  /* . */ : false;\n};\n\n\n/***/ }),\n/* 734 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * is-equal-shallow <https://github.com/jonschlinkert/is-equal-shallow>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n\n\nvar isPrimitive = __webpack_require__(740);\n\nmodule.exports = function isEqual(a, b) {\n  if (!a && !b) { return true; }\n  if (!a && b || a && !b) { return false; }\n\n  var numKeysA = 0, numKeysB = 0, key;\n  for (key in b) {\n    numKeysB++;\n    if (!isPrimitive(b[key]) || !a.hasOwnProperty(key) || (a[key] !== b[key])) {\n      return false;\n    }\n  }\n  for (key in a) {\n    numKeysA++;\n  }\n  return numKeysA === numKeysB;\n};\n\n\n/***/ }),\n/* 735 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * is-extendable <https://github.com/jonschlinkert/is-extendable>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n\n\nmodule.exports = function isExtendable(val) {\n  return typeof val !== 'undefined' && val !== null\n    && (typeof val === 'object' || typeof val === 'function');\n};\n\n\n/***/ }),\n/* 736 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n/* eslint-disable yoda */\nmodule.exports = x => {\n\tif (Number.isNaN(x)) {\n\t\treturn false;\n\t}\n\n\t// code points are derived from:\n\t// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n\tif (\n\t\tx >= 0x1100 && (\n\t\t\tx <= 0x115f ||  // Hangul Jamo\n\t\t\tx === 0x2329 || // LEFT-POINTING ANGLE BRACKET\n\t\t\tx === 0x232a || // RIGHT-POINTING ANGLE BRACKET\n\t\t\t// CJK Radicals Supplement .. Enclosed CJK Letters and Months\n\t\t\t(0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||\n\t\t\t// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A\n\t\t\t(0x3250 <= x && x <= 0x4dbf) ||\n\t\t\t// CJK Unified Ideographs .. Yi Radicals\n\t\t\t(0x4e00 <= x && x <= 0xa4c6) ||\n\t\t\t// Hangul Jamo Extended-A\n\t\t\t(0xa960 <= x && x <= 0xa97c) ||\n\t\t\t// Hangul Syllables\n\t\t\t(0xac00 <= x && x <= 0xd7a3) ||\n\t\t\t// CJK Compatibility Ideographs\n\t\t\t(0xf900 <= x && x <= 0xfaff) ||\n\t\t\t// Vertical Forms\n\t\t\t(0xfe10 <= x && x <= 0xfe19) ||\n\t\t\t// CJK Compatibility Forms .. Small Form Variants\n\t\t\t(0xfe30 <= x && x <= 0xfe6b) ||\n\t\t\t// Halfwidth and Fullwidth Forms\n\t\t\t(0xff01 <= x && x <= 0xff60) ||\n\t\t\t(0xffe0 <= x && x <= 0xffe6) ||\n\t\t\t// Kana Supplement\n\t\t\t(0x1b000 <= x && x <= 0x1b001) ||\n\t\t\t// Enclosed Ideographic Supplement\n\t\t\t(0x1f200 <= x && x <= 0x1f251) ||\n\t\t\t// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane\n\t\t\t(0x20000 <= x && x <= 0x3fffd)\n\t\t)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\n\n/***/ }),\n/* 737 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n/**\n * Check if a Buffer/Uint8Array is a GZIP file\n *\n * @param {Buffer} buf\n * @api public\n */\n\nmodule.exports = function (buf) {\n    if (!buf || buf.length < 3) {\n        return false;\n    }\n\n    return buf[0] === 31 && buf[1] === 139 && buf[2] === 8;\n};\n\n\n/***/ }),\n/* 738 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar toString = Object.prototype.toString;\n\nmodule.exports = function (x) {\n\tvar prototype;\n\treturn toString.call(x) === '[object Object]' && (prototype = Object.getPrototypeOf(x), prototype === null || prototype === Object.getPrototypeOf({}));\n};\n\n\n/***/ }),\n/* 739 */\n/***/ (function(module, exports) {\n\n/*!\n * is-posix-bracket <https://github.com/jonschlinkert/is-posix-bracket>\n *\n * Copyright (c) 2015-2016, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\nmodule.exports = function isPosixBracket(str) {\n  return typeof str === 'string' && /\\[([:.=+])(?:[^\\[\\]]|)+\\1\\]/.test(str);\n};\n\n\n/***/ }),\n/* 740 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * is-primitive <https://github.com/jonschlinkert/is-primitive>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n\n\n// see http://jsperf.com/testing-value-is-primitive/7\nmodule.exports = function isPrimitive(value) {\n  return value == null || (typeof value !== 'function' && typeof value !== 'object');\n};\n\n\n/***/ }),\n/* 741 */\n/***/ (function(module, exports) {\n\nmodule.exports = isPromise;\n\nfunction isPromise(obj) {\n  return !!obj && (typeof obj === 'object' || typeof obj === 'function') && typeof obj.then === 'function';\n}\n\n\n/***/ }),\n/* 742 */\n/***/ (function(module, exports) {\n\nmodule.exports      = isTypedArray\nisTypedArray.strict = isStrictTypedArray\nisTypedArray.loose  = isLooseTypedArray\n\nvar toString = Object.prototype.toString\nvar names = {\n    '[object Int8Array]': true\n  , '[object Int16Array]': true\n  , '[object Int32Array]': true\n  , '[object Uint8Array]': true\n  , '[object Uint8ClampedArray]': true\n  , '[object Uint16Array]': true\n  , '[object Uint32Array]': true\n  , '[object Float32Array]': true\n  , '[object Float64Array]': true\n}\n\nfunction isTypedArray(arr) {\n  return (\n       isStrictTypedArray(arr)\n    || isLooseTypedArray(arr)\n  )\n}\n\nfunction isStrictTypedArray(arr) {\n  return (\n       arr instanceof Int8Array\n    || arr instanceof Int16Array\n    || arr instanceof Int32Array\n    || arr instanceof Uint8Array\n    || arr instanceof Uint8ClampedArray\n    || arr instanceof Uint16Array\n    || arr instanceof Uint32Array\n    || arr instanceof Float32Array\n    || arr instanceof Float64Array\n  )\n}\n\nfunction isLooseTypedArray(arr) {\n  return names[toString.call(arr)]\n}\n\n\n/***/ }),\n/* 743 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * is-windows <https://github.com/jonschlinkert/is-windows>\n *\n * Copyright © 2015-2018, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n(function(factory) {\n  if (exports && typeof exports === 'object' && typeof module !== 'undefined') {\n    module.exports = factory();\n  } else if (true) {\n    !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n  } else if (typeof window !== 'undefined') {\n    window.isWindows = factory();\n  } else if (typeof global !== 'undefined') {\n    global.isWindows = factory();\n  } else if (typeof self !== 'undefined') {\n    self.isWindows = factory();\n  } else {\n    this.isWindows = factory();\n  }\n})(function() {\n  'use strict';\n  return function isWindows() {\n    return process && (process.platform === 'win32' || /^(msys|cygwin)$/.test(process.env.OSTYPE));\n  };\n});\n\n\n/***/ }),\n/* 744 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\r\n * JSONSchema Validator - Validates JavaScript objects using JSON Schemas\r\n *\t(http://www.json.com/json-schema-proposal/)\r\n *\r\n * Copyright (c) 2007 Kris Zyp SitePen (www.sitepen.com)\r\n * Licensed under the MIT (MIT-LICENSE.txt) license.\r\nTo use the validator call the validate function with an instance object and an optional schema object.\r\nIf a schema is provided, it will be used to validate. If the instance object refers to a schema (self-validating),\r\nthat schema will be used to validate and the schema parameter is not necessary (if both exist,\r\nboth validations will occur).\r\nThe validate method will return an array of validation errors. If there are no errors, then an\r\nempty list will be returned. A validation error will have two properties:\r\n\"property\" which indicates which property had the error\r\n\"message\" which indicates what the error was\r\n */\r\n(function (root, factory) {\r\n    if (true) {\r\n        // AMD. Register as an anonymous module.\r\n        !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () {\r\n            return factory();\r\n        }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n    } else if (typeof module === 'object' && module.exports) {\r\n        // Node. Does not work with strict CommonJS, but\r\n        // only CommonJS-like environments that support module.exports,\r\n        // like Node.\r\n        module.exports = factory();\r\n    } else {\r\n        // Browser globals\r\n        root.jsonSchema = factory();\r\n    }\r\n}(this, function () {// setup primitive classes to be JSON Schema types\r\nvar exports = validate\r\nexports.Integer = {type:\"integer\"};\r\nvar primitiveConstructors = {\r\n\tString: String,\r\n\tBoolean: Boolean,\r\n\tNumber: Number,\r\n\tObject: Object,\r\n\tArray: Array,\r\n\tDate: Date\r\n}\r\nexports.validate = validate;\r\nfunction validate(/*Any*/instance,/*Object*/schema) {\r\n\t\t// Summary:\r\n\t\t//  \tTo use the validator call JSONSchema.validate with an instance object and an optional schema object.\r\n\t\t// \t\tIf a schema is provided, it will be used to validate. If the instance object refers to a schema (self-validating),\r\n\t\t// \t\tthat schema will be used to validate and the schema parameter is not necessary (if both exist,\r\n\t\t// \t\tboth validations will occur).\r\n\t\t// \t\tThe validate method will return an object with two properties:\r\n\t\t// \t\t\tvalid: A boolean indicating if the instance is valid by the schema\r\n\t\t// \t\t\terrors: An array of validation errors. If there are no errors, then an\r\n\t\t// \t\t\t\t\tempty list will be returned. A validation error will have two properties:\r\n\t\t// \t\t\t\t\t\tproperty: which indicates which property had the error\r\n\t\t// \t\t\t\t\t\tmessage: which indicates what the error was\r\n\t\t//\r\n\t\treturn validate(instance, schema, {changing: false});//, coerce: false, existingOnly: false});\r\n\t};\r\nexports.checkPropertyChange = function(/*Any*/value,/*Object*/schema, /*String*/property) {\r\n\t\t// Summary:\r\n\t\t// \t\tThe checkPropertyChange method will check to see if an value can legally be in property with the given schema\r\n\t\t// \t\tThis is slightly different than the validate method in that it will fail if the schema is readonly and it will\r\n\t\t// \t\tnot check for self-validation, it is assumed that the passed in value is already internally valid.\r\n\t\t// \t\tThe checkPropertyChange method will return the same object type as validate, see JSONSchema.validate for\r\n\t\t// \t\tinformation.\r\n\t\t//\r\n\t\treturn validate(value, schema, {changing: property || \"property\"});\r\n\t};\r\nvar validate = exports._validate = function(/*Any*/instance,/*Object*/schema,/*Object*/options) {\r\n\r\n\tif (!options) options = {};\r\n\tvar _changing = options.changing;\r\n\r\n\tfunction getType(schema){\r\n\t\treturn schema.type || (primitiveConstructors[schema.name] == schema && schema.name.toLowerCase());\r\n\t}\r\n\tvar errors = [];\r\n\t// validate a value against a property definition\r\n\tfunction checkProp(value, schema, path,i){\r\n\r\n\t\tvar l;\r\n\t\tpath += path ? typeof i == 'number' ? '[' + i + ']' : typeof i == 'undefined' ? '' : '.' + i : i;\r\n\t\tfunction addError(message){\r\n\t\t\terrors.push({property:path,message:message});\r\n\t\t}\r\n\r\n\t\tif((typeof schema != 'object' || schema instanceof Array) && (path || typeof schema != 'function') && !(schema && getType(schema))){\r\n\t\t\tif(typeof schema == 'function'){\r\n\t\t\t\tif(!(value instanceof schema)){\r\n\t\t\t\t\taddError(\"is not an instance of the class/constructor \" + schema.name);\r\n\t\t\t\t}\r\n\t\t\t}else if(schema){\r\n\t\t\t\taddError(\"Invalid schema/property definition \" + schema);\r\n\t\t\t}\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tif(_changing && schema.readonly){\r\n\t\t\taddError(\"is a readonly field, it can not be changed\");\r\n\t\t}\r\n\t\tif(schema['extends']){ // if it extends another schema, it must pass that schema as well\r\n\t\t\tcheckProp(value,schema['extends'],path,i);\r\n\t\t}\r\n\t\t// validate a value against a type definition\r\n\t\tfunction checkType(type,value){\r\n\t\t\tif(type){\r\n\t\t\t\tif(typeof type == 'string' && type != 'any' &&\r\n\t\t\t\t\t\t(type == 'null' ? value !== null : typeof value != type) &&\r\n\t\t\t\t\t\t!(value instanceof Array && type == 'array') &&\r\n\t\t\t\t\t\t!(value instanceof Date && type == 'date') &&\r\n\t\t\t\t\t\t!(type == 'integer' && value%1===0)){\r\n\t\t\t\t\treturn [{property:path,message:(typeof value) + \" value found, but a \" + type + \" is required\"}];\r\n\t\t\t\t}\r\n\t\t\t\tif(type instanceof Array){\r\n\t\t\t\t\tvar unionErrors=[];\r\n\t\t\t\t\tfor(var j = 0; j < type.length; j++){ // a union type\r\n\t\t\t\t\t\tif(!(unionErrors=checkType(type[j],value)).length){\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(unionErrors.length){\r\n\t\t\t\t\t\treturn unionErrors;\r\n\t\t\t\t\t}\r\n\t\t\t\t}else if(typeof type == 'object'){\r\n\t\t\t\t\tvar priorErrors = errors;\r\n\t\t\t\t\terrors = [];\r\n\t\t\t\t\tcheckProp(value,type,path);\r\n\t\t\t\t\tvar theseErrors = errors;\r\n\t\t\t\t\terrors = priorErrors;\r\n\t\t\t\t\treturn theseErrors;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\tif(value === undefined){\r\n\t\t\tif(schema.required){\r\n\t\t\t\taddError(\"is missing and it is required\");\r\n\t\t\t}\r\n\t\t}else{\r\n\t\t\terrors = errors.concat(checkType(getType(schema),value));\r\n\t\t\tif(schema.disallow && !checkType(schema.disallow,value).length){\r\n\t\t\t\taddError(\" disallowed value was matched\");\r\n\t\t\t}\r\n\t\t\tif(value !== null){\r\n\t\t\t\tif(value instanceof Array){\r\n\t\t\t\t\tif(schema.items){\r\n\t\t\t\t\t\tvar itemsIsArray = schema.items instanceof Array;\r\n\t\t\t\t\t\tvar propDef = schema.items;\r\n\t\t\t\t\t\tfor (i = 0, l = value.length; i < l; i += 1) {\r\n\t\t\t\t\t\t\tif (itemsIsArray)\r\n\t\t\t\t\t\t\t\tpropDef = schema.items[i];\r\n\t\t\t\t\t\t\tif (options.coerce)\r\n\t\t\t\t\t\t\t\tvalue[i] = options.coerce(value[i], propDef);\r\n\t\t\t\t\t\t\terrors.concat(checkProp(value[i],propDef,path,i));\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(schema.minItems && value.length < schema.minItems){\r\n\t\t\t\t\t\taddError(\"There must be a minimum of \" + schema.minItems + \" in the array\");\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(schema.maxItems && value.length > schema.maxItems){\r\n\t\t\t\t\t\taddError(\"There must be a maximum of \" + schema.maxItems + \" in the array\");\r\n\t\t\t\t\t}\r\n\t\t\t\t}else if(schema.properties || schema.additionalProperties){\r\n\t\t\t\t\terrors.concat(checkObj(value, schema.properties, path, schema.additionalProperties));\r\n\t\t\t\t}\r\n\t\t\t\tif(schema.pattern && typeof value == 'string' && !value.match(schema.pattern)){\r\n\t\t\t\t\taddError(\"does not match the regex pattern \" + schema.pattern);\r\n\t\t\t\t}\r\n\t\t\t\tif(schema.maxLength && typeof value == 'string' && value.length > schema.maxLength){\r\n\t\t\t\t\taddError(\"may only be \" + schema.maxLength + \" characters long\");\r\n\t\t\t\t}\r\n\t\t\t\tif(schema.minLength && typeof value == 'string' && value.length < schema.minLength){\r\n\t\t\t\t\taddError(\"must be at least \" + schema.minLength + \" characters long\");\r\n\t\t\t\t}\r\n\t\t\t\tif(typeof schema.minimum !== undefined && typeof value == typeof schema.minimum &&\r\n\t\t\t\t\t\tschema.minimum > value){\r\n\t\t\t\t\taddError(\"must have a minimum value of \" + schema.minimum);\r\n\t\t\t\t}\r\n\t\t\t\tif(typeof schema.maximum !== undefined && typeof value == typeof schema.maximum &&\r\n\t\t\t\t\t\tschema.maximum < value){\r\n\t\t\t\t\taddError(\"must have a maximum value of \" + schema.maximum);\r\n\t\t\t\t}\r\n\t\t\t\tif(schema['enum']){\r\n\t\t\t\t\tvar enumer = schema['enum'];\r\n\t\t\t\t\tl = enumer.length;\r\n\t\t\t\t\tvar found;\r\n\t\t\t\t\tfor(var j = 0; j < l; j++){\r\n\t\t\t\t\t\tif(enumer[j]===value){\r\n\t\t\t\t\t\t\tfound=1;\r\n\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(!found){\r\n\t\t\t\t\t\taddError(\"does not have a value in the enumeration \" + enumer.join(\", \"));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif(typeof schema.maxDecimal == 'number' &&\r\n\t\t\t\t\t(value.toString().match(new RegExp(\"\\\\.[0-9]{\" + (schema.maxDecimal + 1) + \",}\")))){\r\n\t\t\t\t\taddError(\"may only have \" + schema.maxDecimal + \" digits of decimal places\");\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn null;\r\n\t}\r\n\t// validate an object against a schema\r\n\tfunction checkObj(instance,objTypeDef,path,additionalProp){\r\n\r\n\t\tif(typeof objTypeDef =='object'){\r\n\t\t\tif(typeof instance != 'object' || instance instanceof Array){\r\n\t\t\t\terrors.push({property:path,message:\"an object is required\"});\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tfor(var i in objTypeDef){ \r\n\t\t\t\tif(objTypeDef.hasOwnProperty(i)){\r\n\t\t\t\t\tvar value = instance[i];\r\n\t\t\t\t\t// skip _not_ specified properties\r\n\t\t\t\t\tif (value === undefined && options.existingOnly) continue;\r\n\t\t\t\t\tvar propDef = objTypeDef[i];\r\n\t\t\t\t\t// set default\r\n\t\t\t\t\tif(value === undefined && propDef[\"default\"]){\r\n\t\t\t\t\t\tvalue = instance[i] = propDef[\"default\"];\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif(options.coerce && i in instance){\r\n\t\t\t\t\t\tvalue = instance[i] = options.coerce(value, propDef);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tcheckProp(value,propDef,path,i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor(i in instance){\r\n\t\t\tif(instance.hasOwnProperty(i) && !(i.charAt(0) == '_' && i.charAt(1) == '_') && objTypeDef && !objTypeDef[i] && additionalProp===false){\r\n\t\t\t\tif (options.filter) {\r\n\t\t\t\t\tdelete instance[i];\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t} else {\r\n\t\t\t\t\terrors.push({property:path,message:(typeof value) + \"The property \" + i +\r\n\t\t\t\t\t\t\" is not defined in the schema and the schema does not allow additional properties\"});\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tvar requires = objTypeDef && objTypeDef[i] && objTypeDef[i].requires;\r\n\t\t\tif(requires && !(requires in instance)){\r\n\t\t\t\terrors.push({property:path,message:\"the presence of the property \" + i + \" requires that \" + requires + \" also be present\"});\r\n\t\t\t}\r\n\t\t\tvalue = instance[i];\r\n\t\t\tif(additionalProp && (!(objTypeDef && typeof objTypeDef == 'object') || !(i in objTypeDef))){\r\n\t\t\t\tif(options.coerce){\r\n\t\t\t\t\tvalue = instance[i] = options.coerce(value, additionalProp);\r\n\t\t\t\t}\r\n\t\t\t\tcheckProp(value,additionalProp,path,i);\r\n\t\t\t}\r\n\t\t\tif(!_changing && value && value.$schema){\r\n\t\t\t\terrors = errors.concat(checkProp(value,value.$schema,path,i));\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn errors;\r\n\t}\r\n\tif(schema){\r\n\t\tcheckProp(instance,schema,'',_changing || '');\r\n\t}\r\n\tif(!_changing && instance && instance.$schema){\r\n\t\tcheckProp(instance,instance.$schema,'','');\r\n\t}\r\n\treturn {valid:!errors.length,errors:errors};\r\n};\r\nexports.mustBeValid = function(result){\r\n\t//\tsummary:\r\n\t//\t\tThis checks to ensure that the result is valid and will throw an appropriate error message if it is not\r\n\t// result: the result returned from checkPropertyChange or validate\r\n\tif(!result.valid){\r\n\t\tthrow new TypeError(result.errors.map(function(error){return \"for property \" + error.property + ': ' + error.message;}).join(\", \\n\"));\r\n\t}\r\n}\r\n\r\nreturn exports;\r\n}));\r\n\n\n/***/ }),\n/* 745 */\n/***/ (function(module, exports) {\n\nexports = module.exports = stringify\nexports.getSerialize = serializer\n\nfunction stringify(obj, replacer, spaces, cycleReplacer) {\n  return JSON.stringify(obj, serializer(replacer, cycleReplacer), spaces)\n}\n\nfunction serializer(replacer, cycleReplacer) {\n  var stack = [], keys = []\n\n  if (cycleReplacer == null) cycleReplacer = function(key, value) {\n    if (stack[0] === value) return \"[Circular ~]\"\n    return \"[Circular ~.\" + keys.slice(0, stack.indexOf(value)).join(\".\") + \"]\"\n  }\n\n  return function(key, value) {\n    if (stack.length > 0) {\n      var thisPos = stack.indexOf(this)\n      ~thisPos ? stack.splice(thisPos + 1) : stack.push(this)\n      ~thisPos ? keys.splice(thisPos, Infinity, key) : keys.push(key)\n      if (~stack.indexOf(value)) value = cycleReplacer.call(this, key, value)\n    }\n    else stack.push(value)\n\n    return replacer == null ? value : replacer.call(this, key, value)\n  }\n}\n\n\n/***/ }),\n/* 746 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * lib/jsprim.js: utilities for primitive JavaScript types\n */\n\nvar mod_assert = __webpack_require__(16);\nvar mod_util = __webpack_require__(3);\n\nvar mod_extsprintf = __webpack_require__(613);\nvar mod_verror = __webpack_require__(960);\nvar mod_jsonschema = __webpack_require__(744);\n\n/*\n * Public interface\n */\nexports.deepCopy = deepCopy;\nexports.deepEqual = deepEqual;\nexports.isEmpty = isEmpty;\nexports.hasKey = hasKey;\nexports.forEachKey = forEachKey;\nexports.pluck = pluck;\nexports.flattenObject = flattenObject;\nexports.flattenIter = flattenIter;\nexports.validateJsonObject = validateJsonObjectJS;\nexports.validateJsonObjectJS = validateJsonObjectJS;\nexports.randElt = randElt;\nexports.extraProperties = extraProperties;\nexports.mergeObjects = mergeObjects;\n\nexports.startsWith = startsWith;\nexports.endsWith = endsWith;\n\nexports.parseInteger = parseInteger;\n\nexports.iso8601 = iso8601;\nexports.rfc1123 = rfc1123;\nexports.parseDateTime = parseDateTime;\n\nexports.hrtimediff = hrtimeDiff;\nexports.hrtimeDiff = hrtimeDiff;\nexports.hrtimeAccum = hrtimeAccum;\nexports.hrtimeAdd = hrtimeAdd;\nexports.hrtimeNanosec = hrtimeNanosec;\nexports.hrtimeMicrosec = hrtimeMicrosec;\nexports.hrtimeMillisec = hrtimeMillisec;\n\n\n/*\n * Deep copy an acyclic *basic* Javascript object.  This only handles basic\n * scalars (strings, numbers, booleans) and arbitrarily deep arrays and objects\n * containing these.  This does *not* handle instances of other classes.\n */\nfunction deepCopy(obj)\n{\n\tvar ret, key;\n\tvar marker = '__deepCopy';\n\n\tif (obj && obj[marker])\n\t\tthrow (new Error('attempted deep copy of cyclic object'));\n\n\tif (obj && obj.constructor == Object) {\n\t\tret = {};\n\t\tobj[marker] = true;\n\n\t\tfor (key in obj) {\n\t\t\tif (key == marker)\n\t\t\t\tcontinue;\n\n\t\t\tret[key] = deepCopy(obj[key]);\n\t\t}\n\n\t\tdelete (obj[marker]);\n\t\treturn (ret);\n\t}\n\n\tif (obj && obj.constructor == Array) {\n\t\tret = [];\n\t\tobj[marker] = true;\n\n\t\tfor (key = 0; key < obj.length; key++)\n\t\t\tret.push(deepCopy(obj[key]));\n\n\t\tdelete (obj[marker]);\n\t\treturn (ret);\n\t}\n\n\t/*\n\t * It must be a primitive type -- just return it.\n\t */\n\treturn (obj);\n}\n\nfunction deepEqual(obj1, obj2)\n{\n\tif (typeof (obj1) != typeof (obj2))\n\t\treturn (false);\n\n\tif (obj1 === null || obj2 === null || typeof (obj1) != 'object')\n\t\treturn (obj1 === obj2);\n\n\tif (obj1.constructor != obj2.constructor)\n\t\treturn (false);\n\n\tvar k;\n\tfor (k in obj1) {\n\t\tif (!obj2.hasOwnProperty(k))\n\t\t\treturn (false);\n\n\t\tif (!deepEqual(obj1[k], obj2[k]))\n\t\t\treturn (false);\n\t}\n\n\tfor (k in obj2) {\n\t\tif (!obj1.hasOwnProperty(k))\n\t\t\treturn (false);\n\t}\n\n\treturn (true);\n}\n\nfunction isEmpty(obj)\n{\n\tvar key;\n\tfor (key in obj)\n\t\treturn (false);\n\treturn (true);\n}\n\nfunction hasKey(obj, key)\n{\n\tmod_assert.equal(typeof (key), 'string');\n\treturn (Object.prototype.hasOwnProperty.call(obj, key));\n}\n\nfunction forEachKey(obj, callback)\n{\n\tfor (var key in obj) {\n\t\tif (hasKey(obj, key)) {\n\t\t\tcallback(key, obj[key]);\n\t\t}\n\t}\n}\n\nfunction pluck(obj, key)\n{\n\tmod_assert.equal(typeof (key), 'string');\n\treturn (pluckv(obj, key));\n}\n\nfunction pluckv(obj, key)\n{\n\tif (obj === null || typeof (obj) !== 'object')\n\t\treturn (undefined);\n\n\tif (obj.hasOwnProperty(key))\n\t\treturn (obj[key]);\n\n\tvar i = key.indexOf('.');\n\tif (i == -1)\n\t\treturn (undefined);\n\n\tvar key1 = key.substr(0, i);\n\tif (!obj.hasOwnProperty(key1))\n\t\treturn (undefined);\n\n\treturn (pluckv(obj[key1], key.substr(i + 1)));\n}\n\n/*\n * Invoke callback(row) for each entry in the array that would be returned by\n * flattenObject(data, depth).  This is just like flattenObject(data,\n * depth).forEach(callback), except that the intermediate array is never\n * created.\n */\nfunction flattenIter(data, depth, callback)\n{\n\tdoFlattenIter(data, depth, [], callback);\n}\n\nfunction doFlattenIter(data, depth, accum, callback)\n{\n\tvar each;\n\tvar key;\n\n\tif (depth === 0) {\n\t\teach = accum.slice(0);\n\t\teach.push(data);\n\t\tcallback(each);\n\t\treturn;\n\t}\n\n\tmod_assert.ok(data !== null);\n\tmod_assert.equal(typeof (data), 'object');\n\tmod_assert.equal(typeof (depth), 'number');\n\tmod_assert.ok(depth >= 0);\n\n\tfor (key in data) {\n\t\teach = accum.slice(0);\n\t\teach.push(key);\n\t\tdoFlattenIter(data[key], depth - 1, each, callback);\n\t}\n}\n\nfunction flattenObject(data, depth)\n{\n\tif (depth === 0)\n\t\treturn ([ data ]);\n\n\tmod_assert.ok(data !== null);\n\tmod_assert.equal(typeof (data), 'object');\n\tmod_assert.equal(typeof (depth), 'number');\n\tmod_assert.ok(depth >= 0);\n\n\tvar rv = [];\n\tvar key;\n\n\tfor (key in data) {\n\t\tflattenObject(data[key], depth - 1).forEach(function (p) {\n\t\t\trv.push([ key ].concat(p));\n\t\t});\n\t}\n\n\treturn (rv);\n}\n\nfunction startsWith(str, prefix)\n{\n\treturn (str.substr(0, prefix.length) == prefix);\n}\n\nfunction endsWith(str, suffix)\n{\n\treturn (str.substr(\n\t    str.length - suffix.length, suffix.length) == suffix);\n}\n\nfunction iso8601(d)\n{\n\tif (typeof (d) == 'number')\n\t\td = new Date(d);\n\tmod_assert.ok(d.constructor === Date);\n\treturn (mod_extsprintf.sprintf('%4d-%02d-%02dT%02d:%02d:%02d.%03dZ',\n\t    d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(),\n\t    d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(),\n\t    d.getUTCMilliseconds()));\n}\n\nvar RFC1123_MONTHS = [\n    'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n    'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nvar RFC1123_DAYS = [\n    'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nfunction rfc1123(date) {\n\treturn (mod_extsprintf.sprintf('%s, %02d %s %04d %02d:%02d:%02d GMT',\n\t    RFC1123_DAYS[date.getUTCDay()], date.getUTCDate(),\n\t    RFC1123_MONTHS[date.getUTCMonth()], date.getUTCFullYear(),\n\t    date.getUTCHours(), date.getUTCMinutes(),\n\t    date.getUTCSeconds()));\n}\n\n/*\n * Parses a date expressed as a string, as either a number of milliseconds since\n * the epoch or any string format that Date accepts, giving preference to the\n * former where these two sets overlap (e.g., small numbers).\n */\nfunction parseDateTime(str)\n{\n\t/*\n\t * This is irritatingly implicit, but significantly more concise than\n\t * alternatives.  The \"+str\" will convert a string containing only a\n\t * number directly to a Number, or NaN for other strings.  Thus, if the\n\t * conversion succeeds, we use it (this is the milliseconds-since-epoch\n\t * case).  Otherwise, we pass the string directly to the Date\n\t * constructor to parse.\n\t */\n\tvar numeric = +str;\n\tif (!isNaN(numeric)) {\n\t\treturn (new Date(numeric));\n\t} else {\n\t\treturn (new Date(str));\n\t}\n}\n\n\n/*\n * Number.*_SAFE_INTEGER isn't present before node v0.12, so we hardcode\n * the ES6 definitions here, while allowing for them to someday be higher.\n */\nvar MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\nvar MIN_SAFE_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\n\n\n/*\n * Default options for parseInteger().\n */\nvar PI_DEFAULTS = {\n\tbase: 10,\n\tallowSign: true,\n\tallowPrefix: false,\n\tallowTrailing: false,\n\tallowImprecise: false,\n\ttrimWhitespace: false,\n\tleadingZeroIsOctal: false\n};\n\nvar CP_0 = 0x30;\nvar CP_9 = 0x39;\n\nvar CP_A = 0x41;\nvar CP_B = 0x42;\nvar CP_O = 0x4f;\nvar CP_T = 0x54;\nvar CP_X = 0x58;\nvar CP_Z = 0x5a;\n\nvar CP_a = 0x61;\nvar CP_b = 0x62;\nvar CP_o = 0x6f;\nvar CP_t = 0x74;\nvar CP_x = 0x78;\nvar CP_z = 0x7a;\n\nvar PI_CONV_DEC = 0x30;\nvar PI_CONV_UC = 0x37;\nvar PI_CONV_LC = 0x57;\n\n\n/*\n * A stricter version of parseInt() that provides options for changing what\n * is an acceptable string (for example, disallowing trailing characters).\n */\nfunction parseInteger(str, uopts)\n{\n\tmod_assert.string(str, 'str');\n\tmod_assert.optionalObject(uopts, 'options');\n\n\tvar baseOverride = false;\n\tvar options = PI_DEFAULTS;\n\n\tif (uopts) {\n\t\tbaseOverride = hasKey(uopts, 'base');\n\t\toptions = mergeObjects(options, uopts);\n\t\tmod_assert.number(options.base, 'options.base');\n\t\tmod_assert.ok(options.base >= 2, 'options.base >= 2');\n\t\tmod_assert.ok(options.base <= 36, 'options.base <= 36');\n\t\tmod_assert.bool(options.allowSign, 'options.allowSign');\n\t\tmod_assert.bool(options.allowPrefix, 'options.allowPrefix');\n\t\tmod_assert.bool(options.allowTrailing,\n\t\t    'options.allowTrailing');\n\t\tmod_assert.bool(options.allowImprecise,\n\t\t    'options.allowImprecise');\n\t\tmod_assert.bool(options.trimWhitespace,\n\t\t    'options.trimWhitespace');\n\t\tmod_assert.bool(options.leadingZeroIsOctal,\n\t\t    'options.leadingZeroIsOctal');\n\n\t\tif (options.leadingZeroIsOctal) {\n\t\t\tmod_assert.ok(!baseOverride,\n\t\t\t    '\"base\" and \"leadingZeroIsOctal\" are ' +\n\t\t\t    'mutually exclusive');\n\t\t}\n\t}\n\n\tvar c;\n\tvar pbase = -1;\n\tvar base = options.base;\n\tvar start;\n\tvar mult = 1;\n\tvar value = 0;\n\tvar idx = 0;\n\tvar len = str.length;\n\n\t/* Trim any whitespace on the left side. */\n\tif (options.trimWhitespace) {\n\t\twhile (idx < len && isSpace(str.charCodeAt(idx))) {\n\t\t\t++idx;\n\t\t}\n\t}\n\n\t/* Check the number for a leading sign. */\n\tif (options.allowSign) {\n\t\tif (str[idx] === '-') {\n\t\t\tidx += 1;\n\t\t\tmult = -1;\n\t\t} else if (str[idx] === '+') {\n\t\t\tidx += 1;\n\t\t}\n\t}\n\n\t/* Parse the base-indicating prefix if there is one. */\n\tif (str[idx] === '0') {\n\t\tif (options.allowPrefix) {\n\t\t\tpbase = prefixToBase(str.charCodeAt(idx + 1));\n\t\t\tif (pbase !== -1 && (!baseOverride || pbase === base)) {\n\t\t\t\tbase = pbase;\n\t\t\t\tidx += 2;\n\t\t\t}\n\t\t}\n\n\t\tif (pbase === -1 && options.leadingZeroIsOctal) {\n\t\t\tbase = 8;\n\t\t}\n\t}\n\n\t/* Parse the actual digits. */\n\tfor (start = idx; idx < len; ++idx) {\n\t\tc = translateDigit(str.charCodeAt(idx));\n\t\tif (c !== -1 && c < base) {\n\t\t\tvalue *= base;\n\t\t\tvalue += c;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* If we didn't parse any digits, we have an invalid number. */\n\tif (start === idx) {\n\t\treturn (new Error('invalid number: ' + JSON.stringify(str)));\n\t}\n\n\t/* Trim any whitespace on the right side. */\n\tif (options.trimWhitespace) {\n\t\twhile (idx < len && isSpace(str.charCodeAt(idx))) {\n\t\t\t++idx;\n\t\t}\n\t}\n\n\t/* Check for trailing characters. */\n\tif (idx < len && !options.allowTrailing) {\n\t\treturn (new Error('trailing characters after number: ' +\n\t\t    JSON.stringify(str.slice(idx))));\n\t}\n\n\t/* If our value is 0, we return now, to avoid returning -0. */\n\tif (value === 0) {\n\t\treturn (0);\n\t}\n\n\t/* Calculate our final value. */\n\tvar result = value * mult;\n\n\t/*\n\t * If the string represents a value that cannot be precisely represented\n\t * by JavaScript, then we want to check that:\n\t *\n\t * - We never increased the value past MAX_SAFE_INTEGER\n\t * - We don't make the result negative and below MIN_SAFE_INTEGER\n\t *\n\t * Because we only ever increment the value during parsing, there's no\n\t * chance of moving past MAX_SAFE_INTEGER and then dropping below it\n\t * again, losing precision in the process. This means that we only need\n\t * to do our checks here, at the end.\n\t */\n\tif (!options.allowImprecise &&\n\t    (value > MAX_SAFE_INTEGER || result < MIN_SAFE_INTEGER)) {\n\t\treturn (new Error('number is outside of the supported range: ' +\n\t\t    JSON.stringify(str.slice(start, idx))));\n\t}\n\n\treturn (result);\n}\n\n\n/*\n * Interpret a character code as a base-36 digit.\n */\nfunction translateDigit(d)\n{\n\tif (d >= CP_0 && d <= CP_9) {\n\t\t/* '0' to '9' -> 0 to 9 */\n\t\treturn (d - PI_CONV_DEC);\n\t} else if (d >= CP_A && d <= CP_Z) {\n\t\t/* 'A' - 'Z' -> 10 to 35 */\n\t\treturn (d - PI_CONV_UC);\n\t} else if (d >= CP_a && d <= CP_z) {\n\t\t/* 'a' - 'z' -> 10 to 35 */\n\t\treturn (d - PI_CONV_LC);\n\t} else {\n\t\t/* Invalid character code */\n\t\treturn (-1);\n\t}\n}\n\n\n/*\n * Test if a value matches the ECMAScript definition of trimmable whitespace.\n */\nfunction isSpace(c)\n{\n\treturn (c === 0x20) ||\n\t    (c >= 0x0009 && c <= 0x000d) ||\n\t    (c === 0x00a0) ||\n\t    (c === 0x1680) ||\n\t    (c === 0x180e) ||\n\t    (c >= 0x2000 && c <= 0x200a) ||\n\t    (c === 0x2028) ||\n\t    (c === 0x2029) ||\n\t    (c === 0x202f) ||\n\t    (c === 0x205f) ||\n\t    (c === 0x3000) ||\n\t    (c === 0xfeff);\n}\n\n\n/*\n * Determine which base a character indicates (e.g., 'x' indicates hex).\n */\nfunction prefixToBase(c)\n{\n\tif (c === CP_b || c === CP_B) {\n\t\t/* 0b/0B (binary) */\n\t\treturn (2);\n\t} else if (c === CP_o || c === CP_O) {\n\t\t/* 0o/0O (octal) */\n\t\treturn (8);\n\t} else if (c === CP_t || c === CP_T) {\n\t\t/* 0t/0T (decimal) */\n\t\treturn (10);\n\t} else if (c === CP_x || c === CP_X) {\n\t\t/* 0x/0X (hexadecimal) */\n\t\treturn (16);\n\t} else {\n\t\t/* Not a meaningful character */\n\t\treturn (-1);\n\t}\n}\n\n\nfunction validateJsonObjectJS(schema, input)\n{\n\tvar report = mod_jsonschema.validate(input, schema);\n\n\tif (report.errors.length === 0)\n\t\treturn (null);\n\n\t/* Currently, we only do anything useful with the first error. */\n\tvar error = report.errors[0];\n\n\t/* The failed property is given by a URI with an irrelevant prefix. */\n\tvar propname = error['property'];\n\tvar reason = error['message'].toLowerCase();\n\tvar i, j;\n\n\t/*\n\t * There's at least one case where the property error message is\n\t * confusing at best.  We work around this here.\n\t */\n\tif ((i = reason.indexOf('the property ')) != -1 &&\n\t    (j = reason.indexOf(' is not defined in the schema and the ' +\n\t    'schema does not allow additional properties')) != -1) {\n\t\ti += 'the property '.length;\n\t\tif (propname === '')\n\t\t\tpropname = reason.substr(i, j - i);\n\t\telse\n\t\t\tpropname = propname + '.' + reason.substr(i, j - i);\n\n\t\treason = 'unsupported property';\n\t}\n\n\tvar rv = new mod_verror.VError('property \"%s\": %s', propname, reason);\n\trv.jsv_details = error;\n\treturn (rv);\n}\n\nfunction randElt(arr)\n{\n\tmod_assert.ok(Array.isArray(arr) && arr.length > 0,\n\t    'randElt argument must be a non-empty array');\n\n\treturn (arr[Math.floor(Math.random() * arr.length)]);\n}\n\nfunction assertHrtime(a)\n{\n\tmod_assert.ok(a[0] >= 0 && a[1] >= 0,\n\t    'negative numbers not allowed in hrtimes');\n\tmod_assert.ok(a[1] < 1e9, 'nanoseconds column overflow');\n}\n\n/*\n * Compute the time elapsed between hrtime readings A and B, where A is later\n * than B.  hrtime readings come from Node's process.hrtime().  There is no\n * defined way to represent negative deltas, so it's illegal to diff B from A\n * where the time denoted by B is later than the time denoted by A.  If this\n * becomes valuable, we can define a representation and extend the\n * implementation to support it.\n */\nfunction hrtimeDiff(a, b)\n{\n\tassertHrtime(a);\n\tassertHrtime(b);\n\tmod_assert.ok(a[0] > b[0] || (a[0] == b[0] && a[1] >= b[1]),\n\t    'negative differences not allowed');\n\n\tvar rv = [ a[0] - b[0], 0 ];\n\n\tif (a[1] >= b[1]) {\n\t\trv[1] = a[1] - b[1];\n\t} else {\n\t\trv[0]--;\n\t\trv[1] = 1e9 - (b[1] - a[1]);\n\t}\n\n\treturn (rv);\n}\n\n/*\n * Convert a hrtime reading from the array format returned by Node's\n * process.hrtime() into a scalar number of nanoseconds.\n */\nfunction hrtimeNanosec(a)\n{\n\tassertHrtime(a);\n\n\treturn (Math.floor(a[0] * 1e9 + a[1]));\n}\n\n/*\n * Convert a hrtime reading from the array format returned by Node's\n * process.hrtime() into a scalar number of microseconds.\n */\nfunction hrtimeMicrosec(a)\n{\n\tassertHrtime(a);\n\n\treturn (Math.floor(a[0] * 1e6 + a[1] / 1e3));\n}\n\n/*\n * Convert a hrtime reading from the array format returned by Node's\n * process.hrtime() into a scalar number of milliseconds.\n */\nfunction hrtimeMillisec(a)\n{\n\tassertHrtime(a);\n\n\treturn (Math.floor(a[0] * 1e3 + a[1] / 1e6));\n}\n\n/*\n * Add two hrtime readings A and B, overwriting A with the result of the\n * addition.  This function is useful for accumulating several hrtime intervals\n * into a counter.  Returns A.\n */\nfunction hrtimeAccum(a, b)\n{\n\tassertHrtime(a);\n\tassertHrtime(b);\n\n\t/*\n\t * Accumulate the nanosecond component.\n\t */\n\ta[1] += b[1];\n\tif (a[1] >= 1e9) {\n\t\t/*\n\t\t * The nanosecond component overflowed, so carry to the seconds\n\t\t * field.\n\t\t */\n\t\ta[0]++;\n\t\ta[1] -= 1e9;\n\t}\n\n\t/*\n\t * Accumulate the seconds component.\n\t */\n\ta[0] += b[0];\n\n\treturn (a);\n}\n\n/*\n * Add two hrtime readings A and B, returning the result as a new hrtime array.\n * Does not modify either input argument.\n */\nfunction hrtimeAdd(a, b)\n{\n\tassertHrtime(a);\n\n\tvar rv = [ a[0], a[1] ];\n\n\treturn (hrtimeAccum(rv, b));\n}\n\n\n/*\n * Check an object for unexpected properties.  Accepts the object to check, and\n * an array of allowed property names (strings).  Returns an array of key names\n * that were found on the object, but did not appear in the list of allowed\n * properties.  If no properties were found, the returned array will be of\n * zero length.\n */\nfunction extraProperties(obj, allowed)\n{\n\tmod_assert.ok(typeof (obj) === 'object' && obj !== null,\n\t    'obj argument must be a non-null object');\n\tmod_assert.ok(Array.isArray(allowed),\n\t    'allowed argument must be an array of strings');\n\tfor (var i = 0; i < allowed.length; i++) {\n\t\tmod_assert.ok(typeof (allowed[i]) === 'string',\n\t\t    'allowed argument must be an array of strings');\n\t}\n\n\treturn (Object.keys(obj).filter(function (key) {\n\t\treturn (allowed.indexOf(key) === -1);\n\t}));\n}\n\n/*\n * Given three sets of properties \"provided\" (may be undefined), \"overrides\"\n * (required), and \"defaults\" (may be undefined), construct an object containing\n * the union of these sets with \"overrides\" overriding \"provided\", and\n * \"provided\" overriding \"defaults\".  None of the input objects are modified.\n */\nfunction mergeObjects(provided, overrides, defaults)\n{\n\tvar rv, k;\n\n\trv = {};\n\tif (defaults) {\n\t\tfor (k in defaults)\n\t\t\trv[k] = defaults[k];\n\t}\n\n\tif (provided) {\n\t\tfor (k in provided)\n\t\t\trv[k] = provided[k];\n\t}\n\n\tif (overrides) {\n\t\tfor (k in overrides)\n\t\t\trv[k] = overrides[k];\n\t}\n\n\treturn (rv);\n}\n\n\n/***/ }),\n/* 747 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/* eslint-disable no-nested-ternary */\n\nvar arr = [];\nvar charCodeCache = [];\n\nmodule.exports = function (a, b) {\n\tif (a === b) {\n\t\treturn 0;\n\t}\n\n\tvar swap = a;\n\n\t// Swapping the strings if `a` is longer than `b` so we know which one is the\n\t// shortest & which one is the longest\n\tif (a.length > b.length) {\n\t\ta = b;\n\t\tb = swap;\n\t}\n\n\tvar aLen = a.length;\n\tvar bLen = b.length;\n\n\tif (aLen === 0) {\n\t\treturn bLen;\n\t}\n\n\tif (bLen === 0) {\n\t\treturn aLen;\n\t}\n\n\t// Performing suffix trimming:\n\t// We can linearly drop suffix common to both strings since they\n\t// don't increase distance at all\n\t// Note: `~-` is the bitwise way to perform a `- 1` operation\n\twhile (aLen > 0 && (a.charCodeAt(~-aLen) === b.charCodeAt(~-bLen))) {\n\t\taLen--;\n\t\tbLen--;\n\t}\n\n\tif (aLen === 0) {\n\t\treturn bLen;\n\t}\n\n\t// Performing prefix trimming\n\t// We can linearly drop prefix common to both strings since they\n\t// don't increase distance at all\n\tvar start = 0;\n\n\twhile (start < aLen && (a.charCodeAt(start) === b.charCodeAt(start))) {\n\t\tstart++;\n\t}\n\n\taLen -= start;\n\tbLen -= start;\n\n\tif (aLen === 0) {\n\t\treturn bLen;\n\t}\n\n\tvar bCharCode;\n\tvar ret;\n\tvar tmp;\n\tvar tmp2;\n\tvar i = 0;\n\tvar j = 0;\n\n\twhile (i < aLen) {\n\t\tcharCodeCache[start + i] = a.charCodeAt(start + i);\n\t\tarr[i] = ++i;\n\t}\n\n\twhile (j < bLen) {\n\t\tbCharCode = b.charCodeAt(start + j);\n\t\ttmp = j++;\n\t\tret = j;\n\n\t\tfor (i = 0; i < aLen; i++) {\n\t\t\ttmp2 = bCharCode === charCodeCache[start + i] ? tmp : tmp + 1;\n\t\t\ttmp = arr[i];\n\t\t\tret = arr[i] = tmp > ret ? tmp2 > ret ? ret + 1 : tmp2 : tmp2 > tmp ? tmp + 1 : tmp2;\n\t\t}\n\t}\n\n\treturn ret;\n};\n\n\n/***/ }),\n/* 748 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module) {/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/** Used to determine if values are of the language type `Object`. */\nvar objectTypes = {\n  'function': true,\n  'object': true\n};\n\n/** Detect free variable `exports`. */\nvar freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType)\n  ? exports\n  : undefined;\n\n/** Detect free variable `module`. */\nvar freeModule = (objectTypes[typeof module] && module && !module.nodeType)\n  ? module\n  : undefined;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = (freeModule && freeModule.exports === freeExports)\n  ? freeExports\n  : undefined;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = checkGlobal(freeExports && freeModule && typeof global == 'object' && global);\n\n/** Detect free variable `self`. */\nvar freeSelf = checkGlobal(objectTypes[typeof self] && self);\n\n/** Detect free variable `window`. */\nvar freeWindow = checkGlobal(objectTypes[typeof window] && window);\n\n/** Detect `this` as the global object. */\nvar thisGlobal = checkGlobal(objectTypes[typeof this] && this);\n\n/**\n * Used as a reference to the global object.\n *\n * The `this` value is used if it's the global object to avoid Greasemonkey's\n * restricted `window` object, otherwise the `window` object is used.\n */\nvar root = freeGlobal ||\n  ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) ||\n    freeSelf || thisGlobal || Function('return this')();\n\n/**\n * Adds the key-value `pair` to `map`.\n *\n * @private\n * @param {Object} map The map to modify.\n * @param {Array} pair The key-value pair to add.\n * @returns {Object} Returns `map`.\n */\nfunction addMapEntry(map, pair) {\n  // Don't return `Map#set` because it doesn't return the map instance in IE 11.\n  map.set(pair[0], pair[1]);\n  return map;\n}\n\n/**\n * Adds `value` to `set`.\n *\n * @private\n * @param {Object} set The set to modify.\n * @param {*} value The value to add.\n * @returns {Object} Returns `set`.\n */\nfunction addSetEntry(set, value) {\n  set.add(value);\n  return set;\n}\n\n/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n  var index = -1,\n      length = array.length;\n\n  while (++index < length) {\n    if (iteratee(array[index], index, array) === false) {\n      break;\n    }\n  }\n  return array;\n}\n\n/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\n/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n *  the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n  var index = -1,\n      length = array.length;\n\n  if (initAccum && length) {\n    accumulator = array[++index];\n  }\n  while (++index < length) {\n    accumulator = iteratee(accumulator, array[index], index, array);\n  }\n  return accumulator;\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\n/**\n * Checks if `value` is a global object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {null|Object} Returns `value` if it's a global object, else `null`.\n */\nfunction checkGlobal(value) {\n  return (value && value.Object === Object) ? value : null;\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n  // Many host objects are `Object` objects that can coerce to strings\n  // despite having improperly defined `toString` methods.\n  var result = false;\n  if (value != null && typeof value.toString != 'function') {\n    try {\n      result = !!(value + '');\n    } catch (e) {}\n  }\n  return result;\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = Function.prototype.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n    Symbol = root.Symbol,\n    Uint8Array = root.Uint8Array,\n    getOwnPropertySymbols = Object.getOwnPropertySymbols,\n    objectCreate = Object.create,\n    propertyIsEnumerable = objectProto.propertyIsEnumerable,\n    splice = arrayProto.splice;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetPrototype = Object.getPrototypeOf,\n    nativeKeys = Object.keys;\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n    Map = getNative(root, 'Map'),\n    Promise = getNative(root, 'Promise'),\n    Set = getNative(root, 'Set'),\n    WeakMap = getNative(root, 'WeakMap'),\n    nativeCreate = getNative(Object, 'create');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries ? entries.length : 0;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n}\n\n/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  return this.has(key) && delete this.__data__[key];\n}\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key);\n}\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries ? entries.length : 0;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n}\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  return true;\n}\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries ? entries.length : 0;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  return getMapData(this, key)['delete'](key);\n}\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  getMapData(this, key).set(key, value);\n  return this;\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  this.__data__ = new ListCache(entries);\n}\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n}\n\n/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  return this.__data__['delete'](key);\n}\n\n/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\n/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var cache = this.__data__;\n  if (cache instanceof ListCache && cache.__data__.length == LARGE_ARRAY_SIZE) {\n    cache = this.__data__ = new MapCache(cache.__data__);\n  }\n  cache.set(key, value);\n  return this;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n  var objValue = object[key];\n  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n      (value === undefined && !(key in object))) {\n    object[key] = value;\n  }\n}\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to search.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n  return object && copyObject(source, keys(source), object);\n}\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @param {boolean} [isFull] Specify a clone including symbols.\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, isDeep, isFull, customizer, key, object, stack) {\n  var result;\n  if (customizer) {\n    result = object ? customizer(value, key, object, stack) : customizer(value);\n  }\n  if (result !== undefined) {\n    return result;\n  }\n  if (!isObject(value)) {\n    return value;\n  }\n  var isArr = isArray(value);\n  if (isArr) {\n    result = initCloneArray(value);\n    if (!isDeep) {\n      return copyArray(value, result);\n    }\n  } else {\n    var tag = getTag(value),\n        isFunc = tag == funcTag || tag == genTag;\n\n    if (isBuffer(value)) {\n      return cloneBuffer(value, isDeep);\n    }\n    if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n      if (isHostObject(value)) {\n        return object ? value : {};\n      }\n      result = initCloneObject(isFunc ? {} : value);\n      if (!isDeep) {\n        return copySymbols(value, baseAssign(result, value));\n      }\n    } else {\n      if (!cloneableTags[tag]) {\n        return object ? value : {};\n      }\n      result = initCloneByTag(value, tag, baseClone, isDeep);\n    }\n  }\n  // Check for circular references and return its corresponding clone.\n  stack || (stack = new Stack);\n  var stacked = stack.get(value);\n  if (stacked) {\n    return stacked;\n  }\n  stack.set(value, result);\n\n  if (!isArr) {\n    var props = isFull ? getAllKeys(value) : keys(value);\n  }\n  // Recursively populate clone (susceptible to call stack limits).\n  arrayEach(props || value, function(subValue, key) {\n    if (props) {\n      key = subValue;\n      subValue = value[key];\n    }\n    assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));\n  });\n  return result;\n}\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} prototype The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nfunction baseCreate(proto) {\n  return isObject(proto) ? objectCreate(proto) : {};\n}\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n  // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,\n  // that are composed entirely of index properties, return `false` for\n  // `hasOwnProperty` checks of them.\n  return hasOwnProperty.call(object, key) ||\n    (typeof object == 'object' && key in object && getPrototype(object) === null);\n}\n\n/**\n * The base implementation of `_.keys` which doesn't skip the constructor\n * property of prototypes or treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  return nativeKeys(Object(object));\n}\n\n/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : object[key];\n  };\n}\n\n/**\n * Creates a clone of  `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n  if (isDeep) {\n    return buffer.slice();\n  }\n  var result = new buffer.constructor(buffer.length);\n  buffer.copy(result);\n  return result;\n}\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n  var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n  new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n  return result;\n}\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n  return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\n/**\n * Creates a clone of `map`.\n *\n * @private\n * @param {Object} map The map to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned map.\n */\nfunction cloneMap(map, isDeep, cloneFunc) {\n  var array = isDeep ? cloneFunc(mapToArray(map), true) : mapToArray(map);\n  return arrayReduce(array, addMapEntry, new map.constructor);\n}\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n  var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n  result.lastIndex = regexp.lastIndex;\n  return result;\n}\n\n/**\n * Creates a clone of `set`.\n *\n * @private\n * @param {Object} set The set to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned set.\n */\nfunction cloneSet(set, isDeep, cloneFunc) {\n  var array = isDeep ? cloneFunc(setToArray(set), true) : setToArray(set);\n  return arrayReduce(array, addSetEntry, new set.constructor);\n}\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n  return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n  var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n  return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n  object || (object = {});\n\n  var index = -1,\n      length = props.length;\n\n  while (++index < length) {\n    var key = props[index];\n\n    var newValue = customizer\n      ? customizer(object[key], source[key], key, object, source)\n      : source[key];\n\n    assignValue(object, key, newValue);\n  }\n  return object;\n}\n\n/**\n * Copies own symbol properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n  return copyObject(source, getSymbols(source), object);\n}\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\n/**\n * Gets the \"length\" property value of `object`.\n *\n * **Note:** This function is used to avoid a\n * [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792) that affects\n * Safari on at least iOS 8.1-8.3 ARM64.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {*} Returns the \"length\" value.\n */\nvar getLength = baseProperty('length');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = object[key];\n  return isNative(value) ? value : undefined;\n}\n\n/**\n * Gets the `[[Prototype]]` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {null|Object} Returns the `[[Prototype]]`.\n */\nfunction getPrototype(value) {\n  return nativeGetPrototype(Object(value));\n}\n\n/**\n * Creates an array of the own enumerable symbol properties of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nfunction getSymbols(object) {\n  // Coerce `object` to an object to avoid non-object errors in V8.\n  // See https://bugs.chromium.org/p/v8/issues/detail?id=3443 for more details.\n  return getOwnPropertySymbols(Object(object));\n}\n\n// Fallback for IE < 11.\nif (!getOwnPropertySymbols) {\n  getSymbols = function() {\n    return [];\n  };\n}\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction getTag(value) {\n  return objectToString.call(value);\n}\n\n// Fallback for data views, maps, sets, and weak maps in IE 11,\n// for data views in Edge, and promises in Node.js.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = objectToString.call(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : undefined;\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n  var length = array.length,\n      result = array.constructor(length);\n\n  // Add properties assigned by `RegExp#exec`.\n  if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n    result.index = array.index;\n    result.input = array.input;\n  }\n  return result;\n}\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n  return (typeof object.constructor == 'function' && !isPrototype(object))\n    ? baseCreate(getPrototype(object))\n    : {};\n}\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {Function} cloneFunc The function to clone values.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, cloneFunc, isDeep) {\n  var Ctor = object.constructor;\n  switch (tag) {\n    case arrayBufferTag:\n      return cloneArrayBuffer(object);\n\n    case boolTag:\n    case dateTag:\n      return new Ctor(+object);\n\n    case dataViewTag:\n      return cloneDataView(object, isDeep);\n\n    case float32Tag: case float64Tag:\n    case int8Tag: case int16Tag: case int32Tag:\n    case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n      return cloneTypedArray(object, isDeep);\n\n    case mapTag:\n      return cloneMap(object, isDeep, cloneFunc);\n\n    case numberTag:\n    case stringTag:\n      return new Ctor(object);\n\n    case regexpTag:\n      return cloneRegExp(object);\n\n    case setTag:\n      return cloneSet(object, isDeep, cloneFunc);\n\n    case symbolTag:\n      return cloneSymbol(object);\n  }\n}\n\n/**\n * Creates an array of index keys for `object` values of arrays,\n * `arguments` objects, and strings, otherwise `null` is returned.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array|null} Returns index keys, else `null`.\n */\nfunction indexKeys(object) {\n  var length = object ? object.length : undefined;\n  if (isLength(length) &&\n      (isArray(object) || isString(object) || isArguments(object))) {\n    return baseTimes(length, String);\n  }\n  return null;\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  length = length == null ? MAX_SAFE_INTEGER : length;\n  return !!length &&\n    (typeof value == 'number' || reIsUint.test(value)) &&\n    (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\n/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'user': 'fred' };\n * var other = { 'user': 'fred' };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n  // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.\n  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @type {Function}\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified,\n *  else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(getLength(value)) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = !Buffer ? constant(false) : function(value) {\n  return value instanceof Buffer;\n};\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified,\n *  else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 8 which returns 'object' for typed array and weak map constructors,\n  // and PhantomJS 1.9 which returns 'function' for `NodeList` instances.\n  var tag = isObject(value) ? objectToString.call(value) : '';\n  return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This function is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length,\n *  else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is a native function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n * @example\n *\n * _.isNative(Array.prototype.push);\n * // => true\n *\n * _.isNative(_);\n * // => false\n */\nfunction isNative(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified,\n *  else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n  return typeof value == 'string' ||\n    (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  var isProto = isPrototype(object);\n  if (!(isProto || isArrayLike(object))) {\n    return baseKeys(object);\n  }\n  var indexes = indexKeys(object),\n      skipIndexes = !!indexes,\n      result = indexes || [],\n      length = result.length;\n\n  for (var key in object) {\n    if (baseHas(object, key) &&\n        !(skipIndexes && (key == 'length' || isIndex(key, length))) &&\n        !(isProto && key == 'constructor')) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\n/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var object = { 'user': 'fred' };\n * var getter = _.constant(object);\n *\n * getter() === object;\n * // => true\n */\nfunction constant(value) {\n  return function() {\n    return value;\n  };\n}\n\nmodule.exports = baseClone;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(121)(module)))\n\n/***/ }),\n/* 749 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n * lodash 4.3.2 (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license <https://lodash.com/license>\n */\nvar baseClone = __webpack_require__(748);\n\n/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\nfunction clone(value) {\n  return baseClone(value, false, true);\n}\n\nmodule.exports = clone;\n\n\n/***/ }),\n/* 750 */\n/***/ (function(module, exports) {\n\n/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n    rsComboMarksRange = '\\\\u0300-\\\\u036f\\\\ufe20-\\\\ufe23',\n    rsComboSymbolsRange = '\\\\u20d0-\\\\u20f0',\n    rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n    rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',\n    rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n    rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n    rsNonAstral = '[^' + rsAstralRange + ']',\n    rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n    rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n    rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n    rsOptVar = '[' + rsVarRange + ']?',\n    rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n    rsSeq = rsOptVar + reOptMod + rsOptJoin,\n    rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array ? array.length : 0,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\n/**\n * Converts an ASCII `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction asciiToArray(string) {\n  return string.split('');\n}\n\n/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\n/**\n * The base implementation of `_.values` and `_.valuesIn` which creates an\n * array of `object` property values corresponding to the property names\n * of `props`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} props The property names to get values for.\n * @returns {Object} Returns the array of property values.\n */\nfunction baseValues(object, props) {\n  return arrayMap(props, function(key) {\n    return object[key];\n  });\n}\n\n/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n  return reHasUnicode.test(string);\n}\n\n/**\n * Checks if `value` is a host object in IE < 9.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a host object, else `false`.\n */\nfunction isHostObject(value) {\n  // Many host objects are `Object` objects that can coerce to strings\n  // despite having improperly defined `toString` methods.\n  var result = false;\n  if (value != null && typeof value.toString != 'function') {\n    try {\n      result = !!(value + '');\n    } catch (e) {}\n  }\n  return result;\n}\n\n/**\n * Converts `iterator` to an array.\n *\n * @private\n * @param {Object} iterator The iterator to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction iteratorToArray(iterator) {\n  var data,\n      result = [];\n\n  while (!(data = iterator.next()).done) {\n    result.push(data.value);\n  }\n  return result;\n}\n\n/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\n/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\n/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\n/**\n * Converts `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction stringToArray(string) {\n  return hasUnicode(string)\n    ? unicodeToArray(string)\n    : asciiToArray(string);\n}\n\n/**\n * Converts a Unicode `string` to an array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the converted array.\n */\nfunction unicodeToArray(string) {\n  return string.match(reUnicode) || [];\n}\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/** Built-in value references. */\nvar Symbol = root.Symbol,\n    iteratorSymbol = Symbol ? Symbol.iterator : undefined,\n    propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView'),\n    Map = getNative(root, 'Map'),\n    Promise = getNative(root, 'Promise'),\n    Set = getNative(root, 'Set'),\n    WeakMap = getNative(root, 'WeakMap');\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n  // Safari 9 makes `arguments.length` enumerable in strict mode.\n  var result = (isArray(value) || isArguments(value))\n    ? baseTimes(value.length, String)\n    : [];\n\n  var length = result.length,\n      skipIndexes = !!length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (key == 'length' || isIndex(key, length)))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\n/**\n * The base implementation of `getTag`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  return objectToString.call(value);\n}\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\n/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n  var index = -1,\n      length = source.length;\n\n  array || (array = Array(length));\n  while (++index < length) {\n    array[index] = source[index];\n  }\n  return array;\n}\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11,\n// for data views in Edge < 14, and promises in Node.js.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = objectToString.call(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : undefined;\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  length = length == null ? MAX_SAFE_INTEGER : length;\n  return !!length &&\n    (typeof value == 'number' || reIsUint.test(value)) &&\n    (value > -1 && value % 1 == 0 && value < length);\n}\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to process.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nfunction isArguments(value) {\n  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.\n  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&\n    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);\n}\n\n/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n *  else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n  return isObjectLike(value) && isArrayLike(value);\n}\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 8-9 which returns 'object' for typed array and other constructors.\n  var tag = isObject(value) ? objectToString.call(value) : '';\n  return tag == funcTag || tag == genTag;\n}\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n  return typeof value == 'string' ||\n    (!isArray(value) && isObjectLike(value) && objectToString.call(value) == stringTag);\n}\n\n/**\n * Converts `value` to an array.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Array} Returns the converted array.\n * @example\n *\n * _.toArray({ 'a': 1, 'b': 2 });\n * // => [1, 2]\n *\n * _.toArray('abc');\n * // => ['a', 'b', 'c']\n *\n * _.toArray(1);\n * // => []\n *\n * _.toArray(null);\n * // => []\n */\nfunction toArray(value) {\n  if (!value) {\n    return [];\n  }\n  if (isArrayLike(value)) {\n    return isString(value) ? stringToArray(value) : copyArray(value);\n  }\n  if (iteratorSymbol && value[iteratorSymbol]) {\n    return iteratorToArray(value[iteratorSymbol]());\n  }\n  var tag = getTag(value),\n      func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n  return func(value);\n}\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\n/**\n * Creates an array of the own enumerable string keyed property values of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property values.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.values(new Foo);\n * // => [1, 2] (iteration order is not guaranteed)\n *\n * _.values('hi');\n * // => ['h', 'i']\n */\nfunction values(object) {\n  return object ? baseValues(object, keys(object)) : [];\n}\n\nmodule.exports = toArray;\n\n\n/***/ }),\n/* 751 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar crypto = __webpack_require__(11)\nvar max = Math.pow(2, 32)\n\nmodule.exports = random\nmodule.exports.cryptographic = true\n\nfunction random () {\n  var buf = crypto\n    .randomBytes(4)\n    .toString('hex')\n\n  return parseInt(buf, 16) / max\n}\n\n\n/***/ }),\n/* 752 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar chars = {}, unesc, temp;\n\nfunction reverse(object, prepender) {\n  return Object.keys(object).reduce(function(reversed, key) {\n    var newKey = prepender ? prepender + key : key; // Optionally prepend a string to key.\n    reversed[object[key]] = newKey; // Swap key and value.\n    return reversed; // Return the result.\n  }, {});\n}\n\n/**\n * Regex for common characters\n */\n\nchars.escapeRegex = {\n  '?': /\\?/g,\n  '@': /\\@/g,\n  '!': /\\!/g,\n  '+': /\\+/g,\n  '*': /\\*/g,\n  '(': /\\(/g,\n  ')': /\\)/g,\n  '[': /\\[/g,\n  ']': /\\]/g\n};\n\n/**\n * Escape characters\n */\n\nchars.ESC = {\n  '?': '__UNESC_QMRK__',\n  '@': '__UNESC_AMPE__',\n  '!': '__UNESC_EXCL__',\n  '+': '__UNESC_PLUS__',\n  '*': '__UNESC_STAR__',\n  ',': '__UNESC_COMMA__',\n  '(': '__UNESC_LTPAREN__',\n  ')': '__UNESC_RTPAREN__',\n  '[': '__UNESC_LTBRACK__',\n  ']': '__UNESC_RTBRACK__'\n};\n\n/**\n * Unescape characters\n */\n\nchars.UNESC = unesc || (unesc = reverse(chars.ESC, '\\\\'));\n\nchars.ESC_TEMP = {\n  '?': '__TEMP_QMRK__',\n  '@': '__TEMP_AMPE__',\n  '!': '__TEMP_EXCL__',\n  '*': '__TEMP_STAR__',\n  '+': '__TEMP_PLUS__',\n  ',': '__TEMP_COMMA__',\n  '(': '__TEMP_LTPAREN__',\n  ')': '__TEMP_RTPAREN__',\n  '[': '__TEMP_LTBRACK__',\n  ']': '__TEMP_RTBRACK__'\n};\n\nchars.TEMP = temp || (temp = reverse(chars.ESC_TEMP));\n\nmodule.exports = chars;\n\n\n/***/ }),\n/* 753 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * micromatch <https://github.com/jonschlinkert/micromatch>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n\n\nvar utils = __webpack_require__(300);\nvar Glob = __webpack_require__(754);\n\n/**\n * Expose `expand`\n */\n\nmodule.exports = expand;\n\n/**\n * Expand a glob pattern to resolve braces and\n * similar patterns before converting to regex.\n *\n * @param  {String|Array} `pattern`\n * @param  {Array} `files`\n * @param  {Options} `opts`\n * @return {Array}\n */\n\nfunction expand(pattern, options) {\n  if (typeof pattern !== 'string') {\n    throw new TypeError('micromatch.expand(): argument should be a string.');\n  }\n\n  var glob = new Glob(pattern, options || {});\n  var opts = glob.options;\n\n  if (!utils.isGlob(pattern)) {\n    glob.pattern = glob.pattern.replace(/([\\/.])/g, '\\\\$1');\n    return glob;\n  }\n\n  glob.pattern = glob.pattern.replace(/(\\+)(?!\\()/g, '\\\\$1');\n  glob.pattern = glob.pattern.split('$').join('\\\\$');\n\n  if (typeof opts.braces !== 'boolean' && typeof opts.nobraces !== 'boolean') {\n    opts.braces = true;\n  }\n\n  if (glob.pattern === '.*') {\n    return {\n      pattern: '\\\\.' + star,\n      tokens: tok,\n      options: opts\n    };\n  }\n\n  if (glob.pattern === '*') {\n    return {\n      pattern: oneStar(opts.dot),\n      tokens: tok,\n      options: opts\n    };\n  }\n\n  // parse the glob pattern into tokens\n  glob.parse();\n  var tok = glob.tokens;\n  tok.is.negated = opts.negated;\n\n  // dotfile handling\n  if ((opts.dotfiles === true || tok.is.dotfile) && opts.dot !== false) {\n    opts.dotfiles = true;\n    opts.dot = true;\n  }\n\n  if ((opts.dotdirs === true || tok.is.dotdir) && opts.dot !== false) {\n    opts.dotdirs = true;\n    opts.dot = true;\n  }\n\n  // check for braces with a dotfile pattern\n  if (/[{,]\\./.test(glob.pattern)) {\n    opts.makeRe = false;\n    opts.dot = true;\n  }\n\n  if (opts.nonegate !== true) {\n    opts.negated = glob.negated;\n  }\n\n  // if the leading character is a dot or a slash, escape it\n  if (glob.pattern.charAt(0) === '.' && glob.pattern.charAt(1) !== '/') {\n    glob.pattern = '\\\\' + glob.pattern;\n  }\n\n  /**\n   * Extended globs\n   */\n\n  // expand braces, e.g `{1..5}`\n  glob.track('before braces');\n  if (tok.is.braces) {\n    glob.braces();\n  }\n  glob.track('after braces');\n\n  // expand extglobs, e.g `foo/!(a|b)`\n  glob.track('before extglob');\n  if (tok.is.extglob) {\n    glob.extglob();\n  }\n  glob.track('after extglob');\n\n  // expand brackets, e.g `[[:alpha:]]`\n  glob.track('before brackets');\n  if (tok.is.brackets) {\n    glob.brackets();\n  }\n  glob.track('after brackets');\n\n  // special patterns\n  glob._replace('[!', '[^');\n  glob._replace('(?', '(%~');\n  glob._replace(/\\[\\]/, '\\\\[\\\\]');\n  glob._replace('/[', '/' + (opts.dot ? dotfiles : nodot) + '[', true);\n  glob._replace('/?', '/' + (opts.dot ? dotfiles : nodot) + '[^/]', true);\n  glob._replace('/.', '/(?=.)\\\\.', true);\n\n  // windows drives\n  glob._replace(/^(\\w):([\\\\\\/]+?)/gi, '(?=.)$1:$2', true);\n\n  // negate slashes in exclusion ranges\n  if (glob.pattern.indexOf('[^') !== -1) {\n    glob.pattern = negateSlash(glob.pattern);\n  }\n\n  if (opts.globstar !== false && glob.pattern === '**') {\n    glob.pattern = globstar(opts.dot);\n\n  } else {\n    glob.pattern = balance(glob.pattern, '[', ']');\n    glob.escape(glob.pattern);\n\n    // if the pattern has `**`\n    if (tok.is.globstar) {\n      glob.pattern = collapse(glob.pattern, '/**');\n      glob.pattern = collapse(glob.pattern, '**/');\n      glob._replace('/**/', '(?:/' + globstar(opts.dot) + '/|/)', true);\n      glob._replace(/\\*{2,}/g, '**');\n\n      // 'foo/*'\n      glob._replace(/(\\w+)\\*(?!\\/)/g, '$1[^/]*?', true);\n      glob._replace(/\\*\\*\\/\\*(\\w)/g, globstar(opts.dot) + '\\\\/' + (opts.dot ? dotfiles : nodot) + '[^/]*?$1', true);\n\n      if (opts.dot !== true) {\n        glob._replace(/\\*\\*\\/(.)/g, '(?:**\\\\/|)$1');\n      }\n\n      // 'foo/**' or '{**,*}', but not 'foo**'\n      if (tok.path.dirname !== '' || /,\\*\\*|\\*\\*,/.test(glob.orig)) {\n        glob._replace('**', globstar(opts.dot), true);\n      }\n    }\n\n    // ends with /*\n    glob._replace(/\\/\\*$/, '\\\\/' + oneStar(opts.dot), true);\n    // ends with *, no slashes\n    glob._replace(/(?!\\/)\\*$/, star, true);\n    // has 'n*.' (partial wildcard w/ file extension)\n    glob._replace(/([^\\/]+)\\*/, '$1' + oneStar(true), true);\n    // has '*'\n    glob._replace('*', oneStar(opts.dot), true);\n    glob._replace('?.', '?\\\\.', true);\n    glob._replace('?:', '?:', true);\n\n    glob._replace(/\\?+/g, function(match) {\n      var len = match.length;\n      if (len === 1) {\n        return qmark;\n      }\n      return qmark + '{' + len + '}';\n    });\n\n    // escape '.abc' => '\\\\.abc'\n    glob._replace(/\\.([*\\w]+)/g, '\\\\.$1');\n    // fix '[^\\\\\\\\/]'\n    glob._replace(/\\[\\^[\\\\\\/]+\\]/g, qmark);\n    // '///' => '\\/'\n    glob._replace(/\\/+/g, '\\\\/');\n    // '\\\\\\\\\\\\' => '\\\\'\n    glob._replace(/\\\\{2,}/g, '\\\\');\n  }\n\n  // unescape previously escaped patterns\n  glob.unescape(glob.pattern);\n  glob._replace('__UNESC_STAR__', '*');\n\n  // escape dots that follow qmarks\n  glob._replace('?.', '?\\\\.');\n\n  // remove unnecessary slashes in character classes\n  glob._replace('[^\\\\/]', qmark);\n\n  if (glob.pattern.length > 1) {\n    if (/^[\\[?*]/.test(glob.pattern)) {\n      // only prepend the string if we don't want to match dotfiles\n      glob.pattern = (opts.dot ? dotfiles : nodot) + glob.pattern;\n    }\n  }\n\n  return glob;\n}\n\n/**\n * Collapse repeated character sequences.\n *\n * ```js\n * collapse('a/../../../b', '../');\n * //=> 'a/../b'\n * ```\n *\n * @param  {String} `str`\n * @param  {String} `ch` Character sequence to collapse\n * @return {String}\n */\n\nfunction collapse(str, ch) {\n  var res = str.split(ch);\n  var isFirst = res[0] === '';\n  var isLast = res[res.length - 1] === '';\n  res = res.filter(Boolean);\n  if (isFirst) res.unshift('');\n  if (isLast) res.push('');\n  return res.join(ch);\n}\n\n/**\n * Negate slashes in exclusion ranges, per glob spec:\n *\n * ```js\n * negateSlash('[^foo]');\n * //=> '[^\\\\/foo]'\n * ```\n *\n * @param  {String} `str` glob pattern\n * @return {String}\n */\n\nfunction negateSlash(str) {\n  return str.replace(/\\[\\^([^\\]]*?)\\]/g, function(match, inner) {\n    if (inner.indexOf('/') === -1) {\n      inner = '\\\\/' + inner;\n    }\n    return '[^' + inner + ']';\n  });\n}\n\n/**\n * Escape imbalanced braces/bracket. This is a very\n * basic, naive implementation that only does enough\n * to serve the purpose.\n */\n\nfunction balance(str, a, b) {\n  var aarr = str.split(a);\n  var alen = aarr.join('').length;\n  var blen = str.split(b).join('').length;\n\n  if (alen !== blen) {\n    str = aarr.join('\\\\' + a);\n    return str.split(b).join('\\\\' + b);\n  }\n  return str;\n}\n\n/**\n * Special patterns to be converted to regex.\n * Heuristics are used to simplify patterns\n * and speed up processing.\n */\n\n/* eslint no-multi-spaces: 0 */\nvar qmark       = '[^/]';\nvar star        = qmark + '*?';\nvar nodot       = '(?!\\\\.)(?=.)';\nvar dotfileGlob = '(?:\\\\/|^)\\\\.{1,2}($|\\\\/)';\nvar dotfiles    = '(?!' + dotfileGlob + ')(?=.)';\nvar twoStarDot  = '(?:(?!' + dotfileGlob + ').)*?';\n\n/**\n * Create a regex for `*`.\n *\n * If `dot` is true, or the pattern does not begin with\n * a leading star, then return the simpler regex.\n */\n\nfunction oneStar(dotfile) {\n  return dotfile ? '(?!' + dotfileGlob + ')(?=.)' + star : (nodot + star);\n}\n\nfunction globstar(dotfile) {\n  if (dotfile) { return twoStarDot; }\n  return '(?:(?!(?:\\\\/|^)\\\\.).)*?';\n}\n\n\n/***/ }),\n/* 754 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar chars = __webpack_require__(752);\nvar utils = __webpack_require__(300);\n\n/**\n * Expose `Glob`\n */\n\nvar Glob = module.exports = function Glob(pattern, options) {\n  if (!(this instanceof Glob)) {\n    return new Glob(pattern, options);\n  }\n  this.options = options || {};\n  this.pattern = pattern;\n  this.history = [];\n  this.tokens = {};\n  this.init(pattern);\n};\n\n/**\n * Initialize defaults\n */\n\nGlob.prototype.init = function(pattern) {\n  this.orig = pattern;\n  this.negated = this.isNegated();\n  this.options.track = this.options.track || false;\n  this.options.makeRe = true;\n};\n\n/**\n * Push a change into `glob.history`. Useful\n * for debugging.\n */\n\nGlob.prototype.track = function(msg) {\n  if (this.options.track) {\n    this.history.push({msg: msg, pattern: this.pattern});\n  }\n};\n\n/**\n * Return true if `glob.pattern` was negated\n * with `!`, also remove the `!` from the pattern.\n *\n * @return {Boolean}\n */\n\nGlob.prototype.isNegated = function() {\n  if (this.pattern.charCodeAt(0) === 33 /* '!' */) {\n    this.pattern = this.pattern.slice(1);\n    return true;\n  }\n  return false;\n};\n\n/**\n * Expand braces in the given glob pattern.\n *\n * We only need to use the [braces] lib when\n * patterns are nested.\n */\n\nGlob.prototype.braces = function() {\n  if (this.options.nobraces !== true && this.options.nobrace !== true) {\n    // naive/fast check for imbalanced characters\n    var a = this.pattern.match(/[\\{\\(\\[]/g);\n    var b = this.pattern.match(/[\\}\\)\\]]/g);\n\n    // if imbalanced, don't optimize the pattern\n    if (a && b && (a.length !== b.length)) {\n      this.options.makeRe = false;\n    }\n\n    // expand brace patterns and join the resulting array\n    var expanded = utils.braces(this.pattern, this.options);\n    this.pattern = expanded.join('|');\n  }\n};\n\n/**\n * Expand bracket expressions in `glob.pattern`\n */\n\nGlob.prototype.brackets = function() {\n  if (this.options.nobrackets !== true) {\n    this.pattern = utils.brackets(this.pattern);\n  }\n};\n\n/**\n * Expand bracket expressions in `glob.pattern`\n */\n\nGlob.prototype.extglob = function() {\n  if (this.options.noextglob === true) return;\n\n  if (utils.isExtglob(this.pattern)) {\n    this.pattern = utils.extglob(this.pattern, {escape: true});\n  }\n};\n\n/**\n * Parse the given pattern\n */\n\nGlob.prototype.parse = function(pattern) {\n  this.tokens = utils.parseGlob(pattern || this.pattern, true);\n  return this.tokens;\n};\n\n/**\n * Replace `a` with `b`. Also tracks the change before and\n * after each replacement. This is disabled by default, but\n * can be enabled by setting `options.track` to true.\n *\n * Also, when the pattern is a string, `.split()` is used,\n * because it's much faster than replace.\n *\n * @param  {RegExp|String} `a`\n * @param  {String} `b`\n * @param  {Boolean} `escape` When `true`, escapes `*` and `?` in the replacement.\n * @return {String}\n */\n\nGlob.prototype._replace = function(a, b, escape) {\n  this.track('before (find): \"' + a + '\" (replace with): \"' + b + '\"');\n  if (escape) b = esc(b);\n  if (a && b && typeof a === 'string') {\n    this.pattern = this.pattern.split(a).join(b);\n  } else {\n    this.pattern = this.pattern.replace(a, b);\n  }\n  this.track('after');\n};\n\n/**\n * Escape special characters in the given string.\n *\n * @param  {String} `str` Glob pattern\n * @return {String}\n */\n\nGlob.prototype.escape = function(str) {\n  this.track('before escape: ');\n  var re = /[\"\\\\](['\"]?[^\"'\\\\]['\"]?)/g;\n\n  this.pattern = str.replace(re, function($0, $1) {\n    var o = chars.ESC;\n    var ch = o && o[$1];\n    if (ch) {\n      return ch;\n    }\n    if (/[a-z]/i.test($0)) {\n      return $0.split('\\\\').join('');\n    }\n    return $0;\n  });\n\n  this.track('after escape: ');\n};\n\n/**\n * Unescape special characters in the given string.\n *\n * @param  {String} `str`\n * @return {String}\n */\n\nGlob.prototype.unescape = function(str) {\n  var re = /__([A-Z]+)_([A-Z]+)__/g;\n  this.pattern = str.replace(re, function($0, $1) {\n    return chars[$1][$0];\n  });\n  this.pattern = unesc(this.pattern);\n};\n\n/**\n * Escape/unescape utils\n */\n\nfunction esc(str) {\n  str = str.split('?').join('%~');\n  str = str.split('*').join('%%');\n  return str;\n}\n\nfunction unesc(str) {\n  str = str.split('%~').join('?');\n  str = str.split('%%').join('*');\n  return str;\n}\n\n\n/***/ }),\n/* 755 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * arr-diff <https://github.com/jonschlinkert/arr-diff>\n *\n * Copyright (c) 2014 Jon Schlinkert, contributors.\n * Licensed under the MIT License\n */\n\n\n\nvar flatten = __webpack_require__(478);\nvar slice = [].slice;\n\n/**\n * Return the difference between the first array and\n * additional arrays.\n *\n * ```js\n * var diff = require('{%= name %}');\n *\n * var a = ['a', 'b', 'c', 'd'];\n * var b = ['b', 'c'];\n *\n * console.log(diff(a, b))\n * //=> ['a', 'd']\n * ```\n *\n * @param  {Array} `a`\n * @param  {Array} `b`\n * @return {Array}\n * @api public\n */\n\nfunction diff(arr, arrays) {\n  var argsLen = arguments.length;\n  var len = arr.length, i = -1;\n  var res = [], arrays;\n\n  if (argsLen === 1) {\n    return arr;\n  }\n\n  if (argsLen > 2) {\n    arrays = flatten(slice.call(arguments, 1));\n  }\n\n  while (++i < len) {\n    if (!~arrays.indexOf(arr[i])) {\n      res.push(arr[i]);\n    }\n  }\n  return res;\n}\n\n/**\n * Expose `diff`\n */\n\nmodule.exports = diff;\n\n\n/***/ }),\n/* 756 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * array-unique <https://github.com/jonschlinkert/array-unique>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n\n\nmodule.exports = function unique(arr) {\n  if (!Array.isArray(arr)) {\n    throw new TypeError('array-unique expects an array.');\n  }\n\n  var len = arr.length;\n  var i = -1;\n\n  while (i++ < len) {\n    var j = i + 1;\n\n    for (; j < arr.length; ++j) {\n      if (arr[i] === arr[j]) {\n        arr.splice(j--, 1);\n      }\n    }\n  }\n  return arr;\n};\n\n\n/***/ }),\n/* 757 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * braces <https://github.com/jonschlinkert/braces>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT license.\n */\n\n\n\n/**\n * Module dependencies\n */\n\nvar expand = __webpack_require__(608);\nvar repeat = __webpack_require__(411);\nvar tokens = __webpack_require__(778);\n\n/**\n * Expose `braces`\n */\n\nmodule.exports = function(str, options) {\n  if (typeof str !== 'string') {\n    throw new Error('braces expects a string');\n  }\n  return braces(str, options);\n};\n\n/**\n * Expand `{foo,bar}` or `{1..5}` braces in the\n * given `string`.\n *\n * @param  {String} `str`\n * @param  {Array} `arr`\n * @param  {Object} `options`\n * @return {Array}\n */\n\nfunction braces(str, arr, options) {\n  if (str === '') {\n    return [];\n  }\n\n  if (!Array.isArray(arr)) {\n    options = arr;\n    arr = [];\n  }\n\n  var opts = options || {};\n  arr = arr || [];\n\n  if (typeof opts.nodupes === 'undefined') {\n    opts.nodupes = true;\n  }\n\n  var fn = opts.fn;\n  var es6;\n\n  if (typeof opts === 'function') {\n    fn = opts;\n    opts = {};\n  }\n\n  if (!(patternRe instanceof RegExp)) {\n    patternRe = patternRegex();\n  }\n\n  var matches = str.match(patternRe) || [];\n  var m = matches[0];\n\n  switch(m) {\n    case '\\\\,':\n      return escapeCommas(str, arr, opts);\n    case '\\\\.':\n      return escapeDots(str, arr, opts);\n    case '\\/.':\n      return escapePaths(str, arr, opts);\n    case ' ':\n      return splitWhitespace(str);\n    case '{,}':\n      return exponential(str, opts, braces);\n    case '{}':\n      return emptyBraces(str, arr, opts);\n    case '\\\\{':\n    case '\\\\}':\n      return escapeBraces(str, arr, opts);\n    case '${':\n      if (!/\\{[^{]+\\{/.test(str)) {\n        return arr.concat(str);\n      } else {\n        es6 = true;\n        str = tokens.before(str, es6Regex());\n      }\n  }\n\n  if (!(braceRe instanceof RegExp)) {\n    braceRe = braceRegex();\n  }\n\n  var match = braceRe.exec(str);\n  if (match == null) {\n    return [str];\n  }\n\n  var outter = match[1];\n  var inner = match[2];\n  if (inner === '') { return [str]; }\n\n  var segs, segsLength;\n\n  if (inner.indexOf('..') !== -1) {\n    segs = expand(inner, opts, fn) || inner.split(',');\n    segsLength = segs.length;\n\n  } else if (inner[0] === '\"' || inner[0] === '\\'') {\n    return arr.concat(str.split(/['\"]/).join(''));\n\n  } else {\n    segs = inner.split(',');\n    if (opts.makeRe) {\n      return braces(str.replace(outter, wrap(segs, '|')), opts);\n    }\n\n    segsLength = segs.length;\n    if (segsLength === 1 && opts.bash) {\n      segs[0] = wrap(segs[0], '\\\\');\n    }\n  }\n\n  var len = segs.length;\n  var i = 0, val;\n\n  while (len--) {\n    var path = segs[i++];\n\n    if (/(\\.[^.\\/])/.test(path)) {\n      if (segsLength > 1) {\n        return segs;\n      } else {\n        return [str];\n      }\n    }\n\n    val = splice(str, outter, path);\n\n    if (/\\{[^{}]+?\\}/.test(val)) {\n      arr = braces(val, arr, opts);\n    } else if (val !== '') {\n      if (opts.nodupes && arr.indexOf(val) !== -1) { continue; }\n      arr.push(es6 ? tokens.after(val) : val);\n    }\n  }\n\n  if (opts.strict) { return filter(arr, filterEmpty); }\n  return arr;\n}\n\n/**\n * Expand exponential ranges\n *\n *   `a{,}{,}` => ['a', 'a', 'a', 'a']\n */\n\nfunction exponential(str, options, fn) {\n  if (typeof options === 'function') {\n    fn = options;\n    options = null;\n  }\n\n  var opts = options || {};\n  var esc = '__ESC_EXP__';\n  var exp = 0;\n  var res;\n\n  var parts = str.split('{,}');\n  if (opts.nodupes) {\n    return fn(parts.join(''), opts);\n  }\n\n  exp = parts.length - 1;\n  res = fn(parts.join(esc), opts);\n  var len = res.length;\n  var arr = [];\n  var i = 0;\n\n  while (len--) {\n    var ele = res[i++];\n    var idx = ele.indexOf(esc);\n\n    if (idx === -1) {\n      arr.push(ele);\n\n    } else {\n      ele = ele.split('__ESC_EXP__').join('');\n      if (!!ele && opts.nodupes !== false) {\n        arr.push(ele);\n\n      } else {\n        var num = Math.pow(2, exp);\n        arr.push.apply(arr, repeat(ele, num));\n      }\n    }\n  }\n  return arr;\n}\n\n/**\n * Wrap a value with parens, brackets or braces,\n * based on the given character/separator.\n *\n * @param  {String|Array} `val`\n * @param  {String} `ch`\n * @return {String}\n */\n\nfunction wrap(val, ch) {\n  if (ch === '|') {\n    return '(' + val.join(ch) + ')';\n  }\n  if (ch === ',') {\n    return '{' + val.join(ch) + '}';\n  }\n  if (ch === '-') {\n    return '[' + val.join(ch) + ']';\n  }\n  if (ch === '\\\\') {\n    return '\\\\{' + val + '\\\\}';\n  }\n}\n\n/**\n * Handle empty braces: `{}`\n */\n\nfunction emptyBraces(str, arr, opts) {\n  return braces(str.split('{}').join('\\\\{\\\\}'), arr, opts);\n}\n\n/**\n * Filter out empty-ish values\n */\n\nfunction filterEmpty(ele) {\n  return !!ele && ele !== '\\\\';\n}\n\n/**\n * Handle patterns with whitespace\n */\n\nfunction splitWhitespace(str) {\n  var segs = str.split(' ');\n  var len = segs.length;\n  var res = [];\n  var i = 0;\n\n  while (len--) {\n    res.push.apply(res, braces(segs[i++]));\n  }\n  return res;\n}\n\n/**\n * Handle escaped braces: `\\\\{foo,bar}`\n */\n\nfunction escapeBraces(str, arr, opts) {\n  if (!/\\{[^{]+\\{/.test(str)) {\n    return arr.concat(str.split('\\\\').join(''));\n  } else {\n    str = str.split('\\\\{').join('__LT_BRACE__');\n    str = str.split('\\\\}').join('__RT_BRACE__');\n    return map(braces(str, arr, opts), function(ele) {\n      ele = ele.split('__LT_BRACE__').join('{');\n      return ele.split('__RT_BRACE__').join('}');\n    });\n  }\n}\n\n/**\n * Handle escaped dots: `{1\\\\.2}`\n */\n\nfunction escapeDots(str, arr, opts) {\n  if (!/[^\\\\]\\..+\\\\\\./.test(str)) {\n    return arr.concat(str.split('\\\\').join(''));\n  } else {\n    str = str.split('\\\\.').join('__ESC_DOT__');\n    return map(braces(str, arr, opts), function(ele) {\n      return ele.split('__ESC_DOT__').join('.');\n    });\n  }\n}\n\n/**\n * Handle escaped dots: `{1\\\\.2}`\n */\n\nfunction escapePaths(str, arr, opts) {\n  str = str.split('\\/.').join('__ESC_PATH__');\n  return map(braces(str, arr, opts), function(ele) {\n    return ele.split('__ESC_PATH__').join('\\/.');\n  });\n}\n\n/**\n * Handle escaped commas: `{a\\\\,b}`\n */\n\nfunction escapeCommas(str, arr, opts) {\n  if (!/\\w,/.test(str)) {\n    return arr.concat(str.split('\\\\').join(''));\n  } else {\n    str = str.split('\\\\,').join('__ESC_COMMA__');\n    return map(braces(str, arr, opts), function(ele) {\n      return ele.split('__ESC_COMMA__').join(',');\n    });\n  }\n}\n\n/**\n * Regex for common patterns\n */\n\nfunction patternRegex() {\n  return /\\${|( (?=[{,}])|(?=[{,}]) )|{}|{,}|\\\\,(?=.*[{}])|\\/\\.(?=.*[{}])|\\\\\\.(?={)|\\\\{|\\\\}/;\n}\n\n/**\n * Braces regex.\n */\n\nfunction braceRegex() {\n  return /.*(\\\\?\\{([^}]+)\\})/;\n}\n\n/**\n * es6 delimiter regex.\n */\n\nfunction es6Regex() {\n  return /\\$\\{([^}]+)\\}/;\n}\n\nvar braceRe;\nvar patternRe;\n\n/**\n * Faster alternative to `String.replace()` when the\n * index of the token to be replaces can't be supplied\n */\n\nfunction splice(str, token, replacement) {\n  var i = str.indexOf(token);\n  return str.substr(0, i) + replacement\n    + str.substr(i + token.length);\n}\n\n/**\n * Fast array map\n */\n\nfunction map(arr, fn) {\n  if (arr == null) {\n    return [];\n  }\n\n  var len = arr.length;\n  var res = new Array(len);\n  var i = -1;\n\n  while (++i < len) {\n    res[i] = fn(arr[i], i, arr);\n  }\n\n  return res;\n}\n\n/**\n * Fast array filter\n */\n\nfunction filter(arr, cb) {\n  if (arr == null) return [];\n  if (typeof cb !== 'function') {\n    throw new TypeError('braces: filter expects a callback function.');\n  }\n\n  var len = arr.length;\n  var res = arr.slice();\n  var i = 0;\n\n  while (len--) {\n    if (!cb(arr[len], i++)) {\n      res.splice(len, 1);\n    }\n  }\n  return res;\n}\n\n\n/***/ }),\n/* 758 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"application/1d-interleaved-parityfec\":{\"source\":\"iana\"},\"application/3gpdash-qoe-report+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/3gpp-ims+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/a2l\":{\"source\":\"iana\"},\"application/activemessage\":{\"source\":\"iana\"},\"application/activity+json\":{\"source\":\"iana\",\"compressible\":true},\"application/alto-costmap+json\":{\"source\":\"iana\",\"compressible\":true},\"application/alto-costmapfilter+json\":{\"source\":\"iana\",\"compressible\":true},\"application/alto-directory+json\":{\"source\":\"iana\",\"compressible\":true},\"application/alto-endpointcost+json\":{\"source\":\"iana\",\"compressible\":true},\"application/alto-endpointcostparams+json\":{\"source\":\"iana\",\"compressible\":true},\"application/alto-endpointprop+json\":{\"source\":\"iana\",\"compressible\":true},\"application/alto-endpointpropparams+json\":{\"source\":\"iana\",\"compressible\":true},\"application/alto-error+json\":{\"source\":\"iana\",\"compressible\":true},\"application/alto-networkmap+json\":{\"source\":\"iana\",\"compressible\":true},\"application/alto-networkmapfilter+json\":{\"source\":\"iana\",\"compressible\":true},\"application/aml\":{\"source\":\"iana\"},\"application/andrew-inset\":{\"source\":\"iana\",\"extensions\":[\"ez\"]},\"application/applefile\":{\"source\":\"iana\"},\"application/applixware\":{\"source\":\"apache\",\"extensions\":[\"aw\"]},\"application/atf\":{\"source\":\"iana\"},\"application/atfx\":{\"source\":\"iana\"},\"application/atom+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"atom\"]},\"application/atomcat+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"atomcat\"]},\"application/atomdeleted+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/atomicmail\":{\"source\":\"iana\"},\"application/atomsvc+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"atomsvc\"]},\"application/atxml\":{\"source\":\"iana\"},\"application/auth-policy+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/bacnet-xdd+zip\":{\"source\":\"iana\",\"compressible\":false},\"application/batch-smtp\":{\"source\":\"iana\"},\"application/bdoc\":{\"compressible\":false,\"extensions\":[\"bdoc\"]},\"application/beep+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/calendar+json\":{\"source\":\"iana\",\"compressible\":true},\"application/calendar+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/call-completion\":{\"source\":\"iana\"},\"application/cals-1840\":{\"source\":\"iana\"},\"application/cbor\":{\"source\":\"iana\"},\"application/cccex\":{\"source\":\"iana\"},\"application/ccmp+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/ccxml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"ccxml\"]},\"application/cdfx+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/cdmi-capability\":{\"source\":\"iana\",\"extensions\":[\"cdmia\"]},\"application/cdmi-container\":{\"source\":\"iana\",\"extensions\":[\"cdmic\"]},\"application/cdmi-domain\":{\"source\":\"iana\",\"extensions\":[\"cdmid\"]},\"application/cdmi-object\":{\"source\":\"iana\",\"extensions\":[\"cdmio\"]},\"application/cdmi-queue\":{\"source\":\"iana\",\"extensions\":[\"cdmiq\"]},\"application/cdni\":{\"source\":\"iana\"},\"application/cea\":{\"source\":\"iana\"},\"application/cea-2018+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/cellml+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/cfw\":{\"source\":\"iana\"},\"application/clue_info+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/cms\":{\"source\":\"iana\"},\"application/cnrp+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/coap-group+json\":{\"source\":\"iana\",\"compressible\":true},\"application/coap-payload\":{\"source\":\"iana\"},\"application/commonground\":{\"source\":\"iana\"},\"application/conference-info+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/cose\":{\"source\":\"iana\"},\"application/cose-key\":{\"source\":\"iana\"},\"application/cose-key-set\":{\"source\":\"iana\"},\"application/cpl+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/csrattrs\":{\"source\":\"iana\"},\"application/csta+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/cstadata+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/csvm+json\":{\"source\":\"iana\",\"compressible\":true},\"application/cu-seeme\":{\"source\":\"apache\",\"extensions\":[\"cu\"]},\"application/cwt\":{\"source\":\"iana\"},\"application/cybercash\":{\"source\":\"iana\"},\"application/dart\":{\"compressible\":true},\"application/dash+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"mpd\"]},\"application/dashdelta\":{\"source\":\"iana\"},\"application/davmount+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"davmount\"]},\"application/dca-rft\":{\"source\":\"iana\"},\"application/dcd\":{\"source\":\"iana\"},\"application/dec-dx\":{\"source\":\"iana\"},\"application/dialog-info+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/dicom\":{\"source\":\"iana\"},\"application/dicom+json\":{\"source\":\"iana\",\"compressible\":true},\"application/dicom+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/dii\":{\"source\":\"iana\"},\"application/dit\":{\"source\":\"iana\"},\"application/dns\":{\"source\":\"iana\"},\"application/dns+json\":{\"source\":\"iana\",\"compressible\":true},\"application/docbook+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"dbk\"]},\"application/dskpp+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/dssc+der\":{\"source\":\"iana\",\"extensions\":[\"dssc\"]},\"application/dssc+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"xdssc\"]},\"application/dvcs\":{\"source\":\"iana\"},\"application/ecmascript\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"ecma\",\"es\"]},\"application/edi-consent\":{\"source\":\"iana\"},\"application/edi-x12\":{\"source\":\"iana\",\"compressible\":false},\"application/edifact\":{\"source\":\"iana\",\"compressible\":false},\"application/efi\":{\"source\":\"iana\"},\"application/emergencycalldata.comment+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/emergencycalldata.control+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/emergencycalldata.deviceinfo+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/emergencycalldata.ecall.msd\":{\"source\":\"iana\"},\"application/emergencycalldata.providerinfo+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/emergencycalldata.serviceinfo+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/emergencycalldata.subscriberinfo+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/emergencycalldata.veds+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/emma+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"emma\"]},\"application/emotionml+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/encaprtp\":{\"source\":\"iana\"},\"application/epp+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/epub+zip\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"epub\"]},\"application/eshop\":{\"source\":\"iana\"},\"application/exi\":{\"source\":\"iana\",\"extensions\":[\"exi\"]},\"application/fastinfoset\":{\"source\":\"iana\"},\"application/fastsoap\":{\"source\":\"iana\"},\"application/fdt+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/fhir+json\":{\"source\":\"iana\",\"compressible\":true},\"application/fhir+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/fido.trusted-apps+json\":{\"compressible\":true},\"application/fits\":{\"source\":\"iana\"},\"application/font-sfnt\":{\"source\":\"iana\"},\"application/font-tdpfr\":{\"source\":\"iana\",\"extensions\":[\"pfr\"]},\"application/font-woff\":{\"source\":\"iana\",\"compressible\":false},\"application/framework-attributes+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/geo+json\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"geojson\"]},\"application/geo+json-seq\":{\"source\":\"iana\"},\"application/geoxacml+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/gltf-buffer\":{\"source\":\"iana\"},\"application/gml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"gml\"]},\"application/gpx+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"gpx\"]},\"application/gxf\":{\"source\":\"apache\",\"extensions\":[\"gxf\"]},\"application/gzip\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"gz\"]},\"application/h224\":{\"source\":\"iana\"},\"application/held+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/hjson\":{\"extensions\":[\"hjson\"]},\"application/http\":{\"source\":\"iana\"},\"application/hyperstudio\":{\"source\":\"iana\",\"extensions\":[\"stk\"]},\"application/ibe-key-request+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/ibe-pkg-reply+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/ibe-pp-data\":{\"source\":\"iana\"},\"application/iges\":{\"source\":\"iana\"},\"application/im-iscomposing+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/index\":{\"source\":\"iana\"},\"application/index.cmd\":{\"source\":\"iana\"},\"application/index.obj\":{\"source\":\"iana\"},\"application/index.response\":{\"source\":\"iana\"},\"application/index.vnd\":{\"source\":\"iana\"},\"application/inkml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"ink\",\"inkml\"]},\"application/iotp\":{\"source\":\"iana\"},\"application/ipfix\":{\"source\":\"iana\",\"extensions\":[\"ipfix\"]},\"application/ipp\":{\"source\":\"iana\"},\"application/isup\":{\"source\":\"iana\"},\"application/its+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/java-archive\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"jar\",\"war\",\"ear\"]},\"application/java-serialized-object\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"ser\"]},\"application/java-vm\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"class\"]},\"application/javascript\":{\"source\":\"iana\",\"charset\":\"UTF-8\",\"compressible\":true,\"extensions\":[\"js\",\"mjs\"]},\"application/jf2feed+json\":{\"source\":\"iana\",\"compressible\":true},\"application/jose\":{\"source\":\"iana\"},\"application/jose+json\":{\"source\":\"iana\",\"compressible\":true},\"application/jrd+json\":{\"source\":\"iana\",\"compressible\":true},\"application/json\":{\"source\":\"iana\",\"charset\":\"UTF-8\",\"compressible\":true,\"extensions\":[\"json\",\"map\"]},\"application/json-patch+json\":{\"source\":\"iana\",\"compressible\":true},\"application/json-seq\":{\"source\":\"iana\"},\"application/json5\":{\"extensions\":[\"json5\"]},\"application/jsonml+json\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"jsonml\"]},\"application/jwk+json\":{\"source\":\"iana\",\"compressible\":true},\"application/jwk-set+json\":{\"source\":\"iana\",\"compressible\":true},\"application/jwt\":{\"source\":\"iana\"},\"application/kpml-request+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/kpml-response+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/ld+json\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"jsonld\"]},\"application/lgr+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/link-format\":{\"source\":\"iana\"},\"application/load-control+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/lost+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"lostxml\"]},\"application/lostsync+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/lxf\":{\"source\":\"iana\"},\"application/mac-binhex40\":{\"source\":\"iana\",\"extensions\":[\"hqx\"]},\"application/mac-compactpro\":{\"source\":\"apache\",\"extensions\":[\"cpt\"]},\"application/macwriteii\":{\"source\":\"iana\"},\"application/mads+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"mads\"]},\"application/manifest+json\":{\"charset\":\"UTF-8\",\"compressible\":true,\"extensions\":[\"webmanifest\"]},\"application/marc\":{\"source\":\"iana\",\"extensions\":[\"mrc\"]},\"application/marcxml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"mrcx\"]},\"application/mathematica\":{\"source\":\"iana\",\"extensions\":[\"ma\",\"nb\",\"mb\"]},\"application/mathml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"mathml\"]},\"application/mathml-content+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mathml-presentation+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mbms-associated-procedure-description+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mbms-deregister+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mbms-envelope+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mbms-msk+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mbms-msk-response+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mbms-protection-description+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mbms-reception-report+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mbms-register+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mbms-register-response+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mbms-schedule+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mbms-user-service-description+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mbox\":{\"source\":\"iana\",\"extensions\":[\"mbox\"]},\"application/media-policy-dataset+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/media_control+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mediaservercontrol+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"mscml\"]},\"application/merge-patch+json\":{\"source\":\"iana\",\"compressible\":true},\"application/metalink+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"metalink\"]},\"application/metalink4+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"meta4\"]},\"application/mets+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"mets\"]},\"application/mf4\":{\"source\":\"iana\"},\"application/mikey\":{\"source\":\"iana\"},\"application/mmt-usd+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mods+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"mods\"]},\"application/moss-keys\":{\"source\":\"iana\"},\"application/moss-signature\":{\"source\":\"iana\"},\"application/mosskey-data\":{\"source\":\"iana\"},\"application/mosskey-request\":{\"source\":\"iana\"},\"application/mp21\":{\"source\":\"iana\",\"extensions\":[\"m21\",\"mp21\"]},\"application/mp4\":{\"source\":\"iana\",\"extensions\":[\"mp4s\",\"m4p\"]},\"application/mpeg4-generic\":{\"source\":\"iana\"},\"application/mpeg4-iod\":{\"source\":\"iana\"},\"application/mpeg4-iod-xmt\":{\"source\":\"iana\"},\"application/mrb-consumer+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/mrb-publish+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/msc-ivr+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/msc-mixer+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/msword\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"doc\",\"dot\"]},\"application/mud+json\":{\"source\":\"iana\",\"compressible\":true},\"application/mxf\":{\"source\":\"iana\",\"extensions\":[\"mxf\"]},\"application/n-quads\":{\"source\":\"iana\"},\"application/n-triples\":{\"source\":\"iana\"},\"application/nasdata\":{\"source\":\"iana\"},\"application/news-checkgroups\":{\"source\":\"iana\"},\"application/news-groupinfo\":{\"source\":\"iana\"},\"application/news-transmission\":{\"source\":\"iana\"},\"application/nlsml+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/node\":{\"source\":\"iana\"},\"application/nss\":{\"source\":\"iana\"},\"application/ocsp-request\":{\"source\":\"iana\"},\"application/ocsp-response\":{\"source\":\"iana\"},\"application/octet-stream\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"bin\",\"dms\",\"lrf\",\"mar\",\"so\",\"dist\",\"distz\",\"pkg\",\"bpk\",\"dump\",\"elc\",\"deploy\",\"exe\",\"dll\",\"deb\",\"dmg\",\"iso\",\"img\",\"msi\",\"msp\",\"msm\",\"buffer\"]},\"application/oda\":{\"source\":\"iana\",\"extensions\":[\"oda\"]},\"application/odx\":{\"source\":\"iana\"},\"application/oebps-package+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"opf\"]},\"application/ogg\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"ogx\"]},\"application/omdoc+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"omdoc\"]},\"application/onenote\":{\"source\":\"apache\",\"extensions\":[\"onetoc\",\"onetoc2\",\"onetmp\",\"onepkg\"]},\"application/oxps\":{\"source\":\"iana\",\"extensions\":[\"oxps\"]},\"application/p2p-overlay+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/parityfec\":{\"source\":\"iana\"},\"application/passport\":{\"source\":\"iana\"},\"application/patch-ops-error+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"xer\"]},\"application/pdf\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"pdf\"]},\"application/pdx\":{\"source\":\"iana\"},\"application/pgp-encrypted\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"pgp\"]},\"application/pgp-keys\":{\"source\":\"iana\"},\"application/pgp-signature\":{\"source\":\"iana\",\"extensions\":[\"asc\",\"sig\"]},\"application/pics-rules\":{\"source\":\"apache\",\"extensions\":[\"prf\"]},\"application/pidf+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/pidf-diff+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/pkcs10\":{\"source\":\"iana\",\"extensions\":[\"p10\"]},\"application/pkcs12\":{\"source\":\"iana\"},\"application/pkcs7-mime\":{\"source\":\"iana\",\"extensions\":[\"p7m\",\"p7c\"]},\"application/pkcs7-signature\":{\"source\":\"iana\",\"extensions\":[\"p7s\"]},\"application/pkcs8\":{\"source\":\"iana\",\"extensions\":[\"p8\"]},\"application/pkcs8-encrypted\":{\"source\":\"iana\"},\"application/pkix-attr-cert\":{\"source\":\"iana\",\"extensions\":[\"ac\"]},\"application/pkix-cert\":{\"source\":\"iana\",\"extensions\":[\"cer\"]},\"application/pkix-crl\":{\"source\":\"iana\",\"extensions\":[\"crl\"]},\"application/pkix-pkipath\":{\"source\":\"iana\",\"extensions\":[\"pkipath\"]},\"application/pkixcmp\":{\"source\":\"iana\",\"extensions\":[\"pki\"]},\"application/pls+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"pls\"]},\"application/poc-settings+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/postscript\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"ai\",\"eps\",\"ps\"]},\"application/ppsp-tracker+json\":{\"source\":\"iana\",\"compressible\":true},\"application/problem+json\":{\"source\":\"iana\",\"compressible\":true},\"application/problem+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/provenance+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/prs.alvestrand.titrax-sheet\":{\"source\":\"iana\"},\"application/prs.cww\":{\"source\":\"iana\",\"extensions\":[\"cww\"]},\"application/prs.hpub+zip\":{\"source\":\"iana\",\"compressible\":false},\"application/prs.nprend\":{\"source\":\"iana\"},\"application/prs.plucker\":{\"source\":\"iana\"},\"application/prs.rdf-xml-crypt\":{\"source\":\"iana\"},\"application/prs.xsf+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/pskc+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"pskcxml\"]},\"application/qsig\":{\"source\":\"iana\"},\"application/raml+yaml\":{\"compressible\":true,\"extensions\":[\"raml\"]},\"application/raptorfec\":{\"source\":\"iana\"},\"application/rdap+json\":{\"source\":\"iana\",\"compressible\":true},\"application/rdf+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"rdf\",\"owl\"]},\"application/reginfo+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"rif\"]},\"application/relax-ng-compact-syntax\":{\"source\":\"iana\",\"extensions\":[\"rnc\"]},\"application/remote-printing\":{\"source\":\"iana\"},\"application/reputon+json\":{\"source\":\"iana\",\"compressible\":true},\"application/resource-lists+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"rl\"]},\"application/resource-lists-diff+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"rld\"]},\"application/rfc+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/riscos\":{\"source\":\"iana\"},\"application/rlmi+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/rls-services+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"rs\"]},\"application/route-apd+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/route-s-tsid+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/route-usd+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/rpki-ghostbusters\":{\"source\":\"iana\",\"extensions\":[\"gbr\"]},\"application/rpki-manifest\":{\"source\":\"iana\",\"extensions\":[\"mft\"]},\"application/rpki-publication\":{\"source\":\"iana\"},\"application/rpki-roa\":{\"source\":\"iana\",\"extensions\":[\"roa\"]},\"application/rpki-updown\":{\"source\":\"iana\"},\"application/rsd+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"rsd\"]},\"application/rss+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"rss\"]},\"application/rtf\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"rtf\"]},\"application/rtploopback\":{\"source\":\"iana\"},\"application/rtx\":{\"source\":\"iana\"},\"application/samlassertion+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/samlmetadata+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/sbml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"sbml\"]},\"application/scaip+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/scim+json\":{\"source\":\"iana\",\"compressible\":true},\"application/scvp-cv-request\":{\"source\":\"iana\",\"extensions\":[\"scq\"]},\"application/scvp-cv-response\":{\"source\":\"iana\",\"extensions\":[\"scs\"]},\"application/scvp-vp-request\":{\"source\":\"iana\",\"extensions\":[\"spq\"]},\"application/scvp-vp-response\":{\"source\":\"iana\",\"extensions\":[\"spp\"]},\"application/sdp\":{\"source\":\"iana\",\"extensions\":[\"sdp\"]},\"application/secevent+jwt\":{\"source\":\"iana\"},\"application/senml+cbor\":{\"source\":\"iana\"},\"application/senml+json\":{\"source\":\"iana\",\"compressible\":true},\"application/senml+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/senml-exi\":{\"source\":\"iana\"},\"application/sensml+cbor\":{\"source\":\"iana\"},\"application/sensml+json\":{\"source\":\"iana\",\"compressible\":true},\"application/sensml+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/sensml-exi\":{\"source\":\"iana\"},\"application/sep+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/sep-exi\":{\"source\":\"iana\"},\"application/session-info\":{\"source\":\"iana\"},\"application/set-payment\":{\"source\":\"iana\"},\"application/set-payment-initiation\":{\"source\":\"iana\",\"extensions\":[\"setpay\"]},\"application/set-registration\":{\"source\":\"iana\"},\"application/set-registration-initiation\":{\"source\":\"iana\",\"extensions\":[\"setreg\"]},\"application/sgml\":{\"source\":\"iana\"},\"application/sgml-open-catalog\":{\"source\":\"iana\"},\"application/shf+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"shf\"]},\"application/sieve\":{\"source\":\"iana\"},\"application/simple-filter+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/simple-message-summary\":{\"source\":\"iana\"},\"application/simplesymbolcontainer\":{\"source\":\"iana\"},\"application/slate\":{\"source\":\"iana\"},\"application/smil\":{\"source\":\"iana\"},\"application/smil+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"smi\",\"smil\"]},\"application/smpte336m\":{\"source\":\"iana\"},\"application/soap+fastinfoset\":{\"source\":\"iana\"},\"application/soap+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/sparql-query\":{\"source\":\"iana\",\"extensions\":[\"rq\"]},\"application/sparql-results+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"srx\"]},\"application/spirits-event+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/sql\":{\"source\":\"iana\"},\"application/srgs\":{\"source\":\"iana\",\"extensions\":[\"gram\"]},\"application/srgs+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"grxml\"]},\"application/sru+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"sru\"]},\"application/ssdl+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"ssdl\"]},\"application/ssml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"ssml\"]},\"application/stix+json\":{\"source\":\"iana\",\"compressible\":true},\"application/tamp-apex-update\":{\"source\":\"iana\"},\"application/tamp-apex-update-confirm\":{\"source\":\"iana\"},\"application/tamp-community-update\":{\"source\":\"iana\"},\"application/tamp-community-update-confirm\":{\"source\":\"iana\"},\"application/tamp-error\":{\"source\":\"iana\"},\"application/tamp-sequence-adjust\":{\"source\":\"iana\"},\"application/tamp-sequence-adjust-confirm\":{\"source\":\"iana\"},\"application/tamp-status-query\":{\"source\":\"iana\"},\"application/tamp-status-response\":{\"source\":\"iana\"},\"application/tamp-update\":{\"source\":\"iana\"},\"application/tamp-update-confirm\":{\"source\":\"iana\"},\"application/tar\":{\"compressible\":true},\"application/taxii+json\":{\"source\":\"iana\",\"compressible\":true},\"application/tei+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"tei\",\"teicorpus\"]},\"application/thraud+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"tfi\"]},\"application/timestamp-query\":{\"source\":\"iana\"},\"application/timestamp-reply\":{\"source\":\"iana\"},\"application/timestamped-data\":{\"source\":\"iana\",\"extensions\":[\"tsd\"]},\"application/tlsrpt+gzip\":{\"source\":\"iana\"},\"application/tlsrpt+json\":{\"source\":\"iana\",\"compressible\":true},\"application/tnauthlist\":{\"source\":\"iana\"},\"application/trickle-ice-sdpfrag\":{\"source\":\"iana\"},\"application/trig\":{\"source\":\"iana\"},\"application/ttml+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/tve-trigger\":{\"source\":\"iana\"},\"application/ulpfec\":{\"source\":\"iana\"},\"application/urc-grpsheet+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/urc-ressheet+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/urc-targetdesc+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/urc-uisocketdesc+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vcard+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vcard+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vemmi\":{\"source\":\"iana\"},\"application/vividence.scriptfile\":{\"source\":\"apache\"},\"application/vnd.1000minds.decision-model+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp-prose+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp-prose-pc3ch+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp-v2x-local-service-information\":{\"source\":\"iana\"},\"application/vnd.3gpp.access-transfer-events+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.bsf+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.gmop+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.mcdata-payload\":{\"source\":\"iana\"},\"application/vnd.3gpp.mcdata-signalling\":{\"source\":\"iana\"},\"application/vnd.3gpp.mcptt-affiliation-command+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.mcptt-floor-request+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.mcptt-info+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.mcptt-location-info+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.mcptt-mbms-usage-info+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.mcptt-signed+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.mid-call+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.pic-bw-large\":{\"source\":\"iana\",\"extensions\":[\"plb\"]},\"application/vnd.3gpp.pic-bw-small\":{\"source\":\"iana\",\"extensions\":[\"psb\"]},\"application/vnd.3gpp.pic-bw-var\":{\"source\":\"iana\",\"extensions\":[\"pvb\"]},\"application/vnd.3gpp.sms\":{\"source\":\"iana\"},\"application/vnd.3gpp.sms+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.srvcc-ext+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.srvcc-info+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.state-and-event-info+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp.ussd+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp2.bcmcsinfo+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.3gpp2.sms\":{\"source\":\"iana\"},\"application/vnd.3gpp2.tcap\":{\"source\":\"iana\",\"extensions\":[\"tcap\"]},\"application/vnd.3lightssoftware.imagescal\":{\"source\":\"iana\"},\"application/vnd.3m.post-it-notes\":{\"source\":\"iana\",\"extensions\":[\"pwn\"]},\"application/vnd.accpac.simply.aso\":{\"source\":\"iana\",\"extensions\":[\"aso\"]},\"application/vnd.accpac.simply.imp\":{\"source\":\"iana\",\"extensions\":[\"imp\"]},\"application/vnd.acucobol\":{\"source\":\"iana\",\"extensions\":[\"acu\"]},\"application/vnd.acucorp\":{\"source\":\"iana\",\"extensions\":[\"atc\",\"acutc\"]},\"application/vnd.adobe.air-application-installer-package+zip\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"air\"]},\"application/vnd.adobe.flash.movie\":{\"source\":\"iana\"},\"application/vnd.adobe.formscentral.fcdt\":{\"source\":\"iana\",\"extensions\":[\"fcdt\"]},\"application/vnd.adobe.fxp\":{\"source\":\"iana\",\"extensions\":[\"fxp\",\"fxpl\"]},\"application/vnd.adobe.partial-upload\":{\"source\":\"iana\"},\"application/vnd.adobe.xdp+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"xdp\"]},\"application/vnd.adobe.xfdf\":{\"source\":\"iana\",\"extensions\":[\"xfdf\"]},\"application/vnd.aether.imp\":{\"source\":\"iana\"},\"application/vnd.afpc.afplinedata\":{\"source\":\"iana\"},\"application/vnd.afpc.modca\":{\"source\":\"iana\"},\"application/vnd.ah-barcode\":{\"source\":\"iana\"},\"application/vnd.ahead.space\":{\"source\":\"iana\",\"extensions\":[\"ahead\"]},\"application/vnd.airzip.filesecure.azf\":{\"source\":\"iana\",\"extensions\":[\"azf\"]},\"application/vnd.airzip.filesecure.azs\":{\"source\":\"iana\",\"extensions\":[\"azs\"]},\"application/vnd.amadeus+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.amazon.ebook\":{\"source\":\"apache\",\"extensions\":[\"azw\"]},\"application/vnd.amazon.mobi8-ebook\":{\"source\":\"iana\"},\"application/vnd.americandynamics.acc\":{\"source\":\"iana\",\"extensions\":[\"acc\"]},\"application/vnd.amiga.ami\":{\"source\":\"iana\",\"extensions\":[\"ami\"]},\"application/vnd.amundsen.maze+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.android.package-archive\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"apk\"]},\"application/vnd.anki\":{\"source\":\"iana\"},\"application/vnd.anser-web-certificate-issue-initiation\":{\"source\":\"iana\",\"extensions\":[\"cii\"]},\"application/vnd.anser-web-funds-transfer-initiation\":{\"source\":\"apache\",\"extensions\":[\"fti\"]},\"application/vnd.antix.game-component\":{\"source\":\"iana\",\"extensions\":[\"atx\"]},\"application/vnd.apache.thrift.binary\":{\"source\":\"iana\"},\"application/vnd.apache.thrift.compact\":{\"source\":\"iana\"},\"application/vnd.apache.thrift.json\":{\"source\":\"iana\"},\"application/vnd.api+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.apothekende.reservation+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.apple.installer+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"mpkg\"]},\"application/vnd.apple.mpegurl\":{\"source\":\"iana\",\"extensions\":[\"m3u8\"]},\"application/vnd.apple.pkpass\":{\"compressible\":false,\"extensions\":[\"pkpass\"]},\"application/vnd.arastra.swi\":{\"source\":\"iana\"},\"application/vnd.aristanetworks.swi\":{\"source\":\"iana\",\"extensions\":[\"swi\"]},\"application/vnd.artisan+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.artsquare\":{\"source\":\"iana\"},\"application/vnd.astraea-software.iota\":{\"source\":\"iana\",\"extensions\":[\"iota\"]},\"application/vnd.audiograph\":{\"source\":\"iana\",\"extensions\":[\"aep\"]},\"application/vnd.autopackage\":{\"source\":\"iana\"},\"application/vnd.avalon+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.avistar+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.balsamiq.bmml+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.balsamiq.bmpr\":{\"source\":\"iana\"},\"application/vnd.banana-accounting\":{\"source\":\"iana\"},\"application/vnd.bbf.usp.msg\":{\"source\":\"iana\"},\"application/vnd.bbf.usp.msg+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.bekitzur-stech+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.bint.med-content\":{\"source\":\"iana\"},\"application/vnd.biopax.rdf+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.blink-idb-value-wrapper\":{\"source\":\"iana\"},\"application/vnd.blueice.multipass\":{\"source\":\"iana\",\"extensions\":[\"mpm\"]},\"application/vnd.bluetooth.ep.oob\":{\"source\":\"iana\"},\"application/vnd.bluetooth.le.oob\":{\"source\":\"iana\"},\"application/vnd.bmi\":{\"source\":\"iana\",\"extensions\":[\"bmi\"]},\"application/vnd.businessobjects\":{\"source\":\"iana\",\"extensions\":[\"rep\"]},\"application/vnd.byu.uapi+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.cab-jscript\":{\"source\":\"iana\"},\"application/vnd.canon-cpdl\":{\"source\":\"iana\"},\"application/vnd.canon-lips\":{\"source\":\"iana\"},\"application/vnd.capasystems-pg+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.cendio.thinlinc.clientconf\":{\"source\":\"iana\"},\"application/vnd.century-systems.tcp_stream\":{\"source\":\"iana\"},\"application/vnd.chemdraw+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"cdxml\"]},\"application/vnd.chess-pgn\":{\"source\":\"iana\"},\"application/vnd.chipnuts.karaoke-mmd\":{\"source\":\"iana\",\"extensions\":[\"mmd\"]},\"application/vnd.cinderella\":{\"source\":\"iana\",\"extensions\":[\"cdy\"]},\"application/vnd.cirpack.isdn-ext\":{\"source\":\"iana\"},\"application/vnd.citationstyles.style+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"csl\"]},\"application/vnd.claymore\":{\"source\":\"iana\",\"extensions\":[\"cla\"]},\"application/vnd.cloanto.rp9\":{\"source\":\"iana\",\"extensions\":[\"rp9\"]},\"application/vnd.clonk.c4group\":{\"source\":\"iana\",\"extensions\":[\"c4g\",\"c4d\",\"c4f\",\"c4p\",\"c4u\"]},\"application/vnd.cluetrust.cartomobile-config\":{\"source\":\"iana\",\"extensions\":[\"c11amc\"]},\"application/vnd.cluetrust.cartomobile-config-pkg\":{\"source\":\"iana\",\"extensions\":[\"c11amz\"]},\"application/vnd.coffeescript\":{\"source\":\"iana\"},\"application/vnd.collabio.xodocuments.document\":{\"source\":\"iana\"},\"application/vnd.collabio.xodocuments.document-template\":{\"source\":\"iana\"},\"application/vnd.collabio.xodocuments.presentation\":{\"source\":\"iana\"},\"application/vnd.collabio.xodocuments.presentation-template\":{\"source\":\"iana\"},\"application/vnd.collabio.xodocuments.spreadsheet\":{\"source\":\"iana\"},\"application/vnd.collabio.xodocuments.spreadsheet-template\":{\"source\":\"iana\"},\"application/vnd.collection+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.collection.doc+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.collection.next+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.comicbook+zip\":{\"source\":\"iana\",\"compressible\":false},\"application/vnd.comicbook-rar\":{\"source\":\"iana\"},\"application/vnd.commerce-battelle\":{\"source\":\"iana\"},\"application/vnd.commonspace\":{\"source\":\"iana\",\"extensions\":[\"csp\"]},\"application/vnd.contact.cmsg\":{\"source\":\"iana\",\"extensions\":[\"cdbcmsg\"]},\"application/vnd.coreos.ignition+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.cosmocaller\":{\"source\":\"iana\",\"extensions\":[\"cmc\"]},\"application/vnd.crick.clicker\":{\"source\":\"iana\",\"extensions\":[\"clkx\"]},\"application/vnd.crick.clicker.keyboard\":{\"source\":\"iana\",\"extensions\":[\"clkk\"]},\"application/vnd.crick.clicker.palette\":{\"source\":\"iana\",\"extensions\":[\"clkp\"]},\"application/vnd.crick.clicker.template\":{\"source\":\"iana\",\"extensions\":[\"clkt\"]},\"application/vnd.crick.clicker.wordbank\":{\"source\":\"iana\",\"extensions\":[\"clkw\"]},\"application/vnd.criticaltools.wbs+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"wbs\"]},\"application/vnd.ctc-posml\":{\"source\":\"iana\",\"extensions\":[\"pml\"]},\"application/vnd.ctct.ws+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.cups-pdf\":{\"source\":\"iana\"},\"application/vnd.cups-postscript\":{\"source\":\"iana\"},\"application/vnd.cups-ppd\":{\"source\":\"iana\",\"extensions\":[\"ppd\"]},\"application/vnd.cups-raster\":{\"source\":\"iana\"},\"application/vnd.cups-raw\":{\"source\":\"iana\"},\"application/vnd.curl\":{\"source\":\"iana\"},\"application/vnd.curl.car\":{\"source\":\"apache\",\"extensions\":[\"car\"]},\"application/vnd.curl.pcurl\":{\"source\":\"apache\",\"extensions\":[\"pcurl\"]},\"application/vnd.cyan.dean.root+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.cybank\":{\"source\":\"iana\"},\"application/vnd.d2l.coursepackage1p0+zip\":{\"source\":\"iana\",\"compressible\":false},\"application/vnd.dart\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"dart\"]},\"application/vnd.data-vision.rdz\":{\"source\":\"iana\",\"extensions\":[\"rdz\"]},\"application/vnd.datapackage+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.dataresource+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.debian.binary-package\":{\"source\":\"iana\"},\"application/vnd.dece.data\":{\"source\":\"iana\",\"extensions\":[\"uvf\",\"uvvf\",\"uvd\",\"uvvd\"]},\"application/vnd.dece.ttml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"uvt\",\"uvvt\"]},\"application/vnd.dece.unspecified\":{\"source\":\"iana\",\"extensions\":[\"uvx\",\"uvvx\"]},\"application/vnd.dece.zip\":{\"source\":\"iana\",\"extensions\":[\"uvz\",\"uvvz\"]},\"application/vnd.denovo.fcselayout-link\":{\"source\":\"iana\",\"extensions\":[\"fe_launch\"]},\"application/vnd.desmume-movie\":{\"source\":\"iana\"},\"application/vnd.desmume.movie\":{\"source\":\"apache\"},\"application/vnd.dir-bi.plate-dl-nosuffix\":{\"source\":\"iana\"},\"application/vnd.dm.delegation+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.dna\":{\"source\":\"iana\",\"extensions\":[\"dna\"]},\"application/vnd.document+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.dolby.mlp\":{\"source\":\"apache\",\"extensions\":[\"mlp\"]},\"application/vnd.dolby.mobile.1\":{\"source\":\"iana\"},\"application/vnd.dolby.mobile.2\":{\"source\":\"iana\"},\"application/vnd.doremir.scorecloud-binary-document\":{\"source\":\"iana\"},\"application/vnd.dpgraph\":{\"source\":\"iana\",\"extensions\":[\"dpg\"]},\"application/vnd.dreamfactory\":{\"source\":\"iana\",\"extensions\":[\"dfac\"]},\"application/vnd.drive+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.ds-keypoint\":{\"source\":\"apache\",\"extensions\":[\"kpxx\"]},\"application/vnd.dtg.local\":{\"source\":\"iana\"},\"application/vnd.dtg.local.flash\":{\"source\":\"iana\"},\"application/vnd.dtg.local.html\":{\"source\":\"iana\"},\"application/vnd.dvb.ait\":{\"source\":\"iana\",\"extensions\":[\"ait\"]},\"application/vnd.dvb.dvbj\":{\"source\":\"iana\"},\"application/vnd.dvb.esgcontainer\":{\"source\":\"iana\"},\"application/vnd.dvb.ipdcdftnotifaccess\":{\"source\":\"iana\"},\"application/vnd.dvb.ipdcesgaccess\":{\"source\":\"iana\"},\"application/vnd.dvb.ipdcesgaccess2\":{\"source\":\"iana\"},\"application/vnd.dvb.ipdcesgpdd\":{\"source\":\"iana\"},\"application/vnd.dvb.ipdcroaming\":{\"source\":\"iana\"},\"application/vnd.dvb.iptv.alfec-base\":{\"source\":\"iana\"},\"application/vnd.dvb.iptv.alfec-enhancement\":{\"source\":\"iana\"},\"application/vnd.dvb.notif-aggregate-root+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.dvb.notif-container+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.dvb.notif-generic+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.dvb.notif-ia-msglist+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.dvb.notif-ia-registration-request+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.dvb.notif-ia-registration-response+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.dvb.notif-init+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.dvb.pfr\":{\"source\":\"iana\"},\"application/vnd.dvb.service\":{\"source\":\"iana\",\"extensions\":[\"svc\"]},\"application/vnd.dxr\":{\"source\":\"iana\"},\"application/vnd.dynageo\":{\"source\":\"iana\",\"extensions\":[\"geo\"]},\"application/vnd.dzr\":{\"source\":\"iana\"},\"application/vnd.easykaraoke.cdgdownload\":{\"source\":\"iana\"},\"application/vnd.ecdis-update\":{\"source\":\"iana\"},\"application/vnd.ecip.rlp\":{\"source\":\"iana\"},\"application/vnd.ecowin.chart\":{\"source\":\"iana\",\"extensions\":[\"mag\"]},\"application/vnd.ecowin.filerequest\":{\"source\":\"iana\"},\"application/vnd.ecowin.fileupdate\":{\"source\":\"iana\"},\"application/vnd.ecowin.series\":{\"source\":\"iana\"},\"application/vnd.ecowin.seriesrequest\":{\"source\":\"iana\"},\"application/vnd.ecowin.seriesupdate\":{\"source\":\"iana\"},\"application/vnd.efi.img\":{\"source\":\"iana\"},\"application/vnd.efi.iso\":{\"source\":\"iana\"},\"application/vnd.emclient.accessrequest+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.enliven\":{\"source\":\"iana\",\"extensions\":[\"nml\"]},\"application/vnd.enphase.envoy\":{\"source\":\"iana\"},\"application/vnd.eprints.data+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.epson.esf\":{\"source\":\"iana\",\"extensions\":[\"esf\"]},\"application/vnd.epson.msf\":{\"source\":\"iana\",\"extensions\":[\"msf\"]},\"application/vnd.epson.quickanime\":{\"source\":\"iana\",\"extensions\":[\"qam\"]},\"application/vnd.epson.salt\":{\"source\":\"iana\",\"extensions\":[\"slt\"]},\"application/vnd.epson.ssf\":{\"source\":\"iana\",\"extensions\":[\"ssf\"]},\"application/vnd.ericsson.quickcall\":{\"source\":\"iana\"},\"application/vnd.espass-espass+zip\":{\"source\":\"iana\",\"compressible\":false},\"application/vnd.eszigno3+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"es3\",\"et3\"]},\"application/vnd.etsi.aoc+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.asic-e+zip\":{\"source\":\"iana\",\"compressible\":false},\"application/vnd.etsi.asic-s+zip\":{\"source\":\"iana\",\"compressible\":false},\"application/vnd.etsi.cug+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.iptvcommand+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.iptvdiscovery+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.iptvprofile+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.iptvsad-bc+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.iptvsad-cod+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.iptvsad-npvr+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.iptvservice+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.iptvsync+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.iptvueprofile+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.mcid+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.mheg5\":{\"source\":\"iana\"},\"application/vnd.etsi.overload-control-policy-dataset+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.pstn+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.sci+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.simservs+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.timestamp-token\":{\"source\":\"iana\"},\"application/vnd.etsi.tsl+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.etsi.tsl.der\":{\"source\":\"iana\"},\"application/vnd.eudora.data\":{\"source\":\"iana\"},\"application/vnd.evolv.ecig.profile\":{\"source\":\"iana\"},\"application/vnd.evolv.ecig.settings\":{\"source\":\"iana\"},\"application/vnd.evolv.ecig.theme\":{\"source\":\"iana\"},\"application/vnd.ezpix-album\":{\"source\":\"iana\",\"extensions\":[\"ez2\"]},\"application/vnd.ezpix-package\":{\"source\":\"iana\",\"extensions\":[\"ez3\"]},\"application/vnd.f-secure.mobile\":{\"source\":\"iana\"},\"application/vnd.fastcopy-disk-image\":{\"source\":\"iana\"},\"application/vnd.fdf\":{\"source\":\"iana\",\"extensions\":[\"fdf\"]},\"application/vnd.fdsn.mseed\":{\"source\":\"iana\",\"extensions\":[\"mseed\"]},\"application/vnd.fdsn.seed\":{\"source\":\"iana\",\"extensions\":[\"seed\",\"dataless\"]},\"application/vnd.ffsns\":{\"source\":\"iana\"},\"application/vnd.filmit.zfc\":{\"source\":\"iana\"},\"application/vnd.fints\":{\"source\":\"iana\"},\"application/vnd.firemonkeys.cloudcell\":{\"source\":\"iana\"},\"application/vnd.flographit\":{\"source\":\"iana\",\"extensions\":[\"gph\"]},\"application/vnd.fluxtime.clip\":{\"source\":\"iana\",\"extensions\":[\"ftc\"]},\"application/vnd.font-fontforge-sfd\":{\"source\":\"iana\"},\"application/vnd.framemaker\":{\"source\":\"iana\",\"extensions\":[\"fm\",\"frame\",\"maker\",\"book\"]},\"application/vnd.frogans.fnc\":{\"source\":\"iana\",\"extensions\":[\"fnc\"]},\"application/vnd.frogans.ltf\":{\"source\":\"iana\",\"extensions\":[\"ltf\"]},\"application/vnd.fsc.weblaunch\":{\"source\":\"iana\",\"extensions\":[\"fsc\"]},\"application/vnd.fujitsu.oasys\":{\"source\":\"iana\",\"extensions\":[\"oas\"]},\"application/vnd.fujitsu.oasys2\":{\"source\":\"iana\",\"extensions\":[\"oa2\"]},\"application/vnd.fujitsu.oasys3\":{\"source\":\"iana\",\"extensions\":[\"oa3\"]},\"application/vnd.fujitsu.oasysgp\":{\"source\":\"iana\",\"extensions\":[\"fg5\"]},\"application/vnd.fujitsu.oasysprs\":{\"source\":\"iana\",\"extensions\":[\"bh2\"]},\"application/vnd.fujixerox.art-ex\":{\"source\":\"iana\"},\"application/vnd.fujixerox.art4\":{\"source\":\"iana\"},\"application/vnd.fujixerox.ddd\":{\"source\":\"iana\",\"extensions\":[\"ddd\"]},\"application/vnd.fujixerox.docuworks\":{\"source\":\"iana\",\"extensions\":[\"xdw\"]},\"application/vnd.fujixerox.docuworks.binder\":{\"source\":\"iana\",\"extensions\":[\"xbd\"]},\"application/vnd.fujixerox.docuworks.container\":{\"source\":\"iana\"},\"application/vnd.fujixerox.hbpl\":{\"source\":\"iana\"},\"application/vnd.fut-misnet\":{\"source\":\"iana\"},\"application/vnd.fuzzysheet\":{\"source\":\"iana\",\"extensions\":[\"fzs\"]},\"application/vnd.genomatix.tuxedo\":{\"source\":\"iana\",\"extensions\":[\"txd\"]},\"application/vnd.geo+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.geocube+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.geogebra.file\":{\"source\":\"iana\",\"extensions\":[\"ggb\"]},\"application/vnd.geogebra.tool\":{\"source\":\"iana\",\"extensions\":[\"ggt\"]},\"application/vnd.geometry-explorer\":{\"source\":\"iana\",\"extensions\":[\"gex\",\"gre\"]},\"application/vnd.geonext\":{\"source\":\"iana\",\"extensions\":[\"gxt\"]},\"application/vnd.geoplan\":{\"source\":\"iana\",\"extensions\":[\"g2w\"]},\"application/vnd.geospace\":{\"source\":\"iana\",\"extensions\":[\"g3w\"]},\"application/vnd.gerber\":{\"source\":\"iana\"},\"application/vnd.globalplatform.card-content-mgt\":{\"source\":\"iana\"},\"application/vnd.globalplatform.card-content-mgt-response\":{\"source\":\"iana\"},\"application/vnd.gmx\":{\"source\":\"iana\",\"extensions\":[\"gmx\"]},\"application/vnd.google-apps.document\":{\"compressible\":false,\"extensions\":[\"gdoc\"]},\"application/vnd.google-apps.presentation\":{\"compressible\":false,\"extensions\":[\"gslides\"]},\"application/vnd.google-apps.spreadsheet\":{\"compressible\":false,\"extensions\":[\"gsheet\"]},\"application/vnd.google-earth.kml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"kml\"]},\"application/vnd.google-earth.kmz\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"kmz\"]},\"application/vnd.gov.sk.e-form+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.gov.sk.e-form+zip\":{\"source\":\"iana\",\"compressible\":false},\"application/vnd.gov.sk.xmldatacontainer+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.grafeq\":{\"source\":\"iana\",\"extensions\":[\"gqf\",\"gqs\"]},\"application/vnd.gridmp\":{\"source\":\"iana\"},\"application/vnd.groove-account\":{\"source\":\"iana\",\"extensions\":[\"gac\"]},\"application/vnd.groove-help\":{\"source\":\"iana\",\"extensions\":[\"ghf\"]},\"application/vnd.groove-identity-message\":{\"source\":\"iana\",\"extensions\":[\"gim\"]},\"application/vnd.groove-injector\":{\"source\":\"iana\",\"extensions\":[\"grv\"]},\"application/vnd.groove-tool-message\":{\"source\":\"iana\",\"extensions\":[\"gtm\"]},\"application/vnd.groove-tool-template\":{\"source\":\"iana\",\"extensions\":[\"tpl\"]},\"application/vnd.groove-vcard\":{\"source\":\"iana\",\"extensions\":[\"vcg\"]},\"application/vnd.hal+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.hal+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"hal\"]},\"application/vnd.handheld-entertainment+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"zmm\"]},\"application/vnd.hbci\":{\"source\":\"iana\",\"extensions\":[\"hbci\"]},\"application/vnd.hc+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.hcl-bireports\":{\"source\":\"iana\"},\"application/vnd.hdt\":{\"source\":\"iana\"},\"application/vnd.heroku+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.hhe.lesson-player\":{\"source\":\"iana\",\"extensions\":[\"les\"]},\"application/vnd.hp-hpgl\":{\"source\":\"iana\",\"extensions\":[\"hpgl\"]},\"application/vnd.hp-hpid\":{\"source\":\"iana\",\"extensions\":[\"hpid\"]},\"application/vnd.hp-hps\":{\"source\":\"iana\",\"extensions\":[\"hps\"]},\"application/vnd.hp-jlyt\":{\"source\":\"iana\",\"extensions\":[\"jlt\"]},\"application/vnd.hp-pcl\":{\"source\":\"iana\",\"extensions\":[\"pcl\"]},\"application/vnd.hp-pclxl\":{\"source\":\"iana\",\"extensions\":[\"pclxl\"]},\"application/vnd.httphone\":{\"source\":\"iana\"},\"application/vnd.hydrostatix.sof-data\":{\"source\":\"iana\",\"extensions\":[\"sfd-hdstx\"]},\"application/vnd.hyper+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.hyper-item+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.hyperdrive+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.hzn-3d-crossword\":{\"source\":\"iana\"},\"application/vnd.ibm.afplinedata\":{\"source\":\"iana\"},\"application/vnd.ibm.electronic-media\":{\"source\":\"iana\"},\"application/vnd.ibm.minipay\":{\"source\":\"iana\",\"extensions\":[\"mpy\"]},\"application/vnd.ibm.modcap\":{\"source\":\"iana\",\"extensions\":[\"afp\",\"listafp\",\"list3820\"]},\"application/vnd.ibm.rights-management\":{\"source\":\"iana\",\"extensions\":[\"irm\"]},\"application/vnd.ibm.secure-container\":{\"source\":\"iana\",\"extensions\":[\"sc\"]},\"application/vnd.iccprofile\":{\"source\":\"iana\",\"extensions\":[\"icc\",\"icm\"]},\"application/vnd.ieee.1905\":{\"source\":\"iana\"},\"application/vnd.igloader\":{\"source\":\"iana\",\"extensions\":[\"igl\"]},\"application/vnd.imagemeter.folder+zip\":{\"source\":\"iana\",\"compressible\":false},\"application/vnd.imagemeter.image+zip\":{\"source\":\"iana\",\"compressible\":false},\"application/vnd.immervision-ivp\":{\"source\":\"iana\",\"extensions\":[\"ivp\"]},\"application/vnd.immervision-ivu\":{\"source\":\"iana\",\"extensions\":[\"ivu\"]},\"application/vnd.ims.imsccv1p1\":{\"source\":\"iana\"},\"application/vnd.ims.imsccv1p2\":{\"source\":\"iana\"},\"application/vnd.ims.imsccv1p3\":{\"source\":\"iana\"},\"application/vnd.ims.lis.v2.result+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.ims.lti.v2.toolconsumerprofile+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.ims.lti.v2.toolproxy+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.ims.lti.v2.toolproxy.id+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.ims.lti.v2.toolsettings+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.ims.lti.v2.toolsettings.simple+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.informedcontrol.rms+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.informix-visionary\":{\"source\":\"iana\"},\"application/vnd.infotech.project\":{\"source\":\"iana\"},\"application/vnd.infotech.project+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.innopath.wamp.notification\":{\"source\":\"iana\"},\"application/vnd.insors.igm\":{\"source\":\"iana\",\"extensions\":[\"igm\"]},\"application/vnd.intercon.formnet\":{\"source\":\"iana\",\"extensions\":[\"xpw\",\"xpx\"]},\"application/vnd.intergeo\":{\"source\":\"iana\",\"extensions\":[\"i2g\"]},\"application/vnd.intertrust.digibox\":{\"source\":\"iana\"},\"application/vnd.intertrust.nncp\":{\"source\":\"iana\"},\"application/vnd.intu.qbo\":{\"source\":\"iana\",\"extensions\":[\"qbo\"]},\"application/vnd.intu.qfx\":{\"source\":\"iana\",\"extensions\":[\"qfx\"]},\"application/vnd.iptc.g2.catalogitem+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.iptc.g2.conceptitem+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.iptc.g2.knowledgeitem+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.iptc.g2.newsitem+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.iptc.g2.newsmessage+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.iptc.g2.packageitem+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.iptc.g2.planningitem+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.ipunplugged.rcprofile\":{\"source\":\"iana\",\"extensions\":[\"rcprofile\"]},\"application/vnd.irepository.package+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"irp\"]},\"application/vnd.is-xpr\":{\"source\":\"iana\",\"extensions\":[\"xpr\"]},\"application/vnd.isac.fcs\":{\"source\":\"iana\",\"extensions\":[\"fcs\"]},\"application/vnd.jam\":{\"source\":\"iana\",\"extensions\":[\"jam\"]},\"application/vnd.japannet-directory-service\":{\"source\":\"iana\"},\"application/vnd.japannet-jpnstore-wakeup\":{\"source\":\"iana\"},\"application/vnd.japannet-payment-wakeup\":{\"source\":\"iana\"},\"application/vnd.japannet-registration\":{\"source\":\"iana\"},\"application/vnd.japannet-registration-wakeup\":{\"source\":\"iana\"},\"application/vnd.japannet-setstore-wakeup\":{\"source\":\"iana\"},\"application/vnd.japannet-verification\":{\"source\":\"iana\"},\"application/vnd.japannet-verification-wakeup\":{\"source\":\"iana\"},\"application/vnd.jcp.javame.midlet-rms\":{\"source\":\"iana\",\"extensions\":[\"rms\"]},\"application/vnd.jisp\":{\"source\":\"iana\",\"extensions\":[\"jisp\"]},\"application/vnd.joost.joda-archive\":{\"source\":\"iana\",\"extensions\":[\"joda\"]},\"application/vnd.jsk.isdn-ngn\":{\"source\":\"iana\"},\"application/vnd.kahootz\":{\"source\":\"iana\",\"extensions\":[\"ktz\",\"ktr\"]},\"application/vnd.kde.karbon\":{\"source\":\"iana\",\"extensions\":[\"karbon\"]},\"application/vnd.kde.kchart\":{\"source\":\"iana\",\"extensions\":[\"chrt\"]},\"application/vnd.kde.kformula\":{\"source\":\"iana\",\"extensions\":[\"kfo\"]},\"application/vnd.kde.kivio\":{\"source\":\"iana\",\"extensions\":[\"flw\"]},\"application/vnd.kde.kontour\":{\"source\":\"iana\",\"extensions\":[\"kon\"]},\"application/vnd.kde.kpresenter\":{\"source\":\"iana\",\"extensions\":[\"kpr\",\"kpt\"]},\"application/vnd.kde.kspread\":{\"source\":\"iana\",\"extensions\":[\"ksp\"]},\"application/vnd.kde.kword\":{\"source\":\"iana\",\"extensions\":[\"kwd\",\"kwt\"]},\"application/vnd.kenameaapp\":{\"source\":\"iana\",\"extensions\":[\"htke\"]},\"application/vnd.kidspiration\":{\"source\":\"iana\",\"extensions\":[\"kia\"]},\"application/vnd.kinar\":{\"source\":\"iana\",\"extensions\":[\"kne\",\"knp\"]},\"application/vnd.koan\":{\"source\":\"iana\",\"extensions\":[\"skp\",\"skd\",\"skt\",\"skm\"]},\"application/vnd.kodak-descriptor\":{\"source\":\"iana\",\"extensions\":[\"sse\"]},\"application/vnd.las.las+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.las.las+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"lasxml\"]},\"application/vnd.leap+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.liberty-request+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.llamagraphics.life-balance.desktop\":{\"source\":\"iana\",\"extensions\":[\"lbd\"]},\"application/vnd.llamagraphics.life-balance.exchange+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"lbe\"]},\"application/vnd.lotus-1-2-3\":{\"source\":\"iana\",\"extensions\":[\"123\"]},\"application/vnd.lotus-approach\":{\"source\":\"iana\",\"extensions\":[\"apr\"]},\"application/vnd.lotus-freelance\":{\"source\":\"iana\",\"extensions\":[\"pre\"]},\"application/vnd.lotus-notes\":{\"source\":\"iana\",\"extensions\":[\"nsf\"]},\"application/vnd.lotus-organizer\":{\"source\":\"iana\",\"extensions\":[\"org\"]},\"application/vnd.lotus-screencam\":{\"source\":\"iana\",\"extensions\":[\"scm\"]},\"application/vnd.lotus-wordpro\":{\"source\":\"iana\",\"extensions\":[\"lwp\"]},\"application/vnd.macports.portpkg\":{\"source\":\"iana\",\"extensions\":[\"portpkg\"]},\"application/vnd.mapbox-vector-tile\":{\"source\":\"iana\"},\"application/vnd.marlin.drm.actiontoken+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.marlin.drm.conftoken+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.marlin.drm.license+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.marlin.drm.mdcf\":{\"source\":\"iana\"},\"application/vnd.mason+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.maxmind.maxmind-db\":{\"source\":\"iana\"},\"application/vnd.mcd\":{\"source\":\"iana\",\"extensions\":[\"mcd\"]},\"application/vnd.medcalcdata\":{\"source\":\"iana\",\"extensions\":[\"mc1\"]},\"application/vnd.mediastation.cdkey\":{\"source\":\"iana\",\"extensions\":[\"cdkey\"]},\"application/vnd.meridian-slingshot\":{\"source\":\"iana\"},\"application/vnd.mfer\":{\"source\":\"iana\",\"extensions\":[\"mwf\"]},\"application/vnd.mfmp\":{\"source\":\"iana\",\"extensions\":[\"mfm\"]},\"application/vnd.micro+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.micrografx.flo\":{\"source\":\"iana\",\"extensions\":[\"flo\"]},\"application/vnd.micrografx.igx\":{\"source\":\"iana\",\"extensions\":[\"igx\"]},\"application/vnd.microsoft.portable-executable\":{\"source\":\"iana\"},\"application/vnd.microsoft.windows.thumbnail-cache\":{\"source\":\"iana\"},\"application/vnd.miele+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.mif\":{\"source\":\"iana\",\"extensions\":[\"mif\"]},\"application/vnd.minisoft-hp3000-save\":{\"source\":\"iana\"},\"application/vnd.mitsubishi.misty-guard.trustweb\":{\"source\":\"iana\"},\"application/vnd.mobius.daf\":{\"source\":\"iana\",\"extensions\":[\"daf\"]},\"application/vnd.mobius.dis\":{\"source\":\"iana\",\"extensions\":[\"dis\"]},\"application/vnd.mobius.mbk\":{\"source\":\"iana\",\"extensions\":[\"mbk\"]},\"application/vnd.mobius.mqy\":{\"source\":\"iana\",\"extensions\":[\"mqy\"]},\"application/vnd.mobius.msl\":{\"source\":\"iana\",\"extensions\":[\"msl\"]},\"application/vnd.mobius.plc\":{\"source\":\"iana\",\"extensions\":[\"plc\"]},\"application/vnd.mobius.txf\":{\"source\":\"iana\",\"extensions\":[\"txf\"]},\"application/vnd.mophun.application\":{\"source\":\"iana\",\"extensions\":[\"mpn\"]},\"application/vnd.mophun.certificate\":{\"source\":\"iana\",\"extensions\":[\"mpc\"]},\"application/vnd.motorola.flexsuite\":{\"source\":\"iana\"},\"application/vnd.motorola.flexsuite.adsi\":{\"source\":\"iana\"},\"application/vnd.motorola.flexsuite.fis\":{\"source\":\"iana\"},\"application/vnd.motorola.flexsuite.gotap\":{\"source\":\"iana\"},\"application/vnd.motorola.flexsuite.kmr\":{\"source\":\"iana\"},\"application/vnd.motorola.flexsuite.ttc\":{\"source\":\"iana\"},\"application/vnd.motorola.flexsuite.wem\":{\"source\":\"iana\"},\"application/vnd.motorola.iprm\":{\"source\":\"iana\"},\"application/vnd.mozilla.xul+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"xul\"]},\"application/vnd.ms-3mfdocument\":{\"source\":\"iana\"},\"application/vnd.ms-artgalry\":{\"source\":\"iana\",\"extensions\":[\"cil\"]},\"application/vnd.ms-asf\":{\"source\":\"iana\"},\"application/vnd.ms-cab-compressed\":{\"source\":\"iana\",\"extensions\":[\"cab\"]},\"application/vnd.ms-color.iccprofile\":{\"source\":\"apache\"},\"application/vnd.ms-excel\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"xls\",\"xlm\",\"xla\",\"xlc\",\"xlt\",\"xlw\"]},\"application/vnd.ms-excel.addin.macroenabled.12\":{\"source\":\"iana\",\"extensions\":[\"xlam\"]},\"application/vnd.ms-excel.sheet.binary.macroenabled.12\":{\"source\":\"iana\",\"extensions\":[\"xlsb\"]},\"application/vnd.ms-excel.sheet.macroenabled.12\":{\"source\":\"iana\",\"extensions\":[\"xlsm\"]},\"application/vnd.ms-excel.template.macroenabled.12\":{\"source\":\"iana\",\"extensions\":[\"xltm\"]},\"application/vnd.ms-fontobject\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"eot\"]},\"application/vnd.ms-htmlhelp\":{\"source\":\"iana\",\"extensions\":[\"chm\"]},\"application/vnd.ms-ims\":{\"source\":\"iana\",\"extensions\":[\"ims\"]},\"application/vnd.ms-lrm\":{\"source\":\"iana\",\"extensions\":[\"lrm\"]},\"application/vnd.ms-office.activex+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.ms-officetheme\":{\"source\":\"iana\",\"extensions\":[\"thmx\"]},\"application/vnd.ms-opentype\":{\"source\":\"apache\",\"compressible\":true},\"application/vnd.ms-outlook\":{\"compressible\":false,\"extensions\":[\"msg\"]},\"application/vnd.ms-package.obfuscated-opentype\":{\"source\":\"apache\"},\"application/vnd.ms-pki.seccat\":{\"source\":\"apache\",\"extensions\":[\"cat\"]},\"application/vnd.ms-pki.stl\":{\"source\":\"apache\",\"extensions\":[\"stl\"]},\"application/vnd.ms-playready.initiator+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.ms-powerpoint\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"ppt\",\"pps\",\"pot\"]},\"application/vnd.ms-powerpoint.addin.macroenabled.12\":{\"source\":\"iana\",\"extensions\":[\"ppam\"]},\"application/vnd.ms-powerpoint.presentation.macroenabled.12\":{\"source\":\"iana\",\"extensions\":[\"pptm\"]},\"application/vnd.ms-powerpoint.slide.macroenabled.12\":{\"source\":\"iana\",\"extensions\":[\"sldm\"]},\"application/vnd.ms-powerpoint.slideshow.macroenabled.12\":{\"source\":\"iana\",\"extensions\":[\"ppsm\"]},\"application/vnd.ms-powerpoint.template.macroenabled.12\":{\"source\":\"iana\",\"extensions\":[\"potm\"]},\"application/vnd.ms-printdevicecapabilities+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.ms-printing.printticket+xml\":{\"source\":\"apache\",\"compressible\":true},\"application/vnd.ms-printschematicket+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.ms-project\":{\"source\":\"iana\",\"extensions\":[\"mpp\",\"mpt\"]},\"application/vnd.ms-tnef\":{\"source\":\"iana\"},\"application/vnd.ms-windows.devicepairing\":{\"source\":\"iana\"},\"application/vnd.ms-windows.nwprinting.oob\":{\"source\":\"iana\"},\"application/vnd.ms-windows.printerpairing\":{\"source\":\"iana\"},\"application/vnd.ms-windows.wsd.oob\":{\"source\":\"iana\"},\"application/vnd.ms-wmdrm.lic-chlg-req\":{\"source\":\"iana\"},\"application/vnd.ms-wmdrm.lic-resp\":{\"source\":\"iana\"},\"application/vnd.ms-wmdrm.meter-chlg-req\":{\"source\":\"iana\"},\"application/vnd.ms-wmdrm.meter-resp\":{\"source\":\"iana\"},\"application/vnd.ms-word.document.macroenabled.12\":{\"source\":\"iana\",\"extensions\":[\"docm\"]},\"application/vnd.ms-word.template.macroenabled.12\":{\"source\":\"iana\",\"extensions\":[\"dotm\"]},\"application/vnd.ms-works\":{\"source\":\"iana\",\"extensions\":[\"wps\",\"wks\",\"wcm\",\"wdb\"]},\"application/vnd.ms-wpl\":{\"source\":\"iana\",\"extensions\":[\"wpl\"]},\"application/vnd.ms-xpsdocument\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"xps\"]},\"application/vnd.msa-disk-image\":{\"source\":\"iana\"},\"application/vnd.mseq\":{\"source\":\"iana\",\"extensions\":[\"mseq\"]},\"application/vnd.msign\":{\"source\":\"iana\"},\"application/vnd.multiad.creator\":{\"source\":\"iana\"},\"application/vnd.multiad.creator.cif\":{\"source\":\"iana\"},\"application/vnd.music-niff\":{\"source\":\"iana\"},\"application/vnd.musician\":{\"source\":\"iana\",\"extensions\":[\"mus\"]},\"application/vnd.muvee.style\":{\"source\":\"iana\",\"extensions\":[\"msty\"]},\"application/vnd.mynfc\":{\"source\":\"iana\",\"extensions\":[\"taglet\"]},\"application/vnd.ncd.control\":{\"source\":\"iana\"},\"application/vnd.ncd.reference\":{\"source\":\"iana\"},\"application/vnd.nearst.inv+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.nervana\":{\"source\":\"iana\"},\"application/vnd.netfpx\":{\"source\":\"iana\"},\"application/vnd.neurolanguage.nlu\":{\"source\":\"iana\",\"extensions\":[\"nlu\"]},\"application/vnd.nimn\":{\"source\":\"iana\"},\"application/vnd.nintendo.nitro.rom\":{\"source\":\"iana\"},\"application/vnd.nintendo.snes.rom\":{\"source\":\"iana\"},\"application/vnd.nitf\":{\"source\":\"iana\",\"extensions\":[\"ntf\",\"nitf\"]},\"application/vnd.noblenet-directory\":{\"source\":\"iana\",\"extensions\":[\"nnd\"]},\"application/vnd.noblenet-sealer\":{\"source\":\"iana\",\"extensions\":[\"nns\"]},\"application/vnd.noblenet-web\":{\"source\":\"iana\",\"extensions\":[\"nnw\"]},\"application/vnd.nokia.catalogs\":{\"source\":\"iana\"},\"application/vnd.nokia.conml+wbxml\":{\"source\":\"iana\"},\"application/vnd.nokia.conml+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.nokia.iptv.config+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.nokia.isds-radio-presets\":{\"source\":\"iana\"},\"application/vnd.nokia.landmark+wbxml\":{\"source\":\"iana\"},\"application/vnd.nokia.landmark+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.nokia.landmarkcollection+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.nokia.n-gage.ac+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.nokia.n-gage.data\":{\"source\":\"iana\",\"extensions\":[\"ngdat\"]},\"application/vnd.nokia.n-gage.symbian.install\":{\"source\":\"iana\",\"extensions\":[\"n-gage\"]},\"application/vnd.nokia.ncd\":{\"source\":\"iana\"},\"application/vnd.nokia.pcd+wbxml\":{\"source\":\"iana\"},\"application/vnd.nokia.pcd+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.nokia.radio-preset\":{\"source\":\"iana\",\"extensions\":[\"rpst\"]},\"application/vnd.nokia.radio-presets\":{\"source\":\"iana\",\"extensions\":[\"rpss\"]},\"application/vnd.novadigm.edm\":{\"source\":\"iana\",\"extensions\":[\"edm\"]},\"application/vnd.novadigm.edx\":{\"source\":\"iana\",\"extensions\":[\"edx\"]},\"application/vnd.novadigm.ext\":{\"source\":\"iana\",\"extensions\":[\"ext\"]},\"application/vnd.ntt-local.content-share\":{\"source\":\"iana\"},\"application/vnd.ntt-local.file-transfer\":{\"source\":\"iana\"},\"application/vnd.ntt-local.ogw_remote-access\":{\"source\":\"iana\"},\"application/vnd.ntt-local.sip-ta_remote\":{\"source\":\"iana\"},\"application/vnd.ntt-local.sip-ta_tcp_stream\":{\"source\":\"iana\"},\"application/vnd.oasis.opendocument.chart\":{\"source\":\"iana\",\"extensions\":[\"odc\"]},\"application/vnd.oasis.opendocument.chart-template\":{\"source\":\"iana\",\"extensions\":[\"otc\"]},\"application/vnd.oasis.opendocument.database\":{\"source\":\"iana\",\"extensions\":[\"odb\"]},\"application/vnd.oasis.opendocument.formula\":{\"source\":\"iana\",\"extensions\":[\"odf\"]},\"application/vnd.oasis.opendocument.formula-template\":{\"source\":\"iana\",\"extensions\":[\"odft\"]},\"application/vnd.oasis.opendocument.graphics\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"odg\"]},\"application/vnd.oasis.opendocument.graphics-template\":{\"source\":\"iana\",\"extensions\":[\"otg\"]},\"application/vnd.oasis.opendocument.image\":{\"source\":\"iana\",\"extensions\":[\"odi\"]},\"application/vnd.oasis.opendocument.image-template\":{\"source\":\"iana\",\"extensions\":[\"oti\"]},\"application/vnd.oasis.opendocument.presentation\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"odp\"]},\"application/vnd.oasis.opendocument.presentation-template\":{\"source\":\"iana\",\"extensions\":[\"otp\"]},\"application/vnd.oasis.opendocument.spreadsheet\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"ods\"]},\"application/vnd.oasis.opendocument.spreadsheet-template\":{\"source\":\"iana\",\"extensions\":[\"ots\"]},\"application/vnd.oasis.opendocument.text\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"odt\"]},\"application/vnd.oasis.opendocument.text-master\":{\"source\":\"iana\",\"extensions\":[\"odm\"]},\"application/vnd.oasis.opendocument.text-template\":{\"source\":\"iana\",\"extensions\":[\"ott\"]},\"application/vnd.oasis.opendocument.text-web\":{\"source\":\"iana\",\"extensions\":[\"oth\"]},\"application/vnd.obn\":{\"source\":\"iana\"},\"application/vnd.ocf+cbor\":{\"source\":\"iana\"},\"application/vnd.oftn.l10n+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oipf.contentaccessdownload+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oipf.contentaccessstreaming+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oipf.cspg-hexbinary\":{\"source\":\"iana\"},\"application/vnd.oipf.dae.svg+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oipf.dae.xhtml+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oipf.mippvcontrolmessage+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oipf.pae.gem\":{\"source\":\"iana\"},\"application/vnd.oipf.spdiscovery+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oipf.spdlist+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oipf.ueprofile+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oipf.userprofile+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.olpc-sugar\":{\"source\":\"iana\",\"extensions\":[\"xo\"]},\"application/vnd.oma-scws-config\":{\"source\":\"iana\"},\"application/vnd.oma-scws-http-request\":{\"source\":\"iana\"},\"application/vnd.oma-scws-http-response\":{\"source\":\"iana\"},\"application/vnd.oma.bcast.associated-procedure-parameter+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.bcast.drm-trigger+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.bcast.imd+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.bcast.ltkm\":{\"source\":\"iana\"},\"application/vnd.oma.bcast.notification+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.bcast.provisioningtrigger\":{\"source\":\"iana\"},\"application/vnd.oma.bcast.sgboot\":{\"source\":\"iana\"},\"application/vnd.oma.bcast.sgdd+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.bcast.sgdu\":{\"source\":\"iana\"},\"application/vnd.oma.bcast.simple-symbol-container\":{\"source\":\"iana\"},\"application/vnd.oma.bcast.smartcard-trigger+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.bcast.sprov+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.bcast.stkm\":{\"source\":\"iana\"},\"application/vnd.oma.cab-address-book+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.cab-feature-handler+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.cab-pcc+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.cab-subs-invite+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.cab-user-prefs+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.dcd\":{\"source\":\"iana\"},\"application/vnd.oma.dcdc\":{\"source\":\"iana\"},\"application/vnd.oma.dd2+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"dd2\"]},\"application/vnd.oma.drm.risd+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.group-usage-list+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.lwm2m+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.lwm2m+tlv\":{\"source\":\"iana\"},\"application/vnd.oma.pal+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.poc.detailed-progress-report+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.poc.final-report+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.poc.groups+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.poc.invocation-descriptor+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.poc.optimized-progress-report+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.push\":{\"source\":\"iana\"},\"application/vnd.oma.scidm.messages+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oma.xcap-directory+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.omads-email+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.omads-file+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.omads-folder+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.omaloc-supl-init\":{\"source\":\"iana\"},\"application/vnd.onepager\":{\"source\":\"iana\"},\"application/vnd.onepagertamp\":{\"source\":\"iana\"},\"application/vnd.onepagertamx\":{\"source\":\"iana\"},\"application/vnd.onepagertat\":{\"source\":\"iana\"},\"application/vnd.onepagertatp\":{\"source\":\"iana\"},\"application/vnd.onepagertatx\":{\"source\":\"iana\"},\"application/vnd.openblox.game+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openblox.game-binary\":{\"source\":\"iana\"},\"application/vnd.openeye.oeb\":{\"source\":\"iana\"},\"application/vnd.openofficeorg.extension\":{\"source\":\"apache\",\"extensions\":[\"oxt\"]},\"application/vnd.openstreetmap.data+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.custom-properties+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.customxmlproperties+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.drawing+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.extended-properties+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.comments+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.presentation\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"pptx\"]},\"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.slide\":{\"source\":\"iana\",\"extensions\":[\"sldx\"]},\"application/vnd.openxmlformats-officedocument.presentationml.slide+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.slideshow\":{\"source\":\"iana\",\"extensions\":[\"ppsx\"]},\"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.tags+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.template\":{\"source\":\"iana\",\"extensions\":[\"potx\"]},\"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"xlsx\"]},\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.template\":{\"source\":\"iana\",\"extensions\":[\"xltx\"]},\"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.theme+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.themeoverride+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.vmldrawing\":{\"source\":\"iana\"},\"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.wordprocessingml.document\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"docx\"]},\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.wordprocessingml.template\":{\"source\":\"iana\",\"extensions\":[\"dotx\"]},\"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-package.core-properties+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.openxmlformats-package.relationships+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oracle.resource+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.orange.indata\":{\"source\":\"iana\"},\"application/vnd.osa.netdeploy\":{\"source\":\"iana\"},\"application/vnd.osgeo.mapguide.package\":{\"source\":\"iana\",\"extensions\":[\"mgp\"]},\"application/vnd.osgi.bundle\":{\"source\":\"iana\"},\"application/vnd.osgi.dp\":{\"source\":\"iana\",\"extensions\":[\"dp\"]},\"application/vnd.osgi.subsystem\":{\"source\":\"iana\",\"extensions\":[\"esa\"]},\"application/vnd.otps.ct-kip+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.oxli.countgraph\":{\"source\":\"iana\"},\"application/vnd.pagerduty+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.palm\":{\"source\":\"iana\",\"extensions\":[\"pdb\",\"pqa\",\"oprc\"]},\"application/vnd.panoply\":{\"source\":\"iana\"},\"application/vnd.paos+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.paos.xml\":{\"source\":\"apache\"},\"application/vnd.patentdive\":{\"source\":\"iana\"},\"application/vnd.pawaafile\":{\"source\":\"iana\",\"extensions\":[\"paw\"]},\"application/vnd.pcos\":{\"source\":\"iana\"},\"application/vnd.pg.format\":{\"source\":\"iana\",\"extensions\":[\"str\"]},\"application/vnd.pg.osasli\":{\"source\":\"iana\",\"extensions\":[\"ei6\"]},\"application/vnd.piaccess.application-licence\":{\"source\":\"iana\"},\"application/vnd.picsel\":{\"source\":\"iana\",\"extensions\":[\"efif\"]},\"application/vnd.pmi.widget\":{\"source\":\"iana\",\"extensions\":[\"wg\"]},\"application/vnd.poc.group-advertisement+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.pocketlearn\":{\"source\":\"iana\",\"extensions\":[\"plf\"]},\"application/vnd.powerbuilder6\":{\"source\":\"iana\",\"extensions\":[\"pbd\"]},\"application/vnd.powerbuilder6-s\":{\"source\":\"iana\"},\"application/vnd.powerbuilder7\":{\"source\":\"iana\"},\"application/vnd.powerbuilder7-s\":{\"source\":\"iana\"},\"application/vnd.powerbuilder75\":{\"source\":\"iana\"},\"application/vnd.powerbuilder75-s\":{\"source\":\"iana\"},\"application/vnd.preminet\":{\"source\":\"iana\"},\"application/vnd.previewsystems.box\":{\"source\":\"iana\",\"extensions\":[\"box\"]},\"application/vnd.proteus.magazine\":{\"source\":\"iana\",\"extensions\":[\"mgz\"]},\"application/vnd.psfs\":{\"source\":\"iana\"},\"application/vnd.publishare-delta-tree\":{\"source\":\"iana\",\"extensions\":[\"qps\"]},\"application/vnd.pvi.ptid1\":{\"source\":\"iana\",\"extensions\":[\"ptid\"]},\"application/vnd.pwg-multiplexed\":{\"source\":\"iana\"},\"application/vnd.pwg-xhtml-print+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.qualcomm.brew-app-res\":{\"source\":\"iana\"},\"application/vnd.quarantainenet\":{\"source\":\"iana\"},\"application/vnd.quark.quarkxpress\":{\"source\":\"iana\",\"extensions\":[\"qxd\",\"qxt\",\"qwd\",\"qwt\",\"qxl\",\"qxb\"]},\"application/vnd.quobject-quoxdocument\":{\"source\":\"iana\"},\"application/vnd.radisys.moml+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml-audit+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml-audit-conf+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml-audit-conn+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml-audit-dialog+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml-audit-stream+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml-conf+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml-dialog+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml-dialog-base+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml-dialog-fax-detect+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml-dialog-fax-sendrecv+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml-dialog-group+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml-dialog-speech+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.radisys.msml-dialog-transform+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.rainstor.data\":{\"source\":\"iana\"},\"application/vnd.rapid\":{\"source\":\"iana\"},\"application/vnd.rar\":{\"source\":\"iana\"},\"application/vnd.realvnc.bed\":{\"source\":\"iana\",\"extensions\":[\"bed\"]},\"application/vnd.recordare.musicxml\":{\"source\":\"iana\",\"extensions\":[\"mxl\"]},\"application/vnd.recordare.musicxml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"musicxml\"]},\"application/vnd.renlearn.rlprint\":{\"source\":\"iana\"},\"application/vnd.restful+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.rig.cryptonote\":{\"source\":\"iana\",\"extensions\":[\"cryptonote\"]},\"application/vnd.rim.cod\":{\"source\":\"apache\",\"extensions\":[\"cod\"]},\"application/vnd.rn-realmedia\":{\"source\":\"apache\",\"extensions\":[\"rm\"]},\"application/vnd.rn-realmedia-vbr\":{\"source\":\"apache\",\"extensions\":[\"rmvb\"]},\"application/vnd.route66.link66+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"link66\"]},\"application/vnd.rs-274x\":{\"source\":\"iana\"},\"application/vnd.ruckus.download\":{\"source\":\"iana\"},\"application/vnd.s3sms\":{\"source\":\"iana\"},\"application/vnd.sailingtracker.track\":{\"source\":\"iana\",\"extensions\":[\"st\"]},\"application/vnd.sbm.cid\":{\"source\":\"iana\"},\"application/vnd.sbm.mid2\":{\"source\":\"iana\"},\"application/vnd.scribus\":{\"source\":\"iana\"},\"application/vnd.sealed.3df\":{\"source\":\"iana\"},\"application/vnd.sealed.csf\":{\"source\":\"iana\"},\"application/vnd.sealed.doc\":{\"source\":\"iana\"},\"application/vnd.sealed.eml\":{\"source\":\"iana\"},\"application/vnd.sealed.mht\":{\"source\":\"iana\"},\"application/vnd.sealed.net\":{\"source\":\"iana\"},\"application/vnd.sealed.ppt\":{\"source\":\"iana\"},\"application/vnd.sealed.tiff\":{\"source\":\"iana\"},\"application/vnd.sealed.xls\":{\"source\":\"iana\"},\"application/vnd.sealedmedia.softseal.html\":{\"source\":\"iana\"},\"application/vnd.sealedmedia.softseal.pdf\":{\"source\":\"iana\"},\"application/vnd.seemail\":{\"source\":\"iana\",\"extensions\":[\"see\"]},\"application/vnd.sema\":{\"source\":\"iana\",\"extensions\":[\"sema\"]},\"application/vnd.semd\":{\"source\":\"iana\",\"extensions\":[\"semd\"]},\"application/vnd.semf\":{\"source\":\"iana\",\"extensions\":[\"semf\"]},\"application/vnd.shana.informed.formdata\":{\"source\":\"iana\",\"extensions\":[\"ifm\"]},\"application/vnd.shana.informed.formtemplate\":{\"source\":\"iana\",\"extensions\":[\"itp\"]},\"application/vnd.shana.informed.interchange\":{\"source\":\"iana\",\"extensions\":[\"iif\"]},\"application/vnd.shana.informed.package\":{\"source\":\"iana\",\"extensions\":[\"ipk\"]},\"application/vnd.shootproof+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.sigrok.session\":{\"source\":\"iana\"},\"application/vnd.simtech-mindmapper\":{\"source\":\"iana\",\"extensions\":[\"twd\",\"twds\"]},\"application/vnd.siren+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.smaf\":{\"source\":\"iana\",\"extensions\":[\"mmf\"]},\"application/vnd.smart.notebook\":{\"source\":\"iana\"},\"application/vnd.smart.teacher\":{\"source\":\"iana\",\"extensions\":[\"teacher\"]},\"application/vnd.software602.filler.form+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.software602.filler.form-xml-zip\":{\"source\":\"iana\"},\"application/vnd.solent.sdkm+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"sdkm\",\"sdkd\"]},\"application/vnd.spotfire.dxp\":{\"source\":\"iana\",\"extensions\":[\"dxp\"]},\"application/vnd.spotfire.sfs\":{\"source\":\"iana\",\"extensions\":[\"sfs\"]},\"application/vnd.sqlite3\":{\"source\":\"iana\"},\"application/vnd.sss-cod\":{\"source\":\"iana\"},\"application/vnd.sss-dtf\":{\"source\":\"iana\"},\"application/vnd.sss-ntf\":{\"source\":\"iana\"},\"application/vnd.stardivision.calc\":{\"source\":\"apache\",\"extensions\":[\"sdc\"]},\"application/vnd.stardivision.draw\":{\"source\":\"apache\",\"extensions\":[\"sda\"]},\"application/vnd.stardivision.impress\":{\"source\":\"apache\",\"extensions\":[\"sdd\"]},\"application/vnd.stardivision.math\":{\"source\":\"apache\",\"extensions\":[\"smf\"]},\"application/vnd.stardivision.writer\":{\"source\":\"apache\",\"extensions\":[\"sdw\",\"vor\"]},\"application/vnd.stardivision.writer-global\":{\"source\":\"apache\",\"extensions\":[\"sgl\"]},\"application/vnd.stepmania.package\":{\"source\":\"iana\",\"extensions\":[\"smzip\"]},\"application/vnd.stepmania.stepchart\":{\"source\":\"iana\",\"extensions\":[\"sm\"]},\"application/vnd.street-stream\":{\"source\":\"iana\"},\"application/vnd.sun.wadl+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"wadl\"]},\"application/vnd.sun.xml.calc\":{\"source\":\"apache\",\"extensions\":[\"sxc\"]},\"application/vnd.sun.xml.calc.template\":{\"source\":\"apache\",\"extensions\":[\"stc\"]},\"application/vnd.sun.xml.draw\":{\"source\":\"apache\",\"extensions\":[\"sxd\"]},\"application/vnd.sun.xml.draw.template\":{\"source\":\"apache\",\"extensions\":[\"std\"]},\"application/vnd.sun.xml.impress\":{\"source\":\"apache\",\"extensions\":[\"sxi\"]},\"application/vnd.sun.xml.impress.template\":{\"source\":\"apache\",\"extensions\":[\"sti\"]},\"application/vnd.sun.xml.math\":{\"source\":\"apache\",\"extensions\":[\"sxm\"]},\"application/vnd.sun.xml.writer\":{\"source\":\"apache\",\"extensions\":[\"sxw\"]},\"application/vnd.sun.xml.writer.global\":{\"source\":\"apache\",\"extensions\":[\"sxg\"]},\"application/vnd.sun.xml.writer.template\":{\"source\":\"apache\",\"extensions\":[\"stw\"]},\"application/vnd.sus-calendar\":{\"source\":\"iana\",\"extensions\":[\"sus\",\"susp\"]},\"application/vnd.svd\":{\"source\":\"iana\",\"extensions\":[\"svd\"]},\"application/vnd.swiftview-ics\":{\"source\":\"iana\"},\"application/vnd.symbian.install\":{\"source\":\"apache\",\"extensions\":[\"sis\",\"sisx\"]},\"application/vnd.syncml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"xsm\"]},\"application/vnd.syncml.dm+wbxml\":{\"source\":\"iana\",\"extensions\":[\"bdm\"]},\"application/vnd.syncml.dm+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"xdm\"]},\"application/vnd.syncml.dm.notification\":{\"source\":\"iana\"},\"application/vnd.syncml.dmddf+wbxml\":{\"source\":\"iana\"},\"application/vnd.syncml.dmddf+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.syncml.dmtnds+wbxml\":{\"source\":\"iana\"},\"application/vnd.syncml.dmtnds+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.syncml.ds.notification\":{\"source\":\"iana\"},\"application/vnd.tableschema+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.tao.intent-module-archive\":{\"source\":\"iana\",\"extensions\":[\"tao\"]},\"application/vnd.tcpdump.pcap\":{\"source\":\"iana\",\"extensions\":[\"pcap\",\"cap\",\"dmp\"]},\"application/vnd.think-cell.ppttc+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.tmd.mediaflex.api+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.tml\":{\"source\":\"iana\"},\"application/vnd.tmobile-livetv\":{\"source\":\"iana\",\"extensions\":[\"tmo\"]},\"application/vnd.tri.onesource\":{\"source\":\"iana\"},\"application/vnd.trid.tpt\":{\"source\":\"iana\",\"extensions\":[\"tpt\"]},\"application/vnd.triscape.mxs\":{\"source\":\"iana\",\"extensions\":[\"mxs\"]},\"application/vnd.trueapp\":{\"source\":\"iana\",\"extensions\":[\"tra\"]},\"application/vnd.truedoc\":{\"source\":\"iana\"},\"application/vnd.ubisoft.webplayer\":{\"source\":\"iana\"},\"application/vnd.ufdl\":{\"source\":\"iana\",\"extensions\":[\"ufd\",\"ufdl\"]},\"application/vnd.uiq.theme\":{\"source\":\"iana\",\"extensions\":[\"utz\"]},\"application/vnd.umajin\":{\"source\":\"iana\",\"extensions\":[\"umj\"]},\"application/vnd.unity\":{\"source\":\"iana\",\"extensions\":[\"unityweb\"]},\"application/vnd.uoml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"uoml\"]},\"application/vnd.uplanet.alert\":{\"source\":\"iana\"},\"application/vnd.uplanet.alert-wbxml\":{\"source\":\"iana\"},\"application/vnd.uplanet.bearer-choice\":{\"source\":\"iana\"},\"application/vnd.uplanet.bearer-choice-wbxml\":{\"source\":\"iana\"},\"application/vnd.uplanet.cacheop\":{\"source\":\"iana\"},\"application/vnd.uplanet.cacheop-wbxml\":{\"source\":\"iana\"},\"application/vnd.uplanet.channel\":{\"source\":\"iana\"},\"application/vnd.uplanet.channel-wbxml\":{\"source\":\"iana\"},\"application/vnd.uplanet.list\":{\"source\":\"iana\"},\"application/vnd.uplanet.list-wbxml\":{\"source\":\"iana\"},\"application/vnd.uplanet.listcmd\":{\"source\":\"iana\"},\"application/vnd.uplanet.listcmd-wbxml\":{\"source\":\"iana\"},\"application/vnd.uplanet.signal\":{\"source\":\"iana\"},\"application/vnd.uri-map\":{\"source\":\"iana\"},\"application/vnd.valve.source.material\":{\"source\":\"iana\"},\"application/vnd.vcx\":{\"source\":\"iana\",\"extensions\":[\"vcx\"]},\"application/vnd.vd-study\":{\"source\":\"iana\"},\"application/vnd.vectorworks\":{\"source\":\"iana\"},\"application/vnd.vel+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.verimatrix.vcas\":{\"source\":\"iana\"},\"application/vnd.vidsoft.vidconference\":{\"source\":\"iana\"},\"application/vnd.visio\":{\"source\":\"iana\",\"extensions\":[\"vsd\",\"vst\",\"vss\",\"vsw\"]},\"application/vnd.visionary\":{\"source\":\"iana\",\"extensions\":[\"vis\"]},\"application/vnd.vividence.scriptfile\":{\"source\":\"iana\"},\"application/vnd.vsf\":{\"source\":\"iana\",\"extensions\":[\"vsf\"]},\"application/vnd.wap.sic\":{\"source\":\"iana\"},\"application/vnd.wap.slc\":{\"source\":\"iana\"},\"application/vnd.wap.wbxml\":{\"source\":\"iana\",\"extensions\":[\"wbxml\"]},\"application/vnd.wap.wmlc\":{\"source\":\"iana\",\"extensions\":[\"wmlc\"]},\"application/vnd.wap.wmlscriptc\":{\"source\":\"iana\",\"extensions\":[\"wmlsc\"]},\"application/vnd.webturbo\":{\"source\":\"iana\",\"extensions\":[\"wtb\"]},\"application/vnd.wfa.p2p\":{\"source\":\"iana\"},\"application/vnd.wfa.wsc\":{\"source\":\"iana\"},\"application/vnd.windows.devicepairing\":{\"source\":\"iana\"},\"application/vnd.wmc\":{\"source\":\"iana\"},\"application/vnd.wmf.bootstrap\":{\"source\":\"iana\"},\"application/vnd.wolfram.mathematica\":{\"source\":\"iana\"},\"application/vnd.wolfram.mathematica.package\":{\"source\":\"iana\"},\"application/vnd.wolfram.player\":{\"source\":\"iana\",\"extensions\":[\"nbp\"]},\"application/vnd.wordperfect\":{\"source\":\"iana\",\"extensions\":[\"wpd\"]},\"application/vnd.wqd\":{\"source\":\"iana\",\"extensions\":[\"wqd\"]},\"application/vnd.wrq-hp3000-labelled\":{\"source\":\"iana\"},\"application/vnd.wt.stf\":{\"source\":\"iana\",\"extensions\":[\"stf\"]},\"application/vnd.wv.csp+wbxml\":{\"source\":\"iana\"},\"application/vnd.wv.csp+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.wv.ssp+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.xacml+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.xara\":{\"source\":\"iana\",\"extensions\":[\"xar\"]},\"application/vnd.xfdl\":{\"source\":\"iana\",\"extensions\":[\"xfdl\"]},\"application/vnd.xfdl.webform\":{\"source\":\"iana\"},\"application/vnd.xmi+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/vnd.xmpie.cpkg\":{\"source\":\"iana\"},\"application/vnd.xmpie.dpkg\":{\"source\":\"iana\"},\"application/vnd.xmpie.plan\":{\"source\":\"iana\"},\"application/vnd.xmpie.ppkg\":{\"source\":\"iana\"},\"application/vnd.xmpie.xlim\":{\"source\":\"iana\"},\"application/vnd.yamaha.hv-dic\":{\"source\":\"iana\",\"extensions\":[\"hvd\"]},\"application/vnd.yamaha.hv-script\":{\"source\":\"iana\",\"extensions\":[\"hvs\"]},\"application/vnd.yamaha.hv-voice\":{\"source\":\"iana\",\"extensions\":[\"hvp\"]},\"application/vnd.yamaha.openscoreformat\":{\"source\":\"iana\",\"extensions\":[\"osf\"]},\"application/vnd.yamaha.openscoreformat.osfpvg+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"osfpvg\"]},\"application/vnd.yamaha.remote-setup\":{\"source\":\"iana\"},\"application/vnd.yamaha.smaf-audio\":{\"source\":\"iana\",\"extensions\":[\"saf\"]},\"application/vnd.yamaha.smaf-phrase\":{\"source\":\"iana\",\"extensions\":[\"spf\"]},\"application/vnd.yamaha.through-ngn\":{\"source\":\"iana\"},\"application/vnd.yamaha.tunnel-udpencap\":{\"source\":\"iana\"},\"application/vnd.yaoweme\":{\"source\":\"iana\"},\"application/vnd.yellowriver-custom-menu\":{\"source\":\"iana\",\"extensions\":[\"cmp\"]},\"application/vnd.youtube.yt\":{\"source\":\"iana\"},\"application/vnd.zul\":{\"source\":\"iana\",\"extensions\":[\"zir\",\"zirz\"]},\"application/vnd.zzazz.deck+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"zaz\"]},\"application/voicexml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"vxml\"]},\"application/voucher-cms+json\":{\"source\":\"iana\",\"compressible\":true},\"application/vq-rtcpxr\":{\"source\":\"iana\"},\"application/wasm\":{\"compressible\":true,\"extensions\":[\"wasm\"]},\"application/watcherinfo+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/webpush-options+json\":{\"source\":\"iana\",\"compressible\":true},\"application/whoispp-query\":{\"source\":\"iana\"},\"application/whoispp-response\":{\"source\":\"iana\"},\"application/widget\":{\"source\":\"iana\",\"extensions\":[\"wgt\"]},\"application/winhlp\":{\"source\":\"apache\",\"extensions\":[\"hlp\"]},\"application/wita\":{\"source\":\"iana\"},\"application/wordperfect5.1\":{\"source\":\"iana\"},\"application/wsdl+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"wsdl\"]},\"application/wspolicy+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"wspolicy\"]},\"application/x-7z-compressed\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"7z\"]},\"application/x-abiword\":{\"source\":\"apache\",\"extensions\":[\"abw\"]},\"application/x-ace-compressed\":{\"source\":\"apache\",\"extensions\":[\"ace\"]},\"application/x-amf\":{\"source\":\"apache\"},\"application/x-apple-diskimage\":{\"source\":\"apache\",\"extensions\":[\"dmg\"]},\"application/x-arj\":{\"compressible\":false,\"extensions\":[\"arj\"]},\"application/x-authorware-bin\":{\"source\":\"apache\",\"extensions\":[\"aab\",\"x32\",\"u32\",\"vox\"]},\"application/x-authorware-map\":{\"source\":\"apache\",\"extensions\":[\"aam\"]},\"application/x-authorware-seg\":{\"source\":\"apache\",\"extensions\":[\"aas\"]},\"application/x-bcpio\":{\"source\":\"apache\",\"extensions\":[\"bcpio\"]},\"application/x-bdoc\":{\"compressible\":false,\"extensions\":[\"bdoc\"]},\"application/x-bittorrent\":{\"source\":\"apache\",\"extensions\":[\"torrent\"]},\"application/x-blorb\":{\"source\":\"apache\",\"extensions\":[\"blb\",\"blorb\"]},\"application/x-bzip\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"bz\"]},\"application/x-bzip2\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"bz2\",\"boz\"]},\"application/x-cbr\":{\"source\":\"apache\",\"extensions\":[\"cbr\",\"cba\",\"cbt\",\"cbz\",\"cb7\"]},\"application/x-cdlink\":{\"source\":\"apache\",\"extensions\":[\"vcd\"]},\"application/x-cfs-compressed\":{\"source\":\"apache\",\"extensions\":[\"cfs\"]},\"application/x-chat\":{\"source\":\"apache\",\"extensions\":[\"chat\"]},\"application/x-chess-pgn\":{\"source\":\"apache\",\"extensions\":[\"pgn\"]},\"application/x-chrome-extension\":{\"extensions\":[\"crx\"]},\"application/x-cocoa\":{\"source\":\"nginx\",\"extensions\":[\"cco\"]},\"application/x-compress\":{\"source\":\"apache\"},\"application/x-conference\":{\"source\":\"apache\",\"extensions\":[\"nsc\"]},\"application/x-cpio\":{\"source\":\"apache\",\"extensions\":[\"cpio\"]},\"application/x-csh\":{\"source\":\"apache\",\"extensions\":[\"csh\"]},\"application/x-deb\":{\"compressible\":false},\"application/x-debian-package\":{\"source\":\"apache\",\"extensions\":[\"deb\",\"udeb\"]},\"application/x-dgc-compressed\":{\"source\":\"apache\",\"extensions\":[\"dgc\"]},\"application/x-director\":{\"source\":\"apache\",\"extensions\":[\"dir\",\"dcr\",\"dxr\",\"cst\",\"cct\",\"cxt\",\"w3d\",\"fgd\",\"swa\"]},\"application/x-doom\":{\"source\":\"apache\",\"extensions\":[\"wad\"]},\"application/x-dtbncx+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"ncx\"]},\"application/x-dtbook+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"dtb\"]},\"application/x-dtbresource+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"res\"]},\"application/x-dvi\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"dvi\"]},\"application/x-envoy\":{\"source\":\"apache\",\"extensions\":[\"evy\"]},\"application/x-eva\":{\"source\":\"apache\",\"extensions\":[\"eva\"]},\"application/x-font-bdf\":{\"source\":\"apache\",\"extensions\":[\"bdf\"]},\"application/x-font-dos\":{\"source\":\"apache\"},\"application/x-font-framemaker\":{\"source\":\"apache\"},\"application/x-font-ghostscript\":{\"source\":\"apache\",\"extensions\":[\"gsf\"]},\"application/x-font-libgrx\":{\"source\":\"apache\"},\"application/x-font-linux-psf\":{\"source\":\"apache\",\"extensions\":[\"psf\"]},\"application/x-font-pcf\":{\"source\":\"apache\",\"extensions\":[\"pcf\"]},\"application/x-font-snf\":{\"source\":\"apache\",\"extensions\":[\"snf\"]},\"application/x-font-speedo\":{\"source\":\"apache\"},\"application/x-font-sunos-news\":{\"source\":\"apache\"},\"application/x-font-type1\":{\"source\":\"apache\",\"extensions\":[\"pfa\",\"pfb\",\"pfm\",\"afm\"]},\"application/x-font-vfont\":{\"source\":\"apache\"},\"application/x-freearc\":{\"source\":\"apache\",\"extensions\":[\"arc\"]},\"application/x-futuresplash\":{\"source\":\"apache\",\"extensions\":[\"spl\"]},\"application/x-gca-compressed\":{\"source\":\"apache\",\"extensions\":[\"gca\"]},\"application/x-glulx\":{\"source\":\"apache\",\"extensions\":[\"ulx\"]},\"application/x-gnumeric\":{\"source\":\"apache\",\"extensions\":[\"gnumeric\"]},\"application/x-gramps-xml\":{\"source\":\"apache\",\"extensions\":[\"gramps\"]},\"application/x-gtar\":{\"source\":\"apache\",\"extensions\":[\"gtar\"]},\"application/x-gzip\":{\"source\":\"apache\"},\"application/x-hdf\":{\"source\":\"apache\",\"extensions\":[\"hdf\"]},\"application/x-httpd-php\":{\"compressible\":true,\"extensions\":[\"php\"]},\"application/x-install-instructions\":{\"source\":\"apache\",\"extensions\":[\"install\"]},\"application/x-iso9660-image\":{\"source\":\"apache\",\"extensions\":[\"iso\"]},\"application/x-java-archive-diff\":{\"source\":\"nginx\",\"extensions\":[\"jardiff\"]},\"application/x-java-jnlp-file\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"jnlp\"]},\"application/x-javascript\":{\"compressible\":true},\"application/x-latex\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"latex\"]},\"application/x-lua-bytecode\":{\"extensions\":[\"luac\"]},\"application/x-lzh-compressed\":{\"source\":\"apache\",\"extensions\":[\"lzh\",\"lha\"]},\"application/x-makeself\":{\"source\":\"nginx\",\"extensions\":[\"run\"]},\"application/x-mie\":{\"source\":\"apache\",\"extensions\":[\"mie\"]},\"application/x-mobipocket-ebook\":{\"source\":\"apache\",\"extensions\":[\"prc\",\"mobi\"]},\"application/x-mpegurl\":{\"compressible\":false},\"application/x-ms-application\":{\"source\":\"apache\",\"extensions\":[\"application\"]},\"application/x-ms-shortcut\":{\"source\":\"apache\",\"extensions\":[\"lnk\"]},\"application/x-ms-wmd\":{\"source\":\"apache\",\"extensions\":[\"wmd\"]},\"application/x-ms-wmz\":{\"source\":\"apache\",\"extensions\":[\"wmz\"]},\"application/x-ms-xbap\":{\"source\":\"apache\",\"extensions\":[\"xbap\"]},\"application/x-msaccess\":{\"source\":\"apache\",\"extensions\":[\"mdb\"]},\"application/x-msbinder\":{\"source\":\"apache\",\"extensions\":[\"obd\"]},\"application/x-mscardfile\":{\"source\":\"apache\",\"extensions\":[\"crd\"]},\"application/x-msclip\":{\"source\":\"apache\",\"extensions\":[\"clp\"]},\"application/x-msdos-program\":{\"extensions\":[\"exe\"]},\"application/x-msdownload\":{\"source\":\"apache\",\"extensions\":[\"exe\",\"dll\",\"com\",\"bat\",\"msi\"]},\"application/x-msmediaview\":{\"source\":\"apache\",\"extensions\":[\"mvb\",\"m13\",\"m14\"]},\"application/x-msmetafile\":{\"source\":\"apache\",\"extensions\":[\"wmf\",\"wmz\",\"emf\",\"emz\"]},\"application/x-msmoney\":{\"source\":\"apache\",\"extensions\":[\"mny\"]},\"application/x-mspublisher\":{\"source\":\"apache\",\"extensions\":[\"pub\"]},\"application/x-msschedule\":{\"source\":\"apache\",\"extensions\":[\"scd\"]},\"application/x-msterminal\":{\"source\":\"apache\",\"extensions\":[\"trm\"]},\"application/x-mswrite\":{\"source\":\"apache\",\"extensions\":[\"wri\"]},\"application/x-netcdf\":{\"source\":\"apache\",\"extensions\":[\"nc\",\"cdf\"]},\"application/x-ns-proxy-autoconfig\":{\"compressible\":true,\"extensions\":[\"pac\"]},\"application/x-nzb\":{\"source\":\"apache\",\"extensions\":[\"nzb\"]},\"application/x-perl\":{\"source\":\"nginx\",\"extensions\":[\"pl\",\"pm\"]},\"application/x-pilot\":{\"source\":\"nginx\",\"extensions\":[\"prc\",\"pdb\"]},\"application/x-pkcs12\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"p12\",\"pfx\"]},\"application/x-pkcs7-certificates\":{\"source\":\"apache\",\"extensions\":[\"p7b\",\"spc\"]},\"application/x-pkcs7-certreqresp\":{\"source\":\"apache\",\"extensions\":[\"p7r\"]},\"application/x-rar-compressed\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"rar\"]},\"application/x-redhat-package-manager\":{\"source\":\"nginx\",\"extensions\":[\"rpm\"]},\"application/x-research-info-systems\":{\"source\":\"apache\",\"extensions\":[\"ris\"]},\"application/x-sea\":{\"source\":\"nginx\",\"extensions\":[\"sea\"]},\"application/x-sh\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"sh\"]},\"application/x-shar\":{\"source\":\"apache\",\"extensions\":[\"shar\"]},\"application/x-shockwave-flash\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"swf\"]},\"application/x-silverlight-app\":{\"source\":\"apache\",\"extensions\":[\"xap\"]},\"application/x-sql\":{\"source\":\"apache\",\"extensions\":[\"sql\"]},\"application/x-stuffit\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"sit\"]},\"application/x-stuffitx\":{\"source\":\"apache\",\"extensions\":[\"sitx\"]},\"application/x-subrip\":{\"source\":\"apache\",\"extensions\":[\"srt\"]},\"application/x-sv4cpio\":{\"source\":\"apache\",\"extensions\":[\"sv4cpio\"]},\"application/x-sv4crc\":{\"source\":\"apache\",\"extensions\":[\"sv4crc\"]},\"application/x-t3vm-image\":{\"source\":\"apache\",\"extensions\":[\"t3\"]},\"application/x-tads\":{\"source\":\"apache\",\"extensions\":[\"gam\"]},\"application/x-tar\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"tar\"]},\"application/x-tcl\":{\"source\":\"apache\",\"extensions\":[\"tcl\",\"tk\"]},\"application/x-tex\":{\"source\":\"apache\",\"extensions\":[\"tex\"]},\"application/x-tex-tfm\":{\"source\":\"apache\",\"extensions\":[\"tfm\"]},\"application/x-texinfo\":{\"source\":\"apache\",\"extensions\":[\"texinfo\",\"texi\"]},\"application/x-tgif\":{\"source\":\"apache\",\"extensions\":[\"obj\"]},\"application/x-ustar\":{\"source\":\"apache\",\"extensions\":[\"ustar\"]},\"application/x-virtualbox-hdd\":{\"compressible\":true,\"extensions\":[\"hdd\"]},\"application/x-virtualbox-ova\":{\"compressible\":true,\"extensions\":[\"ova\"]},\"application/x-virtualbox-ovf\":{\"compressible\":true,\"extensions\":[\"ovf\"]},\"application/x-virtualbox-vbox\":{\"compressible\":true,\"extensions\":[\"vbox\"]},\"application/x-virtualbox-vbox-extpack\":{\"compressible\":false,\"extensions\":[\"vbox-extpack\"]},\"application/x-virtualbox-vdi\":{\"compressible\":true,\"extensions\":[\"vdi\"]},\"application/x-virtualbox-vhd\":{\"compressible\":true,\"extensions\":[\"vhd\"]},\"application/x-virtualbox-vmdk\":{\"compressible\":true,\"extensions\":[\"vmdk\"]},\"application/x-wais-source\":{\"source\":\"apache\",\"extensions\":[\"src\"]},\"application/x-web-app-manifest+json\":{\"compressible\":true,\"extensions\":[\"webapp\"]},\"application/x-www-form-urlencoded\":{\"source\":\"iana\",\"compressible\":true},\"application/x-x509-ca-cert\":{\"source\":\"apache\",\"extensions\":[\"der\",\"crt\",\"pem\"]},\"application/x-xfig\":{\"source\":\"apache\",\"extensions\":[\"fig\"]},\"application/x-xliff+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"xlf\"]},\"application/x-xpinstall\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"xpi\"]},\"application/x-xz\":{\"source\":\"apache\",\"extensions\":[\"xz\"]},\"application/x-zmachine\":{\"source\":\"apache\",\"extensions\":[\"z1\",\"z2\",\"z3\",\"z4\",\"z5\",\"z6\",\"z7\",\"z8\"]},\"application/x400-bp\":{\"source\":\"iana\"},\"application/xacml+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/xaml+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"xaml\"]},\"application/xcap-att+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/xcap-caps+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/xcap-diff+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"xdf\"]},\"application/xcap-el+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/xcap-error+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/xcap-ns+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/xcon-conference-info+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/xcon-conference-info-diff+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/xenc+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"xenc\"]},\"application/xhtml+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"xhtml\",\"xht\"]},\"application/xhtml-voice+xml\":{\"source\":\"apache\",\"compressible\":true},\"application/xliff+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"xml\",\"xsl\",\"xsd\",\"rng\"]},\"application/xml-dtd\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"dtd\"]},\"application/xml-external-parsed-entity\":{\"source\":\"iana\"},\"application/xml-patch+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/xmpp+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/xop+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"xop\"]},\"application/xproc+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"xpl\"]},\"application/xslt+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"xslt\"]},\"application/xspf+xml\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"xspf\"]},\"application/xv+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"mxml\",\"xhvml\",\"xvml\",\"xvm\"]},\"application/yang\":{\"source\":\"iana\",\"extensions\":[\"yang\"]},\"application/yang-data+json\":{\"source\":\"iana\",\"compressible\":true},\"application/yang-data+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/yang-patch+json\":{\"source\":\"iana\",\"compressible\":true},\"application/yang-patch+xml\":{\"source\":\"iana\",\"compressible\":true},\"application/yin+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"yin\"]},\"application/zip\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"zip\"]},\"application/zlib\":{\"source\":\"iana\"},\"audio/1d-interleaved-parityfec\":{\"source\":\"iana\"},\"audio/32kadpcm\":{\"source\":\"iana\"},\"audio/3gpp\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"3gpp\"]},\"audio/3gpp2\":{\"source\":\"iana\"},\"audio/aac\":{\"source\":\"iana\"},\"audio/ac3\":{\"source\":\"iana\"},\"audio/adpcm\":{\"source\":\"apache\",\"extensions\":[\"adp\"]},\"audio/amr\":{\"source\":\"iana\"},\"audio/amr-wb\":{\"source\":\"iana\"},\"audio/amr-wb+\":{\"source\":\"iana\"},\"audio/aptx\":{\"source\":\"iana\"},\"audio/asc\":{\"source\":\"iana\"},\"audio/atrac-advanced-lossless\":{\"source\":\"iana\"},\"audio/atrac-x\":{\"source\":\"iana\"},\"audio/atrac3\":{\"source\":\"iana\"},\"audio/basic\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"au\",\"snd\"]},\"audio/bv16\":{\"source\":\"iana\"},\"audio/bv32\":{\"source\":\"iana\"},\"audio/clearmode\":{\"source\":\"iana\"},\"audio/cn\":{\"source\":\"iana\"},\"audio/dat12\":{\"source\":\"iana\"},\"audio/dls\":{\"source\":\"iana\"},\"audio/dsr-es201108\":{\"source\":\"iana\"},\"audio/dsr-es202050\":{\"source\":\"iana\"},\"audio/dsr-es202211\":{\"source\":\"iana\"},\"audio/dsr-es202212\":{\"source\":\"iana\"},\"audio/dv\":{\"source\":\"iana\"},\"audio/dvi4\":{\"source\":\"iana\"},\"audio/eac3\":{\"source\":\"iana\"},\"audio/encaprtp\":{\"source\":\"iana\"},\"audio/evrc\":{\"source\":\"iana\"},\"audio/evrc-qcp\":{\"source\":\"iana\"},\"audio/evrc0\":{\"source\":\"iana\"},\"audio/evrc1\":{\"source\":\"iana\"},\"audio/evrcb\":{\"source\":\"iana\"},\"audio/evrcb0\":{\"source\":\"iana\"},\"audio/evrcb1\":{\"source\":\"iana\"},\"audio/evrcnw\":{\"source\":\"iana\"},\"audio/evrcnw0\":{\"source\":\"iana\"},\"audio/evrcnw1\":{\"source\":\"iana\"},\"audio/evrcwb\":{\"source\":\"iana\"},\"audio/evrcwb0\":{\"source\":\"iana\"},\"audio/evrcwb1\":{\"source\":\"iana\"},\"audio/evs\":{\"source\":\"iana\"},\"audio/fwdred\":{\"source\":\"iana\"},\"audio/g711-0\":{\"source\":\"iana\"},\"audio/g719\":{\"source\":\"iana\"},\"audio/g722\":{\"source\":\"iana\"},\"audio/g7221\":{\"source\":\"iana\"},\"audio/g723\":{\"source\":\"iana\"},\"audio/g726-16\":{\"source\":\"iana\"},\"audio/g726-24\":{\"source\":\"iana\"},\"audio/g726-32\":{\"source\":\"iana\"},\"audio/g726-40\":{\"source\":\"iana\"},\"audio/g728\":{\"source\":\"iana\"},\"audio/g729\":{\"source\":\"iana\"},\"audio/g7291\":{\"source\":\"iana\"},\"audio/g729d\":{\"source\":\"iana\"},\"audio/g729e\":{\"source\":\"iana\"},\"audio/gsm\":{\"source\":\"iana\"},\"audio/gsm-efr\":{\"source\":\"iana\"},\"audio/gsm-hr-08\":{\"source\":\"iana\"},\"audio/ilbc\":{\"source\":\"iana\"},\"audio/ip-mr_v2.5\":{\"source\":\"iana\"},\"audio/isac\":{\"source\":\"apache\"},\"audio/l16\":{\"source\":\"iana\"},\"audio/l20\":{\"source\":\"iana\"},\"audio/l24\":{\"source\":\"iana\",\"compressible\":false},\"audio/l8\":{\"source\":\"iana\"},\"audio/lpc\":{\"source\":\"iana\"},\"audio/melp\":{\"source\":\"iana\"},\"audio/melp1200\":{\"source\":\"iana\"},\"audio/melp2400\":{\"source\":\"iana\"},\"audio/melp600\":{\"source\":\"iana\"},\"audio/midi\":{\"source\":\"apache\",\"extensions\":[\"mid\",\"midi\",\"kar\",\"rmi\"]},\"audio/mobile-xmf\":{\"source\":\"iana\"},\"audio/mp3\":{\"compressible\":false,\"extensions\":[\"mp3\"]},\"audio/mp4\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"m4a\",\"mp4a\"]},\"audio/mp4a-latm\":{\"source\":\"iana\"},\"audio/mpa\":{\"source\":\"iana\"},\"audio/mpa-robust\":{\"source\":\"iana\"},\"audio/mpeg\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"mpga\",\"mp2\",\"mp2a\",\"mp3\",\"m2a\",\"m3a\"]},\"audio/mpeg4-generic\":{\"source\":\"iana\"},\"audio/musepack\":{\"source\":\"apache\"},\"audio/ogg\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"oga\",\"ogg\",\"spx\"]},\"audio/opus\":{\"source\":\"iana\"},\"audio/parityfec\":{\"source\":\"iana\"},\"audio/pcma\":{\"source\":\"iana\"},\"audio/pcma-wb\":{\"source\":\"iana\"},\"audio/pcmu\":{\"source\":\"iana\"},\"audio/pcmu-wb\":{\"source\":\"iana\"},\"audio/prs.sid\":{\"source\":\"iana\"},\"audio/qcelp\":{\"source\":\"iana\"},\"audio/raptorfec\":{\"source\":\"iana\"},\"audio/red\":{\"source\":\"iana\"},\"audio/rtp-enc-aescm128\":{\"source\":\"iana\"},\"audio/rtp-midi\":{\"source\":\"iana\"},\"audio/rtploopback\":{\"source\":\"iana\"},\"audio/rtx\":{\"source\":\"iana\"},\"audio/s3m\":{\"source\":\"apache\",\"extensions\":[\"s3m\"]},\"audio/silk\":{\"source\":\"apache\",\"extensions\":[\"sil\"]},\"audio/smv\":{\"source\":\"iana\"},\"audio/smv-qcp\":{\"source\":\"iana\"},\"audio/smv0\":{\"source\":\"iana\"},\"audio/sp-midi\":{\"source\":\"iana\"},\"audio/speex\":{\"source\":\"iana\"},\"audio/t140c\":{\"source\":\"iana\"},\"audio/t38\":{\"source\":\"iana\"},\"audio/telephone-event\":{\"source\":\"iana\"},\"audio/tone\":{\"source\":\"iana\"},\"audio/uemclip\":{\"source\":\"iana\"},\"audio/ulpfec\":{\"source\":\"iana\"},\"audio/usac\":{\"source\":\"iana\"},\"audio/vdvi\":{\"source\":\"iana\"},\"audio/vmr-wb\":{\"source\":\"iana\"},\"audio/vnd.3gpp.iufp\":{\"source\":\"iana\"},\"audio/vnd.4sb\":{\"source\":\"iana\"},\"audio/vnd.audiokoz\":{\"source\":\"iana\"},\"audio/vnd.celp\":{\"source\":\"iana\"},\"audio/vnd.cisco.nse\":{\"source\":\"iana\"},\"audio/vnd.cmles.radio-events\":{\"source\":\"iana\"},\"audio/vnd.cns.anp1\":{\"source\":\"iana\"},\"audio/vnd.cns.inf1\":{\"source\":\"iana\"},\"audio/vnd.dece.audio\":{\"source\":\"iana\",\"extensions\":[\"uva\",\"uvva\"]},\"audio/vnd.digital-winds\":{\"source\":\"iana\",\"extensions\":[\"eol\"]},\"audio/vnd.dlna.adts\":{\"source\":\"iana\"},\"audio/vnd.dolby.heaac.1\":{\"source\":\"iana\"},\"audio/vnd.dolby.heaac.2\":{\"source\":\"iana\"},\"audio/vnd.dolby.mlp\":{\"source\":\"iana\"},\"audio/vnd.dolby.mps\":{\"source\":\"iana\"},\"audio/vnd.dolby.pl2\":{\"source\":\"iana\"},\"audio/vnd.dolby.pl2x\":{\"source\":\"iana\"},\"audio/vnd.dolby.pl2z\":{\"source\":\"iana\"},\"audio/vnd.dolby.pulse.1\":{\"source\":\"iana\"},\"audio/vnd.dra\":{\"source\":\"iana\",\"extensions\":[\"dra\"]},\"audio/vnd.dts\":{\"source\":\"iana\",\"extensions\":[\"dts\"]},\"audio/vnd.dts.hd\":{\"source\":\"iana\",\"extensions\":[\"dtshd\"]},\"audio/vnd.dvb.file\":{\"source\":\"iana\"},\"audio/vnd.everad.plj\":{\"source\":\"iana\"},\"audio/vnd.hns.audio\":{\"source\":\"iana\"},\"audio/vnd.lucent.voice\":{\"source\":\"iana\",\"extensions\":[\"lvp\"]},\"audio/vnd.ms-playready.media.pya\":{\"source\":\"iana\",\"extensions\":[\"pya\"]},\"audio/vnd.nokia.mobile-xmf\":{\"source\":\"iana\"},\"audio/vnd.nortel.vbk\":{\"source\":\"iana\"},\"audio/vnd.nuera.ecelp4800\":{\"source\":\"iana\",\"extensions\":[\"ecelp4800\"]},\"audio/vnd.nuera.ecelp7470\":{\"source\":\"iana\",\"extensions\":[\"ecelp7470\"]},\"audio/vnd.nuera.ecelp9600\":{\"source\":\"iana\",\"extensions\":[\"ecelp9600\"]},\"audio/vnd.octel.sbc\":{\"source\":\"iana\"},\"audio/vnd.presonus.multitrack\":{\"source\":\"iana\"},\"audio/vnd.qcelp\":{\"source\":\"iana\"},\"audio/vnd.rhetorex.32kadpcm\":{\"source\":\"iana\"},\"audio/vnd.rip\":{\"source\":\"iana\",\"extensions\":[\"rip\"]},\"audio/vnd.rn-realaudio\":{\"compressible\":false},\"audio/vnd.sealedmedia.softseal.mpeg\":{\"source\":\"iana\"},\"audio/vnd.vmx.cvsd\":{\"source\":\"iana\"},\"audio/vnd.wave\":{\"compressible\":false},\"audio/vorbis\":{\"source\":\"iana\",\"compressible\":false},\"audio/vorbis-config\":{\"source\":\"iana\"},\"audio/wav\":{\"compressible\":false,\"extensions\":[\"wav\"]},\"audio/wave\":{\"compressible\":false,\"extensions\":[\"wav\"]},\"audio/webm\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"weba\"]},\"audio/x-aac\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"aac\"]},\"audio/x-aiff\":{\"source\":\"apache\",\"extensions\":[\"aif\",\"aiff\",\"aifc\"]},\"audio/x-caf\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"caf\"]},\"audio/x-flac\":{\"source\":\"apache\",\"extensions\":[\"flac\"]},\"audio/x-m4a\":{\"source\":\"nginx\",\"extensions\":[\"m4a\"]},\"audio/x-matroska\":{\"source\":\"apache\",\"extensions\":[\"mka\"]},\"audio/x-mpegurl\":{\"source\":\"apache\",\"extensions\":[\"m3u\"]},\"audio/x-ms-wax\":{\"source\":\"apache\",\"extensions\":[\"wax\"]},\"audio/x-ms-wma\":{\"source\":\"apache\",\"extensions\":[\"wma\"]},\"audio/x-pn-realaudio\":{\"source\":\"apache\",\"extensions\":[\"ram\",\"ra\"]},\"audio/x-pn-realaudio-plugin\":{\"source\":\"apache\",\"extensions\":[\"rmp\"]},\"audio/x-realaudio\":{\"source\":\"nginx\",\"extensions\":[\"ra\"]},\"audio/x-tta\":{\"source\":\"apache\"},\"audio/x-wav\":{\"source\":\"apache\",\"extensions\":[\"wav\"]},\"audio/xm\":{\"source\":\"apache\",\"extensions\":[\"xm\"]},\"chemical/x-cdx\":{\"source\":\"apache\",\"extensions\":[\"cdx\"]},\"chemical/x-cif\":{\"source\":\"apache\",\"extensions\":[\"cif\"]},\"chemical/x-cmdf\":{\"source\":\"apache\",\"extensions\":[\"cmdf\"]},\"chemical/x-cml\":{\"source\":\"apache\",\"extensions\":[\"cml\"]},\"chemical/x-csml\":{\"source\":\"apache\",\"extensions\":[\"csml\"]},\"chemical/x-pdb\":{\"source\":\"apache\"},\"chemical/x-xyz\":{\"source\":\"apache\",\"extensions\":[\"xyz\"]},\"font/collection\":{\"source\":\"iana\",\"extensions\":[\"ttc\"]},\"font/otf\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"otf\"]},\"font/sfnt\":{\"source\":\"iana\"},\"font/ttf\":{\"source\":\"iana\",\"extensions\":[\"ttf\"]},\"font/woff\":{\"source\":\"iana\",\"extensions\":[\"woff\"]},\"font/woff2\":{\"source\":\"iana\",\"extensions\":[\"woff2\"]},\"image/aces\":{\"source\":\"iana\"},\"image/apng\":{\"compressible\":false,\"extensions\":[\"apng\"]},\"image/bmp\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"bmp\"]},\"image/cgm\":{\"source\":\"iana\",\"extensions\":[\"cgm\"]},\"image/dicom-rle\":{\"source\":\"iana\"},\"image/emf\":{\"source\":\"iana\"},\"image/fits\":{\"source\":\"iana\"},\"image/g3fax\":{\"source\":\"iana\",\"extensions\":[\"g3\"]},\"image/gif\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"gif\"]},\"image/ief\":{\"source\":\"iana\",\"extensions\":[\"ief\"]},\"image/jls\":{\"source\":\"iana\"},\"image/jp2\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"jp2\",\"jpg2\"]},\"image/jpeg\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"jpeg\",\"jpg\",\"jpe\"]},\"image/jpm\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"jpm\"]},\"image/jpx\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"jpx\",\"jpf\"]},\"image/ktx\":{\"source\":\"iana\",\"extensions\":[\"ktx\"]},\"image/naplps\":{\"source\":\"iana\"},\"image/pjpeg\":{\"compressible\":false},\"image/png\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"png\"]},\"image/prs.btif\":{\"source\":\"iana\",\"extensions\":[\"btif\"]},\"image/prs.pti\":{\"source\":\"iana\"},\"image/pwg-raster\":{\"source\":\"iana\"},\"image/sgi\":{\"source\":\"apache\",\"extensions\":[\"sgi\"]},\"image/svg+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"svg\",\"svgz\"]},\"image/t38\":{\"source\":\"iana\"},\"image/tiff\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"tiff\",\"tif\"]},\"image/tiff-fx\":{\"source\":\"iana\"},\"image/vnd.adobe.photoshop\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"psd\"]},\"image/vnd.airzip.accelerator.azv\":{\"source\":\"iana\"},\"image/vnd.cns.inf2\":{\"source\":\"iana\"},\"image/vnd.dece.graphic\":{\"source\":\"iana\",\"extensions\":[\"uvi\",\"uvvi\",\"uvg\",\"uvvg\"]},\"image/vnd.djvu\":{\"source\":\"iana\",\"extensions\":[\"djvu\",\"djv\"]},\"image/vnd.dvb.subtitle\":{\"source\":\"iana\",\"extensions\":[\"sub\"]},\"image/vnd.dwg\":{\"source\":\"iana\",\"extensions\":[\"dwg\"]},\"image/vnd.dxf\":{\"source\":\"iana\",\"extensions\":[\"dxf\"]},\"image/vnd.fastbidsheet\":{\"source\":\"iana\",\"extensions\":[\"fbs\"]},\"image/vnd.fpx\":{\"source\":\"iana\",\"extensions\":[\"fpx\"]},\"image/vnd.fst\":{\"source\":\"iana\",\"extensions\":[\"fst\"]},\"image/vnd.fujixerox.edmics-mmr\":{\"source\":\"iana\",\"extensions\":[\"mmr\"]},\"image/vnd.fujixerox.edmics-rlc\":{\"source\":\"iana\",\"extensions\":[\"rlc\"]},\"image/vnd.globalgraphics.pgb\":{\"source\":\"iana\"},\"image/vnd.microsoft.icon\":{\"source\":\"iana\"},\"image/vnd.mix\":{\"source\":\"iana\"},\"image/vnd.mozilla.apng\":{\"source\":\"iana\"},\"image/vnd.ms-modi\":{\"source\":\"iana\",\"extensions\":[\"mdi\"]},\"image/vnd.ms-photo\":{\"source\":\"apache\",\"extensions\":[\"wdp\"]},\"image/vnd.net-fpx\":{\"source\":\"iana\",\"extensions\":[\"npx\"]},\"image/vnd.radiance\":{\"source\":\"iana\"},\"image/vnd.sealed.png\":{\"source\":\"iana\"},\"image/vnd.sealedmedia.softseal.gif\":{\"source\":\"iana\"},\"image/vnd.sealedmedia.softseal.jpg\":{\"source\":\"iana\"},\"image/vnd.svf\":{\"source\":\"iana\"},\"image/vnd.tencent.tap\":{\"source\":\"iana\"},\"image/vnd.valve.source.texture\":{\"source\":\"iana\"},\"image/vnd.wap.wbmp\":{\"source\":\"iana\",\"extensions\":[\"wbmp\"]},\"image/vnd.xiff\":{\"source\":\"iana\",\"extensions\":[\"xif\"]},\"image/vnd.zbrush.pcx\":{\"source\":\"iana\"},\"image/webp\":{\"source\":\"apache\",\"extensions\":[\"webp\"]},\"image/wmf\":{\"source\":\"iana\"},\"image/x-3ds\":{\"source\":\"apache\",\"extensions\":[\"3ds\"]},\"image/x-cmu-raster\":{\"source\":\"apache\",\"extensions\":[\"ras\"]},\"image/x-cmx\":{\"source\":\"apache\",\"extensions\":[\"cmx\"]},\"image/x-freehand\":{\"source\":\"apache\",\"extensions\":[\"fh\",\"fhc\",\"fh4\",\"fh5\",\"fh7\"]},\"image/x-icon\":{\"source\":\"apache\",\"compressible\":true,\"extensions\":[\"ico\"]},\"image/x-jng\":{\"source\":\"nginx\",\"extensions\":[\"jng\"]},\"image/x-mrsid-image\":{\"source\":\"apache\",\"extensions\":[\"sid\"]},\"image/x-ms-bmp\":{\"source\":\"nginx\",\"compressible\":true,\"extensions\":[\"bmp\"]},\"image/x-pcx\":{\"source\":\"apache\",\"extensions\":[\"pcx\"]},\"image/x-pict\":{\"source\":\"apache\",\"extensions\":[\"pic\",\"pct\"]},\"image/x-portable-anymap\":{\"source\":\"apache\",\"extensions\":[\"pnm\"]},\"image/x-portable-bitmap\":{\"source\":\"apache\",\"extensions\":[\"pbm\"]},\"image/x-portable-graymap\":{\"source\":\"apache\",\"extensions\":[\"pgm\"]},\"image/x-portable-pixmap\":{\"source\":\"apache\",\"extensions\":[\"ppm\"]},\"image/x-rgb\":{\"source\":\"apache\",\"extensions\":[\"rgb\"]},\"image/x-tga\":{\"source\":\"apache\",\"extensions\":[\"tga\"]},\"image/x-xbitmap\":{\"source\":\"apache\",\"extensions\":[\"xbm\"]},\"image/x-xcf\":{\"compressible\":false},\"image/x-xpixmap\":{\"source\":\"apache\",\"extensions\":[\"xpm\"]},\"image/x-xwindowdump\":{\"source\":\"apache\",\"extensions\":[\"xwd\"]},\"message/cpim\":{\"source\":\"iana\"},\"message/delivery-status\":{\"source\":\"iana\"},\"message/disposition-notification\":{\"source\":\"iana\",\"extensions\":[\"disposition-notification\"]},\"message/external-body\":{\"source\":\"iana\"},\"message/feedback-report\":{\"source\":\"iana\"},\"message/global\":{\"source\":\"iana\",\"extensions\":[\"u8msg\"]},\"message/global-delivery-status\":{\"source\":\"iana\",\"extensions\":[\"u8dsn\"]},\"message/global-disposition-notification\":{\"source\":\"iana\",\"extensions\":[\"u8mdn\"]},\"message/global-headers\":{\"source\":\"iana\",\"extensions\":[\"u8hdr\"]},\"message/http\":{\"source\":\"iana\",\"compressible\":false},\"message/imdn+xml\":{\"source\":\"iana\",\"compressible\":true},\"message/news\":{\"source\":\"iana\"},\"message/partial\":{\"source\":\"iana\",\"compressible\":false},\"message/rfc822\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"eml\",\"mime\"]},\"message/s-http\":{\"source\":\"iana\"},\"message/sip\":{\"source\":\"iana\"},\"message/sipfrag\":{\"source\":\"iana\"},\"message/tracking-status\":{\"source\":\"iana\"},\"message/vnd.si.simp\":{\"source\":\"iana\"},\"message/vnd.wfa.wsc\":{\"source\":\"iana\",\"extensions\":[\"wsc\"]},\"model/3mf\":{\"source\":\"iana\"},\"model/gltf+json\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"gltf\"]},\"model/gltf-binary\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"glb\"]},\"model/iges\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"igs\",\"iges\"]},\"model/mesh\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"msh\",\"mesh\",\"silo\"]},\"model/stl\":{\"source\":\"iana\"},\"model/vnd.collada+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"dae\"]},\"model/vnd.dwf\":{\"source\":\"iana\",\"extensions\":[\"dwf\"]},\"model/vnd.flatland.3dml\":{\"source\":\"iana\"},\"model/vnd.gdl\":{\"source\":\"iana\",\"extensions\":[\"gdl\"]},\"model/vnd.gs-gdl\":{\"source\":\"apache\"},\"model/vnd.gs.gdl\":{\"source\":\"iana\"},\"model/vnd.gtw\":{\"source\":\"iana\",\"extensions\":[\"gtw\"]},\"model/vnd.moml+xml\":{\"source\":\"iana\",\"compressible\":true},\"model/vnd.mts\":{\"source\":\"iana\",\"extensions\":[\"mts\"]},\"model/vnd.opengex\":{\"source\":\"iana\"},\"model/vnd.parasolid.transmit.binary\":{\"source\":\"iana\"},\"model/vnd.parasolid.transmit.text\":{\"source\":\"iana\"},\"model/vnd.rosette.annotated-data-model\":{\"source\":\"iana\"},\"model/vnd.usdz+zip\":{\"source\":\"iana\",\"compressible\":false},\"model/vnd.valve.source.compiled-map\":{\"source\":\"iana\"},\"model/vnd.vtu\":{\"source\":\"iana\",\"extensions\":[\"vtu\"]},\"model/vrml\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"wrl\",\"vrml\"]},\"model/x3d+binary\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"x3db\",\"x3dbz\"]},\"model/x3d+fastinfoset\":{\"source\":\"iana\"},\"model/x3d+vrml\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"x3dv\",\"x3dvz\"]},\"model/x3d+xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"x3d\",\"x3dz\"]},\"model/x3d-vrml\":{\"source\":\"iana\"},\"multipart/alternative\":{\"source\":\"iana\",\"compressible\":false},\"multipart/appledouble\":{\"source\":\"iana\"},\"multipart/byteranges\":{\"source\":\"iana\"},\"multipart/digest\":{\"source\":\"iana\"},\"multipart/encrypted\":{\"source\":\"iana\",\"compressible\":false},\"multipart/form-data\":{\"source\":\"iana\",\"compressible\":false},\"multipart/header-set\":{\"source\":\"iana\"},\"multipart/mixed\":{\"source\":\"iana\",\"compressible\":false},\"multipart/multilingual\":{\"source\":\"iana\"},\"multipart/parallel\":{\"source\":\"iana\"},\"multipart/related\":{\"source\":\"iana\",\"compressible\":false},\"multipart/report\":{\"source\":\"iana\"},\"multipart/signed\":{\"source\":\"iana\",\"compressible\":false},\"multipart/vnd.bint.med-plus\":{\"source\":\"iana\"},\"multipart/voice-message\":{\"source\":\"iana\"},\"multipart/x-mixed-replace\":{\"source\":\"iana\"},\"text/1d-interleaved-parityfec\":{\"source\":\"iana\"},\"text/cache-manifest\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"appcache\",\"manifest\"]},\"text/calendar\":{\"source\":\"iana\",\"extensions\":[\"ics\",\"ifb\"]},\"text/calender\":{\"compressible\":true},\"text/cmd\":{\"compressible\":true},\"text/coffeescript\":{\"extensions\":[\"coffee\",\"litcoffee\"]},\"text/css\":{\"source\":\"iana\",\"charset\":\"UTF-8\",\"compressible\":true,\"extensions\":[\"css\"]},\"text/csv\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"csv\"]},\"text/csv-schema\":{\"source\":\"iana\"},\"text/directory\":{\"source\":\"iana\"},\"text/dns\":{\"source\":\"iana\"},\"text/ecmascript\":{\"source\":\"iana\"},\"text/encaprtp\":{\"source\":\"iana\"},\"text/enriched\":{\"source\":\"iana\"},\"text/fwdred\":{\"source\":\"iana\"},\"text/grammar-ref-list\":{\"source\":\"iana\"},\"text/html\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"html\",\"htm\",\"shtml\"]},\"text/jade\":{\"extensions\":[\"jade\"]},\"text/javascript\":{\"source\":\"iana\",\"compressible\":true},\"text/jcr-cnd\":{\"source\":\"iana\"},\"text/jsx\":{\"compressible\":true,\"extensions\":[\"jsx\"]},\"text/less\":{\"extensions\":[\"less\"]},\"text/markdown\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"markdown\",\"md\"]},\"text/mathml\":{\"source\":\"nginx\",\"extensions\":[\"mml\"]},\"text/mizar\":{\"source\":\"iana\"},\"text/n3\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"n3\"]},\"text/parameters\":{\"source\":\"iana\"},\"text/parityfec\":{\"source\":\"iana\"},\"text/plain\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"txt\",\"text\",\"conf\",\"def\",\"list\",\"log\",\"in\",\"ini\"]},\"text/provenance-notation\":{\"source\":\"iana\"},\"text/prs.fallenstein.rst\":{\"source\":\"iana\"},\"text/prs.lines.tag\":{\"source\":\"iana\",\"extensions\":[\"dsc\"]},\"text/prs.prop.logic\":{\"source\":\"iana\"},\"text/raptorfec\":{\"source\":\"iana\"},\"text/red\":{\"source\":\"iana\"},\"text/rfc822-headers\":{\"source\":\"iana\"},\"text/richtext\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"rtx\"]},\"text/rtf\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"rtf\"]},\"text/rtp-enc-aescm128\":{\"source\":\"iana\"},\"text/rtploopback\":{\"source\":\"iana\"},\"text/rtx\":{\"source\":\"iana\"},\"text/sgml\":{\"source\":\"iana\",\"extensions\":[\"sgml\",\"sgm\"]},\"text/shex\":{\"extensions\":[\"shex\"]},\"text/slim\":{\"extensions\":[\"slim\",\"slm\"]},\"text/strings\":{\"source\":\"iana\"},\"text/stylus\":{\"extensions\":[\"stylus\",\"styl\"]},\"text/t140\":{\"source\":\"iana\"},\"text/tab-separated-values\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"tsv\"]},\"text/troff\":{\"source\":\"iana\",\"extensions\":[\"t\",\"tr\",\"roff\",\"man\",\"me\",\"ms\"]},\"text/turtle\":{\"source\":\"iana\",\"charset\":\"UTF-8\",\"extensions\":[\"ttl\"]},\"text/ulpfec\":{\"source\":\"iana\"},\"text/uri-list\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"uri\",\"uris\",\"urls\"]},\"text/vcard\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"vcard\"]},\"text/vnd.a\":{\"source\":\"iana\"},\"text/vnd.abc\":{\"source\":\"iana\"},\"text/vnd.ascii-art\":{\"source\":\"iana\"},\"text/vnd.curl\":{\"source\":\"iana\",\"extensions\":[\"curl\"]},\"text/vnd.curl.dcurl\":{\"source\":\"apache\",\"extensions\":[\"dcurl\"]},\"text/vnd.curl.mcurl\":{\"source\":\"apache\",\"extensions\":[\"mcurl\"]},\"text/vnd.curl.scurl\":{\"source\":\"apache\",\"extensions\":[\"scurl\"]},\"text/vnd.debian.copyright\":{\"source\":\"iana\"},\"text/vnd.dmclientscript\":{\"source\":\"iana\"},\"text/vnd.dvb.subtitle\":{\"source\":\"iana\",\"extensions\":[\"sub\"]},\"text/vnd.esmertec.theme-descriptor\":{\"source\":\"iana\"},\"text/vnd.fly\":{\"source\":\"iana\",\"extensions\":[\"fly\"]},\"text/vnd.fmi.flexstor\":{\"source\":\"iana\",\"extensions\":[\"flx\"]},\"text/vnd.gml\":{\"source\":\"iana\"},\"text/vnd.graphviz\":{\"source\":\"iana\",\"extensions\":[\"gv\"]},\"text/vnd.hgl\":{\"source\":\"iana\"},\"text/vnd.in3d.3dml\":{\"source\":\"iana\",\"extensions\":[\"3dml\"]},\"text/vnd.in3d.spot\":{\"source\":\"iana\",\"extensions\":[\"spot\"]},\"text/vnd.iptc.newsml\":{\"source\":\"iana\"},\"text/vnd.iptc.nitf\":{\"source\":\"iana\"},\"text/vnd.latex-z\":{\"source\":\"iana\"},\"text/vnd.motorola.reflex\":{\"source\":\"iana\"},\"text/vnd.ms-mediapackage\":{\"source\":\"iana\"},\"text/vnd.net2phone.commcenter.command\":{\"source\":\"iana\"},\"text/vnd.radisys.msml-basic-layout\":{\"source\":\"iana\"},\"text/vnd.si.uricatalogue\":{\"source\":\"iana\"},\"text/vnd.sun.j2me.app-descriptor\":{\"source\":\"iana\",\"extensions\":[\"jad\"]},\"text/vnd.trolltech.linguist\":{\"source\":\"iana\"},\"text/vnd.wap.si\":{\"source\":\"iana\"},\"text/vnd.wap.sl\":{\"source\":\"iana\"},\"text/vnd.wap.wml\":{\"source\":\"iana\",\"extensions\":[\"wml\"]},\"text/vnd.wap.wmlscript\":{\"source\":\"iana\",\"extensions\":[\"wmls\"]},\"text/vtt\":{\"charset\":\"UTF-8\",\"compressible\":true,\"extensions\":[\"vtt\"]},\"text/x-asm\":{\"source\":\"apache\",\"extensions\":[\"s\",\"asm\"]},\"text/x-c\":{\"source\":\"apache\",\"extensions\":[\"c\",\"cc\",\"cxx\",\"cpp\",\"h\",\"hh\",\"dic\"]},\"text/x-component\":{\"source\":\"nginx\",\"extensions\":[\"htc\"]},\"text/x-fortran\":{\"source\":\"apache\",\"extensions\":[\"f\",\"for\",\"f77\",\"f90\"]},\"text/x-gwt-rpc\":{\"compressible\":true},\"text/x-handlebars-template\":{\"extensions\":[\"hbs\"]},\"text/x-java-source\":{\"source\":\"apache\",\"extensions\":[\"java\"]},\"text/x-jquery-tmpl\":{\"compressible\":true},\"text/x-lua\":{\"extensions\":[\"lua\"]},\"text/x-markdown\":{\"compressible\":true,\"extensions\":[\"mkd\"]},\"text/x-nfo\":{\"source\":\"apache\",\"extensions\":[\"nfo\"]},\"text/x-opml\":{\"source\":\"apache\",\"extensions\":[\"opml\"]},\"text/x-org\":{\"compressible\":true,\"extensions\":[\"org\"]},\"text/x-pascal\":{\"source\":\"apache\",\"extensions\":[\"p\",\"pas\"]},\"text/x-processing\":{\"compressible\":true,\"extensions\":[\"pde\"]},\"text/x-sass\":{\"extensions\":[\"sass\"]},\"text/x-scss\":{\"extensions\":[\"scss\"]},\"text/x-setext\":{\"source\":\"apache\",\"extensions\":[\"etx\"]},\"text/x-sfv\":{\"source\":\"apache\",\"extensions\":[\"sfv\"]},\"text/x-suse-ymp\":{\"compressible\":true,\"extensions\":[\"ymp\"]},\"text/x-uuencode\":{\"source\":\"apache\",\"extensions\":[\"uu\"]},\"text/x-vcalendar\":{\"source\":\"apache\",\"extensions\":[\"vcs\"]},\"text/x-vcard\":{\"source\":\"apache\",\"extensions\":[\"vcf\"]},\"text/xml\":{\"source\":\"iana\",\"compressible\":true,\"extensions\":[\"xml\"]},\"text/xml-external-parsed-entity\":{\"source\":\"iana\"},\"text/yaml\":{\"extensions\":[\"yaml\",\"yml\"]},\"video/1d-interleaved-parityfec\":{\"source\":\"iana\"},\"video/3gpp\":{\"source\":\"iana\",\"extensions\":[\"3gp\",\"3gpp\"]},\"video/3gpp-tt\":{\"source\":\"iana\"},\"video/3gpp2\":{\"source\":\"iana\",\"extensions\":[\"3g2\"]},\"video/bmpeg\":{\"source\":\"iana\"},\"video/bt656\":{\"source\":\"iana\"},\"video/celb\":{\"source\":\"iana\"},\"video/dv\":{\"source\":\"iana\"},\"video/encaprtp\":{\"source\":\"iana\"},\"video/h261\":{\"source\":\"iana\",\"extensions\":[\"h261\"]},\"video/h263\":{\"source\":\"iana\",\"extensions\":[\"h263\"]},\"video/h263-1998\":{\"source\":\"iana\"},\"video/h263-2000\":{\"source\":\"iana\"},\"video/h264\":{\"source\":\"iana\",\"extensions\":[\"h264\"]},\"video/h264-rcdo\":{\"source\":\"iana\"},\"video/h264-svc\":{\"source\":\"iana\"},\"video/h265\":{\"source\":\"iana\"},\"video/iso.segment\":{\"source\":\"iana\"},\"video/jpeg\":{\"source\":\"iana\",\"extensions\":[\"jpgv\"]},\"video/jpeg2000\":{\"source\":\"iana\"},\"video/jpm\":{\"source\":\"apache\",\"extensions\":[\"jpm\",\"jpgm\"]},\"video/mj2\":{\"source\":\"iana\",\"extensions\":[\"mj2\",\"mjp2\"]},\"video/mp1s\":{\"source\":\"iana\"},\"video/mp2p\":{\"source\":\"iana\"},\"video/mp2t\":{\"source\":\"iana\",\"extensions\":[\"ts\"]},\"video/mp4\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"mp4\",\"mp4v\",\"mpg4\"]},\"video/mp4v-es\":{\"source\":\"iana\"},\"video/mpeg\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"mpeg\",\"mpg\",\"mpe\",\"m1v\",\"m2v\"]},\"video/mpeg4-generic\":{\"source\":\"iana\"},\"video/mpv\":{\"source\":\"iana\"},\"video/nv\":{\"source\":\"iana\"},\"video/ogg\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"ogv\"]},\"video/parityfec\":{\"source\":\"iana\"},\"video/pointer\":{\"source\":\"iana\"},\"video/quicktime\":{\"source\":\"iana\",\"compressible\":false,\"extensions\":[\"qt\",\"mov\"]},\"video/raptorfec\":{\"source\":\"iana\"},\"video/raw\":{\"source\":\"iana\"},\"video/rtp-enc-aescm128\":{\"source\":\"iana\"},\"video/rtploopback\":{\"source\":\"iana\"},\"video/rtx\":{\"source\":\"iana\"},\"video/smpte291\":{\"source\":\"iana\"},\"video/smpte292m\":{\"source\":\"iana\"},\"video/ulpfec\":{\"source\":\"iana\"},\"video/vc1\":{\"source\":\"iana\"},\"video/vnd.cctv\":{\"source\":\"iana\"},\"video/vnd.dece.hd\":{\"source\":\"iana\",\"extensions\":[\"uvh\",\"uvvh\"]},\"video/vnd.dece.mobile\":{\"source\":\"iana\",\"extensions\":[\"uvm\",\"uvvm\"]},\"video/vnd.dece.mp4\":{\"source\":\"iana\"},\"video/vnd.dece.pd\":{\"source\":\"iana\",\"extensions\":[\"uvp\",\"uvvp\"]},\"video/vnd.dece.sd\":{\"source\":\"iana\",\"extensions\":[\"uvs\",\"uvvs\"]},\"video/vnd.dece.video\":{\"source\":\"iana\",\"extensions\":[\"uvv\",\"uvvv\"]},\"video/vnd.directv.mpeg\":{\"source\":\"iana\"},\"video/vnd.directv.mpeg-tts\":{\"source\":\"iana\"},\"video/vnd.dlna.mpeg-tts\":{\"source\":\"iana\"},\"video/vnd.dvb.file\":{\"source\":\"iana\",\"extensions\":[\"dvb\"]},\"video/vnd.fvt\":{\"source\":\"iana\",\"extensions\":[\"fvt\"]},\"video/vnd.hns.video\":{\"source\":\"iana\"},\"video/vnd.iptvforum.1dparityfec-1010\":{\"source\":\"iana\"},\"video/vnd.iptvforum.1dparityfec-2005\":{\"source\":\"iana\"},\"video/vnd.iptvforum.2dparityfec-1010\":{\"source\":\"iana\"},\"video/vnd.iptvforum.2dparityfec-2005\":{\"source\":\"iana\"},\"video/vnd.iptvforum.ttsavc\":{\"source\":\"iana\"},\"video/vnd.iptvforum.ttsmpeg2\":{\"source\":\"iana\"},\"video/vnd.motorola.video\":{\"source\":\"iana\"},\"video/vnd.motorola.videop\":{\"source\":\"iana\"},\"video/vnd.mpegurl\":{\"source\":\"iana\",\"extensions\":[\"mxu\",\"m4u\"]},\"video/vnd.ms-playready.media.pyv\":{\"source\":\"iana\",\"extensions\":[\"pyv\"]},\"video/vnd.nokia.interleaved-multimedia\":{\"source\":\"iana\"},\"video/vnd.nokia.mp4vr\":{\"source\":\"iana\"},\"video/vnd.nokia.videovoip\":{\"source\":\"iana\"},\"video/vnd.objectvideo\":{\"source\":\"iana\"},\"video/vnd.radgamettools.bink\":{\"source\":\"iana\"},\"video/vnd.radgamettools.smacker\":{\"source\":\"iana\"},\"video/vnd.sealed.mpeg1\":{\"source\":\"iana\"},\"video/vnd.sealed.mpeg4\":{\"source\":\"iana\"},\"video/vnd.sealed.swf\":{\"source\":\"iana\"},\"video/vnd.sealedmedia.softseal.mov\":{\"source\":\"iana\"},\"video/vnd.uvvu.mp4\":{\"source\":\"iana\",\"extensions\":[\"uvu\",\"uvvu\"]},\"video/vnd.vivo\":{\"source\":\"iana\",\"extensions\":[\"viv\"]},\"video/vp8\":{\"source\":\"iana\"},\"video/webm\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"webm\"]},\"video/x-f4v\":{\"source\":\"apache\",\"extensions\":[\"f4v\"]},\"video/x-fli\":{\"source\":\"apache\",\"extensions\":[\"fli\"]},\"video/x-flv\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"flv\"]},\"video/x-m4v\":{\"source\":\"apache\",\"extensions\":[\"m4v\"]},\"video/x-matroska\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"mkv\",\"mk3d\",\"mks\"]},\"video/x-mng\":{\"source\":\"apache\",\"extensions\":[\"mng\"]},\"video/x-ms-asf\":{\"source\":\"apache\",\"extensions\":[\"asf\",\"asx\"]},\"video/x-ms-vob\":{\"source\":\"apache\",\"extensions\":[\"vob\"]},\"video/x-ms-wm\":{\"source\":\"apache\",\"extensions\":[\"wm\"]},\"video/x-ms-wmv\":{\"source\":\"apache\",\"compressible\":false,\"extensions\":[\"wmv\"]},\"video/x-ms-wmx\":{\"source\":\"apache\",\"extensions\":[\"wmx\"]},\"video/x-ms-wvx\":{\"source\":\"apache\",\"extensions\":[\"wvx\"]},\"video/x-msvideo\":{\"source\":\"apache\",\"extensions\":[\"avi\"]},\"video/x-sgi-movie\":{\"source\":\"apache\",\"extensions\":[\"movie\"]},\"video/x-smv\":{\"source\":\"apache\",\"extensions\":[\"smv\"]},\"x-conference/x-cooltalk\":{\"source\":\"apache\",\"extensions\":[\"ice\"]},\"x-shader/x-fragment\":{\"compressible\":true},\"x-shader/x-vertex\":{\"compressible\":true}}\n\n/***/ }),\n/* 759 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*!\n * mime-db\n * Copyright(c) 2014 Jonathan Ong\n * MIT Licensed\n */\n\n/**\n * Module exports.\n */\n\nmodule.exports = __webpack_require__(758)\n\n\n/***/ }),\n/* 760 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = (to, from) => {\n\t// TODO: use `Reflect.ownKeys()` when targeting Node.js 6\n\tfor (const prop of Object.getOwnPropertyNames(from).concat(Object.getOwnPropertySymbols(from))) {\n\t\tObject.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop));\n\t}\n\n\treturn to;\n};\n\n\n/***/ }),\n/* 761 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nconst mkdirp = __webpack_require__(146)\n\nmodule.exports = function (dir, opts) {\n  return new Promise((resolve, reject) => {\n    mkdirp(dir, opts, (err, made) => err === null ? resolve(made) : reject(err))\n  })\n}\n\n\n/***/ }),\n/* 762 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar Promise = __webpack_require__(339)\nvar fs\ntry {\n  fs = __webpack_require__(385)\n} catch(err) {\n  fs = __webpack_require__(4)\n}\n\nvar api = [\n  'appendFile',\n  'chmod',\n  'chown',\n  'close',\n  'fchmod',\n  'fchown',\n  'fdatasync',\n  'fstat',\n  'fsync',\n  'ftruncate',\n  'futimes',\n  'lchown',\n  'link',\n  'lstat',\n  'mkdir',\n  'open',\n  'read',\n  'readFile',\n  'readdir',\n  'readlink',\n  'realpath',\n  'rename',\n  'rmdir',\n  'stat',\n  'symlink',\n  'truncate',\n  'unlink',\n  'utimes',\n  'write',\n  'writeFile'\n]\n\ntypeof fs.access === 'function' && api.push('access')\ntypeof fs.copyFile === 'function' && api.push('copyFile')\ntypeof fs.mkdtemp === 'function' && api.push('mkdtemp')\n\n__webpack_require__(951).withCallback(fs, exports, api)\n\nexports.exists = function (filename, callback) {\n  // callback\n  if (typeof callback === 'function') {\n    return fs.stat(filename, function (err) {\n      callback(null, !err);\n    })\n  }\n  // or promise\n  return new Promise(function (resolve) {\n    fs.stat(filename, function (err) {\n      resolve(!err)\n    })\n  })\n}\n\n\n/***/ }),\n/* 763 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*jslint node: true*/\nvar toArray = __webpack_require__(750);\nvar emojiByName = __webpack_require__(764);\n\n\"use strict\";\n\n/**\n * regex to parse emoji in a string - finds emoji, e.g. :coffee:\n */\nvar emojiNameRegex = /:([a-zA-Z0-9_\\-\\+]+):/g;\n\n/**\n * regex to trim whitespace\n * use instead of String.prototype.trim() for IE8 supprt\n */\nvar trimSpaceRegex = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\n/**\n * Removes colons on either side\n * of the string if present\n * @param  {string} str\n * @return {string}\n */\nfunction stripColons (str) {\n  var colonIndex = str.indexOf(':');\n  if (colonIndex > -1) {\n    // :emoji: (http://www.emoji-cheat-sheet.com/)\n    if (colonIndex === str.length - 1) {\n      str = str.substring(0, colonIndex);\n      return stripColons(str);\n    } else {\n      str = str.substr(colonIndex + 1);\n      return stripColons(str);\n    }\n  }\n\n  return str;\n}\n\n/**\n * Adds colons to either side\n * of the string\n * @param {string} str\n * @return {string}\n */\nfunction wrapColons (str) {\n  return (typeof str === 'string' && str.length > 0) ? ':' + str + ':' : str;\n}\n\n/**\n * Ensure that the word is wrapped in colons\n * by only adding them, if they are not there.\n * @param {string} str\n * @return {string}\n */\nfunction ensureColons (str) {\n  return (typeof str === 'string' && str[0] !== ':') ? wrapColons(str) : str;\n}\n\n// Non spacing mark, some emoticons have them. It's the 'Variant Form',\n// which provides more information so that emoticons can be rendered as\n// more colorful graphics. FE0E is a unicode text version, where as FE0F\n// should be rendered as a graphical version. The code gracefully degrades.\nvar NON_SPACING_MARK = String.fromCharCode(65039); // 65039 - '️' - 0xFE0F;\nvar nonSpacingRegex = new RegExp(NON_SPACING_MARK, 'g')\n\n// Remove the non-spacing-mark from the code, never send a stripped version\n// to the client, as it kills graphical emoticons.\nfunction stripNSB (code) {\n  return code.replace(nonSpacingRegex, '');\n};\n\n// Reversed hash table, where as emojiByName contains a { heart: '❤' }\n// dictionary emojiByCode contains { ❤: 'heart' }. The codes are normalized\n// to the text version.\nvar emojiByCode = Object.keys(emojiByName).reduce(function(h,k) {\n  h[stripNSB(emojiByName[k])] = k;\n  return h;\n}, {});\n\n/**\n * Emoji namespace\n */\nvar Emoji = {\n  emoji: emojiByName,\n};\n\n/**\n * get emoji code from name\n * @param  {string} emoji\n * @return {string}\n */\nEmoji._get = function _get (emoji) {\n  if (emojiByName.hasOwnProperty(emoji)) {\n    return emojiByName[emoji];\n  }\n\n  return ensureColons(emoji);\n};\n\n/**\n * get emoji code from :emoji: string or name\n * @param  {string} emoji\n * @return {string}\n */\nEmoji.get = function get (emoji) {\n  emoji = stripColons(emoji);\n\n  return Emoji._get(emoji);\n};\n\n/**\n * find the emoji by either code or name\n * @param {string} nameOrCode The emoji to find, either `coffee`, `:coffee:` or `☕`;\n * @return {object}\n */\nEmoji.find = function find (nameOrCode) {\n  return Emoji.findByName(nameOrCode) || Emoji.findByCode(nameOrCode);\n};\n\n/**\n * find the emoji by name\n * @param {string} name The emoji to find either `coffee` or `:coffee:`;\n * @return {object}\n */\nEmoji.findByName = function findByName (name) {\n  var stripped = stripColons(name);\n  var emoji = emojiByName[stripped];\n\n  return emoji ? ({ emoji: emoji, key: stripped }) : undefined;\n};\n\n/**\n * find the emoji by code (emoji)\n * @param {string} code The emoji to find; for example `☕` or `☔`\n * @return {object}\n */\nEmoji.findByCode = function findByCode (code) {\n  var stripped = stripNSB(code);\n  var name = emojiByCode[stripped];\n\n  // lookup emoji to ensure the Variant Form is returned\n  return name ? ({ emoji: emojiByName[name], key: name }) : undefined;\n};\n\n\n/**\n * Check if an emoji is known by this library\n * @param {string} nameOrCode The emoji to validate, either `coffee`, `:coffee:` or `☕`;\n * @return {object}\n */\nEmoji.hasEmoji = function hasEmoji (nameOrCode) {\n  return Emoji.hasEmojiByName(nameOrCode) || Emoji.hasEmojiByCode(nameOrCode);\n};\n\n/**\n * Check if an emoji with given name is known by this library\n * @param {string} name The emoji to validate either `coffee` or `:coffee:`;\n * @return {object}\n */\nEmoji.hasEmojiByName = function hasEmojiByName (name) {\n  var result = Emoji.findByName(name);\n  return !!result && result.key === stripColons(name);\n};\n\n/**\n * Check if a given emoji is known by this library\n * @param {string} code The emoji to validate; for example `☕` or `☔`\n * @return {object}\n */\nEmoji.hasEmojiByCode = function hasEmojiByCode (code) {\n  var result = Emoji.findByCode(code);\n  return !!result && stripNSB(result.emoji) === stripNSB(code);\n};\n\n/**\n * get emoji name from code\n * @param  {string} emoji\n * @param  {boolean} includeColons should the result include the ::\n * @return {string}\n */\nEmoji.which = function which (emoji_code, includeColons) {\n  var code = stripNSB(emoji_code);\n  var word = emojiByCode[code];\n\n  return includeColons ? wrapColons(word) : word;\n};\n\n/**\n * emojify a string (replace :emoji: with an emoji)\n * @param  {string} str\n * @param  {function} on_missing (gets emoji name without :: and returns a proper emoji if no emoji was found)\n * @param  {function} format (wrap the returned emoji in a custom element)\n * @return {string}\n */\nEmoji.emojify = function emojify (str, on_missing, format) {\n  if (!str) return '';\n\n  return str.split(emojiNameRegex) // parse emoji via regex\n            .map(function parseEmoji(s, i) {\n              // every second element is an emoji, e.g. \"test :fast_forward:\" -> [ \"test \", \"fast_forward\" ]\n              if (i % 2 === 0) return s;\n              var emoji = Emoji._get(s);\n              var isMissing = emoji.indexOf(':') > -1;\n\n              if (isMissing && typeof on_missing === 'function') {\n                return on_missing(s);\n              }\n\n              if (!isMissing && typeof format === 'function') {\n                return format(emoji, s);\n              }\n\n              return emoji;\n            })\n            .join('') // convert back to string\n  ;\n};\n\n/**\n * return a random emoji\n * @return {string}\n */\nEmoji.random = function random () {\n  var emojiKeys = Object.keys(emojiByName);\n  var randomIndex = Math.floor(Math.random() * emojiKeys.length);\n  var key = emojiKeys[randomIndex];\n  var emoji = Emoji._get(key);\n  return { key: key, emoji: emoji };\n}\n\n/**\n *  return an collection of potential emoji matches\n *  @param {string} str\n *  @return {Array.<Object>}\n */\nEmoji.search = function search (str) {\n  var emojiKeys = Object.keys(emojiByName);\n  var matcher = stripColons(str)\n  var matchingKeys = emojiKeys.filter(function(key) {\n    return key.toString().indexOf(matcher) === 0;\n  });\n  return matchingKeys.map(function(key) {\n    return {\n      key: key,\n      emoji: Emoji._get(key),\n    };\n  });\n}\n\n/**\n * unemojify a string (replace emoji with :emoji:)\n * @param  {string} str\n * @return {string}\n */\nEmoji.unemojify = function unemojify (str) {\n  if (!str) return '';\n  var words = toArray(str);\n\n  return words.map(function(word) {\n    return Emoji.which(word, true) || word;\n  }).join('');\n};\n\n/**\n * replace emojis with replacement value\n * @param {string} str\n * @param {function|string} the string or callback function to replace the emoji with\n * @param {boolean} should trailing whitespaces be cleaned? Defaults false\n * @return {string}\n */\nEmoji.replace = function replace (str, replacement, cleanSpaces) {\n  if (!str) return '';\n\n  var replace = typeof replacement === 'function' ? replacement : function() { return replacement; };\n  var words = toArray(str);\n\n  var replaced = words.map(function(word, idx) {\n    var emoji = Emoji.findByCode(word);\n    \n    if (emoji && cleanSpaces && words[idx + 1] === ' ') {\n      words[idx + 1] = '';\n    }\n\n    return emoji ? replace(emoji) : word;\n  }).join('');\n\n  return cleanSpaces ? replaced.replace(trimSpaceRegex, '') : replaced;\n};\n\n\n/**\n * remove all emojis from a string\n * @param {string} str\n * @return {string}\n */\nEmoji.strip = function strip (str) {\n  return Emoji.replace(str, '', true);\n};\n\nmodule.exports = Emoji;\n\n\n/***/ }),\n/* 764 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"100\":\"💯\",\"1234\":\"🔢\",\"interrobang\":\"⁉️\",\"tm\":\"™️\",\"information_source\":\"ℹ️\",\"left_right_arrow\":\"↔️\",\"arrow_up_down\":\"↕️\",\"arrow_upper_left\":\"↖️\",\"arrow_upper_right\":\"↗️\",\"arrow_lower_right\":\"↘️\",\"arrow_lower_left\":\"↙️\",\"keyboard\":\"⌨\",\"sunny\":\"☀️\",\"cloud\":\"☁️\",\"umbrella\":\"☔️\",\"showman\":\"☃\",\"comet\":\"☄\",\"ballot_box_with_check\":\"☑️\",\"coffee\":\"☕️\",\"shamrock\":\"☘\",\"skull_and_crossbones\":\"☠\",\"radioactive_sign\":\"☢\",\"biohazard_sign\":\"☣\",\"orthodox_cross\":\"☦\",\"wheel_of_dharma\":\"☸\",\"white_frowning_face\":\"☹\",\"aries\":\"♈️\",\"taurus\":\"♉️\",\"sagittarius\":\"♐️\",\"capricorn\":\"♑️\",\"aquarius\":\"♒️\",\"pisces\":\"♓️\",\"spades\":\"♠️\",\"clubs\":\"♣️\",\"hearts\":\"♥️\",\"diamonds\":\"♦️\",\"hotsprings\":\"♨️\",\"hammer_and_pick\":\"⚒\",\"anchor\":\"⚓️\",\"crossed_swords\":\"⚔\",\"scales\":\"⚖\",\"alembic\":\"⚗\",\"gear\":\"⚙\",\"scissors\":\"✂️\",\"white_check_mark\":\"✅\",\"airplane\":\"✈️\",\"email\":\"✉️\",\"envelope\":\"✉️\",\"black_nib\":\"✒️\",\"heavy_check_mark\":\"✔️\",\"heavy_multiplication_x\":\"✖️\",\"star_of_david\":\"✡\",\"sparkles\":\"✨\",\"eight_spoked_asterisk\":\"✳️\",\"eight_pointed_black_star\":\"✴️\",\"snowflake\":\"❄️\",\"sparkle\":\"❇️\",\"question\":\"❓\",\"grey_question\":\"❔\",\"grey_exclamation\":\"❕\",\"exclamation\":\"❗️\",\"heavy_exclamation_mark\":\"❗️\",\"heavy_heart_exclamation_mark_ornament\":\"❣\",\"heart\":\"❤️\",\"heavy_plus_sign\":\"➕\",\"heavy_minus_sign\":\"➖\",\"heavy_division_sign\":\"➗\",\"arrow_heading_up\":\"⤴️\",\"arrow_heading_down\":\"⤵️\",\"wavy_dash\":\"〰️\",\"congratulations\":\"㊗️\",\"secret\":\"㊙️\",\"copyright\":\"©️\",\"registered\":\"®️\",\"bangbang\":\"‼️\",\"leftwards_arrow_with_hook\":\"↩️\",\"arrow_right_hook\":\"↪️\",\"watch\":\"⌚️\",\"hourglass\":\"⌛️\",\"fast_forward\":\"⏩\",\"rewind\":\"⏪\",\"arrow_double_up\":\"⏫\",\"arrow_double_down\":\"⏬\",\"black_right_pointing_double_triangle_with_vertical_bar\":\"⏭\",\"black_left_pointing_double_triangle_with_vertical_bar\":\"⏮\",\"black_right_pointing_triangle_with_double_vertical_bar\":\"⏯\",\"alarm_clock\":\"⏰\",\"stopwatch\":\"⏱\",\"timer_clock\":\"⏲\",\"hourglass_flowing_sand\":\"⏳\",\"double_vertical_bar\":\"⏸\",\"black_square_for_stop\":\"⏹\",\"black_circle_for_record\":\"⏺\",\"m\":\"Ⓜ️\",\"black_small_square\":\"▪️\",\"white_small_square\":\"▫️\",\"arrow_forward\":\"▶️\",\"arrow_backward\":\"◀️\",\"white_medium_square\":\"◻️\",\"black_medium_square\":\"◼️\",\"white_medium_small_square\":\"◽️\",\"black_medium_small_square\":\"◾️\",\"phone\":\"☎️\",\"telephone\":\"☎️\",\"point_up\":\"☝️\",\"star_and_crescent\":\"☪\",\"peace_symbol\":\"☮\",\"yin_yang\":\"☯\",\"relaxed\":\"☺️\",\"gemini\":\"♊️\",\"cancer\":\"♋️\",\"leo\":\"♌️\",\"virgo\":\"♍️\",\"libra\":\"♎️\",\"scorpius\":\"♏️\",\"recycle\":\"♻️\",\"wheelchair\":\"♿️\",\"atom_symbol\":\"⚛\",\"fleur_de_lis\":\"⚜\",\"warning\":\"⚠️\",\"zap\":\"⚡️\",\"white_circle\":\"⚪️\",\"black_circle\":\"⚫️\",\"coffin\":\"⚰\",\"funeral_urn\":\"⚱\",\"soccer\":\"⚽️\",\"baseball\":\"⚾️\",\"snowman\":\"⛄️\",\"partly_sunny\":\"⛅️\",\"thunder_cloud_and_rain\":\"⛈\",\"ophiuchus\":\"⛎\",\"pick\":\"⛏\",\"helmet_with_white_cross\":\"⛑\",\"chains\":\"⛓\",\"no_entry\":\"⛔️\",\"shinto_shrine\":\"⛩\",\"church\":\"⛪️\",\"mountain\":\"⛰\",\"umbrella_on_ground\":\"⛱\",\"fountain\":\"⛲️\",\"golf\":\"⛳️\",\"ferry\":\"⛴\",\"boat\":\"⛵️\",\"sailboat\":\"⛵️\",\"skier\":\"⛷\",\"ice_skate\":\"⛸\",\"person_with_ball\":\"⛹\",\"tent\":\"⛺️\",\"fuelpump\":\"⛽️\",\"fist\":\"✊\",\"hand\":\"✋\",\"raised_hand\":\"✋\",\"v\":\"✌️\",\"writing_hand\":\"✍\",\"pencil2\":\"✏️\",\"latin_cross\":\"✝\",\"x\":\"❌\",\"negative_squared_cross_mark\":\"❎\",\"arrow_right\":\"➡️\",\"curly_loop\":\"➰\",\"loop\":\"➿\",\"arrow_left\":\"⬅️\",\"arrow_up\":\"⬆️\",\"arrow_down\":\"⬇️\",\"black_large_square\":\"⬛️\",\"white_large_square\":\"⬜️\",\"star\":\"⭐️\",\"o\":\"⭕️\",\"part_alternation_mark\":\"〽️\",\"mahjong\":\"🀄️\",\"black_joker\":\"🃏\",\"a\":\"🅰️\",\"b\":\"🅱️\",\"o2\":\"🅾️\",\"parking\":\"🅿️\",\"ab\":\"🆎\",\"cl\":\"🆑\",\"cool\":\"🆒\",\"free\":\"🆓\",\"id\":\"🆔\",\"new\":\"🆕\",\"ng\":\"🆖\",\"ok\":\"🆗\",\"sos\":\"🆘\",\"up\":\"🆙\",\"vs\":\"🆚\",\"koko\":\"🈁\",\"sa\":\"🈂️\",\"u7121\":\"🈚️\",\"u6307\":\"🈯️\",\"u7981\":\"🈲\",\"u7a7a\":\"🈳\",\"u5408\":\"🈴\",\"u6e80\":\"🈵\",\"u6709\":\"🈶\",\"u6708\":\"🈷️\",\"u7533\":\"🈸\",\"u5272\":\"🈹\",\"u55b6\":\"🈺\",\"ideograph_advantage\":\"🉐\",\"accept\":\"🉑\",\"cyclone\":\"🌀\",\"foggy\":\"🌁\",\"closed_umbrella\":\"🌂\",\"night_with_stars\":\"🌃\",\"sunrise_over_mountains\":\"🌄\",\"sunrise\":\"🌅\",\"city_sunset\":\"🌆\",\"city_sunrise\":\"🌇\",\"rainbow\":\"🌈\",\"bridge_at_night\":\"🌉\",\"ocean\":\"🌊\",\"volcano\":\"🌋\",\"milky_way\":\"🌌\",\"earth_africa\":\"🌍\",\"earth_americas\":\"🌎\",\"earth_asia\":\"🌏\",\"globe_with_meridians\":\"🌐\",\"new_moon\":\"🌑\",\"waxing_crescent_moon\":\"🌒\",\"first_quarter_moon\":\"🌓\",\"moon\":\"🌔\",\"waxing_gibbous_moon\":\"🌔\",\"full_moon\":\"🌕\",\"waning_gibbous_moon\":\"🌖\",\"last_quarter_moon\":\"🌗\",\"waning_crescent_moon\":\"🌘\",\"crescent_moon\":\"🌙\",\"new_moon_with_face\":\"🌚\",\"first_quarter_moon_with_face\":\"🌛\",\"last_quarter_moon_with_face\":\"🌜\",\"full_moon_with_face\":\"🌝\",\"sun_with_face\":\"🌞\",\"star2\":\"🌟\",\"stars\":\"🌠\",\"thermometer\":\"🌡\",\"mostly_sunny\":\"🌤\",\"sun_small_cloud\":\"🌤\",\"barely_sunny\":\"🌥\",\"sun_behind_cloud\":\"🌥\",\"partly_sunny_rain\":\"🌦\",\"sun_behind_rain_cloud\":\"🌦\",\"rain_cloud\":\"🌧\",\"snow_cloud\":\"🌨\",\"lightning\":\"🌩\",\"lightning_cloud\":\"🌩\",\"tornado\":\"🌪\",\"tornado_cloud\":\"🌪\",\"fog\":\"🌫\",\"wind_blowing_face\":\"🌬\",\"hotdog\":\"🌭\",\"taco\":\"🌮\",\"burrito\":\"🌯\",\"chestnut\":\"🌰\",\"seedling\":\"🌱\",\"evergreen_tree\":\"🌲\",\"deciduous_tree\":\"🌳\",\"palm_tree\":\"🌴\",\"cactus\":\"🌵\",\"hot_pepper\":\"🌶\",\"tulip\":\"🌷\",\"cherry_blossom\":\"🌸\",\"rose\":\"🌹\",\"hibiscus\":\"🌺\",\"sunflower\":\"🌻\",\"blossom\":\"🌼\",\"corn\":\"🌽\",\"ear_of_rice\":\"🌾\",\"herb\":\"🌿\",\"four_leaf_clover\":\"🍀\",\"maple_leaf\":\"🍁\",\"fallen_leaf\":\"🍂\",\"leaves\":\"🍃\",\"mushroom\":\"🍄\",\"tomato\":\"🍅\",\"eggplant\":\"🍆\",\"grapes\":\"🍇\",\"melon\":\"🍈\",\"watermelon\":\"🍉\",\"tangerine\":\"🍊\",\"lemon\":\"🍋\",\"banana\":\"🍌\",\"pineapple\":\"🍍\",\"apple\":\"🍎\",\"green_apple\":\"🍏\",\"pear\":\"🍐\",\"peach\":\"🍑\",\"cherries\":\"🍒\",\"strawberry\":\"🍓\",\"hamburger\":\"🍔\",\"pizza\":\"🍕\",\"meat_on_bone\":\"🍖\",\"poultry_leg\":\"🍗\",\"rice_cracker\":\"🍘\",\"rice_ball\":\"🍙\",\"rice\":\"🍚\",\"curry\":\"🍛\",\"ramen\":\"🍜\",\"spaghetti\":\"🍝\",\"bread\":\"🍞\",\"fries\":\"🍟\",\"sweet_potato\":\"🍠\",\"dango\":\"🍡\",\"oden\":\"🍢\",\"sushi\":\"🍣\",\"fried_shrimp\":\"🍤\",\"fish_cake\":\"🍥\",\"icecream\":\"🍦\",\"shaved_ice\":\"🍧\",\"ice_cream\":\"🍨\",\"doughnut\":\"🍩\",\"cookie\":\"🍪\",\"chocolate_bar\":\"🍫\",\"candy\":\"🍬\",\"lollipop\":\"🍭\",\"custard\":\"🍮\",\"honey_pot\":\"🍯\",\"cake\":\"🍰\",\"bento\":\"🍱\",\"stew\":\"🍲\",\"egg\":\"🍳\",\"fork_and_knife\":\"🍴\",\"tea\":\"🍵\",\"sake\":\"🍶\",\"wine_glass\":\"🍷\",\"cocktail\":\"🍸\",\"tropical_drink\":\"🍹\",\"beer\":\"🍺\",\"beers\":\"🍻\",\"baby_bottle\":\"🍼\",\"knife_fork_plate\":\"🍽\",\"champagne\":\"🍾\",\"popcorn\":\"🍿\",\"ribbon\":\"🎀\",\"gift\":\"🎁\",\"birthday\":\"🎂\",\"jack_o_lantern\":\"🎃\",\"christmas_tree\":\"🎄\",\"santa\":\"🎅\",\"fireworks\":\"🎆\",\"sparkler\":\"🎇\",\"balloon\":\"🎈\",\"tada\":\"🎉\",\"confetti_ball\":\"🎊\",\"tanabata_tree\":\"🎋\",\"crossed_flags\":\"🎌\",\"bamboo\":\"🎍\",\"dolls\":\"🎎\",\"flags\":\"🎏\",\"wind_chime\":\"🎐\",\"rice_scene\":\"🎑\",\"school_satchel\":\"🎒\",\"mortar_board\":\"🎓\",\"medal\":\"🎖\",\"reminder_ribbon\":\"🎗\",\"studio_microphone\":\"🎙\",\"level_slider\":\"🎚\",\"control_knobs\":\"🎛\",\"film_frames\":\"🎞\",\"admission_tickets\":\"🎟\",\"carousel_horse\":\"🎠\",\"ferris_wheel\":\"🎡\",\"roller_coaster\":\"🎢\",\"fishing_pole_and_fish\":\"🎣\",\"microphone\":\"🎤\",\"movie_camera\":\"🎥\",\"cinema\":\"🎦\",\"headphones\":\"🎧\",\"art\":\"🎨\",\"tophat\":\"🎩\",\"circus_tent\":\"🎪\",\"ticket\":\"🎫\",\"clapper\":\"🎬\",\"performing_arts\":\"🎭\",\"video_game\":\"🎮\",\"dart\":\"🎯\",\"slot_machine\":\"🎰\",\"8ball\":\"🎱\",\"game_die\":\"🎲\",\"bowling\":\"🎳\",\"flower_playing_cards\":\"🎴\",\"musical_note\":\"🎵\",\"notes\":\"🎶\",\"saxophone\":\"🎷\",\"guitar\":\"🎸\",\"musical_keyboard\":\"🎹\",\"trumpet\":\"🎺\",\"violin\":\"🎻\",\"musical_score\":\"🎼\",\"running_shirt_with_sash\":\"🎽\",\"tennis\":\"🎾\",\"ski\":\"🎿\",\"basketball\":\"🏀\",\"checkered_flag\":\"🏁\",\"snowboarder\":\"🏂\",\"runner\":\"🏃\",\"running\":\"🏃\",\"surfer\":\"🏄\",\"sports_medal\":\"🏅\",\"trophy\":\"🏆\",\"horse_racing\":\"🏇\",\"football\":\"🏈\",\"rugby_football\":\"🏉\",\"swimmer\":\"🏊\",\"weight_lifter\":\"🏋\",\"golfer\":\"🏌\",\"racing_motorcycle\":\"🏍\",\"racing_car\":\"🏎\",\"cricket_bat_and_ball\":\"🏏\",\"volleyball\":\"🏐\",\"field_hockey_stick_and_ball\":\"🏑\",\"ice_hockey_stick_and_puck\":\"🏒\",\"table_tennis_paddle_and_ball\":\"🏓\",\"snow_capped_mountain\":\"🏔\",\"camping\":\"🏕\",\"beach_with_umbrella\":\"🏖\",\"building_construction\":\"🏗\",\"house_buildings\":\"🏘\",\"cityscape\":\"🏙\",\"derelict_house_building\":\"🏚\",\"classical_building\":\"🏛\",\"desert\":\"🏜\",\"desert_island\":\"🏝\",\"national_park\":\"🏞\",\"stadium\":\"🏟\",\"house\":\"🏠\",\"house_with_garden\":\"🏡\",\"office\":\"🏢\",\"post_office\":\"🏣\",\"european_post_office\":\"🏤\",\"hospital\":\"🏥\",\"bank\":\"🏦\",\"atm\":\"🏧\",\"hotel\":\"🏨\",\"love_hotel\":\"🏩\",\"convenience_store\":\"🏪\",\"school\":\"🏫\",\"department_store\":\"🏬\",\"factory\":\"🏭\",\"izakaya_lantern\":\"🏮\",\"lantern\":\"🏮\",\"japanese_castle\":\"🏯\",\"european_castle\":\"🏰\",\"waving_white_flag\":\"🏳\",\"waving_black_flag\":\"🏴\",\"rosette\":\"🏵\",\"label\":\"🏷\",\"badminton_racquet_and_shuttlecock\":\"🏸\",\"bow_and_arrow\":\"🏹\",\"amphora\":\"🏺\",\"skin-tone-2\":\"🏻\",\"skin-tone-3\":\"🏼\",\"skin-tone-4\":\"🏽\",\"skin-tone-5\":\"🏾\",\"skin-tone-6\":\"🏿\",\"rat\":\"🐀\",\"mouse2\":\"🐁\",\"ox\":\"🐂\",\"water_buffalo\":\"🐃\",\"cow2\":\"🐄\",\"tiger2\":\"🐅\",\"leopard\":\"🐆\",\"rabbit2\":\"🐇\",\"cat2\":\"🐈\",\"dragon\":\"🐉\",\"crocodile\":\"🐊\",\"whale2\":\"🐋\",\"snail\":\"🐌\",\"snake\":\"🐍\",\"racehorse\":\"🐎\",\"ram\":\"🐏\",\"goat\":\"🐐\",\"sheep\":\"🐑\",\"monkey\":\"🐒\",\"rooster\":\"🐓\",\"chicken\":\"🐔\",\"dog2\":\"🐕\",\"pig2\":\"🐖\",\"boar\":\"🐗\",\"elephant\":\"🐘\",\"octopus\":\"🐙\",\"shell\":\"🐚\",\"bug\":\"🐛\",\"ant\":\"🐜\",\"bee\":\"🐝\",\"honeybee\":\"🐝\",\"beetle\":\"🐞\",\"fish\":\"🐟\",\"tropical_fish\":\"🐠\",\"blowfish\":\"🐡\",\"turtle\":\"🐢\",\"hatching_chick\":\"🐣\",\"baby_chick\":\"🐤\",\"hatched_chick\":\"🐥\",\"bird\":\"🐦\",\"penguin\":\"🐧\",\"koala\":\"🐨\",\"poodle\":\"🐩\",\"dromedary_camel\":\"🐪\",\"camel\":\"🐫\",\"dolphin\":\"🐬\",\"flipper\":\"🐬\",\"mouse\":\"🐭\",\"cow\":\"🐮\",\"tiger\":\"🐯\",\"rabbit\":\"🐰\",\"cat\":\"🐱\",\"dragon_face\":\"🐲\",\"whale\":\"🐳\",\"horse\":\"🐴\",\"monkey_face\":\"🐵\",\"dog\":\"🐶\",\"pig\":\"🐷\",\"frog\":\"🐸\",\"hamster\":\"🐹\",\"wolf\":\"🐺\",\"bear\":\"🐻\",\"panda_face\":\"🐼\",\"pig_nose\":\"🐽\",\"feet\":\"🐾\",\"paw_prints\":\"🐾\",\"chipmunk\":\"🐿\",\"eyes\":\"👀\",\"eye\":\"👁\",\"ear\":\"👂\",\"nose\":\"👃\",\"lips\":\"👄\",\"tongue\":\"👅\",\"point_up_2\":\"👆\",\"point_down\":\"👇\",\"point_left\":\"👈\",\"point_right\":\"👉\",\"facepunch\":\"👊\",\"punch\":\"👊\",\"wave\":\"👋\",\"ok_hand\":\"👌\",\"+1\":\"👍\",\"thumbsup\":\"👍\",\"-1\":\"👎\",\"thumbsdown\":\"👎\",\"clap\":\"👏\",\"open_hands\":\"👐\",\"crown\":\"👑\",\"womans_hat\":\"👒\",\"eyeglasses\":\"👓\",\"necktie\":\"👔\",\"shirt\":\"👕\",\"tshirt\":\"👕\",\"jeans\":\"👖\",\"dress\":\"👗\",\"kimono\":\"👘\",\"bikini\":\"👙\",\"womans_clothes\":\"👚\",\"purse\":\"👛\",\"handbag\":\"👜\",\"pouch\":\"👝\",\"mans_shoe\":\"👞\",\"shoe\":\"👞\",\"athletic_shoe\":\"👟\",\"high_heel\":\"👠\",\"sandal\":\"👡\",\"boot\":\"👢\",\"footprints\":\"👣\",\"bust_in_silhouette\":\"👤\",\"busts_in_silhouette\":\"👥\",\"boy\":\"👦\",\"girl\":\"👧\",\"man\":\"👨\",\"woman\":\"👩\",\"family\":\"👨‍👩‍👦\",\"man-woman-boy\":\"👨‍👩‍👦\",\"couple\":\"👫\",\"man_and_woman_holding_hands\":\"👫\",\"two_men_holding_hands\":\"👬\",\"two_women_holding_hands\":\"👭\",\"cop\":\"👮\",\"dancers\":\"👯\",\"bride_with_veil\":\"👰\",\"person_with_blond_hair\":\"👱\",\"man_with_gua_pi_mao\":\"👲\",\"man_with_turban\":\"👳\",\"older_man\":\"👴\",\"older_woman\":\"👵\",\"baby\":\"👶\",\"construction_worker\":\"👷\",\"princess\":\"👸\",\"japanese_ogre\":\"👹\",\"japanese_goblin\":\"👺\",\"ghost\":\"👻\",\"angel\":\"👼\",\"alien\":\"👽\",\"space_invader\":\"👾\",\"imp\":\"👿\",\"skull\":\"💀\",\"information_desk_person\":\"💁\",\"guardsman\":\"💂\",\"dancer\":\"💃\",\"lipstick\":\"💄\",\"nail_care\":\"💅\",\"massage\":\"💆\",\"haircut\":\"💇\",\"barber\":\"💈\",\"syringe\":\"💉\",\"pill\":\"💊\",\"kiss\":\"💋\",\"love_letter\":\"💌\",\"ring\":\"💍\",\"gem\":\"💎\",\"couplekiss\":\"💏\",\"bouquet\":\"💐\",\"couple_with_heart\":\"💑\",\"wedding\":\"💒\",\"heartbeat\":\"💓\",\"broken_heart\":\"💔\",\"two_hearts\":\"💕\",\"sparkling_heart\":\"💖\",\"heartpulse\":\"💗\",\"cupid\":\"💘\",\"blue_heart\":\"💙\",\"green_heart\":\"💚\",\"yellow_heart\":\"💛\",\"purple_heart\":\"💜\",\"gift_heart\":\"💝\",\"revolving_hearts\":\"💞\",\"heart_decoration\":\"💟\",\"diamond_shape_with_a_dot_inside\":\"💠\",\"bulb\":\"💡\",\"anger\":\"💢\",\"bomb\":\"💣\",\"zzz\":\"💤\",\"boom\":\"💥\",\"collision\":\"💥\",\"sweat_drops\":\"💦\",\"droplet\":\"💧\",\"dash\":\"💨\",\"hankey\":\"💩\",\"poop\":\"💩\",\"shit\":\"💩\",\"muscle\":\"💪\",\"dizzy\":\"💫\",\"speech_balloon\":\"💬\",\"thought_balloon\":\"💭\",\"white_flower\":\"💮\",\"moneybag\":\"💰\",\"currency_exchange\":\"💱\",\"heavy_dollar_sign\":\"💲\",\"credit_card\":\"💳\",\"yen\":\"💴\",\"dollar\":\"💵\",\"euro\":\"💶\",\"pound\":\"💷\",\"money_with_wings\":\"💸\",\"chart\":\"💹\",\"seat\":\"💺\",\"computer\":\"💻\",\"briefcase\":\"💼\",\"minidisc\":\"💽\",\"floppy_disk\":\"💾\",\"cd\":\"💿\",\"dvd\":\"📀\",\"file_folder\":\"📁\",\"open_file_folder\":\"📂\",\"page_with_curl\":\"📃\",\"page_facing_up\":\"📄\",\"date\":\"📅\",\"calendar\":\"📆\",\"card_index\":\"📇\",\"chart_with_upwards_trend\":\"📈\",\"chart_with_downwards_trend\":\"📉\",\"bar_chart\":\"📊\",\"clipboard\":\"📋\",\"pushpin\":\"📌\",\"round_pushpin\":\"📍\",\"paperclip\":\"📎\",\"straight_ruler\":\"📏\",\"triangular_ruler\":\"📐\",\"bookmark_tabs\":\"📑\",\"ledger\":\"📒\",\"notebook\":\"📓\",\"notebook_with_decorative_cover\":\"📔\",\"closed_book\":\"📕\",\"book\":\"📖\",\"open_book\":\"📖\",\"green_book\":\"📗\",\"blue_book\":\"📘\",\"orange_book\":\"📙\",\"books\":\"📚\",\"name_badge\":\"📛\",\"scroll\":\"📜\",\"memo\":\"📝\",\"pencil\":\"📝\",\"telephone_receiver\":\"📞\",\"pager\":\"📟\",\"fax\":\"📠\",\"satellite\":\"🛰\",\"loudspeaker\":\"📢\",\"mega\":\"📣\",\"outbox_tray\":\"📤\",\"inbox_tray\":\"📥\",\"package\":\"📦\",\"e-mail\":\"📧\",\"incoming_envelope\":\"📨\",\"envelope_with_arrow\":\"📩\",\"mailbox_closed\":\"📪\",\"mailbox\":\"📫\",\"mailbox_with_mail\":\"📬\",\"mailbox_with_no_mail\":\"📭\",\"postbox\":\"📮\",\"postal_horn\":\"📯\",\"newspaper\":\"📰\",\"iphone\":\"📱\",\"calling\":\"📲\",\"vibration_mode\":\"📳\",\"mobile_phone_off\":\"📴\",\"no_mobile_phones\":\"📵\",\"signal_strength\":\"📶\",\"camera\":\"📷\",\"camera_with_flash\":\"📸\",\"video_camera\":\"📹\",\"tv\":\"📺\",\"radio\":\"📻\",\"vhs\":\"📼\",\"film_projector\":\"📽\",\"prayer_beads\":\"📿\",\"twisted_rightwards_arrows\":\"🔀\",\"repeat\":\"🔁\",\"repeat_one\":\"🔂\",\"arrows_clockwise\":\"🔃\",\"arrows_counterclockwise\":\"🔄\",\"low_brightness\":\"🔅\",\"high_brightness\":\"🔆\",\"mute\":\"🔇\",\"speaker\":\"🔈\",\"sound\":\"🔉\",\"loud_sound\":\"🔊\",\"battery\":\"🔋\",\"electric_plug\":\"🔌\",\"mag\":\"🔍\",\"mag_right\":\"🔎\",\"lock_with_ink_pen\":\"🔏\",\"closed_lock_with_key\":\"🔐\",\"key\":\"🔑\",\"lock\":\"🔒\",\"unlock\":\"🔓\",\"bell\":\"🔔\",\"no_bell\":\"🔕\",\"bookmark\":\"🔖\",\"link\":\"🔗\",\"radio_button\":\"🔘\",\"back\":\"🔙\",\"end\":\"🔚\",\"on\":\"🔛\",\"soon\":\"🔜\",\"top\":\"🔝\",\"underage\":\"🔞\",\"keycap_ten\":\"🔟\",\"capital_abcd\":\"🔠\",\"abcd\":\"🔡\",\"symbols\":\"🔣\",\"abc\":\"🔤\",\"fire\":\"🔥\",\"flashlight\":\"🔦\",\"wrench\":\"🔧\",\"hammer\":\"🔨\",\"nut_and_bolt\":\"🔩\",\"hocho\":\"🔪\",\"knife\":\"🔪\",\"gun\":\"🔫\",\"microscope\":\"🔬\",\"telescope\":\"🔭\",\"crystal_ball\":\"🔮\",\"six_pointed_star\":\"🔯\",\"beginner\":\"🔰\",\"trident\":\"🔱\",\"black_square_button\":\"🔲\",\"white_square_button\":\"🔳\",\"red_circle\":\"🔴\",\"large_blue_circle\":\"🔵\",\"large_orange_diamond\":\"🔶\",\"large_blue_diamond\":\"🔷\",\"small_orange_diamond\":\"🔸\",\"small_blue_diamond\":\"🔹\",\"small_red_triangle\":\"🔺\",\"small_red_triangle_down\":\"🔻\",\"arrow_up_small\":\"🔼\",\"arrow_down_small\":\"🔽\",\"om_symbol\":\"🕉\",\"dove_of_peace\":\"🕊\",\"kaaba\":\"🕋\",\"mosque\":\"🕌\",\"synagogue\":\"🕍\",\"menorah_with_nine_branches\":\"🕎\",\"clock1\":\"🕐\",\"clock2\":\"🕑\",\"clock3\":\"🕒\",\"clock4\":\"🕓\",\"clock5\":\"🕔\",\"clock6\":\"🕕\",\"clock7\":\"🕖\",\"clock8\":\"🕗\",\"clock9\":\"🕘\",\"clock10\":\"🕙\",\"clock11\":\"🕚\",\"clock12\":\"🕛\",\"clock130\":\"🕜\",\"clock230\":\"🕝\",\"clock330\":\"🕞\",\"clock430\":\"🕟\",\"clock530\":\"🕠\",\"clock630\":\"🕡\",\"clock730\":\"🕢\",\"clock830\":\"🕣\",\"clock930\":\"🕤\",\"clock1030\":\"🕥\",\"clock1130\":\"🕦\",\"clock1230\":\"🕧\",\"candle\":\"🕯\",\"mantelpiece_clock\":\"🕰\",\"hole\":\"🕳\",\"man_in_business_suit_levitating\":\"🕴\",\"sleuth_or_spy\":\"🕵\",\"dark_sunglasses\":\"🕶\",\"spider\":\"🕷\",\"spider_web\":\"🕸\",\"joystick\":\"🕹\",\"linked_paperclips\":\"🖇\",\"lower_left_ballpoint_pen\":\"🖊\",\"lower_left_fountain_pen\":\"🖋\",\"lower_left_paintbrush\":\"🖌\",\"lower_left_crayon\":\"🖍\",\"raised_hand_with_fingers_splayed\":\"🖐\",\"middle_finger\":\"🖕\",\"reversed_hand_with_middle_finger_extended\":\"🖕\",\"spock-hand\":\"🖖\",\"desktop_computer\":\"🖥\",\"printer\":\"🖨\",\"three_button_mouse\":\"🖱\",\"trackball\":\"🖲\",\"frame_with_picture\":\"🖼\",\"card_index_dividers\":\"🗂\",\"card_file_box\":\"🗃\",\"file_cabinet\":\"🗄\",\"wastebasket\":\"🗑\",\"spiral_note_pad\":\"🗒\",\"spiral_calendar_pad\":\"🗓\",\"compression\":\"🗜\",\"old_key\":\"🗝\",\"rolled_up_newspaper\":\"🗞\",\"dagger_knife\":\"🗡\",\"speaking_head_in_silhouette\":\"🗣\",\"left_speech_bubble\":\"🗨\",\"right_anger_bubble\":\"🗯\",\"ballot_box_with_ballot\":\"🗳\",\"world_map\":\"🗺\",\"mount_fuji\":\"🗻\",\"tokyo_tower\":\"🗼\",\"statue_of_liberty\":\"🗽\",\"japan\":\"🗾\",\"moyai\":\"🗿\",\"grinning\":\"😀\",\"grin\":\"😁\",\"joy\":\"😂\",\"smiley\":\"😃\",\"smile\":\"😄\",\"sweat_smile\":\"😅\",\"laughing\":\"😆\",\"satisfied\":\"😆\",\"innocent\":\"😇\",\"smiling_imp\":\"😈\",\"wink\":\"😉\",\"blush\":\"😊\",\"yum\":\"😋\",\"relieved\":\"😌\",\"heart_eyes\":\"😍\",\"sunglasses\":\"😎\",\"smirk\":\"😏\",\"neutral_face\":\"😐\",\"expressionless\":\"😑\",\"unamused\":\"😒\",\"sweat\":\"😓\",\"pensive\":\"😔\",\"confused\":\"😕\",\"confounded\":\"😖\",\"kissing\":\"😗\",\"kissing_heart\":\"😘\",\"kissing_smiling_eyes\":\"😙\",\"kissing_closed_eyes\":\"😚\",\"stuck_out_tongue\":\"😛\",\"stuck_out_tongue_winking_eye\":\"😜\",\"stuck_out_tongue_closed_eyes\":\"😝\",\"disappointed\":\"😞\",\"worried\":\"😟\",\"angry\":\"😠\",\"rage\":\"😡\",\"cry\":\"😢\",\"persevere\":\"😣\",\"triumph\":\"😤\",\"disappointed_relieved\":\"😥\",\"frowning\":\"😦\",\"anguished\":\"😧\",\"fearful\":\"😨\",\"weary\":\"😩\",\"sleepy\":\"😪\",\"tired_face\":\"😫\",\"grimacing\":\"😬\",\"sob\":\"😭\",\"open_mouth\":\"😮\",\"hushed\":\"😯\",\"cold_sweat\":\"😰\",\"scream\":\"😱\",\"astonished\":\"😲\",\"flushed\":\"😳\",\"sleeping\":\"😴\",\"dizzy_face\":\"😵\",\"no_mouth\":\"😶\",\"mask\":\"😷\",\"smile_cat\":\"😸\",\"joy_cat\":\"😹\",\"smiley_cat\":\"😺\",\"heart_eyes_cat\":\"😻\",\"smirk_cat\":\"😼\",\"kissing_cat\":\"😽\",\"pouting_cat\":\"😾\",\"crying_cat_face\":\"😿\",\"scream_cat\":\"🙀\",\"slightly_frowning_face\":\"🙁\",\"slightly_smiling_face\":\"🙂\",\"upside_down_face\":\"🙃\",\"face_with_rolling_eyes\":\"🙄\",\"no_good\":\"🙅\",\"ok_woman\":\"🙆\",\"bow\":\"🙇\",\"see_no_evil\":\"🙈\",\"hear_no_evil\":\"🙉\",\"speak_no_evil\":\"🙊\",\"raising_hand\":\"🙋\",\"raised_hands\":\"🙌\",\"person_frowning\":\"🙍\",\"person_with_pouting_face\":\"🙎\",\"pray\":\"🙏\",\"rocket\":\"🚀\",\"helicopter\":\"🚁\",\"steam_locomotive\":\"🚂\",\"railway_car\":\"🚃\",\"bullettrain_side\":\"🚄\",\"bullettrain_front\":\"🚅\",\"train2\":\"🚆\",\"metro\":\"🚇\",\"light_rail\":\"🚈\",\"station\":\"🚉\",\"tram\":\"🚊\",\"train\":\"🚋\",\"bus\":\"🚌\",\"oncoming_bus\":\"🚍\",\"trolleybus\":\"🚎\",\"busstop\":\"🚏\",\"minibus\":\"🚐\",\"ambulance\":\"🚑\",\"fire_engine\":\"🚒\",\"police_car\":\"🚓\",\"oncoming_police_car\":\"🚔\",\"taxi\":\"🚕\",\"oncoming_taxi\":\"🚖\",\"car\":\"🚗\",\"red_car\":\"🚗\",\"oncoming_automobile\":\"🚘\",\"blue_car\":\"🚙\",\"truck\":\"🚚\",\"articulated_lorry\":\"🚛\",\"tractor\":\"🚜\",\"monorail\":\"🚝\",\"mountain_railway\":\"🚞\",\"suspension_railway\":\"🚟\",\"mountain_cableway\":\"🚠\",\"aerial_tramway\":\"🚡\",\"ship\":\"🚢\",\"rowboat\":\"🚣\",\"speedboat\":\"🚤\",\"traffic_light\":\"🚥\",\"vertical_traffic_light\":\"🚦\",\"construction\":\"🚧\",\"rotating_light\":\"🚨\",\"triangular_flag_on_post\":\"🚩\",\"door\":\"🚪\",\"no_entry_sign\":\"🚫\",\"smoking\":\"🚬\",\"no_smoking\":\"🚭\",\"put_litter_in_its_place\":\"🚮\",\"do_not_litter\":\"🚯\",\"potable_water\":\"🚰\",\"non-potable_water\":\"🚱\",\"bike\":\"🚲\",\"no_bicycles\":\"🚳\",\"bicyclist\":\"🚴\",\"mountain_bicyclist\":\"🚵\",\"walking\":\"🚶\",\"no_pedestrians\":\"🚷\",\"children_crossing\":\"🚸\",\"mens\":\"🚹\",\"womens\":\"🚺\",\"restroom\":\"🚻\",\"baby_symbol\":\"🚼\",\"toilet\":\"🚽\",\"wc\":\"🚾\",\"shower\":\"🚿\",\"bath\":\"🛀\",\"bathtub\":\"🛁\",\"passport_control\":\"🛂\",\"customs\":\"🛃\",\"baggage_claim\":\"🛄\",\"left_luggage\":\"🛅\",\"couch_and_lamp\":\"🛋\",\"sleeping_accommodation\":\"🛌\",\"shopping_bags\":\"🛍\",\"bellhop_bell\":\"🛎\",\"bed\":\"🛏\",\"place_of_worship\":\"🛐\",\"hammer_and_wrench\":\"🛠\",\"shield\":\"🛡\",\"oil_drum\":\"🛢\",\"motorway\":\"🛣\",\"railway_track\":\"🛤\",\"motor_boat\":\"🛥\",\"small_airplane\":\"🛩\",\"airplane_departure\":\"🛫\",\"airplane_arriving\":\"🛬\",\"passenger_ship\":\"🛳\",\"zipper_mouth_face\":\"🤐\",\"money_mouth_face\":\"🤑\",\"face_with_thermometer\":\"🤒\",\"nerd_face\":\"🤓\",\"thinking_face\":\"🤔\",\"face_with_head_bandage\":\"🤕\",\"robot_face\":\"🤖\",\"hugging_face\":\"🤗\",\"the_horns\":\"🤘\",\"sign_of_the_horns\":\"🤘\",\"crab\":\"🦀\",\"lion_face\":\"🦁\",\"scorpion\":\"🦂\",\"turkey\":\"🦃\",\"unicorn_face\":\"🦄\",\"cheese_wedge\":\"🧀\",\"hash\":\"#️⃣\",\"keycap_star\":\"*⃣\",\"zero\":\"0️⃣\",\"one\":\"1️⃣\",\"two\":\"2️⃣\",\"three\":\"3️⃣\",\"four\":\"4️⃣\",\"five\":\"5️⃣\",\"six\":\"6️⃣\",\"seven\":\"7️⃣\",\"eight\":\"8️⃣\",\"nine\":\"9️⃣\",\"flag-ac\":\"🇦🇨\",\"flag-ad\":\"🇦🇩\",\"flag-ae\":\"🇦🇪\",\"flag-af\":\"🇦🇫\",\"flag-ag\":\"🇦🇬\",\"flag-ai\":\"🇦🇮\",\"flag-al\":\"🇦🇱\",\"flag-am\":\"🇦🇲\",\"flag-ao\":\"🇦🇴\",\"flag-aq\":\"🇦🇶\",\"flag-ar\":\"🇦🇷\",\"flag-as\":\"🇦🇸\",\"flag-at\":\"🇦🇹\",\"flag-au\":\"🇦🇺\",\"flag-aw\":\"🇦🇼\",\"flag-ax\":\"🇦🇽\",\"flag-az\":\"🇦🇿\",\"flag-ba\":\"🇧🇦\",\"flag-bb\":\"🇧🇧\",\"flag-bd\":\"🇧🇩\",\"flag-be\":\"🇧🇪\",\"flag-bf\":\"🇧🇫\",\"flag-bg\":\"🇧🇬\",\"flag-bh\":\"🇧🇭\",\"flag-bi\":\"🇧🇮\",\"flag-bj\":\"🇧🇯\",\"flag-bl\":\"🇧🇱\",\"flag-bm\":\"🇧🇲\",\"flag-bn\":\"🇧🇳\",\"flag-bo\":\"🇧🇴\",\"flag-bq\":\"🇧🇶\",\"flag-br\":\"🇧🇷\",\"flag-bs\":\"🇧🇸\",\"flag-bt\":\"🇧🇹\",\"flag-bv\":\"🇧🇻\",\"flag-bw\":\"🇧🇼\",\"flag-by\":\"🇧🇾\",\"flag-bz\":\"🇧🇿\",\"flag-ca\":\"🇨🇦\",\"flag-cc\":\"🇨🇨\",\"flag-cd\":\"🇨🇩\",\"flag-cf\":\"🇨🇫\",\"flag-cg\":\"🇨🇬\",\"flag-ch\":\"🇨🇭\",\"flag-ci\":\"🇨🇮\",\"flag-ck\":\"🇨🇰\",\"flag-cl\":\"🇨🇱\",\"flag-cm\":\"🇨🇲\",\"flag-cn\":\"🇨🇳\",\"cn\":\"🇨🇳\",\"flag-co\":\"🇨🇴\",\"flag-cp\":\"🇨🇵\",\"flag-cr\":\"🇨🇷\",\"flag-cu\":\"🇨🇺\",\"flag-cv\":\"🇨🇻\",\"flag-cw\":\"🇨🇼\",\"flag-cx\":\"🇨🇽\",\"flag-cy\":\"🇨🇾\",\"flag-cz\":\"🇨🇿\",\"flag-de\":\"🇩🇪\",\"de\":\"🇩🇪\",\"flag-dg\":\"🇩🇬\",\"flag-dj\":\"🇩🇯\",\"flag-dk\":\"🇩🇰\",\"flag-dm\":\"🇩🇲\",\"flag-do\":\"🇩🇴\",\"flag-dz\":\"🇩🇿\",\"flag-ea\":\"🇪🇦\",\"flag-ec\":\"🇪🇨\",\"flag-ee\":\"🇪🇪\",\"flag-eg\":\"🇪🇬\",\"flag-eh\":\"🇪🇭\",\"flag-er\":\"🇪🇷\",\"flag-es\":\"🇪🇸\",\"es\":\"🇪🇸\",\"flag-et\":\"🇪🇹\",\"flag-eu\":\"🇪🇺\",\"flag-fi\":\"🇫🇮\",\"flag-fj\":\"🇫🇯\",\"flag-fk\":\"🇫🇰\",\"flag-fm\":\"🇫🇲\",\"flag-fo\":\"🇫🇴\",\"flag-fr\":\"🇫🇷\",\"fr\":\"🇫🇷\",\"flag-ga\":\"🇬🇦\",\"flag-gb\":\"🇬🇧\",\"gb\":\"🇬🇧\",\"uk\":\"🇬🇧\",\"flag-gd\":\"🇬🇩\",\"flag-ge\":\"🇬🇪\",\"flag-gf\":\"🇬🇫\",\"flag-gg\":\"🇬🇬\",\"flag-gh\":\"🇬🇭\",\"flag-gi\":\"🇬🇮\",\"flag-gl\":\"🇬🇱\",\"flag-gm\":\"🇬🇲\",\"flag-gn\":\"🇬🇳\",\"flag-gp\":\"🇬🇵\",\"flag-gq\":\"🇬🇶\",\"flag-gr\":\"🇬🇷\",\"flag-gs\":\"🇬🇸\",\"flag-gt\":\"🇬🇹\",\"flag-gu\":\"🇬🇺\",\"flag-gw\":\"🇬🇼\",\"flag-gy\":\"🇬🇾\",\"flag-hk\":\"🇭🇰\",\"flag-hm\":\"🇭🇲\",\"flag-hn\":\"🇭🇳\",\"flag-hr\":\"🇭🇷\",\"flag-ht\":\"🇭🇹\",\"flag-hu\":\"🇭🇺\",\"flag-ic\":\"🇮🇨\",\"flag-id\":\"🇮🇩\",\"flag-ie\":\"🇮🇪\",\"flag-il\":\"🇮🇱\",\"flag-im\":\"🇮🇲\",\"flag-in\":\"🇮🇳\",\"flag-io\":\"🇮🇴\",\"flag-iq\":\"🇮🇶\",\"flag-ir\":\"🇮🇷\",\"flag-is\":\"🇮🇸\",\"flag-it\":\"🇮🇹\",\"it\":\"🇮🇹\",\"flag-je\":\"🇯🇪\",\"flag-jm\":\"🇯🇲\",\"flag-jo\":\"🇯🇴\",\"flag-jp\":\"🇯🇵\",\"jp\":\"🇯🇵\",\"flag-ke\":\"🇰🇪\",\"flag-kg\":\"🇰🇬\",\"flag-kh\":\"🇰🇭\",\"flag-ki\":\"🇰🇮\",\"flag-km\":\"🇰🇲\",\"flag-kn\":\"🇰🇳\",\"flag-kp\":\"🇰🇵\",\"flag-kr\":\"🇰🇷\",\"kr\":\"🇰🇷\",\"flag-kw\":\"🇰🇼\",\"flag-ky\":\"🇰🇾\",\"flag-kz\":\"🇰🇿\",\"flag-la\":\"🇱🇦\",\"flag-lb\":\"🇱🇧\",\"flag-lc\":\"🇱🇨\",\"flag-li\":\"🇱🇮\",\"flag-lk\":\"🇱🇰\",\"flag-lr\":\"🇱🇷\",\"flag-ls\":\"🇱🇸\",\"flag-lt\":\"🇱🇹\",\"flag-lu\":\"🇱🇺\",\"flag-lv\":\"🇱🇻\",\"flag-ly\":\"🇱🇾\",\"flag-ma\":\"🇲🇦\",\"flag-mc\":\"🇲🇨\",\"flag-md\":\"🇲🇩\",\"flag-me\":\"🇲🇪\",\"flag-mf\":\"🇲🇫\",\"flag-mg\":\"🇲🇬\",\"flag-mh\":\"🇲🇭\",\"flag-mk\":\"🇲🇰\",\"flag-ml\":\"🇲🇱\",\"flag-mm\":\"🇲🇲\",\"flag-mn\":\"🇲🇳\",\"flag-mo\":\"🇲🇴\",\"flag-mp\":\"🇲🇵\",\"flag-mq\":\"🇲🇶\",\"flag-mr\":\"🇲🇷\",\"flag-ms\":\"🇲🇸\",\"flag-mt\":\"🇲🇹\",\"flag-mu\":\"🇲🇺\",\"flag-mv\":\"🇲🇻\",\"flag-mw\":\"🇲🇼\",\"flag-mx\":\"🇲🇽\",\"flag-my\":\"🇲🇾\",\"flag-mz\":\"🇲🇿\",\"flag-na\":\"🇳🇦\",\"flag-nc\":\"🇳🇨\",\"flag-ne\":\"🇳🇪\",\"flag-nf\":\"🇳🇫\",\"flag-ng\":\"🇳🇬\",\"flag-ni\":\"🇳🇮\",\"flag-nl\":\"🇳🇱\",\"flag-no\":\"🇳🇴\",\"flag-np\":\"🇳🇵\",\"flag-nr\":\"🇳🇷\",\"flag-nu\":\"🇳🇺\",\"flag-nz\":\"🇳🇿\",\"flag-om\":\"🇴🇲\",\"flag-pa\":\"🇵🇦\",\"flag-pe\":\"🇵🇪\",\"flag-pf\":\"🇵🇫\",\"flag-pg\":\"🇵🇬\",\"flag-ph\":\"🇵🇭\",\"flag-pk\":\"🇵🇰\",\"flag-pl\":\"🇵🇱\",\"flag-pm\":\"🇵🇲\",\"flag-pn\":\"🇵🇳\",\"flag-pr\":\"🇵🇷\",\"flag-ps\":\"🇵🇸\",\"flag-pt\":\"🇵🇹\",\"flag-pw\":\"🇵🇼\",\"flag-py\":\"🇵🇾\",\"flag-qa\":\"🇶🇦\",\"flag-re\":\"🇷🇪\",\"flag-ro\":\"🇷🇴\",\"flag-rs\":\"🇷🇸\",\"flag-ru\":\"🇷🇺\",\"ru\":\"🇷🇺\",\"flag-rw\":\"🇷🇼\",\"flag-sa\":\"🇸🇦\",\"flag-sb\":\"🇸🇧\",\"flag-sc\":\"🇸🇨\",\"flag-sd\":\"🇸🇩\",\"flag-se\":\"🇸🇪\",\"flag-sg\":\"🇸🇬\",\"flag-sh\":\"🇸🇭\",\"flag-si\":\"🇸🇮\",\"flag-sj\":\"🇸🇯\",\"flag-sk\":\"🇸🇰\",\"flag-sl\":\"🇸🇱\",\"flag-sm\":\"🇸🇲\",\"flag-sn\":\"🇸🇳\",\"flag-so\":\"🇸🇴\",\"flag-sr\":\"🇸🇷\",\"flag-ss\":\"🇸🇸\",\"flag-st\":\"🇸🇹\",\"flag-sv\":\"🇸🇻\",\"flag-sx\":\"🇸🇽\",\"flag-sy\":\"🇸🇾\",\"flag-sz\":\"🇸🇿\",\"flag-ta\":\"🇹🇦\",\"flag-tc\":\"🇹🇨\",\"flag-td\":\"🇹🇩\",\"flag-tf\":\"🇹🇫\",\"flag-tg\":\"🇹🇬\",\"flag-th\":\"🇹🇭\",\"flag-tj\":\"🇹🇯\",\"flag-tk\":\"🇹🇰\",\"flag-tl\":\"🇹🇱\",\"flag-tm\":\"🇹🇲\",\"flag-tn\":\"🇹🇳\",\"flag-to\":\"🇹🇴\",\"flag-tr\":\"🇹🇷\",\"flag-tt\":\"🇹🇹\",\"flag-tv\":\"🇹🇻\",\"flag-tw\":\"🇹🇼\",\"flag-tz\":\"🇹🇿\",\"flag-ua\":\"🇺🇦\",\"flag-ug\":\"🇺🇬\",\"flag-um\":\"🇺🇲\",\"flag-us\":\"🇺🇸\",\"us\":\"🇺🇸\",\"flag-uy\":\"🇺🇾\",\"flag-uz\":\"🇺🇿\",\"flag-va\":\"🇻🇦\",\"flag-vc\":\"🇻🇨\",\"flag-ve\":\"🇻🇪\",\"flag-vg\":\"🇻🇬\",\"flag-vi\":\"🇻🇮\",\"flag-vn\":\"🇻🇳\",\"flag-vu\":\"🇻🇺\",\"flag-wf\":\"🇼🇫\",\"flag-ws\":\"🇼🇸\",\"flag-xk\":\"🇽🇰\",\"flag-ye\":\"🇾🇪\",\"flag-yt\":\"🇾🇹\",\"flag-za\":\"🇿🇦\",\"flag-zm\":\"🇿🇲\",\"flag-zw\":\"🇿🇼\",\"man-man-boy\":\"👨‍👨‍👦\",\"man-man-boy-boy\":\"👨‍👨‍👦‍👦\",\"man-man-girl\":\"👨‍👨‍👧\",\"man-man-girl-boy\":\"👨‍👨‍👧‍👦\",\"man-man-girl-girl\":\"👨‍👨‍👧‍👧\",\"man-woman-boy-boy\":\"👨‍👩‍👦‍👦\",\"man-woman-girl\":\"👨‍👩‍👧\",\"man-woman-girl-boy\":\"👨‍👩‍👧‍👦\",\"man-woman-girl-girl\":\"👨‍👩‍👧‍👧\",\"man-heart-man\":\"👨‍❤️‍👨\",\"man-kiss-man\":\"👨‍❤️‍💋‍👨\",\"woman-woman-boy\":\"👩‍👩‍👦\",\"woman-woman-boy-boy\":\"👩‍👩‍👦‍👦\",\"woman-woman-girl\":\"👩‍👩‍👧\",\"woman-woman-girl-boy\":\"👩‍👩‍👧‍👦\",\"woman-woman-girl-girl\":\"👩‍👩‍👧‍👧\",\"woman-heart-woman\":\"👩‍❤️‍👩\",\"woman-kiss-woman\":\"👩‍❤️‍💋‍👩\"}\n\n/***/ }),\n/* 765 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*!\n * normalize-path <https://github.com/jonschlinkert/normalize-path>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\nvar removeTrailingSeparator = __webpack_require__(796);\n\nmodule.exports = function normalizePath(str, stripTrailing) {\n  if (typeof str !== 'string') {\n    throw new TypeError('expected a string');\n  }\n  str = str.replace(/[\\\\\\/]+/g, '/');\n  if (stripTrailing !== false) {\n    str = removeTrailingSeparator(str);\n  }\n  return str;\n};\n\n\n/***/ }),\n/* 766 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nlet path\n\nclass LogicalTree {\n  constructor (name, address, opts) {\n    this.name = name\n    this.version = opts.version\n    this.address = address || ''\n    this.optional = !!opts.optional\n    this.dev = !!opts.dev\n    this.bundled = !!opts.bundled\n    this.resolved = opts.resolved\n    this.integrity = opts.integrity\n    this.dependencies = new Map()\n    this.requiredBy = new Set()\n  }\n\n  get isRoot () { return !this.requiredBy.size }\n\n  addDep (dep) {\n    this.dependencies.set(dep.name, dep)\n    dep.requiredBy.add(this)\n    return this\n  }\n\n  delDep (dep) {\n    this.dependencies.delete(dep.name)\n    dep.requiredBy.delete(this)\n    return this\n  }\n\n  getDep (name) {\n    return this.dependencies.get(name)\n  }\n\n  path (prefix) {\n    if (this.isRoot) {\n      // The address of the root is the prefix itself.\n      return prefix || ''\n    } else {\n      if (!path) { path = __webpack_require__(0) }\n      return path.join(\n        prefix || '',\n        'node_modules',\n        this.address.replace(/:/g, '/node_modules/')\n      )\n    }\n  }\n\n  // This finds cycles _from_ a given node: if some deeper dep has\n  // its own cycle, but that cycle does not refer to this node,\n  // it will return false.\n  hasCycle (_seen, _from) {\n    if (!_seen) { _seen = new Set() }\n    if (!_from) { _from = this }\n    for (let dep of this.dependencies.values()) {\n      if (_seen.has(dep)) { continue }\n      _seen.add(dep)\n      if (dep === _from || dep.hasCycle(_seen, _from)) {\n        return true\n      }\n    }\n    return false\n  }\n\n  forEachAsync (fn, opts, _pending) {\n    if (!opts) { opts = _pending || {} }\n    if (!_pending) { _pending = new Map() }\n    const P = opts.Promise || Promise\n    if (_pending.has(this)) {\n      return P.resolve(this.hasCycle() || _pending.get(this))\n    }\n    const pending = P.resolve().then(() => {\n      return fn(this, () => {\n        return promiseMap(\n          this.dependencies.values(),\n          dep => dep.forEachAsync(fn, opts, _pending),\n          opts\n        )\n      })\n    })\n    _pending.set(this, pending)\n    return pending\n  }\n\n  forEach (fn, _seen) {\n    if (!_seen) { _seen = new Set() }\n    if (_seen.has(this)) { return }\n    _seen.add(this)\n    fn(this, () => {\n      for (let dep of this.dependencies.values()) {\n        dep.forEach(fn, _seen)\n      }\n    })\n  }\n}\n\nmodule.exports = lockTree\nfunction lockTree (pkg, pkgLock, opts) {\n  const tree = makeNode(pkg.name, null, pkg)\n  const allDeps = new Map()\n  Array.from(\n    new Set(Object.keys(pkg.devDependencies || {})\n    .concat(Object.keys(pkg.optionalDependencies || {}))\n    .concat(Object.keys(pkg.dependencies || {})))\n  ).forEach(name => {\n    let dep = allDeps.get(name)\n    if (!dep) {\n      const depNode = (pkgLock.dependencies || {})[name]\n      dep = makeNode(name, name, depNode)\n    }\n    addChild(dep, tree, allDeps, pkgLock)\n  })\n  return tree\n}\n\nmodule.exports.node = makeNode\nfunction makeNode (name, address, opts) {\n  return new LogicalTree(name, address, opts || {})\n}\n\nfunction addChild (dep, tree, allDeps, pkgLock) {\n  tree.addDep(dep)\n  allDeps.set(dep.address, dep)\n  const addr = dep.address\n  const lockNode = atAddr(pkgLock, addr)\n  Object.keys(lockNode.requires || {}).forEach(name => {\n    const tdepAddr = reqAddr(pkgLock, name, addr)\n    let tdep = allDeps.get(tdepAddr)\n    if (!tdep) {\n      tdep = makeNode(name, tdepAddr, atAddr(pkgLock, tdepAddr))\n      addChild(tdep, dep, allDeps, pkgLock)\n    } else {\n      dep.addDep(tdep)\n    }\n  })\n}\n\nmodule.exports._reqAddr = reqAddr\nfunction reqAddr (pkgLock, name, fromAddr) {\n  const lockNode = atAddr(pkgLock, fromAddr)\n  const child = (lockNode.dependencies || {})[name]\n  if (child) {\n    return `${fromAddr}:${name}`\n  } else {\n    const parts = fromAddr.split(':')\n    while (parts.length) {\n      parts.pop()\n      const joined = parts.join(':')\n      const parent = atAddr(pkgLock, joined)\n      if (parent) {\n        const child = (parent.dependencies || {})[name]\n        if (child) {\n          return `${joined}${parts.length ? ':' : ''}${name}`\n        }\n      }\n    }\n    const err = new Error(`${name} not accessible from ${fromAddr}`)\n    err.pkgLock = pkgLock\n    err.target = name\n    err.from = fromAddr\n    throw err\n  }\n}\n\nmodule.exports._atAddr = atAddr\nfunction atAddr (pkgLock, addr) {\n  if (!addr.length) { return pkgLock }\n  const parts = addr.split(':')\n  return parts.reduce((acc, next) => {\n    return acc && (acc.dependencies || {})[next]\n  }, pkgLock)\n}\n\nfunction promiseMap (arr, fn, opts, _index) {\n  _index = _index || 0\n  const P = (opts && opts.Promise) || Promise\n  if (P.map) {\n    return P.map(arr, fn, opts)\n  } else {\n    if (!(arr instanceof Array)) {\n      arr = Array.from(arr)\n    }\n    if (_index >= arr.length) {\n      return P.resolve()\n    } else {\n      return P.resolve(fn(arr[_index], _index, arr))\n      .then(() => promiseMap(arr, fn, opts, _index + 1))\n    }\n  }\n}\n\n\n/***/ }),\n/* 767 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = Number.isNaN || function (x) {\n\treturn x !== x;\n};\n\n\n/***/ }),\n/* 768 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar crypto = __webpack_require__(11)\n  , qs = __webpack_require__(197)\n  ;\n\nfunction sha1 (key, body) {\n  return crypto.createHmac('sha1', key).update(body).digest('base64')\n}\n\nfunction rsa (key, body) {\n  return crypto.createSign(\"RSA-SHA1\").update(body).sign(key, 'base64');\n}\n\nfunction rfc3986 (str) {\n  return encodeURIComponent(str)\n    .replace(/!/g,'%21')\n    .replace(/\\*/g,'%2A')\n    .replace(/\\(/g,'%28')\n    .replace(/\\)/g,'%29')\n    .replace(/'/g,'%27')\n    ;\n}\n\n// Maps object to bi-dimensional array\n// Converts { foo: 'A', bar: [ 'b', 'B' ]} to\n// [ ['foo', 'A'], ['bar', 'b'], ['bar', 'B'] ]\nfunction map (obj) {\n  var key, val, arr = []\n  for (key in obj) {\n    val = obj[key]\n    if (Array.isArray(val))\n      for (var i = 0; i < val.length; i++)\n        arr.push([key, val[i]])\n    else if (typeof val === \"object\")\n      for (var prop in val)\n        arr.push([key + '[' + prop + ']', val[prop]]);\n    else\n      arr.push([key, val])\n  }\n  return arr\n}\n\n// Compare function for sort\nfunction compare (a, b) {\n  return a > b ? 1 : a < b ? -1 : 0\n}\n\nfunction generateBase (httpMethod, base_uri, params) {\n  // adapted from https://dev.twitter.com/docs/auth/oauth and \n  // https://dev.twitter.com/docs/auth/creating-signature\n\n  // Parameter normalization\n  // http://tools.ietf.org/html/rfc5849#section-3.4.1.3.2\n  var normalized = map(params)\n  // 1.  First, the name and value of each parameter are encoded\n  .map(function (p) {\n    return [ rfc3986(p[0]), rfc3986(p[1] || '') ]\n  })\n  // 2.  The parameters are sorted by name, using ascending byte value\n  //     ordering.  If two or more parameters share the same name, they\n  //     are sorted by their value.\n  .sort(function (a, b) {\n    return compare(a[0], b[0]) || compare(a[1], b[1])\n  })\n  // 3.  The name of each parameter is concatenated to its corresponding\n  //     value using an \"=\" character (ASCII code 61) as a separator, even\n  //     if the value is empty.\n  .map(function (p) { return p.join('=') })\n   // 4.  The sorted name/value pairs are concatenated together into a\n   //     single string by using an \"&\" character (ASCII code 38) as\n   //     separator.\n  .join('&')\n\n  var base = [\n    rfc3986(httpMethod ? httpMethod.toUpperCase() : 'GET'),\n    rfc3986(base_uri),\n    rfc3986(normalized)\n  ].join('&')\n\n  return base\n}\n\nfunction hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) {\n  var base = generateBase(httpMethod, base_uri, params)\n  var key = [\n    consumer_secret || '',\n    token_secret || ''\n  ].map(rfc3986).join('&')\n\n  return sha1(key, base)\n}\n\nfunction rsasign (httpMethod, base_uri, params, private_key, token_secret) {\n  var base = generateBase(httpMethod, base_uri, params)\n  var key = private_key || ''\n\n  return rsa(key, base)\n}\n\nfunction plaintext (consumer_secret, token_secret) {\n  var key = [\n    consumer_secret || '',\n    token_secret || ''\n  ].map(rfc3986).join('&')\n\n  return key\n}\n\nfunction sign (signMethod, httpMethod, base_uri, params, consumer_secret, token_secret) {\n  var method\n  var skipArgs = 1\n\n  switch (signMethod) {\n    case 'RSA-SHA1':\n      method = rsasign\n      break\n    case 'HMAC-SHA1':\n      method = hmacsign\n      break\n    case 'PLAINTEXT':\n      method = plaintext\n      skipArgs = 4\n      break\n    default:\n     throw new Error(\"Signature method not supported: \" + signMethod)\n  }\n\n  return method.apply(null, [].slice.call(arguments, skipArgs))\n}\n\nexports.hmacsign = hmacsign\nexports.rsasign = rsasign\nexports.plaintext = plaintext\nexports.sign = sign\nexports.rfc3986 = rfc3986\nexports.generateBase = generateBase\n\n\n\n/***/ }),\n/* 769 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * object.omit <https://github.com/jonschlinkert/object.omit>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n\n\nvar isObject = __webpack_require__(735);\nvar forOwn = __webpack_require__(770);\n\nmodule.exports = function omit(obj, keys) {\n  if (!isObject(obj)) return {};\n\n  keys = [].concat.apply([], [].slice.call(arguments, 1));\n  var last = keys[keys.length - 1];\n  var res = {}, fn;\n\n  if (typeof last === 'function') {\n    fn = keys.pop();\n  }\n\n  var isFunction = typeof fn === 'function';\n  if (!keys.length && !isFunction) {\n    return obj;\n  }\n\n  forOwn(obj, function(value, key) {\n    if (keys.indexOf(key) === -1) {\n\n      if (!isFunction) {\n        res[key] = value;\n      } else if (fn(value, key, obj)) {\n        res[key] = value;\n      }\n    }\n  });\n  return res;\n};\n\n\n/***/ }),\n/* 770 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * for-own <https://github.com/jonschlinkert/for-own>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n\n\nvar forIn = __webpack_require__(615);\nvar hasOwn = Object.prototype.hasOwnProperty;\n\nmodule.exports = function forOwn(obj, fn, thisArg) {\n  forIn(obj, function(val, key) {\n    if (hasOwn.call(obj, key)) {\n      return fn.call(thisArg, obj[key], key, obj);\n    }\n  });\n};\n\n\n/***/ }),\n/* 771 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst mimicFn = __webpack_require__(760);\n\nmodule.exports = (fn, opts) => {\n\t// TODO: Remove this in v3\n\tif (opts === true) {\n\t\tthrow new TypeError('The second argument is now an options object');\n\t}\n\n\tif (typeof fn !== 'function') {\n\t\tthrow new TypeError('Expected a function');\n\t}\n\n\topts = opts || {};\n\n\tlet ret;\n\tlet called = false;\n\tconst fnName = fn.displayName || fn.name || '<anonymous>';\n\n\tconst onetime = function () {\n\t\tif (called) {\n\t\t\tif (opts.throw === true) {\n\t\t\t\tthrow new Error(`Function \\`${fnName}\\` can only be called once`);\n\t\t\t}\n\n\t\t\treturn ret;\n\t\t}\n\n\t\tcalled = true;\n\t\tret = fn.apply(this, arguments);\n\t\tfn = null;\n\n\t\treturn ret;\n\t};\n\n\tmimicFn(onetime, fn);\n\n\treturn onetime;\n};\n\n\n/***/ }),\n/* 772 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar isWindows = process.platform === 'win32';\nvar trailingSlashRe = isWindows ? /[^:]\\\\$/ : /.\\/$/;\n\n// https://github.com/nodejs/node/blob/3e7a14381497a3b73dda68d05b5130563cdab420/lib/os.js#L25-L43\nmodule.exports = function () {\n\tvar path;\n\n\tif (isWindows) {\n\t\tpath = process.env.TEMP ||\n\t\t\tprocess.env.TMP ||\n\t\t\t(process.env.SystemRoot || process.env.windir) + '\\\\temp';\n\t} else {\n\t\tpath = process.env.TMPDIR ||\n\t\t\tprocess.env.TMP ||\n\t\t\tprocess.env.TEMP ||\n\t\t\t'/tmp';\n\t}\n\n\tif (trailingSlashRe.test(path)) {\n\t\tpath = path.slice(0, -1);\n\t}\n\n\treturn path;\n};\n\n\n/***/ }),\n/* 773 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * parse-glob <https://github.com/jonschlinkert/parse-glob>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n\n\nvar isGlob = __webpack_require__(179);\nvar findBase = __webpack_require__(620);\nvar extglob = __webpack_require__(178);\nvar dotfile = __webpack_require__(733);\n\n/**\n * Expose `cache`\n */\n\nvar cache = module.exports.cache = {};\n\n/**\n * Parse a glob pattern into tokens.\n *\n * When no paths or '**' are in the glob, we use a\n * different strategy for parsing the filename, since\n * file names can contain braces and other difficult\n * patterns. such as:\n *\n *  - `*.{a,b}`\n *  - `(**|*.js)`\n */\n\nmodule.exports = function parseGlob(glob) {\n  if (cache.hasOwnProperty(glob)) {\n    return cache[glob];\n  }\n\n  var tok = {};\n  tok.orig = glob;\n  tok.is = {};\n\n  // unescape dots and slashes in braces/brackets\n  glob = escape(glob);\n\n  var parsed = findBase(glob);\n  tok.is.glob = parsed.isGlob;\n\n  tok.glob = parsed.glob;\n  tok.base = parsed.base;\n  var segs = /([^\\/]*)$/.exec(glob);\n\n  tok.path = {};\n  tok.path.dirname = '';\n  tok.path.basename = segs[1] || '';\n  tok.path.dirname = glob.split(tok.path.basename).join('') || '';\n  var basename = (tok.path.basename || '').split('.') || '';\n  tok.path.filename = basename[0] || '';\n  tok.path.extname = basename.slice(1).join('.') || '';\n  tok.path.ext = '';\n\n  if (isGlob(tok.path.dirname) && !tok.path.basename) {\n    if (!/\\/$/.test(tok.glob)) {\n      tok.path.basename = tok.glob;\n    }\n    tok.path.dirname = tok.base;\n  }\n\n  if (glob.indexOf('/') === -1 && !tok.is.globstar) {\n    tok.path.dirname = '';\n    tok.path.basename = tok.orig;\n  }\n\n  var dot = tok.path.basename.indexOf('.');\n  if (dot !== -1) {\n    tok.path.filename = tok.path.basename.slice(0, dot);\n    tok.path.extname = tok.path.basename.slice(dot);\n  }\n\n  if (tok.path.extname.charAt(0) === '.') {\n    var exts = tok.path.extname.split('.');\n    tok.path.ext = exts[exts.length - 1];\n  }\n\n  // unescape dots and slashes in braces/brackets\n  tok.glob = unescape(tok.glob);\n  tok.path.dirname = unescape(tok.path.dirname);\n  tok.path.basename = unescape(tok.path.basename);\n  tok.path.filename = unescape(tok.path.filename);\n  tok.path.extname = unescape(tok.path.extname);\n\n  // Booleans\n  var is = (glob && tok.is.glob);\n  tok.is.negated  = glob && glob.charAt(0) === '!';\n  tok.is.extglob  = glob && extglob(glob);\n  tok.is.braces   = has(is, glob, '{');\n  tok.is.brackets = has(is, glob, '[:');\n  tok.is.globstar = has(is, glob, '**');\n  tok.is.dotfile  = dotfile(tok.path.basename) || dotfile(tok.path.filename);\n  tok.is.dotdir   = dotdir(tok.path.dirname);\n  return (cache[glob] = tok);\n}\n\n/**\n * Returns true if the glob matches dot-directories.\n *\n * @param  {Object} `tok` The tokens object\n * @param  {Object} `path` The path object\n * @return {Object}\n */\n\nfunction dotdir(base) {\n  if (base.indexOf('/.') !== -1) {\n    return true;\n  }\n  if (base.charAt(0) === '.' && base.charAt(1) !== '/') {\n    return true;\n  }\n  return false;\n}\n\n/**\n * Returns true if the pattern has the given `ch`aracter(s)\n *\n * @param  {Object} `glob` The glob pattern.\n * @param  {Object} `ch` The character to test for\n * @return {Object}\n */\n\nfunction has(is, glob, ch) {\n  return is && glob.indexOf(ch) !== -1;\n}\n\n/**\n * Escape/unescape utils\n */\n\nfunction escape(str) {\n  var re = /\\{([^{}]*?)}|\\(([^()]*?)\\)|\\[([^\\[\\]]*?)\\]/g;\n  return str.replace(re, function (outter, braces, parens, brackets) {\n    var inner = braces || parens || brackets;\n    if (!inner) { return outter; }\n    return outter.split(inner).join(esc(inner));\n  });\n}\n\nfunction esc(str) {\n  str = str.split('/').join('__SLASH__');\n  str = str.split('.').join('__DOT__');\n  return str;\n}\n\nfunction unescape(str) {\n  str = str.split('__SLASH__').join('/');\n  str = str.split('__DOT__').join('.');\n  return str;\n}\n\n\n/***/ }),\n/* 774 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar isWindows = process.platform === 'win32';\n\n// Regex to split a windows path into three parts: [*, device, slash,\n// tail] windows-only\nvar splitDeviceRe =\n    /^([a-zA-Z]:|[\\\\\\/]{2}[^\\\\\\/]+[\\\\\\/]+[^\\\\\\/]+)?([\\\\\\/])?([\\s\\S]*?)$/;\n\n// Regex to split the tail part of the above into [*, dir, basename, ext]\nvar splitTailRe =\n    /^([\\s\\S]*?)((?:\\.{1,2}|[^\\\\\\/]+?|)(\\.[^.\\/\\\\]*|))(?:[\\\\\\/]*)$/;\n\nvar win32 = {};\n\n// Function to split a filename into [root, dir, basename, ext]\nfunction win32SplitPath(filename) {\n  // Separate device+slash from tail\n  var result = splitDeviceRe.exec(filename),\n      device = (result[1] || '') + (result[2] || ''),\n      tail = result[3] || '';\n  // Split the tail into dir, basename and extension\n  var result2 = splitTailRe.exec(tail),\n      dir = result2[1],\n      basename = result2[2],\n      ext = result2[3];\n  return [device, dir, basename, ext];\n}\n\nwin32.parse = function(pathString) {\n  if (typeof pathString !== 'string') {\n    throw new TypeError(\n        \"Parameter 'pathString' must be a string, not \" + typeof pathString\n    );\n  }\n  var allParts = win32SplitPath(pathString);\n  if (!allParts || allParts.length !== 4) {\n    throw new TypeError(\"Invalid path '\" + pathString + \"'\");\n  }\n  return {\n    root: allParts[0],\n    dir: allParts[0] + allParts[1].slice(0, -1),\n    base: allParts[2],\n    ext: allParts[3],\n    name: allParts[2].slice(0, allParts[2].length - allParts[3].length)\n  };\n};\n\n\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n    /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar posix = {};\n\n\nfunction posixSplitPath(filename) {\n  return splitPathRe.exec(filename).slice(1);\n}\n\n\nposix.parse = function(pathString) {\n  if (typeof pathString !== 'string') {\n    throw new TypeError(\n        \"Parameter 'pathString' must be a string, not \" + typeof pathString\n    );\n  }\n  var allParts = posixSplitPath(pathString);\n  if (!allParts || allParts.length !== 4) {\n    throw new TypeError(\"Invalid path '\" + pathString + \"'\");\n  }\n  allParts[1] = allParts[1] || '';\n  allParts[2] = allParts[2] || '';\n  allParts[3] = allParts[3] || '';\n\n  return {\n    root: allParts[0],\n    dir: allParts[0] + allParts[1].slice(0, -1),\n    base: allParts[2],\n    ext: allParts[3],\n    name: allParts[2].slice(0, allParts[2].length - allParts[3].length)\n  };\n};\n\n\nif (isWindows)\n  module.exports = win32.parse;\nelse /* posix */\n  module.exports = posix.parse;\n\nmodule.exports.posix = posix.parse;\nmodule.exports.win32 = win32.parse;\n\n\n/***/ }),\n/* 775 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar duplexify = __webpack_require__(380)\nvar through = __webpack_require__(461)\nvar bufferFrom = __webpack_require__(563)\n\nvar noop = function() {}\n\nvar isObject = function(data) {\n  return !Buffer.isBuffer(data) && typeof data !== 'string'\n}\n\nvar peek = function(opts, onpeek) {\n  if (typeof opts === 'number') opts = {maxBuffer:opts}\n  if (typeof opts === 'function') return peek(null, opts)\n  if (!opts) opts = {}\n\n  var maxBuffer = typeof opts.maxBuffer === 'number' ? opts.maxBuffer : 65535\n  var strict = opts.strict\n  var newline = opts.newline !== false\n\n  var buffer = []\n  var bufferSize = 0\n  var dup = duplexify.obj()\n\n  var peeker = through.obj({highWaterMark:1}, function(data, enc, cb) {\n    if (isObject(data)) return ready(data, null, cb)\n    if (!Buffer.isBuffer(data)) data = bufferFrom(data)\n\n    if (newline) {\n      var nl = Array.prototype.indexOf.call(data, 10)\n      if (nl > 0 && data[nl-1] === 13) nl--\n\n      if (nl > -1) {\n        buffer.push(data.slice(0, nl))\n        return ready(Buffer.concat(buffer), data.slice(nl), cb)\n      }\n    }\n\n    buffer.push(data)\n    bufferSize += data.length\n\n    if (bufferSize < maxBuffer) return cb()\n    if (strict) return cb(new Error('No newline found'))\n    ready(Buffer.concat(buffer), null, cb)\n  })\n\n  var onpreend = function() {\n    if (strict) return dup.destroy(new Error('No newline found'))\n    dup.cork()\n    ready(Buffer.concat(buffer), null, function(err) {\n      if (err) return dup.destroy(err)\n      dup.uncork()\n    })\n  }\n\n  var ready = function(data, overflow, cb) {\n    dup.removeListener('preend', onpreend)\n    onpeek(data, function(err, parser) {\n      if (err) return cb(err)\n\n      dup.setWritable(parser)\n      dup.setReadable(parser)\n\n      if (data) parser.write(data)\n      if (overflow) parser.write(overflow)\n\n      overflow = buffer = peeker = null // free the data\n      cb()\n    })\n  }\n\n  dup.on('preend', onpreend)\n  dup.setWritable(peeker)\n\n  return dup\n}\n\nmodule.exports = peek\n\n\n/***/ }),\n/* 776 */\n/***/ (function(module, exports) {\n\n// Generated by CoffeeScript 1.12.2\n(function() {\n  var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;\n\n  if ((typeof performance !== \"undefined\" && performance !== null) && performance.now) {\n    module.exports = function() {\n      return performance.now();\n    };\n  } else if ((typeof process !== \"undefined\" && process !== null) && process.hrtime) {\n    module.exports = function() {\n      return (getNanoSeconds() - nodeLoadTime) / 1e6;\n    };\n    hrtime = process.hrtime;\n    getNanoSeconds = function() {\n      var hr;\n      hr = hrtime();\n      return hr[0] * 1e9 + hr[1];\n    };\n    moduleLoadTime = getNanoSeconds();\n    upTime = process.uptime() * 1e9;\n    nodeLoadTime = moduleLoadTime - upTime;\n  } else if (Date.now) {\n    module.exports = function() {\n      return Date.now() - loadTime;\n    };\n    loadTime = Date.now();\n  } else {\n    module.exports = function() {\n      return new Date().getTime() - loadTime;\n    };\n    loadTime = new Date().getTime();\n  }\n\n}).call(this);\n\n//# sourceMappingURL=performance-now.js.map\n\n\n/***/ }),\n/* 777 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = (url, opts) => {\n\tif (typeof url !== 'string') {\n\t\tthrow new TypeError(`Expected \\`url\\` to be of type \\`string\\`, got \\`${typeof url}\\``);\n\t}\n\n\turl = url.trim();\n\topts = Object.assign({https: false}, opts);\n\n\tif (/^\\.*\\/|^(?!localhost)\\w+:/.test(url)) {\n\t\treturn url;\n\t}\n\n\treturn url.replace(/^(?!(?:\\w+:)?\\/\\/)/, opts.https ? 'https://' : 'http://');\n};\n\n\n/***/ }),\n/* 778 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * preserve <https://github.com/jonschlinkert/preserve>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT license.\n */\n\n\n\n/**\n * Replace tokens in `str` with a temporary, heuristic placeholder.\n *\n * ```js\n * tokens.before('{a\\\\,b}');\n * //=> '{__ID1__}'\n * ```\n *\n * @param  {String} `str`\n * @return {String} String with placeholders.\n * @api public\n */\n\nexports.before = function before(str, re) {\n  return str.replace(re, function (match) {\n    var id = randomize();\n    cache[id] = match;\n    return '__ID' + id + '__';\n  });\n};\n\n/**\n * Replace placeholders in `str` with original tokens.\n *\n * ```js\n * tokens.after('{__ID1__}');\n * //=> '{a\\\\,b}'\n * ```\n *\n * @param  {String} `str` String with placeholders\n * @return {String} `str` String with original tokens.\n * @api public\n */\n\nexports.after = function after(str) {\n  return str.replace(/__ID(.{5})__/g, function (_, id) {\n    return cache[id];\n  });\n};\n\nfunction randomize() {\n  return Math.random().toString().slice(2, 7);\n}\n\nvar cache = {};\n\n/***/ }),\n/* 779 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction makeSync(fs, name) {\n    const fn = fs[`${name}Sync`];\n\n    return function () {\n        const callback = arguments[arguments.length - 1];\n        const args = Array.prototype.slice.call(arguments, 0, -1);\n        let ret;\n\n        try {\n            ret = fn.apply(fs, args);\n        } catch (err) {\n            return callback(err);\n        }\n\n        callback(null, ret);\n    };\n}\n\nfunction syncFs(fs) {\n    const fns = ['mkdir', 'realpath', 'stat', 'rmdir', 'utimes'];\n    const obj = {};\n\n    // Create the sync versions of the methods that we need\n    fns.forEach((name) => {\n        obj[name] = makeSync(fs, name);\n    });\n\n    // Copy the rest of the functions\n    for (const key in fs) {\n        if (!obj[key]) {\n            obj[key] = fs[key];\n        }\n    }\n\n    return obj;\n}\n\nmodule.exports = syncFs;\n\n\n/***/ }),\n/* 780 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n/**\n * Key a method on your object with this symbol and you can get special\n * formatting for that value! See ShellStringText, ShellStringUnquoted, or\n * shellStringSemicolon for examples.\n * @ignore\n */\nconst formatSymbol = Symbol('format');\n/**\n * This symbol is for implementing advanced behaviors like the need for extra\n * carets in Windows shell strings that use pipes. If present, it's called in\n * an earlier phase than formatSymbol, and is passed a mutable context that can\n * be read during the format phase to influence formatting.\n * @ignore\n */\nconst preformatSymbol = Symbol('preformat');\n\n// When minimum Node version becomes 6, replace calls to sticky with /.../y and\n// inline execFrom.\nlet stickySupported = true;\ntry {\n  new RegExp('', 'y');\n} catch (e) {\n  stickySupported = false;\n}\nconst sticky = stickySupported ? source => new RegExp(source, 'y') : source => new RegExp(`^(?:${source})`);\nconst execFrom = stickySupported ? (re, haystack, index) => (re.lastIndex = index, re.exec(haystack)) : (re, haystack, index) => re.exec(haystack.substr(index));\n\nfunction quoteForCmd(text, forceQuote) {\n  let caretDepth = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n  // See the below blog post for an explanation of this function and\n  // quoteForWin32:\n  // https://blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/23/everyone-quotes-command-line-arguments-the-wrong-way/\n  if (!text.length) {\n    return '\"\"';\n  }\n  if (/[\\n\\r]/.test(text)) {\n    throw new Error(\"Line breaks can't be quoted on Windows\");\n  }\n  const caretEscape = /[\"%]/.test(text);\n  text = quoteForWin32(text, forceQuote || !caretEscape && /[&()<>^|]/.test(text));\n  if (caretEscape) {\n    // See Win32Context for explanation of what caretDepth is for.\n    do {\n      text = text.replace(/[\\t \"%&()<>^|]/g, '^$&');\n    } while (caretDepth--);\n  }\n  return text;\n}\nconst quoteForWin32 = (text, forceQuote) => forceQuote || /[\\t \"]/.test(text) ? `\"${text.replace(/\\\\+(?=$|\")/g, '$&$&').replace(/\"/g, '\\\\\"')}\"` : text;\nconst cmdMetaChars = /[\\t\\n\\r \"%&()<>^|]/;\nclass Win32Context {\n  constructor() {\n    this.currentScope = newScope(null);\n    this.scopesByObject = new Map();\n  }\n  read(text) {\n    // When cmd.exe pipes to or from a batch file, it spawns a second copy of\n    // itself to run the inner command. This necessitates doubling up on carets\n    // so that escaped characters survive both cmd.exe invocations. See:\n    // https://stackoverflow.com/questions/8192318/why-does-delayed-expansion-fail-when-inside-a-piped-block-of-code#8194279\n    // https://ss64.com/nt/syntax-redirection.html\n    //\n    // Parentheses can create an additional subshell, requiring additional\n    // escaping... it's a mess.\n    //\n    // So here's what we do about it: we read all unquoted text in a shell\n    // string and put it through this tiny parser that looks for pipes,\n    // sequence operators (&, &&, ||), and parentheses. This can't be part of\n    // the main Puka parsing, because it can be affected by `unquoted(...)`\n    // values provided at evaluation time.\n    //\n    // Then, after associating each thing that needs to be quoted with a scope\n    // (via `mark()`), we can determine the depth of caret escaping required\n    // in each scope and pass it (via `Formatter::quote()`) to `quoteForCmd()`.\n    //\n    // See also `ShellStringText`, which holds the logic for the previous\n    // paragraph.\n    const length = text.length;\n    for (let pos = 0, match; pos < length;) {\n      if (match = execFrom(reUnimportant, text, pos)) {\n        pos += match[0].length;\n      }\n      if (pos >= length) break;\n      if (match = execFrom(reSeqOp, text, pos)) {\n        this.seq();\n        pos += match[0].length;\n      } else {\n        const char = text.charCodeAt(pos);\n        if (char === CARET) {\n          pos += 2;\n        } else if (char === QUOTE) {\n          // If you were foolish enough to leave a dangling quotation mark in\n          // an unquoted span... you're likely to have bigger problems than\n          // incorrect escaping. So we just do the simplest thing of looking for\n          // the end quote only in this piece of text.\n          pos += execFrom(reNotQuote, text, pos + 1)[0].length + 2;\n        } else {\n          if (char === OPEN_PAREN) {\n            this.enterScope();\n          } else if (char === CLOSE_PAREN) {\n            this.exitScope();\n          } else {\n            // (char === '|')\n            this.currentScope.depthDelta = 1;\n          }\n          pos++;\n        }\n      }\n    }\n  }\n  enterScope() {\n    this.currentScope = newScope(this.currentScope);\n  }\n  exitScope() {\n    this.currentScope = this.currentScope.parent || (this.currentScope.parent = newScope(null));\n  }\n  seq() {\n    // | binds tighter than sequence operators, so the latter create new sibling\n    // scopes for future |s to mutate.\n    this.currentScope = newScope(this.currentScope.parent);\n  }\n  mark(obj) {\n    this.scopesByObject.set(obj, this.currentScope);\n  }\n  at(obj) {\n    return { depth: getDepth(this.scopesByObject.get(obj)) };\n  }\n}\nconst getDepth = scope => scope === null ? 0 : scope.depth !== -1 ? scope.depth : scope.depth = getDepth(scope.parent) + scope.depthDelta;\nconst newScope = parent => ({ parent, depthDelta: 0, depth: -1 });\nconst CARET = '^'.charCodeAt();\nconst QUOTE = '\"'.charCodeAt();\nconst OPEN_PAREN = '('.charCodeAt();\nconst CLOSE_PAREN = ')'.charCodeAt();\nconst reNotQuote = sticky('[^\"]*');\nconst reSeqOp = sticky('&&?|\\\\|\\\\|');\nconst reUnimportant = sticky('(?:>&|[^\"$&()^|])+');\n\nconst quoteForSh = (text, forceQuote) => text.length ? forceQuote || shMetaChars.test(text) ? `'${text.replace(/'/g, \"'\\\\''\")}'`.replace(/^(?:'')+(?!$)/, '').replace(/\\\\'''/g, \"\\\\'\") : text : \"''\";\nconst shMetaChars = /[\\t\\n\\r \"#$&'()*;<>?\\\\`|~]/;\n\n/**\n * To get a Formatter, call `Formatter.for`.\n *\n * To create a new Formatter, pass an object to `Formatter.declare`.\n *\n * To set the global default Formatter, assign to `Formatter.default`.\n *\n * @class\n * @property {Formatter} default - The Formatter to be used when no platform\n * is provided—for example, when creating strings with `sh`.\n * @ignore\n */\nfunction Formatter() {}\nObject.assign(Formatter, /** @lends Formatter */{\n  /**\n   * Gets a Formatter that has been declared for the provided platform, or\n   * the base `'sh'` formatter if there is no Formatter specific to this\n   * platform, or the Formatter for the current platform if no specific platform\n   * is provided.\n   */\n  for(platform) {\n    return platform == null ? Formatter.default || (Formatter.default = Formatter.for(process.platform)) : Formatter._registry.get(platform) || Formatter._registry.get('sh');\n  },\n  /**\n   * Creates a new Formatter or mutates the properties on an existing\n   * Formatter. The `platform` key on the provided properties object determines\n   * when the Formatter is retrieved.\n   */\n  declare(props) {\n    const platform = props && props.platform || 'sh';\n    const existingFormatter = Formatter._registry.get(platform);\n    const formatter = Object.assign(existingFormatter || new Formatter(), props);\n    formatter.emptyString === void 0 && (formatter.emptyString = formatter.quote('', true));\n    existingFormatter || Formatter._registry.set(formatter.platform, formatter);\n  },\n  _registry: new Map(),\n  prototype: {\n    platform: 'sh',\n    quote: quoteForSh,\n    metaChars: shMetaChars,\n    hasExtraMetaChars: false,\n    statementSeparator: ';',\n    createContext() {\n      return defaultContext;\n    }\n  }\n});\nconst defaultContext = {\n  at() {}\n};\nFormatter.declare();\nFormatter.declare({\n  platform: 'win32',\n  quote(text, forceQuote, opts) {\n    return quoteForCmd(text, forceQuote, opts && opts.depth || 0);\n  },\n  metaChars: cmdMetaChars,\n  hasExtraMetaChars: true,\n  statementSeparator: '&',\n  createContext(root) {\n    const context = new this.Context();\n    root[preformatSymbol](context);\n    return context;\n  },\n  Context: Win32Context\n});\n\nconst isObject = any => any === Object(any);\nfunction memoize(f) {\n  const cache = new WeakMap();\n  return arg => {\n    let result = cache.get(arg);\n    if (result === void 0) {\n      result = f(arg);\n      cache.set(arg, result);\n    }\n    return result;\n  };\n}\n\n/**\n * Represents a contiguous span of text that may or must be quoted. The contents\n * may already contain quoted segments, which will always be quoted. If unquoted\n * segments also require quoting, the entire span will be quoted together.\n * @ignore\n */\nclass ShellStringText {\n  constructor(contents, untested) {\n    this.contents = contents;\n    this.untested = untested;\n  }\n  [formatSymbol](formatter, context) {\n    const unformattedContents = this.contents;\n    const length = unformattedContents.length;\n    const contents = new Array(length);\n    for (let i = 0; i < length; i++) {\n      const c = unformattedContents[i];\n      contents[i] = isObject(c) && formatSymbol in c ? c[formatSymbol](formatter) : c;\n    }\n    for (let unquoted = true, i = 0; i < length; i++) {\n      const content = contents[i];\n      if (content === null) {\n        unquoted = !unquoted;\n      } else {\n        if (unquoted && (formatter.hasExtraMetaChars || this.untested && this.untested.has(i)) && formatter.metaChars.test(content)) {\n          return formatter.quote(contents.join(''), false, context.at(this));\n        }\n      }\n    }\n    const parts = [];\n    for (let quoted = null, i = 0; i < length; i++) {\n      const content = contents[i];\n      if (content === null) {\n        quoted = quoted ? (parts.push(formatter.quote(quoted.join(''), true, context.at(this))), null) : [];\n      } else {\n        (quoted || parts).push(content);\n      }\n    }\n    const result = parts.join('');\n    return result.length ? result : formatter.emptyString;\n  }\n  [preformatSymbol](context) {\n    context.mark(this);\n  }\n}\n\n/**\n * Represents a contiguous span of text that will not be quoted.\n * @ignore\n */\nclass ShellStringUnquoted {\n  constructor(value) {\n    this.value = value;\n  }\n  [formatSymbol]() {\n    return this.value;\n  }\n  [preformatSymbol](context) {\n    context.read(this.value);\n  }\n}\n\n/**\n * Represents a semicolon... or an ampersand, on Windows.\n * @ignore\n */\nconst shellStringSemicolon = {\n  [formatSymbol](formatter) {\n    return formatter.statementSeparator;\n  },\n  [preformatSymbol](context) {\n    context.seq();\n  }\n};\n\nconst PLACEHOLDER = {};\nconst parse = memoize(templateSpans => {\n  // These are the token types our DSL can recognize. Their values won't escape\n  // this function.\n  const TOKEN_TEXT = 0;\n  const TOKEN_QUOTE = 1;\n  const TOKEN_SEMI = 2;\n  const TOKEN_UNQUOTED = 3;\n  const TOKEN_SPACE = 4;\n  const TOKEN_REDIRECT = 5;\n  const result = [];\n  let placeholderCount = 0;\n  let prefix = null;\n  let onlyPrefixOnce = false;\n  let contents = [];\n  let quote = 0;\n  const lastSpan = templateSpans.length - 1;\n  for (let spanIndex = 0; spanIndex <= lastSpan; spanIndex++) {\n    const templateSpan = templateSpans[spanIndex];\n    const posEnd = templateSpan.length;\n    let tokenStart = 0;\n    if (spanIndex) {\n      placeholderCount++;\n      contents.push(PLACEHOLDER);\n    }\n    // For each span, we first do a recognizing pass in which we use regular\n    // expressions to identify the positions of tokens in the text, and then\n    // a second pass that actually splits the text into the minimum number of\n    // substrings necessary.\n    const recognized = []; // [type1, index1, type2, index2...]\n    let firstWordBreak = -1;\n    let lastWordBreak = -1;\n    {\n      let pos = 0,\n          match;\n      while (pos < posEnd) {\n        if (quote) {\n          if (match = execFrom(quote === CHAR_SQUO ? reQuotation1 : reQuotation2, templateSpan, pos)) {\n            recognized.push(TOKEN_TEXT, pos);\n            pos += match[0].length;\n          }\n          if (pos < posEnd) {\n            recognized.push(TOKEN_QUOTE, pos++);\n            quote = 0;\n          }\n        } else {\n          if (match = execFrom(reText, templateSpan, pos)) {\n            const setBreaks = match[1] != null;\n            setBreaks && firstWordBreak < 0 && (firstWordBreak = pos);\n            recognized.push(setBreaks ? TOKEN_UNQUOTED : TOKEN_TEXT, pos);\n            pos += match[0].length;\n            setBreaks && (lastWordBreak = pos);\n          }\n          if (match = execFrom(reRedirectOrSpace, templateSpan, pos)) {\n            firstWordBreak < 0 && (firstWordBreak = pos);\n            lastWordBreak = pos;\n            recognized.push(match[1] ? TOKEN_REDIRECT : TOKEN_SPACE, pos);\n            pos += match[0].length;\n          }\n          const char = templateSpan.charCodeAt(pos);\n          if (char === CHAR_SEMI) {\n            firstWordBreak < 0 && (firstWordBreak = pos);\n            recognized.push(TOKEN_SEMI, pos++);\n            lastWordBreak = pos;\n          } else if (char === CHAR_SQUO || char === CHAR_DQUO) {\n            recognized.push(TOKEN_QUOTE, pos++);\n            quote = char;\n          }\n        }\n      }\n    }\n    // Word breaks are only important if they separate words with placeholders,\n    // so we can ignore the first/last break if this is the first/last span.\n    spanIndex === 0 && (firstWordBreak = -1);\n    spanIndex === lastSpan && (lastWordBreak = posEnd);\n    // Here begins the second pass mentioned above. This loop runs one more\n    // iteration than there are tokens in recognized, because it handles tokens\n    // on a one-iteration delay; hence the i <= iEnd instead of i < iEnd.\n    const iEnd = recognized.length;\n    for (let i = 0, type = -1; i <= iEnd; i += 2) {\n      let typeNext = -1,\n          pos;\n      if (i === iEnd) {\n        pos = posEnd;\n      } else {\n        typeNext = recognized[i];\n        pos = recognized[i + 1];\n        // If the next token is space or redirect, but there's another word\n        // break in this span, then we can handle that token the same way we\n        // would handle unquoted text because it isn't being attached to a\n        // placeholder.\n        typeNext >= TOKEN_SPACE && pos !== lastWordBreak && (typeNext = TOKEN_UNQUOTED);\n      }\n      const breakHere = pos === firstWordBreak || pos === lastWordBreak;\n      if (pos && (breakHere || typeNext !== type)) {\n        let value = type === TOKEN_QUOTE ? null : type === TOKEN_SEMI ? shellStringSemicolon : templateSpan.substring(tokenStart, pos);\n        if (type >= TOKEN_SEMI) {\n          // This branch handles semicolons, unquoted text, spaces, and\n          // redirects. shellStringSemicolon is already a formatSymbol object;\n          // the rest need to be wrapped.\n          type === TOKEN_SEMI || (value = new ShellStringUnquoted(value));\n          // We don't need to check placeholderCount here like we do below;\n          // that's only relevant during the first word break of the span, and\n          // because this iteration of the loop is processing the token that\n          // was checked for breaks in the previous iteration, it will have\n          // already been handled. For the same reason, prefix is guaranteed to\n          // be null.\n          if (contents.length) {\n            result.push(new ShellStringText(contents, null));\n            contents = [];\n          }\n          // Only spaces and redirects become prefixes, but not if they've been\n          // rewritten to unquoted above.\n          if (type >= TOKEN_SPACE) {\n            prefix = value;\n            onlyPrefixOnce = type === TOKEN_SPACE;\n          } else {\n            result.push(value);\n          }\n        } else {\n          contents.push(value);\n        }\n        tokenStart = pos;\n      }\n      if (breakHere) {\n        if (placeholderCount) {\n          result.push({ contents, placeholderCount, prefix, onlyPrefixOnce });\n        } else {\n          // There's no prefix to handle in this branch; a prefix prior to this\n          // span would mean placeholderCount > 0, and a prefix in this span\n          // can't be created because spaces and redirects get rewritten to\n          // unquoted before the last word break.\n          contents.length && result.push(new ShellStringText(contents, null));\n        }\n        placeholderCount = 0;prefix = null;onlyPrefixOnce = false;\n        contents = [];\n      }\n      type = typeNext;\n    }\n  }\n  if (quote) {\n    throw new SyntaxError(`String is missing a ${String.fromCharCode(quote)} character`);\n  }\n  return result;\n});\nconst CHAR_SEMI = ';'.charCodeAt();\nconst CHAR_SQUO = \"'\".charCodeAt();\nconst CHAR_DQUO = '\"'.charCodeAt();\nconst reQuotation1 = sticky(\"[^']+\");\nconst reQuotation2 = sticky('[^\"]+');\nconst reText = sticky('[^\\\\s\"#$&\\'();<>\\\\\\\\`|]+|([#$&()\\\\\\\\`|]+)');\nconst reRedirectOrSpace = sticky('((?:\\\\s+\\\\d+|\\\\s*)[<>]+\\\\s*)|\\\\s+');\n\nclass BitSet {\n  constructor() {\n    this.vector = new Int32Array(1);\n  }\n  has(n) {\n    return (this.vector[n >>> 5] & 1 << n) !== 0;\n  }\n  add(n) {\n    const i = n >>> 5,\n          requiredLength = i + 1;\n    let vector = this.vector;var _vector = vector;\n    let length = _vector.length;\n    if (requiredLength > length) {\n      while (requiredLength > (length *= 2));\n      const oldValues = vector;\n      vector = new Int32Array(length);\n      vector.set(oldValues);\n      this.vector = vector;\n    }\n    vector[i] |= 1 << n;\n  }\n}\n\nfunction evaluate(template, values) {\n  values = values.map(toStringishArray);\n  const children = [];\n  let valuesStart = 0;\n  for (let i = 0, iMax = template.length; i < iMax; i++) {\n    const word = template[i];\n    if (formatSymbol in word) {\n      children.push(word);\n      continue;\n    }\n    const contents = word.contents,\n          placeholderCount = word.placeholderCount,\n          prefix = word.prefix,\n          onlyPrefixOnce = word.onlyPrefixOnce;\n    const kMax = contents.length;\n    const valuesEnd = valuesStart + placeholderCount;\n    const tuples = cartesianProduct(values, valuesStart, valuesEnd);\n    valuesStart = valuesEnd;\n    for (let j = 0, jMax = tuples.length; j < jMax; j++) {\n      const needSpace = j > 0;\n      const tuple = tuples[j];\n      (needSpace || prefix) && children.push(needSpace && (onlyPrefixOnce || !prefix) ? unquotedSpace : prefix);\n      let interpolatedContents = [];\n      let untested = null;\n      let quoting = false;\n      let tupleIndex = 0;\n      for (let k = 0; k < kMax; k++) {\n        const content = contents[k];\n        if (content === PLACEHOLDER) {\n          const value = tuple[tupleIndex++];\n          if (quoting) {\n            interpolatedContents.push(value);\n          } else {\n            if (isObject(value) && formatSymbol in value) {\n              if (interpolatedContents.length) {\n                children.push(new ShellStringText(interpolatedContents, untested));\n                interpolatedContents = [];\n                untested = null;\n              }\n              children.push(value);\n            } else {\n              (untested || (untested = new BitSet())).add(interpolatedContents.length);\n              interpolatedContents.push(value);\n            }\n          }\n        } else {\n          interpolatedContents.push(content);\n          content === null && (quoting = !quoting);\n        }\n      }\n      if (interpolatedContents.length) {\n        children.push(new ShellStringText(interpolatedContents, untested));\n      }\n    }\n  }\n  return children;\n}\nconst primToStringish = value => value == null ? '' + value : value;\nfunction toStringishArray(value) {\n  let array;\n  switch (true) {\n    default:\n      if (isObject(value)) {\n        if (Array.isArray(value)) {\n          array = value;break;\n        }\n        if (Symbol.iterator in value) {\n          array = Array.from(value);break;\n        }\n      }\n      array = [value];\n  }\n  return array.map(primToStringish);\n}\nfunction cartesianProduct(arrs, start, end) {\n  const size = end - start;\n  let resultLength = 1;\n  for (let i = start; i < end; i++) {\n    resultLength *= arrs[i].length;\n  }\n  if (resultLength > 1e6) {\n    throw new RangeError(\"Far too many elements to interpolate\");\n  }\n  const result = new Array(resultLength);\n  const indices = new Array(size).fill(0);\n  for (let i = 0; i < resultLength; i++) {\n    const value = result[i] = new Array(size);\n    for (let j = 0; j < size; j++) {\n      value[j] = arrs[j + start][indices[j]];\n    }\n    for (let j = size - 1; j >= 0; j--) {\n      if (++indices[j] < arrs[j + start].length) break;\n      indices[j] = 0;\n    }\n  }\n  return result;\n}\nconst unquotedSpace = new ShellStringUnquoted(' ');\n\n/**\n * A ShellString represents a shell command after it has been interpolated, but\n * before it has been formatted for a particular platform. ShellStrings are\n * useful if you want to prepare a command for a different platform than the\n * current one, for instance.\n *\n * To create a ShellString, use `ShellString.sh` the same way you would use\n * top-level `sh`.\n */\nclass ShellString {\n  /** @hideconstructor */\n  constructor(children) {\n    this.children = children;\n  }\n  /**\n   * `ShellString.sh` is a template tag just like `sh`; the only difference is\n   * that this function returns a ShellString which has not yet been formatted\n   * into a String.\n   * @returns {ShellString}\n   * @function sh\n   * @static\n   * @memberof ShellString\n   */\n  static sh(templateSpans) {\n    for (var _len = arguments.length, values = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n      values[_key - 1] = arguments[_key];\n    }\n    return new ShellString(evaluate(parse(templateSpans), values));\n  }\n  /**\n   * A method to format a ShellString into a regular String formatted for a\n   * particular platform.\n   *\n   * @param {String} [platform] a value that `process.platform` might take:\n   * `'win32'`, `'linux'`, etc.; determines how the string is to be formatted.\n   * When omitted, effectively the same as `process.platform`.\n   * @returns {String}\n   */\n  toString(platform) {\n    return this[formatSymbol](Formatter.for(platform));\n  }\n  [formatSymbol](formatter) {\n    let context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : formatter.createContext(this);\n    return this.children.map(child => child[formatSymbol](formatter, context)).join('');\n  }\n  [preformatSymbol](context) {\n    const children = this.children;\n    for (let i = 0, iMax = children.length; i < iMax; i++) {\n      const child = children[i];\n      if (preformatSymbol in child) {\n        child[preformatSymbol](context);\n      }\n    }\n  }\n}\n\n/**\n * A Windows-specific version of {@link quoteForShell}.\n * @param {String} text to be quoted\n * @param {Boolean} [forceQuote] whether to always add quotes even if the string\n * is already safe. Defaults to `false`.\n */\n\n/**\n * A Unix-specific version of {@link quoteForShell}.\n * @param {String} text to be quoted\n * @param {Boolean} [forceQuote] whether to always add quotes even if the string\n * is already safe. Defaults to `false`.\n */\n\n/**\n * Quotes a string for injecting into a shell command.\n *\n * This function is exposed for some hypothetical case when the `sh` DSL simply\n * won't do; `sh` is expected to be the more convenient option almost always.\n * Compare:\n *\n * ```javascript\n * console.log('cmd' + args.map(a => ' ' + quoteForShell(a)).join(''));\n * console.log(sh`cmd ${args}`); // same as above\n *\n * console.log('cmd' + args.map(a => ' ' + quoteForShell(a, true)).join(''));\n * console.log(sh`cmd \"${args}\"`); // same as above\n * ```\n *\n * Additionally, on Windows, `sh` checks the entire command string for pipes,\n * which subtly change how arguments need to be quoted. If your commands may\n * involve pipes, you are strongly encouraged to use `sh` and not try to roll\n * your own with `quoteForShell`.\n *\n * @param {String} text to be quoted\n * @param {Boolean} [forceQuote] whether to always add quotes even if the string\n * is already safe. Defaults to `false`.\n * @param {String} [platform] a value that `process.platform` might take:\n * `'win32'`, `'linux'`, etc.; determines how the string is to be formatted.\n * When omitted, effectively the same as `process.platform`.\n *\n * @returns {String} a string that is safe for the current (or specified)\n * platform.\n */\nfunction quoteForShell(text, forceQuote, platform) {\n  return Formatter.for(platform).quote(text, forceQuote);\n}\n\n/**\n * A string template tag for safely constructing cross-platform shell commands.\n *\n * An `sh` template is not actually treated as a literal string to be\n * interpolated; instead, it is a tiny DSL designed to make working with shell\n * strings safe, simple, and straightforward. To get started quickly, see the\n * examples below. {@link #the-sh-dsl More detailed documentation} is available\n * further down.\n *\n * @name sh\n * @example\n * const title = '\"this\" & \"that\"';\n * sh`script --title=${title}`; // => \"script '--title=\\\"this\\\" & \\\"that\\\"'\"\n * // Note: these examples show results for non-Windows platforms.\n * // On Windows, the above would instead be\n * // 'script ^\"--title=\\\\^\"this\\\\^\" ^& \\\\^\"that\\\\^\"^\"'.\n *\n * const names = ['file1', 'file 2'];\n * sh`rimraf ${names}.txt`; // => \"rimraf file1.txt 'file 2.txt'\"\n *\n * const cmd1 = ['cat', 'file 1.txt', 'file 2.txt'];\n * const cmd2 = ['use-input', '-abc'];\n * sh`${cmd1}|${cmd2}`; // => \"cat 'file 1.txt' 'file 2.txt'|use-input -abc\"\n *\n * @returns {String} - a string formatted for the platform Node is currently\n * running on.\n */\nconst sh = function () {\n  return ShellString.sh.apply(ShellString, arguments).toString();\n};\n\n/**\n * This function permits raw strings to be interpolated into a `sh` template.\n *\n * **IMPORTANT**: If you're using Puka due to security concerns, make sure you\n * don't pass any untrusted content to `unquoted`. This may be obvious, but\n * stray punctuation in an `unquoted` section can compromise the safety of the\n * entire shell command.\n *\n * @param value - any value (it will be treated as a string)\n *\n * @example\n * const both = true;\n * sh`foo ${unquoted(both ? '&&' : '||')} bar`; // => 'foo && bar'\n */\nconst unquoted = value => new ShellStringUnquoted(value);\n\nexports.Formatter = Formatter;\nexports.ShellString = ShellString;\nexports.ShellStringText = ShellStringText;\nexports.ShellStringUnquoted = ShellStringUnquoted;\nexports.quoteForCmd = quoteForCmd;\nexports.quoteForSh = quoteForSh;\nexports.quoteForShell = quoteForShell;\nexports.sh = sh;\nexports.shellStringSemicolon = shellStringSemicolon;\nexports.formatSymbol = formatSymbol;\nexports.preformatSymbol = preformatSymbol;\nexports.unquoted = unquoted;\n\n\n/***/ }),\n/* 781 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar once = __webpack_require__(83)\nvar eos = __webpack_require__(174)\nvar fs = __webpack_require__(4) // we only need fs to get the ReadStream and WriteStream prototypes\n\nvar noop = function () {}\n\nvar isFn = function (fn) {\n  return typeof fn === 'function'\n}\n\nvar isFS = function (stream) {\n  if (!fs) return false // browser\n  return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close)\n}\n\nvar isRequest = function (stream) {\n  return stream.setHeader && isFn(stream.abort)\n}\n\nvar destroyer = function (stream, reading, writing, callback) {\n  callback = once(callback)\n\n  var closed = false\n  stream.on('close', function () {\n    closed = true\n  })\n\n  eos(stream, {readable: reading, writable: writing}, function (err) {\n    if (err) return callback(err)\n    closed = true\n    callback()\n  })\n\n  var destroyed = false\n  return function (err) {\n    if (closed) return\n    if (destroyed) return\n    destroyed = true\n\n    if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks\n    if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want\n\n    if (isFn(stream.destroy)) return stream.destroy()\n\n    callback(err || new Error('stream was destroyed'))\n  }\n}\n\nvar call = function (fn) {\n  fn()\n}\n\nvar pipe = function (from, to) {\n  return from.pipe(to)\n}\n\nvar pump = function () {\n  var streams = Array.prototype.slice.call(arguments)\n  var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop\n\n  if (Array.isArray(streams[0])) streams = streams[0]\n  if (streams.length < 2) throw new Error('pump requires two streams per minimum')\n\n  var error\n  var destroys = streams.map(function (stream, i) {\n    var reading = i < streams.length - 1\n    var writing = i > 0\n    return destroyer(stream, reading, writing, function (err) {\n      if (!error) error = err\n      if (err) destroys.forEach(call)\n      if (reading) return\n      destroys.forEach(call)\n      callback(error)\n    })\n  })\n\n  return streams.reduce(pipe)\n}\n\nmodule.exports = pump\n\n\n/***/ }),\n/* 782 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar pump = __webpack_require__(783)\nvar inherits = __webpack_require__(61)\nvar Duplexify = __webpack_require__(380)\n\nvar toArray = function(args) {\n  if (!args.length) return []\n  return Array.isArray(args[0]) ? args[0] : Array.prototype.slice.call(args)\n}\n\nvar define = function(opts) {\n  var Pumpify = function() {\n    var streams = toArray(arguments)\n    if (!(this instanceof Pumpify)) return new Pumpify(streams)\n    Duplexify.call(this, null, null, opts)\n    if (streams.length) this.setPipeline(streams)\n  }\n\n  inherits(Pumpify, Duplexify)\n\n  Pumpify.prototype.setPipeline = function() {\n    var streams = toArray(arguments)\n    var self = this\n    var ended = false\n    var w = streams[0]\n    var r = streams[streams.length-1]\n\n    r = r.readable ? r : null\n    w = w.writable ? w : null\n\n    var onclose = function() {\n      streams[0].emit('error', new Error('stream was destroyed'))\n    }\n\n    this.on('close', onclose)\n    this.on('prefinish', function() {\n      if (!ended) self.cork()\n    })\n\n    pump(streams, function(err) {\n      self.removeListener('close', onclose)\n      if (err) return self.destroy(err.message === 'premature close' ? null : err)\n      ended = true\n      // pump ends after the last stream is not writable *but*\n      // pumpify still forwards the readable part so we need to catch errors\n      // still, so reenable autoDestroy in this case\n      if (self._autoDestroy === false) self._autoDestroy = true\n      self.uncork()\n    })\n\n    if (this.destroyed) return onclose()\n    this.setWritable(w)\n    this.setReadable(r)\n  }\n\n  return Pumpify\n}\n\nmodule.exports = define({autoDestroy:false, destroy:false})\nmodule.exports.obj = define({autoDestroy: false, destroy:false, objectMode:true, highWaterMark:16})\nmodule.exports.ctor = define\n\n\n/***/ }),\n/* 783 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar once = __webpack_require__(83)\nvar eos = __webpack_require__(174)\nvar fs = __webpack_require__(4) // we only need fs to get the ReadStream and WriteStream prototypes\n\nvar noop = function () {}\nvar ancient = /^v?\\.0/.test(process.version)\n\nvar isFn = function (fn) {\n  return typeof fn === 'function'\n}\n\nvar isFS = function (stream) {\n  if (!ancient) return false // newer node version do not need to care about fs is a special way\n  if (!fs) return false // browser\n  return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close)\n}\n\nvar isRequest = function (stream) {\n  return stream.setHeader && isFn(stream.abort)\n}\n\nvar destroyer = function (stream, reading, writing, callback) {\n  callback = once(callback)\n\n  var closed = false\n  stream.on('close', function () {\n    closed = true\n  })\n\n  eos(stream, {readable: reading, writable: writing}, function (err) {\n    if (err) return callback(err)\n    closed = true\n    callback()\n  })\n\n  var destroyed = false\n  return function (err) {\n    if (closed) return\n    if (destroyed) return\n    destroyed = true\n\n    if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks\n    if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want\n\n    if (isFn(stream.destroy)) return stream.destroy()\n\n    callback(err || new Error('stream was destroyed'))\n  }\n}\n\nvar call = function (fn) {\n  fn()\n}\n\nvar pipe = function (from, to) {\n  return from.pipe(to)\n}\n\nvar pump = function () {\n  var streams = Array.prototype.slice.call(arguments)\n  var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop\n\n  if (Array.isArray(streams[0])) streams = streams[0]\n  if (streams.length < 2) throw new Error('pump requires two streams per minimum')\n\n  var error\n  var destroys = streams.map(function (stream, i) {\n    var reading = i < streams.length - 1\n    var writing = i > 0\n    return destroyer(stream, reading, writing, function (err) {\n      if (!error) error = err\n      if (err) destroys.forEach(call)\n      if (reading) return\n      destroys.forEach(call)\n      callback(error)\n    })\n  })\n\n  streams.reduce(pipe)\n}\n\nmodule.exports = pump\n\n\n/***/ }),\n/* 784 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar utils = __webpack_require__(405);\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar defaults = {\n    allowDots: false,\n    allowPrototypes: false,\n    arrayLimit: 20,\n    decoder: utils.decode,\n    delimiter: '&',\n    depth: 5,\n    parameterLimit: 1000,\n    plainObjects: false,\n    strictNullHandling: false\n};\n\nvar parseValues = function parseQueryStringValues(str, options) {\n    var obj = {};\n    var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n    var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;\n    var parts = cleanStr.split(options.delimiter, limit);\n\n    for (var i = 0; i < parts.length; ++i) {\n        var part = parts[i];\n\n        var bracketEqualsPos = part.indexOf(']=');\n        var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n        var key, val;\n        if (pos === -1) {\n            key = options.decoder(part, defaults.decoder);\n            val = options.strictNullHandling ? null : '';\n        } else {\n            key = options.decoder(part.slice(0, pos), defaults.decoder);\n            val = options.decoder(part.slice(pos + 1), defaults.decoder);\n        }\n        if (has.call(obj, key)) {\n            obj[key] = [].concat(obj[key]).concat(val);\n        } else {\n            obj[key] = val;\n        }\n    }\n\n    return obj;\n};\n\nvar parseObject = function (chain, val, options) {\n    var leaf = val;\n\n    for (var i = chain.length - 1; i >= 0; --i) {\n        var obj;\n        var root = chain[i];\n\n        if (root === '[]') {\n            obj = [];\n            obj = obj.concat(leaf);\n        } else {\n            obj = options.plainObjects ? Object.create(null) : {};\n            var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n            var index = parseInt(cleanRoot, 10);\n            if (\n                !isNaN(index)\n                && root !== cleanRoot\n                && String(index) === cleanRoot\n                && index >= 0\n                && (options.parseArrays && index <= options.arrayLimit)\n            ) {\n                obj = [];\n                obj[index] = leaf;\n            } else {\n                obj[cleanRoot] = leaf;\n            }\n        }\n\n        leaf = obj;\n    }\n\n    return leaf;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options) {\n    if (!givenKey) {\n        return;\n    }\n\n    // Transform dot notation to bracket notation\n    var key = options.allowDots ? givenKey.replace(/\\.([^.[]+)/g, '[$1]') : givenKey;\n\n    // The regex chunks\n\n    var brackets = /(\\[[^[\\]]*])/;\n    var child = /(\\[[^[\\]]*])/g;\n\n    // Get the parent\n\n    var segment = brackets.exec(key);\n    var parent = segment ? key.slice(0, segment.index) : key;\n\n    // Stash the parent if it exists\n\n    var keys = [];\n    if (parent) {\n        // If we aren't using plain objects, optionally prefix keys\n        // that would overwrite object prototype properties\n        if (!options.plainObjects && has.call(Object.prototype, parent)) {\n            if (!options.allowPrototypes) {\n                return;\n            }\n        }\n\n        keys.push(parent);\n    }\n\n    // Loop through children appending to the array until we hit depth\n\n    var i = 0;\n    while ((segment = child.exec(key)) !== null && i < options.depth) {\n        i += 1;\n        if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {\n            if (!options.allowPrototypes) {\n                return;\n            }\n        }\n        keys.push(segment[1]);\n    }\n\n    // If there's a remainder, just add whatever is left\n\n    if (segment) {\n        keys.push('[' + key.slice(segment.index) + ']');\n    }\n\n    return parseObject(keys, val, options);\n};\n\nmodule.exports = function (str, opts) {\n    var options = opts ? utils.assign({}, opts) : {};\n\n    if (options.decoder !== null && options.decoder !== undefined && typeof options.decoder !== 'function') {\n        throw new TypeError('Decoder has to be a function.');\n    }\n\n    options.ignoreQueryPrefix = options.ignoreQueryPrefix === true;\n    options.delimiter = typeof options.delimiter === 'string' || utils.isRegExp(options.delimiter) ? options.delimiter : defaults.delimiter;\n    options.depth = typeof options.depth === 'number' ? options.depth : defaults.depth;\n    options.arrayLimit = typeof options.arrayLimit === 'number' ? options.arrayLimit : defaults.arrayLimit;\n    options.parseArrays = options.parseArrays !== false;\n    options.decoder = typeof options.decoder === 'function' ? options.decoder : defaults.decoder;\n    options.allowDots = typeof options.allowDots === 'boolean' ? options.allowDots : defaults.allowDots;\n    options.plainObjects = typeof options.plainObjects === 'boolean' ? options.plainObjects : defaults.plainObjects;\n    options.allowPrototypes = typeof options.allowPrototypes === 'boolean' ? options.allowPrototypes : defaults.allowPrototypes;\n    options.parameterLimit = typeof options.parameterLimit === 'number' ? options.parameterLimit : defaults.parameterLimit;\n    options.strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n\n    if (str === '' || str === null || typeof str === 'undefined') {\n        return options.plainObjects ? Object.create(null) : {};\n    }\n\n    var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n    var obj = options.plainObjects ? Object.create(null) : {};\n\n    // Iterate over the keys and setup the new object\n\n    var keys = Object.keys(tempObj);\n    for (var i = 0; i < keys.length; ++i) {\n        var key = keys[i];\n        var newObj = parseKeys(key, tempObj[key], options);\n        obj = utils.merge(obj, newObj, options);\n    }\n\n    return utils.compact(obj);\n};\n\n\n/***/ }),\n/* 785 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar utils = __webpack_require__(405);\nvar formats = __webpack_require__(403);\n\nvar arrayPrefixGenerators = {\n    brackets: function brackets(prefix) { // eslint-disable-line func-name-matching\n        return prefix + '[]';\n    },\n    indices: function indices(prefix, key) { // eslint-disable-line func-name-matching\n        return prefix + '[' + key + ']';\n    },\n    repeat: function repeat(prefix) { // eslint-disable-line func-name-matching\n        return prefix;\n    }\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaults = {\n    delimiter: '&',\n    encode: true,\n    encoder: utils.encode,\n    encodeValuesOnly: false,\n    serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching\n        return toISO.call(date);\n    },\n    skipNulls: false,\n    strictNullHandling: false\n};\n\nvar stringify = function stringify( // eslint-disable-line func-name-matching\n    object,\n    prefix,\n    generateArrayPrefix,\n    strictNullHandling,\n    skipNulls,\n    encoder,\n    filter,\n    sort,\n    allowDots,\n    serializeDate,\n    formatter,\n    encodeValuesOnly\n) {\n    var obj = object;\n    if (typeof filter === 'function') {\n        obj = filter(prefix, obj);\n    } else if (obj instanceof Date) {\n        obj = serializeDate(obj);\n    } else if (obj === null) {\n        if (strictNullHandling) {\n            return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder) : prefix;\n        }\n\n        obj = '';\n    }\n\n    if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {\n        if (encoder) {\n            var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder);\n            return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder))];\n        }\n        return [formatter(prefix) + '=' + formatter(String(obj))];\n    }\n\n    var values = [];\n\n    if (typeof obj === 'undefined') {\n        return values;\n    }\n\n    var objKeys;\n    if (Array.isArray(filter)) {\n        objKeys = filter;\n    } else {\n        var keys = Object.keys(obj);\n        objKeys = sort ? keys.sort(sort) : keys;\n    }\n\n    for (var i = 0; i < objKeys.length; ++i) {\n        var key = objKeys[i];\n\n        if (skipNulls && obj[key] === null) {\n            continue;\n        }\n\n        if (Array.isArray(obj)) {\n            values = values.concat(stringify(\n                obj[key],\n                generateArrayPrefix(prefix, key),\n                generateArrayPrefix,\n                strictNullHandling,\n                skipNulls,\n                encoder,\n                filter,\n                sort,\n                allowDots,\n                serializeDate,\n                formatter,\n                encodeValuesOnly\n            ));\n        } else {\n            values = values.concat(stringify(\n                obj[key],\n                prefix + (allowDots ? '.' + key : '[' + key + ']'),\n                generateArrayPrefix,\n                strictNullHandling,\n                skipNulls,\n                encoder,\n                filter,\n                sort,\n                allowDots,\n                serializeDate,\n                formatter,\n                encodeValuesOnly\n            ));\n        }\n    }\n\n    return values;\n};\n\nmodule.exports = function (object, opts) {\n    var obj = object;\n    var options = opts ? utils.assign({}, opts) : {};\n\n    if (options.encoder !== null && options.encoder !== undefined && typeof options.encoder !== 'function') {\n        throw new TypeError('Encoder has to be a function.');\n    }\n\n    var delimiter = typeof options.delimiter === 'undefined' ? defaults.delimiter : options.delimiter;\n    var strictNullHandling = typeof options.strictNullHandling === 'boolean' ? options.strictNullHandling : defaults.strictNullHandling;\n    var skipNulls = typeof options.skipNulls === 'boolean' ? options.skipNulls : defaults.skipNulls;\n    var encode = typeof options.encode === 'boolean' ? options.encode : defaults.encode;\n    var encoder = typeof options.encoder === 'function' ? options.encoder : defaults.encoder;\n    var sort = typeof options.sort === 'function' ? options.sort : null;\n    var allowDots = typeof options.allowDots === 'undefined' ? false : options.allowDots;\n    var serializeDate = typeof options.serializeDate === 'function' ? options.serializeDate : defaults.serializeDate;\n    var encodeValuesOnly = typeof options.encodeValuesOnly === 'boolean' ? options.encodeValuesOnly : defaults.encodeValuesOnly;\n    if (typeof options.format === 'undefined') {\n        options.format = formats['default'];\n    } else if (!Object.prototype.hasOwnProperty.call(formats.formatters, options.format)) {\n        throw new TypeError('Unknown format option provided.');\n    }\n    var formatter = formats.formatters[options.format];\n    var objKeys;\n    var filter;\n\n    if (typeof options.filter === 'function') {\n        filter = options.filter;\n        obj = filter('', obj);\n    } else if (Array.isArray(options.filter)) {\n        filter = options.filter;\n        objKeys = filter;\n    }\n\n    var keys = [];\n\n    if (typeof obj !== 'object' || obj === null) {\n        return '';\n    }\n\n    var arrayFormat;\n    if (options.arrayFormat in arrayPrefixGenerators) {\n        arrayFormat = options.arrayFormat;\n    } else if ('indices' in options) {\n        arrayFormat = options.indices ? 'indices' : 'repeat';\n    } else {\n        arrayFormat = 'indices';\n    }\n\n    var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];\n\n    if (!objKeys) {\n        objKeys = Object.keys(obj);\n    }\n\n    if (sort) {\n        objKeys.sort(sort);\n    }\n\n    for (var i = 0; i < objKeys.length; ++i) {\n        var key = objKeys[i];\n\n        if (skipNulls && obj[key] === null) {\n            continue;\n        }\n\n        keys = keys.concat(stringify(\n            obj[key],\n            key,\n            generateArrayPrefix,\n            strictNullHandling,\n            skipNulls,\n            encode ? encoder : null,\n            filter,\n            sort,\n            allowDots,\n            serializeDate,\n            formatter,\n            encodeValuesOnly\n        ));\n    }\n\n    var joined = keys.join(delimiter);\n    var prefix = options.addQueryPrefix === true ? '?' : '';\n\n    return joined.length > 0 ? prefix + joined : '';\n};\n\n\n/***/ }),\n/* 786 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar strictUriEncode = __webpack_require__(943);\nvar objectAssign = __webpack_require__(303);\nvar decodeComponent = __webpack_require__(598);\n\nfunction encoderForArrayFormat(opts) {\n\tswitch (opts.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn function (key, value, index) {\n\t\t\t\treturn value === null ? [\n\t\t\t\t\tencode(key, opts),\n\t\t\t\t\t'[',\n\t\t\t\t\tindex,\n\t\t\t\t\t']'\n\t\t\t\t].join('') : [\n\t\t\t\t\tencode(key, opts),\n\t\t\t\t\t'[',\n\t\t\t\t\tencode(index, opts),\n\t\t\t\t\t']=',\n\t\t\t\t\tencode(value, opts)\n\t\t\t\t].join('');\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn function (key, value) {\n\t\t\t\treturn value === null ? encode(key, opts) : [\n\t\t\t\t\tencode(key, opts),\n\t\t\t\t\t'[]=',\n\t\t\t\t\tencode(value, opts)\n\t\t\t\t].join('');\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn function (key, value) {\n\t\t\t\treturn value === null ? encode(key, opts) : [\n\t\t\t\t\tencode(key, opts),\n\t\t\t\t\t'=',\n\t\t\t\t\tencode(value, opts)\n\t\t\t\t].join('');\n\t\t\t};\n\t}\n}\n\nfunction parserForArrayFormat(opts) {\n\tvar result;\n\n\tswitch (opts.arrayFormat) {\n\t\tcase 'index':\n\t\t\treturn function (key, value, accumulator) {\n\t\t\t\tresult = /\\[(\\d*)\\]$/.exec(key);\n\n\t\t\t\tkey = key.replace(/\\[\\d*\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = {};\n\t\t\t\t}\n\n\t\t\t\taccumulator[key][result[1]] = value;\n\t\t\t};\n\n\t\tcase 'bracket':\n\t\t\treturn function (key, value, accumulator) {\n\t\t\t\tresult = /(\\[\\])$/.exec(key);\n\t\t\t\tkey = key.replace(/\\[\\]$/, '');\n\n\t\t\t\tif (!result) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t} else if (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = [value];\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\n\t\tdefault:\n\t\t\treturn function (key, value, accumulator) {\n\t\t\t\tif (accumulator[key] === undefined) {\n\t\t\t\t\taccumulator[key] = value;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\taccumulator[key] = [].concat(accumulator[key], value);\n\t\t\t};\n\t}\n}\n\nfunction encode(value, opts) {\n\tif (opts.encode) {\n\t\treturn opts.strict ? strictUriEncode(value) : encodeURIComponent(value);\n\t}\n\n\treturn value;\n}\n\nfunction keysSorter(input) {\n\tif (Array.isArray(input)) {\n\t\treturn input.sort();\n\t} else if (typeof input === 'object') {\n\t\treturn keysSorter(Object.keys(input)).sort(function (a, b) {\n\t\t\treturn Number(a) - Number(b);\n\t\t}).map(function (key) {\n\t\t\treturn input[key];\n\t\t});\n\t}\n\n\treturn input;\n}\n\nfunction extract(str) {\n\tvar queryStart = str.indexOf('?');\n\tif (queryStart === -1) {\n\t\treturn '';\n\t}\n\treturn str.slice(queryStart + 1);\n}\n\nfunction parse(str, opts) {\n\topts = objectAssign({arrayFormat: 'none'}, opts);\n\n\tvar formatter = parserForArrayFormat(opts);\n\n\t// Create an object with no prototype\n\t// https://github.com/sindresorhus/query-string/issues/47\n\tvar ret = Object.create(null);\n\n\tif (typeof str !== 'string') {\n\t\treturn ret;\n\t}\n\n\tstr = str.trim().replace(/^[?#&]/, '');\n\n\tif (!str) {\n\t\treturn ret;\n\t}\n\n\tstr.split('&').forEach(function (param) {\n\t\tvar parts = param.replace(/\\+/g, ' ').split('=');\n\t\t// Firefox (pre 40) decodes `%3D` to `=`\n\t\t// https://github.com/sindresorhus/query-string/pull/37\n\t\tvar key = parts.shift();\n\t\tvar val = parts.length > 0 ? parts.join('=') : undefined;\n\n\t\t// missing `=` should be `null`:\n\t\t// http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n\t\tval = val === undefined ? null : decodeComponent(val);\n\n\t\tformatter(decodeComponent(key), val, ret);\n\t});\n\n\treturn Object.keys(ret).sort().reduce(function (result, key) {\n\t\tvar val = ret[key];\n\t\tif (Boolean(val) && typeof val === 'object' && !Array.isArray(val)) {\n\t\t\t// Sort object keys, not values\n\t\t\tresult[key] = keysSorter(val);\n\t\t} else {\n\t\t\tresult[key] = val;\n\t\t}\n\n\t\treturn result;\n\t}, Object.create(null));\n}\n\nexports.extract = extract;\nexports.parse = parse;\n\nexports.stringify = function (obj, opts) {\n\tvar defaults = {\n\t\tencode: true,\n\t\tstrict: true,\n\t\tarrayFormat: 'none'\n\t};\n\n\topts = objectAssign(defaults, opts);\n\n\tif (opts.sort === false) {\n\t\topts.sort = function () {};\n\t}\n\n\tvar formatter = encoderForArrayFormat(opts);\n\n\treturn obj ? Object.keys(obj).sort(opts.sort).map(function (key) {\n\t\tvar val = obj[key];\n\n\t\tif (val === undefined) {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (val === null) {\n\t\t\treturn encode(key, opts);\n\t\t}\n\n\t\tif (Array.isArray(val)) {\n\t\t\tvar result = [];\n\n\t\t\tval.slice().forEach(function (val2) {\n\t\t\t\tif (val2 === undefined) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tresult.push(formatter(key, val2, result.length));\n\t\t\t});\n\n\t\t\treturn result.join('&');\n\t\t}\n\n\t\treturn encode(key, opts) + '=' + encode(val, opts);\n\t}).filter(function (x) {\n\t\treturn x.length > 0;\n\t}).join('&') : '';\n};\n\nexports.parseUrl = function (str, opts) {\n\treturn {\n\t\turl: str.split('?')[0] || '',\n\t\tquery: parse(extract(str), opts)\n\t};\n};\n\n\n/***/ }),\n/* 787 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * randomatic <https://github.com/jonschlinkert/randomatic>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n\n\nvar isNumber = __webpack_require__(788);\nvar typeOf = __webpack_require__(789);\nvar mathRandom = __webpack_require__(751);\n\n/**\n * Expose `randomatic`\n */\n\nmodule.exports = randomatic;\nmodule.exports.isCrypto = !!mathRandom.cryptographic;\n\n/**\n * Available mask characters\n */\n\nvar type = {\n  lower: 'abcdefghijklmnopqrstuvwxyz',\n  upper: 'ABCDEFGHIJKLMNOPQRSTUVWXYZ',\n  number: '0123456789',\n  special: '~!@#$%^&()_+-={}[];\\',.'\n};\n\ntype.all = type.lower + type.upper + type.number + type.special;\n\n/**\n * Generate random character sequences of a specified `length`,\n * based on the given `pattern`.\n *\n * @param {String} `pattern` The pattern to use for generating the random string.\n * @param {String} `length` The length of the string to generate.\n * @param {String} `options`\n * @return {String}\n * @api public\n */\n\nfunction randomatic(pattern, length, options) {\n  if (typeof pattern === 'undefined') {\n    throw new Error('randomatic expects a string or number.');\n  }\n\n  var custom = false;\n  if (arguments.length === 1) {\n    if (typeof pattern === 'string') {\n      length = pattern.length;\n\n    } else if (isNumber(pattern)) {\n      options = {};\n      length = pattern;\n      pattern = '*';\n    }\n  }\n\n  if (typeOf(length) === 'object' && length.hasOwnProperty('chars')) {\n    options = length;\n    pattern = options.chars;\n    length = pattern.length;\n    custom = true;\n  }\n\n  var opts = options || {};\n  var mask = '';\n  var res = '';\n\n  // Characters to be used\n  if (pattern.indexOf('?') !== -1) mask += opts.chars;\n  if (pattern.indexOf('a') !== -1) mask += type.lower;\n  if (pattern.indexOf('A') !== -1) mask += type.upper;\n  if (pattern.indexOf('0') !== -1) mask += type.number;\n  if (pattern.indexOf('!') !== -1) mask += type.special;\n  if (pattern.indexOf('*') !== -1) mask += type.all;\n  if (custom) mask += pattern;\n\n  while (length--) {\n    res += mask.charAt(parseInt(mathRandom() * mask.length, 10));\n  }\n  return res;\n};\n\n\n/***/ }),\n/* 788 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * is-number <https://github.com/jonschlinkert/is-number>\n *\n * Copyright (c) 2014-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n\n\nmodule.exports = function isNumber(num) {\n  var type = typeof num;\n\n  if (type === 'string' || num instanceof String) {\n    // an empty string would be coerced to true with the below logic\n    if (!num.trim()) return false;\n  } else if (type !== 'number' && !(num instanceof Number)) {\n    return false;\n  }\n\n  return (num - num + 1) >= 0;\n};\n\n\n/***/ }),\n/* 789 */\n/***/ (function(module, exports) {\n\nvar toString = Object.prototype.toString;\n\nmodule.exports = function kindOf(val) {\n  if (val === void 0) return 'undefined';\n  if (val === null) return 'null';\n\n  var type = typeof val;\n  if (type === 'boolean') return 'boolean';\n  if (type === 'string') return 'string';\n  if (type === 'number') return 'number';\n  if (type === 'symbol') return 'symbol';\n  if (type === 'function') {\n    return isGeneratorFn(val) ? 'generatorfunction' : 'function';\n  }\n\n  if (isArray(val)) return 'array';\n  if (isBuffer(val)) return 'buffer';\n  if (isArguments(val)) return 'arguments';\n  if (isDate(val)) return 'date';\n  if (isError(val)) return 'error';\n  if (isRegexp(val)) return 'regexp';\n\n  switch (ctorName(val)) {\n    case 'Symbol': return 'symbol';\n    case 'Promise': return 'promise';\n\n    // Set, Map, WeakSet, WeakMap\n    case 'WeakMap': return 'weakmap';\n    case 'WeakSet': return 'weakset';\n    case 'Map': return 'map';\n    case 'Set': return 'set';\n\n    // 8-bit typed arrays\n    case 'Int8Array': return 'int8array';\n    case 'Uint8Array': return 'uint8array';\n    case 'Uint8ClampedArray': return 'uint8clampedarray';\n\n    // 16-bit typed arrays\n    case 'Int16Array': return 'int16array';\n    case 'Uint16Array': return 'uint16array';\n\n    // 32-bit typed arrays\n    case 'Int32Array': return 'int32array';\n    case 'Uint32Array': return 'uint32array';\n    case 'Float32Array': return 'float32array';\n    case 'Float64Array': return 'float64array';\n  }\n\n  if (isGeneratorObj(val)) {\n    return 'generator';\n  }\n\n  // Non-plain objects\n  type = toString.call(val);\n  switch (type) {\n    case '[object Object]': return 'object';\n    // iterators\n    case '[object Map Iterator]': return 'mapiterator';\n    case '[object Set Iterator]': return 'setiterator';\n    case '[object String Iterator]': return 'stringiterator';\n    case '[object Array Iterator]': return 'arrayiterator';\n  }\n\n  // other\n  return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n};\n\nfunction ctorName(val) {\n  return val.constructor ? val.constructor.name : null;\n}\n\nfunction isArray(val) {\n  if (Array.isArray) return Array.isArray(val);\n  return val instanceof Array;\n}\n\nfunction isError(val) {\n  return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number');\n}\n\nfunction isDate(val) {\n  if (val instanceof Date) return true;\n  return typeof val.toDateString === 'function'\n    && typeof val.getDate === 'function'\n    && typeof val.setDate === 'function';\n}\n\nfunction isRegexp(val) {\n  if (val instanceof RegExp) return true;\n  return typeof val.flags === 'string'\n    && typeof val.ignoreCase === 'boolean'\n    && typeof val.multiline === 'boolean'\n    && typeof val.global === 'boolean';\n}\n\nfunction isGeneratorFn(name, val) {\n  return ctorName(name) === 'GeneratorFunction';\n}\n\nfunction isGeneratorObj(val) {\n  return typeof val.throw === 'function'\n    && typeof val.return === 'function'\n    && typeof val.next === 'function';\n}\n\nfunction isArguments(val) {\n  try {\n    if (typeof val.length === 'number' && typeof val.callee === 'function') {\n      return true;\n    }\n  } catch (err) {\n    if (err.message.indexOf('callee') !== -1) {\n      return true;\n    }\n  }\n  return false;\n}\n\n/**\n * If you need to support Safari 5-7 (8-10 yr-old browser),\n * take a look at https://github.com/feross/is-buffer\n */\n\nfunction isBuffer(val) {\n  if (val.constructor && typeof val.constructor.isBuffer === 'function') {\n    return val.constructor.isBuffer(val);\n  }\n  return false;\n}\n\n\n/***/ }),\n/* 790 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nmodule.exports = read\n\nvar readline = __webpack_require__(198)\nvar Mute = __webpack_require__(401)\n\nfunction read (opts, cb) {\n  if (opts.num) {\n    throw new Error('read() no longer accepts a char number limit')\n  }\n\n  if (typeof opts.default !== 'undefined' &&\n      typeof opts.default !== 'string' &&\n      typeof opts.default !== 'number') {\n    throw new Error('default value must be string or number')\n  }\n\n  var input = opts.input || process.stdin\n  var output = opts.output || process.stdout\n  var prompt = (opts.prompt || '').trim() + ' '\n  var silent = opts.silent\n  var editDef = false\n  var timeout = opts.timeout\n\n  var def = opts.default || ''\n  if (def) {\n    if (silent) {\n      prompt += '(<default hidden>) '\n    } else if (opts.edit) {\n      editDef = true\n    } else {\n      prompt += '(' + def + ') '\n    }\n  }\n  var terminal = !!(opts.terminal || output.isTTY)\n\n  var m = new Mute({ replace: opts.replace, prompt: prompt })\n  m.pipe(output, {end: false})\n  output = m\n  var rlOpts = { input: input, output: output, terminal: terminal }\n\n  if (process.version.match(/^v0\\.6/)) {\n    var rl = readline.createInterface(rlOpts.input, rlOpts.output)\n  } else {\n    var rl = readline.createInterface(rlOpts)\n  }\n\n\n  output.unmute()\n  rl.setPrompt(prompt)\n  rl.prompt()\n  if (silent) {\n    output.mute()\n  } else if (editDef) {\n    rl.line = def\n    rl.cursor = def.length\n    rl._refreshLine()\n  }\n\n  var called = false\n  rl.on('line', onLine)\n  rl.on('error', onError)\n\n  rl.on('SIGINT', function () {\n    rl.close()\n    onError(new Error('canceled'))\n  })\n\n  var timer\n  if (timeout) {\n    timer = setTimeout(function () {\n      onError(new Error('timed out'))\n    }, timeout)\n  }\n\n  function done () {\n    called = true\n    rl.close()\n\n    if (process.version.match(/^v0\\.6/)) {\n      rl.input.removeAllListeners('data')\n      rl.input.removeAllListeners('keypress')\n      rl.input.pause()\n    }\n\n    clearTimeout(timer)\n    output.mute()\n    output.end()\n  }\n\n  function onError (er) {\n    if (called) return\n    done()\n    return cb(er)\n  }\n\n  function onLine (line) {\n    if (called) return\n    if (silent && terminal) {\n      output.unmute()\n      output.write('\\r\\n')\n    }\n    done()\n    // truncate the \\n at the end.\n    line = line.replace(/\\r?\\n$/, '')\n    var isDefault = !!(editDef && line === def)\n    if (def && !line) {\n      isDefault = true\n      line = def\n    }\n    cb(null, line, isDefault)\n  }\n}\n\n\n/***/ }),\n/* 791 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(102).Duplex\n\n\n/***/ }),\n/* 792 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// a passthrough stream.\n// basically just the most minimal sort of Transform stream.\n// Every written chunk gets output as-is.\n\n\n\nmodule.exports = PassThrough;\n\nvar Transform = __webpack_require__(407);\n\n/*<replacement>*/\nvar util = __webpack_require__(113);\nutil.inherits = __webpack_require__(61);\n/*</replacement>*/\n\nutil.inherits(PassThrough, Transform);\n\nfunction PassThrough(options) {\n  if (!(this instanceof PassThrough)) return new PassThrough(options);\n\n  Transform.call(this, options);\n}\n\nPassThrough.prototype._transform = function (chunk, encoding, cb) {\n  cb(null, chunk);\n};\n\n/***/ }),\n/* 793 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Buffer = __webpack_require__(46).Buffer;\nvar util = __webpack_require__(3);\n\nfunction copyBuffer(src, target, offset) {\n  src.copy(target, offset);\n}\n\nmodule.exports = function () {\n  function BufferList() {\n    _classCallCheck(this, BufferList);\n\n    this.head = null;\n    this.tail = null;\n    this.length = 0;\n  }\n\n  BufferList.prototype.push = function push(v) {\n    var entry = { data: v, next: null };\n    if (this.length > 0) this.tail.next = entry;else this.head = entry;\n    this.tail = entry;\n    ++this.length;\n  };\n\n  BufferList.prototype.unshift = function unshift(v) {\n    var entry = { data: v, next: this.head };\n    if (this.length === 0) this.tail = entry;\n    this.head = entry;\n    ++this.length;\n  };\n\n  BufferList.prototype.shift = function shift() {\n    if (this.length === 0) return;\n    var ret = this.head.data;\n    if (this.length === 1) this.head = this.tail = null;else this.head = this.head.next;\n    --this.length;\n    return ret;\n  };\n\n  BufferList.prototype.clear = function clear() {\n    this.head = this.tail = null;\n    this.length = 0;\n  };\n\n  BufferList.prototype.join = function join(s) {\n    if (this.length === 0) return '';\n    var p = this.head;\n    var ret = '' + p.data;\n    while (p = p.next) {\n      ret += s + p.data;\n    }return ret;\n  };\n\n  BufferList.prototype.concat = function concat(n) {\n    if (this.length === 0) return Buffer.alloc(0);\n    if (this.length === 1) return this.head.data;\n    var ret = Buffer.allocUnsafe(n >>> 0);\n    var p = this.head;\n    var i = 0;\n    while (p) {\n      copyBuffer(p.data, ret, i);\n      i += p.data.length;\n      p = p.next;\n    }\n    return ret;\n  };\n\n  return BufferList;\n}();\n\nif (util && util.inspect && util.inspect.custom) {\n  module.exports.prototype[util.inspect.custom] = function () {\n    var obj = util.inspect({ length: this.length });\n    return this.constructor.name + ' ' + obj;\n  };\n}\n\n/***/ }),\n/* 794 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(102).Transform\n\n\n/***/ }),\n/* 795 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * regex-cache <https://github.com/jonschlinkert/regex-cache>\n *\n * Copyright (c) 2015-2017, Jon Schlinkert.\n * Released under the MIT License.\n */\n\n\n\nvar equal = __webpack_require__(734);\nvar basic = {};\nvar cache = {};\n\n/**\n * Expose `regexCache`\n */\n\nmodule.exports = regexCache;\n\n/**\n * Memoize the results of a call to the new RegExp constructor.\n *\n * @param  {Function} fn [description]\n * @param  {String} str [description]\n * @param  {Options} options [description]\n * @param  {Boolean} nocompare [description]\n * @return {RegExp}\n */\n\nfunction regexCache(fn, str, opts) {\n  var key = '_default_', regex, cached;\n\n  if (!str && !opts) {\n    if (typeof fn !== 'function') {\n      return fn;\n    }\n    return basic[key] || (basic[key] = fn(str));\n  }\n\n  var isString = typeof str === 'string';\n  if (isString) {\n    if (!opts) {\n      return basic[str] || (basic[str] = fn(str));\n    }\n    key = str;\n  } else {\n    opts = str;\n  }\n\n  cached = cache[key];\n  if (cached && equal(cached.opts, opts)) {\n    return cached.regex;\n  }\n\n  memo(key, opts, (regex = fn(str, opts)));\n  return regex;\n}\n\nfunction memo(key, opts, regex) {\n  cache[key] = {regex: regex, opts: opts};\n}\n\n/**\n * Expose `cache`\n */\n\nmodule.exports.cache = cache;\nmodule.exports.basic = basic;\n\n\n/***/ }),\n/* 796 */\n/***/ (function(module, exports) {\n\nvar isWin = process.platform === 'win32';\n\nmodule.exports = function (str) {\n\tvar i = str.length - 1;\n\tif (i < 2) {\n\t\treturn str;\n\t}\n\twhile (isSeparator(str, i)) {\n\t\ti--;\n\t}\n\treturn str.substr(0, i + 1);\n};\n\nfunction isSeparator(str, i) {\n\tvar char = str[i];\n\treturn i > 0 && (char === '/' || (isWin && char === '\\\\'));\n}\n\n\n/***/ }),\n/* 797 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * repeat-string <https://github.com/jonschlinkert/repeat-string>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n\n\n/**\n * Results cache\n */\n\nvar res = '';\nvar cache;\n\n/**\n * Expose `repeat`\n */\n\nmodule.exports = repeat;\n\n/**\n * Repeat the given `string` the specified `number`\n * of times.\n *\n * **Example:**\n *\n * ```js\n * var repeat = require('repeat-string');\n * repeat('A', 5);\n * //=> AAAAA\n * ```\n *\n * @param {String} `string` The string to repeat\n * @param {Number} `number` The number of times to repeat the string\n * @return {String} Repeated string\n * @api public\n */\n\nfunction repeat(str, num) {\n  if (typeof str !== 'string') {\n    throw new TypeError('expected a string');\n  }\n\n  // cover common, quick use cases\n  if (num === 1) return str;\n  if (num === 2) return str + str;\n\n  var max = str.length * num;\n  if (cache !== str || typeof cache === 'undefined') {\n    cache = str;\n    res = '';\n  } else if (res.length >= max) {\n    return res.substr(0, max);\n  }\n\n  while (max > res.length && num > 1) {\n    if (num & 1) {\n      res += str;\n    }\n\n    num >>= 1;\n    str += str;\n  }\n\n  res += str;\n  res = res.substr(0, max);\n  return res;\n}\n\n\n/***/ }),\n/* 798 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"name\":\"request-capture-har\",\"version\":\"1.2.2\",\"description\":\"Wrapper for request module that saves all traffic as a HAR file, useful for auto mocking a client\",\"main\":\"request-capture-har.js\",\"scripts\":{\"test\":\"semistandard\",\"travis\":\"npm test && node request-capture-har.js\"},\"repository\":{\"type\":\"git\",\"url\":\"git+https://github.com/paulirish/node-request-capture-har.git\"},\"keywords\":[\"http\",\"request\",\"har\"],\"author\":\"Lars Thorup <lars@zealake.com> (http://github.com/larsthorup)\",\"license\":\"MIT\",\"bugs\":{\"url\":\"https://github.com/paulirish/node-request-capture-har/issues\"},\"homepage\":\"https://github.com/paulirish/node-request-capture-har#readme\",\"files\":[\"request-capture-har.js\"],\"devDependencies\":{\"semistandard\":\"^8.0.0\"}}\n\n/***/ }),\n/* 799 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar fs = __webpack_require__(4);\nvar pkg = __webpack_require__(798);\n\nfunction buildHarHeaders (headers) {\n  return headers ? Object.keys(headers).map(function (key) {\n    return {\n      name: key,\n      // header values are required to be strings\n      value: headers[key].toString()\n    };\n  }) : [];\n}\n\nfunction appendPostData (entry, request) {\n  if (!request.body) return;\n\n  entry.request.postData = {\n    mimeType: 'application/octet-stream',\n    text: request.body\n  };\n}\n\nfunction toMs (num) {\n  return Math.round(num * 1000) / 1000;\n}\n\nfunction HarWrapper (requestModule) {\n  this.requestModule = requestModule;\n  this.clear();\n}\n\nHarWrapper.prototype.request = function (options) {\n  // include detailed timing data in response object\n  Object.assign(options, { time: true });\n  var self = this;\n  // make call to true request module\n  return this.requestModule(options, function (err, incomingMessage, response) {\n    // create new har entry with reponse timings\n    if (!err) {\n      self.entries.push(self.buildHarEntry(incomingMessage));\n    }\n\n    // fire any callback provided in options, as request has ignored it\n    //     https://github.com/request/request/blob/v2.75.0/index.js#L40\n    if (typeof options.callback === 'function') {\n      options.callback.apply(null, arguments);\n    }\n  });\n};\n\nHarWrapper.prototype.clear = function () {\n  this.entries = [];\n  this.earliestTime = new Date(2099, 1, 1);\n};\n\nHarWrapper.prototype.saveHar = function (fileName) {\n  var httpArchive = {\n    log: {\n      version: '1.2',\n      creator: {name: 'request-capture-har', version: pkg.version},\n      pages: [{\n        startedDateTime: new Date(this.earliestTime).toISOString(),\n        id: 'request-capture-har',\n        title: 'request-capture-har',\n        pageTimings: { }\n      }],\n      entries: this.entries\n    }\n  };\n  fs.writeFileSync(fileName, JSON.stringify(httpArchive, null, 2));\n};\n\nHarWrapper.prototype.buildTimings = function (entry, response) {\n  var startTs = response.request.startTime;\n  var endTs = startTs + response.elapsedTime;\n  var totalTime = endTs - startTs;\n\n  if (new Date(startTs) < this.earliestTime) {\n    this.earliestTime = new Date(startTs);\n  }\n  entry.startedDateTime = new Date(startTs).toISOString();\n  entry.time = totalTime;\n\n  // new timing data added in request 2.81.0\n  if (response.timingPhases) {\n    entry.timings = {\n      'blocked': toMs(response.timingPhases.wait),\n      'dns': toMs(response.timingPhases.dns),\n      'connect': toMs(response.timingPhases.tcp),\n      'send': 0,\n      'wait': toMs(response.timingPhases.firstByte),\n      'receive': toMs(response.timingPhases.download)\n    };\n    return;\n  }\n\n  var responseStartTs = response.request.response.responseStartTime;\n\n  var waitingTime = responseStartTs - startTs;\n  var receiveTime = endTs - responseStartTs;\n  entry.timings = {\n    send: 0,\n    wait: waitingTime,\n    receive: receiveTime\n  };\n};\n\nHarWrapper.prototype.buildHarEntry = function (response) {\n  var entry = {\n    request: {\n      method: response.request.method,\n      url: response.request.uri.href,\n      httpVersion: 'HTTP/' + response.httpVersion,\n      cookies: [],\n      headers: buildHarHeaders(response.request.headers),\n      queryString: [],\n      headersSize: -1,\n      bodySize: -1\n    },\n    response: {\n      status: response.statusCode,\n      statusText: response.statusMessage,\n      httpVersion: 'HTTP/' + response.httpVersion,\n      cookies: [],\n      headers: buildHarHeaders(response.headers),\n      _transferSize: response.body.length,\n      content: {\n        size: response.body.length,\n        mimeType: response.headers['content-type']\n      },\n      redirectURL: '',\n      headersSize: -1,\n      bodySize: -1\n    },\n    cache: {}\n  };\n  this.buildTimings(entry, response);\n  appendPostData(entry, response.request);\n  return entry;\n};\n\nmodule.exports = HarWrapper;\n\n\n/***/ }),\n/* 800 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n// Copyright 2010-2012 Mikeal Rogers\n//\n//    Licensed under the Apache License, Version 2.0 (the \"License\");\n//    you may not use this file except in compliance with the License.\n//    You may obtain a copy of the License at\n//\n//        http://www.apache.org/licenses/LICENSE-2.0\n//\n//    Unless required by applicable law or agreed to in writing, software\n//    distributed under the License is distributed on an \"AS IS\" BASIS,\n//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n//    See the License for the specific language governing permissions and\n//    limitations under the License.\n\n\n\nvar extend = __webpack_require__(266)\nvar cookies = __webpack_require__(412)\nvar helpers = __webpack_require__(306)\n\nvar paramsHaveRequestBody = helpers.paramsHaveRequestBody\n\n// organize params for patch, post, put, head, del\nfunction initParams (uri, options, callback) {\n  if (typeof options === 'function') {\n    callback = options\n  }\n\n  var params = {}\n  if (typeof options === 'object') {\n    extend(params, options, {uri: uri})\n  } else if (typeof uri === 'string') {\n    extend(params, {uri: uri})\n  } else {\n    extend(params, uri)\n  }\n\n  params.callback = callback || params.callback\n  return params\n}\n\nfunction request (uri, options, callback) {\n  if (typeof uri === 'undefined') {\n    throw new Error('undefined is not a valid uri or options object.')\n  }\n\n  var params = initParams(uri, options, callback)\n\n  if (params.method === 'HEAD' && paramsHaveRequestBody(params)) {\n    throw new Error('HTTP HEAD requests MUST NOT include a request body.')\n  }\n\n  return new request.Request(params)\n}\n\nfunction verbFunc (verb) {\n  var method = verb.toUpperCase()\n  return function (uri, options, callback) {\n    var params = initParams(uri, options, callback)\n    params.method = method\n    return request(params, params.callback)\n  }\n}\n\n// define like this to please codeintel/intellisense IDEs\nrequest.get = verbFunc('get')\nrequest.head = verbFunc('head')\nrequest.options = verbFunc('options')\nrequest.post = verbFunc('post')\nrequest.put = verbFunc('put')\nrequest.patch = verbFunc('patch')\nrequest.del = verbFunc('delete')\nrequest['delete'] = verbFunc('delete')\n\nrequest.jar = function (store) {\n  return cookies.jar(store)\n}\n\nrequest.cookie = function (str) {\n  return cookies.parse(str)\n}\n\nfunction wrapRequestMethod (method, options, requester, verb) {\n  return function (uri, opts, callback) {\n    var params = initParams(uri, opts, callback)\n\n    var target = {}\n    extend(true, target, options, params)\n\n    target.pool = params.pool || options.pool\n\n    if (verb) {\n      target.method = verb.toUpperCase()\n    }\n\n    if (typeof requester === 'function') {\n      method = requester\n    }\n\n    return method(target, target.callback)\n  }\n}\n\nrequest.defaults = function (options, requester) {\n  var self = this\n\n  options = options || {}\n\n  if (typeof options === 'function') {\n    requester = options\n    options = {}\n  }\n\n  var defaults = wrapRequestMethod(self, options, requester)\n\n  var verbs = ['get', 'head', 'post', 'put', 'patch', 'del', 'delete']\n  verbs.forEach(function (verb) {\n    defaults[verb] = wrapRequestMethod(self[verb], options, requester, verb)\n  })\n\n  defaults.cookie = wrapRequestMethod(self.cookie, options, requester)\n  defaults.jar = self.jar\n  defaults.defaults = self.defaults\n  return defaults\n}\n\nrequest.forever = function (agentOptions, optionsArg) {\n  var options = {}\n  if (optionsArg) {\n    extend(options, optionsArg)\n  }\n  if (agentOptions) {\n    options.agentOptions = agentOptions\n  }\n\n  options.forever = true\n  return request.defaults(options)\n}\n\n// Exports\n\nmodule.exports = request\nrequest.Request = __webpack_require__(813)\nrequest.initParams = initParams\n\n// Backwards compatibility for request.debug\nObject.defineProperty(request, 'debug', {\n  enumerable: true,\n  get: function () {\n    return request.Request.debug\n  },\n  set: function (debug) {\n    request.Request.debug = debug\n  }\n})\n\n\n/***/ }),\n/* 801 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar caseless = __webpack_require__(228)\nvar uuid = __webpack_require__(120)\nvar helpers = __webpack_require__(306)\n\nvar md5 = helpers.md5\nvar toBase64 = helpers.toBase64\n\nfunction Auth (request) {\n  // define all public properties here\n  this.request = request\n  this.hasAuth = false\n  this.sentAuth = false\n  this.bearerToken = null\n  this.user = null\n  this.pass = null\n}\n\nAuth.prototype.basic = function (user, pass, sendImmediately) {\n  var self = this\n  if (typeof user !== 'string' || (pass !== undefined && typeof pass !== 'string')) {\n    self.request.emit('error', new Error('auth() received invalid user or password'))\n  }\n  self.user = user\n  self.pass = pass\n  self.hasAuth = true\n  var header = user + ':' + (pass || '')\n  if (sendImmediately || typeof sendImmediately === 'undefined') {\n    var authHeader = 'Basic ' + toBase64(header)\n    self.sentAuth = true\n    return authHeader\n  }\n}\n\nAuth.prototype.bearer = function (bearer, sendImmediately) {\n  var self = this\n  self.bearerToken = bearer\n  self.hasAuth = true\n  if (sendImmediately || typeof sendImmediately === 'undefined') {\n    if (typeof bearer === 'function') {\n      bearer = bearer()\n    }\n    var authHeader = 'Bearer ' + (bearer || '')\n    self.sentAuth = true\n    return authHeader\n  }\n}\n\nAuth.prototype.digest = function (method, path, authHeader) {\n  // TODO: More complete implementation of RFC 2617.\n  //   - handle challenge.domain\n  //   - support qop=\"auth-int\" only\n  //   - handle Authentication-Info (not necessarily?)\n  //   - check challenge.stale (not necessarily?)\n  //   - increase nc (not necessarily?)\n  // For reference:\n  // http://tools.ietf.org/html/rfc2617#section-3\n  // https://github.com/bagder/curl/blob/master/lib/http_digest.c\n\n  var self = this\n\n  var challenge = {}\n  var re = /([a-z0-9_-]+)=(?:\"([^\"]+)\"|([a-z0-9_-]+))/gi\n  for (;;) {\n    var match = re.exec(authHeader)\n    if (!match) {\n      break\n    }\n    challenge[match[1]] = match[2] || match[3]\n  }\n\n  /**\n   * RFC 2617: handle both MD5 and MD5-sess algorithms.\n   *\n   * If the algorithm directive's value is \"MD5\" or unspecified, then HA1 is\n   *   HA1=MD5(username:realm:password)\n   * If the algorithm directive's value is \"MD5-sess\", then HA1 is\n   *   HA1=MD5(MD5(username:realm:password):nonce:cnonce)\n   */\n  var ha1Compute = function (algorithm, user, realm, pass, nonce, cnonce) {\n    var ha1 = md5(user + ':' + realm + ':' + pass)\n    if (algorithm && algorithm.toLowerCase() === 'md5-sess') {\n      return md5(ha1 + ':' + nonce + ':' + cnonce)\n    } else {\n      return ha1\n    }\n  }\n\n  var qop = /(^|,)\\s*auth\\s*($|,)/.test(challenge.qop) && 'auth'\n  var nc = qop && '00000001'\n  var cnonce = qop && uuid().replace(/-/g, '')\n  var ha1 = ha1Compute(challenge.algorithm, self.user, challenge.realm, self.pass, challenge.nonce, cnonce)\n  var ha2 = md5(method + ':' + path)\n  var digestResponse = qop\n    ? md5(ha1 + ':' + challenge.nonce + ':' + nc + ':' + cnonce + ':' + qop + ':' + ha2)\n    : md5(ha1 + ':' + challenge.nonce + ':' + ha2)\n  var authValues = {\n    username: self.user,\n    realm: challenge.realm,\n    nonce: challenge.nonce,\n    uri: path,\n    qop: qop,\n    response: digestResponse,\n    nc: nc,\n    cnonce: cnonce,\n    algorithm: challenge.algorithm,\n    opaque: challenge.opaque\n  }\n\n  authHeader = []\n  for (var k in authValues) {\n    if (authValues[k]) {\n      if (k === 'qop' || k === 'nc' || k === 'algorithm') {\n        authHeader.push(k + '=' + authValues[k])\n      } else {\n        authHeader.push(k + '=\"' + authValues[k] + '\"')\n      }\n    }\n  }\n  authHeader = 'Digest ' + authHeader.join(', ')\n  self.sentAuth = true\n  return authHeader\n}\n\nAuth.prototype.onRequest = function (user, pass, sendImmediately, bearer) {\n  var self = this\n  var request = self.request\n\n  var authHeader\n  if (bearer === undefined && user === undefined) {\n    self.request.emit('error', new Error('no auth mechanism defined'))\n  } else if (bearer !== undefined) {\n    authHeader = self.bearer(bearer, sendImmediately)\n  } else {\n    authHeader = self.basic(user, pass, sendImmediately)\n  }\n  if (authHeader) {\n    request.setHeader('authorization', authHeader)\n  }\n}\n\nAuth.prototype.onResponse = function (response) {\n  var self = this\n  var request = self.request\n\n  if (!self.hasAuth || self.sentAuth) { return null }\n\n  var c = caseless(response.headers)\n\n  var authHeader = c.get('www-authenticate')\n  var authVerb = authHeader && authHeader.split(' ')[0].toLowerCase()\n  request.debug('reauth', authVerb)\n\n  switch (authVerb) {\n    case 'basic':\n      return self.basic(self.user, self.pass, true)\n\n    case 'bearer':\n      return self.bearer(self.bearerToken, true)\n\n    case 'digest':\n      return self.digest(request.method, request.path, authHeader)\n  }\n}\n\nexports.Auth = Auth\n\n\n/***/ }),\n/* 802 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nfunction formatHostname (hostname) {\n  // canonicalize the hostname, so that 'oogle.com' won't match 'google.com'\n  return hostname.replace(/^\\.*/, '.').toLowerCase()\n}\n\nfunction parseNoProxyZone (zone) {\n  zone = zone.trim().toLowerCase()\n\n  var zoneParts = zone.split(':', 2)\n  var zoneHost = formatHostname(zoneParts[0])\n  var zonePort = zoneParts[1]\n  var hasPort = zone.indexOf(':') > -1\n\n  return {hostname: zoneHost, port: zonePort, hasPort: hasPort}\n}\n\nfunction uriInNoProxy (uri, noProxy) {\n  var port = uri.port || (uri.protocol === 'https:' ? '443' : '80')\n  var hostname = formatHostname(uri.hostname)\n  var noProxyList = noProxy.split(',')\n\n  // iterate through the noProxyList until it finds a match.\n  return noProxyList.map(parseNoProxyZone).some(function (noProxyZone) {\n    var isMatchedAt = hostname.indexOf(noProxyZone.hostname)\n    var hostnameMatched = (\n      isMatchedAt > -1 &&\n        (isMatchedAt === hostname.length - noProxyZone.hostname.length)\n    )\n\n    if (noProxyZone.hasPort) {\n      return (port === noProxyZone.port) && hostnameMatched\n    }\n\n    return hostnameMatched\n  })\n}\n\nfunction getProxyFromURI (uri) {\n  // Decide the proper request proxy to use based on the request URI object and the\n  // environmental variables (NO_PROXY, HTTP_PROXY, etc.)\n  // respect NO_PROXY environment variables (see: http://lynx.isc.org/current/breakout/lynx_help/keystrokes/environments.html)\n\n  var noProxy = process.env.NO_PROXY || process.env.no_proxy || ''\n\n  // if the noProxy is a wildcard then return null\n\n  if (noProxy === '*') {\n    return null\n  }\n\n  // if the noProxy is not empty and the uri is found return null\n\n  if (noProxy !== '' && uriInNoProxy(uri, noProxy)) {\n    return null\n  }\n\n  // Check for HTTP or HTTPS Proxy in environment Else default to null\n\n  if (uri.protocol === 'http:') {\n    return process.env.HTTP_PROXY ||\n      process.env.http_proxy || null\n  }\n\n  if (uri.protocol === 'https:') {\n    return process.env.HTTPS_PROXY ||\n      process.env.https_proxy ||\n      process.env.HTTP_PROXY ||\n      process.env.http_proxy || null\n  }\n\n  // if none of that works, return null\n  // (What uri protocol are you using then?)\n\n  return null\n}\n\nmodule.exports = getProxyFromURI\n\n\n/***/ }),\n/* 803 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar fs = __webpack_require__(4)\nvar qs = __webpack_require__(197)\nvar validate = __webpack_require__(645)\nvar extend = __webpack_require__(266)\n\nfunction Har (request) {\n  this.request = request\n}\n\nHar.prototype.reducer = function (obj, pair) {\n  // new property ?\n  if (obj[pair.name] === undefined) {\n    obj[pair.name] = pair.value\n    return obj\n  }\n\n  // existing? convert to array\n  var arr = [\n    obj[pair.name],\n    pair.value\n  ]\n\n  obj[pair.name] = arr\n\n  return obj\n}\n\nHar.prototype.prep = function (data) {\n  // construct utility properties\n  data.queryObj = {}\n  data.headersObj = {}\n  data.postData.jsonObj = false\n  data.postData.paramsObj = false\n\n  // construct query objects\n  if (data.queryString && data.queryString.length) {\n    data.queryObj = data.queryString.reduce(this.reducer, {})\n  }\n\n  // construct headers objects\n  if (data.headers && data.headers.length) {\n    // loweCase header keys\n    data.headersObj = data.headers.reduceRight(function (headers, header) {\n      headers[header.name] = header.value\n      return headers\n    }, {})\n  }\n\n  // construct Cookie header\n  if (data.cookies && data.cookies.length) {\n    var cookies = data.cookies.map(function (cookie) {\n      return cookie.name + '=' + cookie.value\n    })\n\n    if (cookies.length) {\n      data.headersObj.cookie = cookies.join('; ')\n    }\n  }\n\n  // prep body\n  function some (arr) {\n    return arr.some(function (type) {\n      return data.postData.mimeType.indexOf(type) === 0\n    })\n  }\n\n  if (some([\n    'multipart/mixed',\n    'multipart/related',\n    'multipart/form-data',\n    'multipart/alternative'])) {\n    // reset values\n    data.postData.mimeType = 'multipart/form-data'\n  } else if (some([\n    'application/x-www-form-urlencoded'])) {\n    if (!data.postData.params) {\n      data.postData.text = ''\n    } else {\n      data.postData.paramsObj = data.postData.params.reduce(this.reducer, {})\n\n      // always overwrite\n      data.postData.text = qs.stringify(data.postData.paramsObj)\n    }\n  } else if (some([\n    'text/json',\n    'text/x-json',\n    'application/json',\n    'application/x-json'])) {\n    data.postData.mimeType = 'application/json'\n\n    if (data.postData.text) {\n      try {\n        data.postData.jsonObj = JSON.parse(data.postData.text)\n      } catch (e) {\n        this.request.debug(e)\n\n        // force back to text/plain\n        data.postData.mimeType = 'text/plain'\n      }\n    }\n  }\n\n  return data\n}\n\nHar.prototype.options = function (options) {\n  // skip if no har property defined\n  if (!options.har) {\n    return options\n  }\n\n  var har = {}\n  extend(har, options.har)\n\n  // only process the first entry\n  if (har.log && har.log.entries) {\n    har = har.log.entries[0]\n  }\n\n  // add optional properties to make validation successful\n  har.url = har.url || options.url || options.uri || options.baseUrl || '/'\n  har.httpVersion = har.httpVersion || 'HTTP/1.1'\n  har.queryString = har.queryString || []\n  har.headers = har.headers || []\n  har.cookies = har.cookies || []\n  har.postData = har.postData || {}\n  har.postData.mimeType = har.postData.mimeType || 'application/octet-stream'\n\n  har.bodySize = 0\n  har.headersSize = 0\n  har.postData.size = 0\n\n  if (!validate.request(har)) {\n    return options\n  }\n\n  // clean up and get some utility properties\n  var req = this.prep(har)\n\n  // construct new options\n  if (req.url) {\n    options.url = req.url\n  }\n\n  if (req.method) {\n    options.method = req.method\n  }\n\n  if (Object.keys(req.queryObj).length) {\n    options.qs = req.queryObj\n  }\n\n  if (Object.keys(req.headersObj).length) {\n    options.headers = req.headersObj\n  }\n\n  function test (type) {\n    return req.postData.mimeType.indexOf(type) === 0\n  }\n  if (test('application/x-www-form-urlencoded')) {\n    options.form = req.postData.paramsObj\n  } else if (test('application/json')) {\n    if (req.postData.jsonObj) {\n      options.body = req.postData.jsonObj\n      options.json = true\n    }\n  } else if (test('multipart/form-data')) {\n    options.formData = {}\n\n    req.postData.params.forEach(function (param) {\n      var attachment = {}\n\n      if (!param.fileName && !param.fileName && !param.contentType) {\n        options.formData[param.name] = param.value\n        return\n      }\n\n      // attempt to read from disk!\n      if (param.fileName && !param.value) {\n        attachment.value = fs.createReadStream(param.fileName)\n      } else if (param.value) {\n        attachment.value = param.value\n      }\n\n      if (param.fileName) {\n        attachment.options = {\n          filename: param.fileName,\n          contentType: param.contentType ? param.contentType : null\n        }\n      }\n\n      options.formData[param.name] = attachment\n    })\n  } else {\n    if (req.postData.text) {\n      options.body = req.postData.text\n    }\n  }\n\n  return options\n}\n\nexports.Har = Har\n\n\n/***/ }),\n/* 804 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar crypto = __webpack_require__(11)\n\nfunction randomString (size) {\n  var bits = (size + 1) * 6\n  var buffer = crypto.randomBytes(Math.ceil(bits / 8))\n  var string = buffer.toString('base64').replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '')\n  return string.slice(0, size)\n}\n\nfunction calculatePayloadHash (payload, algorithm, contentType) {\n  var hash = crypto.createHash(algorithm)\n  hash.update('hawk.1.payload\\n')\n  hash.update((contentType ? contentType.split(';')[0].trim().toLowerCase() : '') + '\\n')\n  hash.update(payload || '')\n  hash.update('\\n')\n  return hash.digest('base64')\n}\n\nexports.calculateMac = function (credentials, opts) {\n  var normalized = 'hawk.1.header\\n' +\n    opts.ts + '\\n' +\n    opts.nonce + '\\n' +\n    (opts.method || '').toUpperCase() + '\\n' +\n    opts.resource + '\\n' +\n    opts.host.toLowerCase() + '\\n' +\n    opts.port + '\\n' +\n    (opts.hash || '') + '\\n'\n\n  if (opts.ext) {\n    normalized = normalized + opts.ext.replace('\\\\', '\\\\\\\\').replace('\\n', '\\\\n')\n  }\n\n  normalized = normalized + '\\n'\n\n  if (opts.app) {\n    normalized = normalized + opts.app + '\\n' + (opts.dlg || '') + '\\n'\n  }\n\n  var hmac = crypto.createHmac(credentials.algorithm, credentials.key).update(normalized)\n  var digest = hmac.digest('base64')\n  return digest\n}\n\nexports.header = function (uri, method, opts) {\n  var timestamp = opts.timestamp || Math.floor((Date.now() + (opts.localtimeOffsetMsec || 0)) / 1000)\n  var credentials = opts.credentials\n  if (!credentials || !credentials.id || !credentials.key || !credentials.algorithm) {\n    return ''\n  }\n\n  if (['sha1', 'sha256'].indexOf(credentials.algorithm) === -1) {\n    return ''\n  }\n\n  var artifacts = {\n    ts: timestamp,\n    nonce: opts.nonce || randomString(6),\n    method: method,\n    resource: uri.pathname + (uri.search || ''),\n    host: uri.hostname,\n    port: uri.port || (uri.protocol === 'http:' ? 80 : 443),\n    hash: opts.hash,\n    ext: opts.ext,\n    app: opts.app,\n    dlg: opts.dlg\n  }\n\n  if (!artifacts.hash && (opts.payload || opts.payload === '')) {\n    artifacts.hash = calculatePayloadHash(opts.payload, credentials.algorithm, opts.contentType)\n  }\n\n  var mac = exports.calculateMac(credentials, artifacts)\n\n  var hasExt = artifacts.ext !== null && artifacts.ext !== undefined && artifacts.ext !== ''\n  var header = 'Hawk id=\"' + credentials.id +\n    '\", ts=\"' + artifacts.ts +\n    '\", nonce=\"' + artifacts.nonce +\n    (artifacts.hash ? '\", hash=\"' + artifacts.hash : '') +\n    (hasExt ? '\", ext=\"' + artifacts.ext.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"') : '') +\n    '\", mac=\"' + mac + '\"'\n\n  if (artifacts.app) {\n    header = header + ', app=\"' + artifacts.app + (artifacts.dlg ? '\", dlg=\"' + artifacts.dlg : '') + '\"'\n  }\n\n  return header\n}\n\n\n/***/ }),\n/* 805 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar uuid = __webpack_require__(120)\nvar CombinedStream = __webpack_require__(379)\nvar isstream = __webpack_require__(399)\nvar Buffer = __webpack_require__(46).Buffer\n\nfunction Multipart (request) {\n  this.request = request\n  this.boundary = uuid()\n  this.chunked = false\n  this.body = null\n}\n\nMultipart.prototype.isChunked = function (options) {\n  var self = this\n  var chunked = false\n  var parts = options.data || options\n\n  if (!parts.forEach) {\n    self.request.emit('error', new Error('Argument error, options.multipart.'))\n  }\n\n  if (options.chunked !== undefined) {\n    chunked = options.chunked\n  }\n\n  if (self.request.getHeader('transfer-encoding') === 'chunked') {\n    chunked = true\n  }\n\n  if (!chunked) {\n    parts.forEach(function (part) {\n      if (typeof part.body === 'undefined') {\n        self.request.emit('error', new Error('Body attribute missing in multipart.'))\n      }\n      if (isstream(part.body)) {\n        chunked = true\n      }\n    })\n  }\n\n  return chunked\n}\n\nMultipart.prototype.setHeaders = function (chunked) {\n  var self = this\n\n  if (chunked && !self.request.hasHeader('transfer-encoding')) {\n    self.request.setHeader('transfer-encoding', 'chunked')\n  }\n\n  var header = self.request.getHeader('content-type')\n\n  if (!header || header.indexOf('multipart') === -1) {\n    self.request.setHeader('content-type', 'multipart/related; boundary=' + self.boundary)\n  } else {\n    if (header.indexOf('boundary') !== -1) {\n      self.boundary = header.replace(/.*boundary=([^\\s;]+).*/, '$1')\n    } else {\n      self.request.setHeader('content-type', header + '; boundary=' + self.boundary)\n    }\n  }\n}\n\nMultipart.prototype.build = function (parts, chunked) {\n  var self = this\n  var body = chunked ? new CombinedStream() : []\n\n  function add (part) {\n    if (typeof part === 'number') {\n      part = part.toString()\n    }\n    return chunked ? body.append(part) : body.push(Buffer.from(part))\n  }\n\n  if (self.request.preambleCRLF) {\n    add('\\r\\n')\n  }\n\n  parts.forEach(function (part) {\n    var preamble = '--' + self.boundary + '\\r\\n'\n    Object.keys(part).forEach(function (key) {\n      if (key === 'body') { return }\n      preamble += key + ': ' + part[key] + '\\r\\n'\n    })\n    preamble += '\\r\\n'\n    add(preamble)\n    add(part.body)\n    add('\\r\\n')\n  })\n  add('--' + self.boundary + '--')\n\n  if (self.request.postambleCRLF) {\n    add('\\r\\n')\n  }\n\n  return body\n}\n\nMultipart.prototype.onRequest = function (options) {\n  var self = this\n\n  var chunked = self.isChunked(options)\n  var parts = options.data || options\n\n  self.setHeaders(chunked)\n  self.chunked = chunked\n  self.body = self.build(parts, chunked)\n}\n\nexports.Multipart = Multipart\n\n\n/***/ }),\n/* 806 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar url = __webpack_require__(24)\nvar qs = __webpack_require__(404)\nvar caseless = __webpack_require__(228)\nvar uuid = __webpack_require__(120)\nvar oauth = __webpack_require__(768)\nvar crypto = __webpack_require__(11)\nvar Buffer = __webpack_require__(46).Buffer\n\nfunction OAuth (request) {\n  this.request = request\n  this.params = null\n}\n\nOAuth.prototype.buildParams = function (_oauth, uri, method, query, form, qsLib) {\n  var oa = {}\n  for (var i in _oauth) {\n    oa['oauth_' + i] = _oauth[i]\n  }\n  if (!oa.oauth_version) {\n    oa.oauth_version = '1.0'\n  }\n  if (!oa.oauth_timestamp) {\n    oa.oauth_timestamp = Math.floor(Date.now() / 1000).toString()\n  }\n  if (!oa.oauth_nonce) {\n    oa.oauth_nonce = uuid().replace(/-/g, '')\n  }\n  if (!oa.oauth_signature_method) {\n    oa.oauth_signature_method = 'HMAC-SHA1'\n  }\n\n  var consumer_secret_or_private_key = oa.oauth_consumer_secret || oa.oauth_private_key // eslint-disable-line camelcase\n  delete oa.oauth_consumer_secret\n  delete oa.oauth_private_key\n\n  var token_secret = oa.oauth_token_secret // eslint-disable-line camelcase\n  delete oa.oauth_token_secret\n\n  var realm = oa.oauth_realm\n  delete oa.oauth_realm\n  delete oa.oauth_transport_method\n\n  var baseurl = uri.protocol + '//' + uri.host + uri.pathname\n  var params = qsLib.parse([].concat(query, form, qsLib.stringify(oa)).join('&'))\n\n  oa.oauth_signature = oauth.sign(\n    oa.oauth_signature_method,\n    method,\n    baseurl,\n    params,\n    consumer_secret_or_private_key, // eslint-disable-line camelcase\n    token_secret // eslint-disable-line camelcase\n  )\n\n  if (realm) {\n    oa.realm = realm\n  }\n\n  return oa\n}\n\nOAuth.prototype.buildBodyHash = function (_oauth, body) {\n  if (['HMAC-SHA1', 'RSA-SHA1'].indexOf(_oauth.signature_method || 'HMAC-SHA1') < 0) {\n    this.request.emit('error', new Error('oauth: ' + _oauth.signature_method +\n      ' signature_method not supported with body_hash signing.'))\n  }\n\n  var shasum = crypto.createHash('sha1')\n  shasum.update(body || '')\n  var sha1 = shasum.digest('hex')\n\n  return Buffer.from(sha1, 'hex').toString('base64')\n}\n\nOAuth.prototype.concatParams = function (oa, sep, wrap) {\n  wrap = wrap || ''\n\n  var params = Object.keys(oa).filter(function (i) {\n    return i !== 'realm' && i !== 'oauth_signature'\n  }).sort()\n\n  if (oa.realm) {\n    params.splice(0, 0, 'realm')\n  }\n  params.push('oauth_signature')\n\n  return params.map(function (i) {\n    return i + '=' + wrap + oauth.rfc3986(oa[i]) + wrap\n  }).join(sep)\n}\n\nOAuth.prototype.onRequest = function (_oauth) {\n  var self = this\n  self.params = _oauth\n\n  var uri = self.request.uri || {}\n  var method = self.request.method || ''\n  var headers = caseless(self.request.headers)\n  var body = self.request.body || ''\n  var qsLib = self.request.qsLib || qs\n\n  var form\n  var query\n  var contentType = headers.get('content-type') || ''\n  var formContentType = 'application/x-www-form-urlencoded'\n  var transport = _oauth.transport_method || 'header'\n\n  if (contentType.slice(0, formContentType.length) === formContentType) {\n    contentType = formContentType\n    form = body\n  }\n  if (uri.query) {\n    query = uri.query\n  }\n  if (transport === 'body' && (method !== 'POST' || contentType !== formContentType)) {\n    self.request.emit('error', new Error('oauth: transport_method of body requires POST ' +\n      'and content-type ' + formContentType))\n  }\n\n  if (!form && typeof _oauth.body_hash === 'boolean') {\n    _oauth.body_hash = self.buildBodyHash(_oauth, self.request.body.toString())\n  }\n\n  var oa = self.buildParams(_oauth, uri, method, query, form, qsLib)\n\n  switch (transport) {\n    case 'header':\n      self.request.setHeader('Authorization', 'OAuth ' + self.concatParams(oa, ',', '\"'))\n      break\n\n    case 'query':\n      var href = self.request.uri.href += (query ? '&' : '?') + self.concatParams(oa, '&')\n      self.request.uri = url.parse(href)\n      self.request.path = self.request.uri.path\n      break\n\n    case 'body':\n      self.request.body = (form ? form + '&' : '') + self.concatParams(oa, '&')\n      break\n\n    default:\n      self.request.emit('error', new Error('oauth: transport_method invalid'))\n  }\n}\n\nexports.OAuth = OAuth\n\n\n/***/ }),\n/* 807 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar qs = __webpack_require__(404)\nvar querystring = __webpack_require__(197)\n\nfunction Querystring (request) {\n  this.request = request\n  this.lib = null\n  this.useQuerystring = null\n  this.parseOptions = null\n  this.stringifyOptions = null\n}\n\nQuerystring.prototype.init = function (options) {\n  if (this.lib) { return }\n\n  this.useQuerystring = options.useQuerystring\n  this.lib = (this.useQuerystring ? querystring : qs)\n\n  this.parseOptions = options.qsParseOptions || {}\n  this.stringifyOptions = options.qsStringifyOptions || {}\n}\n\nQuerystring.prototype.stringify = function (obj) {\n  return (this.useQuerystring)\n    ? this.rfc3986(this.lib.stringify(obj,\n      this.stringifyOptions.sep || null,\n      this.stringifyOptions.eq || null,\n      this.stringifyOptions))\n    : this.lib.stringify(obj, this.stringifyOptions)\n}\n\nQuerystring.prototype.parse = function (str) {\n  return (this.useQuerystring)\n    ? this.lib.parse(str,\n      this.parseOptions.sep || null,\n      this.parseOptions.eq || null,\n      this.parseOptions)\n    : this.lib.parse(str, this.parseOptions)\n}\n\nQuerystring.prototype.rfc3986 = function (str) {\n  return str.replace(/[!'()*]/g, function (c) {\n    return '%' + c.charCodeAt(0).toString(16).toUpperCase()\n  })\n}\n\nQuerystring.prototype.unescape = querystring.unescape\n\nexports.Querystring = Querystring\n\n\n/***/ }),\n/* 808 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar url = __webpack_require__(24)\nvar isUrl = /^https?:/\n\nfunction Redirect (request) {\n  this.request = request\n  this.followRedirect = true\n  this.followRedirects = true\n  this.followAllRedirects = false\n  this.followOriginalHttpMethod = false\n  this.allowRedirect = function () { return true }\n  this.maxRedirects = 10\n  this.redirects = []\n  this.redirectsFollowed = 0\n  this.removeRefererHeader = false\n}\n\nRedirect.prototype.onRequest = function (options) {\n  var self = this\n\n  if (options.maxRedirects !== undefined) {\n    self.maxRedirects = options.maxRedirects\n  }\n  if (typeof options.followRedirect === 'function') {\n    self.allowRedirect = options.followRedirect\n  }\n  if (options.followRedirect !== undefined) {\n    self.followRedirects = !!options.followRedirect\n  }\n  if (options.followAllRedirects !== undefined) {\n    self.followAllRedirects = options.followAllRedirects\n  }\n  if (self.followRedirects || self.followAllRedirects) {\n    self.redirects = self.redirects || []\n  }\n  if (options.removeRefererHeader !== undefined) {\n    self.removeRefererHeader = options.removeRefererHeader\n  }\n  if (options.followOriginalHttpMethod !== undefined) {\n    self.followOriginalHttpMethod = options.followOriginalHttpMethod\n  }\n}\n\nRedirect.prototype.redirectTo = function (response) {\n  var self = this\n  var request = self.request\n\n  var redirectTo = null\n  if (response.statusCode >= 300 && response.statusCode < 400 && response.caseless.has('location')) {\n    var location = response.caseless.get('location')\n    request.debug('redirect', location)\n\n    if (self.followAllRedirects) {\n      redirectTo = location\n    } else if (self.followRedirects) {\n      switch (request.method) {\n        case 'PATCH':\n        case 'PUT':\n        case 'POST':\n        case 'DELETE':\n          // Do not follow redirects\n          break\n        default:\n          redirectTo = location\n          break\n      }\n    }\n  } else if (response.statusCode === 401) {\n    var authHeader = request._auth.onResponse(response)\n    if (authHeader) {\n      request.setHeader('authorization', authHeader)\n      redirectTo = request.uri\n    }\n  }\n  return redirectTo\n}\n\nRedirect.prototype.onResponse = function (response) {\n  var self = this\n  var request = self.request\n\n  var redirectTo = self.redirectTo(response)\n  if (!redirectTo || !self.allowRedirect.call(request, response)) {\n    return false\n  }\n\n  request.debug('redirect to', redirectTo)\n\n  // ignore any potential response body.  it cannot possibly be useful\n  // to us at this point.\n  // response.resume should be defined, but check anyway before calling. Workaround for browserify.\n  if (response.resume) {\n    response.resume()\n  }\n\n  if (self.redirectsFollowed >= self.maxRedirects) {\n    request.emit('error', new Error('Exceeded maxRedirects. Probably stuck in a redirect loop ' + request.uri.href))\n    return false\n  }\n  self.redirectsFollowed += 1\n\n  if (!isUrl.test(redirectTo)) {\n    redirectTo = url.resolve(request.uri.href, redirectTo)\n  }\n\n  var uriPrev = request.uri\n  request.uri = url.parse(redirectTo)\n\n  // handle the case where we change protocol from https to http or vice versa\n  if (request.uri.protocol !== uriPrev.protocol) {\n    delete request.agent\n  }\n\n  self.redirects.push({ statusCode: response.statusCode, redirectUri: redirectTo })\n\n  if (self.followAllRedirects && request.method !== 'HEAD' &&\n    response.statusCode !== 401 && response.statusCode !== 307) {\n    request.method = self.followOriginalHttpMethod ? request.method : 'GET'\n  }\n  // request.method = 'GET' // Force all redirects to use GET || commented out fixes #215\n  delete request.src\n  delete request.req\n  delete request._started\n  if (response.statusCode !== 401 && response.statusCode !== 307) {\n    // Remove parameters from the previous response, unless this is the second request\n    // for a server that requires digest authentication.\n    delete request.body\n    delete request._form\n    if (request.headers) {\n      request.removeHeader('host')\n      request.removeHeader('content-type')\n      request.removeHeader('content-length')\n      if (request.uri.hostname !== request.originalHost.split(':')[0]) {\n        // Remove authorization if changing hostnames (but not if just\n        // changing ports or protocols).  This matches the behavior of curl:\n        // https://github.com/bagder/curl/blob/6beb0eee/lib/http.c#L710\n        request.removeHeader('authorization')\n      }\n    }\n  }\n\n  if (!self.removeRefererHeader) {\n    request.setHeader('referer', uriPrev.href)\n  }\n\n  request.emit('redirect')\n\n  request.init()\n\n  return true\n}\n\nexports.Redirect = Redirect\n\n\n/***/ }),\n/* 809 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar url = __webpack_require__(24)\nvar tunnel = __webpack_require__(955)\n\nvar defaultProxyHeaderWhiteList = [\n  'accept',\n  'accept-charset',\n  'accept-encoding',\n  'accept-language',\n  'accept-ranges',\n  'cache-control',\n  'content-encoding',\n  'content-language',\n  'content-location',\n  'content-md5',\n  'content-range',\n  'content-type',\n  'connection',\n  'date',\n  'expect',\n  'max-forwards',\n  'pragma',\n  'referer',\n  'te',\n  'user-agent',\n  'via'\n]\n\nvar defaultProxyHeaderExclusiveList = [\n  'proxy-authorization'\n]\n\nfunction constructProxyHost (uriObject) {\n  var port = uriObject.port\n  var protocol = uriObject.protocol\n  var proxyHost = uriObject.hostname + ':'\n\n  if (port) {\n    proxyHost += port\n  } else if (protocol === 'https:') {\n    proxyHost += '443'\n  } else {\n    proxyHost += '80'\n  }\n\n  return proxyHost\n}\n\nfunction constructProxyHeaderWhiteList (headers, proxyHeaderWhiteList) {\n  var whiteList = proxyHeaderWhiteList\n    .reduce(function (set, header) {\n      set[header.toLowerCase()] = true\n      return set\n    }, {})\n\n  return Object.keys(headers)\n    .filter(function (header) {\n      return whiteList[header.toLowerCase()]\n    })\n    .reduce(function (set, header) {\n      set[header] = headers[header]\n      return set\n    }, {})\n}\n\nfunction constructTunnelOptions (request, proxyHeaders) {\n  var proxy = request.proxy\n\n  var tunnelOptions = {\n    proxy: {\n      host: proxy.hostname,\n      port: +proxy.port,\n      proxyAuth: proxy.auth,\n      headers: proxyHeaders\n    },\n    headers: request.headers,\n    ca: request.ca,\n    cert: request.cert,\n    key: request.key,\n    passphrase: request.passphrase,\n    pfx: request.pfx,\n    ciphers: request.ciphers,\n    rejectUnauthorized: request.rejectUnauthorized,\n    secureOptions: request.secureOptions,\n    secureProtocol: request.secureProtocol\n  }\n\n  return tunnelOptions\n}\n\nfunction constructTunnelFnName (uri, proxy) {\n  var uriProtocol = (uri.protocol === 'https:' ? 'https' : 'http')\n  var proxyProtocol = (proxy.protocol === 'https:' ? 'Https' : 'Http')\n  return [uriProtocol, proxyProtocol].join('Over')\n}\n\nfunction getTunnelFn (request) {\n  var uri = request.uri\n  var proxy = request.proxy\n  var tunnelFnName = constructTunnelFnName(uri, proxy)\n  return tunnel[tunnelFnName]\n}\n\nfunction Tunnel (request) {\n  this.request = request\n  this.proxyHeaderWhiteList = defaultProxyHeaderWhiteList\n  this.proxyHeaderExclusiveList = []\n  if (typeof request.tunnel !== 'undefined') {\n    this.tunnelOverride = request.tunnel\n  }\n}\n\nTunnel.prototype.isEnabled = function () {\n  var self = this\n  var request = self.request\n    // Tunnel HTTPS by default. Allow the user to override this setting.\n\n  // If self.tunnelOverride is set (the user specified a value), use it.\n  if (typeof self.tunnelOverride !== 'undefined') {\n    return self.tunnelOverride\n  }\n\n  // If the destination is HTTPS, tunnel.\n  if (request.uri.protocol === 'https:') {\n    return true\n  }\n\n  // Otherwise, do not use tunnel.\n  return false\n}\n\nTunnel.prototype.setup = function (options) {\n  var self = this\n  var request = self.request\n\n  options = options || {}\n\n  if (typeof request.proxy === 'string') {\n    request.proxy = url.parse(request.proxy)\n  }\n\n  if (!request.proxy || !request.tunnel) {\n    return false\n  }\n\n  // Setup Proxy Header Exclusive List and White List\n  if (options.proxyHeaderWhiteList) {\n    self.proxyHeaderWhiteList = options.proxyHeaderWhiteList\n  }\n  if (options.proxyHeaderExclusiveList) {\n    self.proxyHeaderExclusiveList = options.proxyHeaderExclusiveList\n  }\n\n  var proxyHeaderExclusiveList = self.proxyHeaderExclusiveList.concat(defaultProxyHeaderExclusiveList)\n  var proxyHeaderWhiteList = self.proxyHeaderWhiteList.concat(proxyHeaderExclusiveList)\n\n  // Setup Proxy Headers and Proxy Headers Host\n  // Only send the Proxy White Listed Header names\n  var proxyHeaders = constructProxyHeaderWhiteList(request.headers, proxyHeaderWhiteList)\n  proxyHeaders.host = constructProxyHost(request.uri)\n\n  proxyHeaderExclusiveList.forEach(request.removeHeader, request)\n\n  // Set Agent from Tunnel Data\n  var tunnelFn = getTunnelFn(request)\n  var tunnelOptions = constructTunnelOptions(request, proxyHeaders)\n  request.agent = tunnelFn(tunnelOptions)\n\n  return true\n}\n\nTunnel.defaultProxyHeaderWhiteList = defaultProxyHeaderWhiteList\nTunnel.defaultProxyHeaderExclusiveList = defaultProxyHeaderExclusiveList\nexports.Tunnel = Tunnel\n\n\n/***/ }),\n/* 810 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * Copyright (c) 2015, Salesforce.com, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. Neither the name of Salesforce.com nor the names of its contributors may\n * be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar net = __webpack_require__(164);\nvar urlParse = __webpack_require__(24).parse;\nvar pubsuffix = __webpack_require__(415);\nvar Store = __webpack_require__(416).Store;\nvar MemoryCookieStore = __webpack_require__(811).MemoryCookieStore;\nvar pathMatch = __webpack_require__(413).pathMatch;\nvar VERSION = __webpack_require__(812).version;\n\nvar punycode;\ntry {\n  punycode = __webpack_require__(305);\n} catch(e) {\n  console.warn(\"cookie: can't load punycode; won't use punycode for domain normalization\");\n}\n\n// From RFC6265 S4.1.1\n// note that it excludes \\x3B \";\"\nvar COOKIE_OCTETS = /^[\\x21\\x23-\\x2B\\x2D-\\x3A\\x3C-\\x5B\\x5D-\\x7E]+$/;\n\nvar CONTROL_CHARS = /[\\x00-\\x1F]/;\n\n// From Chromium // '\\r', '\\n' and '\\0' should be treated as a terminator in\n// the \"relaxed\" mode, see:\n// https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/parsed_cookie.cc#L60\nvar TERMINATORS = ['\\n', '\\r', '\\0'];\n\n// RFC6265 S4.1.1 defines path value as 'any CHAR except CTLs or \";\"'\n// Note ';' is \\x3B\nvar PATH_VALUE = /[\\x20-\\x3A\\x3C-\\x7E]+/;\n\n// date-time parsing constants (RFC6265 S5.1.1)\n\nvar DATE_DELIM = /[\\x09\\x20-\\x2F\\x3B-\\x40\\x5B-\\x60\\x7B-\\x7E]/;\n\nvar MONTH_TO_NUM = {\n  jan:0, feb:1, mar:2, apr:3, may:4, jun:5,\n  jul:6, aug:7, sep:8, oct:9, nov:10, dec:11\n};\nvar NUM_TO_MONTH = [\n  'Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'\n];\nvar NUM_TO_DAY = [\n  'Sun','Mon','Tue','Wed','Thu','Fri','Sat'\n];\n\nvar MAX_TIME = 2147483647000; // 31-bit max\nvar MIN_TIME = 0; // 31-bit min\n\n/*\n * Parses a Natural number (i.e., non-negative integer) with either the\n *    <min>*<max>DIGIT ( non-digit *OCTET )\n * or\n *    <min>*<max>DIGIT\n * grammar (RFC6265 S5.1.1).\n *\n * The \"trailingOK\" boolean controls if the grammar accepts a\n * \"( non-digit *OCTET )\" trailer.\n */\nfunction parseDigits(token, minDigits, maxDigits, trailingOK) {\n  var count = 0;\n  while (count < token.length) {\n    var c = token.charCodeAt(count);\n    // \"non-digit = %x00-2F / %x3A-FF\"\n    if (c <= 0x2F || c >= 0x3A) {\n      break;\n    }\n    count++;\n  }\n\n  // constrain to a minimum and maximum number of digits.\n  if (count < minDigits || count > maxDigits) {\n    return null;\n  }\n\n  if (!trailingOK && count != token.length) {\n    return null;\n  }\n\n  return parseInt(token.substr(0,count), 10);\n}\n\nfunction parseTime(token) {\n  var parts = token.split(':');\n  var result = [0,0,0];\n\n  /* RF6256 S5.1.1:\n   *      time            = hms-time ( non-digit *OCTET )\n   *      hms-time        = time-field \":\" time-field \":\" time-field\n   *      time-field      = 1*2DIGIT\n   */\n\n  if (parts.length !== 3) {\n    return null;\n  }\n\n  for (var i = 0; i < 3; i++) {\n    // \"time-field\" must be strictly \"1*2DIGIT\", HOWEVER, \"hms-time\" can be\n    // followed by \"( non-digit *OCTET )\" so therefore the last time-field can\n    // have a trailer\n    var trailingOK = (i == 2);\n    var num = parseDigits(parts[i], 1, 2, trailingOK);\n    if (num === null) {\n      return null;\n    }\n    result[i] = num;\n  }\n\n  return result;\n}\n\nfunction parseMonth(token) {\n  token = String(token).substr(0,3).toLowerCase();\n  var num = MONTH_TO_NUM[token];\n  return num >= 0 ? num : null;\n}\n\n/*\n * RFC6265 S5.1.1 date parser (see RFC for full grammar)\n */\nfunction parseDate(str) {\n  if (!str) {\n    return;\n  }\n\n  /* RFC6265 S5.1.1:\n   * 2. Process each date-token sequentially in the order the date-tokens\n   * appear in the cookie-date\n   */\n  var tokens = str.split(DATE_DELIM);\n  if (!tokens) {\n    return;\n  }\n\n  var hour = null;\n  var minute = null;\n  var second = null;\n  var dayOfMonth = null;\n  var month = null;\n  var year = null;\n\n  for (var i=0; i<tokens.length; i++) {\n    var token = tokens[i].trim();\n    if (!token.length) {\n      continue;\n    }\n\n    var result;\n\n    /* 2.1. If the found-time flag is not set and the token matches the time\n     * production, set the found-time flag and set the hour- value,\n     * minute-value, and second-value to the numbers denoted by the digits in\n     * the date-token, respectively.  Skip the remaining sub-steps and continue\n     * to the next date-token.\n     */\n    if (second === null) {\n      result = parseTime(token);\n      if (result) {\n        hour = result[0];\n        minute = result[1];\n        second = result[2];\n        continue;\n      }\n    }\n\n    /* 2.2. If the found-day-of-month flag is not set and the date-token matches\n     * the day-of-month production, set the found-day-of- month flag and set\n     * the day-of-month-value to the number denoted by the date-token.  Skip\n     * the remaining sub-steps and continue to the next date-token.\n     */\n    if (dayOfMonth === null) {\n      // \"day-of-month = 1*2DIGIT ( non-digit *OCTET )\"\n      result = parseDigits(token, 1, 2, true);\n      if (result !== null) {\n        dayOfMonth = result;\n        continue;\n      }\n    }\n\n    /* 2.3. If the found-month flag is not set and the date-token matches the\n     * month production, set the found-month flag and set the month-value to\n     * the month denoted by the date-token.  Skip the remaining sub-steps and\n     * continue to the next date-token.\n     */\n    if (month === null) {\n      result = parseMonth(token);\n      if (result !== null) {\n        month = result;\n        continue;\n      }\n    }\n\n    /* 2.4. If the found-year flag is not set and the date-token matches the\n     * year production, set the found-year flag and set the year-value to the\n     * number denoted by the date-token.  Skip the remaining sub-steps and\n     * continue to the next date-token.\n     */\n    if (year === null) {\n      // \"year = 2*4DIGIT ( non-digit *OCTET )\"\n      result = parseDigits(token, 2, 4, true);\n      if (result !== null) {\n        year = result;\n        /* From S5.1.1:\n         * 3.  If the year-value is greater than or equal to 70 and less\n         * than or equal to 99, increment the year-value by 1900.\n         * 4.  If the year-value is greater than or equal to 0 and less\n         * than or equal to 69, increment the year-value by 2000.\n         */\n        if (year >= 70 && year <= 99) {\n          year += 1900;\n        } else if (year >= 0 && year <= 69) {\n          year += 2000;\n        }\n      }\n    }\n  }\n\n  /* RFC 6265 S5.1.1\n   * \"5. Abort these steps and fail to parse the cookie-date if:\n   *     *  at least one of the found-day-of-month, found-month, found-\n   *        year, or found-time flags is not set,\n   *     *  the day-of-month-value is less than 1 or greater than 31,\n   *     *  the year-value is less than 1601,\n   *     *  the hour-value is greater than 23,\n   *     *  the minute-value is greater than 59, or\n   *     *  the second-value is greater than 59.\n   *     (Note that leap seconds cannot be represented in this syntax.)\"\n   *\n   * So, in order as above:\n   */\n  if (\n    dayOfMonth === null || month === null || year === null || second === null ||\n    dayOfMonth < 1 || dayOfMonth > 31 ||\n    year < 1601 ||\n    hour > 23 ||\n    minute > 59 ||\n    second > 59\n  ) {\n    return;\n  }\n\n  return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second));\n}\n\nfunction formatDate(date) {\n  var d = date.getUTCDate(); d = d >= 10 ? d : '0'+d;\n  var h = date.getUTCHours(); h = h >= 10 ? h : '0'+h;\n  var m = date.getUTCMinutes(); m = m >= 10 ? m : '0'+m;\n  var s = date.getUTCSeconds(); s = s >= 10 ? s : '0'+s;\n  return NUM_TO_DAY[date.getUTCDay()] + ', ' +\n    d+' '+ NUM_TO_MONTH[date.getUTCMonth()] +' '+ date.getUTCFullYear() +' '+\n    h+':'+m+':'+s+' GMT';\n}\n\n// S5.1.2 Canonicalized Host Names\nfunction canonicalDomain(str) {\n  if (str == null) {\n    return null;\n  }\n  str = str.trim().replace(/^\\./,''); // S4.1.2.3 & S5.2.3: ignore leading .\n\n  // convert to IDN if any non-ASCII characters\n  if (punycode && /[^\\u0001-\\u007f]/.test(str)) {\n    str = punycode.toASCII(str);\n  }\n\n  return str.toLowerCase();\n}\n\n// S5.1.3 Domain Matching\nfunction domainMatch(str, domStr, canonicalize) {\n  if (str == null || domStr == null) {\n    return null;\n  }\n  if (canonicalize !== false) {\n    str = canonicalDomain(str);\n    domStr = canonicalDomain(domStr);\n  }\n\n  /*\n   * \"The domain string and the string are identical. (Note that both the\n   * domain string and the string will have been canonicalized to lower case at\n   * this point)\"\n   */\n  if (str == domStr) {\n    return true;\n  }\n\n  /* \"All of the following [three] conditions hold:\" (order adjusted from the RFC) */\n\n  /* \"* The string is a host name (i.e., not an IP address).\" */\n  if (net.isIP(str)) {\n    return false;\n  }\n\n  /* \"* The domain string is a suffix of the string\" */\n  var idx = str.indexOf(domStr);\n  if (idx <= 0) {\n    return false; // it's a non-match (-1) or prefix (0)\n  }\n\n  // e.g \"a.b.c\".indexOf(\"b.c\") === 2\n  // 5 === 3+2\n  if (str.length !== domStr.length + idx) { // it's not a suffix\n    return false;\n  }\n\n  /* \"* The last character of the string that is not included in the domain\n  * string is a %x2E (\".\") character.\" */\n  if (str.substr(idx-1,1) !== '.') {\n    return false;\n  }\n\n  return true;\n}\n\n\n// RFC6265 S5.1.4 Paths and Path-Match\n\n/*\n * \"The user agent MUST use an algorithm equivalent to the following algorithm\n * to compute the default-path of a cookie:\"\n *\n * Assumption: the path (and not query part or absolute uri) is passed in.\n */\nfunction defaultPath(path) {\n  // \"2. If the uri-path is empty or if the first character of the uri-path is not\n  // a %x2F (\"/\") character, output %x2F (\"/\") and skip the remaining steps.\n  if (!path || path.substr(0,1) !== \"/\") {\n    return \"/\";\n  }\n\n  // \"3. If the uri-path contains no more than one %x2F (\"/\") character, output\n  // %x2F (\"/\") and skip the remaining step.\"\n  if (path === \"/\") {\n    return path;\n  }\n\n  var rightSlash = path.lastIndexOf(\"/\");\n  if (rightSlash === 0) {\n    return \"/\";\n  }\n\n  // \"4. Output the characters of the uri-path from the first character up to,\n  // but not including, the right-most %x2F (\"/\").\"\n  return path.slice(0, rightSlash);\n}\n\nfunction trimTerminator(str) {\n  for (var t = 0; t < TERMINATORS.length; t++) {\n    var terminatorIdx = str.indexOf(TERMINATORS[t]);\n    if (terminatorIdx !== -1) {\n      str = str.substr(0,terminatorIdx);\n    }\n  }\n\n  return str;\n}\n\nfunction parseCookiePair(cookiePair, looseMode) {\n  cookiePair = trimTerminator(cookiePair);\n\n  var firstEq = cookiePair.indexOf('=');\n  if (looseMode) {\n    if (firstEq === 0) { // '=' is immediately at start\n      cookiePair = cookiePair.substr(1);\n      firstEq = cookiePair.indexOf('='); // might still need to split on '='\n    }\n  } else { // non-loose mode\n    if (firstEq <= 0) { // no '=' or is at start\n      return; // needs to have non-empty \"cookie-name\"\n    }\n  }\n\n  var cookieName, cookieValue;\n  if (firstEq <= 0) {\n    cookieName = \"\";\n    cookieValue = cookiePair.trim();\n  } else {\n    cookieName = cookiePair.substr(0, firstEq).trim();\n    cookieValue = cookiePair.substr(firstEq+1).trim();\n  }\n\n  if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) {\n    return;\n  }\n\n  var c = new Cookie();\n  c.key = cookieName;\n  c.value = cookieValue;\n  return c;\n}\n\nfunction parse(str, options) {\n  if (!options || typeof options !== 'object') {\n    options = {};\n  }\n  str = str.trim();\n\n  // We use a regex to parse the \"name-value-pair\" part of S5.2\n  var firstSemi = str.indexOf(';'); // S5.2 step 1\n  var cookiePair = (firstSemi === -1) ? str : str.substr(0, firstSemi);\n  var c = parseCookiePair(cookiePair, !!options.loose);\n  if (!c) {\n    return;\n  }\n\n  if (firstSemi === -1) {\n    return c;\n  }\n\n  // S5.2.3 \"unparsed-attributes consist of the remainder of the set-cookie-string\n  // (including the %x3B (\";\") in question).\" plus later on in the same section\n  // \"discard the first \";\" and trim\".\n  var unparsed = str.slice(firstSemi + 1).trim();\n\n  // \"If the unparsed-attributes string is empty, skip the rest of these\n  // steps.\"\n  if (unparsed.length === 0) {\n    return c;\n  }\n\n  /*\n   * S5.2 says that when looping over the items \"[p]rocess the attribute-name\n   * and attribute-value according to the requirements in the following\n   * subsections\" for every item.  Plus, for many of the individual attributes\n   * in S5.3 it says to use the \"attribute-value of the last attribute in the\n   * cookie-attribute-list\".  Therefore, in this implementation, we overwrite\n   * the previous value.\n   */\n  var cookie_avs = unparsed.split(';');\n  while (cookie_avs.length) {\n    var av = cookie_avs.shift().trim();\n    if (av.length === 0) { // happens if \";;\" appears\n      continue;\n    }\n    var av_sep = av.indexOf('=');\n    var av_key, av_value;\n\n    if (av_sep === -1) {\n      av_key = av;\n      av_value = null;\n    } else {\n      av_key = av.substr(0,av_sep);\n      av_value = av.substr(av_sep+1);\n    }\n\n    av_key = av_key.trim().toLowerCase();\n\n    if (av_value) {\n      av_value = av_value.trim();\n    }\n\n    switch(av_key) {\n    case 'expires': // S5.2.1\n      if (av_value) {\n        var exp = parseDate(av_value);\n        // \"If the attribute-value failed to parse as a cookie date, ignore the\n        // cookie-av.\"\n        if (exp) {\n          // over and underflow not realistically a concern: V8's getTime() seems to\n          // store something larger than a 32-bit time_t (even with 32-bit node)\n          c.expires = exp;\n        }\n      }\n      break;\n\n    case 'max-age': // S5.2.2\n      if (av_value) {\n        // \"If the first character of the attribute-value is not a DIGIT or a \"-\"\n        // character ...[or]... If the remainder of attribute-value contains a\n        // non-DIGIT character, ignore the cookie-av.\"\n        if (/^-?[0-9]+$/.test(av_value)) {\n          var delta = parseInt(av_value, 10);\n          // \"If delta-seconds is less than or equal to zero (0), let expiry-time\n          // be the earliest representable date and time.\"\n          c.setMaxAge(delta);\n        }\n      }\n      break;\n\n    case 'domain': // S5.2.3\n      // \"If the attribute-value is empty, the behavior is undefined.  However,\n      // the user agent SHOULD ignore the cookie-av entirely.\"\n      if (av_value) {\n        // S5.2.3 \"Let cookie-domain be the attribute-value without the leading %x2E\n        // (\".\") character.\"\n        var domain = av_value.trim().replace(/^\\./, '');\n        if (domain) {\n          // \"Convert the cookie-domain to lower case.\"\n          c.domain = domain.toLowerCase();\n        }\n      }\n      break;\n\n    case 'path': // S5.2.4\n      /*\n       * \"If the attribute-value is empty or if the first character of the\n       * attribute-value is not %x2F (\"/\"):\n       *   Let cookie-path be the default-path.\n       * Otherwise:\n       *   Let cookie-path be the attribute-value.\"\n       *\n       * We'll represent the default-path as null since it depends on the\n       * context of the parsing.\n       */\n      c.path = av_value && av_value[0] === \"/\" ? av_value : null;\n      break;\n\n    case 'secure': // S5.2.5\n      /*\n       * \"If the attribute-name case-insensitively matches the string \"Secure\",\n       * the user agent MUST append an attribute to the cookie-attribute-list\n       * with an attribute-name of Secure and an empty attribute-value.\"\n       */\n      c.secure = true;\n      break;\n\n    case 'httponly': // S5.2.6 -- effectively the same as 'secure'\n      c.httpOnly = true;\n      break;\n\n    default:\n      c.extensions = c.extensions || [];\n      c.extensions.push(av);\n      break;\n    }\n  }\n\n  return c;\n}\n\n// avoid the V8 deoptimization monster!\nfunction jsonParse(str) {\n  var obj;\n  try {\n    obj = JSON.parse(str);\n  } catch (e) {\n    return e;\n  }\n  return obj;\n}\n\nfunction fromJSON(str) {\n  if (!str) {\n    return null;\n  }\n\n  var obj;\n  if (typeof str === 'string') {\n    obj = jsonParse(str);\n    if (obj instanceof Error) {\n      return null;\n    }\n  } else {\n    // assume it's an Object\n    obj = str;\n  }\n\n  var c = new Cookie();\n  for (var i=0; i<Cookie.serializableProperties.length; i++) {\n    var prop = Cookie.serializableProperties[i];\n    if (obj[prop] === undefined ||\n        obj[prop] === Cookie.prototype[prop])\n    {\n      continue; // leave as prototype default\n    }\n\n    if (prop === 'expires' ||\n        prop === 'creation' ||\n        prop === 'lastAccessed')\n    {\n      if (obj[prop] === null) {\n        c[prop] = null;\n      } else {\n        c[prop] = obj[prop] == \"Infinity\" ?\n          \"Infinity\" : new Date(obj[prop]);\n      }\n    } else {\n      c[prop] = obj[prop];\n    }\n  }\n\n  return c;\n}\n\n/* Section 5.4 part 2:\n * \"*  Cookies with longer paths are listed before cookies with\n *     shorter paths.\n *\n *  *  Among cookies that have equal-length path fields, cookies with\n *     earlier creation-times are listed before cookies with later\n *     creation-times.\"\n */\n\nfunction cookieCompare(a,b) {\n  var cmp = 0;\n\n  // descending for length: b CMP a\n  var aPathLen = a.path ? a.path.length : 0;\n  var bPathLen = b.path ? b.path.length : 0;\n  cmp = bPathLen - aPathLen;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  // ascending for time: a CMP b\n  var aTime = a.creation ? a.creation.getTime() : MAX_TIME;\n  var bTime = b.creation ? b.creation.getTime() : MAX_TIME;\n  cmp = aTime - bTime;\n  if (cmp !== 0) {\n    return cmp;\n  }\n\n  // break ties for the same millisecond (precision of JavaScript's clock)\n  cmp = a.creationIndex - b.creationIndex;\n\n  return cmp;\n}\n\n// Gives the permutation of all possible pathMatch()es of a given path. The\n// array is in longest-to-shortest order.  Handy for indexing.\nfunction permutePath(path) {\n  if (path === '/') {\n    return ['/'];\n  }\n  if (path.lastIndexOf('/') === path.length-1) {\n    path = path.substr(0,path.length-1);\n  }\n  var permutations = [path];\n  while (path.length > 1) {\n    var lindex = path.lastIndexOf('/');\n    if (lindex === 0) {\n      break;\n    }\n    path = path.substr(0,lindex);\n    permutations.push(path);\n  }\n  permutations.push('/');\n  return permutations;\n}\n\nfunction getCookieContext(url) {\n  if (url instanceof Object) {\n    return url;\n  }\n  // NOTE: decodeURI will throw on malformed URIs (see GH-32).\n  // Therefore, we will just skip decoding for such URIs.\n  try {\n    url = decodeURI(url);\n  }\n  catch(err) {\n    // Silently swallow error\n  }\n\n  return urlParse(url);\n}\n\nfunction Cookie(options) {\n  options = options || {};\n\n  Object.keys(options).forEach(function(prop) {\n    if (Cookie.prototype.hasOwnProperty(prop) &&\n        Cookie.prototype[prop] !== options[prop] &&\n        prop.substr(0,1) !== '_')\n    {\n      this[prop] = options[prop];\n    }\n  }, this);\n\n  this.creation = this.creation || new Date();\n\n  // used to break creation ties in cookieCompare():\n  Object.defineProperty(this, 'creationIndex', {\n    configurable: false,\n    enumerable: false, // important for assert.deepEqual checks\n    writable: true,\n    value: ++Cookie.cookiesCreated\n  });\n}\n\nCookie.cookiesCreated = 0; // incremented each time a cookie is created\n\nCookie.parse = parse;\nCookie.fromJSON = fromJSON;\n\nCookie.prototype.key = \"\";\nCookie.prototype.value = \"\";\n\n// the order in which the RFC has them:\nCookie.prototype.expires = \"Infinity\"; // coerces to literal Infinity\nCookie.prototype.maxAge = null; // takes precedence over expires for TTL\nCookie.prototype.domain = null;\nCookie.prototype.path = null;\nCookie.prototype.secure = false;\nCookie.prototype.httpOnly = false;\nCookie.prototype.extensions = null;\n\n// set by the CookieJar:\nCookie.prototype.hostOnly = null; // boolean when set\nCookie.prototype.pathIsDefault = null; // boolean when set\nCookie.prototype.creation = null; // Date when set; defaulted by Cookie.parse\nCookie.prototype.lastAccessed = null; // Date when set\nObject.defineProperty(Cookie.prototype, 'creationIndex', {\n  configurable: true,\n  enumerable: false,\n  writable: true,\n  value: 0\n});\n\nCookie.serializableProperties = Object.keys(Cookie.prototype)\n  .filter(function(prop) {\n    return !(\n      Cookie.prototype[prop] instanceof Function ||\n      prop === 'creationIndex' ||\n      prop.substr(0,1) === '_'\n    );\n  });\n\nCookie.prototype.inspect = function inspect() {\n  var now = Date.now();\n  return 'Cookie=\"'+this.toString() +\n    '; hostOnly='+(this.hostOnly != null ? this.hostOnly : '?') +\n    '; aAge='+(this.lastAccessed ? (now-this.lastAccessed.getTime())+'ms' : '?') +\n    '; cAge='+(this.creation ? (now-this.creation.getTime())+'ms' : '?') +\n    '\"';\n};\n\nCookie.prototype.toJSON = function() {\n  var obj = {};\n\n  var props = Cookie.serializableProperties;\n  for (var i=0; i<props.length; i++) {\n    var prop = props[i];\n    if (this[prop] === Cookie.prototype[prop]) {\n      continue; // leave as prototype default\n    }\n\n    if (prop === 'expires' ||\n        prop === 'creation' ||\n        prop === 'lastAccessed')\n    {\n      if (this[prop] === null) {\n        obj[prop] = null;\n      } else {\n        obj[prop] = this[prop] == \"Infinity\" ? // intentionally not ===\n          \"Infinity\" : this[prop].toISOString();\n      }\n    } else if (prop === 'maxAge') {\n      if (this[prop] !== null) {\n        // again, intentionally not ===\n        obj[prop] = (this[prop] == Infinity || this[prop] == -Infinity) ?\n          this[prop].toString() : this[prop];\n      }\n    } else {\n      if (this[prop] !== Cookie.prototype[prop]) {\n        obj[prop] = this[prop];\n      }\n    }\n  }\n\n  return obj;\n};\n\nCookie.prototype.clone = function() {\n  return fromJSON(this.toJSON());\n};\n\nCookie.prototype.validate = function validate() {\n  if (!COOKIE_OCTETS.test(this.value)) {\n    return false;\n  }\n  if (this.expires != Infinity && !(this.expires instanceof Date) && !parseDate(this.expires)) {\n    return false;\n  }\n  if (this.maxAge != null && this.maxAge <= 0) {\n    return false; // \"Max-Age=\" non-zero-digit *DIGIT\n  }\n  if (this.path != null && !PATH_VALUE.test(this.path)) {\n    return false;\n  }\n\n  var cdomain = this.cdomain();\n  if (cdomain) {\n    if (cdomain.match(/\\.$/)) {\n      return false; // S4.1.2.3 suggests that this is bad. domainMatch() tests confirm this\n    }\n    var suffix = pubsuffix.getPublicSuffix(cdomain);\n    if (suffix == null) { // it's a public suffix\n      return false;\n    }\n  }\n  return true;\n};\n\nCookie.prototype.setExpires = function setExpires(exp) {\n  if (exp instanceof Date) {\n    this.expires = exp;\n  } else {\n    this.expires = parseDate(exp) || \"Infinity\";\n  }\n};\n\nCookie.prototype.setMaxAge = function setMaxAge(age) {\n  if (age === Infinity || age === -Infinity) {\n    this.maxAge = age.toString(); // so JSON.stringify() works\n  } else {\n    this.maxAge = age;\n  }\n};\n\n// gives Cookie header format\nCookie.prototype.cookieString = function cookieString() {\n  var val = this.value;\n  if (val == null) {\n    val = '';\n  }\n  if (this.key === '') {\n    return val;\n  }\n  return this.key+'='+val;\n};\n\n// gives Set-Cookie header format\nCookie.prototype.toString = function toString() {\n  var str = this.cookieString();\n\n  if (this.expires != Infinity) {\n    if (this.expires instanceof Date) {\n      str += '; Expires='+formatDate(this.expires);\n    } else {\n      str += '; Expires='+this.expires;\n    }\n  }\n\n  if (this.maxAge != null && this.maxAge != Infinity) {\n    str += '; Max-Age='+this.maxAge;\n  }\n\n  if (this.domain && !this.hostOnly) {\n    str += '; Domain='+this.domain;\n  }\n  if (this.path) {\n    str += '; Path='+this.path;\n  }\n\n  if (this.secure) {\n    str += '; Secure';\n  }\n  if (this.httpOnly) {\n    str += '; HttpOnly';\n  }\n  if (this.extensions) {\n    this.extensions.forEach(function(ext) {\n      str += '; '+ext;\n    });\n  }\n\n  return str;\n};\n\n// TTL() partially replaces the \"expiry-time\" parts of S5.3 step 3 (setCookie()\n// elsewhere)\n// S5.3 says to give the \"latest representable date\" for which we use Infinity\n// For \"expired\" we use 0\nCookie.prototype.TTL = function TTL(now) {\n  /* RFC6265 S4.1.2.2 If a cookie has both the Max-Age and the Expires\n   * attribute, the Max-Age attribute has precedence and controls the\n   * expiration date of the cookie.\n   * (Concurs with S5.3 step 3)\n   */\n  if (this.maxAge != null) {\n    return this.maxAge<=0 ? 0 : this.maxAge*1000;\n  }\n\n  var expires = this.expires;\n  if (expires != Infinity) {\n    if (!(expires instanceof Date)) {\n      expires = parseDate(expires) || Infinity;\n    }\n\n    if (expires == Infinity) {\n      return Infinity;\n    }\n\n    return expires.getTime() - (now || Date.now());\n  }\n\n  return Infinity;\n};\n\n// expiryTime() replaces the \"expiry-time\" parts of S5.3 step 3 (setCookie()\n// elsewhere)\nCookie.prototype.expiryTime = function expiryTime(now) {\n  if (this.maxAge != null) {\n    var relativeTo = now || this.creation || new Date();\n    var age = (this.maxAge <= 0) ? -Infinity : this.maxAge*1000;\n    return relativeTo.getTime() + age;\n  }\n\n  if (this.expires == Infinity) {\n    return Infinity;\n  }\n  return this.expires.getTime();\n};\n\n// expiryDate() replaces the \"expiry-time\" parts of S5.3 step 3 (setCookie()\n// elsewhere), except it returns a Date\nCookie.prototype.expiryDate = function expiryDate(now) {\n  var millisec = this.expiryTime(now);\n  if (millisec == Infinity) {\n    return new Date(MAX_TIME);\n  } else if (millisec == -Infinity) {\n    return new Date(MIN_TIME);\n  } else {\n    return new Date(millisec);\n  }\n};\n\n// This replaces the \"persistent-flag\" parts of S5.3 step 3\nCookie.prototype.isPersistent = function isPersistent() {\n  return (this.maxAge != null || this.expires != Infinity);\n};\n\n// Mostly S5.1.2 and S5.2.3:\nCookie.prototype.cdomain =\nCookie.prototype.canonicalizedDomain = function canonicalizedDomain() {\n  if (this.domain == null) {\n    return null;\n  }\n  return canonicalDomain(this.domain);\n};\n\nfunction CookieJar(store, options) {\n  if (typeof options === \"boolean\") {\n    options = {rejectPublicSuffixes: options};\n  } else if (options == null) {\n    options = {};\n  }\n  if (options.rejectPublicSuffixes != null) {\n    this.rejectPublicSuffixes = options.rejectPublicSuffixes;\n  }\n  if (options.looseMode != null) {\n    this.enableLooseMode = options.looseMode;\n  }\n\n  if (!store) {\n    store = new MemoryCookieStore();\n  }\n  this.store = store;\n}\nCookieJar.prototype.store = null;\nCookieJar.prototype.rejectPublicSuffixes = true;\nCookieJar.prototype.enableLooseMode = false;\nvar CAN_BE_SYNC = [];\n\nCAN_BE_SYNC.push('setCookie');\nCookieJar.prototype.setCookie = function(cookie, url, options, cb) {\n  var err;\n  var context = getCookieContext(url);\n  if (options instanceof Function) {\n    cb = options;\n    options = {};\n  }\n\n  var host = canonicalDomain(context.hostname);\n  var loose = this.enableLooseMode;\n  if (options.loose != null) {\n    loose = options.loose;\n  }\n\n  // S5.3 step 1\n  if (!(cookie instanceof Cookie)) {\n    cookie = Cookie.parse(cookie, { loose: loose });\n  }\n  if (!cookie) {\n    err = new Error(\"Cookie failed to parse\");\n    return cb(options.ignoreError ? null : err);\n  }\n\n  // S5.3 step 2\n  var now = options.now || new Date(); // will assign later to save effort in the face of errors\n\n  // S5.3 step 3: NOOP; persistent-flag and expiry-time is handled by getCookie()\n\n  // S5.3 step 4: NOOP; domain is null by default\n\n  // S5.3 step 5: public suffixes\n  if (this.rejectPublicSuffixes && cookie.domain) {\n    var suffix = pubsuffix.getPublicSuffix(cookie.cdomain());\n    if (suffix == null) { // e.g. \"com\"\n      err = new Error(\"Cookie has domain set to a public suffix\");\n      return cb(options.ignoreError ? null : err);\n    }\n  }\n\n  // S5.3 step 6:\n  if (cookie.domain) {\n    if (!domainMatch(host, cookie.cdomain(), false)) {\n      err = new Error(\"Cookie not in this host's domain. Cookie:\"+cookie.cdomain()+\" Request:\"+host);\n      return cb(options.ignoreError ? null : err);\n    }\n\n    if (cookie.hostOnly == null) { // don't reset if already set\n      cookie.hostOnly = false;\n    }\n\n  } else {\n    cookie.hostOnly = true;\n    cookie.domain = host;\n  }\n\n  //S5.2.4 If the attribute-value is empty or if the first character of the\n  //attribute-value is not %x2F (\"/\"):\n  //Let cookie-path be the default-path.\n  if (!cookie.path || cookie.path[0] !== '/') {\n    cookie.path = defaultPath(context.pathname);\n    cookie.pathIsDefault = true;\n  }\n\n  // S5.3 step 8: NOOP; secure attribute\n  // S5.3 step 9: NOOP; httpOnly attribute\n\n  // S5.3 step 10\n  if (options.http === false && cookie.httpOnly) {\n    err = new Error(\"Cookie is HttpOnly and this isn't an HTTP API\");\n    return cb(options.ignoreError ? null : err);\n  }\n\n  var store = this.store;\n\n  if (!store.updateCookie) {\n    store.updateCookie = function(oldCookie, newCookie, cb) {\n      this.putCookie(newCookie, cb);\n    };\n  }\n\n  function withCookie(err, oldCookie) {\n    if (err) {\n      return cb(err);\n    }\n\n    var next = function(err) {\n      if (err) {\n        return cb(err);\n      } else {\n        cb(null, cookie);\n      }\n    };\n\n    if (oldCookie) {\n      // S5.3 step 11 - \"If the cookie store contains a cookie with the same name,\n      // domain, and path as the newly created cookie:\"\n      if (options.http === false && oldCookie.httpOnly) { // step 11.2\n        err = new Error(\"old Cookie is HttpOnly and this isn't an HTTP API\");\n        return cb(options.ignoreError ? null : err);\n      }\n      cookie.creation = oldCookie.creation; // step 11.3\n      cookie.creationIndex = oldCookie.creationIndex; // preserve tie-breaker\n      cookie.lastAccessed = now;\n      // Step 11.4 (delete cookie) is implied by just setting the new one:\n      store.updateCookie(oldCookie, cookie, next); // step 12\n\n    } else {\n      cookie.creation = cookie.lastAccessed = now;\n      store.putCookie(cookie, next); // step 12\n    }\n  }\n\n  store.findCookie(cookie.domain, cookie.path, cookie.key, withCookie);\n};\n\n// RFC6365 S5.4\nCAN_BE_SYNC.push('getCookies');\nCookieJar.prototype.getCookies = function(url, options, cb) {\n  var context = getCookieContext(url);\n  if (options instanceof Function) {\n    cb = options;\n    options = {};\n  }\n\n  var host = canonicalDomain(context.hostname);\n  var path = context.pathname || '/';\n\n  var secure = options.secure;\n  if (secure == null && context.protocol &&\n      (context.protocol == 'https:' || context.protocol == 'wss:'))\n  {\n    secure = true;\n  }\n\n  var http = options.http;\n  if (http == null) {\n    http = true;\n  }\n\n  var now = options.now || Date.now();\n  var expireCheck = options.expire !== false;\n  var allPaths = !!options.allPaths;\n  var store = this.store;\n\n  function matchingCookie(c) {\n    // \"Either:\n    //   The cookie's host-only-flag is true and the canonicalized\n    //   request-host is identical to the cookie's domain.\n    // Or:\n    //   The cookie's host-only-flag is false and the canonicalized\n    //   request-host domain-matches the cookie's domain.\"\n    if (c.hostOnly) {\n      if (c.domain != host) {\n        return false;\n      }\n    } else {\n      if (!domainMatch(host, c.domain, false)) {\n        return false;\n      }\n    }\n\n    // \"The request-uri's path path-matches the cookie's path.\"\n    if (!allPaths && !pathMatch(path, c.path)) {\n      return false;\n    }\n\n    // \"If the cookie's secure-only-flag is true, then the request-uri's\n    // scheme must denote a \"secure\" protocol\"\n    if (c.secure && !secure) {\n      return false;\n    }\n\n    // \"If the cookie's http-only-flag is true, then exclude the cookie if the\n    // cookie-string is being generated for a \"non-HTTP\" API\"\n    if (c.httpOnly && !http) {\n      return false;\n    }\n\n    // deferred from S5.3\n    // non-RFC: allow retention of expired cookies by choice\n    if (expireCheck && c.expiryTime() <= now) {\n      store.removeCookie(c.domain, c.path, c.key, function(){}); // result ignored\n      return false;\n    }\n\n    return true;\n  }\n\n  store.findCookies(host, allPaths ? null : path, function(err,cookies) {\n    if (err) {\n      return cb(err);\n    }\n\n    cookies = cookies.filter(matchingCookie);\n\n    // sorting of S5.4 part 2\n    if (options.sort !== false) {\n      cookies = cookies.sort(cookieCompare);\n    }\n\n    // S5.4 part 3\n    var now = new Date();\n    cookies.forEach(function(c) {\n      c.lastAccessed = now;\n    });\n    // TODO persist lastAccessed\n\n    cb(null,cookies);\n  });\n};\n\nCAN_BE_SYNC.push('getCookieString');\nCookieJar.prototype.getCookieString = function(/*..., cb*/) {\n  var args = Array.prototype.slice.call(arguments,0);\n  var cb = args.pop();\n  var next = function(err,cookies) {\n    if (err) {\n      cb(err);\n    } else {\n      cb(null, cookies\n        .sort(cookieCompare)\n        .map(function(c){\n          return c.cookieString();\n        })\n        .join('; '));\n    }\n  };\n  args.push(next);\n  this.getCookies.apply(this,args);\n};\n\nCAN_BE_SYNC.push('getSetCookieStrings');\nCookieJar.prototype.getSetCookieStrings = function(/*..., cb*/) {\n  var args = Array.prototype.slice.call(arguments,0);\n  var cb = args.pop();\n  var next = function(err,cookies) {\n    if (err) {\n      cb(err);\n    } else {\n      cb(null, cookies.map(function(c){\n        return c.toString();\n      }));\n    }\n  };\n  args.push(next);\n  this.getCookies.apply(this,args);\n};\n\nCAN_BE_SYNC.push('serialize');\nCookieJar.prototype.serialize = function(cb) {\n  var type = this.store.constructor.name;\n  if (type === 'Object') {\n    type = null;\n  }\n\n  // update README.md \"Serialization Format\" if you change this, please!\n  var serialized = {\n    // The version of tough-cookie that serialized this jar. Generally a good\n    // practice since future versions can make data import decisions based on\n    // known past behavior. When/if this matters, use `semver`.\n    version: 'tough-cookie@'+VERSION,\n\n    // add the store type, to make humans happy:\n    storeType: type,\n\n    // CookieJar configuration:\n    rejectPublicSuffixes: !!this.rejectPublicSuffixes,\n\n    // this gets filled from getAllCookies:\n    cookies: []\n  };\n\n  if (!(this.store.getAllCookies &&\n        typeof this.store.getAllCookies === 'function'))\n  {\n    return cb(new Error('store does not support getAllCookies and cannot be serialized'));\n  }\n\n  this.store.getAllCookies(function(err,cookies) {\n    if (err) {\n      return cb(err);\n    }\n\n    serialized.cookies = cookies.map(function(cookie) {\n      // convert to serialized 'raw' cookies\n      cookie = (cookie instanceof Cookie) ? cookie.toJSON() : cookie;\n\n      // Remove the index so new ones get assigned during deserialization\n      delete cookie.creationIndex;\n\n      return cookie;\n    });\n\n    return cb(null, serialized);\n  });\n};\n\n// well-known name that JSON.stringify calls\nCookieJar.prototype.toJSON = function() {\n  return this.serializeSync();\n};\n\n// use the class method CookieJar.deserialize instead of calling this directly\nCAN_BE_SYNC.push('_importCookies');\nCookieJar.prototype._importCookies = function(serialized, cb) {\n  var jar = this;\n  var cookies = serialized.cookies;\n  if (!cookies || !Array.isArray(cookies)) {\n    return cb(new Error('serialized jar has no cookies array'));\n  }\n  cookies = cookies.slice(); // do not modify the original\n\n  function putNext(err) {\n    if (err) {\n      return cb(err);\n    }\n\n    if (!cookies.length) {\n      return cb(err, jar);\n    }\n\n    var cookie;\n    try {\n      cookie = fromJSON(cookies.shift());\n    } catch (e) {\n      return cb(e);\n    }\n\n    if (cookie === null) {\n      return putNext(null); // skip this cookie\n    }\n\n    jar.store.putCookie(cookie, putNext);\n  }\n\n  putNext();\n};\n\nCookieJar.deserialize = function(strOrObj, store, cb) {\n  if (arguments.length !== 3) {\n    // store is optional\n    cb = store;\n    store = null;\n  }\n\n  var serialized;\n  if (typeof strOrObj === 'string') {\n    serialized = jsonParse(strOrObj);\n    if (serialized instanceof Error) {\n      return cb(serialized);\n    }\n  } else {\n    serialized = strOrObj;\n  }\n\n  var jar = new CookieJar(store, serialized.rejectPublicSuffixes);\n  jar._importCookies(serialized, function(err) {\n    if (err) {\n      return cb(err);\n    }\n    cb(null, jar);\n  });\n};\n\nCookieJar.deserializeSync = function(strOrObj, store) {\n  var serialized = typeof strOrObj === 'string' ?\n    JSON.parse(strOrObj) : strOrObj;\n  var jar = new CookieJar(store, serialized.rejectPublicSuffixes);\n\n  // catch this mistake early:\n  if (!jar.store.synchronous) {\n    throw new Error('CookieJar store is not synchronous; use async API instead.');\n  }\n\n  jar._importCookiesSync(serialized);\n  return jar;\n};\nCookieJar.fromJSON = CookieJar.deserializeSync;\n\nCAN_BE_SYNC.push('clone');\nCookieJar.prototype.clone = function(newStore, cb) {\n  if (arguments.length === 1) {\n    cb = newStore;\n    newStore = null;\n  }\n\n  this.serialize(function(err,serialized) {\n    if (err) {\n      return cb(err);\n    }\n    CookieJar.deserialize(newStore, serialized, cb);\n  });\n};\n\n// Use a closure to provide a true imperative API for synchronous stores.\nfunction syncWrap(method) {\n  return function() {\n    if (!this.store.synchronous) {\n      throw new Error('CookieJar store is not synchronous; use async API instead.');\n    }\n\n    var args = Array.prototype.slice.call(arguments);\n    var syncErr, syncResult;\n    args.push(function syncCb(err, result) {\n      syncErr = err;\n      syncResult = result;\n    });\n    this[method].apply(this, args);\n\n    if (syncErr) {\n      throw syncErr;\n    }\n    return syncResult;\n  };\n}\n\n// wrap all declared CAN_BE_SYNC methods in the sync wrapper\nCAN_BE_SYNC.forEach(function(method) {\n  CookieJar.prototype[method+'Sync'] = syncWrap(method);\n});\n\nmodule.exports = {\n  CookieJar: CookieJar,\n  Cookie: Cookie,\n  Store: Store,\n  MemoryCookieStore: MemoryCookieStore,\n  parseDate: parseDate,\n  formatDate: formatDate,\n  parse: parse,\n  fromJSON: fromJSON,\n  domainMatch: domainMatch,\n  defaultPath: defaultPath,\n  pathMatch: pathMatch,\n  getPublicSuffix: pubsuffix.getPublicSuffix,\n  cookieCompare: cookieCompare,\n  permuteDomain: __webpack_require__(414).permuteDomain,\n  permutePath: permutePath,\n  canonicalDomain: canonicalDomain\n};\n\n\n/***/ }),\n/* 811 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n/*!\n * Copyright (c) 2015, Salesforce.com, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n * this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright notice,\n * this list of conditions and the following disclaimer in the documentation\n * and/or other materials provided with the distribution.\n *\n * 3. Neither the name of Salesforce.com nor the names of its contributors may\n * be used to endorse or promote products derived from this software without\n * specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar Store = __webpack_require__(416).Store;\nvar permuteDomain = __webpack_require__(414).permuteDomain;\nvar pathMatch = __webpack_require__(413).pathMatch;\nvar util = __webpack_require__(3);\n\nfunction MemoryCookieStore() {\n  Store.call(this);\n  this.idx = {};\n}\nutil.inherits(MemoryCookieStore, Store);\nexports.MemoryCookieStore = MemoryCookieStore;\nMemoryCookieStore.prototype.idx = null;\n\n// Since it's just a struct in RAM, this Store is synchronous\nMemoryCookieStore.prototype.synchronous = true;\n\n// force a default depth:\nMemoryCookieStore.prototype.inspect = function() {\n  return \"{ idx: \"+util.inspect(this.idx, false, 2)+' }';\n};\n\nMemoryCookieStore.prototype.findCookie = function(domain, path, key, cb) {\n  if (!this.idx[domain]) {\n    return cb(null,undefined);\n  }\n  if (!this.idx[domain][path]) {\n    return cb(null,undefined);\n  }\n  return cb(null,this.idx[domain][path][key]||null);\n};\n\nMemoryCookieStore.prototype.findCookies = function(domain, path, cb) {\n  var results = [];\n  if (!domain) {\n    return cb(null,[]);\n  }\n\n  var pathMatcher;\n  if (!path) {\n    // null means \"all paths\"\n    pathMatcher = function matchAll(domainIndex) {\n      for (var curPath in domainIndex) {\n        var pathIndex = domainIndex[curPath];\n        for (var key in pathIndex) {\n          results.push(pathIndex[key]);\n        }\n      }\n    };\n\n  } else {\n    pathMatcher = function matchRFC(domainIndex) {\n       //NOTE: we should use path-match algorithm from S5.1.4 here\n       //(see : https://github.com/ChromiumWebApps/chromium/blob/b3d3b4da8bb94c1b2e061600df106d590fda3620/net/cookies/canonical_cookie.cc#L299)\n       Object.keys(domainIndex).forEach(function (cookiePath) {\n         if (pathMatch(path, cookiePath)) {\n           var pathIndex = domainIndex[cookiePath];\n\n           for (var key in pathIndex) {\n             results.push(pathIndex[key]);\n           }\n         }\n       });\n     };\n  }\n\n  var domains = permuteDomain(domain) || [domain];\n  var idx = this.idx;\n  domains.forEach(function(curDomain) {\n    var domainIndex = idx[curDomain];\n    if (!domainIndex) {\n      return;\n    }\n    pathMatcher(domainIndex);\n  });\n\n  cb(null,results);\n};\n\nMemoryCookieStore.prototype.putCookie = function(cookie, cb) {\n  if (!this.idx[cookie.domain]) {\n    this.idx[cookie.domain] = {};\n  }\n  if (!this.idx[cookie.domain][cookie.path]) {\n    this.idx[cookie.domain][cookie.path] = {};\n  }\n  this.idx[cookie.domain][cookie.path][cookie.key] = cookie;\n  cb(null);\n};\n\nMemoryCookieStore.prototype.updateCookie = function(oldCookie, newCookie, cb) {\n  // updateCookie() may avoid updating cookies that are identical.  For example,\n  // lastAccessed may not be important to some stores and an equality\n  // comparison could exclude that field.\n  this.putCookie(newCookie,cb);\n};\n\nMemoryCookieStore.prototype.removeCookie = function(domain, path, key, cb) {\n  if (this.idx[domain] && this.idx[domain][path] && this.idx[domain][path][key]) {\n    delete this.idx[domain][path][key];\n  }\n  cb(null);\n};\n\nMemoryCookieStore.prototype.removeCookies = function(domain, path, cb) {\n  if (this.idx[domain]) {\n    if (path) {\n      delete this.idx[domain][path];\n    } else {\n      delete this.idx[domain];\n    }\n  }\n  return cb(null);\n};\n\nMemoryCookieStore.prototype.getAllCookies = function(cb) {\n  var cookies = [];\n  var idx = this.idx;\n\n  var domains = Object.keys(idx);\n  domains.forEach(function(domain) {\n    var paths = Object.keys(idx[domain]);\n    paths.forEach(function(path) {\n      var keys = Object.keys(idx[domain][path]);\n      keys.forEach(function(key) {\n        if (key !== null) {\n          cookies.push(idx[domain][path][key]);\n        }\n      });\n    });\n  });\n\n  // Sort by creationIndex so deserializing retains the creation order.\n  // When implementing your own store, this SHOULD retain the order too\n  cookies.sort(function(a,b) {\n    return (a.creationIndex||0) - (b.creationIndex||0);\n  });\n\n  cb(null, cookies);\n};\n\n\n/***/ }),\n/* 812 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"author\":{\"name\":\"Jeremy Stashewsky\",\"email\":\"jstashewsky@salesforce.com\",\"website\":\"https://github.com/stash\"},\"contributors\":[{\"name\":\"Alexander Savin\",\"website\":\"https://github.com/apsavin\"},{\"name\":\"Ian Livingstone\",\"website\":\"https://github.com/ianlivingstone\"},{\"name\":\"Ivan Nikulin\",\"website\":\"https://github.com/inikulin\"},{\"name\":\"Lalit Kapoor\",\"website\":\"https://github.com/lalitkapoor\"},{\"name\":\"Sam Thompson\",\"website\":\"https://github.com/sambthompson\"},{\"name\":\"Sebastian Mayr\",\"website\":\"https://github.com/Sebmaster\"}],\"license\":\"BSD-3-Clause\",\"name\":\"tough-cookie\",\"description\":\"RFC6265 Cookies and Cookie Jar for node.js\",\"keywords\":[\"HTTP\",\"cookie\",\"cookies\",\"set-cookie\",\"cookiejar\",\"jar\",\"RFC6265\",\"RFC2965\"],\"version\":\"2.3.4\",\"homepage\":\"https://github.com/salesforce/tough-cookie\",\"repository\":{\"type\":\"git\",\"url\":\"git://github.com/salesforce/tough-cookie.git\"},\"bugs\":{\"url\":\"https://github.com/salesforce/tough-cookie/issues\"},\"main\":\"./lib/cookie\",\"files\":[\"lib\"],\"scripts\":{\"suffixup\":\"curl -o public_suffix_list.dat https://publicsuffix.org/list/public_suffix_list.dat && ./generate-pubsuffix.js\",\"test\":\"vows test/*_test.js\"},\"engines\":{\"node\":\">=0.8\"},\"devDependencies\":{\"async\":\"^1.4.2\",\"string.prototype.repeat\":\"^0.2.0\",\"vows\":\"^0.8.1\"},\"dependencies\":{\"punycode\":\"^1.4.1\"}}\n\n/***/ }),\n/* 813 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar http = __webpack_require__(87)\nvar https = __webpack_require__(196)\nvar url = __webpack_require__(24)\nvar util = __webpack_require__(3)\nvar stream = __webpack_require__(23)\nvar zlib = __webpack_require__(199)\nvar aws2 = __webpack_require__(489)\nvar aws4 = __webpack_require__(490)\nvar httpSignature = __webpack_require__(680)\nvar mime = __webpack_require__(400)\nvar caseless = __webpack_require__(228)\nvar ForeverAgent = __webpack_require__(616)\nvar FormData = __webpack_require__(617)\nvar extend = __webpack_require__(266)\nvar isstream = __webpack_require__(399)\nvar isTypedArray = __webpack_require__(742).strict\nvar helpers = __webpack_require__(306)\nvar cookies = __webpack_require__(412)\nvar getProxyFromURI = __webpack_require__(802)\nvar Querystring = __webpack_require__(807).Querystring\nvar Har = __webpack_require__(803).Har\nvar Auth = __webpack_require__(801).Auth\nvar OAuth = __webpack_require__(806).OAuth\nvar hawk = __webpack_require__(804)\nvar Multipart = __webpack_require__(805).Multipart\nvar Redirect = __webpack_require__(808).Redirect\nvar Tunnel = __webpack_require__(809).Tunnel\nvar now = __webpack_require__(776)\nvar Buffer = __webpack_require__(46).Buffer\n\nvar safeStringify = helpers.safeStringify\nvar isReadStream = helpers.isReadStream\nvar toBase64 = helpers.toBase64\nvar defer = helpers.defer\nvar copy = helpers.copy\nvar version = helpers.version\nvar globalCookieJar = cookies.jar()\n\nvar globalPool = {}\n\nfunction filterForNonReserved (reserved, options) {\n  // Filter out properties that are not reserved.\n  // Reserved values are passed in at call site.\n\n  var object = {}\n  for (var i in options) {\n    var notReserved = (reserved.indexOf(i) === -1)\n    if (notReserved) {\n      object[i] = options[i]\n    }\n  }\n  return object\n}\n\nfunction filterOutReservedFunctions (reserved, options) {\n  // Filter out properties that are functions and are reserved.\n  // Reserved values are passed in at call site.\n\n  var object = {}\n  for (var i in options) {\n    var isReserved = !(reserved.indexOf(i) === -1)\n    var isFunction = (typeof options[i] === 'function')\n    if (!(isReserved && isFunction)) {\n      object[i] = options[i]\n    }\n  }\n  return object\n}\n\n// Return a simpler request object to allow serialization\nfunction requestToJSON () {\n  var self = this\n  return {\n    uri: self.uri,\n    method: self.method,\n    headers: self.headers\n  }\n}\n\n// Return a simpler response object to allow serialization\nfunction responseToJSON () {\n  var self = this\n  return {\n    statusCode: self.statusCode,\n    body: self.body,\n    headers: self.headers,\n    request: requestToJSON.call(self.request)\n  }\n}\n\nfunction Request (options) {\n  // if given the method property in options, set property explicitMethod to true\n\n  // extend the Request instance with any non-reserved properties\n  // remove any reserved functions from the options object\n  // set Request instance to be readable and writable\n  // call init\n\n  var self = this\n\n  // start with HAR, then override with additional options\n  if (options.har) {\n    self._har = new Har(self)\n    options = self._har.options(options)\n  }\n\n  stream.Stream.call(self)\n  var reserved = Object.keys(Request.prototype)\n  var nonReserved = filterForNonReserved(reserved, options)\n\n  extend(self, nonReserved)\n  options = filterOutReservedFunctions(reserved, options)\n\n  self.readable = true\n  self.writable = true\n  if (options.method) {\n    self.explicitMethod = true\n  }\n  self._qs = new Querystring(self)\n  self._auth = new Auth(self)\n  self._oauth = new OAuth(self)\n  self._multipart = new Multipart(self)\n  self._redirect = new Redirect(self)\n  self._tunnel = new Tunnel(self)\n  self.init(options)\n}\n\nutil.inherits(Request, stream.Stream)\n\n// Debugging\nRequest.debug = process.env.NODE_DEBUG && /\\brequest\\b/.test(process.env.NODE_DEBUG)\nfunction debug () {\n  if (Request.debug) {\n    console.error('REQUEST %s', util.format.apply(util, arguments))\n  }\n}\nRequest.prototype.debug = debug\n\nRequest.prototype.init = function (options) {\n  // init() contains all the code to setup the request object.\n  // the actual outgoing request is not started until start() is called\n  // this function is called from both the constructor and on redirect.\n  var self = this\n  if (!options) {\n    options = {}\n  }\n  self.headers = self.headers ? copy(self.headers) : {}\n\n  // Delete headers with value undefined since they break\n  // ClientRequest.OutgoingMessage.setHeader in node 0.12\n  for (var headerName in self.headers) {\n    if (typeof self.headers[headerName] === 'undefined') {\n      delete self.headers[headerName]\n    }\n  }\n\n  caseless.httpify(self, self.headers)\n\n  if (!self.method) {\n    self.method = options.method || 'GET'\n  }\n  if (!self.localAddress) {\n    self.localAddress = options.localAddress\n  }\n\n  self._qs.init(options)\n\n  debug(options)\n  if (!self.pool && self.pool !== false) {\n    self.pool = globalPool\n  }\n  self.dests = self.dests || []\n  self.__isRequestRequest = true\n\n  // Protect against double callback\n  if (!self._callback && self.callback) {\n    self._callback = self.callback\n    self.callback = function () {\n      if (self._callbackCalled) {\n        return // Print a warning maybe?\n      }\n      self._callbackCalled = true\n      self._callback.apply(self, arguments)\n    }\n    self.on('error', self.callback.bind())\n    self.on('complete', self.callback.bind(self, null))\n  }\n\n  // People use this property instead all the time, so support it\n  if (!self.uri && self.url) {\n    self.uri = self.url\n    delete self.url\n  }\n\n  // If there's a baseUrl, then use it as the base URL (i.e. uri must be\n  // specified as a relative path and is appended to baseUrl).\n  if (self.baseUrl) {\n    if (typeof self.baseUrl !== 'string') {\n      return self.emit('error', new Error('options.baseUrl must be a string'))\n    }\n\n    if (typeof self.uri !== 'string') {\n      return self.emit('error', new Error('options.uri must be a string when using options.baseUrl'))\n    }\n\n    if (self.uri.indexOf('//') === 0 || self.uri.indexOf('://') !== -1) {\n      return self.emit('error', new Error('options.uri must be a path when using options.baseUrl'))\n    }\n\n    // Handle all cases to make sure that there's only one slash between\n    // baseUrl and uri.\n    var baseUrlEndsWithSlash = self.baseUrl.lastIndexOf('/') === self.baseUrl.length - 1\n    var uriStartsWithSlash = self.uri.indexOf('/') === 0\n\n    if (baseUrlEndsWithSlash && uriStartsWithSlash) {\n      self.uri = self.baseUrl + self.uri.slice(1)\n    } else if (baseUrlEndsWithSlash || uriStartsWithSlash) {\n      self.uri = self.baseUrl + self.uri\n    } else if (self.uri === '') {\n      self.uri = self.baseUrl\n    } else {\n      self.uri = self.baseUrl + '/' + self.uri\n    }\n    delete self.baseUrl\n  }\n\n  // A URI is needed by this point, emit error if we haven't been able to get one\n  if (!self.uri) {\n    return self.emit('error', new Error('options.uri is a required argument'))\n  }\n\n  // If a string URI/URL was given, parse it into a URL object\n  if (typeof self.uri === 'string') {\n    self.uri = url.parse(self.uri)\n  }\n\n  // Some URL objects are not from a URL parsed string and need href added\n  if (!self.uri.href) {\n    self.uri.href = url.format(self.uri)\n  }\n\n  // DEPRECATED: Warning for users of the old Unix Sockets URL Scheme\n  if (self.uri.protocol === 'unix:') {\n    return self.emit('error', new Error('`unix://` URL scheme is no longer supported. Please use the format `http://unix:SOCKET:PATH`'))\n  }\n\n  // Support Unix Sockets\n  if (self.uri.host === 'unix') {\n    self.enableUnixSocket()\n  }\n\n  if (self.strictSSL === false) {\n    self.rejectUnauthorized = false\n  }\n\n  if (!self.uri.pathname) { self.uri.pathname = '/' }\n\n  if (!(self.uri.host || (self.uri.hostname && self.uri.port)) && !self.uri.isUnix) {\n    // Invalid URI: it may generate lot of bad errors, like 'TypeError: Cannot call method `indexOf` of undefined' in CookieJar\n    // Detect and reject it as soon as possible\n    var faultyUri = url.format(self.uri)\n    var message = 'Invalid URI \"' + faultyUri + '\"'\n    if (Object.keys(options).length === 0) {\n      // No option ? This can be the sign of a redirect\n      // As this is a case where the user cannot do anything (they didn't call request directly with this URL)\n      // they should be warned that it can be caused by a redirection (can save some hair)\n      message += '. This can be caused by a crappy redirection.'\n    }\n    // This error was fatal\n    self.abort()\n    return self.emit('error', new Error(message))\n  }\n\n  if (!self.hasOwnProperty('proxy')) {\n    self.proxy = getProxyFromURI(self.uri)\n  }\n\n  self.tunnel = self._tunnel.isEnabled()\n  if (self.proxy) {\n    self._tunnel.setup(options)\n  }\n\n  self._redirect.onRequest(options)\n\n  self.setHost = false\n  if (!self.hasHeader('host')) {\n    var hostHeaderName = self.originalHostHeaderName || 'host'\n    // When used with an IPv6 address, `host` will provide\n    // the correct bracketed format, unlike using `hostname` and\n    // optionally adding the `port` when necessary.\n    self.setHeader(hostHeaderName, self.uri.host)\n    self.setHost = true\n  }\n\n  self.jar(self._jar || options.jar)\n\n  if (!self.uri.port) {\n    if (self.uri.protocol === 'http:') { self.uri.port = 80 } else if (self.uri.protocol === 'https:') { self.uri.port = 443 }\n  }\n\n  if (self.proxy && !self.tunnel) {\n    self.port = self.proxy.port\n    self.host = self.proxy.hostname\n  } else {\n    self.port = self.uri.port\n    self.host = self.uri.hostname\n  }\n\n  if (options.form) {\n    self.form(options.form)\n  }\n\n  if (options.formData) {\n    var formData = options.formData\n    var requestForm = self.form()\n    var appendFormValue = function (key, value) {\n      if (value && value.hasOwnProperty('value') && value.hasOwnProperty('options')) {\n        requestForm.append(key, value.value, value.options)\n      } else {\n        requestForm.append(key, value)\n      }\n    }\n    for (var formKey in formData) {\n      if (formData.hasOwnProperty(formKey)) {\n        var formValue = formData[formKey]\n        if (formValue instanceof Array) {\n          for (var j = 0; j < formValue.length; j++) {\n            appendFormValue(formKey, formValue[j])\n          }\n        } else {\n          appendFormValue(formKey, formValue)\n        }\n      }\n    }\n  }\n\n  if (options.qs) {\n    self.qs(options.qs)\n  }\n\n  if (self.uri.path) {\n    self.path = self.uri.path\n  } else {\n    self.path = self.uri.pathname + (self.uri.search || '')\n  }\n\n  if (self.path.length === 0) {\n    self.path = '/'\n  }\n\n  // Auth must happen last in case signing is dependent on other headers\n  if (options.aws) {\n    self.aws(options.aws)\n  }\n\n  if (options.hawk) {\n    self.hawk(options.hawk)\n  }\n\n  if (options.httpSignature) {\n    self.httpSignature(options.httpSignature)\n  }\n\n  if (options.auth) {\n    if (Object.prototype.hasOwnProperty.call(options.auth, 'username')) {\n      options.auth.user = options.auth.username\n    }\n    if (Object.prototype.hasOwnProperty.call(options.auth, 'password')) {\n      options.auth.pass = options.auth.password\n    }\n\n    self.auth(\n      options.auth.user,\n      options.auth.pass,\n      options.auth.sendImmediately,\n      options.auth.bearer\n    )\n  }\n\n  if (self.gzip && !self.hasHeader('accept-encoding')) {\n    self.setHeader('accept-encoding', 'gzip, deflate')\n  }\n\n  if (self.uri.auth && !self.hasHeader('authorization')) {\n    var uriAuthPieces = self.uri.auth.split(':').map(function (item) { return self._qs.unescape(item) })\n    self.auth(uriAuthPieces[0], uriAuthPieces.slice(1).join(':'), true)\n  }\n\n  if (!self.tunnel && self.proxy && self.proxy.auth && !self.hasHeader('proxy-authorization')) {\n    var proxyAuthPieces = self.proxy.auth.split(':').map(function (item) { return self._qs.unescape(item) })\n    var authHeader = 'Basic ' + toBase64(proxyAuthPieces.join(':'))\n    self.setHeader('proxy-authorization', authHeader)\n  }\n\n  if (self.proxy && !self.tunnel) {\n    self.path = (self.uri.protocol + '//' + self.uri.host + self.path)\n  }\n\n  if (options.json) {\n    self.json(options.json)\n  }\n  if (options.multipart) {\n    self.multipart(options.multipart)\n  }\n\n  if (options.time) {\n    self.timing = true\n\n    // NOTE: elapsedTime is deprecated in favor of .timings\n    self.elapsedTime = self.elapsedTime || 0\n  }\n\n  function setContentLength () {\n    if (isTypedArray(self.body)) {\n      self.body = Buffer.from(self.body)\n    }\n\n    if (!self.hasHeader('content-length')) {\n      var length\n      if (typeof self.body === 'string') {\n        length = Buffer.byteLength(self.body)\n      } else if (Array.isArray(self.body)) {\n        length = self.body.reduce(function (a, b) { return a + b.length }, 0)\n      } else {\n        length = self.body.length\n      }\n\n      if (length) {\n        self.setHeader('content-length', length)\n      } else {\n        self.emit('error', new Error('Argument error, options.body.'))\n      }\n    }\n  }\n  if (self.body && !isstream(self.body)) {\n    setContentLength()\n  }\n\n  if (options.oauth) {\n    self.oauth(options.oauth)\n  } else if (self._oauth.params && self.hasHeader('authorization')) {\n    self.oauth(self._oauth.params)\n  }\n\n  var protocol = self.proxy && !self.tunnel ? self.proxy.protocol : self.uri.protocol\n  var defaultModules = {'http:': http, 'https:': https}\n  var httpModules = self.httpModules || {}\n\n  self.httpModule = httpModules[protocol] || defaultModules[protocol]\n\n  if (!self.httpModule) {\n    return self.emit('error', new Error('Invalid protocol: ' + protocol))\n  }\n\n  if (options.ca) {\n    self.ca = options.ca\n  }\n\n  if (!self.agent) {\n    if (options.agentOptions) {\n      self.agentOptions = options.agentOptions\n    }\n\n    if (options.agentClass) {\n      self.agentClass = options.agentClass\n    } else if (options.forever) {\n      var v = version()\n      // use ForeverAgent in node 0.10- only\n      if (v.major === 0 && v.minor <= 10) {\n        self.agentClass = protocol === 'http:' ? ForeverAgent : ForeverAgent.SSL\n      } else {\n        self.agentClass = self.httpModule.Agent\n        self.agentOptions = self.agentOptions || {}\n        self.agentOptions.keepAlive = true\n      }\n    } else {\n      self.agentClass = self.httpModule.Agent\n    }\n  }\n\n  if (self.pool === false) {\n    self.agent = false\n  } else {\n    self.agent = self.agent || self.getNewAgent()\n  }\n\n  self.on('pipe', function (src) {\n    if (self.ntick && self._started) {\n      self.emit('error', new Error('You cannot pipe to this stream after the outbound request has started.'))\n    }\n    self.src = src\n    if (isReadStream(src)) {\n      if (!self.hasHeader('content-type')) {\n        self.setHeader('content-type', mime.lookup(src.path))\n      }\n    } else {\n      if (src.headers) {\n        for (var i in src.headers) {\n          if (!self.hasHeader(i)) {\n            self.setHeader(i, src.headers[i])\n          }\n        }\n      }\n      if (self._json && !self.hasHeader('content-type')) {\n        self.setHeader('content-type', 'application/json')\n      }\n      if (src.method && !self.explicitMethod) {\n        self.method = src.method\n      }\n    }\n\n  // self.on('pipe', function () {\n  //   console.error('You have already piped to this stream. Pipeing twice is likely to break the request.')\n  // })\n  })\n\n  defer(function () {\n    if (self._aborted) {\n      return\n    }\n\n    var end = function () {\n      if (self._form) {\n        if (!self._auth.hasAuth) {\n          self._form.pipe(self)\n        } else if (self._auth.hasAuth && self._auth.sentAuth) {\n          self._form.pipe(self)\n        }\n      }\n      if (self._multipart && self._multipart.chunked) {\n        self._multipart.body.pipe(self)\n      }\n      if (self.body) {\n        if (isstream(self.body)) {\n          self.body.pipe(self)\n        } else {\n          setContentLength()\n          if (Array.isArray(self.body)) {\n            self.body.forEach(function (part) {\n              self.write(part)\n            })\n          } else {\n            self.write(self.body)\n          }\n          self.end()\n        }\n      } else if (self.requestBodyStream) {\n        console.warn('options.requestBodyStream is deprecated, please pass the request object to stream.pipe.')\n        self.requestBodyStream.pipe(self)\n      } else if (!self.src) {\n        if (self._auth.hasAuth && !self._auth.sentAuth) {\n          self.end()\n          return\n        }\n        if (self.method !== 'GET' && typeof self.method !== 'undefined') {\n          self.setHeader('content-length', 0)\n        }\n        self.end()\n      }\n    }\n\n    if (self._form && !self.hasHeader('content-length')) {\n      // Before ending the request, we had to compute the length of the whole form, asyncly\n      self.setHeader(self._form.getHeaders(), true)\n      self._form.getLength(function (err, length) {\n        if (!err && !isNaN(length)) {\n          self.setHeader('content-length', length)\n        }\n        end()\n      })\n    } else {\n      end()\n    }\n\n    self.ntick = true\n  })\n}\n\nRequest.prototype.getNewAgent = function () {\n  var self = this\n  var Agent = self.agentClass\n  var options = {}\n  if (self.agentOptions) {\n    for (var i in self.agentOptions) {\n      options[i] = self.agentOptions[i]\n    }\n  }\n  if (self.ca) {\n    options.ca = self.ca\n  }\n  if (self.ciphers) {\n    options.ciphers = self.ciphers\n  }\n  if (self.secureProtocol) {\n    options.secureProtocol = self.secureProtocol\n  }\n  if (self.secureOptions) {\n    options.secureOptions = self.secureOptions\n  }\n  if (typeof self.rejectUnauthorized !== 'undefined') {\n    options.rejectUnauthorized = self.rejectUnauthorized\n  }\n\n  if (self.cert && self.key) {\n    options.key = self.key\n    options.cert = self.cert\n  }\n\n  if (self.pfx) {\n    options.pfx = self.pfx\n  }\n\n  if (self.passphrase) {\n    options.passphrase = self.passphrase\n  }\n\n  var poolKey = ''\n\n  // different types of agents are in different pools\n  if (Agent !== self.httpModule.Agent) {\n    poolKey += Agent.name\n  }\n\n  // ca option is only relevant if proxy or destination are https\n  var proxy = self.proxy\n  if (typeof proxy === 'string') {\n    proxy = url.parse(proxy)\n  }\n  var isHttps = (proxy && proxy.protocol === 'https:') || this.uri.protocol === 'https:'\n\n  if (isHttps) {\n    if (options.ca) {\n      if (poolKey) {\n        poolKey += ':'\n      }\n      poolKey += options.ca\n    }\n\n    if (typeof options.rejectUnauthorized !== 'undefined') {\n      if (poolKey) {\n        poolKey += ':'\n      }\n      poolKey += options.rejectUnauthorized\n    }\n\n    if (options.cert) {\n      if (poolKey) {\n        poolKey += ':'\n      }\n      poolKey += options.cert.toString('ascii') + options.key.toString('ascii')\n    }\n\n    if (options.pfx) {\n      if (poolKey) {\n        poolKey += ':'\n      }\n      poolKey += options.pfx.toString('ascii')\n    }\n\n    if (options.ciphers) {\n      if (poolKey) {\n        poolKey += ':'\n      }\n      poolKey += options.ciphers\n    }\n\n    if (options.secureProtocol) {\n      if (poolKey) {\n        poolKey += ':'\n      }\n      poolKey += options.secureProtocol\n    }\n\n    if (options.secureOptions) {\n      if (poolKey) {\n        poolKey += ':'\n      }\n      poolKey += options.secureOptions\n    }\n  }\n\n  if (self.pool === globalPool && !poolKey && Object.keys(options).length === 0 && self.httpModule.globalAgent) {\n    // not doing anything special.  Use the globalAgent\n    return self.httpModule.globalAgent\n  }\n\n  // we're using a stored agent.  Make sure it's protocol-specific\n  poolKey = self.uri.protocol + poolKey\n\n  // generate a new agent for this setting if none yet exists\n  if (!self.pool[poolKey]) {\n    self.pool[poolKey] = new Agent(options)\n    // properly set maxSockets on new agents\n    if (self.pool.maxSockets) {\n      self.pool[poolKey].maxSockets = self.pool.maxSockets\n    }\n  }\n\n  return self.pool[poolKey]\n}\n\nRequest.prototype.start = function () {\n  // start() is called once we are ready to send the outgoing HTTP request.\n  // this is usually called on the first write(), end() or on nextTick()\n  var self = this\n\n  if (self.timing) {\n    // All timings will be relative to this request's startTime.  In order to do this,\n    // we need to capture the wall-clock start time (via Date), immediately followed\n    // by the high-resolution timer (via now()).  While these two won't be set\n    // at the _exact_ same time, they should be close enough to be able to calculate\n    // high-resolution, monotonically non-decreasing timestamps relative to startTime.\n    var startTime = new Date().getTime()\n    var startTimeNow = now()\n  }\n\n  if (self._aborted) {\n    return\n  }\n\n  self._started = true\n  self.method = self.method || 'GET'\n  self.href = self.uri.href\n\n  if (self.src && self.src.stat && self.src.stat.size && !self.hasHeader('content-length')) {\n    self.setHeader('content-length', self.src.stat.size)\n  }\n  if (self._aws) {\n    self.aws(self._aws, true)\n  }\n\n  // We have a method named auth, which is completely different from the http.request\n  // auth option.  If we don't remove it, we're gonna have a bad time.\n  var reqOptions = copy(self)\n  delete reqOptions.auth\n\n  debug('make request', self.uri.href)\n\n  // node v6.8.0 now supports a `timeout` value in `http.request()`, but we\n  // should delete it for now since we handle timeouts manually for better\n  // consistency with node versions before v6.8.0\n  delete reqOptions.timeout\n\n  try {\n    self.req = self.httpModule.request(reqOptions)\n  } catch (err) {\n    self.emit('error', err)\n    return\n  }\n\n  if (self.timing) {\n    self.startTime = startTime\n    self.startTimeNow = startTimeNow\n\n    // Timing values will all be relative to startTime (by comparing to startTimeNow\n    // so we have an accurate clock)\n    self.timings = {}\n  }\n\n  var timeout\n  if (self.timeout && !self.timeoutTimer) {\n    if (self.timeout < 0) {\n      timeout = 0\n    } else if (typeof self.timeout === 'number' && isFinite(self.timeout)) {\n      timeout = self.timeout\n    }\n  }\n\n  self.req.on('response', self.onRequestResponse.bind(self))\n  self.req.on('error', self.onRequestError.bind(self))\n  self.req.on('drain', function () {\n    self.emit('drain')\n  })\n\n  self.req.on('socket', function (socket) {\n    // `._connecting` was the old property which was made public in node v6.1.0\n    var isConnecting = socket._connecting || socket.connecting\n    if (self.timing) {\n      self.timings.socket = now() - self.startTimeNow\n\n      if (isConnecting) {\n        var onLookupTiming = function () {\n          self.timings.lookup = now() - self.startTimeNow\n        }\n\n        var onConnectTiming = function () {\n          self.timings.connect = now() - self.startTimeNow\n        }\n\n        socket.once('lookup', onLookupTiming)\n        socket.once('connect', onConnectTiming)\n\n        // clean up timing event listeners if needed on error\n        self.req.once('error', function () {\n          socket.removeListener('lookup', onLookupTiming)\n          socket.removeListener('connect', onConnectTiming)\n        })\n      }\n    }\n\n    var setReqTimeout = function () {\n      // This timeout sets the amount of time to wait *between* bytes sent\n      // from the server once connected.\n      //\n      // In particular, it's useful for erroring if the server fails to send\n      // data halfway through streaming a response.\n      self.req.setTimeout(timeout, function () {\n        if (self.req) {\n          self.abort()\n          var e = new Error('ESOCKETTIMEDOUT')\n          e.code = 'ESOCKETTIMEDOUT'\n          e.connect = false\n          self.emit('error', e)\n        }\n      })\n    }\n    if (timeout !== undefined) {\n      // Only start the connection timer if we're actually connecting a new\n      // socket, otherwise if we're already connected (because this is a\n      // keep-alive connection) do not bother. This is important since we won't\n      // get a 'connect' event for an already connected socket.\n      if (isConnecting) {\n        var onReqSockConnect = function () {\n          socket.removeListener('connect', onReqSockConnect)\n          clearTimeout(self.timeoutTimer)\n          self.timeoutTimer = null\n          setReqTimeout()\n        }\n\n        socket.on('connect', onReqSockConnect)\n\n        self.req.on('error', function (err) { // eslint-disable-line handle-callback-err\n          socket.removeListener('connect', onReqSockConnect)\n        })\n\n        // Set a timeout in memory - this block will throw if the server takes more\n        // than `timeout` to write the HTTP status and headers (corresponding to\n        // the on('response') event on the client). NB: this measures wall-clock\n        // time, not the time between bytes sent by the server.\n        self.timeoutTimer = setTimeout(function () {\n          socket.removeListener('connect', onReqSockConnect)\n          self.abort()\n          var e = new Error('ETIMEDOUT')\n          e.code = 'ETIMEDOUT'\n          e.connect = true\n          self.emit('error', e)\n        }, timeout)\n      } else {\n        // We're already connected\n        setReqTimeout()\n      }\n    }\n    self.emit('socket', socket)\n  })\n\n  self.emit('request', self.req)\n}\n\nRequest.prototype.onRequestError = function (error) {\n  var self = this\n  if (self._aborted) {\n    return\n  }\n  if (self.req && self.req._reusedSocket && error.code === 'ECONNRESET' &&\n    self.agent.addRequestNoreuse) {\n    self.agent = { addRequest: self.agent.addRequestNoreuse.bind(self.agent) }\n    self.start()\n    self.req.end()\n    return\n  }\n  if (self.timeout && self.timeoutTimer) {\n    clearTimeout(self.timeoutTimer)\n    self.timeoutTimer = null\n  }\n  self.emit('error', error)\n}\n\nRequest.prototype.onRequestResponse = function (response) {\n  var self = this\n\n  if (self.timing) {\n    self.timings.response = now() - self.startTimeNow\n  }\n\n  debug('onRequestResponse', self.uri.href, response.statusCode, response.headers)\n  response.on('end', function () {\n    if (self.timing) {\n      self.timings.end = now() - self.startTimeNow\n      response.timingStart = self.startTime\n\n      // fill in the blanks for any periods that didn't trigger, such as\n      // no lookup or connect due to keep alive\n      if (!self.timings.socket) {\n        self.timings.socket = 0\n      }\n      if (!self.timings.lookup) {\n        self.timings.lookup = self.timings.socket\n      }\n      if (!self.timings.connect) {\n        self.timings.connect = self.timings.lookup\n      }\n      if (!self.timings.response) {\n        self.timings.response = self.timings.connect\n      }\n\n      debug('elapsed time', self.timings.end)\n\n      // elapsedTime includes all redirects\n      self.elapsedTime += Math.round(self.timings.end)\n\n      // NOTE: elapsedTime is deprecated in favor of .timings\n      response.elapsedTime = self.elapsedTime\n\n      // timings is just for the final fetch\n      response.timings = self.timings\n\n      // pre-calculate phase timings as well\n      response.timingPhases = {\n        wait: self.timings.socket,\n        dns: self.timings.lookup - self.timings.socket,\n        tcp: self.timings.connect - self.timings.lookup,\n        firstByte: self.timings.response - self.timings.connect,\n        download: self.timings.end - self.timings.response,\n        total: self.timings.end\n      }\n    }\n    debug('response end', self.uri.href, response.statusCode, response.headers)\n  })\n\n  if (self._aborted) {\n    debug('aborted', self.uri.href)\n    response.resume()\n    return\n  }\n\n  self.response = response\n  response.request = self\n  response.toJSON = responseToJSON\n\n  // XXX This is different on 0.10, because SSL is strict by default\n  if (self.httpModule === https &&\n    self.strictSSL && (!response.hasOwnProperty('socket') ||\n    !response.socket.authorized)) {\n    debug('strict ssl error', self.uri.href)\n    var sslErr = response.hasOwnProperty('socket') ? response.socket.authorizationError : self.uri.href + ' does not support SSL'\n    self.emit('error', new Error('SSL Error: ' + sslErr))\n    return\n  }\n\n  // Save the original host before any redirect (if it changes, we need to\n  // remove any authorization headers).  Also remember the case of the header\n  // name because lots of broken servers expect Host instead of host and we\n  // want the caller to be able to specify this.\n  self.originalHost = self.getHeader('host')\n  if (!self.originalHostHeaderName) {\n    self.originalHostHeaderName = self.hasHeader('host')\n  }\n  if (self.setHost) {\n    self.removeHeader('host')\n  }\n  if (self.timeout && self.timeoutTimer) {\n    clearTimeout(self.timeoutTimer)\n    self.timeoutTimer = null\n  }\n\n  var targetCookieJar = (self._jar && self._jar.setCookie) ? self._jar : globalCookieJar\n  var addCookie = function (cookie) {\n    // set the cookie if it's domain in the href's domain.\n    try {\n      targetCookieJar.setCookie(cookie, self.uri.href, {ignoreError: true})\n    } catch (e) {\n      self.emit('error', e)\n    }\n  }\n\n  response.caseless = caseless(response.headers)\n\n  if (response.caseless.has('set-cookie') && (!self._disableCookies)) {\n    var headerName = response.caseless.has('set-cookie')\n    if (Array.isArray(response.headers[headerName])) {\n      response.headers[headerName].forEach(addCookie)\n    } else {\n      addCookie(response.headers[headerName])\n    }\n  }\n\n  if (self._redirect.onResponse(response)) {\n    return // Ignore the rest of the response\n  } else {\n    // Be a good stream and emit end when the response is finished.\n    // Hack to emit end on close because of a core bug that never fires end\n    response.on('close', function () {\n      if (!self._ended) {\n        self.response.emit('end')\n      }\n    })\n\n    response.once('end', function () {\n      self._ended = true\n    })\n\n    var noBody = function (code) {\n      return (\n        self.method === 'HEAD' ||\n        // Informational\n        (code >= 100 && code < 200) ||\n        // No Content\n        code === 204 ||\n        // Not Modified\n        code === 304\n      )\n    }\n\n    var responseContent\n    if (self.gzip && !noBody(response.statusCode)) {\n      var contentEncoding = response.headers['content-encoding'] || 'identity'\n      contentEncoding = contentEncoding.trim().toLowerCase()\n\n      // Be more lenient with decoding compressed responses, since (very rarely)\n      // servers send slightly invalid gzip responses that are still accepted\n      // by common browsers.\n      // Always using Z_SYNC_FLUSH is what cURL does.\n      var zlibOptions = {\n        flush: zlib.Z_SYNC_FLUSH,\n        finishFlush: zlib.Z_SYNC_FLUSH\n      }\n\n      if (contentEncoding === 'gzip') {\n        responseContent = zlib.createGunzip(zlibOptions)\n        response.pipe(responseContent)\n      } else if (contentEncoding === 'deflate') {\n        responseContent = zlib.createInflate(zlibOptions)\n        response.pipe(responseContent)\n      } else {\n        // Since previous versions didn't check for Content-Encoding header,\n        // ignore any invalid values to preserve backwards-compatibility\n        if (contentEncoding !== 'identity') {\n          debug('ignoring unrecognized Content-Encoding ' + contentEncoding)\n        }\n        responseContent = response\n      }\n    } else {\n      responseContent = response\n    }\n\n    if (self.encoding) {\n      if (self.dests.length !== 0) {\n        console.error('Ignoring encoding parameter as this stream is being piped to another stream which makes the encoding option invalid.')\n      } else {\n        responseContent.setEncoding(self.encoding)\n      }\n    }\n\n    if (self._paused) {\n      responseContent.pause()\n    }\n\n    self.responseContent = responseContent\n\n    self.emit('response', response)\n\n    self.dests.forEach(function (dest) {\n      self.pipeDest(dest)\n    })\n\n    responseContent.on('data', function (chunk) {\n      if (self.timing && !self.responseStarted) {\n        self.responseStartTime = (new Date()).getTime()\n\n        // NOTE: responseStartTime is deprecated in favor of .timings\n        response.responseStartTime = self.responseStartTime\n      }\n      self._destdata = true\n      self.emit('data', chunk)\n    })\n    responseContent.once('end', function (chunk) {\n      self.emit('end', chunk)\n    })\n    responseContent.on('error', function (error) {\n      self.emit('error', error)\n    })\n    responseContent.on('close', function () { self.emit('close') })\n\n    if (self.callback) {\n      self.readResponseBody(response)\n    } else { // if no callback\n      self.on('end', function () {\n        if (self._aborted) {\n          debug('aborted', self.uri.href)\n          return\n        }\n        self.emit('complete', response)\n      })\n    }\n  }\n  debug('finish init function', self.uri.href)\n}\n\nRequest.prototype.readResponseBody = function (response) {\n  var self = this\n  debug(\"reading response's body\")\n  var buffers = []\n  var bufferLength = 0\n  var strings = []\n\n  self.on('data', function (chunk) {\n    if (!Buffer.isBuffer(chunk)) {\n      strings.push(chunk)\n    } else if (chunk.length) {\n      bufferLength += chunk.length\n      buffers.push(chunk)\n    }\n  })\n  self.on('end', function () {\n    debug('end event', self.uri.href)\n    if (self._aborted) {\n      debug('aborted', self.uri.href)\n      // `buffer` is defined in the parent scope and used in a closure it exists for the life of the request.\n      // This can lead to leaky behavior if the user retains a reference to the request object.\n      buffers = []\n      bufferLength = 0\n      return\n    }\n\n    if (bufferLength) {\n      debug('has body', self.uri.href, bufferLength)\n      response.body = Buffer.concat(buffers, bufferLength)\n      if (self.encoding !== null) {\n        response.body = response.body.toString(self.encoding)\n      }\n      // `buffer` is defined in the parent scope and used in a closure it exists for the life of the Request.\n      // This can lead to leaky behavior if the user retains a reference to the request object.\n      buffers = []\n      bufferLength = 0\n    } else if (strings.length) {\n      // The UTF8 BOM [0xEF,0xBB,0xBF] is converted to [0xFE,0xFF] in the JS UTC16/UCS2 representation.\n      // Strip this value out when the encoding is set to 'utf8', as upstream consumers won't expect it and it breaks JSON.parse().\n      if (self.encoding === 'utf8' && strings[0].length > 0 && strings[0][0] === '\\uFEFF') {\n        strings[0] = strings[0].substring(1)\n      }\n      response.body = strings.join('')\n    }\n\n    if (self._json) {\n      try {\n        response.body = JSON.parse(response.body, self._jsonReviver)\n      } catch (e) {\n        debug('invalid JSON received', self.uri.href)\n      }\n    }\n    debug('emitting complete', self.uri.href)\n    if (typeof response.body === 'undefined' && !self._json) {\n      response.body = self.encoding === null ? Buffer.alloc(0) : ''\n    }\n    self.emit('complete', response, response.body)\n  })\n}\n\nRequest.prototype.abort = function () {\n  var self = this\n  self._aborted = true\n\n  if (self.req) {\n    self.req.abort()\n  } else if (self.response) {\n    self.response.destroy()\n  }\n\n  self.emit('abort')\n}\n\nRequest.prototype.pipeDest = function (dest) {\n  var self = this\n  var response = self.response\n  // Called after the response is received\n  if (dest.headers && !dest.headersSent) {\n    if (response.caseless.has('content-type')) {\n      var ctname = response.caseless.has('content-type')\n      if (dest.setHeader) {\n        dest.setHeader(ctname, response.headers[ctname])\n      } else {\n        dest.headers[ctname] = response.headers[ctname]\n      }\n    }\n\n    if (response.caseless.has('content-length')) {\n      var clname = response.caseless.has('content-length')\n      if (dest.setHeader) {\n        dest.setHeader(clname, response.headers[clname])\n      } else {\n        dest.headers[clname] = response.headers[clname]\n      }\n    }\n  }\n  if (dest.setHeader && !dest.headersSent) {\n    for (var i in response.headers) {\n      // If the response content is being decoded, the Content-Encoding header\n      // of the response doesn't represent the piped content, so don't pass it.\n      if (!self.gzip || i !== 'content-encoding') {\n        dest.setHeader(i, response.headers[i])\n      }\n    }\n    dest.statusCode = response.statusCode\n  }\n  if (self.pipefilter) {\n    self.pipefilter(response, dest)\n  }\n}\n\nRequest.prototype.qs = function (q, clobber) {\n  var self = this\n  var base\n  if (!clobber && self.uri.query) {\n    base = self._qs.parse(self.uri.query)\n  } else {\n    base = {}\n  }\n\n  for (var i in q) {\n    base[i] = q[i]\n  }\n\n  var qs = self._qs.stringify(base)\n\n  if (qs === '') {\n    return self\n  }\n\n  self.uri = url.parse(self.uri.href.split('?')[0] + '?' + qs)\n  self.url = self.uri\n  self.path = self.uri.path\n\n  if (self.uri.host === 'unix') {\n    self.enableUnixSocket()\n  }\n\n  return self\n}\nRequest.prototype.form = function (form) {\n  var self = this\n  if (form) {\n    if (!/^application\\/x-www-form-urlencoded\\b/.test(self.getHeader('content-type'))) {\n      self.setHeader('content-type', 'application/x-www-form-urlencoded')\n    }\n    self.body = (typeof form === 'string')\n      ? self._qs.rfc3986(form.toString('utf8'))\n      : self._qs.stringify(form).toString('utf8')\n    return self\n  }\n  // create form-data object\n  self._form = new FormData()\n  self._form.on('error', function (err) {\n    err.message = 'form-data: ' + err.message\n    self.emit('error', err)\n    self.abort()\n  })\n  return self._form\n}\nRequest.prototype.multipart = function (multipart) {\n  var self = this\n\n  self._multipart.onRequest(multipart)\n\n  if (!self._multipart.chunked) {\n    self.body = self._multipart.body\n  }\n\n  return self\n}\nRequest.prototype.json = function (val) {\n  var self = this\n\n  if (!self.hasHeader('accept')) {\n    self.setHeader('accept', 'application/json')\n  }\n\n  if (typeof self.jsonReplacer === 'function') {\n    self._jsonReplacer = self.jsonReplacer\n  }\n\n  self._json = true\n  if (typeof val === 'boolean') {\n    if (self.body !== undefined) {\n      if (!/^application\\/x-www-form-urlencoded\\b/.test(self.getHeader('content-type'))) {\n        self.body = safeStringify(self.body, self._jsonReplacer)\n      } else {\n        self.body = self._qs.rfc3986(self.body)\n      }\n      if (!self.hasHeader('content-type')) {\n        self.setHeader('content-type', 'application/json')\n      }\n    }\n  } else {\n    self.body = safeStringify(val, self._jsonReplacer)\n    if (!self.hasHeader('content-type')) {\n      self.setHeader('content-type', 'application/json')\n    }\n  }\n\n  if (typeof self.jsonReviver === 'function') {\n    self._jsonReviver = self.jsonReviver\n  }\n\n  return self\n}\nRequest.prototype.getHeader = function (name, headers) {\n  var self = this\n  var result, re, match\n  if (!headers) {\n    headers = self.headers\n  }\n  Object.keys(headers).forEach(function (key) {\n    if (key.length !== name.length) {\n      return\n    }\n    re = new RegExp(name, 'i')\n    match = key.match(re)\n    if (match) {\n      result = headers[key]\n    }\n  })\n  return result\n}\nRequest.prototype.enableUnixSocket = function () {\n  // Get the socket & request paths from the URL\n  var unixParts = this.uri.path.split(':')\n  var host = unixParts[0]\n  var path = unixParts[1]\n  // Apply unix properties to request\n  this.socketPath = host\n  this.uri.pathname = path\n  this.uri.path = path\n  this.uri.host = host\n  this.uri.hostname = host\n  this.uri.isUnix = true\n}\n\nRequest.prototype.auth = function (user, pass, sendImmediately, bearer) {\n  var self = this\n\n  self._auth.onRequest(user, pass, sendImmediately, bearer)\n\n  return self\n}\nRequest.prototype.aws = function (opts, now) {\n  var self = this\n\n  if (!now) {\n    self._aws = opts\n    return self\n  }\n\n  if (opts.sign_version === 4 || opts.sign_version === '4') {\n    // use aws4\n    var options = {\n      host: self.uri.host,\n      path: self.uri.path,\n      method: self.method,\n      headers: {\n        'content-type': self.getHeader('content-type') || ''\n      },\n      body: self.body\n    }\n    var signRes = aws4.sign(options, {\n      accessKeyId: opts.key,\n      secretAccessKey: opts.secret,\n      sessionToken: opts.session\n    })\n    self.setHeader('authorization', signRes.headers.Authorization)\n    self.setHeader('x-amz-date', signRes.headers['X-Amz-Date'])\n    if (signRes.headers['X-Amz-Security-Token']) {\n      self.setHeader('x-amz-security-token', signRes.headers['X-Amz-Security-Token'])\n    }\n  } else {\n    // default: use aws-sign2\n    var date = new Date()\n    self.setHeader('date', date.toUTCString())\n    var auth = {\n      key: opts.key,\n      secret: opts.secret,\n      verb: self.method.toUpperCase(),\n      date: date,\n      contentType: self.getHeader('content-type') || '',\n      md5: self.getHeader('content-md5') || '',\n      amazonHeaders: aws2.canonicalizeHeaders(self.headers)\n    }\n    var path = self.uri.path\n    if (opts.bucket && path) {\n      auth.resource = '/' + opts.bucket + path\n    } else if (opts.bucket && !path) {\n      auth.resource = '/' + opts.bucket\n    } else if (!opts.bucket && path) {\n      auth.resource = path\n    } else if (!opts.bucket && !path) {\n      auth.resource = '/'\n    }\n    auth.resource = aws2.canonicalizeResource(auth.resource)\n    self.setHeader('authorization', aws2.authorization(auth))\n  }\n\n  return self\n}\nRequest.prototype.httpSignature = function (opts) {\n  var self = this\n  httpSignature.signRequest({\n    getHeader: function (header) {\n      return self.getHeader(header, self.headers)\n    },\n    setHeader: function (header, value) {\n      self.setHeader(header, value)\n    },\n    method: self.method,\n    path: self.path\n  }, opts)\n  debug('httpSignature authorization', self.getHeader('authorization'))\n\n  return self\n}\nRequest.prototype.hawk = function (opts) {\n  var self = this\n  self.setHeader('Authorization', hawk.header(self.uri, self.method, opts))\n}\nRequest.prototype.oauth = function (_oauth) {\n  var self = this\n\n  self._oauth.onRequest(_oauth)\n\n  return self\n}\n\nRequest.prototype.jar = function (jar) {\n  var self = this\n  var cookies\n\n  if (self._redirect.redirectsFollowed === 0) {\n    self.originalCookieHeader = self.getHeader('cookie')\n  }\n\n  if (!jar) {\n    // disable cookies\n    cookies = false\n    self._disableCookies = true\n  } else {\n    var targetCookieJar = (jar && jar.getCookieString) ? jar : globalCookieJar\n    var urihref = self.uri.href\n    // fetch cookie in the Specified host\n    if (targetCookieJar) {\n      cookies = targetCookieJar.getCookieString(urihref)\n    }\n  }\n\n  // if need cookie and cookie is not empty\n  if (cookies && cookies.length) {\n    if (self.originalCookieHeader) {\n      // Don't overwrite existing Cookie header\n      self.setHeader('cookie', self.originalCookieHeader + '; ' + cookies)\n    } else {\n      self.setHeader('cookie', cookies)\n    }\n  }\n  self._jar = jar\n  return self\n}\n\n// Stream API\nRequest.prototype.pipe = function (dest, opts) {\n  var self = this\n\n  if (self.response) {\n    if (self._destdata) {\n      self.emit('error', new Error('You cannot pipe after data has been emitted from the response.'))\n    } else if (self._ended) {\n      self.emit('error', new Error('You cannot pipe after the response has been ended.'))\n    } else {\n      stream.Stream.prototype.pipe.call(self, dest, opts)\n      self.pipeDest(dest)\n      return dest\n    }\n  } else {\n    self.dests.push(dest)\n    stream.Stream.prototype.pipe.call(self, dest, opts)\n    return dest\n  }\n}\nRequest.prototype.write = function () {\n  var self = this\n  if (self._aborted) { return }\n\n  if (!self._started) {\n    self.start()\n  }\n  if (self.req) {\n    return self.req.write.apply(self.req, arguments)\n  }\n}\nRequest.prototype.end = function (chunk) {\n  var self = this\n  if (self._aborted) { return }\n\n  if (chunk) {\n    self.write(chunk)\n  }\n  if (!self._started) {\n    self.start()\n  }\n  if (self.req) {\n    self.req.end()\n  }\n}\nRequest.prototype.pause = function () {\n  var self = this\n  if (!self.responseContent) {\n    self._paused = true\n  } else {\n    self.responseContent.pause.apply(self.responseContent, arguments)\n  }\n}\nRequest.prototype.resume = function () {\n  var self = this\n  if (!self.responseContent) {\n    self._paused = false\n  } else {\n    self.responseContent.resume.apply(self.responseContent, arguments)\n  }\n}\nRequest.prototype.destroy = function () {\n  var self = this\n  if (!self._ended) {\n    self.end()\n  } else if (self.response) {\n    self.response.destroy()\n  }\n}\n\nRequest.defaultProxyHeaderWhiteList =\n  Tunnel.defaultProxyHeaderWhiteList.slice()\n\nRequest.defaultProxyHeaderExclusiveList =\n  Tunnel.defaultProxyHeaderExclusiveList.slice()\n\n// Exports\n\nRequest.prototype.toJSON = requestToJSON\nmodule.exports = Request\n\n\n/***/ }),\n/* 814 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar core = __webpack_require__(307);\nvar async = __webpack_require__(815);\nasync.core = core;\nasync.isCore = function isCore(x) { return core[x]; };\nasync.sync = __webpack_require__(817);\n\nexports = async;\nmodule.exports = async;\n\n\n/***/ }),\n/* 815 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar core = __webpack_require__(307);\nvar fs = __webpack_require__(4);\nvar path = __webpack_require__(0);\nvar caller = __webpack_require__(417);\nvar nodeModulesPaths = __webpack_require__(418);\n\nvar defaultIsFile = function isFile(file, cb) {\n    fs.stat(file, function (err, stat) {\n        if (!err) {\n            return cb(null, stat.isFile() || stat.isFIFO());\n        }\n        if (err.code === 'ENOENT' || err.code === 'ENOTDIR') return cb(null, false);\n        return cb(err);\n    });\n};\n\nmodule.exports = function resolve(x, options, callback) {\n    var cb = callback;\n    var opts = options || {};\n    if (typeof opts === 'function') {\n        cb = opts;\n        opts = {};\n    }\n    if (typeof x !== 'string') {\n        var err = new TypeError('Path must be a string.');\n        return process.nextTick(function () {\n            cb(err);\n        });\n    }\n\n    var isFile = opts.isFile || defaultIsFile;\n    var readFile = opts.readFile || fs.readFile;\n\n    var extensions = opts.extensions || ['.js'];\n    var basedir = opts.basedir || path.dirname(caller());\n    var parent = opts.filename || basedir;\n\n    opts.paths = opts.paths || [];\n\n    if (/^(?:\\.\\.?(?:\\/|$)|\\/|([A-Za-z]:)?[/\\\\])/.test(x)) {\n        var res = path.resolve(basedir, x);\n        if (x === '..' || x.slice(-1) === '/') res += '/';\n        if (/\\/$/.test(x) && res === basedir) {\n            loadAsDirectory(res, opts.package, onfile);\n        } else loadAsFile(res, opts.package, onfile);\n    } else loadNodeModules(x, basedir, function (err, n, pkg) {\n        if (err) cb(err);\n        else if (n) cb(null, n, pkg);\n        else if (core[x]) return cb(null, x);\n        else {\n            var moduleError = new Error(\"Cannot find module '\" + x + \"' from '\" + parent + \"'\");\n            moduleError.code = 'MODULE_NOT_FOUND';\n            cb(moduleError);\n        }\n    });\n\n    function onfile(err, m, pkg) {\n        if (err) cb(err);\n        else if (m) cb(null, m, pkg);\n        else loadAsDirectory(res, function (err, d, pkg) {\n            if (err) cb(err);\n            else if (d) cb(null, d, pkg);\n            else {\n                var moduleError = new Error(\"Cannot find module '\" + x + \"' from '\" + parent + \"'\");\n                moduleError.code = 'MODULE_NOT_FOUND';\n                cb(moduleError);\n            }\n        });\n    }\n\n    function loadAsFile(x, thePackage, callback) {\n        var loadAsFilePackage = thePackage;\n        var cb = callback;\n        if (typeof loadAsFilePackage === 'function') {\n            cb = loadAsFilePackage;\n            loadAsFilePackage = undefined;\n        }\n\n        var exts = [''].concat(extensions);\n        load(exts, x, loadAsFilePackage);\n\n        function load(exts, x, loadPackage) {\n            if (exts.length === 0) return cb(null, undefined, loadPackage);\n            var file = x + exts[0];\n\n            var pkg = loadPackage;\n            if (pkg) onpkg(null, pkg);\n            else loadpkg(path.dirname(file), onpkg);\n\n            function onpkg(err, pkg_, dir) {\n                pkg = pkg_;\n                if (err) return cb(err);\n                if (dir && pkg && opts.pathFilter) {\n                    var rfile = path.relative(dir, file);\n                    var rel = rfile.slice(0, rfile.length - exts[0].length);\n                    var r = opts.pathFilter(pkg, x, rel);\n                    if (r) return load(\n                        [''].concat(extensions.slice()),\n                        path.resolve(dir, r),\n                        pkg\n                    );\n                }\n                isFile(file, onex);\n            }\n            function onex(err, ex) {\n                if (err) return cb(err);\n                if (ex) return cb(null, file, pkg);\n                load(exts.slice(1), x, pkg);\n            }\n        }\n    }\n\n    function loadpkg(dir, cb) {\n        if (dir === '' || dir === '/') return cb(null);\n        if (process.platform === 'win32' && (/^\\w:[/\\\\]*$/).test(dir)) {\n            return cb(null);\n        }\n        if (/[/\\\\]node_modules[/\\\\]*$/.test(dir)) return cb(null);\n\n        var pkgfile = path.join(dir, 'package.json');\n        isFile(pkgfile, function (err, ex) {\n            // on err, ex is false\n            if (!ex) return loadpkg(path.dirname(dir), cb);\n\n            readFile(pkgfile, function (err, body) {\n                if (err) cb(err);\n                try { var pkg = JSON.parse(body); } catch (jsonErr) {}\n\n                if (pkg && opts.packageFilter) {\n                    pkg = opts.packageFilter(pkg, pkgfile);\n                }\n                cb(null, pkg, dir);\n            });\n        });\n    }\n\n    function loadAsDirectory(x, loadAsDirectoryPackage, callback) {\n        var cb = callback;\n        var fpkg = loadAsDirectoryPackage;\n        if (typeof fpkg === 'function') {\n            cb = fpkg;\n            fpkg = opts.package;\n        }\n\n        var pkgfile = path.join(x, 'package.json');\n        isFile(pkgfile, function (err, ex) {\n            if (err) return cb(err);\n            if (!ex) return loadAsFile(path.join(x, 'index'), fpkg, cb);\n\n            readFile(pkgfile, function (err, body) {\n                if (err) return cb(err);\n                try {\n                    var pkg = JSON.parse(body);\n                } catch (jsonErr) {}\n\n                if (opts.packageFilter) {\n                    pkg = opts.packageFilter(pkg, pkgfile);\n                }\n\n                if (pkg.main) {\n                    if (pkg.main === '.' || pkg.main === './') {\n                        pkg.main = 'index';\n                    }\n                    loadAsFile(path.resolve(x, pkg.main), pkg, function (err, m, pkg) {\n                        if (err) return cb(err);\n                        if (m) return cb(null, m, pkg);\n                        if (!pkg) return loadAsFile(path.join(x, 'index'), pkg, cb);\n\n                        var dir = path.resolve(x, pkg.main);\n                        loadAsDirectory(dir, pkg, function (err, n, pkg) {\n                            if (err) return cb(err);\n                            if (n) return cb(null, n, pkg);\n                            loadAsFile(path.join(x, 'index'), pkg, cb);\n                        });\n                    });\n                    return;\n                }\n\n                loadAsFile(path.join(x, '/index'), pkg, cb);\n            });\n        });\n    }\n\n    function processDirs(cb, dirs) {\n        if (dirs.length === 0) return cb(null, undefined);\n        var dir = dirs[0];\n\n        var file = path.join(dir, x);\n        loadAsFile(file, opts.package, onfile);\n\n        function onfile(err, m, pkg) {\n            if (err) return cb(err);\n            if (m) return cb(null, m, pkg);\n            loadAsDirectory(path.join(dir, x), opts.package, ondir);\n        }\n\n        function ondir(err, n, pkg) {\n            if (err) return cb(err);\n            if (n) return cb(null, n, pkg);\n            processDirs(cb, dirs.slice(1));\n        }\n    }\n    function loadNodeModules(x, start, cb) {\n        processDirs(cb, nodeModulesPaths(start, opts));\n    }\n};\n\n\n/***/ }),\n/* 816 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"assert\":true,\"async_hooks\":\">= 8\",\"buffer_ieee754\":\"< 0.9.7\",\"buffer\":true,\"child_process\":true,\"cluster\":true,\"console\":true,\"constants\":true,\"crypto\":true,\"_debugger\":\"< 8\",\"dgram\":true,\"dns\":true,\"domain\":true,\"events\":true,\"freelist\":\"< 6\",\"fs\":true,\"fs/promises\":\">= 10 && < 10.1\",\"_http_agent\":\">= 0.11.1\",\"_http_client\":\">= 0.11.1\",\"_http_common\":\">= 0.11.1\",\"_http_incoming\":\">= 0.11.1\",\"_http_outgoing\":\">= 0.11.1\",\"_http_server\":\">= 0.11.1\",\"http\":true,\"http2\":\">= 8.8\",\"https\":true,\"inspector\":\">= 8.0.0\",\"_linklist\":\"< 8\",\"module\":true,\"net\":true,\"node-inspect/lib/_inspect\":\">= 7.6.0\",\"node-inspect/lib/internal/inspect_client\":\">= 7.6.0\",\"node-inspect/lib/internal/inspect_repl\":\">= 7.6.0\",\"os\":true,\"path\":true,\"perf_hooks\":\">= 8.5\",\"process\":\">= 1\",\"punycode\":true,\"querystring\":true,\"readline\":true,\"repl\":true,\"smalloc\":\">= 0.11.5 && < 3\",\"_stream_duplex\":\">= 0.9.4\",\"_stream_transform\":\">= 0.9.4\",\"_stream_wrap\":\">= 1.4.1\",\"_stream_passthrough\":\">= 0.9.4\",\"_stream_readable\":\">= 0.9.4\",\"_stream_writable\":\">= 0.9.4\",\"stream\":true,\"string_decoder\":true,\"sys\":true,\"timers\":true,\"_tls_common\":\">= 0.11.13\",\"_tls_legacy\":\">= 0.11.3 && < 10\",\"_tls_wrap\":\">= 0.11.3\",\"tls\":true,\"trace_events\":\">= 10\",\"tty\":true,\"url\":true,\"util\":true,\"v8/tools/arguments\":\">= 10\",\"v8/tools/codemap\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/consarray\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/csvparser\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/logreader\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/profile_view\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8/tools/splaytree\":[\">= 4.4.0 && < 5\",\">= 5.2.0\"],\"v8\":\">= 1\",\"vm\":true,\"zlib\":true}\n\n/***/ }),\n/* 817 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar core = __webpack_require__(307);\nvar fs = __webpack_require__(4);\nvar path = __webpack_require__(0);\nvar caller = __webpack_require__(417);\nvar nodeModulesPaths = __webpack_require__(418);\n\nvar defaultIsFile = function isFile(file) {\n    try {\n        var stat = fs.statSync(file);\n    } catch (e) {\n        if (e && (e.code === 'ENOENT' || e.code === 'ENOTDIR')) return false;\n        throw e;\n    }\n    return stat.isFile() || stat.isFIFO();\n};\n\nmodule.exports = function (x, options) {\n    if (typeof x !== 'string') {\n        throw new TypeError('Path must be a string.');\n    }\n    var opts = options || {};\n    var isFile = opts.isFile || defaultIsFile;\n    var readFileSync = opts.readFileSync || fs.readFileSync;\n\n    var extensions = opts.extensions || ['.js'];\n    var basedir = opts.basedir || path.dirname(caller());\n    var parent = opts.filename || basedir;\n\n    opts.paths = opts.paths || [];\n\n    if (/^(?:\\.\\.?(?:\\/|$)|\\/|([A-Za-z]:)?[/\\\\])/.test(x)) {\n        var res = path.resolve(basedir, x);\n        if (x === '..' || x.slice(-1) === '/') res += '/';\n        var m = loadAsFileSync(res) || loadAsDirectorySync(res);\n        if (m) return m;\n    } else {\n        var n = loadNodeModulesSync(x, basedir);\n        if (n) return n;\n    }\n\n    if (core[x]) return x;\n\n    var err = new Error(\"Cannot find module '\" + x + \"' from '\" + parent + \"'\");\n    err.code = 'MODULE_NOT_FOUND';\n    throw err;\n\n    function loadAsFileSync(x) {\n        var pkg = loadpkg(path.dirname(x));\n\n        if (pkg && pkg.dir && pkg.pkg && opts.pathFilter) {\n            var rfile = path.relative(pkg.dir, x);\n            var r = opts.pathFilter(pkg.pkg, x, rfile);\n            if (r) {\n                x = path.resolve(pkg.dir, r); // eslint-disable-line no-param-reassign\n            }\n        }\n\n        if (isFile(x)) {\n            return x;\n        }\n\n        for (var i = 0; i < extensions.length; i++) {\n            var file = x + extensions[i];\n            if (isFile(file)) {\n                return file;\n            }\n        }\n    }\n\n    function loadpkg(dir) {\n        if (dir === '' || dir === '/') return;\n        if (process.platform === 'win32' && (/^\\w:[/\\\\]*$/).test(dir)) {\n            return;\n        }\n        if (/[/\\\\]node_modules[/\\\\]*$/.test(dir)) return;\n\n        var pkgfile = path.join(dir, 'package.json');\n\n        if (!isFile(pkgfile)) {\n            return loadpkg(path.dirname(dir));\n        }\n\n        var body = readFileSync(pkgfile);\n\n        try {\n            var pkg = JSON.parse(body);\n        } catch (jsonErr) {}\n\n        if (pkg && opts.packageFilter) {\n            pkg = opts.packageFilter(pkg, dir);\n        }\n\n        return { pkg: pkg, dir: dir };\n    }\n\n    function loadAsDirectorySync(x) {\n        var pkgfile = path.join(x, '/package.json');\n        if (isFile(pkgfile)) {\n            try {\n                var body = readFileSync(pkgfile, 'UTF8');\n                var pkg = JSON.parse(body);\n\n                if (opts.packageFilter) {\n                    pkg = opts.packageFilter(pkg, x);\n                }\n\n                if (pkg.main) {\n                    if (pkg.main === '.' || pkg.main === './') {\n                        pkg.main = 'index';\n                    }\n                    var m = loadAsFileSync(path.resolve(x, pkg.main));\n                    if (m) return m;\n                    var n = loadAsDirectorySync(path.resolve(x, pkg.main));\n                    if (n) return n;\n                }\n            } catch (e) {}\n        }\n\n        return loadAsFileSync(path.join(x, '/index'));\n    }\n\n    function loadNodeModulesSync(x, start) {\n        var dirs = nodeModulesPaths(start, opts);\n        for (var i = 0; i < dirs.length; i++) {\n            var dir = dirs[i];\n            var m = loadAsFileSync(path.join(dir, '/', x));\n            if (m) return m;\n            var n = loadAsDirectorySync(path.join(dir, '/', x));\n            if (n) return n;\n        }\n    }\n};\n\n\n/***/ }),\n/* 818 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst onetime = __webpack_require__(771);\nconst signalExit = __webpack_require__(451);\n\nmodule.exports = onetime(() => {\n\tsignalExit(() => {\n\t\tprocess.stderr.write('\\u001b[?25h');\n\t}, {alwaysLast: true});\n});\n\n\n/***/ }),\n/* 819 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(820);\n\n/***/ }),\n/* 820 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar RetryOperation = __webpack_require__(821);\n\nexports.operation = function(options) {\n  var timeouts = exports.timeouts(options);\n  return new RetryOperation(timeouts, {\n      forever: options && options.forever,\n      unref: options && options.unref\n  });\n};\n\nexports.timeouts = function(options) {\n  if (options instanceof Array) {\n    return [].concat(options);\n  }\n\n  var opts = {\n    retries: 10,\n    factor: 2,\n    minTimeout: 1 * 1000,\n    maxTimeout: Infinity,\n    randomize: false\n  };\n  for (var key in options) {\n    opts[key] = options[key];\n  }\n\n  if (opts.minTimeout > opts.maxTimeout) {\n    throw new Error('minTimeout is greater than maxTimeout');\n  }\n\n  var timeouts = [];\n  for (var i = 0; i < opts.retries; i++) {\n    timeouts.push(this.createTimeout(i, opts));\n  }\n\n  if (options && options.forever && !timeouts.length) {\n    timeouts.push(this.createTimeout(i, opts));\n  }\n\n  // sort the array numerically ascending\n  timeouts.sort(function(a,b) {\n    return a - b;\n  });\n\n  return timeouts;\n};\n\nexports.createTimeout = function(attempt, opts) {\n  var random = (opts.randomize)\n    ? (Math.random() + 1)\n    : 1;\n\n  var timeout = Math.round(random * opts.minTimeout * Math.pow(opts.factor, attempt));\n  timeout = Math.min(timeout, opts.maxTimeout);\n\n  return timeout;\n};\n\nexports.wrap = function(obj, options, methods) {\n  if (options instanceof Array) {\n    methods = options;\n    options = null;\n  }\n\n  if (!methods) {\n    methods = [];\n    for (var key in obj) {\n      if (typeof obj[key] === 'function') {\n        methods.push(key);\n      }\n    }\n  }\n\n  for (var i = 0; i < methods.length; i++) {\n    var method   = methods[i];\n    var original = obj[method];\n\n    obj[method] = function retryWrapper() {\n      var op       = exports.operation(options);\n      var args     = Array.prototype.slice.call(arguments);\n      var callback = args.pop();\n\n      args.push(function(err) {\n        if (op.retry(err)) {\n          return;\n        }\n        if (err) {\n          arguments[0] = op.mainError();\n        }\n        callback.apply(this, arguments);\n      });\n\n      op.attempt(function() {\n        original.apply(obj, args);\n      });\n    };\n    obj[method].options = options;\n  }\n};\n\n\n/***/ }),\n/* 821 */\n/***/ (function(module, exports) {\n\nfunction RetryOperation(timeouts, options) {\n  // Compatibility for the old (timeouts, retryForever) signature\n  if (typeof options === 'boolean') {\n    options = { forever: options };\n  }\n\n  this._timeouts = timeouts;\n  this._options = options || {};\n  this._fn = null;\n  this._errors = [];\n  this._attempts = 1;\n  this._operationTimeout = null;\n  this._operationTimeoutCb = null;\n  this._timeout = null;\n\n  if (this._options.forever) {\n    this._cachedTimeouts = this._timeouts.slice(0);\n  }\n}\nmodule.exports = RetryOperation;\n\nRetryOperation.prototype.stop = function() {\n  if (this._timeout) {\n    clearTimeout(this._timeout);\n  }\n\n  this._timeouts       = [];\n  this._cachedTimeouts = null;\n};\n\nRetryOperation.prototype.retry = function(err) {\n  if (this._timeout) {\n    clearTimeout(this._timeout);\n  }\n\n  if (!err) {\n    return false;\n  }\n\n  this._errors.push(err);\n\n  var timeout = this._timeouts.shift();\n  if (timeout === undefined) {\n    if (this._cachedTimeouts) {\n      // retry forever, only keep last error\n      this._errors.splice(this._errors.length - 1, this._errors.length);\n      this._timeouts = this._cachedTimeouts.slice(0);\n      timeout = this._timeouts.shift();\n    } else {\n      return false;\n    }\n  }\n\n  var self = this;\n  var timer = setTimeout(function() {\n    self._attempts++;\n\n    if (self._operationTimeoutCb) {\n      self._timeout = setTimeout(function() {\n        self._operationTimeoutCb(self._attempts);\n      }, self._operationTimeout);\n\n      if (this._options.unref) {\n          self._timeout.unref();\n      }\n    }\n\n    self._fn(self._attempts);\n  }, timeout);\n\n  if (this._options.unref) {\n      timer.unref();\n  }\n\n  return true;\n};\n\nRetryOperation.prototype.attempt = function(fn, timeoutOps) {\n  this._fn = fn;\n\n  if (timeoutOps) {\n    if (timeoutOps.timeout) {\n      this._operationTimeout = timeoutOps.timeout;\n    }\n    if (timeoutOps.cb) {\n      this._operationTimeoutCb = timeoutOps.cb;\n    }\n  }\n\n  var self = this;\n  if (this._operationTimeoutCb) {\n    this._timeout = setTimeout(function() {\n      self._operationTimeoutCb();\n    }, self._operationTimeout);\n  }\n\n  this._fn(this._attempts);\n};\n\nRetryOperation.prototype.try = function(fn) {\n  console.log('Using RetryOperation.try() is deprecated');\n  this.attempt(fn);\n};\n\nRetryOperation.prototype.start = function(fn) {\n  console.log('Using RetryOperation.start() is deprecated');\n  this.attempt(fn);\n};\n\nRetryOperation.prototype.start = RetryOperation.prototype.try;\n\nRetryOperation.prototype.errors = function() {\n  return this._errors;\n};\n\nRetryOperation.prototype.attempts = function() {\n  return this._attempts;\n};\n\nRetryOperation.prototype.mainError = function() {\n  if (this._errors.length === 0) {\n    return null;\n  }\n\n  var counts = {};\n  var mainError = null;\n  var mainErrorCount = 0;\n\n  for (var i = 0; i < this._errors.length; i++) {\n    var error = this._errors[i];\n    var message = error.message;\n    var count = (counts[message] || 0) + 1;\n\n    counts[message] = count;\n\n    if (count >= mainErrorCount) {\n      mainError = error;\n      mainErrorCount = count;\n    }\n  }\n\n  return mainError;\n};\n\n\n/***/ }),\n/* 822 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return SubscribeOnObservable; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__scheduler_asap__ = __webpack_require__(438);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_isNumeric__ = __webpack_require__(191);\n/** PURE_IMPORTS_START tslib,_Observable,_scheduler_asap,_util_isNumeric PURE_IMPORTS_END */\n\n\n\n\nvar SubscribeOnObservable = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SubscribeOnObservable, _super);\n    function SubscribeOnObservable(source, delayTime, scheduler) {\n        if (delayTime === void 0) {\n            delayTime = 0;\n        }\n        if (scheduler === void 0) {\n            scheduler = __WEBPACK_IMPORTED_MODULE_2__scheduler_asap__[\"a\" /* asap */];\n        }\n        var _this = _super.call(this) || this;\n        _this.source = source;\n        _this.delayTime = delayTime;\n        _this.scheduler = scheduler;\n        if (!__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_isNumeric__[\"a\" /* isNumeric */])(delayTime) || delayTime < 0) {\n            _this.delayTime = 0;\n        }\n        if (!scheduler || typeof scheduler.schedule !== 'function') {\n            _this.scheduler = __WEBPACK_IMPORTED_MODULE_2__scheduler_asap__[\"a\" /* asap */];\n        }\n        return _this;\n    }\n    SubscribeOnObservable.create = function (source, delay, scheduler) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        if (scheduler === void 0) {\n            scheduler = __WEBPACK_IMPORTED_MODULE_2__scheduler_asap__[\"a\" /* asap */];\n        }\n        return new SubscribeOnObservable(source, delay, scheduler);\n    };\n    SubscribeOnObservable.dispatch = function (arg) {\n        var source = arg.source, subscriber = arg.subscriber;\n        return this.add(source.subscribe(subscriber));\n    };\n    SubscribeOnObservable.prototype._subscribe = function (subscriber) {\n        var delay = this.delayTime;\n        var source = this.source;\n        var scheduler = this.scheduler;\n        return scheduler.schedule(SubscribeOnObservable.dispatch, delay, {\n            source: source, subscriber: subscriber\n        });\n    };\n    return SubscribeOnObservable;\n}(__WEBPACK_IMPORTED_MODULE_1__Observable__[\"a\" /* Observable */]));\n\n//# sourceMappingURL=SubscribeOnObservable.js.map\n\n\n/***/ }),\n/* 823 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = bindCallback;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsyncSubject__ = __webpack_require__(184);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__operators_map__ = __webpack_require__(47);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_canReportError__ = __webpack_require__(323);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_isArray__ = __webpack_require__(41);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_isScheduler__ = __webpack_require__(49);\n/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isArray,_util_isScheduler PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction bindCallback(callbackFunc, resultSelector, scheduler) {\n    if (resultSelector) {\n        if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__util_isScheduler__[\"a\" /* isScheduler */])(resultSelector)) {\n            scheduler = resultSelector;\n        }\n        else {\n            return function () {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    args[_i] = arguments[_i];\n                }\n                return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__operators_map__[\"a\" /* map */])(function (args) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_isArray__[\"a\" /* isArray */])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));\n            };\n        }\n    }\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var context = this;\n        var subject;\n        var params = {\n            context: context,\n            subject: subject,\n            callbackFunc: callbackFunc,\n            scheduler: scheduler,\n        };\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n            if (!scheduler) {\n                if (!subject) {\n                    subject = new __WEBPACK_IMPORTED_MODULE_1__AsyncSubject__[\"a\" /* AsyncSubject */]();\n                    var handler = function () {\n                        var innerArgs = [];\n                        for (var _i = 0; _i < arguments.length; _i++) {\n                            innerArgs[_i] = arguments[_i];\n                        }\n                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);\n                        subject.complete();\n                    };\n                    try {\n                        callbackFunc.apply(context, args.concat([handler]));\n                    }\n                    catch (err) {\n                        if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_canReportError__[\"a\" /* canReportError */])(subject)) {\n                            subject.error(err);\n                        }\n                        else {\n                            console.warn(err);\n                        }\n                    }\n                }\n                return subject.subscribe(subscriber);\n            }\n            else {\n                var state = {\n                    args: args, subscriber: subscriber, params: params,\n                };\n                return scheduler.schedule(dispatch, 0, state);\n            }\n        });\n    };\n}\nfunction dispatch(state) {\n    var _this = this;\n    var self = this;\n    var args = state.args, subscriber = state.subscriber, params = state.params;\n    var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler;\n    var subject = params.subject;\n    if (!subject) {\n        subject = params.subject = new __WEBPACK_IMPORTED_MODULE_1__AsyncSubject__[\"a\" /* AsyncSubject */]();\n        var handler = function () {\n            var innerArgs = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                innerArgs[_i] = arguments[_i];\n            }\n            var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;\n            _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));\n        };\n        try {\n            callbackFunc.apply(context, args.concat([handler]));\n        }\n        catch (err) {\n            subject.error(err);\n        }\n    }\n    this.add(subject.subscribe(subscriber));\n}\nfunction dispatchNext(state) {\n    var value = state.value, subject = state.subject;\n    subject.next(value);\n    subject.complete();\n}\nfunction dispatchError(state) {\n    var err = state.err, subject = state.subject;\n    subject.error(err);\n}\n//# sourceMappingURL=bindCallback.js.map\n\n\n/***/ }),\n/* 824 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = bindNodeCallback;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsyncSubject__ = __webpack_require__(184);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__operators_map__ = __webpack_require__(47);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_canReportError__ = __webpack_require__(323);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_isScheduler__ = __webpack_require__(49);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_isArray__ = __webpack_require__(41);\n/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isScheduler,_util_isArray PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction bindNodeCallback(callbackFunc, resultSelector, scheduler) {\n    if (resultSelector) {\n        if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_isScheduler__[\"a\" /* isScheduler */])(resultSelector)) {\n            scheduler = resultSelector;\n        }\n        else {\n            return function () {\n                var args = [];\n                for (var _i = 0; _i < arguments.length; _i++) {\n                    args[_i] = arguments[_i];\n                }\n                return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__operators_map__[\"a\" /* map */])(function (args) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__util_isArray__[\"a\" /* isArray */])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));\n            };\n        }\n    }\n    return function () {\n        var args = [];\n        for (var _i = 0; _i < arguments.length; _i++) {\n            args[_i] = arguments[_i];\n        }\n        var params = {\n            subject: undefined,\n            args: args,\n            callbackFunc: callbackFunc,\n            scheduler: scheduler,\n            context: this,\n        };\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n            var context = params.context;\n            var subject = params.subject;\n            if (!scheduler) {\n                if (!subject) {\n                    subject = params.subject = new __WEBPACK_IMPORTED_MODULE_1__AsyncSubject__[\"a\" /* AsyncSubject */]();\n                    var handler = function () {\n                        var innerArgs = [];\n                        for (var _i = 0; _i < arguments.length; _i++) {\n                            innerArgs[_i] = arguments[_i];\n                        }\n                        var err = innerArgs.shift();\n                        if (err) {\n                            subject.error(err);\n                            return;\n                        }\n                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);\n                        subject.complete();\n                    };\n                    try {\n                        callbackFunc.apply(context, args.concat([handler]));\n                    }\n                    catch (err) {\n                        if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_canReportError__[\"a\" /* canReportError */])(subject)) {\n                            subject.error(err);\n                        }\n                        else {\n                            console.warn(err);\n                        }\n                    }\n                }\n                return subject.subscribe(subscriber);\n            }\n            else {\n                return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context });\n            }\n        });\n    };\n}\nfunction dispatch(state) {\n    var _this = this;\n    var params = state.params, subscriber = state.subscriber, context = state.context;\n    var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler;\n    var subject = params.subject;\n    if (!subject) {\n        subject = params.subject = new __WEBPACK_IMPORTED_MODULE_1__AsyncSubject__[\"a\" /* AsyncSubject */]();\n        var handler = function () {\n            var innerArgs = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                innerArgs[_i] = arguments[_i];\n            }\n            var err = innerArgs.shift();\n            if (err) {\n                _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));\n            }\n            else {\n                var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;\n                _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));\n            }\n        };\n        try {\n            callbackFunc.apply(context, args.concat([handler]));\n        }\n        catch (err) {\n            this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));\n        }\n    }\n    this.add(subject.subscribe(subscriber));\n}\nfunction dispatchNext(arg) {\n    var value = arg.value, subject = arg.subject;\n    subject.next(value);\n    subject.complete();\n}\nfunction dispatchError(arg) {\n    var err = arg.err, subject = arg.subject;\n    subject.error(err);\n}\n//# sourceMappingURL=bindNodeCallback.js.map\n\n\n/***/ }),\n/* 825 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = forkJoin;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isArray__ = __webpack_require__(41);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__empty__ = __webpack_require__(39);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__ = __webpack_require__(14);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__operators_map__ = __webpack_require__(47);\n/** PURE_IMPORTS_START tslib,_Observable,_util_isArray,_empty,_util_subscribeToResult,_OuterSubscriber,_operators_map PURE_IMPORTS_END */\n\n\n\n\n\n\n\nfunction forkJoin() {\n    var sources = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        sources[_i] = arguments[_i];\n    }\n    var resultSelector;\n    if (typeof sources[sources.length - 1] === 'function') {\n        resultSelector = sources.pop();\n    }\n    if (sources.length === 1 && __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isArray__[\"a\" /* isArray */])(sources[0])) {\n        sources = sources[0];\n    }\n    if (sources.length === 0) {\n        return __WEBPACK_IMPORTED_MODULE_3__empty__[\"b\" /* EMPTY */];\n    }\n    if (resultSelector) {\n        return forkJoin(sources).pipe(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__operators_map__[\"a\" /* map */])(function (args) { return resultSelector.apply(void 0, args); }));\n    }\n    return new __WEBPACK_IMPORTED_MODULE_1__Observable__[\"a\" /* Observable */](function (subscriber) {\n        return new ForkJoinSubscriber(subscriber, sources);\n    });\n}\nvar ForkJoinSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](ForkJoinSubscriber, _super);\n    function ForkJoinSubscriber(destination, sources) {\n        var _this = _super.call(this, destination) || this;\n        _this.sources = sources;\n        _this.completed = 0;\n        _this.haveValues = 0;\n        var len = sources.length;\n        _this.values = new Array(len);\n        for (var i = 0; i < len; i++) {\n            var source = sources[i];\n            var innerSubscription = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__[\"a\" /* subscribeToResult */])(_this, source, null, i);\n            if (innerSubscription) {\n                _this.add(innerSubscription);\n            }\n        }\n        return _this;\n    }\n    ForkJoinSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.values[outerIndex] = innerValue;\n        if (!innerSub._hasValue) {\n            innerSub._hasValue = true;\n            this.haveValues++;\n        }\n    };\n    ForkJoinSubscriber.prototype.notifyComplete = function (innerSub) {\n        var _a = this, destination = _a.destination, haveValues = _a.haveValues, values = _a.values;\n        var len = values.length;\n        if (!innerSub._hasValue) {\n            destination.complete();\n            return;\n        }\n        this.completed++;\n        if (this.completed !== len) {\n            return;\n        }\n        if (haveValues === len) {\n            destination.next(values);\n        }\n        destination.complete();\n    };\n    return ForkJoinSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_5__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=forkJoin.js.map\n\n\n/***/ }),\n/* 826 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = fromEvent;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isArray__ = __webpack_require__(41);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isFunction__ = __webpack_require__(155);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__operators_map__ = __webpack_require__(47);\n/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */\n\n\n\n\nvar toString = Object.prototype.toString;\nfunction fromEvent(target, eventName, options, resultSelector) {\n    if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isFunction__[\"a\" /* isFunction */])(options)) {\n        resultSelector = options;\n        options = undefined;\n    }\n    if (resultSelector) {\n        return fromEvent(target, eventName, options).pipe(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__operators_map__[\"a\" /* map */])(function (args) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isArray__[\"a\" /* isArray */])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));\n    }\n    return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n        function handler(e) {\n            if (arguments.length > 1) {\n                subscriber.next(Array.prototype.slice.call(arguments));\n            }\n            else {\n                subscriber.next(e);\n            }\n        }\n        setupSubscription(target, eventName, handler, subscriber, options);\n    });\n}\nfunction setupSubscription(sourceObj, eventName, handler, subscriber, options) {\n    var unsubscribe;\n    if (isEventTarget(sourceObj)) {\n        var source_1 = sourceObj;\n        sourceObj.addEventListener(eventName, handler, options);\n        unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); };\n    }\n    else if (isJQueryStyleEventEmitter(sourceObj)) {\n        var source_2 = sourceObj;\n        sourceObj.on(eventName, handler);\n        unsubscribe = function () { return source_2.off(eventName, handler); };\n    }\n    else if (isNodeStyleEventEmitter(sourceObj)) {\n        var source_3 = sourceObj;\n        sourceObj.addListener(eventName, handler);\n        unsubscribe = function () { return source_3.removeListener(eventName, handler); };\n    }\n    else if (sourceObj && sourceObj.length) {\n        for (var i = 0, len = sourceObj.length; i < len; i++) {\n            setupSubscription(sourceObj[i], eventName, handler, subscriber, options);\n        }\n    }\n    else {\n        throw new TypeError('Invalid event target');\n    }\n    subscriber.add(unsubscribe);\n}\nfunction isNodeStyleEventEmitter(sourceObj) {\n    return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';\n}\nfunction isJQueryStyleEventEmitter(sourceObj) {\n    return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';\n}\nfunction isEventTarget(sourceObj) {\n    return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';\n}\n//# sourceMappingURL=fromEvent.js.map\n\n\n/***/ }),\n/* 827 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = fromEventPattern;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isArray__ = __webpack_require__(41);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isFunction__ = __webpack_require__(155);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__operators_map__ = __webpack_require__(47);\n/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */\n\n\n\n\nfunction fromEventPattern(addHandler, removeHandler, resultSelector) {\n    if (resultSelector) {\n        return fromEventPattern(addHandler, removeHandler).pipe(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__operators_map__[\"a\" /* map */])(function (args) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isArray__[\"a\" /* isArray */])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));\n    }\n    return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n        var handler = function () {\n            var e = [];\n            for (var _i = 0; _i < arguments.length; _i++) {\n                e[_i] = arguments[_i];\n            }\n            return subscriber.next(e.length === 1 ? e[0] : e);\n        };\n        var retValue;\n        try {\n            retValue = addHandler(handler);\n        }\n        catch (err) {\n            subscriber.error(err);\n            return undefined;\n        }\n        if (!__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isFunction__[\"a\" /* isFunction */])(removeHandler)) {\n            return undefined;\n        }\n        return function () { return removeHandler(handler, retValue); };\n    });\n}\n//# sourceMappingURL=fromEventPattern.js.map\n\n\n/***/ }),\n/* 828 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = fromIterable;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscription__ = __webpack_require__(25);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__symbol_iterator__ = __webpack_require__(152);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_subscribeToIterable__ = __webpack_require__(448);\n/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_iterator,_util_subscribeToIterable PURE_IMPORTS_END */\n\n\n\n\nfunction fromIterable(input, scheduler) {\n    if (!input) {\n        throw new Error('Iterable cannot be null');\n    }\n    if (!scheduler) {\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_subscribeToIterable__[\"a\" /* subscribeToIterable */])(input));\n    }\n    else {\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n            var sub = new __WEBPACK_IMPORTED_MODULE_1__Subscription__[\"a\" /* Subscription */]();\n            var iterator;\n            sub.add(function () {\n                if (iterator && typeof iterator.return === 'function') {\n                    iterator.return();\n                }\n            });\n            sub.add(scheduler.schedule(function () {\n                iterator = input[__WEBPACK_IMPORTED_MODULE_2__symbol_iterator__[\"a\" /* iterator */]]();\n                sub.add(scheduler.schedule(function () {\n                    if (subscriber.closed) {\n                        return;\n                    }\n                    var value;\n                    var done;\n                    try {\n                        var result = iterator.next();\n                        value = result.value;\n                        done = result.done;\n                    }\n                    catch (err) {\n                        subscriber.error(err);\n                        return;\n                    }\n                    if (done) {\n                        subscriber.complete();\n                    }\n                    else {\n                        subscriber.next(value);\n                        this.schedule();\n                    }\n                }));\n            }));\n            return sub;\n        });\n    }\n}\n//# sourceMappingURL=fromIterable.js.map\n\n\n/***/ }),\n/* 829 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = fromObservable;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscription__ = __webpack_require__(25);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__symbol_observable__ = __webpack_require__(118);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_subscribeToObservable__ = __webpack_require__(449);\n/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_observable,_util_subscribeToObservable PURE_IMPORTS_END */\n\n\n\n\nfunction fromObservable(input, scheduler) {\n    if (!scheduler) {\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_subscribeToObservable__[\"a\" /* subscribeToObservable */])(input));\n    }\n    else {\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n            var sub = new __WEBPACK_IMPORTED_MODULE_1__Subscription__[\"a\" /* Subscription */]();\n            sub.add(scheduler.schedule(function () {\n                var observable = input[__WEBPACK_IMPORTED_MODULE_2__symbol_observable__[\"a\" /* observable */]]();\n                sub.add(observable.subscribe({\n                    next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); },\n                    error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); },\n                    complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); },\n                }));\n            }));\n            return sub;\n        });\n    }\n}\n//# sourceMappingURL=fromObservable.js.map\n\n\n/***/ }),\n/* 830 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = fromPromise;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscription__ = __webpack_require__(25);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_subscribeToPromise__ = __webpack_require__(450);\n/** PURE_IMPORTS_START _Observable,_Subscription,_util_subscribeToPromise PURE_IMPORTS_END */\n\n\n\nfunction fromPromise(input, scheduler) {\n    if (!scheduler) {\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_subscribeToPromise__[\"a\" /* subscribeToPromise */])(input));\n    }\n    else {\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n            var sub = new __WEBPACK_IMPORTED_MODULE_1__Subscription__[\"a\" /* Subscription */]();\n            sub.add(scheduler.schedule(function () {\n                return input.then(function (value) {\n                    sub.add(scheduler.schedule(function () {\n                        subscriber.next(value);\n                        sub.add(scheduler.schedule(function () { return subscriber.complete(); }));\n                    }));\n                }, function (err) {\n                    sub.add(scheduler.schedule(function () { return subscriber.error(err); }));\n                });\n            }));\n            return sub;\n        });\n    }\n}\n//# sourceMappingURL=fromPromise.js.map\n\n\n/***/ }),\n/* 831 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = generate;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_identity__ = __webpack_require__(119);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isScheduler__ = __webpack_require__(49);\n/** PURE_IMPORTS_START _Observable,_util_identity,_util_isScheduler PURE_IMPORTS_END */\n\n\n\nfunction generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {\n    var resultSelector;\n    var initialState;\n    if (arguments.length == 1) {\n        var options = initialStateOrOptions;\n        initialState = options.initialState;\n        condition = options.condition;\n        iterate = options.iterate;\n        resultSelector = options.resultSelector || __WEBPACK_IMPORTED_MODULE_1__util_identity__[\"a\" /* identity */];\n        scheduler = options.scheduler;\n    }\n    else if (resultSelectorOrObservable === undefined || __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isScheduler__[\"a\" /* isScheduler */])(resultSelectorOrObservable)) {\n        initialState = initialStateOrOptions;\n        resultSelector = __WEBPACK_IMPORTED_MODULE_1__util_identity__[\"a\" /* identity */];\n        scheduler = resultSelectorOrObservable;\n    }\n    else {\n        initialState = initialStateOrOptions;\n        resultSelector = resultSelectorOrObservable;\n    }\n    return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n        var state = initialState;\n        if (scheduler) {\n            return scheduler.schedule(dispatch, 0, {\n                subscriber: subscriber,\n                iterate: iterate,\n                condition: condition,\n                resultSelector: resultSelector,\n                state: state\n            });\n        }\n        do {\n            if (condition) {\n                var conditionResult = void 0;\n                try {\n                    conditionResult = condition(state);\n                }\n                catch (err) {\n                    subscriber.error(err);\n                    return undefined;\n                }\n                if (!conditionResult) {\n                    subscriber.complete();\n                    break;\n                }\n            }\n            var value = void 0;\n            try {\n                value = resultSelector(state);\n            }\n            catch (err) {\n                subscriber.error(err);\n                return undefined;\n            }\n            subscriber.next(value);\n            if (subscriber.closed) {\n                break;\n            }\n            try {\n                state = iterate(state);\n            }\n            catch (err) {\n                subscriber.error(err);\n                return undefined;\n            }\n        } while (true);\n        return undefined;\n    });\n}\nfunction dispatch(state) {\n    var subscriber = state.subscriber, condition = state.condition;\n    if (subscriber.closed) {\n        return undefined;\n    }\n    if (state.needIterate) {\n        try {\n            state.state = state.iterate(state.state);\n        }\n        catch (err) {\n            subscriber.error(err);\n            return undefined;\n        }\n    }\n    else {\n        state.needIterate = true;\n    }\n    if (condition) {\n        var conditionResult = void 0;\n        try {\n            conditionResult = condition(state.state);\n        }\n        catch (err) {\n            subscriber.error(err);\n            return undefined;\n        }\n        if (!conditionResult) {\n            subscriber.complete();\n            return undefined;\n        }\n        if (subscriber.closed) {\n            return undefined;\n        }\n    }\n    var value;\n    try {\n        value = state.resultSelector(state.state);\n    }\n    catch (err) {\n        subscriber.error(err);\n        return undefined;\n    }\n    if (subscriber.closed) {\n        return undefined;\n    }\n    subscriber.next(value);\n    if (subscriber.closed) {\n        return undefined;\n    }\n    return this.schedule(state);\n}\n//# sourceMappingURL=generate.js.map\n\n\n/***/ }),\n/* 832 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = iif;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__defer__ = __webpack_require__(311);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__empty__ = __webpack_require__(39);\n/** PURE_IMPORTS_START _defer,_empty PURE_IMPORTS_END */\n\n\nfunction iif(condition, trueResult, falseResult) {\n    if (trueResult === void 0) {\n        trueResult = __WEBPACK_IMPORTED_MODULE_1__empty__[\"b\" /* EMPTY */];\n    }\n    if (falseResult === void 0) {\n        falseResult = __WEBPACK_IMPORTED_MODULE_1__empty__[\"b\" /* EMPTY */];\n    }\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__defer__[\"a\" /* defer */])(function () { return condition() ? trueResult : falseResult; });\n}\n//# sourceMappingURL=iif.js.map\n\n\n/***/ }),\n/* 833 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = interval;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__scheduler_async__ = __webpack_require__(40);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isNumeric__ = __webpack_require__(191);\n/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric PURE_IMPORTS_END */\n\n\n\nfunction interval(period, scheduler) {\n    if (period === void 0) {\n        period = 0;\n    }\n    if (scheduler === void 0) {\n        scheduler = __WEBPACK_IMPORTED_MODULE_1__scheduler_async__[\"a\" /* async */];\n    }\n    if (!__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isNumeric__[\"a\" /* isNumeric */])(period) || period < 0) {\n        period = 0;\n    }\n    if (!scheduler || typeof scheduler.schedule !== 'function') {\n        scheduler = __WEBPACK_IMPORTED_MODULE_1__scheduler_async__[\"a\" /* async */];\n    }\n    return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n        subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period }));\n        return subscriber;\n    });\n}\nfunction dispatch(state) {\n    var subscriber = state.subscriber, counter = state.counter, period = state.period;\n    subscriber.next(counter);\n    this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period);\n}\n//# sourceMappingURL=interval.js.map\n\n\n/***/ }),\n/* 834 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = onErrorResumeNext;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__from__ = __webpack_require__(62);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isArray__ = __webpack_require__(41);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__empty__ = __webpack_require__(39);\n/** PURE_IMPORTS_START _Observable,_from,_util_isArray,_empty PURE_IMPORTS_END */\n\n\n\n\nfunction onErrorResumeNext() {\n    var sources = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        sources[_i] = arguments[_i];\n    }\n    if (sources.length === 0) {\n        return __WEBPACK_IMPORTED_MODULE_3__empty__[\"b\" /* EMPTY */];\n    }\n    var first = sources[0], remainder = sources.slice(1);\n    if (sources.length === 1 && __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isArray__[\"a\" /* isArray */])(first)) {\n        return onErrorResumeNext.apply(void 0, first);\n    }\n    return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n        var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); };\n        return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__from__[\"a\" /* from */])(first).subscribe({\n            next: function (value) { subscriber.next(value); },\n            error: subNext,\n            complete: subNext,\n        });\n    });\n}\n//# sourceMappingURL=onErrorResumeNext.js.map\n\n\n/***/ }),\n/* 835 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = pairs;\n/* unused harmony export dispatch */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscription__ = __webpack_require__(25);\n/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */\n\n\nfunction pairs(obj, scheduler) {\n    if (!scheduler) {\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n            var keys = Object.keys(obj);\n            for (var i = 0; i < keys.length && !subscriber.closed; i++) {\n                var key = keys[i];\n                if (obj.hasOwnProperty(key)) {\n                    subscriber.next([key, obj[key]]);\n                }\n            }\n            subscriber.complete();\n        });\n    }\n    else {\n        return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n            var keys = Object.keys(obj);\n            var subscription = new __WEBPACK_IMPORTED_MODULE_1__Subscription__[\"a\" /* Subscription */]();\n            subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj }));\n            return subscription;\n        });\n    }\n}\nfunction dispatch(state) {\n    var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj;\n    if (!subscriber.closed) {\n        if (index < keys.length) {\n            var key = keys[index];\n            subscriber.next([key, obj[key]]);\n            subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj }));\n        }\n        else {\n            subscriber.complete();\n        }\n    }\n}\n//# sourceMappingURL=pairs.js.map\n\n\n/***/ }),\n/* 836 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = range;\n/* unused harmony export dispatch */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */\n\nfunction range(start, count, scheduler) {\n    if (start === void 0) {\n        start = 0;\n    }\n    if (count === void 0) {\n        count = 0;\n    }\n    return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n        var index = 0;\n        var current = start;\n        if (scheduler) {\n            return scheduler.schedule(dispatch, 0, {\n                index: index, count: count, start: start, subscriber: subscriber\n            });\n        }\n        else {\n            do {\n                if (index++ >= count) {\n                    subscriber.complete();\n                    break;\n                }\n                subscriber.next(current++);\n                if (subscriber.closed) {\n                    break;\n                }\n            } while (true);\n        }\n        return undefined;\n    });\n}\nfunction dispatch(state) {\n    var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber;\n    if (index >= count) {\n        subscriber.complete();\n        return;\n    }\n    subscriber.next(start);\n    if (subscriber.closed) {\n        return;\n    }\n    state.index = index + 1;\n    state.start = start + 1;\n    this.schedule(state);\n}\n//# sourceMappingURL=range.js.map\n\n\n/***/ }),\n/* 837 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = using;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__from__ = __webpack_require__(62);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__empty__ = __webpack_require__(39);\n/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */\n\n\n\nfunction using(resourceFactory, observableFactory) {\n    return new __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */](function (subscriber) {\n        var resource;\n        try {\n            resource = resourceFactory();\n        }\n        catch (err) {\n            subscriber.error(err);\n            return undefined;\n        }\n        var result;\n        try {\n            result = observableFactory(resource);\n        }\n        catch (err) {\n            subscriber.error(err);\n            return undefined;\n        }\n        var source = result ? __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__from__[\"a\" /* from */])(result) : __WEBPACK_IMPORTED_MODULE_2__empty__[\"b\" /* EMPTY */];\n        var subscription = source.subscribe(subscriber);\n        return function () {\n            subscription.unsubscribe();\n            if (resource) {\n                resource.unsubscribe();\n            }\n        };\n    });\n}\n//# sourceMappingURL=using.js.map\n\n\n/***/ }),\n/* 838 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = auditTime;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__scheduler_async__ = __webpack_require__(40);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__audit__ = __webpack_require__(428);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__observable_timer__ = __webpack_require__(427);\n/** PURE_IMPORTS_START _scheduler_async,_audit,_observable_timer PURE_IMPORTS_END */\n\n\n\nfunction auditTime(duration, scheduler) {\n    if (scheduler === void 0) {\n        scheduler = __WEBPACK_IMPORTED_MODULE_0__scheduler_async__[\"a\" /* async */];\n    }\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__audit__[\"a\" /* audit */])(function () { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__observable_timer__[\"a\" /* timer */])(duration, scheduler); });\n}\n//# sourceMappingURL=auditTime.js.map\n\n\n/***/ }),\n/* 839 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = buffer;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\nfunction buffer(closingNotifier) {\n    return function bufferOperatorFunction(source) {\n        return source.lift(new BufferOperator(closingNotifier));\n    };\n}\nvar BufferOperator = /*@__PURE__*/ (function () {\n    function BufferOperator(closingNotifier) {\n        this.closingNotifier = closingNotifier;\n    }\n    BufferOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));\n    };\n    return BufferOperator;\n}());\nvar BufferSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](BufferSubscriber, _super);\n    function BufferSubscriber(destination, closingNotifier) {\n        var _this = _super.call(this, destination) || this;\n        _this.buffer = [];\n        _this.add(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__[\"a\" /* subscribeToResult */])(_this, closingNotifier));\n        return _this;\n    }\n    BufferSubscriber.prototype._next = function (value) {\n        this.buffer.push(value);\n    };\n    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var buffer = this.buffer;\n        this.buffer = [];\n        this.destination.next(buffer);\n    };\n    return BufferSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=buffer.js.map\n\n\n/***/ }),\n/* 840 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = bufferCount;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction bufferCount(bufferSize, startBufferEvery) {\n    if (startBufferEvery === void 0) {\n        startBufferEvery = null;\n    }\n    return function bufferCountOperatorFunction(source) {\n        return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));\n    };\n}\nvar BufferCountOperator = /*@__PURE__*/ (function () {\n    function BufferCountOperator(bufferSize, startBufferEvery) {\n        this.bufferSize = bufferSize;\n        this.startBufferEvery = startBufferEvery;\n        if (!startBufferEvery || bufferSize === startBufferEvery) {\n            this.subscriberClass = BufferCountSubscriber;\n        }\n        else {\n            this.subscriberClass = BufferSkipCountSubscriber;\n        }\n    }\n    BufferCountOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));\n    };\n    return BufferCountOperator;\n}());\nvar BufferCountSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](BufferCountSubscriber, _super);\n    function BufferCountSubscriber(destination, bufferSize) {\n        var _this = _super.call(this, destination) || this;\n        _this.bufferSize = bufferSize;\n        _this.buffer = [];\n        return _this;\n    }\n    BufferCountSubscriber.prototype._next = function (value) {\n        var buffer = this.buffer;\n        buffer.push(value);\n        if (buffer.length == this.bufferSize) {\n            this.destination.next(buffer);\n            this.buffer = [];\n        }\n    };\n    BufferCountSubscriber.prototype._complete = function () {\n        var buffer = this.buffer;\n        if (buffer.length > 0) {\n            this.destination.next(buffer);\n        }\n        _super.prototype._complete.call(this);\n    };\n    return BufferCountSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\nvar BufferSkipCountSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](BufferSkipCountSubscriber, _super);\n    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {\n        var _this = _super.call(this, destination) || this;\n        _this.bufferSize = bufferSize;\n        _this.startBufferEvery = startBufferEvery;\n        _this.buffers = [];\n        _this.count = 0;\n        return _this;\n    }\n    BufferSkipCountSubscriber.prototype._next = function (value) {\n        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;\n        this.count++;\n        if (count % startBufferEvery === 0) {\n            buffers.push([]);\n        }\n        for (var i = buffers.length; i--;) {\n            var buffer = buffers[i];\n            buffer.push(value);\n            if (buffer.length === bufferSize) {\n                buffers.splice(i, 1);\n                this.destination.next(buffer);\n            }\n        }\n    };\n    BufferSkipCountSubscriber.prototype._complete = function () {\n        var _a = this, buffers = _a.buffers, destination = _a.destination;\n        while (buffers.length > 0) {\n            var buffer = buffers.shift();\n            if (buffer.length > 0) {\n                destination.next(buffer);\n            }\n        }\n        _super.prototype._complete.call(this);\n    };\n    return BufferSkipCountSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=bufferCount.js.map\n\n\n/***/ }),\n/* 841 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = bufferTime;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__scheduler_async__ = __webpack_require__(40);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_isScheduler__ = __webpack_require__(49);\n/** PURE_IMPORTS_START tslib,_scheduler_async,_Subscriber,_util_isScheduler PURE_IMPORTS_END */\n\n\n\n\nfunction bufferTime(bufferTimeSpan) {\n    var length = arguments.length;\n    var scheduler = __WEBPACK_IMPORTED_MODULE_1__scheduler_async__[\"a\" /* async */];\n    if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_isScheduler__[\"a\" /* isScheduler */])(arguments[arguments.length - 1])) {\n        scheduler = arguments[arguments.length - 1];\n        length--;\n    }\n    var bufferCreationInterval = null;\n    if (length >= 2) {\n        bufferCreationInterval = arguments[1];\n    }\n    var maxBufferSize = Number.POSITIVE_INFINITY;\n    if (length >= 3) {\n        maxBufferSize = arguments[2];\n    }\n    return function bufferTimeOperatorFunction(source) {\n        return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler));\n    };\n}\nvar BufferTimeOperator = /*@__PURE__*/ (function () {\n    function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {\n        this.bufferTimeSpan = bufferTimeSpan;\n        this.bufferCreationInterval = bufferCreationInterval;\n        this.maxBufferSize = maxBufferSize;\n        this.scheduler = scheduler;\n    }\n    BufferTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler));\n    };\n    return BufferTimeOperator;\n}());\nvar Context = /*@__PURE__*/ (function () {\n    function Context() {\n        this.buffer = [];\n    }\n    return Context;\n}());\nvar BufferTimeSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](BufferTimeSubscriber, _super);\n    function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.bufferTimeSpan = bufferTimeSpan;\n        _this.bufferCreationInterval = bufferCreationInterval;\n        _this.maxBufferSize = maxBufferSize;\n        _this.scheduler = scheduler;\n        _this.contexts = [];\n        var context = _this.openContext();\n        _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0;\n        if (_this.timespanOnly) {\n            var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan };\n            _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));\n        }\n        else {\n            var closeState = { subscriber: _this, context: context };\n            var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler };\n            _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState));\n            _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState));\n        }\n        return _this;\n    }\n    BufferTimeSubscriber.prototype._next = function (value) {\n        var contexts = this.contexts;\n        var len = contexts.length;\n        var filledBufferContext;\n        for (var i = 0; i < len; i++) {\n            var context_1 = contexts[i];\n            var buffer = context_1.buffer;\n            buffer.push(value);\n            if (buffer.length == this.maxBufferSize) {\n                filledBufferContext = context_1;\n            }\n        }\n        if (filledBufferContext) {\n            this.onBufferFull(filledBufferContext);\n        }\n    };\n    BufferTimeSubscriber.prototype._error = function (err) {\n        this.contexts.length = 0;\n        _super.prototype._error.call(this, err);\n    };\n    BufferTimeSubscriber.prototype._complete = function () {\n        var _a = this, contexts = _a.contexts, destination = _a.destination;\n        while (contexts.length > 0) {\n            var context_2 = contexts.shift();\n            destination.next(context_2.buffer);\n        }\n        _super.prototype._complete.call(this);\n    };\n    BufferTimeSubscriber.prototype._unsubscribe = function () {\n        this.contexts = null;\n    };\n    BufferTimeSubscriber.prototype.onBufferFull = function (context) {\n        this.closeContext(context);\n        var closeAction = context.closeAction;\n        closeAction.unsubscribe();\n        this.remove(closeAction);\n        if (!this.closed && this.timespanOnly) {\n            context = this.openContext();\n            var bufferTimeSpan = this.bufferTimeSpan;\n            var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan };\n            this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));\n        }\n    };\n    BufferTimeSubscriber.prototype.openContext = function () {\n        var context = new Context();\n        this.contexts.push(context);\n        return context;\n    };\n    BufferTimeSubscriber.prototype.closeContext = function (context) {\n        this.destination.next(context.buffer);\n        var contexts = this.contexts;\n        var spliceIndex = contexts ? contexts.indexOf(context) : -1;\n        if (spliceIndex >= 0) {\n            contexts.splice(contexts.indexOf(context), 1);\n        }\n    };\n    return BufferTimeSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_2__Subscriber__[\"a\" /* Subscriber */]));\nfunction dispatchBufferTimeSpanOnly(state) {\n    var subscriber = state.subscriber;\n    var prevContext = state.context;\n    if (prevContext) {\n        subscriber.closeContext(prevContext);\n    }\n    if (!subscriber.closed) {\n        state.context = subscriber.openContext();\n        state.context.closeAction = this.schedule(state, state.bufferTimeSpan);\n    }\n}\nfunction dispatchBufferCreation(state) {\n    var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler;\n    var context = subscriber.openContext();\n    var action = this;\n    if (!subscriber.closed) {\n        subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context }));\n        action.schedule(state, bufferCreationInterval);\n    }\n}\nfunction dispatchBufferClose(arg) {\n    var subscriber = arg.subscriber, context = arg.context;\n    subscriber.closeContext(context);\n}\n//# sourceMappingURL=bufferTime.js.map\n\n\n/***/ }),\n/* 842 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = bufferToggle;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscription__ = __webpack_require__(25);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__ = __webpack_require__(14);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__ = __webpack_require__(13);\n/** PURE_IMPORTS_START tslib,_Subscription,_util_subscribeToResult,_OuterSubscriber PURE_IMPORTS_END */\n\n\n\n\nfunction bufferToggle(openings, closingSelector) {\n    return function bufferToggleOperatorFunction(source) {\n        return source.lift(new BufferToggleOperator(openings, closingSelector));\n    };\n}\nvar BufferToggleOperator = /*@__PURE__*/ (function () {\n    function BufferToggleOperator(openings, closingSelector) {\n        this.openings = openings;\n        this.closingSelector = closingSelector;\n    }\n    BufferToggleOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));\n    };\n    return BufferToggleOperator;\n}());\nvar BufferToggleSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](BufferToggleSubscriber, _super);\n    function BufferToggleSubscriber(destination, openings, closingSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.openings = openings;\n        _this.closingSelector = closingSelector;\n        _this.contexts = [];\n        _this.add(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__[\"a\" /* subscribeToResult */])(_this, openings));\n        return _this;\n    }\n    BufferToggleSubscriber.prototype._next = function (value) {\n        var contexts = this.contexts;\n        var len = contexts.length;\n        for (var i = 0; i < len; i++) {\n            contexts[i].buffer.push(value);\n        }\n    };\n    BufferToggleSubscriber.prototype._error = function (err) {\n        var contexts = this.contexts;\n        while (contexts.length > 0) {\n            var context_1 = contexts.shift();\n            context_1.subscription.unsubscribe();\n            context_1.buffer = null;\n            context_1.subscription = null;\n        }\n        this.contexts = null;\n        _super.prototype._error.call(this, err);\n    };\n    BufferToggleSubscriber.prototype._complete = function () {\n        var contexts = this.contexts;\n        while (contexts.length > 0) {\n            var context_2 = contexts.shift();\n            this.destination.next(context_2.buffer);\n            context_2.subscription.unsubscribe();\n            context_2.buffer = null;\n            context_2.subscription = null;\n        }\n        this.contexts = null;\n        _super.prototype._complete.call(this);\n    };\n    BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);\n    };\n    BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.closeBuffer(innerSub.context);\n    };\n    BufferToggleSubscriber.prototype.openBuffer = function (value) {\n        try {\n            var closingSelector = this.closingSelector;\n            var closingNotifier = closingSelector.call(this, value);\n            if (closingNotifier) {\n                this.trySubscribe(closingNotifier);\n            }\n        }\n        catch (err) {\n            this._error(err);\n        }\n    };\n    BufferToggleSubscriber.prototype.closeBuffer = function (context) {\n        var contexts = this.contexts;\n        if (contexts && context) {\n            var buffer = context.buffer, subscription = context.subscription;\n            this.destination.next(buffer);\n            contexts.splice(contexts.indexOf(context), 1);\n            this.remove(subscription);\n            subscription.unsubscribe();\n        }\n    };\n    BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) {\n        var contexts = this.contexts;\n        var buffer = [];\n        var subscription = new __WEBPACK_IMPORTED_MODULE_1__Subscription__[\"a\" /* Subscription */]();\n        var context = { buffer: buffer, subscription: subscription };\n        contexts.push(context);\n        var innerSubscription = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, closingNotifier, context);\n        if (!innerSubscription || innerSubscription.closed) {\n            this.closeBuffer(context);\n        }\n        else {\n            innerSubscription.context = context;\n            this.add(innerSubscription);\n            subscription.add(innerSubscription);\n        }\n    };\n    return BufferToggleSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=bufferToggle.js.map\n\n\n/***/ }),\n/* 843 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = bufferWhen;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscription__ = __webpack_require__(25);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(57);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_errorObject__ = __webpack_require__(48);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_Subscription,_util_tryCatch,_util_errorObject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction bufferWhen(closingSelector) {\n    return function (source) {\n        return source.lift(new BufferWhenOperator(closingSelector));\n    };\n}\nvar BufferWhenOperator = /*@__PURE__*/ (function () {\n    function BufferWhenOperator(closingSelector) {\n        this.closingSelector = closingSelector;\n    }\n    BufferWhenOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));\n    };\n    return BufferWhenOperator;\n}());\nvar BufferWhenSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](BufferWhenSubscriber, _super);\n    function BufferWhenSubscriber(destination, closingSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.closingSelector = closingSelector;\n        _this.subscribing = false;\n        _this.openBuffer();\n        return _this;\n    }\n    BufferWhenSubscriber.prototype._next = function (value) {\n        this.buffer.push(value);\n    };\n    BufferWhenSubscriber.prototype._complete = function () {\n        var buffer = this.buffer;\n        if (buffer) {\n            this.destination.next(buffer);\n        }\n        _super.prototype._complete.call(this);\n    };\n    BufferWhenSubscriber.prototype._unsubscribe = function () {\n        this.buffer = null;\n        this.subscribing = false;\n    };\n    BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.openBuffer();\n    };\n    BufferWhenSubscriber.prototype.notifyComplete = function () {\n        if (this.subscribing) {\n            this.complete();\n        }\n        else {\n            this.openBuffer();\n        }\n    };\n    BufferWhenSubscriber.prototype.openBuffer = function () {\n        var closingSubscription = this.closingSubscription;\n        if (closingSubscription) {\n            this.remove(closingSubscription);\n            closingSubscription.unsubscribe();\n        }\n        var buffer = this.buffer;\n        if (this.buffer) {\n            this.destination.next(buffer);\n        }\n        this.buffer = [];\n        var closingNotifier = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_tryCatch__[\"a\" /* tryCatch */])(this.closingSelector)();\n        if (closingNotifier === __WEBPACK_IMPORTED_MODULE_3__util_errorObject__[\"a\" /* errorObject */]) {\n            this.error(__WEBPACK_IMPORTED_MODULE_3__util_errorObject__[\"a\" /* errorObject */].e);\n        }\n        else {\n            closingSubscription = new __WEBPACK_IMPORTED_MODULE_1__Subscription__[\"a\" /* Subscription */]();\n            this.closingSubscription = closingSubscription;\n            this.add(closingSubscription);\n            this.subscribing = true;\n            closingSubscription.add(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, closingNotifier));\n            this.subscribing = false;\n        }\n    };\n    return BufferWhenSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=bufferWhen.js.map\n\n\n/***/ }),\n/* 844 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = catchError;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__InnerSubscriber__ = __webpack_require__(84);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\nfunction catchError(selector) {\n    return function catchErrorOperatorFunction(source) {\n        var operator = new CatchOperator(selector);\n        var caught = source.lift(operator);\n        return (operator.caught = caught);\n    };\n}\nvar CatchOperator = /*@__PURE__*/ (function () {\n    function CatchOperator(selector) {\n        this.selector = selector;\n    }\n    CatchOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));\n    };\n    return CatchOperator;\n}());\nvar CatchSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](CatchSubscriber, _super);\n    function CatchSubscriber(destination, selector, caught) {\n        var _this = _super.call(this, destination) || this;\n        _this.selector = selector;\n        _this.caught = caught;\n        return _this;\n    }\n    CatchSubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var result = void 0;\n            try {\n                result = this.selector(err, this.caught);\n            }\n            catch (err2) {\n                _super.prototype.error.call(this, err2);\n                return;\n            }\n            this._unsubscribeAndRecycle();\n            var innerSubscriber = new __WEBPACK_IMPORTED_MODULE_2__InnerSubscriber__[\"a\" /* InnerSubscriber */](this, undefined, undefined);\n            this.add(innerSubscriber);\n            __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, result, undefined, undefined, innerSubscriber);\n        }\n    };\n    return CatchSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=catchError.js.map\n\n\n/***/ }),\n/* 845 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = combineAll;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_combineLatest__ = __webpack_require__(310);\n/** PURE_IMPORTS_START _observable_combineLatest PURE_IMPORTS_END */\n\nfunction combineAll(project) {\n    return function (source) { return source.lift(new __WEBPACK_IMPORTED_MODULE_0__observable_combineLatest__[\"b\" /* CombineLatestOperator */](project)); };\n}\n//# sourceMappingURL=combineAll.js.map\n\n\n/***/ }),\n/* 846 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = combineLatest;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_isArray__ = __webpack_require__(41);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__observable_combineLatest__ = __webpack_require__(310);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__observable_from__ = __webpack_require__(62);\n/** PURE_IMPORTS_START _util_isArray,_observable_combineLatest,_observable_from PURE_IMPORTS_END */\n\n\n\nvar none = {};\nfunction combineLatest() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    var project = null;\n    if (typeof observables[observables.length - 1] === 'function') {\n        project = observables.pop();\n    }\n    if (observables.length === 1 && __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__util_isArray__[\"a\" /* isArray */])(observables[0])) {\n        observables = observables[0].slice();\n    }\n    return function (source) { return source.lift.call(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__observable_from__[\"a\" /* from */])([source].concat(observables)), new __WEBPACK_IMPORTED_MODULE_1__observable_combineLatest__[\"b\" /* CombineLatestOperator */](project)); };\n}\n//# sourceMappingURL=combineLatest.js.map\n\n\n/***/ }),\n/* 847 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = concat;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_concat__ = __webpack_require__(187);\n/** PURE_IMPORTS_START _observable_concat PURE_IMPORTS_END */\n\nfunction concat() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    return function (source) { return source.lift.call(__WEBPACK_IMPORTED_MODULE_0__observable_concat__[\"a\" /* concat */].apply(void 0, [source].concat(observables))); };\n}\n//# sourceMappingURL=concat.js.map\n\n\n/***/ }),\n/* 848 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = concatMapTo;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__concatMap__ = __webpack_require__(430);\n/** PURE_IMPORTS_START _concatMap PURE_IMPORTS_END */\n\nfunction concatMapTo(innerObservable, resultSelector) {\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__concatMap__[\"a\" /* concatMap */])(function () { return innerObservable; }, resultSelector);\n}\n//# sourceMappingURL=concatMapTo.js.map\n\n\n/***/ }),\n/* 849 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = count;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction count(predicate) {\n    return function (source) { return source.lift(new CountOperator(predicate, source)); };\n}\nvar CountOperator = /*@__PURE__*/ (function () {\n    function CountOperator(predicate, source) {\n        this.predicate = predicate;\n        this.source = source;\n    }\n    CountOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));\n    };\n    return CountOperator;\n}());\nvar CountSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](CountSubscriber, _super);\n    function CountSubscriber(destination, predicate, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.source = source;\n        _this.count = 0;\n        _this.index = 0;\n        return _this;\n    }\n    CountSubscriber.prototype._next = function (value) {\n        if (this.predicate) {\n            this._tryPredicate(value);\n        }\n        else {\n            this.count++;\n        }\n    };\n    CountSubscriber.prototype._tryPredicate = function (value) {\n        var result;\n        try {\n            result = this.predicate(value, this.index++, this.source);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (result) {\n            this.count++;\n        }\n    };\n    CountSubscriber.prototype._complete = function () {\n        this.destination.next(this.count);\n        this.destination.complete();\n    };\n    return CountSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=count.js.map\n\n\n/***/ }),\n/* 850 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = debounce;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\nfunction debounce(durationSelector) {\n    return function (source) { return source.lift(new DebounceOperator(durationSelector)); };\n}\nvar DebounceOperator = /*@__PURE__*/ (function () {\n    function DebounceOperator(durationSelector) {\n        this.durationSelector = durationSelector;\n    }\n    DebounceOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));\n    };\n    return DebounceOperator;\n}());\nvar DebounceSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](DebounceSubscriber, _super);\n    function DebounceSubscriber(destination, durationSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.durationSelector = durationSelector;\n        _this.hasValue = false;\n        _this.durationSubscription = null;\n        return _this;\n    }\n    DebounceSubscriber.prototype._next = function (value) {\n        try {\n            var result = this.durationSelector.call(this, value);\n            if (result) {\n                this._tryNext(value, result);\n            }\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n    };\n    DebounceSubscriber.prototype._complete = function () {\n        this.emitValue();\n        this.destination.complete();\n    };\n    DebounceSubscriber.prototype._tryNext = function (value, duration) {\n        var subscription = this.durationSubscription;\n        this.value = value;\n        this.hasValue = true;\n        if (subscription) {\n            subscription.unsubscribe();\n            this.remove(subscription);\n        }\n        subscription = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, duration);\n        if (subscription && !subscription.closed) {\n            this.add(this.durationSubscription = subscription);\n        }\n    };\n    DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.emitValue();\n    };\n    DebounceSubscriber.prototype.notifyComplete = function () {\n        this.emitValue();\n    };\n    DebounceSubscriber.prototype.emitValue = function () {\n        if (this.hasValue) {\n            var value = this.value;\n            var subscription = this.durationSubscription;\n            if (subscription) {\n                this.durationSubscription = null;\n                subscription.unsubscribe();\n                this.remove(subscription);\n            }\n            this.value = null;\n            this.hasValue = false;\n            _super.prototype._next.call(this, value);\n        }\n    };\n    return DebounceSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=debounce.js.map\n\n\n/***/ }),\n/* 851 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = debounceTime;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__scheduler_async__ = __webpack_require__(40);\n/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */\n\n\n\nfunction debounceTime(dueTime, scheduler) {\n    if (scheduler === void 0) {\n        scheduler = __WEBPACK_IMPORTED_MODULE_2__scheduler_async__[\"a\" /* async */];\n    }\n    return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); };\n}\nvar DebounceTimeOperator = /*@__PURE__*/ (function () {\n    function DebounceTimeOperator(dueTime, scheduler) {\n        this.dueTime = dueTime;\n        this.scheduler = scheduler;\n    }\n    DebounceTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));\n    };\n    return DebounceTimeOperator;\n}());\nvar DebounceTimeSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](DebounceTimeSubscriber, _super);\n    function DebounceTimeSubscriber(destination, dueTime, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.dueTime = dueTime;\n        _this.scheduler = scheduler;\n        _this.debouncedSubscription = null;\n        _this.lastValue = null;\n        _this.hasValue = false;\n        return _this;\n    }\n    DebounceTimeSubscriber.prototype._next = function (value) {\n        this.clearDebounce();\n        this.lastValue = value;\n        this.hasValue = true;\n        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));\n    };\n    DebounceTimeSubscriber.prototype._complete = function () {\n        this.debouncedNext();\n        this.destination.complete();\n    };\n    DebounceTimeSubscriber.prototype.debouncedNext = function () {\n        this.clearDebounce();\n        if (this.hasValue) {\n            var lastValue = this.lastValue;\n            this.lastValue = null;\n            this.hasValue = false;\n            this.destination.next(lastValue);\n        }\n    };\n    DebounceTimeSubscriber.prototype.clearDebounce = function () {\n        var debouncedSubscription = this.debouncedSubscription;\n        if (debouncedSubscription !== null) {\n            this.remove(debouncedSubscription);\n            debouncedSubscription.unsubscribe();\n            this.debouncedSubscription = null;\n        }\n    };\n    return DebounceTimeSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\nfunction dispatchNext(subscriber) {\n    subscriber.debouncedNext();\n}\n//# sourceMappingURL=debounceTime.js.map\n\n\n/***/ }),\n/* 852 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = delay;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__scheduler_async__ = __webpack_require__(40);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isDate__ = __webpack_require__(443);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__Notification__ = __webpack_require__(185);\n/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */\n\n\n\n\n\nfunction delay(delay, scheduler) {\n    if (scheduler === void 0) {\n        scheduler = __WEBPACK_IMPORTED_MODULE_1__scheduler_async__[\"a\" /* async */];\n    }\n    var absoluteDelay = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isDate__[\"a\" /* isDate */])(delay);\n    var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);\n    return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); };\n}\nvar DelayOperator = /*@__PURE__*/ (function () {\n    function DelayOperator(delay, scheduler) {\n        this.delay = delay;\n        this.scheduler = scheduler;\n    }\n    DelayOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));\n    };\n    return DelayOperator;\n}());\nvar DelaySubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](DelaySubscriber, _super);\n    function DelaySubscriber(destination, delay, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.delay = delay;\n        _this.scheduler = scheduler;\n        _this.queue = [];\n        _this.active = false;\n        _this.errored = false;\n        return _this;\n    }\n    DelaySubscriber.dispatch = function (state) {\n        var source = state.source;\n        var queue = source.queue;\n        var scheduler = state.scheduler;\n        var destination = state.destination;\n        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {\n            queue.shift().notification.observe(destination);\n        }\n        if (queue.length > 0) {\n            var delay_1 = Math.max(0, queue[0].time - scheduler.now());\n            this.schedule(state, delay_1);\n        }\n        else {\n            this.unsubscribe();\n            source.active = false;\n        }\n    };\n    DelaySubscriber.prototype._schedule = function (scheduler) {\n        this.active = true;\n        var destination = this.destination;\n        destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {\n            source: this, destination: this.destination, scheduler: scheduler\n        }));\n    };\n    DelaySubscriber.prototype.scheduleNotification = function (notification) {\n        if (this.errored === true) {\n            return;\n        }\n        var scheduler = this.scheduler;\n        var message = new DelayMessage(scheduler.now() + this.delay, notification);\n        this.queue.push(message);\n        if (this.active === false) {\n            this._schedule(scheduler);\n        }\n    };\n    DelaySubscriber.prototype._next = function (value) {\n        this.scheduleNotification(__WEBPACK_IMPORTED_MODULE_4__Notification__[\"a\" /* Notification */].createNext(value));\n    };\n    DelaySubscriber.prototype._error = function (err) {\n        this.errored = true;\n        this.queue = [];\n        this.destination.error(err);\n        this.unsubscribe();\n    };\n    DelaySubscriber.prototype._complete = function () {\n        this.scheduleNotification(__WEBPACK_IMPORTED_MODULE_4__Notification__[\"a\" /* Notification */].createComplete());\n        this.unsubscribe();\n    };\n    return DelaySubscriber;\n}(__WEBPACK_IMPORTED_MODULE_3__Subscriber__[\"a\" /* Subscriber */]));\nvar DelayMessage = /*@__PURE__*/ (function () {\n    function DelayMessage(time, notification) {\n        this.time = time;\n        this.notification = notification;\n    }\n    return DelayMessage;\n}());\n//# sourceMappingURL=delay.js.map\n\n\n/***/ }),\n/* 853 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = delayWhen;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Observable__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_Subscriber,_Observable,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\n\nfunction delayWhen(delayDurationSelector, subscriptionDelay) {\n    if (subscriptionDelay) {\n        return function (source) {\n            return new SubscriptionDelayObservable(source, subscriptionDelay)\n                .lift(new DelayWhenOperator(delayDurationSelector));\n        };\n    }\n    return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); };\n}\nvar DelayWhenOperator = /*@__PURE__*/ (function () {\n    function DelayWhenOperator(delayDurationSelector) {\n        this.delayDurationSelector = delayDurationSelector;\n    }\n    DelayWhenOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));\n    };\n    return DelayWhenOperator;\n}());\nvar DelayWhenSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](DelayWhenSubscriber, _super);\n    function DelayWhenSubscriber(destination, delayDurationSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.delayDurationSelector = delayDurationSelector;\n        _this.completed = false;\n        _this.delayNotifierSubscriptions = [];\n        _this.index = 0;\n        return _this;\n    }\n    DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.destination.next(outerValue);\n        this.removeSubscription(innerSub);\n        this.tryComplete();\n    };\n    DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) {\n        this._error(error);\n    };\n    DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) {\n        var value = this.removeSubscription(innerSub);\n        if (value) {\n            this.destination.next(value);\n        }\n        this.tryComplete();\n    };\n    DelayWhenSubscriber.prototype._next = function (value) {\n        var index = this.index++;\n        try {\n            var delayNotifier = this.delayDurationSelector(value, index);\n            if (delayNotifier) {\n                this.tryDelay(delayNotifier, value);\n            }\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n    };\n    DelayWhenSubscriber.prototype._complete = function () {\n        this.completed = true;\n        this.tryComplete();\n        this.unsubscribe();\n    };\n    DelayWhenSubscriber.prototype.removeSubscription = function (subscription) {\n        subscription.unsubscribe();\n        var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);\n        if (subscriptionIdx !== -1) {\n            this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);\n        }\n        return subscription.outerValue;\n    };\n    DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) {\n        var notifierSubscription = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, delayNotifier, value);\n        if (notifierSubscription && !notifierSubscription.closed) {\n            var destination = this.destination;\n            destination.add(notifierSubscription);\n            this.delayNotifierSubscriptions.push(notifierSubscription);\n        }\n    };\n    DelayWhenSubscriber.prototype.tryComplete = function () {\n        if (this.completed && this.delayNotifierSubscriptions.length === 0) {\n            this.destination.complete();\n        }\n    };\n    return DelayWhenSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\nvar SubscriptionDelayObservable = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SubscriptionDelayObservable, _super);\n    function SubscriptionDelayObservable(source, subscriptionDelay) {\n        var _this = _super.call(this) || this;\n        _this.source = source;\n        _this.subscriptionDelay = subscriptionDelay;\n        return _this;\n    }\n    SubscriptionDelayObservable.prototype._subscribe = function (subscriber) {\n        this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));\n    };\n    return SubscriptionDelayObservable;\n}(__WEBPACK_IMPORTED_MODULE_2__Observable__[\"a\" /* Observable */]));\nvar SubscriptionDelaySubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SubscriptionDelaySubscriber, _super);\n    function SubscriptionDelaySubscriber(parent, source) {\n        var _this = _super.call(this) || this;\n        _this.parent = parent;\n        _this.source = source;\n        _this.sourceSubscribed = false;\n        return _this;\n    }\n    SubscriptionDelaySubscriber.prototype._next = function (unused) {\n        this.subscribeToSource();\n    };\n    SubscriptionDelaySubscriber.prototype._error = function (err) {\n        this.unsubscribe();\n        this.parent.error(err);\n    };\n    SubscriptionDelaySubscriber.prototype._complete = function () {\n        this.unsubscribe();\n        this.subscribeToSource();\n    };\n    SubscriptionDelaySubscriber.prototype.subscribeToSource = function () {\n        if (!this.sourceSubscribed) {\n            this.sourceSubscribed = true;\n            this.unsubscribe();\n            this.source.subscribe(this.parent);\n        }\n    };\n    return SubscriptionDelaySubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=delayWhen.js.map\n\n\n/***/ }),\n/* 854 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = dematerialize;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction dematerialize() {\n    return function dematerializeOperatorFunction(source) {\n        return source.lift(new DeMaterializeOperator());\n    };\n}\nvar DeMaterializeOperator = /*@__PURE__*/ (function () {\n    function DeMaterializeOperator() {\n    }\n    DeMaterializeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DeMaterializeSubscriber(subscriber));\n    };\n    return DeMaterializeOperator;\n}());\nvar DeMaterializeSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](DeMaterializeSubscriber, _super);\n    function DeMaterializeSubscriber(destination) {\n        return _super.call(this, destination) || this;\n    }\n    DeMaterializeSubscriber.prototype._next = function (value) {\n        value.observe(this.destination);\n    };\n    return DeMaterializeSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=dematerialize.js.map\n\n\n/***/ }),\n/* 855 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = distinct;\n/* unused harmony export DistinctSubscriber */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\nfunction distinct(keySelector, flushes) {\n    return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); };\n}\nvar DistinctOperator = /*@__PURE__*/ (function () {\n    function DistinctOperator(keySelector, flushes) {\n        this.keySelector = keySelector;\n        this.flushes = flushes;\n    }\n    DistinctOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));\n    };\n    return DistinctOperator;\n}());\nvar DistinctSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](DistinctSubscriber, _super);\n    function DistinctSubscriber(destination, keySelector, flushes) {\n        var _this = _super.call(this, destination) || this;\n        _this.keySelector = keySelector;\n        _this.values = new Set();\n        if (flushes) {\n            _this.add(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__[\"a\" /* subscribeToResult */])(_this, flushes));\n        }\n        return _this;\n    }\n    DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.values.clear();\n    };\n    DistinctSubscriber.prototype.notifyError = function (error, innerSub) {\n        this._error(error);\n    };\n    DistinctSubscriber.prototype._next = function (value) {\n        if (this.keySelector) {\n            this._useKeySelector(value);\n        }\n        else {\n            this._finalizeNext(value, value);\n        }\n    };\n    DistinctSubscriber.prototype._useKeySelector = function (value) {\n        var key;\n        var destination = this.destination;\n        try {\n            key = this.keySelector(value);\n        }\n        catch (err) {\n            destination.error(err);\n            return;\n        }\n        this._finalizeNext(key, value);\n    };\n    DistinctSubscriber.prototype._finalizeNext = function (key, value) {\n        var values = this.values;\n        if (!values.has(key)) {\n            values.add(key);\n            this.destination.next(value);\n        }\n    };\n    return DistinctSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n\n//# sourceMappingURL=distinct.js.map\n\n\n/***/ }),\n/* 856 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = distinctUntilKeyChanged;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__distinctUntilChanged__ = __webpack_require__(431);\n/** PURE_IMPORTS_START _distinctUntilChanged PURE_IMPORTS_END */\n\nfunction distinctUntilKeyChanged(key, compare) {\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__distinctUntilChanged__[\"a\" /* distinctUntilChanged */])(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; });\n}\n//# sourceMappingURL=distinctUntilKeyChanged.js.map\n\n\n/***/ }),\n/* 857 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = elementAt;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_ArgumentOutOfRangeError__ = __webpack_require__(153);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__filter__ = __webpack_require__(148);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__throwIfEmpty__ = __webpack_require__(189);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__defaultIfEmpty__ = __webpack_require__(147);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__take__ = __webpack_require__(320);\n/** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */\n\n\n\n\n\nfunction elementAt(index, defaultValue) {\n    if (index < 0) {\n        throw new __WEBPACK_IMPORTED_MODULE_0__util_ArgumentOutOfRangeError__[\"a\" /* ArgumentOutOfRangeError */]();\n    }\n    var hasDefaultValue = arguments.length >= 2;\n    return function (source) {\n        return source.pipe(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__filter__[\"a\" /* filter */])(function (v, i) { return i === index; }), __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__take__[\"a\" /* take */])(1), hasDefaultValue\n            ? __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__defaultIfEmpty__[\"a\" /* defaultIfEmpty */])(defaultValue)\n            : __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__throwIfEmpty__[\"a\" /* throwIfEmpty */])(function () { return new __WEBPACK_IMPORTED_MODULE_0__util_ArgumentOutOfRangeError__[\"a\" /* ArgumentOutOfRangeError */](); }));\n    };\n}\n//# sourceMappingURL=elementAt.js.map\n\n\n/***/ }),\n/* 858 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = endWith;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_fromArray__ = __webpack_require__(85);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__observable_scalar__ = __webpack_require__(313);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__observable_empty__ = __webpack_require__(39);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__observable_concat__ = __webpack_require__(187);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_isScheduler__ = __webpack_require__(49);\n/** PURE_IMPORTS_START _observable_fromArray,_observable_scalar,_observable_empty,_observable_concat,_util_isScheduler PURE_IMPORTS_END */\n\n\n\n\n\nfunction endWith() {\n    var array = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        array[_i] = arguments[_i];\n    }\n    return function (source) {\n        var scheduler = array[array.length - 1];\n        if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_isScheduler__[\"a\" /* isScheduler */])(scheduler)) {\n            array.pop();\n        }\n        else {\n            scheduler = null;\n        }\n        var len = array.length;\n        if (len === 1 && !scheduler) {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__observable_concat__[\"a\" /* concat */])(source, __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__observable_scalar__[\"a\" /* scalar */])(array[0]));\n        }\n        else if (len > 0) {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__observable_concat__[\"a\" /* concat */])(source, __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__observable_fromArray__[\"a\" /* fromArray */])(array, scheduler));\n        }\n        else {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__observable_concat__[\"a\" /* concat */])(source, __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__observable_empty__[\"a\" /* empty */])(scheduler));\n        }\n    };\n}\n//# sourceMappingURL=endWith.js.map\n\n\n/***/ }),\n/* 859 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = every;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction every(predicate, thisArg) {\n    return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); };\n}\nvar EveryOperator = /*@__PURE__*/ (function () {\n    function EveryOperator(predicate, thisArg, source) {\n        this.predicate = predicate;\n        this.thisArg = thisArg;\n        this.source = source;\n    }\n    EveryOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));\n    };\n    return EveryOperator;\n}());\nvar EverySubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](EverySubscriber, _super);\n    function EverySubscriber(destination, predicate, thisArg, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.thisArg = thisArg;\n        _this.source = source;\n        _this.index = 0;\n        _this.thisArg = thisArg || _this;\n        return _this;\n    }\n    EverySubscriber.prototype.notifyComplete = function (everyValueMatch) {\n        this.destination.next(everyValueMatch);\n        this.destination.complete();\n    };\n    EverySubscriber.prototype._next = function (value) {\n        var result = false;\n        try {\n            result = this.predicate.call(this.thisArg, value, this.index++, this.source);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        if (!result) {\n            this.notifyComplete(false);\n        }\n    };\n    EverySubscriber.prototype._complete = function () {\n        this.notifyComplete(true);\n    };\n    return EverySubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=every.js.map\n\n\n/***/ }),\n/* 860 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = exhaust;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\nfunction exhaust() {\n    return function (source) { return source.lift(new SwitchFirstOperator()); };\n}\nvar SwitchFirstOperator = /*@__PURE__*/ (function () {\n    function SwitchFirstOperator() {\n    }\n    SwitchFirstOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SwitchFirstSubscriber(subscriber));\n    };\n    return SwitchFirstOperator;\n}());\nvar SwitchFirstSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SwitchFirstSubscriber, _super);\n    function SwitchFirstSubscriber(destination) {\n        var _this = _super.call(this, destination) || this;\n        _this.hasCompleted = false;\n        _this.hasSubscription = false;\n        return _this;\n    }\n    SwitchFirstSubscriber.prototype._next = function (value) {\n        if (!this.hasSubscription) {\n            this.hasSubscription = true;\n            this.add(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, value));\n        }\n    };\n    SwitchFirstSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (!this.hasSubscription) {\n            this.destination.complete();\n        }\n    };\n    SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.remove(innerSub);\n        this.hasSubscription = false;\n        if (this.hasCompleted) {\n            this.destination.complete();\n        }\n    };\n    return SwitchFirstSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=exhaust.js.map\n\n\n/***/ }),\n/* 861 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = exhaustMap;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__InnerSubscriber__ = __webpack_require__(84);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_subscribeToResult__ = __webpack_require__(14);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__map__ = __webpack_require__(47);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__observable_from__ = __webpack_require__(62);\n/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction exhaustMap(project, resultSelector) {\n    if (resultSelector) {\n        return function (source) { return source.pipe(exhaustMap(function (a, i) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__observable_from__[\"a\" /* from */])(project(a, i)).pipe(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__map__[\"a\" /* map */])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };\n    }\n    return function (source) {\n        return source.lift(new ExhauseMapOperator(project));\n    };\n}\nvar ExhauseMapOperator = /*@__PURE__*/ (function () {\n    function ExhauseMapOperator(project) {\n        this.project = project;\n    }\n    ExhauseMapOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project));\n    };\n    return ExhauseMapOperator;\n}());\nvar ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](ExhaustMapSubscriber, _super);\n    function ExhaustMapSubscriber(destination, project) {\n        var _this = _super.call(this, destination) || this;\n        _this.project = project;\n        _this.hasSubscription = false;\n        _this.hasCompleted = false;\n        _this.index = 0;\n        return _this;\n    }\n    ExhaustMapSubscriber.prototype._next = function (value) {\n        if (!this.hasSubscription) {\n            this.tryNext(value);\n        }\n    };\n    ExhaustMapSubscriber.prototype.tryNext = function (value) {\n        var result;\n        var index = this.index++;\n        try {\n            result = this.project(value, index);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.hasSubscription = true;\n        this._innerSub(result, value, index);\n    };\n    ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) {\n        var innerSubscriber = new __WEBPACK_IMPORTED_MODULE_2__InnerSubscriber__[\"a\" /* InnerSubscriber */](this, undefined, undefined);\n        var destination = this.destination;\n        destination.add(innerSubscriber);\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, result, value, index, innerSubscriber);\n    };\n    ExhaustMapSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (!this.hasSubscription) {\n            this.destination.complete();\n        }\n        this.unsubscribe();\n    };\n    ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.destination.next(innerValue);\n    };\n    ExhaustMapSubscriber.prototype.notifyError = function (err) {\n        this.destination.error(err);\n    };\n    ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) {\n        var destination = this.destination;\n        destination.remove(innerSub);\n        this.hasSubscription = false;\n        if (this.hasCompleted) {\n            this.destination.complete();\n        }\n    };\n    return ExhaustMapSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=exhaustMap.js.map\n\n\n/***/ }),\n/* 862 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = expand;\n/* unused harmony export ExpandOperator */\n/* unused harmony export ExpandSubscriber */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_tryCatch__ = __webpack_require__(57);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_errorObject__ = __webpack_require__(48);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_util_tryCatch,_util_errorObject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\n\nfunction expand(project, concurrent, scheduler) {\n    if (concurrent === void 0) {\n        concurrent = Number.POSITIVE_INFINITY;\n    }\n    if (scheduler === void 0) {\n        scheduler = undefined;\n    }\n    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;\n    return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); };\n}\nvar ExpandOperator = /*@__PURE__*/ (function () {\n    function ExpandOperator(project, concurrent, scheduler) {\n        this.project = project;\n        this.concurrent = concurrent;\n        this.scheduler = scheduler;\n    }\n    ExpandOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));\n    };\n    return ExpandOperator;\n}());\n\nvar ExpandSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](ExpandSubscriber, _super);\n    function ExpandSubscriber(destination, project, concurrent, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.project = project;\n        _this.concurrent = concurrent;\n        _this.scheduler = scheduler;\n        _this.index = 0;\n        _this.active = 0;\n        _this.hasCompleted = false;\n        if (concurrent < Number.POSITIVE_INFINITY) {\n            _this.buffer = [];\n        }\n        return _this;\n    }\n    ExpandSubscriber.dispatch = function (arg) {\n        var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;\n        subscriber.subscribeToProjection(result, value, index);\n    };\n    ExpandSubscriber.prototype._next = function (value) {\n        var destination = this.destination;\n        if (destination.closed) {\n            this._complete();\n            return;\n        }\n        var index = this.index++;\n        if (this.active < this.concurrent) {\n            destination.next(value);\n            var result = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_tryCatch__[\"a\" /* tryCatch */])(this.project)(value, index);\n            if (result === __WEBPACK_IMPORTED_MODULE_2__util_errorObject__[\"a\" /* errorObject */]) {\n                destination.error(__WEBPACK_IMPORTED_MODULE_2__util_errorObject__[\"a\" /* errorObject */].e);\n            }\n            else if (!this.scheduler) {\n                this.subscribeToProjection(result, value, index);\n            }\n            else {\n                var state = { subscriber: this, result: result, value: value, index: index };\n                var destination_1 = this.destination;\n                destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));\n            }\n        }\n        else {\n            this.buffer.push(value);\n        }\n    };\n    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {\n        this.active++;\n        var destination = this.destination;\n        destination.add(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, result, value, index));\n    };\n    ExpandSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (this.hasCompleted && this.active === 0) {\n            this.destination.complete();\n        }\n        this.unsubscribe();\n    };\n    ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this._next(innerValue);\n    };\n    ExpandSubscriber.prototype.notifyComplete = function (innerSub) {\n        var buffer = this.buffer;\n        var destination = this.destination;\n        destination.remove(innerSub);\n        this.active--;\n        if (buffer && buffer.length > 0) {\n            this._next(buffer.shift());\n        }\n        if (this.hasCompleted && this.active === 0) {\n            this.destination.complete();\n        }\n    };\n    return ExpandSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n\n//# sourceMappingURL=expand.js.map\n\n\n/***/ }),\n/* 863 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = finalize;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subscription__ = __webpack_require__(25);\n/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription PURE_IMPORTS_END */\n\n\n\nfunction finalize(callback) {\n    return function (source) { return source.lift(new FinallyOperator(callback)); };\n}\nvar FinallyOperator = /*@__PURE__*/ (function () {\n    function FinallyOperator(callback) {\n        this.callback = callback;\n    }\n    FinallyOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new FinallySubscriber(subscriber, this.callback));\n    };\n    return FinallyOperator;\n}());\nvar FinallySubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](FinallySubscriber, _super);\n    function FinallySubscriber(destination, callback) {\n        var _this = _super.call(this, destination) || this;\n        _this.add(new __WEBPACK_IMPORTED_MODULE_2__Subscription__[\"a\" /* Subscription */](callback));\n        return _this;\n    }\n    return FinallySubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=finalize.js.map\n\n\n/***/ }),\n/* 864 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = findIndex;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__operators_find__ = __webpack_require__(432);\n/** PURE_IMPORTS_START _operators_find PURE_IMPORTS_END */\n\nfunction findIndex(predicate, thisArg) {\n    return function (source) { return source.lift(new __WEBPACK_IMPORTED_MODULE_0__operators_find__[\"b\" /* FindValueOperator */](predicate, source, true, thisArg)); };\n}\n//# sourceMappingURL=findIndex.js.map\n\n\n/***/ }),\n/* 865 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = first;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_EmptyError__ = __webpack_require__(154);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__filter__ = __webpack_require__(148);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__take__ = __webpack_require__(320);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__defaultIfEmpty__ = __webpack_require__(147);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__throwIfEmpty__ = __webpack_require__(189);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_identity__ = __webpack_require__(119);\n/** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction first(predicate, defaultValue) {\n    var hasDefaultValue = arguments.length >= 2;\n    return function (source) { return source.pipe(predicate ? __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__filter__[\"a\" /* filter */])(function (v, i) { return predicate(v, i, source); }) : __WEBPACK_IMPORTED_MODULE_5__util_identity__[\"a\" /* identity */], __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__take__[\"a\" /* take */])(1), hasDefaultValue ? __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__defaultIfEmpty__[\"a\" /* defaultIfEmpty */])(defaultValue) : __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__throwIfEmpty__[\"a\" /* throwIfEmpty */])(function () { return new __WEBPACK_IMPORTED_MODULE_0__util_EmptyError__[\"a\" /* EmptyError */](); })); };\n}\n//# sourceMappingURL=first.js.map\n\n\n/***/ }),\n/* 866 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = ignoreElements;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction ignoreElements() {\n    return function ignoreElementsOperatorFunction(source) {\n        return source.lift(new IgnoreElementsOperator());\n    };\n}\nvar IgnoreElementsOperator = /*@__PURE__*/ (function () {\n    function IgnoreElementsOperator() {\n    }\n    IgnoreElementsOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new IgnoreElementsSubscriber(subscriber));\n    };\n    return IgnoreElementsOperator;\n}());\nvar IgnoreElementsSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](IgnoreElementsSubscriber, _super);\n    function IgnoreElementsSubscriber() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    IgnoreElementsSubscriber.prototype._next = function (unused) {\n    };\n    return IgnoreElementsSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=ignoreElements.js.map\n\n\n/***/ }),\n/* 867 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = isEmpty;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction isEmpty() {\n    return function (source) { return source.lift(new IsEmptyOperator()); };\n}\nvar IsEmptyOperator = /*@__PURE__*/ (function () {\n    function IsEmptyOperator() {\n    }\n    IsEmptyOperator.prototype.call = function (observer, source) {\n        return source.subscribe(new IsEmptySubscriber(observer));\n    };\n    return IsEmptyOperator;\n}());\nvar IsEmptySubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](IsEmptySubscriber, _super);\n    function IsEmptySubscriber(destination) {\n        return _super.call(this, destination) || this;\n    }\n    IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) {\n        var destination = this.destination;\n        destination.next(isEmpty);\n        destination.complete();\n    };\n    IsEmptySubscriber.prototype._next = function (value) {\n        this.notifyComplete(false);\n    };\n    IsEmptySubscriber.prototype._complete = function () {\n        this.notifyComplete(true);\n    };\n    return IsEmptySubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=isEmpty.js.map\n\n\n/***/ }),\n/* 868 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = last;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_EmptyError__ = __webpack_require__(154);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__filter__ = __webpack_require__(148);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__takeLast__ = __webpack_require__(321);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__throwIfEmpty__ = __webpack_require__(189);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__defaultIfEmpty__ = __webpack_require__(147);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_identity__ = __webpack_require__(119);\n/** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction last(predicate, defaultValue) {\n    var hasDefaultValue = arguments.length >= 2;\n    return function (source) { return source.pipe(predicate ? __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__filter__[\"a\" /* filter */])(function (v, i) { return predicate(v, i, source); }) : __WEBPACK_IMPORTED_MODULE_5__util_identity__[\"a\" /* identity */], __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__takeLast__[\"a\" /* takeLast */])(1), hasDefaultValue ? __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__defaultIfEmpty__[\"a\" /* defaultIfEmpty */])(defaultValue) : __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__throwIfEmpty__[\"a\" /* throwIfEmpty */])(function () { return new __WEBPACK_IMPORTED_MODULE_0__util_EmptyError__[\"a\" /* EmptyError */](); })); };\n}\n//# sourceMappingURL=last.js.map\n\n\n/***/ }),\n/* 869 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = mapTo;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction mapTo(value) {\n    return function (source) { return source.lift(new MapToOperator(value)); };\n}\nvar MapToOperator = /*@__PURE__*/ (function () {\n    function MapToOperator(value) {\n        this.value = value;\n    }\n    MapToOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new MapToSubscriber(subscriber, this.value));\n    };\n    return MapToOperator;\n}());\nvar MapToSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](MapToSubscriber, _super);\n    function MapToSubscriber(destination, value) {\n        var _this = _super.call(this, destination) || this;\n        _this.value = value;\n        return _this;\n    }\n    MapToSubscriber.prototype._next = function (x) {\n        this.destination.next(this.value);\n    };\n    return MapToSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=mapTo.js.map\n\n\n/***/ }),\n/* 870 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = materialize;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Notification__ = __webpack_require__(185);\n/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */\n\n\n\nfunction materialize() {\n    return function materializeOperatorFunction(source) {\n        return source.lift(new MaterializeOperator());\n    };\n}\nvar MaterializeOperator = /*@__PURE__*/ (function () {\n    function MaterializeOperator() {\n    }\n    MaterializeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new MaterializeSubscriber(subscriber));\n    };\n    return MaterializeOperator;\n}());\nvar MaterializeSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](MaterializeSubscriber, _super);\n    function MaterializeSubscriber(destination) {\n        return _super.call(this, destination) || this;\n    }\n    MaterializeSubscriber.prototype._next = function (value) {\n        this.destination.next(__WEBPACK_IMPORTED_MODULE_2__Notification__[\"a\" /* Notification */].createNext(value));\n    };\n    MaterializeSubscriber.prototype._error = function (err) {\n        var destination = this.destination;\n        destination.next(__WEBPACK_IMPORTED_MODULE_2__Notification__[\"a\" /* Notification */].createError(err));\n        destination.complete();\n    };\n    MaterializeSubscriber.prototype._complete = function () {\n        var destination = this.destination;\n        destination.next(__WEBPACK_IMPORTED_MODULE_2__Notification__[\"a\" /* Notification */].createComplete());\n        destination.complete();\n    };\n    return MaterializeSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=materialize.js.map\n\n\n/***/ }),\n/* 871 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = max;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__reduce__ = __webpack_require__(188);\n/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */\n\nfunction max(comparer) {\n    var max = (typeof comparer === 'function')\n        ? function (x, y) { return comparer(x, y) > 0 ? x : y; }\n        : function (x, y) { return x > y ? x : y; };\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__reduce__[\"a\" /* reduce */])(max);\n}\n//# sourceMappingURL=max.js.map\n\n\n/***/ }),\n/* 872 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = merge;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_merge__ = __webpack_require__(424);\n/** PURE_IMPORTS_START _observable_merge PURE_IMPORTS_END */\n\nfunction merge() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    return function (source) { return source.lift.call(__WEBPACK_IMPORTED_MODULE_0__observable_merge__[\"a\" /* merge */].apply(void 0, [source].concat(observables))); };\n}\n//# sourceMappingURL=merge.js.map\n\n\n/***/ }),\n/* 873 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = mergeMapTo;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__mergeMap__ = __webpack_require__(149);\n/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */\n\nfunction mergeMapTo(innerObservable, resultSelector, concurrent) {\n    if (concurrent === void 0) {\n        concurrent = Number.POSITIVE_INFINITY;\n    }\n    if (typeof resultSelector === 'function') {\n        return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__mergeMap__[\"a\" /* mergeMap */])(function () { return innerObservable; }, resultSelector, concurrent);\n    }\n    if (typeof resultSelector === 'number') {\n        concurrent = resultSelector;\n    }\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__mergeMap__[\"a\" /* mergeMap */])(function () { return innerObservable; }, concurrent);\n}\n//# sourceMappingURL=mergeMapTo.js.map\n\n\n/***/ }),\n/* 874 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = mergeScan;\n/* unused harmony export MergeScanOperator */\n/* unused harmony export MergeScanSubscriber */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_tryCatch__ = __webpack_require__(57);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_errorObject__ = __webpack_require__(48);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_subscribeToResult__ = __webpack_require__(14);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__InnerSubscriber__ = __webpack_require__(84);\n/** PURE_IMPORTS_START tslib,_util_tryCatch,_util_errorObject,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction mergeScan(accumulator, seed, concurrent) {\n    if (concurrent === void 0) {\n        concurrent = Number.POSITIVE_INFINITY;\n    }\n    return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); };\n}\nvar MergeScanOperator = /*@__PURE__*/ (function () {\n    function MergeScanOperator(accumulator, seed, concurrent) {\n        this.accumulator = accumulator;\n        this.seed = seed;\n        this.concurrent = concurrent;\n    }\n    MergeScanOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent));\n    };\n    return MergeScanOperator;\n}());\n\nvar MergeScanSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](MergeScanSubscriber, _super);\n    function MergeScanSubscriber(destination, accumulator, acc, concurrent) {\n        var _this = _super.call(this, destination) || this;\n        _this.accumulator = accumulator;\n        _this.acc = acc;\n        _this.concurrent = concurrent;\n        _this.hasValue = false;\n        _this.hasCompleted = false;\n        _this.buffer = [];\n        _this.active = 0;\n        _this.index = 0;\n        return _this;\n    }\n    MergeScanSubscriber.prototype._next = function (value) {\n        if (this.active < this.concurrent) {\n            var index = this.index++;\n            var ish = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_tryCatch__[\"a\" /* tryCatch */])(this.accumulator)(this.acc, value);\n            var destination = this.destination;\n            if (ish === __WEBPACK_IMPORTED_MODULE_2__util_errorObject__[\"a\" /* errorObject */]) {\n                destination.error(__WEBPACK_IMPORTED_MODULE_2__util_errorObject__[\"a\" /* errorObject */].e);\n            }\n            else {\n                this.active++;\n                this._innerSub(ish, value, index);\n            }\n        }\n        else {\n            this.buffer.push(value);\n        }\n    };\n    MergeScanSubscriber.prototype._innerSub = function (ish, value, index) {\n        var innerSubscriber = new __WEBPACK_IMPORTED_MODULE_5__InnerSubscriber__[\"a\" /* InnerSubscriber */](this, undefined, undefined);\n        var destination = this.destination;\n        destination.add(innerSubscriber);\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, ish, value, index, innerSubscriber);\n    };\n    MergeScanSubscriber.prototype._complete = function () {\n        this.hasCompleted = true;\n        if (this.active === 0 && this.buffer.length === 0) {\n            if (this.hasValue === false) {\n                this.destination.next(this.acc);\n            }\n            this.destination.complete();\n        }\n        this.unsubscribe();\n    };\n    MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var destination = this.destination;\n        this.acc = innerValue;\n        this.hasValue = true;\n        destination.next(innerValue);\n    };\n    MergeScanSubscriber.prototype.notifyComplete = function (innerSub) {\n        var buffer = this.buffer;\n        var destination = this.destination;\n        destination.remove(innerSub);\n        this.active--;\n        if (buffer.length > 0) {\n            this._next(buffer.shift());\n        }\n        else if (this.active === 0 && this.hasCompleted) {\n            if (this.hasValue === false) {\n                this.destination.next(this.acc);\n            }\n            this.destination.complete();\n        }\n    };\n    return MergeScanSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n\n//# sourceMappingURL=mergeScan.js.map\n\n\n/***/ }),\n/* 875 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = min;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__reduce__ = __webpack_require__(188);\n/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */\n\nfunction min(comparer) {\n    var min = (typeof comparer === 'function')\n        ? function (x, y) { return comparer(x, y) < 0 ? x : y; }\n        : function (x, y) { return x < y ? x : y; };\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__reduce__[\"a\" /* reduce */])(min);\n}\n//# sourceMappingURL=min.js.map\n\n\n/***/ }),\n/* 876 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = onErrorResumeNext;\n/* unused harmony export onErrorResumeNextStatic */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__observable_from__ = __webpack_require__(62);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isArray__ = __webpack_require__(41);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__InnerSubscriber__ = __webpack_require__(84);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_observable_from,_util_isArray,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction onErrorResumeNext() {\n    var nextSources = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        nextSources[_i] = arguments[_i];\n    }\n    if (nextSources.length === 1 && __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isArray__[\"a\" /* isArray */])(nextSources[0])) {\n        nextSources = nextSources[0];\n    }\n    return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); };\n}\nfunction onErrorResumeNextStatic() {\n    var nextSources = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        nextSources[_i] = arguments[_i];\n    }\n    var source = null;\n    if (nextSources.length === 1 && __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isArray__[\"a\" /* isArray */])(nextSources[0])) {\n        nextSources = nextSources[0];\n    }\n    source = nextSources.shift();\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__observable_from__[\"a\" /* from */])(source, null).lift(new OnErrorResumeNextOperator(nextSources));\n}\nvar OnErrorResumeNextOperator = /*@__PURE__*/ (function () {\n    function OnErrorResumeNextOperator(nextSources) {\n        this.nextSources = nextSources;\n    }\n    OnErrorResumeNextOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources));\n    };\n    return OnErrorResumeNextOperator;\n}());\nvar OnErrorResumeNextSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](OnErrorResumeNextSubscriber, _super);\n    function OnErrorResumeNextSubscriber(destination, nextSources) {\n        var _this = _super.call(this, destination) || this;\n        _this.destination = destination;\n        _this.nextSources = nextSources;\n        return _this;\n    }\n    OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) {\n        this.subscribeToNextSource();\n    };\n    OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.subscribeToNextSource();\n    };\n    OnErrorResumeNextSubscriber.prototype._error = function (err) {\n        this.subscribeToNextSource();\n        this.unsubscribe();\n    };\n    OnErrorResumeNextSubscriber.prototype._complete = function () {\n        this.subscribeToNextSource();\n        this.unsubscribe();\n    };\n    OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () {\n        var next = this.nextSources.shift();\n        if (next) {\n            var innerSubscriber = new __WEBPACK_IMPORTED_MODULE_4__InnerSubscriber__[\"a\" /* InnerSubscriber */](this, undefined, undefined);\n            var destination = this.destination;\n            destination.add(innerSubscriber);\n            __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, next, undefined, undefined, innerSubscriber);\n        }\n        else {\n            this.destination.complete();\n        }\n    };\n    return OnErrorResumeNextSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_3__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=onErrorResumeNext.js.map\n\n\n/***/ }),\n/* 877 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = pairwise;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction pairwise() {\n    return function (source) { return source.lift(new PairwiseOperator()); };\n}\nvar PairwiseOperator = /*@__PURE__*/ (function () {\n    function PairwiseOperator() {\n    }\n    PairwiseOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new PairwiseSubscriber(subscriber));\n    };\n    return PairwiseOperator;\n}());\nvar PairwiseSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](PairwiseSubscriber, _super);\n    function PairwiseSubscriber(destination) {\n        var _this = _super.call(this, destination) || this;\n        _this.hasPrev = false;\n        return _this;\n    }\n    PairwiseSubscriber.prototype._next = function (value) {\n        if (this.hasPrev) {\n            this.destination.next([this.prev, value]);\n        }\n        else {\n            this.hasPrev = true;\n        }\n        this.prev = value;\n    };\n    return PairwiseSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=pairwise.js.map\n\n\n/***/ }),\n/* 878 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = partition;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_not__ = __webpack_require__(931);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__filter__ = __webpack_require__(148);\n/** PURE_IMPORTS_START _util_not,_filter PURE_IMPORTS_END */\n\n\nfunction partition(predicate, thisArg) {\n    return function (source) {\n        return [\n            __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__filter__[\"a\" /* filter */])(predicate, thisArg)(source),\n            __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__filter__[\"a\" /* filter */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__util_not__[\"a\" /* not */])(predicate, thisArg))(source)\n        ];\n    };\n}\n//# sourceMappingURL=partition.js.map\n\n\n/***/ }),\n/* 879 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = pluck;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__map__ = __webpack_require__(47);\n/** PURE_IMPORTS_START _map PURE_IMPORTS_END */\n\nfunction pluck() {\n    var properties = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        properties[_i] = arguments[_i];\n    }\n    var length = properties.length;\n    if (length === 0) {\n        throw new Error('list of properties cannot be empty.');\n    }\n    return function (source) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__map__[\"a\" /* map */])(plucker(properties, length))(source); };\n}\nfunction plucker(props, length) {\n    var mapper = function (x) {\n        var currentProp = x;\n        for (var i = 0; i < length; i++) {\n            var p = currentProp[props[i]];\n            if (typeof p !== 'undefined') {\n                currentProp = p;\n            }\n            else {\n                return undefined;\n            }\n        }\n        return currentProp;\n    };\n    return mapper;\n}\n//# sourceMappingURL=pluck.js.map\n\n\n/***/ }),\n/* 880 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = publish;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Subject__ = __webpack_require__(36);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__multicast__ = __webpack_require__(117);\n/** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */\n\n\nfunction publish(selector) {\n    return selector ?\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__multicast__[\"a\" /* multicast */])(function () { return new __WEBPACK_IMPORTED_MODULE_0__Subject__[\"a\" /* Subject */](); }, selector) :\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__multicast__[\"a\" /* multicast */])(new __WEBPACK_IMPORTED_MODULE_0__Subject__[\"a\" /* Subject */]());\n}\n//# sourceMappingURL=publish.js.map\n\n\n/***/ }),\n/* 881 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = publishBehavior;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__BehaviorSubject__ = __webpack_require__(419);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__multicast__ = __webpack_require__(117);\n/** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */\n\n\nfunction publishBehavior(value) {\n    return function (source) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__multicast__[\"a\" /* multicast */])(new __WEBPACK_IMPORTED_MODULE_0__BehaviorSubject__[\"a\" /* BehaviorSubject */](value))(source); };\n}\n//# sourceMappingURL=publishBehavior.js.map\n\n\n/***/ }),\n/* 882 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = publishLast;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AsyncSubject__ = __webpack_require__(184);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__multicast__ = __webpack_require__(117);\n/** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */\n\n\nfunction publishLast() {\n    return function (source) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__multicast__[\"a\" /* multicast */])(new __WEBPACK_IMPORTED_MODULE_0__AsyncSubject__[\"a\" /* AsyncSubject */]())(source); };\n}\n//# sourceMappingURL=publishLast.js.map\n\n\n/***/ }),\n/* 883 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = publishReplay;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ReplaySubject__ = __webpack_require__(309);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__multicast__ = __webpack_require__(117);\n/** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */\n\n\nfunction publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {\n    if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {\n        scheduler = selectorOrScheduler;\n    }\n    var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;\n    var subject = new __WEBPACK_IMPORTED_MODULE_0__ReplaySubject__[\"a\" /* ReplaySubject */](bufferSize, windowTime, scheduler);\n    return function (source) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__multicast__[\"a\" /* multicast */])(function () { return subject; }, selector)(source); };\n}\n//# sourceMappingURL=publishReplay.js.map\n\n\n/***/ }),\n/* 884 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = race;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_isArray__ = __webpack_require__(41);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__observable_race__ = __webpack_require__(426);\n/** PURE_IMPORTS_START _util_isArray,_observable_race PURE_IMPORTS_END */\n\n\nfunction race() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    return function raceOperatorFunction(source) {\n        if (observables.length === 1 && __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__util_isArray__[\"a\" /* isArray */])(observables[0])) {\n            observables = observables[0];\n        }\n        return source.lift.call(__WEBPACK_IMPORTED_MODULE_1__observable_race__[\"a\" /* race */].apply(void 0, [source].concat(observables)));\n    };\n}\n//# sourceMappingURL=race.js.map\n\n\n/***/ }),\n/* 885 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = repeat;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__observable_empty__ = __webpack_require__(39);\n/** PURE_IMPORTS_START tslib,_Subscriber,_observable_empty PURE_IMPORTS_END */\n\n\n\nfunction repeat(count) {\n    if (count === void 0) {\n        count = -1;\n    }\n    return function (source) {\n        if (count === 0) {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__observable_empty__[\"a\" /* empty */])();\n        }\n        else if (count < 0) {\n            return source.lift(new RepeatOperator(-1, source));\n        }\n        else {\n            return source.lift(new RepeatOperator(count - 1, source));\n        }\n    };\n}\nvar RepeatOperator = /*@__PURE__*/ (function () {\n    function RepeatOperator(count, source) {\n        this.count = count;\n        this.source = source;\n    }\n    RepeatOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));\n    };\n    return RepeatOperator;\n}());\nvar RepeatSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](RepeatSubscriber, _super);\n    function RepeatSubscriber(destination, count, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.count = count;\n        _this.source = source;\n        return _this;\n    }\n    RepeatSubscriber.prototype.complete = function () {\n        if (!this.isStopped) {\n            var _a = this, source = _a.source, count = _a.count;\n            if (count === 0) {\n                return _super.prototype.complete.call(this);\n            }\n            else if (count > -1) {\n                this.count = count - 1;\n            }\n            source.subscribe(this._unsubscribeAndRecycle());\n        }\n    };\n    return RepeatSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=repeat.js.map\n\n\n/***/ }),\n/* 886 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = repeatWhen;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(57);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_errorObject__ = __webpack_require__(48);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_Subject,_util_tryCatch,_util_errorObject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction repeatWhen(notifier) {\n    return function (source) { return source.lift(new RepeatWhenOperator(notifier)); };\n}\nvar RepeatWhenOperator = /*@__PURE__*/ (function () {\n    function RepeatWhenOperator(notifier) {\n        this.notifier = notifier;\n    }\n    RepeatWhenOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source));\n    };\n    return RepeatWhenOperator;\n}());\nvar RepeatWhenSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](RepeatWhenSubscriber, _super);\n    function RepeatWhenSubscriber(destination, notifier, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.notifier = notifier;\n        _this.source = source;\n        _this.sourceIsBeingSubscribedTo = true;\n        return _this;\n    }\n    RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.sourceIsBeingSubscribedTo = true;\n        this.source.subscribe(this);\n    };\n    RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) {\n        if (this.sourceIsBeingSubscribedTo === false) {\n            return _super.prototype.complete.call(this);\n        }\n    };\n    RepeatWhenSubscriber.prototype.complete = function () {\n        this.sourceIsBeingSubscribedTo = false;\n        if (!this.isStopped) {\n            if (!this.retries) {\n                this.subscribeToRetries();\n            }\n            if (!this.retriesSubscription || this.retriesSubscription.closed) {\n                return _super.prototype.complete.call(this);\n            }\n            this._unsubscribeAndRecycle();\n            this.notifications.next();\n        }\n    };\n    RepeatWhenSubscriber.prototype._unsubscribe = function () {\n        var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription;\n        if (notifications) {\n            notifications.unsubscribe();\n            this.notifications = null;\n        }\n        if (retriesSubscription) {\n            retriesSubscription.unsubscribe();\n            this.retriesSubscription = null;\n        }\n        this.retries = null;\n    };\n    RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () {\n        var _unsubscribe = this._unsubscribe;\n        this._unsubscribe = null;\n        _super.prototype._unsubscribeAndRecycle.call(this);\n        this._unsubscribe = _unsubscribe;\n        return this;\n    };\n    RepeatWhenSubscriber.prototype.subscribeToRetries = function () {\n        this.notifications = new __WEBPACK_IMPORTED_MODULE_1__Subject__[\"a\" /* Subject */]();\n        var retries = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_tryCatch__[\"a\" /* tryCatch */])(this.notifier)(this.notifications);\n        if (retries === __WEBPACK_IMPORTED_MODULE_3__util_errorObject__[\"a\" /* errorObject */]) {\n            return _super.prototype.complete.call(this);\n        }\n        this.retries = retries;\n        this.retriesSubscription = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, retries);\n    };\n    return RepeatWhenSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=repeatWhen.js.map\n\n\n/***/ }),\n/* 887 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = retry;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction retry(count) {\n    if (count === void 0) {\n        count = -1;\n    }\n    return function (source) { return source.lift(new RetryOperator(count, source)); };\n}\nvar RetryOperator = /*@__PURE__*/ (function () {\n    function RetryOperator(count, source) {\n        this.count = count;\n        this.source = source;\n    }\n    RetryOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));\n    };\n    return RetryOperator;\n}());\nvar RetrySubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](RetrySubscriber, _super);\n    function RetrySubscriber(destination, count, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.count = count;\n        _this.source = source;\n        return _this;\n    }\n    RetrySubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var _a = this, source = _a.source, count = _a.count;\n            if (count === 0) {\n                return _super.prototype.error.call(this, err);\n            }\n            else if (count > -1) {\n                this.count = count - 1;\n            }\n            source.subscribe(this._unsubscribeAndRecycle());\n        }\n    };\n    return RetrySubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=retry.js.map\n\n\n/***/ }),\n/* 888 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = retryWhen;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(57);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_errorObject__ = __webpack_require__(48);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_Subject,_util_tryCatch,_util_errorObject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction retryWhen(notifier) {\n    return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); };\n}\nvar RetryWhenOperator = /*@__PURE__*/ (function () {\n    function RetryWhenOperator(notifier, source) {\n        this.notifier = notifier;\n        this.source = source;\n    }\n    RetryWhenOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));\n    };\n    return RetryWhenOperator;\n}());\nvar RetryWhenSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](RetryWhenSubscriber, _super);\n    function RetryWhenSubscriber(destination, notifier, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.notifier = notifier;\n        _this.source = source;\n        return _this;\n    }\n    RetryWhenSubscriber.prototype.error = function (err) {\n        if (!this.isStopped) {\n            var errors = this.errors;\n            var retries = this.retries;\n            var retriesSubscription = this.retriesSubscription;\n            if (!retries) {\n                errors = new __WEBPACK_IMPORTED_MODULE_1__Subject__[\"a\" /* Subject */]();\n                retries = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_tryCatch__[\"a\" /* tryCatch */])(this.notifier)(errors);\n                if (retries === __WEBPACK_IMPORTED_MODULE_3__util_errorObject__[\"a\" /* errorObject */]) {\n                    return _super.prototype.error.call(this, __WEBPACK_IMPORTED_MODULE_3__util_errorObject__[\"a\" /* errorObject */].e);\n                }\n                retriesSubscription = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, retries);\n            }\n            else {\n                this.errors = null;\n                this.retriesSubscription = null;\n            }\n            this._unsubscribeAndRecycle();\n            this.errors = errors;\n            this.retries = retries;\n            this.retriesSubscription = retriesSubscription;\n            errors.next(err);\n        }\n    };\n    RetryWhenSubscriber.prototype._unsubscribe = function () {\n        var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription;\n        if (errors) {\n            errors.unsubscribe();\n            this.errors = null;\n        }\n        if (retriesSubscription) {\n            retriesSubscription.unsubscribe();\n            this.retriesSubscription = null;\n        }\n        this.retries = null;\n    };\n    RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        var _unsubscribe = this._unsubscribe;\n        this._unsubscribe = null;\n        this._unsubscribeAndRecycle();\n        this._unsubscribe = _unsubscribe;\n        this.source.subscribe(this);\n    };\n    return RetryWhenSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=retryWhen.js.map\n\n\n/***/ }),\n/* 889 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = sample;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\nfunction sample(notifier) {\n    return function (source) { return source.lift(new SampleOperator(notifier)); };\n}\nvar SampleOperator = /*@__PURE__*/ (function () {\n    function SampleOperator(notifier) {\n        this.notifier = notifier;\n    }\n    SampleOperator.prototype.call = function (subscriber, source) {\n        var sampleSubscriber = new SampleSubscriber(subscriber);\n        var subscription = source.subscribe(sampleSubscriber);\n        subscription.add(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__[\"a\" /* subscribeToResult */])(sampleSubscriber, this.notifier));\n        return subscription;\n    };\n    return SampleOperator;\n}());\nvar SampleSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SampleSubscriber, _super);\n    function SampleSubscriber() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this.hasValue = false;\n        return _this;\n    }\n    SampleSubscriber.prototype._next = function (value) {\n        this.value = value;\n        this.hasValue = true;\n    };\n    SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.emitValue();\n    };\n    SampleSubscriber.prototype.notifyComplete = function () {\n        this.emitValue();\n    };\n    SampleSubscriber.prototype.emitValue = function () {\n        if (this.hasValue) {\n            this.hasValue = false;\n            this.destination.next(this.value);\n        }\n    };\n    return SampleSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=sample.js.map\n\n\n/***/ }),\n/* 890 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = sampleTime;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__scheduler_async__ = __webpack_require__(40);\n/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */\n\n\n\nfunction sampleTime(period, scheduler) {\n    if (scheduler === void 0) {\n        scheduler = __WEBPACK_IMPORTED_MODULE_2__scheduler_async__[\"a\" /* async */];\n    }\n    return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); };\n}\nvar SampleTimeOperator = /*@__PURE__*/ (function () {\n    function SampleTimeOperator(period, scheduler) {\n        this.period = period;\n        this.scheduler = scheduler;\n    }\n    SampleTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));\n    };\n    return SampleTimeOperator;\n}());\nvar SampleTimeSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SampleTimeSubscriber, _super);\n    function SampleTimeSubscriber(destination, period, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.period = period;\n        _this.scheduler = scheduler;\n        _this.hasValue = false;\n        _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period }));\n        return _this;\n    }\n    SampleTimeSubscriber.prototype._next = function (value) {\n        this.lastValue = value;\n        this.hasValue = true;\n    };\n    SampleTimeSubscriber.prototype.notifyNext = function () {\n        if (this.hasValue) {\n            this.hasValue = false;\n            this.destination.next(this.lastValue);\n        }\n    };\n    return SampleTimeSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\nfunction dispatchNotification(state) {\n    var subscriber = state.subscriber, period = state.period;\n    subscriber.notifyNext();\n    this.schedule(state, period);\n}\n//# sourceMappingURL=sampleTime.js.map\n\n\n/***/ }),\n/* 891 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = sequenceEqual;\n/* unused harmony export SequenceEqualOperator */\n/* unused harmony export SequenceEqualSubscriber */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(57);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_errorObject__ = __webpack_require__(48);\n/** PURE_IMPORTS_START tslib,_Subscriber,_util_tryCatch,_util_errorObject PURE_IMPORTS_END */\n\n\n\n\nfunction sequenceEqual(compareTo, comparor) {\n    return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparor)); };\n}\nvar SequenceEqualOperator = /*@__PURE__*/ (function () {\n    function SequenceEqualOperator(compareTo, comparor) {\n        this.compareTo = compareTo;\n        this.comparor = comparor;\n    }\n    SequenceEqualOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparor));\n    };\n    return SequenceEqualOperator;\n}());\n\nvar SequenceEqualSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SequenceEqualSubscriber, _super);\n    function SequenceEqualSubscriber(destination, compareTo, comparor) {\n        var _this = _super.call(this, destination) || this;\n        _this.compareTo = compareTo;\n        _this.comparor = comparor;\n        _this._a = [];\n        _this._b = [];\n        _this._oneComplete = false;\n        _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this)));\n        return _this;\n    }\n    SequenceEqualSubscriber.prototype._next = function (value) {\n        if (this._oneComplete && this._b.length === 0) {\n            this.emit(false);\n        }\n        else {\n            this._a.push(value);\n            this.checkValues();\n        }\n    };\n    SequenceEqualSubscriber.prototype._complete = function () {\n        if (this._oneComplete) {\n            this.emit(this._a.length === 0 && this._b.length === 0);\n        }\n        else {\n            this._oneComplete = true;\n        }\n        this.unsubscribe();\n    };\n    SequenceEqualSubscriber.prototype.checkValues = function () {\n        var _c = this, _a = _c._a, _b = _c._b, comparor = _c.comparor;\n        while (_a.length > 0 && _b.length > 0) {\n            var a = _a.shift();\n            var b = _b.shift();\n            var areEqual = false;\n            if (comparor) {\n                areEqual = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_tryCatch__[\"a\" /* tryCatch */])(comparor)(a, b);\n                if (areEqual === __WEBPACK_IMPORTED_MODULE_3__util_errorObject__[\"a\" /* errorObject */]) {\n                    this.destination.error(__WEBPACK_IMPORTED_MODULE_3__util_errorObject__[\"a\" /* errorObject */].e);\n                }\n            }\n            else {\n                areEqual = a === b;\n            }\n            if (!areEqual) {\n                this.emit(false);\n            }\n        }\n    };\n    SequenceEqualSubscriber.prototype.emit = function (value) {\n        var destination = this.destination;\n        destination.next(value);\n        destination.complete();\n    };\n    SequenceEqualSubscriber.prototype.nextB = function (value) {\n        if (this._oneComplete && this._a.length === 0) {\n            this.emit(false);\n        }\n        else {\n            this._b.push(value);\n            this.checkValues();\n        }\n    };\n    SequenceEqualSubscriber.prototype.completeB = function () {\n        if (this._oneComplete) {\n            this.emit(this._a.length === 0 && this._b.length === 0);\n        }\n        else {\n            this._oneComplete = true;\n        }\n    };\n    return SequenceEqualSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n\nvar SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SequenceEqualCompareToSubscriber, _super);\n    function SequenceEqualCompareToSubscriber(destination, parent) {\n        var _this = _super.call(this, destination) || this;\n        _this.parent = parent;\n        return _this;\n    }\n    SequenceEqualCompareToSubscriber.prototype._next = function (value) {\n        this.parent.nextB(value);\n    };\n    SequenceEqualCompareToSubscriber.prototype._error = function (err) {\n        this.parent.error(err);\n        this.unsubscribe();\n    };\n    SequenceEqualCompareToSubscriber.prototype._complete = function () {\n        this.parent.completeB();\n        this.unsubscribe();\n    };\n    return SequenceEqualCompareToSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=sequenceEqual.js.map\n\n\n/***/ }),\n/* 892 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = share;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__multicast__ = __webpack_require__(117);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__refCount__ = __webpack_require__(317);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subject__ = __webpack_require__(36);\n/** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */\n\n\n\nfunction shareSubjectFactory() {\n    return new __WEBPACK_IMPORTED_MODULE_2__Subject__[\"a\" /* Subject */]();\n}\nfunction share() {\n    return function (source) { return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__refCount__[\"a\" /* refCount */])()(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__multicast__[\"a\" /* multicast */])(shareSubjectFactory)(source)); };\n}\n//# sourceMappingURL=share.js.map\n\n\n/***/ }),\n/* 893 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = shareReplay;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__ReplaySubject__ = __webpack_require__(309);\n/** PURE_IMPORTS_START _ReplaySubject PURE_IMPORTS_END */\n\nfunction shareReplay(bufferSize, windowTime, scheduler) {\n    if (bufferSize === void 0) {\n        bufferSize = Number.POSITIVE_INFINITY;\n    }\n    if (windowTime === void 0) {\n        windowTime = Number.POSITIVE_INFINITY;\n    }\n    return function (source) { return source.lift(shareReplayOperator(bufferSize, windowTime, scheduler)); };\n}\nfunction shareReplayOperator(bufferSize, windowTime, scheduler) {\n    var subject;\n    var refCount = 0;\n    var subscription;\n    var hasError = false;\n    var isComplete = false;\n    return function shareReplayOperation(source) {\n        refCount++;\n        if (!subject || hasError) {\n            hasError = false;\n            subject = new __WEBPACK_IMPORTED_MODULE_0__ReplaySubject__[\"a\" /* ReplaySubject */](bufferSize, windowTime, scheduler);\n            subscription = source.subscribe({\n                next: function (value) { subject.next(value); },\n                error: function (err) {\n                    hasError = true;\n                    subject.error(err);\n                },\n                complete: function () {\n                    isComplete = true;\n                    subject.complete();\n                },\n            });\n        }\n        var innerSub = subject.subscribe(this);\n        return function () {\n            refCount--;\n            innerSub.unsubscribe();\n            if (subscription && refCount === 0 && isComplete) {\n                subscription.unsubscribe();\n            }\n        };\n    };\n}\n//# sourceMappingURL=shareReplay.js.map\n\n\n/***/ }),\n/* 894 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = single;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_EmptyError__ = __webpack_require__(154);\n/** PURE_IMPORTS_START tslib,_Subscriber,_util_EmptyError PURE_IMPORTS_END */\n\n\n\nfunction single(predicate) {\n    return function (source) { return source.lift(new SingleOperator(predicate, source)); };\n}\nvar SingleOperator = /*@__PURE__*/ (function () {\n    function SingleOperator(predicate, source) {\n        this.predicate = predicate;\n        this.source = source;\n    }\n    SingleOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source));\n    };\n    return SingleOperator;\n}());\nvar SingleSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SingleSubscriber, _super);\n    function SingleSubscriber(destination, predicate, source) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.source = source;\n        _this.seenValue = false;\n        _this.index = 0;\n        return _this;\n    }\n    SingleSubscriber.prototype.applySingleValue = function (value) {\n        if (this.seenValue) {\n            this.destination.error('Sequence contains more than one element');\n        }\n        else {\n            this.seenValue = true;\n            this.singleValue = value;\n        }\n    };\n    SingleSubscriber.prototype._next = function (value) {\n        var index = this.index++;\n        if (this.predicate) {\n            this.tryNext(value, index);\n        }\n        else {\n            this.applySingleValue(value);\n        }\n    };\n    SingleSubscriber.prototype.tryNext = function (value, index) {\n        try {\n            if (this.predicate(value, index, this.source)) {\n                this.applySingleValue(value);\n            }\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n    };\n    SingleSubscriber.prototype._complete = function () {\n        var destination = this.destination;\n        if (this.index > 0) {\n            destination.next(this.seenValue ? this.singleValue : undefined);\n            destination.complete();\n        }\n        else {\n            destination.error(new __WEBPACK_IMPORTED_MODULE_2__util_EmptyError__[\"a\" /* EmptyError */]);\n        }\n    };\n    return SingleSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=single.js.map\n\n\n/***/ }),\n/* 895 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = skip;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction skip(count) {\n    return function (source) { return source.lift(new SkipOperator(count)); };\n}\nvar SkipOperator = /*@__PURE__*/ (function () {\n    function SkipOperator(total) {\n        this.total = total;\n    }\n    SkipOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SkipSubscriber(subscriber, this.total));\n    };\n    return SkipOperator;\n}());\nvar SkipSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SkipSubscriber, _super);\n    function SkipSubscriber(destination, total) {\n        var _this = _super.call(this, destination) || this;\n        _this.total = total;\n        _this.count = 0;\n        return _this;\n    }\n    SkipSubscriber.prototype._next = function (x) {\n        if (++this.count > this.total) {\n            this.destination.next(x);\n        }\n    };\n    return SkipSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=skip.js.map\n\n\n/***/ }),\n/* 896 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = skipLast;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_ArgumentOutOfRangeError__ = __webpack_require__(153);\n/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError PURE_IMPORTS_END */\n\n\n\nfunction skipLast(count) {\n    return function (source) { return source.lift(new SkipLastOperator(count)); };\n}\nvar SkipLastOperator = /*@__PURE__*/ (function () {\n    function SkipLastOperator(_skipCount) {\n        this._skipCount = _skipCount;\n        if (this._skipCount < 0) {\n            throw new __WEBPACK_IMPORTED_MODULE_2__util_ArgumentOutOfRangeError__[\"a\" /* ArgumentOutOfRangeError */];\n        }\n    }\n    SkipLastOperator.prototype.call = function (subscriber, source) {\n        if (this._skipCount === 0) {\n            return source.subscribe(new __WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */](subscriber));\n        }\n        else {\n            return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount));\n        }\n    };\n    return SkipLastOperator;\n}());\nvar SkipLastSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SkipLastSubscriber, _super);\n    function SkipLastSubscriber(destination, _skipCount) {\n        var _this = _super.call(this, destination) || this;\n        _this._skipCount = _skipCount;\n        _this._count = 0;\n        _this._ring = new Array(_skipCount);\n        return _this;\n    }\n    SkipLastSubscriber.prototype._next = function (value) {\n        var skipCount = this._skipCount;\n        var count = this._count++;\n        if (count < skipCount) {\n            this._ring[count] = value;\n        }\n        else {\n            var currentIndex = count % skipCount;\n            var ring = this._ring;\n            var oldValue = ring[currentIndex];\n            ring[currentIndex] = value;\n            this.destination.next(oldValue);\n        }\n    };\n    return SkipLastSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=skipLast.js.map\n\n\n/***/ }),\n/* 897 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = skipUntil;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__InnerSubscriber__ = __webpack_require__(84);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\nfunction skipUntil(notifier) {\n    return function (source) { return source.lift(new SkipUntilOperator(notifier)); };\n}\nvar SkipUntilOperator = /*@__PURE__*/ (function () {\n    function SkipUntilOperator(notifier) {\n        this.notifier = notifier;\n    }\n    SkipUntilOperator.prototype.call = function (destination, source) {\n        return source.subscribe(new SkipUntilSubscriber(destination, this.notifier));\n    };\n    return SkipUntilOperator;\n}());\nvar SkipUntilSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SkipUntilSubscriber, _super);\n    function SkipUntilSubscriber(destination, notifier) {\n        var _this = _super.call(this, destination) || this;\n        _this.hasValue = false;\n        var innerSubscriber = new __WEBPACK_IMPORTED_MODULE_2__InnerSubscriber__[\"a\" /* InnerSubscriber */](_this, undefined, undefined);\n        _this.add(innerSubscriber);\n        _this.innerSubscription = innerSubscriber;\n        __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_subscribeToResult__[\"a\" /* subscribeToResult */])(_this, notifier, undefined, undefined, innerSubscriber);\n        return _this;\n    }\n    SkipUntilSubscriber.prototype._next = function (value) {\n        if (this.hasValue) {\n            _super.prototype._next.call(this, value);\n        }\n    };\n    SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.hasValue = true;\n        if (this.innerSubscription) {\n            this.innerSubscription.unsubscribe();\n        }\n    };\n    SkipUntilSubscriber.prototype.notifyComplete = function () {\n    };\n    return SkipUntilSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=skipUntil.js.map\n\n\n/***/ }),\n/* 898 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = skipWhile;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction skipWhile(predicate) {\n    return function (source) { return source.lift(new SkipWhileOperator(predicate)); };\n}\nvar SkipWhileOperator = /*@__PURE__*/ (function () {\n    function SkipWhileOperator(predicate) {\n        this.predicate = predicate;\n    }\n    SkipWhileOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));\n    };\n    return SkipWhileOperator;\n}());\nvar SkipWhileSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](SkipWhileSubscriber, _super);\n    function SkipWhileSubscriber(destination, predicate) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.skipping = true;\n        _this.index = 0;\n        return _this;\n    }\n    SkipWhileSubscriber.prototype._next = function (value) {\n        var destination = this.destination;\n        if (this.skipping) {\n            this.tryCallPredicate(value);\n        }\n        if (!this.skipping) {\n            destination.next(value);\n        }\n    };\n    SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {\n        try {\n            var result = this.predicate(value, this.index++);\n            this.skipping = Boolean(result);\n        }\n        catch (err) {\n            this.destination.error(err);\n        }\n    };\n    return SkipWhileSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=skipWhile.js.map\n\n\n/***/ }),\n/* 899 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = startWith;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_fromArray__ = __webpack_require__(85);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__observable_scalar__ = __webpack_require__(313);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__observable_empty__ = __webpack_require__(39);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__observable_concat__ = __webpack_require__(187);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_isScheduler__ = __webpack_require__(49);\n/** PURE_IMPORTS_START _observable_fromArray,_observable_scalar,_observable_empty,_observable_concat,_util_isScheduler PURE_IMPORTS_END */\n\n\n\n\n\nfunction startWith() {\n    var array = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        array[_i] = arguments[_i];\n    }\n    return function (source) {\n        var scheduler = array[array.length - 1];\n        if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_isScheduler__[\"a\" /* isScheduler */])(scheduler)) {\n            array.pop();\n        }\n        else {\n            scheduler = null;\n        }\n        var len = array.length;\n        if (len === 1 && !scheduler) {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__observable_concat__[\"a\" /* concat */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__observable_scalar__[\"a\" /* scalar */])(array[0]), source);\n        }\n        else if (len > 0) {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__observable_concat__[\"a\" /* concat */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__observable_fromArray__[\"a\" /* fromArray */])(array, scheduler), source);\n        }\n        else {\n            return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__observable_concat__[\"a\" /* concat */])(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__observable_empty__[\"a\" /* empty */])(scheduler), source);\n        }\n    };\n}\n//# sourceMappingURL=startWith.js.map\n\n\n/***/ }),\n/* 900 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = subscribeOn;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_SubscribeOnObservable__ = __webpack_require__(822);\n/** PURE_IMPORTS_START _observable_SubscribeOnObservable PURE_IMPORTS_END */\n\nfunction subscribeOn(scheduler, delay) {\n    if (delay === void 0) {\n        delay = 0;\n    }\n    return function subscribeOnOperatorFunction(source) {\n        return source.lift(new SubscribeOnOperator(scheduler, delay));\n    };\n}\nvar SubscribeOnOperator = /*@__PURE__*/ (function () {\n    function SubscribeOnOperator(scheduler, delay) {\n        this.scheduler = scheduler;\n        this.delay = delay;\n    }\n    SubscribeOnOperator.prototype.call = function (subscriber, source) {\n        return new __WEBPACK_IMPORTED_MODULE_0__observable_SubscribeOnObservable__[\"a\" /* SubscribeOnObservable */](source, this.delay, this.scheduler).subscribe(subscriber);\n    };\n    return SubscribeOnOperator;\n}());\n//# sourceMappingURL=subscribeOn.js.map\n\n\n/***/ }),\n/* 901 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = switchAll;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__switchMap__ = __webpack_require__(319);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_identity__ = __webpack_require__(119);\n/** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */\n\n\nfunction switchAll() {\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__switchMap__[\"a\" /* switchMap */])(__WEBPACK_IMPORTED_MODULE_1__util_identity__[\"a\" /* identity */]);\n}\n//# sourceMappingURL=switchAll.js.map\n\n\n/***/ }),\n/* 902 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = switchMapTo;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__switchMap__ = __webpack_require__(319);\n/** PURE_IMPORTS_START _switchMap PURE_IMPORTS_END */\n\nfunction switchMapTo(innerObservable, resultSelector) {\n    return resultSelector ? __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__switchMap__[\"a\" /* switchMap */])(function () { return innerObservable; }, resultSelector) : __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__switchMap__[\"a\" /* switchMap */])(function () { return innerObservable; });\n}\n//# sourceMappingURL=switchMapTo.js.map\n\n\n/***/ }),\n/* 903 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = takeUntil;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\nfunction takeUntil(notifier) {\n    return function (source) { return source.lift(new TakeUntilOperator(notifier)); };\n}\nvar TakeUntilOperator = /*@__PURE__*/ (function () {\n    function TakeUntilOperator(notifier) {\n        this.notifier = notifier;\n    }\n    TakeUntilOperator.prototype.call = function (subscriber, source) {\n        var takeUntilSubscriber = new TakeUntilSubscriber(subscriber);\n        var notifierSubscription = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__[\"a\" /* subscribeToResult */])(takeUntilSubscriber, this.notifier);\n        if (notifierSubscription && !takeUntilSubscriber.seenValue) {\n            takeUntilSubscriber.add(notifierSubscription);\n            return source.subscribe(takeUntilSubscriber);\n        }\n        return takeUntilSubscriber;\n    };\n    return TakeUntilOperator;\n}());\nvar TakeUntilSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](TakeUntilSubscriber, _super);\n    function TakeUntilSubscriber(destination) {\n        var _this = _super.call(this, destination) || this;\n        _this.seenValue = false;\n        return _this;\n    }\n    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.seenValue = true;\n        this.complete();\n    };\n    TakeUntilSubscriber.prototype.notifyComplete = function () {\n    };\n    return TakeUntilSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=takeUntil.js.map\n\n\n/***/ }),\n/* 904 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = takeWhile;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */\n\n\nfunction takeWhile(predicate) {\n    return function (source) { return source.lift(new TakeWhileOperator(predicate)); };\n}\nvar TakeWhileOperator = /*@__PURE__*/ (function () {\n    function TakeWhileOperator(predicate) {\n        this.predicate = predicate;\n    }\n    TakeWhileOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate));\n    };\n    return TakeWhileOperator;\n}());\nvar TakeWhileSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](TakeWhileSubscriber, _super);\n    function TakeWhileSubscriber(destination, predicate) {\n        var _this = _super.call(this, destination) || this;\n        _this.predicate = predicate;\n        _this.index = 0;\n        return _this;\n    }\n    TakeWhileSubscriber.prototype._next = function (value) {\n        var destination = this.destination;\n        var result;\n        try {\n            result = this.predicate(value, this.index++);\n        }\n        catch (err) {\n            destination.error(err);\n            return;\n        }\n        this.nextOrComplete(value, result);\n    };\n    TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) {\n        var destination = this.destination;\n        if (Boolean(predicateResult)) {\n            destination.next(value);\n        }\n        else {\n            destination.complete();\n        }\n    };\n    return TakeWhileSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=takeWhile.js.map\n\n\n/***/ }),\n/* 905 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = throttleTime;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__scheduler_async__ = __webpack_require__(40);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__throttle__ = __webpack_require__(436);\n/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async,_throttle PURE_IMPORTS_END */\n\n\n\n\nfunction throttleTime(duration, scheduler, config) {\n    if (scheduler === void 0) {\n        scheduler = __WEBPACK_IMPORTED_MODULE_2__scheduler_async__[\"a\" /* async */];\n    }\n    if (config === void 0) {\n        config = __WEBPACK_IMPORTED_MODULE_3__throttle__[\"b\" /* defaultThrottleConfig */];\n    }\n    return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); };\n}\nvar ThrottleTimeOperator = /*@__PURE__*/ (function () {\n    function ThrottleTimeOperator(duration, scheduler, leading, trailing) {\n        this.duration = duration;\n        this.scheduler = scheduler;\n        this.leading = leading;\n        this.trailing = trailing;\n    }\n    ThrottleTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));\n    };\n    return ThrottleTimeOperator;\n}());\nvar ThrottleTimeSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](ThrottleTimeSubscriber, _super);\n    function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) {\n        var _this = _super.call(this, destination) || this;\n        _this.duration = duration;\n        _this.scheduler = scheduler;\n        _this.leading = leading;\n        _this.trailing = trailing;\n        _this._hasTrailingValue = false;\n        _this._trailingValue = null;\n        return _this;\n    }\n    ThrottleTimeSubscriber.prototype._next = function (value) {\n        if (this.throttled) {\n            if (this.trailing) {\n                this._trailingValue = value;\n                this._hasTrailingValue = true;\n            }\n        }\n        else {\n            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));\n            if (this.leading) {\n                this.destination.next(value);\n            }\n        }\n    };\n    ThrottleTimeSubscriber.prototype._complete = function () {\n        if (this._hasTrailingValue) {\n            this.destination.next(this._trailingValue);\n            this.destination.complete();\n        }\n        else {\n            this.destination.complete();\n        }\n    };\n    ThrottleTimeSubscriber.prototype.clearThrottle = function () {\n        var throttled = this.throttled;\n        if (throttled) {\n            if (this.trailing && this._hasTrailingValue) {\n                this.destination.next(this._trailingValue);\n                this._trailingValue = null;\n                this._hasTrailingValue = false;\n            }\n            throttled.unsubscribe();\n            this.remove(throttled);\n            this.throttled = null;\n        }\n    };\n    return ThrottleTimeSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\nfunction dispatchNext(arg) {\n    var subscriber = arg.subscriber;\n    subscriber.clearThrottle();\n}\n//# sourceMappingURL=throttleTime.js.map\n\n\n/***/ }),\n/* 906 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = timeInterval;\n/* unused harmony export TimeInterval */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__scheduler_async__ = __webpack_require__(40);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__scan__ = __webpack_require__(318);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__observable_defer__ = __webpack_require__(311);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__map__ = __webpack_require__(47);\n/** PURE_IMPORTS_START _scheduler_async,_scan,_observable_defer,_map PURE_IMPORTS_END */\n\n\n\n\nfunction timeInterval(scheduler) {\n    if (scheduler === void 0) {\n        scheduler = __WEBPACK_IMPORTED_MODULE_0__scheduler_async__[\"a\" /* async */];\n    }\n    return function (source) {\n        return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__observable_defer__[\"a\" /* defer */])(function () {\n            return source.pipe(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__scan__[\"a\" /* scan */])(function (_a, value) {\n                var current = _a.current;\n                return ({ value: value, current: scheduler.now(), last: current });\n            }, { current: scheduler.now(), value: undefined, last: undefined }), __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__map__[\"a\" /* map */])(function (_a) {\n                var current = _a.current, last = _a.last, value = _a.value;\n                return new TimeInterval(value, current - last);\n            }));\n        });\n    };\n}\nvar TimeInterval = /*@__PURE__*/ (function () {\n    function TimeInterval(value, interval) {\n        this.value = value;\n        this.interval = interval;\n    }\n    return TimeInterval;\n}());\n\n//# sourceMappingURL=timeInterval.js.map\n\n\n/***/ }),\n/* 907 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = timeout;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__scheduler_async__ = __webpack_require__(40);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_TimeoutError__ = __webpack_require__(440);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__timeoutWith__ = __webpack_require__(437);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__observable_throwError__ = __webpack_require__(314);\n/** PURE_IMPORTS_START _scheduler_async,_util_TimeoutError,_timeoutWith,_observable_throwError PURE_IMPORTS_END */\n\n\n\n\nfunction timeout(due, scheduler) {\n    if (scheduler === void 0) {\n        scheduler = __WEBPACK_IMPORTED_MODULE_0__scheduler_async__[\"a\" /* async */];\n    }\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__timeoutWith__[\"a\" /* timeoutWith */])(due, __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__observable_throwError__[\"a\" /* throwError */])(new __WEBPACK_IMPORTED_MODULE_1__util_TimeoutError__[\"a\" /* TimeoutError */]()), scheduler);\n}\n//# sourceMappingURL=timeout.js.map\n\n\n/***/ }),\n/* 908 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = timestamp;\n/* unused harmony export Timestamp */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__scheduler_async__ = __webpack_require__(40);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__map__ = __webpack_require__(47);\n/** PURE_IMPORTS_START _scheduler_async,_map PURE_IMPORTS_END */\n\n\nfunction timestamp(scheduler) {\n    if (scheduler === void 0) {\n        scheduler = __WEBPACK_IMPORTED_MODULE_0__scheduler_async__[\"a\" /* async */];\n    }\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__map__[\"a\" /* map */])(function (value) { return new Timestamp(value, scheduler.now()); });\n}\nvar Timestamp = /*@__PURE__*/ (function () {\n    function Timestamp(value, timestamp) {\n        this.value = value;\n        this.timestamp = timestamp;\n    }\n    return Timestamp;\n}());\n\n//# sourceMappingURL=timestamp.js.map\n\n\n/***/ }),\n/* 909 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = toArray;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__reduce__ = __webpack_require__(188);\n/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */\n\nfunction toArrayReducer(arr, item, index) {\n    if (index === 0) {\n        return [item];\n    }\n    arr.push(item);\n    return arr;\n}\nfunction toArray() {\n    return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__reduce__[\"a\" /* reduce */])(toArrayReducer, []);\n}\n//# sourceMappingURL=toArray.js.map\n\n\n/***/ }),\n/* 910 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = window;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\nfunction window(windowBoundaries) {\n    return function windowOperatorFunction(source) {\n        return source.lift(new WindowOperator(windowBoundaries));\n    };\n}\nvar WindowOperator = /*@__PURE__*/ (function () {\n    function WindowOperator(windowBoundaries) {\n        this.windowBoundaries = windowBoundaries;\n    }\n    WindowOperator.prototype.call = function (subscriber, source) {\n        var windowSubscriber = new WindowSubscriber(subscriber);\n        var sourceSubscription = source.subscribe(windowSubscriber);\n        if (!sourceSubscription.closed) {\n            windowSubscriber.add(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_subscribeToResult__[\"a\" /* subscribeToResult */])(windowSubscriber, this.windowBoundaries));\n        }\n        return sourceSubscription;\n    };\n    return WindowOperator;\n}());\nvar WindowSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](WindowSubscriber, _super);\n    function WindowSubscriber(destination) {\n        var _this = _super.call(this, destination) || this;\n        _this.window = new __WEBPACK_IMPORTED_MODULE_1__Subject__[\"a\" /* Subject */]();\n        destination.next(_this.window);\n        return _this;\n    }\n    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.openWindow();\n    };\n    WindowSubscriber.prototype.notifyError = function (error, innerSub) {\n        this._error(error);\n    };\n    WindowSubscriber.prototype.notifyComplete = function (innerSub) {\n        this._complete();\n    };\n    WindowSubscriber.prototype._next = function (value) {\n        this.window.next(value);\n    };\n    WindowSubscriber.prototype._error = function (err) {\n        this.window.error(err);\n        this.destination.error(err);\n    };\n    WindowSubscriber.prototype._complete = function () {\n        this.window.complete();\n        this.destination.complete();\n    };\n    WindowSubscriber.prototype._unsubscribe = function () {\n        this.window = null;\n    };\n    WindowSubscriber.prototype.openWindow = function () {\n        var prevWindow = this.window;\n        if (prevWindow) {\n            prevWindow.complete();\n        }\n        var destination = this.destination;\n        var newWindow = this.window = new __WEBPACK_IMPORTED_MODULE_1__Subject__[\"a\" /* Subject */]();\n        destination.next(newWindow);\n    };\n    return WindowSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_2__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=window.js.map\n\n\n/***/ }),\n/* 911 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = windowCount;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subject__ = __webpack_require__(36);\n/** PURE_IMPORTS_START tslib,_Subscriber,_Subject PURE_IMPORTS_END */\n\n\n\nfunction windowCount(windowSize, startWindowEvery) {\n    if (startWindowEvery === void 0) {\n        startWindowEvery = 0;\n    }\n    return function windowCountOperatorFunction(source) {\n        return source.lift(new WindowCountOperator(windowSize, startWindowEvery));\n    };\n}\nvar WindowCountOperator = /*@__PURE__*/ (function () {\n    function WindowCountOperator(windowSize, startWindowEvery) {\n        this.windowSize = windowSize;\n        this.startWindowEvery = startWindowEvery;\n    }\n    WindowCountOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery));\n    };\n    return WindowCountOperator;\n}());\nvar WindowCountSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](WindowCountSubscriber, _super);\n    function WindowCountSubscriber(destination, windowSize, startWindowEvery) {\n        var _this = _super.call(this, destination) || this;\n        _this.destination = destination;\n        _this.windowSize = windowSize;\n        _this.startWindowEvery = startWindowEvery;\n        _this.windows = [new __WEBPACK_IMPORTED_MODULE_2__Subject__[\"a\" /* Subject */]()];\n        _this.count = 0;\n        destination.next(_this.windows[0]);\n        return _this;\n    }\n    WindowCountSubscriber.prototype._next = function (value) {\n        var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize;\n        var destination = this.destination;\n        var windowSize = this.windowSize;\n        var windows = this.windows;\n        var len = windows.length;\n        for (var i = 0; i < len && !this.closed; i++) {\n            windows[i].next(value);\n        }\n        var c = this.count - windowSize + 1;\n        if (c >= 0 && c % startWindowEvery === 0 && !this.closed) {\n            windows.shift().complete();\n        }\n        if (++this.count % startWindowEvery === 0 && !this.closed) {\n            var window_1 = new __WEBPACK_IMPORTED_MODULE_2__Subject__[\"a\" /* Subject */]();\n            windows.push(window_1);\n            destination.next(window_1);\n        }\n    };\n    WindowCountSubscriber.prototype._error = function (err) {\n        var windows = this.windows;\n        if (windows) {\n            while (windows.length > 0 && !this.closed) {\n                windows.shift().error(err);\n            }\n        }\n        this.destination.error(err);\n    };\n    WindowCountSubscriber.prototype._complete = function () {\n        var windows = this.windows;\n        if (windows) {\n            while (windows.length > 0 && !this.closed) {\n                windows.shift().complete();\n            }\n        }\n        this.destination.complete();\n    };\n    WindowCountSubscriber.prototype._unsubscribe = function () {\n        this.count = 0;\n        this.windows = null;\n    };\n    return WindowCountSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__[\"a\" /* Subscriber */]));\n//# sourceMappingURL=windowCount.js.map\n\n\n/***/ }),\n/* 912 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = windowTime;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__scheduler_async__ = __webpack_require__(40);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_isNumeric__ = __webpack_require__(191);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_isScheduler__ = __webpack_require__(49);\n/** PURE_IMPORTS_START tslib,_Subject,_scheduler_async,_Subscriber,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction windowTime(windowTimeSpan) {\n    var scheduler = __WEBPACK_IMPORTED_MODULE_2__scheduler_async__[\"a\" /* async */];\n    var windowCreationInterval = null;\n    var maxWindowSize = Number.POSITIVE_INFINITY;\n    if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__util_isScheduler__[\"a\" /* isScheduler */])(arguments[3])) {\n        scheduler = arguments[3];\n    }\n    if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__util_isScheduler__[\"a\" /* isScheduler */])(arguments[2])) {\n        scheduler = arguments[2];\n    }\n    else if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_isNumeric__[\"a\" /* isNumeric */])(arguments[2])) {\n        maxWindowSize = arguments[2];\n    }\n    if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__util_isScheduler__[\"a\" /* isScheduler */])(arguments[1])) {\n        scheduler = arguments[1];\n    }\n    else if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_4__util_isNumeric__[\"a\" /* isNumeric */])(arguments[1])) {\n        windowCreationInterval = arguments[1];\n    }\n    return function windowTimeOperatorFunction(source) {\n        return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler));\n    };\n}\nvar WindowTimeOperator = /*@__PURE__*/ (function () {\n    function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {\n        this.windowTimeSpan = windowTimeSpan;\n        this.windowCreationInterval = windowCreationInterval;\n        this.maxWindowSize = maxWindowSize;\n        this.scheduler = scheduler;\n    }\n    WindowTimeOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler));\n    };\n    return WindowTimeOperator;\n}());\nvar CountedSubject = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](CountedSubject, _super);\n    function CountedSubject() {\n        var _this = _super !== null && _super.apply(this, arguments) || this;\n        _this._numberOfNextedValues = 0;\n        return _this;\n    }\n    CountedSubject.prototype.next = function (value) {\n        this._numberOfNextedValues++;\n        _super.prototype.next.call(this, value);\n    };\n    Object.defineProperty(CountedSubject.prototype, \"numberOfNextedValues\", {\n        get: function () {\n            return this._numberOfNextedValues;\n        },\n        enumerable: true,\n        configurable: true\n    });\n    return CountedSubject;\n}(__WEBPACK_IMPORTED_MODULE_1__Subject__[\"a\" /* Subject */]));\nvar WindowTimeSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](WindowTimeSubscriber, _super);\n    function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {\n        var _this = _super.call(this, destination) || this;\n        _this.destination = destination;\n        _this.windowTimeSpan = windowTimeSpan;\n        _this.windowCreationInterval = windowCreationInterval;\n        _this.maxWindowSize = maxWindowSize;\n        _this.scheduler = scheduler;\n        _this.windows = [];\n        var window = _this.openWindow();\n        if (windowCreationInterval !== null && windowCreationInterval >= 0) {\n            var closeState = { subscriber: _this, window: window, context: null };\n            var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler };\n            _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState));\n            _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState));\n        }\n        else {\n            var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan };\n            _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState));\n        }\n        return _this;\n    }\n    WindowTimeSubscriber.prototype._next = function (value) {\n        var windows = this.windows;\n        var len = windows.length;\n        for (var i = 0; i < len; i++) {\n            var window_1 = windows[i];\n            if (!window_1.closed) {\n                window_1.next(value);\n                if (window_1.numberOfNextedValues >= this.maxWindowSize) {\n                    this.closeWindow(window_1);\n                }\n            }\n        }\n    };\n    WindowTimeSubscriber.prototype._error = function (err) {\n        var windows = this.windows;\n        while (windows.length > 0) {\n            windows.shift().error(err);\n        }\n        this.destination.error(err);\n    };\n    WindowTimeSubscriber.prototype._complete = function () {\n        var windows = this.windows;\n        while (windows.length > 0) {\n            var window_2 = windows.shift();\n            if (!window_2.closed) {\n                window_2.complete();\n            }\n        }\n        this.destination.complete();\n    };\n    WindowTimeSubscriber.prototype.openWindow = function () {\n        var window = new CountedSubject();\n        this.windows.push(window);\n        var destination = this.destination;\n        destination.next(window);\n        return window;\n    };\n    WindowTimeSubscriber.prototype.closeWindow = function (window) {\n        window.complete();\n        var windows = this.windows;\n        windows.splice(windows.indexOf(window), 1);\n    };\n    return WindowTimeSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_3__Subscriber__[\"a\" /* Subscriber */]));\nfunction dispatchWindowTimeSpanOnly(state) {\n    var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window;\n    if (window) {\n        subscriber.closeWindow(window);\n    }\n    state.window = subscriber.openWindow();\n    this.schedule(state, windowTimeSpan);\n}\nfunction dispatchWindowCreation(state) {\n    var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval;\n    var window = subscriber.openWindow();\n    var action = this;\n    var context = { action: action, subscription: null };\n    var timeSpanState = { subscriber: subscriber, window: window, context: context };\n    context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState);\n    action.add(context.subscription);\n    action.schedule(state, windowCreationInterval);\n}\nfunction dispatchWindowClose(state) {\n    var subscriber = state.subscriber, window = state.window, context = state.context;\n    if (context && context.action && context.subscription) {\n        context.action.remove(context.subscription);\n    }\n    subscriber.closeWindow(window);\n}\n//# sourceMappingURL=windowTime.js.map\n\n\n/***/ }),\n/* 913 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = windowToggle;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subscription__ = __webpack_require__(25);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__ = __webpack_require__(57);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_errorObject__ = __webpack_require__(48);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_Subject,_Subscription,_util_tryCatch,_util_errorObject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\n\n\n\nfunction windowToggle(openings, closingSelector) {\n    return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); };\n}\nvar WindowToggleOperator = /*@__PURE__*/ (function () {\n    function WindowToggleOperator(openings, closingSelector) {\n        this.openings = openings;\n        this.closingSelector = closingSelector;\n    }\n    WindowToggleOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector));\n    };\n    return WindowToggleOperator;\n}());\nvar WindowToggleSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](WindowToggleSubscriber, _super);\n    function WindowToggleSubscriber(destination, openings, closingSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.openings = openings;\n        _this.closingSelector = closingSelector;\n        _this.contexts = [];\n        _this.add(_this.openSubscription = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_subscribeToResult__[\"a\" /* subscribeToResult */])(_this, openings, openings));\n        return _this;\n    }\n    WindowToggleSubscriber.prototype._next = function (value) {\n        var contexts = this.contexts;\n        if (contexts) {\n            var len = contexts.length;\n            for (var i = 0; i < len; i++) {\n                contexts[i].window.next(value);\n            }\n        }\n    };\n    WindowToggleSubscriber.prototype._error = function (err) {\n        var contexts = this.contexts;\n        this.contexts = null;\n        if (contexts) {\n            var len = contexts.length;\n            var index = -1;\n            while (++index < len) {\n                var context_1 = contexts[index];\n                context_1.window.error(err);\n                context_1.subscription.unsubscribe();\n            }\n        }\n        _super.prototype._error.call(this, err);\n    };\n    WindowToggleSubscriber.prototype._complete = function () {\n        var contexts = this.contexts;\n        this.contexts = null;\n        if (contexts) {\n            var len = contexts.length;\n            var index = -1;\n            while (++index < len) {\n                var context_2 = contexts[index];\n                context_2.window.complete();\n                context_2.subscription.unsubscribe();\n            }\n        }\n        _super.prototype._complete.call(this);\n    };\n    WindowToggleSubscriber.prototype._unsubscribe = function () {\n        var contexts = this.contexts;\n        this.contexts = null;\n        if (contexts) {\n            var len = contexts.length;\n            var index = -1;\n            while (++index < len) {\n                var context_3 = contexts[index];\n                context_3.window.unsubscribe();\n                context_3.subscription.unsubscribe();\n            }\n        }\n    };\n    WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        if (outerValue === this.openings) {\n            var closingSelector = this.closingSelector;\n            var closingNotifier = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_tryCatch__[\"a\" /* tryCatch */])(closingSelector)(innerValue);\n            if (closingNotifier === __WEBPACK_IMPORTED_MODULE_4__util_errorObject__[\"a\" /* errorObject */]) {\n                return this.error(__WEBPACK_IMPORTED_MODULE_4__util_errorObject__[\"a\" /* errorObject */].e);\n            }\n            else {\n                var window_1 = new __WEBPACK_IMPORTED_MODULE_1__Subject__[\"a\" /* Subject */]();\n                var subscription = new __WEBPACK_IMPORTED_MODULE_2__Subscription__[\"a\" /* Subscription */]();\n                var context_4 = { window: window_1, subscription: subscription };\n                this.contexts.push(context_4);\n                var innerSubscription = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, closingNotifier, context_4);\n                if (innerSubscription.closed) {\n                    this.closeWindow(this.contexts.length - 1);\n                }\n                else {\n                    innerSubscription.context = context_4;\n                    subscription.add(innerSubscription);\n                }\n                this.destination.next(window_1);\n            }\n        }\n        else {\n            this.closeWindow(this.contexts.indexOf(outerValue));\n        }\n    };\n    WindowToggleSubscriber.prototype.notifyError = function (err) {\n        this.error(err);\n    };\n    WindowToggleSubscriber.prototype.notifyComplete = function (inner) {\n        if (inner !== this.openSubscription) {\n            this.closeWindow(this.contexts.indexOf(inner.context));\n        }\n    };\n    WindowToggleSubscriber.prototype.closeWindow = function (index) {\n        if (index === -1) {\n            return;\n        }\n        var contexts = this.contexts;\n        var context = contexts[index];\n        var window = context.window, subscription = context.subscription;\n        contexts.splice(index, 1);\n        window.complete();\n        subscription.unsubscribe();\n    };\n    return WindowToggleSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_5__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=windowToggle.js.map\n\n\n/***/ }),\n/* 914 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = windowWhen;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subject__ = __webpack_require__(36);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_tryCatch__ = __webpack_require__(57);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_errorObject__ = __webpack_require__(48);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_Subject,_util_tryCatch,_util_errorObject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\n\n\n\nfunction windowWhen(closingSelector) {\n    return function windowWhenOperatorFunction(source) {\n        return source.lift(new WindowOperator(closingSelector));\n    };\n}\nvar WindowOperator = /*@__PURE__*/ (function () {\n    function WindowOperator(closingSelector) {\n        this.closingSelector = closingSelector;\n    }\n    WindowOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector));\n    };\n    return WindowOperator;\n}());\nvar WindowSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](WindowSubscriber, _super);\n    function WindowSubscriber(destination, closingSelector) {\n        var _this = _super.call(this, destination) || this;\n        _this.destination = destination;\n        _this.closingSelector = closingSelector;\n        _this.openWindow();\n        return _this;\n    }\n    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.openWindow(innerSub);\n    };\n    WindowSubscriber.prototype.notifyError = function (error, innerSub) {\n        this._error(error);\n    };\n    WindowSubscriber.prototype.notifyComplete = function (innerSub) {\n        this.openWindow(innerSub);\n    };\n    WindowSubscriber.prototype._next = function (value) {\n        this.window.next(value);\n    };\n    WindowSubscriber.prototype._error = function (err) {\n        this.window.error(err);\n        this.destination.error(err);\n        this.unsubscribeClosingNotification();\n    };\n    WindowSubscriber.prototype._complete = function () {\n        this.window.complete();\n        this.destination.complete();\n        this.unsubscribeClosingNotification();\n    };\n    WindowSubscriber.prototype.unsubscribeClosingNotification = function () {\n        if (this.closingNotification) {\n            this.closingNotification.unsubscribe();\n        }\n    };\n    WindowSubscriber.prototype.openWindow = function (innerSub) {\n        if (innerSub === void 0) {\n            innerSub = null;\n        }\n        if (innerSub) {\n            this.remove(innerSub);\n            innerSub.unsubscribe();\n        }\n        var prevWindow = this.window;\n        if (prevWindow) {\n            prevWindow.complete();\n        }\n        var window = this.window = new __WEBPACK_IMPORTED_MODULE_1__Subject__[\"a\" /* Subject */]();\n        this.destination.next(window);\n        var closingNotifier = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_tryCatch__[\"a\" /* tryCatch */])(this.closingSelector)();\n        if (closingNotifier === __WEBPACK_IMPORTED_MODULE_3__util_errorObject__[\"a\" /* errorObject */]) {\n            var err = __WEBPACK_IMPORTED_MODULE_3__util_errorObject__[\"a\" /* errorObject */].e;\n            this.destination.error(err);\n            this.window.error(err);\n        }\n        else {\n            this.add(this.closingNotification = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_5__util_subscribeToResult__[\"a\" /* subscribeToResult */])(this, closingNotifier));\n        }\n    };\n    return WindowSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_4__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=windowWhen.js.map\n\n\n/***/ }),\n/* 915 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = withLatestFrom;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__ = __webpack_require__(14);\n/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */\n\n\n\nfunction withLatestFrom() {\n    var args = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        args[_i] = arguments[_i];\n    }\n    return function (source) {\n        var project;\n        if (typeof args[args.length - 1] === 'function') {\n            project = args.pop();\n        }\n        var observables = args;\n        return source.lift(new WithLatestFromOperator(observables, project));\n    };\n}\nvar WithLatestFromOperator = /*@__PURE__*/ (function () {\n    function WithLatestFromOperator(observables, project) {\n        this.observables = observables;\n        this.project = project;\n    }\n    WithLatestFromOperator.prototype.call = function (subscriber, source) {\n        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));\n    };\n    return WithLatestFromOperator;\n}());\nvar WithLatestFromSubscriber = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](WithLatestFromSubscriber, _super);\n    function WithLatestFromSubscriber(destination, observables, project) {\n        var _this = _super.call(this, destination) || this;\n        _this.observables = observables;\n        _this.project = project;\n        _this.toRespond = [];\n        var len = observables.length;\n        _this.values = new Array(len);\n        for (var i = 0; i < len; i++) {\n            _this.toRespond.push(i);\n        }\n        for (var i = 0; i < len; i++) {\n            var observable = observables[i];\n            _this.add(__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_subscribeToResult__[\"a\" /* subscribeToResult */])(_this, observable, observable, i));\n        }\n        return _this;\n    }\n    WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {\n        this.values[outerIndex] = innerValue;\n        var toRespond = this.toRespond;\n        if (toRespond.length > 0) {\n            var found = toRespond.indexOf(outerIndex);\n            if (found !== -1) {\n                toRespond.splice(found, 1);\n            }\n        }\n    };\n    WithLatestFromSubscriber.prototype.notifyComplete = function () {\n    };\n    WithLatestFromSubscriber.prototype._next = function (value) {\n        if (this.toRespond.length === 0) {\n            var args = [value].concat(this.values);\n            if (this.project) {\n                this._tryProject(args);\n            }\n            else {\n                this.destination.next(args);\n            }\n        }\n    };\n    WithLatestFromSubscriber.prototype._tryProject = function (args) {\n        var result;\n        try {\n            result = this.project.apply(this, args);\n        }\n        catch (err) {\n            this.destination.error(err);\n            return;\n        }\n        this.destination.next(result);\n    };\n    return WithLatestFromSubscriber;\n}(__WEBPACK_IMPORTED_MODULE_1__OuterSubscriber__[\"a\" /* OuterSubscriber */]));\n//# sourceMappingURL=withLatestFrom.js.map\n\n\n/***/ }),\n/* 916 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = zip;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_zip__ = __webpack_require__(315);\n/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */\n\nfunction zip() {\n    var observables = [];\n    for (var _i = 0; _i < arguments.length; _i++) {\n        observables[_i] = arguments[_i];\n    }\n    return function zipOperatorFunction(source) {\n        return source.lift.call(__WEBPACK_IMPORTED_MODULE_0__observable_zip__[\"a\" /* zip */].apply(void 0, [source].concat(observables)));\n    };\n}\n//# sourceMappingURL=zip.js.map\n\n\n/***/ }),\n/* 917 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = zipAll;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__observable_zip__ = __webpack_require__(315);\n/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */\n\nfunction zipAll(project) {\n    return function (source) { return source.lift(new __WEBPACK_IMPORTED_MODULE_0__observable_zip__[\"b\" /* ZipOperator */](project)); };\n}\n//# sourceMappingURL=zipAll.js.map\n\n\n/***/ }),\n/* 918 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Action; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscription__ = __webpack_require__(25);\n/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */\n\n\nvar Action = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](Action, _super);\n    function Action(scheduler, work) {\n        return _super.call(this) || this;\n    }\n    Action.prototype.schedule = function (state, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        return this;\n    };\n    return Action;\n}(__WEBPACK_IMPORTED_MODULE_1__Subscription__[\"a\" /* Subscription */]));\n\n//# sourceMappingURL=Action.js.map\n\n\n/***/ }),\n/* 919 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AnimationFrameAction; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsyncAction__ = __webpack_require__(150);\n/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */\n\n\nvar AnimationFrameAction = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](AnimationFrameAction, _super);\n    function AnimationFrameAction(scheduler, work) {\n        var _this = _super.call(this, scheduler, work) || this;\n        _this.scheduler = scheduler;\n        _this.work = work;\n        return _this;\n    }\n    AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        if (delay !== null && delay > 0) {\n            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);\n        }\n        scheduler.actions.push(this);\n        return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); }));\n    };\n    AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);\n        }\n        if (scheduler.actions.length === 0) {\n            cancelAnimationFrame(id);\n            scheduler.scheduled = undefined;\n        }\n        return undefined;\n    };\n    return AnimationFrameAction;\n}(__WEBPACK_IMPORTED_MODULE_1__AsyncAction__[\"a\" /* AsyncAction */]));\n\n//# sourceMappingURL=AnimationFrameAction.js.map\n\n\n/***/ }),\n/* 920 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AnimationFrameScheduler; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsyncScheduler__ = __webpack_require__(151);\n/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */\n\n\nvar AnimationFrameScheduler = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](AnimationFrameScheduler, _super);\n    function AnimationFrameScheduler() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    AnimationFrameScheduler.prototype.flush = function (action) {\n        this.active = true;\n        this.scheduled = undefined;\n        var actions = this.actions;\n        var error;\n        var index = -1;\n        var count = actions.length;\n        action = action || actions.shift();\n        do {\n            if (error = action.execute(action.state, action.delay)) {\n                break;\n            }\n        } while (++index < count && (action = actions.shift()));\n        this.active = false;\n        if (error) {\n            while (++index < count && (action = actions.shift())) {\n                action.unsubscribe();\n            }\n            throw error;\n        }\n    };\n    return AnimationFrameScheduler;\n}(__WEBPACK_IMPORTED_MODULE_1__AsyncScheduler__[\"a\" /* AsyncScheduler */]));\n\n//# sourceMappingURL=AnimationFrameScheduler.js.map\n\n\n/***/ }),\n/* 921 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AsapAction; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_Immediate__ = __webpack_require__(927);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__AsyncAction__ = __webpack_require__(150);\n/** PURE_IMPORTS_START tslib,_util_Immediate,_AsyncAction PURE_IMPORTS_END */\n\n\n\nvar AsapAction = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](AsapAction, _super);\n    function AsapAction(scheduler, work) {\n        var _this = _super.call(this, scheduler, work) || this;\n        _this.scheduler = scheduler;\n        _this.work = work;\n        return _this;\n    }\n    AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        if (delay !== null && delay > 0) {\n            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);\n        }\n        scheduler.actions.push(this);\n        return scheduler.scheduled || (scheduler.scheduled = __WEBPACK_IMPORTED_MODULE_1__util_Immediate__[\"a\" /* Immediate */].setImmediate(scheduler.flush.bind(scheduler, null)));\n    };\n    AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);\n        }\n        if (scheduler.actions.length === 0) {\n            __WEBPACK_IMPORTED_MODULE_1__util_Immediate__[\"a\" /* Immediate */].clearImmediate(id);\n            scheduler.scheduled = undefined;\n        }\n        return undefined;\n    };\n    return AsapAction;\n}(__WEBPACK_IMPORTED_MODULE_2__AsyncAction__[\"a\" /* AsyncAction */]));\n\n//# sourceMappingURL=AsapAction.js.map\n\n\n/***/ }),\n/* 922 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return AsapScheduler; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsyncScheduler__ = __webpack_require__(151);\n/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */\n\n\nvar AsapScheduler = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](AsapScheduler, _super);\n    function AsapScheduler() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    AsapScheduler.prototype.flush = function (action) {\n        this.active = true;\n        this.scheduled = undefined;\n        var actions = this.actions;\n        var error;\n        var index = -1;\n        var count = actions.length;\n        action = action || actions.shift();\n        do {\n            if (error = action.execute(action.state, action.delay)) {\n                break;\n            }\n        } while (++index < count && (action = actions.shift()));\n        this.active = false;\n        if (error) {\n            while (++index < count && (action = actions.shift())) {\n                action.unsubscribe();\n            }\n            throw error;\n        }\n    };\n    return AsapScheduler;\n}(__WEBPACK_IMPORTED_MODULE_1__AsyncScheduler__[\"a\" /* AsyncScheduler */]));\n\n//# sourceMappingURL=AsapScheduler.js.map\n\n\n/***/ }),\n/* 923 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return QueueAction; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsyncAction__ = __webpack_require__(150);\n/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */\n\n\nvar QueueAction = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](QueueAction, _super);\n    function QueueAction(scheduler, work) {\n        var _this = _super.call(this, scheduler, work) || this;\n        _this.scheduler = scheduler;\n        _this.work = work;\n        return _this;\n    }\n    QueueAction.prototype.schedule = function (state, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        if (delay > 0) {\n            return _super.prototype.schedule.call(this, state, delay);\n        }\n        this.delay = delay;\n        this.state = state;\n        this.scheduler.flush(this);\n        return this;\n    };\n    QueueAction.prototype.execute = function (state, delay) {\n        return (delay > 0 || this.closed) ?\n            _super.prototype.execute.call(this, state, delay) :\n            this._execute(state, delay);\n    };\n    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {\n            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);\n        }\n        return scheduler.flush(this);\n    };\n    return QueueAction;\n}(__WEBPACK_IMPORTED_MODULE_1__AsyncAction__[\"a\" /* AsyncAction */]));\n\n//# sourceMappingURL=QueueAction.js.map\n\n\n/***/ }),\n/* 924 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return QueueScheduler; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsyncScheduler__ = __webpack_require__(151);\n/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */\n\n\nvar QueueScheduler = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](QueueScheduler, _super);\n    function QueueScheduler() {\n        return _super !== null && _super.apply(this, arguments) || this;\n    }\n    return QueueScheduler;\n}(__WEBPACK_IMPORTED_MODULE_1__AsyncScheduler__[\"a\" /* AsyncScheduler */]));\n\n//# sourceMappingURL=QueueScheduler.js.map\n\n\n/***/ }),\n/* 925 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return VirtualTimeScheduler; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return VirtualAction; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AsyncAction__ = __webpack_require__(150);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__AsyncScheduler__ = __webpack_require__(151);\n/** PURE_IMPORTS_START tslib,_AsyncAction,_AsyncScheduler PURE_IMPORTS_END */\n\n\n\nvar VirtualTimeScheduler = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](VirtualTimeScheduler, _super);\n    function VirtualTimeScheduler(SchedulerAction, maxFrames) {\n        if (SchedulerAction === void 0) {\n            SchedulerAction = VirtualAction;\n        }\n        if (maxFrames === void 0) {\n            maxFrames = Number.POSITIVE_INFINITY;\n        }\n        var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this;\n        _this.maxFrames = maxFrames;\n        _this.frame = 0;\n        _this.index = -1;\n        return _this;\n    }\n    VirtualTimeScheduler.prototype.flush = function () {\n        var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;\n        var error, action;\n        while ((action = actions.shift()) && (this.frame = action.delay) <= maxFrames) {\n            if (error = action.execute(action.state, action.delay)) {\n                break;\n            }\n        }\n        if (error) {\n            while (action = actions.shift()) {\n                action.unsubscribe();\n            }\n            throw error;\n        }\n    };\n    VirtualTimeScheduler.frameTimeFactor = 10;\n    return VirtualTimeScheduler;\n}(__WEBPACK_IMPORTED_MODULE_2__AsyncScheduler__[\"a\" /* AsyncScheduler */]));\n\nvar VirtualAction = /*@__PURE__*/ (function (_super) {\n    __WEBPACK_IMPORTED_MODULE_0_tslib__[\"a\" /* __extends */](VirtualAction, _super);\n    function VirtualAction(scheduler, work, index) {\n        if (index === void 0) {\n            index = scheduler.index += 1;\n        }\n        var _this = _super.call(this, scheduler, work) || this;\n        _this.scheduler = scheduler;\n        _this.work = work;\n        _this.index = index;\n        _this.active = true;\n        _this.index = scheduler.index = index;\n        return _this;\n    }\n    VirtualAction.prototype.schedule = function (state, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        if (!this.id) {\n            return _super.prototype.schedule.call(this, state, delay);\n        }\n        this.active = false;\n        var action = new VirtualAction(this.scheduler, this.work);\n        this.add(action);\n        return action.schedule(state, delay);\n    };\n    VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        this.delay = scheduler.frame + delay;\n        var actions = scheduler.actions;\n        actions.push(this);\n        actions.sort(VirtualAction.sortActions);\n        return true;\n    };\n    VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {\n        if (delay === void 0) {\n            delay = 0;\n        }\n        return undefined;\n    };\n    VirtualAction.prototype._execute = function (state, delay) {\n        if (this.active === true) {\n            return _super.prototype._execute.call(this, state, delay);\n        }\n    };\n    VirtualAction.sortActions = function (a, b) {\n        if (a.delay === b.delay) {\n            if (a.index === b.index) {\n                return 0;\n            }\n            else if (a.index > b.index) {\n                return 1;\n            }\n            else {\n                return -1;\n            }\n        }\n        else if (a.delay > b.delay) {\n            return 1;\n        }\n        else {\n            return -1;\n        }\n    };\n    return VirtualAction;\n}(__WEBPACK_IMPORTED_MODULE_1__AsyncAction__[\"a\" /* AsyncAction */]));\n\n//# sourceMappingURL=VirtualTimeScheduler.js.map\n\n\n/***/ }),\n/* 926 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return animationFrame; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__AnimationFrameAction__ = __webpack_require__(919);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__AnimationFrameScheduler__ = __webpack_require__(920);\n/** PURE_IMPORTS_START _AnimationFrameAction,_AnimationFrameScheduler PURE_IMPORTS_END */\n\n\nvar animationFrame = /*@__PURE__*/ new __WEBPACK_IMPORTED_MODULE_1__AnimationFrameScheduler__[\"a\" /* AnimationFrameScheduler */](__WEBPACK_IMPORTED_MODULE_0__AnimationFrameAction__[\"a\" /* AnimationFrameAction */]);\n//# sourceMappingURL=animationFrame.js.map\n\n\n/***/ }),\n/* 927 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return Immediate; });\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nvar nextHandle = 1;\nvar tasksByHandle = {};\nfunction runIfPresent(handle) {\n    var cb = tasksByHandle[handle];\n    if (cb) {\n        cb();\n    }\n}\nvar Immediate = {\n    setImmediate: function (cb) {\n        var handle = nextHandle++;\n        tasksByHandle[handle] = cb;\n        Promise.resolve().then(function () { return runIfPresent(handle); });\n        return handle;\n    },\n    clearImmediate: function (handle) {\n        delete tasksByHandle[handle];\n    },\n};\n//# sourceMappingURL=Immediate.js.map\n\n\n/***/ }),\n/* 928 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = isInteropObservable;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__symbol_observable__ = __webpack_require__(118);\n/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */\n\nfunction isInteropObservable(input) {\n    return input && typeof input[__WEBPACK_IMPORTED_MODULE_0__symbol_observable__[\"a\" /* observable */]] === 'function';\n}\n//# sourceMappingURL=isInteropObservable.js.map\n\n\n/***/ }),\n/* 929 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = isIterable;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__symbol_iterator__ = __webpack_require__(152);\n/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */\n\nfunction isIterable(input) {\n    return input && typeof input[__WEBPACK_IMPORTED_MODULE_0__symbol_iterator__[\"a\" /* iterator */]] === 'function';\n}\n//# sourceMappingURL=isIterable.js.map\n\n\n/***/ }),\n/* 930 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = isObservable;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Observable__ = __webpack_require__(12);\n/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */\n\nfunction isObservable(obj) {\n    return !!obj && (obj instanceof __WEBPACK_IMPORTED_MODULE_0__Observable__[\"a\" /* Observable */] || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));\n}\n//# sourceMappingURL=isObservable.js.map\n\n\n/***/ }),\n/* 931 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = not;\n/** PURE_IMPORTS_START  PURE_IMPORTS_END */\nfunction not(pred, thisArg) {\n    function notPred() {\n        return !(notPred.pred.apply(notPred.thisArg, arguments));\n    }\n    notPred.pred = pred;\n    notPred.thisArg = thisArg;\n    return notPred;\n}\n//# sourceMappingURL=not.js.map\n\n\n/***/ }),\n/* 932 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = toSubscriber;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__Subscriber__ = __webpack_require__(7);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__symbol_rxSubscriber__ = __webpack_require__(322);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Observer__ = __webpack_require__(420);\n/** PURE_IMPORTS_START _Subscriber,_symbol_rxSubscriber,_Observer PURE_IMPORTS_END */\n\n\n\nfunction toSubscriber(nextOrObserver, error, complete) {\n    if (nextOrObserver) {\n        if (nextOrObserver instanceof __WEBPACK_IMPORTED_MODULE_0__Subscriber__[\"a\" /* Subscriber */]) {\n            return nextOrObserver;\n        }\n        if (nextOrObserver[__WEBPACK_IMPORTED_MODULE_1__symbol_rxSubscriber__[\"a\" /* rxSubscriber */]]) {\n            return nextOrObserver[__WEBPACK_IMPORTED_MODULE_1__symbol_rxSubscriber__[\"a\" /* rxSubscriber */]]();\n        }\n    }\n    if (!nextOrObserver && !error && !complete) {\n        return new __WEBPACK_IMPORTED_MODULE_0__Subscriber__[\"a\" /* Subscriber */](__WEBPACK_IMPORTED_MODULE_2__Observer__[\"a\" /* empty */]);\n    }\n    return new __WEBPACK_IMPORTED_MODULE_0__Subscriber__[\"a\" /* Subscriber */](nextOrObserver, error, complete);\n}\n//# sourceMappingURL=toSubscriber.js.map\n\n\n/***/ }),\n/* 933 */\n/***/ (function(module, exports) {\n\n// This is not the set of all possible signals.\n//\n// It IS, however, the set of all signals that trigger\n// an exit on either Linux or BSD systems.  Linux is a\n// superset of the signal names supported on BSD, and\n// the unknown signals just fail to register, so we can\n// catch that easily enough.\n//\n// Don't bother with SIGKILL.  It's uncatchable, which\n// means that we can't fire any callbacks anyway.\n//\n// If a user does happen to register a handler on a non-\n// fatal signal like SIGWINCH or something, and then\n// exit, it'll end up firing `process.emit('exit')`, so\n// the handler will be fired anyway.\n//\n// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised\n// artificially, inherently leave the process in a\n// state from which it is not safe to try and enter JS\n// listeners.\nmodule.exports = [\n  'SIGABRT',\n  'SIGALRM',\n  'SIGHUP',\n  'SIGINT',\n  'SIGTERM'\n]\n\nif (process.platform !== 'win32') {\n  module.exports.push(\n    'SIGVTALRM',\n    'SIGXCPU',\n    'SIGXFSZ',\n    'SIGUSR2',\n    'SIGTRAP',\n    'SIGSYS',\n    'SIGQUIT',\n    'SIGIOT'\n    // should detect profiler and enable/disable accordingly.\n    // see #21\n    // 'SIGPROF'\n  )\n}\n\nif (process.platform === 'linux') {\n  module.exports.push(\n    'SIGIO',\n    'SIGPOLL',\n    'SIGPWR',\n    'SIGSTKFLT',\n    'SIGUNUSED'\n  )\n}\n\n\n/***/ }),\n/* 934 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst isPlainObj = __webpack_require__(738);\n\nmodule.exports = (obj, opts) => {\n\tif (!isPlainObj(obj)) {\n\t\tthrow new TypeError('Expected a plain object');\n\t}\n\n\topts = opts || {};\n\n\t// DEPRECATED\n\tif (typeof opts === 'function') {\n\t\tthrow new TypeError('Specify the compare function as an option instead');\n\t}\n\n\tconst deep = opts.deep;\n\tconst seenInput = [];\n\tconst seenOutput = [];\n\n\tconst sortKeys = x => {\n\t\tconst seenIndex = seenInput.indexOf(x);\n\n\t\tif (seenIndex !== -1) {\n\t\t\treturn seenOutput[seenIndex];\n\t\t}\n\n\t\tconst ret = {};\n\t\tconst keys = Object.keys(x).sort(opts.compare);\n\n\t\tseenInput.push(x);\n\t\tseenOutput.push(ret);\n\n\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\tconst key = keys[i];\n\t\t\tconst val = x[key];\n\n\t\t\tif (deep && Array.isArray(val)) {\n\t\t\t\tconst retArr = [];\n\n\t\t\t\tfor (let j = 0; j < val.length; j++) {\n\t\t\t\t\tretArr[j] = isPlainObj(val[j]) ? sortKeys(val[j]) : val[j];\n\t\t\t\t}\n\n\t\t\t\tret[key] = retArr;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tret[key] = deep && isPlainObj(val) ? sortKeys(val) : val;\n\t\t}\n\n\t\treturn ret;\n\t};\n\n\treturn sortKeys(obj);\n};\n\n\n/***/ }),\n/* 935 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\nCopyright 2015 Kyle E. Mitchell\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nvar parse = __webpack_require__(452)\nvar spdxLicenseIds = __webpack_require__(453)\n\nfunction valid (string) {\n  try {\n    parse(string)\n    return true\n  } catch (error) {\n    return false\n  }\n}\n\n// Common transpositions of license identifier acronyms\nvar transpositions = [\n  ['APGL', 'AGPL'],\n  ['Gpl', 'GPL'],\n  ['GLP', 'GPL'],\n  ['APL', 'Apache'],\n  ['ISD', 'ISC'],\n  ['GLP', 'GPL'],\n  ['IST', 'ISC'],\n  ['Claude', 'Clause'],\n  [' or later', '+'],\n  [' International', ''],\n  ['GNU', 'GPL'],\n  ['GUN', 'GPL'],\n  ['+', ''],\n  ['GNU GPL', 'GPL'],\n  ['GNU/GPL', 'GPL'],\n  ['GNU GLP', 'GPL'],\n  ['GNU General Public License', 'GPL'],\n  ['Gnu public license', 'GPL'],\n  ['GNU Public License', 'GPL'],\n  ['GNU GENERAL PUBLIC LICENSE', 'GPL'],\n  ['MTI', 'MIT'],\n  ['Mozilla Public License', 'MPL'],\n  ['WTH', 'WTF'],\n  ['-License', '']\n]\n\nvar TRANSPOSED = 0\nvar CORRECT = 1\n\n// Simple corrections to nearly valid identifiers.\nvar transforms = [\n  // e.g. 'mit'\n  function (argument) {\n    return argument.toUpperCase()\n  },\n  // e.g. 'MIT '\n  function (argument) {\n    return argument.trim()\n  },\n  // e.g. 'M.I.T.'\n  function (argument) {\n    return argument.replace(/\\./g, '')\n  },\n  // e.g. 'Apache- 2.0'\n  function (argument) {\n    return argument.replace(/\\s+/g, '')\n  },\n  // e.g. 'CC BY 4.0''\n  function (argument) {\n    return argument.replace(/\\s+/g, '-')\n  },\n  // e.g. 'LGPLv2.1'\n  function (argument) {\n    return argument.replace('v', '-')\n  },\n  // e.g. 'Apache 2.0'\n  function (argument) {\n    return argument.replace(/,?\\s*(\\d)/, '-$1')\n  },\n  // e.g. 'GPL 2'\n  function (argument) {\n    return argument.replace(/,?\\s*(\\d)/, '-$1.0')\n  },\n  // e.g. 'Apache Version 2.0'\n  function (argument) {\n    return argument\n      .replace(/,?\\s*(V\\.|v\\.|V|v|Version|version)\\s*(\\d)/, '-$2')\n  },\n  // e.g. 'Apache Version 2'\n  function (argument) {\n    return argument\n      .replace(/,?\\s*(V\\.|v\\.|V|v|Version|version)\\s*(\\d)/, '-$2.0')\n  },\n  // e.g. 'ZLIB'\n  function (argument) {\n    return argument[0].toUpperCase() + argument.slice(1)\n  },\n  // e.g. 'MPL/2.0'\n  function (argument) {\n    return argument.replace('/', '-')\n  },\n  // e.g. 'Apache 2'\n  function (argument) {\n    return argument\n      .replace(/\\s*V\\s*(\\d)/, '-$1')\n      .replace(/(\\d)$/, '$1.0')\n  },\n  // e.g. 'GPL-2.0', 'GPL-3.0'\n  function (argument) {\n    if (argument.indexOf('3.0') !== -1) {\n      return argument + '-or-later'\n    } else {\n      return argument + '-only'\n    }\n  },\n  // e.g. 'GPL-2.0-'\n  function (argument) {\n    return argument + 'only'\n  },\n  // e.g. 'GPL2'\n  function (argument) {\n    return argument.replace(/(\\d)$/, '-$1.0')\n  },\n  // e.g. 'BSD 3'\n  function (argument) {\n    return argument.replace(/(-| )?(\\d)$/, '-$2-Clause')\n  },\n  // e.g. 'BSD clause 3'\n  function (argument) {\n    return argument.replace(/(-| )clause(-| )(\\d)/, '-$3-Clause')\n  },\n  // e.g. 'BY-NC-4.0'\n  function (argument) {\n    return 'CC-' + argument\n  },\n  // e.g. 'BY-NC'\n  function (argument) {\n    return 'CC-' + argument + '-4.0'\n  },\n  // e.g. 'Attribution-NonCommercial'\n  function (argument) {\n    return argument\n      .replace('Attribution', 'BY')\n      .replace('NonCommercial', 'NC')\n      .replace('NoDerivatives', 'ND')\n      .replace(/ (\\d)/, '-$1')\n      .replace(/ ?International/, '')\n  },\n  // e.g. 'Attribution-NonCommercial'\n  function (argument) {\n    return 'CC-' +\n      argument\n        .replace('Attribution', 'BY')\n        .replace('NonCommercial', 'NC')\n        .replace('NoDerivatives', 'ND')\n        .replace(/ (\\d)/, '-$1')\n        .replace(/ ?International/, '') +\n      '-4.0'\n  }\n]\n\nvar licensesWithVersions = spdxLicenseIds\n  .map(function (id) {\n    var match = /^(.*)-\\d+\\.\\d+$/.exec(id)\n    return match\n      ? [match[0], match[1]]\n      : [id, null]\n  })\n  .reduce(function (objectMap, item) {\n    var key = item[1]\n    objectMap[key] = objectMap[key] || []\n    objectMap[key].push(item[0])\n    return objectMap\n  }, {})\n\nvar licensesWithOneVersion = Object.keys(licensesWithVersions)\n  .map(function makeEntries (key) {\n    return [key, licensesWithVersions[key]]\n  })\n  .filter(function identifySoleVersions (item) {\n    return (\n      // Licenses has just one valid version suffix.\n      item[1].length === 1 &&\n      item[0] !== null &&\n      // APL will be considered Apache, rather than APL-1.0\n      item[0] !== 'APL'\n    )\n  })\n  .map(function createLastResorts (item) {\n    return [item[0], item[1][0]]\n  })\n\nlicensesWithVersions = undefined\n\n// If all else fails, guess that strings containing certain substrings\n// meant to identify certain licenses.\nvar lastResorts = [\n  ['UNLI', 'Unlicense'],\n  ['WTF', 'WTFPL'],\n  ['2 CLAUSE', 'BSD-2-Clause'],\n  ['2-CLAUSE', 'BSD-2-Clause'],\n  ['3 CLAUSE', 'BSD-3-Clause'],\n  ['3-CLAUSE', 'BSD-3-Clause'],\n  ['AFFERO', 'AGPL-3.0-or-later'],\n  ['AGPL', 'AGPL-3.0-or-later'],\n  ['APACHE', 'Apache-2.0'],\n  ['ARTISTIC', 'Artistic-2.0'],\n  ['Affero', 'AGPL-3.0-or-later'],\n  ['BEER', 'Beerware'],\n  ['BOOST', 'BSL-1.0'],\n  ['BSD', 'BSD-2-Clause'],\n  ['CDDL', 'CDDL-1.1'],\n  ['ECLIPSE', 'EPL-1.0'],\n  ['FUCK', 'WTFPL'],\n  ['GNU', 'GPL-3.0-or-later'],\n  ['LGPL', 'LGPL-3.0-or-later'],\n  ['GPLV1', 'GPL-1.0-only'],\n  ['GPLV2', 'GPL-2.0-only'],\n  ['GPL', 'GPL-3.0-or-later'],\n  ['MIT +NO-FALSE-ATTRIBS', 'MITNFA'],\n  ['MIT', 'MIT'],\n  ['MPL', 'MPL-2.0'],\n  ['X11', 'X11'],\n  ['ZLIB', 'Zlib']\n].concat(licensesWithOneVersion)\n\nvar SUBSTRING = 0\nvar IDENTIFIER = 1\n\nvar validTransformation = function (identifier) {\n  for (var i = 0; i < transforms.length; i++) {\n    var transformed = transforms[i](identifier).trim()\n    if (transformed !== identifier && valid(transformed)) {\n      return transformed\n    }\n  }\n  return null\n}\n\nvar validLastResort = function (identifier) {\n  var upperCased = identifier.toUpperCase()\n  for (var i = 0; i < lastResorts.length; i++) {\n    var lastResort = lastResorts[i]\n    if (upperCased.indexOf(lastResort[SUBSTRING]) > -1) {\n      return lastResort[IDENTIFIER]\n    }\n  }\n  return null\n}\n\nvar anyCorrection = function (identifier, check) {\n  for (var i = 0; i < transpositions.length; i++) {\n    var transposition = transpositions[i]\n    var transposed = transposition[TRANSPOSED]\n    if (identifier.indexOf(transposed) > -1) {\n      var corrected = identifier.replace(\n        transposed,\n        transposition[CORRECT]\n      )\n      var checked = check(corrected)\n      if (checked !== null) {\n        return checked\n      }\n    }\n  }\n  return null\n}\n\nmodule.exports = function (identifier) {\n  var validArugment = (\n    typeof identifier === 'string' &&\n    identifier.trim().length !== 0\n  )\n  if (!validArugment) {\n    throw Error('Invalid argument. Expected non-empty string.')\n  }\n  identifier = identifier.replace(/\\+$/, '').trim()\n  if (valid(identifier)) {\n    return upgradeGPLs(identifier)\n  }\n  var transformed = validTransformation(identifier)\n  if (transformed !== null) {\n    return upgradeGPLs(transformed)\n  }\n  transformed = anyCorrection(identifier, function (argument) {\n    if (valid(argument)) {\n      return argument\n    }\n    return validTransformation(argument)\n  })\n  if (transformed !== null) {\n    return upgradeGPLs(transformed)\n  }\n  transformed = validLastResort(identifier)\n  if (transformed !== null) {\n    return upgradeGPLs(transformed)\n  }\n  transformed = anyCorrection(identifier, validLastResort)\n  if (transformed !== null) {\n    return upgradeGPLs(transformed)\n  }\n  return null\n}\n\nfunction upgradeGPLs (value) {\n  if ([\n    'GPL-1.0', 'LGPL-1.0', 'AGPL-1.0',\n    'GPL-2.0', 'LGPL-2.0', 'AGPL-2.0',\n    'LGPL-2.1'\n  ].indexOf(value) !== -1) {\n    return value + '-only'\n  } else if (['GPL-3.0', 'LGPL-3.0', 'AGPL-3.0'].indexOf(value) !== -1) {\n    return value + '-or-later'\n  } else {\n    return value\n  }\n}\n\n\n/***/ }),\n/* 936 */\n/***/ (function(module, exports) {\n\nmodule.exports = [\"389-exception\",\"Autoconf-exception-2.0\",\"Autoconf-exception-3.0\",\"Bison-exception-2.2\",\"Bootloader-exception\",\"CLISP-exception-2.0\",\"Classpath-exception-2.0\",\"DigiRule-FOSS-exception\",\"FLTK-exception\",\"Fawkes-Runtime-exception\",\"Font-exception-2.0\",\"GCC-exception-2.0\",\"GCC-exception-3.1\",\"LZMA-exception\",\"Libtool-exception\",\"Linux-syscall-note\",\"Nokia-Qt-exception-1.1\",\"OCCT-exception-1.0\",\"Qwt-exception-1.0\",\"WxWindows-exception-3.1\",\"eCos-exception-2.0\",\"freertos-exception-2.0\",\"gnu-javamail-exception\",\"i2p-gpl-java-exception\",\"mif-exception\",\"openvpn-openssl-exception\",\"u-boot-exception-2.0\"]\n\n/***/ }),\n/* 937 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\n// The ABNF grammar in the spec is totally ambiguous.\n//\n// This parser follows the operator precedence defined in the\n// `Order of Precedence and Parentheses` section.\n\nmodule.exports = function (tokens) {\n  var index = 0\n\n  function hasMore () {\n    return index < tokens.length\n  }\n\n  function token () {\n    return hasMore() ? tokens[index] : null\n  }\n\n  function next () {\n    if (!hasMore()) {\n      throw new Error()\n    }\n    index++\n  }\n\n  function parseOperator (operator) {\n    var t = token()\n    if (t && t.type === 'OPERATOR' && operator === t.string) {\n      next()\n      return t.string\n    }\n  }\n\n  function parseWith () {\n    if (parseOperator('WITH')) {\n      var t = token()\n      if (t && t.type === 'EXCEPTION') {\n        next()\n        return t.string\n      }\n      throw new Error('Expected exception after `WITH`')\n    }\n  }\n\n  function parseLicenseRef () {\n    // TODO: Actually, everything is concatenated into one string\n    // for backward-compatibility but it could be better to return\n    // a nice structure.\n    var begin = index\n    var string = ''\n    var t = token()\n    if (t.type === 'DOCUMENTREF') {\n      next()\n      string += 'DocumentRef-' + t.string + ':'\n      if (!parseOperator(':')) {\n        throw new Error('Expected `:` after `DocumentRef-...`')\n      }\n    }\n    t = token()\n    if (t.type === 'LICENSEREF') {\n      next()\n      string += 'LicenseRef-' + t.string\n      return {license: string}\n    }\n    index = begin\n  }\n\n  function parseLicense () {\n    var t = token()\n    if (t && t.type === 'LICENSE') {\n      next()\n      var node = {license: t.string}\n      if (parseOperator('+')) {\n        node.plus = true\n      }\n      var exception = parseWith()\n      if (exception) {\n        node.exception = exception\n      }\n      return node\n    }\n  }\n\n  function parseParenthesizedExpression () {\n    var left = parseOperator('(')\n    if (!left) {\n      return\n    }\n\n    var expr = parseExpression()\n\n    if (!parseOperator(')')) {\n      throw new Error('Expected `)`')\n    }\n\n    return expr\n  }\n\n  function parseAtom () {\n    return (\n      parseParenthesizedExpression() ||\n      parseLicenseRef() ||\n      parseLicense()\n    )\n  }\n\n  function makeBinaryOpParser (operator, nextParser) {\n    return function parseBinaryOp () {\n      var left = nextParser()\n      if (!left) {\n        return\n      }\n\n      if (!parseOperator(operator)) {\n        return left\n      }\n\n      var right = parseBinaryOp()\n      if (!right) {\n        throw new Error('Expected expression')\n      }\n      return {\n        left: left,\n        conjunction: operator.toLowerCase(),\n        right: right\n      }\n    }\n  }\n\n  var parseAnd = makeBinaryOpParser('AND', parseAtom)\n  var parseExpression = makeBinaryOpParser('OR', parseAnd)\n\n  var node = parseExpression()\n  if (!node || hasMore()) {\n    throw new Error('Syntax error')\n  }\n  return node\n}\n\n\n/***/ }),\n/* 938 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar licenses = []\n  .concat(__webpack_require__(453))\n  .concat(__webpack_require__(939))\nvar exceptions = __webpack_require__(936)\n\nmodule.exports = function (source) {\n  var index = 0\n\n  function hasMore () {\n    return index < source.length\n  }\n\n  // `value` can be a regexp or a string.\n  // If it is recognized, the matching source string is returned and\n  // the index is incremented. Otherwise `undefined` is returned.\n  function read (value) {\n    if (value instanceof RegExp) {\n      var chars = source.slice(index)\n      var match = chars.match(value)\n      if (match) {\n        index += match[0].length\n        return match[0]\n      }\n    } else {\n      if (source.indexOf(value, index) === index) {\n        index += value.length\n        return value\n      }\n    }\n  }\n\n  function skipWhitespace () {\n    read(/[ ]*/)\n  }\n\n  function operator () {\n    var string\n    var possibilities = ['WITH', 'AND', 'OR', '(', ')', ':', '+']\n    for (var i = 0; i < possibilities.length; i++) {\n      string = read(possibilities[i])\n      if (string) {\n        break\n      }\n    }\n\n    if (string === '+' && index > 1 && source[index - 2] === ' ') {\n      throw new Error('Space before `+`')\n    }\n\n    return string && {\n      type: 'OPERATOR',\n      string: string\n    }\n  }\n\n  function idstring () {\n    return read(/[A-Za-z0-9-.]+/)\n  }\n\n  function expectIdstring () {\n    var string = idstring()\n    if (!string) {\n      throw new Error('Expected idstring at offset ' + index)\n    }\n    return string\n  }\n\n  function documentRef () {\n    if (read('DocumentRef-')) {\n      var string = expectIdstring()\n      return {type: 'DOCUMENTREF', string: string}\n    }\n  }\n\n  function licenseRef () {\n    if (read('LicenseRef-')) {\n      var string = expectIdstring()\n      return {type: 'LICENSEREF', string: string}\n    }\n  }\n\n  function identifier () {\n    var begin = index\n    var string = idstring()\n\n    if (licenses.indexOf(string) !== -1) {\n      return {\n        type: 'LICENSE',\n        string: string\n      }\n    } else if (exceptions.indexOf(string) !== -1) {\n      return {\n        type: 'EXCEPTION',\n        string: string\n      }\n    }\n\n    index = begin\n  }\n\n  // Tries to read the next token. Returns `undefined` if no token is\n  // recognized.\n  function parseToken () {\n    // Ordering matters\n    return (\n      operator() ||\n      documentRef() ||\n      licenseRef() ||\n      identifier()\n    )\n  }\n\n  var tokens = []\n  while (hasMore()) {\n    skipWhitespace()\n    if (!hasMore()) {\n      break\n    }\n\n    var token = parseToken()\n    if (!token) {\n      throw new Error('Unexpected `' + source[index] +\n                      '` at offset ' + index)\n    }\n\n    tokens.push(token)\n  }\n  return tokens\n}\n\n\n/***/ }),\n/* 939 */\n/***/ (function(module, exports) {\n\nmodule.exports = [\"AGPL-3.0\",\"eCos-2.0\",\"GFDL-1.1\",\"GFDL-1.2\",\"GFDL-1.3\",\"GPL-1.0\",\"GPL-2.0-with-autoconf-exception\",\"GPL-2.0-with-bison-exception\",\"GPL-2.0-with-classpath-exception\",\"GPL-2.0-with-font-exception\",\"GPL-2.0-with-GCC-exception\",\"GPL-2.0\",\"GPL-3.0-with-autoconf-exception\",\"GPL-3.0-with-GCC-exception\",\"GPL-3.0\",\"LGPL-2.0\",\"LGPL-2.1\",\"LGPL-3.0\",\"Nunit\",\"StandardML-NJ\",\"wxWindows\"]\n\n/***/ }),\n/* 940 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2017 Joyent, Inc.\n\nmodule.exports = {\n\tread: read,\n\tverify: verify,\n\tsign: sign,\n\tsignAsync: signAsync,\n\twrite: write,\n\n\t/* Internal private API */\n\tfromBuffer: fromBuffer,\n\ttoBuffer: toBuffer\n};\n\nvar assert = __webpack_require__(16);\nvar SSHBuffer = __webpack_require__(160);\nvar crypto = __webpack_require__(11);\nvar Buffer = __webpack_require__(15).Buffer;\nvar algs = __webpack_require__(32);\nvar Key = __webpack_require__(28);\nvar PrivateKey = __webpack_require__(33);\nvar Identity = __webpack_require__(159);\nvar rfc4253 = __webpack_require__(103);\nvar Signature = __webpack_require__(75);\nvar utils = __webpack_require__(26);\nvar Certificate = __webpack_require__(156);\n\nfunction verify(cert, key) {\n\t/*\n\t * We always give an issuerKey, so if our verify() is being called then\n\t * there was no signature. Return false.\n\t */\n\treturn (false);\n}\n\nvar TYPES = {\n\t'user': 1,\n\t'host': 2\n};\nObject.keys(TYPES).forEach(function (k) { TYPES[TYPES[k]] = k; });\n\nvar ECDSA_ALGO = /^ecdsa-sha2-([^@-]+)-cert-v01@openssh.com$/;\n\nfunction read(buf, options) {\n\tif (Buffer.isBuffer(buf))\n\t\tbuf = buf.toString('ascii');\n\tvar parts = buf.trim().split(/[ \\t\\n]+/g);\n\tif (parts.length < 2 || parts.length > 3)\n\t\tthrow (new Error('Not a valid SSH certificate line'));\n\n\tvar algo = parts[0];\n\tvar data = parts[1];\n\n\tdata = Buffer.from(data, 'base64');\n\treturn (fromBuffer(data, algo));\n}\n\nfunction fromBuffer(data, algo, partial) {\n\tvar sshbuf = new SSHBuffer({ buffer: data });\n\tvar innerAlgo = sshbuf.readString();\n\tif (algo !== undefined && innerAlgo !== algo)\n\t\tthrow (new Error('SSH certificate algorithm mismatch'));\n\tif (algo === undefined)\n\t\talgo = innerAlgo;\n\n\tvar cert = {};\n\tcert.signatures = {};\n\tcert.signatures.openssh = {};\n\n\tcert.signatures.openssh.nonce = sshbuf.readBuffer();\n\n\tvar key = {};\n\tvar parts = (key.parts = []);\n\tkey.type = getAlg(algo);\n\n\tvar partCount = algs.info[key.type].parts.length;\n\twhile (parts.length < partCount)\n\t\tparts.push(sshbuf.readPart());\n\tassert.ok(parts.length >= 1, 'key must have at least one part');\n\n\tvar algInfo = algs.info[key.type];\n\tif (key.type === 'ecdsa') {\n\t\tvar res = ECDSA_ALGO.exec(algo);\n\t\tassert.ok(res !== null);\n\t\tassert.strictEqual(res[1], parts[0].data.toString());\n\t}\n\n\tfor (var i = 0; i < algInfo.parts.length; ++i) {\n\t\tparts[i].name = algInfo.parts[i];\n\t\tif (parts[i].name !== 'curve' &&\n\t\t    algInfo.normalize !== false) {\n\t\t\tvar p = parts[i];\n\t\t\tp.data = utils.mpNormalize(p.data);\n\t\t}\n\t}\n\n\tcert.subjectKey = new Key(key);\n\n\tcert.serial = sshbuf.readInt64();\n\n\tvar type = TYPES[sshbuf.readInt()];\n\tassert.string(type, 'valid cert type');\n\n\tcert.signatures.openssh.keyId = sshbuf.readString();\n\n\tvar principals = [];\n\tvar pbuf = sshbuf.readBuffer();\n\tvar psshbuf = new SSHBuffer({ buffer: pbuf });\n\twhile (!psshbuf.atEnd())\n\t\tprincipals.push(psshbuf.readString());\n\tif (principals.length === 0)\n\t\tprincipals = ['*'];\n\n\tcert.subjects = principals.map(function (pr) {\n\t\tif (type === 'user')\n\t\t\treturn (Identity.forUser(pr));\n\t\telse if (type === 'host')\n\t\t\treturn (Identity.forHost(pr));\n\t\tthrow (new Error('Unknown identity type ' + type));\n\t});\n\n\tcert.validFrom = int64ToDate(sshbuf.readInt64());\n\tcert.validUntil = int64ToDate(sshbuf.readInt64());\n\n\tcert.signatures.openssh.critical = sshbuf.readBuffer();\n\tcert.signatures.openssh.exts = sshbuf.readBuffer();\n\n\t/* reserved */\n\tsshbuf.readBuffer();\n\n\tvar signingKeyBuf = sshbuf.readBuffer();\n\tcert.issuerKey = rfc4253.read(signingKeyBuf);\n\n\t/*\n\t * OpenSSH certs don't give the identity of the issuer, just their\n\t * public key. So, we use an Identity that matches anything. The\n\t * isSignedBy() function will later tell you if the key matches.\n\t */\n\tcert.issuer = Identity.forHost('**');\n\n\tvar sigBuf = sshbuf.readBuffer();\n\tcert.signatures.openssh.signature =\n\t    Signature.parse(sigBuf, cert.issuerKey.type, 'ssh');\n\n\tif (partial !== undefined) {\n\t\tpartial.remainder = sshbuf.remainder();\n\t\tpartial.consumed = sshbuf._offset;\n\t}\n\n\treturn (new Certificate(cert));\n}\n\nfunction int64ToDate(buf) {\n\tvar i = buf.readUInt32BE(0) * 4294967296;\n\ti += buf.readUInt32BE(4);\n\tvar d = new Date();\n\td.setTime(i * 1000);\n\td.sourceInt64 = buf;\n\treturn (d);\n}\n\nfunction dateToInt64(date) {\n\tif (date.sourceInt64 !== undefined)\n\t\treturn (date.sourceInt64);\n\tvar i = Math.round(date.getTime() / 1000);\n\tvar upper = Math.floor(i / 4294967296);\n\tvar lower = Math.floor(i % 4294967296);\n\tvar buf = Buffer.alloc(8);\n\tbuf.writeUInt32BE(upper, 0);\n\tbuf.writeUInt32BE(lower, 4);\n\treturn (buf);\n}\n\nfunction sign(cert, key) {\n\tif (cert.signatures.openssh === undefined)\n\t\tcert.signatures.openssh = {};\n\ttry {\n\t\tvar blob = toBuffer(cert, true);\n\t} catch (e) {\n\t\tdelete (cert.signatures.openssh);\n\t\treturn (false);\n\t}\n\tvar sig = cert.signatures.openssh;\n\tvar hashAlgo = undefined;\n\tif (key.type === 'rsa' || key.type === 'dsa')\n\t\thashAlgo = 'sha1';\n\tvar signer = key.createSign(hashAlgo);\n\tsigner.write(blob);\n\tsig.signature = signer.sign();\n\treturn (true);\n}\n\nfunction signAsync(cert, signer, done) {\n\tif (cert.signatures.openssh === undefined)\n\t\tcert.signatures.openssh = {};\n\ttry {\n\t\tvar blob = toBuffer(cert, true);\n\t} catch (e) {\n\t\tdelete (cert.signatures.openssh);\n\t\tdone(e);\n\t\treturn;\n\t}\n\tvar sig = cert.signatures.openssh;\n\n\tsigner(blob, function (err, signature) {\n\t\tif (err) {\n\t\t\tdone(err);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\t/*\n\t\t\t * This will throw if the signature isn't of a\n\t\t\t * type/algo that can be used for SSH.\n\t\t\t */\n\t\t\tsignature.toBuffer('ssh');\n\t\t} catch (e) {\n\t\t\tdone(e);\n\t\t\treturn;\n\t\t}\n\t\tsig.signature = signature;\n\t\tdone();\n\t});\n}\n\nfunction write(cert, options) {\n\tif (options === undefined)\n\t\toptions = {};\n\n\tvar blob = toBuffer(cert);\n\tvar out = getCertType(cert.subjectKey) + ' ' + blob.toString('base64');\n\tif (options.comment)\n\t\tout = out + ' ' + options.comment;\n\treturn (out);\n}\n\n\nfunction toBuffer(cert, noSig) {\n\tassert.object(cert.signatures.openssh, 'signature for openssh format');\n\tvar sig = cert.signatures.openssh;\n\n\tif (sig.nonce === undefined)\n\t\tsig.nonce = crypto.randomBytes(16);\n\tvar buf = new SSHBuffer({});\n\tbuf.writeString(getCertType(cert.subjectKey));\n\tbuf.writeBuffer(sig.nonce);\n\n\tvar key = cert.subjectKey;\n\tvar algInfo = algs.info[key.type];\n\talgInfo.parts.forEach(function (part) {\n\t\tbuf.writePart(key.part[part]);\n\t});\n\n\tbuf.writeInt64(cert.serial);\n\n\tvar type = cert.subjects[0].type;\n\tassert.notStrictEqual(type, 'unknown');\n\tcert.subjects.forEach(function (id) {\n\t\tassert.strictEqual(id.type, type);\n\t});\n\ttype = TYPES[type];\n\tbuf.writeInt(type);\n\n\tif (sig.keyId === undefined) {\n\t\tsig.keyId = cert.subjects[0].type + '_' +\n\t\t    (cert.subjects[0].uid || cert.subjects[0].hostname);\n\t}\n\tbuf.writeString(sig.keyId);\n\n\tvar sub = new SSHBuffer({});\n\tcert.subjects.forEach(function (id) {\n\t\tif (type === TYPES.host)\n\t\t\tsub.writeString(id.hostname);\n\t\telse if (type === TYPES.user)\n\t\t\tsub.writeString(id.uid);\n\t});\n\tbuf.writeBuffer(sub.toBuffer());\n\n\tbuf.writeInt64(dateToInt64(cert.validFrom));\n\tbuf.writeInt64(dateToInt64(cert.validUntil));\n\n\tif (sig.critical === undefined)\n\t\tsig.critical = Buffer.alloc(0);\n\tbuf.writeBuffer(sig.critical);\n\n\tif (sig.exts === undefined)\n\t\tsig.exts = Buffer.alloc(0);\n\tbuf.writeBuffer(sig.exts);\n\n\t/* reserved */\n\tbuf.writeBuffer(Buffer.alloc(0));\n\n\tsub = rfc4253.write(cert.issuerKey);\n\tbuf.writeBuffer(sub);\n\n\tif (!noSig)\n\t\tbuf.writeBuffer(sig.signature.toBuffer('ssh'));\n\n\treturn (buf.toBuffer());\n}\n\nfunction getAlg(certType) {\n\tif (certType === 'ssh-rsa-cert-v01@openssh.com')\n\t\treturn ('rsa');\n\tif (certType === 'ssh-dss-cert-v01@openssh.com')\n\t\treturn ('dsa');\n\tif (certType.match(ECDSA_ALGO))\n\t\treturn ('ecdsa');\n\tif (certType === 'ssh-ed25519-cert-v01@openssh.com')\n\t\treturn ('ed25519');\n\tthrow (new Error('Unsupported cert type ' + certType));\n}\n\nfunction getCertType(key) {\n\tif (key.type === 'rsa')\n\t\treturn ('ssh-rsa-cert-v01@openssh.com');\n\tif (key.type === 'dsa')\n\t\treturn ('ssh-dss-cert-v01@openssh.com');\n\tif (key.type === 'ecdsa')\n\t\treturn ('ecdsa-sha2-' + key.curve + '-cert-v01@openssh.com');\n\tif (key.type === 'ed25519')\n\t\treturn ('ssh-ed25519-cert-v01@openssh.com');\n\tthrow (new Error('Unsupported key type ' + key.type));\n}\n\n\n/***/ }),\n/* 941 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// Copyright 2016 Joyent, Inc.\n\nvar x509 = __webpack_require__(457);\n\nmodule.exports = {\n\tread: read,\n\tverify: x509.verify,\n\tsign: x509.sign,\n\twrite: write\n};\n\nvar assert = __webpack_require__(16);\nvar asn1 = __webpack_require__(66);\nvar Buffer = __webpack_require__(15).Buffer;\nvar algs = __webpack_require__(32);\nvar utils = __webpack_require__(26);\nvar Key = __webpack_require__(28);\nvar PrivateKey = __webpack_require__(33);\nvar pem = __webpack_require__(86);\nvar Identity = __webpack_require__(159);\nvar Signature = __webpack_require__(75);\nvar Certificate = __webpack_require__(156);\n\nfunction read(buf, options) {\n\tif (typeof (buf) !== 'string') {\n\t\tassert.buffer(buf, 'buf');\n\t\tbuf = buf.toString('ascii');\n\t}\n\n\tvar lines = buf.trim().split(/[\\r\\n]+/g);\n\n\tvar m = lines[0].match(/*JSSTYLED*/\n\t    /[-]+[ ]*BEGIN CERTIFICATE[ ]*[-]+/);\n\tassert.ok(m, 'invalid PEM header');\n\n\tvar m2 = lines[lines.length - 1].match(/*JSSTYLED*/\n\t    /[-]+[ ]*END CERTIFICATE[ ]*[-]+/);\n\tassert.ok(m2, 'invalid PEM footer');\n\n\tvar headers = {};\n\twhile (true) {\n\t\tlines = lines.slice(1);\n\t\tm = lines[0].match(/*JSSTYLED*/\n\t\t    /^([A-Za-z0-9-]+): (.+)$/);\n\t\tif (!m)\n\t\t\tbreak;\n\t\theaders[m[1].toLowerCase()] = m[2];\n\t}\n\n\t/* Chop off the first and last lines */\n\tlines = lines.slice(0, -1).join('');\n\tbuf = Buffer.from(lines, 'base64');\n\n\treturn (x509.read(buf, options));\n}\n\nfunction write(cert, options) {\n\tvar dbuf = x509.write(cert, options);\n\n\tvar header = 'CERTIFICATE';\n\tvar tmp = dbuf.toString('base64');\n\tvar len = tmp.length + (tmp.length / 64) +\n\t    18 + 16 + header.length*2 + 10;\n\tvar buf = Buffer.alloc(len);\n\tvar o = 0;\n\to += buf.write('-----BEGIN ' + header + '-----\\n', o);\n\tfor (var i = 0; i < tmp.length; ) {\n\t\tvar limit = i + 64;\n\t\tif (limit > tmp.length)\n\t\t\tlimit = tmp.length;\n\t\to += buf.write(tmp.slice(i, limit), o);\n\t\tbuf[o++] = 10;\n\t\ti = limit;\n\t}\n\to += buf.write('-----END ' + header + '-----\\n', o);\n\n\treturn (buf.slice(0, o));\n}\n\n\n/***/ }),\n/* 942 */\n/***/ (function(module, exports) {\n\nmodule.exports = shift\n\nfunction shift (stream) {\n  var rs = stream._readableState\n  if (!rs) return null\n  return rs.objectMode ? stream.read() : stream.read(getStateLength(rs))\n}\n\nfunction getStateLength (state) {\n  if (state.buffer.length) {\n    // Since node 6.3.0 state.buffer is a BufferList not an array\n    if (state.buffer.head) {\n      return state.buffer.head.data.length\n    }\n\n    return state.buffer[0].length\n  }\n\n  return state.length\n}\n\n\n/***/ }),\n/* 943 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nmodule.exports = function (str) {\n\treturn encodeURIComponent(str).replace(/[!'()*]/g, function (c) {\n\t\treturn '%' + c.charCodeAt(0).toString(16).toUpperCase();\n\t});\n};\n\n\n/***/ }),\n/* 944 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar resolvePkg = __webpack_require__(679);\n\n/* @private\n *\n * given the name of a descendent module this module locates and returns its\n * package.json. In addition, it provides the baseDir.\n *\n * @method pkg\n * @param {String} name\n * @param {String} dir (optional) root directory to begin resolution\n */\nmodule.exports = function pkg(name, dir) {\n  if (name !== './') { name += '/'; }\n\n  var packagePath = resolvePkg(name, dir);\n  if (packagePath === null) { return null; }\n\n  var thePackage = require(packagePath);\n\n  thePackage.baseDir = packagePath.slice(0, packagePath.length - 12 /* index of `/package.json` */);\n\n  return thePackage;\n};\n\n\n/***/ }),\n/* 945 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar stripAnsi = __webpack_require__(947);\nvar codePointAt = __webpack_require__(575);\nvar isFullwidthCodePoint = __webpack_require__(946);\n\n// https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1345\nmodule.exports = function (str) {\n\tif (typeof str !== 'string' || str.length === 0) {\n\t\treturn 0;\n\t}\n\n\tvar width = 0;\n\n\tstr = stripAnsi(str);\n\n\tfor (var i = 0; i < str.length; i++) {\n\t\tvar code = codePointAt(str, i);\n\n\t\t// ignore control characters\n\t\tif (code <= 0x1f || (code >= 0x7f && code <= 0x9f)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// surrogates\n\t\tif (code >= 0x10000) {\n\t\t\ti++;\n\t\t}\n\n\t\tif (isFullwidthCodePoint(code)) {\n\t\t\twidth += 2;\n\t\t} else {\n\t\t\twidth++;\n\t\t}\n\t}\n\n\treturn width;\n};\n\n\n/***/ }),\n/* 946 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar numberIsNan = __webpack_require__(767);\n\nmodule.exports = function (x) {\n\tif (numberIsNan(x)) {\n\t\treturn false;\n\t}\n\n\t// https://github.com/nodejs/io.js/blob/cff7300a578be1b10001f2d967aaedc88aee6402/lib/readline.js#L1369\n\n\t// code points are derived from:\n\t// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n\tif (x >= 0x1100 && (\n\t\tx <= 0x115f ||  // Hangul Jamo\n\t\t0x2329 === x || // LEFT-POINTING ANGLE BRACKET\n\t\t0x232a === x || // RIGHT-POINTING ANGLE BRACKET\n\t\t// CJK Radicals Supplement .. Enclosed CJK Letters and Months\n\t\t(0x2e80 <= x && x <= 0x3247 && x !== 0x303f) ||\n\t\t// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A\n\t\t0x3250 <= x && x <= 0x4dbf ||\n\t\t// CJK Unified Ideographs .. Yi Radicals\n\t\t0x4e00 <= x && x <= 0xa4c6 ||\n\t\t// Hangul Jamo Extended-A\n\t\t0xa960 <= x && x <= 0xa97c ||\n\t\t// Hangul Syllables\n\t\t0xac00 <= x && x <= 0xd7a3 ||\n\t\t// CJK Compatibility Ideographs\n\t\t0xf900 <= x && x <= 0xfaff ||\n\t\t// Vertical Forms\n\t\t0xfe10 <= x && x <= 0xfe19 ||\n\t\t// CJK Compatibility Forms .. Small Form Variants\n\t\t0xfe30 <= x && x <= 0xfe6b ||\n\t\t// Halfwidth and Fullwidth Forms\n\t\t0xff01 <= x && x <= 0xff60 ||\n\t\t0xffe0 <= x && x <= 0xffe6 ||\n\t\t// Kana Supplement\n\t\t0x1b000 <= x && x <= 0x1b001 ||\n\t\t// Enclosed Ideographic Supplement\n\t\t0x1f200 <= x && x <= 0x1f251 ||\n\t\t// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane\n\t\t0x20000 <= x && x <= 0x3fffd)) {\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n\n/***/ }),\n/* 947 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nvar ansiRegex = __webpack_require__(473)();\n\nmodule.exports = function (str) {\n\treturn typeof str === 'string' ? str.replace(ansiRegex, '') : str;\n};\n\n\n/***/ }),\n/* 948 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nmodule.exports = () => {\n\tconst pattern = [\n\t\t'[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:[a-zA-Z\\\\d]*(?:;[a-zA-Z\\\\d]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PRZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, 'g');\n};\n\n\n/***/ }),\n/* 949 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar util = __webpack_require__(3)\nvar bl = __webpack_require__(560)\nvar xtend = __webpack_require__(465)\nvar headers = __webpack_require__(459)\n\nvar Writable = __webpack_require__(102).Writable\nvar PassThrough = __webpack_require__(102).PassThrough\n\nvar noop = function () {}\n\nvar overflow = function (size) {\n  size &= 511\n  return size && 512 - size\n}\n\nvar emptyStream = function (self, offset) {\n  var s = new Source(self, offset)\n  s.end()\n  return s\n}\n\nvar mixinPax = function (header, pax) {\n  if (pax.path) header.name = pax.path\n  if (pax.linkpath) header.linkname = pax.linkpath\n  if (pax.size) header.size = parseInt(pax.size, 10)\n  header.pax = pax\n  return header\n}\n\nvar Source = function (self, offset) {\n  this._parent = self\n  this.offset = offset\n  PassThrough.call(this)\n}\n\nutil.inherits(Source, PassThrough)\n\nSource.prototype.destroy = function (err) {\n  this._parent.destroy(err)\n}\n\nvar Extract = function (opts) {\n  if (!(this instanceof Extract)) return new Extract(opts)\n  Writable.call(this, opts)\n\n  opts = opts || {}\n\n  this._offset = 0\n  this._buffer = bl()\n  this._missing = 0\n  this._partial = false\n  this._onparse = noop\n  this._header = null\n  this._stream = null\n  this._overflow = null\n  this._cb = null\n  this._locked = false\n  this._destroyed = false\n  this._pax = null\n  this._paxGlobal = null\n  this._gnuLongPath = null\n  this._gnuLongLinkPath = null\n\n  var self = this\n  var b = self._buffer\n\n  var oncontinue = function () {\n    self._continue()\n  }\n\n  var onunlock = function (err) {\n    self._locked = false\n    if (err) return self.destroy(err)\n    if (!self._stream) oncontinue()\n  }\n\n  var onstreamend = function () {\n    self._stream = null\n    var drain = overflow(self._header.size)\n    if (drain) self._parse(drain, ondrain)\n    else self._parse(512, onheader)\n    if (!self._locked) oncontinue()\n  }\n\n  var ondrain = function () {\n    self._buffer.consume(overflow(self._header.size))\n    self._parse(512, onheader)\n    oncontinue()\n  }\n\n  var onpaxglobalheader = function () {\n    var size = self._header.size\n    self._paxGlobal = headers.decodePax(b.slice(0, size))\n    b.consume(size)\n    onstreamend()\n  }\n\n  var onpaxheader = function () {\n    var size = self._header.size\n    self._pax = headers.decodePax(b.slice(0, size))\n    if (self._paxGlobal) self._pax = xtend(self._paxGlobal, self._pax)\n    b.consume(size)\n    onstreamend()\n  }\n\n  var ongnulongpath = function () {\n    var size = self._header.size\n    this._gnuLongPath = headers.decodeLongPath(b.slice(0, size), opts.filenameEncoding)\n    b.consume(size)\n    onstreamend()\n  }\n\n  var ongnulonglinkpath = function () {\n    var size = self._header.size\n    this._gnuLongLinkPath = headers.decodeLongPath(b.slice(0, size), opts.filenameEncoding)\n    b.consume(size)\n    onstreamend()\n  }\n\n  var onheader = function () {\n    var offset = self._offset\n    var header\n    try {\n      header = self._header = headers.decode(b.slice(0, 512), opts.filenameEncoding)\n    } catch (err) {\n      self.emit('error', err)\n    }\n    b.consume(512)\n\n    if (!header) {\n      self._parse(512, onheader)\n      oncontinue()\n      return\n    }\n    if (header.type === 'gnu-long-path') {\n      self._parse(header.size, ongnulongpath)\n      oncontinue()\n      return\n    }\n    if (header.type === 'gnu-long-link-path') {\n      self._parse(header.size, ongnulonglinkpath)\n      oncontinue()\n      return\n    }\n    if (header.type === 'pax-global-header') {\n      self._parse(header.size, onpaxglobalheader)\n      oncontinue()\n      return\n    }\n    if (header.type === 'pax-header') {\n      self._parse(header.size, onpaxheader)\n      oncontinue()\n      return\n    }\n\n    if (self._gnuLongPath) {\n      header.name = self._gnuLongPath\n      self._gnuLongPath = null\n    }\n\n    if (self._gnuLongLinkPath) {\n      header.linkname = self._gnuLongLinkPath\n      self._gnuLongLinkPath = null\n    }\n\n    if (self._pax) {\n      self._header = header = mixinPax(header, self._pax)\n      self._pax = null\n    }\n\n    self._locked = true\n\n    if (!header.size || header.type === 'directory') {\n      self._parse(512, onheader)\n      self.emit('entry', header, emptyStream(self, offset), onunlock)\n      return\n    }\n\n    self._stream = new Source(self, offset)\n\n    self.emit('entry', header, self._stream, onunlock)\n    self._parse(header.size, onstreamend)\n    oncontinue()\n  }\n\n  this._onheader = onheader\n  this._parse(512, onheader)\n}\n\nutil.inherits(Extract, Writable)\n\nExtract.prototype.destroy = function (err) {\n  if (this._destroyed) return\n  this._destroyed = true\n\n  if (err) this.emit('error', err)\n  this.emit('close')\n  if (this._stream) this._stream.emit('close')\n}\n\nExtract.prototype._parse = function (size, onparse) {\n  if (this._destroyed) return\n  this._offset += size\n  this._missing = size\n  if (onparse === this._onheader) this._partial = false\n  this._onparse = onparse\n}\n\nExtract.prototype._continue = function () {\n  if (this._destroyed) return\n  var cb = this._cb\n  this._cb = noop\n  if (this._overflow) this._write(this._overflow, undefined, cb)\n  else cb()\n}\n\nExtract.prototype._write = function (data, enc, cb) {\n  if (this._destroyed) return\n\n  var s = this._stream\n  var b = this._buffer\n  var missing = this._missing\n  if (data.length) this._partial = true\n\n  // we do not reach end-of-chunk now. just forward it\n\n  if (data.length < missing) {\n    this._missing -= data.length\n    this._overflow = null\n    if (s) return s.write(data, cb)\n    b.append(data)\n    return cb()\n  }\n\n  // end-of-chunk. the parser should call cb.\n\n  this._cb = cb\n  this._missing = 0\n\n  var overflow = null\n  if (data.length > missing) {\n    overflow = data.slice(missing)\n    data = data.slice(0, missing)\n  }\n\n  if (s) s.end(data)\n  else b.append(data)\n\n  this._overflow = overflow\n  this._onparse()\n}\n\nExtract.prototype._final = function (cb) {\n  if (this._partial) return this.destroy(new Error('Unexpected end of data'))\n  cb()\n}\n\nmodule.exports = Extract\n\n\n/***/ }),\n/* 950 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar constants = __webpack_require__(619)\nvar eos = __webpack_require__(174)\nvar util = __webpack_require__(3)\nvar alloc = __webpack_require__(374)\nvar toBuffer = __webpack_require__(462)\n\nvar Readable = __webpack_require__(102).Readable\nvar Writable = __webpack_require__(102).Writable\nvar StringDecoder = __webpack_require__(333).StringDecoder\n\nvar headers = __webpack_require__(459)\n\nvar DMODE = parseInt('755', 8)\nvar FMODE = parseInt('644', 8)\n\nvar END_OF_TAR = alloc(1024)\n\nvar noop = function () {}\n\nvar overflow = function (self, size) {\n  size &= 511\n  if (size) self.push(END_OF_TAR.slice(0, 512 - size))\n}\n\nfunction modeToType (mode) {\n  switch (mode & constants.S_IFMT) {\n    case constants.S_IFBLK: return 'block-device'\n    case constants.S_IFCHR: return 'character-device'\n    case constants.S_IFDIR: return 'directory'\n    case constants.S_IFIFO: return 'fifo'\n    case constants.S_IFLNK: return 'symlink'\n  }\n\n  return 'file'\n}\n\nvar Sink = function (to) {\n  Writable.call(this)\n  this.written = 0\n  this._to = to\n  this._destroyed = false\n}\n\nutil.inherits(Sink, Writable)\n\nSink.prototype._write = function (data, enc, cb) {\n  this.written += data.length\n  if (this._to.push(data)) return cb()\n  this._to._drain = cb\n}\n\nSink.prototype.destroy = function () {\n  if (this._destroyed) return\n  this._destroyed = true\n  this.emit('close')\n}\n\nvar LinkSink = function () {\n  Writable.call(this)\n  this.linkname = ''\n  this._decoder = new StringDecoder('utf-8')\n  this._destroyed = false\n}\n\nutil.inherits(LinkSink, Writable)\n\nLinkSink.prototype._write = function (data, enc, cb) {\n  this.linkname += this._decoder.write(data)\n  cb()\n}\n\nLinkSink.prototype.destroy = function () {\n  if (this._destroyed) return\n  this._destroyed = true\n  this.emit('close')\n}\n\nvar Void = function () {\n  Writable.call(this)\n  this._destroyed = false\n}\n\nutil.inherits(Void, Writable)\n\nVoid.prototype._write = function (data, enc, cb) {\n  cb(new Error('No body allowed for this entry'))\n}\n\nVoid.prototype.destroy = function () {\n  if (this._destroyed) return\n  this._destroyed = true\n  this.emit('close')\n}\n\nvar Pack = function (opts) {\n  if (!(this instanceof Pack)) return new Pack(opts)\n  Readable.call(this, opts)\n\n  this._drain = noop\n  this._finalized = false\n  this._finalizing = false\n  this._destroyed = false\n  this._stream = null\n}\n\nutil.inherits(Pack, Readable)\n\nPack.prototype.entry = function (header, buffer, callback) {\n  if (this._stream) throw new Error('already piping an entry')\n  if (this._finalized || this._destroyed) return\n\n  if (typeof buffer === 'function') {\n    callback = buffer\n    buffer = null\n  }\n\n  if (!callback) callback = noop\n\n  var self = this\n\n  if (!header.size || header.type === 'symlink') header.size = 0\n  if (!header.type) header.type = modeToType(header.mode)\n  if (!header.mode) header.mode = header.type === 'directory' ? DMODE : FMODE\n  if (!header.uid) header.uid = 0\n  if (!header.gid) header.gid = 0\n  if (!header.mtime) header.mtime = new Date()\n\n  if (typeof buffer === 'string') buffer = toBuffer(buffer)\n  if (Buffer.isBuffer(buffer)) {\n    header.size = buffer.length\n    this._encode(header)\n    this.push(buffer)\n    overflow(self, header.size)\n    process.nextTick(callback)\n    return new Void()\n  }\n\n  if (header.type === 'symlink' && !header.linkname) {\n    var linkSink = new LinkSink()\n    eos(linkSink, function (err) {\n      if (err) { // stream was closed\n        self.destroy()\n        return callback(err)\n      }\n\n      header.linkname = linkSink.linkname\n      self._encode(header)\n      callback()\n    })\n\n    return linkSink\n  }\n\n  this._encode(header)\n\n  if (header.type !== 'file' && header.type !== 'contiguous-file') {\n    process.nextTick(callback)\n    return new Void()\n  }\n\n  var sink = new Sink(this)\n\n  this._stream = sink\n\n  eos(sink, function (err) {\n    self._stream = null\n\n    if (err) { // stream was closed\n      self.destroy()\n      return callback(err)\n    }\n\n    if (sink.written !== header.size) { // corrupting tar\n      self.destroy()\n      return callback(new Error('size mismatch'))\n    }\n\n    overflow(self, header.size)\n    if (self._finalizing) self.finalize()\n    callback()\n  })\n\n  return sink\n}\n\nPack.prototype.finalize = function () {\n  if (this._stream) {\n    this._finalizing = true\n    return\n  }\n\n  if (this._finalized) return\n  this._finalized = true\n  this.push(END_OF_TAR)\n  this.push(null)\n}\n\nPack.prototype.destroy = function (err) {\n  if (this._destroyed) return\n  this._destroyed = true\n\n  if (err) this.emit('error', err)\n  this.emit('close')\n  if (this._stream && this._stream.destroy) this._stream.destroy()\n}\n\nPack.prototype._encode = function (header) {\n  if (!header.pax) {\n    var buf = headers.encode(header)\n    if (buf) {\n      this.push(buf)\n      return\n    }\n  }\n  this._encodePax(header)\n}\n\nPack.prototype._encodePax = function (header) {\n  var paxHeader = headers.encodePax({\n    name: header.name,\n    linkname: header.linkname,\n    pax: header.pax\n  })\n\n  var newHeader = {\n    name: 'PaxHeader',\n    mode: header.mode,\n    uid: header.uid,\n    gid: header.gid,\n    size: paxHeader.length,\n    mtime: header.mtime,\n    type: 'pax-header',\n    linkname: header.linkname && 'PaxHeader',\n    uname: header.uname,\n    gname: header.gname,\n    devmajor: header.devmajor,\n    devminor: header.devminor\n  }\n\n  this.push(headers.encode(newHeader))\n  this.push(paxHeader)\n  overflow(this, paxHeader.length)\n\n  newHeader.size = header.size\n  newHeader.type = header.type\n  this.push(headers.encode(newHeader))\n}\n\nPack.prototype._read = function (n) {\n  var drain = this._drain\n  this._drain = noop\n  drain()\n}\n\nmodule.exports = Pack\n\n\n/***/ }),\n/* 951 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar thenify = __webpack_require__(952)\n\nmodule.exports = thenifyAll\nthenifyAll.withCallback = withCallback\nthenifyAll.thenify = thenify\n\n/**\n * Promisifies all the selected functions in an object.\n *\n * @param {Object} source the source object for the async functions\n * @param {Object} [destination] the destination to set all the promisified methods\n * @param {Array} [methods] an array of method names of `source`\n * @return {Object}\n * @api public\n */\n\nfunction thenifyAll(source, destination, methods) {\n  return promisifyAll(source, destination, methods, thenify)\n}\n\n/**\n * Promisifies all the selected functions in an object and backward compatible with callback.\n *\n * @param {Object} source the source object for the async functions\n * @param {Object} [destination] the destination to set all the promisified methods\n * @param {Array} [methods] an array of method names of `source`\n * @return {Object}\n * @api public\n */\n\nfunction withCallback(source, destination, methods) {\n  return promisifyAll(source, destination, methods, thenify.withCallback)\n}\n\nfunction promisifyAll(source, destination, methods, promisify) {\n  if (!destination) {\n    destination = {};\n    methods = Object.keys(source)\n  }\n\n  if (Array.isArray(destination)) {\n    methods = destination\n    destination = {}\n  }\n\n  if (!methods) {\n    methods = Object.keys(source)\n  }\n\n  if (typeof source === 'function') destination = promisify(source)\n\n  methods.forEach(function (name) {\n    // promisify only if it's a function\n    if (typeof source[name] === 'function') destination[name] = promisify(source[name])\n  })\n\n  // proxy the rest\n  Object.keys(source).forEach(function (name) {\n    if (deprecated(source, name)) return\n    if (destination[name]) return\n    destination[name] = source[name]\n  })\n\n  return destination\n}\n\nfunction deprecated(source, name) {\n  var desc = Object.getOwnPropertyDescriptor(source, name)\n  if (!desc || !desc.get) return false\n  if (desc.get.name === 'deprecated') return true\n  return false\n}\n\n\n/***/ }),\n/* 952 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\nvar Promise = __webpack_require__(339)\nvar assert = __webpack_require__(29)\n\nmodule.exports = thenify\n\n/**\n * Turn async functions into promises\n *\n * @param {Function} $$__fn__$$\n * @return {Function}\n * @api public\n */\n\nfunction thenify($$__fn__$$, options) {\n  assert(typeof $$__fn__$$ === 'function')\n  return eval(createWrapper($$__fn__$$.name, options))\n}\n\n/**\n * Turn async functions into promises and backward compatible with callback\n *\n * @param {Function} $$__fn__$$\n * @return {Function}\n * @api public\n */\n\nthenify.withCallback = function ($$__fn__$$, options) {\n  assert(typeof $$__fn__$$ === 'function')\n  options = options || {}\n  options.withCallback = true\n  if (options.multiArgs === undefined) options.multiArgs = true\n  return eval(createWrapper($$__fn__$$.name, options))\n}\n\nfunction createCallback(resolve, reject, multiArgs) {\n  return function(err, value) {\n    if (err) return reject(err)\n    var length = arguments.length\n\n    if (length <= 2 || !multiArgs) return resolve(value)\n\n    if (Array.isArray(multiArgs)) {\n      var values = {}\n      for (var i = 1; i < length; i++) values[multiArgs[i - 1]] = arguments[i]\n      return resolve(values)\n    }\n\n    var values = new Array(length - 1)\n    for (var i = 1; i < length; ++i) values[i - 1] = arguments[i]\n    resolve(values)\n  }\n}\n\nfunction createWrapper(name, options) {\n  name = (name || '').replace(/\\s|bound(?!$)/g, '')\n  options = options || {}\n  // default to true\n  var multiArgs = options.multiArgs !== undefined ? options.multiArgs : true\n  multiArgs = 'var multiArgs = ' + JSON.stringify(multiArgs) + '\\n'\n\n  var withCallback = options.withCallback ?\n    'var lastType = typeof arguments[len - 1]\\n'\n    + 'if (lastType === \"function\") return $$__fn__$$.apply(self, arguments)\\n'\n   : ''\n\n  return '(function ' + name + '() {\\n'\n    + 'var self = this\\n'\n    + 'var len = arguments.length\\n'\n    + multiArgs\n    + withCallback\n    + 'var args = new Array(len + 1)\\n'\n    + 'for (var i = 0; i < len; ++i) args[i] = arguments[i]\\n'\n    + 'var lastIndex = i\\n'\n    + 'return new Promise(function (resolve, reject) {\\n'\n      + 'args[lastIndex] = createCallback(resolve, reject, multiArgs)\\n'\n      + '$$__fn__$$.apply(self, args)\\n'\n    + '})\\n'\n  + '})'\n}\n\n\n/***/ }),\n/* 953 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Stream = __webpack_require__(23)\n\n// through\n//\n// a stream that does nothing but re-emit the input.\n// useful for aggregating a series of changing but not ending streams into one stream)\n\nexports = module.exports = through\nthrough.through = through\n\n//create a readable writable stream.\n\nfunction through (write, end, opts) {\n  write = write || function (data) { this.queue(data) }\n  end = end || function () { this.queue(null) }\n\n  var ended = false, destroyed = false, buffer = [], _ended = false\n  var stream = new Stream()\n  stream.readable = stream.writable = true\n  stream.paused = false\n\n//  stream.autoPause   = !(opts && opts.autoPause   === false)\n  stream.autoDestroy = !(opts && opts.autoDestroy === false)\n\n  stream.write = function (data) {\n    write.call(this, data)\n    return !stream.paused\n  }\n\n  function drain() {\n    while(buffer.length && !stream.paused) {\n      var data = buffer.shift()\n      if(null === data)\n        return stream.emit('end')\n      else\n        stream.emit('data', data)\n    }\n  }\n\n  stream.queue = stream.push = function (data) {\n//    console.error(ended)\n    if(_ended) return stream\n    if(data === null) _ended = true\n    buffer.push(data)\n    drain()\n    return stream\n  }\n\n  //this will be registered as the first 'end' listener\n  //must call destroy next tick, to make sure we're after any\n  //stream piped from here.\n  //this is only a problem if end is not emitted synchronously.\n  //a nicer way to do this is to make sure this is the last listener for 'end'\n\n  stream.on('end', function () {\n    stream.readable = false\n    if(!stream.writable && stream.autoDestroy)\n      process.nextTick(function () {\n        stream.destroy()\n      })\n  })\n\n  function _end () {\n    stream.writable = false\n    end.call(stream)\n    if(!stream.readable && stream.autoDestroy)\n      stream.destroy()\n  }\n\n  stream.end = function (data) {\n    if(ended) return\n    ended = true\n    if(arguments.length) stream.write(data)\n    _end() // will emit or queue\n    return stream\n  }\n\n  stream.destroy = function () {\n    if(destroyed) return\n    destroyed = true\n    ended = true\n    buffer.length = 0\n    stream.writable = stream.readable = false\n    stream.emit('close')\n    return stream\n  }\n\n  stream.pause = function () {\n    if(stream.paused) return\n    stream.paused = true\n    return stream\n  }\n\n  stream.resume = function () {\n    if(stream.paused) {\n      stream.paused = false\n      stream.emit('resume')\n    }\n    drain()\n    //may have become paused again,\n    //as drain emits 'data'.\n    if(!stream.paused)\n      stream.emit('drain')\n    return stream\n  }\n  return stream\n}\n\n\n\n/***/ }),\n/* 954 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*!\n * Tmp\n *\n * Copyright (c) 2011-2017 KARASZI Istvan <github@spam.raszi.hu>\n *\n * MIT Licensed\n */\n\n/*\n * Module dependencies.\n */\nconst fs = __webpack_require__(4);\nconst path = __webpack_require__(0);\nconst crypto = __webpack_require__(11);\nconst osTmpDir = __webpack_require__(772);\nconst _c = process.binding('constants');\n\n/*\n * The working inner variables.\n */\nconst\n  /**\n   * The temporary directory.\n   * @type {string}\n   */\n  tmpDir = osTmpDir(),\n\n  // the random characters to choose from\n  RANDOM_CHARS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\n\n  TEMPLATE_PATTERN = /XXXXXX/,\n\n  DEFAULT_TRIES = 3,\n\n  CREATE_FLAGS = (_c.O_CREAT || _c.fs.O_CREAT) | (_c.O_EXCL || _c.fs.O_EXCL) | (_c.O_RDWR || _c.fs.O_RDWR),\n\n  EBADF = _c.EBADF || _c.os.errno.EBADF,\n  ENOENT = _c.ENOENT || _c.os.errno.ENOENT,\n\n  DIR_MODE = 448 /* 0o700 */,\n  FILE_MODE = 384 /* 0o600 */,\n\n  // this will hold the objects need to be removed on exit\n  _removeObjects = [];\n\nvar\n  _gracefulCleanup = false,\n  _uncaughtException = false;\n\n/**\n * Random name generator based on crypto.\n * Adapted from http://blog.tompawlak.org/how-to-generate-random-values-nodejs-javascript\n *\n * @param {number} howMany\n * @returns {string} the generated random name\n * @private\n */\nfunction _randomChars(howMany) {\n  var\n    value = [],\n    rnd = null;\n\n  // make sure that we do not fail because we ran out of entropy\n  try {\n    rnd = crypto.randomBytes(howMany);\n  } catch (e) {\n    rnd = crypto.pseudoRandomBytes(howMany);\n  }\n\n  for (var i = 0; i < howMany; i++) {\n    value.push(RANDOM_CHARS[rnd[i] % RANDOM_CHARS.length]);\n  }\n\n  return value.join('');\n}\n\n/**\n * Checks whether the `obj` parameter is defined or not.\n *\n * @param {Object} obj\n * @returns {boolean} true if the object is undefined\n * @private\n */\nfunction _isUndefined(obj) {\n  return typeof obj === 'undefined';\n}\n\n/**\n * Parses the function arguments.\n *\n * This function helps to have optional arguments.\n *\n * @param {(Options|Function)} options\n * @param {Function} callback\n * @returns {Array} parsed arguments\n * @private\n */\nfunction _parseArguments(options, callback) {\n  if (typeof options == 'function') {\n    return [callback || {}, options];\n  }\n\n  if (_isUndefined(options)) {\n    return [{}, callback];\n  }\n\n  return [options, callback];\n}\n\n/**\n * Generates a new temporary name.\n *\n * @param {Object} opts\n * @returns {string} the new random name according to opts\n * @private\n */\nfunction _generateTmpName(opts) {\n  if (opts.name) {\n    return path.join(opts.dir || tmpDir, opts.name);\n  }\n\n  // mkstemps like template\n  if (opts.template) {\n    return opts.template.replace(TEMPLATE_PATTERN, _randomChars(6));\n  }\n\n  // prefix and postfix\n  const name = [\n    opts.prefix || 'tmp-',\n    process.pid,\n    _randomChars(12),\n    opts.postfix || ''\n  ].join('');\n\n  return path.join(opts.dir || tmpDir, name);\n}\n\n/**\n * Gets a temporary file name.\n *\n * @param {(Options|tmpNameCallback)} options options or callback\n * @param {?tmpNameCallback} callback the callback function\n */\nfunction tmpName(options, callback) {\n  var\n    args = _parseArguments(options, callback),\n    opts = args[0],\n    cb = args[1],\n    tries = opts.name ? 1 : opts.tries || DEFAULT_TRIES;\n\n  if (isNaN(tries) || tries < 0)\n    return cb(new Error('Invalid tries'));\n\n  if (opts.template && !opts.template.match(TEMPLATE_PATTERN))\n    return cb(new Error('Invalid template provided'));\n\n  (function _getUniqueName() {\n    const name = _generateTmpName(opts);\n\n    // check whether the path exists then retry if needed\n    fs.stat(name, function (err) {\n      if (!err) {\n        if (tries-- > 0) return _getUniqueName();\n\n        return cb(new Error('Could not get a unique tmp filename, max tries reached ' + name));\n      }\n\n      cb(null, name);\n    });\n  }());\n}\n\n/**\n * Synchronous version of tmpName.\n *\n * @param {Object} options\n * @returns {string} the generated random name\n * @throws {Error} if the options are invalid or could not generate a filename\n */\nfunction tmpNameSync(options) {\n  var\n    args = _parseArguments(options),\n    opts = args[0],\n    tries = opts.name ? 1 : opts.tries || DEFAULT_TRIES;\n\n  if (isNaN(tries) || tries < 0)\n    throw new Error('Invalid tries');\n\n  if (opts.template && !opts.template.match(TEMPLATE_PATTERN))\n    throw new Error('Invalid template provided');\n\n  do {\n    const name = _generateTmpName(opts);\n    try {\n      fs.statSync(name);\n    } catch (e) {\n      return name;\n    }\n  } while (tries-- > 0);\n\n  throw new Error('Could not get a unique tmp filename, max tries reached');\n}\n\n/**\n * Creates and opens a temporary file.\n *\n * @param {(Options|fileCallback)} options the config options or the callback function\n * @param {?fileCallback} callback\n */\nfunction file(options, callback) {\n  var\n    args = _parseArguments(options, callback),\n    opts = args[0],\n    cb = args[1];\n\n  opts.postfix = (_isUndefined(opts.postfix)) ? '.tmp' : opts.postfix;\n\n  // gets a temporary filename\n  tmpName(opts, function _tmpNameCreated(err, name) {\n    if (err) return cb(err);\n\n    // create and open the file\n    fs.open(name, CREATE_FLAGS, opts.mode || FILE_MODE, function _fileCreated(err, fd) {\n      if (err) return cb(err);\n\n      if (opts.discardDescriptor) {\n        return fs.close(fd, function _discardCallback(err) {\n          if (err) {\n            // Low probability, and the file exists, so this could be\n            // ignored.  If it isn't we certainly need to unlink the\n            // file, and if that fails too its error is more\n            // important.\n            try {\n              fs.unlinkSync(name);\n            } catch (e) {\n              if (!isENOENT(e)) {\n                err = e;\n              }\n            }\n            return cb(err);\n          }\n          cb(null, name, undefined, _prepareTmpFileRemoveCallback(name, -1, opts));\n        });\n      }\n      if (opts.detachDescriptor) {\n        return cb(null, name, fd, _prepareTmpFileRemoveCallback(name, -1, opts));\n      }\n      cb(null, name, fd, _prepareTmpFileRemoveCallback(name, fd, opts));\n    });\n  });\n}\n\n/**\n * Synchronous version of file.\n *\n * @param {Options} options\n * @returns {FileSyncObject} object consists of name, fd and removeCallback\n * @throws {Error} if cannot create a file\n */\nfunction fileSync(options) {\n  var\n    args = _parseArguments(options),\n    opts = args[0];\n\n  opts.postfix = opts.postfix || '.tmp';\n\n  const discardOrDetachDescriptor = opts.discardDescriptor || opts.detachDescriptor;\n  const name = tmpNameSync(opts);\n  var fd = fs.openSync(name, CREATE_FLAGS, opts.mode || FILE_MODE);\n  if (opts.discardDescriptor) {\n    fs.closeSync(fd); \n    fd = undefined;\n  }\n\n  return {\n    name: name,\n    fd: fd,\n    removeCallback: _prepareTmpFileRemoveCallback(name, discardOrDetachDescriptor ? -1 : fd, opts)\n  };\n}\n\n/**\n * Removes files and folders in a directory recursively.\n *\n * @param {string} root\n * @private\n */\nfunction _rmdirRecursiveSync(root) {\n  const dirs = [root];\n\n  do {\n    var\n      dir = dirs.pop(),\n      deferred = false,\n      files = fs.readdirSync(dir);\n\n    for (var i = 0, length = files.length; i < length; i++) {\n      var\n        file = path.join(dir, files[i]),\n        stat = fs.lstatSync(file); // lstat so we don't recurse into symlinked directories\n\n      if (stat.isDirectory()) {\n        if (!deferred) {\n          deferred = true;\n          dirs.push(dir);\n        }\n        dirs.push(file);\n      } else {\n        fs.unlinkSync(file);\n      }\n    }\n\n    if (!deferred) {\n      fs.rmdirSync(dir);\n    }\n  } while (dirs.length !== 0);\n}\n\n/**\n * Creates a temporary directory.\n *\n * @param {(Options|dirCallback)} options the options or the callback function\n * @param {?dirCallback} callback\n */\nfunction dir(options, callback) {\n  var\n    args = _parseArguments(options, callback),\n    opts = args[0],\n    cb = args[1];\n\n  // gets a temporary filename\n  tmpName(opts, function _tmpNameCreated(err, name) {\n    if (err) return cb(err);\n\n    // create the directory\n    fs.mkdir(name, opts.mode || DIR_MODE, function _dirCreated(err) {\n      if (err) return cb(err);\n\n      cb(null, name, _prepareTmpDirRemoveCallback(name, opts));\n    });\n  });\n}\n\n/**\n * Synchronous version of dir.\n *\n * @param {Options} options\n * @returns {DirSyncObject} object consists of name and removeCallback\n * @throws {Error} if it cannot create a directory\n */\nfunction dirSync(options) {\n  var\n    args = _parseArguments(options),\n    opts = args[0];\n\n  const name = tmpNameSync(opts);\n  fs.mkdirSync(name, opts.mode || DIR_MODE);\n\n  return {\n    name: name,\n    removeCallback: _prepareTmpDirRemoveCallback(name, opts)\n  };\n}\n\n/**\n * Prepares the callback for removal of the temporary file.\n *\n * @param {string} name the path of the file\n * @param {number} fd file descriptor\n * @param {Object} opts\n * @returns {fileCallback}\n * @private\n */\nfunction _prepareTmpFileRemoveCallback(name, fd, opts) {\n  const removeCallback = _prepareRemoveCallback(function _removeCallback(fdPath) {\n    try {\n      if (0 <= fdPath[0]) {\n        fs.closeSync(fdPath[0]);\n      }\n    }\n    catch (e) {\n      // under some node/windows related circumstances, a temporary file\n      // may have not be created as expected or the file was already closed\n      // by the user, in which case we will simply ignore the error\n      if (!isEBADF(e) && !isENOENT(e)) {\n        // reraise any unanticipated error\n        throw e;\n      }\n    }\n    try {\n      fs.unlinkSync(fdPath[1]);\n    }\n    catch (e) {\n      if (!isENOENT(e)) {\n        // reraise any unanticipated error\n        throw e;\n      }\n    }\n  }, [fd, name]);\n\n  if (!opts.keep) {\n    _removeObjects.unshift(removeCallback);\n  }\n\n  return removeCallback;\n}\n\n/**\n * Prepares the callback for removal of the temporary directory.\n *\n * @param {string} name\n * @param {Object} opts\n * @returns {Function} the callback\n * @private\n */\nfunction _prepareTmpDirRemoveCallback(name, opts) {\n  const removeFunction = opts.unsafeCleanup ? _rmdirRecursiveSync : fs.rmdirSync.bind(fs);\n  const removeCallback = _prepareRemoveCallback(removeFunction, name);\n\n  if (!opts.keep) {\n    _removeObjects.unshift(removeCallback);\n  }\n\n  return removeCallback;\n}\n\n/**\n * Creates a guarded function wrapping the removeFunction call.\n *\n * @param {Function} removeFunction\n * @param {Object} arg\n * @returns {Function}\n * @private\n */\nfunction _prepareRemoveCallback(removeFunction, arg) {\n  var called = false;\n\n  return function _cleanupCallback(next) {\n    if (!called) {\n      const index = _removeObjects.indexOf(_cleanupCallback);\n      if (index >= 0) {\n        _removeObjects.splice(index, 1);\n      }\n\n      called = true;\n      removeFunction(arg);\n    }\n\n    if (next) next(null);\n  };\n}\n\n/**\n * The garbage collector.\n *\n * @private\n */\nfunction _garbageCollector() {\n  if (_uncaughtException && !_gracefulCleanup) {\n    return;\n  }\n\n  // the function being called removes itself from _removeObjects,\n  // loop until _removeObjects is empty\n  while (_removeObjects.length) {\n    try {\n      _removeObjects[0].call(null);\n    } catch (e) {\n      // already removed?\n    }\n  }\n}\n\n/**\n * Helper for testing against EBADF to compensate changes made to Node 7.x under Windows.\n */\nfunction isEBADF(error) {\n  return isExpectedError(error, -EBADF, 'EBADF');\n}\n\n/**\n * Helper for testing against ENOENT to compensate changes made to Node 7.x under Windows.\n */\nfunction isENOENT(error) {\n  return isExpectedError(error, -ENOENT, 'ENOENT');\n}\n\n/**\n * Helper to determine whether the expected error code matches the actual code and errno,\n * which will differ between the supported node versions.\n *\n * - Node >= 7.0:\n *   error.code {String}\n *   error.errno {String|Number} any numerical value will be negated\n *\n * - Node >= 6.0 < 7.0:\n *   error.code {String}\n *   error.errno {Number} negated\n *\n * - Node >= 4.0 < 6.0: introduces SystemError\n *   error.code {String}\n *   error.errno {Number} negated\n *\n * - Node >= 0.10 < 4.0:\n *   error.code {Number} negated\n *   error.errno n/a\n */\nfunction isExpectedError(error, code, errno) {\n  return error.code == code || error.code == errno;\n}\n\n/**\n * Sets the graceful cleanup.\n *\n * Also removes the created files and directories when an uncaught exception occurs.\n */\nfunction setGracefulCleanup() {\n  _gracefulCleanup = true;\n}\n\nconst version = process.versions.node.split('.').map(function (value) {\n  return parseInt(value, 10);\n});\n\nif (version[0] === 0 && (version[1] < 9 || version[1] === 9 && version[2] < 5)) {\n  process.addListener('uncaughtException', function _uncaughtExceptionThrown(err) {\n    _uncaughtException = true;\n    _garbageCollector();\n\n    throw err;\n  });\n}\n\nprocess.addListener('exit', function _exit(code) {\n  if (code) _uncaughtException = true;\n  _garbageCollector();\n});\n\n/**\n * Configuration options.\n *\n * @typedef {Object} Options\n * @property {?number} tries the number of tries before give up the name generation\n * @property {?string} template the \"mkstemp\" like filename template\n * @property {?string} name fix name\n * @property {?string} dir the tmp directory to use\n * @property {?string} prefix prefix for the generated name\n * @property {?string} postfix postfix for the generated name\n */\n\n/**\n * @typedef {Object} FileSyncObject\n * @property {string} name the name of the file\n * @property {string} fd the file descriptor\n * @property {fileCallback} removeCallback the callback function to remove the file\n */\n\n/**\n * @typedef {Object} DirSyncObject\n * @property {string} name the name of the directory\n * @property {fileCallback} removeCallback the callback function to remove the directory\n */\n\n/**\n * @callback tmpNameCallback\n * @param {?Error} err the error object if anything goes wrong\n * @param {string} name the temporary file name\n */\n\n/**\n * @callback fileCallback\n * @param {?Error} err the error object if anything goes wrong\n * @param {string} name the temporary file name\n * @param {number} fd the file descriptor\n * @param {cleanupCallback} fn the cleanup callback function\n */\n\n/**\n * @callback dirCallback\n * @param {?Error} err the error object if anything goes wrong\n * @param {string} name the temporary file name\n * @param {cleanupCallback} fn the cleanup callback function\n */\n\n/**\n * Removes the temporary created file or directory.\n *\n * @callback cleanupCallback\n * @param {simpleCallback} [next] function to call after entry was removed\n */\n\n/**\n * Callback function for function composition.\n * @see {@link https://github.com/raszi/node-tmp/issues/57|raszi/node-tmp#57}\n *\n * @callback simpleCallback\n */\n\n// exporting all the needed methods\nmodule.exports.tmpdir = tmpDir;\n\nmodule.exports.dir = dir;\nmodule.exports.dirSync = dirSync;\n\nmodule.exports.file = file;\nmodule.exports.fileSync = fileSync;\n\nmodule.exports.tmpName = tmpName;\nmodule.exports.tmpNameSync = tmpNameSync;\n\nmodule.exports.setGracefulCleanup = setGracefulCleanup;\n\n\n/***/ }),\n/* 955 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar net = __webpack_require__(164)\n  , tls = __webpack_require__(467)\n  , http = __webpack_require__(87)\n  , https = __webpack_require__(196)\n  , events = __webpack_require__(77)\n  , assert = __webpack_require__(29)\n  , util = __webpack_require__(3)\n  , Buffer = __webpack_require__(46).Buffer\n  ;\n\nexports.httpOverHttp = httpOverHttp\nexports.httpsOverHttp = httpsOverHttp\nexports.httpOverHttps = httpOverHttps\nexports.httpsOverHttps = httpsOverHttps\n\n\nfunction httpOverHttp(options) {\n  var agent = new TunnelingAgent(options)\n  agent.request = http.request\n  return agent\n}\n\nfunction httpsOverHttp(options) {\n  var agent = new TunnelingAgent(options)\n  agent.request = http.request\n  agent.createSocket = createSecureSocket\n  agent.defaultPort = 443\n  return agent\n}\n\nfunction httpOverHttps(options) {\n  var agent = new TunnelingAgent(options)\n  agent.request = https.request\n  return agent\n}\n\nfunction httpsOverHttps(options) {\n  var agent = new TunnelingAgent(options)\n  agent.request = https.request\n  agent.createSocket = createSecureSocket\n  agent.defaultPort = 443\n  return agent\n}\n\n\nfunction TunnelingAgent(options) {\n  var self = this\n  self.options = options || {}\n  self.proxyOptions = self.options.proxy || {}\n  self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets\n  self.requests = []\n  self.sockets = []\n\n  self.on('free', function onFree(socket, host, port) {\n    for (var i = 0, len = self.requests.length; i < len; ++i) {\n      var pending = self.requests[i]\n      if (pending.host === host && pending.port === port) {\n        // Detect the request to connect same origin server,\n        // reuse the connection.\n        self.requests.splice(i, 1)\n        pending.request.onSocket(socket)\n        return\n      }\n    }\n    socket.destroy()\n    self.removeSocket(socket)\n  })\n}\nutil.inherits(TunnelingAgent, events.EventEmitter)\n\nTunnelingAgent.prototype.addRequest = function addRequest(req, options) {\n  var self = this\n\n   // Legacy API: addRequest(req, host, port, path)\n  if (typeof options === 'string') {\n    options = {\n      host: options,\n      port: arguments[2],\n      path: arguments[3]\n    };\n  }\n\n  if (self.sockets.length >= this.maxSockets) {\n    // We are over limit so we'll add it to the queue.\n    self.requests.push({host: options.host, port: options.port, request: req})\n    return\n  }\n\n  // If we are under maxSockets create a new one.\n  self.createConnection({host: options.host, port: options.port, request: req})\n}\n\nTunnelingAgent.prototype.createConnection = function createConnection(pending) {\n  var self = this\n\n  self.createSocket(pending, function(socket) {\n    socket.on('free', onFree)\n    socket.on('close', onCloseOrRemove)\n    socket.on('agentRemove', onCloseOrRemove)\n    pending.request.onSocket(socket)\n\n    function onFree() {\n      self.emit('free', socket, pending.host, pending.port)\n    }\n\n    function onCloseOrRemove(err) {\n      self.removeSocket(socket)\n      socket.removeListener('free', onFree)\n      socket.removeListener('close', onCloseOrRemove)\n      socket.removeListener('agentRemove', onCloseOrRemove)\n    }\n  })\n}\n\nTunnelingAgent.prototype.createSocket = function createSocket(options, cb) {\n  var self = this\n  var placeholder = {}\n  self.sockets.push(placeholder)\n\n  var connectOptions = mergeOptions({}, self.proxyOptions,\n    { method: 'CONNECT'\n    , path: options.host + ':' + options.port\n    , agent: false\n    }\n  )\n  if (connectOptions.proxyAuth) {\n    connectOptions.headers = connectOptions.headers || {}\n    connectOptions.headers['Proxy-Authorization'] = 'Basic ' +\n        Buffer.from(connectOptions.proxyAuth).toString('base64')\n  }\n\n  debug('making CONNECT request')\n  var connectReq = self.request(connectOptions)\n  connectReq.useChunkedEncodingByDefault = false // for v0.6\n  connectReq.once('response', onResponse) // for v0.6\n  connectReq.once('upgrade', onUpgrade)   // for v0.6\n  connectReq.once('connect', onConnect)   // for v0.7 or later\n  connectReq.once('error', onError)\n  connectReq.end()\n\n  function onResponse(res) {\n    // Very hacky. This is necessary to avoid http-parser leaks.\n    res.upgrade = true\n  }\n\n  function onUpgrade(res, socket, head) {\n    // Hacky.\n    process.nextTick(function() {\n      onConnect(res, socket, head)\n    })\n  }\n\n  function onConnect(res, socket, head) {\n    connectReq.removeAllListeners()\n    socket.removeAllListeners()\n\n    if (res.statusCode === 200) {\n      assert.equal(head.length, 0)\n      debug('tunneling connection has established')\n      self.sockets[self.sockets.indexOf(placeholder)] = socket\n      cb(socket)\n    } else {\n      debug('tunneling socket could not be established, statusCode=%d', res.statusCode)\n      var error = new Error('tunneling socket could not be established, ' + 'statusCode=' + res.statusCode)\n      error.code = 'ECONNRESET'\n      options.request.emit('error', error)\n      self.removeSocket(placeholder)\n    }\n  }\n\n  function onError(cause) {\n    connectReq.removeAllListeners()\n\n    debug('tunneling socket could not be established, cause=%s\\n', cause.message, cause.stack)\n    var error = new Error('tunneling socket could not be established, ' + 'cause=' + cause.message)\n    error.code = 'ECONNRESET'\n    options.request.emit('error', error)\n    self.removeSocket(placeholder)\n  }\n}\n\nTunnelingAgent.prototype.removeSocket = function removeSocket(socket) {\n  var pos = this.sockets.indexOf(socket)\n  if (pos === -1) return\n\n  this.sockets.splice(pos, 1)\n\n  var pending = this.requests.shift()\n  if (pending) {\n    // If we have pending requests and a socket gets closed a new one\n    // needs to be created to take over in the pool for the one that closed.\n    this.createConnection(pending)\n  }\n}\n\nfunction createSecureSocket(options, cb) {\n  var self = this\n  TunnelingAgent.prototype.createSocket.call(self, options, function(socket) {\n    // 0 is dummy port for v0.6\n    var secureSocket = tls.connect(0, mergeOptions({}, self.options,\n      { servername: options.host\n      , socket: socket\n      }\n    ))\n    self.sockets[self.sockets.indexOf(socket)] = secureSocket\n    cb(secureSocket)\n  })\n}\n\n\nfunction mergeOptions(target) {\n  for (var i = 1, len = arguments.length; i < len; ++i) {\n    var overrides = arguments[i]\n    if (typeof overrides === 'object') {\n      var keys = Object.keys(overrides)\n      for (var j = 0, keyLen = keys.length; j < keyLen; ++j) {\n        var k = keys[j]\n        if (overrides[k] !== undefined) {\n          target[k] = overrides[k]\n        }\n      }\n    }\n  }\n  return target\n}\n\n\nvar debug\nif (process.env.NODE_DEBUG && /\\btunnel\\b/.test(process.env.NODE_DEBUG)) {\n  debug = function() {\n    var args = Array.prototype.slice.call(arguments)\n    if (typeof args[0] === 'string') {\n      args[0] = 'TUNNEL: ' + args[0]\n    } else {\n      args.unshift('TUNNEL:')\n    }\n    console.error.apply(console, args)\n  }\n} else {\n  debug = function() {}\n}\nexports.debug = debug // for test\n\n\n/***/ }),\n/* 956 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\n/**\n * For Node.js, simply re-export the core `util.deprecate` function.\n */\n\nmodule.exports = __webpack_require__(3).deprecate;\n\n\n/***/ }),\n/* 957 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar rng = __webpack_require__(464);\nvar bytesToUuid = __webpack_require__(463);\n\n// **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\nvar _clockseq;\n\n// Previous uuid creation time\nvar _lastMSecs = 0;\nvar _lastNSecs = 0;\n\n// See https://github.com/broofa/node-uuid for API details\nfunction v1(options, buf, offset) {\n  var i = buf && offset || 0;\n  var b = buf || [];\n\n  options = options || {};\n  var node = options.node || _nodeId;\n  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq;\n\n  // node and clockseq need to be initialized to random values if they're not\n  // specified.  We do this lazily to minimize issues related to insufficient\n  // system entropy.  See #189\n  if (node == null || clockseq == null) {\n    var seedBytes = rng();\n    if (node == null) {\n      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n      node = _nodeId = [\n        seedBytes[0] | 0x01,\n        seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]\n      ];\n    }\n    if (clockseq == null) {\n      // Per 4.2.2, randomize (14 bit) clockseq\n      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n    }\n  }\n\n  // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so\n  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n  var msecs = options.msecs !== undefined ? options.msecs : new Date().getTime();\n\n  // Per 4.2.1.2, use count of uuid's generated during the current clock\n  // cycle to simulate higher resolution clock\n  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1;\n\n  // Time since last uuid creation (in msecs)\n  var dt = (msecs - _lastMSecs) + (nsecs - _lastNSecs)/10000;\n\n  // Per 4.2.1.2, Bump clockseq on clock regression\n  if (dt < 0 && options.clockseq === undefined) {\n    clockseq = clockseq + 1 & 0x3fff;\n  }\n\n  // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n  // time interval\n  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n    nsecs = 0;\n  }\n\n  // Per 4.2.1.2 Throw error if too many uuids are requested\n  if (nsecs >= 10000) {\n    throw new Error('uuid.v1(): Can\\'t create more than 10M uuids/sec');\n  }\n\n  _lastMSecs = msecs;\n  _lastNSecs = nsecs;\n  _clockseq = clockseq;\n\n  // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n  msecs += 12219292800000;\n\n  // `time_low`\n  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n  b[i++] = tl >>> 24 & 0xff;\n  b[i++] = tl >>> 16 & 0xff;\n  b[i++] = tl >>> 8 & 0xff;\n  b[i++] = tl & 0xff;\n\n  // `time_mid`\n  var tmh = (msecs / 0x100000000 * 10000) & 0xfffffff;\n  b[i++] = tmh >>> 8 & 0xff;\n  b[i++] = tmh & 0xff;\n\n  // `time_high_and_version`\n  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n  b[i++] = tmh >>> 16 & 0xff;\n\n  // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n  b[i++] = clockseq >>> 8 | 0x80;\n\n  // `clock_seq_low`\n  b[i++] = clockseq & 0xff;\n\n  // `node`\n  for (var n = 0; n < 6; ++n) {\n    b[i + n] = node[n];\n  }\n\n  return buf ? buf : bytesToUuid(b);\n}\n\nmodule.exports = v1;\n\n\n/***/ }),\n/* 958 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar rng = __webpack_require__(464);\nvar bytesToUuid = __webpack_require__(463);\n\nfunction v4(options, buf, offset) {\n  var i = buf && offset || 0;\n\n  if (typeof(options) == 'string') {\n    buf = options === 'binary' ? new Array(16) : null;\n    options = null;\n  }\n  options = options || {};\n\n  var rnds = options.random || (options.rng || rng)();\n\n  // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n  rnds[6] = (rnds[6] & 0x0f) | 0x40;\n  rnds[8] = (rnds[8] & 0x3f) | 0x80;\n\n  // Copy bytes to buffer, if provided\n  if (buf) {\n    for (var ii = 0; ii < 16; ++ii) {\n      buf[i + ii] = rnds[ii];\n    }\n  }\n\n  return buf || bytesToUuid(rnds);\n}\n\nmodule.exports = v4;\n\n\n/***/ }),\n/* 959 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar parse = __webpack_require__(452);\nvar correct = __webpack_require__(935);\n\nvar genericWarning = (\n  'license should be ' +\n  'a valid SPDX license expression (without \"LicenseRef\"), ' +\n  '\"UNLICENSED\", or ' +\n  '\"SEE LICENSE IN <filename>\"'\n);\n\nvar fileReferenceRE = /^SEE LICEN[CS]E IN (.+)$/;\n\nfunction startsWith(prefix, string) {\n  return string.slice(0, prefix.length) === prefix;\n}\n\nfunction usesLicenseRef(ast) {\n  if (ast.hasOwnProperty('license')) {\n    var license = ast.license;\n    return (\n      startsWith('LicenseRef', license) ||\n      startsWith('DocumentRef', license)\n    );\n  } else {\n    return (\n      usesLicenseRef(ast.left) ||\n      usesLicenseRef(ast.right)\n    );\n  }\n}\n\nmodule.exports = function(argument) {\n  var ast;\n\n  try {\n    ast = parse(argument);\n  } catch (e) {\n    var match\n    if (\n      argument === 'UNLICENSED' ||\n      argument === 'UNLICENCED'\n    ) {\n      return {\n        validForOldPackages: true,\n        validForNewPackages: true,\n        unlicensed: true\n      };\n    } else if (match = fileReferenceRE.exec(argument)) {\n      return {\n        validForOldPackages: true,\n        validForNewPackages: true,\n        inFile: match[1]\n      };\n    } else {\n      var result = {\n        validForOldPackages: false,\n        validForNewPackages: false,\n        warnings: [genericWarning]\n      };\n      if (argument.trim().length !== 0) {\n        var corrected = correct(argument);\n        if (corrected) {\n          result.warnings.push(\n            'license is similar to the valid expression \"' + corrected + '\"'\n          );\n        }\n      }\n      return result;\n    }\n  }\n\n  if (usesLicenseRef(ast)) {\n    return {\n      validForNewPackages: false,\n      validForOldPackages: false,\n      spdx: true,\n      warnings: [genericWarning]\n    };\n  } else {\n    return {\n      validForNewPackages: true,\n      validForOldPackages: true,\n      spdx: true\n    };\n  }\n};\n\n\n/***/ }),\n/* 960 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * verror.js: richer JavaScript errors\n */\n\nvar mod_assertplus = __webpack_require__(16);\nvar mod_util = __webpack_require__(3);\n\nvar mod_extsprintf = __webpack_require__(961);\nvar mod_isError = __webpack_require__(113).isError;\nvar sprintf = mod_extsprintf.sprintf;\n\n/*\n * Public interface\n */\n\n/* So you can 'var VError = require('verror')' */\nmodule.exports = VError;\n/* For compatibility */\nVError.VError = VError;\n/* Other exported classes */\nVError.SError = SError;\nVError.WError = WError;\nVError.MultiError = MultiError;\n\n/*\n * Common function used to parse constructor arguments for VError, WError, and\n * SError.  Named arguments to this function:\n *\n *     strict\t\tforce strict interpretation of sprintf arguments, even\n *     \t\t\tif the options in \"argv\" don't say so\n *\n *     argv\t\terror's constructor arguments, which are to be\n *     \t\t\tinterpreted as described in README.md.  For quick\n *     \t\t\treference, \"argv\" has one of the following forms:\n *\n *          [ sprintf_args... ]           (argv[0] is a string)\n *          [ cause, sprintf_args... ]    (argv[0] is an Error)\n *          [ options, sprintf_args... ]  (argv[0] is an object)\n *\n * This function normalizes these forms, producing an object with the following\n * properties:\n *\n *    options           equivalent to \"options\" in third form.  This will never\n *    \t\t\tbe a direct reference to what the caller passed in\n *    \t\t\t(i.e., it may be a shallow copy), so it can be freely\n *    \t\t\tmodified.\n *\n *    shortmessage      result of sprintf(sprintf_args), taking options.strict\n *    \t\t\tinto account as described in README.md.\n */\nfunction parseConstructorArguments(args)\n{\n\tvar argv, options, sprintf_args, shortmessage, k;\n\n\tmod_assertplus.object(args, 'args');\n\tmod_assertplus.bool(args.strict, 'args.strict');\n\tmod_assertplus.array(args.argv, 'args.argv');\n\targv = args.argv;\n\n\t/*\n\t * First, figure out which form of invocation we've been given.\n\t */\n\tif (argv.length === 0) {\n\t\toptions = {};\n\t\tsprintf_args = [];\n\t} else if (mod_isError(argv[0])) {\n\t\toptions = { 'cause': argv[0] };\n\t\tsprintf_args = argv.slice(1);\n\t} else if (typeof (argv[0]) === 'object') {\n\t\toptions = {};\n\t\tfor (k in argv[0]) {\n\t\t\toptions[k] = argv[0][k];\n\t\t}\n\t\tsprintf_args = argv.slice(1);\n\t} else {\n\t\tmod_assertplus.string(argv[0],\n\t\t    'first argument to VError, SError, or WError ' +\n\t\t    'constructor must be a string, object, or Error');\n\t\toptions = {};\n\t\tsprintf_args = argv;\n\t}\n\n\t/*\n\t * Now construct the error's message.\n\t *\n\t * extsprintf (which we invoke here with our caller's arguments in order\n\t * to construct this Error's message) is strict in its interpretation of\n\t * values to be processed by the \"%s\" specifier.  The value passed to\n\t * extsprintf must actually be a string or something convertible to a\n\t * String using .toString().  Passing other values (notably \"null\" and\n\t * \"undefined\") is considered a programmer error.  The assumption is\n\t * that if you actually want to print the string \"null\" or \"undefined\",\n\t * then that's easy to do that when you're calling extsprintf; on the\n\t * other hand, if you did NOT want that (i.e., there's actually a bug\n\t * where the program assumes some variable is non-null and tries to\n\t * print it, which might happen when constructing a packet or file in\n\t * some specific format), then it's better to stop immediately than\n\t * produce bogus output.\n\t *\n\t * However, sometimes the bug is only in the code calling VError, and a\n\t * programmer might prefer to have the error message contain \"null\" or\n\t * \"undefined\" rather than have the bug in the error path crash the\n\t * program (making the first bug harder to identify).  For that reason,\n\t * by default VError converts \"null\" or \"undefined\" arguments to their\n\t * string representations and passes those to extsprintf.  Programmers\n\t * desiring the strict behavior can use the SError class or pass the\n\t * \"strict\" option to the VError constructor.\n\t */\n\tmod_assertplus.object(options);\n\tif (!options.strict && !args.strict) {\n\t\tsprintf_args = sprintf_args.map(function (a) {\n\t\t\treturn (a === null ? 'null' :\n\t\t\t    a === undefined ? 'undefined' : a);\n\t\t});\n\t}\n\n\tif (sprintf_args.length === 0) {\n\t\tshortmessage = '';\n\t} else {\n\t\tshortmessage = sprintf.apply(null, sprintf_args);\n\t}\n\n\treturn ({\n\t    'options': options,\n\t    'shortmessage': shortmessage\n\t});\n}\n\n/*\n * See README.md for reference documentation.\n */\nfunction VError()\n{\n\tvar args, obj, parsed, cause, ctor, message, k;\n\n\targs = Array.prototype.slice.call(arguments, 0);\n\n\t/*\n\t * This is a regrettable pattern, but JavaScript's built-in Error class\n\t * is defined to work this way, so we allow the constructor to be called\n\t * without \"new\".\n\t */\n\tif (!(this instanceof VError)) {\n\t\tobj = Object.create(VError.prototype);\n\t\tVError.apply(obj, arguments);\n\t\treturn (obj);\n\t}\n\n\t/*\n\t * For convenience and backwards compatibility, we support several\n\t * different calling forms.  Normalize them here.\n\t */\n\tparsed = parseConstructorArguments({\n\t    'argv': args,\n\t    'strict': false\n\t});\n\n\t/*\n\t * If we've been given a name, apply it now.\n\t */\n\tif (parsed.options.name) {\n\t\tmod_assertplus.string(parsed.options.name,\n\t\t    'error\\'s \"name\" must be a string');\n\t\tthis.name = parsed.options.name;\n\t}\n\n\t/*\n\t * For debugging, we keep track of the original short message (attached\n\t * this Error particularly) separately from the complete message (which\n\t * includes the messages of our cause chain).\n\t */\n\tthis.jse_shortmsg = parsed.shortmessage;\n\tmessage = parsed.shortmessage;\n\n\t/*\n\t * If we've been given a cause, record a reference to it and update our\n\t * message appropriately.\n\t */\n\tcause = parsed.options.cause;\n\tif (cause) {\n\t\tmod_assertplus.ok(mod_isError(cause), 'cause is not an Error');\n\t\tthis.jse_cause = cause;\n\n\t\tif (!parsed.options.skipCauseMessage) {\n\t\t\tmessage += ': ' + cause.message;\n\t\t}\n\t}\n\n\t/*\n\t * If we've been given an object with properties, shallow-copy that\n\t * here.  We don't want to use a deep copy in case there are non-plain\n\t * objects here, but we don't want to use the original object in case\n\t * the caller modifies it later.\n\t */\n\tthis.jse_info = {};\n\tif (parsed.options.info) {\n\t\tfor (k in parsed.options.info) {\n\t\t\tthis.jse_info[k] = parsed.options.info[k];\n\t\t}\n\t}\n\n\tthis.message = message;\n\tError.call(this, message);\n\n\tif (Error.captureStackTrace) {\n\t\tctor = parsed.options.constructorOpt || this.constructor;\n\t\tError.captureStackTrace(this, ctor);\n\t}\n\n\treturn (this);\n}\n\nmod_util.inherits(VError, Error);\nVError.prototype.name = 'VError';\n\nVError.prototype.toString = function ve_toString()\n{\n\tvar str = (this.hasOwnProperty('name') && this.name ||\n\t\tthis.constructor.name || this.constructor.prototype.name);\n\tif (this.message)\n\t\tstr += ': ' + this.message;\n\n\treturn (str);\n};\n\n/*\n * This method is provided for compatibility.  New callers should use\n * VError.cause() instead.  That method also uses the saner `null` return value\n * when there is no cause.\n */\nVError.prototype.cause = function ve_cause()\n{\n\tvar cause = VError.cause(this);\n\treturn (cause === null ? undefined : cause);\n};\n\n/*\n * Static methods\n *\n * These class-level methods are provided so that callers can use them on\n * instances of Errors that are not VErrors.  New interfaces should be provided\n * only using static methods to eliminate the class of programming mistake where\n * people fail to check whether the Error object has the corresponding methods.\n */\n\nVError.cause = function (err)\n{\n\tmod_assertplus.ok(mod_isError(err), 'err must be an Error');\n\treturn (mod_isError(err.jse_cause) ? err.jse_cause : null);\n};\n\nVError.info = function (err)\n{\n\tvar rv, cause, k;\n\n\tmod_assertplus.ok(mod_isError(err), 'err must be an Error');\n\tcause = VError.cause(err);\n\tif (cause !== null) {\n\t\trv = VError.info(cause);\n\t} else {\n\t\trv = {};\n\t}\n\n\tif (typeof (err.jse_info) == 'object' && err.jse_info !== null) {\n\t\tfor (k in err.jse_info) {\n\t\t\trv[k] = err.jse_info[k];\n\t\t}\n\t}\n\n\treturn (rv);\n};\n\nVError.findCauseByName = function (err, name)\n{\n\tvar cause;\n\n\tmod_assertplus.ok(mod_isError(err), 'err must be an Error');\n\tmod_assertplus.string(name, 'name');\n\tmod_assertplus.ok(name.length > 0, 'name cannot be empty');\n\n\tfor (cause = err; cause !== null; cause = VError.cause(cause)) {\n\t\tmod_assertplus.ok(mod_isError(cause));\n\t\tif (cause.name == name) {\n\t\t\treturn (cause);\n\t\t}\n\t}\n\n\treturn (null);\n};\n\nVError.hasCauseWithName = function (err, name)\n{\n\treturn (VError.findCauseByName(err, name) !== null);\n};\n\nVError.fullStack = function (err)\n{\n\tmod_assertplus.ok(mod_isError(err), 'err must be an Error');\n\n\tvar cause = VError.cause(err);\n\n\tif (cause) {\n\t\treturn (err.stack + '\\ncaused by: ' + VError.fullStack(cause));\n\t}\n\n\treturn (err.stack);\n};\n\nVError.errorFromList = function (errors)\n{\n\tmod_assertplus.arrayOfObject(errors, 'errors');\n\n\tif (errors.length === 0) {\n\t\treturn (null);\n\t}\n\n\terrors.forEach(function (e) {\n\t\tmod_assertplus.ok(mod_isError(e));\n\t});\n\n\tif (errors.length == 1) {\n\t\treturn (errors[0]);\n\t}\n\n\treturn (new MultiError(errors));\n};\n\nVError.errorForEach = function (err, func)\n{\n\tmod_assertplus.ok(mod_isError(err), 'err must be an Error');\n\tmod_assertplus.func(func, 'func');\n\n\tif (err instanceof MultiError) {\n\t\terr.errors().forEach(function iterError(e) { func(e); });\n\t} else {\n\t\tfunc(err);\n\t}\n};\n\n\n/*\n * SError is like VError, but stricter about types.  You cannot pass \"null\" or\n * \"undefined\" as string arguments to the formatter.\n */\nfunction SError()\n{\n\tvar args, obj, parsed, options;\n\n\targs = Array.prototype.slice.call(arguments, 0);\n\tif (!(this instanceof SError)) {\n\t\tobj = Object.create(SError.prototype);\n\t\tSError.apply(obj, arguments);\n\t\treturn (obj);\n\t}\n\n\tparsed = parseConstructorArguments({\n\t    'argv': args,\n\t    'strict': true\n\t});\n\n\toptions = parsed.options;\n\tVError.call(this, options, '%s', parsed.shortmessage);\n\n\treturn (this);\n}\n\n/*\n * We don't bother setting SError.prototype.name because once constructed,\n * SErrors are just like VErrors.\n */\nmod_util.inherits(SError, VError);\n\n\n/*\n * Represents a collection of errors for the purpose of consumers that generally\n * only deal with one error.  Callers can extract the individual errors\n * contained in this object, but may also just treat it as a normal single\n * error, in which case a summary message will be printed.\n */\nfunction MultiError(errors)\n{\n\tmod_assertplus.array(errors, 'list of errors');\n\tmod_assertplus.ok(errors.length > 0, 'must be at least one error');\n\tthis.ase_errors = errors;\n\n\tVError.call(this, {\n\t    'cause': errors[0]\n\t}, 'first of %d error%s', errors.length, errors.length == 1 ? '' : 's');\n}\n\nmod_util.inherits(MultiError, VError);\nMultiError.prototype.name = 'MultiError';\n\nMultiError.prototype.errors = function me_errors()\n{\n\treturn (this.ase_errors.slice(0));\n};\n\n\n/*\n * See README.md for reference details.\n */\nfunction WError()\n{\n\tvar args, obj, parsed, options;\n\n\targs = Array.prototype.slice.call(arguments, 0);\n\tif (!(this instanceof WError)) {\n\t\tobj = Object.create(WError.prototype);\n\t\tWError.apply(obj, args);\n\t\treturn (obj);\n\t}\n\n\tparsed = parseConstructorArguments({\n\t    'argv': args,\n\t    'strict': false\n\t});\n\n\toptions = parsed.options;\n\toptions['skipCauseMessage'] = true;\n\tVError.call(this, options, '%s', parsed.shortmessage);\n\n\treturn (this);\n}\n\nmod_util.inherits(WError, VError);\nWError.prototype.name = 'WError';\n\nWError.prototype.toString = function we_toString()\n{\n\tvar str = (this.hasOwnProperty('name') && this.name ||\n\t\tthis.constructor.name || this.constructor.prototype.name);\n\tif (this.message)\n\t\tstr += ': ' + this.message;\n\tif (this.jse_cause && this.jse_cause.message)\n\t\tstr += '; caused by ' + this.jse_cause.toString();\n\n\treturn (str);\n};\n\n/*\n * For purely historical reasons, WError's cause() function allows you to set\n * the cause.\n */\nWError.prototype.cause = function we_cause(c)\n{\n\tif (mod_isError(c))\n\t\tthis.jse_cause = c;\n\n\treturn (this.jse_cause);\n};\n\n\n/***/ }),\n/* 961 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * extsprintf.js: extended POSIX-style sprintf\n */\n\nvar mod_assert = __webpack_require__(29);\nvar mod_util = __webpack_require__(3);\n\n/*\n * Public interface\n */\nexports.sprintf = jsSprintf;\nexports.printf = jsPrintf;\nexports.fprintf = jsFprintf;\n\n/*\n * Stripped down version of s[n]printf(3c).  We make a best effort to throw an\n * exception when given a format string we don't understand, rather than\n * ignoring it, so that we won't break existing programs if/when we go implement\n * the rest of this.\n *\n * This implementation currently supports specifying\n *\t- field alignment ('-' flag),\n * \t- zero-pad ('0' flag)\n *\t- always show numeric sign ('+' flag),\n *\t- field width\n *\t- conversions for strings, decimal integers, and floats (numbers).\n *\t- argument size specifiers.  These are all accepted but ignored, since\n *\t  Javascript has no notion of the physical size of an argument.\n *\n * Everything else is currently unsupported, most notably precision, unsigned\n * numbers, non-decimal numbers, and characters.\n */\nfunction jsSprintf(ofmt)\n{\n\tvar regex = [\n\t    '([^%]*)',\t\t\t\t/* normal text */\n\t    '%',\t\t\t\t/* start of format */\n\t    '([\\'\\\\-+ #0]*?)',\t\t\t/* flags (optional) */\n\t    '([1-9]\\\\d*)?',\t\t\t/* width (optional) */\n\t    '(\\\\.([1-9]\\\\d*))?',\t\t/* precision (optional) */\n\t    '[lhjztL]*?',\t\t\t/* length mods (ignored) */\n\t    '([diouxXfFeEgGaAcCsSp%jr])'\t/* conversion */\n\t].join('');\n\n\tvar re = new RegExp(regex);\n\n\t/* variadic arguments used to fill in conversion specifiers */\n\tvar args = Array.prototype.slice.call(arguments, 1);\n\t/* remaining format string */\n\tvar fmt = ofmt;\n\n\t/* components of the current conversion specifier */\n\tvar flags, width, precision, conversion;\n\tvar left, pad, sign, arg, match;\n\n\t/* return value */\n\tvar ret = '';\n\n\t/* current variadic argument (1-based) */\n\tvar argn = 1;\n\t/* 0-based position in the format string that we've read */\n\tvar posn = 0;\n\t/* 1-based position in the format string of the current conversion */\n\tvar convposn;\n\t/* current conversion specifier */\n\tvar curconv;\n\n\tmod_assert.equal('string', typeof (fmt),\n\t    'first argument must be a format string');\n\n\twhile ((match = re.exec(fmt)) !== null) {\n\t\tret += match[1];\n\t\tfmt = fmt.substring(match[0].length);\n\n\t\t/*\n\t\t * Update flags related to the current conversion specifier's\n\t\t * position so that we can report clear error messages.\n\t\t */\n\t\tcurconv = match[0].substring(match[1].length);\n\t\tconvposn = posn + match[1].length + 1;\n\t\tposn += match[0].length;\n\n\t\tflags = match[2] || '';\n\t\twidth = match[3] || 0;\n\t\tprecision = match[4] || '';\n\t\tconversion = match[6];\n\t\tleft = false;\n\t\tsign = false;\n\t\tpad = ' ';\n\n\t\tif (conversion == '%') {\n\t\t\tret += '%';\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (args.length === 0) {\n\t\t\tthrow (jsError(ofmt, convposn, curconv,\n\t\t\t    'has no matching argument ' +\n\t\t\t    '(too few arguments passed)'));\n\t\t}\n\n\t\targ = args.shift();\n\t\targn++;\n\n\t\tif (flags.match(/[\\' #]/)) {\n\t\t\tthrow (jsError(ofmt, convposn, curconv,\n\t\t\t    'uses unsupported flags'));\n\t\t}\n\n\t\tif (precision.length > 0) {\n\t\t\tthrow (jsError(ofmt, convposn, curconv,\n\t\t\t    'uses non-zero precision (not supported)'));\n\t\t}\n\n\t\tif (flags.match(/-/))\n\t\t\tleft = true;\n\n\t\tif (flags.match(/0/))\n\t\t\tpad = '0';\n\n\t\tif (flags.match(/\\+/))\n\t\t\tsign = true;\n\n\t\tswitch (conversion) {\n\t\tcase 's':\n\t\t\tif (arg === undefined || arg === null) {\n\t\t\t\tthrow (jsError(ofmt, convposn, curconv,\n\t\t\t\t    'attempted to print undefined or null ' +\n\t\t\t\t    'as a string (argument ' + argn + ' to ' +\n\t\t\t\t    'sprintf)'));\n\t\t\t}\n\t\t\tret += doPad(pad, width, left, arg.toString());\n\t\t\tbreak;\n\n\t\tcase 'd':\n\t\t\targ = Math.floor(arg);\n\t\t\t/*jsl:fallthru*/\n\t\tcase 'f':\n\t\t\tsign = sign && arg > 0 ? '+' : '';\n\t\t\tret += sign + doPad(pad, width, left,\n\t\t\t    arg.toString());\n\t\t\tbreak;\n\n\t\tcase 'x':\n\t\t\tret += doPad(pad, width, left, arg.toString(16));\n\t\t\tbreak;\n\n\t\tcase 'j': /* non-standard */\n\t\t\tif (width === 0)\n\t\t\t\twidth = 10;\n\t\t\tret += mod_util.inspect(arg, false, width);\n\t\t\tbreak;\n\n\t\tcase 'r': /* non-standard */\n\t\t\tret += dumpException(arg);\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthrow (jsError(ofmt, convposn, curconv,\n\t\t\t    'is not supported'));\n\t\t}\n\t}\n\n\tret += fmt;\n\treturn (ret);\n}\n\nfunction jsError(fmtstr, convposn, curconv, reason) {\n\tmod_assert.equal(typeof (fmtstr), 'string');\n\tmod_assert.equal(typeof (curconv), 'string');\n\tmod_assert.equal(typeof (convposn), 'number');\n\tmod_assert.equal(typeof (reason), 'string');\n\treturn (new Error('format string \"' + fmtstr +\n\t    '\": conversion specifier \"' + curconv + '\" at character ' +\n\t    convposn + ' ' + reason));\n}\n\nfunction jsPrintf() {\n\tvar args = Array.prototype.slice.call(arguments);\n\targs.unshift(process.stdout);\n\tjsFprintf.apply(null, args);\n}\n\nfunction jsFprintf(stream) {\n\tvar args = Array.prototype.slice.call(arguments, 1);\n\treturn (stream.write(jsSprintf.apply(this, args)));\n}\n\nfunction doPad(chr, width, left, str)\n{\n\tvar ret = str;\n\n\twhile (ret.length < width) {\n\t\tif (left)\n\t\t\tret += chr;\n\t\telse\n\t\t\tret = chr + ret;\n\t}\n\n\treturn (ret);\n}\n\n/*\n * This function dumps long stack traces for exceptions having a cause() method.\n * See node-verror for an example.\n */\nfunction dumpException(ex)\n{\n\tvar ret;\n\n\tif (!(ex instanceof Error))\n\t\tthrow (new Error(jsSprintf('invalid type for %%r: %j', ex)));\n\n\t/* Note that V8 prepends \"ex.stack\" with ex.toString(). */\n\tret = 'EXCEPTION: ' + ex.constructor.name + ': ' + ex.stack;\n\n\tif (ex.cause && typeof (ex.cause) === 'function') {\n\t\tvar cex = ex.cause();\n\t\tif (cex) {\n\t\t\tret += '\\nCaused by: ' + dumpException(cex);\n\t\t}\n\t}\n\n\treturn (ret);\n}\n\n\n/***/ }),\n/* 962 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nconst lenient = __webpack_require__(963);\n\nmodule.exports = (val, opts) => {\n\tval = String(val).trim();\n\topts = Object.assign({\n\t\tlenient: false,\n\t\tdefault: null\n\t}, opts);\n\n\tif (opts.default !== null && typeof opts.default !== 'boolean') {\n\t\tthrow new TypeError(`Expected the \\`default\\` option to be of type \\`boolean\\`, got \\`${typeof opts.default}\\``);\n\t}\n\n\tif (/^(?:y|yes|true|1)$/i.test(val)) {\n\t\treturn true;\n\t}\n\n\tif (/^(?:n|no|false|0)$/i.test(val)) {\n\t\treturn false;\n\t}\n\n\tif (opts.lenient === true) {\n\t\treturn lenient(val, opts);\n\t}\n\n\treturn opts.default;\n};\n\n\n/***/ }),\n/* 963 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nconst YES_MATCH_SCORE_THRESHOLD = 2;\nconst NO_MATCH_SCORE_THRESHOLD = 1.25;\n\nconst yMatch = new Map([\n\t[5, 0.25],\n\t[6, 0.25],\n\t[7, 0.25],\n\t['t', 0.75],\n\t['y', 1],\n\t['u', 0.75],\n\t['g', 0.25],\n\t['h', 0.25],\n\t['k', 0.25]\n]);\n\nconst eMatch = new Map([\n\t[2, 0.25],\n\t[3, 0.25],\n\t[4, 0.25],\n\t['w', 0.75],\n\t['e', 1],\n\t['r', 0.75],\n\t['s', 0.25],\n\t['d', 0.25],\n\t['f', 0.25]\n]);\n\nconst sMatch = new Map([\n\t['q', 0.25],\n\t['w', 0.25],\n\t['e', 0.25],\n\t['a', 0.75],\n\t['s', 1],\n\t['d', 0.75],\n\t['z', 0.25],\n\t['x', 0.25],\n\t['c', 0.25]\n]);\n\nconst nMatch = new Map([\n\t['h', 0.25],\n\t['j', 0.25],\n\t['k', 0.25],\n\t['b', 0.75],\n\t['n', 1],\n\t['m', 0.75]\n]);\n\nconst oMatch = new Map([\n\t[9, 0.25],\n\t[0, 0.25],\n\t['i', 0.75],\n\t['o', 1],\n\t['p', 0.75],\n\t['k', 0.25],\n\t['l', 0.25]\n]);\n\nfunction getYesMatchScore(val) {\n\tlet score = 0;\n\tconst y = val[0];\n\tconst e = val[1];\n\tconst s = val[2];\n\n\tif (yMatch.has(y)) {\n\t\tscore += yMatch.get(y);\n\t}\n\n\tif (eMatch.has(e)) {\n\t\tscore += eMatch.get(e);\n\t}\n\n\tif (sMatch.has(s)) {\n\t\tscore += sMatch.get(s);\n\t}\n\n\treturn score;\n}\n\nfunction getNoMatchScore(val) {\n\tlet score = 0;\n\tconst n = val[0];\n\tconst o = val[1];\n\n\tif (nMatch.has(n)) {\n\t\tscore += nMatch.get(n);\n\t}\n\n\tif (oMatch.has(o)) {\n\t\tscore += oMatch.get(o);\n\t}\n\n\treturn score;\n}\n\nmodule.exports = (val, opts) => {\n\tif (getYesMatchScore(val) >= YES_MATCH_SCORE_THRESHOLD) {\n\t\treturn true;\n\t}\n\n\tif (getNoMatchScore(val) >= NO_MATCH_SCORE_THRESHOLD) {\n\t\treturn false;\n\t}\n\n\treturn opts.default;\n};\n\n\n/***/ }),\n/* 964 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"dns\");\n\n/***/ }),\n/* 965 */\n/***/ (function(module, exports) {\n\nmodule.exports = require(\"domain\");\n\n/***/ })\n/******/ ]);"
  },
  {
    "path": "packages/audiodocs/.yarnrc.yml",
    "content": "yarnPath: .yarn/releases/yarn-1.22.22.cjs\n"
  },
  {
    "path": "packages/audiodocs/CLAUDE.md",
    "content": "# packages/audiodocs/ — Documentation Site\n\nDocusaurus 3 static site. Docs are MDX files in `docs/`. Custom React components live in `src/components/`.\n\n## Commands\n\n```bash\nyarn start   # dev server with hot reload\nyarn build   # production build\nyarn serve   # serve the built site\n```\n\n## Directory Structure\n\n```\npackages/audiodocs/\n├── docs/                  # All documentation pages (MDX)\n│   ├── fundamentals/      # Getting started, installation, best practices\n│   ├── guides/            # Tutorials (piano keyboard, noise, ADSR envelope)\n│   ├── core/              # AudioContext, AudioNode, AudioParam, BaseAudioContext\n│   ├── sources/           # Oscillator, BufferSource, ConstantSource, MediaElement\n│   ├── effects/           # Gain, BiquadFilter, Convolver, Dynamics, StereoPanner, Delay, IIR...\n│   ├── analysis/          # AnalyserNode\n│   ├── inputs/            # AudioRecorder\n│   ├── destinations/      # AudioDestinationNode\n│   ├── system/            # AudioManager, PlaybackNotificationManager\n│   ├── worklets/          # AudioWorklet setup and nodes\n│   ├── types/             # Enum docs (OscillatorType, BiquadFilterType...)\n│   ├── utils/             # Utility functions (decoding, time-stretching)\n│   ├── react/             # React-specific hooks and helpers\n│   └── experimental/      # Experimental APIs (Audio tag / development.react)\n├── src/\n│   ├── components/        # Custom MDX components\n│   ├── examples/          # Standalone interactive demo implementations\n│   └── pages/             # Landing page\n├── static/                # Images, audio files\n├── sidebars.js            # Autogenerated — no manual edits needed\n└── docusaurus.config.js   # Site config\n```\n\n## Sidebar / Navigation\n\nSidebar is **fully autogenerated** from the folder structure — no edits to `sidebars.js` needed.\n\nOrder is controlled by:\n- **Between folders**: `_category_.json` → `position` field\n- **Within a folder**: frontmatter `sidebar_position: N` in each `.mdx` file\n\nTo add a new category folder, create `_category_.json`:\n```json\n{ \"label\": \"My Category\", \"position\": 6 }\n```\n\n## MDX File Format\n\nAll doc pages are `.mdx` files with YAML frontmatter.\n\n### Minimal frontmatter\n\n```yaml\n---\nsidebar_position: 3\n---\n```\n\n### Full page structure for an audio node\n\n```mdx\n---\nsidebar_position: 3\n---\n\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\nimport { Optional, ReadOnly } from '@site/src/components/Badges';\n\n# GainNode\n\nBrief one-line description. `GainNode` extends [`AudioNode`](/docs/core/audio-node).\n\n#### [`AudioNode`](/docs/core/audio-node#properties) properties\n\n<AudioNodePropsTable\n  numberOfInputs={1}\n  numberOfOutputs={1}\n  channelCount={2}\n  channelCountMode={\"max\"}\n  channelInterpretation={\"speakers\"}\n/>\n\n## Constructor\n\n```tsx\nconstructor(context: BaseAudioContext, options?: GainOptions)\n```\n\n### `GainOptions`\n\nInherits all properties from [`AudioNodeOptions`](/docs/core/audio-node#audionodeoptions).\n\n| Parameter | Type | Default | |\n| :---: | :---: | :----: | :---- |\n| `gain` <Optional /> | `number` | `1` | Initial gain value. |\n\nOr by using [`BaseAudioContext.createGain()`](/docs/core/base-audio-context#creategain).\n\n## Example\n\n```tsx\nimport { AudioContext } from 'react-native-audio-api';\n\nconst ctx = new AudioContext();\nconst gain = ctx.createGain();\ngain.gain.value = 0.5;\ngain.connect(ctx.destination);\n```\n\n## Properties\n\nIt inherits all properties from [`AudioNode`](/docs/core/audio-node#properties).\n\n| Name | Type | Default | Description |\n| :----: | :----: | :-------- | :------- |\n| `gain` <ReadOnly /> | `AudioParam` | `1` | Gain applied to the signal. Range: [0, 1] typical. |\n\n## Methods\n\nIt inherits all methods from [`AudioNode`](/docs/core/audio-node#methods).\n\n## Remarks\n\n#### `gain`\n- Nominal range is [0, 1] for attenuation but accepts any finite value.\n- Values > 1 amplify; negative values invert phase.\n```\n\n## Custom MDX Components\n\n### Badges — inline in tables or text\n\n```tsx\nimport { Optional, ReadOnly, Overridden, IOS, Android, Experimental, MobileOnly }\n  from '@site/src/components/Badges';\n\n| `gain` <ReadOnly /> | `AudioParam` | `1` | ... |\n| `type` <Optional /> | `string` | `'sine'` | ... |\n```\n\n### AudioNodePropsTable — standard node property summary\n\n```tsx\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\n\n<AudioNodePropsTable\n  numberOfInputs={1}\n  numberOfOutputs={1}\n  channelCount={2}\n  channelCountMode={\"max\"}\n  channelInterpretation={\"speakers\"}\n/>\n```\n\nUse the values from the Web Audio API spec for the node you are documenting.\n\n### InteractivePlayground — live audio demo with controls\n\nUse when you have a `useXxxPlayground` hook in `src/components/InteractivePlayground/`.\n\n```tsx\nimport InteractivePlayground from '@site/src/components/InteractivePlayground';\nimport { useOscillatorPlayground } from\n  '@site/src/components/InteractivePlayground/OscillatorExample/useOscilatorPlayground';\n\n<details open>\n<summary><code>OscillatorNode</code> interactive playground</summary>\n<InteractivePlayground usePlayground={useOscillatorPlayground} />\n</details>\n```\n\nTo add a new playground: create `src/components/InteractivePlayground/MyExample/useMyPlayground.ts`.\n\n### InteractiveExample — side-by-side code + rendered output\n\n```tsx\nimport MyExample from '@site/src/examples/MyExample/MyExample';\nimport MyExampleSrc from '!!raw-loader!@site/src/examples/MyExample/MyExample';\n\n<InteractiveExample component={MyExample} src={MyExampleSrc} />\n```\n\nSource file (`src/examples/MyExample/MyExample.tsx`) must be a React component that works on web (via `react-native-web`).\n\n### Admonitions (built-in Docusaurus)\n\n```mdx\n:::note\nInformational note.\n:::\n\n:::tip\nHelpful tip.\n:::\n\n:::caution\nSomething to watch out for.\n:::\n```\n\n### Collapsible blocks\n\n```mdx\n<details open>\n<summary>Click to expand</summary>\n\nContent here.\n\n</details>\n```\n\n### Math (LaTeX)\n\nInline: `$f = -\\frac{\\text{sampleRate}}{2}$`\nBlock: `$$formula$$`\n\n## Adding a New Node Doc Page\n\n1. Identify the category folder: `docs/sources/`, `docs/effects/`, `docs/analysis/`, etc.\n2. Create `docs/<category>/my-node.mdx`.\n3. Use the structure above: frontmatter → imports → `AudioNodePropsTable` → Constructor → Example → Properties → Methods → Remarks.\n4. Set `sidebar_position` relative to neighboring files (check their positions first).\n5. Sidebar updates automatically on next `yarn start` / `yarn build`.\n\n## Adding a New Guide / Tutorial\n\n1. Create `docs/guides/my-guide.mdx`.\n2. Use `<InteractiveExample>` to embed working code + rendered output.\n3. Use `<InteractivePlayground>` for live parameter control.\n4. Add the example code in `src/examples/MyGuide/`.\n\n## Property Table Format\n\n```mdx\n| Name | Type | Default value | Description |\n| :----: | :----: | :-------- | :------- |\n| `frequency` <ReadOnly /> | `AudioParam` | `440` | Oscillation frequency in Hz. |\n| `type` | `OscillatorType` | `'sine'` | Waveform shape. |\n```\n\n`<ReadOnly />` — property cannot be reassigned (AudioParam wrappers are always ReadOnly).\n`<Optional />` — constructor option or parameter is optional.\n`<IOS />` / `<Android />` — feature is platform-specific.\n"
  },
  {
    "path": "packages/audiodocs/README.md",
    "content": "# React Native Audio API documentation\n\nThe docs are available at <https://software-mansion.github.io/react-native-audio-api/>\n"
  },
  {
    "path": "packages/audiodocs/babel.config.js",
    "content": "module.exports = {\n  presets: [require.resolve('@docusaurus/core/lib/babel/preset')],\n  plugins: [\n          '@babel/plugin-proposal-export-namespace-from',\n          'react-native-worklets/plugin',\n      ],\n};\n"
  },
  {
    "path": "packages/audiodocs/docs/analysis/_category_.json",
    "content": "{\n  \"label\": \"Analysis\",\n  \"position\": 7,\n  \"link\": {\n    \"type\": \"generated-index\"\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/docs/analysis/analyser-node.mdx",
    "content": "---\nsidebar_position: 1\n---\n\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\nimport { Optional, ReadOnly } from '@site/src/components/Badges';\n\n# AnalyserNode\n\nThe `AnalyserNode` interface represents a node providing two core functionalities: extracting time-domain data and frequency-domain data from audio signals.\nIt is an [`AudioNode`](/docs/core/audio-node) that passes the audio data unchanged from input to output, but allows to take passed data and process it.\n\n#### Time domain vs Frequency domain\n\n![time-domain-vs-frequency-domain](/img/time_domain_vs_frequency_domain.jpg)\n\nA time-domain graph illustrates how a signal evolves over time, displaying changes in amplitude or intensity as time progresses.\nIn contrast, a frequency-domain graph reveals how the signal's energy or power is distributed across different frequency bands, highlighting the presence and strength of various frequency components over a specified range.\n\n## Constructor\n\n```tsx\nconstructor(context: BaseAudioContext, options?: AnalyserOptions)\n```\n\n### `AnalyserOptions`\n\nInherits all properties from [`AudioNodeOptions`](/docs/core/audio-node#audionodeoptions)\n\n| Parameter | Type | Default | |\n| :---: | :---: | :----: | :---- |\n| `fftSize` <Optional /> | `number` | 2048 | Number representing size of fast fourier transform |\n| `minDecibels` <Optional /> | `number` | -100 | Initial minimum power in dB for FFT analysis |\n| `maxDecibels` <Optional /> | `number` | -30 | Initial maximum power in dB for FFT analysis |\n| `smoothingTimeConstant` <Optional /> | `number` | 0.8 | Initial smoothing constant for the FFT analysis |\n\nOr by using `BaseAudioContext` factory method:\n[`BaseAudioContext.createAnalyser()`](/docs/core/base-audio-context#createanalyser) that creates node with default values.\n\n## Properties\n\nIt inherits all properties from [`AudioNode`](/docs/core/audio-node#properties).\n\n<AudioNodePropsTable numberOfInputs={1} numberOfOutputs={1} channelCount={2} channelCountMode=\"max\" channelInterpretation=\"speakers\" />\n\n| Name | Type | Description | |\n| :----: | :----: | :-------- | :-: |\n| `fftSize` | `number` | Integer value representing size of [Fast Fourier Transform](https://en.wikipedia.org/wiki/Fast_Fourier_transform) used to determine frequency domain. In general it is size of returning time-domain data. |\n| `minDecibels` | `number` | Float value representing the minimum value for the range of results from [`getByteFrequencyData()`](/docs/analysis/analyser-node#getbytefrequencydata). |\n| `maxDecibels` | `number` | Float value representing the maximum value for the range of results from [`getByteFrequencyData()`](/docs/analysis/analyser-node#getbytefrequencydata). |\n| `smoothingTimeConstant` | `number` | Float value representing averaging constant with the last analysis frame. In general the higher value the smoother is the transition between values over time. |\n| `frequencyBinCount` | `number` | Integer value representing amount of the data obtained in frequency domain, half of the `fftSize` property. | <ReadOnly /> |\n\n## Methods\n\nIt inherits all methods from [`AudioNode`](/docs/core/audio-node#methods).\n\n### `getFloatFrequencyData`\n\nCopies current frequency data into given array.\nEach value in the array represents the decibel value for a specific frequency.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `array` | `Float32Array` | The array to which frequency data will be copied. |\n\n#### Returns `undefined`.\n\n### `getByteFrequencyData`\n\nCopies current frequency data into given array.\nEach value in the array is within the range 0 to 255.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `array` | `Uint8Array` | The array to which frequency data will be copied. |\n\n#### Returns `undefined`.\n\n### `getFloatTimeDomainData`\n\nCopies current time-domain data into given array.\nEach value in the array is the magnitude of the signal at a particular time.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `array` | `Float32Array` | The array to which time-domain data will be copied. |\n\n#### Returns `undefined`.\n\n### `getByteTimeDomainData`\n\nCopies current time-domain data into given array.\nEach value in the array is within the range 0 to 255, where value of 127 indicates silence.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `array` | `Uint8Array` | The array to which time-domain data will be copied. |\n\n#### Returns `undefined`.\n\n## Remarks\n\n#### `fftSize`\n- Must be a power of 2 between 32 and 32768.\n- Throws `IndexSizeError` if set value is not power of 2, or is outside the allowed range.\n\n#### `minDecibels`\n- 0 dB([decibel](https://en.wikipedia.org/wiki/Decibel)) is the loudest possible sound, -10 dB is a 10th of that.\n- When getting data from [`getByteFrequencyData()`](/docs/analysis/analyser-node#getbytefrequencydata), any frequency with amplitude lower then `minDecibels` will be returned as 0.\n- Throws `IndexSizeError` if set value is greater than or equal to `maxDecibels`.\n\n#### `maxDecibels`\n- 0 dB([decibel](https://en.wikipedia.org/wiki/Decibel)) is the loudest possible sound, -10 dB is a 10th of that.\n- When getting data from [`getByteFrequencyData()`](/docs/analysis/analyser-node#getbytefrequencydata), any frequency with amplitude higher then `maxDecibels` will be returned as 255.\n- Throws `IndexSizeError` if set value is less then or equal to `minDecibels`.\n\n#### `smoothingTimeConstant`\n- Nominal range is 0 to 1.\n- 0 means no averaging, 1 means \"overlap the previous and current buffer quite a lot while computing the value\".\n- Throws `IndexSizeError` if set value is outside the allowed range.\n"
  },
  {
    "path": "packages/audiodocs/docs/core/_category_.json",
    "content": "{\n  \"label\": \"Core\",\n  \"position\": 3,\n  \"link\": {\n    \"type\": \"generated-index\"\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/docs/core/audio-context.mdx",
    "content": "---\nsidebar_position: 2\n---\n\n# AudioContext\n\nThe `AudioContext` interface inherits from [`BaseAudioContext`](/docs/core/base-audio-context).\nIt is responsible for supervising and managing audio-processing graph.\n\n## Constructor\n\n`new AudioContext(options: AudioContextOptions)`\n\n```jsx\ninterface AudioContextOptions {\n  sampleRate: number;\n}\n```\n\n#### Errors\n\n| Error type | Description |\n| :---: | :---- |\n| `NotSupportedError` | `sampleRate` is outside the nominal range [8000, 96000]. |\n\n## Properties\n\n`AudioContext` does not define any additional properties.\nIt inherits all properties from [`BaseAudioContext`](/docs/core/base-audio-context#properties).\n\n\n## Methods\n\nIt inherits all methods from [`BaseAudioContext`](/docs/core/base-audio-context#methods).\n\n### `close`\n\nCloses the audio context, releasing any system audio resources that it uses.\n\n#### Returns `Promise<undefined>`.\n\n### `suspend`\n\nSuspends time progression in the audio context.\nIt is useful when your application will not use audio for a while.\n\n#### Returns `Promise<boolean>`.\n\n### `resume`\n\nResumes a previously suspended audio context.\n\n#### Returns `Promise<boolean>`.\n\n"
  },
  {
    "path": "packages/audiodocs/docs/core/audio-node.mdx",
    "content": "---\nsidebar_position: 3\n---\n\nimport { Optional, ReadOnly } from '@site/src/components/Badges';\n\n# AudioNode\n\nThe `AudioNode` interface serves as a versatile interface for constructing an audio processing graph, representing individual units of audio processing functionality.\nEach `AudioNode` is associated with a certain number of audio channels that facilitate the transfer of audio data through processing graph.\n\nWe usually represent the channels with the standard abbreviations detailed in the table below:\n\n| Name | Number of channels | Channels |\n| :----: | :------: | :-------- |\n| Mono | 1 | 0: M - mono |\n| Stereo | 2 | 0: L - left <br /> 1: R - right |\n| Quad | 4 | 0: L - left <br /> 1: R - right <br /> 2: SL - surround left <br /> 3: SR - surround right |\n| Stereo | 6 | 0: L - left <br /> 1: R - right <br /> 2: C - center <br /> 3: LFE - subwoofer <br /> 4: SL - surround left <br /> 5: SR - surround right |\n\n#### Mixing\n\nWhen node has more then one input or number of inputs channels differs from output up-mixing or down-mixing must be conducted.\nThere are three properties involved in mixing process: `channelCount`, [`ChannelCountMode`](/docs/types/channel-count-mode), [`ChannelInterpretation`](/docs/types/channel-interpretation).\nBased on them we can obtain output's number of channels and mixing strategy.\n\n## Properties\n\n| Name | Type | Description | |\n| :----: | :----: | :-------- | :-: |\n| `context` | [`BaseAudioContext`](/docs/core/base-audio-context) | Associated context. | <ReadOnly /> |\n| `numberOfInputs` | `number` | Integer value representing the number of input connections for the node. | <ReadOnly /> |\n| `numberOfOutputs` | `number` | Integer value representing the number of output connections for the node. | <ReadOnly /> |\n| `channelCount` | `number` | Integer used to determine how many channels are used when up-mixing or down-mixing node's inputs. | <ReadOnly /> |\n| `channelCountMode` | [`ChannelCountMode`](/docs/types/channel-count-mode) | Enumerated value that specifies the method by which channels are mixed between the node's inputs and outputs. | <ReadOnly /> |\n| `channelInterpretation` | [`ChannelInterpretation`](/docs/types/channel-interpretation) | Enumerated value that specifies how input channels are mapped to output channels when number of them is different. | <ReadOnly /> |\n\n## Examples\n\n### Connecting node to node\n\n```tsx\nimport { OscillatorNode, GainNode, AudioContext } from 'react-native-audio-api';\n\nfunction App() {\n  const audioContext = new AudioContext();\n  const oscillatorNode = audioContext.createOscillator();\n  const gainNode = audioContext.createGain();\n\n  gainNode.gain.value = 0.5; //lower volume to 0.5\n  oscillatorNode.connect(gainNode);\n  gainNode.connect(audioContext.destination);\n  oscillatorNode.start(audioContext.currentTime);\n}\n```\n\n### Connecting node to audio param (LFO-controlled parameter)\n\n```tsx\nimport { OscillatorNode, GainNode, AudioContext } from 'react-native-audio-api';\n\nfunction App() {\n  const audioContext = new AudioContext();\n  const oscillatorNode = audioContext.createOscillator();\n  const lfo = audioContext.createOscillator();\n  const gainNode = audioContext.createGain();\n\n  gainNode.gain.value = 0.5; //lower volume to 0.5\n  lfo.frequency.value = 2; //low frequency oscillator with 2Hz\n\n  // by default oscillator wave values ranges from -1 to 1\n  // connecting lfo to gain param will cause the gain param to oscillate at 2Hz and its value will range from 0.5 - 1 to 0.5 + 1\n  // you can modulate amplitude by connecting lfo to another gain that would be responsible for this value\n  lfo.connect(gainNode.gain)\n\n  oscillatorNode.connect(gainNode);\n  gainNode.connect(audioContext.destination);\n  oscillatorNode.start(audioContext.currentTime);\n  lfo.start(audioContext.currentTime);\n}\n```\n\n\n## Methods\n\n### `connect`\n\nConnects one of the node's outputs to a destination.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `destination` | [`AudioNode`](/docs/core/audio-node) or [`AudioParam`](/docs/core/audio-param) | `AudioNode` or `AudioParam` to which to connect. |\n\n#### Errors:\n\n| Error type | Description |\n| :---: | :---- |\n| `InvalidAccessError` | If `destination` is not part of the same audio context as the node. |\n\n#### Returns `undefined`.\n\n### `disconnect`\n\nDisconnects one or more nodes from the node.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `destination` <Optional /> | [`AudioNode`](/docs/core/audio-node) or [`AudioParam`](/docs/core/audio-param) | `AudioNode` or `AudioParam` from which to disconnect. |\n\nIf no arguments provided node disconnects from all outgoing connections.\n\n#### Returns `undefined`.\n\n### `AudioNodeOptions`\n\nIt is used to constructing majority of all `AudioNodes`.\n\n| Parameter | Type | Default | Description |\n| :---: | :---: | :----: | :---- |\n| `channelCount` <Optional /> | `number` | 2 | Indicates number of channels used in mixing of node. |\n| `channelCountMode` <Optional /> | [`ChannelCountMode`](/docs/types/channel-count-mode) | `max` | Determines how the number of input channels affects the number of output channels in an audio node. |\n| `channelInterpretation` <Optional /> | [`ChannelInterpretation`](/docs/types/channel-interpretation) | `speakers` | Specifies how input channels are mapped out to output channels when the number of them are different. |\n\nIf any of these values are not provided, default values are used.\n\n## Remarks\n\n#### `numberOfInputs`\n- Source nodes are characterized by having a `numberOfInputs` value of 0.\n\n#### `numberOfOutputs`\n- Destination nodes are characterized by having a `numberOfOutputs` value of 0.\n"
  },
  {
    "path": "packages/audiodocs/docs/core/audio-param.mdx",
    "content": "---\nsidebar_position: 4\n---\n\nimport { Optional, ReadOnly } from '@site/src/components/Badges';\nimport { SetValueAtTimeChart, LinearRampToValueAtTimeChart, ExponentialRampToValueAtTimeChart, SetTargetAtTimeChart, SetValueCurveAtTimeChart } from '@site/src/components/Charts';\n\n# AudioParam\n\nThe `AudioParam` interface represents audio-related parameter (such as `gain` property of [GainNode`](/docs/effects/gain-node)).\nIt can be set to specific value or schedule value change to happen at specific time, and following specific pattern.\n\n#### a-rate vs k-rate\n- `a-rate` - takes the current audio parameter value for each sample frame of the audio signal.\n- `k-rate` - uses the same initial audio parameter value for the whole block processed.\n\n## Properties\n\n| Name | Type | Description | |\n| :----: | :----: | :-------- | :-: |\n| `defaultValue` | `number` | Initial value of the parameter. | <ReadOnly /> |\n| `minValue` | `number` | Minimum possible value of the parameter. | <ReadOnly /> |\n| `maxValue` | `number` | Maximum possible value of the parameter. | <ReadOnly /> |\n| `value` | `number` | Current value of the parameter. Initially set to `defaultValue`. |\n\n## Methods\n\n### `setValueAtTime`\n\nSchedules an instant change to the `value` at given `startTime`.\n\n:::caution\n\nIf you need to call this function many times (especially more than 31 times), it is recommended to use the methods described below\n(such as [`linearRampToValueAtTime`](/docs/core/audio-param#linearramptovalueattime) or [`exponentialRampToValueAtTime`](/docs/core/audio-param#exponentialramptovalueattime)),\nas they are more efficient for continuous changes. For more specific use cases, you can schedule multiple value changes using [`setValueCurveAtTime`](/docs/core/audio-param#setvaluecurveattime).\n\n:::\n\n<SetValueAtTimeChart />\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `value` | `number` | A float representing the value the `AudioParam` will be set at given time |\n| `startTime` | `number` | The time, in seconds, at which the change in value is going to happen. If it's smaller than [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties), it will be clamped to [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties). |\n\n#### Errors:\n\n| Error type | Description |\n| :---: | :---- |\n| `RangeError` | `startTime` is negative number. |\n| `NotSupportedError` | `startTime` falls within the interval $[T, T+D)$ where $T$ is the time of previously scheduled [`setValueCurveAtTime`](/docs/core/audio-param#setvaluecurveattime) event and $D$ is its duration. |\n\n#### Returns `AudioParam`.\n\n### `linearRampToValueAtTime`\n\nSchedules a gradual linear change to the new value.\nThe change begins at the time designated for the previous event. It follows a linear ramp to the `value`, achieving it by the specified `endTime`.\n\n<LinearRampToValueAtTimeChart />\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `value` | `number` | A float representing the value, the `AudioParam` will ramp to by given time. |\n| `endTime` | `number` | The time, in seconds, at which the value ramp will end. If it's smaller than [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties), it will be clamped to [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties).  |\n\n#### Errors\n\n| Error type | Description |\n| :---: | :---- |\n| `RangeError` | `endTime` is negative number. |\n| `NotSupportedError` | `endTime` falls within the interval $[T, T+D)$ where $T$ is the time of previously scheduled [`setValueCurveAtTime`](/docs/core/audio-param#setvaluecurveattime) event and $D$ is its duration. |\n\n#### Returns `AudioParam`.\n\n### `exponentialRampToValueAtTime`\n\nSchedules a gradual exponential change to the new value.\nThe change begins at the time designated for the previous event. It follows an exponential ramp to the `value`, achieving it by the specified `endTime`.\n\n<ExponentialRampToValueAtTimeChart />\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `value` | `number` | A float representing the value the `AudioParam` will ramp to by given time. |\n| `endTime` | `number` | The time, in seconds, at which the value ramp will end. If it's smaller than [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties), it will be clamped to [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties).|\n\n#### Errors\n\n| Error type | Description |\n| :---: | :---- |\n| `RangeError` | `endTime` is negative number. |\n| `NotSupportedError` | `endTime` falls within the interval $[T, T+D)$ where $T$ is the time of previously scheduled [`setValueCurveAtTime`](/docs/core/audio-param#setvaluecurveattime) event and $D$ is its duration. |\n\n#### Returns `AudioParam`.\n\n### `setTargetAtTime`\n\nSchedules a gradual change to the new value at the start time.\nThis method is useful for decay or release portions of [ADSR envelopes](/docs/effects/gain-node#advanced-usage--envelope-adsr).\n\n<SetTargetAtTimeChart />\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `target` | `number` | A float representing the value to which the `AudioParam` will start transitioning. |\n| `startTime` | `number` | The time, in seconds, at which exponential transition will begin. If it's smaller than [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties), it will be clamped to [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties). |\n| `timeConstant` | `number` | A double representing the time-constant value of an exponential approach to the `target`. |\n\n#### Errors\n\n| Error type | Description |\n| :---: | :---- |\n| `RangeError` | `startTime` is negative number. |\n| `RangeError` | `timeConstant` is negative number. |\n| `NotSupportedError` | `startTime` falls within the interval $[T, T+D)$ where $T$ is the time of previously scheduled [`setValueCurveAtTime`](/docs/core/audio-param#setvaluecurveattime) event and $D$ is its duration. |\n\n#### Returns `AudioParam`.\n\n### `setValueCurveAtTime`\n\nSchedules the parameters's value change following a curve defined by given array.\n\n<SetValueCurveAtTimeChart />\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `values` | `Float32Array` | The array of values defining a curve, which change will follow. |\n| `startTime` | `number` | The time, in seconds, at which change will begin. If it's smaller than [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties), it will be clamped to [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties). |\n| `duration` | `number` | A double representing total time over which the change will happen. |\n\n#### Errors\n\n| Error type | Description |\n| :---: | :---- |\n| `RangeError` | `startTime` is negative number. |\n| `NotSupportedError` | there are already scheduled events that fall within the interval $(T, T+D)$ where $T$ is the `startTime` and $D$ is the `duration`. |\n\n#### Returns `AudioParam`.\n\n### `cancelScheduledValues`\n\nCancels all scheduled changes after given cancel time.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `cancelTime` | `number` | The time, in seconds, after which all scheduled changes will be cancelled. If it's smaller than [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties), it will be clamped to [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties). |\n\n#### Errors\n\n| Error type | Description |\n| :---: | :---- |\n| `RangeError` | `cancelTime` is negative number. |\n\n#### Returns `AudioParam`.\n\n### `cancelAndHoldAtTime`\n\nCancels all scheduled changes after given cancel time, but holds its value at given cancel time until further changes appear.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `cancelTime` | `number` | The time, in seconds, after which all scheduled changes will be cancelled. If it's smaller than [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties), it will be clamped to [`currentTime`](https://docs.swmansion.com/react-native-audio-api/docs/core/base-audio-context#properties).|\n\n#### Errors\n\n| Error type | Description |\n| :---: | :---- |\n| `RangeError` | `cancelTime` is negative number. |\n\n#### Returns `AudioParam`.\n\n## Remarks\n\nAll time parameters should be in the same time coordinate system as [`BaseAudioContext.currentTime`](/docs/core/base-audio-context).\n"
  },
  {
    "path": "packages/audiodocs/docs/core/base-audio-context.mdx",
    "content": "---\nsidebar_position: 1\n---\n\nimport { Optional, ReadOnly, MobileOnly } from '@site/src/components/Badges';\n\n# BaseAudioContext\n\nThe `BaseAudioContext` interface acts as a supervisor of audio-processing graphs. It provides key processing parameters such as current time, output destination or sample rate.\nAdditionally, it is responsible for nodes creation and audio-processing graph's lifecycle management.\nHowever, `BaseAudioContext` itself cannot be directly utilized, instead its functionalities must be accessed through one of its derived interfaces: [`AudioContext`](/docs/core/audio-context), [`OfflineAudioContext`](/docs/core/offline-audio-context).\n\n#### Audio graph\n\nAn audio graph is a structured representation of audio processing elements and their connections within an audio context.\nThe graph consists of various types of nodes, each performing specific audio operations, connected in a network that defines the audio signal flow.\nIn general we can distinguish four types of nodes:\n- Source nodes (e.g [`AudioBufferSourceNode`](/docs/sources/audio-buffer-source-node), [`OscillatorNode`](/docs/sources/oscillator-node))\n- Effect nodes (e.g [`GainNode`](/docs/effects/gain-node), [`BiquadFilterNode`](/docs/effects/biquad-filter-node))\n- Analysis nodes (e.g [`AnalyserNode`](/docs/analysis/analyser-node))\n- Destination nodes (e.g [`AudioDestinationNode`](/docs/destinations/audio-destination-node))\n\n![](/img/audio-graph.png)\n\n#### Rendering audio graph\n\nAudio graph rendering is done in blocks of sample-frames. The number of sample-frames in a block is called render quantum size, and the block itself is called a render quantum.\nBy default render quantum size value is 128 and it is constant.\n\nThe [`AudioContext`](/docs/core/audio-context) rendering thread is driven by a system-level audio callback.\nEach call has a system-level audio callback buffer size, which is a varying number of sample-frames that needs to be computed on time before the next system-level audio callback arrives,\nbut render quantum size does not have to be a divisor of the system-level audio callback buffer size.\n\n:::info\nConcept of system-level audio callback does not apply to [`OfflineAudioContext`](/docs/core/offline-audio-context).\n:::\n\n## Properties\n\n| Name | Type | Description | |\n| :----: | :----: | :-------- | :-: |\n| `currentTime` | `number` | Double value representing an ever-increasing hardware time in seconds, starting from 0. | <ReadOnly /> |\n| `destination` | [`AudioDestinationNode`](/docs/destinations/audio-destination-node) | Final output destination associated with the context. | <ReadOnly /> |\n| `sampleRate` | `number` | Float value representing the sample rate (in samples per seconds) used by all nodes in this context. | <ReadOnly /> |\n| `state` | [`ContextState`](/docs/core/base-audio-context#contextstate) | Enumerated value represents the current state of the context. | <ReadOnly /> |\n\n## Methods\n\n### `createAnalyser`\n\nCreates [`AnalyserNode`](/docs/analysis/analyser-node).\n\n#### Returns `AnalyserNode`.\n\n### `createBiquadFilter`\n\nCreates [`BiquadFilterNode`](/docs/effects/biquad-filter-node).\n\n#### Returns `BiquadFilterNode`.\n\n### `createBuffer`\n\nCreates [`AudioBuffer`](/docs/sources/audio-buffer).\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `numOfChannels` | `number` | An integer representing the number of channels of the buffer. |\n| `length` | `number` | An integer representing the length of the buffer in sampleFrames. Two seconds buffer has length equals to `2 * sampleRate`. |\n| `sampleRate` | `number` | A float representing the sample rate of the buffer. |\n\n#### Errors\n\n| Error type | Description |\n| :---: | :---- |\n| `NotSupportedError` | `numOfChannels` is outside the nominal range [1, 32]. |\n| `NotSupportedError` | `sampleRate` is outside the nominal range [8000, 96000]. |\n| `NotSupportedError` | `length` is less then 1. |\n\n#### Returns `AudioBuffer`.\n\n### `createBufferSource`\n\nCreates [`AudioBufferSourceNode`](/docs/sources/audio-buffer-source-node).\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `options` <Optional /> | <span style={{whiteSpace: 'nowrap'}}>`{ pitchCorrection: boolean }`</span> | Boolean that specifies if pitch correction has to be available. |\n\n#### Returns `AudioBufferSourceNode`.\n\n### `createBufferQueueSource` <MobileOnly />\n\nCreates [`AudioBufferQueueSourceNode`](/docs/sources/audio-buffer-queue-source-node).\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `options` <Optional /> | <span style={{whiteSpace: 'nowrap'}}>`{ pitchCorrection: boolean }`</span> | Boolean that specifies if pitch correction has to be available. |\n\n#### Returns `AudioBufferQueueSourceNode`.\n\n### `createConstantSource`\n\nCreates [`ConstantSourceNode`](/docs/sources/constant-source-node).\n\n#### Returns `ConstantSourceNode`.\n\n### `createConvolver`\n\nCreates [`ConvolverNode`](/docs/effects/convolver-node).\n\n#### Returns `ConvolverNode`.\n\n### `createDelay`\n\nCreates [`DelayNode`](/docs/effects/delay-node)\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `maxDelayTime` <Optional /> | `number` | Maximum amount of time to buffer delayed values|\n\n#### Returns `DelayNode`\n\n### `createGain`\n\nCreates [`GainNode`](/docs/effects/gain-node).\n\n#### Returns `GainNode`.\n\n### `createIIRFilter`\n\nCreates [`IIRFilterNode`](/docs/effects/iir-filter-node).\n\n#### Returns `IIRFilterNode`.\n\n### `createOscillator`\n\nCreates [`OscillatorNode`](/docs/sources/oscillator-node).\n\n#### Returns `OscillatorNode`.\n\n### `createPeriodicWave`\n\nCreates [`PeriodicWave`](/docs/effects/periodic-wave). This waveform specifies a repeating pattern that an OscillatorNode can use to generate its output sound.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `real` | `Float32Array` | An array of cosine terms. |\n| `imag` | `Float32Array` | An array of sine terms. |\n| `constraints` <Optional /> | `{ disableNormalization: boolean }` | An object that specifies if normalization is disabled. If so, periodic wave will have maximum peak value of 1 and minimum peak value of -1.|\n\n#### Errors\n\n| Error type | Description |\n| :---: | :---- |\n| `InvalidAccessError` | `real` and `imag` arrays do not have same length. |\n\n#### Returns `PeriodicWave`.\n\n### `createRecorderAdapter`\n\nCreates [`RecorderAdapterNode`](/docs/sources/recorder-adapter-node).\n\n#### Returns `RecorderAdapterNode`\n\n### `createStereoPanner`\n\nCreates [`StereoPannerNode`](/docs/effects/stereo-panner-node).\n\n#### Returns `StereoPannerNode`.\n\n### `createStreamer` <MobileOnly />\n\nCreates [`StreamerNode`](/docs/sources/streamer-node).\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `options` <Optional /> | [`StreamerOptions`](/docs/sources/streamer-node#streameroptions) | Streamer options to initialize. |\n\n#### Returns `StreamerNode`.\n\n### `createWaveShaper`\n\nCreates [`WaveShaperNode`](/docs/effects/wave-shaper-node).\n\n#### Returns `WaveShaperNode`.\n\n### `createWorkletNode` <MobileOnly />\n\nCreates [`WorkletNode`](/docs/worklets/worklet-node).\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `worklet` | `(Array<Float32Array>, number) => void` | The worklet to be executed. |\n| `bufferLength` | `number` | The size of the buffer that will be passed to the worklet on each call. |\n| `inputChannelCount` | `number` | The number of channels that the node expects as input (it will get min(expected, provided)). |\n| `workletRuntime` | `AudioWorkletRuntime` | The kind of runtime to use for the worklet. See [worklet runtimes](/docs/worklets/worklets-introduction#what-kind-of-worklets-are-used-in-react-native-audio-api) for details. |\n\n#### Errors\n\n| Error type | Description |\n| :---: | :---- |\n| `Error` | `react-native-worklet` is not found as dependency. |\n| `NotSupportedError` | `bufferLength` < 1. |\n| `NotSupportedError` | `inputChannelCount` is not in range [1, 32]. |\n\n#### Returns `WorkletNode`.\n\n### `createWorkletSourceNode` <MobileOnly />\n\nCreates [`WorkletSourceNode`](/docs/worklets/worklet-source-node).\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `worklet` | `(Array<Float32Array>, number, number, number) => void` | The worklet to be executed. |\n| `workletRuntime` | `AudioWorkletRuntime` | The kind of runtime to use for the worklet. See [worklet runtimes](/docs/worklets/worklets-introduction#what-kind-of-worklets-are-used-in-react-native-audio-api) for details. |\n\n#### Errors\n\n| Error type | Description |\n| :---: | :---- |\n| `Error` | `react-native-worklet` is not found as dependency. |\n\n#### Returns `WorkletSourceNode`.\n\n### `createWorkletProcessingNode` <MobileOnly />\n\nCreates [`WorkletProcessingNode`](/docs/worklets/worklet-processing-node).\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `worklet` | `(Array<Float32Array>, Array<Float32Array>, number, number) => void` | The worklet to be executed. |\n| `workletRuntime` | `AudioWorkletRuntime` | The kind of runtime to use for the worklet. See [worklet runtimes](/docs/worklets/worklets-introduction#what-kind-of-worklets-are-used-in-react-native-audio-api) for details. |\n\n#### Errors\n\n| Error type | Description |\n| :---: | :---- |\n| `Error` | `react-native-worklet` is not found as dependency. |\n\n#### Returns `WorkletProcessingNode`.\n\n### `decodeAudioData`\n\nDecodes audio data from either a file path or an ArrayBuffer. The optional `sampleRate` parameter lets you resample the decoded audio.\nIf not provided, the audio will be automatically resampled to match the audio context's `sampleRate`.\n\n**For the list of supported formats visit [this page](/docs/utils/decoding).**\n\n<table>\n  <thead>\n    <tr>\n      <th align=\"center\">Parameter</th>\n      <th align=\"center\">Type</th>\n      <th align=\"center\">Description</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td rowspan=\"3\" align=\"center\"><code>input</code></td>\n      <td align=\"center\"><code>ArrayBuffer</code></td>\n      <td align=\"center\">ArrayBuffer with audio data.</td>\n    </tr>\n    <tr>\n      <td align=\"center\"><code>string</code></td>\n      <td align=\"center\">Path to remote or local audio file.</td>\n    </tr>\n    <tr>\n      <td align=\"center\"><code>number</code></td>\n      <td align=\"center\">Asset module id. <MobileOnly/> </td>\n    </tr>\n    <tr>\n      <td align=\"center\"><code>fetchOptions</code><Optional /></td>\n      <td align=\"center\"><code>[RequestInit](https://github.com/facebook/react-native/blob/ac06f3bdc76a9fd7c65ab899e82bff5cad9b94b6/packages/react-native/src/types/globals.d.ts#L265)</code></td>\n      <td align=\"center\">Additional headers parameters when passing url to fetch.</td>\n    </tr>\n  </tbody>\n</table>\n\n#### Returns `Promise<AudioBuffer>`.\n\n<details>\n<summary>Example decoding</summary>\n```tsx\nconst url = ... // url to an audio\n\nconst buffer = await audioContext.decodeAudioData(url);\n```\n</details>\n\n### `decodePCMInBase64`\n\nDecodes base64-encoded PCM audio data.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `base64String` | `string` | Base64-encoded PCM audio data. |\n| `inputSampleRate` | `number` | Sample rate of the input PCM data. |\n| `inputChannelCount` | `number` | Number of channels in the input PCM data. |\n| `isInterleaved` <Optional />| `boolean` | Whether the PCM data is interleaved. Default is `true`. |\n\n#### Returns `Promise<AudioBuffer>`\n\n<details>\n<summary>Example decoding with data in base64 format </summary>\n```tsx\nconst data = ... // data encoded in base64 string\n// data is not interleaved (Channel1, Channel1, ..., Channel2, Channel2, ...)\nconst buffer = await this.audioContext.decodeAudioData(data, 4800, 2, false);\n```\n</details>\n\n## Remarks\n\n#### `currentTime`\n\n- Timer starts when context is created, stops when context is suspended.\n\n### `ContextState`\n\n\n**Acceptable values:**\n- `suspended`\n\nThe audio context has been suspended (with one of [`suspend`](/docs/core/audio-context#suspend) or [`OfflineAudioContext.suspend`](/docs/core/offline-audio-context#suspend)).\n\n- `running`\n\nThe audio context is running normally.\n\n- `closed`\n\nThe audio context has been closed (with [`close`](/docs/core/audio-context#close) method).\n\n"
  },
  {
    "path": "packages/audiodocs/docs/core/offline-audio-context.mdx",
    "content": "---\nsidebar_position: 5\n---\n\n# OfflineAudioContext\n\nThe `OfflineAudioContext` interface inherits from [`BaseAudioContext`](/docs/core/base-audio-context).\nIn contrast with a standard [`AudioContext`](/docs/core/audio-context), it doesn't render audio to the device hardware.\nInstead, it processes the audio as quickly as possible and outputs the result to an [`AudioBuffer`](/docs/sources/audio-buffer).\n\n\n## Constructor\n`OfflineAudioContext(options: OfflineAudioContextOptions)`\n\n```typescript\ninterface OfflineAudioContextOptions {\n  numberOfChannels: number;\n  length: number; // The length of the rendered AudioBuffer, in sample-frames\n  sampleRate: number;\n}\n```\n\n## Properties\n\n`OfflineAudioContext` does not define any additional properties.\nIt inherits all properties from [`BaseAudioContext`](/docs/core/base-audio-context#properties).\n\n## Methods\n\nIt inherits all methods from [`BaseAudioContext`](/docs/core/base-audio-context#methods).\n\n### `suspend`\n\nSchedules a suspension of the time progression in audio context at the specified time.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `suspendTime` | `number` | A floating-point number specifying the suspend time, in seconds. |\n\n#### Returns `Promise<undefined>`.\n\n### `resume`\n\nResume time progression in audio context when it has been suspended.\n\n#### Returns `Promise<undefined>`\n\n### `startRendering`\nStarts rendering the audio, taking into account the current connections and the current scheduled changes.\n\n#### Returns `Promise<AudioBuffer>`.\n"
  },
  {
    "path": "packages/audiodocs/docs/destinations/_category_.json",
    "content": "{\n  \"label\": \"Destinations\",\n  \"position\": 8,\n  \"link\": {\n    \"type\": \"generated-index\"\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/docs/destinations/audio-destination-node.mdx",
    "content": "---\nsidebar_position: 1\n---\n\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\n\n# AudioDestinationNode\n\nThe `AudioDestinationNode` interface represents the final destination of an audio graph, where all processed audio is ultimately directed.\n\nIn most cases, this means the sound is sent to the system’s default output device, such as speakers or headphones.\nWhen used with an [`OfflineAudioContext`](/docs/core/offline-audio-context) the rendered audio isn’t played back immediately—instead,\nit is stored in an [`AudioBuffer`](/docs/sources/audio-buffer).\n\nEach `AudioContext` has exactly one AudioDestinationNode, which can be accessed through its\n[`AudioContext.destination`](/docs/core/base-audio-context/#properties) property.\n\n\n## Properties\n\n`AudioDestinationNode` does not define any additional properties.\nIt inherits all properties from [`AudioNode`](/docs/core/audio-node), listed above.\n\n<AudioNodePropsTable numberOfInputs={1} numberOfOutputs={0} channelCount={2} channelCountMode=\"explicit\" channelInterpretation=\"speakers\" />\n\n## Methods\n\n`AudioDestinationNode` does not define any additional methods.\nIt inherits all methods from [`AudioNode`](/docs/core/audio-node).\n\n"
  },
  {
    "path": "packages/audiodocs/docs/effects/_category_.json",
    "content": "{\n  \"label\": \"Effects\",\n  \"position\": 5,\n  \"link\": {\n    \"type\": \"generated-index\"\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/docs/effects/biquad-filter-node.mdx",
    "content": "---\nsidebar_position: 1\n---\n\nimport { Optional, ReadOnly } from '@site/src/components/Badges';\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\nimport FrequencyResponseGraph from '@site/src/examples/Biquad/FrequencyResponseGraph';\nimport VinylPlayer from '@site/src/examples/VinylPlayer';\n\n# BiquadFilterNode\n\n\nThe `BiquadFilterNode` interface represents a low-order filter. It is an [`AudioNode`](/docs/core/audio-node) used for tone controls, graphic equalizers, and other audio effects.\nMultiple `BiquadFilterNode` instances can be combined to create more complex filtering chains.\n\n<VinylPlayer />\n\n## Constructor\n\n```tsx\nconstructor(context: BaseAudioContext, options?: BiquadFilterOptions)\n```\n\n### `BiquadFilterOptions`\n\nInherits all properties from [`AudioNodeOptions`](/docs/core/audio-node#audionodeoptions)\n\n| Parameter | Type | Default | |\n| :---: | :---: | :----: | :---- |\n| `Q` <Optional /> | `number` | 1 | Initial value for [`Q`](/docs/effects/biquad-filter-node#properties) |\n| `detune` <Optional /> | `number` | 0 | Initial value for [`detune`](/docs/effects/biquad-filter-node#properties) |\n| `frequency` <Optional /> | `number` | 350 | Initial value for [`frequency`](/docs/effects/biquad-filter-node#properties) |\n| `gain` <Optional /> | `number` | 0 | Initial value for [`gain`](/docs/effects/biquad-filter-node#properties) |\n| `type` <Optional /> | `BiquadFilterType` | `lowpass` | Initial value for [`type`](/docs/effects/biquad-filter-node#properties) |\n\nOr by using `BaseAudioContext` factory method:\n[`BaseAudioContext.createBiquadFilter()`](/docs/core/base-audio-context#createbiquadfilter) that creates node with default values.\n\n## Properties\n\nIt inherits all properties from [`AudioNode`](/docs/core/audio-node#properties).\n\n<AudioNodePropsTable numberOfInputs={1} numberOfOutputs={1} channelCount={2} channelCountMode=\"max\" channelInterpretation=\"speakers\" />\n\n| Name | Type |  Rate  | Description |\n| :--: | :--: | :----------: | :-- |\n| `Q` | [`AudioParam`](/docs/core/audio-param) | [`k‑rate`](/docs/core/audio-param#a-rate-vs-k-rate) | The filter’s Q factor (quality factor). |\n| `detune` | [`AudioParam`](/docs/core/audio-param) | [`k‑rate`](/docs/core/audio-param#a-rate-vs-k-rate) | Amount by which the frequency is detuned in cents. |\n| `frequency` | [`AudioParam`](/docs/core/audio-param) | [`k‑rate`](/docs/core/audio-param#a-rate-vs-k-rate) | The filter’s cutoff or center frequency in hertz (Hz). |\n| `gain` | [`AudioParam`](/docs/core/audio-param) | [`k‑rate`](/docs/core/audio-param#a-rate-vs-k-rate) | Gain applied by specific filter types, in decibels (dB). |\n| `type` | [`BiquadFilterType`](#biquadfiltertype-enumeration-description) |   | Defines the kind of filtering algorithm the node applies (e.g. \"lowpass\", \"highpass\"). |\n\n<br />\n\n<br />\n\n<br />\n\n#### BiquadFilterType enumeration description\n\n<FrequencyResponseGraph />\n\n<br />\n\n<br />\n\n| `type` | Description | `frequency` | `Q` | `gain` |\n|:------:|:-----------:|:-----------:|:---:|:------:|\n| `lowpass` | Second-order resonant lowpass filter with 12dB/octave rolloff. Frequencies below the cutoff pass through; higher frequencies are attenuated. | The cutoff frequency. | Determines how peaked the frequency is around the cutoff. Higher values result in a sharper peak. | Not used |\n| `highpass` | Second-order resonant highpass filter with 12dB/octave rolloff. Frequencies above the cutoff pass through; lower frequencies are attenuated. | The cutoff frequency. | Determines how peaked the frequency is around the cutoff. Higher values result in a sharper peak.  | Not used |\n| `bandpass` | Second-order bandpass filter. Frequencies within a given range pass through; others are attenuated. | The center of the frequency band. | Controls the bandwidth. Higher values result in a narrower band. | Not used |\n| `lowshelf` | Second-order lowshelf filter. Frequencies below the cutoff are boosted or attenuated; others remain unchanged. | The upper limit of the frequencies where the boost (or attenuation) is applied. | Not used | The boost (in dB) to be applied. Negative values attenuate the frequencies.|\n| `highshelf` | Second-order highshelf filter. Frequencies above the cutoff are boosted or attenuated; others remain unchanged. | The lower limit of the frequencies where the boost (or attenuation) is applied. | Not used | The boost (in dB) to be applied. Negative values attenuate the frequencies. |\n| `peaking` | Frequencies around a center frequency are boosted or attenuated; others remain unchanged. | The center of the frequency range where the boost (or an attenuation) is applied. | Controls the bandwidth. Higher values result in a narrower band. | The boost (in dB) to be applied. Negative values attenuate the frequencies. |\n| `notch` | Notch (band-stop) filter. Opposite of a bandpass filter: frequencies around the center are attenuated; others remain unchanged. | The center of the frequency range where the notch is applied. | Controls the bandwidth. Higher values result in a narrower band. | Not used |\n| `allpass` | Second-order allpass filter. All frequencies pass through, but changes the phase relationship between the various frequencies. | The frequency where the center of the phase transition occurs (maximum group delay). | Controls how sharp the phase transition is at the center frequency. Higher values result in a sharper transition and a larger group delay. | Not used |\n\nNote: The detune parameter behaves the same way for all filter types, so it is not included above\n\n\n## Methods\n\nIt inherits all methods from [`AudioNode`](/docs/core/audio-node#methods).\n\n### `getFrequencyResponse`\n\n| Parameter | Type | Description |\n| :--------: | :--: | :---------- |\n| `frequencyArray` | `Float32Array` | Array of frequencies (in Hz), which you want to filter. |\n| `magResponseOutput` | `Float32Array` | Output array to store the computed linear magnitude values for each frequency. For frequencies outside the range [0, $\\frac{sampleRate}{2}$], the corresponding results are NaN. |\n| `phaseResponseOutput` | `Float32Array` | Output array to store the computed phase response values (in radians) for each frequency. For frequencies outside the range [0, $\\frac{sampleRate}{2}$], the corresponding results are NaN. |\n\n#### Returns `undefined`.\n\n## Remarks\n\n#### `frequency`\n- Range: [10, $\\frac{sampleRate}{2}$].\n\n#### `Q`\n- Range:\n  - For `lowpass` and `highpass` is [-Q, Q], where Q is the largest value for which $10^{Q/20}$ does not overflow the single-precision floating-point representation.\nNumerically: Q ≈ 770.63678.\n  - For `bandpass`, `notch`, `allpass`, and `peaking`: Q is related to the filter’s bandwidth and should be positive.\n  - Not used for `lowshelf` and `highshelf`.\n\n#### `gain`\n- Range: [-40, 40].\n- Positive values correspond to amplification; negative to attenuation.\n"
  },
  {
    "path": "packages/audiodocs/docs/effects/convolver-node.mdx",
    "content": "---\nsidebar_position: 2\n---\n\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\nimport { Optional } from '@site/src/components/Badges';\n\n# ConvolverNode\n\nThe `ConvolverNode` interface represents a linear convolution effect, that can be applied to a signal given an impulse response.\nThis is the easiest way to achieve `echo` or [`reverb`](https://en.wikipedia.org/wiki/Reverb_effect) effects.\n\n\n:::info\nConvolver is a node with tail-time, which means, that it continues to output non-silent audio with zero input for the length of the buffer.\n:::\n\n## Constructor\n\n```tsx\nconstructor(context: BaseAudioContext, options?: ConvolverOptions)\n```\n\n### `ConvolverOptions`\n\nInherits all properties from [`AudioNodeOptions`](/docs/core/audio-node#audionodeoptions)\n\n| Parameter | Type | Default | |\n| :---: | :---: | :----: | :---- |\n| `buffer` <Optional /> | `number` |  | Initial value for [`buffer`](/docs/effects/convolver-node#properties). |\n| `normalize` <Optional /> | `boolean` | true | Initial value for [`normalize`](/docs/effects/convolver-node#properties). |\n\nOr by using `BaseAudioContext` factory method:\n[`BaseAudioContext.createConvolver()`](/docs/core/base-audio-context#createconvolver)\n\n## Properties\n\nIt inherits all properties from [`AudioNode`](/docs/core/audio-node#properties).\n\n<AudioNodePropsTable numberOfInputs={1} numberOfOutputs={1} channelCount={2} channelCountMode=\"clamped-max\" channelInterpretation=\"speakers\" />\n\n| Name | Type | Description |\n| :----: | :----: | :-------- |\n| `buffer` | [`AudioBuffer`](/docs/sources/audio-buffer) | Associated AudioBuffer. |\n| `normalize` | `boolean` | Whether the impulse response from the buffer will be scaled by an equal-power normalization when the buffer attribute is set. |\n\n:::caution\nLinear convolution is a heavy computational process, so if your audio has some weird artefacts that should not be there, try to decrease the duration of impulse response buffer.\n:::\n"
  },
  {
    "path": "packages/audiodocs/docs/effects/delay-node.mdx",
    "content": "---\nsidebar_position: 5\n---\n\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\nimport { ReadOnly } from '@site/src/components/Badges';\n\n# DelayNode\n\nThe `DelayNode` interface represents the latency of the audio signal by given time. It is an [`AudioNode`](/docs/core/audio-node) that applies time shift to incoming signal f.e.\nif `delayTime` value is 0.5, it means that audio will be played after 0.5 seconds.\n\n:::info\nDelay is a node with tail-time, which means, that it continues to output non-silent audio with zero input for the duration of `delayTime`.\n:::\n\n## Constructor\n\n[`BaseAudioContext.createDelay(maxDelayTime?: number)`](/docs/core/base-audio-context#createdelay)\n\n## Properties\n\nIt inherits all properties from [`AudioNode`](/docs/core/audio-node#properties).\n\n<AudioNodePropsTable numberOfInputs={1} numberOfOutputs={1} channelCount={2} channelCountMode=\"max\" channelInterpretation=\"speakers\" />\n\n| Name | Type | Description |\n| :----: | :----: | :-------- |\n| `delayTime`| <ReadOnly /> [`AudioParam`](/docs/core/audio-param) | [`k-rate`](/docs/core/audio-param#a-rate-vs-k-rate) `AudioParam` representing value of time shift to apply. |\n\n:::warning\nIn web audio api specs `delayTime` is an `a-rate` param.\n:::\n\n## Methods\n\n`DelayNode` does not define any additional methods.\nIt inherits all methods from [`AudioNode`](/docs/core/audio-node#methods).\n\n## Remarks\n\n#### `maxDelayTime`\n- Default value is 1.0.\n- Nominal range is 0 - 180.\n\n#### `delayTime`\n- Default value is 0.\n- Nominal range is 0 - `maxDelayTime`.\n"
  },
  {
    "path": "packages/audiodocs/docs/effects/gain-node.mdx",
    "content": "---\nsidebar_position: 3\n---\n\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\nimport { Optional, ReadOnly } from '@site/src/components/Badges';\n\n# GainNode\n\nThe `GainNode` interface represents a change in volume (amplitude) of the audio signal. It is an [`AudioNode`](/docs/core/audio-node) with a single `gain` [`AudioParam`](/docs/core/audio-param) that multiplies every sample passing through it.\n\n:::tip\nDirect, immediate gain changes often cause audible clicks. Use the scheduling methods of [`AudioParam`](/docs/core/audio-param) (e.g. `linearRampToValueAtTime`, `exponentialRampToValueAtTime`) to smoothly interpolate volume transitions.\n:::\n\n## Constructor\n\n```tsx\nconstructor(context: BaseAudioContext, options?: GainOptions)\n```\n\n### `GainOptions`\n\nInherits all properties from [`AudioNodeOptions`](/docs/core/audio-node#audionodeoptions)\n\n| Parameter | Type | Default | |\n| :---: | :---: | :----: | :---- |\n| `gain` <Optional /> | `number` | `1.0` | Initial value for [`gain`](/docs/effects/gain-node#properties) |\n\nYou can also create a `GainNode` via the [`BaseAudioContext.createGain()`](/docs/core/base-audio-context#creategain) factory method, which uses default values.\n\n## Properties\n\nIt inherits all properties from [`AudioNode`](/docs/core/audio-node#properties).\n\n<AudioNodePropsTable numberOfInputs={1} numberOfOutputs={1} channelCount={2} channelCountMode=\"max\" channelInterpretation=\"speakers\" />\n\n| Name | Type | Description | |\n| :----: | :----: | :-------- | :-: |\n| `gain` | [`AudioParam`](/docs/core/audio-param) | [`a-rate`](/docs/core/audio-param#a-rate-vs-k-rate) `AudioParam` representing the gain value to apply. | <ReadOnly /> |\n\n## Methods\n\n`GainNode` does not define any additional methods.\nIt inherits all methods from [`AudioNode`](/docs/core/audio-node#methods).\n\n## Usage\n\nA common use case is controlling the master volume of an audio graph:\n\n```tsx\nconst audioContext = new AudioContext();\nconst gainNode = audioContext.createGain();\n\n// Set volume to 50%\ngainNode.gain.setValueAtTime(0.5, audioContext.currentTime);\n\n// Connect source → gain → output\nsource.connect(gainNode);\ngainNode.connect(audioContext.destination);\n```\n\nTo fade in a sound over 2 seconds:\n\n```tsx\ngainNode.gain.setValueAtTime(0, audioContext.currentTime);\ngainNode.gain.linearRampToValueAtTime(1, audioContext.currentTime + 2);\n```\n\n## Remarks\n\n#### `gain`\n- Nominal range is -∞ to ∞.\n- Values greater than `1.0` amplify the signal; values between `0` and `1.0` attenuate it.\n- A value of `0` silences the signal. Negative values invert the signal phase.\n\n## Advanced usage — Envelope (ADSR)\n\n`GainNode` is the key building block for implementing sound envelopes. For a practical, step-by-step walkthrough of ADSR envelopes and how to apply them in a real app, see the [Making a piano keyboard](/docs/guides/making-a-piano-keyboard#envelopes-%EF%B8%8F) guide.\n"
  },
  {
    "path": "packages/audiodocs/docs/effects/iir-filter-node.mdx",
    "content": "---\nsidebar_position: 4\n---\n\n# IIRFilterNode\n\nThe `IIRFilterNode` interface represents a general infinite impulse response (IIR) filter.\nIt is an [`AudioNode`](/docs/core/audio-node) used for tone controls, graphic equalizers, and other audio effects.\n`IIRFilterNode` lets the parameters of the filter response be specified, so that it can be tuned as needed.\n\nIn general, it is recommended to use [`BiquadFilterNode`](/docs/effects/biquad-filter-node) for implementing higher-order filters,\nas it is less sensitive to numeric issues and its parameters can be automated. You can create all even-order IIR filters with `BiquadFilterNode`,\nbut if odd-ordered filters are needed or automation is not needed, then `IIRFilterNode` may be appropriate.\n\n\n## Constructor\n\n[`BaseAudioContext.createIIRFilter(options: IIRFilterNodeOptions)`](/docs/core/base-audio-context#createiirfilter)\n\n```jsx\ninterface IIRFilterNodeOptions {\n  feedforward: number[]; // array of floating-point values specifying the feedforward (numerator) coefficients\n  feedback: number[]; // array of floating-point values specifying the feedback (denominator) coefficients\n}\n```\n\n#### Errors\n\n| Error type | Description |\n| :---: | :---- |\n| `NotSupportedError` | One or both of the input arrays exceeds 20 members. |\n| `InvalidStateError` | All of the feedforward coefficients are 0, or the first feedback coefficient is 0. |\n\n## Properties\nIt inherits all properties from [`AudioNode`](/docs/core/audio-node#properties).\n\n## Methods\nIt inherits all methods from [`AudioNode`](/docs/core/audio-node#methods).\n\n### `getFrequencyResponse`\n\n| Parameter | Type | Description |\n| :--------: | :--: | :---------- |\n| `frequencyArray` | `Float32Array` | Array of frequencies (in Hz), which you want to filter. |\n| `magResponseOutput` | `Float32Array` | Output array to store the computed linear magnitude values for each frequency. For frequencies outside the range [0, $\\frac{sampleRate}{2}$], the corresponding results are NaN. |\n| `phaseResponseOutput` | `Float32Array` | Output array to store the computed phase response values (in radians) for each frequency. For frequencies outside the range [0, $\\frac{sampleRate}{2}$], the corresponding results are NaN. |\n\n#### Returns `undefined`.\n"
  },
  {
    "path": "packages/audiodocs/docs/effects/periodic-wave.mdx",
    "content": "---\nsidebar_position: 5\n---\n\nimport { Optional } from '@site/src/components/Badges';\n\n# PeriodicWave\n\nThe `PeriodicWave` interface defines a periodic waveform that can be used to shape the output of an OscillatorNode.\n\n## Constructor\n\n```tsx\nconstructor(context: BaseAudioContext, options: PeriodicWaveOptions)\n```\n\n### `PeriodicWaveOptions`\n\n| Parameter | Type | Default | Description |\n| :---: | :---: | :----: | :---- |\n| `real` <Optional /> | `Float32Array` | - | [Cosine terms](/docs/core/base-audio-context#createperiodicwave) |\n| `imag` <Optional /> | `Float32Array` | - | [Sine terms](/docs/core/base-audio-context#createperiodicwave) |\n| `disableNormalization` | `boolean` | false | Whether the periodic wave is [normalized](/docs/core/base-audio-context#createperiodicwave) or not. |\n\nOr by using `BaseAudioContext` factory method:\n[`BaseAudioContext.createPeriodicWave(real, imag, constraints?: PeriodicWaveConstraints)`](/docs/core/base-audio-context#createperiodicwave)\n\n## Properties\nNone. `PeriodicWave` has no own or inherited properties.\n\n## Methods\nNone. `PeriodicWave` has no own or inherited methods.\n\n## Remarks\n\n#### `real` and `imag`\n- if only one is specified, the other one is treated as array of 0s of the same length\n- if neither is given values are equivalent to the sine wave\n- if both given, they have to have the same length\n- to see how values corresponds to the output wave [see](https://webaudio.github.io/web-audio-api/#waveform-generation) for more information\n"
  },
  {
    "path": "packages/audiodocs/docs/effects/stereo-panner-node.mdx",
    "content": "---\nsidebar_position: 6\n---\n\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\nimport { Optional, ReadOnly } from '@site/src/components/Badges';\n\n# StereoPannerNode\n\nThe `StereoPannerNode` interface represents the change in ratio between two output channels (f. e. left and right speaker).\n\n## Constructor\n\n```tsx\nconstructor(context: BaseAudioContext, stereoPannerOptions?: StereoPannerOptions)\n```\n\n### `StereoPannerOptions`\n\nInherits all properties from [`AudioNodeOptions`](/docs/core/audio-node#audionodeoptions)\n\n| Parameter | Type | Default | Description |\n| :---: | :---: | :----: | :---- |\n| `pan` <Optional /> | `number` | - | Number representing pan value |\n\nOr by using `BaseAudioContext` factory method:\n[`BaseAudioContext.createStereoPanner()`](/docs/core/base-audio-context#createstereopanner)\n\n## Properties\n\nIt inherits all properties from [`AudioNode`](/docs/core/audio-node#properties).\n\n<AudioNodePropsTable numberOfInputs={1} numberOfOutputs={1} channelCount={2} channelCountMode=\"clamped-max\" channelInterpretation=\"speakers\" />\n\n| Name | Type | Description |\n| :--: | :--: | :---------- |\n| `pan` | [`AudioParam`](/docs/core/audio-param) | [`a-rate`](/docs/core/audio-param#a-rate-vs-k-rate) `AudioParam` representing how the audio signal is distributed between the left and right channels. |\n\n## Methods\n\n`StereoPannerNode` does not define any additional methods.\nIt inherits all methods from [`AudioNode`](/docs/core/audio-node#methods).\n\n## Remarks\n\n#### `pan`\n- Default value is 0\n- Nominal range is -1 (only left channel) to 1 (only right channel).\n"
  },
  {
    "path": "packages/audiodocs/docs/effects/wave-shaper-node.mdx",
    "content": "---\nsidebar_position: 6\n---\n\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\nimport { ReadOnly, Optional } from '@site/src/components/Badges';\n\n# WaveShaperNode\n\nThe `WaveShaperNode` interface represents non-linear signal distortion effects.\nNon-linear distortion is commonly used for both subtle non-linear warming, or more obvious distortion effects.\n\n\n## Constructor\n\n```tsx\nconstructor(context: BaseAudioContext, waveShaperOptions?: WaveShaperOptions)\n```\n\n### `WaveShaperOptions`\n\nInherits all properties from [`AudioNodeOptions`](/docs/core/audio-node#audionodeoptions)\n\n| Parameter | Type | Default | Description |\n| :---: | :---: | :----: | :---- |\n| `curve` <Optional /> | `Float32Array` | - | Array representing curve values |\n| `oversample` <Optional /> | [`OverSampleType`](/docs/effects/wave-shaper-node#oversampletype) | - | Value representing oversample property |\n\nOr by using `BaseAudioContext` factory method:\n[`BaseAudioContext.createStereoPanner()`](/docs/core/base-audio-context#createwaveshaper)\n\n## Properties\n\nIt inherits all properties from [`AudioNode`](/docs/core/audio-node#properties).\n\n<AudioNodePropsTable numberOfInputs={1} numberOfOutputs={1} channelCount={2} channelCountMode=\"clamped-max\" channelInterpretation=\"speakers\" />\n\n| Name | Type | Description |\n| :--: | :--: | :---------- |\n| `curve` | `Float32Array \\| null` |  The shaping curve used for waveshaping effect. |\n| `oversample` | [`OverSampleType`](/docs/effects/wave-shaper-node#oversampletype) |  Specifies what type of oversampling should be used when applying shaping curve. |\n\n## Methods\n\n`WaveShaperNode` does not define any additional methods.\nIt inherits all methods from [`AudioNode`](/docs/core/audio-node#methods).\n\n## Remarks\n\n#### `curve`\n- Default value is null\n- Contains at least two values.\n- Subsequent modifications of curve have no effects. To change the curve, assign a new Float32Array object to this property.\n\n#### `oversample`\n- Default value `none`\n- Value of `2x` or `4x` can increases quality of the effect, but in some cases it is better not to use oversampling for very accurate shaping curve.\n\n### `OverSampleType`\n\n<details>\n<summary>Type definitions</summary>\n\n```typescript\n// Do not oversample | Oversample two times | Oversample four times\ntype OverSampleType = 'none' | '2x' | '4x';\n```\n\n</details>\n\n"
  },
  {
    "path": "packages/audiodocs/docs/experimental/_category_.json",
    "content": "{\n  \"label\": \"Experimental\",\n  \"position\": 10,\n  \"link\": {\n    \"type\": \"generated-index\"\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/docs/experimental/audio-tag.mdx",
    "content": "---\nsidebar_position: 1\n---\n\nimport { Experimental } from '@site/src/components/Badges';\n\n# Audio tag (`<Audio>`)\n\n<Experimental />\n\nReact component that mimics web `<Audio>` behavior.\n\n:::caution\nThis API lives under `react-native-audio-api/development/react` and is **experimental**: behavior and props may change.\n:::\n\n## Usage\n\n```tsx\nimport React, { useRef } from 'react';\nimport { View } from 'react-native';\nimport { Audio, AudioTagHandle } from 'react-native-audio-api/development/react';\n\nconst DEMO_URL = 'https://example.com/audio.mp3';\n\nexport function Player() {\n  const ref = useRef<AudioTagHandle>(null);\n\n  return (\n    <View style={{ flex: 1 }}>\n      <Audio\n        ref={ref}\n        source={DEMO_URL}\n        controls\n        onLoad={() => console.log('ready')}\n        onError={(e) => console.error(e)}\n        onPositionChange={(seconds) => {}}\n      />\n    </View>\n  );\n}\n```\n\n## Props (`AudioProps`)\n\nOnly **required** field is a `source`. Callbacks default to no-ops if omitted.\n\n| Name | Type | Default | Description |\n| :--- | :--- | :--- | :--- |\n| `source` | `AudioSource` | — | Asset id (`require(...)`), string URI/path, or `{ uri?, headers? }` for HTTP(S). |\n| `context` | `BaseAudioContext` | — | Optional. Native: implicit [`AudioContext`](/docs/core/audio-context) when omitted. Web: unused for HTML element playback. |\n| `autoPlay` | `boolean` | `false` | Start playback after load. |\n| `controls` | `boolean` | `false` | When `true`, renders default [`AudioControls`](#audiocontrols) above `children`. |\n| `loop` | `boolean` | `false` | Loop playback. |\n| `muted` | `boolean` | `false` | Muted state. |\n| `volume` | `number` | `1` | Linear volume passed to the underlying source. |\n| `preload` | `PreloadType` | `'auto'` | *Web support only* |\n| `playbackRate` | `number` | `1` | *Web support only*  |\n| `preservesPitch` | `boolean` | `true` | *Web support only* |\n| `onLoadStart` | `() => void` | no-op | Load started. |\n| `onLoad` | `() => void` | no-op | Source decoded / graph attached. |\n| `onError` | `(error: Error) => void` | no-op | Network, decode, or unsupported format (e.g. missing FFmpeg) errors. |\n| `onPositionChange` | `(seconds: number) => void` | no-op | Playback position updates while playing. |\n| `onEnded` | `() => void` | no-op | Natural end of playback (also used internally when looping restarts). |\n| `onPlay` | `() => void` | no-op | After `play()`. |\n| `onPause` | `() => void` | no-op | After `pause()`. |\n| `onVolumeChange` | `(volume: number) => void` | no-op | When effective volume changes. |\n\n### `AudioSource`\n\n- `string` — URI or path (`http(s):`, `file://`, or platform-specific asset path).\n- `number` — Result of `require('./file.mp3')` (bundled asset).\n- `AudioURISource` — `{ uri?: string; headers?: Record<string, string> }` for fetch with custom headers.\n\n## Ref handle (`AudioTagHandle`) methods\n\n### `play`\n\nStart or resume playback.\n\n### `pause`\n\nPause playback.\n\n### `seekToTime`\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| seconds | `number` | Seek to a time in seconds (clamped to duration when known). |\n\n### `setVolume`\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| volume | `number` | Updates volume state . |\n\n### `setMuted`\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| muted | `boolean` | Updates muted state . |\n\n## `useAudioTagContext`\n\n<details>\n<summary>Types</summary>\n```typescript\ntype AudioComponentContextType = {\n  play: () => void;\n  pause: () => void;\n  seekToTime: (seconds: number) => void;\n  setVolume: (volume: number) => void;\n  setMuted: (muted: boolean) => void;\n\n  ready: boolean;\n  volume: number;\n  muted: boolean;\n  playbackState: AudioTagPlaybackState;\n  currentTime: number;\n  duration: number;\n  autoPlay: boolean;\n  loop: boolean;\n  preload: PreloadType;\n  playbackRate: number;\n  preservesPitch: boolean;\n  audioContext: BaseAudioContext | null;\n};\n```\n</details>\n<br />\n\nUseful for creating your custom UI component. Must be used under `<Audio>`. Throws an `Error` if used outside the provider.\n\n```tsx\nimport React from 'react';\nimport { Button } from 'react-native';\n\nconst AudioControls: React.FC = () => {\n  const {\n    play,\n    pause,\n    seekToTime,\n  } = useAudioTagContext();\n\n  return (\n    <>\n      <Button onPress={() => play()}>Play</Button>\n      <Button onPress={() => pause()}>Pause</Button>\n      <Button onPress={() => seekToTime(10)}>Seek to 10</Button>\n    </>\n  );\n}\n\nconst MyAudioTagWrapper : React.FC = () => {\n  const URL = ...;\n\n  return (\n    <Audio source={URL}>\n      <AudioControls />\n    </Audio>\n  );\n}\n```\n\n## Remarks\n\n- **FFmpeg:** Some formats require a build with FFmpeg; otherwise `createFileSource` may fail and `onError` receives a `NotSupportedError`.\n"
  },
  {
    "path": "packages/audiodocs/docs/fundamentals/_category_.json",
    "content": "{\n  \"label\": \"Fundamentals\",\n  \"position\": 1,\n  \"link\": {\n    \"type\": \"generated-index\"\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/docs/fundamentals/best-practices.mdx",
    "content": "---\nsidebar_position: 3\n---\n\n# Best Practices\n\nWhen working with audio in a web or mobile application, following best practices ensures optimal performance,\nuser experience, and maintainability. Here are some key best practices to consider when using the React Native Audio API:\n\n## [**AudioContext**](/docs/core/audio-context) Management\n\n- **Single Audio Context**: Create one instance of `AudioContext` in order to easily and efficiently manage the audio layer's state in your application.\n  Creating many instances could lead to undefined behavior. Same of them could still be in [`running`](/docs/core/base-audio-context#contextstate) state while others could be\n  [`suspended`](/docs/core/base-audio-context#contextstate) or [`closed`](/docs/core/base-audio-context#contextstate), if you do not manage them by yourself.\n\n- **Clean up**: Always close the `AudioContext` using the [`close()`](/docs/core/audio-context#close) method when it is no longer needed.\n  This releases system audio resources and prevents memory leaks.\n\n- **Suspend when not in use**: Suspend the `AudioContext` when audio is not needed to save system resources and battery life, especially on mobile devices.\n  Running `AudioContext` is still playing silence even if there is no playing source node connected to the [`destination`](/docs/core/base-audio-context#properties).\n  Additionally, on iOS devices, the state of the `AudioContext` is directly related with state of the lock screen. If running `AudioContext` exists, it is impossible to set lock screen state to [`state_paused`](/docs/system/audio-manager#lockscreeninfo).\n\n## React hooks vs React Native Audio API\n\n- **Create singleton class to manage audio layer**: Instead of storing `AudioContext` or nodes directly in your React components using `useState` or `useRef`,\n  consider creating a singleton class that encapsulates the audio layer logic using React Native Audio API.\n  This class can manage the lifecycle of the `AudioContext`, handle audio nodes, and provide methods for playing, pausing, and stopping audio.\n  This approach promotes separation of concerns and makes it easier to manage audio state across your application.\n"
  },
  {
    "path": "packages/audiodocs/docs/fundamentals/getting-started.mdx",
    "content": "---\nsidebar_position: 2\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\n# Getting started\n\nThe goal of _Fundamentals_ is to guide you through the setup process of the Audio API, as well as to show the basic concepts behind audio programming using a web audio framework, giving you the confidence to explore more advanced use cases on your own. This section is packed with interactive examples, code snippets, and explanations. Are you ready? Let's make some noise!\n\n## Installation\n\nIt takes only a few steps to add Audio API to your project:\n\n### Step 1: Install the package\n\nInstall the `react-native-audio-api` package from npm:\n\n<Tabs groupId=\"package-managers\">\n  <TabItem value=\"expo\" label=\"EXPO\" default>\n    ```sh\n    npx expo install react-native-audio-api\n    ```\n  </TabItem>\n  <TabItem value=\"npm\" label=\"NPM\">\n    ```sh\n    npm install react-native-audio-api\n    ```\n  </TabItem>\n  <TabItem value=\"yarn\" label=\"YARN\">\n    ```sh\n    yarn add react-native-audio-api\n    ```\n  </TabItem>\n</Tabs>\n\n### Step 2: Add Audio API expo plugin (optional)\n\nAdd `react-native-audio-api` expo plugin to your `app.json` or `app.config.js`.\n\n<details>\n<summary>app.json</summary>\n```javascript\n{\n  \"plugins\": [\n    [\n      \"react-native-audio-api\",\n      {\n        \"iosBackgroundMode\": true,\n        \"iosMicrophonePermission\": \"This app requires access to the microphone to record audio.\",\n        \"androidPermissions\" : [\n          \"android.permission.MODIFY_AUDIO_SETTINGS\",\n          \"android.permission.FOREGROUND_SERVICE\",\n          \"android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK\"\n        ],\n        \"androidForegroundService\": true,\n        \"androidFSTypes\": [\n          \"mediaPlayback\"\n        ]\n      }\n    ]\n  ]\n}\n```\n</details>\n\n<br />\n\n<details>\n<summary>app.config.js</summary>\n```javascript\nexport default {\n  ...\n  \"plugins\": [\n    [\n      \"react-native-audio-api\",\n      {\n        \"iosBackgroundMode\": true,\n        \"iosMicrophonePermission\": \"This app requires access to the microphone to record audio.\",\n        \"androidPermissions\" : [\n          \"android.permission.MODIFY_AUDIO_SETTINGS\",\n          \"android.permission.FOREGROUND_SERVICE\",\n          \"android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK\"\n        ],\n        \"androidForegroundService\": true,\n        \"androidFSTypes\": [\n          \"mediaPlayback\"\n        ]\n      }\n    ]\n  ]\n};\n```\n</details>\n\n#### Special permissions\n\nIf you plan to use [`AudioRecorder`](/docs/inputs/audio-recorder) entry `iosMicrophonePermission` and `android.permission.RECORD_AUDIO` in `androidPermissions` section is **MANDATORY**.\n\n:::info\nIf your app is not managed by expo, see [non-expo-permissions page](/docs/other/non-expo-permissions) how to handle permissions.\n:::\n\nRead more about plugin [here](/docs/other/audio-api-plugin)!\n\n### Step 3: Install system-wide bash (only Windows OS)\n\nThere are many ways to do that f.e. using git bash. To make sure just test if any unix command works.\n```bash\nbash -c 'echo Hello World!'\n```\n\n### Possible additional dependencies\n\nIf you plan to use any of [`WorkletNode`](/docs/worklets/worklet-node), [`WorkletSourceNode`](/docs/worklets/worklet-source-node), [`WorkletProcessingNode`](/docs/worklets/worklet-processing-node), it is required to have\n`react-native-worklets` library set up with version <u>0.6.0</u> or higher. See [worklets getting-started page](https://docs.swmansion.com/react-native-worklets/docs/) for info how to do it.\n\n:::info\nIf you are not planning to use any of mentioned nodes, `react-native-worklets` dependency is **OPTIONAL** and your app will build successfully without them.\n:::\n\n### Usage with expo\n\n`react-native-audio-api` contains native custom code and isn't part of the Expo Go application. In order to be available in expo managed builds, you have to use Expo development build. Simplest way on starting local expo dev builds, is to use:\n\n<Tabs groupId=\"expoStart\">\n  <TabItem value=\"ios\" label=\"iOS\" default>\n    ```sh\n    npx expo run:ios\n    ```\n  </TabItem>\n  <TabItem value=\"android\" label=\"Android\">\n    ```sh\n    npx expo run:android\n    ```\n  </TabItem>\n</Tabs>\n\nTo learn more about expo development builds, please check out [Development Builds Documentation](https://docs.expo.dev/develop/development-builds/introduction/).\n\n#### Android\n\nNo further steps are necessary.\n\n#### iOS\n\nWhile developing for iOS, make sure to install [pods](https://cocoapods.org) first before running the app:\n\n```sh\ncd ios && pod install && cd ..\n```\n\n#### Web\n\nNo further steps are necessary.\n\n:::caution\n\n`react-native-audio-api` on the web exposes the browser's built-in Web Audio API, but for compatibility between platforms, it limits the available interfaces to APIs that are implemented on iOS and Android.\n\n:::\n\n### Clear Metro bundler cache (recommended)\n\n<Tabs groupId=\"package-managers\">\n  <TabItem value=\"expo\" label=\"EXPO\" default>\n    ```sh\n    npx expo start -c\n    ```\n  </TabItem>\n  <TabItem value=\"npm\" label=\"NPM\">\n    ```sh\n    npm start -- --reset-cache\n    ```\n  </TabItem>\n  <TabItem value=\"yarn\" label=\"YARN\">\n    ```sh\n    yarn start --reset-cache\n    ```\n  </TabItem>\n</Tabs>\n\n## What's next?\n\nIn [the next section](/docs/guides/lets-make-some-noise), we will learn how to prepare Audio API and to play some sound!.\n"
  },
  {
    "path": "packages/audiodocs/docs/fundamentals/introduction.mdx",
    "content": "---\nsidebar_position: 1\n---\n\n\n# Introduction\n\nReact Native Audio API is an imperative, high-level API for processing and synthesizing audio in React Native Applications. React Native Audio API follows the [Web Audio Specification](https://www.w3.org/TR/webaudio-1.1/) making it easier to write audio-heavy applications for iOS, Android and Web with just one codebase.\n\n## Highlights\n\n- Supports react-native, react-native-web or any web react based project\n- API strictly follows the Web Audio API standard\n- Blazingly fast, all of the Audio API core is written in C++ to deliver the best performance possible\n- Truly native, we use most up-to-date native apis such as AVFoundation, CoreAudio or Oboe\n- Modular routing architecture to fit simple (and complex) use-cases\n- Sample-accurate scheduled sound playback with low-latency for musical applications requiring the highest degree of rhythmic precision.\n- Efficient real-time time-domain and frequency-domain analysis / visualization\n- Efficient biQuad filters for most common filtering methods.\n- Support for computational audio synthesis\n\n## Motivation\n\nBy aligning with the Web Audio specification, we're creating a single API that works seamlessly across native iOS, Android, browsers, and even standalone desktop applications. The React Native ecosystem currently lacks a high-performance API for creating audio, adding effects, or controlling basic parameters like volume for each audio separately - and we're here to bridge that gap!\n\n\n## Alternatives\n\n### Expo Audio\n\n[Expo Audio](https://docs.expo.dev/versions/latest/sdk/audio/) might be a better fit for you, if you are looking for simple playback functionality, as its simple and well documented API makes it easy to use.\n"
  },
  {
    "path": "packages/audiodocs/docs/guides/_category_.json",
    "content": "{\n  \"label\": \"Guides\",\n  \"position\": 2,\n  \"link\": {\n    \"type\": \"generated-index\"\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/docs/guides/create-your-own-effect.mdx",
    "content": "---\nsidebar_position: 6\n---\n\n# Create your own effect\n\nIn this section, we will create our own [`pure C++ turbo-module`](https://reactnative.dev/docs/the-new-architecture/pure-cxx-modules) and use it to create custom processing node that can change sound whatever you want.\n\n### Prerequisites\n\nWe highly encourage you to get familiar with [this guide](https://reactnative.dev/docs/the-new-architecture/pure-cxx-modules), since we will be using many similar concepts that are explained here.\n\n## Generate files\n\nWe prepared a script that generates all of the boiler plate code for you.\nOnly parts that will be needed by you, are:\n- customizing processor to your tasks\n- configuring [`codegen`](https://reactnative.dev/docs/the-new-architecture/what-is-codegen) with your project\n- writing native specific code to compile those files\n\n```bash\nnpx rn-audioapi-custom-node-generator create -o # path where you want files to be generated, usually same level as android/ and ios/\n```\n\n## Analyzing generated files\n\nYou should see two directories:\n- `shared/` - it contains c++ files (source code for custom effect and JSI layer - Host Objects, needed to communicate with JavaScript)\n- `specs/` - defines typescript interface that will invoke c++ code in JavaScript\n\n:::caution\nName of the file in `specs/` has to start with `Native` to be seen by codegen.\n:::\n\nThe most important file is `MyProcessorNode.cpp`, it contains main processing part that directly manipulates raw data.\n\nIn this guide, we will edit files in order to achieve [`GainNode`](/docs/effects/gain-node) functionality.\nFor the sake of a simplicity, we will use value as a raw `double` type, not wrapped in [`AudioParam`](/docs/core/audio-param).\n\n<details open>\n<summary>MyProcessorNode.h</summary>\n\n```cpp\n#pragma once\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\nnamespace audioapi {\n\nclass MyProcessorNode : public AudioNode {\npublic:\n  explicit MyProcessorNode(const std::shared_ptr<BaseAudioContext> &context);\n\nprotected:\n  std::shared_ptr<DSPAudioBuffer>\n  processNode(const std::shared_ptr<DSPAudioBuffer> &buffer,\n              int framesToProcess) override;\n\n// highlight-start\nprivate:\n  double gain; // value responsible for gain value\n// highlight-end\n};\n\n} // namespace audioapi\n```\n</details>\n\n<br />\n\n<details open>\n<summary>MyProcessorNode.cpp</summary>\n\n```cpp\n#include \"MyProcessorNode.h\"\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/AudioArray.hpp>\n\nnamespace audioapi {\n    MyProcessorNode::MyProcessorNode(const std::shared_ptr<BaseAudioContext> &context)\n        //highlight-next-line\n        : AudioNode(context), gain(0.5) {\n        isInitialized_.store(true, std::memory_order_release);\n    }\n\n    std::shared_ptr<DSPAudioBuffer> MyProcessorNode::processNode(const std::shared_ptr<DSPAudioBuffer> &buffer,\n                                    int framesToProcess) {\n      // highlight-start\n      for (int channel = 0; channel < buffer->getNumberOfChannels(); ++channel) {\n        auto *audioArray = bus->getChannel(channel);\n        for (size_t i = 0; i < framesToProcess; ++i) {\n          // Apply gain to each sample in the audio array\n          (*audioArray)[i] *= gain;\n        }\n      }\n      // highlight-end\n    }\n} // namespace audioapi\n```\n</details>\n\n<br />\n\n<details open>\n<summary>MyProcessorNodeHostObject.h</summary>\n\n```cpp\n#pragma once\n\n#include \"MyProcessorNode.h\"\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass MyProcessorNodeHostObject : public AudioNodeHostObject {\npublic:\n  explicit MyProcessorNodeHostObject(\n      const std::shared_ptr<MyProcessorNode> &node)\n      : AudioNodeHostObject(node) {\n    // highlight-start\n    addGetters(JSI_EXPORT_PROPERTY_GETTER(MyProcessorNodeHostObject, getter));\n    addSetters(JSI_EXPORT_PROPERTY_SETTER(MyProcessorNodeHostObject, setter));\n    // highlight-end\n  }\n\n  // highlight-start\n  JSI_PROPERTY_GETTER(getter) {\n     auto processorNode = std::static_pointer_cast<MyProcessorNode>(node_);\n     return {processorNode->someGetter()};\n  }\n  // highlight-end\n\n  // highlight-start\n  JSI_PROPERTY_SETTER(setter) {\n     auto processorNode = std::static_pointer_cast<MyProcessorNode>(node_);\n     processorNode->someSetter(value.getNumber());\n  }\n  // highlight-end\n};\n} // namespace audioapi\n```\n</details>\n\n## Codegen\n\nOnboarding codegen doesn't require anything special in regards to basic [react-native tutorial](https://reactnative.dev/docs/the-new-architecture/pure-cxx-modules#2-configure-codegen)\n\n## Native files\n\n### iOS\n\nWhen it comes to iOS there is also nothing more than following [react-native tutorial](https://reactnative.dev/docs/the-new-architecture/pure-cxx-modules#ios)\n\n### Android\n\nCase with android is much different, because of the way android is compiled we need to compile our library with whole turbo-module.\nFirstly, follow [the guide](https://reactnative.dev/docs/the-new-architecture/pure-cxx-modules#android), but replace `CmakeLists.txt` with this content:\n\n```cmake\ncmake_minimum_required(VERSION 3.13)\n\nproject(appmodules)\n\nset(ROOT ${CMAKE_SOURCE_DIR}/../../../../..)\nset(AUDIO_API_DIR ${ROOT}/node_modules/react-native-audio-api)\n\ninclude(${REACT_ANDROID_DIR}/cmake-utils/ReactNative-application.cmake)\n\ntarget_sources(${CMAKE_PROJECT_NAME} PRIVATE\n  ${ROOT}/shared/NativeAudioProcessingModule.cpp\n  ${ROOT}/shared/MyProcessorNode.cpp\n  ${ROOT}/shared/MyProcessorNodeHostObject.cpp\n)\n\ntarget_include_directories(${CMAKE_PROJECT_NAME} PUBLIC\n    ${ROOT}/shared\n    ${AUDIO_API_DIR}/common/cpp\n)\n\nadd_library(react-native-audio-api SHARED IMPORTED)\nstring(TOLOWER ${CMAKE_BUILD_TYPE} BUILD_TYPE_LOWER)\n# we need to import built library from android directory\nset_target_properties(react-native-audio-api PROPERTIES IMPORTED_LOCATION\n        ${AUDIO_API_DIR}/android/build/intermediates/merged_native_libs/${BUILD_TYPE_LOWER}/merge${CMAKE_BUILD_TYPE}NativeLibs/out/lib/${CMAKE_ANDROID_ARCH_ABI}/libreact-native-audio-api.so\n)\ntarget_link_libraries(${CMAKE_PROJECT_NAME} react-native-audio-api android log)\n```\n\nLast part that is required for you to do, is to add following lines to `build.gradle` file located in `android/app` directory.\n\n```Cmake\nevaluationDependsOn(\":react-native-audio-api\")\n\nafterEvaluate {\n    tasks.getByName(\"buildCMakeDebug\").dependsOn(findProject(\":react-native-audio-api\").tasks.getByName(\"mergeDebugNativeLibs\"))\n    tasks.getByName(\"buildCMakeRelWithDebInfo\").dependsOn(findProject(\":react-native-audio-api\").tasks.getByName(\"mergeReleaseNativeLibs\"))\n}\n```\n\nSince in `CmakeLists.txt` we depend on libreact-native-audio-api.so, we need to make sure that building an app will be invoked after library is existing.\n\n## Final touches\n\nLast part is to finally onboard your custom module to your app, by creating typescript interface that would map c++ layer.\n\n```typescript\n// types.ts\nimport { AudioNode, BaseAudioContext } from \"react-native-audio-api\";\nimport { IAudioNode, IBaseAudioContext } from \"react-native-audio-api/lib/typescript/interfaces\";\n\nexport interface IMyProcessorNode extends IAudioNode {\n    gain: number;\n}\n\nexport class MyProcessorNode extends AudioNode {\n    constructor(context: BaseAudioContext, node: IMyProcessorNode) {\n        super(context, node);\n    }\n\n    public set gain(value: number) {\n        (this.node as IMyProcessorNode).gain = value;\n    }\n\n    public get gain(): number {\n        return (this.node as IMyProcessorNode).gain;\n    }\n}\n\ndeclare global {\n    var createCustomProcessorNode: (context: IBaseAudioContext) => IMyProcessorNode;\n}\n```\n\n## Example\n\n```tsx\nimport {\n  AudioContext,\n  OscillatorNode,\n} from 'react-native-audio-api';\nimport { MyProcessorNode } from './types';\n\nfunction App() {\n  const audioContext = new AudioContext();\n  const oscillator = audioContext.createOscillator();\n  // constructor is put in global scope\n  const processor = new MyProcessorNode(audioContext, global.createCustomProcessorNode(audioContext.context));\n  oscillator.connect(processor);\n  processor.connect(audioContext.destination);\n  oscillator.start(audioContext.currentTime);\n}\n```\n\n**Check out fully working [demo app](https://github.com/software-mansion-labs/custom-processor-node-example)**\n\n## What's next?\n\nI’m not sure, but give yourself a pat on the back – you’ve earned it! More guides are on the way, so stay tuned! 🎼\n"
  },
  {
    "path": "packages/audiodocs/docs/guides/lets-make-some-noise.mdx",
    "content": "---\nsidebar_position: 2\n---\n\n# Let's make some noise!\n\nIn this section, we will guide you through the basic concepts of Audio API. We are going to use core audio components such as [`AudioContext`](/docs/core/audio-context) and [`AudioBufferSourceNode`](/docs/sources/audio-buffer-source-node) to simply play sound from a file, which will help you develop a basic understanding of the library.\n\n## Using audio context\n\nLet's start by bootstrapping a simple application with a play button and creating our first instance of `AudioContext` object.\n\n```jsx\nimport React from 'react';\nimport { View, Button } from 'react-native';\n// highlight-next-line\nimport { AudioContext } from 'react-native-audio-api';\n\nexport default function App() {\n  const handlePlay = async () => {\n    // highlight-next-line\n    const audioContext = new AudioContext();\n  };\n\n  return (\n    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n      <Button onPress={handlePlay} title=\"Play sound!\" />\n    </View>\n  );\n}\n```\n\n`AudioContext` is an object that controls both the creation of the nodes and the execution of the audio processing or decoding.\n\n## Loading an audio file\n\nBefore we can play anything, we need to gain access to some audio data. For the purpose of this guide, we will first download it from a remote source using.\n\n```jsx\nimport React from 'react';\nimport { View, Button } from 'react-native';\nimport { AudioContext } from 'react-native-audio-api';\n\nexport default function App() {\n  const handlePlay = async () => {\n    const audioContext = new AudioContext();\n    // highlight-start\n    const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\n    // highlight-end\n  };\n\n  return (\n    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n      <Button onPress={handlePlay} title=\"Play sound!\" />\n    </View>\n  );\n}\n```\n\nWe have used the [`decodeAudioData`](/docs/core/base-audio-context#decodeaudiodata) method of the [`BaseAudioContext`](/docs/core/base-audio-context), which takes a URL to a local file or bundled audio asset and decodes it into raw audio data that can be used within our system.\n\n## Play the audio\n\nThe last and final step is to create an [`AudioBufferSourceNode`](/docs/sources/audio-buffer-source-node), connect it to the `AudioContext's` destination, and start playing the sound. For the purpose of this guide, we will play the sound for just 10 seconds.\n\n```jsx {10-11,13-15}\nimport React from 'react';\nimport { View, Button } from 'react-native';\nimport { AudioContext } from 'react-native-audio-api';\n\nexport default function App() {\n  const handlePlay = async () => {\n    const audioContext = new AudioContext();\n    const audioBuffer = await audioContext.decodeAudioData(arrayBuffer);\n\n    const playerNode = audioContext.createBufferSource();\n    playerNode.buffer = audioBuffer;\n\n    playerNode.connect(audioContext.destination);\n    playerNode.start(audioContext.currentTime);\n    playerNode.stop(audioContext.currentTime + 10);\n  };\n\n  return (\n    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n      <Button onPress={handlePlay} title=\"Play sound!\" />\n    </View>\n  );\n}\n```\n\nAnd that's it! you have just played your first sound using react-native-audio-api. you can hear how it works in the live example below:\n\nimport InteractiveExample from '@site/src/components/InteractiveExample';\nimport LetsMakeSomeNoise from '@site/src/examples/LetsMakeSomeNoise/Component';\nimport LetsMakeSomeNoiseSrc from '!!raw-loader!@site/src/examples/LetsMakeSomeNoise/Source';\n\n<InteractiveExample src={LetsMakeSomeNoiseSrc} component={LetsMakeSomeNoise} />\n\n## Summary\n\nIn this guide, we have learned how to create a simple audio player using [`AudioContext`](/docs/core/audio-context) and [``AudioBufferSourceNode``](/docs/sources/audio-buffer-source-node) as well as how we can load audio data from a remote source. To sum up:\n\n- `AudioContext` is the main object that controls the audio graph.\n- the [`decodeAudioData`](/docs/core/base-audio-context#decodeaudiodata) method can be used to load audio data from a remote resource in the form of an [`AudioBuffer`](/docs/sources/audio-buffer).\n- `AudioBufferSourceNode` can be used with any `AudioBuffer`.\n- In order to hear the sounds, we need to connect the source node to the destination node exposed by `AudioContext`.\n- We can control the playback of the sound using [`start`](/docs/sources/audio-buffer-source-node#start) and [`stop`](/docs/sources/audio-scheduled-source-node#stop) methods of the `AudioBufferSourceNode` (and other source nodes, which we will show later).\n\n## What's next?\n\nIn [the next section](/docs/guides/making-a-piano-keyboard), we will learn more about how the audio graph works, what audio parameters are, and how we can use them to create a simple piano keyboard.\n"
  },
  {
    "path": "packages/audiodocs/docs/guides/making-a-piano-keyboard.mdx",
    "content": "---\nsidebar_position: 3\n---\n\nimport InteractiveExample from '@site/src/components/InteractiveExample';\n\n\n# Making a piano keyboard\n\nIn this section, we will use some of the core Audio API interfaces to create a simple piano keyboard. We will learn what an [`AudioParam`](/docs/core/audio-param) is and how to use it to change the pitch of the sound.\n\n## Base application\n\nLike in the previous example, we will start with a simple app with a couple of buttons so we don't need to worry about the UI later.\nYou can just copy and paste the code below to your project.\n\n```tsx\nimport React from 'react';\nimport { View, Text, Pressable } from 'react-native';\n\ntype KeyName = 'A' | 'B' | 'C' | 'D' | 'E';\n\ninterface ButtonProps {\n  keyName: KeyName;\n  onPressIn: (key: KeyName) => void;\n  onPressOut: (key: KeyName) => void;\n}\n\nconst Button = ({ onPressIn, onPressOut, keyName }: ButtonProps) => (\n  <Pressable\n    onPressIn={() => onPressIn(keyName)}\n    onPressOut={() => onPressOut(keyName)}\n    style={({ pressed }) => ({\n      margin: 4,\n      padding: 12,\n      borderRadius: 2,\n      backgroundColor: pressed ? '#d2e6ff' : '#abcdef',\n    })}\n  >\n    <Text style={{ color: 'white' }}>{`${keyName}`}</Text>\n  </Pressable>\n);\n\nexport default function SimplePiano() {\n  const onKeyPressIn = (which: KeyName) => {};\n  const onKeyPressOut = (which: KeyName) => {};\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        justifyContent: 'center',\n        alignItems: 'center',\n        flexDirection: 'row',\n      }}\n    >\n      {Keys.map((key) => (\n        <Button\n          onPressIn={onKeyPressIn}\n          onPressOut={onKeyPressOut}\n          keyName={key}\n          key={key}\n        />\n      ))}\n    </View>\n  );\n}\n```\n\n## Create audio context and preload the data\n\nLike previously, we will need to preload the audio files in order to be able to play them. Using the interfaces we already know, we will download them and store in the memory using the good old `useRef` hook.\n\nFirst, we have the import section and the list of sources we will be using. Let’s also make things easier by using type shorthand for the partial record:\n\n```tsx\nimport { AudioBuffer, AudioContext } from 'react-native-audio-api';\n\n/* ... */\n\ntype PR<T> = Partial<Record<KeyName, T>>;\n\nconst sourceList: PR<string> = {\n  A: 'https://software-mansion.github.io/react-native-audio-api/audio/sounds/C4.mp3',\n  C: 'https://software-mansion.github.io/react-native-audio-api/audio/sounds/Ds4.mp3',\n  E: 'https://software-mansion.github.io/react-native-audio-api/audio/sounds/Fs4.mp3',\n};\n```\n\nThen, we will want to fetch the audio files and store them. We want the audio data to be available to play as soon as possible, so we will use the `useEffect` hook to download them and store them in the `useRef` hook for simplicity.\n\n```tsx\nexport default function SimplePiano() {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferMapRef = useRef<PR<AudioBuffer>>({});\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    Object.entries(sourceList).forEach(async ([key, url]) => {\n      bufferListRef.current[key as KeyName] = await audioContextRef.current!.decodeAudioData(url);\n    });\n  }, []);\n}\n```\n\n## Playing the sounds\n\nNow it is finally time to play the sounds. We will use the [`AudioBufferSourceNode`](/docs/sources/audio-buffer-source-node) and simply play the buffers.\n\n```tsx\nexport default function SimplePiano() {\n  const onKeyPressIn = (which: KeyName) => {\n    const audioContext = audioContextRef.current;\n    const buffer = bufferMapRef.current[which];\n\n    if (!audioContext || !buffer) {\n      return;\n    }\n\n    const source = new AudioBufferSourceNode(audioContext, {\n      buffer,\n    });\n\n    source.connect(audioContext.destination);\n    source.start();\n  };\n}\n```\n\nWhen we put everything together, we will get something like this:\n\nimport ItHangs from '@site/src/examples/SimplePiano/ItHangsComponent';\nimport ItHangsSrc from '!!raw-loader!@site/src/examples/SimplePiano/ItHangsSource';\n\n<InteractiveExample component={ItHangs} src={ItHangsSrc} />\n\nGreat! But there are a few things off here:\n\n- We are not stopping the sound when the button is released, which is how a piano should work, right? 🙃\n- You have probably noticed in the previous section, but we are missing sounds for keys 'B' and 'D'.\n\nLet’s see how we can address these issues using the Audio API. We will go through them one by one. Ready?\n\n## Key release\n\nTo stop the sound when keys are released, we will need to store somewhere source nodes, in order to be able to call [`stop`](/docs/sources/audio-scheduled-source-node#stop) on them later. Just like with the audio context, let's use the `useRef` hook for this.\n\n```tsx\nconst playingNotesRef = useRef<PR<AudioBufferSourceNode>>({});\n```\n\nNow we need to modify the `onKeyPressIn` function a bit\n\n```tsx\nconst onKeyPressIn = (which: KeyName) => {\n  const audioContext = audioContextRef.current!;\n  const buffer = bufferMapRef.current[which];\n\n  const source = new AudioBufferSourceNode(audioContext, {\n    buffer,\n  });\n\n  source.connect(audioContext.destination);\n  source.start();\n\n  playingNotesRef.current[which] = source;\n};\n```\n\nAnd finally, we can implement the `onKeyPressOut` function\n\n```tsx\nconst onKeyPressOut = (which: KeyName) => {\n  const source = playingNotesRef.current[which];\n\n  if (source) {\n    source.stop();\n  }\n};\n```\n\nPutting it all together again, we get:\n\nimport PressOutComponent from '@site/src/examples/SimplePiano/PressOutComponent';\nimport PressOutSrc from '!!raw-loader!@site/src/examples/SimplePiano/PressOutSource';\n\n<InteractiveExample component={PressOutComponent} src={PressOutSrc} />\n\nAnd they stop on release, just as we wanted. But if we hold the keys for a short time, it sounds a bit strange. Also, have you noticed that the sound is simply cut off when we release the key? 🤔\nIt leaves a bit of an unpleasant feeling, right? So let’s try to make it a bit smoother.\n\n## Envelopes ✉️\n\nWe will start from the end this time, and finally, we will use new type of audio node - [`GainNode`](/docs/effects/gain-node) :tada: <br />\n`GainNode` is a simple node that can change the volume of any node (or nodes) connected to it. The `GainNode` has a single element called [`AudioParam`](/docs/core/audio-param), which is also named `gain`.\n\n## What is an AudioParam?\n\nAn `AudioParam` is an interface that controls various aspects of most audio nodes, like volume (in the `GainNode` described above), pan or frequency. It allows us to control these aspects over time, enabling smooth transitions and complex audio effects.\nFor our use case, we are interested in two methods of an AudioParam:\n- [`setValueAtTime`](/docs/core/audio-param/#setvalueattime)\n- [`exponentialRampToValueAtTime`](/docs/core/audio-param/#exponentialramptovalueattime).\n\n## What is an Envelope?\n\nAn envelope describes how a sound's amplitude changes over time. The most widely used model is **ADSR**, which stands for **Attack**, **Decay**, **Sustain**, and **Release**:\n\n- **Attack** — time to ramp from silence to peak volume.\n- **Decay** — time to fall from peak down to the sustain level.\n- **Sustain** — volume level held while the note is active.\n- **Release** — time to fade out after the note ends.\n\n\nimport InteractivePlayground from '@site/src/components/InteractivePlayground';\nimport { useGainAdsrPlayground } from '@site/src/components/InteractivePlayground/GainAdsrExample/useGainAdsrPlayground';\n\n<InteractivePlayground usePlayground={useGainAdsrPlayground} tag=\"ADSR Envelope\" />\n\nYou can read more about envelopes and ADSR on [Wikipedia](<https://en.wikipedia.org/wiki/Envelope_(music)>).\n\n## Implementing the envelope\n\nWith all the knowledge we have gathered, let's get back to the code. In our `onKeyPressIn` function, besides creating the source node, we will create a [`GainNode`](/docs/effects/gain-node) which will stand in the middle between the source and destination nodes, acting as our envelope. <br /> <br />\nWe want to implement the **attack** in `onKeyPressIn` function, and **release** in `onKeyPressOut`. In order to be able to access the envelope in both functions we will have to store it somewhere, so let's modify the `playingNotesRef` introduced earlier. <br /> <br />\nAlso, let’s not forget about the issue with short key presses. We will address that by enforcing a minimal duration of the sound to one second (as it works nicely with the samples we have 😉).\n\nLet’s start with the types:\n\n```tsx\ninterface PlayingNote {\n  source: AudioBufferSourceNode;\n  envelope: GainNode;\n  startedAt: number;\n}\n```\n\nand the `useRef` hook:\n\n```tsx\nconst playingNotesRef = useRef<PR<PlayingNote>>({});\n```\n\nNow we can modify the `onKeyPressIn` function:\n\n```tsx\nconst onKeyPressIn = (which: KeyName) => {\n  const audioContext = audioContextRef.current!;\n  const buffer = bufferMapRef.current[which];\n  const tNow = audioContext.currentTime;\n\n  if (!audioContext || !buffer) {\n    return;\n  }\n\n  const source = new AudioBufferSourceNode(audioContext, {\n    buffer,\n  });\n\n  const envelope = audioContext.createGain();\n\n  source.connect(envelope);\n  envelope.connect(audioContext.destination);\n\n  envelope.gain.setValueAtTime(0.001, tNow);\n  envelope.gain.exponentialRampToValueAtTime(1, tNow + 0.1);\n\n  source.start(tNow);\n  playingNotesRef.current[which] = { source, envelope, startedAt: tNow };\n};\n```\n\nand the `onKeyPressOut` function:\n\n```tsx\nconst onKeyPressOut = (which: KeyName) => {\n  const audioContext = audioContextRef.current!;\n  const playingNote = playingNotesRef.current[which];\n\n  if (!playingNote || !audioContext) {\n    return;\n  }\n\n  const { source, envelope, startedAt } = playingNote;\n\n  const tStop = Math.max(audioContext.currentTime, startedAt + 5);\n\n  envelope.gain.exponentialRampToValueAtTime(0.0001, tStop + 0.08);\n  envelope.gain.setValueAtTime(0, tStop + 0.09);\n  source.stop(tStop + 0.1);\n\n  playingNotesRef.current[which] = undefined;\n};\n```\n\nAs a result, we can hear something like this:\n\nimport EnvelopesComponent from '@site/src/examples/SimplePiano/EnvelopesComponent';\nimport EnvelopesSrc from '!!raw-loader!@site/src/examples/SimplePiano/EnvelopesSource';\n\n<InteractiveExample component={EnvelopesComponent} src={EnvelopesSrc} />\n\nAnd it finally sounds smooth and nice. But what about decay and sustain phases? Both are handled by the audio samples themselves, so we do not need to worry about them. To be honest, same goes for the attack phase, but we have implemented it for the sake of this guide. 🙂 <br /><br />\nSo, the only piece left is addressing the missing sample files for the 'B' and 'D' keys. What can we do about that?\n\n## Tampering with the playback rate\n\nThe [`AudioBufferSourceNode`](/docs/sources/audio-buffer-source-node) also has its own [`AudioParam`](/docs/core/audio-param), called `playbackRate` as the title suggests. It allows us to change the speed of the playback of the audio buffer. <br /> <br />\nYay! Nice. But how can we use that to make the missing keys sound? I will keep this short, as this guide is already quite long, so let’s wrap up!<br /><br />\n\nWhen we change the speed of a sound, it will also change its pitch (frequency). So, we can use that to make the missing keys sound.<br /><br />\nEach piano key has its own dominant frequency (e.g., the frequency of the `A4` key is `440Hz`). We can check the frequency of each key, calculate the ratio between them, and use that ratio to adjust the playback rate of the buffers we have.\n\n![Piano keys frequencies](/img/frequencies-on-piano.jpg)\n\nFor our example, let's use these frequencies as the base for our calculations:\n\n```tsx\nconst noteToFrequency = {\n  A: 261.626, // real piano middle C\n  B: 277.193, // Db\n  C: 311.127, // Eb\n  D: 329.628, // E\n  E: 369.994, // Gb\n};\n```\n\nFirst, we need to find the closest key to the missing one. We can do this in simple for loop:\n\n```tsx\nfunction getClosest(key: KeyName) {\n  let closestKey = 'A';\n  let minDiff = noteToFrequency.A - noteToFrequency[key];\n\n  for (const sourcedKey of Object.keys(sourceList)) {\n    const diff = noteToFrequency[sourcedKey] - noteToFrequency[key];\n\n    if (Math.abs(diff) < Math.abs(minDiff)) {\n      minDiff = diff;\n      closestKey = sourcedKey;\n    }\n  }\n\n  return closestKey;\n}\n```\n\nNow, we simply use the function in `onKeyPressIn` when the buffer is not found and adjust the playback rate for the source node accordingly:\n\n```tsx\nconst onKeyPressIn = (which: KeyName) => {\n  let buffer = bufferListRef.current[which];\n  const aCtx = audioContextRef.current;\n  let playbackRate = 1;\n\n  if (!buffer) {\n    const closestKey = getClosest(which);\n    const closestBuffer = bufferMapRef.current[closestKey];\n    playbackRate = noteToFrequency[closestKey] / noteToFrequency[which];\n  }\n\n  const source = aCtx.createBufferSource();\n  const envelope = aCtx.createGain();\n  source.buffer = buffer;\n};\n```\n\n## Final effects\n\nAs before, you can see the final results in the live example below, along with the full source code.\n\nimport SimplePiano from '@site/src/examples/SimplePiano/FinalComponent';\nimport SimplePianoSrc from '!!raw-loader!@site/src/examples/SimplePiano/FinalSource';\n\n<InteractiveExample component={SimplePiano} src={SimplePianoSrc} />\n\n## Summary\n\nIn this guide, we have learned how to create a simple piano keyboard with the help of the GainNode and AudioParams. To sum up:\n\n- [`AudioParam`](/docs/core/audio-param) is an interface that provides ways to control various aspects of audio nodes over time.\n- [`GainNode`](/docs/effects/gain-node) is a simple node that can change the volume of any node connected to it.\n- [`AudioBufferSourceNode`](/docs/sources/audio-buffer-source-node) has a parameter called `playbackRate` that allows to change the speed of the audio buffer's playback, thereby altering the pitch of the sound.\n- We can use `GainNode` to create envelopes, making the sound transitions smoother and more pleasant.\n- We have learned how to use the Audio API in the React environment, simulating a more production-like scenario.\n\n## What's next?\n\nIn [the next section](/docs/guides/noise-generation), we will learn how we can generate noise using the audio buffer source node.\n"
  },
  {
    "path": "packages/audiodocs/docs/guides/noise-generation.mdx",
    "content": "---\nsidebar_position: 4\n---\n\nimport InteractiveExample from '@site/src/components/InteractiveExample';\n\n# Noise generation\n\nNoise is one of the most basic and common tools in digital audio processing, in this guide, we will go through most common noise types and how to implement them using web audio api.\n\n## White noise\n\nThe most used type of noise. White is a random signal having equal intensity at different frequencies, giving it a constant [power spectral density. (Wikipedia)](https://en.wikipedia.org/wiki/Spectral_density#Power_spectral_density).\n\nTo produce white noise, we simply create an [`AudioBuffer`](/docs/sources/audio-buffer) containing random samples in range of `[-1; 1]` (in which audio api operates),\nwhich can be used by [`AudioBufferSourceNode`](/docs/sources/audio-buffer-source-node) for playback, further filtering or modification\n\n```tsx\nfunction createWhiteNoise() {\n  const aCtx = = new AudioContext();\n  const bufferSize = aCtx.sampleRate * 2;\n  const output = new Float32Array(bufferSize);\n\n  for (let i = 0; i < bufferSize; i += 1) {\n    output[i] = Math.random() * 2 - 1;\n  }\n\n  const noiseBuffer = aCtx.createBuffer(1, bufferSize, aCtx.sampleRate);\n  noiseBuffer.copyToChannel(output, 0, 0);\n\n  return noiseBuffer;\n}\n```\n\nUsually we want the noise to be able to be played constantly. To achieve this we are generating 2 seconds of the noise sound, which we will later loop using the `AudioBufferSourceNode` properties. In audio processing `sampleRate` means number of samples that will be played during one second, thus we simply multiply this value by `2` to achieve desired length of the buffer.\n\nimport WhiteNoise from '@site/src/examples/NoiseGeneration/WhiteNoiseComponent';\nimport WhiteNoiseSrc from '!!raw-loader!@site/src/examples/NoiseGeneration/WhiteNoiseSource';\n\n<InteractiveExample component={WhiteNoise} src={WhiteNoiseSrc} />\n\n## Pink noise\n\nPink noise, also known as 1/f noise (where \"f\" stands for frequency), is a type of signal or sound that has equal energy per octave. This means that the power spectral density (PSD) decreases inversely with frequency. In simpler terms, pink noise has more energy at lower frequencies and less energy at higher frequencies, which makes it sound softer and more balanced to the human ear than white noise.\n\nTo generate pink noise, we will use the effects of a $\\frac{-3dB}{octave}$ filter using the [Paul Kellet's refined method](https://www.musicdsp.org/en/latest/Filters/76-pink-noise-filter.html)\n\n```tsx\nconst createPinkNoise = () => {\n  const aCtx = new AudioContext();\n\n  const bufferSize = 2 * aCtx.sampleRate;\n  const output = new Float32Array(bufferSize);\n\n  let b0, b1, b2, b3, b4, b5, b6;\n  b0 = b1 = b2 = b3 = b4 = b5 = b6 = 0.0;\n\n  for (let i = 0; i < bufferSize; i += 1) {\n    const white = Math.random() * 2 - 1;\n\n    b0 = 0.99886 * b0 + white * 0.0555179;\n    b1 = 0.99332 * b1 + white * 0.0750759;\n    b2 = 0.969 * b2 + white * 0.153852;\n    b3 = 0.8665 * b3 + white * 0.3104856;\n    b4 = 0.55 * b4 + white * 0.5329522;\n    b5 = -0.7616 * b5 - white * 0.016898;\n\n    output[i] = 0.11 * (b0 + b1 + b2 + b3 + b4 + b5 + b6 + white * 0.5362);\n    b6 = white * 0.115926;\n  }\n\n  const noiseBuffer = aCtx.createBuffer(1, bufferSize, aCtx.sampleRate);\n  noiseBuffer.copyToChannel(output, 0, 0);\n\n  return noiseBuffer;\n}\n```\n\nYou can find more information about pink noise generation here: [https://www.firstpr.com.au/dsp/pink-noise/](https://www.firstpr.com.au/dsp/pink-noise/)\n\nimport PinkNoise from '@site/src/examples/NoiseGeneration/PinkNoiseComponent';\nimport PinkNoiseSrc from '!!raw-loader!@site/src/examples/NoiseGeneration/PinkNoiseSource';\n\n<InteractiveExample component={PinkNoise} src={PinkNoiseSrc} />\n\n## Brownian noise\n\nThe last noise type I would like to describe is brownian noise (also known as Brown or red noise). Brownian noise is named after the Brownian motion phenomenon, where particles inside a fluid move randomly due to collisions with other particles. It relates to its sonic counterpart in that Brownian noise is characterized by a significant presence of low frequencies, with energy decreasing as the frequency increases. Brownian noise is believed to sound like waterfall.\n\nBrownian noise, similarly to pink one, decreases in power by $\\frac{12dB}{octave}$ and sounds similar to waterfall. The implementation is taken from article by Zach Denton, [How to Generate Noise with the Web Audio API](https://noisehack.com/generate-noise-web-audio-api/):\n\n\n```tsx\n  const createBrownianNoise = () => {\n    const aCtx = new AudioContext();\n\n    const bufferSize = 2 * aCtx.sampleRate;\n    const output = new Float32Array(bufferSize);\n    let lastOut = 0.0;\n\n    for (let i = 0; i < bufferSize; i += 1) {\n      const white = Math.random() * 2 - 1;\n      output[i] = (lastOut + 0.02 * white) / 1.02;\n      lastOut = output[i];\n      output[i] *= 3.5;\n    }\n\n    const noiseBuffer = aCtx.createBuffer(1, bufferSize, aCtx.sampleRate);\n    noiseBuffer.copyToChannel(output, 0, 0);\n\n    return noiseBuffer;\n  }\n```\n\nimport BrownianNoise from '@site/src/examples/NoiseGeneration/BrownianNoiseComponent';\nimport BrownianNoiseSrc from '!!raw-loader!@site/src/examples/NoiseGeneration/BrownianNoiseSource';\n\n<InteractiveExample component={BrownianNoise} src={BrownianNoiseSrc} />\n\n## What's next?\n\nIn [the next section](/docs/guides/see-your-sound), we will explore how to capture audio data, visualize this data effectively, and utilize it to create basic animations.\n"
  },
  {
    "path": "packages/audiodocs/docs/guides/see-your-sound.mdx",
    "content": "---\nsidebar_position: 5\n---\n\nimport InteractiveExample from '@site/src/components/InteractiveExample';\n\n# See your sound\n\nIn this section, we will get familiar with capabilities of the [`AnalyserNode`](/docs/analysis/analyser-node) interface,\nfocusing on how to extract audio data in order to create a simple real-time visualization of the sounds.\n\n## Base application\n\nTo kick-start things a bit, lets use code based on previous tutorials.\nIt is a simple application that can load and play a sound from file.\nAs previously if you would like to code along the tutorial, copy and paste the code provided below into your project.\n\n```tsx\nimport React, {\n  useState,\n  useEffect,\n  useRef,\n  useMemo,\n} from 'react';\nimport {\n  AudioContext,\n  AudioBuffer,\n  AudioBufferSourceNode,\n} from 'react-native-audio-api';\nimport { ActivityIndicator, View, Button, LayoutChangeEvent } from 'react-native';\n\nconst AudioVisualizer: React.FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n  const audioBufferRef = useRef<AudioBuffer | null>(null);\n\n  const handlePlayPause = () => {\n    if (isPlaying) {\n      bufferSourceRef.current?.stop();\n    } else {\n      if (!audioContextRef.current) {\n        return\n      }\n\n      bufferSourceRef.current = audioContextRef.current.createBufferSource();\n      bufferSourceRef.current.buffer = audioBufferRef.current;\n      bufferSourceRef.current.connect(audioContextRef.current.destination);\n\n      bufferSourceRef.current.start();\n    }\n\n    setIsPlaying((prev) => !prev);\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    const fetchBuffer = async () => {\n      setIsLoading(true);\n      const url = 'https://software-mansion.github.io/react-native-audio-api/audio/music/example-music-02.mp3';\n      audioBufferRef.current = await audioContextRef.current!.decodeAudioData(url);\n      setIsLoading(false);\n    };\n\n    fetchBuffer();\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View style={{ flex: 1}}>\n      <View style={{ flex: 0.2 }} />\n      <View\n        style={{ flex: 0.5, justifyContent: 'center', alignItems: 'center' }}>\n        {isLoading && <ActivityIndicator color=\"#FFFFFF\" />}\n        <View\n          style={{\n            justifyContent: 'center',\n            flexDirection: 'row',\n            marginTop: 16,\n          }}>\n        <Button\n            onPress={handlePlayPause}\n            title={isPlaying ? 'Pause' : 'Play'}\n            disabled={!audioBufferRef.current}\n            color={'#38acdd'}\n          />\n        </View>\n      </View>\n    </View>\n  );\n};\n\nexport default AudioVisualizer;\n```\n\n## Create an analyzer to capture and process audio data\n\nTo obtain frequency and time-domain data, we need to utilize the [`AnalyserNode`](/docs/analysis/analyser-node).\nIt is an [`AudioNode`](/docs/core/audio-node) that passes data unchanged from input to output while enabling the extraction of this data in two domains: time and frequency.\n\nWe will use two specific `AnalyserNode's` methods:\n- [`getByteTimeDomainData`](/docs/analysis/analyser-node#getbytetimedomaindata)\n- [`getByteFrequencyData`](/docs/analysis/analyser-node#getbytefrequencydata)\n\nThese methods will allow us to acquire the necessary data for our analysis.\n\n```jsx {7,12,17-22,27,33,39,43,49-66,73-79}\n/* ... */\n\nimport {\n  AudioContext,\n  AudioBuffer,\n  AudioBufferSourceNode,\n  AnalyserNode,\n} from 'react-native-audio-api';\n\n/* ... */\n\nconst FFT_SIZE = 512;\n\nconst AudioVisualizer: React.FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n  const [times, setTimes] = useState<Uint8Array>(\n    new Uint8Array(FFT_SIZE).fill(127)\n  );\n  const [freqs, setFreqs] = useState<Uint8Array>(\n    new Uint8Array(FFT_SIZE / 2).fill(0)\n  );\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n  const audioBufferRef = useRef<AudioBuffer | null>(null);\n  const analyserRef = useRef<AnalyserNode | null>(null);\n\n  const handlePlayPause = () => {\n    if (isPlaying) {\n      bufferSourceRef.current?.stop();\n    } else {\n      if (!audioContextRef.current || !analyserRef.current) {\n        return\n      }\n\n      bufferSourceRef.current = audioContextRef.current.createBufferSource();\n      bufferSourceRef.current.buffer = audioBufferRef.current;\n      bufferSourceRef.current.connect(analyserRef.current);\n\n      bufferSourceRef.current.start();\n\n      requestAnimationFrame(draw);\n    }\n\n    setIsPlaying((prev) => !prev);\n  };\n\n  const draw = () => {\n    if (!analyserRef.current) {\n      return;\n    }\n\n    const timesArrayLength = analyserRef.current.fftSize;\n    const frequencyArrayLength = analyserRef.current.frequencyBinCount;\n\n    const timesArray = new Uint8Array(timesArrayLength);\n    analyserRef.current.getByteTimeDomainData(timesArray);\n    setTimes(timesArray);\n\n    const freqsArray = new Uint8Array(frequencyArrayLength);\n    analyserRef.current.getByteFrequencyData(freqsArray);\n    setFreqs(freqsArray);\n\n    requestAnimationFrame(draw);\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    if (!analyserRef.current) {\n      analyserRef.current = audioContextRef.current.createAnalyser();\n      analyserRef.current.fftSize = FFT_SIZE;\n      analyserRef.current.smoothingTimeConstant = 0.8;\n\n      analyserRef.current.connect(audioContextRef.current.destination);\n    }\n\n    const fetchBuffer = async () => {\n      setIsLoading(true);\n      const url = 'https://software-mansion.github.io/react-native-audio-api/audio/music/example-music-02.mp3';\n      audioBufferRef.current = await audioContextRef.current!.decodeAudioData(url);\n      setIsLoading(false);\n    };\n\n    fetchBuffer();\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View style={{ flex: 1}}>\n      <View style={{ flex: 0.2 }} />\n      <View\n        style={{ flex: 0.5, justifyContent: 'center', alignItems: 'center' }}>\n        {isLoading && <ActivityIndicator color=\"#FFFFFF\" />}\n        <View\n          style={{\n            justifyContent: 'center',\n            flexDirection: 'row',\n            marginTop: 16,\n          }}>\n        <Button\n            onPress={handlePlayPause}\n            title={isPlaying ? 'Pause' : 'Play'}\n            disabled={!audioBufferRef.current}\n            color={'#38acdd'}\n          />\n        </View>\n      </View>\n    </View>\n  );\n};\n\nexport default AudioVisualizer;\n```\n\nWe utilize the [`requestAnimationFrame`](https://reactnative.dev/docs/timers) method to continuously fetch and update real-time audio visualization data.\n\n## Visualize time-domain and frequency data\n\nTo render both the time as well as frequency domain visualizations, we will use our beloved graphic library - <br/> [`react-native-skia`](https://shopify.github.io/react-native-skia/).\n\nIf you would like to know more what are time and frequency domains, have at look at [Time domain vs Frequency domain](/docs/analysis/analyser-node#time-domain-vs-frequency-domain) section of the AnalyserNode documentation,\nwhich explains those terms in details, but otherwise here is the code:\n\n**Time domain**\n\nimport TimeDomain from '@site/src/examples/SeeYourSound/TimeDomainComponent';\nimport TimeDomainSrc from '!!raw-loader!@site/src/examples/SeeYourSound/TimeDomainSource';\n\n<InteractiveExample component={TimeDomain} src={TimeDomainSrc} />\n\nimport FrequencyDomain from '@site/src/examples/SeeYourSound/FrequencyDomainComponent';\nimport FrequencyDomainSrc from '!!raw-loader!@site/src/examples/SeeYourSound/FrequencyDomainSource';\n\n**Frequency domain**\n\n<InteractiveExample component={FrequencyDomain} src={FrequencyDomainSrc} />\n\n## Summary\n\nIn this guide, we have learned how to extract audio data using [`AnalyserNode`](/docs/analysis/analyser-node), what types of data we can obtain and how to visualize them. To sum up:\n\n- `AnalyserNode` is sniffer node that extracting audio data.\n- There are two domains of audio data: `frequency` and `time`.\n- We have learned how to use those data to create simple animation.\n\n## What's next?\n\nIn [the next section](/docs/guides/create-your-own-effect), we will learn how to create our own processing node, utilizing react native turbo-modules.\n"
  },
  {
    "path": "packages/audiodocs/docs/inputs/_category_.json",
    "content": "{\n  \"label\": \"Inputs\",\n  \"position\": 4,\n  \"link\": {\n    \"type\": \"generated-index\"\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/docs/inputs/audio-recorder.mdx",
    "content": "---\nsidebar_position: 4\ntoc_min_heading_level: 2\ntoc_max_heading_level: 5\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\nimport AudioNodePropsTable from '@site/src/components/AudioNodePropsTable';\nimport { Optional, ReadOnly, MobileOnly } from '@site/src/components/Badges';\n\n# AudioRecorder\n\nAudioRecorder is a primary interface for capturing audio. It supports three main modes of operations:\n\n- **File recording:** Writing audio data directly to the filesystem.\n- **Data callback:** Emitting raw audio buffers, that can be used in either further processing or streamed.\n- **Graph processing:** Connect the recorder with either `AudioContext` or `OfflineAudioContext` for further more advanced and/or realtime processing\n\n## Configuration\n\nTo access microphone you need to make sure your app has required permission configuration - check [getting started permission section](/docs/fundamentals/getting-started#special-permissions) for more information.\n\nAdditionally to be able to record audio while application is in the background, you need to enable background mode on iOS and configure foreground service on android.\n\n<Tabs queryString=\"platform\">\n  <TabItem value=\"expo\" label=\"Expo\" default>\n    In an Expo application you can do so through `react-native-audio-api` expo plugin, e.g.\n\n    ```json\n    {\n      \"plugins\": [\n        [\n          \"react-native-audio-api\",\n          {\n            \"iosBackgroundMode\": true,\n            \"iosMicrophonePermission\": \"[YOUR_APP_NAME] requires access to the microphone to record audio.\",\n            \"androidPermissions\" : [\n              \"android.permission.RECORD_AUDIO\",\n              \"android.permission.FOREGROUND_SERVICE\",\n              \"android.permission.FOREGROUND_SERVICE_MICROPHONE\",\n            ],\n            \"androidForegroundService\": true,\n            \"androidFSTypes\": [\"microphone\"]\n          }\n        ]\n      ]\n    }\n    ```\n\n    For more configuration options, check out the [Expo plugin section](/docs/other/audio-api-plugin).\n\n  </TabItem>\n  <TabItem value=\"iOS\" label=\"iOS\">\n    For bare react-native applications, background mode is configurable through `Signing & Capabilities` section of your app target config using XCode\n\n    ![background mode configuration example](/docs/recorder/signing-and-capabilities.png)\n\n    Microphone permission can be created or modified through the `Info.plist` file\n\n    ![Info plist example](/docs/recorder/info-plist.png)\n\n    Alternatively you can modify the `Info.plist` file directly in your editor of choice by adding those lines:\n\n    ```xml\n    <key>NSMicrophoneUsageDescription</key>\n    <string>$(PRODUCT_NAME) wants to access your microphone in order to use voice memo recording</string>\n    <key>UIBackgroundModes</key>\n    <array>\n      <string>audio</string>\n    </array>\n    ```\n\n  </TabItem>\n  <TabItem value=\"android\" label=\"Android\">\n    To enable required permissions or foreground service you have to manually edit the `AndroidManifest.xml` file\n\n    ```xml\n    <manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n\n      <!-- Foreground service and microphone permissions for background usage -->\n      <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE\"/>\n      <uses-permission android:name=\"android.permission.FOREGROUND_SERVICE_MICROPHONE\"/>\n\n      <!-- General permission for microphone access -->\n      <uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>\n\n      <!-- Paste this inside <application> tag -->\n        <service android:stopWithTask=\"true\" android:name=\"com.swmansion.audioapi.system.CentralizedForegroundService\" android:foregroundServiceType=\"microphone\" />\n    </manifest>\n\n    ```\n\n  </TabItem>\n</Tabs>\n\n## Usage\n\n<Tabs group=\"usage\">\n  <TabItem value=\"record-to-file\" label=\"Record to File\">\n\n```tsx\nimport React, { useState } from 'react';\nimport { View, Pressable, Text } from 'react-native';\nimport { AudioRecorder, AudioManager } from 'react-native-audio-api';\n\nAudioManager.setAudioSessionOptions({\n  iosCategory: 'record',\n  iosMode: 'default',\n  iosOptions: [],\n});\n\nconst audioRecorder = new AudioRecorder();\n\n// Enables recording to file with default configuration\naudioRecorder.enableFileOutput();\n\nconst MyRecorder: React.FC = () => {\n  const [isRecording, setIsRecording] = useState(false);\n\n  const onStart = async () => {\n    if (isRecording) {\n      return;\n    }\n\n    // Make sure the permissions are granted\n    const permissions = await AudioManager.requestRecordingPermissions();\n\n    if (permissions !== 'Granted') {\n      console.warn('Permissions are not granted');\n      return;\n    }\n\n    // Activate audio session\n    const success = await AudioManager.setAudioSessionActivity(true);\n\n    if (!success) {\n      console.warn('Could not activate the audio session');\n      return;\n    }\n\n    const result = audioRecorder.start();\n    if (result.status === 'error') {\n      console.warn(result.message);\n      return;\n    }\n\n    console.log('Recording started');\n    setIsRecording(true);\n  };\n\n  const onStop = () => {\n    if (!isRecording) {\n      return;\n    }\n\n    const result = audioRecorder.stop();\n    console.log(result);\n    setIsRecording(false);\n    AudioManager.setAudioSessionActivity(false);\n  };\n\n  return (\n    <View>\n      <Pressable onPress={isRecording ? onStop : onStart}>\n        <Text>{isRecording ? 'Stop' : 'Record'}</Text>\n      </Pressable>\n    </View>\n  );\n};\n\nexport default MyRecorder;\n```\n\n  </TabItem>\n  <TabItem value=\"data-callback\" label=\"Data callback\">\n\n```tsx\nimport React, { useState, useEffect } from 'react';\nimport { View, Pressable, Text } from 'react-native';\nimport { AudioRecorder, AudioManager } from 'react-native-audio-api';\n\nAudioManager.setAudioSessionOptions({\n  iosCategory: 'record',\n  iosMode: 'default',\n  iosOptions: [],\n});\n\nconst audioRecorder = new AudioRecorder();\nconst sampleRate = 16000;\n\nconst MyRecorder: React.FC = () => {\n  const [isRecording, setIsRecording] = useState(false);\n\n  useEffect(() => {\n    audioRecorder.onAudioReady(\n      {\n        sampleRate,\n        bufferLength: sampleRate * 0.1, // 0.1s of audio each batch\n        channelCount: 1,\n      },\n      ({ buffer, numFrames, when }) => {\n        // do something with the data, i.e. stream it\n      }\n    );\n\n    return () => {\n      audioRecorder.clearOnAudioReady();\n    };\n  }, []);\n\n  const onStart = async () => {\n    if (isRecording) {\n      return;\n    }\n\n    // Make sure the permissions are granted\n    const permissions = await AudioManager.requestRecordingPermissions();\n\n    if (permissions !== 'Granted') {\n      console.warn('Permissions are not granted');\n      return;\n    }\n\n    // Activate audio session\n    const success = await AudioManager.setAudioSessionActivity(true);\n\n    if (!success) {\n      console.warn('Could not activate the audio session');\n      return;\n    }\n\n    const result = audioRecorder.start();\n\n    if (result.status === 'error') {\n      console.warn(result.message);\n      return;\n    }\n\n    setIsRecording(true);\n  };\n\n  const onStop = () => {\n    if (!isRecording) {\n      return;\n    }\n\n    audioRecorder.stop();\n    setIsRecording(false);\n    AudioManager.setAudioSessionActivity(false);\n  };\n\n  return (\n    <View>\n      <Pressable onPress={isRecording ? onStop : onStart}>\n        <Text>{isRecording ? 'Stop' : 'Record'}</Text>\n      </Pressable>\n    </View>\n  );\n};\n\nexport default MyRecorder;\n```\n\n  </TabItem>\n  <TabItem value=\"graph-processing\" label=\"Graph processing\">\n\n```tsx\nimport React, { useState } from 'react';\nimport { View, Pressable, Text } from 'react-native';\nimport {\n  AudioRecorder,\n  AudioContext,\n  AudioManager,\n} from 'react-native-audio-api';\n\nAudioManager.setAudioSessionOptions({\n  iosCategory: 'playAndRecord',\n  iosMode: 'default',\n  iosOptions: [],\n});\n\nconst audioRecorder = new AudioRecorder();\nconst audioContext = new AudioContext();\n\nconst MyRecorder: React.FC = () => {\n  const [isRecording, setIsRecording] = useState(false);\n\n  const onStart = async () => {\n    if (isRecording) {\n      return;\n    }\n\n    // Make sure the permissions are granted\n    const permissions = await AudioManager.requestRecordingPermissions();\n\n    if (permissions !== 'Granted') {\n      console.warn('Permissions are not granted');\n      return;\n    }\n\n    // Activate audio session\n    const success = await AudioManager.setAudioSessionActivity(true);\n\n    if (!success) {\n      console.warn('Could not activate the audio session');\n      return;\n    }\n\n    const adapter = audioContext.createRecorderAdapter();\n    adapter.connect(audioContext.destination);\n    audioRecorder.connect(adapter);\n\n    if (audioContext.state === 'suspended') {\n      await audioContext.resume();\n    }\n\n    const result = audioRecorder.start();\n\n    if (result.status === 'error') {\n      console.warn(result.message);\n      return;\n    }\n\n    setIsRecording(true);\n  };\n\n  const onStop = () => {\n    if (!isRecording) {\n      return;\n    }\n\n    audioRecorder.stop();\n    audioContext.suspend();\n    setIsRecording(false);\n    AudioManager.setAudioSessionActivity(false);\n  };\n\n  return (\n    <View>\n      <Pressable onPress={isRecording ? onStop : onStart}>\n        <Text>{isRecording ? 'Stop' : 'Record'}</Text>\n      </Pressable>\n    </View>\n  );\n};\n\nexport default MyRecorder;\n```\n\n  </TabItem>\n</Tabs>\n\n## API\n\n<table className=\"table-vertical-top\">\n  <thead>\n    <tr><td><div class=\"text-content\">Method</div></td><td><div class=\"text-content\">Description</div></td></tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td><div class=\"text-content\">\n        ##### Constructor\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n        Creates new instance of AudioRecorder. It is preferred to create only a single instance of the AudioRecorder class for the best performance, memory and battery consumption reasons. While the idle recorder has minimal impact on anything mentioned, switching between separate recorder instances might have a noticeable impact on the device.\n        </div>\n        ```tsx\n        import { AudioRecorder } from 'react-native-audio-api';\n\n        const audioRecorder = new AudioRecorder();\n        ```\n      </td>\n    </tr>\n    <tr>\n      <td><div class=\"text-content\">\n        ##### start\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Starts the stream from system audio input device.\n          You can pass optional object with `fileNameOverride` string, to provide your own fileName generation.\n        </div>\n        ```tsx\n        const result = audioRecorder.start({\n          fileNameOverride: `my_audio_${mySessionId}`\n        });\n\n        console.log(result.status);\n        ```\n      </td>\n    </tr>\n\n<!-- -->\n\n    <tr>\n      <td><div class=\"text-content\">\n        ##### stop\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n        Stops the input stream and cleans up each input access method.\n\n        For details on the returned file information check: [FileInfo](#fileinfo)\n        </div>\n        ```tsx\n        const result = audioRecorder.stop();\n\n        if (result.status === 'success') {\n          const { paths, duration, size } = result;\n        } else if (result.status === 'error') {\n          console.error(result.message);\n        }\n        ```\n      </td>\n    </tr>\n\n<!-- -->\n\n    <tr>\n      <td><div class=\"text-content\">\n        ##### pause\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Pauses the recording. This is useful when recording to file is active, but you don't want to finalize the file.\n        </div>\n        ```tsx\n          audioRecorder.pause();\n        ```\n      </td>\n    </tr>\n\n<!-- -->\n\n    <tr>\n      <td><div class=\"text-content\">\n        ##### resume\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Resumes the recording if it was previously paused, otherwise does nothing.\n        </div>\n        ```tsx\n          audioRecorder.resume();\n        ```\n      </td>\n    </tr>\n\n<!-- -->\n\n    <tr>\n      <td><div class=\"text-content\">\n        ##### isRecording\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Returns `true` if the recorder is in active/recording state\n        </div>\n        ```tsx\n          const isRecording = audioRecorder.isRecording();\n        ```\n      </td>\n    </tr>\n\n<!-- -->\n\n    <tr>\n      <td><div class=\"text-content\">\n        ##### isPaused\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Returns `true` if the recorder is in paused state.\n        </div>\n        ```tsx\n          const isPaused = audioRecorder.isPaused();\n        ```\n      </td>\n    </tr>\n\n<!-- -->\n\n    <tr>\n      <td><div class=\"text-content\">\n        ##### onError\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Sets an error callback for any possible internal error that might happen during file writing, callback invocation or adapter access.\n\n          For details check: [OnRecorderErrorEventType](#onrecordererroreventtype)\n        </div>\n        ```tsx\n          audioRecorder.onError((error: OnRecorderErrorEventType) => {\n            console.log(error);\n          });\n        ```\n      </td>\n    </tr>\n\n<!-- -->\n\n    <tr>\n      <td><div class=\"text-content\">\n        ##### clearOnError\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Removes the error callback.\n        </div>\n        ```tsx\n          audioRecorder.clearOnError();\n        ```\n      </td>\n    </tr>\n\n  </tbody>\n</table>\n\n### Recording to file\n\n<table className=\"table-vertical-top\">\n  <thead>\n    <tr><td><div class=\"text-content\">Method</div></td><td><div class=\"text-content\">Description</div></td></tr>\n  </thead>\n  <tbody>\n<!-- -->\n    <tr>\n      <td><div class=\"text-content\">\n        ##### enableFileOutput\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Configures and enables the file output with defined options and stream properties. Options property allows for configuration of the output file structure and quality. By default the recorder writes to cache directory using high-quality `M4A` file.\n\n          For further information check: [AudioRecorderFileOptions](#audiorecorderfileoptions)\n        </div>\n        ```tsx\n          audioRecorder.enableFileOutput();\n        ```\n      </td>\n    </tr>\n    <!-- -->\n    <tr>\n      <td><div class=\"text-content\">\n        ##### disableFileOutput\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Disables the file output and finalizes the currently recorded file if the recorder is active.\n        </div>\n        ```tsx\n          audioRecorder.disableFileOutput();\n        ```\n      </td>\n    </tr>\n    <!-- -->\n    <tr>\n      <td><div class=\"text-content\">\n        ##### getCurrentDuration\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Returns current recording duration if recording to file is enabled.\n        </div>\n        ```tsx\n          const duration = audioRecorder.getCurrentDuration();\n        ```\n      </td>\n    </tr>\n\n  </tbody>\n</table>\n\n### Data callback\n\n<table className=\"table-vertical-top\">\n  <thead>\n    <tr><td><div class=\"text-content\">Method</div></td><td><div class=\"text-content\">Description</div></td></tr>\n  </thead>\n  <tbody>\n<!-- -->\n    <tr>\n      <td><div class=\"text-content\">\n        ##### onAudioReady\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          The callback is periodically invoked with audio buffers that match the preferred configuration provided in `options`. These parameters (sample rate, buffer length, and channel count) guide how audio data is chunked and delivered, though the exact values may vary depending on device capabilities.\n          <br />\n\n          For further information check:\n            - [AudioRecorderCallbackOptions](#audiorecordercallbackoptions)\n            - [OnAudioReadyEventType](#onaudioreadyeventtype)\n        </div>\n        ```tsx\n          const sampleRate = 16000;\n\n          audioRecorder.onAudioReady(\n            {\n              sampleRate,\n              bufferLength: 0.1 * sampleRate, // 0.1s of data\n              channelCount: 1,\n            },\n            ({ buffer, numFrames, when }) => {\n              // do something with the data\n            });\n        ```\n      </td>\n    </tr>\n    <!-- -->\n    <tr>\n      <td><div class=\"text-content\">\n        ##### clearOnAudioReady\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Disables and flushes the remaining audio data through `onAudioReady` callback as explained above.\n        </div>\n        ```tsx\n          audioRecorder.clearOnAudioReady();\n        ```\n      </td>\n    </tr>\n\n  </tbody>\n</table>\n\n#### Graph processing\n\n<table className=\"table-vertical-top\">\n  <thead>\n    <tr><td><div class=\"text-content\">Method</div></td><td><div class=\"text-content\">Description</div></td></tr>\n  </thead>\n  <tbody>\n<!-- -->\n    <tr>\n      <td><div class=\"text-content\">\n        ##### connect\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Connects AudioRecorder with [RecorderAdapterNode](/docs/sources/recorder-adapter-node) instance that can be used for further audio processing.\n        </div>\n        ```tsx\n          const adapter = audioContext.createRecorderAdapter();\n          audioRecorder.connect(adapter);\n        ```\n      </td>\n    </tr>\n    <!-- -->\n    <tr>\n      <td><div class=\"text-content\">\n        ##### disconnect\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Disconnects AudioRecorder from the audio graph.\n        </div>\n        ```tsx\n          audioRecorder.disconnect();\n        ```\n      </td>\n    </tr>\n  </tbody>\n</table>\n\n## Types\n\n#### AudioRecorderCallbackOptions\n\n```tsx\ninterface AudioRecorderCallbackOptions {\n  sampleRate: number;\n  bufferLength: number;\n  channelCount: number;\n}\n```\n\n- `sampleRate` - The desired sample rate (in Hz) for audio buffers delivered to the\n  recording callback. Common values include 44100 or 48000 Hz. The actual\n  sample rate may differ depending on hardware and system capabilities.\n\n- `bufferLength` - The preferred size of each audio buffer, expressed as the number of samples per channel. Smaller buffers reduce latency but increase CPU load, while larger buffers improve efficiency at the cost of higher latency.\n\n- `channelCount` - The desired number of audio channels per buffer. Typically 1 for mono or 2 for stereo recordings.\n\n#### OnRecorderErrorEventType\n\n```tsx\ninterface OnRecorderErrorEventType {\n  message: string;\n}\n```\n\n#### OnAudioReadyEventType\n\nRepresents the data payload received by the audio recorder callback each time a new audio buffer becomes available during recording.\n\n```tsx\ninterface OnAudioReadyEventType {\n  buffer: AudioBuffer;\n  numFrames: number;\n  when: number;\n}\n```\n\n- `buffer` - The audio buffer containing the recorded PCM data. This buffer includes one or more channels of floating-point samples in the range of -1.0 to 1.0.\n- `numFrames` - The number of audio frames contained in this buffer. A frame represents a single sample across all channels.\n- `when` - The timestamp (in seconds) indicating when this buffer was captured, relative to the start of the recording session.\n\n### File handling\n\n#### AudioRecorderFileOptions\n\n```tsx\ninterface AudioRecorderFileOptions {\n  channelCount?: number;\n  rotateIntervalBytes?: number;\n\n  format?: FileFormat;\n  preset?: FilePresetType;\n\n  directory?: FileDirectory;\n  subDirectory?: string;\n  fileNamePrefix?: string;\n  androidFlushIntervalMs?: number;\n}\n```\n\n- `channelCount` - The desired channel count in the resulting file. not all file formats supports all possible channel counts.\n- `rotateIntervalBytes` - The threshold size (in bytes) at which the recorder will start writing to a new file. If set to 0 (default), file output rotation is disabled. When active, new files are named with the original prefix appended with a timestamp.\n- `format` - The desired extension and file format of the recorder file. Check: [FileFormat](#fileformat) below.\n- `preset` - The desired recorder file properties, you can use either one of built-in properties or tweak low-level parameters yourself. Check [FilePresetType](#filepresettype) for more details.\n- `directory` - Either `FileDirectory.Cache` or `FileDirectory.Document` (default: `FileDirectory.Cache`). Determines the system directory that the file will be saved to.\n- `subDirectory` - If configured it will create the recording inside requested directory (default: `undefined`).\n- `fileNamePrefix` - Prefix of the recording files without the unique ID (default: `recording`).\n- `androidFlushIntervalMs` - How often the recorder should force the system to write data to the device storage (default: `500`).\n  - Lower values are good for crash-resilience and are more memory friendly.\n  - Higher values are more battery- and storage-efficient.\n\n#### FileFormat\n\nDescribes desired file extension as well as codecs, containers (and muxers!) used to encode the file.\n\n```tsx\nenum FileFormat {\n  Wav,\n  Caf,\n  M4A,\n  Flac,\n}\n```\n\n#### FileInfo\n\n```tsx\ninterface FileInfo {\n  paths: string[];\n  size: number;\n  duration: number;\n}\n```\n\n- `paths` - Paths to the recorded audio files. When file rotation is disabled it has only one entry, otherwise list of paths to recorder files is returned.\n- `size` - The file size (in MB).\n- `duration` - The recording duration (in seconds).\n\n#### FilePresetType\n\nDescribes audio format that is used during writing to file as well as encoded final file properties. You can use one of predefined presets, or fully customize the result file, but be aware that the properties aren't limited to only valid configurations, you may find property pairs that will result in error result during recording start (or when enabling the file output during active input session)!\n\n##### Built-in file presets\n\nFor convenience we have provided set of most basic file configurations that should cover most of the cases (or at least we hope they will, please raise an issue if you find something lacking or misconfigured!).\n\n###### Usage\n\n```tsx\nimport { AudioRecorder, FileFormat, FilePreset } from 'react-native-audio-api';\n\nconst audioRecorder = new AudioRecorder();\n\naudioRecorder.enableFileOutput({\n  format: FileFormat.M4A,\n  preset: FilePreset.High,\n});\n```\n\n<table className=\"table-vertical-top\">\n  <thead>\n    <tr><td><div class=\"text-content\">Preset</div></td><td><div class=\"text-content\">Description</div></td></tr>\n  </thead>\n  <tbody>\n<!-- -->\n    <tr>\n      <td><div class=\"text-content\">\n        ##### Lossless\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Writes audio data directly to file without encoding, preserving the maximum audio quality supported by the device. This results in large file sizes, particularly for longer recordings. Available only when using WAV or CAF file formats.\n        </div>\n        ```tsx\n        audioRecorder.enableFileOutput({\n          format: FileFormat.CAF,\n          preset: FilePreset.Lossless,\n        });\n        ```\n      </td>\n    </tr>\n    <!-- -->\n    <tr>\n      <td><div class=\"text-content\">\n        ##### High Quality\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Uses high-fidelity audio parameters with efficient encoding to deliver near-lossless perceptual quality while producing smaller files than fully uncompressed recordings. Suitable for music and high-quality voice capture.\n        </div>\n        ```tsx\n        audioRecorder.enableFileOutput({\n          format: FileFormat.Flac,\n          preset: FilePreset.High,\n        });\n        ```\n      </td>\n    </tr>\n    <tr>\n      <td><div class=\"text-content\">\n        ##### Medium Quality\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Uses balanced audio parameters that provide good perceptual quality while keeping file sizes moderate. Intended for everyday recording scenarios such as voice notes, podcasts, and general in-app audio, where efficiency and compatibility outweigh maximum fidelity.\n        </div>\n        ```tsx\n        audioRecorder.enableFileOutput({\n          format: FileFormat.M4A,\n          preset: FilePreset.Medium,\n        });\n        ```\n      </td>\n    </tr>\n    <tr>\n      <td><div class=\"text-content\">\n        ##### Low Quality\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Uses reduced audio parameters to minimize file size and processing overhead. Designed for cases where speech intelligibility is sufficient and audio fidelity is not critical, such as quick voice notes, background recording, or diagnostic capture.\n        </div>\n        ```tsx\n        audioRecorder.enableFileOutput({\n          format: FileFormat.M4A,\n          preset: FilePreset.Low,\n        });\n        ```\n      </td>\n    </tr>\n  </tbody>\n</table>\n\n#### Preset customization\n\nIn addition to the predefined presets, you may supply a custom FilePresetType to fine-tune how audio data is written and encoded. This allows you to optimize for specific use cases such as speech-only recording, reduced storage footprint, or faster encoding.\n\n```tsx\nexport interface FilePresetType {\n  bitRate: number;\n  sampleRate: number;\n  bitDepth: BitDepth;\n  iosQuality: IOSAudioQuality;\n  flacCompressionLevel: FlacCompressionLevel;\n}\n```\n\n<table className=\"table-vertical-top\">\n  <thead>\n    <tr><td><div class=\"text-content\">Property</div></td><td><div class=\"text-content\">Description</div></td></tr>\n  </thead>\n  <tbody>\n<!-- -->\n    <tr>\n      <td><div class=\"text-content\">\n        ##### bitRate\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Defines the target bitrate for lossy encoders (for example AAC or M4A). Higher values generally improve perceptual quality at the cost of larger file sizes. This value may be ignored when using lossless formats.\n        </div>\n        <div class=\"table-vertical-top-table\">\n        | Use case | Bitrate (bps) | Notes |\n        | :- | - | :- |\n        | Very low quality / telemetry |\t32000 |\tBare minimum for speech intelligibility |\n        | Low quality voice notes |\t48000 |\tOptimized for small files and fast encoding |\n        | Standard speech / podcasts |\t64000 – 96000 |\tGood balance of clarity and size |\n        | Medium quality general audio |\t128000 |\tCommon default for consumer audio |\n        | High quality music / voice |\t160000 – 192000 |\tNear-transparent for most listeners |\n        | Very high quality |\t256000 – 320000 |\tLarge files, minimal perceptual loss |\n        </div>\n      </td>\n    </tr>\n    <!-- -->\n    <tr>\n      <td><div class=\"text-content\">\n        ##### sampleRate\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n            Specifies the sampling frequency used during recording. Higher sample rates capture a wider frequency range but increase processing and storage requirements.\n        </div>\n      </td>\n    </tr>\n    <tr>\n      <td><div class=\"text-content\">\n        ##### bitDepth\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Controls the PCM bit depth of the recorded audio. Higher bit depths increase dynamic range and precision, primarily affecting uncompressed or lossless output formats.\n        </div>\n      </td>\n    </tr>\n    <tr>\n      <td><div class=\"text-content\">\n        ##### iosQuality\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Maps the preset to the closest matching quality level provided by iOS native audio APIs, ensuring consistent behavior across Apple devices.\n        </div>\n        ```tsx\n        enum IOSAudioQuality {\n          Min,\n          Low,\n          Medium,\n          High,\n          Max,\n        }\n        ```\n      </td>\n    </tr>\n    <tr>\n      <td><div class=\"text-content\">\n        ##### flacCompressionLevel\n      </div></td>\n      <td>\n        <div class=\"text-content\">\n          Determines the compression level used when encoding FLAC files. Higher levels reduce file size at the cost of increased CPU usage, without affecting audio quality.\n        </div>\n        ```tsx\n        enum FlacCompressionLevel {\n          L0,\n          L1,\n          L2,\n          L3,\n          L4,\n          L5,\n          L6,\n          L7,\n          L8,\n        }\n        ```\n      </td>\n    </tr>\n  </tbody>\n</table>\n\n## Remarks & known issues\n"
  },
  {
    "path": "packages/audiodocs/docs/other/_category_.json",
    "content": "{\n  \"label\": \"Other\",\n  \"position\": 11,\n  \"link\": {\n    \"type\": \"generated-index\"\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/docs/other/audio-api-plugin.mdx",
    "content": "---\nid: audio-api-plugin\nsidebar_label: Audio API Expo plugin\nsidebar_position: 3\n---\n\n# Audio API Expo plugin\n\n## What is Audio API Expo plugin\n\nThe Audio API Expo plugin allows to set certain permissions and\nbackground audio related settings in developer friendly way.\n\n<details>\n<summary>Type definitions</summary>\n\n```typescript\ninterface Options {\n  iosMicrophonePermission?: string;\n  iosBackgroundMode: boolean;\n  androidPermissions: string[];\n  androidForegroundService: boolean;\n  androidFSTypes: string[];\n}\n```\n\n</details>\n\n## How to use it?\n\nAdd `react-native-audio-api` expo plugin to your `app.json` or `app.config.js`.\n\n<details>\n<summary>app.json</summary>\n```javascript\n{\n  \"plugins\": [\n    [\n      \"react-native-audio-api\",\n      {\n        \"iosBackgroundMode\": true,\n        \"iosMicrophonePermission\": \"This app requires access to the microphone to record audio.\",\n        \"androidPermissions\" : [\n          \"android.permission.MODIFY_AUDIO_SETTINGS\",\n          \"android.permission.FOREGROUND_SERVICE\",\n          \"android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK\"\n        ],\n        \"androidForegroundService\": true,\n        \"androidFSTypes\": [\n          \"mediaPlayback\"\n        ]\n      }\n    ]\n  ]\n}\n```\n</details>\n\n<details>\n<summary>app.config.js</summary>\n```javascript\nexport default {\n  ...\n  \"plugins\": [\n    [\n      \"react-native-audio-api\",\n      {\n        \"iosBackgroundMode\": true,\n        \"iosMicrophonePermission\": \"This app requires access to the microphone to record audio.\",\n        \"androidPermissions\" : [\n          \"android.permission.MODIFY_AUDIO_SETTINGS\",\n          \"android.permission.FOREGROUND_SERVICE\",\n          \"android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK\"\n        ],\n        \"androidForegroundService\": true,\n        \"androidFSTypes\": [\n          \"mediaPlayback\"\n        ]\n      }\n    ]\n  ]\n};\n```\n</details>\n\n## Options\n\n### iosBackgroundMode\n\nDefaults to `true`.\n\nAllows app to play audio in the background on iOS.\n\n### iosMicrophonePermission\n\nDefaults to `undefined`.\n\nAllows to specify a custom microphone permission message for iOS. If not specified it will be omitted in the `Info.plist`.\n\n### androidPermissions\n\nDefaults to\n\n```\n[\n  'android.permission.FOREGROUND_SERVICE',\n  'android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK'\n]\n```\n\nAllows to specify certain android app permissions to apply.\n\n##### Permissions:\n\n- `android.permission.POST_NOTIFICATIONS` - Required by Foreground Services on Android 13+ to post notifications.\n\n- `android.permission.FOREGROUND_SERVICE` - Allows an app to run a Foreground Service\n\n- `android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK` - Allows an app to run a Foreground Service specifically for continues audio or video playback.\n\n- `android.permission.FOREGROUND_SERVICE_MICROPHONE` - Allows an app to run a Foreground Service specifically for continues microphone capture from the background.\n\n- `android.permission.MODIFY_AUDIO_SETTINGS` - Allows an app to modify global audio settings.\n\n- `android.permission.INTERNET` - Allows applications to open network sockets.\n\n- `android.permission.RECORD_AUDIO` - Allows an application to record audio.\n\n### androidForegroundService\n\nDefaults to true\n\nAllows app to use Foreground Service options specified by user,\nit permits app to play audio in the background on Android.\n\n### androidFSTypes\n\nAllows user to specify appropriate Foreground Service type.\n\n##### Types description\n\n- `mediaPlayback` - Continue audio or video playback from the background.\n\n- `microphone` - Continue microphone capture from the background, such as voice recorders or communication apps.\n\n  Runtime prerequisites:\n    - Request and be granted the RECORD_AUDIO runtime permission.\n"
  },
  {
    "path": "packages/audiodocs/docs/other/compatibility.mdx",
    "content": "---\nid: compatibility\nsidebar_label: RN Compatibility\nsidebar_position: 1\n---\n\nimport { Yes, No, Version, Spacer } from '@site/src/components/Compatibility';\n\n# React Native compatibility table\n\n### Supported React Native versions on [the New Architecture](https://reactnative.dev/docs/the-new-architecture/landing-page) (Fabric)\n\n<div className=\"compatibility\">\n\n|                                     | 0.74  | 0.75  | 0.76  | 0.77  | 0.78  | 0.79  | 0.80  | 0.81  | 0.82  | 0.83  | 0.84  | 0.85  |\n| ----------------------------------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |\n| <Version version=\"0.12.x\"/>         | <No/> | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>|\n| <Version version=\"0.11.x\"/>         | <No/> | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> |\n| <Version version=\"0.10.x\"/>         | <No/> | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> | <No/> |\n| <Version version=\"0.9.x\"/>          | <No/> | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> | <No/> | <No/> |\n| <Version version=\"0.8.x\"/>          | <No/> | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> | <No/> | <No/> |\n| <Version version=\"0.7.x\"/>          | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> | <No/> | <No/> | <No/> |\n| <Version version=\"0.6.x\"/>          | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> | <No/> | <No/> | <No/> | <No/> |\n| <Version version=\"0.5.x\"/>          | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> | <No/> | <No/> | <No/> | <No/> | <No/> |\n| <Version version=\"0.4.x\"/>          | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> | <No/> | <No/> | <No/> | <No/> | <No/> |\n| <Version version=\"0.3.x\"/>          | <No/> | <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> | <No/> | <No/> | <No/> | <No/> | <No/> | <No/> |\n| <Version version=\"0.2.x\"/>          | <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> | <No/> | <No/> | <No/> | <No/> | <No/> | <No/> | <No/> |\n| <Version version=\"0.1.x\"/>          | <Yes/>| <Yes/>| <No/> | <No/> | <No/> | <No/> | <No/> | <No/> | <No/> | <No/> | <No/> | <No/> |\n\n</div>\n\n### Supported React Native versions on the Old Architecture (Paper)\n\n<div className=\"compatibility\">\n\n|                                     | 0.74  | 0.75  | 0.76  | 0.77  | 0.78  | 0.79  | 0.80  | 0.81  |\n| ----------------------------------- | ----- | ----- | ----- | ----- | ----- | ----- | ----- | ----- |\n| <Version version=\"^0.8.x\"/>         | <No/> | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>|\n| <Version version=\"0.7.x\"/>          | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <No/> |\n| <Version version=\"0.6.x\"/>          | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> |\n| <Version version=\"0.5.x\"/>          | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> | <No/> |\n| <Version version=\"0.4.x\"/>          | <No/> | <Yes/>| <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> | <No/> |\n| <Version version=\"0.3.x\"/>          | <No/> | <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> | <No/> | <No/> |\n| <Version version=\"0.2.x\"/>          | <Yes/>| <Yes/>| <Yes/>| <No/> | <No/> | <No/> | <No/> | <No/> |\n| <Version version=\"0.1.x\"/>          | <Yes/>| <Yes/>| <No/> | <No/> | <No/> | <No/> | <No/> | <No/> |\n\n</div>\n"
  },
  {
    "path": "packages/audiodocs/docs/other/ffmpeg-info.mdx",
    "content": "---\nsidebar_position: 5\n---\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\n# FFmpeg additional information\n\nWe use [`ffmpeg`](https://github.com/FFmpeg/FFmpeg) for few components:\n- [`StreamerNode`](/docs/sources/streamer-node)\n- decoding `aac`, `mp4`, `m4a` files\n\n## Disabling FFmpeg\n\nThe ffmpeg usage is enabled by default, however if you would like not to use it, f.e. there are some name clashes with other ffmpeg\nbinaries in your project, you can easily disable it. Just add one flag in corresponding file.\n\n:::info\nFFmpeg is enabled by default\n:::\n\n<Tabs queryString=\"platform\">\n  <TabItem value=\"expo\" label=\"Expo\" default>\n    Add entry in [expo plugin](/docs/fundamentals/getting-started#step-2-add-audio-api-expo-plugin-optional).\n\n    ```\n    \"disableFFmpeg\": true\n    ```\n  </TabItem>\n  <TabItem value=\"iOS\" label=\"iOS\">\n    Podfile\n    ```\n    ENV['DISABLE_AUDIOAPI_FFMPEG'] = '1'\n    ```\n  </TabItem>\n  <TabItem value=\"android\" label=\"Android\">\n    gradle.properties\n    ```\n    disableAudioapiFFmpeg=true\n    ```\n  </TabItem>\n</Tabs>\n"
  },
  {
    "path": "packages/audiodocs/docs/other/non-expo-permissions.mdx",
    "content": "---\nsidebar_position: 4\n---\n\n# Non-expo app permissions\n\nIf your app needs to access non-trivial resources such as microphone or running in the background, there has to be explicit entries about it in special places.\n\n## iOS\n\nOn iOS the file that handles special permissions is named [`Info.plist`](https://developer.apple.com/documentation/bundleresources/information-property-list?language=objc).\nThis file is placed in `ios/YourAppName` directory.\nFor example to tell system that our app wants to use a microphone, we would need to add this entry to the file.\n\n```\n<key>NSMicrophoneUsageDescription</key>\n<string>App wants to access your microphone in order to use voice memo recording</string>\n```\n\n## Android\n\nOn Android the file that handles special permissions is named [`AndroidManifest.xml`](https://developer.android.com/guide/topics/manifest/manifest-intro).\nThis file is placed in `android/app/src/main` directory.\nFor example to tell system that our app wants to use a microphone, we would need to add this entry to the file.\n\n```\n<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>\n```\n"
  },
  {
    "path": "packages/audiodocs/docs/other/running_with_mac_catalyst.mdx",
    "content": "---\nid: maccatalyst\nsidebar_label: Running with Mac Catalyst\n---\n\n# Running with Mac Catalyst\n\nMac Catalyst allows you to run your iOS apps natively on macOS. This guide covers the necessary changes to your Podfile to enable Mac Catalyst support for your React Native app with `react-native-audio-api`.\n\n## Podfile Configuration\n\nTo build your app for Mac Catalyst, you need to make several changes to your `ios/Podfile`:\n\n### 1. Enable building React Native from source\n\nAdd this environment variable at the top of your Podfile:\n\n```ruby\nENV['RCT_BUILD_FROM_SOURCE'] = '1'\n```\n\n### 2. Enable static frameworks\n\nAdd `use_frameworks!` with static linkage inside your target block:\n\n```ruby\ntarget 'YourApp' do\n  config = use_native_modules!\n  use_frameworks! :linkage => :static\n\n  # ... rest of your configuration\nend\n```\n\n### 3. Update post_install with Mac Catalyst support\n\nReplace your existing `post_install` block with one that enables Mac Catalyst:\n\n```ruby\npost_install do |installer|\n  react_native_post_install(\n    installer,\n    config[:reactNativePath],\n    :mac_catalyst_enabled => true,\n  )\nend\n```\n\n### 4. Hermes Framework Fix (RN 0.83.x only)\n\n:::note\nThis step is only required for React Native 0.83.x. There's a [known issue](https://github.com/facebook/react-native/issues/55540) where the Hermes framework bundle structure is ambiguous on Mac Catalyst. If you're on a different version, you can skip this step.\n:::\n\nIf you're using React Native 0.83.x, extend your `post_install` block with the following fix that restructures the Hermes framework to follow the correct macOS bundle layout:\n\n```ruby\npost_install do |installer|\n  react_native_post_install(\n    installer,\n    config[:reactNativePath],\n    :mac_catalyst_enabled => true,\n  )\n\n  # Hermes Mac Catalyst framework layout fix (RN 0.83.x)\n  require 'fileutils'\n\n  hermes_fw = File.join(__dir__,\n    'Pods/hermes-engine/destroot/Library/Frameworks/universal/hermesvm.xcframework',\n    'ios-arm64_x86_64-maccatalyst/hermesvm.framework'\n  )\n\n  if File.directory?(hermes_fw)\n    Dir.chdir(hermes_fw) do\n      FileUtils.mkdir_p('Versions/A')\n      File.symlink('A', 'Versions/Current') unless File.exist?('Versions/Current')\n\n      if File.exist?('hermesvm') && !File.symlink?('hermesvm')\n        FileUtils.mkdir_p('Versions/Current')\n        FileUtils.mv('hermesvm', 'Versions/Current/hermesvm')\n        File.symlink('Versions/Current/hermesvm', 'hermesvm')\n      end\n\n      FileUtils.mkdir_p('Versions/Current/Resources')\n      if File.exist?('Resources') && !File.symlink?('Resources')\n        FileUtils.rm_rf('Resources')\n      end\n      File.symlink('Versions/Current/Resources', 'Resources') unless File.exist?('Resources')\n    end\n  end\n  # ⬆️ End of Hermes fix ⬆️\n  end\nend\n```\n\n## Complete Example\n\nHere's a complete Podfile configured for Mac Catalyst (includes Hermes fix for RN 0.83.x — remove the Hermes section if you're on a different version):\n\n```ruby\nENV['RCT_NEW_ARCH_ENABLED'] = '1'\nENV['RCT_BUILD_FROM_SOURCE'] = '1'\n\nrequire Pod::Executable.execute_command('node', ['-p',\n  'require.resolve(\n    \"react-native/scripts/react_native_pods.rb\",\n    {paths: [process.argv[1]]},\n  )', __dir__]).strip\n\nplatform :ios, min_ios_version_supported\nprepare_react_native_project!\n\ntarget 'YourApp' do\n  config = use_native_modules!\n  use_frameworks! :linkage => :static\n\n  use_react_native!(\n    :path => config[:reactNativePath],\n    :hermes_enabled => true,\n    :app_path => \"#{Pod::Config.instance.installation_root}/..\",\n    :privacy_file_aggregation_enabled => true\n  )\n\n  post_install do |installer|\n    react_native_post_install(\n      installer,\n      config[:reactNativePath],\n      :mac_catalyst_enabled => true,\n    )\n\n    # ⬇️ Hermes fix for RN 0.83.x only - remove if using different version ⬇️\n    require 'fileutils'\n\n    hermes_fw = File.join(__dir__,\n      'Pods/hermes-engine/destroot/Library/Frameworks/universal/hermesvm.xcframework',\n      'ios-arm64_x86_64-maccatalyst/hermesvm.framework'\n    )\n\n    if File.directory?(hermes_fw)\n      Dir.chdir(hermes_fw) do\n        FileUtils.mkdir_p('Versions/A')\n        File.symlink('A', 'Versions/Current') unless File.exist?('Versions/Current')\n\n        if File.exist?('hermesvm') && !File.symlink?('hermesvm')\n          FileUtils.mkdir_p('Versions/Current')\n          FileUtils.mv('hermesvm', 'Versions/Current/hermesvm')\n          File.symlink('Versions/Current/hermesvm', 'hermesvm')\n        end\n\n        FileUtils.mkdir_p('Versions/Current/Resources')\n        if File.exist?('Resources') && !File.symlink?('Resources')\n          FileUtils.rm_rf('Resources')\n        end\n        File.symlink('Versions/Current/Resources', 'Resources') unless File.exist?('Resources')\n      end\n    end\n    # ⬆️ End of Hermes fix ⬆️\n  end\nend\n```\n\n## Building for Mac Catalyst\n\nAfter updating your Podfile:\n\n1. Run `pod install` to regenerate the Pods project\n2. Open your `.xcworkspace` in Xcode\n3. Select your target and go to **General** → **Deployment Info**\n4. Check **Mac (Designed for iPad)** or **Mac Catalyst** depending on your Xcode version\n5. Build and run targeting \"My Mac\"\n"
  },
  {
    "path": "packages/audiodocs/docs/other/testing.mdx",
    "content": "\n\nimport Tabs from '@theme/Tabs';\nimport TabItem from '@theme/TabItem';\n\n# Testing\n\nReact Native Audio API provides a comprehensive mock implementation to help you test your audio-related code without requiring actual audio hardware or platform-specific implementations.\n\n## Mock Implementation\n\nThe mock implementation provides the same API surface as the real library but with no-op or simplified implementations that are perfect for unit testing.\n\n### Importing Mocks\n\n<Tabs>\n<TabItem value=\"jest\" label=\"Jest\">\n\n```typescript\nimport * as MockAudioAPI from 'react-native-audio-api/mock';\n\n// Or import specific components\nimport { AudioContext, AudioRecorder } from 'react-native-audio-api/mock';\n```\n\n</TabItem>\n<TabItem value=\"manual\" label=\"Manual Setup\">\n\n```typescript\n// In your test setup file\njest.mock('react-native-audio-api', () =>\n  require('react-native-audio-api/mock')\n);\n\n// Then in your tests\nimport { AudioContext, AudioRecorder } from 'react-native-audio-api';\n```\n\n</TabItem>\n</Tabs>\n\n## Basic Usage\n\n### Audio Context Testing\n\n```typescript\nimport { AudioContext } from 'react-native-audio-api/mock';\n\ndescribe('Audio Graph Tests', () => {\n  it('should create and connect audio nodes', () => {\n    const context = new AudioContext();\n\n    // Create nodes\n    const oscillator = context.createOscillator();\n    const gainNode = context.createGain();\n\n    // Configure properties\n    oscillator.frequency.value = 440; // A4 note\n    gainNode.gain.value = 0.5; // 50% volume\n\n    // Connect the audio graph\n    oscillator.connect(gainNode);\n    gainNode.connect(context.destination);\n\n    // Test the configuration\n    expect(oscillator.frequency.value).toBe(440);\n    expect(gainNode.gain.value).toBe(0.5);\n  });\n\n  it('should support context state management', async () => {\n    const context = new AudioContext();\n    expect(context.state).toBe('running');\n\n    await context.suspend();\n    expect(context.state).toBe('suspended');\n\n    await context.resume();\n    expect(context.state).toBe('running');\n  });\n});\n```\n\n### Audio Recording Testing\n\n```typescript\nimport { AudioContext, AudioRecorder, FileFormat, FileDirectory } from 'react-native-audio-api/mock';\n\ndescribe('Audio Recording Tests', () => {\n  it('should configure and control recording', () => {\n    const context = new AudioContext();\n    const recorder = new AudioRecorder();\n\n    // Configure file output\n    const result = recorder.enableFileOutput({\n      format: FileFormat.M4A,\n      channelCount: 2,\n      directory: FileDirectory.Document,\n    });\n\n    expect(result.status).toBe('success');\n\n    // Set up recording chain\n    const oscillator = context.createOscillator();\n    const recorderAdapter = context.createRecorderAdapter();\n\n    oscillator.connect(recorderAdapter);\n    recorder.connect(recorderAdapter);\n\n    // Test recording workflow\n    const startResult = recorder.start();\n    expect(startResult.status).toBe('success');\n    expect(recorder.isRecording()).toBe(true);\n\n    const stopResult = recorder.stop();\n    expect(stopResult.status).toBe('success');\n    expect(recorder.isRecording()).toBe(false);\n  });\n});\n```\n\n### Offline Audio Processing\n\n```typescript\nimport { OfflineAudioContext } from 'react-native-audio-api/mock';\n\ndescribe('Offline Processing Tests', () => {\n  it('should render offline audio', async () => {\n    const offlineContext = new OfflineAudioContext({\n      numberOfChannels: 2,\n      length: 44100, // 1 second at 44.1kHz\n      sampleRate: 44100,\n    });\n\n    // Create a simple tone\n    const oscillator = offlineContext.createOscillator();\n    oscillator.frequency.value = 440;\n    oscillator.connect(offlineContext.destination);\n\n    // Render the audio\n    const renderedBuffer = await offlineContext.startRendering();\n\n    expect(renderedBuffer.numberOfChannels).toBe(2);\n    expect(renderedBuffer.length).toBe(44100);\n    expect(renderedBuffer.sampleRate).toBe(44100);\n  });\n});\n```\n\n## Advanced Testing Scenarios\n\n### Custom Worklet Testing\n\n```typescript\nimport { AudioContext, WorkletProcessingNode } from 'react-native-audio-api/mock';\n\ndescribe('Worklet Tests', () => {\n  it('should create custom audio processing', () => {\n    const context = new AudioContext();\n\n    const processingCallback = jest.fn((inputData, outputData, framesToProcess) => {\n      // Mock audio processing logic\n      for (let channel = 0; channel < outputData.length; channel++) {\n        for (let i = 0; i < framesToProcess; i++) {\n          outputData[channel][i] = inputData[channel][i] * 0.5; // Simple gain\n        }\n      }\n    });\n\n    const workletNode = new WorkletProcessingNode(\n      context,\n      'AudioRuntime',\n      processingCallback\n    );\n\n    expect(workletNode.context).toBe(context);\n  });\n});\n```\n\n### Audio Streaming Testing\n\n```typescript\nimport { AudioContext } from 'react-native-audio-api/mock';\n\ndescribe('Streaming Tests', () => {\n  it('should handle audio streaming', () => {\n    const context = new AudioContext();\n\n    const streamer = context.createStreamer({\n      streamPath: 'https://example.com/audio-stream',\n    });\n\n    expect(streamer.streamPath).toBe('https://example.com/audio-stream');\n\n    // Test streaming controls\n    streamer.start();\n    streamer.pause();\n    streamer.resume();\n    streamer.stop();\n  });\n});\n```\n\n### Error Handling Testing\n\n```typescript\nimport {\n  AudioRecorder,\n  NotSupportedError,\n  InvalidStateError\n} from 'react-native-audio-api/mock';\n\ndescribe('Error Handling Tests', () => {\n  it('should handle various error conditions', () => {\n    // Test error creation\n    expect(() => {\n      throw new NotSupportedError('Feature not supported');\n    }).toThrow('Feature not supported');\n\n    // Test recorder connection errors\n    const recorder = new AudioRecorder();\n    const context = new AudioContext();\n    const adapter = context.createRecorderAdapter();\n\n    // First connection should work\n    recorder.connect(adapter);\n\n    // Second connection should throw\n    expect(() => recorder.connect(adapter)).toThrow();\n  });\n});\n```\n\n## Mock Configuration\n\n### System Volume Testing\n\n```typescript\nimport { useSystemVolume, setMockSystemVolume, AudioManager } from 'react-native-audio-api/mock';\n\ndescribe('System Integration Tests', () => {\n  it('should mock system audio management', () => {\n    // Test system sample rate\n    const preferredRate = AudioManager.getDevicePreferredSampleRate();\n    expect(preferredRate).toBe(44100);\n\n    // Test volume management\n    setMockSystemVolume(0.7);\n    const currentVolume = useSystemVolume();\n    expect(currentVolume).toBe(0.7);\n\n    // Test event listeners\n    const volumeCallback = jest.fn();\n    const listener = AudioManager.addSystemEventListener(\n      'volumeChange',\n      volumeCallback\n    );\n\n    expect(listener.remove).toBeDefined();\n    listener.remove();\n  });\n});\n```\n\n### Audio Callback Testing\n\n```typescript\nimport { AudioRecorder } from 'react-native-audio-api/mock';\n\ndescribe('Callback Tests', () => {\n  it('should handle audio data callbacks', () => {\n    const recorder = new AudioRecorder();\n    const audioDataCallback = jest.fn();\n\n    const result = recorder.onAudioReady(\n      {\n        sampleRate: 44100,\n        bufferLength: 1024,\n        channelCount: 2,\n      },\n      audioDataCallback\n    );\n\n    expect(result.status).toBe('success');\n\n    // Test callback cleanup\n    recorder.clearOnAudioReady();\n    expect(() => recorder.clearOnAudioReady()).not.toThrow();\n  });\n});\n```\n\n## Type Safety\n\nThe mock implementation provides full TypeScript support with the same types as the real library:\n\n```typescript\nimport type { AudioContext, AudioParam, GainNode } from 'react-native-audio-api/mock';\n\n// All types are available and identical to the real implementation\nfunction processAudioNode(node: GainNode): void {\n  node.gain.value = 0.5;\n}\n```\n\n## Testing Best Practices\n\n1. **Isolate Audio Logic**: Test audio processing logic separately from UI components\n2. **Mock External Dependencies**: Use mocks for file system, network, and platform-specific operations\n3. **Test Error Scenarios**: Verify your code handles various error conditions gracefully\n4. **Validate Audio Graph Structure**: Ensure nodes are connected correctly\n5. **Test Async Operations**: Use proper async/await patterns for operations like rendering\n\n## Example Test Suite\n\n```typescript\nimport {\n  AudioContext,\n  AudioRecorder,\n  FileFormat,\n  decodeAudioData\n} from 'react-native-audio-api/mock';\n\ndescribe('Audio Application Tests', () => {\n  let context: AudioContext;\n\n  beforeEach(() => {\n    context = new AudioContext();\n  });\n\n  afterEach(() => {\n    // Clean up if needed\n    context.close();\n  });\n\n  describe('Audio Graph', () => {\n    it('should create complex audio processing chain', () => {\n      const oscillator = context.createOscillator();\n      const filter = context.createBiquadFilter();\n      const delay = context.createDelay();\n      const gainNode = context.createGain();\n\n      // Configure effects chain\n      filter.type = 'lowpass';\n      filter.frequency.value = 2000;\n      delay.delayTime.value = 0.3;\n      gainNode.gain.value = 0.8;\n\n      // Connect the chain\n      oscillator.connect(filter);\n      filter.connect(delay);\n      delay.connect(gainNode);\n      gainNode.connect(context.destination);\n\n      // Verify configuration\n      expect(filter.type).toBe('lowpass');\n      expect(delay.delayTime.value).toBe(0.3);\n      expect(gainNode.gain.value).toBe(0.8);\n    });\n  });\n\n  describe('File Operations', () => {\n    it('should handle audio file processing', async () => {\n      const mockAudioData = new ArrayBuffer(1024);\n\n      // Test audio decoding\n      const decodedBuffer = await decodeAudioData(mockAudioData);\n      expect(decodedBuffer.numberOfChannels).toBe(2);\n      expect(decodedBuffer.sampleRate).toBe(44100);\n    });\n  });\n});\n```\n\nThe mock implementation provides a complete testing environment that allows you to thoroughly test your audio applications without requiring real audio hardware or complex setup.\n"
  },
  {
    "path": "packages/audiodocs/docs/other/web-audio-api-coverage.mdx",
    "content": "---\nid: web-audio-api-coverage\nsidebar_label: Web Audio API coverage\nsidebar_position: 2\n---\n\n# [Web Audio API coverage](https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API)\n\n### Coverage table\n\n| Interface | Status | Remarks |\n| :-------: | :----: | :------ |\n| AnalyserNode | ✅ |\n| AudioBuffer | ✅ |\n| AudioBufferSourceNode | ✅ |\n| AudioDestinationNode | ✅ |\n| AudioNode | ✅ |\n| AudioParam | ✅ |\n| AudioScheduledSourceNode | ✅ |\n| BiquadFilterNode | ✅ |\n| ConstantSourceNode | ✅ |\n| ConvolverNode | ✅ |\n| DelayNode | ✅ |\n| GainNode | ✅ |\n| IIRFilterNode | ✅  |\n| OfflineAudioContext | ✅ |\n| OscillatorNode | ✅ |\n| PeriodicWave | ✅ |\n| StereoPannerNode | ✅ |\n| WaveShaperNode | ✅ |\n| AudioContext | 🚧 | Available props and methods: `close`, `suspend`, `resume` |\n| BaseAudioContext | 🚧 | Available props and methods: `currentTime`, `destination`, `sampleRate`, `state`, `decodeAudioData`, all create methods for available or partially implemented nodes |\n| AudioListener | ❌ |\n| AudioSinkInfo | ❌ |\n| AudioWorklet | ❌ |\n| AudioWorkletGlobalScope | ❌ |\n| AudioWorkletNode | ❌ |\n| AudioWorkletProcessor | ❌ |\n| ChannelMergerNode | ❌ |\n| ChannelSplitterNode | ❌ |\n| DynamicsCompressorNode | ❌ |\n| MediaElementAudioSourceNode | ❌ |\n| MediaStreamAudioDestinationNode | ❌ |\n| MediaStreamAudioSourceNode | ❌ |\n| PannerNode | ❌ |\n\n### Description\n\n✅ - Completed\n\n🚧 - Partially implemented\n\n❌ - Not yet available\n\n:::info\n\nIf you have a use case for any of not yet available interfaces,\ncontact us or [create issue](https://github.com/software-mansion/react-native-audio-api).\nWe will do our best to ship it as soon as possible!\n\n:::\n"
  },
  {
    "path": "packages/audiodocs/docs/react/_category_.json",
    "content": "{\n  \"label\": \"React\",\n  \"position\": 11,\n  \"link\": {\n    \"type\": \"generated-index\"\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/docs/react/select-input.mdx",
    "content": "---\nsidebar_position: 1\n---\n\nimport { IOS } from '@site/src/components/Badges';\n\n# useAudioInput\n\n<br />\n\nReact hook for managing audio input device selection and monitoring available audio input devices. Current input will be available after first activation of the audio session. Not all connected devices might be listed as available inputs, some might be filtered out as incompatible with current session configuration.\n\nThe `useAudioInput` hook provides an interface for:\n- Retrieving all available audio input devices\n- Getting the currently active input device\n- Switching between different input devices\n\n<IOS /> **Platform support:** Input device selection is currently only supported on iOS. On Android, `useAudioInput` is implemented as a no-op: the hook will not list or switch input devices, and any selection calls will effectively be ignored.\n\n## Usage\n\n```tsx\nimport React from 'react';\nimport { View, Text, Button } from 'react-native';\nimport { useAudioInput } from 'react-native-audio-api';\n\nfunction AudioInputSelector() {\n  const { availableInputs, currentInput, onSelectInput } = useAudioInput();\n\n  return (\n    <View>\n      <Text>Current Input: {currentInput?.name || 'None'}</Text>\n\n      {availableInputs.map((input) => (\n        <Button\n          key={input.id}\n          title={`${input.name} (${input.category})`}\n          onPress={() => onSelectInput(input)}\n        />\n      ))}\n    </View>\n  );\n}\n```\n\n## Return Value\n\nThe hook returns an object with the following properties:\n\n### `availableInputs: AudioDeviceInfo[]`\n\nAn array of all available audio input devices. Each device contains:\n- `id: string` - Unique device identifier\n- `name: string` - Human-readable device name\n- `category: string` - Device category (e.g., \"Built-In Microphone\", \"Bluetooth\")\n\n### `currentInput: AudioDeviceInfo | null`\n\nThe currently active audio input device, or `null` if no device is selected.\n\n### `onSelectInput: (device: AudioDeviceInfo) => Promise<void>`\n\nFunction to programmatically select an audio input device. Takes an `AudioDeviceInfo` object and attempts to set it as the active input device.\n\n## Related\n\n- [AudioManager](/docs/system/audio-manager) - For managing audio sessions and permissions\n- [AudioRecorder](/docs/inputs/audio-recorder) - For capturing audio from the selected input device\n\n"
  },
  {
    "path": "packages/audiodocs/docs/sources/_category_.json",
    "content": "{\n  \"label\": \"Sources\",\n  \"position\": 3,\n  \"link\": {\n    \"type\": \"generated-index\"\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/docs/sources/audio-buffer-base-source-node.mdx",
    "content": "---\nsidebar_position: 3\n---\n\nimport { MobileOnly } from '@site/src/components/Badges';\n\n# AudioBufferBaseSourceNode\n\nThe `AudioBufferBaseSourceNode` interface is an [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node) which aggregates behavior of nodes that requires [`AudioBuffer`](/docs/sources/audio-buffer).\n\nChild classes:\n - [`AudioBufferSourceNode`](/docs/sources/audio-buffer-source-node)\n - [`AudioBufferQueueSourceNode`](/docs/sources/audio-buffer-queue-source-node)\n\n## Properties\n\nIt inherits all properties from [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node#properties).\n\n| Name | Type | Description |\n| :----: | :----: | :-------- |\n| `detune` | [`AudioParam`](/docs/core/audio-param) | [`k-rate`](/docs/core/audio-param#a-rate-vs-k-rate) `AudioParam` representing detuning of oscillation in cents. |\n| `playbackRate` | [`AudioParam`](/docs/core/audio-param) | [`k-rate`](/docs/core/audio-param#a-rate-vs-k-rate) `AudioParam` defining speed factor at which the audio will be played. |\n\n## Methods\n\nIt inherits all methods from [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node#methods).\n\n### `getLatency`\n\nReturns the playback latency introduced by the pitch correction algorithm, in seconds.\nWhen scheduling precise playback times, start input samples this many seconds earlier to compensate for processing delay.\nTypically around `0.06s` when pitch correction is enabled, and `0` otherwise.\n\n#### Returns `number`.\n\n<details>\n<summary>Example usage</summary>\n```tsx\nconst source = audioContext.createBufferSource({ pitchCorrection: true });\nsource.buffer = buffer;\nsource.connect(audioContext.destination);\n\nconst latency = source.getLatency();\n\n// Schedule playback slightly earlier to compensate for latency\nconst startTime = audioContext.currentTime + 1.0; // play in 1 second\nsource.start(startTime - latency);\n```\n</details>\n\n\n## Events\n\n### `onPositionChanged` <MobileOnly />\n\nAllow to set (or remove) callback that will be fired after processing certain part of an audio.\nFrequency is defined by `onPositionChangedInterval`. By setting this callback you can achieve pause functionality.\nYou can remove callback by passing `null`.\n\n### `onPositionChangedInterval` <MobileOnly />\n\nAllow to set frequency for `onPositionChanged` event. Value that can be set is around `1000/x` Hz.\n\n```ts\nimport { AudioContext, AudioBufferSourceNode } from 'react-native-audio-api';\n\nfunction App() {\n    const ctx = new AudioContext();\n    const sourceNode = ctx.createBufferSource();\n    sourceNode.buffer = null; //set your buffer\n    let offset = 0;\n\n    sourceNode.onPositionChanged = (event) => { //setting callback\n        this.offset = event.value;\n    };\n\n    sourceNode.onPositionChangedInterval = 100; //setting frequency to ~10Hz\n\n    sourceNode.start();\n}\n```\n\n## Remarks\n\n#### `detune`\n- Default value is 0.0.\n- Nominal range is -∞ to ∞.\n- For example value of 100 detune the source up by one semitone, whereas -1200 down by one octave.\n- When `createBufferSource(true)` it is clamped to range -1200 to 1200.\n\n#### `playbackRate`\n- Default value is 1.0.\n- Nominal range is -∞ to ∞.\n- For example value of 1.0 plays audio at normal speed, whereas value of 2.0 plays audio twice as fast as normal speed.\n- When created with `createBufferSource(true)` it is clamped to range 0 to 3 and uses pitch correction algorithm.\n"
  },
  {
    "path": "packages/audiodocs/docs/sources/audio-buffer-queue-source-node.mdx",
    "content": "---\nsidebar_position: 5\nsidebar_label: AudioBufferQueueSourceNode\n---\n\nimport { Optional, Experimental, Overridden, MobileOnly } from '@site/src/components/Badges';\n\n# AudioBufferQueueSourceNode <MobileOnly />\n\nThe `AudioBufferQueueSourceNode` is an [`AudioBufferBaseSourceNode`](/docs/sources/audio-buffer-base-source-node) which represents player that consists of many short buffers.\n\n## Constructor\n\n[`BaseAudioContext.createBufferQueueSource(options: AudioBufferBaseSourceNodeOptions)`](/docs/core/base-audio-context#createbufferqueuesource-)\n\n```jsx\ninterface AudioBufferBaseSourceNodeOptions {\n  pitchCorrection: boolean // specifies if pitch correction algorithm has to be available\n}\n```\n\n:::caution\nThe pitch correction algorithm introduces processing latency.\nAs a result, when scheduling precise playback times, you should start input samples slightly ahead of the intended playback time.\nFor more details, see [getLatency()](/docs/sources/audio-buffer-base-source-node#getlatency).\n:::\n\n## Example\n\n```tsx\nimport React, { useRef } from 'react';\nimport {\n  AudioContext,\n  AudioBufferQueueSourceNode,\n} from 'react-native-audio-api';\n\nfunction App() {\n    const audioContextRef = useRef<AudioContext | null>(null);\n    if (!audioContextRef.current) {\n        audioContextRef.current = new AudioContext();\n    }\n    const audioBufferQueue = audioContextRef.current.createBufferQueueSource();\n    const buffer1 = ...; // Load your audio buffer here\n    const buffer2 = ...; // Load another audio buffer if needed\n    audioBufferQueue.enqueueBuffer(buffer1);\n    audioBufferQueue.enqueueBuffer(buffer2);\n    audioBufferQueue.connect(audioContextRef.current.destination);\n    audioBufferQueue.start(audioContextRef.current.currentTime);\n}\n```\n\n## Properties\n\n`AudioBufferQueueSourceNode` does not define any additional properties.\nIt inherits all properties from [`AudioBufferBaseSourceNode`](/docs/sources/audio-buffer-base-source-node#properties).\n\n## Methods\n\nIt inherits all methods from [`AudioBufferBaseSourceNode`](/docs/sources/audio-buffer-base-source-node#methods).\n\n### `enqueueBuffer`\n\nAdds another buffer to queue. Returns `bufferId` that can be used to identify the buffer in [`onBufferEnded`](audio-buffer-queue-source-node#onbufferended) event.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `buffer` | [`AudioBuffer`](/docs/sources/audio-buffer) | Buffer with next data. |\n\n#### Returns `string`.\n\n### `dequeueBuffer`\n\nRemoves a buffer from the queue. Note that [`onBufferEnded`](audio-buffer-queue-source-node#onbufferended) event will not be fired for buffers that were removed.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `bufferId` | `string` | ID of the buffer to remove from the queue. It should be valid id provided by `enqueueBuffer` method. |\n\n#### Returns `undefined`.\n\n### `clearBuffers`\n\nRemoves all buffers from the queue. Note that [`onBufferEnded`](audio-buffer-queue-source-node#onbufferended) event will not be fired for buffers that were removed.\n\n#### Returns `undefined`.\n\n### `start` <Overridden /> {#start}\n\nSchedules the `AudioBufferQueueSourceNode` to start playback of enqueued [`AudioBuffers`](/docs/sources/audio-buffer), or starts to play immediately.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `when` <Optional /> | `number` | The time, in seconds, at which playback is scheduled to start. If `when` is less than [`AudioContext.currentTime`](/docs/core/base-audio-context#properties) or set to 0, the node starts playing immediately. <br /> Default: `0`. |\n| `offset` <Optional /> | `number` | The position, in seconds, within the first enqueued audio buffer where playback begins. <br /> The default value is `0`, which starts playback from the beginning of the first enqueued buffer. If the offset exceeds the buffer’s [`duration`](/docs/sources/audio-buffer#properties), it’s automatically clamped to the valid range. |\n\n\n### `pause`\n\nStops audio immediately. Unlike [`stop()`](/docs/sources/audio-scheduled-source-node#stop), which fully stops playback and clears the queued buffers,\npause() halts the audio while keeping the current playback position, allowing you to resume from the same point later.\n\n#### Returns `undefined`.\n\n## Events\n\n### `onBufferEnded`\n\nSets (or remove) callback that will be fired when a specific buffer has ended with payload of type [`OnBufferEndEventType`](audio-buffer-queue-source-node#onbufferendeventtype)\n\nYou can remove callback by passing `null`.\n\n```ts\naudioBufferQueueSourceNode.onBufferEnded = (event) => { //setting callback\n  console.log(`buffer with id {event.bufferId} ended`);\n\n  if (event.isLastBufferInQueue) {\n    console.log('That was the last buffer in the queue');\n  }\n};\n```\n\n## Remarks\n\n### `OnBufferEndEventType`\n\n<details>\n<summary>Type definitions</summary>\n```typescript\ninterface OnBufferEndEventType {\n  bufferId: string; // the ID of the buffer that has ended\n  isLastBufferInQueue: boolean; // a boolean indicating whether it was the last buffer in the queue\n}\n```\n</details>\n"
  },
  {
    "path": "packages/audiodocs/docs/sources/audio-buffer-source-node.mdx",
    "content": "---\nsidebar_position: 4\n---\n\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\nimport { Optional, Overridden } from '@site/src/components/Badges';\n\nimport InteractivePlayground from '@site/src/components/InteractivePlayground';\nimport { useAudioBufferSourcePlayground } from '@site/src/components/InteractivePlayground/AudioBufferSourceExample/useAudioBufferSourcePlayground';\nimport { useGainAdsrPlayground } from '@site/src/components/InteractivePlayground/GainAdsrExample/useGainAdsrPlayground';\n\n\n# AudioBufferSourceNode\n\nThe `AudioBufferSourceNode` is an [`AudioBufferBaseSourceNode`](/docs/sources/audio-buffer-base-source-node) which represents audio source with in-memory audio data, stored in\n[`AudioBuffer`](/docs/sources/audio-buffer). You can use it for audio playback, including standard pause and resume functionalities.\n\nAn `AudioBufferSourceNode` can be started only once, so if you want to play the same sound again you have to create a new one.\nHowever, this node is very inexpensive to create, and what is crucial you can reuse same [`AudioBuffer`](/docs/sources/audio-buffer).\n\n<InteractivePlayground tag=\"AudioBufferSourceNode\" usePlayground={useAudioBufferSourcePlayground} />\n\n## Constructor\n\n[`BaseAudioContext.createBufferSource(options: AudioBufferBaseSourceNodeOptions)`](/docs/core/base-audio-context#createbuffersource)\n\n```jsx\ninterface AudioBufferBaseSourceNodeOptions {\n  pitchCorrection: boolean // specifies if pitch correction algorithm has to be available\n}\n```\n\n:::caution\nThe pitch correction algorithm introduces processing latency.\nAs a result, when scheduling precise playback times, you should start input samples slightly ahead of the intended playback time.\nFor more details, see [getLatency()](/docs/sources/audio-buffer-base-source-node#getlatency).\n\nIf you plan to play multiple buffers one after another, consider using [AudioBufferQueueSourceNode](/docs/sources/audio-buffer-queue-source-node)\n:::\n\n## Example\n\n```tsx\nimport React, { useEffect, useRef, FC } from 'react';\nimport {\n  AudioContext,\n  AudioBufferSourceNode,\n} from 'react-native-audio-api';\n\nfunction App() {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  if (!audioContextRef.current) {\n    audioContextRef.current = new AudioContext();\n  }\n  const audioBufferSource = audioContextRef.current.createBufferSource();\n  const buffer = ...; // Load your audio buffer here\n  audioBufferSource.buffer = buffer;\n  audioBufferSource.connect(audioContextRef.current.destination);\n  audioBufferSource.start(audioContextRef.current.currentTime);\n}\n```\n\n## Properties\n\nIt inherits all properties from [`AudioBufferBaseSourceNode`](/docs/sources/audio-buffer-base-source-node#properties).\n\n<AudioNodePropsTable numberOfInputs={0} numberOfOutputs={1} channelCount=\"defined by associated buffer\" channelCountMode=\"max\" channelInterpretation=\"speakers\" />\n\n| Name | Type | Description |\n| :----: | :----: | :-------- |\n| `buffer` | [`AudioBuffer`](/docs/sources/audio-buffer) | Associated `AudioBuffer`. |\n| `loop` | `boolean` | Boolean indicating if audio data must be replayed after when end of the associated `AudioBuffer` is reached. |\n| `loopSkip` | `boolean` | Boolean indicating if upon setting up `loopStart` we want to skip immediately to the loop start. |\n| `loopStart` | `number` | Float value indicating the time, in seconds, at which playback of the audio must begin, if loop is true. |\n| `loopEnd` | `number` | Float value indicating the time, in seconds, at which playback of the audio must end and loop back to `loopStart`, if loop is true. |\n\n## Methods\n\nIt inherits all methods from [`AudioBufferBaseSourceNode`](/docs/sources/audio-buffer-base-source-node#methods).\n\n### `start` <Overridden /> {#start}\n\nSchedules the `AudioBufferSourceNode` to start playback of audio data contained in the associated [`AudioBuffer`](/docs/sources/audio-buffer), or starts to play immediately.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `when` <Optional /> | `number` | The time, in seconds, at which playback is scheduled to start. If `when` is less than [`AudioContext.currentTime`](/docs/core/base-audio-context#properties) or set to 0, the node starts playing immediately. <br /> Default: `0`. |\n| `offset` <Optional /> | `number` | The position, in seconds, within the audio buffer where playback begins. <br /> The default value is `0`, which starts playback from the beginning of the buffer. If the offset exceeds the buffer’s [`duration`](/docs/sources/audio-buffer#properties) (or the defined [`loopEnd`](/docs/sources/audio-buffer-source-node#properties) value), it’s automatically clamped to the valid range. <br /> Offsets are calculated using the buffer’s natural sample rate rather than the current playback rate — so even if the sound is played at double speed, halfway through a 10-second buffer is still 5 seconds. |\n| `duration` <Optional /> | `number` | The playback duration, in seconds. If not provided, playback continues until the sound ends naturally or is manually stopped with [`stop() method`](/docs/sources/audio-scheduled-source-node#stop). <br /> Equivalent to calling `start(when, offset)` followed by `stop(when + duration)`. |\n\n\n#### Errors:\n\n| Error type | Description |\n| :---: | :---- |\n| `RangeError` | `when` is negative number. |\n| `RangeError` | `offset` is negative number. |\n| `RangeError` | `duration` is negative number. |\n| `InvalidStateError` | If node has already been started once. |\n\n#### Returns `undefined`.\n\n\n## Events\n\n### `onLoopEnded`\n\nSets (or remove) callback that will be fired when buffer source node reached the end of the loop and is looping back to `loopStart`.\nYou can remove callback either by passing `null` or calling `remove` on the returned subscription.\n\n```ts\nconst subscription = audioBufferSourceNode.onLoopEnded = () => { // setting the callback\n  console.log(\"loop ended\");\n};\n\nsubscription.remove(); // removal of the subscription\n```\n\n## Remarks\n\n#### `buffer`\n- If is null, it outputs a single channel of silence (all samples are equal to 0).\n\n#### `loop`\n- Default value is false.\n\n#### `loopStart`\n- Default value is 0.\n\n#### `loopEnd`\n- Default value is `buffer.duration`.\n\n#### `playbackRate`\n- Default value is 1.0.\n- Nominal range is -∞ to ∞.\n- For example value of 1.0 plays audio at normal speed, whereas value of 2.0 plays audio twice as fast as normal speed.\n- When created with `createBufferSource(true)` it is clamped to range 0 to 3 and uses pitch correction algorithm.\n"
  },
  {
    "path": "packages/audiodocs/docs/sources/audio-buffer.mdx",
    "content": "---\nsidebar_position: 1\n---\n\nimport { ReadOnly, Optional } from '@site/src/components/Badges';\n\n# AudioBuffer\n\nThe `AudioBuffer` interface represents a short audio asset, commonly shorter then one minute.\nIt can consists of one or more channels, each one appearing to be 32-bit floating-point linear [PCM](https://en.wikipedia.org/wiki/Pulse-code_modulation) values with a nominal range of [−1, 1] (but not limited to that range),\nspecific sample rate which is the quantity of frames that will play in one second and length.\n\n![](/img/audioBuffer.png)\n\nIt can be created from audio file using [`decodeAudioData`](/docs/utils/decoding#decodeaudiodata) or from raw data using `constructor`.\nOnce you have data in `AudioBuffer`, audio can be played by passing it to [`AudioBufferSourceNode`](audio-buffer-source-node).\n\n## Constructor\n\n```tsx\nconstructor(options: AudioBufferOptions)\n```\n\n### `AudioBufferOptions`\n\n| Parameter | Type | Default | Description |\n| :---: | :---: | :----: | :---- |\n| `length` | `number` | - | [`Length`](/docs/sources/audio-buffer#properties) of the buffer |\n| `numberOfChannels` <Optional /> | `number` | 1.0 | Number of [`channels`](/docs/sources/audio-buffer#properties) in buffer |\n| `sampleRate` | `number` | - | [`Sample rate`](/docs/sources/audio-buffer#properties) of the buffer in Hz |\n\nOr by using `BaseAudioContext` factory method:\n[`BaseAudioContext.createBuffer(numChannels, length, sampleRate)`](/docs/core/base-audio-context#createbuffer) that creates buffer with default values.\n\n## Decoding\n\nSee example implementations in [`BaseAudioContext`](/docs/core/base-audio-context#decodeaudiodata) on how to decode data in various ways.\n\n## Properties\n\n| Name | Type | Description | |\n| :----: | :----: | :-------- | :-: |\n| `sampleRate` | `number` | Float value representing sample rate of the PCM data stored in the buffer. | <ReadOnly /> |\n| `length` | `number` | Integer value representing length of the PCM data stored in the buffer. | <ReadOnly /> |\n| `duration` | `number` | Double value representing duration, in seconds, of the PCM data stored in the buffer. | <ReadOnly /> |\n| `numberOfChannels` | `number` | Integer value representing the number of audio channels of the PCM data stored in the buffer. | <ReadOnly /> |\n\n## Methods\n\n### `getChannelData`\n\nGets modifiable array with PCM data from given channel.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `channel` | `number` | Index of the `AudioBuffer's` channel, from which data will be returned. |\n\n#### Errors:\n\n| Error type | Description |\n| :---: | :---- |\n| `IndexSizeError` | `channel` specifies unexisting audio channel. |\n\n#### Returns `Float32Array`.\n\n### `copyFromChannel`\n\nCopies data from given channel of the `AudioBuffer` to an array.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `destination` | `Float32Array` | The array to which data will be copied. |\n| `channelNumber` | `number` | Index of the `AudioBuffer's` channel, from which data will be copied. |\n| `startInChannel` <Optional /> | `number` | Channel's offset from which to start copying data. |\n\n#### Errors:\n\n| Error type | Description |\n| :---: | :---- |\n| `IndexSizeError` | `channelNumber` specifies unexisting audio channel. |\n| `IndexSizeError` | `startInChannel` is greater then the `AudioBuffer` length. |\n\n#### Returns `undefined`.\n\n### `copyToChannel`\n\nCopies data from given array to specified channel of the `AudioBuffer`.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `source` | `Float32Array` | The array from which data will be copied. |\n| `channelNumber` | `number` | Index of the `AudioBuffer's` channel to which data will be copied. |\n| `startInChannel` <Optional /> | `number` | Channel's offset from which to start copying data. |\n\n#### Errors:\n\n| Error type | Description |\n| :---: | :---- |\n| `IndexSizeError` | `channelNumber` specifies unexisting audio channel. |\n| `IndexSizeError` | `startInChannel` is greater then the `AudioBuffer` length. |\n\n#### Returns `undefined`.\n"
  },
  {
    "path": "packages/audiodocs/docs/sources/audio-scheduled-source-node.mdx",
    "content": "---\nsidebar_position: 2\n---\n\nimport { Optional, Experimental } from '@site/src/components/Badges';\n\n# AudioScheduledSourceNode\n\nThe `AudioScheduledSourceNode` interface is an [`AudioNode`](/docs/core/audio-node) which serves as a parent interface for several types of audio source nodes.\nIt provides ability to start and stop audio playback.\n\nChild classes:\n - [`AudioBufferBaseSourceNode`](/docs/sources/audio-buffer-base-source-node)\n - [`OscillatorNode`](/docs/sources/oscillator-node)\n - [`StreamerNode`](/docs/sources/streamer-node)\n\n## Properties\n\n`AudioScheduledSourceNode` does not define any additional properties.\nIt inherits all properties from [`AudioNode`](/docs/core/audio-node#properties).\n\n## Methods\nIt inherits all methods from [`AudioNode`](/docs/core/audio-node#methods).\n\n### `start`\n\nSchedules the node to start audio playback at specified time. If no time is given, it starts immediately.\nYou can invoke this method only once in node's life.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `when` | `number` | The time, in seconds, at which the node will start to play. |\n\n#### Errors:\n\n| Error type | Description |\n| :---: | :---- |\n| `RangeError` | `when` is negative number. |\n| `InvalidStateError` | If node has already been started once. |\n\n#### Returns `undefined`.\n\n### `stop`\n\nSchedules the node to stop audio playback at specified time. If no time is given, it stops immediately.\nIf you invoke this method multiple times on the same node before the designated stop time, the most recent call overwrites previous one.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `when` | `number` | The time, in seconds, at which the node will stop playing. |\n\n#### Errors:\n\n| Error type | Description |\n| :---: | :---- |\n| `RangeError` | `when` is negative number. |\n| `InvalidStateError` | If node has not been started yet. |\n\n#### Returns `undefined`.\n\n## Events\n\n### `onEnded`\n\nSets (or remove) callback that will be fired when source node has stopped playing,\neither because it's reached a predetermined stop time, the full duration of the audio has been performed, or because the entire buffer has been played.\nYou can remove callback either by passing `null` or calling `remove` on the returned subscription.\n\n\n```ts\nconst subscription = audioBufferSourceNode.onEnded = () => { // setting the callback\n  console.log(\"audio ended\");\n};\n\nsubscription.remove(); // removal of the subscription\n```\n"
  },
  {
    "path": "packages/audiodocs/docs/sources/constant-source-node.mdx",
    "content": "---\nsidebar_position: 6\n---\n\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\nimport { Optional, ReadOnly } from '@site/src/components/Badges';\n\n# ConstantSourceNode\n\nThe `ConstantSourceNode` is an [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node) which represents an audio source, that outputs a single constant value.\nThe `offset` parameter controls this value. Although the node is called \"constant\" its `offset` value can be automated to change over time, which makes it powerful tool\nfor controlling multiple other [`AudioParam`](/docs/core/audio-param) values in an audio graph.\nJust like `AudioScheduledSourceNode`, it can be started only once.\n\n## Constructor\n\n```tsx\nconstructor(context: BaseAudioContext, options?: ConstantSourceOptions)\n```\n\n### `ConstantSourceOptions`\n\n| Parameter | Type | Default | |\n| :---: | :---: | :----: | :---- |\n| `offset` <Optional /> | `number` | 1 | Initial value for [`offset`](/docs/sources/constant-source-node#properties) |\n\nOr by using `BaseAudioContext` factory method:\n[`BaseAudioContext.createConstantSource()`](/docs/core/base-audio-context#createconstantsource) that creates node with default values.\n\n## Example\n\n```tsx\nimport React, { useRef } from 'react';\nimport { Text } from 'react-native';\nimport {\n  AudioContext,\n  OscillatorNode,\n  GainNode,\n  ConstantSourceNode\n} from 'react-native-audio-api';\n\nfunction App() {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  if (!audioContextRef.current) {\n    audioContextRef.current = new AudioContext();\n  }\n  const audioContext = audioContextRef.current;\n\n  const oscillator1 = audioContext.createOscillator();\n  const oscillator2 = audioContext.createOscillator();\n  const gainNode1 = audioContext.createGain();\n  const gainNode2 = audioContext.createGain();\n  const constantSource = audioContext.createConstantSource();\n\n  oscillator1.frequency.value = 440;\n  oscillator2.frequency.value = 392;\n  constantSource.offset.value = 0.5;\n\n  oscillator1.connect(gainNode1);\n  gainNode1.connect(audioContext.destination);\n\n  oscillator2.connect(gainNode2);\n  gainNode2.connect(audioContext.destination);\n\n  // We connect the constant source to the gain nodes gain AudioParams\n  // to control both of them at the same time\n  constantSource.connect(gainNode1.gain);\n  constantSource.connect(gainNode2.gain);\n\n  oscillator1.start(audioContext.currentTime);\n  oscillator2.start(audioContext.currentTime);\n  constantSource.start(audioContext.currentTime);\n}\n```\n\n## Properties\n\nIt inherits all properties from [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node#properties).\n\n<AudioNodePropsTable numberOfInputs={0} numberOfOutputs={1} channelCount={2} channelCountMode=\"max\" channelInterpretation=\"speakers\" />\n\n| Name | Type | Default value | Description |\n| :----: | :----: | :--------: | :------- |\n| `offset` <ReadOnly /> | [`AudioParam`](/docs/core/audio-param) | 1.0 |[`a-rate`](/docs/core/audio-param#a-rate-vs-k-rate) `AudioParam` representing the value which the node constantly outputs. |\n\n## Methods\n\nIt inherits all methods from [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node#methods).\n"
  },
  {
    "path": "packages/audiodocs/docs/sources/oscillator-node.mdx",
    "content": "---\nsidebar_position: 6\n---\n\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\nimport { Optional, ReadOnly } from '@site/src/components/Badges';\n\nimport InteractivePlayground from '@site/src/components/InteractivePlayground';\nimport { useOscillatorPlayground } from '@site/src/components/InteractivePlayground/OscillatorExample/useOscilatorPlayground';\n\n# OscillatorNode\n\nThe `OscillatorNode` is an [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node) which represents a simple periodic wave signal.\nSimilar to all of `AudioScheduledSourceNodes`, it can be started only once. If you want to play the same sound again you have to create a new one.\n\n<InteractivePlayground tag=\"OscillatorNode\" usePlayground={useOscillatorPlayground} />\n\n## Constructor\n\n```tsx\nconstructor(context: BaseAudioContext, options?: OscillatorOptions)\n```\n\n### `OscillatorOptions`\n\nInherits all properties from [`AudioNodeOptions`](/docs/core/audio-node#audionodeoptions)\n\n| Parameter | Type | Default | |\n| :---: | :---: | :----: | :---- |\n| `type` <Optional /> | [`OscillatorType`](/docs/types/oscillator-type) | `sine` | Initial value for [`type`](/docs/sources/oscillator-node#properties). |\n| `frequency` <Optional /> | `number` | 440 | Initial value for [`frequency`](/docs/sources/oscillator-node#properties). |\n| `detune` <Optional /> | `number` | 0 | Initial value for [`detune`](/docs/sources/oscillator-node#properties). |\n\nOr by using `BaseAudioContext` factory method:\n[`BaseAudioContext.createOscillator()`](/docs/core/base-audio-context#createoscillator)\n\n## Example\n\n```tsx\nimport React, { useRef } from 'react';\nimport {\n  AudioContext,\n  OscillatorNode,\n} from 'react-native-audio-api';\n\nfunction App() {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  if (!audioContextRef.current) {\n    audioContextRef.current = new AudioContext();\n  }\n  const oscillator = audioContextRef.current.createOscillator();\n  oscillator.connect(audioContextRef.current.destination);\n  oscillator.start(audioContextRef.current.currentTime);\n}\n```\n\n## Properties\n\nIt inherits all properties from [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node#properties).\n\n<AudioNodePropsTable numberOfInputs={0} numberOfOutputs={1} channelCount={2} channelCountMode=\"max\" channelInterpretation=\"speakers\" />\n\n| Name | Type | Default value | Description |\n| :----: | :----: | :-------- | :------- |\n| `detune` <ReadOnly /> | [`AudioParam`](/docs/core/audio-param) | 0 |[`a-rate`](/docs/core/audio-param#a-rate-vs-k-rate) `AudioParam` representing detuning of oscillation in cents. |\n| `frequency` <ReadOnly /> | [`AudioParam`](/docs/core/audio-param) | 440 | [`a-rate`](/docs/core/audio-param#a-rate-vs-k-rate) `AudioParam` representing frequency of wave in herzs. |\n| `type` | [`OscillatorType`](/docs/types/oscillator-type)| `sine` | String value represening type of wave. |\n\n## Methods\n\nIt inherits all methods from [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node#methods).\n\n### `setPeriodicWave`\n\nSets any periodic wave.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `wave` | [`PeriodicWave`](/docs/effects/periodic-wave) | Data representing custom wave. [`See for reference`](/docs/core/base-audio-context#createperiodicwave) |\n\n#### Returns `undefined`.\n\n## Remarks\n\n#### `detune`\n- Nominal range is: -∞ to ∞.\n- For example value of 100 detune the source up by one semitone, whereas -1200 down by one octave.\n\n#### `frequency`\n- 440 Hz is equivalent to piano note A4.\n- Nominal range is: $-\\frac{\\text{sampleRate}}{2}$ to $\\frac{\\text{sampleRate}}{2}$\n(`sampleRate` value is taken from [`AudioContext`](/docs/core/base-audio-context#properties))\n"
  },
  {
    "path": "packages/audiodocs/docs/sources/recorder-adapter-node.mdx",
    "content": "---\nsidebar_position: 6\n---\n\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\nimport { Optional, ReadOnly } from '@site/src/components/Badges';\n\n# RecorderAdapterNode\n\nThe `RecorderAdapterNode` is an [`AudioNode`](/docs/core/audio-node) which is an adapter for [`AudioRecorder`](/docs/inputs/audio-recorder).\nIt lets you compose audio input from recorder into an audio graph.\n\n## Constructor\n\n```tsx\nconstructor(context: BaseAudioContext)\n```\n\nOr by using `BaseAudioContext` factory method:\n[`BaseAudioContext.createRecorderAdapter()`](/docs/core/base-audio-context#createrecorderadapter)\n\n## Example\n\n```tsx\nconst recorder = new AudioRecorder({\n    sampleRate: 48000,\n    bufferLengthInSamples: 48000,\n});\nconst audioContext = new AudioContext({ sampleRate: 48000 });\nconst recorderAdapterNode = aCtxRef.current.createRecorderAdapter();\n\nrecorder.connect(recorderAdapterNode);\nrecorderAdapterNode.connect(audioContext.destination)\n```\n\n## Properties\n\n`RecorderAdapterNode` does not define any additional properties.\nIt inherits all properties from [`AudioNode`](/docs/core/audio-node#properties).\n\n## Methods\n\n`RecorderAdapterNode` does not define any additional methods.\nIt inherits all methods from [`AudioNode`](/docs/core/audio-node#methods).\n\n## Remarks\n- Adapter without a connected recorder will produce silence.\n- Adapter connected only to a recorder will function correctly and keep a small buffer of recorded data.\n- Adapter will not be garbage collected as long as it remains connected to either a destination or a recorder.\n"
  },
  {
    "path": "packages/audiodocs/docs/sources/streamer-node.mdx",
    "content": "---\nsidebar_position: 7\n---\n\nimport AudioNodePropsTable from \"@site/src/components/AudioNodePropsTable\"\nimport { Optional, ReadOnly } from '@site/src/components/Badges';\n\n# StreamerNode\n\n:::caution\nMobile only.\n:::\n\nThe `StreamerNode` is an [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node) which represents a node that can decode and play [Http Live Streaming](https://developer.apple.com/streaming/) data.\nSimilar to all of `AudioScheduledSourceNodes`, it can be started only once. If you want to play the same sound again you have to create a new one.\n\n#### [`AudioNode`](/docs/core/audio-node#properties) properties\n\n## Constructor\n\n```tsx\nconstructor(context: BaseAudioContext, options: StreamerOptions)\n```\n\n### `StreamerOptions`\n\n| Parameter | Type | Default | |\n| :---: | :---: | :----: | :---- |\n| `streamPath` | `string` | - | Value for [`streamPath`](/docs/sources/streamer-node#properties) |\n\nOr by using `BaseAudioContext` factory method:\n\n[`BaseAudioContext.createStreamer()`](/docs/core/base-audio-context#createstreamer-).\n\n## Example\n\n```tsx\nimport React, { useRef } from 'react';\nimport {\n  AudioContext,\n  StreamerNode,\n} from 'react-native-audio-api';\n\nfunction App() {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  if (!audioContextRef.current) {\n    audioContextRef.current = new AudioContext();\n  }\n  const streamer = audioContextRef.current.createStreamer();\n  streamer.initialize('link/to/your/hls/source');\n  streamer.connect(audioContextRef.current.destination);\n  streamer.start(audioContextRef.current.currentTime);\n}\n```\n\n## Properties\n\nIt inherits all properties from [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node#properties).\n\n<AudioNodePropsTable numberOfInputs={0} numberOfOutputs={1} channelCount=\"defined by underlying buffer\" channelCountMode=\"max\" channelInterpretation=\"speakers\" />\n\n\n| Name | Type | Description |\n| :----: | :----: | :------- |\n| `streamPath` <ReadOnly /> | `string` | String value representing url to stream. |\n\n## Methods\nIt inherits all methods from [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node#methods).\n"
  },
  {
    "path": "packages/audiodocs/docs/system/_category_.json",
    "content": "{\n    \"label\": \"System\",\n    \"position\": 6,\n    \"link\": {\n      \"type\": \"generated-index\"\n    }\n  }\n  "
  },
  {
    "path": "packages/audiodocs/docs/system/audio-manager.mdx",
    "content": "---\nsidebar_position: 1\n---\n\nimport { Optional, ReadOnly, IOS, Experimental } from '@site/src/components/Badges';\n\n# AudioManager\n\nThe `AudioManager` is a layer of an abstraction between user and a system.\nIt provides a set of system-specific functions that are invoked directly in native code, by related system.\n\n## Example\n\n```tsx\nimport { AudioManager } from 'react-native-audio-api';\nimport { useEffect } from 'react';\n\nfunction App() {\n    // set AVAudioSession example options (iOS)\n    AudioManager.setAudioSessionOptions({\n      iosCategory: 'playback',\n      iosMode: 'default',\n      iosOptions: ['allowBluetoothHFP', 'allowAirPlay'],\n    })\n    // enabling emission of events\n    AudioManager.observeAudioInterruptions(true);\n    AudioManager.getDevicesInfo().then(console.log);\n\n  useEffect(() => {\n    // callback to be invoked on 'interruption' event\n    const interruptionSubscription = AudioManager.addSystemEventListener(\n      'interruption',\n      (event) => {\n        console.log('Interruption event:', event);\n      }\n    );\n\n    return () => {\n      interruptionSubscription?.remove();\n    };\n  }, []);\n}\n```\n\n## Methods\n\n### `setAudioSessionOptions` <IOS />\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| options | [`SessionOptions`](/docs/system/audio-manager#sessionoptions) | Options to be set for [AVAudioSession](https://developer.apple.com/documentation/avfaudio/avaudiosession?language=objc#Configuring-standard-audio-behaviors) |\n\n#### Returns `undefined`\n\n### `setAudioSessionActivity` <IOS />\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| enabled | `boolean` | It is used to set/unset [AVAudioSession](https://developer.apple.com/documentation/avfaudio/avaudiosession?language=objc#Activating-the-audio-configuration) activity |\n\n#### Returns promise of `boolean` type, which is resolved to `true` if invokation ended with success, `false` otherwise.'\n\n### `disableSessionManagement` <IOS />\n\n#### Returns `undefined`.\n\nDisables all internal default [AVAudioSession](https://developer.apple.com/documentation/avfaudio/avaudiosession) configurations and management done by the `react-native-audio-api` package. After calling this method, user is responsible for managing audio session entirely on their own.\nTypical use-case for this method is when user wants to fully control audio session outside of `react-native-audio-api` package,\ncommonly when using another audio library along `react-native-audio-api`. The method has to be called before `AudioContext` is created, for example in app initialization code.\nAny later call to `setAudioSessionOptions` or `setAudioSessionActivity` will re-enable internal audio session management.\n\n### `getDevicePreferredSampleRate`\n\n#### Returns `number`.\n\n### `observeAudioInterruptions`\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `param` |  [`AudioFocusType`](audio-manager#audiofocustype) \\| `boolean` \\| `null` | It is used to enable/disable observing audio interruptions. Passing `false` or `null` disables the observation, otherwise it is enabled. |\n\n:::info\nOn android passing the audio focus type set the native [audio focus](https://developer.android.com/media/optimize/audio-focus) accordingly.\nIt is recommended for apps to respect the rules for good user experience.\nOn iOS it just enables/disables event emission and has no additional effects.\n:::\n\n#### Returns `undefined`\n\n### `activelyReclaimSession` <IOS /> <Experimental />\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `enabled` | `boolean` | It is used to enable/disable session spoofing |\n\n#### Returns `undefined`\n\nMore aggressively try to reactivate the audio session during interruptions.\n\nIn some cases (depends on app session settings and other apps using audio) system may never\nsend the `interruption ended` event. This method will check if any other audio is playing\nand try to reactivate the audio session, as soon as there is \"silence\".\nAlthough this might change the expected behavior.\n\nInternally method uses `AVAudioSessionSilenceSecondaryAudioHintNotification` as well as\ninterval polling to check if other audio is playing.\n\n### `observeVolumeChanges`\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `enabled` | `boolean` | It is used to enable/disable observing volume changes |\n\n#### Returns `undefined`\n\n\n### `addSystemEventListener`\n\nAdds callback to be invoked upon hearing an event.\n\n| Parameter | Type | Description |\n| :---: | :---: | :---- |\n| `name` | [`SystemEventName`](audio-manager#systemeventname) | Name of an event listener |\n| `callback` | [`SystemEventCallback`](audio-manager#systemeventname) | Callback that will be invoked upon hearing an event |\n\n#### Returns [`AudioEventSubscription`](/docs/system/audio-manager#audioeventsubscription) if `enabled` is set to true, `undefined` otherwise\n\n### `requestRecordingPermissions`\n\nBrings up the system microphone permissions pop-up on demand. The pop-up automatically shows if microphone data\nis directly requested, but sometimes it is better to ask beforehand.\n\n#### Throws an `error` if there is no NSMicrophoneUsageDescription entry in `Info.plist`\n\n#### Returns promise of [`PermissionStatus`](/docs/system/audio-manager#permissionstatus) type, which is resolved after receiving answer from the system.\n\n### `checkRecordingPermissions`\n\nChecks if permissions were previously granted.\n\n#### Throws an `error` if there is no NSMicrophoneUsageDescription entry in `Info.plist`\n\n#### Returns promise of [`PermissionStatus`](/docs/system/audio-manager#permissionstatus) type, which is resolved after receiving answer from the system.\n\n### `requestNotificationPermissions`\n\nBrings up the system notification permissions pop-up on demand. The pop-up automatically shows if notification data\nis directly requested, but sometimes it is better to ask beforehand.\n\n#### Returns promise of [`PermissionStatus`](/docs/system/audio-manager#permissionstatus) type, which is resolved after receiving answer from the system.\n\n### `checkRecordingPermissions`\n\nChecks if permissions were previously granted.\n\n#### Returns promise of [`PermissionStatus`](/docs/system/audio-manager#permissionstatus) type, which is resolved after receiving answer from the system.\n\n### `getDevicesInfo`\n\nChecks currently used and available devices.\n\n#### Returns promise of [`AudioDevicesInfo`](/docs/system/audio-manager#audiodevicesinfo) type, which is resolved after receiving answer from the system.\n\n## Remarks\n\n### `AudioFocusType`\n<details>\n<summary>Type definitions</summary>\n```typescript\ntype AudioFocusType =\n  | 'gain'\n  | 'gainTransient'\n  | 'gainTransientExclusive'\n  | 'gainTransientMayDuck';\n```\n</details>\n\n### `SessionOptions`\n\n<details>\n<summary>Type definitions</summary>\n```typescript\ntype IOSCategory =\n  | 'ambient'\n  | 'multiRoute'\n  | 'playAndRecord'\n  | 'playback'\n  | 'record'\n  | 'soloAmbient';\n\ntype IOSMode =\n  | 'default'\n  | 'dualRoute'\n  | 'gameChat'\n  | 'measurement'\n  | 'moviePlayback'\n  | 'shortFormVideo'\n  | 'spokenAudio'\n  | 'videoChat'\n  | 'videoRecording'\n  | 'voiceChat'\n  | 'voicePrompt';\n\ntype IOSOption =\n  | 'allowAirPlay'\n  | 'allowBluetoothA2DP'\n  | 'allowBluetoothHFP'\n  | 'bluetoothHighQualityRecording'\n  | 'defaultToSpeaker'\n  | 'duckOthers'\n  | 'farFieldInput'\n  | 'interruptSpokenAudioAndMixWithOthers'\n  | 'mixWithOthers'\n  | 'overrideMutedMicrophoneInterruption';\n\ninterface SessionOptions {\n  iosMode?: IOSMode;\n  iosOptions?: IOSOption[];\n  iosCategory?: IOSCategory;\n  iosAllowHaptics?: boolean;\n  // Has no effect when using PlaybackNotificationManager as it takes over the \"Now playing\" controls\n  iosNotifyOthersOnDeactivation?: boolean;\n}\n```\n</details>\n\n\n### `SystemEventName`\n\n<details>\n<summary>Type definitions</summary>\n```typescript\ninterface EventEmptyType {}\n\ninterface EventTypeWithValue {\n  value: number;\n}\n\ninterface OnInterruptionEventType {\n  type: 'ended' | 'began'; // if the interruption event has started or ended\n  shouldResume: boolean; // if the interruption was temporary and we can resume the playback/recording\n}\n\ninterface OnRouteChangeEventType {\n  reason:\n    | 'Unknown'\n    | 'Override'\n    | 'CategoryChange'\n    | 'WakeFromSleep'\n    | 'NewDeviceAvailable'\n    | 'OldDeviceUnavailable'\n    | 'ConfigurationChange'\n    | 'NoSuitableRouteForCategory';\n}\n\ntype SystemEvents = {\n  volumeChange: EventTypeWithValue;\n  interruption: OnInterruptionEventType;\n  duck: EventEmptyType;\n  routeChange: OnRouteChangeEventType;\n};\n\ntype SystemEventName = keyof SystemEvents;\ntype SystemEventCallback<Name extends SystemEventName> = (\n  event: SystemEvents[Name]\n) => void;\n```\n</details>\n\n\n### `AudioEventSubscription`\n\n<details>\n<summary>Type definitions</summary>\n```typescript\ninterface AudioEventSubscription {\n  /** @internal */\n  public readonly subscriptionId: string;\n\n  public remove(): void; // used to remove the subscription\n}\n```\n</details>\n\n### `PermissionStatus`\n\n<details>\n<summary>Type definitions</summary>\n```typescript\ntype PermissionStatus = 'Undetermined' | 'Denied' | 'Granted';\n```\n</details>\n\n### `AudioDevicesInfo`\n\n<details>\n<summary>Type definitions</summary>\n```typescript\nexport interface AudioDeviceInfo {\n  name: string;\n  category: string;\n}\n\nexport type AudioDeviceList = AudioDeviceInfo[];\n\nexport interface AudioDevicesInfo {\n  availableInputs: AudioDeviceList;\n  availableOutputs: AudioDeviceList;\n  currentInputs: AudioDeviceList; // iOS\n  currentOutputs: AudioDeviceList; // iOS\n}\n```\n</details>\n"
  },
  {
    "path": "packages/audiodocs/docs/system/playback-notification-manager.mdx",
    "content": "---\nsidebar_position: 2\n---\n\nimport {\n  Optional,\n  ReadOnly,\n  Experimental,\n} from '@site/src/components/Badges';\n\n# PlaybackNotificationManager\n\nThe `PlaybackNotificationManager` provides media session integration and playback controls for your audio application. It manages system-level media notifications with controls like play, pause, next, previous, and seek functionality.\n\n:::info Platform Differences\n\n**iOS Requirements:**\n- Notification controls only appear when an active `AudioContext` is running\n- `show()` or `hide()` only update metadata - they don't control notification visibility\n- The notification automatically appears/disappears based on audio session state\n- To show: create and resume an AudioContext\n- To hide: suspend or close the AudioContext\n\n**Android:**\n- Notification visibility is directly controlled by `show()` and `hide()` methods\n- Works independently of AudioContext state\n:::\n\n## Example\n\n```tsx\n// show notification\nawait PlaybackNotificationManager.show({\n  title: 'My Song',\n  artist: 'My Artist',\n  duration: 180,\n  state: 'paused',\n});\n\n// Listen for notification controls\nconst playListener = PlaybackNotificationManager.addEventListener(\n  'playbackNotificationPlay',\n  () => {\n    // Handle play action\n    PlaybackNotificationManager.show({ state: 'playing' });\n  }\n);\n\nconst pauseListener = PlaybackNotificationManager.addEventListener(\n  'playbackNotificationPause',\n  () => {\n    // Handle pause action\n    PlaybackNotificationManager.show({ state: 'paused' });\n  }\n);\n\nconst seekToListener = PlaybackNotificationManager.addEventListener(\n  'playbackNotificationSeekTo',\n  (event) => {\n    // Handle seek to position (event.value is in seconds)\n    PlaybackNotificationManager.show({ elapsedTime: event.value });\n  }\n);\n\n// Update progress\nPlaybackNotificationManager.show({ elapsedTime: 60 });\n\n// Cleanup\nplayListener.remove();\npauseListener.remove();\nseekToListener.remove();\nPlaybackNotificationManager.hide();\n```\n\n## Methods\n\n### `show`\n\nDisplay the notification with initial metadata.\n\n:::note iOS Behavior\nOn iOS, this method only sets the metadata. The notification controls will only appear when an `AudioContext` is actively running. Make sure to create and resume an AudioContext before calling `show()`.\n:::\n\n:::info\nMetadata is remembered between calls, so after initial passing the metadata to show function, you can only call it with elements that are supposed to change.\n:::\n\n| Parameter | Type | Description |\n| :-------: | :----------: | :----- |\n| `info` | [`PlaybackNotificationInfo`](playback-notification-manager#playbacknotificationinfo) | Initial notification metadata |\n\n#### Returns `Promise<void>`.\n\n### `hide`\n\nHide the notification. Can be shown again later by calling `show()`.\n\n:::note iOS Behavior\nOn iOS, this method clears the metadata but does not hide the notification controls. To completely hide controls on iOS, you must suspend or close the AudioContext.\n:::\n\n#### Returns `Promise<void>`.\n\n### `enableControl`\n\nEnable or disable specific playback controls.\n\n| Parameter | Type | Description |\n| :-------: | :-----: | :------ |\n| `control` | [`PlaybackControlName`](playback-notification-manager#playbackcontrolname) | The control to enable/disable |\n| `enabled` | `boolean` | Whether the control should be enabled |\n\n#### Returns `Promise<void>`.\n\n### `isActive`\n\nCheck if the notification is currently active and visible.\n\n#### Returns `Promise<boolean>`.\n\n### `addEventListener`\n\nAdd an event listener for notification actions.\n\n|  Parameter  | Type | Description |\n| :---------: | :------: | :------- |\n| `eventName` | [`PlaybackNotificationEventName`](playback-notification-manager#playbacknotificationeventname) | The event to listen for |\n| `callback`  | [`SystemEventCallback`](/docs/system/audio-manager#systemeventname--remotecommandeventname) | Callback function |\n\n#### Returns [`AudioEventSubscription`](/docs/system/audio-manager#audioeventsubscription).\n\n## Remarks\n\n### `PlaybackNotificationInfo`\n\n<details>\n<summary>Type definitions</summary>\n```typescript\ninterface PlaybackNotificationInfo {\n  title?: string;\n  artist?: string;\n  album?: string;\n\n  // Can be a URL or a local file path relative to drawable resources (Android) or bundle resources (iOS)\n  artwork?: string | { uri: string };\n  // ANDROID: small icon shown in the status bar\n  androidSmallIcon?: string | { uri: string };\n  duration?: number;\n\n  // IOS: elapsed time does not update automatically, must be set manually on each state change\n  elapsedTime?: number;\n  speed?: number;\n  state?: 'playing' | 'paused';\n}\n```\n</details>\n\n### `PlaybackControlName`\n\n<details>\n  <summary>Type definitions</summary>\n```typescript\ntype PlaybackControlName =\n  | 'play'\n  | 'pause'\n  | 'stop'\n  | 'nextTrack'\n  | 'previousTrack'\n  | 'skipForward'\n  | 'skipBackward'\n  | 'seekTo';\n```\n</details>\n\n### `PlaybackNotificationEventName`\n\n<details>\n  <summary>Type definitions</summary>\n```typescript\ninterface EventTypeWithValue {\n  value: number;\n}\n\ninterface PlaybackNotificationEvent {\n  playbackNotificationPlay: EventEmptyType;\n  playbackNotificationPause: EventEmptyType;\n  playbackNotificationStop: EventEmptyType;\n  playbackNotificationNextTrack: EventEmptyType;\n  playbackNotificationPreviousTrack: EventEmptyType;\n  playbackNotificationSkipForward: EventTypeWithValue;\n  playbackNotificationSkipBackward: EventTypeWithValue;\n  playbackNotificationSeekTo: EventTypeWithValue;\n  playbackNotificationDismissed: EventEmptyType;\n}\n\ntype PlaybackNotificationEventName = keyof PlaybackNotificationEvent;\n```\n</details>\n\n```\n"
  },
  {
    "path": "packages/audiodocs/docs/system/recording-notification-manager.mdx",
    "content": "---\nsidebar_position: 3\nsidebar_label: RecordingNotificationManager\n---\n\nimport {\n  Android,\n} from '@site/src/components/Badges';\n\n# RecordingNotificationManager <Android />\n\nThe `RecordingNotificationManager` provides system integration with [`Recorder`](/docs/inputs/audio-recorder).\nIt can send events about pausing and resuming to your application.\n\n## Example\n```typescript\nRecordingNotificationManager.show({\n  title: 'Recording app',\n  contentText: 'Recording...',\n  paused: false,\n  smallIconResourceName: 'icon_to_display',\n  pauseIconResourceName: 'pause_icon',\n  resumeIconResourceName: 'resume_icon',\n  color: 0xff6200,\n});\n\nconst pauseEventListener = RecordingNotificationManager.addEventListener('recordingNotificationPause', () => {\n  console.log('Notification pause action received');\n});\nconst resumeEventListener = RecordingNotificationManager.addEventListener('recordingNotificationResume', () => {\n  console.log('Notification resume action received');\n});\n\npauseEventListener.remove();\nresumeEventListener.remove();\nRecordingNotificationManager.hide();\n```\n\n## Methods\n\n### `show`\n\nShows the recording notification with the parameters.\n\n:::info\nMetadata is saved between calls, so after the initial pass to the show method, you need only call it with elements that are supposed to change.\n:::\n\n\n| Parameter |Type| Description|\n| :-------: | :--: | :----|\n| `info` | [`RecordingNotificationInfo`](recording-notification-manager#recordingnotificationinfo) | Initial notification metadata |\n\n#### Returns `Promise<void>`.\n\n:::info\nFor more details, go to [android developer page](https://developer.android.com/develop/ui/views/notifications#Templates).\nResource name is a path to resource plased in res/drawable folder. It has to be either .png file or .xml file, name is indicated without file extenstion. (photo.png -> photo).\n:::\n\n:::caution\nIf nothing is displayed, even though your name is correct, try decreasing size of your resource.\nNotification can look vastly different on different android devices.\n:::\n\n### `hide`\n\nHides the recording notification.\n\n#### Returns `Promise<void>`.\n\n### `isActive`\n\nChecks if the notification is displayed.\n\n#### Returns `Promise<boolean>`.\n\n### `addEventListener`\n\nAdd an event listener for notification actions.\n\n|  Parameter  | Type | Description |\n| :---------: | :----: | :---------------------- |\n| `eventName` | [`RecordingNotificationEvent`](recording-notification-manager#recordingnotificationevent) | The event to listen for |\n| `callback`  | ([`RecordingNotificationEvent](recording-notification-manager#recordingnotificationevent)) => void | Callback function |\n\n#### Returns [`AudioEventSubscription`](/docs/system/audio-manager#audioeventsubscription).\n\n## Remarks\n\n### `RecordingNotificationInfo`\n\n<details>\n<summary>Type definitions</summary>\n```typescript\ninterface RecordingNotificationInfo {\n  title?: string;\n  contentText?: string;\n  paused?: boolean; // flag indicating whether to display pauseIcon or resumeIcon\n  smallIconResourceName?: string;\n  largeIconResourceName?: string;\n  pauseIconResourceName?: string;\n  resumeIconResourceName?: string;\n  color?: number; //\n}\n```\n</details>\n\n### `RecordingNotificationEvent`\n\n<details>\n<summary>Type definitions</summary>\n```typescript\ninterface RecordingNotificationEvent {\n  recordingNotificationPause: EventEmptyType;\n  recordingNotificationResume: EventEmptyType;\n}\n```\n</details>\n\n"
  },
  {
    "path": "packages/audiodocs/docs/types/_category_.json",
    "content": "{\n  \"label\": \"Types\",\n  \"position\": 9,\n  \"link\": {\n    \"type\": \"generated-index\"\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/docs/types/channel-count-mode.mdx",
    "content": "---\nsidebar_position: 3\n---\n\n# ChannelCountMode\n\n`ChannelCountMode` type determines how the number of input channels affects the number of output channels in an audio node.\n\n**Acceptable values:**\n- `max`\n\n  The number of channels is equal to the maximum number of channels of all connections. In this case, `channelCount` is ignored and only up-mixing happens.\n\n - `clamped-max`\n\n  The number of channels is equal to the maximum number of channels of all connections, clamped to the value of `channelCount`(serves as the maximum permissible value).\n\n- `explicit`\n\n  The number of channels is defined by the value of `channelCount`.\n\n"
  },
  {
    "path": "packages/audiodocs/docs/types/channel-interpretation.mdx",
    "content": "---\nsidebar_position: 4\n---\n\n# ChannelInterpretation\n\n`ChannelInterpretation` type specifies how input channels are mapped out to output channels when the number of them are different.\n\n**Acceptable values:**\n  - `speakers`\n\n  Use set of standard mapping rules for all combinations of common input and output setups.\n\n  - `discrete`\n\n  Covers all other cases. Mapping depends on relationship between number of input channels and number of output channels.\n\n\n## Channels mapping table\n\n### `speakers`\n\n| Number of input channels | Number of output channels | Mixing rules |\n| :------------------------: | :------------------------- | :------------ |\n| 1 (Mono) | 2 (Stereo) | output.L = input.M <br /> output.R = input.M |\n| 1 (Mono) | 4 (Quad) | output.L = input.M <br /> output.R = input.M <br /> output.SL = 0 <br /> output.SR = 0 |\n| 1 (Mono) | 6 (5.1) | output.L = 0 <br /> output.R = 0 <br /> output.C = input.M <br /> output.LFE = 0 <br /> output.SL = 0 <br /> output.SR = 0 |\n| 2 (Stereo) | 1 (Mono) | output.M = 0.5 \\* (input.L + input.R) |\n| 2 (Stereo) | 4 (Quad) | output.L = input.L <br /> output.R = input.R <br /> output.SL = 0 <br /> output.SR = 0 |\n| 2 (Stereo) | 6 (5.1) | output.L = input.L <br /> output.R = input.R <br /> output.C = 0 <br /> output.LFE = 0 <br /> output.SL = 0 <br /> output.SR = 0 |\n| 4 (Quad) | 1 (Mono) | output.M = 0.25 \\* (input.L + input.R + input.SL + input.SR) |\n| 4 (Quad) | 2 (Stereo) | output.L = 0.5 \\* (input.L + input.SL) <br /> output.R = 0.5 \\* (input.R + input.SR) |\n| 4 (Quad) | 6 (5.1) | output.L = input.L <br /> output.R = input.R <br /> output.C = 0 <br /> output.LFE = 0 <br /> output.SL = input.SL <br /> output.SR = input.SR |\n| 6 (5.1) | 1 (Mono) | output.M = 0.7071 \\* (input.L + input.R) + input.C <br /> + 0.5 \\* (input.SL + input.SR) |\n| 6 (5.1) | 2 (Stereo) | output.L = input.L + 0.7071 \\* (input.C + input.SL) <br /> output.R = input.R + 0.7071 \\* (input.C + input.SR) |\n| 6 (5.1) | 4 (Quad) | output.L = input.L + 0.7071 \\* input.C <br /> output.R = input.R + 0.7071 \\* input.C <br /> output.SL = input.SL <br /> output.SR = input.SR |\n\n### `discrete`\n\n| Number of input channels | Number of output channels | Mixing rules |\n| :------------------------: | :------------------------- | :------------ |\n| x | y where y > x | Fill each output channel with its counterpart(channel with same number), rest of output channels are silent channels |\n| x | y where y < x | Fill each output channel with its counterpart(channel with same number), rest of input channels are skipped |\n"
  },
  {
    "path": "packages/audiodocs/docs/types/oscillator-type.mdx",
    "content": "---\nsidebar_position: 6\n---\n\n# OscillatorType\n\n`OscillatorType` is a string that specifies shape of an oscillator wave\n\n```jsx\ntype OscillatorType =\n  | 'sine'\n  | 'square'\n  | 'sawtooth'\n  | 'triangle'\n  | 'custom';\n```\n\nBelow you can see possible names with shapes corresponding to them.\n![](/img/oscillator-waves.png)\n\n## `custom`\n\nThis value can't be set explicitly, but it allows user to set any shape. See [`setPeriodicWave`](/docs/sources/oscillator-node#setperiodicwave) for reference.\n\n"
  },
  {
    "path": "packages/audiodocs/docs/utils/_category_.json",
    "content": "{\n    \"label\": \"Utils\",\n    \"position\": 10,\n    \"link\": {\n      \"type\": \"generated-index\"\n    }\n  }\n"
  },
  {
    "path": "packages/audiodocs/docs/utils/decoding.mdx",
    "content": "---\nsidebar_position: 1\n---\n\nimport { Optional, MobileOnly } from '@site/src/components/Badges';\n\n# Decoding\n\nYou can decode audio data independently, without creating an AudioContext, using the exported functions [`decodeAudioData`](/docs/utils/decoding#decodeaudiodata) and\n[`decodePCMInBase64`](/docs/utils/decoding#decodepcminbase64).\n\n:::warning\nDecoding on the web has to be done via `AudioContext` only.\n:::\n\nIf you already have an audio context, you can decode audio data directly using its [`decodeAudioData`](/docs/core/base-audio-context#decodeaudiodata) function;\nthe decoded audio will then be automatically resampled to match the context's `sampleRate`.\n\n:::caution\nSupported file formats:\n- flac\n- mp3\n- ogg\n- opus\n- wav\n- aac\n- m4a\n- mp4\n\nLast three formats are decoded with ffmpeg on the mobile, [see for more info](/docs/other/ffmpeg-info).\n:::\n\n### `decodeAudioData`\n\nDecodes audio data from either a file path or an ArrayBuffer. The optional `sampleRate` parameter lets you resample the decoded audio;\nif not provided, the original sample rate from the file is used.\n\n<table>\n  <thead>\n    <tr>\n      <th align=\"center\">Parameter</th>\n      <th align=\"center\">Type</th>\n      <th align=\"center\">Description</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td rowspan=\"3\" align=\"center\"><code>input</code></td>\n      <td align=\"center\"><code>ArrayBuffer</code></td>\n      <td align=\"center\">ArrayBuffer with audio data.</td>\n    </tr>\n    <tr>\n      <td align=\"center\"><code>string</code></td>\n      <td align=\"center\">Path to remote or local audio file.</td>\n    </tr>\n    <tr>\n      <td align=\"center\"><code>number</code></td>\n      <td align=\"center\">Asset module id. <MobileOnly/> </td>\n    </tr>\n    <tr>\n      <td align=\"center\"><code>sampleRate</code><Optional /></td>\n      <td align=\"center\"><code>number</code></td>\n      <td align=\"center\">Target sample rate for the decoded audio.</td>\n    </tr>\n    <tr>\n      <td align=\"center\"><code>fetchOptions</code><Optional /></td>\n      <td align=\"center\"><code>[RequestInit](https://github.com/facebook/react-native/blob/ac06f3bdc76a9fd7c65ab899e82bff5cad9b94b6/packages/react-native/src/types/globals.d.ts#L265)</code></td>\n      <td align=\"center\">Additional headers parameters when passing url to fetch.</td>\n    </tr>\n  </tbody>\n</table>\n\n#### Returns `Promise<AudioBuffer>`.\n\n:::caution\nIf you are passing number to decode function, bear in mind that it uses Image component provided\nby React Native internally. By default only support .mp3, .wav, .mp4, .m4a, .aac audio file formats.\nIf you want to use other types, refer to [this section](https://reactnative.dev/docs/images#static-non-image-resources) for more info.\n:::\n\n<details>\n<summary>Example decoding remote URL</summary>\n```tsx\nimport { decodeAudioData } from 'react-native-audio-api';\n\nconst url = ... // url to an audio\n\nconst buffer = await decodeAudioData(url);\n```\n</details>\n\n### `decodePCMInBase64`\n\nDecodes base64-encoded PCM audio data.\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `base64String` | `string` | Base64-encoded PCM audio data. |\n| `inputSampleRate` | `number` | Sample rate of the input PCM data. |\n| `inputChannelCount` | `number` | Number of channels in the input PCM data. |\n| `isInterleaved` <Optional />| `boolean` | Whether the PCM data is interleaved. Default is `true`. |\n\n#### Returns `Promise<AudioBuffer>`\n\n\n<details>\n<summary>Example decoding with data in base64 format </summary>\n```tsx\nconst data = ... // data encoded in base64 string\n// data is interleaved (Channel1, Channel2, Channel1, Channel2, ...)\nconst buffer = await decodeAudioData(data, 4800, 2, true);\n```\n</details>\n"
  },
  {
    "path": "packages/audiodocs/docs/utils/time-stretching.mdx",
    "content": "---\nsidebar_position: 2\n---\n\nimport { Optional, MobileOnly } from '@site/src/components/Badges';\n\n# Time stretching\n\nYou can change the playback speed of an audio buffer independently, without creating an AudioContext, using the exported function [`changePlaybackSpeed`](/docs/utils/decoding#decodeaudiodata).\n\n### `changePlaybackSpeed`\n\nChanges the playback speed of an audio buffer.\n\n| Parameter | Type | Description |\n| :----: | :----: | :-------- |\n| `input` | `AudioBuffer` | The audio buffer whose playback speed you want to change. |\n| `playbackSpeed` | `number` | The factor by which to change the playback speed. Values between [1.0, 2.0] speed up playback, values between [0.5, 1.0] slow it down. |\n\n\n#### Returns `Promise<AudioBuffer>`.\n\n<details>\n<summary>Example usage</summary>\n```tsx\nconst url = ... // url to an audio\nconst sampleRate = 48000\n\nconst buffer = await decodeAudioData(url, sampleRate)\n  .then((audioBuffer) => changePlaybackSpeed(audioBuffer, 1.25))\n  .catch((error) => {\n    console.error('Error decoding audio data source:', error);\n    return null;\n  });\n```\n</details>\n\n"
  },
  {
    "path": "packages/audiodocs/docs/worklets/_category_.json",
    "content": "{\n  \"label\": \"Worklets\",\n  \"position\": 8,\n  \"link\": {\n    \"type\": \"generated-index\"\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/docs/worklets/introduction.mdx",
    "content": "---\nid: worklets-introduction\nsidebar_label: Introduction\nsidebar_position: 1\n---\nimport { MobileOnly } from '@site/src/components/Badges';\n\n# RNWorklets Support <MobileOnly />\n\nThe `RNWorklets` library was originally part of Reanimated until version 4.0.0; since then, it has become a separate library.\n\nTo use the worklet features provided by `react-native-audio-api`, you need to install this library:\n\n```bash\nnpm install react-native-worklets\n```\n> **Note**: Supported versions of `react-native-worklets` are [0.6.x, 0.7.x]. They are checked and updated manually with each release. Nightly versions are always supported but your build may fail.\n\nIf the library is not installed, you will encounter runtime errors when trying to use features that depend on worklets and do not have documented fallback implementations.\n\n## What is a worklet?\n\nYou can read more about worklets in the [RNWorklets documentation](https://docs.swmansion.com/react-native-worklets/).\n\nSimply put, a worklet is a piece of code that can be executed on a runtime different from the main JavaScript runtime (or more formally, the runtime on which the code was created).\n\n## What kind of worklets are used in react-native-audio-api?\n\nWe support two types of worklet runtimes, each optimized for different use cases:\n\n### UIRuntime\nWorklets executed on the UI runtime provided by the `RNWorklets` library. This allows the use of Reanimated utilities and features inside the worklets. The main goal is to enable seamless integration with the UI - for example, creating animations from audio data.\n\n**Use UIRuntime when:**\n- You need to update UI elements from audio data\n- Creating visualizations or animations based on audio\n- Integrating with Reanimated shared values\n- Performance is less critical than UI responsiveness\n\n### AudioRuntime\nWorklets executed on the audio rendering thread for maximum performance and minimal latency. This runtime is optimized for real-time audio processing where timing is critical.\n\n**Use AudioRuntime when:**\n- Performance and low latency are crucial\n- Processing audio in real-time without dropouts\n- Generating audio with precise timing\n- Audio processing doesn't need to interact with UI\n\nYou can specify the runtime type when creating worklet nodes using the `workletRuntime` parameter.\n\n## How to use worklets in react-native-audio-api mindfully?\n\nOur API is specifically designed to support high throughput to enable audio playback at 44.1Hz, which is the default frequency for most modern devices.\n\nHowever, this introduces several limitations on what can be done inside a worklet. Since a worklet must be executed on the JavaScript runtime, each execution introduces latency.\n\n$$ 44.1\\text{Hz} \\equiv 44100\\text{ samples} \\equiv 1\\text{ s} $$\n\nThis means the sample rate indicates how many frames are processed in one second. Most features that allow using worklets as callbacks should also allow setting `bufferLength` for worklet input.\n\nIf you set `bufferLength` to 128 (which is the default internal buffer size of our API used to process the graph), you must remember that your worklet should not take more than:\n\n$$ 1\\text{ s} = 1000\\text{ ms} $$\n\n$$ \\frac{44100}{128} \\approx 344 $$\n\n$$ \\frac{1000\\text{ ms}}{344} \\approx 2.9\\text{ ms} $$\n\nThis means that if your worklet, plus the rest of the processing, takes more than 2.9ms, you may start to experience audio dropouts or other playback issues.\n\n### Recommendations\n\n- Use a larger `bufferLength`, like 256, 512 or even 1024 if you don't need more than 40fps.\n- Avoid blocking operations in the worklet (e.g., calling APIs - use JS callbacks for these instead).\n- Do not overuse worklets. Before creating 5 or 6, consider if it can be done with a single one. Creating chained nodes that invoke worklets increases latency linearly.\n- Measure performance and memory usage, and check logs to ensure you are not dropping frames.\n"
  },
  {
    "path": "packages/audiodocs/docs/worklets/worklet-node.mdx",
    "content": "---\nsidebar_position: 2\n---\n\nimport { ReadOnly } from '@site/src/components/Badges';\n\n# WorkletNode\n\n:::warning\nThis node is dependent on `react-native-worklets` and you need to install them in order to use this node. Refer to [getting-started page](/docs/fundamentals/getting-started#possible-additional-dependencies) for more info.\n:::\n\nThe `WorkletNode` interface represents a node in the audio processing graph that can execute a worklet.\n\nWorklets are a way to run JavaScript code in the audio rendering thread, allowing for low-latency audio processing. For more information, see our introduction [Introduction to worklets](/docs/worklets/worklets-introduction).\nThis node lets you execute a worklet on the UI thread. bufferLength specifies the size of the buffer that will be passed to the worklet on each call. The inputChannelCount specifies the number of channels that will be passed to the worklet.\n\n## Constructor\n\n```tsx\nconstructor(\n  context: BaseAudioContext,\n  runtime: AudioWorkletRuntime,\n  callback: (audioData: Array<Float32Array>, channelCount: number) => void,\n  bufferLength: number,\n  inputChannelCount: number)\n```\nOr by using `BaseAudioContext` factory method:\n[`BaseAudioContext.createWorkletNode(worklet, bufferLength, inputChannelCount, workletRuntime)`](/docs/core/base-audio-context#createworkletnode-)\n\n## Example\n```tsx\nimport { AudioContext, AudioRecorder, AudioManager } from 'react-native-audio-api';\n\nAudioManager.setAudioSessionOptions({\n    iosCategory: \"playAndRecord\",\n    iosMode: \"measurement\",\n    iosOptions: [\"mixWithOthers\"],\n})\n\n// This example shows how we can use a WorkletNode to process microphone audio data in real-time.\nasync function App() {\n    const recorder = new AudioRecorder();\n\n    const audioContext = new AudioContext({ sampleRate: 16000 });\n    const worklet = (audioData: Array<Float32Array>, inputChannelCount: number) => {\n        'worklet';\n        // here you have access to the number of input channels and the audio data\n        // audio data is a two dimensional array where first index is the channel number and second is buffer of exactly bufferLength size\n        // !IMPORTANT: here you can only read audio data any modifications will not be reflected in the audio output of this node\n        // !VERY IMPORTANT: please read the Known Issue section below\n    };\n    const workletNode = audioContext.createWorkletNode(worklet, 1024, 2, 'UIRuntime');\n    const adapterNode = audioContext.createRecorderAdapter();\n\n    const canSetAudioSessionActivity = await AudioManager.setAudioSessionActivity(true);\n    if (!canSetAudioSessionActivity) {\n        throw new Error(\"Could not activate the audio session\");\n    }\n    adapterNode.connect(workletNode);\n    workletNode.connect(audioContext.destination);\n    recorder.connect(adapterNode);\n    recorder.start();\n    audioContext.resume();\n}\n```\n\n## Properties\nIt has no own properties but inherits from [`AudioNode`](/docs/core/audio-node).\n\n## Methods\nIt has no own methods but inherits from [`AudioNode`](/docs/core/audio-node).\n\n## Known Issue\nIt might happen that the worklet side effect is not visible on the UI (when you are using UIRuntime kind). For example you have some animated style which depends on some shared value modified in the worklet.\nThis is happening because microtask queue is not always being flushed properly, bla bla bla...\n\nTo workaround this issue just add this line at the end of your worklet callback function:\n```ts\nrequestAnimationFrame(() => {});\n```\nThis will ensure that microtask queue is flushed and your UI will be updated properly. But be aware that this might have some performance implications so it is not included by default.\nSo use this only after confirming that your worklet side effects are not visible on the UI.\n"
  },
  {
    "path": "packages/audiodocs/docs/worklets/worklet-processing-node.mdx",
    "content": "---\nsidebar_position: 4\n---\n\nimport { ReadOnly } from '@site/src/components/Badges';\n\n# WorkletProcessingNode\n\n:::warning\nThis node is dependent on `react-native-worklets` and you need to install them in order to use this node. Refer to [getting-started page](/docs/fundamentals/getting-started#possible-additional-dependencies) for more info.\n:::\n\nThe `WorkletProcessingNode` interface represents a node in the audio processing graph that can process audio using a worklet function. Unlike [`WorkletNode`](/docs/worklets/worklet-node) which only provides read-only access to audio data, `WorkletProcessingNode` allows you to modify the audio signal by providing both input and output buffers.\n\nThis node lets you execute a worklet that receives input audio data and produces output audio data, making it perfect for creating custom audio effects, filters, and processors. The worklet processes the exact number of frames provided by the audio system in each call.\n\nFor more information about worklets, see our [Introduction to worklets](/docs/worklets/worklets-introduction).\n\n## Constructor\n\n```tsx\nconstructor(\n  context: BaseAudioContext,\n  runtime: AudioWorkletRuntime,\n  callback: (\n    inputData: Array<Float32Array>,\n    outputData: Array<Float32Array>,\n    framesToProcess: number,\n    currentTime: number\n  ) => void)\n```\nOr by using `BaseAudioContext` factory method:\n[`BaseAudioContext.createWorkletProcessingNode(worklet, workletRuntime)`](/docs/core/base-audio-context#createworkletprocessingnode-)\n\n## Example\n\n```tsx\nimport { AudioContext, AudioRecorder } from 'react-native-audio-api';\n\n// This example shows how to create a simple gain effect using WorkletProcessingNode\nfunction App() {\n    const recorder = new AudioRecorder({\n      sampleRate: 16000,\n      bufferLengthInSamples: 16000,\n    });\n\n    const audioContext = new AudioContext({ sampleRate: 16000 });\n\n    // Create a simple gain worklet that multiplies the input by a gain value\n    const gainWorklet = (\n        inputData: Array<Float32Array>,\n        outputData: Array<Float32Array>,\n        framesToProcess: number,\n        currentTime: number\n    ) => {\n        'worklet';\n        const gain = 0.5; // 50% volume\n\n        for (let ch = 0; ch < inputData.length; ch++) {\n            const input = inputData[ch];\n            const output = outputData[ch];\n\n            for (let i = 0; i < framesToProcess; i++) {\n                output[i] = input[i] * gain;\n            }\n        }\n    };\n\n    const workletProcessingNode = audioContext.createWorkletProcessingNode(\n        gainWorklet,\n        'AudioRuntime'\n    );\n    const adapterNode = audioContext.createRecorderAdapter();\n\n    adapterNode.connect(workletProcessingNode);\n    workletProcessingNode.connect(audioContext.destination);\n    recorder.connect(adapterNode);\n    recorder.start();\n}\n}\n```\n\n## Worklet Parameters Explanation\n\nThe worklet function receives four parameters:\n\n### `inputData: Array<Float32Array>`\nA two-dimensional array where:\n- First dimension represents the audio channel (0 = left, 1 = right for stereo)\n- Second dimension contains the input audio samples for that channel\n- You should **read** from these buffers to get the input audio data\n- The length of each `Float32Array` equals the `framesToProcess` parameter\n\n### `outputData: Array<Float32Array>`\nA two-dimensional array where:\n- First dimension represents the audio channel (0 = left, 1 = right for stereo)\n- Second dimension contains the output audio samples for that channel\n- You must **write** to these buffers to produce the processed audio output\n- The length of each `Float32Array` equals the `framesToProcess` parameter\n\n### `framesToProcess: number`\nThe number of audio samples to process in this call. This determines how many samples you need to process in each channel's buffer. This value will be at most 128.\n\n### `currentTime: number`\nThe current audio context time in seconds when this worklet call begins. This represents the absolute time since the audio context was created.\n\n## Audio Processing Pattern\n\nA typical WorkletProcessingNode worklet follows this pattern:\n\n```tsx\nconst audioProcessor = (\n    inputData: Array<Float32Array>,\n    outputData: Array<Float32Array>,\n    framesToProcess: number,\n    currentTime: number\n) => {\n    'worklet';\n\n    for (let channel = 0; channel < inputData.length; channel++) {\n        const input = inputData[channel];\n        const output = outputData[channel];\n\n        for (let sample = 0; sample < framesToProcess; sample++) {\n            // Process each sample\n            // Read from: input[sample]\n            // Write to: output[sample]\n            output[sample] = processAudioSample(input[sample]);\n        }\n    }\n};\n```\n\n## Properties\n\nIt has no own properties but inherits from [`AudioNode`](/docs/core/audio-node).\n\n## Methods\n\nIt has no own methods but inherits from [`AudioNode`](/docs/core/audio-node).\n\n## Performance Considerations\n\nSince `WorkletProcessingNode` processes audio in real-time, performance is critical:\n\n- Keep worklet functions lightweight and efficient\n- Avoid complex calculations that could cause audio dropouts\n- Process samples in-place when possible\n- Consider using lookup tables for expensive operations\n- Use `AudioRuntime` for better performance, `UIRuntime` for UI integration\n- Test on target devices to ensure smooth audio processing\n\n## Use Cases\n\n- **Audio Effects**: Reverb, delay, distortion, filters\n- **Audio Processing**: Compression, limiting, normalization\n- **Real-time Filters**: EQ, high-pass, low-pass, band-pass filters\n- **Custom Algorithms**: Noise reduction, pitch shifting, spectral processing\n- **Signal Analysis**: Feature extraction while passing audio through\n"
  },
  {
    "path": "packages/audiodocs/docs/worklets/worklet-source-node.mdx",
    "content": "---\nsidebar_position: 3\n---\n\nimport { ReadOnly, MobileOnly } from '@site/src/components/Badges';\n\n# WorkletSourceNode\n\n:::warning\nThis node is dependent on `react-native-worklets` and you need to install them in order to use this node. Refer to [getting-started page](/docs/fundamentals/getting-started#possible-additional-dependencies) for more info.\n:::\n\nThe `WorkletSourceNode` interface represents a scheduled source node in the audio processing graph that generates audio using a worklet function. It extends [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node), providing the ability to start and stop audio generation at specific times.\n\nThis node allows you to generate audio procedurally using JavaScript worklets, making it perfect for creating custom synthesizers, audio generators, or real-time audio effects that produce sound rather than just process it.\n\nFor more information about worklets, see our [Introduction to worklets](/docs/worklets/worklets-introduction).\n\n## Constructor\n\n```tsx\nconstructor(\n  context: BaseAudioContext,\n  runtime: AudioWorkletRuntime,\n  callback: (\n    audioData: Array<Float32Array>,\n    framesToProcess: number,\n    currentTime: number,\n    startOffset: number\n  ) => void)\n```\nOr by using `BaseAudioContext` factory method:\n[`BaseAudioContext.createWorkletSourceNode(worklet, workletRuntime)`](/docs/core/base-audio-context#createworkletsourcenode-)\n\n## Example\n\n```tsx\nimport { AudioContext } from 'react-native-audio-api';\n\nfunction App() {\n  const audioContext = new AudioContext({ sampleRate: 44100 });\n\n  // Create a simple sine wave generator worklet\n  const sineWaveWorklet = (\n    audioData: Array<Float32Array>,\n    framesToProcess: number,\n    currentTime: number,\n    startOffset: number\n  ) => {\n    'worklet';\n\n    const frequency = 440; // A4 note\n    const sampleRate = 44100;\n\n    // Generate audio for each channel\n    for (let channel = 0; channel < audioData.length; channel++) {\n      for (let i = 0; i < framesToProcess; i++) {\n        // Calculate the absolute time for this sample\n        const sampleTime = currentTime + (startOffset + i) / sampleRate;\n\n        // Generate sine wave\n        const phase = 2 * Math.PI * frequency * sampleTime;\n        audioData[channel][i] = Math.sin(phase) * 0.5; // 50% volume\n      }\n    }\n  };\n\n  const workletSourceNode = audioContext.createWorkletSourceNode(\n    sineWaveWorklet,\n    'AudioRuntime'\n  );\n\n  // Connect to output and start playback\n  workletSourceNode.connect(audioContext.destination);\n  workletSourceNode.start(); // Start immediately\n\n  // Stop after 2 seconds\n  setTimeout(() => {\n    workletSourceNode.stop();\n  }, 2000);\n}\n```\n\n## Worklet Parameters Explanation\n\nThe worklet function receives four parameters:\n\n### `audioData: Array<Float32Array>`\nA two-dimensional array where:\n- First dimension represents the audio channel (0 = left, 1 = right for stereo)\n- Second dimension contains the audio samples for that channel\n- You must **write** audio data to these buffers to generate sound\n- The length of each `Float32Array` equals `framesToProcess`\n\n### `framesToProcess: number`\nThe number of audio samples to generate in this call. This determines how many samples you need to fill in each channel's buffer.\n\n### `currentTime: number`\nThe current audio context time in seconds when this worklet call begins. This represents the absolute time since the audio context was created.\n\n### `startOffset: number`\nThe sample offset within the current processing block where your generated audio should begin. This is particularly important for precise timing when the node starts or stops mid-block.\n\n## Understanding `startOffset` and `currentTime`\n\nThe relationship between `currentTime` and `startOffset` is crucial for generating continuous audio:\n\n```tsx\nconst worklet = (audioData, framesToProcess, currentTime, startOffset) => {\n  'worklet';\n\n  const sampleRate = 44100;\n\n  for (let i = 0; i < framesToProcess; i++) {\n    // Calculate the exact time for this sample\n    const sampleTime = currentTime + (startOffset + i) / sampleRate;\n\n    // Use sampleTime for phase calculations, LFOs, envelopes, etc.\n    const phase = 2 * Math.PI * frequency * sampleTime;\n    audioData[0][i] = Math.sin(phase);\n  }\n};\n```\n\n**Key points:**\n- `currentTime` represents the audio context time at the start of the processing block\n- `startOffset` tells you which sample within the block to start generating audio\n- The absolute time for sample `i` is: `currentTime + (startOffset + i) / sampleRate`\n- This ensures phase continuity and precise timing across processing blocks\n\n## Properties\n\nIt has no own properties but inherits from [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node).\n\n## Methods\n\nIt has no own methods but inherits from [`AudioScheduledSourceNode`](/docs/sources/audio-scheduled-source-node):\n\n## Performance Considerations\n\nSince `WorkletSourceNode` generates audio in real-time, performance is critical:\n\n- Keep worklet functions lightweight and efficient\n- Avoid complex calculations that could cause audio dropouts\n- Consider using lookup tables for expensive operations like trigonometric functions\n- Test on target devices to ensure smooth audio generation\n- Use `AudioRuntime` for better performance, `UIRuntime` for UI integration\n\n## Use Cases\n\n- **Custom Synthesizers**: Generate waveforms, apply modulation, create complex timbres\n- **Audio Generators**: White noise, pink noise, test tones, sweeps\n- **Procedural Audio**: Dynamic soundscapes, generative music\n- **Real-time Effects**: Audio that responds to user input or external data\n- **Educational Tools**: Demonstrate audio synthesis concepts interactively\n\n## See Also\n\n- [WorkletNode](/docs/worklets/worklet-node) - For processing existing audio with worklets\n- [Introduction to worklets](/docs/worklets/worklets-introduction) - Understanding worklet fundamentals\n- [AudioScheduledSourceNode](/docs/sources/audio-scheduled-source-node) - Base class for scheduled sources\n"
  },
  {
    "path": "packages/audiodocs/docusaurus.config.js",
    "content": "// @ts-check\n// Note: type annotations allow type checking and IDEs autocompletion\n\nconst lightCodeTheme = require('./src/theme/CodeBlock/highlighting-light.js');\nconst darkCodeTheme = require('./src/theme/CodeBlock/highlighting-dark.js');\n\n// eslint-disable-next-line import/first\nimport remarkMath from 'remark-math';\n// eslint-disable-next-line import/first\nimport rehypeKatex from 'rehype-katex';\n// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)\n\nconst webpack = require('webpack');\n\nconst config = {\n  title: 'React Native Audio API',\n  favicon: 'img/favicon.ico',\n\n  // Set the production url of your site here\n  url: 'https://docs.swmansion.com/',\n  // Set the /<baseUrl>/ pathname under which your site is served\n  // For GitHub pages deployment, it is often '/<projectName>/'\n  baseUrl: '/react-native-audio-api/',\n\n  // GitHub pages deployment config.\n  // If you aren't using GitHub pages, you don't need these.\n  organizationName: 'software-mansion', // Usually your GitHub org/user name.\n  projectName: 'react-native-audio-api', // Usually your repo name.\n\n  onBrokenLinks: 'throw',\n  onBrokenMarkdownLinks: 'warn',\n\n  // Even if you don't use internationalization, you can use this field to set\n  // useful metadata like html lang. For example, if your site is Chinese, you\n  // may want to replace \"en\" with \"zh-Hans\".\n  i18n: {\n    defaultLocale: 'en',\n    locales: ['en'],\n  },\n\n  presets: [\n    [\n      'classic',\n      {\n        docs: {\n          breadcrumbs: false,\n          sidebarCollapsible: false,\n          sidebarPath: require.resolve('./sidebars.js'),\n          remarkPlugins: [remarkMath],\n          rehypePlugins: [rehypeKatex],\n          editUrl:\n            'https://github.com/software-mansion/react-native-audio-api/edit/main/packages/audiodocs/docs',\n        },\n        blog: false,\n        theme: {\n          customCss: './src/css/custom.css',\n        },\n      },\n    ],\n    require.resolve('@swmansion/t-rex-ui/preset'),\n  ],\n\n  stylesheets: [\n    {\n      href: 'https://cdn.jsdelivr.net/npm/katex@0.13.24/dist/katex.min.css',\n      type: 'text/css',\n      integrity:\n        'sha384-odtC+0UGzzFL/6PNoE8rX/SPcQDXBJ+uRepguP4QkPCm2LBxH3FA3y+fKSiJ+AmM',\n      crossorigin: 'anonymous',\n    },\n  ],\n\n  markdown: {\n    mermaid: true,\n  },\n  themes: ['@docusaurus/theme-mermaid'],\n\n  themeConfig: {\n    image: '/img/og-image.png',\n\n    navbar: {\n      hideOnScroll: true,\n      title: 'React Native Audio API',\n      logo: {\n        alt: 'react-native-audio-api logo',\n        src: 'img/logo-hero.svg',\n        srcDark: 'img/logo-hero.svg',\n      },\n      items: [\n        {\n          'href':\n            'https://github.com/software-mansion/react-native-audio-api',\n          'label': 'GitHub',\n          'position': 'right',\n          'aria-label': 'GitHub repository',\n        },\n      ],\n    },\n    footer: {\n      links: [],\n      copyright: `All trademarks and copyrights belong to their respective owners.`,\n    },\n    prism: {\n      additionalLanguages: ['bash', 'cmake'],\n      theme: lightCodeTheme,\n      darkTheme: darkCodeTheme,\n    },\n    algolia: {\n      appId: '7OKARNAQRP',\n      apiKey: 'f06db3d3f64e619012f52f9fb3edf349',\n      indexName: 'swmansion',\n      askAi: {\n        assistantId: 'Gy3lkaKLUCko',\n        indexName: 'audio-api-ai',\n        apiKey: 'f06db3d3f64e619012f52f9fb3edf349',\n        appId: '7OKARNAQRP',\n      },\n    },\n  },\n    clientModules: [\n    require.resolve('./src/wasm-loader.js'),\n  ],\n\n  plugins: [\n    [\n      '@docusaurus/plugin-google-tag-manager',\n      {\n        containerId: 'GTM-K8VRM8H4',\n      },\n    ],\n    ...[\n      process.env.NODE_ENV === 'production' && '@docusaurus/plugin-debug',\n    ].filter(Boolean),\n    async function docusaurusPlugin() {\n      return {\n        name: 'react-native-audio-api/docusaurus-plugin',\n        // @ts-ignore\n        configureWebpack(_config, isServer, _utils) {\n          const processMock = !isServer ? { process: { env: {} } } : {};\n\n          const raf = require('raf');\n          raf.polyfill();\n\n          return {\n            mergeStrategy: {\n              'resolve.extensions': 'prepend',\n            },\n            plugins: [\n              new webpack.DefinePlugin({\n                ...processMock,\n                __DEV__: 'false',\n              }),\n              // Provide React automatically where library code expects global React\n              new webpack.ProvidePlugin({\n                React: 'react',\n              }),\n            ],\n            module: {\n              rules: [\n                {\n                  test: /\\.txt$/,\n                  type: 'asset/source',\n                },\n                {\n                  test: /\\.tsx?$/,\n                  use: 'babel-loader',\n                },\n                {\n                  test: /\\.(js|jsx)$/,\n                  use: {\n                    loader: 'babel-loader',\n                    options: {\n                      presets: [\n                        '@babel/preset-react',\n                        { plugins: ['@babel/plugin-proposal-class-properties'] },\n                      ],\n                    },\n                  },\n                },\n              ],\n            },\n            resolve: {\n              alias: { 'react-native$': 'react-native-web' },\n              extensions: ['.web.js', '.js', '...'],\n            },\n          };\n        },\n      };\n    },\n  ],\n};\n\nmodule.exports = config;\n"
  },
  {
    "path": "packages/audiodocs/package.json",
    "content": "{\n  \"name\": \"audiodocs\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"docusaurus\": \"docusaurus\",\n    \"start\": \"docusaurus start\",\n    \"build\": \"docusaurus build\",\n    \"swizzle\": \"docusaurus swizzle\",\n    \"deploy\": \"docusaurus deploy\",\n    \"clear\": \"docusaurus clear\",\n    \"serve\": \"docusaurus serve\",\n    \"lint\": \"echo lint\",\n    \"write-translations\": \"docusaurus write-translations\",\n    \"write-heading-ids\": \"docusaurus write-heading-ids\",\n    \"typecheck\": \"\",\n    \"postinstall\": \"patch-package && yarn setup-rn-audio-api-web \\\"static\\\"\"\n  },\n  \"dependencies\": {\n    \"@babel/plugin-proposal-class-properties\": \"^7.18.6\",\n    \"@babel/plugin-proposal-export-namespace-from\": \"^7.18.9\",\n    \"@babel/preset-env\": \"^7.28.3\",\n    \"@babel/preset-react\": \"^7.27.1\",\n    \"@babel/preset-typescript\": \"^7.27.1\",\n    \"@docusaurus/core\": \"3.9.2\",\n    \"@docusaurus/plugin-debug\": \"3.9.2\",\n    \"@docusaurus/plugin-google-tag-manager\": \"^3.9.2\",\n    \"@docusaurus/preset-classic\": \"3.9.2\",\n    \"@docusaurus/theme-mermaid\": \"3.9.2\",\n    \"@emotion/react\": \"^11.14.0\",\n    \"@emotion/styled\": \"^11.14.0\",\n    \"@mdx-js/react\": \"^3.0.0\",\n    \"@mui/material\": \"^7.1.0\",\n    \"@react-native-community/slider\": \"^5.0.1\",\n    \"@shopify/react-native-skia\": \"1.10.2\",\n    \"@swmansion/t-rex-ui\": \"1.3.1\",\n    \"@types/three\": \"^0.180.0\",\n    \"@vercel/og\": \"^0.6.2\",\n    \"babel-polyfill\": \"^6.26.0\",\n    \"babel-preset-expo\": \"^9.2.2\",\n    \"clsx\": \"^2.1.0\",\n    \"copy-text-to-clipboard\": \"^3.2.2\",\n    \"hast-util-is-element\": \"1.1.0\",\n    \"prism-react-renderer\": \"^2.1.0\",\n    \"raf\": \"^3.4.1\",\n    \"raw-loader\": \"^4.0.2\",\n    \"react\": \"^19.1.1\",\n    \"react-colorful\": \"^5.6.1\",\n    \"react-dom\": \"^19.1.1\",\n    \"react-draggable\": \"^4.4.5\",\n    \"react-native\": \"^0.71.4\",\n    \"react-native-audio-api\": \"*\",\n    \"react-native-canvas\": \"^0.1.40\",\n    \"react-native-gesture-handler\": \"^2.16.0\",\n    \"react-native-reanimated\": \"^4.0.3\",\n    \"react-native-web\": \"^0.21.1\",\n    \"react-native-worklets\": \"^0.4.1\",\n    \"recharts\": \"^3.7.0\",\n    \"rehype-katex\": \"7\",\n    \"remark-math\": \"6\",\n    \"source-map\": \"^0.7.4\",\n    \"source-map-loader\": \"^4.0.1\",\n    \"three\": \"^0.180.0\",\n    \"usehooks-ts\": \"^2.9.1\"\n  },\n  \"devDependencies\": {\n    \"@docusaurus/module-type-aliases\": \"^3.9.2\",\n    \"@docusaurus/tsconfig\": \"^3.9.2\",\n    \"copy-webpack-plugin\": \"^11.0.0\",\n    \"esbuild\": \"^0.20.2\",\n    \"esbuild-register\": \"^3.5.0\",\n    \"eslint-plugin-mdx\": \"^2.2.0\",\n    \"patch-package\": \"^8.0.0\",\n    \"prettier\": \"^2.8.4\",\n    \"typescript\": \"~5.8.3\",\n    \"typescript-eslint\": \"^8.18.0\",\n    \"webpack-cli\": \"^5.0.1\"\n  },\n  \"resolutions\": {\n    \"@babel/traverse\": \"^7.23.2\",\n    \"mermaid\": \"^10.9.3\",\n    \"trim\": \"^1.0.1\",\n    \"dompurify\": \"^2.5.4\",\n    \"got\": \"^11.8.5\",\n    \"axios\": \"^0.28.0\"\n  },\n  \"browserslist\": {\n    \"production\": [\n      \">0.5%\",\n      \"not dead\",\n      \"not op_mini all\"\n    ],\n    \"development\": [\n      \"last 1 chrome version\",\n      \"last 1 firefox version\",\n      \"last 1 safari version\"\n    ]\n  },\n  \"engines\": {\n    \"node\": \">=18.0\"\n  },\n  \"packageManager\": \"yarn@1.22.22\"\n}\n"
  },
  {
    "path": "packages/audiodocs/prettier.config.js",
    "content": "/** @type {import('prettier').Config} */\nmodule.exports = {\n  plugins: ['prettier-plugin-jsdoc'],\n  bracketSameLine: true,\n  printWidth: 100,\n  singleQuote: true,\n  trailingComma: 'es5',\n  tabWidth: 2,\n  arrowParens: 'always',\n};\n"
  },
  {
    "path": "packages/audiodocs/sidebars.js",
    "content": "// This runs in Node.js - Don't use client-side code here (browser APIs, JSX...)\n\n/**\n * Creating a sidebar enables you to:\n - create an ordered group of docs\n - render a sidebar for each doc of that group\n - provide next/previous navigation\n\n The sidebars can be generated from the filesystem, or explicitly defined here.\n\n Create as many sidebars as you want.\n */\nconst sidebars = {\n  // By default, Docusaurus generates a sidebar from the docs folder structure\n  tutorialSidebar: [{ type: 'autogenerated', dirName: '.' }],\n\n  // But you can create a sidebar manually\n  /*\n  tutorialSidebar: [\n    'intro',\n    'hello',\n    {\n      type: 'category',\n      label: 'Tutorial',\n      items: ['tutorial-basics/create-a-document'],\n    },\n  ],\n   */\n};\n\nmodule.exports = sidebars;\n"
  },
  {
    "path": "packages/audiodocs/src/audio/AudioManager.ts",
    "content": "import MockAudioContext from \"./MockAudioContext\";\n\nimport { BufferMetadata, PlaySoundOptions, PlaySoundReturnValue, ActiveSound, LoadedBuffer, AudioManagerEventType, AudioManagerEvent, AudioManagerUpdatePayload } from \"./types\";\nimport Equalizer from \"./Equalizer\";\n\nconst fftSize = 2048;\nconst smoothingTimeConstant = 0.8;\n\n\nclass AudioManager {\n  output: GainNode;\n  aCtx: AudioContext;\n  analyser: AnalyserNode;\n  equalizer: Equalizer;\n\n  isPlaying: boolean = false;\n  loadedBuffers: Map<string, LoadedBuffer> = new Map();\n  activeSounds: Map<string, ActiveSound> = new Map();\n  eventListeners: Map<AudioManagerEventType, ((event: AudioManagerEvent) => void)[]> = new Map();\n  updateListeners: Map<string, ((event: AudioManagerUpdatePayload) => void)[]> = new Map();\n\n  constructor() {\n    this.aCtx = typeof window !== 'undefined' ? new AudioContext() : MockAudioContext;\n\n    this.equalizer = new Equalizer(this.aCtx);\n\n    this.analyser = this.aCtx.createAnalyser();\n    this.analyser.fftSize = fftSize;\n    this.analyser.smoothingTimeConstant = smoothingTimeConstant;\n\n    this.output = this.aCtx.createGain();\n    this.output.gain.value = 1;\n\n    this.output.connect(this.equalizer.getInputNode());\n    this.equalizer.connect(this.analyser);\n    this.analyser.connect(this.aCtx.destination);\n\n    this.isPlaying = false;\n  }\n\n  clear() {\n    this.activeSounds.forEach(sound => {\n      sound.sourceNode.stop();\n    });\n\n    this.activeSounds.clear();\n    this.loadedBuffers.clear();\n    this.isPlaying = false;\n  }\n\n  setOutputVolume(volume: number) {\n    this.output.gain.setValueAtTime(volume, this.aCtx.currentTime);\n  }\n\n\n  // ------------\n  // Event handling methods\n  // ------------\n\n  addEventListener<T extends AudioManagerEventType>(type: T, listener: (event: AudioManagerEvent<T>) => void) {\n    if (!this.eventListeners.has(type)) {\n      this.eventListeners.set(type, []);\n    }\n    this.eventListeners.get(type)?.push(listener);\n  }\n\n  addUpdateEventListener(id: string, listener: (event: AudioManagerUpdatePayload) => void) {\n    if (!this.updateListeners.has(id)) {\n      this.updateListeners.set(id, []);\n    }\n\n    this.updateListeners.get(id)!.push(listener);\n  }\n\n  removeEventListener<T extends AudioManagerEventType>(type: T, listener: (event: AudioManagerEvent<T>) => void) {\n    const listeners = this.eventListeners.get(type);\n    if (listeners) {\n      this.eventListeners.set(type, listeners.filter(l => l !== listener));\n    }\n  }\n\n  removeUpdateEventListener(id: string, listener: (event: AudioManagerUpdatePayload) => void) {\n    const listeners = this.updateListeners.get(id);\n\n    if (listeners) {\n      this.updateListeners.set(id, listeners.filter(l => l !== listener));\n    }\n  }\n\n  dispatchEvent<T extends AudioManagerEventType>(event: AudioManagerEvent<T>) {\n    const listeners = this.eventListeners.get(event.type);\n    if (listeners) {\n      listeners.forEach(listener => listener(event));\n    }\n  }\n\n  onSoundStarted() {\n    if (this.isPlaying) {\n      return;\n    }\n\n    this.isPlaying = true;\n    this.dispatchEvent({ type: 'playing', payload: {} });\n\n    this.updateLoop();\n  }\n\n  onSoundEnded({ id, onEnded }: { id: string; onEnded?: () => void }) {\n    const activeSound = this.activeSounds.get(id);\n\n    if (!activeSound) {\n      onEnded?.();\n      return;\n    }\n\n    this.updateListeners.get(activeSound.bufferId)?.forEach(listener => {\n      listener({ progress: 0 });\n    });\n\n    this.activeSounds.delete(id);\n\n    if (this.activeSounds.size == 0) {\n      this.isPlaying = false;\n      this.dispatchEvent({ type: 'stopped', payload: {} });\n    }\n\n    onEnded?.();\n  }\n\n  // ------------\n  // Update loop\n  // ------------\n\n  updateLoop() {\n    if (!this.isPlaying) {\n      return;\n    }\n\n    const currentTime = this.aCtx.currentTime;\n\n    this.activeSounds.forEach((sound => {\n      const duration = sound.sourceNode.buffer?.duration || 1;\n      const elapsed = (currentTime - sound.startedAt) % duration;\n      const progress = elapsed / duration;\n\n      // Dispatch update event for each active sound\n      this.updateListeners.get(sound.bufferId)?.forEach(listener => {\n        listener({ progress });\n      });\n    }));\n\n    setTimeout(() => {\n      requestAnimationFrame(() => this.updateLoop());\n    }, 1000 / 60); // 60 FPS\n  }\n\n  // ------------\n  // Audio management methods\n  // ------------\n\n  async loadSound(url: string): Promise<BufferMetadata> {\n    const id = crypto.randomUUID();\n\n    const buffer = await fetch(url)\n      .then(response => response.arrayBuffer())\n      .then(data => this.aCtx.decodeAudioData(data));\n\n    this.loadedBuffers.set(id, { id, buffer });\n    return { id, duration: buffer.duration };\n  }\n\n  playSound(bufferId: string, options: PlaySoundOptions = {}): PlaySoundReturnValue {\n    const { loop = false, startFrom = 0, unique, volume = 1, onEnded } = options;\n\n    if (!this.loadedBuffers.has(bufferId)) {\n      console.warn(`No sound found with ID: ${bufferId}`);\n      return false;\n    }\n\n    if (unique) {\n      const existingSound = Array.from(this.activeSounds.values()).find(sound => sound.bufferId === bufferId);\n\n      if (existingSound) {\n        return false;\n      }\n    }\n\n    const id = crypto.randomUUID();\n\n    // We are already sure the buffer exists at this point\n    const buffer = this.loadedBuffers.get(bufferId)!.buffer;\n\n    const tNow = this.aCtx.currentTime;\n    const source = this.aCtx.createBufferSource();\n    source.buffer = buffer;\n    source.loop = loop;\n\n    source.onended = this.onSoundEnded.bind(this, { id, onEnded });\n\n    const gainNode = this.aCtx.createGain();\n    gainNode.gain.value = volume;\n\n    source.connect(gainNode);\n    gainNode.connect(this.output);\n\n    source.start(tNow, startFrom);\n    this.onSoundStarted();\n\n    this.activeSounds.set(id, {\n      id,\n      bufferId,\n      startedAt: tNow,\n      sourceNode: source,\n    });\n\n    return {\n      id,\n      startedAt: tNow\n    };\n  }\n\n  stopSound(id: string): Promise<void> {\n    return new Promise((resolve) => {\n      const source = this.activeSounds.get(id);\n\n      if (!source) {\n        resolve();\n        return;\n      }\n\n      source.sourceNode.onended = this.onSoundEnded.bind(this, {\n        id,\n        onEnded: () => { resolve(); },\n      });\n\n      this.updateListeners.get(source.bufferId)?.forEach(listener => {\n        listener({ progress: 0 });\n      });\n\n      source.sourceNode.stop();\n    });\n  }\n\n  isSoundActive(id: string): boolean {\n    return this.activeSounds.has(id);\n  }\n}\n\nexport default new AudioManager();\n\n\n// class AudioManager {\n//   microphoneSource: MediaStreamAudioSourceNode | null = null;\n//   microphoneEffects: AudioNode[] = [];\n\n//   connectMicrophone(stream: MediaStream, effectsMap?: Map<string, AudioNode>) {\n//     // Disconnect any existing microphone\n//     this.disconnectMicrophone();\n\n//     // Create microphone source\n//     this.microphoneSource = this.aCtx.createMediaStreamSource(stream);\n\n//     let currentNode: AudioNode = this.microphoneSource;\n\n//     // Apply effects if provided\n//     if (effectsMap) {\n//       const effects = Array.from(effectsMap.values());\n//       this.microphoneEffects = effects;\n\n//       effects.forEach(effect => {\n//         currentNode.connect(effect);\n//         currentNode = effect;\n//       });\n//     }\n\n//     // Connect to guitar gain node\n//     const guitarGain = this.getGainNode('guitar');\n//     currentNode.connect(guitarGain);\n//     this.isPlaying = true;\n//   }\n\n//   disconnectMicrophone() {\n//     if (this.microphoneSource) {\n//       this.microphoneSource.disconnect();\n//       this.microphoneSource = null;\n//     }\n\n//     // Disconnect effects\n//     this.microphoneEffects.forEach(effect => {\n//       effect.disconnect();\n//     });\n//     this.microphoneEffects = [];\n\n//     this.isPlaying = false;\n//   }\n// }\n"
  },
  {
    "path": "packages/audiodocs/src/audio/Equalizer.ts",
    "content": "export const frequencies: Array<{ frequency: number; type: BiquadFilterType }> = [\n  { frequency: 60, type: 'lowshelf'},\n  { frequency: 250, type: 'peaking' },\n  { frequency: 1000, type: 'peaking' },\n  { frequency: 4000, type: 'peaking' },\n  { frequency: 12000, type: 'highshelf' },\n];\n\nexport default class Equalizer {\n  bands: BiquadFilterNode[];\n\n  constructor(audioContext: AudioContext, size: number = frequencies.length) {\n    this.bands = Array.from({ length: size }, (_, i) => {\n      const filter = audioContext.createBiquadFilter();\n      filter.type = frequencies[i].type;\n      filter.frequency.value = frequencies[i].frequency;\n      filter.Q.value = 1;\n      filter.gain.value = 0;\n      return filter;\n    });\n\n    for (let i = 0; i < size - 1; i += 1) {\n      this.bands[i].connect(this.bands[i + 1]);\n    }\n  }\n\n  setFrequencies(frequencies: number[]) {\n    frequencies.forEach((freq, i) => {\n      if (i < this.bands.length) {\n        this.bands[i].frequency.value = freq;\n      }\n    });\n  }\n\n  getFrequencies(): number[] {\n    return this.bands.map(band => band.frequency.value);\n  }\n\n  setGains(gains: number[]) {\n    gains.forEach((gain, i) => {\n      if (i < this.bands.length) {\n        this.bands[i].gain.value = gain;\n      }\n    });\n  }\n\n  connect(output: AudioNode) {\n    this.bands[this.bands.length - 1].connect(output);\n  }\n\n  getInputNode(): AudioNode {\n    return this.bands[0];\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/audio/MockAudioContext.ts",
    "content": "const MockAudioContext = {\n  createAnalyser: () => ({\n    fftSize: 2048,\n    smoothingTimeConstant: 0.8,\n    connect: () => {},\n  }),\n  createGain: () => ({\n    gain: { value: 1 },\n    connect: () => {},\n  }),\n  createBiquadFilter: () => ({\n    type: \"lowpass\",\n    frequency: { value: 1000, setValueAtTime: () => {} },\n    Q: { value: 1, setValueAtTime: () => {} },\n    gain: { value: 0, setValueAtTime: () => {} },\n    connect: () => {},\n  }),\n  createBufferSource: () => ({\n    buffer: null,\n    connect: () => {},\n    start: () => {},\n    stop: () => {},\n    onEnded: null,\n  }),\n  currentTime: 0,\n  decodeAudioData: (data: ArrayBuffer) => Promise.resolve({\n    duration: 0,\n  } as AudioBuffer),\n} as unknown as AudioContext;\n\nexport default MockAudioContext;\n"
  },
  {
    "path": "packages/audiodocs/src/audio/effects.ts",
    "content": "import AudioManager from \"./AudioManager\";\n\nexport function createGainEffect(gain: number = 1.0): GainNode {\n  const audioContext = AudioManager.aCtx;\n  const gainNode = audioContext.createGain();\n  gainNode.gain.setValueAtTime(gain, audioContext.currentTime);\n  return gainNode;\n}\n\nexport function createLowPassFilter(\n  frequency: number = 1000,\n): BiquadFilterNode {\n  const audioContext = AudioManager.aCtx;\n  const filter = audioContext.createBiquadFilter();\n  filter.type = \"lowpass\";\n  filter.frequency.setValueAtTime(frequency, audioContext.currentTime);\n  filter.Q.setValueAtTime(1, audioContext.currentTime);\n  return filter;\n}\n\nexport function createHighPassFilter(\n  frequency: number = 300,\n): BiquadFilterNode {\n  const audioContext = AudioManager.aCtx;\n  const filter = audioContext.createBiquadFilter();\n  filter.type = \"highpass\";\n  filter.frequency.setValueAtTime(frequency, audioContext.currentTime);\n  filter.Q.setValueAtTime(1, audioContext.currentTime);\n  return filter;\n}\n\nexport function createSimpleReverb(\n  roomSize: number = 0.5,\n  decayTime: number = 2,\n): ConvolverNode {\n  const audioContext = AudioManager.aCtx;\n  const convolver = audioContext.createConvolver();\n\n  const sampleRate = audioContext.sampleRate;\n  const length = sampleRate * decayTime;\n  const impulse = audioContext.createBuffer(2, length, sampleRate);\n\n  for (let channel = 0; channel < 2; channel++) {\n    const channelData = impulse.getChannelData(channel);\n    for (let i = 0; i < length; i++) {\n      const decay = Math.pow(1 - i / length, 2);\n      channelData[i] = (Math.random() * 2 - 1) * decay * roomSize;\n    }\n  }\n\n  convolver.buffer = impulse;\n  return convolver;\n}\n\nexport function createDelay(\n  delayTime: number = 0.3,\n  feedback: number = 0.3,\n  wet: number = 0.5,\n): AudioNode {\n  const audioContext = AudioManager.aCtx;\n\n  const delay = audioContext.createDelay(1.0);\n  delay.delayTime.setValueAtTime(delayTime, audioContext.currentTime);\n\n  return delay;\n}\n\nexport function createOverdrive(amount: number = 0.5): WaveShaperNode {\n  const audioContext = AudioManager.aCtx;\n  const waveShaper = audioContext.createWaveShaper();\n\n  const samples = 44100;\n  const curve = new Float32Array(samples);\n\n  const clampedAmount = Math.max(0, Math.min(1, amount));\n  const drive = 2 + clampedAmount * 30;\n\n  for (let i = 0; i < samples; i++) {\n    const x = (i * 2) / samples - 1;\n    const driven = x * drive;\n\n    let distorted;\n    if (driven > 0) {\n      distorted = Math.tanh(driven * 1.5) * 0.8;\n    } else {\n      distorted = Math.tanh(driven * 1.2) * 0.9;\n    }\n\n    const harmonics = Math.sin(driven * 3) * 0.1 * clampedAmount;\n\n    curve[i] = Math.max(-1, Math.min(1, distorted + harmonics)) * 3;\n  }\n\n  waveShaper.curve = curve;\n  waveShaper.oversample = \"4x\";\n\n  return waveShaper;\n}\n\nexport function createBandPassFilter(\n  lowFreq: number = 800,\n  highFreq: number = 3000,\n): BiquadFilterNode {\n  const audioContext = AudioManager.aCtx;\n  const filter = audioContext.createBiquadFilter();\n  filter.type = \"bandpass\";\n\n  const centerFreq = Math.sqrt(lowFreq * highFreq);\n  filter.frequency.setValueAtTime(centerFreq, audioContext.currentTime);\n\n  const Q = centerFreq / (highFreq - lowFreq);\n  filter.Q.setValueAtTime(Q, audioContext.currentTime);\n\n  return filter;\n}\n\nexport function createEffectsMap(\n  effects: { name: string; node: AudioNode }[],\n): Map<string, AudioNode> {\n  const effectsMap = new Map<string, AudioNode>();\n\n  effects.forEach(({ name, node }) => {\n    effectsMap.set(name, node);\n  });\n\n  return effectsMap;\n}\n\nexport const presetEffects = {\n  ambient: () =>\n    createEffectsMap([\n      { name: \"reverb\", node: createSimpleReverb(0.3, 1.5) },\n      { name: \"lowpass\", node: createLowPassFilter(8000) },\n    ]),\n\n  warm: () =>\n    createEffectsMap([\n      { name: \"lowpass\", node: createLowPassFilter(3000) },\n      { name: \"gain\", node: createGainEffect(1.2) },\n    ]),\n\n  distorted: () =>\n    createEffectsMap([\n      { name: \"overdrive\", node: createOverdrive(0.85) },\n      { name: \"midpass\", node: createBandPassFilter(800, 3000) },\n      { name: \"lowpass\", node: createLowPassFilter(6000) },\n      { name: \"gain\", node: createGainEffect(0.2) },\n    ]),\n\n  echo: () =>\n    createEffectsMap([{ name: \"delay\", node: createDelay(0.25, 0.4, 0.3) }]),\n\n  test: () => createEffectsMap([{ name: \"gain\", node: createGainEffect(0.3) }]),\n\n  overdrive_only: () =>\n    createEffectsMap([{ name: \"overdrive\", node: createOverdrive(0.9) }]),\n};\n"
  },
  {
    "path": "packages/audiodocs/src/audio/types.ts",
    "content": "export interface BufferMetadata {\n  id: string;\n  duration: number;\n}\n\nexport interface LoadedBuffer {\n  id: string;\n  buffer: AudioBuffer;\n}\n\nexport type AudioManagerEventType = 'playing' | 'stopped' | 'outputVolumeChanged';\n\ninterface AudioManagerEventEmptyPayload {}\n\ninterface AudioManagerOutputVolumeChangedPayload {\n  volume: number; // new volume level\n}\n\nexport interface AudioManagerUpdatePayload {\n  progress: number;\n}\n\nexport type AudioManagerEventPayloads = {\n  playing: AudioManagerEventEmptyPayload;\n  stopped: AudioManagerEventEmptyPayload;\n  outputVolumeChanged: AudioManagerOutputVolumeChangedPayload;\n};\n\nexport interface AudioManagerEvent<T extends AudioManagerEventType = AudioManagerEventType> {\n  type: T;\n  payload: AudioManagerEventPayloads[T];\n}\n\nexport interface ActiveSound {\n  id: string;\n  bufferId: string;\n  startedAt: number;\n  sourceNode: AudioBufferSourceNode;\n}\n\nexport interface PlaySoundOptions {\n  loop?: boolean;\n  startFrom?: number;\n  unique?: boolean;\n  volume?: number;\n  onEnded?: () => void;\n}\n\n\nexport type PlaySoundReturnValue = false | { id: string, startedAt: number }\n"
  },
  {
    "path": "packages/audiodocs/src/audio/useEqualizerControls.ts",
    "content": "import { useCallback, useEffect, useState, useRef } from \"react\";\nimport AudioManager from \"./AudioManager\";\nimport { frequencies } from \"./Equalizer\";\n\nexport interface EqualizerControl {\n  frequency: number;\n  gain: number;\n  type: BiquadFilterType;\n}\n\ninterface DragState {\n  isDragging: boolean;\n  dragIndex: number;\n  startY: number;\n  startGain: number;\n}\n\nconst minFreq = frequencies[0].frequency;\nconst maxFreq = frequencies[frequencies.length - 1].frequency;\nconst logMin = Math.log10(minFreq);\nconst logMax = Math.log10(maxFreq);\n\nconst initialValues: EqualizerControl[] = frequencies.map(freq => ({\n  frequency: freq.frequency,\n  type: freq.type,\n  gain: 0,\n}));\n\nexport default function useEqualizerControls(canvasRef?: React.RefObject<HTMLCanvasElement>) {\n  const [equalizerBands, setEqualizerBands] = useState<EqualizerControl[]>(initialValues);\n  const dragState = useRef<DragState>({\n    isDragging: false,\n    dragIndex: -1,\n    startY: 0,\n    startGain: 0,\n  });\n  const canvasRect = useRef<DOMRect | null>(null);\n\n  const updateGain = useCallback((index: number, gain: number) => {\n    const clampedGain = Math.max(-12, Math.min(12, gain));\n\n    setEqualizerBands(prev => {\n      const newBands = [...prev];\n      newBands[index] = { ...newBands[index], gain: clampedGain };\n      return newBands;\n    });\n  }, []);\n\n  const getControlPointPosition = useCallback((frequency: number, gain: number, canvasRect: DOMRect, index: number) => {\n    const labelBoxSize = 32;\n    const drawingWidth = canvasRect.width - labelBoxSize;\n    const drawingHeight = canvasRect.height - labelBoxSize;\n    const offsetX = 0;\n    const offsetY = 0;\n\n    const logFreq = Math.log10(frequency);\n    const normalizedPos = (logFreq - logMin) / (logMax - logMin);\n    let x = offsetX + (normalizedPos * drawingWidth);\n\n    if (index === 0) {\n      x += 96;\n    } else if (index === 1) {\n      x += 66;\n    } else if (index === 2) {\n      x = offsetX + drawingWidth / 2 + 59;\n    } else if (index === 3) {\n      x -= 18;\n    } else if (index === 4) {\n      x -= 96;\n    }\n\n    const normalizedGain = gain / 12;\n    const y = offsetY + drawingHeight / 2 - (normalizedGain * drawingHeight / 2);\n\n    return { x, y };\n  }, []);\n\n  const findControlPointAtPosition = useCallback((x: number, y: number, rect: DOMRect) => {\n    const controlPointRadius = 24;\n\n    for (let i = 0; i < equalizerBands.length; i++) {\n      const band = equalizerBands[i];\n      const pos = getControlPointPosition(band.frequency, band.gain, rect, i);\n\n      const distance = Math.sqrt((x - pos.x) ** 2 + (y - pos.y) ** 2);\n      if (distance <= controlPointRadius) {\n        return i;\n      }\n    }\n    return -1;\n  }, [equalizerBands, getControlPointPosition]);\n\n  const handleStart = useCallback((clientX: number, clientY: number) => {\n    if (!canvasRef?.current) {\n      return;\n    }\n\n    const rect = canvasRef.current.getBoundingClientRect();\n    canvasRect.current = rect;\n\n    const x = clientX - rect.left;\n    const y = clientY - rect.top;\n\n    const index = findControlPointAtPosition(x, y, rect);\n    if (index !== -1) {\n      canvasRef.current.style.cursor = 'grabbing';\n      dragState.current = {\n        isDragging: true,\n        dragIndex: index,\n        startY: clientY,\n        startGain: equalizerBands[index].gain,\n      };\n    }\n  }, [canvasRef, findControlPointAtPosition, equalizerBands]);\n\n  const handleMove = useCallback((clientY: number) => {\n    if (!dragState.current.isDragging || !canvasRect.current) {\n      return;\n    }\n\n    const deltaY = dragState.current.startY - clientY;\n\n    // TODO: global variable\n    const labelBoxSize = 32;\n    const drawingHeight = canvasRect.current.height - labelBoxSize;\n    const gainChange = (deltaY / drawingHeight) * 24;\n    let newGain = dragState.current.startGain + gainChange;\n\n\n    // TODO: global variable\n    const controlPointRadius = 24;\n    const maxGainForBounds = 12 * (1 - (2 * controlPointRadius) / drawingHeight);\n    const minGainForBounds = -maxGainForBounds;\n\n    newGain = Math.max(minGainForBounds, Math.min(maxGainForBounds, newGain));\n\n    updateGain(dragState.current.dragIndex, newGain);\n  }, [updateGain]);\n\n  const handleEnd = useCallback(() => {\n    dragState.current.isDragging = false;\n    dragState.current.dragIndex = -1;\n    canvasRect.current = null;\n    if (canvasRef?.current) {\n      canvasRef.current.style.cursor = 'pointer';\n    }\n  }, []);\n\n  const handleMouseDown = useCallback((e: MouseEvent) => {\n    handleStart(e.clientX, e.clientY);\n  }, [handleStart]);\n\n  const handleMouseMove = useCallback((e: MouseEvent) => {\n    handleMove(e.clientY);\n  }, [handleMove]);\n\n  const handleMouseUp = useCallback(() => {\n    handleEnd();\n  }, [handleEnd]);\n\n  const handleTouchStart = useCallback((e: TouchEvent) => {\n    if (e.touches.length === 1) {\n      const touch = e.touches[0];\n      handleStart(touch.clientX, touch.clientY);\n    }\n  }, [handleStart]);\n\n  const handleTouchMove = useCallback((e: TouchEvent) => {\n    if (e.touches.length === 1 && dragState.current.isDragging) {\n      e.preventDefault();\n      const touch = e.touches[0];\n      handleMove(touch.clientY);\n    }\n  }, [handleMove]);\n\n  const handleTouchEnd = useCallback(() => {\n    handleEnd();\n  }, [handleEnd]);\n\n  useEffect(() => {\n    let rafId: number | null = null;\n    let cleanup: (() => void) | undefined;\n\n    const attachListeners = () => {\n      const canvas = canvasRef?.current;\n      if (!canvas) {\n        rafId = requestAnimationFrame(attachListeners);\n        return;\n      }\n\n      // TODO: those should be react params\n      canvas.addEventListener('mousedown', handleMouseDown);\n      canvas.addEventListener('touchstart', handleTouchStart, { passive: false });\n      canvas.style.cursor = 'pointer';\n\n      document.addEventListener('mousemove', handleMouseMove);\n      document.addEventListener('mouseup', handleMouseUp);\n      document.addEventListener('touchmove', handleTouchMove, { passive: false });\n      document.addEventListener('touchend', handleTouchEnd);\n      document.addEventListener('touchcancel', handleTouchEnd);\n\n      cleanup = () => {\n        canvas.removeEventListener('mousedown', handleMouseDown);\n        canvas.removeEventListener('touchstart', handleTouchStart);\n\n        document.removeEventListener('mousemove', handleMouseMove);\n        document.removeEventListener('mouseup', handleMouseUp);\n        document.removeEventListener('touchmove', handleTouchMove);\n        document.removeEventListener('touchend', handleTouchEnd);\n        document.removeEventListener('touchcancel', handleTouchEnd);\n      };\n    };\n\n    attachListeners();\n\n    return () => {\n      if (rafId !== null) {\n        cancelAnimationFrame(rafId);\n      }\n      cleanup?.();\n    };\n  }, [canvasRef, handleMouseDown, handleMouseMove, handleMouseUp, handleTouchStart, handleTouchMove, handleTouchEnd]);\n\n  useEffect(() => {\n    AudioManager.equalizer.setFrequencies(equalizerBands.map(band => band.frequency));\n    AudioManager.equalizer.setGains(equalizerBands.map(band => band.gain));\n  }, [equalizerBands]);\n\n  return {\n    equalizerBands,\n    updateGain,\n  };\n}\n"
  },
  {
    "path": "packages/audiodocs/src/audio/useIsPlaying.ts",
    "content": "import React, { useEffect, useState } from 'react';\n\nimport AudioManager from './AudioManager';\n\nexport default function useIsPlaying() {\n  const [isPlaying, setIsPlaying] = useState(AudioManager.isPlaying);\n\n  useEffect(() => {\n    AudioManager.addEventListener('playing', () => {\n      setIsPlaying(true);\n    });\n\n    AudioManager.addEventListener('stopped', () => {\n      setIsPlaying(false);\n    });\n\n    return () => {\n      AudioManager.removeEventListener('playing', () => setIsPlaying(true));\n      AudioManager.removeEventListener('stopped', () => setIsPlaying(false));\n    };\n  }, []);\n\n  return isPlaying;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/audio/utils.ts",
    "content": "\nexport function downSampleLog(\n    fft: Uint8Array,\n    targetBucketCount: number,\n    sampleRate: number,\n    minFreq = 20\n): number[] {\n    const nyquist = sampleRate / 2;\n    const binCount = fft.length;\n    const maxFreq = nyquist;\n\n    const buckets = new Array<number>(targetBucketCount).fill(0);\n    const bucketCounts = new Array<number>(targetBucketCount).fill(0);\n\n    for (let i = 0; i < binCount; i += 1) {\n        const freq = (i / binCount) * nyquist;\n        const safeFreq = Math.max(freq, minFreq);\n        const norm = Math.log(safeFreq / minFreq) / Math.log(maxFreq / minFreq);\n        const band = Math.max(\n            0,\n            Math.min(targetBucketCount - 1, Math.round(norm * (targetBucketCount - 1)))\n        );\n\n        buckets[band] += fft[i];\n        bucketCounts[band] += 1;\n    }\n\n    for (let i = 0; i < targetBucketCount; i += 1) {\n      if (bucketCounts[i] > 0) {\n          buckets[i] /= bucketCounts[i];\n      } else {\n          buckets[i] = buckets[Math.max(0, i - 1)];\n      }\n    }\n\n    return buckets;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/canvasUtils/clearCanvas.ts",
    "content": "\nexport default function clearCanvas(canvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D) {\n  ctx.fillStyle = '#fcfcff';\n  ctx.clearRect(0, 0, canvas.width, canvas.height);\n}\n"
  },
  {
    "path": "packages/audiodocs/src/canvasUtils/createGradient.ts",
    "content": "\nexport default function createGradient(ctx: CanvasRenderingContext2D, y: number, maxHeight: number, rgb: [number, number, number], stopAt: number = 0.95): CanvasGradient {\n  const gradient = ctx.createLinearGradient(0, y, 0, y + maxHeight);\n\n  gradient.addColorStop(0, `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, 0.3)`);\n  gradient.addColorStop(stopAt, `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, 0.0)`);\n\n  return gradient;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/canvasUtils/drawEQControlPoints.ts",
    "content": "import { frequencies } from \"../audio/Equalizer\";\nimport AudioManager from \"../audio/AudioManager\";\n\nconst minFreq = frequencies[0].frequency;\nconst maxFreq = frequencies[frequencies.length - 1].frequency;\nconst logMin = Math.log10(minFreq);\nconst logMax = Math.log10(maxFreq);\n\nexport default function drawEQControlPoints(\n  canvas: HTMLCanvasElement,\n  ctx: CanvasRenderingContext2D,\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  fillColor: string\n) {\n  const controlPointSize = 48;\n  const halfSize = controlPointSize / 2;\n\n  frequencies.forEach((freqConfig, index) => {\n    if (AudioManager.equalizer && AudioManager.equalizer.bands[index]) {\n      const band = AudioManager.equalizer.bands[index];\n      const frequency = freqConfig.frequency;\n      const gainValue = band.gain.value;\n\n      const logFreq = Math.log10(frequency);\n      const normalizedPos = (logFreq - logMin) / (logMax - logMin);\n      let posX = x + (normalizedPos * width);\n\n      if (index === 0) {\n        posX += 96;\n      } else if (index === 1) {\n        posX += 66;\n      } else if (index === 2) {\n        posX = x + width / 2 + 59;\n      } else if (index === 3) {\n        posX -= 18;\n      } else {\n        posX -= 96;\n      }\n\n      const normalizedGain = gainValue / 12;\n      const posY = y + height / 2 - (normalizedGain * height / 2);\n\n      ctx.beginPath();\n      ctx.arc(posX, posY, halfSize, 0, Math.PI * 2);\n      ctx.fillStyle = fillColor;\n      ctx.fill();\n      ctx.strokeStyle = fillColor;\n      ctx.lineWidth = 2;\n      ctx.stroke();\n\n      // Draw frequency label\n      ctx.fillStyle = '#FFFFFF';\n      ctx.font = '16px Aeonik';\n      ctx.textAlign = 'center';\n      ctx.textBaseline = 'middle';\n\n      // Format frequency display\n      const freqLabel = (index + 1).toString();\n\n      ctx.fillText(freqLabel, posX, posY);\n    }\n  });\n}\n"
  },
  {
    "path": "packages/audiodocs/src/canvasUtils/drawEqGrid.ts",
    "content": "\ninterface GridColumn {\n  label?: string;\n}\n\ninterface GridRow {\n  label?: string;\n}\n\ninterface GridOptions {\n  columns: GridColumn[];\n  rows: GridRow[];\n}\n\nconst defaultOptions: GridOptions = {\n  columns: [{}, { label: '100' }, { label: '1k' }, { label: '10k' },  {}],\n  rows: [{}, { label: '+6' }, { label: '0' }, { label: '-6' }, {}],\n};\n\n// size of the whitespace under/after the grid to draw the labels\n// TODO: better name?\nconst labelBoxSize = 32;\n\nexport function getDrawingBounds(canvas: HTMLCanvasElement): { x: number; y: number; width: number; height: number } {\n  const dpr = typeof window !== 'undefined' && window.devicePixelRatio\n    ? window.devicePixelRatio\n    : 1;\n  const width = canvas.clientWidth || Math.floor(canvas.width / dpr);\n  const height = canvas.clientHeight || Math.floor(canvas.height / dpr);\n\n  return {\n    x: 0,\n    y: 0,\n    width: Math.max(0, width - labelBoxSize),\n    height: Math.max(0, height - labelBoxSize),\n  };\n}\n\nfunction drawColumns(ctx: CanvasRenderingContext2D, columns: GridColumn[], x: number, y: number, width: number, height: number) {\n  const columnWidth = width / (columns.length - 1);\n\n  columns.forEach((_c, index) => {\n    const colX = x + index * columnWidth;\n\n    ctx.strokeStyle = '#C1C6E5';\n    ctx.lineWidth = 0.5;\n    ctx.beginPath();\n    ctx.moveTo(colX, y);\n    ctx.lineTo(colX, y + height);\n    ctx.stroke();\n  });\n}\n\nfunction drawRows(ctx: CanvasRenderingContext2D, rows: GridRow[], x: number, y: number, width: number, height: number) {\n  const rowHeight = height / (rows.length - 1);\n\n  rows.forEach((_r, index) => {\n    const rowY = y + index * rowHeight;\n\n    ctx.strokeStyle = '#C1C6E5';\n    ctx.lineWidth = 0.5;\n    ctx.beginPath();\n    ctx.moveTo(x, rowY);\n    ctx.lineTo(x + width, rowY);\n    ctx.stroke();\n  });\n}\n\nfunction drawColumnLabels(ctx: CanvasRenderingContext2D, columns: GridColumn[], x: number, y: number, width: number, height: number) {\n  const columnWidth = width / (columns.length - 1);\n\n  columns.forEach((column, index) => {\n    if (!column.label) {\n      return;\n    }\n\n    ctx.fillStyle = '#C1C6E5';\n    ctx.font = '400 16px Aeonik';\n    const textWidth = ctx.measureText(column.label).width;\n\n    const colX = x + index * columnWidth;\n    const textX = colX;\n    ctx.fillText(column.label, textX, y + height + 20);\n  });\n}\n\nfunction drawRowLabels(ctx: CanvasRenderingContext2D, rows: GridRow[], x: number, y: number, width: number, height: number) {\n  const rowHeight = height / (rows.length - 1);\n\n  rows.forEach((row, index) => {\n    if (!row.label) {\n      return;\n    }\n\n    ctx.fillStyle = '#C1C6E5';\n    ctx.font = '400 16px Aeonik';\n    const textMetrics = ctx.measureText(row.label);\n    const textHeight = textMetrics.actualBoundingBoxAscent + textMetrics.actualBoundingBoxDescent;\n\n    const rowY = y + index * rowHeight;\n    ctx.fillText(row.label, width + 16, rowY);\n  });\n}\n\nexport default function drawEqGrid(canvas: HTMLCanvasElement, ctx: CanvasRenderingContext2D, options: GridOptions = defaultOptions) {\n  const { columns, rows } = options;\n  const { x, y, width, height } = getDrawingBounds(canvas);\n\n  drawColumns(ctx, columns, x, y, width, height);\n  drawRows(ctx, rows, x, y, width, height);\n\n  drawColumnLabels(ctx, columns, x, y, width, height);\n  drawRowLabels(ctx, rows, x, y, width, height);\n};\n"
  },
  {
    "path": "packages/audiodocs/src/canvasUtils/drawShadedCurve.ts",
    "content": "\nimport { Point } from \"./types\";\n\nfunction drawSmoothCurve(ctx: CanvasRenderingContext2D, points: Point[]): void {\n  ctx.moveTo(points[0].x, points[0].y);\n\n  const midX1 = (points[0].x + points[1].x) / 2;\n  const midY1 = (points[0].y + points[1].y) / 2;\n  ctx.quadraticCurveTo(points[0].x, points[0].y, midX1, midY1);\n\n  for (let i = 1; i < points.length - 1; i += 1) {\n    const current = points[i];\n    const next = points[i + 1];\n    const endX = (current.x + next.x) / 2;\n    const endY = (current.y + next.y) / 2;\n    ctx.quadraticCurveTo(current.x, current.y, endX, endY);\n  }\n}\n\nfunction drawFilledArea(ctx: CanvasRenderingContext2D, points: Point[], y: number, maxHeight: number, gradient: CanvasGradient): void {\n  ctx.beginPath();\n  ctx.moveTo(points[0].x, y + maxHeight);\n  ctx.lineTo(points[0].x, points[0].y);\n\n  drawSmoothCurve(ctx, points);\n\n  ctx.lineTo(points[points.length - 1].x, y + maxHeight);\n  ctx.lineTo(points[0].x, y + maxHeight);\n  ctx.closePath();\n\n  ctx.fillStyle = gradient;\n  ctx.fill();\n}\n\nfunction drawStrokeLine(ctx: CanvasRenderingContext2D, points: Point[]): void {\n  ctx.beginPath();\n  drawSmoothCurve(ctx, points);\n  ctx.stroke();\n}\n\nexport default function drawShadedCurve(\n  ctx: CanvasRenderingContext2D,\n  points: Point[],\n  y: number,\n  maxHeight: number,\n  gradient: CanvasGradient,\n  color: string\n): void {\n  ctx.strokeStyle = color;\n  ctx.lineWidth = 2;\n\n  drawFilledArea(ctx, points, y, maxHeight, gradient);\n  drawStrokeLine(ctx, points);\n}\n\nexport { drawSmoothCurve, drawFilledArea, drawStrokeLine };\n"
  },
  {
    "path": "packages/audiodocs/src/canvasUtils/drawSpectroLines.ts",
    "content": "\n\nexport default function drawSpectroLines(\n  ctx: CanvasRenderingContext2D,\n  bars: number[],\n  drawCount: number,\n  bucketShift: number,\n  barHeight: number,\n  barWidth: number,\n  barSpacing: number,\n  colorMode: 'dark' | 'light',\n) {\n  for (let i = 0; i < drawCount + 2 * bucketShift; i += 1) {\n    const value = bars[i] || 0;\n    const height = Math.max((value / 255) * barHeight, 2);\n    const offset = barHeight - height;\n    const x = (barWidth + barSpacing) * (i);\n\n    const gradient = ctx.createLinearGradient(0, offset + height, 0, offset);\n\n    if (colorMode === 'dark') {\n      gradient.addColorStop(0, '#FF6259');\n      gradient.addColorStop(0.85, '#232736');\n    } else {\n      gradient.addColorStop(0, '#FF6259');\n      gradient.addColorStop(0.85, '#fcfcff');\n    }\n\n    ctx.fillStyle = gradient;\n    ctx.fillRect(x, offset, barWidth, height);\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/canvasUtils/getBarWidth.ts",
    "content": "\nexport default function getBarWidth(canvasWidth: number, bucketCount: number, barSpacing: number): number {\n  const initialWidth = Math.max(20, canvasWidth / bucketCount);\n\n  return canvasWidth / Math.floor(canvasWidth / (initialWidth + barSpacing)) - barSpacing;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/canvasUtils/getEqualizerResponse.ts",
    "content": "import AudioManager from \"../audio/AudioManager\";\nimport { Point } from \"./types\";\n\nconst frequencies = [32, 100, 1000, 10000, 16000];\nconst minFreq = frequencies[0];\nconst maxFreq = frequencies[frequencies.length - 1];\nconst logMin = Math.log10(minFreq);\nconst logMax = Math.log10(maxFreq);\n\ninterface ResponsePoint {\n  frequency: number;\n  magnitude: number;\n  posX: number;\n}\n\nexport default function getEqualizerResponse(x: number, maxWidth: number, y: number, maxHeight: number): Point[] {\n  const numPoints = 200;\n  const responsePoints: ResponsePoint[] = [];\n\n  for (let i = 0; i < numPoints; i += 1) {\n    const logFreq = logMin + (i / (numPoints - 1)) * (logMax - logMin);\n    const frequency = Math.pow(10, logFreq);\n\n    const singleFreq = new Float32Array([frequency]);\n    const singleMag = new Float32Array(1);\n    const singlePhase = new Float32Array(1);\n\n    let totalMagnitude = 1;\n\n    AudioManager.equalizer.bands.forEach(band => {\n      band.getFrequencyResponse(singleFreq, singleMag, singlePhase);\n      totalMagnitude *= singleMag[0];\n    });\n\n    let posX: number;\n    if (i === 0) {\n      posX = x;\n    } else if (i === numPoints - 1) {\n      posX = x + maxWidth + 3;\n    } else {\n      const normalizedPos = i / (numPoints - 1);\n      posX = x + (normalizedPos * maxWidth);\n    }\n\n    responsePoints.push({\n      frequency,\n      magnitude: totalMagnitude,\n      posX\n    });\n  }\n\n  return responsePoints.map(point => ({\n    x: point.posX,\n    y: y + maxHeight / 2 - (Math.log10(point.magnitude) * 12 * maxHeight / 24)\n  }));\n}\n"
  },
  {
    "path": "packages/audiodocs/src/canvasUtils/groupEQBandLevels.ts",
    "content": "import AudioManager from \"../audio/AudioManager\";\nimport { frequencies } from \"../audio/Equalizer\";\n\nfunction getBinIndexForFrequency(freq: number) {\n  const nyquist = AudioManager.aCtx.sampleRate / 2;\n  const binCount = AudioManager.analyser.fftSize / 2;\n\n  return Math.round(freq / nyquist * binCount);\n}\n\nexport default function groupEQBandLevels(fftOutput: Float32Array) {\n  const bandLevels: number[] = [];\n\n  for (let i = 0; i < frequencies.length - 1; i += 1) {\n    const startFreq = frequencies[i];\n    const endFrequency = frequencies[i + 1];\n\n    const startIndex = getBinIndexForFrequency(startFreq);\n    const endIndex = getBinIndexForFrequency(endFrequency);\n\n    let sum = 0;\n\n    for (let j = startIndex; j <= endIndex; j += 1) {\n      sum += fftOutput[j];\n    }\n\n    const avgDb = sum / (endIndex - startIndex + 1);\n\n    const clamped = Math.max(-12, Math.min(avgDb, 12));\n    const norm = (clamped + 12) / 24;\n    const visualValue = -12 + norm * 24;\n\n    bandLevels.push(visualValue);\n  }\n\n  return bandLevels;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/canvasUtils/index.ts",
    "content": "export * from './types';\nexport * from './drawEqGrid';\n\nexport { default as drawEqGrid } from './drawEqGrid';\nexport { default as clearCanvas } from './clearCanvas';\nexport { default as getBarWidth } from './getBarWidth';\nexport { default as createGradient } from './createGradient';\nexport { default as drawShadedCurve } from './drawShadedCurve';\nexport { default as drawSpectroLines } from './drawSpectroLines';\nexport { default as stretchFrequencies } from './stretchFrequencies';\nexport { default as drawEQControlPoints } from './drawEQControlPoints';\nexport { default as getEqualizerResponse } from './getEqualizerResponse';\nexport { default as lagrangeInterpolation } from './lagrangeInterpolation';\n"
  },
  {
    "path": "packages/audiodocs/src/canvasUtils/lagrangeInterpolation.ts",
    "content": "\nexport default function lagrangeInterpolation(\n  xTarget: number,\n  xs: number[],\n  ys: number[]\n): number {\n  const n = xs.length;\n  let result = 0;\n\n  for (let i = 0; i < n; i++) {\n    let term = ys[i];\n    for (let j = 0; j < n; j++) {\n      if (j !== i) {\n        term *= (xTarget - xs[j]) / (xs[i] - xs[j]);\n      }\n    }\n    result += term;\n  }\n\n  return result;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/canvasUtils/stretchFrequencies.ts",
    "content": "\n\nimport AudioManager from \"../audio/AudioManager\";\n\ninterface DataPoint {\n  freq: number;\n  value: number;\n  posX: number;\n}\n\nconst frequencies = [32, 100, 1000, 10000, 16000];\nconst bucketSizes = [5, 15, 20, 15];\n\nconst minFreq = frequencies[0];\nconst maxFreq = frequencies[frequencies.length - 1];\nconst logMin = Math.log10(minFreq);\nconst logMax = Math.log10(maxFreq);\n\nexport default function stretchFrequencies(fftOutput: Uint8Array, x: number, y: number, maxWidth: number, maxHeight: number) {\n  const dataPoints: DataPoint[] = [];\n\n  for (let rangeIndex = 0; rangeIndex < frequencies.length - 1; rangeIndex += 1) {\n    const startFreq = frequencies[rangeIndex];\n    const endFreq = frequencies[rangeIndex + 1];\n    const currentBucketSize = bucketSizes[rangeIndex];\n\n    for (let pointIndex = 0; pointIndex < currentBucketSize; pointIndex += 1) {\n      const t = pointIndex / (currentBucketSize - 1);\n      const frequency = startFreq + t * (endFreq - startFreq);\n\n      const targetIndex = Math.round((frequency * (fftOutput.length - 1)) / AudioManager.aCtx.sampleRate);\n      const clampedIndex = Math.max(0, Math.min(targetIndex, fftOutput.length - 1));\n      const value = fftOutput[clampedIndex] || 0;\n\n      const logFreq = Math.log10(frequency);\n      const normalizedPos = (logFreq - logMin) / (logMax - logMin);\n      const posX = x + (normalizedPos * maxWidth);\n\n      dataPoints.push({ freq: frequency, value, posX });\n    }\n  }\n\n  return dataPoints.map(p => ({\n    x: p.posX,\n    y: y + maxHeight - (p.value / 255 * maxHeight)\n  }));\n}\n"
  },
  {
    "path": "packages/audiodocs/src/canvasUtils/types.ts",
    "content": "export interface Point {\n  x: number;\n  y: number;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/AnimableIcon/index.tsx",
    "content": "import clsx from 'clsx';\nimport React, { useEffect, JSX } from 'react';\nimport { useColorMode } from '@docusaurus/theme-common';\n\nimport styles from './styles.module.css';\n\nexport const Animation = {\n  FADE_IN_OUT: styles.iconClicked,\n};\n\ninterface Props {\n  icon: JSX.Element;\n  iconDark?: JSX.Element;\n  animation: string;\n  onClick: (\n    actionPerformed: boolean,\n    setActionPerformed: (ap: boolean) => void\n  ) => void;\n}\n\nconst AnimableIcon = ({\n  icon,\n  iconDark,\n  animation = Animation.FADE_IN_OUT,\n  onClick,\n}: Props): JSX.Element => {\n  const { colorMode } = useColorMode();\n  const [actionPerformed, setActionPerformed] = React.useState(false);\n\n  useEffect(() => {\n    const timeout = setTimeout(() => setActionPerformed(() => false), 1000);\n    return () => clearTimeout(timeout);\n  }, [actionPerformed]);\n\n  return (\n    <div\n      onClick={() => onClick(actionPerformed, setActionPerformed)}\n      className={clsx(styles.actionIcon, actionPerformed && animation)}\n    >\n      {colorMode === 'light' ? icon : iconDark || icon}\n    </div>\n  );\n};\n\nexport default AnimableIcon;\n"
  },
  {
    "path": "packages/audiodocs/src/components/AnimableIcon/styles.module.css",
    "content": ".actionIcon {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n\n  padding: 0.25em;\n  cursor: pointer;\n\n  /* Border applied to omit enlarging icon during the animation. */\n  border: 1px solid transparent;\n  border-radius: 3px;\n}\n\n.iconClicked {\n  animation: 1s iconClick;\n}\n\n@keyframes iconClick {\n  0% {\n    border: 1px solid var(--swm-interactive-copy-button-off);\n  }\n  50% {\n    border: 1px solid var(--swm-interactive-copy-button-on);\n  }\n  100% {\n    border: 1px solid var(--swm-interactive-copy-button-off);\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/AudioNodePropsTable/AudioNodePropsTable.tsx",
    "content": "import React, { memo } from 'react';\n\nimport DetailBox from '@site/src/ui/DetailBox';\n\nimport styles from './styles.module.css';\n\ntype ChannelCountMode = 'max' | 'clamped-max' | 'explicit';\ntype ChannelInterpretation = 'speakers' | 'discrete';\n\ninterface AudioNodePropsTableProps {\n  numberOfInputs: number;\n  numberOfOutputs: number;\n  channelCount: number | string;\n  channelCountMode: ChannelCountMode;\n  channelInterpretation: ChannelInterpretation;\n}\n\nconst AudioNodePropsTable = ({\n  numberOfInputs,\n  numberOfOutputs,\n  channelCount,\n  channelCountMode,\n  channelInterpretation,\n}: AudioNodePropsTableProps) => {\n  const props = [\n    { label: 'Number of inputs', value: numberOfInputs },\n    { label: 'Number of outputs', value: numberOfOutputs },\n    { label: 'Channel count', value: channelCount },\n    { label: 'Channel count mode', value: channelCountMode },\n    { label: 'Channel interpretation', value: channelInterpretation },\n  ];\n\n  return (\n    <DetailBox\n      tag=\"AudioNode\"\n      info=\"properties\"\n      startOpen={false}\n      className={styles.propsDetailBox}\n    >\n      <table className={styles.audioNodeProps} style={{ width: '100%', display: 'table' }}>\n        <tbody>\n          {props.map((prop) => (\n            <tr key={prop.label}>\n              <td\n                style={{\n                  textAlign: 'left',\n                  whiteSpace: 'nowrap',\n                }}\n              >\n                {prop.label}\n              </td>\n              <td\n                style={{\n                  textAlign: 'left',\n                  width: '99%',\n                }}\n              >\n                {prop.value}\n              </td>\n            </tr>\n          ))}\n        </tbody>\n      </table>\n    </DetailBox>\n  );\n};\nexport default memo(AudioNodePropsTable);\n"
  },
  {
    "path": "packages/audiodocs/src/components/AudioNodePropsTable/index.ts",
    "content": "export { default } from './AudioNodePropsTable';\n\n"
  },
  {
    "path": "packages/audiodocs/src/components/AudioNodePropsTable/styles.module.css",
    "content": "\n.propsDetailBox {\n  --audiodocs-detail-box-bg: transparent;\n  --audiodocs-detail-box-shadow: transparent;\n  --audiodocs-detail-box-tag-bg: var(--swm-blue-light-20);\n  background: transparent;\n  box-shadow: none;\n  margin: 0;\n  padding: 0;\n}\n\n:root[data-theme='dark'] {\n  .propsDetailBox {\n    --audiodocs-detail-box-tag-bg: var(--swm-blue-dark-120);\n  }\n}\n\n.propsDetailBox [class*='detailBoxContent'] {\n  padding: 0;\n  margin: 0;\n  border: none;\n  background: none;\n}\n\n.propsDetailBox [class*='detailBoxHeader'] {\n  padding-top: 0;\n  padding-left: 0;\n  padding-right: 0;\n}\n\n.audioNodeProps {\n  border-collapse: collapse;\n  padding: 0;\n  margin: 0;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/Badges/index.tsx",
    "content": "import React from 'react';\nimport styles from './styles.module.css';\n\nexport function Optional({ footnote }) {\n  return <div className={`${styles.badge} ${styles.basic}`}>Optional{footnote ? '*' : ''}</div>;\n}\n\nexport function ReadOnly({ footnote }) {\n  return <div className={`${styles.badge} ${styles.basic}`}>Read only{footnote ? '*' : ''}</div>;\n}\n\nexport function Overridden({ footnote }) {\n  return <div className={`${styles.badge} ${styles.basic}`}>Overridden{footnote ? '*' : ''}</div>;\n}\n\nexport function IOS({ footnote }) {\n  return <div className={`${styles.badge} ${styles.basic}`}>iOS{footnote ? '*' : ''}</div>;\n}\n\nexport function Android({ footnote }) {\n  return <div className={`${styles.badge} ${styles.basic}`}>Android{footnote ? '*' : ''}</div>;\n}\n\nexport function Experimental({ footnote }) {\n  return <div className={`${styles.badge} ${styles.experimental}`}>Experimental{footnote ? '*' : ''}</div>;\n}\n\nexport function MobileOnly({ footnote }) {\n  return <div className={`${styles.badge} ${styles.experimental}`}>Mobile only{footnote ? '*' : ''}</div>;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/Badges/styles.module.css",
    "content": ".badge {\n  display: inline-block;\n  color: var(--ifm-font-color-base);\n  border-radius: 4rem;\n  font-size: 12px;\n  font-weight: 400;\n  padding: 0.125rem 0.375rem;\n  white-space: nowrap;\n  margin: 0 0.25rem;\n}\n\n.basic {\n  color: var(--swm-off-white);\n  background-color: var(--swm-blue-light-100);\n}\n\n[data-theme='dark'] .basic {\n  background-color: var(--swm-blue-dark-120);\n}\n\n.experimental {\n  color: var(--swm-off-white);\n  background-color: var(--swm-red-light-100);\n}\n\n\n[data-theme='dark'] .experimental {\n  background-color: var(--swm-red-dark-120);\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/Charts/ExponentialRampToValueAtTime/index.tsx",
    "content": "import {\n    Label,\n    ReferenceLine\n} from 'recharts';\n\nimport { FC } from 'react';\nimport AudioParamChartBase, { AudioParamDataPoint } from '../common/AudioParamChartBase';\nimport styles from '../styles.module.css';\n\nconst generateExponentialRampData = (): AudioParamDataPoint[] => {\n  const startTime = 0.2;\n  const endTime = 0.8;\n  const startValue = 0.2;\n  const targetValue = 0.8;\n  const data = [];\n\n  // Add points before the ramp\n  for (let time = 0.0; time < startTime; time += 0.1) {\n    data.push({ time: parseFloat(time.toFixed(1)), value: startValue });\n  }\n\n  // Generate exponential ramp points\n  const steps = 60;\n  for (let i = 0; i <= steps; i++) {\n    const t = i / steps;\n    const time = startTime + t * (endTime - startTime);\n    // Exponential interpolation: value = startValue * (targetValue / startValue)^t\n    const value = startValue * Math.pow(targetValue / startValue, t);\n    data.push({\n      time: parseFloat(time.toFixed(3)),\n      value: parseFloat(value.toFixed(3)),\n    });\n  }\n\n  // Add points after the ramp\n  for (let time = endTime + 0.1; time <= 0.9; time += 0.1) {\n    data.push({ time: parseFloat(time.toFixed(1)), value: targetValue });\n  }\n\n  return data;\n};\n\nconst ExponentialRampToValueAtTimeChart: FC = () => (\n  <AudioParamChartBase data={generateExponentialRampData()}>\n    <ReferenceLine\n      x={0.2}\n      stroke=\"currentColor\"\n      className={styles.referenceLine}\n      strokeDasharray=\"5 5\">\n      <Label\n        value=\"previous event and time\"\n        position=\"bottom\"\n        className={styles.label}\n      />\n    </ReferenceLine>\n    <ReferenceLine\n      x={0.8}\n      stroke=\"currentColor\"\n      className={styles.referenceLine}\n      strokeDasharray=\"5 5\">\n      <Label value=\"endTime\" position=\"bottom\" className={styles.label} />\n    </ReferenceLine>\n    <ReferenceLine\n      y={0.2}\n      stroke=\"currentColor\"\n      className={styles.referenceLine}\n      strokeDasharray=\"5 5\">\n      <Label value=\"previousValue\" position=\"left\" className={styles.label} />\n    </ReferenceLine>\n    <ReferenceLine\n      y={0.8}\n      stroke=\"currentColor\"\n      className={styles.referenceLine}\n      strokeDasharray=\"5 5\">\n      <Label value=\"value\" position=\"left\" className={styles.label} />\n    </ReferenceLine>\n  </AudioParamChartBase>\n);\n\nexport default ExponentialRampToValueAtTimeChart;\n"
  },
  {
    "path": "packages/audiodocs/src/components/Charts/LinearRampToValueAtTime/index.tsx",
    "content": "import { Label, ReferenceLine } from \"recharts\";\n\n\nimport { FC } from \"react\";\nimport AudioParamChartBase from \"../common/AudioParamChartBase\";\nimport styles from '../styles.module.css';\n\nconst linearRampToValueAtTimeData = [\n    { time: 0.0, value: 0.2 },\n    { time: 0.1, value: 0.2},\n    { time: 0.2, value: 0.2 },\n    { time: 0.3, value: 0.3 },\n    { time: 0.4, value: 0.4 },\n    { time: 0.5, value: 0.5 },\n    { time: 0.6, value: 0.6 },\n    { time: 0.7, value: 0.7 },\n    { time: 0.8, value: 0.8 },\n    { time: 0.9, value: 0.8 },\n];\n\nconst LinearRampToValueAtTimeChart: FC = () => (\n    <AudioParamChartBase data={linearRampToValueAtTimeData}>\n        <ReferenceLine x={0.2} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\">\n            <Label value=\"startTime\" position=\"bottom\" className={styles.label} />\n        </ReferenceLine>\n        <ReferenceLine x={0.8} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\">\n            <Label value=\"endTime\" position=\"bottom\" className={styles.label} />\n        </ReferenceLine>\n        <ReferenceLine y={0.2} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\">\n            <Label value=\"previousValue\" position=\"left\" className={styles.label}/>\n        </ReferenceLine>\n        <ReferenceLine y={0.8} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\">\n            <Label value=\"value\" position=\"left\" className={styles.label} />\n        </ReferenceLine>\n    </AudioParamChartBase>\n);\n \nexport default LinearRampToValueAtTimeChart;"
  },
  {
    "path": "packages/audiodocs/src/components/Charts/SetTargetAtTime/index.tsx",
    "content": "import { Label, ReferenceDot, ReferenceLine } from 'recharts';\n\nimport ChartBaseWrapper, { AudioParamDataPoint } from '../common/AudioParamChartBase';\nimport styles from '../styles.module.css';\n\nconst CustomLabelWithArrow = (props: any) => {\n    const { viewBox, cx, cy } = props;\n    \n    // Use cx/cy if available (from ReferenceDot), otherwise fallback to viewBox\n    const dotX = cx || viewBox?.cx || viewBox?.x || 0;\n    const dotY = cy || viewBox?.cy || viewBox?.y || 0;\n    \n    // Position label below the dot\n    const labelY = dotY + 30;\n    const arrowStartY = labelY;\n    const arrowEndY = dotY + 8;\n    \n    return (\n        <g>\n            {/* Arrow pointing from label to dot */}\n            <defs>\n                <marker\n                    id=\"arrow\"\n                    markerWidth=\"10\"\n                    markerHeight=\"10\"\n                    refX=\"0\"\n                    refY=\"3\"\n                    orient=\"auto\"\n                    markerUnits=\"strokeWidth\"\n                >\n                    <path d=\"M0,0 L0,6 L9,3 z\" fill=\"currentColor\" />\n                </marker>\n            </defs>\n            <line\n                x1={dotX}\n                y1={arrowStartY}\n                x2={dotX}\n                y2={arrowEndY}\n                stroke=\"currentColor\"\n                strokeWidth=\"1.5\"\n                markerEnd=\"url(#arrow)\"\n            />\n            {/* Label text */}\n            <text\n                x={dotX}\n                y={labelY + 20}\n                textAnchor=\"middle\"\n                className={styles.referenceLabel}\n                fill=\"currentColor\"\n            >\n                timeConstant controls\n            </text>\n            <text\n                x={dotX}\n                y={labelY + 35}\n                textAnchor=\"middle\"\n                className={styles.referenceLabel}\n                fill=\"currentColor\"\n            >\n                the change rate\n            </text>\n        </g>\n    );\n};\n\nconst generateSetTargetAtTimeData = (): AudioParamDataPoint[] => {\n    const startTime = 0.3;\n    const timeConstant = 0.1;\n    const previousValue = 0.2;\n    const targetValue = 0.8;\n    const data = [];\n\n    // Add points before the change\n    for (let time = 0.0; time < startTime; time += 0.1) {\n        data.push({ time: parseFloat(time.toFixed(1)), value: previousValue });\n    }\n\n    // Generate points after the change using the formula\n    const steps = 60; // More granular steps for smooth curve\n\n    for (let i = 0; i < steps; i++) {\n        const t = i / steps;\n        const time = startTime + t * (0.9 - startTime); // Spread points until 0.9\n        const value = targetValue + (previousValue - targetValue) * Math.exp(-(time - startTime) / timeConstant);\n        data.push({ time: parseFloat(time.toFixed(3)), value: parseFloat(value.toFixed(3)) });\n    }\n\n    return data;\n}\n\nconst SetTargetAtTimeChart = () => (\n    <ChartBaseWrapper data={generateSetTargetAtTimeData()}>\n    <ReferenceLine x={0.3} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\">\n        <Label value=\"startTime\" position=\"bottom\" className={styles.label} />\n    </ReferenceLine>\n    <ReferenceLine y={0.2} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\">\n        <Label value=\"previousValue\" position=\"left\" className={styles.label}/>\n    </ReferenceLine>\n    <ReferenceLine y={0.8} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\">\n        <Label value=\"target\" position=\"left\" className={styles.label} />\n    </ReferenceLine>\n    <ReferenceDot \n        x={0.65} \n        y={0.7} \n        r={4}\n        fill=\"currentColor\" \n        stroke=\"currentColor\"\n        strokeWidth={2}\n        visibility={'hidden'}\n        label={(props) => <CustomLabelWithArrow {...props} />}\n    />\n</ChartBaseWrapper>\n);\n\nexport default SetTargetAtTimeChart;"
  },
  {
    "path": "packages/audiodocs/src/components/Charts/SetValueAtTime/index.tsx",
    "content": "import { Label, Line, ReferenceLine, Tooltip } from 'recharts';\n\nimport { FC } from 'react';\nimport AudioParamChartBase from '../common/AudioParamChartBase';\nimport styles from '../styles.module.css';\n\nconst setValueAtTimeData = [\n  { time: 0.0, value: 0.2 },\n  { time: 0.1, value: 0.2 },\n  { time: 0.2, value: 0.2 },\n  { time: 0.3, value: 0.2 },\n  { time: 0.3, value: 0.8 },\n  { time: 0.4, value: 0.8 },\n  { time: 0.5, value: 0.8 },\n  { time: 0.6, value: 0.8 },\n  { time: 0.7, value: 0.8 },\n  { time: 0.8, value: 0.8 },\n  { time: 0.9, value: 0.8 },\n];\n\nconst SetValueAtTimeChart: FC = () => (\n<AudioParamChartBase data={setValueAtTimeData}>\n    <ReferenceLine x={0.3} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\">\n        <Label value=\"startTime\" position=\"bottom\" className={styles.label} />\n    </ReferenceLine>\n    <ReferenceLine y={0.2} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\">\n        <Label value=\"previousValue\" position=\"left\" className={styles.label}/>\n    </ReferenceLine>\n    <ReferenceLine y={0.8} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\">\n        <Label value=\"value\" position=\"left\" className={styles.label} />\n    </ReferenceLine>\n    <Line \n        type=\"stepAfter\" \n        dataKey=\"value\"\n        stroke='currentColor' \n        className={styles.leadingLine}\n        strokeWidth={2}\n        dot={false}\n        activeDot={false}\n        isAnimationActive={true}\n    />\n    <Tooltip active={false} />\n</AudioParamChartBase>\n);\n\nexport default  SetValueAtTimeChart;"
  },
  {
    "path": "packages/audiodocs/src/components/Charts/SetValueCurveAtTime/index.tsx",
    "content": "import { Label, ReferenceDot, ReferenceLine } from 'recharts';\n\nimport { FC } from 'react';\nimport AudioParamChartBase from '../common/AudioParamChartBase';\nimport styles from '../styles.module.css';\n\n\nconst setValueCurveAtTimeData = [\n    { time: 0, value: 0.2 },\n    { time: 0.1, value: 0.2},\n    { time: 0.2, value: 0.2},\n    { time: 0.2, value: 0.5},\n    { time: 0.3, value: 0.35},\n    { time: 0.4, value: 0.6},\n    { time: 0.5, value: 0.45},\n    { time: 0.6, value: 0.8},\n    { time: 0.7, value: 0.8},\n    { time: 0.8, value: 0.8},\n    { time: 0.9, value: 0.8},\n];\n\nconst SetValueCurveAtTimeChart: FC = () => (\n    <AudioParamChartBase data={setValueCurveAtTimeData}>\n    <ReferenceLine x={0.2} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\">\n        <Label value=\"startTime\" position=\"bottom\" className={styles.label} />\n    </ReferenceLine>\n    <ReferenceLine x={0.6} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\">\n        <Label value=\"startTime + duration\" position=\"bottom\" className={styles.label} />\n    </ReferenceLine>\n    <ReferenceLine y={0.2} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\">\n        <Label value=\"previousValue\" position=\"left\" className={styles.label}/>\n    </ReferenceLine>\n    <ReferenceLine y={0.8} stroke='currentColor' className={styles.referenceLine} strokeDasharray=\"5 5\"/>\n    <ReferenceDot x={0.2} y={0.5}  r={4} stroke='currentColor' fill='currentColor'className={styles.referenceDot} label={{ value: 'values[0]', position: 'left', className: styles.label }}/>\n    <ReferenceDot x={0.3} y={0.35} r={4} stroke='currentColor' fill='currentColor' className={styles.referenceDot} label={{ value: 'values[1]', position: 'bottom', className: styles.label }}/>\n    <ReferenceDot x={0.4} y={0.6} r={4} stroke='currentColor' fill='currentColor' className={styles.referenceDot} label={{ value: 'values[2]', position: 'top', className: styles.label }}/>\n    <ReferenceDot x={0.5} y={0.45} r={4} stroke='currentColor' fill='currentColor' className={styles.referenceDot} label={{ value: 'values[3]', position: 'bottom', className: styles.label }}/>\n    <ReferenceDot x={0.6} y={0.8}  r={4} stroke='currentColor' fill='currentColor' className={styles.referenceDot} label={{ value: 'values[4]', position: 'top', dx: 40, className: styles.label }}/>\n    </AudioParamChartBase>\n);\n\nexport default SetValueCurveAtTimeChart;"
  },
  {
    "path": "packages/audiodocs/src/components/Charts/common/AudioParamChartBase.tsx",
    "content": "import {\n    CartesianGrid,\n    Line,\n    LineChart,\n    XAxis,\n    YAxis\n} from 'recharts';\n\nimport { FC, ReactNode } from 'react';\nimport styles from '../styles.module.css';\n\nexport type AudioParamDataPoint = {\n  time: number;\n  value: number;\n};\n\nexport interface AudioParamChartBaseProps {\n  children: ReactNode;\n  data: AudioParamDataPoint[];\n}\n\nconst AudioParamChartBase: FC<AudioParamChartBaseProps> = ({\n  children,\n  data,\n}) => (\n  <LineChart\n    className={styles.chart}\n    responsive\n    data={data}\n    margin={{ left: 50, bottom: 20, top: 10 }}>\n    <defs>\n      <marker\n        id=\"arrow-x\"\n        markerWidth=\"10\"\n        markerHeight=\"10\"\n        refX=\"8\"\n        refY=\"3\"\n        orient=\"auto\"\n        markerUnits=\"strokeWidth\">\n        <path d=\"M0,0 L0,6 L9,3 z\" fill=\"currentColor\" />\n      </marker>\n      <marker\n        id=\"arrow-y\"\n        markerWidth=\"10\"\n        markerHeight=\"10\"\n        refX=\"8\"\n        refY=\"3\"\n        orient=\"270\"\n        markerUnits=\"strokeWidth\">\n        <path d=\"M0,0 L0,6 L9,3 z\" fill=\"currentColor\" />\n      </marker>\n    </defs>\n    <CartesianGrid strokeDasharray=\"3 3\" className={styles.leadingLine} stroke='currentColor'/>\n    <XAxis\n      dataKey=\"time\"\n      domain={[0, 0.9]}      \n      ticks={[]}\n      tick={false}\n      tickLine={true}\n      type=\"number\"\n      label={{\n        value: 'Time',\n        position: 'insideBottomRight',\n        className: styles.label,\n      }}\n      strokeWidth={2}\n      stroke=\"currentColor\"\n      style={{ markerEnd: 'url(#arrow-x)' }}\n    />\n    <YAxis\n      ticks={[]}\n      tick={true}\n      tickLine={true}\n      domain={[0, 1]}\n      label={{\n        value: 'Value',\n        position: 'insideTopRight',\n        offset: 10,\n        className: styles.label,\n      }}\n      strokeWidth={2}\n      stroke=\"currentColor\"\n      style={{ markerStart: 'url(#arrow-y)' }}\n    />\n    <Line\n      type=\"linear\"\n      dataKey=\"value\"\n      stroke=\"currentColor\"\n      className={styles.leadingLine}\n      strokeWidth={2}\n      dot={false}\n      activeDot={false}\n      isAnimationActive={false}\n    />\n    {children}\n  </LineChart>\n);\n\nexport default AudioParamChartBase;\n"
  },
  {
    "path": "packages/audiodocs/src/components/Charts/index.tsx",
    "content": "import ExponentialRampToValueAtTimeChart from \"./ExponentialRampToValueAtTime\";\nimport LinearRampToValueAtTimeChart from \"./LinearRampToValueAtTime\";\nimport SetTargetAtTimeChart from \"./SetTargetAtTime\";\nimport SetValueAtTimeChart from \"./SetValueAtTime\";\nimport SetValueCurveAtTimeChart from \"./SetValueCurveAtTime\";\n\nexport { ExponentialRampToValueAtTimeChart, LinearRampToValueAtTimeChart, SetTargetAtTimeChart, SetValueAtTimeChart, SetValueCurveAtTimeChart };\n"
  },
  {
    "path": "packages/audiodocs/src/components/Charts/styles.module.css",
    "content": ".chart {\n    width: 100%;\n    max-height: 70vh;\n    aspect-ratio: 3/2;\n}\n\n.leadingLine {\n  color: var(--ifm-color-primary);\n}\n\n.referenceLine {\n    color: var(--ifm-color-primary);\n}\n\n.label {\n    fill: var(--ifm-font-color-base);\n    font-weight: normal;\n    font-size: medium;\n}\n\n@media screen and (max-width: 500px) {\n    .label {\n        font-size: small;\n    }\n}\n\n.referenceLabel {\n    fill: var(--ifm-font-color-base);\n    font-weight: normal;\n    font-size: small;\n}\n\n.referenceDot {\n    fill: var(--ifm-color-primary);\n    color: var(--ifm-color-primary);\n}"
  },
  {
    "path": "packages/audiodocs/src/components/Compatibility/index.tsx",
    "content": "import React from 'react';\nimport styles from './styles.module.css';\n\nexport function Yes() {\n  return <div className={styles.supported}>yes</div>;\n}\n\nexport function No() {\n  return <div className={styles.notSupported}>no</div>;\n}\n\ninterface VersionProps {\n  version: string;\n}\n\nexport function Version({ version }: VersionProps) {\n  return <div className={styles.version}>{version}</div>;\n}\n\nexport function Spacer() {\n  return <div className={styles.spacer}></div>;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/Compatibility/styles.module.css",
    "content": ".supported {\n  color: var(--swm-compatibility-text-color);\n  background-color: var(--swm-compatibility-supported-background);\n  text-align: center;\n  text-transform: capitalize;\n  padding: 12px;\n}\n\n.notSupported {\n  color: var(--swm-compatibility-text-color);\n  background-color: var(--swm-compatibility-not-supported-background);\n  text-align: center;\n  text-transform: capitalize;\n  padding: 12px;\n}\n\n.version {\n  font-weight: bold;\n  text-align: center;\n  padding: 12px;\n}\n\n.spacer {\n  padding-top: 10px;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/HandIcon/index.tsx",
    "content": "import type React from 'react';\n\ninterface Props extends React.SVGProps<SVGSVGElement> {\n  children?: React.ReactNode;\n}\n\nfunction HandIcon({ children, ...props }: Props) {\n  return (\n    <svg\n      viewBox=\"0 0 60 53\"\n      fill=\"none\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      {...props}>\n      <path\n        d=\"M19.3396 36.325c-.0016-.0551.0089-.0949-.0036-.1021-.1427-.0782-.2344-.2229-.3928-.281-.0269-.0113-.0559-.0406-.0737-.0675-.0427-.0706-.0872-.138-.1709-.1738-.0188-.0108-.0366-.0378-.0531-.0598-.0838-.1151-.1828-.2181-.3057-.3016.009-.0156.0105-.0398.0226-.0537.0572-.0629.1644-.0968.1004-.2172-.0378-.0719-.0312-.1556-.1098-.2218-.1514-.1208-.2259-.3098-.3548-.4551-.1182-.1349-.105-.3024-.0532-.4644.0363-.1207-.0113-.2984-.1105-.3723-.0313-.0181-.0644-.033-.0939-.0542-.0478-.0401-.137-.0374-.142-.1154-.0038-.073.0028-.1568.0372-.2162.0613-.1063.077-.2057.0385-.3197-.0195-.0529-.0122-.0945.018-.1396.0284-.042.0488-.0845.0741-.1283-.0418-.0866-.0791-.1665-.1298-.2667-.0713.109-.146.1951-.2732.1842-.0271.0469-.0605.0902-.0777.1345-.0413.1221-.1384.2036-.247.2326-.0888.0238-.1277.1056-.2067.1267-.048.1266-.1563.0974-.2463.0871-.1416-.015-.1442-.0249-.2092.0877-.0344.0594-.0721.096-.1412.1145-.0494.0132-.0877.0578-.1286.0925-.058.0499-.085.0677-.1845.0811-.0767.01-.1182.0819-.2069.0765-.1017-.0045-.2021-.0041-.2975-.0341-.0604-.0182-.107-.0242-.1489.0266-.0036.0063-.0072.0125-.0153.0121-.1255.0776-.2706.105-.4354.0821l-.1409.2439-.2503-.1445c-.0849.0386-.1662.0709-.2492.1063-.1339-.0356-.198-.1268-.2055-.2729-.0736.0409-.0728.1623-.174.1497-.0739-.0093-.1537-.0012-.2149-.0615-.0611-.0603-.1459-.0509-.2145-.0404-.1094.016-.2159-.0163-.3217-.0065-.0731.0037-.1146-.0328-.1741-.0671l.0975-.1689c-.0851-.12-.1845-.0273-.2688-.0259l-.2253-.1301c.011-.0479.025-.094.0261-.1392.0039-.0645-.0552-.0778-.0977-.0982-.0944-.0461-.1699-.1105-.2872-.1241-.082-.0098-.1709-.0653-.2073-.1613-.0097-.0265-.0195-.053-.0378-.0719-.0478-.0401-.1347-.0486-.1249-.1305.0083-.0578.0488-.1136.0751-.1735.0072-.0125.0144-.025.0198-.0344-.0107-.1187-.0431-.2-.1905-.1975-.0533-.0016-.1131-.057-.1577-.1244-.0592-.0926-.1242-.1969-.2378-.2458-.0188-.0108-.0457-.0221-.0496-.0369-.0133-.0494-.0004-.1295-.0267-.1489-.0577-.0375-.0611-.0894-.0855-.1411-.0266-.0695.0304-.1033.0513-.1538.0285-.0711.0197-.1137-.0473-.1566-.0438-.0253-.0877-.0506-.1315-.0759-.0903-.0605-.0895-.1268-.0027-.1976.0256-.0227.0557-.0387.0894-.0609l.2128.1228c.0024-.0403.0155-.0702.0035-.0855-.0887-.1138-.0927-.237-.0572-.3708.026-.11-.0547-.1942-.1646-.1701-.0575.0127-.1096.0452-.1693.0691-.0444-.0965-.0875-.1881-.122-.2873-.0248-.0727-.0577-.1459.0036-.2231.0175-.0232.0112-.1061-.0063-.112-.106-.0404-.0854-.1411-.1228-.221-.0574.0127-.1166.0286-.1758.0444-.0845-.0488-.072-.15.0245-.1943.0301-.016.066-.0203.1073-.034-.0199-.074-.0389-.135-.053-.1974-.0061-.0327-.0055-.0699.0027-.0985.0237-.0989.0088-.1742-.0883-.2302-.05-.0289-.0942-.0753-.1316-.1261-.0406-.0526-.0677-.1141-.1099-.1927 0-.1084.1658-.1211.1803-.2545l-.1628-.094c.0192-.0765.0526-.1489.0422-.2175-.006-.0618-.0591-.1217-.0849-.1782.0361-.0626.0762-.1103.0939-.1627.0286-.1002.0412-.2014-.0311-.2931-.0164-.022-.0482-.032-.0598-.0554-.0186-.0399-.0225-.0839-.0362-.1251.0505-.0876.1011-.1752.1535-.2659-.0537-.131-.0554-.2654-.0485-.4074.0012-.0744-.0088-.151-.0156-.255.0388-.0527.0594-.1534.1608-.199.0167-.0071.0335-.0724.0215-.0877-.0437-.0544-.0673.0153-.1073.034-.0313-.0181-.0688-.0398-.1033-.0597-.0688-.0397-.0677-.085-.0504-.1583.0547-.2103.0919-.4265.0175-.6446-.0053-.0197-.0151-.0462-.0061-.0619.0474-.0602.0575-.1211.0345-.1969-.0177-.0561-.0071-.125-.0199-.1824-.0437-.1629-.001-.3092.061-.4527-.028-.1538-.0529-.3057-.0792-.4627.0524-.0906.1003-.1881.1607-.2783.0974-.1397.1204-.2808.0547-.4271.0493-.1216.1063-.2347.1408-.3523.0223-.0748-.0353-.1413-.0637-.2078-.0412-.0947-.1126-.065-.1892-.0842-.0052-.0489-.0148-.1044-.0253-.173.0068-.0045.0364-.0124.0535-.0276.1247-.1364.1572-.3012.1387-.4786-.0186-.1775-.0285-.1749.1538-.2448-.0181-.0771-.0374-.1592-.0573-.2332-.0708-.0075-.1362-.0509-.1962-.13.0126-.0219.0239-.0487.0415-.0719.0455-.0571.1116-.1066.1414-.1727.0245-.0568.0145-.1334.0183-.1979-.0003-.0211-.0163-.0512-.0109-.0606.1319-.149.0215-.3336.0814-.495-.0664-.1092.0097-.1904.0585-.2748.0144-.0251.0289-.0501.0469-.0813-.0223-.0337-.0593-.0635-.0668-.1012-.0167-.0722-.0101-.1559-.0336-.2237-.0305-.0843.0225-.1329.0506-.1959.0339-.0805.0603-.1695.0974-.2482.0352-.0755.0812-.1407.0865-.2294.0087-.1451.0634-.2761.12-.4102.0489-.1136.032-.2651.0751-.3903.0036-.0063-.0071-.0166-.0053-.0198.0898-.2567.1357-.2927.3301-.1597.0903.0605.185.1277.3087.1157.0741-.1282.0508-.2542-.0791-.2749-.0963-.0139-.1677-.0636-.2514-.0994-.0443-.0172-.0914-.0152-.1357-.0324-.0966-.035-.0916-.0654-.088-.1801.0044-.1809.1458-.2452.2587-.3468-.0111-.0314-.0203-.066-.0363-.0961-.0538-.1019-.0538-.1019.0407-.1933.0499-.0504.0793-.1085.0581-.1874-.03-.1216-.0402-.2484-.0656-.3923.0473-.0603.0737-.1493.1631-.2103.0539-.0355.1058-.1182.0627-.2098-.0276-.0534.0102-.09.0543-.1229s.0743-.078.1089-.1164c-.062-.0733-.1007-.1291-.039-.2143.0595-.0741.0819-.1779.1789-.2303.0368-.0205.0519-.0827.0772-.1264.1256-.0442.2624-.057.403-.1343-.0841-.0569-.1542-.1015-.2275-.148.0025-.0695.0524-.1198.0586-.1955.0203-.2593.0927-.3051.3725-.2478.0417.0074.0715.0496.1145.0619.0367.0087.0793 0 .1196.0024-.0025-.1474-.0145-.1627-.139-.1928-.0398-.0105-.0833-.0148-.1159-.0378-.0514-.0338-.087-.0878-.1335-.1229-.0527-.0388-.1163-.0588-.1654-.1038-.0245-.0226-.0342-.0782-.0224-.113.0213-.0586.065-.1126.0957-.1658.0444-.0119.0871-.0206.1283-.0343.0795-.0292.1309-.1038.098-.177-.056-.1198.0354-.213.0385-.3196.0021-.0614.0689-.0687.1334-.0648.0968.0058.1836-.065.1637-.139-.0341-.1072.0187-.1769.0814-.2783.0408-.0056.1063-.0178.1879-.0291-.0337-.0861-.0666-.1593-.0963-.2307.1273-.1266.2959-.1294.4462-.1802.0709-.0216.0709-.0216.1122-.1437-.0624.014-.1175.0155-.1705.035-.048.0181-.0902.048-.1388.0742-.0994-.1242.0035-.194.0321-.2651.0786-.0422.1715.0281.2265-.0527.046-.0652.0794-.1376.1137-.197.0749-.0068.1435-.0172.2184-.024-.0141-.0624-.0273-.1117-.0414-.1741-.0668.0073-.1287.0133-.1856.018-.0017-.026-.0101-.0476-.0083-.0507.1244-.0782.2164-.2086.3841-.2244.0847-.0094.1052-.081.1113-.1567.0048-.0806.0096-.1612.0131-.2468.0984-.0474.1816-.112.2349-.2188.0293-.0581.0829-.1148.1395-.1405.1212-.0509.1758-.1528.2354-.256.0398-.0688.083-.1147.166-.1502.1096-.0452.196-.137.3339-.1158.0802.0129.1245-.0783.1193-.1271-.009-.0928.0325-.1647.0851-.2052.0863-.0627.1504-.1592.271-.173.1824-.0197.2933-.1684.421-.2739.0562-.0468.1026-.0909.1699-.1063.0574-.0127.1135-.0304.1727-.0462l.1029-.1783s.0301-.016.0431-.0168c.1722-.0381.3338-.0867.4629-.2164.1188-.119.2839-.1447.44-.1838.0367-.0997.1202-.1432.2087-.1881.1769-.0896.3792-.1147.5513-.2321.1096-.0743.2661-.0924.4032.0243.0568-.0839.1011-.1751.1669-.2456.0603-.0611.1496-.0929.225-.1369.0501.0289.0957.0511.1377.0795.1055.0776.2224.0992.3501.102.1649.0035.172.0201.2857-.0685.09-.069.1948-.0627.3245-.1212l-.157.2721c.1138-.0093.1995.0735.2939.0113.0962-.0654.2228-.1257.2332-.2448.0084-.0869.0521-.1409.0806-.212.1-.0215.1971-.0739.3071-.0187.0313.0181.0833.0147.1214-.0008.1324-.0487.2552-.0445.3814.0117.0156.009.0465.006.06-.0028.0454-.028.0823-.0776.1286-.0926.0843-.0305-.0041-.0941.0588-.1453.0148-.004.0574-.0127.0956-.0282.0592-.0158.1098.005.1163.0588.0174.1143.1065.1407.179.1742.1059-.0389.2033-.0703.3011-.1097.0431-.0168.0943-.0332.1222-.0671.0329-.0352.056-.0969.107-.0842.0654.0169.1194.0606.1789.0949.0094.0054.003.0309.0137.0413.0397.0396.0945.017.114-.0384.0064-.0255.0146-.0541.0272-.076.0451-.0782.0914-.0932.1714-.0511.0501.0289.0983.061.1502.0867.0443.0172.0909.0233.1375.0293.0354.0037.0681-.0024.1152-.0044-.0413-.0947-.075-.1809-.1118-.2689.1044-.0509.2513-.0258.4406.0751.0957-.0573.1754-.1448.3115-.1204.125.0221.2197.0893.3235.1409.0925-.0591.1772-.1479.3055-.0738.0845.0488.1774.0107.2631-.0149.0561-.0176.1032-.0197.1613.0097.0876.0506.186.0031.2819-.004.0762-.0019.152-.0248.2264-.0236.1717-.001.173.004.2002-.1805.0946-.0121.1235.0463.1303.1211.0195.1614.024.1681.1741.1755.0484.0029.0968.0058.1412-.006.0525-.0114.0928-.009.1415.015.0313.0181.0779.0241.1187.0185.096-.0072.1878 0 .2823.017.0752.0142.1102-.003.1589-.0584.0401-.0477.1096-.0743.1532-.0992.1767.077.336.1481.4965.2241.0631.0281.1093.0131.1463-.0365.0297-.037.0487-.0844.0848-.147.0912.0734.1666.1379.2698.2266.0067-.0044.0319-.0191.057-.0338.1007-.0587.2049-.0152.3035-.0124.0614.0021.1164.0297.1773.0398.1088.0211.1968-.0156.2729-.0968.0535-.0566.1019-.0537.1667.0004.1.0869.1018.0838.2168.0293.0516-.0244.1059-.0389.1656-.0628.1456.1091.2931.2151.4387.3242.0955.0009.1962-.0869.2859.0108.0834-.0144.1668-.0288.2583-.0427.1413.0732.3385.0787.403.2994.0701-.0346.1404-.019.1975-.0819.0347-.0384.1257-.0442.1497.0155.0341.0781.0995.095.1553.1356.0251.0145.0649.025.0752.0434.0652.1544.177.0981.2825.0672.1036-.0277.2072-.0555.3158-.0845.0727.0837.1558.1566.2069.2487.0365.0669.096.1013.1488.1109.1697.0313.3334.1091.5151.0764.0197-.0053.0492.0159.0644.033.1142.1202.1097.1134.2708.073.0592-.0158.1318-.0115.1944.0247.1171.0718.227.1561.3853.1349.0489-.0051.1468.0348.1613.1181.0161.1094.1029.147.1799.1581.1106.018.1821.0676.2567.1482.0669.072.1562.1486.2805.0994.0382-.0155.0937.004.1371.0083.0923.0088.143.0631.1522.1629.0108.0896.0492.1243.1728.1415.0193.0028.0385.0056.0771.0111l-.1716.2971c.0696.0819.1316.1552.1887.2298.0837.1151.0837.1151.2188.0763.0197-.0053.0337-.0222.0539-.0356-.0472-.0773-.0912-.1528-.1353-.2282.109-.1164.1856-.0179.2643.0192.0449.0885.0405.1901.1033.2765.0464.0643.0874.1088.1659.0958.0538-.0065.0956.0802.1654-.0046.0401-.0477.1414-.0643.2151.0033.0169.014.0528.0097.1137.0198-.0005.0081-.0042.0434.0019.0762.0044.0359.0186.0691.026.1067-.0414.0428-.1155.0918-.113.1307.0072.096.0454.1889.0836.2818.0239.0597.0725.1128.1095.1716.0673-.0153.1417-.0141.198-.09.1068.0825.2135.165.3109.2421.0117.1026.0135.2079.0368.3048.0234.0969.0052.1573-.0743.2156-.0967.0734-.1063.1262-.0717.1963.0547.1149.1347.157.2441.1409.0458-.0069.0928-.0089.1412-.006.1452.0087.1627.0146.1908.1393.0335.1444.0589.2884.0896.452-.0494.0132-.1001.0215-.1499.0428-.0431.0168-.0791.0502-.1244.0782.0133.1286.0568.2413.186.2993.0457.0221.1034.0305.155.0352.1558.0191.1692.0393.1058.207l.1658.0958c-.0071.0918-.0106.1773-.0271.2637-.0187.0976.0122.203-.0469.2981-.009.0157.024.0597.0382.093.0626-.0556.1409-.0827.2347-.0814.0445.0675.0989.1322.1286.2036.0382.0929.0548.1942.0857.2997-.0499.0503-.1017.1039-.1395.1404.0471.1064.0884.2011.1265.294.0311.0764.0604.1558.0963.2308.0271.0615.0623.1235.1072.2119.1651.0537.2496.2109.3111.4007.0629.1947.0272.3576-.0935.5089.0325.0521.0602.0764.0963.0139.018-.0313.0343-.0594.056-.097l.1377.0795c.0556.2073.1138.4244.1721.6415.0876.0506.1752.1012.2535.1463.0492.1244.094.242.1361.3497-.0481.0472-.1119.0854-.1143.1258-.0057.0676.0191.1403.0475.2067.0116.0234.0559.0406.0863.0457.0466.006.0937.004.1412-.0061.0426-.0087.0795-.0292.1127-.0434.0674.064.0801.1214.036.1834-.0248.0358-.0434.0751-.065.1126-.042.08-.0377.1159.0463.1727.0702.0447.1178.1139.1795.1662.0768.0693.0969.1935.0503.2959-.0244.0568-.0305.1033-.0177.1607.0159.0592.025.1229.0199.1825-.0155.1495.0192.2196.1468.2515.1562.0402.1576.0451.1086.1878-.0159.0492-.0224.1038-.032.1567.0758.0854.2183.0843.2577.2113.0935.0331.1043.1228.0969.1935-.0076.0999.0297.1798.0535.2686.0133.0494.0525.097.0945.1255.0639.041.1023.0757.0872.167-.0147.0833.0177.1645.1156.2044.0837.0358.1197.1108.143.2077-.0509.0665-.0728.1622-.1685.2196-.0368.0204-.034.1096-.0514.183.0748.0223.1536.0303.2126.0727.0558.0405.0936.1124.1311.1632-.0536.1025-.142.2002-.2652.2931.0563.0325.1127.065.1573.1033.0434.0334.0709.0868.1147.1121.0438.0253.1034.0305.1607.0469.0273.1117-.1358.1051-.1326.2153.0616.0523.1169.13.1942.1622.1593.0711.2125.2102.2621.3556.0274.0826.0715.158.1186.2644-.0241.0779-.0715.1672-.1979.1693-.0464.1526.0876.159.1706.232-.0279.0339-.0589.066-.0869.0999-.0121.0139-.0323.0272-.0445.041-.0824.1067-.0317.1777.0681.2145.0381.0136.081.0259.1187.0185.0736-.0118.1165.0005.1512.0706.0418.0867.0088.151-.0372.2162-.009.0156-.0457.0069-.0579.0208-.0225.0245-.0343.0594-.0614.1063.0968.0058.1676.0133.2514.02.053.1683.0658.3341.0417.5203-.0158.1285-.0267.2848.0822.3852.0719.0707.0931.1497.1218.2372.0169.043.0485.0822.0636.1284.0239.0597 0 .1084-.0615.1354-.0566.0257-.1331.0066-.1697.0772.0634.0491.0965.064.1879.0793.0245.1309-.0937.3212.136.3787-.0152.0913-.0777.1345-.1357.1844-.0481.0472-.0717.117-.1223.2046.07-.0055.1134-.0013.1498-.0136.0363-.0124.0692-.0477.1069-.0551.0376-.0074.0896-.0108.116.0086.0313.0181.0414.0656.0587.1007-.0427.0378-.0769.0681-.1129.1016-.0292.0289-.0554.0597-.0936.1043-.0035.0856.0911.1819.0194.2989-.0271.0469.0309.1055.0931.1205.0255.0064.0538-.0064.0793 0 .0815.0178.1675.0424.2129.1228.0364.067.0899.1479.0761.215-.0316.1777.0368.3339.0773.4949.03.1216.0237.2264-.0413.339-.0614.1063-.0946.2289-.1498.3679.0257.0566.0132.1578.0918.224-.0114.1644.091.3194.0356.4876-.0158.0492.0032.1102.0146.1627.0285.1457.0222.2796-.0461.4195-.0605.1194-.0898.2568-.1266.3856-.01.0318-.0057.0676.0054.099.038.1221.0152.2339-.0574.338-.0284.042-.0506.0875-.0849.147.0591.0132.1106.018.1549.0352.0931.0412.1126.0942.0669.1804-.0438.0831-.1261.1607-.0172.2611.0215.0207.0032.1102-.0252.1522-.0483.0764-.0594.1534-.053.2363.0037.073-.0291.1083-.0928.1174-.0798.0081-.1609.0113-.2582.0135-.107.0842.0213.1583.0442.2632-.0253.0438-.0677.1027-.0957.1657-.0263.0599-.0369.1289-.055.1893-.0839.0224-.1629.0435-.2616.07.0796.0501.1448.0961.2212.1444l-.139.2408c.0387.0848.0742.1679.1079.254-.0679.161-.1803.2545-.3815.2343-.015.0622-.0856.1049-.0783.2008.0047.0569-.0372.1078-.1073.1424-.0633.0301-.1231.0832-.1584.1587-.0226.0537-.0502.1086-.1184.1401-.0449.02-.0557.118-.0914.2016-.195.0125-.3597.1676-.5885.2315.0147.0252.0281.0454.0334.0651.0087.0426.022.092.0146.1336-.0045.0224-.0539.0356-.0795.0583-.0603.0611-.1317.0908-.2111.1199-.0629.0221-.1128.0725-.1699.1063-.0602.032-.1369.0419-.1863.0842-.094.0834-.1935.0677-.2842.0153-.1064-.0615-.1981-.0978-.3207-.0517-.048.0181-.1173-.0136-.1746-.03-.0654-.0169-.1271-.04-.1988-.0605-.0743.1071-.1451.208-.3039.1289-.0407-.0235-.1229.0249-.2.0429-.0235-.0677-.0457-.1305-.0705-.2032-.0344-.0199-.0746-.0515-.122-.0705-.0568-.0245-.1141-.0409-.175-.051-.0385-.0056-.083.0063-.1224.0169-.0839.0224-.166.0417-.2517.0673-.0611.019-.1108.0111-.1392-.0553-.0271-.0615-.0067-.104.0459-.1445.044-.0329.0742-.078.1157-.1208-.1102-.1345-.2147-.0114-.35-.0228-.0828-.0228-.147-.0849-.1721-.2078-.0136-.0703-.0599-.1346-.1355-.1699-.0631-.0281-.0613-.1397-.1761-.1142-.0852.0175-.1471-.0849-.247-.0926-.185-.0192-.1823-.0385-.3254-.0002l-.1101.1908c.0456.1306.0384.2515-.0187.3937-.0452.1073-.0086.2535-.0061.4009-.0418.0217-.1015.0456-.1599.0745-.0853.0466-.1198.1643-.0781.2509.0609.1186.0626.1446-.0439.2207-.0692.0476-.0703.0928-.0549.1601.0176.0852-.0137.1755.0626.253.0259.0274.0036.1021.0016.1635-.1663-.0084-.2393.1037-.2977.2409.0525.097.0129.2451.1484.3067.0238.0888.0607.1768.015.263-.0461.0943-.0908.1936-.191.2442-.0467.0231-.0853.0466-.1043.094-.0227.0537-.0618.0853-.1228.1042-.0992.0345-.1099.1326-.0259.1894.0514.0339.1095.0633.1596.0922-.0172.1527-.1631.1018-.2418.1731.0079.0296.0141.0623.0251.0937.0265.0987.0772.1989-.0692.2645-.0449.0199-.0591.0951-.088.1451-.0325.0563-.0595.1032-.1336.123-.1018.0247-.0929.1465-.19.2281.1079.0081.168.0052.2258.0136.0949.0089.1377.0795.0988.1613-.0258.0518-.0578.1001-.0903.1563.0801.1505-.0296.3332.0733.4802-.0975.1689-.1914.3315-.2853.4941.0058.0117.0098.0265.0205.0368.0625.0653-.0001.1376.0135.208.0141.0623.0775.1114.0472.1857-.0095.0237-.0146.0541-.0361.0625-.0872.0498-.1149.1338-.1412.2229-.0573.2004-.141.3814-.3868.4313.0214.1292.0465.252.0635.3744.0118.0735-.0006.1456-.031.2198-.0674.1529-.2058.2481-.2839.3906-.0109.0188-.0481.0182-.0696.0266-.0014.0242-.0073.0416-.0016.0533.0937.2209.0704.4201-.0724.617-.1078.1504-.1878.3252-.2848.486-.047.0813-.072.1753-.062.2519.0183.1274-.031.2199-.1136.2764-.0845.0596-.1032.128-.0968.211.0055.0699-.0265.1181-.0509.1749-.0384.0737-.0907.1353-.0915.2307-.0007.0663-.0691.1269-.1383.1745-.1232.0832-.2168.1876-.1853.3642.0136.0704-.0432.1544-.0623.2309-.0233.0908-.1128.0725-.16.1036-.02.0635-.0327.1145-.0504.1669-.0241.0778-.0729.1622-.0593.2326.0221.092-.0122.1514-.0501.2171-.0669.1157-.2054.1316-.3.0353-.029-.0293-.0513-.063-.0821-.0891-.0138-.0122-.0344-.0199-.0595-.0344l-.1011.1752c.1197.1108.2624.1598.4151.0978.0219.0127.0313.0181.0326.023.0097.0265.0145.0543.0225.0839-.0904.0771-.1839.1523-.273.2343-.0293.029-.0707.0718-.0677.1028.0153.0964-.053.157-.0811.22.0093.0345.0096.0556.0199.074.076.1357.0597.1929-.0657.2873-.0882.0659-.1789.1219-.1772.2563.0007.0421-.0909.0851-.1471.1319-.0026.0694-.006.155-.0092.2616-.0781.0341-.213.0438-.1568.2138-.0637.0091-.1144.0174-.191.0273-.098.0685-.0117.2226-.0915.3392-.03-.0132-.0564-.0326-.0886-.0345-.0721-.0125-.1507.0297-.1398.0903.0206.1161-.0408.114-.1183.1109-.0484-.0029-.0918-.0071-.1514-.0123-.0054.1178.0277.2411-.0261.356-.0168.0362-.0183.0895-.0453.1073-.0944.0623-.1637.139-.229.2305-.0248.0357-.1073.034-.1733.0543-.0054.0094-.0279.0339-.0343.0594-.0246.115-.0557.1471-.1285.0926-.1055-.0776-.2016-.0122-.2373.0423-.0816.1197-.1545.0942-.2479.032-.0188-.0109-.0345-.0199-.0725-.0335-.0029.0483-.0004.0873-.0103.1191-.0323.1065-.0458.2238-.1826.2657-.0611.0189-.0743.078-.0522.1408.0248.0727-.0049.1098-.0736.1493-.1123.0644-.2227.0966-.3444.0472-.0372.1078-.0721.2044-.107.301-.1337-.0647-.1369-.0665-.1181-.1641.0092-.0447.0102-.09.0141-.1545-.1126.0143-.1999.0139-.2483.1193-.0258.0519-.0819.0695-.1445.0334-.0532-.0307-.1087-.0502-.1745-.0591-.0721-.0124-.1222-.0413-.1861.026-.0311.0321-.102.0537-.1431.0383-.0792-.029-.1359.0258-.2282.0267-.0313-.0181-.085-.0407-.1283-.0741-.088-.0716-.1786-.0738-.2621-.0303-.029.0791-.0526.1489-.0839.2392-.1-.0869-.2075-.1031-.2788-.211-.0476-.0692-.155-.1145-.2621-.1096-.039.0025-.0874-.0004-.1187-.0185-.2275-.148-.2257-.1512-.4595-.086-.0049.0014-.0148.004-.0296.008-.0272-.0324-.0786-.0663-.0829-.1021-.0124-.1448-.1095-.1717-.2185-.1637-.078.005-.1142-.0117-.1439-.0831-.0227-.0548-.0754-.0936-.1133-.1363-.0234.0115-.0413.0137-.0467.0231-.0361.0625-.0646.1336-.1547.1233-.077-.0111-.1912-.1312-.1945-.2123-.0019-.0762.0069-.142-.1111-.1184-.0377.0074-.1065-.0323-.1252-.0723-.0693-.1401-.2638-.1356-.3179-.2877-.0195-.053-.0659-.0882-.0517-.1634.0178-.0814-.0541-.1521-.1035-.2182-.0974.0314-.1753-.1012-.2795-.0362-.0117.0057-.026.0016-.0341.0011-.0429-.0414-.0813-.0761-.121-.1157-.0303-.0342-.0723-.0626-.0892-.1057-.0142-.0332-.0144-.0834-.0026-.1183.0095-.0237.0477-.0392.0733-.0619.0153-.012.0261-.0308.0445-.041.0153-.012.0351-.0173.0683-.0315-.0328-.1023-.0512-.2005-.1104-.293-.0676-.1141-.0891-.1348-.2281-.1109-.013.0009-.0273-.0032-.0596-.0052.0258-.1602.013-.3261.0934-.4798.0768-.1474.133-.3026.2041-.4618-.1577-.016-.2966-.1295-.4512-.0353-.0544-.1732.105-.1312.1554-.1896-.0404-.0818-.0796-.1585-.1205-.2322-.0058-.0117-.0232-.0176-.0407-.0235-.0711-.0286-.1404-.0603-.2259-.0929.0333-.1517.0568-.3008-.0175-.4396l.112-.1939c-.0259-.09-.0624-.1569-.1094-.2007.1181-.1612.1082-.3754.2478-.5449-.0532-.0308-.1015-.0628-.1502-.0868-.0537-.0226-.0916-.0654-.0775-.1114.0109-.0479.0543-.123.087-.1291.1305-.0164.1924-.1308.2956-.1796.0517-.0244.0747-.057.0731-.1121-.0029-.06-.0462-.0934-.0941-.1044-.0703-.0155-.1429-.0199-.2249-.0297-.0109-.0605-.0201-.1242-.0271-.1699-.0469-.0271-.0719-.0416-.097-.056-.1408-.0813-.155-.1146-.1248-.2681.0261-.1392.0419-.1593.2666-.3172.0526.0679.1052.1358.1502.1951.1333-.0356.2616-.07.4047-.1082-.0058-.0117-.02-.0449-.0261-.0777-.0181-.0771-.0847-.0989-.1443-.1041-.2594-.0205-.2612-.0174-.4365-.1186-.1151-.1332-.0486-.2699-.018-.4024.0168-.0653.047-.1104-.0141-.1707-.0246-.0226-.0279-.0745-.0255-.1148.0015-.0533-.0077-.0879-.0475-.1275-.157-.1616-.1456-.3259.0141-.4797.0036-.0063.018-.0022.0198-.0053.0432-.0459.0908-.0851.0728-.1623-.0199-.074-.0839-.0859-.1443-.1041-.0399-.0105-.0784-.0161-.112-.023-.0227-.134.0364-.2292.1017-.3207.046-.0652.1131-.1307.2039-.1074.0815.0178.1318-.0115.1487-.0768.0205-.0716-.0268-.1198-.0985-.1403-.049.0343-.0979.0685-.1487.1059-.0868-.0376-.1432-.0701-.1323-.1973.0117-.1141-.0524-.2345-.086-.3498.0715-.0588.1381-.1163.2114-.1782-.0298-.0422-.0696-.0818-.0927-.1286-.0315-.0682-.0711-.1369-.0161-.2177.0144-.0251.0236-.0698.0138-.0963-.0776-.1908-.0303-.3594.085-.5013-.068-.1352-.1365-.2623-.1951-.3921-.0471-.1064-.0385-.1139.0675-.182.0724-.0458.151-.088.2246-.1288-.0121-.0946-.0409-.1821-.169-.206.0514-.0746.0599-.1614.1528-.1995.0265-.0097.0385-.1029.0235-.1491-.0389-.135.0001-.2459.0691-.3437-.0093-.0345-.0097-.0556-.0199-.074-.0445-.0674-.1361-.1328-.1089-.2089.0236-.0697.0315-.1485.0663-.216.06-.1113.0331-.2019-.0423-.2954-.0645-.0039-.1274.0473-.2003-.0073-.0665-.0509-.1554-.0271-.2031.0412-.0636.0884-.16.1036-.2493.1354-.0629.0221-.145.0414-.1788.0928-.0726.104-.1775.1268-.3009.1598-.0233.12-.1378.1665-.2398.2202-.0736.0409-.1318.0115-.1623-.0729-.067-.1804-.1032-.1972-.2903-.155-.0623.014-.1265.0312-.1875.0501-.1584.0503-.3203.0778-.4895.0385-.0847-.0197-.1641.0095-.2285.0849-.0815.0905-.1908.0775-.2262-.0347-.0428-.1498-.157-.1616-.2602-.1419-.1211.0218-.1855-.0112-.2362-.1113-.016-.0301-.0405-.0526-.0565-.0827-.0578-.1168-.1589-.1585-.2706-.1312-.1216.0299-.1837-.0143-.2362-.1114-.0498-.0871-.1208-.1448-.2319-.1547-.0596-.0052-.1137-.049-.1655-.0747l.0296-.008Zm4.3859-27.7107-.0156-.009s-.0064.0255-.0037.0354c0 0 .0174.0059.0255.0064-.0027-.0099-.0035-.0229-.0026-.039-.0033-.052-.0054-.099-.0096-.164-.0521.0325-.0858.0547-.1312.0827.0532.0307.0876.0506.1372.0876ZM15.2591 15.097c.03.1216.1003.2456-.0752.311-.0049.0013-.0141.0461-.0218.0667-.0373.1369-.0255.3188-.2442.3218-.0081-.0005-.0189.0183-.0293.029.0009.013-.0001.0291.0026.039.0227.134.0155.1465-.0985.185-.0197.0053-.0426.0087-.0642.0171-.0565.0258-.0881.0659-.0677.1319.019.061.0362.1251.0503.1875-.0181.0312-.0393.0607-.0542.0938-.0557.1471-.2287.2516-.156.4436 0 0-.0072.0126-.0108.0188-.0739.0991-.0681.2192-.1022.3288-.0318.0984-.0317.1777-.0029.2652.066.1965-.0047.3767-.0623.5561-.0418.1302-.1565.2349-.167.3831-.1211.1302-.1138.3054-.1588.4629-.0227.0828-.0621.1726-.0508.2542.0218.1502-.037.2955-.0103.4444.0088.0426.0113.0816-.0184.1186-.0473.0603-.0387.132-.0264.1975.0413.2031.0274.4078-.0039.6065-.0243.1361-.0155.2871-.1137.4139-.0352.0464-.0368.1288-.0326.1938.012.2321-.0205.3968-.1275.5894-.056.0969-.056.0969.0256.1941.0544.0647.0748.1307.0408.2112-.0352.0755-.0855.1048-.171.0722-.0206-.0077-.0525.0114-.0772.018-.0055.1469.1559.1275.212.2183.03.1215.0098.2433-.0918.318-.0576.0419-.0753.0942-.1055.1393.1505.2453.161.3139.0604.5603-.0119-.0444-.018-.0772-.0291-.1086-.038-.122-.0662-.1383-.1815-.1048-.1202.0348-.1358.1051-.0524.1991.0348.041.0956.0802.0963.1223.005.1071.1026.126.1624.1813-.0826.1358-.1642.2555-.1397.4156.0113.0815.0226.1631.0178.2438-.0051.1388-.0052.2763.0458.3975-.0506.1167-.099.2222-.1497.3389-.0341.0012-.0861.0045-.1573.0051.0364.0669.077.1195.0929.1787s.069.1191.0199.1824c-.0419.0509-.0336.1016-.0209.159.0145.0834.0803.0922.1349.1278.0158.0592.0411.1239.0471.1857.0039.044-.0183.0895-.0243.1361-.0092.0739-.0105.1482-.0148.2208-.0076.0999.0015.1926.0894.2643.022.0126.0424.0495.0396.0687-.0297.1455.0176.302-.0712.4342-.046.0652-.0574.1211.01.1851.0321.031.0274.0825.0079.138-.0236.0698-.0297.1455-.0757.2106-.0248.0358-.0397.0688-.0265.1182.0106.0395.1002.0578.0349.1202-.0396.0397-.0097.0819.0027.1183.004.0148.0344.0199.0496.037.0245.0225.0491.045.0718.0706.0531.0599.099.1322.0686.2064-.0357.0836.001.2007-.1184.2486-.0382.0155-.0675.0735-.0767.1183-.005.0304.0257.0857.0538.102.1356.0615.1405.0602.0773.1697-.0596.1032-.121.2095-.186.3221.1158.0668.2222.1283.3286.1897.047.0271.0742.0595.0856.1119.0159.0593.0162.1094-.0351.1549-.0677-.0057-.144-.0831-.2126.0357.0241.0306.0459.0723.078.1034.0938.0833.1076.0955.0503.1875-.065.1126-.0579.2376-.0924.3553-.0423.1382.0506.2085.1969.172.1314-.0325.2616-.0699.4195-.1122.0104.177.0084.3468.1406.4648.2057-.0022.0939-.1626.1243-.266.0757.0062.1523.0254.2209.015.0735-.0118.1391-.0531.2105-.0828.0332-.0142.0678-.0234.0916-.043.1134-.1097.2451-.2004.3094-.3551.019-.0474.0429-.0961.1076-.1214.0628-.0221.1034-.0779.1118-.1648.0097-.0819.0702-.1721.1613-.207.0678-.0235.0922-.0802.126-.1316.0253-.0438.0461-.0943.0803-.1246.1808-.1541.2382-.3837.3707-.5699-.038-.122.0723-.1251.1329-.1651.0306-.024.0701-.0346.1119-.0564-.0607-.0683-.1403-.1184-.1512-.179-.0087-.0717.0432-.1543.0704-.2303.0072-.0126.0082-.0287.0105-.0399-.0032-.1102.0621-.1726.1466-.2322.1586-.1086.2336-.2529.1788-.4472-.0335-.1152.0236-.1781.1096-.262.0644.1415.0584.2964.1776.3862.094-.0834.1204-.1724.0837-.2895-.0159-.0592.0014-.1326.0183-.1979.0241-.0778-.0968-.1143-.0395-.2063.0289-.05.0158-.1285.0214-.1961.0086-.116.014-.2338.0879-.3329.0145-.025.0088-.0658.0107-.098.0087-.1451.046-.282.1312-.408.046-.0651.1068-.1343.0866-.2294-.0035-.0228.0195-.0554.0415-.0719.1119-.0855.1958-.2163.3509-.2102.0609.0101.021.108.1045.0937.0426-.0088.094.025.1379.0212.1578-.0131.3143-.0312.4887-.0514l.3599.2078c.022-.0165.0409-.0348.0697-.0557.0469.0271.1172.0427.139.0845.0507.1001.1496.1239.2323.1758.1028.0677.2004.0865.3218.0064.1164-.0787.1776-.0475.273.0909.0432.0625.0846.1281.1715.1366.1744-.0467.2914-.0542.351-.0225.0055.1783-.0866.3378-.0779.5179-.001.0161-.023.0326-.0424.059-.0504-.05-.0995-.095-.1424-.1365-.097.0524-.0156.2078-.1765.2192.0204.0368.0266.0695.0449.0884.0745.0806.0746.1599.0423.2663-.055.1893-.0407.1934.1216.2954.0373.0799.0693.1401.0964.2016.0418.0867.0336.1153-.046.1736-.044.0329-.093.0672-.1609.1197.1029.0386.179.0658.2694.0972-.082.0986-.1572.1928-.241.2945-.0619.006-.1367.0128-.2116.0196.0177.1187.0706.2006.1585.2458.0261-.0308.0523-.0616.0748-.0861.0846.0197.122.0705.1016.1421-.021.0796.0138.1205.0751.1517.0581.0294.0843.0779.0581.1378-.0448.0993-.0249.1733.0685.2356.0514.0338.0525.097.0088.151-.0365.0415-.1446.0624-.1933.0385-.0425-.0204-.0845-.0488-.1346-.0777-.0343.0594-.0569.113-.0903.1563-.068.0817-.0455.1656.0004.2379.0414.0656.108.1166.166.1751l-.112.1939c.0411.0445.0066.1331.0827.1603.073.0254.0889.0846.1011.1501.011.0605.0408.1028.1067.1116.0304.0051.0596.0052.1209.0073-.0967.1026-.0757.2107-.0944.3082-.0262.1392.069.1984.1562.257-.0145.025-.0203.0425-.0289.0501-.0337.0222-.0719.0377-.1056.0599-.0669.0364-.0936.1044-.0831.173.0171.0933.0958.022.148.0688.0186.0691.0379.1512.0654.2337.0111.0314.032.0602.0584.0796.0906.0815.0906.0815.0475.2067-.01.0318-.0057.0677-.0076.0999-.0072.0848-.0481.1557-.1228.2127-.0149.1414.0871.1961.1846.2441.0435.1919.1445.3712.0071.5587l.2472.1427c.0043.0359.0141.0623.014.0915-.0097.1612-.0353.1839-.2012.1966-.0569.0046-.1156.0124-.1955.0205.08.0712.1371.1167.2238.075.1168-.0577.1836.0435.2722.0779-.0061.155.1402.1185.213.1731.0326.023.0549.0567.0857.0828.0246.0225.0567.0536.0858.0537.0919.0072.1829.0013.2591-.0005.0127-.051.0133-.0882.0278-.1132.0578-.1001.1492-.114.2219-.0303.0183.0189.0294.0503.0311.0763.0122.0946.0621.1526.179.1742.0186-.0685.0266-.1473.0609-.2067.0379-.0657.1058-.1182.1459-.1659-.0334-.0652-.052-.1051-.072-.15.1189-.0398.2259-.0155.3189.0548.0664-.1368.0687-.1479-.0104-.2061-.0558-.0406-.1023-.0758-.08-.1505.142-.1014.3569-.0399.4628-.1873-.0498-.0871-.0894-.1558-.1277-.2196.0415-.072.074-.1282.1065-.1845.0162-.0282.046-.0652.072-.0669.0798-.0081.0998-.0716.1367-.1212.0388-.0527.0314-.1195.0541-.1731.0226-.0537.0796-.0874.1229-.1334.0571-.0629.0368-.1288.0201-.201-.0252-.0938-.0053-.1282.0884-.1533.1346-.0307.225-.1077.2793-.2307.0203-.0424.0487-.0844.0812-.1407-.0251-.0938-.0516-.1924-.0807-.301l.1209-.2095c-.0339-.028-.0647-.0541-.1018-.0838.1189-.1482.1534-.3451.3169-.455.049-.0343.0363-.0917.0114-.1353-.0383-.0638-.0833-.1231-.131-.1923.0522-.0616.0821-.1278.1391-.1615.1447-.0916.1664-.1291.1663-.3169.0002-.0582.006-.1549.0392-.1691.1168-.0577.1214-.1885.205-.2611.0888-.0238.191-.0273.2188-.1405.0073-.0125.0033-.0273.0047-.0515-.0461-.0141-.094-.0251-.1432-.041-.0247-.1018.0294-.1665.1027-.2285.0409-.0347.0927-.0882.0937-.1335.0011-.1536.0699-.3016.0597-.4575-.0062-.112.0682-.2192.0525-.3366-.0013-.005.0202-.0134.0306-.0241.0873-.0789.1152-.1128.1641-.2263.0434-.1042.0896-.1192.2001-.0721.0269.0113.0573.0164.1084.0292-.0247-.1018-.0414-.174-.0577-.2543.0724-.0458.1348-.089.209-.1379.088.0717.1656.154.2564.2064.1001.0578.2147.0906.3189.1341.0837-.0629.1745-.0925.2724-.0887.0526.0679.0661.1674.1445.1835.109-.0371.1934-.0677.2728-.0968.0755.0644.1565.0903.218.1717.0629.0863.1829.0013.2724.0196.0193.0028.0376.0217.0564.0326.106.0404.1258.0351.1849-.0601.018-.0312.0343-.0594.0505-.0875.0927.0201.1275.061.1172.151-.0073.0417.0158.0884.0233.126.0862-.0336.1526-.0619.2222-.0885.0478.1485.214.2653.0856.4372-.0018.0031.0008.013.0053.0197.0257.0566.0148.1045-.0177.1608-.0253.0438-.0408.114-.0222.154.0636.1284.0281.2622.0302.3885.0045.1152.0124.2532-.1353.3139-.0283.0128-.067.0655-.0622.0933.0195.1614.0099.3226.0065.4874-.0045.1017-.0005.2249.0548.3027.0579.0876.0326.1314.0022.2056-.0303.0742-.0432.1544-.0511.2332-.0052.0595.0635.1284.0055.1783-.0458.0361-.1113.0483-.171.0722-.0117.0058-.022.0165-.0459.0361.0129.0283.0217.0709.044.1046.0565.0827.0777.1616.0092.2513-.0509.0665-.0395.119.0298.1798.0861.0748.0719.15-.0353.184-.061.0189-.0473.0602-.0672.0946-.0271.0469-.0434.1042-.0082.1371.0795.0792.0688.1773.0648.2709.0007.0421-.0088.0658.0278.1036.0593.0634.0769.1486.0177.2729-.079.0211-.1826.0488-.2912.0779-.0001.0291-.0061.0757-.009.124.0652.0461.1305.0921.216.0956-.025.094-.1165.1079-.1714.1596-.0665.0574-.0965.1527-.1344.2184.0507.1001.1153.1833.1261.273.0077.0878.0355.1914-.0392.2775-.0486.0553-.0857.134-.103.2074-.0256.102-.0417.2095-.0417.3179-.0013.1035-.0361.1709-.1264.2189-.0534.0275-.0904.0771-.1502.1301.0274.0825.0567.162.0859.2414-.1501.101-.1532.0992-.3191.1118-.0309.003-.0552.0307-.1019.0537l.1346.0777c.0677-.0234.1158-.0415.1472-.0526.0798.1003.1426.1866.2073.2698.0512.063.081.1343.0327.2107-.0379.0657-.0494.1216-.0362.2001.0157.0883-.0111.1854-.0151.279-.0035.0856-.0378.145-.1297.1669-.0377.0075-.0701.0347-.102.0538-.0531-.0599-.0917-.1447-.1566-.1697-.0774-.0321-.1623.0064-.225.1078.1119.0521.2097.1211.3136.1435.1169.0216.1659.0958.2014.1788.0413.0948.0865.2043-.0047.2684-.1252.0361-.2552-.064-.307.0979.043.1208.1509.158.2479.214-.0062.0757.0007.1505-.0502.2171-.0194.0263-.0353.0755-.0251.0939.049.0742-.0162.1366-.0201.2011-.003.0774-.0405.1642-.1437.1838-.0803.0162-.1011.0668-.0812.1408.0145.0543.0291.1085.0437.1628.0515.0047.0887.0054.129.0078.0278.1036.0229.1049.004.2316-.0147.0833-.0281.1715-.0284.2588-.0003.0583-.0152.0913-.0637.1175-.0301.016-.0513.0455-.0958.0865.0102.0184.0249.0436.0396.0687.0929.1788.0025.3642.0174.548.0044.0358-.0299.0953-.0614.1063-.0498.0213-.0557.0387-.0456.0863.0093.0345-.0048.0806-.0215.1168-.0209.0505-.0542.0938-.0831.1438.0376.0217.0563.0326.0751.0434.0967.035.1269.0983.1032.1972-.0196.0845-.02.1719-.0172.261.0017.026.014.0624.0001.0793-.0379.0657-.074.1283-.0313.1988.0503.0791-.0409.1432-.0086.2244.0724.171.0197.3491.0185.5318.0156.0091.0344.0199.0532.0308.0884.0636.0964.0932.0485.1906-.0109.0188-.0217.0375-.0325.0563-.0478.0683-.0481.1265.0248.1811.0571.0455.1316.126.1023.1841-.0484.1055.0044.2236-.0708.3178-.0176.0232-.0063.1048.0112.1107.093.0412.0833.1231.105.194-.1246.2158-.1883.2249-.0488.5181-.0217.0375-.0371.0787-.0632.1095-.0225.0245-.0585.0579-.0809.0533-.1244-.0301-.1284.0635-.1731.1336l.2504.1446c-.0195.1638.0072.3127.0568.4581.0301.0924.0373.1883.0297.2882-.015.1706-.0475.3353-.131.4872-.0217.0375-.0103.09-.0145.1334.0721.0125.125.0221.1778.0318.0162.0802.0317.1475.0501.2457l-.1174.2033c.0265.0987.0535.1893.0755.2812.0066.0247-.0016.0533-.008.0788-.0295.0873-.0392.1692.034.2448.0334.036.005.078-.0166.1155-.0416.0719-.0849.147-.1355.2346.0717.0205.1254.0431.1751.051.0528.0096.0908.0232.1085.0793.0248.0727.0259.1359-.0263.1975.1153.0749.2199.1394.1928.2948-.0069.0335.0454.0804.0775.1114.0518.0549.1338.0647.1845.1358.0388.0557.1392.0553.2216.057.026-.0017.0506.0209.0756.0353.0885.0636.1706.0443.2475-.0239.0477-.0392.0935-.0753.1457-.1077.0772-.0471.2858-.2061.322-.2686.0433-.0751.1044-.1232.1857-.1555.1526-.062.1513-.0669.2493-.2438.0126-.0219.0333-.0433.0567-.0549.0983-.0474.1551-.1314.2012-.2257.0443.0172.0783.0452.1092.0422.1453-.0204.2879-.0506.4238-.0764.0037-.0354.006-.0465.0052-.0595.0036-.1147.0081-.2164-.1189-.2855-.0501-.0289-.1103-.1054-.0871-.1962.1061-.068.2302-.0589.3422-.0651.1381-.0079.2078-.0635.2464-.1955-.0778-.0241-.1511-.0706-.2179-.0633-.1059.0098-.0953-.0592-.0673-.0931.0612-.0772.0683-.169.0848-.2554.033-.1727.1416-.3102.1696-.4816.0792.029.17-.027.2018.0914.0119.0444.1014.0628.1484.0899l.0866-.1501-.1627-.094c-.0662-.2467-.0743-.2472-.0356-.3792.0418-.1301.0567-.2716.1539-.3823.1085.0001.0623-.0933.0732-.1412.0092-.0447-.0121-.0946-.0191-.1403.098-.0685.1727-.1546.155-.2107-.041-.153.0065-.2714.1407-.4316.013-.0009.078-.005.161-.0114-.0374-.0799-.0658-.1463-.0986-.2195.0379-.0657.1067-.1343.1124-.202.0142-.1836.1478-.3066.192-.477.0496-.1799.182-.337.2741-.4964.1469.0056.1981-.0107.1863-.0843-.0126-.0865.0362-.0916.0785-.1214.0373-.0285.0746-.057.1044-.0941.0527-.0696.0399-.127-.0365-.1753-.0501-.0289-.097-.056-.1471-.0849.0236-.0698-.0177-.1645.0555-.1973.0898-.0399.106-.1765.2314-.1624.0081.0004.0262-.0308.0307-.0532.0059-.0175.0006-.0372-.0015-.0551-.0229.0035-.0471.002-.0686.0104-.0099.0026-.0221.0165-.0355.0254l-.1377-.0795c.0716-.0879.078-.2219.229-.2305.0411-.0639.1071-.1133.0851-.2053-.0088-.0426.0509-.2833.0721-.3128.0478-.0683.1636-.1098.2477-.0821.0381.0136.072.0416.1096.0632l.0578-.1c-.1046-.0743-.1765-.1811-.2156-.3205-.0146-.0543-.0305-.1135-.0437-.1628.0726-.2125.2169-.3251.4316-.3429.0109-.0188.0243-.0277.0316-.0402.032-.0482.0658-.0996.027-.1553-.0338-.057-.0858-.0537-.1481-.0397-.0395.0106-.0883-.0134-.125-.0221.0095-.1321.1216-.1383.1801-.1962.1012-.0959.1689.0182.2383.0208l.0777-.1345c-.054-.0728-.1137-.0489-.176-.0348-.1265.0312-.1605.0032-.1868-.1246-.0141-.0623.0153-.1204-.0387-.1932-.0931-.1205-.0695-.1903.0742-.2658.1136-.0595.1359-.1342.0969-.2401-.0195-.053-.0153-.0964.018-.1397.0667-.0866.103-.1782.0725-.2917-.0132-.0494-.0143-.1125.0078-.1581.0376-.0868-.0085-.2093.1257-.261.0382-.0155.0471-.1105.0746-.1654.0281-.0631.049-.1427.1011-.1752.054-.0356.0699-.0848.1032-.1281.0369-.0495.0229-.1118-.0165-.1304-.1288-.066-.0862-.1832-.0885-.2804-.0015-.0551.0583-.1081.0872-.1582-.036-.075-.068-.1352-.0925-.1868.0593-.1242.13-.2252.1588-.3545.026-.1101-.0623-.2028-.0158-.3051-.0522-.1553.0079-.2666.1435-.3425.0854-.0466.1116-.1065.0932-.2047-.0145-.0834.0168-.1738.0123-.2598-.0071-.125.0202-.2302.091-.3311.0302-.0451.0734-.091.04-.1561.0707-.0718-.0007-.1506.0099-.2195.008-.0788.0988-.164.0816-.2281-.0273-.1117.0205-.18.0656-.2582.0343-.0594.0094-.103-.0316-.1475-.0923-.1075-.0998-.1452-.0348-.2578.0578-.1.1137-.197.1697-.2939-.1259-.1144-.1241-.1175-.0563-.2494.0235-.0406.0407-.0849.0516-.1328.0242-.1069-.0419-.1659-.0846-.2365-.0561-.0907-.0604-.1266.0187-.1768.0975-.0605.108-.1294.0802-.2331-.0291-.1085-.0087-.151.1174-.2032.0714-.0297.116-.0998.0992-.1429-.0474-.1275.0492-.2009.0873-.2957-.0377-.1468.0152-.265.1587-.3545-.1015-.0892-.1335-.1758-.0962-.2599.0907-.0269.1817.0757.2545.0219.0679-.0526.1059-.1474.1542-.2237.0374-.0577.0161-.1075-.0317-.1476-.054-.0437-.1283-.0741-.1706-.0151-.0569.0839-.1317.0907-.2263.1028-.0052-.0488-.0059-.0909-.0134-.1286-.0176-.0852.0315-.1486.0757-.2107.0388-.0526.1032-.0196.152-.0248.0557-.0096.106-.0389.1441-.0544.0594.0635.1022.1049.1527.1549l.0632-.1095c-.0495-.0661-.0931-.1496-.1597-.2006-.0665-.0509-.1628-.0648-.2402-.097-.0188-.1192.0479-.2058.0953-.2952.056-.0969.1953-.0707.2499-.1726-.0199-.074-.0091-.1721-.139-.1929l-.1517.2627c-.0625-.1736.0075-.2876.0886-.3992.1141.0409.1785-.0345.2428-.0808.006-.155-.1088-.1295-.176-.1433-.0664-.1885-.1258-.3603-.1869-.529.0253-.0438.0407-.085.0668-.1158.0225-.0245.0602-.0319.0796-.0583.0279-.0339.068-.0816.0582-.1081-.0306-.0844.0376-.0867.0754-.1233.1452-.1288.1704-.1434.172-.3051.0004-.1165.0192-.2141.0797-.3043-.1211-.0866-.1455.0495-.2348.0813-.0338-.057-.0663-.1092-.0925-.1577-.0336-.0068-.0641-.0119-.1057-.0193l.1264-.2189c.0543-.0145.1085-.029.1678-.0449.0162-.0281.0343-.0594.0523-.0907.0091-.0156.0056-.0385.0052-.0595-.0174-.2228.0099-.4363.1442-.6256.0108-.0188.0199-.0344.0263-.0599-.1092-.1506.0108-.2356.1107-.3364-.0567-.0536-.104-.1017-.1531-.1468-.1183-.1058-.1374-.1668-.0436-.3003.0866-.121.101-.2544.1123-.3897.0033-.0273-.0034-.052-.0103-.0977.1053-.0017.1927-.0013.3011-.0012-.0119-.0445-.0082-.0798-.0251-.0938-.118-.0848-.1452-.2256-.2061-.3441-.0347-.0701-.0325-.1606-.0726-.2212-.0655-.0962-.1015-.1712.0426-.2256.0216-.0084.045-.0491.0416-.072-.0259-.1358.0872-.1872.1516-.2626-.0225-.0839-.0405-.1611-.0635-.2369-.0217-.0709-.0295-.1296.0151-.1997.0235-.0407.0315-.1195.0092-.1532-.0722-.0917-.0592-.201-.1081-.3042.0332-.0142.066-.0203.083-.0355.0617-.0561.067-.1448-.0024-.1765-.1167-.0507-.1034-.1389-.0949-.2258.0085-.116.0233-.2283.145-.2873-.0129-.0283-.0159-.0593-.0324-.0813-.0709-.0868-.0951-.1967-.0825-.2978.0088-.0659.0225-.133.0183-.198-.0068-.1039.1173-.0948.1365-.1713.0027-.0193.0216-.0376.0198-.0344-.0319-.0893-.0364-.1754-.0851-.2285-.091-.1025-.0513-.1713-.0062-.2204.0852-.0175.1345-.0307.1821-.0408-.0127-.0865-.05-.1664-.0273-.2201.0434-.1042-.0061-.1703-.0532-.2475-.0281-.0454-.0749-.1016-.0658-.1464.0258-.1602-.0184-.315-.0254-.4692-.0091-.172-.012-.3405-.044-.5091-.011-.0605-.0218-.1502.0788-.2088.1209-.072.0975-.1689-.0196-.2407-.0375-.0217-.0751-.0433-.1095-.0632-.0609-.227-.1205-.449-.1827-.6809l.0938-.1626c-.1038-.1309-.0948-.255-.0261-.4029.043-.0961.1098-.2118.0395-.3358-.016-.0301-.0082-.0798-.0026-.1183.006-.0466.0012-.0744-.0399-.1189-.2195-.2268-.2064-.3652-.1041-.6147.0172-.0443.0362-.0916.0274-.1342-.0223-.113.0063-.2133.0305-.3202.0169-.0653.0342-.1387-.0179-.2147-.1288-.1744-.175-.3762-.1607-.589.0027-.0192.0006-.0371-.0065-.0537-.0302-.0634-.0349-.1203-.0051-.1864.0245-.0568.0314-.1195.0541-.1731.0298-.0662.0704-.122.1119-.1939-.0387-.0558-.0617-.1316-.1149-.1623-.0595-.0343-.142-.0361-.2122-.0516-.1039-.0225-.1222-.0414-.1183-.135.0035-.0856.0151-.1706.0204-.2593-.0399-.0105-.0752-.0142-.1052-.0274-.0506-.0208-.1227-.0333-.1413-.0732-.0613-.1396-.1333-.2896-.147-.4393-.0111-.1398-.0465-.252-.132-.3639-.0745.0278-.1522.0539-.2249.0786-.0089-.0135-.0196-.0238-.0236-.0386-.0048-.0278-.0096-.0556-.0064-.0829.0464-.261-.0211-.5126-.0349-.7707-.0025-.039-.049-.0742-.0788-.1164-.0873.0886-.1791.1078-.2754.0578-.0407-.0235-.0837-.0358-.1352-.0405-.0645-.0039-.1557-.0482-.1833-.1017-.0449-.0885-.1259-.1144-.1948-.1541-.16-.0841-.3274-.1557-.496-.2322-.0069-.0748-.0093-.143-.0215-.2084-.0062-.0327-.0248-.0727-.0517-.084-.0617-.0231-.1297-.0499-.1947-.0457-.0471.002-.1166-.0006-.1495.0638-.038.0657-.099.0846-.1575.0342-.0723-.0626-.1655-.0747-.2537-.0881-.0802-.0129-.1469-.0347-.2108-.0758-.0469-.0271-.097-.056-.1502-.0867-.0994.0927-.2151.1052-.3334.1077-.1103.0031-.1877-.0291-.2285-.1319-.0363-.096-.1151-.1332-.1962-.13-.138.0078-.2564-.098-.3977-.0628-.0197.0053-.0545-.0357-.0773-.0613-.1383-.1507-.2739-.1832-.4468-.1079-.0215.0084-.0472.0311-.0633.0302-.0716-.0205-.145-.0379-.2126-.0727-.08-.042-.147-.0849-.2165.0209-.0199.0344-.0849.0386-.1298.0585-.0449.0199-.1067.0259-.1266.0603-.0694.1058-.1674.066-.2422.0437-.1257-.0351-.2415-.102-.3646-.1563-.1167-.0507-.1871-.0372-.2673.0583-.014.017-.0271.0469-.0401.0477-.1183.0026-.1483.0979-.1903.1778-.0361.0625-.0845.0596-.1597.0454-.0042-.065-.0098-.1349-.009-.2012-.0005-.1003-.0796-.1585-.1322-.2264-.0223-.0337-.112-.0229-.1684-.0263-.0193-.0028-.0395.0106-.0561.0176-.0246.1943-.0254.1813-.2175.1455-.1281-.0239-.2641-.0774-.4019-.0194-.0382.0155-.0821.0193-.1198.0268-.0487.0844-.0921.1595-.1354.2345-.0451.0782-.1139.1177-.1915.1438-.066.0203-.1247.0281-.1607-.0469-.0533-.11-.1698-.1106-.2675-.1294-.0814-.0179-.1705-.0443-.2466.0369-.0414.0428-.1063.0179-.1554-.0272.007-.0627.0722-.1251.0004-.1958-.0484-.0029-.0986-.0027-.1613-.0097l-.1372.2377-.1565-.0903c-.0115-.0525-.0326-.1314-.0538-.2104-.1221.038-.1346.0307-.1523.0831-.0585.1664-.2324.1785-.348.2703-.0153.012-.073.0037-.0757-.0062-.0403-.1108-.1501-.1159-.2287-.1821l-.1174.2033c-.109.0371-.2014.0671-.3105.1042l-.0908-.0524c-.0375-.0217-.0715-.0496-.1126-.0651-.154-.0513-.2183-.1135-.2576-.2404-.0151-.0462-.0252-.0938-.0477-.1776-.0498.0213-.0848.0386-.1199.0559-.0077.0206-.01.0318-.0141.0461-.0131.1384.0411.2614.0737.3928.0154.0673-.0099.1111-.074.1282-.0808.0243-.1629.0436-.2239.0625-.0407-.0235-.0725-.0335-.0751-.0434-.0131-.0785-.078-.1034-.1371-.1167-.0622-.0151-.089.0529-.1299.0876-.0562.0468-.1325.0778-.2074.0846-.0489.0051-.1011-.0417-.153-.0675-.0438-.0253-.0876-.0506-.1126-.0651-.1609-.0178-.2035.0994-.263.2026-.0831-.073-.1523-.1338-.2448-.2122-.0409.1432-.0705.2595-.1091.3915-.018.0022-.044.0038-.0736.0117-.1161.0205-.1268.0102-.1402-.1185-.0017-.026-.0132-.0493-.0256-.0857-.1009.0085-.1906.0193-.2816.0251-.0614.2147-.2599.3128-.3686.4793-.0108.0188-.0539.0356-.0745.0279-.1315-.0468-.2237.0334-.3306.0885-.0952.0493-.1883.1165-.3096.0881-.0305-.0051-.0704.0136-.1036.0277-.1293.0505-.1494.0347-.156-.0984-.0039-.0439-.0127-.0865-.0205-.1452-.0813.0323-.1596.0162-.2029.0913-.0596.1032.0698.132.1035.2182-.0741.0198-.1395.032-.1943.0546-.1163.0497-.2187.1114-.2354.2561-.0061.0465-.0313.0903-.0566.1341-.0632.1094-.0682.1108-.1997.064-.0904-.0314-.2613.0117-.267.0794-.0058.0967-.0737.1492-.0964.232-.1467.0445-.2943.0761-.4247.1718-.0679.0525-.0669.1448-.1445.1709-.0777.026-.1566.0472-.2067.1267-.0217.0375-.0796.0583-.1012.0958-.0741.1282-.1944.1922-.3264.2327-.0511.0164-.0879.0368-.1088.0873-.0733.1704-.1944.3006-.3681.3629-.003.0775-.0086.1451-.0112.2146-.0565.0257-.1176.0447-.1652.0838-.0837.0727-.212.107-.2032.258.0017.026-.0177.0523-.0303.0742-.0353.0756-.0875.1372-.0884.2326.001.0923-.1086.1374-.1613.2071-.0212.0294-.0097.0819-.0247.115-.0595.1032-.0122.2598-.1706.3101-.0198.0053-.0469.0522-.0416.0719.0301.0924-.0314.1195-.0921.1595-.0539.0356-.0963.0945-.1534.1574.0279.0745.0603.1557.0824.2186-.0812.1407-.148.2564-.3316.755-.1023-.0757-.1058.0098-.1361.084.057-.0337.0975-.0604.2452-.4463l.0281.0162Zm23.6527 7.4347c-.1117-.0812-.2271-.127-.3543-.1379-.0829.0856-.0945.1998-.1089.3041-.0189.1267-.0432.2628.0321.3855.016.03.0207.087.0026.1182-.0451.0782-.0369.158-.0306.2409.0029.0601.0147.1336-.0106.1774-.1037.1652-.1018.3498-.1111.5321-.0075.0998-.0402.1853-.0916.2598.0186.0691.0331.1234.0477.1777-.0361.0625-.0722.1251-.1083.1876.0212.0789.041.153.0582.2171-.0344.0885-.0697.1641-.0937.2419-.0482.1557-.0336.3184-.0303.4788.0044.1442-.0244.2736-.1851.3351-.0794.0292-.1048.1021-.0554.1681.0584.0796.0819.1474.0371.2466-.028.0631-.0216.146-.0099.2195.0341.2156-.0375.412-.0836.6147-.0192.0765-.076.1604-.1434.2049-.0759.0521-.0448.0993-.023.141.0357.0539.0897.0977.1339.144-.0393.0608-.0525.1198-.1315.1409-.1005.0296-.1019.0538-.0853.1551.0118.0735.0187.1484.0237.2263-.0786.0422-.1486.0768-.2254.1159.0613.1105.0716.2373.1244.3554.0844.1863.1301.3962.0625.6073-.0177.0523-.0076.0999.0425.1288.0845.0488.1312.1341.1932.2074.1208.1449.1506.3246.2153.4871.0461.1225.0392.2645.0804.3884.066.1965.1535.3846.2324.5803.0063.0036.0188.0108.0336.0069.1651-.0257.1883-.0081.2473.1427.0252.0647.0523.1262.0825.1895.0263.0485.0638.0702.1213.0574.0524-.0114.1135-.0303.1614-.0193.2077.0448.4067.0471.6073-.033.0109-.0188.0298-.037.0307-.0532.0005-.1164-.012-.2321.1214-.2968.0135-.0089.0159-.0492.0142-.0752-.0111-.1399.0462-.2319.1697-.294.1168-.0577.1669-.1663.1773-.2854.0061-.0757-.0002-.1586-.0286-.225-.0356-.0831.0266-.1473.0116-.2226-.0088-.0426.0496-.0715.0919-.1013.0422-.0298.0734-.091.0571-.1713-.0193-.0821-.0154-.1757.0043-.2603.0219-.0957-.0826-.1894.0025-.2862.0072-.0125-.0154-.0673-.04-.0898-.0138-.0122-.0515-.0047-.0775-.003.0005-.0081-.0066-.0247.0006-.0372.0614-.1064.0716-.1964.0081-.3248-.0609-.1185-.1831-.2683-.0301-.4176.0036-.0063-.0098-.0265-.0057-.0408.0307-.1616.0534-.3237-.0033-.4857-.0288-.0875-.0191-.1694.0091-.2616.021-.0796-.0154-.1756-.0213-.2666-.003-.0309.0187-.0685.038-.0948.0641-.0965.0573-.2004-.019-.2778-.0624-.0653-.0385-.114-.023-.1843.0275-.1342.1005-.2463.1642-.3638-.015-.0463-.0283-.0956-.0433-.1418-.1211.0218-.1229.0249-.2137-.0275-.1064-.0614-.2128-.1228-.3192-.1843-.0012-.034-.0073-.0668-.0067-.1039.0015-.0533.013-.1093.0047-.1599-.0158-.0884-.058-.167-.1389-.222-.0528-.0388-.0405-.0817.0198-.1428.0464-.0442.0958-.0865.0729-.1623-.0341-.1072.0217-.1751.0995-.2302.0526-.0405.0828-.0856.0921-.1595-.147-.0057-.2273-.0979-.2985-.2057-.0357-.054-.1014-.0919-.1456-.1383-.0258-.0274-.0651-.0751-.0587-.1006.0325-.1647-.076-.2732-.1449-.3922-.0766-.1276-.0707-.2535-.0656-.3923.0059-.1259.0923-.2177.1362-.33l-.1627-.0939c-.0461-.231-.1452-.4424-.1419-.6866l.0049-.0013Zm-5.835 15.4116c-.0424.1673.015.263.1767.2938.0474-.0532.1447-.1013.2919-.1442.084-.16.0813-.1699-.0514-.2507-.0345-.0199-.072-.0415-.1033-.0596-.0602.032-.1069.055-.1554.0812-.0534.0276-.1069.0551-.1536.0781l-.0049.0014Zm-5.3272-9.9765c-.0997-.0368-.2066-.0902-.3186-.1131-.051-.0128-.1153.0335-.1862.0551.036.075.0465.1436.0911.1819.117.1009.2626.1307.4172.1157.0707-.0717.0136-.1464-.0021-.2347l-.0014-.0049Zm9.3166-6.1629c-.0292.2458.1438.329.2482.4518.0303.0342.0814.047.1221.0705l.1083-.1876c-.0698-.0237-.0657-.1464-.1753-.1012-.0116.0058-.0492-.0159-.0532-.0307-.0372-.1091-.1483-.119-.2501-.2028ZM32.8448 38.981c.1189-.0036.217-.1374.2943-.4013-.1205-.0154-.2378-.0289-.3614-.0461.0226.1632.1511.2875.0671.4474Zm8.1705-16.0813c-.0282-.0163-.0483-.0321-.0501-.0289-.0649.0834-.1871.0421-.2551.1237-.0157.0201-.0659.0203-.0982.0184-.1514-.0124-.1527-.0173-.2085.1298.0993.0448.1069.0534.1699.0022.0526-.0406.0916-.0431.1533-.0199.128.053.1316.0467.1997-.064.0307-.0532.0632-.1095.0921-.1595l-.0031-.0018ZM23.8447 41.7698s-.0265.0098-.0368.0205c-.0104.0107-.0145.025-.0217.0375-.0569.1131-.0338.1598.0906.1899.048.011.0904.0314.1329.0517.0488.024.0975.048.1744.0882-.0139-.0914-.0249-.152-.0376-.2094-.1064-.0614-.2066-.1192-.3067-.177l.0049-.0014ZM41.2919 22.7675c-.07.1139-.1076.2297-.067.3616.2212-.0433.2369-.0633.2653-.3221-.064-.012-.1262-.0271-.1983-.0395ZM34.165 37.8002c-.0803-.0923-.1837-.1228-.298-.1054-.0897.0108-.0958.0865-.1225.1544.0818.039.1533.0886.2241.0961.0869.0085.1178-.1029.1964-.1451Zm5.0913-15.7785c.0272.1408.1027.215.2263.2224.0372.0007.0744.0013.1277.0029-.0031-.1102-.0526-.1763-.1236-.234-.0755-.0644-.1434-.0119-.2304.0087ZM35.5801 34.8144c.1016.0336.1694.0102.235-.0312-.0549-.1651-.1037-.1891-.2054-.0852-.0396.0397-.076.0521-.1275.0474-.0322-.002-.0681.0023-.1022.0035.0215.093.0623.1596.1225.1999l.0776-.1344Zm-11.673-2.5989c-.0522-.1553-.0522-.1553-.1711-.1446-.026.0016-.0533-.0016-.0775-.0031-.0614-.0021-.1063.0179-.1325.0778-.0167.0362-.0397.0688-.0632.1094.0376.0217.0778.0533.0845.0488.099-.0846.2315-.054.3598-.0883Zm18.6492-2.134c-.0306.2409-.0261.2476.1076.3123.0613.0312.1093.0131.1463-.0365.0351-.0464.0229-.1118-.0285-.1457-.0671-.0429-.1346-.0777-.2254-.1301ZM40.3721 27.678c-.1271.0683-.1289.0715-.1064.1553.0238.0889.0804.1716.0616.2691.0767-.0099.1494-.0346.1314-.1118-.0247-.1018-.0063-.2204-.0866-.3126Zm-1.9084-5.9096c.039.2144.0698.2405.2407.1974.0047-.0515.0045-.1017.0092-.1532-.0837-.0358-.151-.1288-.2499-.0442Zm3.9156 3.8786c-.1138-.1283-.2203-.0522-.3315-.033.0107.1188.1042.1519.1776.1693.0847.0197.111-.0694.1507-.1382l.0032.0019Zm-8.751 9.6208c-.2146-.0113-.1141.176-.1991.2437l.0908.0524c.1078-.0712.1429-.1705.1052-.2979l.0031.0018ZM17.5546 8.5916s-.0082.0286-.0123.0429c.0979.069.1934.1492.3329.1172.0441-.1413-.0881-.1509-.122-.1789-.0879.0076-.1448.0123-.1986.0188Zm6.862 22.4378c.0145-.025.032-.0482.0433-.075.0304-.0743.0096-.1321-.0522-.1553-.0649-.0249-.1053.0017-.1409.0562-.0362.0626-.0538.1149.0078.1672.0403.0024.0806.0048.142.0069Zm.0424 9.8066c-.0839-.0859-.154-.0513-.2173-.0212-.0283.0129-.0491.0634-.056.097-.0042.0434.0189.0901.0673.093.0385.0056.0905.0023.113-.0223.0396-.0397.0591-.0951.0898-.1483l.0032.0018Zm.9956-7.9689c-.0666.1659-.0546.1812.1987.2773.032-.1566-.056-.2283-.1987-.2773ZM38.0615 21.5905c.1376-.2167.1376-.2167-.0149-.2922-.0809.1256-.0759.223.0149.2922ZM15.0704 12.7281c-.1284-.0908-.2234-.0901-.285.0022.1284.0908.2234.0901.285-.0022Zm9.4095 34.8583c.0599.0263.1329.0058.2189-.0612-.0222-.0337-.0355-.0831-.0655-.0962-.0344-.0199-.09-.0103-.1334-.0145-.0088.0658-.013.1092-.02.1719ZM37.7824 21.0332c.1834.0725.1853.0694.27-.1569-.1294-.0288-.1912.0565-.27.1569Zm-7.7252 26.108c.0378.1803.0847.2074.2495.1316-.0455-.0513-.0843-.107-.1339-.144-.025-.0144-.0748.0068-.1156.0124ZM19.4656 35.0009c.0309.1055.101.1793.1485.1692l.0795-.1376c-.0751-.0434-.1332-.1019-.2298-.0284l.0018-.0032Zm15.582-7.5325c.0046.0861.0079.1381.0135.208.0776-.0261.1368-.0419.2145-.068-.0356-.0539-.0538-.1019-.0864-.1249-.0313-.0181-.0789-.008-.1434-.0119l.0018-.0032ZM24.6609 45.6394c-.134.0394-.1836.1108-.1488.2143.1476-.0315.1634-.0516.1488-.2143Zm8.9881-5.2976c.1036-.0277.1805-.0959.1691-.1484l-.1377-.0795c-.0433.0751-.1018.1331-.0314.2279Zm-7.2965-7.3316c.049.1826.0615.1898.2003.1157-.0164-.0512-.0346-.0992-.0483-.1405-.0408.0057-.0883.0157-.152.0248ZM24.1687 45.2343c.1039.085.197.0998.279.0444-.0759-.0564-.1492-.1029-.2284-.1319l-.0488.0844-.0018.0031ZM42.136 29.9639c.0377.1274.105.1844.2019.1708-.0306-.1205-.0979-.1774-.2019-.1708ZM26.0842 33.952c.0953.0661.1765.0894.2435.0697-.0426-.0997-.0426-.0997-.1948-.1542l-.0505.0876.0018-.0031Zm12.7724-17.786-.0776.1345.097.056c.0427-.0379.0854-.0758.1268-.1186.0073-.0125.0038-.0353.0065-.0546-.0546-.0065-.0981-.0108-.1527-.0173ZM24.5749 40.3317c-.114.1468-.094.1917.0994.2325.0206-.1007-.0603-.1557-.0994-.2325ZM43.0042 29.3852c.0649-.0931.0679-.1706.009-.2324l-.1029.1782.0939.0542Zm-.8336-4.6343-.053.0194c-.0011.0453-.0188.0976-.0033.1358.0142.0332.0648.054.1144.091.0119-.064.0341-.1096.0199-.1428-.0124-.0364-.0526-.0679-.0798-.1003l.0018-.0031Zm-1.3567-4.4151c.0409.0736.0168.1515.08.1504.0336.0069.0685.0187.0766.0192-.0199-.074-.0371-.1381-.0543-.2023-.0148.004-.0413.0137-.1005.0296l-.0018.0031Zm-5.6105 19.294c-.0769-.0403-.1375-.1087-.2145-.0405.0258.0566.078.1034.1568.1405l.0577-.1ZM13.0313 13.4772l.1503.0868c.0975-.0605.0376-.1159.0069-.1711-.0044-.0068-.0156-.009-.037-.0298-.0378.0366-.0738.07-.117.116l-.0032-.0019Zm.6894 1.4947c-.0202-.0951-.0449-.1969-.1748-.2177-.0468.1606.0921.1658.1748.2177ZM27.4024 28.2791c-.0769-.0402-.1376-.1086-.2145-.0404.0054.099.0819.1182.1531.1468l.0614-.1064Zm7.6836 6.3793c.0687.0688.1306.0628.1873.008-.0039-.0439-.0064-.0829-.0063-.112-.1106-.018-.1596.0163-.181.104ZM32.0688 41.431c.0197.1031.0294.1587.0456.2389.0544-.0436.0971-.0815.1516-.1251l-.1972-.1138ZM15.8293 12.0279c-.0073-.0668-.0313-.1265-.1057-.1277-.0372-.0006-.1035-.0014-.0984.0766.0585.0504.1193.0897.201.0493l.0031.0018Zm16.958 27.2118-.0632.1095c.0532.0307.1006.0497.1413.0732l.0596-.1032-.1377-.0795ZM26.3841 40.313c-.0126-.0865-.0047-.1653-.0806-.2217-.0875.1371-.0822.1569.0806.2217ZM19.8296 29.8822c-.0161-.1094-.0805-.1424-.1706-.1527.0053.1115.0621.1623.1706.1527Zm4.1904 1.0392.1138-.1971c-.0721-.0124-.1268-.0189-.1958-.0296.0262.0777.0488.1324.0802.2298l.0018-.0031ZM34.3164 11.8226c.1617.0308.186.0032.1418-.1516-.0959.0072-.1164.0787-.1418.1516Zm-.3023 20.8617.144.0832.0595-.1032c-.0532-.0308-.1006-.0498-.1493-.0738l-.056.097.0018-.0032Zm-.1044-.7732c.0501.1373.0519.1342.1852.0985-.0365-.0766-.0982-.1095-.1852-.0985ZM29.0141 46.9893c.0911-.0349.1458-.0575.2037-.0783-.0444-.0965-.1076-.0955-.1678-.0635-.0233.0115-.0186.0684-.0359.1418Zm8.6665-26.3652c-.0568.084-.0737.1493.0215.2084l.0849-.1469-.1064-.0615ZM25.1501 30.7274l-.0613.1063c.0718.0707.1332.0728.208-.0133-.0501-.0289-.0953-.0592-.1467-.093Zm9.6832 3.906c-.003.0872.0345.145.1127.1735.0263-.0891-.0043-.1443-.1127-.1735ZM29.0836 47.288c-.1035-.0014-.1431.0383-.1528.1203.0313.018.0675.0348.1194.0606.0106-.069.0233-.12.0334-.1809ZM13.2725 21.6891c.0966-.0082.1519-.0486.1659-.1211-.0909-.0233-.1385.0159-.1659.1211Zm16.7977 24.042c.0082.0965.0486.1518.1212.1658.0232-.0908-.016-.1385-.1212-.1658ZM11.597 30.0118l-.1815-.1048-.0362.0626.1816.1048.0361-.0626Zm23.8187-6.5923c.0158.0883.0246.1309.0395.2063.0535-.0567.1255-.0151.1358-.1051l-.1753-.1012ZM26.8152 35.2371c.0786.0037.1325-.0319.1618-.1067-.0786-.0037-.1325.0319-.1618.1067Zm7.3164-3.1104c.0284.0665.0492.1243.0736.176.009.0135.0439.0253.047.0271.0171-.0152.0365-.0415.0343-.0594-.0064-.0829-.0731-.1048-.1567-.1406l.0018-.0031ZM26.6608 45.8976c.0835-.0144.1338-.0437.1261-.1316-.0942.004-.1362.0479-.1261.1316Zm.1268-12.6653c-.1088-.0212-.1284.0634-.1596.1246-.0054.0094.0286.0374.0495.0661l.1101-.1907Zm15.4045-5.7795c.0953.0661.1593.0517.192-.0434-.0592.0158-.1068.0259-.192.0434ZM19.6757 8.1483c-.0314-.0709-.0814-.0998-.1502-.0867.0251.0673.0752.0962.1502.0867ZM38.6161 21.1142c-.0661.0953-.0516.1592.0436.192-.0159-.0593-.026-.1068-.0436-.192ZM16.3037 8.9368c-.0191.0765-.0243.1361.0562.17l.065-.1126c-.0425-.0204-.0787-.0371-.1212-.0575ZM40.8985 30.6546c-.1518-.0334-.1321.0698-.1776.1269.1285.0449.1123-.0644.1776-.1269ZM13.9259 15.0862c.0799.0544.1354.0643.1666.0295-.0798-.0545-.1354-.0643-.1666-.0295Zm8.654 20.4327c.0869.0085.146.0217.1786-.0637l-.1064-.0614-.0722.1251Zm3.144 13.5988c.0586.0213.0975.048.119.0396.053-.0195.0236-.0698.0112-.1062-.0071-.0166-.0259-.0274-.0486-.0531-.0235.0407-.0447.0702-.0834.1228l.0018-.0031Zm4.1757-2.9973c-.1128.0725-.0704.122-.0379.1741.0044.0068.0224.0046.0578.0084-.0065-.0538-.0104-.0978-.0199-.1825ZM41.7079 23.2829c-.0461-.1226-.0506-.1293-.1128-.1444-.0112-.0023-.0311.0321-.05.0504l.1596.0922.0032.0018ZM13.5135 20.8525c-.068-.0268-.1073-.0453-.1691-.0685.0091.0637.0148.1045.02.1534.0436-.0249.0822-.0485.146-.0867l.0031.0018Zm23.5415.6239c-.0575.0418-.0912.064-.142.1014.0581.0294.0912.0444.1462.0719-.0029-.06-.0023-.0972-.0042-.1733ZM16.0939 9.6038c-.0693-.0317-.1181-.0557-.1793-.0869.0089.1219.0151.1255.1793.0869Zm-.5023.6315c.052-.0033.0928-.009.1466-.0154-.0262-.0485-.0436-.0836-.0698-.1321-.0248.0357-.0437.054-.0563.0759-.0091.0156-.0087.0367-.0174.0734l-.0031-.0018Zm26.1042 15.851c-.0551.0015-.132-.0387-.1468.0737.0716.0205.1249.0221.1468-.0737ZM20.1045 30.6997c.0403.0025.0726.0044.1322.0096-.0598-.0553-.0321-.1394-.1116-.1103-.0215.0085-.016.0784-.0206.1007Zm-7.8732-9.1948c-.0315.0402-.0558.0679-.0739.0991-.0036.0063.0187.04.033.0441.0604.0182.0562-.0468.0806-.0744.0036-.0063-.0192-.0319-.0365-.067l-.0032-.0018Zm-1.3635.4971c-.0186-.04-.0044-.1152-.0753-.0936-.0198.0053-.0192.0765-.0324.1356.048-.0181.0745-.0279.1108-.0402l-.0031-.0018ZM26.3009 8.7502c-.0467.0231-.125.007-.0971.0815.0053.0197.0766.0192.1294.0288-.0119-.0444-.0217-.0709-.0323-.1104Zm.9044 22.0963c.0371.0297.0679.0559.0992.0739.0063.0037.04-.0186.0441-.0329.0181-.0604-.0469-.0562-.0745-.0805-.0063-.0037-.0319.0191-.067.0364l-.0018.0031Zm13.0205-4.1871c-.0025.0403-.0062.0757.0019.0762.0349.0118.062.0733.107.0243.0103-.0107.0127-.0511.0065-.0547-.0313-.018-.0662-.0298-.1136-.0489l-.0018.0031ZM11.6871 17.8799c-.0025.0403-.0093.0739-.0013.0744.035.0118.0638.0702.1053.0274.0103-.0107.0127-.051.0065-.0547-.0313-.018-.0663-.0298-.1137-.0489l.0032.0018Zm1.12 5.0707c.0417-.0217.1201-.0057.0953-.0784-.0053-.0197-.0766-.0191-.1325-.0306.015.0462.0248.0727.0372.109Zm.2753-.5707c.0056.0408-.0012.0743.0126.0865.0353.0329.064.0119.0745-.0279.0077-.0205.0029-.0483.0043-.0725-.0278.0048-.0556.0096-.0914.0139ZM35.5523 37.3127c-.0332.0141-.0624.014-.0763.031-.0321.0482.014.0623.0427.0705.0188.0108.0439-.0038.0668-.0073-.0098-.0265-.0195-.053-.0364-.0961l.0032.0019ZM13.1712 23.115c.0024-.0403.0012-.0744.0049-.1097-.0552.0306-.1318.0114-.1088.0872.0053.0198.0766.0192.1039.0225Zm-.0506 1.4969c-.0079-.0296-.0109-.0605-.0243-.0807-.0089-.0135-.042-.0285-.0469-.0271-.0171.0151-.0298.037-.0343.0594-.0064.0255-.0079.0497-.0106.0689.0623-.014.0901-.0188.1161-.0205Zm29.298 1.3788c-.0335-.0068-.0528-.0096-.0721-.0124.0124.0364.0217.0709.0377.101.0031.0018.0327-.0061.0507-.0083-.0048-.0278-.0114-.0525-.0163-.0803ZM34.9841 39.9952c-.0336-.0069-.0528-.0097-.0721-.0125.0124.0364.0217.0709.0377.101.0031.0018.0327-.0061.0507-.0083-.0048-.0278-.0115-.0524-.0163-.0802ZM20.4149 32.576s.0064-.0255.002-.0322c-.016-.0301-.0357-.0539-.0535-.0809-.0153.012-.0368.0204-.0427.0379-.0159.0492.0325.0521.0557.0697.0094.0054.0255.0064.0385.0055Zm7.3394-4.1187c-.0592.0159-.0933.017-.1171.0366-.0135.0089-.0042.0435-.0056.0677.0228-.0035.0501-.0002.0654-.0123.0203-.0133.0253-.0437.0542-.0938l.0031.0018Zm8.6122-1.4158s.0064-.0255.0019-.0322c-.016-.0301-.0356-.0539-.0534-.0809-.0153.012-.0369.0204-.0428.0379-.0159.0492.0325.0521.0558.0697.0094.0054.0255.0064.0385.0055Zm-6.221 19.4336s.0035.0228.008.0296c.0124.0363.0077.0878.0659.0881.0081.0005.0252-.0147.0306-.0241.028-.063-.037-.0588-.0597-.0845-.0031-.0018-.0112-.0023-.0417-.0073l-.0031-.0018ZM13.843 17.3692s.0035.0229.0079.0296c.0124.0363.0077.0878.066.0881.0081.0005.0251-.0146.0306-.024.028-.0631-.037-.0589-.0597-.0845-.0032-.0018-.0112-.0023-.0417-.0074l-.0031-.0018Zm-.8519-2.2973s.0247-.0066.0296-.0079c.0364-.0124.0879-.0077.085-.0677.0005-.0081-.0147-.0252-.024-.0306-.0631-.0281-.0589.0369-.0832.0646-.0018.0031-.0023.0112-.0074.0416ZM40.1409 23.012c.0289-.0501.0491-.0634.0519-.0827.0046-.0223-.0021-.047-.0105-.0685-.0013-.005-.0318-.0101-.0336-.0069-.0126.0219-.0252.0438-.0236.0698-.0027.0192.0057.0407.0176.0851l-.0018.0032ZM13.5766 13.2917c.0106.0395.0136.0704.0217.0709.0224.0046.047-.002.0655-.0123.0018-.0031.001-.0452-.0083-.0506-.0188-.0109-.0417-.0074-.082-.0098l.0031.0018Zm5.9651 22.8206c-.0395.0106-.0705.0136-.0709.0216-.0046.0224.002.0471.0122.0655.0032.0018.0453.0011.0507-.0083.0109-.0187.0074-.0416.0098-.0819l-.0018.0031ZM38.7558 21.3492c.0414.0656.0561.0907.0637.0993.0193.0028.0515.0047.0838.0067.0005-.0081-.0022-.018-.0017-.026l-.144-.0832-.0018.0032ZM22.268 35.4014c.0106.0394.0136.0704.0217.0709.0224.0045.047-.0021.0655-.0123.0018-.0031.001-.0452-.0083-.0506-.0188-.0109-.0417-.0074-.082-.0098l.0031.0018Zm13.214-8.2951c.0414.0656.0561.0908.0637.0993.0193.0028.0515.0047.0838.0067.0004-.0081-.0022-.0179-.0017-.026l-.144-.0831-.0018.0031Zm-1.2853 4.1198c-.0319.0191-.0633.0302-.0607.0401.0004.021.0138.0412.0222.0628.0166-.0071.0444-.0119.0498-.0213.0077-.0206-.0038-.0439-.0064-.0829l-.0049.0013ZM15.4686 12.7828c.0106.0395.0136.0704.0216.0709.0224.0046.0471-.002.0655-.0122.0018-.0031.0011-.0452-.0083-.0507-.0188-.0108-.0416-.0073-.082-.0098l.0032.0018Zm26.745 19.8654c.0967-.0735.0542-.0938-.0036-.1022.0012.0341.0011.0632.0036.1022ZM30.3947 46.0435s.0126-.0219.0198-.0344c-.0362-.0167-.0711-.0286-.1073-.0453-.0036.0062-.0072.0125-.0109.0188l.1002.0578-.0018.0031ZM20.2918 9.9217s.0126-.0219.0167-.0362c-.0349-.0118-.0711-.0286-.106-.0404-.0037.0063-.0073.0125-.0109.0188l.1002.0578ZM11.4476 31.4559c-.0395.0105-.0691.0185-.1104.0322.0719.0706.0944.0461.1104-.0322Zm27.8831-8.7824-.0188-.0109-.0433.0751.0188.0108.0433-.075ZM33.5574 43.854s.0133.0203.0241.0306c.0085-.0076.0251-.0146.0305-.024.0041-.0143-.003-.031-.0038-.0439-.0086.0075-.022.0164-.0508.0373Zm-7.7225-4.0207-.0108.0187.0751.0434.0108-.0188-.0751-.0433ZM11.8851 15.2964s.0133.0203.024.0306c.0086-.0076.0252-.0147.0306-.024.0041-.0144-.003-.031-.0038-.044-.0086.0076-.0221.0165-.0508.0374ZM26.7487 27.8141s.0202-.0133.0305-.024c-.0076-.0085-.0147-.0252-.024-.0306-.0144-.0041-.031.003-.044.0038.0076.0086.0165.0221.0375.0508ZM14.3075 12.763c.0188.0108.0339.0279.0496.0369.0062.0037.0184-.0102.0283-.0128-.0139-.0122-.0259-.0275-.0429-.0414-.0031-.0018-.0184.0102-.035.0173Zm20.483 19.4439s-.0038.0354.0025.039c.0157.009.0349.0118.0573.0164-.0008-.013.0033-.0273-.003-.0309-.0157-.0091-.0362-.0168-.0568-.0245ZM13.3473 12.6047l.0109-.0187-.0752-.0434-.0108.0188.0751.0433Zm1.7673-2.5406s.0021.018.0053.0198c.0094.0054.0192.0027.0322.0019-.0013-.0049-.0021-.0179-.0053-.0197-.0094-.0055-.0192-.0028-.0322-.002Zm16.6739 31.426s.0039.0148.0052.0197c.0086-.0075.0185-.0102.027-.0178 0 0-.0008-.013-.0053-.0197-.0085.0076-.0184.0102-.0269.0178Zm-1.6864 3.1377s.0148-.0039.0197-.0053c-.0076-.0085-.0102-.0184-.0178-.0269 0 0-.013.0008-.0197.0052.0075.0086.0102.0185.0178.027ZM11.0769 22.8107s-.0148.0039-.0198.0053c.0076.0085.0103.0184.0179.0269 0 0 .013-.0008.0197-.0053-.0076-.0085-.0102-.0184-.0178-.0269Zm28.7527 3.0821s-.0003-.021.0019-.0322c-.0049.0013-.0179.0021-.0197.0053-.0054.0094-.0028.0192-.0019.0322.0049-.0013.0148-.0039.0197-.0053ZM36.2174 12.3823s-.0211.0003-.0323-.002c.0014.005.0022.018.0053.0198.0094.0054.0193.0027.0323.0019-.0013-.0049-.004-.0148-.0053-.0197Z\"\n        fill=\"#001A72\"\n      />\n      {children}\n    </svg>\n  );\n}\n\nexport default HandIcon;\n"
  },
  {
    "path": "packages/audiodocs/src/components/InteractiveExample/index.tsx",
    "content": "import React from 'react';\nimport clsx from 'clsx';\nimport { useCopyToClipboard } from 'usehooks-ts';\n\nimport BrowserOnly from '@docusaurus/BrowserOnly';\n// @ts-ignore\nimport CodeBlock from '@theme/CodeBlock';\n\nimport Copy from '@site/static/img/copy.svg';\nimport CopyDark from '@site/static/img/copy-dark.svg';\nimport Reset from '@site/static/img/reset.svg';\nimport ResetDark from '@site/static/img/reset-dark.svg';\n\nimport ts from 'typescript';\nimport prettier from 'prettier/standalone';\nimport babelParser from 'prettier/parser-babel';\n\nimport AnimableIcon, { Animation } from '../AnimableIcon';\nimport styles from './styles.module.css';\n\nfunction compileTSXtoJSX(tsxCode: string): string {\n  const PLACEHOLDER_FOR_EMPTY_LINES = '// PLACEHOLDER-FOR-EMPTY-LINES';\n  const PLACEHOLDER_FOR_BREAKING_LINES = '// PLACEHOLDER-FOR-BREAKING-LINES';\n\n  // Adding comments to the end of each line to avoid vanishing empty lines\n  tsxCode = tsxCode\n    .split('\\n')\n    .map((line) =>\n      line.trim() === ''\n        ? PLACEHOLDER_FOR_EMPTY_LINES\n        : line + PLACEHOLDER_FOR_BREAKING_LINES\n    )\n    .join('\\n');\n  const result = ts.transpileModule(tsxCode, {\n    compilerOptions: {\n      module: ts.ModuleKind.ESNext,\n      jsx: ts.JsxEmit.Preserve,\n      pretty: true,\n      target: ts.ScriptTarget.ES2020,\n      removeComments: false,\n      noEmit: false,\n      indentSize: 2,\n    },\n  });\n\n  const output = result.outputText\n    .split('\\n')\n    .map((l) =>\n      l.trim() === PLACEHOLDER_FOR_EMPTY_LINES\n        ? ''\n        : l.trim().endsWith(PLACEHOLDER_FOR_BREAKING_LINES)\n        ? l.slice(0, l.indexOf(PLACEHOLDER_FOR_BREAKING_LINES)).trimEnd()\n        : l\n    )\n    .join('\\n');\n\n  return prettier.format(output, {\n    parser: 'babel',\n    bracketSameLine: true,\n    printWidth: 80,\n    singleQuote: true,\n    trailingComma: 'es5',\n    tabWidth: 2,\n    arrowParens: 'always',\n    plugins: [babelParser],\n  }) as unknown as string;\n}\n\ninterface Props {\n  src: string;\n  component: React.FC<{ width?: number }>;\n  label?: string;\n  showCode?: boolean; // whether to show code by default\n  larger?: boolean; // should the view be enlarged?\n}\n\nenum Tab {\n  PREVIEW,\n  TYPESCRIPT,\n  JAVASCRIPT,\n}\n\nexport default function InteractiveExample({\n  src: tsxCode,\n  component: Component,\n  label,\n  showCode = false,\n  larger = false,\n}: Props) {\n  const [_, copy] = useCopyToClipboard();\n  const [key, setKey] = React.useState(0);\n  const [tab, setTab] = React.useState<Tab>(Tab.PREVIEW);\n  const [jsxCode, setJsxCode] = React.useState(() => compileTSXtoJSX(tsxCode));\n  const [width, setWidth] = React.useState<number | null>(null);\n\n  const interactiveExampleRef = React.useRef<HTMLDivElement>(null);\n\n  const resetExample = () => {\n    if (interactiveExampleRef.current) {\n      setWidth(interactiveExampleRef.current.offsetWidth);\n    }\n    setKey(key + 1);\n  };\n\n  React.useEffect(() => {\n    if (interactiveExampleRef.current) {\n      setWidth(interactiveExampleRef.current.offsetWidth);\n    }\n  }, [interactiveExampleRef.current]);\n\n  React.useEffect(() => {\n    if (width !== null) {\n      setKey(key + 1);\n    }\n  }, [width]);\n\n  return (\n    <BrowserOnly fallback={<div>Loading...</div>}>\n      {() => (\n        <div\n          ref={interactiveExampleRef}\n          className={`${styles.container} ${larger && styles.largerContainer}\n          ${tab !== Tab.PREVIEW ? styles.code : ''}`}\n          data-ispreview={tab === Tab.PREVIEW}\n        >\n          <div\n            className={clsx(\n              styles.buttonsContainer,\n              styles.upperButtonsContainer\n            )}\n          >\n            <div className={styles.actionButtonsContainer}>\n              <button\n                className={clsx(\n                  styles.actionButton,\n                  tab === Tab.PREVIEW ? styles.actionButtonActive : ''\n                )}\n                onClick={() => setTab(Tab.PREVIEW)}\n              >\n                Preview\n              </button>\n              <button\n                className={clsx(\n                  styles.actionButton,\n                  tab === Tab.TYPESCRIPT ? styles.actionButtonActive : ''\n                )}\n                onClick={() => setTab(Tab.TYPESCRIPT)}\n              >\n                TS\n              </button>\n              <button\n                className={clsx(\n                  styles.actionButton,\n                  tab === Tab.JAVASCRIPT ? styles.actionButtonActive : ''\n                )}\n                onClick={() => setTab(Tab.JAVASCRIPT)}\n              >\n                JS\n              </button>\n            </div>\n            <AnimableIcon\n              icon={<Copy />}\n              iconDark={<CopyDark />}\n              animation={Animation.FADE_IN_OUT}\n              onClick={(actionPerformed, setActionPerformed) => {\n                if (!actionPerformed) {\n                  copy(tab === Tab.JAVASCRIPT ? jsxCode : tsxCode);\n                  setActionPerformed(true);\n                }\n              }}\n            />\n          </div>\n          <div className={styles.previewContainer}>\n            {tab === Tab.PREVIEW ? (\n              <>\n                <React.Fragment key={key}>\n                  <Component width={width !== null ? width : 0} />\n                </React.Fragment>\n\n                <div\n                  className={clsx(\n                    styles.buttonsContainer,\n                    styles.lowerButtonsContainer\n                  )}\n                >\n                  <div className={styles.iconStub} />\n                  {label && <div>{label}</div>}\n                  <AnimableIcon\n                    icon={<Reset />}\n                    iconDark={<ResetDark />}\n                    animation={Animation.FADE_IN_OUT}\n                    onClick={(actionPerformed, setActionPerformed) => {\n                      if (!actionPerformed) {\n                        resetExample();\n                        setActionPerformed(true);\n                      }\n                    }}\n                  />\n                </div>\n              </>\n            ) : tab === Tab.TYPESCRIPT ? (\n              <div className={styles.interactiveCodeBlock}>\n                <CodeBlock language=\"tsx\">{tsxCode}</CodeBlock>\n              </div>\n            ) : (\n              <div className={styles.interactiveCodeBlock}>\n                <CodeBlock language=\"jsx\">{jsxCode}</CodeBlock>\n              </div>\n            )}\n          </div>\n        </div>\n      )}\n    </BrowserOnly>\n  );\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/InteractiveExample/styles.module.css",
    "content": ".container {\n  display: flex;\n  flex-direction: column;\n\n  contain: content;\n\n  background-color: var(--swm-off-background);\n  border: 1px solid var(--swm-border);\n  margin-bottom: var(--ifm-leading);\n}\n\n.largerContainer {\n  min-height: 400px;\n}\n\n/* Preferred height in code section of container. */\n.container[data-ispreview='false'] {\n  height: 400px;\n}\n\n/* Classes used to omit default docusaurus styling. */\n[class*='codeBlockContainer'] {\n  box-shadow: none;\n}\n\n.interactiveCodeBlock [class*='codeBlockContent'] pre {\n  border: none;\n}\n\n.interactiveCodeBlock [class*='codeBlockContent'] code {\n  background-color: var(--swm-off-background);\n  width: 100%;\n  padding: 0;\n  border: none;\n}\n\n/* Hide default action buttons, displayed by Docusaurus */\n.interactiveCodeBlock [class*='buttonGroup'] {\n  display: none;\n}\n\n.code {\n  flex: 1;\n}\n\n.buttonsContainer {\n  display: flex;\n  justify-content: flex-end;\n  align-items: center;\n\n  padding: 0.25em 0.75em 0.25em 1.25em;\n  margin: 1.5em 2em 1.5em 1.5em;\n}\n\n.upperButtonsContainer {\n  margin-bottom: 10px;\n}\n\n@media (max-width: 996px) {\n  .upperButtonsContainer {\n    justify-content: center;\n\n    margin: 1.5em 0;\n  }\n}\n\n.lowerButtonsContainer {\n  justify-content: space-between;\n  margin-top: 10px;\n}\n\n.iconStub {\n  width: 30px;\n  height: 30px;\n}\n\n.container[data-ispreview='false'] .buttonsContainer {\n  position: absolute;\n  right: 0;\n  top: 0;\n\n  border-radius: 25px;\n  background-color: var(--swm-code-lines-buttons-background);\n\n  z-index: 1;\n}\n\n@media (max-width: 996px) {\n  .container[data-ispreview='false'] .buttonsContainer {\n    position: relative;\n    width: fit-content;\n    margin: 1.5em auto;\n  }\n}\n\n.previewContainer {\n  flex: 1 1 auto;\n}\n\n/* Style preview only when user is in the 'code' section. */\n.container[data-ispreview='false'] .previewContainer {\n  flex: 1 1 auto;\n  overflow-y: auto;\n\n  padding: 0 24px;\n  margin: 16px 8px 8px 0;\n}\n\n@media (max-width: 996px) {\n  .container[data-ispreview='false'] .previewContainer {\n    margin-top: 0;\n  }\n}\n\n.actionButton {\n  margin-right: 0.5em;\n  padding: 0 0 2px 0;\n\n  border: none;\n  background-color: inherit;\n  color: var(--swm-interactive-button-color);\n  cursor: pointer;\n\n  font-family: var(--swm-body-font);\n  font-weight: 500;\n  font-size: 16px;\n}\n\n.actionButton:last-of-type {\n  margin-right: 2em;\n}\n\n.actionButtonActive {\n  color: var(--swm-interactive-button-active);\n  border-bottom: 1px solid var(--swm-interactive-button-active);\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/InteractivePlayground/AudioBufferSourceExample/AudioBufferSourceExample.tsx",
    "content": "import React, { useEffect, useRef, useState, useCallback, FC } from \"react\";\nimport {\n  AudioContext,\n  AudioBufferSourceNode,\n  AudioBuffer,\n  AnalyserNode,\n} from \"react-native-audio-api\";\nimport styles from \"../styles.module.css\";\nimport { WaveformVisualizer } from \"../WaveformVisualizer\";\n\nconst FFT_SIZE = 2048;\n\ninterface AudioBufferSourceExampleProps {\n  playbackRate: number;\n  detune: number;\n  loop: boolean;\n  loopStart: number;\n  loopEnd: number;\n  pitchCorrection: boolean;\n  onBufferLoad: (duration: number) => void;\n  theme: \"light\" | \"dark\";\n}\n\nconst AudioBufferSourceExample: FC<AudioBufferSourceExampleProps> = (props) => {\n  const {\n    playbackRate,\n    detune,\n    loop,\n    loopStart,\n    loopEnd,\n    pitchCorrection,\n    onBufferLoad,\n    theme,\n  } = props;\n\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [audioLoaded, setAudioLoaded] = useState(false);\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n  const audioBufferRef = useRef<AudioBuffer | null>(null);\n  const analyserRef = useRef<AnalyserNode | null>(null);\n\n  const stopSound = useCallback(() => {\n    if (bufferSourceRef.current) {\n      bufferSourceRef.current.onEnded = null; // Prevent onEnded from firing on manual stop\n      bufferSourceRef.current.stop();\n      bufferSourceRef.current = null;\n    }\n    setIsPlaying(false);\n  }, []);\n\n  const playSound = useCallback(async () => {\n    const ctx = audioContextRef.current;\n    if (!ctx || !audioBufferRef.current) {\n      return;\n    }\n\n    if (bufferSourceRef.current) {\n      stopSound();\n    }\n\n    const source = await ctx.createBufferSource({\n      pitchCorrection: pitchCorrection,\n    });\n\n    source.buffer = audioBufferRef.current;\n    source.playbackRate.value = playbackRate;\n    source.detune.value = detune;\n    source.loop = loop;\n    source.loopStart = loopStart;\n    source.loopEnd = loopEnd;\n\n    await ctx.resume();\n    source.connect(analyserRef.current!);\n    source.start();\n    bufferSourceRef.current = source;\n    setIsPlaying(true);\n\n    source.onEnded = () => {\n      if (source === bufferSourceRef.current) {\n        bufferSourceRef.current = null;\n        setIsPlaying(false);\n      }\n    };\n  }, [stopSound, playbackRate,detune,loop,loopStart,loopEnd, pitchCorrection]); \n\n  const handlePlayButtonClick = () => {\n    if (isPlaying) {\n      stopSound();\n    } else {\n      playSound();\n    }\n  };\n\n  useEffect(() => {\n    let mounted = true;\n    const init = async () => {\n      const ctx = new AudioContext();\n      audioContextRef.current = ctx;\n\n      const analyser = ctx.createAnalyser();\n      analyser.fftSize = FFT_SIZE;\n      analyserRef.current = analyser;\n      analyser.connect(ctx.destination);\n\n      try {\n        const response = await fetch(\n          \"/react-native-audio-api/audio/music/example-music-01.mp3\"\n        );\n        const arrayBuffer = await response.arrayBuffer();\n        const decoded = await ctx.decodeAudioData(arrayBuffer);\n        if (!mounted) {\n          return;\n        }\n        audioBufferRef.current = decoded;\n        setAudioLoaded(true);\n        onBufferLoad(decoded.duration);\n      } catch (err) {\n        console.warn(\"Error loading audio buffer:\", err);\n      }\n    };\n\n    init();\n    return () => {\n      mounted = false;\n      audioContextRef.current?.close();\n    };\n  }, [onBufferLoad]);\n\n  useEffect(() => {\n    if (isPlaying) {\n      stopSound();\n      playSound();\n    }\n  }, [pitchCorrection]);\n\n  useEffect(() => {\n    const source = bufferSourceRef.current;\n    const ctx = audioContextRef.current;\n    if (!source || !ctx) {\n      return;\n    }\n\n    const RAMP_TIME = 0.05; \n\n    source.playbackRate.setValueAtTime(\n      playbackRate,\n      ctx.currentTime + RAMP_TIME\n    );\n    source.detune.setValueAtTime(\n      detune,\n      ctx.currentTime + RAMP_TIME\n    );\n \n    source.loop = loop;\n    source.loopStart = loopStart;\n    source.loopEnd = loopEnd;\n  }, [playbackRate, detune, loop, loopStart, loopEnd]);\n\n  return (\n    <div className={styles.playerContainer}>\n      <WaveformVisualizer\n        analyserNode={analyserRef.current}\n        fftSize={FFT_SIZE}\n        theme={theme}\n      />\n\n      <button\n        onClick={handlePlayButtonClick}\n        className={`${styles.playButton} ${isPlaying ? styles.playing : \"\"}`}\n        disabled={!audioLoaded}\n      >\n        {audioLoaded ? (isPlaying ? \"Stop\" : \"Play\") : \"...\"}\n      </button>\n    </div>\n  );\n};\n\nexport default AudioBufferSourceExample;"
  },
  {
    "path": "packages/audiodocs/src/components/InteractivePlayground/AudioBufferSourceExample/useAudioBufferSourcePlayground.tsx",
    "content": "import React, { useState } from \"react\";\nimport AudioBufferSourceExample from \"./AudioBufferSourceExample\";\nimport SliderInput from \"@site/src/ui/SliderInput\";\nimport Switch from \"@site/src/ui/Switch\";\nimport styles from \"../styles.module.css\";\n\nconst initialState = {\n  playbackRate: 1.0,\n  detune: 0,\n  loop: false,\n  loopStart: 0,\n  loopEnd: 5,\n  pitchCorrection: false,\n};\n\nexport function useAudioBufferSourcePlayground() {\n  const [playbackRate, setPlaybackRate] = useState(initialState.playbackRate);\n  const [detune, setDetune] = useState(initialState.detune);\n  const [loop, setLoop] = useState(initialState.loop);\n  const [loopStart, setLoopStart] = useState(initialState.loopStart);\n  const [loopEnd, setLoopEnd] = useState(initialState.loopEnd);\n  const [pitchCorrection, setPitchCorrection] = useState(\n    initialState.pitchCorrection\n  );\n  const [bufferDuration, setBufferDuration] = useState(10);\n\n  const code = `import { AudioContext } from 'react-native-audio-api';\n\nconst ctx = new AudioContext();\nconst source = await ctx.createBufferSource({ pitchCorrection: ${pitchCorrection} });\nsource.buffer = audioBuffer;\nsource.playbackRate.value = ${playbackRate.toFixed(2)};\nsource.detune.value = ${detune.toFixed(0)};\nsource.loop = ${loop};\nsource.loopStart = ${loopStart.toFixed(2)};\nsource.loopEnd = ${loopEnd.toFixed(2)};\nsource.connect(ctx.destination);\nsource.start();`;\n\n  const controls = (\n    <div className={styles.controlsPanel}>\n      <Switch\n        ariaLabel=\"Enable pitch correction\"\n        checked={pitchCorrection}\n        onChange={setPitchCorrection}\n        rightLabel=\"Enable pitch correction\"\n      />\n\n      <SliderInput\n        label=\"Playback Rate\"\n        value={playbackRate}\n        min={0.5}\n        max={2}\n        step={0.01}\n        unit=\"x\"\n        onChange={setPlaybackRate}\n      />\n\n      <SliderInput\n        label=\"Detune\"\n        value={detune}\n        min={-1200}\n        max={1200}\n        step={1}\n        unit=\"cents\"\n        onChange={setDetune}\n      />\n\n      <Switch\n        ariaLabel=\"Toggle loop playback\"\n        checked={loop}\n        onChange={setLoop}\n        rightLabel=\"Loop\"\n      />\n\n      {loop && (\n        <div className={styles.loopRows}>\n          <SliderInput\n            label=\"Loop start\"\n            value={loopStart}\n            min={0}\n            max={bufferDuration}\n            step={0.01}\n            unit=\"s\"\n            onChange={(value) => {\n              const safe = Math.min(value, loopEnd - 0.01);\n              setLoopStart(Math.max(0, safe));\n            }}\n          />\n\n          <SliderInput\n            label=\"Loop stop\"\n            value={loopEnd}\n            min={0.01}\n            max={bufferDuration}\n            step={0.01}\n            unit=\"s\"\n            onChange={(value) => {\n              const safe = Math.max(value, loopStart + 0.01);\n              setLoopEnd(safe);\n            }}\n          />\n        </div>\n      )}\n    </div>\n  );\n\n  return {\n    code,\n    controls,\n    example: AudioBufferSourceExample,\n    title: \"Now Playing: example-music-01.mp3\",\n    props: {\n      playbackRate,\n      detune,\n      loop,\n      loopStart,\n      loopEnd,\n      pitchCorrection,\n      onBufferLoad: setBufferDuration,\n    },\n  };\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/InteractivePlayground/GainAdsrExample/AdsrChart.tsx",
    "content": "import React, { FC, useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n  ATTACK_MAX,\n  DECAY_MAX,\n  HANDLE_RADIUS,\n  HIT_PADDING,\n  MAX_TIME,\n  MIN_TIME,\n  RELEASE_MAX,\n  SUSTAIN_HOLD_TIME,\n  VISUAL_SCALE,\n} from \"./constants\";\n\ninterface AdsrChartProps {\n  attack: number;\n  decay: number;\n  sustain: number;\n  release: number;\n  setAttack: (v: number) => void;\n  setDecay: (v: number) => void;\n  setSustain: (v: number) => void;\n  setRelease: (v: number) => void;\n  theme: \"light\" | \"dark\";\n  playbackProgress: number; // 0 to 1 indicating current playback position\n}\n\ntype DraggingPoint = \"attack\" | \"decay\" | \"sustain\" | \"release\";\n\nconst PADDING = 10;\n\nconst getGeometry = (\n  width: number,\n  height: number,\n  attack: number,\n  decay: number,\n  sustain: number,\n  release: number\n) => {\n  const chartWidth = Math.max(1, width - 2 * PADDING);\n  const chartHeight = Math.max(1, height - 2 * PADDING);\n\n  const timeToX = (time: number) =>\n    PADDING + ((time * VISUAL_SCALE) / MAX_TIME) * chartWidth;\n  const xToTime = (x: number) =>\n    ((x - PADDING) / chartWidth) * (MAX_TIME / VISUAL_SCALE);\n\n  const levelToY = (level: number) => PADDING + (1 - level) * chartHeight;\n  const yToLevel = (y: number) => 1 - (y - PADDING) / chartHeight;\n\n  const totalDuration = attack + decay + SUSTAIN_HOLD_TIME + release;\n  const points = {\n    start: { x: timeToX(0), y: levelToY(0) },\n    attackEnd: { x: timeToX(attack), y: levelToY(1) },\n    decayEnd: { x: timeToX(attack + decay), y: levelToY(sustain) },\n    sustainEnd: {\n      x: timeToX(attack + decay + SUSTAIN_HOLD_TIME),\n      y: levelToY(sustain),\n    },\n    releaseEnd: { x: timeToX(totalDuration), y: levelToY(0) },\n  };\n\n  return { points, totalDuration, timeToX, xToTime, yToLevel };\n};\n\nconst AdsrChart: FC<AdsrChartProps> = (props) => {\n  const {\n    attack,\n    decay,\n    sustain,\n    release,\n    setAttack,\n    setDecay,\n    setSustain,\n    setRelease,\n    theme,\n    playbackProgress,\n  } = props;\n  const canvasRef = useRef<HTMLCanvasElement>(null);\n  const draggingPointRef = useRef<DraggingPoint | null>(null);\n  const [isDragging, setIsDragging] = useState(false);\n\n  const getMousePosition = useCallback((clientX: number, clientY: number) => {\n    const canvas = canvasRef.current;\n    if (!canvas) {\n      return null;\n    }\n    const rect = canvas.getBoundingClientRect();\n    return {\n      x: clientX - rect.left,\n      y: clientY - rect.top,\n      width: rect.width,\n      height: rect.height,\n    };\n  }, []);\n\n  const findDragPoint = useCallback((mouseX: number, mouseY: number, width: number, height: number) => {\n    const { points } = getGeometry(width, height, attack, decay, sustain, release);\n\n    if (Math.hypot(points.attackEnd.x - mouseX, points.attackEnd.y - mouseY) < HANDLE_RADIUS + HIT_PADDING) {\n      return \"attack\" as const;\n    }\n    if (Math.hypot(points.sustainEnd.x - mouseX, points.sustainEnd.y - mouseY) < HANDLE_RADIUS + HIT_PADDING) {\n      return \"sustain\" as const;\n    }\n    if (Math.hypot(points.decayEnd.x - mouseX, points.decayEnd.y - mouseY) < HANDLE_RADIUS + HIT_PADDING) {\n      return \"decay\" as const;\n    }\n    if (Math.hypot(points.releaseEnd.x - mouseX, points.releaseEnd.y - mouseY) < HANDLE_RADIUS + HIT_PADDING) {\n      return \"release\" as const;\n    }\n\n    return null;\n  }, [attack, decay, sustain, release]);\n\n  const updateByPointer = useCallback((point: DraggingPoint, mouseX: number, mouseY: number, width: number, height: number) => {\n    const { xToTime, yToLevel } = getGeometry(width, height, attack, decay, sustain, release);\n\n    const currentTime = xToTime(mouseX); // real seconds\n    const currentLevel = yToLevel(mouseY);\n\n    if (point === \"attack\") {\n      const clamped = Math.max(MIN_TIME, Math.min(currentTime, ATTACK_MAX));\n      setAttack(clamped);\n      return;\n    }\n\n    if (point === \"decay\") {\n      const rawDecay = currentTime - attack;\n      const clamped = Math.max(MIN_TIME, Math.min(rawDecay, DECAY_MAX));\n      setDecay(clamped);\n      return;\n    }\n\n    if (point === \"sustain\") {\n      setSustain(Math.max(0, Math.min(1, currentLevel)));\n      return;\n    }\n\n    const rawRelease = currentTime - (attack + decay + SUSTAIN_HOLD_TIME);\n    const clamped = Math.max(MIN_TIME, Math.min(rawRelease, RELEASE_MAX));\n    setRelease(clamped);\n  }, [attack, decay, sustain, release, setAttack, setDecay, setSustain, setRelease]);\n\n  const handlePointerDown = useCallback((e: React.PointerEvent<HTMLCanvasElement>) => {\n    const position = getMousePosition(e.clientX, e.clientY);\n    if (!position) {\n      return;\n    }\n\n    const nextDraggingPoint = findDragPoint(position.x, position.y, position.width, position.height);\n    if (!nextDraggingPoint) {\n      return;\n    }\n\n    draggingPointRef.current = nextDraggingPoint;\n    setIsDragging(true);\n    e.currentTarget.setPointerCapture(e.pointerId);\n    updateByPointer(nextDraggingPoint, position.x, position.y, position.width, position.height);\n  }, [findDragPoint, getMousePosition, updateByPointer]);\n\n  const handlePointerMove = useCallback((e: React.PointerEvent<HTMLCanvasElement>) => {\n    const draggingPoint = draggingPointRef.current;\n    if (!draggingPoint) {\n      return;\n    }\n\n    const position = getMousePosition(e.clientX, e.clientY);\n    if (!position) {\n      return;\n    }\n\n    updateByPointer(draggingPoint, position.x, position.y, position.width, position.height);\n  }, [getMousePosition, updateByPointer]);\n\n  const stopDragging = useCallback((e: React.PointerEvent<HTMLCanvasElement>) => {\n    if (!draggingPointRef.current) {\n      return;\n    }\n    draggingPointRef.current = null;\n    setIsDragging(false);\n    if (e.currentTarget.hasPointerCapture(e.pointerId)) {\n      e.currentTarget.releasePointerCapture(e.pointerId);\n    }\n  }, []);\n\n  useEffect(() => {\n    const canvas = canvasRef.current;\n    if (!canvas) return;\n    const ctx = canvas.getContext(\"2d\");\n    if (!ctx) return;\n\n    const rect = canvas.getBoundingClientRect();\n    const dpr = window.devicePixelRatio || 1;\n    canvas.width = rect.width * dpr;\n    canvas.height = rect.height * dpr;\n    ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n    const { width, height } = rect;\n\n    const { points, totalDuration, timeToX } = getGeometry(\n      width,\n      height,\n      attack,\n      decay,\n      sustain,\n      release\n    );\n\n    ctx.clearRect(0, 0, width, height);\n\n    ctx.fillStyle =\n      theme === \"dark\" ? \"rgba(255, 119, 116, 0.4)\" : \"rgba(255, 119, 116, 0.6)\";\n    ctx.beginPath();\n    ctx.moveTo(points.start.x, points.start.y);\n    ctx.lineTo(points.attackEnd.x, points.attackEnd.y);\n    ctx.lineTo(points.decayEnd.x, points.decayEnd.y);\n    ctx.lineTo(points.sustainEnd.x, points.sustainEnd.y);\n    ctx.lineTo(points.releaseEnd.x, points.releaseEnd.y);\n    ctx.closePath();\n    ctx.fill();\n\n    ctx.save();\n\n    ctx.beginPath();\n    ctx.moveTo(points.start.x, points.start.y);\n    ctx.lineTo(points.attackEnd.x, points.attackEnd.y);\n    ctx.lineTo(points.decayEnd.x, points.decayEnd.y);\n    ctx.lineTo(points.sustainEnd.x, points.sustainEnd.y);\n    ctx.lineTo(points.releaseEnd.x, points.releaseEnd.y);\n    ctx.closePath();\n    ctx.clip();\n\n    const progressX = timeToX(totalDuration * playbackProgress);\n\n    ctx.fillStyle =\n      theme === \"dark\" ? \"rgba(255, 119, 116, 0.4)\" : \"rgba(255, 119, 116, 0.6)\";\n\n    ctx.fillRect(0, 0, progressX, height);\n\n    ctx.restore();\n\n    const handleFill =\n      theme === \"dark\" ? \"var(--swm-off-white)\" : \"var(--swm-off-white)\";\n    ctx.lineWidth = 1.5;\n\n    [\n      points.attackEnd,\n      points.decayEnd,\n      points.releaseEnd,\n      points.sustainEnd,\n    ].forEach((p) => {\n      ctx.beginPath();\n      ctx.arc(p.x, p.y, HANDLE_RADIUS, 0, 2 * Math.PI);\n      ctx.fillStyle = handleFill;\n      ctx.fill();\n    });\n  }, [attack, decay, sustain, release, theme, playbackProgress]);\n\n  return (\n    <canvas\n      ref={canvasRef}\n      onPointerDown={handlePointerDown}\n      onPointerMove={handlePointerMove}\n      onPointerUp={stopDragging}\n      onPointerCancel={stopDragging}\n      onLostPointerCapture={stopDragging}\n      style={{\n        width: \"100%\",\n        height: \"100%\",\n        cursor: isDragging ? \"grabbing\" : \"grab\",\n        touchAction: \"none\",\n      }}\n    />\n  );\n};\n\nexport default AdsrChart;\n"
  },
  {
    "path": "packages/audiodocs/src/components/InteractivePlayground/GainAdsrExample/GainAdsrExample.tsx",
    "content": "import React, { useEffect, useState, useRef, FC } from \"react\";\nimport { AudioContext, OscillatorNode, GainNode } from \"react-native-audio-api\";\nimport styles from \"../styles.module.css\";\nimport AdsrChart from \"./AdsrChart\";\n\ninterface GainAdsrExampleProps {\n  attack: number;\n  decay: number;\n  sustain: number;\n  release: number;\n  setAttack: (v: number) => void;\n  setDecay: (v: number) => void;\n  setSustain: (v: number) => void;\n  setRelease: (v: number) => void;\n  theme: \"light\" | \"dark\";\n}\n\nconst GainAdsrExample: FC<GainAdsrExampleProps> = (props) => {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const animationFrameRef = useRef<number | null>(null);\n  const oscRef = useRef<OscillatorNode | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n\n  const [playbackProgress, setPlaybackProgress] = useState(0);\n\n  useEffect(() => {\n    const ctx = new AudioContext();\n    audioContextRef.current = ctx;\n\n    return () => {\n      if (oscRef.current) {\n        oscRef.current.stop();\n      }\n      if (animationFrameRef.current) {\n        cancelAnimationFrame(animationFrameRef.current);\n      }\n      audioContextRef.current?.close().catch(() => {});\n      audioContextRef.current = null;\n    };\n  }, []);\n\n  const playSound = async () => {\n    const ctx = audioContextRef.current;\n    if (!ctx) return;\n\n    if (oscRef.current) {\n      oscRef.current.stop(0);\n      oscRef.current = null;\n    }\n    if (gainRef.current) {\n        gainRef.current.disconnect();\n        gainRef.current = null;\n    }\n    if (animationFrameRef.current) {\n      cancelAnimationFrame(animationFrameRef.current);\n    }\n    setPlaybackProgress(0);\n\n    const osc = await ctx.createOscillator();\n    const gain = await ctx.createGain();\n\n    oscRef.current = osc;\n    gainRef.current = gain;\n\n    osc.connect(gain);\n    gain.connect(ctx.destination);\n\n    const now = ctx.currentTime;\n    const { attack, decay, sustain, release } = props;\n    const sustainHoldTime = 0.6; \n    const totalDuration = attack + decay + sustainHoldTime + release + 0.02;\n\n    gain.gain.setValueAtTime(0.00001, now);\n\n    const peakTime = now + Math.max(0.01, attack);\n    gain.gain.exponentialRampToValueAtTime(1, peakTime);\n\n    const sustainStartTime = peakTime + Math.max(0.01, decay);\n    gain.gain.exponentialRampToValueAtTime(\n      Math.max(0.00001, sustain),\n      sustainStartTime\n    );\n\n    const releaseStartTime = sustainStartTime + sustainHoldTime;\n    const endTime = releaseStartTime + Math.max(0.01, release);\n\n    gain.gain.setValueAtTime(Math.max(0.00001, sustain), releaseStartTime);\n    gain.gain.linearRampToValueAtTime(0.00001, endTime);\n\n    osc.start(now);\n    osc.stop(endTime + 0.02);\n\n    const animate = () => {\n      const elapsedTime = ctx.currentTime - now;\n      const progress = Math.min(1, elapsedTime / totalDuration);\n\n      setPlaybackProgress(progress);\n\n      if (progress < 1) {\n        animationFrameRef.current = requestAnimationFrame(animate);\n      } else {\n        setPlaybackProgress(0);\n      }\n    };\n\n    animationFrameRef.current = requestAnimationFrame(animate);\n  };\n\n  return (\n    <div className={styles.adsrContainer}>\n      <AdsrChart {...props} playbackProgress={playbackProgress} />\n      <button onClick={playSound} className={styles.playButton}>\n        Play\n      </button>\n    </div>\n  );\n};\n\nexport default GainAdsrExample;\n"
  },
  {
    "path": "packages/audiodocs/src/components/InteractivePlayground/GainAdsrExample/constants.ts",
    "content": "export const HANDLE_RADIUS = 4;\nexport const HIT_PADDING = 8;\nexport const MIN_TIME = 0.01;\nexport const SUSTAIN_HOLD_TIME = 0.6;\nexport const MAX_TIME = 4.0;\nexport const VISUAL_SCALE = 0.5;\nexport const ATTACK_MAX = 2;\nexport const DECAY_MAX = 2;\nexport const RELEASE_MAX = 3;"
  },
  {
    "path": "packages/audiodocs/src/components/InteractivePlayground/GainAdsrExample/useGainAdsrPlayground.tsx",
    "content": "import SliderInput from \"@site/src/ui/SliderInput\";\nimport React, { useState } from \"react\";\nimport styles from \"../styles.module.css\";\nimport GainAdsrExample from \"./GainAdsrExample\";\n\nconst initialState = {\n  attack: 1,\n  decay: 1,\n  sustain: 0.5,\n  release: 2,\n};\n\nexport function useGainAdsrPlayground() {\n  const [attack, setAttack] = useState(initialState.attack);\n  const [decay, setDecay] = useState(initialState.decay);\n  const [sustain, setSustain] = useState(initialState.sustain);\n  const [release, setRelease] = useState(initialState.release);\n\n  const code = `const now = ctx.currentTime;\nenvelope.gain.setValueAtTime(0.001, now);\n\nenvelope.gain.exponentialRampToValueAtTime(1, now + ${attack.toFixed(2)});\n\nenvelope.gain.exponentialRampToValueAtTime(${(sustain + 0.00001).toFixed(\n    5\n  )}, now + ${(attack + decay).toFixed(2)});\n\nenvelope.gain.setValueAtTime(${sustain.toFixed(2)}, now + ${(\n    attack + decay\n  ).toFixed(2)});\nenvelope.gain.linearRampToValueAtTime(0, now + ${(attack + decay + release).toFixed(\n    2\n  )});`;\n\n  const controls = (\n    <div className={styles.controlsPanel}>\n      <SliderInput\n        label=\"Attack\"\n        value={attack}\n        min={0.01}\n        max={2}\n        step={0.01}\n        unit=\"s\"\n        onChange={setAttack}\n      />\n\n      <SliderInput\n        label=\"Decay\"\n        value={decay}\n        min={0.01}\n        max={2}\n        step={0.01}\n        unit=\"s\"\n        onChange={setDecay}\n      />\n\n      <SliderInput\n        label=\"Sustain\"\n        value={sustain}\n        min={0}\n        max={1}\n        step={0.01}\n        onChange={setSustain}\n      />\n\n      <SliderInput\n        label=\"Release\"\n        value={release}\n        min={0.01}\n        max={3}\n        step={0.01}\n        unit=\"s\"\n        onChange={setRelease}\n      />\n    </div>\n  );\n\n  return {\n    code,\n    controls,\n    example: GainAdsrExample,\n    title: \"ADSR Envelope Example\",\n    props: {\n      attack,\n      decay,\n      sustain,\n      release,\n      setAttack,\n      setDecay,\n      setSustain,\n      setRelease,\n    },\n  };\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/InteractivePlayground/OscillatorExample/OscillatorExample.tsx",
    "content": "import React, { FC, useCallback, useEffect, useRef, useState } from \"react\";\nimport {\n  AnalyserNode,\n  AudioContext,\n  GainNode,\n  OscillatorNode,\n  OscillatorType,\n} from \"react-native-audio-api\";\nimport styles from \"../styles.module.css\";\nimport { WaveformVisualizer } from \"../WaveformVisualizer\";\n\nconst FFT_SIZE = 2048;\n\ninterface OscillatorExampleProps {\n  type: OscillatorType;\n  frequency: number;\n  detune: number;\n  volume: number;\n  theme: \"light\" | \"dark\";\n}\n\nconst OscillatorExample: FC<OscillatorExampleProps> = ({\n  type,\n  frequency,\n  detune,\n  volume,\n  theme,\n}) => {\n  const [isPlaying, setIsPlaying] = useState(false);\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const oscillatorRef = useRef<OscillatorNode | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n  const analyserRef = useRef<AnalyserNode | null>(null);\n\n  const stopSound = useCallback(() => {\n    if (oscillatorRef.current) {\n      oscillatorRef.current.stop();\n      oscillatorRef.current = null;\n    }\n    setIsPlaying(false);\n  }, []);\n\n  const playSound = useCallback(async () => {\n    if (isPlaying) {\n      stopSound();\n      return;\n    }\n\n    const ctx = audioContextRef.current;\n    if (!ctx) return;\n\n    const osc = await ctx.createOscillator();\n\n    osc.type = type;\n\n    osc.frequency.value = frequency;\n    osc.detune.value = detune;\n\n    const safeVolume =\n      type === \"square\" || type === \"sawtooth\" ? volume * 0.3 : volume;\n    if (gainRef.current) gainRef.current.gain.value = safeVolume;\n\n    osc.connect(gainRef.current!);\n\n    osc.start();\n\n    osc.onEnded = () => {\n      if (osc === oscillatorRef.current) {\n        setIsPlaying(false);\n      }\n    };\n\n    oscillatorRef.current = osc;\n    setIsPlaying(true);\n  }, [type, frequency, detune, volume, isPlaying, stopSound]);\n\n  useEffect(() => {\n    const ctx = new AudioContext();\n    audioContextRef.current = ctx;\n\n    const g = ctx.createGain();\n    gainRef.current = g;\n\n    const analyser = ctx.createAnalyser();\n    analyser.fftSize = FFT_SIZE;\n    analyserRef.current = analyser;\n\n    g.connect(analyser);\n    analyser.connect(ctx.destination);\n\n    return () => {\n      ctx.close();\n    };\n  }, []);\n\n  useEffect(() => {\n    const osc = oscillatorRef.current;\n    const g = gainRef.current;\n    if (osc && g) {\n      osc.frequency.value = frequency;\n      osc.detune.value = detune;\n      osc.type = type;\n      const safeVolume =\n        type === \"square\" || type === \"sawtooth\" ? volume * 0.3 : volume;\n      g.gain.value = safeVolume;\n\n      if (osc.type !== type) {\n        if (isPlaying) {\n          stopSound();\n          playSound();\n        }\n      }\n    }\n  }, [frequency, detune, volume, type, isPlaying, playSound, stopSound]);\n\n  return (\n    <div className={styles.oscillatorContainer}>\n      <WaveformVisualizer analyserNode={analyserRef.current} fftSize={FFT_SIZE} theme={theme} />\n\n      <button\n        onClick={() => (isPlaying ? stopSound() : playSound())}\n        className={`${styles.playButton} ${isPlaying ? styles.playing : \"\"}`}\n      >\n        {isPlaying ? \"Stop\" : \"Play\"}\n      </button>\n    </div>\n  );\n};\n\nexport default OscillatorExample;\n"
  },
  {
    "path": "packages/audiodocs/src/components/InteractivePlayground/OscillatorExample/useOscilatorPlayground.tsx",
    "content": "import FilterList from \"@site/src/ui/FilterList\";\nimport SliderInput from \"@site/src/ui/SliderInput\";\nimport React, { useState } from \"react\";\nimport { OscillatorType } from \"react-native-audio-api\";\n\nimport styles from \"../styles.module.css\";\nimport OscillatorExample from \"./OscillatorExample\";\n\nconst initialState = {\n  type: \"sine\" as OscillatorType,\n  frequency: 440,\n  detune: 0,\n  volume: 0.5,\n};\n\nconst oscillatorTypes: OscillatorType[] = [\n  \"sine\",\n  \"square\",\n  \"sawtooth\",\n  \"triangle\",\n];\n\nconst oscillatorTypeOptions = oscillatorTypes.map((oscType) => ({\n  value: oscType,\n  label: oscType.charAt(0).toUpperCase() + oscType.slice(1),\n}));\n\nexport function useOscillatorPlayground() {\n  const [type, setType] = useState<OscillatorType>(initialState.type);\n  const [frequency, setFrequency] = useState(initialState.frequency);\n  const [detune, setDetune] = useState(initialState.detune);\n  const [volume, setVolume] = useState(initialState.volume);\n\n  const code = `const ctx = new AudioContext();\nconst oscillator = ctx.createOscillator();\nconst gain = ctx.createGain();\n\noscillator.type = '${type}';\n\noscillator.frequency.value = ${frequency};\noscillator.detune.value = ${detune};\ngain.gain.value = ${volume.toFixed(2)};\n\noscillator.connect(gain);\ngain.connect(ctx.destination);\noscillator.start();`;\n\n  const controls = (\n    <div className={styles.controlsPanel}>\n      <FilterList<OscillatorType>\n        ariaLabel=\"Oscillator type\"\n        options={oscillatorTypeOptions}\n        value={type}\n        onChange={setType}\n      />\n\n      <SliderInput\n        label=\"Frequency\"\n        value={frequency}\n        min={2}\n        max={600}\n        step={1}\n        unit=\"Hz\"\n        onChange={setFrequency}\n      />\n\n      <SliderInput\n        label=\"Detune\"\n        value={detune}\n        min={-1200}\n        max={1200}\n        step={1}\n        unit=\"cents\"\n        onChange={setDetune}\n      />\n\n      <SliderInput\n        label=\"Volume\"\n        value={volume}\n        min={0}\n        max={1}\n        step={0.01}\n        onChange={setVolume}\n      />\n    </div>\n  );\n\n  return {\n    code,\n    controls,\n    example: OscillatorExample,\n    title: \"Oscillator Node\",\n    props: {\n      type,\n      frequency,\n      detune,\n      volume,\n    },\n  };\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/InteractivePlayground/WaveformVisualizer.tsx",
    "content": "import React, { FC, useCallback, useEffect, useRef } from \"react\";\n\nimport ResponsiveCanvas, {\n  ResponsiveCanvasDrawParams,\n} from \"@site/src/ui/ResponsiveCanvas\";\nimport { AnalyserNode } from \"react-native-audio-api\";\n\nexport const WaveformVisualizer: FC<{\n  analyserNode: AnalyserNode | null;\n  fftSize: number;\n  theme: string;\n}> = ({ analyserNode, fftSize, theme }) => {\n  const canvasRef = useRef<HTMLCanvasElement | null>(null);\n  const animationFrameRef = useRef<number | null>(null);\n\n  const drawWaveform = useCallback(\n    (canvas: HTMLCanvasElement) => {\n      const context = canvas.getContext(\"2d\");\n      if (!context) {\n        return;\n      }\n\n      const cssWidth = canvas.clientWidth || 300;\n      const cssHeight = canvas.clientHeight || 150;\n      const dpr =\n        cssWidth > 0 && canvas.width > 0\n          ? canvas.width / cssWidth\n          : window.devicePixelRatio || 1;\n\n      context.setTransform(dpr, 0, 0, dpr, 0, 0);\n      context.clearRect(0, 0, cssWidth, cssHeight);\n\n      context.lineWidth = 2;\n      context.strokeStyle = theme === \"dark\" ? \"#ff7774\" : \"#fa7f7c\";\n      context.beginPath();\n\n      const data = new Uint8Array(fftSize);\n\n      if (analyserNode) {\n        analyserNode.getByteTimeDomainData(data);\n      } else {\n        data.fill(128); // Default to a flat line if no analyser node is available\n      }\n\n      const sliceWidth = cssWidth / (data.length - 1);\n\n      let x = 0;\n\n      for (let i = 0; i < data.length; i += 1) {\n        const v = data[i] / 128.0;\n        const y = (v * cssHeight) / 2;\n\n        if (i === 0) {\n          context.moveTo(x, y);\n        } else {\n          context.lineTo(x, y);\n        }\n        x += sliceWidth;\n      }\n\n      context.stroke();\n    },\n    [analyserNode, fftSize, theme]\n  );\n\n  const handleCanvasDraw = useCallback(\n    ({ canvas }: ResponsiveCanvasDrawParams) => {\n      drawWaveform(canvas);\n    },\n    [drawWaveform]\n  );\n\n  useEffect(() => {\n    const frame = () => {\n      const canvas = canvasRef.current;\n      if (canvas) {\n        drawWaveform(canvas);\n      }\n      animationFrameRef.current = requestAnimationFrame(frame);\n    };\n\n    animationFrameRef.current = requestAnimationFrame(frame);\n\n    return () => {\n      if (animationFrameRef.current) {\n        cancelAnimationFrame(animationFrameRef.current);\n      }\n    };\n  }, [drawWaveform]);\n\n  return (\n    <ResponsiveCanvas\n      onDraw={handleCanvasDraw}\n      canvasRef={canvasRef}\n      throttleMs={16}\n    />\n  );\n};\n"
  },
  {
    "path": "packages/audiodocs/src/components/InteractivePlayground/index.tsx",
    "content": "import BrowserOnly from '@docusaurus/BrowserOnly';\nimport { useColorMode } from \"@docusaurus/theme-common\";\nimport React, { FC, ReactNode, useState } from \"react\";\n//@ts-ignore\nimport CodeBlock from \"@theme/CodeBlock\";\n\nimport AnimableIcon, { Animation } from \"@site/src/components/AnimableIcon\";\nimport DetailBox from \"@site/src/ui/DetailBox\";\nimport ResetDark from \"@site/static/img/reset-dark.svg\";\nimport Reset from \"@site/static/img/reset.svg\";\n\nimport styles from \"./styles.module.css\";\n\ninterface PlaygroundHookResult {\n  example: FC<any>;\n  props: Record<string, any>;\n  code: string;\n  controls: ReactNode;\n  upload?: ReactNode;\n}\n\ninterface InteractivePlaygroundProps {\n  usePlayground: () => PlaygroundHookResult;\n  tag: string;\n}\n\nconst PlaygroundContent: FC<{ usePlayground: () => PlaygroundHookResult }> = ({\n  usePlayground,\n}) => {\n  const { colorMode } = useColorMode();\n  const {\n    example: Example,\n    props: exampleProps,\n    code,\n    controls,\n    upload,\n  } = usePlayground();\n\n  return (\n    <>\n      <div className={styles.topRow}>\n        <div className={styles.previewBox}>\n          <Example {...exampleProps} theme={colorMode} />\n        </div>\n        <div className={styles.controlsBox}>\n          {controls}\n        </div>\n      </div>\n\n      {upload && <div className={styles.uploadBox}>{upload}</div>}\n\n      <div className={styles.bottomRow}>\n        <div className={styles.codeContainer}>\n          <CodeBlock language=\"tsx\" className={styles.codeBlock}>\n            {code}\n          </CodeBlock>\n        </div>\n      </div>\n    </>\n  );\n};\n\nconst InteractivePlayground: FC<InteractivePlaygroundProps> = ({\n  usePlayground,\n  tag,\n}) => {\n  const [key, setKey] = useState(0);\n\n  const resetPlayground = () => {\n    setKey((k) => k + 1);\n  };\n\n  return (\n    <BrowserOnly fallback={<div>Loading...</div>}>\n      {() => (\n        <DetailBox tag={tag} info=\"interactive playground\" startOpen>\n          <div className={styles.resetButtonContainer}>\n            <AnimableIcon\n              icon={<Reset />}\n              iconDark={<ResetDark />}\n              animation={Animation.FADE_IN_OUT}\n              onClick={(done, setDone) => {\n                if (!done) {\n                  resetPlayground();\n                  setDone(true);\n                }\n              }}\n            />\n          </div>\n\n          <PlaygroundContent key={key} usePlayground={usePlayground} />\n        </DetailBox>\n      )}\n    </BrowserOnly>\n  );\n};\n\nexport default InteractivePlayground;\n"
  },
  {
    "path": "packages/audiodocs/src/components/InteractivePlayground/styles.module.css",
    "content": ".topRow {\n  display: flex;\n  flex-direction: row;\n  flex: 1;\n  padding: 16px;\n}\n\n.previewBox {\n  flex: 1;\n  display: flex;\n  align-items: flex-end;\n  justify-content: center;\n  color: var(--swm-sidebar-menu-color);\n  position: relative;\n}\n\n.controlsBox {\n  flex: 1;\n  flex-shrink: 0;\n}\n\n.controlsPanel {\n  padding-right: 16px;\n}\n\n.codeContainer {\n  overflow: scroll;\n  flex: 0 0 auto;\n  background: var(--swm-background);\n  border: 1px solid var(--swm-border);\n  max-width: 90%;\n  width: auto;\n}\n\n.codeContainer pre {\n  border-color: var(--swm-border);\n  border: none;\n  background-color: inherit;\n}\n\n.codeContainer pre code {\n  background: inherit;\n}\n\n.loopRows {\n  margin-top: 8px;\n  padding-left: 1rem;\n  border-left: 2px solid var(--swm-border);\n  transition: border-color 0.2s;\n}\n\n.trackTitle {\n  margin: 16px 0;\n  font-weight: 600;\n  color: var(--ifm-heading-color);\n  transition: color 0.2s;\n}\n\n.selectLabel,\n.rangeLabel,\n.switchLabel {\n  display: block;\n  margin-bottom: 8px;\n  color: var(--ifm-font-color-base);\n  transition: color 0.2s;\n}\n\n.switchLabel {\n  margin-left: 8px;\n  user-select: none;\n}\n\n.uploadBox .uploadText {\n  color: var(--swm-sidebar-menu-color);\n  margin: 0;\n  transition: color 0.2s;\n}\n\n.select {\n  width: 100%;\n  padding: 8px;\n  border: 1px solid var(--swm-border);\n  background-color: var(--ifm-background-color);\n  color: var(--ifm-font-color-base);\n}\n\n.switchRow {\n  display: flex;\n  align-items: center;\n  margin: 24px 0;\n  cursor: pointer;\n}\n\n.checkbox {\n  width: 1.25em;\n  height: 1.25em;\n  accent-color: var(--swm-purple-light-100);\n}\n\n.selectRow,\n.rangeRow {\n  margin: 24px 0;\n}\n\n.playerContainer,\n.oscillatorContainer {\n  width: 100%;\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  justify-content: center;\n  position: relative;\n  padding: 12px;\n}\n\n.playButton {\n  position: absolute;\n  top: 10px;\n  right: 16px;\n  z-index: 10;\n  width: 80px;\n  height: 40px;\n  background-color: var(--swm-red-light-80);\n  color: var(--swm-white);\n  font-weight: 600;\n  border: none;\n  cursor: pointer;\n  transition: background-color 0.2s;\n}\n\n.playButton.playing {\n  background-color: var(--swm-red-light-80);\n}\n\n.playButton:disabled {\n  background-color: var(--swm-red-light-40);\n  cursor: not-allowed;\n}\n\n.buttonsContainer,\n.resetButtonContainer {\n  position: absolute;\n  top: 0.75rem;\n  right: 0.75rem;\n  z-index: 10;\n}\n\n.interactiveCodeBlock {\n  position: relative;\n  padding-top: 12px;\n}\n\n.codeBlock {\n  box-shadow: none !important;\n  margin-bottom: 0 !important;\n  font-family: system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto,\n    Oxygen, Ubuntu, Cantarell, \"Open Sans\", \"Helvetica Neue\", sans-serif;\n}\n\n.langPill {\n  position: absolute;\n  left: 12px;\n  top: 12px;\n  background-color: var(--swm-navy-light-10);\n  padding: 4px 8px;\n  z-index: 2;\n}\n\n.langPillText {\n  color: var(--swm-navy-light-80);\n  font-size: 12px;\n  font-weight: 600;\n}\n\n.bottomRow {\n  flex: 1;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  padding: 24px;\n}\n\n\n@media screen and (max-width: 500px) {\n  .topRow {\n    flex-direction: column;\n  }\n\n  .bottomRow {\n    padding: 0;\n    margin: -1px;\n  }\n\n  .codeContainer {\n    max-width: 100%;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/RadonBanner/index.tsx",
    "content": "import React, { useRef } from 'react';\nimport BrowserOnly from '@docusaurus/BrowserOnly';\nimport styles from './styles.module.css';\n\nimport ArrowRight from '@site/static/img/arrow-right.svg';\n\nconst items = [\n  {\n    text: 'An all-in-one IDE for Expo & React Native.',\n    button: 'Try Radon IDE for free',\n  },\n  {\n    text: 'Streamline your React Native & Expo development.',\n    button: 'Install Radon IDE',\n  },\n  {\n    text: 'Set breakpoints and debug React Native apps with ease.',\n    button: 'Try Radon IDE for free',\n  },\n  {\n    text: 'Catch runtime errors right in your editor.',\n    button: 'Install Radon IDE',\n  },\n  {\n    text: 'Preview React Native components in isolation.',\n    button: 'Try Radon IDE',\n  },\n  {\n    text: 'Run, preview, and debug your React Native & Expo apps without leaving VSCode.',\n    button: 'Try Radon IDE for free',\n  },\n  {\n    text: 'Run, preview, and debug apps faster.',\n    button: 'Try our IDE for React Native',\n  },\n  {\n    text: 'Reduce context switching & debug faster.',\n    button: 'Try Radon IDE for free',\n  },\n  {\n    text: 'Reduce context switching & preview components instantly.',\n    button: 'Try Radon IDE for free',\n  },\n  {\n    text: 'Reduce context switching & streamline React Native and Expo development.',\n    button: 'Install Radon IDE',\n  },\n];\n\nfunction RadonBannerInner(): JSX.Element {\n  const item = useRef(items[Math.floor(Math.random() * items.length)]);\n\n  return (\n    <a\n      href=\"https://ide.swmansion.com/?utm_source=gesture-handler\"\n      className={styles.container}>\n      <div className={styles.content}>\n        <p className={styles.text}>{item.current.text}</p>\n        <span className={styles.button}>\n          {item.current.button} <ArrowRight />\n        </span>\n      </div>\n      <span className={styles.ellipseLeft} />\n      <span className={styles.ellipseRight} />\n    </a>\n  );\n}\n\nexport default function RadonBanner() {\n  return <BrowserOnly>{() => <RadonBannerInner />}</BrowserOnly>;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/RadonBanner/styles.module.css",
    "content": ".container {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 14px;\n  background-color: var(--swm-green-light-60);\n  border-radius: 4px;\n  position: relative;\n  overflow: hidden;\n  text-decoration: none !important;\n}\n\n.container:hover .button svg {\n  transform: translate(5px);\n}\n\n.container:hover .button {\n  border: 1px solid var(--swm-green-light-100);\n}\n\n.text {\n  font-size: 15px;\n  color: var(--swm-navy-light-100);\n  font-weight: 500;\n  z-index: 1;\n  position: relative;\n  margin-bottom: 8px;\n  text-wrap: balance;\n  text-align: center;\n}\n\n.button {\n  position: relative;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 5px 10px;\n  color: var(--swm-navy-light-100);\n  background-color: var(--swm-white);\n  transition: border 0.3s;\n  border: 1px solid var(--swm-navy-light-100);\n  font-size: 14px;\n  font-weight: 500;\n  cursor: pointer;\n  z-index: 1;\n  gap: 4px;\n}\n\n.button svg {\n  transition: transform 0.3s;\n}\n\n.ellipseLeft {\n  position: absolute;\n  width: 100px;\n  height: 100px;\n  top: -20px;\n  left: -30px;\n  border-radius: 50%;\n  transform: rotate(-30deg);\n  background: linear-gradient(\n    184.24deg,\n    var(--swm-green-light-80) 3.45%,\n    var(--swm-green-light-40) 66.97%,\n    rgba(255, 255, 255, 0) 124.45%\n  );\n}\n\n.ellipseRight {\n  position: absolute;\n  width: 150px;\n  height: 150px;\n  bottom: -45px;\n  right: -70px;\n  border-radius: 50%;\n  transform: rotate(-120deg);\n  background: linear-gradient(\n    184.24deg,\n    var(--swm-green-light-80) 3.45%,\n    var(--swm-green-light-40) 66.97%,\n    rgba(255, 255, 255, 0) 124.45%\n  );\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/TopPromoRotator/index.tsx",
    "content": "import clsx from 'clsx';\nimport { type ReactNode, useEffect, useMemo, useState } from 'react';\n\nimport HandIcon from '../HandIcon';\nimport styles from './styles.module.css';\n\ndeclare global {\n  interface Window {\n    dataLayer?: unknown[];\n  }\n}\n\ntype Promo = {\n  key: string;\n  href: string;\n  bg: string;\n  buttonLabel: string;\n  label: ReactNode;\n};\n\nconst PROMOS: readonly Promo[] = [\n  {\n    key: 'appjs',\n    href: 'https://appjs.co?origin=swmansion_bar',\n    bg: '#C7CEF5',\n    buttonLabel: 'Get your tickets',\n    label: (\n      <>\n        <strong>App.js Conf 2026</strong>\n        <span className={styles.hiddenOnMobile}>\n          {' '}\n          is just around the corner!\n        </span>\n      </>\n    ),\n  },\n];\n\n// bump when adding promos so users who dismissed banner see the new one\nexport const PROMO_VERSION = 1;\n\ntype Props = {\n  onClose?: () => void;\n};\n\nexport default function TopPromoRotator({ onClose }: Props) {\n  const promos = useMemo(() => PROMOS, []);\n\n  const [index, setIndex] = useState(0);\n\n  useEffect(() => {\n    if (typeof window === 'undefined' || typeof document === 'undefined') {\n      return;\n    }\n\n    const existingScript = document.querySelector<HTMLScriptElement>(\n      'script[src*=\"www.googletagmanager.com/gtm.js?id=GTM-WV2G3SQL\"]'\n    );\n\n    if (existingScript) {\n      return;\n    }\n\n    (function (w: Window, d: Document, s: string, l: string, i: string) {\n      w.dataLayer = w.dataLayer || [];\n      // prettier-ignore\n      w.dataLayer.push({\n        'gtm.start': new Date().getTime(),\n        'event': 'gtm.js',\n      });\n      const f = d.getElementsByTagName(s)[0] as HTMLScriptElement;\n      const j = d.createElement(s) as HTMLScriptElement;\n      const dl = l !== 'dataLayer' ? `&l=${l}` : '';\n      j.async = true;\n      j.src = `https://www.googletagmanager.com/gtm.js?id=${i}${dl}`;\n      f.parentNode?.insertBefore(j, f);\n    })(window, document, 'script', 'dataLayer', 'GTM-WV2G3SQL');\n  }, []);\n\n  useEffect(() => {\n    const id = window.setInterval(() => {\n      setIndex((i) => (i + 1) % promos.length);\n    }, 5_000);\n\n    return () => window.clearInterval(id);\n  }, [promos.length]);\n\n  const active = promos[index];\n\n  const barHeight = 50;\n  const translateY = `translateY(-${index * barHeight}px)`;\n\n  return (\n    <div\n      className={clsx(styles.wrapper)}\n      style={{\n        backgroundColor: active.bg,\n        transition: 'background-color 600ms ease',\n      }}>\n      <div\n        className={styles.slider}\n        style={{\n          transform: translateY,\n          transition: 'transform 700ms cubic-bezier(0.22, 1, 0.36, 1)',\n        }}>\n        {promos.map((p) => (\n          <a\n            key={p.key}\n            href={p.href}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n            className={styles.banner}>\n            <span>{p.label}</span>\n            <HandIcon aria-hidden=\"true\" className={styles.icon} />\n            <span className={styles.underline}>{p.buttonLabel}</span>\n          </a>\n        ))}\n      </div>\n      {onClose && (\n        <button\n          type=\"button\"\n          className={styles.closeButton}\n          aria-label=\"Close promotion banner\"\n          onClick={onClose}>\n          ×\n        </button>\n      )}\n      <span className=\"sr-only\">\n        {typeof active.label === 'string' ? active.label : ''}\n      </span>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/audiodocs/src/components/TopPromoRotator/styles.module.css",
    "content": ".wrapper {\n  position: relative;\n  height: 50px;\n  min-height: 50px;\n  max-height: 50px;\n  width: 100%;\n  overflow: hidden;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  font-size: 1rem;\n  font-weight: 500;\n}\n\n.slider {\n  position: absolute;\n  inset: 0;\n  will-change: transform;\n}\n\n.banner {\n  display: flex;\n  height: 50px;\n  min-height: 50px;\n  width: 100%;\n  align-items: center;\n  justify-content: center;\n  gap: 0.5rem;\n  padding: 0 0.75rem;\n  font-size: 1rem;\n  font-weight: 500;\n  line-height: 1;\n  color: #001a72;\n  text-align: center;\n  text-decoration: none;\n  transition: background-color 300ms ease-out;\n  white-space: nowrap;\n  box-sizing: border-box;\n}\n\n.banner:hover {\n  color: #001a72 !important;\n  text-decoration: none !important;\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n.banner:hover * {\n  text-decoration: none !important;\n}\n\n.banner:hover .underline {\n  text-decoration: underline !important;\n  text-underline-offset: 2px;\n}\n\n.hiddenOnMobile {\n  display: inline;\n}\n\n@media (max-width: 768px) {\n  .hiddenOnMobile {\n    display: none;\n  }\n}\n\n.icon {\n  flex-shrink: 0;\n  width: 28px;\n  height: 28px;\n  transform: rotate(-90deg);\n  display: block;\n}\n\n.underline {\n  text-decoration: underline;\n  text-underline-offset: 2px;\n}\n\n.closeButton {\n  position: absolute;\n  right: 8px;\n  top: 50%;\n  transform: translateY(-50%);\n  border: none;\n  background: transparent;\n  color: #001a72;\n  cursor: pointer;\n  padding: 4px;\n  line-height: 1;\n  font-size: 16px;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/css/colors.css",
    "content": ":root {\n  --black: #000;\n\n  --swm-navy-light-100: #001a72;\n  --swm-navy-light-80: #33488e;\n  --swm-navy-light-60: #6676aa;\n  --swm-navy-light-40: #919fcf;\n  --swm-navy-light-20: #c1c6e5;\n  --swm-navy-light-10: #eef0ff;\n  --swm-navy-light-transparent: #33488e40;\n\n  --swm-navy-dark-140: #1b2445;\n  --swm-navy-dark-120: #122154;\n  --swm-navy-dark-100: #001a72;\n  --swm-navy-dark-80: #0a2688;\n  --swm-navy-dark-70: #33488e;\n  --swm-navy-dark-60: #7485bd;\n  --swm-navy-dark-40: #abbcf5;\n  --swm-navy-dark-20: #c1c6e5;\n\n  --swm-purple-light-100: #782aeb;\n  --swm-purple-light-80: #b58df1;\n  --swm-purple-light-60: #d1bbf3;\n  --swm-purple-light-40: #e8dafc;\n  --swm-purple-light-20: #f5eeff;\n  --swm-purple-light-transparent: #f5eeff40;\n\n  --swm-purple-dark-140: #473d68;\n  --swm-purple-dark-120: #6a539a;\n  --swm-purple-dark-100: #b07eff;\n  --swm-purple-dark-80: #c49ffe;\n  --swm-purple-dark-60: #d0b2ff;\n  --swm-purple-dark-40: #e9dbff;\n  --swm-purple-dark-transparent: #473d6840;\n\n  --swm-blue-light-100: #38acdd;\n  --swm-blue-light-80: #5bb9e0;\n  --swm-blue-light-60: #87cce8;\n  --swm-blue-light-40: #b5e1f1;\n  --swm-blue-light-20: #e1f3fa;\n\n  --swm-blue-dark-140: #1b4865;\n  --swm-blue-dark-120: #126893;\n  --swm-blue-dark-100: #00a9f0;\n  --swm-blue-dark-80: #6fcef5;\n  --swm-blue-dark-60: #a8dbf0;\n  --swm-blue-dark-40: #d7f0fa;\n\n  --swm-green-light-100: #57b495;\n  --swm-green-light-80: #82cab2;\n  --swm-green-light-60: #b1dfd0;\n  --swm-green-light-40: #dff2ec;\n  --swm-green-light-20: #ebfcf7;\n\n  --swm-green-dark-140: #2a4f4a;\n  --swm-green-dark-120: #31775d;\n  --swm-green-dark-100: #3fc684;\n  --swm-green-dark-80: #7adead;\n  --swm-green-dark-60: #a0dfc0;\n  --swm-green-dark-40: #d3f5e4;\n\n  --swm-orange-light-100: #ff9c59;\n  --swm-orange-light-80: #ffaa7c;\n  --swm-orange-light-60: #ffc3a1;\n  --swm-orange-light-40: #ffdfd2;\n  --swm-orange-light-20: #ffefe0;\n\n  --swm-orange-dark-140: #5a463b;\n  --swm-orange-dark-120: #916255;\n  --swm-orange-dark-110: #c87d64;\n  --swm-orange-dark-100: #ff8e74;\n  --swm-orange-dark-80: #ff9d88;\n  --swm-orange-dark-60: #ffbcb2;\n  --swm-orange-dark-40: #ffe3db;\n\n  --swm-red-light-100: #ff6259;\n  --swm-red-light-80: #fa7f7c;\n  --swm-red-light-60: #ffa3a1;\n  --swm-red-light-40: #ffd2d7;\n  --swm-red-light-20: #ffedf0;\n\n  --swm-red-dark-140: #5a3b46;\n  --swm-red-dark-120: #914f55;\n  --swm-red-dark-110: #c86364;\n  --swm-red-dark-100: #ff7774;\n  --swm-red-dark-80: #ff8b88;\n  --swm-red-dark-60: #ffb4b2;\n  --swm-red-dark-40: #ffdcdb;\n\n  --swm-yellow-light-100: #ffd61e;\n  --swm-yellow-light-80: #ffe04b;\n  --swm-yellow-light-60: #ffe780;\n  --swm-yellow-light-40: #fff1b2;\n  --swm-yellow-light-20: #fffae1;\n\n  --swm-yellow-dark-140: #5a553a;\n  --swm-yellow-dark-120: #91823d;\n  --swm-yellow-dark-100: #ffdd44;\n  --swm-yellow-dark-80: #ffe678;\n  --swm-yellow-dark-60: #fff1b2;\n  --swm-yellow-dark-40: #fff9db;\n\n  /* Black & White palette, mainly for background settings */\n  /* --swm-off-white: #f8f9ff; */\n  --swm-off-white: #fffdfd;\n  --swm-white: #fcfcff;\n  --swm-white-transparent-light: #fcfcff40;\n  --swm-white-transparent-dark: #fcfcff80;\n\n  --swm-light-off-navy: #30354a;\n  --swm-off-navy: #272b3c;\n  --swm-navy: #232736;\n\n  --prism-background-color: transparent;\n\n  /* Infima main colors */\n  --ifm-color-primary: var(--swm-navy-light-100);\n  --ifm-color-primary-dark: var(--swm-navy-dark-80);\n  --ifm-color-primary-darker: var(--swm-navy-dark-100);\n  --ifm-color-primary-darkest: var(--swm-navy-dark-120);\n  --ifm-color-primary-light: var(--swm-navy-light-100);\n  --ifm-color-primary-lighter: var(--swm-navy-light-80);\n  --ifm-color-primary-lightest: var(--swm-navy-light-40);\n\n  /* Main site settings */\n  --swm-background: var(--swm-white);\n  --swm-off-background: var(--swm-off-white);\n\n  --ifm-background-color: var(--swm-background);\n  --ifm-navbar-background-color: var(--swm-background);\n  --ifm-navbar-link-color: var(--swm-navy-dark-100);\n\n  --swm-landing-background: var(--swm-white);\n\n  /* Color Mode */\n  --swm-color-mode-enabled: var(--swm-navy-light-20);\n  --swm-color-mode-disabled-color: var(--swm-navy-light-20);\n  --swm-color-mode-enabled-landing: var(--swm-navy-light-100);\n  --swm-color-mode-enabled-color-landing: var(--swm-navy-light-20);\n  --swm-color-mode-disabled-color-landing: var(--swm-navy-light-100);\n\n  /* Typography */\n  --ifm-heading-color: var(--ifm-color-primary);\n  --ifm-font-color-base: var(--black);\n\n  /* Tabs */\n  --swm-tab: var(--swm-red-light-40);\n  --swm-tab-hover: var(--swm-red-dark-80);\n  --swm-tab-active: var(--swm-red-dark-100);\n\n  /* Table of Contents */\n  --ifm-toc-border-color: transparent;\n  --ifm-toc-link-color: var(--swm-navy-light-60);\n  --ifm-toc-link-color-active: var(--swm-navy-light-100);\n\n  /* Details section */\n  --swm-details-foreground: var(--swm-red-light-20);\n  --swm-details-background: var(--swm-red-light-100);\n\n  /* Admonitions */\n  --swm-admonition-color-secondary: var(--swm-navy-light-10);\n  --swm-admonition-color-success: var(--swm-green-light-20);\n  --swm-admonition-color-danger: var(--swm-red-light-20);\n  --swm-admonition-color-info: var(--swm-blue-light-20);\n  --swm-admonition-color-caution: var(--swm-yellow-light-20);\n\n  --swm-admonition-color-secondary-shadow: var(--swm-navy-light-80);\n  --swm-admonition-color-success-shadow: var(--swm-green-light-100);\n  --swm-admonition-color-danger-shadow: var(--swm-red-light-100);\n  --swm-admonition-color-info-shadow: var(--swm-blue-light-100);\n  --swm-admonition-color-caution-shadow: var(--swm-yellow-light-100);\n\n  /* Details */\n  --swm-details-color: var(--swm-navy-light-100);\n\n  /* Quotes */\n  --swm-background-quote: var(--swm-navy-light-10);\n  --swm-background-quote-secondary: var(--swm-navy-light-20);\n  --swm-background-quote-blue: var(--swm-blue-light-40);\n  --swm-background-quote-green: var(--swm-green-light-40);\n  --swm-background-quote-red: var(--swm-red-light-40);\n  --swm-background-quote-yellow: var(--swm-yellow-light-40);\n  --swm-background-quote-purple: var(--swm-purple-light-40);\n\n  /* Code snippets */\n  --swm-border: var(--swm-navy-light-20);\n  --docusaurus-highlighted-code-line-bg: var(--swm-blue-light-20);\n  /* --swm-navy-light-40 in rgba */\n  --swm-code-lines-buttons-background: rgba(145, 159, 207, 0.2);\n\n  /* Interactive Examples */\n  --swm-interactive-button-color: var(--swm-navy-light-60);\n  --swm-interactive-button-active: var(--ifm-font-color-base);\n\n  --swm-interactive-slider: var(--swm-red-light-80);\n  --swm-interactive-slider-rail: var(--swm-navy-light-10);\n\n  /* --swm-navy-light-100 in rgba */\n  --swm-interactive-copy-button-off: rgba(0, 26, 114, 0);\n  --swm-interactive-copy-button-on: rgba(0, 26, 114, 1);\n\n  /* Table */\n  --swm-table-border-color: var(--swm-navy-light-20);\n\n  --ifm-table-head-background: var(--swm-off-background);\n  --ifm-table-stripe-background: var(--swm-off-background) !important;\n  --ifm-table-border-color: var(--swm-table-border-color);\n\n  /* Pagination */\n  --swm-paginator-sublabel: var(--swm-navy-light-100);\n  --swm-paginator-label: var(--swm-navy-light-80);\n  --swm-paginator-label-hover: var(--swm-navy-light-100);\n\n  /* Footer */\n  --swm-brand-copyright-color: var(--swm-navy-light-100);\n  --swm-copyright-color: var(--swm-light-off-navy);\n\n  --swm-brand-copyright-color-landing: var(--swm-brand-copyright-color);\n  --swm-copyright-color-landing: var(--swm-copyright-color);\n\n  /* Search */\n  --docsearch-text-color: var(--swm-searchbar-text-color);\n\n  --swm-searchbar-text-color: var(--swm-navy-light-60);\n  --swm-searchbar-background: var(--swm-background);\n  --swm-searchbar-border: var(--swm-navy-light-20);\n  --swm-searchbar-border-hover: var(--swm-purple-light-100);\n\n  --swm-search-hit-background: var(--swm-purple-light-20);\n  --swm-search-hit-background-hover: var(--swm-purple-light-80);\n  --swm-search-hit-border: var(--swm-purple-light-40);\n  --swm-search-hit-border-hover: var(--swm-purple-light-100);\n  --swm-search-hit-active-color: var(--swm-off-white);\n\n  --swm-docsearch-hit-source-color: var(--swm-navy-light-100);\n\n  --swm-search-hit-results-color: var(--swm-navy-light-40);\n\n  --swm-search-page-query-text-color: var(--swm-navy-light-100);\n\n  /* Sidebar */\n  --swm-sidebar-background: var(--swm-off-white);\n  --swm-sidebar-menu-color: var(--swm-navy-light-60);\n\n  /* Mobile sidebar */\n  /* --swm-navy-light-100 in rgba */\n  --swm-sidebar-backdrop: rgba(0, 26, 114, 0.5);\n\n  /* Landing */\n  --swm-landing-heading: var(--ifm-color-primary);\n  --swm-landing-heading-accent: var(--swm-navy-light-100);\n  --swm-landing-cursor: var(--swm-blue-light-100);\n  --swm-landing-subheading: var(--swm-navy-dark-100);\n  --swm-landing-button: var(--swm-navy-dark-100);\n  --swm-landing-button-text-color: var(--swm-off-white);\n  --swm-landing-feature-item: var(--swm-red-light-40);\n  --swm-landing-feature-item-shadow: var(--swm-red-light-100);\n  --swm-landing-sponsors-color: var(--ifm-font-color-base);\n  --swm-landing-logo-color: var(--swm-navy-light-100);\n  --swm-landing-button-red-light: var(--swm-red-light-80);\n\n  /* Hire Us Section */\n\n  --swm-hire-us-section-title: var(--swm-red-light-80);\n  --swm-hire-us-section: var(--swm-navy-light-100);\n  --swm-hire-us-section-color: var(--swm-off-white);\n  --swm-hire-us-toc: var(--swm-navy-light-100);\n  --swm-hire-us-toc-color: var(--swm-off-white);\n  --swm-hire-us-toc-border-hover: var(--swm-navy-light-100);\n  --swm-hire-us-toc-color-hover: var(--swm-navy-light-100);\n\n  /* Cards */\n  --swm-card-background: var(--swm-background);\n  --swm-card-border: var(--swm-navy-light-20);\n  --swm-card-border-hover: var(--swm-purple-light-100);\n\n  /* Sidebar label*/\n  --swm-sidebar-label-text-new: var(--swm-off-white);\n  --swm-sidebar-label-background-new: var(--swm-purple-light-100);\n\n  --swm-sidebar-label-text-experimental: var(--swm-navy-light-100);\n  --swm-sidebar-label-background-experimental: var(--swm-yellow-light-40);\n\n  /* Mobile sidebar versions */\n  --swm-sidebar-elements-version-text: var(--swm-navy-light-100);\n  --swm-sidebar-elements-version-inactive: var(--swm-navy-dark-40);\n  --swm-sidebar-elements-background: var(--swm-white);\n\n  /* Versions dropdown */\n  --swm-dropdown-versions-background: var(--swm-off-white);\n  --swm-dropdown-versions-item: var(--swm-navy-light-100);\n  --swm-dropdown-versions-item-border: var(--swm-purple-light-40);\n  --swm-dropdown-versions-item-background: var(--swm-purple-light-20);\n\n  --swm-dropdown-versions-item-active: var(--swm-off-white);\n  --swm-dropdown-versions-item-border-active: var(--swm-purple-light-100);\n  --swm-dropdown-versions-item-background-active: var(--swm-purple-light-80);\n\n  --swm-dropdown-versions-item-hover: var(--swm-navy-light-100);\n  --swm-dropdown-versions-item-active-hover: var(--swm-navy-light-100);\n\n  /* Version badge */\n  --swm-version-badge: var(--swm-navy-light-100);\n  --swm-version-badge-background: var(--swm-navy-light-10);\n\n  /* Compatibility table */\n  --swm-compatibility-supported-background: var(--swm-green-light-80);\n  --swm-compatibility-not-supported-background: var(--swm-red-light-80);\n  --swm-compatibility-text-color: var(--swm-white);\n\n    /* Markdown copy button */\n  --swm-markdown-copy-button-color: var(--swm-navy-light-100);\n  --swm-markdown-copy-button-border-color: var(--swm-navy-light-100);\n  --swm-markdown-copy-button-background-hover: var(--swm-navy-light-10);\n  --swm-markdown-copy-button-item-color: var(--swm-navy-light-40);\n  --swm-markdown-copy-button-item-background: var(--swm-background);\n  --swm-markdown-copy-button-item-background-hover: var(\n    --ifm-color-emphasis-100\n  );\n  --swm-markdown-copy-button-item-color-hover: var(--swm-navy-light-100);\n\n  /* Badges */\n  --swm-platform-badge-background: var(--swm-green-dark-120);\n  --swm-platform-badge-color: var(--swm-off-white);\n  --swm-available-from-badge-background: var(--swm-yellow-dark-120);\n  --swm-available-from-badge-color: var(--swm-off-white);\n}\n\n:root[data-theme='dark'] {\n  /* Infima main colors */\n  --ifm-color-primary: var(--swm-navy-light-10);\n\n  /* Main site settings */\n  --swm-background: var(--swm-navy);\n  --swm-off-background: var(--swm-off-navy);\n\n  --ifm-background-color: var(--swm-background);\n  --ifm-navbar-background-color: var(--swm-background);\n  --ifm-navbar-link-color: var(--swm-off-white);\n\n  --swm-landing-background: var(--swm-background);\n\n  /* Color Mode */\n  --swm-color-mode-enabled: var(--swm-off-navy);\n  --swm-color-mode-enabled-landing: var(--swm-off-white);\n  --swm-color-mode-enabled-color-landing: var(--swm-navy-dark-140);\n  --swm-color-mode-disabled-color: var(--swm-off-white);\n  --swm-color-mode-disabled-color-landing: var(--swm-off-white);\n\n  /* Typography */\n  --ifm-font-color-base: var(--swm-navy-light-10);\n\n  /* Tabs */\n  --swm-tab: var(--swm-red-light-60);\n  --swm-tab-hover: var(--swm-red-light-60);\n  --swm-tab-active: var(--swm-red-light-80);\n\n  /* Table of Contents */\n  --ifm-toc-border-color: transparent;\n  --ifm-toc-link-color: var(--swm-navy-light-40);\n  --ifm-toc-link-color-active: var(--swm-off-white);\n\n  /* Details section */\n  --swm-details-foreground: var(--swm-red-dark-120);\n  --swm-details-background: var(--swm-red-dark-100);\n\n  /* Admonitions */\n  --swm-admonition-color-secondary: var(--swm-navy-dark-60);\n  --swm-admonition-color-success: var(--swm-green-dark-120);\n  --swm-admonition-color-danger: var(--swm-red-dark-120);\n  --swm-admonition-color-info: var(--swm-blue-dark-120);\n  --swm-admonition-color-caution: var(--swm-yellow-dark-120);\n\n  --swm-admonition-color-secondary-shadow: var(--swm-navy-light-80);\n  --swm-admonition-color-success-shadow: var(--swm-green-dark-140);\n  --swm-admonition-color-danger-shadow: var(--swm-red-dark-140);\n  --swm-admonition-color-info-shadow: var(--swm-blue-dark-140);\n  --swm-admonition-color-caution-shadow: var(--swm-yellow-dark-140);\n\n  /* Details */\n  --swm-details-color: var(--swm-off-white);\n\n  /* Quotes */\n  --swm-background-quote: var(--swm-light-off-navy);\n  --swm-background-quote-secondary: var(--swm-navy-light-20);\n  --swm-background-quote-blue: var(--swm-blue-dark-140);\n  --swm-background-quote-green: var(--swm-green-light-40);\n  --swm-background-quote-red: var(--swm-red-light-100);\n  --swm-background-quote-yellow: var(--swm-yellow-dark-140);\n  --swm-background-quote-purple: var(--swm-purple-light-80);\n\n  /* Code snippets */\n  --swm-border: var(--swm-navy-light-60);\n  --docusaurus-highlighted-code-line-bg: var(--swm-blue-dark-140);\n\n  /* --swm-navy-light-20 in rgba schema */\n  --swm-interactive-copy-button-off: rgba(193, 198, 229, 0);\n  --swm-interactive-copy-button-on: rgba(193, 198, 229, 1);\n\n  /* Table */\n  --swm-table-border-color: var(--swm-navy-light-60);\n\n  /* Pagination */\n  --swm-paginator-sublabel: var(--swm-navy-light-20);\n  --swm-paginator-label: var(--swm-navy-light-60);\n  --swm-paginator-label-hover: var(--swm-navy-light-40);\n\n  /* Footer */\n  --swm-brand-copyright-color: var(--swm-off-white);\n  --swm-copyright-color: var(--swm-navy-light-40);\n\n  --swm-brand-copyright-color-landing: var(--swm-navy-light-20);\n  --swm-copyright-color-landing: var(--swm-off-white);\n\n  /* Search */\n  --swm-searchbar-text-color: var(--swm-navy-dark-40);\n  --swm-searchbar-border: var(--swm-navy-dark-60);\n  --swm-searchbar-border-hover: var(--swm-purple-dark-80);\n\n  --swm-search-hit-background: var(--swm-purple-dark-120);\n  --swm-search-hit-background-hover: var(--swm-purple-dark-40);\n  --swm-search-hit-border: var(--swm-purple-dark-120);\n  --swm-search-hit-border-hover: var(--swm-purple-dark-40);\n  --swm-search-hit-active-color: var(--swm-navy-light-100);\n\n  --swm-docsearch-hit-source-color: var(--swm-navy-light-10);\n\n  --swm-search-hit-results-color: var(--swm-navy-light-20);\n\n  --swm-search-page-query-text-color: var(--swm-navy-light-10);\n\n  /* Sidebar */\n  --swm-sidebar-background: var(--swm-navy);\n  --swm-sidebar-elements-background: var(--swm-off-navy);\n  --swm-sidebar-menu-color: var(--swm-navy-light-20);\n\n  /* Mobile sidebar */\n  /* --swm-navy in rgba */\n  --swm-sidebar-backdrop: rgba(35, 39, 54, 0.5);\n\n  /* Landing */\n  --swm-landing-heading: var(--swm-white);\n  --swm-landing-heading-accent: var(--swm-blue-light-60);\n  --swm-landing-cursor: var(--swm-white);\n  --swm-landing-subheading: var(--swm-blue-light-60);\n  --swm-landing-button: var(--swm-blue-light-100);\n  --swm-landing-button-text-color: var(--black);\n  --swm-landing-feature-item: var(--swm-red-dark-100);\n  --swm-landing-feature-item-shadow: var(--swm-red-dark-140);\n  --swm-landing-sponsors-color: var(--swm-off-white);\n  --swm-landing-logo-color: var(--swm-blue-light-20);\n\n  /* Hire Us Section */\n  --swm-hire-us-section-title: var(--swm-red-light-80);\n  --swm-hire-us-section: var(--swm-off-white);\n  --swm-hire-us-section-color: var(--black);\n  --swm-hire-us-toc: var(--swm-off-white);\n  --swm-hire-us-toc-color: var(--swm-navy-dark-100);\n  --swm-hire-us-toc-color-hover: var(--swm-navy-light-40);\n  --swm-hire-us-toc-border-hover: var(--swm-navy-light-40);\n\n  /* Cards */\n  --swm-card-background: var(--swm-navy);\n  --swm-card-border: var(--swm-navy-dark-60);\n  --swm-card-border-hover: var(--swm-purple-dark-80);\n\n  /* Sidebar label*/\n  --swm-sidebar-label-text-new: var(--swm-off-white);\n  --swm-sidebar-label-background-new: var(--swm-purple-dark-120);\n\n  --swm-sidebar-label-text-experimental: var(--swm-off-white);\n  --swm-sidebar-label-background-experimental: var(--swm-yellow-dark-120);\n\n  /* Mobile sidebar versions */\n  --swm-sidebar-elements-version-text: var(--swm-navy-dark-20);\n  --swm-sidebar-elements-version-inactive: var(--swm-navy-dark-60);\n  --swm-sidebar-elements-background: var(--swm-light-off-navy);\n\n  /* Versions dropdown */\n\n  --swm-dropdown-versions-background: var(--swm-off-navy);\n  --swm-dropdown-versions-item: var(--swm-off-white);\n  --swm-dropdown-versions-item-border: var(--swm-purple-dark-40);\n  --swm-dropdown-versions-item-background: var(--swm-purple-dark-40);\n\n  --swm-dropdown-versions-item-active: var(--swm-off-white);\n  --swm-dropdown-versions-item-border-active: var(--swm-purple-dark-120);\n  --swm-dropdown-versions-item-background-active: var(--swm-purple-dark-120);\n\n  --swm-dropdown-versions-item-hover: var(--swm-navy-dark-100);\n  --swm-dropdown-versions-item-active-hover: var(--swm-navy-dark-100);\n\n  /* Version badge */\n  --swm-version-badge: var(--swm-off-white);\n  --swm-version-badge-background: var(--swm-light-off-navy);\n\n  /* Compatibility table */\n  --swm-compatibility-supported-background: var(--swm-green-dark-120);\n  --swm-compatibility-not-supported-background: var(--swm-red-dark-120);\n  --swm-compatibility-text-color: var(--swm-navy-dark-20);\n\n    /* Markdown copy button */\n  --swm-markdown-copy-button-color: var(--swm-navy-light-40);\n  --swm-markdown-copy-button-border-color: var(--swm-navy-light-40);\n  --swm-markdown-copy-button-background-hover: var(--ifm-color-emphasis-100);\n  --swm-markdown-copy-button-item-color: var(--swm-navy-light-40);\n  --swm-markdown-copy-button-item-background: var(--swm-background);\n  --swm-markdown-copy-button-item-background-hover: var(\n    --ifm-color-emphasis-100\n  );\n  --swm-markdown-copy-button-item-color-hover: var(--swm-off-white);\n\n  /* Badges */\n  --swm-platform-badge-background: var(--swm-green-dark-120);\n  --swm-platform-badge-color: var(--swm-off-white);\n  --swm-available-from-badge-background: var(--swm-yellow-dark-120);\n  --swm-available-from-badge-color: var(--swm-off-white);\n}\n"
  },
  {
    "path": "packages/audiodocs/src/css/custom.css",
    "content": "@import 'colors.css';\n@import 'typography.css';\n@import 'overrides.css';\n"
  },
  {
    "path": "packages/audiodocs/src/css/overrides.css",
    "content": ":root {\n  --swm-logo-height: 45px;\n  --swm-expandable-transition: transform 200ms ease;\n}\n\n.navbar {\n  min-width: 360px;\n  z-index: 100;\n  background-color: var(--ifm-navbar-background-color);\n}\n\n.navbar__title {\n  display: flex;\n  align-items: center;\n}\n\n.navbar__title img {\n  height: 45px !important;\n}\n\n.footer {\n  z-index: 100;\n}\n\n.docusaurus-mermaid-container {\n  display: flex;\n  justify-content: center;\n}\n\ntable {\n  display: table;\n  width: 100%;\n}\n\n@media (max-width: 1280px) {\n  table:not([class*='platform-compatibility']) {\n    display: block;\n    width: 100%;\n  }\n}\n\ntable thead tr {\n  border-bottom: 1px solid var(--ifm-table-border-color);\n}\n\n.platform-compatibility {\n  table-layout: fixed;\n}\n\n.platform-compatibility td {\n  text-align: center;\n}\n\n.compatibility {\n  overflow-x: auto;\n}\n\n.compatibility table {\n  display: table;\n  width: 100%;\n  white-space: nowrap;\n}\n\n.compatibility td {\n  padding: 0;\n  border: transparent 2px solid;\n  background: var(--ifm-background-color);\n}\n\n.compatibility th {\n  background: var(--ifm-background-color);\n  border: transparent 2px solid;\n}\n\n.header-github {\n  margin-left: 1.5em;\n}\n\n.header-github:before {\n  display: flex;\n  height: 24px;\n  width: 24px;\n\n  mask: url(/static/img/github.svg) no-repeat 100% 100%;\n  mask-size: cover;\n  content: '';\n\n  background-color: var(--ifm-navbar-link-color);\n}\n\n@media (max-height: 768px) {\n  .header-github:before {\n    height: 20px;\n    width: 20px;\n  }\n}\n\n.header-github:hover:before {\n  background-color: var(--ifm-navbar-link-hover-color);\n}\n\n[class*='navbarLanding'] .header-github:before,\n[class*='navbarLanding'] .header-github:hover:before {\n  background-color: var(--ifm-navbar-link-color);\n}\n\n[class*='codeBlockContent'] pre {\n  border: 1px solid var(--swm-border);\n}\n\n[class*='codeBlockContent'] pre,\n[class*='codeBlockContent'] code {\n  border-radius: 0;\n  background-color: var(--swm-off-background);\n}\n\n/* Add small padding, when some of the lines are too long in a code block */\n[class*='codeBlockLines'] span:last-of-type {\n  margin-right: 1em;\n}\n\n.theme-doc-version-badge {\n  color: var(--swm-version-badge);\n  background: var(--swm-version-badge-background);\n  padding: 6px;\n  border-radius: 8px;\n  border: none;\n  margin-bottom: 8px;\n}\n\n.snack-link {\n  display: inline-block;\n  margin-bottom: 25px;\n}\n\n[class*='DocCategoryGeneratedIndexPage'][class*='title'] {\n  font-size: var(--swm-h1-font-size);\n}\n\n/* TODO: Remove after @swmansion-t-rex-ui 0.0.11 patch */\nbutton[class*='DocSearch-Button'] {\n  margin: 0 !important;\n}\n\n/* versions dropdown on landing */\n\n[class*='plugin-pages'] [class*='dropdown--right'] > a:first-child {\n  color: var(--swm-off-white) !important;\n}\n\n[class*='plugin-pages'] [class*='dropdown__menu'] a:hover {\n  color: var(--swm-dropdown-versions-item-hover) !important;\n}\n\n/* examples sidebar */\n\n[class*='plugin-blog'] [class*='sidebar']:not([class*='navbar-sidebar']) {\n  background-color: transparent;\n}\n\n.table-vertical-top {\n  width: 100%;\n  border-collapse: collapse;\n  border-spacing: 0;\n  box-sizing: border-box;\n}\n\n/* padding: 0.75rem */\n.table-vertical-top td {\n  vertical-align: top;\n  padding: 0;\n  border-collapse: collapse;\n  border-spacing: 0;\n  box-sizing: border-box;\n}\n\n.table-vertical-top td div.text-content {\n  padding: 0.75rem;\n  font-size: inherit;\n  margin-bottom: 0.25rem;\n}\n\n.table-vertical-top td div.text-content p {\n  margin: 0;\n}\n\n.table-vertical-top td div.text-content:last-child {\n  margin-bottom: 0;\n}\n\n.table-vertical-top [class*='codeBlockContainer'] {\n  margin: -1px;\n}\n\n.table-vertical-top tbody tr td:first-child {\n  min-width: 200px;\n  text-wrap: wrap;\n  word-break: break-all;\n}\n\n.table-vertical-top tbody tr td:last-child {\n  width: 100%;\n}\n\n.table-vertical-top tbody tr:nth-child(2n) code {\n  background-color: var(--swm-white) !important;\n}\n\n[data-theme='dark'] .table-vertical-top tbody tr:nth-child(2n) code {\n  background-color: var(--swm-navy) !important;\n}\n\n.table-vertical-top div table {\n  width: 101%;\n  margin: -1px;\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\n.table-vertical-top div table td {\n  padding: 0.2rem;\n}\n\n.table-vertical-top div table td:nth-child(2) {\n  min-width: 150px;\n}\n\n.table-vertical-top-table {\n  padding-top: 1px;\n  overflow-x: hidden;\n  border-collapse: collapse;\n  box-sizing: border-box;\n}\n\n[class*=alert--warning] {\n  background-color: var(--swm-admonition-color-caution) !important;\n  box-shadow: -8px 8px 0 var(--swm-admonition-color-caution-shadow) !important;\n}\n\ndetails.alert {\n  border-radius: 0 !important;\n}\n\n[class*='headerWithBadges'] {\n  align-items: baseline;\n}\n\n[class*=admonition-warning] code {\n  background-color: var(--swm-yellow-light-40) !important;\n  border: none !important;\n}\n\n[data-theme='dark'] [class*=admonition-warning] code {\n  background-color: var(--swm-yellow-dark-140) !important;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/css/typography.css",
    "content": "@font-face {\n  font-family: 'Aeonik';\n  src: url('/static/fonts/Aeonik-Regular.otf') format('opentype');\n  font-weight: 400;\n}\n\n@font-face {\n  font-family: 'Aeonik';\n  src: url('/static/fonts/Aeonik-Medium.otf') format('opentype');\n  font-weight: 500;\n}\n\n@font-face {\n  font-family: 'Aeonik';\n  src: url('/static/fonts/Aeonik-Bold.otf') format('opentype');\n  font-weight: 600;\n}\n\n@font-face {\n  font-family: 'DM Mono';\n  src: url('/static/fonts/DMMono-Regular.ttf') format('truetype');\n  font-weight: 400;\n}\n\n:root {\n  --swm-title-landing-font: 'Aeonik';\n  --swm-title-font: 'Aeonik';\n  --swm-body-font: 'Aeonik';\n  --swm-code-font: 'DM Mono';\n\n  --ifm-font-family-base: var(--swm-body-font);\n  --ifm-font-family-bold: var(--swm-body-font);\n\n  /* Heading */\n  --swm-h1-font-size: 42px;\n  --swm-h2-font-size: 32px;\n  --swm-h3-font-size: 22px;\n  --swm-heading-font-size-smaller: 18px;\n  --ifm-code-font-size: 90%;\n\n  --ifm-heading-font-family: var(--swm-title-font);\n  --ifm-heading-margin-bottom: 0;\n\n  --swm-heading-font-weight: 600;\n  --swm-h1-line-height: 1.15;\n  --swm-h2-line-height: 1.2;\n  --swm-heading-line-height-default: 1.3;\n\n  --swm-heading-letter-spacing-bigger: 0.02em;\n  --swm-heading-letter-spacing-smaller: 0.01em;\n\n  /* Admonitions */\n  --swm-admonition-heading-font-family: var(--swm-body-font);\n  --swm-admonition-heading-font-weight: 500;\n\n  /* Paginator */\n  --swm-paginator-sublabel-font-size: 14px;\n  --swm-paginator-sublabel-text-transform: uppercase;\n\n  --swm-paginator-label-font-size: 20px;\n  --swm-paginator-label-font-weight: 500;\n\n  /* Search page */\n  --swm-search-page-heading-font-weight: 600;\n  --swm-search-page-summary-font-size: 14px;\n}\n\n/* Remove all heading rules, prioritized by Docusaurus */\n:root,\n.markdown h1:first-child,\n.markdown > h1,\n.markdown > h2,\n.markdown > h3,\n.markdown > h4,\n.markdown > h5,\n.markdown > h6 {\n  --ifm-h1-font-size: var(--swm-h1-font-size);\n  --ifm-h2-font-size: var(--swm-h2-font-size);\n  --ifm-h3-font-size: var(--swm-h3-font-size);\n  --ifm-h4-font-size: var(--swm-heading-font-size-smaller);\n  --ifm-h5-font-size: var(--swm-heading-font-size-smaller);\n  --ifm-h6-font-size: var(--swm-heading-font-size-smaller);\n\n  --ifm-h1-vertical-rhythm-top: 3.75;\n  --ifm-h2-vertical-rhythm-top: 2.5;\n  --ifm-h3-vertical-rhythm-top: 1.75;\n  --ifm-heading-vertical-rhythm-top: 1.5;\n  --ifm-h1-vertical-rhythm-bottom: 1.5;\n  --ifm-heading-vertical-rhythm-bottom: 1.25;\n}\n\n@media (max-width: 996px) {\n  :root,\n  .markdown h1:first-child,\n  .markdown > h1,\n  .markdown > h2,\n  .markdown > h3,\n  .markdown > h4,\n  .markdown > h5,\n  .markdown > h6 {\n    --swm-heading-font-size-smaller-mobile: 16px;\n\n    /* Decrease the font size on mobile devices */\n    --ifm-h1-font-size: var(--swm-h2-font-size);\n    --ifm-h2-font-size: var(--swm-h3-font-size);\n    --ifm-h3-font-size: var(--swm-heading-font-size-smaller);\n    --ifm-h4-font-size: var(--swm-heading-font-size-smaller-mobile);\n    --ifm-h5-font-size: var(--swm-heading-font-size-smaller-mobile);\n    --ifm-h6-font-size: var(--swm-heading-font-size-smaller-mobile);\n  }\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n  font-weight: var(--swm-heading-font-weight);\n  letter-spacing: var(--swm-heading-letter-spacing-smaller);\n}\n\nh1 {\n  line-height: var(--swm-h1-line-height);\n  letter-spacing: var(--swm-heading-letter-spacing-bigger);\n}\n\n@media (max-width: 996px) {\n  h1 {\n    letter-spacing: var(--swm-heading-letter-spacing-smaller);\n  }\n}\n\nh2 {\n  line-height: var(--swm-h2-line-height);\n}\n\nh3,\nh4,\nh5 {\n  line-height: var(--swm-heading-line-height-default);\n}\n\nh6 {\n  font-family: var(--swm-code-font);\n}\n\np {\n  line-height: 1.6;\n}\n\nul[role='tablist'] {\n  font-family: var(--swm-title-font);\n}\n\ncode {\n  font-family: var(--swm-code-font);\n  font-weight: 400;\n  border: none;\n  padding: 0.1rem 0.25rem;\n  background-color: var(--swm-background-quote);\n}\n\n.markdown a code {\n  text-decoration: underline;\n  text-underline-offset: 2px;\n}\n\n.markdown a {\n  font-weight: 500;\n  text-decoration: none;\n}\n\n/* Sidebar */\n[class*='menu__list-item-collapsible'] a {\n  font-family: var(--swm-title-font);\n  font-weight: 600;\n  font-size: 18px;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/examples/Biquad/BiquadExampleComponent.tsx",
    "content": "import React, { useState, useEffect, useRef } from 'react';\nimport { View } from 'react-native';\nimport {\n  AudioContext,\n  AudioBufferSourceNode,\n  BiquadFilterNode,\n  GainNode,\n  AudioBuffer,\n} from 'react-native-audio-api';\nimport { BoxWithFlaps } from './BoxWithFlaps';\n\nconst BiquadExample: React.FC = () => {\n  const [slider, setSlider] = useState(0);\n  const [sliderPressed, setSliderPressed] = useState(false);\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n  const audioBufferRef = useRef<AudioBuffer | null>(null);\n  const filterRef = useRef<BiquadFilterNode | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n\n  useEffect(() => {\n    const init = async () => {\n      const ctx = new AudioContext();\n      audioContextRef.current = ctx;\n\n      const filterNode = ctx.createBiquadFilter();\n      filterNode.type = 'lowpass';\n      const gainNode = ctx.createGain();\n      filterNode.connect(gainNode);\n      gainNode.connect(ctx.destination);\n\n      filterRef.current = filterNode;\n      gainRef.current = gainNode;\n\n      audioBufferRef.current = await fetch('/react-native-audio-api/audio/music/example-music-01.mp3')\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) => ctx.decodeAudioData(arrayBuffer))\n        .catch((error) => {\n          console.error('Error decoding audio data source:', error);\n          return null;\n        });\n    };\n\n    init();\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  const playSound = async () => {\n    if (!audioContextRef.current || !audioBufferRef.current) return;\n    if (bufferSourceRef.current != null) {\n      stopSound();\n    }\n    const source = await audioContextRef.current.createBufferSource();\n    source.buffer = audioBufferRef.current;\n    bufferSourceRef.current = source;\n\n    source.connect(filterRef.current!);\n    source.start();\n  };\n\n  const stopSound = () => {\n    bufferSourceRef.current?.stop();\n    bufferSourceRef.current = null;\n  };\n\n  useEffect(() => {\n    if (filterRef.current && gainRef.current) {\n      const ratio = slider / 100;\n      filterRef.current.frequency.value = 200 + ratio * (5000 - 200);\n      filterRef.current.Q.value = 1 + (1 - ratio) * 10;\n      gainRef.current.gain.value = 0.2 + ratio * 0.8;\n    }\n\n    if ((sliderPressed || slider > 0) && !bufferSourceRef.current) playSound();\n    if (!sliderPressed && slider === 0) stopSound();\n\n    if (!sliderPressed && slider > 0) {\n      const id = requestAnimationFrame(() =>\n        setSlider((prev) => Math.max(0, prev - 1))\n      );\n      return () => cancelAnimationFrame(id);\n    }\n  }, [slider, sliderPressed]);\n\n  return (\n    <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>\n      <BoxWithFlaps progress={slider / 100} />\n      <input\n        type=\"range\"\n        min={0}\n        max={100}\n        value={slider}\n        onChange={(e) => setSlider(Number(e.target.value))}\n        onMouseDown={() => setSliderPressed(true)}\n        onMouseUp={() => setSliderPressed(false)}\n        onTouchStart={() => setSliderPressed(true)}\n        onTouchEnd={() => setSliderPressed(false)}\n        style={{ width: 200, marginTop: 50 }}\n      />\n    </View>\n  );\n};\n\nexport default BiquadExample;\n"
  },
  {
    "path": "packages/audiodocs/src/examples/Biquad/BoxWithFlaps.tsx",
    "content": "import React from 'react';\nimport { View, ViewStyle, Image } from 'react-native';\nimport Animated, {\n  useAnimatedStyle,\n  withTiming,\n} from 'react-native-reanimated';\n\ntype FlapParams = {\n  axis: 'X' | 'Y';\n  translate: number;\n  multiplier: number;\n};\n\nconst useFlapStyle = (\n  progress: number,\n  { axis, translate, multiplier }: FlapParams\n) => {\n  return useAnimatedStyle(() => {\n    const rotate = `${progress * multiplier}deg`;\n    return {\n      transform: [\n        { perspective: 800 },\n        axis === 'X' ? { translateY: translate } : { translateX: translate },\n        axis === 'X'\n          ? { rotateX: withTiming(rotate, { duration: 50 }) }\n          : { rotateY: withTiming(rotate, { duration: 50 }) },\n        axis === 'X' ? { translateY: -translate } : { translateX: -translate },\n      ],\n    };\n  });\n};\n\nexport const BoxWithFlaps = ({ progress }: { progress: number }) => {\n  const phaseShift = 0.7;\n  const delayedProgress = Math.max(0, progress - phaseShift) / (1 - phaseShift);\n\n  const topStyle = useFlapStyle(delayedProgress, { axis: 'X', translate: -25, multiplier: 130 });\n  const bottomStyle = useFlapStyle(delayedProgress, { axis: 'X', translate: 25, multiplier: -130 });\n  const leftStyle = useFlapStyle(progress, { axis: 'Y', translate: -50, multiplier: -110 });\n  const rightStyle = useFlapStyle(progress, { axis: 'Y', translate: 50, multiplier: 110 });\n\n  const baseFlapStyle: ViewStyle = {\n    position: 'absolute',\n    backgroundColor: '#a9744f',\n    borderColor: '#5c3d2e',\n  };\n\n  const flapConfigs = [\n    {\n      key: 'top',\n      style: { top: 0, left: 1, width: 198, height: 50, borderBottomWidth: 2 },\n      animatedStyle: topStyle,\n    },\n    {\n      key: 'bottom',\n      style: { bottom: 0, left: 1, width: 198, height: 50, borderTopWidth: 2 },\n      animatedStyle: bottomStyle,\n    },\n    {\n      key: 'left',\n      style: { top: 0, left: 0, width: 100, height: 200, borderRightWidth: 2, zIndex: 1 },\n      animatedStyle: leftStyle,\n    },\n    {\n      key: 'right',\n      style: { top: 0, right: 0, width: 100, height: 200, borderLeftWidth: 2, zIndex: 1 },\n      animatedStyle: rightStyle,\n    },\n  ];\n\n  return (\n    <View\n      style={{\n        width: 200,\n        height: 200,\n        position: 'relative',\n        alignItems: 'center',\n        justifyContent: 'center',\n      }}>\n      {/* Box base */}\n      <View\n        style={{\n          position: 'absolute',\n          width: 200,\n          height: 200,\n          backgroundColor: '#9d6c49ff',\n          borderWidth: 2,\n          borderColor: '#5c3d2e',\n          borderRadius: 4,\n        }}\n      />\n\n      {/* Gramophone */}\n      <Image\n        style={{ width: 250, height: 250, position: 'absolute' }}\n        alt=\"gramophone\"\n        source={{\n          uri: '/react-native-audio-api/img/gramophone.png',\n        }}\n      />\n\n      {/* Flaps */}\n      {flapConfigs.map((flap) => (\n        <Animated.View\n          key={flap.key}\n          style={[baseFlapStyle, flap.style, flap.animatedStyle]}\n        />\n      ))}\n    </View>\n  );\n};\n"
  },
  {
    "path": "packages/audiodocs/src/examples/Biquad/FrequencyResponseGraph.module.css",
    "content": ".container {\n  flex: 1;\n  padding: 16px;\n}\n\n.loadingRow {\n  display: inline-flex;\n  align-items: center;\n  gap: 8px;\n}\n\n.loadingSpinner {\n  width: 14px;\n  height: 14px;\n  border: 2px solid rgba(145, 159, 207, 0.25);\n  border-top-color: var(--swm-red-light-80);\n  border-radius: 50%;\n  animation: spin 700ms linear infinite;\n}\n\n.loadingText {\n  color: var(--swm-off-white);\n  font-size: 12px;\n}\n\n.canvasContainer {\n  margin-top: 16px;\n  width: 100%;\n}\n\n.playPauseButtonContainer {\n  margin-top: 16px;\n  display: flex;\n  justify-content: center;\n}\n\n.playPauseButton {\n  min-width: 200px;\n  border: none;\n  border-radius: 0;\n  padding: 12px 16px;\n  background-color: var(--swm-red-light-80);\n  color: #fcfcff;\n  font-weight: 700;\n  cursor: pointer;\n  transition: filter 180ms ease;\n}\n\n.playPauseButton:hover {\n  filter: brightness(0.95);\n}\n\n.playPauseButton:focus-visible {\n  outline: 2px solid var(--swm-red-light-80);\n  outline-offset: 2px;\n}\n\n.sliderSection {\n  margin-top: 16px;\n}\n\n@keyframes spin {\n  from {\n    transform: rotate(0deg);\n  }\n\n  to {\n    transform: rotate(360deg);\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/examples/Biquad/FrequencyResponseGraph.tsx",
    "content": "import { useColorMode } from '@docusaurus/theme-common';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport {\n  AudioBuffer,\n  AudioBufferSourceNode,\n  AudioContext,\n  BiquadFilterNode,\n} from 'react-native-audio-api';\n\nimport DetailBox from '@site/src/ui/DetailBox';\nimport FilterList from '@site/src/ui/FilterList';\nimport type { ResponsiveCanvasDrawParams } from '@site/src/ui/ResponsiveCanvas';\nimport ResponsiveCanvas from '@site/src/ui/ResponsiveCanvas';\nimport SliderInput from '@site/src/ui/SliderInput';\nimport Switch from '@site/src/ui/Switch';\nimport { drawFrequencyResponse } from './drawFrequencyResponse';\nimport styles from './FrequencyResponseGraph.module.css';\n\nconst FILTER_OPTIONS: Array<{ value: BiquadFilterType; label: string }> = [\n  { value: 'allpass', label: 'All-pass' },\n  { value: 'lowpass', label: 'Low-pass' },\n  { value: 'highpass', label: 'High-pass' },\n  { value: 'bandpass', label: 'Band-pass' },\n  { value: 'lowshelf', label: 'Low-shelf' },\n  { value: 'highshelf', label: 'High-shelf' },\n  { value: 'peaking', label: 'Peaking' },\n  { value: 'notch', label: 'Notch' },\n];\n\nconst FrequencyResponseGraph: React.FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n  const [filterType, setFilterType] = useState<BiquadFilterType>('allpass');\n  const [filterFreq, setFilterFreq] = useState(350);\n  const [filterQ, setFilterQ] = useState(1);\n  const [filterGain, setFilterGain] = useState(0);\n  const [selectedAudio, setSelectedAudio] = useState<'speech' | 'music'>('speech');\n  const [isFilterReady, setIsFilterReady] = useState(false);\n  const { colorMode } = useColorMode();\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n  const audioBuffersRef = useRef<{ speech: AudioBuffer | null; music: AudioBuffer | null }>({\n    speech: null,\n    music: null,\n  });\n  const filterRef = useRef<BiquadFilterNode | null>(null);\n\n  const gridColor = colorMode === 'dark' ? 'rgba(252, 252, 255, 0.15)' : 'rgba(0, 0, 0, 0.2)';\n  const isSpeech = selectedAudio === 'speech';\n\n  useEffect(() => {\n    let mounted = true;\n\n    const init = async () => {\n      const ctx = new AudioContext();\n      audioContextRef.current = ctx;\n\n      const filter = ctx.createBiquadFilter();\n      filter.connect(ctx.destination);\n      filterRef.current = filter;\n      setIsFilterReady(true);\n\n      setIsLoading(true);\n      try {\n        const speech = await fetch('/react-native-audio-api/audio/voice/example-voice-01.mp3')\n          .then((response) => response.arrayBuffer())\n          .then((arrayBuffer) => ctx.decodeAudioData(arrayBuffer));\n\n        const music = await fetch('/react-native-audio-api/audio/music/example-music-03.mp3')\n          .then((response) => response.arrayBuffer())\n          .then((arrayBuffer) => ctx.decodeAudioData(arrayBuffer));\n\n        if (mounted) {\n          audioBuffersRef.current = { speech, music };\n        }\n      } catch (error) {\n        console.error('Error decoding audio data source:', error);\n      } finally {\n        if (mounted) {\n          setIsLoading(false);\n        }\n      }\n    };\n\n    init();\n\n    return () => {\n      mounted = false;\n      bufferSourceRef.current?.stop();\n      bufferSourceRef.current = null;\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  const handleCanvasDraw = useCallback(({ canvas }: ResponsiveCanvasDrawParams) => {\n    if (!isFilterReady || !filterRef.current) {\n      return;\n    }\n\n    const filter = filterRef.current;\n    filter.type = filterType;\n    filter.frequency.value = filterFreq;\n    filter.Q.value = filterQ;\n    filter.gain.value = filterGain;\n\n    drawFrequencyResponse(canvas, filter, gridColor);\n  }, [filterFreq, filterGain, filterQ, filterType, gridColor, isFilterReady]);\n\n  const playAudio = async () => {\n    const context = audioContextRef.current;\n    if (!context) {\n      return;\n    }\n\n    bufferSourceRef.current?.stop();\n    bufferSourceRef.current = null;\n\n    const buffer = selectedAudio === 'speech'\n      ? audioBuffersRef.current.speech\n      : audioBuffersRef.current.music;\n\n    if (!buffer) {\n      return;\n    }\n\n    const source = await context.createBufferSource();\n    source.buffer = buffer;\n    bufferSourceRef.current = source;\n    source.connect(filterRef.current!);\n    source.onEnded = () => {\n      if (bufferSourceRef.current === source) {\n        bufferSourceRef.current = null;\n        setIsPlaying(false);\n      }\n    };\n    source.start();\n    setIsPlaying(true);\n  };\n\n  const handlePlayPause = async () => {\n    if (isPlaying) {\n      bufferSourceRef.current?.stop();\n      bufferSourceRef.current = null;\n      setIsPlaying(false);\n      return;\n    }\n\n    await playAudio();\n  };\n\n  useEffect(() => {\n    if (isPlaying) {\n      void playAudio();\n    }\n  }, [selectedAudio]);\n\n  return (\n    <DetailBox tag=\"BiquadFilterNode\" info=\"interactive playground\" startOpen>\n      <div className={styles.container}>\n        {isLoading && (\n          <div className={styles.loadingRow}>\n            <span className={styles.loadingSpinner} aria-hidden=\"true\" />\n            <span className={styles.loadingText}>Loading audio...</span>\n          </div>\n        )}\n\n        <ResponsiveCanvas\n          onDraw={handleCanvasDraw}\n          aspectRatio={3}\n          containerClassName={styles.canvasContainer}\n        />\n\n        <div className={styles.playPauseButtonContainer}>\n          <button type=\"button\" onClick={handlePlayPause} className={styles.playPauseButton}>\n            {isPlaying ? 'Pause' : 'Play'}\n          </button>\n        </div>\n\n        <FilterList<BiquadFilterType>\n          options={FILTER_OPTIONS}\n          value={filterType}\n          onChange={setFilterType}\n        />\n\n        <Switch\n          checked={!isSpeech}\n          onChange={(isMusic) => setSelectedAudio(isMusic ? 'music' : 'speech')}\n          leftLabel=\"Speech\"\n          rightLabel=\"Music\"\n          ariaLabel=\"Toggle between speech and music samples\"\n        />\n\n        <div className={styles.sliderSection}>\n          <SliderInput\n            label=\"Frequency\"\n            value={filterFreq}\n            min={10}\n            max={5000}\n            step={10}\n            unit=\"Hz\"\n            onChange={setFilterFreq}\n          />\n\n          {filterType !== 'lowshelf' && filterType !== 'highshelf' && (\n            <SliderInput\n              label=\"Q\"\n              value={filterQ}\n              min={0.1}\n              max={20}\n              step={0.1}\n              onChange={setFilterQ}\n            />\n          )}\n\n          {(filterType === 'peaking' || filterType === 'lowshelf' || filterType === 'highshelf') && (\n            <SliderInput\n              label=\"Gain\"\n              value={filterGain}\n              min={-40}\n              max={40}\n              step={0.5}\n              unit=\"dB\"\n              onChange={setFilterGain}\n            />\n          )}\n        </div>\n      </div>\n    </DetailBox>\n  );\n};\n\nexport default FrequencyResponseGraph;\n"
  },
  {
    "path": "packages/audiodocs/src/examples/Biquad/drawFrequencyResponse.tsx",
    "content": "import { BiquadFilterNode } from 'react-native-audio-api';\n\nexport const drawFrequencyResponse = (\n  canvas: HTMLCanvasElement | null,\n  filter: BiquadFilterNode | null,\n  gridColor = 'rgba(255, 255, 255, 0.15)',\n  responseColor = '#fa7f7c',\n) => {\n  if (!canvas || !filter) return;\n\n  const ctx = canvas.getContext('2d');\n  if (!ctx) return;\n\n  const width = canvas.width;\n  const height = canvas.height;\n\n  const clientW = canvas.clientWidth || 1;\n  const dpr = clientW > 0 ? Math.max(1, canvas.width / clientW) : (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1;\n\n  const N = 200;\n  const frequencies = new Float32Array(N).map((_, i) => 20 * 1000 ** (i / (N - 1)));\n  const mags = new Float32Array(N);\n  const phases = new Float32Array(N);\n  filter.getFrequencyResponse(frequencies, mags, phases);\n\n  const line = (x1: number, y1: number, x2: number, y2: number) => {\n    ctx.beginPath();\n    ctx.moveTo(x1, y1);\n    ctx.lineTo(x2, y2);\n    ctx.stroke();\n  };\n\n  ctx.clearRect(0, 0, width, height);\n  ctx.strokeStyle = gridColor;\n  ctx.lineWidth = 1 * dpr;\n\n  const numGridLines = 11;\n  for (let i = 0; i < numGridLines; i++) {\n    const x = (i / (numGridLines - 1)) * width;\n    line(x, 0, x, height);\n  }\n\n  const dBMarks = [-30, -20, -10, 0, 10, 20, 30];\n  for (let i = 0; i < dBMarks.length; i++) {\n    const y = (i / (dBMarks.length - 1)) * height;\n    line(0, y, width, y);\n  }\n\n  ctx.beginPath();\n  mags.forEach((m, i) => {\n    const x = (i / (mags.length - 1)) * width;\n    const db = 20 * Math.log10(m);\n    const y = height - ((db + 30) / 60) * height;\n    i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y);\n  });\n\n  ctx.strokeStyle = responseColor;\n  ctx.lineWidth = 2 * dpr;\n  ctx.stroke();\n};\n"
  },
  {
    "path": "packages/audiodocs/src/examples/LetsMakeSomeNoise/Component.tsx",
    "content": "import React, { useRef } from 'react';\nimport { Button, View } from 'react-native';\nimport { AudioBufferSourceNode, AudioContext } from 'react-native-audio-api';\n\nexport default function App() {\n  const absnRef = useRef<AudioBufferSourceNode | null>(null);\n\n  const handlePlay = async () => {\n    if (absnRef.current) {\n      absnRef.current.stop();\n    }\n\n    const audioContext = new AudioContext();\n\n    const audioBuffer = await fetch('/react-native-audio-api/audio/music/example-music-01.mp3')\n      .then((response) => response.arrayBuffer())\n      .then((arrayBuffer) => audioContext.decodeAudioData(arrayBuffer));\n\n    const playerNode = await audioContext.createBufferSource();\n    playerNode.buffer = audioBuffer;\n\n    playerNode.connect(audioContext.destination);\n    playerNode.start(audioContext.currentTime);\n    playerNode.stop(audioContext.currentTime + 10);\n    absnRef.current = playerNode;\n  };\n\n  return (\n    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n      <Button title=\"Play Sound!\" onPress={handlePlay} color=\"#ff6259\" />\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/audiodocs/src/examples/LetsMakeSomeNoise/Source.tsx",
    "content": "import React from 'react';\nimport { View, Button } from 'react-native';\nimport { AudioContext } from 'react-native-audio-api';\n\nexport default function App() {\n  const handlePlay = async () => {\n    const audioContext = new AudioContext();\n\n    const audioBuffer = await fetch('https://software-mansion.github.io/react-native-audio-api/audio/music/example-music-01.mp3')\n      .then((response) => response.arrayBuffer())\n      .then((arrayBuffer) => audioContext.decodeAudioData(arrayBuffer));\n\n    const playerNode = audioContext.createBufferSource();\n    playerNode.buffer = audioBuffer;\n\n    playerNode.connect(audioContext.destination);\n    playerNode.start(audioContext.currentTime);\n  };\n\n  return (\n    <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n      <Button onPress={handlePlay} title=\"Play sound!\" />\n    </View>\n  );\n}\n"
  },
  {
    "path": "packages/audiodocs/src/examples/NoiseGeneration/BrownianNoiseComponent.tsx",
    "content": "import React, { FC, useEffect, useRef } from 'react';\nimport { Pressable, StyleSheet, View } from 'react-native';\nimport { AudioBuffer, AudioBufferSourceNode, AudioContext, GainNode } from 'react-native-audio-api';\n\nconst BrownianNoise: FC = () => {\n  const aCtxRef = useRef<AudioContext | null>(null);\n  const bufferRef = useRef<AudioBuffer | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n  const bufferNodeRef = useRef<AudioBufferSourceNode | null>(null);\n\n  const createBrownianNoise = () => {\n    const aCtx = aCtxRef.current;\n\n    if (!aCtx) {\n      return undefined;\n    }\n\n    const bufferSize = 2 * aCtx.sampleRate;\n    const output = new Float32Array(bufferSize);\n    let lastOut = 0.0;\n\n    for (let i = 0; i < bufferSize; i += 1) {\n      const white = Math.random() * 2 - 1;\n      output[i] = (lastOut + 0.02 * white) / 1.02;\n      lastOut = output[i];\n      output[i] *= 3.5;\n    }\n\n\n    const noiseBuffer = aCtx.createBuffer(1, bufferSize, aCtx.sampleRate);\n    noiseBuffer.copyToChannel(output, 0, 0);\n    return noiseBuffer;\n  }\n\n  const onPressIn = async () => {\n    if (!bufferNodeRef.current) {\n      bufferNodeRef.current = await aCtxRef.current.createBufferSource();\n      bufferNodeRef.current.buffer = bufferRef.current;\n      bufferNodeRef.current.loop = true;\n      bufferNodeRef.current.connect(gainRef.current);\n\n      bufferNodeRef.current.start();\n    }\n  }\n\n  const onPressOut = () => {\n    if (bufferNodeRef.current) {\n      bufferNodeRef.current.stop();\n      bufferNodeRef.current = null;\n    }\n  }\n\n  useEffect(() => {\n    if (!aCtxRef.current) {\n      aCtxRef.current = new AudioContext();\n    }\n\n    if (!bufferRef.current) {\n      bufferRef.current = createBrownianNoise();\n    }\n\n    if (!gainRef.current) {\n      gainRef.current = aCtxRef.current.createGain();\n      gainRef.current.gain.value = 0.3;\n      gainRef.current.connect(aCtxRef.current.destination);\n    }\n  }, []);\n  return (\n    <View style={styles.container}>\n      <Pressable onPressIn={onPressIn} onPressOut={onPressOut}>\n        {({ pressed }) => (\n          <View style={[styles.button, pressed && styles.buttonPressed]} />\n        )}\n      </Pressable>\n    </View>\n  );\n}\n\nexport default BrownianNoise;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  button: {\n    width: 160,\n    height: 160,\n    backgroundColor: 'var(--swm-red-light-100)',\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  buttonPressed: {\n    transform: [{ scale: 1.1 }],\n  },\n});\n"
  },
  {
    "path": "packages/audiodocs/src/examples/NoiseGeneration/BrownianNoiseSource.tsx",
    "content": "import React, { FC, useEffect, useRef } from 'react';\nimport { View, Pressable, StyleSheet } from 'react-native';\nimport { AudioContext, AudioBuffer, GainNode, AudioBufferSourceNode } from 'react-native-audio-api';\n\nconst BrownianNoise: FC = () => {\n  const aCtxRef = useRef<AudioContext | null>(null);\n  const bufferRef = useRef<AudioBuffer | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n  const bufferNodeRef = useRef<AudioBufferSourceNode | null>(null);\n\n  const createBrownianNoise = () => {\n    const aCtx = aCtxRef.current;\n\n    if (!aCtx) {\n      return undefined;\n    }\n\n    const bufferSize = 2 * aCtx.sampleRate;\n    const output = new Float32Array(bufferSize);\n    let lastOut = 0.0;\n\n    for (let i = 0; i < bufferSize; i += 1) {\n      const white = Math.random() * 2 - 1;\n      output[i] = (lastOut + 0.02 * white) / 1.02;\n      lastOut = output[i];\n      output[i] *= 3.5;\n    }\n\n\n    const noiseBuffer = aCtx.createBuffer(1, bufferSize, aCtx.sampleRate);\n    noiseBuffer.copyToChannel(output, 0, 0);\n    return noiseBuffer;\n  }\n\n  const onPressIn = () => {\n    if (!bufferNodeRef.current) {\n      bufferNodeRef.current = aCtxRef.current.createBufferSource();\n      bufferNodeRef.current.buffer = bufferRef.current;\n      bufferNodeRef.current.loop = true;\n      bufferNodeRef.current.connect(gainRef.current);\n\n      bufferNodeRef.current.start();\n    }\n  }\n\n  const onPressOut = () => {\n    if (bufferNodeRef.current) {\n      bufferNodeRef.current.stop();\n      bufferNodeRef.current = null;\n    }\n  }\n\n  useEffect(() => {\n    if (!aCtxRef.current) {\n      aCtxRef.current = new AudioContext();\n    }\n\n    if (!bufferRef.current) {\n      bufferRef.current = createBrownianNoise();\n    }\n\n    if (!gainRef.current) {\n      gainRef.current = aCtxRef.current.createGain();\n      gainRef.current.gain.value = 0.3;\n      gainRef.current.connect(aCtxRef.current.destination);\n    }\n  }, []);\n  return (\n    <View style={styles.container}>\n      <Pressable onPressIn={onPressIn} onPressOut={onPressOut}>\n        {({ pressed }) => (\n          <View style={[styles.button, pressed && styles.buttonPressed]} />\n        )}\n      </Pressable>\n    </View>\n  );\n}\n\nexport default BrownianNoise;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  button: {\n    width: 160,\n    height: 160,\n    backgroundColor: '#b07eff',\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  buttonPressed: {\n    transform: [{ scale: 1.1 }],\n  },\n});\n"
  },
  {
    "path": "packages/audiodocs/src/examples/NoiseGeneration/PinkNoiseComponent.tsx",
    "content": "import React, { FC, useEffect, useRef } from 'react';\nimport { Pressable, StyleSheet, View } from 'react-native';\nimport { AudioBuffer, AudioBufferSourceNode, AudioContext, GainNode } from 'react-native-audio-api';\n\nconst PinkNoise: FC = () => {\n  const aCtxRef = useRef<AudioContext | null>(null);\n  const bufferRef = useRef<AudioBuffer | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n  const bufferNodeRef = useRef<AudioBufferSourceNode | null>(null);\n\n  const createPinkNoise = () => {\n    const aCtx = aCtxRef.current;\n\n    if (!aCtx) {\n      return undefined;\n    }\n\n    const bufferSize = 2 * aCtx.sampleRate;\n    const output = new Float32Array(bufferSize);\n\n    let b0, b1, b2, b3, b4, b5, b6;\n    b0 = b1 = b2 = b3 = b4 = b5 = b6 = 0.0;\n\n    for (let i = 0; i < bufferSize; i += 1) {\n      const white = Math.random() * 2 - 1;\n\n      b0 = 0.99886 * b0 + white * 0.0555179;\n      b1 = 0.99332 * b1 + white * 0.0750759;\n      b2 = 0.969 * b2 + white * 0.153852;\n      b3 = 0.8665 * b3 + white * 0.3104856;\n      b4 = 0.55 * b4 + white * 0.5329522;\n      b5 = -0.7616 * b5 - white * 0.016898;\n\n      output[i] = 0.11 * (b0 + b1 + b2 + b3 + b4 + b5 + b6 + white * 0.5362);\n      b6 = white * 0.115926;\n    }\n\n    const noiseBuffer = aCtx.createBuffer(1, bufferSize, aCtx.sampleRate);\n    noiseBuffer.copyToChannel(output, 0, 0);\n    return noiseBuffer;\n  }\n\n  const onPressIn = async () => {\n    if (!bufferNodeRef.current) {\n      bufferNodeRef.current = await aCtxRef.current.createBufferSource();\n      bufferNodeRef.current.buffer = bufferRef.current;\n      bufferNodeRef.current.loop = true;\n      bufferNodeRef.current.connect(gainRef.current);\n\n      bufferNodeRef.current.start();\n    }\n  }\n\n  const onPressOut = () => {\n    if (bufferNodeRef.current) {\n      bufferNodeRef.current.stop();\n      bufferNodeRef.current = null;\n    }\n  }\n\n  useEffect(() => {\n    if (!aCtxRef.current) {\n      aCtxRef.current = new AudioContext();\n    }\n\n    if (!bufferRef.current) {\n      bufferRef.current = createPinkNoise();\n    }\n\n    if (!gainRef.current) {\n      gainRef.current = aCtxRef.current.createGain();\n      gainRef.current.gain.value = 0.3;\n      gainRef.current.connect(aCtxRef.current.destination);\n    }\n  }, []);\n  return (\n    <View style={styles.container}>\n      <Pressable onPressIn={onPressIn} onPressOut={onPressOut}>\n        {({ pressed }) => (\n          <View style={[styles.button, pressed && styles.buttonPressed]} />\n        )}\n      </Pressable>\n    </View>\n  );\n}\n\nexport default PinkNoise;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  button: {\n    width: 160,\n    height: 160,\n    backgroundColor: 'var(--swm-red-light-100)',\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  buttonPressed: {\n    transform: [{ scale: 1.1 }],\n  },\n});\n"
  },
  {
    "path": "packages/audiodocs/src/examples/NoiseGeneration/PinkNoiseSource.tsx",
    "content": "import React, { FC, useEffect, useRef } from 'react';\nimport { View, Pressable, StyleSheet } from 'react-native';\nimport { AudioContext, AudioBuffer, GainNode, AudioBufferSourceNode } from 'react-native-audio-api';\n\nconst PinkNoise: FC = () => {\n  const aCtxRef = useRef<AudioContext | null>(null);\n  const bufferRef = useRef<AudioBuffer | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n  const bufferNodeRef = useRef<AudioBufferSourceNode | null>(null);\n\n  const createPinkNoise = () => {\n    const aCtx = aCtxRef.current;\n\n    if (!aCtx) {\n      return undefined;\n    }\n\n    const bufferSize = 2 * aCtx.sampleRate;\n    const output = new Float32Array(bufferSize);\n\n    let b0, b1, b2, b3, b4, b5, b6;\n    b0 = b1 = b2 = b3 = b4 = b5 = b6 = 0.0;\n\n    for (let i = 0; i < bufferSize; i += 1) {\n      const white = Math.random() * 2 - 1;\n\n      b0 = 0.99886 * b0 + white * 0.0555179;\n      b1 = 0.99332 * b1 + white * 0.0750759;\n      b2 = 0.969 * b2 + white * 0.153852;\n      b3 = 0.8665 * b3 + white * 0.3104856;\n      b4 = 0.55 * b4 + white * 0.5329522;\n      b5 = -0.7616 * b5 - white * 0.016898;\n\n      output[i] = 0.11 * (b0 + b1 + b2 + b3 + b4 + b5 + b6 + white * 0.5362);\n      b6 = white * 0.115926;\n    }\n\n    const noiseBuffer = aCtx.createBuffer(1, bufferSize, aCtx.sampleRate);\n    noiseBuffer.copyToChannel(output, 0, 0);\n    return noiseBuffer;\n  }\n\n  const onPressIn = () => {\n    if (!bufferNodeRef.current) {\n      bufferNodeRef.current = aCtxRef.current.createBufferSource();\n      bufferNodeRef.current.buffer = bufferRef.current;\n      bufferNodeRef.current.loop = true;\n      bufferNodeRef.current.connect(gainRef.current);\n\n      bufferNodeRef.current.start();\n    }\n  }\n\n  const onPressOut = () => {\n    if (bufferNodeRef.current) {\n      bufferNodeRef.current.stop();\n      bufferNodeRef.current = null;\n    }\n  }\n\n  useEffect(() => {\n    if (!aCtxRef.current) {\n      aCtxRef.current = new AudioContext();\n    }\n\n    if (!bufferRef.current) {\n      bufferRef.current = createPinkNoise();\n    }\n\n    if (!gainRef.current) {\n      gainRef.current = aCtxRef.current.createGain();\n      gainRef.current.gain.value = 0.3;\n      gainRef.current.connect(aCtxRef.current.destination);\n    }\n  }, []);\n  return (\n    <View style={styles.container}>\n      <Pressable onPressIn={onPressIn} onPressOut={onPressOut}>\n        {({ pressed }) => (\n          <View style={[styles.button, pressed && styles.buttonPressed]} />\n        )}\n      </Pressable>\n    </View>\n  );\n}\n\nexport default PinkNoise;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  button: {\n    width: 160,\n    height: 160,\n    backgroundColor: '#b07eff',\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  buttonPressed: {\n    transform: [{ scale: 1.1 }],\n  },\n});\n"
  },
  {
    "path": "packages/audiodocs/src/examples/NoiseGeneration/WhiteNoiseComponent.tsx",
    "content": "import React, { FC, useEffect, useRef } from 'react';\nimport { Pressable, StyleSheet, View } from 'react-native';\nimport { AudioBuffer, AudioBufferSourceNode, AudioContext, GainNode } from 'react-native-audio-api';\n\nconst WhiteNoise: FC = () => {\n  const aCtxRef = useRef<AudioContext | null>(null);\n  const bufferRef = useRef<AudioBuffer | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n  const bufferNodeRef = useRef<AudioBufferSourceNode | null>(null);\n\n  const createWhiteNoise = () => {\n    const aCtx = aCtxRef.current;\n\n    if (!aCtx) {\n      return undefined;\n    }\n\n    const bufferSize = 2 * aCtx.sampleRate;\n    const output = new Float32Array(bufferSize);\n\n    for (let i = 0; i < bufferSize; i += 1) {\n      output[i] = Math.random() * 2 - 1;\n    }\n\n    const noiseBuffer = aCtx.createBuffer(1, bufferSize, aCtx.sampleRate);\n    noiseBuffer.copyToChannel(output, 0, 0);\n    return noiseBuffer;\n  }\n\n  const onPressIn = async () => {\n    if (!bufferNodeRef.current) {\n      bufferNodeRef.current = await aCtxRef.current.createBufferSource();\n      bufferNodeRef.current.buffer = bufferRef.current;\n      bufferNodeRef.current.loop = true;\n      bufferNodeRef.current.connect(gainRef.current);\n\n      bufferNodeRef.current.start();\n    }\n  }\n\n  const onPressOut = () => {\n    if (bufferNodeRef.current) {\n      bufferNodeRef.current.stop();\n      bufferNodeRef.current = null;\n    }\n  }\n\n  useEffect(() => {\n    if (!aCtxRef.current) {\n      aCtxRef.current = new AudioContext();\n    }\n\n    if (!bufferRef.current) {\n      bufferRef.current = createWhiteNoise();\n    }\n\n    if (!gainRef.current) {\n      gainRef.current = aCtxRef.current.createGain();\n      gainRef.current.gain.value = 0.05;\n      gainRef.current.connect(aCtxRef.current.destination);\n    }\n  }, []);\n  return (\n    <View style={styles.container}>\n      <Pressable onPressIn={onPressIn} onPressOut={onPressOut}>\n        {({ pressed }) => (\n          <View style={[styles.button, pressed && styles.buttonPressed]} />\n        )}\n      </Pressable>\n    </View>\n  );\n}\n\nexport default WhiteNoise;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  button: {\n    width: 160,\n    height: 160,\n    backgroundColor: 'var(--swm-red-light-100)',\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  buttonPressed: {\n    transform: [{ scale: 1.1 }],\n  },\n});\n"
  },
  {
    "path": "packages/audiodocs/src/examples/NoiseGeneration/WhiteNoiseSource.tsx",
    "content": "import React, { FC, useEffect, useRef } from 'react';\nimport { View, Pressable, StyleSheet } from 'react-native';\nimport { AudioContext, AudioBuffer, GainNode, AudioBufferSourceNode } from 'react-native-audio-api';\n\nconst WhiteNoise: FC = () => {\n  const aCtxRef = useRef<AudioContext | null>(null);\n  const bufferRef = useRef<AudioBuffer | null>(null);\n  const gainRef = useRef<GainNode | null>(null);\n  const bufferNodeRef = useRef<AudioBufferSourceNode | null>(null);\n\n  const createWhiteNoise = () => {\n    const aCtx = aCtxRef.current;\n\n    if (!aCtx) {\n      return undefined;\n    }\n\n    const bufferSize = 2 * aCtx.sampleRate;\n    const output = new Float32Array(bufferSize);\n\n    for (let i = 0; i < bufferSize; i += 1) {\n      output[i] = Math.random() * 2 - 1;\n    }\n\n    const noiseBuffer = aCtx.createBuffer(1, bufferSize, aCtx.sampleRate);\n    noiseBuffer.copyToChannel(output, 0, 0);\n    return noiseBuffer;\n  }\n\n  const onPressIn = () => {\n    if (!bufferNodeRef.current) {\n      bufferNodeRef.current = aCtxRef.current.createBufferSource();\n      bufferNodeRef.current.buffer = bufferRef.current;\n      bufferNodeRef.current.loop = true;\n      bufferNodeRef.current.connect(gainRef.current);\n\n      bufferNodeRef.current.start();\n    }\n  }\n\n  const onPressOut = () => {\n    if (bufferNodeRef.current) {\n      bufferNodeRef.current.stop();\n      bufferNodeRef.current = null;\n    }\n  }\n\n  useEffect(() => {\n    if (!aCtxRef.current) {\n      aCtxRef.current = new AudioContext();\n    }\n\n    if (!bufferRef.current) {\n      bufferRef.current = createWhiteNoise();\n    }\n\n    if (!gainRef.current) {\n      gainRef.current = aCtxRef.current.createGain();\n      gainRef.current.gain.value = 0.3;\n      gainRef.current.connect(aCtxRef.current.destination);\n    }\n  }, []);\n  return (\n    <View style={styles.container}>\n      <Pressable onPressIn={onPressIn} onPressOut={onPressOut}>\n        {({ pressed }) => (\n          <View style={[styles.button, pressed && styles.buttonPressed]} />\n        )}\n      </Pressable>\n    </View>\n  );\n}\n\nexport default WhiteNoise;\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  button: {\n    width: 160,\n    height: 160,\n    backgroundColor: '#b07eff',\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  buttonPressed: {\n    transform: [{ scale: 1.1 }],\n  },\n});\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SeeYourSound/BaseComponent.tsx",
    "content": "import React, {\n  createContext,\n  useEffect,\n  useRef,\n  useState\n} from 'react';\nimport { ActivityIndicator, Button, View } from 'react-native';\nimport {\n  AudioBuffer,\n  AudioBufferSourceNode,\n  AudioContext,\n} from 'react-native-audio-api';\n\ninterface Size {\n  width: number;\n  height: number;\n}\n\ninterface CanvasContext {\n  initialized: boolean;\n  size: Size;\n}\n\nconst CanvasContext = createContext<CanvasContext>({\n  initialized: false,\n  size: { width: 0, height: 0 },\n});\n\nconst Canvas: React.FC<React.PropsWithChildren<{}>> = ({ children }) => {\n  const [size, setSize] = useState<Size>({ width: 0, height: 0 });\n  const ref = useRef<HTMLCanvasElement>(null);\n\n  useEffect(() => {\n    const handleResize = () => {\n      if (ref.current) {\n        const { width, height } = ref.current.getBoundingClientRect();\n        setSize({ width, height });\n      }\n    };\n\n    window.addEventListener('resize', handleResize);\n    handleResize();\n\n    return () => window.removeEventListener('resize', handleResize);\n  }, [ref]);\n\n  const contextValue = { initialized: true, size };\n\n  return (\n    <canvas ref={ref} style={{ backgroundColor: 'white', width: '100%', height: '100%' }}>\n      <CanvasContext.Provider value={contextValue}>\n        {children}\n      </CanvasContext.Provider>\n    </canvas>\n  );\n};\n\nconst AudioVisualizer: React.FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n  const audioBufferRef = useRef<AudioBuffer | null>(null);\n\n  const handlePlayPause = async () => {\n    if (isPlaying) {\n      bufferSourceRef.current?.stop();\n    } else {\n      if (!audioContextRef.current) {\n        return\n      }\n\n      bufferSourceRef.current = await audioContextRef.current.createBufferSource();\n      bufferSourceRef.current.buffer = audioBufferRef.current;\n      bufferSourceRef.current.connect(audioContextRef.current.destination);\n\n      bufferSourceRef.current.start();\n    }\n\n    setIsPlaying((prev) => !prev);\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    const fetchBuffer = async () => {\n      setIsLoading(true);\n      audioBufferRef.current = await fetch('/react-native-audio-api/audio/music/example-music-02.mp3')\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        )\n\n      setIsLoading(false);\n    };\n\n    fetchBuffer();\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View>\n      <View style={{ flex: 0.2 }} />\n      <Canvas>\n\n      </Canvas>\n      <View\n        style={{ flex: 0.5, justifyContent: 'center', alignItems: 'center' }}>\n        {isLoading && <ActivityIndicator color=\"#FFFFFF\" />}\n        <View style={{\n            justifyContent: 'center',\n            flexDirection: 'row',\n            marginTop: 16,\n          }}>\n        <Button\n            onPress={handlePlayPause}\n            title={isPlaying ? 'Pause' : 'Play'}\n            disabled={!audioBufferRef.current}\n            color=\"#ff6259\"\n          />\n        </View>\n      </View>\n    </View>\n  );\n};\n\nexport default AudioVisualizer;\n\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SeeYourSound/BaseSource.tsx",
    "content": "import React, {\n  useState,\n  useEffect,\n  useRef,\n  useContext,\n  useMemo,\n  createContext,\n  PropsWithChildren\n} from 'react';\nimport {\n  AudioContext,\n  AudioBuffer,\n  AudioBufferSourceNode,\n} from 'react-native-audio-api';\nimport { ActivityIndicator, View, Button, LayoutChangeEvent } from 'react-native';\nimport { Canvas as SKCanvas } from '@shopify/react-native-skia';\n\ninterface Size {\n  width: number;\n  height: number;\n}\n\ninterface CanvasContext {\n  initialized: boolean;\n  size: Size;\n}\n\nconst CanvasContext = createContext<CanvasContext>({\n  initialized: false,\n  size: { width: 0, height: 0 },\n});\n\nconst Canvas: React.FC<PropsWithChildren> = ({ children }) => {\n  const [size, setSize] = useState<Size>({ width: 0, height: 0 });\n\n  const onCanvasLayout = (event: LayoutChangeEvent) => {\n    const { width, height } = event.nativeEvent.layout;\n\n    setSize({ width, height });\n  };\n\n  const context = useMemo(\n    () => ({\n      initialized: true,\n      size: { width: size.width, height: size.height },\n    }),\n    [size.width, size.height]\n  );\n\n  return (\n    <SKCanvas style={{flex: 1}} onLayout={onCanvasLayout}>\n      <CanvasContext.Provider value={context}>\n        {children}\n      </CanvasContext.Provider>\n    </SKCanvas>\n  );\n};\n\nconst AudioVisualizer: React.FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n  const audioBufferRef = useRef<AudioBuffer | null>(null);\n\n  const handlePlayPause = () => {\n    if (isPlaying) {\n      bufferSourceRef.current?.stop();\n    } else {\n      if (!audioContextRef.current) {\n        return\n      }\n\n      bufferSourceRef.current = audioContextRef.current.createBufferSource();\n      bufferSourceRef.current.buffer = audioBufferRef.current;\n      bufferSourceRef.current.connect(audioContextRef.current.destination);\n\n      bufferSourceRef.current.start();\n    }\n\n    setIsPlaying((prev) => !prev);\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    const fetchBuffer = async () => {\n      setIsLoading(true);\n      audioBufferRef.current = await fetch('https://software-mansion.github.io/react-native-audio-api/audio/music/example-music-02.mp3')\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        )\n\n      setIsLoading(false);\n    };\n\n    fetchBuffer();\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View>\n      <View style={{ flex: 0.2 }} />\n      <Canvas>\n      </Canvas>\n      <View\n        style={{ flex: 0.5, justifyContent: 'center', alignItems: 'center' }}>\n        {isLoading && <ActivityIndicator color=\"#FFFFFF\" />}\n        <View style={{\n            justifyContent: 'center',\n            flexDirection: 'row',\n            marginTop: 16,\n          }}>\n        <Button\n            onPress={handlePlayPause}\n            title={isPlaying ? 'Pause' : 'Play'}\n            disabled={!audioBufferRef.current}\n          />\n        </View>\n      </View>\n    </View>\n  );\n};\n\nexport default AudioVisualizer;\n\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SeeYourSound/CanvasSizerComponent.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\n\nconst CanvasSizer = ({ canvasHeight, children }) => {\n  const containerRef = useRef(null);\n  const [dimensions, setDimensions] = useState({ width: 0, height: 0 });\n\n  useEffect(() => {\n    const container = containerRef.current;\n\n    if (!window.ResizeObserver) {\n      console.error('ResizeObserver is not supported in your browser.');\n      return;\n    }\n\n    const resizeObserver = new ResizeObserver((entries) => {\n      for (let entry of entries) {\n        setDimensions({\n          width: entry.contentRect.width,\n          height: entry.contentRect.height,\n        });\n      }\n    });\n\n    if (container) {\n      resizeObserver.observe(container);\n    }\n\n    return () => {\n      resizeObserver.disconnect();\n    };\n  }, []);\n\n  return (\n    <div ref={containerRef} style={{ height: canvasHeight }}>\n      {children(dimensions)}\n    </div>\n  );\n};\n\nexport default CanvasSizer;"
  },
  {
    "path": "packages/audiodocs/src/examples/SeeYourSound/FrequencyDomainComponent.tsx",
    "content": "import React, {\n  useEffect,\n  useRef,\n  useState,\n} from 'react';\nimport { ActivityIndicator, Button, View } from 'react-native';\nimport {\n  AnalyserNode,\n  AudioBuffer,\n  AudioBufferSourceNode,\n  AudioContext,\n} from 'react-native-audio-api';\nimport CanvasSizer from './CanvasSizerComponent';\n\ninterface ChartProps {\n  data: Uint8Array;\n  dataSize: number;\n}\n\nconst FrequencyChart: React.FC<ChartProps> = ({ data, dataSize }) => {\n  const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n  useEffect(() => {\n    const canvas = canvasRef.current;\n    if (!canvas) return;\n\n    const dpr = (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1;\n\n    const cssWidth = Number(canvas.dataset.cssWidth) || (canvas.clientWidth || 300);\n    const cssHeight = Number(canvas.dataset.cssHeight) || (canvas.clientHeight || 150);\n\n    const scaledWidth = Math.max(1, Math.floor(cssWidth * dpr));\n    const scaledHeight = Math.max(1, Math.floor(cssHeight * dpr));\n\n    canvas.width = scaledWidth;\n    canvas.height = scaledHeight;\n\n    const ctx = canvas.getContext('2d');\n    if (!ctx) return;\n\n    ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n    const barWidth = canvas.width / dataSize;\n\n    for (let i = 0; i < data.length && i < dataSize; i++) {\n      const value = data[i];\n      const height = canvas.height * (value / 256);\n      const offset = canvas.height - height;\n      const hue = (i / dataSize) * 300;\n      ctx.fillStyle = `hsl(${hue}, 100%, 50%)`;\n      ctx.fillRect(i * barWidth, offset, Math.max(1, barWidth), height);\n    }\n  }, [data, dataSize]);\n\n  return (\n    <CanvasSizer canvasHeight={300}>\n      {({ width, height }) => {\n        const dpr = (typeof window !== 'undefined' && window.devicePixelRatio) ? window.devicePixelRatio : 1;\n        const scaledWidth = Math.max(1, Math.floor(width * dpr));\n        const scaledHeight = Math.max(1, Math.floor(height * dpr));\n\n        const containerStyle: React.CSSProperties = {\n          width: `${width}px`,\n          height: `${height}px`,\n          overflow: 'hidden',\n        };\n\n        const canvasStyle: React.CSSProperties = {\n          width: `${scaledWidth}px`,\n          height: `${scaledHeight}px`,\n          transform: `scale(${1 / dpr})`,\n          transformOrigin: 'top left',\n          display: 'block',\n        };\n\n        return (\n          <div style={containerStyle}>\n            <canvas\n              ref={canvasRef}\n              width={scaledWidth}\n              height={scaledHeight}\n              data-css-width={width}\n              data-css-height={height}\n              style={canvasStyle}\n            />\n          </div>\n        );\n      }}\n    </CanvasSizer>\n  );\n};\n\nconst FFT_SIZE = 512;\n\nconst AudioVisualizer: React.FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n  const [freqs, setFreqs] = useState<Uint8Array>(\n    new Uint8Array(FFT_SIZE / 2).fill(0)\n  );\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n  const audioBufferRef = useRef<AudioBuffer | null>(null);\n  const analyserRef = useRef<AnalyserNode | null>(null);\n\n\n  const handlePlayPause = async () => {\n    if (isPlaying) {\n      bufferSourceRef.current?.stop();\n    } else {\n      if (!audioContextRef.current || !analyserRef.current) {\n        return\n      }\n\n      bufferSourceRef.current = await audioContextRef.current.createBufferSource();\n      bufferSourceRef.current.buffer = audioBufferRef.current;\n      bufferSourceRef.current.connect(analyserRef.current);\n\n      bufferSourceRef.current.start();\n\n      requestAnimationFrame(draw);\n    }\n\n    setIsPlaying((prev) => !prev);\n  };\n\n  const draw = () => {\n    if (!analyserRef.current) {\n      return;\n    }\n\n    const frequencyArrayLength = analyserRef.current.frequencyBinCount;\n\n    const freqsArray = new Uint8Array(frequencyArrayLength);\n    analyserRef.current.getByteFrequencyData(freqsArray);\n    setFreqs(freqsArray);\n\n    requestAnimationFrame(draw);\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    if (!analyserRef.current) {\n      analyserRef.current = audioContextRef.current.createAnalyser();\n      analyserRef.current.fftSize = FFT_SIZE;\n      analyserRef.current.smoothingTimeConstant = 0.8;\n\n      analyserRef.current.connect(audioContextRef.current.destination);\n    }\n\n    const fetchBuffer = async () => {\n      setIsLoading(true);\n      audioBufferRef.current = await fetch('/react-native-audio-api/audio/music/example-music-02.mp3')\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        )\n\n      setIsLoading(false);\n    };\n\n    fetchBuffer();\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View>\n      <FrequencyChart data={freqs} dataSize={FFT_SIZE / 2} />\n      <View\n        style={{ flex: 0.5, justifyContent: 'center', alignItems: 'center' }}>\n        {isLoading && <ActivityIndicator color=\"#FFFFFF\" />}\n        <View style={{\n            justifyContent: 'center',\n            flexDirection: 'row',\n            marginTop: 16,\n          }}>\n        <Button\n            onPress={handlePlayPause}\n            title={isPlaying ? 'Pause' : 'Play'}\n            disabled={!audioBufferRef.current}\n            color=\"#ff6259\"\n          />\n        </View>\n      </View>\n    </View>\n  );\n};\n\nexport default AudioVisualizer;\n\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SeeYourSound/FrequencyDomainSource.tsx",
    "content": "import React, {\n  useState,\n  useEffect,\n  useRef,\n  useMemo,\n} from 'react';\nimport {\n  AudioContext,\n  AudioBuffer,\n  AudioBufferSourceNode,\n  AnalyserNode,\n} from 'react-native-audio-api';\nimport { ActivityIndicator, View, Button, LayoutChangeEvent } from 'react-native';\nimport { Canvas as SKCanvas, vec, Line } from '@shopify/react-native-skia';\n\ninterface Size {\n  width: number;\n  height: number;\n}\n\ninterface Point {\n  x1: number;\n  y1: number;\n  x2: number;\n  y2: number;\n  color: string;\n}\n\ninterface ChartProps {\n  data: Uint8Array;\n  dataSize: number;\n}\n\nconst FrequencyChart: React.FC<ChartProps> = (props) => {\n  const [size, setSize] = useState<Size>({ width: 0, height: 0 });\n  const { data, dataSize } = props;\n\n  const onCanvasLayout = (event: LayoutChangeEvent) => {\n    const { width, height } = event.nativeEvent.layout;\n\n    setSize({ width, height });\n  };\n\n  const barWidth = size.width / dataSize;\n\n  const points = useMemo(() => {\n    const p: Point[] = [];\n\n    data.forEach((value, index) => {\n      const x = index * barWidth;\n      const y1 = size.height;\n      const y2 = size.height - size.height * (value / 256);\n\n      const hue = (index / dataSize) * 360;\n      const color = `hsl(${hue}, 100%, 50%)`;\n\n      p.push({ x1: x, y1, x2: x, y2, color });\n    });\n\n    return p;\n  }, [size, data, dataSize]);\n\n  return (\n    <SKCanvas style={{ flex: 1 }} onLayout={onCanvasLayout}>\n      {points.map((point, index) => (\n        <Line\n          key={index}\n          p1={vec(point.x1, point.y1)}\n          p2={vec(point.x2, point.y2)}\n          style=\"stroke\"\n          color={point.color}\n          strokeWidth={barWidth}\n        />\n      ))}\n    </SKCanvas>\n  );\n}\n\nconst FFT_SIZE = 512;\n\nconst AudioVisualizer: React.FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n  const [freqs, setFreqs] = useState<Uint8Array>(\n    new Uint8Array(FFT_SIZE / 2).fill(0)\n  );\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n  const audioBufferRef = useRef<AudioBuffer | null>(null);\n  const analyserRef = useRef<AnalyserNode | null>(null);\n\n  const handlePlayPause = () => {\n    if (isPlaying) {\n      bufferSourceRef.current?.stop();\n    } else {\n      if (!audioContextRef.current || !analyserRef.current) {\n        return\n      }\n\n      bufferSourceRef.current = audioContextRef.current.createBufferSource();\n      bufferSourceRef.current.buffer = audioBufferRef.current;\n      bufferSourceRef.current.connect(analyserRef.current);\n\n      bufferSourceRef.current.start();\n\n      requestAnimationFrame(draw);\n    }\n\n    setIsPlaying((prev) => !prev);\n  };\n\n  const draw = () => {\n    if (!analyserRef.current) {\n      return;\n    }\n\n    const frequencyArrayLength = analyserRef.current.frequencyBinCount;\n\n    const freqsArray = new Uint8Array(frequencyArrayLength);\n    analyserRef.current.getByteFrequencyData(freqsArray);\n    setFreqs(freqsArray);\n\n    requestAnimationFrame(draw);\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    if (!analyserRef.current) {\n      analyserRef.current = audioContextRef.current.createAnalyser();\n      analyserRef.current.fftSize = FFT_SIZE;\n      analyserRef.current.smoothingTimeConstant = 0.8;\n\n      analyserRef.current.connect(audioContextRef.current.destination);\n    }\n\n    const fetchBuffer = async () => {\n      setIsLoading(true);\n      audioBufferRef.current = await fetch('https://software-mansion.github.io/react-native-audio-api/audio/music/example-music-02.mp3')\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        )\n\n      setIsLoading(false);\n    };\n\n    fetchBuffer();\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View style={{ flex: 1}}>\n      <View style={{ flex: 0.2 }} />\n      <FrequencyChart data={freqs} dataSize={FFT_SIZE / 2} />\n      <View\n        style={{ flex: 0.5, justifyContent: 'center', alignItems: 'center' }}>\n        {isLoading && <ActivityIndicator color=\"#FFFFFF\" />}\n        <View\n          style={{\n            justifyContent: 'center',\n            flexDirection: 'row',\n            marginTop: 16,\n          }}>\n        <Button\n            onPress={handlePlayPause}\n            title={isPlaying ? 'Pause' : 'Play'}\n            disabled={!audioBufferRef.current}\n            color={'#38acdd'}\n          />\n        </View>\n      </View>\n    </View>\n  );\n};\n\nexport default AudioVisualizer;\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SeeYourSound/TimeDomainComponent.tsx",
    "content": "import React, {\n  useCallback,\n  useEffect,\n  useRef,\n  useState,\n} from 'react';\nimport { ActivityIndicator, Button, View } from 'react-native';\nimport {\n  AnalyserNode,\n  AudioBuffer,\n  AudioBufferSourceNode,\n  AudioContext,\n} from 'react-native-audio-api';\nimport CanvasSizer from './CanvasSizerComponent';\n\ninterface ChartProps {\n  data: Uint8Array;\n  dataSize: number;\n}\n\nconst TimeChart: React.FC<ChartProps> = (props) => {\n  const { data, dataSize } = props;\n\n  const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n  useEffect(() => {\n    const canvas = canvasRef.current;\n    if (!canvas) return;\n\n    const dpr =\n      typeof window !== 'undefined' && window.devicePixelRatio\n        ? window.devicePixelRatio\n        : 1;\n\n    const cssWidth = Number(canvas.dataset.cssWidth) || canvas.clientWidth || 300;\n    const cssHeight = Number(canvas.dataset.cssHeight) || canvas.clientHeight || 150;\n\n    const scaledWidth = Math.max(1, Math.floor(cssWidth * dpr));\n    const scaledHeight = Math.max(1, Math.floor(cssHeight * dpr));\n\n    if (canvas.width !== scaledWidth) canvas.width = scaledWidth;\n    if (canvas.height !== scaledHeight) canvas.height = scaledHeight;\n\n    const ctx = canvas.getContext('2d');\n    if (!ctx) return;\n\n    ctx.clearRect(0, 0, canvas.width, canvas.height);\n    ctx.beginPath();\n\n    const maxWidth = canvas.width;\n    const maxHeight = canvas.height;\n\n    for (let i = 0; i < data.length && i < dataSize; i++) {\n      const value = data[i];\n      const x = (i * maxWidth) / dataSize;\n      const y = maxHeight - (value / 255) * maxHeight;\n      if (i === 0) ctx.moveTo(x, y);\n      else ctx.lineTo(x, y);\n    }\n\n    // Keep stroke thickness consistent in CSS pixels by scaling with dpr\n    ctx.strokeStyle = '#B5E1F1';\n    ctx.lineWidth = 2 * dpr;\n    ctx.stroke();\n  }, [data, dataSize]);\n\n  return (\n    <CanvasSizer canvasHeight={300}>\n      {({ width, height }) => {\n        const dpr =\n          typeof window !== 'undefined' && window.devicePixelRatio\n            ? window.devicePixelRatio\n            : 1;\n        const scaledWidth = Math.max(1, Math.floor(width * dpr));\n        const scaledHeight = Math.max(1, Math.floor(height * dpr));\n\n        const containerStyle: React.CSSProperties = {\n          width: `${width}px`,\n          height: `${height}px`,\n          overflow: 'hidden',\n        };\n\n        const canvasStyle: React.CSSProperties = {\n          width: `${scaledWidth}px`,\n          height: `${scaledHeight}px`,\n          transform: `scale(${1 / dpr})`,\n          transformOrigin: 'top left',\n          display: 'block',\n        };\n\n        return (\n          <div style={containerStyle}>\n            <canvas\n              ref={canvasRef}\n              width={scaledWidth}\n              height={scaledHeight}\n              data-css-width={width}\n              data-css-height={height}\n              style={canvasStyle}\n            />\n          </div>\n        );\n      }}\n    </CanvasSizer>\n  );\n}\n\nconst FFT_SIZE = 512;\n\nconst AudioVisualizer: React.FC = () => {\n  const isPlayingRef = useRef(false);\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n  const [times, setTimes] = useState<Uint8Array>(new Uint8Array(FFT_SIZE).fill(127));\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n  const audioBufferRef = useRef<AudioBuffer | null>(null);\n  const analyserRef = useRef<AnalyserNode | null>(null);\n\n\n  const handlePlayPause = async () => {\n    if (isPlaying) {\n      bufferSourceRef.current?.stop();\n    } else {\n      if (!audioContextRef.current || !analyserRef.current) {\n        return\n      }\n\n      bufferSourceRef.current = await audioContextRef.current.createBufferSource();\n      bufferSourceRef.current.buffer = audioBufferRef.current;\n      bufferSourceRef.current.connect(analyserRef.current);\n\n      bufferSourceRef.current.start();\n\n      requestAnimationFrame(draw);\n    }\n\n    setIsPlaying((prev) => !prev);\n  };\n\n  useEffect(() => {\n    isPlayingRef.current = isPlaying;\n  }, [isPlaying]);\n\n  const draw = () => {\n    if (!analyserRef.current) {\n      return;\n    }\n\n    const timesArrayLength = analyserRef.current.fftSize;\n\n    const timesArray = new Uint8Array(timesArrayLength);\n    analyserRef.current.getByteTimeDomainData(timesArray);\n    if (isPlayingRef.current) {\n      setTimes(timesArray);\n    }\n\n    requestAnimationFrame(draw);\n  }\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    if (!analyserRef.current) {\n      analyserRef.current = audioContextRef.current.createAnalyser();\n      analyserRef.current.fftSize = FFT_SIZE;\n      analyserRef.current.smoothingTimeConstant = 0.8;\n\n      analyserRef.current.connect(audioContextRef.current.destination);\n    }\n\n    const fetchBuffer = async () => {\n      setIsLoading(true);\n      audioBufferRef.current = await fetch('/react-native-audio-api/audio/music/example-music-02.mp3')\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        )\n\n      setIsLoading(false);\n    };\n\n    fetchBuffer();\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View>\n      <View style={{ flex: 0.2 }} />\n      <TimeChart data={times} dataSize={FFT_SIZE} />\n      <View\n        style={{ flex: 0.5, justifyContent: 'center', alignItems: 'center' }}>\n        {isLoading && <ActivityIndicator color=\"#FFFFFF\" />}\n        <View style={{\n            justifyContent: 'center',\n            flexDirection: 'row',\n            marginTop: 16,\n          }}>\n        <Button\n            onPress={handlePlayPause}\n            title={isPlaying ? 'Pause' : 'Play'}\n            disabled={!audioBufferRef.current}\n            color=\"#ff6259\"\n          />\n        </View>\n      </View>\n    </View>\n  );\n};\n\nexport default AudioVisualizer;\n\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SeeYourSound/TimeDomainSource.tsx",
    "content": "import React, {\n  useState,\n  useEffect,\n  useRef,\n  useMemo,\n} from 'react';\nimport {\n  AudioContext,\n  AudioBuffer,\n  AudioBufferSourceNode,\n  AnalyserNode,\n} from 'react-native-audio-api';\nimport { ActivityIndicator, View, Button, LayoutChangeEvent } from 'react-native';\nimport { Canvas as SKCanvas, vec, Points, SkPoint } from '@shopify/react-native-skia';\n\ninterface Size {\n  width: number;\n  height: number;\n}\n\ninterface ChartProps {\n  data: Uint8Array;\n  dataSize: number;\n}\n\nconst TimeChart: React.FC<ChartProps> = (props) => {\n  const [size, setSize] = useState<Size>({ width: 0, height: 0 });\n  const { data, dataSize } = props;\n\n  const onCanvasLayout = (event: LayoutChangeEvent) => {\n    const { width, height } = event.nativeEvent.layout;\n\n    setSize({ width, height });\n  };\n\n  const points = useMemo(() => {\n    const startWidth = 20;\n    const maxWidth = size.width - 2 * startWidth;\n    const maxHeight = size.height;\n\n    const p: SkPoint[] = [];\n\n    data.forEach((value, index) => {\n      const x = startWidth + (index * maxWidth) / dataSize;\n      const y = maxHeight - (value / 255) * maxHeight;\n\n      p.push(vec(x, y));\n    });\n\n    return p;\n  }, [size, data, dataSize]);\n\n  return (\n    <SKCanvas style={{ flex: 1 }} onLayout={onCanvasLayout}>\n      <Points points={points} mode=\"polygon\" color=\"#B5E1F1\" strokeWidth={2} />\n    </SKCanvas>\n  );\n}\n\nconst FFT_SIZE = 512;\n\nconst AudioVisualizer: React.FC = () => {\n  const [isPlaying, setIsPlaying] = useState(false);\n  const [isLoading, setIsLoading] = useState(false);\n  const [times, setTimes] = useState<Uint8Array>(new Uint8Array(FFT_SIZE).fill(127));\n\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n  const audioBufferRef = useRef<AudioBuffer | null>(null);\n  const analyserRef = useRef<AnalyserNode | null>(null);\n\n  const handlePlayPause = () => {\n    if (isPlaying) {\n      bufferSourceRef.current?.stop();\n    } else {\n      if (!audioContextRef.current || !analyserRef.current) {\n        return\n      }\n\n      bufferSourceRef.current = audioContextRef.current.createBufferSource();\n      bufferSourceRef.current.buffer = audioBufferRef.current;\n      bufferSourceRef.current.connect(analyserRef.current);\n\n      bufferSourceRef.current.start();\n\n      requestAnimationFrame(draw);\n    }\n\n    setIsPlaying((prev) => !prev);\n  };\n\n  const draw = () => {\n    if (!analyserRef.current) {\n      return;\n    }\n\n    const timesArrayLength = analyserRef.current.fftSize;\n    const frequencyArrayLength = analyserRef.current.frequencyBinCount;\n\n    const timesArray = new Uint8Array(timesArrayLength);\n    analyserRef.current.getByteTimeDomainData(timesArray);\n    setTimes(timesArray);\n\n    requestAnimationFrame(draw);\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    if (!analyserRef.current) {\n      analyserRef.current = audioContextRef.current.createAnalyser();\n      analyserRef.current.fftSize = FFT_SIZE;\n      analyserRef.current.smoothingTimeConstant = 0.8;\n\n      analyserRef.current.connect(audioContextRef.current.destination);\n    }\n\n    const fetchBuffer = async () => {\n      setIsLoading(true);\n      audioBufferRef.current = await fetch('https://software-mansion.github.io/react-native-audio-api/audio/music/example-music-02.mp3')\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        )\n\n      setIsLoading(false);\n    };\n\n    fetchBuffer();\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View style={{ flex: 1}}>\n      <View style={{ flex: 0.2 }} />\n      <TimeChart data={times} dataSize={FFT_SIZE} />\n      <View\n        style={{ flex: 0.5, justifyContent: 'center', alignItems: 'center' }}>\n        {isLoading && <ActivityIndicator color=\"#FFFFFF\" />}\n        <View\n          style={{\n            justifyContent: 'center',\n            flexDirection: 'row',\n            marginTop: 16,\n          }}>\n        <Button\n            onPress={handlePlayPause}\n            title={isPlaying ? 'Pause' : 'Play'}\n            disabled={!audioBufferRef.current}\n            color={'#38acdd'}\n          />\n        </View>\n      </View>\n    </View>\n  );\n};\n\nexport default AudioVisualizer;\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SimplePiano/EnvelopesComponent.tsx",
    "content": "import React, { FC, useEffect, useRef } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport {\n  AudioBuffer,\n  AudioBufferSourceNode,\n  AudioContext,\n  GainNode,\n} from 'react-native-audio-api';\n\ntype KeyName = 'A' | 'B' | 'C' | 'D' | 'E';\n\ntype PR<V> = Partial<Record<KeyName, V>>;\n\ninterface ButtonProps {\n  keyName: KeyName;\n  onPressIn: (key: KeyName) => void;\n  onPressOut: (key: KeyName) => void;\n}\n\ninterface PlayingNote {\n  source: AudioBufferSourceNode;\n  envelope: GainNode;\n  startedAt: number;\n}\n\nconst Keys = ['A', 'B', 'C', 'D', 'E'] as const;\n\nconst sourceList: PR<string> = {\n  A: '/react-native-audio-api/audio/sounds/C4.mp3',\n  C: '/react-native-audio-api/audio/sounds/Ds4.mp3',\n  E: '/react-native-audio-api/audio/sounds/Fs4.mp3',\n};\n\nconst Button = ({ onPressIn, onPressOut, keyName }: ButtonProps) => (\n  <Pressable\n    onPressIn={() => onPressIn(keyName)}\n    onPressOut={() => onPressOut(keyName)}\n    style={({ pressed }) => ({\n      margin: 4,\n      padding: 12,\n      borderRadius: 2,\n      backgroundColor: pressed ? '#ff6259' : '#fa7f7c',\n    })}\n  >\n    <Text style={{ color: 'white' }}>{`${keyName}`}</Text>\n  </Pressable>\n);\n\nconst SimplePiano: FC = () => {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const playingNotesRef = useRef<PR<PlayingNote>>({});\n  const bufferMapRef = useRef<PR<AudioBuffer>>({});\n\n  const onKeyPressIn = async (which: KeyName) => {\n    const audioContext = audioContextRef.current;\n    let buffer = bufferMapRef.current[which];\n    const tNow = audioContext.currentTime;\n\n    if (!audioContext || !buffer) {\n      return;\n    }\n\n    const source = await audioContext.createBufferSource();\n    source.buffer = buffer;\n\n    const envelope = audioContext.createGain();\n\n    source.connect(envelope);\n    envelope.connect(audioContext.destination);\n\n    envelope.gain.setValueAtTime(0.001, tNow);\n    envelope.gain.exponentialRampToValueAtTime(1, tNow + 0.1);\n\n    source.start(tNow);\n\n    playingNotesRef.current[which] = { source, envelope, startedAt: tNow };\n  };\n\n  const onKeyPressOut = (which: KeyName) => {\n    const audioContext = audioContextRef.current!;\n    const playingNote = playingNotesRef.current[which];\n\n    if (!playingNote || !audioContext) {\n      return;\n    }\n\n    const { source, envelope, startedAt } = playingNote;\n\n    const tStop = Math.max(audioContext.currentTime, startedAt + 5);\n\n    envelope.gain.exponentialRampToValueAtTime(0.0001, tStop + 0.08);\n    envelope.gain.setValueAtTime(0, tStop + 0.09);\n    source.stop(tStop + 0.1);\n\n    playingNotesRef.current[which] = undefined;\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    Object.entries(sourceList).forEach(async ([key, url]) => {\n      bufferMapRef.current[key as KeyName] = await fetch(url)\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        );\n    });\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        justifyContent: 'center',\n        alignItems: 'center',\n        flexDirection: 'row',\n      }}\n    >\n      {Keys.map((key) => (\n        <Button\n          onPressIn={onKeyPressIn}\n          onPressOut={onKeyPressOut}\n          keyName={key}\n          key={key}\n        />\n      ))}\n    </View>\n  );\n};\n\nexport default SimplePiano;\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SimplePiano/EnvelopesSource.tsx",
    "content": "import { View, Text, Pressable } from 'react-native';\nimport React, { FC, useEffect, useRef } from 'react';\nimport {\n  GainNode,\n  AudioBuffer,\n  AudioContext,\n  AudioBufferSourceNode,\n} from 'react-native-audio-api';\n\ntype KeyName = 'A' | 'B' | 'C' | 'D' | 'E';\n\ntype PR<V> = Partial<Record<KeyName, V>>;\n\ninterface ButtonProps {\n  keyName: KeyName;\n  onPressIn: (key: KeyName) => void;\n  onPressOut: (key: KeyName) => void;\n}\n\ninterface PlayingNote {\n  source: AudioBufferSourceNode;\n  envelope: GainNode;\n  startedAt: number;\n}\n\nconst Keys = ['A', 'B', 'C', 'D', 'E'] as const;\n\nconst sourceList: PR<string> = {\n  A: '/react-native-audio-api/audio/sounds/C4.mp3',\n  C: '/react-native-audio-api/audio/sounds/Ds4.mp3',\n  E: '/react-native-audio-api/audio/sounds/Fs4.mp3',\n};\n\nconst Button = ({ onPressIn, onPressOut, keyName }: ButtonProps) => (\n  <Pressable\n    onPressIn={() => onPressIn(keyName)}\n    onPressOut={() => onPressOut(keyName)}\n    style={({ pressed }) => ({\n      margin: 4,\n      padding: 12,\n      borderRadius: 2,\n      backgroundColor: pressed ? '#d2e6ff' : '#abcdef',\n    })}\n  >\n    <Text style={{ color: 'white' }}>{`${keyName}`}</Text>\n  </Pressable>\n);\n\nconst SimplePiano: FC = () => {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const playingNotesRef = useRef<PR<PlayingNote>>({});\n  const bufferMapRef = useRef<PR<AudioBuffer>>({});\n\n  const onKeyPressIn = (which: KeyName) => {\n    const audioContext = audioContextRef.current;\n    let buffer = bufferMapRef.current[which];\n    const tNow = audioContext.currentTime;\n\n    if (!audioContext || !buffer) {\n      return;\n    }\n\n    const source = audioContext.createBufferSource();\n    source.buffer = buffer;\n\n    const envelope = audioContext.createGain();\n\n    source.connect(envelope);\n    envelope.connect(audioContext.destination);\n\n    envelope.gain.setValueAtTime(0.001, tNow);\n    envelope.gain.exponentialRampToValueAtTime(1, tNow + 0.1);\n\n    source.start(tNow);\n\n    playingNotesRef.current[which] = { source, envelope, startedAt: tNow };\n  };\n\n  const onKeyPressOut = (which: KeyName) => {\n    const audioContext = audioContextRef.current!;\n    const playingNote = playingNotesRef.current[which];\n\n    if (!playingNote || !audioContext) {\n      return;\n    }\n\n    const { source, envelope, startedAt } = playingNote;\n\n    const tStop = Math.max(audioContext.currentTime, startedAt + 5);\n\n    envelope.gain.exponentialRampToValueAtTime(0.0001, tStop + 0.08);\n    envelope.gain.setValueAtTime(0, tStop + 0.09);\n    source.stop(tStop + 0.1);\n\n    playingNotesRef.current[which] = undefined;\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    Object.entries(sourceList).forEach(async ([key, url]) => {\n      bufferMapRef.current[key as KeyName] = await fetch(url)\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        );\n    });\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        justifyContent: 'center',\n        alignItems: 'center',\n        flexDirection: 'row',\n      }}\n    >\n      {Keys.map((key) => (\n        <Button\n          onPressIn={onKeyPressIn}\n          onPressOut={onKeyPressOut}\n          keyName={key}\n          key={key}\n        />\n      ))}\n    </View>\n  );\n};\n\nexport default SimplePiano;\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SimplePiano/FinalComponent.tsx",
    "content": "import React, { FC, useEffect, useRef } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport {\n  AudioBuffer,\n  AudioBufferSourceNode,\n  AudioContext,\n  GainNode,\n} from 'react-native-audio-api';\n\ntype KeyName = 'A' | 'B' | 'C' | 'D' | 'E';\n\ntype PRecord<K extends KeyName, V> = Partial<Record<K, V>>;\n\ninterface ButtonProps {\n  keyName: KeyName;\n  onPressIn: (key: KeyName) => void;\n  onPressOut: (key: KeyName) => void;\n}\n\ninterface PlayingNote {\n  source: AudioBufferSourceNode;\n  envelope: GainNode;\n  startedAt: number;\n}\n\nconst Keys = ['A', 'B', 'C', 'D', 'E'] as const;\n\nconst sourceList: Partial<Record<KeyName, string>> = {\n  A: '/react-native-audio-api/audio/sounds/C4.mp3',\n  C: '/react-native-audio-api/audio/sounds/Ds4.mp3',\n  E: '/react-native-audio-api/audio/sounds/Fs4.mp3',\n};\n\nconst noteToFrequency = {\n  A: 261.626,\n  B: 277.193,\n  C: 311.127,\n  D: 329.628,\n  E: 369.994,\n};\n\nfunction getClosest(key: KeyName) {\n  let closestKey = 'A';\n  let minDiff = noteToFrequency.A - noteToFrequency[key];\n\n  for (const sourcedKey of Object.keys(sourceList)) {\n    const diff = noteToFrequency[sourcedKey] - noteToFrequency[key];\n\n    if (Math.abs(diff) < Math.abs(minDiff)) {\n      minDiff = diff;\n      closestKey = sourcedKey;\n    }\n  }\n\n  return closestKey;\n}\n\nconst Button = ({ onPressIn, onPressOut, keyName }: ButtonProps) => (\n  <Pressable\n    onPressIn={() => onPressIn(keyName)}\n    onPressOut={() => onPressOut(keyName)}\n    style={({ pressed }) => ({\n      margin: 4,\n      padding: 12,\n      borderRadius: 2,\n      backgroundColor: pressed ? '#ff6259' : '#fa7f7c',\n    })}\n  >\n    <Text style={{ color: 'white' }}>{`${keyName}`}</Text>\n  </Pressable>\n);\n\nconst SimplePiano: FC = () => {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferListRef = useRef<PRecord<KeyName, AudioBuffer>>({});\n  const playingNotesRef = useRef<PRecord<KeyName, PlayingNote>>({});\n\n  const onKeyPressIn = async (which: KeyName) => {\n    let buffer = bufferListRef.current[which];\n    const aCtx = audioContextRef.current;\n    let playbackRate = 1;\n\n    if (!aCtx) {\n      return;\n    }\n\n    if (!buffer) {\n      const closestKey = getClosest(which);\n      buffer = bufferListRef.current[closestKey];\n      playbackRate = noteToFrequency[which] / noteToFrequency[closestKey];\n    }\n\n    const source = await aCtx.createBufferSource();\n    const envelope = aCtx.createGain();\n    source.buffer = buffer;\n    source.playbackRate.value = playbackRate;\n\n    const tNow = aCtx.currentTime;\n\n    envelope.gain.setValueAtTime(0.001, tNow);\n    envelope.gain.exponentialRampToValueAtTime(1, tNow + 0.01);\n\n    source.connect(envelope);\n    envelope.connect(aCtx.destination);\n\n    source.start(tNow);\n    playingNotesRef.current[which] = { source, envelope, startedAt: tNow };\n  };\n\n  const onKeyPressOut = (which: KeyName) => {\n    const { source, envelope, startedAt } = playingNotesRef.current[which];\n\n    const aCtx = audioContextRef.current;\n\n    if (!source || !envelope || !aCtx) {\n      return;\n    }\n\n    const tNow = Math.max(aCtx.currentTime, startedAt + 5.0);\n\n    envelope.gain.exponentialRampToValueAtTime(0.0001, tNow + 0.08);\n    envelope.gain.setValueAtTime(0, tNow + 0.09);\n    source.stop(tNow + 0.1);\n\n    playingNotesRef.current[which] = undefined;\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    Object.entries(sourceList).forEach(async ([key, url]) => {\n      bufferListRef.current[key as KeyName] = await fetch(url)\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        );\n    });\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        justifyContent: 'center',\n        alignItems: 'center',\n        flexDirection: 'row',\n      }}\n    >\n      {Keys.map((key) => (\n        <Button\n          onPressIn={onKeyPressIn}\n          onPressOut={onKeyPressOut}\n          keyName={key}\n          key={key}\n        />\n      ))}\n    </View>\n  );\n};\n\nexport default SimplePiano;\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SimplePiano/FinalSource.tsx",
    "content": "import {\n  GainNode,\n  AudioBuffer,\n  AudioContext,\n  AudioBufferSourceNode,\n} from 'react-native-audio-api';\nimport { View, Text, Pressable } from 'react-native';\nimport React, { FC, useEffect, useRef } from 'react';\n\ntype KeyName = 'A' | 'B' | 'C' | 'D' | 'E';\n\ntype PRecord<K extends KeyName, V> = Partial<Record<K, V>>;\n\ninterface ButtonProps {\n  keyName: KeyName;\n  onPressIn: (key: KeyName) => void;\n  onPressOut: (key: KeyName) => void;\n}\n\ninterface PlayingNote {\n  source: AudioBufferSourceNode;\n  envelope: GainNode;\n  startedAt: number;\n}\n\nconst Keys = ['A', 'B', 'C', 'D', 'E'] as const;\n\nconst sourceList: Partial<Record<KeyName, string>> = {\n  A: '/react-native-audio-api/audio/sounds/C4.mp3',\n  C: '/react-native-audio-api/audio/sounds/Ds4.mp3',\n  E: '/react-native-audio-api/audio/sounds/Fs4.mp3',\n};\n\nconst noteToFrequency = {\n  A: 261.626,\n  B: 277.193,\n  C: 311.127,\n  D: 329.628,\n  E: 369.994,\n};\n\nfunction getClosest(key: KeyName) {\n  let closestKey = 'A';\n  let minDiff = noteToFrequency.A - noteToFrequency[key];\n\n  for (const sourcedKey of Object.keys(sourceList)) {\n    const diff = noteToFrequency[sourcedKey] - noteToFrequency[key];\n\n    if (Math.abs(diff) < Math.abs(minDiff)) {\n      minDiff = diff;\n      closestKey = sourcedKey;\n    }\n  }\n\n  return closestKey;\n}\n\nconst Button = ({ onPressIn, onPressOut, keyName }: ButtonProps) => (\n  <Pressable\n    onPressIn={() => onPressIn(keyName)}\n    onPressOut={() => onPressOut(keyName)}\n    style={({ pressed }) => ({\n      margin: 4,\n      padding: 12,\n      borderRadius: 2,\n      backgroundColor: pressed ? '#d2e6ff' : '#abcdef',\n    })}\n  >\n    <Text style={{ color: 'white' }}>{`${keyName}`}</Text>\n  </Pressable>\n);\n\nconst SimplePiano: FC = () => {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferListRef = useRef<PRecord<KeyName, AudioBuffer>>({});\n  const playingNotesRef = useRef<PRecord<KeyName, PlayingNote>>({});\n\n  const onKeyPressIn = (which: KeyName) => {\n    let buffer = bufferListRef.current[which];\n    const aCtx = audioContextRef.current;\n    let playbackRate = 1;\n\n    if (!aCtx) {\n      return;\n    }\n\n    if (!buffer) {\n      const closestKey = getClosest(which);\n      buffer = bufferListRef.current[closestKey];\n      playbackRate = noteToFrequency[which] / noteToFrequency[closestKey];\n    }\n\n    const source = aCtx.createBufferSource();\n    const envelope = aCtx.createGain();\n    source.buffer = buffer;\n    source.playbackRate.value = playbackRate;\n\n    const tNow = aCtx.currentTime;\n\n    envelope.gain.setValueAtTime(0.001, tNow);\n    envelope.gain.exponentialRampToValueAtTime(1, tNow + 0.01);\n\n    source.connect(envelope);\n    envelope.connect(aCtx.destination);\n\n    source.start(tNow);\n    playingNotesRef.current[which] = { source, envelope, startedAt: tNow };\n  };\n\n  const onKeyPressOut = (which: KeyName) => {\n    const { source, envelope, startedAt } = playingNotesRef.current[which];\n\n    const aCtx = audioContextRef.current;\n\n    if (!source || !envelope || !aCtx) {\n      return;\n    }\n\n    const tNow = Math.max(aCtx.currentTime, startedAt + 5);\n\n    envelope.gain.exponentialRampToValueAtTime(0.0001, tNow + 0.08);\n    envelope.gain.setValueAtTime(0, tNow + 0.09);\n    source.stop(tNow + 0.1);\n\n    playingNotesRef.current[which] = undefined;\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    Object.entries(sourceList).forEach(async ([key, url]) => {\n      bufferListRef.current[key as KeyName] = await fetch(url)\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        );\n    });\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        justifyContent: 'center',\n        alignItems: 'center',\n        flexDirection: 'row',\n      }}\n    >\n      {Keys.map((key) => (\n        <Button\n          onPressIn={onKeyPressIn}\n          onPressOut={onKeyPressOut}\n          keyName={key}\n          key={key}\n        />\n      ))}\n    </View>\n  );\n};\n\nexport default SimplePiano;\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SimplePiano/ItHangsComponent.tsx",
    "content": "import React, { FC, useEffect, useRef } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport { AudioBuffer, AudioContext } from 'react-native-audio-api';\n\ntype KeyName = 'A' | 'B' | 'C' | 'D' | 'E';\n\ntype PR<V> = Partial<Record<KeyName, V>>;\n\ninterface ButtonProps {\n  keyName: KeyName;\n  onPressIn: (key: KeyName) => void;\n  onPressOut: (key: KeyName) => void;\n}\n\nconst Keys = ['A', 'B', 'C', 'D', 'E'] as const;\n\nconst sourceList: PR<string> = {\n  A: '/react-native-audio-api/audio/sounds/C4.mp3',\n  C: '/react-native-audio-api/audio/sounds/Ds4.mp3',\n  E: '/react-native-audio-api/audio/sounds/Fs4.mp3',\n};\n\nconst Button = ({ onPressIn, onPressOut, keyName }: ButtonProps) => (\n  <Pressable\n    onPressIn={() => onPressIn(keyName)}\n    onPressOut={() => onPressOut(keyName)}\n    style={({ pressed }) => ({\n      margin: 4,\n      padding: 12,\n      borderRadius: 2,\n      backgroundColor: pressed ? '#ff6259' : '#fa7f7c',\n    })}\n  >\n    <Text style={{ color: 'white' }}>{`${keyName}`}</Text>\n  </Pressable>\n);\n\nconst SimplePiano: FC = () => {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferMapRef = useRef<PR<AudioBuffer>>({});\n\n  const onKeyPressIn = async (which: KeyName) => {\n    const audioContext = audioContextRef.current;\n    let buffer = bufferMapRef.current[which];\n\n    if (!audioContext || !buffer) {\n      return;\n    }\n\n    const source = await audioContext.createBufferSource();\n    source.buffer = buffer;\n\n    source.connect(audioContext.destination);\n    source.start();\n  };\n\n  const onKeyPressOut = (which: KeyName) => {};\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    Object.entries(sourceList).forEach(async ([key, url]) => {\n      bufferMapRef.current[key as KeyName] = await fetch(url)\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        );\n    });\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        justifyContent: 'center',\n        alignItems: 'center',\n        flexDirection: 'row',\n      }}\n    >\n      {Keys.map((key) => (\n        <Button\n          onPressIn={onKeyPressIn}\n          onPressOut={onKeyPressOut}\n          keyName={key}\n          key={key}\n        />\n      ))}\n    </View>\n  );\n};\n\nexport default SimplePiano;\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SimplePiano/ItHangsSource.tsx",
    "content": "import { AudioBuffer, AudioContext } from 'react-native-audio-api';\nimport { View, Text, Pressable } from 'react-native';\nimport React, { FC, useEffect, useRef } from 'react';\n\ntype KeyName = 'A' | 'B' | 'C' | 'D' | 'E';\n\ntype PR<V> = Partial<Record<KeyName, V>>;\n\ninterface ButtonProps {\n  keyName: KeyName;\n  onPressIn: (key: KeyName) => void;\n  onPressOut: (key: KeyName) => void;\n}\n\nconst Keys = ['A', 'B', 'C', 'D', 'E'] as const;\n\nconst sourceList: PR<string> = {\n  A: '/react-native-audio-api/audio/sounds/C4.mp3',\n  C: '/react-native-audio-api/audio/sounds/Ds4.mp3',\n  E: '/react-native-audio-api/audio/sounds/Fs4.mp3',\n};\n\nconst Button = ({ onPressIn, onPressOut, keyName }: ButtonProps) => (\n  <Pressable\n    onPressIn={() => onPressIn(keyName)}\n    onPressOut={() => onPressOut(keyName)}\n    style={({ pressed }) => ({\n      margin: 4,\n      padding: 12,\n      borderRadius: 2,\n      backgroundColor: pressed ? '#d2e6ff' : '#abcdef',\n    })}\n  >\n    <Text style={{ color: 'white' }}>{`${keyName}`}</Text>\n  </Pressable>\n);\n\nconst SimplePiano: FC = () => {\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferMapRef = useRef<PR<AudioBuffer>>({});\n\n  const onKeyPressIn = (which: KeyName) => {\n    const audioContext = audioContextRef.current;\n    let buffer = bufferMapRef.current[which];\n\n    if (!audioContext || !buffer) {\n      return;\n    }\n\n    const source = audioContext.createBufferSource();\n    source.buffer = buffer;\n\n    source.connect(audioContext.destination);\n    source.start();\n  };\n\n  const onKeyPressOut = (which: KeyName) => {};\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    Object.entries(sourceList).forEach(async ([key, url]) => {\n      bufferMapRef.current[key as KeyName] = await fetch(url)\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        );\n    });\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        justifyContent: 'center',\n        alignItems: 'center',\n        flexDirection: 'row',\n      }}\n    >\n      {Keys.map((key) => (\n        <Button\n          onPressIn={onKeyPressIn}\n          onPressOut={onKeyPressOut}\n          keyName={key}\n          key={key}\n        />\n      ))}\n    </View>\n  );\n};\n\nexport default SimplePiano;\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SimplePiano/PressOutComponent.tsx",
    "content": "import React, { FC, useEffect, useRef } from 'react';\nimport { Pressable, Text, View } from 'react-native';\nimport {\n  AudioBuffer,\n  AudioBufferSourceNode,\n  AudioContext,\n} from 'react-native-audio-api';\n\ntype KeyName = 'A' | 'B' | 'C' | 'D' | 'E';\n\ntype PR<V> = Partial<Record<KeyName, V>>;\n\ninterface ButtonProps {\n  keyName: KeyName;\n  onPressIn: (key: KeyName) => void;\n  onPressOut: (key: KeyName) => void;\n}\n\nconst Keys = ['A', 'B', 'C', 'D', 'E'] as const;\n\nconst sourceList: PR<string> = {\n  A: '/react-native-audio-api/audio/sounds/C4.mp3',\n  C: '/react-native-audio-api/audio/sounds/Ds4.mp3',\n  E: '/react-native-audio-api/audio/sounds/Fs4.mp3',\n};\n\nconst Button = ({ onPressIn, onPressOut, keyName }: ButtonProps) => (\n  <Pressable\n    onPressIn={() => onPressIn(keyName)}\n    onPressOut={() => onPressOut(keyName)}\n    style={({ pressed }) => ({\n      margin: 4,\n      padding: 12,\n      borderRadius: 2,\n      backgroundColor: pressed ? '#ff6259' : '#fa7f7c',\n    })}\n  >\n    <Text style={{ color: 'white' }}>{`${keyName}`}</Text>\n  </Pressable>\n);\n\nconst SimplePiano: FC = () => {\n  const playingNotesRef = useRef<PR<AudioBufferSourceNode>>({});\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferMapRef = useRef<PR<AudioBuffer>>({});\n\n  const onKeyPressIn = async (which: KeyName) => {\n    const audioContext = audioContextRef.current;\n    let buffer = bufferMapRef.current[which];\n\n    if (!audioContext || !buffer) {\n      return;\n    }\n\n    const source = await audioContext.createBufferSource();\n    source.buffer = buffer;\n\n    source.connect(audioContext.destination);\n    source.start();\n\n    playingNotesRef.current[which] = source;\n  };\n\n  const onKeyPressOut = (which: KeyName) => {\n    const source = playingNotesRef.current[which];\n\n    if (source) {\n      source.stop();\n    }\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    Object.entries(sourceList).forEach(async ([key, url]) => {\n      bufferMapRef.current[key as KeyName] = await fetch(url)\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        );\n    });\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        justifyContent: 'center',\n        alignItems: 'center',\n        flexDirection: 'row',\n      }}\n    >\n      {Keys.map((key) => (\n        <Button\n          onPressIn={onKeyPressIn}\n          onPressOut={onKeyPressOut}\n          keyName={key}\n          key={key}\n        />\n      ))}\n    </View>\n  );\n};\n\nexport default SimplePiano;\n"
  },
  {
    "path": "packages/audiodocs/src/examples/SimplePiano/PressOutSource.tsx",
    "content": "import { View, Text, Pressable } from 'react-native';\nimport React, { FC, useEffect, useRef } from 'react';\nimport {\n  AudioBuffer,\n  AudioContext,\n  AudioBufferSourceNode,\n} from 'react-native-audio-api';\n\ntype KeyName = 'A' | 'B' | 'C' | 'D' | 'E';\n\ntype PR<V> = Partial<Record<KeyName, V>>;\n\ninterface ButtonProps {\n  keyName: KeyName;\n  onPressIn: (key: KeyName) => void;\n  onPressOut: (key: KeyName) => void;\n}\n\nconst Keys = ['A', 'B', 'C', 'D', 'E'] as const;\n\nconst sourceList: PR<string> = {\n  A: '/react-native-audio-api/audio/sounds/C4.mp3',\n  C: '/react-native-audio-api/audio/sounds/Ds4.mp3',\n  E: '/react-native-audio-api/audio/sounds/Fs4.mp3',\n};\n\nconst Button = ({ onPressIn, onPressOut, keyName }: ButtonProps) => (\n  <Pressable\n    onPressIn={() => onPressIn(keyName)}\n    onPressOut={() => onPressOut(keyName)}\n    style={({ pressed }) => ({\n      margin: 4,\n      padding: 12,\n      borderRadius: 2,\n      backgroundColor: pressed ? '#d2e6ff' : '#abcdef',\n    })}\n  >\n    <Text style={{ color: 'white' }}>{`${keyName}`}</Text>\n  </Pressable>\n);\n\nconst SimplePiano: FC = () => {\n  const playingNotesRef = useRef<PR<AudioBufferSourceNode>>({});\n  const audioContextRef = useRef<AudioContext | null>(null);\n  const bufferMapRef = useRef<PR<AudioBuffer>>({});\n\n  const onKeyPressIn = (which: KeyName) => {\n    const audioContext = audioContextRef.current;\n    let buffer = bufferMapRef.current[which];\n\n    if (!audioContext || !buffer) {\n      return;\n    }\n\n    const source = audioContext.createBufferSource();\n    source.buffer = buffer;\n\n    source.connect(audioContext.destination);\n    source.start();\n\n    playingNotesRef.current[which] = source;\n  };\n\n  const onKeyPressOut = (which: KeyName) => {\n    const source = playingNotesRef.current[which];\n\n    if (source) {\n      source.stop();\n    }\n  };\n\n  useEffect(() => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext();\n    }\n\n    Object.entries(sourceList).forEach(async ([key, url]) => {\n      bufferMapRef.current[key as KeyName] = await fetch(url)\n        .then((response) => response.arrayBuffer())\n        .then((arrayBuffer) =>\n          audioContextRef.current!.decodeAudioData(arrayBuffer)\n        );\n    });\n\n    return () => {\n      audioContextRef.current?.close();\n    };\n  }, []);\n\n  return (\n    <View\n      style={{\n        flex: 1,\n        justifyContent: 'center',\n        alignItems: 'center',\n        flexDirection: 'row',\n      }}\n    >\n      {Keys.map((key) => (\n        <Button\n          onPressIn={onKeyPressIn}\n          onPressOut={onKeyPressOut}\n          keyName={key}\n          key={key}\n        />\n      ))}\n    </View>\n  );\n};\n\nexport default SimplePiano;\n"
  },
  {
    "path": "packages/audiodocs/src/examples/VinylPlayer/VinylPlayer.tsx",
    "content": "import React, { useEffect, useMemo, useRef, useState } from 'react';\nimport * as THREE from 'three';\nimport { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';\nimport { RoundedBoxGeometry } from 'three/examples/jsm/geometries/RoundedBoxGeometry.js';\nimport { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js';\nimport { LineSegments2 } from 'three/examples/jsm/lines/LineSegments2.js';\nimport { LineSegmentsGeometry } from 'three/examples/jsm/lines/LineSegmentsGeometry.js';\n\nimport MockAudioContext from '@site/src/audio/MockAudioContext';\nimport DetailBox from '@site/src/ui/DetailBox';\nimport labelImage from '@site/static/img/logo.png';\nimport swmLogo from '@site/static/img/swm-text.png';\n\nimport { VINYL_CONSTANTS as C } from './consts';\nimport styles from './styles.module.css';\n\ninterface SceneRefs {\n  recordGroup: THREE.Group;\n  coverGroup: THREE.Group;\n  string: THREE.Mesh;\n}\n\ninterface AnimationState {\n  isSliderPressed: boolean;\n  targetCoverY: number;\n  coverHeight: number;\n  wasOnGround: boolean;\n  fallVelocity: number;\n}\n\nexport default function VinylPlayer(): React.ReactElement {\n  const mountRef = useRef<HTMLDivElement>(null);\n  const inputRef = useRef<HTMLInputElement>(null);\n\n  // Animation state ref\n  const animationStateRef = useRef<AnimationState>({\n    isSliderPressed: false,\n    targetCoverY: 0,\n    coverHeight: 0,\n    wasOnGround: true,\n    fallVelocity: 0,\n  });\n\n  // Scene object refs\n  const sceneRefsRef = useRef<SceneRefs | null>(null);\n\n  const { context, filter, gain } = useMemo(() => {\n    const ctx = typeof window !== 'undefined' ? new AudioContext() :  MockAudioContext;\n\n    const filterNode = ctx.createBiquadFilter();\n    filterNode.type = 'lowpass';\n    const gainNode = ctx.createGain();\n    gainNode.gain.value = 0;\n    filterNode.connect(gainNode);\n    gainNode.connect(ctx.destination);\n    return { context: ctx, filter: filterNode, gain: gainNode };\n  }, []);\n\n  const [audioBuffer, setAudioBuffer] = useState<AudioBuffer | null>(null);\n\n  const bufferSourceRef = useRef<AudioBufferSourceNode | null>(null);\n\n  useEffect(() => {\n    const fetchAudio = async () => {\n      try {\n        const buffer = await fetch('/react-native-audio-api/audio/music/pass-the-mayo.mp3')\n          .then((r) => r.arrayBuffer())\n          .then((ab) => context.decodeAudioData(ab));\n        setAudioBuffer(buffer);\n      } catch (error) {\n        console.warn('Failed to load audio:', error);\n      }\n    };\n\n    fetchAudio();\n\n    return () => {\n      context?.close();\n    };\n  }, [context]);\n\n  const playSound = () => {\n    if (!context || !audioBuffer || bufferSourceRef.current) {\n      return;\n    }\n    const source = context.createBufferSource();\n    source.buffer = audioBuffer;\n    source.loop = true;\n    source.connect(filter);\n    source.start();\n    bufferSourceRef.current = source;\n  };\n\n  const stopSound = () => {\n    if (bufferSourceRef.current) {\n      bufferSourceRef.current.stop();\n      bufferSourceRef.current = null;\n    }\n  };\n\n  const handleSliderPress = () => {\n    animationStateRef.current.isSliderPressed = true;\n  };\n\n  const handleSliderRelease = () => {\n    animationStateRef.current.isSliderPressed = false;\n    animationStateRef.current.targetCoverY = 0;\n  };\n\n  const handleSliderChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n    const v = Number(e.target.value);\n    const state = animationStateRef.current;\n    state.coverHeight = v;\n    state.targetCoverY = (v / C.SLIDER_MAX) * C.SLIDER_MAX;\n\n    if (!bufferSourceRef.current) {\n      playSound();\n    }\n  };\n\n  const initializeScene = (container: HTMLDivElement) => {\n    const scene = new THREE.Scene();\n    const camera = new THREE.PerspectiveCamera(\n      75,\n      container.clientWidth / container.clientHeight,\n      0.1,\n      1000\n    );\n    camera.position.set(8, 10, 12);\n\n    const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n    renderer.setSize(container.clientWidth, container.clientHeight);\n    renderer.setPixelRatio(window.devicePixelRatio);\n    renderer.shadowMap.enabled = true;\n    container.appendChild(renderer.domElement);\n\n    const controls = new OrbitControls(camera, renderer.domElement);\n    controls.enableDamping = true;\n    controls.target.set(0, 2, 0);\n    controls.enabled = false;\n\n    return { scene, camera, renderer, controls };\n  };\n\n  const initializeLighting = (scene: THREE.Scene) => {\n    const ambientLight = new THREE.AmbientLight(0xffffff, 0.7);\n    scene.add(ambientLight);\n\n    const dirLight = new THREE.DirectionalLight(0xffffff, 1.2);\n    dirLight.position.set(10, 15, 5);\n    dirLight.castShadow = true;\n    dirLight.shadow.camera.top = 10;\n    dirLight.shadow.camera.bottom = -10;\n    dirLight.shadow.camera.left = -10;\n    dirLight.shadow.camera.right = 10;\n    dirLight.shadow.bias = 0;\n    scene.add(dirLight);\n  };\n\n  const createMaterials = () => {\n    const textureLoader = new THREE.TextureLoader();\n    const labelTexture = textureLoader.load(labelImage);\n    labelTexture.colorSpace = THREE.SRGBColorSpace;\n\n    return {\n      body: new THREE.MeshStandardMaterial({\n        color: 'rgb(51, 48, 48)',\n        metalness: 0,\n        roughness: 0.6,\n      }),\n      box: new THREE.MeshStandardMaterial({\n        color: '#0a2688',\n        metalness: 0,\n        roughness: 0.7,\n      }),\n      platter: new THREE.MeshStandardMaterial({\n        color: 'rgb(170, 170, 170)',\n        metalness: 0,\n        roughness: 0.6,\n      }),\n      record: new THREE.MeshStandardMaterial({\n        color: 'rgb(26, 26, 26)',\n        roughness: 0.6,\n        metalness: 0.1,\n      }),\n      invisible: new THREE.MeshBasicMaterial({\n        transparent: true,\n        opacity: 0,\n      }),\n      label: new THREE.MeshStandardMaterial({ map: labelTexture }),\n      labelTexture,\n    };\n  };\n\n  const createVinylPlayer = (scene: THREE.Scene, materials: ReturnType<typeof createMaterials>) => {\n    // Main body\n    const plinth = new THREE.Mesh(\n      new RoundedBoxGeometry(12, 2, 9, 4, 0.2),\n      materials.body\n    );\n    plinth.castShadow = true;\n    plinth.receiveShadow = true;\n    plinth.position.y = 1;\n    scene.add(plinth);\n\n    // Platter\n    const platter = new THREE.Mesh(\n      new THREE.CylinderGeometry(4, 4, 0.5, 64),\n      materials.platter\n    );\n    platter.castShadow = true;\n    platter.position.y = 2.25;\n    scene.add(platter);\n\n    // Record group\n    const recordGroup = new THREE.Group();\n    recordGroup.position.y = 2.55;\n    scene.add(recordGroup);\n\n    const recordBase = new THREE.Mesh(\n      new THREE.CylinderGeometry(3.95, 3.95, 0.1, 64),\n      materials.record\n    );\n    recordBase.castShadow = true;\n    recordGroup.add(recordBase);\n\n    const label = new THREE.Mesh(\n      new THREE.CylinderGeometry(1.5, 1.5, 0.11, 64),\n      materials.label\n    );\n    label.castShadow = true;\n    recordGroup.add(label);\n\n    // Grooves\n    const NUM_GROOVES = 60;\n    const START_RADIUS = 1.7;\n    const END_RADIUS = 3.9;\n    const GROOVE_THICKNESS = 0.008;\n    for (let i = 0; i < NUM_GROOVES; i++) {\n      const radius = START_RADIUS + (END_RADIUS - START_RADIUS) * (i / (NUM_GROOVES - 1));\n      const grooveGeometry = new THREE.TorusGeometry(radius, GROOVE_THICKNESS, 8, 100);\n      const groove = new THREE.Mesh(grooveGeometry, materials.record);\n      groove.rotation.x = Math.PI / 2;\n      groove.position.y = 0.05;\n      recordGroup.add(groove);\n    }\n\n    const spindle = new THREE.Mesh(\n      new THREE.CylinderGeometry(0.1, 0.1, 0.3, 16),\n      materials.platter\n    );\n    spindle.castShadow = true;\n    spindle.position.y = 0.1;\n    recordGroup.add(spindle);\n\n    // Tonearm group\n    const tonearmGroup = new THREE.Group();\n    tonearmGroup.position.set(4.5, 2, -2.5);\n    scene.add(tonearmGroup);\n\n    const tonearmBase = new THREE.Mesh(\n      new THREE.CylinderGeometry(0.6, 0.6, 1.2, 32),\n      materials.platter\n    );\n    tonearmBase.castShadow = true;\n    tonearmGroup.add(tonearmBase);\n\n    const arm = new THREE.Mesh(\n      new THREE.CylinderGeometry(0.15, 0.15, 7, 32),\n      materials.platter\n    );\n    arm.castShadow = true;\n    arm.rotation.z = Math.PI / 2;\n    arm.position.set(-3.5, 0.8, 0);\n    tonearmGroup.add(arm);\n\n    const counterweight = new THREE.Mesh(\n      new THREE.CylinderGeometry(0.4, 0.4, 1, 32),\n      materials.platter\n    );\n    counterweight.castShadow = true;\n    counterweight.rotation.z = Math.PI / 2;\n    counterweight.position.set(0.5, 0.8, 0);\n    tonearmGroup.add(counterweight);\n\n    const headshell = new THREE.Mesh(\n      new RoundedBoxGeometry(0.4, 0.3, 0.8, 2, 0.05),\n      materials.body\n    );\n    headshell.castShadow = true;\n    headshell.position.set(-6.8, 0.8, 0);\n    headshell.rotation.y = -0.15;\n    tonearmGroup.add(headshell);\n\n    // Button\n    const button = new THREE.Mesh(\n      new THREE.CylinderGeometry(0.5, 0.5, 0.2, 32),\n      materials.body\n    );\n    button.castShadow = true;\n    button.position.set(-5, 2.1, 3.5);\n    scene.add(button);\n\n    return recordGroup;\n  };\n\n  const createCoverBox = (scene: THREE.Scene, renderer: THREE.WebGLRenderer, materials: ReturnType<typeof createMaterials>) => {\n    const coverGroup = new THREE.Group();\n    scene.add(coverGroup);\n\n    const coverWidth = 13;\n    const coverBoxHeight = 6;\n    const coverDepth = 10;\n\n    const coverGeometry = new RoundedBoxGeometry(coverWidth, coverBoxHeight, coverDepth, 4, 0.2);\n    const coverMaterials = [\n      materials.box, materials.box, materials.box,\n      materials.invisible, materials.box, materials.box,\n    ];\n    const cover = new THREE.Mesh(coverGeometry, coverMaterials);\n    cover.scale.set(0.999, 0.999, 0.999);\n    cover.castShadow = true;\n    cover.position.y = coverBoxHeight / 2;\n    coverGroup.add(cover);\n\n    // SWM logo on box\n    const logoTexture = new THREE.TextureLoader().load(swmLogo);\n    logoTexture.colorSpace = THREE.SRGBColorSpace;\n\n    const logoMaterialFront = new THREE.MeshBasicMaterial({\n      map: logoTexture,\n      transparent: true,\n      side: THREE.FrontSide,\n    });\n    const logoMaterialBack = new THREE.MeshBasicMaterial({\n      map: logoTexture,\n      transparent: true,\n      side: THREE.FrontSide,\n    });\n\n    const logoWidth = coverWidth * 0.7;\n    const logoHeight = coverBoxHeight * 0.5;\n    const logoPlaneGeometry = new THREE.PlaneGeometry(logoWidth, logoHeight);\n\n    const logoFront = new THREE.Mesh(logoPlaneGeometry, logoMaterialFront);\n    logoFront.position.set(0, coverBoxHeight / 2, coverDepth / 2 + 0.01);\n    coverGroup.add(logoFront);\n\n    const logoBack = new THREE.Mesh(logoPlaneGeometry, logoMaterialBack);\n    logoBack.position.set(0, coverBoxHeight / 2, -coverDepth / 2 - 0.01);\n    logoBack.rotation.y = Math.PI;\n    coverGroup.add(logoBack);\n\n    // White trim outline\n    const outlineGeom = coverGeometry.clone();\n    outlineGeom.scale(1.002, 1.002, 1.002);\n    const threshold = 0.001;\n    const edgesGeom = new THREE.EdgesGeometry(outlineGeom, threshold);\n    const posAttr = edgesGeom.attributes.position;\n    const positions: number[] = [];\n    for (let i = 0; i < posAttr.count; i++) {\n      positions.push(posAttr.getX(i), posAttr.getY(i), posAttr.getZ(i));\n    }\n\n    const segGeometry = new LineSegmentsGeometry();\n    segGeometry.setPositions(positions);\n\n    const lineMaterial = new LineMaterial({\n      color: 'rgba(215, 207, 207, 0.65)',\n      linewidth: 4,\n      dashed: false,\n      alphaToCoverage: false,\n    });\n\n    const size = new THREE.Vector2();\n    renderer.getSize(size);\n    lineMaterial.resolution.set(size.x, size.y);\n\n    const thickLines = new LineSegments2(segGeometry, lineMaterial);\n    thickLines.computeLineDistances();\n    thickLines.renderOrder = 999;\n    cover.add(thickLines);\n\n    // String that pulls the box\n    const MAX_STRING_LENGTH = C.ANCHOR_Y - C.COVER_TOP_Y;\n    const stringGeometry = new THREE.CylinderGeometry(0.1, 0.1, MAX_STRING_LENGTH, 8);\n    const string = new THREE.Mesh(stringGeometry, materials.body);\n    coverGroup.add(string);\n\n    return { coverGroup, string, lineMaterial };\n  };\n\n  const startAnimationLoop = (\n    renderer: THREE.WebGLRenderer,\n    scene: THREE.Scene,\n    camera: THREE.PerspectiveCamera,\n    controls: OrbitControls\n  ) => {\n    const animate = () => {\n      requestAnimationFrame(animate);\n\n      const sceneRefs = sceneRefsRef.current;\n      const state = animationStateRef.current;\n\n      if (sceneRefs?.recordGroup) {\n        sceneRefs.recordGroup.rotation.y += C.RECORD_ROTATION_SPEED;\n      }\n\n      if (sceneRefs?.coverGroup && sceneRefs?.string) {\n        let newCoverY: number;\n\n        if (state.isSliderPressed) {\n          const currentY = sceneRefs.coverGroup.position.y;\n          newCoverY = currentY + (state.targetCoverY - currentY) * C.LERP_FACTOR_ACTIVE;\n          sceneRefs.coverGroup.position.y = newCoverY;\n          state.fallVelocity = 0;\n        } else {\n          const currentY = sceneRefs.coverGroup.position.y;\n          if (currentY > 0) {\n            state.fallVelocity += C.GRAVITY;\n            newCoverY = currentY - state.fallVelocity;\n            if (newCoverY < 0) {\n              newCoverY = 0;\n            }\n            sceneRefs.coverGroup.position.y = newCoverY;\n          } else {\n            newCoverY = 0;\n            state.fallVelocity = 0;\n          }\n\n          const newSliderValue = (newCoverY / C.COVER_HEIGHT_3D_MAX) * C.SLIDER_MAX;\n          state.coverHeight = Math.max(0, newSliderValue);\n          if (inputRef.current) {\n            inputRef.current.value = String(state.coverHeight);\n          }\n        }\n\n        if (filter && gain && context) {\n          const clampedY = Math.max(0, Math.min(newCoverY, C.COVER_HEIGHT_3D_MAX));\n          const ratio = clampedY / C.COVER_HEIGHT_3D_MAX;\n          const currentTime = context.currentTime;\n          filter.frequency.setTargetAtTime(\n            C.FILTER_MIN_FREQ + ratio * (C.FILTER_MAX_FREQ - C.FILTER_MIN_FREQ),\n            currentTime,\n            C.AUDIO_TRANSITION_TIME\n          );\n          gain.gain.setTargetAtTime(\n            ratio * C.MAX_GAIN,\n            currentTime,\n            C.AUDIO_TRANSITION_TIME\n          );\n        }\n\n        const MAX_STRING_LENGTH = C.ANCHOR_Y - C.COVER_TOP_Y;\n\n        const isOnGround = newCoverY < 0.01;\n        if (isOnGround && !state.wasOnGround) {\n          if (bufferSourceRef.current) {\n            stopSound();\n          }\n        }\n        state.wasOnGround = isOnGround;\n\n        const newStringLength = C.ANCHOR_Y - (newCoverY + C.COVER_TOP_Y);\n        sceneRefs.string.scale.y = newStringLength / MAX_STRING_LENGTH;\n        sceneRefs.string.position.y = C.COVER_TOP_Y + newStringLength / 2;\n      }\n\n      controls.update();\n      renderer.render(scene, camera);\n    };\n\n    animate();\n  };\n\n  useEffect(() => {\n    const currentMount = mountRef.current;\n    if (!currentMount) return;\n\n    const { scene, camera, renderer, controls } = initializeScene(currentMount);\n    initializeLighting(scene);\n\n    const materials = createMaterials();\n    const recordGroup = createVinylPlayer(scene, materials);\n    const { coverGroup, string, lineMaterial } = createCoverBox(scene, renderer, materials);\n\n    sceneRefsRef.current = { recordGroup, coverGroup, string };\n\n    startAnimationLoop(renderer, scene, camera, controls);\n\n    const handleResize = () => {\n      if (!currentMount) return;\n      camera.aspect = currentMount.clientWidth / currentMount.clientHeight;\n      camera.updateProjectionMatrix();\n      renderer.setSize(currentMount.clientWidth, currentMount.clientHeight);\n      try {\n        const size = new THREE.Vector2();\n        renderer.getSize(size);\n        lineMaterial.resolution.set(size.x, size.y);\n      } catch (e) {\n        console.warn('Error updating line material resolution on resize:', e);\n      }\n    };\n    window.addEventListener('resize', handleResize);\n\n    return () => {\n      window.removeEventListener('resize', handleResize);\n      scene.traverse((object) => {\n        if (object instanceof THREE.Mesh) {\n          if (object.geometry) object.geometry.dispose();\n          if (Array.isArray(object.material)) {\n            object.material.forEach((material) => {\n              if (material.map) material.map.dispose();\n              material.dispose();\n            });\n          } else if (object.material) {\n            if (object.material.map) object.material.map.dispose();\n            object.material.dispose();\n          }\n        }\n      });\n      materials.labelTexture.dispose();\n      renderer.dispose();\n      if (currentMount && currentMount.contains(renderer.domElement)) {\n        currentMount.removeChild(renderer.domElement);\n      }\n    };\n  }, []);\n\n  return (\n    <div className={styles.container}>\n      <div ref={mountRef} className={styles.canvasContainer} />\n      <div className={styles.sliderContainer}>\n        <input\n          ref={inputRef}\n          type=\"range\"\n          min=\"0\"\n          max={C.SLIDER_MAX}\n          step=\"0.01\"\n          defaultValue=\"0\"\n          onChange={handleSliderChange}\n          onMouseDown={handleSliderPress}\n          onMouseUp={handleSliderRelease}\n          onTouchStart={handleSliderPress}\n          onTouchEnd={handleSliderRelease}\n          className={styles.slider}\n        />\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/audiodocs/src/examples/VinylPlayer/consts.ts",
    "content": "export const VINYL_CONSTANTS = {\n  // 3d model and animation\n  SLIDER_MAX: 10,\n  COVER_HEIGHT_3D_MAX: 10,\n  COVER_TOP_Y: 6,\n  ANCHOR_Y: 20,\n  RECORD_ROTATION_SPEED: 0.1,\n  GRAVITY: 0.003,\n  LERP_FACTOR_ACTIVE: 0.4,\n  \n  // audio\n  FILTER_MIN_FREQ: 200,\n  FILTER_MAX_FREQ: 8000,\n  AUDIO_TRANSITION_TIME: 0.015,\n  MAX_GAIN: 0.5,\n} as const;"
  },
  {
    "path": "packages/audiodocs/src/examples/VinylPlayer/index.ts",
    "content": "export { default } from './VinylPlayer';\n"
  },
  {
    "path": "packages/audiodocs/src/examples/VinylPlayer/styles.module.css",
    "content": "\n.container {\n  width: 100%;\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  background-color: var(--swm-off-background);\n  padding: 2rem 0;\n}\n\n.canvasContainer {\n\n  width: 100%;\n  max-width: 800px;\n  height: 560px;\n  background: transparent;\n}\n\n.sliderContainer {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  padding: 24px;\n  width: 100%;\n  max-width: 400px;\n  margin-top: 20px;\n  background: rgba(255, 255, 255, 0.2);  \n  border: 1px solid #e2e8f0;           \n  border-radius: 8px;\n  backdrop-filter: blur(10px);\n}\n\n.slider {\n  -webkit-appearance: none;\n  appearance: none;\n  width: 100%;\n  height: 6px;\n  background: #e2e8f0;\n  border-radius: 3px;\n  outline: none;\n  cursor: pointer;\n  transition: all 0.2s ease;\n  position: relative;\n}\n\n.slider:hover {\n  background: #cbd5e1;\n}\n\n.slider::-webkit-slider-thumb {\n  -webkit-appearance: none;\n  appearance: none;\n  width: 20px;\n  height: 20px;\n  background: #ffffff;\n  border-radius: 50%;\n  border: 2px solid #64748b;\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n  cursor: pointer;\n  transition: all 0.2s ease;\n}\n\n.slider:hover::-webkit-slider-thumb {\n  border-color: #475569;\n  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);\n}\n\n.slider:active::-webkit-slider-thumb {\n  transform: scale(1.1);\n  border-color: #334155;\n  box-shadow: 0 0 0 8px rgba(100, 116, 139, 0.1);\n}"
  },
  {
    "path": "packages/audiodocs/src/hooks/usePageType.tsx",
    "content": "import { useLocation } from '@docusaurus/router';\nimport useBaseUrl from '@docusaurus/useBaseUrl';\n\nconst usePageType = () => {\n  const location = useLocation();\n  const baseUrl = useBaseUrl('/');\n\n  return {\n    isDocumentation: location.pathname.startsWith(`${baseUrl}docs`),\n    isLanding: location.pathname === baseUrl,\n  };\n};\n\nexport default usePageType;\n"
  },
  {
    "path": "packages/audiodocs/src/hooks/useScreenSize.tsx",
    "content": "import { useEffect, useState } from 'react';\n\n/*\n * Caution - read before use!\n * As this hook uses innerWidth prop, which belongs to the window object,\n * it requires to use the viewport. Thus, building the production build of the\n * application may fail, as the Docusaurus is using SSR to serve it.\n * Remember to verify if user can use the viewport by using\n * `ExecutionEnvironment.canUseViewport` method, `<BrowserOnly>` component or\n * `useIsBrowser` hook.\n */\nconst useScreenSize = () => {\n  const [windowWidth, setWindowWidth] = useState(window.innerWidth);\n\n  useEffect(() => {\n    const handleWindowResize = () => {\n      setWindowWidth(window.innerWidth);\n    };\n\n    window.addEventListener('resize', handleWindowResize);\n\n    return () => {\n      window.removeEventListener('resize', handleWindowResize);\n    };\n  }, []);\n\n  return {\n    windowWidth,\n  };\n};\n\nexport default useScreenSize;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/FooterBackground/index.tsx",
    "content": "import React from 'react';\nimport usePageType from '@site/src/hooks/usePageType';\n\nimport styles from './styles.module.css';\n\nconst FooterBackground = () => {\n  const { isLanding } = usePageType();\n\n  return (\n    <div className={styles.container}>\n      <div className={styles.footerBg} />\n    </div>\n  );\n};\n\nexport default FooterBackground;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/FooterBackground/styles.module.css",
    "content": ".container {\n  position: relative;\n  margin-top: 106px;\n}\n\n.footerBg {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  width: 100%;\n  z-index: -1;\n  background: linear-gradient(0deg, rgba(250, 127, 124, 0.5) -9.44%, rgba(255, 255, 255, 0.6) 75.92%, var(--swm-background) 100%);\n  height: 457px;\n}\n\n:root[data-theme='dark'] {\n  .footerBg {\n    background: linear-gradient(0deg, rgba(250, 127, 124, 0.5) -9.44%, #232736 75.92%, var(--swm-background) 100%);\n  }\n}\n\n[class*='footerLanding'] {\n  margin-top: -106px;\n}\n\n@media (max-width: 996px) {\n  .container {\n    margin-top: 121px;\n  }\n\n  .footerBg {\n    height: 457px;\n  }\n\n  [class*='footerLanding'] {\n    margin-top: -121px;\n  }\n}\n\n@media (max-width: 700px) {\n  .container {\n    margin-top: 147px;\n  }\n\n  .footerBg {\n    height: 457px;\n  }\n\n  [class*='footerLanding'] {\n    margin-top: -147px;\n  }\n}\n\n@media (max-width: 376px) {\n  .container {\n    margin-top: 173px;\n  }\n\n  .footerBg {\n    height: 457px;\n  }\n\n  [class*='footerLanding'] {\n    margin-top: -173px;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/Hero/index.tsx",
    "content": "import React from \"react\";\n\nimport HomepageButton from \"../HomepageButton\";\nimport styles from \"./styles.module.css\";\nimport HeroSvg from './hero.svg';\n\nconst Hero = () => {\n  return (\n    <section className={styles.hero}>\n      <div className={styles.heroImageWrapper}>\n        <HeroSvg className={styles.heroImage} />\n      </div>\n      <div className={styles.heading}>\n        <div>\n          <h1 className={styles.headingLabel}>\n            <span>React Native</span>{' '}\n            <span>Audio API</span>\n          </h1>\n          <h2 className={styles.subheadingLabel}>\n            Native audio control for React Native – powerful, flexible, and truly cross-platform.\n          </h2>\n        </div>\n        <div className={styles.lowerHeading}>\n          <div className={styles.buttonContainer}>\n            <HomepageButton\n              href=\"/react-native-audio-api/docs/fundamentals/introduction\"\n              title=\"Get started\"\n            />\n          </div>\n        </div>\n      </div>\n    </section>\n  );\n}\n\nexport default Hero;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/Hero/styles.module.css",
    "content": ".hero {\n  position: relative;\n  top: 0;\n  display: flex;\n}\n\n.heroImageWrapper {\n  position: absolute;\n  top: 8rem;\n  right: -14rem;\n}\n\n.heroImage {\n  width: 640px;\n  height: auto;\n  color: var(--swm-navy-light-100);\n}\n\n[data-theme=\"dark\"] .heroImage {\n  color: var(--swm-red-light-100);\n}\n\n@media (max-width: 1280px) {\n  .heroImage {\n    width: 560px;\n  }\n\n  .heroImageWrapper {\n    top: 14rem;\n    right: -8rem;\n  }\n}\n\n@media (max-width: 1024px) {\n  .heroImage {\n    width: 480px;\n  }\n\n  .heroImageWrapper {\n    top: 16rem;\n    right: -6.5rem;\n  }\n}\n\n@media (max-width: 768px) {\n  .heroImageWrapper {\n    display: none;\n  }\n}\n\n.heading {\n  margin-top: 11.25rem;\n}\n\n\n.headingLabel {\n  font-family: var(--swm-title-landing-font);\n  font-size: 64px;\n  font-weight: 700;\n\n  line-height: 1.1;\n  letter-spacing: 0;\n  text-wrap: nowrap;\n  color: var(--swm-landing-heading);\n}\n\n.headingLabel :nth-child(2) {\n  color: var(--swm-red-light-100);\n}\n\n.subheadingLabel {\n  font-family: var(--swm-h2-font-size);\n  font-size: 32px;\n  font-weight: 400;\n  line-height: 1.15;\n  letter-spacing: var(--swm-heading-letter-spacing-bigger);\n\n  margin-top: 3rem;\n  margin-bottom: 5.5rem;\n  width: 65%;\n  color: var(--swm-landing-heading);\n}\n\n.buttonContainer {\n  display: flex;\n  justify-content: flex-start;\n}\n\n@media (max-width: 768px) {\n  .headingLabel {\n    font-size: 2.5rem;\n  }\n  .subheadingLabel {\n    margin: 2rem 0 3.5rem 0;\n    font-size: 26px;\n    width: 100%;\n  }\n}\n\n@media (max-width: 440px) {\n  .heading {\n    margin-top: 9.5rem;\n  }\n  .headingLabel {\n    font-size: 26px;\n  }\n  .subheadingLabel {\n    margin: 1rem 0 2rem 0;\n    font-size: 20px;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/HireUsSection/index.tsx",
    "content": "import { JSX, useEffect } from 'react';\nimport {HireUsSection} from '@swmansion/t-rex-ui'\nimport './styles.module.css';\n\nconst HireUsSectionWrapper = ({\n  content,\n  href,\n}: {\n  content?: string | JSX.Element;\n  href: string;\n}) => {\n   const resolvedContent = content || (\n    <>\n      We’re a software company built around improving developer experience and\n      bringing innovative clients' ideas to life. We're pushing boundaries and\n      delivering high-performance solutions that scale.\n      <br />\n      <br />\n      Need help integrating React Native Audio API into your project or want to\n      discuss your ideas?\n    </>\n  );\n\n   // TODO: Remove this hack after we add support for custom button text in the HireUsSection component\n   // Optional TODO: Contribute to t-rex-ui to add support for custom button text and remove this hack\n   useEffect(() => {\n    const btn = document.querySelector(\"[class*='hireUsSection'] [class*='homepageButtonLink'] > [class*='homepageButton']\");\n    if (btn) {\n      const textNode = Array.from(btn.childNodes).find(n => n.nodeType === Node.TEXT_NODE);\n      if (textNode) {\n        textNode.textContent = \"Let's talk\";\n      }\n    }\n  }, []);\n\n    return <HireUsSection content={resolvedContent} href={href} />\n};\n\nexport default HireUsSectionWrapper;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/HireUsSection/styles.module.css",
    "content": "@media (max-width: 420px) {\n  [class*='hireUsSectionBody'] {\n    font-size: 18px !important;\n  }\n}\n\n[class*='hireUsSectionBody'] {\n  font-size: 20px !important;\n  color: var(--swm-navy-light-80);\n}\n\n[data-theme='dark'] [class*='hireUsSectionBody'] {\n  color: var(--swm-navy-dark-40);\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/HomepageButton/index.tsx",
    "content": "import React from 'react';\nimport styles from './styles.module.css';\n\nimport ArrowRight from '@site/static/img/arrow-right-hero.svg';\nimport clsx from 'clsx';\n\nexport const ButtonStyling = {\n  TO_PURPLE: styles.buttonTransparentStyling,\n  TO_WHITE: styles.buttonWhiteStyling,\n  TO_TRANSPARENT: styles.buttonRedStyling,\n};\n\nexport const BorderStyling = {\n  PURPLE: styles.buttonRedBorderStyling,\n};\n\nconst HomepageButton: React.FC<{\n  title: string;\n  href: string;\n  target?: '_blank' | '_parent' | '_self' | '_top';\n  backgroundStyling?: string;\n  borderStyling?: string;\n  enlarged?: boolean;\n}> = ({\n  title,\n  href,\n  target = '_self',\n  backgroundStyling = ButtonStyling.TO_TRANSPARENT,\n  borderStyling = BorderStyling.PURPLE,\n}) => {\n  return (\n    <a href={href} target={target} className={styles.homepageButtonLink}>\n      <div\n        className={clsx(\n          styles.homepageButton,\n          backgroundStyling,\n          borderStyling\n        )}>\n        {title}\n\n        <div className={styles.arrow}>\n          <ArrowRight />\n        </div>\n      </div>\n    </a>\n  );\n};\n\nexport default HomepageButton;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/HomepageButton/styles.module.css",
    "content": ".homepageButton {\n  height: 60px;\n  padding: 1em 1.5em 1em 1em;\n\n  font-weight: 500;\n  font-size: 20px;\n  text-wrap: nowrap;\n\n  color: var(--swm-off-white);\n  background-color: var(--swm-landing-button-red-light);\n\n  cursor: pointer;\n  transition: background-color 0.3s, color 0.3s;\n}\n\n[data-theme='dark'] .homepageButton {\n  color: var(--swm-navy-dark-100);\n  background-color: var(--swm-red-dark-100);\n  border-color: var(--swm-red-dark-100);\n}\n\na.homepageButtonLink:hover {\n  text-decoration: none !important;\n}\n\n.homepageButton {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n@media (max-width: 568px) {\n  .homepageButton,\n  .homepageButtonLink {\n    width: 100%;\n  }\n  .homepageButton {\n    font-size: 18px;\n  }\n}\n\n.homepageButton p {\n  margin: 0 0 2px 0;\n}\n\n.homepageButton svg {\n  stroke-width: 1.5;\n  stroke-linecap: round;\n  stroke-linejoin: round;\n}\n\n.arrow {\n  transition: left 0.3s;\n}\n\n.arrow {\n  left: 8px;\n}\n\n.homepageButton svg {\n  transition: stroke 0.3s;\n}\n\n.homepageButton:hover .arrow {\n  left: 16px;\n}\n\n/* Button - transparent styling */\n\n.buttonTransparentStyling {\n  background-color: transparent;\n  color: var(--swm-landing-button-red-light);\n}\n\n.buttonTransparentStyling svg {\n  stroke: var(--swm-landing-button-red-light);\n}\n\n.buttonTransparentStyling:hover {\n  background-color: var(--swm-landing-button-red-light);\n  color: var(--swm-off-white);\n}\n\n.buttonTransparentStyling:hover svg {\n  stroke: var(--swm-off-white);\n}\n\n.buttonRedStyling {\n  background-color: var(--swm-landing-button-red-light);\n  color: var(--swm-off-white);\n}\n\n.buttonRedStyling svg {\n  stroke: var(--swm-off-white);\n}\n\n[data-theme='dark'] .buttonRedStyling svg {\n  stroke: var(--swm-navy-dark-100);\n}\n\n.buttonRedStyling:hover {\n  background-color: transparent;\n  color: var(--swm-landing-button-red-light);\n}\n\n[data-theme='dark'] .buttonRedStyling:hover {\n  color: var(--swm-red-dark-100);\n}\n\n.buttonRedStyling:hover svg {\n  stroke: var(--swm-landing-button-red-light);\n}\n\n.buttonRedBorderStyling {\n  border: 1px solid var(--swm-landing-button-red-light);\n}\n\n.arrow {\n  position: relative;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n\n  width: 24px;\n  height: 24px;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingBlog/index.tsx",
    "content": "import React from \"react\";\n\nimport ArrowRight from '@site/static/img/arrow-right-hero.svg';\nimport styles from \"./styles.module.css\";\n\nexport default () => (\n  <section className={styles.container}>\n    <h5 className={styles.title}>Learn more about React Native Audio API</h5>\n    <a href=\"https://medium.com/swmansion/hello-react-native-audio-api-bb0f10347211\" target=\"_blank\" className={styles.link}>\n      See blog post\n      <div className={styles.arrow}>\n        <ArrowRight />\n      </div>\n    </a>\n  </section>\n)\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingBlog/styles.module.css",
    "content": "\n.container {\n  display: flex;\n  align-items: center;\n}\n\n.title {\n  flex: 1;\n  font-weight: 500;\n  font-size: 24px;\n  color: var(--swm-navy-dark-100);\n  line-height: 1.2;\n  letter-spacing: 1%;\n}\n\n[data-theme=\"dark\"] .title {\n  color: var(--swm-off-white);\n}\n\n.link {\n  height: 60px;\n  padding: 1em 1.5em 1em 1em;\n\n  font-weight: 500;\n  font-size: 20px;\n  text-wrap: nowrap;\n\n  cursor: pointer;\n  color: var(--swm-landing-button-red-light);\n  border: 1px solid var(--swm-landing-button-red-light);\n  transition: background-color 0.3s, color 0.3s;\n\n  flex: 0 0 auto;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\na.link:hover {\n  text-decoration: none !important;\n  color: var(--swm-off-white);\n  background-color: var(--swm-landing-button-red-light);\n}\n\n.arrow {\n  position: relative;\n  transition: left 0.3s;\n  left: 8px;\n}\n\n.link:hover .arrow {\n  left: 16px;\n}\n\n.link svg {\n  transition: stroke 0.3;\n}\n\n.link svg {\n  stroke: var(--swm-landing-button-red-light)\n}\n\n.link:hover svg {\n  stroke: var(--swm-off-white);\n}\n\n.arrow {\n  left: 8px;\n}\n\n\n@media (max-width: 440px) {\n  .container {\n    flex-direction: column;\n  }\n\n  .title {\n    margin-bottom: 1.5rem;\n    font-size: 20px;\n  }\n\n  .link {\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingFeatures/LandingFeature.tsx",
    "content": "import React from \"react\";\n\nimport styles from \"./styles.module.css\";\n\ninterface LandingFeatureProps {\n  title: string;\n  description: string;\n  icon: React.ReactNode;\n}\n\nconst LandingFeature: React.FC<LandingFeatureProps> = ({ title, description, icon }) => (\n  <div className={styles.feature}>\n    <div className={styles.featureIconContainer}>{icon}</div>\n    <h3 className={styles.featureTitle}>{title}</h3>\n    <p className={styles.featureDescription}>{description}</p>\n  </div>\n);\n\nexport default LandingFeature;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingFeatures/index.tsx",
    "content": "import React from \"react\";\n\nimport { Spacer } from \"@site/src/ui/Layout\";\nimport LandingFeature from \"./LandingFeature\";\nimport styles from \"./styles.module.css\";\n\nimport Clock from '@site/static/icons/clock-forward.svg';\nimport Devices from '@site/static/icons/devices.svg';\nimport Equalizer from '@site/static/icons/equalizer.svg';\nimport SoundWave from '@site/static/icons/soundwave.svg';\nimport Speaker from '@site/static/icons/speaker.svg';\nimport WaveSawtooth from '@site/static/icons/wave-sawtooth.svg';\n\ninterface LandingFeature {\n  title: string;\n  description: string;\n  icon: React.ReactNode;\n}\n\nconst features: LandingFeature[] = [\n  {\n    title: \"Shape sound exactly how you want\",\n    description: \"Gain full control over audio signals, effects, and routing with a Web Audio API–like interface built for React Native.\",\n    icon: <SoundWave />,\n  },\n  {\n    title: \"Build once, run anywhere\",\n    description: \"With React Native Audio API, you can offer consistent audio behavior across iOS, Android and Web without rewriting logic.\",\n    icon: <Devices />,\n  },\n  {\n    title: \"Work with audio in real-time\",\n    description: \"Introduce changes instantly and effortlessly. Adjust volume, filters, or playback with no background processing delays.\",\n    icon: <Clock />,\n  },\n  {\n    title: \"Design rich audio chains\",\n    description: \"Use modular wave nodes to create everything from simple playback to advanced audio visualizations or custom audio rooms.\",\n    icon: <WaveSawtooth />,\n  },\n  {\n    title: \"Control multiple sounds simultaneously\",\n    description: \"Easily manage multiple audio streams – play, stop, and synchronize with precision.\",\n    icon: <Speaker />,\n  },\n  {\n    title: \"Visualize audio in a few steps\",\n    description: \"Let users see what they hear with waveform animations and audio visualizers powered by analyzer nodes.\",\n    icon: <Equalizer />,\n  },\n];\n\nconst LandingFeatures = () => {\n  return (\n    <section>\n      <header>\n        <h3 className={styles.title}>Bring sound to life in your React Native apps</h3>\n        <Spacer.Vertical size=\"1.5rem\" />\n        <p className={styles.subtitle}>\n          React Native Audio API brings the power of Web Audio API to mobile, giving developers full control over audio – from sound synthesis to playback.\n        </p>\n      </header>\n      <Spacer.Vertical size=\"80px\" />\n      <div className={styles.features}>\n        {features.map((feature, index) => (\n          <LandingFeature\n            key={index}\n            title={feature.title}\n            description={feature.description}\n            icon={feature.icon}\n          />\n        ))}\n      </div>\n    </section>\n  )\n};\n\nexport default LandingFeatures;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingFeatures/styles.module.css",
    "content": "\n.title {\n  font-weight: 500;\n  font-size: 32px;\n  line-height: 1.15;\n  letter-spacing: 2%;\n}\n\n.subtitle {\n  font-weight: 400;\n  font-size: 20px;\n  line-height: 1.6;\n  letter-spacing: 0%;\n  max-width: 700px;\n  margin: 0;\n  color: var(--swm-navy-light-100);\n}\n\n[data-theme=\"dark\"] .subtitle {\n  color: var(--swm-off-white);\n}\n\n\n.features {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 1.5rem;\n}\n\n.feature {\n  width: calc(50% - 0.75rem);\n  background: var(--swm-red-light-20);\n  padding: 1.5rem;\n}\n\n[data-theme=\"dark\"] .feature {\n  background: var(--swm-red-dark-140);\n}\n\n.featureIconContainer {\n  width: 48px;\n  height: 48px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background-color: var(--swm-red-light-80);\n  margin-bottom: 1.5rem;\n  color: var(--swm-navy-light-100);\n}\n\n[data-theme=\"dark\"] .featureIconContainer {\n  color: var(--swm-navy-dark-100);\n}\n\n.featureTitle {\n  font-weight: 500;\n  font-size: 20px;\n  line-height: 1.3;\n  margin-bottom: 2rem;\n}\n\n.featureDescription {\n  font-weight: 400;\n  font-size: 16px;\n  line-height: 1.6;\n  color: var(--swm-navy-light-100);\n  margin: 0;\n}\n\n[data-theme=\"dark\"] .featureDescription {\n  color: var(--swm-off-white);\n}\n\n@media (max-width: 440px) {\n  .subtitle {\n    font-size: 18px;\n  }\n\n  .feature {\n    width: 100%;\n  }\n\n  .featureTitle {\n    margin-bottom: 1rem;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingWidget/Canvas/index.tsx",
    "content": "import React, { forwardRef, useCallback, useEffect, useRef } from 'react';\nimport type { ResponsiveCanvasDrawParams } from '@site/src/ui/ResponsiveCanvas';\nimport ResponsiveCanvas from '@site/src/ui/ResponsiveCanvas';\n\nexport interface CanvasContext {\n  canvas: HTMLCanvasElement;\n  ctx: CanvasRenderingContext2D;\n}\n\ninterface CanvasProps<RenderingContext> {\n  height?: number;\n  prepareRenderingContext?: (canvasContext: CanvasContext) => RenderingContext;\n  onDraw?: (canvasContext: CanvasContext, renderingContext: RenderingContext) => void\n  className?: string;\n}\n\nconst Canvas = forwardRef<HTMLCanvasElement, CanvasProps<any>>(function Canvas<RenderingContext>(\n  props: CanvasProps<RenderingContext>,\n  ref: React.ForwardedRef<HTMLCanvasElement>\n) {\n  const { height = 250, onDraw, prepareRenderingContext, className } = props;\n  const drawingRef = useRef<number | null>(null);\n  const canvasContextRef = useRef<CanvasContext | null>(null);\n  const renderingContextRef = useRef<RenderingContext | null>(null);\n\n  const setCanvasRef = useCallback((element: HTMLCanvasElement | null) => {\n    if (typeof ref === 'function') {\n      ref(element);\n    } else if (ref) {\n      ref.current = element;\n    }\n  }, [ref]);\n\n  const stopDrawing = useCallback(() => {\n    if (drawingRef.current !== null) {\n      cancelAnimationFrame(drawingRef.current);\n      drawingRef.current = null;\n    }\n  }, []);\n\n  const startDrawing = useCallback((canvasContext: CanvasContext) => {\n    stopDrawing();\n\n    if (!onDraw) {\n      return;\n    }\n\n    canvasContextRef.current = canvasContext;\n    renderingContextRef.current = prepareRenderingContext\n      ? prepareRenderingContext(canvasContext)\n      : ({} as RenderingContext);\n\n    const draw = () => {\n      if (!canvasContextRef.current) {\n        return;\n      }\n\n      onDraw(canvasContextRef.current, renderingContextRef.current as RenderingContext);\n      drawingRef.current = requestAnimationFrame(draw);\n    };\n\n    drawingRef.current = requestAnimationFrame(draw);\n  }, [onDraw, prepareRenderingContext, stopDrawing]);\n\n  const handleResponsiveCanvasDraw = useCallback(({ canvas, context }: ResponsiveCanvasDrawParams) => {\n    startDrawing({ canvas, ctx: context });\n  }, [startDrawing]);\n\n  useEffect(() => {\n    return () => {\n      stopDrawing();\n      setCanvasRef(null);\n    };\n  }, [setCanvasRef, stopDrawing]);\n\n  return (\n    <ResponsiveCanvas\n      onDraw={handleResponsiveCanvasDraw}\n      height={height}\n      className={className}\n      canvasRef={setCanvasRef}\n    />\n  );\n});\n\nexport default Canvas;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingWidget/Canvas/styles.module.css",
    "content": ".canvas {\n  width: 100%;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingWidget/Equalizer/index.tsx",
    "content": "import { useColorMode } from '@docusaurus/theme-common';\nimport React, { useCallback, useRef } from 'react';\n\nimport AudioManager from '@site/src/audio/AudioManager';\nimport useEqualizerControls from '@site/src/audio/useEqualizerControls';\nimport useIsPlaying from '@site/src/audio/useIsPlaying';\nimport { createGradient, drawEQControlPoints, drawEqGrid, drawShadedCurve, getDrawingBounds, getEqualizerResponse, Point, stretchFrequencies } from '@site/src/canvasUtils';\nimport Canvas, { CanvasContext } from '../Canvas';\nimport styles from './styles.module.css';\n\ninterface EqRenderingContext {\n  analyser: AnalyserNode;\n  fftOutput: Uint8Array;\n  eqPoints: Point[];\n}\n\nconst Equalizer: React.FC = () => {\n  const canvasRef = useRef<HTMLCanvasElement>(null);\n\n  const isPlaying = useIsPlaying();\n  const { colorMode } = useColorMode();\n\n  const { equalizerBands } = useEqualizerControls(canvasRef);\n\n  const prepareRenderingContext = useCallback(({ canvas }: CanvasContext): EqRenderingContext => {\n    const analyser = AudioManager.analyser;\n    const { width, height } = getDrawingBounds(canvas);\n\n    return {\n      analyser,\n      fftOutput: new Uint8Array(analyser.frequencyBinCount),\n      eqPoints: getEqualizerResponse(0, width, 0, height),\n    };\n  }, [equalizerBands]);\n\n  const onDraw = useCallback(({ canvas, ctx }: CanvasContext, renderingContext: EqRenderingContext) => {\n    const { analyser, fftOutput, eqPoints } = renderingContext;\n\n    const cssWidth = Math.max(1, canvas.clientWidth || canvas.width);\n    const cssHeight = Math.max(1, canvas.clientHeight || canvas.height);\n    const scaleX = canvas.width / cssWidth;\n    const scaleY = canvas.height / cssHeight;\n\n    ctx.setTransform(1, 0, 0, 1, 0, 0);\n    ctx.clearRect(0, 0, canvas.width, canvas.height);\n    ctx.setTransform(scaleX, 0, 0, scaleY, 0, 0);\n\n    const { x, y, width, height } = getDrawingBounds(canvas);\n    const freqGradient = createGradient(ctx, 0, height, [250, 127, 124]); // #FA7F7C in RGB format\n    const eqGradient = createGradient(ctx, 0, height, colorMode === 'dark' ? [171, 188, 245] : [0, 26, 114], 0.75); // #AAAAAA or #333333 in RGB format\n\n    drawEqGrid(canvas, ctx);\n\n    analyser.getByteFrequencyData(fftOutput);\n\n    // Draw current output from the analyser\n    const points = stretchFrequencies(fftOutput, x, y, width, height);\n    drawShadedCurve(ctx, points, y, height, freqGradient, '#FA7F7C');\n\n    // Draw equalizer control points and curve\n    drawShadedCurve(ctx, eqPoints, y, height, eqGradient, colorMode === 'dark' ? '#ABBCF5' : '#001a72');\n    drawEQControlPoints(canvas, ctx, x, y, width, height, colorMode === 'dark' ? '#ABBCF5' : '#001a72');\n  }, [isPlaying, colorMode]);\n\n  return (\n    <Canvas onDraw={onDraw} prepareRenderingContext={prepareRenderingContext} ref={canvasRef} className={styles.canvas} />\n  );\n};\n\nexport default Equalizer;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingWidget/Equalizer/styles.module.css",
    "content": "\n.canvas {\n  cursor: pointer;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingWidget/SoundButton/index.tsx",
    "content": "import clsx from 'clsx';\nimport React, { memo, useCallback } from 'react';\n\nimport { SoundButtonProps } from '../types';\nimport styles from './styles.module.css';\n\nconst SoundButton: React.FC<SoundButtonProps> = (props) => {\n  const { id, name, type, isActive, onPlaySound } = props;\n\n  const onClick = useCallback(() => {\n    onPlaySound?.(id, type);\n  }, [onPlaySound, id, type]);\n\n  const className = clsx({\n    [styles.soundButtonInactive]: !isActive,\n    [styles.soundButtonActive]: isActive,\n    [styles.soundButtonDisabled]: !onPlaySound,\n  })\n\n  return (\n    <button type=\"button\" className={className} onClick={onClick}>\n      <span className={styles.soundButtonName}>{name}</span>\n    </button>\n  );\n};\n\nexport default memo(SoundButton);\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingWidget/SoundButton/styles.module.css",
    "content": "\n\n.soundButtonInactive {\n  padding: 15px 16px;\n  background-color: var(--swm-red-light-40);\n  border: none;\n  margin-right: 8px;\n  cursor: pointer;\n}\n\n[data-theme='dark'] .soundButtonInactive {\n  background-color: var(--swm-red-dark-140);\n}\n\n.soundButtonActive {\n  padding: 15px 16px;\n  background-color: var(--swm-red-light-80);\n  border: none;\n  margin-right: 8px;\n  cursor: pointer;\n}\n\n[data-theme='dark'] .soundButtonActive {\n  background-color: var(--swm-red-dark-100);\n}\n\n.soundButtonDisabled {\n  padding: 15px 16px;\n  background-color: var(--swm-red-light-40);\n  border: none;\n  margin-right: 8px;\n  cursor: not-allowed;\n}\n\n.soundButtonDisabled .soundButtonName {\n  opacity: 0.5;\n}\n\n\n.soundButtonName {\n  font-size: 16px;\n  font-weight: 400;\n  line-height: 1.6;\n  color: var(--swm-navy-light-100);\n}\n\n[data-theme='dark'] .soundButtonName {\n  color: var(--swm-white);\n}\n\n\n[data-theme='dark'] .soundButtonActive .soundButtonName {\n  color: var(--swm-navy-dark-100);\n}\n\n\n@media (max-width: 768px) {\n  .soundButtonInactive,\n  .soundButtonActive,\n  .soundButtonDisabled {\n    padding: 15px 12px;\n    margin: 0;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingWidget/Spectrogram/index.tsx",
    "content": "import { useColorMode } from '@docusaurus/theme-common';\nimport React, { useCallback } from 'react';\n\nimport AudioManager from '@site/src/audio/AudioManager';\nimport useIsPlaying from '@site/src/audio/useIsPlaying';\nimport { downSampleLog } from '@site/src/audio/utils';\nimport { clearCanvas, drawSpectroLines, getBarWidth } from '@site/src/canvasUtils';\n\nimport Canvas, { CanvasContext } from '../Canvas';\n\nconst barSpacing = 8.45;\nconst minFrequency = 80;\n\ninterface SpectrogramRenderingContext {\n  analyser: AnalyserNode;\n  fftOutput: Uint8Array;\n  barWidth: number;\n  bucketCount: number;\n  totalBarHeight: number;\n  slowPhase: number;\n  slowBuckets: number[];\n  slowBucketsSeeds: number[];\n}\n\n\nconst Spectrogram: React.FC = () => {\n  const { colorMode } = useColorMode();\n  const isPlaying = useIsPlaying();\n\n  const prepareRenderingContext = useCallback(({ canvas, ctx }: CanvasContext): SpectrogramRenderingContext => {\n    const analyser = AudioManager.analyser;\n    const fftOutput = new Uint8Array(analyser.frequencyBinCount);\n    const bucketCount = 64;\n\n    const barWidth = getBarWidth(canvas.width, bucketCount, barSpacing);\n    const totalBarHeight = canvas.height;\n\n    const finalBucketCount = Math.floor(canvas.width / (barWidth + barSpacing));\n    const bucketShift = 4;\n\n    let slowPhase = 0;\n    let slowBuckets = new Array(finalBucketCount + 2 * bucketShift).fill(0);\n    let slowBucketsSeeds = new Array(finalBucketCount + 2 * bucketShift).fill(0).map(() => Math.random());\n\n    return {\n      analyser,\n      fftOutput,\n      bucketCount: finalBucketCount,\n      totalBarHeight,\n      barWidth,\n      slowPhase,\n      slowBuckets,\n      slowBucketsSeeds,\n    };\n  }, []);\n\n  const onDraw = useCallback(({ canvas, ctx }: CanvasContext, renderingContext: SpectrogramRenderingContext) => {\n    const { analyser, fftOutput, bucketCount, totalBarHeight, barWidth, slowPhase, slowBuckets, slowBucketsSeeds } = renderingContext;\n\n    analyser.getByteFrequencyData(fftOutput);\n\n    const drawingBuckets = downSampleLog(\n      fftOutput,\n      bucketCount + 2 * 4,\n      AudioManager.aCtx.sampleRate,\n      minFrequency\n    );\n\n    clearCanvas(canvas, ctx);\n    let barsToDraw = drawingBuckets;\n\n    if (!isPlaying) {\n      renderingContext.slowPhase += 0.01;\n      renderingContext.slowBuckets.forEach((_, i) => {\n        renderingContext.slowBuckets[i] = 2 * (60 + 40 * Math.sin(renderingContext.slowPhase + i * 0.05) * slowBucketsSeeds[i]);\n      });\n\n      barsToDraw = slowBuckets;\n    }\n\n    drawSpectroLines(\n      ctx,\n      barsToDraw,\n      bucketCount,\n      4,\n      totalBarHeight,\n      barWidth,\n      barSpacing,\n      colorMode,\n    );\n  }, [isPlaying, colorMode]);\n\n  return (\n    <Canvas\n      onDraw={onDraw}\n      prepareRenderingContext={prepareRenderingContext}\n    />\n  );\n}\n\nexport default Spectrogram;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingWidget/Toolbar/index.tsx",
    "content": "import React, { memo, SetStateAction, useCallback } from 'react';\n\nimport { AudioSource, DisplayType, SoundButtonProps } from '../types';\nimport SoundButton from '../SoundButton';\nimport styles from './styles.module.css';\nimport clsx from 'clsx';\n\ninterface ToolbarProps {\n  isLoading: boolean;\n  soundButtons: SoundButtonProps[];\n  onPlaySound: (id: string, source: AudioSource) => void;\n  displayType: DisplayType;\n  onSetDisplayType: (value: SetStateAction<DisplayType>) => void;\n}\n\nconst Toolbar: React.FC<ToolbarProps> = (props) => {\n  const { isLoading, soundButtons, onPlaySound, onSetDisplayType, displayType } = props;\n\n  const onToggleEQ = useCallback(() => {\n    onSetDisplayType(prev => prev === 'spectrogram' ? 'equalizer' : 'spectrogram');\n  }, [onSetDisplayType]);\n\n  const renderButton = useCallback((button: SoundButtonProps) => (\n    <SoundButton\n      id={button.id}\n      key={button.type}\n      name={button.name}\n      type={button.type}\n      isActive={button.isActive}\n      onPlaySound={isLoading ? undefined : onPlaySound}\n    />\n  ), [onPlaySound, isLoading]);\n\n  const eqButtonClassName = clsx({\n    [styles.eqButton]: true,\n    [styles.eqButtonInactive]: displayType !== 'equalizer',\n    [styles.eqButtonActive]: displayType === 'equalizer',\n  })\n\n  return (\n    <div className={styles.toolbar}>\n      <div className={styles.soundButtons}>\n        {soundButtons.map(renderButton)}\n      </div>\n      <div>\n        <button type=\"button\" className={eqButtonClassName} onClick={onToggleEQ}>\n          <span className={styles.eqButtonText}>\n            Equalizer\n          </span>\n        </button>\n      </div>\n    </div>\n  );\n};\n\nexport default memo(Toolbar);\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingWidget/Toolbar/styles.module.css",
    "content": ".toolbar {\n  display: flex;\n  margin-bottom: 12px;\n  width: 100%;\n}\n\n.eqButton {\n  padding: 15px 16px;\n  border: none;\n  margin-right: 8px;\n  cursor: pointer;\n}\n\n@media (max-width: 576px) {\n  .eqButton {\n    display: none;\n  }\n\n  .toolbar {\n    width: 100%;\n  }\n\n  .soundButtons {\n    display: flex;\n    justify-content: space-between;\n    width: 100%;\n    margin-top: 12px;\n  }\n}\n\n.eqButtonText {\n  font-size: 16px;\n  font-weight: 400;\n  line-height: 1.6;\n}\n\n.eqButtonInactive {\n  background-color: var(--swm-navy-light-20);\n}\n\n.eqButtonInactive .eqButtonText {\n  color: var(--swm-navy-light-100);\n}\n\n.eqButtonActive {\n  background-color: var(--swm-navy-light-100);\n}\n\n.eqButtonActive .eqButtonText {\n  color: var(--swm-off-white);\n}\n\n\n[data-theme='dark'] .eqButtonInactive {\n  background-color: var(--swm-navy-dark-60);\n}\n\n[data-theme='dark'] .eqButtonInactive .eqButtonText {\n  color: var(--swm-navy-light-100);\n}\n\n[data-theme='dark'] .eqButtonActive {\n  background-color: var(--swm-navy-dark-40);\n}\n\n[data-theme='dark'] .eqButtonActive .eqButtonText {\n  color: var(--swm-navy-light-100);\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingWidget/constants.ts",
    "content": "import { AudioSource, AudioSourceMetadata, SourceRecord } from './types';\n\nexport const showAmpToolbarThreshold = 30;\n\nexport const soundSources: SourceRecord<string> = {\n  music: '/react-native-audio-api/audio/music/example-music-05.mp3',\n  speech: '/react-native-audio-api/audio/voice/voice-sample-landing.mp3',\n  bgm: '/react-native-audio-api/audio/bgm/bgm-01.mp3',\n  efx: '/react-native-audio-api/audio/efx/efx-01.mp3',\n};\n\nexport const initialSounds: SourceRecord<AudioSourceMetadata | null> = {\n  music: null,\n  speech: null,\n  bgm: null,\n  efx: null,\n};\n\nexport const labels: Record<AudioSource, string> = {\n  music: 'Music',\n  speech: 'Speech',\n  bgm: 'BGM',\n  efx: 'Effects'\n};\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingWidget/index.tsx",
    "content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\n\nimport AudioManager from \"@site/src/audio/AudioManager\";\n\nimport Equalizer from \"./Equalizer\";\nimport Spectrogram from \"./Spectrogram\";\n\nimport { initialSounds, labels, soundSources } from './constants';\nimport styles from \"./styles.module.css\";\nimport Toolbar from './Toolbar';\nimport { AudioMode, AudioSource, AudioSourceMetadata, DisplayType, SourceRecord } from './types';\n\nconst LandingWidget: React.FC = () => {\n  const [isLoading, setIsLoading] = useState(true);\n  const [mode, setMode] = useState<AudioMode>('player');\n  const [sounds, setSounds] = useState<SourceRecord<AudioSourceMetadata | null>>(initialSounds);\n  const [activeSounds, setActiveSounds] = useState<Array<{ id: string, type: AudioSource, startedAt: number }>>([]);\n  const [displayType, setDisplayType] = useState<DisplayType>('spectrogram');\n\n  const onPlaySound = useCallback(async (soundId: string, source: AudioSource) => {\n    if (mode === 'amplifier') {\n      setMode('player');\n    }\n\n    const sound = sounds[source];\n\n    if (!sound || !sound.id) {\n      return;\n    }\n\n    const alreadyActiveSound = activeSounds.find(s => s.type === source);\n\n    if (alreadyActiveSound) {\n      await AudioManager.stopSound(alreadyActiveSound.id);\n      setActiveSounds(prev => prev.filter(s => s.type !== source));\n      return;\n    }\n\n    const activeSound = AudioManager.playSound(sound.id, {\n      loop: source === 'bgm',\n      onEnded: () => {\n        setActiveSounds(prev => prev.filter(s => s.type !== source));\n      }\n    });\n\n    if (!activeSound) {\n      return;\n    }\n\n    setActiveSounds(prev => [...prev, { id: activeSound.id, type: source, startedAt: activeSound.startedAt }]);\n  }, [sounds, activeSounds]);\n\n  useEffect(() => {\n    function loadSounds() {\n      const promises = Object\n        .entries(soundSources)\n        .map(async ([key, path]) => ({\n          key,\n          ...(await AudioManager.loadSound(path)),\n        }));\n\n      Promise.all(promises)\n        .then((results) => {\n          const newSounds = { ...initialSounds };\n\n          results.forEach(({ key, ...metadata }) => {\n            newSounds[key] = metadata;\n          });\n\n          setSounds(newSounds);\n          setIsLoading(false);\n        });\n    }\n\n    loadSounds();\n  }, []);\n\n  const buttons = useMemo(() => Object.entries(labels).map(([key, label]) => ({\n    id: sounds[key as AudioSource]?.id || '',\n    name: label,\n    type: key as AudioSource,\n    isActive: activeSounds.some(s => s.type === key),\n    onPlaySound,\n  })), [sounds, onPlaySound, activeSounds]);\n\n  useEffect(() => {\n    return () => {\n      AudioManager.clear();\n    };\n  }, []);\n\n  return (\n    <div className={styles.container}>\n      <div className={styles.toolbarDesktop}>\n        <Toolbar\n          isLoading={isLoading}\n          soundButtons={buttons}\n          onPlaySound={onPlaySound}\n          displayType={displayType}\n          onSetDisplayType={setDisplayType}\n        />\n      </div>\n\n      {displayType === 'equalizer' ? (\n        <Equalizer />\n      ) : (\n        <Spectrogram />\n      )}\n\n      <div className={styles.toolbarMobile}>\n        <Toolbar\n          isLoading={isLoading}\n          soundButtons={buttons}\n          onPlaySound={onPlaySound}\n          displayType={displayType}\n          onSetDisplayType={setDisplayType}\n        />\n      </div>\n    </div>\n  );\n}\n\nexport default LandingWidget;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingWidget/styles.module.css",
    "content": "\n.container {\n  position: relative;\n}\n\n.toolbarMobile {\n  display: none;\n}\n\n@media (max-width: 768px) {\n  .toolbarMobile {\n    display: flex;\n    justify-content: space-between;\n    margin-bottom: 12px;\n  }\n\n  .toolbarDesktop {\n    display: none;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/LandingWidget/types.ts",
    "content": "export type AudioMode = 'player' | 'amplifier';\n\nexport type AudioSource = 'music' | 'speech' | 'bgm' | 'efx';\n\nexport type SourceRecord<T> = Record<AudioSource, T>;\n\nexport interface AudioSourceMetadata {\n  id: string;\n  sourceName: AudioSource;\n}\n\nexport interface SoundButtonProps {\n  id: string;\n  name: string;\n  type: AudioSource;\n  isActive?: boolean;\n  onPlaySound?: (id: string, source: AudioSource) => void;\n}\n\n\nexport type DisplayType = 'spectrogram' | 'equalizer';\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/Testimonials/TestimonialItem/QuoteIcon/index.tsx",
    "content": "import React from 'react';\n\ninterface Props {\n  color: string;\n  className?: string;\n}\nfunction QuoteIcon({ color, className }: Props) {\n  return (\n    <svg\n      xmlns=\"http://www.w3.org/2000/svg\"\n      className={className}\n      width=\"66\"\n      height=\"48\"\n      fill=\"none\"\n      viewBox=\"0 0 66 48\">\n      <path\n        fill={color}\n        d=\"M49.693.29c2.964 0 5.672.766 8.125 2.296 2.35 1.633 4.242 3.828 5.672 6.584 1.431 2.857 2.147 6.123 2.147 9.798 0 3.061-.614 6.021-1.84 8.879-1.226 2.96-2.913 5.716-5.059 8.267-2.146 2.552-4.701 4.797-7.665 6.736-2.964 2.042-6.132 3.521-9.505 4.44l-6.745-8.114c4.19-1.837 7.614-4.032 10.271-6.583 2.555-2.552 3.833-4.746 3.833-6.583 0-1.225-.409-2.348-1.227-3.368-.92-1.02-2.044-1.99-3.372-2.909-2.35-1.837-3.935-3.521-4.753-5.052-.92-1.429-1.38-3.01-1.38-4.746 0-2.96 1.074-5.307 3.22-7.042C43.561 1.158 46.321.29 49.693.29zm-34.186 0c2.964 0 5.672.766 8.125 2.296 2.35 1.633 4.241 3.828 5.672 6.584 1.431 2.857 2.146 6.123 2.146 9.798 0 3.061-.613 6.021-1.84 8.879-1.226 2.96-2.912 5.716-5.058 8.267-2.146 2.552-4.701 4.797-7.665 6.736-2.964 2.042-6.132 3.521-9.505 4.44L.637 39.176c4.19-1.837 7.614-4.031 10.271-6.583 2.555-2.552 3.833-4.746 3.833-6.583 0-1.225-.41-2.348-1.227-3.368-.92-1.02-2.044-1.99-3.373-2.909-2.35-1.837-3.934-3.521-4.752-5.052-.92-1.429-1.38-3.01-1.38-4.746 0-2.96 1.073-5.307 3.22-7.042C9.375 1.158 12.134.29 15.507.29z\"></path>\n    </svg>\n  );\n}\n\nexport default QuoteIcon;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/Testimonials/TestimonialItem/index.tsx",
    "content": "import { useColorMode } from '@docusaurus/theme-common';\nimport React, { PropsWithChildren } from 'react';\n\nimport QuoteIcon from './QuoteIcon';\nimport styles from './styles.module.css';\n\ninterface ImageProps {\n  alt: string;\n  src: string;\n}\ninterface Props extends PropsWithChildren {\n  author: string;\n  company?: string;\n  link: string;\n  image: ImageProps;\n}\n\nconst TestimonialItem = ({ author, company, image, link, children }: Props) => {\n  return (\n    <div className={styles.testimonialItem}>\n      <QuoteIcon\n        className={styles.quoteIcon}\n        color={\n          useColorMode().colorMode === 'dark'\n            ? 'var(--swm-red-dark-100)'\n            : 'var(--swm-red-light-100)'\n        }\n      />\n      <div className={styles.testimonialAuthor}>\n        <div className={styles.testimonialAuthorPhoto}>\n          <img alt={image.alt} src={image.src} />\n        </div>\n        <div className={styles.testimonialAuthorInfo}>\n          <h5 className={styles.testimonialAuthorName}>{author}</h5>\n          <a href={link} target=\"_blank\" rel=\"noopener noreferrer\" className={styles.testimonialAuthorLink}>\n            <span className={styles.testimonialCompany}>{company}</span>\n          </a>\n        </div>\n      </div>\n      <p className={styles.testimonialBody}>{children}</p>\n    </div>\n  );\n};\n\nexport default TestimonialItem;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/Testimonials/TestimonialItem/styles.module.css",
    "content": ".testimonialItem {\n  background-color: var(--swm-red-light-20);\n  box-shadow: -12px 12px 0px var(--swm-red-light-100);\n  padding: 1.5em;\n  position: relative;\n  width: 100%;\n  display: flex;\n  gap: 1rem;\n  flex-direction: column;\n  transition: 0.2s ease-in-out;\n}\n\n@media (max-width: 996px) {\n  .testimonialItem {\n    max-width: 100%;\n    min-height: 0;\n  }\n}\n\n.testimonialBody {\n  margin: 0;\n}\n\n.quoteIcon {\n  position: absolute;\n  right: 0;\n  top: 0;\n  transform: translate(10%, -20%);\n}\n\n@media (max-width: 440px) {\n  .quoteIcon {\n    scale: 0.8;\n    transform: translate(30%, -40%);\n  }\n}\n\n[data-theme='dark'] .testimonialItem {\n  background-color: var(--swm-red-dark-140);\n  box-shadow: -12px 12px 0px var(--swm-red-light-100);\n}\n\n[data-theme='dark'] .testimonialAuthorName,\n[data-theme='dark'] .testimonialBody {\n  color: var(--swm-off-white);\n}\n\n.testimonialAuthor {\n  display: flex;\n  flex-direction: row;\n  gap: 1rem;\n}\n\n.testimonialAuthorInfo {\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n}\n\n.testimonialAuthorName {\n  font-size: 20px;\n  font-weight: 600;\n}\n\n.testimonialAuthorPhoto {\n  flex-shrink: 0;\n  background-color: black;\n}\n\n.testimonialAuthorPhoto,\n.testimonialAuthorPhoto > img {\n  border-radius: 50%;\n  width: 4rem;\n  height: 4rem;\n}\n\n.testimonialAuthorPhoto > img {\n  object-fit: cover;\n  opacity: 1;\n  transition: 0.2s ease-in-out;\n  object-position: top center;\n}\n\n.testimonialCompany {\n  font-weight: 500;\n  font-size: 14px;\n  color: var(--swm-navy-light-60);\n  text-transform: uppercase;\n}\n\n[data-theme='dark'] .testimonialCompany {\n  color: var(--swm-navy-light-20);\n}\n\n@media (max-width: 440px) {\n  .featureTitle {\n    font-size: 20px;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/Testimonials/TestimonialList/index.tsx",
    "content": "import clsx from 'clsx';\nimport React, { useRef, useState, useEffect, useCallback } from 'react';\n\nimport TestimonialItem from '../TestimonialItem';\nimport testimonials from './testimonials';\nimport styles from './styles.module.css';\nimport { Testimonial } from './types';\nimport useDrag from './useDrag';\n\nconst TestimonialList = () => {\n  const [activeIndex, setActiveIndex] = useState(0);\n  const [currentOffset, setCurrentOffset] = useState(0);\n  const testimonialListRef = useRef<HTMLDivElement>(null);\n\n  const onSetActiveSlide = useCallback((index: number) => {\n    let offsetX = 0;\n\n    testimonials.forEach((_t, i) => {\n      const testimonialContainer = document.querySelector<HTMLElement>(`.testimonialContainer-${i}`);\n\n      if (testimonialContainer && i < index) {\n        offsetX += testimonialContainer.offsetWidth;\n      }\n    });\n\n\n    setActiveIndex(index);\n    setCurrentOffset(offsetX);\n  }, []);\n\n  const renderTestimonial = useCallback((testimonial: Testimonial, index: number) => (\n    <div key={index} className={`testimonialContainer-${index}`} style={{ padding: '20px' }}>\n      <TestimonialItem\n        key={index}\n        author={testimonial.author}\n        company={testimonial.company}\n        image={testimonial.image}\n        link={testimonial.link}\n      >\n        {testimonial.body}\n      </TestimonialItem>\n    </div>\n  ), []);\n\n  useEffect(() => {\n    function handleResize() {\n      if (!testimonialListRef.current) {\n        return;\n      }\n\n      const { offsetWidth } = testimonialListRef.current;\n\n      let offsetX = 0;\n\n\n      testimonials.forEach((_t, index) => {\n        const testimonialContainer = document.querySelector<HTMLElement>(`.testimonialContainer-${index}`);\n\n        if (testimonialContainer) {\n          testimonialContainer.style.width = `${offsetWidth}px`;\n        }\n\n        if (index < activeIndex) {\n          offsetX += testimonialContainer ? testimonialContainer.offsetWidth : 0;\n        }\n      })\n\n      setCurrentOffset(offsetX);\n\n      const activeSlide = document.querySelector<HTMLElement>(`.testimonialContainer-${activeIndex}`);\n\n      if (!activeSlide) {\n        return;\n      }\n\n      testimonialListRef.current.style.height = `${activeSlide.offsetHeight + 50}px`;\n    }\n\n\n    handleResize();\n    window.addEventListener('resize', handleResize);\n\n    return () => {\n      window.removeEventListener('resize', handleResize);\n    };\n  }, [activeIndex]);\n\n  const dragHandlers = useDrag(currentOffset, setCurrentOffset, activeIndex, onSetActiveSlide);\n\n  return (\n    <div>\n      <div ref={testimonialListRef} className={styles.testimonialList}>\n        <div {...dragHandlers} style={{\n            transform: `translateX(-${currentOffset}px)`,\n            display: 'flex',\n            flexDirection: 'row',\n            position: 'absolute',\n            alignItems: 'flex-start',\n            justifyContent: 'flex-start',\n            transition: 'transform 300ms ease-out',\n          }}\n        >\n          {testimonials.map(renderTestimonial)}\n        </div>\n      </div>\n      <div>\n        <div className={styles.dotsContainer}>\n          {testimonials.map((_, index) => (\n            <button\n              key={index}\n              type=\"button\"\n              onClick={() => onSetActiveSlide(index)}\n              className={styles.dotButton}\n            >\n              <span\n                className={clsx(\n                  styles.dot,\n                  index === activeIndex && styles.activeDot\n                )}\n              />\n            </button>\n          ))}\n        </div>\n      </div>\n    </div>\n  );\n};\n\nexport default TestimonialList;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/Testimonials/TestimonialList/styles.module.css",
    "content": "\n\n.testimonialList {\n  position: relative;\n  overflow: hidden;\n  transition: all 150ms linear;\n}\n\n.dotsContainer {\n  display: flex;\n  flex-direction: row;\n  gap: 1rem;\n  width: 100%;\n  justify-content: center;\n}\n\n.dotButton {\n  background: none;\n  border: none;\n  padding: 8px;\n  cursor: pointer;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\n.dot {\n  cursor: pointer;\n  height: 12px;\n  width: 12px;\n  background-color: var(--swm-navy-light-20);\n  border-radius: 50%;\n  display: inline-block;\n  transition: background-color 0.4s ease;\n}\n\n.activeDot,\n.dot:hover {\n  background-color: var(--swm-red-light-100);\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/Testimonials/TestimonialList/styles.prev.css",
    "content": ".testimonialSlides {\n  overflow: hidden;\n}\n\n.testimonialSlidesContainer {\n  display: flex;\n  flex-direction: row;\n  width: 10000px;\n  transition: transform 0.3s ease-out;\n  /* width: 100%; */\n  /* position: relative; */\n}\n\n.testimonialSlide {\n  /* opacity: 0;\n  visibility: hidden;\n  transition: visibility 0.4s, opacity 0.4s ease-in-out; */\n}\n\n.activeTestimonialSlide {\n  /* visibility: visible !important;\n  opacity: 1 !important; */\n}\n\n.testimonialPair {\n  /* position: absolute; */\n  display: flex;\n  flex-direction: row;\n  gap: 3.5rem;\n  width: 100%;\n}\n\n.dotsContainer {\n  display: flex;\n  flex-direction: row;\n  gap: 1rem;\n  width: 100%;\n  margin-top: 2.5rem;\n  justify-content: center;\n}\n\n.dotButton {\n  background: none;\n  border: none;\n  padding: 8px;\n  cursor: pointer;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\n.dot {\n  cursor: pointer;\n  height: 12px;\n  width: 12px;\n  background-color: var(--swm-navy-light-20);\n  border-radius: 50%;\n  display: inline-block;\n  transition: background-color 0.4s ease;\n}\n\n.activeDot,\n.dot:hover {\n  background-color: var(--swm-red-light-100);\n}\n\n@media (max-width: 996px) {\n  .testimonialPair {\n    flex-direction: column;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/Testimonials/TestimonialList/testimonials.tsx",
    "content": "import type { Testimonial } from \"./types\";\n\nconst testimonials: Testimonial[] = [\n  {\n    author: 'Matt McGuiness',\n    company: 'Perch',\n    body: 'Perch has been using react-native-audio-api for streaming generated audio in our app and it’s been fantastic. The audio quality is crisp and features like variable playback speed work seamlessly without any hiccups. We’ve replaced all other audio libraries we were using with it.',\n    image: {\n      alt: 'Matt McGuiness',\n      src: 'https://perch-app-prod.s3.us-east-1.amazonaws.com/media/matt-mcguiness.png',\n    },\n  },\n  {\n    author: 'Kim Chouard',\n    company: 'Odisei Music',\n    body: `React-native-audio-api is a total game changer – it fills one of the biggest gaps in the React Native ecosystem. At Odisei Music, it powers all audio in Odisei Play, our saxophone learning app, where <10ms latency isn’t a luxury, it’s a necessity. No other solution even came close. This lib doesn’t just solve a problem, it unlocks a whole new category of apps for React Native devs.`,\n    link: 'https://odiseimusic.com/odisei-play/',\n    image: {\n      alt: 'Kim Chouard',\n      src: '/react-native-audio-api/img/kim-chouard.jpg',\n    },\n  },\n  {\n    author: 'Daniel Zohar',\n    company: 'Mindmax Labs',\n    body: 'react-native-audio-api significantly accelerated our development, allowing us to ditch a bunch of libraries and custom code. The team has been super responsive and tackled all issues quickly.',\n    image: {\n      alt: 'Daniel Zohar',\n      src: '/react-native-audio-api/img/daniel-zohar.jpeg',\n    },\n  }\n];\n\nexport default testimonials;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/Testimonials/TestimonialList/types.ts",
    "content": "\nexport interface Testimonial {\n  author: string;\n  company: string;\n  body: string | React.ReactNode;\n  link?: string;\n  image: {\n    alt: string;\n    src: string;\n  };\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/Testimonials/TestimonialList/useDrag.ts",
    "content": "\nimport { TouchEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport testimonials from './testimonials';\n\nfunction parseTranslateX(transform: string): number | null {\n  const match = transform.match(/translateX\\((-?\\d+.?\\d*)px\\)/);\n  return match ? parseFloat(match[1]) : null;\n}\n\nfunction minMax(value: number, min: number, max: number): number {\n  return Math.max(min, Math.min(value, max));\n}\n\nexport default function useDrag(currentOffset: number, setCurrentOffset: (offset: number) => void, activeIndex: number, onSetActiveSlide: (index: number) => void) {\n  const draggableRef = useRef<HTMLDivElement>(null);\n\n  const [isDragging, setIsDragging] = useState(false);\n  const touchStartRef = useRef<number | null>(null);\n  const touchEndRef = useRef<number | null>(null);\n  const [initialOffset, setInitialOffset] = useState(0);\n\n  const onTouchStart = useCallback((e: TouchEvent) => {\n    if (!draggableRef.current) {\n      return;\n    }\n\n    touchStartRef.current = e.targetTouches[0].clientX;\n    touchEndRef.current = null;\n    setIsDragging(true);\n\n    draggableRef.current.style.transition = 'none';\n    setInitialOffset(parseTranslateX(draggableRef.current.style.transform) || 0);\n\n    document.body.style.overflowX = 'hidden';\n  }, []);\n\n  const onTouchMove = useCallback((e: TouchEvent) => {\n    if (!isDragging || !touchStartRef.current || !draggableRef.current) {\n      return;\n    }\n\n    const currentX = e.targetTouches[0].clientX;\n    touchEndRef.current = currentX;\n\n    const maxOffset = draggableRef.current.clientWidth - (document.querySelector(`.testimonialContainer-${activeIndex}`)?.clientWidth || 0);\n\n    const offset = minMax(currentX - touchStartRef.current + initialOffset, -maxOffset, 0);\n    const container = draggableRef.current;\n\n    if (container) {\n      setCurrentOffset(-offset);\n    }\n  }, [isDragging, initialOffset, activeIndex, setCurrentOffset]);\n\n  const onTouchEnd = useCallback(() => {\n    if (!isDragging || !touchStartRef.current || !touchEndRef.current) {\n      return;\n    }\n\n    const distance = touchStartRef.current - touchEndRef.current;\n    const minDistance = 0.30 * (document.querySelector(`.testimonialContainer-0`)?.clientWidth || 0);\n    const isLeftSwipe = distance >= minDistance;\n    const isRightSwipe = distance <= -minDistance;\n\n    let newIndex = activeIndex;\n\n    if (isLeftSwipe) {\n      newIndex = Math.min(activeIndex + 1, testimonials.length - 1);\n    } else if (isRightSwipe) {\n      newIndex = Math.max(activeIndex - 1, 0);\n    }\n\n\n    document.body.style.overflowX = '';\n    draggableRef.current!.style.transition = 'transform 300ms ease-out';\n\n    if (newIndex !== activeIndex) {\n      onSetActiveSlide(newIndex);\n    } else {\n      setCurrentOffset(initialOffset);\n    }\n\n    touchStartRef.current = null;\n    touchEndRef.current = null;\n    setInitialOffset(0);\n\n    setIsDragging(false);\n  }, [isDragging, activeIndex, onSetActiveSlide, setCurrentOffset, initialOffset, currentOffset]);\n\n  const onTouchCancel = useCallback(() => {\n    setIsDragging(false);\n    document.body.style.overflowX = '';\n\n    touchStartRef.current = null;\n    touchEndRef.current = null;\n\n    if (draggableRef.current) {\n      draggableRef.current.style.transition = 'transform 300ms ease-out';\n      setCurrentOffset(initialOffset);\n    }\n\n    setInitialOffset(0);\n  }, []);\n\n  return {\n    ref: draggableRef,\n    onTouchStart,\n    onTouchMove,\n    onTouchEnd,\n    onTouchCancel,\n  };\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/Testimonials/index.tsx",
    "content": "import React from 'react';\nimport styles from './styles.module.css';\nimport TestimonialList from './TestimonialList';\n\nconst Testimonials = () => {\n  return (\n    <div className={styles.testimonialsContainer}>\n      <h2 className={styles.title}>What devs are saying</h2>\n      <TestimonialList />\n    </div>\n  );\n};\n\nexport default Testimonials;\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/Testimonials/styles.module.css",
    "content": ".testimonialsContainer {\n  display: flex;\n  position: relative;\n  flex-direction: column;\n  gap: 5rem;\n}\n.title {\n  font-size: var(--swm-h2-font-size);\n}\n\n@media (max-width: 768px) {\n  .testimonialsContainer {\n    gap: 1.5rem;\n  }\n}\n\n@media (max-width: 440px) {\n  .title {\n    font-size: 24px;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/landingComponents/index.ts",
    "content": "\nexport { default as FooterBackground } from './FooterBackground';\nexport { default as Hero } from './Hero';\nexport { default as HireUsSectionWrapper } from './HireUsSection';\nexport { default as HomepageButton } from './HomepageButton';\nexport { default as LandingBlog } from './LandingBlog';\nexport { default as LandingFeatures } from './LandingFeatures';\nexport { default as LandingWidget } from './LandingWidget';\nexport { default as Testimonials } from './Testimonials';\n\n"
  },
  {
    "path": "packages/audiodocs/src/pages/TestPage.tsx",
    "content": "import React, { ReactNode } from \"react\";\n\nimport { Container, Spacer } from \"@site/src/ui/Layout\";\nimport SliderInput from \"@site/src/ui/SliderInput\";\nimport Layout from '@theme/Layout';\n\nimport FrequencyResponseGraph from \"../examples/Biquad/FrequencyResponseGraph\";\n\nconst TestPage: React.FC = () => {\n  if (process.env.NODE_ENV !== \"development\") {\n    return null;\n  }\n\n  return (\n    <Layout>\n      <Container>\n        <div style={{ paddingTop: '120px' }}>\n          <h1>Test Page</h1>\n          <p>This is a test page for the AudioDocs app.</p>\n        </div>\n\n        <Spacer.Vertical size={32} />\n\n        <Section title=\"Simple UI Components\">\n          <ControlledSliderExample />\n        </Section>\n\n        <Spacer.Vertical size={128} />\n\n        <Section title=\"Complex UI Components\">\n          <FrequencyResponseGraph />\n        </Section>\n\n        <Spacer.Vertical size={128} />\n\n      </Container>\n    </Layout>\n  );\n};\n\nexport default TestPage;\n\n// Helper components and methods\n\nconst ControlledSliderExample: React.FC = () => {\n  const [value, setValue] = React.useState(50);\n\n  return (\n    <SliderInput\n      label=\"Slider\"\n      value={value}\n      min={0}\n      max={100}\n      step={1}\n      onChange={(nextValue) => setValue(nextValue)}\n    />\n  );\n};\n\ninterface SectionProps {\n  title: string;\n  children?: ReactNode | ReactNode[];\n}\n\nconst Section: React.FC<SectionProps> = ({ title, children }) => (\n  <div>\n    <h2 style={{ marginBottom: 16 }}>{title}</h2>\n    {children}\n  </div>\n);\n"
  },
  {
    "path": "packages/audiodocs/src/pages/index.tsx",
    "content": "import React, { useEffect } from 'react';\n\n// @ts-ignore\nimport Layout from '@theme/Layout';\n\nimport { FooterBackground, Hero, HireUsSectionWrapper, LandingBlog, LandingFeatures, LandingWidget, Testimonials } from '@site/src/landingComponents';\nimport { Spacer } from '@site/src/ui/Layout';\n\nimport AudioManager from '../audio/AudioManager';\nimport styles from './styles.module.css';\n\nfunction Home() {\n  useEffect(() => {\n    return () => {\n      AudioManager.clear();\n    }\n  }, []);\n\n  return (\n   <Layout\n      description=\"React Native Audio API is a library that lets you build powerful audio features in your app – from real-time effects and visualization to multi-track playback\">\n      <div className={styles.container}>\n        <Hero />\n      </div>\n      <Spacer.Vertical size=\"120px\" className={styles.hideOnMobile} />\n      <div className={styles.container}>\n        <LandingWidget />\n      </div>\n      <Spacer.Vertical size=\"120px\" className={styles.hideOnMobile}  />\n      <Spacer.Vertical size=\"56px\" className={styles.visibleOnMobile}  />\n      <div className={styles.container}>\n        <LandingFeatures />\n        <LandingBlog />\n        {/* <LandingExamples /> */}\n      </div>\n      <Spacer.Vertical size=\"10rem\" className={styles.hideOnMobile}  />\n      <Spacer.Vertical size=\"6rem\" className={styles.visibleOnMobile}  />\n      <div className={styles.container}>\n        <Testimonials />\n      </div>\n      <Spacer.Vertical size=\"12rem\" className={styles.hideOnMobile}  />\n      <Spacer.Vertical size=\"6rem\" className={styles.visibleOnMobile}  />\n      <div className={styles.container}>\n        <HireUsSectionWrapper\n          href={\n            'https://swmansion.com/contact/projects?utm_source=gesture-handler&utm_medium=docs'\n          }\n        />\n      </div>\n      <FooterBackground />\n    </Layout>\n  );\n}\n\nexport default Home;\n"
  },
  {
    "path": "packages/audiodocs/src/pages/styles.module.css",
    "content": ".container {\n  width: 60%;\n  margin: 0 auto;\n  display: flex;\n  flex-direction: column;\n  gap: 3rem;\n}\n\n.waveContainer {\n  position: relative;\n}\n\n.visibleOnMobile {\n  display: none;\n}\n\n@media (max-width: 1440px) {\n  .container {\n    width: 75%;\n  }\n}\n\n@media (max-width: 996px) {\n  .container {\n    width: 85%;\n    gap: 3.5rem;\n  }\n}\n\n@media (max-width: 768px) {\n  .hideOnMobile {\n    display: none;\n  }\n\n  .visibleOnMobile {\n    display: block;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/theme/CodeBlock/highlighting-dark.js",
    "content": "const darkTheme = require('prism-react-renderer').themes.github;\n\nmodule.exports = {\n  ...darkTheme,\n  plain: {\n    background: 'transparent',\n    color: 'var(--swm-navy-light-40)',\n  },\n  styles: [\n    ...darkTheme.styles,\n    {\n      types: ['comment', 'prolog', 'doctype', 'cdata'],\n      style: {\n        color: 'var(--swm-navy-light-60)',\n        fontStyle: 'italic',\n      },\n    },\n    {\n      types: ['namespace'],\n      style: {\n        opacity: 0.7,\n      },\n    },\n    {\n      types: ['string', 'property', 'atrule', 'selector', 'tag'],\n      style: {\n        color: 'var(--swm-navy-light-40)',\n      },\n    },\n    {\n      types: ['punctuation'],\n      style: {\n        color: 'var(--swm-green-light-80)',\n      },\n    },\n    {\n      types: [\n        'entity',\n        'url',\n        'symbol',\n        'number',\n        'boolean',\n        'variable',\n        'constant',\n        'regex',\n        'inserted',\n        'operator',\n        'attr-value',\n      ],\n      style: {\n        color: 'var(--swm-red-light-80)',\n      },\n    },\n    {\n      types: ['function', 'function-variable', 'deleted'],\n      style: {\n        color: 'var(--swm-purple-light-80)',\n      },\n    },\n    {\n      types: ['property', 'module', 'attr-name', 'keyword'],\n      style: {\n        color: 'var(--swm-blue-light-80)',\n      },\n    },\n  ],\n};\n"
  },
  {
    "path": "packages/audiodocs/src/theme/CodeBlock/highlighting-light.js",
    "content": "const lightTheme = require('prism-react-renderer').themes.github;\n\nmodule.exports = {\n  ...lightTheme,\n  plain: {\n    background: 'transparent',\n    color: 'var(--swm-navy-light-80)',\n  },\n  styles: [\n    ...lightTheme.styles,\n    {\n      types: ['comment', 'prolog', 'doctype', 'cdata'],\n      style: {\n        color: 'var(--swm-navy-light-40)',\n        fontStyle: 'italic',\n      },\n    },\n    {\n      types: ['namespace'],\n      style: {\n        opacity: 0.7,\n      },\n    },\n    {\n      types: ['string', 'property', 'atrule', 'selector', 'tag'],\n      style: {\n        color: 'var(--swm-navy-light-80)',\n      },\n    },\n    {\n      types: ['punctuation'],\n      style: {\n        color: 'var(--swm-blue-light-100)',\n      },\n    },\n    {\n      types: [\n        'entity',\n        'url',\n        'symbol',\n        'number',\n        'boolean',\n        'variable',\n        'constant',\n        'regex',\n        'inserted',\n        'operator',\n        'attr-value',\n      ],\n      style: {\n        color: 'var(--swm-green-light-100)',\n      },\n    },\n    {\n      types: ['function', 'function-variable', 'deleted'],\n      style: {\n        color: 'var(--swm-purple-light-100)',\n      },\n    },\n    {\n      types: ['property', 'module', 'attr-name', 'keyword'],\n      style: {\n        color: 'var(--swm-blue-light-100)',\n      },\n    },\n  ],\n};\n"
  },
  {
    "path": "packages/audiodocs/src/theme/DocSidebar/index.jsx",
    "content": "import useBaseUrl from '@docusaurus/useBaseUrl';\nimport { DocSidebar } from '@swmansion/t-rex-ui';\nimport React from 'react';\n\nexport default function DocSidebarWrapper(props) {\n  const titleImages = {\n    light: useBaseUrl('/img/title.svg?v=12'),\n    dark: useBaseUrl('/img/title-dark.svg?v=12'),\n  };\n\n  const heroImages = {\n    logo: useBaseUrl('/img/logo-hero.svg'),\n  };\n\n  const newItems = [];\n  const experimentalItems = [];\n  const unreleasedItems = [];\n\n  return (\n    <DocSidebar\n      newItems={newItems}\n      experimentalItems={experimentalItems}\n      unreleasedItems={unreleasedItems}\n      heroImages={heroImages}\n      titleImages={titleImages}\n      {...props}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/audiodocs/src/theme/Navbar/index.jsx",
    "content": "import { useLocation } from '@docusaurus/router';\nimport React from 'react';\n// eslint-disable-next-line import/no-unresolved\nimport useBaseUrl from '@docusaurus/useBaseUrl';\nimport TopPromoRotator, { PROMO_VERSION } from '@site/src/components/TopPromoRotator';\nimport { Navbar } from '@swmansion/t-rex-ui';\nimport './styles.css';\n\nexport default function NavbarWrapper(props) {\n  const location = useLocation();\n  const baseUrl = useBaseUrl('/');\n  const isLanding = location.pathname === baseUrl;\n\n  const [showPromo, setShowPromo] = React.useState(true);\n\n  React.useEffect(() => {\n    if (isLanding || typeof globalThis === 'undefined') {\n      return;\n    }\n\n    try {\n      const raw = globalThis.localStorage?.getItem('topPromoState');\n      const state = raw ? JSON.parse(raw) : null;\n      if (state?.v === PROMO_VERSION && state?.hidden) {\n        setShowPromo(false);\n      }\n    } catch (_) {\n      // ignore\n    }\n  }, [isLanding]);\n\n  const handleClosePromo = React.useCallback(() => {\n    setShowPromo(false);\n    if (typeof globalThis !== 'undefined') {\n      try {\n        globalThis.localStorage?.setItem(\n          'topPromoState',\n          JSON.stringify({ v: PROMO_VERSION, hidden: true })\n        );\n      } catch {\n        // ignore\n      }\n    }\n  }, []);\n\n  const titleImages = {\n    light: useBaseUrl('/img/title.svg?v=12'),\n    dark: useBaseUrl('/img/title-dark.svg?v=12'),\n  };\n\n  const heroImages = {\n    logo: useBaseUrl('/img/logo-hero.svg'),\n  };\n\n  return (\n    <div style={{ display: 'flex', flexDirection: 'column', flexShrink: 0 }}>\n      {isLanding ? (\n        <TopPromoRotator />\n      ) : (\n        showPromo && <TopPromoRotator onClose={handleClosePromo} />\n      )}\n      <Navbar\n        useLandingLogoDualVariant={true}\n        heroImages={heroImages}\n        titleImages={titleImages}\n        landingItems={[\n          {\n            href: '/react-native-audio-api/docs',\n            label: 'Docs',\n            position: 'right',\n            'aria-label': 'Documentation',\n          },\n        ]}\n        {...props}\n      >\n        <button type='button' className='navbar__toggle' aria-label='Toggle navigation'>\n          <span className='navbar__toggle-icon' />\n        </button>\n      </Navbar>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/audiodocs/src/theme/Navbar/styles.css",
    "content": "\n@media (max-width: 996px) {\n  .docs-doc-page .navbar__item {\n    display: none !important;\n  }\n}\n\n.navbar__item {\n  display: block !important;\n}\n\n"
  },
  {
    "path": "packages/audiodocs/src/theme/NotFound/index.jsx",
    "content": "import React from 'react';\nimport NotFound from '@theme-original/NotFound';\n\nexport default function NotFoundWrapper(props) {\n  return <NotFound {...props} />;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/theme/Root.jsx",
    "content": "import React from 'react';\nimport InitColorSchemeScript from '@mui/material/InitColorSchemeScript'\nimport { ThemeProvider } from '@mui/material/styles';\nimport theme from '@site/src/theme/muiTheme';\n\nexport default function Root({ children }) {\n  return (\n    <>\n      <InitColorSchemeScript />\n      <ThemeProvider theme={theme}>{children}</ThemeProvider>\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/audiodocs/src/theme/SkipToContent/index.jsx",
    "content": "import React from 'react';\nimport { SkipToContentLink } from '@docusaurus/theme-common';\nimport styles from './styles.module.css';\nimport clsx from 'clsx';\nimport usePageType from '@site/src/hooks/usePageType';\nexport default function SkipToContent() {\n  const { isDocumentation } = usePageType();\n  return (\n    <SkipToContentLink\n      className={clsx(styles.skipToContent, !isDocumentation && styles.hidden)}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/audiodocs/src/theme/SkipToContent/styles.module.css",
    "content": ".skipToContent {\n  position: fixed;\n  top: 1rem;\n  left: 100%;\n  z-index: calc(var(--ifm-z-index-fixed) + 1);\n  padding: calc(var(--ifm-global-spacing) / 2) var(--ifm-global-spacing);\n  color: var(--ifm-color-emphasis-900);\n  background-color: var(--ifm-background-surface-color);\n}\n\n.skipToContent:focus {\n  left: 1rem;\n  box-shadow: var(--ifm-global-shadow-md);\n}\n\n.hidden {\n  display: none;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/theme/TOCItems/Tree/index.js",
    "content": "export { TOCItemTree as default } from '@swmansion/t-rex-ui';\n"
  },
  {
    "path": "packages/audiodocs/src/theme/TOCItems/index.js",
    "content": "import { TOCItems } from '@swmansion/t-rex-ui';\n\nimport RadonBanner from '../../components/RadonBanner';\n\nexport default function TOCItemsWrapper(props) {\n  return <TOCItems {...props} slot={<RadonBanner />} />;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/theme/Tabs/index.jsx",
    "content": "import React from 'react';\nimport Tabs from '@theme-original/Tabs';\nimport styles from './styles.module.css';\nimport clsx from 'clsx';\n\nexport default function TabsWrapper(props) {\n  return (\n    <>\n      <div className={clsx(styles.tabs__wrapper)}>\n        <Tabs {...props} />\n      </div>\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/audiodocs/src/theme/Tabs/styles.module.css",
    "content": ".tabs__wrapper {\n}\n\n[class*='tabs__item']:hover {\n  background-color: inherit;\n}\n\nul[role='tablist'] li {\n  padding: 4px 16px;\n\n  color: var(--swm-tab);\n  transition: color 0.15s, border-bottom-color 0.15s;\n\n  border-bottom: 4px solid var(--swm-tab);\n  border-radius: 0;\n}\n\nul[role='tablist'] li:hover {\n  color: var(--swm-tab-hover);\n  border-bottom-color: var(--swm-tab-hover);\n}\n\nul[role='tablist'] li[class*='active'] {\n  color: var(--swm-tab-active);\n  border-bottom-color: var(--swm-tab-active);\n}\n"
  },
  {
    "path": "packages/audiodocs/src/theme/muiTheme.jsx",
    "content": "import { extendTheme } from '@mui/material/styles';\n\nimport Aeonik from '../../static/fonts/Aeonik-Regular.otf';\n\n// General MUI theme\nconst extTheme = extendTheme({\n  typography: {\n    fontFamily: 'Aeonik, Arial',\n  },\n  colorSchemes: {\n    light: {\n      palette: {\n        text: {\n          secondary: '#6676aa',\n        },\n        primary: {\n          main: '#001a72', //--swm-navy-light-100\n        },\n        secondary: {\n          main: '#782aeb', //--swm-purple-light-100\n        },\n        background: {\n          default: '#fcfcff',\n          paper: '#f8f9ff',\n        },\n      },\n    },\n    dark: {\n      palette: {\n        text: {\n          secondary: '#919fcf',\n        },\n        primary: {\n          main: '#eef0ff', //--swm-navy-light-10\n        },\n        secondary: {\n          main: '#b58df1', //--swm-purple-light-80\n        },\n        background: {\n          default: '#232736',\n          paper: '#272b3c',\n        },\n      },\n    },\n  },\n  components: {\n    MuiCssBaseline: {\n      styleOverrides: `\n        @font-face {\n          font-family: 'Aeonik';\n          font-style: normal;\n          font-display: swap;\n          font-weight: 400;\n          src: local('Aeonik'), local('Aeonik-Regular'), url(${Aeonik}) format('otf');\n      `,\n    },\n  },\n});\n\nexport default extTheme;\n"
  },
  {
    "path": "packages/audiodocs/src/types.d.ts",
    "content": "\ndeclare module '*.png' {\n  const value: string;\n  export default value;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/ui/DetailBox/DetailBox.tsx",
    "content": "import clsx from \"clsx\";\nimport React, { memo, useCallback, useState } from \"react\";\n\nimport Icon from \"../Icon\";\nimport styles from \"./styles.module.css\";\n\ninterface DetailBoxProps {\n  tag?: string;\n  info?: string;\n  startOpen?: boolean;\n  children?: React.ReactNode;\n  className?: string;\n}\n\nconst DetailBox: React.FC<DetailBoxProps> = ({ tag, info, startOpen = true, children, className }) => {\n  const [isOpen, setIsOpen] = useState(startOpen);\n\n  const onClick = useCallback(() => {\n    setIsOpen((open) => !open);\n  }, []);\n\n  return (\n    <div className={clsx(styles.detailBox, className)}>\n      <div className={styles.detailBoxHeader}  onClick={onClick}>\n        <div\n          className={\n            isOpen\n              ? `${styles.detailBoxChevron} ${styles.detailBoxChevronOpen}`\n              : styles.detailBoxChevron\n          }\n        >\n          <Icon name=\"chevronDown\" size={16} />\n        </div>\n        {!!tag && <code className={styles.detailBoxTag}>{tag}</code>}\n        {!!info && <span className={styles.detailBoxInfo}>{info}</span>}\n      </div>\n      {isOpen && (\n        <>\n          <div className={styles.detailBoxContent}>\n            {children}\n          </div>\n          <div className={styles.detailBoxClear} />\n        </>\n      )}\n    </div>\n  );\n};\n\nexport default memo(DetailBox);\n"
  },
  {
    "path": "packages/audiodocs/src/ui/DetailBox/index.ts",
    "content": "export { default } from './DetailBox';\n"
  },
  {
    "path": "packages/audiodocs/src/ui/DetailBox/styles.module.css",
    "content": "\n.detailBox {\n  background-color: var(--audiodocs-detail-box-bg, var(--swm-red-light-20));\n  box-shadow: -10px 10px 0 var(--audiodocs-detail-box-shadow, var(--swm-red-light-100));\n  margin-bottom: 20px;\n}\n\n.detailBoxHeader {\n  padding: 24px 32px;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  gap: 6px;\n}\n\n.detailBoxChevron {\n  width: 16px;\n  height: 16px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  transform: rotate(0deg);\n  transform-origin: center;\n  transition: transform 0.2s ease;\n  will-change: transform;\n  backface-visibility: hidden;\n}\n\n.detailBoxChevronOpen {\n  transform: rotate(180deg);\n}\n\n.detailBoxTag {\n  background-color: var(--audiodocs-detail-box-tag-bg, var(--swm-red-light-40));\n  color: var(--audiodocs-detail-box-tag-color, var(--swm-navy));\n  font-weight: 400;\n  padding: 4px;\n  border: none;\n  margin: 0 0.2rem 0 0;\n  font-size: 0.8rem;\n}\n\n.detailBoxInfo {\n  color: var(--audiodocs-detail-box-info-color, var(--swm-navy));\n  font-size: 1rem;\n  font-weight: 400;\n}\n\n.detailBoxContent {\n  margin: 0 32px;\n  border: 1px solid var(--swm-border);\n  background: var(--swm-off-background);\n}\n\n.detailBoxClear {\n  width: 100%;\n  clear: both;\n  padding-top: 32px;\n}\n\n:root[data-theme='dark'] {\n  --audiodocs-detail-box-bg: var(--swm-red-dark-140);\n  --audiodocs-detail-box-shadow: var(--swm-red-dark-100);\n  --audiodocs-detail-box-tag-bg: var(--swm-red-dark-100);\n  --audiodocs-detail-box-tag-color: var(--swm-off-white);\n  --audiodocs-detail-box-info-color: var(--swm-off-white);\n}\n\n@media (max-width: 996px) {\n  .detailBoxHeader {\n    padding: 20px 24px;\n  }\n\n  .detailBoxContent {\n    margin: 0 24px;\n  }\n\n  .detailBoxClear {\n    padding-top: 24px;\n  }\n}\n\n@media (max-width: 768px) {\n  .detailBoxHeader {\n    padding: 16px;\n    gap: 8px;\n  }\n\n  .detailBoxChevron {\n    width: 14px;\n    height: 14px;\n  }\n\n  .detailBoxTag {\n    font-size: 0.75rem;\n  }\n\n  .detailBoxInfo {\n    font-size: 0.95rem;\n    line-height: 1.35;\n  }\n\n  .detailBoxContent {\n    margin: 0 16px;\n  }\n\n  .detailBoxClear {\n    padding-top: 16px;\n  }\n}\n\n@media (max-width: 480px) {\n  .detailBoxHeader {\n    padding: 12px;\n  }\n\n  .detailBoxInfo {\n    font-size: 0.9rem;\n  }\n\n  .detailBoxContent {\n    margin: 0 12px;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/ui/FilterList/FilterList.tsx",
    "content": "import FormControl from '@mui/material/FormControl';\nimport InputLabel from '@mui/material/InputLabel';\nimport MenuItem from '@mui/material/MenuItem';\nimport Select, { SelectChangeEvent } from '@mui/material/Select';\nimport React, { useCallback, useId } from 'react';\nimport styles from './styles.module.css';\n\nexport interface FilterListOption<T extends string = string> {\n  value: T;\n  label: string;\n}\n\ninterface FilterListProps<T extends string = string> {\n  options: Array<FilterListOption<T>>;\n  value: T;\n  onChange: (value: T) => void;\n  ariaLabel?: string;\n  className?: string;\n}\n\nconst FilterList = <T extends string>({\n  options,\n  value,\n  onChange,\n  ariaLabel = 'Filter type',\n  className,\n}: FilterListProps<T>) => {\n  const labelId = useId();\n\n  const handleSelectChange = useCallback((event: SelectChangeEvent<string>) => {\n    onChange(event.target.value as T);\n  }, [onChange]);\n\n  return (\n    <div className={className ? `${styles.container} ${className}` : styles.container}>\n      <div className={styles.buttonList} role=\"radiogroup\" aria-label={ariaLabel}>\n        {options.map((option) => (\n          <button\n            key={option.value}\n            type=\"button\"\n            onClick={() => onChange(option.value)}\n            className={option.value === value ? `${styles.button} ${styles.buttonActive}` : styles.button}\n            aria-pressed={option.value === value}\n          >\n            {option.label}\n          </button>\n        ))}\n      </div>\n\n      <div className={styles.mobileSelectContainer}>\n        <FormControl fullWidth size=\"small\" className={styles.formControl}>\n          <InputLabel id={labelId} className={styles.inputLabel}>\n            Filter type\n          </InputLabel>\n          <Select\n            labelId={labelId}\n            className={styles.select}\n            value={value}\n            label=\"Filter type\"\n            onChange={handleSelectChange}\n            inputProps={{ 'aria-label': ariaLabel }}\n            MenuProps={{\n              PaperProps: { className: styles.menuPaper },\n            }}\n          >\n            {options.map((option) => (\n              <MenuItem key={option.value} value={option.value} className={styles.menuItem}>\n                {option.label}\n              </MenuItem>\n            ))}\n          </Select>\n        </FormControl>\n      </div>\n    </div>\n  );\n};\n\nexport default FilterList;\n"
  },
  {
    "path": "packages/audiodocs/src/ui/FilterList/index.ts",
    "content": "export { default } from './FilterList';\n"
  },
  {
    "path": "packages/audiodocs/src/ui/FilterList/styles.module.css",
    "content": ".container {\n  margin-top: 16px;\n}\n\n.buttonList {\n  display: flex;\n  flex-direction: row;\n  flex-wrap: wrap;\n  gap: 8px;\n}\n\n.button {\n  background-color: var(--swm-code-lines-buttons-background);\n  border: none;\n  color: var(--swm-navy);\n  cursor: pointer;\n  font: inherit;\n  padding: 8px 12px;\n  text-transform: capitalize;\n}\n\n[data-theme='dark'] .button {\n  color: var(--swm-off-white);\n}\n\n.buttonActive {\n  background-color: var(--swm-red-light-80);\n  color: #fcfcff;\n  font-weight: 700;\n}\n\n[data-theme='dark'] .buttonActive {\n  color: #fcfcff;\n}\n\n.mobileSelectContainer {\n  display: none;\n}\n\n.formControl {\n  margin-top: 4px;\n}\n\n.formControl :global(.MuiFormLabel-root.Mui-focused) {\n  color: var(--swm-navy);\n}\n\n.select {\n  font: inherit;\n}\n\n.select :global(.MuiOutlinedInput-notchedOutline) {\n  border: none;\n}\n\n.select :global(.MuiSelect-select) {\n  background-color: var(--swm-code-lines-buttons-background);\n  color: var(--swm-navy);\n  min-height: 40px;\n  padding: 8px 12px;\n}\n\n.inputLabel {\n  color: var(--swm-navy);\n}\n\n[data-theme='dark'] .formControl :global(.MuiFormLabel-root.Mui-focused) {\n  color: var(--swm-off-white);\n}\n\n[data-theme='dark'] .select :global(.MuiOutlinedInput-notchedOutline) {\n  border: none;\n}\n\n[data-theme='dark'] .select :global(.MuiSelect-select) {\n  color: var(--swm-off-white);\n}\n\n[data-theme='dark'] .inputLabel {\n  color: var(--swm-off-white);\n}\n\n[data-theme='dark'] .select {\n  color: var(--swm-off-white);\n}\n\n.select :global(.MuiSvgIcon-root) {\n  color: var(--swm-navy);\n}\n\n[data-theme='dark'] .select :global(.MuiSvgIcon-root) {\n  color: var(--swm-off-white);\n}\n\n.menuPaper {\n  --filter-list-menu-background: var(--swm-off-white);\n  --filter-list-menu-border: var(--swm-navy-light-20);\n  --filter-list-menu-item-color: var(--swm-navy);\n  --filter-list-menu-item-hover: var(--swm-red-light-20);\n  --filter-list-menu-item-selected-bg: var(--swm-red-light-80);\n  --filter-list-menu-item-selected-color: var(--swm-navy);\n\n  background-color: var(--filter-list-menu-background);\n  border: 1px solid var(--filter-list-menu-border);\n  border-radius: 0;\n  margin-top: 4px;\n}\n\n.menuItem {\n  color: var(--filter-list-menu-item-color);\n  font: inherit;\n}\n\n:global(.MuiMenuItem-root).menuItem:global(.Mui-selected),\n:global(.MuiMenuItem-root).menuItem:global(.Mui-selected:hover) {\n  background-color: var(--filter-list-menu-item-selected-bg) !important;\n  color: var(--filter-list-menu-item-selected-color) !important;\n}\n\n:global(.MuiMenuItem-root).menuItem:hover,\n:global(.MuiMenuItem-root).menuItem:global(.Mui-focusVisible) {\n  background-color: var(--filter-list-menu-item-hover) !important;\n}\n\n:global(html[data-theme='dark']) {\n  .menuPaper {\n    --filter-list-menu-background: var(--swm-navy);\n    --filter-list-menu-border: var(--swm-navy-dark-60);\n    --filter-list-menu-item-color: var(--swm-off-white);\n    --filter-list-menu-item-hover: var(--swm-red-dark-140);\n    --filter-list-menu-item-selected-bg: var(--swm-red-dark-100);\n    --filter-list-menu-item-selected-color: var(--swm-off-white);\n\n    background-color: var(--filter-list-menu-background);\n    border: 1px solid var(--filter-list-menu-border);\n    border-radius: 0;\n    margin-top: 4px;\n  }\n\n  .menuItem {\n    color: var(--filter-list-menu-item-color);\n    font: inherit;\n  }\n\n  :global(.MuiMenuItem-root).menuItem:global(.Mui-selected),\n  :global(.MuiMenuItem-root).menuItem:global(.Mui-selected:hover) {\n    background-color: var(--filter-list-menu-item-selected-bg) !important;\n    color: var(--filter-list-menu-item-selected-color) !important;\n  }\n\n  :global(.MuiMenuItem-root).menuItem:hover,\n  :global(.MuiMenuItem-root).menuItem:global(.Mui-focusVisible) {\n    background-color: var(--filter-list-menu-item-hover) !important;\n  }\n}\n\n@media (max-width: 768px) {\n  .buttonList {\n    display: none;\n  }\n\n  .mobileSelectContainer {\n    display: block;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Icon/Icon.tsx",
    "content": "import React, { memo } from 'react';\nimport styles from './styles.module.css';\n\nimport ChevronDownIcon from '@site/static/icons/chevron-down.svg';\nimport ChevronUpIcon from '@site/static/icons/chevron-up.svg';\nimport ClockForwardIcon from '@site/static/icons/clock-forward.svg';\nimport DevicesIcon from '@site/static/icons/devices.svg';\nimport EqualizerIcon from '@site/static/icons/equalizer.svg';\nimport SoundWaveIcon from '@site/static/icons/soundwave.svg';\nimport SpeakerCrossedIcon from '@site/static/icons/speaker-crossed.svg';\nimport SpeakerIcon from '@site/static/icons/speaker.svg';\nimport WaveSawtoothIcon from '@site/static/icons/wave-sawtooth.svg';\n\nimport ForwardIcon from '@site/static/img/forward.svg';\nimport PauseIcon from '@site/static/img/puase.svg';\nimport PlayIcon from '@site/static/img/play.svg';\nimport RewindIcon from '@site/static/img/rewind.svg';\nimport SpeakerWaveIcon from '@site/static/img/speakerWave.svg';\nimport SpeakerXIcon from '@site/static/img/speakerX.svg';\n\nconst icons = {\n  chevronDown: ChevronDownIcon,\n  chevronUp: ChevronUpIcon,\n  clockForward: ClockForwardIcon,\n  devices: DevicesIcon,\n  equalizer: EqualizerIcon,\n  forward: ForwardIcon,\n  pause: PauseIcon,\n  play: PlayIcon,\n  rewind: RewindIcon,\n  soundwave: SoundWaveIcon,\n  speaker: SpeakerIcon,\n  speakerCrossed: SpeakerCrossedIcon,\n  speakerWave: SpeakerWaveIcon,\n  speakerX: SpeakerXIcon,\n  waveSawtooth: WaveSawtoothIcon,\n};\n\nexport type IconName = keyof typeof icons;\n\nexport interface IconProps extends React.SVGProps<SVGSVGElement> {\n  name: IconName;\n  size?: number | string;\n}\n\nconst Icon: React.FC<IconProps> = ({\n  name,\n  size = 24,\n  width,\n  height,\n  className,\n  ...rest\n}) => {\n  const IconComponent = icons[name];\n  const iconClassName = className\n    ? `${styles.icon} ${className}`\n    : styles.icon;\n\n  return (\n    <IconComponent\n      {...rest}\n      className={iconClassName}\n      height={height ?? size}\n      width={width ?? size}\n    />\n  );\n};\n\nexport default memo(Icon);\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Icon/index.ts",
    "content": "export { default } from './Icon';\nexport { default as Icon } from './Icon';\nexport type { IconName, IconProps } from './Icon';\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Icon/styles.module.css",
    "content": ".icon {\n  display: inline-flex;\n  flex-shrink: 0;\n}\n\n.icon :global(path) {\n  vector-effect: non-scaling-stroke;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Layout/Box/index.tsx",
    "content": "import clsx from \"clsx\";\nimport React, { memo, PropsWithChildren } from \"react\";\n\nimport styles from \"./styles.module.css\";\n\n\ntype BoxProps = PropsWithChildren<{\n  className?: string;\n  variant?: 'red';\n}>;\n\nconst Box: React.FC<BoxProps> = ({ className, variant = 'red', children }) => {\n  const variantClass = ({\n    red: styles.boxRed,\n  })[variant]\n\n  const classes = clsx(styles.box, className, variantClass);\n\n  return (\n    <section className={classes}>\n      {children}\n    </section>\n  );\n}\n\nexport default memo(Box);\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Layout/Box/styles.module.css",
    "content": "\n\n.box {\n  width: 100%;\n  padding: 20px;\n}\n\n.boxRed {\n  background-color: var(--swm-red-light-60);\n  box-shadow: -12px 12px 0px var(--swm-red-light-100);\n}\n\n[data-theme='dark'] .boxRed {\n  /* background-color: var(--swm-red-dark-60);\n  box-shadow: -12px 12px 0px var(--swm-red-dark-100); */\n}\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Layout/Column/index.tsx",
    "content": "import clsx from \"clsx\";\nimport React, { memo, PropsWithChildren } from \"react\";\n\nimport styles from \"./styles.module.css\";\n\ntype ColumnProps = PropsWithChildren<{\n  className?: string;\n}>;\n\nconst Column: React.FC<ColumnProps> = ({ className, children }) => {\n  return (\n    <div className={clsx(styles.col, className)}>\n      {children}\n    </div>\n  );\n};\n\nexport default memo(Column);\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Layout/Column/styles.module.css",
    "content": "\n.col {\n  display: flex;\n  flex-direction: column;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Layout/Container/Container.tsx",
    "content": "import React from 'react';\nimport styles from './styles.module.css';\n\nexport type ContainerProps = React.HTMLAttributes<HTMLDivElement>;\n\nconst Container: React.FC<ContainerProps> = ({\n  children,\n  className,\n  ...rest\n}) => {\n  const rootClassName = className\n    ? `${styles.container} ${className}`\n    : styles.container;\n\n  return (\n    <div className={rootClassName} {...rest}>\n      {children}\n    </div>\n  );\n};\n\nexport default Container;\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Layout/Container/index.tsx",
    "content": "export { default } from './Container';\nexport type { ContainerProps } from './Container';\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Layout/Container/styles.module.css",
    "content": ".container {\n  box-sizing: border-box;\n  margin-left: auto;\n  margin-right: auto;\n  max-width: 1200px;\n  padding-left: 16px;\n  padding-right: 16px;\n  width: 100%;\n}\n\n@media (min-width: 768px) {\n  .container {\n    padding-left: 24px;\n    padding-right: 24px;\n  }\n}\n\n@media (min-width: 1024px) {\n  .container {\n    padding-left: 32px;\n    padding-right: 32px;\n    max-width: 75%;\n  }\n}\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Layout/Row/index.tsx",
    "content": "import clsx from \"clsx\";\nimport React, { memo, PropsWithChildren } from \"react\";\n\nimport styles from \"./styles.module.css\";\n\ntype RowProps = PropsWithChildren<{\n  className?: string;\n  align?: 'start' | 'center' | 'end';\n  justify?: 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';\n}>;\n\nconst Row: React.FC<RowProps> = ({ className, align, justify, children }) => {\n  const alignClass = ({\n    start: styles.start,\n    center: styles.center,\n    end: styles.end,\n    undefined: '',\n  })[align];\n\n  const justifyClass = ({\n    start: styles.justifyStart,\n    center: styles.justifyCenter,\n    end: styles.justifyEnd,\n    between: styles.justifyBetween,\n    around: styles.justifyAround,\n    evenly: styles.justifyEvenly,\n    undefined: '',\n  })[justify];\n\n  return (\n    <div className={clsx(styles.row, alignClass, justifyClass, className)}>\n      {children}\n    </div>\n  );\n};\n\nexport default memo(Row);\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Layout/Row/styles.module.css",
    "content": "\n.row {\n  display: flex;\n  flex-direction: row;\n}\n\n.center {\n  align-items: center;\n}\n\n.start {\n  align-items: flex-start;\n}\n\n.end {\n  align-items: flex-end;\n}\n\n.justifyStart {\n  justify-content: flex-start;\n}\n\n.justifyCenter {\n  justify-content: center;\n}\n\n.justifyEnd {\n  justify-content: flex-end;\n}\n\n.justifyBetween {\n  justify-content: space-between;\n}\n\n.justifyAround {\n  justify-content: space-around;\n}\n\n.justifyEvenly {\n  justify-content: space-evenly;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Layout/Spacer/Spacer.tsx",
    "content": "import React, { useMemo } from 'react';\nimport styles from './styles.module.css';\n\ntype SpacerSize = number | string;\n\ntype BaseSpacerProps = Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> & {\n  size?: SpacerSize;\n};\n\nexport type HorizontalSpacerProps = BaseSpacerProps;\nexport type VerticalSpacerProps = BaseSpacerProps;\nexport type SpacerProps = BaseSpacerProps;\n\nfunction normalizeSize(size: SpacerSize = 8): string {\n  return typeof size === 'number' ? `${size}px` : size;\n}\n\nconst Horizontal: React.FC<HorizontalSpacerProps> = ({\n  size = 8,\n  className,\n  style,\n  ...rest\n}) => {\n  const rootClassName = className\n    ? `${styles.horizontal} ${className}`\n    : styles.horizontal;\n  const spacerStyle = useMemo(\n    () =>\n      ({\n        ...style,\n        '--spacer-size': normalizeSize(size),\n      }) as React.CSSProperties,\n    [size, style]\n  );\n\n  return <div aria-hidden=\"true\" className={rootClassName} style={spacerStyle} {...rest} />;\n};\n\nconst Vertical: React.FC<VerticalSpacerProps> = ({\n  size = 8,\n  className,\n  style,\n  ...rest\n}) => {\n  const rootClassName = className\n    ? `${styles.vertical} ${className}`\n    : styles.vertical;\n  const spacerStyle = useMemo(\n    () =>\n      ({\n        ...style,\n        '--spacer-size': normalizeSize(size),\n      }) as React.CSSProperties,\n    [size, style]\n  );\n\n  return <div aria-hidden=\"true\" className={rootClassName} style={spacerStyle} {...rest} />;\n};\n\nconst Spacer = {\n  Horizontal,\n  Vertical,\n};\n\nexport default Spacer;\nexport { Horizontal as HorizontalSpacer, Vertical as VerticalSpacer };\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Layout/Spacer/index.tsx",
    "content": "export { default } from './Spacer';\nexport { HorizontalSpacer, VerticalSpacer } from './Spacer';\nexport type {\n  HorizontalSpacerProps,\n  VerticalSpacerProps,\n  SpacerProps,\n} from './Spacer';\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Layout/Spacer/styles.module.css",
    "content": ".horizontal,\n.vertical {\n  display: block;\n}\n\n.horizontal {\n  flex: 0 0 var(--spacer-size);\n  min-width: var(--spacer-size);\n  width: var(--spacer-size);\n}\n\n.vertical {\n  flex: 0 0 var(--spacer-size);\n  height: var(--spacer-size);\n  min-height: var(--spacer-size);\n}\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Layout/index.tsx",
    "content": "export { default as Box } from './Box';\n\nexport { default as Column } from './Column';\nexport { default as Row } from './Row';\n\nexport { default as Container } from './Container';\nexport type { ContainerProps } from './Container';\n\nexport { default as Spacer } from './Spacer';\n\nexport type {\n  HorizontalSpacerProps, SpacerProps, VerticalSpacerProps\n} from './Spacer';\n\n"
  },
  {
    "path": "packages/audiodocs/src/ui/ResponsiveCanvas/ResponsiveCanvas.tsx",
    "content": "import React, { memo, useCallback, useEffect, useRef } from 'react';\nimport styles from './styles.module.css';\n\nexport interface ResponsiveCanvasDrawParams {\n  canvas: HTMLCanvasElement;\n  context: CanvasRenderingContext2D;\n  width: number;\n  height: number;\n  cssWidth: number;\n  cssHeight: number;\n  dpr: number;\n}\n\nexport interface ResponsiveCanvasProps\n  extends Omit<React.CanvasHTMLAttributes<HTMLCanvasElement>, 'height' | 'width'> {\n  onDraw: (params: ResponsiveCanvasDrawParams) => void;\n  aspectRatio?: number;\n  height?: number;\n  throttleMs?: number;\n  containerClassName?: string;\n  canvasRef?: React.Ref<HTMLCanvasElement>;\n}\n\nconst DEFAULT_ASPECT_RATIO = 16 / 9;\nconst DEFAULT_THROTTLE_MS = 80;\n\nconst ResponsiveCanvas: React.FC<ResponsiveCanvasProps> = ({\n  onDraw,\n  aspectRatio = DEFAULT_ASPECT_RATIO,\n  height,\n  throttleMs = DEFAULT_THROTTLE_MS,\n  className,\n  containerClassName,\n  canvasRef: externalCanvasRef,\n  ...canvasProps\n}) => {\n  const containerRef = useRef<HTMLDivElement | null>(null);\n  const internalCanvasRef = useRef<HTMLCanvasElement | null>(null);\n  const rafIdRef = useRef<number | null>(null);\n  const timeoutIdRef = useRef<number | null>(null);\n  const lastDrawTimeRef = useRef(0);\n  const drawRef = useRef<() => void>(() => undefined);\n\n  const setCanvasRef = useCallback((element: HTMLCanvasElement | null) => {\n    internalCanvasRef.current = element;\n\n    if (typeof externalCanvasRef === 'function') {\n      externalCanvasRef(element);\n      return;\n    }\n\n    if (externalCanvasRef) {\n      externalCanvasRef.current = element;\n    }\n  }, [externalCanvasRef]);\n\n  const clearScheduledDraw = useCallback(() => {\n    if (typeof window === 'undefined') {\n      return;\n    }\n\n    if (timeoutIdRef.current !== null) {\n      window.clearTimeout(timeoutIdRef.current);\n      timeoutIdRef.current = null;\n    }\n\n    if (rafIdRef.current !== null) {\n      window.cancelAnimationFrame(rafIdRef.current);\n      rafIdRef.current = null;\n    }\n  }, []);\n\n  const scheduleDraw = useCallback((immediate = false) => {\n    if (typeof window === 'undefined') {\n      return;\n    }\n\n    const runDraw = () => {\n      rafIdRef.current = window.requestAnimationFrame(() => {\n        rafIdRef.current = null;\n        drawRef.current();\n        lastDrawTimeRef.current = Date.now();\n      });\n    };\n\n    if (immediate) {\n      clearScheduledDraw();\n      runDraw();\n      return;\n    }\n\n    if (timeoutIdRef.current !== null || rafIdRef.current !== null) {\n      return;\n    }\n\n    const elapsed = Date.now() - lastDrawTimeRef.current;\n    const delay = Math.max(0, throttleMs - elapsed);\n\n    timeoutIdRef.current = window.setTimeout(() => {\n      timeoutIdRef.current = null;\n      runDraw();\n    }, delay);\n  }, [clearScheduledDraw, throttleMs]);\n\n  useEffect(() => {\n    drawRef.current = () => {\n      const container = containerRef.current;\n      const canvas = internalCanvasRef.current;\n\n      if (!container || !canvas) {\n        return;\n      }\n\n      const cssWidth = Math.max(1, Math.floor(container.clientWidth));\n      const ratio = aspectRatio > 0 ? aspectRatio : DEFAULT_ASPECT_RATIO;\n      const cssHeight = Math.max(\n        1,\n        Math.floor(typeof height === 'number' ? height : cssWidth / ratio)\n      );\n\n      const dpr = (typeof window !== 'undefined' && window.devicePixelRatio)\n        ? window.devicePixelRatio\n        : 1;\n      const width = Math.max(1, Math.floor(cssWidth * dpr));\n      const computedHeight = Math.max(1, Math.floor(cssHeight * dpr));\n\n      if (canvas.width !== width) {\n        canvas.width = width;\n      }\n      if (canvas.height !== computedHeight) {\n        canvas.height = computedHeight;\n      }\n\n      canvas.style.width = `${cssWidth}px`;\n      canvas.style.height = `${cssHeight}px`;\n\n      const context = canvas.getContext('2d');\n      if (!context) {\n        return;\n      }\n\n      onDraw({\n        canvas,\n        context,\n        width,\n        height: computedHeight,\n        cssWidth,\n        cssHeight,\n        dpr,\n      });\n    };\n\n    scheduleDraw(true);\n  }, [aspectRatio, height, onDraw, scheduleDraw]);\n\n  useEffect(() => {\n    if (typeof window === 'undefined') {\n      return undefined;\n    }\n\n    const handleResize = () => {\n      scheduleDraw();\n    };\n\n    const observer = typeof ResizeObserver !== 'undefined'\n      ? new ResizeObserver(handleResize)\n      : null;\n\n    if (observer && containerRef.current) {\n      observer.observe(containerRef.current);\n    }\n\n    window.addEventListener('resize', handleResize);\n\n    return () => {\n      window.removeEventListener('resize', handleResize);\n      observer?.disconnect();\n      clearScheduledDraw();\n    };\n  }, [clearScheduledDraw, scheduleDraw]);\n\n  const rootClassName = containerClassName\n    ? `${styles.container} ${containerClassName}`\n    : styles.container;\n\n  const canvasClassName = className\n    ? `${styles.canvas} ${className}`\n    : styles.canvas;\n\n  return (\n    <div ref={containerRef} className={rootClassName}>\n      <canvas ref={setCanvasRef} className={canvasClassName} {...canvasProps} />\n    </div>\n  );\n};\n\nexport default memo(ResponsiveCanvas);\n"
  },
  {
    "path": "packages/audiodocs/src/ui/ResponsiveCanvas/index.ts",
    "content": "export { default } from './ResponsiveCanvas';\nexport type {\n  ResponsiveCanvasProps,\n  ResponsiveCanvasDrawParams,\n} from './ResponsiveCanvas';\n"
  },
  {
    "path": "packages/audiodocs/src/ui/ResponsiveCanvas/styles.module.css",
    "content": ".container {\n  width: 100%;\n  display: block;\n}\n\n.canvas {\n  display: block;\n}\n"
  },
  {
    "path": "packages/audiodocs/src/ui/SliderInput/SliderInput.tsx",
    "content": "import Slider from '@mui/material/Slider';\nimport React, { useCallback, useMemo } from 'react';\nimport styles from './styles.module.css';\nimport type { SliderInputProps } from './types';\nimport { formatValue, normalizeValue } from './utils';\n\nconst SliderInput: React.FC<SliderInputProps> = ({\n  label,\n  value,\n  min,\n  max,\n  step,\n  unit = '',\n  onChange,\n  className,\n  ...muiSliderProps\n}) => {\n  const normalizedValue = useMemo(\n    () => normalizeValue(value, min, max, step),\n    [value, min, max, step]\n  );\n\n  const valueText = useMemo(() => {\n    const formatted = formatValue(normalizedValue, step);\n    return unit ? `${formatted} ${unit}` : formatted;\n  }, [normalizedValue, step, unit]);\n\n  const handleSliderChange = useCallback((e: Event, nextValue: number | number[]) => {\n    e.stopPropagation();\n    e.preventDefault();\n\n    const rawValue = Array.isArray(nextValue) ? nextValue[0] : nextValue;\n    const normalizedNextValue = normalizeValue(rawValue, min, max, step);\n\n    if (normalizedNextValue !== normalizedValue) {\n      onChange(normalizedNextValue);\n    }\n  }, [normalizedValue, min, max, step, onChange]);\n\n  return (\n    <div className={styles.container}>\n      <div className={styles.labelRow}>\n        <span className={styles.label}>{label}</span>\n        <span className={styles.value}>{valueText}</span>\n      </div>\n\n      <Slider\n        {...muiSliderProps}\n        aria-label={label}\n        className={className ? `${styles.slider} ${className}` : styles.slider}\n        max={max}\n        min={min}\n        onChange={handleSliderChange}\n        step={step}\n        value={normalizedValue}\n      />\n    </div>\n  );\n};\n\nexport default SliderInput;\n"
  },
  {
    "path": "packages/audiodocs/src/ui/SliderInput/index.ts",
    "content": "export { default } from './SliderInput';\nexport { default as SliderInput } from './SliderInput';\nexport type { SliderInputProps } from './types';\n"
  },
  {
    "path": "packages/audiodocs/src/ui/SliderInput/styles.module.css",
    "content": ".container {\n  margin-top: 8px;\n  width: 100%;\n}\n\n.labelRow {\n  align-items: baseline;\n  display: flex;\n  justify-content: space-between;\n  margin-bottom: 8px;\n}\n\n.label,\n.value {\n  color: var(--swm-navy);\n  font-size: 14px;\n  line-height: 1.4;\n}\n\n.value {\n  font-variant-numeric: tabular-nums;\n}\n\n[data-theme='dark'] .label,\n[data-theme='dark'] .value {\n  color: var(--swm-off-white);\n}\n\n.slider {\n  padding: 8px 0 !important;\n}\n\n.slider :global(.MuiSlider-rail) {\n  background-color: var(--swm-code-lines-buttons-background);\n  height: 4px;\n  opacity: 1;\n}\n\n.slider :global(.MuiSlider-track) {\n  background-color: var(--swm-red-light-60);\n  border: none;\n  height: 4px;\n}\n\n[data-theme='dark'] .slider :global(.MuiSlider-track) {\n  background-color: var(--swm-red-dark-140);\n}\n\n.slider :global(.MuiSlider-thumb) {\n  background-color: var(--swm-red-dark-100);\n  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);\n  height: 18px;\n  transition: transform 120ms ease;\n  width: 18px;\n}\n\n.slider :global(.MuiSlider-thumb:hover),\n.slider :global(.MuiSlider-thumb.Mui-active) {\n  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35);\n}\n\n.slider :global(.MuiSlider-thumb.Mui-focusVisible) {\n  box-shadow: 0 0 0 4px rgba(145, 159, 207, 0.3);\n}\n\n.slider :global(.MuiSlider-mark) {\n  background-color: var(--swm-off-white);\n}\n"
  },
  {
    "path": "packages/audiodocs/src/ui/SliderInput/types.ts",
    "content": "import type { SliderProps as MuiSliderProps } from '@mui/material/Slider';\n\nexport type SliderInputProps = {\n  label: string;\n  value: number;\n  min: number;\n  max: number;\n  step: number;\n  unit?: string;\n  onChange: (value: number) => void;\n} & Omit<\n  MuiSliderProps,\n  'children' | 'defaultValue' | 'max' | 'min' | 'onChange' | 'step' | 'value'\n>;\n"
  },
  {
    "path": "packages/audiodocs/src/ui/SliderInput/utils.ts",
    "content": "function clamp(value: number, min: number, max: number): number {\n  return Math.min(max, Math.max(min, value));\n}\n\nfunction getPrecision(value: number): number {\n  if (!Number.isFinite(value)) {\n    return 0;\n  }\n\n  const normalized = value.toString().toLowerCase();\n  const [base, exponent] = normalized.split('e-');\n\n  if (exponent != null) {\n    const decimalPartLength = (base.split('.')[1] ?? '').length;\n    return Number(exponent) + decimalPartLength;\n  }\n\n  return (normalized.split('.')[1] ?? '').length;\n}\n\nfunction snapToStep(value: number, min: number, step: number): number {\n  if (!Number.isFinite(step) || step <= 0) {\n    return value;\n  }\n\n  const steps = Math.round((value - min) / step);\n  return min + steps * step;\n}\n\nexport function normalizeValue(value: number, min: number, max: number, step: number): number {\n  const clamped = clamp(value, min, max);\n  const snapped = snapToStep(clamped, min, step);\n  const bounded = clamp(snapped, min, max);\n  const precision = Math.max(getPrecision(step), getPrecision(min), getPrecision(max));\n\n  return Number(bounded.toFixed(precision));\n}\n\nexport function formatValue(value: number, step: number): string {\n  const precision = Math.max(1, getPrecision(step));\n  return value.toFixed(precision);\n}\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Switch/Switch.tsx",
    "content": "import React, { memo, useCallback } from 'react';\nimport styles from './styles.module.css';\n\nexport interface SwitchProps {\n  checked: boolean;\n  onChange: (checked: boolean) => void;\n  ariaLabel: string;\n  leftLabel?: string;\n  rightLabel?: string;\n  className?: string;\n  disabled?: boolean;\n}\n\nconst Switch: React.FC<SwitchProps> = ({\n  checked,\n  onChange,\n  ariaLabel,\n  leftLabel,\n  rightLabel,\n  className,\n  disabled = false,\n}) => {\n  const handleClick = useCallback(() => {\n    onChange(!checked);\n  }, [checked, onChange]);\n\n  return (\n    <div className={className ? `${styles.container} ${className}` : styles.container}>\n      {!!leftLabel && <span className={styles.labelText}>{leftLabel}</span>}\n      <button\n        type=\"button\"\n        role=\"switch\"\n        aria-label={ariaLabel}\n        aria-checked={checked}\n        onClick={handleClick}\n        disabled={disabled}\n        className={checked ? `${styles.track} ${styles.trackChecked}` : styles.track}\n      >\n        <span className={checked ? `${styles.thumb} ${styles.thumbChecked}` : styles.thumb} />\n      </button>\n      {!!rightLabel && <span className={styles.labelText}>{rightLabel}</span>}\n    </div>\n  );\n};\n\nexport default memo(Switch);\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Switch/index.ts",
    "content": "export { default } from './Switch';\nexport type { SwitchProps } from './Switch';\n"
  },
  {
    "path": "packages/audiodocs/src/ui/Switch/styles.module.css",
    "content": ".container {\n  margin-top: 16px;\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n\n.labelText {\n  color: var(--swm-navy);\n  font-size: 14px;\n}\n\n.track {\n  width: 50px;\n  height: 24px;\n  border: none;\n  border-radius: 12px;\n  padding: 2px;\n  position: relative;\n  cursor: pointer;\n  background-color: rgba(145, 159, 207, 0.2);\n  transition: background-color 200ms ease;\n}\n\n.trackChecked {\n  background-color: rgba(145, 159, 207, 0.4);\n}\n\n.track:focus-visible {\n  outline: 2px solid var(--swm-red-light-80);\n  outline-offset: 2px;\n}\n\n.track:disabled {\n  opacity: 0.5;\n  cursor: not-allowed;\n}\n\n.thumb {\n  position: absolute;\n  top: 2px;\n  left: 2px;\n  width: 20px;\n  height: 20px;\n  border-radius: 10px;\n  background-color: var(--swm-red-light-80);\n  transition: transform 200ms ease;\n}\n\n.thumbChecked {\n  transform: translateX(26px);\n}\n\n:root[data-theme='dark'] .labelText {\n  color: var(--swm-off-white);\n}\n"
  },
  {
    "path": "packages/audiodocs/src/wasm-loader.js",
    "content": "// RN Audio API (WASM for Stretcher Node => respecting pitch when changing BPM / playing rate ;)\nimport { LoadCustomWasm } from 'react-native-audio-api';\n\n// This function will now run once when the site loads\nLoadCustomWasm('/react-native-audio-api');"
  },
  {
    "path": "packages/audiodocs/static/.nojekyll",
    "content": ""
  },
  {
    "path": "packages/audiodocs/static/signalsmithStretch.mjs",
    "content": "\"use strict\";\n\nlet module = {},\n  exports = {};\nvar SignalsmithStretch = (() => {\n  var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined;\n  return async function (moduleArg = {}) {\n    var moduleRtn;\n    var Module = moduleArg;\n    var readyPromiseResolve, readyPromiseReject;\n    var readyPromise = new Promise((resolve, reject) => {\n      readyPromiseResolve = resolve;\n      readyPromiseReject = reject;\n    });\n    var ENVIRONMENT_IS_WEB = typeof window == 'object';\n    var ENVIRONMENT_IS_WORKER = typeof WorkerGlobalScope != 'undefined';\n    var ENVIRONMENT_IS_NODE = typeof process == 'object' && typeof process.versions == 'object' && typeof process.versions.node == 'string' && process.type != 'renderer';\n    var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\n    var crypto = globalThis?.crypto || {\n      getRandomValues: array => {\n        for (var i = 0; i < array.length; i++) array[i] = Math.random() * 256 | 0;\n      }\n    };\n    var performance = globalThis?.performance || {\n      now: _ => Date.now()\n    };\n    var moduleOverrides = Object.assign({}, Module);\n    var arguments_ = [];\n    var quit_ = (status, toThrow) => {\n      throw toThrow;\n    };\n    var scriptDirectory = '';\n    var readAsync, readBinary;\n    if (ENVIRONMENT_IS_SHELL) {\n      readBinary = f => {\n        if (typeof readbuffer == 'function') {\n          return new Uint8Array(readbuffer(f));\n        }\n        let data = read(f, 'binary');\n        assert(typeof data == 'object');\n        return data;\n      };\n      readAsync = async f => readBinary(f);\n      globalThis.clearTimeout ??= id => {};\n      globalThis.setTimeout ??= f => f();\n      arguments_ = globalThis.arguments || globalThis.scriptArgs;\n      if (typeof quit == 'function') {\n        quit_ = (status, toThrow) => {\n          setTimeout(() => {\n            if (!(toThrow instanceof ExitStatus)) {\n              let toLog = toThrow;\n              if (toThrow && typeof toThrow == 'object' && toThrow.stack) {\n                toLog = [toThrow, toThrow.stack];\n              }\n              err(`exiting due to exception: ${toLog}`);\n            }\n            quit(status);\n          });\n          throw toThrow;\n        };\n      }\n      if (typeof print != 'undefined') {\n        globalThis.console ??= {};\n        console.log = print;\n        console.warn = console.error = globalThis.printErr ?? print;\n      }\n    } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n      if (ENVIRONMENT_IS_WORKER) {\n        scriptDirectory = self.location.href;\n      } else if (typeof document != 'undefined' && document.currentScript) {\n        scriptDirectory = document.currentScript.src;\n      }\n      if (_scriptName) {\n        scriptDirectory = _scriptName;\n      }\n      if (scriptDirectory.startsWith('blob:')) {\n        scriptDirectory = '';\n      } else {\n        scriptDirectory = scriptDirectory.slice(0, scriptDirectory.replace(/[?#].*/, '').lastIndexOf('/') + 1);\n      }\n      {\n        if (ENVIRONMENT_IS_WORKER) {\n          readBinary = url => {\n            var xhr = new XMLHttpRequest();\n            xhr.open('GET', url, false);\n            xhr.responseType = 'arraybuffer';\n            xhr.send(null);\n            return new Uint8Array(xhr.response);\n          };\n        }\n        readAsync = async url => {\n          var response = await fetch(url, {\n            credentials: 'same-origin'\n          });\n          if (response.ok) {\n            return response.arrayBuffer();\n          }\n          throw new Error(response.status + ' : ' + response.url);\n        };\n      }\n    } else {}\n    var out = console.log.bind(console);\n    var err = console.error.bind(console);\n    Object.assign(Module, moduleOverrides);\n    moduleOverrides = null;\n    var wasmBinary;\n    var wasmMemory;\n    var ABORT = false;\n    var EXITSTATUS;\n    var HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAP64, HEAPU64, HEAPF64;\n    var runtimeInitialized = false;\n    function updateMemoryViews() {\n      var b = wasmMemory.buffer;\n      Module['HEAP8'] = HEAP8 = new Int8Array(b);\n      HEAP16 = new Int16Array(b);\n      HEAPU8 = new Uint8Array(b);\n      HEAPU16 = new Uint16Array(b);\n      HEAP32 = new Int32Array(b);\n      HEAPU32 = new Uint32Array(b);\n      HEAPF32 = new Float32Array(b);\n      HEAPF64 = new Float64Array(b);\n      HEAP64 = new BigInt64Array(b);\n      HEAPU64 = new BigUint64Array(b);\n    }\n    function preRun() {}\n    function initRuntime() {\n      runtimeInitialized = true;\n      wasmExports['e']();\n    }\n    function preMain() {}\n    function postRun() {}\n    var runDependencies = 0;\n    var dependenciesFulfilled = null;\n    function addRunDependency(id) {\n      runDependencies++;\n    }\n    function removeRunDependency(id) {\n      runDependencies--;\n      if (runDependencies == 0) {\n        if (dependenciesFulfilled) {\n          var callback = dependenciesFulfilled;\n          dependenciesFulfilled = null;\n          callback();\n        }\n      }\n    }\n    function abort(what) {\n      what = 'Aborted(' + what + ')';\n      err(what);\n      ABORT = true;\n      what += '. Build with -sASSERTIONS for more info.';\n      var e = new WebAssembly.RuntimeError(what);\n      readyPromiseReject(e);\n      throw e;\n    }\n    var wasmBinaryFile = 'data:application/octet-stream;base64,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QQEhA0EBIQQgAiIFIQ8DQEHYMSgCACEBAkAgAyAETwRAIBBBAnQhBiAQQQFqIRAgDyABIAZqKAIAIgpuIg8hBiAKIAQiB2whBAwBCyAFIAEgDkEBayIOQQJ0aigCACIKbiIFIQcgCiADIgZsIQMLAkAgCkECSQ0AIABB/DEoAgAiAUYNAEEBIQJBASAAIAFrQQN1IgEgAUEBTRshEgNAIAIgB2whEyACIAZsIRRBACEBA0AgFEH8MSgCACIMIAFBA3RqKQIAIhmnaiELIBMgGUIgiKdqIRECQEGEMigCACIIIABNBEAgACAMayIAQQN1IhVBAWoiCUH/////AUsNCCAAQf////8BIAggDGsiCEECdSINIAkgCSANSRsgCEH4////B08bIgkEfyAJQf////8BSw0IIAlBA3QQBAVBAAsiDWoiCCALrSARrUIghoQ3AgAgCCAVQQN0ayELIAAEQCALIAwgAPwKAAALQYQyIA0gCUEDdGo2AgBBgDIgCEEIaiIANgIAQfwxIAs2AgAgDBADDAELIAAgC60gEa1CIIaENwIAIABBCGohAAtBgDIgADYCACABQQFqIgEgEkcNAAsgAkEBaiICIApHDQALQcgxKAIAIQILIAMgBGwgAkkNAAsLDAILEAgACxAFAAtByDEoAgAFIAILGguDBwEGf0HoMigCACIDQeAyKAIAIgJrQRxtIABPBEACQEHkMigCACACa0EcbSIFIAAgACAFSxsiBEUNAAJAIARBA3EiBkUEQCAEIQMMAQsgBCEDA0AgAiABKQIANwIAIAIgASgCGDYCGCACIAEpAhA3AhAgAiABKQIINwIIIANBAWshAyACQRxqIQIgB0EBaiIHIAZHDQALCyAEQQRJDQADQCACIAEpAgA3AgAgAiABKAIYNgIYIAIgASkCEDcCECACIAEpAgg3AgggAiABKAIYNgI0IAIgASkCEDcCLCACIAEpAgg3AiQgAiABKQIANwIcIAIgASgCGDYCUCACIAEpAhA3AkggAkFAayABKQIINwIAIAIgASkCADcCOCACIAEpAgA3AlQgAiABKQIINwJcIAIgASkCEDcCZCACIAEoAhg2AmwgAkHwAGohAiADQQRrIgMNAAsLIAAgBUsEQEHkMigCACICIAAgBWtBHGxqIQADQCACIAEpAgA3AgAgAiABKAIYNgIYIAIgASkCEDcCECACIAEpAgg3AgggAkEcaiICIABHDQALQeQyIAA2AgAPC0HkMkHgMigCACAAQRxsajYCAA8LIAIEQEHkMiACNgIAIAIQA0HoMkEANgIAQeAyQgA3AgBBACEDCwJAIABByqSSyQBPDQBByaSSyQAgA0EcbSIDQQF0IgQgACAAIARJGyADQaSSySRPGyIDQcqkkskATw0AQeQyIANBHGwiAxAEIgQ2AgBB4DIgBDYCAEHoMiADIARqNgIAIAQhAiAAQRxsIgBBHGsiBUEcbiIDQQNxQQNHBEAgA0EBakEDcSEGQQAhAwNAIAIgASkCADcCACACIAEoAhg2AhggAiABKQIQNwIQIAIgASkCCDcCCCACQRxqIQIgA0EBaiIDIAZHDQALCyAAIARqIQAgBUHUAE8EQANAIAIgASkCADcCACACIAEoAhg2AhggAiABKQIQNwIQIAIgASkCCDcCCCACIAEoAhg2AjQgAiABKQIQNwIsIAIgASkCCDcCJCACIAEpAgA3AhwgAiABKAIYNgJQIAIgASkCEDcCSCACQUBrIAEpAgg3AgAgAiABKQIANwI4IAIgASkCADcCVCACIAEpAgg3AlwgAiABKQIQNwJkIAIgASgCGDYCbCACQfAAaiICIABHDQALC0HkMiAANgIADwsQBQAL3QQCBn8BfkGUMSgCACIDQYwxKAIAIgJrQQN1IABPBEACQEGQMSgCACACa0EDdSIFIAAgACAFSxsiBEUNAAJAIARBB3EiBkUEQCAEIQMMAQsgBCEDA0AgAiABKQIANwIAIANBAWshAyACQQhqIQIgB0EBaiIHIAZHDQALCyAEQQhJDQADQCACIAEpAgA3AgAgAiABKQIANwIIIAIgASkCADcCECACIAEpAgA3AhggAiABKQIANwIgIAIgASkCADcCKCACIAEpAgA3AjAgAiABKQIANwI4IAJBQGshAiADQQhrIgMNAAsLIAAgBUsEQEGQMSgCACICIAAgBWtBA3RqIQADQCACIAEpAgA3AgAgAkEIaiICIABHDQALQZAxIAA2AgAPC0GQMUGMMSgCACAAQQN0ajYCAA8LIAIEQEGQMSACNgIAIAIQA0GUMUEANgIAQYwxQgA3AgBBACEDCwJAIABBgICAgAJPDQBB/////wEgA0ECdSIEIAAgACAESRsgA0H4////B08b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AgALIANBAEoEQEEAIQIDQCASQZgwNgIgIBJBvDM2AiQgEiASKQIgNwMQIBIgEkEoajYCHCASIBJBLGo2AhggEiASKQIYNwMIIwBBEGsiDSQAQewwKAIAIgAgAiIQSARAA0BBACEHIwBBEGsiEyQAIBIoAhAiAigCSCEBIBIoAggoAgCyIABBAWoiFrKUIBIoAgwoAgCylRAZIRsgAigCsAIhACACIBsgAbKT/AAiBjYCsAICQCACLQDAAiAGIABrIhFBAEpyIg5BAXFFDQACfyACKAKoAkEATARAIAJBADoAwQJBAAwBC0EAIAZrIgxBACAMQQBKGyEEQQEgDCAMQQFMGyIAQfz///8HcSEPIABBA3EhFCACQYABaiEVIAJB/AFqIRggBkEATiEXA0ACQCAXDQAgAigClAIgAigCkAIgB2wgBmpqIQEgAigCtAIhCCACKAKcAiEJIAIoApgCIQpBACEFQQAhAEEAIQMgDEEDSgRAA0AgCCAAQQJ0aiAJIAogACABanFBAnRqKgIAOAIAIAggAEEBciILQQJ0aiAJIAogASALanFBAnRqKgIAOAIAIAggAEECciILQQJ0aiAJIAogASALanFBAnRqKgIAOAIAIAggAEEDciILQQJ0aiAJIAogASALanFBAnRqKgIAOAIAIABBBGohACADQQRqIgMgD0cNAAsLIBRFDQADQCAIIABBAnRqIAkgCiAAIAFqcUECdGoqAgA4AgAgAEEBaiEAIAVBAWoiBSAURw0ACwsCQCAEIAIoAkgiBU4NACASKAIUKAIAIAdBAnRqKAIAIAZBAnRqIQEgAigCtAIhCEEAIQMgBSAEIgBrQQNxIgkEQANAIAggAEECdCIKaiABIApqKgIAOAIAIABBAWohACADQQFqIgMgCUcNAAsLIAQgBWtBfEsNAANAIAggAEECdCIDaiABIANqKgIAOAIAIAggA0EEaiIJaiABIAlqKgIAOAIAIAggA0EIaiIJaiABIAlqKgIAOAIAIAggA0EMaiIDaiABIANqKgIAOAIAIABBBGoiACAFRw0ACwsgEyACKAJ0IAIoAnAgB2xBA3RqNgIIIAIoArABQQF0IQUCQCACKAKIAiIBQQBMDQAgAigC/AEgBSABa0ECdGohACACKALwASEJIAIoArQCIQpBACEIIAFBAUcEQCABQf7///8HcSEZQQAhAwNAIAAgCEECdCILaiAJIAtqKgIAIAogC2oqAgCMlDgCACAAIAtBBHIiC2ogCSALaioCACAKIAtqKgIAjJQ4AgAgCEECaiEIIANBAmoiAyAZRw0ACwsgAUEBcUUNACAAIAhBAnQiA2ogAyAJaioCACADIApqKgIAjJQ4AgALAkAgASAFTg0AIAFBAWohAyACKAL8ASEIIAIoAvABIQkgAigCtAIhCiABIgBBAXEEQCAIIAkgAEECdCIAaioCACAAIApqKgIAlDgCACADIQALIAMgBUYNAANAIAggACABa0ECdGogCSAAQQJ0IgNqKgIAIAMgCmoqAgCUOAIAIAggAEEBaiIDIAFrQQJ0aiAJIANBAnQiA2oqAgAgAyAKaioCAJQ4AgAgAEECaiIAIAVHDQALCyAVIBggE0EIahAdIAdBAWoiByACKAKoAiIDSA0ACyACQQA6AMECQQAgA0EATA0AGkEAIQFBASACKAKsAiIIQQBMDQAaA0BBACEAIAhBAEoEQCACKALIAiABIAhsQRxsaiEDIAIoAnQgAigCcCABbEEDdGohBANAIAMgAEEcbGogBCAAQQN0aikCADcCACAAQQFqIgAgAigCrAIiCEgNAAsgAigCqAIhAwsgAUEBaiIBIANIDQALIANBAEoLIAItAMACRSACKAJQIgEgEUZxDQBFDQBBACEHQQAgBiABayIUayIMQQAgDEEAShshBCACQYABaiEPIAJB/AFqIRUDQAJAIAIoAkgiASAMIAEgDEgbIgtBAEwNACACKAKUAiACKAKQAiAHbCAUamohCCACKAK0AiEGIAIoApwCIQkgAigCmAIhCkEAIQVBACEAIAtBBE8EQCALQfz///8HcSEYQQAhAwNAIAYgAEECdGogCSAKIAAgCGpxQQJ0aioCADgCACAGIABBAXIiF0ECdGogCSAKIAggF2pxQQJ0aioCADgCACAGIABBAnIiF0ECdGogCSAKIAggF2pxQQJ0aioCADgCACAGIABBA3IiF0ECdGogCSAKIAggF2pxQQJ0aioCADgCACAAQQRqIQAgA0EEaiIDIBhHDQALCyALQQNxIgNFDQADQCAGIABBAnRqIAkgCiAAIAhqcUECdGoqAgA4AgAgAEEBaiEAIAVBAWoiBSADRw0ACwsCQCABIARMDQAgEigCFCgCACAHQQJ0aigC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';\n    function getBinarySync(file) {\n      if (file == wasmBinaryFile && wasmBinary) {\n        return new Uint8Array(wasmBinary);\n      }\n      var binary = tryParseAsDataURI(file);\n      if (binary) {\n        return binary;\n      }\n      if (readBinary) {\n        return readBinary(file);\n      }\n      throw 'both async and sync fetching of the wasm failed';\n    }\n    async function getWasmBinary(binaryFile) {\n      return getBinarySync(binaryFile);\n    }\n    async function instantiateArrayBuffer(binaryFile, imports) {\n      try {\n        var binary = await getWasmBinary(binaryFile);\n        var instance = await WebAssembly.instantiate(binary, imports);\n        return instance;\n      } catch (reason) {\n        err(`failed to asynchronously prepare wasm: ${reason}`);\n        abort(reason);\n      }\n    }\n    async function instantiateAsync(binary, binaryFile, imports) {\n      return instantiateArrayBuffer(binaryFile, imports);\n    }\n    function getWasmImports() {\n      return {\n        a: wasmImports\n      };\n    }\n    async function createWasm() {\n      function receiveInstance(instance, module) {\n        wasmExports = instance.exports;\n        wasmMemory = wasmExports['d'];\n        updateMemoryViews();\n        removeRunDependency('wasm-instantiate');\n        return wasmExports;\n      }\n      addRunDependency('wasm-instantiate');\n      function receiveInstantiationResult(result) {\n        return receiveInstance(result['instance']);\n      }\n      var info = getWasmImports();\n      try {\n        var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info);\n        var exports = receiveInstantiationResult(result);\n        return exports;\n      } catch (e) {\n        readyPromiseReject(e);\n        return Promise.reject(e);\n      }\n    }\n    class ExitStatus {\n      name = 'ExitStatus';\n      constructor(status) {\n        this.message = `Program terminated with exit(${status})`;\n        this.status = status;\n      }\n    }\n    var base64Decode = b64 => {\n      var b1,\n        b2,\n        i = 0,\n        j = 0,\n        bLength = b64.length;\n      var output = new Uint8Array((bLength * 3 >> 2) - (b64[bLength - 2] == '=') - (b64[bLength - 1] == '='));\n      for (; i < bLength; i += 4, j += 3) {\n        b1 = base64ReverseLookup[b64.charCodeAt(i + 1)];\n        b2 = base64ReverseLookup[b64.charCodeAt(i + 2)];\n        output[j] = base64ReverseLookup[b64.charCodeAt(i)] << 2 | b1 >> 4;\n        output[j + 1] = b1 << 4 | b2 >> 2;\n        output[j + 2] = b2 << 6 | base64ReverseLookup[b64.charCodeAt(i + 3)];\n      }\n      return output;\n    };\n    var isDataURI = filename => filename.startsWith(dataURIPrefix);\n    var dataURIPrefix = 'data:application/octet-stream;base64,';\n    var tryParseAsDataURI = filename => {\n      if (isDataURI(filename)) {\n        return base64Decode(filename.slice(dataURIPrefix.length));\n      }\n    };\n    var __abort_js = () => abort('');\n    var getHeapMax = () => 2147483648;\n    var alignMemory = (size, alignment) => Math.ceil(size / alignment) * alignment;\n    var abortOnCannotGrowMemory = requestedSize => {\n      abort('OOM');\n    };\n    var growMemory = size => {\n      var b = wasmMemory.buffer;\n      var pages = (size - b.byteLength + 65535) / 65536 | 0;\n      try {\n        wasmMemory.grow(pages);\n        updateMemoryViews();\n        return 1;\n      } catch (e) {}\n    };\n    var _emscripten_resize_heap = requestedSize => {\n      var oldSize = HEAPU8.length;\n      requestedSize >>>= 0;\n      var maxHeapSize = getHeapMax();\n      if (requestedSize > maxHeapSize) {\n        abortOnCannotGrowMemory(requestedSize);\n      }\n      for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\n        var overGrownHeapSize = oldSize * (1 + 0.5 / cutDown);\n        overGrownHeapSize = Math.min(overGrownHeapSize, requestedSize + 100663296);\n        var newSize = Math.min(maxHeapSize, alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536));\n        var replacement = growMemory(newSize);\n        if (replacement) {\n          return true;\n        }\n      }\n      abortOnCannotGrowMemory(requestedSize);\n    };\n    var initRandomFill = () => view => crypto.getRandomValues(view);\n    var randomFill = view => {\n      (randomFill = initRandomFill())(view);\n    };\n    var _random_get = (buffer, size) => {\n      randomFill(HEAPU8.subarray(buffer, buffer + size));\n      return 0;\n    };\n    var keepRuntimeAlive = () => true;\n    var _proc_exit = code => {\n      EXITSTATUS = code;\n      if (!keepRuntimeAlive()) {\n        ABORT = true;\n      }\n      quit_(code, new ExitStatus(code));\n    };\n    var exitJS = (status, implicit) => {\n      EXITSTATUS = status;\n      _proc_exit(status);\n    };\n    var handleException = e => {\n      if (e instanceof ExitStatus || e == 'unwind') {\n        return EXITSTATUS;\n      }\n      quit_(1, e);\n    };\n    var UTF8Decoder = typeof TextDecoder != 'undefined' ? new TextDecoder() : undefined;\n    var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead = NaN) => {\n      var endIdx = idx + maxBytesToRead;\n      var endPtr = idx;\n      while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;\n      if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {\n        return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));\n      }\n      var str = '';\n      while (idx < endPtr) {\n        var u0 = heapOrArray[idx++];\n        if (!(u0 & 128)) {\n          str += String.fromCharCode(u0);\n          continue;\n        }\n        var u1 = heapOrArray[idx++] & 63;\n        if ((u0 & 224) == 192) {\n          str += String.fromCharCode((u0 & 31) << 6 | u1);\n          continue;\n        }\n        var u2 = heapOrArray[idx++] & 63;\n        if ((u0 & 240) == 224) {\n          u0 = (u0 & 15) << 12 | u1 << 6 | u2;\n        } else {\n          u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heapOrArray[idx++] & 63;\n        }\n        if (u0 < 65536) {\n          str += String.fromCharCode(u0);\n        } else {\n          var ch = u0 - 65536;\n          str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023);\n        }\n      }\n      return str;\n    };\n    var UTF8ToString = (ptr, maxBytesToRead) => ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';\n    for (var base64ReverseLookup = new Uint8Array(123), i = 25; i >= 0; --i) {\n      base64ReverseLookup[48 + i] = 52 + i;\n      base64ReverseLookup[65 + i] = i;\n      base64ReverseLookup[97 + i] = 26 + i;\n    }\n    base64ReverseLookup[43] = 62;\n    base64ReverseLookup[47] = 63;\n    var wasmImports = {\n      c: __abort_js,\n      b: _emscripten_resize_heap,\n      a: _random_get\n    };\n    var wasmExports = await createWasm();\n    var ___wasm_call_ctors = wasmExports['e'];\n    var _setBuffers = Module['_setBuffers'] = wasmExports['g'];\n    var _blockSamples = Module['_blockSamples'] = wasmExports['h'];\n    var _intervalSamples = Module['_intervalSamples'] = wasmExports['i'];\n    var _inputLatency = Module['_inputLatency'] = wasmExports['j'];\n    var _outputLatency = Module['_outputLatency'] = wasmExports['k'];\n    var _reset = Module['_reset'] = wasmExports['l'];\n    var _presetDefault = Module['_presetDefault'] = wasmExports['m'];\n    var _presetCheaper = Module['_presetCheaper'] = wasmExports['n'];\n    var _configure = Module['_configure'] = wasmExports['o'];\n    var _setTransposeFactor = Module['_setTransposeFactor'] = wasmExports['p'];\n    var _setTransposeSemitones = Module['_setTransposeSemitones'] = wasmExports['q'];\n    var _seek = Module['_seek'] = wasmExports['r'];\n    var _process = Module['_process'] = wasmExports['s'];\n    var _flush = Module['_flush'] = wasmExports['t'];\n    var _main = Module['_main'] = wasmExports['u'];\n    Module['UTF8ToString'] = UTF8ToString;\n    function callMain() {\n      var entryFunction = _main;\n      var argc = 0;\n      var argv = 0;\n      try {\n        var ret = entryFunction(argc, argv);\n        exitJS(ret, true);\n        return ret;\n      } catch (e) {\n        return handleException(e);\n      }\n    }\n    function run() {\n      if (runDependencies > 0) {\n        dependenciesFulfilled = run;\n        return;\n      }\n      preRun();\n      if (runDependencies > 0) {\n        dependenciesFulfilled = run;\n        return;\n      }\n      function doRun() {\n        Module['calledRun'] = true;\n        if (ABORT) return;\n        initRuntime();\n        preMain();\n        readyPromiseResolve(Module);\n        var noInitialRun;\n        if (!noInitialRun) callMain();\n        postRun();\n      }\n      {\n        doRun();\n      }\n    }\n    run();\n    moduleRtn = readyPromise;\n    return moduleRtn;\n  };\n})();\nfunction registerWorkletProcessor(Module, audioNodeKey) {\n  class WasmProcessor extends AudioWorkletProcessor {\n    constructor(options) {\n      super(options);\n      this.wasmReady = false;\n      this.wasmModule = null;\n      this.channels = 0;\n      this.buffersIn = [];\n      this.buffersOut = [];\n      this.audioBuffers = []; // list of (multi-channel) audio buffers\n      this.audioBuffersStart = 0; // time-stamp for the first audio buffer\n      this.audioBuffersEnd = 0; // just to be helpful\n\n      this.timeIntervalSamples = sampleRate * 0.1;\n      this.timeIntervalCounter = 0;\n      this.timeMap = [{\n        active: false,\n        input: 0,\n        output: 0,\n        rate: 1,\n        semitones: 0,\n        loopStart: 0,\n        loopEnd: 0\n      }];\n      let remoteMethods = {\n        configure: config => {\n          let blockChanged = config.blockMs != this.config.blockMs || config.intervalMs != this.config.intervalMs;\n          Object.assign(this.config, config);\n          if (config.blockMs && blockChanged) this.configure();\n        },\n        setUpdateInterval: seconds => {\n          this.timeIntervalSamples = sampleRate * seconds;\n        },\n        stop: when => {\n          if (typeof when !== 'number') when = currentTime;\n          return remoteMethods.schedule({\n            active: false,\n            output: when\n          });\n        },\n        start: (when, offset, duration, rate, semitones) => {\n          if (typeof when === 'object') {\n            if (!('active' in when)) when.active = true;\n            return remoteMethods.schedule(when);\n          }\n          let obj = {\n            active: true,\n            input: 0,\n            output: currentTime + this.outputLatencySeconds\n          };\n          if (typeof when === 'number') obj.output = when;\n          if (typeof offset === 'number') obj.input = offset;\n          if (typeof rate === 'number') obj.rate = rate;\n          if (typeof semitones === 'number') obj.semitones = semitones;\n          let result = remoteMethods.schedule(obj);\n          if (typeof duration === 'number') {\n            remoteMethods.stop(obj.output + duration);\n            obj.output += duration;\n            obj.active = false;\n            remoteMethods.schedule(obj);\n          }\n          return result;\n        },\n        schedule: (objIn, adjustPrevious) => {\n          let outputTime = 'output' in objIn ? objIn.output : currentTime;\n          let latestSegment = this.timeMap[this.timeMap.length - 1];\n          while (this.timeMap.length && this.timeMap[this.timeMap.length - 1].output >= outputTime) {\n            latestSegment = this.timeMap.pop();\n          }\n          let obj = {\n            active: latestSegment.active,\n            input: null,\n            rate: latestSegment.rate,\n            semitones: latestSegment.semitones,\n            loopStart: latestSegment.loopStart,\n            loopEnd: latestSegment.loopEnd\n          };\n          Object.assign(obj, objIn);\n          obj.output = outputTime;\n          if (obj.input === null) {\n            let rate = latestSegment.active ? latestSegment.rate : 0;\n            obj.input = latestSegment.input + (obj.output - latestSegment.output) * rate;\n          }\n          this.timeMap.push(obj);\n          if (adjustPrevious && this.timeMap.length > 1) {\n            let previous = this.timeMap[this.timeMap.length - 2];\n            if (previous.output < currentTime) {\n              let rate = previous.active ? previous.rate : 0;\n              previous.input += (currentTime - previous.output) * rate;\n              previous.output = currentTime;\n            }\n            previous.rate = (obj.input - previous.input) / (obj.output - previous.output);\n          }\n          let currentMapSegment = this.timeMap[0];\n          while (this.timeMap.length > 1 && this.timeMap[1].output <= outputTime) {\n            this.timeMap.shift();\n            currentMapSegment = this.timeMap[0];\n          }\n          let rate = currentMapSegment.active ? currentMapSegment.rate : 0;\n          let inputTime = currentMapSegment.input + (outputTime - currentMapSegment.output) * rate;\n          this.timeIntervalCounter = this.timeIntervalSamples;\n          this.port.postMessage(['time', inputTime]);\n          return obj;\n        },\n        dropBuffers: toSeconds => {\n          if (typeof toSeconds !== 'number') {\n            let buffers = this.audioBuffers.flat(1).map(b => b.buffer);\n            this.audioBuffers = [];\n            this.audioBuffersStart = this.audioBuffersEnd = 0;\n            return {\n              value: {\n                start: 0,\n                end: 0\n              },\n              transfer: buffers\n            };\n          }\n          let transfer = [];\n          while (this.audioBuffers.length) {\n            let first = this.audioBuffers[0];\n            let length = first[0].length;\n            let endSamples = this.audioBuffersStart + length;\n            let endSeconds = endSamples / sampleRate;\n            if (endSeconds > toSeconds) break;\n            this.audioBuffers.shift().forEach(b => transfer.push(b.buffer));\n            this.audioBuffersStart += length;\n          }\n          return {\n            value: {\n              start: this.audioBuffersStart / sampleRate,\n              end: this.audioBuffersEnd / sampleRate\n            },\n            transfer: transfer\n          };\n        },\n        addBuffers: sampleBuffers => {\n          sampleBuffers = [].concat(sampleBuffers);\n          this.audioBuffers.push(sampleBuffers);\n          let length = sampleBuffers[0].length;\n          this.audioBuffersEnd += length;\n          return this.audioBuffersEnd / sampleRate;\n        }\n      };\n      let pendingMessages = [];\n      this.port.onmessage = event => pendingMessages.push(event);\n      Module().then(wasmModule => {\n        this.wasmModule = wasmModule;\n        this.wasmReady = true;\n        wasmModule._main();\n        this.channels = options.numberOfOutputs ? options.outputChannelCount[0] : 2; // stereo by default\n        this.configure();\n        this.port.onmessage = event => {\n          let data = event.data;\n          let messageId = data.shift();\n          let method = data.shift();\n          let result = remoteMethods[method](...data);\n          if (result?.transfer) {\n            this.port.postMessage([messageId, result.value], result.transfer);\n          } else {\n            this.port.postMessage([messageId, result]);\n          }\n        };\n        let methodArgCounts = {};\n        for (let key in remoteMethods) {\n          methodArgCounts[key] = remoteMethods[key].length;\n        }\n        this.port.postMessage(['ready', methodArgCounts]);\n        pendingMessages.forEach(this.port.onmessage);\n        pendingMessages = null;\n      });\n    }\n    config = {\n      tonalityHz: 8000\n    };\n    configure() {\n      if (this.config.blockMs) {\n        let blockSamples = Math.round(this.config.blockMs / 1000 * sampleRate);\n        let intervalSamples = Math.round((this.config.intervalMs || this.config.blockMs * 0.25) / 1000 * sampleRate);\n        this.wasmModule._configure(this.channels, blockSamples, intervalSamples);\n        this.wasmModule._reset();\n      } else {\n        this.wasmModule._presetDefault(this.channels, sampleRate);\n      }\n      this.updateBuffers();\n      this.inputLatencySeconds = this.wasmModule._inputLatency() / sampleRate;\n      this.outputLatencySeconds = this.wasmModule._outputLatency() / sampleRate;\n    }\n    updateBuffers() {\n      let wasmModule = this.wasmModule;\n      // longer than one STFT block, so we can seek smoothly\n      this.bufferLength = wasmModule._inputLatency() + wasmModule._outputLatency();\n      let lengthBytes = this.bufferLength * 4;\n      let bufferPointer = wasmModule._setBuffers(this.channels, this.bufferLength);\n      this.buffersIn = [];\n      this.buffersOut = [];\n      for (let c = 0; c < this.channels; ++c) {\n        this.buffersIn.push(bufferPointer + lengthBytes * c);\n        this.buffersOut.push(bufferPointer + lengthBytes * (c + this.channels));\n      }\n    }\n    process(inputList, outputList, parameters) {\n      if (!this.wasmReady) {\n        outputList.forEach(output => {\n          output.forEach(channel => {\n            channel.fill(0);\n          });\n        });\n        return true;\n      }\n      if (!outputList[0]?.length) return false;\n      let outputTime = currentTime + this.outputLatencySeconds;\n      while (this.timeMap.length > 1 && this.timeMap[1].output <= outputTime) {\n        this.timeMap.shift();\n      }\n      let currentMapSegment = this.timeMap[0];\n      let wasmModule = this.wasmModule;\n      wasmModule._setTransposeSemitones(currentMapSegment.semitones, this.config.tonalityHz / sampleRate);\n\n      // Check the input/output channel counts\n      if (outputList[0].length != this.channels) {\n        this.channels = outputList[0]?.length || 0;\n        configure();\n      }\n      let outputBlockSize = outputList[0][0].length;\n      let memory = wasmModule.exports ? wasmModule.exports.memory.buffer : wasmModule.HEAP8.buffer;\n      // Buffer list (one per channel)\n      let inputs = inputList[0];\n      if (!currentMapSegment.active) {\n        outputList[0].forEach((_, c) => {\n          let channelBuffer = inputs[c % inputs.length];\n          let buffer = new Float32Array(memory, this.buffersIn[c], outputBlockSize);\n          buffer.fill(0);\n        });\n        // Should detect silent input and skip processing\n        wasmModule._process(outputBlockSize, outputBlockSize);\n      } else if (inputs?.length) {\n        // Live input\n        outputList[0].forEach((_, c) => {\n          let channelBuffer = inputs[c % inputs.length];\n          let buffer = new Float32Array(memory, this.buffersIn[c], outputBlockSize);\n          if (channelBuffer) {\n            buffer.set(channelBuffer);\n          } else {\n            buffer.fill(0);\n          }\n        });\n        wasmModule._process(outputBlockSize, outputBlockSize);\n      } else {\n        let inputTime = currentMapSegment.input + (outputTime - currentMapSegment.output) * currentMapSegment.rate;\n        let loopLength = currentMapSegment.loopEnd - currentMapSegment.loopStart;\n        if (loopLength > 0 && inputTime >= currentMapSegment.loopEnd) {\n          currentMapSegment.input -= loopLength;\n          inputTime -= loopLength;\n        }\n        inputTime += this.inputLatencySeconds;\n        let inputSamplesEnd = Math.round(inputTime * sampleRate);\n\n        // Fill the buffer with previous input\n        let buffers = outputList[0].map((_, c) => new Float32Array(memory, this.buffersIn[c], this.bufferLength));\n        let blockSamples = 0; // current write position in the temporary input buffer\n        let audioBufferIndex = 0;\n        let audioSamples = this.audioBuffersStart; // start of current audio buffer\n        // zero-pad until the start of the audio data\n        let inputSamples = inputSamplesEnd - this.bufferLength;\n        if (inputSamples < audioSamples) {\n          blockSamples = audioSamples - inputSamples;\n          buffers.forEach(b => b.fill(0, 0, blockSamples));\n          inputSamples = audioSamples;\n        }\n        while (audioBufferIndex < this.audioBuffers.length && audioSamples < inputSamplesEnd) {\n          let audioBuffer = this.audioBuffers[audioBufferIndex];\n          let startIndex = inputSamples - audioSamples; // start index within the audio buffer\n          let bufferEnd = audioSamples + audioBuffer[0].length;\n          // how many samples to copy: min(how many left in the buffer, how many more we need)\n          let count = Math.min(audioBuffer[0].length - startIndex, inputSamplesEnd - inputSamples);\n          if (count > 0) {\n            buffers.forEach((buffer, c) => {\n              let channelBuffer = audioBuffer[c % audioBuffer.length];\n              buffer.subarray(blockSamples).set(channelBuffer.subarray(startIndex, startIndex + count));\n            });\n            audioSamples += count;\n            blockSamples += count;\n          } else {\n            // we're already past this buffer - skip it\n            audioSamples += audioBuffer[0].length;\n          }\n          ++audioBufferIndex;\n        }\n        if (blockSamples < this.bufferLength) {\n          buffers.forEach(buffer => buffer.subarray(blockSamples).fill(0));\n        }\n\n        // constantly seeking, so we don't have to worry about the input buffers needing to be a rate-dependent size\n        wasmModule._seek(this.bufferLength, currentMapSegment.rate);\n        wasmModule._process(0, outputBlockSize);\n        this.timeIntervalCounter -= outputBlockSize;\n        if (this.timeIntervalCounter <= 0) {\n          this.timeIntervalCounter = this.timeIntervalSamples;\n          this.port.postMessage(['time', inputTime]);\n        }\n      }\n\n      // Re-fetch in case the memory changed (even though there *shouldn't* be any allocations)\n      memory = wasmModule.exports ? wasmModule.exports.memory.buffer : wasmModule.HEAP8.buffer;\n      outputList[0].forEach((channelBuffer, c) => {\n        let buffer = new Float32Array(memory, this.buffersOut[c], outputBlockSize);\n        channelBuffer.set(buffer);\n      });\n      return true;\n    }\n  }\n  registerProcessor(audioNodeKey, WasmProcessor);\n}\n\n/**\n\tCreates a Stretch node\n\t@async\n\t@function SignalsmithStretch\n\t@param {AudioContext} audioContext\n\t@param {Object} options - channel configuration (as per [options]{@link https://developer.mozilla.org/en-US/docs/Web/API/AudioWorkletNode/AudioWorkletNode#options})\n\t@returns {Promise<StretchNode>}\n*/\nSignalsmithStretch = ((Module, audioNodeKey) => {\n  if (typeof AudioWorkletProcessor === 'function' && typeof registerProcessor === 'function') {\n    // AudioWorklet side\n    registerWorkletProcessor(Module, audioNodeKey);\n    return {};\n  }\n  let promiseKey = Symbol();\n  let createNode = async function (audioContext, options) {\n    /**\n    @classdesc An `AudioWorkletNode` with Signalsmith Stretch extensions\n    @name StretchNode\n    @augments AudioWorkletNode\n    @property {number} inputTime - the current playback (in seconds) within the input audio stored by the node\n    */\n    let audioNode;\n    options = options || {\n      numberOfInputs: 1,\n      numberOfOutputs: 1,\n      outputChannelCount: [2]\n    };\n    try {\n      audioNode = new AudioWorkletNode(audioContext, audioNodeKey, options);\n    } catch (e) {\n      if (!audioContext[promiseKey]) {\n        let moduleUrl = createNode.moduleUrl;\n        if (!moduleUrl) {\n          let moduleCode = `(${registerWorkletProcessor})((_scriptName=>${Module})(),${JSON.stringify(audioNodeKey)})`;\n          moduleUrl = URL.createObjectURL(new Blob([moduleCode], {\n            type: 'text/javascript'\n          }));\n        }\n        audioContext[promiseKey] = audioContext.audioWorklet.addModule(moduleUrl);\n      }\n      await audioContext[promiseKey];\n      audioNode = new AudioWorkletNode(audioContext, audioNodeKey, options);\n    }\n\n    // messages with Promise responses\n    let requestMap = {};\n    let idCounter = 0;\n    let timeUpdateCallback = null;\n    let post = (transfer, ...data) => {\n      let id = idCounter++;\n      return new Promise(resolve => {\n        requestMap[id] = resolve;\n        audioNode.port.postMessage([id].concat(data), transfer);\n      });\n    };\n    audioNode.inputTime = 0;\n    audioNode.port.onmessage = event => {\n      let data = event.data;\n      let id = data[0],\n        value = data[1];\n      if (id == 'time') {\n        audioNode.inputTime = value;\n        if (timeUpdateCallback) timeUpdateCallback(value);\n      }\n      if (id in requestMap) {\n        requestMap[id](value);\n        delete requestMap[id];\n      }\n    };\n    return new Promise(resolve => {\n      requestMap['ready'] = remoteMethodKeys => {\n        Object.keys(remoteMethodKeys).forEach(key => {\n          let argCount = remoteMethodKeys[key];\n          audioNode[key] = (...args) => {\n            let transfer = null;\n            if (args.length > argCount) {\n              transfer = args.pop();\n            }\n            return post(transfer, key, ...args);\n          };\n        });\n        /** @lends StretchNode.prototype\n        @method setUpdateInterval\n        */\n        audioNode.setUpdateInterval = (seconds, callback) => {\n          timeUpdateCallback = callback;\n          return post(null, 'setUpdateInterval', seconds);\n        };\n        resolve(audioNode);\n      };\n    });\n  };\n  return createNode;\n})(SignalsmithStretch, 'signalsmith-stretch');\n// register as a CommonJS/AMD module\nif (typeof exports === 'object' && typeof module === 'object') {\n  module.exports = SignalsmithStretch;\n} else if (typeof define === 'function' && define['amd']) {\n  define([], () => SignalsmithStretch);\n}\nlet _export = SignalsmithStretch;\nexport default _export;\n//# sourceMappingURL=SignalsmithStretch.mjs.map"
  },
  {
    "path": "packages/audiodocs/tsconfig.json",
    "content": "{\n  // This file is not used in compilation. It is here just for a nice editor experience.\n  \"extends\": \"@docusaurus/tsconfig\",\n  \"compilerOptions\": {\n    \"baseUrl\": \".\"\n  },\n  \"exclude\": [\".docusaurus\", \"build\"]\n}\n"
  },
  {
    "path": "packages/audiodocs/types.d.ts",
    "content": "\n\nmodule \"*.module.css\" {\n  const classes: { [key: string]: string };\n  export default classes;\n}\n\nmodule \"*.svg\" {\n  import React from \"react\";\n  const ReactComponent: React.FC<React.SVGProps<SVGSVGElement>>;\n  export default ReactComponent;\n}\n"
  },
  {
    "path": "packages/custom-node-generator/README.md",
    "content": "# Cli custom audio node generator\n\nThis library contains source code and templates needed to create a node for custom audio processing used by [react-native-audio-api](https://github.com/software-mansion/react-native-audio-api).\n\n## Usage\n\n```bash\nnpx rn-audioapi-custom-node-generator create -o # path\n```\n\n## Community Discord\n\n[Join the Software Mansion Community Discord](https://discord.swmansion.com) to chat about React Native Audio Api or other Software Mansion libraries.\n\n## Library created by Software Mansion\n\n[![swm](https://logo.swmansion.com/logo?color=white&variant=desktop&width=150&tag=react-native-reanimated-github 'Software Mansion')](https://swmansion.com)\n\nSince 2012 [Software Mansion](https://swmansion.com) is a software agency with experience in building web and mobile apps. We are Core React Native Contributors and experts in dealing with all kinds of React Native issues. We can help you build your next dream product – [Hire us](https://swmansion.com/contact/projects?utm_source=reanimated&utm_medium=readme)."
  },
  {
    "path": "packages/custom-node-generator/bin/cli.js",
    "content": "#!/usr/bin/env node\n\nconst { program } = require('commander');\nconst chalk = require('chalk');\nconst { generate } = require('../lib/generator');\n\nprogram\n  .name('audio-api-node-generator')\n  .description('Generate template files for custom processor using react-native-audio-api.')\n  .version('0.0.5');\n\nprogram\n  .command('create')\n  .option('-o, --output <path>', 'output directory', '.')\n  .action(async (options) => {\n    try {\n      const hasOutputFlag = process.argv.includes('-o') || process.argv.includes('--output');\n      if (!hasOutputFlag) {\n        console.log(chalk.yellow('Please specify an output directory with -o or --output:'));\n        return;\n      }\n      await generate(options.output, 'basic');\n    } catch (error) {\n      console.error(chalk.red('❌ Error:'), error.message);\n      process.exit(1);\n    }\n  });\n\nprogram.parse();"
  },
  {
    "path": "packages/custom-node-generator/lib/generator.js",
    "content": "const fs = require('fs-extra');\nconst path = require('path');\nconst chalk = require('chalk');\n\nclass FileGenerator {\n  constructor() {\n    this.templatesDir = path.join(__dirname, '../templates');\n  }\n\n  async generate(options) {\n    const { outputPath, template } = options;\n    \n    const templatePath = path.join(this.templatesDir, template);\n\n    if (!await fs.pathExists(templatePath)) {\n      throw new Error(`Template not found`);\n    }\n   \n    await fs.ensureDir(outputPath);\n\n    await this.copyTemplate(templatePath, outputPath);\n\n    console.log(chalk.green(`Generated files in: ${outputPath}`));\n  }\n\n  async copyTemplate(templatePath, targetPath) {\n    const files = await fs.readdir(templatePath);\n\n    for (const file of files) {\n      const srcPath = path.join(templatePath, file);\n      const destPath = path.join(targetPath, file);\n      const stat = await fs.stat(srcPath);\n\n      if (stat.isDirectory()) {\n        await fs.ensureDir(destPath);\n        await this.copyTemplate(srcPath, destPath);\n      } else {\n        await this.processFile(srcPath, destPath);\n      }\n    }\n  }\n\n  async processFile(srcPath, destPath) {\n    const content = await fs.readFile(srcPath, 'utf-8');\n    \n    await fs.writeFile(destPath, content);\n    console.log(chalk.cyan(`Created: ${path.relative(process.cwd(), destPath)}`));\n  }\n}\n\nconst generator = new FileGenerator();\n\nmodule.exports = {\n  generate: (outputPath, template) => generator.generate({ outputPath, template }),\n};"
  },
  {
    "path": "packages/custom-node-generator/package.json",
    "content": "{\n  \"name\": \"rn-audioapi-custom-node-generator\",\n  \"version\": \"0.0.7\",\n  \"description\": \"A cli generator for custom node used by react-native-audio-api\",\n  \"main\": \"lib/generator.js\",\n  \"bin\": {\n    \"rn-audioapi-custom-node-generator\": \"./bin/cli.js\"\n  },\n  \"author\": \"michal.dydek@swmansion.com\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"chalk\": \"^4.1.2\",\n    \"commander\": \"^9.4.1\",\n    \"fs-extra\": \"^10.1.0\"\n  },\n  \"files\": [\n    \"bin\",\n    \"lib\",\n    \"templates\"\n  ],\n  \"keywords\": [\n    \"react-native\",\n    \"audio\",\n    \"audio api\",\n    \"web audio api\",\n    \"custom\",\n    \"custom node\",\n    \"generator\",\n    \"react-native-audio-api\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/software-mansion/react-native-audio-api.git\"\n  },\n  \"engines\": {\n    \"node\": \">=12.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/custom-node-generator/templates/basic/shared/MyProcessorNode.cpp",
    "content": "#include \"MyProcessorNode.h\"\n\nnamespace audioapi {\nMyProcessorNode::MyProcessorNode(\n    const std::shared_ptr<BaseAudioContext> &context)\n    : AudioNode(context) {\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nstd::shared_ptr<DSPAudioBuffer>\nMyProcessorNode::processNode(const std::shared_ptr<DSPAudioBuffer> &buffer,\n                             int framesToProcess) {\n  // put your processing logic here\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/custom-node-generator/templates/basic/shared/MyProcessorNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\nnamespace audioapi {\n\nclass MyProcessorNode : public AudioNode {\npublic:\n  explicit MyProcessorNode(const std::shared_ptr<BaseAudioContext> &context);\n\nprotected:\n  std::shared_ptr<DSPAudioBuffer>\n  processNode(const std::shared_ptr<DSPAudioBuffer> &buffer,\n              int framesToProcess) override;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/custom-node-generator/templates/basic/shared/MyProcessorNodeHostObject.h",
    "content": "#pragma once\n\n#include \"MyProcessorNode.h\"\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass MyProcessorNodeHostObject : public AudioNodeHostObject {\npublic:\n  explicit MyProcessorNodeHostObject(\n      const std::shared_ptr<MyProcessorNode> &node)\n      : AudioNodeHostObject(node) {\n    // addGetters(JSI_EXPORT_PROPERTY_GETTER(MyProcessorNodeHostObject, getter));\n    // addSetters(JSI_EXPORT_PROPERTY_SETTER(MyProcessorNodeHostObject, setter));\n    // addFunctions(JSI_EXPORT_FUNCTION(MyProcessorNodeHostObject, function));\n  }\n\n  // JSI_PROPERTY_GETTER(getter) {\n  //   auto processorNode = std::static_pointer_cast<MyProcessorNode>(node_);\n  //   return {processorNode->someGetter()};\n  // }\n\n  // JSI_PROPERTY_SETTER(gain) {\n  //   auto processorNode = std::static_pointer_cast<MyProcessorNode>(node_);\n  //   processorNode->someSetter(value.getNumber());\n  // }\n\n  // JSI_HOST_FUNCTION(function) {\n  //  auto obj = args[0].getObject(runtime);\n  //}\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/custom-node-generator/templates/basic/shared/NativeAudioProcessingModule.cpp",
    "content": "#include \"NativeAudioProcessingModule.h\"\n#include \"MyProcessorNodeHostObject.h\"\n#include <iostream>\n#include <functional>\n#include <memory>\n#include <audioapi/HostObjects/BaseAudioContextHostObject.h>\n#include \"MyProcessorNode.h\"\n\nnamespace facebook::react {\n\nNativeAudioProcessingModule::NativeAudioProcessingModule(std::shared_ptr<CallInvoker> jsInvoker)\n    : NativeAudioProcessingModuleCxxSpec(std::move(jsInvoker)) {}\n\nvoid NativeAudioProcessingModule::injectCustomProcessorInstaller(jsi::Runtime &runtime) {\n  auto installer = createInstaller(runtime);\n  runtime.global().setProperty(runtime, \"createCustomProcessorNode\", installer);\n}\n\njsi::Function NativeAudioProcessingModule::createInstaller(jsi::Runtime &runtime) {\n  return jsi::Function::createFromHostFunction(\n      runtime,\n      jsi::PropNameID::forAscii(runtime, \"createCustomProcessorNode\"),\n      0,\n      [](jsi::Runtime &runtime, const jsi::Value &thisVal, const jsi::Value *args, size_t count) {\n        auto object = args[0].getObject(runtime);\n        auto context = object.getHostObject<audioapi::BaseAudioContextHostObject>(runtime);\n        if (context != nullptr) {\n          auto node = std::make_shared<audioapi::MyProcessorNode>(context->context_.get());\n          auto nodeHostObject = std::make_shared<audioapi::MyProcessorNodeHostObject>(node);\n          return jsi::Object::createFromHostObject(runtime, nodeHostObject);\n        }\n        return jsi::Object::createFromHostObject(runtime, nullptr);\n      });\n    }\n} // namespace facebook::react\n"
  },
  {
    "path": "packages/custom-node-generator/templates/basic/shared/NativeAudioProcessingModule.h",
    "content": "#pragma once\n\n#include <NameFromCodegenConfigJSI.h>\n\n#include <jsi/jsi.h>\n#include <memory>\n#include <string>\n\nnamespace facebook::react {\n\nclass NativeAudioProcessingModule\n    : public NativeAudioProcessingModuleCxxSpec<NativeAudioProcessingModule> {\npublic:\n  NativeAudioProcessingModule(std::shared_ptr<CallInvoker> jsInvoker);\n  void injectCustomProcessorInstaller(jsi::Runtime &runtime);\n\nprivate:\n  jsi::Function createInstaller(jsi::Runtime &runtime);\n  // you can add more installer for different processors here\n};\n\n} // namespace facebook::react\n"
  },
  {
    "path": "packages/custom-node-generator/templates/basic/specs/NativeAudioProcessingModule.ts",
    "content": "import { TurboModule, TurboModuleRegistry } from 'react-native';\n\nexport interface Spec extends TurboModule {\n    injectCustomProcessorInstaller(): void;\n}\n\nexport default TurboModuleRegistry.getEnforcing<Spec>(\"NativeAudioProcessingModule\");"
  },
  {
    "path": "packages/react-native-audio-api/.clang-format",
    "content": "---\nColumnLimit: 100\nAccessModifierOffset: -1\nAlignAfterOpenBracket: false\nAlignConsecutiveAssignments: false\nAlignConsecutiveDeclarations: false\nAlignEscapedNewlines: DontAlign\nAlignOperands: false\nAlignTrailingComments: true\nAllowAllParametersOfDeclarationOnNextLine: false\nAllowShortBlocksOnASingleLine: Empty\nAllowShortCaseLabelsOnASingleLine: false\nAllowShortCompoundRequirementOnASingleLine: true\nAllowShortEnumsOnASingleLine: true\nAllowShortFunctionsOnASingleLine: Empty\nAllowShortIfStatementsOnASingleLine: Never\nAllowShortLambdasOnASingleLine: Inline\nAllowShortLoopsOnASingleLine: false\nAlwaysBreakBeforeMultilineStrings: true\nAlwaysBreakTemplateDeclarations: true\nBinPackArguments: false\nBinPackParameters: false\nBreakBeforeBinaryOperators: None\nBreakBeforeBraces: Attach\nBreakBeforeTernaryOperators: true\nBreakConstructorInitializers: BeforeColon\nBreakAfterJavaFieldAnnotations: false\nBreakStringLiterals: false\nCommentPragmas: '^ IWYU pragma:'\nPackConstructorInitializers: NextLine\nConstructorInitializerIndentWidth: 4\nContinuationIndentWidth: 4\nCpp11BracedListStyle: true\nDerivePointerAlignment: false\nDisableFormat: false\nForEachMacros: [FOR_EACH_RANGE, FOR_EACH]\nIncludeCategories:\n  - Regex: '^<.*\\.h(pp)?>'\n    Priority: 1\n  - Regex: '^<.*'\n    Priority: 2\n  - Regex: '.*'\n    Priority: 3\nIndentCaseLabels: true\nIndentWidth: 2\nIndentWrappedFunctionNames: false\nMacroBlockBegin: ''\nMacroBlockEnd: ''\nMaxEmptyLinesToKeep: 1\nNamespaceIndentation: None\nPenaltyBreakBeforeFirstCallParameter: 1\nPenaltyBreakComment: 300\nPenaltyBreakFirstLessLess: 120\nPenaltyBreakString: 1000\nPenaltyExcessCharacter: 1000000\nPenaltyReturnTypeOnItsOwnLine: 200\nPointerAlignment: Right\nReflowComments: false\nRequiresExpressionIndentation: OuterScope\nSortIncludes: true\nSpaceAfterCStyleCast: false\nSpaceBeforeAssignmentOperators: true\nSpaceBeforeParens: ControlStatements\nSpaceInEmptyParentheses: false\nSpacesBeforeTrailingComments: 1\nSpacesInAngles: Never\nSpacesInContainerLiterals: true\nSpacesInCStyleCastParentheses: false\nSpacesInSquareBrackets: false\nUseTab: Never\n---\nLanguage: Cpp\nBreakAfterOpenBracketBracedList: true\nBreakAfterOpenBracketFunction: true\nStandard: c++20\n---\nLanguage: ObjC\nBreakBeforeBraces: WebKit\nObjCBlockIndentWidth: 2\nObjCSpaceAfterProperty: true\nObjCSpaceBeforeProtocolList: true\nBreakAfterOpenBracketBracedList: true\nBreakAfterOpenBracketFunction: true\n"
  },
  {
    "path": "packages/react-native-audio-api/.clang-tidy",
    "content": "# Full clang-tidy configuration for react-native-audio-api C++.\n# See: https://clang.llvm.org/extra/clang-tidy/checks/list.html\n# Tweak checks in .clangd (Diagnostics.ClangTidy.Remove) to disable noisy ones.\n\nChecks: '-*,\n        bugprone-*,\n        -bugprone-easily-swappable-parameters,\n        modernize-*,\n        -modernize-use-trailing-return-type,\n        performance-*,\n        readability-*,\n        -readability-uppercase-literal-suffix,\n        -readability-math-missing-parentheses,\n        -readability-isolate-declaration,\n        -readability-identifier-length,\n        cppcoreguidelines-*,\n        -cppcoreguidelines-non-private-member-variables-in-classes,\n        -cppcoreguidelines-pro-bounds-avoid-unchecked-container-access,\n        -cppcoreguidelines-pro-bounds-pointer-arithmetic,\n        -cppcoreguidelines-pro-type-union-access,\n        -cppcoreguidelines-pro-type-reinterpret-cast,\n        -cppcoreguidelines-avoid-do-while,\n        -cppcoreguidelines-pro-bounds-constant-array-index,\n        -cppcoreguidelines-init-variables,\n        -cppcoreguidelines-pro-type-vararg,\n        concurrency-*'\n\nHeaderFilterRegex: '.*/(audioapi|common/cpp|src/main/cpp)/.*'\n\nFormatStyle: file\n"
  },
  {
    "path": "packages/react-native-audio-api/.clangd",
    "content": "Documentation:\n  CommentFormat: Doxygen\n\nCompileFlags:\n  Add:\n    - -std=c++20\n    - -Wall\n\nDiagnostics:\n  ClangTidy:\n    FastCheckFilter: Loose\n"
  },
  {
    "path": "packages/react-native-audio-api/.eslintrc.js",
    "content": "/** @type {import('eslint').ESLint.ConfigData} */\nmodule.exports = {\n  extends: ['../../.eslintrc.js'],\n  overrides: [\n    {\n      files: ['./src/**/*.{ts,tsx}'],\n    },\n    {\n      files: ['./tests/**/*.{ts,tsx}'],\n      parserOptions: {\n        project: './tsconfig.test.json',\n        tsconfigRootDir: __dirname,\n      },\n    },\n  ],\n  ignorePatterns: ['lib', 'src/web-core/custom/signalsmithStretch'],\n};\n"
  },
  {
    "path": "packages/react-native-audio-api/.prettierignore",
    "content": "lib\n"
  },
  {
    "path": "packages/react-native-audio-api/.watchmanconfig",
    "content": "{}"
  },
  {
    "path": "packages/react-native-audio-api/RNAudioAPI.podspec",
    "content": "require \"json\"\nrequire_relative './scripts/rnaa_utils'\n\npackage_json = JSON.parse(File.read(File.join(__dir__, \"package.json\")))\n$audio_api_config = find_audio_api_config()\n\n$new_arch_enabled = ENV['RCT_NEW_ARCH_ENABLED'] == '1'\n$RN_AUDIO_API_FFMPEG_DISABLED = ENV['DISABLE_AUDIOAPI_FFMPEG'].nil? ? false : ENV['DISABLE_AUDIOAPI_FFMPEG'] == '1' # false by default\n\nfabric_flags = $new_arch_enabled ? '-DRCT_NEW_ARCH_ENABLED' : ''\nversion_flag = \"-DAUDIOAPI_VERSION=#{package_json['version']}\"\nios_min_version = '14.0'\n\nworklets_enabled = $audio_api_config[:worklets_enabled]\nworklets_preprocessor_flag = worklets_enabled ? '-DRN_AUDIO_API_ENABLE_WORKLETS=1' : ''\n\nffmpeg_flag = $RN_AUDIO_API_FFMPEG_DISABLED ? '-DRN_AUDIO_API_FFMPEG_DISABLED=1' : ''\nskip_ffmpeg_argument = $RN_AUDIO_API_FFMPEG_DISABLED ? 'skipffmpeg' : ''\n\nPod::Spec.new do |s|\n  s.name         = \"RNAudioAPI\"\n  s.version      = package_json[\"version\"]\n  s.summary      = package_json[\"description\"]\n  s.homepage     = package_json[\"homepage\"]\n  s.license      = package_json[\"license\"]\n  s.authors      = package_json[\"author\"]\n\n  s.platforms    = { :ios => ios_min_version }\n  s.source       = { :git => \"https://github.com/software-mansion/react-native-audio-api.git\", :tag => \"#{s.version}\" }\n\n  s.subspec \"audioapi\" do |ss|\n    ss.source_files = \"common/cpp/audioapi/**/*.{cpp,c,h,hpp}\"\n    ss.exclude_files = $RN_AUDIO_API_FFMPEG_DISABLED ? [\"common/cpp/audioapi/libs/ffmpeg/**\"] : []\n    ss.header_dir = \"audioapi\"\n    ss.header_mappings_dir = \"common/cpp/audioapi\"\n\n    ss.subspec \"ios\" do |sss|\n      sss.source_files = \"ios/audioapi/**/*.{mm,h,m,hpp}\"\n      sss.header_dir = \"audioapi\"\n      sss.header_mappings_dir = \"ios/audioapi\"\n    end\n\n    ss.subspec \"audioapi_dsp\" do |sss|\n      sss.source_files = \"common/cpp/audioapi/dsp/**/*.{cpp,inc}\"\n      sss.header_dir = \"audioapi/dsp\"\n      sss.header_mappings_dir = \"common/cpp/audioapi/dsp\"\n      sss.compiler_flags = \"-O3\"\n    end\n\n    # compile miniaudio implementation file as objective-c++\n    ss.subspec \"miniaudio_impl\" do |sss|\n      sss.source_files = \"common/cpp/audioapi/utils/MiniaudioImplementation.cpp\"\n      sss.header_dir = \"audioapi/libs\"\n      sss.header_mappings_dir = \"common/cpp/audioapi/libs\"\n      sss.compiler_flags = \"-x objective-c++\"\n    end\n  end\n\n  if worklets_enabled\n    s.dependency 'RNWorklets'\n  end\n\n  s.ios.frameworks = 'Accelerate', 'AVFoundation', 'MediaPlayer'\n\n  s.prepare_command = <<-CMD\n    chmod +x scripts/download-prebuilt-binaries.sh\n    scripts/download-prebuilt-binaries.sh ios #{skip_ffmpeg_argument}\n  CMD\n\n  # Assumes Pods dir is nested under ios project dir\n  ios_dir = File.join(Pod::Config.instance.project_pods_root, '..')\n  rn_audio_dir_relative = Pathname.new(__dir__).relative_path_from(ios_dir).to_s\n\n  external_dir_relative = \"common/cpp/audioapi/external\"\n  lib_dir = \"$(PROJECT_DIR)/#{rn_audio_dir_relative}/#{external_dir_relative}/$(PLATFORM_NAME)\"\n\n  s.ios.vendored_frameworks = $RN_AUDIO_API_FFMPEG_DISABLED ? [] : [\n    'common/cpp/audioapi/external/ffmpeg_ios/libavcodec.xcframework',\n    'common/cpp/audioapi/external/ffmpeg_ios/libavformat.xcframework',\n    'common/cpp/audioapi/external/ffmpeg_ios/libavutil.xcframework',\n    'common/cpp/audioapi/external/ffmpeg_ios/libswresample.xcframework'\n  ]\n\n  s.pod_target_xcconfig = {\n    \"USE_HEADERMAP\" => \"YES\",\n    \"DEFINES_MODULE\" => \"YES\",\n    \"HEADER_SEARCH_PATHS\" => [\n      '\"$(PODS_TARGET_SRCROOT)/ReactCommon\"',\n      '\"$(PODS_TARGET_SRCROOT)\"',\n      '\"$(PODS_ROOT)/RCT-Folly\"',\n      '\"$(PODS_ROOT)/boost\"',\n      '\"$(PODS_ROOT)/boost-for-react-native\"',\n      '\"$(PODS_ROOT)/DoubleConversion\"',\n      '\"$(PODS_ROOT)/Headers/Private/React-Core\"',\n      '\"$(PODS_ROOT)/Headers/Private/Yoga\"',\n      \"\\\"$(PODS_TARGET_SRCROOT)/#{external_dir_relative}/include\\\"\",\n      \"\\\"$(PODS_TARGET_SRCROOT)/#{external_dir_relative}/include/opus\\\"\",\n      \"\\\"$(PODS_TARGET_SRCROOT)/#{external_dir_relative}/include/vorbis\\\"\",\n    ]\n    .concat($RN_AUDIO_API_FFMPEG_DISABLED ? [] : [\"\\\"$(PODS_TARGET_SRCROOT)/#{external_dir_relative}/include_ffmpeg\\\"\"])\n    .concat(worklets_enabled ? ['\"$(PODS_ROOT)/Headers/Public/RNWorklets\"'] : [])\n    .join(' '),\n    \"CLANG_CXX_LANGUAGE_STANDARD\" => \"c++20\",\n    \"GCC_PREPROCESSOR_DEFINITIONS\" => '$(inherited) HAVE_ACCELERATE=1',\n    'OTHER_CFLAGS' => \"$(inherited) #{fabric_flags} #{version_flag} #{worklets_preprocessor_flag} #{ffmpeg_flag}\",\n  }\n\n  s.xcconfig = {\n    \"HEADER_SEARCH_PATHS\" => [\n      '\"$(PODS_ROOT)/boost\"',\n      '\"$(PODS_ROOT)/boost-for-react-native\"',\n      '\"$(PODS_ROOT)/glog\"',\n      '\"$(PODS_ROOT)/RCT-Folly\"',\n      '\"$(PODS_ROOT)/Headers/Public/React-hermes\"',\n      '\"$(PODS_ROOT)/Headers/Public/hermes-engine\"',\n      \"\\\"$(PODS_ROOT)/#{$audio_api_config[:react_native_common_dir]}\\\"\",\n      \"\\\"$(PODS_ROOT)/#{$audio_api_config[:dynamic_frameworks_audio_api_dir]}/ios\\\"\",\n      \"\\\"$(PODS_ROOT)/#{$audio_api_config[:dynamic_frameworks_audio_api_dir]}/common/cpp\\\"\",\n    ]\n    .concat(worklets_enabled ? [\n      '\"$(PODS_ROOT)/Headers/Public/RNWorklets\"',\n      \"\\\"$(PODS_ROOT)/#{$audio_api_config[:dynamic_frameworks_worklets_dir]}/apple\\\"\",\n      \"\\\"$(PODS_ROOT)/#{$audio_api_config[:dynamic_frameworks_worklets_dir]}/Common/cpp\\\"\"\n    ] : [])\n    .join(' '),\n    'OTHER_LDFLAGS' => %W[\n      $(inherited)\n      -force_load #{lib_dir}/libopusfile.a\n      -force_load #{lib_dir}/libopus.a\n      -force_load #{lib_dir}/libogg.a\n      -force_load #{lib_dir}/libvorbis.a\n      -force_load #{lib_dir}/libvorbisenc.a\n      -force_load #{lib_dir}/libvorbisfile.a\n      -force_load #{lib_dir}/libssl.a\n      -force_load #{lib_dir}/libcrypto.a\n    ].join(\" \"),\n  }\n  # Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0.\n  # See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79.\n  install_modules_dependencies(s)\nend\n"
  },
  {
    "path": "packages/react-native-audio-api/android/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.12.0)\nproject(react-native-audio-api)\n\nset(CMAKE_VERBOSE_MAKEFILE ON)\nset(CMAKE_EXPORT_COMPILE_COMMANDS ON)\nset(CMAKE_CXX_STANDARD 20)\n\n# Detect the processor and SIMD support\nif(CMAKE_SYSTEM_PROCESSOR STREQUAL \"arm64\" OR CMAKE_SYSTEM_PROCESSOR STREQUAL \"aarch64\")\n    set(HAVE_ARM_NEON_INTRINSICS TRUE)\nelseif(CMAKE_SYSTEM_PROCESSOR MATCHES \"x86_64|amd64\")\n    set(HAVE_X86_SSE2 TRUE)\nendif()\n\n# default CMAKE_CXX_FLAGS: \"-g -DANDROID -fdata-sections -ffunction-sections\n# -funwind-tables -fstack-protector-strong -no-canonical-prefixes\n# -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fstack-protector-all\"\ninclude(\"${REACT_NATIVE_DIR}/ReactAndroid/cmake-utils/folly-flags.cmake\")\nadd_compile_options(${folly_FLAGS})\n\nif(ReactAndroid_VERSION_MINOR GREATER_EQUAL 80)\n  include(\"${REACT_NATIVE_DIR}/ReactCommon/cmake-utils/react-native-flags.cmake\")\n  target_compile_reactnative_options(react-native-audio-api PRIVATE)\nelse()\n  string(APPEND CMAKE_CXX_FLAGS \" -fexceptions -frtti -std=c++${CMAKE_CXX_STANDARD} -Wall\")\nendif()\n\nstring(APPEND CMAKE_CXX_FLAGS \" -fno-omit-frame-pointer\")\n\nif(${IS_NEW_ARCHITECTURE_ENABLED})\n  string(APPEND CMAKE_CXX_FLAGS \" -DRCT_NEW_ARCH_ENABLED\")\nendif()\n\nset(ANDROID_CPP_DIR \"${CMAKE_SOURCE_DIR}/src/main/cpp\")\nset(COMMON_CPP_DIR \"${CMAKE_SOURCE_DIR}/../common/cpp\")\n\nadd_subdirectory(\"${ANDROID_CPP_DIR}/audioapi\")\n"
  },
  {
    "path": "packages/react-native-audio-api/android/build.gradle",
    "content": "import com.android.Version\nimport org.apache.tools.ant.taskdefs.condition.Os\n\nbuildscript {\n  repositories {\n    google()\n    mavenCentral()\n  }\n\n  dependencies {\n    classpath \"com.android.tools.build:gradle:7.2.2\"\n  }\n}\n\ndef reactNativeArchitectures() {\n  def value = rootProject.getProperties().get(\"reactNativeArchitectures\")\n  return value ? value.split(\",\") : [\"armeabi-v7a\", \"arm64-v8a\", \"x86_64\", \"x86\"]\n}\n\ndef isNewArchitectureEnabled() {\n  return rootProject.hasProperty(\"newArchEnabled\") && rootProject.getProperty(\"newArchEnabled\") == \"true\"\n}\n\ndef isFFmpegDisabled() {\n  return rootProject.hasProperty(\"disableAudioapiFFmpeg\") && rootProject.getProperty(\"disableAudioapiFFmpeg\") == \"true\"\n}\n\napply plugin: \"com.android.library\"\napply plugin: 'org.jetbrains.kotlin.android'\n\nif (isNewArchitectureEnabled()) {\n  apply plugin: \"com.facebook.react\"\n}\n\ndef getExtOrDefault(name) {\n  return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties[\"AudioAPI_\" + name]\n}\n\ndef getExtOrIntegerDefault(name) {\n  return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties[\"AudioAPI_\" + name]).toInteger()\n}\n\ndef resolveBuildType() {\n    Gradle gradle = getGradle()\n    String tskReqStr = gradle.getStartParameter().getTaskRequests()['args'].toString()\n    return tskReqStr.contains('Release') ? 'release' : 'debug'\n}\n\ndef safeAppExtGet(prop, fallback) {\n  def appProject = rootProject.allprojects.find { it.plugins.hasPlugin('com.android.application') }\n  appProject?.ext?.has(prop) ? appProject.ext.get(prop) : fallback\n}\n\ndef resolveReactNativeDirectory() {\n  def reactNativeLocation = safeAppExtGet(\"REACT_NATIVE_NODE_MODULES_DIR\", null)\n\n  if (reactNativeLocation !== null) {\n    return file(reactNativeLocation)\n  }\n\n  // Fallback to node resolver for custom directory structures like monorepos.\n  def reactNativePackage = file([\"node\", \"--print\", \"require.resolve('react-native/package.json')\"].execute(null, rootDir).text.trim())\n  if(reactNativePackage.exists()) {\n      return reactNativePackage.parentFile\n  }\n\n  throw new GradleException(\n      \"[AudioAPI] Unable to resolve react-native location in node_modules. You should project extension property (in `app/build.gradle`) `REACT_NATIVE_NODE_MODULES_DIR` with path to react-native.\"\n  )\n}\n\ndef resolveReactNativeWorkletsDirectory() {\n  def rnWorklets = rootProject.subprojects.find { it.name == 'react-native-worklets' }\n  if (rnWorklets != null) {\n    return rnWorklets.projectDir\n  }\n\n  return null;\n}\n\ndef validateWorkletsVersion() {\n  def validationScript = file(\"${projectDir}/../scripts/validate-worklets-version.js\")\n  if (!validationScript.exists()) {\n    logger.error(\"[AudioAPI] Worklets validation script not found at ${validationScript.absolutePath}\")\n    return false\n  }\n\n  try {\n    def process = [\"node\", validationScript.absolutePath].execute()\n    process.waitForProcessOutput(System.out, System.err)\n    def exitCode = process.exitValue()\n\n    if (exitCode == 0) {\n      return true\n    } else {\n      logger.warn(\"[AudioAPI] Worklets version validation failed\")\n      return false\n    }\n  } catch (Exception e) {\n    logger.error(\"[AudioAPI] Failed to validate worklets version: ${e.message}\")\n    return false\n  }\n}\n\ndef toPlatformFileString(String path) {\n  if (Os.isFamily(Os.FAMILY_WINDOWS)) {\n      path = path.replace(File.separatorChar, '/' as char)\n  }\n  return path\n}\n\nstatic def supportsNamespace() {\n  def parsed = Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')\n  def major = parsed[0].toInteger()\n  def minor = parsed[1].toInteger()\n\n  // Namespace support was added in 7.3.0\n  return (major == 7 && minor >= 3) || major >= 8\n}\n\ndef reactNativeRootDir = resolveReactNativeDirectory()\ndef reactNativeWorkletsRootDir = resolveReactNativeWorkletsDirectory()\ndef isWorkletsAvailable = reactNativeWorkletsRootDir != null && validateWorkletsVersion()\n\ndef reactProperties = new Properties()\nfile(\"$reactNativeRootDir/ReactAndroid/gradle.properties\").withInputStream { reactProperties.load(it) }\n\ndef REACT_NATIVE_VERSION = reactProperties.getProperty(\"VERSION_NAME\")\ndef REACT_NATIVE_MINOR_VERSION = REACT_NATIVE_VERSION.startsWith(\"0.0.0-\") ? 1000 : REACT_NATIVE_VERSION.split(\"\\\\.\")[1].toInteger()\ndef IS_NEW_ARCHITECTURE_ENABLED = isNewArchitectureEnabled()\ndef IS_RN_AUDIO_API_FFMPEG_DISABLED = isFFmpegDisabled()\n\nandroid {\n  sourceSets {\n      main {\n          jniLibs.srcDirs = ['src/main/jniLibs']\n      }\n  }\n  if (supportsNamespace()) {\n    namespace \"com.swmansion.audioapi\"\n\n    sourceSets {\n      main {\n        manifest.srcFile \"src/main/AndroidManifestNew.xml\"\n      }\n    }\n  }\n\n  ndkVersion getExtOrDefault(\"ndkVersion\")\n  compileSdkVersion getExtOrIntegerDefault(\"compileSdkVersion\")\n\n  defaultConfig {\n    minSdkVersion getExtOrIntegerDefault(\"minSdkVersion\")\n    targetSdkVersion getExtOrIntegerDefault(\"targetSdkVersion\")\n    consumerProguardFiles(\"proguard-rules.pro\")\n\n    buildConfigField \"boolean\", \"IS_NEW_ARCHITECTURE_ENABLED\", isNewArchitectureEnabled().toString()\n    buildConfigField \"boolean\", \"RN_AUDIO_API_ENABLE_WORKLETS\", \"${isWorkletsAvailable}\"\n    buildConfigField \"boolean\", \"RN_AUDIO_API_FFMPEG_DISABLED\", isFFmpegDisabled().toString()\n\n    externalNativeBuild {\n      cmake {\n        abiFilters (*reactNativeArchitectures())\n\n        def cmakeArgs = [\n          \"-DANDROID_STL=c++_shared\",\n          \"-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}\",\n          \"-DANDROID_TOOLCHAIN=clang\",\n          \"-DREACT_NATIVE_DIR=${toPlatformFileString(reactNativeRootDir.path)}\",\n          \"-DRN_AUDIO_API_WORKLETS_ENABLED=${isWorkletsAvailable}\",\n          \"-DIS_NEW_ARCHITECTURE_ENABLED=${IS_NEW_ARCHITECTURE_ENABLED}\",\n          \"-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON\",\n          \"-DRN_AUDIO_API_FFMPEG_DISABLED=${IS_RN_AUDIO_API_FFMPEG_DISABLED}\"\n        ]\n\n        if (isWorkletsAvailable) {\n          cmakeArgs << \"-DREACT_NATIVE_WORKLETS_DIR=${toPlatformFileString(reactNativeWorkletsRootDir.path)}\"\n        }\n        arguments = cmakeArgs\n      }\n    }\n  }\n\n  packagingOptions {\n    jniLibs {\n      useLegacyPackaging = false  // enables 16KB alignment\n    }\n    excludes = [\n      \"META-INF\",\n      \"META-INF/**\",\n      \"**/libc++_shared.so\",\n      \"**/libfbjni.so\",\n      \"**/libjsi.so\",\n      \"**/libfolly_json.so\",\n      \"**/libfolly_runtime.so\",\n      \"**/libglog.so\",\n      \"**/libhermes.so\",\n      \"**/libhermesvm.so\",\n      \"**/libhermes-executor-debug.so\",\n      \"**/libhermes_executor.so\",\n      \"**/libhermestooling.so\",\n      \"**/libreactnativejni.so\",\n      \"**/libturbomodulejsijni.so\",\n      \"**/libreactnative.so\",\n      \"**/libreact_nativemodule_core.so\",\n      \"**/libreact_render*.so\",\n      \"**/librrc_root.so\",\n      \"**/libjscexecutor.so\",\n      \"**/libv8executor.so\",\n      \"**/libreanimated.so\"\n    ]\n  }\n\n  externalNativeBuild {\n    cmake {\n      path \"CMakeLists.txt\"\n    }\n  }\n\n  buildFeatures {\n    buildConfig true\n    prefab true\n  }\n\n  buildTypes {\n    release {\n      minifyEnabled false\n    }\n  }\n\n  lintOptions {\n    disable \"GradleCompatible\"\n  }\n\n  compileOptions {\n    sourceCompatibility JavaVersion.VERSION_17\n    targetCompatibility JavaVersion.VERSION_17\n\n    packagingOptions {\n      doNotStrip resolveBuildType() == 'debug' ? \"**/**/*.so\" : ''\n\n      excludes = [\n        \"**/libjsi.so\",\n        \"**/libfolly_runtime.so\",\n        \"**/libreactnativejni.so\",\n        \"**/libreactnative.so\",\n      ]\n    }\n  }\n\n  sourceSets {\n    main {\n      if (isNewArchitectureEnabled()) {\n          java.srcDirs += [\n            // This is needed to build Kotlin project with NewArch enabled\n            \"${project.buildDir}/generated/source/codegen/java\"\n          ]\n      } else {\n        java.srcDirs += [\"src/oldarch\"]\n      }\n    }\n  }\n  kotlinOptions {\n    jvmTarget = '17'\n  }\n}\n\nrepositories {\n  mavenCentral()\n  google()\n}\n\n\ndependencies {\n  // For < 0.71, this will be from the local maven repo\n  // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin\n  //noinspection GradleDynamicVersion\n  implementation \"com.facebook.react:react-native:+\"\n  implementation 'androidx.core:core-ktx:1.13.1'\n  implementation 'com.facebook.fbjni:fbjni:0.6.0'\n  implementation 'com.google.oboe:oboe:1.9.3'\n  implementation 'androidx.media:media:1.7.0'\n\n  if (isWorkletsAvailable) {\n    implementation(rootProject.subprojects.find { it.name == 'react-native-worklets' })\n  }\n}\n\nif (isWorkletsAvailable) {\n  // Ensure worklets is built before react-native-audio-api\n  def rnWorkletsProject = rootProject.subprojects.find { it.name == 'react-native-worklets' }\n  evaluationDependsOn(rnWorkletsProject.path)\n\n  afterEvaluate {\n      tasks.getByName(\"buildCMakeDebug\").dependsOn(rnWorkletsProject.tasks.getByName(\"mergeDebugNativeLibs\"))\n      tasks.getByName(\"buildCMakeRelWithDebInfo\").dependsOn(rnWorkletsProject.tasks.getByName(\"mergeReleaseNativeLibs\"))\n  }\n}\n\n\ndef assertMinimalReactNativeVersion = task assertMinimalReactNativeVersionTask {\n    // If you change the minimal React Native version remember to update Compatibility Table in docs\n    def minimalReactNativeVersion = 76\n    onlyIf { REACT_NATIVE_MINOR_VERSION < minimalReactNativeVersion }\n    doFirst {\n        throw new GradleException(\"[AudioAPI] Unsupported React Native version. Please use $minimalReactNativeVersion. or newer.\")\n    }\n}\n\ntask downloadPrebuiltBinaries(type: Exec) {\n  commandLine 'chmod', '+x', '../scripts/download-prebuilt-binaries.sh'\n  commandLine 'bash', '../scripts/download-prebuilt-binaries.sh'\n  args 'android', isFFmpegDisabled() ? 'skipffmpeg' : ''\n}\n\n// Make preBuild depend on the download task\ntasks.preBuild {\n    dependsOn assertMinimalReactNativeVersion\n    dependsOn downloadPrebuiltBinaries\n}\n\ntask cleanCmakeCache() {\n    tasks.getByName(\"clean\").dependsOn(cleanCmakeCache)\n    doFirst {\n        delete \"${projectDir}/.cxx\"\n    }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/gradle.properties",
    "content": "AudioAPI_kotlinVersion=1.7.0\nAudioAPI_minSdkVersion=21\nAudioAPI_targetSdkVersion=31\nAudioAPI_compileSdkVersion=31\nAudioAPI_ndkversion=21.4.7075529\n"
  },
  {
    "path": "packages/react-native-audio-api/android/proguard-rules.pro",
    "content": "-keep class com.swmansion.audioapi.** { *; }\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/AndroidManifest.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n          package=\"com.swmansion.audioapi\">\n</manifest>\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/AndroidManifestNew.xml",
    "content": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\">\n</manifest>\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.12.0)\n\nfile(GLOB_RECURSE ANDROID_CPP_SOURCES CONFIGURE_DEPENDS \"${ANDROID_CPP_DIR}/audioapi/*.cpp\")\nfile(GLOB_RECURSE COMMON_CPP_SOURCES CONFIGURE_DEPENDS \"${COMMON_CPP_DIR}/audioapi/*.cpp\" \"${COMMON_CPP_DIR}/audioapi/*.c\")\nfile(GLOB_RECURSE DSP_CPP_SOURCES CONFIGURE_DEPENDS \"${COMMON_CPP_DIR}/audioapi/dsp/*.cpp\")\n\nif (RN_AUDIO_API_FFMPEG_DISABLED)\n  list(REMOVE_ITEM COMMON_CPP_SOURCES\n    \"${COMMON_CPP_DIR}/audioapi/libs/ffmpeg/FFmpegDecoding.cpp\"\n  )\nendif()\n\nset_source_files_properties(\n  ${DSP_CPP_SOURCES}\n  PROPERTIES\n  COMPILE_FLAGS \"-O3\"\n)\n\nset(INCLUDE_DIR ${COMMON_CPP_DIR}/audioapi/external/include)\nset(FFMPEG_INCLUDE_DIR ${COMMON_CPP_DIR}/audioapi/external/include_ffmpeg)\nset(EXTERNAL_DIR ${COMMON_CPP_DIR}/audioapi/external/android)\nset(JNI_LIBS_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs)\n\nadd_library(react-native-audio-api SHARED ${ANDROID_CPP_SOURCES} ${COMMON_CPP_SOURCES})\n\nforeach(lib IN ITEMS opus opusfile ogg vorbis vorbisenc vorbisfile crypto ssl)\n  add_library(${lib} STATIC IMPORTED)\n  set_target_properties(${lib} PROPERTIES IMPORTED_LOCATION ${EXTERNAL_DIR}/${ANDROID_ABI}/lib${lib}.a)\nendforeach()\n\nif (NOT RN_AUDIO_API_FFMPEG_DISABLED)\n  foreach (lib IN ITEMS avcodec avformat avutil swresample)\n    add_library(${lib} SHARED IMPORTED)\n    set_target_properties(${lib} PROPERTIES IMPORTED_LOCATION ${JNI_LIBS_DIR}/${ANDROID_ABI}/lib${lib}.so)\n  endforeach()\nendif()\n\nfind_package(ReactAndroid REQUIRED CONFIG)\nfind_package(fbjni REQUIRED CONFIG)\nfind_package(oboe REQUIRED CONFIG)\n\nif(${CMAKE_BUILD_TYPE} MATCHES \"Debug\")\n  set(BUILD_TYPE \"debug\")\nelse()\n  set(BUILD_TYPE \"release\")\nendif()\n\ntarget_include_directories(\n  react-native-audio-api\n  PRIVATE\n  \"${COMMON_CPP_DIR}\"\n  \"${ANDROID_CPP_DIR}\"\n  \"${INCLUDE_DIR}\"\n  \"${INCLUDE_DIR}/opus\"\n  \"${FFMPEG_INCLUDE_DIR}\"\n  \"${REACT_NATIVE_DIR}/ReactCommon\"\n  \"${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule\"\n  \"${REACT_NATIVE_DIR}/ReactCommon/callinvoker\"\n)\n\nset(LINK_LIBRARIES\n  ReactAndroid::jsi\n  fbjni::fbjni\n  android\n  log\n  oboe::oboe\n)\n\nset(INCLUDE_LIBRARIES\n  \"${COMMON_CPP_DIR}\"\n  \"${ANDROID_CPP_DIR}\"\n  \"${INCLUDE_DIR}\"\n  \"${INCLUDE_DIR}/opus\"\n  \"${INCLUDE_DIR}/vorbis\"\n  \"${REACT_NATIVE_DIR}/ReactCommon\"\n  \"${REACT_NATIVE_DIR}/ReactCommon/jsiexecutor\"\n  \"${REACT_NATIVE_DIR}/ReactAndroid/src/main/jni/react/turbomodule\"\n  \"${REACT_NATIVE_DIR}/ReactCommon/callinvoker\"\n)\n\nif(RN_AUDIO_API_WORKLETS_ENABLED)\n  # Import the worklets library (similar to how Reanimated does it)\n  add_library(worklets SHARED IMPORTED)\n  set_target_properties(\n    worklets\n    PROPERTIES\n      IMPORTED_LOCATION\n      \"${REACT_NATIVE_WORKLETS_DIR}/build/intermediates/cmake/${BUILD_TYPE}/obj/${ANDROID_ABI}/libworklets.so\"\n  )\n  list(APPEND INCLUDE_LIBRARIES\n    \"${REACT_NATIVE_WORKLETS_DIR}/../Common/cpp\"\n    \"${REACT_NATIVE_WORKLETS_DIR}/src/main/cpp\"\n  )\n  list(APPEND LINK_LIBRARIES worklets)\nendif()\n\ntarget_include_directories(\n  react-native-audio-api\n  PRIVATE\n  ${INCLUDE_LIBRARIES}\n)\n\nset(RN_VERSION_LINK_LIBRARIES\n  ReactAndroid::reactnative\n)\n\nif(RN_AUDIO_API_WORKLETS_ENABLED)\n  target_compile_definitions(\n    react-native-audio-api\n    PRIVATE RN_AUDIO_API_ENABLE_WORKLETS=1\n  )\nelse()\n  target_compile_definitions(\n    react-native-audio-api\n    PRIVATE RN_AUDIO_API_ENABLE_WORKLETS=0\n  )\nendif()\n\nif (RN_AUDIO_API_FFMPEG_DISABLED)\n  target_compile_definitions(\n    react-native-audio-api\n    PRIVATE RN_AUDIO_API_FFMPEG_DISABLED=1\n  )\nendif()\n\ntarget_link_libraries(react-native-audio-api\n  ${LINK_LIBRARIES}\n  ${RN_VERSION_LINK_LIBRARIES}\n  opusfile\n  opus\n  ogg\n  vorbis\n  vorbisenc\n  vorbisfile\n  crypto\n  ssl\n  z\n)\n\nif(NOT RN_AUDIO_API_FFMPEG_DISABLED)\n  target_link_libraries(react-native-audio-api\n    avcodec\n    avformat\n    avutil\n    swresample\n  )\nendif()\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/AudioAPIModule.cpp",
    "content": "#include <audioapi/android/AudioAPIModule.h>\n#include <memory>\n#include <string>\n#include <unordered_map>\n\nnamespace audioapi {\n\nusing namespace facebook::jni;\n\nAudioAPIModule::AudioAPIModule(\n    jni::alias_ref<AudioAPIModule::jhybridobject> &jThis,\n#if RN_AUDIO_API_ENABLE_WORKLETS\n    std::weak_ptr<WorkletsModuleProxy> weakWorkletsModuleProxy,\n#endif\n    jsi::Runtime *jsiRuntime,\n    const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker)\n    : javaPart_(make_global(jThis)),\n      jsiRuntime_(jsiRuntime),\n#if RN_AUDIO_API_ENABLE_WORKLETS\n      weakWorkletsModuleProxy_(weakWorkletsModuleProxy),\n#endif\n      jsCallInvoker_(jsCallInvoker) {\n  audioEventHandlerRegistry_ =\n      std::make_shared<AudioEventHandlerRegistry>(jsiRuntime, jsCallInvoker);\n}\n\njni::local_ref<AudioAPIModule::jhybriddata> AudioAPIModule::initHybrid(\n    jni::alias_ref<jhybridobject> jThis,\n    jni::alias_ref<jni::JObject> jWorkletsModule,\n    jlong jsContext,\n    jni::alias_ref<facebook::react::CallInvokerHolder::javaobject> jsCallInvokerHolder) {\n  auto jsCallInvoker = jsCallInvokerHolder->cthis()->getCallInvoker();\n  auto rnRuntime = reinterpret_cast<jsi::Runtime *>(jsContext);\n#if RN_AUDIO_API_ENABLE_WORKLETS\n  if (jWorkletsModule) {\n    auto castedModule = jni::static_ref_cast<WorkletsModule::javaobject>(jWorkletsModule);\n    auto workletsModuleProxy = castedModule->cthis()->getWorkletsModuleProxy();\n    return makeCxxInstance(jThis, workletsModuleProxy, rnRuntime, jsCallInvoker);\n  }\n  throw std::runtime_error(\"Worklets module is required but not provided from Java/Kotlin side\");\n#else\n  return makeCxxInstance(jThis, rnRuntime, jsCallInvoker);\n#endif\n}\n\nvoid AudioAPIModule::registerNatives() {\n  registerHybrid({\n      makeNativeMethod(\"initHybrid\", AudioAPIModule::initHybrid),\n      makeNativeMethod(\"injectJSIBindings\", AudioAPIModule::injectJSIBindings),\n      makeNativeMethod(\n          \"invokeHandlerWithEventNameAndEventBody\",\n          AudioAPIModule::invokeHandlerWithEventNameAndEventBody),\n  });\n}\n\nvoid AudioAPIModule::injectJSIBindings() {\n#if RN_AUDIO_API_ENABLE_WORKLETS\n  auto uiWorkletRuntime = weakWorkletsModuleProxy_.lock()->getUIWorkletRuntime();\n#else\n  auto uiWorkletRuntime = nullptr;\n#endif\n  AudioAPIModuleInstaller::injectJSIBindings(\n      jsiRuntime_, jsCallInvoker_, audioEventHandlerRegistry_, uiWorkletRuntime);\n}\n\nvoid AudioAPIModule::invokeHandlerWithEventNameAndEventBody(\n    jint eventOrdinal,\n    jni::alias_ref<jni::JMap<jstring, jobject>> eventBody) {\n  std::unordered_map<std::string, EventValue> body = {};\n\n  for (const auto &entry : *eventBody) {\n    std::string name = entry.first->toStdString();\n    auto value = entry.second;\n\n    if (value->isInstanceOf(jni::JString::javaClassStatic())) {\n      body[name] = jni::static_ref_cast<jni::JString>(value)->toStdString();\n    } else if (value->isInstanceOf(jni::JInteger::javaClassStatic())) {\n      body[name] = jni::static_ref_cast<jni::JInteger>(value)->value();\n    } else if (value->isInstanceOf(jni::JDouble::javaClassStatic())) {\n      body[name] = jni::static_ref_cast<jni::JDouble>(value)->value();\n    } else if (value->isInstanceOf(jni::JFloat::javaClassStatic())) {\n      body[name] = jni::static_ref_cast<jni::JFloat>(value)->value();\n    } else if (value->isInstanceOf(jni::JBoolean::javaClassStatic())) {\n      auto booleanValue = jni::static_ref_cast<jni::JBoolean>(value)->value();\n\n      if (booleanValue) {\n        body[name] = true;\n      } else {\n        body[name] = false;\n      }\n    }\n  }\n\n  if (audioEventHandlerRegistry_ != nullptr) {\n    audioEventHandlerRegistry_->invokeHandlerWithEventBody(\n        static_cast<audioapi::AudioEvent>(eventOrdinal), body);\n  }\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/AudioAPIModule.h",
    "content": "#pragma once\n\n#include <ReactCommon/CallInvokerHolder.h>\n#include <audioapi/AudioAPIModuleInstaller.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <fbjni/fbjni.h>\n#include <memory>\n\nnamespace audioapi {\n\nusing namespace facebook;\nusing namespace worklets;\n\nclass AudioAPIModule : public jni::HybridClass<AudioAPIModule> {\n public:\n  static auto constexpr kJavaDescriptor = \"Lcom/swmansion/audioapi/AudioAPIModule;\";\n\n  static jni::local_ref<AudioAPIModule::jhybriddata> initHybrid(\n      jni::alias_ref<jhybridobject> jThis,\n      jni::alias_ref<jni::JObject>\n          jWorkletsModule, // it will be null if RN_AUDIO_API_ENABLE_WORKLETS is false\n      jlong jsContext,\n      jni::alias_ref<facebook::react::CallInvokerHolder::javaobject> jsCallInvokerHolder);\n\n  static void registerNatives();\n\n  void injectJSIBindings();\n  void invokeHandlerWithEventNameAndEventBody(\n      jint eventOrdinal,\n      jni::alias_ref<jni::JMap<jstring, jobject>> eventBody);\n\n private:\n  friend HybridBase;\n\n  jni::global_ref<AudioAPIModule::javaobject> javaPart_;\n  jsi::Runtime *jsiRuntime_;\n#if RN_AUDIO_API_ENABLE_WORKLETS\n  std::weak_ptr<worklets::WorkletsModuleProxy> weakWorkletsModuleProxy_;\n#endif\n  std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker_;\n  std::shared_ptr<AudioEventHandlerRegistry> audioEventHandlerRegistry_;\n\n#if RN_AUDIO_API_ENABLE_WORKLETS\n  explicit AudioAPIModule(\n      jni::alias_ref<AudioAPIModule::jhybridobject> &jThis,\n      std::weak_ptr<worklets::WorkletsModuleProxy> weakWorkletsModuleProxy,\n      jsi::Runtime *jsiRuntime,\n      const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker);\n#else\n  explicit AudioAPIModule(\n      jni::alias_ref<AudioAPIModule::jhybridobject> &jThis,\n      jsi::Runtime *jsiRuntime,\n      const std::shared_ptr<facebook::react::CallInvoker> &jsCallInvoker);\n#endif\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/OnLoad.cpp",
    "content": "#include <audioapi/android/AudioAPIModule.h>\n\n#include <fbjni/fbjni.h>\n\nusing namespace audioapi;\n\nJNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *vm, void *) {\n  return facebook::jni::initialize(vm, [] { AudioAPIModule::registerNatives(); });\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.cpp",
    "content": "#include <android/log.h>\n#include <audioapi/android/core/AndroidAudioRecorder.h>\n#include <audioapi/android/core/utils/AndroidFileWriterBackend.h>\n#include <audioapi/android/core/utils/AndroidRecorderCallback.h>\n\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n#include <audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h>\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n\n#include <audioapi/android/core/utils/AndroidRotatingFileWriter.h>\n#include <audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h>\n#include <audioapi/core/sources/RecorderAdapterNode.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/core/utils/Locker.h>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <audioapi/utils/AudioFileProperties.h>\n#include <audioapi/utils/CircularArray.hpp>\n#include <audioapi/utils/CircularOverflowableAudioArray.h>\n\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\nnamespace audioapi {\n\nAndroidAudioRecorder::AndroidAudioRecorder(\n    const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)\n    : AudioRecorder(audioEventHandlerRegistry),\n      streamSampleRate_(0.0),\n      streamChannelCount_(0),\n      streamMaxBufferSizeInFrames_(0) {}\n\n/// @brief Destructor ensures that the audio stream and each output type are closed and flushed up remaining data.\n/// TODO: Possibly locks here are not necessary, but we might have an issue with oboe having raw pointer to the\n/// recorder (and player) instances, thus creating race conditions during destruction.\n/// callable from the JS thread only (i hope).\nAndroidAudioRecorder::~AndroidAudioRecorder() {\n  std::shared_ptr<AudioFileWriter> fileWriter;\n  std::shared_ptr<AudioRecorderCallback> dataCallback;\n  std::shared_ptr<RecorderAdapterNode> adapterNode;\n  {\n    std::scoped_lock dtorLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);\n\n    if (usesFileOutput()) {\n      fileOutputConfigured_.store(false, std::memory_order_release);\n      fileWriter = std::move(fileWriter_);\n    }\n\n    if (usesCallback()) {\n      callbackOutputConfigured_.store(false, std::memory_order_release);\n      dataCallback = std::move(dataCallback_);\n    }\n\n    if (isConnected()) {\n      connectedConfigured_.store(false, std::memory_order_release);\n      adapterNode = std::move(adapterNode_);\n      deinterleavingBuffer_ = nullptr;\n    }\n\n    fileOutputEnabled_.store(false, std::memory_order_release);\n    callbackOutputEnabled_.store(false, std::memory_order_release);\n    isConnected_.store(false, std::memory_order_release);\n  }\n\n  if (fileWriter != nullptr) {\n    fileWriter->closeFile();\n  }\n\n  if (dataCallback != nullptr) {\n    dataCallback->cleanup();\n  }\n\n  if (adapterNode != nullptr) {\n    adapterNode->adapterCleanup();\n  }\n\n  if (mStream_ != nullptr) {\n    mStream_->requestStop();\n    mStream_->close();\n    mStream_.reset();\n  }\n}\n\n/// @brief Creates and opens the Oboe audio input stream for recording.\n/// calculates the \"native\" or hardware stream parameters for other interfaces\n/// to use.\n/// Callable from the JS thread only.\n/// @returns Success status or Error status with message.\nResult<NoneType, std::string> AndroidAudioRecorder::openAudioStream() {\n  if (mStream_ != nullptr) {\n    return Result<NoneType, std::string>::Ok(None);\n  }\n\n  oboe::AudioStreamBuilder builder;\n  builder.setSharingMode(oboe::SharingMode::Exclusive)\n      ->setDirection(oboe::Direction::Input)\n      ->setFormat(oboe::AudioFormat::Float)\n      ->setFormatConversionAllowed(true)\n      ->setPerformanceMode(oboe::PerformanceMode::None)\n      ->setSampleRateConversionQuality(oboe::SampleRateConversionQuality::Medium)\n      ->setDataCallback(this)\n      ->setErrorCallback(this);\n\n  auto result = builder.openStream(mStream_);\n\n  if (result != oboe::Result::OK || mStream_ == nullptr) {\n    return Result<NoneType, std::string>::Err(\n        \"Failed to open audio stream: \" + std::string(oboe::convertToText(result)));\n  }\n\n  streamSampleRate_ = static_cast<float>(mStream_->getSampleRate());\n  streamChannelCount_ = mStream_->getChannelCount();\n  streamMaxBufferSizeInFrames_ = mStream_->getBufferSizeInFrames();\n\n  return Result<NoneType, std::string>::Ok(None);\n}\n\n/// @brief prepares and starts the audio recording process.\n/// If audio stream is opened correctly, it will set up any output configured\n/// (file writing, callback, adapter node) and start the stream.\n/// This method should be called from the JS thread only.\n/// NOTE: I've noticed some possibly invalid file paths being returned on Android,\n/// RN side requires their \"file://\" prefix, but sometimes it returned raw path.\n/// Most likely this was due to alpha version mistakes, but in case of problems leaving this here. (ㆆ _ ㆆ)\n/// @returns On success, returns the file URI where the recording is being saved (if file output is enabled).\nResult<NoneType, std::string> AndroidAudioRecorder::start(const std::string &fileNameOverride) {\n  std::scoped_lock startLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);\n\n  if (!isIdle()) {\n    return Result<NoneType, std::string>::Err(\"Recorder is already recording\");\n  }\n\n  auto streamResult = openAudioStream();\n\n  if (!streamResult.is_ok()) {\n    return Result<NoneType, std::string>::Err(streamResult.unwrap_err());\n  }\n\n  if (mStream_ == nullptr) {\n    return Result<NoneType, std::string>::Err(\"Audio stream is not initialized.\");\n  }\n\n  if (wantsFileOutput()) {\n    recordingSegmentPaths_.clear();\n    auto writerResult = setupFileWriter(fileProperties_, fileNameOverride);\n    if (!writerResult.is_ok()) {\n      return writerResult;\n    }\n    __android_log_print(\n        ANDROID_LOG_INFO,\n        \"AndroidAudioRecorder\",\n        \"File created successfully at path: %s\",\n        filePath_.c_str());\n  }\n\n  if (wantsCallback()) {\n    if (dataCallback_ == nullptr) {\n      return Result<NoneType, std::string>::Err(\"Callback output is unavailable.\");\n    }\n\n    dataCallback_->setOnErrorCallback(errorCallbackId_.load(std::memory_order_acquire));\n    std::static_pointer_cast<AndroidRecorderCallback>(dataCallback_)\n        ->prepare(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);\n    callbackOutputConfigured_.store(true, std::memory_order_release);\n  }\n\n  if (wantsConnection() && adapterNode_ != nullptr) {\n    deinterleavingBuffer_ = std::make_shared<AudioBuffer>(\n        streamMaxBufferSizeInFrames_, streamChannelCount_, streamSampleRate_);\n    adapterNode_->init(streamMaxBufferSizeInFrames_, streamChannelCount_, streamSampleRate_);\n    connectedConfigured_.store(true, std::memory_order_release);\n  }\n\n  auto result = mStream_->requestStart();\n\n  if (result != oboe::Result::OK) {\n    return Result<NoneType, std::string>::Err(\n        \"Failed to start stream: \" + std::string(oboe::convertToText(result)));\n  }\n\n  state_.store(RecorderState::Recording, std::memory_order_release);\n  return Result<NoneType, std::string>::Ok(None);\n}\n\n/// @brief Stops the audio stream and finalizes any output (file writing, callback, adapter node).\n/// This method should be called from the JS thread only.\n/// @returns On success, returns the file URI, size in MB and duration in seconds of the recorded file (if file output is enabled).\n/// NOTE: due to the file access nature on Android, the size might sometimes be zeroed (really long files).\nResult<std::tuple<std::vector<std::string>, double, double>, std::string>\nAndroidAudioRecorder::stop() {\n  std::shared_ptr<AudioFileWriter> fileWriter;\n  std::shared_ptr<AudioRecorderCallback> dataCallback;\n  std::shared_ptr<RecorderAdapterNode> adapterNode;\n  std::vector<std::string> outputPaths;\n\n  double outputFileSize = 0.0;\n  double outputDuration = 0.0;\n  bool hadFileOutput = false;\n\n  {\n    std::scoped_lock stopLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);\n\n    if (isIdle()) {\n      return Result<std::tuple<std::vector<std::string>, double, double>, std::string>::Err(\n          \"Recorder is not in recording state.\");\n    }\n\n    if (mStream_ == nullptr) {\n      return Result<std::tuple<std::vector<std::string>, double, double>, std::string>::Err(\n          \"Audio stream is not initialized.\");\n    }\n\n    state_.store(RecorderState::Idle, std::memory_order_release);\n    mStream_->requestStop();\n\n    hadFileOutput = usesFileOutput();\n\n    if (hadFileOutput) {\n      fileOutputConfigured_.store(false, std::memory_order_release);\n      fileWriter = std::move(fileWriter_);\n    }\n\n    if (usesCallback()) {\n      callbackOutputConfigured_.store(false, std::memory_order_release);\n      dataCallback = std::move(dataCallback_);\n    }\n\n    if (isConnected()) {\n      connectedConfigured_.store(false, std::memory_order_release);\n      adapterNode = std::move(adapterNode_);\n    }\n  }\n\n  for (const auto &raw : recordingSegmentPaths_) {\n    if (!raw.empty()) {\n      outputPaths.push_back(std::format(\"file://{}\", raw));\n    }\n  }\n  if (hadFileOutput && outputPaths.empty() && !filePath_.empty()) {\n    outputPaths.push_back(std::format(\"file://{}\", filePath_));\n  }\n\n  recordingSegmentPaths_.clear();\n  filePath_ = \"\";\n\n  if (fileWriter != nullptr) {\n    auto fileResult = fileWriter->closeFile();\n\n    if (!fileResult.is_ok()) {\n      return Result<std::tuple<std::vector<std::string>, double, double>, std::string>::Err(\n          \"Failed to close file: \" + fileResult.unwrap_err());\n    }\n\n    outputFileSize = std::get<0>(fileResult.unwrap());\n    outputDuration = std::get<1>(fileResult.unwrap());\n  }\n\n  if (dataCallback != nullptr) {\n    dataCallback->cleanup();\n  }\n\n  if (adapterNode != nullptr) {\n    adapterNode->adapterCleanup();\n  }\n\n  return Result<std::tuple<std::vector<std::string>, double, double>, std::string>::Ok(\n      std::make_tuple(std::move(outputPaths), outputFileSize, outputDuration));\n}\n\n/// @brief Enables file output for the recorder with the specified properties.\n/// If the recorder is already active, it will prepare and open the file for writing immediately.\n/// Due to the nature of RN this might be called multiple times during recording session (especially during development),\n/// thus the requirement of handling the \"already active\" case.\n/// This method should be called from the JS thread only.\n/// @param properties Properties defining the audio file format and encoding options.\n/// @returns On success, returns the file URI where the recording is being saved, otherwise returns an error message.\nResult<NoneType, std::string> AndroidAudioRecorder::enableFileOutput(\n    std::shared_ptr<AudioFileProperties> properties) {\n  std::scoped_lock fileWriterLock(fileWriterMutex_);\n  fileProperties_ = properties;\n  fileOutputEnabled_.store(true, std::memory_order_release);\n  fileOutputConfigured_.store(false, std::memory_order_release);\n\n  if (!isIdle()) {\n    auto writerResult = setupFileWriter(properties);\n    if (!writerResult.is_ok()) {\n      fileOutputEnabled_.store(false, std::memory_order_release);\n      return writerResult;\n    }\n  }\n\n  return Result<NoneType, std::string>::Ok(None);\n}\n\nstd::shared_ptr<AudioFileWriter> AndroidAudioRecorder::createFileWriter(\n    const std::shared_ptr<AudioFileProperties> &props) {\n  if (props->format == AudioFileProperties::Format::WAV) {\n    return std::make_shared<MiniAudioFileWriter>(\n        audioEventHandlerRegistry_,\n        props,\n        streamSampleRate_,\n        streamChannelCount_,\n        streamMaxBufferSizeInFrames_);\n  }\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n  return std::make_shared<android::ffmpeg::FFmpegAudioFileWriter>(\n      audioEventHandlerRegistry_,\n      props,\n      streamSampleRate_,\n      streamChannelCount_,\n      streamMaxBufferSizeInFrames_);\n#else\n  return nullptr;\n#endif\n}\n\nResult<NoneType, std::string> AndroidAudioRecorder::setupFileWriter(\n    const std::shared_ptr<AudioFileProperties> &properties,\n    const std::string &fileNameOverride) {\n#if RN_AUDIO_API_FFMPEG_DISABLED\n  if (properties->format != AudioFileProperties::Format::WAV) {\n    return Result<NoneType, std::string>::Err(\n        \"FFmpeg backend is disabled. Cannot create file writer for the requested format. Use WAV format instead.\");\n  }\n#endif\n\n  if (properties->rotateIntervalBytes > 0) {\n    fileWriter_ = std::make_shared<AndroidRotatingFileWriter>(\n        audioEventHandlerRegistry_,\n        properties,\n        properties->rotateIntervalBytes,\n        [this](const std::shared_ptr<AudioFileProperties> &p) { return createFileWriter(p); },\n        [this](const std::string &path) {\n          if (!path.empty()) {\n            recordingSegmentPaths_.push_back(path);\n          }\n        });\n  } else {\n    fileWriter_ = createFileWriter(properties);\n  }\n\n  fileWriter_->setOnErrorCallback(errorCallbackId_.load(std::memory_order_acquire));\n\n  auto backend = std::static_pointer_cast<AndroidFileWriterBackend>(fileWriter_);\n  auto fileResult = backend->openFile(\n      streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_, fileNameOverride);\n\n  if (!fileResult.is_ok()) {\n    fileOutputConfigured_.store(false, std::memory_order_release);\n    fileWriter_ = nullptr;\n    return Result<NoneType, std::string>::Err(\n        \"Failed to open file for writing: \" + fileResult.unwrap_err());\n  }\n\n  filePath_ = fileResult.unwrap();\n  if (properties->rotateIntervalBytes == 0) {\n    recordingSegmentPaths_.push_back(filePath_);\n  }\n  fileOutputConfigured_.store(true, std::memory_order_release);\n  return Result<NoneType, std::string>::Ok(None);\n}\n\n/// @brief Disables file output for the recorder.\n/// If the recorder is currently active, it will finalize and close the file immediately.\n/// This method should be called from the JS thread only.\nvoid AndroidAudioRecorder::disableFileOutput() {\n  std::shared_ptr<AudioFileWriter> fileWriter;\n  {\n    std::scoped_lock fileWriterLock(fileWriterMutex_);\n    fileOutputConfigured_.store(false, std::memory_order_release);\n    fileOutputEnabled_.store(false, std::memory_order_release);\n    fileWriter = std::move(fileWriter_);\n  }\n\n  if (fileWriter != nullptr) {\n    fileWriter->closeFile();\n  }\n}\n\n/// @brief Pauses the audio recording stream.\n/// For session without active file output, this method acts same as stop().\n/// This method should be called from the JS thread only.\nvoid AndroidAudioRecorder::pause() {\n  if (!isRecording()) {\n    return;\n  }\n\n  mStream_->pause(0);\n  state_.store(RecorderState::Paused, std::memory_order_release);\n}\n\n/// @brief Resumes the audio recording stream if it was previously paused.\n/// This method should be called from the JS thread only.\nvoid AndroidAudioRecorder::resume() {\n  if (!isPaused()) {\n    return;\n  }\n\n  mStream_->start(0);\n  state_.store(RecorderState::Recording, std::memory_order_release);\n}\n\n/// @brief Sets the callback to be invoked when audio data is ready.\n/// If the recorder is already active, it will prepare the callback for receiving audio data immediately.\n/// This method should be called from the JS thread only.\n/// @param sampleRate Desired sample rate for the callback audio data.\n/// @param bufferLength Desired buffer length in frames for the callback audio data.\n/// @param channelCount Number of channels for the callback audio data.\n/// @param callbackId Identifier for the JS callback to be invoked.\n/// @returns Success status or Error status with message.\nResult<NoneType, std::string> AndroidAudioRecorder::setOnAudioReadyCallback(\n    float sampleRate,\n    size_t bufferLength,\n    int channelCount,\n    uint64_t callbackId) {\n  std::scoped_lock callbackLock(callbackMutex_, errorCallbackMutex_);\n  dataCallback_ = std::make_shared<AndroidRecorderCallback>(\n      audioEventHandlerRegistry_, sampleRate, bufferLength, channelCount, callbackId);\n  dataCallback_->setOnErrorCallback(errorCallbackId_.load(std::memory_order_acquire));\n  callbackOutputEnabled_.store(true, std::memory_order_release);\n  callbackOutputConfigured_.store(false, std::memory_order_release);\n\n  if (!isIdle()) {\n    std::static_pointer_cast<AndroidRecorderCallback>(dataCallback_)\n        ->prepare(streamSampleRate_, streamChannelCount_, streamMaxBufferSizeInFrames_);\n    callbackOutputConfigured_.store(true, std::memory_order_release);\n  }\n\n  return Result<NoneType, std::string>::Ok(None);\n}\n\n/// @brief Clears the audio data callback.\n/// If the recorder is currently active, it will stop invoking the callback immediately.\n/// This method should be called from the JS thread only.\nvoid AndroidAudioRecorder::clearOnAudioReadyCallback() {\n  std::scoped_lock callbackLock(callbackMutex_);\n  callbackOutputConfigured_.store(false, std::memory_order_release);\n  callbackOutputEnabled_.store(false, std::memory_order_release);\n  dataCallback_ = nullptr;\n}\n\n/// @brief Connects a RecorderAdapterNode to the recorder for audio data routing.\n/// If the recorder is already active, it will initialize the adapter node immediately.\n/// This method should be called from the JS thread only.\n/// @param node Shared pointer to the RecorderAdapterNode to connect.\nvoid AndroidAudioRecorder::connect(const std::shared_ptr<RecorderAdapterNode> &node) {\n  std::scoped_lock adapterLock(adapterNodeMutex_);\n  adapterNode_ = node;\n  isConnected_.store(true, std::memory_order_release);\n  connectedConfigured_.store(false, std::memory_order_release);\n\n  if (!isIdle()) {\n    deinterleavingBuffer_ = std::make_shared<AudioBuffer>(\n        streamMaxBufferSizeInFrames_, streamChannelCount_, streamSampleRate_);\n    adapterNode_->init(streamMaxBufferSizeInFrames_, streamChannelCount_, streamSampleRate_);\n    connectedConfigured_.store(true, std::memory_order_release);\n  }\n}\n\n/// @brief Disconnects the currently connected RecorderAdapterNode from the recorder.\n/// If the recorder is currently active, it will stop routing audio data immediately.\n/// This method should be called from the JS thread only.\nvoid AndroidAudioRecorder::disconnect() {\n  std::shared_ptr<RecorderAdapterNode> adapterNode;\n  bool hadConnection = false;\n  {\n    std::scoped_lock adapterLock(adapterNodeMutex_);\n    hadConnection = isConnected();\n    connectedConfigured_.store(false, std::memory_order_release);\n    isConnected_.store(false, std::memory_order_release);\n    deinterleavingBuffer_ = nullptr;\n    adapterNode = std::move(adapterNode_);\n  }\n\n  if (hadConnection && adapterNode != nullptr) {\n    adapterNode->adapterCleanup();\n  }\n}\n\n/// @brief onAudioReady callback that is invoked by the Oboe stream when new audio data is available.\n/// This method runs on the audio thread.\n/// It routes the audio data to the enabled outputs: file writer, callback, and adapter node.\n/// For safety measures (check note about RN of enableFileOutput), each output is protected by a lock\n/// additionally to the enabled checks.\n/// @param oboeStream Pointer to the Oboe audio stream.\n/// @param audioData Pointer to the audio data buffer (interleaved float samples).\n/// @param numFrames Number of audio frames in the data buffer.\n/// @returns DataCallbackResult indicating whether to continue or stop the stream.\noboe::DataCallbackResult AndroidAudioRecorder::onAudioReady(\n    oboe::AudioStream *oboeStream,\n    void *audioData,\n    int32_t numFrames) {\n  if (isPaused()) {\n    return oboe::DataCallbackResult::Continue;\n  }\n\n  if (usesFileOutput()) {\n    if (auto fileWriterLock = Locker::tryLock(fileWriterMutex_)) {\n      auto fileWriter = fileWriter_;\n      if (usesFileOutput() && fileWriter != nullptr) {\n        fileWriter->writeAudioData(audioData, numFrames);\n      }\n    }\n  }\n\n  if (usesCallback()) {\n    if (auto callbackLock = Locker::tryLock(callbackMutex_)) {\n      auto dataCallback = std::static_pointer_cast<AndroidRecorderCallback>(dataCallback_);\n      if (usesCallback() && dataCallback != nullptr) {\n        dataCallback->receiveAudioData(audioData, numFrames);\n      }\n    }\n  }\n\n  if (isConnected()) {\n    if (auto adapterLock = Locker::tryLock(adapterNodeMutex_)) {\n      auto adapterNode = adapterNode_;\n      auto deinterleavingBuffer = deinterleavingBuffer_;\n      if (!isConnected() || adapterNode == nullptr || deinterleavingBuffer == nullptr) {\n        return oboe::DataCallbackResult::Continue;\n      }\n\n      auto const data = static_cast<float *>(audioData);\n      deinterleavingBuffer->deinterleaveFrom(data, numFrames);\n\n      for (size_t ch = 0; ch < streamChannelCount_; ++ch) {\n        adapterNode->buff_[ch]->write(*deinterleavingBuffer->getChannel(ch), numFrames);\n      }\n    }\n  }\n\n  return oboe::DataCallbackResult::Continue;\n}\n\nbool AndroidAudioRecorder::isRecording() const {\n  return state_.load(std::memory_order_acquire) == RecorderState::Recording &&\n      mStream_->getState() == oboe::StreamState::Started;\n}\n\nbool AndroidAudioRecorder::isPaused() const {\n  return state_.load(std::memory_order_acquire) == RecorderState::Paused;\n}\n\nbool AndroidAudioRecorder::isIdle() const {\n  return state_.load(std::memory_order_acquire) == RecorderState::Idle;\n}\n\nvoid AndroidAudioRecorder::cleanup() {\n  state_.store(RecorderState::Idle, std::memory_order_release);\n\n  if (mStream_ != nullptr) {\n    mStream_->close();\n    mStream_.reset();\n  }\n}\n\n/// @brief onError callback that is invoked by the Oboe stream when an error occurs.\n/// This method runs on the audio thread.\n/// If the error is a disconnection, it attempts to reopen the stream and resume recording.\n/// @param oboeStream Pointer to the Oboe audio stream.\n/// @param error The oboe::Result error code.\nvoid AndroidAudioRecorder::onErrorAfterClose(oboe::AudioStream *stream, oboe::Result error) {\n  if (error == oboe::Result::ErrorDisconnected) {\n    cleanup();\n\n    auto streamResult = openAudioStream();\n\n    if (!streamResult.is_ok()) {\n      uint64_t callbackId = errorCallbackId_.load(std::memory_order_acquire);\n\n      if (audioEventHandlerRegistry_ == nullptr || callbackId == 0) {\n        return;\n      }\n\n      std::string message = \"Android recorder error: \" + streamResult.unwrap_err();\n      std::unordered_map<std::string, EventValue> eventPayload{{\"message\", std::move(message)}};\n      audioEventHandlerRegistry_->invokeHandlerWithEventBody(\n          AudioEvent::RECORDER_ERROR, callbackId, eventPayload);\n      return;\n    }\n\n    mStream_->requestStart();\n    state_.store(RecorderState::Recording, std::memory_order_release);\n  }\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/AndroidAudioRecorder.h",
    "content": "#pragma once\n\n#include <audioapi/android/core/NativeAudioRecorder.hpp>\n#include <audioapi/core/inputs/AudioRecorder.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/Result.hpp>\n#include <oboe/Oboe.h>\n#include <memory>\n#include <string>\n#include <vector>\n\nnamespace audioapi {\n\nclass AudioFileProperties;\nclass AndroidRecorderCallback;\nclass AndroidFileWriterBackend;\nclass AudioEventHandlerRegistry;\n\nclass AndroidAudioRecorder : public oboe::AudioStreamCallback, public AudioRecorder {\n public:\n  explicit AndroidAudioRecorder(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);\n  ~AndroidAudioRecorder() override;\n  void cleanup();\n\n  Result<NoneType, std::string> start(const std::string &fileNameOverride) override;\n  Result<std::tuple<std::vector<std::string>, double, double>, std::string> stop() override;\n\n  Result<NoneType, std::string> enableFileOutput(\n      std::shared_ptr<AudioFileProperties> properties) override;\n  void disableFileOutput() override;\n\n  void pause() override;\n  void resume() override;\n  bool isRecording() const override;\n  bool isPaused() const override;\n  bool isIdle() const override;\n\n  Result<NoneType, std::string> setOnAudioReadyCallback(\n      float sampleRate,\n      size_t bufferLength,\n      int channelCount,\n      uint64_t callbackId) override;\n  void clearOnAudioReadyCallback() override;\n\n  void connect(const std::shared_ptr<RecorderAdapterNode> &node) override;\n  void disconnect() override;\n\n  oboe::DataCallbackResult\n  onAudioReady(oboe::AudioStream *oboeStream, void *audioData, int32_t numFrames) override;\n  void onErrorAfterClose(oboe::AudioStream *oboeStream, oboe::Result error) override;\n\n private:\n  std::shared_ptr<AudioBuffer> deinterleavingBuffer_;\n\n  float streamSampleRate_;\n  int32_t streamChannelCount_;\n  int32_t streamMaxBufferSizeInFrames_;\n\n  facebook::jni::global_ref<NativeAudioRecorder> nativeAudioRecorder_;\n\n  std::shared_ptr<oboe::AudioStream> mStream_;\n  std::vector<std::string> recordingSegmentPaths_;\n  Result<NoneType, std::string> openAudioStream();\n  std::shared_ptr<AudioFileWriter> createFileWriter(\n      const std::shared_ptr<AudioFileProperties> &props);\n  Result<NoneType, std::string> setupFileWriter(\n      const std::shared_ptr<AudioFileProperties> &properties,\n      const std::string &fileNameOverride = \"\");\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/AudioPlayer.cpp",
    "content": "#include <android/log.h>\n#include <audioapi/android/core/AudioPlayer.h>\n#include <audioapi/core/AudioContext.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <jni.h>\n\n#include <algorithm>\n#include <memory>\n\nnamespace audioapi {\n\nAudioPlayer::AudioPlayer(\n    const std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> &renderAudio,\n    float sampleRate,\n    int channelCount)\n    : renderAudio_(renderAudio),\n      sampleRate_(sampleRate),\n      channelCount_(channelCount),\n      isRunning_(false) {\n  isInitialized_ = openAudioStream();\n}\n\nbool AudioPlayer::openAudioStream() {\n  AudioStreamBuilder builder;\n\n  builder.setSharingMode(SharingMode::Exclusive)\n      ->setFormat(AudioFormat::Float)\n      ->setFormatConversionAllowed(true)\n      ->setPerformanceMode(PerformanceMode::None)\n      ->setChannelCount(channelCount_)\n      ->setSampleRateConversionQuality(SampleRateConversionQuality::Medium)\n      ->setFramesPerDataCallback(RENDER_QUANTUM_SIZE)\n      ->setDataCallback(this)\n      ->setSampleRate(static_cast<int>(sampleRate_))\n      ->setErrorCallback(this);\n\n  auto result = builder.openStream(mStream_);\n  if (result != oboe::Result::OK || mStream_ == nullptr) {\n    __android_log_print(\n        ANDROID_LOG_ERROR, \"AudioPlayer\", \"Failed to open stream: %s\", oboe::convertToText(result));\n    return false;\n  }\n\n  buffer_ = std::make_shared<DSPAudioBuffer>(RENDER_QUANTUM_SIZE, channelCount_, sampleRate_);\n  return true;\n}\n\nbool AudioPlayer::start() {\n  if (mStream_ != nullptr) {\n    auto result = mStream_->requestStart() == oboe::Result::OK;\n    isRunning_.store(result, std::memory_order_release);\n    return result;\n  }\n\n  return false;\n}\n\nvoid AudioPlayer::stop() {\n  if (mStream_ != nullptr) {\n    isRunning_.store(false, std::memory_order_release);\n    mStream_->requestStop();\n  }\n}\n\nbool AudioPlayer::resume() {\n  if (isRunning()) {\n    return true;\n  }\n\n  if (mStream_ != nullptr) {\n    auto result = mStream_->requestStart() == oboe::Result::OK;\n    isRunning_.store(result, std::memory_order_release);\n    return result;\n  }\n\n  return false;\n}\n\nvoid AudioPlayer::suspend() {\n  if (mStream_ != nullptr) {\n    isRunning_.store(false, std::memory_order_release);\n    mStream_->requestPause();\n  }\n}\n\nvoid AudioPlayer::cleanup() {\n  isInitialized_ = false;\n\n  if (mStream_ != nullptr) {\n    mStream_->close();\n    mStream_.reset();\n  }\n}\n\nbool AudioPlayer::isRunning() const {\n  return mStream_ && mStream_->getState() == oboe::StreamState::Started &&\n      isRunning_.load(std::memory_order_acquire);\n}\n\nDataCallbackResult\nAudioPlayer::onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames) {\n  if (!isInitialized_) {\n    return DataCallbackResult::Continue;\n  }\n\n  auto buffer = static_cast<float *>(audioData);\n  int processedFrames = 0;\n\n  while (processedFrames < numFrames) {\n    auto framesToProcess = std::min(numFrames - processedFrames, RENDER_QUANTUM_SIZE);\n\n    if (isRunning_.load(std::memory_order_acquire)) {\n      renderAudio_(buffer_, framesToProcess);\n    } else {\n      buffer_->zero();\n    }\n\n    float *destination = buffer + (processedFrames * channelCount_);\n\n    buffer_->interleaveTo(destination, framesToProcess);\n    processedFrames += framesToProcess;\n  }\n\n  return DataCallbackResult::Continue;\n}\n\nvoid AudioPlayer::onErrorAfterClose(oboe::AudioStream *stream, oboe::Result error) {\n  if (error == oboe::Result::ErrorDisconnected) {\n    cleanup();\n    if (openAudioStream()) {\n      isInitialized_ = true;\n      resume();\n    }\n  }\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/AudioPlayer.h",
    "content": "#pragma once\n\n#include <oboe/Oboe.h>\n#include <cassert>\n#include <functional>\n#include <memory>\n\n#include <audioapi/android/core/NativeAudioPlayer.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n\nnamespace audioapi {\n\nusing namespace oboe;\n\nclass AudioContext;\n\nclass AudioPlayer : public AudioStreamDataCallback, AudioStreamErrorCallback {\n public:\n  AudioPlayer(\n      const std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> &renderAudio,\n      float sampleRate,\n      int channelCount);\n\n  ~AudioPlayer() override {\n    nativeAudioPlayer_.release();\n    cleanup();\n  }\n\n  bool start();\n  void stop();\n  bool resume();\n  void suspend();\n  void cleanup();\n\n  [[nodiscard]] bool isRunning() const;\n\n  DataCallbackResult onAudioReady(AudioStream *oboeStream, void *audioData, int32_t numFrames)\n      override;\n\n  void onErrorAfterClose(AudioStream * /* audioStream */, Result /* error */) override;\n\n private:\n  std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> renderAudio_;\n  std::shared_ptr<AudioStream> mStream_;\n  std::shared_ptr<DSPAudioBuffer> buffer_;\n  bool isInitialized_ = false;\n  float sampleRate_;\n  int channelCount_;\n  std::atomic<bool> isRunning_;\n\n  bool openAudioStream();\n\n  facebook::jni::global_ref<NativeAudioPlayer> nativeAudioPlayer_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/NativeAudioPlayer.hpp",
    "content": "#pragma once\n\n#include <fbjni/fbjni.h>\n\nnamespace audioapi {\n\nusing namespace facebook;\n\nclass NativeAudioPlayer : public jni::JavaClass<NativeAudioPlayer> {\n public:\n  static auto constexpr kJavaDescriptor = \"Lcom/swmansion/audioapi/core/NativeAudioPlayer;\";\n\n  static jni::local_ref<NativeAudioPlayer> create() {\n    return newInstance();\n  }\n\n  void start() {\n    static const auto method = javaClassStatic()->getMethod<void()>(\"start\");\n    method(self());\n  }\n\n  void stop() {\n    static const auto method = javaClassStatic()->getMethod<void()>(\"stop\");\n    method(self());\n  }\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/NativeAudioRecorder.hpp",
    "content": "#pragma once\n\n#include <fbjni/fbjni.h>\n\nnamespace audioapi {\n\nusing namespace facebook;\n\nclass NativeAudioRecorder : public jni::JavaClass<NativeAudioRecorder> {\n public:\n  static auto constexpr kJavaDescriptor = \"Lcom/swmansion/audioapi/core/NativeAudioRecorder;\";\n\n  static jni::local_ref<NativeAudioRecorder> create() {\n    return newInstance();\n  }\n\n  void start() {\n    static const auto method = javaClassStatic()->getMethod<void()>(\"start\");\n    method(self());\n  }\n\n  void stop() {\n    static const auto method = javaClassStatic()->getMethod<void()>(\"stop\");\n    method(self());\n  }\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/AndroidFileWriterBackend.cpp",
    "content": "#include <audioapi/android/core/utils/AndroidFileWriterBackend.h>\n\n#include <memory>\n\nnamespace audioapi {\nAndroidFileWriterBackend::AndroidFileWriterBackend(\n    const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    const std::shared_ptr<AudioFileProperties> &fileProperties)\n    : AudioFileWriter(audioEventHandlerRegistry, fileProperties) {\n\n  auto offloaderLambda = [this](WriterData data) {\n    taskOffloaderFunction(data);\n  };\n  offloader_ = std::make_unique<task_offloader::TaskOffloader<\n      WriterData,\n      FILE_WRITER_SPSC_OVERFLOW_STRATEGY,\n      FILE_WRITER_SPSC_WAIT_STRATEGY>>(FILE_WRITER_CHANNEL_CAPACITY, offloaderLambda);\n}\n\nvoid AndroidFileWriterBackend::writeAudioData(void *data, int numFrames) {\n  offloader_->getSender()->send({.data = data, .numFrames = numFrames});\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/AndroidFileWriterBackend.h",
    "content": "#pragma once\n\n#include <audioapi/core/utils/AudioFileWriter.h>\n#include <audioapi/utils/Result.hpp>\n#include <audioapi/utils/SpscChannel.hpp>\n#include <audioapi/utils/TaskOffloader.hpp>\n#include <memory>\n#include <string>\n\nstruct WriterData {\n  void *data;\n  int numFrames;\n};\n\nnamespace audioapi {\n\nclass AudioFileProperties;\n\nclass AndroidFileWriterBackend : public AudioFileWriter {\n public:\n  explicit AndroidFileWriterBackend(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const std::shared_ptr<AudioFileProperties> &fileProperties);\n\n  void writeAudioData(AudioDataType data, int numFrames) override;\n\n  std::string getFilePath() const override {\n    return filePath_;\n  }\n  double getCurrentDuration() const override {\n    return static_cast<double>(framesWritten_.load(std::memory_order_acquire)) / streamSampleRate_;\n  }\n  size_t getFileSizeBytes() const override {\n    return 0;\n  }\n\n  virtual OpenFileResult openFile(\n      float streamSampleRate,\n      int32_t streamChannelCount,\n      int32_t streamMaxBufferSize,\n      const std::string &fileNameOverride) = 0;\n  virtual void taskOffloaderFunction(WriterData data) = 0;\n\n protected:\n  float streamSampleRate_;\n  int32_t streamChannelCount_;\n  int32_t streamMaxBufferSize_;\n  std::string filePath_;\n\n  // delay initialization of offloader until prepare is called\n  std::unique_ptr<task_offloader::TaskOffloader<\n      WriterData,\n      FILE_WRITER_SPSC_OVERFLOW_STRATEGY,\n      FILE_WRITER_SPSC_WAIT_STRATEGY>>\n      offloader_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.cpp",
    "content": "#include <android/log.h>\n#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/android/core/utils/AndroidRecorderCallback.h>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <audioapi/libs/miniaudio/miniaudio.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/CircularArray.hpp>\n\n#include <algorithm>\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <utility>\n\nnamespace audioapi {\n\n/// @brief Constructor\n/// Allocates circular buffer (as every property to do so is already known at this point).\n/// @param audioEventHandlerRegistry The audio event handler registry\n/// @param sampleRate The user desired sample rate\n/// @param bufferLength The user desired buffer length\n/// @param channelCount The user desired channel count\n/// @param callbackId The callback identifier\nAndroidRecorderCallback::AndroidRecorderCallback(\n    const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    float sampleRate,\n    size_t bufferLength,\n    int channelCount,\n    uint64_t callbackId)\n    : AudioRecorderCallback(\n          audioEventHandlerRegistry,\n          sampleRate,\n          bufferLength,\n          channelCount,\n          callbackId) {}\n\nAndroidRecorderCallback::~AndroidRecorderCallback() {\n  if (converter_ != nullptr) {\n    ma_data_converter_uninit(converter_.get(), nullptr);\n    converter_.reset();\n  }\n\n  if (processingBuffer_ != nullptr) {\n    ma_free(processingBuffer_, nullptr);\n    processingBuffer_ = nullptr;\n    processingBufferLength_ = 0;\n  }\n\n  for (size_t i = 0; i < circularBuffer_.size(); ++i) {\n    circularBuffer_[i]->zero();\n  }\n}\n\n/// @brief Prepares the recorder callback by initializing the data converter and allocating necessary buffers.\n/// @param streamSampleRate The sample rate of the incoming audio stream.\n/// @param streamChannelCount The channel count of the incoming audio stream.\n/// @param maxInputBufferLength The maximum buffer length of the incoming audio stream.\nResult<NoneType, std::string> AndroidRecorderCallback::prepare(\n    float streamSampleRate,\n    int32_t streamChannelCount,\n    size_t maxInputBufferLength) {\n  ma_result result;\n\n  streamSampleRate_ = streamSampleRate;\n  streamChannelCount_ = streamChannelCount;\n  maxInputBufferLength_ = maxInputBufferLength;\n\n  ma_data_converter_config converterConfig = ma_data_converter_config_init(\n      ma_format_f32,\n      ma_format_f32,\n      streamChannelCount_,\n      channelCount_,\n      streamSampleRate_,\n      static_cast<int32_t>(sampleRate_));\n\n  converter_ = std::make_unique<ma_data_converter>();\n  result = ma_data_converter_init(&converterConfig, nullptr, converter_.get());\n\n  if (result != MA_SUCCESS) {\n    return Result<NoneType, std::string>::Err(\n        \"Failed to initialize miniaudio data converter\" +\n        std::string(ma_result_description(result)));\n  }\n\n  if (streamSampleRate_ <= 0 || streamChannelCount_ <= 0) {\n    return Result<NoneType, std::string>::Err(\"Invalid stream sample rate or channel count\");\n  }\n\n  if (sampleRate_ <= 0 || channelCount_ <= 0) {\n    return Result<NoneType, std::string>::Err(\"Invalid callback sample rate or channel count\");\n  }\n\n  ma_data_converter_get_expected_output_frame_count(\n      converter_.get(), maxInputBufferLength_, &processingBufferLength_);\n\n  processingBufferLength_ = std::max(processingBufferLength_, (ma_uint64)maxInputBufferLength_);\n\n  deinterleavingBuffer_ =\n      std::make_shared<AudioBuffer>(processingBufferLength_, channelCount_, sampleRate_);\n  processingBuffer_ = ma_malloc(\n      processingBufferLength_ * channelCount_ * ma_get_bytes_per_sample(ma_format_f32), nullptr);\n\n  auto offloaderLambda = [this](CallbackData data) {\n    taskOffloaderFunction(data);\n  };\n  offloader_ = std::make_unique<task_offloader::TaskOffloader<\n      CallbackData,\n      RECORDER_CALLBACK_SPSC_OVERFLOW_STRATEGY,\n      RECORDER_CALLBACK_SPSC_WAIT_STRATEGY>>(RECORDER_CALLBACK_CHANNEL_CAPACITY, offloaderLambda);\n  return Result<NoneType, std::string>::Ok(None);\n}\n\nvoid AndroidRecorderCallback::cleanup() {\n  if (circularBuffer_[0]->getNumberOfAvailableFrames() > 0) {\n    emitAudioData(true);\n  }\n\n  if (converter_ != nullptr) {\n    ma_data_converter_uninit(converter_.get(), nullptr);\n    converter_.reset();\n  }\n\n  if (processingBuffer_ != nullptr) {\n    ma_free(processingBuffer_, nullptr);\n    processingBuffer_ = nullptr;\n    processingBufferLength_ = 0;\n  }\n\n  for (size_t i = 0; i < circularBuffer_.size(); ++i) {\n    circularBuffer_[i]->zero();\n  }\n  offloader_.reset();\n}\n\n/// @brief Receives audio data from the recorder, processes it (resampling and deinterleaving if necessary),\n/// and pushes it into the circular buffer.\n/// @param data Pointer to the incoming audio data.\n/// @param numFrames Number of frames in the incoming audio data.\nvoid AndroidRecorderCallback::receiveAudioData(void *data, int numFrames) {\n  if (!isInitialized_.load(std::memory_order_acquire)) {\n    return;\n  }\n\n  offloader_->getSender()->send({data, numFrames});\n}\n\n/// @brief Deinterleaves the audio data and pushes it into the circular buffer.\n/// @param data Pointer to the interleaved audio data.\n/// @param numFrames Number of frames in the audio data.\nvoid AndroidRecorderCallback::deinterleaveAndPushAudioData(void *data, int numFrames) {\n  auto *inputData = static_cast<float *>(data);\n  deinterleavingBuffer_->deinterleaveFrom(inputData, numFrames);\n\n  for (size_t ch = 0; ch < channelCount_; ++ch) {\n    circularBuffer_[ch]->push_back(*deinterleavingBuffer_->getChannel(ch), numFrames);\n  }\n}\n\n/// @brief The handler function for the callback thread. It continuously receives audio data,\n/// processes it (resampling and deinterleaving if necessary), and pushes it into the circular buffer.\nvoid AndroidRecorderCallback::taskOffloaderFunction(CallbackData callbackData) {\n  auto [data, numFrames] = callbackData;\n  ma_uint64 inputFrameCount = numFrames;\n  ma_uint64 outputFrameCount = 0;\n\n  if (static_cast<float>(streamSampleRate_) == sampleRate_ &&\n      streamChannelCount_ == channelCount_) {\n    deinterleaveAndPushAudioData(data, numFrames);\n\n    if (circularBuffer_[0]->getNumberOfAvailableFrames() >= bufferLength_) {\n      emitAudioData();\n    }\n    return;\n  }\n\n  ma_data_converter_get_expected_output_frame_count(\n      converter_.get(), inputFrameCount, &outputFrameCount);\n\n  ma_data_converter_process_pcm_frames(\n      converter_.get(), data, &inputFrameCount, processingBuffer_, &outputFrameCount);\n\n  deinterleaveAndPushAudioData(processingBuffer_, static_cast<int>(outputFrameCount));\n\n  if (circularBuffer_[0]->getNumberOfAvailableFrames() >= bufferLength_) {\n    emitAudioData();\n  }\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/AndroidRecorderCallback.h",
    "content": "#pragma once\n\n#include <audioapi/core/utils/AudioRecorderCallback.h>\n#include <audioapi/libs/miniaudio/miniaudio.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/TaskOffloader.hpp>\n#include <memory>\n#include <string>\n\nnamespace audioapi {\n\nclass AudioEventHandlerRegistry;\n\nstruct CallbackData {\n  void *data;\n  int numFrames;\n};\n\nclass AndroidRecorderCallback : public AudioRecorderCallback {\n public:\n  AndroidRecorderCallback(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      float sampleRate,\n      size_t bufferLength,\n      int channelCount,\n      uint64_t callbackId);\n  ~AndroidRecorderCallback() override;\n\n  Result<NoneType, std::string>\n  prepare(float streamSampleRate, int streamChannelCount, size_t maxInputBufferLength);\n  void cleanup() override;\n\n  void receiveAudioData(void *data, int numFrames);\n\n protected:\n  float streamSampleRate_{0.0};\n  int streamChannelCount_{0};\n  size_t maxInputBufferLength_{0};\n\n  void *processingBuffer_{nullptr};\n  ma_uint64 processingBufferLength_{0};\n  std::unique_ptr<ma_data_converter> converter_{nullptr};\n\n  std::shared_ptr<AudioBuffer> deinterleavingBuffer_;\n\n  void deinterleaveAndPushAudioData(void *data, int numFrames);\n\n private:\n  // delay initialization of offloader until prepare is called\n  std::unique_ptr<task_offloader::TaskOffloader<\n      CallbackData,\n      RECORDER_CALLBACK_SPSC_OVERFLOW_STRATEGY,\n      RECORDER_CALLBACK_SPSC_WAIT_STRATEGY>>\n      offloader_;\n  void taskOffloaderFunction(CallbackData data);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/AndroidRotatingFileWriter.cpp",
    "content": "#include <android/log.h>\n#include <audioapi/android/core/utils/AndroidRotatingFileWriter.h>\n\n#include <audioapi/core/utils/RotatingFileWriter.h>\n#include <memory>\n#include <string>\n#include <utility>\n\nnamespace audioapi {\n\nAndroidRotatingFileWriter::AndroidRotatingFileWriter(\n    const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    const std::shared_ptr<AudioFileProperties> &fileProperties,\n    size_t rotateIntervalBytes,\n    WriterFactory writerFactory,\n    std::function<void(const std::string &)> onSegmentFileOpened)\n    : AndroidFileWriterBackend(audioEventHandlerRegistry, fileProperties),\n      RotatingFileWriter(\n          rotateIntervalBytes,\n          std::move(writerFactory),\n          std::move(onSegmentFileOpened)) {}\n\nOpenFileResult AndroidRotatingFileWriter::openFile(\n    float streamSampleRate,\n    int32_t streamChannelCount,\n    int32_t streamMaxBufferSizeInFrames,\n    const std::string &fileNameOverride) {\n  streamSampleRate_ = streamSampleRate;\n  streamChannelCount_ = streamChannelCount;\n  streamMaxBufferSize_ = streamMaxBufferSizeInFrames;\n  fileProperties_->fileNamePrefix = !fileNameOverride.empty() ? fileNameOverride : \"recording\";\n  if (currentWriter_ == nullptr) {\n    currentWriter_ = writerFactory_(fileProperties_);\n  }\n\n  return openInnerWriter();\n}\n\nCloseFileResult AndroidRotatingFileWriter::closeFile() {\n  return RotatingFileWriter::closeFile();\n}\n\nvoid AndroidRotatingFileWriter::writeAudioData(AudioDataType data, int numFrames) {\n  if (currentWriter_ == nullptr) {\n    return;\n  }\n\n  currentWriter_->writeAudioData(data, numFrames);\n\n  writesSinceLastCheck_++;\n  if (writesSinceLastCheck_ >= FILE_SIZE_CHECK_WRITE_INTERVAL) {\n    writesSinceLastCheck_ = 0;\n    size_t size = currentWriter_->getFileSizeBytes();\n    if (size > rotateIntervalBytes_) {\n      rotateFiles();\n    }\n  }\n  framesWritten_.fetch_add(numFrames, std::memory_order_relaxed);\n}\n\ndouble AndroidRotatingFileWriter::getCurrentDuration() const {\n  return static_cast<double>(framesWritten_.load(std::memory_order_relaxed)) /\n      fileProperties_->sampleRate;\n}\n\nvoid AndroidRotatingFileWriter::rotateFiles() {\n  RotatingFileWriter::rotateFiles();\n  openInnerWriter();\n}\n\nOpenFileResult AndroidRotatingFileWriter::openInnerWriter() {\n  auto inner = std::static_pointer_cast<AndroidFileWriterBackend>(currentWriter_);\n  auto result = inner->openFile(streamSampleRate_, streamChannelCount_, streamMaxBufferSize_, \"\");\n  if (result.is_ok() && onSegmentFileOpened_ && currentWriter_ != nullptr) {\n    onSegmentFileOpened_(currentWriter_->getFilePath());\n  }\n  return result;\n}\n\nvoid AndroidRotatingFileWriter::taskOffloaderFunction(WriterData data) {\n  auto inner = std::static_pointer_cast<AndroidFileWriterBackend>(currentWriter_);\n  inner->taskOffloaderFunction(data);\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/AndroidRotatingFileWriter.h",
    "content": "#pragma once\n\n#include <audioapi/android/core/utils/AndroidFileWriterBackend.h>\n#include <audioapi/core/utils/RotatingFileWriter.h>\n\n#include <cstdint>\n#include <functional>\n#include <memory>\n#include <string>\n\nnamespace audioapi {\n\nclass AndroidRotatingFileWriter : public AndroidFileWriterBackend, public RotatingFileWriter {\n public:\n  using WriterFactory =\n      std::function<std::shared_ptr<AudioFileWriter>(const std::shared_ptr<AudioFileProperties> &)>;\n\n  AndroidRotatingFileWriter(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const std::shared_ptr<AudioFileProperties> &fileProperties,\n      size_t rotateIntervalBytes,\n      WriterFactory writerFactory,\n      std::function<void(const std::string &)> onSegmentFileOpened = {});\n\n  OpenFileResult openFile(\n      float streamSampleRate,\n      int32_t streamChannelCount,\n      int32_t streamMaxBufferSizeInFrames,\n      const std::string &fileNameOverride) override;\n\n  CloseFileResult closeFile() override;\n  [[nodiscard]] double getCurrentDuration() const override;\n  void writeAudioData(AudioDataType data, int numFrames) override;\n\n private:\n  void taskOffloaderFunction(WriterData data) override;\n\n  void rotateFiles() override;\n  OpenFileResult openInnerWriter();\n  float streamSampleRate_;\n  int32_t streamChannelCount_;\n  int32_t streamMaxBufferSize_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/FileOptions.cpp",
    "content": "#include <android/log.h>\n#include <audioapi/android/core/utils/FileOptions.h>\n#include <audioapi/android/system/NativeFileInfo.hpp>\n#include <audioapi/utils/AudioFileProperties.h>\n#include <chrono>\n#include <filesystem>\n#include <format>\n#include <iostream>\n#include <memory>\n#include <string>\n\nnamespace audioapi::android::fileoptions {\n\nResult<NoneType, std::string> createDirectoryIfNotExists(const std::string &directoryPath) {\n  std::error_code ec;\n\n  if (std::filesystem::exists(directoryPath, ec)) {\n    return Result<NoneType, std::string>::Ok(None);\n  }\n\n  bool created = std::filesystem::create_directories(directoryPath, ec);\n\n  if (!created) {\n    return Result<NoneType, std::string>::Err(\"Failed to create directory: \" + directoryPath);\n  }\n\n  if (ec) {\n    return Result<NoneType, std::string>::Err(ec.message());\n  }\n\n  return Result<NoneType, std::string>::Ok(None);\n}\n\nstd::string getTimestampString() {\n  auto tNow = std::chrono::system_clock::now();\n  return std::format(\"{:%Y%m%d_%H%M%S}\", std::chrono::floor<std::chrono::seconds>(tNow));\n}\n\nstd::string getDirectory(const std::shared_ptr<AudioFileProperties> &properties) {\n  switch (properties->directory) {\n    case AudioFileProperties::FileDirectory::Document:\n      return NativeFileInfo::getFilesDir();\n    case AudioFileProperties::FileDirectory::Cache:\n      return NativeFileInfo::getCacheDir();\n    default:\n      return NativeFileInfo::getCacheDir();\n  }\n}\n\nstd::string getFileExtension(const std::shared_ptr<AudioFileProperties> &properties) {\n  switch (properties->format) {\n    case AudioFileProperties::Format::WAV:\n      return \"wav\";\n    case AudioFileProperties::Format::CAF:\n      return \"caf\";\n    case AudioFileProperties::Format::M4A:\n      return \"m4a\";\n    case AudioFileProperties::Format::FLAC:\n      return \"flac\";\n    default:\n      return \"m4a\";\n  }\n}\n\nResult<std::string, std::string> getFilePath(\n    const std::shared_ptr<AudioFileProperties> &properties,\n    const std::string &fileNameOverride) {\n  std::string directory = getDirectory(properties);\n  std::string subDirectory = std::format(\"{}/{}\", directory, properties->subDirectory);\n  std::string fileTimestamp = getTimestampString();\n  std::string extension = getFileExtension(properties);\n\n  auto result = createDirectoryIfNotExists(subDirectory);\n\n  if (!result.is_ok()) {\n    return Result<std::string, std::string>::Err(result.unwrap_err());\n  }\n\n  auto filePath = !fileNameOverride.empty() && properties->rotateIntervalBytes == 0\n      ? std::format(\"{}/{}.{}\", subDirectory, fileNameOverride, extension)\n      : std::format(\n            \"{}/{}_{}.{}\", subDirectory, properties->fileNamePrefix, fileTimestamp, extension);\n\n  return Result<std::string, std::string>::Ok(filePath);\n}\n\n} // namespace audioapi::android::fileoptions\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/FileOptions.h",
    "content": "#pragma once\n\n#include <audioapi/utils/Result.hpp>\n#include <memory>\n#include <string>\n\nnamespace audioapi {\n\nclass AudioFileProperties;\n\nnamespace android::fileoptions {\n\nResult<NoneType, std::string> createDirectoryIfNotExists(const std::string &directoryPath);\nstd::string getTimestampString();\n\nstd::string getDirectory(const std::shared_ptr<AudioFileProperties> &properties);\nstd::string getFileExtension(const std::shared_ptr<AudioFileProperties> &properties);\nResult<std::string, std::string> getFilePath(\n    const std::shared_ptr<AudioFileProperties> &properties,\n    const std::string &fileNameOverride);\n\n} // namespace android::fileoptions\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.cpp",
    "content": "#if !RN_AUDIO_API_FFMPEG_DISABLED\n\nextern \"C\" {\n#include <libavcodec/avcodec.h>\n#include <libavformat/avformat.h>\n#include <libavutil/audio_fifo.h>\n#include <libavutil/opt.h>\n#include <libswresample/swresample.h>\n}\n\n#include <android/log.h>\n#include <audioapi/android/core/utils/AndroidFileWriterBackend.h>\n#include <audioapi/android/core/utils/FileOptions.h>\n#include <audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h>\n#include <audioapi/android/core/utils/ffmpegBackend/ptrs.hpp>\n#include <audioapi/android/core/utils/ffmpegBackend/utils.h>\n#include <audioapi/core/utils/AudioFileWriter.h>\n#include <audioapi/utils/AudioFileProperties.h>\n#include <audioapi/utils/UnitConversion.h>\n\n#include <sys/stat.h>\n#include <algorithm>\n#include <cassert>\n#include <memory>\n#include <string>\n#include <utility>\n\nconstexpr int fallbackFIFOSize = 8192;\nconstexpr int fallbackFrameSize = 512;\nconstexpr int defaultFlushInterval = 100;\n\nnamespace audioapi::android::ffmpeg {\n\nFFmpegAudioFileWriter::FFmpegAudioFileWriter(\n    const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    const std::shared_ptr<AudioFileProperties> &fileProperties,\n    float streamSampleRate,\n    int32_t streamChannelCount,\n    int32_t streamMaxBufferSize)\n    : AndroidFileWriterBackend(audioEventHandlerRegistry, fileProperties) {\n  // Set flush interval from properties, limit minimum to 100ms\n  // to avoid people hurting themselves too much\n  flushIntervalMs_ = std::max(fileProperties_->androidFlushIntervalMs, defaultFlushInterval);\n}\n\nFFmpegAudioFileWriter::~FFmpegAudioFileWriter() {\n  if (isFileOpen()) {\n    closeFile();\n  }\n}\n\n/// @brief Opens a specified audio file for writing and prepares any necessary resources.\n/// such as codecs, conversion buffers or circular AVIO FIFO.\n/// This method should be called from the JS thread only.\n/// @param streamSampleRate The sample rate of the incoming audio stream (aka microphone).\n/// @param streamChannelCount The number of channels in the incoming audio stream.\n/// @param streamMaxBufferSize The estimated maximum buffer size for the incoming audio stream.\n/// @returns Success status with file path or Error status with message.\nOpenFileResult FFmpegAudioFileWriter::openFile(\n    float streamSampleRate,\n    int32_t streamChannelCount,\n    int32_t streamMaxBufferSize,\n    const std::string &fileNameOverride) {\n  streamSampleRate_ = streamSampleRate;\n  streamChannelCount_ = streamChannelCount;\n  streamMaxBufferSize_ = streamMaxBufferSize;\n  framesWritten_.store(0, std::memory_order_release);\n  nextPts_ = 0;\n  auto filePathResult = fileoptions::getFilePath(fileProperties_, fileNameOverride);\n\n  if (!filePathResult.is_ok()) {\n    return OpenFileResult::Err(filePathResult.unwrap_err());\n  }\n\n  filePath_ = filePathResult.unwrap();\n\n  const AVCodec *codec = getCodec(fileProperties_);\n\n  if (!codec) {\n    return OpenFileResult::Err(\"Unsupported codec for the given file format\");\n  }\n\n  auto offloaderLambda = [this](WriterData data) {\n    taskOffloaderFunction(data);\n  };\n\n  offloader_ = std::make_unique<task_offloader::TaskOffloader<\n      WriterData,\n      FILE_WRITER_SPSC_OVERFLOW_STRATEGY,\n      FILE_WRITER_SPSC_WAIT_STRATEGY>>(FILE_WRITER_CHANNEL_CAPACITY, offloaderLambda);\n\n  return initializeFormatContext(codec)\n      .and_then([this, codec](auto) { return configureAndOpenCodec(codec); })\n      .and_then([this](auto) { return initializeStream(); })\n      .and_then([this](auto) { return openIOAndWriteHeader(); })\n      .and_then(\n          [this](auto) { return initializeResampler(streamSampleRate_, streamChannelCount_); })\n      .and_then([this](auto) {\n        initializeBuffers(streamMaxBufferSize_);\n        isFileOpen_.store(true, std::memory_order_release);\n        return OpenFileResult::Ok(filePath_);\n      });\n}\n\n/// @brief Closes the currently opened audio file, flushing any remaining data and finalizing the file.\n/// This method should called from the JS thread only.\n/// @returns CloseFileStatus indicating success with file path, size and duration, or error with message.\nCloseFileResult FFmpegAudioFileWriter::closeFile() {\n  int result = 0;\n\n  if (!isFileOpen()) {\n    return CloseFileResult::Err(\"File is not open\");\n  }\n\n  result = processFifo(true);\n\n  if (result < 0) {\n    return finalizeOutput();\n  }\n\n  result = avcodec_send_frame(encoderCtx_.get(), nullptr);\n\n  if (result < 0) {\n    return CloseFileResult::Err(\"Failed to send EOF to encoder\");\n  }\n\n  if (writeEncodedPackets() < 0) {\n    return CloseFileResult::Err(\"Failed to drain encoder packets\");\n  }\n  offloader_.reset();\n\n  return finalizeOutput();\n}\n\n/// @brief Writes audio data to the currently opened file.\nvoid FFmpegAudioFileWriter::taskOffloaderFunction(WriterData data) {\n  auto [audioData, numFrames] = data;\n  if (!isFileOpen()) {\n    return;\n  }\n\n  if (!resampleAndPushToFifo(audioData, numFrames)) {\n    return;\n  }\n\n  framesWritten_.fetch_add(numFrames, std::memory_order_acq_rel);\n\n  if (processFifo(false) < 0) {\n    return;\n  }\n}\n\n/// @brief Initializes the FFmpeg format context for the output file.\n/// @param codec The codec to be used for encoding.\n/// @returns Success status or Error status with message.\nResult<NoneType, std::string> FFmpegAudioFileWriter::initializeFormatContext(const AVCodec *codec) {\n  AVFormatContext *rawFormatCtx = nullptr;\n\n  int result = avformat_alloc_output_context2(\n      &rawFormatCtx, nullptr, getMuxerName(fileProperties_).c_str(), filePath_.c_str());\n\n  if (result < 0 || !rawFormatCtx) {\n    return Result<NoneType, std::string>::Err(\n        \"Failed to allocate FFmpeg format context with error: \" + parseErrorCode(result));\n  }\n\n  formatCtx_ = av_unique_ptr<AVFormatContext>(rawFormatCtx);\n  return Result<NoneType, std::string>::Ok(None);\n}\n\n/// @brief Configures and opens the codec context for encoding.\n/// @param codec The codec to be used for encoding.\n/// @returns Success status or Error status with message.\nResult<NoneType, std::string> FFmpegAudioFileWriter::configureAndOpenCodec(const AVCodec *codec) {\n  encoderCtx_ = av_unique_ptr<AVCodecContext>(avcodec_alloc_context3(codec));\n\n  if (!encoderCtx_) {\n    return Result<NoneType, std::string>::Err(\"Failed to allocate FFmpeg codec context\");\n  }\n\n  av_channel_layout_default(&encoderCtx_->ch_layout, fileProperties_->channelCount);\n  encoderCtx_->sample_rate = static_cast<int>(fileProperties_->sampleRate);\n  encoderCtx_->sample_fmt = getSampleFormat(fileProperties_);\n\n  if (fileProperties_->bitRate > 0) {\n    encoderCtx_->bit_rate = fileProperties_->bitRate;\n  }\n\n  AVDictionary *codecOptions = nullptr;\n\n  if (fileProperties_->flacCompressionLevel >= 0) {\n    av_dict_set_int(&codecOptions, \"compression_level\", fileProperties_->flacCompressionLevel, 0);\n  }\n\n  int result = avcodec_open2(encoderCtx_.get(), codec, &codecOptions);\n  av_dict_free(&codecOptions);\n\n  if (result < 0) {\n    return Result<NoneType, std::string>::Err(\n        \"Failed to open FFmpeg codec with error: \" + parseErrorCode(result));\n  }\n\n  return Result<NoneType, std::string>::Ok(None);\n}\n\n/// @brief Initializes a new stream in the format context.\n/// @returns Success status or Error status with message.\nResult<NoneType, std::string> FFmpegAudioFileWriter::initializeStream() {\n  stream_ = avformat_new_stream(formatCtx_.get(), nullptr);\n\n  if (!stream_) {\n    return Result<NoneType, std::string>::Err(\"Failed to create new stream in format context\");\n  }\n\n  int result = avcodec_parameters_from_context(stream_->codecpar, encoderCtx_.get());\n\n  if (result < 0) {\n    return Result<NoneType, std::string>::Err(\n        \"Failed to copy codec parameters to stream with error: \" + parseErrorCode(result));\n  }\n\n  stream_->time_base = AVRational{1, static_cast<int>(encoderCtx_->sample_rate)};\n  return Result<NoneType, std::string>::Ok(None);\n}\n\n/// @brief Opens the file and writes the basic header (depends on the codec/format used).\n/// @returns Success status or Error status with message.\nResult<NoneType, std::string> FFmpegAudioFileWriter::openIOAndWriteHeader() {\n  int result = 0;\n\n  if (!(formatCtx_->oformat->flags & AVFMT_NOFILE)) {\n    result = avio_open(&formatCtx_->pb, filePath_.c_str(), AVIO_FLAG_WRITE);\n\n    if (result < 0) {\n      return Result<NoneType, std::string>::Err(\n          \"Failed to open output file with error: \" + parseErrorCode(result));\n    }\n  }\n\n  result = avformat_write_header(formatCtx_.get(), nullptr);\n\n  if (result < 0) {\n    return Result<NoneType, std::string>::Err(\"Failed to write header to file: \" + filePath_);\n  }\n\n  return Result<NoneType, std::string>::Ok(None);\n}\n\nsize_t FFmpegAudioFileWriter::getFileSizeBytes() const {\n  if (formatCtx_ == nullptr) {\n    return 0;\n  }\n\n  if (formatCtx_ != nullptr && formatCtx_->pb != nullptr) {\n    return static_cast<size_t>(avio_tell(formatCtx_->pb));\n  }\n\n  // Fallback\n  struct stat st;\n  if (stat(filePath_.c_str(), &st) == 0) {\n    return st.st_size;\n  }\n  return 0;\n}\n\n/// @brief Initializes the resampler context for audio conversion.\n/// @param inputRate The sample rate of the input audio.\n/// @param inputChannels The number of channels in the input audio.\n/// @returns Success status or Error status with message.\nResult<NoneType, std::string> FFmpegAudioFileWriter::initializeResampler(\n    float inputRate,\n    int inputChannels) {\n  resampleCtx_ = av_unique_ptr<SwrContext>(swr_alloc());\n\n  if (!resampleCtx_) {\n    return Result<NoneType, std::string>::Err(\"Failed to allocate resampler context\");\n  }\n\n  AVChannelLayout inChannelLayout;\n  av_channel_layout_default(&inChannelLayout, inputChannels);\n\n  av_opt_set_chlayout(resampleCtx_.get(), \"in_chlayout\", &inChannelLayout, 0);\n  av_opt_set_chlayout(resampleCtx_.get(), \"out_chlayout\", &encoderCtx_->ch_layout, 0);\n\n  av_opt_set_int(resampleCtx_.get(), \"in_sample_rate\", static_cast<int64_t>(inputRate), 0);\n  av_opt_set_int(resampleCtx_.get(), \"out_sample_rate\", encoderCtx_->sample_rate, 0);\n\n  av_opt_set_sample_fmt(resampleCtx_.get(), \"in_sample_fmt\", AV_SAMPLE_FMT_FLT, 0);\n  av_opt_set_sample_fmt(resampleCtx_.get(), \"out_sample_fmt\", encoderCtx_->sample_fmt, 0);\n\n  int result = swr_init(resampleCtx_.get());\n\n  if (result < 0) {\n    return Result<NoneType, std::string>::Err(\n        \"Failed to initialize resampler for file: \" + parseErrorCode(result));\n  }\n\n  return Result<NoneType, std::string>::Ok(None);\n}\n\n/// @brief Initializes frame and packet buffers as well as the audio FIFO,\n/// that might be needed for storing intermediate audio data or buffering before encoding.\n/// @param maxBufferSize The maximum buffer size to allocate.\nvoid FFmpegAudioFileWriter::initializeBuffers(int32_t maxBufferSize) {\n  resamplerFrame_ = av_unique_ptr<AVFrame>(av_frame_alloc());\n  writingFrame_ = av_unique_ptr<AVFrame>(av_frame_alloc());\n  packet_ = av_unique_ptr<AVPacket>(av_packet_alloc());\n\n  // Calculate resampler size of output buffer from the resampler\n  int resamplerFrameSize = av_rescale_rnd(\n      maxBufferSize,\n      static_cast<int>(encoderCtx_->sample_rate),\n      static_cast<int>(streamSampleRate_),\n      AV_ROUND_UP);\n\n  // Configure frame parameters for desired file output\n  resamplerFrame_->nb_samples = resamplerFrameSize;\n  resamplerFrame_->format = encoderCtx_->sample_fmt;\n  av_channel_layout_copy(&resamplerFrame_->ch_layout, &encoderCtx_->ch_layout);\n  // Allocate buffer for the resampler frame\n  av_frame_get_buffer(resamplerFrame_.get(), 0);\n\n  // calculate FIFO size based on max buffer size and encoder frame size\n  // max(2 * resamplerFrameSize, 2 * encoderCtx_->frame_size, fallbackFIFOSize)\n  int writingFrameSize = 2 * std::max(encoderCtx_->frame_size, fallbackFrameSize);\n  int fifoSize = std::max(std::max(2 * resamplerFrameSize, writingFrameSize), fallbackFIFOSize);\n\n  audioFifo_ = av_unique_ptr<AVAudioFifo>(\n      av_audio_fifo_alloc(encoderCtx_->sample_fmt, encoderCtx_->ch_layout.nb_channels, fifoSize));\n\n  // Configure writing frame parameters\n  // size 2 x encoder frame size + same format as encoder\n  writingFrame_->nb_samples = writingFrameSize;\n  av_channel_layout_copy(&writingFrame_->ch_layout, &encoderCtx_->ch_layout);\n  writingFrame_->format = encoderCtx_->sample_fmt;\n  writingFrame_->sample_rate = encoderCtx_->sample_rate;\n  // Allocate buffer for the writing frame\n  av_frame_get_buffer(writingFrame_.get(), 0);\n}\n\n/// @brief Resamples input audio data and pushes it to the audio FIFO.\n/// @param inputData Pointer to the input audio data.\n/// @param inputFrameCount Number of input frames.\n/// @returns True if successful, false otherwise.\nbool FFmpegAudioFileWriter::resampleAndPushToFifo(void *inputData, int inputFrameCount) {\n  int64_t outputLength = av_rescale_rnd(\n      inputFrameCount, encoderCtx_->sample_rate, static_cast<int>(streamSampleRate_), AV_ROUND_UP);\n\n  const uint8_t *inputs[1] = {reinterpret_cast<const uint8_t *>(inputData)};\n\n  assert(outputLength <= resamplerFrame_->nb_samples);\n\n  int convertedSamples = swr_convert(\n      resampleCtx_.get(),\n      resamplerFrame_->data,\n      static_cast<int>(outputLength),\n      inputs,\n      inputFrameCount);\n\n  if (convertedSamples < 0) {\n    invokeOnErrorCallback(\"Failed to convert audio samples: \" + parseErrorCode(convertedSamples));\n    return false;\n  }\n\n  int written = av_audio_fifo_write(\n      audioFifo_.get(), reinterpret_cast<void **>(resamplerFrame_->data), convertedSamples);\n\n  if (written < convertedSamples) {\n    invokeOnErrorCallback(\"Failed to write all samples to FIFO\");\n    return false;\n  }\n\n  return true;\n}\n\n/// @brief pushes the audio data from FIFO to the encoder in chunks,\n/// defined by the encoder (512 samples by default) or flushes the FIFO if requested.\n/// Note: flush might be called only when writing the final data batch, otherwise\n/// the codec will crash (especially in case of defined size frames like AAC).\n/// @param flush Indicates whether to flush the FIFO.\n/// @returns 0 on success, -1 or AV_ERROR code on failure\nint FFmpegAudioFileWriter::processFifo(bool flush) {\n  int result = 0;\n  int frameSize = std::max(encoderCtx_->frame_size, fallbackFrameSize);\n\n  while (av_audio_fifo_size(audioFifo_.get()) >= (flush ? 1 : frameSize)) {\n    const int chunkSize = std::min(av_audio_fifo_size(audioFifo_.get()), frameSize);\n\n    if (av_audio_fifo_read(\n            audioFifo_.get(), reinterpret_cast<void **>(writingFrame_->data), chunkSize) !=\n        chunkSize) {\n      invokeOnErrorCallback(\"Failed to read data from FIFO\");\n      return -1;\n    }\n\n    writingFrame_->nb_samples = chunkSize;\n    writingFrame_->pts = nextPts_;\n    nextPts_ += chunkSize;\n\n    result = avcodec_send_frame(encoderCtx_.get(), writingFrame_.get());\n\n    if (result < 0) {\n      invokeOnErrorCallback(\"Failed to send frame to encoder: \" + parseErrorCode(result));\n      return result;\n    }\n\n    result = writeEncodedPackets();\n\n    if (result < 0) {\n      invokeOnErrorCallback(\"Failed to write encoded packets: \" + parseErrorCode(result));\n      return result;\n    }\n  }\n\n  return 0;\n}\n\n/// @brief Takes ready encoded packets from the encoder and writes them to the output file.\n/// Also in order to optimize file writing vs file resilience from crashes, it periodically\n/// forces the AVIO buffer to flush data to disk, by default every 0,5 second.\n/// @returns 0 on success, AV_ERROR code on failure\nint FFmpegAudioFileWriter::writeEncodedPackets() {\n  int result = 0;\n\n  while (true) {\n    result = avcodec_receive_packet(encoderCtx_.get(), packet_.get());\n\n    if (result == AVERROR(EAGAIN) || result == AVERROR_EOF) {\n      return 0;\n    } else if (result < 0) {\n      invokeOnErrorCallback(\"Failed to receive packet from encoder: \" + parseErrorCode(result));\n      return result;\n    }\n\n    av_packet_rescale_ts(packet_.get(), encoderCtx_->time_base, stream_->time_base);\n    packet_->stream_index = stream_->index;\n\n    result = av_interleaved_write_frame(formatCtx_.get(), packet_.get());\n\n    auto now = std::chrono::steady_clock::now();\n    auto elapsedMs =\n        std::chrono::duration_cast<std::chrono::milliseconds>(now - lastFlushTime_).count();\n\n    if (formatCtx_->pb && elapsedMs >= flushIntervalMs_) {\n      avio_flush(formatCtx_->pb);\n      lastFlushTime_ = now;\n    }\n\n    if (result < 0) {\n      return result;\n    }\n  }\n}\n\n/// @brief Closes the currently opened audio file, flushing any remaining data and finalizing the file.\n/// Method checks the file size and duration for convenience.\n/// @returns CloseFileResult indicating success or error details\nCloseFileResult FFmpegAudioFileWriter::finalizeOutput() {\n  int result = av_write_trailer(formatCtx_.get());\n\n  if (result < 0) {\n    return CloseFileResult::Err(\"Failed to write trailer: \" + parseErrorCode(result));\n  }\n\n  double fileSizeInMB = 0;\n\n  if (formatCtx_->pb) {\n    fileSizeInMB = static_cast<double>(avio_size(formatCtx_->pb)) / MB_IN_BYTES;\n    avio_closep(&formatCtx_->pb);\n  }\n\n  double durationInSeconds = getCurrentDuration();\n\n  filePath_ = \"\";\n  isFileOpen_.store(false, std::memory_order_release);\n\n  return CloseFileResult::Ok({fileSizeInMB, durationInSeconds});\n}\n\n} // namespace audioapi::android::ffmpeg\n\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/FFmpegFileWriter.h",
    "content": "#pragma once\n\n#include <audioapi/android/core/utils/AndroidFileWriterBackend.h>\n#include <audioapi/android/core/utils/ffmpegBackend/utils.h>\n#include <audioapi/utils/Result.hpp>\n#include <chrono>\n#include <memory>\n#include <string>\n\nstruct AVCodecContext;\nstruct AVFormatContext;\nstruct AVFrame;\nstruct AVPacket;\nstruct AVAudioFifo;\nstruct SwrContext;\nstruct AVStream;\n\nnamespace audioapi {\n\nclass AudioFileProperties;\n\nnamespace android::ffmpeg {\n\nclass FFmpegAudioFileWriter : public AndroidFileWriterBackend {\n public:\n  explicit FFmpegAudioFileWriter(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const std::shared_ptr<AudioFileProperties> &fileProperties,\n      float streamSampleRate,\n      int32_t streamChannelCount,\n      int32_t streamMaxBufferSize);\n  ~FFmpegAudioFileWriter();\n\n  size_t getFileSizeBytes() const override;\n\n  OpenFileResult openFile(\n      float streamSampleRate,\n      int32_t streamChannelCount,\n      int32_t streamMaxBufferSize,\n      const std::string &fileNameOverride) override;\n  CloseFileResult closeFile() override;\n\n private:\n  av_unique_ptr<AVCodecContext> encoderCtx_{nullptr};\n  av_unique_ptr<AVFormatContext> formatCtx_{nullptr};\n  av_unique_ptr<SwrContext> resampleCtx_{nullptr};\n  av_unique_ptr<AVAudioFifo> audioFifo_{nullptr};\n  av_unique_ptr<AVPacket> packet_{nullptr};\n  av_unique_ptr<AVFrame> resamplerFrame_{nullptr};\n  av_unique_ptr<AVFrame> writingFrame_{nullptr};\n  AVStream *stream_{nullptr};\n\n  unsigned int nextPts_{0};\n\n  std::chrono::steady_clock::time_point lastFlushTime_ = std::chrono::steady_clock::now();\n  int flushIntervalMs_;\n\n  // Initialization helper methods\n  Result<NoneType, std::string> initializeFormatContext(const AVCodec *codec);\n  Result<NoneType, std::string> configureAndOpenCodec(const AVCodec *codec);\n  Result<NoneType, std::string> initializeStream();\n  Result<NoneType, std::string> openIOAndWriteHeader();\n  // TODO: rewrite to use r8brain resampler\n  Result<NoneType, std::string> initializeResampler(float inputRate, int inputChannels);\n  void initializeBuffers(int32_t maxBufferSize);\n\n  // Processing helper methods\n  bool resampleAndPushToFifo(void *data, int numFrames);\n  int processFifo(bool flush);\n  int writeEncodedPackets();\n\n  // Finalization helper methods\n  CloseFileResult finalizeOutput();\n  void taskOffloaderFunction(WriterData data) override;\n};\n\n} // namespace android::ffmpeg\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/ptrs.hpp",
    "content": "#if !RN_AUDIO_API_FFMPEG_DISABLED\n\n#pragma once\n\nextern \"C\" {\n#include <libavcodec/avcodec.h>\n#include <libavformat/avformat.h>\n#include <libavutil/audio_fifo.h>\n#include <libswresample/swresample.h>\n}\n\n#include <audioapi/android/core/utils/ffmpegBackend/utils.h>\n\nnamespace audioapi::android::ffmpeg {\n\ntemplate <>\ninline void AvDtor<AVCodecContext>::operator()(AVCodecContext *ctx) const {\n  if (ctx != nullptr) {\n    avcodec_free_context(&ctx);\n  }\n}\n\ntemplate <>\ninline void AvDtor<AVFormatContext>::operator()(AVFormatContext *ctx) const {\n  if (ctx != nullptr) {\n    avformat_free_context(ctx);\n  }\n}\n\ntemplate <>\ninline void AvDtor<AVFrame>::operator()(AVFrame *frame) const {\n  if (frame != nullptr) {\n    av_frame_free(&frame);\n  }\n}\n\ntemplate <>\ninline void AvDtor<AVPacket>::operator()(AVPacket *packet) const {\n  if (packet != nullptr) {\n    av_packet_free(&packet);\n  }\n}\n\ntemplate <>\ninline void AvDtor<SwrContext>::operator()(SwrContext *ctx) const {\n  if (ctx != nullptr) {\n    swr_free(&ctx);\n  }\n}\n\ntemplate <>\ninline void AvDtor<AVAudioFifo>::operator()(AVAudioFifo *fifo) const {\n  if (fifo != nullptr) {\n    av_audio_fifo_free(fifo);\n  }\n}\n\n} // namespace audioapi::android::ffmpeg\n\n#else\n\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.cpp",
    "content": "#if !RN_AUDIO_API_FFMPEG_DISABLED\n\nextern \"C\" {\n#include <libavcodec/avcodec.h>\n}\n\n#include <audioapi/android/core/utils/ffmpegBackend/utils.h>\n\n#include <audioapi/android/core/utils/FileOptions.h>\n#include <audioapi/utils/AudioFileProperties.h>\n\n#include <memory>\n#include <string>\n\nnamespace audioapi::android::ffmpeg {\n\n/// @brief Get the PCM codec ID based on the bit depth.\n/// Note: This function returns only PCM codec IDs and its different from getSampleFormat. :)\n/// @param properties The audio file properties.\n/// @return The corresponding PCM AVCodecID.\nAVCodecID getPCMCodecID(const std::shared_ptr<AudioFileProperties> &properties) {\n  switch (properties->bitDepth) {\n    case AudioFileProperties::BitDepth::Bit16:\n      return AV_CODEC_ID_PCM_S16LE;\n    case AudioFileProperties::BitDepth::Bit24:\n      return AV_CODEC_ID_PCM_S24LE;\n    case AudioFileProperties::BitDepth::Bit32:\n      return AV_CODEC_ID_PCM_F32LE;\n    default:\n      return AV_CODEC_ID_PCM_F32LE;\n  }\n}\n\n/// @brief Get the codec ID based on the audio file properties.\n/// Note: PCM codec is used with wav and caf formats as both are uncompressed formats.\n/// @param properties The audio file properties.\n/// @return The corresponding AVCodecID.\nAVCodecID getCodecID(const std::shared_ptr<AudioFileProperties> &properties) {\n  switch (properties->format) {\n    case AudioFileProperties::Format::WAV:\n    case AudioFileProperties::Format::CAF:\n      return getPCMCodecID(properties);\n    case AudioFileProperties::Format::M4A:\n      return AV_CODEC_ID_AAC;\n    case AudioFileProperties::Format::FLAC:\n      return AV_CODEC_ID_FLAC;\n    default:\n      return AV_CODEC_ID_AAC;\n  }\n}\n\n/// @brief Returns the appropriate AVSampleFormat for codecs that require it. (non-PCM codecs)\n/// @param properties The audio file properties.\n/// @return The corresponding AVSampleFormat.\nAVSampleFormat getSampleFormat(const std::shared_ptr<AudioFileProperties> &properties) {\n  if (properties->format == AudioFileProperties::Format::M4A) {\n    return AV_SAMPLE_FMT_FLTP;\n  }\n\n  switch (properties->bitDepth) {\n    case AudioFileProperties::BitDepth::Bit16:\n      return AV_SAMPLE_FMT_S16;\n    case AudioFileProperties::BitDepth::Bit24:\n      return AV_SAMPLE_FMT_S32;\n    case AudioFileProperties::BitDepth::Bit32:\n      return AV_SAMPLE_FMT_FLT;\n    default:\n      return AV_SAMPLE_FMT_FLT;\n  }\n}\n\n/// @brief Finds the appropriate codec based on the audio file properties.\n/// @param properties The audio file properties.\n/// @return A pointer to the AVCodec.\nconst AVCodec *getCodec(const std::shared_ptr<AudioFileProperties> &properties) {\n  return avcodec_find_encoder(getCodecID(properties));\n}\n\n/// @brief Returns the appropriate muxer name based on the audio file properties.\n/// Note: most of the time, the muxer name is same as the file extension, (M4A uses MP4 muxer :))\n/// thus this is kept separate from format -> extension mapping.\n/// @param properties The audio file properties.\n/// @return The corresponding muxer name.\nstd::string getMuxerName(const std::shared_ptr<AudioFileProperties> &properties) {\n  switch (properties->format) {\n    case AudioFileProperties::Format::WAV:\n      return \"wav\";\n    case AudioFileProperties::Format::CAF:\n      return \"caf\";\n    case AudioFileProperties::Format::M4A:\n      return \"mp4\";\n    case AudioFileProperties::Format::FLAC:\n      return \"flac\";\n    default:\n      return \"mp4\";\n  }\n}\n\n/// @brief Parses the FFmpeg error int code into a human-readable string.\n/// @param errorCode The FFmpeg error code.\n/// @return A human-readable string describing the error.\nstd::string parseErrorCode(int errorCode) {\n  char errorBuffer[AV_ERROR_MAX_STRING_SIZE];\n\n  if (av_strerror(errorCode, errorBuffer, sizeof(errorBuffer)) < 0) {\n    return \"Unknown FFmpeg error: \" + std::to_string(errorCode);\n  }\n\n  return std::string(errorBuffer);\n}\n\n} // namespace audioapi::android::ffmpeg\n\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/ffmpegBackend/utils.h",
    "content": "#pragma once\n\nextern \"C\" {\n#include <libavcodec/avcodec.h>\n}\n\n#include <memory>\n#include <string>\n\nnamespace audioapi {\n\nclass AudioFileProperties;\n\nnamespace android::ffmpeg {\n\ntemplate <typename AVT>\nstruct AvDtor {\n  void operator()(AVT *ptr) const;\n};\n\ntemplate <typename AVT>\nusing av_unique_ptr = std::unique_ptr<AVT, AvDtor<AVT>>;\n\nAVCodecID getPCMCodecID(const std::shared_ptr<AudioFileProperties> &properties);\nAVCodecID getCodecID(const std::shared_ptr<AudioFileProperties> &properties);\nAVSampleFormat getSampleFormat(const std::shared_ptr<AudioFileProperties> &properties);\nconst AVCodec *getCodec(const std::shared_ptr<AudioFileProperties> &properties);\nstd::string getMuxerName(const std::shared_ptr<AudioFileProperties> &properties);\n\nstd::string parseErrorCode(int errorCode);\n\n} // namespace android::ffmpeg\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.cpp",
    "content": "#include <android/log.h>\n#include <audioapi/android/core/utils/AndroidFileWriterBackend.h>\n#include <audioapi/android/core/utils/FileOptions.h>\n#include <audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h>\n#include <audioapi/core/utils/AudioFileWriter.h>\n#include <audioapi/libs/miniaudio/miniaudio.h>\n#include <audioapi/utils/AudioFileProperties.h>\n#include <audioapi/utils/UnitConversion.h>\n\n#include <sys/stat.h>\n#include <cstdio>\n#include <memory>\n#include <string>\n\nnamespace audioapi {\n\n/// @brief Get the encoding format based on the audio file properties (only WAV supported).\n// Currently, miniaudio supports only WAV encoding, but out of convenience\n// or potential future shenanigans, we keep this as a separate function.\ninline ma_encoding_format getFormat(const std::shared_ptr<AudioFileProperties> &properties) {\n  return ma_encoding_format_wav;\n}\n\n/// @brief Get the data format based on the bit depth.\n/// @param properties The audio file properties.\n/// @return The corresponding ma_format.\ninline ma_format getDataFormat(const std::shared_ptr<AudioFileProperties> &properties) {\n  switch (properties->bitDepth) {\n    case AudioFileProperties::BitDepth::Bit16:\n      return ma_format_s16;\n\n    case AudioFileProperties::BitDepth::Bit24:\n      return ma_format_s24;\n\n    case AudioFileProperties::BitDepth::Bit32:\n      return ma_format_f32;\n\n    default:\n      return ma_format_f32;\n  }\n}\n\nMiniAudioFileWriter::MiniAudioFileWriter(\n    const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    const std::shared_ptr<AudioFileProperties> &fileProperties,\n    float streamSampleRate,\n    int32_t streamChannelCount,\n    int32_t streamMaxBufferSize)\n    : AndroidFileWriterBackend(audioEventHandlerRegistry, fileProperties) {}\n\nMiniAudioFileWriter::~MiniAudioFileWriter() {\n  isFileOpen_.store(false, std::memory_order_release);\n  fileProperties_.reset();\n\n  if (encoder_ != nullptr) {\n    ma_encoder_uninit(encoder_.get());\n    encoder_.reset();\n  }\n\n  if (converter_ != nullptr) {\n    ma_data_converter_uninit(converter_.get(), nullptr);\n    converter_.reset();\n  }\n\n  if (processingBuffer_ != nullptr) {\n    ma_free(processingBuffer_, nullptr);\n    processingBuffer_ = nullptr;\n    processingBufferLength_ = 0;\n  }\n}\n\n/// @brief Opens the audio file for writing.\n/// This method initializes the audio converter and encoder together with any\n/// necessary buffers required during the writing process.\n/// this method should be called only on the JS thread.\n/// @param streamSampleRate The sample rate of the incoming audio stream.\n/// @param streamChannelCount The channel count of the incoming audio stream.\n/// @param streamMaxBufferSize The maximum buffer size of the incoming audio stream.\n/// @return The status of the file opening operation.\nOpenFileResult MiniAudioFileWriter::openFile(\n    float streamSampleRate,\n    int32_t streamChannelCount,\n    int32_t streamMaxBufferSize,\n    const std::string &fileNameOverride) {\n  streamSampleRate_ = streamSampleRate;\n  streamChannelCount_ = streamChannelCount;\n  streamMaxBufferSize_ = streamMaxBufferSize;\n  ma_result result;\n  framesWritten_.store(0, std::memory_order_release);\n\n  isConverterRequired_.store(\n      (streamSampleRate_ != fileProperties_->sampleRate) ||\n          (streamChannelCount_ != fileProperties_->channelCount) ||\n          (getDataFormat(fileProperties_) != ma_format_f32),\n      std::memory_order_release);\n\n  result = initializeConverterIfNeeded();\n\n  if (result != MA_SUCCESS) {\n    return OpenFileResult ::Err(\n        \"Failed to initialize converter\" + std::string(ma_result_description(result)));\n  }\n\n  result = initializeEncoder(fileNameOverride);\n\n  if (result != MA_SUCCESS) {\n    return OpenFileResult ::Err(\n        \"Failed to initialize encoder\" + std::string(ma_result_description(result)));\n  }\n\n  auto offloaderLambda = [this](WriterData data) {\n    taskOffloaderFunction(data);\n  };\n\n  offloader_ = std::make_unique<task_offloader::TaskOffloader<\n      WriterData,\n      FILE_WRITER_SPSC_OVERFLOW_STRATEGY,\n      FILE_WRITER_SPSC_WAIT_STRATEGY>>(FILE_WRITER_CHANNEL_CAPACITY, offloaderLambda);\n\n  isFileOpen_.store(true, std::memory_order_release);\n  return OpenFileResult ::Ok(filePath_);\n}\n\n/// @brief Closes the audio file.\n/// This method finalizes the writing process, releases resources,\n/// and retrieves the duration and size of the written audio file.\n/// It should be called only on the JS thread.\n/// @return The status of the file closing operation.\nCloseFileResult MiniAudioFileWriter::closeFile() {\n  if (!isFileOpen()) {\n    return CloseFileResult ::Err(\"File is not open\");\n  }\n\n  offloader_.reset();\n\n  isFileOpen_.store(false, std::memory_order_release);\n\n  if (encoder_ != nullptr) {\n    ma_encoder_uninit(encoder_.get());\n    encoder_.reset();\n  }\n\n  if (converter_ != nullptr) {\n    ma_data_converter_uninit(converter_.get(), nullptr);\n    converter_.reset();\n  }\n\n  if (processingBuffer_ != nullptr) {\n    ma_free(processingBuffer_, nullptr);\n    processingBuffer_ = nullptr;\n    processingBufferLength_ = 0;\n  }\n\n  // Retrieve duration and file size\n  double durationInSeconds = 0.0;\n  double fileSizeInMB = 0.0;\n\n  ma_decoder decoder;\n\n  if (ma_decoder_init_file(filePath_.c_str(), nullptr, &decoder) == MA_SUCCESS) {\n    ma_uint64 frameCount = 0;\n\n    if (ma_decoder_get_length_in_pcm_frames(&decoder, &frameCount) == MA_SUCCESS) {\n      durationInSeconds = static_cast<double>(frameCount) / decoder.outputSampleRate;\n    }\n\n    ma_decoder_uninit(&decoder);\n  }\n\n  FILE *file = fopen(filePath_.c_str(), \"rb\");\n\n  if (file != nullptr) {\n    fseek(file, 0, SEEK_END);\n    uint64_t fileSizeInBytes = ftell(file);\n    fclose(file);\n    fileSizeInMB = static_cast<double>(fileSizeInBytes) / MB_IN_BYTES;\n  }\n\n  filePath_ = \"\";\n  return CloseFileResult ::Ok({fileSizeInMB, durationInSeconds});\n}\n\n/// @brief Get the current file size in bytes.\n/// @return The size of the file in bytes.\nsize_t MiniAudioFileWriter::getFileSizeBytes() const {\n  struct stat st;\n  if (stat(filePath_.c_str(), &st) == 0) {\n    return st.st_size;\n  }\n  return 0;\n}\n\n/// @brief Writes audio data to the file.\n/// If possible (sample format, channel count, and interleaving matches),\n/// the data is written directly, otherwise in-memory conversion is performed first\nvoid MiniAudioFileWriter::taskOffloaderFunction(WriterData data) {\n  auto [audioData, numFrames] = data;\n  ma_uint64 framesWritten = 0;\n  ma_result result;\n\n  if (!isFileOpen()) {\n    return;\n  }\n\n  if (!isConverterRequired()) {\n    result = ma_encoder_write_pcm_frames(encoder_.get(), audioData, numFrames, &framesWritten);\n\n    if (result != MA_SUCCESS) {\n      invokeOnErrorCallback(\n          \"Failed to write audio data to file: \" + filePath_ +\n          std::string(ma_result_description(result)));\n      return;\n    }\n\n    framesWritten_.fetch_add(numFrames, std::memory_order_acq_rel);\n    return;\n  }\n\n  ma_uint64 convertedFrameCount = convertBuffer(audioData, numFrames);\n\n  result = ma_encoder_write_pcm_frames(\n      encoder_.get(), processingBuffer_, convertedFrameCount, &framesWritten);\n\n  if (result != MA_SUCCESS) {\n    invokeOnErrorCallback(\n        \"Failed to write converted audio data to file: \" + filePath_ +\n        std::string(ma_result_description(result)));\n    return;\n  }\n\n  framesWritten_.fetch_add(numFrames, std::memory_order_acq_rel);\n}\n\n/// @brief Converts the audio data buffer if necessary.\n/// @param data Pointer to the audio data buffer.\n/// @param numFrames Number of audio frames to convert.\n/// @return The number of frames after conversion.\nma_uint64 MiniAudioFileWriter::convertBuffer(void *data, int numFrames) {\n  ma_uint64 inputFrameCount = numFrames;\n  ma_uint64 outputFrameCount = 0;\n\n  ma_data_converter_get_expected_output_frame_count(\n      converter_.get(), inputFrameCount, &outputFrameCount);\n\n  ma_data_converter_process_pcm_frames(\n      converter_.get(), data, &inputFrameCount, processingBuffer_, &outputFrameCount);\n\n  return outputFrameCount;\n}\n\n/// @brief Initializes the data converter if needed.\n/// This method sets up the data converter and allocates, so it should be called\n/// only on the JS thread. (during file opening)\n/// @return MA_SUCCESS if initialization was successful, otherwise an error code.\nma_result MiniAudioFileWriter::initializeConverterIfNeeded() {\n  if (!isConverterRequired_) {\n    return MA_SUCCESS;\n  }\n\n  ma_result result;\n  ma_format dataFormat = getDataFormat(fileProperties_);\n\n  ma_data_converter_config converterConfig = ma_data_converter_config_init(\n      ma_format_f32,\n      dataFormat,\n      streamChannelCount_,\n      fileProperties_->channelCount,\n      static_cast<int32_t>(streamSampleRate_),\n      fileProperties_->sampleRate);\n\n  converter_ = std::make_unique<ma_data_converter>();\n  result = ma_data_converter_init(&converterConfig, nullptr, converter_.get());\n\n  if (result != MA_SUCCESS) {\n    return result;\n  }\n\n  ma_data_converter_get_expected_output_frame_count(\n      converter_.get(), streamMaxBufferSize_, &processingBufferLength_);\n\n  processingBuffer_ = ma_malloc(\n      processingBufferLength_ * fileProperties_->channelCount * ma_get_bytes_per_sample(dataFormat),\n      nullptr);\n\n  return MA_SUCCESS;\n}\n\n/// @brief Initializes the audio encoder.\n/// This method sets up the audio encoder for writing to the file,\n/// it should be called only on the JS thread. (during file opening)\n/// @return MA_SUCCESS if initialization was successful, otherwise an error code.\nma_result MiniAudioFileWriter::initializeEncoder(const std::string &fileNameOverride) {\n  ma_result result;\n  Result<std::string, std::string> filePathResult =\n      android::fileoptions::getFilePath(fileProperties_, fileNameOverride);\n\n  if (!filePathResult.is_ok()) {\n    return MA_ERROR;\n  }\n\n  filePath_ = filePathResult.unwrap();\n\n  ma_encoder_config config = ma_encoder_config_init(\n      getFormat(fileProperties_),\n      getDataFormat(fileProperties_),\n      fileProperties_->channelCount,\n      fileProperties_->sampleRate);\n\n  encoder_ = std::make_unique<ma_encoder>();\n  result = ma_encoder_init_file(filePath_.c_str(), &config, encoder_.get());\n\n  return result;\n}\n\nbool MiniAudioFileWriter::isConverterRequired() {\n  return isConverterRequired_.load(std::memory_order_acquire);\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/core/utils/miniaudioBackend/MiniAudioFileWriter.h",
    "content": "#pragma once\n\n#include <audioapi/android/core/utils/AndroidFileWriterBackend.h>\n#include <audioapi/libs/miniaudio/miniaudio.h>\n\n#include <atomic>\n#include <memory>\n#include <string>\n\nnamespace audioapi {\n\nclass MiniAudioFileWriter : public AndroidFileWriterBackend {\n public:\n  explicit MiniAudioFileWriter(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const std::shared_ptr<AudioFileProperties> &fileProperties,\n      float streamSampleRate,\n      int32_t streamChannelCount,\n      int32_t streamMaxBufferSize);\n  ~MiniAudioFileWriter();\n\n  size_t getFileSizeBytes() const override;\n\n  OpenFileResult openFile(\n      float streamSampleRate,\n      int32_t streamChannelCount,\n      int32_t streamMaxBufferSize,\n      const std::string &fileNameOverride) override;\n  CloseFileResult closeFile() override;\n\n private:\n  std::atomic<bool> isConverterRequired_{false};\n\n  std::unique_ptr<ma_encoder> encoder_{nullptr};\n  std::unique_ptr<ma_data_converter> converter_{nullptr};\n  void *processingBuffer_{nullptr};\n  ma_uint64 processingBufferLength_{0};\n\n  ma_result initializeConverterIfNeeded();\n  ma_result initializeEncoder(const std::string &fileNameOverride);\n  // TODO: rewrite to use r8brain resampler\n  ma_uint64 convertBuffer(void *data, int numFrames);\n\n  bool isConverterRequired();\n  void taskOffloaderFunction(WriterData data) override;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/cpp/audioapi/android/system/NativeFileInfo.hpp",
    "content": "#pragma once\n\n#include <fbjni/fbjni.h>\n#include <string>\n\nnamespace audioapi {\n\nusing namespace facebook;\n\nclass NativeFileInfo : public jni::JavaClass<NativeFileInfo> {\n public:\n  static auto constexpr kJavaDescriptor = \"Lcom/swmansion/audioapi/system/NativeFileInfo;\";\n\n  static std::string getFilesDir() {\n    static const auto method = javaClassStatic()->getStaticMethod<jni::JString()>(\"getFilesDir\");\n    return method(javaClassStatic())->toStdString();\n  }\n\n  static std::string getCacheDir() {\n    static const auto method = javaClassStatic()->getStaticMethod<jni::JString()>(\"getCacheDir\");\n    return method(javaClassStatic())->toStdString();\n  }\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/AudioAPIModule.kt",
    "content": "package com.swmansion.audioapi\n\nimport android.media.AudioManager\nimport android.os.Build\nimport android.util.Base64\nimport androidx.annotation.RequiresApi\nimport androidx.annotation.RequiresPermission\nimport com.facebook.jni.HybridData\nimport com.facebook.react.bridge.Arguments\nimport com.facebook.react.bridge.LifecycleEventListener\nimport com.facebook.react.bridge.Promise\nimport com.facebook.react.bridge.ReactApplicationContext\nimport com.facebook.react.bridge.ReadableArray\nimport com.facebook.react.bridge.ReadableMap\nimport com.facebook.react.common.annotations.FrameworkAPI\nimport com.facebook.react.module.annotations.ReactModule\nimport com.facebook.react.turbomodule.core.CallInvokerHolderImpl\nimport com.swmansion.audioapi.system.ForegroundServiceManager\nimport com.swmansion.audioapi.system.MediaSessionManager\nimport com.swmansion.audioapi.system.NativeFileInfo\nimport com.swmansion.audioapi.system.PermissionRequestListener\nimport java.lang.ref.WeakReference\nimport kotlin.concurrent.thread\n\n@OptIn(FrameworkAPI::class)\n@ReactModule(name = AudioAPIModule.NAME)\nclass AudioAPIModule(\n  reactContext: ReactApplicationContext,\n) : NativeAudioAPIModuleSpec(reactContext),\n  LifecycleEventListener {\n  companion object {\n    const val NAME = NativeAudioAPIModuleSpec.NAME\n    private const val TAG = \"AudioAPIModule\"\n  }\n\n  val reactContext: WeakReference<ReactApplicationContext> = WeakReference(reactContext)\n\n  private lateinit var mHybridData: HybridData\n\n  @OptIn(markerClass = [FrameworkAPI::class])\n  private external fun initHybrid(\n    workletsModule: Any?,\n    jsContext: Long,\n    callInvoker: CallInvokerHolderImpl,\n  ): HybridData\n\n  @OptIn(markerClass = [FrameworkAPI::class])\n  private external fun injectJSIBindings()\n\n  external fun invokeHandlerWithEventNameAndEventBody(\n    eventOrdinal: Int,\n    eventBody: Map<String, Any>,\n  )\n\n  init {\n    try {\n      System.loadLibrary(\"react-native-audio-api\")\n    } catch (exception: UnsatisfiedLinkError) {\n      throw RuntimeException(\"Could not load native module AudioAPIModule\", exception)\n    }\n  }\n\n  @OptIn(markerClass = [FrameworkAPI::class])\n  override fun install(): Boolean {\n    val context = reactContext.get() ?: return false\n    context.assertOnJSQueueThread()\n\n    val jsContext = context.javaScriptContextHolder!!.get()\n    val jsCallInvokerHolder = context.jsCallInvokerHolder as CallInvokerHolderImpl\n\n    var workletsModule: Any? = null\n    if (BuildConfig.RN_AUDIO_API_ENABLE_WORKLETS) {\n      try {\n        workletsModule = context.getNativeModule(\"WorkletsModule\")\n      } catch (_: Exception) {\n        throw RuntimeException(\"WorkletsModule not found - make sure react-native-worklets is properly installed\")\n      }\n    }\n\n    mHybridData = initHybrid(workletsModule, jsContext, jsCallInvokerHolder)\n    MediaSessionManager.initialize(WeakReference(this), reactContext)\n    NativeFileInfo.initialize(reactContext)\n    injectJSIBindings()\n\n    return true\n  }\n\n  override fun onHostResume() {\n    // do nothing\n  }\n\n  override fun onHostPause() {\n    // do nothing\n  }\n\n  override fun onHostDestroy() {\n    // do nothing\n  }\n\n  override fun initialize() {\n    reactContext.get()?.addLifecycleEventListener(this)\n  }\n\n  override fun invalidate() {\n    reactContext.get()?.removeLifecycleEventListener(this)\n    // Cleanup foreground service manager\n    ForegroundServiceManager.cleanup()\n  }\n\n  override fun getDevicePreferredSampleRate(): Double = MediaSessionManager.getDevicePreferredSampleRate()\n\n  override fun setAudioSessionActivity(\n    enabled: Boolean,\n    promise: Promise?,\n  ) {\n    promise?.resolve(true)\n  }\n\n  override fun setAudioSessionOptions(\n    category: String?,\n    mode: String?,\n    options: ReadableArray?,\n    allowHaptics: Boolean,\n    notifyOthersOnDeactivation: Boolean,\n  ) {\n    // noting to do here\n  }\n\n  override fun disableSessionManagement() {\n    // nothing to do here\n  }\n\n  override fun observeAudioInterruptions(\n    focusType: String?,\n    enabled: Boolean,\n  ) {\n    if (!enabled) {\n      MediaSessionManager.abandonAudioFocus()\n      return\n    }\n    when (focusType) {\n      \"gain\" -> MediaSessionManager.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN)\n      \"gainTransient\" -> MediaSessionManager.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)\n      \"gainTransientMayDuck\" -> MediaSessionManager.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK)\n      \"gainTransientExclusive\" -> MediaSessionManager.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE)\n      else -> MediaSessionManager.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN)\n    }\n  }\n\n  override fun activelyReclaimSession(enabled: Boolean) {\n    MediaSessionManager.activelyReclaimSession(enabled)\n  }\n\n  override fun observeVolumeChanges(enabled: Boolean) {\n    MediaSessionManager.observeVolumeChanges(enabled)\n  }\n\n  override fun requestRecordingPermissions(promise: Promise) {\n    val permissionRequestListener = PermissionRequestListener(promise)\n    MediaSessionManager.requestRecordingPermissions(permissionRequestListener)\n  }\n\n  override fun checkRecordingPermissions(promise: Promise) {\n    promise.resolve(MediaSessionManager.checkRecordingPermissions())\n  }\n\n  override fun requestNotificationPermissions(promise: Promise) {\n    val permissionRequestListener = PermissionRequestListener(promise)\n    MediaSessionManager.requestNotificationPermissions(permissionRequestListener)\n  }\n\n  override fun checkNotificationPermissions(promise: Promise) {\n    promise.resolve(MediaSessionManager.checkNotificationPermissions())\n  }\n\n  @RequiresApi(Build.VERSION_CODES.O)\n  override fun getDevicesInfo(promise: Promise) {\n    promise.resolve(MediaSessionManager.getDevicesInfo())\n  }\n\n  override fun setInputDevice(\n    deviceId: String?,\n    promise: Promise?,\n  ) {\n    // TODO: noop for now, but it should be moved to upcoming\n    // audio engine implementation for android (duplex stream)\n    promise?.resolve(true)\n  }\n\n  // Notification system methods\n  @RequiresPermission(android.Manifest.permission.POST_NOTIFICATIONS)\n  override fun showNotification(\n    type: String?,\n    key: String?,\n    options: ReadableMap?,\n    promise: Promise?,\n  ) {\n    try {\n      if (type == null || key == null) {\n        val result = Arguments.createMap()\n        result.putBoolean(\"success\", false)\n        result.putString(\"error\", \"Type and key are required\")\n        promise?.resolve(result)\n        return\n      }\n\n      MediaSessionManager.showNotification(type, key, options)\n\n      val result = Arguments.createMap()\n      result.putBoolean(\"success\", true)\n      promise?.resolve(result)\n    } catch (e: Exception) {\n      val result = Arguments.createMap()\n      result.putBoolean(\"success\", false)\n      result.putString(\"error\", e.message ?: \"Unknown error\")\n      promise?.resolve(result)\n    }\n  }\n\n  override fun hideNotification(\n    key: String?,\n    promise: Promise?,\n  ) {\n    try {\n      if (key == null) {\n        val result = Arguments.createMap()\n        result.putBoolean(\"success\", false)\n        result.putString(\"error\", \"Key is required\")\n        promise?.resolve(result)\n        return\n      }\n\n      MediaSessionManager.hideNotification(key)\n\n      val result = Arguments.createMap()\n      result.putBoolean(\"success\", true)\n      promise?.resolve(result)\n    } catch (e: Exception) {\n      val result = Arguments.createMap()\n      result.putBoolean(\"success\", false)\n      result.putString(\"error\", e.message ?: \"Unknown error\")\n      promise?.resolve(result)\n    }\n  }\n\n  override fun isNotificationActive(\n    key: String?,\n    promise: Promise?,\n  ) {\n    try {\n      if (key == null) {\n        promise?.resolve(false)\n        return\n      }\n\n      val isActive = MediaSessionManager.isNotificationActive(key)\n      promise?.resolve(isActive)\n    } catch (_: Exception) {\n      promise?.resolve(false)\n    }\n  }\n\n  override fun readAndroidReleaseAssetBytesAsBase64(\n    assetPath: String?,\n    promise: Promise?,\n  ) {\n    if (assetPath.isNullOrBlank()) {\n      promise?.reject(\"E_INVALID_ASSET\", \"Asset path is empty\", null)\n      return\n    }\n    val appContext = reactContext.get()?.applicationContext\n    if (appContext == null) {\n      promise?.reject(\"E_NO_CONTEXT\", \"React context unavailable\", null)\n      return\n    }\n    thread(name = \"rnaa-read-release-asset\") {\n      try {\n        val bytes = readAndroidBundledAssetBytes(appContext, assetPath)\n        if (bytes == null || bytes.isEmpty()) {\n          promise?.reject(\"E_READ_ASSET\", \"Could not read asset bytes\", null)\n          return@thread\n        }\n        promise?.resolve(Base64.encodeToString(bytes, Base64.NO_WRAP))\n      } catch (e: Exception) {\n        promise?.reject(\"E_READ_ASSET\", e.message, e)\n      }\n    }\n  }\n\n  private fun readAndroidBundledAssetBytes(\n    context: android.content.Context,\n    assetPath: String,\n  ): ByteArray? {\n    val packageName = context.packageName\n\n    var resId = context.resources.getIdentifier(assetPath, \"raw\", packageName)\n    if (resId == 0 && assetPath.contains('.')) {\n      val nameWithoutExt = assetPath.substringBeforeLast('.')\n      resId = context.resources.getIdentifier(nameWithoutExt, \"raw\", packageName)\n    }\n    if (resId != 0) {\n      context.resources.openRawResource(resId).use { return it.readBytes() }\n    }\n    return null\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/AudioAPIPackage.kt",
    "content": "package com.swmansion.audioapi\n\nimport com.facebook.react.BaseReactPackage\nimport com.facebook.react.bridge.NativeModule\nimport com.facebook.react.bridge.ReactApplicationContext\nimport com.facebook.react.module.annotations.ReactModuleList\nimport com.facebook.react.module.model.ReactModuleInfo\nimport com.facebook.react.module.model.ReactModuleInfoProvider\n\n@ReactModuleList(\n  nativeModules = [\n    AudioAPIModule::class,\n  ],\n)\nclass AudioAPIPackage : BaseReactPackage() {\n  override fun getModule(\n    name: String,\n    reactContext: ReactApplicationContext,\n  ): NativeModule? {\n    when (name) {\n      AudioAPIModule.NAME -> return AudioAPIModule(reactContext)\n    }\n    return null\n  }\n\n  override fun getReactModuleInfoProvider(): ReactModuleInfoProvider =\n    ReactModuleInfoProvider {\n      val moduleInfos: MutableMap<String, ReactModuleInfo> = HashMap()\n      val isTurboModule = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED\n      moduleInfos[AudioAPIModule.NAME] =\n        ReactModuleInfo(\n          AudioAPIModule.NAME,\n          AudioAPIModule.NAME,\n          true, // canOverrideExistingModule\n          false, // needsEagerInit\n          false, // isCxxModule\n          isTurboModule,\n        )\n\n      moduleInfos\n    }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/AudioEvent.kt",
    "content": "package com.swmansion.audioapi.system\n\n// should be kept in sync with AudioEvent.h\nenum class AudioEvent {\n  PLAYBACK_NOTIFICATION_PLAY,\n  PLAYBACK_NOTIFICATION_PAUSE,\n  PLAYBACK_NOTIFICATION_STOP,\n  PLAYBACK_NOTIFICATION_NEXT_TRACK,\n  PLAYBACK_NOTIFICATION_PREVIOUS_TRACK,\n  PLAYBACK_NOTIFICATION_SKIP_FORWARD,\n  PLAYBACK_NOTIFICATION_SKIP_BACKWARD,\n  PLAYBACK_NOTIFICATION_SEEK_FORWARD,\n  PLAYBACK_NOTIFICATION_SEEK_BACKWARD,\n  PLAYBACK_NOTIFICATION_SEEK_TO,\n  PLAYBACK_NOTIFICATION_DISMISSED,\n  RECORDING_NOTIFICATION_RESUME,\n  RECORDING_NOTIFICATION_PAUSE,\n  ROUTE_CHANGE,\n  INTERRUPTION,\n  VOLUME_CHANGE,\n  DUCK,\n  ENDED,\n  LOOP_ENDED,\n  AUDIO_READY,\n  POSITION_CHANGED,\n  BUFFER_ENDED,\n  RECORDER_ERROR,\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/AudioFocusListener.kt",
    "content": "package com.swmansion.audioapi.system\n\nimport android.media.AudioFocusRequest\nimport android.media.AudioManager\nimport android.os.Build\nimport android.util.Log\nimport com.swmansion.audioapi.AudioAPIModule\nimport java.lang.ref.WeakReference\nimport java.util.HashMap\n\nclass AudioFocusListener(\n  private val audioManager: WeakReference<AudioManager>,\n  private val audioAPIModule: WeakReference<AudioAPIModule>,\n) : AudioManager.OnAudioFocusChangeListener {\n  private var focusRequest: AudioFocusRequest? = null\n  private var isTransientLoss: Boolean = false\n\n  override fun onAudioFocusChange(focusChange: Int) {\n    Log.d(\"AudioFocusListener\", \"onAudioFocusChange: $focusChange\")\n    when (focusChange) {\n      AudioManager.AUDIOFOCUS_LOSS -> {\n        val body =\n          HashMap<String, Any>().apply {\n            put(\"type\", \"began\")\n            put(\"shouldResume\", false)\n            isTransientLoss = false\n          }\n        audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.INTERRUPTION.ordinal, body)\n      }\n\n      AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {\n        val body =\n          HashMap<String, Any>().apply {\n            put(\"type\", \"began\")\n            put(\"shouldResume\", false)\n            isTransientLoss = true\n          }\n        audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.INTERRUPTION.ordinal, body)\n      }\n\n      AudioManager.AUDIOFOCUS_GAIN -> {\n        val body =\n          HashMap<String, Any>().apply {\n            put(\"type\", \"ended\")\n            put(\"shouldResume\", isTransientLoss)\n            isTransientLoss = false\n          }\n        audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.INTERRUPTION.ordinal, body)\n      }\n\n      AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {\n        audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.DUCK.ordinal, emptyMap())\n      }\n    }\n  }\n\n  fun requestAudioFocus(focus: Int) {\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n      this.focusRequest =\n        AudioFocusRequest\n          .Builder(focus)\n          .setOnAudioFocusChangeListener(this)\n          .build()\n\n      audioManager.get()?.requestAudioFocus(focusRequest!!)\n    } else {\n      audioManager.get()?.requestAudioFocus(this, AudioManager.STREAM_MUSIC, focus)\n    }\n  }\n\n  fun abandonAudioFocus() {\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && this.focusRequest != null) {\n      audioManager.get()?.abandonAudioFocusRequest(focusRequest!!)\n    } else {\n      audioManager.get()?.abandonAudioFocus(this)\n    }\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/CentralizedForegroundService.kt",
    "content": "package com.swmansion.audioapi.system\n\nimport android.app.Notification\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.app.Service\nimport android.content.Context\nimport android.content.Intent\nimport android.os.Build\nimport android.os.IBinder\nimport android.util.Log\nimport androidx.core.app.NotificationCompat\nimport com.swmansion.audioapi.system.MediaSessionManager.CHANNEL_ID\nimport com.swmansion.audioapi.system.notification.NotificationRegistry\nimport com.swmansion.audioapi.system.notification.PlaybackNotification\nimport com.swmansion.audioapi.system.notification.RecordingNotification\n\n/**\n * Centralized foreground service that can be used by any component that needs foreground capabilities.\n */\nclass CentralizedForegroundService : Service() {\n  companion object {\n    private const val TAG = \"CentralizedForegroundService\"\n    const val ACTION_START = \"START_FOREGROUND\"\n    const val ACTION_STOP = \"STOP_FOREGROUND\"\n  }\n\n  override fun onBind(intent: Intent?): IBinder? = null\n\n  override fun onStartCommand(\n    intent: Intent?,\n    flags: Int,\n    startId: Int,\n  ): Int {\n    when (intent?.action) {\n      ACTION_START -> {\n        startForegroundWithNotification()\n      }\n\n      ACTION_STOP -> {\n        stopForeground(STOP_FOREGROUND_REMOVE)\n        stopSelf()\n      }\n    }\n    return START_NOT_STICKY\n  }\n\n  private fun startForegroundWithNotification() {\n    try {\n      createNotificationChannelIfNeeded()\n\n      // Get the first available notification\n      val existingNotification = findExistingNotification()\n      if (existingNotification == null) {\n        Log.w(TAG, \"No notification available to start foreground service\")\n        return\n      }\n\n      val (notificationId, notification) = existingNotification\n\n      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {\n        startForeground(\n          notificationId,\n          notification,\n        )\n      } else {\n        startForeground(notificationId, notification)\n      }\n\n      Log.d(TAG, \"Centralized foreground service started with notification ID: $notificationId\")\n    } catch (e: Exception) {\n      Log.e(TAG, \"Error starting foreground service: ${e.message}\", e)\n    }\n  }\n\n  private fun findExistingNotification(): Pair<Int, Notification>? {\n    // Check for playback notification first (priority)\n    NotificationRegistry.getBuiltNotification(PlaybackNotification.ID)?.let {\n      return PlaybackNotification.ID to it\n    }\n\n    NotificationRegistry.getBuiltNotification(RecordingNotification.ID)?.let {\n      return RecordingNotification.ID to it\n    }\n\n    return null\n  }\n\n  private fun createNotificationChannelIfNeeded() {\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n      val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n\n      if (notificationManager.getNotificationChannel(CHANNEL_ID) == null) {\n        val channel =\n          NotificationChannel(\n            CHANNEL_ID,\n            \"Audio Service\",\n            NotificationManager.IMPORTANCE_LOW,\n          ).apply {\n            description = \"Background audio processing\"\n            setShowBadge(false)\n            lockscreenVisibility = NotificationCompat.VISIBILITY_PUBLIC\n          }\n        notificationManager.createNotificationChannel(channel)\n      }\n    }\n  }\n\n  override fun onDestroy() {\n    Log.d(TAG, \"Centralized foreground service destroyed\")\n    super.onDestroy()\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/ForegroundServiceManager.kt",
    "content": "package com.swmansion.audioapi.system\n\nimport android.content.Intent\nimport android.os.Build\nimport android.util.Log\nimport com.facebook.react.bridge.ReactApplicationContext\nimport com.swmansion.audioapi.system.notification.BaseNotification\nimport java.lang.ref.WeakReference\n\n/**\n * Centralized manager for foreground service lifecycle.\n * Handles starting/stopping foreground service based on active subscribers.\n */\nobject ForegroundServiceManager {\n  private const val TAG = \"ForegroundServiceManager\"\n\n  private lateinit var reactContext: WeakReference<ReactApplicationContext>\n  private val subscribers = mutableSetOf<BaseNotification>()\n  private var isServiceRunning = false\n\n  fun initialize(reactContext: WeakReference<ReactApplicationContext>) {\n    this.reactContext = reactContext\n  }\n\n  /**\n   * Subscribe to foreground service. Service will start if not already running.\n   * @param subscriber Unique identifier for the subscriber\n   */\n  @Synchronized\n  fun subscribe(subscriber: BaseNotification) {\n    if (subscribers.add(subscriber)) {\n      Log.d(TAG, \"Subscriber added: $subscriber (total: ${subscribers.size})\")\n      startServiceIfNeeded()\n    }\n  }\n\n  /**\n   * Unsubscribe from foreground service. Service will stop if no more subscribers.\n   * @param subscriber Unique identifier for the subscriber\n   */\n  @Synchronized\n  fun unsubscribe(subscriber: BaseNotification) {\n    if (subscribers.remove(subscriber)) {\n      Log.d(TAG, \"Subscriber removed: $subscriber (total: ${subscribers.size})\")\n      stopServiceIfNotNeeded()\n    }\n  }\n\n  /**\n   * Get count of active subscribers\n   */\n  fun getSubscriberCount(): Int = subscribers.size\n\n  /**\n   * Check if service is currently running\n   */\n  fun isServiceRunning(): Boolean = isServiceRunning\n\n  private fun startServiceIfNeeded() {\n    if (!isServiceRunning && subscribers.isNotEmpty()) {\n      startForegroundService()\n    }\n  }\n\n  private fun stopServiceIfNotNeeded() {\n    if (isServiceRunning && subscribers.isEmpty()) {\n      stopForegroundService()\n    }\n  }\n\n  private fun startForegroundService() {\n    val context = reactContext.get() ?: return\n\n    try {\n      val intent = Intent(context, CentralizedForegroundService::class.java)\n      intent.action = CentralizedForegroundService.ACTION_START\n\n      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n        context.startForegroundService(intent)\n      } else {\n        context.startService(intent)\n      }\n\n      isServiceRunning = true\n      Log.d(TAG, \"Centralized foreground service started\")\n    } catch (e: Exception) {\n      Log.e(TAG, \"Error starting foreground service: ${e.message}\", e)\n    }\n  }\n\n  private fun stopForegroundService() {\n    val context = reactContext.get() ?: return\n\n    try {\n      val intent = Intent(context, CentralizedForegroundService::class.java)\n      intent.action = CentralizedForegroundService.ACTION_STOP\n\n      context.startService(intent)\n      isServiceRunning = false\n      Log.d(TAG, \"Centralized foreground service stopped\")\n    } catch (e: Exception) {\n      Log.e(TAG, \"Error stopping foreground service: ${e.message}\", e)\n    }\n  }\n\n  /**\n   * Cleanup all subscribers and stop service\n   */\n  fun cleanup() {\n    synchronized(this) {\n      subscribers.clear()\n      if (isServiceRunning) {\n        stopForegroundService()\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/MediaSessionManager.kt",
    "content": "package com.swmansion.audioapi.system\n\nimport android.Manifest\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.content.Context\nimport android.content.IntentFilter\nimport android.content.pm.PackageManager\nimport android.media.AudioDeviceInfo\nimport android.media.AudioManager\nimport android.os.Build\nimport androidx.annotation.RequiresApi\nimport androidx.annotation.RequiresPermission\nimport androidx.core.app.ActivityCompat\nimport androidx.core.app.NotificationCompat\nimport androidx.core.content.ContextCompat\nimport com.facebook.react.bridge.Arguments\nimport com.facebook.react.bridge.ReactApplicationContext\nimport com.facebook.react.bridge.ReadableMap\nimport com.facebook.react.modules.core.PermissionAwareActivity\nimport com.facebook.react.modules.core.PermissionListener\nimport com.swmansion.audioapi.AudioAPIModule\nimport com.swmansion.audioapi.system.PermissionRequestListener.Companion.RECORDING_REQUEST_CODE\nimport com.swmansion.audioapi.system.notification.NotificationRegistry\nimport com.swmansion.audioapi.system.notification.PlaybackNotification\nimport com.swmansion.audioapi.system.notification.PlaybackNotificationReceiver\nimport java.lang.ref.WeakReference\n\nobject MediaSessionManager {\n  private lateinit var audioAPIModule: WeakReference<AudioAPIModule>\n  private lateinit var reactContext: WeakReference<ReactApplicationContext>\n  const val CHANNEL_ID = \"react-native-audio-api\"\n\n  private lateinit var audioManager: AudioManager\n  private lateinit var audioFocusListener: AudioFocusListener\n  private lateinit var volumeChangeListener: VolumeChangeListener\n  private lateinit var playbackNotificationReceiver: PlaybackNotificationReceiver\n\n  // New notification system\n  private lateinit var notificationRegistry: NotificationRegistry\n\n  fun initialize(\n    audioAPIModule: WeakReference<AudioAPIModule>,\n    reactContext: WeakReference<ReactApplicationContext>,\n  ) {\n    this.audioAPIModule = audioAPIModule\n    this.reactContext = reactContext\n    this.audioManager = reactContext.get()?.getSystemService(Context.AUDIO_SERVICE) as AudioManager\n\n    // Initialize ForegroundServiceManager\n    ForegroundServiceManager.initialize(reactContext)\n\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n      createChannel()\n    }\n\n    // Set up PlaybackNotificationReceiver\n    PlaybackNotificationReceiver.setAudioAPIModule(audioAPIModule.get())\n    this.playbackNotificationReceiver = PlaybackNotificationReceiver()\n\n    // Register PlaybackNotificationReceiver\n    val playbackFilter = IntentFilter(PlaybackNotificationReceiver.ACTION_NOTIFICATION_DISMISSED)\n    playbackFilter.addAction(PlaybackNotification.MEDIA_BUTTON)\n    playbackFilter.addAction(PlaybackNotificationReceiver.ACTION_SKIP_FORWARD)\n    playbackFilter.addAction(PlaybackNotificationReceiver.ACTION_SKIP_BACKWARD)\n\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n      this.reactContext.get()!!.registerReceiver(playbackNotificationReceiver, playbackFilter, Context.RECEIVER_NOT_EXPORTED)\n    } else {\n      ContextCompat.registerReceiver(\n        this.reactContext.get()!!,\n        playbackNotificationReceiver,\n        playbackFilter,\n        ContextCompat.RECEIVER_NOT_EXPORTED,\n      )\n    }\n\n    this.audioFocusListener =\n      AudioFocusListener(WeakReference(this.audioManager), this.audioAPIModule)\n    this.volumeChangeListener = VolumeChangeListener(WeakReference(this.audioManager), this.audioAPIModule)\n\n    // Initialize new notification system\n    this.notificationRegistry = NotificationRegistry(this.reactContext, this.audioAPIModule)\n  }\n\n  fun getDevicePreferredSampleRate(): Double {\n    val sampleRate = this.audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE)\n    return sampleRate.toDouble()\n  }\n\n  fun requestAudioFocus(focus: Int) {\n    audioFocusListener.requestAudioFocus(focus)\n  }\n\n  fun abandonAudioFocus() {\n    audioFocusListener.abandonAudioFocus()\n  }\n\n  fun activelyReclaimSession(enabled: Boolean) {\n    // do nothing on android\n  }\n\n  fun observeVolumeChanges(observe: Boolean) {\n    if (observe) {\n      ContextCompat.registerReceiver(\n        reactContext.get()!!,\n        volumeChangeListener,\n        volumeChangeListener.getIntentFilter(),\n        ContextCompat.RECEIVER_NOT_EXPORTED,\n      )\n    } else {\n      reactContext.get()?.unregisterReceiver(volumeChangeListener)\n    }\n  }\n\n  fun requestRecordingPermissions(permissionListener: PermissionListener) {\n    val permissionAwareActivity = reactContext.get()!!.currentActivity as PermissionAwareActivity\n    permissionAwareActivity.requestPermissions(arrayOf(Manifest.permission.RECORD_AUDIO), RECORDING_REQUEST_CODE, permissionListener)\n  }\n\n  fun checkRecordingPermissions(): String {\n    val context = reactContext.get()!!\n\n    if (context.checkSelfPermission(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED) {\n      return \"Granted\"\n    }\n\n    // Permission not granted - check if we should show rationale\n    val activity = context.currentActivity\n    if (activity != null &&\n      ActivityCompat.shouldShowRequestPermissionRationale(\n        activity,\n        Manifest.permission.RECORD_AUDIO,\n      )\n    ) {\n      // User previously denied but didn't select \"Don't ask again\"\n      return \"Denied\"\n    }\n\n    // Either never asked OR user selected \"Don't ask again\"\n    // Return \"Undetermined\" to match iOS behavior and let caller decide to request\n    return \"Undetermined\"\n  }\n\n  fun requestNotificationPermissions(permissionListener: PermissionListener) {\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n      val permissionAwareActivity = reactContext.get()!!.currentActivity as PermissionAwareActivity\n      permissionAwareActivity.requestPermissions(\n        arrayOf(Manifest.permission.POST_NOTIFICATIONS),\n        PermissionRequestListener.NOTIFICATION_REQUEST_CODE,\n        permissionListener,\n      )\n    } else {\n      // For Android < 13, permission is granted by default\n      val result = Arguments.createMap()\n      result.putString(\"status\", \"Granted\")\n      permissionListener.onRequestPermissionsResult(\n        PermissionRequestListener.NOTIFICATION_REQUEST_CODE,\n        arrayOf(Manifest.permission.POST_NOTIFICATIONS),\n        intArrayOf(PackageManager.PERMISSION_GRANTED),\n      )\n    }\n  }\n\n  fun checkNotificationPermissions(): String {\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {\n      val context = reactContext.get()!!\n\n      if (context.checkSelfPermission(Manifest.permission.POST_NOTIFICATIONS) == PackageManager.PERMISSION_GRANTED) {\n        return \"Granted\"\n      }\n\n      // Permission not granted - check if we should show rationale\n      val activity = context.currentActivity\n      if (activity != null &&\n        ActivityCompat.shouldShowRequestPermissionRationale(\n          activity,\n          Manifest.permission.POST_NOTIFICATIONS,\n        )\n      ) {\n        // User previously denied but didn't select \"Don't ask again\"\n        return \"Denied\"\n      }\n\n      // Either never asked OR user selected \"Don't ask again\"\n      return \"Undetermined\"\n    }\n    // For Android < 13, permission is granted by default\n    return \"Granted\"\n  }\n\n  @RequiresApi(Build.VERSION_CODES.O)\n  private fun createChannel() {\n    val notificationManager =\n      reactContext.get()?.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n\n    val mChannel =\n      NotificationChannel(CHANNEL_ID, \"Audio manager\", NotificationManager.IMPORTANCE_LOW)\n    mChannel.description = \"Audio manager\"\n    mChannel.setShowBadge(false)\n    mChannel.lockscreenVisibility = NotificationCompat.VISIBILITY_PUBLIC\n    notificationManager.createNotificationChannel(mChannel)\n  }\n\n  @RequiresApi(Build.VERSION_CODES.O)\n  fun getDevicesInfo(): ReadableMap {\n    val availableInputs = Arguments.createArray()\n    val availableOutputs = Arguments.createArray()\n\n    for (inputDevice in this.audioManager.getDevices(AudioManager.GET_DEVICES_INPUTS)) {\n      val deviceInfo = Arguments.createMap()\n      deviceInfo.putString(\"id\", inputDevice.getId().toString())\n      deviceInfo.putString(\"name\", inputDevice.productName.toString())\n      deviceInfo.putString(\"type\", parseDeviceType(inputDevice))\n\n      availableInputs.pushMap(deviceInfo)\n    }\n\n    for (outputDevice in this.audioManager.getDevices(AudioManager.GET_DEVICES_OUTPUTS)) {\n      val deviceInfo = Arguments.createMap()\n      deviceInfo.putString(\"id\", outputDevice.getId().toString())\n      deviceInfo.putString(\"name\", outputDevice.productName.toString())\n      deviceInfo.putString(\"type\", parseDeviceType(outputDevice))\n\n      availableOutputs.pushMap(deviceInfo)\n    }\n\n    val devicesInfo = Arguments.createMap()\n\n    devicesInfo.putArray(\"currentInputs\", Arguments.createArray())\n    devicesInfo.putArray(\"currentOutputs\", Arguments.createArray())\n    devicesInfo.putArray(\"availableInputs\", availableInputs)\n    devicesInfo.putArray(\"availableOutputs\", availableOutputs)\n\n    return devicesInfo\n  }\n\n  @RequiresApi(Build.VERSION_CODES.O)\n  fun parseDeviceType(device: AudioDeviceInfo): String =\n    when (device.type) {\n      AudioDeviceInfo.TYPE_BUILTIN_MIC -> \"Built-in Mic\"\n      AudioDeviceInfo.TYPE_BUILTIN_EARPIECE -> \"Built-in Earpiece\"\n      AudioDeviceInfo.TYPE_BUILTIN_SPEAKER -> \"Built-in Speaker\"\n      AudioDeviceInfo.TYPE_WIRED_HEADSET -> \"Wired Headset\"\n      AudioDeviceInfo.TYPE_WIRED_HEADPHONES -> \"Wired Headphones\"\n      AudioDeviceInfo.TYPE_BLUETOOTH_A2DP -> \"Bluetooth A2DP\"\n      AudioDeviceInfo.TYPE_BLUETOOTH_SCO -> \"Bluetooth SCO\"\n      else -> \"Other (${device.type})\"\n    }\n\n  // Notification system methods\n  @RequiresPermission(Manifest.permission.POST_NOTIFICATIONS)\n  fun showNotification(\n    type: String,\n    key: String,\n    options: ReadableMap?,\n  ) {\n    notificationRegistry.showNotification(key, type, options)\n  }\n\n  fun hideNotification(key: String) {\n    notificationRegistry.hideNotification(key)\n  }\n\n  fun isNotificationActive(key: String): Boolean = notificationRegistry.isNotificationActive(key)\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/NativeFileInfo.kt",
    "content": "package com.swmansion.audioapi.system\n\nimport com.facebook.react.bridge.ReactApplicationContext\nimport java.lang.ref.WeakReference\n\nobject NativeFileInfo {\n  private lateinit var reactContext: WeakReference<ReactApplicationContext>\n\n  fun initialize(reactContext: WeakReference<ReactApplicationContext>) {\n    this.reactContext = reactContext\n  }\n\n  @JvmStatic\n  fun getFilesDir(): String = reactContext.get()?.filesDir?.absolutePath ?: \"\"\n\n  @JvmStatic\n  fun getCacheDir(): String = reactContext.get()?.cacheDir?.absolutePath ?: \"\"\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/PermissionRequestListener.kt",
    "content": "package com.swmansion.audioapi.system\n\nimport android.content.pm.PackageManager\nimport com.facebook.react.bridge.Promise\nimport com.facebook.react.modules.core.PermissionListener\n\nclass PermissionRequestListener(\n  private val promise: Promise,\n) : PermissionListener {\n  companion object {\n    const val RECORDING_REQUEST_CODE = 1234\n    const val NOTIFICATION_REQUEST_CODE = 1235\n  }\n\n  override fun onRequestPermissionsResult(\n    requestCode: Int,\n    permissions: Array<String>,\n    grantResults: IntArray,\n  ): Boolean {\n    if (requestCode == RECORDING_REQUEST_CODE || requestCode == NOTIFICATION_REQUEST_CODE) {\n      if (grantResults.isEmpty()) {\n        this.promise.resolve(\"Undetermined\")\n      } else {\n        val granted = grantResults[0] == PackageManager.PERMISSION_GRANTED\n        if (granted) {\n          this.promise.resolve(\"Granted\")\n        } else {\n          this.promise.resolve(\"Denied\")\n        }\n      }\n    }\n    return true\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/VolumeChangeListener.kt",
    "content": "package com.swmansion.audioapi.system\n\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.content.IntentFilter\nimport android.media.AudioManager\nimport com.swmansion.audioapi.AudioAPIModule\nimport java.lang.ref.WeakReference\nimport java.util.HashMap\n\nclass VolumeChangeListener(\n  private val audioManager: WeakReference<AudioManager>,\n  private val audioAPIModule: WeakReference<AudioAPIModule>,\n) : BroadcastReceiver() {\n  override fun onReceive(\n    context: Context?,\n    intent: Intent?,\n  ) {\n    val currentVolume = audioManager.get()?.getStreamVolume(AudioManager.STREAM_MUSIC)?.toDouble()!!\n    val maxVolume = audioManager.get()?.getStreamMaxVolume(AudioManager.STREAM_MUSIC)?.toDouble()!!\n\n    val body = HashMap<String, Any>().apply { put(\"value\", currentVolume / maxVolume) }\n    audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.VOLUME_CHANGE.ordinal, body)\n  }\n\n  fun getIntentFilter(): IntentFilter {\n    val intentFilter = IntentFilter()\n    intentFilter.addAction(\"android.media.VOLUME_CHANGED_ACTION\")\n    return intentFilter\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/notification/BaseNotification.kt",
    "content": "package com.swmansion.audioapi.system.notification\n\nimport android.app.Notification\nimport com.facebook.react.bridge.ReadableMap\n\n/**\n * Base interface for all notification types.\n * Implementations should handle their own notification channel creation,\n * notification building, and lifecycle management.\n */\ninterface BaseNotification {\n  /**\n   * Show or update the notification with the provided options.\n   * This method should create/update the notification and prepare it for display.\n   * It handles both initial display and updates.\n   *\n   * @param options Configuration options from JavaScript side\n   * @return The built Notification ready to be shown\n   */\n  fun show(options: ReadableMap?): Notification\n\n  /**\n   * Hide the notification and cleanup resources.\n   * This should clear any stored data and stop any ongoing processes.\n   */\n  fun hide()\n\n  /**\n   * Get the unique ID for this notification.\n   * Used by the NotificationManager to track and manage notifications.\n   */\n  fun getNotificationId(): Int\n\n  /**\n   * Get the channel ID for this notification.\n   * Required for Android O+ notification channels.\n   */\n  fun getChannelId(): String\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/notification/NotificationRegistry.kt",
    "content": "package com.swmansion.audioapi.system.notification\n\nimport android.app.Notification\nimport android.util.Log\nimport androidx.annotation.RequiresPermission\nimport androidx.core.app.NotificationManagerCompat\nimport com.facebook.react.bridge.ReactApplicationContext\nimport com.facebook.react.bridge.ReadableMap\nimport com.swmansion.audioapi.system.ForegroundServiceManager\nimport java.lang.ref.WeakReference\n\n/**\n * Central notification registry that manages multiple notification instances.\n * Automatically handles foreground service lifecycle based on active notifications.\n */\nclass NotificationRegistry(\n  private val reactContext: WeakReference<ReactApplicationContext>,\n  private val audioAPIModule: WeakReference<com.swmansion.audioapi.AudioAPIModule>,\n) {\n  companion object {\n    private const val TAG = \"NotificationRegistry\"\n\n    // Store last built notifications for foreground service access\n    private val builtNotifications = mutableMapOf<Int, Notification>()\n\n    fun getBuiltNotification(notificationId: Int): Notification? = builtNotifications[notificationId]\n  }\n\n  private val notifications = mutableMapOf<String, BaseNotification>()\n  private val activeNotifications = mutableMapOf<String, Boolean>()\n\n  /**\n   * Show or update a notification.\n   * Automatically creates the notification instance on first call.\n   * If notification is not visible, it will be shown and subscribed to foreground service.\n   * If already visible, it will be updated.\n   *\n   * @param key The unique identifier of the notification\n   * @param type The type of notification (only used for first creation)\n   * @param options Configuration options from JavaScript\n   */\n  @RequiresPermission(android.Manifest.permission.POST_NOTIFICATIONS)\n  fun showNotification(\n    key: String,\n    type: String,\n    options: ReadableMap?,\n  ) {\n    // Auto-create notification if it doesn't exist\n    if (!notifications.containsKey(key)) {\n      createNotification(type, key)\n    }\n\n    val notification = notifications[key]\n    if (notification == null) {\n      Log.w(TAG, \"Notification not found: $key\")\n      return\n    }\n\n    try {\n      val wasActive = isNotificationActive(key)\n\n      // Build/update the notification\n      val builtNotification = notification.show(options)\n      displayNotification(notification.getNotificationId(), builtNotification)\n\n      // Subscribe to foreground service if not already active\n      if (!wasActive) {\n        ForegroundServiceManager.subscribe(notification)\n        activeNotifications[key] = true\n        Log.d(TAG, \"Showing notification: $key (subscribed to foreground service)\")\n      } else {\n        Log.d(TAG, \"Updating notification: $key\")\n      }\n    } catch (e: Exception) {\n      Log.e(TAG, \"Error showing notification $key: ${e.message}\", e)\n    }\n  }\n\n  /**\n   * Hide a notification.\n   *\n   * @param key The unique identifier of the notification\n   */\n  fun hideNotification(key: String) {\n    val notification = notifications[key]\n    if (notification == null) {\n      // Silently ignore if notification doesn't exist\n      return\n    }\n\n    try {\n      // Only hide if currently active\n      if (activeNotifications.getOrDefault(key, false)) {\n        cancelNotification(notification.getNotificationId())\n        notification.hide()\n        activeNotifications[key] = false\n\n        // Unsubscribe from foreground service\n        ForegroundServiceManager.unsubscribe(notification)\n\n        Log.d(TAG, \"Hiding notification: $key (unsubscribed from foreground service)\")\n      }\n    } catch (e: Exception) {\n      Log.e(TAG, \"Error hiding notification $key: ${e.message}\", e)\n    }\n  }\n\n  /**\n   * Create a notification instance.\n   *\n   * @param type The type of notification to create\n   * @param key Unique identifier for this notification\n   */\n  private fun createNotification(\n    type: String,\n    key: String,\n  ) {\n    val notification =\n      when (type) {\n        \"playback\" -> {\n          PlaybackNotification(\n            reactContext,\n            audioAPIModule,\n            PlaybackNotification.ID,\n            \"audio_playback\",\n          )\n        }\n\n        \"recording\" -> {\n          RecordingNotification(\n            reactContext,\n            audioAPIModule,\n            RecordingNotification.ID,\n            \"audio_recording4\",\n          )\n        }\n\n        else -> {\n          throw IllegalArgumentException(\"Unknown notification type: $type\")\n        }\n      }\n\n    notifications[key] = notification\n    Log.d(TAG, \"Created notification: $key (type: $type)\")\n  }\n\n  /**\n   * Destroy and cleanup a notification.\n   *\n   * @param key The unique identifier of the notification\n   */\n  fun destroyNotification(key: String) {\n    hideNotification(key)\n    notifications.remove(key)\n    activeNotifications.remove(key)\n    Log.d(TAG, \"Destroyed notification: $key\")\n  }\n\n  /**\n   * Check if a notification is currently active.\n   */\n  fun isNotificationActive(key: String): Boolean = activeNotifications.getOrDefault(key, false)\n\n  /**\n   * Get all registered notification keys.\n   */\n  fun getRegisteredKeys(): Set<String> = notifications.keys.toSet()\n\n  /**\n   * Cleanup all notifications.\n   */\n  fun cleanup() {\n    notifications.keys.toList().forEach { key ->\n      hideNotification(key)\n    }\n    notifications.clear()\n    activeNotifications.clear()\n    builtNotifications.clear()\n\n    // Cleanup foreground service manager\n    ForegroundServiceManager.cleanup()\n\n    Log.d(TAG, \"Cleaned up all notifications\")\n  }\n\n  @RequiresPermission(android.Manifest.permission.POST_NOTIFICATIONS)\n  private fun displayNotification(\n    id: Int,\n    notification: Notification,\n  ) {\n    val context = reactContext.get() ?: throw IllegalStateException(\"React context is null\")\n    Log.d(TAG, \"Displaying notification with ID: $id\")\n    try {\n      // Store notification for foreground service access\n      builtNotifications[id] = notification\n\n      NotificationManagerCompat.from(context).notify(id, notification)\n      Log.d(TAG, \"Notification posted successfully with ID: $id\")\n    } catch (e: Exception) {\n      Log.e(TAG, \"Error posting notification: ${e.message}\", e)\n    }\n  }\n\n  private fun cancelNotification(id: Int) {\n    val context = reactContext.get() ?: return\n    NotificationManagerCompat.from(context).cancel(id)\n    // Clean up stored notification\n    builtNotifications.remove(id)\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotification.kt",
    "content": "package com.swmansion.audioapi.system.notification\n\nimport android.app.Notification\nimport android.app.PendingIntent\nimport android.content.Context\nimport android.content.Intent\nimport android.graphics.Bitmap\nimport android.graphics.BitmapFactory\nimport android.graphics.drawable.BitmapDrawable\nimport android.os.Build\nimport android.support.v4.media.MediaMetadataCompat\nimport android.support.v4.media.session.MediaSessionCompat\nimport android.support.v4.media.session.PlaybackStateCompat\nimport android.view.KeyEvent\nimport androidx.core.app.NotificationCompat\nimport androidx.media.app.NotificationCompat.MediaStyle\nimport com.facebook.react.bridge.ReactApplicationContext\nimport com.facebook.react.bridge.ReadableMap\nimport com.facebook.react.bridge.ReadableType\nimport com.swmansion.audioapi.AudioAPIModule\nimport com.swmansion.audioapi.R\nimport com.swmansion.audioapi.system.AudioEvent\nimport java.io.IOException\nimport java.lang.ref.WeakReference\nimport java.net.URL\n\n/**\n * PlaybackNotification\n *\n * This notification:\n * - Shows media metadata (title, artist, album, artwork)\n * - Supports playback controls (play, pause, next, previous, skip)\n * - Integrates with Android MediaSession for lock screen controls\n * - Is persistent and cannot be swiped away when playing\n * - Notifies its dismissal via PlaybackNotificationReceiver\n */\nclass PlaybackNotification(\n  private val reactContext: WeakReference<ReactApplicationContext>,\n  private val audioAPIModule: WeakReference<AudioAPIModule>,\n  private val notificationId: Int,\n  private val channelId: String,\n) : BaseNotification {\n  companion object {\n    const val MEDIA_BUTTON = \"playback_notification_media_button\"\n    const val ACTION_SKIP_FORWARD = \"com.swmansion.audioapi.ACTION_SKIP_FORWARD\"\n    const val ACTION_SKIP_BACKWARD = \"com.swmansion.audioapi.ACTION_SKIP_BACKWARD\"\n    const val ID = 100\n  }\n\n  private var mediaSession: MediaSessionCompat? = null\n  private var notificationBuilder: NotificationCompat.Builder? = null\n  private var pb: PlaybackStateCompat.Builder = PlaybackStateCompat.Builder()\n  private var state: PlaybackStateCompat = pb.build()\n  private var controls: Long = 0\n\n  private var isPlaying: Boolean = false\n  private var isInitialized = false\n\n  // Metadata\n  private var title: String? = null\n  private var artist: String? = null\n  private var album: String? = null\n  private var artwork: Bitmap? = null\n  private var duration: Long = 0L\n  private var elapsedTime: Long = 0L\n  private var speed: Float = 1.0F\n  private var playbackStateVal: Int = PlaybackStateCompat.STATE_PAUSED\n\n  private var artworkThread: Thread? = null\n\n  private fun initializeIfNeeded() {\n    if (isInitialized) return\n    val context = reactContext.get() ?: return\n\n    createNotificationChannel()\n\n    mediaSession = MediaSessionCompat(context, \"PlaybackNotification\")\n\n    mediaSession?.setCallback(\n      object : MediaSessionCompat.Callback() {\n        override fun onPlay() {\n          audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_PLAY.ordinal, mapOf())\n        }\n\n        override fun onPause() {\n          audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_PAUSE.ordinal, mapOf())\n        }\n\n        override fun onStop() {\n          audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_STOP.ordinal, mapOf())\n        }\n\n        override fun onSkipToNext() {\n          audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_NEXT_TRACK.ordinal, mapOf())\n        }\n\n        override fun onSkipToPrevious() {\n          audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_PREVIOUS_TRACK.ordinal, mapOf())\n        }\n\n        override fun onFastForward() {\n          val body = HashMap<String, Any>().apply { put(\"value\", 15) }\n          audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_SKIP_FORWARD.ordinal, body)\n        }\n\n        override fun onRewind() {\n          val body = HashMap<String, Any>().apply { put(\"value\", 15) }\n          audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_SKIP_BACKWARD.ordinal, body)\n        }\n\n        override fun onSeekTo(pos: Long) {\n          val body = HashMap<String, Any>().apply { put(\"value\", pos / 1000.0) }\n          audioAPIModule.get()?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_SEEK_TO.ordinal, body)\n        }\n\n        override fun onCustomAction(\n          action: String?,\n          extras: android.os.Bundle?,\n        ) {\n          if (action == \"SkipForward\") {\n            onFastForward()\n          } else if (action == \"SkipBackward\") {\n            onRewind()\n          }\n        }\n      },\n    )\n\n    notificationBuilder =\n      NotificationCompat\n        .Builder(context, channelId)\n        .setSmallIcon(android.R.drawable.ic_media_play)\n        .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)\n        .setPriority(NotificationCompat.PRIORITY_HIGH)\n\n    val packageName = context.packageName\n    val openAppIntent = context.packageManager.getLaunchIntentForPackage(packageName)\n    if (openAppIntent != null) {\n      val pendingIntent =\n        PendingIntent.getActivity(\n          context,\n          0,\n          openAppIntent,\n          PendingIntent.FLAG_IMMUTABLE,\n        )\n      notificationBuilder?.setContentIntent(pendingIntent)\n    }\n\n    val deleteIntent = Intent(PlaybackNotificationReceiver.ACTION_NOTIFICATION_DISMISSED)\n    deleteIntent.setPackage(context.packageName)\n    val deletePendingIntent =\n      PendingIntent.getBroadcast(\n        context,\n        notificationId,\n        deleteIntent,\n        PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT,\n      )\n    notificationBuilder?.setDeleteIntent(deletePendingIntent)\n\n    pb.setActions(controls)\n    mediaSession?.isActive = true\n\n    isInitialized = true\n  }\n\n  override fun show(options: ReadableMap?): Notification {\n    initializeIfNeeded()\n    if (options != null) {\n      updateInternal(options)\n    }\n    return buildNotification()\n  }\n\n  override fun hide() {\n    if (!isInitialized) return\n\n    if (artworkThread != null && artworkThread!!.isAlive) {\n      artworkThread!!.interrupt()\n    }\n    artworkThread = null\n\n    mediaSession?.isActive = false\n    mediaSession?.release()\n    mediaSession = null\n    notificationBuilder = null\n    isInitialized = false\n\n    controls = 0\n    isPlaying = false\n    artwork = null\n  }\n\n  override fun getNotificationId(): Int = notificationId\n\n  override fun getChannelId(): String = channelId\n\n  private fun updateInternal(info: ReadableMap) {\n    if (info.hasKey(\"control\") && info.hasKey(\"enabled\")) {\n      enableControl(info.getString(\"control\"), info.getBoolean(\"enabled\"))\n    }\n\n    val md = MediaMetadataCompat.Builder()\n\n    if (info.hasKey(\"title\")) title = info.getString(\"title\")\n    if (info.hasKey(\"artist\")) artist = info.getString(\"artist\")\n    if (info.hasKey(\"album\")) album = info.getString(\"album\")\n    if (info.hasKey(\"duration\")) duration = (info.getDouble(\"duration\") * 1000).toLong()\n\n    md.putString(MediaMetadataCompat.METADATA_KEY_TITLE, title)\n    md.putString(MediaMetadataCompat.METADATA_KEY_ARTIST, artist)\n    md.putString(MediaMetadataCompat.METADATA_KEY_ALBUM, album)\n    md.putLong(MediaMetadataCompat.METADATA_KEY_DURATION, duration)\n\n    notificationBuilder?.setContentTitle(title)\n    notificationBuilder?.setContentText(artist)\n    notificationBuilder?.setContentInfo(album)\n\n    if (info.hasKey(\"artwork\")) {\n      if (artworkThread != null && artworkThread!!.isAlive) {\n        artworkThread!!.interrupt()\n      }\n\n      var localArtwork = false\n      val artworkUri =\n        if (info.getType(\"artwork\") == ReadableType.Map) {\n          localArtwork = true\n          info.getMap(\"artwork\")?.getString(\"uri\")\n        } else {\n          info.getString(\"artwork\")\n        }\n\n      if (artworkUri != null) {\n        artworkThread =\n          Thread {\n            try {\n              val bitmap = loadArtwork(artworkUri, localArtwork)\n              if (bitmap != null) {\n                artwork = bitmap\n                val context = reactContext.get()\n                context?.runOnUiQueueThread {\n                  notificationBuilder?.setLargeIcon(bitmap)\n\n                  val currentMetadata = mediaSession?.controller?.metadata\n                  val newBuilder = MediaMetadataCompat.Builder(currentMetadata ?: MediaMetadataCompat.Builder().build())\n                  mediaSession?.setMetadata(newBuilder.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, bitmap).build())\n\n                  // Trigger update\n                  val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as android.app.NotificationManager\n                  notificationManager.notify(notificationId, buildNotification())\n                }\n              }\n            } catch (ex: Exception) {\n              ex.printStackTrace()\n            }\n          }\n        artworkThread!!.start()\n      }\n    }\n\n    if (info.hasKey(\"speed\")) {\n      speed = info.getDouble(\"speed\").toFloat()\n    }\n\n    if (isPlaying && speed == 0F) {\n      speed = 1F\n    }\n\n    if (info.hasKey(\"elapsedTime\")) {\n      elapsedTime = (info.getDouble(\"elapsedTime\") * 1000).toLong()\n    } else {\n      if (state.position != PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN) {\n        elapsedTime = state.position\n      }\n    }\n\n    if (info.hasKey(\"state\")) {\n      when (info.getString(\"state\")) {\n        \"playing\", \"state_playing\" -> playbackStateVal = PlaybackStateCompat.STATE_PLAYING\n        \"paused\", \"state_paused\" -> playbackStateVal = PlaybackStateCompat.STATE_PAUSED\n      }\n    }\n\n    updatePlaybackState(playbackStateVal)\n\n    if (artwork != null) {\n      md.putBitmap(MediaMetadataCompat.METADATA_KEY_ART, artwork)\n    }\n    mediaSession?.setMetadata(md.build())\n\n    updateNotificationsActions()\n  }\n\n  private fun enableControl(\n    name: String?,\n    enabled: Boolean,\n  ) {\n    if (name == null) return\n    var controlValue = 0L\n    when (name) {\n      \"play\" -> controlValue = PlaybackStateCompat.ACTION_PLAY\n      \"pause\" -> controlValue = PlaybackStateCompat.ACTION_PAUSE\n      \"stop\" -> controlValue = PlaybackStateCompat.ACTION_STOP\n      \"nextTrack\" -> controlValue = PlaybackStateCompat.ACTION_SKIP_TO_NEXT\n      \"previousTrack\" -> controlValue = PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS\n      \"skipForward\" -> controlValue = PlaybackStateCompat.ACTION_FAST_FORWARD\n      \"skipBackward\" -> controlValue = PlaybackStateCompat.ACTION_REWIND\n      \"seekTo\" -> controlValue = PlaybackStateCompat.ACTION_SEEK_TO\n    }\n\n    controls =\n      if (enabled) {\n        controls or controlValue\n      } else {\n        controls and controlValue.inv()\n      }\n\n    updatePlaybackActionState()\n    updateNotificationsActions()\n  }\n\n  private fun updatePlaybackActionState() {\n    val builder = PlaybackStateCompat.Builder()\n    builder.setActions(controls)\n\n    if (hasControl(PlaybackStateCompat.ACTION_REWIND)) {\n      builder.addCustomAction(\n        PlaybackStateCompat.CustomAction\n          .Builder(\n            \"SkipBackward\",\n            \"Skip Backward\",\n            R.drawable.skip_backward_15,\n          ).build(),\n      )\n    }\n\n    if (hasControl(PlaybackStateCompat.ACTION_FAST_FORWARD)) {\n      builder.addCustomAction(\n        PlaybackStateCompat.CustomAction\n          .Builder(\n            \"SkipForward\",\n            \"Skip Forward\",\n            R.drawable.skip_forward_15,\n          ).build(),\n      )\n    }\n\n    pb = builder\n  }\n\n  private fun updatePlaybackState(playbackStateCode: Int) {\n    isPlaying = playbackStateCode == PlaybackStateCompat.STATE_PLAYING\n\n    pb.setState(playbackStateCode, elapsedTime, speed)\n    state = pb.build()\n    mediaSession?.setPlaybackState(state)\n\n    notificationBuilder?.setOngoing(isPlaying)\n  }\n\n  private fun updateNotificationsActions() {\n    notificationBuilder?.clearActions()\n\n    val style = MediaStyle()\n    style.setMediaSession(mediaSession?.sessionToken)\n\n    val context = reactContext.get() ?: return\n\n    var index = 0\n    val actionsList = mutableListOf<Int>()\n\n    if (hasControl(PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS)) {\n      notificationBuilder?.addAction(\n        createAction(\"previousTrack\", \"Previous track\", android.R.drawable.ic_media_previous, PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS),\n      )\n      actionsList.add(index++)\n    }\n\n    if (hasControl(PlaybackStateCompat.ACTION_REWIND)) {\n      notificationBuilder?.addAction(\n        createAction(\"skip_backward\", \"Skip Backward\", R.drawable.skip_backward_15, PlaybackStateCompat.ACTION_REWIND),\n      )\n      actionsList.add(index++)\n    }\n\n    if (isPlaying) {\n      if (hasControl(PlaybackStateCompat.ACTION_PAUSE)) {\n        notificationBuilder?.addAction(\n          createAction(\"pause\", \"Pause\", android.R.drawable.ic_media_pause, PlaybackStateCompat.ACTION_PAUSE),\n        )\n        actionsList.add(index++)\n      } else if (hasControl(PlaybackStateCompat.ACTION_STOP)) {\n        notificationBuilder?.addAction(\n          createAction(\"stop\", \"Stop\", R.drawable.stop, PlaybackStateCompat.ACTION_STOP),\n        )\n        actionsList.add(index++)\n      }\n    } else {\n      if (hasControl(PlaybackStateCompat.ACTION_PLAY)) {\n        notificationBuilder?.addAction(createAction(\"play\", \"Play\", android.R.drawable.ic_media_play, PlaybackStateCompat.ACTION_PLAY))\n        actionsList.add(index++)\n      }\n    }\n\n    if (hasControl(PlaybackStateCompat.ACTION_FAST_FORWARD)) {\n      notificationBuilder?.addAction(\n        createAction(\"skip_forward\", \"Skip Forward\", R.drawable.skip_forward_15, PlaybackStateCompat.ACTION_FAST_FORWARD),\n      )\n      actionsList.add(index++)\n    }\n\n    if (hasControl(PlaybackStateCompat.ACTION_SKIP_TO_NEXT)) {\n      notificationBuilder?.addAction(\n        createAction(\"nextTrack\", \"Next track\", android.R.drawable.ic_media_next, PlaybackStateCompat.ACTION_SKIP_TO_NEXT),\n      )\n      actionsList.add(index++)\n    }\n\n    if (actionsList.size > 3) {\n      style.setShowActionsInCompactView(actionsList[0], actionsList[1], actionsList[2])\n    } else {\n      style.setShowActionsInCompactView(*actionsList.toIntArray())\n    }\n\n    notificationBuilder?.setStyle(style)\n  }\n\n  private fun createAction(\n    name: String,\n    title: String,\n    icon: Int,\n    mediaAction: Long,\n  ): NotificationCompat.Action {\n    val context = reactContext.get()!!\n    val pendingIntent: PendingIntent\n\n    if (name == \"skip_forward\" || name == \"skip_backward\") {\n      val customActionName = if (name == \"skip_forward\") ACTION_SKIP_FORWARD else ACTION_SKIP_BACKWARD\n      val intent = Intent(customActionName)\n      intent.setPackage(context.packageName)\n      pendingIntent =\n        PendingIntent.getBroadcast(\n          context,\n          if (name == \"skip_forward\") 1001 else 1002,\n          intent,\n          PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT,\n        )\n    } else {\n      val keyCode = PlaybackStateCompat.toKeyCode(mediaAction)\n      val intent = Intent(MEDIA_BUTTON)\n      intent.setPackage(context.packageName)\n      intent.putExtra(Intent.EXTRA_KEY_EVENT, KeyEvent(KeyEvent.ACTION_DOWN, keyCode))\n      pendingIntent =\n        PendingIntent.getBroadcast(\n          context,\n          keyCode,\n          intent,\n          PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT,\n        )\n    }\n    return NotificationCompat.Action(icon, title, pendingIntent)\n  }\n\n  private fun hasControl(control: Long): Boolean = (controls and control) == control\n\n  private fun loadArtwork(\n    url: String,\n    local: Boolean,\n  ): Bitmap? {\n    val context = reactContext.get() ?: return null\n\n    return try {\n      if (local && !url.startsWith(\"http\")) {\n        val helper =\n          com.facebook.react.views.imagehelper.ResourceDrawableIdHelper\n            .getInstance()\n        val drawable = helper.getResourceDrawable(context, url)\n        if (drawable is BitmapDrawable) {\n          drawable.bitmap\n        } else {\n          BitmapFactory.decodeFile(url)\n        }\n      } else {\n        val connection = URL(url).openConnection()\n        connection.connect()\n        val inputStream = connection.getInputStream()\n        val bitmap = BitmapFactory.decodeStream(inputStream)\n        inputStream.close()\n        bitmap\n      }\n    } catch (e: IOException) {\n      null\n    } catch (e: Exception) {\n      null\n    }\n  }\n\n  private fun createNotificationChannel() {\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n      val context = reactContext.get() ?: return\n      val manager = context.getSystemService(Context.NOTIFICATION_SERVICE) as android.app.NotificationManager\n      val channel =\n        android.app.NotificationChannel(\n          channelId,\n          \"Media Playback\",\n          android.app.NotificationManager.IMPORTANCE_LOW,\n        )\n      channel.description = \"Media playback controls\"\n      channel.setShowBadge(false)\n      channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC\n      manager.createNotificationChannel(channel)\n    }\n  }\n\n  private fun buildNotification(): Notification =\n    notificationBuilder?.build() ?: throw IllegalStateException(\"Notification not initialized\")\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/notification/PlaybackNotificationReceiver.kt",
    "content": "package com.swmansion.audioapi.system.notification\n\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport com.swmansion.audioapi.AudioAPIModule\nimport com.swmansion.audioapi.system.AudioEvent\n\n/**\n * Broadcast receiver for handling playback notification dismissal.\n */\nclass PlaybackNotificationReceiver : BroadcastReceiver() {\n  companion object {\n    const val ACTION_NOTIFICATION_DISMISSED = \"com.swmansion.audioapi.PLAYBACK_NOTIFICATION_DISMISSED\"\n    const val ACTION_SKIP_FORWARD = \"com.swmansion.audioapi.ACTION_SKIP_FORWARD\"\n    const val ACTION_SKIP_BACKWARD = \"com.swmansion.audioapi.ACTION_SKIP_BACKWARD\"\n\n    private var audioAPIModule: AudioAPIModule? = null\n\n    fun setAudioAPIModule(module: AudioAPIModule?) {\n      audioAPIModule = module\n    }\n  }\n\n  override fun onReceive(\n    context: Context?,\n    intent: Intent?,\n  ) {\n    when (intent?.action) {\n      ACTION_NOTIFICATION_DISMISSED -> {\n        audioAPIModule?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_DISMISSED.ordinal, mapOf())\n      }\n\n      ACTION_SKIP_FORWARD -> {\n        val body = HashMap<String, Any>().apply { put(\"value\", 15) }\n        audioAPIModule?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_SKIP_FORWARD.ordinal, body)\n      }\n\n      ACTION_SKIP_BACKWARD -> {\n        val body = HashMap<String, Any>().apply { put(\"value\", 15) }\n        audioAPIModule?.invokeHandlerWithEventNameAndEventBody(AudioEvent.PLAYBACK_NOTIFICATION_SKIP_BACKWARD.ordinal, body)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotification.kt",
    "content": "package com.swmansion.audioapi.system.notification\n\nimport android.app.Notification\nimport android.app.NotificationChannel\nimport android.app.NotificationManager\nimport android.app.PendingIntent\nimport android.content.ComponentCallbacks\nimport android.content.Context\nimport android.content.Intent\nimport android.content.IntentFilter\nimport android.content.res.Configuration\nimport android.graphics.Color\nimport android.graphics.drawable.Icon\nimport android.os.Build\nimport android.util.Log\nimport android.widget.RemoteViews\nimport androidx.annotation.RequiresApi\nimport androidx.core.app.NotificationCompat\nimport androidx.core.content.ContextCompat\nimport com.facebook.react.bridge.ReactApplicationContext\nimport com.facebook.react.bridge.ReadableMap\nimport com.swmansion.audioapi.AudioAPIModule\nimport com.swmansion.audioapi.R\nimport com.swmansion.audioapi.system.notification.state.RecordingNotificationState\nimport java.lang.ref.WeakReference\n\nclass RecordingNotification(\n  private val reactContext: WeakReference<ReactApplicationContext>,\n  private val audioAPIModule: WeakReference<AudioAPIModule>,\n  private val notificationId: Int,\n  private val channelId: String,\n) : BaseNotification,\n  ComponentCallbacks {\n  companion object {\n    private const val TAG = \"RecordingNotification\"\n    const val ID = 200\n  }\n\n  private var state: RecordingNotificationState =\n    RecordingNotificationState(\n      darkTheme =\n        reactContext\n          .get()!!\n          .resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES,\n      initialized = false,\n    )\n\n  private fun initializeNotification() {\n    val context = reactContext.get() ?: throw IllegalStateException(\"React context is null\")\n    if (!state.initialized) {\n      context.registerComponentCallbacks(this)\n      createNotificationChannel(context)\n      state.receiver =\n        RecordingNotificationReceiver(audioAPIModule.get()!!)\n      val filter =\n        IntentFilter().apply {\n          addAction(RecordingNotificationReceiver.NOTIFICATION_RECORDING_STOPPED)\n          addAction(RecordingNotificationReceiver.NOTIFICATION_RECORDING_RESUMED)\n        }\n      ContextCompat.registerReceiver(\n        context,\n        state.receiver,\n        filter,\n        ContextCompat.RECEIVER_NOT_EXPORTED,\n      )\n\n      state.pauseIntent =\n        Intent(RecordingNotificationReceiver.NOTIFICATION_RECORDING_STOPPED).apply {\n          `package` = context.packageName\n        }\n\n      state.resumeIntent =\n        Intent(RecordingNotificationReceiver.NOTIFICATION_RECORDING_RESUMED).apply {\n          `package` = context.packageName\n        }\n      state.darkTheme = context.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES\n      state.initialized = true\n    }\n  }\n\n  override fun show(options: ReadableMap?): Notification {\n    initializeNotification()\n    val context = reactContext.get() ?: throw IllegalStateException(\"React context is null\")\n    if (options != state.cachedRNOptions) {\n      state.cachedRNOptions = options\n      parseMapFromRN(options)\n    }\n    val builder = getBuilder()\n\n    if (state.smallIconResourceName != null) {\n      builder.setSmallIcon(context.resources.getIdentifier(state.smallIconResourceName, \"drawable\", context.packageName))\n    }\n\n    if (state.largeIconResourceName != null) {\n      val icon =\n        Icon.createWithResource(\n          context,\n          context.resources.getIdentifier(state.largeIconResourceName, \"drawable\", context.packageName),\n        )\n      builder.setLargeIcon(icon)\n    }\n\n    if (state.backgroundColor != null) {\n      builder.setColor(state.backgroundColor!!)\n    }\n\n    val collapsedView = RemoteViews(context.packageName, R.layout.notification_collapsed)\n    val expandedView = RemoteViews(context.packageName, R.layout.notification_expanded)\n\n    val (pauseResumePendingIntent, iconId) = setupPauseResumeIntent(context)\n\n    setupRemoteView(listOf(collapsedView, expandedView), pauseResumePendingIntent, iconId)\n\n    builder\n      .setStyle(NotificationCompat.DecoratedCustomViewStyle())\n      .setCustomContentView(collapsedView)\n      .setCustomBigContentView(expandedView)\n      .setContentTitle(state.title)\n      .setContentText(state.contentText)\n\n    if (state.backgroundColor != null) {\n      builder.setColor(state.backgroundColor!!)\n    }\n\n    return builder.build()\n  }\n\n  private fun setupPauseResumeIntent(context: Context): Pair<PendingIntent, Int> {\n    val pauseResumeIntent =\n      if (state.paused) {\n        state.resumeIntent\n      } else {\n        state.pauseIntent\n      }\n\n    val pauseResumePendingIntent =\n      PendingIntent.getBroadcast(\n        context,\n        0,\n        pauseResumeIntent!!,\n        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE,\n      )\n\n    val pauseId =\n      if (state.pauseIconResourceName != null) {\n        context.resources.getIdentifier(state.pauseIconResourceName, \"drawable\", context.packageName)\n      } else {\n        android.R.drawable.ic_media_pause\n      }\n    val resumeId =\n      if (state.resumeIconResourceName != null) {\n        context.resources.getIdentifier(state.resumeIconResourceName, \"drawable\", context.packageName)\n      } else {\n        android.R.drawable.ic_media_play\n      }\n\n    val iconId = if (state.paused) resumeId else pauseId\n    return pauseResumePendingIntent to iconId\n  }\n\n  private fun setupRemoteView(\n    views: List<RemoteViews>,\n    pauseResumePendingIntent: PendingIntent,\n    iconId: Int,\n  ) {\n    val iconColor =\n      if (state.darkTheme) {\n        Color.WHITE // Dark Mode -> White Icon\n      } else {\n        Color.BLACK // Light Mode -> Black Icon\n      }\n    for (view in views) {\n      view.setTextViewText(R.id.notification_title, state.title)\n      view.setTextViewText(R.id.notification_content, state.contentText)\n      view.setImageViewResource(R.id.notification_action_btn, iconId)\n      view.setInt(R.id.notification_action_btn, \"setColorFilter\", iconColor)\n      view.setOnClickPendingIntent(R.id.notification_action_btn, pauseResumePendingIntent)\n    }\n  }\n\n// not used currently, left for future reference\n//  private fun loadBitmapFromUri(\n//    context: Context,\n//    uriString: String?,\n//  ): Bitmap? =\n//    try {\n//      val uri = android.net.Uri.parse(uriString)\n//      val inputStream: InputStream\n//      if (uri.scheme == \"http\" || uri.scheme == \"https\") {\n//        // web URL\n//        val connection = java.net.URL(uriString).openConnection()\n//        connection.doInput = true\n//        connection.connect()\n//        inputStream = connection.inputStream\n//      } else {\n//        // local files\n//        inputStream = context.contentResolver.openInputStream(uri)!!\n//      }\n//      android.graphics.BitmapFactory.decodeStream(inputStream)\n//    } catch (e: Exception) {\n//      Log.e(TAG, \"Failed to load bitmap from URI: $uriString\", e)\n//      null\n//    }\n\n  private fun getBuilder(): NotificationCompat.Builder {\n    val context = reactContext.get() ?: throw IllegalStateException(\"React context is null\")\n    if (state.builder == null) {\n      val openAppIntent = context.packageManager.getLaunchIntentForPackage(context.packageName)\n      val pendingIntent = PendingIntent.getActivity(context, 0, openAppIntent, PendingIntent.FLAG_IMMUTABLE)\n\n      state.builder =\n        NotificationCompat\n          .Builder(context, channelId)\n          .setOngoing(true)\n          .setContentIntent(pendingIntent)\n    }\n    if (state.smallIconResourceName == null) {\n      state.builder!!.setSmallIcon(android.R.drawable.ic_btn_speak_now)\n    }\n    return state.builder!!\n  }\n\n  private fun createNotificationChannel(context: ReactApplicationContext) {\n    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {\n      val channel =\n        NotificationChannel(\n          channelId,\n          \"Recording Audio\",\n          NotificationManager.IMPORTANCE_LOW,\n        ).apply {\n          description = \"Notifications for ongoing audio recordings\"\n          lockscreenVisibility = Notification.VISIBILITY_PUBLIC\n        }\n      val notificationManager =\n        context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n      notificationManager.createNotificationChannel(channel)\n    }\n    Log.d(TAG, \"Notification channel created: $channelId\")\n  }\n\n  private fun parseMapFromRN(options: ReadableMap?) {\n    state.title = if (options?.hasKey(\"title\") == true) options.getString(\"title\") else state.title ?: \"Recording Audio\"\n    state.contentText =\n      if (options?.hasKey(\"contentText\") == true) {\n        options.getString(\"contentText\")\n      } else {\n        state.contentText ?: \"Audio recording is in progress/paused\"\n      }\n    state.smallIconResourceName =\n      if (options?.hasKey(\"smallIconResourceName\") ==\n        true\n      ) {\n        options.getString(\"smallIconResourceName\")\n      } else {\n        state.smallIconResourceName ?: null\n      }\n    state.largeIconResourceName =\n      if (options?.hasKey(\"largeIconResourceName\") ==\n        true\n      ) {\n        options.getString(\"largeIconResourceName\")\n      } else {\n        state.largeIconResourceName ?: null\n      }\n    state.pauseIconResourceName =\n      if (options?.hasKey(\"pauseIconResourceName\") ==\n        true\n      ) {\n        options.getString(\"pauseIconResourceName\")\n      } else {\n        state.pauseIconResourceName ?: null\n      }\n    state.resumeIconResourceName =\n      if (options?.hasKey(\"resumeIconResourceName\") ==\n        true\n      ) {\n        options.getString(\"resumeIconResourceName\")\n      } else {\n        state.resumeIconResourceName ?: null\n      }\n    state.backgroundColor = if (options?.hasKey(\"color\") == true) options.getInt(\"color\") else state.backgroundColor ?: null\n    state.paused = if (options?.hasKey(\"paused\") == true) options.getBoolean(\"paused\") else false\n  }\n\n  override fun hide() {\n    val context = reactContext.get() ?: throw IllegalStateException(\"React context is null\")\n    if (state.receiver != null) {\n      context.unregisterReceiver(state.receiver)\n      context.unregisterComponentCallbacks(this)\n      state.receiver = null\n    }\n    val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n    notificationManager.cancel(notificationId)\n    state.initialized = false\n    state.builder = null\n  }\n\n  override fun getNotificationId(): Int = notificationId\n\n  override fun getChannelId(): String = channelId\n\n  @RequiresApi(Build.VERSION_CODES.O)\n  override fun onConfigurationChanged(newConfig: Configuration) {\n    val currentNightMode = newConfig.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES\n    if (currentNightMode != state.darkTheme) {\n      // Theme changed, rebuild notification\n      state.darkTheme = currentNightMode\n      val notification = show(state.cachedRNOptions)\n      val context = reactContext.get()\n      if (context != null) {\n        val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager\n        notificationManager.notify(notificationId, notification)\n      }\n    }\n  }\n\n  @Deprecated(\"Deprecated in Java\")\n  override fun onLowMemory() {\n    // left to listen for ui mode changes\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/notification/RecordingNotificationReceiver.kt",
    "content": "package com.swmansion.audioapi.system.notification\n\nimport android.content.BroadcastReceiver\nimport android.content.Context\nimport android.content.Intent\nimport android.util.Log\nimport com.swmansion.audioapi.AudioAPIModule\nimport com.swmansion.audioapi.system.AudioEvent\n\nclass RecordingNotificationReceiver(\n  private val module: AudioAPIModule,\n) : BroadcastReceiver() {\n  companion object {\n    const val NOTIFICATION_RECORDING_STOPPED = \"com.swmansion.audioapi.NOTIFICATION_RECORDING_STOPPED\"\n    const val NOTIFICATION_RECORDING_RESUMED = \"com.swmansion.audioapi.NOTIFICATION_RECORDING_RESUMED\"\n    private const val TAG = \"RecordingNotificationReceiver\"\n  }\n\n  override fun onReceive(\n    context: Context?,\n    intent: Intent?,\n  ) {\n    when (intent?.action) {\n      NOTIFICATION_RECORDING_STOPPED -> {\n        Log.d(TAG, \"Recording stopped via notification\")\n        module.invokeHandlerWithEventNameAndEventBody(AudioEvent.RECORDING_NOTIFICATION_PAUSE.ordinal, mapOf())\n      }\n\n      NOTIFICATION_RECORDING_RESUMED -> {\n        Log.d(TAG, \"Recording resumed via notification\")\n        module.invokeHandlerWithEventNameAndEventBody(AudioEvent.RECORDING_NOTIFICATION_RESUME.ordinal, mapOf())\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/java/com/swmansion/audioapi/system/notification/state/RecordingNotificationState.kt",
    "content": "package com.swmansion.audioapi.system.notification.state\n\nimport android.content.Intent\nimport androidx.core.app.NotificationCompat\nimport com.facebook.react.bridge.ReadableMap\nimport com.swmansion.audioapi.system.notification.RecordingNotificationReceiver\n\ndata class RecordingNotificationState(\n  var builder: NotificationCompat.Builder? = null,\n  var receiver: RecordingNotificationReceiver? = null,\n  var initialized: Boolean,\n  var pauseIntent: Intent? = null,\n  var resumeIntent: Intent? = null,\n  var title: String? = null,\n  var contentText: String? = null,\n  var paused: Boolean = false,\n  var smallIconResourceName: String? = null,\n  var largeIconResourceName: String? = null,\n  var pauseIconResourceName: String? = null,\n  var resumeIconResourceName: String? = null,\n  var backgroundColor: Int? = null,\n  var cachedRNOptions: ReadableMap? = null,\n  var darkTheme: Boolean,\n)\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/res/drawable/logo.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"36dp\"\n    android:height=\"40dp\"\n    android:viewportWidth=\"36\"\n    android:viewportHeight=\"40\">\n  <path\n      android:pathData=\"M17.397,0C21.203,0.046 23.27,5.296 24.179,8.243C27.21,7.54 32.708,6.626 34.647,9.87C36.595,13.128 33.04,17.387 30.914,19.563C33.119,21.806 36.799,26.046 34.949,29.24C33.109,32.416 27.554,31.459 24.556,30.713C24.255,31.785 23.807,33.136 23.178,34.422H21.299C22.103,32.984 22.632,31.292 22.924,30.254C21.313,29.752 19.606,29.081 17.859,28.265C16.146,29.045 14.486,29.679 12.922,30.146C13.596,32.348 15.113,37.036 17.942,37.07C18.571,37.078 19.137,36.851 19.642,36.47V38.386C19.129,38.609 18.571,38.732 17.967,38.725C14.175,38.679 12.217,33.563 11.307,30.576C8.246,31.289 2.705,32.064 0.751,28.796C-1.189,25.549 2.304,21.448 4.464,19.251C2.234,16.992 -1.343,12.643 0.519,9.426C2.388,6.201 7.879,7.256 10.974,8.06C11.796,5.112 13.607,-0.045 17.397,0ZM29.727,20.706C28.536,21.787 27.16,22.861 25.645,23.896C25.517,25.774 25.284,27.531 24.947,29.115C27.313,29.701 32.09,30.789 33.478,28.394C34.853,26.021 31.341,22.355 29.727,20.706ZM5.689,20.42C4.098,22.039 0.752,25.567 2.199,27.988C3.654,30.42 8.949,29.416 10.864,28.969C10.462,27.348 10.155,25.583 9.952,23.74C8.36,22.649 6.924,21.533 5.689,20.42ZM23.853,25.061C22.536,25.876 21.18,26.632 19.795,27.334C21.007,27.856 22.188,28.299 23.314,28.653C23.546,27.543 23.726,26.339 23.853,25.061ZM11.796,24.948C11.974,26.203 12.204,27.408 12.48,28.536C13.569,28.206 14.713,27.791 15.893,27.296C14.496,26.57 13.13,25.784 11.796,24.948ZM17.621,12.313C15.473,13.304 13.408,14.458 11.446,15.76C11.298,18.111 11.334,20.479 11.55,22.834C13.561,24.165 15.658,25.375 17.827,26.431C19.965,25.413 22.038,24.259 24.01,22.964C24.129,20.623 24.098,18.269 23.896,15.925C21.897,14.57 19.797,13.362 17.621,12.313ZM25.674,17.194C25.764,18.716 25.784,20.24 25.745,21.761C26.751,21.027 27.678,20.279 28.507,19.531C27.645,18.744 26.695,17.96 25.674,17.194ZM9.697,16.982C8.679,17.733 7.733,18.504 6.88,19.278C7.742,20.049 8.71,20.826 9.767,21.597C9.67,20.059 9.646,18.518 9.697,16.982ZM33.199,10.678C31.759,8.27 26.844,9.336 24.623,9.85C25.013,11.441 25.308,13.189 25.5,15.035C27.038,16.117 28.452,17.247 29.696,18.388C31.236,16.81 34.652,13.11 33.199,10.678ZM10.576,9.657C8.293,9.061 3.383,7.868 1.99,10.273C0.597,12.679 4.074,16.508 5.652,18.109C6.881,16.989 8.287,15.88 9.82,14.825C9.967,13 10.222,11.259 10.576,9.657ZM23.003,10.274C21.898,10.596 20.754,10.993 19.591,11.461C20.983,12.18 22.341,12.961 23.66,13.804C23.49,12.558 23.27,11.374 23.003,10.274ZM12.206,10.129C11.965,11.234 11.772,12.41 11.632,13.638C12.925,12.833 14.259,12.088 15.627,11.408C14.459,10.911 13.311,10.482 12.206,10.129ZM17.421,1.655C14.583,1.62 13.266,6.153 12.602,8.53C14.208,9.038 15.893,9.698 17.596,10.484C19.286,9.74 20.959,9.127 22.561,8.665C21.899,6.529 20.262,1.689 17.421,1.655Z\"\n      android:fillColor=\"#919FCF\"\n      android:fillType=\"evenOdd\"/>\n  <path\n      android:pathData=\"M17.103,14.821L17.181,14.822L17.198,14.822C19.534,14.881 21.403,16.791 21.403,19.131V20.738C21.709,20.669 22.028,20.632 22.356,20.632C22.801,20.632 23.231,20.7 23.636,20.826C24.283,19.264 25.823,18.164 27.624,18.164L27.736,18.165C30.033,18.223 31.88,20.074 31.938,22.362L31.939,22.473V33.581C31.939,35.921 30.07,37.831 27.736,37.89L27.624,37.891C25.823,37.891 24.283,36.791 23.636,35.229C23.231,35.354 22.802,35.423 22.356,35.423C22.028,35.423 21.709,35.386 21.403,35.317V35.69C21.403,38.03 19.534,39.939 17.199,39.999L17.087,40C14.99,40 13.246,38.507 12.855,36.531C12.559,36.604 12.252,36.647 11.936,36.655L11.819,36.657C9.601,36.657 7.778,34.986 7.532,32.842C7.217,32.915 6.888,32.954 6.551,32.954C4.164,32.954 2.236,31.021 2.236,28.645V26.176C2.236,23.799 4.164,21.867 6.551,21.866C6.888,21.866 7.217,21.906 7.532,21.979C7.778,19.834 9.601,18.164 11.819,18.164L11.936,18.166C12.252,18.174 12.559,18.216 12.855,18.289C13.246,16.314 14.99,14.821 17.087,14.821L17.103,14.821Z\"\n      android:fillColor=\"#ffffff\"/>\n  <path\n      android:pathData=\"M29.065,22.473C29.065,21.676 28.418,21.032 27.624,21.032C26.83,21.032 26.184,21.676 26.184,22.473V33.581C26.184,34.379 26.83,35.023 27.624,35.023C28.418,35.023 29.065,34.379 29.065,33.581V22.473ZM22.356,23.501C21.561,23.501 20.915,24.145 20.915,24.942V31.113C20.915,31.91 21.561,32.554 22.356,32.554C23.15,32.554 23.796,31.91 23.796,31.113V24.942C23.796,24.145 23.15,23.501 22.356,23.501ZM5.11,28.645C5.11,29.442 5.756,30.086 6.551,30.086C7.345,30.086 7.991,29.442 7.991,28.645V26.176C7.991,25.379 7.345,24.735 6.551,24.735C5.756,24.735 5.11,25.379 5.11,26.176V28.645ZM10.378,32.347C10.378,33.144 11.025,33.788 11.819,33.788C12.613,33.788 13.26,33.144 13.26,32.347V22.473C13.26,21.676 12.613,21.032 11.819,21.032C11.025,21.032 10.378,21.676 10.378,22.473V32.347ZM18.528,19.131C18.528,18.358 17.922,17.73 17.162,17.691L17.087,17.689C16.293,17.689 15.647,18.333 15.647,19.131V35.69C15.647,36.487 16.293,37.132 17.087,37.132C17.882,37.132 18.528,36.487 18.528,35.69V19.131ZM20.125,22.882C20.68,22.283 21.473,21.907 22.356,21.907C23.238,21.907 24.032,22.283 24.587,22.882V22.473C24.587,20.799 25.945,19.439 27.624,19.439C29.303,19.439 30.662,20.799 30.662,22.473V33.581C30.662,35.256 29.303,36.616 27.624,36.616C25.945,36.616 24.587,35.256 24.587,33.581V33.172C24.032,33.772 23.238,34.148 22.356,34.148C21.473,34.148 20.68,33.772 20.125,33.172V35.69C20.125,37.365 18.766,38.725 17.087,38.725C15.409,38.725 14.05,37.365 14.05,35.69V34.406C13.495,35.006 12.701,35.382 11.819,35.382C10.14,35.382 8.782,34.022 8.782,32.347V30.704C8.227,31.304 7.433,31.679 6.551,31.679C4.872,31.679 3.513,30.319 3.513,28.645V26.176C3.513,24.501 4.872,23.141 6.551,23.141C7.433,23.141 8.227,23.517 8.782,24.117V22.473C8.782,20.799 10.14,19.439 11.819,19.439C12.701,19.439 13.495,19.815 14.05,20.414V19.131C14.05,17.456 15.409,16.096 17.087,16.096L17.166,16.097C18.808,16.138 20.125,17.482 20.125,19.131V22.882Z\"\n      android:fillColor=\"#001A72\"/>\n</vector>\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/res/drawable/next.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FFFFFFFF\"\n        android:pathData=\"M6,18l8.5,-6L6,6v12zM16,6v12h2V6h-2z\"/>\n</vector>\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/res/drawable/pause.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FFFFFFFF\"\n        android:pathData=\"M6,19h4L10,5L6,5v14zM14,5v14h4L18,5h-4z\"/>\n</vector>\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/res/drawable/play.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FFFFFFFF\"\n        android:pathData=\"M8,5v14l11,-7z\"/>\n</vector>\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/res/drawable/previous.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FFFFFFFF\"\n        android:pathData=\"M6,6h2v12L6,18zM9.5,12l8.5,6L18,6z\"/>\n</vector>\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/res/drawable/skip_backward_15.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M12,6L12,2l-5,5l5,5L12,8c3.31,0 6,2.69 6,6s-2.69,6 -6,6s-6,-2.69 -6,-6h-2c0,4.42 3.58,8 8,8s8,-3.58 8,-8S16.42,6 12,6z\"\n      android:fillColor=\"#FFFFFF\"/>\n  <path\n      android:pathData=\"M10.9,17h-0.85v-3.26l-1.01,0.31v-0.69l1.77,-0.63h0.09L10.9,17z\"\n      android:fillColor=\"#FFFFFF\"/>\n  <path\n      android:pathData=\"M13.33,16.556C12.89,16.556 12.75,16.246 12.73,15.996L11.89,15.996C11.92,16.846 12.68,17.246 13.33,17.246C14.26,17.246 14.77,16.616 14.77,15.816C14.77,14.486 13.8,14.376 13.47,14.376C13.27,14.376 13.04,14.426 12.83,14.536L12.94,13.616L14.64,13.616L14.64,12.906L12.25,12.906L12,15.076L12.67,15.246C12.8,15.116 12.95,15.016 13.24,15.016C13.64,15.016 13.93,15.246 13.93,15.766C13.92,15.816 13.95,16.556 13.33,16.556Z\"\n      android:strokeWidth=\"1\"\n      android:fillColor=\"#FFFFFF\"/>\n</vector>\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/res/drawable/skip_forward_15.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:width=\"24dp\"\n    android:height=\"24dp\"\n    android:viewportWidth=\"24\"\n    android:viewportHeight=\"24\">\n  <path\n      android:pathData=\"M18,14c0,3.31 -2.69,6 -6,6s-6,-2.69 -6,-6s2.69,-6 6,-6v4l5,-5l-5,-5v4c-4.42,0 -8,3.58 -8,8c0,4.42 3.58,8 8,8s8,-3.58 8,-8L18,14z\"\n      android:fillColor=\"#FFFFFF\"/>\n  <path\n      android:pathData=\"M10.86,16.94l0,-4.27l-0.09,0l-1.77,0.63l0,0.69l1.01,-0.31l0,3.26z\"\n      android:fillColor=\"#FFFFFF\"/>\n  <path\n      android:pathData=\"M13.212,16.452C12.772,16.452 12.632,16.142 12.612,15.892L11.772,15.892C11.802,16.742 12.562,17.142 13.212,17.142C14.142,17.142 14.652,16.512 14.652,15.712C14.652,14.382 13.682,14.272 13.352,14.272C13.152,14.272 12.922,14.322 12.712,14.432L12.822,13.512L14.522,13.512L14.522,12.802L12.132,12.802L11.882,14.972L12.552,15.142C12.682,15.012 12.832,14.912 13.122,14.912C13.522,14.912 13.812,15.142 13.812,15.662C13.802,15.712 13.832,16.452 13.212,16.452Z\"\n      android:strokeWidth=\"1\"\n      android:fillColor=\"#FFFFFF\"/>\n</vector>\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/res/drawable/stop.xml",
    "content": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n        android:width=\"24dp\"\n        android:height=\"24dp\"\n        android:viewportWidth=\"24.0\"\n        android:viewportHeight=\"24.0\">\n    <path\n        android:fillColor=\"#FFFFFFFF\"\n        android:pathData=\"M6,6h12v12H6z\"/>\n</vector>\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/res/layout/btn_round_ripple.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ripple xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:color=\"?android:attr/colorControlHighlight\">\n  <item android:id=\"@android:id/mask\">\n    <shape android:shape=\"oval\">\n      <solid android:color=\"#FFFFFF\" />\n    </shape>\n  </item>\n</ripple>\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/res/layout/notification_collapsed.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n  android:layout_width=\"match_parent\"\n  android:layout_height=\"64dp\"\n  android:gravity=\"center_vertical\"\n  android:orientation=\"horizontal\"\n  android:paddingStart=\"16dp\"\n  android:paddingEnd=\"16dp\"\n  android:paddingBottom=\"16dp\">\n\n  <LinearLayout\n    android:layout_width=\"0dp\"\n    android:layout_height=\"wrap_content\"\n    android:layout_weight=\"1\"\n    android:orientation=\"vertical\"\n    android:paddingEnd=\"16dp\">\n\n    <TextView\n      android:id=\"@+id/notification_title\"\n      style=\"@style/TextAppearance.Compat.Notification.Title\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:ellipsize=\"end\"\n      android:maxLines=\"1\"\n      android:text=\"Recording Audio\" />\n\n    <TextView\n      android:id=\"@+id/notification_content\"\n      style=\"@style/TextAppearance.Compat.Notification.Line2\"\n      android:layout_width=\"wrap_content\"\n      android:layout_height=\"wrap_content\"\n      android:ellipsize=\"end\"\n      android:maxLines=\"1\"\n      android:text=\"00:12\" />\n  </LinearLayout>\n\n  <ImageButton\n    android:id=\"@+id/notification_action_btn\"\n    android:layout_width=\"40dp\"\n    android:layout_height=\"40dp\"\n    android:background=\"@layout/btn_round_ripple\"\n    android:contentDescription=\"Pause or Resume\"\n    android:scaleType=\"centerInside\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/main/res/layout/notification_expanded.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"wrap_content\"\n    android:gravity=\"center_vertical\"\n    android:minHeight=\"64dp\"\n    android:orientation=\"horizontal\"\n    android:paddingStart=\"16dp\"\n    android:paddingTop=\"12dp\"\n    android:paddingEnd=\"16dp\"\n    android:paddingBottom=\"12dp\">\n\n    <LinearLayout\n        android:layout_width=\"0dp\"\n        android:layout_height=\"wrap_content\"\n        android:layout_weight=\"1\"\n        android:orientation=\"vertical\"\n        android:paddingEnd=\"16dp\">\n\n        <TextView\n            android:id=\"@+id/notification_title\"\n            style=\"@style/TextAppearance.Compat.Notification.Title\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:text=\"Recording Audio\" />\n\n        <TextView\n            android:id=\"@+id/notification_content\"\n            style=\"@style/TextAppearance.Compat.Notification.Line2\"\n            android:layout_width=\"wrap_content\"\n            android:layout_height=\"wrap_content\"\n            android:layout_marginTop=\"4dp\"\n            android:text=\"Your recording is in progress...\" />\n    </LinearLayout>\n\n<ImageButton\n    android:id=\"@+id/notification_action_btn\"\n    android:layout_width=\"48dp\"\n    android:layout_height=\"48dp\"\n    android:background=\"@layout/btn_round_ripple\"\n    android:scaleType=\"centerInside\"\n    android:contentDescription=\"Pause or Resume\" />\n\n</LinearLayout>\n"
  },
  {
    "path": "packages/react-native-audio-api/android/src/oldarch/NativeAudioAPIModuleSpec.java",
    "content": "\n/**\n * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).\n *\n * Do not edit this file as changes may cause incorrect behavior and will be lost\n * once the code is regenerated.\n *\n * @generated by codegen project: GenerateModuleJavaSpec.js\n *\n * @nolint\n */\n\npackage com.swmansion.audioapi;\n\nimport com.facebook.proguard.annotations.DoNotStrip;\nimport com.facebook.react.bridge.Promise;\nimport com.facebook.react.bridge.ReactApplicationContext;\nimport com.facebook.react.bridge.ReactContextBaseJavaModule;\nimport com.facebook.react.bridge.ReactMethod;\nimport com.facebook.react.bridge.ReadableArray;\nimport com.facebook.react.bridge.ReadableMap;\nimport com.facebook.react.turbomodule.core.interfaces.TurboModule;\nimport javax.annotation.Nonnull;\nimport javax.annotation.Nullable;\n\npublic abstract class NativeAudioAPIModuleSpec extends ReactContextBaseJavaModule implements TurboModule {\n  public static final String NAME = \"AudioAPIModule\";\n\n  public NativeAudioAPIModuleSpec(ReactApplicationContext reactContext) {\n    super(reactContext);\n  }\n\n  @Override\n  public @Nonnull String getName() {\n    return NAME;\n  }\n\n  @ReactMethod(isBlockingSynchronousMethod = true)\n  @DoNotStrip\n  public abstract boolean install();\n\n  @ReactMethod(isBlockingSynchronousMethod = true)\n  @DoNotStrip\n  public abstract double getDevicePreferredSampleRate();\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void setAudioSessionActivity(boolean enabled, Promise promise);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void setAudioSessionOptions(String category, String mode, ReadableArray options, boolean allowHaptics, boolean notifyOthersOnDeactivation);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void disableSessionManagement();\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void observeAudioInterruptions(String focusType, boolean enabled);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void activelyReclaimSession(boolean enabled);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void observeVolumeChanges(boolean enabled);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void requestRecordingPermissions(Promise promise);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void checkRecordingPermissions(Promise promise);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void requestNotificationPermissions(Promise promise);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void checkNotificationPermissions(Promise promise);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void getDevicesInfo(Promise promise);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void setInputDevice(String deviceId, Promise promise);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void showNotification(String type, String key, ReadableMap options, Promise promise);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void hideNotification(String key, Promise promise);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void isNotificationActive(String key, Promise promise);\n\n  @ReactMethod(isBlockingSynchronousMethod = true)\n  @DoNotStrip\n  public abstract @Nullable String resolveAndroidReleaseAsset(String assetPath);\n\n  @ReactMethod\n  @DoNotStrip\n  public abstract void readAndroidReleaseAssetBytesAsBase64(String assetPath, Promise promise);\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/app.plugin.js",
    "content": "module.exports = require('./lib/commonjs/plugin/withAudioAPI');\n"
  },
  {
    "path": "packages/react-native-audio-api/babel.config.js",
    "content": "module.exports = {\n  presets: ['module:@react-native/babel-preset'],\n};\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/AudioAPIModuleInstaller.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioContextHostObject.h>\n#include <audioapi/HostObjects/OfflineAudioContextHostObject.h>\n#include <audioapi/HostObjects/inputs/AudioRecorderHostObject.h>\n#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/HostObjects/utils/AudioDecoderHostObject.h>\n#include <audioapi/HostObjects/utils/AudioStretcherHostObject.h>\n#include <audioapi/core/AudioContext.h>\n#include <audioapi/core/OfflineAudioContext.h>\n#include <audioapi/core/inputs/AudioRecorder.h>\n#include <audioapi/jsi/JsiPromise.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n\n#include <memory>\nnamespace audioapi {\n\nusing namespace facebook;\n\nclass AudioAPIModuleInstaller {\n public:\n  static void injectJSIBindings(\n      jsi::Runtime *jsiRuntime,\n      const std::shared_ptr<react::CallInvoker> &jsCallInvoker,\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      std::shared_ptr<worklets::WorkletRuntime> uiRuntime = nullptr) {\n    auto createAudioContext = getCreateAudioContextFunction(\n        jsiRuntime, jsCallInvoker, audioEventHandlerRegistry, uiRuntime);\n    auto createAudioRecorder =\n        getCreateAudioRecorderFunction(jsiRuntime, audioEventHandlerRegistry);\n    auto createOfflineAudioContext = getCreateOfflineAudioContextFunction(\n        jsiRuntime, jsCallInvoker, audioEventHandlerRegistry, uiRuntime);\n    auto createAudioBuffer = getCreateAudioBufferFunction(jsiRuntime);\n    auto createAudioDecoder = getCreateAudioDecoderFunction(jsiRuntime, jsCallInvoker);\n    auto createAudioStretcher = getCreateAudioStretcherFunction(jsiRuntime, jsCallInvoker);\n\n    jsiRuntime->global().setProperty(*jsiRuntime, \"createAudioContext\", createAudioContext);\n    jsiRuntime->global().setProperty(*jsiRuntime, \"createAudioRecorder\", createAudioRecorder);\n    jsiRuntime->global().setProperty(\n        *jsiRuntime, \"createOfflineAudioContext\", createOfflineAudioContext);\n    jsiRuntime->global().setProperty(*jsiRuntime, \"createAudioBuffer\", createAudioBuffer);\n    jsiRuntime->global().setProperty(*jsiRuntime, \"createAudioDecoder\", createAudioDecoder);\n    jsiRuntime->global().setProperty(*jsiRuntime, \"createAudioStretcher\", createAudioStretcher);\n\n    auto audioEventHandlerRegistryHostObject =\n        std::make_shared<AudioEventHandlerRegistryHostObject>(audioEventHandlerRegistry);\n    jsiRuntime->global().setProperty(\n        *jsiRuntime,\n        \"AudioEventEmitter\",\n        jsi::Object::createFromHostObject(*jsiRuntime, audioEventHandlerRegistryHostObject));\n  }\n\n private:\n  static jsi::Function getCreateAudioContextFunction(\n      jsi::Runtime *jsiRuntime,\n      const std::shared_ptr<react::CallInvoker> &jsCallInvoker,\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const std::weak_ptr<worklets::WorkletRuntime> &uiRuntime) {\n    return jsi::Function::createFromHostFunction(\n        *jsiRuntime,\n        jsi::PropNameID::forAscii(*jsiRuntime, \"createAudioContext\"),\n        1,\n        [jsCallInvoker, audioEventHandlerRegistry, uiRuntime](\n            jsi::Runtime &runtime,\n            const jsi::Value &thisValue,\n            const jsi::Value *args,\n            size_t count) -> jsi::Value {\n          auto sampleRate = static_cast<float>(args[0].getNumber());\n\n#if RN_AUDIO_API_ENABLE_WORKLETS\n          auto runtimeRegistry = RuntimeRegistry{.uiRuntime = uiRuntime};\n          if (count > 1 && args[1].isObject()) {\n            runtimeRegistry.audioRuntime = worklets::extractWorkletRuntime(runtime, args[1]);\n          }\n#else\n          auto runtimeRegistry = RuntimeRegistry{};\n#endif\n\n          auto audioContextHostObject = std::make_shared<AudioContextHostObject>(\n              sampleRate, audioEventHandlerRegistry, runtimeRegistry, &runtime, jsCallInvoker);\n\n          return jsi::Object::createFromHostObject(runtime, audioContextHostObject);\n        });\n  }\n\n  static jsi::Function getCreateOfflineAudioContextFunction(\n      jsi::Runtime *jsiRuntime,\n      const std::shared_ptr<react::CallInvoker> &jsCallInvoker,\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const std::weak_ptr<worklets::WorkletRuntime> &uiRuntime) {\n    return jsi::Function::createFromHostFunction(\n        *jsiRuntime,\n        jsi::PropNameID::forAscii(*jsiRuntime, \"createOfflineAudioContext\"),\n        3,\n        [jsCallInvoker, audioEventHandlerRegistry, uiRuntime](\n            jsi::Runtime &runtime,\n            const jsi::Value &thisValue,\n            const jsi::Value *args,\n            size_t count) -> jsi::Value {\n          auto numberOfChannels = static_cast<int>(args[0].getNumber());\n          auto length = static_cast<size_t>(args[1].getNumber());\n          auto sampleRate = static_cast<float>(args[2].getNumber());\n\n#if RN_AUDIO_API_ENABLE_WORKLETS\n          auto runtimeRegistry = RuntimeRegistry{.uiRuntime = uiRuntime};\n          if (count > 3 && args[3].isObject()) {\n            runtimeRegistry.audioRuntime = worklets::extractWorkletRuntime(runtime, args[3]);\n          }\n#else\n          auto runtimeRegistry = RuntimeRegistry{};\n#endif\n\n          auto audioContextHostObject = std::make_shared<OfflineAudioContextHostObject>(\n              numberOfChannels,\n              length,\n              sampleRate,\n              audioEventHandlerRegistry,\n              runtimeRegistry,\n              &runtime,\n              jsCallInvoker);\n\n          return jsi::Object::createFromHostObject(runtime, audioContextHostObject);\n        });\n  }\n\n  static jsi::Function getCreateAudioRecorderFunction(\n      jsi::Runtime *jsiRuntime,\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry) {\n    return jsi::Function::createFromHostFunction(\n        *jsiRuntime,\n        jsi::PropNameID::forAscii(*jsiRuntime, \"createAudioRecorder\"),\n        0,\n        [audioEventHandlerRegistry](\n            jsi::Runtime &runtime,\n            const jsi::Value &thisValue,\n            const jsi::Value *args,\n            size_t count) -> jsi::Value {\n          auto audioRecorderHostObject =\n              std::make_shared<AudioRecorderHostObject>(audioEventHandlerRegistry);\n\n          auto jsiObject = jsi::Object::createFromHostObject(runtime, audioRecorderHostObject);\n\n          return jsiObject;\n        });\n  }\n\n  static jsi::Function getCreateAudioDecoderFunction(\n      jsi::Runtime *jsiRuntime,\n      const std::shared_ptr<react::CallInvoker> &jsCallInvoker) {\n    return jsi::Function::createFromHostFunction(\n        *jsiRuntime,\n        jsi::PropNameID::forAscii(*jsiRuntime, \"createAudioDecoder\"),\n        0,\n        [jsCallInvoker](\n            jsi::Runtime &runtime,\n            const jsi::Value &thisValue,\n            const jsi::Value *args,\n            size_t count) -> jsi::Value {\n          auto audioDecoderHostObject =\n              std::make_shared<AudioDecoderHostObject>(&runtime, jsCallInvoker);\n          return jsi::Object::createFromHostObject(runtime, audioDecoderHostObject);\n        });\n  }\n\n  static jsi::Function getCreateAudioStretcherFunction(\n      jsi::Runtime *jsiRuntime,\n      const std::shared_ptr<react::CallInvoker> &jsCallInvoker) {\n    return jsi::Function::createFromHostFunction(\n        *jsiRuntime,\n        jsi::PropNameID::forAscii(*jsiRuntime, \"createAudioStretcher\"),\n        0,\n        [jsCallInvoker](\n            jsi::Runtime &runtime,\n            const jsi::Value &thisValue,\n            const jsi::Value *args,\n            size_t count) -> jsi::Value {\n          auto audioStretcherHostObject =\n              std::make_shared<AudioStretcherHostObject>(&runtime, jsCallInvoker);\n          return jsi::Object::createFromHostObject(runtime, audioStretcherHostObject);\n        });\n  }\n\n  static jsi::Function getCreateAudioBufferFunction(jsi::Runtime *jsiRuntime) {\n    return jsi::Function::createFromHostFunction(\n        *jsiRuntime,\n        jsi::PropNameID::forAscii(*jsiRuntime, \"createAudioBuffer\"),\n        3,\n        [](jsi::Runtime &runtime, const jsi::Value &thisValue, const jsi::Value *args, size_t count)\n            -> jsi::Value {\n          auto numberOfChannels = static_cast<int>(args[0].getNumber());\n          auto length = static_cast<size_t>(args[1].getNumber());\n          auto sampleRate = static_cast<float>(args[2].getNumber());\n\n          auto audioBuffer = std::make_shared<AudioBuffer>(length, numberOfChannels, sampleRate);\n          auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(audioBuffer);\n          return jsi::Object::createFromHostObject(runtime, audioBufferHostObject);\n        });\n  }\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/AudioContextHostObject.cpp",
    "content": "#include <audioapi/HostObjects/AudioContextHostObject.h>\n\n#include <audioapi/core/AudioContext.h>\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nAudioContextHostObject::AudioContextHostObject(\n    float sampleRate,\n    const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    const RuntimeRegistry &runtimeRegistry,\n    jsi::Runtime *runtime,\n    const std::shared_ptr<react::CallInvoker> &callInvoker)\n    : BaseAudioContextHostObject(\n          std::make_shared<AudioContext>(sampleRate, audioEventHandlerRegistry, runtimeRegistry),\n          runtime,\n          callInvoker) {\n  addFunctions(\n      JSI_EXPORT_FUNCTION(AudioContextHostObject, close),\n      JSI_EXPORT_FUNCTION(AudioContextHostObject, resume),\n      JSI_EXPORT_FUNCTION(AudioContextHostObject, suspend));\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioContextHostObject, close) {\n  auto audioContext = std::static_pointer_cast<AudioContext>(context_);\n  auto promise = promiseVendor_->createAsyncPromise([audioContext = std::move(audioContext)]() {\n    return [audioContext](jsi::Runtime &runtime) {\n      audioContext->close();\n      return jsi::Value::undefined();\n    };\n  });\n\n  return promise;\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioContextHostObject, resume) {\n  auto audioContext = std::static_pointer_cast<AudioContext>(context_);\n  auto promise = promiseVendor_->createAsyncPromise([audioContext = std::move(audioContext)]() {\n    auto result = audioContext->resume();\n    return [result](jsi::Runtime &runtime) {\n      return jsi::Value(result);\n    };\n  });\n  return promise;\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioContextHostObject, suspend) {\n  auto audioContext = std::static_pointer_cast<AudioContext>(context_);\n  auto promise = promiseVendor_->createAsyncPromise([audioContext = std::move(audioContext)]() {\n    auto result = audioContext->suspend();\n    return [result](jsi::Runtime &runtime) {\n      return jsi::Value(result);\n    };\n  });\n\n  return promise;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/AudioContextHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/BaseAudioContextHostObject.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/events/IAudioEventHandlerRegistry.h>\n\n#include <jsi/jsi.h>\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass AudioContext;\n\nclass AudioContextHostObject : public BaseAudioContextHostObject {\n public:\n  explicit AudioContextHostObject(\n      float sampleRate,\n      const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const RuntimeRegistry &runtimeRegistry,\n      jsi::Runtime *runtime,\n      const std::shared_ptr<react::CallInvoker> &callInvoker);\n\n  JSI_HOST_FUNCTION_DECL(close);\n  JSI_HOST_FUNCTION_DECL(resume);\n  JSI_HOST_FUNCTION_DECL(suspend);\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/AudioNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/AudioNodeHostObject.h>\n#include <audioapi/HostObjects/AudioParamHostObject.h>\n#include <audioapi/HostObjects/utils/JsEnumParser.h>\n#include <audioapi/core/AudioNode.h>\n\n#include <memory>\n\nnamespace audioapi {\n\nAudioNodeHostObject::AudioNodeHostObject(\n    const std::shared_ptr<AudioNode> &node,\n    const AudioNodeOptions &options)\n    : node_(node),\n      numberOfInputs_(options.numberOfInputs),\n      numberOfOutputs_(options.numberOfOutputs),\n      channelCount_(options.channelCount),\n      channelCountMode_(options.channelCountMode),\n      channelInterpretation_(options.channelInterpretation) {\n  addGetters(\n      JSI_EXPORT_PROPERTY_GETTER(AudioNodeHostObject, numberOfInputs),\n      JSI_EXPORT_PROPERTY_GETTER(AudioNodeHostObject, numberOfOutputs),\n      JSI_EXPORT_PROPERTY_GETTER(AudioNodeHostObject, channelCount),\n      JSI_EXPORT_PROPERTY_GETTER(AudioNodeHostObject, channelCountMode),\n      JSI_EXPORT_PROPERTY_GETTER(AudioNodeHostObject, channelInterpretation));\n\n  addFunctions(\n      JSI_EXPORT_FUNCTION(AudioNodeHostObject, connect),\n      JSI_EXPORT_FUNCTION(AudioNodeHostObject, disconnect));\n}\n\n// Explicitly define destructor here, as they to exist in order to act as a\n// \"key function\" for the audio classes - this allow for RTTI to work\n// properly across dynamic library boundaries (i.e. dynamic_cast that is used by\n// isHostObject method), android specific issue\nAudioNodeHostObject::~AudioNodeHostObject() = default;\n\nJSI_PROPERTY_GETTER_IMPL(AudioNodeHostObject, numberOfInputs) {\n  return {numberOfInputs_};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioNodeHostObject, numberOfOutputs) {\n  return {numberOfOutputs_};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioNodeHostObject, channelCount) {\n  return {static_cast<int>(channelCount_)};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioNodeHostObject, channelCountMode) {\n  return jsi::String::createFromUtf8(\n      runtime, js_enum_parser::channelCountModeToString(channelCountMode_));\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioNodeHostObject, channelInterpretation) {\n  return jsi::String::createFromUtf8(\n      runtime, js_enum_parser::channelInterpretationToString(channelInterpretation_));\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioNodeHostObject, connect) {\n  auto obj = args[0].getObject(runtime);\n  if (obj.isHostObject<AudioNodeHostObject>(runtime)) {\n    auto node = obj.getHostObject<AudioNodeHostObject>(runtime);\n    node_->connect(std::shared_ptr<AudioNodeHostObject>(node)->node_);\n  }\n  if (obj.isHostObject<AudioParamHostObject>(runtime)) {\n    auto param = obj.getHostObject<AudioParamHostObject>(runtime);\n    node_->connect(std::shared_ptr<AudioParamHostObject>(param)->param_);\n  }\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioNodeHostObject, disconnect) {\n  if (args[0].isUndefined()) {\n    node_->disconnect();\n    return jsi::Value::undefined();\n  }\n  auto obj = args[0].getObject(runtime);\n  if (obj.isHostObject<AudioNodeHostObject>(runtime)) {\n    auto node = obj.getHostObject<AudioNodeHostObject>(runtime);\n    node_->disconnect(std::shared_ptr<AudioNodeHostObject>(node)->node_);\n  }\n\n  if (obj.isHostObject<AudioParamHostObject>(runtime)) {\n    auto param = obj.getHostObject<AudioParamHostObject>(runtime);\n    node_->disconnect(std::shared_ptr<AudioParamHostObject>(param)->param_);\n  }\n  return jsi::Value::undefined();\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/AudioNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/core/types/ChannelCountMode.h>\n#include <audioapi/core/types/ChannelInterpretation.h>\n#include <audioapi/jsi/JsiHostObject.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <jsi/jsi.h>\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass AudioNode;\n\nclass AudioNodeHostObject : public JsiHostObject {\n public:\n  explicit AudioNodeHostObject(\n      const std::shared_ptr<AudioNode> &node,\n      const AudioNodeOptions &options = AudioNodeOptions());\n  ~AudioNodeHostObject() override;\n\n  JSI_PROPERTY_GETTER_DECL(numberOfInputs);\n  JSI_PROPERTY_GETTER_DECL(numberOfOutputs);\n  JSI_PROPERTY_GETTER_DECL(channelCount);\n  JSI_PROPERTY_GETTER_DECL(channelCountMode);\n  JSI_PROPERTY_GETTER_DECL(channelInterpretation);\n\n  JSI_HOST_FUNCTION_DECL(connect);\n  JSI_HOST_FUNCTION_DECL(disconnect);\n\n protected:\n  std::shared_ptr<AudioNode> node_;\n\n  const int numberOfInputs_;\n  const int numberOfOutputs_;\n  size_t channelCount_;\n  const ChannelCountMode channelCountMode_;\n  const ChannelInterpretation channelInterpretation_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/AudioParamHostObject.cpp",
    "content": "#include <audioapi/HostObjects/AudioParamHostObject.h>\n#include <audioapi/core/AudioParam.h>\n#include <audioapi/core/utils/param/ParamEvent.h>\n#include <audioapi/jsi/JsiHostObject.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <memory>\n#include <string>\n#include <utility>\n\nnamespace audioapi {\n\nAudioParamHostObject::AudioParamHostObject(const std::shared_ptr<AudioParam> &param)\n    : param_(param),\n      defaultValue_(param->getDefaultValue()),\n      minValue_(param->getMinValue()),\n      maxValue_(param->getMaxValue()) {\n  addGetters(\n      JSI_EXPORT_PROPERTY_GETTER(AudioParamHostObject, value),\n      JSI_EXPORT_PROPERTY_GETTER(AudioParamHostObject, defaultValue),\n      JSI_EXPORT_PROPERTY_GETTER(AudioParamHostObject, minValue),\n      JSI_EXPORT_PROPERTY_GETTER(AudioParamHostObject, maxValue));\n\n  addFunctions(\n      JSI_EXPORT_FUNCTION(AudioParamHostObject, setValueAtTime),\n      JSI_EXPORT_FUNCTION(AudioParamHostObject, linearRampToValueAtTime),\n      JSI_EXPORT_FUNCTION(AudioParamHostObject, exponentialRampToValueAtTime),\n      JSI_EXPORT_FUNCTION(AudioParamHostObject, setTargetAtTime),\n      JSI_EXPORT_FUNCTION(AudioParamHostObject, setValueCurveAtTime),\n      JSI_EXPORT_FUNCTION(AudioParamHostObject, cancelScheduledValues),\n      JSI_EXPORT_FUNCTION(AudioParamHostObject, cancelAndHoldAtTime),\n      JSI_EXPORT_FUNCTION(AudioParamHostObject, checkCurveExclusion));\n\n  addSetters(JSI_EXPORT_PROPERTY_SETTER(AudioParamHostObject, value));\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioParamHostObject, value) {\n  return {param_->getValue()};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioParamHostObject, defaultValue) {\n  return {defaultValue_};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioParamHostObject, minValue) {\n  return {minValue_};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioParamHostObject, maxValue) {\n  return {maxValue_};\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioParamHostObject, value) {\n  auto event = [param = param_, value = static_cast<float>(value.getNumber())](BaseAudioContext &) {\n    param->setValue(value);\n  };\n\n  param_->scheduleAudioEvent(std::move(event));\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioParamHostObject, setValueAtTime) {\n  auto startTime = args[1].getNumber();\n  controlQueue_.purge(param_->getCurrentTime());\n  controlQueue_.push(ParamEvent(ParamEventType::SET_VALUE, startTime));\n\n  auto event = [param = param_, value = static_cast<float>(args[0].getNumber()), startTime](\n                   BaseAudioContext &) {\n    param->setValueAtTime(value, startTime);\n  };\n\n  param_->scheduleAudioEvent(std::move(event));\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioParamHostObject, linearRampToValueAtTime) {\n  auto endTime = args[1].getNumber();\n  controlQueue_.purge(param_->getCurrentTime());\n  controlQueue_.push(ParamEvent(ParamEventType::LINEAR_RAMP, endTime));\n\n  auto event = [param = param_, value = static_cast<float>(args[0].getNumber()), endTime](\n                   BaseAudioContext &) {\n    param->linearRampToValueAtTime(value, endTime);\n  };\n\n  param_->scheduleAudioEvent(std::move(event));\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioParamHostObject, exponentialRampToValueAtTime) {\n  auto endTime = args[1].getNumber();\n  controlQueue_.purge(param_->getCurrentTime());\n  controlQueue_.push(ParamEvent(ParamEventType::EXPONENTIAL_RAMP, endTime));\n\n  auto event = [param = param_, value = static_cast<float>(args[0].getNumber()), endTime](\n                   BaseAudioContext &) {\n    param->exponentialRampToValueAtTime(value, endTime);\n  };\n\n  param_->scheduleAudioEvent(std::move(event));\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioParamHostObject, setTargetAtTime) {\n  auto startTime = args[1].getNumber();\n  controlQueue_.purge(param_->getCurrentTime());\n  controlQueue_.push(ParamEvent(ParamEventType::SET_TARGET, startTime));\n\n  auto event = [param = param_,\n                target = static_cast<float>(args[0].getNumber()),\n                startTime,\n                timeConstant = args[2].getNumber()](BaseAudioContext &) {\n    param->setTargetAtTime(target, startTime, timeConstant);\n  };\n\n  param_->scheduleAudioEvent(std::move(event));\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioParamHostObject, setValueCurveAtTime) {\n  auto startTime = args[1].getNumber();\n  auto duration = args[2].getNumber();\n  controlQueue_.purge(param_->getCurrentTime());\n  controlQueue_.push(ParamEvent(ParamEventType::SET_VALUE_CURVE, startTime, startTime + duration));\n\n  auto arrayBuffer =\n      args[0].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto *rawValues = reinterpret_cast<float *>(arrayBuffer.data(runtime));\n  auto length = static_cast<int>(arrayBuffer.size(runtime) / sizeof(float));\n  auto values = std::make_shared<AudioArray>(rawValues, length);\n\n  auto event = [param = param_, values, length, startTime, duration](BaseAudioContext &) {\n    param->setValueCurveAtTime(values, length, startTime, duration);\n  };\n\n  param_->scheduleAudioEvent(std::move(event));\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioParamHostObject, cancelScheduledValues) {\n  auto cancelTime = args[0].getNumber();\n  controlQueue_.cancelScheduledValues(cancelTime);\n\n  auto event = [param = param_, cancelTime](BaseAudioContext &) {\n    param->cancelScheduledValues(cancelTime);\n  };\n\n  param_->scheduleAudioEvent(std::move(event));\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioParamHostObject, cancelAndHoldAtTime) {\n  auto cancelTime = args[0].getNumber();\n  controlQueue_.cancelScheduledValues(cancelTime);\n\n  auto event = [param = param_, cancelTime](BaseAudioContext &) {\n    param->cancelAndHoldAtTime(cancelTime);\n  };\n\n  param_->scheduleAudioEvent(std::move(event));\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioParamHostObject, checkCurveExclusion) {\n  auto checkExclusionResult = checkCurveExclusionFromJSI(runtime, args);\n\n  auto jsResult = jsi::Object(runtime);\n  jsResult.setProperty(\n      runtime,\n      \"status\",\n      jsi::String::createFromUtf8(runtime, checkExclusionResult.is_ok() ? \"success\" : \"error\"));\n  if (checkExclusionResult.is_err()) {\n    jsResult.setProperty(\n        runtime,\n        \"message\",\n        jsi::String::createFromUtf8(runtime, checkExclusionResult.unwrap_err()));\n  }\n  return jsResult;\n}\n\nResult<NoneType, std::string> AudioParamHostObject::checkCurveExclusionFromJSI(\n    jsi::Runtime &runtime,\n    const jsi::Value *args) {\n  auto arg = args[0].getObject(runtime);\n  auto type = static_cast<ParamEventType>(arg.getProperty(runtime, \"type\").getNumber());\n  auto automationTime = arg.getProperty(runtime, \"automationTime\").getNumber();\n\n  ParamEvent event;\n  if (type == ParamEventType::SET_VALUE_CURVE) {\n    auto duration = arg.getProperty(runtime, \"duration\").getNumber();\n    event = ParamEvent(type, automationTime, automationTime + duration);\n  } else {\n    event = ParamEvent(type, automationTime);\n  }\n\n  return controlQueue_.checkCurveExclusion(event);\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/AudioParamHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/core/utils/param/ParamControlQueue.h>\n#include <audioapi/jsi/JsiHostObject.h>\n#include <audioapi/utils/Result.hpp>\n#include <jsi/jsi.h>\n#include <cstddef>\n#include <memory>\n#include <string>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass AudioParam;\n\nclass AudioParamHostObject : public JsiHostObject {\n public:\n  explicit AudioParamHostObject(const std::shared_ptr<AudioParam> &param);\n\n  JSI_PROPERTY_GETTER_DECL(value);\n  JSI_PROPERTY_GETTER_DECL(defaultValue);\n  JSI_PROPERTY_GETTER_DECL(minValue);\n  JSI_PROPERTY_GETTER_DECL(maxValue);\n\n  JSI_PROPERTY_SETTER_DECL(value);\n\n  JSI_HOST_FUNCTION_DECL(setValueAtTime);\n  JSI_HOST_FUNCTION_DECL(linearRampToValueAtTime);\n  JSI_HOST_FUNCTION_DECL(exponentialRampToValueAtTime);\n  JSI_HOST_FUNCTION_DECL(setTargetAtTime);\n  JSI_HOST_FUNCTION_DECL(setValueCurveAtTime);\n  JSI_HOST_FUNCTION_DECL(cancelScheduledValues);\n  JSI_HOST_FUNCTION_DECL(cancelAndHoldAtTime);\n  JSI_HOST_FUNCTION_DECL(checkCurveExclusion);\n\n private:\n  friend class AudioNodeHostObject;\n\n  std::shared_ptr<AudioParam> param_;\n  ParamControlQueue controlQueue_;\n  float defaultValue_;\n  float minValue_;\n  float maxValue_;\n\n  Result<NoneType, std::string> checkCurveExclusionFromJSI(\n      jsi::Runtime &runtime,\n      const jsi::Value *args);\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.cpp",
    "content": "#include <audioapi/HostObjects/BaseAudioContextHostObject.h>\n#include <audioapi/HostObjects/analysis/AnalyserNodeHostObject.h>\n#include <audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h>\n#include <audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h>\n#include <audioapi/HostObjects/effects/ConvolverNodeHostObject.h>\n#include <audioapi/HostObjects/effects/DelayNodeHostObject.h>\n#include <audioapi/HostObjects/effects/GainNodeHostObject.h>\n#include <audioapi/HostObjects/effects/IIRFilterNodeHostObject.h>\n#include <audioapi/HostObjects/effects/PeriodicWaveHostObject.h>\n#include <audioapi/HostObjects/effects/StereoPannerNodeHostObject.h>\n#include <audioapi/HostObjects/effects/WaveShaperNodeHostObject.h>\n#include <audioapi/HostObjects/effects/WorkletNodeHostObject.h>\n#include <audioapi/HostObjects/effects/WorkletProcessingNodeHostObject.h>\n#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h>\n#include <audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h>\n#include <audioapi/HostObjects/sources/AudioFileSourceNodeHostObject.h>\n#include <audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h>\n#include <audioapi/HostObjects/sources/OscillatorNodeHostObject.h>\n#include <audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h>\n#include <audioapi/HostObjects/sources/StreamerNodeHostObject.h>\n#include <audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h>\n#include <audioapi/HostObjects/utils/JsEnumParser.h>\n#include <audioapi/HostObjects/utils/NodeOptionsParser.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/utils/AudioDecoder.h>\n\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\nBaseAudioContextHostObject::BaseAudioContextHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    jsi::Runtime *runtime,\n    const std::shared_ptr<react::CallInvoker> &callInvoker)\n    : context_(context),\n      promiseVendor_(std::make_shared<PromiseVendor>(runtime, callInvoker)),\n      callInvoker_(callInvoker) {\n  context_->initialize();\n  destination_ = std::make_shared<AudioDestinationNodeHostObject>(context_->getDestination());\n\n  addGetters(\n      JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, destination),\n      JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, state),\n      JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, sampleRate),\n      JSI_EXPORT_PROPERTY_GETTER(BaseAudioContextHostObject, currentTime));\n\n  addFunctions(\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createWorkletSourceNode),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createWorkletNode),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createWorkletProcessingNode),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createRecorderAdapter),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createOscillator),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStreamer),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createConstantSource),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createGain),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createDelay),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createStereoPanner),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBiquadFilter),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createIIRFilter),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBufferSource),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createFileSource),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createBufferQueueSource),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createPeriodicWave),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createConvolver),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createAnalyser),\n      JSI_EXPORT_FUNCTION(BaseAudioContextHostObject, createWaveShaper));\n}\n\n// Explicitly define destructors here, as they to exist in order to act as a\n// \"key function\" for the audio classes - this allow for RTTI to work\n// properly across dynamic library boundaries (i.e. dynamic_cast that is used by\n// isHostObject method), android specific issue\nBaseAudioContextHostObject::~BaseAudioContextHostObject() = default;\n\nJSI_PROPERTY_GETTER_IMPL(BaseAudioContextHostObject, destination) {\n  return jsi::Object::createFromHostObject(runtime, destination_);\n}\n\nJSI_PROPERTY_GETTER_IMPL(BaseAudioContextHostObject, state) {\n  return jsi::String::createFromUtf8(\n      runtime, js_enum_parser::contextStateToString(context_->getState()));\n}\n\nJSI_PROPERTY_GETTER_IMPL(BaseAudioContextHostObject, sampleRate) {\n  return {context_->getSampleRate()};\n}\n\nJSI_PROPERTY_GETTER_IMPL(BaseAudioContextHostObject, currentTime) {\n  return {context_->getCurrentTime()};\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletSourceNode) {\n#if RN_AUDIO_API_ENABLE_WORKLETS\n  auto shareableWorklet =\n      worklets::extractSerializableOrThrow<worklets::SerializableWorklet>(runtime, args[0]);\n  std::weak_ptr<worklets::WorkletRuntime> workletRuntime;\n  auto shouldUseUiRuntime = args[1].getBool();\n  auto shouldLockRuntime = shouldUseUiRuntime;\n  if (shouldUseUiRuntime) {\n    workletRuntime = context_->getRuntimeRegistry().uiRuntime;\n  } else {\n    workletRuntime = context_->getRuntimeRegistry().audioRuntime;\n  }\n\n  auto workletSourceNode =\n      context_->createWorkletSourceNode(shareableWorklet, workletRuntime, shouldLockRuntime);\n  auto workletSourceNodeHostObject =\n      std::make_shared<WorkletSourceNodeHostObject>(workletSourceNode);\n  return jsi::Object::createFromHostObject(runtime, workletSourceNodeHostObject);\n#endif\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletNode) {\n#if RN_AUDIO_API_ENABLE_WORKLETS\n  auto shareableWorklet =\n      worklets::extractSerializableOrThrow<worklets::SerializableWorklet>(runtime, args[0]);\n\n  std::weak_ptr<worklets::WorkletRuntime> workletRuntime;\n  auto shouldUseUiRuntime = args[1].getBool();\n  auto shouldLockRuntime = shouldUseUiRuntime;\n  if (shouldUseUiRuntime) {\n    workletRuntime = context_->getRuntimeRegistry().uiRuntime;\n  } else {\n    workletRuntime = context_->getRuntimeRegistry().audioRuntime;\n  }\n  auto bufferLength = static_cast<size_t>(args[2].getNumber());\n  auto inputChannelCount = static_cast<size_t>(args[3].getNumber());\n\n  auto workletNode = context_->createWorkletNode(\n      shareableWorklet, workletRuntime, bufferLength, inputChannelCount, shouldLockRuntime);\n  auto workletNodeHostObject = std::make_shared<WorkletNodeHostObject>(workletNode);\n  auto jsiObject = jsi::Object::createFromHostObject(runtime, workletNodeHostObject);\n  jsiObject.setExternalMemoryPressure(\n      runtime,\n      sizeof(float) * bufferLength * inputChannelCount); // rough estimate of underlying buffer\n  return jsiObject;\n#endif\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWorkletProcessingNode) {\n#if RN_AUDIO_API_ENABLE_WORKLETS\n  auto shareableWorklet =\n      worklets::extractSerializableOrThrow<worklets::SerializableWorklet>(runtime, args[0]);\n\n  std::weak_ptr<worklets::WorkletRuntime> workletRuntime;\n  auto shouldUseUiRuntime = args[1].getBool();\n  auto shouldLockRuntime = shouldUseUiRuntime;\n  if (shouldUseUiRuntime) {\n    workletRuntime = context_->getRuntimeRegistry().uiRuntime;\n  } else {\n    workletRuntime = context_->getRuntimeRegistry().audioRuntime;\n  }\n\n  auto workletProcessingNode =\n      context_->createWorkletProcessingNode(shareableWorklet, workletRuntime, shouldLockRuntime);\n  auto workletProcessingNodeHostObject =\n      std::make_shared<WorkletProcessingNodeHostObject>(workletProcessingNode);\n  return jsi::Object::createFromHostObject(runtime, workletProcessingNodeHostObject);\n#endif\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createRecorderAdapter) {\n  auto recorderAdapter = context_->createRecorderAdapter();\n  auto recorderAdapterHostObject = std::make_shared<RecorderAdapterNodeHostObject>(recorderAdapter);\n  return jsi::Object::createFromHostObject(runtime, recorderAdapterHostObject);\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createOscillator) {\n  const auto options = args[0].asObject(runtime);\n  const auto oscillatorOptions = audioapi::option_parser::parseOscillatorOptions(runtime, options);\n  auto oscillatorHostObject =\n      std::make_shared<OscillatorNodeHostObject>(context_, oscillatorOptions);\n  return jsi::Object::createFromHostObject(runtime, oscillatorHostObject);\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createStreamer) {\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n  auto streamerOptions = StreamerOptions();\n  if (!args[0].isUndefined()) {\n    const auto options = args[0].asObject(runtime);\n    streamerOptions = audioapi::option_parser::parseStreamerOptions(runtime, options);\n  }\n  auto streamerHostObject = std::make_shared<StreamerNodeHostObject>(context_, streamerOptions);\n  auto object = jsi::Object::createFromHostObject(runtime, streamerHostObject);\n  object.setExternalMemoryPressure(runtime, StreamerNodeHostObject::getSizeInBytes());\n  return object;\n#else\n  return jsi::Value::undefined();\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createConstantSource) {\n  const auto options = args[0].asObject(runtime);\n  const auto constantSourceOptions =\n      audioapi::option_parser::parseConstantSourceOptions(runtime, options);\n  auto constantSourceHostObject =\n      std::make_shared<ConstantSourceNodeHostObject>(context_, constantSourceOptions);\n  return jsi::Object::createFromHostObject(runtime, constantSourceHostObject);\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createGain) {\n  const auto options = args[0].asObject(runtime);\n  const auto gainOptions = audioapi::option_parser::parseGainOptions(runtime, options);\n  auto gainHostObject = std::make_shared<GainNodeHostObject>(context_, gainOptions);\n  return jsi::Object::createFromHostObject(runtime, gainHostObject);\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createDelay) {\n  const auto options = args[0].asObject(runtime);\n  const auto delayOptions = audioapi::option_parser::parseDelayOptions(runtime, options);\n  auto delayNodeHostObject = std::make_shared<DelayNodeHostObject>(context_, delayOptions);\n  auto jsiObject = jsi::Object::createFromHostObject(runtime, delayNodeHostObject);\n  jsiObject.setExternalMemoryPressure(runtime, delayNodeHostObject->getSizeInBytes());\n  return jsiObject;\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createStereoPanner) {\n  const auto options = args[0].asObject(runtime);\n  const auto stereoPannerOptions =\n      audioapi::option_parser::parseStereoPannerOptions(runtime, options);\n  auto stereoPannerHostObject =\n      std::make_shared<StereoPannerNodeHostObject>(context_, stereoPannerOptions);\n  return jsi::Object::createFromHostObject(runtime, stereoPannerHostObject);\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createBiquadFilter) {\n  const auto options = args[0].asObject(runtime);\n  const auto biquadFilterOptions =\n      audioapi::option_parser::parseBiquadFilterOptions(runtime, options);\n  auto biquadFilterHostObject =\n      std::make_shared<BiquadFilterNodeHostObject>(context_, biquadFilterOptions);\n  return jsi::Object::createFromHostObject(runtime, biquadFilterHostObject);\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createIIRFilter) {\n  const auto options = args[0].asObject(runtime);\n  const auto iirFilterOptions = audioapi::option_parser::parseIIRFilterOptions(runtime, options);\n  auto iirFilterHostObject = std::make_shared<IIRFilterNodeHostObject>(context_, iirFilterOptions);\n  return jsi::Object::createFromHostObject(runtime, iirFilterHostObject);\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createBufferSource) {\n  const auto options = args[0].asObject(runtime);\n  const auto audioBufferSourceOptions =\n      audioapi::option_parser::parseAudioBufferSourceOptions(runtime, options);\n  auto bufferSourceHostObject =\n      std::make_shared<AudioBufferSourceNodeHostObject>(context_, audioBufferSourceOptions);\n  return jsi::Object::createFromHostObject(runtime, bufferSourceHostObject);\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createFileSource) {\n  auto makeFileSourceHostObject = [&](AudioFileSourceOptions opts) -> jsi::Value {\n#if RN_AUDIO_API_FFMPEG_DISABLED\n    if (opts.requiresFFmpeg) {\n      return jsi::Value::undefined();\n    }\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n    const auto fileSourceHostObject =\n        std::make_shared<AudioFileSourceNodeHostObject>(context_, opts);\n    return jsi::Object::createFromHostObject(runtime, fileSourceHostObject);\n  };\n\n  const auto options = args[0].asObject(runtime);\n\n  const auto fileSourceOptions =\n      audioapi::option_parser::parseAudioFileSourceOptions(runtime, options);\n  return makeFileSourceHostObject(fileSourceOptions);\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createBufferQueueSource) {\n  const auto options = args[0].asObject(runtime);\n  const auto baseAudioBufferSourceOptions =\n      audioapi::option_parser::parseBaseAudioBufferSourceOptions(runtime, options);\n  auto bufferStreamSourceHostObject = std::make_shared<AudioBufferQueueSourceNodeHostObject>(\n      context_, baseAudioBufferSourceOptions);\n  return jsi::Object::createFromHostObject(runtime, bufferStreamSourceHostObject);\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createPeriodicWave) {\n  auto arrayBufferReal =\n      args[0].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto *real = reinterpret_cast<float *>(arrayBufferReal.data(runtime));\n  auto length = static_cast<int>(arrayBufferReal.size(runtime) / sizeof(float));\n\n  auto arrayBufferImag =\n      args[1].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto *imag = reinterpret_cast<float *>(arrayBufferImag.data(runtime));\n\n  auto disableNormalization = args[2].getBool();\n\n  auto complexData = std::vector<std::complex<float>>(length);\n\n  for (int i = 0; i < length; i++) {\n    complexData[i] = std::complex<float>(real[i], imag[i]);\n  }\n\n  auto periodicWave = context_->createPeriodicWave(complexData, disableNormalization, length);\n  auto periodicWaveHostObject = std::make_shared<PeriodicWaveHostObject>(periodicWave);\n\n  return jsi::Object::createFromHostObject(runtime, periodicWaveHostObject);\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createAnalyser) {\n  const auto options = args[0].asObject(runtime);\n  const auto analyserOptions = audioapi::option_parser::parseAnalyserOptions(runtime, options);\n  auto analyserHostObject = std::make_shared<AnalyserNodeHostObject>(context_, analyserOptions);\n  return jsi::Object::createFromHostObject(runtime, analyserHostObject);\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createConvolver) {\n  const auto options = args[0].asObject(runtime);\n  const auto convolverOptions = audioapi::option_parser::parseConvolverOptions(runtime, options);\n  auto convolverHostObject = std::make_shared<ConvolverNodeHostObject>(context_, convolverOptions);\n  auto jsiObject = jsi::Object::createFromHostObject(runtime, convolverHostObject);\n  if (convolverOptions.buffer != nullptr) {\n    auto bufferHostObject = options.getProperty(runtime, \"buffer\")\n                                .getObject(runtime)\n                                .asHostObject<AudioBufferHostObject>(runtime);\n    jsiObject.setExternalMemoryPressure(runtime, bufferHostObject->getSizeInBytes());\n  }\n  return jsiObject;\n}\n\nJSI_HOST_FUNCTION_IMPL(BaseAudioContextHostObject, createWaveShaper) {\n  const auto options = args[0].asObject(runtime);\n  const auto waveShaperOptions = audioapi::option_parser::parseWaveShaperOptions(runtime, options);\n  auto waveShaperHostObject =\n      std::make_shared<WaveShaperNodeHostObject>(context_, waveShaperOptions);\n  return jsi::Object::createFromHostObject(runtime, waveShaperHostObject);\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/BaseAudioContextHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/jsi/JsiHostObject.h>\n#include <audioapi/jsi/JsiPromise.h>\n\n#include <jsi/jsi.h>\n#include <cstddef>\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass BaseAudioContext;\nclass AudioDestinationNodeHostObject;\n\nclass BaseAudioContextHostObject : public JsiHostObject {\n public:\n  explicit BaseAudioContextHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      jsi::Runtime *runtime,\n      const std::shared_ptr<react::CallInvoker> &callInvoker);\n\n  ~BaseAudioContextHostObject() override;\n\n  JSI_PROPERTY_GETTER_DECL(destination);\n  JSI_PROPERTY_GETTER_DECL(state);\n  JSI_PROPERTY_GETTER_DECL(sampleRate);\n  JSI_PROPERTY_GETTER_DECL(currentTime);\n\n  JSI_HOST_FUNCTION_DECL(createWorkletSourceNode);\n  JSI_HOST_FUNCTION_DECL(createWorkletNode);\n  JSI_HOST_FUNCTION_DECL(createWorkletProcessingNode);\n  JSI_HOST_FUNCTION_DECL(createRecorderAdapter);\n  JSI_HOST_FUNCTION_DECL(createOscillator);\n  JSI_HOST_FUNCTION_DECL(createStreamer);\n  JSI_HOST_FUNCTION_DECL(createConstantSource);\n  JSI_HOST_FUNCTION_DECL(createGain);\n  JSI_HOST_FUNCTION_DECL(createStereoPanner);\n  JSI_HOST_FUNCTION_DECL(createBiquadFilter);\n  JSI_HOST_FUNCTION_DECL(createIIRFilter);\n  JSI_HOST_FUNCTION_DECL(createBufferSource);\n  JSI_HOST_FUNCTION_DECL(createFileSource);\n  JSI_HOST_FUNCTION_DECL(createBufferQueueSource);\n  JSI_HOST_FUNCTION_DECL(createPeriodicWave);\n  JSI_HOST_FUNCTION_DECL(createAnalyser);\n  JSI_HOST_FUNCTION_DECL(createConvolver);\n  JSI_HOST_FUNCTION_DECL(createWaveShaper);\n  JSI_HOST_FUNCTION_DECL(createDelay);\n\n protected:\n  std::shared_ptr<BaseAudioContext> context_;\n  std::shared_ptr<PromiseVendor> promiseVendor_;\n  std::shared_ptr<react::CallInvoker> callInvoker_;\n\n  std::shared_ptr<AudioDestinationNodeHostObject> destination_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.cpp",
    "content": "#include <audioapi/HostObjects/OfflineAudioContextHostObject.h>\n\n#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/core/OfflineAudioContext.h>\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nOfflineAudioContextHostObject::OfflineAudioContextHostObject(\n    int numberOfChannels,\n    size_t length,\n    float sampleRate,\n    const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    const RuntimeRegistry &runtimeRegistry,\n    jsi::Runtime *runtime,\n    const std::shared_ptr<react::CallInvoker> &callInvoker)\n    : BaseAudioContextHostObject(\n          std::make_shared<OfflineAudioContext>(\n              numberOfChannels,\n              length,\n              sampleRate,\n              audioEventHandlerRegistry,\n              runtimeRegistry),\n          runtime,\n          callInvoker) {\n  addFunctions(\n      JSI_EXPORT_FUNCTION(OfflineAudioContextHostObject, resume),\n      JSI_EXPORT_FUNCTION(OfflineAudioContextHostObject, suspend),\n      JSI_EXPORT_FUNCTION(OfflineAudioContextHostObject, startRendering));\n}\n\nJSI_HOST_FUNCTION_IMPL(OfflineAudioContextHostObject, resume) {\n  auto audioContext = std::static_pointer_cast<OfflineAudioContext>(context_);\n  auto promise = promiseVendor_->createAsyncPromise([audioContext]() {\n    audioContext->resume();\n    return [](jsi::Runtime &runtime) {\n      return jsi::Value::undefined();\n    };\n  });\n\n  return promise;\n}\n\nJSI_HOST_FUNCTION_IMPL(OfflineAudioContextHostObject, suspend) {\n  double when = args[0].getNumber();\n  auto audioContext = std::static_pointer_cast<OfflineAudioContext>(context_);\n\n  auto promise = promiseVendor_->createAsyncPromise([=](Promise &&promise) {\n    OfflineAudioContextSuspendCallback callback = [promise = std::move(promise)]() {\n      promise.resolve([](jsi::Runtime &runtime) { return jsi::Value::undefined(); });\n    };\n    audioContext->suspend(when, callback);\n  });\n\n  return promise;\n}\n\nJSI_HOST_FUNCTION_IMPL(OfflineAudioContextHostObject, startRendering) {\n  auto audioContext = std::static_pointer_cast<OfflineAudioContext>(context_);\n  auto promise = promiseVendor_->createAsyncPromise([audioContext](Promise &&promise) {\n    OfflineAudioContextResultCallback callback =\n        [promise = std::move(promise)](const std::shared_ptr<AudioBuffer> &audioBuffer) {\n          auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(audioBuffer);\n          promise.resolve([audioBufferHostObject](jsi::Runtime &runtime) {\n            return jsi::Object::createFromHostObject(runtime, audioBufferHostObject);\n          });\n        };\n\n    audioContext->startRendering(callback);\n  });\n\n  return promise;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/OfflineAudioContextHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/BaseAudioContextHostObject.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/events/IAudioEventHandlerRegistry.h>\n\n#include <jsi/jsi.h>\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass OfflineAudioContext;\n\nclass OfflineAudioContextHostObject : public BaseAudioContextHostObject {\n public:\n  explicit OfflineAudioContextHostObject(\n      int numberOfChannels,\n      size_t length,\n      float sampleRate,\n      const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const RuntimeRegistry &runtimeRegistry,\n      jsi::Runtime *runtime,\n      const std::shared_ptr<react::CallInvoker> &callInvoker);\n\n  JSI_HOST_FUNCTION_DECL(resume);\n  JSI_HOST_FUNCTION_DECL(suspend);\n  JSI_HOST_FUNCTION_DECL(startRendering);\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/analysis/AnalyserNodeHostObject.h>\n#include <audioapi/HostObjects/utils/JsEnumParser.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/analysis/AnalyserNode.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <memory>\n\nnamespace audioapi {\n\nAnalyserNodeHostObject::AnalyserNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const AnalyserOptions &options)\n    : AudioNodeHostObject(context->createAnalyser(options), options) {\n  addGetters(\n      JSI_EXPORT_PROPERTY_GETTER(AnalyserNodeHostObject, fftSize),\n      JSI_EXPORT_PROPERTY_GETTER(AnalyserNodeHostObject, minDecibels),\n      JSI_EXPORT_PROPERTY_GETTER(AnalyserNodeHostObject, maxDecibels),\n      JSI_EXPORT_PROPERTY_GETTER(AnalyserNodeHostObject, smoothingTimeConstant));\n\n  addSetters(\n      JSI_EXPORT_PROPERTY_SETTER(AnalyserNodeHostObject, fftSize),\n      JSI_EXPORT_PROPERTY_SETTER(AnalyserNodeHostObject, minDecibels),\n      JSI_EXPORT_PROPERTY_SETTER(AnalyserNodeHostObject, maxDecibels),\n      JSI_EXPORT_PROPERTY_SETTER(AnalyserNodeHostObject, smoothingTimeConstant));\n\n  addFunctions(\n      JSI_EXPORT_FUNCTION(AnalyserNodeHostObject, getFloatFrequencyData),\n      JSI_EXPORT_FUNCTION(AnalyserNodeHostObject, getByteFrequencyData),\n      JSI_EXPORT_FUNCTION(AnalyserNodeHostObject, getFloatTimeDomainData),\n      JSI_EXPORT_FUNCTION(AnalyserNodeHostObject, getByteTimeDomainData));\n}\n\nJSI_PROPERTY_GETTER_IMPL(AnalyserNodeHostObject, fftSize) {\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  return {analyserNode->getFFTSize()};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AnalyserNodeHostObject, minDecibels) {\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  return {analyserNode->getMinDecibels()};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AnalyserNodeHostObject, maxDecibels) {\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  return {analyserNode->getMaxDecibels()};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AnalyserNodeHostObject, smoothingTimeConstant) {\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  return {analyserNode->getSmoothingTimeConstant()};\n}\n\nJSI_PROPERTY_SETTER_IMPL(AnalyserNodeHostObject, fftSize) {\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n\n  auto fftSize = static_cast<int>(value.getNumber());\n  analyserNode->setFFTSize(fftSize);\n}\n\nJSI_PROPERTY_SETTER_IMPL(AnalyserNodeHostObject, minDecibels) {\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  auto minDecibels = static_cast<float>(value.getNumber());\n  analyserNode->setMinDecibels(minDecibels);\n}\n\nJSI_PROPERTY_SETTER_IMPL(AnalyserNodeHostObject, maxDecibels) {\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  auto maxDecibels = static_cast<float>(value.getNumber());\n  analyserNode->setMaxDecibels(maxDecibels);\n}\n\nJSI_PROPERTY_SETTER_IMPL(AnalyserNodeHostObject, smoothingTimeConstant) {\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  auto smoothingTimeConstant = static_cast<float>(value.getNumber());\n  analyserNode->setSmoothingTimeConstant(smoothingTimeConstant);\n}\n\nJSI_HOST_FUNCTION_IMPL(AnalyserNodeHostObject, getFloatFrequencyData) {\n  auto arrayBuffer =\n      args[0].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto data = reinterpret_cast<float *>(arrayBuffer.data(runtime));\n  auto length = static_cast<int>(arrayBuffer.size(runtime) / sizeof(float));\n\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  analyserNode->getFloatFrequencyData(data, length);\n\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AnalyserNodeHostObject, getByteFrequencyData) {\n  auto arrayBuffer =\n      args[0].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto data = arrayBuffer.data(runtime);\n  auto length = static_cast<int>(arrayBuffer.size(runtime));\n\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  analyserNode->getByteFrequencyData(data, length);\n\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AnalyserNodeHostObject, getFloatTimeDomainData) {\n  auto arrayBuffer =\n      args[0].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto data = reinterpret_cast<float *>(arrayBuffer.data(runtime));\n  auto length = static_cast<int>(arrayBuffer.size(runtime) / sizeof(float));\n\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  analyserNode->getFloatTimeDomainData(data, length);\n\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AnalyserNodeHostObject, getByteTimeDomainData) {\n  auto arrayBuffer =\n      args[0].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto data = arrayBuffer.data(runtime);\n  auto length = static_cast<int>(arrayBuffer.size(runtime));\n\n  auto analyserNode = std::static_pointer_cast<AnalyserNode>(node_);\n  analyserNode->getByteTimeDomainData(data, length);\n\n  return jsi::Value::undefined();\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/analysis/AnalyserNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct AnalyserOptions;\nclass BaseAudioContext;\n\nclass AnalyserNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit AnalyserNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const AnalyserOptions &options);\n\n  JSI_PROPERTY_GETTER_DECL(fftSize);\n  JSI_PROPERTY_GETTER_DECL(minDecibels);\n  JSI_PROPERTY_GETTER_DECL(maxDecibels);\n  JSI_PROPERTY_GETTER_DECL(smoothingTimeConstant);\n\n  JSI_PROPERTY_SETTER_DECL(fftSize);\n  JSI_PROPERTY_SETTER_DECL(minDecibels);\n  JSI_PROPERTY_SETTER_DECL(maxDecibels);\n  JSI_PROPERTY_SETTER_DECL(smoothingTimeConstant);\n\n  JSI_HOST_FUNCTION_DECL(getFloatFrequencyData);\n  JSI_HOST_FUNCTION_DECL(getByteFrequencyData);\n  JSI_HOST_FUNCTION_DECL(getFloatTimeDomainData);\n  JSI_HOST_FUNCTION_DECL(getByteTimeDomainData);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/destinations/AudioDestinationNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n#include <audioapi/core/destinations/AudioDestinationNode.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass AudioDestinationNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit AudioDestinationNodeHostObject(const std::shared_ptr<AudioDestinationNode> &node)\n      : AudioNodeHostObject(node, AudioDestinationOptions()) {}\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/AudioParamHostObject.h>\n#include <audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h>\n#include <audioapi/HostObjects/utils/JsEnumParser.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/BiquadFilterNode.h>\n#include <audioapi/core/types/BiquadFilterType.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nBiquadFilterNodeHostObject::BiquadFilterNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const BiquadFilterOptions &options)\n    : AudioNodeHostObject(context->createBiquadFilter(options), options), type_(options.type) {\n  auto biquadFilterNode = std::static_pointer_cast<BiquadFilterNode>(node_);\n  frequencyParam_ = std::make_shared<AudioParamHostObject>(biquadFilterNode->getFrequencyParam());\n  detuneParam_ = std::make_shared<AudioParamHostObject>(biquadFilterNode->getDetuneParam());\n  QParam_ = std::make_shared<AudioParamHostObject>(biquadFilterNode->getQParam());\n  gainParam_ = std::make_shared<AudioParamHostObject>(biquadFilterNode->getGainParam());\n\n  addGetters(\n      JSI_EXPORT_PROPERTY_GETTER(BiquadFilterNodeHostObject, frequency),\n      JSI_EXPORT_PROPERTY_GETTER(BiquadFilterNodeHostObject, detune),\n      JSI_EXPORT_PROPERTY_GETTER(BiquadFilterNodeHostObject, Q),\n      JSI_EXPORT_PROPERTY_GETTER(BiquadFilterNodeHostObject, gain),\n      JSI_EXPORT_PROPERTY_GETTER(BiquadFilterNodeHostObject, type));\n\n  addSetters(JSI_EXPORT_PROPERTY_SETTER(BiquadFilterNodeHostObject, type));\n\n  addFunctions(JSI_EXPORT_FUNCTION(BiquadFilterNodeHostObject, getFrequencyResponse));\n}\n\nJSI_PROPERTY_GETTER_IMPL(BiquadFilterNodeHostObject, frequency) {\n  return jsi::Object::createFromHostObject(runtime, frequencyParam_);\n}\n\nJSI_PROPERTY_GETTER_IMPL(BiquadFilterNodeHostObject, detune) {\n  return jsi::Object::createFromHostObject(runtime, detuneParam_);\n}\n\nJSI_PROPERTY_GETTER_IMPL(BiquadFilterNodeHostObject, Q) {\n  return jsi::Object::createFromHostObject(runtime, QParam_);\n}\n\nJSI_PROPERTY_GETTER_IMPL(BiquadFilterNodeHostObject, gain) {\n  return jsi::Object::createFromHostObject(runtime, gainParam_);\n}\n\nJSI_PROPERTY_GETTER_IMPL(BiquadFilterNodeHostObject, type) {\n  return jsi::String::createFromUtf8(runtime, js_enum_parser::filterTypeToString(type_));\n}\n\nJSI_PROPERTY_SETTER_IMPL(BiquadFilterNodeHostObject, type) {\n  auto biquadFilterNode = std::static_pointer_cast<BiquadFilterNode>(node_);\n\n  auto type = js_enum_parser::filterTypeFromString(value.asString(runtime).utf8(runtime));\n  auto event = [biquadFilterNode, type](BaseAudioContext &) {\n    biquadFilterNode->setType(type);\n  };\n  biquadFilterNode->scheduleAudioEvent(std::move(event));\n  type_ = type;\n}\n\nJSI_HOST_FUNCTION_IMPL(BiquadFilterNodeHostObject, getFrequencyResponse) {\n  auto arrayBufferFrequency =\n      args[0].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto frequencyArray = reinterpret_cast<float *>(arrayBufferFrequency.data(runtime));\n  auto length = static_cast<size_t>(arrayBufferFrequency.size(runtime) / sizeof(float));\n\n  auto arrayBufferMag =\n      args[1].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto magResponseOut = reinterpret_cast<float *>(arrayBufferMag.data(runtime));\n\n  auto arrayBufferPhase =\n      args[2].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto phaseResponseOut = reinterpret_cast<float *>(arrayBufferPhase.data(runtime));\n\n  auto biquadFilterNode = std::static_pointer_cast<BiquadFilterNode>(node_);\n  biquadFilterNode->getFrequencyResponse(\n      frequencyArray, magResponseOut, phaseResponseOut, length, type_);\n\n  return jsi::Value::undefined();\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/BiquadFilterNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct BiquadFilterOptions;\nclass BaseAudioContext;\nclass AudioParamHostObject;\n\nclass BiquadFilterNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit BiquadFilterNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const BiquadFilterOptions &options);\n\n  JSI_PROPERTY_GETTER_DECL(frequency);\n  JSI_PROPERTY_GETTER_DECL(detune);\n  JSI_PROPERTY_GETTER_DECL(Q);\n  JSI_PROPERTY_GETTER_DECL(gain);\n  JSI_PROPERTY_GETTER_DECL(type);\n\n  JSI_PROPERTY_SETTER_DECL(type);\n\n  JSI_HOST_FUNCTION_DECL(getFrequencyResponse);\n\n private:\n  std::shared_ptr<AudioParamHostObject> frequencyParam_;\n  std::shared_ptr<AudioParamHostObject> detuneParam_;\n  std::shared_ptr<AudioParamHostObject> QParam_;\n  std::shared_ptr<AudioParamHostObject> gainParam_;\n\n  BiquadFilterType type_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/effects/ConvolverNodeHostObject.h>\n#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/ConvolverNode.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/dsp/Convolver.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <audioapi/utils/ThreadPool.hpp>\n\n#include <memory>\n#include <utility>\n#include <vector>\n\nnamespace audioapi {\n\nConvolverNodeHostObject::ConvolverNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const ConvolverOptions &options)\n    : AudioNodeHostObject(context->createConvolver(options), options),\n      normalize_(!options.disableNormalization) {\n  if (options.buffer != nullptr) {\n    setBuffer(options.buffer);\n  }\n\n  addGetters(JSI_EXPORT_PROPERTY_GETTER(ConvolverNodeHostObject, normalize));\n  addSetters(JSI_EXPORT_PROPERTY_SETTER(ConvolverNodeHostObject, normalize));\n  addFunctions(JSI_EXPORT_FUNCTION(ConvolverNodeHostObject, setBuffer));\n}\n\nJSI_PROPERTY_GETTER_IMPL(ConvolverNodeHostObject, normalize) {\n  return jsi::Value(normalize_);\n}\n\nJSI_PROPERTY_SETTER_IMPL(ConvolverNodeHostObject, normalize) {\n  normalize_ = value.getBool();\n  ;\n}\n\nJSI_HOST_FUNCTION_IMPL(ConvolverNodeHostObject, setBuffer) {\n  if (!args[0].isObject()) {\n    return jsi::Value::undefined();\n  }\n\n  auto bufferHostObject = args[0].getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);\n  thisValue.asObject(runtime).setExternalMemoryPressure(\n      runtime, bufferHostObject->getSizeInBytes());\n\n  setBuffer(bufferHostObject->audioBuffer_);\n\n  return jsi::Value::undefined();\n}\n\nvoid ConvolverNodeHostObject::setBuffer(const std::shared_ptr<AudioBuffer> &buffer) {\n  if (buffer == nullptr) {\n    return;\n  }\n\n  auto convolverNode = std::static_pointer_cast<ConvolverNode>(node_);\n\n  auto copiedBuffer = std::make_shared<AudioBuffer>(*buffer);\n\n  float scaleFactor = 1.0f;\n  if (normalize_) {\n    scaleFactor = convolverNode->calculateNormalizationScale(copiedBuffer);\n  }\n\n  auto threadPool = std::make_shared<ThreadPool>(4);\n  std::vector<std::unique_ptr<Convolver>> convolvers;\n  for (size_t i = 0; i < copiedBuffer->getNumberOfChannels(); ++i) {\n    AudioArray channelData(*copiedBuffer->getChannel(i));\n    convolvers.push_back(std::make_unique<Convolver>());\n    convolvers.back()->init(RENDER_QUANTUM_SIZE, channelData, copiedBuffer->getSize());\n  }\n  if (copiedBuffer->getNumberOfChannels() == 1) {\n    // add one more convolver, because right now input is always stereo\n    AudioArray channelData(*copiedBuffer->getChannel(0));\n    convolvers.push_back(std::make_unique<Convolver>());\n    convolvers.back()->init(RENDER_QUANTUM_SIZE, channelData, copiedBuffer->getSize());\n  }\n\n  auto internalBuffer = std::make_shared<DSPAudioBuffer>(\n      RENDER_QUANTUM_SIZE * 2, convolverNode->getChannelCount(), copiedBuffer->getSampleRate());\n  auto intermediateBuffer = std::make_shared<DSPAudioBuffer>(\n      RENDER_QUANTUM_SIZE, convolvers.size(), copiedBuffer->getSampleRate());\n\n  struct SetupData {\n    std::shared_ptr<AudioBuffer> buffer;\n    std::vector<std::unique_ptr<Convolver>> convolvers;\n    std::shared_ptr<ThreadPool> threadPool;\n    std::shared_ptr<DSPAudioBuffer> internalBuffer;\n    std::shared_ptr<DSPAudioBuffer> intermediateBuffer;\n    float scaleFactor;\n  };\n\n  auto setupData = std::make_shared<SetupData>(SetupData{\n      .buffer = copiedBuffer,\n      .convolvers = std::move(convolvers),\n      .threadPool = threadPool,\n      .internalBuffer = internalBuffer,\n      .intermediateBuffer = intermediateBuffer,\n      .scaleFactor = scaleFactor});\n\n  auto event = [convolverNode, setupData](BaseAudioContext &) {\n    convolverNode->setBuffer(\n        setupData->buffer,\n        std::move(setupData->convolvers),\n        setupData->threadPool,\n        setupData->internalBuffer,\n        setupData->intermediateBuffer,\n        setupData->scaleFactor);\n  };\n  convolverNode->scheduleAudioEvent(std::move(event));\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/ConvolverNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct ConvolverOptions;\nclass BaseAudioContext;\n\nclass ConvolverNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit ConvolverNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const ConvolverOptions &options);\n  JSI_PROPERTY_GETTER_DECL(normalize);\n  JSI_PROPERTY_SETTER_DECL(normalize);\n  JSI_HOST_FUNCTION_DECL(setBuffer);\n\n private:\n  bool normalize_;\n  void setBuffer(const std::shared_ptr<AudioBuffer> &buffer);\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/AudioParamHostObject.h>\n#include <audioapi/HostObjects/effects/DelayNodeHostObject.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/DelayNode.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <memory>\n\nnamespace audioapi {\n\nDelayNodeHostObject::DelayNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const DelayOptions &options)\n    : AudioNodeHostObject(context->createDelay(options), options) {\n  auto delayNode = std::static_pointer_cast<DelayNode>(node_);\n  delayTimeParam_ = std::make_shared<AudioParamHostObject>(delayNode->getDelayTimeParam());\n  addGetters(JSI_EXPORT_PROPERTY_GETTER(DelayNodeHostObject, delayTime));\n}\n\nJSI_PROPERTY_GETTER_IMPL(DelayNodeHostObject, delayTime) {\n  return jsi::Object::createFromHostObject(runtime, delayTimeParam_);\n}\n\nsize_t DelayNodeHostObject::getSizeInBytes() const {\n  auto delayNode = std::static_pointer_cast<DelayNode>(node_);\n  auto base = sizeof(float) * delayNode->getDelayTimeParam()->getMaxValue();\n  return base * delayNode->getContextSampleRate();\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/DelayNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct DelayOptions;\nclass BaseAudioContext;\nclass AudioParamHostObject;\n\nclass DelayNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit DelayNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const DelayOptions &options);\n\n  [[nodiscard]] size_t getSizeInBytes() const;\n\n  JSI_PROPERTY_GETTER_DECL(delayTime);\n\n private:\n  std::shared_ptr<AudioParamHostObject> delayTimeParam_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/effects/GainNodeHostObject.h>\n\n#include <audioapi/HostObjects/AudioParamHostObject.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/GainNode.h>\n#include <audioapi/types/NodeOptions.h>\n#include <memory>\n\nnamespace audioapi {\n\nGainNodeHostObject::GainNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const GainOptions &options)\n    : AudioNodeHostObject(context->createGain(options), options) {\n  auto gainNode = std::static_pointer_cast<GainNode>(node_);\n  gainParam_ = std::make_shared<AudioParamHostObject>(gainNode->getGainParam());\n\n  addGetters(JSI_EXPORT_PROPERTY_GETTER(GainNodeHostObject, gain));\n}\n\nJSI_PROPERTY_GETTER_IMPL(GainNodeHostObject, gain) {\n  return jsi::Object::createFromHostObject(runtime, gainParam_);\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/GainNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct GainOptions;\nclass BaseAudioContext;\nclass AudioParamHostObject;\n\nclass GainNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit GainNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const GainOptions &options);\n\n  JSI_PROPERTY_GETTER_DECL(gain);\n\n private:\n  std::shared_ptr<AudioParamHostObject> gainParam_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/effects/IIRFilterNodeHostObject.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/IIRFilterNode.h>\n#include <audioapi/types/NodeOptions.h>\n#include <memory>\n\nnamespace audioapi {\n\nIIRFilterNodeHostObject::IIRFilterNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const IIRFilterOptions &options)\n    : AudioNodeHostObject(context->createIIRFilter(options), options) {\n\n  addFunctions(JSI_EXPORT_FUNCTION(IIRFilterNodeHostObject, getFrequencyResponse));\n}\n\nJSI_HOST_FUNCTION_IMPL(IIRFilterNodeHostObject, getFrequencyResponse) {\n  auto arrayBufferFrequency =\n      args[0].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto frequencyArray = reinterpret_cast<float *>(arrayBufferFrequency.data(runtime));\n  auto length = static_cast<size_t>(arrayBufferFrequency.size(runtime) / sizeof(float));\n\n  auto arrayBufferMag =\n      args[1].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto magResponseOut = reinterpret_cast<float *>(arrayBufferMag.data(runtime));\n\n  auto arrayBufferPhase =\n      args[2].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto phaseResponseOut = reinterpret_cast<float *>(arrayBufferPhase.data(runtime));\n\n  auto iirFilterNode = std::static_pointer_cast<IIRFilterNode>(node_);\n  iirFilterNode->getFrequencyResponse(frequencyArray, magResponseOut, phaseResponseOut, length);\n\n  return jsi::Value::undefined();\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/IIRFilterNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct IIRFilterOptions;\nclass BaseAudioContext;\n\nclass IIRFilterNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit IIRFilterNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const IIRFilterOptions &options);\n\n  JSI_HOST_FUNCTION_DECL(getFrequencyResponse);\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/PeriodicWaveHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/core/effects/PeriodicWave.h>\n\n#include <jsi/jsi.h>\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass PeriodicWaveHostObject : public jsi::HostObject {\n public:\n  std::shared_ptr<PeriodicWave> periodicWave_;\n\n  explicit PeriodicWaveHostObject(const std::shared_ptr<PeriodicWave> &periodicWave)\n      : periodicWave_(periodicWave) {}\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/effects/StereoPannerNodeHostObject.h>\n\n#include <audioapi/HostObjects/AudioParamHostObject.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/StereoPannerNode.h>\n#include <audioapi/types/NodeOptions.h>\n#include <memory>\n\nnamespace audioapi {\n\nStereoPannerNodeHostObject::StereoPannerNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const StereoPannerOptions &options)\n    : AudioNodeHostObject(context->createStereoPanner(options), options) {\n  auto stereoPannerNode = std::static_pointer_cast<StereoPannerNode>(node_);\n  panParam_ = std::make_shared<AudioParamHostObject>(stereoPannerNode->getPanParam());\n\n  addGetters(JSI_EXPORT_PROPERTY_GETTER(StereoPannerNodeHostObject, pan));\n}\n\nJSI_PROPERTY_GETTER_IMPL(StereoPannerNodeHostObject, pan) {\n  return jsi::Object::createFromHostObject(runtime, panParam_);\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/StereoPannerNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct StereoPannerOptions;\nclass BaseAudioContext;\nclass AudioParamHostObject;\n\nclass StereoPannerNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit StereoPannerNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const StereoPannerOptions &options);\n\n  JSI_PROPERTY_GETTER_DECL(pan);\n\n private:\n  std::shared_ptr<AudioParamHostObject> panParam_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/effects/WaveShaperNodeHostObject.h>\n#include <audioapi/HostObjects/utils/JsEnumParser.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/WaveShaperNode.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nWaveShaperNodeHostObject::WaveShaperNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const WaveShaperOptions &options)\n    : AudioNodeHostObject(context->createWaveShaper(options), options),\n      oversample_(options.oversample) {\n  addGetters(JSI_EXPORT_PROPERTY_GETTER(WaveShaperNodeHostObject, oversample));\n  addSetters(JSI_EXPORT_PROPERTY_SETTER(WaveShaperNodeHostObject, oversample));\n  addFunctions(JSI_EXPORT_FUNCTION(WaveShaperNodeHostObject, setCurve));\n}\n\nJSI_PROPERTY_GETTER_IMPL(WaveShaperNodeHostObject, oversample) {\n  return jsi::String::createFromUtf8(runtime, js_enum_parser::overSampleTypeToString(oversample_));\n}\n\nJSI_PROPERTY_SETTER_IMPL(WaveShaperNodeHostObject, oversample) {\n  auto waveShaperNode = std::static_pointer_cast<WaveShaperNode>(node_);\n\n  auto oversample = js_enum_parser::overSampleTypeFromString(value.asString(runtime).utf8(runtime));\n  auto event = [waveShaperNode, oversample](BaseAudioContext &) {\n    waveShaperNode->setOversample(oversample);\n  };\n  waveShaperNode->scheduleAudioEvent(std::move(event));\n  oversample_ = oversample;\n}\n\nJSI_HOST_FUNCTION_IMPL(WaveShaperNodeHostObject, setCurve) {\n  auto waveShaperNode = std::static_pointer_cast<WaveShaperNode>(node_);\n\n  std::shared_ptr<AudioArray> curve = nullptr;\n\n  if (args[0].isObject()) {\n    auto arrayBuffer =\n        args[0].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n    // *2 because it is copied to internal curve array for processing\n    thisValue.asObject(runtime).setExternalMemoryPressure(runtime, arrayBuffer.size(runtime) * 2);\n\n    auto size = static_cast<size_t>(arrayBuffer.size(runtime) / sizeof(float));\n    curve =\n        std::make_shared<AudioArray>(reinterpret_cast<float *>(arrayBuffer.data(runtime)), size);\n  }\n\n  auto event = [waveShaperNode, curve](BaseAudioContext &) {\n    waveShaperNode->setCurve(curve);\n  };\n  waveShaperNode->scheduleAudioEvent(std::move(event));\n\n  return jsi::Value::undefined();\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/WaveShaperNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n#include <audioapi/core/types/OverSampleType.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct WaveShaperOptions;\nclass BaseAudioContext;\n\nclass WaveShaperNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit WaveShaperNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const WaveShaperOptions &options);\n\n  JSI_PROPERTY_GETTER_DECL(oversample);\n\n  JSI_PROPERTY_SETTER_DECL(oversample);\n  JSI_HOST_FUNCTION_DECL(setCurve);\n\n private:\n  OverSampleType oversample_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/WorkletNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n#include <audioapi/core/effects/WorkletNode.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass WorkletNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit WorkletNodeHostObject(const std::shared_ptr<WorkletNode> &node)\n      : AudioNodeHostObject(node) {}\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/effects/WorkletProcessingNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n#include <audioapi/core/effects/WorkletProcessingNode.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass WorkletProcessingNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit WorkletProcessingNodeHostObject(const std::shared_ptr<WorkletProcessingNode> &node)\n      : AudioNodeHostObject(node) {}\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.cpp",
    "content": "#include <audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h>\n\n#include <audioapi/HostObjects/utils/JsEnumParser.h>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <memory>\n\nnamespace audioapi {\n\nAudioEventHandlerRegistryHostObject::AudioEventHandlerRegistryHostObject(\n    const std::shared_ptr<AudioEventHandlerRegistry> &eventHandlerRegistry)\n    : eventHandlerRegistry_(eventHandlerRegistry) {\n  addFunctions(\n      JSI_EXPORT_FUNCTION(AudioEventHandlerRegistryHostObject, addAudioEventListener),\n      JSI_EXPORT_FUNCTION(AudioEventHandlerRegistryHostObject, removeAudioEventListener));\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioEventHandlerRegistryHostObject, addAudioEventListener) {\n  auto eventName = args[0].getString(runtime).utf8(runtime);\n  auto callback = std::make_shared<jsi::Function>(args[1].getObject(runtime).getFunction(runtime));\n\n  auto listenerId = eventHandlerRegistry_->registerHandler(\n      js_enum_parser::audioEventFromString(eventName), callback);\n\n  return jsi::String::createFromUtf8(runtime, std::to_string(listenerId));\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioEventHandlerRegistryHostObject, removeAudioEventListener) {\n  auto eventName = args[0].getString(runtime).utf8(runtime);\n  uint64_t listenerId = std::stoull(args[1].getString(runtime).utf8(runtime));\n\n  eventHandlerRegistry_->unregisterHandler(\n      js_enum_parser::audioEventFromString(eventName), listenerId);\n\n  return jsi::Value::undefined();\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/events/AudioEventHandlerRegistryHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/jsi/JsiHostObject.h>\n\n#include <ReactCommon/CallInvoker.h>\n#include <jsi/jsi.h>\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass AudioEventHandlerRegistry;\n\nclass AudioEventHandlerRegistryHostObject : public JsiHostObject {\n public:\n  explicit AudioEventHandlerRegistryHostObject(\n      const std::shared_ptr<AudioEventHandlerRegistry> &eventHandlerRegistry);\n\n  JSI_HOST_FUNCTION_DECL(addAudioEventListener);\n  JSI_HOST_FUNCTION_DECL(removeAudioEventListener);\n\n private:\n  std::shared_ptr<AudioEventHandlerRegistry> eventHandlerRegistry_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp",
    "content": "#include <audioapi/HostObjects/inputs/AudioRecorderHostObject.h>\n\n#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h>\n#include <audioapi/core/inputs/AudioRecorder.h>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <audioapi/jsi/JsiUtils.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/AudioFileProperties.h>\n#ifdef ANDROID\n#include <audioapi/android/core/AndroidAudioRecorder.h>\n#else\n#include <audioapi/ios/core/IOSAudioRecorder.h>\n#endif\n#include <memory>\n\nnamespace audioapi {\n\nAudioRecorderHostObject::AudioRecorderHostObject(\n    const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry) {\n#ifdef ANDROID\n  audioRecorder_ = std::make_shared<AndroidAudioRecorder>(audioEventHandlerRegistry);\n#else\n  audioRecorder_ = std::make_shared<IOSAudioRecorder>(audioEventHandlerRegistry);\n#endif\n\n  addFunctions(\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, start),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, stop),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, isRecording),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, isPaused),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, enableFileOutput),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, disableFileOutput),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, pause),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, resume),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, connect),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, disconnect),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, setOnAudioReady),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, clearOnAudioReady),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, setOnError),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, clearOnError),\n      JSI_EXPORT_FUNCTION(AudioRecorderHostObject, getCurrentDuration));\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, start) {\n  auto fileNameOverride = jsiutils::argToString(runtime, args, count, 0, \"\");\n  auto result = audioRecorder_->start(fileNameOverride);\n  auto jsResult = jsi::Object(runtime);\n\n  jsResult.setProperty(\n      runtime,\n      \"status\",\n      jsi::String::createFromUtf8(runtime, result.is_ok() ? \"success\" : \"error\"));\n\n  if (!result.is_ok()) {\n    jsResult.setProperty(\n        runtime, \"message\", jsi::String::createFromUtf8(runtime, result.unwrap_err()));\n  }\n\n  return jsResult;\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, stop) {\n  auto result = audioRecorder_->stop();\n  auto jsResult = jsi::Object(runtime);\n\n  jsResult.setProperty(\n      runtime,\n      \"status\",\n      jsi::String::createFromUtf8(runtime, result.is_ok() ? \"success\" : \"error\"));\n\n  if (result.is_ok()) {\n    auto info = result.unwrap();\n    const auto &paths = std::get<0>(info);\n    auto pathsArray = jsi::Array(runtime, paths.size());\n    for (size_t i = 0; i < paths.size(); ++i) {\n      pathsArray.setValueAtIndex(runtime, i, jsi::String::createFromUtf8(runtime, paths[i]));\n    }\n    jsResult.setProperty(runtime, \"paths\", pathsArray);\n    jsResult.setProperty(runtime, \"size\", std::get<1>(info));\n    jsResult.setProperty(runtime, \"duration\", std::get<2>(info));\n  } else {\n    jsResult.setProperty(\n        runtime, \"message\", jsi::String::createFromUtf8(runtime, result.unwrap_err()));\n  }\n\n  return jsResult;\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, isRecording) {\n  return jsi::Value(audioRecorder_->isRecording());\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, isPaused) {\n  return jsi::Value(audioRecorder_->isPaused());\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, enableFileOutput) {\n  auto fileProperties = AudioFileProperties::CreateFromJSIValue(runtime, args[0]);\n\n  auto result = audioRecorder_->enableFileOutput(fileProperties);\n  auto jsResult = jsi::Object(runtime);\n\n  jsResult.setProperty(\n      runtime,\n      \"status\",\n      jsi::String::createFromUtf8(runtime, result.is_ok() ? \"success\" : \"error\"));\n\n  if (!result.is_ok()) {\n    jsResult.setProperty(\n        runtime, \"message\", jsi::String::createFromUtf8(runtime, result.unwrap_err()));\n  }\n\n  return jsResult;\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, disableFileOutput) {\n  audioRecorder_->disableFileOutput();\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, pause) {\n  audioRecorder_->pause();\n\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, resume) {\n  audioRecorder_->resume();\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, connect) {\n  auto adapterNodeHostObject =\n      args[0].getObject(runtime).getHostObject<RecorderAdapterNodeHostObject>(runtime);\n\n  audioRecorder_->connect(\n      std::static_pointer_cast<RecorderAdapterNode>(adapterNodeHostObject->node_));\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, disconnect) {\n  audioRecorder_->disconnect();\n\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, setOnAudioReady) {\n  auto options = args[0].getObject(runtime);\n\n  auto sampleRate = static_cast<float>(options.getProperty(runtime, \"sampleRate\").getNumber());\n  auto bufferLength = static_cast<size_t>(options.getProperty(runtime, \"bufferLength\").getNumber());\n  auto channelCount = static_cast<int>(options.getProperty(runtime, \"channelCount\").getNumber());\n  uint64_t callbackId =\n      std::stoull(options.getProperty(runtime, \"callbackId\").getString(runtime).utf8(runtime));\n\n  auto result =\n      audioRecorder_->setOnAudioReadyCallback(sampleRate, bufferLength, channelCount, callbackId);\n  auto jsResult = jsi::Object(runtime);\n\n  jsResult.setProperty(\n      runtime,\n      \"status\",\n      jsi::String::createFromUtf8(runtime, result.is_ok() ? \"success\" : \"error\"));\n\n  if (result.is_err()) {\n    jsResult.setProperty(\n        runtime, \"message\", jsi::String::createFromUtf8(runtime, result.unwrap_err()));\n  }\n\n  return jsResult;\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, clearOnAudioReady) {\n  audioRecorder_->clearOnAudioReadyCallback();\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, setOnError) {\n  auto options = args[0].getObject(runtime);\n\n  uint64_t callbackId =\n      std::stoull(options.getProperty(runtime, \"callbackId\").getString(runtime).utf8(runtime));\n\n  audioRecorder_->setOnErrorCallback(callbackId);\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, clearOnError) {\n  audioRecorder_->clearOnErrorCallback();\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioRecorderHostObject, getCurrentDuration) {\n  double duration = audioRecorder_->getCurrentDuration();\n  return jsi::Value(duration);\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/inputs/AudioRecorderHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/jsi/JsiHostObject.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass AudioRecorder;\nclass AudioEventHandlerRegistry;\n\nclass AudioRecorderHostObject : public JsiHostObject {\n public:\n  explicit AudioRecorderHostObject(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);\n\n  JSI_HOST_FUNCTION_DECL(start);\n  JSI_HOST_FUNCTION_DECL(stop);\n  JSI_HOST_FUNCTION_DECL(isRecording);\n  JSI_HOST_FUNCTION_DECL(isPaused);\n\n  JSI_HOST_FUNCTION_DECL(enableFileOutput);\n  JSI_HOST_FUNCTION_DECL(disableFileOutput);\n\n  JSI_HOST_FUNCTION_DECL(pause);\n  JSI_HOST_FUNCTION_DECL(resume);\n\n  JSI_HOST_FUNCTION_DECL(connect);\n  JSI_HOST_FUNCTION_DECL(disconnect);\n\n  JSI_HOST_FUNCTION_DECL(setOnAudioReady);\n  JSI_HOST_FUNCTION_DECL(clearOnAudioReady);\n\n  JSI_HOST_FUNCTION_DECL(setOnError);\n  JSI_HOST_FUNCTION_DECL(clearOnError);\n\n  JSI_HOST_FUNCTION_DECL(getCurrentDuration);\n\n private:\n  std::shared_ptr<AudioRecorder> audioRecorder_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/AudioParamHostObject.h>\n#include <audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h>\n#include <audioapi/core/sources/AudioBufferBaseSourceNode.h>\n#include <audioapi/dsp/AudioUtils.hpp>\n#include <audioapi/types/NodeOptions.h>\n\n#include <algorithm>\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nAudioBufferBaseSourceNodeHostObject::AudioBufferBaseSourceNodeHostObject(\n    const std::shared_ptr<AudioBufferBaseSourceNode> &node,\n    const BaseAudioBufferSourceOptions &options)\n    : AudioScheduledSourceNodeHostObject(node, options),\n      onPositionChangedInterval_(options.onPositionChangedInterval),\n      pitchCorrection_(options.pitchCorrection) {\n  auto sourceNode = std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);\n  detuneParam_ = std::make_shared<AudioParamHostObject>(sourceNode->getDetuneParam());\n  playbackRateParam_ = std::make_shared<AudioParamHostObject>(sourceNode->getPlaybackRateParam());\n\n  addGetters(\n      JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, detune),\n      JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, playbackRate),\n      JSI_EXPORT_PROPERTY_GETTER(AudioBufferBaseSourceNodeHostObject, onPositionChangedInterval));\n\n  addSetters(\n      JSI_EXPORT_PROPERTY_SETTER(AudioBufferBaseSourceNodeHostObject, onPositionChanged),\n      JSI_EXPORT_PROPERTY_SETTER(AudioBufferBaseSourceNodeHostObject, onPositionChangedInterval));\n\n  addFunctions(\n      JSI_EXPORT_FUNCTION(AudioBufferBaseSourceNodeHostObject, getInputLatency),\n      JSI_EXPORT_FUNCTION(AudioBufferBaseSourceNodeHostObject, getOutputLatency));\n}\n\nAudioBufferBaseSourceNodeHostObject::~AudioBufferBaseSourceNodeHostObject() {\n  // When JSI object is garbage collected (together with the eventual callback),\n  // underlying source node might still be active and try to call the\n  // non-existing callback.\n  setOnPositionChangedCallbackId(0);\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioBufferBaseSourceNodeHostObject, detune) {\n  return jsi::Object::createFromHostObject(runtime, detuneParam_);\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioBufferBaseSourceNodeHostObject, playbackRate) {\n  return jsi::Object::createFromHostObject(runtime, playbackRateParam_);\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioBufferBaseSourceNodeHostObject, onPositionChangedInterval) {\n  return {onPositionChangedInterval_};\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioBufferBaseSourceNodeHostObject, onPositionChanged) {\n  auto callbackId = std::stoull(value.getString(runtime).utf8(runtime));\n  setOnPositionChangedCallbackId(callbackId);\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioBufferBaseSourceNodeHostObject, onPositionChangedInterval) {\n  auto sourceNode = std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);\n  auto interval = static_cast<int>(value.getNumber());\n\n  auto event = [sourceNode, interval](BaseAudioContext &) {\n    sourceNode->setOnPositionChangedInterval(interval);\n  };\n\n  sourceNode->scheduleAudioEvent(std::move(event));\n  onPositionChangedInterval_ = interval;\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioBufferBaseSourceNodeHostObject, getInputLatency) {\n  return {inputLatency_};\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioBufferBaseSourceNodeHostObject, getOutputLatency) {\n  return {outputLatency_};\n}\n\nvoid AudioBufferBaseSourceNodeHostObject::setOnPositionChangedCallbackId(uint64_t callbackId) {\n  auto sourceNode = std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);\n\n  auto event = [sourceNode, callbackId](BaseAudioContext &) {\n    sourceNode->setOnPositionChangedCallbackId(callbackId);\n  };\n\n  sourceNode->unregisterOnPositionChangedCallback(onPositionChangedCallbackId_);\n  sourceNode->scheduleAudioEvent(std::move(event));\n  onPositionChangedCallbackId_ = callbackId;\n}\n\nvoid AudioBufferBaseSourceNodeHostObject::initStretch(int channelCount, float sampleRate) {\n  auto sourceNode = std::static_pointer_cast<AudioBufferBaseSourceNode>(node_);\n  auto stretch = std::make_shared<signalsmith::stretch::SignalsmithStretch<float>>();\n  stretch->presetDefault(channelCount, sampleRate);\n  inputLatency_ =\n      std::max(dsp::sampleFrameToTime(stretch->inputLatency(), node_->getContextSampleRate()), 0.0);\n  outputLatency_ = std::max(\n      dsp::sampleFrameToTime(stretch->outputLatency(), node_->getContextSampleRate()), 0.0);\n\n  auto playbackRateBuffer =\n      std::make_shared<DSPAudioBuffer>(3 * RENDER_QUANTUM_SIZE, channelCount, sampleRate);\n\n  auto event = [sourceNode, stretch, playbackRateBuffer](BaseAudioContext &) {\n    sourceNode->initStretch(stretch, playbackRateBuffer);\n  };\n  sourceNode->scheduleAudioEvent(std::move(event));\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass AudioBufferBaseSourceNode;\nstruct BaseAudioBufferSourceOptions;\nclass AudioParamHostObject;\n\nclass AudioBufferBaseSourceNodeHostObject : public AudioScheduledSourceNodeHostObject {\n public:\n  explicit AudioBufferBaseSourceNodeHostObject(\n      const std::shared_ptr<AudioBufferBaseSourceNode> &node,\n      const BaseAudioBufferSourceOptions &options);\n\n  ~AudioBufferBaseSourceNodeHostObject() override;\n\n  JSI_PROPERTY_GETTER_DECL(detune);\n  JSI_PROPERTY_GETTER_DECL(playbackRate);\n  JSI_PROPERTY_GETTER_DECL(onPositionChangedInterval);\n\n  JSI_PROPERTY_SETTER_DECL(onPositionChanged);\n  JSI_PROPERTY_SETTER_DECL(onPositionChangedInterval);\n\n  JSI_HOST_FUNCTION_DECL(getInputLatency);\n  JSI_HOST_FUNCTION_DECL(getOutputLatency);\n\n protected:\n  std::shared_ptr<AudioParamHostObject> detuneParam_;\n  std::shared_ptr<AudioParamHostObject> playbackRateParam_;\n\n  int onPositionChangedInterval_;\n  uint64_t onPositionChangedCallbackId_ = 0;\n\n  double inputLatency_ = 0;\n  double outputLatency_ = 0;\n  bool pitchCorrection_;\n\n  void setOnPositionChangedCallbackId(uint64_t callbackId);\n  void initStretch(int channelCount, float sampleRate);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.cpp",
    "content": "#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n\n#include <audioapi/utils/AudioArrayBuffer.hpp>\n\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nAudioBufferHostObject::AudioBufferHostObject(const std::shared_ptr<AudioBuffer> &audioBuffer)\n    : audioBuffer_(audioBuffer) {\n  addGetters(\n      JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, sampleRate),\n      JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, length),\n      JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, duration),\n      JSI_EXPORT_PROPERTY_GETTER(AudioBufferHostObject, numberOfChannels));\n\n  addFunctions(\n      JSI_EXPORT_FUNCTION(AudioBufferHostObject, getChannelData),\n      JSI_EXPORT_FUNCTION(AudioBufferHostObject, copyFromChannel),\n      JSI_EXPORT_FUNCTION(AudioBufferHostObject, copyToChannel));\n}\n\nAudioBufferHostObject::AudioBufferHostObject(AudioBufferHostObject &&other) noexcept\n    : JsiHostObject(std::move(other)), audioBuffer_(std::move(other.audioBuffer_)) {}\n\nJSI_PROPERTY_GETTER_IMPL(AudioBufferHostObject, sampleRate) {\n  return {audioBuffer_->getSampleRate()};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioBufferHostObject, length) {\n  return {static_cast<double>(audioBuffer_->getSize())};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioBufferHostObject, duration) {\n  return {audioBuffer_->getDuration()};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioBufferHostObject, numberOfChannels) {\n  return {static_cast<int>(audioBuffer_->getNumberOfChannels())};\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioBufferHostObject, getChannelData) {\n  auto channel = static_cast<int>(args[0].getNumber());\n  auto audioArrayBuffer = audioBuffer_->getSharedChannel(channel);\n  auto arrayBuffer = jsi::ArrayBuffer(runtime, audioArrayBuffer);\n\n  auto float32ArrayCtor = runtime.global().getPropertyAsFunction(runtime, \"Float32Array\");\n  auto float32Array = float32ArrayCtor.callAsConstructor(runtime, arrayBuffer).getObject(runtime);\n\n  float32Array.setExternalMemoryPressure(runtime, audioArrayBuffer->size());\n\n  return float32Array;\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioBufferHostObject, copyFromChannel) {\n  auto arrayBuffer =\n      args[0].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto *destination = reinterpret_cast<float *>(arrayBuffer.data(runtime));\n  auto length = arrayBuffer.size(runtime) / sizeof(float);\n  auto channelNumber = static_cast<int>(args[1].getNumber());\n  auto startInChannel = static_cast<size_t>(args[2].getNumber());\n\n  audioBuffer_->getChannel(channelNumber)->copyTo(destination, startInChannel, 0, length);\n\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioBufferHostObject, copyToChannel) {\n  auto arrayBuffer =\n      args[0].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto *source = reinterpret_cast<float *>(arrayBuffer.data(runtime));\n  auto length = arrayBuffer.size(runtime) / sizeof(float);\n  auto channelNumber = static_cast<int>(args[1].getNumber());\n  auto startInChannel = static_cast<size_t>(args[2].getNumber());\n\n  audioBuffer_->getChannel(channelNumber)->copy(source, 0, startInChannel, length);\n\n  return jsi::Value::undefined();\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/jsi/JsiHostObject.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <jsi/jsi.h>\n#include <cstddef>\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass AudioBufferHostObject : public JsiHostObject {\n public:\n  std::shared_ptr<AudioBuffer> audioBuffer_;\n\n  explicit AudioBufferHostObject(const std::shared_ptr<AudioBuffer> &audioBuffer);\n  AudioBufferHostObject(const AudioBufferHostObject &) = delete;\n  AudioBufferHostObject &operator=(const AudioBufferHostObject &) = delete;\n  AudioBufferHostObject(AudioBufferHostObject &&other) noexcept;\n  AudioBufferHostObject &operator=(AudioBufferHostObject &&other) noexcept {\n    if (this != &other) {\n      JsiHostObject::operator=(std::move(other));\n      audioBuffer_ = std::move(other.audioBuffer_);\n    }\n    return *this;\n  }\n\n  ~AudioBufferHostObject() override = default;\n\n  [[nodiscard]] size_t getSizeInBytes() const {\n    // *2 because every time buffer is passed we create a copy of it.\n    return audioBuffer_->getSize() * audioBuffer_->getNumberOfChannels() * sizeof(float) * 2;\n  }\n\n  JSI_PROPERTY_GETTER_DECL(sampleRate);\n  JSI_PROPERTY_GETTER_DECL(length);\n  JSI_PROPERTY_GETTER_DECL(duration);\n  JSI_PROPERTY_GETTER_DECL(numberOfChannels);\n\n  JSI_HOST_FUNCTION_DECL(getChannelData);\n  JSI_HOST_FUNCTION_DECL(copyFromChannel);\n  JSI_HOST_FUNCTION_DECL(copyToChannel);\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h>\n\n#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/AudioBufferQueueSourceNode.h>\n#include <audioapi/types/NodeOptions.h>\n#include <memory>\n#include <string>\n#include <utility>\n\nnamespace audioapi {\n\nAudioBufferQueueSourceNodeHostObject::AudioBufferQueueSourceNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const BaseAudioBufferSourceOptions &options)\n    : AudioBufferBaseSourceNodeHostObject(context->createBufferQueueSource(options), options) {\n  functions_->erase(\"start\");\n\n  addSetters(JSI_EXPORT_PROPERTY_SETTER(AudioBufferQueueSourceNodeHostObject, onBufferEnded));\n\n  addFunctions(\n      JSI_EXPORT_FUNCTION(AudioBufferQueueSourceNodeHostObject, start),\n      JSI_EXPORT_FUNCTION(AudioBufferQueueSourceNodeHostObject, enqueueBuffer),\n      JSI_EXPORT_FUNCTION(AudioBufferQueueSourceNodeHostObject, dequeueBuffer),\n      JSI_EXPORT_FUNCTION(AudioBufferQueueSourceNodeHostObject, clearBuffers),\n      JSI_EXPORT_FUNCTION(AudioBufferQueueSourceNodeHostObject, pause));\n}\n\nAudioBufferQueueSourceNodeHostObject::~AudioBufferQueueSourceNodeHostObject() {\n  // When JSI object is garbage collected (together with the eventual callback),\n  // underlying source node might still be active and try to call the\n  // non-existing callback.\n  setOnBufferEndedCallbackId(0);\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioBufferQueueSourceNodeHostObject, onBufferEnded) {\n  auto callbackId = std::stoull(value.getString(runtime).utf8(runtime));\n  setOnBufferEndedCallbackId(callbackId);\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioBufferQueueSourceNodeHostObject, start) {\n  auto audioBufferQueueSourceNode = std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);\n\n  auto event = [audioBufferQueueSourceNode,\n                when = args[0].getNumber(),\n                offset = args[1].getNumber()](BaseAudioContext &) {\n    audioBufferQueueSourceNode->start(when, offset);\n  };\n  audioBufferQueueSourceNode->scheduleAudioEvent(std::move(event));\n\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioBufferQueueSourceNodeHostObject, pause) {\n  auto audioBufferQueueSourceNode = std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);\n\n  auto event = [audioBufferQueueSourceNode](BaseAudioContext &) {\n    audioBufferQueueSourceNode->pause();\n  };\n  audioBufferQueueSourceNode->scheduleAudioEvent(std::move(event));\n\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioBufferQueueSourceNodeHostObject, enqueueBuffer) {\n  auto audioBufferQueueSourceNode = std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);\n\n  auto audioBufferHostObject =\n      args[0].getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);\n  // TODO: add optimized memory management for buffer changes, e.g.\n  //  when the same buffer is reused across threads and\n  // buffer modification is not allowed on JS thread\n  auto copiedBuffer = std::make_shared<AudioBuffer>(*audioBufferHostObject->audioBuffer_);\n  std::shared_ptr<AudioBuffer> tailBuffer = nullptr;\n\n  if (pitchCorrection_ && !stretchHasBeenInit_) {\n    initStretch(\n        static_cast<int>(copiedBuffer->getNumberOfChannels()), copiedBuffer->getSampleRate());\n    auto extraTailFrames =\n        static_cast<size_t>((inputLatency_ + outputLatency_) * copiedBuffer->getSampleRate());\n    tailBuffer = std::make_shared<AudioBuffer>(\n        copiedBuffer->getNumberOfChannels(), extraTailFrames, copiedBuffer->getSampleRate());\n    tailBuffer->zero();\n    stretchHasBeenInit_ = true;\n  }\n\n  auto event = [audioBufferQueueSourceNode, copiedBuffer, bufferId = bufferId_, tailBuffer](\n                   BaseAudioContext &) {\n    audioBufferQueueSourceNode->enqueueBuffer(copiedBuffer, bufferId, tailBuffer);\n  };\n  audioBufferQueueSourceNode->scheduleAudioEvent(std::move(event));\n\n  return jsi::String::createFromUtf8(runtime, std::to_string(bufferId_++));\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioBufferQueueSourceNodeHostObject, dequeueBuffer) {\n  auto audioBufferQueueSourceNode = std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);\n\n  auto event = [audioBufferQueueSourceNode,\n                bufferId = static_cast<size_t>(args[0].getNumber())](BaseAudioContext &) {\n    audioBufferQueueSourceNode->dequeueBuffer(bufferId);\n  };\n  audioBufferQueueSourceNode->scheduleAudioEvent(std::move(event));\n\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioBufferQueueSourceNodeHostObject, clearBuffers) {\n  auto audioBufferQueueSourceNode = std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);\n\n  auto event = [audioBufferQueueSourceNode](BaseAudioContext &) {\n    audioBufferQueueSourceNode->clearBuffers();\n  };\n  audioBufferQueueSourceNode->scheduleAudioEvent(std::move(event));\n\n  return jsi::Value::undefined();\n}\n\nvoid AudioBufferQueueSourceNodeHostObject::setOnBufferEndedCallbackId(uint64_t callbackId) {\n  auto audioBufferQueueSourceNode = std::static_pointer_cast<AudioBufferQueueSourceNode>(node_);\n\n  auto event = [audioBufferQueueSourceNode, callbackId](BaseAudioContext &) {\n    audioBufferQueueSourceNode->setOnBufferEndedCallbackId(callbackId);\n  };\n\n  audioBufferQueueSourceNode->unregisterOnBufferEndedCallback(onBufferEndedCallbackId_);\n  audioBufferQueueSourceNode->scheduleAudioEvent(std::move(event));\n  onBufferEndedCallbackId_ = callbackId;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferQueueSourceNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct BaseAudioBufferSourceOptions;\nclass BaseAudioContext;\n\nclass AudioBufferQueueSourceNodeHostObject : public AudioBufferBaseSourceNodeHostObject {\n public:\n  explicit AudioBufferQueueSourceNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const BaseAudioBufferSourceOptions &options);\n\n  ~AudioBufferQueueSourceNodeHostObject() override;\n\n  JSI_PROPERTY_SETTER_DECL(onBufferEnded);\n\n  JSI_HOST_FUNCTION_DECL(start);\n  JSI_HOST_FUNCTION_DECL(pause);\n  JSI_HOST_FUNCTION_DECL(enqueueBuffer);\n  JSI_HOST_FUNCTION_DECL(dequeueBuffer);\n  JSI_HOST_FUNCTION_DECL(clearBuffers);\n\n protected:\n  size_t bufferId_ = 0;\n  uint64_t onBufferEndedCallbackId_ = 0;\n  bool stretchHasBeenInit_ = false;\n\n  void setOnBufferEndedCallbackId(uint64_t callbackId);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h>\n\n#include <audioapi/HostObjects/AudioParamHostObject.h>\n#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/AudioBufferSourceNode.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nAudioBufferSourceNodeHostObject::AudioBufferSourceNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const AudioBufferSourceOptions &options)\n    : AudioBufferBaseSourceNodeHostObject(context->createBufferSource(options), options),\n      loop_(options.loop),\n      loopSkip_(options.loopSkip),\n      loopStart_(options.loopStart),\n      loopEnd_(options.loopEnd) {\n  if (options.buffer != nullptr) {\n    setBuffer(options.buffer);\n  }\n\n  addGetters(\n      JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loop),\n      JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopSkip),\n      JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopStart),\n      JSI_EXPORT_PROPERTY_GETTER(AudioBufferSourceNodeHostObject, loopEnd));\n\n  addSetters(\n      JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loop),\n      JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopSkip),\n      JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopStart),\n      JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, loopEnd),\n      JSI_EXPORT_PROPERTY_SETTER(AudioBufferSourceNodeHostObject, onLoopEnded));\n\n  // start method is overridden in this class\n  functions_->erase(\"start\");\n\n  addFunctions(\n      JSI_EXPORT_FUNCTION(AudioBufferSourceNodeHostObject, start),\n      JSI_EXPORT_FUNCTION(AudioBufferSourceNodeHostObject, setBuffer));\n}\n\nAudioBufferSourceNodeHostObject::~AudioBufferSourceNodeHostObject() {\n  // When JSI object is garbage collected (together with the eventual callback),\n  // underlying source node might still be active and try to call the\n  // non-existing callback.\n  setOnLoopEndedCallbackId(0);\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioBufferSourceNodeHostObject, loop) {\n  return {loop_};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioBufferSourceNodeHostObject, loopSkip) {\n  return {loopSkip_};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioBufferSourceNodeHostObject, loopStart) {\n  return {loopStart_};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioBufferSourceNodeHostObject, loopEnd) {\n  return {loopEnd_};\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioBufferSourceNodeHostObject, loop) {\n  auto audioBufferSourceNode = std::static_pointer_cast<AudioBufferSourceNode>(node_);\n  auto loop = value.getBool();\n\n  auto event = [audioBufferSourceNode, loop](BaseAudioContext &) {\n    audioBufferSourceNode->setLoop(loop);\n  };\n\n  audioBufferSourceNode->scheduleAudioEvent(std::move(event));\n  loop_ = loop;\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioBufferSourceNodeHostObject, loopSkip) {\n  auto audioBufferSourceNode = std::static_pointer_cast<AudioBufferSourceNode>(node_);\n  auto loopSkip = value.getBool();\n\n  auto event = [audioBufferSourceNode, loopSkip](BaseAudioContext &) {\n    audioBufferSourceNode->setLoopSkip(loopSkip);\n  };\n\n  audioBufferSourceNode->scheduleAudioEvent(std::move(event));\n  loopSkip_ = loopSkip;\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioBufferSourceNodeHostObject, loopStart) {\n  auto audioBufferSourceNode = std::static_pointer_cast<AudioBufferSourceNode>(node_);\n  auto loopStart = value.getNumber();\n\n  auto event = [audioBufferSourceNode, loopStart](BaseAudioContext &) {\n    audioBufferSourceNode->setLoopStart(loopStart);\n  };\n\n  audioBufferSourceNode->scheduleAudioEvent(std::move(event));\n  loopStart_ = loopStart;\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioBufferSourceNodeHostObject, loopEnd) {\n  auto audioBufferSourceNode = std::static_pointer_cast<AudioBufferSourceNode>(node_);\n  auto loopEnd = value.getNumber();\n\n  auto event = [audioBufferSourceNode, loopEnd](BaseAudioContext &) {\n    audioBufferSourceNode->setLoopEnd(loopEnd);\n  };\n\n  audioBufferSourceNode->scheduleAudioEvent(std::move(event));\n  loopEnd_ = loopEnd;\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioBufferSourceNodeHostObject, onLoopEnded) {\n  auto callbackId = std::stoull(value.getString(runtime).utf8(runtime));\n  setOnLoopEndedCallbackId(callbackId);\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioBufferSourceNodeHostObject, start) {\n  auto audioBufferSourceNode = std::static_pointer_cast<AudioBufferSourceNode>(node_);\n\n  auto event = [audioBufferSourceNode,\n                when = args[0].getNumber(),\n                offset = args[1].getNumber(),\n                duration = args[2].isUndefined() ? -1 : args[2].getNumber()](BaseAudioContext &) {\n    audioBufferSourceNode->start(when, offset, duration);\n  };\n  audioBufferSourceNode->scheduleAudioEvent(std::move(event));\n\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioBufferSourceNodeHostObject, setBuffer) {\n  auto audioBufferSourceNode = std::static_pointer_cast<AudioBufferSourceNode>(node_);\n\n  if (args[0].isNull()) {\n    setBuffer(nullptr);\n  } else {\n    auto bufferHostObject = args[0].getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);\n    thisValue.asObject(runtime).setExternalMemoryPressure(\n        runtime, bufferHostObject->getSizeInBytes());\n\n    setBuffer(bufferHostObject->audioBuffer_);\n  }\n\n  return jsi::Value::undefined();\n}\n\nvoid AudioBufferSourceNodeHostObject::setOnLoopEndedCallbackId(uint64_t callbackId) {\n  auto audioBufferSourceNode = std::static_pointer_cast<AudioBufferSourceNode>(node_);\n\n  auto event = [audioBufferSourceNode, callbackId](BaseAudioContext &) {\n    audioBufferSourceNode->setOnLoopEndedCallbackId(callbackId);\n  };\n\n  audioBufferSourceNode->unregisterOnLoopEndedCallback(onLoopEndedCallbackId_);\n  audioBufferSourceNode->scheduleAudioEvent(std::move(event));\n  onLoopEndedCallbackId_ = callbackId;\n}\n\nvoid AudioBufferSourceNodeHostObject::setBuffer(const std::shared_ptr<AudioBuffer> &buffer) {\n  // TODO: add optimized memory management for buffer changes, e.g.\n  //  when the same buffer is reused across threads and\n  // buffer modification is not allowed on JS thread\n  auto audioBufferSourceNode = std::static_pointer_cast<AudioBufferSourceNode>(node_);\n\n  std::shared_ptr<AudioBuffer> copiedBuffer;\n  std::shared_ptr<DSPAudioBuffer> audioBuffer;\n\n  if (buffer == nullptr) {\n    copiedBuffer = nullptr;\n    audioBuffer = std::make_shared<DSPAudioBuffer>(\n        RENDER_QUANTUM_SIZE, 1, audioBufferSourceNode->getContextSampleRate());\n  } else {\n    if (pitchCorrection_) {\n      initStretch(static_cast<int>(buffer->getNumberOfChannels()), buffer->getSampleRate());\n      auto extraTailFrames =\n          static_cast<size_t>((inputLatency_ + outputLatency_) * buffer->getSampleRate());\n      size_t totalSize = buffer->getSize() + extraTailFrames;\n      copiedBuffer = std::make_shared<AudioBuffer>(\n          totalSize, buffer->getNumberOfChannels(), buffer->getSampleRate());\n      copiedBuffer->copy(*buffer, 0, 0, buffer->getSize());\n      copiedBuffer->zero(buffer->getSize(), extraTailFrames);\n    } else {\n      copiedBuffer = std::make_shared<AudioBuffer>(*buffer);\n    }\n\n    audioBuffer = std::make_shared<DSPAudioBuffer>(\n        RENDER_QUANTUM_SIZE,\n        copiedBuffer->getNumberOfChannels(),\n        audioBufferSourceNode->getContextSampleRate());\n  }\n\n  auto event = [audioBufferSourceNode, copiedBuffer, audioBuffer](BaseAudioContext &) {\n    audioBufferSourceNode->setBuffer(copiedBuffer, audioBuffer);\n  };\n  audioBufferSourceNode->scheduleAudioEvent(std::move(event));\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioBufferSourceNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/sources/AudioBufferBaseSourceNodeHostObject.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct AudioBufferSourceOptions;\nclass BaseAudioContext;\nclass AudioBufferHostObject;\n\nclass AudioBufferSourceNodeHostObject : public AudioBufferBaseSourceNodeHostObject {\n public:\n  explicit AudioBufferSourceNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const AudioBufferSourceOptions &options);\n\n  ~AudioBufferSourceNodeHostObject() override;\n\n  JSI_PROPERTY_GETTER_DECL(loop);\n  JSI_PROPERTY_GETTER_DECL(loopSkip);\n  JSI_PROPERTY_GETTER_DECL(loopStart);\n  JSI_PROPERTY_GETTER_DECL(loopEnd);\n\n  JSI_PROPERTY_SETTER_DECL(loop);\n  JSI_PROPERTY_SETTER_DECL(loopSkip);\n  JSI_PROPERTY_SETTER_DECL(loopStart);\n  JSI_PROPERTY_SETTER_DECL(loopEnd);\n  JSI_PROPERTY_SETTER_DECL(onLoopEnded);\n\n  JSI_HOST_FUNCTION_DECL(start);\n  JSI_HOST_FUNCTION_DECL(setBuffer);\n\n protected:\n  bool loop_;\n  bool loopSkip_;\n  double loopStart_;\n  double loopEnd_;\n  uint64_t onLoopEndedCallbackId_ = 0;\n\n  void setOnLoopEndedCallbackId(uint64_t callbackId);\n  void setBuffer(const std::shared_ptr<AudioBuffer> &buffer);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioFileSourceNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/sources/AudioFileSourceNodeHostObject.h>\n\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/AudioFileSourceNode.h>\n#include <audioapi/types/NodeOptions.h>\n#include <memory>\n#include <utility>\n#include \"audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h\"\n\nnamespace audioapi {\n\nAudioFileSourceNodeHostObject::AudioFileSourceNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const AudioFileSourceOptions &options)\n    : AudioScheduledSourceNodeHostObject(context->createFileSource(options), options),\n      loop_(options.loop),\n      volume_(options.volume),\n      duration_(std::static_pointer_cast<AudioFileSourceNode>(node_)->getDuration()) {\n  addGetters(\n      JSI_EXPORT_PROPERTY_GETTER(AudioFileSourceNodeHostObject, volume),\n      JSI_EXPORT_PROPERTY_GETTER(AudioFileSourceNodeHostObject, loop),\n      JSI_EXPORT_PROPERTY_GETTER(AudioFileSourceNodeHostObject, currentTime),\n      JSI_EXPORT_PROPERTY_GETTER(AudioFileSourceNodeHostObject, duration));\n  addSetters(\n      JSI_EXPORT_PROPERTY_SETTER(AudioFileSourceNodeHostObject, onPositionChanged),\n      JSI_EXPORT_PROPERTY_SETTER(AudioFileSourceNodeHostObject, onEnded),\n      JSI_EXPORT_PROPERTY_SETTER(AudioFileSourceNodeHostObject, volume),\n      JSI_EXPORT_PROPERTY_SETTER(AudioFileSourceNodeHostObject, loop));\n\n  addFunctions(\n      JSI_EXPORT_FUNCTION(AudioFileSourceNodeHostObject, pause),\n      JSI_EXPORT_FUNCTION(AudioFileSourceNodeHostObject, start),\n      JSI_EXPORT_FUNCTION(AudioFileSourceNodeHostObject, seekToTime));\n}\n\nAudioFileSourceNodeHostObject::~AudioFileSourceNodeHostObject() {\n  setOnPositionChangedCallbackId(0);\n  setOnEndedCallbackId(0);\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioFileSourceNodeHostObject, volume) {\n  return {volume_};\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioFileSourceNodeHostObject, volume) {\n  auto node = std::static_pointer_cast<AudioFileSourceNode>(node_);\n  volume_ = static_cast<float>(value.getNumber());\n  auto event = [node, volume = this->volume_](BaseAudioContext &ctx) {\n    node->setVolume(volume);\n  };\n  node->scheduleAudioEvent(std::move(event));\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioFileSourceNodeHostObject, loop) {\n  return {loop_};\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioFileSourceNodeHostObject, loop) {\n  auto node = std::static_pointer_cast<AudioFileSourceNode>(node_);\n  loop_ = value.getBool();\n  auto event = [node, loop = this->loop_](BaseAudioContext &ctx) {\n    node->setLoop(loop);\n  };\n  node->scheduleAudioEvent(std::move(event));\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioFileSourceNodeHostObject, currentTime) {\n  auto node = std::static_pointer_cast<AudioFileSourceNode>(node_);\n  return {node->getCurrentTime()};\n}\n\nJSI_PROPERTY_GETTER_IMPL(AudioFileSourceNodeHostObject, duration) {\n  return {duration_};\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioFileSourceNodeHostObject, pause) {\n  auto audioFileSourceNode = std::static_pointer_cast<AudioFileSourceNode>(node_);\n  auto event = [audioFileSourceNode](BaseAudioContext &ctx) {\n    audioFileSourceNode->pause();\n  };\n  audioFileSourceNode->scheduleAudioEvent(std::move(event));\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioFileSourceNodeHostObject, seekToTime) {\n  auto audioFileSourceNode = std::static_pointer_cast<AudioFileSourceNode>(node_);\n  if (count < 1 || !args[0].isNumber()) {\n    return jsi::Value::undefined();\n  }\n  const double t = args[0].getNumber();\n\n  auto event = [audioFileSourceNode, t](BaseAudioContext &) {\n    audioFileSourceNode->seekToTime(t);\n  };\n  audioFileSourceNode->scheduleAudioEvent(std::move(event));\n\n  return jsi::Value::undefined();\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioFileSourceNodeHostObject, onPositionChanged) {\n  auto callbackId = std::stoull(value.getString(runtime).utf8(runtime));\n  setOnPositionChangedCallbackId(callbackId);\n}\n\nvoid AudioFileSourceNodeHostObject::setOnPositionChangedCallbackId(uint64_t callbackId) {\n  auto sourceNode = std::static_pointer_cast<AudioFileSourceNode>(node_);\n\n  auto event = [sourceNode, callbackId](BaseAudioContext &) {\n    sourceNode->setOnPositionChangedCallbackId(callbackId);\n  };\n\n  sourceNode->unregisterOnPositionChangedCallback(onPositionChangedCallbackId_);\n  sourceNode->scheduleAudioEvent(std::move(event));\n  onPositionChangedCallbackId_ = callbackId;\n}\n\nvoid AudioFileSourceNodeHostObject::setOnEndedCallbackId(uint64_t callbackId) {\n  auto sourceNode = std::static_pointer_cast<AudioFileSourceNode>(node_);\n\n  auto event = [sourceNode, callbackId](BaseAudioContext &) {\n    sourceNode->setOnEndedCallbackId(callbackId);\n  };\n\n  sourceNode->unregisterOnEndedCallback(onEndedCallbackId_);\n  sourceNode->scheduleAudioEvent(std::move(event));\n  onEndedCallbackId_ = callbackId;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioFileSourceNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h>\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct AudioFileSourceOptions;\nclass BaseAudioContext;\n\nclass AudioFileSourceNodeHostObject : public AudioScheduledSourceNodeHostObject {\n public:\n  explicit AudioFileSourceNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const AudioFileSourceOptions &options);\n\n  ~AudioFileSourceNodeHostObject() override;\n\n  JSI_PROPERTY_GETTER_DECL(volume);\n  JSI_PROPERTY_GETTER_DECL(loop);\n  JSI_PROPERTY_GETTER_DECL(currentTime);\n  JSI_PROPERTY_GETTER_DECL(duration);\n\n  JSI_PROPERTY_SETTER_DECL(volume);\n  JSI_PROPERTY_SETTER_DECL(loop);\n  JSI_PROPERTY_SETTER_DECL(onPositionChanged);\n\n  JSI_HOST_FUNCTION_DECL(pause);\n  JSI_HOST_FUNCTION_DECL(seekToStart);\n  JSI_HOST_FUNCTION_DECL(seekToTime);\n\n private:\n  uint64_t onPositionChangedCallbackId_ = 0;\n  uint64_t onEndedCallbackId_ = 0;\n\n  void setOnPositionChangedCallbackId(uint64_t callbackId);\n  void setOnEndedCallbackId(uint64_t callbackId);\n\n  bool loop_;\n  double duration_;\n  float volume_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h>\n#include <audioapi/core/sources/AudioScheduledSourceNode.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nAudioScheduledSourceNodeHostObject::AudioScheduledSourceNodeHostObject(\n    const std::shared_ptr<AudioScheduledSourceNode> &node,\n    const AudioScheduledSourceNodeOptions &options)\n    : AudioNodeHostObject(node) {\n  addSetters(JSI_EXPORT_PROPERTY_SETTER(AudioScheduledSourceNodeHostObject, onEnded));\n\n  addFunctions(\n      JSI_EXPORT_FUNCTION(AudioScheduledSourceNodeHostObject, start),\n      JSI_EXPORT_FUNCTION(AudioScheduledSourceNodeHostObject, stop));\n}\n\nAudioScheduledSourceNodeHostObject::~AudioScheduledSourceNodeHostObject() {\n  // When JSI object is garbage collected (together with the eventual callback),\n  // underlying source node might still be active and try to call the\n  // non-existing callback.\n  setOnEndedCallbackId(0);\n}\n\nJSI_PROPERTY_SETTER_IMPL(AudioScheduledSourceNodeHostObject, onEnded) {\n  auto callbackId = std::stoull(value.getString(runtime).utf8(runtime));\n  setOnEndedCallbackId(callbackId);\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioScheduledSourceNodeHostObject, start) {\n  auto audioScheduleSourceNode = std::static_pointer_cast<AudioScheduledSourceNode>(node_);\n\n  auto event = [audioScheduleSourceNode, when = args[0].getNumber()](BaseAudioContext &) {\n    audioScheduleSourceNode->start(when);\n  };\n  audioScheduleSourceNode->scheduleAudioEvent(std::move(event));\n\n  return jsi::Value::undefined();\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioScheduledSourceNodeHostObject, stop) {\n  auto audioScheduleSourceNode = std::static_pointer_cast<AudioScheduledSourceNode>(node_);\n\n  auto event = [audioScheduleSourceNode, when = args[0].getNumber()](BaseAudioContext &) {\n    audioScheduleSourceNode->stop(when);\n  };\n  audioScheduleSourceNode->scheduleAudioEvent(std::move(event));\n\n  return jsi::Value::undefined();\n}\n\nvoid AudioScheduledSourceNodeHostObject::setOnEndedCallbackId(uint64_t callbackId) {\n  auto sourceNode = std::static_pointer_cast<AudioScheduledSourceNode>(node_);\n\n  auto event = [sourceNode, callbackId](BaseAudioContext &) {\n    sourceNode->setOnEndedCallbackId(callbackId);\n  };\n\n  sourceNode->unregisterOnEndedCallback(onEndedCallbackId_);\n  sourceNode->scheduleAudioEvent(std::move(event));\n  onEndedCallbackId_ = callbackId;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass AudioScheduledSourceNode;\n\nclass AudioScheduledSourceNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit AudioScheduledSourceNodeHostObject(\n      const std::shared_ptr<AudioScheduledSourceNode> &node,\n      const AudioScheduledSourceNodeOptions &options = AudioScheduledSourceNodeOptions());\n\n  ~AudioScheduledSourceNodeHostObject() override;\n\n  JSI_PROPERTY_SETTER_DECL(onEnded);\n\n  JSI_HOST_FUNCTION_DECL(start);\n  JSI_HOST_FUNCTION_DECL(stop);\n\n private:\n  uint64_t onEndedCallbackId_ = 0;\n\n  void setOnEndedCallbackId(uint64_t callbackId);\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/AudioParamHostObject.h>\n#include <audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/ConstantSourceNode.h>\n#include <audioapi/types/NodeOptions.h>\n#include <memory>\n\nnamespace audioapi {\n\nConstantSourceNodeHostObject::ConstantSourceNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const ConstantSourceOptions &options)\n    : AudioScheduledSourceNodeHostObject(context->createConstantSource(options), options) {\n  auto constantSourceNode = std::static_pointer_cast<ConstantSourceNode>(node_);\n  offsetParam_ = std::make_shared<AudioParamHostObject>(constantSourceNode->getOffsetParam());\n\n  addGetters(JSI_EXPORT_PROPERTY_GETTER(ConstantSourceNodeHostObject, offset));\n}\n\nJSI_PROPERTY_GETTER_IMPL(ConstantSourceNodeHostObject, offset) {\n  return jsi::Object::createFromHostObject(runtime, offsetParam_);\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/ConstantSourceNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct ConstantSourceOptions;\nclass BaseAudioContext;\nclass AudioParamHostObject;\n\nclass ConstantSourceNodeHostObject : public AudioScheduledSourceNodeHostObject {\n public:\n  explicit ConstantSourceNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const ConstantSourceOptions &options);\n\n  JSI_PROPERTY_GETTER_DECL(offset);\n\n private:\n  std::shared_ptr<AudioParamHostObject> offsetParam_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.cpp",
    "content": "#include <audioapi/HostObjects/sources/OscillatorNodeHostObject.h>\n\n#include <audioapi/HostObjects/AudioParamHostObject.h>\n#include <audioapi/HostObjects/effects/PeriodicWaveHostObject.h>\n#include <audioapi/HostObjects/utils/JsEnumParser.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/OscillatorNode.h>\n#include <audioapi/types/NodeOptions.h>\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nOscillatorNodeHostObject::OscillatorNodeHostObject(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const OscillatorOptions &options)\n    : AudioScheduledSourceNodeHostObject(context->createOscillator(options), options),\n      type_(options.type) {\n  auto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);\n  frequencyParam_ = std::make_shared<AudioParamHostObject>(oscillatorNode->getFrequencyParam());\n  detuneParam_ = std::make_shared<AudioParamHostObject>(oscillatorNode->getDetuneParam());\n\n  addGetters(\n      JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, frequency),\n      JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, detune),\n      JSI_EXPORT_PROPERTY_GETTER(OscillatorNodeHostObject, type));\n\n  addFunctions(JSI_EXPORT_FUNCTION(OscillatorNodeHostObject, setPeriodicWave));\n\n  addSetters(JSI_EXPORT_PROPERTY_SETTER(OscillatorNodeHostObject, type));\n}\n\nJSI_PROPERTY_GETTER_IMPL(OscillatorNodeHostObject, frequency) {\n  return jsi::Object::createFromHostObject(runtime, frequencyParam_);\n}\n\nJSI_PROPERTY_GETTER_IMPL(OscillatorNodeHostObject, detune) {\n  return jsi::Object::createFromHostObject(runtime, detuneParam_);\n}\n\nJSI_PROPERTY_GETTER_IMPL(OscillatorNodeHostObject, type) {\n  return jsi::String::createFromUtf8(runtime, js_enum_parser::oscillatorTypeToString(type_));\n}\n\nJSI_HOST_FUNCTION_IMPL(OscillatorNodeHostObject, setPeriodicWave) {\n  auto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);\n  auto periodicWave = args[0].getObject(runtime).getHostObject<PeriodicWaveHostObject>(runtime);\n\n  auto event = [oscillatorNode, periodicWave = periodicWave->periodicWave_](BaseAudioContext &) {\n    oscillatorNode->setPeriodicWave(periodicWave);\n  };\n  oscillatorNode->scheduleAudioEvent(std::move(event));\n\n  return jsi::Value::undefined();\n}\n\nJSI_PROPERTY_SETTER_IMPL(OscillatorNodeHostObject, type) {\n  auto oscillatorNode = std::static_pointer_cast<OscillatorNode>(node_);\n  auto type = js_enum_parser::oscillatorTypeFromString(value.asString(runtime).utf8(runtime));\n\n  auto event = [oscillatorNode, type](BaseAudioContext &) {\n    oscillatorNode->setType(type);\n  };\n  type_ = type;\n\n  oscillatorNode->scheduleAudioEvent(std::move(event));\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/OscillatorNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h>\n#include <audioapi/core/types/OscillatorType.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct OscillatorOptions;\nclass BaseAudioContext;\nclass AudioParamHostObject;\n\nclass OscillatorNodeHostObject : public AudioScheduledSourceNodeHostObject {\n public:\n  explicit OscillatorNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const OscillatorOptions &options);\n\n  JSI_PROPERTY_GETTER_DECL(frequency);\n  JSI_PROPERTY_GETTER_DECL(detune);\n  JSI_PROPERTY_GETTER_DECL(type);\n\n  JSI_HOST_FUNCTION_DECL(setPeriodicWave);\n\n  JSI_PROPERTY_SETTER_DECL(type);\n\n private:\n  std::shared_ptr<AudioParamHostObject> frequencyParam_;\n  std::shared_ptr<AudioParamHostObject> detuneParam_;\n  OscillatorType type_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/RecorderAdapterNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/AudioNodeHostObject.h>\n#include <audioapi/core/sources/RecorderAdapterNode.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass AudioRecorderHostObject;\n\nclass RecorderAdapterNodeHostObject : public AudioNodeHostObject {\n public:\n  explicit RecorderAdapterNodeHostObject(const std::shared_ptr<RecorderAdapterNode> &node)\n      : AudioNodeHostObject(node) {}\n\n private:\n  friend class AudioRecorderHostObject;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/StreamerNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/StreamerNode.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nstruct StreamerOptions;\nclass BaseAudioContext;\n\nclass StreamerNodeHostObject : public AudioScheduledSourceNodeHostObject {\n public:\n  explicit StreamerNodeHostObject(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const StreamerOptions &options)\n      : AudioScheduledSourceNodeHostObject(context->createStreamer(options), options) {}\n\n  [[nodiscard]] static size_t getSizeInBytes() {\n    return SIZE;\n  }\n\n private:\n  static constexpr size_t SIZE = 4'000'000; // 4MB\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/sources/WorkletSourceNodeHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/sources/AudioScheduledSourceNodeHostObject.h>\n#include <audioapi/core/sources/WorkletSourceNode.h>\n\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass WorkletSourceNodeHostObject : public AudioScheduledSourceNodeHostObject {\n public:\n  explicit WorkletSourceNodeHostObject(const std::shared_ptr<WorkletSourceNode> &node)\n      : AudioScheduledSourceNodeHostObject(node) {}\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.cpp",
    "content": "#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/HostObjects/utils/AudioDecoderHostObject.h>\n#include <audioapi/core/utils/AudioDecoder.h>\n#include <audioapi/jsi/JsiPromise.h>\n\n#include <jsi/jsi.h>\n#include <memory>\n#include <string>\n#include <utility>\n\nnamespace audioapi {\nAudioDecoderHostObject::AudioDecoderHostObject(\n    jsi::Runtime *runtime,\n    const std::shared_ptr<react::CallInvoker> &callInvoker) {\n  promiseVendor_ = std::make_shared<PromiseVendor>(runtime, callInvoker);\n  addFunctions(\n      JSI_EXPORT_FUNCTION(AudioDecoderHostObject, decodeWithPCMInBase64),\n      JSI_EXPORT_FUNCTION(AudioDecoderHostObject, decodeWithFilePath),\n      JSI_EXPORT_FUNCTION(AudioDecoderHostObject, decodeWithMemoryBlock));\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioDecoderHostObject, decodeWithMemoryBlock) {\n  auto arrayBuffer =\n      args[0].getObject(runtime).getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n  auto *data = arrayBuffer.data(runtime);\n  auto size = static_cast<int>(arrayBuffer.size(runtime));\n\n  auto sampleRate = static_cast<float>(args[1].getNumber());\n\n  auto promise = promiseVendor_->createAsyncPromise([data, size, sampleRate]() -> PromiseResolver {\n    auto result = AudioDecoder::decodeWithMemoryBlock(data, size, sampleRate);\n\n    if (result.is_err()) {\n      return [result = std::move(result)](\n                 jsi::Runtime &runtime) -> std::variant<jsi::Value, std::string> {\n        return result.unwrap_err();\n      };\n    }\n\n    auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(result.unwrap());\n\n    return [audioBufferHostObject = std::move(audioBufferHostObject)](\n               jsi::Runtime &runtime) -> std::variant<jsi::Value, std::string> {\n      auto jsiObject = jsi::Object::createFromHostObject(runtime, audioBufferHostObject);\n      jsiObject.setExternalMemoryPressure(runtime, audioBufferHostObject->getSizeInBytes());\n      return jsiObject;\n    };\n  });\n  return promise;\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioDecoderHostObject, decodeWithFilePath) {\n  auto sourcePath = args[0].getString(runtime).utf8(runtime);\n  auto sampleRate = static_cast<float>(args[1].getNumber());\n\n  auto promise = promiseVendor_->createAsyncPromise([sourcePath, sampleRate]() -> PromiseResolver {\n    auto result = AudioDecoder::decodeWithFilePath(sourcePath, sampleRate);\n\n    if (result.is_err()) {\n      return [result = std::move(result)](\n                 jsi::Runtime &runtime) -> std::variant<jsi::Value, std::string> {\n        return result.unwrap_err();\n      };\n    }\n\n    auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(result.unwrap());\n\n    return [audioBufferHostObject = std::move(audioBufferHostObject)](\n               jsi::Runtime &runtime) -> std::variant<jsi::Value, std::string> {\n      auto jsiObject = jsi::Object::createFromHostObject(runtime, audioBufferHostObject);\n      jsiObject.setExternalMemoryPressure(runtime, audioBufferHostObject->getSizeInBytes());\n      return jsiObject;\n    };\n  });\n\n  return promise;\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioDecoderHostObject, decodeWithPCMInBase64) {\n  auto b64 = args[0].getString(runtime).utf8(runtime);\n  auto inputSampleRate = static_cast<float>(args[1].getNumber());\n  auto inputChannelCount = static_cast<int>(args[2].getNumber());\n  auto interleaved = args[3].getBool();\n\n  auto promise = promiseVendor_->createAsyncPromise(\n      [b64, inputSampleRate, inputChannelCount, interleaved]() -> PromiseResolver {\n        auto result = AudioDecoder::decodeWithPCMInBase64(\n            b64, inputSampleRate, inputChannelCount, interleaved);\n\n        if (result.is_err()) {\n          return [result = std::move(result)](\n                     jsi::Runtime &runtime) -> std::variant<jsi::Value, std::string> {\n            return result.unwrap_err();\n          };\n        }\n\n        auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(result.unwrap());\n\n        return [audioBufferHostObject = std::move(audioBufferHostObject)](\n                   jsi::Runtime &runtime) -> std::variant<jsi::Value, std::string> {\n          auto jsiObject = jsi::Object::createFromHostObject(runtime, audioBufferHostObject);\n          jsiObject.setExternalMemoryPressure(runtime, audioBufferHostObject->getSizeInBytes());\n          return jsiObject;\n        };\n      });\n\n  return promise;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/utils/AudioDecoderHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/core/utils/AudioDecoder.h>\n#include <audioapi/jsi/JsiPromise.h>\n\n#include <jsi/jsi.h>\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass AudioDecoderHostObject : public JsiHostObject {\n public:\n  explicit AudioDecoderHostObject(\n      jsi::Runtime *runtime,\n      const std::shared_ptr<react::CallInvoker> &callInvoker);\n  JSI_HOST_FUNCTION_DECL(decodeWithMemoryBlock);\n  JSI_HOST_FUNCTION_DECL(decodeWithFilePath);\n  JSI_HOST_FUNCTION_DECL(decodeWithPCMInBase64);\n\n private:\n  std::shared_ptr<PromiseVendor> promiseVendor_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.cpp",
    "content": "#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/HostObjects/utils/AudioStretcherHostObject.h>\n#include <audioapi/core/utils/AudioStretcher.h>\n#include <audioapi/jsi/JsiPromise.h>\n\n#include <jsi/jsi.h>\n#include <memory>\n#include <string>\n\nnamespace audioapi {\n\nAudioStretcherHostObject::AudioStretcherHostObject(\n    jsi::Runtime *runtime,\n    const std::shared_ptr<react::CallInvoker> &callInvoker) {\n  promiseVendor_ = std::make_shared<PromiseVendor>(runtime, callInvoker);\n  addFunctions(JSI_EXPORT_FUNCTION(AudioStretcherHostObject, changePlaybackSpeed));\n}\n\nJSI_HOST_FUNCTION_IMPL(AudioStretcherHostObject, changePlaybackSpeed) {\n  auto audioBuffer = args[0].getObject(runtime).asHostObject<AudioBufferHostObject>(runtime);\n  auto playbackSpeed = static_cast<float>(args[1].asNumber());\n\n  auto promise = promiseVendor_->createAsyncPromise([=]() -> PromiseResolver {\n    auto result = AudioStretcher::changePlaybackSpeed(*audioBuffer->audioBuffer_, playbackSpeed);\n\n    if (result == nullptr) {\n      return [](jsi::Runtime &runtime) {\n        return std::string(\"Failed to change audio playback speed.\");\n      };\n    }\n    return [result](jsi::Runtime &runtime) {\n      auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(result);\n      return jsi::Object::createFromHostObject(runtime, audioBufferHostObject);\n    };\n  });\n  return promise;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/utils/AudioStretcherHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/core/utils/AudioStretcher.h>\n#include <audioapi/jsi/JsiPromise.h>\n\n#include <jsi/jsi.h>\n#include <memory>\n\nnamespace audioapi {\nusing namespace facebook;\n\nclass AudioStretcherHostObject : public JsiHostObject {\n public:\n  explicit AudioStretcherHostObject(\n      jsi::Runtime *runtime,\n      const std::shared_ptr<react::CallInvoker> &callInvoker);\n  JSI_HOST_FUNCTION_DECL(changePlaybackSpeed);\n\n private:\n  std::shared_ptr<PromiseVendor> promiseVendor_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/utils/JsEnumParser.cpp",
    "content": "#include <audioapi/HostObjects/utils/JsEnumParser.h>\n#include <string>\n\nnamespace audioapi::js_enum_parser {\n\n// NOLINTBEGIN(readability-braces-around-statements)\n\nBiquadFilterType filterTypeFromString(const std::string &type) {\n  if (type == \"lowpass\")\n    return BiquadFilterType::LOWPASS;\n  if (type == \"highpass\")\n    return BiquadFilterType::HIGHPASS;\n  if (type == \"bandpass\")\n    return BiquadFilterType::BANDPASS;\n  if (type == \"lowshelf\")\n    return BiquadFilterType::LOWSHELF;\n  if (type == \"highshelf\")\n    return BiquadFilterType::HIGHSHELF;\n  if (type == \"peaking\")\n    return BiquadFilterType::PEAKING;\n  if (type == \"notch\")\n    return BiquadFilterType::NOTCH;\n  if (type == \"allpass\")\n    return BiquadFilterType::ALLPASS;\n\n  throw std::invalid_argument(\"Invalid filter type: \" + type);\n}\n\nstd::string filterTypeToString(BiquadFilterType type) {\n  switch (type) {\n    case BiquadFilterType::LOWPASS:\n      return \"lowpass\";\n    case BiquadFilterType::HIGHPASS:\n      return \"highpass\";\n    case BiquadFilterType::BANDPASS:\n      return \"bandpass\";\n    case BiquadFilterType::LOWSHELF:\n      return \"lowshelf\";\n    case BiquadFilterType::HIGHSHELF:\n      return \"highshelf\";\n    case BiquadFilterType::PEAKING:\n      return \"peaking\";\n    case BiquadFilterType::NOTCH:\n      return \"notch\";\n    case BiquadFilterType::ALLPASS:\n      return \"allpass\";\n    default:\n      throw std::invalid_argument(\"Unknown filter type\");\n  }\n}\n\nOverSampleType overSampleTypeFromString(const std::string &type) {\n  if (type == \"2x\")\n    return OverSampleType::OVERSAMPLE_2X;\n  if (type == \"4x\")\n    return OverSampleType::OVERSAMPLE_4X;\n\n  return OverSampleType::OVERSAMPLE_NONE;\n}\n\nstd::string overSampleTypeToString(OverSampleType type) {\n  switch (type) {\n    case OverSampleType::OVERSAMPLE_2X:\n      return \"2x\";\n    case OverSampleType::OVERSAMPLE_4X:\n      return \"4x\";\n    default:\n      return \"none\";\n  }\n}\n\nOscillatorType oscillatorTypeFromString(const std::string &type) {\n  if (type == \"sine\")\n    return OscillatorType::SINE;\n  if (type == \"square\")\n    return OscillatorType::SQUARE;\n  if (type == \"sawtooth\")\n    return OscillatorType::SAWTOOTH;\n  if (type == \"triangle\")\n    return OscillatorType::TRIANGLE;\n  if (type == \"custom\")\n    return OscillatorType::CUSTOM;\n\n  throw std::invalid_argument(\"Unknown oscillator type: \" + type);\n}\n\nstd::string oscillatorTypeToString(OscillatorType type) {\n  switch (type) {\n    case OscillatorType::SINE:\n      return \"sine\";\n    case OscillatorType::SQUARE:\n      return \"square\";\n    case OscillatorType::SAWTOOTH:\n      return \"sawtooth\";\n    case OscillatorType::TRIANGLE:\n      return \"triangle\";\n    case OscillatorType::CUSTOM:\n      return \"custom\";\n    default:\n      throw std::invalid_argument(\"Unknown oscillator type\");\n  }\n}\n\nAudioEvent audioEventFromString(const std::string &event) {\n  if (event == \"playbackNotificationPlay\")\n    return AudioEvent::PLAYBACK_NOTIFICATION_PLAY;\n  if (event == \"playbackNotificationPause\")\n    return AudioEvent::PLAYBACK_NOTIFICATION_PAUSE;\n  if (event == \"playbackNotificationStop\")\n    return AudioEvent::PLAYBACK_NOTIFICATION_STOP;\n  if (event == \"playbackNotificationNextTrack\")\n    return AudioEvent::PLAYBACK_NOTIFICATION_NEXT_TRACK;\n  if (event == \"playbackNotificationPreviousTrack\")\n    return AudioEvent::PLAYBACK_NOTIFICATION_PREVIOUS_TRACK;\n  if (event == \"playbackNotificationSkipForward\")\n    return AudioEvent::PLAYBACK_NOTIFICATION_SKIP_FORWARD;\n  if (event == \"playbackNotificationSkipBackward\")\n    return AudioEvent::PLAYBACK_NOTIFICATION_SKIP_BACKWARD;\n  if (event == \"playbackNotificationSeekForward\")\n    return AudioEvent::PLAYBACK_NOTIFICATION_SEEK_FORWARD;\n  if (event == \"playbackNotificationSeekBackward\")\n    return AudioEvent::PLAYBACK_NOTIFICATION_SEEK_BACKWARD;\n  if (event == \"playbackNotificationSeekTo\")\n    return AudioEvent::PLAYBACK_NOTIFICATION_SEEK_TO;\n  if (event == \"playbackNotificationDismissed\")\n    return AudioEvent::PLAYBACK_NOTIFICATION_DISMISSED;\n  if (event == \"recordingNotificationResume\")\n    return AudioEvent::RECORDING_NOTIFICATION_RESUME;\n  if (event == \"recordingNotificationPause\")\n    return AudioEvent::RECORDING_NOTIFICATION_PAUSE;\n  if (event == \"routeChange\")\n    return AudioEvent::ROUTE_CHANGE;\n  if (event == \"interruption\")\n    return AudioEvent::INTERRUPTION;\n  if (event == \"volumeChange\")\n    return AudioEvent::VOLUME_CHANGE;\n  if (event == \"duck\")\n    return AudioEvent::DUCK;\n  if (event == \"ended\")\n    return AudioEvent::ENDED;\n  if (event == \"loopEnded\")\n    return AudioEvent::LOOP_ENDED;\n  if (event == \"audioReady\")\n    return AudioEvent::AUDIO_READY;\n  if (event == \"positionChanged\")\n    return AudioEvent::POSITION_CHANGED;\n  if (event == \"bufferEnded\")\n    return AudioEvent::BUFFER_ENDED;\n  if (event == \"recorderError\")\n    return AudioEvent::RECORDER_ERROR;\n\n  throw std::invalid_argument(\"Unknown audio event: \" + event);\n}\n\nstd::string contextStateToString(ContextState state) {\n  switch (state) {\n    case ContextState::SUSPENDED:\n      return \"suspended\";\n    case ContextState::RUNNING:\n      return \"running\";\n    case ContextState::CLOSED:\n      return \"closed\";\n    default:\n      throw std::invalid_argument(\"Unknown context state\");\n  }\n}\n\nstd::string channelCountModeToString(ChannelCountMode mode) {\n  switch (mode) {\n    case ChannelCountMode::MAX:\n      return \"max\";\n    case ChannelCountMode::CLAMPED_MAX:\n      return \"clamped-max\";\n    case ChannelCountMode::EXPLICIT:\n      return \"explicit\";\n    default:\n      throw std::invalid_argument(\"Unknown channel count mode\");\n  }\n}\n\nstd::string channelInterpretationToString(ChannelInterpretation interpretation) {\n  switch (interpretation) {\n    case ChannelInterpretation::SPEAKERS:\n      return \"speakers\";\n    case ChannelInterpretation::DISCRETE:\n      return \"discrete\";\n    default:\n      throw std::invalid_argument(\"Unknown channel interpretation\");\n  }\n}\n} // namespace audioapi::js_enum_parser\n\n// NOLINTEND(readability-braces-around-statements)\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/utils/JsEnumParser.h",
    "content": "#pragma once\n\n#include <audioapi/core/analysis/AnalyserNode.h>\n#include <audioapi/core/types/BiquadFilterType.h>\n#include <audioapi/core/types/ChannelCountMode.h>\n#include <audioapi/core/types/ChannelInterpretation.h>\n#include <audioapi/core/types/ContextState.h>\n#include <audioapi/core/types/OscillatorType.h>\n#include <audioapi/core/types/OverSampleType.h>\n#include <audioapi/events/AudioEvent.h>\n#include <string>\n\nnamespace audioapi::js_enum_parser {\nstd::string overSampleTypeToString(OverSampleType type);\nOverSampleType overSampleTypeFromString(const std::string &type);\nstd::string oscillatorTypeToString(OscillatorType type);\nOscillatorType oscillatorTypeFromString(const std::string &type);\nstd::string filterTypeToString(BiquadFilterType type);\nBiquadFilterType filterTypeFromString(const std::string &type);\nAudioEvent audioEventFromString(const std::string &event);\nstd::string contextStateToString(ContextState state);\nstd::string channelCountModeToString(ChannelCountMode mode);\nstd::string channelInterpretationToString(ChannelInterpretation interpretation);\n} // namespace audioapi::js_enum_parser\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/HostObjects/utils/NodeOptionsParser.h",
    "content": "#pragma once\n\n#include <audioapi/jsi/RuntimeLifecycleMonitor.h>\n#include <jsi/jsi.h>\n#include <cstddef>\n#include <memory>\n#include <vector>\n\n#include <audioapi/HostObjects/effects/PeriodicWaveHostObject.h>\n#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/core/utils/AudioDecoder.h>\n#include <audioapi/types/NodeOptions.h>\n\nnamespace audioapi::option_parser {\ninline AudioNodeOptions parseAudioNodeOptions(\n    jsi::Runtime &runtime,\n    const jsi::Object &optionsObject) {\n  AudioNodeOptions options;\n\n  auto channelCountValue = optionsObject.getProperty(runtime, \"channelCount\");\n  if (channelCountValue.isNumber()) {\n    options.channelCount = static_cast<int>(channelCountValue.getNumber());\n  }\n\n  auto channelCountModeValue = optionsObject.getProperty(runtime, \"channelCountMode\");\n  if (channelCountModeValue.isString()) {\n    auto channelCountModeStr = channelCountModeValue.asString(runtime).utf8(runtime);\n    if (channelCountModeStr == \"max\") {\n      options.channelCountMode = ChannelCountMode::MAX;\n    } else if (channelCountModeStr == \"clamped-max\") {\n      options.channelCountMode = ChannelCountMode::CLAMPED_MAX;\n    } else if (channelCountModeStr == \"explicit\") {\n      options.channelCountMode = ChannelCountMode::EXPLICIT;\n    }\n  }\n\n  auto channelInterpretationValue = optionsObject.getProperty(runtime, \"channelInterpretation\");\n  if (channelInterpretationValue.isString()) {\n    auto channelInterpretationStr = channelInterpretationValue.asString(runtime).utf8(runtime);\n    if (channelInterpretationStr == \"speakers\") {\n      options.channelInterpretation = ChannelInterpretation::SPEAKERS;\n    } else if (channelInterpretationStr == \"discrete\") {\n      options.channelInterpretation = ChannelInterpretation::DISCRETE;\n    }\n  }\n\n  return options;\n}\n\ninline GainOptions parseGainOptions(jsi::Runtime &runtime, const jsi::Object &optionsObject) {\n  GainOptions options(parseAudioNodeOptions(runtime, optionsObject));\n\n  auto gainValue = optionsObject.getProperty(runtime, \"gain\");\n  if (gainValue.isNumber()) {\n    options.gain = static_cast<float>(gainValue.getNumber());\n  }\n\n  return options;\n}\n\ninline StereoPannerOptions parseStereoPannerOptions(\n    jsi::Runtime &runtime,\n    const jsi::Object &optionsObject) {\n  StereoPannerOptions options(parseAudioNodeOptions(runtime, optionsObject));\n\n  auto panValue = optionsObject.getProperty(runtime, \"pan\");\n  if (panValue.isNumber()) {\n    options.pan = static_cast<float>(panValue.getNumber());\n  }\n\n  return options;\n}\n\ninline ConvolverOptions parseConvolverOptions(\n    jsi::Runtime &runtime,\n    const jsi::Object &optionsObject) {\n  ConvolverOptions options(parseAudioNodeOptions(runtime, optionsObject));\n\n  auto disableNormalizationValue = optionsObject.getProperty(runtime, \"disableNormalization\");\n  if (disableNormalizationValue.isBool()) {\n    options.disableNormalization = disableNormalizationValue.getBool();\n  }\n\n  if (optionsObject.hasProperty(runtime, \"buffer\")) {\n    auto bufferHostObject = optionsObject.getProperty(runtime, \"buffer\")\n                                .getObject(runtime)\n                                .asHostObject<AudioBufferHostObject>(runtime);\n    options.buffer = bufferHostObject->audioBuffer_;\n  }\n  return options;\n}\n\ninline ConstantSourceOptions parseConstantSourceOptions(\n    jsi::Runtime &runtime,\n    const jsi::Object &optionsObject) {\n  ConstantSourceOptions options;\n\n  auto offsetValue = optionsObject.getProperty(runtime, \"offset\");\n  if (offsetValue.isNumber()) {\n    options.offset = static_cast<float>(offsetValue.getNumber());\n  }\n\n  return options;\n}\n\ninline AnalyserOptions parseAnalyserOptions(\n    jsi::Runtime &runtime,\n    const jsi::Object &optionsObject) {\n  AnalyserOptions options(parseAudioNodeOptions(runtime, optionsObject));\n\n  auto fftSizeValue = optionsObject.getProperty(runtime, \"fftSize\");\n  if (fftSizeValue.isNumber()) {\n    options.fftSize = static_cast<int>(fftSizeValue.getNumber());\n  }\n\n  auto minDecibelsValue = optionsObject.getProperty(runtime, \"minDecibels\");\n  if (minDecibelsValue.isNumber()) {\n    options.minDecibels = static_cast<float>(minDecibelsValue.getNumber());\n  }\n\n  auto maxDecibelsValue = optionsObject.getProperty(runtime, \"maxDecibels\");\n  if (maxDecibelsValue.isNumber()) {\n    options.maxDecibels = static_cast<float>(maxDecibelsValue.getNumber());\n  }\n\n  auto smoothingTimeConstantValue = optionsObject.getProperty(runtime, \"smoothingTimeConstant\");\n  if (smoothingTimeConstantValue.isNumber()) {\n    options.smoothingTimeConstant = static_cast<float>(smoothingTimeConstantValue.getNumber());\n  }\n\n  return options;\n}\n\ninline BiquadFilterOptions parseBiquadFilterOptions(\n    jsi::Runtime &runtime,\n    const jsi::Object &optionsObject) {\n  BiquadFilterOptions options(parseAudioNodeOptions(runtime, optionsObject));\n\n  auto typeValue = optionsObject.getProperty(runtime, \"type\");\n  if (typeValue.isString()) {\n    auto typeStr = typeValue.asString(runtime).utf8(runtime);\n    if (typeStr == \"lowpass\") {\n      options.type = BiquadFilterType::LOWPASS;\n    } else if (typeStr == \"highpass\") {\n      options.type = BiquadFilterType::HIGHPASS;\n    } else if (typeStr == \"bandpass\") {\n      options.type = BiquadFilterType::BANDPASS;\n    } else if (typeStr == \"lowshelf\") {\n      options.type = BiquadFilterType::LOWSHELF;\n    } else if (typeStr == \"highshelf\") {\n      options.type = BiquadFilterType::HIGHSHELF;\n    } else if (typeStr == \"peaking\") {\n      options.type = BiquadFilterType::PEAKING;\n    } else if (typeStr == \"notch\") {\n      options.type = BiquadFilterType::NOTCH;\n    } else if (typeStr == \"allpass\") {\n      options.type = BiquadFilterType::ALLPASS;\n    }\n  }\n\n  auto frequencyValue = optionsObject.getProperty(runtime, \"frequency\");\n  if (frequencyValue.isNumber()) {\n    options.frequency = static_cast<float>(frequencyValue.getNumber());\n  }\n\n  auto detuneValue = optionsObject.getProperty(runtime, \"detune\");\n  if (detuneValue.isNumber()) {\n    options.detune = static_cast<float>(detuneValue.getNumber());\n  }\n\n  auto QValue = optionsObject.getProperty(runtime, \"Q\");\n  if (QValue.isNumber()) {\n    options.Q = static_cast<float>(QValue.getNumber());\n  }\n\n  auto gainValue = optionsObject.getProperty(runtime, \"gain\");\n  if (gainValue.isNumber()) {\n    options.gain = static_cast<float>(gainValue.getNumber());\n  }\n\n  return options;\n}\n\ninline OscillatorOptions parseOscillatorOptions(\n    jsi::Runtime &runtime,\n    const jsi::Object &optionsObject) {\n  OscillatorOptions options;\n\n  auto typeValue = optionsObject.getProperty(runtime, \"type\");\n  if (typeValue.isString()) {\n    auto typeStr = typeValue.asString(runtime).utf8(runtime);\n    if (typeStr == \"sine\") {\n      options.type = OscillatorType::SINE;\n    } else if (typeStr == \"square\") {\n      options.type = OscillatorType::SQUARE;\n    } else if (typeStr == \"sawtooth\") {\n      options.type = OscillatorType::SAWTOOTH;\n    } else if (typeStr == \"triangle\") {\n      options.type = OscillatorType::TRIANGLE;\n    } else if (typeStr == \"custom\") {\n      options.type = OscillatorType::CUSTOM;\n    }\n  }\n\n  auto frequencyValue = optionsObject.getProperty(runtime, \"frequency\");\n  if (frequencyValue.isNumber()) {\n    options.frequency = static_cast<float>(frequencyValue.getNumber());\n  }\n\n  auto detuneValue = optionsObject.getProperty(runtime, \"detune\");\n  if (detuneValue.isNumber()) {\n    options.detune = static_cast<float>(detuneValue.getNumber());\n  }\n\n  auto periodicWaveValue = optionsObject.getProperty(runtime, \"periodicWave\");\n  if (periodicWaveValue.isObject()) {\n    auto periodicWaveHostObject =\n        periodicWaveValue.getObject(runtime).asHostObject<PeriodicWaveHostObject>(runtime);\n    options.periodicWave = periodicWaveHostObject->periodicWave_;\n  }\n\n  return options;\n}\n\ninline BaseAudioBufferSourceOptions parseBaseAudioBufferSourceOptions(\n    jsi::Runtime &runtime,\n    const jsi::Object &optionsObject) {\n  BaseAudioBufferSourceOptions options;\n\n  auto detuneValue = optionsObject.getProperty(runtime, \"detune\");\n  if (detuneValue.isNumber()) {\n    options.detune = static_cast<float>(detuneValue.getNumber());\n  }\n\n  auto playbackRateValue = optionsObject.getProperty(runtime, \"playbackRate\");\n  if (playbackRateValue.isNumber()) {\n    options.playbackRate = static_cast<float>(playbackRateValue.getNumber());\n  }\n\n  auto pitchCorrectionValue = optionsObject.getProperty(runtime, \"pitchCorrection\");\n  if (pitchCorrectionValue.isBool()) {\n    options.pitchCorrection = pitchCorrectionValue.getBool();\n  }\n\n  return options;\n}\n\ninline AudioBufferSourceOptions parseAudioBufferSourceOptions(\n    jsi::Runtime &runtime,\n    const jsi::Object &optionsObject) {\n  AudioBufferSourceOptions options(parseBaseAudioBufferSourceOptions(runtime, optionsObject));\n\n  if (optionsObject.hasProperty(runtime, \"buffer\")) {\n    auto bufferHostObject = optionsObject.getProperty(runtime, \"buffer\")\n                                .getObject(runtime)\n                                .asHostObject<AudioBufferHostObject>(runtime);\n    options.buffer = bufferHostObject->audioBuffer_;\n  }\n\n  auto loopValue = optionsObject.getProperty(runtime, \"loop\");\n  if (loopValue.isBool()) {\n    options.loop = loopValue.getBool();\n  }\n\n  auto loopStartValue = optionsObject.getProperty(runtime, \"loopStart\");\n  if (loopStartValue.isNumber()) {\n    options.loopStart = static_cast<float>(loopStartValue.getNumber());\n  }\n\n  auto loopEndValue = optionsObject.getProperty(runtime, \"loopEnd\");\n  if (loopEndValue.isNumber()) {\n    options.loopEnd = static_cast<float>(loopEndValue.getNumber());\n  }\n\n  return options;\n}\n\ninline StreamerOptions parseStreamerOptions(\n    jsi::Runtime &runtime,\n    const jsi::Object &optionsObject) {\n  auto options = StreamerOptions();\n  if (optionsObject.hasProperty(runtime, \"streamPath\")) {\n    options.streamPath =\n        optionsObject.getProperty(runtime, \"streamPath\").asString(runtime).utf8(runtime);\n  }\n  return options;\n}\n\ninline AudioFileSourceOptions parseAudioFileSourceOptions(\n    jsi::Runtime &runtime,\n    const jsi::Object &optionsObject) {\n  AudioFileSourceOptions options;\n\n  auto nodeOpts = parseAudioNodeOptions(runtime, optionsObject);\n  static_cast<AudioNodeOptions &>(options) = nodeOpts;\n  options.numberOfInputs = 0;\n\n  auto loopValue = optionsObject.getProperty(runtime, \"loop\");\n  if (loopValue.isBool()) {\n    options.loop = static_cast<bool>(loopValue.getBool());\n  }\n\n  auto volumeValue = optionsObject.getProperty(runtime, \"volume\");\n  if (volumeValue.isNumber()) {\n    options.volume = static_cast<float>(volumeValue.getNumber());\n  }\n\n  auto sourceValue = optionsObject.getProperty(runtime, \"source\");\n  if (sourceValue.isString()) {\n    options.filePath = sourceValue.asString(runtime).utf8(runtime);\n    options.requiresFFmpeg =\n        AudioDecoder::pathHasExtension(options.filePath, {\".mp4\", \".m4a\", \".aac\"});\n  } else if (sourceValue.isObject()) {\n    auto sourceObj = sourceValue.asObject(runtime);\n    if (sourceObj.isArrayBuffer(runtime)) {\n      auto arrayBuffer = sourceObj.getArrayBuffer(runtime);\n      auto *data = arrayBuffer.data(runtime);\n      auto size = arrayBuffer.size(runtime);\n      auto format = AudioDecoder::detectAudioFormat(data, size);\n      options.requiresFFmpeg =\n          format == AudioFormat::MP4 || format == AudioFormat::M4A || format == AudioFormat::AAC;\n      options.data = std::vector<uint8_t>(data, data + size);\n    }\n  }\n\n  return options;\n}\n\ninline DelayOptions parseDelayOptions(jsi::Runtime &runtime, const jsi::Object &optionsObject) {\n  DelayOptions options(parseAudioNodeOptions(runtime, optionsObject));\n\n  auto maxDelayTimeValue = optionsObject.getProperty(runtime, \"maxDelayTime\");\n  if (maxDelayTimeValue.isNumber()) {\n    options.maxDelayTime = static_cast<float>(maxDelayTimeValue.getNumber());\n  }\n\n  auto delayTimeValue = optionsObject.getProperty(runtime, \"delayTime\");\n  if (delayTimeValue.isNumber()) {\n    options.delayTime = static_cast<float>(delayTimeValue.getNumber());\n  }\n\n  return options;\n}\n\ninline IIRFilterOptions parseIIRFilterOptions(\n    jsi::Runtime &runtime,\n    const jsi::Object &optionsObject) {\n  IIRFilterOptions options(parseAudioNodeOptions(runtime, optionsObject));\n\n  auto feedforwardValue = optionsObject.getProperty(runtime, \"feedforward\");\n  if (feedforwardValue.isObject()) {\n    auto feedforwardArray = feedforwardValue.asObject(runtime).asArray(runtime);\n    size_t feedforwardLength = feedforwardArray.size(runtime);\n    options.feedforward.reserve(feedforwardLength);\n    for (size_t i = 0; i < feedforwardLength; ++i) {\n      options.feedforward.push_back(\n          static_cast<float>(feedforwardArray.getValueAtIndex(runtime, i).getNumber()));\n    }\n  }\n\n  auto feedbackValue = optionsObject.getProperty(runtime, \"feedback\");\n  if (feedbackValue.isObject()) {\n    auto feedbackArray = feedbackValue.asObject(runtime).asArray(runtime);\n    size_t feedbackLength = feedbackArray.size(runtime);\n    options.feedback.reserve(feedbackLength);\n    for (size_t i = 0; i < feedbackLength; ++i) {\n      options.feedback.push_back(\n          static_cast<float>(feedbackArray.getValueAtIndex(runtime, i).getNumber()));\n    }\n  }\n\n  return options;\n}\n\ninline WaveShaperOptions parseWaveShaperOptions(\n    jsi::Runtime &runtime,\n    const jsi::Object &optionsObject) {\n  WaveShaperOptions options(parseAudioNodeOptions(runtime, optionsObject));\n\n  auto oversampleValue = optionsObject.getProperty(runtime, \"oversample\");\n  if (oversampleValue.isString()) {\n    auto oversampleStr = oversampleValue.asString(runtime).utf8(runtime);\n    if (oversampleStr == \"none\") {\n      options.oversample = OverSampleType::OVERSAMPLE_NONE;\n    } else if (oversampleStr == \"2x\") {\n      options.oversample = OverSampleType::OVERSAMPLE_2X;\n    } else if (oversampleStr == \"4x\") {\n      options.oversample = OverSampleType::OVERSAMPLE_4X;\n    }\n  }\n\n  if (optionsObject.hasProperty(runtime, \"buffer\")) {\n    auto arrayBuffer = optionsObject.getPropertyAsObject(runtime, \"buffer\").getArrayBuffer(runtime);\n\n    options.curve = std::make_shared<AudioArray>(\n        reinterpret_cast<float *>(arrayBuffer.data(runtime)),\n        static_cast<size_t>(arrayBuffer.size(runtime) / sizeof(float)));\n  }\n  return options;\n}\n} // namespace audioapi::option_parser\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/AudioContext.cpp",
    "content": "#ifdef ANDROID\n#include <audioapi/android/core/AudioPlayer.h>\n#else\n#include <audioapi/ios/core/IOSAudioPlayer.h>\n#endif\n\n#include <audioapi/core/AudioContext.h>\n#include <audioapi/core/destinations/AudioDestinationNode.h>\n#include <audioapi/core/utils/AudioGraphManager.h>\n#include <memory>\n\nnamespace audioapi {\nAudioContext::AudioContext(\n    float sampleRate,\n    const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    const RuntimeRegistry &runtimeRegistry)\n    : BaseAudioContext(sampleRate, audioEventHandlerRegistry, runtimeRegistry),\n      isInitialized_(false) {}\n\nAudioContext::~AudioContext() {\n  if (getState() != ContextState::CLOSED) {\n    close();\n  }\n}\n\nvoid AudioContext::initialize() {\n  BaseAudioContext::initialize();\n#ifdef ANDROID\n  audioPlayer_ = std::make_shared<AudioPlayer>(\n      this->renderAudio(), getSampleRate(), destination_->getChannelCount());\n#else\n  audioPlayer_ = std::make_shared<IOSAudioPlayer>(\n      this->renderAudio(), getSampleRate(), destination_->getChannelCount());\n#endif\n}\n\nvoid AudioContext::close() {\n  setState(ContextState::CLOSED);\n\n  audioPlayer_->stop();\n  audioPlayer_->cleanup();\n  getGraphManager()->cleanup();\n}\n\nbool AudioContext::resume() {\n  if (getState() == ContextState::CLOSED) {\n    return false;\n  }\n\n  if (getState() == ContextState::RUNNING) {\n    return true;\n  }\n\n  if (isInitialized_.load(std::memory_order_acquire) && audioPlayer_->resume()) {\n    setState(ContextState::RUNNING);\n    return true;\n  }\n\n  return start();\n}\n\nbool AudioContext::suspend() {\n  if (getState() == ContextState::CLOSED) {\n    return false;\n  }\n\n  if (getState() == ContextState::SUSPENDED) {\n    return true;\n  }\n\n  audioPlayer_->suspend();\n\n  setState(ContextState::SUSPENDED);\n  return true;\n}\n\nbool AudioContext::start() {\n  if (getState() == ContextState::CLOSED) {\n    return false;\n  }\n\n  if (!isInitialized_.load(std::memory_order_acquire) && audioPlayer_->start()) {\n    isInitialized_.store(true, std::memory_order_release);\n    setState(ContextState::RUNNING);\n\n    return true;\n  }\n\n  return false;\n}\n\nstd::function<void(std::shared_ptr<DSPAudioBuffer>, int)> AudioContext::renderAudio() {\n  return [this](const std::shared_ptr<DSPAudioBuffer> &data, int frames) {\n    destination_->renderAudio(data, frames);\n  };\n}\n\nbool AudioContext::isDriverRunning() const {\n  return audioPlayer_->isRunning();\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/AudioContext.h",
    "content": "#pragma once\n\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/Macros.h>\n\n#include <functional>\n#include <memory>\n\nnamespace audioapi {\n#ifdef ANDROID\nclass AudioPlayer;\n#else\nclass IOSAudioPlayer;\n#endif\n\nclass AudioContext : public BaseAudioContext {\n public:\n  explicit AudioContext(\n      float sampleRate,\n      const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const RuntimeRegistry &runtimeRegistry);\n  ~AudioContext() override;\n  DELETE_COPY_AND_MOVE(AudioContext);\n\n  void close();\n  bool resume();\n  bool suspend();\n  bool start();\n  void initialize() override;\n\n private:\n#ifdef ANDROID\n  std::shared_ptr<AudioPlayer> audioPlayer_;\n#else\n  std::shared_ptr<IOSAudioPlayer> audioPlayer_;\n#endif\n  std::atomic<bool> isInitialized_{false};\n\n  bool isDriverRunning() const override;\n\n  std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> renderAudio();\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/AudioNode.cpp",
    "content": "#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/AudioParam.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/utils/AudioGraphManager.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <memory>\n\nnamespace audioapi {\n\nAudioNode::AudioNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const AudioNodeOptions &options)\n    : context_(context),\n      numberOfInputs_(options.numberOfInputs),\n      numberOfOutputs_(options.numberOfOutputs),\n      channelCount_(options.channelCount),\n      channelCountMode_(options.channelCountMode),\n      channelInterpretation_(options.channelInterpretation),\n      requiresTailProcessing_(options.requiresTailProcessing) {\n  audioBuffer_ = std::make_shared<DSPAudioBuffer>(\n      RENDER_QUANTUM_SIZE, channelCount_, context->getSampleRate());\n}\n\nAudioNode::~AudioNode() {\n  if (isInitialized_.load(std::memory_order_acquire)) {\n    cleanup();\n  }\n}\n\nbool AudioNode::canBeDestructed() const {\n  return true;\n}\n\nsize_t AudioNode::getChannelCount() const {\n  return channelCount_;\n}\n\nvoid AudioNode::connect(\n    const std::shared_ptr<AudioNode>\n        &node) { // NOLINT(readability-convert-member-functions-to-static)\n  if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n    context->getGraphManager()->addPendingNodeConnection(\n        shared_from_this(), node, AudioGraphManager::ConnectionType::CONNECT);\n  }\n}\n\nvoid AudioNode::connect(\n    const std::shared_ptr<AudioParam>\n        &param) { // NOLINT(readability-convert-member-functions-to-static)\n  if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n    context->getGraphManager()->addPendingParamConnection(\n        shared_from_this(), param, AudioGraphManager::ConnectionType::CONNECT);\n  }\n}\n\nvoid AudioNode::disconnect() { // NOLINT(readability-convert-member-functions-to-static)\n  if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n    context->getGraphManager()->addPendingNodeConnection(\n        shared_from_this(), nullptr, AudioGraphManager::ConnectionType::DISCONNECT_ALL);\n  }\n}\n\nvoid AudioNode::disconnect(\n    const std::shared_ptr<AudioNode>\n        &node) { // NOLINT(readability-convert-member-functions-to-static)\n  if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n    context->getGraphManager()->addPendingNodeConnection(\n        shared_from_this(), node, AudioGraphManager::ConnectionType::DISCONNECT);\n  }\n}\n\nvoid AudioNode::disconnect(\n    const std::shared_ptr<AudioParam>\n        &param) { // NOLINT(readability-convert-member-functions-to-static)\n  if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n    context->getGraphManager()->addPendingParamConnection(\n        shared_from_this(), param, AudioGraphManager::ConnectionType::DISCONNECT);\n  }\n}\n\nbool AudioNode::isEnabled() const {\n  return isEnabled_;\n}\n\nbool AudioNode::requiresTailProcessing() const {\n  return requiresTailProcessing_;\n}\n\nvoid AudioNode::enable() {\n  if (isEnabled()) {\n    return;\n  }\n\n  isEnabled_ = true;\n\n  for (auto it = outputNodes_.begin(), end = outputNodes_.end(); it != end; ++it) {\n    it->get()->onInputEnabled();\n  }\n}\n\nvoid AudioNode::disable() {\n  if (!isEnabled()) {\n    return;\n  }\n\n  isEnabled_ = false;\n\n  for (auto it = outputNodes_.begin(), end = outputNodes_.end(); it != end; ++it) {\n    it->get()->onInputDisabled();\n  }\n}\n\nstd::shared_ptr<DSPAudioBuffer> AudioNode::processAudio(\n    const std::shared_ptr<DSPAudioBuffer> &outputBuffer,\n    int framesToProcess,\n    bool checkIsAlreadyProcessed) {\n  if (!isInitialized_.load(std::memory_order_acquire)) {\n    return outputBuffer;\n  }\n\n  if (checkIsAlreadyProcessed && isAlreadyProcessed()) {\n    return audioBuffer_;\n  }\n\n  // Process inputs and return the buffer with the most channels.\n  auto processingBuffer = processInputs(outputBuffer, framesToProcess, checkIsAlreadyProcessed);\n\n  // Apply channel count mode.\n  processingBuffer = applyChannelCountMode(processingBuffer);\n\n  // Mix all input buffers into the processing buffer.\n  mixInputsBuffers(processingBuffer);\n\n  assert(processingBuffer != nullptr);\n\n  // Finally, process the node itself.\n  return processNode(processingBuffer, framesToProcess);\n}\n\nbool AudioNode::isAlreadyProcessed() { // NOLINT(readability-convert-member-functions-to-static)\n  if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n    std::size_t currentSampleFrame = context->getCurrentSampleFrame();\n\n    // check if the node has already been processed for this rendering quantum\n    if (currentSampleFrame == lastRenderedFrame_) {\n      return true;\n    }\n\n    // Update the last rendered frame before processing node and its inputs.\n    lastRenderedFrame_ = currentSampleFrame;\n\n    return false;\n  }\n\n  // If context is invalid, consider it as already processed to avoid processing\n  return true; // NOLINT(readability-simplify-boolean-expr)\n}\n\nstd::shared_ptr<DSPAudioBuffer> AudioNode::processInputs(\n    const std::shared_ptr<DSPAudioBuffer> &outputBuffer,\n    int framesToProcess,\n    bool checkIsAlreadyProcessed) { // NOLINT(readability-convert-member-functions-to-static)\n  auto processingBuffer = audioBuffer_;\n  processingBuffer->zero();\n\n  size_t maxNumberOfChannels = 0;\n  for (auto *inputNode : inputNodes_) {\n    assert(inputNode != nullptr);\n\n    if (!inputNode->isEnabled()) {\n      continue;\n    }\n\n    auto inputBuffer =\n        inputNode->processAudio(outputBuffer, framesToProcess, checkIsAlreadyProcessed);\n    inputBuffers_.push_back(inputBuffer);\n\n    if (maxNumberOfChannels < inputBuffer->getNumberOfChannels()) {\n      maxNumberOfChannels = inputBuffer->getNumberOfChannels();\n      processingBuffer = inputBuffer;\n    }\n  }\n\n  return processingBuffer;\n}\n\nstd::shared_ptr<DSPAudioBuffer> AudioNode::applyChannelCountMode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer) {\n  // If the channelCountMode is EXPLICIT, the node should output the number of\n  // channels specified by the channelCount.\n  if (channelCountMode_ == ChannelCountMode::EXPLICIT) {\n    return audioBuffer_;\n  }\n\n  // If the channelCountMode is CLAMPED_MAX, the node should output the maximum\n  // number of channels clamped to channelCount.\n  if (channelCountMode_ == ChannelCountMode::CLAMPED_MAX &&\n      processingBuffer->getNumberOfChannels() >= channelCount_) {\n    return audioBuffer_;\n  }\n\n  return processingBuffer;\n}\n\nvoid AudioNode::mixInputsBuffers(const std::shared_ptr<DSPAudioBuffer> &processingBuffer) {\n  assert(processingBuffer != nullptr);\n\n  for (auto it = inputBuffers_.begin(), end = inputBuffers_.end(); it != end; ++it) {\n    processingBuffer->sum(**it, channelInterpretation_);\n  }\n\n  inputBuffers_.clear();\n}\n\nvoid AudioNode::connectNode(const std::shared_ptr<AudioNode> &node) {\n  auto position = outputNodes_.find(node);\n\n  if (position == outputNodes_.end()) {\n    outputNodes_.insert(node);\n    node->onInputConnected(this);\n  }\n}\n\nvoid AudioNode::connectParam(const std::shared_ptr<AudioParam> &param) {\n  auto position = outputParams_.find(param);\n\n  if (position == outputParams_.end()) {\n    outputParams_.insert(param);\n    param->addInputNode(this);\n  }\n}\n\nvoid AudioNode::disconnectNode(const std::shared_ptr<AudioNode> &node) {\n  auto position = outputNodes_.find(node);\n\n  if (position != outputNodes_.end()) {\n    node->onInputDisconnected(this);\n    outputNodes_.erase(node);\n  }\n}\n\nvoid AudioNode::disconnectParam(const std::shared_ptr<AudioParam> &param) {\n  auto position = outputParams_.find(param);\n\n  if (position != outputParams_.end()) {\n    param->removeInputNode(this);\n    outputParams_.erase(param);\n  }\n}\n\nvoid AudioNode::onInputEnabled() {\n  numberOfEnabledInputNodes_ += 1;\n\n  if (!isEnabled()) {\n    enable();\n  }\n}\n\nvoid AudioNode::onInputDisabled() {\n  numberOfEnabledInputNodes_ -= 1;\n\n  if (isEnabled() && numberOfEnabledInputNodes_ == 0) {\n    disable();\n  }\n}\n\nvoid AudioNode::onInputConnected(AudioNode *node) {\n  if (!isInitialized_.load(std::memory_order_acquire)) {\n    return;\n  }\n\n  inputNodes_.insert(node);\n\n  if (node->isEnabled()) {\n    onInputEnabled();\n  }\n}\n\nvoid AudioNode::onInputDisconnected(AudioNode *node) {\n  if (!isInitialized_.load(std::memory_order_acquire)) {\n    return;\n  }\n\n  if (node->isEnabled()) {\n    onInputDisabled();\n  }\n\n  auto position = inputNodes_.find(node);\n\n  if (position != inputNodes_.end()) {\n    inputNodes_.erase(position);\n  }\n}\n\nvoid AudioNode::cleanup() {\n  isInitialized_.store(false, std::memory_order_release);\n\n  for (auto it = outputNodes_.begin(), end = outputNodes_.end(); it != end; ++it) {\n    it->get()->onInputDisconnected(this);\n  }\n\n  outputNodes_.clear();\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/AudioNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/types/ChannelCountMode.h>\n#include <audioapi/core/types/ChannelInterpretation.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/Macros.h>\n\n#include <cassert>\n#include <cstddef>\n#include <memory>\n#include <unordered_set>\n#include <utility>\n#include <vector>\n\nnamespace audioapi {\n\nclass AudioParam;\n\nclass AudioNode : public std::enable_shared_from_this<AudioNode> {\n public:\n  explicit AudioNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const AudioNodeOptions &options = AudioNodeOptions());\n  virtual ~AudioNode();\n\n  DELETE_COPY_AND_MOVE(AudioNode);\n\n  [[nodiscard]] size_t getChannelCount() const;\n  void connect(const std::shared_ptr<AudioNode> &node);\n  void connect(const std::shared_ptr<AudioParam> &param);\n  void disconnect();\n  void disconnect(const std::shared_ptr<AudioNode> &node);\n  void disconnect(const std::shared_ptr<AudioParam> &param);\n  virtual std::shared_ptr<DSPAudioBuffer> processAudio(\n      const std::shared_ptr<DSPAudioBuffer> &outputBuffer,\n      int framesToProcess,\n      bool checkIsAlreadyProcessed);\n\n  [[nodiscard]] float getContextSampleRate() const {\n    if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n      return context->getSampleRate();\n    }\n\n    return DEFAULT_SAMPLE_RATE;\n  }\n\n  [[nodiscard]] float getNyquistFrequency() const {\n    constexpr float kNyquistDivisor = 2.0f;\n    return getContextSampleRate() / kNyquistDivisor;\n  }\n\n  /// @note JS Thread only\n  [[nodiscard]] bool isEnabled() const;\n  /// @note JS Thread only\n  [[nodiscard]] bool requiresTailProcessing() const;\n\n  template <typename F>\n  bool scheduleAudioEvent(F &&event) noexcept {\n    if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n      return context->scheduleAudioEvent(std::forward<F>(event));\n    }\n\n    return false;\n  }\n\n  virtual bool canBeDestructed() const;\n\n protected:\n  friend class AudioGraphManager;\n  friend class AudioDestinationNode;\n  friend class ConvolverNode;\n  friend class DelayNodeHostObject;\n\n  std::weak_ptr<BaseAudioContext> context_;\n  std::shared_ptr<DSPAudioBuffer> audioBuffer_;\n\n  const int numberOfInputs_ = 1;\n  const int numberOfOutputs_ = 1;\n  int channelCount_ = 2;\n  const ChannelCountMode channelCountMode_ = ChannelCountMode::MAX;\n  const ChannelInterpretation channelInterpretation_ = ChannelInterpretation::SPEAKERS;\n  const bool requiresTailProcessing_;\n\n  std::unordered_set<AudioNode *> inputNodes_;\n  std::unordered_set<std::shared_ptr<AudioNode>> outputNodes_;\n  std::unordered_set<std::shared_ptr<AudioParam>> outputParams_;\n\n  int numberOfEnabledInputNodes_{0};\n  std::atomic<bool> isInitialized_{false};\n\n  std::size_t lastRenderedFrame_{SIZE_MAX};\n\n  void enable();\n  virtual void disable();\n\n private:\n  bool isEnabled_ = true;\n  std::vector<std::shared_ptr<DSPAudioBuffer>> inputBuffers_;\n\n  virtual std::shared_ptr<DSPAudioBuffer> processInputs(\n      const std::shared_ptr<DSPAudioBuffer> &outputBuffer,\n      int framesToProcess,\n      bool checkIsAlreadyProcessed);\n  virtual std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &,\n      int) = 0;\n\n  bool isAlreadyProcessed();\n  std::shared_ptr<DSPAudioBuffer> applyChannelCountMode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer);\n  void mixInputsBuffers(const std::shared_ptr<DSPAudioBuffer> &processingBuffer);\n\n  void connectNode(const std::shared_ptr<AudioNode> &node);\n  void disconnectNode(const std::shared_ptr<AudioNode> &node);\n  void connectParam(const std::shared_ptr<AudioParam> &param);\n  void disconnectParam(const std::shared_ptr<AudioParam> &param);\n\n  void onInputEnabled();\n  virtual void onInputDisabled();\n  void onInputConnected(AudioNode *node);\n  void onInputDisconnected(AudioNode *node);\n\n  void cleanup();\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/AudioParam.cpp",
    "content": "#include <audioapi/core/AudioParam.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/utils/param/ParamRenderEventFactory.hpp>\n#include <audioapi/dsp/AudioUtils.hpp>\n#include <audioapi/dsp/VectorMath.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nAudioParam::AudioParam(\n    float defaultValue,\n    float minValue,\n    float maxValue,\n    const std::shared_ptr<BaseAudioContext> &context)\n    : context_(context),\n      value_(defaultValue),\n      defaultValue_(defaultValue),\n      minValue_(minValue),\n      maxValue_(maxValue),\n      eventRenderQueue_(defaultValue),\n      audioBuffer_(\n          std::make_shared<DSPAudioBuffer>(RENDER_QUANTUM_SIZE, 1, context->getSampleRate())) {\n  inputBuffers_.reserve(4);\n  inputNodes_.reserve(4);\n}\n\nfloat AudioParam::getValueAtTime(double time) {\n  auto value = eventRenderQueue_.computeValueAtTime(time);\n  if (!value.has_value()) {\n    return value_.load(std::memory_order_relaxed);\n  }\n  setValue(value.value());\n  return value.value();\n}\n\nvoid AudioParam::setValueAtTime(float value, double startTime) {\n  this->updateQueue(ParamRenderEventFactory::createSetValueEvent(value, startTime));\n}\n\nvoid AudioParam::linearRampToValueAtTime(float value, double endTime) {\n  this->updateQueue(ParamRenderEventFactory::createLinearRampEvent(value, endTime));\n}\n\nvoid AudioParam::exponentialRampToValueAtTime(float value, double endTime) {\n  this->updateQueue(ParamRenderEventFactory::createExponentialRampEvent(value, endTime));\n}\n\nvoid AudioParam::setTargetAtTime(float target, double startTime, double timeConstant) {\n  this->updateQueue(ParamRenderEventFactory::createSetTargetEvent(target, startTime, timeConstant));\n}\n\nvoid AudioParam::setValueCurveAtTime(\n    const std::shared_ptr<AudioArray> &values,\n    size_t length,\n    double startTime,\n    double duration) {\n  this->updateQueue(\n      ParamRenderEventFactory::createSetValueCurveEvent(values, length, startTime, duration));\n}\n\nvoid AudioParam::cancelScheduledValues(double cancelTime) {\n  eventRenderQueue_.cancelScheduledValues(cancelTime);\n}\n\nvoid AudioParam::cancelAndHoldAtTime(double cancelTime) {\n  eventRenderQueue_.cancelAndHoldAtTime(cancelTime);\n}\n\nvoid AudioParam::addInputNode(AudioNode *node) {\n  inputNodes_.emplace_back(node);\n}\n\nvoid AudioParam::removeInputNode(AudioNode *node) {\n  for (int i = 0; i < inputNodes_.size(); i++) {\n    if (inputNodes_[i] == node) {\n      std::swap(inputNodes_[i], inputNodes_.back());\n      inputNodes_.resize(inputNodes_.size() - 1);\n      break;\n    }\n  }\n}\n\nstd::shared_ptr<DSPAudioBuffer> AudioParam::calculateInputs(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  processingBuffer->zero();\n  if (inputNodes_.empty()) {\n    return processingBuffer;\n  }\n  processInputs(processingBuffer, framesToProcess, true);\n  mixInputsBuffers(processingBuffer);\n  return processingBuffer;\n}\n\nstd::shared_ptr<DSPAudioBuffer> AudioParam::processARateParam(int framesToProcess, double time) {\n  auto processingBuffer = calculateInputs(audioBuffer_, framesToProcess);\n\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr) {\n    return processingBuffer;\n  }\n  float sampleRate = context->getSampleRate();\n  auto bufferData = processingBuffer->getChannel(0)->span();\n  double timeCache = time;\n  float timeStep = 1.0f / sampleRate;\n  float sample = 0.0f;\n\n  // Add automated parameter value to each sample\n  for (int i = 0; i < framesToProcess; i++, timeCache += timeStep) {\n    sample = getValueAtTime(timeCache);\n    bufferData[i] += sample;\n  }\n  // processingBuffer is a mono buffer containing per-sample parameter values\n  return processingBuffer;\n}\n\nfloat AudioParam::processKRateParam(int framesToProcess, double time) {\n  auto processingBuffer = calculateInputs(audioBuffer_, framesToProcess);\n\n  // Return block-rate parameter value plus first sample of input modulation\n  return processingBuffer->getChannel(0)->span()[0] + getValueAtTime(time);\n}\n\nvoid AudioParam::processInputs(\n    const std::shared_ptr<DSPAudioBuffer> &outputBuffer,\n    int framesToProcess,\n    bool checkIsAlreadyProcessed) {\n  for (auto *inputNode : inputNodes_) {\n    assert(inputNode != nullptr);\n\n    if (!inputNode->isEnabled()) {\n      continue;\n    }\n\n    // Process this input node and store its output buffer\n    auto inputBuffer =\n        inputNode->processAudio(outputBuffer, framesToProcess, checkIsAlreadyProcessed);\n    inputBuffers_.emplace_back(inputBuffer);\n  }\n}\n\nvoid AudioParam::mixInputsBuffers(const std::shared_ptr<DSPAudioBuffer> &processingBuffer) {\n  assert(processingBuffer != nullptr);\n\n  // Sum all input buffers into the processing buffer\n  for (auto &inputBuffer : inputBuffers_) {\n    processingBuffer->sum(*inputBuffer, ChannelInterpretation::SPEAKERS);\n  }\n\n  // Clear for next processing cycle\n  inputBuffers_.clear();\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/AudioParam.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/types/ParamEventType.h>\n#include <audioapi/core/utils/param/ParamRenderQueue.h>\n#include <audioapi/core/utils/param/RenderParamEvent.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <audioapi/utils/CrossThreadEventScheduler.hpp>\n#include <cstddef>\n#include <memory>\n#include <utility>\n#include <vector>\n\nnamespace audioapi {\n\nclass AudioParam {\n public:\n  explicit AudioParam(\n      float defaultValue,\n      float minValue,\n      float maxValue,\n      const std::shared_ptr<BaseAudioContext> &context);\n\n  [[nodiscard]] float getValue() const noexcept {\n    return value_.load(std::memory_order_relaxed);\n  }\n\n  [[nodiscard]] float getDefaultValue() const noexcept {\n    return defaultValue_;\n  }\n\n  [[nodiscard]] float getMinValue() const noexcept {\n    return minValue_;\n  }\n\n  [[nodiscard]] float getMaxValue() const noexcept {\n    return maxValue_;\n  }\n\n  void setValue(float value) {\n    value_.store(std::clamp(value, minValue_, maxValue_), std::memory_order_release);\n  }\n\n  /// @note JS Thread only\n  [[nodiscard]] double getCurrentTime() const noexcept {\n    if (auto context = context_.lock()) {\n      return context->getCurrentTime();\n    }\n    return 0.0;\n  }\n\n  /// @note Audio Thread only\n  void setValueAtTime(float value, double startTime);\n\n  /// @note Audio Thread only\n  void linearRampToValueAtTime(float value, double endTime);\n\n  /// @note Audio Thread only\n  void exponentialRampToValueAtTime(float value, double endTime);\n\n  /// @note Audio Thread only\n  void setTargetAtTime(float target, double startTime, double timeConstant);\n\n  /// @note Audio Thread only\n  void setValueCurveAtTime(\n      const std::shared_ptr<AudioArray> &values,\n      size_t length,\n      double startTime,\n      double duration);\n\n  /// @note Audio Thread only\n  void cancelScheduledValues(double cancelTime);\n\n  /// @note Audio Thread only\n  void cancelAndHoldAtTime(double cancelTime);\n\n  template <typename F>\n  bool scheduleAudioEvent(F &&event) noexcept\n    requires(std::is_invocable_r_v<void, std::decay_t<F>, BaseAudioContext &>)\n  {\n    if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n      return context->scheduleAudioEvent(std::forward<F>(event));\n    }\n\n    return false;\n  }\n\n  /// Audio-Thread only methods\n  /// These methods are called only from the Audio rendering thread.\n\n  /// @note Audio Thread only\n  void addInputNode(AudioNode *node);\n\n  /// @note Audio Thread only\n  void removeInputNode(AudioNode *node);\n\n  /// @note Audio Thread only\n  std::shared_ptr<DSPAudioBuffer> processARateParam(int framesToProcess, double time);\n\n  /// @note Audio Thread only\n  float processKRateParam(int framesToProcess, double time);\n\n private:\n  // Core parameter state\n  std::weak_ptr<BaseAudioContext> context_;\n  std::atomic<float> value_;\n  float defaultValue_;\n  float minValue_;\n  float maxValue_;\n\n  ParamRenderQueue eventRenderQueue_;\n\n  // Input modulation system\n  std::vector<AudioNode *> inputNodes_;\n  std::shared_ptr<DSPAudioBuffer> audioBuffer_;\n  std::vector<std::shared_ptr<DSPAudioBuffer>> inputBuffers_;\n\n  /// @brief Update the parameter queue with a new event.\n  /// @param event The new event to add to the queue.\n  /// @note Resolves the event's startValue and startTime based on neighboring events,\n  // and adjusts neighboring events to maintain the invariant of non-overlapping events in the queue.\n  void updateQueue(RenderParamEvent &&event) {\n    eventRenderQueue_.push(std::move(event));\n  }\n\n  float getValueAtTime(double time);\n  void processInputs(\n      const std::shared_ptr<DSPAudioBuffer> &outputBuffer,\n      int framesToProcess,\n      bool checkIsAlreadyProcessed);\n  void mixInputsBuffers(const std::shared_ptr<DSPAudioBuffer> &processingBuffer);\n  std::shared_ptr<DSPAudioBuffer> calculateInputs(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/BaseAudioContext.cpp",
    "content": "#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/analysis/AnalyserNode.h>\n#include <audioapi/core/destinations/AudioDestinationNode.h>\n#include <audioapi/core/effects/BiquadFilterNode.h>\n#include <audioapi/core/effects/ConvolverNode.h>\n#include <audioapi/core/effects/DelayNode.h>\n#include <audioapi/core/effects/GainNode.h>\n#include <audioapi/core/effects/IIRFilterNode.h>\n#include <audioapi/core/effects/StereoPannerNode.h>\n#include <audioapi/core/effects/WaveShaperNode.h>\n#include <audioapi/core/effects/WorkletNode.h>\n#include <audioapi/core/effects/WorkletProcessingNode.h>\n#include <audioapi/core/sources/AudioBufferQueueSourceNode.h>\n#include <audioapi/core/sources/AudioBufferSourceNode.h>\n#include <audioapi/core/sources/AudioFileSourceNode.h>\n#include <audioapi/core/sources/ConstantSourceNode.h>\n#include <audioapi/core/sources/OscillatorNode.h>\n#include <audioapi/core/sources/RecorderAdapterNode.h>\n#include <audioapi/types/NodeOptions.h>\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n#include <audioapi/core/sources/StreamerNode.h>\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n#include <audioapi/core/sources/WorkletSourceNode.h>\n#include <audioapi/core/utils/AudioDecoder.h>\n#include <audioapi/core/utils/AudioGraphManager.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/CircularArray.hpp>\n#include <memory>\n#include <utility>\n#include <vector>\n\nnamespace audioapi {\n\nBaseAudioContext::BaseAudioContext(\n    float sampleRate,\n    const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    const RuntimeRegistry &runtimeRegistry)\n    : state_(ContextState::SUSPENDED),\n      sampleRate_(sampleRate),\n      graphManager_(std::make_shared<AudioGraphManager>()),\n      audioEventHandlerRegistry_(audioEventHandlerRegistry),\n      runtimeRegistry_(runtimeRegistry),\n      audioEventScheduler_(AUDIO_SCHEDULER_CAPACITY) {}\n\nvoid BaseAudioContext::initialize() {\n  destination_ = std::make_shared<AudioDestinationNode>(shared_from_this());\n}\n\nContextState BaseAudioContext::getState() {\n  auto state = state_.load(std::memory_order_acquire);\n\n  if (state == ContextState::CLOSED || isDriverRunning()) {\n    return state;\n  }\n\n  return ContextState::SUSPENDED;\n}\n\nfloat BaseAudioContext::getSampleRate() const {\n  return sampleRate_.load(std::memory_order_acquire);\n}\n\nstd::size_t BaseAudioContext::getCurrentSampleFrame() const {\n  assert(destination_ != nullptr);\n  return destination_->getCurrentSampleFrame();\n}\n\ndouble BaseAudioContext::getCurrentTime() const {\n  assert(destination_ != nullptr);\n  return destination_->getCurrentTime();\n}\n\nstd::shared_ptr<AudioDestinationNode> BaseAudioContext::getDestination() const {\n  return destination_;\n}\n\nvoid BaseAudioContext::setState(audioapi::ContextState state) {\n  state_.store(state, std::memory_order_release);\n}\n\nstd::shared_ptr<WorkletSourceNode> BaseAudioContext::createWorkletSourceNode(\n    std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,\n    std::weak_ptr<worklets::WorkletRuntime> runtime,\n    bool shouldLockRuntime) {\n  WorkletsRunner workletRunner(runtime, shareableWorklet, shouldLockRuntime);\n  auto workletSourceNode =\n      std::make_shared<WorkletSourceNode>(shared_from_this(), std::move(workletRunner));\n  graphManager_->addSourceNode(workletSourceNode);\n  return workletSourceNode;\n}\n\nstd::shared_ptr<WorkletNode> BaseAudioContext::createWorkletNode(\n    std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,\n    std::weak_ptr<worklets::WorkletRuntime> runtime,\n    size_t bufferLength,\n    size_t inputChannelCount,\n    bool shouldLockRuntime) {\n  WorkletsRunner workletRunner(runtime, shareableWorklet, shouldLockRuntime);\n  auto workletNode = std::make_shared<WorkletNode>(\n      shared_from_this(), bufferLength, inputChannelCount, std::move(workletRunner));\n  graphManager_->addProcessingNode(workletNode);\n  return workletNode;\n}\n\nstd::shared_ptr<WorkletProcessingNode> BaseAudioContext::createWorkletProcessingNode(\n    std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,\n    std::weak_ptr<worklets::WorkletRuntime> runtime,\n    bool shouldLockRuntime) {\n  WorkletsRunner workletRunner(runtime, shareableWorklet, shouldLockRuntime);\n  auto workletProcessingNode =\n      std::make_shared<WorkletProcessingNode>(shared_from_this(), std::move(workletRunner));\n  graphManager_->addProcessingNode(workletProcessingNode);\n  return workletProcessingNode;\n}\n\nstd::shared_ptr<RecorderAdapterNode> BaseAudioContext::createRecorderAdapter() {\n  auto recorderAdapter = std::make_shared<RecorderAdapterNode>(shared_from_this());\n  graphManager_->addProcessingNode(recorderAdapter);\n  return recorderAdapter;\n}\n\nstd::shared_ptr<OscillatorNode> BaseAudioContext::createOscillator(\n    const OscillatorOptions &options) {\n  auto oscillator = std::make_shared<OscillatorNode>(shared_from_this(), options);\n  graphManager_->addSourceNode(oscillator);\n  return oscillator;\n}\n\nstd::shared_ptr<ConstantSourceNode> BaseAudioContext::createConstantSource(\n    const ConstantSourceOptions &options) {\n  auto constantSource = std::make_shared<ConstantSourceNode>(shared_from_this(), options);\n  graphManager_->addSourceNode(constantSource);\n  return constantSource;\n}\n\nstd::shared_ptr<StreamerNode> BaseAudioContext::createStreamer(const StreamerOptions &options) {\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n  auto streamer = std::make_shared<StreamerNode>(shared_from_this(), options);\n  graphManager_->addSourceNode(streamer);\n  return streamer;\n#else\n  return nullptr;\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n}\n\nstd::shared_ptr<GainNode> BaseAudioContext::createGain(const GainOptions &options) {\n  auto gain = std::make_shared<GainNode>(shared_from_this(), options);\n  graphManager_->addProcessingNode(gain);\n  return gain;\n}\n\nstd::shared_ptr<StereoPannerNode> BaseAudioContext::createStereoPanner(\n    const StereoPannerOptions &options) {\n  auto stereoPanner = std::make_shared<StereoPannerNode>(shared_from_this(), options);\n  graphManager_->addProcessingNode(stereoPanner);\n  return stereoPanner;\n}\n\nstd::shared_ptr<DelayNode> BaseAudioContext::createDelay(const DelayOptions &options) {\n  auto delay = std::make_shared<DelayNode>(shared_from_this(), options);\n  graphManager_->addProcessingNode(delay);\n  return delay;\n}\n\nstd::shared_ptr<BiquadFilterNode> BaseAudioContext::createBiquadFilter(\n    const BiquadFilterOptions &options) {\n  auto biquadFilter = std::make_shared<BiquadFilterNode>(shared_from_this(), options);\n  graphManager_->addProcessingNode(biquadFilter);\n  return biquadFilter;\n}\n\nstd::shared_ptr<AudioBufferSourceNode> BaseAudioContext::createBufferSource(\n    const AudioBufferSourceOptions &options) {\n  auto bufferSource = std::make_shared<AudioBufferSourceNode>(shared_from_this(), options);\n  graphManager_->addSourceNode(bufferSource);\n  return bufferSource;\n}\n\n#if !RN_AUDIO_API_TEST\nstd::shared_ptr<AudioFileSourceNode> BaseAudioContext::createFileSource(\n    const AudioFileSourceOptions &options) {\n  auto fileSource = std::make_shared<AudioFileSourceNode>(shared_from_this(), options);\n  graphManager_->addSourceNode(fileSource);\n  return fileSource;\n}\n#endif // RN_AUDIO_API_TEST\n\nstd::shared_ptr<IIRFilterNode> BaseAudioContext::createIIRFilter(const IIRFilterOptions &options) {\n  auto iirFilter = std::make_shared<IIRFilterNode>(shared_from_this(), options);\n  graphManager_->addProcessingNode(iirFilter);\n  return iirFilter;\n}\n\nstd::shared_ptr<AudioBufferQueueSourceNode> BaseAudioContext::createBufferQueueSource(\n    const BaseAudioBufferSourceOptions &options) {\n  auto bufferSource = std::make_shared<AudioBufferQueueSourceNode>(shared_from_this(), options);\n  graphManager_->addSourceNode(bufferSource);\n  return bufferSource;\n}\n\nstd::shared_ptr<PeriodicWave> BaseAudioContext::createPeriodicWave(\n    const std::vector<std::complex<float>> &complexData,\n    bool disableNormalization,\n    int length) const {\n  return std::make_shared<PeriodicWave>(getSampleRate(), complexData, length, disableNormalization);\n}\n\nstd::shared_ptr<AnalyserNode> BaseAudioContext::createAnalyser(const AnalyserOptions &options) {\n  auto analyser = std::make_shared<AnalyserNode>(shared_from_this(), options);\n  graphManager_->addProcessingNode(analyser);\n  return analyser;\n}\n\nstd::shared_ptr<ConvolverNode> BaseAudioContext::createConvolver(const ConvolverOptions &options) {\n  auto convolver = std::make_shared<ConvolverNode>(shared_from_this(), options);\n  graphManager_->addProcessingNode(convolver);\n  return convolver;\n}\n\nstd::shared_ptr<WaveShaperNode> BaseAudioContext::createWaveShaper(\n    const WaveShaperOptions &options) {\n  auto waveShaper = std::make_shared<WaveShaperNode>(shared_from_this(), options);\n  graphManager_->addProcessingNode(waveShaper);\n  return waveShaper;\n}\n\nstd::shared_ptr<PeriodicWave> BaseAudioContext::getBasicWaveForm(OscillatorType type) {\n  switch (type) {\n    case OscillatorType::SINE:\n      if (cachedSineWave_ == nullptr) {\n        cachedSineWave_ = std::make_shared<PeriodicWave>(getSampleRate(), type, false);\n      }\n      return cachedSineWave_;\n    case OscillatorType::SQUARE:\n      if (cachedSquareWave_ == nullptr) {\n        cachedSquareWave_ = std::make_shared<PeriodicWave>(getSampleRate(), type, false);\n      }\n      return cachedSquareWave_;\n    case OscillatorType::SAWTOOTH:\n      if (cachedSawtoothWave_ == nullptr) {\n        cachedSawtoothWave_ = std::make_shared<PeriodicWave>(getSampleRate(), type, false);\n      }\n      return cachedSawtoothWave_;\n    case OscillatorType::TRIANGLE:\n      if (cachedTriangleWave_ == nullptr) {\n        cachedTriangleWave_ = std::make_shared<PeriodicWave>(getSampleRate(), type, false);\n      }\n      return cachedTriangleWave_;\n    case OscillatorType::CUSTOM:\n      throw std::invalid_argument(\"You can't get a custom wave form. You need to create it.\");\n      break;\n  }\n}\n\nstd::shared_ptr<AudioGraphManager> BaseAudioContext::getGraphManager() const {\n  return graphManager_;\n}\n\nstd::shared_ptr<IAudioEventHandlerRegistry> BaseAudioContext::getAudioEventHandlerRegistry() const {\n  return audioEventHandlerRegistry_;\n}\n\nconst RuntimeRegistry &BaseAudioContext::getRuntimeRegistry() const {\n  return runtimeRegistry_;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/BaseAudioContext.h",
    "content": "#pragma once\n\n#include <audioapi/core/types/ContextState.h>\n#include <audioapi/core/types/OscillatorType.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/CrossThreadEventScheduler.hpp>\n\n#include <audioapi/utils/Macros.h>\n#include <atomic>\n#include <cassert>\n#include <complex>\n#include <cstddef>\n#include <memory>\n#include <utility>\n#include <vector>\n\nnamespace audioapi {\n\nclass GainNode;\nclass DelayNode;\nclass PeriodicWave;\nclass OscillatorNode;\nclass ConstantSourceNode;\nclass StereoPannerNode;\nclass AudioGraphManager;\nclass BiquadFilterNode;\nclass IIRFilterNode;\nclass AudioDestinationNode;\nclass AudioBufferSourceNode;\nclass AudioBufferQueueSourceNode;\nclass AudioFileSourceNode;\nclass AnalyserNode;\nclass AudioEventHandlerRegistry;\nclass ConvolverNode;\nclass IAudioEventHandlerRegistry;\nclass RecorderAdapterNode;\nclass WaveShaperNode;\nclass WorkletSourceNode;\nclass WorkletNode;\nclass WorkletProcessingNode;\nclass StreamerNode;\nstruct GainOptions;\nstruct StereoPannerOptions;\nstruct ConvolverOptions;\nstruct ConstantSourceOptions;\nstruct AnalyserOptions;\nstruct BiquadFilterOptions;\nstruct OscillatorOptions;\nstruct BaseAudioBufferSourceOptions;\nstruct AudioBufferSourceOptions;\nstruct AudioFileSourceOptions;\nstruct StreamerOptions;\nstruct DelayOptions;\nstruct IIRFilterOptions;\nstruct WaveShaperOptions;\n\nclass BaseAudioContext : public std::enable_shared_from_this<BaseAudioContext> {\n public:\n  DELETE_COPY_AND_MOVE(BaseAudioContext);\n\n  explicit BaseAudioContext(\n      float sampleRate,\n      const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const RuntimeRegistry &runtimeRegistry);\n  virtual ~BaseAudioContext() = default;\n\n  ContextState getState();\n  [[nodiscard]] float getSampleRate() const;\n  [[nodiscard]] double getCurrentTime() const;\n  [[nodiscard]] std::size_t getCurrentSampleFrame() const;\n  [[nodiscard]] std::shared_ptr<AudioDestinationNode> getDestination() const;\n\n  void setState(ContextState state);\n\n  std::shared_ptr<RecorderAdapterNode> createRecorderAdapter();\n  std::shared_ptr<WorkletSourceNode> createWorkletSourceNode(\n      std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,\n      std::weak_ptr<worklets::WorkletRuntime> runtime,\n      bool shouldLockRuntime = true);\n  std::shared_ptr<WorkletNode> createWorkletNode(\n      std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,\n      std::weak_ptr<worklets::WorkletRuntime> runtime,\n      size_t bufferLength,\n      size_t inputChannelCount,\n      bool shouldLockRuntime = true);\n  std::shared_ptr<WorkletProcessingNode> createWorkletProcessingNode(\n      std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,\n      std::weak_ptr<worklets::WorkletRuntime> runtime,\n      bool shouldLockRuntime = true);\n  std::shared_ptr<DelayNode> createDelay(const DelayOptions &options);\n  std::shared_ptr<IIRFilterNode> createIIRFilter(const IIRFilterOptions &options);\n  std::shared_ptr<OscillatorNode> createOscillator(const OscillatorOptions &options);\n  std::shared_ptr<ConstantSourceNode> createConstantSource(const ConstantSourceOptions &options);\n  std::shared_ptr<StreamerNode> createStreamer(const StreamerOptions &options);\n  std::shared_ptr<GainNode> createGain(const GainOptions &options);\n  std::shared_ptr<StereoPannerNode> createStereoPanner(const StereoPannerOptions &options);\n  std::shared_ptr<BiquadFilterNode> createBiquadFilter(const BiquadFilterOptions &options);\n  std::shared_ptr<AudioBufferSourceNode> createBufferSource(\n      const AudioBufferSourceOptions &options);\n#if !RN_AUDIO_API_TEST\n  std::shared_ptr<AudioFileSourceNode> createFileSource(const AudioFileSourceOptions &options);\n#endif // RN_AUDIO_API_TEST\n  std::shared_ptr<AudioBufferQueueSourceNode> createBufferQueueSource(\n      const BaseAudioBufferSourceOptions &options);\n  [[nodiscard]] std::shared_ptr<PeriodicWave> createPeriodicWave(\n      const std::vector<std::complex<float>>\n          &complexData, // NOLINT(readability-avoid-const-params-in-decls)\n      bool disableNormalization,\n      int length) const;\n  std::shared_ptr<AnalyserNode> createAnalyser(const AnalyserOptions &options);\n  std::shared_ptr<ConvolverNode> createConvolver(const ConvolverOptions &options);\n  std::shared_ptr<WaveShaperNode> createWaveShaper(const WaveShaperOptions &options);\n\n  std::shared_ptr<PeriodicWave> getBasicWaveForm(OscillatorType type);\n  [[nodiscard]] std::shared_ptr<AudioGraphManager> getGraphManager() const;\n  [[nodiscard]] std::shared_ptr<IAudioEventHandlerRegistry> getAudioEventHandlerRegistry() const;\n  [[nodiscard]] const RuntimeRegistry &getRuntimeRegistry() const;\n\n  virtual void initialize();\n\n  void processAudioEvents() {\n    audioEventScheduler_.processAllEvents(*this);\n  }\n\n  template <typename F>\n  bool scheduleAudioEvent(F &&event) noexcept { // NOLINT(cppcoreguidelines-missing-std-forward)\n    if (getState() != ContextState::RUNNING) {\n      processAudioEvents();\n      event(*this);\n      return true;\n    }\n\n    return audioEventScheduler_.scheduleEvent(std::forward<F>(event));\n  }\n\n protected:\n  std::shared_ptr<AudioDestinationNode> destination_;\n\n private:\n  std::atomic<ContextState> state_;\n  std::atomic<float> sampleRate_;\n  std::shared_ptr<AudioGraphManager> graphManager_;\n  std::shared_ptr<IAudioEventHandlerRegistry> audioEventHandlerRegistry_;\n  RuntimeRegistry runtimeRegistry_;\n\n  std::shared_ptr<PeriodicWave> cachedSineWave_ = nullptr;\n  std::shared_ptr<PeriodicWave> cachedSquareWave_ = nullptr;\n  std::shared_ptr<PeriodicWave> cachedSawtoothWave_ = nullptr;\n  std::shared_ptr<PeriodicWave> cachedTriangleWave_ = nullptr;\n\n  static constexpr size_t AUDIO_SCHEDULER_CAPACITY = 1024;\n  CrossThreadEventScheduler<BaseAudioContext> audioEventScheduler_;\n\n  [[nodiscard]] virtual bool isDriverRunning() const = 0;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/OfflineAudioContext.cpp",
    "content": "#include <audioapi/core/OfflineAudioContext.h>\n\n#include <audioapi/core/AudioContext.h>\n#include <audioapi/core/destinations/AudioDestinationNode.h>\n#include <audioapi/core/utils/AudioGraphManager.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/core/utils/Locker.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <algorithm>\n#include <cassert>\n#include <memory>\n#include <thread>\n#include <utility>\n\nnamespace audioapi {\n\nOfflineAudioContext::OfflineAudioContext(\n    int numberOfChannels,\n    size_t length,\n    float sampleRate,\n    const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    const RuntimeRegistry &runtimeRegistry)\n    : BaseAudioContext(sampleRate, audioEventHandlerRegistry, runtimeRegistry),\n      length_(length),\n      numberOfChannels_(numberOfChannels),\n      currentSampleFrame_(0),\n      audioBuffer_(\n          std::make_shared<DSPAudioBuffer>(RENDER_QUANTUM_SIZE, numberOfChannels, sampleRate)),\n      resultBuffer_(std::make_shared<AudioBuffer>(length, numberOfChannels, sampleRate)) {}\n\nOfflineAudioContext::~OfflineAudioContext() {\n  getGraphManager()->cleanup();\n}\n\nvoid OfflineAudioContext::resume() {\n  Locker locker(mutex_);\n\n  if (getState() == ContextState::RUNNING) {\n    return;\n  }\n\n  renderAudio();\n}\n\nvoid OfflineAudioContext::suspend(double when, const std::function<void()> &callback) {\n  Locker locker(mutex_);\n\n  // we can only suspend once per render quantum at the end of the quantum\n  // first quantum is [0, RENDER_QUANTUM_SIZE)\n  auto frame = static_cast<size_t>(when * getSampleRate());\n  frame = RENDER_QUANTUM_SIZE * ((frame + RENDER_QUANTUM_SIZE - 1) / RENDER_QUANTUM_SIZE);\n\n  if (scheduledSuspends_.contains(frame)) {\n    throw std::runtime_error(\n        \"cannot schedule more than one suspend at frame \" + std::to_string(frame) + \" (\" +\n        std::to_string(when) + \" seconds)\");\n  }\n\n  scheduledSuspends_.emplace(frame, callback);\n}\n\nvoid OfflineAudioContext::renderAudio() {\n  setState(ContextState::RUNNING);\n\n  std::thread([this]() {\n    while (currentSampleFrame_ < length_) {\n      Locker locker(mutex_);\n      int framesToProcess =\n          std::min(static_cast<int>(length_ - currentSampleFrame_), RENDER_QUANTUM_SIZE);\n\n      audioBuffer_->zero();\n      destination_->renderAudio(audioBuffer_, framesToProcess);\n\n      resultBuffer_->copy(*audioBuffer_, 0, currentSampleFrame_, framesToProcess);\n\n      currentSampleFrame_ += framesToProcess;\n\n      // Execute scheduled suspend if exists\n      auto suspend = scheduledSuspends_.find(currentSampleFrame_);\n      if (suspend != scheduledSuspends_.end()) {\n        assert(currentSampleFrame_ < length_);\n        auto callback = suspend->second;\n        scheduledSuspends_.erase(currentSampleFrame_);\n        setState(ContextState::SUSPENDED);\n        callback();\n        return;\n      }\n    }\n\n    // Rendering completed\n    resultCallback_(resultBuffer_);\n  }).detach();\n}\n\nvoid OfflineAudioContext::startRendering(OfflineAudioContextResultCallback callback) {\n  Locker locker(mutex_);\n\n  resultCallback_ = std::move(callback);\n  renderAudio();\n}\n\nbool OfflineAudioContext::isDriverRunning() const {\n  return true;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/OfflineAudioContext.h",
    "content": "#pragma once\n\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/Macros.h>\n\n#include <memory>\n#include <mutex>\n#include <unordered_map>\n\nnamespace audioapi {\n\nusing OfflineAudioContextSuspendCallback = std::function<void()>;\nusing OfflineAudioContextResultCallback = std::function<void(std::shared_ptr<AudioBuffer>)>;\n\nclass OfflineAudioContext : public BaseAudioContext {\n public:\n  explicit OfflineAudioContext(\n      int numberOfChannels,\n      size_t length,\n      float sampleRate,\n      const std::shared_ptr<IAudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const RuntimeRegistry &runtimeRegistry);\n  ~OfflineAudioContext() override;\n  DELETE_COPY_AND_MOVE(OfflineAudioContext);\n\n  /// @note JS Thread only\n  void resume();\n\n  /// @note JS Thread only\n  void suspend(double when, const OfflineAudioContextSuspendCallback &callback);\n\n  /// @note JS Thread only\n  void startRendering(OfflineAudioContextResultCallback callback);\n\n private:\n  std::mutex mutex_;\n\n  std::unordered_map<size_t, OfflineAudioContextSuspendCallback> scheduledSuspends_;\n  OfflineAudioContextResultCallback resultCallback_;\n\n  const size_t length_;\n  const int numberOfChannels_;\n  size_t currentSampleFrame_;\n\n  std::shared_ptr<DSPAudioBuffer> audioBuffer_;\n  std::shared_ptr<AudioBuffer> resultBuffer_;\n\n  void renderAudio();\n\n  bool isDriverRunning() const override;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/analysis/AnalyserNode.cpp",
    "content": "#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/analysis/AnalyserNode.h>\n#include <audioapi/dsp/AudioUtils.hpp>\n#include <audioapi/dsp/VectorMath.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <algorithm>\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\nAnalyserNode::AnalyserNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const AnalyserOptions &options)\n    : AudioNode(context, options),\n      inputArray_(std::make_unique<CircularDSPAudioArray>(MAX_FFT_SIZE * 2)),\n      downMixBuffer_(\n          std::make_unique<DSPAudioBuffer>(RENDER_QUANTUM_SIZE, 1, context->getSampleRate())),\n      minDecibels_(options.minDecibels),\n      maxDecibels_(options.maxDecibels),\n      smoothingTimeConstant_(options.smoothingTimeConstant) {\n  setFFTSize(options.fftSize);\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nvoid AnalyserNode::setFFTSize(int fftSize) {\n  if (fftSize == fftSize_.load(std::memory_order_acquire)) {\n    return;\n  }\n\n  fft_ = std::make_unique<dsp::FFT>(fftSize);\n  complexData_ = std::vector<std::complex<float>>(fftSize);\n  magnitudeArray_ = std::make_unique<DSPAudioArray>(fftSize / 2);\n  tempArray_ = std::make_unique<DSPAudioArray>(fftSize);\n  initializeWindowData(fftSize);\n  fftSize_.store(fftSize, std::memory_order_release);\n}\n\nvoid AnalyserNode::getFloatFrequencyData(float *data, int length) {\n  doFFTAnalysis();\n\n  length = std::min(static_cast<int>(magnitudeArray_->getSize()), length);\n  auto magnitudeSpan = magnitudeArray_->span();\n\n  for (int i = 0; i < length; i++) {\n    data[i] = dsp::linearToDecibels(magnitudeSpan[i]);\n  }\n}\n\nvoid AnalyserNode::getByteFrequencyData(uint8_t *data, int length) {\n  doFFTAnalysis();\n\n  auto magnitudeBufferData = magnitudeArray_->span();\n  length = std::min(static_cast<int>(magnitudeArray_->getSize()), length);\n\n  const auto rangeScaleFactor =\n      maxDecibels_ == minDecibels_ ? 1 : 1 / (maxDecibels_ - minDecibels_);\n\n  for (int i = 0; i < length; i++) {\n    auto dbMag =\n        magnitudeBufferData[i] == 0 ? minDecibels_ : dsp::linearToDecibels(magnitudeBufferData[i]);\n    auto scaledValue = UINT8_MAX * (dbMag - minDecibels_) * rangeScaleFactor;\n\n    data[i] = static_cast<uint8_t>(std::clamp(scaledValue, 0.0f, static_cast<float>(UINT8_MAX)));\n  }\n}\n\nvoid AnalyserNode::getFloatTimeDomainData(float *data, int length) {\n  auto *frame = analysisBuffer_.getForReader();\n  auto size = std::min(frame->fftSize, length);\n\n  frame->timeDomain.copyTo(data, 0, 0, size);\n}\n\nvoid AnalyserNode::getByteTimeDomainData(uint8_t *data, int length) {\n  auto *frame = analysisBuffer_.getForReader();\n  auto size = std::min(frame->fftSize, length);\n\n  auto values = frame->timeDomain.span();\n\n  constexpr float BYTE_CENTER = 128.0f;\n  for (int i = 0; i < size; i++) {\n    float scaledValue = BYTE_CENTER * (values[i] + 1);\n    scaledValue = std::clamp(scaledValue, 0.0f, static_cast<float>(UINT8_MAX));\n\n    data[i] = static_cast<uint8_t>(scaledValue);\n  }\n}\n\nstd::shared_ptr<DSPAudioBuffer> AnalyserNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  // Analyser should behave like a sniffer node, it should not modify the\n  // processingBuffer but instead copy the data to its own input buffer.\n\n  // Down mix the input buffer to mono\n  downMixBuffer_->copy(*processingBuffer);\n  // Copy the down mixed buffer to the input buffer (circular buffer)\n  inputArray_->push_back(*downMixBuffer_->getChannel(0), framesToProcess, true);\n\n  // Snapshot the latest fftSize_ samples into the triple buffer for the JS thread.\n  auto *frame = analysisBuffer_.getForWriter();\n  auto fftSize = fftSize_.load(std::memory_order_acquire);\n  frame->fftSize = fftSize;\n  frame->sequenceNumber = ++publishSequence_;\n  inputArray_->pop_back(frame->timeDomain, fftSize, 0, true);\n  analysisBuffer_.publish();\n\n  return processingBuffer;\n}\n\nvoid AnalyserNode::doFFTAnalysis() {\n  auto *frame = analysisBuffer_.getForReader();\n\n  if (frame->sequenceNumber == lastAnalyzedSequence_) {\n    return;\n  }\n\n  auto fftSize = frame->fftSize;\n\n  // relaxed because fftSize_ is only updated on the JS thread.\n  if (fftSize != fftSize_.load(std::memory_order_relaxed)) {\n    return;\n  }\n\n  lastAnalyzedSequence_ = frame->sequenceNumber;\n\n  // Copy the snapshot from the triple buffer and apply the window.\n  tempArray_->copy(frame->timeDomain, 0, 0, fftSize);\n  tempArray_->multiply(*windowData_, fftSize);\n\n  // do fft analysis - get frequency domain data\n  fft_->doFFT(*tempArray_, complexData_);\n\n  // Zero out nquist component\n  complexData_[0] = std::complex<float>(complexData_[0].real(), 0);\n\n  const float magnitudeScale = 1.0f / static_cast<float>(fftSize);\n  auto magnitudeBufferData = magnitudeArray_->span();\n\n  for (int i = 0; i < magnitudeArray_->getSize(); i++) {\n    auto scalarMagnitude = std::abs(complexData_[i]) * magnitudeScale;\n    magnitudeBufferData[i] = smoothingTimeConstant_ * magnitudeBufferData[i] +\n        (1 - smoothingTimeConstant_) * scalarMagnitude;\n  }\n}\n\nvoid AnalyserNode::initializeWindowData(int fftSize) {\n  windowData_ = std::make_unique<DSPAudioArray>(fftSize);\n  auto data = windowData_->span();\n  auto size = windowData_->getSize();\n\n  const auto invSizeMinusOne = 1.0f / static_cast<float>(size - 1);\n  const auto alpha = 2.0f * std::numbers::pi_v<float> * invSizeMinusOne;\n\n  for (size_t i = 0; i < size; ++i) {\n    const auto phase = alpha * static_cast<float>(i);\n    // 4*PI*x is just 2 * (2*PI*x)\n    const auto window = 0.42f - 0.50f * std::cos(phase) + 0.08f * std::cos(2.0f * phase);\n    data[i] = window;\n  }\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/analysis/AnalyserNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/dsp/FFT.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/CircularArray.hpp>\n#include <audioapi/utils/TripleBuffer.hpp>\n\n#include <atomic>\n#include <complex>\n#include <cstddef>\n#include <cstdint>\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\nstruct AnalyserOptions;\n\nclass AnalyserNode : public AudioNode {\n public:\n  explicit AnalyserNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const AnalyserOptions &options);\n\n  /// @note JS Thread only\n  [[nodiscard]] float getMinDecibels() const {\n    return minDecibels_;\n  }\n\n  /// @note JS Thread only\n  [[nodiscard]] float getMaxDecibels() const {\n    return maxDecibels_;\n  }\n\n  /// @note JS Thread only\n  [[nodiscard]] float getSmoothingTimeConstant() const {\n    return smoothingTimeConstant_;\n  }\n\n  [[nodiscard]] int getFFTSize() const {\n    return fftSize_.load(std::memory_order_acquire);\n  }\n\n  /// @note JS Thread only\n  void setMinDecibels(float minDecibels) {\n    minDecibels_ = minDecibels;\n  }\n\n  /// @note JS Thread only\n  void setMaxDecibels(float maxDecibels) {\n    maxDecibels_ = maxDecibels;\n  }\n\n  /// @note JS Thread only\n  void setSmoothingTimeConstant(float smoothingTimeConstant) {\n    smoothingTimeConstant_ = smoothingTimeConstant;\n  }\n\n  /// @note JS Thread only\n  void setFFTSize(int fftSize);\n\n  /// @note JS Thread only\n  void getFloatFrequencyData(float *data, int length);\n\n  /// @note JS Thread only\n  void getByteFrequencyData(uint8_t *data, int length);\n\n  /// @note JS Thread only\n  void getFloatTimeDomainData(float *data, int length);\n\n  /// @note JS Thread only\n  void getByteTimeDomainData(uint8_t *data, int length);\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  std::atomic<int> fftSize_;\n\n  // Audio Thread data structures\n  std::unique_ptr<CircularDSPAudioArray> inputArray_;\n  std::unique_ptr<DSPAudioBuffer> downMixBuffer_;\n\n  // JS Thread parameters\n  float minDecibels_;\n  float maxDecibels_;\n  float smoothingTimeConstant_;\n\n  // JS Thread data structures\n  std::unique_ptr<dsp::FFT> fft_;\n  std::unique_ptr<DSPAudioArray> tempArray_;\n  std::unique_ptr<DSPAudioArray> windowData_;\n  std::vector<std::complex<float>> complexData_;\n  std::unique_ptr<DSPAudioArray> magnitudeArray_;\n\n  struct AnalysisFrame {\n    DSPAudioArray timeDomain;\n    size_t sequenceNumber = 0;\n    int fftSize = 0;\n\n    explicit AnalysisFrame(size_t size) : timeDomain(size) {}\n\n    AnalysisFrame(const AnalysisFrame &) = delete;\n    AnalysisFrame &operator=(const AnalysisFrame &) = delete;\n    AnalysisFrame(AnalysisFrame &&) noexcept = default;\n    AnalysisFrame &operator=(AnalysisFrame &&) noexcept = default;\n    ~AnalysisFrame() = default;\n  };\n\n  TripleBuffer<AnalysisFrame> analysisBuffer_{MAX_FFT_SIZE};\n  size_t publishSequence_ = 0;      // audio thread only\n  size_t lastAnalyzedSequence_ = 0; // JS thread only\n\n  void doFFTAnalysis();\n\n  void initializeWindowData(int fftSize);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/destinations/AudioDestinationNode.cpp",
    "content": "#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/destinations/AudioDestinationNode.h>\n#include <audioapi/core/utils/AudioGraphManager.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <memory>\n\nnamespace audioapi {\n\nAudioDestinationNode::AudioDestinationNode(const std::shared_ptr<BaseAudioContext> &context)\n    : AudioNode(context, AudioDestinationOptions()), currentSampleFrame_(0) {\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nstd::size_t AudioDestinationNode::getCurrentSampleFrame() const {\n  return currentSampleFrame_.load(std::memory_order_acquire);\n}\n\ndouble AudioDestinationNode::getCurrentTime() const {\n  return static_cast<double>(getCurrentSampleFrame()) / getContextSampleRate();\n}\n\nvoid AudioDestinationNode::renderAudio(\n    const std::shared_ptr<DSPAudioBuffer> &destinationBuffer,\n    int numFrames) {\n  if (numFrames < 0 || !destinationBuffer || !isInitialized_.load(std::memory_order_acquire)) {\n    return;\n  }\n\n  if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n    context->processAudioEvents();\n    context->getGraphManager()->preProcessGraph();\n  }\n\n  destinationBuffer->zero();\n\n  auto processedBuffer = processAudio(destinationBuffer, numFrames, true);\n\n  if (processedBuffer && processedBuffer != destinationBuffer) {\n    destinationBuffer->copy(*processedBuffer);\n  }\n\n  destinationBuffer->normalize();\n\n  currentSampleFrame_.fetch_add(numFrames, std::memory_order_release);\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/destinations/AudioDestinationNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <atomic>\n#include <cstddef>\n#include <memory>\n\nnamespace audioapi {\n\nclass BaseAudioContext;\n\nclass AudioDestinationNode : public AudioNode {\n public:\n  explicit AudioDestinationNode(const std::shared_ptr<BaseAudioContext> &context);\n\n  /// @note Thread safe\n  std::size_t getCurrentSampleFrame() const;\n\n  /// @note Thread safe\n  double getCurrentTime() const;\n\n  /// @note Audio Thread only\n  void renderAudio(const std::shared_ptr<DSPAudioBuffer> &audioData, int numFrames);\n\n protected:\n  // DestinationNode is triggered by AudioContext using renderAudio\n  // processNode function is not necessary and is never called.\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) final {\n    return processingBuffer;\n  };\n\n private:\n  std::atomic<std::size_t> currentSampleFrame_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/BiquadFilterNode.cpp",
    "content": "/*\n * Copyright (C) 2010 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1.  Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n * 3.  Neither the name of Apple Computer, Inc. (\"Apple\") nor the names of\n *     its contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/BiquadFilterNode.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <memory>\n\n// https://webaudio.github.io/Audio-EQ-Cookbook/audio-eq-cookbook.html - math\n// formulas for filters\n// NOLINTBEGIN(cppcoreguidelines-avoid-magic-numbers, readability-magic-numbers, readability-identifier-length)\n\nnamespace audioapi {\n\nBiquadFilterNode::BiquadFilterNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const BiquadFilterOptions &options)\n    : AudioNode(context, options),\n      frequencyParam_(\n          std::make_shared<AudioParam>(options.frequency, 0.0f, getNyquistFrequency(), context)),\n      detuneParam_(\n          std::make_shared<AudioParam>(\n              options.detune,\n              -OCTAVE_RANGE * LOG2_MOST_POSITIVE_SINGLE_FLOAT,\n              OCTAVE_RANGE * LOG2_MOST_POSITIVE_SINGLE_FLOAT,\n              context)),\n      QParam_(\n          std::make_shared<AudioParam>(\n              options.Q,\n              MOST_NEGATIVE_SINGLE_FLOAT,\n              MOST_POSITIVE_SINGLE_FLOAT,\n              context)),\n      gainParam_(\n          std::make_shared<AudioParam>(\n              options.gain,\n              MOST_NEGATIVE_SINGLE_FLOAT,\n              BIQUAD_GAIN_DB_FACTOR * LOG10_MOST_POSITIVE_SINGLE_FLOAT,\n              context)),\n      type_(options.type),\n      x1_(MAX_CHANNEL_COUNT),\n      x2_(MAX_CHANNEL_COUNT),\n      y1_(MAX_CHANNEL_COUNT),\n      y2_(MAX_CHANNEL_COUNT) {\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nvoid BiquadFilterNode::setType(BiquadFilterType type) {\n  type_ = type;\n}\n\nstd::shared_ptr<AudioParam> BiquadFilterNode::getFrequencyParam() const {\n  return frequencyParam_;\n}\n\nstd::shared_ptr<AudioParam> BiquadFilterNode::getDetuneParam() const {\n  return detuneParam_;\n}\n\nstd::shared_ptr<AudioParam> BiquadFilterNode::getQParam() const {\n  return QParam_;\n}\n\nstd::shared_ptr<AudioParam> BiquadFilterNode::getGainParam() const {\n  return gainParam_;\n}\n\n// Compute Z-transform of the filter\n// https://www.dsprelated.com/freebooks/filters/Frequency_Response_Analysis.html\n// https://www.dsprelated.com/freebooks/filters/Transfer_Function_Analysis.html\n//\n// frequency response -  H(z)\n//          b0 + b1 * z^(-1) + b2 * z^(-2)\n//  H(z) = -------------------------------\n//           1 + a1 * z^(-1) + a2 * z^(-2)\n//\n//         b0 + (b1 + b2 * z1) * z1\n//     =  --------------------------\n//         (1 + (a1 + a2 * z1) * z1\n//\n// where z1 = 1/z and z = e^(j * pi * frequency)\n// z1 = e^(-j * pi * frequency)\n//\n// phase response - angle of the frequency response\n//\n\nvoid BiquadFilterNode::getFrequencyResponse(\n    const float *frequencyArray,\n    float *magResponseOutput,\n    float *phaseResponseOutput,\n    const size_t length,\n    BiquadFilterType type) {\n  auto frequency = frequencyParam_->getValue();\n  auto Q = QParam_->getValue();\n  auto gain = gainParam_->getValue();\n  auto detune = detuneParam_->getValue();\n\n  auto coeffs = applyFilter(frequency, Q, gain, detune, type);\n\n  float nyquist = getNyquistFrequency();\n\n  for (size_t i = 0; i < length; i++) {\n    // Convert from frequency in Hz to normalized frequency [0, 1]\n    float normalizedFreq = frequencyArray[i] / nyquist;\n\n    if (normalizedFreq < 0.0f || normalizedFreq > 1.0f) {\n      // Out-of-bounds frequencies should return NaN.\n      magResponseOutput[i] = std::nanf(\"\");\n      phaseResponseOutput[i] = std::nanf(\"\");\n      continue;\n    }\n\n    double omega = -PI * normalizedFreq;\n    auto z = std::complex<double>(std::cos(omega), std::sin(omega));\n    auto response = (coeffs.b0 + (coeffs.b1 + coeffs.b2 * z) * z) /\n        (std::complex<double>(1, 0) + (coeffs.a1 + coeffs.a2 * z) * z);\n    magResponseOutput[i] = static_cast<float>(std::abs(response));\n    phaseResponseOutput[i] = static_cast<float>(atan2(imag(response), real(response)));\n  }\n}\n\nBiquadFilterNode::FilterCoefficients BiquadFilterNode::getLowpassCoefficients(\n    float frequency,\n    float Q) {\n  // Limit frequency to [0, 1] range\n  if (frequency >= 1.0f) {\n    return getNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  if (frequency <= 0.0f) {\n    return getNormalizedCoefficients(0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  float g = std::pow(10.0f, 0.05f * Q);\n\n  float theta = PI * frequency;\n  float alpha = std::sin(theta) / (2 * g);\n  float cosW = std::cos(theta);\n  float beta = (1 - cosW) / 2;\n\n  return getNormalizedCoefficients(beta, 2 * beta, beta, 1 + alpha, -2 * cosW, 1 - alpha);\n}\n\nBiquadFilterNode::FilterCoefficients BiquadFilterNode::getHighpassCoefficients(\n    float frequency,\n    float Q) {\n  if (frequency >= 1.0f) {\n    return getNormalizedCoefficients(0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n  if (frequency <= 0.0f) {\n    return getNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  float g = std::pow(10.0f, 0.05f * Q);\n\n  float theta = PI * frequency;\n  float alpha = std::sin(theta) / (2 * g);\n  float cosW = std::cos(theta);\n  float beta = (1 + cosW) / 2;\n\n  return getNormalizedCoefficients(beta, -2 * beta, beta, 1 + alpha, -2 * cosW, 1 - alpha);\n}\n\nBiquadFilterNode::FilterCoefficients BiquadFilterNode::getBandpassCoefficients(\n    float frequency,\n    float Q) {\n  // Limit frequency to [0, 1] range\n  if (frequency <= 0.0f || frequency >= 1.0f) {\n    return getNormalizedCoefficients(0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  // Limit Q to positive values\n  if (Q <= 0.0f) {\n    return getNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  float w0 = PI * frequency;\n  float alpha = std::sin(w0) / (2 * Q);\n  float cosW = std::cos(w0);\n\n  return getNormalizedCoefficients(alpha, 0.0f, -alpha, 1.0f + alpha, -2 * cosW, 1.0f - alpha);\n}\n\nBiquadFilterNode::FilterCoefficients BiquadFilterNode::getLowshelfCoefficients(\n    float frequency,\n    float gain) {\n  float A = std::pow(10.0f, gain / 40.0f);\n\n  if (frequency >= 1.0f) {\n    return getNormalizedCoefficients(A * A, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  if (frequency <= 0.0f) {\n    return getNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  float w0 = PI * frequency;\n  float alpha = 0.5f * std::sin(w0) * std::numbers::sqrt2_v<float>;\n  float cosW = std::cos(w0);\n  float gamma = 2.0f * std::sqrt(A) * alpha;\n\n  return getNormalizedCoefficients(\n      A * (A + 1 - (A - 1) * cosW + gamma),\n      2.0f * A * (A - 1 - (A + 1) * cosW),\n      A * (A + 1 - (A - 1) * cosW - gamma),\n      A + 1 + (A - 1) * cosW + gamma,\n      -2.0f * (A - 1 + (A + 1) * cosW),\n      A + 1 + (A - 1) * cosW - gamma);\n}\n\nBiquadFilterNode::FilterCoefficients BiquadFilterNode::getHighshelfCoefficients(\n    float frequency,\n    float gain) {\n  float A = std::pow(10.0f, gain / 40.0f);\n\n  if (frequency >= 1.0f) {\n    return getNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  if (frequency <= 0.0f) {\n    return getNormalizedCoefficients(A * A, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  float w0 = PI * frequency;\n  // In the original formula: sqrt((A + 1/A) * (1/S - 1) + 2), but we assume\n  // the maximum value S = 1, so it becomes 0 + 2 under the square root\n  float alpha = 0.5f * std::sin(w0) * std::numbers::sqrt2_v<float>;\n  float cosW = std::cos(w0);\n  float gamma = 2.0f * std::sqrt(A) * alpha;\n\n  return getNormalizedCoefficients(\n      A * (A + 1 + (A - 1) * cosW + gamma),\n      -2.0f * A * (A - 1 + (A + 1) * cosW),\n      A * (A + 1 + (A - 1) * cosW - gamma),\n      A + 1 - (A - 1) * cosW + gamma,\n      2.0f * (A - 1 - (A + 1) * cosW),\n      A + 1 - (A - 1) * cosW - gamma);\n}\n\nBiquadFilterNode::FilterCoefficients\nBiquadFilterNode::getPeakingCoefficients(float frequency, float Q, float gain) {\n  float A = std::pow(10.0f, gain / 40.0f);\n\n  if (frequency <= 0.0f || frequency >= 1.0f) {\n    return getNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  if (Q <= 0.0f) {\n    return getNormalizedCoefficients(A * A, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  float w0 = PI * frequency;\n  float alpha = std::sin(w0) / (2 * Q);\n  float cosW = std::cos(w0);\n\n  return getNormalizedCoefficients(\n      1 + alpha * A, -2 * cosW, 1 - alpha * A, 1 + alpha / A, -2 * cosW, 1 - alpha / A);\n}\n\nBiquadFilterNode::FilterCoefficients BiquadFilterNode::getNotchCoefficients(\n    float frequency,\n    float Q) {\n  if (frequency <= 0.0f || frequency >= 1.0f) {\n    return getNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  if (Q <= 0.0f) {\n    return getNormalizedCoefficients(0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  float w0 = PI * frequency;\n  float alpha = std::sin(w0) / (2 * Q);\n  float cosW = std::cos(w0);\n\n  return getNormalizedCoefficients(1.0f, -2 * cosW, 1.0f, 1 + alpha, -2 * cosW, 1 - alpha);\n}\n\nBiquadFilterNode::FilterCoefficients BiquadFilterNode::getAllpassCoefficients(\n    float frequency,\n    float Q) {\n  if (frequency <= 0.0f || frequency >= 1.0f) {\n    return getNormalizedCoefficients(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  if (Q <= 0.0f) {\n    return getNormalizedCoefficients(-1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);\n  }\n\n  float w0 = PI * frequency;\n  float alpha = std::sin(w0) / (2 * Q);\n  float cosW = std::cos(w0);\n\n  return getNormalizedCoefficients(\n      1 - alpha, -2 * cosW, 1 + alpha, 1 + alpha, -2 * cosW, 1 - alpha);\n}\n\nBiquadFilterNode::FilterCoefficients BiquadFilterNode::getNormalizedCoefficients(\n    float b0,\n    float b1,\n    float b2,\n    float a0,\n    float a1,\n    float a2) {\n  auto a0Inverted = 1.0f / a0;\n  return {b0 * a0Inverted, b1 * a0Inverted, b2 * a0Inverted, a1 * a0Inverted, a2 * a0Inverted};\n}\n\nBiquadFilterNode::FilterCoefficients BiquadFilterNode::applyFilter(\n    float frequency,\n    float Q,\n    float gain,\n    float detune,\n    BiquadFilterType type) {\n  // NyquistFrequency is half of the sample rate.\n  // Normalized frequency is therefore:\n  // frequency / (sampleRate / 2) = (2 * frequency) / sampleRate\n  float normalizedFrequency = frequency / getNyquistFrequency();\n\n  if (detune != 0.0f) {\n    normalizedFrequency *= std::pow(2.0f, detune / 1200.0f);\n  }\n\n  FilterCoefficients coeffs = {.b0 = 1.0, .b1 = 0.0, .b2 = 0.0, .a1 = 0.0, .a2 = 0.0};\n\n  switch (type) {\n    case BiquadFilterType::LOWPASS:\n      coeffs = getLowpassCoefficients(normalizedFrequency, Q);\n      break;\n    case BiquadFilterType::HIGHPASS:\n      coeffs = getHighpassCoefficients(normalizedFrequency, Q);\n      break;\n    case BiquadFilterType::BANDPASS:\n      coeffs = getBandpassCoefficients(normalizedFrequency, Q);\n      break;\n    case BiquadFilterType::LOWSHELF:\n      coeffs = getLowshelfCoefficients(normalizedFrequency, gain);\n      break;\n    case BiquadFilterType::HIGHSHELF:\n      coeffs = getHighshelfCoefficients(normalizedFrequency, gain);\n      break;\n    case BiquadFilterType::PEAKING:\n      coeffs = getPeakingCoefficients(normalizedFrequency, Q, gain);\n      break;\n    case BiquadFilterType::NOTCH:\n      coeffs = getNotchCoefficients(normalizedFrequency, Q);\n      break;\n    case BiquadFilterType::ALLPASS:\n      coeffs = getAllpassCoefficients(normalizedFrequency, Q);\n      break;\n    default:\n      break;\n  }\n\n  return coeffs;\n}\n\nstd::shared_ptr<DSPAudioBuffer> BiquadFilterNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n    auto currentTime = context->getCurrentTime();\n    float frequency = frequencyParam_->processKRateParam(RENDER_QUANTUM_SIZE, currentTime);\n    float detune = detuneParam_->processKRateParam(RENDER_QUANTUM_SIZE, currentTime);\n    auto Q = QParam_->processKRateParam(RENDER_QUANTUM_SIZE, currentTime);\n    auto gain = gainParam_->processKRateParam(RENDER_QUANTUM_SIZE, currentTime);\n\n    auto coeffs = applyFilter(frequency, Q, gain, detune, type_);\n\n    float x1, x2, y1, y2; // NOLINT(cppcoreguidelines-init-variables)\n\n    auto numChannels = processingBuffer->getNumberOfChannels();\n\n    for (size_t c = 0; c < numChannels; ++c) {\n      auto channel = processingBuffer->getChannel(c)->subSpan(framesToProcess);\n\n      x1 = x1_[c];\n      x2 = x2_[c];\n      y1 = y1_[c];\n      y2 = y2_[c];\n\n      for (float &sample : channel) {\n        auto input = sample;\n        auto output =\n            coeffs.b0 * input + coeffs.b1 * x1 + coeffs.b2 * x2 - coeffs.a1 * y1 - coeffs.a2 * y2;\n\n        // Avoid denormalized numbers\n        if (std::abs(output) < 1e-15f) {\n          output = 0.0f;\n        }\n\n        sample = static_cast<float>(output);\n\n        x2 = x1;\n        x1 = input;\n        y2 = y1;\n        y1 = static_cast<float>(output);\n      }\n\n      x1_[c] = x1;\n      x2_[c] = x2;\n      y1_[c] = y1;\n      y2_[c] = y2;\n    }\n  } else {\n    processingBuffer->zero();\n  }\n\n  return processingBuffer;\n}\n\n} // namespace audioapi\n\n// NOLINTEND(cppcoreguidelines-avoid-magic-numbers, readability-magic-numbers, readability-identifier-length)\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/BiquadFilterNode.h",
    "content": "/*\n * Copyright (C) 2010 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1.  Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n * 3.  Neither the name of Apple Computer, Inc. (\"Apple\") nor the names of\n *     its contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/AudioParam.h>\n#include <audioapi/core/types/BiquadFilterType.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n#if RN_AUDIO_API_TEST\n#include <gtest/gtest_prod.h>\n#endif // RN_AUDIO_API_TEST\n\n#include <memory>\n\nnamespace audioapi {\n\nstruct BiquadFilterOptions;\n\nclass BiquadFilterNode : public AudioNode {\n#if RN_AUDIO_API_TEST\n  friend class BiquadFilterTest;\n  FRIEND_TEST(BiquadFilterTest, GetFrequencyResponse);\n#endif // RN_AUDIO_API_TEST\n\n public:\n  explicit BiquadFilterNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const BiquadFilterOptions &options);\n\n  void setType(BiquadFilterType);\n  [[nodiscard]] std::shared_ptr<AudioParam> getFrequencyParam() const;\n  [[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;\n  [[nodiscard]] std::shared_ptr<AudioParam> getQParam() const;\n  [[nodiscard]] std::shared_ptr<AudioParam> getGainParam() const;\n\n  /// @note JS Thread only\n  void getFrequencyResponse(\n      const float *frequencyArray,\n      float *magResponseOutput,\n      float *phaseResponseOutput,\n      size_t length,\n      BiquadFilterType type);\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  const std::shared_ptr<AudioParam> frequencyParam_;\n  const std::shared_ptr<AudioParam> detuneParam_;\n  const std::shared_ptr<AudioParam> QParam_;\n  const std::shared_ptr<AudioParam> gainParam_;\n  BiquadFilterType type_;\n\n  // delayed samples, one per channel\n  DSPAudioArray x1_;\n  DSPAudioArray x2_;\n  DSPAudioArray y1_;\n  DSPAudioArray y2_;\n\n  struct alignas(64) FilterCoefficients {\n    double b0, b1, b2, a1, a2;\n  };\n\n  static FilterCoefficients getLowpassCoefficients(float frequency, float Q);\n  static FilterCoefficients getHighpassCoefficients(float frequency, float Q);\n  static FilterCoefficients getBandpassCoefficients(float frequency, float Q);\n  static FilterCoefficients getLowshelfCoefficients(float frequency, float gain);\n  static FilterCoefficients getHighshelfCoefficients(float frequency, float gain);\n  static FilterCoefficients getPeakingCoefficients(float frequency, float Q, float gain);\n  static FilterCoefficients getNotchCoefficients(float frequency, float Q);\n  static FilterCoefficients getAllpassCoefficients(float frequency, float Q);\n  static FilterCoefficients\n  getNormalizedCoefficients(float b0, float b1, float b2, float a0, float a1, float a2);\n  FilterCoefficients\n  applyFilter(float frequency, float Q, float gain, float detune, BiquadFilterType type);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/ConvolverNode.cpp",
    "content": "#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/ConvolverNode.h>\n#include <audioapi/core/utils/AudioGraphManager.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <algorithm>\n#include <memory>\n#include <utility>\n#include <vector>\n\nnamespace audioapi {\nConvolverNode::ConvolverNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const ConvolverOptions &options)\n    : AudioNode(context, options),\n      gainCalibrationSampleRate_(context->getSampleRate()),\n      remainingSegments_(0),\n      internalBufferIndex_(0),\n      signalledToStop_(false),\n      scaleFactor_(1.0f),\n      intermediateBuffer_(nullptr),\n      buffer_(nullptr),\n      internalBuffer_(nullptr) {\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nvoid ConvolverNode::setBuffer(\n    const std::shared_ptr<AudioBuffer> &buffer,\n    std::vector<std::unique_ptr<Convolver>> convolvers,\n    const std::shared_ptr<ThreadPool> &threadPool,\n    const std::shared_ptr<DSPAudioBuffer> &internalBuffer,\n    const std::shared_ptr<DSPAudioBuffer> &intermediateBuffer,\n    float scaleFactor) {\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr) {\n    return;\n  }\n\n  auto graphManager = context->getGraphManager();\n\n  if (buffer_) {\n    graphManager->addAudioBufferForDestruction(std::move(buffer_));\n  }\n\n  // TODO move convolvers, thread pool and DSPAudioBuffers destruction to graph manager as well\n\n  buffer_ = buffer;\n  convolvers_ = std::move(convolvers);\n  threadPool_ = threadPool;\n  internalBuffer_ = internalBuffer;\n  intermediateBuffer_ = intermediateBuffer;\n  scaleFactor_ = scaleFactor;\n  internalBufferIndex_ = 0;\n}\n\nfloat ConvolverNode::calculateNormalizationScale(const std::shared_ptr<AudioBuffer> &buffer) const {\n  auto numberOfChannels = buffer->getNumberOfChannels();\n  auto length = buffer->getSize();\n\n  float power = 0;\n\n  for (size_t channel = 0; channel < numberOfChannels; ++channel) {\n    float channelPower = 0;\n    auto channelData = buffer->getChannel(channel)->span();\n    for (size_t i = 0; i < length; ++i) {\n      float sample = channelData[i];\n      channelPower += sample * sample;\n    }\n    power += channelPower;\n  }\n\n  power = std::sqrt(power / (numberOfChannels * length));\n  power = std::max(power, MIN_IR_POWER);\n  power = 1 / power;\n  power *= std::pow(10, GAIN_CALIBRATION * 0.05f);\n  power *= gainCalibrationSampleRate_ / buffer->getSampleRate();\n\n  return power;\n}\n\nvoid ConvolverNode::onInputDisabled() {\n  numberOfEnabledInputNodes_ -= 1;\n  if (isEnabled() && numberOfEnabledInputNodes_ == 0) {\n    signalledToStop_ = true;\n    remainingSegments_ = convolvers_.at(0)->getSegCount();\n  }\n}\n\n// processing pipeline: processingBuffer -> intermediateBuffer_ -> audioBuffer_ (mixing\n// with intermediateBuffer_)\nstd::shared_ptr<DSPAudioBuffer> ConvolverNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  if (processingBuffer->getSize() != RENDER_QUANTUM_SIZE) {\n    printf(\n        \"[AUDIOAPI WARN] convolver requires 128 buffer size for each render quantum, otherwise quality of convolution is very poor\\n\");\n  }\n  if (signalledToStop_) {\n    if (remainingSegments_ > 0) {\n      remainingSegments_--;\n    } else {\n      disable();\n      signalledToStop_ = false;\n      internalBufferIndex_ = 0;\n      return processingBuffer;\n    }\n  }\n  if (internalBufferIndex_ < framesToProcess) {\n    performConvolution(processingBuffer); // result returned to intermediateBuffer_\n    audioBuffer_->sum(*intermediateBuffer_);\n\n    internalBuffer_->copy(*audioBuffer_, 0, internalBufferIndex_, RENDER_QUANTUM_SIZE);\n    internalBufferIndex_ += RENDER_QUANTUM_SIZE;\n  }\n  audioBuffer_->zero();\n  audioBuffer_->copy(*internalBuffer_, 0, 0, framesToProcess);\n  auto remainingFrames = static_cast<int>(internalBufferIndex_ - framesToProcess);\n  if (remainingFrames > 0) {\n    for (size_t ch = 0; ch < internalBuffer_->getNumberOfChannels(); ++ch) {\n      internalBuffer_->getChannel(ch)->copyWithin(framesToProcess, 0, remainingFrames);\n    }\n  }\n\n  internalBufferIndex_ -= framesToProcess;\n\n  for (int i = 0; i < audioBuffer_->getNumberOfChannels(); ++i) {\n    audioBuffer_->getChannel(i)->scale(scaleFactor_);\n  }\n\n  return audioBuffer_;\n}\n\nvoid ConvolverNode::performConvolution(const std::shared_ptr<DSPAudioBuffer> &processingBuffer) {\n  if (processingBuffer->getNumberOfChannels() == 1) {\n    for (int i = 0; i < convolvers_.size(); ++i) {\n      threadPool_->schedule([&, i] {\n        convolvers_[i]->process(\n            *processingBuffer->getChannel(0), *intermediateBuffer_->getChannel(i));\n      });\n    }\n  } else if (processingBuffer->getNumberOfChannels() == 2) {\n    std::vector<int> inputChannelMap;\n    std::vector<int> outputChannelMap;\n    if (convolvers_.size() == 2) {\n      inputChannelMap = {0, 1};\n      outputChannelMap = {0, 1};\n    } else { // 4 channel IR\n      inputChannelMap = {0, 0, 1, 1};\n      outputChannelMap = {0, 3, 2, 1};\n    }\n    for (int i = 0; i < convolvers_.size(); ++i) {\n      threadPool_->schedule([this, i, inputChannelMap, outputChannelMap, &processingBuffer] {\n        convolvers_[i]->process(\n            *processingBuffer->getChannel(inputChannelMap[i]),\n            *intermediateBuffer_->getChannel(outputChannelMap[i]));\n      });\n    }\n  }\n  threadPool_->wait();\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/ConvolverNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/AudioParam.h>\n#include <audioapi/dsp/Convolver.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <memory>\n#include <vector>\n\n#include <audioapi/utils/ThreadPool.hpp>\n\nstatic constexpr int GAIN_CALIBRATION =\n    -58; // magic number so that processed signal and dry signal have roughly the same volume\nstatic constexpr float MIN_IR_POWER = 0.000125;\n\nnamespace audioapi {\n\nstruct ConvolverOptions;\n\nclass ConvolverNode : public AudioNode {\n public:\n  explicit ConvolverNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const ConvolverOptions &options);\n\n  /// @note Audio Thread only\n  void setBuffer(\n      const std::shared_ptr<AudioBuffer> &buffer,\n      std::vector<std::unique_ptr<Convolver>> convolvers,\n      const std::shared_ptr<ThreadPool> &threadPool,\n      const std::shared_ptr<DSPAudioBuffer> &internalBuffer,\n      const std::shared_ptr<DSPAudioBuffer> &intermediateBuffer,\n      float scaleFactor);\n\n  float calculateNormalizationScale(const std::shared_ptr<AudioBuffer> &buffer) const;\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  void onInputDisabled() override;\n  const float gainCalibrationSampleRate_;\n  size_t remainingSegments_;\n  size_t internalBufferIndex_;\n  bool signalledToStop_;\n  float scaleFactor_;\n  std::shared_ptr<DSPAudioBuffer> intermediateBuffer_;\n\n  // impulse response buffer\n  std::shared_ptr<AudioBuffer> buffer_;\n  // buffer to hold internal processed data\n  std::shared_ptr<DSPAudioBuffer> internalBuffer_;\n  // vectors of convolvers, one per channel\n  std::vector<std::unique_ptr<Convolver>> convolvers_;\n  std::shared_ptr<ThreadPool> threadPool_;\n\n  void performConvolution(const std::shared_ptr<DSPAudioBuffer> &processingBuffer);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/DelayNode.cpp",
    "content": "#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/DelayNode.h>\n#include <audioapi/dsp/VectorMath.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <memory>\n\nnamespace audioapi {\n\nDelayNode::DelayNode(const std::shared_ptr<BaseAudioContext> &context, const DelayOptions &options)\n    : AudioNode(context, options),\n      delayTimeParam_(\n          std::make_shared<AudioParam>(options.delayTime, 0, options.maxDelayTime, context)),\n      delayBuffer_(\n          std::make_shared<AudioBuffer>(\n              static_cast<size_t>(\n                  options.maxDelayTime * context->getSampleRate() +\n                  1), // +1 to enable delayTime equal to maxDelayTime\n              channelCount_,\n              context->getSampleRate())) {\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nstd::shared_ptr<AudioParam> DelayNode::getDelayTimeParam() const {\n  return delayTimeParam_;\n}\n\nvoid DelayNode::onInputDisabled() {\n  numberOfEnabledInputNodes_ -= 1;\n  if (isEnabled() && numberOfEnabledInputNodes_ == 0) {\n    signalledToStop_ = true;\n    remainingFrames_ = static_cast<int>(delayTimeParam_->getValue() * getContextSampleRate());\n  }\n}\n\nvoid DelayNode::delayBufferOperation(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess,\n    size_t &operationStartingIndex,\n    DelayNode::BufferAction action) {\n  size_t processingBufferStartIndex = 0;\n\n  // handle buffer wrap around\n  if (operationStartingIndex + framesToProcess > delayBuffer_->getSize()) {\n    auto framesToEnd = static_cast<int>(delayBuffer_->getSize() - operationStartingIndex);\n\n    if (action == BufferAction::WRITE) {\n      delayBuffer_->sum(\n          *processingBuffer, processingBufferStartIndex, operationStartingIndex, framesToEnd);\n    } else { // READ\n      processingBuffer->sum(\n          *delayBuffer_, operationStartingIndex, processingBufferStartIndex, framesToEnd);\n      delayBuffer_->zero(operationStartingIndex, framesToEnd);\n    }\n\n    operationStartingIndex = 0;\n    processingBufferStartIndex += framesToEnd;\n    framesToProcess -= framesToEnd;\n  }\n\n  if (action == BufferAction::WRITE) {\n    delayBuffer_->sum(\n        *processingBuffer, processingBufferStartIndex, operationStartingIndex, framesToProcess);\n    processingBuffer->zero();\n  } else { // READ\n    processingBuffer->sum(\n        *delayBuffer_, operationStartingIndex, processingBufferStartIndex, framesToProcess);\n    delayBuffer_->zero(operationStartingIndex, framesToProcess);\n  }\n\n  operationStartingIndex += framesToProcess;\n}\n\n// delay buffer always has channelCount_ channels\n// processing is split into two parts\n// 1. writing to delay buffer (mixing if needed) from processing buffer\n// 2. reading from delay buffer to processing buffer (mixing if needed) with delay\nstd::shared_ptr<DSPAudioBuffer> DelayNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  // handling tail processing\n  if (signalledToStop_) {\n    if (remainingFrames_ <= 0) {\n      disable();\n      signalledToStop_ = false;\n      return processingBuffer;\n    }\n\n    delayBufferOperation(\n        processingBuffer, framesToProcess, readIndex_, DelayNode::BufferAction::READ);\n    remainingFrames_ -= framesToProcess;\n    return processingBuffer;\n  }\n\n  // normal processing\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  auto delayTime = delayTimeParam_->processKRateParam(framesToProcess, context->getCurrentTime());\n  size_t writeIndex =\n      static_cast<size_t>(static_cast<float>(readIndex_) + delayTime * context->getSampleRate()) %\n      delayBuffer_->getSize();\n  delayBufferOperation(\n      processingBuffer, framesToProcess, writeIndex, DelayNode::BufferAction::WRITE);\n  delayBufferOperation(\n      processingBuffer, framesToProcess, readIndex_, DelayNode::BufferAction::READ);\n\n  return processingBuffer;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/DelayNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/AudioParam.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <memory>\n\nnamespace audioapi {\n\nstruct DelayOptions;\n\nclass DelayNode : public AudioNode {\n public:\n  explicit DelayNode(const std::shared_ptr<BaseAudioContext> &context, const DelayOptions &options);\n\n  [[nodiscard]] std::shared_ptr<AudioParam> getDelayTimeParam() const;\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  void onInputDisabled() override;\n  enum class BufferAction : uint8_t { READ, WRITE };\n  void delayBufferOperation(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess,\n      size_t &operationStartingIndex,\n      BufferAction action);\n  const std::shared_ptr<AudioParam> delayTimeParam_;\n  std::shared_ptr<AudioBuffer> delayBuffer_;\n  size_t readIndex_ = 0;\n  bool signalledToStop_ = false;\n  int remainingFrames_ = 0;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/GainNode.cpp",
    "content": "#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/GainNode.h>\n#include <audioapi/dsp/VectorMath.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <memory>\n\nnamespace audioapi {\n\nGainNode::GainNode(const std::shared_ptr<BaseAudioContext> &context, const GainOptions &options)\n    : AudioNode(context, options),\n      gainParam_(\n          std::make_shared<AudioParam>(\n              options.gain,\n              MOST_NEGATIVE_SINGLE_FLOAT,\n              MOST_POSITIVE_SINGLE_FLOAT,\n              context)) {\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nstd::shared_ptr<AudioParam> GainNode::getGainParam() const {\n  return gainParam_;\n}\n\nstd::shared_ptr<DSPAudioBuffer> GainNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr) {\n    return processingBuffer;\n  }\n  double time = context->getCurrentTime();\n  auto gainParamValues = gainParam_->processARateParam(framesToProcess, time);\n  auto *gainValues = gainParamValues->getChannel(0);\n\n  for (size_t i = 0; i < processingBuffer->getNumberOfChannels(); i++) {\n    auto *channel = processingBuffer->getChannel(i);\n    channel->multiply(*gainValues, framesToProcess);\n  }\n\n  return processingBuffer;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/GainNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/AudioParam.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <memory>\n\nnamespace audioapi {\n\nstruct GainOptions;\n\nclass GainNode : public AudioNode {\n public:\n  explicit GainNode(const std::shared_ptr<BaseAudioContext> &context, const GainOptions &options);\n\n  [[nodiscard]] std::shared_ptr<AudioParam> getGainParam() const;\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  const std::shared_ptr<AudioParam> gainParam_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/IIRFilterNode.cpp",
    "content": "/*\n * Copyright 2016 The Chromium Authors. All rights reserved.\n * Copyright (C) 2020 Apple Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1.  Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/IIRFilterNode.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <algorithm>\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\nIIRFilterNode::IIRFilterNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const IIRFilterOptions &options)\n    : AudioNode(context, options),\n      feedforward_(createNormalizedArray(options.feedforward, options.feedback[0])),\n      feedback_(createNormalizedArray(options.feedback, options.feedback[0])),\n      xBuffers_(BUFFER_LENGTH, MAX_CHANNEL_COUNT, context->getSampleRate()),\n      yBuffers_(BUFFER_LENGTH, MAX_CHANNEL_COUNT, context->getSampleRate()) {\n  isInitialized_.store(true, std::memory_order_release);\n}\n\n// Compute Z-transform of the filter\n//\n// frequency response -  H(z)\n//          sum(b[k]*z^(-k), k, 0, M)\n//  H(z) = -------------------------------\n//           sum(a[k]*z^(-k), k, 0, N)\n//\n//          sum(b[k]*z1^k, k, 0, M)\n//       = -------------------------------\n//           sum(a[k]*z1^k, k, 0, N)\n//\n// where z1 = 1/z and z = e^(j * pi * frequency)\n// z1 = e^(-j * pi * frequency)\n//\n// phase response - angle of the frequency response\n//\n\nvoid IIRFilterNode::getFrequencyResponse(\n    const float *frequencyArray,\n    float *magResponseOutput,\n    float *phaseResponseOutput,\n    size_t length) const {\n  float nyquist = getNyquistFrequency();\n\n  for (size_t k = 0; k < length; ++k) {\n    float normalizedFreq = frequencyArray[k] / nyquist;\n\n    if (normalizedFreq < 0.0f || normalizedFreq > 1.0f) {\n      // Out-of-bounds frequencies should return NaN.\n      magResponseOutput[k] = std::nanf(\"\");\n      phaseResponseOutput[k] = std::nanf(\"\");\n      continue;\n    }\n\n    float omega = -PI * normalizedFreq;\n    auto z = std::complex<float>(std::cos(omega), std::sin(omega));\n\n    auto numerator = IIRFilterNode::evaluatePolynomial(\n        feedforward_, z, static_cast<int>(feedforward_.getSize() - 1));\n    auto denominator =\n        IIRFilterNode::evaluatePolynomial(feedback_, z, static_cast<int>(feedback_.getSize() - 1));\n    auto response = numerator / denominator;\n\n    magResponseOutput[k] = std::abs(response);\n    phaseResponseOutput[k] = atan2(imag(response), real(response));\n  }\n}\n\n// y[n] = sum(b[k] * x[n - k], k = 0, M) - sum(a[k] * y[n - k], k = 1, N)\n// where b[k] are the feedforward coefficients and a[k] are the feedback coefficients of the filter\n\n// TODO: tail\n\nstd::shared_ptr<DSPAudioBuffer> IIRFilterNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  auto numChannels = static_cast<int>(processingBuffer->getNumberOfChannels());\n\n  size_t feedforwardLength = feedforward_.getSize();\n  size_t feedbackLength = feedback_.getSize();\n  auto minLength = static_cast<size_t>(std::min(feedbackLength, feedforwardLength));\n\n  constexpr int mask = BUFFER_LENGTH - 1;\n\n  for (int c = 0; c < numChannels; ++c) {\n    auto channel = processingBuffer->getChannel(c)->subSpan(framesToProcess);\n\n    auto &x = xBuffers_[c];\n    auto &y = yBuffers_[c];\n    size_t bufferIndex = bufferIndices_[c];\n    size_t k;\n\n    for (float &sample : channel) {\n      const float x_n = sample;\n      float y_n = feedforward_[0] * sample;\n\n      for (k = 1; k < minLength; ++k) {\n        size_t m = (bufferIndex - k) & mask;\n        y_n = std::fma(feedforward_[k], x[m], y_n);\n        y_n = std::fma(-feedback_[k], y[m], y_n);\n      }\n\n      for (k = minLength; k < feedforwardLength; ++k) {\n        y_n = std::fma(feedforward_[k], x[(bufferIndex - k) & mask], y_n);\n      }\n      for (k = minLength; k < feedbackLength; ++k) {\n        y_n = std::fma(-feedback_[k], y[(bufferIndex - k) & (BUFFER_LENGTH - 1)], y_n);\n      }\n\n      // Avoid denormalized numbers\n      // NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers, readability-magic-numbers)\n      if (std::abs(y_n) < 1e-15f) {\n        y_n = 0.0f;\n      }\n\n      sample = y_n;\n\n      x[bufferIndex] = x_n;\n      y[bufferIndex] = y_n;\n\n      bufferIndex = (bufferIndex + 1) & (BUFFER_LENGTH - 1);\n    }\n    bufferIndices_[c] = bufferIndex;\n  }\n  return processingBuffer;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/IIRFilterNode.h",
    "content": "/*\n * Copyright 2016 The Chromium Authors. All rights reserved.\n * Copyright (C) 2020 Apple Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1.  Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\n * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <array>\n#include <complex>\n#include <cstddef>\n#include <vector>\n\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <memory>\n\nnamespace audioapi {\n\nstruct IIRFilterOptions;\n\nclass IIRFilterNode : public AudioNode {\n\n public:\n  explicit IIRFilterNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const IIRFilterOptions &options);\n\n  /// @note Audio Thread only\n  void getFrequencyResponse(\n      const float *frequencyArray,\n      float *magResponseOutput,\n      float *phaseResponseOutput,\n      size_t length) const;\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  static constexpr size_t BUFFER_LENGTH = 32;\n\n  const AudioArray feedforward_;\n  const AudioArray feedback_;\n\n  AudioBuffer xBuffers_;\n  AudioBuffer yBuffers_;\n  std::array<size_t, BUFFER_LENGTH> bufferIndices_{};\n\n  static std::complex<float>\n  evaluatePolynomial(const AudioArray &coefficients, std::complex<float> z, int order) {\n    // Use Horner's method to evaluate the polynomial P(z) = sum(coef[k]*z^k, k, 0, order);\n    std::complex<float> result = 0;\n    for (int k = order; k >= 0; --k) {\n      result = result * z + std::complex<float>(coefficients[k]);\n    }\n    return result;\n  }\n\n  static AudioArray createNormalizedArray(\n      const std::vector<float> &inputVector,\n      float scaleFactor) {\n    AudioArray result(inputVector.data(), inputVector.size());\n    if (scaleFactor != 1.0f && scaleFactor != 0.0f && result.getSize() > 0) {\n      result.scale(1.0f / scaleFactor);\n    }\n\n    return result;\n  }\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/PeriodicWave.cpp",
    "content": "/*\n * Copyright (C) 2012 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1.  Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n * 3.  Neither the name of Apple Inc. (\"Apple\") nor the names of\n *     its contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include <audioapi/core/effects/PeriodicWave.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/dsp/VectorMath.h>\n#include <algorithm>\n#include <memory>\n#include <vector>\n\n// NOLINTBEGIN(readability-magic-numbers, cppcoreguidelines-avoid-magic-numbers)\n\nconstexpr unsigned NumberOfOctaveBands = 3;\nconstexpr float CentsPerRange = static_cast<float>(audioapi::OCTAVE_RANGE) / NumberOfOctaveBands;\nconstexpr float interpolate2Point = 0.3;\nconstexpr float interpolate3Point = 0.16;\n\nnamespace audioapi {\nPeriodicWave::PeriodicWave(float sampleRate, bool disableNormalization)\n    : sampleRate_(sampleRate),\n      numberOfRanges_(\n          static_cast<int>(\n              round(NumberOfOctaveBands * log2f(static_cast<float>(getPeriodicWaveSize()))))),\n      lowestFundamentalFrequency_(\n          static_cast<float>(sampleRate_ / 2) / static_cast<float>(getMaxNumberOfPartials())),\n      scale_(static_cast<float>(getPeriodicWaveSize()) / sampleRate_),\n      disableNormalization_(disableNormalization) {\n  bandLimitedTables_ =\n      std::make_unique<DSPAudioBuffer>(getPeriodicWaveSize(), numberOfRanges_, sampleRate_);\n\n  fft_ = std::make_unique<dsp::FFT>(getPeriodicWaveSize());\n}\n\nPeriodicWave::PeriodicWave(\n    float sampleRate,\n    audioapi::OscillatorType type,\n    bool disableNormalization)\n    : PeriodicWave(sampleRate, disableNormalization) {\n  this->generateBasicWaveForm(type);\n}\n\nPeriodicWave::PeriodicWave(\n    float sampleRate,\n    const std::vector<std::complex<float>> &complexData,\n    int length,\n    bool disableNormalization)\n    : PeriodicWave(sampleRate, disableNormalization) {\n  createBandLimitedTables(complexData, length);\n}\n\nint PeriodicWave::getPeriodicWaveSize() const {\n  if (sampleRate_ <= 24000) {\n    return 2048;\n  }\n\n  if (sampleRate_ <= 88200) {\n    return 4096;\n  }\n\n  return 16384;\n}\n\nfloat PeriodicWave::getScale() const {\n  return scale_;\n}\n\nfloat PeriodicWave::getSample(float fundamentalFrequency, float phase, float phaseIncrement) {\n  WaveTableSource source = getWaveDataForFundamentalFrequency(fundamentalFrequency);\n\n  return doInterpolation(\n      phase, phaseIncrement, source.interpolationFactor, *source.lower, *source.higher);\n}\n\nint PeriodicWave::getMaxNumberOfPartials() const {\n  return getPeriodicWaveSize() / 2;\n}\n\nint PeriodicWave::getNumberOfPartialsPerRange(int rangeIndex) const {\n  // Number of cents below nyquist where we cull partials.\n  auto centsToCull = static_cast<float>(rangeIndex) * CentsPerRange;\n\n  // A value from 0 -> 1 representing what fraction of the partials to keep.\n  auto cullingScale = std::pow(2, -centsToCull / OCTAVE_RANGE);\n\n  // The very top range will have all the partials culled.\n  int numberOfPartials =\n      static_cast<int>(static_cast<float>(getMaxNumberOfPartials()) * cullingScale);\n\n  return numberOfPartials;\n}\n\nvoid PeriodicWave::generateBasicWaveForm(OscillatorType type) {\n  auto fftSize = getPeriodicWaveSize();\n  /*\n   * For real-valued time-domain signals, the FFT outputs a Hermitian symmetric\n   * sequence (where the positive frequencies are the complex conjugate of the\n   * negative ones). This symmetry implies that real signals have mirrored\n   * frequency components. In such scenarios, all 'real' frequency information\n   * is contained in the first half of the transform, and altering parts such as\n   * real and imaginary can finely shape which harmonic content is retained or\n   * discarded.\n   */\n\n  auto halfSize = fftSize / 2;\n  auto complexData = std::vector<std::complex<float>>(halfSize);\n\n  for (int i = 1; i < halfSize; i++) {\n    // All waveforms are odd functions with a positive slope at time 0.\n    // Hence the coefficients for cos() are always 0.\n\n    // Formulas for Fourier coefficients:\n    // https://mathworld.wolfram.com/FourierSeries.html\n\n    // Coefficient for sin()\n    float coeff{};\n\n    auto piFactor = 1.0f / (PI * static_cast<float>(i));\n\n    switch (type) {\n      case OscillatorType::SINE:\n        coeff = (i == 1) ? 1.0f : 0.0f;\n        break;\n      case OscillatorType::SQUARE:\n        // https://mathworld.wolfram.com/FourierSeriesSquareWave.html\n        coeff = ((i & 1) == 1) ? 4 * piFactor : 0.0f;\n        break;\n      case OscillatorType::SAWTOOTH:\n        // https://mathworld.wolfram.com/FourierSeriesSawtoothWave.html - our\n        // Function differs from this one, but coefficients calculation looks\n        // similar. our function - f(x) = 2(x / (2 * pi) - floor(x / (2 * pi) +\n        // 0.5)));\n        // https://www.wolframalpha.com/input?i=2%28x+%2F+%282+*+pi%29+-+floor%28x+%2F+%282+*+pi%29+%2B+0.5%29%29%29%3B\n        coeff = 2 * piFactor * ((i & 1) == 1 ? 1.0f : -1.0f);\n        break;\n      case OscillatorType::TRIANGLE:\n        // https://mathworld.wolfram.com/FourierSeriesTriangleWave.html\n        if ((i & 1) == 1) {\n          coeff = 8.0f * piFactor * piFactor * ((i & 3) == 1 ? 1.0f : -1.0f);\n        } else {\n          coeff = 0.0f;\n        }\n        break;\n      case OscillatorType::CUSTOM:\n        throw std::invalid_argument(\"Custom waveforms are not supported.\");\n    }\n\n    complexData[i] = std::complex<float>(0.0f, coeff);\n  }\n\n  createBandLimitedTables(complexData, halfSize);\n}\n\nvoid PeriodicWave::createBandLimitedTables(\n    const std::vector<std::complex<float>> &complexData,\n    int size) {\n  float normalizationFactor = 0.5f;\n\n  auto fftSize = getPeriodicWaveSize();\n  auto halfSize = fftSize / 2;\n\n  size = std::min(size, halfSize);\n\n  for (int rangeIndex = 0; rangeIndex < numberOfRanges_; rangeIndex++) {\n    auto complexFFTData = std::vector<std::complex<float>>(halfSize);\n\n    // Find the starting partial where we should start culling.\n    // We need to clear out the highest frequencies to band-limit the waveform.\n    auto numberOfPartials = getNumberOfPartialsPerRange(rangeIndex);\n\n    // Clamp the size to the number of partials.\n    auto clampedSize = std::min(size, numberOfPartials);\n\n    // copy real and imaginary data to the FFT frame, scale it and set the\n    // higher frequencies to zero.\n    for (int i = 0; i < size; i++) {\n      if (i >= clampedSize && i < halfSize) {\n        complexFFTData[i] = std::complex<float>(0.0f, 0.0f);\n      } else {\n        complexFFTData[i] = {\n            complexData[i].real() * static_cast<float>(fftSize),\n            complexData[i].imag() * -static_cast<float>(fftSize)};\n      }\n    }\n\n    // Zero out the DC and nquist components.\n    complexFFTData[0] = {0.0f, 0.0f};\n\n    auto *channel = bandLimitedTables_->getChannel(rangeIndex);\n\n    // Perform the inverse FFT to get the time domain representation of the\n    // band-limited waveform.\n    fft_->doInverseFFT(complexFFTData, *channel);\n\n    if (!disableNormalization_ && rangeIndex == 0) {\n      float maxValue = channel->getMaxAbsValue();\n      if (maxValue != 0) {\n        normalizationFactor = 1.0f / maxValue;\n      }\n    }\n\n    channel->scale(normalizationFactor);\n  }\n}\n\nWaveTableSource PeriodicWave::getWaveDataForFundamentalFrequency(float fundamentalFrequency) const {\n  // negative frequencies are allowed and will be treated as positive.\n  fundamentalFrequency = std::fabs(fundamentalFrequency);\n\n  // calculating lower and higher range index for the given fundamental\n  // frequency.\n  float ratio =\n      fundamentalFrequency > 0 ? fundamentalFrequency / lowestFundamentalFrequency_ : 0.5f;\n  float centsAboveLowestFrequency = log2f(ratio) * 1200;\n\n  float pitchRange = 1 + centsAboveLowestFrequency / CentsPerRange;\n\n  pitchRange = std::clamp(pitchRange, 0.0f, static_cast<float>(numberOfRanges_ - 1));\n\n  int lowerRangeIndex = static_cast<int>(pitchRange);\n  int higherRangeIndex =\n      lowerRangeIndex < numberOfRanges_ - 1 ? lowerRangeIndex + 1 : lowerRangeIndex;\n\n  // get the wave data for the lower and higher range index.\n  // calculate the interpolation factor between the lower and higher range data.\n  return {\n      .lower = bandLimitedTables_->getChannel(lowerRangeIndex),\n      .higher = bandLimitedTables_->getChannel(higherRangeIndex),\n      .interpolationFactor = pitchRange - static_cast<float>(lowerRangeIndex),\n  };\n}\n\nfloat PeriodicWave::doInterpolation(\n    float phase,\n    float phaseIncrement,\n    float waveTableInterpolationFactor,\n    const DSPAudioArray &lowerWaveData,\n    const DSPAudioArray &higherWaveData) const {\n  float lowerWaveDataSample = 0;\n  float higherWaveDataSample = 0;\n\n  // We use linear, 3-point Lagrange, or 5-point Lagrange interpolation based on\n  // the value of phase increment. https://dlmf.nist.gov/3.3#ii\n\n  int index = static_cast<int>(phase);\n  auto factor = phase - static_cast<float>(index);\n\n  if (phaseIncrement >= interpolate2Point) { // linear interpolation\n    auto indices = std::array<int, 2>{};\n    indices[0] = (index + 0) & (getPeriodicWaveSize() - 1);\n    indices[1] = (index + 1) & (getPeriodicWaveSize() - 1);\n\n    auto lowerWaveDataSample1 = lowerWaveData[indices[0]];\n    auto lowerWaveDataSample2 = lowerWaveData[indices[1]];\n    auto higherWaveDataSample1 = higherWaveData[indices[0]];\n    auto higherWaveDataSample2 = higherWaveData[indices[1]];\n\n    lowerWaveDataSample = (1 - factor) * lowerWaveDataSample1 + factor * lowerWaveDataSample2;\n    higherWaveDataSample = (1 - factor) * higherWaveDataSample1 + factor * higherWaveDataSample2;\n  } else if (phaseIncrement >= interpolate3Point) { // 3-point Lagrange\n                                                    // interpolation\n    auto indices = std::array<int, 3>{};\n\n    for (int i = 0; i < 3; i++) {\n      indices[i] = (index + i - 1) & (getPeriodicWaveSize() - 1);\n    }\n\n    auto A = std::array<float, 3>{};\n\n    A[0] = factor * (factor - 1) / 2;\n    A[1] = 1 - factor * factor;\n    A[2] = factor * (factor + 1) / 2;\n\n    for (int i = 0; i < 3; i++) {\n      lowerWaveDataSample += lowerWaveData[indices[i]] * A[i];\n      higherWaveDataSample += higherWaveData[indices[i]] * A[i];\n    }\n  } else { // 5-point Lagrange interpolation\n    auto indices = std::array<int, 5>{};\n\n    for (int i = 0; i < 5; i++) {\n      indices[i] = (index + i - 2) & (getPeriodicWaveSize() - 1);\n    }\n\n    auto A = std::array<float, 5>{};\n\n    A[0] = factor * (factor * factor - 1) * (factor - 2) / 24;\n    A[1] = -factor * (factor - 1) * (factor * factor - 4) / 6;\n    A[2] = (factor * factor - 1) * (factor * factor - 4) / 4;\n    A[3] = -factor * (factor + 1) * (factor * factor - 4) / 6;\n    A[4] = factor * (factor * factor - 1) * (factor + 2) / 24;\n\n    for (int i = 0; i < 5; i++) {\n      lowerWaveDataSample += lowerWaveData[indices[i]] * A[i];\n      higherWaveDataSample += higherWaveData[indices[i]] * A[i];\n    }\n  }\n\n  return std::lerp(higherWaveDataSample, lowerWaveDataSample, waveTableInterpolationFactor);\n}\n} // namespace audioapi\n\n// NOLINTEND(readability-magic-numbers, cppcoreguidelines-avoid-magic-numbers)\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/PeriodicWave.h",
    "content": "/*\n * Copyright (C) 2012 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1.  Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n * 3.  Neither the name of Apple Inc. (\"Apple\") nor the names of\n *     its contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#pragma once\n\n#include <audioapi/core/types/OscillatorType.h>\n#include <audioapi/dsp/FFT.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <complex>\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\nstruct WaveTableSource {\n  const DSPAudioArray *lower;\n  const DSPAudioArray *higher;\n  float interpolationFactor;\n};\n\nclass PeriodicWave {\n public:\n  explicit PeriodicWave(float sampleRate, OscillatorType type, bool disableNormalization);\n  explicit PeriodicWave(\n      float sampleRate,\n      const std::vector<std::complex<float>>\n          &complexData, // NOLINT(readability-avoid-const-params-in-decls)\n      int length,\n      bool disableNormalization);\n\n  [[nodiscard]] int getPeriodicWaveSize() const;\n  [[nodiscard]] float getScale() const;\n\n  float getSample(float fundamentalFrequency, float phase, float phaseIncrement);\n\n private:\n  explicit PeriodicWave(float sampleRate, bool disableNormalization);\n\n  // Partial is any frequency component of a sound.\n  // Both harmonics(fundamentalFrequency * k)  and overtones are partials.\n  [[nodiscard]] int getMaxNumberOfPartials() const;\n\n  // Returns the number of partials to keep for a given range.\n  // Controlling the number of partials in each range allows for a more\n  // efficient representation of the waveform and prevents aliasing.\n  [[nodiscard]] int getNumberOfPartialsPerRange(int rangeIndex) const;\n\n  // This function generates real and imaginary parts of the waveTable,\n  // real and imaginary arrays represent the coefficients of the harmonic\n  // components in the frequency domain, specifically as part of a complex\n  // representation used by Fourier Transform methods to describe signals.\n  void generateBasicWaveForm(OscillatorType type);\n\n  // This function creates band-limited tables for the given real and\n  // imaginary data. The tables are created for each range of the partials.\n  // The higher frequencies are culled to band-limit the waveform.\n  // For each range, the inverse FFT is performed to get the time domain\n  // representation of the band-limited waveform.\n  void createBandLimitedTables(\n      const std::vector<std::complex<float>> &complexData,\n      int size); // NOLINT(readability-avoid-const-params-in-decls)\n\n  // This function returns the interpolation factor between the lower and higher\n  // range data and sets the lower and higher wave data for the given\n  // fundamental frequency.\n  [[nodiscard]] WaveTableSource getWaveDataForFundamentalFrequency(\n      float fundamentalFrequency) const;\n\n  // This function performs interpolation between the lower and higher range\n  // data based on the interpolation factor and current buffer index. Type of\n  // interpolation is determined by the phase increment. Returns the\n  // interpolated sample.\n  [[nodiscard]] float doInterpolation(\n      float phase,\n      float phaseIncrement,\n      float waveTableInterpolationFactor,\n      const DSPAudioArray &lowerWaveData,\n      const DSPAudioArray &higherWaveData) const;\n\n  // determines the time resolution of the waveform.\n  float sampleRate_;\n  // determines number of frequency segments (or bands) the signal is divided.\n  int numberOfRanges_;\n  // the lowest frequency (in hertz) where playback will include all of the\n  // partials.\n  float lowestFundamentalFrequency_;\n  // scaling factor used to adjust size of period of waveform to the sample\n  // rate.\n  float scale_;\n  // array of band-limited waveforms.\n  std::unique_ptr<DSPAudioBuffer> bandLimitedTables_;\n  std::unique_ptr<dsp::FFT> fft_;\n  // if true, the waveTable is not normalized.\n  bool disableNormalization_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/StereoPannerNode.cpp",
    "content": "#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/StereoPannerNode.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <memory>\n\n// https://webaudio.github.io/web-audio-api/#stereopanner-algorithm\n\nnamespace audioapi {\n\nStereoPannerNode::StereoPannerNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const StereoPannerOptions &options)\n    : AudioNode(context, options),\n      panParam_(std::make_shared<AudioParam>(options.pan, -1.0f, 1.0f, context)) {\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nstd::shared_ptr<AudioParam> StereoPannerNode::getPanParam() const {\n  return panParam_;\n}\n\nstd::shared_ptr<DSPAudioBuffer> StereoPannerNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr) {\n    return processingBuffer;\n  }\n  double time = context->getCurrentTime();\n  double deltaTime = 1.0 / context->getSampleRate();\n\n  auto panParamValues = panParam_->processARateParam(framesToProcess, time)->getChannel(0)->span();\n\n  auto outputLeft = audioBuffer_->getChannelByType(AudioBuffer::ChannelLeft)->span();\n  auto outputRight = audioBuffer_->getChannelByType(AudioBuffer::ChannelRight)->span();\n\n  // Input is mono\n  if (processingBuffer->getNumberOfChannels() == 1) {\n    auto inputLeft = processingBuffer->getChannelByType(AudioBuffer::ChannelMono)->span();\n\n    for (int i = 0; i < framesToProcess; i++) {\n      const auto pan = std::clamp(panParamValues[i], -1.0f, 1.0f);\n      const auto x = (pan + 1) / 2;\n      const auto angle = x * (PI / 2);\n      const float input = inputLeft[i];\n\n      outputLeft[i] = input * std::cos(angle);\n      outputRight[i] = input * std::sin(angle);\n      time += deltaTime;\n    }\n  } else { // Input is stereo\n    auto inputLeft = processingBuffer->getChannelByType(AudioBuffer::ChannelLeft)->span();\n    auto inputRight = processingBuffer->getChannelByType(AudioBuffer::ChannelRight)->span();\n\n    for (int i = 0; i < framesToProcess; i++) {\n      const auto pan = std::clamp(panParamValues[i], -1.0f, 1.0f);\n      const auto x = (pan <= 0 ? pan + 1 : pan);\n      const auto gainL = cos(x * PI / 2);\n      const auto gainR = sin(x * PI / 2);\n      const float inputL = inputLeft[i];\n      const float inputR = inputRight[i];\n\n      if (pan <= 0) {\n        outputLeft[i] = inputL + inputR * gainL;\n        outputRight[i] = inputR * gainR;\n      } else {\n        outputLeft[i] = inputL * gainL;\n        outputRight[i] = inputR + inputL * gainR;\n      }\n\n      time += deltaTime;\n    }\n  }\n\n  return audioBuffer_;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/StereoPannerNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/AudioParam.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <cassert>\n#include <memory>\n\nnamespace audioapi {\n\nstruct StereoPannerOptions;\n\nclass StereoPannerNode : public AudioNode {\n public:\n  explicit StereoPannerNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const StereoPannerOptions &options);\n\n  [[nodiscard]] std::shared_ptr<AudioParam> getPanParam() const;\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  const std::shared_ptr<AudioParam> panParam_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/WaveShaperNode.cpp",
    "content": "#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/effects/WaveShaperNode.h>\n#include <audioapi/dsp/VectorMath.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <memory>\n\nnamespace audioapi {\n\nWaveShaperNode::WaveShaperNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const WaveShaperOptions &options)\n    : AudioNode(context, options), oversample_(options.oversample) {\n\n  waveShapers_.reserve(6);\n  for (int i = 0; i < channelCount_; i++) {\n    waveShapers_.emplace_back(std::make_unique<WaveShaper>(nullptr, context->getSampleRate()));\n  }\n  setCurve(options.curve);\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nvoid WaveShaperNode::setOversample(OverSampleType type) {\n  oversample_ = type;\n\n  for (int i = 0; i < waveShapers_.size(); i++) {\n    waveShapers_[i]->setOversample(type);\n  }\n}\n\nvoid WaveShaperNode::setCurve(const std::shared_ptr<AudioArray> &curve) {\n  curve_ = curve;\n\n  for (int i = 0; i < waveShapers_.size(); i++) {\n    waveShapers_[i]->setCurve(curve);\n  }\n}\n\nstd::shared_ptr<DSPAudioBuffer> WaveShaperNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  if (curve_ == nullptr) {\n    return processingBuffer;\n  }\n\n  for (size_t channel = 0; channel < processingBuffer->getNumberOfChannels(); channel++) {\n    auto *channelData = processingBuffer->getChannel(channel);\n\n    waveShapers_[channel]->process(*channelData, framesToProcess);\n  }\n\n  return processingBuffer;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/WaveShaperNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/types/OverSampleType.h>\n#include <audioapi/dsp/WaveShaper.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\nstruct WaveShaperOptions;\n\nclass WaveShaperNode : public AudioNode {\n public:\n  explicit WaveShaperNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const WaveShaperOptions &options);\n\n  /// @note Audio Thread only\n  void setOversample(OverSampleType);\n\n  /// @note Audio Thread only\n  void setCurve(const std::shared_ptr<AudioArray> &curve);\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  OverSampleType oversample_;\n  std::shared_ptr<AudioArray> curve_;\n\n  std::vector<std::unique_ptr<WaveShaper>> waveShapers_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/WorkletNode.cpp",
    "content": "#include <audioapi/core/effects/WorkletNode.h>\n#include <algorithm>\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nWorkletNode::WorkletNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    size_t bufferLength,\n    size_t inputChannelCount,\n    WorkletsRunner &&workletRunner)\n    : AudioNode(context),\n      workletRunner_(std::move(workletRunner)),\n      buffer_(\n          std::make_shared<AudioBuffer>(bufferLength, inputChannelCount, context->getSampleRate())),\n      bufferLength_(bufferLength),\n      inputChannelCount_(inputChannelCount),\n      curBuffIndex_(0) {\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nstd::shared_ptr<DSPAudioBuffer> WorkletNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  int processed = 0;\n  size_t channelCount_ = std::min(inputChannelCount_, processingBuffer->getNumberOfChannels());\n  while (processed < framesToProcess) {\n    size_t framesToWorkletInvoke = bufferLength_ - curBuffIndex_;\n    size_t needsToProcess = framesToProcess - processed;\n    size_t shouldProcess = std::min(framesToWorkletInvoke, needsToProcess);\n\n    /// here we copy\n    /// to [curBuffIndex_, curBuffIndex_ + shouldProcess]\n    /// from [processed, processed + shouldProcess]\n    buffer_->copy(*processingBuffer, processed, curBuffIndex_, shouldProcess);\n\n    processed += static_cast<int>(shouldProcess);\n    curBuffIndex_ += shouldProcess;\n\n    /// If we filled the entire buffer, we need to execute the worklet\n    if (curBuffIndex_ != bufferLength_) {\n      continue;\n    }\n    // Reset buffer index, channel buffers and execute worklet\n    curBuffIndex_ = 0;\n    workletRunner_.executeOnRuntimeSync([this, channelCount_](jsi::Runtime &uiRuntimeRaw) {\n      /// Arguments preparation\n      auto jsArray = jsi::Array(uiRuntimeRaw, channelCount_);\n      for (size_t ch = 0; ch < channelCount_; ch++) {\n        auto sharedAudioArray = std::make_shared<AudioArrayBuffer>(bufferLength_);\n        sharedAudioArray->copy(*buffer_->getChannel(ch));\n        auto sharedAudioArraySize = sharedAudioArray->size();\n        auto arrayBuffer = jsi::ArrayBuffer(uiRuntimeRaw, std::move(sharedAudioArray));\n        arrayBuffer.setExternalMemoryPressure(uiRuntimeRaw, sharedAudioArraySize);\n        jsArray.setValueAtIndex(uiRuntimeRaw, ch, std::move(arrayBuffer));\n      }\n\n      buffer_->zero();\n\n      /// Call the worklet\n      workletRunner_.callUnsafe(\n          std::move(jsArray), jsi::Value(uiRuntimeRaw, static_cast<int>(channelCount_)));\n\n      return jsi::Value::undefined();\n    });\n  }\n\n  return processingBuffer;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/WorkletNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/utils/worklets/WorkletsRunner.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioArrayBuffer.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/Macros.h>\n#include <jsi/jsi.h>\n\n#include <memory>\n\nnamespace audioapi {\n\n#if RN_AUDIO_API_TEST\nclass WorkletNode : public AudioNode {\n public:\n  explicit WorkletNode(\n      std::shared_ptr<BaseAudioContext> context,\n      size_t bufferLength,\n      size_t inputChannelCount,\n      WorkletsRunner &&workletRunner)\n      : AudioNode(context) {}\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override {\n    return processingBuffer;\n  }\n};\n#else\n\nusing namespace facebook;\n\nclass WorkletNode : public AudioNode {\n public:\n  explicit WorkletNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      size_t bufferLength,\n      size_t inputChannelCount,\n      WorkletsRunner &&workletRunner);\n  DELETE_COPY_AND_MOVE(WorkletNode);\n  ~WorkletNode() override = default;\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  WorkletsRunner workletRunner_;\n  std::shared_ptr<AudioBuffer> buffer_;\n\n  /// @brief Length of the byte buffer that will be passed to the AudioArrayBuffer\n  size_t bufferLength_;\n  size_t inputChannelCount_;\n  size_t curBuffIndex_;\n};\n\n#endif // RN_AUDIO_API_TEST\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/WorkletProcessingNode.cpp",
    "content": "#include <audioapi/core/effects/WorkletProcessingNode.h>\n#include <audioapi/core/utils/Constants.h>\n#include <algorithm>\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nWorkletProcessingNode::WorkletProcessingNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    WorkletsRunner &&workletRunner)\n    : AudioNode(context), workletRunner_(std::move(workletRunner)) {\n  // Pre-allocate buffers for max 128 frames and 2 channels (stereo)\n  size_t maxChannelCount = 2;\n  inputBuffsHandles_.resize(maxChannelCount);\n  outputBuffsHandles_.resize(maxChannelCount);\n\n  for (size_t i = 0; i < maxChannelCount; ++i) {\n    inputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(RENDER_QUANTUM_SIZE);\n    outputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(RENDER_QUANTUM_SIZE);\n  }\n\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nstd::shared_ptr<DSPAudioBuffer> WorkletProcessingNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  size_t channelCount = std::min(\n      static_cast<size_t>(2), // Fixed to stereo for now\n      processingBuffer->getNumberOfChannels());\n\n  // Copy input data to pre-allocated input buffers\n  for (size_t ch = 0; ch < channelCount; ch++) {\n    inputBuffsHandles_[ch]->copy(*processingBuffer->getChannel(ch), 0, 0, framesToProcess);\n  }\n\n  // Execute the worklet\n  auto result = workletRunner_.executeOnRuntimeSync(\n      [this, channelCount, framesToProcess](jsi::Runtime &rt) -> jsi::Value {\n        auto inputJsArray = jsi::Array(rt, channelCount);\n        auto outputJsArray = jsi::Array(rt, channelCount);\n\n        for (size_t ch = 0; ch < channelCount; ch++) {\n          // Create input array buffer\n          auto inputArrayBuffer = jsi::ArrayBuffer(rt, inputBuffsHandles_[ch]);\n          inputJsArray.setValueAtIndex(rt, ch, inputArrayBuffer);\n\n          // Create output array buffer\n          auto outputArrayBuffer = jsi::ArrayBuffer(rt, outputBuffsHandles_[ch]);\n          outputJsArray.setValueAtIndex(rt, ch, outputArrayBuffer);\n        }\n\n        // We call unsafely here because we are already on the runtime thread\n        // and the runtime is locked by executeOnRuntimeSync (if\n        // shouldLockRuntime is true)\n        double time = 0.0f;\n        if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n          time = context->getCurrentTime();\n        }\n        return workletRunner_.callUnsafe(\n            inputJsArray,\n            outputJsArray,\n            jsi::Value(rt, static_cast<int>(framesToProcess)),\n            jsi::Value(rt, time));\n      });\n\n  // Copy processed output data back to the processing buffer or zero on failure\n  for (size_t ch = 0; ch < channelCount; ch++) {\n    auto *channelData = processingBuffer->getChannel(ch);\n\n    if (result.has_value()) {\n      // Copy processed output data\n      channelData->copy(*outputBuffsHandles_[ch], 0, 0, framesToProcess);\n    } else {\n      // Zero the output on worklet execution failure\n      channelData->zero(0, framesToProcess);\n    }\n  }\n\n  return processingBuffer;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/effects/WorkletProcessingNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/utils/worklets/WorkletsRunner.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioArrayBuffer.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <jsi/jsi.h>\n\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\n#if RN_AUDIO_API_TEST\nclass WorkletProcessingNode : public AudioNode {\n public:\n  explicit WorkletProcessingNode(\n      std::shared_ptr<BaseAudioContext> context,\n      WorkletsRunner &&workletRunner)\n      : AudioNode(context) {}\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override {\n    return processingBuffer;\n  }\n};\n#else\n\nusing namespace facebook;\n\nclass WorkletProcessingNode : public AudioNode {\n public:\n  explicit WorkletProcessingNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      WorkletsRunner &&workletRunner);\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  WorkletsRunner workletRunner_;\n  std::vector<std::shared_ptr<AudioArrayBuffer>> inputBuffsHandles_;\n  std::vector<std::shared_ptr<AudioArrayBuffer>> outputBuffsHandles_;\n};\n\n#endif // RN_AUDIO_API_TEST\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/inputs/AudioRecorder.cpp",
    "content": "#include <audioapi/core/inputs/AudioRecorder.h>\n#include <audioapi/core/utils/AudioFileWriter.h>\n#include <audioapi/core/utils/AudioRecorderCallback.h>\n\nnamespace audioapi {\n\n/// @brief Sets the error callback to be invoked when an error occurs during recording.\n/// This method should be called from the JS thread only.\n/// @param callbackId Identifier for the JS callback to be invoked.\nvoid AudioRecorder::setOnErrorCallback(uint64_t callbackId) {\n  std::scoped_lock lock(callbackMutex_, fileWriterMutex_, errorCallbackMutex_);\n\n  if (usesFileOutput() && fileWriter_ != nullptr) {\n    fileWriter_->setOnErrorCallback(callbackId);\n  }\n\n  if (usesCallback() && dataCallback_ != nullptr) {\n    dataCallback_->setOnErrorCallback(callbackId);\n  }\n\n  errorCallbackId_.store(callbackId, std::memory_order_release);\n}\n\n/// @brief Clears the error callback.\n/// If the recorder is currently active, it will stop invoking the callback immediately.\n/// This method should be called from the JS thread only.\nvoid AudioRecorder::clearOnErrorCallback() {\n  std::scoped_lock lock(callbackMutex_, fileWriterMutex_, errorCallbackMutex_);\n\n  if (usesFileOutput() && fileWriter_ != nullptr) {\n    fileWriter_->clearOnErrorCallback();\n  }\n\n  if (usesCallback() && dataCallback_ != nullptr) {\n    dataCallback_->clearOnErrorCallback();\n  }\n\n  errorCallbackId_.store(0, std::memory_order_release);\n}\n\n/// @brief Gets the current duration of the recorded audio in seconds.\n/// @returns Duration in seconds.\ndouble AudioRecorder::getCurrentDuration() const {\n  std::scoped_lock lock(fileWriterMutex_);\n  double duration = 0.0;\n\n  if (usesFileOutput() && fileWriter_ != nullptr) {\n    duration = fileWriter_->getCurrentDuration();\n  }\n\n  return duration;\n}\n\nbool AudioRecorder::usesCallback() const {\n  return wantsCallback() && callbackOutputConfigured_.load(std::memory_order_acquire);\n}\n\nbool AudioRecorder::usesFileOutput() const {\n  return wantsFileOutput() && fileOutputConfigured_.load(std::memory_order_acquire);\n}\n\nbool AudioRecorder::isConnected() const {\n  return wantsConnection() && connectedConfigured_.load(std::memory_order_acquire);\n}\n\nbool AudioRecorder::wantsCallback() const {\n  return callbackOutputEnabled_.load(std::memory_order_acquire);\n}\n\nbool AudioRecorder::wantsFileOutput() const {\n  return fileOutputEnabled_.load(std::memory_order_acquire);\n}\n\nbool AudioRecorder::wantsConnection() const {\n  return isConnected_.load(std::memory_order_acquire);\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/inputs/AudioRecorder.h",
    "content": "#pragma once\n\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/Result.hpp>\n#include <atomic>\n#include <memory>\n#include <mutex>\n#include <string>\n#include <tuple>\n\nnamespace audioapi {\n\nclass AudioFileWriter;\nclass RecorderAdapterNode;\nclass AudioFileProperties;\nclass AudioRecorderCallback;\nclass AudioEventHandlerRegistry;\n\nclass AudioRecorder {\n public:\n  enum class RecorderState : uint8_t { Idle = 0, Recording, Paused };\n  explicit AudioRecorder(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)\n      : audioEventHandlerRegistry_(audioEventHandlerRegistry) {}\n  AudioRecorder(const AudioRecorder &) = delete;\n  AudioRecorder(AudioRecorder &&) = delete;\n  AudioRecorder &operator=(const AudioRecorder &) = delete;\n  AudioRecorder &operator=(AudioRecorder &&) = delete;\n  virtual ~AudioRecorder() = default;\n\n  virtual Result<NoneType, std::string> start(const std::string &fileNameOverride) = 0;\n  virtual Result<std::tuple<std::vector<std::string>, double, double>, std::string> stop() = 0;\n\n  virtual Result<NoneType, std::string> enableFileOutput(\n      std::shared_ptr<AudioFileProperties> properties) = 0;\n  virtual void disableFileOutput() = 0;\n\n  virtual void pause() = 0;\n  virtual void resume() = 0;\n\n  virtual void connect(const std::shared_ptr<RecorderAdapterNode> &node) = 0;\n  virtual void disconnect() = 0;\n\n  virtual Result<NoneType, std::string> setOnAudioReadyCallback(\n      float sampleRate,\n      size_t bufferLength,\n      int channelCount,\n      uint64_t callbackId) = 0;\n  virtual void clearOnAudioReadyCallback() = 0;\n\n  void setOnErrorCallback(uint64_t callbackId);\n  void clearOnErrorCallback();\n\n  virtual double getCurrentDuration() const;\n\n  bool usesCallback() const;\n  bool usesFileOutput() const;\n  bool isConnected() const;\n\n  virtual bool isRecording() const = 0;\n  virtual bool isPaused() const = 0;\n  virtual bool isIdle() const = 0;\n\n protected:\n  bool wantsCallback() const;\n  bool wantsFileOutput() const;\n  bool wantsConnection() const;\n\n  std::atomic<RecorderState> state_{RecorderState::Idle};\n\n  std::atomic<bool> isConnected_{false};\n  std::atomic<bool> fileOutputEnabled_{false};\n  std::atomic<bool> callbackOutputEnabled_{false};\n  std::atomic<bool> connectedConfigured_{false};\n  std::atomic<bool> fileOutputConfigured_{false};\n  std::atomic<bool> callbackOutputConfigured_{false};\n\n  std::mutex callbackMutex_;\n  mutable std::mutex fileWriterMutex_;\n  std::mutex errorCallbackMutex_;\n  mutable std::mutex adapterNodeMutex_;\n\n  std::atomic<uint64_t> errorCallbackId_{0};\n\n  std::string filePath_;\n  std::shared_ptr<AudioFileWriter> fileWriter_ = nullptr;\n  std::shared_ptr<RecorderAdapterNode> adapterNode_ = nullptr;\n  std::shared_ptr<AudioRecorderCallback> dataCallback_ = nullptr;\n  std::shared_ptr<AudioEventHandlerRegistry> audioEventHandlerRegistry_;\n  std::shared_ptr<AudioFileProperties> fileProperties_ = nullptr;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.cpp",
    "content": "#include <audioapi/core/AudioParam.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/AudioBufferBaseSourceNode.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <algorithm>\n#include <memory>\n#include <string>\n#include <unordered_map>\n\nnamespace audioapi {\nAudioBufferBaseSourceNode::AudioBufferBaseSourceNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const BaseAudioBufferSourceOptions &options)\n    : AudioScheduledSourceNode(context, options),\n      vReadIndex_(0.0),\n      pitchCorrection_(options.pitchCorrection),\n      detuneParam_(\n          std::make_shared<AudioParam>(\n              options.detune,\n              MOST_NEGATIVE_SINGLE_FLOAT,\n              MOST_POSITIVE_SINGLE_FLOAT,\n              context)),\n      playbackRateParam_(\n          std::make_shared<AudioParam>(\n              options.playbackRate,\n              MOST_NEGATIVE_SINGLE_FLOAT,\n              MOST_POSITIVE_SINGLE_FLOAT,\n              context)),\n      onPositionChangedIntervalInFrames_(static_cast<int>(context->getSampleRate())) {\n  setOnPositionChangedInterval(options.onPositionChangedInterval);\n}\n\nvoid AudioBufferBaseSourceNode::initStretch(\n    const std::shared_ptr<signalsmith::stretch::SignalsmithStretch<float>> &stretch,\n    const std::shared_ptr<DSPAudioBuffer> &playbackRateBuffer) {\n  stretch_ = stretch;\n  playbackRateBuffer_ = playbackRateBuffer;\n}\n\nstd::shared_ptr<AudioParam> AudioBufferBaseSourceNode::getDetuneParam() const {\n  return detuneParam_;\n}\n\nstd::shared_ptr<AudioParam> AudioBufferBaseSourceNode::getPlaybackRateParam() const {\n  return playbackRateParam_;\n}\n\nvoid AudioBufferBaseSourceNode::setOnPositionChangedCallbackId(uint64_t callbackId) {\n  onPositionChangedCallbackId_ = callbackId;\n}\n\nvoid AudioBufferBaseSourceNode::setOnPositionChangedInterval(int interval) {\n  onPositionChangedIntervalInFrames_ = static_cast<int>(\n      //NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers, readability-magic-numbers)\n      getContextSampleRate() * static_cast<float>(interval) / 1000);\n}\n\nvoid AudioBufferBaseSourceNode::unregisterOnPositionChangedCallback(uint64_t callbackId) {\n  audioEventHandlerRegistry_->unregisterHandler(AudioEvent::POSITION_CHANGED, callbackId);\n}\n\nstd::shared_ptr<DSPAudioBuffer> AudioBufferBaseSourceNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  if (isEmpty()) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  if (!pitchCorrection_) {\n    processWithoutPitchCorrection(processingBuffer, framesToProcess);\n  } else {\n    processWithPitchCorrection(processingBuffer, framesToProcess);\n  }\n\n  handleStopScheduled();\n\n  return processingBuffer;\n}\n\nvoid AudioBufferBaseSourceNode::sendOnPositionChangedEvent() {\n  if (onPositionChangedCallbackId_ != 0 &&\n      onPositionChangedTimeInFrames_ > onPositionChangedIntervalInFrames_) {\n    std::unordered_map<std::string, EventValue> body = {{\"value\", getCurrentPosition()}};\n\n    audioEventHandlerRegistry_->invokeHandlerWithEventBody(\n        AudioEvent::POSITION_CHANGED, onPositionChangedCallbackId_, body);\n\n    onPositionChangedTimeInFrames_ = 0;\n  }\n\n  onPositionChangedTimeInFrames_ += RENDER_QUANTUM_SIZE;\n}\n\nvoid AudioBufferBaseSourceNode::processWithPitchCorrection(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  size_t startOffset = 0;\n  size_t offsetLength = 0;\n\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr || playbackRateBuffer_ == nullptr) {\n    processingBuffer->zero();\n    return;\n  }\n  auto time = context->getCurrentTime();\n  auto playbackRate = std::clamp(\n      playbackRateParam_->processKRateParam(framesToProcess, time),\n      MIN_PLAYBACK_RATE,\n      MAX_PLAYBACK_RATE);\n  auto detune = std::clamp(\n      detuneParam_->processKRateParam(framesToProcess, time) / 100.0f,\n      static_cast<float>(-SEMITONES_PER_OCTAVE),\n      static_cast<float>(SEMITONES_PER_OCTAVE));\n\n  playbackRateBuffer_->zero();\n\n  auto framesNeededToStretch = static_cast<int>(playbackRate * static_cast<float>(framesToProcess));\n\n  updatePlaybackInfo(\n      playbackRateBuffer_,\n      framesNeededToStretch,\n      startOffset,\n      offsetLength,\n      context->getSampleRate(),\n      context->getCurrentSampleFrame());\n\n  if (playbackRate == 0.0f || (!isPlaying() && !isStopScheduled()) || stretch_ == nullptr) {\n    processingBuffer->zero();\n    return;\n  }\n\n  processWithoutInterpolation(playbackRateBuffer_, startOffset, offsetLength, playbackRate);\n\n  stretch_->process(\n      playbackRateBuffer_.get()[0],\n      framesNeededToStretch,\n      processingBuffer.get()[0],\n      framesToProcess);\n\n  if (detune != 0.0f) {\n    stretch_->setTransposeSemitones(detune);\n  }\n\n  sendOnPositionChangedEvent();\n}\n\nvoid AudioBufferBaseSourceNode::processWithoutPitchCorrection(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  size_t startOffset = 0;\n  size_t offsetLength = 0;\n\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr) {\n    processingBuffer->zero();\n    return;\n  }\n\n  auto computedPlaybackRate =\n      getComputedPlaybackRateValue(framesToProcess, context->getCurrentTime());\n\n  updatePlaybackInfo(\n      processingBuffer,\n      framesToProcess,\n      startOffset,\n      offsetLength,\n      context->getSampleRate(),\n      context->getCurrentSampleFrame());\n\n  if (computedPlaybackRate == 0.0f || (!isPlaying() && !isStopScheduled())) {\n    processingBuffer->zero();\n    return;\n  }\n\n  if (std::fabs(computedPlaybackRate) == 1.0) {\n    processWithoutInterpolation(processingBuffer, startOffset, offsetLength, computedPlaybackRate);\n  } else {\n    processWithInterpolation(processingBuffer, startOffset, offsetLength, computedPlaybackRate);\n  }\n\n  sendOnPositionChangedEvent();\n}\n\nfloat AudioBufferBaseSourceNode::getComputedPlaybackRateValue(int framesToProcess, double time) {\n  auto playbackRate = playbackRateParam_->processKRateParam(framesToProcess, time);\n  auto detune = std::pow(\n      2.0f, //NOLINT(cppcoreguidelines-avoid-magic-numbers, readability-magic-numbers)\n      detuneParam_->processKRateParam(framesToProcess, time) / static_cast<float>(OCTAVE_RANGE));\n\n  return playbackRate * detune;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferBaseSourceNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/sources/AudioScheduledSourceNode.h>\n#include <audioapi/libs/signalsmith-stretch/signalsmith-stretch.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <memory>\n\nnamespace audioapi {\n\nclass AudioParam;\nstruct BaseAudioBufferSourceOptions;\n\nclass AudioBufferBaseSourceNode : public AudioScheduledSourceNode {\n public:\n  explicit AudioBufferBaseSourceNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const BaseAudioBufferSourceOptions &options);\n\n  /// @note Audio Thread only\n  void initStretch(\n      const std::shared_ptr<signalsmith::stretch::SignalsmithStretch<float>> &stretch,\n      const std::shared_ptr<DSPAudioBuffer> &playbackRateBuffer);\n\n  [[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;\n  [[nodiscard]] std::shared_ptr<AudioParam> getPlaybackRateParam() const;\n\n  /// @note Audio Thread only\n  void setOnPositionChangedCallbackId(uint64_t callbackId);\n\n  /// @note Audio Thread only\n  void setOnPositionChangedInterval(int interval);\n\n  void unregisterOnPositionChangedCallback(uint64_t callbackId);\n\n protected:\n  // internal helper\n  double vReadIndex_;\n\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) final;\n\n  virtual double getCurrentPosition() const = 0;\n\n  virtual bool isEmpty() const = 0;\n\n  virtual void processWithoutInterpolation(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      size_t startOffset,\n      size_t offsetLength,\n      float playbackRate) = 0;\n\n  virtual void processWithInterpolation(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      size_t startOffset,\n      size_t offsetLength,\n      float playbackRate) = 0;\n\n private:\n  // pitch correction parameters\n  // late init to avoid unnecessary allocation when pitch correction is not used.\n  const bool pitchCorrection_;\n  std::shared_ptr<signalsmith::stretch::SignalsmithStretch<float>> stretch_;\n  std::shared_ptr<DSPAudioBuffer> playbackRateBuffer_;\n  static constexpr float MAX_PLAYBACK_RATE = 3.0f;\n  static constexpr float MIN_PLAYBACK_RATE = 0.0f;\n\n  // k-rate params\n  const std::shared_ptr<AudioParam> detuneParam_;\n  const std::shared_ptr<AudioParam> playbackRateParam_;\n\n  uint64_t onPositionChangedCallbackId_ = 0; // 0 means no callback\n  int onPositionChangedIntervalInFrames_;\n  int onPositionChangedTimeInFrames_ = 0;\n\n  void sendOnPositionChangedEvent();\n\n  void processWithPitchCorrection(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess);\n  void processWithoutPitchCorrection(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess);\n\n  float getComputedPlaybackRateValue(int framesToProcess, double time);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.cpp",
    "content": "#include <audioapi/core/AudioParam.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/AudioBufferQueueSourceNode.h>\n#include <audioapi/core/utils/AudioGraphManager.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/core/utils/Locker.h>\n#include <audioapi/dsp/AudioUtils.hpp>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <algorithm>\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <utility>\n\nnamespace audioapi {\n\nAudioBufferQueueSourceNode::AudioBufferQueueSourceNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const BaseAudioBufferSourceOptions &options)\n    : AudioBufferBaseSourceNode(context, options) {\n  if (options.pitchCorrection) {\n    // If pitch correction is enabled, add extra frames at the end\n    // to compensate for processing latency.\n    addExtraTailFrames_ = true;\n  }\n\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nvoid AudioBufferQueueSourceNode::stop(double when) {\n  AudioScheduledSourceNode::stop(when);\n  isPaused_ = false;\n}\n\nvoid AudioBufferQueueSourceNode::start(double when) {\n  isPaused_ = false;\n  stopTime_ = -1.0;\n  AudioScheduledSourceNode::start(when);\n}\n\nvoid AudioBufferQueueSourceNode::start(double when, double offset) {\n  start(when);\n\n  if (buffers_.empty() || offset < 0) {\n    return;\n  }\n\n  offset = std::min(offset, buffers_.front().second->getDuration());\n  vReadIndex_ = static_cast<double>(buffers_.front().second->getSampleRate() * offset);\n}\n\nvoid AudioBufferQueueSourceNode::pause() {\n  AudioScheduledSourceNode::stop(0.0);\n  isPaused_ = true;\n}\n\nvoid AudioBufferQueueSourceNode::enqueueBuffer(\n    const std::shared_ptr<AudioBuffer> &buffer,\n    size_t bufferId,\n    const std::shared_ptr<AudioBuffer> &tailBuffer) {\n  buffers_.emplace_back(bufferId, buffer);\n\n  if (tailBuffer != nullptr) {\n    tailBuffer_ = tailBuffer;\n  }\n\n  if (tailBuffer_ != nullptr) {\n    addExtraTailFrames_ = true;\n  }\n}\n\nvoid AudioBufferQueueSourceNode::dequeueBuffer(const size_t bufferId) {\n  if (auto context = context_.lock()) {\n    if (buffers_.empty()) {\n      return;\n    }\n\n    auto graphManager = context->getGraphManager();\n\n    if (buffers_.front().first == bufferId) {\n      graphManager->addAudioBufferForDestruction(std::move(buffers_.front().second));\n      buffers_.pop_front();\n      vReadIndex_ = 0.0;\n      return;\n    }\n\n    // If the buffer is not at the front, we need to remove it from the linked list..\n    // And keep vReadIndex_ at the same position.\n    for (auto it = std::next(buffers_.begin()); it != buffers_.end(); ++it) {\n      if (it->first == bufferId) {\n        graphManager->addAudioBufferForDestruction(std::move(it->second));\n        buffers_.erase(it);\n        return;\n      }\n    }\n  }\n}\n\nvoid AudioBufferQueueSourceNode::clearBuffers() {\n  if (auto context = context_.lock()) {\n    for (auto it = buffers_.begin(); it != buffers_.end(); ++it) {\n      context->getGraphManager()->addAudioBufferForDestruction(std::move(it->second));\n    }\n\n    buffers_.clear();\n    vReadIndex_ = 0.0;\n  }\n}\n\nvoid AudioBufferQueueSourceNode::disable() {\n  if (isPaused_) {\n    playbackState_ = PlaybackState::UNSCHEDULED;\n    startTime_ = -1.0;\n    stopTime_ = -1.0;\n    isPaused_ = false;\n\n    return;\n  }\n\n  AudioScheduledSourceNode::disable();\n  clearBuffers();\n}\n\nvoid AudioBufferQueueSourceNode::setOnBufferEndedCallbackId(uint64_t callbackId) {\n  onBufferEndedCallbackId_ = callbackId;\n}\n\nvoid AudioBufferQueueSourceNode::unregisterOnBufferEndedCallback(uint64_t callbackId) {\n  audioEventHandlerRegistry_->unregisterHandler(AudioEvent::BUFFER_ENDED, callbackId);\n}\n\ndouble AudioBufferQueueSourceNode::getCurrentPosition() const {\n  return dsp::sampleFrameToTime(static_cast<int>(vReadIndex_), getContextSampleRate()) +\n      playedBuffersDuration_;\n}\n\nvoid AudioBufferQueueSourceNode::sendOnBufferEndedEvent(size_t bufferId, bool isLastBufferInQueue) {\n  if (onBufferEndedCallbackId_ != 0) {\n    std::unordered_map<std::string, EventValue> body = {\n        {\"bufferId\", std::to_string(bufferId)}, {\"isLastBufferInQueue\", isLastBufferInQueue}};\n\n    audioEventHandlerRegistry_->invokeHandlerWithEventBody(\n        AudioEvent::BUFFER_ENDED, onBufferEndedCallbackId_, body);\n  }\n}\n\n/**\n * Helper functions\n */\n\nbool AudioBufferQueueSourceNode::isEmpty() const {\n  return buffers_.empty();\n}\n\n// todo: refactor so its less complex and more readable\nvoid AudioBufferQueueSourceNode::processWithoutInterpolation(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    size_t startOffset,\n    size_t offsetLength,\n    float playbackRate) {\n  if (auto context = context_.lock()) {\n    auto readIndex = static_cast<size_t>(vReadIndex_);\n    size_t writeIndex = startOffset;\n\n    auto data = buffers_.front();\n    auto bufferId = data.first;\n    auto buffer = data.second;\n\n    size_t framesLeft = offsetLength;\n\n    while (framesLeft > 0) {\n      size_t framesToEnd = buffer->getSize() - readIndex;\n      size_t framesToCopy = std::min(framesToEnd, framesLeft);\n      framesToCopy = framesToCopy > 0 ? framesToCopy : 0;\n\n      assert(readIndex >= 0);\n      assert(writeIndex >= 0);\n      assert(readIndex + framesToCopy <= buffer->getSize());\n      assert(writeIndex + framesToCopy <= processingBuffer->getSize());\n\n      processingBuffer->copy(*buffer, readIndex, writeIndex, framesToCopy);\n\n      writeIndex += framesToCopy;\n      readIndex += framesToCopy;\n      framesLeft -= framesToCopy;\n\n      if (readIndex >= buffer->getSize()) {\n        playedBuffersDuration_ += buffer->getDuration();\n        buffers_.pop_front();\n\n        if (!(buffers_.empty() && addExtraTailFrames_)) {\n          sendOnBufferEndedEvent(bufferId, buffers_.empty());\n        }\n\n        if (buffers_.empty()) {\n          if (addExtraTailFrames_) {\n            buffers_.emplace_back(bufferId, tailBuffer_);\n            addExtraTailFrames_ = false;\n          } else {\n            context->getGraphManager()->addAudioBufferForDestruction(std::move(buffer));\n            processingBuffer->zero(writeIndex, framesLeft);\n            readIndex = 0;\n\n            break;\n          }\n        }\n\n        context->getGraphManager()->addAudioBufferForDestruction(std::move(buffer));\n        data = buffers_.front();\n        bufferId = data.first;\n        buffer = data.second;\n        readIndex = 0;\n      }\n    }\n\n    // update reading index for next render quantum\n    vReadIndex_ = static_cast<double>(readIndex);\n  }\n}\n\n// todo: refactor so its less complex and more readable\nvoid AudioBufferQueueSourceNode::processWithInterpolation(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    size_t startOffset,\n    size_t offsetLength,\n    float playbackRate) {\n  if (auto context = context_.lock()) {\n    size_t writeIndex = startOffset;\n    size_t framesLeft = offsetLength;\n\n    auto data = buffers_.front();\n    auto bufferId = data.first;\n    auto buffer = data.second;\n\n    while (framesLeft > 0) {\n      auto readIndex = static_cast<size_t>(vReadIndex_);\n      size_t nextReadIndex = readIndex + 1;\n      auto factor = static_cast<float>(vReadIndex_ - static_cast<double>(readIndex));\n\n      bool crossBufferInterpolation = false;\n      std::shared_ptr<AudioBuffer> nextBuffer = nullptr;\n\n      if (nextReadIndex >= buffer->getSize()) {\n        if (buffers_.size() > 1) {\n          auto tempQueue = buffers_;\n          tempQueue.pop_front();\n          nextBuffer = tempQueue.front().second;\n          nextReadIndex = 0;\n          crossBufferInterpolation = true;\n        } else {\n          nextReadIndex = readIndex;\n        }\n      }\n\n      for (size_t i = 0; i < processingBuffer->getNumberOfChannels(); i += 1) {\n        const auto destination = processingBuffer->getChannel(i)->span();\n        const auto currentSource = buffer->getChannel(i)->span();\n\n        if (crossBufferInterpolation) {\n          const auto nextSource = nextBuffer->getChannel(i)->span();\n          float currentSample = currentSource[readIndex];\n          float nextSample = nextSource[nextReadIndex];\n          destination[writeIndex] = currentSample + factor * (nextSample - currentSample);\n        } else {\n          destination[writeIndex] =\n              dsp::linearInterpolate(currentSource, readIndex, nextReadIndex, factor);\n        }\n      }\n\n      writeIndex += 1;\n      // queue source node always use positive playbackRate\n      vReadIndex_ += std::abs(playbackRate);\n      framesLeft -= 1;\n\n      if (vReadIndex_ >= static_cast<double>(buffer->getSize())) {\n        playedBuffersDuration_ += buffer->getDuration();\n        buffers_.pop_front();\n\n        sendOnBufferEndedEvent(bufferId, buffers_.empty());\n\n        if (buffers_.empty()) {\n          context->getGraphManager()->addAudioBufferForDestruction(std::move(buffer));\n          processingBuffer->zero(writeIndex, framesLeft);\n          vReadIndex_ = 0.0;\n          break;\n        }\n\n        vReadIndex_ = vReadIndex_ - static_cast<double>(buffer->getSize());\n        context->getGraphManager()->addAudioBufferForDestruction(std::move(buffer));\n        data = buffers_.front();\n        bufferId = data.first;\n        buffer = data.second;\n      }\n    }\n  }\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferQueueSourceNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/AudioBufferBaseSourceNode.h>\n#include <audioapi/libs/signalsmith-stretch/signalsmith-stretch.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <cstddef>\n#include <list>\n#include <memory>\n\nnamespace audioapi {\n\nclass AudioParam;\nstruct BaseAudioBufferSourceOptions;\n\nclass AudioBufferQueueSourceNode : public AudioBufferBaseSourceNode {\n public:\n  explicit AudioBufferQueueSourceNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const BaseAudioBufferSourceOptions &options);\n\n  /// @note Audio Thread only\n  void stop(double when) override;\n\n  void start(double when) override;\n  /// @note Audio Thread only\n  void start(double when, double offset);\n  /// @note Audio Thread only\n  void pause();\n\n  /// @note Audio Thread only\n  void enqueueBuffer(\n      const std::shared_ptr<AudioBuffer> &buffer,\n      size_t bufferId,\n      const std::shared_ptr<AudioBuffer> &tailBuffer);\n\n  /// @note Audio Thread only\n  void dequeueBuffer(size_t bufferId);\n  /// @note Audio Thread only\n  void clearBuffers();\n\n  /// @note Audio Thread only\n  void disable() override;\n\n  /// @note Audio Thread only\n  void setOnBufferEndedCallbackId(uint64_t callbackId);\n\n  void unregisterOnBufferEndedCallback(uint64_t callbackId);\n\n protected:\n  double getCurrentPosition() const override;\n\n  void sendOnBufferEndedEvent(size_t bufferId, bool isLastBufferInQueue);\n\n  bool isEmpty() const final;\n\n  void processWithoutInterpolation(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      size_t startOffset,\n      size_t offsetLength,\n      float playbackRate) final;\n\n  void processWithInterpolation(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      size_t startOffset,\n      size_t offsetLength,\n      float playbackRate) final;\n\n private:\n  // User provided buffers\n  std::list<std::pair<size_t, std::shared_ptr<AudioBuffer>>> buffers_;\n\n  bool isPaused_ = false;\n  bool addExtraTailFrames_ = false;\n  std::shared_ptr<AudioBuffer> tailBuffer_;\n\n  double playedBuffersDuration_ = 0;\n\n  uint64_t onBufferEndedCallbackId_ = 0; // 0 means no callback\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferSourceNode.cpp",
    "content": "#include <audioapi/core/AudioParam.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/AudioBufferSourceNode.h>\n#include <audioapi/core/utils/AudioGraphManager.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/core/utils/Locker.h>\n#include <audioapi/dsp/AudioUtils.hpp>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <algorithm>\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nAudioBufferSourceNode::AudioBufferSourceNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const AudioBufferSourceOptions &options)\n    : AudioBufferBaseSourceNode(context, options),\n      loop_(options.loop),\n      loopSkip_(options.loopSkip),\n      loopStart_(options.loopStart),\n      loopEnd_(options.loopEnd) {\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nvoid AudioBufferSourceNode::setLoop(bool loop) {\n  loop_ = loop;\n}\n\nvoid AudioBufferSourceNode::setLoopSkip(bool loopSkip) {\n  loopSkip_ = loopSkip;\n}\n\nvoid AudioBufferSourceNode::setLoopStart(double loopStart) {\n  if (loopSkip_) {\n    vReadIndex_ = loopStart * getContextSampleRate();\n  }\n  loopStart_ = loopStart;\n}\n\nvoid AudioBufferSourceNode::setLoopEnd(double loopEnd) {\n  loopEnd_ = loopEnd;\n}\n\nvoid AudioBufferSourceNode::setBuffer(\n    const std::shared_ptr<AudioBuffer> &buffer,\n    const std::shared_ptr<DSPAudioBuffer> &audioBuffer) {\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n\n  if (context == nullptr) {\n    return;\n  }\n\n  auto graphManager = context->getGraphManager();\n\n  if (buffer_ != nullptr) {\n    graphManager->addAudioBufferForDestruction(std::move(buffer_));\n  }\n\n  // TODO move DSPAudioBuffers destruction to graph manager as well\n\n  if (buffer == nullptr) {\n    loopEnd_ = 0;\n    channelCount_ = 1;\n\n    buffer_ = nullptr;\n    return;\n  }\n\n  buffer_ = buffer;\n  audioBuffer_ = audioBuffer;\n  channelCount_ = static_cast<int>(buffer_->getNumberOfChannels());\n  loopEnd_ = buffer_->getDuration();\n}\n\nvoid AudioBufferSourceNode::start(double when, double offset, double duration) {\n  AudioScheduledSourceNode::start(when);\n\n  if (duration > 0) {\n    AudioScheduledSourceNode::stop(when + duration);\n  }\n\n  if (buffer_ == nullptr) {\n    return;\n  }\n\n  offset = std::min(offset, static_cast<double>(buffer_->getSize()) / buffer_->getSampleRate());\n\n  if (loop_) {\n    offset = std::min(offset, loopEnd_);\n  }\n\n  vReadIndex_ = static_cast<double>(buffer_->getSampleRate() * offset);\n}\n\nvoid AudioBufferSourceNode::disable() {\n  AudioScheduledSourceNode::disable();\n}\n\nvoid AudioBufferSourceNode::setOnLoopEndedCallbackId(uint64_t callbackId) {\n  onLoopEndedCallbackId_ = callbackId;\n}\n\nvoid AudioBufferSourceNode::unregisterOnLoopEndedCallback(uint64_t callbackId) {\n  audioEventHandlerRegistry_->unregisterHandler(AudioEvent::LOOP_ENDED, callbackId);\n}\n\ndouble AudioBufferSourceNode::getCurrentPosition() const {\n  return dsp::sampleFrameToTime(static_cast<int>(vReadIndex_), buffer_->getSampleRate());\n}\n\nvoid AudioBufferSourceNode::sendOnLoopEndedEvent() {\n  if (onLoopEndedCallbackId_ != 0) {\n    audioEventHandlerRegistry_->invokeHandlerWithEventBody(\n        AudioEvent::LOOP_ENDED, onLoopEndedCallbackId_, {});\n  }\n}\n\n/**\n * Helper functions\n */\n\nbool AudioBufferSourceNode::isEmpty() const {\n  return buffer_ == nullptr;\n}\n\n// todo: refactor so its less complex and more readable\nvoid AudioBufferSourceNode::processWithoutInterpolation(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    size_t startOffset,\n    size_t offsetLength,\n    float playbackRate) {\n  size_t direction = playbackRate < 0.0f ? -1 : 1;\n\n  auto readIndex = static_cast<size_t>(vReadIndex_);\n  size_t writeIndex = startOffset;\n\n  auto frameStart = static_cast<size_t>(getVirtualStartFrame(getContextSampleRate()));\n  auto frameEnd = static_cast<size_t>(getVirtualEndFrame(getContextSampleRate()));\n  size_t frameDelta = frameEnd - frameStart;\n\n  size_t framesLeft = offsetLength;\n\n  // if we are moving towards loop, we do nothing because we will achieve it\n  // otherwise, we wrap to the start of the loop if necessary\n  if (loop_ &&\n      ((readIndex >= frameEnd && direction == 1) || (readIndex < frameStart && direction == -1))) {\n    readIndex = frameStart +\n        (static_cast<int64_t>(readIndex) - static_cast<int64_t>(frameStart)) % frameDelta;\n  }\n\n  while (framesLeft > 0) {\n    size_t framesToEnd = frameEnd - readIndex;\n    size_t framesToCopy = std::min(framesToEnd, framesLeft);\n    framesToCopy = framesToCopy > 0 ? framesToCopy : 0;\n\n    assert(readIndex >= 0);\n    assert(writeIndex >= 0);\n    assert(readIndex + framesToCopy <= buffer_->getSize());\n    assert(writeIndex + framesToCopy <= processingBuffer->getSize());\n\n    // Direction is forward, we can normally copy the data\n    if (direction == 1) {\n      processingBuffer->copy(*buffer_, readIndex, writeIndex, framesToCopy);\n    } else {\n      for (size_t ch = 0; ch < processingBuffer->getNumberOfChannels(); ch += 1) {\n        processingBuffer->getChannel(ch)->copyReverse(\n            *buffer_->getChannel(ch), readIndex, writeIndex, framesToCopy);\n      }\n    }\n\n    writeIndex += framesToCopy;\n    readIndex += framesToCopy * direction;\n    framesLeft -= framesToCopy;\n\n    // if we are moving towards loop, we do nothing because we will achieve it\n    // otherwise, we wrap to the start of the loop if necessary\n    if ((readIndex >= frameEnd && direction == 1) || (readIndex < frameStart && direction == -1)) {\n      readIndex -= direction * frameDelta;\n\n      if (!loop_) {\n        processingBuffer->zero(writeIndex, framesLeft);\n        playbackState_ = PlaybackState::STOP_SCHEDULED;\n        break;\n      }\n\n      sendOnLoopEndedEvent();\n    }\n  }\n\n  // update reading index for next render quantum\n  vReadIndex_ = static_cast<double>(readIndex);\n}\n\nvoid AudioBufferSourceNode::processWithInterpolation(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    size_t startOffset,\n    size_t offsetLength,\n    float playbackRate) {\n  size_t direction = playbackRate < 0.0f ? -1 : 1;\n\n  size_t writeIndex = startOffset;\n\n  auto vFrameStart = getVirtualStartFrame(getContextSampleRate());\n  auto vFrameEnd = getVirtualEndFrame(getContextSampleRate());\n  auto vFrameDelta = vFrameEnd - vFrameStart;\n\n  auto frameStart = static_cast<size_t>(vFrameStart);\n  auto frameEnd = static_cast<size_t>(vFrameEnd);\n\n  size_t framesLeft = offsetLength;\n\n  // Wrap to the start of the loop if necessary\n  if (loop_ && (vReadIndex_ >= vFrameEnd || vReadIndex_ < vFrameStart)) {\n    vReadIndex_ = vFrameStart + std::fmod(vReadIndex_ - vFrameStart, vFrameDelta);\n  }\n\n  while (framesLeft > 0) {\n    auto readIndex = static_cast<size_t>(vReadIndex_);\n    size_t nextReadIndex = readIndex + 1;\n    auto factor = static_cast<float>(vReadIndex_ - static_cast<double>(readIndex));\n\n    if (nextReadIndex >= frameEnd) {\n      nextReadIndex = loop_ ? frameStart : readIndex;\n    }\n\n    for (size_t i = 0; i < processingBuffer->getNumberOfChannels(); i++) {\n      auto destination = processingBuffer->getChannel(i)->span();\n      const auto source = buffer_->getChannel(i)->span();\n\n      destination[writeIndex] = dsp::linearInterpolate(source, readIndex, nextReadIndex, factor);\n    }\n\n    writeIndex += 1;\n    vReadIndex_ += playbackRate * static_cast<double>(direction);\n    framesLeft -= 1;\n\n    if (vReadIndex_ < vFrameStart || vReadIndex_ >= vFrameEnd) {\n      vReadIndex_ -= static_cast<double>(direction) * vFrameDelta;\n\n      if (!loop_) {\n        processingBuffer->zero(writeIndex, framesLeft);\n        playbackState_ = PlaybackState::STOP_SCHEDULED;\n        break;\n      }\n\n      sendOnLoopEndedEvent();\n    }\n  }\n}\n\ndouble AudioBufferSourceNode::getVirtualStartFrame(float sampleRate) const {\n  auto loopStartFrame = loopStart_ * sampleRate;\n  return loop_ && loopStartFrame >= 0 && loopStart_ < loopEnd_ ? loopStartFrame : 0.0;\n}\n\ndouble AudioBufferSourceNode::getVirtualEndFrame(float sampleRate) {\n  auto inputBufferLength = static_cast<double>(buffer_->getSize());\n  auto loopEndFrame = loopEnd_ * sampleRate;\n\n  return loop_ && loopEndFrame > 0 && loopStart_ < loopEnd_\n      ? std::min(loopEndFrame, inputBufferLength)\n      : inputBufferLength;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioBufferSourceNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/sources/AudioBufferBaseSourceNode.h>\n#include <audioapi/libs/signalsmith-stretch/signalsmith-stretch.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <cstddef>\n#include <memory>\n\nnamespace audioapi {\n\nclass AudioParam;\nstruct AudioBufferSourceOptions;\n\nclass AudioBufferSourceNode : public AudioBufferBaseSourceNode {\n public:\n  explicit AudioBufferSourceNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const AudioBufferSourceOptions &options);\n\n  /// @note Audio Thread only\n  void setLoop(bool loop);\n\n  /// @note Audio Thread only\n  void setLoopSkip(bool loopSkip);\n\n  /// @note Audio Thread only\n  void setLoopStart(double loopStart);\n\n  /// @note Audio Thread only\n  void setLoopEnd(double loopEnd);\n\n  /// @note Audio Thread only\n  void setBuffer(\n      const std::shared_ptr<AudioBuffer> &buffer,\n      const std::shared_ptr<DSPAudioBuffer> &audioBuffer);\n\n  using AudioScheduledSourceNode::start;\n  /// @note Audio Thread only\n  void start(double when, double offset, double duration = -1);\n\n  /// @note Audio Thread only\n  void disable() override;\n\n  /// @note Audio Thread only\n  void setOnLoopEndedCallbackId(uint64_t callbackId);\n\n  void unregisterOnLoopEndedCallback(uint64_t callbackId);\n\n protected:\n  double getCurrentPosition() const final;\n\n  bool isEmpty() const final;\n\n  void processWithoutInterpolation(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      size_t startOffset,\n      size_t offsetLength,\n      float playbackRate) final;\n\n  void processWithInterpolation(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      size_t startOffset,\n      size_t offsetLength,\n      float playbackRate) final;\n\n private:\n  // Looping related properties\n  bool loop_;\n  bool loopSkip_;\n  double loopStart_;\n  double loopEnd_;\n\n  // User provided buffer\n  std::shared_ptr<AudioBuffer> buffer_;\n\n  uint64_t onLoopEndedCallbackId_ = 0; // 0 means no callback\n  void sendOnLoopEndedEvent();\n\n  double getVirtualStartFrame(float sampleRate) const;\n  double getVirtualEndFrame(float sampleRate);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioFileSourceNode.cpp",
    "content": "#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/AudioFileSourceNode.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/events/AudioEvent.h>\n#include <audioapi/events/IAudioEventHandlerRegistry.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <audioapi/core/AudioContext.h>\n\n#include <algorithm>\n#include <cassert>\n#include <memory>\n#include <string>\n#include <unordered_map>\n\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n#include <audioapi/libs/ffmpeg/FFmpegDecoding.h>\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n\nnamespace audioapi {\n\nAudioFileSourceNode::AudioFileSourceNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const AudioFileSourceOptions &options)\n    : AudioScheduledSourceNode(context, options),\n      volume_(options.volume),\n      requiresFFmpeg_(options.requiresFFmpeg),\n      loop_(options.loop),\n      onPositionChangedInterval_(\n          static_cast<int>(context->getSampleRate() * ON_POSITION_CHANGED_INTERVAL)) {\n  const bool useFilePath = !options.filePath.empty();\n  const bool useData = !options.data.empty();\n\n  if (useFilePath || useData) {\n    auto state = std::make_shared<AudioFileDecoderState>();\n    if (useData) {\n      state->memoryData = options.data;\n    }\n    if (useFilePath) {\n      state->filePath = options.filePath;\n    }\n    initDecoders(useFilePath, context, state);\n  }\n\n  if (decoderState_ == nullptr) {\n    assert(false && \"cannot initialize decoder\");\n    return;\n  }\n\n  seekOffloader_ = std::make_unique<task_offloader::TaskOffloader<\n      OffloadedSeekRequest,\n      spsc::OverflowStrategy::OVERWRITE_ON_FULL,\n      spsc::WaitStrategy::ATOMIC_WAIT>>(\n      SEEK_OFFLOADER_WORKER_COUNT, [this](OffloadedSeekRequest req) { runOffloadedSeekTask(req); });\n\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nvoid AudioFileSourceNode::setOnPositionChangedCallbackId(uint64_t callbackId) {\n  onPositionChangedCallbackId_ = callbackId;\n}\n\nvoid AudioFileSourceNode::unregisterOnPositionChangedCallback(uint64_t callbackId) {\n  audioEventHandlerRegistry_->unregisterHandler(AudioEvent::POSITION_CHANGED, callbackId);\n}\n\nvoid AudioFileSourceNode::sendOnPositionChangedEvent(int framesPlayed) {\n  currentTime_.fetch_add(framesPlayed / sampleRate_);\n  if (onPositionChangedCallbackId_ != 0 &&\n      (onPositionChangedFlush_.load(std::memory_order_acquire) ||\n       onPositionChangedTime_ > onPositionChangedInterval_)) {\n    std::unordered_map<std::string, EventValue> body = {{\"value\", getCurrentTime()}};\n\n    audioEventHandlerRegistry_->invokeHandlerWithEventBody(\n        AudioEvent::POSITION_CHANGED, onPositionChangedCallbackId_, body);\n\n    onPositionChangedTime_ = 0;\n    onPositionChangedFlush_.store(false, std::memory_order_release);\n  }\n\n  onPositionChangedTime_ += framesPlayed;\n}\n\nvoid AudioFileSourceNode::initDecoders(\n    bool useFilePath,\n    const std::shared_ptr<BaseAudioContext> &context,\n    const std::shared_ptr<AudioFileDecoderState> &state) {\n  bool ok = false;\n  if (requiresFFmpeg_) {\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n    decoder_ = std::make_unique<ffmpegdecoder::FFmpegDecoder>();\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n  } else {\n    decoder_ = std::make_unique<miniaudio_decoder::MiniAudioDecoder>();\n  }\n  if (useFilePath) {\n    ok = decoder_->openFile(static_cast<int>(context->getSampleRate()), state->filePath);\n  } else {\n    ok = decoder_->openMemory(\n        static_cast<int>(context->getSampleRate()),\n        state->memoryData.data(),\n        state->memoryData.size());\n  }\n  if (ok) {\n    state->channels = decoder_->outputChannels();\n    state->sampleRate = static_cast<float>(decoder_->outputSampleRate());\n    duration_ = static_cast<double>(decoder_->getDurationInSeconds());\n  } else {\n    decoder_->close();\n  }\n  state->interleavedBuffer.resize(static_cast<size_t>(RENDER_QUANTUM_SIZE) * state->channels);\n  decoderState_ = state;\n  channelCount_ = decoderState_->channels;\n  sampleRate_ = decoderState_->sampleRate;\n  audioBuffer_ = std::make_shared<DSPAudioBuffer>(\n      static_cast<size_t>(RENDER_QUANTUM_SIZE), channelCount_, context->getSampleRate());\n}\n\nvoid AudioFileSourceNode::start(double when) {\n  AudioScheduledSourceNode::start(when);\n  filePaused_ = false;\n}\n\nvoid AudioFileSourceNode::pause() {\n  filePaused_ = true;\n}\n\nvoid AudioFileSourceNode::disable() {\n  seekOffloader_.reset();\n  filePaused_ = false;\n  if (decoder_ != nullptr) {\n    decoder_->close();\n  }\n  AudioScheduledSourceNode::disable();\n}\n\nsize_t AudioFileSourceNode::readFrames(float *buf, size_t frameCount) {\n  if (pendingOffloadedSeeks_.load(std::memory_order_acquire) > 0) {\n    return 0;\n  }\n  return decoder_->readPcmFrames(buf, frameCount);\n}\n\nbool AudioFileSourceNode::seekDecoderToTime(double seconds) {\n  return decoder_->seekToTime(seconds);\n}\n\nvoid AudioFileSourceNode::applyPlaybackStateAfterSuccessfulSeek(double seconds) {\n  currentTime_.store(seconds, std::memory_order_release);\n  onPositionChangedFlush_.store(true, std::memory_order_release);\n}\n\nvoid AudioFileSourceNode::runOffloadedSeekTask(OffloadedSeekRequest req) {\n  if (decoderState_ == nullptr) {\n    pendingOffloadedSeeks_.fetch_sub(1, std::memory_order_acq_rel);\n    return;\n  }\n  if (seekDecoderToTime(req.seconds)) {\n    applyPlaybackStateAfterSuccessfulSeek(req.seconds);\n  }\n  pendingOffloadedSeeks_.fetch_sub(1, std::memory_order_acq_rel);\n}\n\nvoid AudioFileSourceNode::seekToTime(double seconds) {\n  if (decoderState_ == nullptr) {\n    return;\n  }\n  const double dur = duration_;\n  if (dur > 0) {\n    seconds = std::clamp(seconds, 0.0, dur);\n  } else {\n    seconds = std::max(0.0, seconds);\n  }\n  pendingOffloadedSeeks_.fetch_add(1, std::memory_order_acq_rel);\n  seekOffloader_->getSender()->send(OffloadedSeekRequest{seconds});\n}\n\nvoid AudioFileSourceNode::writeInterleavedToBufferAtOffset(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    const AudioFileDecoderState &state,\n    size_t destFrameOffset,\n    size_t frameCount) const {\n  if (frameCount == 0 || volume_ == 0.0f) {\n    return;\n  }\n  processingBuffer->deinterleaveFrom(state.interleavedBuffer.data(), frameCount);\n  processingBuffer->scale(volume_);\n}\n\nsize_t AudioFileSourceNode::handleEof(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    size_t regionFrames,\n    size_t framesRead,\n    size_t destFrameOffset) {\n  if (!loop_) {\n    return framesRead;\n  }\n\n  if (!seekDecoderToTime(0)) {\n    return framesRead;\n  }\n\n  const size_t toFill = regionFrames - framesRead;\n  if (toFill == 0) {\n    return framesRead;\n  }\n\n  auto &state = *decoderState_;\n  const size_t extra = readFrames(state.interleavedBuffer.data(), toFill);\n\n  if (volume_ != 0.0f) {\n    writeInterleavedToBufferAtOffset(processingBuffer, state, destFrameOffset + framesRead, extra);\n  }\n\n  return framesRead + extra;\n}\n\nstd::shared_ptr<DSPAudioBuffer> AudioFileSourceNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  if (decoderState_ == nullptr || decoder_ == nullptr || !decoder_->isOpen()) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  if (pendingOffloadedSeeks_.load(std::memory_order_acquire) > 0) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  if (filePaused_) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  size_t startOffset = 0;\n  size_t offsetLength = 0;\n  updatePlaybackInfo(\n      processingBuffer,\n      framesToProcess,\n      startOffset,\n      offsetLength,\n      context->getSampleRate(),\n      context->getCurrentSampleFrame());\n\n  if (!isPlaying() && !isStopScheduled()) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  auto &state = *decoderState_;\n\n  size_t framesRead = readFrames(state.interleavedBuffer.data(), offsetLength);\n  sendOnPositionChangedEvent(static_cast<int>(framesRead));\n\n  if (volume_ != 0.0f && framesRead > 0) {\n    writeInterleavedToBufferAtOffset(processingBuffer, state, startOffset, framesRead);\n  }\n\n  if (framesRead < offsetLength) {\n    if (!loop_) {\n      currentTime_.store(duration_, std::memory_order_release);\n      onPositionChangedFlush_.store(true, std::memory_order_release);\n      sendOnPositionChangedEvent(static_cast<int>(offsetLength - framesRead));\n      filePaused_ = true;\n      playbackState_ = PlaybackState::STOP_SCHEDULED;\n      processingBuffer->zero(startOffset + framesRead, offsetLength - framesRead);\n    } else {\n      const size_t totalFilled = handleEof(processingBuffer, offsetLength, framesRead, startOffset);\n      onPositionChangedFlush_.store(true, std::memory_order_release);\n      currentTime_.store(0, std::memory_order_release);\n      sendOnPositionChangedEvent(static_cast<int>(totalFilled));\n      processingBuffer->zero(startOffset + totalFilled, offsetLength - totalFilled);\n    }\n  }\n\n  if (isStopScheduled()) {\n    handleStopScheduled();\n  }\n\n  return processingBuffer;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioFileSourceNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/sources/AudioScheduledSourceNode.h>\n#include <audioapi/libs/decoding/IncrementalAudioDecoder.h>\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n#include <audioapi/libs/ffmpeg/FFmpegDecoding.h>\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n#include <audioapi/libs/miniaudio/MiniAudioDecoding.h>\n#include <audioapi/utils/TaskOffloader.hpp>\n\n#include <atomic>\n#include <memory>\n#include <string>\n#include <vector>\n\nusing namespace audioapi::channels;\n\nnamespace audioapi {\n\nstruct AudioFileSourceOptions;\n\nstruct OffloadedSeekRequest {\n  double seconds = 0;\n  OffloadedSeekRequest() = default;\n  explicit OffloadedSeekRequest(double t) : seconds(t) {}\n};\n\nstruct AudioFileDecoderState {\n  std::vector<uint8_t> memoryData;\n  std::string filePath;\n  std::vector<float> interleavedBuffer;\n  int channels = 0;\n  float sampleRate = 0;\n};\n\nclass AudioFileSourceNode : public AudioScheduledSourceNode {\n public:\n  explicit AudioFileSourceNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const AudioFileSourceOptions &options);\n  ~AudioFileSourceNode() override = default;\n\n  void disable() override;\n\n  void start(double when) override;\n\n  void setVolume(float v) {\n    volume_ = v;\n  }\n\n  void pause();\n\n  /// @note Audio Thread only\n  void setOnPositionChangedCallbackId(uint64_t callbackId);\n  void unregisterOnPositionChangedCallback(uint64_t callbackId);\n\n  void setLoop(bool v) {\n    loop_ = v;\n  }\n\n  double getDuration() const {\n    return duration_;\n  }\n\n  double getCurrentTime() const {\n    return currentTime_.load(std::memory_order_acquire);\n  }\n\n  void seekToTime(double seconds);\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  void initDecoders(\n      bool useFilePath,\n      const std::shared_ptr<BaseAudioContext> &context,\n      const std::shared_ptr<AudioFileDecoderState> &state);\n\n  std::shared_ptr<AudioFileDecoderState> decoderState_;\n  std::unique_ptr<decoding::IIncrementalAudioDecoder> decoder_;\n  float volume_;\n  bool requiresFFmpeg_;\n  bool filePaused_{false};\n  bool loop_{false};\n  double duration_{0};\n  std::atomic<double> currentTime_{0};\n  double sampleRate_{0};\n  static constexpr double ON_POSITION_CHANGED_INTERVAL = 0.25f;\n  static constexpr int SEEK_OFFLOADER_WORKER_COUNT = 16;\n\n  size_t readFrames(float *buf, size_t frameCount);\n  bool seekDecoderToTime(double seconds);\n  void writeInterleavedToBufferAtOffset(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      const AudioFileDecoderState &state,\n      size_t destFrameOffset,\n      size_t frameCount) const;\n  size_t handleEof(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      size_t regionFrames,\n      size_t framesRead,\n      size_t destFrameOffset);\n\n  void sendOnPositionChangedEvent(int framesPlayed);\n\n  void applyPlaybackStateAfterSuccessfulSeek(double seconds);\n  void runOffloadedSeekTask(OffloadedSeekRequest req);\n\n  uint64_t onPositionChangedCallbackId_ = 0;\n  int onPositionChangedInterval_;\n  int onPositionChangedTime_ = 0;\n  std::atomic<bool> onPositionChangedFlush_{true};\n\n  /// Pending offloaded seeks; while > 0 the audio thread must not read the decoder (outputs silence).\n  std::atomic<int> pendingOffloadedSeeks_{0};\n\n  std::unique_ptr<task_offloader::TaskOffloader<\n      OffloadedSeekRequest,\n      spsc::OverflowStrategy::OVERWRITE_ON_FULL,\n      spsc::WaitStrategy::ATOMIC_WAIT>>\n      seekOffloader_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.cpp",
    "content": "#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/AudioScheduledSourceNode.h>\n#include <audioapi/core/utils/AudioGraphManager.h>\n#include <audioapi/dsp/AudioUtils.hpp>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#if !RN_AUDIO_API_TEST\n#include <audioapi/core/AudioContext.h>\n#endif // RN_AUDIO_API_TEST\n\n#include <algorithm>\n#include <limits>\n#include <memory>\n\nnamespace audioapi {\n\nAudioScheduledSourceNode::AudioScheduledSourceNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const AudioScheduledSourceNodeOptions &options)\n    : AudioNode(context, options),\n      startTime_(-1.0),\n      stopTime_(-1.0),\n      playbackState_(PlaybackState::UNSCHEDULED),\n      audioEventHandlerRegistry_(context->getAudioEventHandlerRegistry()) {}\n\nvoid AudioScheduledSourceNode::start(double when) {\n#if !RN_AUDIO_API_TEST\n  if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n    if (auto *audioContext = dynamic_cast<AudioContext *>(context.get())) {\n      audioContext->start();\n    }\n  }\n#endif // RN_AUDIO_API_TEST\n\n  playbackState_ = PlaybackState::SCHEDULED;\n  startTime_ = when;\n}\n\nvoid AudioScheduledSourceNode::stop(double when) {\n  stopTime_ = when;\n}\n\nbool AudioScheduledSourceNode::isUnscheduled() {\n  return playbackState_ == PlaybackState::UNSCHEDULED;\n}\n\nbool AudioScheduledSourceNode::isScheduled() {\n  return playbackState_ == PlaybackState::SCHEDULED;\n}\n\nbool AudioScheduledSourceNode::isPlaying() {\n  return playbackState_ == PlaybackState::PLAYING;\n}\n\nbool AudioScheduledSourceNode::isFinished() {\n  return playbackState_ == PlaybackState::FINISHED;\n}\n\nbool AudioScheduledSourceNode::isStopScheduled() {\n  return playbackState_ == PlaybackState::STOP_SCHEDULED;\n}\n\nvoid AudioScheduledSourceNode::setOnEndedCallbackId(const uint64_t callbackId) {\n  onEndedCallbackId_ = callbackId;\n}\n\nvoid AudioScheduledSourceNode::unregisterOnEndedCallback(uint64_t callbackId) {\n  audioEventHandlerRegistry_->unregisterHandler(AudioEvent::ENDED, callbackId);\n}\n\nvoid AudioScheduledSourceNode::updatePlaybackInfo(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess,\n    size_t &startOffset,\n    size_t &nonSilentFramesToProcess,\n    float sampleRate,\n    size_t currentSampleFrame) {\n  auto firstFrame = currentSampleFrame;\n  size_t lastFrame = firstFrame + framesToProcess - 1;\n\n  size_t startFrame = std::max(dsp::timeToSampleFrame(startTime_, sampleRate), firstFrame);\n  size_t stopFrame = stopTime_ == -1.0 ? std::numeric_limits<size_t>::max()\n                                       : dsp::timeToSampleFrame(stopTime_, sampleRate);\n  if (isFinished()) {\n    startOffset = 0;\n    nonSilentFramesToProcess = 0;\n    return;\n  }\n\n  if (isScheduled()) {\n    // not yet playing\n    if (startFrame > lastFrame) {\n      startOffset = 0;\n      nonSilentFramesToProcess = 0;\n      return;\n    }\n\n    // start playing\n    // zero first frames before starting frame\n    playbackState_ = PlaybackState::PLAYING;\n    startOffset = std::max(startFrame, firstFrame) - firstFrame > 0\n        ? std::max(startFrame, firstFrame) - firstFrame\n        : 0;\n    nonSilentFramesToProcess =\n        std::max(std::min(lastFrame, stopFrame) + 1, startFrame) - startFrame;\n\n    assert(startOffset <= framesToProcess);\n    assert(nonSilentFramesToProcess <= framesToProcess);\n\n    // stop will happen in the same render quantum\n    if (stopFrame <= lastFrame && stopFrame >= firstFrame) {\n      playbackState_ = PlaybackState::STOP_SCHEDULED;\n      processingBuffer->zero(stopFrame - firstFrame, lastFrame - stopFrame);\n    }\n\n    processingBuffer->zero(0, startOffset);\n    return;\n  }\n\n  // the node is playing\n\n  // stop will happen in this render quantum\n  // zero remaining frames after stop frame\n  if (stopFrame <= lastFrame && stopFrame >= firstFrame) {\n    playbackState_ = PlaybackState::STOP_SCHEDULED;\n    startOffset = 0;\n    nonSilentFramesToProcess = stopFrame - firstFrame;\n\n    assert(startOffset <= framesToProcess);\n    assert(nonSilentFramesToProcess <= framesToProcess);\n\n    processingBuffer->zero(stopFrame - firstFrame, lastFrame - stopFrame);\n    return;\n  }\n\n  // mark as finished in first silent render quantum\n  if (stopFrame < firstFrame) {\n    startOffset = 0;\n    nonSilentFramesToProcess = 0;\n\n    playbackState_ = PlaybackState::STOP_SCHEDULED;\n    handleStopScheduled();\n    return;\n  }\n\n  if (isUnscheduled()) {\n    startOffset = 0;\n    nonSilentFramesToProcess = 0;\n    return;\n  }\n\n  // normal \"mid-buffer\" playback\n  startOffset = 0;\n  nonSilentFramesToProcess = framesToProcess;\n}\n\nvoid AudioScheduledSourceNode::disable() {\n  AudioNode::disable();\n\n  if (onEndedCallbackId_ != 0) {\n    audioEventHandlerRegistry_->invokeHandlerWithEventBody(\n        AudioEvent::ENDED, onEndedCallbackId_, {});\n  }\n}\n\nvoid AudioScheduledSourceNode::handleStopScheduled() {\n  if (isStopScheduled()) {\n    playbackState_ = PlaybackState::FINISHED;\n    disable();\n  }\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/AudioScheduledSourceNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/types/NodeOptions.h>\n\n#include <cassert>\n#include <cstddef>\n#include <cstdint>\n#include <memory>\n\nnamespace audioapi {\n\nclass IAudioEventHandlerRegistry;\n\nclass AudioScheduledSourceNode : public AudioNode {\n public:\n  // UNSCHEDULED: The node is not scheduled to play.\n  // SCHEDULED: The node is scheduled to play at a specific time.\n  // PLAYING: The node is currently playing.\n  // STOP_SCHEDULED: The node is scheduled to stop at a specific time, but is still playing.\n  // FINISHED: The node has finished playing.\n  enum class PlaybackState : std::uint8_t {\n    UNSCHEDULED,\n    SCHEDULED,\n    PLAYING,\n    STOP_SCHEDULED,\n    FINISHED\n  };\n  explicit AudioScheduledSourceNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const AudioScheduledSourceNodeOptions &options = AudioScheduledSourceNodeOptions());\n\n  virtual void start(double when);\n  virtual void stop(double when);\n\n  /// @note Audio Thread only\n  bool isUnscheduled();\n\n  /// @note Audio Thread only\n  bool isScheduled();\n\n  /// @note Audio Thread only\n  bool isPlaying();\n\n  /// @note Audio Thread only\n  bool isFinished();\n\n  /// @note Audio Thread only\n  bool isStopScheduled();\n\n  /// @note Audio Thread only\n  void setOnEndedCallbackId(uint64_t callbackId);\n\n  void disable() override;\n\n  void unregisterOnEndedCallback(uint64_t callbackId);\n\n protected:\n  double startTime_;\n  double stopTime_;\n\n  PlaybackState playbackState_;\n\n  uint64_t onEndedCallbackId_ = 0;\n  const std::shared_ptr<IAudioEventHandlerRegistry> audioEventHandlerRegistry_;\n\n  void updatePlaybackInfo(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess,\n      size_t &startOffset,\n      size_t &nonSilentFramesToProcess,\n      float sampleRate,\n      size_t currentSampleFrame);\n\n  void handleStopScheduled();\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/ConstantSourceNode.cpp",
    "content": "#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/ConstantSourceNode.h>\n#include <audioapi/dsp/AudioUtils.hpp>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <memory>\n\nnamespace audioapi {\nConstantSourceNode::ConstantSourceNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const ConstantSourceOptions &options)\n    : AudioScheduledSourceNode(context),\n      offsetParam_(\n          std::make_shared<AudioParam>(\n              options.offset,\n              MOST_NEGATIVE_SINGLE_FLOAT,\n              MOST_POSITIVE_SINGLE_FLOAT,\n              context)) {\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nstd::shared_ptr<AudioParam> ConstantSourceNode::getOffsetParam() const {\n  return offsetParam_;\n}\n\nstd::shared_ptr<DSPAudioBuffer> ConstantSourceNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  size_t startOffset = 0;\n  size_t offsetLength = 0;\n\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  updatePlaybackInfo(\n      processingBuffer,\n      framesToProcess,\n      startOffset,\n      offsetLength,\n      context->getSampleRate(),\n      context->getCurrentSampleFrame());\n\n  if (!isPlaying() && !isStopScheduled()) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  auto *offsetChannel =\n      offsetParam_->processARateParam(framesToProcess, context->getCurrentTime())->getChannel(0);\n\n  for (size_t channel = 0; channel < processingBuffer->getNumberOfChannels(); ++channel) {\n    processingBuffer->getChannel(channel)->copy(\n        *offsetChannel, startOffset, startOffset, offsetLength);\n  }\n\n  if (isStopScheduled()) {\n    handleStopScheduled();\n  }\n\n  return processingBuffer;\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/ConstantSourceNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioParam.h>\n#include <audioapi/core/sources/AudioScheduledSourceNode.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <memory>\n\nnamespace audioapi {\n\nstruct ConstantSourceOptions;\n\nclass ConstantSourceNode : public AudioScheduledSourceNode {\n public:\n  explicit ConstantSourceNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const ConstantSourceOptions &options);\n\n  [[nodiscard]] std::shared_ptr<AudioParam> getOffsetParam() const;\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  const std::shared_ptr<AudioParam> offsetParam_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/OscillatorNode.cpp",
    "content": "#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/OscillatorNode.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/dsp/AudioUtils.hpp>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <memory>\n\nnamespace audioapi {\n\nOscillatorNode::OscillatorNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const OscillatorOptions &options)\n    : AudioScheduledSourceNode(context, options), type_(options.type) {\n  frequencyParam_ = std::make_shared<AudioParam>(\n      options.frequency, -getNyquistFrequency(), getNyquistFrequency(), context);\n  detuneParam_ = std::make_shared<AudioParam>(\n      options.detune,\n      -static_cast<float>(OCTAVE_RANGE) * LOG2_MOST_POSITIVE_SINGLE_FLOAT,\n      static_cast<float>(OCTAVE_RANGE) * LOG2_MOST_POSITIVE_SINGLE_FLOAT,\n      context);\n  if (options.periodicWave) {\n    periodicWave_ = options.periodicWave;\n  } else {\n    periodicWave_ = context->getBasicWaveForm(type_);\n  }\n\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nstd::shared_ptr<AudioParam> OscillatorNode::getFrequencyParam() const {\n  return frequencyParam_;\n}\n\nstd::shared_ptr<AudioParam> OscillatorNode::getDetuneParam() const {\n  return detuneParam_;\n}\n\nvoid OscillatorNode::setType(OscillatorType type) {\n  if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n    type_ = type;\n    periodicWave_ = context->getBasicWaveForm(type_);\n  }\n}\n\nvoid OscillatorNode::setPeriodicWave(const std::shared_ptr<PeriodicWave> &periodicWave) {\n  periodicWave_ = periodicWave;\n  type_ = OscillatorType::CUSTOM;\n}\n\nstd::shared_ptr<DSPAudioBuffer> OscillatorNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  size_t startOffset = 0;\n  size_t offsetLength = 0;\n\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  updatePlaybackInfo(\n      processingBuffer,\n      framesToProcess,\n      startOffset,\n      offsetLength,\n      context->getSampleRate(),\n      context->getCurrentSampleFrame());\n\n  if (!isPlaying() && !isStopScheduled()) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  auto time =\n      context->getCurrentTime() + static_cast<double>(startOffset) / context->getSampleRate();\n  auto detuneSpan = detuneParam_->processARateParam(framesToProcess, time)->getChannel(0)->span();\n  auto freqSpan = frequencyParam_->processARateParam(framesToProcess, time)->getChannel(0)->span();\n\n  const auto tableSize = static_cast<float>(periodicWave_->getPeriodicWaveSize());\n  const auto tableScale = periodicWave_->getScale();\n  const auto numChannels = processingBuffer->getNumberOfChannels();\n\n  auto channelSpan = processingBuffer->getChannel(0)->span();\n  float currentPhase = phase_;\n\n  for (size_t i = startOffset; i < offsetLength; i += 1) {\n    auto detuneRatio = detuneSpan[i] == 0 ? 1.0f : exp2f(detuneSpan[i] * CENTS_TO_RATIO);\n    auto detunedFrequency = freqSpan[i] * detuneRatio;\n    auto phaseIncrement = detunedFrequency * tableScale;\n\n    channelSpan[i] = periodicWave_->getSample(detunedFrequency, currentPhase, phaseIncrement);\n\n    currentPhase += phaseIncrement;\n\n    if (currentPhase >= tableSize) {\n      currentPhase -= tableSize;\n    } else if (currentPhase < 0.0f) {\n      currentPhase += tableSize;\n    }\n  }\n\n  phase_ = currentPhase;\n\n  for (size_t ch = 1; ch < numChannels; ch += 1) {\n    processingBuffer->getChannel(ch)->copy(*processingBuffer->getChannel(0));\n  }\n  handleStopScheduled();\n\n  return processingBuffer;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/OscillatorNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioParam.h>\n#include <audioapi/core/effects/PeriodicWave.h>\n#include <audioapi/core/sources/AudioScheduledSourceNode.h>\n#include <audioapi/core/types/OscillatorType.h>\n\n#include <memory>\n\nnamespace audioapi {\n\nstruct OscillatorOptions;\n\nclass OscillatorNode : public AudioScheduledSourceNode {\n public:\n  explicit OscillatorNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const OscillatorOptions &options);\n\n  [[nodiscard]] std::shared_ptr<AudioParam> getFrequencyParam() const;\n  [[nodiscard]] std::shared_ptr<AudioParam> getDetuneParam() const;\n\n  /// @note Audio Thread only\n  void setType(OscillatorType);\n\n  /// @note Audio Thread only\n  void setPeriodicWave(const std::shared_ptr<PeriodicWave> &periodicWave);\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  std::shared_ptr<AudioParam> frequencyParam_;\n  std::shared_ptr<AudioParam> detuneParam_;\n  OscillatorType type_;\n  float phase_ = 0.0;\n  std::shared_ptr<PeriodicWave> periodicWave_;\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/RecorderAdapterNode.cpp",
    "content": "\n#include <audioapi/core/sources/RecorderAdapterNode.h>\n#include <audioapi/core/types/ChannelInterpretation.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <algorithm>\n#include <cmath>\n#include <cstring>\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\nRecorderAdapterNode::RecorderAdapterNode(const std::shared_ptr<BaseAudioContext> &context)\n    : AudioNode(context, AudioScheduledSourceNodeOptions()) {\n  // It should be marked as initialized only after it is connected to the\n  // recorder. Internal buffer size is based on the recorder's buffer length.\n  isInitialized_.store(false, std::memory_order_release);\n}\n\nvoid RecorderAdapterNode::init(size_t bufferSize, int channelCount, float sampleRate) {\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (isInitialized_.load(std::memory_order_acquire) || context == nullptr) {\n    return;\n  }\n\n  channelCount_ = channelCount;\n\n  buff_.resize(channelCount_);\n\n  for (int i = 0; i < channelCount_; ++i) {\n    buff_[i] = std::make_shared<CircularOverflowableAudioArray>(bufferSize);\n  }\n\n  float contextSampleRate = context->getSampleRate();\n  needsResampling_ = static_cast<int>(sampleRate) != static_cast<int>(contextSampleRate);\n\n  adapterOutputBuffer_ =\n      std::make_shared<AudioBuffer>(RENDER_QUANTUM_SIZE, channelCount_, contextSampleRate);\n\n  if (needsResampling_) {\n    inputChunkSize_ =\n        static_cast<size_t>(std::ceil(RENDER_QUANTUM_SIZE * sampleRate / contextSampleRate)) + 4;\n\n    resampler_ = std::make_unique<r8b::MultiChannelResampler>(\n        sampleRate, contextSampleRate, channelCount_, static_cast<int>(inputChunkSize_));\n\n    const int maxOutLen = resampler_->getMaxOutLen();\n\n    resamplerInputBuffer_ = AudioBuffer(inputChunkSize_, channelCount_, sampleRate);\n    resamplerOutputBuffer_ =\n        AudioBuffer(static_cast<size_t>(maxOutLen), channelCount_, contextSampleRate);\n    overflowBuffer_ = AudioBuffer(2 * maxOutLen, channelCount_, contextSampleRate);\n    overflowSize_ = 0;\n  }\n\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nvoid RecorderAdapterNode::adapterCleanup() {\n  needsResampling_ = false;\n  buff_.clear();\n  resampler_.reset();\n  overflowSize_ = 0;\n\n  isInitialized_.store(false, std::memory_order_release);\n}\n\nstd::shared_ptr<DSPAudioBuffer> RecorderAdapterNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  if (!isInitialized_.load(std::memory_order_acquire)) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  if (needsResampling_) {\n    processResampled(framesToProcess);\n  } else {\n    readFrames(*adapterOutputBuffer_, framesToProcess);\n  }\n\n  processingBuffer->sum(*adapterOutputBuffer_, ChannelInterpretation::SPEAKERS);\n  return processingBuffer;\n}\n\nvoid RecorderAdapterNode::processResampled(int framesToProcess) {\n  adapterOutputBuffer_->zero();\n\n  size_t outputWritten = 0;\n  const auto needed = static_cast<size_t>(framesToProcess);\n\n  // Drain leftover resampled samples from the previous call\n  if (overflowSize_ > 0) {\n    const size_t toCopy = std::min(overflowSize_, needed);\n\n    adapterOutputBuffer_->copy(overflowBuffer_, 0, 0, toCopy);\n    outputWritten = toCopy;\n\n    if (toCopy < overflowSize_) {\n      const size_t remaining = overflowSize_ - toCopy;\n      for (int ch = 0; ch < channelCount_; ++ch) {\n        overflowBuffer_[ch].copyWithin(toCopy, 0, remaining);\n      }\n    }\n    overflowSize_ -= toCopy;\n  }\n\n  // Feed the resampler until we have enough output frames\n  while (outputWritten < needed) {\n    readFrames(resamplerInputBuffer_, inputChunkSize_);\n\n    const int outLen = resampler_->process(\n        resamplerInputBuffer_, static_cast<int>(inputChunkSize_), resamplerOutputBuffer_);\n\n    const size_t remaining = needed - outputWritten;\n    const size_t toCopy = std::min(static_cast<size_t>(outLen), remaining);\n\n    // Write resampled frames into the output buffer\n    adapterOutputBuffer_->copy(resamplerOutputBuffer_, 0, outputWritten, toCopy);\n    outputWritten += toCopy;\n\n    // Stash excess for the next processNode call\n    const int excess = outLen - static_cast<int>(toCopy);\n    if (excess > 0) {\n      overflowBuffer_.copy(\n          resamplerOutputBuffer_, toCopy, overflowSize_, static_cast<size_t>(excess));\n      overflowSize_ += static_cast<size_t>(excess);\n    }\n  }\n}\n\nvoid RecorderAdapterNode::readFrames(AudioBuffer &target, const size_t framesToRead) {\n  target.zero();\n\n  for (size_t channel = 0; channel < channelCount_; ++channel) {\n    buff_[channel]->read(*target.getChannel(channel), framesToRead);\n  }\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/RecorderAdapterNode.h",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/AudioParam.h>\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/inputs/AudioRecorder.h>\n#include <audioapi/dsp/r8brain/Resampler.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/CircularOverflowableAudioArray.h>\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\n/// @brief RecorderAdapterNode is an AudioNode which adapts push Recorder into pull graph.\n/// It uses RingBuffer to store audio data and AudioParam to provide audio data in pull mode.\n/// It is used to connect native audio recording APIs with Audio API.\n///\n/// @note it will push silence if it is not connected to any Recorder\nclass RecorderAdapterNode : public AudioNode {\n public:\n  explicit RecorderAdapterNode(const std::shared_ptr<BaseAudioContext> &context);\n\n  /// @brief Initialize the RecorderAdapterNode with a buffer size and channel count.\n  /// @note This method should be called ONLY ONCE when the buffer size is known.\n  /// @param bufferSize The size of the buffer to be used.\n  /// @param channelCount The number of channels.\n  /// @param sampleRate The recorder's native sample rate.\n  void init(size_t bufferSize, int channelCount, float sampleRate);\n  void adapterCleanup();\n\n  // TODO: CircularOverflowableAudioBuffer\n  std::vector<std::shared_ptr<CircularOverflowableAudioArray>> buff_;\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n  std::shared_ptr<AudioBuffer> adapterOutputBuffer_;\n\n private:\n  void readFrames(AudioBuffer &target, size_t framesToRead);\n  void processResampled(int framesToProcess);\n\n  std::unique_ptr<r8b::MultiChannelResampler> resampler_;\n  bool needsResampling_ = false;\n\n  // Number of input frames (at recorder rate) to feed per render quantum\n  size_t inputChunkSize_ = 0;\n  AudioBuffer resamplerInputBuffer_;\n  AudioBuffer resamplerOutputBuffer_;\n\n  // Accumulates resampled output across calls\n  AudioBuffer overflowBuffer_;\n  size_t overflowSize_ = 0;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/StreamerNode.cpp",
    "content": "/*\n * This file dynamically links to the FFmpeg library, which is licensed under\n * the GNU Lesser General Public License (LGPL) version 2.1 or later.\n *\n * Our own code in this file is licensed under the MIT License and dynamic\n * linking allows you to use this code without your entire project being subject\n * to the terms of the LGPL. However, note that if you link statically to\n * FFmpeg, you must comply with the terms of the LGPL for FFmpeg itself.\n */\n\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/StreamerNode.h>\n#include <audioapi/core/utils/Locker.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <algorithm>\n#include <cstdint>\n#include <cstdio>\n#include <cstring>\n#include <memory>\n#include <string>\n#include <utility>\n\nnamespace audioapi {\n#if !RN_AUDIO_API_FFMPEG_DISABLED\nStreamerNode::StreamerNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const StreamerOptions &options)\n    : AudioScheduledSourceNode(context, options),\n      fmtCtx_(nullptr),\n      codecCtx_(nullptr),\n      decoder_(nullptr),\n      codecpar_(nullptr),\n      pkt_(nullptr),\n      frame_(nullptr),\n      swrCtx_(nullptr),\n      hasBufferedAudioData_(false),\n      audio_stream_index_(-1),\n      maxResampledSamples_(0),\n      processedSamples_(0) {\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n  initialize(options.streamPath);\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n}\n#else\nStreamerNode::StreamerNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    const StreamerOptions &options)\n    : AudioScheduledSourceNode(context) {}\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n\nStreamerNode::~StreamerNode() {\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n  cleanup();\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n}\n\nstd::shared_ptr<DSPAudioBuffer> StreamerNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n  size_t startOffset = 0;\n  size_t offsetLength = 0;\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n  updatePlaybackInfo(\n      processingBuffer,\n      framesToProcess,\n      startOffset,\n      offsetLength,\n      context->getSampleRate(),\n      context->getCurrentSampleFrame());\n  isNodeFinished_.store(isFinished(), std::memory_order_release);\n\n  if (!isPlaying() && !isStopScheduled()) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  auto bufferRemaining = static_cast<int>(bufferedAudioData_.size - processedSamples_);\n  int alreadyProcessed = 0;\n  if (bufferRemaining < framesToProcess) {\n    if (hasBufferedAudioData_) {\n      processingBuffer->copy(bufferedAudioData_.buffer, processedSamples_, 0, bufferRemaining);\n      framesToProcess -= bufferRemaining;\n      alreadyProcessed += bufferRemaining;\n    }\n    StreamingData data;\n    auto res = receiver_.try_receive(data);\n    auto success = res == channels::spsc::ResponseStatus::SUCCESS;\n    hasBufferedAudioData_ = success;\n    if (success) {\n      bufferedAudioData_ = std::move(data);\n      processedSamples_ = 0;\n    }\n  }\n  if (hasBufferedAudioData_ && framesToProcess > 0) {\n    processingBuffer->copy(\n        bufferedAudioData_.buffer, processedSamples_, alreadyProcessed, framesToProcess);\n    processedSamples_ += framesToProcess;\n  }\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n\n  return processingBuffer;\n}\n\n#if !RN_AUDIO_API_FFMPEG_DISABLED\nbool StreamerNode::initialize(const std::string &input_url) {\n  streamPath_ = input_url;\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr) {\n    return false;\n  }\n\n  if (isInitialized_.load(std::memory_order_acquire)) {\n    return false;\n  }\n\n  if (!openInput(input_url)) {\n    if (VERBOSE)\n      printf(\"Failed to open input\\n\");\n    return false;\n  }\n\n  if (!findAudioStream() || !setupDecoder() || !setupResampler(context->getSampleRate())) {\n    if (VERBOSE)\n      printf(\"Failed to find/setup audio stream\\n\");\n    cleanup();\n    return false;\n  }\n\n  pkt_ = av_packet_alloc();\n  frame_ = av_frame_alloc();\n\n  if (pkt_ == nullptr || frame_ == nullptr) {\n    if (VERBOSE)\n      printf(\"Failed to allocate packet or frame\\n\");\n    cleanup();\n    return false;\n  }\n\n  channelCount_ = codecpar_->ch_layout.nb_channels;\n  audioBuffer_ = std::make_shared<DSPAudioBuffer>(\n      RENDER_QUANTUM_SIZE, channelCount_, context->getSampleRate());\n\n  auto [sender, receiver] = channels::spsc::channel<\n      StreamingData,\n      STREAMER_NODE_SPSC_OVERFLOW_STRATEGY,\n      STREAMER_NODE_SPSC_WAIT_STRATEGY>(CHANNEL_CAPACITY);\n  sender_ = std::move(sender);\n  receiver_ = std::move(receiver);\n\n  streamingThread_ = std::thread(&StreamerNode::streamAudio, this);\n  isInitialized_.store(true, std::memory_order_release);\n  return true;\n}\n\nbool StreamerNode::setupResampler(float outSampleRate) {\n  const int n = codecCtx_->ch_layout.nb_channels;\n  const int maxInLen = codecCtx_->frame_size > 0 ? codecCtx_->frame_size : 8192;\n\n  resampler_ = std::make_unique<r8b::MultiChannelResampler>(\n      codecCtx_->sample_rate, outSampleRate, n, maxInLen);\n\n  const int maxOutLen = resampler_->getMaxOutLen();\n  const size_t outputBufferSize = static_cast<size_t>(std::max(maxInLen, maxOutLen));\n\n  resamplerInputBuffer_ = AudioBuffer(static_cast<size_t>(maxInLen), n, codecCtx_->sample_rate);\n  resamplerOutputBuffer_ = AudioBuffer(outputBufferSize, n, outSampleRate);\n  outSampleRate_ = outSampleRate;\n  return true;\n}\n\nvoid StreamerNode::streamAudio() {\n  while (!isNodeFinished_.load(std::memory_order_acquire)) {\n    if (av_read_frame(fmtCtx_, pkt_) < 0) {\n      return;\n    }\n    if (pkt_->stream_index == audio_stream_index_) {\n      if (avcodec_send_packet(codecCtx_, pkt_) != 0) {\n        return;\n      }\n      if (avcodec_receive_frame(codecCtx_, frame_) != 0) {\n        return;\n      }\n      std::shared_ptr<BaseAudioContext> context = context_.lock();\n      if (context == nullptr) {\n        return;\n      }\n      processFrameWithResampler(frame_, context);\n    }\n    av_packet_unref(pkt_);\n  }\n}\n\nstatic void extractChannelAsFloat(const AVFrame *frame, int channel, float *output) {\n  const int nb = frame->nb_samples;\n\n  switch (frame->format) {\n    case AV_SAMPLE_FMT_FLTP: {\n      std::memcpy(\n          output, reinterpret_cast<const float *>(frame->data[channel]), nb * sizeof(float));\n      break;\n    }\n    case AV_SAMPLE_FMT_DBLP: {\n      auto *src = reinterpret_cast<const double *>(frame->data[channel]);\n      for (int i = 0; i < nb; ++i) {\n        output[i] = static_cast<float>(src[i]);\n      }\n      break;\n    }\n    case AV_SAMPLE_FMT_S16P: {\n      auto *src = reinterpret_cast<const int16_t *>(frame->data[channel]);\n      for (int i = 0; i < nb; ++i) {\n        output[i] = src[i] / 32768.0f;\n      }\n      break;\n    }\n    case AV_SAMPLE_FMT_S32P: {\n      auto *src = reinterpret_cast<const int32_t *>(frame->data[channel]);\n      for (int i = 0; i < nb; ++i) {\n        output[i] = src[i] / 2147483648.0f;\n      }\n      break;\n    }\n    case AV_SAMPLE_FMT_U8P: {\n      auto *src = frame->data[channel];\n      for (int i = 0; i < nb; ++i) {\n        output[i] = (src[i] - 128) / 128.0f;\n      }\n      break;\n    }\n    default:\n      std::memset(output, 0, nb * sizeof(float));\n      break;\n  }\n}\n\nvoid StreamerNode::processFrameWithResampler(\n    AVFrame *frame,\n    const std::shared_ptr<BaseAudioContext> &context) {\n  if (this->isFinished()) {\n    return;\n  }\n\n  const int numChannels = frame->ch_layout.nb_channels;\n  const int nbSamples = frame->nb_samples;\n  const bool needsResample = static_cast<int>(outSampleRate_) != frame->sample_rate;\n\n  for (int ch = 0; ch < numChannels; ++ch) {\n    extractChannelAsFloat(frame, ch, resamplerInputBuffer_[ch].begin());\n  }\n\n  int outSamples;\n  if (needsResample) {\n    outSamples = resampler_->process(resamplerInputBuffer_, nbSamples, resamplerOutputBuffer_);\n  } else {\n    outSamples = nbSamples;\n    for (int ch = 0; ch < numChannels; ++ch) {\n      resamplerOutputBuffer_[ch].copy(resamplerInputBuffer_[ch], 0, 0, nbSamples);\n    }\n  }\n\n  auto buffer = AudioBuffer(outSamples, numChannels, context->getSampleRate());\n  for (int ch = 0; ch < numChannels; ++ch) {\n    buffer[ch].copy(resamplerOutputBuffer_[ch], 0, 0, outSamples);\n  }\n\n  StreamingData data{std::move(buffer), static_cast<size_t>(outSamples)};\n  sender_.send(std::move(data));\n}\n\nbool StreamerNode::openInput(const std::string &input_url) {\n  if (avformat_open_input(&fmtCtx_, input_url.c_str(), nullptr, nullptr) < 0) {\n    return false;\n  }\n  return avformat_find_stream_info(fmtCtx_, nullptr) >= 0;\n}\n\nbool StreamerNode::findAudioStream() {\n  audio_stream_index_ = -1;\n  codecpar_ = nullptr;\n\n  for (int i = 0; i < fmtCtx_->nb_streams; ++i) {\n    if (fmtCtx_->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {\n      audio_stream_index_ = i;\n      codecpar_ = fmtCtx_->streams[i]->codecpar;\n      break;\n    }\n  }\n\n  return audio_stream_index_ >= 0 && codecpar_ != nullptr;\n}\n\nbool StreamerNode::setupDecoder() {\n  decoder_ = avcodec_find_decoder(codecpar_->codec_id);\n  if (decoder_ == nullptr) {\n    return false;\n  }\n\n  codecCtx_ = avcodec_alloc_context3(decoder_);\n  if (codecCtx_ == nullptr) {\n    return false;\n  }\n\n  if (avcodec_parameters_to_context(codecCtx_, codecpar_) < 0) {\n    return false;\n  }\n\n  return avcodec_open2(codecCtx_, decoder_, nullptr) >= 0;\n}\n\nvoid StreamerNode::cleanup() {\n  this->playbackState_ = PlaybackState::FINISHED;\n  isNodeFinished_.store(true, std::memory_order_release);\n  if (streamingThread_.joinable()) {\n    StreamingData dummy;\n    while (receiver_.try_receive(dummy) == channels::spsc::ResponseStatus::SUCCESS)\n      ; // clear the receiver\n    streamingThread_.join();\n  }\n  if (swrCtx_ != nullptr) {\n    swr_free(&swrCtx_);\n  }\n\n  if (frame_ != nullptr) {\n    av_frame_free(&frame_);\n  }\n\n  if (pkt_ != nullptr) {\n    av_packet_free(&pkt_);\n  }\n\n  if (codecCtx_ != nullptr) {\n    avcodec_free_context(&codecCtx_);\n  }\n\n  if (fmtCtx_ != nullptr) {\n    avformat_close_input(&fmtCtx_);\n  }\n\n  resampler_.reset();\n  audio_stream_index_ = -1;\n  decoder_ = nullptr;\n  codecpar_ = nullptr;\n  maxResampledSamples_ = 0;\n  isInitialized_.store(false, std::memory_order_release);\n}\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/StreamerNode.h",
    "content": "/*\n * This file dynamically links to the FFmpeg library, which is licensed under the\n * GNU Lesser General Public License (LGPL) version 2.1 or later.\n *\n * Our own code in this file is licensed under the MIT License and dynamic linking\n * allows you to use this code without your entire project being subject to the\n * terms of the LGPL. However, note that if you link statically to FFmpeg, you must\n * comply with the terms of the LGPL for FFmpeg itself.\n */\n\n#pragma once\n\n#include <audioapi/core/sources/AudioScheduledSourceNode.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#if !RN_AUDIO_API_FFMPEG_DISABLED\nextern \"C\" {\n#include <libavcodec/avcodec.h>\n#include <libavformat/avformat.h>\n#include <libavutil/channel_layout.h>\n#include <libavutil/opt.h>\n#include <libavutil/samplefmt.h>\n#include <libswresample/swresample.h>\n}\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n\n#include <audioapi/dsp/r8brain/Resampler.hpp>\n#include <audioapi/utils/SpscChannel.hpp>\n#include <atomic>\n#include <memory>\n#include <string>\n#include <utility>\n\ninline constexpr auto STREAMER_NODE_SPSC_OVERFLOW_STRATEGY =\n    audioapi::channels::spsc::OverflowStrategy::WAIT_ON_FULL;\ninline constexpr auto STREAMER_NODE_SPSC_WAIT_STRATEGY =\n    audioapi::channels::spsc::WaitStrategy::ATOMIC_WAIT;\n\ninline constexpr auto VERBOSE = false;\ninline constexpr auto CHANNEL_CAPACITY = 32;\n\nstruct StreamingData {\n  audioapi::AudioBuffer buffer;\n  size_t size;\n  StreamingData() = default;\n  StreamingData(audioapi::AudioBuffer b, size_t s) : buffer(b), size(s) {}\n  StreamingData(const StreamingData &data) : buffer(data.buffer), size(data.size) {}\n  StreamingData(StreamingData &&data) noexcept : buffer(std::move(data.buffer)), size(data.size) {}\n  StreamingData &operator=(const StreamingData &data) {\n    if (this == &data) {\n      return *this;\n    }\n    buffer = data.buffer;\n    size = data.size;\n    return *this;\n  }\n};\n\nnamespace audioapi {\n\nstruct StreamerOptions;\n\nclass StreamerNode : public AudioScheduledSourceNode {\n public:\n  explicit StreamerNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      const StreamerOptions &options);\n  ~StreamerNode() override;\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  std::string streamPath_;\n  std::unique_ptr<r8b::MultiChannelResampler> resampler_;\n  float outSampleRate_;\n\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n  AVFormatContext *fmtCtx_;\n  AVCodecContext *codecCtx_;\n  const AVCodec *decoder_;\n  AVCodecParameters *codecpar_;\n  AVPacket *pkt_;\n  AVFrame *frame_; // Frame that is currently being processed\n  SwrContext *swrCtx_;\n\n  // --resampling--\n  AudioBuffer resamplerInputBuffer_;\n  AudioBuffer resamplerOutputBuffer_;\n  StreamingData bufferedAudioData_; // audio data for buffering hls frames\n  bool hasBufferedAudioData_;\n  int audio_stream_index_; // index of the audio stream channel in the input\n  int maxResampledSamples_;\n  size_t processedSamples_;\n\n  std::thread streamingThread_;\n  std::atomic<bool> isNodeFinished_;                         // Flag to control the streaming thread\n  static constexpr int INITIAL_MAX_RESAMPLED_SAMPLES = 8192; // Initial size for resampled data\n  channels::spsc::\n      Sender<StreamingData, STREAMER_NODE_SPSC_OVERFLOW_STRATEGY, STREAMER_NODE_SPSC_WAIT_STRATEGY>\n          sender_;\n  channels::spsc::Receiver<\n      StreamingData,\n      STREAMER_NODE_SPSC_OVERFLOW_STRATEGY,\n      STREAMER_NODE_SPSC_WAIT_STRATEGY>\n      receiver_;\n\n  /// @brief Initialize the StreamerNode by opening the input stream,\n  /// finding the audio stream, setting up the decoder, and starting the streaming thread.\n  /// @param inputUrl The URL of the input stream\n  /// @return true if initialization was successful, false otherwise\n  bool initialize(const std::string &inputUrl);\n\n  /**\n   * @brief Setting up the resampler\n   * @param outSampleRate Sample rate for the output audio\n   * @return true if successful, false otherwise\n   */\n  bool setupResampler(float outSampleRate);\n\n  /**\n   * @brief Resample the audio frame, change its sample format and channel layout\n   * @param frame The AVFrame to resample\n   * @param context The context\n   */\n  void processFrameWithResampler(AVFrame *frame, const std::shared_ptr<BaseAudioContext> &context);\n\n  /**\n   * @brief Thread function to continuously read and process audio frames\n   * @details This function runs in a separate thread to avoid blocking the main audio processing thread\n   * @note It will read frames from the input stream, resample them, and store them in the buffered buffer\n   * @note The thread will stop when streamFlag is set to false\n   */\n  void streamAudio();\n\n  /** @brief Clean up resources */\n  void cleanup();\n\n  /**\n   * @brief Open the input stream\n   * @param inputUrl The URL of the input stream\n   * @return true if successful, false otherwise\n   * @note This function initializes the FFmpeg libraries and opens the input stream\n   */\n  bool openInput(const std::string &inputUrl);\n\n  /**\n   * @brief Find the audio stream channel in the input\n   * @return true if audio stream was found, false otherwise\n   */\n  bool findAudioStream();\n\n  /**\n   * @brief Set up the decoder for the audio stream\n   * @return true if successful, false otherwise\n   */\n  bool setupDecoder();\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/WorkletSourceNode.cpp",
    "content": "#include <audioapi/core/sources/WorkletSourceNode.h>\n#include <audioapi/core/utils/Constants.h>\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nWorkletSourceNode::WorkletSourceNode(\n    const std::shared_ptr<BaseAudioContext> &context,\n    WorkletsRunner &&workletRunner)\n    : AudioScheduledSourceNode(context), workletRunner_(std::move(workletRunner)) {\n  // Prepare buffers for audio processing\n  size_t outputChannelCount = this->getChannelCount();\n  outputBuffsHandles_.resize(outputChannelCount);\n  for (size_t i = 0; i < outputChannelCount; ++i) {\n    outputBuffsHandles_[i] = std::make_shared<AudioArrayBuffer>(RENDER_QUANTUM_SIZE);\n  }\n\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nstd::shared_ptr<DSPAudioBuffer> WorkletSourceNode::processNode(\n    const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n    int framesToProcess) {\n  if (isUnscheduled() || isFinished() || !isEnabled()) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  size_t startOffset = 0;\n  size_t nonSilentFramesToProcess = framesToProcess;\n\n  std::shared_ptr<BaseAudioContext> context = context_.lock();\n  if (context == nullptr) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n  updatePlaybackInfo(\n      processingBuffer,\n      framesToProcess,\n      startOffset,\n      nonSilentFramesToProcess,\n      context->getSampleRate(),\n      context->getCurrentSampleFrame());\n\n  if (nonSilentFramesToProcess == 0) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  size_t outputChannelCount = processingBuffer->getNumberOfChannels();\n\n  auto result = workletRunner_.executeOnRuntimeSync(\n      [this, nonSilentFramesToProcess, startOffset, time = context->getCurrentTime()](\n          jsi::Runtime &rt) {\n        auto jsiArray = jsi::Array(rt, this->outputBuffsHandles_.size());\n        for (size_t i = 0; i < this->outputBuffsHandles_.size(); ++i) {\n          auto arrayBuffer = jsi::ArrayBuffer(rt, this->outputBuffsHandles_[i]);\n          jsiArray.setValueAtIndex(rt, i, arrayBuffer);\n        }\n\n        // We call unsafely here because we are already on the runtime thread\n        // and the runtime is locked by executeOnRuntimeSync (if\n        // shouldLockRuntime is true)\n        return workletRunner_.callUnsafe(\n            jsiArray,\n            jsi::Value(rt, static_cast<int>(nonSilentFramesToProcess)),\n            jsi::Value(rt, time),\n            jsi::Value(rt, static_cast<int>(startOffset)));\n      });\n\n  // If the worklet execution failed, zero the output\n  // It might happen if the runtime is not available\n  if (!result.has_value()) {\n    processingBuffer->zero();\n    return processingBuffer;\n  }\n\n  // Copy the processed data back to the AudioBuffer\n  for (size_t i = 0; i < outputChannelCount; ++i) {\n    processingBuffer->getChannel(i)->copy(\n        *outputBuffsHandles_[i], 0, startOffset, nonSilentFramesToProcess);\n  }\n\n  handleStopScheduled();\n\n  return processingBuffer;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/sources/WorkletSourceNode.h",
    "content": "#pragma once\n#include <audioapi/core/BaseAudioContext.h>\n#include <audioapi/core/sources/AudioScheduledSourceNode.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/core/utils/worklets/WorkletsRunner.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioArrayBuffer.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <jsi/jsi.h>\n\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\n#if RN_AUDIO_API_TEST\nclass WorkletSourceNode : public AudioScheduledSourceNode {\n public:\n  explicit WorkletSourceNode(\n      std::shared_ptr<BaseAudioContext> context,\n      WorkletsRunner &&workletRunner)\n      : AudioScheduledSourceNode(context) {}\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override {\n    return processingBuffer;\n  }\n};\n#else\n\nclass WorkletSourceNode : public AudioScheduledSourceNode {\n public:\n  explicit WorkletSourceNode(\n      const std::shared_ptr<BaseAudioContext> &context,\n      WorkletsRunner &&workletRunner);\n\n protected:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override;\n\n private:\n  WorkletsRunner workletRunner_;\n  std::vector<std::shared_ptr<AudioArrayBuffer>> outputBuffsHandles_;\n};\n#endif // RN_AUDIO_API_TEST\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/types/AudioFormat.h",
    "content": "#pragma once\n\nnamespace audioapi {\n\nenum class AudioFormat { UNKNOWN, WAV, OGG, FLAC, AAC, MP3, M4A, MP4, MOV };\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/types/BiquadFilterType.h",
    "content": "#pragma once\n\n#include <cstdint>\n\nnamespace audioapi {\n\nenum class BiquadFilterType : std::uint8_t {\n  LOWPASS,\n  HIGHPASS,\n  BANDPASS,\n  LOWSHELF,\n  HIGHSHELF,\n  PEAKING,\n  NOTCH,\n  ALLPASS\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/types/ChannelCountMode.h",
    "content": "#pragma once\n\n#include <cstdint>\n\nnamespace audioapi {\n\nenum class ChannelCountMode : std::uint8_t { MAX, CLAMPED_MAX, EXPLICIT };\n\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/types/ChannelInterpretation.h",
    "content": "#pragma once\n\n#include <cstdint>\n\nnamespace audioapi {\n\nenum class ChannelInterpretation : std::uint8_t { SPEAKERS, DISCRETE };\n\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/types/ContextState.h",
    "content": "#pragma once\n\n#include <cstdint>\n\nnamespace audioapi {\n\nenum class ContextState : std::uint8_t { SUSPENDED, RUNNING, CLOSED };\n\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/types/OscillatorType.h",
    "content": "#pragma once\n\n#include <cstdint>\n\nnamespace audioapi {\n\nenum class OscillatorType : std::uint8_t { SINE, SQUARE, SAWTOOTH, TRIANGLE, CUSTOM };\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/types/OverSampleType.h",
    "content": "#pragma once\n\n#include <cstdint>\n\nnamespace audioapi {\n\nenum class OverSampleType : std::uint8_t { OVERSAMPLE_NONE, OVERSAMPLE_2X, OVERSAMPLE_4X };\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/types/ParamEventType.h",
    "content": "#pragma once\n\n#include <cstdint>\n#include <string_view>\nnamespace audioapi {\n\nenum class ParamEventType : uint8_t {\n  LINEAR_RAMP,\n  EXPONENTIAL_RAMP,\n  SET_VALUE,\n  SET_TARGET,\n  SET_VALUE_CURVE,\n};\n\ninline std::string_view toString(ParamEventType type) {\n  switch (type) {\n    case ParamEventType::LINEAR_RAMP:\n      return \"LinearRampToValueAtTime\";\n    case ParamEventType::EXPONENTIAL_RAMP:\n      return \"ExponentialRampToValueAtTime\";\n    case ParamEventType::SET_VALUE:\n      return \"SetValueAtTime\";\n    case ParamEventType::SET_TARGET:\n      return \"SetTargetAtTime\";\n    case ParamEventType::SET_VALUE_CURVE:\n      return \"SetValueCurveAtTime\";\n  }\n  return \"Unknown\";\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/AudioDecoder.cpp",
    "content": "#include <audioapi/core/utils/AudioDecoder.h>\n#include <audioapi/dsp/VectorMath.h>\n#include <audioapi/libs/base64/base64.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <audioapi/libs/miniaudio/decoders/libopus/miniaudio_libopus.h>\n#include <audioapi/libs/miniaudio/decoders/libvorbis/miniaudio_libvorbis.h>\n#include <audioapi/libs/miniaudio/miniaudio.h>\n\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n#include <audioapi/libs/ffmpeg/FFmpegDecoding.h>\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n\n#include <memory>\n#include <string>\n#include <utility>\n#include <vector>\n\nnamespace audioapi {\n\n// Decoding audio in fixed-size chunks because total frame count can't be\n// determined in advance. Note: ma_decoder_get_length_in_pcm_frames() always\n// returns 0 for Vorbis decoders.\nResult<std::vector<float>, std::string> AudioDecoder::readAllPcmFrames(\n    ma_decoder &decoder,\n    int outputChannels) {\n  std::vector<float> buffer;\n  std::vector<float> temp(CHUNK_SIZE * outputChannels);\n  ma_uint64 outFramesRead = 0;\n\n  while (true) {\n    ma_uint64 tempFramesDecoded = 0;\n    ma_decoder_read_pcm_frames(&decoder, temp.data(), CHUNK_SIZE, &tempFramesDecoded);\n    if (tempFramesDecoded == 0) {\n      break;\n    }\n\n    buffer.insert(buffer.end(), temp.data(), temp.data() + tempFramesDecoded * outputChannels);\n    outFramesRead += tempFramesDecoded;\n  }\n\n  if (outFramesRead == 0) {\n    return Err(\"Failed to decode any frames\");\n  }\n\n  return Ok(std::move(buffer));\n}\n\nAudioBufferResult AudioDecoder::makeAudioBufferFromFloatBuffer(\n    const std::vector<float> &buffer,\n    float outputSampleRate,\n    int outputChannels) {\n  if (buffer.empty()) {\n    return Err(\"Buffer is empty\");\n  }\n\n  auto outputFrames = buffer.size() / outputChannels;\n  auto audioBuffer = std::make_shared<AudioBuffer>(outputFrames, outputChannels, outputSampleRate);\n\n  audioBuffer->deinterleaveFrom(buffer.data(), outputFrames);\n\n  return Ok(std::move(audioBuffer));\n}\n\nAudioBufferResult AudioDecoder::decodeWithMiniaudio(float sampleRate, DecoderSource source) {\n  ma_decoder decoder;\n  ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 0, static_cast<int>(sampleRate));\n  ma_decoding_backend_vtable *customBackends[] = {\n      ma_decoding_backend_libvorbis, ma_decoding_backend_libopus};\n\n  config.ppCustomBackendVTables = customBackends;\n  config.customBackendCount = sizeof(customBackends) / sizeof(customBackends[0]);\n\n  ma_result initResult = std::visit(\n      [&config, &decoder](auto &&arg) -> ma_result {\n        using T = std::decay_t<decltype(arg)>;\n        if constexpr (std::is_same_v<T, MemorySource>) {\n          return ma_decoder_init_memory(arg.data, arg.size, &config, &decoder);\n        } else if constexpr (std::is_same_v<T, std::string>) {\n          return ma_decoder_init_file(arg.c_str(), &config, &decoder);\n        } else {\n          return MA_INVALID_ARGS;\n        }\n      },\n      source);\n\n  if (initResult != MA_SUCCESS) {\n    return Err(\n        \"Failed to initialize miniaudio decoder: \" +\n        std::string(ma_result_description(initResult)));\n  }\n\n  auto outputSampleRate = static_cast<float>(decoder.outputSampleRate);\n  auto outputChannels = static_cast<int>(decoder.outputChannels);\n\n  auto result = readAllPcmFrames(decoder, outputChannels)\n                    .and_then([outputSampleRate, outputChannels](std::vector<float> &&buffer) {\n                      return makeAudioBufferFromFloatBuffer(\n                          std::move(buffer), outputSampleRate, outputChannels);\n                    });\n\n  ma_decoder_uninit(&decoder);\n\n  return result;\n}\n\nAudioBufferResult AudioDecoder::decodeWithFilePath(const std::string &path, float sampleRate) {\n  if (AudioDecoder::pathHasExtension(path, {\".mp4\", \".m4a\", \".aac\"})) {\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n    auto buffer = ffmpegdecoder::decodeWithFilePath(path, static_cast<int>(sampleRate));\n    if (buffer == nullptr) {\n      return Err(\"Failed to decode with file path using FFmpeg\");\n    }\n    return Ok(std::move(buffer));\n#else\n    return Err(\"FFmpeg is disabled, cannot decode with file path\");\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n  }\n  return decodeWithMiniaudio(sampleRate, path);\n}\n\nAudioBufferResult\nAudioDecoder::decodeWithMemoryBlock(const void *data, size_t size, float sampleRate) {\n  const AudioFormat format = AudioDecoder::detectAudioFormat(data, size);\n  if (format == AudioFormat::MP4 || format == AudioFormat::M4A || format == AudioFormat::AAC) {\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n    auto buffer = ffmpegdecoder::decodeWithMemoryBlock(data, size, static_cast<int>(sampleRate));\n    if (buffer == nullptr) {\n      return Err(\"Failed to decode with memory block using FFmpeg\");\n    }\n    return Ok(std::move(buffer));\n#else\n    return Err(\"FFmpeg is disabled, cannot decode memory block\");\n#endif // RN_AUDIO_API_FFMPEG_DISABLED\n  }\n  return decodeWithMiniaudio(sampleRate, MemorySource{.data = data, .size = size});\n}\n\nAudioBufferResult AudioDecoder::decodeWithPCMInBase64(\n    const std::string &data,\n    float inputSampleRate,\n    int inputChannelCount,\n    bool interleaved) {\n  auto decodedData = base64_decode(data, false);\n  const auto *uint8Data = reinterpret_cast<uint8_t *>(decodedData.data());\n  size_t numFramesDecoded = decodedData.size() / (inputChannelCount * sizeof(int16_t));\n\n  auto audioBuffer =\n      std::make_shared<AudioBuffer>(numFramesDecoded, inputChannelCount, inputSampleRate);\n\n  for (size_t ch = 0; ch < inputChannelCount; ++ch) {\n    auto channelData = audioBuffer->getChannel(ch)->span();\n\n    for (size_t i = 0; i < numFramesDecoded; ++i) {\n      size_t offset;\n      if (interleaved) {\n        // Ch1, Ch2, Ch1, Ch2, ...\n        offset = (i * inputChannelCount + ch) * sizeof(int16_t);\n      } else {\n        // Ch1, Ch1, Ch1, ..., Ch2, Ch2, Ch2, ...\n        offset = (ch * numFramesDecoded + i) * sizeof(int16_t);\n      }\n\n      channelData[i] = uint8ToFloat(uint8Data[offset], uint8Data[offset + 1]);\n    }\n  }\n\n  return Ok(std::move(audioBuffer));\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/AudioDecoder.h",
    "content": "#pragma once\n\n#include <audioapi/core/types/AudioFormat.h>\n#include <audioapi/libs/miniaudio/miniaudio.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/Result.hpp>\n#include <algorithm>\n#include <cstring>\n#include <memory>\n#include <string>\n#include <variant>\n#include <vector>\n\nnamespace audioapi {\n\nusing AudioBufferResult = Result<std::shared_ptr<AudioBuffer>, std::string>;\n\nstruct MemorySource {\n  const void *data;\n  size_t size;\n};\n\nusing DecoderSource = std::variant<MemorySource, std::string>;\n\nstatic constexpr int CHUNK_SIZE = 4096;\n\nclass AudioDecoder {\n public:\n  AudioDecoder() = delete;\n\n  [[nodiscard]] static AudioBufferResult decodeWithFilePath(\n      const std::string &path,\n      float sampleRate);\n  [[nodiscard]] static AudioBufferResult\n  decodeWithMemoryBlock(const void *data, size_t size, float sampleRate);\n  [[nodiscard]] static AudioBufferResult decodeWithPCMInBase64(\n      const std::string &data,\n      float inputSampleRate,\n      int inputChannelCount,\n      bool interleaved);\n\n  // NOLINTBEGIN(readability-magic-numbers, cppcoreguidelines-avoid-magic-numbers)\n  static AudioFormat detectAudioFormat(const void *data, size_t size) {\n    if (size < 12) {\n      return AudioFormat::UNKNOWN;\n    }\n    const auto *bytes = static_cast<const unsigned char *>(data);\n\n    // WAV/RIFF\n    if (std::memcmp(bytes, \"RIFF\", 4) == 0 && std::memcmp(bytes + 8, \"WAVE\", 4) == 0) {\n      return AudioFormat::WAV;\n    }\n\n    // OGG\n    if (std::memcmp(bytes, \"OggS\", 4) == 0) {\n      return AudioFormat::OGG;\n    }\n\n    // FLAC\n    if (std::memcmp(bytes, \"fLaC\", 4) == 0) {\n      return AudioFormat::FLAC;\n    }\n\n    // AAC starts with 0xFF 0xF1 or 0xFF 0xF9\n    if (bytes[0] == 0xFF && (bytes[1] & 0xF6) == 0xF0) {\n      return AudioFormat::AAC;\n    }\n\n    // MP3: \"ID3\" or 11-bit frame sync (0xFF 0xE0)\n    if (std::memcmp(bytes, \"ID3\", 3) == 0) {\n      return AudioFormat::MP3;\n    }\n    if (bytes[0] == 0xFF && (bytes[1] & 0xE0) == 0xE0) {\n      return AudioFormat::MP3;\n    }\n\n    if (std::memcmp(bytes + 4, \"ftyp\", 4) == 0) {\n      if (std::memcmp(bytes + 8, \"M4A \", 4) == 0) {\n        return AudioFormat::M4A;\n      }\n      if (std::memcmp(bytes + 8, \"qt  \", 4) == 0) {\n        return AudioFormat::MOV;\n      }\n      return AudioFormat::MP4;\n    }\n    return AudioFormat::UNKNOWN;\n  }\n\n  // NOLINTEND(readability-magic-numbers, cppcoreguidelines-avoid-magic-numbers)\n  static bool pathHasExtension(\n      const std::string &path,\n      const std::vector<std::string> &extensions) {\n    std::string pathLower = path;\n    std::ranges::transform(pathLower, pathLower.begin(), ::tolower);\n    return std::ranges::any_of(\n        extensions, [&pathLower](const std::string &ext) { return pathLower.ends_with(ext); });\n  }\n\n private:\n  static AudioBufferResult decodeWithMiniaudio(float sampleRate, DecoderSource source);\n  static Result<std::vector<float>, std::string> readAllPcmFrames(\n      ma_decoder &decoder,\n      int outputChannels);\n  static AudioBufferResult makeAudioBufferFromFloatBuffer(\n      const std::vector<float> &buffer,\n      float outputSampleRate,\n      int outputChannels);\n  [[nodiscard]] static int16_t floatToInt16(float sample) {\n    return static_cast<int16_t>(sample * INT16_MAX);\n  }\n  [[nodiscard]] static float int16ToFloat(int16_t sample) {\n    return static_cast<float>(sample) / INT16_MAX;\n  }\n  [[nodiscard]] static float uint8ToFloat(uint8_t byte1, uint8_t byte2) {\n    return static_cast<float>(static_cast<int16_t>((byte2 << CHAR_BIT) | byte1)) / INT16_MAX;\n  }\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/AudioDestructor.hpp",
    "content": "#pragma once\n\n#include <audioapi/utils/Macros.h>\n#include <audioapi/utils/SpscChannel.hpp>\n#include <atomic>\n#include <memory>\n#include <thread>\n#include <utility>\n\nnamespace audioapi {\n\n/// @brief A generic class to offload object destruction to a separate thread.\n/// @tparam T The type of object to be destroyed.\ntemplate <typename T>\nclass AudioDestructor {\n public:\n  DELETE_COPY_AND_MOVE(AudioDestructor);\n\n  AudioDestructor() : isExiting_(false) {\n    auto [sender, receiver] = channels::spsc::channel<\n        std::shared_ptr<T>,\n        channels::spsc::OverflowStrategy::WAIT_ON_FULL,\n        channels::spsc::WaitStrategy::ATOMIC_WAIT>(kChannelCapacity);\n    sender_ = std::move(sender);\n    workerHandle_ = std::thread(&AudioDestructor::process, this, std::move(receiver));\n  }\n\n  ~AudioDestructor() {\n    isExiting_.store(true, std::memory_order_release);\n\n    // We need to send a nullptr to unblock the receiver\n    sender_.send(nullptr);\n    if (workerHandle_.joinable()) {\n      workerHandle_.join();\n    }\n  }\n\n  /// @brief Adds an audio object to the deconstruction queue.\n  /// @param object The audio object to be deconstructed.\n  /// @return True if the node was successfully added, false otherwise.\n  /// @note audio object does NOT get moved out if it is not successfully added.\n  bool tryAddForDeconstruction(std::shared_ptr<T> &&object) {\n    return sender_.try_send(std::move(object)) == channels::spsc::ResponseStatus::SUCCESS;\n  }\n\n private:\n  static constexpr size_t kChannelCapacity = 1024;\n\n  std::thread workerHandle_;\n  std::atomic<bool> isExiting_;\n\n  using SenderType = channels::spsc::Sender<\n      std::shared_ptr<T>,\n      channels::spsc::OverflowStrategy::WAIT_ON_FULL,\n      channels::spsc::WaitStrategy::ATOMIC_WAIT>;\n\n  using ReceiverType = channels::spsc::Receiver<\n      std::shared_ptr<T>,\n      channels::spsc::OverflowStrategy::WAIT_ON_FULL,\n      channels::spsc::WaitStrategy::ATOMIC_WAIT>;\n\n  SenderType sender_;\n\n  /// @brief Processes audio objects for deconstruction.\n  /// @param receiver The receiver channel for incoming audio objects.\n  void process(ReceiverType &&receiver) {\n    auto rcv = std::move(receiver);\n    while (!isExiting_.load(std::memory_order_acquire)) {\n      rcv.receive();\n    }\n  }\n};\n\n#undef AUDIO_NODE_DESTRUCTOR_SPSC_OPTIONS\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/AudioFileWriter.cpp",
    "content": "#include <audioapi/core/utils/AudioFileWriter.h>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <memory>\n#include <string>\n#include <unordered_map>\n\nnamespace audioapi {\n\nAudioFileWriter::AudioFileWriter(\n    const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    const std::shared_ptr<AudioFileProperties> &fileProperties)\n    : fileProperties_(fileProperties), audioEventHandlerRegistry_(audioEventHandlerRegistry) {}\n\nvoid AudioFileWriter::setOnErrorCallback(uint64_t callbackId) {\n  errorCallbackId_.store(callbackId, std::memory_order_release);\n}\n\nvoid AudioFileWriter::clearOnErrorCallback() {\n  errorCallbackId_.store(0, std::memory_order_release);\n}\n\nvoid AudioFileWriter::invokeOnErrorCallback(const std::string &message) {\n  uint64_t callbackId = errorCallbackId_.load(std::memory_order_acquire);\n\n  // TODO: only the line above is atomic, which means that between reading the callbackId and invoking the callback,\n  // the callback could be cleared. We need to ensure that the callback is still valid when invoking it.\n  // TL;DR: atomic szpont\n  if (audioEventHandlerRegistry_ == nullptr || callbackId == 0) {\n    return;\n  }\n\n  std::unordered_map<std::string, EventValue> eventPayload = {{\"message\", message}};\n  audioEventHandlerRegistry_->invokeHandlerWithEventBody(\n      AudioEvent::RECORDER_ERROR, callbackId, eventPayload);\n}\n\nbool AudioFileWriter::isFileOpen() {\n  return isFileOpen_.load(std::memory_order_acquire);\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/AudioFileWriter.h",
    "content": "#pragma once\n\n#include <audioapi/utils/Macros.h>\n#include <audioapi/utils/Result.hpp>\n#include <audioapi/utils/SpscChannel.hpp>\n#include <atomic>\n#include <memory>\n#include <string>\n#include <tuple>\n\n#ifdef __APPLE__\ntypedef const struct AudioBufferList *AudioDataType;\n#else\ntypedef void *AudioDataType;\n#endif\n\nnamespace audioapi {\n\nclass AudioFileProperties;\nclass AudioEventHandlerRegistry;\n\nusing OpenFileResult = Result<std::string, std::string>;\nusing CloseFileResult = Result<std::tuple<double, double>, std::string>;\n\nclass AudioFileWriter {\n public:\n  DELETE_COPY_AND_MOVE(AudioFileWriter);\n\n  AudioFileWriter(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const std::shared_ptr<AudioFileProperties> &fileProperties);\n  virtual ~AudioFileWriter() = default;\n\n  virtual CloseFileResult closeFile() = 0;\n  virtual std::string getFilePath() const = 0;\n\n  virtual void writeAudioData(AudioDataType data, int numFrames) = 0;\n\n  virtual double getCurrentDuration() const = 0;\n  virtual size_t getFileSizeBytes() const = 0;\n\n  void setOnErrorCallback(uint64_t callbackId);\n  void clearOnErrorCallback();\n  void invokeOnErrorCallback(const std::string &message);\n\n protected:\n  bool isFileOpen();\n\n  std::atomic<bool> isFileOpen_{false};\n  std::atomic<size_t> framesWritten_{0};\n  std::atomic<uint64_t> errorCallbackId_{0};\n\n  std::shared_ptr<AudioFileProperties> fileProperties_;\n  std::shared_ptr<AudioEventHandlerRegistry> audioEventHandlerRegistry_;\n\n  static constexpr auto FILE_WRITER_SPSC_OVERFLOW_STRATEGY =\n      channels::spsc::OverflowStrategy::OVERWRITE_ON_FULL;\n  static constexpr auto FILE_WRITER_SPSC_WAIT_STRATEGY = channels::spsc::WaitStrategy::ATOMIC_WAIT;\n  static constexpr auto FILE_WRITER_CHANNEL_CAPACITY = 64;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/AudioGraphManager.cpp",
    "content": "#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/AudioParam.h>\n#include <audioapi/core/effects/ConvolverNode.h>\n#include <audioapi/core/effects/DelayNode.h>\n#include <audioapi/core/sources/AudioScheduledSourceNode.h>\n#include <audioapi/core/utils/AudioGraphManager.h>\n#include <audioapi/core/utils/Locker.h>\n\n#include <memory>\n#include <utility>\n#include <vector>\n\nnamespace audioapi {\n\nAudioGraphManager::Event::Event(Event &&other) noexcept {\n  *this = std::move(other);\n}\n\nAudioGraphManager::Event &AudioGraphManager::Event::operator=(Event &&other) noexcept {\n  if (this != &other) {\n    // Clean up current resources\n    this->~Event();\n\n    // Move resources from the other event\n    type = other.type;\n    payloadType = other.payloadType;\n    switch (payloadType) {\n      case EventPayloadType::NODES:\n        payload.nodes.from = std::move(other.payload.nodes.from);\n        payload.nodes.to = std::move(other.payload.nodes.to);\n        break;\n      case EventPayloadType::PARAMS:\n        payload.params.from = std::move(other.payload.params.from);\n        payload.params.to = std::move(other.payload.params.to);\n        break;\n      case EventPayloadType::SOURCE_NODE:\n        payload.sourceNode = std::move(other.payload.sourceNode);\n        break;\n      case EventPayloadType::AUDIO_PARAM:\n        payload.audioParam = std::move(other.payload.audioParam);\n        break;\n      case EventPayloadType::NODE:\n        payload.node = std::move(other.payload.node);\n        break;\n\n      default:\n        break;\n    }\n  }\n  return *this;\n}\n\nAudioGraphManager::Event::~Event() {\n  switch (payloadType) {\n    case EventPayloadType::NODES:\n      payload.nodes.from.~shared_ptr();\n      payload.nodes.to.~shared_ptr();\n      break;\n    case EventPayloadType::PARAMS:\n      payload.params.from.~shared_ptr();\n      payload.params.to.~shared_ptr();\n      break;\n    case EventPayloadType::SOURCE_NODE:\n      payload.sourceNode.~shared_ptr();\n      break;\n    case EventPayloadType::AUDIO_PARAM:\n      payload.audioParam.~shared_ptr();\n      break;\n    case EventPayloadType::NODE:\n      payload.node.~shared_ptr();\n      break;\n  }\n}\n\nAudioGraphManager::AudioGraphManager() {\n  sourceNodes_.reserve(kInitialCapacity);\n  processingNodes_.reserve(kInitialCapacity);\n  audioParams_.reserve(kInitialCapacity);\n  audioBuffers_.reserve(kInitialCapacity);\n\n  auto channel_pair = channels::spsc::channel<\n      std::unique_ptr<Event>,\n      channels::spsc::OverflowStrategy::WAIT_ON_FULL,\n      channels::spsc::WaitStrategy::BUSY_LOOP>(kChannelCapacity);\n\n  sender_ = std::move(channel_pair.first);\n  receiver_ = std::move(channel_pair.second);\n}\n\nAudioGraphManager::~AudioGraphManager() {\n  cleanup();\n}\n\nvoid AudioGraphManager::addPendingNodeConnection(\n    const std::shared_ptr<AudioNode> &from,\n    const std::shared_ptr<AudioNode> &to,\n    ConnectionType type) {\n  auto event = std::make_unique<Event>();\n  event->type = type;\n  event->payloadType = EventPayloadType::NODES;\n  event->payload.nodes.from = from;\n  event->payload.nodes.to = to;\n\n  sender_.send(std::move(event));\n}\n\nvoid AudioGraphManager::addPendingParamConnection(\n    const std::shared_ptr<AudioNode> &from,\n    const std::shared_ptr<AudioParam> &to,\n    ConnectionType type) {\n  auto event = std::make_unique<Event>();\n  event->type = type;\n  event->payloadType = EventPayloadType::PARAMS;\n  event->payload.params.from = from;\n  event->payload.params.to = to;\n\n  sender_.send(std::move(event));\n}\n\nvoid AudioGraphManager::preProcessGraph() {\n  settlePendingConnections();\n  AudioGraphManager::prepareForDestruction(sourceNodes_, nodeDestructor_);\n  AudioGraphManager::prepareForDestruction(processingNodes_, nodeDestructor_);\n  AudioGraphManager::prepareForDestruction(audioBuffers_, bufferDestructor_);\n}\n\nvoid AudioGraphManager::addProcessingNode(const std::shared_ptr<AudioNode> &node) {\n  auto event = std::make_unique<Event>();\n  event->type = ConnectionType::ADD;\n  event->payloadType = EventPayloadType::NODE;\n  event->payload.node = node;\n\n  sender_.send(std::move(event));\n}\n\nvoid AudioGraphManager::addSourceNode(const std::shared_ptr<AudioScheduledSourceNode> &node) {\n  auto event = std::make_unique<Event>();\n  event->type = ConnectionType::ADD;\n  event->payloadType = EventPayloadType::SOURCE_NODE;\n  event->payload.sourceNode = node;\n\n  sender_.send(std::move(event));\n}\n\nvoid AudioGraphManager::addAudioParam(const std::shared_ptr<AudioParam> &param) {\n  auto event = std::make_unique<Event>();\n  event->type = ConnectionType::ADD;\n  event->payloadType = EventPayloadType::AUDIO_PARAM;\n  event->payload.audioParam = param;\n\n  sender_.send(std::move(event));\n}\n\nvoid AudioGraphManager::addAudioBufferForDestruction(std::shared_ptr<AudioBuffer> buffer) {\n  // direct access because this is called from the Audio thread\n  audioBuffers_.emplace_back(std::move(buffer));\n}\n\nvoid AudioGraphManager::settlePendingConnections() {\n  std::unique_ptr<Event> value;\n  while (receiver_.try_receive(value) != channels::spsc::ResponseStatus::CHANNEL_EMPTY) {\n    switch (value->type) {\n      case ConnectionType::CONNECT:\n        handleConnectEvent(std::move(value));\n        break;\n      case ConnectionType::DISCONNECT:\n        handleDisconnectEvent(std::move(value));\n        break;\n      case ConnectionType::DISCONNECT_ALL:\n        handleDisconnectAllEvent(std::move(value));\n        break;\n      case ConnectionType::ADD:\n        handleAddToDeconstructionEvent(std::move(value));\n        break;\n    }\n  }\n}\n\nvoid AudioGraphManager::handleConnectEvent(std::unique_ptr<Event> event) {\n  if (event->payloadType == EventPayloadType::NODES) {\n    event->payload.nodes.from->connectNode(event->payload.nodes.to);\n  } else if (event->payloadType == EventPayloadType::PARAMS) {\n    event->payload.params.from->connectParam(event->payload.params.to);\n  } else {\n    assert(false && \"Invalid payload type for connect event\");\n  }\n}\n\nvoid AudioGraphManager::handleDisconnectEvent(std::unique_ptr<Event> event) {\n  if (event->payloadType == EventPayloadType::NODES) {\n    event->payload.nodes.from->disconnectNode(event->payload.nodes.to);\n  } else if (event->payloadType == EventPayloadType::PARAMS) {\n    event->payload.params.from->disconnectParam(event->payload.params.to);\n  } else {\n    assert(false && \"Invalid payload type for disconnect event\");\n  }\n}\n\nvoid AudioGraphManager::handleDisconnectAllEvent(std::unique_ptr<Event> event) {\n  assert(event->payloadType == EventPayloadType::NODES);\n  for (auto it = event->payload.nodes.from->outputNodes_.begin();\n       it != event->payload.nodes.from->outputNodes_.end();) {\n    auto next = std::next(it);\n    event->payload.nodes.from->disconnectNode(*it);\n    it = next;\n  }\n}\n\nvoid AudioGraphManager::handleAddToDeconstructionEvent(std::unique_ptr<Event> event) {\n  switch (event->payloadType) {\n    case EventPayloadType::NODE:\n      processingNodes_.push_back(event->payload.node);\n      break;\n    case EventPayloadType::SOURCE_NODE:\n      sourceNodes_.push_back(event->payload.sourceNode);\n      break;\n    case EventPayloadType::AUDIO_PARAM:\n      audioParams_.push_back(event->payload.audioParam);\n      break;\n    default:\n      assert(false && \"Unknown event payload type\");\n  }\n}\n\nvoid AudioGraphManager::cleanup() {\n  for (auto it = sourceNodes_.begin(), end = sourceNodes_.end(); it != end; ++it) {\n    it->get()->cleanup();\n  }\n\n  for (auto it = processingNodes_.begin(), end = processingNodes_.end(); it != end; ++it) {\n    it->get()->cleanup();\n  }\n\n  sourceNodes_.clear();\n  processingNodes_.clear();\n  audioParams_.clear();\n  audioBuffers_.clear();\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/AudioGraphManager.h",
    "content": "#pragma once\n\n#include <audioapi/core/utils/AudioDestructor.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/Macros.h>\n#include <audioapi/utils/SpscChannel.hpp>\n#include <concepts>\n#include <memory>\n#include <utility>\n#include <vector>\n\nnamespace audioapi {\n\nclass AudioNode;\nclass AudioScheduledSourceNode;\nclass AudioParam;\n\n#define AUDIO_GRAPH_MANAGER_SPSC_OPTIONS \\\n  std::unique_ptr<Event>, channels::spsc::OverflowStrategy::WAIT_ON_FULL, \\\n      channels::spsc::WaitStrategy::BUSY_LOOP\n\ntemplate <typename T>\nconcept HasCleanupMethod = requires(T t) {\n  { t.cleanup() };\n};\n\nclass AudioGraphManager {\n public:\n  enum class ConnectionType : uint8_t { CONNECT, DISCONNECT, DISCONNECT_ALL, ADD };\n  using EventType = ConnectionType; // for backwards compatibility\n  enum class EventPayloadType : uint8_t { NODES, PARAMS, SOURCE_NODE, AUDIO_PARAM, NODE };\n  union EventPayload {\n    struct {\n      std::shared_ptr<AudioNode> from;\n      std::shared_ptr<AudioNode> to;\n    } nodes;\n    struct {\n      std::shared_ptr<AudioNode> from;\n      std::shared_ptr<AudioParam> to;\n    } params;\n    std::shared_ptr<AudioScheduledSourceNode> sourceNode;\n    std::shared_ptr<AudioParam> audioParam;\n    std::shared_ptr<AudioNode> node;\n\n    // Default constructor that initializes the first member\n    EventPayload() : nodes{} {}\n\n    // Destructor - we'll handle cleanup explicitly in Event destructor\n    ~EventPayload() {}\n  };\n  struct Event {\n    EventType type = ConnectionType::CONNECT;\n    EventPayloadType payloadType = EventPayloadType::NODES;\n    EventPayload payload;\n\n    Event(Event &&other) noexcept;\n    Event &operator=(Event &&other) noexcept;\n    Event() = default;\n    ~Event();\n  };\n\n  AudioGraphManager();\n  DELETE_COPY_AND_MOVE(AudioGraphManager);\n  ~AudioGraphManager();\n\n  void preProcessGraph();\n\n  /// @brief Adds a pending connection between two audio nodes.\n  /// @param from The source audio node.\n  /// @param to The destination audio node.\n  /// @param type The type of connection (connect/disconnect).\n  /// @note Should be only used from JavaScript/HostObjects thread\n  void addPendingNodeConnection(\n      const std::shared_ptr<AudioNode> &from,\n      const std::shared_ptr<AudioNode> &to,\n      ConnectionType type);\n\n  /// @brief Adds a pending connection between an audio node and an audio parameter.\n  /// @param from The source audio node.\n  /// @param to The destination audio parameter.\n  /// @param type The type of connection (connect/disconnect).\n  /// @note Should be only used from JavaScript/HostObjects thread\n  void addPendingParamConnection(\n      const std::shared_ptr<AudioNode> &from,\n      const std::shared_ptr<AudioParam> &to,\n      ConnectionType type);\n\n  /// @brief Adds a processing node to the manager.\n  /// @param node The processing node to add.\n  /// @note Should be only used from JavaScript/HostObjects thread\n  void addProcessingNode(const std::shared_ptr<AudioNode> &node);\n\n  /// @brief Adds a source node to the manager.\n  /// @param node The source node to add.\n  /// @note Should be only used from JavaScript/HostObjects thread\n  void addSourceNode(const std::shared_ptr<AudioScheduledSourceNode> &node);\n\n  /// @brief Adds an audio parameter to the manager.\n  /// @param param The audio parameter to add.\n  /// @note Should be only used from JavaScript/HostObjects thread\n  void addAudioParam(const std::shared_ptr<AudioParam> &param);\n\n  /// @brief Adds an audio buffer to the manager for destruction.\n  /// @note Called directly from the Audio thread (bypasses SPSC).\n  void addAudioBufferForDestruction(std::shared_ptr<AudioBuffer> buffer);\n\n  void cleanup();\n\n private:\n  AudioDestructor<AudioNode> nodeDestructor_;\n  AudioDestructor<AudioBuffer> bufferDestructor_;\n\n  /// @brief Initial capacity for various node types for deletion\n  /// @note Higher capacity decreases number of reallocations at runtime (can be easily adjusted to 128 if needed)\n  static constexpr size_t kInitialCapacity = 32;\n\n  /// @brief Initial capacity for event passing channel\n  /// @note High value reduces wait time for sender (JavaScript/HostObjects thread here)\n  static constexpr size_t kChannelCapacity = 1024;\n\n  std::vector<std::shared_ptr<AudioScheduledSourceNode>> sourceNodes_;\n  std::vector<std::shared_ptr<AudioNode>> processingNodes_;\n  std::vector<std::shared_ptr<AudioParam>> audioParams_;\n  std::vector<std::shared_ptr<AudioBuffer>> audioBuffers_;\n\n  channels::spsc::Receiver<AUDIO_GRAPH_MANAGER_SPSC_OPTIONS> receiver_;\n\n  channels::spsc::Sender<AUDIO_GRAPH_MANAGER_SPSC_OPTIONS> sender_;\n\n  void settlePendingConnections();\n  static void handleConnectEvent(std::unique_ptr<Event> event);\n  static void handleDisconnectEvent(std::unique_ptr<Event> event);\n  static void handleDisconnectAllEvent(std::unique_ptr<Event> event);\n  void handleAddToDeconstructionEvent(std::unique_ptr<Event> event);\n\n  template <typename U>\n  static bool canBeDestructed(const std::shared_ptr<U> &object) {\n    return object.use_count() == 1;\n  }\n\n  template <typename U>\n    requires std::derived_from<U, AudioNode>\n  static bool canBeDestructed(std::shared_ptr<U> const &node) {\n    // If the node is an AudioScheduledSourceNode, we need to check if it is\n    // playing\n    if constexpr (std::is_base_of_v<AudioScheduledSourceNode, U>) {\n      return node.use_count() == 1 && (node->isUnscheduled() || node->isFinished());\n    }\n\n    if (node->requiresTailProcessing()) {\n      // if the node requires tail processing, its own implementation handles disabling it at the right time\n      return node.use_count() == 1 && !node->isEnabled();\n    }\n\n    return node.use_count() == 1;\n  }\n\n  template <typename T, typename D>\n    requires std::convertible_to<T *, D *>\n  static void prepareForDestruction(\n      std::vector<std::shared_ptr<T>> &vec,\n      AudioDestructor<D> &audioDestructor) {\n    if (vec.empty()) {\n      return;\n    }\n    /// An example of input-output\n    /// for simplicity we will be considering vector where each value represents\n    /// use_count() of an element vec = [1, 2, 1, 3, 1] our end result will be vec\n    /// = [2, 3, 1, 1, 1] After this operation all nodes with use_count() == 1\n    /// will be at the end and we will try to send them. After sending, we will\n    /// only keep audio objects with use_count() > 1 or which failed vec = [2, 3, failed,\n    /// sent, sent] failed will be always before sents vec = [2, 3, failed] and\n    /// we resize\n    /// @note if there are no nodes with use_count() == 1 `begin` will be equal to\n    /// vec.size()\n    /// @note if all audio objects have use_count() == 1 `begin` will be 0\n\n    int begin = 0;\n    int end = vec.size() - 1; // can be -1 (edge case)\n\n    // Moves all audio objects with use_count() == 1 to the end\n    // nodes in range [begin, vec.size()) should be deleted\n    // so new size of the vector will be `begin`\n    while (begin <= end) {\n      while (begin < end && AudioGraphManager::canBeDestructed(vec[end])) {\n        end--;\n      }\n      if (AudioGraphManager::canBeDestructed(vec[begin])) {\n        std::swap(vec[begin], vec[end]);\n        end--;\n      }\n      begin++;\n    }\n\n    for (int i = begin; i < vec.size(); i++) {\n      if constexpr (HasCleanupMethod<T>) {\n        if (vec[i]) {\n          vec[i]->cleanup();\n        }\n      }\n\n      /// If we fail to add we can't safely remove the node from the vector\n      /// so we swap it and advance begin cursor\n      /// @note vec[i] does NOT get moved out if it is not successfully added.\n      if (!audioDestructor.tryAddForDeconstruction(std::move(vec[i]))) {\n        std::swap(vec[i], vec[begin]);\n        begin++;\n      }\n    }\n    if (begin < vec.size()) {\n      // it does not reallocate if newer size is < current size\n      vec.resize(begin);\n    }\n  }\n};\n\n#undef AUDIO_GRAPH_MANAGER_SPSC_OPTIONS\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/AudioRecorderCallback.cpp",
    "content": "\n#include <audioapi/core/utils/AudioRecorderCallback.h>\n\n#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <audioapi/utils/CircularArray.hpp>\n\n#include <algorithm>\n#include <memory>\n#include <string>\n#include <unordered_map>\n\nnamespace audioapi {\n\n/// @brief Constructor\n/// Allocates circular buffer (as every property to do so is already known at this point).\n/// @param audioEventHandlerRegistry The audio event handler registry\n/// @param sampleRate The user desired sample rate\n/// @param bufferLength The user desired buffer length\n/// @param channelCount The user desired channel count\n/// @param callbackId The callback identifier\nAudioRecorderCallback::AudioRecorderCallback(\n    const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    float sampleRate,\n    size_t bufferLength,\n    int channelCount,\n    uint64_t callbackId)\n    : sampleRate_(sampleRate),\n      bufferLength_(bufferLength),\n      channelCount_(channelCount),\n      callbackId_(callbackId),\n      audioEventHandlerRegistry_(audioEventHandlerRegistry) {\n  ringBufferSize_ = std::max(bufferLength * 2, static_cast<size_t>(DEFAULT_RING_BUFFER_SIZE));\n  circularBuffer_.resize(channelCount_);\n\n  for (size_t i = 0; i < channelCount_; ++i) {\n    circularBuffer_[i] = std::make_shared<CircularAudioArray>(ringBufferSize_);\n  }\n\n  isInitialized_.store(true, std::memory_order_release);\n}\n\nAudioRecorderCallback::~AudioRecorderCallback() {\n  isInitialized_.store(false, std::memory_order_release);\n}\n\n/// @brief Emits audio data from the circular buffer when enough frames are available.\n/// @param flush If true, emits all available data regardless of buffer length.\nvoid AudioRecorderCallback::emitAudioData(bool flush) {\n  size_t sizeLimit = flush ? circularBuffer_[0]->getNumberOfAvailableFrames() : bufferLength_;\n\n  if (sizeLimit == 0) {\n    return;\n  }\n\n  while (circularBuffer_[0]->getNumberOfAvailableFrames() >= sizeLimit) {\n    auto buffer = std::make_shared<AudioBuffer>(sizeLimit, channelCount_, sampleRate_);\n\n    for (int i = 0; i < channelCount_; ++i) {\n      circularBuffer_[i]->pop_front(*buffer->getChannel(i), sizeLimit);\n    }\n\n    invokeCallback(buffer, static_cast<int>(sizeLimit));\n  }\n}\n\nvoid AudioRecorderCallback::invokeCallback(\n    const std::shared_ptr<AudioBuffer> &buffer,\n    int numFrames) {\n  auto audioBufferHostObject = std::make_shared<AudioBufferHostObject>(buffer);\n\n  std::unordered_map<std::string, EventValue> eventPayload = {};\n  eventPayload.insert({\"buffer\", audioBufferHostObject});\n  eventPayload.insert({\"numFrames\", numFrames});\n\n  if (audioEventHandlerRegistry_) {\n    audioEventHandlerRegistry_->invokeHandlerWithEventBody(\n        AudioEvent::AUDIO_READY, callbackId_, eventPayload);\n  }\n}\n\nvoid AudioRecorderCallback::setOnErrorCallback(uint64_t callbackId) {\n  errorCallbackId_.store(callbackId, std::memory_order_release);\n}\n\nvoid AudioRecorderCallback::clearOnErrorCallback() {\n  errorCallbackId_.store(0, std::memory_order_release);\n}\n\n/// @brief Invokes the error callback with the provided message.\n/// @param message The error message to be sent to the callback.\nvoid AudioRecorderCallback::invokeOnErrorCallback(const std::string &message) {\n  uint64_t callbackId = errorCallbackId_.load(std::memory_order_acquire);\n\n  if (audioEventHandlerRegistry_ == nullptr || callbackId == 0) {\n    return;\n  }\n\n  std::unordered_map<std::string, EventValue> eventPayload = {{\"message\", message}};\n  audioEventHandlerRegistry_->invokeHandlerWithEventBody(\n      AudioEvent::RECORDER_ERROR, callbackId, eventPayload);\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/AudioRecorderCallback.h",
    "content": "#pragma once\n\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/CircularArray.hpp>\n#include <audioapi/utils/Result.hpp>\n#include <audioapi/utils/SpscChannel.hpp>\n#include <audioapi/utils/TaskOffloader.hpp>\n#include <atomic>\n#include <memory>\n#include <string>\n#include <vector>\n\nnamespace audioapi {\n\nclass AudioEventHandlerRegistry;\n\nclass AudioRecorderCallback {\n public:\n  AudioRecorderCallback(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      float sampleRate,\n      size_t bufferLength,\n      int channelCount,\n      uint64_t callbackId);\n  AudioRecorderCallback(const AudioRecorderCallback &) = delete;\n  AudioRecorderCallback(AudioRecorderCallback &&) = delete;\n  AudioRecorderCallback &operator=(const AudioRecorderCallback &) = delete;\n  AudioRecorderCallback &operator=(AudioRecorderCallback &&) = delete;\n  virtual ~AudioRecorderCallback();\n\n  virtual void cleanup() = 0;\n\n  void emitAudioData(bool flush = false);\n  void invokeCallback(const std::shared_ptr<AudioBuffer> &buffer, int numFrames);\n\n  void setOnErrorCallback(uint64_t callbackId);\n  void clearOnErrorCallback();\n  void invokeOnErrorCallback(const std::string &message);\n\n protected:\n  std::atomic<bool> isInitialized_{false};\n\n  float sampleRate_;\n  size_t bufferLength_;\n  int channelCount_;\n  uint64_t callbackId_;\n  size_t ringBufferSize_;\n\n  std::atomic<uint64_t> errorCallbackId_{0};\n\n  std::shared_ptr<AudioEventHandlerRegistry> audioEventHandlerRegistry_;\n\n  // TODO: CircularAudioBuffer\n  static constexpr size_t DEFAULT_RING_BUFFER_SIZE = 8192;\n  std::vector<std::shared_ptr<CircularAudioArray>> circularBuffer_;\n  static constexpr auto RECORDER_CALLBACK_SPSC_OVERFLOW_STRATEGY =\n      channels::spsc::OverflowStrategy::OVERWRITE_ON_FULL;\n  static constexpr auto RECORDER_CALLBACK_SPSC_WAIT_STRATEGY =\n      channels::spsc::WaitStrategy::ATOMIC_WAIT;\n  static constexpr auto RECORDER_CALLBACK_CHANNEL_CAPACITY = 64;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/AudioStretcher.cpp",
    "content": "#include <audioapi/core/utils/AudioStretcher.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/libs/audio-stretch/stretch.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <cstdint>\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\nstd::vector<int16_t> AudioStretcher::castToInt16Buffer(AudioBuffer &buffer) {\n  const size_t numChannels = buffer.getNumberOfChannels();\n  const size_t numFrames = buffer.getSize();\n\n  std::vector<int16_t> int16Buffer(numFrames * numChannels);\n\n  for (size_t ch = 0; ch < numChannels; ++ch) {\n    auto channelData = buffer.getChannel(ch)->span();\n    for (size_t i = 0; i < numFrames; ++i) {\n      int16Buffer[i * numChannels + ch] = floatToInt16(channelData[i]);\n    }\n  }\n\n  return int16Buffer;\n}\n\nstd::shared_ptr<AudioBuffer> AudioStretcher::changePlaybackSpeed(\n    AudioBuffer buffer,\n    float playbackSpeed) {\n  const float sampleRate = buffer.getSampleRate();\n  const size_t outputChannels = buffer.getNumberOfChannels();\n  const size_t numFrames = buffer.getSize();\n\n  if (playbackSpeed == 1.0f) {\n    return std::make_shared<AudioBuffer>(buffer);\n  }\n\n  std::vector<int16_t> int16Buffer = castToInt16Buffer(buffer);\n\n  auto *stretcher = stretch_init(\n      static_cast<int>(sampleRate / UPPER_FREQUENCY_LIMIT_DETECTION),\n      static_cast<int>(sampleRate / LOWER_FREQUENCY_LIMIT_DETECTION),\n      static_cast<int>(outputChannels),\n      0x1);\n\n  int maxOutputFrames =\n      stretch_output_capacity(stretcher, static_cast<int>(numFrames), 1 / playbackSpeed);\n  std::vector<int16_t> stretchedBuffer(maxOutputFrames * outputChannels);\n\n  int outputFrames = stretch_samples(\n      stretcher,\n      int16Buffer.data(),\n      static_cast<int>(numFrames),\n      stretchedBuffer.data(),\n      1 / playbackSpeed);\n\n  outputFrames += stretch_flush(stretcher, stretchedBuffer.data() + outputFrames);\n  stretchedBuffer.resize(outputFrames * outputChannels);\n  stretch_deinit(stretcher);\n\n  auto audioBuffer = std::make_shared<AudioBuffer>(outputFrames, outputChannels, sampleRate);\n\n  for (size_t ch = 0; ch < outputChannels; ++ch) {\n    auto channelData = audioBuffer->getChannel(ch)->span();\n    for (int i = 0; i < outputFrames; ++i) {\n      channelData[i] = int16ToFloat(stretchedBuffer[i * outputChannels + ch]);\n    }\n  }\n\n  return audioBuffer;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/AudioStretcher.h",
    "content": "#pragma once\n\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\nclass AudioStretcher {\n public:\n  AudioStretcher() = delete;\n\n  [[nodiscard]] static std::shared_ptr<AudioBuffer> changePlaybackSpeed(\n      AudioBuffer buffer,\n      float playbackSpeed);\n\n private:\n  static std::vector<int16_t> castToInt16Buffer(AudioBuffer &buffer);\n\n  [[nodiscard]] static int16_t floatToInt16(float sample) {\n    return static_cast<int16_t>(sample * INT16_MAX);\n  }\n  [[nodiscard]] static float int16ToFloat(int16_t sample) {\n    return static_cast<float>(sample) / INT16_MAX;\n  }\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/Constants.h",
    "content": "#pragma once\n\n#include <cmath>\n#include <limits>\n#include <new>\n#include <numbers>\n\n// https://webaudio.github.io/web-audio-api/\n\nnamespace audioapi {\n// audio\ninline constexpr int RENDER_QUANTUM_SIZE = 128;\ninline constexpr size_t MAX_FFT_SIZE = 32768;\ninline constexpr int MAX_CHANNEL_COUNT = 32;\ninline constexpr float DEFAULT_SAMPLE_RATE = 44100.0f;\ninline constexpr int OCTAVE_RANGE = 1200;\ninline constexpr int SEMITONES_PER_OCTAVE = 12;\ninline constexpr int BIQUAD_GAIN_DB_FACTOR = 40;\ninline constexpr float CENTS_TO_RATIO = 1.0f / 1200.0f;\n\n// stretcher\ninline constexpr float UPPER_FREQUENCY_LIMIT_DETECTION = 333.0f;\ninline constexpr float LOWER_FREQUENCY_LIMIT_DETECTION = 55.0f;\n\n// general\ninline constexpr float MOST_POSITIVE_SINGLE_FLOAT =\n    static_cast<float>(std::numeric_limits<float>::max());\ninline constexpr float MOST_NEGATIVE_SINGLE_FLOAT =\n    static_cast<float>(std::numeric_limits<float>::lowest());\ninline const float LOG2_MOST_POSITIVE_SINGLE_FLOAT = std::log2(MOST_POSITIVE_SINGLE_FLOAT);\ninline const float LOG10_MOST_POSITIVE_SINGLE_FLOAT = std::log10(MOST_POSITIVE_SINGLE_FLOAT);\ninline constexpr float PI = std::numbers::pi_v<float>;\n\n// buffer sizes\ninline constexpr size_t PROMISE_VENDOR_THREAD_POOL_WORKER_COUNT = 4;\ninline constexpr size_t PROMISE_VENDOR_THREAD_POOL_LOAD_BALANCER_QUEUE_SIZE = 32;\ninline constexpr size_t PROMISE_VENDOR_THREAD_POOL_WORKER_QUEUE_SIZE = 32;\n\n// Cache line size\n#ifdef __cpp_lib_hardware_interference_size\nusing std::hardware_constructive_interference_size;\nusing std::hardware_destructive_interference_size;\n#else\nconstexpr std::size_t hardware_constructive_interference_size = 64;\nconstexpr std::size_t hardware_destructive_interference_size = 64;\n#endif\n\n// audio param\ninline constexpr size_t AUDIO_PARAM_MAX_QUEUED_EVENTS = 64;\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/Locker.h",
    "content": "#pragma once\n\n#include <mutex>\n\nnamespace audioapi {\n\n// Small easy interface to manage locking\nclass Locker {\n public:\n  Locker() : lockPtr_(nullptr) {}\n  explicit Locker(std::mutex &lockPtr) : lockPtr_(&lockPtr) {\n    lock();\n  }\n\n  ~Locker() {\n    unlock();\n  }\n\n  Locker(const Locker &) = delete;\n  Locker &operator=(const Locker &) = delete;\n\n  Locker(Locker &&other) noexcept : lockPtr_(other.lockPtr_) {\n    other.lockPtr_ = nullptr;\n  }\n  Locker &operator=(Locker &&other) noexcept {\n    if (this != &other) {\n      unlock();\n      lockPtr_ = other.lockPtr_;\n      other.lockPtr_ = nullptr;\n    }\n    return *this;\n  }\n\n  explicit operator bool() const {\n    return lockPtr_ != nullptr;\n  }\n\n  void lock() {\n    if (lockPtr_ != nullptr) {\n      lockPtr_->lock();\n    }\n  }\n\n  void unlock() {\n    if (lockPtr_ != nullptr) {\n      lockPtr_->unlock();\n    }\n  }\n\n  static Locker tryLock(std::mutex &lock) {\n    Locker result = Locker();\n\n    if (lock.try_lock()) {\n      result.lockPtr_ = &lock;\n    }\n\n    return result;\n  }\n\n private:\n  std::mutex *lockPtr_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/RotatingFileWriter.cpp",
    "content": "#include <audioapi/core/utils/RotatingFileWriter.h>\n\n#include <memory>\n#include <string>\n#include <tuple>\n#include <utility>\n\nnamespace audioapi {\n\nRotatingFileWriter::RotatingFileWriter(\n    size_t rotateIntervalBytes,\n    WriterFactory writerFactory,\n    OnSegmentFileOpenedCallback onSegmentFileOpened)\n    : writerFactory_(std::move(writerFactory)),\n      onSegmentFileOpened_(std::move(onSegmentFileOpened)),\n      rotateIntervalBytes_(rotateIntervalBytes) {}\n\nCloseFileResult RotatingFileWriter::closeFile() {\n  if (currentWriter_ == nullptr) {\n    return CloseFileResult::Err(\"No file open\");\n  }\n  auto closeResult = currentWriter_->closeFile();\n  if (closeResult.is_err()) {\n    return CloseFileResult::Err(closeResult.unwrap_err());\n  }\n  const auto &lastTuple = closeResult.unwrap();\n  const double totalSizeMB = cumulativeSizeMB_ + std::get<0>(lastTuple);\n  const double totalDurationSec = cumulativeDurationSec_ + std::get<1>(lastTuple);\n  cumulativeSizeMB_ = 0.0;\n  cumulativeDurationSec_ = 0.0;\n  return CloseFileResult::Ok({totalSizeMB, totalDurationSec});\n}\n\nvoid RotatingFileWriter::rotateFiles() {\n  auto rotatedClose = currentWriter_->closeFile();\n  if (rotatedClose.is_ok()) {\n    const auto &t = rotatedClose.unwrap();\n    cumulativeSizeMB_ += std::get<0>(t);\n    cumulativeDurationSec_ += std::get<1>(t);\n  }\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/RotatingFileWriter.h",
    "content": "#pragma once\n\n#include <audioapi/core/utils/AudioFileWriter.h>\n#include <audioapi/utils/AudioFileProperties.h>\n\n#include <functional>\n#include <memory>\n#include <string>\n\nnamespace audioapi {\n\nclass RotatingFileWriter {\n public:\n  virtual ~RotatingFileWriter() = default;\n  using WriterFactory =\n      std::function<std::shared_ptr<AudioFileWriter>(const std::shared_ptr<AudioFileProperties> &)>;\n  using OnSegmentFileOpenedCallback = std::function<void(const std::string &)>;\n\n  RotatingFileWriter(\n      size_t rotateIntervalBytes,\n      WriterFactory writerFactory,\n      OnSegmentFileOpenedCallback onSegmentFileOpened);\n\n  CloseFileResult closeFile();\n  virtual void rotateFiles();\n\n protected:\n  static constexpr int FILE_SIZE_CHECK_WRITE_INTERVAL = 10;\n\n  WriterFactory writerFactory_;\n  OnSegmentFileOpenedCallback onSegmentFileOpened_;\n  size_t rotateIntervalBytes_;\n  size_t writesSinceLastCheck_ = 0;\n  std::shared_ptr<AudioFileWriter> currentWriter_;\n  std::string baseFileName_;\n\n  double cumulativeSizeMB_{0.0};\n  double cumulativeDurationSec_{0.0};\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/graph/AudioGraph.hpp",
    "content": "#pragma once\n\n#include <audioapi/core/AudioNode.h>\n#include <audioapi/core/utils/graph/InputPool.hpp>\n#include <audioapi/core/utils/graph/NodeHandle.hpp>\n\n#include <algorithm>\n#include <cassert>\n#include <concepts>\n#include <cstdint>\n#include <iterator>\n#include <memory>\n#include <ranges>\n#include <utility>\n#include <vector>\n\nnamespace audioapi::utils::graph {\n\ntemplate <typename T>\nconcept AudioGraphNode = std::derived_from<T, ::audioapi::AudioNode>;\n\n/// @brief Cache-friendly, index-stable node storage with in-place topological sort.\n///\n/// Nodes are stored in a flat vector that is kept topologically sorted\n/// (sources first, sinks last). The graph supports O(V+E) compaction of\n/// orphaned nodes and O(1)-extra-space Kahn's toposort.\n///\n/// @note Can store at most 2^30 nodes due to bit-packed indices (~10^9).\ntemplate <AudioGraphNode NodeType>\nclass AudioGraph {\n  // ── Node ────────────────────────────────────────────────────────────────\n\n  struct Node {\n    Node() = default;\n    explicit Node(std::shared_ptr<NodeHandle<NodeType>> handle) : handle(handle) {}\n\n    std::shared_ptr<NodeHandle<NodeType>> handle = nullptr; // owned handle bridging to HostGraph\n    std::uint32_t input_head = InputPool::kNull;            // head of input linked list in pool_\n\n    std::uint32_t topo_out_degree : 31 = 0; // scratch — Kahn's out-degree counter\n    unsigned will_be_deleted : 1 = 0;       // scratch — marked for compaction removal\n    std::int32_t after_compaction_ind : 31 =\n        -1; // scratch — new index after compaction / BFS linked-list next\n\n    /// Node is removed when: orphaned && inputs.empty() && canBeDestructed()\n    unsigned orphaned : 1 = 0; // means this node was removed from host graph\n\n#if RN_AUDIO_API_TEST\n    size_t test_node_identifier__ = 0;\n#endif\n  };\n\n public:\n  AudioGraph() = default;\n  ~AudioGraph() = default;\n\n  AudioGraph(const AudioGraph &) = delete;\n  AudioGraph &operator=(const AudioGraph &) = delete;\n\n  AudioGraph(AudioGraph &&) noexcept = default;\n  AudioGraph &operator=(AudioGraph &&) noexcept = default;\n\n  /// @brief Entry returned by iter() — a reference to the audio node and a view of its inputs.\n  template <typename InputsView>\n  struct Entry {\n    NodeType &audioNode;\n    InputsView inputs;\n  };\n\n  // ── Accessors ───────────────────────────────────────────────────────────\n\n  /// @brief Access node by flat-vector index.\n  [[nodiscard]] Node &operator[](std::uint32_t index);\n\n  /// @brief Access node by flat-vector index (const).\n  [[nodiscard]] const Node &operator[](std::uint32_t index) const;\n\n  /// @brief Number of live nodes in the graph.\n  [[nodiscard]] size_t size() const;\n\n  /// @brief Whether the graph is empty.\n  [[nodiscard]] bool empty() const;\n\n  /// @brief Provides an iterable view of the nodes in topological order.\n  ///\n  /// Each entry contains a reference to the AudioNode and an immutable view\n  /// of its inputs (as references to AudioNodes).\n  ///\n  /// ## Example usage:\n  /// ```cpp\n  /// for (auto [audioNode, inputs] : graph.iter()) {\n  ///   // process audioNode and its inputs\n  /// }\n  /// ```\n  /// @note Lifetime of entries is bound to this graph — they are not owned.\n  /// @note Using this iterator after modifying the graph is undefined behavior.\n  [[nodiscard]] auto iter();\n\n  /// @brief Returns a reference to the input pool used for edge storage.\n  [[nodiscard]] InputPool &pool();\n  [[nodiscard]] const InputPool &pool() const;\n\n  /// @brief Pre-reserves the internal node vector to at least `capacity`.\n  ///\n  /// Call from `processGrowEvents()` (outside the allocation-free zone)\n  /// so that subsequent `addNode` calls within `processEvents()` do not\n  /// trigger vector reallocation.\n  void reserveNodes(std::uint32_t capacity);\n\n  // ── Mutators ────────────────────────────────────────────────────────────\n\n  /// @brief Marks the topological ordering as dirty so the next process()\n  /// recomputes it.\n  void markDirty();\n\n  /// @brief Adds a new node. AudioGraph takes shared ownership of the handle.\n  /// @param handle shared NodeHandle bridging to HostGraph\n  void addNode(std::shared_ptr<NodeHandle<NodeType>> handle);\n\n  /// @brief Recomputes topological order (if dirty), then compacts the graph\n  /// by removing orphaned, input-free, destructible nodes.\n  ///\n  /// When a node is compacted out its `shared_ptr<NodeHandle>` is released\n  /// (refcount drops 2 → 1). HostGraph detects this via `use_count() == 1`\n  /// and destroys the ghost + AudioNode on the main thread.\n  ///\n  /// Uses a two-pass approach: pass 1 marks deletions (cascading in topo\n  /// order) and computes index remapping; pass 2 remaps inputs and shifts\n  /// kept nodes left.\n  ///\n  /// Time: O(V + E)\n  ///\n  /// Extra space: O(1) — everything in place.\n  void process();\n\n private:\n  std::vector<Node> nodes;       // always kept topologically sorted\n  InputPool pool_;               // pool backing all input linked lists\n  bool topo_order_dirty = false; // set by markDirty(), cleared by process()\n\n  /// @brief In-place Kahn's toposort (sources first, sinks last).\n  ///\n  /// Uses `after_compaction_ind` as an embedded FIFO linked-list for the\n  /// BFS queue, and cycle-sort for the final permutation.\n  ///\n  /// Time: O(V + E)\n  ///\n  /// Extra space: O(1).\n  void kahn_toposort();\n};\n\n// =========================================================================\n// Implementation\n// =========================================================================\n\n// ── Accessors ─────────────────────────────────────────────────────────────\n\ntemplate <AudioGraphNode NodeType>\nauto AudioGraph<NodeType>::operator[](std::uint32_t index) -> Node & {\n  return nodes[index];\n}\n\ntemplate <AudioGraphNode NodeType>\nauto AudioGraph<NodeType>::operator[](std::uint32_t index) const -> const Node & {\n  return nodes[index];\n}\n\ntemplate <AudioGraphNode NodeType>\nsize_t AudioGraph<NodeType>::size() const {\n  return nodes.size();\n}\n\ntemplate <AudioGraphNode NodeType>\nbool AudioGraph<NodeType>::empty() const {\n  return nodes.empty();\n}\n\ntemplate <AudioGraphNode NodeType>\nauto AudioGraph<NodeType>::iter() {\n  return nodes | std::views::transform([this](Node &node) {\n           return Entry{\n               *node.handle->audioNode,\n               pool_.view(node.input_head) |\n                   std::views::transform([this](std::uint32_t idx) -> const NodeType & {\n                     return *nodes[idx].handle->audioNode;\n                   })};\n         });\n}\n\ntemplate <AudioGraphNode NodeType>\nInputPool &AudioGraph<NodeType>::pool() {\n  return pool_;\n}\n\ntemplate <AudioGraphNode NodeType>\nconst InputPool &AudioGraph<NodeType>::pool() const {\n  return pool_;\n}\n\ntemplate <AudioGraphNode NodeType>\nvoid AudioGraph<NodeType>::reserveNodes(std::uint32_t capacity) {\n  nodes.reserve(capacity);\n}\n\n// ── Mutators ──────────────────────────────────────────────────────────────\n\ntemplate <AudioGraphNode NodeType>\nvoid AudioGraph<NodeType>::markDirty() {\n  topo_order_dirty = true;\n}\n\ntemplate <AudioGraphNode NodeType>\nvoid AudioGraph<NodeType>::addNode(std::shared_ptr<NodeHandle<NodeType>> handle) {\n  handle->index = static_cast<std::uint32_t>(nodes.size());\n  nodes.emplace_back(std::move(handle));\n}\n\ntemplate <AudioGraphNode NodeType>\nvoid AudioGraph<NodeType>::process() {\n  if (topo_order_dirty) {\n    topo_order_dirty = false;\n    kahn_toposort();\n    if (topo_order_dirty) {\n      return;\n    }\n  }\n\n  const auto n = static_cast<std::uint32_t>(nodes.size());\n\n  // ── Pass 1: mark deletions (cascading, left-to-right in topo order) ────\n  // A node is deleted when: orphaned && no live inputs && canBeDestructed().\n  // Because the array is topologically sorted, removing a source first lets\n  // its dependents see the updated input set and potentially cascade.\n  for (auto &node : nodes) {\n    pool_.removeIf(\n        node.input_head, [this](std::uint32_t inp) { return nodes[inp].will_be_deleted; });\n\n    if (node.orphaned && InputPool::isEmpty(node.input_head) &&\n        node.handle->audioNode->canBeDestructed()) {\n      node.will_be_deleted = true;\n    }\n  }\n\n  // ── Compute new-position remap (stored in after_compaction_ind) ─────────\n  std::uint32_t new_pos = 0;\n  for (std::uint32_t i = 0; i < n; i++) {\n    if (!nodes[i].will_be_deleted) {\n      nodes[i].after_compaction_ind = static_cast<std::int32_t>(new_pos);\n      new_pos++;\n    }\n    // deleted nodes keep after_compaction_ind == -1 (default)\n  }\n\n  // ── Pass 2a: remap inputs to post-compaction indices ─────────────────────\n  // Must happen BEFORE shifting nodes, because shifting invalidates source\n  // positions that later nodes' inputs may still reference.\n  for (std::uint32_t e = 0; e < n; e++) {\n    if (nodes[e].will_be_deleted)\n      continue;\n    for (auto &inp : pool_.mutableView(nodes[e].input_head)) {\n      inp = static_cast<std::uint32_t>(nodes[inp].after_compaction_ind);\n    }\n  }\n\n  // ── Pass 2b: compact — shift kept nodes left ───────────────────────────\n  std::uint32_t b = 0;\n  for (std::uint32_t e = 0; e < n; e++) {\n    if (nodes[e].will_be_deleted)\n      continue;\n    if (b != e) {\n      nodes[b] = std::move(nodes[e]);\n      nodes[e].input_head = InputPool::kNull; // prevent double-free in truncation\n    }\n    nodes[b].handle->index = b;\n    b++;\n  }\n\n  // Truncate — dropping shared_ptr decrements refcount (2 → 1);\n  // HostGraph detects this and destroys the ghost on the main thread.\n  for (std::uint32_t i = b; i < n; i++) {\n    // Free any lingering pool slots (should already be empty for deleted nodes)\n    pool_.freeAll(nodes[i].input_head);\n    nodes[i].handle = nullptr;\n  }\n  nodes.resize(b);\n\n  // Reset scratch fields for next compaction\n  for (auto &node : nodes) {\n    node.after_compaction_ind = -1;\n    node.will_be_deleted = false;\n  }\n}\n\n// ── Kahn's toposort ───────────────────────────────────────────────────────\n\ntemplate <AudioGraphNode NodeType>\nvoid AudioGraph<NodeType>::kahn_toposort() {\n  const auto n = static_cast<std::uint32_t>(nodes.size());\n  if (n <= 1)\n    return;\n\n  // Phase 1: compute out-degree\n  for (const auto &nd : nodes) {\n    for (std::uint32_t inp : pool_.view(nd.input_head))\n      nodes[inp].topo_out_degree++;\n  }\n\n  // Phase 2: reverse Kahn BFS — sinks first, sources last in dequeue order.\n  // FIFO queue embedded as a linked list through after_compaction_ind.\n  std::int32_t qh = -1, qt = -1;\n  auto enq = [&](std::uint32_t i) {\n    nodes[i].after_compaction_ind = -1;\n    if (qh == -1) [[unlikely]] {\n      qh = qt = static_cast<std::int32_t>(i);\n    } else {\n      nodes[qt].after_compaction_ind = static_cast<std::int32_t>(i);\n      qt = static_cast<std::int32_t>(i);\n    }\n  };\n\n  for (std::uint32_t i = 0; i < n; i++) {\n    if (nodes[i].topo_out_degree == 0)\n      enq(i);\n  }\n\n  std::uint32_t write = n;\n  while (qh != -1) {\n    auto idx = static_cast<std::uint32_t>(qh);\n    qh = nodes[idx].after_compaction_ind;\n    nodes[idx].after_compaction_ind = static_cast<std::int32_t>(--write);\n\n    for (std::uint32_t inp : pool_.view(nodes[idx].input_head)) {\n      if (--nodes[inp].topo_out_degree == 0)\n        enq(inp);\n    }\n  }\n\n  // Phase 3: remap input indices to new positions (before nodes move)\n  for (auto &nd : nodes) {\n    for (std::uint32_t &inp : pool_.mutableView(nd.input_head))\n      inp = static_cast<std::uint32_t>(nodes[inp].after_compaction_ind);\n  }\n\n  // Phase 4: apply permutation in place via cycle sort\n  for (std::uint32_t i = 0; i < n; i++) {\n    while (nodes[i].after_compaction_ind != static_cast<std::int32_t>(i)) {\n      auto t = static_cast<std::uint32_t>(nodes[i].after_compaction_ind);\n      std::swap(nodes[i], nodes[t]);\n    }\n  }\n\n  // Phase 5: update handle indices & reset scratch\n  for (std::uint32_t i = 0; i < n; i++) {\n    if (nodes[i].handle)\n      nodes[i].handle->index = i;\n    nodes[i].after_compaction_ind = -1;\n  }\n}\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/graph/Disposer.hpp",
    "content": "#pragma once\n\n#include <audioapi/utils/SpscChannel.hpp>\n\n#include <cstddef>\n#include <cstring>\n#include <new>\n#include <thread>\n#include <type_traits>\n#include <utility>\n\nnamespace audioapi::utils::graph {\n\n/// @brief A disposal payload that can hold any trivially-relocatable or\n/// move-constructible type up to N bytes. The value is moved into a raw byte\n/// buffer, sent over a channel as plain data, and its destructor is called on\n/// the worker thread via a type-erased function pointer.\n/// @tparam N Maximum size in bytes of the object that can be stored.\ntemplate <size_t N>\nstruct DisposalPayload {\n  alignas(std::max_align_t) std::byte data[N];\n  void (*destructor)(void *); // type-erased destructor\n\n  /// @brief Sentinel check — a null destructor means \"shutdown\".\n  bool isSentinel() const;\n\n  /// @brief Creates a sentinel payload used to signal worker thread shutdown.\n  static DisposalPayload sentinel();\n\n  /// @brief Creates a payload by move-constructing the value into the raw byte\n  /// buffer.\n  /// @tparam T The type of value to store. Must fit in N bytes.\n  /// @param value The value to move into the payload.\n  template <typename T>\n  static DisposalPayload create(T &&value);\n\n  /// @brief Invokes the stored destructor on the data buffer.\n  void destroy();\n};\n\n/// @brief Abstract base for disposing objects on a separate thread.\n/// @tparam N Maximum size in bytes of objects that can be disposed.\ntemplate <size_t N>\nclass Disposer {\n public:\n  virtual ~Disposer() = default;\n\n  /// @brief Disposes a value by moving it into a payload and sending it to the\n  /// worker thread. The destructor will be called on the worker thread.\n  /// @tparam T The type of value to dispose. Must be move-constructible and\n  /// fit in N bytes.\n  /// @param value The value to dispose (will be moved from).\n  /// @return true if successfully enqueued, false if the channel was full.\n  template <typename T>\n  bool dispose(T &&value);\n\n protected:\n  virtual bool doDispose(DisposalPayload<N> &&payload) = 0;\n};\n\n/// @brief Performs destruction on a separate worker thread.\n/// @tparam N Maximum size in bytes of objects that can be disposed.\ntemplate <size_t N>\nclass DisposerImpl : public Disposer<N> {\n  using Payload = DisposalPayload<N>;\n\n  using Sender = audioapi::channels::spsc::Sender<\n      Payload,\n      audioapi::channels::spsc::OverflowStrategy::WAIT_ON_FULL,\n      audioapi::channels::spsc::WaitStrategy::ATOMIC_WAIT>;\n\n public:\n  explicit DisposerImpl(size_t channelCapacity = 1024);\n  ~DisposerImpl() override;\n\n protected:\n  bool doDispose(DisposalPayload<N> &&payload) override;\n\n private:\n  Sender sender_;\n  std::thread workerHandle_;\n};\n\n// =========================================================================\n// Implementation\n// =========================================================================\n\n// ── DisposalPayload ───────────────────────────────────────────────────────\n\ntemplate <size_t N>\nbool DisposalPayload<N>::isSentinel() const {\n  return destructor == nullptr;\n}\n\ntemplate <size_t N>\nDisposalPayload<N> DisposalPayload<N>::sentinel() {\n  DisposalPayload p;\n  p.destructor = nullptr;\n  return p;\n}\n\ntemplate <size_t N>\ntemplate <typename T>\nDisposalPayload<N> DisposalPayload<N>::create(T &&value) {\n  using DecayedT = std::decay_t<T>;\n  static_assert(sizeof(DecayedT) <= N, \"Type too large for DisposalPayload\");\n  static_assert(\n      alignof(DecayedT) <= alignof(std::max_align_t), \"Type alignment exceeds max_align_t\");\n\n  DisposalPayload p;\n  // Move-construct the value into the raw buffer\n  new (p.data) DecayedT(std::forward<T>(value));\n  p.destructor = [](void *ptr) {\n    static_cast<DecayedT *>(ptr)->~DecayedT();\n  };\n  return p;\n}\n\ntemplate <size_t N>\nvoid DisposalPayload<N>::destroy() {\n  if (destructor != nullptr) {\n    destructor(data);\n  }\n}\n\n// ── Disposer ──────────────────────────────────────────────────────────────\n\ntemplate <size_t N>\ntemplate <typename T>\nbool Disposer<N>::dispose(T &&value) {\n  return doDispose(DisposalPayload<N>::template create<T>(std::forward<T>(value)));\n}\n\n// ── DisposerImpl ──────────────────────────────────────────────────────────\n\ntemplate <size_t N>\nDisposerImpl<N>::DisposerImpl(size_t channelCapacity) {\n  using namespace audioapi::channels::spsc;\n  auto [sender, receiver] =\n      channel<Payload, OverflowStrategy::WAIT_ON_FULL, WaitStrategy::ATOMIC_WAIT>(channelCapacity);\n  sender_ = std::move(sender);\n  workerHandle_ = std::thread([receiver = std::move(receiver)]() mutable {\n    while (true) {\n      auto payload = receiver.receive();\n      if (payload.isSentinel()) {\n        break;\n      }\n      payload.destroy();\n    }\n  });\n}\n\ntemplate <size_t N>\nDisposerImpl<N>::~DisposerImpl() {\n  sender_.send(Payload::sentinel());\n  if (workerHandle_.joinable()) {\n    workerHandle_.join();\n  }\n}\n\ntemplate <size_t N>\nbool DisposerImpl<N>::doDispose(DisposalPayload<N> &&payload) {\n  return sender_.try_send(std::move(payload)) == audioapi::channels::spsc::ResponseStatus::SUCCESS;\n}\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/graph/Graph.hpp",
    "content": "#pragma once\n\n#include <audioapi/core/utils/graph/AudioGraph.hpp>\n#include <audioapi/core/utils/graph/Disposer.hpp>\n#include <audioapi/core/utils/graph/HostGraph.hpp>\n#include <audioapi/core/utils/graph/InputPool.hpp>\n\n#include <audioapi/utils/FatFunction.hpp>\n#include <audioapi/utils/SpscChannel.hpp>\n\n#include <audioapi/utils/Result.hpp>\n\n#include <algorithm>\n#include <cstdint>\n#include <memory>\n#include <utility>\n\nnamespace audioapi::utils::graph {\n\n/// @brief Thread-safe graph coordinator that bridges HostGraph (main thread)\n/// and AudioGraph (audio thread) via a single SPSC event channel.\n///\n/// Memory pre-growth: the main thread tracks edge and node counts. When\n/// growth is needed it sends an inline grow AGEvent immediately followed\n/// by the graph-mutation AGEvent through the **same** channel, guaranteeing\n/// FIFO ordering: the audio thread always applies growth before the\n/// operation that needs it.\n///\n/// ## Audio-thread call order\n/// ```\n/// graph.processEvents();       // apply pending graph mutations (if any) — in FIFO order\n/// graph.process();             // toposort + compaction\n/// for (auto&& [node, inputs] : graph.iter()) { ... }\n/// ```\ntemplate <AudioGraphNode NodeType>\nclass Graph {\n  using AGEvent = HostGraph<NodeType>::AGEvent;\n\n  // ── Event channel (main → audio): grow + graph mutations ───────────────\n\n  using EventReceiver = audioapi::channels::spsc::Receiver<\n      AGEvent,\n      audioapi::channels::spsc::OverflowStrategy::WAIT_ON_FULL,\n      audioapi::channels::spsc::WaitStrategy::BUSY_LOOP>;\n  using EventSender = audioapi::channels::spsc::Sender<\n      AGEvent,\n      audioapi::channels::spsc::OverflowStrategy::WAIT_ON_FULL,\n      audioapi::channels::spsc::WaitStrategy::BUSY_LOOP>;\n\n  using HNode = HostGraph<NodeType>::Node;\n\n public:\n  using ResultError = HostGraph<NodeType>::ResultError;\n  using Res = Result<NoneType, ResultError>;\n\n  explicit Graph(size_t eventQueueCapacity) {\n    using namespace audioapi::channels::spsc;\n\n    auto [es, er] = channel<AGEvent, OverflowStrategy::WAIT_ON_FULL, WaitStrategy::BUSY_LOOP>(\n        eventQueueCapacity);\n    eventSender_ = std::move(es);\n    eventReceiver_ = std::move(er);\n  }\n\n  Graph(\n      size_t eventQueueCapacity,\n      std::uint32_t initialNodeCapacity,\n      std::uint32_t initialEdgeCapacity)\n      : Graph(eventQueueCapacity) {\n    if (initialNodeCapacity > 0) {\n      audioGraph.reserveNodes(initialNodeCapacity);\n      nodeCapacity_ = initialNodeCapacity;\n    }\n    if (initialEdgeCapacity > 0) {\n      audioGraph.pool().grow(initialEdgeCapacity);\n      poolCapacity_ = initialEdgeCapacity;\n    }\n  }\n\n  // ── Audio-thread API ────────────────────────────────────────────────────\n\n  /// @brief Processes all scheduled events (grow + graph-mutation).\n  ///\n  /// Grow events (pool buffer adoption, node vector reserve) may allocate,\n  /// so call this **before** entering the allocation-free zone.\n  /// Graph-mutation events (addNode, orphan, push, remove, markDirty) are\n  /// allocation-free because their capacity was ensured by a preceding\n  /// grow event in the same FIFO.\n  ///\n  /// @note Should be called only from the audio thread.\n  void processEvents() {\n    AGEvent event;\n    while (eventReceiver_.try_receive(event) == audioapi::channels::spsc::ResponseStatus::SUCCESS) {\n      if (event) {\n        event(audioGraph, disposer_);\n      }\n    }\n  }\n\n  /// @brief Runs toposort + compaction on the audio graph.\n  /// Allocation-free.\n  /// @note Should be called only from the audio thread.\n  void process() {\n    audioGraph.process();\n  }\n\n  /// @brief Returns an iterable view of nodes in topological order.\n  ///\n  /// Each entry contains a reference to the NodeType and an immutable view\n  /// of its inputs (as references to NodeType).\n  /// Allocation-free.\n  ///\n  /// @note Should be called only from the audio thread, after process().\n  [[nodiscard]] auto iter() {\n    return audioGraph.iter();\n  }\n\n  // ── Main-thread API ────────────────────────────────────────────────────\n\n  /// @brief Adds a new node to the graph and returns a pointer to it.\n  /// @param audioNode the audio processing node to add (ownership transferred)\n  /// @return pointer to the newly added HostGraph::Node\n  HNode *addNode(std::unique_ptr<NodeType> audioNode = nullptr) {\n    hostGraph.collectDisposedNodes();\n\n    auto handle = std::make_shared<NodeHandle<NodeType>>(0, std::move(audioNode));\n    auto [hostNode, event] = hostGraph.addNode(handle);\n\n    sendNodeGrowIfNeeded();\n\n    eventSender_.send(std::move(event));\n    return hostNode;\n  }\n\n  /// @brief Removes a node (marks as ghost). Pointer remains valid until\n  /// the ghost is collected after AudioGraph releases its shared_ptr.\n  Res removeNode(HNode *node) {\n    hostGraph.collectDisposedNodes();\n    return hostGraph.removeNode(node).map([&](AGEvent event) {\n      eventSender_.send(std::move(event));\n      return NoneType{};\n    });\n  }\n\n  /// @brief Adds a directed edge from → to. Rejects cycles and duplicates.\n  Res addEdge(HNode *from, HNode *to) {\n    hostGraph.collectDisposedNodes();\n    return hostGraph.addEdge(from, to).map([&](AGEvent event) {\n      sendPoolGrowIfNeeded();\n      eventSender_.send(std::move(event));\n      return NoneType{};\n    });\n  }\n\n  /// @brief Removes a directed edge from → to.\n  Res removeEdge(HNode *from, HNode *to) {\n    hostGraph.collectDisposedNodes();\n    return hostGraph.removeEdge(from, to).map([&](AGEvent event) {\n      eventSender_.send(std::move(event));\n      return NoneType{};\n    });\n  }\n\n private:\n  static constexpr size_t kDisposerPayloadSize = HostGraph<NodeType>::kDisposerPayloadSize;\n\n  using OwnedSlotBuffer = std::unique_ptr<InputPool::Slot[]>;\n\n  // Aligning to cache line size to prevent false sharing between audio and main thread\n  alignas(hardware_destructive_interference_size) AudioGraph<NodeType> audioGraph;\n  alignas(hardware_destructive_interference_size) HostGraph<NodeType> hostGraph;\n\n  // ── Channel (immutable after construction — no false sharing) ───────────\n\n  EventSender eventSender_;\n  EventReceiver eventReceiver_;\n\n  // ── Disposer — destroys old pool buffers off the audio thread ───────────\n\n  DisposerImpl<kDisposerPayloadSize> disposer_{64};\n\n  // ── Main-thread tracking for pre-growth ─────────────────────────────────\n\n  std::uint32_t poolCapacity_ = 0; ///< Pool capacity we have ensured\n  std::uint32_t nodeCapacity_ = 0; ///< Node vector capacity we have ensured\n\n  /// @brief Pre-grows the InputPool when the edge count approaches capacity.\n  ///\n  /// Queries HostGraph::edgeCount() for the current truth. Allocates a new\n  /// slot buffer on the main thread and sends it as an AGEvent through the\n  /// event channel. The old buffer is sent to the Disposer for deallocation\n  /// on a separate thread — never on the audio thread.\n  void sendPoolGrowIfNeeded() {\n    auto edges = static_cast<std::uint32_t>(hostGraph.edgeCount());\n    // edges > poolCapacity_ / 2 || (poolCapacity_ == 0 && edges > 0) left for clarity\n    if (edges > poolCapacity_ / 2) {\n      std::uint32_t newCap = std::max(static_cast<std::uint32_t>(edges * 2), std::uint32_t{64});\n      auto buf = std::make_unique<InputPool::Slot[]>(newCap);\n      eventSender_.send(\n          [buf = std::move(buf), newCap](\n              AudioGraph<NodeType> &graph, Disposer<kDisposerPayloadSize> &disposer) mutable {\n            auto *old = graph.pool().adoptBuffer(buf.release(), newCap);\n            if (old) {\n              disposer.dispose(OwnedSlotBuffer(old));\n            }\n          });\n      poolCapacity_ = newCap;\n    }\n  }\n\n  /// @brief Pre-reserves the AudioGraph node vector when node count exceeds\n  /// the last ensured capacity. Queries HostGraph::nodeCount() for the\n  /// current truth. Sends a grow event through the event channel.\n  void sendNodeGrowIfNeeded() {\n    auto nodes = static_cast<std::uint32_t>(hostGraph.nodeCount());\n    if (nodes > nodeCapacity_) {\n      std::uint32_t newCap = std::max(static_cast<std::uint32_t>(nodes * 2), std::uint32_t{64});\n      eventSender_.send(\n          [newCap](AudioGraph<NodeType> &graph, auto &) { graph.reserveNodes(newCap); });\n      nodeCapacity_ = newCap;\n    }\n  }\n\n  friend class GraphTest;\n};\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/graph/HostGraph.hpp",
    "content": "#pragma once\n\n#include <audioapi/core/utils/graph/AudioGraph.hpp>\n#include <audioapi/core/utils/graph/Disposer.hpp>\n#include <audioapi/core/utils/graph/NodeHandle.hpp>\n#include <audioapi/utils/FatFunction.hpp>\n#include <audioapi/utils/Result.hpp>\n\n#include <algorithm>\n#include <memory>\n#include <utility>\n#include <vector>\n\nclass GraphCycleDebugTest;\n\nnamespace audioapi::utils::graph {\n\ntemplate <AudioGraphNode NodeType>\nclass HostGraph;\ntemplate <AudioGraphNode NodeType>\nclass Graph;\nclass TestGraphUtils;\n\n/// @brief Main-thread graph mirror that keeps structure in sync with AudioGraph.\n///\n/// Maintains adjacency lists (inputs / outputs) for O(V+E) cycle detection\n/// via DFS. Every mutation produces an `AGEvent` lambda that, when executed on\n/// the audio thread, applies the same structural change to AudioGraph.\n///\n/// Ghost nodes: when a node is removed it is marked `ghost = true` but its\n/// edges are kept so that `hasPath` still sees paths through nodes that are\n/// alive in AudioGraph. Ghosts are collected once AudioGraph releases its\n/// shared_ptr (detected via `use_count() == 1`).\n///\n/// @note Use through the Graph wrapper for safety.\ntemplate <AudioGraphNode NodeType>\nclass HostGraph {\n public:\n  enum class ResultError {\n    NODE_NOT_FOUND,\n    CYCLE_DETECTED,\n    EDGE_NOT_FOUND,\n    EDGE_ALREADY_EXISTS,\n  };\n\n  /// Size of the Disposer payload (= sizeof(std::unique_ptr<T[]>)).\n  static constexpr size_t kDisposerPayloadSize = 8;\n\n  /// Event that modifies AudioGraph to keep it consistent with HostGraph.\n  /// The second argument is the Disposer used to offload buffer deallocation.\n  using AGEvent = FatFunction<32, void(AudioGraph<NodeType> &, Disposer<kDisposerPayloadSize> &)>;\n\n  using Res = Result<AGEvent, ResultError>;\n\n  /// Per-node scratch used by graph traversals (e.g. hasPath).\n  struct TraversalState {\n    size_t term = 0;\n\n    /// @return true if node was not yet visited in the current traversal term\n    bool visit(size_t currentTerm);\n  };\n\n  /// A single node in the HostGraph.\n  struct Node {\n    std::vector<Node *> inputs;  // reversed edges\n    std::vector<Node *> outputs; // forward edges\n    TraversalState traversalState;\n    std::shared_ptr<NodeHandle<NodeType>> handle; // shared handle bridging to AudioGraph\n    bool ghost = false; // kept for cycle detection until AudioGraph confirms deletion\n\n#if RN_AUDIO_API_TEST\n    size_t test_node_identifier__ = 0;\n#endif\n\n    /// Destructor tears down all edges touching this node.\n    ~Node();\n  };\n\n  // ── Lifecycle ───────────────────────────────────────────────────────────\n\n  HostGraph() = default;\n  ~HostGraph();\n\n  HostGraph(const HostGraph &) = delete;\n  HostGraph &operator=(const HostGraph &) = delete;\n\n  HostGraph(HostGraph &&other) noexcept;\n  HostGraph &operator=(HostGraph &&other) noexcept;\n\n  // ── Public API ──────────────────────────────────────────────────────────\n\n  /// @brief Adds a new node to the graph.\n  /// @param handle shared handle that bridges HostGraph ↔ AudioGraph\n  /// @return pair of (raw Node pointer, AGEvent to replay on AudioGraph)\n  std::pair<Node *, AGEvent> addNode(std::shared_ptr<NodeHandle<NodeType>> handle);\n\n  /// @brief Removes a node (marks it as ghost, keeps edges for cycle detection).\n  /// @return AGEvent that sets `orphaned = true` on the AudioGraph side.\n  Res removeNode(Node *node);\n\n  /// @brief Adds a directed edge from → to. Rejects cycles and duplicates.\n  /// @return AGEvent that adds the input on the AudioGraph side.\n  Res addEdge(Node *from, Node *to);\n\n  /// @brief Removes a directed edge from → to.\n  /// @return AGEvent that removes the input on the AudioGraph side.\n  Res removeEdge(Node *from, Node *to);\n\n  /// @brief Current number of live (non-ghost) edges.\n  [[nodiscard]] size_t edgeCount() const;\n\n  /// @brief Current number of nodes (including ghosts).\n  [[nodiscard]] size_t nodeCount() const;\n\n private:\n  std::vector<Node *> nodes;\n  size_t edgeCount_ = 0;\n  size_t last_term = 0; // monotonic counter for traversal freshness\n\n  /// @brief DFS reachability check (traverses ghosts too).\n  bool hasPath(Node *start, Node *end);\n\n  /// @brief Scans ghost nodes and deletes those whose handle has\n  /// `use_count() == 1`, meaning AudioGraph has released its reference.\n  void collectDisposedNodes();\n\n  friend class Graph<NodeType>;\n  friend class TestGraphUtils;\n  friend class HostGraphTest;\n  friend class GraphCycleDebugTest;\n};\n\n// =========================================================================\n// Implementation\n// =========================================================================\n\ntemplate <AudioGraphNode NodeType>\nbool HostGraph<NodeType>::TraversalState::visit(size_t currentTerm) {\n  if (term == currentTerm) {\n    return false;\n  }\n  term = currentTerm;\n  return true;\n}\n\ntemplate <AudioGraphNode NodeType>\nHostGraph<NodeType>::Node::~Node() {\n  for (Node *input : inputs) {\n    auto &outs = input->outputs;\n    outs.erase(std::remove(outs.begin(), outs.end(), this), outs.end());\n  }\n  for (Node *output : outputs) {\n    auto &inps = output->inputs;\n    inps.erase(std::remove(inps.begin(), inps.end(), this), inps.end());\n  }\n}\n\n// ── Lifecycle ─────────────────────────────────────────────────────────────\n\ntemplate <AudioGraphNode NodeType>\nHostGraph<NodeType>::~HostGraph() {\n  for (Node *n : nodes) {\n    delete n;\n  }\n  nodes.clear();\n}\n\ntemplate <AudioGraphNode NodeType>\nHostGraph<NodeType>::HostGraph(HostGraph &&other) noexcept\n    : nodes(std::move(other.nodes)), edgeCount_(other.edgeCount_), last_term(other.last_term) {\n  other.edgeCount_ = 0;\n  other.last_term = 0;\n}\n\ntemplate <AudioGraphNode NodeType>\nauto HostGraph<NodeType>::operator=(HostGraph &&other) noexcept -> HostGraph & {\n  if (this != &other) {\n    for (Node *n : nodes) {\n      delete n;\n    }\n    nodes = std::move(other.nodes);\n    edgeCount_ = other.edgeCount_;\n    last_term = other.last_term;\n    other.edgeCount_ = 0;\n    other.last_term = 0;\n  }\n  return *this;\n}\n\ntemplate <AudioGraphNode NodeType>\nauto HostGraph<NodeType>::addNode(std::shared_ptr<NodeHandle<NodeType>> handle)\n    -> std::pair<Node *, AGEvent> {\n  Node *newNode = new Node();\n  newNode->handle = handle;\n  nodes.push_back(newNode);\n\n  auto event = [h = std::move(handle)](auto &graph, auto &) {\n    graph.addNode(h);\n  };\n\n  return {newNode, std::move(event)};\n}\n\ntemplate <AudioGraphNode NodeType>\nauto HostGraph<NodeType>::removeNode(Node *node) -> Res {\n  auto it = std::find(nodes.begin(), nodes.end(), node);\n  if (it == nodes.end()) {\n    return Res::Err(ResultError::NODE_NOT_FOUND);\n  }\n\n  node->ghost = true;\n\n  return Res::Ok(\n      [h = node->handle](AudioGraph<NodeType> &graph, auto &) { graph[h->index].orphaned = true; });\n}\n\ntemplate <AudioGraphNode NodeType>\nauto HostGraph<NodeType>::addEdge(Node *from, Node *to) -> Res {\n  if (std::find(nodes.begin(), nodes.end(), from) == nodes.end() ||\n      std::find(nodes.begin(), nodes.end(), to) == nodes.end()) {\n    return Res::Err(ResultError::NODE_NOT_FOUND);\n  }\n  if (from->ghost || to->ghost) {\n    return Res::Err(ResultError::NODE_NOT_FOUND);\n  }\n\n  for (Node *out : from->outputs) {\n    if (out == to)\n      return Res::Err(ResultError::EDGE_ALREADY_EXISTS);\n  }\n\n  if (hasPath(to, from)) {\n    return Res::Err(ResultError::CYCLE_DETECTED);\n  }\n\n  from->outputs.push_back(to);\n  to->inputs.push_back(from);\n  edgeCount_++;\n\n  return Res::Ok([hFrom = from->handle, hTo = to->handle](AudioGraph<NodeType> &graph, auto &) {\n    graph.pool().push(graph[hTo->index].input_head, hFrom->index);\n    graph.markDirty();\n  });\n}\n\ntemplate <AudioGraphNode NodeType>\nauto HostGraph<NodeType>::removeEdge(Node *from, Node *to) -> Res {\n  if (std::find(nodes.begin(), nodes.end(), from) == nodes.end() ||\n      std::find(nodes.begin(), nodes.end(), to) == nodes.end()) {\n    return Res::Err(ResultError::NODE_NOT_FOUND);\n  }\n  if (from->ghost || to->ghost) {\n    return Res::Err(ResultError::NODE_NOT_FOUND);\n  }\n\n  auto itOut = std::find(from->outputs.begin(), from->outputs.end(), to);\n  if (itOut == from->outputs.end()) {\n    return Res::Err(ResultError::EDGE_NOT_FOUND);\n  }\n\n  auto itIn = std::find(to->inputs.begin(), to->inputs.end(), from);\n  if (itIn != to->inputs.end()) {\n    to->inputs.erase(itIn);\n  }\n  from->outputs.erase(itOut);\n  edgeCount_--;\n\n  return Res::Ok([hFrom = from->handle, hTo = to->handle](AudioGraph<NodeType> &graph, auto &) {\n    graph.pool().remove(graph[hTo->index].input_head, hFrom->index);\n    graph.markDirty();\n  });\n}\n\ntemplate <AudioGraphNode NodeType>\nbool HostGraph<NodeType>::hasPath(Node *start, Node *end) {\n  if (start == end) {\n    return true;\n  }\n\n  last_term++;\n  size_t term = last_term;\n\n  std::vector<Node *> stack;\n  stack.push_back(start);\n  start->traversalState.term = term;\n\n  while (!stack.empty()) {\n    Node *curr = stack.back();\n    stack.pop_back();\n\n    if (curr == end) {\n      return true;\n    }\n\n    for (Node *out : curr->outputs) {\n      if (out->traversalState.visit(term)) {\n        stack.push_back(out);\n      }\n    }\n  }\n  return false;\n}\n\ntemplate <AudioGraphNode NodeType>\nsize_t HostGraph<NodeType>::edgeCount() const {\n  return edgeCount_;\n}\n\ntemplate <AudioGraphNode NodeType>\nsize_t HostGraph<NodeType>::nodeCount() const {\n  return nodes.size();\n}\n\ntemplate <AudioGraphNode NodeType>\nvoid HostGraph<NodeType>::collectDisposedNodes() {\n  for (auto it = nodes.begin(); it != nodes.end();) {\n    Node *n = *it;\n    if (n->ghost && n->handle.use_count() == 1) {\n      // ~Node() tears down edges from neighbor lists.\n      // We decrement for each unique edge (stored once in outputs).\n      edgeCount_ -= n->outputs.size();\n      *it = nodes.back();\n      nodes.pop_back();\n      delete n;\n    } else {\n      ++it;\n    }\n  }\n}\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/graph/HostNode.hpp",
    "content": "#pragma once\n\n#include <audioapi/core/utils/graph/Graph.hpp>\n\n#include <memory>\n#include <utility>\n\nnamespace audioapi::utils::graph {\n\n/// @brief RAII base class for host-side nodes.\n///\n/// Holds a `shared_ptr<Graph<NodeType>>` to keep the graph alive and owns a\n/// `HostGraph::Node*` managed by that graph. On construction the node is\n/// registered in the graph (and an event is sent to AudioGraph); on\n/// destruction the node is removed (scheduling orphan-marking on AudioGraph).\n///\n/// Host objects that represent audio processing nodes should publicly inherit\n/// from HostNode and pass their payload (the AudioNode-like object) to the\n/// constructor. `connect` / `disconnect` provide edge management.\n///\n/// @note HostNode intentionally does NOT prevent cycles — callers must handle\n/// the error returned by `connect()`.\n///\n/// ## Example usage:\n/// ```cpp\n/// class MyGainNode : public HostNode<AudioNode> {\n///  public:\n///   MyGainNode(std::shared_ptr<Graph<AudioNode>> g,\n///              std::unique_ptr<AudioNode> impl)\n///       : HostNode(std::move(g), std::move(impl)) {}\n/// };\n///\n/// auto gain = std::make_unique<MyGainNode>(graph, std::move(gainImpl));\n/// gain->connect(*destination);\n/// gain.reset(); // destructor removes the node from the graph\n/// ```\ntemplate <AudioGraphNode NodeType>\nclass HostNode {\n public:\n  using GraphType = Graph<NodeType>;\n  using HNode = HostGraph<NodeType>::Node;\n  using ResultError = HostGraph<NodeType>::ResultError;\n  using Res = Result<NoneType, ResultError>;\n\n  /// @brief Constructs a HostNode, adding it to the graph.\n  /// @param graph shared ownership of the Graph — prevents the graph from\n  ///              being destroyed while any HostNode still references it\n  /// @param audioNode the audio processing payload (ownership transferred\n  ///                  through to AudioGraph via NodeHandle)\n  explicit HostNode(std::shared_ptr<GraphType> graph, std::unique_ptr<NodeType> audioNode = nullptr)\n      : graph_(std::move(graph)), node_(graph_->addNode(std::move(audioNode))) {}\n\n  /// @brief Destructor removes the node from the graph.\n  /// This marks the node as a ghost in HostGraph, and schedules an event\n  /// that sets `orphaned = true` on the AudioGraph side.\n  virtual ~HostNode() {\n    if (graph_ && node_) {\n      // Ignore the result — the node should always be found unless the\n      // graph was already torn down.\n      (void)graph_->removeNode(node_);\n      node_ = nullptr;\n    }\n  }\n\n  // Non-copyable (unique graph node identity)\n  HostNode(const HostNode &) = delete;\n  HostNode &operator=(const HostNode &) = delete;\n\n  // Movable\n  HostNode(HostNode &&other) noexcept : graph_(std::move(other.graph_)), node_(other.node_) {\n    other.node_ = nullptr;\n  }\n\n  HostNode &operator=(HostNode &&other) noexcept {\n    if (this != &other) {\n      // Remove current node first\n      if (graph_ && node_) {\n        (void)graph_->removeNode(node_);\n      }\n      graph_ = std::move(other.graph_);\n      node_ = other.node_;\n      other.node_ = nullptr;\n    }\n    return *this;\n  }\n\n  /// @brief Connects this node's output to another node's input (this → other).\n  /// @return Ok on success, Err on cycle / duplicate / not-found\n  Res connect(HostNode &other) {\n    return graph_->addEdge(node_, other.node_);\n  }\n\n  /// @brief Disconnects this node's output from another node's input.\n  /// @return Ok on success, Err on not-found\n  Res disconnect(HostNode &other) {\n    return graph_->removeEdge(node_, other.node_);\n  }\n\n  /// @brief Returns the raw HostGraph::Node pointer (for advanced usage / testing).\n  [[nodiscard]] HNode *rawNode() const {\n    return node_;\n  }\n\n  /// @brief Returns the Graph this node belongs to.\n  [[nodiscard]] const std::shared_ptr<GraphType> &graph() const {\n    return graph_;\n  }\n\n protected:\n  std::shared_ptr<GraphType> graph_;\n  HNode *node_ = nullptr;\n};\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/graph/InputPool.hpp",
    "content": "#pragma once\n\n#include <cstdint>\n#include <cstring>\n#include <iterator>\n#include <new>\n#include <type_traits>\n\nnamespace audioapi::utils::graph {\n\n/// @brief Free-list-based pool for storing input edges as singly-linked lists.\n///\n/// Replaces `std::vector<std::uint32_t>` inside AudioGraph::Node with a\n/// pool-allocated linked list, eliminating all heap allocations during\n/// audio-thread processing (toposort + compaction + iteration).\n///\n/// Each slot is 8 bytes — a union of {val, next} (when in an input list)\n/// or {next_free} (when on the free list). 32-bit indices are used\n/// throughout instead of pointers.\n///\n/// ## Growth policy\n/// Grow should not be called on audio thread, instead the main thread should allocate a buffer and\n/// send it to adoptBuffer() through some asynchronous channel\n///\n/// @note Can address up to 2^32 − 2 slots (~4 billion).\nclass InputPool {\n public:\n  /// Sentinel value meaning \"no slot\" / \"end of list\".\n  static constexpr std::uint32_t kNull = UINT32_MAX;\n\n  /// A single slot in the pool — either part of an input linked list\n  /// or part of the free list.\n  struct Slot {\n    union {\n      struct {\n        std::uint32_t val;  // input node index (when in use)\n        std::uint32_t next; // next slot in the input linked list\n      };\n      std::uint32_t next_free; // next slot on free list (overlaps val)\n    };\n  };\n\n  static_assert(sizeof(Slot) == 8, \"Slot must be 8 bytes\");\n\n  /// @brief Forward iterator over values in an input linked list.\n  /// @tparam Const if true, dereferences to `std::uint32_t` (by value);\n  ///               if false, to `std::uint32_t &` (mutable reference).\n  template <bool Const>\n  struct Iterator {\n    using value_type = std::uint32_t;\n    using difference_type = std::ptrdiff_t;\n    using iterator_category = std::input_iterator_tag;\n    using SlotPtr = std::conditional_t<Const, const Slot *, Slot *>;\n    using reference = std::conditional_t<Const, std::uint32_t, std::uint32_t &>;\n\n    SlotPtr slots;\n    std::uint32_t current;\n\n    reference operator*() const;\n    Iterator &operator++();\n    void operator++(int);\n    bool operator==(const Iterator &other) const;\n    bool operator!=(const Iterator &other) const;\n  };\n\n  /// @brief Range view over a linked list's values.\n  /// @tparam Const if true, immutable view; if false, mutable view.\n  template <bool Const>\n  struct InputView {\n    using SlotPtr = std::conditional_t<Const, const Slot *, Slot *>;\n\n    SlotPtr slots;\n    std::uint32_t head;\n\n    [[nodiscard]] Iterator<Const> begin() const;\n    [[nodiscard]] Iterator<Const> end() const;\n  };\n\n  // ── Lifecycle ───────────────────────────────────────────────────────────\n\n  InputPool() = default;\n  ~InputPool();\n\n  InputPool(const InputPool &) = delete;\n  InputPool &operator=(const InputPool &) = delete;\n\n  InputPool(InputPool &&other) noexcept;\n  InputPool &operator=(InputPool &&other) noexcept;\n\n  // ── Slot allocation ─────────────────────────────────────────────────────\n\n  /// @brief Allocate a slot from the free list.\n  /// If the free list is empty, grows the pool (allocation on current thread).\n  std::uint32_t alloc();\n\n  /// @brief Return a slot to the free list.\n  void free(std::uint32_t idx);\n\n  // ── Linked-list operations ──────────────────────────────────────────────\n  // All take `head` by reference — the caller's stored head index.\n\n  /// @brief Prepend a value to the front of the linked list.\n  void push(std::uint32_t &head, std::uint32_t inputVal);\n\n  /// @brief Remove the first occurrence of `inputVal` from the list.\n  /// @return true if found and removed, false otherwise.\n  bool remove(std::uint32_t &head, std::uint32_t inputVal);\n\n  /// @brief Remove all elements where `pred(val)` returns true.\n  template <typename Pred>\n    requires(std::predicate<Pred, std::uint32_t>)\n  void removeIf(std::uint32_t &head, Pred pred);\n\n  /// @brief Free every slot in the list back to the free list.\n  void freeAll(std::uint32_t &head);\n\n  /// @brief Check if a linked list is empty.\n  [[nodiscard]] static bool isEmpty(std::uint32_t head);\n\n  // ── Iteration ───────────────────────────────────────────────────────────\n\n  /// @brief Returns an immutable range over the values in the list starting at `head`.\n  [[nodiscard]] InputView<true> view(std::uint32_t head) const;\n\n  /// @brief Returns a mutable range over the values in the list starting at `head`.\n  [[nodiscard]] InputView<false> mutableView(std::uint32_t head);\n\n  // ── Pool management ─────────────────────────────────────────────────────\n\n  /// @brief Current pool capacity (number of slots).\n  [[nodiscard]] std::uint32_t capacity() const;\n\n  /// @brief Adopt a pre-allocated buffer. Copies existing data, adds new\n  /// slots to the free list, and returns the old buffer for disposal.\n  /// @param newSlots newly allocated slot array (caller transfers ownership)\n  /// @param newCapacity size of the new array (must be > current capacity)\n  /// @return old slot array — caller must `delete[]` it (may be nullptr)\n  Slot *adoptBuffer(Slot *newSlots, std::uint32_t newCapacity);\n\n  /// @brief Grow the pool by allocating a new buffer on the current thread.\n  /// Copies existing data and adds new slots to the free list.\n  /// @param newCapacity desired capacity (must be > current capacity)\n  void grow(std::uint32_t newCapacity);\n\n private:\n  Slot *slots_ = nullptr;\n  std::uint32_t capacity_ = 0;\n  std::uint32_t free_head_ = kNull;\n};\n\n// =========================================================================\n// Implementation\n// =========================================================================\n\n// ── Iterator ──────────────────────────────────────────────────────────────\n\ntemplate <bool Const>\nauto InputPool::Iterator<Const>::operator*() const -> reference {\n  return slots[current].val;\n}\n\ntemplate <bool Const>\nauto InputPool::Iterator<Const>::operator++() -> Iterator & {\n  current = slots[current].next;\n  return *this;\n}\n\ntemplate <bool Const>\nvoid InputPool::Iterator<Const>::operator++(int) {\n  ++*this;\n}\n\ntemplate <bool Const>\nbool InputPool::Iterator<Const>::operator==(const Iterator &other) const {\n  return current == other.current;\n}\n\ntemplate <bool Const>\nbool InputPool::Iterator<Const>::operator!=(const Iterator &other) const {\n  return current != other.current;\n}\n\n// ── InputView ─────────────────────────────────────────────────────────────\n\ntemplate <bool Const>\nauto InputPool::InputView<Const>::begin() const -> Iterator<Const> {\n  return {slots, head};\n}\n\ntemplate <bool Const>\nauto InputPool::InputView<Const>::end() const -> Iterator<Const> {\n  return {slots, kNull};\n}\n\n// ── Lifecycle ─────────────────────────────────────────────────────────────\n\ninline InputPool::~InputPool() {\n  delete[] slots_;\n}\n\ninline InputPool::InputPool(InputPool &&other) noexcept\n    : slots_(other.slots_), capacity_(other.capacity_), free_head_(other.free_head_) {\n  other.slots_ = nullptr;\n  other.capacity_ = 0;\n  other.free_head_ = kNull;\n}\n\ninline InputPool &InputPool::operator=(InputPool &&other) noexcept {\n  if (this != &other) {\n    delete[] slots_;\n    slots_ = other.slots_;\n    capacity_ = other.capacity_;\n    free_head_ = other.free_head_;\n    other.slots_ = nullptr;\n    other.capacity_ = 0;\n    other.free_head_ = kNull;\n  }\n  return *this;\n}\n\n// ── Slot allocation ───────────────────────────────────────────────────────\n\ninline std::uint32_t InputPool::alloc() {\n  if (free_head_ == kNull) {\n    grow(capacity_ == 0 ? 64 : capacity_ * 2);\n  }\n  std::uint32_t idx = free_head_;\n  free_head_ = slots_[idx].next_free;\n  return idx;\n}\n\ninline void InputPool::free(std::uint32_t idx) {\n  slots_[idx].next_free = free_head_;\n  free_head_ = idx;\n}\n\n// ── Linked-list operations ────────────────────────────────────────────────\n\ninline void InputPool::push(std::uint32_t &head, std::uint32_t inputVal) {\n  std::uint32_t idx = alloc();\n  slots_[idx].val = inputVal;\n  slots_[idx].next = head;\n  head = idx;\n}\n\ninline bool InputPool::remove(std::uint32_t &head, std::uint32_t inputVal) {\n  std::uint32_t *prev = &head;\n  std::uint32_t curr = head;\n  while (curr != kNull) {\n    if (slots_[curr].val == inputVal) {\n      *prev = slots_[curr].next;\n      free(curr);\n      return true;\n    }\n    prev = &slots_[curr].next;\n    curr = slots_[curr].next;\n  }\n  return false;\n}\n\ntemplate <typename Pred>\n  requires(std::predicate<Pred, std::uint32_t>)\nvoid InputPool::removeIf(std::uint32_t &head, Pred pred) {\n  std::uint32_t *prev = &head;\n  std::uint32_t curr = head;\n  while (curr != kNull) {\n    std::uint32_t nxt = slots_[curr].next;\n    if (pred(slots_[curr].val)) {\n      *prev = nxt;\n      free(curr);\n    } else {\n      prev = &slots_[curr].next;\n    }\n    curr = nxt;\n  }\n}\n\ninline void InputPool::freeAll(std::uint32_t &head) {\n  while (head != kNull) {\n    std::uint32_t nxt = slots_[head].next;\n    free(head);\n    head = nxt;\n  }\n}\n\ninline bool InputPool::isEmpty(std::uint32_t head) {\n  return head == kNull;\n}\n\n// ── Iteration ─────────────────────────────────────────────────────────────\n\ninline InputPool::InputView<true> InputPool::view(std::uint32_t head) const {\n  return {slots_, head};\n}\n\ninline InputPool::InputView<false> InputPool::mutableView(std::uint32_t head) {\n  return {slots_, head};\n}\n\n// ── Pool management ───────────────────────────────────────────────────────\n\ninline std::uint32_t InputPool::capacity() const {\n  return capacity_;\n}\n\ninline InputPool::Slot *InputPool::adoptBuffer(Slot *newSlots, std::uint32_t newCapacity) {\n  if (slots_) {\n    std::memcpy(newSlots, slots_, capacity_ * sizeof(Slot));\n  }\n  for (std::uint32_t i = capacity_; i < newCapacity; i++) {\n    newSlots[i].next_free = free_head_;\n    free_head_ = i;\n  }\n  Slot *old = slots_;\n  slots_ = newSlots;\n  capacity_ = newCapacity;\n  return old;\n}\n\ninline void InputPool::grow(std::uint32_t newCapacity) {\n  auto *newSlots = new Slot[newCapacity];\n  Slot *old = adoptBuffer(newSlots, newCapacity);\n  delete[] old;\n}\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/graph/NodeHandle.hpp",
    "content": "#pragma once\n\n#include <cstdint>\n#include <memory>\n#include <utility>\n\nnamespace audioapi::utils::graph {\n\n/// @brief Shared handle bridging HostGraph and AudioGraph.\n///\n/// A single heap allocation stores both the payload node and the mutable\n/// index into AudioGraph's flat vector. AudioGraph updates the index during\n/// compaction and topological sort.\n///\n/// Ownership model (shared_ptr):\n/// - Created on the main thread via std::make_shared.\n/// - A shared_ptr is stored in both HostGraph::Node and AudioGraph::Node.\n/// - When a host node is removed, HostGraph marks it as a ghost and keeps\n///   its shared_ptr. The AudioGraph event sets orphaned = true.\n/// - When AudioGraph compacts out an orphaned node it releases its shared_ptr\n///   (refcount 2 → 1). HostGraph detects use_count() == 1 and destroys the\n///   ghost + payload on the main thread.\ntemplate <typename T>\nstruct NodeHandle {\n  std::uint32_t index;          // current position in AudioGraph::nodes\n  std::unique_ptr<T> audioNode; // the payload node (may be null in tests)\n\n  NodeHandle(std::uint32_t index, std::unique_ptr<T> audioNode)\n      : index(index), audioNode(std::move(audioNode)) {}\n};\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/graph/README.md",
    "content": "# Graph structure\nIf you are reading this, you are probably curious about how the graph structure works (or something broke in this case you are fu**ed). This is the right place to start. This document will give you a high level overview of the graph structure, how it works, how it is used, tested and provide all decisions made during the development of it.\n\n# Structure & design\n\n## Graph\n`Graph.hpp` is the main entrypoint to the graph structure and provides public API for it. It is the only file that should be included by the users of the graph structure. It contains the main `Graph` class which is used to create and manipulate the graph structure. It also contains some helper classes and functions.\n\nGraph class is an orhestrator that provides high level API and manages internal structures like `AudioGraph`, `HostGraph`, `SPSC`, `Disposer` and pool capacity.\n\n## HostGraph\n`HostGraph.hpp` contains the `HostGraph` class which is responsible for managing the graph structure and providing low level API for it. It keeps track of nodes, edges, their connections, cycles and other internal metadata. It also provides API for adding, removing and connecting nodes. Each modification returns a `AGEvent` which is a closure that can be executed to apply the same modification on corelated `AudioGraph`. This move allows us to keep `HostGraph` in a state after update while sending async event to Audio thread, as we know if events are applied in order, we can be sure that the state of `AudioGraph` in time frame T1 will be the same as `HostGraph` in the same time frame T1.\n\nOn each operation `HostGraph` checks if any of the `NodeHandles` is orphaned by `AudioGraph` if so it can be disposed and removed. This way we can be sure there will never be false positive to add an edge that would create a cycle, because lifetime of the nodes is managed fully on Audio thread so `HostGraph` can only be sure that the node is not being processed when its handle is orphaned.\n> So in worst case HostGraph can silent out edge creation if it thinks it would create a cycle, this is very rare case and false negative is acceptable compared to false negative. I don't even know if this is reachable in any realistic scenario, but it is worth to mention.\n\n## AudioGraph\n`AudioGraph.hpp` contains the `AudioGraph` class which is responsible for processing the graph structure on the audio thread. It keeps track of nodes, edges, their inputs and has topological order. It minimizes memory usage, speed of processing and limits memory fragmentation by using `InputPool` to manage edges. It also provides API for processing the graph structure and applying events from `HostGraph`.\n\nIt has very limited task that needs to be performed very fast, so it is designed to be as efficient as possible. It is also designed to be as simple as possible, so it is easy to understand and maintain.\n\n## InputPool\n`InputPool.hpp` contains the `InputPool` class which is responsible for managing the pool of edges. It is designed to be as efficient as possible, so it uses a free list to manage the pool of edges. It also provides API for allocating and deallocating edges. It is designed to be used on the audio thread, so it is not thread safe and should be used within the `AudioGraph` class. Or its events.\n\n## NodeHandle\n`NodeHandle.hpp` contains the `NodeHandle` class which is responsible for managing node index in AudioGraph. Indices are 32 bit to minimize memory usage and maximize cache efficiency. So it is only to be used in `AGEvent` closures to reference nodes in `AudioGraph` only having a handle to it.\n\n## Disposer\n`Disposer.hpp` contains the `Disposer` class which is responsible for managing the disposal of nodes and edges. It is designed to be used on single thread. It has a worker thread that we can offload destruction onto through SPSC queue. It is more robust then previous implementation allowing wide range of payloads to be disposed.\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/param/ParamControlQueue.cpp",
    "content": "#include <audioapi/core/types/ParamEventType.h>\n#include <audioapi/core/utils/param/ParamControlQueue.h>\n#include <audioapi/core/utils/param/ParamEvent.h>\n#include <audioapi/utils/Result.hpp>\n#include <cstddef>\n#include <sstream>\n\nnamespace audioapi {\n\nEventConflictResult ParamControlQueue::checkCurveExclusion(const ParamEvent &event) {\n  if (event.getType() == ParamEventType::SET_VALUE_CURVE) {\n    // Check if a new curve would start at a time that conflicts with an existing curve event\n    auto startConflict = isConflictAtTime(event, event.getStartTime());\n    if (startConflict.is_err()) {\n      return startConflict;\n    }\n    // Curve rule: events strictly in (T, T+D) are conflicts; events exactly at T are allowed.\n    return isConflictInInterval(event, event.getStartTime(), event.getEndTime());\n  }\n  // For non-curve events check for curve events that conflict at the event's automationTime\n  return isConflictAtTime(event, event.getAutomationTime());\n}\n\nvoid ParamControlQueue::purge(double currentTime) {\n  eventQueue_.erase(eventQueue_.begin(), eventQueue_.lowerBound(currentTime));\n}\n\nEventConflictResult ParamControlQueue::isConflictAtTime(\n    const ParamEvent &newEvent,\n    double automationTime) {\n  // Per spec [T, T+D): events AT T are conflicts, so use upperBound to include the predecessor at T.\n  auto it = eventQueue_.upperBound(automationTime);\n  if (it != eventQueue_.begin()) {\n    const auto &pred = *std::prev(it);\n    if (pred.getType() == ParamEventType::SET_VALUE_CURVE && automationTime < pred.getEndTime()) {\n      std::stringstream ss;\n      ss << \"Cannot schedule event of type \" << toString(newEvent.getType()) << \" at time \"\n         << newEvent.getAutomationTime()\n         << \" because it conflicts with an existing curve event from time \" << pred.getStartTime()\n         << \" to \" << pred.getEndTime() << \".\";\n      return Err(ss.str());\n    }\n  }\n  return Ok(None);\n}\n\nEventConflictResult ParamControlQueue::isConflictInInterval(\n    const ParamEvent &newEvent,\n    double startTime,\n    double endTime) {\n  auto it = eventQueue_.upperBound(startTime);\n  // If there is an event in (T, T+D) then the new curve event is invalid\n  while (it != eventQueue_.end() && it->getAutomationTime() < endTime) {\n    if (it->getAutomationTime() > startTime) {\n      std::stringstream ss;\n      ss << \"Cannot schedule curve event from time \" << newEvent.getStartTime() << \" to \"\n         << newEvent.getEndTime() << \" because it conflicts with an existing event of type \"\n         << toString(it->getType()) << \" at time \" << it->getAutomationTime() << \".\";\n      return Err(ss.str());\n    }\n    ++it;\n  }\n  return Ok(None);\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/param/ParamControlQueue.h",
    "content": "#pragma once\n\n#include <audioapi/core/utils/param/ParamEvent.h>\n#include <audioapi/core/utils/param/ParamQueueBase.hpp>\n#include <audioapi/utils/Result.hpp>\n#include <string>\n\nnamespace audioapi {\n\nusing EventConflictResult = Result<NoneType, std::string>;\n\n/// @brief A queue for managing audio parameter change events on the JS/control thread.\n/// @note The invariant of the queue is that its internal buffer always contains non-overlapping events.\nclass ParamControlQueue : public ParamQueueBase<ParamEvent> {\n public:\n  /// @brief Validate if a new event can be added to the queue without violating curve exclusion rules.\n  /// See: https://webaudio.github.io/web-audio-api/#automation-event-time\n  /// @param event The new event to validate.\n  /// @return Ok if the event can be added, Err with a message if it cannot be added.\n  [[nodiscard]] EventConflictResult checkCurveExclusion(const ParamEvent &event);\n\n  /// @brief Remove all events with automationTime strictly before currentTime.\n  /// @note Should be called before push to prevent the queue from filling up with past events.\n  void purge(double currentTime);\n\n private:\n  /// @brief Check if a non-curve event at the given time conflicts with an existing curve event.\n  /// @param event The new event being scheduled.\n  /// @param time The automationTime of the new event.\n  [[nodiscard]] EventConflictResult isConflictAtTime(const ParamEvent &event, double time);\n\n  /// @brief Check if a curve event over [startTime, endTime) conflicts with any existing event.\n  /// @param event The new curve event being scheduled.\n  /// @param startTime Start of the curve interval.\n  /// @param endTime End of the curve interval.\n  [[nodiscard]] EventConflictResult\n  isConflictInInterval(const ParamEvent &event, double startTime, double endTime);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/param/ParamEvent.h",
    "content": "#pragma once\n\n#include <audioapi/core/types/ParamEventType.h>\n\nnamespace audioapi {\n\n/// @brief Base class for param events, containing common properties like startTime, endTime, and type.\nclass ParamEvent {\n public:\n  ParamEvent() = default;\n  ~ParamEvent() = default;\n\n  /// @brief Construct an event with explicit start and end times.\n  explicit ParamEvent(ParamEventType type, double startTime, double endTime)\n      : startTime_(startTime), endTime_(endTime), type_(type) {}\n\n  /// @brief Construct from a single automationTime value, setting startTime or endTime based on type.\n  /// Ramp events (LINEAR_RAMP, EXPONENTIAL_RAMP) store automationTime as endTime.\n  /// All other types store it as startTime.\n  explicit ParamEvent(ParamEventType type, double automationTime)\n      : startTime_(isRamp(type) ? 0.0 : automationTime),\n        endTime_(isRamp(type) ? automationTime : 0.0),\n        type_(type) {}\n\n  ParamEvent(const ParamEvent &) = default;\n  ParamEvent &operator=(const ParamEvent &) = default;\n\n  ParamEvent(ParamEvent &&other) noexcept\n      : startTime_(other.startTime_), endTime_(other.endTime_), type_(other.type_) {}\n\n  ParamEvent &operator=(ParamEvent &&other) noexcept {\n    if (this != &other) {\n      type_ = other.type_;\n      startTime_ = other.startTime_;\n      endTime_ = other.endTime_;\n    }\n    return *this;\n  }\n\n  /// @brief Get the automation time of the event. For ramp events, this is the end time; for other events, it's the start time.\n  /// @return The automation time of the event.\n  [[nodiscard]] double getAutomationTime() const noexcept {\n    return isRamp(type_) ? endTime_ : startTime_;\n  }\n\n  [[nodiscard]] double getStartTime() const noexcept {\n    return startTime_;\n  }\n\n  [[nodiscard]] double getEndTime() const noexcept {\n    return endTime_;\n  }\n\n  [[nodiscard]] ParamEventType getType() const noexcept {\n    return type_;\n  }\n\n  [[nodiscard]] bool isRampType() const noexcept {\n    return isRamp(type_);\n  }\n\n  void setEndTime(double endTime) noexcept {\n    endTime_ = endTime;\n  }\n\n  void setStartTime(double startTime) noexcept {\n    startTime_ = startTime;\n  }\n\n protected:\n  double startTime_ = 0.0;\n  double endTime_ = 0.0;\n  ParamEventType type_ = ParamEventType::SET_VALUE;\n\n private:\n  static bool isRamp(ParamEventType type) noexcept {\n    return type == ParamEventType::LINEAR_RAMP || type == ParamEventType::EXPONENTIAL_RAMP;\n  }\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/param/ParamQueueBase.hpp",
    "content": "#pragma once\n\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/utils/BoundedPriorityQueue.hpp>\n#include <audioapi/utils/Macros.h>\n#include <utility>\n\nnamespace audioapi {\n\ntemplate <typename TEvent>\nconcept ParamEventConcept = requires(TEvent event) {\n  { event.getAutomationTime() } -> std::convertible_to<double>;\n};\ntemplate <ParamEventConcept TEvent>\nclass ParamQueueBase {\n public:\n  ParamQueueBase() = default;\n  DELETE_COPY_AND_MOVE(ParamQueueBase);\n  virtual ~ParamQueueBase() = default;\n\n  /// @brief Cancel scheduled parameter changes at or after the given time.\n  /// @param cancelTime The time at which to cancel scheduled changes.\n  void cancelScheduledValues(double cancelTime) {\n    eventQueue_.erase(eventQueue_.lowerBound(cancelTime), eventQueue_.end());\n  }\n\n  virtual bool push(TEvent &&event) {\n    return eventQueue_.push(std::move(event));\n  }\n\n protected:\n  struct EventComparator {\n    using is_transparent = void;\n    bool operator()(const TEvent &a, const TEvent &b) const {\n      return a.getAutomationTime() < b.getAutomationTime();\n    }\n    bool operator()(const TEvent &a, double time) const {\n      return a.getAutomationTime() < time;\n    }\n    bool operator()(double time, const TEvent &b) const {\n      return time < b.getAutomationTime();\n    }\n  };\n\n  BoundedPriorityQueue<TEvent, AUDIO_PARAM_MAX_QUEUED_EVENTS, EventComparator> eventQueue_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/param/ParamRenderEventFactory.hpp",
    "content": "#pragma once\n\n#include <audioapi/core/utils/param/RenderParamEvent.h>\n#include <audioapi/dsp/AudioUtils.hpp>\n#include <audioapi/utils/AudioArray.hpp>\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\n/// @brief A factory for creating RenderParamEvents and resolving their values\n/// based on the current state of the queue.\nclass ParamRenderEventFactory {\n public:\n  static RenderParamEvent createSetValueEvent(float value, double startTime) {\n    auto calculateValue =\n        [](double startTime, double /* endTime */, float startValue, float endValue, double time) {\n          if (time < startTime) {\n            return startValue;\n          }\n\n          return endValue;\n        };\n\n    return RenderParamEvent(\n        startTime, startTime, value, value, std::move(calculateValue), ParamEventType::SET_VALUE);\n  }\n\n  static RenderParamEvent createLinearRampEvent(float value, double endTime) {\n    auto calculateValue =\n        [](double startTime, double endTime, float startValue, float endValue, double time) {\n          if (time < startTime) {\n            return startValue;\n          }\n\n          if (time < endTime) {\n            return static_cast<float>(\n                startValue + (endValue - startValue) * (time - startTime) / (endTime - startTime));\n          }\n\n          return endValue;\n        };\n\n    return RenderParamEvent(\n        0.0, endTime, 0.0f, value, std::move(calculateValue), ParamEventType::LINEAR_RAMP);\n  }\n\n  static RenderParamEvent createExponentialRampEvent(float value, double endTime) {\n    auto calculateValue =\n        [](double startTime, double endTime, float startValue, float endValue, double time) {\n          if (startValue * endValue < 0 || startValue == 0) {\n            return startValue;\n          }\n\n          if (time < startTime) {\n            return startValue;\n          }\n\n          if (time < endTime) {\n            return static_cast<float>(\n                startValue *\n                pow(endValue / startValue, (time - startTime) / (endTime - startTime)));\n          }\n\n          return endValue;\n        };\n\n    return RenderParamEvent(\n        0.0, endTime, 0.0f, value, std::move(calculateValue), ParamEventType::EXPONENTIAL_RAMP);\n  }\n\n  static RenderParamEvent\n  createSetTargetEvent(float target, double startTime, double timeConstant) {\n    auto calculateValue = [timeConstant, target](\n                              double startTime,\n                              double /* endTime */,\n                              float startValue,\n                              float /* endValue */,\n                              double time) {\n      if (timeConstant == 0) {\n        return target;\n      }\n\n      if (time < startTime) {\n        return startValue;\n      }\n\n      return static_cast<float>(\n          target + (startValue - target) * exp(-(time - startTime) / timeConstant));\n    };\n\n    return RenderParamEvent(\n        startTime,\n        startTime, // SetTarget events have infinite duration conceptually\n        0.0f,\n        0.0f, // End value is not meaningful for infinite events\n        std::move(calculateValue),\n        ParamEventType::SET_TARGET);\n  }\n\n  static RenderParamEvent createSetValueCurveEvent(\n      const std::shared_ptr<AudioArray> &values,\n      size_t length,\n      double startTime,\n      double duration) {\n    auto calculateValue =\n        [values, length](\n            double startTime, double endTime, float startValue, float endValue, double time) {\n          if (time < startTime) {\n            return startValue;\n          }\n\n          if (time < endTime) {\n            // Calculate position in the array based on time progress\n            auto k = static_cast<int>(std::floor(\n                static_cast<double>(length - 1) / (endTime - startTime) * (time - startTime)));\n            // Calculate interpolation factor between adjacent array elements\n            auto factor = static_cast<float>(\n                (time - startTime) * static_cast<double>(length - 1) / (endTime - startTime) - k);\n            return dsp::linearInterpolate(values->span(), k, k + 1, factor);\n          }\n\n          return endValue;\n        };\n\n    return RenderParamEvent(\n        startTime,\n        startTime + duration,\n        0.0f,\n        values->span()[length - 1],\n        std::move(calculateValue),\n        ParamEventType::SET_VALUE_CURVE);\n  }\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/param/ParamRenderQueue.cpp",
    "content": "#include <audioapi/core/types/ParamEventType.h>\n#include <audioapi/core/utils/param/ParamQueueBase.hpp>\n#include <audioapi/core/utils/param/ParamRenderEventFactory.hpp>\n#include <audioapi/core/utils/param/ParamRenderQueue.h>\n#include <cstddef>\n#include <optional>\n#include <utility>\n\nnamespace audioapi {\n\nstd::optional<float> ParamRenderQueue::computeValueAtTime(double time) {\n  while (\n      !eventQueue_.isEmpty() &&\n      (!currentEvent_ ||\n       (time >= currentEvent_->getEndTime() && eventQueue_.peekFront().getStartTime() <= time))) {\n    RenderParamEvent next;\n    eventQueue_.pop(next);\n    currentEvent_ = std::move(next);\n  }\n\n  if (!currentEvent_) {\n    return std::nullopt;\n  }\n\n  return currentEvent_->getCalculateValue()(\n      currentEvent_->getStartTime(),\n      currentEvent_->getEndTime(),\n      currentEvent_->getStartValue(),\n      currentEvent_->getEndValue(),\n      time);\n}\n\nbool ParamRenderQueue::push(RenderParamEvent &&event) {\n  resolveEventValues(event);\n  return ParamQueueBase::push(std::move(event));\n}\n\nvoid ParamRenderQueue::resolveEventValues(RenderParamEvent &event) {\n  auto it = eventQueue_.upperBound(event.getAutomationTime());\n\n  if (it != eventQueue_.begin()) {\n    // Case 1: there is a preceding event in the queue\n    auto predIt = std::prev(it);\n\n    // if the new event is a ramp resolve its startTime and startValue from the predecessor event\n    if (event.isRampType()) {\n      event.setStartTime(predIt->getEndTime());\n    }\n    event.setStartValue(getValueOfPreviousEventAt(*predIt, event.getStartTime()));\n\n    // If the predecessor is a setTarget event, adjust its endTime and endValue to connect to the new event\n    if (predIt->getType() == ParamEventType::SET_TARGET) {\n      float newEndValue = getValueOfPreviousEventAt(*predIt, event.getStartTime());\n      auto node = eventQueue_.extract(predIt);\n      node.value().setEndTime(event.getStartTime());\n      node.value().setEndValue(newEndValue);\n      eventQueue_.insert(it, std::move(node));\n    }\n  } else if (currentEvent_) {\n    // Case 2: no preceding event in queue, but currentEvent_ exists\n\n    // if the new event is a ramp resolve its startTime and startValue from the predecessor event\n    if (event.isRampType()) {\n      event.setStartTime(currentEvent_->getEndTime());\n    }\n    event.setStartValue(getValueOfPreviousEventAt(*currentEvent_, event.getStartTime()));\n\n    // If the predecessor is a setTarget event, adjust its endTime and endValue to connect to the new event\n    if (currentEvent_->getType() == ParamEventType::SET_TARGET) {\n      currentEvent_->setEndTime(event.getStartTime());\n      currentEvent_->setEndValue(getValueOfPreviousEventAt(*currentEvent_, event.getStartTime()));\n    }\n  } else {\n    // Case 3: no predecessor at all — fall back to default value\n    event.setStartValue(defaultValue_);\n  }\n\n  // If the successor exists and is a ramp, reconnect its start to this event's end\n  if (it != eventQueue_.end() && it->isRampType()) {\n    auto hint = std::next(it);\n    auto node = eventQueue_.extract(it);\n    node.value().setStartTime(event.getEndTime());\n    node.value().setStartValue(event.getEndValue());\n    eventQueue_.insert(hint, std::move(node));\n  }\n}\n\nfloat ParamRenderQueue::getValueOfPreviousEventAt(const RenderParamEvent &event, double time) {\n  if (event.getType() == ParamEventType::SET_TARGET) {\n    return event.getCalculateValue()(\n        event.getStartTime(), event.getEndTime(), event.getStartValue(), event.getEndValue(), time);\n  }\n  return event.getEndValue();\n}\n\nvoid ParamRenderQueue::cancelAndHoldAtTime(double cancelTime) {\n  // E2: first event with automationTime strictly after cancelTime\n  auto e2It = eventQueue_.upperBound(cancelTime);\n\n  if (e2It != eventQueue_.end() && e2It->isRampType()) {\n    // Spec step 3: E2 is a ramp — truncate it to end at cancelTime\n    float holdValue = e2It->getCalculateValue()(\n        e2It->getStartTime(),\n        e2It->getEndTime(),\n        e2It->getStartValue(),\n        e2It->getEndValue(),\n        cancelTime);\n    auto node = eventQueue_.extract(e2It);\n    node.value().setEndTime(cancelTime);\n    node.value().setEndValue(holdValue);\n    auto insertPos = eventQueue_.upperBound(cancelTime);\n    eventQueue_.insert(insertPos, std::move(node));\n    // Step 5: remove everything strictly after cancelTime\n    eventQueue_.erase(eventQueue_.upperBound(cancelTime), eventQueue_.end());\n    return;\n  }\n\n  // Spec step 4: check E1 (last event with automationTime <= cancelTime)\n  auto e1It = (e2It != eventQueue_.begin()) ? std::prev(e2It) : eventQueue_.end();\n\n  if (e1It != eventQueue_.end()) {\n    if (e1It->getType() == ParamEventType::SET_TARGET) {\n      // Insert setValueAtTime to freeze the exponential approach\n      float holdValue = getValueOfPreviousEventAt(*e1It, cancelTime);\n      eventQueue_.erase(e2It, eventQueue_.end());\n      this->push(ParamRenderEventFactory::createSetValueEvent(holdValue, cancelTime));\n      return;\n    }\n\n    if (e1It->getType() == ParamEventType::SET_VALUE_CURVE && cancelTime <= e1It->getEndTime()) {\n      // Truncate curve; compute holdValue using original endTime to preserve sampling behaviour\n      float holdValue = e1It->getCalculateValue()(\n          e1It->getStartTime(),\n          e1It->getEndTime(),\n          e1It->getStartValue(),\n          e1It->getEndValue(),\n          cancelTime);\n      auto hint = std::next(e1It);\n      auto node = eventQueue_.extract(e1It);\n      node.value().setEndTime(cancelTime);\n      node.value().setEndValue(holdValue);\n      eventQueue_.insert(hint, std::move(node));\n      // fall through to step 5\n    }\n    // All other E1 types (SET_VALUE, completed ramps): nothing to modify, fall through to step 5\n  } else if (currentEvent_) {\n    // No E1 in queue, but currentEvent_ exists — check if it needs to be truncated\n    if (currentEvent_->getType() == ParamEventType::SET_TARGET) {\n      float holdValue = getValueOfPreviousEventAt(*currentEvent_, cancelTime);\n      eventQueue_.erase(eventQueue_.begin(), eventQueue_.end());\n      this->push(ParamRenderEventFactory::createSetValueEvent(holdValue, cancelTime));\n      return;\n    }\n\n    if (currentEvent_->getType() == ParamEventType::SET_VALUE_CURVE &&\n        cancelTime <= currentEvent_->getEndTime()) {\n      float holdValue = currentEvent_->getCalculateValue()(\n          currentEvent_->getStartTime(),\n          currentEvent_->getEndTime(),\n          currentEvent_->getStartValue(),\n          currentEvent_->getEndValue(),\n          cancelTime);\n      currentEvent_->setEndTime(cancelTime);\n      currentEvent_->setEndValue(holdValue);\n      // fall through to step 5\n    }\n  }\n\n  // Step 5: remove all events strictly after cancelTime\n  eventQueue_.erase(eventQueue_.upperBound(cancelTime), eventQueue_.end());\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/param/ParamRenderQueue.h",
    "content": "#pragma once\n\n#include <audioapi/core/utils/param/ParamQueueBase.hpp>\n#include <audioapi/core/utils/param/RenderParamEvent.h>\n#include <optional>\n\nnamespace audioapi {\n\n/// @brief A queue for managing audio parameter change events on the audio render thread.\n/// @note The invariant of the queue is that its internal buffer always contains non-overlapping events.\nclass ParamRenderQueue : public ParamQueueBase<RenderParamEvent> {\n public:\n  explicit ParamRenderQueue(float defaultValue) : defaultValue_(defaultValue) {}\n\n  /// @brief Compute the value at a specific time based on the events in the queue.\n  /// @param time The time at which to compute the value.\n  /// @return The computed value at the given time, or std::nullopt if no events are active at that time.\n  [[nodiscard]] std::optional<float> computeValueAtTime(double time);\n\n  /// @brief Push a new event into the queue, resolving its startValue and startTime based on neighboring events.\n  /// @param event The new event to add to the queue.\n  /// @return True if the event was successfully added, false if the queue is full.\n  bool push(RenderParamEvent &&event) override;\n\n  /// @brief Cancel scheduled parameter changes and hold the current value at the given time.\n  /// @param cancelTime The time at which to cancel scheduled changes.\n  void cancelAndHoldAtTime(double cancelTime);\n\n private:\n  float defaultValue_;\n\n  /// @brief Resolve new event's startValue and startTime based on the previous event in the queue,\n  /// and adjust neighboring events to maintain the invariant of non-overlapping events in the queue.\n  /// @param event The new event to resolve around.\n  void resolveEventValues(RenderParamEvent &event);\n\n  /// @brief Compute the value of the previous event at a specific time.\n  /// @param event The preceding event.\n  /// @param time The time at which to get the value.\n  /// @return The value of the event at the given time.\n  static float getValueOfPreviousEventAt(const RenderParamEvent &event, double time);\n\n  /// @brief The currently active event that has been popped from the queue but has not yet ended or been replaced.\n  // This is needed to handle the case where there are no future events in the queue,\n  // but we still need to compute values for the active event.\n  std::optional<RenderParamEvent> currentEvent_ = std::nullopt;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/param/RenderParamEvent.h",
    "content": "#pragma once\n\n#include <audioapi/core/utils/param/ParamEvent.h>\n\n#include <audioapi/core/types/ParamEventType.h>\n#include <functional>\n#include <utility>\n\nnamespace audioapi {\n\n/// @brief A RenderParamEvent extends ParamEvent with additional properties and a value calculation\n/// function that can compute the parameter value at any time during the event's active period\n/// based on its type and the current state of the queue.\nclass RenderParamEvent : public ParamEvent {\n public:\n  RenderParamEvent() = default;\n  ~RenderParamEvent() = default;\n\n  explicit RenderParamEvent(\n      double startTime,\n      double endTime,\n      float startValue,\n      float endValue,\n      std::function<float(double, double, float, float, double)> &&calculateValue,\n      ParamEventType type)\n      : ParamEvent(type, startTime, endTime),\n        calculateValue_(std::move(calculateValue)),\n        startValue_(startValue),\n        endValue_(endValue) {}\n\n  RenderParamEvent(const RenderParamEvent &) = delete;\n  RenderParamEvent &operator=(const RenderParamEvent &) = delete;\n\n  RenderParamEvent(RenderParamEvent &&other) noexcept\n      : ParamEvent(std::move(other)),\n        calculateValue_(std::move(other.calculateValue_)),\n        startValue_(other.startValue_),\n        endValue_(other.endValue_) {}\n\n  RenderParamEvent &operator=(RenderParamEvent &&other) noexcept {\n    if (this != &other) {\n      ParamEvent::operator=(std::move(other));\n      calculateValue_ = std::move(other.calculateValue_);\n      startValue_ = other.startValue_;\n      endValue_ = other.endValue_;\n    }\n    return *this;\n  }\n\n  [[nodiscard]] float getEndValue() const noexcept {\n    return endValue_;\n  }\n\n  [[nodiscard]] float getStartValue() const noexcept {\n    return startValue_;\n  }\n\n  [[nodiscard]] const std::function<float(double, double, float, float, double)> &\n  getCalculateValue() const noexcept {\n    return calculateValue_;\n  }\n\n  void setStartValue(float startValue) noexcept {\n    startValue_ = startValue;\n  }\n\n  void setEndValue(float endValue) noexcept {\n    endValue_ = endValue;\n  }\n\n private:\n  std::function<float(double, double, float, float, double)> calculateValue_;\n  float startValue_ = 0.0f;\n  float endValue_ = 0.0f;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/worklets/SafeIncludes.h",
    "content": "#pragma once\n\n#include <jsi/jsi.h>\n\n#include <memory>\n#include <string>\n\n#if ANDROID\n#include <fbjni/detail/Environment.h>\n#endif\n\n#ifndef RN_AUDIO_API_TEST\n#define RN_AUDIO_API_TEST 0\n#endif\n\n#if RN_AUDIO_API_ENABLE_WORKLETS\n#include <worklets/NativeModules/WorkletsModuleProxy.h>\n#include <worklets/SharedItems/Serializable.h>\n#include <worklets/WorkletRuntime/WorkletRuntime.h>\n#if ANDROID\n#include <worklets/android/WorkletsModule.h>\n#endif\n#else\n\n#define RN_AUDIO_API_WORKLETS_DISABLED_ERROR \\\n  std::runtime_error( \\\n      \"Worklets are disabled. Please install react-native-worklets or check if you have supported version to enable these features.\");\n\n/// @brief Dummy implementation of worklets for non-worklet builds they should do nothing and mock necessary methods\n/// @note It helps to reduce compile time branching across codebase\n/// @note If you need to base some c++ implementation on if the worklets are enabled use `#if RN_AUDIO_API_ENABLE_WORKLETS`\nnamespace worklets {\n\nusing namespace facebook;\nclass MessageQueueThread {};\nclass WorkletsModuleProxy {};\nclass WorkletRuntime {\n public:\n  // NOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init) -- dummy type, members unused\n  explicit WorkletRuntime(\n      uint64_t,\n      const std::shared_ptr<MessageQueueThread> &,\n      const std::string &,\n      const bool) {\n    throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR\n  }\n  [[nodiscard]] jsi::Runtime &getJSIRuntime() const {\n    throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR\n  }\n  [[nodiscard]] jsi::Value executeSync(jsi::Runtime &rt, const jsi::Value &worklet) const {\n    throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR\n  }\n  [[nodiscard]] jsi::Value executeSync(std::function<jsi::Value(jsi::Runtime &)> &&job) const {\n      // NOLINT(cppcoreguidelines-rvalue-reference-param-not-moved)\n      throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR} jsi::Value\n      executeSync(const std::function<jsi::Value(jsi::Runtime &)> &job) const {\n    throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR\n  }\n};\nclass SerializableWorklet {\n public:\n  SerializableWorklet(jsi::Runtime *, const jsi::Object &){\n      throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR} jsi::Value toJSValue(jsi::Runtime &rt) {\n    throw RN_AUDIO_API_WORKLETS_DISABLED_ERROR\n  }\n};\n} // namespace worklets\n\n#undef RN_AUDIO_API_WORKLETS_DISABLED_ERROR\n\n#endif\n\n/// @brief Struct to hold references to different runtimes used in the AudioAPI\n/// @note it is used to pass them around and avoid creating multiple instances of the same runtime\nstruct\n    RuntimeRegistry { // NOLINT(cppcoreguidelines-pro-type-member-init) -- weak_ptr/shared_ptr default-init\n  std::weak_ptr<worklets::WorkletRuntime> uiRuntime;\n  std::shared_ptr<worklets::WorkletRuntime> audioRuntime;\n\n#if ANDROID\n  ~RuntimeRegistry() {\n    facebook::jni::ThreadScope::WithClassLoader([this]() {\n      uiRuntime.reset();\n      audioRuntime.reset();\n    });\n  }\n#endif\n};\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.cpp",
    "content": "#include <audioapi/core/utils/worklets/WorkletsRunner.h>\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\nWorkletsRunner::WorkletsRunner(\n    std::weak_ptr<worklets::WorkletRuntime> weakRuntime,\n    const std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,\n    bool shouldLockRuntime)\n    : weakRuntime_(std::move(weakRuntime)), shouldLockRuntime(shouldLockRuntime) {\n  auto strongRuntime = weakRuntime_.lock();\n  if (strongRuntime == nullptr) {\n    return;\n  }\n#if RN_AUDIO_API_ENABLE_WORKLETS\n  unsafeRuntimePtr = &strongRuntime->getJSIRuntime();\n  strongRuntime->executeSync([this, shareableWorklet](jsi::Runtime &rt) -> jsi::Value {\n    /// Placement new to avoid dynamic memory allocation\n    new (reinterpret_cast<jsi::Function *>(&unsafeWorklet))\n        jsi::Function(shareableWorklet->toJSValue(*unsafeRuntimePtr)\n                          .asObject(*unsafeRuntimePtr)\n                          .asFunction(*unsafeRuntimePtr));\n    return jsi::Value::undefined();\n  });\n  workletInitialized = true;\n#else\n  unsafeRuntimePtr = nullptr;\n  workletInitialized = false;\n#endif\n}\n\nWorkletsRunner::WorkletsRunner(WorkletsRunner &&other)\n    : weakRuntime_(std::move(other.weakRuntime_)),\n      unsafeRuntimePtr(other.unsafeRuntimePtr),\n      workletInitialized(other.workletInitialized),\n      shouldLockRuntime(other.shouldLockRuntime) {\n  if (workletInitialized) {\n    std::memcpy(&unsafeWorklet, &other.unsafeWorklet, sizeof(unsafeWorklet));\n    other.workletInitialized = false;\n    other.unsafeRuntimePtr = nullptr;\n  }\n}\n\nWorkletsRunner::~WorkletsRunner() {\n  if (!workletInitialized) {\n    return;\n  }\n  auto strongRuntime = weakRuntime_.lock();\n  if (strongRuntime == nullptr) {\n    // We cannot safely destroy the worklet without a valid runtime\n    return;\n  }\n  reinterpret_cast<jsi::Function *>(&unsafeWorklet)->~Function();\n  workletInitialized = false;\n}\n\nstd::optional<jsi::Value> WorkletsRunner::executeOnRuntimeGuarded(\n    const std::function<jsi::Value(jsi::Runtime &)> &&job) const noexcept(noexcept(job)) {\n  auto strongRuntime = weakRuntime_.lock();\n  if (strongRuntime == nullptr) {\n    return std::nullopt;\n  }\n#if RN_AUDIO_API_ENABLE_WORKLETS\n  return strongRuntime->executeSync(std::move(job));\n#else\n  return std::nullopt;\n#endif\n}\n\nstd::optional<jsi::Value> WorkletsRunner::executeOnRuntimeUnsafe(\n    const std::function<jsi::Value(jsi::Runtime &)> &&job) const noexcept(noexcept(job)) {\n#if RN_AUDIO_API_ENABLE_WORKLETS\n  return job(*unsafeRuntimePtr);\n#else\n  return std::nullopt;\n#endif\n}\n\n}; // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/core/utils/worklets/WorkletsRunner.h",
    "content": "#pragma once\n\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <jsi/jsi.h>\n\n#include <functional>\n#include <memory>\n#include <optional>\n#include <utility>\n\nnamespace audioapi {\nusing namespace facebook;\n\n/*\n* # How to extract worklet from JavaScript argument\n*\n* To extract a shareable worklet from a JavaScript argument, use the following code:\n*\n* ```cpp\n* auto worklet = worklets::extractSerializableWorkletFromArg(runtime, args[0]);\n* ```\n*\n* This will return a shared pointer to the extracted worklet, or throw an error if the argument is invalid.\n*/\n\nclass WorkletsRunner {\n public:\n  explicit WorkletsRunner(\n      std::weak_ptr<worklets::WorkletRuntime> weakRuntime,\n      const std::shared_ptr<worklets::SerializableWorklet> &shareableWorklet,\n      bool shouldLockRuntime = true);\n  WorkletsRunner(WorkletsRunner &&);\n  ~WorkletsRunner();\n\n  /// @brief Call the worklet function with the given arguments.\n  /// @tparam ...Args\n  /// @param ...args\n  /// @return The result of the worklet function call.\n  /// @note This method is unsafe and should be used with caution. It assumes that the runtime and worklet are valid and runtime is locked.\n  template <typename... Args>\n  inline jsi::Value callUnsafe(Args &&...args) {\n    return getUnsafeWorklet().call(*unsafeRuntimePtr, std::forward<Args>(args)...);\n  }\n\n  /// @brief Call the worklet function with the given arguments.\n  /// @tparam ...Args\n  /// @param ...args\n  /// @return The result of the worklet function call.\n  /// @note This method is safe and will check if the runtime is available before calling the worklet. If the runtime is not available, it will return nullopt.\n  template <typename... Args>\n  inline std::optional<jsi::Value> call(Args &&...args) {\n    return executeOnRuntimeGuarded([this, args...](jsi::Runtime &rt) -> jsi::Value {\n      return callUnsafe(std::forward<Args>(args)...);\n    });\n  }\n\n  /// @brief Execute a job on the UI runtime safely.\n  /// @param job\n  /// @return nullopt if the runtime is not available or the result of the job execution\n  /// @note Execution is synchronous and will be guarded if shouldLockRuntime is true.\n  inline std::optional<jsi::Value> executeOnRuntimeSync(\n      const std::function<jsi::Value(jsi::Runtime &)> &&job) const noexcept(noexcept(job)) {\n    if (shouldLockRuntime)\n      return executeOnRuntimeGuarded(std::move(job));\n    else\n      return executeOnRuntimeUnsafe(std::move(job));\n  }\n\n private:\n  std::weak_ptr<worklets::WorkletRuntime> weakRuntime_;\n  jsi::Runtime *unsafeRuntimePtr = nullptr;\n\n  /// @note We want to avoid automatic destruction as\n  /// when runtime is destroyed, underlying pointer will be invalid\n  char unsafeWorklet[sizeof(jsi::Function)];\n  bool workletInitialized = false;\n  bool shouldLockRuntime = true;\n\n  inline jsi::Function &getUnsafeWorklet() {\n    return *reinterpret_cast<jsi::Function *>(&unsafeWorklet);\n  }\n\n  std::optional<jsi::Value> executeOnRuntimeGuarded(\n      const std::function<jsi::Value(jsi::Runtime &)> &&job) const noexcept(noexcept(job));\n\n  std::optional<jsi::Value> executeOnRuntimeUnsafe(\n      const std::function<jsi::Value(jsi::Runtime &)> &&job) const noexcept(noexcept(job));\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/AudioUtils.hpp",
    "content": "#pragma once\n\n#include <cmath>\n#include <cstddef>\n#include <span>\n\nnamespace audioapi::dsp {\n\n[[nodiscard]] inline size_t timeToSampleFrame(double time, float sampleRate) {\n  return static_cast<size_t>(time * sampleRate);\n}\n\n[[nodiscard]] inline double sampleFrameToTime(int sampleFrame, float sampleRate) {\n  return static_cast<double>(sampleFrame) / sampleRate;\n}\n\n// NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables) -- function, not variable\n[[nodiscard]] inline float linearInterpolate(\n    std::span<const float> source,\n    size_t firstIndex,\n    size_t secondIndex,\n    float factor) {\n\n  if (firstIndex == secondIndex && firstIndex >= 1) {\n    return source[firstIndex] + factor * (source[firstIndex] - source[firstIndex - 1]);\n  }\n\n  return std::lerp(source[firstIndex], source[secondIndex], factor);\n}\n\n[[nodiscard]] inline float linearToDecibels(float value) {\n  constexpr float kDecibelsLinearFactor = 20.0f;\n  return kDecibelsLinearFactor * log10f(value);\n}\n\n[[nodiscard]] inline float decibelsToLinear(float value) {\n  constexpr float kDecibelsDenominator = 20.0f;\n  // NOLINTNEXTLINE(cppcoreguidelines-avoid-magic-numbers, readability-magic-numbers)\n  return static_cast<float>(pow(10, value / kDecibelsDenominator));\n}\n\n} // namespace audioapi::dsp\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/Convolver.cpp",
    "content": "// implementation of linear convolution algorithm described in this paper:\n// https://publications.rwth-aachen.de/record/466561/files/466561.pdf page 110\n\n#if defined(__ARM_NEON)\n#include <arm_neon.h>\n#endif\n\n#include <audioapi/dsp/Convolver.h>\n#include <audioapi/dsp/VectorMath.h>\n#include <audioapi/utils/AudioArray.hpp>\n\n#include <algorithm>\n#include <memory>\n\nnamespace audioapi {\n\nConvolver::Convolver()\n    : _trueSegmentCount(0),\n      _blockSize(0),\n      _segSize(0),\n      _segCount(0),\n      _fftComplexSize(0),\n      _fft(nullptr),\n      _current(0) {}\n\nvoid Convolver::reset() {\n  _blockSize = 0;\n  _segSize = 0;\n  _segCount = 0;\n  _fftComplexSize = 0;\n  _current = 0;\n  _fft = nullptr;\n  _segments.clear();\n  _segmentsIR.clear();\n  _preMultiplied.clear();\n  if (_fftBuffer != nullptr) {\n    _fftBuffer->zero();\n  }\n  if (_inputBuffer != nullptr) {\n    _inputBuffer->zero();\n  }\n}\n\nbool Convolver::init(size_t blockSize, const AudioArray &ir, size_t irLen) {\n  reset();\n  // blockSize must be a power of two\n  if ((blockSize & (blockSize - 1))) {\n    return false;\n  }\n\n  _blockSize = blockSize;\n  _trueSegmentCount =\n      static_cast<size_t>((std::ceil(static_cast<float>(irLen) / static_cast<float>(_blockSize))));\n\n  if (irLen == 0) {\n    return true;\n  }\n\n  // The length-N is split into P = N/B length-B sub filters\n  _segCount =\n      static_cast<size_t>((std::ceil(static_cast<float>(irLen) / static_cast<float>(_blockSize))));\n  _segSize = 2 * _blockSize;\n  // size of the FFT is 2B, so the complex size is B+1, due to the\n  // complex-conjugate symmetricity\n  _fftComplexSize = _segSize / 2 + 1;\n  _fft = std::make_shared<dsp::FFT>(static_cast<int>(_segSize));\n  _fftBuffer = std::make_unique<DSPAudioArray>(_segSize);\n\n  // segments preparation\n  for (int i = 0; i < _segCount; ++i) {\n    aligned_vec_complex vec(_fftComplexSize, std::complex<float>(0.0f, 0.0f));\n    _segments.push_back(vec);\n  }\n\n  // ir preparation\n  for (int i = 0; i < _segCount; ++i) {\n    aligned_vec_complex segment(_fftComplexSize);\n    const size_t remainingSamples = irLen - (i * _blockSize);\n    const size_t samplesToCopy = std::min(_blockSize, remainingSamples);\n\n    if (samplesToCopy > 0) {\n      _fftBuffer->copy(ir, i * _blockSize, 0, samplesToCopy);\n    }\n    // Each sub filter is zero-padded to length 2B and transformed using a\n    // 2B-point real-to-complex FFT.\n    _fftBuffer->zero(_blockSize, _blockSize);\n    _fft->doFFT(*_fftBuffer, segment);\n    segment.at(0).imag(0.0f); // ensure DC component is real\n    _segmentsIR.push_back(segment);\n  }\n\n  _preMultiplied = aligned_vec_complex(_fftComplexSize);\n  _inputBuffer = std::make_unique<DSPAudioArray>(_segSize);\n  _current = 0;\n\n  return true;\n}\n\n/// @brief Fast pairwise complex multiplication using ARM NEON intrinsics\n/// @param ir Impulse response\n/// @param audio Input audio signal\n/// @param pre Output buffer for pre-multiplied results\n/// @note IMPORTANT: ir, audio, and pre must be the same size and should be\n/// aligned to 16 bytes for optimal performance\nvoid pairwise_complex_multiply_fast(\n    const Convolver::aligned_vec_complex &ir,\n    const Convolver::aligned_vec_complex &audio,\n    Convolver::aligned_vec_complex &pre) {\n  size_t n = ir.size();\n\n/// @note Using ARM NEON intrinsics for SIMD optimization\n/// This implementation is on average 2x faster than the scalar version on ARM\n/// architectures With 16-byte alignment it can be even faster up to 2.5x\n#ifdef __ARM_NEON\n  size_t j = 0;\n\n  // Main vector loop: process 4 complex samples (8 floats) per iteration using\n  // vld2q/vst2q deinterleave\n  for (; j <= n - 4; j += 4) {\n    // load de-interleaved real/imag for 4 complex values\n    float32x4x2_t ir_de = vld2q_f32(reinterpret_cast<const float *>(&ir[j]));\n    float32x4x2_t a_de = vld2q_f32(reinterpret_cast<const float *>(&audio[j]));\n    float32x4x2_t pre_de = vld2q_f32(reinterpret_cast<float *>(&pre[j]));\n\n    float32x4_t ir_re = ir_de.val[0];\n    float32x4_t ir_im = ir_de.val[1];\n    float32x4_t a_re = a_de.val[0];\n    float32x4_t a_im = a_de.val[1];\n\n    // real = ir_re * a_re - ir_im * a_im\n    float32x4_t real = vmulq_f32(ir_re, a_re);\n    real = vmlsq_f32(real, ir_im, a_im);\n    // imag = ir_re * a_im + ir_im * a_re\n    float32x4_t imag = vmulq_f32(ir_re, a_im);\n    imag = vmlaq_f32(imag, ir_im, a_re);\n\n    // accumulate into pre\n    float32x4_t new_re = vaddq_f32(pre_de.val[0], real);\n    float32x4_t new_im = vaddq_f32(pre_de.val[1], imag);\n\n    float32x4x2_t out_de;\n    out_de.val[0] = new_re;\n    out_de.val[1] = new_im;\n\n    vst2q_f32(reinterpret_cast<float *>(&pre[j]), out_de);\n  }\n\n  // Tail\n  for (; j < n; ++j) {\n    pre[j] += ir[j] * audio[j];\n  }\n\n#else\n  // Fallback scalar implementation\n  for (size_t i = 0; i < n; ++i) {\n    pre[i] += ir[i] * audio[i];\n  }\n#endif\n}\n\nvoid Convolver::process(const DSPAudioArray &input, DSPAudioArray &output) {\n  // The input buffer acts as a 2B-point sliding window of the input signal.\n  // With each new input block, the right half of the input buffer is shifted\n  // to the left and the new block is stored in the right half.\n  _inputBuffer->copyWithin(_blockSize, 0, _blockSize);\n  _inputBuffer->copy(input, 0, _blockSize, _blockSize);\n\n  // All contents (DFT spectra) in the FDL are shifted up by one slot.\n  _current = (_current > 0) ? _current - 1 : _segCount - 1;\n  // A 2B-point real-to-complex FFT is computed from the input buffer,\n  // resulting in B+1 complex-conjugate symmetric DFT coefficients. The\n  // result is stored in the first FDL slot.\n  // _current marks first FDL slot, which is the current input block.\n  _fft->doFFT(*_inputBuffer, _segments[_current]);\n  _segments[_current][0].imag(0.0f); // ensure DC component is real\n\n  // The P sub filter spectra are pairwisely multiplied with the input spectra\n  // in the FDL. The results are accumulated in the frequency-domain.\n  memset(_preMultiplied.data(), 0, _preMultiplied.size() * sizeof(std::complex<float>));\n  for (size_t i = 0; i < _segCount; ++i) {\n    const int indexAudio = (_current + i) % _segCount;\n    const auto &impulseResponseSegment = _segmentsIR[i];\n    const auto &audioSegment = _segments[indexAudio];\n    pairwise_complex_multiply_fast(impulseResponseSegment, audioSegment, _preMultiplied);\n  }\n  // Of the accumulated spectral convolutions, an 2B-point complex-to-real\n  // IFFT is computed. From the resulting 2B samples, the left half is\n  // discarded and the right half is returned as the next output block.\n  _fft->doInverseFFT(_preMultiplied, *_fftBuffer);\n\n  output.copy(*_fftBuffer, _blockSize, 0, _blockSize);\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/Convolver.h",
    "content": "#pragma once\n\n#include <audioapi/dsp/FFT.h>\n#include <audioapi/utils/AlignedAllocator.hpp>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <complex>\n#include <cstring>\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\nclass Convolver {\n  using aligned_vec_complex =\n      std::vector<std::complex<float>, AlignedAllocator<std::complex<float>, 16>>;\n\n public:\n  Convolver();\n  bool init(size_t blockSize, const AudioArray &ir, size_t irLen);\n  void process(const DSPAudioArray &input, DSPAudioArray &output);\n  void reset();\n  [[nodiscard]] size_t getSegCount() const {\n    return _trueSegmentCount;\n  }\n\n private:\n  size_t _trueSegmentCount;\n  size_t _blockSize;\n  size_t _segSize;\n  size_t _segCount;\n  size_t _fftComplexSize;\n  std::vector<aligned_vec_complex> _segments;\n  std::vector<aligned_vec_complex> _segmentsIR;\n  std::unique_ptr<DSPAudioArray> _fftBuffer;\n  std::shared_ptr<dsp::FFT> _fft;\n  aligned_vec_complex _preMultiplied;\n  size_t _current;\n  std::unique_ptr<DSPAudioArray> _inputBuffer;\n\n  friend void pairwise_complex_multiply_fast(\n      const aligned_vec_complex &ir,\n      const aligned_vec_complex &audio,\n      aligned_vec_complex &pre);\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/FFT.cpp",
    "content": "#include <audioapi/dsp/FFT.h>\n\nnamespace audioapi::dsp {\n\nFFT::FFT(int size)\n    : size_(size),\n      pffftSetup_(pffft_new_setup(size_, PFFFT_REAL)),\n      work_(reinterpret_cast<float *>(pffft_aligned_malloc(size_ * sizeof(float)))) {}\n\nFFT::~FFT() {\n  pffft_destroy_setup(pffftSetup_);\n  pffft_aligned_free(work_);\n}\n\n} // namespace audioapi::dsp\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/FFT.h",
    "content": "#pragma once\n\n#include <audioapi/dsp/VectorMath.h>\n#include <audioapi/libs/pffft/pffft.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/Macros.h>\n\n#include <complex>\n#include <vector>\n\nnamespace audioapi::dsp {\n\nclass FFT {\n public:\n  explicit FFT(int size);\n  ~FFT();\n  DELETE_COPY_AND_MOVE(FFT);\n\n  template <typename Allocator, size_t Alignment>\n  void doFFT(\n      const AlignedAudioArray<Alignment> &in,\n      std::vector<std::complex<float>, Allocator> &out) {\n    pffft_transform_ordered(\n        pffftSetup_, in.begin(), reinterpret_cast<float *>(&out[0]), work_, PFFFT_FORWARD);\n    // this is a possible place for bugs and mistakes\n    // due to pffft implementation and how it stores results\n    // keep this information in mind\n    // out[0].real = DC component - should be pure real\n    // out[0].imag = Nyquist component - should be pure real\n  }\n\n  template <typename Allocator, size_t Alignment>\n  void doInverseFFT(\n      std::vector<std::complex<float>, Allocator> &in,\n      AlignedAudioArray<Alignment> &out) {\n    pffft_transform_ordered(\n        pffftSetup_, reinterpret_cast<float *>(&in[0]), out.begin(), work_, PFFFT_BACKWARD);\n\n    out.scale(1.0f / static_cast<float>(size_));\n  }\n\n private:\n  int size_;\n\n  PFFFT_Setup *pffftSetup_;\n  float *work_;\n};\n\n} // namespace audioapi::dsp\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/VectorMath.cpp",
    "content": "/*\n * Copyright (C) 2010, Google Inc. All rights reserved.\n * Copyright (C) 2020, Apple Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1.  Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include <audioapi/dsp/AudioUtils.hpp>\n#include <audioapi/dsp/VectorMath.h>\n#include <algorithm>\n\n#if defined(HAVE_ACCELERATE)\n#include <Accelerate/Accelerate.h>\n#endif\n\n#if defined(HAVE_X86_SSE2)\n#include <emmintrin.h>\n#endif\n\n#if defined(HAVE_ARM_NEON_INTRINSICS)\n#include <arm_neon.h>\n#endif\n\nnamespace audioapi::dsp {\n\n#ifdef HAVE_ACCELERATE\n\nvoid multiplyByScalar(\n    const float *inputVector,\n    float scalar,\n    float *outputVector,\n    size_t numberOfElementsToProcess) {\n  vDSP_vsmul(inputVector, 1, &scalar, outputVector, 1, numberOfElementsToProcess);\n}\n\nvoid addScalar(\n    const float *inputVector,\n    float scalar,\n    float *outputVector,\n    size_t numberOfElementsToProcess) {\n  vDSP_vsadd(inputVector, 1, &scalar, outputVector, 1, numberOfElementsToProcess);\n}\n\nvoid add(\n    const float *inputVector1,\n    const float *inputVector2,\n    float *outputVector,\n    size_t numberOfElementsToProcess) {\n  vDSP_vadd(inputVector1, 1, inputVector2, 1, outputVector, 1, numberOfElementsToProcess);\n}\n\nvoid subtract(\n    const float *inputVector1,\n    const float *inputVector2,\n    float *outputVector,\n    size_t numberOfElementsToProcess) {\n  vDSP_vsub(inputVector1, 1, inputVector2, 1, outputVector, 1, numberOfElementsToProcess);\n}\n\nvoid multiply(\n    const float *inputVector1,\n    const float *inputVector2,\n    float *outputVector,\n    size_t numberOfElementsToProcess) {\n  vDSP_vmul(inputVector1, 1, inputVector2, 1, outputVector, 1, numberOfElementsToProcess);\n}\n\nfloat maximumMagnitude(const float *inputVector, size_t numberOfElementsToProcess) {\n  float maximumValue = 0;\n  vDSP_maxmgv(inputVector, 1, &maximumValue, numberOfElementsToProcess);\n  return maximumValue;\n}\n\nvoid multiplyByScalarThenAddToOutput(\n    const float *inputVector,\n    float scalar,\n    float *outputVector,\n    size_t numberOfElementsToProcess) {\n  vDSP_vsma(inputVector, 1, &scalar, outputVector, 1, outputVector, 1, numberOfElementsToProcess);\n}\n\nvoid deinterleaveStereo(\n    const float *__restrict inputInterleaved,\n    float *__restrict outputLeft,\n    float *__restrict outputRight,\n    size_t numberOfFrames) {\n  float zero = 0.0f;\n  vDSP_vsadd(inputInterleaved, 2, &zero, outputLeft, 1, numberOfFrames);\n  vDSP_vsadd(inputInterleaved + 1, 2, &zero, outputRight, 1, numberOfFrames);\n}\n\nvoid interleaveStereo(\n    const float *__restrict inputLeft,\n    const float *__restrict inputRight,\n    float *__restrict outputInterleaved,\n    size_t numberOfFrames) {\n  float zero = 0.0f;\n  vDSP_vsadd(inputLeft, 1, &zero, outputInterleaved, 2, numberOfFrames);\n  vDSP_vsadd(inputRight, 1, &zero, outputInterleaved + 1, 2, numberOfFrames);\n}\n\n#else\n\n#ifdef HAVE_X86_SSE2\nstatic inline bool is16ByteAligned(const float *vector) {\n  return !(reinterpret_cast<uintptr_t>(vector) & 0x0F);\n}\n#endif\n\nvoid multiplyByScalar(\n    const float *inputVector,\n    float scalar,\n    float *outputVector,\n    size_t numberOfElementsToProcess) {\n  size_t n = numberOfElementsToProcess;\n\n#ifdef HAVE_X86_SSE2\n\n  // If the inputVector address is not 16-byte aligned, the first several frames\n  // (at most three) should be processed separately.\n  while (!is16ByteAligned(inputVector) && n) {\n    *outputVector = scalar * *inputVector;\n    inputVector++;\n    outputVector++;\n    n--;\n  }\n\n  // Now the inputVector address is aligned and start to apply SSE.\n  size_t group = n / 4;\n  __m128 mScale = _mm_set_ps1(scalar);\n  __m128 *pSource;\n  __m128 *pDest;\n  __m128 dest;\n\n  if (!is16ByteAligned(outputVector)) {\n    while (group--) {\n      pSource = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector));\n      dest = _mm_mul_ps(*pSource, mScale);\n      _mm_storeu_ps(outputVector, dest);\n\n      inputVector += 4;\n      outputVector += 4;\n    }\n  } else {\n    while (group--) {\n      pSource = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector));\n      pDest = reinterpret_cast<__m128 *>(outputVector);\n      *pDest = _mm_mul_ps(*pSource, mScale);\n\n      inputVector += 4;\n      outputVector += 4;\n    }\n  }\n\n  // Non-SSE handling for remaining frames which is less than 4.\n  n %= 4;\n#elif defined(HAVE_ARM_NEON_INTRINSICS)\n  size_t tailFrames = n % 4;\n  const float *endP = outputVector + n - tailFrames;\n\n  while (outputVector < endP) {\n    float32x4_t source = vld1q_f32(inputVector);\n    vst1q_f32(outputVector, vmulq_n_f32(source, scalar));\n\n    inputVector += 4;\n    outputVector += 4;\n  }\n  n = tailFrames;\n#endif\n  while (n--) {\n    *outputVector = scalar * *inputVector;\n    ++inputVector;\n    ++outputVector;\n  }\n}\n\nvoid addScalar(\n    const float *inputVector,\n    float scalar,\n    float *outputVector,\n    size_t numberOfElementsToProcess) {\n  size_t n = numberOfElementsToProcess;\n\n#ifdef HAVE_X86_SSE2\n  // If the inputVector address is not 16-byte aligned, the first several frames\n  // (at most three) should be processed separately.\n  while (!is16ByteAligned(inputVector) && n) {\n    *outputVector = *inputVector + scalar;\n    inputVector++;\n    outputVector++;\n    n--;\n  }\n\n  // Now the inputVector address is aligned and start to apply SSE.\n  size_t group = n / 4;\n  __m128 mScalar = _mm_set_ps1(scalar);\n  __m128 *pSource;\n  __m128 *pDest;\n  __m128 dest;\n\n  bool destAligned = is16ByteAligned(outputVector);\n  if (destAligned) { // all aligned\n    while (group--) {\n      pSource = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector));\n      pDest = reinterpret_cast<__m128 *>(outputVector);\n      *pDest = _mm_add_ps(*pSource, mScalar);\n\n      inputVector += 4;\n      outputVector += 4;\n    }\n  } else {\n    while (group--) {\n      pSource = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector));\n      dest = _mm_add_ps(*pSource, mScalar);\n      _mm_storeu_ps(outputVector, dest);\n\n      inputVector += 4;\n      outputVector += 4;\n    }\n  }\n\n  // Non-SSE handling for remaining frames which is less than 4.\n  n %= 4;\n#elif defined(HAVE_ARM_NEON_INTRINSICS)\n  size_t tailFrames = n % 4;\n  const float *endP = outputVector + n - tailFrames;\n  float32x4_t scalarVector = vdupq_n_f32(scalar);\n\n  while (outputVector < endP) {\n    float32x4_t source = vld1q_f32(inputVector);\n    vst1q_f32(outputVector, vaddq_f32(source, scalarVector));\n\n    inputVector += 4;\n    outputVector += 4;\n  }\n  n = tailFrames;\n#endif\n  while (n--) {\n    *outputVector = *inputVector + scalar;\n    ++inputVector;\n    ++outputVector;\n  }\n}\n\nvoid add(\n    const float *inputVector1,\n    const float *inputVector2,\n    float *outputVector,\n    size_t numberOfElementsToProcess) {\n  size_t n = numberOfElementsToProcess;\n\n#ifdef HAVE_X86_SSE2\n  // If the inputVector address is not 16-byte aligned, the first several frames\n  // (at most three) should be processed separately.\n  while (!is16ByteAligned(inputVector1) && n) {\n    *outputVector = *inputVector1 + *inputVector2;\n    inputVector1++;\n    inputVector2++;\n    outputVector++;\n    n--;\n  }\n\n  // Now the inputVector1 address is aligned and start to apply SSE.\n  size_t group = n / 4;\n  __m128 *pSource1;\n  __m128 *pSource2;\n  __m128 *pDest;\n  __m128 source2;\n  __m128 dest;\n\n  bool source2Aligned = is16ByteAligned(inputVector2);\n  bool destAligned = is16ByteAligned(outputVector);\n\n  if (source2Aligned && destAligned) { // all aligned\n    while (group--) {\n      pSource1 = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector1));\n      pSource2 = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector2));\n      pDest = reinterpret_cast<__m128 *>(outputVector);\n      *pDest = _mm_add_ps(*pSource1, *pSource2);\n\n      inputVector1 += 4;\n      inputVector2 += 4;\n      outputVector += 4;\n    }\n\n  } else if (source2Aligned && !destAligned) { // source2 aligned but dest not\n                                               // aligned\n    while (group--) {\n      pSource1 = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector1));\n      pSource2 = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector2));\n      dest = _mm_add_ps(*pSource1, *pSource2);\n      _mm_storeu_ps(outputVector, dest);\n\n      inputVector1 += 4;\n      inputVector2 += 4;\n      outputVector += 4;\n    }\n\n  } else if (!source2Aligned && destAligned) { // source2 not aligned but dest\n                                               // aligned\n    while (group--) {\n      pSource1 = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector1));\n      source2 = _mm_loadu_ps(inputVector2);\n      pDest = reinterpret_cast<__m128 *>(outputVector);\n      *pDest = _mm_add_ps(*pSource1, source2);\n\n      inputVector1 += 4;\n      inputVector2 += 4;\n      outputVector += 4;\n    }\n  } else if (!source2Aligned && !destAligned) { // both source2 and dest not\n                                                // aligned\n    while (group--) {\n      pSource1 = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector1));\n      source2 = _mm_loadu_ps(inputVector2);\n      dest = _mm_add_ps(*pSource1, source2);\n      _mm_storeu_ps(outputVector, dest);\n\n      inputVector1 += 4;\n      inputVector2 += 4;\n      outputVector += 4;\n    }\n  }\n\n  // Non-SSE handling for remaining frames which is less than 4.\n  n %= 4;\n#elif defined(HAVE_ARM_NEON_INTRINSICS)\n  size_t tailFrames = n % 4;\n  const float *endP = outputVector + n - tailFrames;\n\n  while (outputVector < endP) {\n    float32x4_t source1 = vld1q_f32(inputVector1);\n    float32x4_t source2 = vld1q_f32(inputVector2);\n    vst1q_f32(outputVector, vaddq_f32(source1, source2));\n\n    inputVector1 += 4;\n    inputVector2 += 4;\n    outputVector += 4;\n  }\n  n = tailFrames;\n#endif\n  while (n--) {\n    *outputVector = *inputVector1 + *inputVector2;\n    ++inputVector1;\n    ++inputVector2;\n    ++outputVector;\n  }\n}\n\nvoid subtract(\n    const float *inputVector1,\n    const float *inputVector2,\n    float *outputVector,\n    size_t numberOfElementsToProcess) {\n  size_t n = numberOfElementsToProcess;\n\n#ifdef HAVE_X86_SSE2\n  // If the inputVector address is not 16-byte aligned, the first several frames\n  // (at most three) should be processed separately.\n  while (!is16ByteAligned(inputVector1) && n) {\n    *outputVector = *inputVector1 - *inputVector2;\n    inputVector1++;\n    inputVector2++;\n    outputVector++;\n    n--;\n  }\n\n  // Now the inputVector1 address is aligned and start to apply SSE.\n  size_t group = n / 4;\n  __m128 *pSource1;\n  __m128 *pSource2;\n  __m128 *pDest;\n  __m128 source2;\n  __m128 dest;\n\n  bool source2Aligned = is16ByteAligned(inputVector2);\n  bool destAligned = is16ByteAligned(outputVector);\n\n  if (source2Aligned && destAligned) { // all aligned\n    while (group--) {\n      pSource1 = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector1));\n      pSource2 = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector2));\n      pDest = reinterpret_cast<__m128 *>(outputVector);\n      *pDest = _mm_sub_ps(*pSource1, *pSource2);\n\n      inputVector1 += 4;\n      inputVector2 += 4;\n      outputVector += 4;\n    }\n  } else if (source2Aligned && !destAligned) { // source2 aligned but dest not\n                                               // aligned\n    while (group--) {\n      pSource1 = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector1));\n      pSource2 = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector2));\n      dest = _mm_sub_ps(*pSource1, *pSource2);\n      _mm_storeu_ps(outputVector, dest);\n\n      inputVector1 += 4;\n      inputVector2 += 4;\n      outputVector += 4;\n    }\n  } else if (!source2Aligned && destAligned) { // source2 not aligned but dest\n                                               // aligned\n    while (group--) {\n      pSource1 = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector1));\n      source2 = _mm_loadu_ps(inputVector2);\n      pDest = reinterpret_cast<__m128 *>(outputVector);\n      *pDest = _mm_sub_ps(*pSource1, source2);\n\n      inputVector1 += 4;\n      inputVector2 += 4;\n      outputVector += 4;\n    }\n  } else if (!source2Aligned && !destAligned) { // both source2 and dest not\n                                                // aligned\n    while (group--) {\n      pSource1 = reinterpret_cast<__m128 *>(const_cast<float *>(inputVector1));\n      source2 = _mm_loadu_ps(inputVector2);\n      dest = _mm_sub_ps(*pSource1, source2);\n      _mm_storeu_ps(outputVector, dest);\n\n      inputVector1 += 4;\n      inputVector2 += 4;\n      outputVector += 4;\n    }\n  }\n\n  // Non-SSE handling for remaining frames which is less than 4.\n  n %= 4;\n#elif defined(HAVE_ARM_NEON_INTRINSICS)\n  size_t tailFrames = n % 4;\n  const float *endP = outputVector + n - tailFrames;\n\n  while (outputVector < endP) {\n    float32x4_t source1 = vld1q_f32(inputVector1);\n    float32x4_t source2 = vld1q_f32(inputVector2);\n    vst1q_f32(outputVector, vsubq_f32(source1, source2));\n\n    inputVector1 += 4;\n    inputVector2 += 4;\n    outputVector += 4;\n  }\n  n = tailFrames;\n#endif\n  while (n--) {\n    *outputVector = *inputVector1 - *inputVector2;\n    ++inputVector1;\n    ++inputVector2;\n    ++outputVector;\n  }\n}\n\nvoid multiply(\n    const float *inputVector1,\n    const float *inputVector2,\n    float *outputVector,\n    size_t numberOfElementsToProcess) {\n  size_t n = numberOfElementsToProcess;\n\n#ifdef HAVE_X86_SSE2\n  // If the inputVector1 address is not 16-byte aligned, the first several\n  // frames (at most three) should be processed separately.\n  while (!is16ByteAligned(inputVector1) && n) {\n    *outputVector = *inputVector1 * *inputVector2;\n    inputVector1++;\n    inputVector2++;\n    outputVector++;\n    n--;\n  }\n\n  // Now the inputVector1 address aligned and start to apply SSE.\n  size_t tailFrames = n % 4;\n  const float *endP = outputVector + n - tailFrames;\n  __m128 pSource1;\n  __m128 pSource2;\n  __m128 dest;\n\n  bool source2Aligned = is16ByteAligned(inputVector2);\n  bool destAligned = is16ByteAligned(outputVector);\n\n#define SSE2_MULT(loadInstr, storeInstr) \\\n  while (outputVector < endP) { \\\n    pSource1 = _mm_load_ps(inputVector1); \\\n    pSource2 = _mm_##loadInstr##_ps(inputVector2); \\\n    dest = _mm_mul_ps(pSource1, pSource2); \\\n    _mm_##storeInstr##_ps(outputVector, dest); \\\n    inputVector1 += 4; \\\n    inputVector2 += 4; \\\n    outputVector += 4; \\\n  }\n\n  if (source2Aligned && destAligned) // Both aligned.\n    SSE2_MULT(load, store)\n  else if (source2Aligned && !destAligned) // Source2 is aligned but dest not.\n    SSE2_MULT(load, storeu)\n  else if (!source2Aligned && destAligned) // Dest is aligned but source2 not.\n    SSE2_MULT(loadu, store)\n  else // Neither aligned.\n    SSE2_MULT(loadu, storeu)\n\n  n = tailFrames;\n#elif defined(HAVE_ARM_NEON_INTRINSICS)\n  size_t tailFrames = n % 4;\n  const float *endP = outputVector + n - tailFrames;\n\n  while (outputVector < endP) {\n    float32x4_t source1 = vld1q_f32(inputVector1);\n    float32x4_t source2 = vld1q_f32(inputVector2);\n    vst1q_f32(outputVector, vmulq_f32(source1, source2));\n\n    inputVector1 += 4;\n    inputVector2 += 4;\n    outputVector += 4;\n  }\n  n = tailFrames;\n#endif\n  while (n--) {\n    *outputVector = *inputVector1 * *inputVector2;\n    ++inputVector1;\n    ++inputVector2;\n    ++outputVector;\n  }\n}\n\nfloat maximumMagnitude(const float *inputVector, size_t numberOfElementsToProcess) {\n  size_t n = numberOfElementsToProcess;\n  float max = 0;\n\n#ifdef HAVE_X86_SSE2\n  // If the inputVector address is not 16-byte aligned, the first several frames\n  // (at most three) should be processed separately.\n  while (!is16ByteAligned(inputVector) && n) {\n    max = std::max(max, std::abs(*inputVector));\n    inputVector++;\n    n--;\n  }\n\n  // Now the inputVector is aligned, use SSE.\n  size_t tailFrames = n % 4;\n  const float *endP = inputVector + n - tailFrames;\n  __m128 source;\n  __m128 mMax = _mm_setzero_ps();\n  int mask = 0x7FFFFFFF;\n  __m128 mMask = _mm_set1_ps(*reinterpret_cast<float *>(&mask));\n\n  while (inputVector < endP) {\n    source = _mm_load_ps(inputVector);\n    // Calculate the absolute value by anding source with mask, the sign bit is\n    // set to 0.\n    source = _mm_and_ps(source, mMask);\n    mMax = _mm_max_ps(mMax, source);\n    inputVector += 4;\n  }\n\n  // Get max from the SSE results.\n  const float *groupMaxP = reinterpret_cast<float *>(&mMax);\n  max = std::max(max, groupMaxP[0]);\n  max = std::max(max, groupMaxP[1]);\n  max = std::max(max, groupMaxP[2]);\n  max = std::max(max, groupMaxP[3]);\n\n  n = tailFrames;\n#elif defined(c)\n  size_t tailFrames = n % 4;\n  const float *endP = inputVector + n - tailFrames;\n\n  float32x4_t fourMax = vdupq_n_f32(0);\n  while (inputVector < endP) {\n    float32x4_t source = vld1q_f32(inputVector);\n    fourMax = vmaxq_f32(fourMax, vabsq_f32(source));\n    inputVector += 4;\n  }\n  float32x2_t twoMax = vmax_f32(vget_low_f32(fourMax), vget_high_f32(fourMax));\n\n  float groupMax[2];\n  vst1_f32(groupMax, twoMax);\n  max = std::max(groupMax[0], groupMax[1]);\n\n  n = tailFrames;\n#endif\n\n  while (n--) {\n    max = std::max(max, std::abs(*inputVector));\n    ++inputVector;\n  }\n\n  return max;\n}\n\nvoid multiplyByScalarThenAddToOutput(\n    const float *inputVector,\n    float scalar,\n    float *outputVector,\n    size_t numberOfElementsToProcess) {\n  size_t n = numberOfElementsToProcess;\n\n#if HAVE_X86_SSE2\n  // If the inputVector address is not 16-byte aligned, the first several frames\n  // (at most three) should be processed separately.\n  while (!is16ByteAligned(inputVector) && n) {\n    *outputVector += scalar * *inputVector;\n    inputVector++;\n    outputVector++;\n    n--;\n  }\n\n  // Now the inputVector is aligned, use SSE.\n  size_t tailFrames = n % 4;\n  const float *endP = outputVector + n - tailFrames;\n\n  __m128 pSource;\n  __m128 dest;\n  __m128 temp;\n  __m128 mScale = _mm_set_ps1(scalar);\n\n  bool destAligned = is16ByteAligned(outputVector);\n\n#define SSE2_MULT_ADD(loadInstr, storeInstr) \\\n  while (outputVector < endP) { \\\n    pSource = _mm_load_ps(inputVector); \\\n    temp = _mm_mul_ps(pSource, mScale); \\\n    dest = _mm_##loadInstr##_ps(outputVector); \\\n    dest = _mm_add_ps(dest, temp); \\\n    _mm_##storeInstr##_ps(outputVector, dest); \\\n    inputVector += 4; \\\n    outputVector += 4; \\\n  }\n\n  if (destAligned)\n    SSE2_MULT_ADD(load, store)\n  else\n    SSE2_MULT_ADD(loadu, storeu)\n\n  n = tailFrames;\n#elif HAVE_ARM_NEON_INTRINSICS\n  size_t tailFrames = n % 4;\n  const float *endP = outputVector + n - tailFrames;\n\n  float32x4_t k = vdupq_n_f32(scalar);\n  while (outputVector < endP) {\n    float32x4_t source = vld1q_f32(inputVector);\n    float32x4_t dest = vld1q_f32(outputVector);\n\n    dest = vmlaq_f32(dest, source, k);\n    vst1q_f32(outputVector, dest);\n\n    inputVector += 4;\n    outputVector += 4;\n  }\n  n = tailFrames;\n#endif\n  while (n--) {\n    *outputVector += *inputVector * scalar;\n    ++inputVector;\n    ++outputVector;\n  }\n}\n\nvoid deinterleaveStereo(\n    const float *__restrict inputInterleaved,\n    float *__restrict outputLeft,\n    float *__restrict outputRight,\n    size_t numberOfFrames) {\n\n  size_t n = numberOfFrames;\n\n#ifdef HAVE_ARM_NEON_INTRINSICS\n  // process 4 frames (8 samples) at a time using NEON\n  size_t group = n / 4;\n  while (group--) {\n    // vld2q_f32 deinterleaves L and R into separate registers in one hardware op\n    float32x4x2_t v = vld2q_f32(inputInterleaved);\n    vst1q_f32(outputLeft, v.val[0]);\n    vst1q_f32(outputRight, v.val[1]);\n\n    inputInterleaved += 8;\n    outputLeft += 4;\n    outputRight += 4;\n  }\n  n %= 4;\n#elif defined(HAVE_X86_SSE2)\n  // process 4 frames (8 samples) at a time using SSE\n  size_t group = n / 4;\n  while (group--) {\n    // load two 128-bit registers (8 floats total)\n    __m128 s0 = _mm_loadu_ps(inputInterleaved);\n    __m128 s1 = _mm_loadu_ps(inputInterleaved + 4);\n\n    // use shuffle to group the Left samples and Right samples\n    // mask 0x88 (2,0,2,0) picks indices 0 and 2 from both s0 and s1\n    // mask 0xDD (3,1,3,1) picks indices 1 and 3 from both s0 and s1\n    __m128 left_v = _mm_shuffle_ps(s0, s1, _MM_SHUFFLE(2, 0, 2, 0));\n    __m128 right_v = _mm_shuffle_ps(s0, s1, _MM_SHUFFLE(3, 1, 3, 1));\n\n    _mm_storeu_ps(outputLeft, left_v);\n    _mm_storeu_ps(outputRight, right_v);\n\n    inputInterleaved += 8;\n    outputLeft += 4;\n    outputRight += 4;\n  }\n  n %= 4;\n#endif\n\n  while (n--) {\n    *outputLeft++ = *inputInterleaved++;\n    *outputRight++ = *inputInterleaved++;\n  }\n}\n\nvoid interleaveStereo(\n    const float *__restrict inputLeft,\n    const float *__restrict inputRight,\n    float *__restrict outputInterleaved,\n    size_t numberOfFrames) {\n\n  size_t n = numberOfFrames;\n\n#ifdef HAVE_ARM_NEON_INTRINSICS\n  // process 4 frames (8 samples) at a time\n  size_t group = n / 4;\n  while (group--) {\n    // load contiguous planar data\n    float32x4_t vL = vld1q_f32(inputLeft);\n    float32x4_t vR = vld1q_f32(inputRight);\n\n    // vst2q_f32 takes two registers and interleaves them during the store:\n    float32x4x2_t vOut = {vL, vR};\n    vst2q_f32(outputInterleaved, vOut);\n\n    inputLeft += 4;\n    inputRight += 4;\n    outputInterleaved += 8;\n  }\n  n %= 4;\n#elif defined(HAVE_X86_SSE2)\n  // process 4 frames (8 samples) at a time\n  size_t group = n / 4;\n  while (group--) {\n    __m128 vL = _mm_loadu_ps(inputLeft);\n    __m128 vR = _mm_loadu_ps(inputRight);\n\n    // unpack low: Interleaves first two elements of each register\n    __m128 vLow = _mm_unpacklo_ps(vL, vR);\n\n    // unpack high: Interleaves last two elements of each register\n    __m128 vHigh = _mm_unpackhi_ps(vL, vR);\n\n    _mm_storeu_ps(outputInterleaved, vLow);\n    _mm_storeu_ps(outputInterleaved + 4, vHigh);\n\n    inputLeft += 4;\n    inputRight += 4;\n    outputInterleaved += 8;\n  }\n  n %= 4;\n#endif\n\n  while (n--) {\n    *outputInterleaved++ = *inputLeft++;\n    *outputInterleaved++ = *inputRight++;\n  }\n}\n\n#endif\n\n} // namespace audioapi::dsp\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/VectorMath.h",
    "content": "/*\n * Copyright (C) 2010, Google Inc. All rights reserved.\n * Copyright (C) 2020, Apple Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1.  Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR\n * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\n * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#pragma once\n\n// Defines the interface for several vector math functions whose implementation\n// will ideally be optimized.\n\n#include <cstddef>\n\nnamespace audioapi::dsp {\n\nvoid multiplyByScalarThenAddToOutput(\n    const float *inputVector,\n    float scalar,\n    float *outputVector,\n    size_t numberOfElementsToProcess);\n\nvoid multiplyByScalar(\n    const float *inputVector,\n    float scalar,\n    float *outputVector,\n    size_t numberOfElementsToProcess);\nvoid addScalar(\n    const float *inputVector,\n    float scalar,\n    float *outputVector,\n    size_t numberOfElementsToProcess);\nvoid add(\n    const float *inputVector1,\n    const float *inputVector2,\n    float *outputVector,\n    size_t numberOfElementsToProcess);\nvoid subtract(\n    const float *inputVector1,\n    const float *inputVector2,\n    float *outputVector,\n    size_t numberOfElementsToProcess);\nvoid multiply(\n    const float *inputVector1,\n    const float *inputVector2,\n    float *outputVector,\n    size_t numberOfElementsToProcess);\n\n// Finds the maximum magnitude of a float vector.\nfloat maximumMagnitude(const float *inputVector, size_t numberOfElementsToProcess);\n\nvoid interleaveStereo(\n    const float *inputLeft,\n    const float *inputRight,\n    float *outputInterleaved,\n    size_t numberOfFrames);\n\nvoid deinterleaveStereo(\n    const float *inputInterleaved,\n    float *outputLeft,\n    float *outputRight,\n    size_t numberOfFrames);\n\n} // namespace audioapi::dsp\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/WaveShaper.cpp",
    "content": "#include <audioapi/core/utils/Constants.h>\n#include <audioapi/dsp/VectorMath.h>\n#include <audioapi/dsp/WaveShaper.h>\n\n#include <cstring>\n#include <memory>\n\nnamespace audioapi {\n\nWaveShaper::WaveShaper(const std::shared_ptr<AudioArray> &curve, float sampleRate)\n    : curve_(curve), sampleRate_(sampleRate) {\n  tempBuffer2x_ = std::make_shared<DSPAudioArray>(RENDER_QUANTUM_SIZE * 2);\n  tempBuffer2x_->zero();\n  tempBuffer4x_ = std::make_shared<DSPAudioArray>(RENDER_QUANTUM_SIZE * 4);\n  tempBuffer4x_->zero();\n\n  createResamplers(OverSampleType::OVERSAMPLE_NONE);\n}\n\nvoid WaveShaper::createResamplers(OverSampleType type) {\n  if (type == OverSampleType::OVERSAMPLE_2X) {\n    upSampler_ = std::make_unique<r8b::SingleChannelResampler>(\n        sampleRate_, sampleRate_ * 2, RENDER_QUANTUM_SIZE);\n    downSampler_ = std::make_unique<r8b::SingleChannelResampler>(\n        sampleRate_ * 2, sampleRate_, RENDER_QUANTUM_SIZE * 2);\n  } else if (type == OverSampleType::OVERSAMPLE_4X) {\n    upSampler_ = std::make_unique<r8b::SingleChannelResampler>(\n        sampleRate_, sampleRate_ * 4, RENDER_QUANTUM_SIZE * 2);\n    downSampler_ = std::make_unique<r8b::SingleChannelResampler>(\n        sampleRate_ * 4, sampleRate_, RENDER_QUANTUM_SIZE * 4);\n  }\n}\n\nvoid WaveShaper::setCurve(const std::shared_ptr<AudioArray> &curve) {\n  curve_ = curve;\n}\n\nvoid WaveShaper::setOversample(OverSampleType type) {\n  oversample_ = type;\n  createResamplers(type);\n}\n\nvoid WaveShaper::process(DSPAudioArray &channelData, int framesToProcess) {\n  if (curve_ == nullptr) {\n    return;\n  }\n\n  switch (oversample_) {\n    case OverSampleType::OVERSAMPLE_2X:\n    case OverSampleType::OVERSAMPLE_4X:\n      processResampled(channelData, framesToProcess);\n      break;\n    case OverSampleType::OVERSAMPLE_NONE:\n    default:\n      processNone(channelData, framesToProcess);\n      break;\n  }\n}\n\n// based on https://webaudio.github.io/web-audio-api/#WaveShaperNode\nvoid WaveShaper::processNone(DSPAudioArray &channelData, int framesToProcess) {\n  auto curveSize = curve_->getSize();\n\n  for (int i = 0; i < framesToProcess; i++) {\n    float v = (static_cast<float>(curveSize) - 1) * 0.5f * (channelData[i] + 1.0f);\n\n    if (v <= 0) {\n      channelData[i] = (*curve_)[0];\n    } else if (v >= static_cast<float>(curveSize) - 1) {\n      channelData[i] = (*curve_)[curveSize - 1];\n    } else {\n      auto k = std::floor(v);\n      auto f = v - k;\n      auto kIndex = static_cast<size_t>(k);\n      channelData[i] = (1 - f) * (*curve_)[kIndex] + f * (*curve_)[kIndex + 1];\n    }\n  }\n}\n\nvoid WaveShaper::processResampled(DSPAudioArray &channelData, int framesToProcess) {\n  auto &outArray = (oversample_ == OverSampleType::OVERSAMPLE_4X) ? *tempBuffer4x_ : *tempBuffer2x_;\n  const int outputFrames = upSampler_->process(channelData, framesToProcess, outArray);\n  processNone(outArray, outputFrames);\n  downSampler_->process(outArray, outputFrames, channelData);\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/WaveShaper.h",
    "content": "#pragma once\n\n#include <audioapi/core/types/OverSampleType.h>\n#include <audioapi/dsp/r8brain/Resampler.hpp>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <memory>\n\nnamespace audioapi {\n\nclass WaveShaper {\n public:\n  explicit WaveShaper(const std::shared_ptr<AudioArray> &curve, float sampleRate);\n\n  void process(DSPAudioArray &channelData, int framesToProcess);\n\n  void setCurve(const std::shared_ptr<AudioArray> &curve);\n  void setOversample(OverSampleType type);\n\n private:\n  OverSampleType oversample_ = OverSampleType::OVERSAMPLE_NONE;\n  std::shared_ptr<AudioArray> curve_;\n  float sampleRate_;\n\n  std::unique_ptr<r8b::SingleChannelResampler> upSampler_;\n  std::unique_ptr<r8b::SingleChannelResampler> downSampler_;\n\n  std::shared_ptr<DSPAudioArray> tempBuffer2x_;\n  std::shared_ptr<DSPAudioArray> tempBuffer4x_;\n\n  void createResamplers(OverSampleType type);\n  void processNone(DSPAudioArray &channelData, int framesToProcess);\n  void processResampled(DSPAudioArray &channelData, int framesToProcess);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/CDSPBlockConvolver.h",
    "content": "//$ nobt\r\n//$ nocpp\r\n\r\n/**\r\n * @file CDSPBlockConvolver.h\r\n *\r\n * @brief Single-block overlap-save convolution processor class.\r\n *\r\n * This file includes single-block overlap-save convolution processor class.\r\n *\r\n * r8brain-free-src Copyright (c) 2013-2025 Aleksey Vaneev\r\n *\r\n * See the \"LICENSE\" file for license.\r\n */\r\n\r\n#ifndef R8B_CDSPBLOCKCONVOLVER_INCLUDED\r\n#define R8B_CDSPBLOCKCONVOLVER_INCLUDED\r\n\r\n#include \"CDSPFIRFilter.h\"\r\n#include \"CDSPProcessor.h\"\r\n\r\nnamespace r8b {\r\n\r\n/**\r\n * @brief Single-block overlap-save convolution processing class.\r\n *\r\n * Class that implements single-block overlap-save convolution processing. The\r\n * length of a single FFT block used depends on the length of the filter\r\n * kernel.\r\n *\r\n * The rationale behind \"single-block\" processing is that increasing the FFT\r\n * block length by 2 is more efficient than performing convolution at the same\r\n * FFT block length but using two blocks.\r\n *\r\n * This class also implements a built-in resampling by any whole-number\r\n * factor, which simplifies the overall resampling objects topology.\r\n */\r\n\r\nclass CDSPBlockConvolver : public CDSPProcessor {\r\n public:\r\n  /**\r\n\t * @brief Initializes internal variables and constants of *this* object.\r\n\t *\r\n\t * @param aFilter Pre-calculated filter data. Reference to this object is\r\n\t * inhertied by *this* object, and the object will be released when *this*\r\n\t * object is destroyed. If upsampling is used, filter's gain should be\r\n\t * equal to the upsampling factor.\r\n\t * @param aUpFactor The upsampling factor, positive value. E.g., value of\r\n\t * 2 means 2x upsampling should be performed over the input data.\r\n\t * @param aDownFactor The downsampling factor, positive value. E.g., value\r\n\t * of 2 means 2x downsampling should be performed over the output data.\r\n\t * @param PrevLatency Latency, in samples (any value greater or equal to\r\n\t * 0), which was left in the output signal by a previous process. This\r\n\t * value is usually non-zero if the minimum-phase filters are in use. This\r\n\t * value is always zero if the linear-phase filters are in use.\r\n\t * @param aDoConsumeLatency `true` if the output latency should be\r\n\t * consumed. Does not apply to the fractional part of the latency (if such\r\n\t * part is available).\r\n\t */\r\n\r\n  CDSPBlockConvolver(\r\n      CDSPFIRFilter &aFilter,\r\n      const int aUpFactor,\r\n      const int aDownFactor,\r\n      const double PrevLatency = 0.0,\r\n      const bool aDoConsumeLatency = true)\r\n      : Filter(&aFilter),\r\n        UpFactor(aUpFactor),\r\n        DownFactor(aDownFactor),\r\n        BlockLen2(2 << Filter->getBlockLenBits()),\r\n        DoConsumeLatency(aDoConsumeLatency) {\r\n    R8BASSERT(UpFactor > 0);\r\n    R8BASSERT(DownFactor > 0);\r\n    R8BASSERT(PrevLatency >= 0.0);\r\n\r\n    int fftinBits;\r\n    UpShift = getBitOccupancy(UpFactor) - 1;\r\n\r\n    if ((1 << UpShift) == UpFactor) {\r\n      fftinBits = Filter->getBlockLenBits() + 1 - UpShift;\r\n      PrevInputLen = (Filter->getKernelLen() - 1 + UpFactor - 1) / UpFactor;\r\n\r\n      InputLen = BlockLen2 - PrevInputLen * UpFactor;\r\n    } else {\r\n      UpShift = -1;\r\n      fftinBits = Filter->getBlockLenBits() + 1;\r\n      PrevInputLen = Filter->getKernelLen() - 1;\r\n      InputLen = BlockLen2 - PrevInputLen;\r\n    }\r\n\r\n    OutOffset = (Filter->isZeroPhase() ? Filter->getLatency() : 0);\r\n    LatencyFrac = Filter->getLatencyFrac() + PrevLatency * UpFactor;\r\n    Latency = (int)LatencyFrac;\r\n    const int InLatency = Latency + Filter->getLatency() - OutOffset;\r\n    LatencyFrac -= Latency;\r\n    LatencyFrac /= DownFactor;\r\n\r\n    Latency += InputLen + Filter->getLatency();\r\n\r\n    int fftoutBits;\r\n    InputDelay = 0;\r\n    DownSkipInit = 0;\r\n    DownShift = getBitOccupancy(DownFactor) - 1;\r\n\r\n    if ((1 << DownShift) == DownFactor) {\r\n      fftoutBits = Filter->getBlockLenBits() + 1 - DownShift;\r\n\r\n      if (DownFactor > 1) {\r\n        if (UpShift > 0) {\r\n          // This case never happens in practice due to mutual\r\n          // exclusion of \"power of 2\" DownFactor and UpFactor\r\n          // values.\r\n\r\n          R8BASSERT(UpShift == 0);\r\n        } else {\r\n          // Make sure InputLen is divisible by DownFactor.\r\n\r\n          const int ilc = InputLen & (DownFactor - 1);\r\n          PrevInputLen += ilc;\r\n          InputLen -= ilc;\r\n          Latency -= ilc;\r\n\r\n          // Correct InputDelay for input and filter's latency.\r\n\r\n          const int lc = InLatency & (DownFactor - 1);\r\n\r\n          if (lc > 0) {\r\n            InputDelay = DownFactor - lc;\r\n          }\r\n\r\n          if (!DoConsumeLatency) {\r\n            Latency /= DownFactor;\r\n          }\r\n        }\r\n      }\r\n    } else {\r\n      fftoutBits = Filter->getBlockLenBits() + 1;\r\n      DownShift = -1;\r\n\r\n      if (!DoConsumeLatency && DownFactor > 1) {\r\n        DownSkipInit = Latency % DownFactor;\r\n        Latency /= DownFactor;\r\n      }\r\n    }\r\n\r\n    R8BASSERT(Latency >= 0);\r\n\r\n    fftin = new CDSPRealFFTKeeper(fftinBits);\r\n\r\n    if (fftoutBits == fftinBits) {\r\n      fftout = fftin;\r\n    } else {\r\n      ffto2 = new CDSPRealFFTKeeper(fftoutBits);\r\n      fftout = ffto2;\r\n    }\r\n\r\n    WorkBlocks.alloc(BlockLen2 * 2 + PrevInputLen);\r\n    CurInput = &WorkBlocks[0];\r\n    CurOutput = &WorkBlocks[BlockLen2]; // CurInput and\r\n                                        // CurOutput are address-aligned.\r\n    PrevInput = &WorkBlocks[BlockLen2 * 2];\r\n\r\n    clear();\r\n\r\n    R8BCONSOLE(\r\n        \"CDSPBlockConvolver: flt_len=%i in_len=%i io=%i/%i \"\r\n        \"fft=%i/%i latency=%i\\n\",\r\n        Filter->getKernelLen(),\r\n        InputLen,\r\n        UpFactor,\r\n        DownFactor,\r\n        (*fftin)->getLen(),\r\n        (*fftout)->getLen(),\r\n        getLatency());\r\n  }\r\n\r\n  virtual ~CDSPBlockConvolver() {\r\n    Filter->unref();\r\n  }\r\n\r\n  virtual int getInLenBeforeOutPos(const int ReqOutPos) const {\r\n    return ((int)((Latency + (double)ReqOutPos * DownFactor) / UpFactor +\r\n                  LatencyFrac * DownFactor / UpFactor));\r\n  }\r\n\r\n  virtual int getLatency() const {\r\n    return (DoConsumeLatency ? 0 : Latency);\r\n  }\r\n\r\n  virtual double getLatencyFrac() const {\r\n    return (LatencyFrac);\r\n  }\r\n\r\n  virtual int getMaxOutLen(const int MaxInLen) const {\r\n    R8BASSERT(MaxInLen >= 0);\r\n\r\n    return ((MaxInLen * UpFactor + DownFactor - 1) / DownFactor);\r\n  }\r\n\r\n  virtual void clear() {\r\n    memset(&PrevInput[0], 0, (size_t)PrevInputLen * sizeof(PrevInput[0]));\r\n\r\n    if (DoConsumeLatency) {\r\n      LatencyLeft = Latency;\r\n    } else {\r\n      LatencyLeft = 0;\r\n\r\n      if (DownShift > 0) {\r\n        memset(&CurOutput[0], 0, (size_t)(BlockLen2 >> DownShift) * sizeof(CurOutput[0]));\r\n      } else {\r\n        memset(&CurOutput[BlockLen2 - OutOffset], 0, (size_t)OutOffset * sizeof(CurOutput[0]));\r\n\r\n        memset(&CurOutput[0], 0, (size_t)(InputLen - OutOffset) * sizeof(CurOutput[0]));\r\n      }\r\n    }\r\n\r\n    memset(CurInput, 0, (size_t)InputDelay * sizeof(CurInput[0]));\r\n\r\n    InDataLeft = InputLen - InputDelay;\r\n    UpSkip = 0;\r\n    DownSkip = DownSkipInit;\r\n  }\r\n\r\n  virtual int process(double *ip, int l0, double *&op0) {\r\n    R8BASSERT(l0 >= 0);\r\n    R8BASSERT(UpFactor / DownFactor <= 1 || ip != op0 || l0 == 0);\r\n\r\n    double *op = op0;\r\n    int l = l0 * UpFactor;\r\n    l0 = 0;\r\n\r\n    while (l > 0) {\r\n      const int Offs = InputLen - InDataLeft;\r\n\r\n      if (l < InDataLeft) {\r\n        InDataLeft -= l;\r\n\r\n        if (UpShift >= 0) {\r\n          memcpy(&CurInput[Offs >> UpShift], ip, (size_t)(l >> UpShift) * sizeof(CurInput[0]));\r\n        } else {\r\n          copyUpsample(ip, &CurInput[Offs], l);\r\n        }\r\n\r\n        copyToOutput(Offs - OutOffset, op, l, l0);\r\n        break;\r\n      }\r\n\r\n      const int b = InDataLeft;\r\n      l -= b;\r\n      InDataLeft = InputLen;\r\n      int ilu;\r\n\r\n      if (UpShift >= 0) {\r\n        const int bu = b >> UpShift;\r\n        memcpy(&CurInput[Offs >> UpShift], ip, (size_t)bu * sizeof(CurInput[0]));\r\n\r\n        ip += bu;\r\n        ilu = InputLen >> UpShift;\r\n      } else {\r\n        copyUpsample(ip, &CurInput[Offs], b);\r\n        ilu = InputLen;\r\n      }\r\n\r\n      const size_t pil = (size_t)PrevInputLen * sizeof(CurInput[0]);\r\n      memcpy(&CurInput[ilu], PrevInput, pil);\r\n      memcpy(PrevInput, &CurInput[ilu - PrevInputLen], pil);\r\n\r\n      (*fftin)->forward(CurInput);\r\n\r\n      if (UpShift > 0) {\r\n#if R8B_FLOATFFT\r\n        mirrorInputSpectrum((float *)CurInput);\r\n#else  // R8B_FLOATFFT\r\n        mirrorInputSpectrum(CurInput);\r\n#endif // R8B_FLOATFFT\r\n      }\r\n\r\n      if (Filter->isZeroPhase()) {\r\n        (*fftout)->multiplyBlocksZP(Filter->getKernelBlock(), CurInput);\r\n      } else {\r\n        (*fftout)->multiplyBlocks(Filter->getKernelBlock(), CurInput);\r\n      }\r\n\r\n      if (DownShift > 0) {\r\n        const int z = BlockLen2 >> DownShift;\r\n\r\n#if R8B_FLOATFFT\r\n        float *const kb = (float *)Filter->getKernelBlock();\r\n        float *const p = (float *)CurInput;\r\n#else  // R8B_FLOATFFT\r\n        const double *const kb = Filter->getKernelBlock();\r\n        double *const p = CurInput;\r\n#endif // R8B_FLOATFFT\r\n\r\n        p[1] = kb[z] * p[z] - kb[z + 1] * p[z + 1];\r\n      }\r\n\r\n      (*fftout)->inverse(CurInput);\r\n\r\n      copyToOutput(Offs - OutOffset, op, b, l0);\r\n\r\n      double *const tmp = CurInput;\r\n      CurInput = CurOutput;\r\n      CurOutput = tmp;\r\n    }\r\n\r\n    return (l0);\r\n  }\r\n\r\n private:\r\n  CDSPFIRFilter *Filter;               ///< Filter in use.\r\n  CPtrKeeper<CDSPRealFFTKeeper> fftin; ///< FFT object 1, used to produce\r\n  ///< the input spectrum (can embed the \"power of 2\" upsampling).\r\n  CPtrKeeper<CDSPRealFFTKeeper> ffto2; ///< FFT object 2 (can be\r\n                                       ///< `nullptr`).\r\n  CDSPRealFFTKeeper *fftout;           ///< FFT object used to produce the output\r\n  ///< signal (can embed the \"power of 2\" downsampling), may point to\r\n  ///< either `fftin` or `ffto2`.\r\n  int UpFactor;       ///< Upsampling factor.\r\n  int DownFactor;     ///< Downsampling factor.\r\n  int BlockLen2;      ///< Equals `block length * 2`.\r\n  int OutOffset;      ///< Output offset, depends on filter's introduced latency.\r\n  int PrevInputLen;   ///< The length of previous input data saved, used for\r\n                      ///< overlap.\r\n  int InputLen;       ///< The number of input samples that should be accumulated\r\n                      ///< before the input block is processed.\r\n  double LatencyFrac; ///< Fractional latency, in samples, that is left in\r\n                      ///< the output signal.\r\n  int Latency;        ///< Processing latency, in samples.\r\n  int UpShift;        ///< \"Power of 2\" upsampling shift. Equals -1 if `UpFactor`\r\n                      ///< is not a \"power of 2\" value. Equals 0 if `UpFactor` equals 1.\r\n  int DownShift;      ///< \"Power of 2\" downsampling shift. Equals -1 if\r\n                      ///< `DownFactor` is not a \"power of 2\". Equals 0 if `DownFactor`\r\n                      ///< equals 1.\r\n  int InputDelay;     ///< Additional input delay, in samples. Used to make the\r\n                      ///< output delay divisible by `DownShift`. Used only if `UpShift` is\r\n                      ///< non-positive and `DownShift` is greater than 0.\r\n  double *PrevInput;  ///< Previous input data buffer, capacity = `BlockLen`.\r\n  double *CurInput;   ///< Input data buffer, capacity = `BlockLen2`.\r\n  double *CurOutput;  ///< Output data buffer, capacity = `BlockLen2`.\r\n  int InDataLeft;     ///< Samples left before processing input and output FFT\r\n                      ///< blocks. Initialized to `InputLen` on clear.\r\n  int LatencyLeft;    ///< Latency in samples left to skip.\r\n  int UpSkip;         ///< The current upsampling sample skip (value in the range\r\n                      ///< 0 to `UpFactor - 1`).\r\n  int DownSkip;       ///< The current downsampling sample skip (value in the\r\n                      ///< range 0 to `DownFactor - 1`). Not used if `DownShift` is\r\n                      ///< positive.\r\n  int DownSkipInit;   ///< The initial `DownSkip` value after clear().\r\n  CFixedBuffer<double> WorkBlocks; ///< Previous input data, input and\r\n                                   ///< output data blocks, overall capacity = `BlockLen2 * 2 +\r\n                                   ///< PrevInputLen`. Used in the flip-flop manner.\r\n  bool DoConsumeLatency;           ///< `true` if the output latency should be\r\n  ///< consumed. Does not apply to the fractional part of the latency\r\n  ///< (if such part is available).\r\n\r\n  /**\r\n\t * @brief Copies samples from the input buffer to the output buffer\r\n\t * while inserting zeros inbetween them to perform the whole-numbered\r\n\t * upsampling.\r\n\t *\r\n\t * @param[in,out] ip0 Input buffer. Will be advanced on function's return.\r\n\t * @param[out] op Output buffer.\r\n\t * @param l0 The number of samples to fill in the output buffer, including\r\n\t * both input samples and interpolation (zero) samples.\r\n\t */\r\n\r\n  void copyUpsample(double *&ip0, double *op, int l0) {\r\n    int b = min(UpSkip, l0);\r\n\r\n    if (b != 0) {\r\n      UpSkip -= b;\r\n      l0 -= b;\r\n\r\n      *op = 0.0;\r\n      op++;\r\n\r\n      while (--b != 0) {\r\n        *op = 0.0;\r\n        op++;\r\n      }\r\n    }\r\n\r\n    double *ip = ip0;\r\n    const int upf = UpFactor;\r\n    int l = l0 / upf;\r\n    int lz = l0 - l * upf;\r\n\r\n    if (upf == 3) {\r\n      while (l != 0) {\r\n        op[0] = *ip;\r\n        op[1] = 0.0;\r\n        op[2] = 0.0;\r\n        ip++;\r\n        op += upf;\r\n        l--;\r\n      }\r\n    } else if (upf == 5) {\r\n      while (l != 0) {\r\n        op[0] = *ip;\r\n        op[1] = 0.0;\r\n        op[2] = 0.0;\r\n        op[3] = 0.0;\r\n        op[4] = 0.0;\r\n        ip++;\r\n        op += upf;\r\n        l--;\r\n      }\r\n    } else {\r\n      const size_t zc = (size_t)(upf - 1) * sizeof(op[0]);\r\n\r\n      while (l != 0) {\r\n        *op = *ip;\r\n        ip++;\r\n\r\n        memset(op + 1, 0, zc);\r\n        op += upf;\r\n        l--;\r\n      }\r\n    }\r\n\r\n    if (lz != 0) {\r\n      *op = *ip;\r\n      ip++;\r\n      op++;\r\n\r\n      UpSkip = upf - lz;\r\n\r\n      while (--lz != 0) {\r\n        *op = 0.0;\r\n        op++;\r\n      }\r\n    }\r\n\r\n    ip0 = ip;\r\n  }\r\n\r\n  /**\r\n\t * @brief Copies sample data from the CurOutput buffer to the specified\r\n\t * output buffer and advances its position.\r\n\t *\r\n\t * If necessary, this function \"consumes\" latency and performs\r\n\t * downsampling.\r\n\t *\r\n\t * @param Offs CurOutput buffer offset, can be negative.\r\n\t * @param[out] op0 Output buffer pointer, will be advanced.\r\n\t * @param b The number of output samples available, including those which\r\n\t * are discarded during whole-number downsampling.\r\n\t * @param l0 The overall output sample count, will be increased.\r\n\t */\r\n\r\n  void copyToOutput(int Offs, double *&op0, int b, int &l0) {\r\n    if (Offs < 0) {\r\n      if (Offs + b <= 0) {\r\n        Offs += BlockLen2;\r\n      } else {\r\n        copyToOutput(Offs + BlockLen2, op0, -Offs, l0);\r\n        b += Offs;\r\n        Offs = 0;\r\n      }\r\n    }\r\n\r\n    if (LatencyLeft != 0) {\r\n      if (LatencyLeft >= b) {\r\n        LatencyLeft -= b;\r\n        return;\r\n      }\r\n\r\n      Offs += LatencyLeft;\r\n      b -= LatencyLeft;\r\n      LatencyLeft = 0;\r\n    }\r\n\r\n    const int df = DownFactor;\r\n\r\n    if (DownShift > 0) {\r\n      int Skip = Offs & (df - 1);\r\n\r\n      if (Skip > 0) {\r\n        Skip = df - Skip;\r\n        b -= Skip;\r\n        Offs += Skip;\r\n      }\r\n\r\n      if (b > 0) {\r\n        b = (b + df - 1) >> DownShift;\r\n        memcpy(op0, &CurOutput[Offs >> DownShift], (size_t)b * sizeof(op0[0]));\r\n\r\n        op0 += b;\r\n        l0 += b;\r\n      }\r\n    } else {\r\n      if (df > 1) {\r\n        const double *ip = &CurOutput[Offs + DownSkip];\r\n        int l = (b + df - 1 - DownSkip) / df;\r\n        DownSkip += l * df - b;\r\n\r\n        double *op = op0;\r\n        l0 += l;\r\n        op0 += l;\r\n\r\n        while (l > 0) {\r\n          *op = *ip;\r\n          ip += df;\r\n          op++;\r\n          l--;\r\n        }\r\n      } else {\r\n        memcpy(op0, &CurOutput[Offs], (size_t)b * sizeof(op0[0]));\r\n\r\n        op0 += b;\r\n        l0 += b;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n\t * @brief Performs input spectrum mirroring which is used to perform a\r\n\t * fast \"power of 2\" upsampling.\r\n\t *\r\n\t * Such mirroring is equivalent to insertion of zeros into the input\r\n\t * signal.\r\n\t *\r\n\t * @param p Spectrum data block to mirror.\r\n\t * @tparam T Buffer's element type.\r\n\t */\r\n\r\n  template <typename T>\r\n  void mirrorInputSpectrum(T *const p) {\r\n    const int bl1 = BlockLen2 >> UpShift;\r\n    const int bl2 = bl1 + bl1;\r\n    int i;\r\n\r\n    for (i = bl1 + 2; i < bl2; i += 2) {\r\n      p[i] = p[bl2 - i];\r\n      p[i + 1] = -p[bl2 - i + 1];\r\n    }\r\n\r\n    p[bl1] = p[1];\r\n    p[bl1 + 1] = (T)0;\r\n    p[1] = p[0];\r\n\r\n    for (i = 1; i < UpShift; i++) {\r\n      const int z = bl1 << i;\r\n      memcpy(&p[z], p, (size_t)z * sizeof(p[0]));\r\n      p[z + 1] = (T)0;\r\n    }\r\n  }\r\n};\r\n\r\n} // namespace r8b\r\n\r\n#endif // R8B_CDSPBLOCKCONVOLVER_INCLUDED\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/CDSPFIRFilter.h",
    "content": "//$ nobt\r\n//$ nocpp\r\n\r\n/**\r\n * @file CDSPFIRFilter.h\r\n *\r\n * @brief FIR filter generator and filter cache classes.\r\n *\r\n * This file includes low-pass FIR filter generator and filter cache.\r\n *\r\n * r8brain-free-src Copyright (c) 2013-2025 Aleksey Vaneev\r\n *\r\n * See the \"LICENSE\" file for license.\r\n */\r\n\r\n#ifndef R8B_CDSPFIRFILTER_INCLUDED\r\n#define R8B_CDSPFIRFILTER_INCLUDED\r\n\r\n#include \"CDSPRealFFT.h\"\r\n#include \"CDSPSincFilterGen.h\"\r\n\r\nnamespace r8b {\r\n\r\n/**\r\n * @brief Enumeration of filter's phase responses.\r\n */\r\n\r\nenum EDSPFilterPhaseResponse {\r\n  fprLinearPhase = 0, ///< Linear-phase response. Features a linear-phase,\r\n                      ///< high-latency response, with the latency expressed as an integer\r\n                      ///< value.\r\n  fprMinPhase         ///< Minimum-phase response. Features a minimal-latency\r\n  ///< response, but the response's phase is non-linear. The latency is\r\n  ///< usually expressed as a non-integer value, and is usually small,\r\n  ///< but is never equal to zero. The minimum-phase filter is obtained\r\n  ///< from a linear-phase filter. Note that since in the context of\r\n  ///< r8brain-free-src other filters (interpolation, half-band) remain\r\n  ///< linear-phase, the resulting phase will be \"intermediate\". The\r\n  ///< minimum-phase transformation has precision limits: this may skew\r\n  ///< both the -3 dB point and attenuation of the filter being\r\n  ///< transformed: as it was measured, the skew happens purely at\r\n  ///< random, and in most cases is within tolerable range. In a small\r\n  ///< (1%) random subset of cases the skew is bigger and cannot be\r\n  ///< predicted. Minimum-phase transform requires 64-bit floating-point\r\n  ///< FFT; results with 32-bit float FFT are far from optimal.\r\n};\r\n\r\n/**\r\n * @brief Calculation and storage class for FIR filters.\r\n *\r\n * Class that implements calculation and storing of a FIR filter (currently\r\n * contains low-pass filter calculation routine designed for sample rate\r\n * conversion). Objects of this class cannot be created directly, but can be\r\n * obtained via the CDSPFilterCache::getLPFilter() static function.\r\n */\r\n\r\nclass CDSPFIRFilter : public R8B_BASECLASS {\r\n  R8BNOCTOR(CDSPFIRFilter)\r\n\r\n  friend class CDSPFIRFilterCache;\r\n\r\n public:\r\n  ~CDSPFIRFilter() {\r\n    R8BASSERT(RefCount == 0);\r\n\r\n    delete Next;\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the minimal allowed low-pass filter's transition band,\r\n\t * in percent.\r\n\t */\r\n\r\n  static double getLPMinTransBand() {\r\n    return (0.5);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the maximal allowed low-pass filter's transition band,\r\n\t * in percent.\r\n\t */\r\n\r\n  static double getLPMaxTransBand() {\r\n    return (45.0);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the minimal allowed low-pass filter's stop-band\r\n\t * attenuation, in decibel.\r\n\t */\r\n\r\n  static double getLPMinAtten() {\r\n    return (49.0);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the maximal allowed low-pass filter's stop-band\r\n\t * attenuation, in decibel.\r\n\t */\r\n\r\n  static double getLPMaxAtten() {\r\n    return (218.0);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns `true` if kernel block of *this* filter has zero-phase\r\n\t * response.\r\n\t */\r\n\r\n  bool isZeroPhase() const {\r\n    return (IsZeroPhase);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns filter's latency, in samples (integer part).\r\n\t */\r\n\r\n  int getLatency() const {\r\n    return (Latency);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns filter's latency, in samples (fractional part). Always\r\n\t * zero for linear-phase filters.\r\n\t */\r\n\r\n  double getLatencyFrac() const {\r\n    return (LatencyFrac);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns filter kernel length, in samples. Not to be confused\r\n\t * with the block length.\r\n\t */\r\n\r\n  int getKernelLen() const {\r\n    return (KernelLen);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns filter's block length, expressed as Nth power of 2.\r\n\t * The actual length is twice as large due to zero-padding.\r\n\t */\r\n\r\n  int getBlockLenBits() const {\r\n    return (BlockLenBits);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns pointer to filter's kernel block, in complex-numbered\r\n\t * form obtained via the CDSPRealFFT::forward() function call.\r\n\t *\r\n\t * Zero-padded, gain-adjusted with the CDSPRealFFT::getInvMulConst()\r\n\t * multiplied by `ReqGain` constant, immediately suitable for convolution.\r\n\t * Kernel block may have \"zero-phase\" response, depending on the\r\n\t * isZeroPhase() function's result.\r\n\t */\r\n\r\n  const double *getKernelBlock() const {\r\n    return (KernelBlock);\r\n  }\r\n\r\n  /**\r\n\t * @brief Reduces reference count to *this* object.\r\n\t *\r\n\t * This function should be called when the filter obtained via the filter\r\n\t * cache is no longer needed.\r\n\t */\r\n\r\n  void unref();\r\n\r\n private:\r\n  double ReqNormFreq;               ///< Required normalized frequency, 0 to 1 inclusive.\r\n  double ReqTransBand;              ///< Required transition band in percent, as passed\r\n                                    ///< by the user.\r\n  double ReqAtten;                  ///< Required stop-band attenuation in decibel, as passed\r\n                                    ///< by the user (positive value).\r\n  EDSPFilterPhaseResponse ReqPhase; ///< Required filter's phase response.\r\n  double ReqGain;                   ///< Required overall filter's gain.\r\n  CDSPFIRFilter *Next;              ///< Next FIR filter in cache's list.\r\n  int RefCount;                     ///< The number of references made to *this* FIR filter.\r\n  bool IsZeroPhase;                 ///< `true` if kernel block of *this* filter has\r\n                                    ///< zero-phase response.\r\n  int Latency;                      ///< Filter's latency in samples (integer part).\r\n  double LatencyFrac;               ///< Filter's latency in samples (fractional part).\r\n  int KernelLen;                    ///< Filter kernel length, in samples.\r\n  int BlockLenBits;                 ///< Block length used to store *this* FIR filter,\r\n  ///< expressed as Nth power of 2. This value is used directly by the\r\n  ///< convolver.\r\n  CFixedBuffer<double> KernelBlock; ///< FIR filter buffer, capacity\r\n  ///< equals to `1 << ( BlockLenBits + 1 )`. Second half of the buffer\r\n  ///< contains zero-padding to allow alias-free convolution.\r\n  ///< Address-aligned.\r\n\r\n  CDSPFIRFilter() : RefCount(1) {}\r\n\r\n  /**\r\n\t * @brief Builds filter kernel based on the \"Req\" parameters.\r\n\t *\r\n\t * @param ExtAttenCorrs External attentuation correction table, for\r\n\t * internal use.\r\n\t */\r\n\r\n  void buildLPFilter(const double *const ExtAttenCorrs) {\r\n    const double tb = ReqTransBand * 0.01;\r\n    double pwr;\r\n    double fo1;\r\n    double hl;\r\n    double atten = -ReqAtten;\r\n\r\n    if (tb >= 0.25) {\r\n      if (ReqAtten >= 117.0) {\r\n        atten -= 1.60;\r\n      } else if (ReqAtten >= 60.0) {\r\n        atten -= 1.91;\r\n      } else {\r\n        atten -= 2.25;\r\n      }\r\n    } else if (tb >= 0.10) {\r\n      if (ReqAtten >= 117.0) {\r\n        atten -= 0.69;\r\n      } else if (ReqAtten >= 60.0) {\r\n        atten -= 0.73;\r\n      } else {\r\n        atten -= 1.13;\r\n      }\r\n    } else {\r\n      if (ReqAtten >= 117.0) {\r\n        atten -= 0.21;\r\n      } else if (ReqAtten >= 60.0) {\r\n        atten -= 0.25;\r\n      } else {\r\n        atten -= 0.36;\r\n      }\r\n    }\r\n\r\n    static const int AttenCorrCount = 264;\r\n    static const double AttenCorrMin = 49.0;\r\n    static const double AttenCorrDiff = 176.25;\r\n    int AttenCorr = (int)floor((-atten - AttenCorrMin) * AttenCorrCount / AttenCorrDiff + 0.5);\r\n\r\n    AttenCorr = min(AttenCorrCount, max(0, AttenCorr));\r\n\r\n    if (ExtAttenCorrs != R8B_NULL) {\r\n      atten -= ExtAttenCorrs[AttenCorr];\r\n    } else if (tb >= 0.25) {\r\n      static const double AttenCorrScale = 101.0;\r\n      static const signed char AttenCorrs[] = {\r\n          -127, -127, -125, -125, -122, -119, -115, -110, -104, -97, -91, -82, -75, -24, -16,\r\n          -6,   4,    14,   24,   29,   30,   32,   37,   44,   51,  57,  63,  67,  65,  50,\r\n          53,   56,   58,   60,   63,   64,   66,   68,   74,   77,  78,  78,  78,  79,  79,\r\n          60,   60,   60,   61,   59,   52,   47,   41,   36,   30,  24,  17,  9,   0,   -8,\r\n          -10,  -11,  -14,  -13,  -18,  -25,  -31,  -38,  -44,  -50, -57, -63, -68, -74, -81,\r\n          -89,  -96,  -101, -104, -107, -109, -110, -86,  -84,  -85, -82, -80, -77, -73, -67,\r\n          -62,  -55,  -48,  -42,  -35,  -30,  -20,  -11,  -2,   5,   6,   6,   7,   11,  16,\r\n          21,   26,   34,   41,   46,   49,   52,   55,   56,   48,  49,  51,  51,  52,  52,\r\n          52,   52,   52,   51,   51,   50,   47,   47,   50,   48,  46,  42,  38,  35,  31,\r\n          27,   24,   20,   16,   12,   11,   12,   10,   8,    4,   -1,  -6,  -11, -16, -19,\r\n          -17,  -21,  -24,  -27,  -32,  -34,  -37,  -38,  -40,  -41, -40, -40, -42, -41, -44,\r\n          -45,  -43,  -41,  -34,  -31,  -28,  -24,  -21,  -18,  -14, -10, -5,  -1,  2,   5,\r\n          8,    7,    4,    3,    2,    2,    4,    6,    8,    9,   9,   10,  10,  10,  10,\r\n          9,    8,    9,    11,   14,   13,   12,   11,   10,   8,   7,   6,   5,   3,   2,\r\n          2,    -1,   -1,   -3,   -3,   -4,   -4,   -5,   -4,   -6,  -7,  -9,  -5,  -1,  -1,\r\n          0,    1,    0,    -2,   -3,   -4,   -5,   -5,   -8,   -13, -13, -13, -12, -13, -12,\r\n          -11,  -11,  -9,   -8,   -7,   -5,   -3,   -1,   2,    4,   6,   9,   10,  11,  14,\r\n          18,   21,   24,   27,   30,   34,   37,   37,   39,   40};\r\n\r\n      atten -= AttenCorrs[AttenCorr] / AttenCorrScale;\r\n    } else if (tb >= 0.10) {\r\n      static const double AttenCorrScale = 210.0;\r\n      static const signed char AttenCorrs[] = {\r\n          -113, -118, -122, -125, -126, -97, -95, -92, -92, -89, -82, -75, -69, -48, -42, -36, -30,\r\n          -22,  -14,  -5,   -2,   1,    6,   13,  22,  28,  35,  41,  48,  55,  56,  56,  61,  65,\r\n          71,   77,   81,   83,   85,   85,  74,  74,  73,  72,  71,  70,  68,  64,  59,  56,  49,\r\n          52,   46,   42,   36,   32,   26,  20,  13,  7,   -2,  -6,  -10, -15, -20, -27, -33, -38,\r\n          -44,  -43,  -48,  -53,  -57,  -63, -69, -73, -75, -79, -81, -74, -76, -77, -77, -78, -81,\r\n          -80,  -80,  -78,  -76,  -65,  -62, -59, -56, -51, -48, -44, -38, -33, -25, -19, -13, -5,\r\n          -1,   2,    7,    13,   17,   21,  25,  30,  35,  40,  45,  50,  53,  56,  57,  55,  58,\r\n          59,   62,   64,   67,   67,   68,  68,  62,  61,  61,  59,  59,  57,  57,  55,  52,  48,\r\n          42,   38,   35,   31,   26,   20,  15,  13,  10,  7,   3,   -2,  -8,  -13, -17, -23, -28,\r\n          -34,  -37,  -40,  -41,  -45,  -48, -50, -53, -57, -59, -62, -63, -63, -57, -57, -56, -56,\r\n          -54,  -54,  -53,  -49,  -48,  -41, -38, -33, -31, -26, -23, -18, -12, -9,  -7,  -7,  -3,\r\n          0,    5,    9,    14,   16,   20,  22,  21,  23,  25,  27,  28,  29,  34,  33,  35,  33,\r\n          31,   30,   29,   29,   26,   26,  25,  24,  20,  19,  15,  10,  8,   4,   1,   -2,  -6,\r\n          -10,  -16,  -19,  -23,  -26,  -27, -30, -34, -39, -43, -47, -51, -52, -54, -56, -58, -59,\r\n          -62,  -63,  -66,  -65,  -65,  -64, -59, -57, -54, -52, -48, -44, -42, -37, -32, -22, -17,\r\n          -10,  -3,   5,    13,   22,   30,  40,  50,  60,  72};\r\n\r\n      atten -= AttenCorrs[AttenCorr] / AttenCorrScale;\r\n    } else {\r\n      static const double AttenCorrScale = 196.0;\r\n      static const signed char AttenCorrs[] = {\r\n          -15,  -17,  -20,  -20,  -20,  -21,  -20,  -16,  -17,  -18,  -17,  -13,  -12,  -11,  -9,\r\n          -7,   -5,   -4,   -1,   1,    3,    4,    5,    6,    7,    9,    9,    10,   10,   10,\r\n          11,   11,   11,   12,   12,   12,   10,   11,   10,   10,   8,    10,   11,   10,   11,\r\n          11,   13,   14,   15,   19,   27,   26,   23,   18,   14,   8,    4,    -2,   -6,   -12,\r\n          -17,  -23,  -28,  -33,  -37,  -42,  -46,  -49,  -53,  -57,  -60,  -61,  -64,  -65,  -67,\r\n          -66,  -66,  -66,  -65,  -64,  -61,  -59,  -56,  -52,  -48,  -42,  -38,  -31,  -27,  -19,\r\n          -13,  -7,   -1,   8,    14,   22,   29,   37,   45,   52,   59,   66,   73,   80,   86,\r\n          91,   96,   100,  104,  108,  111,  114,  115,  117,  118,  120,  120,  118,  117,  114,\r\n          113,  111,  107,  103,  99,   95,   89,   84,   78,   72,   66,   60,   52,   44,   37,\r\n          30,   21,   14,   6,    -3,   -11,  -18,  -26,  -34,  -43,  -51,  -58,  -65,  -73,  -78,\r\n          -85,  -90,  -97,  -102, -107, -113, -115, -118, -121, -125, -125, -126, -126, -126, -125,\r\n          -124, -121, -119, -115, -111, -109, -101, -102, -95,  -88,  -81,  -73,  -67,  -63,  -54,\r\n          -47,  -40,  -33,  -26,  -18,  -11,  -5,   2,    8,    14,   19,   25,   31,   36,   37,\r\n          43,   47,   49,   51,   52,   57,   57,   56,   57,   58,   58,   58,   57,   56,   52,\r\n          52,   50,   48,   44,   41,   39,   37,   33,   31,   26,   24,   21,   18,   14,   11,\r\n          8,    4,    2,    -2,   -5,   -7,   -9,   -11,  -13,  -15,  -16,  -18,  -19,  -20,  -23,\r\n          -24,  -24,  -25,  -27,  -26,  -27,  -29,  -30,  -31,  -32,  -35,  -36,  -39,  -40,  -44,\r\n          -46,  -51,  -54,  -59,  -63,  -69,  -76,  -83,  -91,  -98};\r\n\r\n      atten -= AttenCorrs[AttenCorr] / AttenCorrScale;\r\n    }\r\n\r\n    pwr = 7.43932822146293e-8 * sqr(atten) +\r\n        0.000102747434588003 * cos(0.00785021930010397 * atten) *\r\n            cos(0.633854318781239 + 0.103208573657699 * atten) -\r\n        0.00798132247867036 - 0.000903555213543865 * atten -\r\n        0.0969365532127236 * exp(0.0779275237937911 * atten) -\r\n        1.37304948662012e-5 * atten * cos(0.00785021930010397 * atten);\r\n\r\n    if (pwr <= 0.067665322581) {\r\n      if (tb >= 0.25) {\r\n        hl = 2.6778150875894 / tb +\r\n            300.547590563091 * atan(atan(2.68959772209918 * pwr)) /\r\n                (5.5099277187035 * tb - tb * tanh(cos(asinh(atten))));\r\n\r\n        fo1 = 0.987205355829873 * tb +\r\n            1.00011788929851 *\r\n                atan2(\r\n                    -0.321432067051302 - 6.19131357321578 * sqrt(pwr),\r\n                    hl + -1.14861472207245 / (hl - 14.1821147585957) +\r\n                        pow(0.9521145021664,\r\n                            pow(atan2(1.12018764830637, tb),\r\n                                2.10988901686912 * hl - 20.9691278378345)));\r\n      } else if (tb >= 0.10) {\r\n        hl = (1.56688617018066 + 142.064321294568 * pwr +\r\n              0.00419441117131136 * cos(243.633511747297 * pwr) - 0.022953443903576 * atten -\r\n              0.026629568860284 * cos(127.715550622571 * pwr)) /\r\n            tb;\r\n\r\n        fo1 = 0.982299356642411 * tb +\r\n            0.999441744774215 * asinh((-0.361783054039583 - 5.80540593623676 * sqrt(pwr)) / hl);\r\n      } else {\r\n        hl = (2.45739657014937 +\r\n              269.183679500541 * pwr *\r\n                  cos(5.73225668178813 +\r\n                      atan2(\r\n                          cosh(0.988861169868941 - 17.2201556280744 * pwr),\r\n                          1.08340138240431 * pwr))) /\r\n            tb;\r\n\r\n        fo1 = 2.291956939 * tb + 0.01942450693 * sqr(tb) * hl - 4.67538973161837 * pwr * tb -\r\n            1.668433124 * tb * pow(pwr, pwr);\r\n      }\r\n    } else {\r\n      if (tb >= 0.25) {\r\n        hl =\r\n            (1.50258368698213 + 158.556968859477 * asinh(pwr) * tanh(57.9466246871383 * tanh(pwr)) -\r\n             0.0105440479814834 * atten) /\r\n            tb;\r\n\r\n        fo1 = 0.994024401639321 * tb + (-0.236282717577215 - 6.8724924545387 * sqrt(sin(pwr))) / hl;\r\n      } else if (tb >= 0.10) {\r\n        hl = (1.50277377248945 +\r\n              158.222625721046 * asinh(pwr) * tanh(1.02875299001715 + 42.072277322604 * pwr) -\r\n              0.0108380943845632 * atten) /\r\n            tb;\r\n\r\n        fo1 = 0.992539376734551 * tb +\r\n            (-0.251747813037178 - 6.74159892452584 * sqrt(tanh(tanh(tan(pwr))))) / hl;\r\n      } else {\r\n        hl = (1.15990238966306 * pwr - 5.02124037125213 * sqr(pwr) -\r\n              0.158676856669827 * atten *\r\n                  cos(1.1609073390614 * pwr - 6.33932586197475 * pwr * sqr(pwr))) /\r\n            tb;\r\n\r\n        fo1 = 0.867344453126885 * tb + 0.052693817907757 * tb * log(pwr) +\r\n            0.0895511178735932 * tb * atan(59.7538527741309 * pwr) - 0.0745653568081453 * pwr * tb;\r\n      }\r\n    }\r\n\r\n    double WinParams[2];\r\n    WinParams[0] = 125.0;\r\n    WinParams[1] = pwr;\r\n\r\n    CDSPSincFilterGen sinc;\r\n    sinc.Len2 = 0.25 * hl / ReqNormFreq;\r\n    sinc.Freq1 = 0.0;\r\n    sinc.Freq2 = R8B_PI * (1.0 - fo1) * ReqNormFreq;\r\n    sinc.initBand(CDSPSincFilterGen ::wftKaiser, WinParams, true);\r\n\r\n    KernelLen = sinc.KernelLen;\r\n    BlockLenBits = getBitOccupancy(KernelLen - 1) + R8B_EXTFFT;\r\n    const int BlockLen = 1 << BlockLenBits;\r\n\r\n    KernelBlock.alloc(BlockLen * 2);\r\n    sinc.generateBand(&KernelBlock[0], &CDSPSincFilterGen ::calcWindowKaiser);\r\n\r\n    if (ReqPhase == fprLinearPhase) {\r\n      IsZeroPhase = true;\r\n      Latency = sinc.fl2;\r\n      LatencyFrac = 0.0;\r\n    } else {\r\n      IsZeroPhase = false;\r\n      double DCGroupDelay;\r\n\r\n      calcMinPhaseTransform(&KernelBlock[0], KernelLen, 16, false, &DCGroupDelay);\r\n\r\n      Latency = (int)DCGroupDelay;\r\n      LatencyFrac = DCGroupDelay - Latency;\r\n    }\r\n\r\n    CDSPRealFFTKeeper ffto(BlockLenBits + 1);\r\n\r\n    if (IsZeroPhase) {\r\n      // Calculate DC gain.\r\n\r\n      double s = 0.0;\r\n      int i;\r\n\r\n      for (i = 0; i < KernelLen; i++) {\r\n        s += KernelBlock[i];\r\n      }\r\n\r\n      s = ffto->getInvMulConst() * ReqGain / s;\r\n\r\n      // Time-shift the filter so that zero-phase response is produced.\r\n      // Simultaneously multiply by \"s\".\r\n\r\n      for (i = 0; i <= sinc.fl2; i++) {\r\n        KernelBlock[i] = KernelBlock[sinc.fl2 + i] * s;\r\n      }\r\n\r\n      for (i = 1; i <= sinc.fl2; i++) {\r\n        KernelBlock[BlockLen * 2 - i] = KernelBlock[i];\r\n      }\r\n\r\n      memset(\r\n          &KernelBlock[sinc.fl2 + 1],\r\n          0,\r\n          (size_t)(BlockLen * 2 - KernelLen) * sizeof(KernelBlock[0]));\r\n\r\n      ffto->forward(KernelBlock);\r\n      ffto->convertToZP(KernelBlock);\r\n    } else {\r\n      normalizeFIRFilter(&KernelBlock[0], KernelLen, ffto->getInvMulConst() * ReqGain);\r\n\r\n      memset(\r\n          &KernelBlock[KernelLen], 0, (size_t)(BlockLen * 2 - KernelLen) * sizeof(KernelBlock[0]));\r\n\r\n      ffto->forward(KernelBlock);\r\n    }\r\n\r\n    R8BCONSOLE(\r\n        \"CDSPFIRFilter: flt_len=%i latency=%i nfreq=%.4f \"\r\n        \"tb=%.1f att=%.1f gain=%.3f\\n\",\r\n        KernelLen,\r\n        Latency,\r\n        ReqNormFreq,\r\n        ReqTransBand,\r\n        ReqAtten,\r\n        ReqGain);\r\n  }\r\n};\r\n\r\n/**\r\n * @brief FIR filter cache class.\r\n *\r\n * Class that implements cache for calculated FIR filters. The required FIR\r\n * filter should be obtained via the getLPFilter() static function.\r\n */\r\n\r\nclass CDSPFIRFilterCache : public R8B_BASECLASS {\r\n  R8BNOCTOR(CDSPFIRFilterCache)\r\n\r\n  friend class CDSPFIRFilter;\r\n\r\n public:\r\n  /**\r\n\t * @brief Returns the number of filters present in the cache now. This\r\n\t * value can be monitored for debugging \"forgotten\" filters.\r\n\t */\r\n\r\n  static int getObjCount() {\r\n    R8BSYNC(getStateSync());\r\n\r\n    return (getObjCountStatic());\r\n  }\r\n\r\n  /**\r\n\t * @brief Calculates or returns reference to a previously calculated\r\n\t * (cached) low-pass FIR filter.\r\n\t *\r\n\t * Note that the real transition band and attenuation achieved by the\r\n\t * filter varies with the magnitude of the required attenuation, and are\r\n\t * never 100% exact.\r\n\t *\r\n\t * @param ReqNormFreq Required normalized frequency, in the range 0 to 1,\r\n\t * inclusive. This is the point after which the stop-band spans.\r\n\t * @param ReqTransBand Required transition band, in percent of the\r\n\t * 0 to `ReqNormFreq` spectral bandwidth, in the range\r\n\t * CDSPFIRFilter::getLPMinTransBand() to\r\n\t * CDSPFIRFilter::getLPMaxTransBand(), inclusive. The transition band\r\n\t * specifies the part of the spectrum between the -3 dB and `ReqNormFreq`\r\n\t * points. The real resulting -3 dB point varies in the range from -3.00\r\n\t * to -3.05 dB, but is generally very close to -3 dB.\r\n\t * @param ReqAtten Required stop-band attenuation in decibel, in the range\r\n\t * CDSPFIRFilter::getLPMinAtten() to CDSPFIRFilter::getLPMaxAtten(),\r\n\t * inclusive. Note that the actual stop-band attenuation of the resulting\r\n\t * filter may be 0.40-4.46 dB higher.\r\n\t * @param ReqPhase Required filter's phase response.\r\n\t * @param ReqGain Required overall filter's gain (1.0 for unity gain).\r\n\t * @param AttenCorrs Attentuation correction table, to pass to the filter\r\n\t * generation function. For internal use.\r\n\t * @see EDSPFilterPhaseResponse\r\n\t * @return A reference to a new or a previously calculated low-pass FIR\r\n\t * filter object with the required characteristics. A reference count is\r\n\t * incremented in the returned filter object which should be released\r\n\t * after use via the CDSPFIRFilter::unref() function.\r\n\t */\r\n\r\n  static CDSPFIRFilter &getLPFilter(\r\n      const double ReqNormFreq,\r\n      const double ReqTransBand,\r\n      const double ReqAtten,\r\n      const EDSPFilterPhaseResponse ReqPhase,\r\n      const double ReqGain,\r\n      const double *const AttenCorrs = R8B_NULL) {\r\n    R8BASSERT(ReqNormFreq > 0.0 && ReqNormFreq <= 1.0);\r\n    R8BASSERT(ReqTransBand >= CDSPFIRFilter ::getLPMinTransBand());\r\n    R8BASSERT(ReqTransBand <= CDSPFIRFilter ::getLPMaxTransBand());\r\n    R8BASSERT(ReqAtten >= CDSPFIRFilter ::getLPMinAtten());\r\n    R8BASSERT(ReqAtten <= CDSPFIRFilter ::getLPMaxAtten());\r\n    R8BASSERT(ReqGain > 0.0);\r\n\r\n    R8B_EXITDTOR static CPtrKeeper<CDSPFIRFilter> Objects; // The chain\r\n                                                           // of cached objects.\r\n\r\n    R8BSYNC(getStateSync());\r\n\r\n    int &ObjCount = getObjCountStatic();\r\n    CDSPFIRFilter *PrevObj = R8B_NULL;\r\n    CDSPFIRFilter *CurObj = Objects;\r\n\r\n    while (CurObj != R8B_NULL) {\r\n      if (CurObj->ReqNormFreq == ReqNormFreq && CurObj->ReqTransBand == ReqTransBand &&\r\n          CurObj->ReqGain == ReqGain && CurObj->ReqAtten == ReqAtten &&\r\n          CurObj->ReqPhase == ReqPhase) {\r\n        break;\r\n      }\r\n\r\n      if (CurObj->Next == R8B_NULL && ObjCount >= R8B_FILTER_CACHE_MAX) {\r\n        if (CurObj->RefCount == 0) {\r\n          // Delete the last filter which is not used.\r\n\r\n          PrevObj->Next = R8B_NULL;\r\n          delete CurObj;\r\n          ObjCount--;\r\n        } else {\r\n          // Move the last filter to the top of the list since it\r\n          // seems to be in use for a long time.\r\n\r\n          PrevObj->Next = R8B_NULL;\r\n          CurObj->Next = Objects.unkeep();\r\n          Objects = CurObj;\r\n        }\r\n\r\n        CurObj = R8B_NULL;\r\n        break;\r\n      }\r\n\r\n      PrevObj = CurObj;\r\n      CurObj = CurObj->Next;\r\n    }\r\n\r\n    if (CurObj != R8B_NULL) {\r\n      CurObj->RefCount++;\r\n\r\n      if (PrevObj == R8B_NULL) {\r\n        return (*CurObj);\r\n      }\r\n\r\n      // Remove the filter from the list temporarily.\r\n\r\n      PrevObj->Next = CurObj->Next;\r\n    } else {\r\n      // Create a new filter object (with RefCount == 1) and build the\r\n      // filter kernel.\r\n\r\n      CurObj = new CDSPFIRFilter();\r\n      CurObj->ReqNormFreq = ReqNormFreq;\r\n      CurObj->ReqTransBand = ReqTransBand;\r\n      CurObj->ReqAtten = ReqAtten;\r\n      CurObj->ReqPhase = ReqPhase;\r\n      CurObj->ReqGain = ReqGain;\r\n      ObjCount++;\r\n\r\n      CurObj->buildLPFilter(AttenCorrs);\r\n    }\r\n\r\n    // Insert the filter at the start of the list.\r\n\r\n    CurObj->Next = Objects.unkeep();\r\n    Objects = CurObj;\r\n\r\n    return (*CurObj);\r\n  }\r\n\r\n protected:\r\n  /**\r\n\t * @brief Returns reference to filter cache sync object.\r\n\t */\r\n\r\n  static CSyncObject &getStateSync() {\r\n    R8B_EXITDTOR static CSyncObject StateSync;\r\n\r\n    return (StateSync);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns reference to variable containing cache object count.\r\n\t */\r\n\r\n  static int &getObjCountStatic() {\r\n    R8B_EXITDTOR static int ObjCount = 0; // The number of objects\r\n                                          // currently preset in the cache.\r\n\r\n    return (ObjCount);\r\n  }\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// CDSPFIRFilter PUBLIC\r\n// ---------------------------------------------------------------------------\r\n\r\ninline void CDSPFIRFilter ::unref() {\r\n  R8BSYNC(CDSPFIRFilterCache ::getStateSync());\r\n\r\n  RefCount--;\r\n}\r\n\r\n// ---------------------------------------------------------------------------\r\n\r\n} // namespace r8b\r\n\r\n#endif // R8B_CDSPFIRFILTER_INCLUDED\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/CDSPFracInterpolator.h",
    "content": "//$ nobt\r\n//$ nocpp\r\n\r\n/**\r\n * @file CDSPFracInterpolator.h\r\n *\r\n * @brief Fractional delay interpolator and filter bank classes.\r\n *\r\n * This file includes fractional delay interpolator class.\r\n *\r\n * r8brain-free-src Copyright (c) 2013-2025 Aleksey Vaneev\r\n *\r\n * See the \"LICENSE\" file for license.\r\n */\r\n\r\n#ifndef R8B_CDSPFRACINTERPOLATOR_INCLUDED\r\n#define R8B_CDSPFRACINTERPOLATOR_INCLUDED\r\n\r\n#include \"CDSPProcessor.h\"\r\n#include \"CDSPSincFilterGen.h\"\r\n\r\nnamespace r8b {\r\n\r\n#if R8B_FLTTEST\r\nextern int InterpFilterFracs; ///< Force this number of fractional filter\r\n///< positions. -1 - use default.\r\n#endif // R8B_FLTTEST\r\n\r\n/**\r\n * @brief Sinc function-based fractional delay filter bank class.\r\n *\r\n * Class implements storage and initialization of a bank of sinc-based\r\n * fractional delay filters, expressed as 0th, 1st, 2nd or 3rd order\r\n * polynomial interpolation coefficients. The filters are windowed by the\r\n * \"Kaiser\" power-raised window function.\r\n */\r\n\r\nclass CDSPFracDelayFilterBank : public R8B_BASECLASS {\r\n  R8BNOCTOR(CDSPFracDelayFilterBank)\r\n\r\n  friend class CDSPFracDelayFilterBankCache;\r\n\r\n public:\r\n  /**\r\n\t * @brief Initializes the filter bank object.\r\n\t *\r\n\t * @param aFilterFracs The number of fractional delay positions to sample,\r\n\t * -1 - use default.\r\n\t * @param aElementSize The size of each filter's tap, in \"double\" values.\r\n\t * This parameter corresponds to the complexity of interpolation. 4 should\r\n\t * be set for 3rd order, 3 for 2nd order, 2 for linear interpolation, 1\r\n\t * for whole-numbered stepping.\r\n\t * @param aInterpPoints The number of points the interpolation is based\r\n\t * on. This value should not be confused with the `ElementSize`. Set to 2\r\n\t * for linear or no interpolation.\r\n\t * @param aReqAtten Required filter attentuation.\r\n\t * @param aIsThird `true` if one-third filter is required.\r\n\t */\r\n\r\n  CDSPFracDelayFilterBank(\r\n      const int aFilterFracs,\r\n      const int aElementSize,\r\n      const int aInterpPoints,\r\n      const double aReqAtten,\r\n      const bool aIsThird)\r\n      : InitFilterFracs(aFilterFracs),\r\n        ElementSize(aElementSize),\r\n        InterpPoints(aInterpPoints),\r\n        ReqAtten(aReqAtten),\r\n        IsThird(aIsThird),\r\n        Next(R8B_NULL),\r\n        RefCount(1) {\r\n    R8BASSERT(ElementSize >= 1 && ElementSize <= 4);\r\n\r\n    // Kaiser window function Params, for half and third-band.\r\n\r\n    const double *const Params = getWinParams(ReqAtten, IsThird, FilterLen);\r\n\r\n    FilterSize = FilterLen * ElementSize;\r\n\r\n    if (InitFilterFracs == -1) {\r\n      FilterFracs = (int)ceil(pow(6.4, ReqAtten / 50.0));\r\n\r\n#if R8B_FLTTEST\r\n\r\n      if (InterpFilterFracs != -1) {\r\n        FilterFracs = InterpFilterFracs;\r\n      }\r\n\r\n#endif // R8B_FLTTEST\r\n    } else {\r\n      FilterFracs = InitFilterFracs;\r\n    }\r\n\r\n    Table.alloc(FilterSize * (FilterFracs + InterpPoints));\r\n\r\n    CDSPSincFilterGen sinc;\r\n    sinc.Len2 = FilterLen / 2;\r\n\r\n    double *p = Table;\r\n    const int pc2 = InterpPoints / 2;\r\n    int i;\r\n\r\n    for (i = -pc2 + 1; i <= FilterFracs + pc2; i++) {\r\n      sinc.FracDelay = (double)(FilterFracs - i) / FilterFracs;\r\n      sinc.initFrac(CDSPSincFilterGen ::wftKaiser, Params, true);\r\n      sinc.generateFrac(p, &CDSPSincFilterGen ::calcWindowKaiser, ElementSize);\r\n\r\n      normalizeFIRFilter(p, FilterLen, 1.0, ElementSize);\r\n      p += FilterSize;\r\n    }\r\n\r\n    const int TablePos2 = FilterSize;\r\n    const int TablePos3 = FilterSize * 2;\r\n    const int TablePos4 = FilterSize * 3;\r\n    const int TablePos5 = FilterSize * 4;\r\n    const int TablePos6 = FilterSize * 5;\r\n    const int TablePos7 = FilterSize * 6;\r\n    const int TablePos8 = FilterSize * 7;\r\n    double *const TableEnd = Table + (FilterFracs + 1) * FilterSize;\r\n    p = Table;\r\n\r\n    if (InterpPoints == 8) {\r\n      if (ElementSize == 3) {\r\n        // Calculate 2nd order spline (polynomial) interpolation\r\n        // coefficients using 8 points.\r\n\r\n        while (p < TableEnd) {\r\n          calcSpline2p8Coeffs(\r\n              p,\r\n              p[0],\r\n              p[TablePos2],\r\n              p[TablePos3],\r\n              p[TablePos4],\r\n              p[TablePos5],\r\n              p[TablePos6],\r\n              p[TablePos7],\r\n              p[TablePos8]);\r\n\r\n          p += ElementSize;\r\n        }\r\n\r\n#if defined(R8B_SIMD_ISH)\r\n        shuffle2_3(Table, TableEnd);\r\n#endif // SIMD\r\n      } else if (ElementSize == 4) {\r\n        // Calculate 3rd order spline (polynomial) interpolation\r\n        // coefficients using 8 points.\r\n\r\n        while (p < TableEnd) {\r\n          calcSpline3p8Coeffs(\r\n              p,\r\n              p[0],\r\n              p[TablePos2],\r\n              p[TablePos3],\r\n              p[TablePos4],\r\n              p[TablePos5],\r\n              p[TablePos6],\r\n              p[TablePos7],\r\n              p[TablePos8]);\r\n\r\n          p += ElementSize;\r\n        }\r\n\r\n#if defined(R8B_SIMD_ISH)\r\n        shuffle2_4(Table, TableEnd);\r\n#endif // SIMD\r\n      }\r\n    } else {\r\n      if (ElementSize == 2) {\r\n        // Calculate linear interpolation coefficients.\r\n\r\n        while (p < TableEnd) {\r\n          p[1] = p[TablePos2] - p[0];\r\n          p += ElementSize;\r\n        }\r\n\r\n#if defined(R8B_SIMD_ISH)\r\n        shuffle2_2(Table, TableEnd);\r\n#endif // SIMD\r\n      }\r\n    }\r\n\r\n    R8BCONSOLE(\r\n        \"CDSPFracDelayFilterBank: fracs=%i order=%i taps=%i \"\r\n        \"att=%.1f third=%i\\n\",\r\n        FilterFracs,\r\n        ElementSize - 1,\r\n        FilterLen,\r\n        ReqAtten,\r\n        (int)IsThird);\r\n  }\r\n\r\n  ~CDSPFracDelayFilterBank() {\r\n    delete Next;\r\n  }\r\n\r\n  /**\r\n\t * @brief Rounds the specified attenuation to the nearest effective value.\r\n\t *\r\n\t * @param[in,out] att Required filter attentuation. Will be rounded to the\r\n\t * nearest value.\r\n\t * @param aIsThird `true` if one-third filter is required.\r\n\t */\r\n\r\n  static void roundReqAtten(double &att, const bool aIsThird) {\r\n    int tmp;\r\n    getWinParams(att, aIsThird, tmp);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the length of the filter, in samples (taps). Always\r\n\t * an even number, not less than 6.\r\n\t */\r\n\r\n  int getFilterLen() const {\r\n    return (FilterLen);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the number of fractional positions sampled by the bank.\r\n\t */\r\n\r\n  int getFilterFracs() const {\r\n    return (FilterFracs);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns reference to the filter.\r\n\t *\r\n\t * @param i Filter index, in the range 0 to `FilterFracs`, inclusive.\r\n\t */\r\n\r\n  const double &operator[](const int i) const {\r\n    R8BASSERT(i >= 0 && i <= FilterFracs);\r\n\r\n    return (Table[i * FilterSize]);\r\n  }\r\n\r\n  /**\r\n\t * @brief Reduces reference count to *this* object.\r\n\t *\r\n\t * This function should be called when the filter bank obtained via the\r\n\t * filter bank cache is no longer needed.\r\n\t */\r\n\r\n  void unref();\r\n\r\n private:\r\n  int FilterLen;                 ///< Filter length. Always an even number, not less than 6.\r\n  int FilterFracs;               ///< Fractional position count.\r\n  int InitFilterFracs;           ///< Fractional position count as supplied to the\r\n                                 ///< constructor, may equal -1.\r\n  int ElementSize;               ///< Filter element size.\r\n  int InterpPoints;              ///< Interpolation points to use.\r\n  double ReqAtten;               ///< Filter's attentuation.\r\n  bool IsThird;                  ///< `true` if one-third filter is in use.\r\n  int FilterSize;                ///< This constant specifies the \"size\" of a single filter\r\n                                 ///< in \"double\" elements.\r\n  CFixedBuffer<double> Table;    ///< The table of fractional delay filters\r\n                                 ///< for all discrete fractional x = 0..1 sample positions, and\r\n                                 ///< interpolation coefficients.\r\n  CDSPFracDelayFilterBank *Next; ///< Next filter bank in cache's list.\r\n  int RefCount;                  ///< The number of references made to *this* filter bank.\r\n                                 ///< Not considered for \"static\" filter bank objects.\r\n\r\n  /**\r\n\t * @brief Returns windowing function parameters for the specified\r\n\t * attenuation and filter type.\r\n\t *\r\n\t * @param[in,out] att Required filter attentuation. Will be rounded to the\r\n\t * nearest value.\r\n\t * @param aIsThird `true` if one-third filter is required.\r\n\t * @param[out] fltlen Resulting filter length.\r\n\t */\r\n\r\n  static const double *getWinParams(double &att, const bool aIsThird, int &fltlen) {\r\n    static const int Coeffs2Base = 8;\r\n    static const int Coeffs2Count = 12;\r\n    static const double Coeffs2[Coeffs2Count][3] = {\r\n        {4.1308468534586913, 1.1752580009977263, 55.5446},   // 0.0256\r\n        {4.4241520324148826, 1.8004881791443044, 81.4191},   // 0.0886\r\n        {5.2615232289173663, 1.8133318236025469, 96.3392},   // 0.0481\r\n        {5.9433751227216174, 1.8730186391986436, 111.1315},  // 0.0264\r\n        {6.8308658290513815, 1.8549555110340281, 125.4653},  // 0.0146\r\n        {7.6648458290312904, 1.8565766090828464, 139.7379},  // 0.0081\r\n        {8.2038728664307605, 1.9269521820570166, 154.0532},  // 0.0045\r\n        {8.7865150946655142, 1.9775307667441668, 168.2101},  // 0.0025\r\n        {9.5945017884101773, 1.9718456992078597, 182.1076},  // 0.0014\r\n        {10.5163141145985240, 1.9504067820201083, 195.5668}, // 0.0008\r\n        {10.2382465206362470, 2.1608923446870087, 209.0610}, // 0.0004\r\n        {10.9976060250714000, 2.1536533525688935, 222.5010}, // 0.0003\r\n    };\r\n\r\n    static const int Coeffs3Base = 6;\r\n    static const int Coeffs3Count = 10;\r\n    static const double Coeffs3[Coeffs3Count][3] = {\r\n        {3.9888564562781847, 1.5869927184268915, 66.5701},   // 0.0467\r\n        {4.6986694038145007, 1.8086068597928262, 86.4715},   // 0.0136\r\n        {5.5995071329337822, 1.8930163360942349, 106.1195},  // 0.0040\r\n        {6.3627287800257228, 1.9945748322093975, 125.2307},  // 0.0012\r\n        {7.4299550711428308, 1.9893400572347544, 144.3469},  // 0.0004\r\n        {8.0667715944075642, 2.0928201458699909, 163.4099},  // 0.0001\r\n        {8.7469970226288822, 2.1640279784268355, 181.0694},  // 0.0000\r\n        {10.0823430069835230, 2.0896678025321922, 199.2880}, // 0.0000\r\n        {10.9222206090489510, 2.1221681162186004, 216.6865}, // 0.0000\r\n        {21.2017743894772010, 1.1856768080118900, 233.9188}, // 0.0000\r\n    };\r\n\r\n    const double *Params;\r\n    int i = 0;\r\n\r\n    if (aIsThird) {\r\n      while (i != Coeffs3Count - 1 && Coeffs3[i][2] < att) {\r\n        i++;\r\n      }\r\n\r\n      Params = &Coeffs3[i][0];\r\n      att = Coeffs3[i][2];\r\n      fltlen = Coeffs3Base + i * 2;\r\n    } else {\r\n      while (i != Coeffs2Count - 1 && Coeffs2[i][2] < att) {\r\n        i++;\r\n      }\r\n\r\n      Params = &Coeffs2[i][0];\r\n      att = Coeffs2[i][2];\r\n      fltlen = Coeffs2Base + i * 2;\r\n    }\r\n\r\n    return (Params);\r\n  }\r\n\r\n  /**\r\n\t * @brief Shuffles 2 order-2 filter points for SIMD operation.\r\n\t *\r\n\t * @param p Filter table start pointer.\r\n\t * @param pe Filter table end pointer.\r\n\t */\r\n\r\n  static void shuffle2_2(double *p, double *const pe) {\r\n    while (p != pe) {\r\n      const double t = p[2];\r\n      p[2] = p[1];\r\n      p[1] = t;\r\n\r\n      p += 4;\r\n    }\r\n  }\r\n\r\n  /**\r\n\t * @brief Shuffles 2 order-3 filter points for SIMD operation.\r\n\t *\r\n\t * @param p Filter table start pointer.\r\n\t * @param pe Filter table end pointer.\r\n\t */\r\n\r\n  static void shuffle2_3(double *p, double *const pe) {\r\n    while (p != pe) {\r\n      const double t1 = p[1];\r\n      const double t2 = p[2];\r\n      const double t3 = p[3];\r\n      const double t4 = p[4];\r\n      p[1] = t3;\r\n      p[2] = t1;\r\n      p[3] = t4;\r\n      p[4] = t2;\r\n\r\n      p += 6;\r\n    }\r\n  }\r\n\r\n  /**\r\n\t * @brief Shuffles 2 order-4 filter points for SIMD operation.\r\n\t *\r\n\t * @param p Filter table start pointer.\r\n\t * @param pe Filter table end pointer.\r\n\t */\r\n\r\n  static void shuffle2_4(double *p, double *const pe) {\r\n    while (p != pe) {\r\n      const double t1 = p[1];\r\n      const double t2 = p[2];\r\n      const double t3 = p[3];\r\n      const double t4 = p[4];\r\n      const double t5 = p[5];\r\n      const double t6 = p[6];\r\n      p[1] = t4;\r\n      p[2] = t1;\r\n      p[3] = t5;\r\n      p[4] = t2;\r\n      p[5] = t6;\r\n      p[6] = t3;\r\n\r\n      p += 8;\r\n    }\r\n  }\r\n};\r\n\r\n/**\r\n * @brief Fractional delay filter cache class.\r\n *\r\n * Class implements cache storage of fractional delay filter banks.\r\n */\r\n\r\nclass CDSPFracDelayFilterBankCache : public R8B_BASECLASS {\r\n  R8BNOCTOR(CDSPFracDelayFilterBankCache)\r\n\r\n  friend class CDSPFracDelayFilterBank;\r\n\r\n public:\r\n  /**\r\n\t * @brief Calculates or returns reference to a previously calculated\r\n\t * (cached) fractional delay filter bank.\r\n\t *\r\n\t * @param aFilterFracs The number of fractional delay positions to sample,\r\n\t * -1 - use default.\r\n\t * @param aElementSize The size of each filter's tap, in \"double\" values.\r\n\t * @param aInterpPoints The number of points the interpolation is based\r\n\t * on.\r\n\t * @param ReqAtten Required filter attentuation.\r\n\t * @param IsThird `true` if one-third filter is required.\r\n\t * @param IsStatic `true` if a permanent static filter should be returned\r\n\t * that is never removed from the cache until application terminates.\r\n\t * @return Reference to a filter bank.\r\n\t */\r\n\r\n  static CDSPFracDelayFilterBank &getFilterBank(\r\n      const int aFilterFracs,\r\n      const int aElementSize,\r\n      const int aInterpPoints,\r\n      double ReqAtten,\r\n      const bool IsThird,\r\n      const bool IsStatic) {\r\n    R8B_EXITDTOR static CPtrKeeper<CDSPFracDelayFilterBank> Objects;\r\n    // The chain of cached objects.\r\n    R8B_EXITDTOR static CPtrKeeper<CDSPFracDelayFilterBank> StaticObjects;\r\n    // The chain of static objects.\r\n    R8B_EXITDTOR static int ObjCount = 0; // The number of objects\r\n                                          // currently present in the Objects cache.\r\n\r\n    CDSPFracDelayFilterBank ::roundReqAtten(ReqAtten, IsThird);\r\n\r\n    R8BSYNC(getStateSync());\r\n\r\n    if (IsStatic) {\r\n      CDSPFracDelayFilterBank *PrevObj = R8B_NULL;\r\n      CDSPFracDelayFilterBank *CurObj = StaticObjects;\r\n\r\n      while (CurObj != R8B_NULL) {\r\n        if (CurObj->InitFilterFracs == aFilterFracs && CurObj->IsThird == IsThird &&\r\n            CurObj->ElementSize == aElementSize && CurObj->InterpPoints == aInterpPoints &&\r\n            CurObj->ReqAtten == ReqAtten) {\r\n          if (PrevObj != R8B_NULL) {\r\n            // Move the object to the top of the list.\r\n\r\n            PrevObj->Next = CurObj->Next;\r\n            CurObj->Next = StaticObjects.unkeep();\r\n            StaticObjects = CurObj;\r\n          }\r\n\r\n          return (*CurObj);\r\n        }\r\n\r\n        PrevObj = CurObj;\r\n        CurObj = CurObj->Next;\r\n      }\r\n\r\n      // Create a new filter bank and build it.\r\n\r\n      CurObj =\r\n          new CDSPFracDelayFilterBank(aFilterFracs, aElementSize, aInterpPoints, ReqAtten, IsThird);\r\n\r\n      // Insert the bank at the start of the list.\r\n\r\n      CurObj->Next = StaticObjects.unkeep();\r\n      StaticObjects = CurObj;\r\n\r\n      return (*CurObj);\r\n    }\r\n\r\n    CDSPFracDelayFilterBank *PrevObj = R8B_NULL;\r\n    CDSPFracDelayFilterBank *CurObj = Objects;\r\n\r\n    while (CurObj != R8B_NULL) {\r\n      if (CurObj->InitFilterFracs == aFilterFracs && CurObj->IsThird == IsThird &&\r\n          CurObj->ElementSize == aElementSize && CurObj->InterpPoints == aInterpPoints &&\r\n          CurObj->ReqAtten == ReqAtten) {\r\n        break;\r\n      }\r\n\r\n      if (CurObj->Next == R8B_NULL && ObjCount >= R8B_FRACBANK_CACHE_MAX) {\r\n        if (CurObj->RefCount == 0) {\r\n          // Delete the last bank which is not used.\r\n\r\n          PrevObj->Next = R8B_NULL;\r\n          delete CurObj;\r\n          ObjCount--;\r\n        } else {\r\n          // Move the last bank to the top of the list since it\r\n          // seems to be in use for a long time.\r\n\r\n          PrevObj->Next = R8B_NULL;\r\n          CurObj->Next = Objects.unkeep();\r\n          Objects = CurObj;\r\n        }\r\n\r\n        CurObj = R8B_NULL;\r\n        break;\r\n      }\r\n\r\n      PrevObj = CurObj;\r\n      CurObj = CurObj->Next;\r\n    }\r\n\r\n    if (CurObj != R8B_NULL) {\r\n      CurObj->RefCount++;\r\n\r\n      if (PrevObj == R8B_NULL) {\r\n        return (*CurObj);\r\n      }\r\n\r\n      // Remove the bank from the list temporarily.\r\n\r\n      PrevObj->Next = CurObj->Next;\r\n    } else {\r\n      // Create a new filter bank (with RefCount == 1) and build it.\r\n\r\n      CurObj =\r\n          new CDSPFracDelayFilterBank(aFilterFracs, aElementSize, aInterpPoints, ReqAtten, IsThird);\r\n\r\n      ObjCount++;\r\n    }\r\n\r\n    // Insert the bank at the start of the list.\r\n\r\n    CurObj->Next = Objects.unkeep();\r\n    Objects = CurObj;\r\n\r\n    return (*CurObj);\r\n  }\r\n\r\n protected:\r\n  /**\r\n\t * @brief Returns reference to global filter bank cache sync object.\r\n\t */\r\n\r\n  static CSyncObject &getStateSync() {\r\n    R8B_EXITDTOR static CSyncObject StateSync;\r\n\r\n    return (StateSync);\r\n  }\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n// CDSPFracDelayFilterBank PUBLIC\r\n// ---------------------------------------------------------------------------\r\n\r\ninline void CDSPFracDelayFilterBank ::unref() {\r\n  R8BSYNC(CDSPFracDelayFilterBankCache ::getStateSync());\r\n\r\n  RefCount--;\r\n}\r\n\r\n/**\r\n * @brief Interatively searches for a greatest common denominator (GCD) of 2\r\n * numbers.\r\n *\r\n * @param l Number 1.\r\n * @param s Number 2.\r\n * @param[out] GCD Resulting GCD.\r\n * @return `true` if the greatest common denominator of 2 numbers was found.\r\n */\r\n\r\ninline bool findGCD(double l, double s, double &GCD) {\r\n  int it = 0;\r\n\r\n  while (++it < 150) {\r\n    const double r = l - s;\r\n\r\n    if (r == 0.0) {\r\n      GCD = s;\r\n      return (s > 0.0);\r\n    }\r\n\r\n    l = s;\r\n    s = fabs(r);\r\n  }\r\n\r\n  return (false);\r\n}\r\n\r\n/**\r\n * @brief Evaluates source and destination sample rate ratio and returns\r\n * the required input and output stepping.\r\n *\r\n * Function returns `false` if whole stepping cannot be used to perform\r\n * interpolation using these sample rates.\r\n *\r\n * @param SSampleRate Source sample rate.\r\n * @param DSampleRate Destination sample rate.\r\n * @param[out] ResInStep Resulting input step.\r\n * @param[out] ResOutStep Resulting output step.\r\n * @return `true` if stepping was acquired.\r\n */\r\n\r\ninline bool getWholeStepping(\r\n    const double SSampleRate,\r\n    const double DSampleRate,\r\n    int &ResInStep,\r\n    int &ResOutStep) {\r\n  double GCD;\r\n\r\n  if (!findGCD(SSampleRate, DSampleRate, GCD)) {\r\n    return (false);\r\n  }\r\n\r\n  const double InStep0 = SSampleRate / GCD;\r\n  ResInStep = (int)InStep0;\r\n  const double OutStep0 = DSampleRate / GCD;\r\n  ResOutStep = (int)OutStep0;\r\n\r\n  if (InStep0 != ResInStep || OutStep0 != ResOutStep) {\r\n    return (false);\r\n  }\r\n\r\n  if (ResOutStep > 1500) {\r\n    // Do not allow large output stepping due to low cache\r\n    // performance of large filter banks.\r\n\r\n    return (false);\r\n  }\r\n\r\n  return (true);\r\n}\r\n\r\n/**\r\n * @brief Fractional delay filter bank-based interpolator class.\r\n *\r\n * Class implements the fractional delay interpolator. This implementation at\r\n * first puts the input signal into a ring buffer and then performs\r\n * interpolation. The interpolation is performed using sinc-based fractional\r\n * delay filters. These filters are contained in a bank, and for higher\r\n * precision they are interpolated between adjacent filters.\r\n *\r\n * To increase the sample-timing precision, this class uses \"resettable\r\n * counter\" approach. This gives zero overall sample-timing error. With the\r\n * R8B_FASTTIMING configuration option enabled, the sample timing experiences\r\n * a very minor drift.\r\n */\r\n\r\nclass CDSPFracInterpolator : public CDSPProcessor {\r\n public:\r\n  /**\r\n\t * @brief Initalizes the interpolator. It is important to call the\r\n\t * getMaxOutLen() function afterwards to obtain the optimal output buffer\r\n\t * length.\r\n\t *\r\n\t * @param aSrcSampleRate Source sample rate.\r\n\t * @param aDstSampleRate Destination sample rate.\r\n\t * @param ReqAtten Required filter attentuation.\r\n\t * @param IsThird `true` if one-third filter is required.\r\n\t * @param PrevLatency Latency, in samples (any non-negative value), which\r\n\t * was left in the output signal by a previous process. This latency will\r\n\t * be consumed completely.\r\n\t */\r\n\r\n  CDSPFracInterpolator(\r\n      const double aSrcSampleRate,\r\n      const double aDstSampleRate,\r\n      const double ReqAtten,\r\n      const bool IsThird,\r\n      const double PrevLatency)\r\n      : SrcSampleRate(aSrcSampleRate),\r\n        DstSampleRate(aDstSampleRate)\r\n#if R8B_FASTTIMING\r\n        ,\r\n        FracStep(aSrcSampleRate / aDstSampleRate)\r\n#endif // R8B_FASTTIMING\r\n  {\r\n    R8BASSERT(SrcSampleRate > 0.0);\r\n    R8BASSERT(DstSampleRate > 0.0);\r\n    R8BASSERT(PrevLatency >= 0.0);\r\n    R8BASSERT(BufLenBits >= 5);\r\n\r\n    InitFracPos = PrevLatency;\r\n    Latency = (int)InitFracPos;\r\n    InitFracPos -= Latency;\r\n\r\n    R8BASSERT(Latency >= 0);\r\n\r\n#if R8B_FLTTEST\r\n\r\n    IsWhole = false;\r\n    LatencyFrac = 0.0;\r\n    FilterBank = new CDSPFracDelayFilterBank(-1, 3, 8, ReqAtten, IsThird);\r\n\r\n#else // R8B_FLTTEST\r\n\r\n    IsWhole = getWholeStepping(SrcSampleRate, DstSampleRate, InStep, OutStep);\r\n\r\n    if (IsWhole) {\r\n      const double spos = InitFracPos * OutStep;\r\n      InitFracPosW = (int)spos;\r\n      LatencyFrac = (spos - InitFracPosW) / InStep;\r\n\r\n      FilterBank =\r\n          &CDSPFracDelayFilterBankCache ::getFilterBank(OutStep, 1, 2, ReqAtten, IsThird, false);\r\n    } else {\r\n      LatencyFrac = 0.0;\r\n      FilterBank = &CDSPFracDelayFilterBankCache ::getFilterBank(-1, 3, 8, ReqAtten, IsThird, true);\r\n    }\r\n\r\n#endif // R8B_FLTTEST\r\n\r\n    FilterLen = FilterBank->getFilterLen();\r\n    fl2 = FilterLen >> 1;\r\n    fll = fl2 - 1;\r\n    flo = fll + fl2;\r\n    flb = BufLen - fll;\r\n\r\n    R8BASSERT((1 << BufLenBits) >= FilterLen * 3);\r\n\r\n    static const CConvolveFn FltConvFn0[13] = {\r\n        &CDSPFracInterpolator ::convolve0<6>,\r\n        &CDSPFracInterpolator ::convolve0<8>,\r\n        &CDSPFracInterpolator ::convolve0<10>,\r\n        &CDSPFracInterpolator ::convolve0<12>,\r\n        &CDSPFracInterpolator ::convolve0<14>,\r\n        &CDSPFracInterpolator ::convolve0<16>,\r\n        &CDSPFracInterpolator ::convolve0<18>,\r\n        &CDSPFracInterpolator ::convolve0<20>,\r\n        &CDSPFracInterpolator ::convolve0<22>,\r\n        &CDSPFracInterpolator ::convolve0<24>,\r\n        &CDSPFracInterpolator ::convolve0<26>,\r\n        &CDSPFracInterpolator ::convolve0<28>,\r\n        &CDSPFracInterpolator ::convolve0<30>};\r\n\r\n    convfn = (IsWhole ? FltConvFn0[fl2 - 3] : &CDSPFracInterpolator ::convolve2);\r\n\r\n    R8BCONSOLE(\r\n        \"CDSPFracInterpolator: src=%.2f dst=%.2f taps=%i \"\r\n        \"fracs=%i whole=%i third=%i step=%.6f\\n\",\r\n        SrcSampleRate,\r\n        DstSampleRate,\r\n        FilterLen,\r\n        (IsWhole ? OutStep : FilterBank->getFilterFracs()),\r\n        (int)IsWhole,\r\n        (int)IsThird,\r\n        aSrcSampleRate / aDstSampleRate);\r\n\r\n    clear();\r\n  }\r\n\r\n  virtual ~CDSPFracInterpolator() {\r\n#if R8B_FLTTEST\r\n    delete FilterBank;\r\n#else  // R8B_FLTTEST\r\n    FilterBank->unref();\r\n#endif // R8B_FLTTEST\r\n  }\r\n\r\n  virtual int getInLenBeforeOutPos(const int ReqOutPos) const {\r\n    const int ilat = fl2 + Latency;\r\n\r\n    if (IsWhole) {\r\n      return (\r\n          ilat +\r\n          (int)((InitFracPosW + (double)ReqOutPos * InStep) / OutStep +\r\n                LatencyFrac * InStep / OutStep));\r\n    }\r\n\r\n    return (ilat + (int)(InitFracPos + ReqOutPos * SrcSampleRate / DstSampleRate));\r\n  }\r\n\r\n  virtual int getLatency() const {\r\n    return (0);\r\n  }\r\n\r\n  virtual double getLatencyFrac() const {\r\n    return (LatencyFrac);\r\n  }\r\n\r\n  virtual int getMaxOutLen(const int MaxInLen) const {\r\n    R8BASSERT(MaxInLen >= 0);\r\n\r\n    return ((int)ceil(MaxInLen * DstSampleRate / SrcSampleRate) + 1);\r\n  }\r\n\r\n  virtual void clear() {\r\n    LatencyLeft = Latency;\r\n    BufLeft = 0;\r\n    WritePos = 0;\r\n    ReadPos = flb; // Set \"read\" position to account for filter's\r\n                   // latency at zero fractional delay.\r\n\r\n    memset(&Buf[ReadPos], 0, (size_t)(BufLen - flb) * sizeof(Buf[0]));\r\n\r\n    if (IsWhole) {\r\n      InPosFracW = InitFracPosW;\r\n    } else {\r\n      InPosFrac = InitFracPos;\r\n\r\n#if !R8B_FASTTIMING\r\n      InCounter = 0;\r\n      InPosInt = 0;\r\n      InPosShift = InitFracPos * DstSampleRate / SrcSampleRate;\r\n#endif // !R8B_FASTTIMING\r\n    }\r\n  }\r\n\r\n  virtual int process(double *ip, int l, double *&op0) {\r\n    R8BASSERT(l >= 0);\r\n    R8BASSERT(ip != op0 || l == 0 || SrcSampleRate > DstSampleRate);\r\n\r\n    if (LatencyLeft != 0) {\r\n      if (LatencyLeft >= l) {\r\n        LatencyLeft -= l;\r\n        return (0);\r\n      }\r\n\r\n      l -= LatencyLeft;\r\n      ip += LatencyLeft;\r\n      LatencyLeft = 0;\r\n    }\r\n\r\n    double *op = op0;\r\n\r\n    while (l > 0) {\r\n      // Copy new input samples to the ring buffer.\r\n\r\n      const int b = min(l, min(BufLen - WritePos, flb - BufLeft));\r\n\r\n      double *const wp1 = Buf + WritePos;\r\n      memcpy(wp1, ip, (size_t)b * sizeof(wp1[0]));\r\n      const int ec = flo - WritePos;\r\n\r\n      if (ec > 0) {\r\n        memcpy(wp1 + BufLen, ip, (size_t)min(b, ec) * sizeof(wp1[0]));\r\n      }\r\n\r\n      ip += b;\r\n      WritePos = (WritePos + b) & BufLenMask;\r\n      l -= b;\r\n      BufLeft += b;\r\n\r\n      // Produce as many output samples as possible.\r\n\r\n      op = (*this.*convfn)(op);\r\n    }\r\n\r\n#if !R8B_FASTTIMING\r\n\r\n    if (!IsWhole && InCounter > 1000) {\r\n      // Reset the interpolation position counter to achieve a higher\r\n      // sample-timing precision.\r\n\r\n      InCounter = 0;\r\n      InPosInt = 0;\r\n      InPosShift = InPosFrac * DstSampleRate / SrcSampleRate;\r\n    }\r\n\r\n#endif // !R8B_FASTTIMING\r\n\r\n    return ((int)(op - op0));\r\n  }\r\n\r\n private:\r\n  static const int BufLenBits = 8; ///< The length of the ring buffer,\r\n  ///< expressed as Nth power of 2. This value can be reduced if it is\r\n  ///< known that only short input buffers will be passed to the\r\n  ///< interpolator. The minimum value of this parameter is 5, and\r\n  ///< `1 << BufLenBits` should be at least 3 times larger than the\r\n  ///< FilterLen. However, this condition can be easily met if the input\r\n  ///< signal is suitably downsampled first before the interpolation is\r\n  ///< performed.\r\n  static const int BufLen = 1 << BufLenBits; ///< The length of the ring\r\n  ///< buffer. The actual length is longer, to permit \"beyond bounds\"\r\n  ///< positioning.\r\n  static const int BufLenMask = BufLen - 1; ///< Mask used for quick buffer\r\n                                            ///< position wrapping.\r\n  double Buf[BufLen + 29];                  ///< The ring buffer, including overrun\r\n                                            ///< protection for maximal filter length.\r\n  double SrcSampleRate;                     ///< Source sample rate.\r\n  double DstSampleRate;                     ///< Destination sample rate.\r\n  double InitFracPos;                       ///< Initial fractional position, in samples, in the\r\n                                            ///< range [0; 1).\r\n  int InitFracPosW;                         ///< Initial fractional position for whole-number\r\n                                            ///< stepping.\r\n  int Latency;        ///< Initial latency that should be removed from the input.\r\n  double LatencyFrac; ///< Left-over fractional latency on output (always\r\n                      ///< zero for non-whole stepping).\r\n  int FilterLen;      ///< Filter length, in taps. Even value.\r\n  int fll;            ///< Input latency (left-hand filter length).\r\n  int fl2;            ///< Right-side (half) filter length.\r\n  int flo;            ///< Overrun length.\r\n  int flb;            ///< Initial buffer read position.\r\n  int InStep;         ///< Input whole-number stepping.\r\n  int OutStep;        ///< Output whole-number stepping (corresponds to filter bank\r\n                      ///< size).\r\n  int LatencyLeft;    ///< Input latency left to remove.\r\n  int BufLeft;        ///< The number of samples left in the buffer to process.\r\n  int WritePos;       ///< The current buffer write position. Incremented together\r\n                      ///< with the `BufLeft` variable.\r\n  int ReadPos;        ///< The current buffer read position.\r\n  int InPosFracW;     ///< Interpolation position (fractional part) for\r\n                      ///< whole-number stepping. Corresponds to the index into the filter\r\n                      ///< bank.\r\n  double InPosFrac;   ///< Interpolation position (fractional part).\r\n\r\n#if R8B_FASTTIMING\r\n  double FracStep; ///< Fractional sample-timing step.\r\n#else              // R8B_FASTTIMING\r\n  int InCounter;     ///< Interpolation step counter.\r\n  int InPosInt;      ///< Interpolation position (integer part).\r\n  double InPosShift; ///< Interpolation position fractional shift.\r\n#endif             // R8B_FASTTIMING\r\n\r\n  CDSPFracDelayFilterBank *FilterBank; ///< Filter bank in use, may be\r\n                                       ///< whole-number stepping filter bank or static bank.\r\n  bool IsWhole;                        ///< `true` if whole-number stepping is in use.\r\n\r\n  typedef double *(CDSPFracInterpolator ::*CConvolveFn)(double *op); ///<\r\n                                                                     ///< Convolution function type.\r\n  CConvolveFn convfn; ///< Convolution function in use.\r\n\r\n  /**\r\n\t * @brief Convolution function for 0th order resampling.\r\n\t *\r\n\t * @param[out] op Output buffer.\r\n\t * @tparam fltlen Filter length, in taps.\r\n\t * @return Advanced \"op\" value.\r\n\t */\r\n\r\n  template <int fltlen>\r\n  double *convolve0(double *op) {\r\n    const CDSPFracDelayFilterBank &fb = *FilterBank;\r\n    const int istep = InStep;\r\n    const int ostep = OutStep;\r\n    int fpos = InPosFracW;\r\n    int rpos = ReadPos;\r\n    int bl = BufLeft - fl2;\r\n\r\n    while (bl > 0) {\r\n      const double *const ftp = &fb[fpos];\r\n      const double *const rp = Buf + rpos;\r\n      int i;\r\n\r\n#if defined(R8B_SSE2) && !defined(__INTEL_COMPILER)\r\n\r\n      __m128d s = _mm_setzero_pd();\r\n\r\n      for (i = 0; i < fltlen; i += 2) {\r\n        const __m128d m = _mm_mul_pd(_mm_load_pd(ftp + i), _mm_loadu_pd(rp + i));\r\n\r\n        s = _mm_add_pd(s, m);\r\n      }\r\n\r\n      _mm_storel_pd(op, _mm_add_pd(s, _mm_shuffle_pd(s, s, 1)));\r\n\r\n#elif defined(R8B_NEON)\r\n\r\n      float64x2_t s = vdupq_n_f64(0.0);\r\n\r\n      for (i = 0; i < fltlen; i += 2) {\r\n        s = vmlaq_f64(s, vld1q_f64(ftp + i), vld1q_f64(rp + i));\r\n      }\r\n\r\n      *op = vaddvq_f64(s);\r\n\r\n#else // SIMD\r\n\r\n      double s = 0.0;\r\n\r\n      for (i = 0; i < fltlen; i++) {\r\n        s += ftp[i] * rp[i];\r\n      }\r\n\r\n      *op = s;\r\n\r\n#endif // SIMD\r\n\r\n      op++;\r\n\r\n      fpos += istep;\r\n      const int PosIncr = fpos / ostep;\r\n      fpos -= PosIncr * ostep;\r\n\r\n      rpos = (rpos + PosIncr) & BufLenMask;\r\n      bl -= PosIncr;\r\n    }\r\n\r\n    BufLeft = bl + fl2;\r\n    ReadPos = rpos;\r\n    InPosFracW = fpos;\r\n\r\n    return (op);\r\n  }\r\n\r\n  /**\r\n\t * @brief Convolution function for 2nd order resampling.\r\n\t *\r\n\t * @param[out] op Output buffer.\r\n\t * @return Advanced \"op\" value.\r\n\t */\r\n\r\n  double *convolve2(double *op) {\r\n    const CDSPFracDelayFilterBank &fb = *FilterBank;\r\n    const int fltlen = FilterLen;\r\n    const double ssr = SrcSampleRate;\r\n    const double dsr = DstSampleRate;\r\n    double fpos = InPosFrac;\r\n    int rpos = ReadPos;\r\n    int bl = BufLeft - fl2;\r\n\r\n    while (bl > 0) {\r\n      double x = fpos * fb.getFilterFracs();\r\n      const int fti = (int)x; // Function table index.\r\n      x -= fti;               // Coefficient for interpolation between adjacent\r\n                              // fractional delay filters.\r\n      const double x2d = x * x;\r\n      const double *ftp = &fb[fti];\r\n      const double *const rp = Buf + rpos;\r\n      int i;\r\n\r\n#if defined(R8B_SSE2) && defined(R8B_SIMD_ISH)\r\n\r\n      const __m128d x1 = _mm_set1_pd(x);\r\n      const __m128d x2 = _mm_set1_pd(x2d);\r\n      __m128d s = _mm_setzero_pd();\r\n\r\n      for (i = 0; i < fltlen; i += 2) {\r\n        const __m128d ftp2 = _mm_load_pd(ftp + 2);\r\n        const __m128d xx1 = _mm_mul_pd(ftp2, x1);\r\n        const __m128d ftp4 = _mm_load_pd(ftp + 4);\r\n        const __m128d xx2 = _mm_mul_pd(ftp4, x2);\r\n        const __m128d ftp0 = _mm_load_pd(ftp);\r\n        ftp += 6;\r\n\r\n        const __m128d rpi = _mm_loadu_pd(rp + i);\r\n        const __m128d xxs = _mm_add_pd(ftp0, _mm_add_pd(xx1, xx2));\r\n\r\n        s = _mm_add_pd(s, _mm_mul_pd(rpi, xxs));\r\n      }\r\n\r\n      _mm_storel_pd(op, _mm_add_pd(s, _mm_shuffle_pd(s, s, 1)));\r\n\r\n#elif defined(R8B_NEON) && defined(R8B_SIMD_ISH)\r\n\r\n      const float64x2_t x1 = vdupq_n_f64(x);\r\n      const float64x2_t x2 = vdupq_n_f64(x2d);\r\n      float64x2_t s = vdupq_n_f64(0.0);\r\n\r\n      for (i = 0; i < fltlen; i += 2) {\r\n        const float64x2_t ftp2 = vld1q_f64(ftp + 2);\r\n        const float64x2_t xx1 = vmulq_f64(ftp2, x1);\r\n        const float64x2_t ftp4 = vld1q_f64(ftp + 4);\r\n        const float64x2_t xx2 = vmulq_f64(ftp4, x2);\r\n        const float64x2_t ftp0 = vld1q_f64(ftp);\r\n        ftp += 6;\r\n\r\n        const float64x2_t rpi = vld1q_f64(rp + i);\r\n        const float64x2_t xxs = vaddq_f64(ftp0, vaddq_f64(xx1, xx2));\r\n\r\n        s = vmlaq_f64(s, rpi, xxs);\r\n      }\r\n\r\n      *op = vaddvq_f64(s);\r\n\r\n#else // SIMD\r\n\r\n      double s = 0.0;\r\n\r\n      for (i = 0; i < fltlen; i++) {\r\n        s += (ftp[0] + ftp[1] * x + ftp[2] * x2d) * rp[i];\r\n        ftp += 3;\r\n      }\r\n\r\n      *op = s;\r\n\r\n#endif // SIMD\r\n\r\n      op++;\r\n\r\n#if R8B_FASTTIMING\r\n\r\n      fpos += FracStep;\r\n      const int PosIncr = (int)fpos;\r\n      fpos -= PosIncr;\r\n\r\n#else // R8B_FASTTIMING\r\n\r\n      InCounter++;\r\n      const double NextInPos = (InCounter + InPosShift) * ssr / dsr;\r\n      const int NextInPosInt = (int)NextInPos;\r\n      const int PosIncr = NextInPosInt - InPosInt;\r\n      InPosInt = NextInPosInt;\r\n      fpos = NextInPos - NextInPosInt;\r\n\r\n#endif // R8B_FASTTIMING\r\n\r\n      rpos = (rpos + PosIncr) & BufLenMask;\r\n      bl -= PosIncr;\r\n    }\r\n\r\n    BufLeft = bl + fl2;\r\n    ReadPos = rpos;\r\n    InPosFrac = fpos;\r\n\r\n    return (op);\r\n  }\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n\r\n} // namespace r8b\r\n\r\n#endif // R8B_CDSPFRACINTERPOLATOR_INCLUDED\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/CDSPHBDownsampler.h",
    "content": "//$ nobt\r\n//$ nocpp\r\n\r\n/**\r\n * @file CDSPHBDownsampler.h\r\n *\r\n * @brief Half-band downsampling convolver class.\r\n *\r\n * This file includes half-band downsampling convolver class.\r\n *\r\n * r8brain-free-src Copyright (c) 2013-2025 Aleksey Vaneev\r\n *\r\n * See the \"LICENSE\" file for license.\r\n */\r\n\r\n#ifndef R8B_CDSPHBDOWNSAMPLER_INCLUDED\r\n#define R8B_CDSPHBDOWNSAMPLER_INCLUDED\r\n\r\n#include \"CDSPHBUpsampler.h\"\r\n\r\nnamespace r8b {\r\n\r\n/**\r\n * @brief Half-band downsampler class.\r\n *\r\n * Class implements brute-force half-band 2X downsampling that uses small\r\n * sparse symmetric FIR filters. The output has 2.0 gain.\r\n */\r\n\r\nclass CDSPHBDownsampler : public CDSPProcessor {\r\n public:\r\n  /**\r\n\t * @brief Initalizes the half-band downsampler.\r\n\t *\r\n\t * @param ReqAtten Required half-band filter attentuation.\r\n\t * @param SteepIndex Steepness index - 0=steepest. Corresponds to general\r\n\t * downsampling ratio, e.g., at 4x downsampling 0 is used, at 8x\r\n\t * downsampling 1 is used, etc.\r\n\t * @param IsThird `true` if 1/3 resampling is performed.\r\n\t * @param PrevLatency Latency, in samples (any non-negative value), which\r\n\t * was left in the output signal by a previous process. Whole-number\r\n\t * latency will be consumed by *this* object while remaining fractional\r\n\t * latency can be obtained via the getLatencyFrac() function.\r\n\t */\r\n\r\n  CDSPHBDownsampler(\r\n      const double ReqAtten,\r\n      const int SteepIndex,\r\n      const bool IsThird,\r\n      const double PrevLatency) {\r\n    static const CConvolveFn FltConvFn[14] = {\r\n        &CDSPHBDownsampler ::convolve1,\r\n        &CDSPHBDownsampler ::convolve2,\r\n        &CDSPHBDownsampler ::convolve3,\r\n        &CDSPHBDownsampler ::convolve4,\r\n        &CDSPHBDownsampler ::convolve5,\r\n        &CDSPHBDownsampler ::convolve6,\r\n        &CDSPHBDownsampler ::convolve7,\r\n        &CDSPHBDownsampler ::convolve8,\r\n        &CDSPHBDownsampler ::convolve9,\r\n        &CDSPHBDownsampler ::convolve10,\r\n        &CDSPHBDownsampler ::convolve11,\r\n        &CDSPHBDownsampler ::convolve12,\r\n        &CDSPHBDownsampler ::convolve13,\r\n        &CDSPHBDownsampler ::convolve14};\r\n\r\n    const double *fltp0;\r\n    int fltt;\r\n    double att;\r\n\r\n    if (IsThird) {\r\n      CDSPHBUpsampler ::getHBFilterThird(ReqAtten, SteepIndex, fltp0, fltt, att);\r\n    } else {\r\n      CDSPHBUpsampler ::getHBFilter(ReqAtten, SteepIndex, fltp0, fltt, att);\r\n    }\r\n\r\n    // Copy obtained filter to address-aligned buffer.\r\n\r\n    fltp = alignptr(FltBuf, 16);\r\n    memcpy(fltp, fltp0, (size_t)fltt * sizeof(fltp[0]));\r\n\r\n    convfn = FltConvFn[fltt - 1];\r\n    fll = fltt;\r\n    fl2 = fltt - 1;\r\n    flo = fll + fl2;\r\n    flb = BufLen - fll;\r\n    BufRP1 = Buf1 + fll;\r\n    BufRP2 = Buf2 + fll - 1;\r\n\r\n    LatencyFrac = PrevLatency * 0.5;\r\n    Latency = (int)LatencyFrac;\r\n    LatencyFrac -= Latency;\r\n\r\n    R8BASSERT(Latency >= 0);\r\n\r\n    R8BCONSOLE(\"CDSPHBDownsampler: taps=%i third=%i att=%.1f io=1/2\\n\", fltt, (int)IsThird, att);\r\n\r\n    clear();\r\n  }\r\n\r\n  virtual int getInLenBeforeOutPos(const int ReqOutPos) const {\r\n    return (flo + (int)((Latency + LatencyFrac + ReqOutPos) * 2.0));\r\n  }\r\n\r\n  virtual int getLatency() const {\r\n    return (0);\r\n  }\r\n\r\n  virtual double getLatencyFrac() const {\r\n    return (LatencyFrac);\r\n  }\r\n\r\n  virtual int getMaxOutLen(const int MaxInLen) const {\r\n    R8BASSERT(MaxInLen >= 0);\r\n\r\n    return ((MaxInLen + 1) >> 1);\r\n  }\r\n\r\n  virtual void clear() {\r\n    LatencyLeft = Latency;\r\n    BufLeft = 0;\r\n    WritePos1 = 0;\r\n    WritePos2 = 0;\r\n    ReadPos = flb; // Set \"read\" position to account for filter's latency.\r\n\r\n    memset(&Buf1[ReadPos], 0, (size_t)(BufLen - flb) * sizeof(Buf1[0]));\r\n\r\n    memset(&Buf2[ReadPos], 0, (size_t)(BufLen - flb) * sizeof(Buf2[0]));\r\n  }\r\n\r\n  virtual int process(double *ip, int l, double *&op0) {\r\n    R8BASSERT(l >= 0);\r\n\r\n    double *op = op0;\r\n\r\n    while (l > 0) {\r\n      // Copy new input samples to 2 ring buffers.\r\n\r\n      if (WritePos1 != WritePos2) {\r\n        // If previous fill was asymmetrical, put a single sample to\r\n        // Buf2.\r\n\r\n        double *const wp2 = Buf2 + WritePos2;\r\n        *wp2 = *ip;\r\n\r\n        if (WritePos2 < flo) {\r\n          wp2[BufLen] = *ip;\r\n        }\r\n\r\n        ip++;\r\n        WritePos2 = WritePos1;\r\n        l--;\r\n        BufLeft++;\r\n      }\r\n\r\n      const int b1 = min((l + 1) >> 1, min(BufLen - WritePos1, flb - BufLeft));\r\n\r\n      const int b2 = b1 - (b1 * 2 > l);\r\n\r\n      double *wp1 = Buf1 + WritePos1;\r\n      double *wp2 = Buf2 + WritePos1;\r\n      double *const ipe = ip + b2 * 2;\r\n\r\n      while (ip != ipe) {\r\n        *wp1 = ip[0];\r\n        *wp2 = ip[1];\r\n        wp1++;\r\n        wp2++;\r\n        ip += 2;\r\n      }\r\n\r\n      if (b1 != b2) {\r\n        *wp1 = *ip;\r\n        ip++;\r\n      }\r\n\r\n      const int ec = flo - WritePos1;\r\n\r\n      if (ec > 0) {\r\n        wp1 = Buf1 + WritePos1;\r\n        memcpy(wp1 + BufLen, wp1, (size_t)min(b1, ec) * sizeof(wp1[0]));\r\n\r\n        wp2 = Buf2 + WritePos1;\r\n        memcpy(wp2 + BufLen, wp2, (size_t)min(b2, ec) * sizeof(wp2[0]));\r\n      }\r\n\r\n      WritePos1 = (WritePos1 + b1) & BufLenMask;\r\n      WritePos2 = (WritePos2 + b2) & BufLenMask;\r\n      l -= b1 + b2;\r\n      BufLeft += b2;\r\n\r\n      // Produce output.\r\n\r\n      const int c = BufLeft - fl2;\r\n\r\n      if (c > 0) {\r\n        double *const opend = op + c;\r\n        (*convfn)(op, opend, fltp, BufRP1, BufRP2, ReadPos);\r\n\r\n        op = opend;\r\n        ReadPos = (ReadPos + c) & BufLenMask;\r\n        BufLeft -= c;\r\n      }\r\n    }\r\n\r\n    int ol = (int)(op - op0);\r\n\r\n    if (LatencyLeft != 0) {\r\n      if (LatencyLeft >= ol) {\r\n        LatencyLeft -= ol;\r\n        return (0);\r\n      }\r\n\r\n      ol -= LatencyLeft;\r\n      op0 += LatencyLeft;\r\n      LatencyLeft = 0;\r\n    }\r\n\r\n    return (ol);\r\n  }\r\n\r\n private:\r\n  static const int BufLenBits = 10; ///< The length of the ring buffer,\r\n  ///< expressed as Nth power of 2. This value can be reduced if it is\r\n  ///< known that only short input buffers will be passed to the\r\n  ///< interpolator. The minimum value of this parameter is 5, and\r\n  ///< `1 << BufLenBits` should be at least 3 times larger than the\r\n  ///< FilterLen.\r\n  static const int BufLen = 1 << BufLenBits; ///< The length of the ring\r\n  ///< buffer. The actual length is longer, to permit \"beyond bounds\"\r\n  ///< positioning.\r\n  static const int BufLenMask = BufLen - 1; ///< Mask used for quick buffer\r\n                                            ///< position wrapping.\r\n  double Buf1[BufLen + 27];                 ///< The ring buffer 1, including overrun\r\n                                            ///< protection for the largest filter.\r\n  double Buf2[BufLen + 27];                 ///< The ring buffer 2, including overrun\r\n                                            ///< protection for the largest filter.\r\n  double FltBuf[14 + 2];                    ///< Holder for half-band filter taps, used with\r\n                                            ///< 16-byte address-aligning, for SIMD use.\r\n  const double *BufRP1;                     ///< Offseted Buf1 pointer at `ReadPos` equal 0.\r\n  const double *BufRP2;                     ///< Offseted Buf2 pointer at `ReadPos` equal 0.\r\n  double *fltp;                             ///< Half-band filter taps, points to `FltBuf`.\r\n  double LatencyFrac;                       ///< Fractional latency left on the output.\r\n  int Latency;     ///< Initial latency that should be removed from the output.\r\n  int fll;         ///< Input latency (left-hand filter length).\r\n  int fl2;         ///< Right-side filter length.\r\n  int flo;         ///< Overrun length.\r\n  int flb;         ///< Initial buffer read position.\r\n  int LatencyLeft; ///< Latency left to remove.\r\n  int BufLeft;     ///< The number of samples left in the buffer to process.\r\n                   ///< When this value is below `fl2`, the interpolation cycle ends.\r\n  int WritePos1;   ///< The current buffer 1 write position.\r\n  int WritePos2;   ///< The current buffer 2 write position. Incremented\r\n                   ///< together with the `BufLeft` variable.\r\n  int ReadPos;     ///< The current buffer read position.\r\n\r\n  typedef void (*CConvolveFn)(\r\n      double *op,\r\n      double *const opend,\r\n      const double *const flt,\r\n      const double *const rp01,\r\n      const double *const rp02,\r\n      int rpos);      ///<\r\n                      ///< Convolution function type.\r\n  CConvolveFn convfn; ///< Convolution function in use.\r\n\r\n#define R8BHBC1(fn) \\\r\n  static void fn( \\\r\n      double *op, \\\r\n      double *const opend, \\\r\n      const double *const flt, \\\r\n      const double *const rp01, \\\r\n      const double *const rp02, \\\r\n      int rpos) { \\\r\n    while (op != opend) { \\\r\n      const double *const rp1 = rp01 + rpos; \\\r\n      const double *const rp = rp02 + rpos;\r\n\r\n#define R8BHBC2 \\\r\n  rpos = (rpos + 1) & BufLenMask; \\\r\n  op++; \\\r\n  } \\\r\n  }\r\n\r\n#include \"CDSPHBDownsampler.inc\"\r\n\r\n#undef R8BHBC1\r\n#undef R8BHBC2\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n\r\n} // namespace r8b\r\n\r\n#endif // R8B_CDSPHBDOWNSAMPLER_INCLUDED\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/CDSPHBDownsampler.inc",
    "content": "// Auto-generated by `genhbc`, do not edit!\r\n\r\n#if defined( R8B_SSE2 )\r\n\r\nR8BHBC1( convolve1 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve2 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n_mm_storel_pd( op, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 0 ] += rp1[ 0 ];\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve3 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n_mm_storel_pd( op, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 0 ] += rp1[ 0 ] + flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve4 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 0 ] += rp1[ 0 ];\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve5 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 0 ] += rp1[ 0 ] + flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve6 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 0 ] += rp1[ 0 ];\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve7 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 0 ] += rp1[ 0 ] + flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve8 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 0 ] += rp1[ 0 ];\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve9 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 0 ] += rp1[ 0 ] + flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve10 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\nv2 = _mm_loadu_pd( rp - 9 ); v1 = _mm_loadu_pd( rp + 9 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 8 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 0 ] += rp1[ 0 ];\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve11 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\nv2 = _mm_loadu_pd( rp - 9 ); v1 = _mm_loadu_pd( rp + 9 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 8 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 0 ] += rp1[ 0 ] + flt[ 10 ] * ( rp[ 11 ] + rp[ -10 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve12 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\nv2 = _mm_loadu_pd( rp - 9 ); v1 = _mm_loadu_pd( rp + 9 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 8 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 11 ); v3 = _mm_loadu_pd( rp + 11 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 10 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 0 ] += rp1[ 0 ];\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve13 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\nv2 = _mm_loadu_pd( rp - 9 ); v1 = _mm_loadu_pd( rp + 9 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 8 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 11 ); v3 = _mm_loadu_pd( rp + 11 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 10 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 0 ] += rp1[ 0 ] + flt[ 12 ] * ( rp[ 13 ] + rp[ -12 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve14 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\nv2 = _mm_loadu_pd( rp - 9 ); v1 = _mm_loadu_pd( rp + 9 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 8 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 11 ); v3 = _mm_loadu_pd( rp + 11 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 10 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\nv2 = _mm_loadu_pd( rp - 13 ); v1 = _mm_loadu_pd( rp + 13 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 12 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 0 ] += rp1[ 0 ];\r\nR8BHBC2\r\n\r\n#elif defined( R8B_NEON )\r\n\r\nR8BHBC1( convolve1 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve2 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nop[ 0 ] = vaddvq_f64( s1 ) + rp1[ 0 ];\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve3 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nop[ 0 ] = vaddvq_f64( s1 ) + rp1[ 0 ] + flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve4 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 0 ] = vaddvq_f64( s1 ) + rp1[ 0 ];\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve5 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 0 ] = vaddvq_f64( s1 ) + rp1[ 0 ] + flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve6 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 0 ] = vaddvq_f64( s1 ) + rp1[ 0 ];\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve7 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 0 ] = vaddvq_f64( s1 ) + rp1[ 0 ] + flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve8 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 0 ] = vaddvq_f64( s1 ) + rp1[ 0 ];\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve9 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 0 ] = vaddvq_f64( s1 ) + rp1[ 0 ] + flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve10 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 9 ); v1 = vld1q_f64( rp + 9 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 8 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 0 ] = vaddvq_f64( s1 ) + rp1[ 0 ];\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve11 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 9 ); v1 = vld1q_f64( rp + 9 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 8 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 0 ] = vaddvq_f64( s1 ) + rp1[ 0 ] + flt[ 10 ] * ( rp[ 11 ] + rp[ -10 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve12 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 9 ); v1 = vld1q_f64( rp + 9 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 8 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 11 ); v3 = vld1q_f64( rp + 11 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 10 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 0 ] = vaddvq_f64( s1 ) + rp1[ 0 ];\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve13 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 9 ); v1 = vld1q_f64( rp + 9 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 8 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 11 ); v3 = vld1q_f64( rp + 11 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 10 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 0 ] = vaddvq_f64( s1 ) + rp1[ 0 ] + flt[ 12 ] * ( rp[ 13 ] + rp[ -12 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve14 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 9 ); v1 = vld1q_f64( rp + 9 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 8 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 11 ); v3 = vld1q_f64( rp + 11 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 10 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 13 ); v1 = vld1q_f64( rp + 13 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 12 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 0 ] = vaddvq_f64( s1 ) + rp1[ 0 ];\r\nR8BHBC2\r\n\r\n#else // SIMD\r\n\r\nR8BHBC1( convolve1 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve2 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve3 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve4 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve5 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve6 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve7 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve8 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve9 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ])\r\n\t+ flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve10 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ])\r\n\t+ flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ])\r\n\t+ flt[ 9 ] * ( rp[ 10 ] + rp[ -9 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve11 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ])\r\n\t+ flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ])\r\n\t+ flt[ 9 ] * ( rp[ 10 ] + rp[ -9 ])\r\n\t+ flt[ 10 ] * ( rp[ 11 ] + rp[ -10 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve12 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ])\r\n\t+ flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ])\r\n\t+ flt[ 9 ] * ( rp[ 10 ] + rp[ -9 ])\r\n\t+ flt[ 10 ] * ( rp[ 11 ] + rp[ -10 ])\r\n\t+ flt[ 11 ] * ( rp[ 12 ] + rp[ -11 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve13 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ])\r\n\t+ flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ])\r\n\t+ flt[ 9 ] * ( rp[ 10 ] + rp[ -9 ])\r\n\t+ flt[ 10 ] * ( rp[ 11 ] + rp[ -10 ])\r\n\t+ flt[ 11 ] * ( rp[ 12 ] + rp[ -11 ])\r\n\t+ flt[ 12 ] * ( rp[ 13 ] + rp[ -12 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve14 )\r\nop[ 0 ] = rp1[ 0 ] + flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ])\r\n\t+ flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ])\r\n\t+ flt[ 9 ] * ( rp[ 10 ] + rp[ -9 ])\r\n\t+ flt[ 10 ] * ( rp[ 11 ] + rp[ -10 ])\r\n\t+ flt[ 11 ] * ( rp[ 12 ] + rp[ -11 ])\r\n\t+ flt[ 12 ] * ( rp[ 13 ] + rp[ -12 ])\r\n\t+ flt[ 13 ] * ( rp[ 14 ] + rp[ -13 ]);\r\nR8BHBC2\r\n\r\n#endif // SIMD\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/CDSPHBUpsampler.h",
    "content": "//$ nobt\r\n//$ nocpp\r\n\r\n/**\r\n * @file CDSPHBUpsampler.h\r\n *\r\n * @brief Half-band upsampling class.\r\n *\r\n * This file includes half-band upsampling class.\r\n *\r\n * r8brain-free-src Copyright (c) 2013-2025 Aleksey Vaneev\r\n *\r\n * See the \"LICENSE\" file for license.\r\n */\r\n\r\n#ifndef R8B_CDSPHBUPSAMPLER_INCLUDED\r\n#define R8B_CDSPHBUPSAMPLER_INCLUDED\r\n\r\n#include \"CDSPProcessor.h\"\r\n\r\nnamespace r8b {\r\n\r\n/**\r\n * @brief Half-band upsampling class.\r\n *\r\n * Class implements brute-force half-band 2X upsampling that uses small\r\n * sparse symmetric FIR filters. It is very efficient and should be used at\r\n * latter upsampling steps after initial steep 2X upsampling.\r\n */\r\n\r\nclass CDSPHBUpsampler : public CDSPProcessor {\r\n public:\r\n  /**\r\n\t * @brief Provides filter data for various steepness indices and\r\n\t * attenuations.\r\n\t *\r\n\t * @param ReqAtten Required half-band filter attentuation.\r\n\t * @param SteepIndex Steepness index - 0=steepest. Corresponds to general\r\n\t * upsampling/downsampling ratio, e.g., at 4x 0 is used, at 8x 1 is used,\r\n\t * etc.\r\n\t * @param[out] flt Resulting pointer to filter taps.\r\n\t * @param[out] fltt Resulting filter's half-length, in samples (taps).\r\n\t * @param[out] att Resulting filter's attenuation (the closest found).\r\n\t */\r\n\r\n  static void getHBFilter(\r\n      const double ReqAtten,\r\n      const int SteepIndex,\r\n      const double *&flt,\r\n      int &fltt,\r\n      double &att) {\r\n    static const double HBKernel_4A[4] = {\r\n        // -54.5176 dB, 4\r\n        6.1729335650971517e-001,\r\n        -1.5963945620743250e-001,\r\n        5.5073370934086312e-002,\r\n        -1.4603578989932850e-002,\r\n    };\r\n    static const double HBKernel_5A[5] = {\r\n        // -66.3075 dB, 4\r\n        6.2068807424902472e-001,\r\n        -1.6827573634467302e-001,\r\n        6.5263016720721170e-002,\r\n        -2.2483331611592005e-002,\r\n        5.2917326684281110e-003,\r\n    };\r\n    static const double HBKernel_6A[6] = {\r\n        // -89.5271 dB, 4\r\n        6.2187202340480707e-001,\r\n        -1.7132842113816371e-001,\r\n        6.9019169178765674e-002,\r\n        -2.5799728312695277e-002,\r\n        7.4880112525741666e-003,\r\n        -1.2844465869952567e-003,\r\n    };\r\n    static const double HBKernel_7A[7] = {\r\n        // -105.2842 dB, 4\r\n        6.2354494135775851e-001,\r\n        -1.7571220703702045e-001,\r\n        7.4529843603968457e-002,\r\n        -3.0701736822442153e-002,\r\n        1.0716755639039573e-002,\r\n        -2.7833422930759735e-003,\r\n        4.1118797093875510e-004,\r\n    };\r\n    static const double HBKernel_8A[8] = {\r\n        // -121.0063 dB, 4\r\n        6.2488363107953926e-001,\r\n        -1.7924942606514119e-001,\r\n        7.9068155655640557e-002,\r\n        -3.4907523415495731e-002,\r\n        1.3710256799907897e-002,\r\n        -4.3991142586987933e-003,\r\n        1.0259190163889602e-003,\r\n        -1.3278941979339359e-004,\r\n    };\r\n    static const double HBKernel_9A[9] = {\r\n        // -136.6982 dB, 4\r\n        6.2597763804021977e-001,\r\n        -1.8216414325139055e-001,\r\n        8.2879104876726728e-002,\r\n        -3.8563442248249404e-002,\r\n        1.6471530499739394e-002,\r\n        -6.0489108881335227e-003,\r\n        1.7805283804140392e-003,\r\n        -3.7533200112729561e-004,\r\n        4.3172840558735476e-005,\r\n    };\r\n    static const double HBKernel_10A[10] = {\r\n        // -152.3572 dB, 4\r\n        6.2688767582974092e-001,\r\n        -1.8460766807559420e-001,\r\n        8.6128943000481864e-002,\r\n        -4.1774474147006607e-002,\r\n        1.9014801985747346e-002,\r\n        -7.6870397465866507e-003,\r\n        2.6264590175341853e-003,\r\n        -7.1106660285478562e-004,\r\n        1.3645852036179345e-004,\r\n        -1.4113888783332969e-005,\r\n    };\r\n    static const double HBKernel_11A[11] = {\r\n        // -183.7962 dB, 4\r\n        6.2667167706948146e-001,\r\n        -1.8407153342635879e-001,\r\n        8.5529995610836046e-002,\r\n        -4.1346831462361310e-002,\r\n        1.8844831691322637e-002,\r\n        -7.7125170365394992e-003,\r\n        2.7268674860562087e-003,\r\n        -7.9745028501057233e-004,\r\n        1.8116344606360795e-004,\r\n        -2.8569149754241848e-005,\r\n        2.3667022010173616e-006,\r\n    };\r\n    static const double HBKernel_12A[12] = {\r\n        // -199.4768 dB, 4\r\n        6.2747849730367999e-001,\r\n        -1.8623616784506747e-001,\r\n        8.8409755898467945e-002,\r\n        -4.4207468821462342e-002,\r\n        2.1149175945115381e-002,\r\n        -9.2551508371115209e-003,\r\n        3.5871562170822330e-003,\r\n        -1.1923167653750219e-003,\r\n        3.2627812189920129e-004,\r\n        -6.9106902511490413e-005,\r\n        1.0122897863125124e-005,\r\n        -7.7531878906846174e-007,\r\n    };\r\n    static const double HBKernel_13A[13] = {\r\n        // -215.1364 dB, 4\r\n        6.2816416252367324e-001,\r\n        -1.8809076955230414e-001,\r\n        9.0918539867353029e-002,\r\n        -4.6765502683599310e-002,\r\n        2.3287520498995663e-002,\r\n        -1.0760627245014184e-002,\r\n        4.4853922948425683e-003,\r\n        -1.6438775426910800e-003,\r\n        5.1441312354764978e-004,\r\n        -1.3211725685765050e-004,\r\n        2.6191319837779187e-005,\r\n        -3.5802430606313093e-006,\r\n        2.5491278270628601e-007,\r\n    };\r\n    static const double HBKernel_14A[14] = {\r\n        // -230.7526 dB, 4\r\n        6.2875473120929948e-001,\r\n        -1.8969941936903847e-001,\r\n        9.3126094480960403e-002,\r\n        -4.9067251179869126e-002,\r\n        2.5273008851199916e-002,\r\n        -1.2218646153393291e-002,\r\n        5.4048942085580280e-003,\r\n        -2.1409919546078581e-003,\r\n        7.4250292812927973e-004,\r\n        -2.1924542206832172e-004,\r\n        5.3015808983125091e-005,\r\n        -9.8743034923598196e-006,\r\n        1.2650391141650221e-006,\r\n        -8.4146674637474946e-008,\r\n    };\r\n    static const int FltCountA = 11;\r\n    static const int FlttBaseA = 4;\r\n    static const double FltAttensA[FltCountA] = {\r\n        54.5176,\r\n        66.3075,\r\n        89.5271,\r\n        105.2842,\r\n        121.0063,\r\n        136.6982,\r\n        152.3572,\r\n        183.7962,\r\n        199.4768,\r\n        215.1364,\r\n        230.7526,\r\n    };\r\n    static const double *const FltPtrsA[FltCountA] = {\r\n        HBKernel_4A,\r\n        HBKernel_5A,\r\n        HBKernel_6A,\r\n        HBKernel_7A,\r\n        HBKernel_8A,\r\n        HBKernel_9A,\r\n        HBKernel_10A,\r\n        HBKernel_11A,\r\n        HBKernel_12A,\r\n        HBKernel_13A,\r\n        HBKernel_14A,\r\n    };\r\n    static const double HBKernel_2B[2] = {\r\n        // -56.6007 dB, 8\r\n        5.7361525854329076e-001,\r\n        -7.5092074924827903e-002,\r\n    };\r\n    static const double HBKernel_3B[3] = {\r\n        // -83.0295 dB, 8\r\n        5.9277038608066912e-001,\r\n        -1.0851340190268854e-001,\r\n        1.5813570475513079e-002,\r\n    };\r\n    static const double HBKernel_4B[4] = {\r\n        // -123.4724 dB, 8\r\n        6.0140277542879617e-001,\r\n        -1.2564483854574138e-001,\r\n        2.7446500598038322e-002,\r\n        -3.2051079559057435e-003,\r\n    };\r\n    static const double HBKernel_5B[5] = {\r\n        // -152.4411 dB, 8\r\n        6.0818642429088932e-001,\r\n        -1.3981140187175697e-001,\r\n        3.8489164054503623e-002,\r\n        -7.6218861797853104e-003,\r\n        7.5772358130952392e-004,\r\n    };\r\n    static const double HBKernel_6B[6] = {\r\n        // -181.2501 dB, 8\r\n        6.1278392271464355e-001,\r\n        -1.5000053762513338e-001,\r\n        4.7575323511364960e-002,\r\n        -1.2320702802243476e-002,\r\n        2.1462442592348487e-003,\r\n        -1.8425092381892940e-004,\r\n    };\r\n    static const double HBKernel_7B[7] = {\r\n        // -209.9472 dB, 8\r\n        6.1610372263478952e-001,\r\n        -1.5767891882524138e-001,\r\n        5.5089691170294691e-002,\r\n        -1.6895755656366061e-002,\r\n        3.9416643438213977e-003,\r\n        -6.0603623791604668e-004,\r\n        4.5632602433393365e-005,\r\n    };\r\n    static const double HBKernel_8B[8] = {\r\n        // -238.5616 dB, 8\r\n        6.1861282914465976e-001,\r\n        -1.6367179451225150e-001,\r\n        6.1369861342939716e-002,\r\n        -2.1184466539006987e-002,\r\n        5.9623357510842061e-003,\r\n        -1.2483098507454090e-003,\r\n        1.7099297537964702e-004,\r\n        -1.1448313239478885e-005,\r\n    };\r\n    static const int FltCountB = 7;\r\n    static const int FlttBaseB = 2;\r\n    static const double FltAttensB[FltCountB] = {\r\n        56.6007,\r\n        83.0295,\r\n        123.4724,\r\n        152.4411,\r\n        181.2501,\r\n        209.9472,\r\n        238.5616,\r\n    };\r\n    static const double *const FltPtrsB[FltCountB] = {\r\n        HBKernel_2B,\r\n        HBKernel_3B,\r\n        HBKernel_4B,\r\n        HBKernel_5B,\r\n        HBKernel_6B,\r\n        HBKernel_7B,\r\n        HBKernel_8B,\r\n    };\r\n    static const double HBKernel_2C[2] = {\r\n        // -89.0473 dB, 16\r\n        5.6430278013478008e-001,\r\n        -6.4338068855763375e-002,\r\n    };\r\n    static const double HBKernel_3C[3] = {\r\n        // -130.8951 dB, 16\r\n        5.8706402915551448e-001,\r\n        -9.9362380958670449e-002,\r\n        1.2298637065869358e-002,\r\n    };\r\n    static const double HBKernel_4C[4] = {\r\n        // -172.3192 dB, 16\r\n        5.9896586134984675e-001,\r\n        -1.2111680603434927e-001,\r\n        2.4763118076458895e-002,\r\n        -2.6121758132212989e-003,\r\n    };\r\n    static const double HBKernel_5C[5] = {\r\n        // -213.4984 dB, 16\r\n        6.0626808285230716e-001,\r\n        -1.3588224032740795e-001,\r\n        3.5544305238309003e-002,\r\n        -6.5127022377289654e-003,\r\n        5.8255449565950768e-004,\r\n    };\r\n    static const double HBKernel_6C[6] = {\r\n        // -254.5186 dB, 16\r\n        6.1120171263351242e-001,\r\n        -1.4654486853757870e-001,\r\n        4.4582959299131253e-002,\r\n        -1.0840543858123995e-002,\r\n        1.7343706485509962e-003,\r\n        -1.3363018567985596e-004,\r\n    };\r\n    static const int FltCountC = 5;\r\n    static const int FlttBaseC = 2;\r\n    static const double FltAttensC[FltCountC] = {\r\n        89.0473,\r\n        130.8951,\r\n        172.3192,\r\n        213.4984,\r\n        254.5186,\r\n    };\r\n    static const double *const FltPtrsC[FltCountC] = {\r\n        HBKernel_2C,\r\n        HBKernel_3C,\r\n        HBKernel_4C,\r\n        HBKernel_5C,\r\n        HBKernel_6C,\r\n    };\r\n    static const double HBKernel_1D[1] = {\r\n        // -54.4754 dB, 32\r\n        5.0188900022775451e-001,\r\n    };\r\n    static const double HBKernel_2D[2] = {\r\n        // -113.2139 dB, 32\r\n        5.6295152180538044e-001,\r\n        -6.2953706070191726e-002,\r\n    };\r\n    static const double HBKernel_3D[3] = {\r\n        // -167.1447 dB, 32\r\n        5.8621968728755036e-001,\r\n        -9.8080551656524531e-002,\r\n        1.1860868761997080e-002,\r\n    };\r\n    static const double HBKernel_4D[4] = {\r\n        // -220.6519 dB, 32\r\n        5.9835028657163591e-001,\r\n        -1.1999986086623511e-001,\r\n        2.4132530854004228e-002,\r\n        -2.4829565686819706e-003,\r\n    };\r\n    static const int FltCountD = 4;\r\n    static const int FlttBaseD = 1;\r\n    static const double FltAttensD[FltCountD] = {\r\n        54.4754,\r\n        113.2139,\r\n        167.1447,\r\n        220.6519,\r\n    };\r\n    static const double *const FltPtrsD[FltCountD] = {\r\n        HBKernel_1D,\r\n        HBKernel_2D,\r\n        HBKernel_3D,\r\n        HBKernel_4D,\r\n    };\r\n    static const double HBKernel_1E[1] = {\r\n        // -66.5391 dB, 64\r\n        5.0047102586416625e-001,\r\n    };\r\n    static const double HBKernel_2E[2] = {\r\n        // -137.3173 dB, 64\r\n        5.6261293163933568e-001,\r\n        -6.2613067826620017e-002,\r\n    };\r\n    static const double HBKernel_3E[3] = {\r\n        // -203.2997 dB, 64\r\n        5.8600808139396787e-001,\r\n        -9.7762185880067784e-002,\r\n        1.1754104554493029e-002,\r\n    };\r\n    static const double HBKernel_4E[4] = {\r\n        // -268.8550 dB, 64\r\n        5.9819599352772002e-001,\r\n        -1.1972157555011861e-001,\r\n        2.3977305567947922e-002,\r\n        -2.4517235455853992e-003,\r\n    };\r\n    static const int FltCountE = 4;\r\n    static const int FlttBaseE = 1;\r\n    static const double FltAttensE[FltCountE] = {\r\n        66.5391,\r\n        137.3173,\r\n        203.2997,\r\n        268.8550,\r\n    };\r\n    static const double *const FltPtrsE[FltCountE] = {\r\n        HBKernel_1E,\r\n        HBKernel_2E,\r\n        HBKernel_3E,\r\n        HBKernel_4E,\r\n    };\r\n    static const double HBKernel_1F[1] = {\r\n        // -82.4633 dB, 128\r\n        5.0007530666642896e-001,\r\n    };\r\n    static const double HBKernel_2F[2] = {\r\n        // -161.4049 dB, 128\r\n        5.6252823610146030e-001,\r\n        -6.2528244608044792e-002,\r\n    };\r\n    static const double HBKernel_3F[3] = {\r\n        // -239.4313 dB, 128\r\n        5.8595514744674237e-001,\r\n        -9.7682725156791952e-002,\r\n        1.1727577711117231e-002,\r\n    };\r\n    static const int FltCountF = 3;\r\n    static const int FlttBaseF = 1;\r\n    static const double FltAttensF[FltCountF] = {\r\n        82.4633,\r\n        161.4049,\r\n        239.4313,\r\n    };\r\n    static const double *const FltPtrsF[FltCountF] = {\r\n        HBKernel_1F,\r\n        HBKernel_2F,\r\n        HBKernel_3F,\r\n    };\r\n    static const double HBKernel_1G[1] = {\r\n        // -94.5052 dB, 256\r\n        5.0001882524896712e-001,\r\n    };\r\n    static const double HBKernel_2G[2] = {\r\n        // -185.4886 dB, 256\r\n        5.6250705922479682e-001,\r\n        -6.2507059756378394e-002,\r\n    };\r\n    static const double HBKernel_3G[3] = {\r\n        // -275.5501 dB, 256\r\n        5.8594191201187384e-001,\r\n        -9.7662868266991207e-002,\r\n        1.1720956255134043e-002,\r\n    };\r\n    static const int FltCountG = 3;\r\n    static const int FlttBaseG = 1;\r\n    static const double FltAttensG[FltCountG] = {\r\n        94.5052,\r\n        185.4886,\r\n        275.5501,\r\n    };\r\n    static const double *const FltPtrsG[FltCountG] = {\r\n        HBKernel_1G,\r\n        HBKernel_2G,\r\n        HBKernel_3G,\r\n    };\r\n\r\n    int k = 0;\r\n\r\n    if (SteepIndex <= 0) {\r\n      while (k != FltCountA - 1 && FltAttensA[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsA[k];\r\n      fltt = FlttBaseA + k;\r\n      att = FltAttensA[k];\r\n    } else if (SteepIndex == 1) {\r\n      while (k != FltCountB - 1 && FltAttensB[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsB[k];\r\n      fltt = FlttBaseB + k;\r\n      att = FltAttensB[k];\r\n    } else if (SteepIndex == 2) {\r\n      while (k != FltCountC - 1 && FltAttensC[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsC[k];\r\n      fltt = FlttBaseC + k;\r\n      att = FltAttensC[k];\r\n    } else if (SteepIndex == 3) {\r\n      while (k != FltCountD - 1 && FltAttensD[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsD[k];\r\n      fltt = FlttBaseD + k;\r\n      att = FltAttensD[k];\r\n    } else if (SteepIndex == 4) {\r\n      while (k != FltCountE - 1 && FltAttensE[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsE[k];\r\n      fltt = FlttBaseE + k;\r\n      att = FltAttensE[k];\r\n    } else if (SteepIndex == 5) {\r\n      while (k != FltCountF - 1 && FltAttensF[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsF[k];\r\n      fltt = FlttBaseF + k;\r\n      att = FltAttensF[k];\r\n    } else {\r\n      while (k != FltCountG - 1 && FltAttensG[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsG[k];\r\n      fltt = FlttBaseG + k;\r\n      att = FltAttensG[k];\r\n    }\r\n  }\r\n\r\n  /**\r\n\t * @brief Provides filter data for various steepness indices and\r\n\t * attenuations. For 1/3 resamplings.\r\n\t *\r\n\t * @param ReqAtten Required half-band filter attentuation.\r\n\t * @param SteepIndex Steepness index - 0=steepest. Corresponds to general\r\n\t * upsampling/downsampling ratio, e.g., at 4x 0 is used, at 8x 1 is used,\r\n\t * etc.\r\n\t * @param[out] flt Resulting pointer to filter taps.\r\n\t * @param[out] fltt Resulting filter's half-length, in samples (taps).\r\n\t * @param[out] att Resulting filter's attenuation (the closest found).\r\n\t */\r\n\r\n  static void getHBFilterThird(\r\n      const double ReqAtten,\r\n      const int SteepIndex,\r\n      const double *&flt,\r\n      int &fltt,\r\n      double &att) {\r\n    static const double HBKernel_3A[3] = {\r\n        // -66.3726 dB, 6\r\n        5.9811355069551475e-001,\r\n        -1.1793396656733847e-001,\r\n        2.0300557211946322e-002,\r\n    };\r\n    static const double HBKernel_4A[4] = {\r\n        // -90.2546 dB, 6\r\n        6.0645499250612578e-001,\r\n        -1.3555496505481171e-001,\r\n        3.4022804962365975e-002,\r\n        -4.9535418595798757e-003,\r\n    };\r\n    static const double HBKernel_5A[5] = {\r\n        // -126.5507 dB, 6\r\n        6.1014115058940210e-001,\r\n        -1.4393081816629907e-001,\r\n        4.1760642892852244e-002,\r\n        -8.9692183234056175e-003,\r\n        9.9871340618342070e-004,\r\n    };\r\n    static const double HBKernel_6A[6] = {\r\n        // -150.1839 dB, 6\r\n        6.1439563420546972e-001,\r\n        -1.5360187826905250e-001,\r\n        5.0840891345687034e-002,\r\n        -1.4053648740561121e-002,\r\n        2.6771286587305727e-003,\r\n        -2.5815816044823123e-004,\r\n    };\r\n    static const double HBKernel_7A[7] = {\r\n        // -173.7068 dB, 6\r\n        6.1747493476329918e-001,\r\n        -1.6087373733313212e-001,\r\n        5.8263075641409430e-002,\r\n        -1.8872408173431318e-002,\r\n        4.7421376543513687e-003,\r\n        -8.0196529612267474e-004,\r\n        6.7964807393798996e-005,\r\n    };\r\n    static const double HBKernel_8A[8] = {\r\n        // -197.1454 dB, 6\r\n        6.1980610947775050e-001,\r\n        -1.6654070578314714e-001,\r\n        6.4416567441730327e-002,\r\n        -2.3307744348719822e-002,\r\n        6.9909157372312443e-003,\r\n        -1.5871946293364403e-003,\r\n        2.4017727382382763e-004,\r\n        -1.8125308241541697e-005,\r\n    };\r\n    static const double HBKernel_9A[9] = {\r\n        // -220.5199 dB, 6\r\n        6.2163188951899306e-001,\r\n        -1.7108115323810941e-001,\r\n        6.9588370095600260e-002,\r\n        -2.7339625080613838e-002,\r\n        9.2954469183791771e-003,\r\n        -2.5537179959555429e-003,\r\n        5.2572290897951021e-004,\r\n        -7.1813356135154921e-005,\r\n        4.8802382808892154e-006,\r\n    };\r\n    static const int FltCountA = 7;\r\n    static const int FlttBaseA = 3;\r\n    static const double FltAttensA[FltCountA] = {\r\n        66.3726,\r\n        90.2546,\r\n        126.5507,\r\n        150.1839,\r\n        173.7068,\r\n        197.1454,\r\n        220.5199,\r\n    };\r\n    static const double *const FltPtrsA[FltCountA] = {\r\n        HBKernel_3A,\r\n        HBKernel_4A,\r\n        HBKernel_5A,\r\n        HBKernel_6A,\r\n        HBKernel_7A,\r\n        HBKernel_8A,\r\n        HBKernel_9A,\r\n    };\r\n    static const double HBKernel_2B[2] = {\r\n        // -71.0965 dB, 12\r\n        5.6748544264806311e-001,\r\n        -6.7764090509431732e-002,\r\n    };\r\n    static const double HBKernel_3B[3] = {\r\n        // -115.7707 dB, 12\r\n        5.8793612182667199e-001,\r\n        -1.0070583248877293e-001,\r\n        1.2771337947163834e-002,\r\n    };\r\n    static const double HBKernel_4B[4] = {\r\n        // -152.1535 dB, 12\r\n        5.9960155600862808e-001,\r\n        -1.2228154335199336e-001,\r\n        2.5433718917694709e-002,\r\n        -2.7537562530837154e-003,\r\n    };\r\n    static const double HBKernel_5B[5] = {\r\n        // -188.2914 dB, 12\r\n        6.0676859170554343e-001,\r\n        -1.3689667009876413e-001,\r\n        3.6288512631926818e-002,\r\n        -6.7838855305035351e-003,\r\n        6.2345167677087547e-004,\r\n    };\r\n    static const double HBKernel_6B[6] = {\r\n        // -224.2705 dB, 12\r\n        6.1161456341904397e-001,\r\n        -1.4743901958274458e-001,\r\n        4.5344160157313275e-002,\r\n        -1.1207371780924531e-002,\r\n        1.8328497112594935e-003,\r\n        -1.4518193006359589e-004,\r\n    };\r\n    static const int FltCountB = 5;\r\n    static const int FlttBaseB = 2;\r\n    static const double FltAttensB[FltCountB] = {\r\n        71.0965,\r\n        115.7707,\r\n        152.1535,\r\n        188.2914,\r\n        224.2705,\r\n    };\r\n    static const double *const FltPtrsB[FltCountB] = {\r\n        HBKernel_2B,\r\n        HBKernel_3B,\r\n        HBKernel_4B,\r\n        HBKernel_5B,\r\n        HBKernel_6B,\r\n    };\r\n    static const double HBKernel_1C[1] = {\r\n        // -49.4544 dB, 24\r\n        5.0336730531430562e-001,\r\n    };\r\n    static const double HBKernel_2C[2] = {\r\n        // -103.1970 dB, 24\r\n        5.6330232648142819e-001,\r\n        -6.3309247177420452e-002,\r\n    };\r\n    static const double HBKernel_3C[3] = {\r\n        // -152.1195 dB, 24\r\n        5.8643891113580415e-001,\r\n        -9.8411593011583087e-002,\r\n        1.1972706651483846e-002,\r\n    };\r\n    static const double HBKernel_4C[4] = {\r\n        // -200.6182 dB, 24\r\n        5.9851012363917222e-001,\r\n        -1.2028885239978220e-001,\r\n        2.4294521083140615e-002,\r\n        -2.5157924156609776e-003,\r\n    };\r\n    static const double HBKernel_5C[5] = {\r\n        // -248.8730 dB, 24\r\n        6.0590922882030196e-001,\r\n        -1.3515953438018685e-001,\r\n        3.5020857107815606e-002,\r\n        -6.3256196990467053e-003,\r\n        5.5506815147598793e-004,\r\n    };\r\n    static const int FltCountC = 5;\r\n    static const int FlttBaseC = 1;\r\n    static const double FltAttensC[FltCountC] = {\r\n        49.4544,\r\n        103.1970,\r\n        152.1195,\r\n        200.6182,\r\n        248.8730,\r\n    };\r\n    static const double *const FltPtrsC[FltCountC] = {\r\n        HBKernel_1C,\r\n        HBKernel_2C,\r\n        HBKernel_3C,\r\n        HBKernel_4C,\r\n        HBKernel_5C,\r\n    };\r\n    static const double HBKernel_1D[1] = {\r\n        // -61.5357 dB, 48\r\n        5.0083794231068057e-001,\r\n    };\r\n    static const double HBKernel_2D[2] = {\r\n        // -127.3167 dB, 48\r\n        5.6270074379958690e-001,\r\n        -6.2701174487726344e-002,\r\n    };\r\n    static const double HBKernel_3D[3] = {\r\n        // -188.2990 dB, 48\r\n        5.8606296210323228e-001,\r\n        -9.7844644765123029e-002,\r\n        1.1781683046528768e-002,\r\n    };\r\n    static const double HBKernel_4D[4] = {\r\n        // -248.8580 dB, 48\r\n        5.9823601243162516e-001,\r\n        -1.1979368994739022e-001,\r\n        2.4017458606412575e-002,\r\n        -2.4597810910081913e-003,\r\n    };\r\n    static const int FltCountD = 4;\r\n    static const int FlttBaseD = 1;\r\n    static const double FltAttensD[FltCountD] = {\r\n        61.5357,\r\n        127.3167,\r\n        188.2990,\r\n        248.8580,\r\n    };\r\n    static const double *const FltPtrsD[FltCountD] = {\r\n        HBKernel_1D,\r\n        HBKernel_2D,\r\n        HBKernel_3D,\r\n        HBKernel_4D,\r\n    };\r\n    static const double HBKernel_1E[1] = {\r\n        // -77.4651 dB, 96\r\n        5.0013388897382527e-001,\r\n    };\r\n    static const double HBKernel_2E[2] = {\r\n        // -151.4084 dB, 96\r\n        5.6255019604317880e-001,\r\n        -6.2550222932381064e-002,\r\n    };\r\n    static const double HBKernel_3E[3] = {\r\n        // -224.4365 dB, 96\r\n        5.8596887234201078e-001,\r\n        -9.7703321113080305e-002,\r\n        1.1734448777069783e-002,\r\n    };\r\n    static const int FltCountE = 3;\r\n    static const int FlttBaseE = 1;\r\n    static const double FltAttensE[FltCountE] = {\r\n        77.4651,\r\n        151.4084,\r\n        224.4365,\r\n    };\r\n    static const double *const FltPtrsE[FltCountE] = {\r\n        HBKernel_1E,\r\n        HBKernel_2E,\r\n        HBKernel_3E,\r\n    };\r\n    static const double HBKernel_1F[1] = {\r\n        // -89.5075 dB, 192\r\n        5.0003346776264190e-001,\r\n    };\r\n    static const double HBKernel_2F[2] = {\r\n        // -175.4932 dB, 192\r\n        5.6251254964097952e-001,\r\n        -6.2512551321105267e-002,\r\n    };\r\n    static const double HBKernel_3F[3] = {\r\n        // -260.5645 dB, 192\r\n        5.8594534336747051e-001,\r\n        -9.7668015838639821e-002,\r\n        1.1722672471262996e-002,\r\n    };\r\n    static const int FltCountF = 3;\r\n    static const int FlttBaseF = 1;\r\n    static const double FltAttensF[FltCountF] = {\r\n        89.5075,\r\n        175.4932,\r\n        260.5645,\r\n    };\r\n    static const double *const FltPtrsF[FltCountF] = {\r\n        HBKernel_1F,\r\n        HBKernel_2F,\r\n        HBKernel_3F,\r\n    };\r\n    static const double HBKernel_1G[1] = {\r\n        // -101.5490 dB, 384\r\n        5.0000836666064941e-001,\r\n    };\r\n    static const double HBKernel_2G[2] = {\r\n        // -199.5761 dB, 384\r\n        5.6250313744943459e-001,\r\n        -6.2503137554435345e-002,\r\n    };\r\n    static const double HBKernel_3G[3] = {\r\n        // -296.5185 dB, 384\r\n        5.8593945786963764e-001,\r\n        -9.7659186853499613e-002,\r\n        1.1719728983863425e-002,\r\n    };\r\n    static const int FltCountG = 3;\r\n    static const int FlttBaseG = 1;\r\n    static const double FltAttensG[FltCountG] = {\r\n        101.5490,\r\n        199.5761,\r\n        296.5185,\r\n    };\r\n    static const double *const FltPtrsG[FltCountG] = {\r\n        HBKernel_1G,\r\n        HBKernel_2G,\r\n        HBKernel_3G,\r\n    };\r\n\r\n    int k = 0;\r\n\r\n    if (SteepIndex <= 0) {\r\n      while (k != FltCountA - 1 && FltAttensA[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsA[k];\r\n      fltt = FlttBaseA + k;\r\n      att = FltAttensA[k];\r\n    } else if (SteepIndex == 1) {\r\n      while (k != FltCountB - 1 && FltAttensB[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsB[k];\r\n      fltt = FlttBaseB + k;\r\n      att = FltAttensB[k];\r\n    } else if (SteepIndex == 2) {\r\n      while (k != FltCountC - 1 && FltAttensC[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsC[k];\r\n      fltt = FlttBaseC + k;\r\n      att = FltAttensC[k];\r\n    } else if (SteepIndex == 3) {\r\n      while (k != FltCountD - 1 && FltAttensD[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsD[k];\r\n      fltt = FlttBaseD + k;\r\n      att = FltAttensD[k];\r\n    } else if (SteepIndex == 4) {\r\n      while (k != FltCountE - 1 && FltAttensE[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsE[k];\r\n      fltt = FlttBaseE + k;\r\n      att = FltAttensE[k];\r\n    } else if (SteepIndex == 5) {\r\n      while (k != FltCountF - 1 && FltAttensF[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsF[k];\r\n      fltt = FlttBaseF + k;\r\n      att = FltAttensF[k];\r\n    } else {\r\n      while (k != FltCountG - 1 && FltAttensG[k] < ReqAtten) {\r\n        k++;\r\n      }\r\n\r\n      flt = FltPtrsG[k];\r\n      fltt = FlttBaseG + k;\r\n      att = FltAttensG[k];\r\n    }\r\n  }\r\n\r\n  /**\r\n\t * @brief Initalizes the half-band upsampler.\r\n\t *\r\n\t * @param ReqAtten Required half-band filter attentuation.\r\n\t * @param SteepIndex Steepness index - 0=steepest. Corresponds to general\r\n\t * upsampling ratio, e.g., at 4x upsampling 0 is used, at 8x upsampling 1\r\n\t * is used, etc.\r\n\t * @param IsThird `true` if 1/3 of frequency response resampling is\r\n\t * performed.\r\n\t * @param PrevLatency Latency, in samples (any non-negative value), which\r\n\t * was left in the output signal by a previous process. Whole-number\r\n\t * latency will be consumed by *this* object while remaining fractional\r\n\t * latency can be obtained via the getLatencyFrac() function.\r\n\t * @param aDoConsumeLatency `true` if the output latency should be\r\n\t * consumed. Does not apply to the fractional part of the latency (if such\r\n\t * part is available).\r\n\t */\r\n\r\n  CDSPHBUpsampler(\r\n      const double ReqAtten,\r\n      const int SteepIndex,\r\n      const bool IsThird,\r\n      const double PrevLatency,\r\n      const bool aDoConsumeLatency = true)\r\n      : DoConsumeLatency(aDoConsumeLatency) {\r\n    static const CConvolveFn FltConvFn[14] = {\r\n        &CDSPHBUpsampler ::convolve1,\r\n        &CDSPHBUpsampler ::convolve2,\r\n        &CDSPHBUpsampler ::convolve3,\r\n        &CDSPHBUpsampler ::convolve4,\r\n        &CDSPHBUpsampler ::convolve5,\r\n        &CDSPHBUpsampler ::convolve6,\r\n        &CDSPHBUpsampler ::convolve7,\r\n        &CDSPHBUpsampler ::convolve8,\r\n        &CDSPHBUpsampler ::convolve9,\r\n        &CDSPHBUpsampler ::convolve10,\r\n        &CDSPHBUpsampler ::convolve11,\r\n        &CDSPHBUpsampler ::convolve12,\r\n        &CDSPHBUpsampler ::convolve13,\r\n        &CDSPHBUpsampler ::convolve14};\r\n\r\n    const double *fltp0;\r\n    int fltt;\r\n    double att;\r\n\r\n    if (IsThird) {\r\n      getHBFilterThird(ReqAtten, SteepIndex, fltp0, fltt, att);\r\n    } else {\r\n      getHBFilter(ReqAtten, SteepIndex, fltp0, fltt, att);\r\n    }\r\n\r\n    // Copy obtained filter to address-aligned buffer.\r\n\r\n    fltp = alignptr(FltBuf, 16);\r\n    memcpy(fltp, fltp0, (size_t)fltt * sizeof(fltp[0]));\r\n\r\n    convfn = FltConvFn[fltt - 1];\r\n    fll = fltt - 1;\r\n    fl2 = fltt;\r\n    flo = fll + fl2;\r\n    BufRP = Buf + fll;\r\n\r\n    LatencyFrac = PrevLatency * 2.0;\r\n    Latency = (int)LatencyFrac;\r\n    LatencyFrac -= Latency;\r\n\r\n    R8BASSERT(Latency >= 0);\r\n\r\n    if (DoConsumeLatency) {\r\n      flb = BufLen - fll;\r\n    } else {\r\n      Latency += fl2 + fl2;\r\n      flb = BufLen - flo;\r\n    }\r\n\r\n    R8BCONSOLE(\r\n        \"CDSPHBUpsampler: sti=%i third=%i taps=%i att=%.1f \"\r\n        \"io=2/1\\n\",\r\n        SteepIndex,\r\n        (int)IsThird,\r\n        fltt,\r\n        att);\r\n\r\n    clear();\r\n  }\r\n\r\n  virtual int getInLenBeforeOutPos(const int ReqOutPos) const {\r\n    return (fl2 + (int)((Latency + LatencyFrac + ReqOutPos) * 0.5));\r\n  }\r\n\r\n  virtual int getLatency() const {\r\n    return (DoConsumeLatency ? 0 : Latency);\r\n  }\r\n\r\n  virtual double getLatencyFrac() const {\r\n    return (LatencyFrac);\r\n  }\r\n\r\n  virtual int getMaxOutLen(const int MaxInLen) const {\r\n    R8BASSERT(MaxInLen >= 0);\r\n\r\n    return (MaxInLen * 2);\r\n  }\r\n\r\n  virtual void clear() {\r\n    if (DoConsumeLatency) {\r\n      LatencyLeft = Latency;\r\n      BufLeft = 0;\r\n    } else {\r\n      LatencyLeft = 0;\r\n      BufLeft = fl2;\r\n    }\r\n\r\n    WritePos = 0;\r\n    ReadPos = flb; // Set \"read\" position to account for filter's latency.\r\n\r\n    memset(&Buf[ReadPos], 0, (size_t)(BufLen - flb) * sizeof(Buf[0]));\r\n  }\r\n\r\n  virtual int process(double *ip, int l, double *&op0) {\r\n    R8BASSERT(l >= 0);\r\n\r\n    double *op = op0;\r\n\r\n    while (l > 0) {\r\n      // Copy new input samples to the ring buffer.\r\n\r\n      const int b = min(l, min(BufLen - WritePos, flb - BufLeft));\r\n\r\n      double *const wp1 = Buf + WritePos;\r\n      memcpy(wp1, ip, (size_t)b * sizeof(wp1[0]));\r\n      const int ec = flo - WritePos;\r\n\r\n      if (ec > 0) {\r\n        memcpy(wp1 + BufLen, ip, (size_t)min(b, ec) * sizeof(wp1[0]));\r\n      }\r\n\r\n      ip += b;\r\n      WritePos = (WritePos + b) & BufLenMask;\r\n      l -= b;\r\n      BufLeft += b;\r\n\r\n      // Produce output.\r\n\r\n      const int c = BufLeft - fl2;\r\n\r\n      if (c > 0) {\r\n        double *const opend = op + c * 2;\r\n        (*convfn)(op, opend, fltp, BufRP, ReadPos);\r\n\r\n        op = opend;\r\n        ReadPos = (ReadPos + c) & BufLenMask;\r\n        BufLeft -= c;\r\n      }\r\n    }\r\n\r\n    int ol = (int)(op - op0);\r\n\r\n    if (LatencyLeft != 0) {\r\n      if (LatencyLeft >= ol) {\r\n        LatencyLeft -= ol;\r\n        return (0);\r\n      }\r\n\r\n      ol -= LatencyLeft;\r\n      op0 += LatencyLeft;\r\n      LatencyLeft = 0;\r\n    }\r\n\r\n    return (ol);\r\n  }\r\n\r\n private:\r\n  static const int BufLenBits = 9; ///< The length of the ring buffer,\r\n  ///< expressed as Nth power of 2. This value can be reduced if it is\r\n  ///< known that only short input buffers will be passed to the\r\n  ///< interpolator. The minimum value of this parameter is 5, and\r\n  ///< `1 << BufLenBits` should be at least 3 times larger than the\r\n  ///< FilterLen.\r\n  static const int BufLen = 1 << BufLenBits; ///< The length of the ring\r\n  ///< buffer. The actual length is longer, to permit \"beyond bounds\"\r\n  ///< positioning.\r\n  static const int BufLenMask = BufLen - 1; ///< Mask used for quick buffer\r\n                                            ///< position wrapping.\r\n  double Buf[BufLen + 27];                  ///< The ring buffer, including overrun\r\n                                            ///< protection for the largest filter.\r\n  double FltBuf[14 + 2];                    ///< Holder for half-band filter taps, used with\r\n                                            ///< 16-byte address-aligning, for SIMD use.\r\n  const double *BufRP;                      ///< Offseted Buf pointer at `ReadPos` equal 0.\r\n  double *fltp;                             ///< Half-band filter taps, points to `FltBuf`.\r\n  int fll;                                  ///< Input latency (left-hand filter length).\r\n  int fl2;                                  ///< Right-side filter length.\r\n  int flo;                                  ///< Overrrun length.\r\n  int flb;                                  ///< Initial buffer read position.\r\n  double LatencyFrac;                       ///< Fractional latency left on the output.\r\n  int Latency;           ///< Initial latency that should be removed from the output.\r\n  int LatencyLeft;       ///< Latency left to remove.\r\n  int BufLeft;           ///< The number of samples left in the buffer to process.\r\n                         ///< When this value is below `fl2`, the interpolation cycle ends.\r\n  int WritePos;          ///< The current buffer write position. Incremented together\r\n                         ///< with the `BufLeft` variable.\r\n  int ReadPos;           ///< The current buffer read position.\r\n  bool DoConsumeLatency; ///< `true` if the output latency should be\r\n                         ///< consumed. Does not apply to the fractional part of the latency\r\n                         ///< (if such part is available).\r\n\r\n  typedef void (*CConvolveFn)(\r\n      double *op,\r\n      double *const opend,\r\n      const double *const flt,\r\n      const double *const rp0,\r\n      int rpos);      ///<\r\n                      ///< Convolution function type.\r\n  CConvolveFn convfn; ///< Convolution function in use.\r\n\r\n#define R8BHBC1(fn) \\\r\n  static void fn( \\\r\n      double *op, \\\r\n      double *const opend, \\\r\n      const double *const flt, \\\r\n      const double *const rp0, \\\r\n      int rpos) { \\\r\n    while (op != opend) { \\\r\n      const double *const rp = rp0 + rpos; \\\r\n      op[0] = rp[0];\r\n\r\n#define R8BHBC2 \\\r\n  rpos = (rpos + 1) & BufLenMask; \\\r\n  op += 2; \\\r\n  } \\\r\n  }\r\n\r\n#include \"CDSPHBUpsampler.inc\"\r\n\r\n#undef R8BHBC1\r\n#undef R8BHBC2\r\n};\r\n\r\n// ---------------------------------------------------------------------------\r\n\r\n} // namespace r8b\r\n\r\n#endif // R8B_CDSPHBUPSAMPLER_INCLUDED\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/CDSPHBUpsampler.inc",
    "content": "// Auto-generated by `genhbc`, do not edit!\r\n\r\n#if defined( R8B_SSE2 )\r\n\r\nR8BHBC1( convolve1 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve2 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n_mm_storel_pd( op + 1, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve3 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n_mm_storel_pd( op + 1, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 1 ] += flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve4 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op + 1, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve5 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op + 1, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 1 ] += flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve6 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op + 1, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve7 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op + 1, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 1 ] += flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve8 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op + 1, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve9 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op + 1, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 1 ] += flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve10 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\nv2 = _mm_loadu_pd( rp - 9 ); v1 = _mm_loadu_pd( rp + 9 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 8 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op + 1, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve11 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\nv2 = _mm_loadu_pd( rp - 9 ); v1 = _mm_loadu_pd( rp + 9 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 8 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op + 1, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 1 ] += flt[ 10 ] * ( rp[ 11 ] + rp[ -10 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve12 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\nv2 = _mm_loadu_pd( rp - 9 ); v1 = _mm_loadu_pd( rp + 9 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 8 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 11 ); v3 = _mm_loadu_pd( rp + 11 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 10 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op + 1, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve13 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\nv2 = _mm_loadu_pd( rp - 9 ); v1 = _mm_loadu_pd( rp + 9 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 8 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 11 ); v3 = _mm_loadu_pd( rp + 11 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 10 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op + 1, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nop[ 1 ] += flt[ 12 ] * ( rp[ 13 ] + rp[ -12 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve14 )\r\n__m128d v1, v2, m1, s1;\r\nv2 = _mm_loadu_pd( rp - 1 ); v1 = _mm_loadu_pd( rp + 1 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 0 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = m1;\r\n__m128d v3, v4, m3, s3;\r\nv4 = _mm_loadu_pd( rp - 3 ); v3 = _mm_loadu_pd( rp + 3 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 2 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = m3;\r\nv2 = _mm_loadu_pd( rp - 5 ); v1 = _mm_loadu_pd( rp + 5 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 4 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 7 ); v3 = _mm_loadu_pd( rp + 7 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 6 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\nv2 = _mm_loadu_pd( rp - 9 ); v1 = _mm_loadu_pd( rp + 9 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 8 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\nv4 = _mm_loadu_pd( rp - 11 ); v3 = _mm_loadu_pd( rp + 11 );\r\nm3 = _mm_mul_pd( _mm_load_pd( flt + 10 ),\r\n\t_mm_add_pd( v3, _mm_shuffle_pd( v4, v4, 1 )));\r\ns3 = _mm_add_pd( s3, m3 );\r\nv2 = _mm_loadu_pd( rp - 13 ); v1 = _mm_loadu_pd( rp + 13 );\r\nm1 = _mm_mul_pd( _mm_load_pd( flt + 12 ),\r\n\t_mm_add_pd( v1, _mm_shuffle_pd( v2, v2, 1 )));\r\ns1 = _mm_add_pd( s1, m1 );\r\ns1 = _mm_add_pd( s1, s3 );\r\n_mm_storel_pd( op + 1, _mm_add_pd( s1, _mm_shuffle_pd( s1, s1, 1 )));\r\nR8BHBC2\r\n\r\n#elif defined( R8B_NEON )\r\n\r\nR8BHBC1( convolve1 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve2 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nop[ 1 ] = vaddvq_f64( s1 );\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve3 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nop[ 1 ] = vaddvq_f64( s1 ) + flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve4 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 1 ] = vaddvq_f64( s1 );\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve5 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 1 ] = vaddvq_f64( s1 ) + flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve6 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 1 ] = vaddvq_f64( s1 );\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve7 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 1 ] = vaddvq_f64( s1 ) + flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve8 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 1 ] = vaddvq_f64( s1 );\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve9 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 1 ] = vaddvq_f64( s1 ) + flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve10 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 9 ); v1 = vld1q_f64( rp + 9 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 8 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 1 ] = vaddvq_f64( s1 );\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve11 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 9 ); v1 = vld1q_f64( rp + 9 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 8 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 1 ] = vaddvq_f64( s1 ) + flt[ 10 ] * ( rp[ 11 ] + rp[ -10 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve12 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 9 ); v1 = vld1q_f64( rp + 9 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 8 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 11 ); v3 = vld1q_f64( rp + 11 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 10 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 1 ] = vaddvq_f64( s1 );\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve13 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 9 ); v1 = vld1q_f64( rp + 9 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 8 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 11 ); v3 = vld1q_f64( rp + 11 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 10 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 1 ] = vaddvq_f64( s1 ) + flt[ 12 ] * ( rp[ 13 ] + rp[ -12 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve14 )\r\nfloat64x2_t v1, v2, s1;\r\ns1 = vdupq_n_f64( 0.0 );\r\nv2 = vld1q_f64( rp - 1 ); v1 = vld1q_f64( rp + 1 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 0 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nfloat64x2_t v3, v4, s3;\r\ns3 = vdupq_n_f64( 0.0 );\r\nv4 = vld1q_f64( rp - 3 ); v3 = vld1q_f64( rp + 3 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 2 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 5 ); v1 = vld1q_f64( rp + 5 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 4 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 7 ); v3 = vld1q_f64( rp + 7 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 6 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 9 ); v1 = vld1q_f64( rp + 9 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 8 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\nv4 = vld1q_f64( rp - 11 ); v3 = vld1q_f64( rp + 11 );\r\ns3 = vmlaq_f64( s3, vld1q_f64( flt + 10 ),\r\n\tvaddq_f64( v3, vextq_f64( v4, v4, 1 )));\r\nv2 = vld1q_f64( rp - 13 ); v1 = vld1q_f64( rp + 13 );\r\ns1 = vmlaq_f64( s1, vld1q_f64( flt + 12 ),\r\n\tvaddq_f64( v1, vextq_f64( v2, v2, 1 )));\r\ns1 = vaddq_f64( s1, s3 );\r\nop[ 1 ] = vaddvq_f64( s1 );\r\nR8BHBC2\r\n\r\n#else // SIMD\r\n\r\nR8BHBC1( convolve1 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve2 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve3 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve4 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve5 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve6 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve7 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve8 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve9 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ])\r\n\t+ flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve10 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ])\r\n\t+ flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ])\r\n\t+ flt[ 9 ] * ( rp[ 10 ] + rp[ -9 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve11 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ])\r\n\t+ flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ])\r\n\t+ flt[ 9 ] * ( rp[ 10 ] + rp[ -9 ])\r\n\t+ flt[ 10 ] * ( rp[ 11 ] + rp[ -10 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve12 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ])\r\n\t+ flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ])\r\n\t+ flt[ 9 ] * ( rp[ 10 ] + rp[ -9 ])\r\n\t+ flt[ 10 ] * ( rp[ 11 ] + rp[ -10 ])\r\n\t+ flt[ 11 ] * ( rp[ 12 ] + rp[ -11 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve13 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ])\r\n\t+ flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ])\r\n\t+ flt[ 9 ] * ( rp[ 10 ] + rp[ -9 ])\r\n\t+ flt[ 10 ] * ( rp[ 11 ] + rp[ -10 ])\r\n\t+ flt[ 11 ] * ( rp[ 12 ] + rp[ -11 ])\r\n\t+ flt[ 12 ] * ( rp[ 13 ] + rp[ -12 ]);\r\nR8BHBC2\r\n\r\nR8BHBC1( convolve14 )\r\nop[ 1 ] = flt[ 0 ] * ( rp[ 1 ] + rp[ 0 ])\r\n\t+ flt[ 1 ] * ( rp[ 2 ] + rp[ -1 ])\r\n\t+ flt[ 2 ] * ( rp[ 3 ] + rp[ -2 ])\r\n\t+ flt[ 3 ] * ( rp[ 4 ] + rp[ -3 ])\r\n\t+ flt[ 4 ] * ( rp[ 5 ] + rp[ -4 ])\r\n\t+ flt[ 5 ] * ( rp[ 6 ] + rp[ -5 ])\r\n\t+ flt[ 6 ] * ( rp[ 7 ] + rp[ -6 ])\r\n\t+ flt[ 7 ] * ( rp[ 8 ] + rp[ -7 ])\r\n\t+ flt[ 8 ] * ( rp[ 9 ] + rp[ -8 ])\r\n\t+ flt[ 9 ] * ( rp[ 10 ] + rp[ -9 ])\r\n\t+ flt[ 10 ] * ( rp[ 11 ] + rp[ -10 ])\r\n\t+ flt[ 11 ] * ( rp[ 12 ] + rp[ -11 ])\r\n\t+ flt[ 12 ] * ( rp[ 13 ] + rp[ -12 ])\r\n\t+ flt[ 13 ] * ( rp[ 14 ] + rp[ -13 ]);\r\nR8BHBC2\r\n\r\n#endif // SIMD\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/CDSPProcessor.h",
    "content": "//$ nobt\r\n//$ nocpp\r\n\r\n/**\r\n * @file CDSPProcessor.h\r\n *\r\n * @brief The base virtual class for DSP processing algorithms.\r\n *\r\n * This file includes the base virtual class for DSP processing algorithm\r\n * classes like FIR filtering and interpolation.\r\n *\r\n * r8brain-free-src Copyright (c) 2013-2025 Aleksey Vaneev\r\n *\r\n * See the \"LICENSE\" file for license.\r\n */\r\n\r\n#ifndef R8B_CDSPPROCESSOR_INCLUDED\r\n#define R8B_CDSPPROCESSOR_INCLUDED\r\n\r\n#include \"r8bbase.h\"\r\n\r\nnamespace r8b {\r\n\r\n/**\r\n * @brief The base virtual class for DSP processing algorithms.\r\n *\r\n * This class can be used as a base class for various DSP processing\r\n * algorithms (processors). DSP processors that are derived from this class\r\n * can be seamlessly integrated into various DSP processing graphs.\r\n */\r\n\r\nclass CDSPProcessor : public R8B_DSPBASECLASS {\r\n  R8BNOCTOR(CDSPProcessor)\r\n\r\n public:\r\n  CDSPProcessor() {}\r\n\r\n  virtual ~CDSPProcessor() {}\r\n\r\n  /**\r\n\t * @brief Returns the number of input samples required to advance to\r\n\t * the specified output sample position (so that the next process() call\r\n\t * passes this output position).\r\n\r\n\t * Assumes starting at the cleared or after-construction state of *this*\r\n\t * object.\r\n\t *\r\n\t * Note that the implementation of this function assumes the caller only\r\n\t * needs to estimate an initial buffering requirement; passing a full\r\n\t * sample length value (e.g., greater than 100000) may overflow the\r\n\t * calculation or cause rounding errors.\r\n\t *\r\n\t * @param ReqOutPos The required output position. Set to 0 to obtain\r\n\t * \"input length before output start\" latency. Must be a non-negative\r\n\t * value.\r\n\t * @return The number of input samples required.\r\n\t */\r\n\r\n  virtual int getInLenBeforeOutPos(const int ReqOutPos) const = 0;\r\n\r\n  /**\r\n\t * @brief Return the latency, in samples, which is present in the output\r\n\t * signal.\r\n\t *\r\n\t * This value is usually zero if the DSP processor \"consumes\" the latency\r\n\t * automatically.\r\n\t */\r\n\r\n  virtual int getLatency() const = 0;\r\n\r\n  /**\r\n\t * @brief Returns fractional latency, in samples, which is present in the\r\n\t * output signal.\r\n\t *\r\n\t * This value is usually zero if a linear-phase filtering is used. With\r\n\t * minimum-phase filters in use, this value can be non-zero even if\r\n\t * the getLatency() function returns zero.\r\n\t */\r\n\r\n  virtual double getLatencyFrac() const = 0;\r\n\r\n  /**\r\n\t * @brief Returns the maximal length of the output buffer required when\r\n\t * processing the `MaxInLen` number of input samples.\r\n\t *\r\n\t * @param MaxInLen The number of samples planned to process at once, at\r\n\t * most.\r\n\t */\r\n\r\n  virtual int getMaxOutLen(const int MaxInLen) const = 0;\r\n\r\n  /**\r\n\t * @brief Clears (resets) the state of *this* object and returns it to\r\n\t * the state after construction.\r\n\t *\r\n\t * All input data accumulated in the internal buffer so far will be\r\n\t * discarded.\r\n\t */\r\n\r\n  virtual void clear() = 0;\r\n\r\n  /**\r\n\t * @brief Performs DSP processing.\r\n\t *\r\n\t * @param ip Input data pointer.\r\n\t * @param l0 How many samples to process.\r\n\t * @param[out] op0 Output data pointer. The capacity of this buffer should\r\n\t * be equal to the value returned by the getMaxOutLen() function for the\r\n\t * given `l0`. This buffer can be equal to `ip` only if the\r\n\t * `getMaxOutLen( l0 )` call returned a value lesser than `l0`. This\r\n\t * pointer can be incremented on function's return if latency compensation\r\n\t * was performed by the processor. Note that on function's return, this\r\n\t * pointer may point to some internal buffers, including the `ip` buffer,\r\n\t * ignoring the originally passed value.\r\n\t * @return The number of output samples written to the `op0` buffer and\r\n\t * available after processing. This value can be smaller or larger in\r\n\t * comparison to the original `l0` value due to processing and filter's\r\n\t * latency compensation that took place, and due to resampling if it was\r\n\t * performed.\r\n\t */\r\n\r\n  virtual int process(double *ip, int l0, double *&op0) = 0;\r\n};\r\n\r\n} // namespace r8b\r\n\r\n#endif // R8B_CDSPPROCESSOR_INCLUDED\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/CDSPRealFFT.h",
    "content": "//$ nobt\r\n//$ nocpp\r\n\r\n/**\r\n * @file CDSPRealFFT.h\r\n *\r\n * @brief Real-valued FFT transform class.\r\n *\r\n * This file includes FFT object implementation. All created FFT objects are\r\n * kept in a global list after use, for a future reusal. Such approach\r\n * minimizes time necessary to initialize the FFT object of the required\r\n * length.\r\n *\r\n * r8brain-free-src Copyright (c) 2013-2025 Aleksey Vaneev\r\n *\r\n * See the \"LICENSE\" file for license.\r\n */\r\n\r\n#ifndef R8B_CDSPREALFFT_INCLUDED\r\n#define R8B_CDSPREALFFT_INCLUDED\r\n\r\n#include \"r8bbase.h\"\r\n\r\n#if R8B_PFFFT_DOUBLE\r\n#include \"fft/pffft_double.h\"\r\n#elif R8B_PFFFT\r\n#include \"fft/pffft.h\"\r\n#elif !R8B_IPP\r\n#include \"fft/fft4g.h\"\r\n#endif // !R8B_IPP\r\n\r\nnamespace r8b {\r\n\r\n/**\r\n * @brief Real-valued FFT transform class.\r\n *\r\n * Class implements a wrapper for real-valued discrete fast Fourier transform\r\n * functions. The object of this class can only be obtained via the\r\n * CDSPRealFFTKeeper class.\r\n *\r\n * Uses functions from the FFT package by: Copyright(C) 1996-2001 Takuya OOURA\r\n * http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html\r\n *\r\n * Also uses Intel IPP library functions if available (if the R8B_IPP=1 macro\r\n * was defined). Note that IPP library's FFT functions are 2-3 times more\r\n * efficient on the modern Intel Core i7-3770K processor than Ooura's\r\n * functions. It may be worthwhile investing in IPP. Note, that FFT functions\r\n * take less than 20% of the overall sample rate conversion time. However,\r\n * when the \"power of 2\" resampling is used the performance of FFT functions\r\n * becomes \"everything\".\r\n */\r\n\r\nclass CDSPRealFFT : public R8B_BASECLASS {\r\n  R8BNOCTOR(CDSPRealFFT)\r\n\r\n  friend class CPtrKeeper<CDSPRealFFT>;\r\n  friend class CDSPRealFFTKeeper;\r\n\r\n public:\r\n  /**\r\n\t * @brief Return a multiplication constant that should be used after\r\n\t * inverse transform to obtain a correct value scale.\r\n\t */\r\n\r\n  double getInvMulConst() const {\r\n    return (InvMulConst);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the length (the number of real values in a transform) of\r\n\t * *this* FFT object, expressed as Nth power of 2.\r\n\t */\r\n\r\n  int getLenBits() const {\r\n    return (LenBits);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the length (the number of real values in a transform) of\r\n\t * *this* FFT object.\r\n\t */\r\n\r\n  int getLen() const {\r\n    return (Len);\r\n  }\r\n\r\n  /**\r\n\t * @brief Performs in-place forward FFT.\r\n\t *\r\n\t * @param[in,out] p Pointer to data block to transform, length should be\r\n\t * equal to *this* object's getLen().\r\n\t */\r\n\r\n  void forward(double *const p) const {\r\n#if R8B_FLOATFFT\r\n\r\n    float *const op = (float *)p;\r\n    int i;\r\n\r\n    for (i = 0; i < Len; i++) {\r\n      op[i] = (float)p[i];\r\n    }\r\n\r\n#endif // R8B_FLOATFFT\r\n\r\n#if R8B_IPP\r\n\r\n    ippsFFTFwd_RToPerm_64f(p, p, SPtr, WorkBuffer);\r\n\r\n#elif R8B_PFFFT\r\n\r\n    pffft_transform_ordered(setup, op, op, work, PFFFT_FORWARD);\r\n\r\n#elif R8B_PFFFT_DOUBLE\r\n\r\n    pffftd_transform_ordered(setup, p, p, work, PFFFT_FORWARD);\r\n\r\n#else // R8B_PFFFT_DOUBLE\r\n\r\n    ooura_fft ::rdft(Len, 1, p, wi, wd);\r\n\r\n#endif // R8B_IPP\r\n  }\r\n\r\n  /**\r\n\t * @brief Performs in-place inverse FFT.\r\n\t *\r\n\t * @param[in,out] p Pointer to data block to transform, length should be\r\n\t * equal to *this* object's getLen().\r\n\t */\r\n\r\n  void inverse(double *const p) const {\r\n#if R8B_IPP\r\n\r\n    ippsFFTInv_PermToR_64f(p, p, SPtr, WorkBuffer);\r\n\r\n#elif R8B_PFFFT\r\n\r\n    pffft_transform_ordered(setup, (float *)p, (float *)p, work, PFFFT_BACKWARD);\r\n\r\n#elif R8B_PFFFT_DOUBLE\r\n\r\n    pffftd_transform_ordered(setup, p, p, work, PFFFT_BACKWARD);\r\n\r\n#else // R8B_PFFFT_DOUBLE\r\n\r\n    ooura_fft ::rdft(Len, -1, p, wi, wd);\r\n\r\n#endif // R8B_IPP\r\n\r\n#if R8B_FLOATFFT\r\n\r\n    const float *const ip = (const float *)p;\r\n    int i;\r\n\r\n    for (i = Len - 1; i >= 0; i--) {\r\n      p[i] = ip[i];\r\n    }\r\n\r\n#endif // R8B_FLOATFFT\r\n  }\r\n\r\n  /**\r\n\t * @brief Multiplies two complex-valued data blocks and places result in\r\n\t * a new data block.\r\n\t *\r\n\t * Length of all data blocks should be equal to *this* object's block\r\n\t * length. Input blocks should have been produced with the forward()\r\n\t * function of *this* object.\r\n\t *\r\n\t * @param aip1 Input data block 1.\r\n\t * @param aip2 Input data block 2.\r\n\t * @param[out] aop Output data block, should not be equal to aip1 nor\r\n\t * aip2.\r\n\t */\r\n\r\n  void multiplyBlocks(const double *const aip1, const double *const aip2, double *const aop) const {\r\n#if R8B_FLOATFFT\r\n\r\n    const float *const ip1 = (const float *)aip1;\r\n    const float *const ip2 = (const float *)aip2;\r\n    float *const op = (float *)aop;\r\n\r\n#else // R8B_FLOATFFT\r\n\r\n    const double *const ip1 = aip1;\r\n    const double *const ip2 = aip2;\r\n    double *const op = aop;\r\n\r\n#endif // R8B_FLOATFFT\r\n\r\n#if R8B_IPP\r\n\r\n    ippsMulPerm_64f((Ipp64f *)ip1, (Ipp64f *)ip2, (Ipp64f *)op, Len);\r\n\r\n#else // R8B_IPP\r\n\r\n    op[0] = ip1[0] * ip2[0];\r\n    op[1] = ip1[1] * ip2[1];\r\n\r\n    int i = 2;\r\n\r\n    while (i < Len) {\r\n      op[i] = ip1[i] * ip2[i] - ip1[i + 1] * ip2[i + 1];\r\n      op[i + 1] = ip1[i] * ip2[i + 1] + ip1[i + 1] * ip2[i];\r\n      i += 2;\r\n    }\r\n\r\n#endif // R8B_IPP\r\n  }\r\n\r\n  /**\r\n\t * @brief Nultiplies two complex-valued data blocks in-place.\r\n\t *\r\n\t * Length of both data blocks should be equal to *this* object's block\r\n\t * length. Blocks should have been produced with the forward() function of\r\n\t * *this* object.\r\n\t *\r\n\t * @param aip Input data block 1.\r\n\t * @param[in,out] aop Output/input data block 2.\r\n\t */\r\n\r\n  void multiplyBlocks(const double *const aip, double *const aop) const {\r\n#if R8B_FLOATFFT\r\n\r\n    const float *const ip = (const float *)aip;\r\n    float *const op = (float *)aop;\r\n    float t;\r\n\r\n#else // R8B_FLOATFFT\r\n\r\n    const double *const ip = aip;\r\n    double *const op = aop;\r\n\r\n#if !R8B_IPP\r\n    double t;\r\n#endif // !R8B_IPP\r\n\r\n#endif // R8B_FLOATFFT\r\n\r\n#if R8B_IPP\r\n\r\n    ippsMulPerm_64f((Ipp64f *)op, (Ipp64f *)ip, (Ipp64f *)op, Len);\r\n\r\n#else // R8B_IPP\r\n\r\n    op[0] *= ip[0];\r\n    op[1] *= ip[1];\r\n\r\n    int i = 2;\r\n\r\n    while (i < Len) {\r\n      t = op[i] * ip[i] - op[i + 1] * ip[i + 1];\r\n      op[i + 1] = op[i] * ip[i + 1] + op[i + 1] * ip[i];\r\n      op[i] = t;\r\n      i += 2;\r\n    }\r\n\r\n#endif // R8B_IPP\r\n  }\r\n\r\n  /**\r\n\t * @brief Multiplies two complex-valued data blocks in-place, considering\r\n\t * that the `aip` block contains \"zero-phase\" response.\r\n\t *\r\n\t * Length of both data blocks should be equal to *this* object's block\r\n\t * length. Blocks should have been produced with the forward() function of\r\n\t * *this* object.\r\n\t *\r\n\t * @param aip Input data block 1, \"zero-phase\" response. This block should\r\n\t * be first transformed via the convertToZP() function.\r\n\t * @param[in,out] aop Output/input data block 2.\r\n\t */\r\n\r\n  void multiplyBlocksZP(const double *const aip, double *const aop) const {\r\n#if R8B_FLOATFFT\r\n\r\n    const float *const ip = (const float *)aip;\r\n    float *const op = (float *)aop;\r\n\r\n#else // R8B_FLOATFFT\r\n\r\n    const double *ip = aip;\r\n    double *op = aop;\r\n\r\n#endif // R8B_FLOATFFT\r\n\r\n    // SIMD implementations assume that pointers are address-aligned.\r\n\r\n#if !R8B_FLOATFFT && defined(R8B_SSE2)\r\n\r\n    int c8 = Len >> 3;\r\n\r\n    while (c8 != 0) {\r\n      const __m128d iv1 = _mm_load_pd(ip);\r\n      const __m128d iv2 = _mm_load_pd(ip + 2);\r\n      const __m128d ov1 = _mm_load_pd(op);\r\n      const __m128d ov2 = _mm_load_pd(op + 2);\r\n      _mm_store_pd(op, _mm_mul_pd(iv1, ov1));\r\n      _mm_store_pd(op + 2, _mm_mul_pd(iv2, ov2));\r\n\r\n      const __m128d iv3 = _mm_load_pd(ip + 4);\r\n      const __m128d ov3 = _mm_load_pd(op + 4);\r\n      const __m128d iv4 = _mm_load_pd(ip + 6);\r\n      const __m128d ov4 = _mm_load_pd(op + 6);\r\n      _mm_store_pd(op + 4, _mm_mul_pd(iv3, ov3));\r\n      _mm_store_pd(op + 6, _mm_mul_pd(iv4, ov4));\r\n\r\n      ip += 8;\r\n      op += 8;\r\n      c8--;\r\n    }\r\n\r\n    int c = Len & 7;\r\n\r\n    while (c != 0) {\r\n      *op *= *ip;\r\n      ip++;\r\n      op++;\r\n      c--;\r\n    }\r\n\r\n#elif !R8B_FLOATFFT && defined(R8B_NEON)\r\n\r\n    int c8 = Len >> 3;\r\n\r\n    while (c8 != 0) {\r\n      const float64x2_t iv1 = vld1q_f64(ip);\r\n      const float64x2_t iv2 = vld1q_f64(ip + 2);\r\n      const float64x2_t ov1 = vld1q_f64(op);\r\n      const float64x2_t ov2 = vld1q_f64(op + 2);\r\n      vst1q_f64(op, vmulq_f64(iv1, ov1));\r\n      vst1q_f64(op + 2, vmulq_f64(iv2, ov2));\r\n\r\n      const float64x2_t iv3 = vld1q_f64(ip + 4);\r\n      const float64x2_t iv4 = vld1q_f64(ip + 6);\r\n      const float64x2_t ov3 = vld1q_f64(op + 4);\r\n      const float64x2_t ov4 = vld1q_f64(op + 6);\r\n      vst1q_f64(op + 4, vmulq_f64(iv3, ov3));\r\n      vst1q_f64(op + 6, vmulq_f64(iv4, ov4));\r\n\r\n      ip += 8;\r\n      op += 8;\r\n      c8--;\r\n    }\r\n\r\n    int c = Len & 7;\r\n\r\n    while (c != 0) {\r\n      *op *= *ip;\r\n      ip++;\r\n      op++;\r\n      c--;\r\n    }\r\n\r\n#else // SIMD\r\n\r\n    int i;\r\n\r\n    for (i = 0; i < Len; i++) {\r\n      op[i] *= ip[i];\r\n    }\r\n\r\n#endif // SIMD\r\n  }\r\n\r\n  /**\r\n\t * @brief Converts the specified forward-transformed block into\r\n\t * \"zero-phase\" form, suitable for use with the multiplyBlocksZP()\r\n\t * function.\r\n\t *\r\n\t * @param[in,out] ap Block to transform.\r\n\t */\r\n\r\n  void convertToZP(double *const ap) const {\r\n#if R8B_FLOATFFT\r\n\r\n    float *const p = (float *)ap;\r\n\r\n#else // R8B_FLOATFFT\r\n\r\n    double *const p = ap;\r\n\r\n#endif // R8B_FLOATFFT\r\n\r\n    int i = 2;\r\n\r\n    while (i < Len) {\r\n      p[i + 1] = p[i];\r\n      i += 2;\r\n    }\r\n  }\r\n\r\n private:\r\n  int LenBits;        ///< Length of FFT block (expressed as Nth power of 2).\r\n  int Len;            ///< Length of FFT block (number of real values).\r\n  double InvMulConst; ///< Inverse FFT multiply constant.\r\n  CDSPRealFFT *Next;  ///< Next object in a singly-linked list.\r\n\r\n#if R8B_IPP\r\n  IppsFFTSpec_R_64f *SPtr;                ///< Pointer to initialized data buffer\r\n                                          ///< to be passed to IPP's FFT functions.\r\n  CFixedBuffer<unsigned char> SpecBuffer; ///< Working buffer.\r\n  CFixedBuffer<unsigned char> WorkBuffer; ///< Working buffer.\r\n#elif R8B_PFFFT\r\n  PFFFT_Setup *setup;       ///< PFFFT setup object.\r\n  CFixedBuffer<float> work; ///< Working buffer.\r\n#elif R8B_PFFFT_DOUBLE\r\n  PFFFTD_Setup *setup;       ///< PFFFTD setup object.\r\n  CFixedBuffer<double> work; ///< Working buffer.\r\n#else  // R8B_PFFFT_DOUBLE\r\n  CFixedBuffer<int> wi;    ///< Working buffer (ints).\r\n  CFixedBuffer<double> wd; ///< Working buffer (doubles).\r\n#endif // R8B_IPP\r\n\r\n  CDSPRealFFT() {}\r\n\r\n  /**\r\n\t * Constructor initializes FFT object.\r\n\t *\r\n\t * @param aLenBits The length of FFT block (Nth power of 2), specifies the\r\n\t * number of real values in a block. Values from 1 to 30 inclusive are\r\n\t * supported.\r\n\t */\r\n\r\n  CDSPRealFFT(const int aLenBits)\r\n      : LenBits(aLenBits),\r\n        Len(1 << aLenBits)\r\n#if R8B_IPP\r\n        ,\r\n        InvMulConst(1.0 / Len)\r\n#elif R8B_PFFFT\r\n        ,\r\n        InvMulConst(1.0 / Len)\r\n#elif R8B_PFFFT_DOUBLE\r\n        ,\r\n        InvMulConst(1.0 / Len)\r\n#else  // R8B_PFFFT_DOUBLE\r\n        ,\r\n        InvMulConst(2.0 / Len)\r\n#endif // R8B_IPP\r\n  {\r\n#if R8B_IPP\r\n\r\n    int SpecSize;\r\n    int SpecBufferSize;\r\n    int BufferSize;\r\n\r\n    ippsFFTGetSize_R_64f(\r\n        LenBits, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast, &SpecSize, &SpecBufferSize, &BufferSize);\r\n\r\n    CFixedBuffer<unsigned char> InitBuffer(SpecBufferSize);\r\n    SpecBuffer.alloc(SpecSize);\r\n    WorkBuffer.alloc(BufferSize);\r\n\r\n    ippsFFTInit_R_64f(&SPtr, LenBits, IPP_FFT_NODIV_BY_ANY, ippAlgHintFast, SpecBuffer, InitBuffer);\r\n\r\n#elif R8B_PFFFT\r\n\r\n    setup = pffft_new_setup(Len, PFFFT_REAL);\r\n    work.alloc(Len);\r\n\r\n#elif R8B_PFFFT_DOUBLE\r\n\r\n    setup = pffftd_new_setup(Len, PFFFT_REAL);\r\n    work.alloc(Len);\r\n\r\n#else // R8B_PFFFT_DOUBLE\r\n\r\n    wi.alloc((int)ceil(2.0 + sqrt((double)(Len >> 1))));\r\n    wi[0] = 0;\r\n    wd.alloc(Len >> 1);\r\n\r\n#endif // R8B_IPP\r\n  }\r\n\r\n  ~CDSPRealFFT() {\r\n#if R8B_PFFFT\r\n    pffft_destroy_setup(setup);\r\n#elif R8B_PFFFT_DOUBLE\r\n    pffftd_destroy_setup(setup);\r\n#endif // R8B_PFFFT_DOUBLE\r\n\r\n    delete Next;\r\n  }\r\n};\r\n\r\n/**\r\n * @brief A \"keeper\" class for real-valued FFT transform objects.\r\n *\r\n * Class implements \"keeper\" functionality for handling CDSPRealFFT objects.\r\n * The allocated FFT objects are placed on the global static list of objects\r\n * for future reuse instead of deallocation.\r\n */\r\n\r\nclass CDSPRealFFTKeeper : public R8B_BASECLASS {\r\n  R8BNOCTOR(CDSPRealFFTKeeper)\r\n\r\n public:\r\n  CDSPRealFFTKeeper() : Object(R8B_NULL) {}\r\n\r\n  /**\r\n\t * @brief Acquires FFT object with the specified block length.\r\n\t *\r\n\t * @param LenBits The length of FFT block (Nth power of 2), in the range\r\n\t * [1; 30] inclusive, specifies the number of real values in a FFT block.\r\n\t */\r\n\r\n  CDSPRealFFTKeeper(const int LenBits) {\r\n    Object = acquire(LenBits);\r\n  }\r\n\r\n  ~CDSPRealFFTKeeper() {\r\n    if (Object != R8B_NULL) {\r\n      release(Object);\r\n    }\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns pointer to the acquired FFT object.\r\n\t */\r\n\r\n  const CDSPRealFFT *operator->() const {\r\n    R8BASSERT(Object != R8B_NULL);\r\n\r\n    return (Object);\r\n  }\r\n\r\n  /**\r\n\t * @brief Acquires FFT object with the specified block length. This\r\n\t * function can be called any number of times.\r\n\t *\r\n\t * @param LenBits The length of FFT block (Nth power of 2), in the range\r\n\t * [1; 30] inclusive, specifies the number of real values in a FFT block.\r\n\t */\r\n\r\n  void init(const int LenBits) {\r\n    if (Object != R8B_NULL) {\r\n      if (Object->LenBits == LenBits) {\r\n        return;\r\n      }\r\n\r\n      release(Object);\r\n    }\r\n\r\n    Object = acquire(LenBits);\r\n  }\r\n\r\n  /**\r\n\t * @brief Releases a previously acquired FFT object.\r\n\t */\r\n\r\n  void reset() {\r\n    if (Object != R8B_NULL) {\r\n      release(Object);\r\n      Object = R8B_NULL;\r\n    }\r\n  }\r\n\r\n private:\r\n  CDSPRealFFT *Object; ///< FFT object.\r\n\r\n  /**\r\n\t * @brief Acquires FFT object from the global pool.\r\n\t *\r\n\t * @param LenBits FFT block length (expressed as Nth power of 2).\r\n\t */\r\n\r\n  CDSPRealFFT *acquire(const int LenBits) {\r\n    R8BASSERT(LenBits > 0 && LenBits <= 30);\r\n\r\n    R8BSYNC(getStateSync());\r\n\r\n    if (getFFTObjects()[LenBits] == R8B_NULL) {\r\n      return (new CDSPRealFFT(LenBits));\r\n    }\r\n\r\n    CDSPRealFFT *ffto = getFFTObjects()[LenBits].unkeep();\r\n    getFFTObjects()[LenBits] = ffto->Next;\r\n\r\n    return (ffto);\r\n  }\r\n\r\n  /**\r\n\t * @brief Releases a previously acquired FFT object.\r\n\t *\r\n\t * @param ffto FFT object to release.\r\n\t */\r\n\r\n  void release(CDSPRealFFT *const ffto) {\r\n    R8BSYNC(getStateSync());\r\n\r\n    ffto->Next = getFFTObjects()[ffto->LenBits].unkeep();\r\n    getFFTObjects()[ffto->LenBits] = ffto;\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns pointer to a pool of free FFT objects.\r\n\t */\r\n\r\n  static CPtrKeeper<CDSPRealFFT> *getFFTObjects() {\r\n    R8B_EXITDTOR static CPtrKeeper<CDSPRealFFT> FFTObjects[31];\r\n\r\n    return (FFTObjects);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns reference to FFT object pool sync object.\r\n\t */\r\n\r\n  static CSyncObject &getStateSync() {\r\n    R8B_EXITDTOR static CSyncObject StateSync;\r\n\r\n    return (StateSync);\r\n  }\r\n};\r\n\r\n/**\r\n * @brief Calculates the minimum-phase transform of the filter kernel, using\r\n * a discrete Hilbert transform in cepstrum domain.\r\n *\r\n * For more details, see part III.B of\r\n * http://www.hpl.hp.com/personal/Niranjan_Damera-Venkata/files/ComplexMinPhase.pdf\r\n *\r\n * @param[in,out] Kernel Filter kernel buffer.\r\n * @param KernelLen Filter kernel's length, in samples.\r\n * @param LenMult Kernel length multiplier. Used as a coefficient of\r\n * oversampling in the frequency domain. Such oversampling is needed to\r\n * improve the precision of the minimum-phase transform. If the filter's\r\n * attenuation is high, this multiplier should be increased or otherwise the\r\n * required attenuation will not be reached due to \"smoothing\" effect of this\r\n * transform.\r\n * @param DoFinalMul `true` if the final multiplication after transform\r\n * should be performed. Such multiplication returns the gain of the signal to\r\n * its original value. This parameter can be set to `false` if normalization\r\n * of the resulting filter kernel is planned to be used.\r\n * @param[out] DCGroupDelay If not `nullptr`, this variable receives group\r\n * delay at DC offset, in samples (can be a non-integer value).\r\n */\r\n\r\ninline void calcMinPhaseTransform(\r\n    double *const Kernel,\r\n    const int KernelLen,\r\n    const int LenMult = 2,\r\n    const bool DoFinalMul = true,\r\n    double *const DCGroupDelay = R8B_NULL) {\r\n  R8BASSERT(KernelLen > 0);\r\n  R8BASSERT(LenMult >= 2);\r\n\r\n  const int LenBits = getBitOccupancy((KernelLen * LenMult) - 1);\r\n  const int Len = 1 << LenBits;\r\n  const int Len2 = Len >> 1;\r\n  int i;\r\n\r\n  CFixedBuffer<double> ip(Len);\r\n  CFixedBuffer<double> ip2(Len2 + 1);\r\n\r\n  memcpy(&ip[0], Kernel, (size_t)KernelLen * sizeof(ip[0]));\r\n  memset(&ip[KernelLen], 0, (size_t)(Len - KernelLen) * sizeof(ip[0]));\r\n\r\n  CDSPRealFFTKeeper ffto(LenBits);\r\n  ffto->forward(ip);\r\n\r\n  // Create the \"log |c|\" spectrum while saving the original power spectrum\r\n  // in the \"ip2\" buffer.\r\n\r\n#if R8B_FLOATFFT\r\n  float *const aip = (float *)&ip[0];\r\n  float *const aip2 = (float *)&ip2[0];\r\n  const float nzbias = 1e-35;\r\n#else  // R8B_FLOATFFT\r\n  double *const aip = &ip[0];\r\n  double *const aip2 = &ip2[0];\r\n  const double nzbias = 1e-300;\r\n#endif // R8B_FLOATFFT\r\n\r\n  aip2[0] = aip[0];\r\n  aip[0] = log(fabs(aip[0]) + nzbias);\r\n  aip2[Len2] = aip[1];\r\n  aip[1] = log(fabs(aip[1]) + nzbias);\r\n\r\n  for (i = 1; i < Len2; i++) {\r\n    aip2[i] = sqrt(aip[i * 2] * aip[i * 2] + aip[i * 2 + 1] * aip[i * 2 + 1]);\r\n\r\n    aip[i * 2] = log(aip2[i] + nzbias);\r\n    aip[i * 2 + 1] = 0.0;\r\n  }\r\n\r\n  // Convert to cepstrum and apply discrete Hilbert transform.\r\n\r\n  ffto->inverse(ip);\r\n\r\n  const double m1 = ffto->getInvMulConst();\r\n  const double m2 = -m1;\r\n\r\n  ip[0] = 0.0;\r\n\r\n  for (i = 1; i < Len2; i++) {\r\n    ip[i] *= m1;\r\n  }\r\n\r\n  ip[Len2] = 0.0;\r\n\r\n  for (i = Len2 + 1; i < Len; i++) {\r\n    ip[i] *= m2;\r\n  }\r\n\r\n  // Convert Hilbert-transformed cepstrum back to the \"log |c|\" spectrum and\r\n  // perform its exponentiation, multiplied by the power spectrum previously\r\n  // saved in the \"ip2\" buffer.\r\n\r\n  ffto->forward(ip);\r\n\r\n  aip[0] = aip2[0];\r\n  aip[1] = aip2[Len2];\r\n\r\n  for (i = 1; i < Len2; i++) {\r\n    aip[i * 2 + 0] = cos(aip[i * 2 + 1]) * aip2[i];\r\n    aip[i * 2 + 1] = sin(aip[i * 2 + 1]) * aip2[i];\r\n  }\r\n\r\n  ffto->inverse(ip);\r\n\r\n  if (DoFinalMul) {\r\n    for (i = 0; i < KernelLen; i++) {\r\n      Kernel[i] = ip[i] * m1;\r\n    }\r\n  } else {\r\n    memcpy(&Kernel[0], &ip[0], (size_t)KernelLen * sizeof(Kernel[0]));\r\n  }\r\n\r\n  if (DCGroupDelay != R8B_NULL) {\r\n    *DCGroupDelay = calcFIRFilterGroupDelay(Kernel, KernelLen, 0.0);\r\n  }\r\n}\r\n\r\n} // namespace r8b\r\n\r\n#endif // VOX_CDSPREALFFT_INCLUDED\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/CDSPResampler.h",
    "content": "//$ nobt\r\n//$ nocpp\r\n\r\n/**\r\n * @file CDSPResampler.h\r\n *\r\n * @brief The master sample rate converter (resampler) class.\r\n *\r\n * This file includes the master sample rate converter (resampler) class that\r\n * combines all elements of this library into a single front-end class.\r\n *\r\n * r8brain-free-src Copyright (c) 2013-2025 Aleksey Vaneev\r\n *\r\n * See the \"LICENSE\" file for license.\r\n */\r\n\r\n#ifndef R8B_CDSPRESAMPLER_INCLUDED\r\n#define R8B_CDSPRESAMPLER_INCLUDED\r\n\r\n#include \"CDSPBlockConvolver.h\"\r\n#include \"CDSPFracInterpolator.h\"\r\n#include \"CDSPHBDownsampler.h\"\r\n#include \"CDSPHBUpsampler.h\"\r\n\r\nnamespace r8b {\r\n\r\n/**\r\n * @brief The master sample rate converter (resampler) class.\r\n *\r\n * This class can be considered the \"master\" sample rate converter (resampler)\r\n * class since it combines all functionality of this library into a single\r\n * front-end class that performs sample rate conversion to/from any sample\r\n * rate, including non-integer sample rates.\r\n *\r\n * Note that objects of this class can be constructed on the stack as it has a\r\n * small member data size. The default template parameters of this class are\r\n * suited for 27-bit fixed point resampling.\r\n *\r\n * Use the CDSPResampler16 class for 16-bit resampling.\r\n *\r\n * Use the CDSPResampler16IR class for 16-bit impulse response resampling.\r\n *\r\n * Use the CDSPResampler24 class for 24-bit resampling (including 32-bit\r\n * floating point resampling).\r\n */\r\n\r\nclass CDSPResampler : public CDSPProcessor {\r\n public:\r\n  /**\r\n\t * @brief Initalizes the resampler object.\r\n\t *\r\n\t * Note that increasing the transition band and decreasing attenuation\r\n\t * reduces the filter length, this in turn reduces the \"input before\r\n\t * output\" delay. However, the filter length has only a minor influence on\r\n\t * the overall resampling speed.\r\n\t *\r\n\t * It should be noted that the `ReqAtten` specifies the minimal difference\r\n\t * between the loudest input signal component and the produced aliasing\r\n\t * artifacts during resampling. For example, if `ReqAtten=100` was\r\n\t * specified when performing 2x upsampling, the analysis of the resulting\r\n\t * signal may display high-frequency components which are quieter than\r\n\t * the loudest part of the input signal by only 100 decibel meaning\r\n\t * the high-frequency part did not become \"magically\" completely silent\r\n\t * after resampling. You have to specify a higher `ReqAtten` value if you\r\n\t * need a totally clean high-frequency content. On the other hand, it may\r\n\t * not be reasonable to have a high-frequency content cleaner than\r\n\t * the input signal itself: if the input signal is 16-bit, setting\r\n\t * `ReqAtten` to 180 will make its high-frequency content 24-bit, but\r\n\t * the original part of the signal will remain 16-bit.\r\n\t *\r\n\t * @param SrcSampleRate Source signal's sample rate. Both sample rates can\r\n\t * be specified as a ratio: e.g., `SrcSampleRate = 1.0`,\r\n\t * `DstSampleRate = 2.0`.\r\n\t * @param DstSampleRate Destination signal's sample rate. The \"power of 2\"\r\n\t * ratios between the source and destination sample rates force resampler\r\n\t * to use several fast \"power of 2\" resampling steps, without using\r\n\t * fractional interpolation at all.\r\n\t * @param aMaxInLen The maximal planned length of the input buffer (in\r\n\t * samples) that will be passed to the resampler. The resampler relies on\r\n\t * this value as it allocates intermediate buffers. Input buffers longer\r\n\t * than this value should never be supplied to the resampler. Note that\r\n\t * upsampling produces more samples than was provided on input, so at\r\n\t * higher upsampling ratios it is advisable to use smaller `aMaxInLen`\r\n\t * values to reduce memory footprint. When downsampling, a larger\r\n\t * `aMaxInLen` is suggested in order to increase downsampling performance.\r\n\t * @param ReqTransBand Required transition band, in percent of the\r\n\t * spectral space of the input signal (or the output signal if\r\n\t * downsampling is performed) between filter's -3 dB point and the Nyquist\r\n\t * frequency. The range is from CDSPFIRFilter::getLPMinTransBand() to\r\n\t * CDSPFIRFilter::getLPMaxTransBand(), inclusive. When upsampling 88200 or\r\n\t * 96000 audio to higher sample rates the ReqTransBand can be considerably\r\n\t * increased, up to 30. The selection of ReqTransBand depends on the level\r\n\t * of desire to preserve the high-frequency content. While values 0.5 to 2\r\n\t * are extremely \"greedy\" settings, not necessary in most cases, values 2\r\n\t * to 3 can be used in most cases. Values 3 to 4 are relaxed settings, but\r\n\t * they still offer a flat frequency response up to 21kHz with 44.1k\r\n\t * source or destination sample rate.\r\n\t * @param ReqAtten Required stop-band attenuation in decibel, in the\r\n\t * range CDSPFIRFilter::getLPMinAtten() to CDSPFIRFilter::getLPMaxAtten(),\r\n\t * inclusive. The actual attenuation may be 0.40-4.46 dB higher. The\r\n\t * general formula for selecting the `ReqAtten` is `6.02 * Bits + 40`,\r\n\t * where `Bits` is the bit resolution (e.g., 16, 24), 40 is an added\r\n\t * resolution for dynamic signals; this value can be decreased to 20 to\r\n\t * 10, if the signal being resampled is non-dynamic (e.g., an impulse\r\n\t * response or filter, with a non-steep frequency response).\r\n\t * @param ReqPhase Required filter's phase response. Note that this\r\n\t * setting does not affect interpolator's phase response which is always\r\n\t * linear-phase. Also note that if the \"power of 2\" resampling was engaged\r\n\t * by the resampler together with the minimum-phase response, the audio\r\n\t * stream may become fractionally delayed, depending on the minimum-phase\r\n\t * filter's actual fractional delay. Linear-phase filters do not have\r\n\t * fractional delay.\r\n\t * @see EDSPFilterPhaseResponse\r\n\t */\r\n\r\n  CDSPResampler(\r\n      const double SrcSampleRate,\r\n      const double DstSampleRate,\r\n      const int aMaxInLen,\r\n      const double ReqTransBand = 2.0,\r\n      const double ReqAtten = 206.91,\r\n      const EDSPFilterPhaseResponse ReqPhase = fprLinearPhase)\r\n      : StepCapacity(0),\r\n        StepCount(0),\r\n        MaxInLen(aMaxInLen),\r\n        CurMaxOutLen(aMaxInLen),\r\n        LatencyFrac(0.0) {\r\n    R8BASSERT(SrcSampleRate > 0.0);\r\n    R8BASSERT(DstSampleRate > 0.0);\r\n    R8BASSERT(MaxInLen > 0);\r\n\r\n    R8BCONSOLE(\r\n        \"* CDSPResampler: src=%.1f dst=%.1f len=%i tb=%.1f \"\r\n        \"att=%.2f ph=%i\\n\",\r\n        SrcSampleRate,\r\n        DstSampleRate,\r\n        aMaxInLen,\r\n        ReqTransBand,\r\n        ReqAtten,\r\n        (int)ReqPhase);\r\n\r\n    if (SrcSampleRate == DstSampleRate) {\r\n      return;\r\n    }\r\n\r\n    TmpBufCapacities[0] = 0;\r\n    TmpBufCapacities[1] = 0;\r\n    CurTmpBuf = 0;\r\n\r\n    // Try some common efficient ratios requiring only a single step.\r\n\r\n    const int CommonRatioCount = 5;\r\n    const int CommonRatios[CommonRatioCount][2] = {{1, 2}, {1, 3}, {2, 3}, {3, 2}, {3, 4}};\r\n\r\n    int i;\r\n\r\n    for (i = 0; i < CommonRatioCount; i++) {\r\n      const int num = CommonRatios[i][0];\r\n      const int den = CommonRatios[i][1];\r\n\r\n      if (SrcSampleRate * num == DstSampleRate * den) {\r\n        addProcessor(new CDSPBlockConvolver(\r\n            CDSPFIRFilterCache ::getLPFilter(\r\n                1.0 / (num > den ? num : den), ReqTransBand, ReqAtten, ReqPhase, num),\r\n            num,\r\n            den,\r\n            LatencyFrac));\r\n\r\n        createTmpBuffers();\r\n        return;\r\n      }\r\n    }\r\n\r\n    // Try whole-number power-of-2 or 3*power-of-2 upsampling.\r\n\r\n    for (i = 2; i <= 3; i++) {\r\n      bool WasFound = false;\r\n      int c = 0;\r\n\r\n      while (true) {\r\n        const double NewSR = SrcSampleRate * (i << c);\r\n\r\n        if (NewSR == DstSampleRate) {\r\n          WasFound = true;\r\n          break;\r\n        }\r\n\r\n        if (NewSR > DstSampleRate) {\r\n          break;\r\n        }\r\n\r\n        c++;\r\n      }\r\n\r\n      if (WasFound) {\r\n        addProcessor(new CDSPBlockConvolver(\r\n            CDSPFIRFilterCache ::getLPFilter(1.0 / i, ReqTransBand, ReqAtten, ReqPhase, i),\r\n            i,\r\n            1,\r\n            LatencyFrac));\r\n\r\n        const bool IsThird = (i == 3);\r\n\r\n        for (i = 0; i < c; i++) {\r\n          addProcessor(new CDSPHBUpsampler(ReqAtten, i, IsThird, LatencyFrac));\r\n        }\r\n\r\n        createTmpBuffers();\r\n        return;\r\n      }\r\n    }\r\n\r\n    if (DstSampleRate * 2.0 > SrcSampleRate) {\r\n      // Upsampling or fractional downsampling down to 2X.\r\n\r\n      const double NormFreq =\r\n          (DstSampleRate > SrcSampleRate ? 0.5 : 0.5 * DstSampleRate / SrcSampleRate);\r\n\r\n      addProcessor(new CDSPBlockConvolver(\r\n          CDSPFIRFilterCache ::getLPFilter(NormFreq, ReqTransBand, ReqAtten, ReqPhase, 2.0),\r\n          2,\r\n          1,\r\n          LatencyFrac));\r\n\r\n      // Try intermediate interpolated resampling with subsequent 2X\r\n      // or 3X upsampling.\r\n\r\n      const double tbw = 0.0175; // Intermediate filter's transition\r\n                                 // band extension coefficient.\r\n      const double ThreshSampleRate =\r\n          SrcSampleRate / (1.0 - tbw * ReqTransBand); // Make sure intermediate\r\n      // filter's transition band is not steeper than ReqTransBand\r\n      // (this keeps the latency under control).\r\n\r\n      int c = 0;\r\n      int div = 1;\r\n\r\n      while (true) {\r\n        const int ndiv = div * 2;\r\n\r\n        if (DstSampleRate < ThreshSampleRate * ndiv) {\r\n          break;\r\n        }\r\n\r\n        div = ndiv;\r\n        c++;\r\n      }\r\n\r\n      int c2 = 0;\r\n      int div2 = 1;\r\n\r\n      while (true) {\r\n        const int ndiv = div * (c2 == 0 ? 3 : 2);\r\n\r\n        if (DstSampleRate < ThreshSampleRate * ndiv) {\r\n          break;\r\n        }\r\n\r\n        div2 = ndiv;\r\n        c2++;\r\n      }\r\n\r\n      const double SrcSampleRate2 = SrcSampleRate * 2.0;\r\n      int tmp1;\r\n      int tmp2;\r\n\r\n      if (c == 1 && getWholeStepping(SrcSampleRate2, DstSampleRate, tmp1, tmp2)) {\r\n        // Do not use intermediate interpolation if whole stepping is\r\n        // available as it performs very fast.\r\n\r\n        c = 0;\r\n      }\r\n\r\n      if (c > 0) {\r\n        // Add steps using intermediate interpolation.\r\n\r\n        int num;\r\n\r\n        if (c2 > 0 && div2 > div) {\r\n          div = div2;\r\n          c = c2;\r\n          num = 3;\r\n        } else {\r\n          num = 2;\r\n        }\r\n\r\n        addProcessor(new CDSPFracInterpolator(\r\n            SrcSampleRate2 * div, DstSampleRate, ReqAtten, false, LatencyFrac));\r\n\r\n        double tb = (1.0 - SrcSampleRate * div / DstSampleRate) /\r\n            tbw; // Divide TransBand by a constant that assures a\r\n                 // linear response in the pass-band.\r\n\r\n        if (tb > CDSPFIRFilter ::getLPMaxTransBand()) {\r\n          tb = CDSPFIRFilter ::getLPMaxTransBand();\r\n        }\r\n\r\n        addProcessor(new CDSPBlockConvolver(\r\n            CDSPFIRFilterCache ::getLPFilter(1.0 / num, tb, ReqAtten, ReqPhase, num),\r\n            num,\r\n            1,\r\n            LatencyFrac));\r\n\r\n        const bool IsThird = (num == 3);\r\n\r\n        for (i = 1; i < c; i++) {\r\n          addProcessor(new CDSPHBUpsampler(ReqAtten, i - 1, IsThird, LatencyFrac));\r\n        }\r\n      } else {\r\n        addProcessor(\r\n            new CDSPFracInterpolator(SrcSampleRate2, DstSampleRate, ReqAtten, false, LatencyFrac));\r\n      }\r\n\r\n      createTmpBuffers();\r\n      return;\r\n    }\r\n\r\n    // Use downsampling steps, including power-of-2 downsampling.\r\n\r\n    double CheckSR = DstSampleRate * 4.0;\r\n    int c = 0;\r\n    double FinGain = 1.0;\r\n\r\n    while (CheckSR <= SrcSampleRate) {\r\n      c++;\r\n      CheckSR *= 2.0;\r\n      FinGain *= 0.5;\r\n    }\r\n\r\n    const int SrcSRDiv = (1 << c);\r\n    int downf;\r\n    double NormFreq = 0.5;\r\n    bool UseInterp = true;\r\n    bool IsThird = false;\r\n\r\n    for (downf = 2; downf <= 3; downf++) {\r\n      if (DstSampleRate * SrcSRDiv * downf == SrcSampleRate) {\r\n        NormFreq = 1.0 / downf;\r\n        UseInterp = false;\r\n        IsThird = (downf == 3);\r\n        break;\r\n      }\r\n    }\r\n\r\n    if (UseInterp) {\r\n      downf = 1;\r\n      NormFreq = DstSampleRate * SrcSRDiv / SrcSampleRate;\r\n      IsThird = (NormFreq * 3.0 <= 1.0);\r\n    }\r\n\r\n    for (i = 0; i < c; i++) {\r\n      // Use fixed, very relaxed 2X downsampling filters, that at the\r\n      // final stage only guarantee stop-band between 0.75 and pi.\r\n      // 0.5-0.75 range will be aliased to 0.25-0.5 range which will\r\n      // then be filtered out by the final filter.\r\n\r\n      addProcessor(new CDSPHBDownsampler(ReqAtten, c - 1 - i, IsThird, LatencyFrac));\r\n    }\r\n\r\n    addProcessor(new CDSPBlockConvolver(\r\n        CDSPFIRFilterCache ::getLPFilter(NormFreq, ReqTransBand, ReqAtten, ReqPhase, FinGain),\r\n        1,\r\n        downf,\r\n        LatencyFrac));\r\n\r\n    if (UseInterp) {\r\n      addProcessor(new CDSPFracInterpolator(\r\n          SrcSampleRate, DstSampleRate * SrcSRDiv, ReqAtten, IsThird, LatencyFrac));\r\n    }\r\n\r\n    createTmpBuffers();\r\n  }\r\n\r\n  virtual ~CDSPResampler() {\r\n    int i;\r\n\r\n    for (i = 0; i < StepCount; i++) {\r\n      delete Steps[i];\r\n    }\r\n  }\r\n\r\n  virtual int getInLenBeforeOutPos(const int ReqOutPos) const {\r\n    R8BASSERT(ReqOutPos >= 0);\r\n\r\n    int ReqInSamples = ReqOutPos;\r\n    int c = StepCount;\r\n\r\n    while (--c >= 0) {\r\n      ReqInSamples = Steps[c]->getInLenBeforeOutPos(ReqInSamples);\r\n    }\r\n\r\n    return (ReqInSamples);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the number of input samples required to advance to\r\n\t * the specified output sample position (so that the next process() call\r\n\t * passes this output position), starting at the cleared or\r\n\t * after-construction state of *this* object.\r\n\t *\r\n\t * This function works by iteratively passing 1 sample at a time until the\r\n\t * overall output length passes the specified value. This is a relatively\r\n\t * CPU-consuming operation. This function should be called after the\r\n\t * clear() function call or after object's construction. The function\r\n\t * itself calls the clear() function before return.\r\n\t *\r\n\t * Note that this function can be considered a legacy function, and is now\r\n\t * used for testing purposes. It is advised to use \"instant\" (much faster)\r\n\t * getInLenBeforeOutPos() and getInputRequiredForOutput() functions\r\n\t * instead.\r\n\t *\r\n\t * @param ReqOutPos The required output position. Must be a non-negative\r\n\t * value.\r\n\t * @return The number of input samples required.\r\n\t */\r\n\r\n  int getInLenBeforeOutStart(const int ReqOutPos = 0) {\r\n    R8BASSERT(ReqOutPos >= 0);\r\n\r\n    int inc = 0;\r\n    int outc = 0;\r\n\r\n    while (true) {\r\n      double ins = 0.0;\r\n      double *op;\r\n      outc += process(&ins, 1, op);\r\n\r\n      if (outc > ReqOutPos) {\r\n        clear();\r\n        return (inc);\r\n      }\r\n\r\n      inc++;\r\n    }\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the number of input samples required to produce at\r\n\t * least the specified number of output samples, starting at the cleared\r\n\t * or after-construction state of *this* object.\r\n\t *\r\n\t * @param ReqOutSamples The number of output samples required. If a\r\n\t * non-positive value was specified, the function returns 0.\r\n\t * @return The number of input samples required.\r\n\t */\r\n\r\n  int getInputRequiredForOutput(const int ReqOutSamples) const {\r\n    if (ReqOutSamples < 1) {\r\n      return (0);\r\n    }\r\n\r\n    return (getInLenBeforeOutPos(ReqOutSamples - 1) + 1);\r\n  }\r\n\r\n  virtual int getLatency() const {\r\n    return (0);\r\n  }\r\n\r\n  virtual double getLatencyFrac() const {\r\n    return (LatencyFrac);\r\n  }\r\n\r\n  /**\r\n\t * @brief This implementation ignores the supplied parameter and returns\r\n\t * the maximal output buffer length that depends on the `MaxInLen`\r\n\t * supplied to the constructor.\r\n\t */\r\n\r\n  virtual int getMaxOutLen(const int /* MaxInLen */) const {\r\n    return (CurMaxOutLen);\r\n  }\r\n\r\n  /**\r\n\t * @brief Clears (resets) the state of *this* object and returns it to\r\n\t * the state after construction.\r\n\t *\r\n\t * All input data accumulated in the internal buffer so far will be\r\n\t * discarded.\r\n\t *\r\n\t * This function makes it possible to use *this* object for converting\r\n\t * separate streams from the same source sample rate to the same\r\n\t * destination sample rate without reconstructing the object. It is more\r\n\t * efficient to clear the state of the resampler object than to destroy it\r\n\t * and create a new object.\r\n\t */\r\n\r\n  virtual void clear() {\r\n    int i;\r\n\r\n    for (i = 0; i < StepCount; i++) {\r\n      Steps[i]->clear();\r\n    }\r\n  }\r\n\r\n  /**\r\n\t * @brief Performs sample rate conversion.\r\n\t *\r\n\t * If the source and destination sample rates are equal, the resampler\r\n\t * will do nothing and will simply return the input buffer unchanged.\r\n\t *\r\n\t * You do not need to allocate an intermediate output buffer for use with\r\n\t * this function. If required, the resampler will allocate a suitable\r\n\t * intermediate output buffer itself.\r\n\t *\r\n\t * @param ip0 Input buffer. This buffer is never used as output buffer by\r\n\t * this function. This pointer may be returned in `op0` if no resampling\r\n\t * is happening (source sample rate equals destination sample rate).\r\n\t * @param l The number of samples available in the input buffer. Should\r\n\t * not exceed the `MaxInLen` supplied in the constructor.\r\n\t * @param[out] op0 This variable receives the pointer to the resampled\r\n\t * data. On function's return, this pointer points to *this* object's\r\n\t * internal buffer. In real-time applications it is suggested to pass this\r\n\t * pointer to the next output audio block and consume any data left from\r\n\t * the previous output audio block first before calling the process()\r\n\t * function again. The buffer pointed to by the `op0` on return is owned\r\n\t * by the resampler, so it should not be freed by the caller.\r\n\t * @return The number of samples available in the `op0` output buffer. If\r\n\t * the data from the output buffer `op0` is going to be written to a\r\n\t * bigger output buffer, it is suggested to check the returned number of\r\n\t * samples so that no overflow of the bigger output buffer happens.\r\n\t */\r\n\r\n  virtual int process(double *ip0, int l, double *&op0) {\r\n    R8BASSERT(l >= 0);\r\n\r\n    double *ip = ip0;\r\n    int i;\r\n\r\n    for (i = 0; i < StepCount; i++) {\r\n      double *op = TmpBufs[i & 1];\r\n      l = Steps[i]->process(ip, l, op);\r\n      ip = op;\r\n    }\r\n\r\n    op0 = ip;\r\n    return (l);\r\n  }\r\n\r\n  /**\r\n\t * @brief Performs resampling of an input sample buffer of the specified\r\n\t * length in the \"one-shot\" mode.\r\n\t *\r\n\t * This function can be useful when impulse response or time-series\r\n\t * resampling is required.\r\n\t *\r\n\t * @param ip Input buffer pointer.\r\n\t * @param iplen Length of the input buffer in samples.\r\n\t * @param[out] op Output buffer pointer.\r\n\t * @param oplen Length of the output buffer in samples.\r\n\t * @tparam Tin Input buffer's element type.\r\n\t * @tparam Tout Output buffer's element type.\r\n\t */\r\n\r\n  template <typename Tin, typename Tout>\r\n  void oneshot(const Tin *ip, int iplen, Tout *op, int oplen) {\r\n    CFixedBuffer<double> Buf(MaxInLen);\r\n    bool IsZero = false;\r\n\r\n    while (oplen > 0) {\r\n      int rc;\r\n      double *p;\r\n      int i;\r\n\r\n      if (iplen == 0) {\r\n        rc = MaxInLen;\r\n        p = &Buf[0];\r\n\r\n        if (!IsZero) {\r\n          IsZero = true;\r\n          memset(p, 0, MaxInLen * sizeof(p[0]));\r\n        }\r\n      } else {\r\n        rc = min(iplen, MaxInLen);\r\n\r\n        if (sizeof(Tin) == sizeof(double)) {\r\n          p = (double *)ip;\r\n        } else {\r\n          p = &Buf[0];\r\n\r\n          for (i = 0; i < rc; i++) {\r\n            p[i] = ip[i];\r\n          }\r\n        }\r\n\r\n        ip += rc;\r\n        iplen -= rc;\r\n      }\r\n\r\n      double *op0;\r\n      int wc = process(p, rc, op0);\r\n      wc = min(oplen, wc);\r\n\r\n      for (i = 0; i < wc; i++) {\r\n        op[i] = (Tout)op0[i];\r\n      }\r\n\r\n      op += wc;\r\n      oplen -= wc;\r\n    }\r\n\r\n    clear();\r\n  }\r\n\r\n private:\r\n  CFixedBuffer<CDSPProcessor *> Steps; ///< Array of processing steps.\r\n  int StepCapacity;                    ///< The capacity of the `Steps` array.\r\n  int StepCount;                       ///< The number of created processing steps.\r\n  int MaxInLen;                        ///< Maximal input length.\r\n  CFixedBuffer<double> TmpBufAll;      ///< Buffer containing both temporary\r\n                                       ///< buffers.\r\n  double *TmpBufs[2];                  ///< Temporary output buffers.\r\n  int TmpBufCapacities[2];             ///< Capacities of temporary buffers, updated\r\n                                       ///< during processing steps building.\r\n  int CurTmpBuf;                       ///< Current temporary buffer.\r\n  int CurMaxOutLen;                    ///< Current maximal output length.\r\n  double LatencyFrac;                  ///< Current fractional latency. After object's\r\n  ///< construction, equals to the remaining fractional latency in the\r\n  ///< output.\r\n\r\n  /**\r\n\t * @brief Adds processor, updates `MaxOutLen` variable and adjusts length\r\n\t * of temporary internal buffers.\r\n\t *\r\n\t * @param Proc Processor to add. This pointer is inherited and will be\r\n\t * destroyed on *this* object's destruction.\r\n\t */\r\n\r\n  void addProcessor(CDSPProcessor *const Proc) {\r\n    if (StepCount == StepCapacity) {\r\n      // Reallocate and increase Steps array's capacity.\r\n\r\n      const int NewCapacity = StepCapacity + 8;\r\n      Steps.realloc(StepCapacity, NewCapacity);\r\n      StepCapacity = NewCapacity;\r\n    }\r\n\r\n    LatencyFrac = Proc->getLatencyFrac();\r\n    CurMaxOutLen = Proc->getMaxOutLen(CurMaxOutLen);\r\n\r\n    if (CurMaxOutLen > TmpBufCapacities[CurTmpBuf]) {\r\n      TmpBufCapacities[CurTmpBuf] = CurMaxOutLen;\r\n    }\r\n\r\n    CurTmpBuf ^= 1;\r\n\r\n    Steps[StepCount] = Proc;\r\n    StepCount++;\r\n  }\r\n\r\n  /**\r\n\t * @brief Creates temporary buffers.\r\n\t */\r\n\r\n  void createTmpBuffers() {\r\n    const int ol = TmpBufCapacities[0] + TmpBufCapacities[1];\r\n\r\n    if (ol > 0) {\r\n      TmpBufAll.alloc(ol);\r\n      TmpBufs[0] = &TmpBufAll[0];\r\n      TmpBufs[1] = &TmpBufAll[TmpBufCapacities[0]];\r\n    }\r\n\r\n    R8BCONSOLE(\"* CDSPResampler: init done\\n\");\r\n  }\r\n};\r\n\r\n/**\r\n * @brief The resampler class for 16-bit resampling.\r\n *\r\n * This class defines resampling parameters suitable for 16-bit resampling,\r\n * using linear-phase low-pass filter. See the r8b::CDSPResampler class for\r\n * details.\r\n */\r\n\r\nclass CDSPResampler16 : public CDSPResampler {\r\n public:\r\n  /**\r\n\t * @brief Initializes the 16-bit resampler. See the r8b::CDSPResampler\r\n\t * class for details.\r\n\t *\r\n\t * @param SrcSampleRate Source signal's sample rate.\r\n\t * @param DstSampleRate Destination signal's sample rate.\r\n\t * @param aMaxInLen The maximal planned length of the input buffer (in\r\n\t * samples) that will be passed to the resampler.\r\n\t * @param ReqTransBand Required transition band, in percent.\r\n\t */\r\n\r\n  CDSPResampler16(\r\n      const double SrcSampleRate,\r\n      const double DstSampleRate,\r\n      const int aMaxInLen,\r\n      const double ReqTransBand = 2.0)\r\n      : CDSPResampler(\r\n            SrcSampleRate,\r\n            DstSampleRate,\r\n            aMaxInLen,\r\n            ReqTransBand,\r\n            136.45,\r\n            fprLinearPhase) {}\r\n};\r\n\r\n/**\r\n * @brief The resampler class for 16-bit impulse response resampling.\r\n *\r\n * This class defines resampling parameters suitable for 16-bit impulse\r\n * response resampling, using linear-phase low-pass filter. Impulse responses\r\n * are non-dynamic signals, and thus need resampler with a lesser SNR. See the\r\n * r8b::CDSPResampler class for details.\r\n */\r\n\r\nclass CDSPResampler16IR : public CDSPResampler {\r\n public:\r\n  /**\r\n\t * @brief Initializes the 16-bit impulse response resampler. See the\r\n\t * r8b::CDSPResampler class for details.\r\n\t *\r\n\t * @param SrcSampleRate Source signal's sample rate.\r\n\t * @param DstSampleRate Destination signal's sample rate.\r\n\t * @param aMaxInLen The maximal planned length of the input buffer (in\r\n\t * samples) that will be passed to the resampler.\r\n\t * @param ReqTransBand Required transition band, in percent.\r\n\t */\r\n\r\n  CDSPResampler16IR(\r\n      const double SrcSampleRate,\r\n      const double DstSampleRate,\r\n      const int aMaxInLen,\r\n      const double ReqTransBand = 2.0)\r\n      : CDSPResampler(\r\n            SrcSampleRate,\r\n            DstSampleRate,\r\n            aMaxInLen,\r\n            ReqTransBand,\r\n            109.56,\r\n            fprLinearPhase) {}\r\n};\r\n\r\n/**\r\n * @brief The resampler class for 24-bit resampling.\r\n *\r\n * This class defines resampling parameters suitable for 24-bit resampling\r\n * (including 32-bit floating point resampling), using linear-phase low-pass\r\n * filter. See the r8b::CDSPResampler class for details.\r\n */\r\n\r\nclass CDSPResampler24 : public CDSPResampler {\r\n public:\r\n  /**\r\n\t * @brief Initializes the 24-bit resampler (including 32-bit floating\r\n\t * point). See the r8b::CDSPResampler class for details.\r\n\t *\r\n\t * @param SrcSampleRate Source signal's sample rate.\r\n\t * @param DstSampleRate Destination signal's sample rate.\r\n\t * @param aMaxInLen The maximal planned length of the input buffer (in\r\n\t * samples) that will be passed to the resampler.\r\n\t * @param ReqTransBand Required transition band, in percent.\r\n\t */\r\n\r\n  CDSPResampler24(\r\n      const double SrcSampleRate,\r\n      const double DstSampleRate,\r\n      const int aMaxInLen,\r\n      const double ReqTransBand = 2.0)\r\n      : CDSPResampler(\r\n            SrcSampleRate,\r\n            DstSampleRate,\r\n            aMaxInLen,\r\n            ReqTransBand,\r\n            180.15,\r\n            fprLinearPhase) {}\r\n};\r\n\r\n} // namespace r8b\r\n\r\n#endif // R8B_CDSPRESAMPLER_INCLUDED\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/CDSPSincFilterGen.h",
    "content": "//$ nobt\r\n//$ nocpp\r\n\r\n/**\r\n * @file CDSPSincFilterGen.h\r\n *\r\n * @brief Sinc function-based FIR filter generator class.\r\n *\r\n * This file includes the CDSPSincFilterGen class implementation that\r\n * generates FIR filters.\r\n *\r\n * r8brain-free-src Copyright (c) 2013-2025 Aleksey Vaneev\r\n *\r\n * See the \"LICENSE\" file for license.\r\n */\r\n\r\n#ifndef R8B_CDSPSINCFILTERGEN_INCLUDED\r\n#define R8B_CDSPSINCFILTERGEN_INCLUDED\r\n\r\n#include \"r8bbase.h\"\r\n\r\nnamespace r8b {\r\n\r\n/**\r\n * @brief Sinc function-based FIR filter generator class.\r\n *\r\n * Structure that holds state used to perform generation of sinc functions of\r\n * various types, windowed by the Blackman window by default (but the window\r\n * function can be changed if necessary).\r\n */\r\n\r\nclass CDSPSincFilterGen {\r\n public:\r\n  double Len2;   ///< Required half filter kernel's length in samples (can be\r\n                 ///< a fractional value). Final physical kernel length will be\r\n                 ///< provided in the `KernelLen` variable. `Len2` should be >= 2.\r\n  double Len2i;  ///< Equals `1.0 / Len2`, initialized and used by some window\r\n                 ///< functions for optimization (should not be initialized by the\r\n                 ///< caller).\r\n  int KernelLen; ///< Resulting length of the filter kernel, this variable\r\n                 ///< is set after the call to one of the \"init\" functions.\r\n  int fl2;       ///< Internal \"half kernel length\" value. This value can be used\r\n                 ///< as filter's latency in samples (taps), this variable is set after\r\n                 ///< the call to one of the \"init\" functions.\r\n\r\n  double Freq1;     ///< Required corner circular frequency 1 [0; pi]. Used only\r\n                    ///< in the generateBand() function.\r\n  double Freq2;     ///< Required corner circular frequency 2 [0; pi]. Used only\r\n                    ///< in the generateBand() function. The range [Freq1; Freq2] defines\r\n                    ///< a pass band for the generateBand() function.\r\n  double FracDelay; ///< Fractional delay in the range [0; 1], used only in\r\n                    ///< the generateFrac() function. Note that the `FracDelay` parameter\r\n                    ///< is actually inversed. At 0.0 value it produces 1 sample delay\r\n                    ///< (with the latency equal to fl2), at 1.0 value it produces 0\r\n                    ///< sample delay (with the latency equal to fl2 - 1).\r\n\r\n  /**\r\n\t * @brief Window function type.\r\n\t */\r\n\r\n  enum EWindowFunctionType {\r\n    wftCosine,  ///< Generalized cosine window function. No parameters\r\n                ///< required. The \"Power\" parameter is optional.\r\n    wftKaiser,  ///< Kaiser window function. Requires the \"Beta\" parameter.\r\n                ///< The \"Power\" parameter is optional.\r\n    wftGaussian ///< Gaussian window function. Requires the \"Sigma\"\r\n    ///< parameter. The \"Power\" parameter is optional.\r\n  };\r\n\r\n  typedef double (CDSPSincFilterGen ::*CWindowFunc)(); ///< Window\r\n                                                       ///< calculation function pointer type.\r\n\r\n  /**\r\n\t * @brief Initializes *this* structure for generation of a window\r\n\t * function, odd-sized.\r\n\t *\r\n\t * @param WinType Window function type.\r\n\t * @param Params Window function's parameters. If `nullptr`, the table\r\n\t * values may be used.\r\n\t * @param UsePower `true` if the power factor should be used to raise the\r\n\t * window function. If `true`, the power factor should be specified as the\r\n\t * last value in the `Params` array. If `Params` is `nullptr`, the table\r\n\t * or default value of -1.0 (off) will be used.\r\n\t */\r\n\r\n  void initWindow(\r\n      const EWindowFunctionType WinType = wftCosine,\r\n      const double *const Params = R8B_NULL,\r\n      const bool UsePower = false) {\r\n    R8BASSERT(Len2 >= 2.0);\r\n\r\n    fl2 = (int)floor(Len2);\r\n    KernelLen = fl2 + fl2 + 1;\r\n\r\n    setWindow(WinType, Params, UsePower, true);\r\n  }\r\n\r\n  /**\r\n\t * @brief Initializes *this* structure for generation of band-limited\r\n\t * sinc filter kernel.\r\n\t *\r\n\t * The generateBand() function should be used to calculate the filter.\r\n\t *\r\n\t * @param WinType Window function type.\r\n\t * @param Params Window function's parameters. If `nullptr`, the table\r\n\t * values may be used.\r\n\t * @param UsePower `true` if the power factor should be used to raise the\r\n\t * window function. If `true`, the power factor should be specified as the\r\n\t * last value in the `Params` array. If `Params` is `nullptr`, the table\r\n\t * or default value of -1.0 (off) will be used.\r\n\t */\r\n\r\n  void initBand(\r\n      const EWindowFunctionType WinType = wftCosine,\r\n      const double *const Params = R8B_NULL,\r\n      const bool UsePower = false) {\r\n    R8BASSERT(Len2 >= 2.0);\r\n\r\n    fl2 = (int)floor(Len2);\r\n    KernelLen = fl2 + fl2 + 1;\r\n\r\n    setWindow(WinType, Params, UsePower, true);\r\n  }\r\n\r\n  /**\r\n\t * @brief Initializes *this* structure for Hilbert transformation filter\r\n\t * calculation.\r\n\t *\r\n\t * `Freq1` and `Freq2` variables are not used. The generateHilbert()\r\n\t * function should be used to calculate the filter.\r\n\t *\r\n\t * @param WinType Window function type.\r\n\t * @param Params Window function's parameters. If `nullptr`, the table\r\n\t * values may be used.\r\n\t * @param UsePower `true` if the power factor should be used to raise the\r\n\t * window function. If `true`, the power factor should be specified as the\r\n\t * last value in the `Params` array. If `Params` is `nullptr`, the table\r\n\t * or default value of -1.0 (off) will be used.\r\n\t */\r\n\r\n  void initHilbert(\r\n      const EWindowFunctionType WinType = wftCosine,\r\n      const double *const Params = R8B_NULL,\r\n      const bool UsePower = false) {\r\n    R8BASSERT(Len2 >= 2.0);\r\n\r\n    fl2 = (int)floor(Len2);\r\n    KernelLen = fl2 + fl2 + 1;\r\n\r\n    setWindow(WinType, Params, UsePower, true);\r\n  }\r\n\r\n  /**\r\n\t * @brief Initializes *this* structure for generation of full-bandwidth\r\n\t * fractional delay sinc filter kernel.\r\n\t * \r\n\t * `Freq1` and `Freq2` variables are not used. The generateFrac() function\r\n\t * should be used to calculate the filter.\r\n\t *\r\n\t * @param WinType Window function type.\r\n\t * @param Params Window function's parameters. If `nullptr`, the table\r\n\t * values may be used.\r\n\t * @param UsePower `true` if the power factor should be used to raise the\r\n\t * window function. If `true`, the power factor should be specified as the\r\n\t * last value in the `Params` array. If `Params` is `nullptr`, the table\r\n\t * or default value of -1.0 (off) will be used.\r\n\t */\r\n\r\n  void initFrac(\r\n      const EWindowFunctionType WinType = wftCosine,\r\n      const double *const Params = R8B_NULL,\r\n      const bool UsePower = false) {\r\n    R8BASSERT(Len2 >= 2.0);\r\n\r\n    fl2 = (int)ceil(Len2);\r\n    KernelLen = fl2 + fl2;\r\n\r\n    setWindow(WinType, Params, UsePower, false, FracDelay);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the next \"Hann\" window function coefficient.\r\n\t */\r\n\r\n  double calcWindowHann() {\r\n    return (0.5 + 0.5 * w1.generate());\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the next \"Hamming\" window function coefficient.\r\n\t */\r\n\r\n  double calcWindowHamming() {\r\n    return (0.54 + 0.46 * w1.generate());\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the next \"Blackman\" window function coefficient.\r\n\t */\r\n\r\n  double calcWindowBlackman() {\r\n    return (0.42 + 0.5 * w1.generate() + 0.08 * w2.generate());\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the next \"Nuttall\" window function coefficient.\r\n\t */\r\n\r\n  double calcWindowNuttall() {\r\n    return (\r\n        0.355768 + 0.487396 * w1.generate() + 0.144232 * w2.generate() + 0.012604 * w3.generate());\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the next \"Blackman-Nuttall\" window function coefficient.\r\n\t */\r\n\r\n  double calcWindowBlackmanNuttall() {\r\n    return (\r\n        0.3635819 + 0.4891775 * w1.generate() + 0.1365995 * w2.generate() +\r\n        0.0106411 * w3.generate());\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the next \"Kaiser\" window function coefficient.\r\n\t */\r\n\r\n  double calcWindowKaiser() {\r\n    const double n = 1.0 - sqr(wn * Len2i + KaiserLen2Frac);\r\n    wn++;\r\n\r\n    if (n <= 0.0) {\r\n      return (0.0);\r\n    }\r\n\r\n    return (besselI0(KaiserBeta * sqrt(n)) * KaiserMul);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the next \"Gaussian\" window function coefficient.\r\n\t */\r\n\r\n  double calcWindowGaussian() {\r\n    const double f = exp(-0.5 * sqr(wn * GaussianSigmaI + GaussianSigmaFrac));\r\n\r\n    wn++;\r\n\r\n    return (f);\r\n  }\r\n\r\n  /**\r\n\t * @brief Calculates the window function only.\r\n\t *\r\n\t * @param[out] op Output buffer, length = KernelLen.\r\n\t * @param wfunc Window calculation function to use.\r\n\t */\r\n\r\n  void generateWindow(double *op, CWindowFunc wfunc = &CDSPSincFilterGen ::calcWindowBlackman) {\r\n    op += fl2;\r\n    double *op2 = op;\r\n\r\n    int l = fl2;\r\n\r\n    if (Power < 0.0) {\r\n      *op = (*this.*wfunc)();\r\n\r\n      while (l > 0) {\r\n        const double v = (*this.*wfunc)();\r\n\r\n        op++;\r\n        op2--;\r\n        *op = v;\r\n        *op2 = v;\r\n        l--;\r\n      }\r\n    } else {\r\n      *op = pow_a((*this.*wfunc)(), Power);\r\n\r\n      while (l > 0) {\r\n        const double v = pow_a((*this.*wfunc)(), Power);\r\n\r\n        op++;\r\n        op2--;\r\n        *op = v;\r\n        *op2 = v;\r\n        l--;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n\t * @brief Calculates band-limited windowed sinc function-based filter\r\n\t * kernel.\r\n\t *\r\n\t * @param[out] op Output buffer, length = KernelLen.\r\n\t * @param wfunc Window calculation function to use.\r\n\t */\r\n\r\n  void generateBand(double *op, CWindowFunc wfunc = &CDSPSincFilterGen ::calcWindowBlackman) {\r\n    CSineGen f2(Freq2, 0.0, 1.0 / R8B_PI);\r\n    f2.generate();\r\n\r\n    op += fl2;\r\n    double *op2 = op;\r\n    const double pw = Power;\r\n    int t = 1;\r\n\r\n    if (Freq1 < 2.3e-13) {\r\n      if (pw < 0.0) {\r\n        *op = Freq2 * (*this.*wfunc)() / R8B_PI;\r\n\r\n        while (t <= fl2) {\r\n          const double v = f2.generate() * (*this.*wfunc)() / t;\r\n          op++;\r\n          op2--;\r\n          *op = v;\r\n          *op2 = v;\r\n          t++;\r\n        }\r\n      } else {\r\n        *op = Freq2 * pow_a((*this.*wfunc)(), pw) / R8B_PI;\r\n\r\n        while (t <= fl2) {\r\n          const double v = f2.generate() * pow_a((*this.*wfunc)(), pw) / t;\r\n\r\n          op++;\r\n          op2--;\r\n          *op = v;\r\n          *op2 = v;\r\n          t++;\r\n        }\r\n      }\r\n    } else {\r\n      CSineGen f1(Freq1, 0.0, 1.0 / R8B_PI);\r\n      f1.generate();\r\n\r\n      if (pw < 0.0) {\r\n        *op = (Freq2 - Freq1) * (*this.*wfunc)() / R8B_PI;\r\n\r\n        while (t <= fl2) {\r\n          const double v = (f2.generate() - f1.generate()) * (*this.*wfunc)() / t;\r\n\r\n          op++;\r\n          op2--;\r\n          *op = v;\r\n          *op2 = v;\r\n          t++;\r\n        }\r\n      } else {\r\n        *op = (Freq2 - Freq1) * pow_a((*this.*wfunc)(), pw) / R8B_PI;\r\n\r\n        while (t <= fl2) {\r\n          const double v = (f2.generate() - f1.generate()) * pow_a((*this.*wfunc)(), pw) / t;\r\n\r\n          op++;\r\n          op2--;\r\n          *op = v;\r\n          *op2 = v;\r\n          t++;\r\n        }\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n\t * @brief Calculates windowed Hilbert transformer filter kernel.\r\n\t *\r\n\t * @param[out] op Output buffer, length = KernelLen.\r\n\t * @param wfunc Window calculation function to use.\r\n\t */\r\n\r\n  void generateHilbert(double *op, CWindowFunc wfunc = &CDSPSincFilterGen ::calcWindowBlackman) {\r\n    static const double fvalues[2] = {0.0, 2.0 / R8B_PI};\r\n    op += fl2;\r\n    double *op2 = op;\r\n\r\n    (*this.*wfunc)();\r\n    *op = 0.0;\r\n\r\n    int t = 1;\r\n\r\n    if (Power < 0.0) {\r\n      while (t <= fl2) {\r\n        const double v = fvalues[t & 1] * (*this.*wfunc)() / t;\r\n        op++;\r\n        op2--;\r\n        *op = v;\r\n        *op2 = -v;\r\n        t++;\r\n      }\r\n    } else {\r\n      while (t <= fl2) {\r\n        const double v = fvalues[t & 1] * pow_a((*this.*wfunc)(), Power) / t;\r\n\r\n        op++;\r\n        op2--;\r\n        *op = v;\r\n        *op2 = -v;\r\n        t++;\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n\t * @brief Calculates windowed fractional delay filter kernel.\r\n\t *\r\n\t * @param[out] op Output buffer, length = KernelLen.\r\n\t * @param wfunc Window calculation function to use.\r\n\t * @param opinc Output buffer increment, in \"op\" elements.\r\n\t */\r\n\r\n  void generateFrac(\r\n      double *op,\r\n      CWindowFunc wfunc = &CDSPSincFilterGen ::calcWindowBlackman,\r\n      const int opinc = 1) {\r\n    R8BASSERT(opinc != 0);\r\n\r\n    const double pw = Power;\r\n    const double fd = FracDelay;\r\n    int t = -fl2;\r\n\r\n    if (t + fd < -Len2) {\r\n      (*this.*wfunc)();\r\n      *op = 0.0;\r\n      op += opinc;\r\n      t++;\r\n    }\r\n\r\n    double f = sin(fd * R8B_PI) / R8B_PI;\r\n\r\n    if ((t & 1) != 0) {\r\n      f = -f;\r\n    }\r\n\r\n    int IsZeroX = (fabs(fd - 1.0) < 2.3e-13);\r\n    int mt = 0 - IsZeroX;\r\n    IsZeroX = (IsZeroX || fabs(fd) < 2.3e-13);\r\n\r\n    if (pw < 0.0) {\r\n      while (t < mt) {\r\n        *op = f * (*this.*wfunc)() / (t + fd);\r\n        op += opinc;\r\n        t++;\r\n        f = -f;\r\n      }\r\n\r\n      if (IsZeroX) // t+FracDelay==0\r\n      {\r\n        *op = (*this.*wfunc)();\r\n      } else {\r\n        *op = f * (*this.*wfunc)() / fd; // t==0\r\n      }\r\n\r\n      mt = fl2 - 2;\r\n\r\n      while (t < mt) {\r\n        op += opinc;\r\n        t++;\r\n        f = -f;\r\n        *op = f * (*this.*wfunc)() / (t + fd);\r\n      }\r\n\r\n      op += opinc;\r\n      t++;\r\n      f = -f;\r\n      const double ut = t + fd;\r\n      *op = (ut > Len2 ? 0.0 : f * (*this.*wfunc)() / ut);\r\n    } else {\r\n      while (t < mt) {\r\n        *op = f * pow_a((*this.*wfunc)(), pw) / (t + fd);\r\n        op += opinc;\r\n        t++;\r\n        f = -f;\r\n      }\r\n\r\n      if (IsZeroX) // t+FracDelay==0\r\n      {\r\n        *op = pow_a((*this.*wfunc)(), pw);\r\n      } else {\r\n        *op = f * pow_a((*this.*wfunc)(), pw) / fd; // t==0\r\n      }\r\n\r\n      mt = fl2 - 2;\r\n\r\n      while (t < mt) {\r\n        op += opinc;\r\n        t++;\r\n        f = -f;\r\n        *op = f * pow_a((*this.*wfunc)(), pw) / (t + fd);\r\n      }\r\n\r\n      op += opinc;\r\n      t++;\r\n      f = -f;\r\n      const double ut = t + FracDelay;\r\n      *op = (ut > Len2 ? 0.0 : f * pow_a((*this.*wfunc)(), pw) / ut);\r\n    }\r\n  }\r\n\r\n private:\r\n  double Power; ///< The power factor used to raise the window function.\r\n                ///< Equals a negative value if the power factor should not be used.\r\n  CSineGen w1;  ///< Cosine wave 1 for window function.\r\n  CSineGen w2;  ///< Cosine wave 2 for window function.\r\n  CSineGen w3;  ///< Cosine wave 3 for window function.\r\n\r\n  double KaiserBeta;        ///< Kaiser window function's \"Beta\" coefficient.\r\n  double KaiserMul;         ///< Kaiser window function's divisor, inverse.\r\n  double KaiserLen2Frac;    ///< Equals `FracDelay / Len2`.\r\n  double GaussianSigmaI;    ///< Gaussian window function's \"Sigma\"\r\n                            ///< coefficient, inverse.\r\n  double GaussianSigmaFrac; ///< Equals `FracDelay / GaussianSigma`.\r\n\r\n  int wn; ///< Window function integer position. 0 - center of the window\r\n          ///< function. This variable may not be used by some window functions.\r\n\r\n  /**\r\n\t * @brief Initializes Kaiser window function calculation.\r\n\t * \r\n\t * The `FracDelay` variable should be initialized when using this window\r\n\t * function.\r\n\t *\r\n\t * @param Params Function parameters. If `nullptr`, the default values\r\n\t * will be used; otherwise, the first parameter should specify the \"Beta\"\r\n\t * value.\r\n\t * @param UsePower `true` if the power factor should be used to raise the\r\n\t * window function.\r\n\t * @param IsCentered `true` if centered window should be used. This\r\n\t * parameter usually equals to `false` for fractional delay filters only.\r\n\t */\r\n\r\n  void setWindowKaiser(const double *Params, const bool UsePower, const bool IsCentered) {\r\n    wn = (IsCentered ? 0 : -fl2);\r\n\r\n    if (Params == R8B_NULL) {\r\n      KaiserBeta = 9.5945013206755156;\r\n      Power = (UsePower ? 1.9718457932433306 : -1.0);\r\n    } else {\r\n      KaiserBeta = clampr(Params[0], 1.0, 350.0);\r\n      Power = (UsePower ? fabs(Params[1]) : -1.0);\r\n    }\r\n\r\n    KaiserMul = 1.0 / besselI0(KaiserBeta);\r\n    Len2i = 1.0 / Len2;\r\n    KaiserLen2Frac = FracDelay * Len2i;\r\n  }\r\n\r\n  /**\r\n\t * @brief Initializes Gaussian window function calculation.\r\n\t *\r\n\t * The `FracDelay` variable should be initialized when using this window\r\n\t * function.\r\n\t *\r\n\t * @param Params Function parameters. If `nullptr`, the table values will\r\n\t * be used; otherwise, the first parameter should specify the \"Sigma\"\r\n\t * value.\r\n\t * @param UsePower `true` if the power factor should be used to raise the\r\n\t * window function.\r\n\t * @param IsCentered `true` if centered window should be used. This\r\n\t * parameter usually equals to `false` for fractional delay filters only.\r\n\t */\r\n\r\n  void setWindowGaussian(const double *Params, const bool UsePower, const bool IsCentered) {\r\n    wn = (IsCentered ? 0 : -fl2);\r\n\r\n    if (Params == R8B_NULL) {\r\n      GaussianSigmaI = 1.0;\r\n      Power = -1.0;\r\n    } else {\r\n      GaussianSigmaI = clampr(fabs(Params[0]), 1e-1, 100.0);\r\n      Power = (UsePower ? fabs(Params[1]) : -1.0);\r\n    }\r\n\r\n    GaussianSigmaI *= Len2;\r\n    GaussianSigmaI = 1.0 / GaussianSigmaI;\r\n    GaussianSigmaFrac = FracDelay * GaussianSigmaI;\r\n  }\r\n\r\n  /**\r\n\t * @brief Initializes calculation of window function of the specified\r\n\t * type.\r\n\t *\r\n\t * @param WinType Window function type.\r\n\t * @param Params Window function's parameters. If `nullptr`, the table\r\n\t * values may be used.\r\n\t * @param UsePower `true` if the power factor should be used to raise the\r\n\t * window function. If `true`, the power factor should be specified as the\r\n\t * last value in the `Params` array. If `Params` is `nullptr`, the table\r\n\t * or default value of -1.0 (off) will be used.\r\n\t * @param IsCentered `true` if centered window should be used. This\r\n\t * parameter usually equals to `false` for fractional delay filters only.\r\n\t * @param UseFracDelay Fractional delay to use.\r\n\t */\r\n\r\n  void setWindow(\r\n      const EWindowFunctionType WinType,\r\n      const double *const Params,\r\n      const bool UsePower,\r\n      const bool IsCentered,\r\n      const double UseFracDelay = 0.0) {\r\n    FracDelay = UseFracDelay;\r\n\r\n    if (WinType == wftCosine) {\r\n      if (IsCentered) {\r\n        w1.init(R8B_PI / Len2, R8B_PId2);\r\n        w2.init(R8B_2PI / Len2, R8B_PId2);\r\n        w3.init(R8B_3PI / Len2, R8B_PId2);\r\n      } else {\r\n        const double step1 = R8B_PI / Len2;\r\n        w1.init(step1, R8B_PId2 - step1 * fl2 + step1 * FracDelay);\r\n\r\n        const double step2 = R8B_2PI / Len2;\r\n        w2.init(step2, R8B_PId2 - step2 * fl2 + step2 * FracDelay);\r\n\r\n        const double step3 = R8B_3PI / Len2;\r\n        w3.init(step3, R8B_PId2 - step3 * fl2 + step3 * FracDelay);\r\n      }\r\n\r\n      Power = (UsePower && Params != R8B_NULL ? Params[0] : -1.0);\r\n    } else if (WinType == wftKaiser) {\r\n      setWindowKaiser(Params, UsePower, IsCentered);\r\n    } else if (WinType == wftGaussian) {\r\n      setWindowGaussian(Params, UsePower, IsCentered);\r\n    }\r\n  }\r\n};\r\n\r\n} // namespace r8b\r\n\r\n#endif // R8B_CDSPSINCFILTERGEN_INCLUDED\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/Resampler.hpp",
    "content": "#pragma once\n\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <cstddef>\n#include <memory>\n#include <vector>\n\n// Sample rate converter designed by Aleksey Vaneev of Voxengo on MIT license\n#include \"CDSPResampler.h\"\n\nnamespace r8b {\n\nclass BaseResampler {\n public:\n  BaseResampler(const BaseResampler &) = delete;\n  BaseResampler &operator=(const BaseResampler &) = delete;\n  BaseResampler(BaseResampler &&) noexcept = default;\n  BaseResampler &operator=(BaseResampler &&) noexcept = default;\n  virtual ~BaseResampler() = default;\n\n  /** @return Maximum number of output samples per channel for one process() call (for the maxInLen passed to the constructor). */\n  [[nodiscard]] int getMaxOutLen() const {\n    if (resamplers_.empty()) {\n      return 0;\n    }\n    return resamplers_[0]->getMaxOutLen(0);\n  }\n\n private:\n  std::vector<std::unique_ptr<CDSPResampler24>> resamplers_;\n  std::vector<std::vector<double>> inputBuffers_;\n\n protected:\n  static constexpr int DEFAULT_MAX_IN_LEN = 2048;\n\n  BaseResampler(\n      double srcRate,\n      double dstRate,\n      int numChannels,\n      int maxInLen = DEFAULT_MAX_IN_LEN) {\n    resamplers_.reserve(static_cast<size_t>(numChannels));\n    inputBuffers_.reserve(static_cast<size_t>(numChannels));\n    for (int i = 0; i < numChannels; ++i) {\n      resamplers_.emplace_back(std::make_unique<CDSPResampler24>(srcRate, dstRate, maxInLen));\n      inputBuffers_.emplace_back(static_cast<size_t>(maxInLen));\n    }\n  }\n\n  int process(const std::vector<float *> &input, int l, std::vector<float *> &output) {\n    int outLen = 0;\n    const size_t numChannels = resamplers_.size();\n\n    for (size_t i = 0; i < numChannels; ++i) {\n      const float *__restrict inData = input[i];\n      double *__restrict bufData = inputBuffers_[i].data();\n\n      for (int j = 0; j < l; ++j) {\n        bufData[j] = static_cast<double>(inData[j]);\n      }\n\n      double *outPtr = nullptr;\n      const int currentOutLen = resamplers_[i]->process(bufData, l, outPtr);\n      outLen = currentOutLen;\n\n      if (currentOutLen > 0 && outPtr != nullptr) {\n        const double *__restrict resampledData = outPtr;\n        float *__restrict outData = output[i];\n\n        for (int j = 0; j < currentOutLen; ++j) {\n          outData[j] = static_cast<float>(resampledData[j]);\n        }\n      }\n    }\n\n    return outLen;\n  }\n};\n\nclass MultiChannelResampler : public BaseResampler {\n public:\n  MultiChannelResampler(\n      double srcRate,\n      double dstRate,\n      int numChannels,\n      int maxInLen = DEFAULT_MAX_IN_LEN)\n      : BaseResampler(srcRate, dstRate, numChannels, maxInLen) {}\n\n  template <size_t Alignment>\n  int process(\n      const audioapi::AlignedAudioBuffer<Alignment> &input,\n      int length,\n      audioapi::AlignedAudioBuffer<Alignment> &output) {\n    const size_t numChannels = input.getNumberOfChannels();\n    std::vector<float *> inputPtrs(numChannels);\n    std::vector<float *> outputPtrs(numChannels);\n    for (size_t i = 0; i < numChannels; ++i) {\n      inputPtrs[i] = input.getChannel(i)->begin();\n      outputPtrs[i] = output.getChannel(i)->begin();\n    }\n    return BaseResampler::process(inputPtrs, length, outputPtrs);\n  }\n};\n\nclass SingleChannelResampler : public BaseResampler {\n public:\n  SingleChannelResampler(double srcRate, double dstRate, int maxInLen = DEFAULT_MAX_IN_LEN)\n      : BaseResampler(srcRate, dstRate, 1, maxInLen) {}\n\n  template <size_t Alignment>\n  int process(\n      const audioapi::AlignedAudioArray<Alignment> &input,\n      int length,\n      audioapi::AlignedAudioArray<Alignment> &output) {\n    std::vector<float *> inputPtrs(1);\n    std::vector<float *> outputPtrs(1);\n    inputPtrs[0] = const_cast<float *>(input.begin());\n    outputPtrs[0] = output.begin();\n    return BaseResampler::process(inputPtrs, length, outputPtrs);\n  }\n};\n\n} // namespace r8b\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/fft/fft4g.h",
    "content": "//$ nobt\n//$ nocpp\n\n/**\n * @file fft4g.h\n *\n * @brief Wrapper class for Takuya OOURA's FFT functions.\n *\n * Functions from the FFT package by: Copyright(C) 1996-2001 Takuya OOURA\n * http://www.kurims.kyoto-u.ac.jp/~ooura/fft.html\n *\n * Modified and used with permission granted by the license.\n *\n * Here, the original \"fft4g.c\" file was wrapped into the \"ooura_fft\" class.\n */\n\n#ifndef R8B_FFT4G_INCLUDED\n#define R8B_FFT4G_INCLUDED\n\n#if __cplusplus >= 201103L\n#include <cmath>\n#else // __cplusplus >= 201103L\n#include <math.h>\n#endif // __cplusplus >= 201103L\n\nnamespace r8b {\n\n#if __cplusplus >= 201103L\n\nusing std ::atan;\nusing std ::cos;\nusing std ::sin;\n\n#endif // __cplusplus >= 201103L\n\n/**\n * @brief A wrapper class around Takuya OOURA's FFT functions.\n *\n * A wrapper class around fft4g.c file's FFT functions by Takuya OOURA.\n * Provides static private functions for use by the CDSPRealFFT class.\n */\n\nclass ooura_fft {\n public:\n  /*\nFast Fourier/Cosine/Sine Transform\n    dimension   :one\n    data length :power of 2\n    decimation  :frequency\n    radix       :4, 2\n    data        :inplace\n    table       :use\nfunctions\n    cdft: Complex Discrete Fourier Transform\n    rdft: Real Discrete Fourier Transform\n    ddct: Discrete Cosine Transform\n    ddst: Discrete Sine Transform\n    dfct: Cosine Transform of RDFT (Real Symmetric DFT)\n    dfst: Sine Transform of RDFT (Real Anti-symmetric DFT)\nfunction prototypes\n    void cdft(int, int, double *, int *, double *);\n    void rdft(int, int, double *, int *, double *);\n    void ddct(int, int, double *, int *, double *);\n    void ddst(int, int, double *, int *, double *);\n    void dfct(int, double *, double *, int *, double *);\n    void dfst(int, double *, double *, int *, double *);\n\n\n-------- Complex DFT (Discrete Fourier Transform) --------\n    [definition]\n        <case1>\n            X[k] = sum_j=0^n-1 x[j]*exp(2*pi*i*j*k/n), 0<=k<n\n        <case2>\n            X[k] = sum_j=0^n-1 x[j]*exp(-2*pi*i*j*k/n), 0<=k<n\n        (notes: sum_j=0^n-1 is a summation from j=0 to n-1)\n    [usage]\n        <case1>\n            ip[0] = 0; // first time only\n            cdft(2*n, 1, a, ip, w);\n        <case2>\n            ip[0] = 0; // first time only\n            cdft(2*n, -1, a, ip, w);\n    [parameters]\n        2*n            :data length (int)\n                        n >= 1, n = power of 2\n        a[0...2*n-1]   :input/output data (double *)\n                        input data\n                            a[2*j] = Re(x[j]), \n                            a[2*j+1] = Im(x[j]), 0<=j<n\n                        output data\n                            a[2*k] = Re(X[k]), \n                            a[2*k+1] = Im(X[k]), 0<=k<n\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n/2-1]   :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            cdft(2*n, -1, a, ip, w);\n        is \n            cdft(2*n, 1, a, ip, w);\n            for (j = 0; j <= 2 * n - 1; j++) {\n                a[j] *= 1.0 / n;\n            }\n        .\n\n\n-------- Real DFT / Inverse of Real DFT --------\n    [definition]\n        <case1> RDFT\n            R[k] = sum_j=0^n-1 a[j]*cos(2*pi*j*k/n), 0<=k<=n/2\n            I[k] = sum_j=0^n-1 a[j]*sin(2*pi*j*k/n), 0<k<n/2\n        <case2> IRDFT (excluding scale)\n            a[k] = (R[0] + R[n/2]*cos(pi*k))/2 + \n                   sum_j=1^n/2-1 R[j]*cos(2*pi*j*k/n) + \n                   sum_j=1^n/2-1 I[j]*sin(2*pi*j*k/n), 0<=k<n\n    [usage]\n        <case1>\n            ip[0] = 0; // first time only\n            rdft(n, 1, a, ip, w);\n        <case2>\n            ip[0] = 0; // first time only\n            rdft(n, -1, a, ip, w);\n    [parameters]\n        n              :data length (int)\n                        n >= 2, n = power of 2\n        a[0...n-1]     :input/output data (double *)\n                        <case1>\n                            output data\n                                a[2*k] = R[k], 0<=k<n/2\n                                a[2*k+1] = I[k], 0<k<n/2\n                                a[1] = R[n/2]\n                        <case2>\n                            input data\n                                a[2*j] = R[j], 0<=j<n/2\n                                a[2*j+1] = I[j], 0<j<n/2\n                                a[1] = R[n/2]\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/2)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n/2-1]   :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            rdft(n, 1, a, ip, w);\n        is \n            rdft(n, -1, a, ip, w);\n            for (j = 0; j <= n - 1; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\n-------- DCT (Discrete Cosine Transform) / Inverse of DCT --------\n    [definition]\n        <case1> IDCT (excluding scale)\n            C[k] = sum_j=0^n-1 a[j]*cos(pi*j*(k+1/2)/n), 0<=k<n\n        <case2> DCT\n            C[k] = sum_j=0^n-1 a[j]*cos(pi*(j+1/2)*k/n), 0<=k<n\n    [usage]\n        <case1>\n            ip[0] = 0; // first time only\n            ddct(n, 1, a, ip, w);\n        <case2>\n            ip[0] = 0; // first time only\n            ddct(n, -1, a, ip, w);\n    [parameters]\n        n              :data length (int)\n                        n >= 2, n = power of 2\n        a[0...n-1]     :input/output data (double *)\n                        output data\n                            a[k] = C[k], 0<=k<n\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/2)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n*5/4-1] :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            ddct(n, -1, a, ip, w);\n        is \n            a[0] *= 0.5;\n            ddct(n, 1, a, ip, w);\n            for (j = 0; j <= n - 1; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\n-------- DST (Discrete Sine Transform) / Inverse of DST --------\n    [definition]\n        <case1> IDST (excluding scale)\n            S[k] = sum_j=1^n A[j]*sin(pi*j*(k+1/2)/n), 0<=k<n\n        <case2> DST\n            S[k] = sum_j=0^n-1 a[j]*sin(pi*(j+1/2)*k/n), 0<k<=n\n    [usage]\n        <case1>\n            ip[0] = 0; // first time only\n            ddst(n, 1, a, ip, w);\n        <case2>\n            ip[0] = 0; // first time only\n            ddst(n, -1, a, ip, w);\n    [parameters]\n        n              :data length (int)\n                        n >= 2, n = power of 2\n        a[0...n-1]     :input/output data (double *)\n                        <case1>\n                            input data\n                                a[j] = A[j], 0<j<n\n                                a[0] = A[n]\n                            output data\n                                a[k] = S[k], 0<=k<n\n                        <case2>\n                            output data\n                                a[k] = S[k], 0<k<n\n                                a[0] = S[n]\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/2)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/2+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n*5/4-1] :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            ddst(n, -1, a, ip, w);\n        is \n            a[0] *= 0.5;\n            ddst(n, 1, a, ip, w);\n            for (j = 0; j <= n - 1; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\n-------- Cosine Transform of RDFT (Real Symmetric DFT) --------\n    [definition]\n        C[k] = sum_j=0^n a[j]*cos(pi*j*k/n), 0<=k<=n\n    [usage]\n        ip[0] = 0; // first time only\n        dfct(n, a, t, ip, w);\n    [parameters]\n        n              :data length - 1 (int)\n                        n >= 2, n = power of 2\n        a[0...n]       :input/output data (double *)\n                        output data\n                            a[k] = C[k], 0<=k<=n\n        t[0...n/2]     :work area (double *)\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/4)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/4+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n*5/8-1] :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            a[0] *= 0.5;\n            a[n] *= 0.5;\n            dfct(n, a, t, ip, w);\n        is \n            a[0] *= 0.5;\n            a[n] *= 0.5;\n            dfct(n, a, t, ip, w);\n            for (j = 0; j <= n; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\n-------- Sine Transform of RDFT (Real Anti-symmetric DFT) --------\n    [definition]\n        S[k] = sum_j=1^n-1 a[j]*sin(pi*j*k/n), 0<k<n\n    [usage]\n        ip[0] = 0; // first time only\n        dfst(n, a, t, ip, w);\n    [parameters]\n        n              :data length + 1 (int)\n                        n >= 2, n = power of 2\n        a[0...n-1]     :input/output data (double *)\n                        output data\n                            a[k] = S[k], 0<k<n\n                        (a[0] is used for work area)\n        t[0...n/2-1]   :work area (double *)\n        ip[0...*]      :work area for bit reversal (int *)\n                        length of ip >= 2+sqrt(n/4)\n                        strictly, \n                        length of ip >= \n                            2+(1<<(int)(log(n/4+0.5)/log(2))/2).\n                        ip[0],ip[1] are pointers of the cos/sin table.\n        w[0...n*5/8-1] :cos/sin table (double *)\n                        w[],ip[] are initialized if ip[0] == 0.\n    [remark]\n        Inverse of \n            dfst(n, a, t, ip, w);\n        is \n            dfst(n, a, t, ip, w);\n            for (j = 1; j <= n - 1; j++) {\n                a[j] *= 2.0 / n;\n            }\n        .\n\n\nAppendix :\n    The cos/sin table is recalculated when the larger table required.\n    w[] and ip[] are compatible with all routines.\n*/\n\n  static void cdft(int n, int isgn, double *a, int *ip, double *w) {\n    if (n > (ip[0] << 2)) {\n      makewt(n >> 2, ip, w);\n    }\n    if (n > 4) {\n      if (isgn >= 0) {\n        bitrv2(n, ip + 2, a);\n        cftfsub(n, a, w);\n      } else {\n        bitrv2conj(n, ip + 2, a);\n        cftbsub(n, a, w);\n      }\n    } else if (n == 4) {\n      cftfsub(n, a, w);\n    }\n  }\n\n  static void rdft(int n, int isgn, double *a, int *ip, double *w) {\n    int nw, nc;\n    double xi;\n\n    nw = ip[0];\n    if (n > (nw << 2)) {\n      nw = n >> 2;\n      makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > (nc << 2)) {\n      nc = n >> 2;\n      makect(nc, ip, w + nw);\n    }\n    if (isgn >= 0) {\n      if (n > 4) {\n        bitrv2(n, ip + 2, a);\n        cftfsub(n, a, w);\n        rftfsub(n, a, nc, w + nw);\n      } else if (n == 4) {\n        cftfsub(n, a, w);\n      }\n      xi = a[0] - a[1];\n      a[0] += a[1];\n      a[1] = xi;\n    } else {\n      a[1] = 0.5 * (a[0] - a[1]);\n      a[0] -= a[1];\n      if (n > 4) {\n        rftbsub(n, a, nc, w + nw);\n        bitrv2(n, ip + 2, a);\n        cftbsub(n, a, w);\n      } else if (n == 4) {\n        cftfsub(n, a, w);\n      }\n    }\n  }\n\n  static void ddct(int n, int isgn, double *a, int *ip, double *w) {\n    int j, nw, nc;\n    double xr;\n\n    nw = ip[0];\n    if (n > (nw << 2)) {\n      nw = n >> 2;\n      makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > nc) {\n      nc = n;\n      makect(nc, ip, w + nw);\n    }\n    if (isgn < 0) {\n      xr = a[n - 1];\n      for (j = n - 2; j >= 2; j -= 2) {\n        a[j + 1] = a[j] - a[j - 1];\n        a[j] += a[j - 1];\n      }\n      a[1] = a[0] - xr;\n      a[0] += xr;\n      if (n > 4) {\n        rftbsub(n, a, nc, w + nw);\n        bitrv2(n, ip + 2, a);\n        cftbsub(n, a, w);\n      } else if (n == 4) {\n        cftfsub(n, a, w);\n      }\n    }\n    dctsub(n, a, nc, w + nw);\n    if (isgn >= 0) {\n      if (n > 4) {\n        bitrv2(n, ip + 2, a);\n        cftfsub(n, a, w);\n        rftfsub(n, a, nc, w + nw);\n      } else if (n == 4) {\n        cftfsub(n, a, w);\n      }\n      xr = a[0] - a[1];\n      a[0] += a[1];\n      for (j = 2; j < n; j += 2) {\n        a[j - 1] = a[j] - a[j + 1];\n        a[j] += a[j + 1];\n      }\n      a[n - 1] = xr;\n    }\n  }\n\n  static void ddst(int n, int isgn, double *a, int *ip, double *w) {\n    int j, nw, nc;\n    double xr;\n\n    nw = ip[0];\n    if (n > (nw << 2)) {\n      nw = n >> 2;\n      makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > nc) {\n      nc = n;\n      makect(nc, ip, w + nw);\n    }\n    if (isgn < 0) {\n      xr = a[n - 1];\n      for (j = n - 2; j >= 2; j -= 2) {\n        a[j + 1] = -a[j] - a[j - 1];\n        a[j] -= a[j - 1];\n      }\n      a[1] = a[0] + xr;\n      a[0] -= xr;\n      if (n > 4) {\n        rftbsub(n, a, nc, w + nw);\n        bitrv2(n, ip + 2, a);\n        cftbsub(n, a, w);\n      } else if (n == 4) {\n        cftfsub(n, a, w);\n      }\n    }\n    dstsub(n, a, nc, w + nw);\n    if (isgn >= 0) {\n      if (n > 4) {\n        bitrv2(n, ip + 2, a);\n        cftfsub(n, a, w);\n        rftfsub(n, a, nc, w + nw);\n      } else if (n == 4) {\n        cftfsub(n, a, w);\n      }\n      xr = a[0] - a[1];\n      a[0] += a[1];\n      for (j = 2; j < n; j += 2) {\n        a[j - 1] = -a[j] - a[j + 1];\n        a[j] -= a[j + 1];\n      }\n      a[n - 1] = -xr;\n    }\n  }\n\n  static void dfct(int n, double *a, double *t, int *ip, double *w) {\n    int j, k, l, m, mh, nw, nc;\n    double xr, xi, yr, yi;\n\n    nw = ip[0];\n    if (n > (nw << 3)) {\n      nw = n >> 3;\n      makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > (nc << 1)) {\n      nc = n >> 1;\n      makect(nc, ip, w + nw);\n    }\n    m = n >> 1;\n    yi = a[m];\n    xi = a[0] + a[n];\n    a[0] -= a[n];\n    t[0] = xi - yi;\n    t[m] = xi + yi;\n    if (n > 2) {\n      mh = m >> 1;\n      for (j = 1; j < mh; j++) {\n        k = m - j;\n        xr = a[j] - a[n - j];\n        xi = a[j] + a[n - j];\n        yr = a[k] - a[n - k];\n        yi = a[k] + a[n - k];\n        a[j] = xr;\n        a[k] = yr;\n        t[j] = xi - yi;\n        t[k] = xi + yi;\n      }\n      t[mh] = a[mh] + a[n - mh];\n      a[mh] -= a[n - mh];\n      dctsub(m, a, nc, w + nw);\n      if (m > 4) {\n        bitrv2(m, ip + 2, a);\n        cftfsub(m, a, w);\n        rftfsub(m, a, nc, w + nw);\n      } else if (m == 4) {\n        cftfsub(m, a, w);\n      }\n      a[n - 1] = a[0] - a[1];\n      a[1] = a[0] + a[1];\n      for (j = m - 2; j >= 2; j -= 2) {\n        a[2 * j + 1] = a[j] + a[j + 1];\n        a[2 * j - 1] = a[j] - a[j + 1];\n      }\n      l = 2;\n      m = mh;\n      while (m >= 2) {\n        dctsub(m, t, nc, w + nw);\n        if (m > 4) {\n          bitrv2(m, ip + 2, t);\n          cftfsub(m, t, w);\n          rftfsub(m, t, nc, w + nw);\n        } else if (m == 4) {\n          cftfsub(m, t, w);\n        }\n        a[n - l] = t[0] - t[1];\n        a[l] = t[0] + t[1];\n        k = 0;\n        for (j = 2; j < m; j += 2) {\n          k += l << 2;\n          a[k - l] = t[j] - t[j + 1];\n          a[k + l] = t[j] + t[j + 1];\n        }\n        l <<= 1;\n        mh = m >> 1;\n        for (j = 0; j < mh; j++) {\n          k = m - j;\n          t[j] = t[m + k] - t[m + j];\n          t[k] = t[m + k] + t[m + j];\n        }\n        t[mh] = t[m + mh];\n        m = mh;\n      }\n      a[l] = t[0];\n      a[n] = t[2] - t[1];\n      a[0] = t[2] + t[1];\n    } else {\n      a[1] = a[0];\n      a[2] = t[0];\n      a[0] = t[1];\n    }\n  }\n\n  static void dfst(int n, double *a, double *t, int *ip, double *w) {\n    int j, k, l, m, mh, nw, nc;\n    double xr, xi, yr, yi;\n\n    nw = ip[0];\n    if (n > (nw << 3)) {\n      nw = n >> 3;\n      makewt(nw, ip, w);\n    }\n    nc = ip[1];\n    if (n > (nc << 1)) {\n      nc = n >> 1;\n      makect(nc, ip, w + nw);\n    }\n    if (n > 2) {\n      m = n >> 1;\n      mh = m >> 1;\n      for (j = 1; j < mh; j++) {\n        k = m - j;\n        xr = a[j] + a[n - j];\n        xi = a[j] - a[n - j];\n        yr = a[k] + a[n - k];\n        yi = a[k] - a[n - k];\n        a[j] = xr;\n        a[k] = yr;\n        t[j] = xi + yi;\n        t[k] = xi - yi;\n      }\n      t[0] = a[mh] - a[n - mh];\n      a[mh] += a[n - mh];\n      a[0] = a[m];\n      dstsub(m, a, nc, w + nw);\n      if (m > 4) {\n        bitrv2(m, ip + 2, a);\n        cftfsub(m, a, w);\n        rftfsub(m, a, nc, w + nw);\n      } else if (m == 4) {\n        cftfsub(m, a, w);\n      }\n      a[n - 1] = a[1] - a[0];\n      a[1] = a[0] + a[1];\n      for (j = m - 2; j >= 2; j -= 2) {\n        a[2 * j + 1] = a[j] - a[j + 1];\n        a[2 * j - 1] = -a[j] - a[j + 1];\n      }\n      l = 2;\n      m = mh;\n      while (m >= 2) {\n        dstsub(m, t, nc, w + nw);\n        if (m > 4) {\n          bitrv2(m, ip + 2, t);\n          cftfsub(m, t, w);\n          rftfsub(m, t, nc, w + nw);\n        } else if (m == 4) {\n          cftfsub(m, t, w);\n        }\n        a[n - l] = t[1] - t[0];\n        a[l] = t[0] + t[1];\n        k = 0;\n        for (j = 2; j < m; j += 2) {\n          k += l << 2;\n          a[k - l] = -t[j] - t[j + 1];\n          a[k + l] = t[j] - t[j + 1];\n        }\n        l <<= 1;\n        mh = m >> 1;\n        for (j = 1; j < mh; j++) {\n          k = m - j;\n          t[j] = t[m + k] + t[m + j];\n          t[k] = t[m + k] - t[m + j];\n        }\n        t[0] = t[m + mh];\n        m = mh;\n      }\n      a[l] = t[0];\n    }\n    a[0] = 0;\n  }\n\n  /* -------- initializing routines -------- */\n\n  static void makewt(int nw, int *ip, double *w) {\n    int j, nwh;\n    double delta, x, y;\n\n    ip[0] = nw;\n    ip[1] = 1;\n    if (nw > 2) {\n      nwh = nw >> 1;\n      delta = atan(1.0) / nwh;\n      w[0] = 1;\n      w[1] = 0;\n      w[nwh] = cos(delta * nwh);\n      w[nwh + 1] = w[nwh];\n      if (nwh > 2) {\n        for (j = 2; j < nwh; j += 2) {\n          x = cos(delta * j);\n          y = sin(delta * j);\n          w[j] = x;\n          w[j + 1] = y;\n          w[nw - j] = y;\n          w[nw - j + 1] = x;\n        }\n        bitrv2(nw, ip + 2, w);\n      }\n    }\n  }\n\n  static void makect(int nc, int *ip, double *c) {\n    int j, nch;\n    double delta;\n\n    ip[1] = nc;\n    if (nc > 1) {\n      nch = nc >> 1;\n      delta = atan(1.0) / nch;\n      c[0] = cos(delta * nch);\n      c[nch] = 0.5 * c[0];\n      for (j = 1; j < nch; j++) {\n        c[j] = 0.5 * cos(delta * j);\n        c[nc - j] = 0.5 * sin(delta * j);\n      }\n    }\n  }\n\n  /* -------- child routines -------- */\n\n  static void bitrv2(int n, int *ip, double *a) {\n    int j, j1, k, k1, l, m, m2;\n    double xr, xi, yr, yi;\n\n    ip[0] = 0;\n    l = n;\n    m = 1;\n    while ((m << 3) < l) {\n      l >>= 1;\n      for (j = 0; j < m; j++) {\n        ip[m + j] = ip[j] + l;\n      }\n      m <<= 1;\n    }\n    m2 = 2 * m;\n    if ((m << 3) == l) {\n      for (k = 0; k < m; k++) {\n        for (j = 0; j < k; j++) {\n          j1 = 2 * j + ip[k];\n          k1 = 2 * k + ip[j];\n          xr = a[j1];\n          xi = a[j1 + 1];\n          yr = a[k1];\n          yi = a[k1 + 1];\n          a[j1] = yr;\n          a[j1 + 1] = yi;\n          a[k1] = xr;\n          a[k1 + 1] = xi;\n          j1 += m2;\n          k1 += 2 * m2;\n          xr = a[j1];\n          xi = a[j1 + 1];\n          yr = a[k1];\n          yi = a[k1 + 1];\n          a[j1] = yr;\n          a[j1 + 1] = yi;\n          a[k1] = xr;\n          a[k1 + 1] = xi;\n          j1 += m2;\n          k1 -= m2;\n          xr = a[j1];\n          xi = a[j1 + 1];\n          yr = a[k1];\n          yi = a[k1 + 1];\n          a[j1] = yr;\n          a[j1 + 1] = yi;\n          a[k1] = xr;\n          a[k1 + 1] = xi;\n          j1 += m2;\n          k1 += 2 * m2;\n          xr = a[j1];\n          xi = a[j1 + 1];\n          yr = a[k1];\n          yi = a[k1 + 1];\n          a[j1] = yr;\n          a[j1 + 1] = yi;\n          a[k1] = xr;\n          a[k1 + 1] = xi;\n        }\n        j1 = 2 * k + m2 + ip[k];\n        k1 = j1 + m2;\n        xr = a[j1];\n        xi = a[j1 + 1];\n        yr = a[k1];\n        yi = a[k1 + 1];\n        a[j1] = yr;\n        a[j1 + 1] = yi;\n        a[k1] = xr;\n        a[k1 + 1] = xi;\n      }\n    } else {\n      for (k = 1; k < m; k++) {\n        for (j = 0; j < k; j++) {\n          j1 = 2 * j + ip[k];\n          k1 = 2 * k + ip[j];\n          xr = a[j1];\n          xi = a[j1 + 1];\n          yr = a[k1];\n          yi = a[k1 + 1];\n          a[j1] = yr;\n          a[j1 + 1] = yi;\n          a[k1] = xr;\n          a[k1 + 1] = xi;\n          j1 += m2;\n          k1 += m2;\n          xr = a[j1];\n          xi = a[j1 + 1];\n          yr = a[k1];\n          yi = a[k1 + 1];\n          a[j1] = yr;\n          a[j1 + 1] = yi;\n          a[k1] = xr;\n          a[k1 + 1] = xi;\n        }\n      }\n    }\n  }\n\n  static void bitrv2conj(int n, int *ip, double *a) {\n    int j, j1, k, k1, l, m, m2;\n    double xr, xi, yr, yi;\n\n    ip[0] = 0;\n    l = n;\n    m = 1;\n    while ((m << 3) < l) {\n      l >>= 1;\n      for (j = 0; j < m; j++) {\n        ip[m + j] = ip[j] + l;\n      }\n      m <<= 1;\n    }\n    m2 = 2 * m;\n    if ((m << 3) == l) {\n      for (k = 0; k < m; k++) {\n        for (j = 0; j < k; j++) {\n          j1 = 2 * j + ip[k];\n          k1 = 2 * k + ip[j];\n          xr = a[j1];\n          xi = -a[j1 + 1];\n          yr = a[k1];\n          yi = -a[k1 + 1];\n          a[j1] = yr;\n          a[j1 + 1] = yi;\n          a[k1] = xr;\n          a[k1 + 1] = xi;\n          j1 += m2;\n          k1 += 2 * m2;\n          xr = a[j1];\n          xi = -a[j1 + 1];\n          yr = a[k1];\n          yi = -a[k1 + 1];\n          a[j1] = yr;\n          a[j1 + 1] = yi;\n          a[k1] = xr;\n          a[k1 + 1] = xi;\n          j1 += m2;\n          k1 -= m2;\n          xr = a[j1];\n          xi = -a[j1 + 1];\n          yr = a[k1];\n          yi = -a[k1 + 1];\n          a[j1] = yr;\n          a[j1 + 1] = yi;\n          a[k1] = xr;\n          a[k1 + 1] = xi;\n          j1 += m2;\n          k1 += 2 * m2;\n          xr = a[j1];\n          xi = -a[j1 + 1];\n          yr = a[k1];\n          yi = -a[k1 + 1];\n          a[j1] = yr;\n          a[j1 + 1] = yi;\n          a[k1] = xr;\n          a[k1 + 1] = xi;\n        }\n        k1 = 2 * k + ip[k];\n        a[k1 + 1] = -a[k1 + 1];\n        j1 = k1 + m2;\n        k1 = j1 + m2;\n        xr = a[j1];\n        xi = -a[j1 + 1];\n        yr = a[k1];\n        yi = -a[k1 + 1];\n        a[j1] = yr;\n        a[j1 + 1] = yi;\n        a[k1] = xr;\n        a[k1 + 1] = xi;\n        k1 += m2;\n        a[k1 + 1] = -a[k1 + 1];\n      }\n    } else {\n      a[1] = -a[1];\n      a[m2 + 1] = -a[m2 + 1];\n      for (k = 1; k < m; k++) {\n        for (j = 0; j < k; j++) {\n          j1 = 2 * j + ip[k];\n          k1 = 2 * k + ip[j];\n          xr = a[j1];\n          xi = -a[j1 + 1];\n          yr = a[k1];\n          yi = -a[k1 + 1];\n          a[j1] = yr;\n          a[j1 + 1] = yi;\n          a[k1] = xr;\n          a[k1 + 1] = xi;\n          j1 += m2;\n          k1 += m2;\n          xr = a[j1];\n          xi = -a[j1 + 1];\n          yr = a[k1];\n          yi = -a[k1 + 1];\n          a[j1] = yr;\n          a[j1 + 1] = yi;\n          a[k1] = xr;\n          a[k1 + 1] = xi;\n        }\n        k1 = 2 * k + ip[k];\n        a[k1 + 1] = -a[k1 + 1];\n        a[k1 + m2 + 1] = -a[k1 + m2 + 1];\n      }\n    }\n  }\n\n  static void cftfsub(int n, double *a, double *w) {\n    int j, j1, j2, j3, l;\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;\n\n    l = 2;\n    if (n > 8) {\n      cft1st(n, a, w);\n      l = 8;\n      while ((l << 2) < n) {\n        cftmdl(n, l, a, w);\n        l <<= 2;\n      }\n    }\n    if ((l << 2) == n) {\n      for (j = 0; j < l; j += 2) {\n        j1 = j + l;\n        j2 = j1 + l;\n        j3 = j2 + l;\n        x0r = a[j] + a[j1];\n        x0i = a[j + 1] + a[j1 + 1];\n        x1r = a[j] - a[j1];\n        x1i = a[j + 1] - a[j1 + 1];\n        x2r = a[j2] + a[j3];\n        x2i = a[j2 + 1] + a[j3 + 1];\n        x3r = a[j2] - a[j3];\n        x3i = a[j2 + 1] - a[j3 + 1];\n        a[j] = x0r + x2r;\n        a[j + 1] = x0i + x2i;\n        a[j2] = x0r - x2r;\n        a[j2 + 1] = x0i - x2i;\n        a[j1] = x1r - x3i;\n        a[j1 + 1] = x1i + x3r;\n        a[j3] = x1r + x3i;\n        a[j3 + 1] = x1i - x3r;\n      }\n    } else {\n      for (j = 0; j < l; j += 2) {\n        j1 = j + l;\n        x0r = a[j] - a[j1];\n        x0i = a[j + 1] - a[j1 + 1];\n        a[j] += a[j1];\n        a[j + 1] += a[j1 + 1];\n        a[j1] = x0r;\n        a[j1 + 1] = x0i;\n      }\n    }\n  }\n\n  static void cftbsub(int n, double *a, double *w) {\n    int j, j1, j2, j3, l;\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;\n\n    l = 2;\n    if (n > 8) {\n      cft1st(n, a, w);\n      l = 8;\n      while ((l << 2) < n) {\n        cftmdl(n, l, a, w);\n        l <<= 2;\n      }\n    }\n    if ((l << 2) == n) {\n      for (j = 0; j < l; j += 2) {\n        j1 = j + l;\n        j2 = j1 + l;\n        j3 = j2 + l;\n        x0r = a[j] + a[j1];\n        x0i = -a[j + 1] - a[j1 + 1];\n        x1r = a[j] - a[j1];\n        x1i = -a[j + 1] + a[j1 + 1];\n        x2r = a[j2] + a[j3];\n        x2i = a[j2 + 1] + a[j3 + 1];\n        x3r = a[j2] - a[j3];\n        x3i = a[j2 + 1] - a[j3 + 1];\n        a[j] = x0r + x2r;\n        a[j + 1] = x0i - x2i;\n        a[j2] = x0r - x2r;\n        a[j2 + 1] = x0i + x2i;\n        a[j1] = x1r - x3i;\n        a[j1 + 1] = x1i - x3r;\n        a[j3] = x1r + x3i;\n        a[j3 + 1] = x1i + x3r;\n      }\n    } else {\n      for (j = 0; j < l; j += 2) {\n        j1 = j + l;\n        x0r = a[j] - a[j1];\n        x0i = -a[j + 1] + a[j1 + 1];\n        a[j] += a[j1];\n        a[j + 1] = -a[j + 1] - a[j1 + 1];\n        a[j1] = x0r;\n        a[j1 + 1] = x0i;\n      }\n    }\n  }\n\n  static void cft1st(int n, double *a, double *w) {\n    int j, k1, k2;\n    double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;\n\n    x0r = a[0] + a[2];\n    x0i = a[1] + a[3];\n    x1r = a[0] - a[2];\n    x1i = a[1] - a[3];\n    x2r = a[4] + a[6];\n    x2i = a[5] + a[7];\n    x3r = a[4] - a[6];\n    x3i = a[5] - a[7];\n    a[0] = x0r + x2r;\n    a[1] = x0i + x2i;\n    a[4] = x0r - x2r;\n    a[5] = x0i - x2i;\n    a[2] = x1r - x3i;\n    a[3] = x1i + x3r;\n    a[6] = x1r + x3i;\n    a[7] = x1i - x3r;\n    wk1r = w[2];\n    x0r = a[8] + a[10];\n    x0i = a[9] + a[11];\n    x1r = a[8] - a[10];\n    x1i = a[9] - a[11];\n    x2r = a[12] + a[14];\n    x2i = a[13] + a[15];\n    x3r = a[12] - a[14];\n    x3i = a[13] - a[15];\n    a[8] = x0r + x2r;\n    a[9] = x0i + x2i;\n    a[12] = x2i - x0i;\n    a[13] = x0r - x2r;\n    x0r = x1r - x3i;\n    x0i = x1i + x3r;\n    a[10] = wk1r * (x0r - x0i);\n    a[11] = wk1r * (x0r + x0i);\n    x0r = x3i + x1r;\n    x0i = x3r - x1i;\n    a[14] = wk1r * (x0i - x0r);\n    a[15] = wk1r * (x0i + x0r);\n    k1 = 0;\n    for (j = 16; j < n; j += 16) {\n      k1 += 2;\n      k2 = 2 * k1;\n      wk2r = w[k1];\n      wk2i = w[k1 + 1];\n      wk1r = w[k2];\n      wk1i = w[k2 + 1];\n      wk3r = wk1r - 2 * wk2i * wk1i;\n      wk3i = 2 * wk2i * wk1r - wk1i;\n      x0r = a[j] + a[j + 2];\n      x0i = a[j + 1] + a[j + 3];\n      x1r = a[j] - a[j + 2];\n      x1i = a[j + 1] - a[j + 3];\n      x2r = a[j + 4] + a[j + 6];\n      x2i = a[j + 5] + a[j + 7];\n      x3r = a[j + 4] - a[j + 6];\n      x3i = a[j + 5] - a[j + 7];\n      a[j] = x0r + x2r;\n      a[j + 1] = x0i + x2i;\n      x0r -= x2r;\n      x0i -= x2i;\n      a[j + 4] = wk2r * x0r - wk2i * x0i;\n      a[j + 5] = wk2r * x0i + wk2i * x0r;\n      x0r = x1r - x3i;\n      x0i = x1i + x3r;\n      a[j + 2] = wk1r * x0r - wk1i * x0i;\n      a[j + 3] = wk1r * x0i + wk1i * x0r;\n      x0r = x1r + x3i;\n      x0i = x1i - x3r;\n      a[j + 6] = wk3r * x0r - wk3i * x0i;\n      a[j + 7] = wk3r * x0i + wk3i * x0r;\n      wk1r = w[k2 + 2];\n      wk1i = w[k2 + 3];\n      wk3r = wk1r - 2 * wk2r * wk1i;\n      wk3i = 2 * wk2r * wk1r - wk1i;\n      x0r = a[j + 8] + a[j + 10];\n      x0i = a[j + 9] + a[j + 11];\n      x1r = a[j + 8] - a[j + 10];\n      x1i = a[j + 9] - a[j + 11];\n      x2r = a[j + 12] + a[j + 14];\n      x2i = a[j + 13] + a[j + 15];\n      x3r = a[j + 12] - a[j + 14];\n      x3i = a[j + 13] - a[j + 15];\n      a[j + 8] = x0r + x2r;\n      a[j + 9] = x0i + x2i;\n      x0r -= x2r;\n      x0i -= x2i;\n      a[j + 12] = -wk2i * x0r - wk2r * x0i;\n      a[j + 13] = -wk2i * x0i + wk2r * x0r;\n      x0r = x1r - x3i;\n      x0i = x1i + x3r;\n      a[j + 10] = wk1r * x0r - wk1i * x0i;\n      a[j + 11] = wk1r * x0i + wk1i * x0r;\n      x0r = x1r + x3i;\n      x0i = x1i - x3r;\n      a[j + 14] = wk3r * x0r - wk3i * x0i;\n      a[j + 15] = wk3r * x0i + wk3i * x0r;\n    }\n  }\n\n  static void cftmdl(int n, int l, double *a, double *w) {\n    int j, j1, j2, j3, k, k1, k2, m, m2;\n    double wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;\n    double x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;\n\n    m = l << 2;\n    for (j = 0; j < l; j += 2) {\n      j1 = j + l;\n      j2 = j1 + l;\n      j3 = j2 + l;\n      x0r = a[j] + a[j1];\n      x0i = a[j + 1] + a[j1 + 1];\n      x1r = a[j] - a[j1];\n      x1i = a[j + 1] - a[j1 + 1];\n      x2r = a[j2] + a[j3];\n      x2i = a[j2 + 1] + a[j3 + 1];\n      x3r = a[j2] - a[j3];\n      x3i = a[j2 + 1] - a[j3 + 1];\n      a[j] = x0r + x2r;\n      a[j + 1] = x0i + x2i;\n      a[j2] = x0r - x2r;\n      a[j2 + 1] = x0i - x2i;\n      a[j1] = x1r - x3i;\n      a[j1 + 1] = x1i + x3r;\n      a[j3] = x1r + x3i;\n      a[j3 + 1] = x1i - x3r;\n    }\n    wk1r = w[2];\n    for (j = m; j < l + m; j += 2) {\n      j1 = j + l;\n      j2 = j1 + l;\n      j3 = j2 + l;\n      x0r = a[j] + a[j1];\n      x0i = a[j + 1] + a[j1 + 1];\n      x1r = a[j] - a[j1];\n      x1i = a[j + 1] - a[j1 + 1];\n      x2r = a[j2] + a[j3];\n      x2i = a[j2 + 1] + a[j3 + 1];\n      x3r = a[j2] - a[j3];\n      x3i = a[j2 + 1] - a[j3 + 1];\n      a[j] = x0r + x2r;\n      a[j + 1] = x0i + x2i;\n      a[j2] = x2i - x0i;\n      a[j2 + 1] = x0r - x2r;\n      x0r = x1r - x3i;\n      x0i = x1i + x3r;\n      a[j1] = wk1r * (x0r - x0i);\n      a[j1 + 1] = wk1r * (x0r + x0i);\n      x0r = x3i + x1r;\n      x0i = x3r - x1i;\n      a[j3] = wk1r * (x0i - x0r);\n      a[j3 + 1] = wk1r * (x0i + x0r);\n    }\n    k1 = 0;\n    m2 = 2 * m;\n    for (k = m2; k < n; k += m2) {\n      k1 += 2;\n      k2 = 2 * k1;\n      wk2r = w[k1];\n      wk2i = w[k1 + 1];\n      wk1r = w[k2];\n      wk1i = w[k2 + 1];\n      wk3r = wk1r - 2 * wk2i * wk1i;\n      wk3i = 2 * wk2i * wk1r - wk1i;\n      for (j = k; j < l + k; j += 2) {\n        j1 = j + l;\n        j2 = j1 + l;\n        j3 = j2 + l;\n        x0r = a[j] + a[j1];\n        x0i = a[j + 1] + a[j1 + 1];\n        x1r = a[j] - a[j1];\n        x1i = a[j + 1] - a[j1 + 1];\n        x2r = a[j2] + a[j3];\n        x2i = a[j2 + 1] + a[j3 + 1];\n        x3r = a[j2] - a[j3];\n        x3i = a[j2 + 1] - a[j3 + 1];\n        a[j] = x0r + x2r;\n        a[j + 1] = x0i + x2i;\n        x0r -= x2r;\n        x0i -= x2i;\n        a[j2] = wk2r * x0r - wk2i * x0i;\n        a[j2 + 1] = wk2r * x0i + wk2i * x0r;\n        x0r = x1r - x3i;\n        x0i = x1i + x3r;\n        a[j1] = wk1r * x0r - wk1i * x0i;\n        a[j1 + 1] = wk1r * x0i + wk1i * x0r;\n        x0r = x1r + x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3r * x0r - wk3i * x0i;\n        a[j3 + 1] = wk3r * x0i + wk3i * x0r;\n      }\n      wk1r = w[k2 + 2];\n      wk1i = w[k2 + 3];\n      wk3r = wk1r - 2 * wk2r * wk1i;\n      wk3i = 2 * wk2r * wk1r - wk1i;\n      for (j = k + m; j < l + (k + m); j += 2) {\n        j1 = j + l;\n        j2 = j1 + l;\n        j3 = j2 + l;\n        x0r = a[j] + a[j1];\n        x0i = a[j + 1] + a[j1 + 1];\n        x1r = a[j] - a[j1];\n        x1i = a[j + 1] - a[j1 + 1];\n        x2r = a[j2] + a[j3];\n        x2i = a[j2 + 1] + a[j3 + 1];\n        x3r = a[j2] - a[j3];\n        x3i = a[j2 + 1] - a[j3 + 1];\n        a[j] = x0r + x2r;\n        a[j + 1] = x0i + x2i;\n        x0r -= x2r;\n        x0i -= x2i;\n        a[j2] = -wk2i * x0r - wk2r * x0i;\n        a[j2 + 1] = -wk2i * x0i + wk2r * x0r;\n        x0r = x1r - x3i;\n        x0i = x1i + x3r;\n        a[j1] = wk1r * x0r - wk1i * x0i;\n        a[j1 + 1] = wk1r * x0i + wk1i * x0r;\n        x0r = x1r + x3i;\n        x0i = x1i - x3r;\n        a[j3] = wk3r * x0r - wk3i * x0i;\n        a[j3 + 1] = wk3r * x0i + wk3i * x0r;\n      }\n    }\n  }\n\n  static void rftfsub(int n, double *a, int nc, double *c) {\n    int j, k, kk, ks, m;\n    double wkr, wki, xr, xi, yr, yi;\n\n    m = n >> 1;\n    ks = 2 * nc / m;\n    kk = 0;\n    for (j = 2; j < m; j += 2) {\n      k = n - j;\n      kk += ks;\n      wkr = 0.5 - c[nc - kk];\n      wki = c[kk];\n      xr = a[j] - a[k];\n      xi = a[j + 1] + a[k + 1];\n      yr = wkr * xr - wki * xi;\n      yi = wkr * xi + wki * xr;\n      a[j] -= yr;\n      a[j + 1] -= yi;\n      a[k] += yr;\n      a[k + 1] -= yi;\n    }\n  }\n\n  static void rftbsub(int n, double *a, int nc, double *c) {\n    int j, k, kk, ks, m;\n    double wkr, wki, xr, xi, yr, yi;\n\n    a[1] = -a[1];\n    m = n >> 1;\n    ks = 2 * nc / m;\n    kk = 0;\n    for (j = 2; j < m; j += 2) {\n      k = n - j;\n      kk += ks;\n      wkr = 0.5 - c[nc - kk];\n      wki = c[kk];\n      xr = a[j] - a[k];\n      xi = a[j + 1] + a[k + 1];\n      yr = wkr * xr + wki * xi;\n      yi = wkr * xi - wki * xr;\n      a[j] -= yr;\n      a[j + 1] = yi - a[j + 1];\n      a[k] += yr;\n      a[k + 1] = yi - a[k + 1];\n    }\n    a[m + 1] = -a[m + 1];\n  }\n\n  static void dctsub(int n, double *a, int nc, double *c) {\n    int j, k, kk, ks, m;\n    double wkr, wki, xr;\n\n    m = n >> 1;\n    ks = nc / n;\n    kk = 0;\n    for (j = 1; j < m; j++) {\n      k = n - j;\n      kk += ks;\n      wkr = c[kk] - c[nc - kk];\n      wki = c[kk] + c[nc - kk];\n      xr = wki * a[j] - wkr * a[k];\n      a[j] = wkr * a[j] + wki * a[k];\n      a[k] = xr;\n    }\n    a[m] *= c[0];\n  }\n\n  static void dstsub(int n, double *a, int nc, double *c) {\n    int j, k, kk, ks, m;\n    double wkr, wki, xr;\n\n    m = n >> 1;\n    ks = nc / n;\n    kk = 0;\n    for (j = 1; j < m; j++) {\n      k = n - j;\n      kk += ks;\n      wkr = c[kk] - c[nc - kk];\n      wki = c[kk] + c[nc - kk];\n      xr = wki * a[k] - wkr * a[j];\n      a[k] = wkr * a[k] + wki * a[j];\n      a[j] = xr;\n    }\n    a[m] *= c[0];\n  }\n};\n\n} // namespace r8b\n\n#endif // R8B_FFT4G_INCLUDED\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/fft/pffft.h",
    "content": "#include <audioapi/libs/pffft/pffft.h>\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/fft/pffft_double.c",
    "content": "/* Copyright (c) 2013  Julien Pommier ( pommier@modartt.com )\n   Copyright (c) 2020  Hayati Ayguen ( h_ayguen@web.de )\n   Copyright (c) 2020  Dario Mambro ( dario.mambro@gmail.com )\n\n   Based on original fortran 77 code from FFTPACKv4 from NETLIB\n   (http://www.netlib.org/fftpack), authored by Dr Paul Swarztrauber\n   of NCAR, in 1985.\n\n   As confirmed by the NCAR fftpack software curators, the following\n   FFTPACKv5 license applies to FFTPACKv4 sources. My changes are\n   released under the same terms.\n\n   FFTPACK license:\n\n   http://www.cisl.ucar.edu/css/software/fftpack5/ftpk.html\n\n   Copyright (c) 2004 the University Corporation for Atmospheric\n   Research (\"UCAR\"). All rights reserved. Developed by NCAR's\n   Computational and Information Systems Laboratory, UCAR,\n   www.cisl.ucar.edu.\n\n   Redistribution and use of the Software in source and binary forms,\n   with or without modification, is permitted provided that the\n   following conditions are met:\n\n   - Neither the names of NCAR's Computational and Information Systems\n   Laboratory, the University Corporation for Atmospheric Research,\n   nor the names of its sponsors or contributors may be used to\n   endorse or promote products derived from this Software without\n   specific prior written permission.  \n\n   - Redistributions of source code must retain the above copyright\n   notices, this list of conditions, and the disclaimer below.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions, and the disclaimer below in the\n   documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n   EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF\n   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n   NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT\n   HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\n   SOFTWARE.\n\n\n   PFFFT : a Pretty Fast FFT.\n\n   This file is largerly based on the original FFTPACK implementation, modified in\n   order to take advantage of SIMD instructions of modern CPUs.\n*/\n\n/*\n   NOTE: This file is adapted from Julien Pommier's original PFFFT,\n   which works on 32 bit floating point precision using SSE instructions,\n   to work with 64 bit floating point precision using AVX instructions.\n   Author: Dario Mambro @ https://github.com/unevens/pffft\n*/\n\n#include \"pffft_double.h\"\n\n/* detect compiler flavour */\n#if defined(_MSC_VER)\n#  define COMPILER_MSVC\n#elif defined(__GNUC__)\n#  define COMPILER_GCC\n#endif\n\n#ifdef COMPILER_MSVC\n#  ifndef _USE_MATH_DEFINES\n#    define _USE_MATH_DEFINES\n#  endif\n#  include <malloc.h>\n#elif defined(__MINGW32__) || defined(__MINGW64__)\n#  include <malloc.h>\n#else\n#  include <alloca.h>\n#endif\n\n#include <stdlib.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <math.h>\n#include <assert.h>\n\n#if defined(COMPILER_GCC)\n#  define ALWAYS_INLINE(return_type) inline return_type __attribute__ ((always_inline))\n#  define NEVER_INLINE(return_type) return_type __attribute__ ((noinline))\n#  define RESTRICT __restrict\n#  define VLA_ARRAY_ON_STACK(type__, varname__, size__) type__ varname__[size__];\n#elif defined(COMPILER_MSVC)\n#  define ALWAYS_INLINE(return_type) __forceinline return_type\n#  define NEVER_INLINE(return_type) __declspec(noinline) return_type\n#  define RESTRICT __restrict\n#  define VLA_ARRAY_ON_STACK(type__, varname__, size__) type__ *varname__ = (type__*)_alloca(size__ * sizeof(type__))\n#endif\n\n\n#ifdef COMPILER_MSVC\n#pragma warning( disable : 4244 4305 4204 4456 )\n#endif\n\n/* \n   vector support macros: the rest of the code is independant of\n   AVX -- adding support for other platforms with 4-element\n   vectors should be limited to these macros \n*/\n#include \"simd/pf_double.h\"\n\n/* have code comparable with this definition */\n#define float double\n#define SETUP_STRUCT               PFFFTD_Setup\n#define FUNC_NEW_SETUP             pffftd_new_setup\n#define FUNC_DESTROY               pffftd_destroy_setup\n#define FUNC_TRANSFORM_UNORDRD     pffftd_transform\n#define FUNC_TRANSFORM_ORDERED     pffftd_transform_ordered\n#define FUNC_ZREORDER              pffftd_zreorder\n#define FUNC_ZCONVOLVE_ACCUMULATE  pffftd_zconvolve_accumulate\n#define FUNC_ZCONVOLVE_NO_ACCU     pffftd_zconvolve_no_accu\n\n#define FUNC_ALIGNED_MALLOC        pffftd_aligned_malloc\n#define FUNC_ALIGNED_FREE          pffftd_aligned_free\n#define FUNC_SIMD_SIZE             pffftd_simd_size\n#define FUNC_MIN_FFT_SIZE          pffftd_min_fft_size\n#define FUNC_IS_VALID_SIZE         pffftd_is_valid_size\n#define FUNC_NEAREST_SIZE          pffftd_nearest_transform_size\n#define FUNC_SIMD_ARCH             pffftd_simd_arch\n#define FUNC_VALIDATE_SIMD_A       validate_pffftd_simd\n#define FUNC_VALIDATE_SIMD_EX      validate_pffftd_simd_ex\n\n#define FUNC_CPLX_FINALIZE         pffftd_cplx_finalize\n#define FUNC_CPLX_PREPROCESS       pffftd_cplx_preprocess\n#define FUNC_REAL_PREPROCESS_4X4   pffftd_real_preprocess_4x4\n#define FUNC_REAL_PREPROCESS       pffftd_real_preprocess\n#define FUNC_REAL_FINALIZE_4X4     pffftd_real_finalize_4x4\n#define FUNC_REAL_FINALIZE         pffftd_real_finalize\n#define FUNC_TRANSFORM_INTERNAL    pffftd_transform_internal\n\n#define FUNC_COS  cos\n#define FUNC_SIN  sin\n\n\n#include \"pffft_priv_impl.h\"\n\n/* moved from \"pffft_common.c\" */\n\n/* SSE and co like 16-bytes aligned pointers\n * with a 64-byte alignment, we are even aligned on L2 cache lines... */\n#define MALLOC_V4SF_ALIGNMENT 64\n\nstatic void * Valigned_malloc(size_t nb_bytes) {\n  void *p, *p0 = malloc(nb_bytes + MALLOC_V4SF_ALIGNMENT);\n  if (!p0) return (void *) 0;\n  p = (void *) (((uintptr_t) p0 + MALLOC_V4SF_ALIGNMENT) & (~((uintptr_t) (MALLOC_V4SF_ALIGNMENT-1))));\n  *((void **) p - 1) = p0;\n  return p;\n}\n\nstatic void Valigned_free(void *p) {\n  if (p) free(*((void **) p - 1));\n}\n\n\nstatic int next_power_of_two(int N) {\n  /* https://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 */\n  /* compute the next highest power of 2 of 32-bit v */\n  unsigned v = N;\n  v--;\n  v |= v >> 1;\n  v |= v >> 2;\n  v |= v >> 4;\n  v |= v >> 8;\n  v |= v >> 16;\n  v++;\n  return v;\n}\n\nstatic int is_power_of_two(int N) {\n  /* https://graphics.stanford.edu/~seander/bithacks.html#DetermineIfPowerOf2 */\n  int f = N && !(N & (N - 1));\n  return f;\n}\n\n\n\nvoid *pffftd_aligned_malloc(size_t nb_bytes) { return Valigned_malloc(nb_bytes); }\nvoid pffftd_aligned_free(void *p) { Valigned_free(p); }\nint pffftd_next_power_of_two(int N) { return next_power_of_two(N); }\nint pffftd_is_power_of_two(int N) { return is_power_of_two(N); }\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/fft/pffft_double.h",
    "content": "/* Copyright (c) 2013  Julien Pommier ( pommier@modartt.com ) \n\n   Based on original fortran 77 code from FFTPACKv4 from NETLIB,\n   authored by Dr Paul Swarztrauber of NCAR, in 1985.\n\n   As confirmed by the NCAR fftpack software curators, the following\n   FFTPACKv5 license applies to FFTPACKv4 sources. My changes are\n   released under the same terms.\n\n   FFTPACK license:\n\n   http://www.cisl.ucar.edu/css/software/fftpack5/ftpk.html\n\n   Copyright (c) 2004 the University Corporation for Atmospheric\n   Research (\"UCAR\"). All rights reserved. Developed by NCAR's\n   Computational and Information Systems Laboratory, UCAR,\n   www.cisl.ucar.edu.\n\n   Redistribution and use of the Software in source and binary forms,\n   with or without modification, is permitted provided that the\n   following conditions are met:\n\n   - Neither the names of NCAR's Computational and Information Systems\n   Laboratory, the University Corporation for Atmospheric Research,\n   nor the names of its sponsors or contributors may be used to\n   endorse or promote products derived from this Software without\n   specific prior written permission.  \n\n   - Redistributions of source code must retain the above copyright\n   notices, this list of conditions, and the disclaimer below.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions, and the disclaimer below in the\n   documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n   EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF\n   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n   NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT\n   HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\n   SOFTWARE.\n*/\n/*\n   NOTE: This file is adapted from Julien Pommier's original PFFFT,\n   which works on 32 bit floating point precision using SSE instructions,\n   to work with 64 bit floating point precision using AVX instructions.\n   Author: Dario Mambro @ https://github.com/unevens/pffft\n*/\n/*\n   PFFFT : a Pretty Fast FFT.\n\n   This is basically an adaptation of the single precision fftpack\n   (v4) as found on netlib taking advantage of SIMD instruction found\n   on cpus such as intel x86 (SSE1), powerpc (Altivec), and arm (NEON).\n   \n   For architectures where no SIMD instruction is available, the code\n   falls back to a scalar version.  \n\n   Restrictions: \n\n   - 1D transforms only, with 64-bit double precision.\n\n   - supports only transforms for inputs of length N of the form\n   N=(2^a)*(3^b)*(5^c), a >= 5, b >=0, c >= 0 (32, 48, 64, 96, 128,\n   144, 160, etc are all acceptable lengths). Performance is best for\n   128<=N<=8192.\n\n   - all (double*) pointers in the functions below are expected to\n   have an \"simd-compatible\" alignment, that is 32 bytes on x86 and\n   powerpc CPUs.\n  \n   You can allocate such buffers with the functions\n   pffft_aligned_malloc / pffft_aligned_free (or with stuff like\n   posix_memalign..)\n\n*/\n\n#ifndef PFFFT_DOUBLE_H\n#define PFFFT_DOUBLE_H\n\n#include <stddef.h> /* for size_t */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* opaque struct holding internal stuff (precomputed twiddle factors)\n     this struct can be shared by many threads as it contains only\n     read-only data.  \n  */\ntypedef struct PFFFTD_Setup PFFFTD_Setup;\n\n#ifndef PFFFT_COMMON_ENUMS\n#define PFFFT_COMMON_ENUMS\n\n/* direction of the transform */\ntypedef enum { PFFFT_FORWARD, PFFFT_BACKWARD } pffft_direction_t;\n\n/* type of transform */\ntypedef enum { PFFFT_REAL, PFFFT_COMPLEX } pffft_transform_t;\n\n#endif\n\n/*\n    prepare for performing transforms of size N -- the returned\n    PFFFTD_Setup structure is read-only so it can safely be shared by\n    multiple concurrent threads. \n  */\nPFFFTD_Setup *pffftd_new_setup(int N, pffft_transform_t transform);\nvoid pffftd_destroy_setup(PFFFTD_Setup *);\n/* \n     Perform a Fourier transform , The z-domain data is stored in the\n     most efficient order for transforming it back, or using it for\n     convolution. If you need to have its content sorted in the\n     \"usual\" way, that is as an array of interleaved complex numbers,\n     either use pffft_transform_ordered , or call pffft_zreorder after\n     the forward fft, and before the backward fft.\n\n     Transforms are not scaled: PFFFT_BACKWARD(PFFFT_FORWARD(x)) = N*x.\n     Typically you will want to scale the backward transform by 1/N.\n     \n     The 'work' pointer should point to an area of N (2*N for complex\n     fft) doubles, properly aligned. If 'work' is NULL, then stack will\n     be used instead (this is probably the best strategy for small\n     FFTs, say for N < 16384). Threads usually have a small stack, that\n     there's no sufficient amount of memory, usually leading to a crash!\n     Use the heap with pffft_aligned_malloc() in this case.\n\n     input and output may alias.\n  */\nvoid pffftd_transform(\n    PFFFTD_Setup *setup,\n    const double *input,\n    double *output,\n    double *work,\n    pffft_direction_t direction);\n\n/* \n     Similar to pffft_transform, but makes sure that the output is\n     ordered as expected (interleaved complex numbers).  This is\n     similar to calling pffft_transform and then pffft_zreorder.\n     \n     input and output may alias.\n  */\nvoid pffftd_transform_ordered(\n    PFFFTD_Setup *setup,\n    const double *input,\n    double *output,\n    double *work,\n    pffft_direction_t direction);\n\n/* \n     call pffft_zreorder(.., PFFFT_FORWARD) after pffft_transform(...,\n     PFFFT_FORWARD) if you want to have the frequency components in\n     the correct \"canonical\" order, as interleaved complex numbers.\n     \n     (for real transforms, both 0-frequency and half frequency\n     components, which are real, are assembled in the first entry as\n     F(0)+i*F(n/2+1). Note that the original fftpack did place\n     F(n/2+1) at the end of the arrays).\n     \n     input and output should not alias.\n  */\nvoid pffftd_zreorder(\n    PFFFTD_Setup *setup,\n    const double *input,\n    double *output,\n    pffft_direction_t direction);\n\n/* \n     Perform a multiplication of the frequency components of dft_a and\n     dft_b and accumulate them into dft_ab. The arrays should have\n     been obtained with pffft_transform(.., PFFFT_FORWARD) and should\n     *not* have been reordered with pffft_zreorder (otherwise just\n     perform the operation yourself as the dft coefs are stored as\n     interleaved complex numbers).\n     \n     the operation performed is: dft_ab += (dft_a * fdt_b)*scaling\n     \n     The dft_a, dft_b and dft_ab pointers may alias.\n  */\nvoid pffftd_zconvolve_accumulate(\n    PFFFTD_Setup *setup,\n    const double *dft_a,\n    const double *dft_b,\n    double *dft_ab,\n    double scaling);\n\n/* \n     Perform a multiplication of the frequency components of dft_a and\n     dft_b and put result in dft_ab. The arrays should have\n     been obtained with pffft_transform(.., PFFFT_FORWARD) and should\n     *not* have been reordered with pffft_zreorder (otherwise just\n     perform the operation yourself as the dft coefs are stored as\n     interleaved complex numbers).\n\n     the operation performed is: dft_ab = (dft_a * fdt_b)*scaling\n\n     The dft_a, dft_b and dft_ab pointers may alias.\n  */\nvoid pffftd_zconvolve_no_accu(\n    PFFFTD_Setup *setup,\n    const double *dft_a,\n    const double *dft_b,\n    double *dft_ab,\n    double scaling);\n\n/* return 4 or 1 wether support AVX instructions was enabled when building pffft-double.c */\nint pffftd_simd_size();\n\n/* return string identifier of used architecture (AVX/..) */\nconst char *pffftd_simd_arch();\n\n/* simple helper to get minimum possible fft size */\nint pffftd_min_fft_size(pffft_transform_t transform);\n\n/* simple helper to determine size N is valid\n     - factorizable to pffft_min_fft_size() with factors 2, 3, 5\n  */\nint pffftd_is_valid_size(int N, pffft_transform_t cplx);\n\n/* determine nearest valid transform size  (by brute-force testing)\n     - factorizable to pffft_min_fft_size() with factors 2, 3, 5.\n     higher: bool-flag to find nearest higher value; else lower.\n  */\nint pffftd_nearest_transform_size(int N, pffft_transform_t cplx, int higher);\n\n/* following functions are identical to the pffft_ functions - both declared */\n\n/* simple helper to determine next power of 2\n     - without inexact/rounding floating point operations\n  */\nint pffftd_next_power_of_two(int N);\nint pffft_next_power_of_two(int N);\n\n/* simple helper to determine if power of 2 - returns bool */\nint pffftd_is_power_of_two(int N);\nint pffft_is_power_of_two(int N);\n\n/*\n    the double buffers must have the correct alignment (32-byte boundary\n    on intel and powerpc). This function may be used to obtain such\n    correctly aligned buffers.  \n  */\nvoid *pffftd_aligned_malloc(size_t nb_bytes);\nvoid *pffft_aligned_malloc(size_t nb_bytes);\nvoid pffftd_aligned_free(void *);\nvoid pffft_aligned_free(void *);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* PFFFT_DOUBLE_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/fft/pffft_priv_impl.h",
    "content": "/* Copyright (c) 2013  Julien Pommier ( pommier@modartt.com )\n   Copyright (c) 2020  Hayati Ayguen ( h_ayguen@web.de )\n   Copyright (c) 2020  Dario Mambro ( dario.mambro@gmail.com )\n\n   Based on original fortran 77 code from FFTPACKv4 from NETLIB\n   (http://www.netlib.org/fftpack), authored by Dr Paul Swarztrauber\n   of NCAR, in 1985.\n\n   As confirmed by the NCAR fftpack software curators, the following\n   FFTPACKv5 license applies to FFTPACKv4 sources. My changes are\n   released under the same terms.\n\n   FFTPACK license:\n\n   http://www.cisl.ucar.edu/css/software/fftpack5/ftpk.html\n\n   Copyright (c) 2004 the University Corporation for Atmospheric\n   Research (\"UCAR\"). All rights reserved. Developed by NCAR's\n   Computational and Information Systems Laboratory, UCAR,\n   www.cisl.ucar.edu.\n\n   Redistribution and use of the Software in source and binary forms,\n   with or without modification, is permitted provided that the\n   following conditions are met:\n\n   - Neither the names of NCAR's Computational and Information Systems\n   Laboratory, the University Corporation for Atmospheric Research,\n   nor the names of its sponsors or contributors may be used to\n   endorse or promote products derived from this Software without\n   specific prior written permission.  \n\n   - Redistributions of source code must retain the above copyright\n   notices, this list of conditions, and the disclaimer below.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions, and the disclaimer below in the\n   documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n   EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF\n   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n   NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT\n   HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\n   SOFTWARE.\n\n\n   PFFFT : a Pretty Fast FFT.\n\n   This file is largerly based on the original FFTPACK implementation, modified in\n   order to take advantage of SIMD instructions of modern CPUs.\n*/\n\n/* this file requires architecture specific preprocessor definitions\n * it's only for library internal use\n */\n\n/* define own constants required to turn off g++ extensions .. */\n#ifndef M_PI\n#define M_PI 3.14159265358979323846 /* pi */\n#endif\n\n#ifndef M_SQRT2\n#define M_SQRT2 1.41421356237309504880 /* sqrt(2) */\n#endif\n\nint FUNC_SIMD_SIZE(void) {\n  return SIMD_SZ;\n}\n\nint FUNC_MIN_FFT_SIZE(pffft_transform_t transform) {\n  /* unfortunately, the fft size must be a multiple of 16 for complex FFTs\n     and 32 for real FFTs -- a lot of stuff would need to be rewritten to\n     handle other cases (or maybe just switch to a scalar fft, I don't know..) */\n  int simdSz = FUNC_SIMD_SIZE();\n  if (transform == PFFFT_REAL)\n    return (2 * simdSz * simdSz);\n  else if (transform == PFFFT_COMPLEX)\n    return (simdSz * simdSz);\n  else\n    return 1;\n}\n\nint FUNC_IS_VALID_SIZE(int N, pffft_transform_t cplx) {\n  const int N_min = FUNC_MIN_FFT_SIZE(cplx);\n  int R = N;\n  while (R >= 5 * N_min && (R % 5) == 0)\n    R /= 5;\n  while (R >= 3 * N_min && (R % 3) == 0)\n    R /= 3;\n  while (R >= 2 * N_min && (R % 2) == 0)\n    R /= 2;\n  return (R == N_min) ? 1 : 0;\n}\n\nint FUNC_NEAREST_SIZE(int N, pffft_transform_t cplx, int higher) {\n  int d;\n  const int N_min = FUNC_MIN_FFT_SIZE(cplx);\n  if (N < N_min)\n    N = N_min;\n  d = (higher) ? N_min : -N_min;\n  if (d > 0)\n    N = N_min * ((N + N_min - 1) / N_min); /* round up */\n  else\n    N = N_min * (N / N_min); /* round down */\n\n  for (;; N += d)\n    if (FUNC_IS_VALID_SIZE(N, cplx))\n      return N;\n}\n\nconst char *FUNC_SIMD_ARCH(void) {\n  return VARCH;\n}\n\n/*\n  passf2 and passb2 has been merged here, fsign = -1 for passf2, +1 for passb2\n*/\nstatic NEVER_INLINE(void)\n    passf2_ps(int ido, int l1, const v4sf *cc, v4sf *ch, const float *wa1, float fsign) {\n  int k, i;\n  int l1ido = l1 * ido;\n  if (ido <= 2) {\n    for (k = 0; k < l1ido; k += ido, ch += ido, cc += 2 * ido) {\n      ch[0] = VADD(cc[0], cc[ido + 0]);\n      ch[l1ido] = VSUB(cc[0], cc[ido + 0]);\n      ch[1] = VADD(cc[1], cc[ido + 1]);\n      ch[l1ido + 1] = VSUB(cc[1], cc[ido + 1]);\n    }\n  } else {\n    for (k = 0; k < l1ido; k += ido, ch += ido, cc += 2 * ido) {\n      for (i = 0; i < ido - 1; i += 2) {\n        v4sf tr2 = VSUB(cc[i + 0], cc[i + ido + 0]);\n        v4sf ti2 = VSUB(cc[i + 1], cc[i + ido + 1]);\n        v4sf wr = LD_PS1(wa1[i]), wi = VMUL(LD_PS1(fsign), LD_PS1(wa1[i + 1]));\n        ch[i] = VADD(cc[i + 0], cc[i + ido + 0]);\n        ch[i + 1] = VADD(cc[i + 1], cc[i + ido + 1]);\n        VCPLXMUL(tr2, ti2, wr, wi);\n        ch[i + l1ido] = tr2;\n        ch[i + l1ido + 1] = ti2;\n      }\n    }\n  }\n}\n\n/*\n  passf3 and passb3 has been merged here, fsign = -1 for passf3, +1 for passb3\n*/\nstatic NEVER_INLINE(void) passf3_ps(\n    int ido,\n    int l1,\n    const v4sf *cc,\n    v4sf *ch,\n    const float *wa1,\n    const float *wa2,\n    float fsign) {\n  static const float taur = -0.5f;\n  float taui = 0.866025403784439f * fsign;\n  int i, k;\n  v4sf tr2, ti2, cr2, ci2, cr3, ci3, dr2, di2, dr3, di3;\n  int l1ido = l1 * ido;\n  float wr1, wi1, wr2, wi2;\n  assert(ido > 2);\n  for (k = 0; k < l1ido; k += ido, cc += 3 * ido, ch += ido) {\n    for (i = 0; i < ido - 1; i += 2) {\n      tr2 = VADD(cc[i + ido], cc[i + 2 * ido]);\n      cr2 = VADD(cc[i], SVMUL(taur, tr2));\n      ch[i] = VADD(cc[i], tr2);\n      ti2 = VADD(cc[i + ido + 1], cc[i + 2 * ido + 1]);\n      ci2 = VADD(cc[i + 1], SVMUL(taur, ti2));\n      ch[i + 1] = VADD(cc[i + 1], ti2);\n      cr3 = SVMUL(taui, VSUB(cc[i + ido], cc[i + 2 * ido]));\n      ci3 = SVMUL(taui, VSUB(cc[i + ido + 1], cc[i + 2 * ido + 1]));\n      dr2 = VSUB(cr2, ci3);\n      dr3 = VADD(cr2, ci3);\n      di2 = VADD(ci2, cr3);\n      di3 = VSUB(ci2, cr3);\n      wr1 = wa1[i], wi1 = fsign * wa1[i + 1], wr2 = wa2[i], wi2 = fsign * wa2[i + 1];\n      VCPLXMUL(dr2, di2, LD_PS1(wr1), LD_PS1(wi1));\n      ch[i + l1ido] = dr2;\n      ch[i + l1ido + 1] = di2;\n      VCPLXMUL(dr3, di3, LD_PS1(wr2), LD_PS1(wi2));\n      ch[i + 2 * l1ido] = dr3;\n      ch[i + 2 * l1ido + 1] = di3;\n    }\n  }\n} /* passf3 */\n\nstatic NEVER_INLINE(void) passf4_ps(\n    int ido,\n    int l1,\n    const v4sf *cc,\n    v4sf *ch,\n    const float *wa1,\n    const float *wa2,\n    const float *wa3,\n    float fsign) {\n  /* isign == -1 for forward transform and +1 for backward transform */\n\n  int i, k;\n  v4sf ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;\n  int l1ido = l1 * ido;\n  if (ido == 2) {\n    for (k = 0; k < l1ido; k += ido, ch += ido, cc += 4 * ido) {\n      tr1 = VSUB(cc[0], cc[2 * ido + 0]);\n      tr2 = VADD(cc[0], cc[2 * ido + 0]);\n      ti1 = VSUB(cc[1], cc[2 * ido + 1]);\n      ti2 = VADD(cc[1], cc[2 * ido + 1]);\n      ti4 = VMUL(VSUB(cc[1 * ido + 0], cc[3 * ido + 0]), LD_PS1(fsign));\n      tr4 = VMUL(VSUB(cc[3 * ido + 1], cc[1 * ido + 1]), LD_PS1(fsign));\n      tr3 = VADD(cc[ido + 0], cc[3 * ido + 0]);\n      ti3 = VADD(cc[ido + 1], cc[3 * ido + 1]);\n\n      ch[0 * l1ido + 0] = VADD(tr2, tr3);\n      ch[0 * l1ido + 1] = VADD(ti2, ti3);\n      ch[1 * l1ido + 0] = VADD(tr1, tr4);\n      ch[1 * l1ido + 1] = VADD(ti1, ti4);\n      ch[2 * l1ido + 0] = VSUB(tr2, tr3);\n      ch[2 * l1ido + 1] = VSUB(ti2, ti3);\n      ch[3 * l1ido + 0] = VSUB(tr1, tr4);\n      ch[3 * l1ido + 1] = VSUB(ti1, ti4);\n    }\n  } else {\n    for (k = 0; k < l1ido; k += ido, ch += ido, cc += 4 * ido) {\n      for (i = 0; i < ido - 1; i += 2) {\n        float wr1, wi1, wr2, wi2, wr3, wi3;\n        tr1 = VSUB(cc[i + 0], cc[i + 2 * ido + 0]);\n        tr2 = VADD(cc[i + 0], cc[i + 2 * ido + 0]);\n        ti1 = VSUB(cc[i + 1], cc[i + 2 * ido + 1]);\n        ti2 = VADD(cc[i + 1], cc[i + 2 * ido + 1]);\n        tr4 = VMUL(VSUB(cc[i + 3 * ido + 1], cc[i + 1 * ido + 1]), LD_PS1(fsign));\n        ti4 = VMUL(VSUB(cc[i + 1 * ido + 0], cc[i + 3 * ido + 0]), LD_PS1(fsign));\n        tr3 = VADD(cc[i + ido + 0], cc[i + 3 * ido + 0]);\n        ti3 = VADD(cc[i + ido + 1], cc[i + 3 * ido + 1]);\n\n        ch[i] = VADD(tr2, tr3);\n        cr3 = VSUB(tr2, tr3);\n        ch[i + 1] = VADD(ti2, ti3);\n        ci3 = VSUB(ti2, ti3);\n\n        cr2 = VADD(tr1, tr4);\n        cr4 = VSUB(tr1, tr4);\n        ci2 = VADD(ti1, ti4);\n        ci4 = VSUB(ti1, ti4);\n        wr1 = wa1[i], wi1 = fsign * wa1[i + 1];\n        VCPLXMUL(cr2, ci2, LD_PS1(wr1), LD_PS1(wi1));\n        wr2 = wa2[i], wi2 = fsign * wa2[i + 1];\n        ch[i + l1ido] = cr2;\n        ch[i + l1ido + 1] = ci2;\n\n        VCPLXMUL(cr3, ci3, LD_PS1(wr2), LD_PS1(wi2));\n        wr3 = wa3[i], wi3 = fsign * wa3[i + 1];\n        ch[i + 2 * l1ido] = cr3;\n        ch[i + 2 * l1ido + 1] = ci3;\n\n        VCPLXMUL(cr4, ci4, LD_PS1(wr3), LD_PS1(wi3));\n        ch[i + 3 * l1ido] = cr4;\n        ch[i + 3 * l1ido + 1] = ci4;\n      }\n    }\n  }\n} /* passf4 */\n\n/*\n  passf5 and passb5 has been merged here, fsign = -1 for passf5, +1 for passb5\n*/\nstatic NEVER_INLINE(void) passf5_ps(\n    int ido,\n    int l1,\n    const v4sf *cc,\n    v4sf *ch,\n    const float *wa1,\n    const float *wa2,\n    const float *wa3,\n    const float *wa4,\n    float fsign) {\n  static const float tr11 = .309016994374947f;\n  const float ti11 = .951056516295154f * fsign;\n  static const float tr12 = -.809016994374947f;\n  const float ti12 = .587785252292473f * fsign;\n\n  /* Local variables */\n  int i, k;\n  v4sf ci2, ci3, ci4, ci5, di3, di4, di5, di2, cr2, cr3, cr5, cr4, ti2, ti3, ti4, ti5, dr3, dr4,\n      dr5, dr2, tr2, tr3, tr4, tr5;\n\n  float wr1, wi1, wr2, wi2, wr3, wi3, wr4, wi4;\n\n#define cc_ref(a_1, a_2) cc[(a_2 - 1) * ido + a_1 + 1]\n#define ch_ref(a_1, a_3) ch[(a_3 - 1) * l1 * ido + a_1 + 1]\n\n  assert(ido > 2);\n  for (k = 0; k < l1; ++k, cc += 5 * ido, ch += ido) {\n    for (i = 0; i < ido - 1; i += 2) {\n      ti5 = VSUB(cc_ref(i, 2), cc_ref(i, 5));\n      ti2 = VADD(cc_ref(i, 2), cc_ref(i, 5));\n      ti4 = VSUB(cc_ref(i, 3), cc_ref(i, 4));\n      ti3 = VADD(cc_ref(i, 3), cc_ref(i, 4));\n      tr5 = VSUB(cc_ref(i - 1, 2), cc_ref(i - 1, 5));\n      tr2 = VADD(cc_ref(i - 1, 2), cc_ref(i - 1, 5));\n      tr4 = VSUB(cc_ref(i - 1, 3), cc_ref(i - 1, 4));\n      tr3 = VADD(cc_ref(i - 1, 3), cc_ref(i - 1, 4));\n      ch_ref(i - 1, 1) = VADD(cc_ref(i - 1, 1), VADD(tr2, tr3));\n      ch_ref(i, 1) = VADD(cc_ref(i, 1), VADD(ti2, ti3));\n      cr2 = VADD(cc_ref(i - 1, 1), VADD(SVMUL(tr11, tr2), SVMUL(tr12, tr3)));\n      ci2 = VADD(cc_ref(i, 1), VADD(SVMUL(tr11, ti2), SVMUL(tr12, ti3)));\n      cr3 = VADD(cc_ref(i - 1, 1), VADD(SVMUL(tr12, tr2), SVMUL(tr11, tr3)));\n      ci3 = VADD(cc_ref(i, 1), VADD(SVMUL(tr12, ti2), SVMUL(tr11, ti3)));\n      cr5 = VADD(SVMUL(ti11, tr5), SVMUL(ti12, tr4));\n      ci5 = VADD(SVMUL(ti11, ti5), SVMUL(ti12, ti4));\n      cr4 = VSUB(SVMUL(ti12, tr5), SVMUL(ti11, tr4));\n      ci4 = VSUB(SVMUL(ti12, ti5), SVMUL(ti11, ti4));\n      dr3 = VSUB(cr3, ci4);\n      dr4 = VADD(cr3, ci4);\n      di3 = VADD(ci3, cr4);\n      di4 = VSUB(ci3, cr4);\n      dr5 = VADD(cr2, ci5);\n      dr2 = VSUB(cr2, ci5);\n      di5 = VSUB(ci2, cr5);\n      di2 = VADD(ci2, cr5);\n      wr1 = wa1[i], wi1 = fsign * wa1[i + 1], wr2 = wa2[i], wi2 = fsign * wa2[i + 1];\n      wr3 = wa3[i], wi3 = fsign * wa3[i + 1], wr4 = wa4[i], wi4 = fsign * wa4[i + 1];\n      VCPLXMUL(dr2, di2, LD_PS1(wr1), LD_PS1(wi1));\n      ch_ref(i - 1, 2) = dr2;\n      ch_ref(i, 2) = di2;\n      VCPLXMUL(dr3, di3, LD_PS1(wr2), LD_PS1(wi2));\n      ch_ref(i - 1, 3) = dr3;\n      ch_ref(i, 3) = di3;\n      VCPLXMUL(dr4, di4, LD_PS1(wr3), LD_PS1(wi3));\n      ch_ref(i - 1, 4) = dr4;\n      ch_ref(i, 4) = di4;\n      VCPLXMUL(dr5, di5, LD_PS1(wr4), LD_PS1(wi4));\n      ch_ref(i - 1, 5) = dr5;\n      ch_ref(i, 5) = di5;\n    }\n  }\n#undef ch_ref\n#undef cc_ref\n}\n\nstatic NEVER_INLINE(void)\n    radf2_ps(int ido, int l1, const v4sf *RESTRICT cc, v4sf *RESTRICT ch, const float *wa1) {\n  static const float minus_one = -1.f;\n  int i, k, l1ido = l1 * ido;\n  for (k = 0; k < l1ido; k += ido) {\n    v4sf a = cc[k], b = cc[k + l1ido];\n    ch[2 * k] = VADD(a, b);\n    ch[2 * (k + ido) - 1] = VSUB(a, b);\n  }\n  if (ido < 2)\n    return;\n  if (ido != 2) {\n    for (k = 0; k < l1ido; k += ido) {\n      for (i = 2; i < ido; i += 2) {\n        v4sf tr2 = cc[i - 1 + k + l1ido], ti2 = cc[i + k + l1ido];\n        v4sf br = cc[i - 1 + k], bi = cc[i + k];\n        VCPLXMULCONJ(tr2, ti2, LD_PS1(wa1[i - 2]), LD_PS1(wa1[i - 1]));\n        ch[i + 2 * k] = VADD(bi, ti2);\n        ch[2 * (k + ido) - i] = VSUB(ti2, bi);\n        ch[i - 1 + 2 * k] = VADD(br, tr2);\n        ch[2 * (k + ido) - i - 1] = VSUB(br, tr2);\n      }\n    }\n    if (ido % 2 == 1)\n      return;\n  }\n  for (k = 0; k < l1ido; k += ido) {\n    ch[2 * k + ido] = SVMUL(minus_one, cc[ido - 1 + k + l1ido]);\n    ch[2 * k + ido - 1] = cc[k + ido - 1];\n  }\n} /* radf2 */\n\nstatic NEVER_INLINE(void) radb2_ps(int ido, int l1, const v4sf *cc, v4sf *ch, const float *wa1) {\n  static const float minus_two = -2;\n  int i, k, l1ido = l1 * ido;\n  v4sf a, b, c, d, tr2, ti2;\n  for (k = 0; k < l1ido; k += ido) {\n    a = cc[2 * k];\n    b = cc[2 * (k + ido) - 1];\n    ch[k] = VADD(a, b);\n    ch[k + l1ido] = VSUB(a, b);\n  }\n  if (ido < 2)\n    return;\n  if (ido != 2) {\n    for (k = 0; k < l1ido; k += ido) {\n      for (i = 2; i < ido; i += 2) {\n        a = cc[i - 1 + 2 * k];\n        b = cc[2 * (k + ido) - i - 1];\n        c = cc[i + 0 + 2 * k];\n        d = cc[2 * (k + ido) - i + 0];\n        ch[i - 1 + k] = VADD(a, b);\n        tr2 = VSUB(a, b);\n        ch[i + 0 + k] = VSUB(c, d);\n        ti2 = VADD(c, d);\n        VCPLXMUL(tr2, ti2, LD_PS1(wa1[i - 2]), LD_PS1(wa1[i - 1]));\n        ch[i - 1 + k + l1ido] = tr2;\n        ch[i + 0 + k + l1ido] = ti2;\n      }\n    }\n    if (ido % 2 == 1)\n      return;\n  }\n  for (k = 0; k < l1ido; k += ido) {\n    a = cc[2 * k + ido - 1];\n    b = cc[2 * k + ido];\n    ch[k + ido - 1] = VADD(a, a);\n    ch[k + ido - 1 + l1ido] = SVMUL(minus_two, b);\n  }\n} /* radb2 */\n\nstatic void radf3_ps(\n    int ido,\n    int l1,\n    const v4sf *RESTRICT cc,\n    v4sf *RESTRICT ch,\n    const float *wa1,\n    const float *wa2) {\n  static const float taur = -0.5f;\n  static const float taui = 0.866025403784439f;\n  int i, k, ic;\n  v4sf ci2, di2, di3, cr2, dr2, dr3, ti2, ti3, tr2, tr3, wr1, wi1, wr2, wi2;\n  for (k = 0; k < l1; k++) {\n    cr2 = VADD(cc[(k + l1) * ido], cc[(k + 2 * l1) * ido]);\n    ch[3 * k * ido] = VADD(cc[k * ido], cr2);\n    ch[(3 * k + 2) * ido] = SVMUL(taui, VSUB(cc[(k + l1 * 2) * ido], cc[(k + l1) * ido]));\n    ch[ido - 1 + (3 * k + 1) * ido] = VADD(cc[k * ido], SVMUL(taur, cr2));\n  }\n  if (ido == 1)\n    return;\n  for (k = 0; k < l1; k++) {\n    for (i = 2; i < ido; i += 2) {\n      ic = ido - i;\n      wr1 = LD_PS1(wa1[i - 2]);\n      wi1 = LD_PS1(wa1[i - 1]);\n      dr2 = cc[i - 1 + (k + l1) * ido];\n      di2 = cc[i + (k + l1) * ido];\n      VCPLXMULCONJ(dr2, di2, wr1, wi1);\n\n      wr2 = LD_PS1(wa2[i - 2]);\n      wi2 = LD_PS1(wa2[i - 1]);\n      dr3 = cc[i - 1 + (k + l1 * 2) * ido];\n      di3 = cc[i + (k + l1 * 2) * ido];\n      VCPLXMULCONJ(dr3, di3, wr2, wi2);\n\n      cr2 = VADD(dr2, dr3);\n      ci2 = VADD(di2, di3);\n      ch[i - 1 + 3 * k * ido] = VADD(cc[i - 1 + k * ido], cr2);\n      ch[i + 3 * k * ido] = VADD(cc[i + k * ido], ci2);\n      tr2 = VADD(cc[i - 1 + k * ido], SVMUL(taur, cr2));\n      ti2 = VADD(cc[i + k * ido], SVMUL(taur, ci2));\n      tr3 = SVMUL(taui, VSUB(di2, di3));\n      ti3 = SVMUL(taui, VSUB(dr3, dr2));\n      ch[i - 1 + (3 * k + 2) * ido] = VADD(tr2, tr3);\n      ch[ic - 1 + (3 * k + 1) * ido] = VSUB(tr2, tr3);\n      ch[i + (3 * k + 2) * ido] = VADD(ti2, ti3);\n      ch[ic + (3 * k + 1) * ido] = VSUB(ti3, ti2);\n    }\n  }\n} /* radf3 */\n\nstatic void radb3_ps(\n    int ido,\n    int l1,\n    const v4sf *RESTRICT cc,\n    v4sf *RESTRICT ch,\n    const float *wa1,\n    const float *wa2) {\n  static const float taur = -0.5f;\n  static const float taui = 0.866025403784439f;\n  static const float taui_2 = 0.866025403784439f * 2;\n  int i, k, ic;\n  v4sf ci2, ci3, di2, di3, cr2, cr3, dr2, dr3, ti2, tr2;\n  for (k = 0; k < l1; k++) {\n    tr2 = cc[ido - 1 + (3 * k + 1) * ido];\n    tr2 = VADD(tr2, tr2);\n    cr2 = VMADD(LD_PS1(taur), tr2, cc[3 * k * ido]);\n    ch[k * ido] = VADD(cc[3 * k * ido], tr2);\n    ci3 = SVMUL(taui_2, cc[(3 * k + 2) * ido]);\n    ch[(k + l1) * ido] = VSUB(cr2, ci3);\n    ch[(k + 2 * l1) * ido] = VADD(cr2, ci3);\n  }\n  if (ido == 1)\n    return;\n  for (k = 0; k < l1; k++) {\n    for (i = 2; i < ido; i += 2) {\n      ic = ido - i;\n      tr2 = VADD(cc[i - 1 + (3 * k + 2) * ido], cc[ic - 1 + (3 * k + 1) * ido]);\n      cr2 = VMADD(LD_PS1(taur), tr2, cc[i - 1 + 3 * k * ido]);\n      ch[i - 1 + k * ido] = VADD(cc[i - 1 + 3 * k * ido], tr2);\n      ti2 = VSUB(cc[i + (3 * k + 2) * ido], cc[ic + (3 * k + 1) * ido]);\n      ci2 = VMADD(LD_PS1(taur), ti2, cc[i + 3 * k * ido]);\n      ch[i + k * ido] = VADD(cc[i + 3 * k * ido], ti2);\n      cr3 = SVMUL(taui, VSUB(cc[i - 1 + (3 * k + 2) * ido], cc[ic - 1 + (3 * k + 1) * ido]));\n      ci3 = SVMUL(taui, VADD(cc[i + (3 * k + 2) * ido], cc[ic + (3 * k + 1) * ido]));\n      dr2 = VSUB(cr2, ci3);\n      dr3 = VADD(cr2, ci3);\n      di2 = VADD(ci2, cr3);\n      di3 = VSUB(ci2, cr3);\n      VCPLXMUL(dr2, di2, LD_PS1(wa1[i - 2]), LD_PS1(wa1[i - 1]));\n      ch[i - 1 + (k + l1) * ido] = dr2;\n      ch[i + (k + l1) * ido] = di2;\n      VCPLXMUL(dr3, di3, LD_PS1(wa2[i - 2]), LD_PS1(wa2[i - 1]));\n      ch[i - 1 + (k + 2 * l1) * ido] = dr3;\n      ch[i + (k + 2 * l1) * ido] = di3;\n    }\n  }\n} /* radb3 */\n\nstatic NEVER_INLINE(void) radf4_ps(\n    int ido,\n    int l1,\n    const v4sf *RESTRICT cc,\n    v4sf *RESTRICT ch,\n    const float *RESTRICT wa1,\n    const float *RESTRICT wa2,\n    const float *RESTRICT wa3) {\n  static const float minus_hsqt2 = (float)-0.7071067811865475;\n  int i, k, l1ido = l1 * ido;\n  {\n    const v4sf *RESTRICT cc_ = cc, *RESTRICT cc_end = cc + l1ido;\n    v4sf *RESTRICT ch_ = ch;\n    while (cc < cc_end) {\n      /* this loop represents between 25% and 40% of total radf4_ps cost ! */\n      v4sf a0 = cc[0], a1 = cc[l1ido];\n      v4sf a2 = cc[2 * l1ido], a3 = cc[3 * l1ido];\n      v4sf tr1 = VADD(a1, a3);\n      v4sf tr2 = VADD(a0, a2);\n      ch[2 * ido - 1] = VSUB(a0, a2);\n      ch[2 * ido] = VSUB(a3, a1);\n      ch[0] = VADD(tr1, tr2);\n      ch[4 * ido - 1] = VSUB(tr2, tr1);\n      cc += ido;\n      ch += 4 * ido;\n    }\n    cc = cc_;\n    ch = ch_;\n  }\n  if (ido < 2)\n    return;\n  if (ido != 2) {\n    for (k = 0; k < l1ido; k += ido) {\n      const v4sf *RESTRICT pc = (v4sf *)(cc + 1 + k);\n      for (i = 2; i < ido; i += 2, pc += 2) {\n        int ic = ido - i;\n        v4sf wr, wi, cr2, ci2, cr3, ci3, cr4, ci4;\n        v4sf tr1, ti1, tr2, ti2, tr3, ti3, tr4, ti4;\n\n        cr2 = pc[1 * l1ido + 0];\n        ci2 = pc[1 * l1ido + 1];\n        wr = LD_PS1(wa1[i - 2]);\n        wi = LD_PS1(wa1[i - 1]);\n        VCPLXMULCONJ(cr2, ci2, wr, wi);\n\n        cr3 = pc[2 * l1ido + 0];\n        ci3 = pc[2 * l1ido + 1];\n        wr = LD_PS1(wa2[i - 2]);\n        wi = LD_PS1(wa2[i - 1]);\n        VCPLXMULCONJ(cr3, ci3, wr, wi);\n\n        cr4 = pc[3 * l1ido];\n        ci4 = pc[3 * l1ido + 1];\n        wr = LD_PS1(wa3[i - 2]);\n        wi = LD_PS1(wa3[i - 1]);\n        VCPLXMULCONJ(cr4, ci4, wr, wi);\n\n        /* at this point, on SSE, five of \"cr2 cr3 cr4 ci2 ci3 ci4\" should be loaded in registers */\n\n        tr1 = VADD(cr2, cr4);\n        tr4 = VSUB(cr4, cr2);\n        tr2 = VADD(pc[0], cr3);\n        tr3 = VSUB(pc[0], cr3);\n        ch[i - 1 + 4 * k] = VADD(tr1, tr2);\n        ch[ic - 1 + 4 * k + 3 * ido] =\n            VSUB(tr2, tr1); /* at this point tr1 and tr2 can be disposed */\n        ti1 = VADD(ci2, ci4);\n        ti4 = VSUB(ci2, ci4);\n        ch[i - 1 + 4 * k + 2 * ido] = VADD(ti4, tr3);\n        ch[ic - 1 + 4 * k + 1 * ido] = VSUB(tr3, ti4); /* dispose tr3, ti4 */\n        ti2 = VADD(pc[1], ci3);\n        ti3 = VSUB(pc[1], ci3);\n        ch[i + 4 * k] = VADD(ti1, ti2);\n        ch[ic + 4 * k + 3 * ido] = VSUB(ti1, ti2);\n        ch[i + 4 * k + 2 * ido] = VADD(tr4, ti3);\n        ch[ic + 4 * k + 1 * ido] = VSUB(tr4, ti3);\n      }\n    }\n    if (ido % 2 == 1)\n      return;\n  }\n  for (k = 0; k < l1ido; k += ido) {\n    v4sf a = cc[ido - 1 + k + l1ido], b = cc[ido - 1 + k + 3 * l1ido];\n    v4sf c = cc[ido - 1 + k], d = cc[ido - 1 + k + 2 * l1ido];\n    v4sf ti1 = SVMUL(minus_hsqt2, VADD(a, b));\n    v4sf tr1 = SVMUL(minus_hsqt2, VSUB(b, a));\n    ch[ido - 1 + 4 * k] = VADD(tr1, c);\n    ch[ido - 1 + 4 * k + 2 * ido] = VSUB(c, tr1);\n    ch[4 * k + 1 * ido] = VSUB(ti1, d);\n    ch[4 * k + 3 * ido] = VADD(ti1, d);\n  }\n} /* radf4 */\n\nstatic NEVER_INLINE(void) radb4_ps(\n    int ido,\n    int l1,\n    const v4sf *RESTRICT cc,\n    v4sf *RESTRICT ch,\n    const float *RESTRICT wa1,\n    const float *RESTRICT wa2,\n    const float *RESTRICT wa3) {\n  static const float minus_sqrt2 = (float)-1.414213562373095;\n  static const float two = 2.f;\n  int i, k, l1ido = l1 * ido;\n  v4sf ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;\n  {\n    const v4sf *RESTRICT cc_ = cc, *RESTRICT ch_end = ch + l1ido;\n    v4sf *ch_ = ch;\n    while (ch < ch_end) {\n      v4sf a = cc[0], b = cc[4 * ido - 1];\n      v4sf c = cc[2 * ido], d = cc[2 * ido - 1];\n      tr3 = SVMUL(two, d);\n      tr2 = VADD(a, b);\n      tr1 = VSUB(a, b);\n      tr4 = SVMUL(two, c);\n      ch[0 * l1ido] = VADD(tr2, tr3);\n      ch[2 * l1ido] = VSUB(tr2, tr3);\n      ch[1 * l1ido] = VSUB(tr1, tr4);\n      ch[3 * l1ido] = VADD(tr1, tr4);\n\n      cc += 4 * ido;\n      ch += ido;\n    }\n    cc = cc_;\n    ch = ch_;\n  }\n  if (ido < 2)\n    return;\n  if (ido != 2) {\n    for (k = 0; k < l1ido; k += ido) {\n      const v4sf *RESTRICT pc = (v4sf *)(cc - 1 + 4 * k);\n      v4sf *RESTRICT ph = (v4sf *)(ch + k + 1);\n      for (i = 2; i < ido; i += 2) {\n\n        tr1 = VSUB(pc[i], pc[4 * ido - i]);\n        tr2 = VADD(pc[i], pc[4 * ido - i]);\n        ti4 = VSUB(pc[2 * ido + i], pc[2 * ido - i]);\n        tr3 = VADD(pc[2 * ido + i], pc[2 * ido - i]);\n        ph[0] = VADD(tr2, tr3);\n        cr3 = VSUB(tr2, tr3);\n\n        ti3 = VSUB(pc[2 * ido + i + 1], pc[2 * ido - i + 1]);\n        tr4 = VADD(pc[2 * ido + i + 1], pc[2 * ido - i + 1]);\n        cr2 = VSUB(tr1, tr4);\n        cr4 = VADD(tr1, tr4);\n\n        ti1 = VADD(pc[i + 1], pc[4 * ido - i + 1]);\n        ti2 = VSUB(pc[i + 1], pc[4 * ido - i + 1]);\n\n        ph[1] = VADD(ti2, ti3);\n        ph += l1ido;\n        ci3 = VSUB(ti2, ti3);\n        ci2 = VADD(ti1, ti4);\n        ci4 = VSUB(ti1, ti4);\n        VCPLXMUL(cr2, ci2, LD_PS1(wa1[i - 2]), LD_PS1(wa1[i - 1]));\n        ph[0] = cr2;\n        ph[1] = ci2;\n        ph += l1ido;\n        VCPLXMUL(cr3, ci3, LD_PS1(wa2[i - 2]), LD_PS1(wa2[i - 1]));\n        ph[0] = cr3;\n        ph[1] = ci3;\n        ph += l1ido;\n        VCPLXMUL(cr4, ci4, LD_PS1(wa3[i - 2]), LD_PS1(wa3[i - 1]));\n        ph[0] = cr4;\n        ph[1] = ci4;\n        ph = ph - 3 * l1ido + 2;\n      }\n    }\n    if (ido % 2 == 1)\n      return;\n  }\n  for (k = 0; k < l1ido; k += ido) {\n    int i0 = 4 * k + ido;\n    v4sf c = cc[i0 - 1], d = cc[i0 + 2 * ido - 1];\n    v4sf a = cc[i0 + 0], b = cc[i0 + 2 * ido + 0];\n    tr1 = VSUB(c, d);\n    tr2 = VADD(c, d);\n    ti1 = VADD(b, a);\n    ti2 = VSUB(b, a);\n    ch[ido - 1 + k + 0 * l1ido] = VADD(tr2, tr2);\n    ch[ido - 1 + k + 1 * l1ido] = SVMUL(minus_sqrt2, VSUB(ti1, tr1));\n    ch[ido - 1 + k + 2 * l1ido] = VADD(ti2, ti2);\n    ch[ido - 1 + k + 3 * l1ido] = SVMUL(minus_sqrt2, VADD(ti1, tr1));\n  }\n} /* radb4 */\n\nstatic void radf5_ps(\n    int ido,\n    int l1,\n    const v4sf *RESTRICT cc,\n    v4sf *RESTRICT ch,\n    const float *wa1,\n    const float *wa2,\n    const float *wa3,\n    const float *wa4) {\n  static const float tr11 = .309016994374947f;\n  static const float ti11 = .951056516295154f;\n  static const float tr12 = -.809016994374947f;\n  static const float ti12 = .587785252292473f;\n\n  /* System generated locals */\n  int cc_offset, ch_offset;\n\n  /* Local variables */\n  int i, k, ic;\n  v4sf ci2, di2, ci4, ci5, di3, di4, di5, ci3, cr2, cr3, dr2, dr3, dr4, dr5, cr5, cr4, ti2, ti3,\n      ti5, ti4, tr2, tr3, tr4, tr5;\n  int idp2;\n\n#define cc_ref(a_1, a_2, a_3) cc[((a_3) * l1 + (a_2)) * ido + a_1]\n#define ch_ref(a_1, a_2, a_3) ch[((a_3) * 5 + (a_2)) * ido + a_1]\n\n  /* Parameter adjustments */\n  ch_offset = 1 + ido * 6;\n  ch -= ch_offset;\n  cc_offset = 1 + ido * (1 + l1);\n  cc -= cc_offset;\n\n  /* Function Body */\n  for (k = 1; k <= l1; ++k) {\n    cr2 = VADD(cc_ref(1, k, 5), cc_ref(1, k, 2));\n    ci5 = VSUB(cc_ref(1, k, 5), cc_ref(1, k, 2));\n    cr3 = VADD(cc_ref(1, k, 4), cc_ref(1, k, 3));\n    ci4 = VSUB(cc_ref(1, k, 4), cc_ref(1, k, 3));\n    ch_ref(1, 1, k) = VADD(cc_ref(1, k, 1), VADD(cr2, cr3));\n    ch_ref(ido, 2, k) = VADD(cc_ref(1, k, 1), VADD(SVMUL(tr11, cr2), SVMUL(tr12, cr3)));\n    ch_ref(1, 3, k) = VADD(SVMUL(ti11, ci5), SVMUL(ti12, ci4));\n    ch_ref(ido, 4, k) = VADD(cc_ref(1, k, 1), VADD(SVMUL(tr12, cr2), SVMUL(tr11, cr3)));\n    ch_ref(1, 5, k) = VSUB(SVMUL(ti12, ci5), SVMUL(ti11, ci4));\n    /* printf(\"pffft: radf5, k=%d ch_ref=%f, ci4=%f\\n\", k, ch_ref(1, 5, k), ci4); */\n  }\n  if (ido == 1) {\n    return;\n  }\n  idp2 = ido + 2;\n  for (k = 1; k <= l1; ++k) {\n    for (i = 3; i <= ido; i += 2) {\n      ic = idp2 - i;\n      dr2 = LD_PS1(wa1[i - 3]);\n      di2 = LD_PS1(wa1[i - 2]);\n      dr3 = LD_PS1(wa2[i - 3]);\n      di3 = LD_PS1(wa2[i - 2]);\n      dr4 = LD_PS1(wa3[i - 3]);\n      di4 = LD_PS1(wa3[i - 2]);\n      dr5 = LD_PS1(wa4[i - 3]);\n      di5 = LD_PS1(wa4[i - 2]);\n      VCPLXMULCONJ(dr2, di2, cc_ref(i - 1, k, 2), cc_ref(i, k, 2));\n      VCPLXMULCONJ(dr3, di3, cc_ref(i - 1, k, 3), cc_ref(i, k, 3));\n      VCPLXMULCONJ(dr4, di4, cc_ref(i - 1, k, 4), cc_ref(i, k, 4));\n      VCPLXMULCONJ(dr5, di5, cc_ref(i - 1, k, 5), cc_ref(i, k, 5));\n      cr2 = VADD(dr2, dr5);\n      ci5 = VSUB(dr5, dr2);\n      cr5 = VSUB(di2, di5);\n      ci2 = VADD(di2, di5);\n      cr3 = VADD(dr3, dr4);\n      ci4 = VSUB(dr4, dr3);\n      cr4 = VSUB(di3, di4);\n      ci3 = VADD(di3, di4);\n      ch_ref(i - 1, 1, k) = VADD(cc_ref(i - 1, k, 1), VADD(cr2, cr3));\n      ch_ref(i, 1, k) = VSUB(cc_ref(i, k, 1), VADD(ci2, ci3));\n      tr2 = VADD(cc_ref(i - 1, k, 1), VADD(SVMUL(tr11, cr2), SVMUL(tr12, cr3)));\n      ti2 = VSUB(cc_ref(i, k, 1), VADD(SVMUL(tr11, ci2), SVMUL(tr12, ci3)));\n      tr3 = VADD(cc_ref(i - 1, k, 1), VADD(SVMUL(tr12, cr2), SVMUL(tr11, cr3)));\n      ti3 = VSUB(cc_ref(i, k, 1), VADD(SVMUL(tr12, ci2), SVMUL(tr11, ci3)));\n      tr5 = VADD(SVMUL(ti11, cr5), SVMUL(ti12, cr4));\n      ti5 = VADD(SVMUL(ti11, ci5), SVMUL(ti12, ci4));\n      tr4 = VSUB(SVMUL(ti12, cr5), SVMUL(ti11, cr4));\n      ti4 = VSUB(SVMUL(ti12, ci5), SVMUL(ti11, ci4));\n      ch_ref(i - 1, 3, k) = VSUB(tr2, tr5);\n      ch_ref(ic - 1, 2, k) = VADD(tr2, tr5);\n      ch_ref(i, 3, k) = VADD(ti2, ti5);\n      ch_ref(ic, 2, k) = VSUB(ti5, ti2);\n      ch_ref(i - 1, 5, k) = VSUB(tr3, tr4);\n      ch_ref(ic - 1, 4, k) = VADD(tr3, tr4);\n      ch_ref(i, 5, k) = VADD(ti3, ti4);\n      ch_ref(ic, 4, k) = VSUB(ti4, ti3);\n    }\n  }\n#undef cc_ref\n#undef ch_ref\n} /* radf5 */\n\nstatic void radb5_ps(\n    int ido,\n    int l1,\n    const v4sf *RESTRICT cc,\n    v4sf *RESTRICT ch,\n    const float *wa1,\n    const float *wa2,\n    const float *wa3,\n    const float *wa4) {\n  static const float tr11 = .309016994374947f;\n  static const float ti11 = .951056516295154f;\n  static const float tr12 = -.809016994374947f;\n  static const float ti12 = .587785252292473f;\n\n  int cc_offset, ch_offset;\n\n  /* Local variables */\n  int i, k, ic;\n  v4sf ci2, ci3, ci4, ci5, di3, di4, di5, di2, cr2, cr3, cr5, cr4, ti2, ti3, ti4, ti5, dr3, dr4,\n      dr5, dr2, tr2, tr3, tr4, tr5;\n  int idp2;\n\n#define cc_ref(a_1, a_2, a_3) cc[((a_3) * 5 + (a_2)) * ido + a_1]\n#define ch_ref(a_1, a_2, a_3) ch[((a_3) * l1 + (a_2)) * ido + a_1]\n\n  /* Parameter adjustments */\n  ch_offset = 1 + ido * (1 + l1);\n  ch -= ch_offset;\n  cc_offset = 1 + ido * 6;\n  cc -= cc_offset;\n\n  /* Function Body */\n  for (k = 1; k <= l1; ++k) {\n    ti5 = VADD(cc_ref(1, 3, k), cc_ref(1, 3, k));\n    ti4 = VADD(cc_ref(1, 5, k), cc_ref(1, 5, k));\n    tr2 = VADD(cc_ref(ido, 2, k), cc_ref(ido, 2, k));\n    tr3 = VADD(cc_ref(ido, 4, k), cc_ref(ido, 4, k));\n    ch_ref(1, k, 1) = VADD(cc_ref(1, 1, k), VADD(tr2, tr3));\n    cr2 = VADD(cc_ref(1, 1, k), VADD(SVMUL(tr11, tr2), SVMUL(tr12, tr3)));\n    cr3 = VADD(cc_ref(1, 1, k), VADD(SVMUL(tr12, tr2), SVMUL(tr11, tr3)));\n    ci5 = VADD(SVMUL(ti11, ti5), SVMUL(ti12, ti4));\n    ci4 = VSUB(SVMUL(ti12, ti5), SVMUL(ti11, ti4));\n    ch_ref(1, k, 2) = VSUB(cr2, ci5);\n    ch_ref(1, k, 3) = VSUB(cr3, ci4);\n    ch_ref(1, k, 4) = VADD(cr3, ci4);\n    ch_ref(1, k, 5) = VADD(cr2, ci5);\n  }\n  if (ido == 1) {\n    return;\n  }\n  idp2 = ido + 2;\n  for (k = 1; k <= l1; ++k) {\n    for (i = 3; i <= ido; i += 2) {\n      ic = idp2 - i;\n      ti5 = VADD(cc_ref(i, 3, k), cc_ref(ic, 2, k));\n      ti2 = VSUB(cc_ref(i, 3, k), cc_ref(ic, 2, k));\n      ti4 = VADD(cc_ref(i, 5, k), cc_ref(ic, 4, k));\n      ti3 = VSUB(cc_ref(i, 5, k), cc_ref(ic, 4, k));\n      tr5 = VSUB(cc_ref(i - 1, 3, k), cc_ref(ic - 1, 2, k));\n      tr2 = VADD(cc_ref(i - 1, 3, k), cc_ref(ic - 1, 2, k));\n      tr4 = VSUB(cc_ref(i - 1, 5, k), cc_ref(ic - 1, 4, k));\n      tr3 = VADD(cc_ref(i - 1, 5, k), cc_ref(ic - 1, 4, k));\n      ch_ref(i - 1, k, 1) = VADD(cc_ref(i - 1, 1, k), VADD(tr2, tr3));\n      ch_ref(i, k, 1) = VADD(cc_ref(i, 1, k), VADD(ti2, ti3));\n      cr2 = VADD(cc_ref(i - 1, 1, k), VADD(SVMUL(tr11, tr2), SVMUL(tr12, tr3)));\n      ci2 = VADD(cc_ref(i, 1, k), VADD(SVMUL(tr11, ti2), SVMUL(tr12, ti3)));\n      cr3 = VADD(cc_ref(i - 1, 1, k), VADD(SVMUL(tr12, tr2), SVMUL(tr11, tr3)));\n      ci3 = VADD(cc_ref(i, 1, k), VADD(SVMUL(tr12, ti2), SVMUL(tr11, ti3)));\n      cr5 = VADD(SVMUL(ti11, tr5), SVMUL(ti12, tr4));\n      ci5 = VADD(SVMUL(ti11, ti5), SVMUL(ti12, ti4));\n      cr4 = VSUB(SVMUL(ti12, tr5), SVMUL(ti11, tr4));\n      ci4 = VSUB(SVMUL(ti12, ti5), SVMUL(ti11, ti4));\n      dr3 = VSUB(cr3, ci4);\n      dr4 = VADD(cr3, ci4);\n      di3 = VADD(ci3, cr4);\n      di4 = VSUB(ci3, cr4);\n      dr5 = VADD(cr2, ci5);\n      dr2 = VSUB(cr2, ci5);\n      di5 = VSUB(ci2, cr5);\n      di2 = VADD(ci2, cr5);\n      VCPLXMUL(dr2, di2, LD_PS1(wa1[i - 3]), LD_PS1(wa1[i - 2]));\n      VCPLXMUL(dr3, di3, LD_PS1(wa2[i - 3]), LD_PS1(wa2[i - 2]));\n      VCPLXMUL(dr4, di4, LD_PS1(wa3[i - 3]), LD_PS1(wa3[i - 2]));\n      VCPLXMUL(dr5, di5, LD_PS1(wa4[i - 3]), LD_PS1(wa4[i - 2]));\n\n      ch_ref(i - 1, k, 2) = dr2;\n      ch_ref(i, k, 2) = di2;\n      ch_ref(i - 1, k, 3) = dr3;\n      ch_ref(i, k, 3) = di3;\n      ch_ref(i - 1, k, 4) = dr4;\n      ch_ref(i, k, 4) = di4;\n      ch_ref(i - 1, k, 5) = dr5;\n      ch_ref(i, k, 5) = di5;\n    }\n  }\n#undef cc_ref\n#undef ch_ref\n} /* radb5 */\n\nstatic NEVER_INLINE(v4sf *) rfftf1_ps(\n    int n,\n    const v4sf *input_readonly,\n    v4sf *work1,\n    v4sf *work2,\n    const float *wa,\n    const int *ifac) {\n  v4sf *in = (v4sf *)input_readonly;\n  v4sf *out = (in == work2 ? work1 : work2);\n  int nf = ifac[1], k1;\n  int l2 = n;\n  int iw = n - 1;\n  assert(in != out && work1 != work2);\n  for (k1 = 1; k1 <= nf; ++k1) {\n    int kh = nf - k1;\n    int ip = ifac[kh + 2];\n    int l1 = l2 / ip;\n    int ido = n / l2;\n    iw -= (ip - 1) * ido;\n    switch (ip) {\n      case 5: {\n        int ix2 = iw + ido;\n        int ix3 = ix2 + ido;\n        int ix4 = ix3 + ido;\n        radf5_ps(ido, l1, in, out, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4]);\n      } break;\n      case 4: {\n        int ix2 = iw + ido;\n        int ix3 = ix2 + ido;\n        radf4_ps(ido, l1, in, out, &wa[iw], &wa[ix2], &wa[ix3]);\n      } break;\n      case 3: {\n        int ix2 = iw + ido;\n        radf3_ps(ido, l1, in, out, &wa[iw], &wa[ix2]);\n      } break;\n      case 2:\n        radf2_ps(ido, l1, in, out, &wa[iw]);\n        break;\n      default:\n        assert(0);\n        break;\n    }\n    l2 = l1;\n    if (out == work2) {\n      out = work1;\n      in = work2;\n    } else {\n      out = work2;\n      in = work1;\n    }\n  }\n  return in; /* this is in fact the output .. */\n} /* rfftf1 */\n\nstatic NEVER_INLINE(v4sf *) rfftb1_ps(\n    int n,\n    const v4sf *input_readonly,\n    v4sf *work1,\n    v4sf *work2,\n    const float *wa,\n    const int *ifac) {\n  v4sf *in = (v4sf *)input_readonly;\n  v4sf *out = (in == work2 ? work1 : work2);\n  int nf = ifac[1], k1;\n  int l1 = 1;\n  int iw = 0;\n  assert(in != out);\n  for (k1 = 1; k1 <= nf; k1++) {\n    int ip = ifac[k1 + 1];\n    int l2 = ip * l1;\n    int ido = n / l2;\n    switch (ip) {\n      case 5: {\n        int ix2 = iw + ido;\n        int ix3 = ix2 + ido;\n        int ix4 = ix3 + ido;\n        radb5_ps(ido, l1, in, out, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4]);\n      } break;\n      case 4: {\n        int ix2 = iw + ido;\n        int ix3 = ix2 + ido;\n        radb4_ps(ido, l1, in, out, &wa[iw], &wa[ix2], &wa[ix3]);\n      } break;\n      case 3: {\n        int ix2 = iw + ido;\n        radb3_ps(ido, l1, in, out, &wa[iw], &wa[ix2]);\n      } break;\n      case 2:\n        radb2_ps(ido, l1, in, out, &wa[iw]);\n        break;\n      default:\n        assert(0);\n        break;\n    }\n    l1 = l2;\n    iw += (ip - 1) * ido;\n\n    if (out == work2) {\n      out = work1;\n      in = work2;\n    } else {\n      out = work2;\n      in = work1;\n    }\n  }\n  return in; /* this is in fact the output .. */\n}\n\nstatic int decompose(int n, int *ifac, const int *ntryh) {\n  int nl = n, nf = 0, i, j = 0;\n  for (j = 0; ntryh[j]; ++j) {\n    int ntry = ntryh[j];\n    while (nl != 1) {\n      int nq = nl / ntry;\n      int nr = nl - ntry * nq;\n      if (nr == 0) {\n        ifac[2 + nf++] = ntry;\n        nl = nq;\n        if (ntry == 2 && nf != 1) {\n          for (i = 2; i <= nf; ++i) {\n            int ib = nf - i + 2;\n            ifac[ib + 1] = ifac[ib];\n          }\n          ifac[2] = 2;\n        }\n      } else\n        break;\n    }\n  }\n  ifac[0] = n;\n  ifac[1] = nf;\n  return nf;\n}\n\nstatic void rffti1_ps(int n, float *wa, int *ifac) {\n  static const int ntryh[] = {4, 2, 3, 5, 0};\n  int k1, j, ii;\n\n  int nf = decompose(n, ifac, ntryh);\n  float argh = (2 * (float)M_PI) / n;\n  int is = 0;\n  int nfm1 = nf - 1;\n  int l1 = 1;\n  for (k1 = 1; k1 <= nfm1; k1++) {\n    int ip = ifac[k1 + 1];\n    int ld = 0;\n    int l2 = l1 * ip;\n    int ido = n / l2;\n    int ipm = ip - 1;\n    for (j = 1; j <= ipm; ++j) {\n      float argld;\n      int i = is, fi = 0;\n      ld += l1;\n      argld = ld * argh;\n      for (ii = 3; ii <= ido; ii += 2) {\n        i += 2;\n        fi += 1;\n        wa[i - 2] = FUNC_COS(fi * argld);\n        wa[i - 1] = FUNC_SIN(fi * argld);\n      }\n      is += ido;\n    }\n    l1 = l2;\n  }\n} /* rffti1 */\n\nstatic void cffti1_ps(int n, float *wa, int *ifac) {\n  static const int ntryh[] = {5, 3, 4, 2, 0};\n  int k1, j, ii;\n\n  int nf = decompose(n, ifac, ntryh);\n  float argh = (2 * (float)M_PI) / n;\n  int i = 1;\n  int l1 = 1;\n  for (k1 = 1; k1 <= nf; k1++) {\n    int ip = ifac[k1 + 1];\n    int ld = 0;\n    int l2 = l1 * ip;\n    int ido = n / l2;\n    int idot = ido + ido + 2;\n    int ipm = ip - 1;\n    for (j = 1; j <= ipm; j++) {\n      float argld;\n      int i1 = i, fi = 0;\n      wa[i - 1] = 1;\n      wa[i] = 0;\n      ld += l1;\n      argld = ld * argh;\n      for (ii = 4; ii <= idot; ii += 2) {\n        i += 2;\n        fi += 1;\n        wa[i - 1] = FUNC_COS(fi * argld);\n        wa[i] = FUNC_SIN(fi * argld);\n      }\n      if (ip > 5) {\n        wa[i1 - 1] = wa[i - 1];\n        wa[i1] = wa[i];\n      }\n    }\n    l1 = l2;\n  }\n} /* cffti1 */\n\nstatic v4sf *cfftf1_ps(\n    int n,\n    const v4sf *input_readonly,\n    v4sf *work1,\n    v4sf *work2,\n    const float *wa,\n    const int *ifac,\n    int isign) {\n  v4sf *in = (v4sf *)input_readonly;\n  v4sf *out = (in == work2 ? work1 : work2);\n  int nf = ifac[1], k1;\n  int l1 = 1;\n  int iw = 0;\n  assert(in != out && work1 != work2);\n  for (k1 = 2; k1 <= nf + 1; k1++) {\n    int ip = ifac[k1];\n    int l2 = ip * l1;\n    int ido = n / l2;\n    int idot = ido + ido;\n    switch (ip) {\n      case 5: {\n        int ix2 = iw + idot;\n        int ix3 = ix2 + idot;\n        int ix4 = ix3 + idot;\n        passf5_ps(idot, l1, in, out, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign);\n      } break;\n      case 4: {\n        int ix2 = iw + idot;\n        int ix3 = ix2 + idot;\n        passf4_ps(idot, l1, in, out, &wa[iw], &wa[ix2], &wa[ix3], isign);\n      } break;\n      case 2: {\n        passf2_ps(idot, l1, in, out, &wa[iw], isign);\n      } break;\n      case 3: {\n        int ix2 = iw + idot;\n        passf3_ps(idot, l1, in, out, &wa[iw], &wa[ix2], isign);\n      } break;\n      default:\n        assert(0);\n    }\n    l1 = l2;\n    iw += (ip - 1) * idot;\n    if (out == work2) {\n      out = work1;\n      in = work2;\n    } else {\n      out = work2;\n      in = work1;\n    }\n  }\n\n  return in; /* this is in fact the output .. */\n}\n\nstruct SETUP_STRUCT {\n  int N;\n  int Ncvec; /* nb of complex simd vectors (N/4 if PFFFT_COMPLEX, N/8 if PFFFT_REAL) */\n  int ifac[15];\n  pffft_transform_t transform;\n  v4sf *data;     /* allocated room for twiddle coefs */\n  float *e;       /* points into 'data', N/4*3 elements */\n  float *twiddle; /* points into 'data', N/4 elements */\n};\n\nSETUP_STRUCT *FUNC_NEW_SETUP(int N, pffft_transform_t transform) {\n  SETUP_STRUCT *s = 0;\n  int k, m;\n  /* unfortunately, the fft size must be a multiple of 16 for complex FFTs \n     and 32 for real FFTs -- a lot of stuff would need to be rewritten to\n     handle other cases (or maybe just switch to a scalar fft, I don't know..) */\n  if (transform == PFFFT_REAL) {\n    if ((N % (2 * SIMD_SZ * SIMD_SZ)) || N <= 0)\n      return s;\n  }\n  if (transform == PFFFT_COMPLEX) {\n    if ((N % (SIMD_SZ * SIMD_SZ)) || N <= 0)\n      return s;\n  }\n  s = (SETUP_STRUCT *)malloc(sizeof(SETUP_STRUCT));\n  /* assert((N % 32) == 0); */\n  s->N = N;\n  s->transform = transform;\n  /* nb of complex simd vectors */\n  s->Ncvec = (transform == PFFFT_REAL ? N / 2 : N) / SIMD_SZ;\n  s->data = (v4sf *)FUNC_ALIGNED_MALLOC(2 * s->Ncvec * sizeof(v4sf));\n  s->e = (float *)s->data;\n  s->twiddle = (float *)(s->data + (2 * s->Ncvec * (SIMD_SZ - 1)) / SIMD_SZ);\n\n  if (transform == PFFFT_REAL) {\n    for (k = 0; k < s->Ncvec; ++k) {\n      int i = k / SIMD_SZ;\n      int j = k % SIMD_SZ;\n      for (m = 0; m < SIMD_SZ - 1; ++m) {\n        float A = -2 * (float)M_PI * (m + 1) * k / N;\n        s->e[(2 * (i * 3 + m) + 0) * SIMD_SZ + j] = FUNC_COS(A);\n        s->e[(2 * (i * 3 + m) + 1) * SIMD_SZ + j] = FUNC_SIN(A);\n      }\n    }\n    rffti1_ps(N / SIMD_SZ, s->twiddle, s->ifac);\n  } else {\n    for (k = 0; k < s->Ncvec; ++k) {\n      int i = k / SIMD_SZ;\n      int j = k % SIMD_SZ;\n      for (m = 0; m < SIMD_SZ - 1; ++m) {\n        float A = -2 * (float)M_PI * (m + 1) * k / N;\n        s->e[(2 * (i * 3 + m) + 0) * SIMD_SZ + j] = FUNC_COS(A);\n        s->e[(2 * (i * 3 + m) + 1) * SIMD_SZ + j] = FUNC_SIN(A);\n      }\n    }\n    cffti1_ps(N / SIMD_SZ, s->twiddle, s->ifac);\n  }\n\n  /* check that N is decomposable with allowed prime factors */\n  for (k = 0, m = 1; k < s->ifac[1]; ++k) {\n    m *= s->ifac[2 + k];\n  }\n  if (m != N / SIMD_SZ) {\n    FUNC_DESTROY(s);\n    s = 0;\n  }\n\n  return s;\n}\n\nvoid FUNC_DESTROY(SETUP_STRUCT *s) {\n  if (!s)\n    return;\n  FUNC_ALIGNED_FREE(s->data);\n  free(s);\n}\n\n#if (SIMD_SZ == 4) /* !defined(PFFFT_SIMD_DISABLE) */\n\n/* [0 0 1 2 3 4 5 6 7 8] -> [0 8 7 6 5 4 3 2 1] */\nstatic void reversed_copy(int N, const v4sf *in, int in_stride, v4sf *out) {\n  v4sf g0, g1;\n  int k;\n  INTERLEAVE2(in[0], in[1], g0, g1);\n  in += in_stride;\n\n  *--out = VSWAPHL(g0, g1); /* [g0l, g0h], [g1l g1h] -> [g1l, g0h] */\n  for (k = 1; k < N; ++k) {\n    v4sf h0, h1;\n    INTERLEAVE2(in[0], in[1], h0, h1);\n    in += in_stride;\n    *--out = VSWAPHL(g1, h0);\n    *--out = VSWAPHL(h0, h1);\n    g1 = h1;\n  }\n  *--out = VSWAPHL(g1, g0);\n}\n\nstatic void unreversed_copy(int N, const v4sf *in, v4sf *out, int out_stride) {\n  v4sf g0, g1, h0, h1;\n  int k;\n  g0 = g1 = in[0];\n  ++in;\n  for (k = 1; k < N; ++k) {\n    h0 = *in++;\n    h1 = *in++;\n    g1 = VSWAPHL(g1, h0);\n    h0 = VSWAPHL(h0, h1);\n    UNINTERLEAVE2(h0, g1, out[0], out[1]);\n    out += out_stride;\n    g1 = h1;\n  }\n  h0 = *in++;\n  h1 = g0;\n  g1 = VSWAPHL(g1, h0);\n  h0 = VSWAPHL(h0, h1);\n  UNINTERLEAVE2(h0, g1, out[0], out[1]);\n}\n\nvoid FUNC_ZREORDER(SETUP_STRUCT *setup, const float *in, float *out, pffft_direction_t direction) {\n  int k, N = setup->N, Ncvec = setup->Ncvec;\n  const v4sf *vin = (const v4sf *)in;\n  v4sf *vout = (v4sf *)out;\n  assert(in != out);\n  if (setup->transform == PFFFT_REAL) {\n    int k, dk = N / 32;\n    if (direction == PFFFT_FORWARD) {\n      for (k = 0; k < dk; ++k) {\n        INTERLEAVE2(\n            vin[k * 8 + 0], vin[k * 8 + 1], vout[2 * (0 * dk + k) + 0], vout[2 * (0 * dk + k) + 1]);\n        INTERLEAVE2(\n            vin[k * 8 + 4], vin[k * 8 + 5], vout[2 * (2 * dk + k) + 0], vout[2 * (2 * dk + k) + 1]);\n      }\n      reversed_copy(dk, vin + 2, 8, (v4sf *)(out + N / 2));\n      reversed_copy(dk, vin + 6, 8, (v4sf *)(out + N));\n    } else {\n      for (k = 0; k < dk; ++k) {\n        UNINTERLEAVE2(\n            vin[2 * (0 * dk + k) + 0], vin[2 * (0 * dk + k) + 1], vout[k * 8 + 0], vout[k * 8 + 1]);\n        UNINTERLEAVE2(\n            vin[2 * (2 * dk + k) + 0], vin[2 * (2 * dk + k) + 1], vout[k * 8 + 4], vout[k * 8 + 5]);\n      }\n      unreversed_copy(dk, (v4sf *)(in + N / 4), (v4sf *)(out + N - 6 * SIMD_SZ), -8);\n      unreversed_copy(dk, (v4sf *)(in + 3 * N / 4), (v4sf *)(out + N - 2 * SIMD_SZ), -8);\n    }\n  } else {\n    if (direction == PFFFT_FORWARD) {\n      for (k = 0; k < Ncvec; ++k) {\n        int kk = (k / 4) + (k % 4) * (Ncvec / 4);\n        INTERLEAVE2(vin[k * 2], vin[k * 2 + 1], vout[kk * 2], vout[kk * 2 + 1]);\n      }\n    } else {\n      for (k = 0; k < Ncvec; ++k) {\n        int kk = (k / 4) + (k % 4) * (Ncvec / 4);\n        UNINTERLEAVE2(vin[kk * 2], vin[kk * 2 + 1], vout[k * 2], vout[k * 2 + 1]);\n      }\n    }\n  }\n}\n\nvoid FUNC_CPLX_FINALIZE(int Ncvec, const v4sf *in, v4sf *out, const v4sf *e) {\n  int k, dk = Ncvec / SIMD_SZ; /* number of 4x4 matrix blocks */\n  v4sf r0, i0, r1, i1, r2, i2, r3, i3;\n  v4sf sr0, dr0, sr1, dr1, si0, di0, si1, di1;\n  assert(in != out);\n  for (k = 0; k < dk; ++k) {\n    r0 = in[8 * k + 0];\n    i0 = in[8 * k + 1];\n    r1 = in[8 * k + 2];\n    i1 = in[8 * k + 3];\n    r2 = in[8 * k + 4];\n    i2 = in[8 * k + 5];\n    r3 = in[8 * k + 6];\n    i3 = in[8 * k + 7];\n    VTRANSPOSE4(r0, r1, r2, r3);\n    VTRANSPOSE4(i0, i1, i2, i3);\n    VCPLXMUL(r1, i1, e[k * 6 + 0], e[k * 6 + 1]);\n    VCPLXMUL(r2, i2, e[k * 6 + 2], e[k * 6 + 3]);\n    VCPLXMUL(r3, i3, e[k * 6 + 4], e[k * 6 + 5]);\n\n    sr0 = VADD(r0, r2);\n    dr0 = VSUB(r0, r2);\n    sr1 = VADD(r1, r3);\n    dr1 = VSUB(r1, r3);\n    si0 = VADD(i0, i2);\n    di0 = VSUB(i0, i2);\n    si1 = VADD(i1, i3);\n    di1 = VSUB(i1, i3);\n\n    /*\n      transformation for each column is:\n      \n      [1   1   1   1   0   0   0   0]   [r0]\n      [1   0  -1   0   0  -1   0   1]   [r1]\n      [1  -1   1  -1   0   0   0   0]   [r2]\n      [1   0  -1   0   0   1   0  -1]   [r3]\n      [0   0   0   0   1   1   1   1] * [i0]\n      [0   1   0  -1   1   0  -1   0]   [i1]\n      [0   0   0   0   1  -1   1  -1]   [i2]\n      [0  -1   0   1   1   0  -1   0]   [i3]    \n    */\n\n    r0 = VADD(sr0, sr1);\n    i0 = VADD(si0, si1);\n    r1 = VADD(dr0, di1);\n    i1 = VSUB(di0, dr1);\n    r2 = VSUB(sr0, sr1);\n    i2 = VSUB(si0, si1);\n    r3 = VSUB(dr0, di1);\n    i3 = VADD(di0, dr1);\n\n    *out++ = r0;\n    *out++ = i0;\n    *out++ = r1;\n    *out++ = i1;\n    *out++ = r2;\n    *out++ = i2;\n    *out++ = r3;\n    *out++ = i3;\n  }\n}\n\nvoid FUNC_CPLX_PREPROCESS(int Ncvec, const v4sf *in, v4sf *out, const v4sf *e) {\n  int k, dk = Ncvec / SIMD_SZ; /* number of 4x4 matrix blocks */\n  v4sf r0, i0, r1, i1, r2, i2, r3, i3;\n  v4sf sr0, dr0, sr1, dr1, si0, di0, si1, di1;\n  assert(in != out);\n  for (k = 0; k < dk; ++k) {\n    r0 = in[8 * k + 0];\n    i0 = in[8 * k + 1];\n    r1 = in[8 * k + 2];\n    i1 = in[8 * k + 3];\n    r2 = in[8 * k + 4];\n    i2 = in[8 * k + 5];\n    r3 = in[8 * k + 6];\n    i3 = in[8 * k + 7];\n\n    sr0 = VADD(r0, r2);\n    dr0 = VSUB(r0, r2);\n    sr1 = VADD(r1, r3);\n    dr1 = VSUB(r1, r3);\n    si0 = VADD(i0, i2);\n    di0 = VSUB(i0, i2);\n    si1 = VADD(i1, i3);\n    di1 = VSUB(i1, i3);\n\n    r0 = VADD(sr0, sr1);\n    i0 = VADD(si0, si1);\n    r1 = VSUB(dr0, di1);\n    i1 = VADD(di0, dr1);\n    r2 = VSUB(sr0, sr1);\n    i2 = VSUB(si0, si1);\n    r3 = VADD(dr0, di1);\n    i3 = VSUB(di0, dr1);\n\n    VCPLXMULCONJ(r1, i1, e[k * 6 + 0], e[k * 6 + 1]);\n    VCPLXMULCONJ(r2, i2, e[k * 6 + 2], e[k * 6 + 3]);\n    VCPLXMULCONJ(r3, i3, e[k * 6 + 4], e[k * 6 + 5]);\n\n    VTRANSPOSE4(r0, r1, r2, r3);\n    VTRANSPOSE4(i0, i1, i2, i3);\n\n    *out++ = r0;\n    *out++ = i0;\n    *out++ = r1;\n    *out++ = i1;\n    *out++ = r2;\n    *out++ = i2;\n    *out++ = r3;\n    *out++ = i3;\n  }\n}\n\nstatic ALWAYS_INLINE(void) FUNC_REAL_FINALIZE_4X4(\n    const v4sf *in0,\n    const v4sf *in1,\n    const v4sf *in,\n    const v4sf *e,\n    v4sf *out) {\n  v4sf r0, i0, r1, i1, r2, i2, r3, i3;\n  v4sf sr0, dr0, sr1, dr1, si0, di0, si1, di1;\n  r0 = *in0;\n  i0 = *in1;\n  r1 = *in++;\n  i1 = *in++;\n  r2 = *in++;\n  i2 = *in++;\n  r3 = *in++;\n  i3 = *in++;\n  VTRANSPOSE4(r0, r1, r2, r3);\n  VTRANSPOSE4(i0, i1, i2, i3);\n\n  /*\n    transformation for each column is:\n\n    [1   1   1   1   0   0   0   0]   [r0]\n    [1   0  -1   0   0  -1   0   1]   [r1]\n    [1   0  -1   0   0   1   0  -1]   [r2]\n    [1  -1   1  -1   0   0   0   0]   [r3]\n    [0   0   0   0   1   1   1   1] * [i0]\n    [0  -1   0   1  -1   0   1   0]   [i1]\n    [0  -1   0   1   1   0  -1   0]   [i2]\n    [0   0   0   0  -1   1  -1   1]   [i3]    \n  */\n\n  /* cerr << \"matrix initial, before e , REAL:\\n 1: \" << r0 << \"\\n 1: \" << r1 << \"\\n 1: \" << r2 << \"\\n 1: \" << r3 << \"\\n\"; */\n  /* cerr << \"matrix initial, before e, IMAG :\\n 1: \" << i0 << \"\\n 1: \" << i1 << \"\\n 1: \" << i2 << \"\\n 1: \" << i3 << \"\\n\"; */\n\n  VCPLXMUL(r1, i1, e[0], e[1]);\n  VCPLXMUL(r2, i2, e[2], e[3]);\n  VCPLXMUL(r3, i3, e[4], e[5]);\n\n  /* cerr << \"matrix initial, real part:\\n 1: \" << r0 << \"\\n 1: \" << r1 << \"\\n 1: \" << r2 << \"\\n 1: \" << r3 << \"\\n\"; */\n  /* cerr << \"matrix initial, imag part:\\n 1: \" << i0 << \"\\n 1: \" << i1 << \"\\n 1: \" << i2 << \"\\n 1: \" << i3 << \"\\n\"; */\n\n  sr0 = VADD(r0, r2);\n  dr0 = VSUB(r0, r2);\n  sr1 = VADD(r1, r3);\n  dr1 = VSUB(r3, r1);\n  si0 = VADD(i0, i2);\n  di0 = VSUB(i0, i2);\n  si1 = VADD(i1, i3);\n  di1 = VSUB(i3, i1);\n\n  r0 = VADD(sr0, sr1);\n  r3 = VSUB(sr0, sr1);\n  i0 = VADD(si0, si1);\n  i3 = VSUB(si1, si0);\n  r1 = VADD(dr0, di1);\n  r2 = VSUB(dr0, di1);\n  i1 = VSUB(dr1, di0);\n  i2 = VADD(dr1, di0);\n\n  *out++ = r0;\n  *out++ = i0;\n  *out++ = r1;\n  *out++ = i1;\n  *out++ = r2;\n  *out++ = i2;\n  *out++ = r3;\n  *out++ = i3;\n}\n\nstatic NEVER_INLINE(void) FUNC_REAL_FINALIZE(int Ncvec, const v4sf *in, v4sf *out, const v4sf *e) {\n  int k, dk = Ncvec / SIMD_SZ; /* number of 4x4 matrix blocks */\n  /* fftpack order is f0r f1r f1i f2r f2i ... f(n-1)r f(n-1)i f(n)r */\n\n  v4sf_union cr, ci, *uout = (v4sf_union *)out;\n  v4sf save = in[7], zero = VZERO();\n  float xr0, xi0, xr1, xi1, xr2, xi2, xr3, xi3;\n  static const float s = (float)M_SQRT2 / 2;\n\n  cr.v = in[0];\n  ci.v = in[Ncvec * 2 - 1];\n  assert(in != out);\n  FUNC_REAL_FINALIZE_4X4(&zero, &zero, in + 1, e, out);\n\n  /*\n    [cr0 cr1 cr2 cr3 ci0 ci1 ci2 ci3]\n\n    [Xr(1)]  ] [1   1   1   1   0   0   0   0]\n    [Xr(N/4) ] [0   0   0   0   1   s   0  -s]\n    [Xr(N/2) ] [1   0  -1   0   0   0   0   0]\n    [Xr(3N/4)] [0   0   0   0   1  -s   0   s]\n    [Xi(1)   ] [1  -1   1  -1   0   0   0   0]\n    [Xi(N/4) ] [0   0   0   0   0  -s  -1  -s]\n    [Xi(N/2) ] [0  -1   0   1   0   0   0   0]\n    [Xi(3N/4)] [0   0   0   0   0  -s   1  -s]\n  */\n\n  xr0 = (cr.f[0] + cr.f[2]) + (cr.f[1] + cr.f[3]);\n  uout[0].f[0] = xr0;\n  xi0 = (cr.f[0] + cr.f[2]) - (cr.f[1] + cr.f[3]);\n  uout[1].f[0] = xi0;\n  xr2 = (cr.f[0] - cr.f[2]);\n  uout[4].f[0] = xr2;\n  xi2 = (cr.f[3] - cr.f[1]);\n  uout[5].f[0] = xi2;\n  xr1 = ci.f[0] + s * (ci.f[1] - ci.f[3]);\n  uout[2].f[0] = xr1;\n  xi1 = -ci.f[2] - s * (ci.f[1] + ci.f[3]);\n  uout[3].f[0] = xi1;\n  xr3 = ci.f[0] - s * (ci.f[1] - ci.f[3]);\n  uout[6].f[0] = xr3;\n  xi3 = ci.f[2] - s * (ci.f[1] + ci.f[3]);\n  uout[7].f[0] = xi3;\n\n  for (k = 1; k < dk; ++k) {\n    v4sf save_next = in[8 * k + 7];\n    FUNC_REAL_FINALIZE_4X4(&save, &in[8 * k + 0], in + 8 * k + 1, e + k * 6, out + k * 8);\n    save = save_next;\n  }\n}\n\nstatic ALWAYS_INLINE(void)\n    FUNC_REAL_PREPROCESS_4X4(const v4sf *in, const v4sf *e, v4sf *out, int first) {\n  v4sf r0 = in[0], i0 = in[1], r1 = in[2], i1 = in[3], r2 = in[4], i2 = in[5], r3 = in[6],\n       i3 = in[7];\n  /*\n    transformation for each column is:\n\n    [1   1   1   1   0   0   0   0]   [r0]\n    [1   0   0  -1   0  -1  -1   0]   [r1]\n    [1  -1  -1   1   0   0   0   0]   [r2]\n    [1   0   0  -1   0   1   1   0]   [r3]\n    [0   0   0   0   1  -1   1  -1] * [i0]\n    [0  -1   1   0   1   0   0   1]   [i1]\n    [0   0   0   0   1   1  -1  -1]   [i2]\n    [0   1  -1   0   1   0   0   1]   [i3]    \n  */\n\n  v4sf sr0 = VADD(r0, r3), dr0 = VSUB(r0, r3);\n  v4sf sr1 = VADD(r1, r2), dr1 = VSUB(r1, r2);\n  v4sf si0 = VADD(i0, i3), di0 = VSUB(i0, i3);\n  v4sf si1 = VADD(i1, i2), di1 = VSUB(i1, i2);\n\n  r0 = VADD(sr0, sr1);\n  r2 = VSUB(sr0, sr1);\n  r1 = VSUB(dr0, si1);\n  r3 = VADD(dr0, si1);\n  i0 = VSUB(di0, di1);\n  i2 = VADD(di0, di1);\n  i1 = VSUB(si0, dr1);\n  i3 = VADD(si0, dr1);\n\n  VCPLXMULCONJ(r1, i1, e[0], e[1]);\n  VCPLXMULCONJ(r2, i2, e[2], e[3]);\n  VCPLXMULCONJ(r3, i3, e[4], e[5]);\n\n  VTRANSPOSE4(r0, r1, r2, r3);\n  VTRANSPOSE4(i0, i1, i2, i3);\n\n  if (!first) {\n    *out++ = r0;\n    *out++ = i0;\n  }\n  *out++ = r1;\n  *out++ = i1;\n  *out++ = r2;\n  *out++ = i2;\n  *out++ = r3;\n  *out++ = i3;\n}\n\nstatic NEVER_INLINE(void)\n    FUNC_REAL_PREPROCESS(int Ncvec, const v4sf *in, v4sf *out, const v4sf *e) {\n  int k, dk = Ncvec / SIMD_SZ; /* number of 4x4 matrix blocks */\n  /* fftpack order is f0r f1r f1i f2r f2i ... f(n-1)r f(n-1)i f(n)r */\n\n  v4sf_union Xr, Xi, *uout = (v4sf_union *)out;\n  float cr0, ci0, cr1, ci1, cr2, ci2, cr3, ci3;\n  static const float s = (float)M_SQRT2;\n  assert(in != out);\n  for (k = 0; k < 4; ++k) {\n    Xr.f[k] = ((float *)in)[8 * k];\n    Xi.f[k] = ((float *)in)[8 * k + 4];\n  }\n\n  FUNC_REAL_PREPROCESS_4X4(in, e, out + 1, 1); /* will write only 6 values */\n\n  /*\n    [Xr0 Xr1 Xr2 Xr3 Xi0 Xi1 Xi2 Xi3]\n\n    [cr0] [1   0   2   0   1   0   0   0]\n    [cr1] [1   0   0   0  -1   0  -2   0]\n    [cr2] [1   0  -2   0   1   0   0   0]\n    [cr3] [1   0   0   0  -1   0   2   0]\n    [ci0] [0   2   0   2   0   0   0   0]\n    [ci1] [0   s   0  -s   0  -s   0  -s]\n    [ci2] [0   0   0   0   0  -2   0   2]\n    [ci3] [0  -s   0   s   0  -s   0  -s]\n  */\n  for (k = 1; k < dk; ++k) {\n    FUNC_REAL_PREPROCESS_4X4(in + 8 * k, e + k * 6, out - 1 + k * 8, 0);\n  }\n\n  cr0 = (Xr.f[0] + Xi.f[0]) + 2 * Xr.f[2];\n  uout[0].f[0] = cr0;\n  cr1 = (Xr.f[0] - Xi.f[0]) - 2 * Xi.f[2];\n  uout[0].f[1] = cr1;\n  cr2 = (Xr.f[0] + Xi.f[0]) - 2 * Xr.f[2];\n  uout[0].f[2] = cr2;\n  cr3 = (Xr.f[0] - Xi.f[0]) + 2 * Xi.f[2];\n  uout[0].f[3] = cr3;\n  ci0 = 2 * (Xr.f[1] + Xr.f[3]);\n  uout[2 * Ncvec - 1].f[0] = ci0;\n  ci1 = s * (Xr.f[1] - Xr.f[3]) - s * (Xi.f[1] + Xi.f[3]);\n  uout[2 * Ncvec - 1].f[1] = ci1;\n  ci2 = 2 * (Xi.f[3] - Xi.f[1]);\n  uout[2 * Ncvec - 1].f[2] = ci2;\n  ci3 = -s * (Xr.f[1] - Xr.f[3]) - s * (Xi.f[1] + Xi.f[3]);\n  uout[2 * Ncvec - 1].f[3] = ci3;\n}\n\nvoid FUNC_TRANSFORM_INTERNAL(\n    SETUP_STRUCT *setup,\n    const float *finput,\n    float *foutput,\n    v4sf *scratch,\n    pffft_direction_t direction,\n    int ordered) {\n  int k, Ncvec = setup->Ncvec;\n  int nf_odd = (setup->ifac[1] & 1);\n\n  /* temporary buffer is allocated on the stack if the scratch pointer is NULL */\n  int stack_allocate = (scratch == 0 ? Ncvec * 2 : 1);\n  VLA_ARRAY_ON_STACK(v4sf, scratch_on_stack, stack_allocate);\n\n  const v4sf *vinput = (const v4sf *)finput;\n  v4sf *voutput = (v4sf *)foutput;\n  v4sf *buff[2] = {voutput, scratch ? scratch : scratch_on_stack};\n  int ib = (nf_odd ^ ordered ? 1 : 0);\n\n  assert(VALIGNED(finput) && VALIGNED(foutput));\n\n  /* assert(finput != foutput); */\n  if (direction == PFFFT_FORWARD) {\n    ib = !ib;\n    if (setup->transform == PFFFT_REAL) {\n      ib =\n          (rfftf1_ps(Ncvec * 2, vinput, buff[ib], buff[!ib], setup->twiddle, &setup->ifac[0]) ==\n                   buff[0]\n               ? 0\n               : 1);\n      FUNC_REAL_FINALIZE(Ncvec, buff[ib], buff[!ib], (v4sf *)setup->e);\n    } else {\n      v4sf *tmp = buff[ib];\n      for (k = 0; k < Ncvec; ++k) {\n        UNINTERLEAVE2(vinput[k * 2], vinput[k * 2 + 1], tmp[k * 2], tmp[k * 2 + 1]);\n      }\n      ib =\n          (cfftf1_ps(Ncvec, buff[ib], buff[!ib], buff[ib], setup->twiddle, &setup->ifac[0], -1) ==\n                   buff[0]\n               ? 0\n               : 1);\n      FUNC_CPLX_FINALIZE(Ncvec, buff[ib], buff[!ib], (v4sf *)setup->e);\n    }\n    if (ordered) {\n      FUNC_ZREORDER(setup, (float *)buff[!ib], (float *)buff[ib], PFFFT_FORWARD);\n    } else\n      ib = !ib;\n  } else {\n    if (vinput == buff[ib]) {\n      ib = !ib; /* may happen when finput == foutput */\n    }\n    if (ordered) {\n      FUNC_ZREORDER(setup, (float *)vinput, (float *)buff[ib], PFFFT_BACKWARD);\n      vinput = buff[ib];\n      ib = !ib;\n    }\n    if (setup->transform == PFFFT_REAL) {\n      FUNC_REAL_PREPROCESS(Ncvec, vinput, buff[ib], (v4sf *)setup->e);\n      ib =\n          (rfftb1_ps(Ncvec * 2, buff[ib], buff[0], buff[1], setup->twiddle, &setup->ifac[0]) ==\n                   buff[0]\n               ? 0\n               : 1);\n    } else {\n      FUNC_CPLX_PREPROCESS(Ncvec, vinput, buff[ib], (v4sf *)setup->e);\n      ib =\n          (cfftf1_ps(Ncvec, buff[ib], buff[0], buff[1], setup->twiddle, &setup->ifac[0], +1) ==\n                   buff[0]\n               ? 0\n               : 1);\n      for (k = 0; k < Ncvec; ++k) {\n        INTERLEAVE2(buff[ib][k * 2], buff[ib][k * 2 + 1], buff[ib][k * 2], buff[ib][k * 2 + 1]);\n      }\n    }\n  }\n\n  if (buff[ib] != voutput) {\n    /* extra copy required -- this situation should only happen when finput == foutput */\n    assert(finput == foutput);\n    for (k = 0; k < Ncvec; ++k) {\n      v4sf a = buff[ib][2 * k], b = buff[ib][2 * k + 1];\n      voutput[2 * k] = a;\n      voutput[2 * k + 1] = b;\n    }\n    ib = !ib;\n  }\n  assert(buff[ib] == voutput);\n}\n\nvoid FUNC_ZCONVOLVE_ACCUMULATE(\n    SETUP_STRUCT *s,\n    const float *a,\n    const float *b,\n    float *ab,\n    float scaling) {\n  int Ncvec = s->Ncvec;\n  const v4sf *RESTRICT va = (const v4sf *)a;\n  const v4sf *RESTRICT vb = (const v4sf *)b;\n  v4sf *RESTRICT vab = (v4sf *)ab;\n\n#ifdef __arm__\n  __builtin_prefetch(va);\n  __builtin_prefetch(vb);\n  __builtin_prefetch(vab);\n  __builtin_prefetch(va + 2);\n  __builtin_prefetch(vb + 2);\n  __builtin_prefetch(vab + 2);\n  __builtin_prefetch(va + 4);\n  __builtin_prefetch(vb + 4);\n  __builtin_prefetch(vab + 4);\n  __builtin_prefetch(va + 6);\n  __builtin_prefetch(vb + 6);\n  __builtin_prefetch(vab + 6);\n#ifndef __clang__\n#define ZCONVOLVE_USING_INLINE_NEON_ASM\n#endif\n#endif\n\n  float ar, ai, br, bi, abr, abi;\n#ifndef ZCONVOLVE_USING_INLINE_ASM\n  v4sf vscal = LD_PS1(scaling);\n  int i;\n#endif\n\n  assert(VALIGNED(a) && VALIGNED(b) && VALIGNED(ab));\n  ar = ((v4sf_union *)va)[0].f[0];\n  ai = ((v4sf_union *)va)[1].f[0];\n  br = ((v4sf_union *)vb)[0].f[0];\n  bi = ((v4sf_union *)vb)[1].f[0];\n  abr = ((v4sf_union *)vab)[0].f[0];\n  abi = ((v4sf_union *)vab)[1].f[0];\n\n#ifdef ZCONVOLVE_USING_INLINE_ASM\n  /* inline asm version, unfortunately miscompiled by clang 3.2,\n   * at least on ubuntu.. so this will be restricted to gcc */\n  const float *a_ = a, *b_ = b;\n  float *ab_ = ab;\n  int N = Ncvec;\n  asm volatile(\n      \"mov         r8, %2                  \\n\"\n      \"vdup.f32    q15, %4                 \\n\"\n      \"1:                                  \\n\"\n      \"pld         [%0,#64]                \\n\"\n      \"pld         [%1,#64]                \\n\"\n      \"pld         [%2,#64]                \\n\"\n      \"pld         [%0,#96]                \\n\"\n      \"pld         [%1,#96]                \\n\"\n      \"pld         [%2,#96]                \\n\"\n      \"vld1.f32    {q0,q1},   [%0,:128]!         \\n\"\n      \"vld1.f32    {q4,q5},   [%1,:128]!         \\n\"\n      \"vld1.f32    {q2,q3},   [%0,:128]!         \\n\"\n      \"vld1.f32    {q6,q7},   [%1,:128]!         \\n\"\n      \"vld1.f32    {q8,q9},   [r8,:128]!          \\n\"\n\n      \"vmul.f32    q10, q0, q4             \\n\"\n      \"vmul.f32    q11, q0, q5             \\n\"\n      \"vmul.f32    q12, q2, q6             \\n\"\n      \"vmul.f32    q13, q2, q7             \\n\"\n      \"vmls.f32    q10, q1, q5             \\n\"\n      \"vmla.f32    q11, q1, q4             \\n\"\n      \"vld1.f32    {q0,q1}, [r8,:128]!     \\n\"\n      \"vmls.f32    q12, q3, q7             \\n\"\n      \"vmla.f32    q13, q3, q6             \\n\"\n      \"vmla.f32    q8, q10, q15            \\n\"\n      \"vmla.f32    q9, q11, q15            \\n\"\n      \"vmla.f32    q0, q12, q15            \\n\"\n      \"vmla.f32    q1, q13, q15            \\n\"\n      \"vst1.f32    {q8,q9},[%2,:128]!    \\n\"\n      \"vst1.f32    {q0,q1},[%2,:128]!    \\n\"\n      \"subs        %3, #2                  \\n\"\n      \"bne         1b                      \\n\"\n      : \"+r\"(a_), \"+r\"(b_), \"+r\"(ab_), \"+r\"(N)\n      : \"r\"(scaling)\n      : \"r8\",\n        \"q0\",\n        \"q1\",\n        \"q2\",\n        \"q3\",\n        \"q4\",\n        \"q5\",\n        \"q6\",\n        \"q7\",\n        \"q8\",\n        \"q9\",\n        \"q10\",\n        \"q11\",\n        \"q12\",\n        \"q13\",\n        \"q15\",\n        \"memory\");\n#else\n  /* default routine, works fine for non-arm cpus with current compilers */\n  for (i = 0; i < Ncvec; i += 2) {\n    v4sf ar, ai, br, bi;\n    ar = va[2 * i + 0];\n    ai = va[2 * i + 1];\n    br = vb[2 * i + 0];\n    bi = vb[2 * i + 1];\n    VCPLXMUL(ar, ai, br, bi);\n    vab[2 * i + 0] = VMADD(ar, vscal, vab[2 * i + 0]);\n    vab[2 * i + 1] = VMADD(ai, vscal, vab[2 * i + 1]);\n    ar = va[2 * i + 2];\n    ai = va[2 * i + 3];\n    br = vb[2 * i + 2];\n    bi = vb[2 * i + 3];\n    VCPLXMUL(ar, ai, br, bi);\n    vab[2 * i + 2] = VMADD(ar, vscal, vab[2 * i + 2]);\n    vab[2 * i + 3] = VMADD(ai, vscal, vab[2 * i + 3]);\n  }\n#endif\n  if (s->transform == PFFFT_REAL) {\n    ((v4sf_union *)vab)[0].f[0] = abr + ar * br * scaling;\n    ((v4sf_union *)vab)[1].f[0] = abi + ai * bi * scaling;\n  }\n}\n\nvoid FUNC_ZCONVOLVE_NO_ACCU(\n    SETUP_STRUCT *s,\n    const float *a,\n    const float *b,\n    float *ab,\n    float scaling) {\n  v4sf vscal = LD_PS1(scaling);\n  const v4sf *RESTRICT va = (const v4sf *)a;\n  const v4sf *RESTRICT vb = (const v4sf *)b;\n  v4sf *RESTRICT vab = (v4sf *)ab;\n  float sar, sai, sbr, sbi;\n  const int NcvecMulTwo = 2 * s->Ncvec; /* int Ncvec = s->Ncvec; */\n  int k;                                /* was i -- but always used \"2*i\" - except at for() */\n\n#ifdef __arm__\n  __builtin_prefetch(va);\n  __builtin_prefetch(vb);\n  __builtin_prefetch(vab);\n  __builtin_prefetch(va + 2);\n  __builtin_prefetch(vb + 2);\n  __builtin_prefetch(vab + 2);\n  __builtin_prefetch(va + 4);\n  __builtin_prefetch(vb + 4);\n  __builtin_prefetch(vab + 4);\n  __builtin_prefetch(va + 6);\n  __builtin_prefetch(vb + 6);\n  __builtin_prefetch(vab + 6);\n#ifndef __clang__\n#define ZCONVOLVE_USING_INLINE_NEON_ASM\n#endif\n#endif\n\n  assert(VALIGNED(a) && VALIGNED(b) && VALIGNED(ab));\n  sar = ((v4sf_union *)va)[0].f[0];\n  sai = ((v4sf_union *)va)[1].f[0];\n  sbr = ((v4sf_union *)vb)[0].f[0];\n  sbi = ((v4sf_union *)vb)[1].f[0];\n\n  /* default routine, works fine for non-arm cpus with current compilers */\n  for (k = 0; k < NcvecMulTwo; k += 4) {\n    v4sf var, vai, vbr, vbi;\n    var = va[k + 0];\n    vai = va[k + 1];\n    vbr = vb[k + 0];\n    vbi = vb[k + 1];\n    VCPLXMUL(var, vai, vbr, vbi);\n    vab[k + 0] = VMUL(var, vscal);\n    vab[k + 1] = VMUL(vai, vscal);\n    var = va[k + 2];\n    vai = va[k + 3];\n    vbr = vb[k + 2];\n    vbi = vb[k + 3];\n    VCPLXMUL(var, vai, vbr, vbi);\n    vab[k + 2] = VMUL(var, vscal);\n    vab[k + 3] = VMUL(vai, vscal);\n  }\n\n  if (s->transform == PFFFT_REAL) {\n    ((v4sf_union *)vab)[0].f[0] = sar * sbr * scaling;\n    ((v4sf_union *)vab)[1].f[0] = sai * sbi * scaling;\n  }\n}\n\n#else /* #if ( SIMD_SZ == 4 )   * !defined(PFFFT_SIMD_DISABLE) */\n\n/* standard routine using scalar floats, without SIMD stuff. */\n\n#define pffft_zreorder_nosimd FUNC_ZREORDER\nvoid pffft_zreorder_nosimd(\n    SETUP_STRUCT *setup,\n    const float *in,\n    float *out,\n    pffft_direction_t direction) {\n  int k, N = setup->N;\n  if (setup->transform == PFFFT_COMPLEX) {\n    for (k = 0; k < 2 * N; ++k)\n      out[k] = in[k];\n    return;\n  } else if (direction == PFFFT_FORWARD) {\n    float x_N = in[N - 1];\n    for (k = N - 1; k > 1; --k)\n      out[k] = in[k - 1];\n    out[0] = in[0];\n    out[1] = x_N;\n  } else {\n    float x_N = in[1];\n    for (k = 1; k < N - 1; ++k)\n      out[k] = in[k + 1];\n    out[0] = in[0];\n    out[N - 1] = x_N;\n  }\n}\n\n#define pffft_transform_internal_nosimd FUNC_TRANSFORM_INTERNAL\nvoid pffft_transform_internal_nosimd(\n    SETUP_STRUCT *setup,\n    const float *input,\n    float *output,\n    float *scratch,\n    pffft_direction_t direction,\n    int ordered) {\n  int Ncvec = setup->Ncvec;\n  int nf_odd = (setup->ifac[1] & 1);\n\n  /* temporary buffer is allocated on the stack if the scratch pointer is NULL */\n  int stack_allocate = (scratch == 0 ? Ncvec * 2 : 1);\n  VLA_ARRAY_ON_STACK(v4sf, scratch_on_stack, stack_allocate);\n  float *buff[2];\n  int ib;\n  if (scratch == 0)\n    scratch = scratch_on_stack;\n  buff[0] = output;\n  buff[1] = scratch;\n\n  if (setup->transform == PFFFT_COMPLEX)\n    ordered = 0; /* it is always ordered. */\n  ib = (nf_odd ^ ordered ? 1 : 0);\n\n  if (direction == PFFFT_FORWARD) {\n    if (setup->transform == PFFFT_REAL) {\n      ib =\n          (rfftf1_ps(Ncvec * 2, input, buff[ib], buff[!ib], setup->twiddle, &setup->ifac[0]) ==\n                   buff[0]\n               ? 0\n               : 1);\n    } else {\n      ib =\n          (cfftf1_ps(Ncvec, input, buff[ib], buff[!ib], setup->twiddle, &setup->ifac[0], -1) ==\n                   buff[0]\n               ? 0\n               : 1);\n    }\n    if (ordered) {\n      FUNC_ZREORDER(setup, buff[ib], buff[!ib], PFFFT_FORWARD);\n      ib = !ib;\n    }\n  } else {\n    if (input == buff[ib]) {\n      ib = !ib; /* may happen when finput == foutput */\n    }\n    if (ordered) {\n      FUNC_ZREORDER(setup, input, buff[!ib], PFFFT_BACKWARD);\n      input = buff[!ib];\n    }\n    if (setup->transform == PFFFT_REAL) {\n      ib =\n          (rfftb1_ps(Ncvec * 2, input, buff[ib], buff[!ib], setup->twiddle, &setup->ifac[0]) ==\n                   buff[0]\n               ? 0\n               : 1);\n    } else {\n      ib =\n          (cfftf1_ps(Ncvec, input, buff[ib], buff[!ib], setup->twiddle, &setup->ifac[0], +1) ==\n                   buff[0]\n               ? 0\n               : 1);\n    }\n  }\n  if (buff[ib] != output) {\n    int k;\n    /* extra copy required -- this situation should happens only when finput == foutput */\n    assert(input == output);\n    for (k = 0; k < Ncvec; ++k) {\n      float a = buff[ib][2 * k], b = buff[ib][2 * k + 1];\n      output[2 * k] = a;\n      output[2 * k + 1] = b;\n    }\n    ib = !ib;\n  }\n  assert(buff[ib] == output);\n}\n\n#define pffft_zconvolve_accumulate_nosimd FUNC_ZCONVOLVE_ACCUMULATE\nvoid pffft_zconvolve_accumulate_nosimd(\n    SETUP_STRUCT *s,\n    const float *a,\n    const float *b,\n    float *ab,\n    float scaling) {\n  int NcvecMulTwo = 2 * s->Ncvec; /* int Ncvec = s->Ncvec; */\n  int k;                          /* was i -- but always used \"2*i\" - except at for() */\n\n  if (s->transform == PFFFT_REAL) {\n    /* take care of the fftpack ordering */\n    ab[0] += a[0] * b[0] * scaling;\n    ab[NcvecMulTwo - 1] += a[NcvecMulTwo - 1] * b[NcvecMulTwo - 1] * scaling;\n    ++ab;\n    ++a;\n    ++b;\n    NcvecMulTwo -= 2;\n  }\n  for (k = 0; k < NcvecMulTwo; k += 2) {\n    float ar, ai, br, bi;\n    ar = a[k + 0];\n    ai = a[k + 1];\n    br = b[k + 0];\n    bi = b[k + 1];\n    VCPLXMUL(ar, ai, br, bi);\n    ab[k + 0] += ar * scaling;\n    ab[k + 1] += ai * scaling;\n  }\n}\n\n#define pffft_zconvolve_no_accu_nosimd FUNC_ZCONVOLVE_NO_ACCU\nvoid pffft_zconvolve_no_accu_nosimd(\n    SETUP_STRUCT *s,\n    const float *a,\n    const float *b,\n    float *ab,\n    float scaling) {\n  int NcvecMulTwo = 2 * s->Ncvec; /* int Ncvec = s->Ncvec; */\n  int k;                          /* was i -- but always used \"2*i\" - except at for() */\n\n  if (s->transform == PFFFT_REAL) {\n    /* take care of the fftpack ordering */\n    ab[0] += a[0] * b[0] * scaling;\n    ab[NcvecMulTwo - 1] += a[NcvecMulTwo - 1] * b[NcvecMulTwo - 1] * scaling;\n    ++ab;\n    ++a;\n    ++b;\n    NcvecMulTwo -= 2;\n  }\n  for (k = 0; k < NcvecMulTwo; k += 2) {\n    float ar, ai, br, bi;\n    ar = a[k + 0];\n    ai = a[k + 1];\n    br = b[k + 0];\n    bi = b[k + 1];\n    VCPLXMUL(ar, ai, br, bi);\n    ab[k + 0] = ar * scaling;\n    ab[k + 1] = ai * scaling;\n  }\n}\n\n#endif /* #if ( SIMD_SZ == 4 )    * !defined(PFFFT_SIMD_DISABLE) */\n\nvoid FUNC_TRANSFORM_UNORDRD(\n    SETUP_STRUCT *setup,\n    const float *input,\n    float *output,\n    float *work,\n    pffft_direction_t direction) {\n  FUNC_TRANSFORM_INTERNAL(setup, input, output, (v4sf *)work, direction, 0);\n}\n\nvoid FUNC_TRANSFORM_ORDERED(\n    SETUP_STRUCT *setup,\n    const float *input,\n    float *output,\n    float *work,\n    pffft_direction_t direction) {\n  FUNC_TRANSFORM_INTERNAL(setup, input, output, (v4sf *)work, direction, 1);\n}\n\n#if (SIMD_SZ == 4)\n\n#define assertv4(v, f0, f1, f2, f3) \\\n  assert(v.f[0] == (f0) && v.f[1] == (f1) && v.f[2] == (f2) && v.f[3] == (f3))\n\n/* detect bugs with the vector support macros */\nvoid FUNC_VALIDATE_SIMD_A(void) {\n  float f[16] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};\n  v4sf_union a0, a1, a2, a3, t, u;\n  memcpy(a0.f, f, 4 * sizeof(float));\n  memcpy(a1.f, f + 4, 4 * sizeof(float));\n  memcpy(a2.f, f + 8, 4 * sizeof(float));\n  memcpy(a3.f, f + 12, 4 * sizeof(float));\n\n  t = a0;\n  u = a1;\n  t.v = VZERO();\n  printf(\"VZERO=[%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3]);\n  assertv4(t, 0, 0, 0, 0);\n  t.v = VADD(a1.v, a2.v);\n  printf(\"VADD(4:7,8:11)=[%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3]);\n  assertv4(t, 12, 14, 16, 18);\n  t.v = VMUL(a1.v, a2.v);\n  printf(\"VMUL(4:7,8:11)=[%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3]);\n  assertv4(t, 32, 45, 60, 77);\n  t.v = VMADD(a1.v, a2.v, a0.v);\n  printf(\"VMADD(4:7,8:11,0:3)=[%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3]);\n  assertv4(t, 32, 46, 62, 80);\n\n  INTERLEAVE2(a1.v, a2.v, t.v, u.v);\n  printf(\n      \"INTERLEAVE2(4:7,8:11)=[%2g %2g %2g %2g] [%2g %2g %2g %2g]\\n\",\n      t.f[0],\n      t.f[1],\n      t.f[2],\n      t.f[3],\n      u.f[0],\n      u.f[1],\n      u.f[2],\n      u.f[3]);\n  assertv4(t, 4, 8, 5, 9);\n  assertv4(u, 6, 10, 7, 11);\n  UNINTERLEAVE2(a1.v, a2.v, t.v, u.v);\n  printf(\n      \"UNINTERLEAVE2(4:7,8:11)=[%2g %2g %2g %2g] [%2g %2g %2g %2g]\\n\",\n      t.f[0],\n      t.f[1],\n      t.f[2],\n      t.f[3],\n      u.f[0],\n      u.f[1],\n      u.f[2],\n      u.f[3]);\n  assertv4(t, 4, 6, 8, 10);\n  assertv4(u, 5, 7, 9, 11);\n\n  t.v = LD_PS1(f[15]);\n  printf(\"LD_PS1(15)=[%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3]);\n  assertv4(t, 15, 15, 15, 15);\n  t.v = VSWAPHL(a1.v, a2.v);\n  printf(\"VSWAPHL(4:7,8:11)=[%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3]);\n  assertv4(t, 8, 9, 6, 7);\n  VTRANSPOSE4(a0.v, a1.v, a2.v, a3.v);\n  printf(\n      \"VTRANSPOSE4(0:3,4:7,8:11,12:15)=[%2g %2g %2g %2g] [%2g %2g %2g %2g] [%2g %2g %2g %2g] [%2g %2g %2g %2g]\\n\",\n      a0.f[0],\n      a0.f[1],\n      a0.f[2],\n      a0.f[3],\n      a1.f[0],\n      a1.f[1],\n      a1.f[2],\n      a1.f[3],\n      a2.f[0],\n      a2.f[1],\n      a2.f[2],\n      a2.f[3],\n      a3.f[0],\n      a3.f[1],\n      a3.f[2],\n      a3.f[3]);\n  assertv4(a0, 0, 4, 8, 12);\n  assertv4(a1, 1, 5, 9, 13);\n  assertv4(a2, 2, 6, 10, 14);\n  assertv4(a3, 3, 7, 11, 15);\n}\n\nstatic void pffft_assert1(\n    float result,\n    float ref,\n    const char *vartxt,\n    const char *functxt,\n    int *numErrs,\n    const char *f,\n    int lineNo) {\n  if (!(fabs(result - ref) < 0.01F)) {\n    fprintf(\n        stderr,\n        \"%s: assert for %s at %s(%d)\\n  expected %f  value %f\\n\",\n        functxt,\n        vartxt,\n        f,\n        lineNo,\n        ref,\n        result);\n    ++(*numErrs);\n  }\n}\n\nstatic void pffft_assert4(\n    vsfscalar v0,\n    vsfscalar v1,\n    vsfscalar v2,\n    vsfscalar v3,\n    float a,\n    float b,\n    float c,\n    float d,\n    const char *functxt,\n    int *numErrs,\n    const char *f,\n    int lineNo) {\n  pffft_assert1(v0, a, \"[0]\", functxt, numErrs, f, lineNo);\n  pffft_assert1(v1, b, \"[1]\", functxt, numErrs, f, lineNo);\n  pffft_assert1(v2, c, \"[2]\", functxt, numErrs, f, lineNo);\n  pffft_assert1(v3, d, \"[3]\", functxt, numErrs, f, lineNo);\n}\n\n#define PFFFT_ASSERT4(V, a, b, c, d, FUNCTXT) \\\n  pffft_assert4( \\\n      (V).f[0], (V).f[1], (V).f[2], (V).f[3], a, b, c, d, FUNCTXT, &numErrs, __FILE__, __LINE__)\n\nint FUNC_VALIDATE_SIMD_EX(FILE *DbgOut) {\n  int numErrs = 0;\n\n  {\n    v4sf_union C;\n    int k;\n    for (k = 0; k < 4; ++k)\n      C.f[k] = 30 + k + 1;\n\n    if (DbgOut) {\n      fprintf(DbgOut, \"\\ninput: { }\\n\");\n    }\n    C.v = VZERO();\n    if (DbgOut) {\n      fprintf(DbgOut, \"VZERO(a) => C) => {\\n\");\n      fprintf(DbgOut, \"  Out C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    PFFFT_ASSERT4(C, 0.0F, 0.0F, 0.0F, 0.0F, \"VZERO() Out C\");\n  }\n\n  {\n    v4sf_union C;\n    float a = 42.0F;\n    int k;\n    for (k = 0; k < 4; ++k)\n      C.f[k] = 30 + k + 1;\n\n    if (DbgOut) {\n      fprintf(DbgOut, \"\\ninput: a = {\\n\");\n      fprintf(DbgOut, \"  Inp a:  %f\\n\", a);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    C.v = LD_PS1(a);\n    if (DbgOut) {\n      fprintf(DbgOut, \"LD_PS1(a) => C) => {\\n\");\n      fprintf(DbgOut, \"  Out C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    PFFFT_ASSERT4(C, 42.0F, 42.0F, 42.0F, 42.0F, \"LD_PS1() Out C\");\n  }\n\n  {\n    v4sf_union C;\n    float a[16];\n    int numAligned = 0, numUnaligned = 0;\n    int k;\n    const char *pUn;\n    for (k = 0; k < 16; ++k)\n      a[k] = k + 1;\n\n    for (k = 0; k + 3 < 16; ++k) {\n      const float *ptr = &a[k];\n      if (DbgOut)\n        fprintf(DbgOut, \"\\ninput: a = [ %f, %f, %f, %f ]\\n\", ptr[0], ptr[1], ptr[2], ptr[3]);\n      if (VALIGNED(ptr)) {\n        C.v = VLOAD_ALIGNED(ptr);\n        pUn = \"\";\n        ++numAligned;\n      } else {\n        C.v = VLOAD_UNALIGNED(ptr);\n        pUn = \"UN\";\n        ++numUnaligned;\n      }\n      if (DbgOut) {\n        fprintf(DbgOut, \"C = VLOAD_%sALIGNED(&a[%d]) => {\\n\", pUn, k);\n        fprintf(DbgOut, \"  Out C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n        fprintf(DbgOut, \"}\\n\");\n      }\n      //PFFFT_ASSERT4( C, 32.0F, 34.0F, 36.0F, 38.0F, \"VADD(): Out C\" );\n\n      if (numAligned >= 1 && numUnaligned >= 4)\n        break;\n    }\n    if (numAligned < 1) {\n      fprintf(stderr, \"VALIGNED() should have found at least 1 occurence!\");\n      ++numErrs;\n    }\n    if (numUnaligned < 4) {\n      fprintf(stderr, \"!VALIGNED() should have found at least 4 occurences!\");\n      ++numErrs;\n    }\n  }\n\n  {\n    v4sf_union A, B, C;\n    int k;\n    for (k = 0; k < 4; ++k)\n      A.f[k] = 10 + k + 1;\n    for (k = 0; k < 4; ++k)\n      B.f[k] = 20 + k + 1;\n    for (k = 0; k < 4; ++k)\n      C.f[k] = 30 + k + 1;\n\n    if (DbgOut) {\n      fprintf(DbgOut, \"\\ninput: A,B = {\\n\");\n      fprintf(DbgOut, \"  Inp A:  %f, %f, %f, %f\\n\", A.f[0], A.f[1], A.f[2], A.f[3]);\n      fprintf(DbgOut, \"  Inp B:  %f, %f, %f, %f\\n\", B.f[0], B.f[1], B.f[2], B.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    C.v = VADD(A.v, B.v);\n    if (DbgOut) {\n      fprintf(DbgOut, \"C = VADD(A,B) => {\\n\");\n      fprintf(DbgOut, \"  Out C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    PFFFT_ASSERT4(A, 11.0F, 12.0F, 13.0F, 14.0F, \"VADD(): Inp A\");\n    PFFFT_ASSERT4(B, 21.0F, 22.0F, 23.0F, 24.0F, \"VADD(): Inp B\");\n    PFFFT_ASSERT4(C, 32.0F, 34.0F, 36.0F, 38.0F, \"VADD(): Out C\");\n  }\n\n  {\n    v4sf_union A, B, C;\n    int k;\n    for (k = 0; k < 4; ++k)\n      A.f[k] = 20 + 2 * k + 1;\n    for (k = 0; k < 4; ++k)\n      B.f[k] = 10 + k + 1;\n    for (k = 0; k < 4; ++k)\n      C.f[k] = 30 + k + 1;\n\n    if (DbgOut) {\n      fprintf(DbgOut, \"\\ninput: A,B = {\\n\");\n      fprintf(DbgOut, \"  Inp A:  %f, %f, %f, %f\\n\", A.f[0], A.f[1], A.f[2], A.f[3]);\n      fprintf(DbgOut, \"  Inp B:  %f, %f, %f, %f\\n\", B.f[0], B.f[1], B.f[2], B.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    C.v = VSUB(A.v, B.v);\n    if (DbgOut) {\n      fprintf(DbgOut, \"C = VSUB(A,B) => {\\n\");\n      fprintf(DbgOut, \"  Out C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    PFFFT_ASSERT4(A, 21.0F, 23.0F, 25.0F, 27.0F, \"VSUB(): Inp A\");\n    PFFFT_ASSERT4(B, 11.0F, 12.0F, 13.0F, 14.0F, \"VSUB(): Inp B\");\n    PFFFT_ASSERT4(C, 10.0F, 11.0F, 12.0F, 13.0F, \"VSUB(): Out C\");\n  }\n\n  {\n    v4sf_union A, B, C;\n    int k;\n    for (k = 0; k < 4; ++k)\n      A.f[k] = 10 + k + 1;\n    for (k = 0; k < 4; ++k)\n      B.f[k] = k + 1;\n    for (k = 0; k < 4; ++k)\n      C.f[k] = 30 + k + 1;\n\n    if (DbgOut) {\n      fprintf(DbgOut, \"\\ninput: A,B = {\\n\");\n      fprintf(DbgOut, \"  Inp A:  %f, %f, %f, %f\\n\", A.f[0], A.f[1], A.f[2], A.f[3]);\n      fprintf(DbgOut, \"  Inp B:  %f, %f, %f, %f\\n\", B.f[0], B.f[1], B.f[2], B.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    C.v = VMUL(A.v, B.v);\n    if (DbgOut) {\n      fprintf(DbgOut, \"C = VMUL(A,B) => {\\n\");\n      fprintf(DbgOut, \"  Out C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    PFFFT_ASSERT4(A, 11.0F, 12.0F, 13.0F, 14.0F, \"VMUL(): Inp A\");\n    PFFFT_ASSERT4(B, 1.0F, 2.0F, 3.0F, 4.0F, \"VMUL(): Inp B\");\n    PFFFT_ASSERT4(C, 11.0F, 24.0F, 39.0F, 56.0F, \"VMUL(): Out C\");\n  }\n\n  {\n    v4sf_union A, B, C, D;\n    int k;\n    for (k = 0; k < 4; ++k)\n      A.f[k] = 10 + k + 1;\n    for (k = 0; k < 4; ++k)\n      B.f[k] = k + 1;\n    for (k = 0; k < 4; ++k)\n      C.f[k] = 10 + k;\n    for (k = 0; k < 4; ++k)\n      D.f[k] = 40 + k + 1;\n\n    if (DbgOut) {\n      fprintf(DbgOut, \"\\ninput: A,B,C = {\\n\");\n      fprintf(DbgOut, \"  Inp A:  %f, %f, %f, %f\\n\", A.f[0], A.f[1], A.f[2], A.f[3]);\n      fprintf(DbgOut, \"  Inp B:  %f, %f, %f, %f\\n\", B.f[0], B.f[1], B.f[2], B.f[3]);\n      fprintf(DbgOut, \"  Inp C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    D.v = VMADD(A.v, B.v, C.v);\n    if (DbgOut) {\n      fprintf(DbgOut, \"D = VMADD(A,B,C) => {\\n\");\n      fprintf(DbgOut, \"  Out D:  %f, %f, %f, %f\\n\", D.f[0], D.f[1], D.f[2], D.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    PFFFT_ASSERT4(A, 11.0F, 12.0F, 13.0F, 14.0F, \"VMADD(): Inp A\");\n    PFFFT_ASSERT4(B, 1.0F, 2.0F, 3.0F, 4.0F, \"VMADD(): Inp B\");\n    PFFFT_ASSERT4(C, 10.0F, 11.0F, 12.0F, 13.0F, \"VMADD(): Inp C\");\n    PFFFT_ASSERT4(D, 21.0F, 35.0F, 51.0F, 69.0F, \"VMADD(): Out D\");\n  }\n\n  {\n    v4sf_union A, B, C, D;\n    int k;\n    for (k = 0; k < 4; ++k)\n      A.f[k] = 10 + k + 1;\n    for (k = 0; k < 4; ++k)\n      B.f[k] = 20 + k + 1;\n    for (k = 0; k < 4; ++k)\n      C.f[k] = 30 + k + 1;\n    for (k = 0; k < 4; ++k)\n      D.f[k] = 40 + k + 1;\n\n    if (DbgOut) {\n      fprintf(DbgOut, \"\\ninput: A,B = {\\n\");\n      fprintf(DbgOut, \"  Inp A:  %f, %f, %f, %f\\n\", A.f[0], A.f[1], A.f[2], A.f[3]);\n      fprintf(DbgOut, \"  Inp B:  %f, %f, %f, %f\\n\", B.f[0], B.f[1], B.f[2], B.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    INTERLEAVE2(A.v, B.v, C.v, D.v);\n    if (DbgOut) {\n      fprintf(DbgOut, \"INTERLEAVE2(A,B, => C,D) => {\\n\");\n      fprintf(DbgOut, \"  Out C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n      fprintf(DbgOut, \"  Out D:  %f, %f, %f, %f\\n\", D.f[0], D.f[1], D.f[2], D.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    PFFFT_ASSERT4(A, 11.0F, 12.0F, 13.0F, 14.0F, \"INTERLEAVE2() Inp A\");\n    PFFFT_ASSERT4(B, 21.0F, 22.0F, 23.0F, 24.0F, \"INTERLEAVE2() Inp B\");\n    PFFFT_ASSERT4(C, 11.0F, 21.0F, 12.0F, 22.0F, \"INTERLEAVE2() Out C\");\n    PFFFT_ASSERT4(D, 13.0F, 23.0F, 14.0F, 24.0F, \"INTERLEAVE2() Out D\");\n  }\n\n  {\n    v4sf_union A, B, C, D;\n    int k;\n    for (k = 0; k < 4; ++k)\n      A.f[k] = 10 + k + 1;\n    for (k = 0; k < 4; ++k)\n      B.f[k] = 20 + k + 1;\n    for (k = 0; k < 4; ++k)\n      C.f[k] = 30 + k + 1;\n    for (k = 0; k < 4; ++k)\n      D.f[k] = 40 + k + 1;\n\n    if (DbgOut) {\n      fprintf(DbgOut, \"\\ninput: A,B = {\\n\");\n      fprintf(DbgOut, \"  Inp A:  %f, %f, %f, %f\\n\", A.f[0], A.f[1], A.f[2], A.f[3]);\n      fprintf(DbgOut, \"  Inp B:  %f, %f, %f, %f\\n\", B.f[0], B.f[1], B.f[2], B.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    UNINTERLEAVE2(A.v, B.v, C.v, D.v);\n    if (DbgOut) {\n      fprintf(DbgOut, \"UNINTERLEAVE2(A,B, => C,D) => {\\n\");\n      fprintf(DbgOut, \"  Out C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n      fprintf(DbgOut, \"  Out D:  %f, %f, %f, %f\\n\", D.f[0], D.f[1], D.f[2], D.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    PFFFT_ASSERT4(A, 11.0F, 12.0F, 13.0F, 14.0F, \"UNINTERLEAVE2() Inp A\");\n    PFFFT_ASSERT4(B, 21.0F, 22.0F, 23.0F, 24.0F, \"UNINTERLEAVE2() Inp B\");\n    PFFFT_ASSERT4(C, 11.0F, 13.0F, 21.0F, 23.0F, \"UNINTERLEAVE2() Out C\");\n    PFFFT_ASSERT4(D, 12.0F, 14.0F, 22.0F, 24.0F, \"UNINTERLEAVE2() Out D\");\n  }\n\n  {\n    v4sf_union A, B, C, D;\n    int k;\n    for (k = 0; k < 4; ++k)\n      A.f[k] = 10 + k + 1;\n    for (k = 0; k < 4; ++k)\n      B.f[k] = 20 + k + 1;\n    for (k = 0; k < 4; ++k)\n      C.f[k] = 30 + k + 1;\n    for (k = 0; k < 4; ++k)\n      D.f[k] = 40 + k + 1;\n\n    if (DbgOut) {\n      fprintf(DbgOut, \"\\ninput: A,B,C,D = {\\n\");\n      fprintf(DbgOut, \"  Inp A:  %f, %f, %f, %f\\n\", A.f[0], A.f[1], A.f[2], A.f[3]);\n      fprintf(DbgOut, \"  Inp B:  %f, %f, %f, %f\\n\", B.f[0], B.f[1], B.f[2], B.f[3]);\n      fprintf(DbgOut, \"  Inp C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n      fprintf(DbgOut, \"  Inp D:  %f, %f, %f, %f\\n\", D.f[0], D.f[1], D.f[2], D.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    VTRANSPOSE4(A.v, B.v, C.v, D.v);\n    if (DbgOut) {\n      fprintf(DbgOut, \"VTRANSPOSE4(A,B,C,D) => {\\n\");\n      fprintf(DbgOut, \"  Out A:  %f, %f, %f, %f\\n\", A.f[0], A.f[1], A.f[2], A.f[3]);\n      fprintf(DbgOut, \"  Out B:  %f, %f, %f, %f\\n\", B.f[0], B.f[1], B.f[2], B.f[3]);\n      fprintf(DbgOut, \"  Out C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n      fprintf(DbgOut, \"  Out D:  %f, %f, %f, %f\\n\", D.f[0], D.f[1], D.f[2], D.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    PFFFT_ASSERT4(A, 11.0F, 21.0F, 31.0F, 41.0F, \"VTRANSPOSE4(): Out A\");\n    PFFFT_ASSERT4(B, 12.0F, 22.0F, 32.0F, 42.0F, \"VTRANSPOSE4(): Out B\");\n    PFFFT_ASSERT4(C, 13.0F, 23.0F, 33.0F, 43.0F, \"VTRANSPOSE4(): Out C\");\n    PFFFT_ASSERT4(D, 14.0F, 24.0F, 34.0F, 44.0F, \"VTRANSPOSE4(): Out D\");\n  }\n\n  {\n    v4sf_union A, B, C;\n    int k;\n    for (k = 0; k < 4; ++k)\n      A.f[k] = 10 + k + 1;\n    for (k = 0; k < 4; ++k)\n      B.f[k] = 20 + k + 1;\n    for (k = 0; k < 4; ++k)\n      C.f[k] = 30 + k + 1;\n\n    if (DbgOut) {\n      fprintf(DbgOut, \"\\ninput: A,B = {\\n\");\n      fprintf(DbgOut, \"  Inp A:  %f, %f, %f, %f\\n\", A.f[0], A.f[1], A.f[2], A.f[3]);\n      fprintf(DbgOut, \"  Inp B:  %f, %f, %f, %f\\n\", B.f[0], B.f[1], B.f[2], B.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    C.v = VSWAPHL(A.v, B.v);\n    if (DbgOut) {\n      fprintf(DbgOut, \"C = VSWAPHL(A,B) => {\\n\");\n      fprintf(DbgOut, \"  Out C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    PFFFT_ASSERT4(A, 11.0F, 12.0F, 13.0F, 14.0F, \"VSWAPHL(): Inp A\");\n    PFFFT_ASSERT4(B, 21.0F, 22.0F, 23.0F, 24.0F, \"VSWAPHL(): Inp B\");\n    PFFFT_ASSERT4(C, 21.0F, 22.0F, 13.0F, 14.0F, \"VSWAPHL(): Out C\");\n  }\n\n  {\n    v4sf_union A, C;\n    int k;\n    for (k = 0; k < 4; ++k)\n      A.f[k] = 10 + k + 1;\n    for (k = 0; k < 4; ++k)\n      C.f[k] = 30 + k + 1;\n\n    if (DbgOut) {\n      fprintf(DbgOut, \"\\ninput: A = {\\n\");\n      fprintf(DbgOut, \"  Inp A:  %f, %f, %f, %f\\n\", A.f[0], A.f[1], A.f[2], A.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    C.v = VREV_S(A.v);\n    if (DbgOut) {\n      fprintf(DbgOut, \"C = VREV_S(A) => {\\n\");\n      fprintf(DbgOut, \"  Out C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    PFFFT_ASSERT4(A, 11.0F, 12.0F, 13.0F, 14.0F, \"VREV_S(): Inp A\");\n    PFFFT_ASSERT4(C, 14.0F, 13.0F, 12.0F, 11.0F, \"VREV_S(): Out C\");\n  }\n\n  {\n    v4sf_union A, C;\n    int k;\n    for (k = 0; k < 4; ++k)\n      A.f[k] = 10 + k + 1;\n\n    if (DbgOut) {\n      fprintf(DbgOut, \"\\ninput: A = {\\n\");\n      fprintf(DbgOut, \"  Inp A:  %f, %f, %f, %f\\n\", A.f[0], A.f[1], A.f[2], A.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    C.v = VREV_C(A.v);\n    if (DbgOut) {\n      fprintf(DbgOut, \"C = VREV_C(A) => {\\n\");\n      fprintf(DbgOut, \"  Out C:  %f, %f, %f, %f\\n\", C.f[0], C.f[1], C.f[2], C.f[3]);\n      fprintf(DbgOut, \"}\\n\");\n    }\n    PFFFT_ASSERT4(A, 11.0F, 12.0F, 13.0F, 14.0F, \"VREV_C(): Inp A\");\n    PFFFT_ASSERT4(C, 13.0F, 14.0F, 11.0F, 12.0F, \"VREV_C(): Out A\");\n  }\n\n  return numErrs;\n}\n\n#else /* if ( SIMD_SZ == 4 ) */\n\nvoid FUNC_VALIDATE_SIMD_A() {}\n\nint FUNC_VALIDATE_SIMD_EX(FILE *DbgOut) {\n  return -1;\n}\n\n#endif /* end if ( SIMD_SZ == 4 ) */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/fft/simd/pf_avx_double.h",
    "content": "/*\n   Copyright (c) 2020  Dario Mambro ( dario.mambro@gmail.com )\n*/\n\n/* Copyright (c) 2013  Julien Pommier ( pommier@modartt.com )\n\n   Redistribution and use of the Software in source and binary forms,\n   with or without modification, is permitted provided that the\n   following conditions are met:\n\n   - Neither the names of NCAR's Computational and Information Systems\n   Laboratory, the University Corporation for Atmospheric Research,\n   nor the names of its sponsors or contributors may be used to\n   endorse or promote products derived from this Software without\n   specific prior written permission.\n\n   - Redistributions of source code must retain the above copyright\n   notices, this list of conditions, and the disclaimer below.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions, and the disclaimer below in the\n   documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n   EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF\n   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n   NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT\n   HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\n   SOFTWARE.\n*/\n\n#ifndef PF_AVX_DBL_H\n#define PF_AVX_DBL_H\n\n/*\n   vector support macros: the rest of the code is independant of\n   AVX -- adding support for other platforms with 4-element\n   vectors should be limited to these macros\n*/\n\n/*\n  AVX support macros\n*/\n#if !defined(SIMD_SZ) && !defined(PFFFT_SIMD_DISABLE) && defined(__AVX__)\n#pragma message(__FILE__ \": AVX macros are defined\")\n\n#include <immintrin.h>\ntypedef __m256d v4sf;\n\n/* 4 doubles by simd vector */\n#define SIMD_SZ 4\n\ntypedef union v4sf_union {\n  v4sf v;\n  double f[SIMD_SZ];\n} v4sf_union;\n\n#define VARCH \"AVX\"\n#define VREQUIRES_ALIGN 1\n#define VZERO() _mm256_setzero_pd()\n#define VMUL(a, b) _mm256_mul_pd(a, b)\n#define VADD(a, b) _mm256_add_pd(a, b)\n#define VMADD(a, b, c) _mm256_add_pd(_mm256_mul_pd(a, b), c)\n#define VSUB(a, b) _mm256_sub_pd(a, b)\n#define LD_PS1(p) _mm256_set1_pd(p)\n#define VLOAD_UNALIGNED(ptr) _mm256_loadu_pd(ptr)\n#define VLOAD_ALIGNED(ptr) _mm256_load_pd(ptr)\n\n/* INTERLEAVE2 (in1, in2, out1, out2) pseudo code:\nout1 = [ in1[0], in2[0], in1[1], in2[1] ]\nout2 = [ in1[2], in2[2], in1[3], in2[3] ]\n*/\n#define INTERLEAVE2(in1, in2, out1, out2) \\\n  { \\\n    __m128d low1__ = _mm256_castpd256_pd128(in1); \\\n    __m128d low2__ = _mm256_castpd256_pd128(in2); \\\n    __m128d high1__ = _mm256_extractf128_pd(in1, 1); \\\n    __m128d high2__ = _mm256_extractf128_pd(in2, 1); \\\n    __m256d tmp__ = _mm256_insertf128_pd( \\\n        _mm256_castpd128_pd256(_mm_shuffle_pd(low1__, low2__, 0)), \\\n        _mm_shuffle_pd(low1__, low2__, 3), \\\n        1); \\\n    out2 = _mm256_insertf128_pd( \\\n        _mm256_castpd128_pd256(_mm_shuffle_pd(high1__, high2__, 0)), \\\n        _mm_shuffle_pd(high1__, high2__, 3), \\\n        1); \\\n    out1 = tmp__; \\\n  }\n\n/*UNINTERLEAVE2(in1, in2, out1, out2) pseudo code:\nout1 = [ in1[0], in1[2], in2[0], in2[2] ]\nout2 = [ in1[1], in1[3], in2[1], in2[3] ]\n*/\n#define UNINTERLEAVE2(in1, in2, out1, out2) \\\n  { \\\n    __m128d low1__ = _mm256_castpd256_pd128(in1); \\\n    __m128d low2__ = _mm256_castpd256_pd128(in2); \\\n    __m128d high1__ = _mm256_extractf128_pd(in1, 1); \\\n    __m128d high2__ = _mm256_extractf128_pd(in2, 1); \\\n    __m256d tmp__ = _mm256_insertf128_pd( \\\n        _mm256_castpd128_pd256(_mm_shuffle_pd(low1__, high1__, 0)), \\\n        _mm_shuffle_pd(low2__, high2__, 0), \\\n        1); \\\n    out2 = _mm256_insertf128_pd( \\\n        _mm256_castpd128_pd256(_mm_shuffle_pd(low1__, high1__, 3)), \\\n        _mm_shuffle_pd(low2__, high2__, 3), \\\n        1); \\\n    out1 = tmp__; \\\n  }\n\n#define VTRANSPOSE4(row0, row1, row2, row3) \\\n  { \\\n    __m256d tmp3, tmp2, tmp1, tmp0; \\\n\\\n    tmp0 = _mm256_shuffle_pd((row0), (row1), 0x0); \\\n    tmp2 = _mm256_shuffle_pd((row0), (row1), 0xF); \\\n    tmp1 = _mm256_shuffle_pd((row2), (row3), 0x0); \\\n    tmp3 = _mm256_shuffle_pd((row2), (row3), 0xF); \\\n\\\n    (row0) = _mm256_permute2f128_pd(tmp0, tmp1, 0x20); \\\n    (row1) = _mm256_permute2f128_pd(tmp2, tmp3, 0x20); \\\n    (row2) = _mm256_permute2f128_pd(tmp0, tmp1, 0x31); \\\n    (row3) = _mm256_permute2f128_pd(tmp2, tmp3, 0x31); \\\n  }\n\n/*VSWAPHL(a, b) pseudo code:\nreturn [ b[0], b[1], a[2], a[3] ]\n*/\n#define VSWAPHL(a, b) \\\n  _mm256_insertf128_pd( \\\n      _mm256_castpd128_pd256(_mm256_castpd256_pd128(b)), _mm256_extractf128_pd(a, 1), 1)\n\n/* reverse/flip all floats */\n#define VREV_S(a) \\\n  _mm256_insertf128_pd( \\\n      _mm256_castpd128_pd256(_mm_permute_pd(_mm256_extractf128_pd(a, 1), 1)), \\\n      _mm_permute_pd(_mm256_castpd256_pd128(a), 1), \\\n      1)\n\n/* reverse/flip complex floats */\n#define VREV_C(a) \\\n  _mm256_insertf128_pd( \\\n      _mm256_castpd128_pd256(_mm256_extractf128_pd(a, 1)), _mm256_castpd256_pd128(a), 1)\n\n#define VALIGNED(ptr) ((((uintptr_t)(ptr)) & 0x1F) == 0)\n\n#endif\n\n#endif /* PF_AVX_DBL_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/fft/simd/pf_double.h",
    "content": "\n/* Copyright (c) 2013  Julien Pommier ( pommier@modartt.com )\n\n   Redistribution and use of the Software in source and binary forms,\n   with or without modification, is permitted provided that the\n   following conditions are met:\n\n   - Neither the names of NCAR's Computational and Information Systems\n   Laboratory, the University Corporation for Atmospheric Research,\n   nor the names of its sponsors or contributors may be used to\n   endorse or promote products derived from this Software without\n   specific prior written permission.\n\n   - Redistributions of source code must retain the above copyright\n   notices, this list of conditions, and the disclaimer below.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions, and the disclaimer below in the\n   documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n   EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF\n   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n   NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT\n   HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\n   SOFTWARE.\n*/\n\n#ifndef PF_DBL_H\n#define PF_DBL_H\n\n#include <assert.h>\n#include <stdint.h>\n#include <string.h>\n\n/*\n *  SIMD reference material:\n *\n * general SIMD introduction:\n * https://www.linuxjournal.com/content/introduction-gcc-compiler-intrinsics-vector-processing\n *\n * SSE 1:\n * https://software.intel.com/sites/landingpage/IntrinsicsGuide/\n *\n * ARM NEON:\n * https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/intrinsics\n *\n * Altivec:\n * https://www.nxp.com/docs/en/reference-manual/ALTIVECPIM.pdf\n * https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/PowerPC-AltiVec_002fVSX-Built-in-Functions.html\n * better one?\n *\n */\n\ntypedef double vsfscalar;\n\n#include \"pf_avx_double.h\"\n#include \"pf_neon_double.h\"\n#include \"pf_sse2_double.h\"\n\n#ifndef SIMD_SZ\n#if !defined(PFFFT_SIMD_DISABLE)\n#pragma message(\"building double with simd disabled !\")\n#define PFFFT_SIMD_DISABLE /* fallback to scalar code */\n#endif\n#endif\n\n#include \"pf_scalar_double.h\"\n\n/* shortcuts for complex multiplcations */\n#define VCPLXMUL(ar, ai, br, bi) \\\n  { \\\n    v4sf tmp; \\\n    tmp = VMUL(ar, bi); \\\n    ar = VMUL(ar, br); \\\n    ar = VSUB(ar, VMUL(ai, bi)); \\\n    ai = VMUL(ai, br); \\\n    ai = VADD(ai, tmp); \\\n  }\n#define VCPLXMULCONJ(ar, ai, br, bi) \\\n  { \\\n    v4sf tmp; \\\n    tmp = VMUL(ar, bi); \\\n    ar = VMUL(ar, br); \\\n    ar = VADD(ar, VMUL(ai, bi)); \\\n    ai = VMUL(ai, br); \\\n    ai = VSUB(ai, tmp); \\\n  }\n#ifndef SVMUL\n/* multiply a scalar with a vector */\n#define SVMUL(f, v) VMUL(LD_PS1(f), v)\n#endif\n\n#endif /* PF_DBL_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/fft/simd/pf_neon_double.h",
    "content": "/*\n   Copyright (c) 2020  Dario Mambro ( dario.mambro@gmail.com )\n*/\n\n/* Copyright (c) 2013  Julien Pommier ( pommier@modartt.com )\n\n   Redistribution and use of the Software in source and binary forms,\n   with or without modification, is permitted provided that the\n   following conditions are met:\n\n   - Neither the names of NCAR's Computational and Information Systems\n   Laboratory, the University Corporation for Atmospheric Research,\n   nor the names of its sponsors or contributors may be used to\n   endorse or promote products derived from this Software without\n   specific prior written permission.\n\n   - Redistributions of source code must retain the above copyright\n   notices, this list of conditions, and the disclaimer below.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions, and the disclaimer below in the\n   documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n   EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF\n   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n   NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT\n   HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\n   SOFTWARE.\n*/\n\n#ifndef PF_NEON_DBL_H\n#define PF_NEON_DBL_H\n\n/*\n  NEON 64bit support macros\n*/\n#if !defined(PFFFT_SIMD_DISABLE) && defined(PFFFT_ENABLE_NEON) && \\\n    (defined(__aarch64__) || defined(__arm64__))\n\n#pragma message(__FILE__ \": NEON (from AVX) macros are defined\")\n\n#include \"pf_neon_double_from_avx.h\"\ntypedef __m256d v4sf;\n\n/* 4 doubles by simd vector */\n#define SIMD_SZ 4\n\ntypedef union v4sf_union {\n  v4sf v;\n  double f[SIMD_SZ];\n} v4sf_union;\n\n#define VARCH \"NEON\"\n#define VREQUIRES_ALIGN 1\n#define VZERO() _mm256_setzero_pd()\n#define VMUL(a, b) _mm256_mul_pd(a, b)\n#define VADD(a, b) _mm256_add_pd(a, b)\n#define VMADD(a, b, c) _mm256_add_pd(_mm256_mul_pd(a, b), c)\n#define VSUB(a, b) _mm256_sub_pd(a, b)\n#define LD_PS1(p) _mm256_set1_pd(p)\n#define VLOAD_UNALIGNED(ptr) _mm256_loadu_pd(ptr)\n#define VLOAD_ALIGNED(ptr) _mm256_load_pd(ptr)\n\nFORCE_INLINE __m256d _mm256_insertf128_pd_1(__m256d a, __m128d b) {\n  __m256d res;\n  res.vect_f64[0] = a.vect_f64[0];\n  res.vect_f64[1] = b;\n  return res;\n}\n\nFORCE_INLINE __m128d _mm_shuffle_pd_00(__m128d a, __m128d b) {\n  float64x1_t al = vget_low_f64(a);\n  float64x1_t bl = vget_low_f64(b);\n  return vcombine_f64(al, bl);\n}\n\nFORCE_INLINE __m128d _mm_shuffle_pd_11(__m128d a, __m128d b) {\n  float64x1_t ah = vget_high_f64(a);\n  float64x1_t bh = vget_high_f64(b);\n  return vcombine_f64(ah, bh);\n}\n\nFORCE_INLINE __m256d _mm256_shuffle_pd_00(__m256d a, __m256d b) {\n  __m256d res;\n  res.vect_f64[0] = _mm_shuffle_pd_00(a.vect_f64[0], b.vect_f64[0]);\n  res.vect_f64[1] = _mm_shuffle_pd_00(a.vect_f64[1], b.vect_f64[1]);\n  return res;\n}\n\nFORCE_INLINE __m256d _mm256_shuffle_pd_11(__m256d a, __m256d b) {\n  __m256d res;\n  res.vect_f64[0] = _mm_shuffle_pd_11(a.vect_f64[0], b.vect_f64[0]);\n  res.vect_f64[1] = _mm_shuffle_pd_11(a.vect_f64[1], b.vect_f64[1]);\n  return res;\n}\n\nFORCE_INLINE __m256d _mm256_permute2f128_pd_0x20(__m256d a, __m256d b) {\n  __m256d res;\n  res.vect_f64[0] = a.vect_f64[0];\n  res.vect_f64[1] = b.vect_f64[0];\n  return res;\n}\n\nFORCE_INLINE __m256d _mm256_permute2f128_pd_0x31(__m256d a, __m256d b) {\n  __m256d res;\n  res.vect_f64[0] = a.vect_f64[1];\n  res.vect_f64[1] = b.vect_f64[1];\n  return res;\n}\n\nFORCE_INLINE __m256d _mm256_reverse(__m256d x) {\n  __m256d res;\n  float64x2_t low = x.vect_f64[0];\n  float64x2_t high = x.vect_f64[1];\n  float64x1_t a = vget_low_f64(low);\n  float64x1_t b = vget_high_f64(low);\n  float64x1_t c = vget_low_f64(high);\n  float64x1_t d = vget_high_f64(high);\n  res.vect_f64[0] = vcombine_f64(d, c);\n  res.vect_f64[1] = vcombine_f64(b, a);\n  return res;\n}\n\n/* INTERLEAVE2 (in1, in2, out1, out2) pseudo code:\nout1 = [ in1[0], in2[0], in1[1], in2[1] ]\nout2 = [ in1[2], in2[2], in1[3], in2[3] ]\n*/\n#define INTERLEAVE2(in1, in2, out1, out2) \\\n  { \\\n    __m128d low1__ = _mm256_castpd256_pd128(in1); \\\n    __m128d low2__ = _mm256_castpd256_pd128(in2); \\\n    __m128d high1__ = _mm256_extractf128_pd(in1, 1); \\\n    __m128d high2__ = _mm256_extractf128_pd(in2, 1); \\\n    __m256d tmp__ = _mm256_insertf128_pd_1( \\\n        _mm256_castpd128_pd256(_mm_shuffle_pd_00(low1__, low2__)), \\\n        _mm_shuffle_pd_11(low1__, low2__)); \\\n    out2 = _mm256_insertf128_pd_1( \\\n        _mm256_castpd128_pd256(_mm_shuffle_pd_00(high1__, high2__)), \\\n        _mm_shuffle_pd_11(high1__, high2__)); \\\n    out1 = tmp__; \\\n  }\n\n/*UNINTERLEAVE2(in1, in2, out1, out2) pseudo code:\nout1 = [ in1[0], in1[2], in2[0], in2[2] ]\nout2 = [ in1[1], in1[3], in2[1], in2[3] ]\n*/\n#define UNINTERLEAVE2(in1, in2, out1, out2) \\\n  { \\\n    __m128d low1__ = _mm256_castpd256_pd128(in1); \\\n    __m128d low2__ = _mm256_castpd256_pd128(in2); \\\n    __m128d high1__ = _mm256_extractf128_pd(in1, 1); \\\n    __m128d high2__ = _mm256_extractf128_pd(in2, 1); \\\n    __m256d tmp__ = _mm256_insertf128_pd_1( \\\n        _mm256_castpd128_pd256(_mm_shuffle_pd_00(low1__, high1__)), \\\n        _mm_shuffle_pd_00(low2__, high2__)); \\\n    out2 = _mm256_insertf128_pd_1( \\\n        _mm256_castpd128_pd256(_mm_shuffle_pd_11(low1__, high1__)), \\\n        _mm_shuffle_pd_11(low2__, high2__)); \\\n    out1 = tmp__; \\\n  }\n\n#define VTRANSPOSE4(row0, row1, row2, row3) \\\n  { \\\n    __m256d tmp3, tmp2, tmp1, tmp0; \\\n\\\n    tmp0 = _mm256_shuffle_pd_00((row0), (row1)); \\\n    tmp2 = _mm256_shuffle_pd_11((row0), (row1)); \\\n    tmp1 = _mm256_shuffle_pd_00((row2), (row3)); \\\n    tmp3 = _mm256_shuffle_pd_11((row2), (row3)); \\\n\\\n    (row0) = _mm256_permute2f128_pd_0x20(tmp0, tmp1); \\\n    (row1) = _mm256_permute2f128_pd_0x20(tmp2, tmp3); \\\n    (row2) = _mm256_permute2f128_pd_0x31(tmp0, tmp1); \\\n    (row3) = _mm256_permute2f128_pd_0x31(tmp2, tmp3); \\\n  }\n\n/*VSWAPHL(a, b) pseudo code:\nreturn [ b[0], b[1], a[2], a[3] ]\n*/\n#define VSWAPHL(a, b) \\\n  _mm256_insertf128_pd_1( \\\n      _mm256_castpd128_pd256(_mm256_castpd256_pd128(b)), _mm256_extractf128_pd(a, 1))\n\n/* reverse/flip all floats */\n#define VREV_S(a) _mm256_reverse(a)\n\n/* reverse/flip complex floats */\n#define VREV_C(a) \\\n  _mm256_insertf128_pd_1( \\\n      _mm256_castpd128_pd256(_mm256_extractf128_pd(a, 1)), _mm256_castpd256_pd128(a))\n\n#define VALIGNED(ptr) ((((uintptr_t)(ptr)) & 0x1F) == 0)\n\n#endif\n\n#endif /* PF_AVX_DBL_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/fft/simd/pf_neon_double_from_avx.h",
    "content": "/*\n * Copyright (C) 2020. Huawei Technologies Co., Ltd. All rights reserved.\n\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n\n * http://www.apache.org/licenses/LICENSE-2.0\n\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n\n */\n\n//see https://github.com/kunpengcompute/AvxToNeon\n\n#ifndef PF_NEON_DBL_FROM_AVX_H\n#define PF_NEON_DBL_FROM_AVX_H\n#include <arm_neon.h>\n\n#if defined(__GNUC__) || defined(__clang__)\n\n#pragma push_macro(\"FORCE_INLINE\")\n#define FORCE_INLINE static inline __attribute__((always_inline))\n\n#else\n\n#error \"Macro name collisions may happens with unknown compiler\"\n#ifdef FORCE_INLINE\n#undef FORCE_INLINE\n#endif\n\n#define FORCE_INLINE static inline\n\n#endif\n\ntypedef struct {\n  float32x4_t vect_f32[2];\n} __m256;\n\ntypedef struct {\n  float64x2_t vect_f64[2];\n} __m256d;\n\ntypedef float64x2_t __m128d;\n\nFORCE_INLINE __m256d _mm256_setzero_pd(void) {\n  __m256d ret;\n  ret.vect_f64[0] = ret.vect_f64[1] = vdupq_n_f64(0.0);\n  return ret;\n}\n\nFORCE_INLINE __m256d _mm256_mul_pd(__m256d a, __m256d b) {\n  __m256d res_m256d;\n  res_m256d.vect_f64[0] = vmulq_f64(a.vect_f64[0], b.vect_f64[0]);\n  res_m256d.vect_f64[1] = vmulq_f64(a.vect_f64[1], b.vect_f64[1]);\n  return res_m256d;\n}\n\nFORCE_INLINE __m256d _mm256_add_pd(__m256d a, __m256d b) {\n  __m256d res_m256d;\n  res_m256d.vect_f64[0] = vaddq_f64(a.vect_f64[0], b.vect_f64[0]);\n  res_m256d.vect_f64[1] = vaddq_f64(a.vect_f64[1], b.vect_f64[1]);\n  return res_m256d;\n}\n\nFORCE_INLINE __m256d _mm256_sub_pd(__m256d a, __m256d b) {\n  __m256d res_m256d;\n  res_m256d.vect_f64[0] = vsubq_f64(a.vect_f64[0], b.vect_f64[0]);\n  res_m256d.vect_f64[1] = vsubq_f64(a.vect_f64[1], b.vect_f64[1]);\n  return res_m256d;\n}\n\nFORCE_INLINE __m256d _mm256_set1_pd(double a) {\n  __m256d ret;\n  ret.vect_f64[0] = ret.vect_f64[1] = vdupq_n_f64(a);\n  return ret;\n}\n\nFORCE_INLINE __m256d _mm256_load_pd(double const *mem_addr) {\n  __m256d res;\n  res.vect_f64[0] = vld1q_f64((const double *)mem_addr);\n  res.vect_f64[1] = vld1q_f64((const double *)mem_addr + 2);\n  return res;\n}\nFORCE_INLINE __m256d _mm256_loadu_pd(double const *mem_addr) {\n  __m256d res;\n  res.vect_f64[0] = vld1q_f64((const double *)mem_addr);\n  res.vect_f64[1] = vld1q_f64((const double *)mem_addr + 2);\n  return res;\n}\n\nFORCE_INLINE __m128d _mm256_castpd256_pd128(__m256d a) {\n  return a.vect_f64[0];\n}\n\nFORCE_INLINE __m128d _mm256_extractf128_pd(__m256d a, const int imm8) {\n  assert(imm8 >= 0 && imm8 <= 1);\n  return a.vect_f64[imm8];\n}\n\nFORCE_INLINE __m256d _mm256_castpd128_pd256(__m128d a) {\n  __m256d res;\n  res.vect_f64[0] = a;\n  return res;\n}\n\n#endif /* PF_AVX_DBL_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/fft/simd/pf_scalar_double.h",
    "content": "\n/* Copyright (c) 2013  Julien Pommier ( pommier@modartt.com )\n   Copyright (c) 2020  Hayati Ayguen ( h_ayguen@web.de )\n\n   Redistribution and use of the Software in source and binary forms,\n   with or without modification, is permitted provided that the\n   following conditions are met:\n\n   - Neither the names of NCAR's Computational and Information Systems\n   Laboratory, the University Corporation for Atmospheric Research,\n   nor the names of its sponsors or contributors may be used to\n   endorse or promote products derived from this Software without\n   specific prior written permission.\n\n   - Redistributions of source code must retain the above copyright\n   notices, this list of conditions, and the disclaimer below.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions, and the disclaimer below in the\n   documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n   EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF\n   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n   NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT\n   HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\n   SOFTWARE.\n*/\n\n#ifndef PF_SCAL_DBL_H\n#define PF_SCAL_DBL_H\n\n/*\n  fallback mode(s) for situations where SSE/AVX/NEON/Altivec are not available, use scalar mode instead\n*/\n\n#if !defined(SIMD_SZ) && defined(PFFFT_SCALVEC_ENABLED)\n#pragma message(__FILE__ \": double SCALAR4 macros are defined\")\n\ntypedef struct {\n  vsfscalar a;\n  vsfscalar b;\n  vsfscalar c;\n  vsfscalar d;\n} v4sf;\n\n#define SIMD_SZ 4\n\ntypedef union v4sf_union {\n  v4sf v;\n  vsfscalar f[SIMD_SZ];\n} v4sf_union;\n\n#define VARCH \"4xScalar\"\n#define VREQUIRES_ALIGN 0\n\nstatic ALWAYS_INLINE(v4sf) VZERO() {\n  v4sf r = {0.f, 0.f, 0.f, 0.f};\n  return r;\n}\n\nstatic ALWAYS_INLINE(v4sf) VMUL(v4sf A, v4sf B) {\n  v4sf r = {A.a * B.a, A.b * B.b, A.c * B.c, A.d * B.d};\n  return r;\n}\n\nstatic ALWAYS_INLINE(v4sf) VADD(v4sf A, v4sf B) {\n  v4sf r = {A.a + B.a, A.b + B.b, A.c + B.c, A.d + B.d};\n  return r;\n}\n\nstatic ALWAYS_INLINE(v4sf) VMADD(v4sf A, v4sf B, v4sf C) {\n  v4sf r = {A.a * B.a + C.a, A.b * B.b + C.b, A.c * B.c + C.c, A.d * B.d + C.d};\n  return r;\n}\n\nstatic ALWAYS_INLINE(v4sf) VSUB(v4sf A, v4sf B) {\n  v4sf r = {A.a - B.a, A.b - B.b, A.c - B.c, A.d - B.d};\n  return r;\n}\n\nstatic ALWAYS_INLINE(v4sf) LD_PS1(vsfscalar v) {\n  v4sf r = {v, v, v, v};\n  return r;\n}\n\n#define VLOAD_UNALIGNED(ptr) (*((v4sf *)(ptr)))\n\n#define VLOAD_ALIGNED(ptr) (*((v4sf *)(ptr)))\n\n#define VALIGNED(ptr) ((((uintptr_t)(ptr)) & (sizeof(v4sf) - 1)) == 0)\n\n/* INTERLEAVE2() */\n#define INTERLEAVE2(A, B, C, D) \\\n  do { \\\n    v4sf Cr = {A.a, B.a, A.b, B.b}; \\\n    v4sf Dr = {A.c, B.c, A.d, B.d}; \\\n    C = Cr; \\\n    D = Dr; \\\n  } while (0)\n\n/* UNINTERLEAVE2() */\n#define UNINTERLEAVE2(A, B, C, D) \\\n  do { \\\n    v4sf Cr = {A.a, A.c, B.a, B.c}; \\\n    v4sf Dr = {A.b, A.d, B.b, B.d}; \\\n    C = Cr; \\\n    D = Dr; \\\n  } while (0)\n\n/* VTRANSPOSE4() */\n#define VTRANSPOSE4(A, B, C, D) \\\n  do { \\\n    v4sf Ar = {A.a, B.a, C.a, D.a}; \\\n    v4sf Br = {A.b, B.b, C.b, D.b}; \\\n    v4sf Cr = {A.c, B.c, C.c, D.c}; \\\n    v4sf Dr = {A.d, B.d, C.d, D.d}; \\\n    A = Ar; \\\n    B = Br; \\\n    C = Cr; \\\n    D = Dr; \\\n  } while (0)\n\n/* VSWAPHL() */\nstatic ALWAYS_INLINE(v4sf) VSWAPHL(v4sf A, v4sf B) {\n  v4sf r = {B.a, B.b, A.c, A.d};\n  return r;\n}\n\n/* reverse/flip all floats */\nstatic ALWAYS_INLINE(v4sf) VREV_S(v4sf A) {\n  v4sf r = {A.d, A.c, A.b, A.a};\n  return r;\n}\n\n/* reverse/flip complex floats */\nstatic ALWAYS_INLINE(v4sf) VREV_C(v4sf A) {\n  v4sf r = {A.c, A.d, A.a, A.b};\n  return r;\n}\n\n#else\n/* #pragma message( __FILE__ \": double SCALAR4 macros are not defined\" ) */\n#endif\n\n#if !defined(SIMD_SZ)\n#pragma message(__FILE__ \": float SCALAR1 macros are defined\")\ntypedef vsfscalar v4sf;\n\n#define SIMD_SZ 1\n\ntypedef union v4sf_union {\n  v4sf v;\n  vsfscalar f[SIMD_SZ];\n} v4sf_union;\n\n#define VARCH \"Scalar\"\n#define VREQUIRES_ALIGN 0\n#define VZERO() 0.0\n#define VMUL(a, b) ((a) * (b))\n#define VADD(a, b) ((a) + (b))\n#define VMADD(a, b, c) ((a) * (b) + (c))\n#define VSUB(a, b) ((a) - (b))\n#define LD_PS1(p) (p)\n#define VLOAD_UNALIGNED(ptr) (*(ptr))\n#define VLOAD_ALIGNED(ptr) (*(ptr))\n#define VALIGNED(ptr) ((((uintptr_t)(ptr)) & (sizeof(vsfscalar) - 1)) == 0)\n\n#else\n/* #pragma message( __FILE__ \": double SCALAR1 macros are not defined\" ) */\n#endif\n\n#endif /* PF_SCAL_DBL_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/fft/simd/pf_sse2_double.h",
    "content": "/*\n   Copyright (c) 2020  Dario Mambro ( dario.mambro@gmail.com )\n*/\n\n/* Copyright (c) 2013  Julien Pommier ( pommier@modartt.com )\n\n   Redistribution and use of the Software in source and binary forms,\n   with or without modification, is permitted provided that the\n   following conditions are met:\n\n   - Neither the names of NCAR's Computational and Information Systems\n   Laboratory, the University Corporation for Atmospheric Research,\n   nor the names of its sponsors or contributors may be used to\n   endorse or promote products derived from this Software without\n   specific prior written permission.\n\n   - Redistributions of source code must retain the above copyright\n   notices, this list of conditions, and the disclaimer below.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions, and the disclaimer below in the\n   documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n   EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF\n   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n   NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT\n   HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\n   SOFTWARE.\n*/\n\n#ifndef PF_SSE2_DBL_H\n#define PF_SSE2_DBL_H\n\n//detect sse2 support under MSVC\n#if defined(_M_IX86_FP)\n#if _M_IX86_FP == 2\n#if !defined(__SSE2__)\n#define __SSE2__\n#endif\n#endif\n#endif\n\n/*\n  SSE2 64bit support macros\n*/\n#if !defined(SIMD_SZ) && !defined(PFFFT_SIMD_DISABLE) && \\\n    (defined(__SSE4_2__) | defined(__SSE4_1__) || defined(__SSE3__) || defined(__SSE2__) || \\\n     defined(__x86_64__) || defined(_M_AMD64) || defined(_M_X64) || defined(__amd64))\n#pragma message(__FILE__ \": SSE2 double macros are defined\")\n\n#include <emmintrin.h>\n\ntypedef struct {\n  __m128d d128[2];\n} m256d;\n\ntypedef m256d v4sf;\n\n#define SIMD_SZ 4\n\ntypedef union v4sf_union {\n  v4sf v;\n  double f[SIMD_SZ];\n} v4sf_union;\n\n#if defined(__GNUC__) || defined(__clang__)\n\n#pragma push_macro(\"FORCE_INLINE\")\n#define FORCE_INLINE static inline __attribute__((always_inline))\n\n#elif defined(_MSC_VER)\n#define FORCE_INLINE static __forceinline\n\n#else\n#error \"Macro name collisions may happens with unknown compiler\"\n#ifdef FORCE_INLINE\n#undef FORCE_INLINE\n#endif\n#define FORCE_INLINE static inline\n#endif\n\nFORCE_INLINE m256d mm256_setzero_pd(void) {\n  m256d ret;\n  ret.d128[0] = ret.d128[1] = _mm_setzero_pd();\n  return ret;\n}\n\nFORCE_INLINE m256d mm256_mul_pd(m256d a, m256d b) {\n  m256d ret;\n  ret.d128[0] = _mm_mul_pd(a.d128[0], b.d128[0]);\n  ret.d128[1] = _mm_mul_pd(a.d128[1], b.d128[1]);\n  return ret;\n}\n\nFORCE_INLINE m256d mm256_add_pd(m256d a, m256d b) {\n  m256d ret;\n  ret.d128[0] = _mm_add_pd(a.d128[0], b.d128[0]);\n  ret.d128[1] = _mm_add_pd(a.d128[1], b.d128[1]);\n  return ret;\n}\n\nFORCE_INLINE m256d mm256_sub_pd(m256d a, m256d b) {\n  m256d ret;\n  ret.d128[0] = _mm_sub_pd(a.d128[0], b.d128[0]);\n  ret.d128[1] = _mm_sub_pd(a.d128[1], b.d128[1]);\n  return ret;\n}\n\nFORCE_INLINE m256d mm256_set1_pd(double a) {\n  m256d ret;\n  ret.d128[0] = ret.d128[1] = _mm_set1_pd(a);\n  return ret;\n}\n\nFORCE_INLINE m256d mm256_load_pd(double const *mem_addr) {\n  m256d res;\n  res.d128[0] = _mm_load_pd((const double *)mem_addr);\n  res.d128[1] = _mm_load_pd((const double *)mem_addr + 2);\n  return res;\n}\nFORCE_INLINE m256d mm256_loadu_pd(double const *mem_addr) {\n  m256d res;\n  res.d128[0] = _mm_loadu_pd((const double *)mem_addr);\n  res.d128[1] = _mm_loadu_pd((const double *)mem_addr + 2);\n  return res;\n}\n\n#define VARCH \"SSE2\"\n#define VREQUIRES_ALIGN 1\n#define VZERO() mm256_setzero_pd()\n#define VMUL(a, b) mm256_mul_pd(a, b)\n#define VADD(a, b) mm256_add_pd(a, b)\n#define VMADD(a, b, c) mm256_add_pd(mm256_mul_pd(a, b), c)\n#define VSUB(a, b) mm256_sub_pd(a, b)\n#define LD_PS1(p) mm256_set1_pd(p)\n#define VLOAD_UNALIGNED(ptr) mm256_loadu_pd(ptr)\n#define VLOAD_ALIGNED(ptr) mm256_load_pd(ptr)\n\nFORCE_INLINE __m128d mm256_castpd256_pd128(m256d a) {\n  return a.d128[0];\n}\n\nFORCE_INLINE __m128d mm256_extractf128_pd(m256d a, const int imm8) {\n  assert(imm8 >= 0 && imm8 <= 1);\n  return a.d128[imm8];\n}\nFORCE_INLINE m256d mm256_insertf128_pd_1(m256d a, __m128d b) {\n  m256d res;\n  res.d128[0] = a.d128[0];\n  res.d128[1] = b;\n  return res;\n}\nFORCE_INLINE m256d mm256_castpd128_pd256(__m128d a) {\n  m256d res;\n  res.d128[0] = a;\n  return res;\n}\n\nFORCE_INLINE m256d mm256_shuffle_pd_00(m256d a, m256d b) {\n  m256d res;\n  res.d128[0] = _mm_shuffle_pd(a.d128[0], b.d128[0], 0);\n  res.d128[1] = _mm_shuffle_pd(a.d128[1], b.d128[1], 0);\n  return res;\n}\n\nFORCE_INLINE m256d mm256_shuffle_pd_11(m256d a, m256d b) {\n  m256d res;\n  res.d128[0] = _mm_shuffle_pd(a.d128[0], b.d128[0], 3);\n  res.d128[1] = _mm_shuffle_pd(a.d128[1], b.d128[1], 3);\n  return res;\n}\n\nFORCE_INLINE m256d mm256_permute2f128_pd_0x20(m256d a, m256d b) {\n  m256d res;\n  res.d128[0] = a.d128[0];\n  res.d128[1] = b.d128[0];\n  return res;\n}\n\nFORCE_INLINE m256d mm256_permute2f128_pd_0x31(m256d a, m256d b) {\n  m256d res;\n  res.d128[0] = a.d128[1];\n  res.d128[1] = b.d128[1];\n  return res;\n}\n\nFORCE_INLINE m256d mm256_reverse(m256d x) {\n  m256d res;\n  res.d128[0] = _mm_shuffle_pd(x.d128[1], x.d128[1], 1);\n  res.d128[1] = _mm_shuffle_pd(x.d128[0], x.d128[0], 1);\n  return res;\n}\n\n/* INTERLEAVE2 (in1, in2, out1, out2) pseudo code:\nout1 = [ in1[0], in2[0], in1[1], in2[1] ]\nout2 = [ in1[2], in2[2], in1[3], in2[3] ]\n*/\n#define INTERLEAVE2(in1, in2, out1, out2) \\\n  { \\\n    __m128d low1__ = mm256_castpd256_pd128(in1); \\\n    __m128d low2__ = mm256_castpd256_pd128(in2); \\\n    __m128d high1__ = mm256_extractf128_pd(in1, 1); \\\n    __m128d high2__ = mm256_extractf128_pd(in2, 1); \\\n    m256d tmp__ = mm256_insertf128_pd_1( \\\n        mm256_castpd128_pd256(_mm_shuffle_pd(low1__, low2__, 0)), \\\n        _mm_shuffle_pd(low1__, low2__, 3)); \\\n    out2 = mm256_insertf128_pd_1( \\\n        mm256_castpd128_pd256(_mm_shuffle_pd(high1__, high2__, 0)), \\\n        _mm_shuffle_pd(high1__, high2__, 3)); \\\n    out1 = tmp__; \\\n  }\n\n/*UNINTERLEAVE2(in1, in2, out1, out2) pseudo code:\nout1 = [ in1[0], in1[2], in2[0], in2[2] ]\nout2 = [ in1[1], in1[3], in2[1], in2[3] ]\n*/\n#define UNINTERLEAVE2(in1, in2, out1, out2) \\\n  { \\\n    __m128d low1__ = mm256_castpd256_pd128(in1); \\\n    __m128d low2__ = mm256_castpd256_pd128(in2); \\\n    __m128d high1__ = mm256_extractf128_pd(in1, 1); \\\n    __m128d high2__ = mm256_extractf128_pd(in2, 1); \\\n    m256d tmp__ = mm256_insertf128_pd_1( \\\n        mm256_castpd128_pd256(_mm_shuffle_pd(low1__, high1__, 0)), \\\n        _mm_shuffle_pd(low2__, high2__, 0)); \\\n    out2 = mm256_insertf128_pd_1( \\\n        mm256_castpd128_pd256(_mm_shuffle_pd(low1__, high1__, 3)), \\\n        _mm_shuffle_pd(low2__, high2__, 3)); \\\n    out1 = tmp__; \\\n  }\n\n#define VTRANSPOSE4(row0, row1, row2, row3) \\\n  { \\\n    m256d tmp3, tmp2, tmp1, tmp0; \\\n\\\n    tmp0 = mm256_shuffle_pd_00((row0), (row1)); \\\n    tmp2 = mm256_shuffle_pd_11((row0), (row1)); \\\n    tmp1 = mm256_shuffle_pd_00((row2), (row3)); \\\n    tmp3 = mm256_shuffle_pd_11((row2), (row3)); \\\n\\\n    (row0) = mm256_permute2f128_pd_0x20(tmp0, tmp1); \\\n    (row1) = mm256_permute2f128_pd_0x20(tmp2, tmp3); \\\n    (row2) = mm256_permute2f128_pd_0x31(tmp0, tmp1); \\\n    (row3) = mm256_permute2f128_pd_0x31(tmp2, tmp3); \\\n  }\n\n/*VSWAPHL(a, b) pseudo code:\nreturn [ b[0], b[1], a[2], a[3] ]\n*/\n#define VSWAPHL(a, b) \\\n  mm256_insertf128_pd_1(mm256_castpd128_pd256(mm256_castpd256_pd128(b)), mm256_extractf128_pd(a, 1))\n\n/* reverse/flip all floats */\n#define VREV_S(a) mm256_reverse(a)\n\n/* reverse/flip complex floats */\n#define VREV_C(a) \\\n  mm256_insertf128_pd_1(mm256_castpd128_pd256(mm256_extractf128_pd(a, 1)), mm256_castpd256_pd128(a))\n\n#define VALIGNED(ptr) ((((uintptr_t)(ptr)) & 0x1F) == 0)\n\n#endif\n#endif\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/r8bbase.h",
    "content": "//$ nobt\r\n\r\n/**\r\n * @file r8bbase.h\r\n *\r\n * @version 7.1\r\n *\r\n * @brief The \"base\" header file with basic classes and functions.\r\n *\r\n * This is the \"base\" header file for the \"r8brain-free-src\" sample rate\r\n * converter. This file contains implementations of several small utility\r\n * classes and functions used by the library.\r\n *\r\n * @mainpage\r\n *\r\n * @section intro_sec Introduction\r\n *\r\n * Open source (under the MIT license) high-quality professional audio sample\r\n * rate converter (SRC) / resampler C++ library.  Features routines for SRC,\r\n * both up- and downsampling, to/from any sample rate, including non-integer\r\n * sample rates: it can be also used for conversion to/from SACD/DSD sample\r\n * rates, and even go beyond that.  SRC routines were implemented in a\r\n * multi-platform C++ code, and have a high level of optimality. Also suitable\r\n * for fast general-purpose 1D time-series resampling / interpolation (with\r\n * relaxed filter parameters).\r\n *\r\n * For more information, please visit\r\n * https://github.com/avaneev/r8brain-free-src\r\n *\r\n * Email: aleksey.vaneev@gmail.com or info@voxengo.com\r\n *\r\n * @section license License\r\n *\r\n * The MIT License (MIT)\r\n * \r\n * r8brain-free-src Copyright (c) 2013-2025 Aleksey Vaneev\r\n * \r\n * Permission is hereby granted, free of charge, to any person obtaining a\r\n * copy of this software and associated documentation files (the \"Software\"),\r\n * to deal in the Software without restriction, including without limitation\r\n * the rights to use, copy, modify, merge, publish, distribute, sublicense,\r\n * and/or sell copies of the Software, and to permit persons to whom the\r\n * Software is furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in\r\n * all copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\r\n * DEALINGS IN THE SOFTWARE.\r\n * \r\n * Please credit the creator of this library in your documentation in the\r\n * following way: \"Sample rate converter designed by Aleksey Vaneev of\r\n * Voxengo\"\r\n */\r\n\r\n#ifndef R8BBASE_INCLUDED\r\n#define R8BBASE_INCLUDED\r\n\r\n#define R8B_VERSION \"7.1\" ///< Macro defines r8brain-free-src version string.\r\n\r\n/**\r\n * @def R8B_CONST\r\n * @brief The prefix for constant definitions, portable between C++11 and\r\n * earlier C++ versions.\r\n */\r\n\r\n/**\r\n * @def R8B_NULL\r\n * @brief The \"null pointer\" value, portable between C++11 and earlier C++\r\n * versions.\r\n */\r\n\r\n#if __cplusplus >= 201103L\r\n\r\n#include <cmath>\r\n#include <cstdint>\r\n#include <cstring>\r\n#include <mutex>\r\n\r\n#define R8B_CONST constexpr\r\n#define R8B_NULL nullptr\r\n\r\n#else // __cplusplus >= 201103L\r\n\r\n#include <math.h>\r\n#include <stdint.h>\r\n#include <string.h>\r\n\r\n#if defined(_WIN32)\r\n#include <Windows.h>\r\n#else // defined( _WIN32 )\r\n#include <pthread.h>\r\n#endif // defined( _WIN32 )\r\n\r\n#define R8B_CONST static const\r\n#define R8B_NULL NULL\r\n\r\n#endif // __cplusplus >= 201103L\r\n\r\n#include \"r8bconf.h\"\r\n\r\n#if defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) || defined(_M_ARM64EC)\r\n\r\n#if defined(_MSC_VER)\r\n#include <arm64_neon.h>\r\n#else // defined( _MSC_VER )\r\n#include <arm_neon.h>\r\n#endif // defined( _MSC_VER )\r\n\r\n#define R8B_NEON\r\n\r\n#if !defined(__APPLE__)\r\n#define R8B_SIMD_ISH // Shuffled interpolation is inefficient on M1.\r\n#endif               // !defined( __APPLE__ )\r\n\r\n#elif defined(__SSE2__) || defined(_M_AMD64) || (defined(_M_IX86_FP) && _M_IX86_FP == 2)\r\n\r\n#if defined(_MSC_VER)\r\n#include <intrin.h>\r\n#else // defined( _MSC_VER )\r\n#include <emmintrin.h>\r\n#endif // defined( _MSC_VER )\r\n\r\n#define R8B_SSE2\r\n#define R8B_SIMD_ISH\r\n\r\n#endif // SSE2\r\n\r\n/**\r\n * @def R8B_EXITDTOR\r\n * @brief Macro that defines the attribute specifying that the exit-time\r\n * destructor should be called for a static variable (suppresses a compiler\r\n * warning).\r\n */\r\n\r\n#if defined(__clang__)\r\n\r\n#define R8B_EXITDTOR __attribute__((always_destroy))\r\n\r\n#else // defined( __clang__ )\r\n\r\n#define R8B_EXITDTOR\r\n\r\n#endif // defined( __clang__ )\r\n\r\n/**\r\n * @brief The \"r8brain-free-src\" library namespace.\r\n *\r\n * The \"r8brain-free-src\" sample rate converter library namespace.\r\n */\r\n\r\nnamespace r8b {\r\n\r\n#if __cplusplus >= 201103L\r\n\r\nusing std ::atan2;\r\nusing std ::ceil;\r\nusing std ::cos;\r\nusing std ::exp;\r\nusing std ::fabs;\r\nusing std ::floor;\r\nusing std ::log;\r\nusing std ::memcpy;\r\nusing std ::memset;\r\nusing std ::sin;\r\nusing std ::size_t;\r\nusing std ::sqrt;\r\nusing std ::uintptr_t;\r\n\r\n#endif // __cplusplus >= 201103L\r\n\r\nR8B_CONST double R8B_PI = 3.14159265358979324;   ///< Equals `pi`.\r\nR8B_CONST double R8B_2PI = 6.28318530717958648;  ///< Equals `2*pi`.\r\nR8B_CONST double R8B_3PI = 9.42477796076937972;  ///< Equals `3*pi`.\r\nR8B_CONST double R8B_PId2 = 1.57079632679489662; ///< Equals `0.5*pi`.\r\n\r\n/**\r\n * @brief Macro that defines empty copy-constructor and copy operator with\r\n * the \"private:\" prefix.\r\n *\r\n * This macro should be used in classes that cannot be copied in a standard\r\n * C++ way. It is also assumed that objects of such classes are\r\n * non-relocatable.\r\n *\r\n * This macro does not need to be defined in classes derived from a class\r\n * where such macro was already used.\r\n *\r\n * @param ClassName The name of the class which uses this macro.\r\n */\r\n\r\n#define R8BNOCTOR(ClassName) \\\r\n private: \\\r\n  ClassName(const ClassName &) {} \\\r\n  ClassName &operator=(const ClassName &) { \\\r\n    return (*this); \\\r\n  }\r\n\r\n/**\r\n * @brief The default base class for objects created on heap.\r\n */\r\n\r\nclass CStdClassAllocator {};\r\n\r\n/**\r\n * @brief The default base class for objects that allocate blocks of memory.\r\n *\r\n * Memory buffer allocator that uses standard C++ \"new\" to allocate memory.\r\n */\r\n\r\nclass CStdMemAllocator : public CStdClassAllocator {\r\n public:\r\n  /**\r\n\t * @brief Allocates a memory block.\r\n\t *\r\n\t * @param Size The size of the block, in bytes.\r\n\t * @return The pointer to the allocated block.\r\n\t */\r\n\r\n  static void *allocmem(const size_t Size) {\r\n    return (new char[Size]);\r\n  }\r\n\r\n  /**\r\n\t * @brief Frees a previously allocated memory block.\r\n\t *\r\n\t * @param p Pointer to the allocated block, can be `nullptr`.\r\n\t */\r\n\r\n  static void freemem(void *const p) {\r\n    delete[] (char *)p;\r\n  }\r\n};\r\n\r\n/**\r\n * @brief Forces the provided `ptr` pointer to be aligned to `align` bytes.\r\n *\r\n * Works with power-of-2 alignments only.\r\n *\r\n * @param ptr Pointer to align.\r\n * @param align Alignment, in bytes, power-of-2.\r\n * @tparam T Pointer's element type.\r\n * @return Aligned pointer.\r\n */\r\n\r\ntemplate <typename T>\r\ninline T *alignptr(T *const ptr, const uintptr_t align) {\r\n  return ((T *)(((uintptr_t)ptr + align - 1) & ~(align - 1)));\r\n}\r\n\r\n/**\r\n * @brief Templated memory buffer class for element buffers of fixed capacity.\r\n *\r\n * Fixed memory buffer object. Supports allocation of a fixed amount of\r\n * memory. Does not store buffer's capacity - the user should know the actual\r\n * capacity of the buffer. Does not feature \"internal\" storage, memory is\r\n * always allocated via the `R8B_MEMALLOCCLASS` class's functions. Thus the\r\n * object of this class can be moved in memory.\r\n *\r\n * This class manages memory space only - it does not perform element class\r\n * construction nor destruction operations.\r\n *\r\n * This class applies 64-byte memory address alignment to the allocated data\r\n * block.\r\n *\r\n * @tparam T The type of the stored elements (e.g., `double`).\r\n */\r\n\r\ntemplate <typename T>\r\nclass CFixedBuffer : public R8B_MEMALLOCCLASS {\r\n  R8BNOCTOR(CFixedBuffer)\r\n\r\n public:\r\n  CFixedBuffer() : Data0(R8B_NULL), Data(R8B_NULL) {}\r\n\r\n  /**\r\n\t * @brief Constructor allocates memory so that the specified number of\r\n\t * elements of type T can be stored in *this* buffer object.\r\n\t *\r\n\t * @param Capacity Storage for this number of elements to allocate.\r\n\t */\r\n\r\n  CFixedBuffer(const int Capacity) {\r\n    R8BASSERT(Capacity > 0 || Capacity == 0);\r\n\r\n    Data0 = allocmem((size_t)Capacity * sizeof(T) + Alignment);\r\n    Data = (T *)alignptr(Data0, Alignment);\r\n\r\n    R8BASSERT(Data0 != R8B_NULL || Capacity == 0);\r\n  }\r\n\r\n  ~CFixedBuffer() {\r\n    freemem(Data0);\r\n  }\r\n\r\n  /**\r\n\t * @brief Allocates memory so that the specified number of elements of\r\n\t * type T can be stored in *this* buffer object.\r\n\t *\r\n\t * @param Capacity Storage for this number of elements to allocate.\r\n\t */\r\n\r\n  void alloc(const int Capacity) {\r\n    R8BASSERT(Capacity > 0 || Capacity == 0);\r\n\r\n    freemem(Data0);\r\n    Data0 = allocmem((size_t)Capacity * sizeof(T) + Alignment);\r\n    Data = (T *)alignptr(Data0, Alignment);\r\n\r\n    R8BASSERT(Data0 != R8B_NULL || Capacity == 0);\r\n  }\r\n\r\n  /**\r\n\t * @brief Reallocates memory so that the specified number of elements of\r\n\t * type T can be stored in *this* buffer object. Previously allocated data\r\n\t * is copied to the new memory buffer.\r\n\t *\r\n\t * @param PrevCapacity Previous capacity of *this* buffer.\r\n\t * @param NewCapacity Storage for this number of elements to allocate.\r\n\t */\r\n\r\n  void realloc(const int PrevCapacity, const int NewCapacity) {\r\n    R8BASSERT(PrevCapacity >= 0);\r\n    R8BASSERT(NewCapacity >= 0);\r\n\r\n    void *const NewData0 = allocmem((size_t)NewCapacity * sizeof(T) + Alignment);\r\n\r\n    T *const NewData = (T *)alignptr(NewData0, Alignment);\r\n    const size_t CopySize =\r\n        (PrevCapacity > NewCapacity ? (size_t)NewCapacity : (size_t)PrevCapacity) * sizeof(T);\r\n\r\n    if (CopySize > 0) {\r\n      memcpy(NewData, Data, CopySize);\r\n    }\r\n\r\n    freemem(Data0);\r\n    Data0 = NewData0;\r\n    Data = NewData;\r\n\r\n    R8BASSERT(Data0 != R8B_NULL || NewCapacity == 0);\r\n  }\r\n\r\n  /**\r\n\t * @brief Deallocates a previously allocated buffer.\r\n\t */\r\n\r\n  void free() {\r\n    freemem(Data0);\r\n    Data0 = R8B_NULL;\r\n    Data = R8B_NULL;\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns pointer to the first element of the allocated buffer,\r\n\t * `nullptr`, if not allocated.\r\n\t */\r\n\r\n  operator T *() const {\r\n    return (Data);\r\n  }\r\n\r\n private:\r\n  static const size_t Alignment = 64; ///< Buffer address alignment, in\r\n                                      ///< bytes.\r\n  void *Data0;                        ///< Buffer pointer, original unaligned.\r\n  T *Data;                            ///< Element buffer pointer, aligned.\r\n};\r\n\r\n/**\r\n * @brief Pointer-to-object \"keeper\" class with automatic deletion.\r\n *\r\n * An auxiliary class that can be used for keeping a pointer to object that\r\n * should be deleted together with the \"keeper\" by calling object's \"delete\"\r\n * operator.\r\n *\r\n * @tparam T Type of the keeped object, must not include an additional\r\n * asterisk.\r\n */\r\n\r\ntemplate <typename T>\r\nclass CPtrKeeper {\r\n  R8BNOCTOR(CPtrKeeper)\r\n\r\n public:\r\n  CPtrKeeper() : Object(R8B_NULL) {}\r\n\r\n  /**\r\n\t * @brief Constructor assigns a pointer to object to *this* keeper.\r\n\t *\r\n\t * @param aObject Pointer to object to keep, can be `nullptr`.\r\n\t * @tparam T2 Object's pointer type.\r\n\t */\r\n\r\n  template <typename T2>\r\n  CPtrKeeper(T2 const aObject) : Object(aObject) {}\r\n\r\n  ~CPtrKeeper() {\r\n    delete Object;\r\n  }\r\n\r\n  /**\r\n\t * @brief Assigns a pointer to object to *this* keeper. A previously\r\n\t * keeped pointer will be reset and object deleted.\r\n\t *\r\n\t * @param aObject Pointer to object to keep, can be `nullptr`.\r\n\t * @tparam T2 Object's pointer type.\r\n\t */\r\n\r\n  template <typename T2>\r\n  void operator=(T2 const aObject) {\r\n    reset();\r\n    Object = aObject;\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns pointer to keeped object, or `nullptr`, if no object is\r\n\t * being kept.\r\n\t */\r\n\r\n  T *operator->() const {\r\n    return (Object);\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns pointer to keeped object, or `nullptr`, if no object is\r\n\t * kept.\r\n\t */\r\n\r\n  operator T *() const {\r\n    return (Object);\r\n  }\r\n\r\n  /**\r\n\t * @brief Resets the keeped pointer and deletes the keeped object.\r\n\t */\r\n\r\n  void reset() {\r\n    T *const DelObj = Object;\r\n    Object = R8B_NULL;\r\n    delete DelObj;\r\n  }\r\n\r\n  /**\r\n\t * @brief Returns the keeped pointer and resets it in *this* keeper\r\n\t * without object deletion.\r\n\t */\r\n\r\n  T *unkeep() {\r\n    T *const ResObject = Object;\r\n    Object = R8B_NULL;\r\n    return (ResObject);\r\n  }\r\n\r\n private:\r\n  T *Object; ///< Pointer to keeped object.\r\n};\r\n\r\n#if __cplusplus >= 201103L\r\n\r\ntypedef std ::mutex CSyncObject;                   ///< Mutex class.\r\ntypedef std ::lock_guard<std ::mutex> CSyncKeeper; ///< Mutex keeper class.\r\n\r\n#else // __cplusplus >= 201103L\r\n\r\n/**\r\n * @brief Multi-threaded synchronization object class.\r\n *\r\n * This class uses standard OS thread-locking (mutex) mechanism which is\r\n * fairly efficient in most cases.\r\n *\r\n * The acquire() function is re-enterant, and can be called recursively, in\r\n * the same thread, for this kind of thread-locking mechanism. This will not\r\n * produce a dead-lock.\r\n */\r\n\r\nclass CSyncObject {\r\n  R8BNOCTOR(CSyncObject)\r\n\r\n public:\r\n  CSyncObject() {\r\n#if defined(_WIN32)\r\n    InitializeCriticalSectionAndSpinCount(&CritSec, 2000);\r\n#else  // defined( _WIN32 )\r\n    pthread_mutexattr_t MutexAttrs;\r\n    pthread_mutexattr_init(&MutexAttrs);\r\n    pthread_mutexattr_settype(&MutexAttrs, PTHREAD_MUTEX_RECURSIVE);\r\n    pthread_mutex_init(&Mutex, &MutexAttrs);\r\n    pthread_mutexattr_destroy(&MutexAttrs);\r\n#endif // defined( _WIN32 )\r\n  }\r\n\r\n  ~CSyncObject() {\r\n#if defined(_WIN32)\r\n    DeleteCriticalSection(&CritSec);\r\n#else  // defined( _WIN32 )\r\n    pthread_mutex_destroy(&Mutex);\r\n#endif // defined( _WIN32 )\r\n  }\r\n\r\n  /**\r\n\t * @brief Acquires *this* thread synchronizer object immediately or\r\n\t * waits until another thread releases it.\r\n\t */\r\n\r\n  void acquire() {\r\n#if defined(_WIN32)\r\n    EnterCriticalSection(&CritSec);\r\n#else  // defined( _WIN32 )\r\n    pthread_mutex_lock(&Mutex);\r\n#endif // defined( _WIN32 )\r\n  }\r\n\r\n  /**\r\n\t * @brief Releases *this*, previously acquired, thread synchronizer\r\n\t * object.\r\n\t */\r\n\r\n  void release() {\r\n#if defined(_WIN32)\r\n    LeaveCriticalSection(&CritSec);\r\n#else  // defined( _WIN32 )\r\n    pthread_mutex_unlock(&Mutex);\r\n#endif // defined( _WIN32 )\r\n  }\r\n\r\n private:\r\n#if defined(_WIN32)\r\n  CRITICAL_SECTION CritSec; ///< Standard Windows critical section\r\n  ///< structure.\r\n#else  // defined( _WIN32 )\r\n  pthread_mutex_t Mutex; ///< pthread.h mutex object.\r\n#endif // defined( _WIN32 )\r\n};\r\n\r\n/**\r\n * @brief A \"keeper\" class for CSyncObject-based synchronization.\r\n *\r\n * Sync keeper class. The object of this class can be used as auto-init and\r\n * auto-deinit object for calling the acquire() and release() functions of an\r\n * object of the CSyncObject class. This \"keeper\" object is best used in\r\n * functions as an \"automatic\" object allocated on the stack, possibly via the\r\n * R8BSYNC() macro.\r\n */\r\n\r\nclass CSyncKeeper {\r\n  R8BNOCTOR(CSyncKeeper)\r\n\r\n public:\r\n  CSyncKeeper() : SyncObj(R8B_NULL) {}\r\n\r\n  /**\r\n\t * @brief Constructor acquires a specified synchronization object.\r\n \t *\r\n\t * @param aSyncObj Pointer to the sync object which should be used for\r\n\t * sync'ing, can be `nullptr`.\r\n\t */\r\n\r\n  CSyncKeeper(CSyncObject *const aSyncObj) : SyncObj(aSyncObj) {\r\n    if (SyncObj != R8B_NULL) {\r\n      SyncObj->acquire();\r\n    }\r\n  }\r\n\r\n  /**\r\n\t * @brief Constructor acquires a specified synchronization object.\r\n\t *\r\n\t * @param aSyncObj Reference to the sync object which should be used for\r\n\t * sync'ing.\r\n\t */\r\n\r\n  CSyncKeeper(CSyncObject &aSyncObj) : SyncObj(&aSyncObj) {\r\n    SyncObj->acquire();\r\n  }\r\n\r\n  ~CSyncKeeper() {\r\n    if (SyncObj != R8B_NULL) {\r\n      SyncObj->release();\r\n    }\r\n  }\r\n\r\n private:\r\n  CSyncObject *SyncObj; ///< Sync object in use (can be `nullptr`).\r\n};\r\n\r\n#endif // __cplusplus >= 201103L\r\n\r\n/**\r\n * @brief Thread synchronization macro.\r\n *\r\n * The R8BSYNC() macro, which creates and object of the r8b::CSyncKeeper class\r\n * on stack, should be put before sections of the code that may potentially\r\n * change data asynchronously with other threads at the same time.\r\n * The R8BSYNC() macro \"acquires\" the synchronization object thus blocking\r\n * execution of other threads that also use the same R8BSYNC() macro.\r\n * The blocked section begins with the R8BSYNC() macro and finishes at the end\r\n * of the current C++ code block. R8BSYNC() is re-enterant within the same\r\n * thread.\r\n *\r\n * @param SyncObject An object of the CSyncObject type that is used for\r\n * synchronization.\r\n */\r\n\r\n#define R8BSYNC(SyncObject) R8BSYNC1(SyncObject, __LINE__)\r\n#define R8BSYNC1(SyncObject, id) R8BSYNC2(SyncObject, id)                     ///< Aux macro.\r\n#define R8BSYNC2(SyncObject, id) const CSyncKeeper SyncKeeper##id(SyncObject) ///< Aux macro.\r\n\r\n/**\r\n * @brief Sine signal generator class.\r\n *\r\n * Class implements sine signal generator without biasing.\r\n */\r\n\r\nclass CSineGen {\r\n public:\r\n  CSineGen() {}\r\n\r\n  /**\r\n\t * @brief Constructor initializes *this* sine signal generator, with unity\r\n\t * gain output.\r\n\t *\r\n\t * @param si Sine function increment, in radians.\r\n\t * @param ph Starting phase, in radians. Add R8B_PId2 for cosine function.\r\n\t */\r\n\r\n  CSineGen(const double si, const double ph)\r\n      : svalue1(sin(ph)), svalue2(sin(ph - si)), sincr(2.0 * cos(si)) {}\r\n\r\n  /**\r\n\t * @brief Constructor initializes *this* sine signal generator.\r\n\t *\r\n\t * @param si Sine function increment, in radians.\r\n\t * @param ph Starting phase, in radians. Add R8B_PId2 for cosine function.\r\n\t * @param g The overall gain factor, 1.0 for unity gain (-1.0 to 1.0\r\n\t * amplitude).\r\n\t */\r\n\r\n  CSineGen(const double si, const double ph, const double g)\r\n      : svalue1(sin(ph) * g), svalue2(sin(ph - si) * g), sincr(2.0 * cos(si)) {}\r\n\r\n  /**\r\n\t * @brief Function initializes *this* sine signal generator, with unity\r\n\t * gain output.\r\n\t *\r\n\t * @param si Sine function increment, in radians.\r\n\t * @param ph Starting phase, in radians. Add R8B_PId2 for cosine function.\r\n\t */\r\n\r\n  void init(const double si, const double ph) {\r\n    svalue1 = sin(ph);\r\n    svalue2 = sin(ph - si);\r\n    sincr = 2.0 * cos(si);\r\n  }\r\n\r\n  /**\r\n\t * @brief Function initializes *this* sine signal generator.\r\n\t *\r\n\t * @param si Sine function increment, in radians.\r\n\t * @param ph Starting phase, in radians. Add R8B_PId2 for cosine function.\r\n\t * @param g The overall gain factor, 1.0 for unity gain (-1.0 to 1.0\r\n\t * amplitude).\r\n\t */\r\n\r\n  void init(const double si, const double ph, const double g) {\r\n    svalue1 = sin(ph) * g;\r\n    svalue2 = sin(ph - si) * g;\r\n    sincr = 2.0 * cos(si);\r\n  }\r\n\r\n  /**\r\n\t * @brief Generates the next sample.\r\n\t *\r\n\t * @return Next value of the sine function, without biasing.\r\n\t */\r\n\r\n  double generate() {\r\n    const double res = svalue1;\r\n\r\n    svalue1 = sincr * res - svalue2;\r\n    svalue2 = res;\r\n\r\n    return (res);\r\n  }\r\n\r\n private:\r\n  double svalue1; ///< Current sine value.\r\n  double svalue2; ///< Previous sine value.\r\n  double sincr;   ///< Sine value increment.\r\n};\r\n\r\n/**\r\n * @brief Calculate the exact number of bits a value needs for representation.\r\n *\r\n * @param v Input value.\r\n * @return Calculated bit occupancy of the specified input value. Bit\r\n * occupancy means how many significant lower bits are necessary to store a\r\n * specified value. Function treats the input value as unsigned.\r\n */\r\n\r\ninline int getBitOccupancy(const int v) {\r\n  static const unsigned char OccupancyTable[] = {\r\n      1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,\r\n      5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,\r\n      6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r\n      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,\r\n      7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\r\n      8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\r\n      8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\r\n      8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,\r\n      8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8};\r\n\r\n  const int tt = v >> 16;\r\n\r\n  if (tt != 0) {\r\n    const int t = v >> 24;\r\n\r\n    return (t != 0 ? 24 + OccupancyTable[t & 0xFF] : 16 + OccupancyTable[tt]);\r\n  } else {\r\n    const int t = v >> 8;\r\n\r\n    return (t != 0 ? 8 + OccupancyTable[t] : OccupancyTable[v]);\r\n  }\r\n}\r\n\r\n/**\r\n * @brief FIR filter's frequency response calculation.\r\n *\r\n * Function calculates frequency response of the specified FIR filter at the\r\n * specified circular frequency. Phase can be calculated as atan2( im, re ).\r\n *\r\n * @param flt FIR filter's coefficients.\r\n * @param fltlen Number of coefficients (taps) in the filter.\r\n * @param th Circular frequency [0; pi].\r\n * @param[out] re0 Resulting real part of the complex frequency response.\r\n * @param[out] im0 Resulting imaginary part of the complex frequency response.\r\n * @param fltlat Filter's latency, in samples.\r\n */\r\n\r\ninline void calcFIRFilterResponse(\r\n    const double *flt,\r\n    int fltlen,\r\n    const double th,\r\n    double &re0,\r\n    double &im0,\r\n    const int fltlat = 0) {\r\n  const double sincr = 2.0 * cos(th);\r\n  double cvalue1;\r\n  double svalue1;\r\n\r\n  if (fltlat == 0) {\r\n    cvalue1 = 1.0;\r\n    svalue1 = 0.0;\r\n  } else {\r\n    cvalue1 = cos(-fltlat * th);\r\n    svalue1 = sin(-fltlat * th);\r\n  }\r\n\r\n  double cvalue2 = cos(-(fltlat + 1) * th);\r\n  double svalue2 = sin(-(fltlat + 1) * th);\r\n\r\n  double re = 0.0;\r\n  double im = 0.0;\r\n\r\n  while (fltlen > 0) {\r\n    re += cvalue1 * flt[0];\r\n    im += svalue1 * flt[0];\r\n    flt++;\r\n    fltlen--;\r\n\r\n    double tmp = cvalue1;\r\n    cvalue1 = sincr * cvalue1 - cvalue2;\r\n    cvalue2 = tmp;\r\n\r\n    tmp = svalue1;\r\n    svalue1 = sincr * svalue1 - svalue2;\r\n    svalue2 = tmp;\r\n  }\r\n\r\n  re0 = re;\r\n  im0 = im;\r\n}\r\n\r\n/**\r\n * @brief FIR filter's group delay calculation function.\r\n *\r\n * Function calculates group delay of the specified FIR filter at the\r\n * specified circular frequency. The group delay is calculated by evaluating\r\n * the filter's response at close side-band frequencies of \"th\".\r\n *\r\n * @param flt FIR filter's coefficients.\r\n * @param fltlen Number of coefficients (taps) in the filter.\r\n * @param th Circular frequency [0; pi].\r\n * @return Resulting group delay at the specified frequency, in samples.\r\n */\r\n\r\ninline double calcFIRFilterGroupDelay(const double *const flt, const int fltlen, const double th) {\r\n  const int Count = 2;\r\n  const double thd2 = 1e-9;\r\n  double ths[Count] = {th - thd2, th + thd2}; // Side-band frequencies.\r\n\r\n  if (ths[0] < 0.0) {\r\n    ths[0] = 0.0;\r\n  }\r\n\r\n  if (ths[1] > R8B_PI) {\r\n    ths[1] = R8B_PI;\r\n  }\r\n\r\n  double ph1[Count];\r\n  int i;\r\n\r\n  for (i = 0; i < Count; i++) {\r\n    double re1;\r\n    double im1;\r\n\r\n    calcFIRFilterResponse(flt, fltlen, ths[i], re1, im1);\r\n    ph1[i] = atan2(im1, re1);\r\n  }\r\n\r\n  if (fabs(ph1[1] - ph1[0]) > R8B_PI) {\r\n    if (ph1[1] > ph1[0]) {\r\n      ph1[1] -= R8B_2PI;\r\n    } else {\r\n      ph1[1] += R8B_2PI;\r\n    }\r\n  }\r\n\r\n  const double thd = ths[1] - ths[0];\r\n\r\n  return ((ph1[1] - ph1[0]) / thd);\r\n}\r\n\r\n/**\r\n * @brief FIR filter's gain normalization.\r\n *\r\n * Function normalizes FIR filter so that its frequency response at DC is\r\n * equal to DCGain.\r\n *\r\n * @param[in,out] p Filter coefficients.\r\n * @param l Filter length.\r\n * @param DCGain Filter's gain at DC (linear, non-decibel value).\r\n * @param pstep \"p\" array step.\r\n */\r\n\r\ninline void\r\nnormalizeFIRFilter(double *const p, const int l, const double DCGain, const int pstep = 1) {\r\n  R8BASSERT(l > 0);\r\n  R8BASSERT(pstep != 0);\r\n\r\n  double s = 0.0;\r\n  double *pp = p;\r\n  int i = l;\r\n\r\n  while (i > 0) {\r\n    s += *pp;\r\n    pp += pstep;\r\n    i--;\r\n  }\r\n\r\n  s = DCGain / s;\r\n  pp = p;\r\n  i = l;\r\n\r\n  while (i > 0) {\r\n    *pp *= s;\r\n    pp += pstep;\r\n    i--;\r\n  }\r\n}\r\n\r\n/**\r\n * @brief Calculates 3rd order spline coefficients, using 8 points.\r\n *\r\n * Function calculates coefficients used to calculate 3rd order spline\r\n * (polynomial) on the equidistant lattice, using 8 points.\r\n *\r\n * @param[out] c Output coefficients buffer, length = 4.\r\n * @param xm3 Point at x-3 position.\r\n * @param xm2 Point at x-2 position.\r\n * @param xm1 Point at x-1 position.\r\n * @param x0 Point at x position.\r\n * @param x1 Point at x+1 position.\r\n * @param x2 Point at x+2 position.\r\n * @param x3 Point at x+3 position.\r\n * @param x4 Point at x+4 position.\r\n */\r\n\r\ninline void calcSpline3p8Coeffs(\r\n    double *const c,\r\n    const double xm3,\r\n    const double xm2,\r\n    const double xm1,\r\n    const double x0,\r\n    const double x1,\r\n    const double x2,\r\n    const double x3,\r\n    const double x4) {\r\n  c[0] = x0;\r\n  c[1] = (61.0 * (x1 - xm1) + 16.0 * (xm2 - x2) + 3.0 * (x3 - xm3)) * 1.31578947368421052e-2;\r\n\r\n  c[2] = (106.0 * (xm1 + x1) + 10.0 * x3 + 6.0 * xm3 - 3.0 * x4 - 29.0 * (xm2 + x2) - 167.0 * x0) *\r\n      1.31578947368421052e-2;\r\n\r\n  c[3] = (91.0 * (x0 - x1) + 45.0 * (x2 - xm1) + 13.0 * (xm2 - x3) + 3.0 * (x4 - xm3)) *\r\n      1.31578947368421052e-2;\r\n}\r\n\r\n/**\r\n * @brief Calculates 2nd order spline coefficients, using 8 points.\r\n *\r\n * Function calculates coefficients used to calculate 2nd order spline\r\n * (polynomial) on the equidistant lattice, using 8 points. This function is\r\n * based on the calcSpline3p8Coeffs() function, but without the 3rd order\r\n * coefficient.\r\n *\r\n * @param[out] c Output coefficients buffer, length = 3.\r\n * @param xm3 Point at x-3 position.\r\n * @param xm2 Point at x-2 position.\r\n * @param xm1 Point at x-1 position.\r\n * @param x0 Point at x position.\r\n * @param x1 Point at x+1 position.\r\n * @param x2 Point at x+2 position.\r\n * @param x3 Point at x+3 position.\r\n * @param x4 Point at x+4 position.\r\n */\r\n\r\ninline void calcSpline2p8Coeffs(\r\n    double *const c,\r\n    const double xm3,\r\n    const double xm2,\r\n    const double xm1,\r\n    const double x0,\r\n    const double x1,\r\n    const double x2,\r\n    const double x3,\r\n    const double x4) {\r\n  c[0] = x0;\r\n  c[1] = (61.0 * (x1 - xm1) + 16.0 * (xm2 - x2) + 3.0 * (x3 - xm3)) * 1.31578947368421052e-2;\r\n\r\n  c[2] = (106.0 * (xm1 + x1) + 10.0 * x3 + 6.0 * xm3 - 3.0 * x4 - 29.0 * (xm2 + x2) - 167.0 * x0) *\r\n      1.31578947368421052e-2;\r\n}\r\n\r\n/**\r\n * @brief Calculates 3rd order spline coefficients, using 4 points.\r\n *\r\n * Function calculates coefficients used to calculate 3rd order segment\r\n * interpolation polynomial on the equidistant lattice, using 4 points.\r\n *\r\n * @param[out] c Output coefficients buffer, length = 4.\r\n * @param[in] y Equidistant point values. Value at offset 1 corresponds to\r\n * x=0 point.\r\n */\r\n\r\ninline void calcSpline3p4Coeffs(double *const c, const double *const y) {\r\n  c[0] = y[1];\r\n  c[1] = 0.5 * (y[2] - y[0]);\r\n  c[2] = y[0] - 2.5 * y[1] + y[2] + y[2] - 0.5 * y[3];\r\n  c[3] = 0.5 * (y[3] - y[0]) + 1.5 * (y[1] - y[2]);\r\n}\r\n\r\n/**\r\n * @brief Calculates 3rd order spline coefficients, using 6 points.\r\n *\r\n * Function calculates coefficients used to calculate 3rd order segment\r\n * interpolation polynomial on the equidistant lattice, using 6 points.\r\n *\r\n * @param[out] c Output coefficients buffer, length = 4.\r\n * @param[in] y Equidistant point values. Value at offset 2 corresponds to\r\n * x=0 point.\r\n */\r\n\r\ninline void calcSpline3p6Coeffs(double *const c, const double *const y) {\r\n  c[0] = y[2];\r\n  c[1] = (11.0 * (y[3] - y[1]) + 2.0 * (y[0] - y[4])) / 14.0;\r\n  c[2] = (20.0 * (y[1] + y[3]) + 2.0 * y[5] - 4.0 * y[0] - 7.0 * y[4] - 31.0 * y[2]) / 14.0;\r\n\r\n  c[3] = (17.0 * (y[2] - y[3]) + 9.0 * (y[4] - y[1]) + 2.0 * (y[0] - y[5])) / 14.0;\r\n}\r\n\r\n#if !defined(min)\r\n\r\n/**\r\n * @brief Returns minimum of two values.\r\n *\r\n * @param v1 Value 1.\r\n * @param v2 Value 2.\r\n * @tparam T Values' type.\r\n * @return The minimum of 2 values.\r\n */\r\n\r\ntemplate <typename T>\r\ninline T min(const T &v1, const T &v2) {\r\n  return (v1 < v2 ? v1 : v2);\r\n}\r\n\r\n#endif // !defined( min )\r\n\r\n#if !defined(max)\r\n\r\n/**\r\n * @brief Returns maximum of two values.\r\n *\r\n * @param v1 Value 1.\r\n * @param v2 Value 2.\r\n * @tparam T Values' type.\r\n * @return The maximum of 2 values.\r\n */\r\n\r\ntemplate <typename T>\r\ninline T max(const T &v1, const T &v2) {\r\n  return (v1 > v2 ? v1 : v2);\r\n}\r\n\r\n#endif // !defined( max )\r\n\r\n/**\r\n * @brief Clamps a value to be within the specified min-max range.\r\n *\r\n * Function \"clamps\" (clips) the specified value so that it is not lesser than\r\n * \"minv\", and not greater than \"maxv\".\r\n *\r\n * @param Value Value to clamp.\r\n * @param minv Minimal allowed value.\r\n * @param maxv Maximal allowed value.\r\n * @return \"Clamped\" value.\r\n */\r\n\r\ninline double clampr(const double Value, const double minv, const double maxv) {\r\n  if (Value < minv) {\r\n    return (minv);\r\n  }\r\n\r\n  if (Value > maxv) {\r\n    return (maxv);\r\n  }\r\n\r\n  return (Value);\r\n}\r\n\r\n/**\r\n * @brief Returns square ot a value.\r\n *\r\n * @param x Value to square.\r\n * @return Squared value of the argument.\r\n */\r\n\r\ninline double sqr(const double x) {\r\n  return (x * x);\r\n}\r\n\r\n/**\r\n * @brief Power of an absolute value.\r\n *\r\n * @param v Input value.\r\n * @param p Power factor.\r\n * @return Returns a precise, but generally approximate pow() function's value\r\n * of absolute of input value.\r\n */\r\n\r\ninline double pow_a(const double v, const double p) {\r\n  return (exp(p * log(fabs(v) + 1e-300)));\r\n}\r\n\r\n/**\r\n * @brief Single-argument Gaussian function of a value.\r\n *\r\n * @param v Input value.\r\n * @return Calculated single-argument Gaussian function of the input value.\r\n */\r\n\r\ninline double gauss(const double v) {\r\n  return (exp(-(v * v)));\r\n}\r\n\r\n/**\r\n * @brief Hyperbolic sine of a value.\r\n *\r\n * @param v Input value.\r\n * @return Calculated inverse hyperbolic sine of the input value.\r\n */\r\n\r\ninline double asinh(const double v) {\r\n  return (log(v + sqrt(v * v + 1.0)));\r\n}\r\n\r\n/**\r\n * @brief 1st kind, 0th order modified Bessel function of a value.\r\n *\r\n * @param x Input value.\r\n * @return Calculated zero-th order modified Bessel function of the first kind\r\n * of the input value. Approximate value. Coefficients by Abramowitz and\r\n * Stegun.\r\n */\r\n\r\ninline double besselI0(const double x) {\r\n  const double ax = fabs(x);\r\n  double y;\r\n\r\n  if (ax < 3.75) {\r\n    y = x / 3.75;\r\n    y *= y;\r\n\r\n    return (\r\n        1.0 +\r\n        y *\r\n            (3.5156229 +\r\n             y *\r\n                 (3.0899424 +\r\n                  y * (1.2067492 + y * (0.2659732 + y * (0.360768e-1 + y * 0.45813e-2))))));\r\n  }\r\n\r\n  y = 3.75 / ax;\r\n\r\n  return (\r\n      exp(ax) / sqrt(ax) *\r\n      (0.39894228 +\r\n       y *\r\n           (0.1328592e-1 +\r\n            y *\r\n                (0.225319e-2 +\r\n                 y *\r\n                     (-0.157565e-2 +\r\n                      y *\r\n                          (0.916281e-2 +\r\n                           y *\r\n                               (-0.2057706e-1 +\r\n                                y * (0.2635537e-1 + y * (-0.1647633e-1 + y * 0.392377e-2)))))))));\r\n}\r\n\r\n} // namespace r8b\r\n\r\n#endif // R8BBASE_INCLUDED\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/r8bconf.h",
    "content": "//$ nobt\r\n//$ nocpp\r\n\r\n/**\r\n * @file r8bconf.h\r\n *\r\n * @brief The \"configuration\" inclusion file you can modify.\r\n *\r\n * This is the \"configuration\" inclusion file for the \"r8brain-free-src\"\r\n * sample rate converter. You may redefine the macros here as you see fit.\r\n *\r\n * r8brain-free-src Copyright (c) 2013-2025 Aleksey Vaneev\r\n *\r\n * See the \"LICENSE\" file for license.\r\n */\r\n\r\n#ifndef R8BCONF_INCLUDED\r\n#define R8BCONF_INCLUDED\r\n\r\n#if !defined(R8BASSERT)\r\n/**\r\n\t * @brief Assertion macro used to check for certain run-time conditions.\r\n\t * By default, no action is taken if assertion fails.\r\n\t *\r\n\t * @param e Expression to check.\r\n\t */\r\n\r\n#define R8BASSERT(e) (void)0\r\n#endif // !defined( R8BASSERT )\r\n\r\n#if !defined(R8BCONSOLE)\r\n/**\r\n\t * @brief Console output macro, used to output various resampler status\r\n\t * strings, including filter design parameters, convolver parameters.\r\n\t *\r\n\t * @param ... Expression sent to the console. Usually consists of a\r\n\t * standard printf() format string followed by several parameters\r\n\t * (`__VA_ARGS__`).\r\n\t */\r\n\r\n#define R8BCONSOLE(...) (void)0\r\n#endif // !defined( R8BCONSOLE )\r\n\r\n#if !defined(R8B_BASECLASS)\r\n/**\r\n\t * @brief Macro defines the name of the class from which all classes that\r\n\t * are designed to be created on heap are derived.\r\n\t *\r\n\t * The default r8b::CStdClassAllocator class uses \"stdlib\" memory\r\n\t * allocation functions.\r\n\t *\r\n\t * The classes that are best placed on stack or used as class members are\r\n\t * not derived from any class.\r\n\t */\r\n\r\n#define R8B_BASECLASS ::r8b ::CStdClassAllocator\r\n#endif // !defined( R8B_BASECLASS )\r\n\r\n#if !defined(R8B_MEMALLOCCLASS)\r\n/**\r\n\t * @brief Macro defines the name of the class that implements raw memory\r\n\t * allocation functions, see the r8b::CStdMemAllocator class for details.\r\n\t */\r\n\r\n#define R8B_MEMALLOCCLASS ::r8b ::CStdMemAllocator\r\n#endif // !defined( R8B_MEMALLOCCLASS )\r\n\r\n#if !defined(R8B_DSPBASECLASS)\r\n/**\r\n\t * @brief Macro defines the name of the class from which all CDSPProcessor\r\n\t * objects are derived.\r\n\t *\r\n\t * The default value is R8B_BASECLASS.\r\n\t *\r\n\t * These objects are dynamically allocated, but are not cached in the\r\n\t * global static variables.\r\n\t */\r\n\r\n#define R8B_DSPBASECLASS R8B_BASECLASS\r\n#endif // !defined( R8B_DSPBASECLASS )\r\n\r\n#if !defined(R8B_FILTER_CACHE_MAX)\r\n/**\r\n\t * @brief Macro specifies the number of filters kept in the cache at most.\r\n\t *\r\n\t * The actual number can be higher, if many different filters are in use\r\n\t * at the same time.\r\n\t */\r\n\r\n#define R8B_FILTER_CACHE_MAX 96\r\n#endif // !defined( R8B_FILTER_CACHE_MAX )\r\n\r\n#if !defined(R8B_FRACBANK_CACHE_MAX)\r\n/**\r\n\t * @brief Macro specifies the number of whole-number stepping fractional\r\n\t * delay filter banks kept in the cache at most.\r\n\t *\r\n\t * The actual number can be higher, if many different filter banks are in\r\n\t * use at the same time. As filter banks are usually big objects, it is\r\n\t * advisable to keep this cache size small.\r\n\t */\r\n\r\n#define R8B_FRACBANK_CACHE_MAX 12\r\n#endif // !defined( R8B_FRACBANK_CACHE_MAX )\r\n\r\n#if !defined(R8B_FLTTEST)\r\n/**\r\n\t * @brief This macro, when equal to 1, enables fractional delay filter\r\n\t * bank testing.\r\n\t *\r\n\t * In this mode, the filter bank becomes a dynamic member of the\r\n\t * CDSPFracInterpolator object instead of being a global static object.\r\n\t */\r\n\r\n#define R8B_FLTTEST 0\r\n#endif // !defined( R8B_FLTTEST )\r\n\r\n#if !defined(R8B_FASTTIMING)\r\n/**\r\n\t * @brief This macro, when equal to 1, enables a fast interpolation sample\r\n\t * timing technique.\r\n\t *\r\n\t * This technique improves interpolation performance (by around 10%) at\r\n\t * the expense of a minor sample-timing drift which is on the order of\r\n\t * 1e-6 samples per 10 billion output samples. This setting does not apply\r\n\t * to whole-number stepping, if it is in use, as such stepping provides\r\n\t * zero timing error without performance impact. Also does not apply to\r\n\t * cases when a whole-numbered (2X, 3X, etc.) resampling is in the actual\r\n\t * use.\r\n\t */\r\n\r\n#define R8B_FASTTIMING 0\r\n#endif // !defined( R8B_FASTTIMING )\r\n\r\n#if !defined(R8B_EXTFFT)\r\n/**\r\n\t * @brief This macro, when equal to 1, extends length of low-pass filters'\r\n\t * FFT block by a factor of 2, by zero-padding it.\r\n\t *\r\n\t * This usually improves the overall time performance of the resampler at\r\n\t * the expense of a higher overall latency (initial processing delay).\r\n\t * If such delay is not an issue, setting this macro to 1 is preferrable.\r\n\t * This macro can only have a value of 0 or 1.\r\n\t */\r\n\r\n#define R8B_EXTFFT 0\r\n#endif // !defined( R8B_EXTFFT )\r\n\r\n#if !defined(R8B_IPP)\r\n/**\r\n\t * @brief Set this macro definition to 1 to enable the use of Intel IPP's\r\n\t * fast Fourier transform functions. Also uncomment and correct the IPP\r\n\t * header inclusion macros.\r\n\t *\r\n\t * Do not forget to call the ippInit() function at the start of the\r\n\t * application, before using this library's functions.\r\n\t */\r\n\r\n#define R8B_IPP 0\r\n\r\n//\t#include <ippcore.h>\r\n//\t#include <ipps.h>\r\n#endif // !defined( R8B_IPP )\r\n\r\n#if !defined(R8B_PFFFT_DOUBLE)\r\n/**\r\n\t * @brief When defined as 1, enables PFFFT \"double\" routines which are\r\n\t * fast, and which provide the highest precision.\r\n\t */\r\n\r\n#define R8B_PFFFT_DOUBLE 0\r\n#endif // !defined( R8B_PFFFT_DOUBLE )\r\n\r\n#if !defined(R8B_PFFFT)\r\n/**\r\n\t * @brief When defined as 1, enables PFFFT routines which are fast, but\r\n\t * which are limited to 24-bit precision.\r\n\t *\r\n\t * May be a good choice for time-series interpolation, when stop-band\r\n\t * attenuation higher than 120 dB is not required.\r\n\t */\r\n\r\n#define R8B_PFFFT 0\r\n#else // !defined( R8B_PFFFT )\r\n#if R8B_PFFFT && R8B_PFFFT_DOUBLE\r\n// Handle the case when both `R8B_PFFFT` and `R8B_PFFFT_DOUBLE` were\r\n// enabled together by mistake.\r\n\r\n#error r8brain-free-src: R8B_PFFFT and R8B_PFFFT_DOUBLE collision.\r\n#endif // R8B_PFFFT && R8B_PFFFT_DOUBLE\r\n#endif // !defined( R8B_PFFFT )\r\n\r\n#if R8B_PFFFT\r\n#define R8B_FLOATFFT 1\r\n#endif // R8B_PFFFT\r\n\r\n#if !defined(R8B_FLOATFFT)\r\n/**\r\n\t * @brief The macro enables double-to-float buffer conversions for FFT\r\n\t * operations, for algorithms that work with \"float\" values.\r\n\t *\r\n\t * This macro should not be changed from the default `0` here.\r\n\t */\r\n\r\n#define R8B_FLOATFFT 0\r\n#endif // !defined( R8B_FLOATFFT )\r\n\r\n#endif // R8BCONF_INCLUDED\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/dsp/r8brain/r8butil.h",
    "content": "//$ nobt\r\n//$ nocpp\r\n\r\n/**\r\n * @file r8butil.h\r\n *\r\n * @brief The inclusion file with several utility functions.\r\n *\r\n * This file includes several utility functions used by various utility\r\n * programs like \"calcErrorTable.cpp\".\r\n *\r\n * r8brain-free-src Copyright (c) 2013-2025 Aleksey Vaneev\r\n *\r\n * See the \"LICENSE\" file for license.\r\n */\r\n\r\n#ifndef R8BUTIL_INCLUDED\r\n#define R8BUTIL_INCLUDED\r\n\r\n#include \"r8bbase.h\"\r\n\r\nnamespace r8b {\r\n\r\n/**\r\n * @brief Converts complex response into magnitude in log scale.\r\n *\r\n * @param re Real part of the frequency response.\r\n * @param im Imaginary part of the frequency response.\r\n * @return A magnitude response value converted from the linear scale to the\r\n * logarithmic scale.\r\n */\r\n\r\ninline double convertResponseToLog(const double re, const double im) {\r\n  return (4.34294481903251828 * log(re * re + im * im + 1e-100));\r\n}\r\n\r\n/**\r\n * @brief An utility function that performs frequency response scanning step\r\n * update based on the current magnitude response's slope.\r\n *\r\n * @param[in,out] step The current scanning step. Will be updated on\r\n * function's return. Must be a positive value.\r\n * @param curg Squared magnitude response at the current frequency point.\r\n * @param[in,out] prevg_log Previous magnitude response, log scale. Will be\r\n * updated on function's return.\r\n * @param prec Precision multiplier, affects the size of the step.\r\n * @param maxstep The maximal allowed step.\r\n * @param minstep The minimal allowed step.\r\n */\r\n\r\ninline void updateScanStep(\r\n    double &step,\r\n    const double curg,\r\n    double &prevg_log,\r\n    const double prec,\r\n    const double maxstep,\r\n    const double minstep = 1e-11) {\r\n  double curg_log = 4.34294481903251828 * log(curg + 1e-100);\r\n  curg_log += (prevg_log - curg_log) * 0.7;\r\n\r\n  const double slope = fabs(curg_log - prevg_log);\r\n  prevg_log = curg_log;\r\n\r\n  if (slope > 0.0) {\r\n    step /= prec * slope;\r\n    step = max(min(step, maxstep), minstep);\r\n  }\r\n}\r\n\r\n/**\r\n * @brief Locates normalized frequency at which the minimum filter gain is\r\n * reached.\r\n *\r\n * The scanning is performed from lower (left) to higher (right) frequencies,\r\n * the whole range is scanned.\r\n *\r\n * Function expects that the magnitude response is always reducing from lower\r\n * to high frequencies, starting at \"minth\".\r\n *\r\n * @param flt Filter response.\r\n * @param fltlen Filter response's length in samples (taps).\r\n * @param[out] ming The current minimal gain (squared). On function's return\r\n * will contain the minimal gain value found (squared).\r\n * @param[out] minth The normalized frequency where the minimal gain is\r\n * currently at. On function's return will point to the normalized frequency\r\n * where the new minimum was found.\r\n * @param thend The ending frequency, inclusive.\r\n */\r\n\r\ninline void findFIRFilterResponseMinLtoR(\r\n    const double *const flt,\r\n    const int fltlen,\r\n    double &ming,\r\n    double &minth,\r\n    const double thend) {\r\n  const double maxstep = minth * 2e-3;\r\n  double curth = minth;\r\n  double re;\r\n  double im;\r\n  calcFIRFilterResponse(flt, fltlen, R8B_PI * curth, re, im);\r\n  double prevg_log = convertResponseToLog(re, im);\r\n  double step = 1e-11;\r\n\r\n  while (true) {\r\n    curth += step;\r\n\r\n    if (curth > thend) {\r\n      break;\r\n    }\r\n\r\n    calcFIRFilterResponse(flt, fltlen, R8B_PI * curth, re, im);\r\n    const double curg = re * re + im * im;\r\n\r\n    if (curg > ming) {\r\n      ming = curg;\r\n      minth = curth;\r\n      break;\r\n    }\r\n\r\n    ming = curg;\r\n    minth = curth;\r\n\r\n    updateScanStep(step, curg, prevg_log, 0.31, maxstep);\r\n  }\r\n}\r\n\r\n/**\r\n * @brief Locates normalized frequency at which the maximal filter gain is\r\n * reached.\r\n *\r\n * The scanning is performed from lower (left) to higher (right) frequencies,\r\n * the whole range is scanned.\r\n *\r\n * Note: this function may \"stall\" in very rare cases if the magnitude\r\n * response happens to be \"saw-tooth\" like, requiring a very small stepping to\r\n * be used. If this happens, it may take dozens of seconds to complete.\r\n *\r\n * @param flt Filter response.\r\n * @param fltlen Filter response's length in samples (taps).\r\n * @param[out] maxg The current maximal gain (squared). On function's return\r\n * will contain the maximal gain value (squared).\r\n * @param[out] maxth The normalized frequency where the maximal gain is\r\n * currently at. On function's return will point to the normalized frequency\r\n * where the maximum was reached.\r\n * @param thend The ending frequency, inclusive.\r\n */\r\n\r\ninline void findFIRFilterResponseMaxLtoR(\r\n    const double *const flt,\r\n    const int fltlen,\r\n    double &maxg,\r\n    double &maxth,\r\n    const double thend) {\r\n  const double maxstep = maxth * 1e-4;\r\n  double premaxth = maxth;\r\n  double premaxg = maxg;\r\n  double postmaxth = maxth;\r\n  double postmaxg = maxg;\r\n\r\n  double prevth = maxth;\r\n  double prevg = maxg;\r\n  double curth = maxth;\r\n  double re;\r\n  double im;\r\n  calcFIRFilterResponse(flt, fltlen, R8B_PI * curth, re, im);\r\n  double prevg_log = convertResponseToLog(re, im);\r\n  double step = 1e-11;\r\n\r\n  bool WasPeak = false;\r\n  int AfterPeakCount = 0;\r\n\r\n  while (true) {\r\n    curth += step;\r\n\r\n    if (curth > thend) {\r\n      break;\r\n    }\r\n\r\n    calcFIRFilterResponse(flt, fltlen, R8B_PI * curth, re, im);\r\n    const double curg = re * re + im * im;\r\n\r\n    if (curg > maxg) {\r\n      premaxth = prevth;\r\n      premaxg = prevg;\r\n      maxg = curg;\r\n      maxth = curth;\r\n      WasPeak = true;\r\n      AfterPeakCount = 0;\r\n    } else if (WasPeak) {\r\n      if (AfterPeakCount == 0) {\r\n        postmaxth = curth;\r\n        postmaxg = curg;\r\n      }\r\n\r\n      if (AfterPeakCount == 5) {\r\n        // Perform 2 approximate binary searches.\r\n\r\n        int k;\r\n\r\n        for (k = 0; k < 2; k++) {\r\n          double l = (k == 0 ? premaxth : maxth);\r\n          double curgl = (k == 0 ? premaxg : maxg);\r\n          double r = (k == 0 ? maxth : postmaxth);\r\n          double curgr = (k == 0 ? maxg : postmaxg);\r\n\r\n          while (true) {\r\n            const double c = (l + r) * 0.5;\r\n            calcFIRFilterResponse(flt, fltlen, R8B_PI * c, re, im);\r\n\r\n            const double curg = re * re + im * im;\r\n\r\n            if (curgl > curgr) {\r\n              r = c;\r\n              curgr = curg;\r\n            } else {\r\n              l = c;\r\n              curgl = curg;\r\n            }\r\n\r\n            if (r - l < 1e-11) {\r\n              if (curgl > curgr) {\r\n                maxth = l;\r\n                maxg = curgl;\r\n              } else {\r\n                maxth = r;\r\n                maxg = curgr;\r\n              }\r\n\r\n              break;\r\n            }\r\n          }\r\n        }\r\n\r\n        break;\r\n      }\r\n\r\n      AfterPeakCount++;\r\n    }\r\n\r\n    prevth = curth;\r\n    prevg = curg;\r\n\r\n    updateScanStep(step, curg, prevg_log, 1.0, maxstep);\r\n  }\r\n}\r\n\r\n/**\r\n * @brief Locates normalized frequency at which the specified maximum filter\r\n * gain is reached.\r\n *\r\n * The scanning is performed from higher (right) to lower (left) frequencies,\r\n * scanning stops when the required gain value was crossed. Function uses an\r\n * extremely efficient binary search and thus expects that the magnitude\r\n * response has the \"main lobe\" form produced by windowing, with a minimal\r\n * pass-band ripple.\r\n *\r\n * @param flt Filter response.\r\n * @param fltlen Filter response's length in samples (taps).\r\n * @param maxg Maximal gain (squared).\r\n * @param[out] th The current normalized frequency. On function's return will\r\n * point to the normalized frequency where \"maxg\" is reached.\r\n * @param thend The leftmost frequency to scan, inclusive.\r\n */\r\n\r\ninline void findFIRFilterResponseLevelRtoL(\r\n    const double *const flt,\r\n    const int fltlen,\r\n    const double maxg,\r\n    double &th,\r\n    const double thend) {\r\n  // Perform exact binary search.\r\n\r\n  double l = thend;\r\n  double r = th;\r\n\r\n  while (true) {\r\n    const double c = (l + r) * 0.5;\r\n\r\n    if (r - l < 1e-14) {\r\n      th = c;\r\n      break;\r\n    }\r\n\r\n    double re;\r\n    double im;\r\n    calcFIRFilterResponse(flt, fltlen, R8B_PI * c, re, im);\r\n    const double curg = re * re + im * im;\r\n\r\n    if (curg > maxg) {\r\n      l = c;\r\n    } else {\r\n      r = c;\r\n    }\r\n  }\r\n}\r\n\r\n} // namespace r8b\r\n\r\n#endif // R8BUTIL_INCLUDED\r\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/events/AudioEvent.h",
    "content": "#pragma once\n\n#include <cstdint>\n\nnamespace audioapi {\n\nenum class AudioEvent : uint8_t {\n  PLAYBACK_NOTIFICATION_PLAY,\n  PLAYBACK_NOTIFICATION_PAUSE,\n  PLAYBACK_NOTIFICATION_STOP,\n  PLAYBACK_NOTIFICATION_NEXT_TRACK,\n  PLAYBACK_NOTIFICATION_PREVIOUS_TRACK,\n  PLAYBACK_NOTIFICATION_SKIP_FORWARD,\n  PLAYBACK_NOTIFICATION_SKIP_BACKWARD,\n  PLAYBACK_NOTIFICATION_SEEK_FORWARD,\n  PLAYBACK_NOTIFICATION_SEEK_BACKWARD,\n  PLAYBACK_NOTIFICATION_SEEK_TO,\n  PLAYBACK_NOTIFICATION_DISMISSED,\n  RECORDING_NOTIFICATION_RESUME,\n  RECORDING_NOTIFICATION_PAUSE,\n  ROUTE_CHANGE,\n  INTERRUPTION,\n  VOLUME_CHANGE,\n  DUCK,\n  ENDED,\n  LOOP_ENDED,\n  AUDIO_READY,\n  POSITION_CHANGED,\n  BUFFER_ENDED,\n  RECORDER_ERROR,\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/events/AudioEventHandlerRegistry.cpp",
    "content": "#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <cstdio>\n#include <memory>\n#include <string>\n#include <unordered_map>\n\nnamespace audioapi {\n\nAudioEventHandlerRegistry::AudioEventHandlerRegistry(\n    jsi::Runtime *runtime,\n    const std::shared_ptr<react::CallInvoker> &callInvoker)\n    : IAudioEventHandlerRegistry(), callInvoker_(callInvoker), runtime_(runtime) {}\n\nAudioEventHandlerRegistry::~AudioEventHandlerRegistry() {\n  eventHandlers_.clear();\n}\n\nuint64_t AudioEventHandlerRegistry::registerHandler(\n    AudioEvent eventName,\n    const std::shared_ptr<jsi::Function> &handler) {\n  auto listenerId = listenerIdCounter_.fetch_add(1, std::memory_order_relaxed);\n\n  if (runtime_ == nullptr) {\n    // If runtime is not valid, we cannot register the handler\n    return 0;\n  }\n\n  auto weakSelf = weak_from_this();\n\n  // Read/Write on eventHandlers_ map only on the JS thread\n  callInvoker_->invokeAsync([weakSelf, eventName, listenerId, handler]() {\n    if (auto self = weakSelf.lock()) {\n      self->eventHandlers_[eventName][listenerId] = handler;\n    }\n  });\n\n  return listenerId;\n}\n\nvoid AudioEventHandlerRegistry::unregisterHandler(AudioEvent eventName, uint64_t listenerId) {\n  if (runtime_ == nullptr) {\n    // If runtime is not valid, we cannot unregister the handler\n    return;\n  }\n\n  auto weakSelf = weak_from_this();\n\n  // Read/Write on eventHandlers_ map only on the JS thread\n  callInvoker_->invokeAsync([weakSelf, eventName, listenerId]() {\n    if (auto self = weakSelf.lock()) {\n      auto it = self->eventHandlers_.find(eventName);\n\n      if (it == self->eventHandlers_.end()) {\n        return;\n      }\n\n      auto &handlersMap = it->second;\n      auto handlerIt = handlersMap.find(listenerId);\n\n      if (handlerIt != handlersMap.end()) {\n        handlersMap.erase(handlerIt);\n      }\n    }\n  });\n}\n\n// todo: refactor this method to be less complex and more readable\n// NOLINTNEXTLINE(readability-function-cognitive-complexity)\nvoid AudioEventHandlerRegistry::invokeHandlerWithEventBody(\n    AudioEvent eventName,\n    const std::unordered_map<std::string, EventValue> &body) {\n  if (runtime_ == nullptr) {\n    // If runtime is not valid, we cannot unregister the handler\n    return;\n  }\n\n  auto weakSelf = weak_from_this();\n\n  // Read/Write on eventHandlers_ map only on the JS thread\n  callInvoker_->invokeAsync([weakSelf, eventName, body]() {\n    if (auto self = weakSelf.lock()) {\n      auto it = self->eventHandlers_.find(eventName);\n\n      if (it == self->eventHandlers_.end()) {\n        // If the event name is not registered, we can skip invoking handlers\n        return;\n      }\n\n      auto handlersMap = it->second;\n\n      for (const auto &pair : handlersMap) {\n        auto handler = pair.second;\n\n        if (!handler || !handler->isFunction(*self->runtime_)) {\n          // If the handler is not valid, we can skip it\n          continue;\n        }\n\n        try {\n          jsi::Object eventObject(*self->runtime_);\n          // handle special logic for microphone, because we pass audio buffer\n          // which has significant size\n          if (eventName == AudioEvent::AUDIO_READY) {\n            auto bufferIt = body.find(\"buffer\");\n            if (bufferIt != body.end()) {\n              auto bufferHostObject = std::static_pointer_cast<AudioBufferHostObject>(\n                  std::get<std::shared_ptr<jsi::HostObject>>(bufferIt->second));\n              eventObject = self->createEventObject(body, bufferHostObject->getSizeInBytes());\n            }\n          } else {\n            eventObject = self->createEventObject(body);\n          }\n          handler->call(*self->runtime_, eventObject);\n        } catch (const std::exception &e) {\n          // re-throw the exception to be handled by the caller\n          // std::exception is safe to parse by the rn bridge\n          throw;\n        } catch (...) {\n          printf(\"Unknown exception occurred while invoking handler for event: %d\\n\", eventName);\n        }\n      }\n    }\n  });\n}\n\n// todo: refactor this method to be less complex and more readable\n// NOLINTNEXTLINE(readability-function-cognitive-complexity)\nvoid AudioEventHandlerRegistry::invokeHandlerWithEventBody(\n    AudioEvent eventName,\n    uint64_t listenerId,\n    const std::unordered_map<std::string, EventValue> &body) {\n  if (runtime_ == nullptr) {\n    // If runtime is not valid, we cannot unregister the handler\n    return;\n  }\n\n  auto weakSelf = weak_from_this();\n\n  // Read/Write on eventHandlers_ map only on the JS thread\n  callInvoker_->invokeAsync([weakSelf, eventName, listenerId, body]() {\n    if (auto self = weakSelf.lock()) {\n      auto it = self->eventHandlers_.find(eventName);\n\n      if (it == self->eventHandlers_.end()) {\n        // If the event name is not registered, we can skip invoking handlers\n        return;\n      }\n\n      auto handlerIt = it->second.find(listenerId);\n\n      if (handlerIt == it->second.end()) {\n        // If the listener ID is not registered, we can skip invoking handlers\n        return;\n      }\n\n      // Depending on how the AudioBufferSourceNode is handled on the JS side,\n      // it sometimes might enter race condition where the ABSN is deleted on JS\n      // side, but it is still processed on the audio thread, leading to a crash\n      // when f.e. `positionChanged` event is triggered.\n\n      // In case of debugging this, please increment the hours spent counter\n\n      // Hours spent on this: 8\n      try {\n        if (!handlerIt->second || !handlerIt->second->isFunction(*self->runtime_)) {\n          // If the handler is not valid, we can skip it\n          return;\n        }\n        jsi::Object eventObject(*self->runtime_);\n        // handle special logic for microphone, because we pass audio buffer which\n        // has significant size\n        if (eventName == AudioEvent::AUDIO_READY) {\n          auto bufferIt = body.find(\"buffer\");\n          if (bufferIt != body.end()) {\n            auto bufferHostObject = std::static_pointer_cast<AudioBufferHostObject>(\n                std::get<std::shared_ptr<jsi::HostObject>>(bufferIt->second));\n            eventObject = self->createEventObject(body, bufferHostObject->getSizeInBytes());\n          }\n        } else {\n          eventObject = self->createEventObject(body);\n        }\n        handlerIt->second->call(*self->runtime_, eventObject);\n      } catch (const std::exception &e) {\n        // re-throw the exception to be handled by the caller\n        // std::exception is safe to parse by the rn bridge\n        throw;\n      } catch (...) {\n        printf(\"Unknown exception occurred while invoking handler for event: %d\\n\", eventName);\n      }\n    }\n  });\n}\n\njsi::Object AudioEventHandlerRegistry::createEventObject(\n    const std::unordered_map<std::string, EventValue> &body) {\n  auto eventObject = jsi::Object(*runtime_);\n\n  for (const auto &pair : body) {\n    const auto *name = pair.first.data();\n    const auto &value = pair.second;\n\n    if (std::holds_alternative<int>(value)) {\n      eventObject.setProperty(*runtime_, name, std::get<int>(value));\n    } else if (std::holds_alternative<double>(value)) {\n      eventObject.setProperty(*runtime_, name, std::get<double>(value));\n    } else if (std::holds_alternative<float>(value)) {\n      eventObject.setProperty(*runtime_, name, std::get<float>(value));\n    } else if (std::holds_alternative<bool>(value)) {\n      eventObject.setProperty(*runtime_, name, std::get<bool>(value));\n    } else if (std::holds_alternative<std::string>(value)) {\n      eventObject.setProperty(*runtime_, name, std::get<std::string>(value));\n    } else if (std::holds_alternative<std::shared_ptr<jsi::HostObject>>(value)) {\n      auto hostObject = jsi::Object::createFromHostObject(\n          *runtime_, std::get<std::shared_ptr<jsi::HostObject>>(value));\n      eventObject.setProperty(*runtime_, name, hostObject);\n    }\n  }\n\n  return eventObject;\n}\n\njsi::Object AudioEventHandlerRegistry::createEventObject(\n    const std::unordered_map<std::string, EventValue> &body,\n    size_t memoryPressure) {\n  auto eventObject = createEventObject(body);\n  eventObject.setExternalMemoryPressure(*runtime_, memoryPressure);\n  return eventObject;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/events/AudioEventHandlerRegistry.h",
    "content": "#pragma once\n\n#include <ReactCommon/CallInvoker.h>\n#include <audioapi/events/AudioEvent.h>\n#include <audioapi/events/IAudioEventHandlerRegistry.h>\n#include <jsi/jsi.h>\n#include <atomic>\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <variant>\n\nnamespace audioapi {\nusing namespace facebook;\n\nusing EventValue =\n    std::variant<int, float, double, std::string, bool, std::shared_ptr<jsi::HostObject>>;\n\n/// @brief A registry for audio event handlers.\n/// It allows registering, unregistering, and invoking event handlers for audio events.\n/// State changes are performed only on the JS thread.\n/// State access is thread-safe via the RN CallInvoker.\nclass AudioEventHandlerRegistry : public IAudioEventHandlerRegistry,\n                                  public std::enable_shared_from_this<AudioEventHandlerRegistry> {\n public:\n  explicit AudioEventHandlerRegistry(\n      jsi::Runtime *runtime,\n      const std::shared_ptr<react::CallInvoker> &callInvoker);\n  ~AudioEventHandlerRegistry() override;\n\n  /// @brief Registers an event handler for a specific audio event.\n  /// @param eventName The name of the audio event.\n  /// @param handler The JavaScript function to be called when the event occurs.\n  /// @return A unique listener ID for the registered handler.\n  /// @note Thread safe\n  uint64_t registerHandler(AudioEvent eventName, const std::shared_ptr<jsi::Function> &handler)\n      override;\n\n  /// @brief Unregisters an event handler for a specific audio event using its listener ID.\n  /// @param eventName The name of the audio event.\n  /// @param listenerId The unique listener ID of the handler to be unregistered.\n  /// @note Thread safe\n  void unregisterHandler(AudioEvent eventName, uint64_t listenerId) override;\n\n  /// @brief Invokes the event handler(s) for a specific event with the provided event body.\n  /// @note Thread safe\n  void invokeHandlerWithEventBody(\n      AudioEvent eventName,\n      const std::unordered_map<std::string, EventValue> &body) override;\n\n  /// @brief Invokes the event handler(s) for a specific event with the provided event body.\n  /// @note Thread safe\n  void invokeHandlerWithEventBody(\n      AudioEvent eventName,\n      uint64_t listenerId,\n      const std::unordered_map<std::string, EventValue> &body) override;\n\n private:\n  std::atomic<uint64_t> listenerIdCounter_{1}; // Atomic counter for listener IDs\n\n  const std::shared_ptr<react::CallInvoker> callInvoker_;\n  jsi::Runtime *runtime_;\n  std::unordered_map<AudioEvent, std::unordered_map<uint64_t, std::shared_ptr<jsi::Function>>>\n      eventHandlers_;\n\n  jsi::Object createEventObject(const std::unordered_map<std::string, EventValue> &body);\n  jsi::Object createEventObject(\n      const std::unordered_map<std::string, EventValue> &body,\n      size_t memoryPressure);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/events/IAudioEventHandlerRegistry.h",
    "content": "#pragma once\n\n#include <ReactCommon/CallInvoker.h>\n#include <audioapi/events/AudioEvent.h>\n#include <jsi/jsi.h>\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <variant>\n\nnamespace audioapi {\n\nusing EventValue =\n    std::variant<int, float, double, std::string, bool, std::shared_ptr<facebook::jsi::HostObject>>;\n\nclass IAudioEventHandlerRegistry {\n public:\n  virtual ~IAudioEventHandlerRegistry() = default;\n\n  virtual uint64_t registerHandler(\n      AudioEvent eventName,\n      const std::shared_ptr<facebook::jsi::Function> &handler) = 0;\n  virtual void unregisterHandler(AudioEvent eventName, uint64_t listenerId) = 0;\n\n  virtual void invokeHandlerWithEventBody(\n      AudioEvent eventName,\n      const std::unordered_map<std::string, EventValue> &body) = 0;\n  virtual void invokeHandlerWithEventBody(\n      AudioEvent eventName,\n      uint64_t listenerId,\n      const std::unordered_map<std::string, EventValue> &body) = 0;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include/ogg/config_types.h",
    "content": "#ifndef __CONFIG_TYPES_H__\n#define __CONFIG_TYPES_H__\n\n/* these are filled in by configure or cmake*/\n#define INCLUDE_INTTYPES_H 1\n#define INCLUDE_STDINT_H 1\n#define INCLUDE_SYS_TYPES_H 1\n\n#if INCLUDE_INTTYPES_H\n#  include <inttypes.h>\n#endif\n#if INCLUDE_STDINT_H\n#  include <stdint.h>\n#endif\n#if INCLUDE_SYS_TYPES_H\n#  include <sys/types.h>\n#endif\n\ntypedef int16_t ogg_int16_t;\ntypedef uint16_t ogg_uint16_t;\ntypedef int32_t ogg_int32_t;\ntypedef uint32_t ogg_uint32_t;\ntypedef int64_t ogg_int64_t;\ntypedef uint64_t ogg_uint64_t;\n\n#endif\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include/ogg/ogg.h",
    "content": "/********************************************************************\n *                                                                  *\n * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *\n * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *\n * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *\n * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *\n *                                                                  *\n * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007             *\n * by the Xiph.Org Foundation http://www.xiph.org/                  *\n *                                                                  *\n ********************************************************************\n\n function: toplevel libogg include\n\n ********************************************************************/\n#ifndef _OGG_H\n#define _OGG_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <stddef.h>\n#include <ogg/os_types.h>\n\ntypedef struct {\n  void *iov_base;\n  size_t iov_len;\n} ogg_iovec_t;\n\ntypedef struct {\n  long endbyte;\n  int  endbit;\n\n  unsigned char *buffer;\n  unsigned char *ptr;\n  long storage;\n} oggpack_buffer;\n\n/* ogg_page is used to encapsulate the data in one Ogg bitstream page *****/\n\ntypedef struct {\n  unsigned char *header;\n  long header_len;\n  unsigned char *body;\n  long body_len;\n} ogg_page;\n\n/* ogg_stream_state contains the current encode/decode state of a logical\n   Ogg bitstream **********************************************************/\n\ntypedef struct {\n  unsigned char   *body_data;    /* bytes from packet bodies */\n  long    body_storage;          /* storage elements allocated */\n  long    body_fill;             /* elements stored; fill mark */\n  long    body_returned;         /* elements of fill returned */\n\n\n  int     *lacing_vals;      /* The values that will go to the segment table */\n  ogg_int64_t *granule_vals; /* granulepos values for headers. Not compact\n                                this way, but it is simple coupled to the\n                                lacing fifo */\n  long    lacing_storage;\n  long    lacing_fill;\n  long    lacing_packet;\n  long    lacing_returned;\n\n  unsigned char    header[282];      /* working space for header encode */\n  int              header_fill;\n\n  int     e_o_s;          /* set when we have buffered the last packet in the\n                             logical bitstream */\n  int     b_o_s;          /* set after we've written the initial page\n                             of a logical bitstream */\n  long    serialno;\n  long    pageno;\n  ogg_int64_t  packetno;  /* sequence number for decode; the framing\n                             knows where there's a hole in the data,\n                             but we need coupling so that the codec\n                             (which is in a separate abstraction\n                             layer) also knows about the gap */\n  ogg_int64_t   granulepos;\n\n} ogg_stream_state;\n\n/* ogg_packet is used to encapsulate the data and metadata belonging\n   to a single raw Ogg/Vorbis packet *************************************/\n\ntypedef struct {\n  unsigned char *packet;\n  long  bytes;\n  long  b_o_s;\n  long  e_o_s;\n\n  ogg_int64_t  granulepos;\n\n  ogg_int64_t  packetno;     /* sequence number for decode; the framing\n                                knows where there's a hole in the data,\n                                but we need coupling so that the codec\n                                (which is in a separate abstraction\n                                layer) also knows about the gap */\n} ogg_packet;\n\ntypedef struct {\n  unsigned char *data;\n  int storage;\n  int fill;\n  int returned;\n\n  int unsynced;\n  int headerbytes;\n  int bodybytes;\n} ogg_sync_state;\n\n/* Ogg BITSTREAM PRIMITIVES: bitstream ************************/\n\nextern void  oggpack_writeinit(oggpack_buffer *b);\nextern int   oggpack_writecheck(oggpack_buffer *b);\nextern void  oggpack_writetrunc(oggpack_buffer *b,long bits);\nextern void  oggpack_writealign(oggpack_buffer *b);\nextern void  oggpack_writecopy(oggpack_buffer *b,void *source,long bits);\nextern void  oggpack_reset(oggpack_buffer *b);\nextern void  oggpack_writeclear(oggpack_buffer *b);\nextern void  oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes);\nextern void  oggpack_write(oggpack_buffer *b,unsigned long value,int bits);\nextern long  oggpack_look(oggpack_buffer *b,int bits);\nextern long  oggpack_look1(oggpack_buffer *b);\nextern void  oggpack_adv(oggpack_buffer *b,int bits);\nextern void  oggpack_adv1(oggpack_buffer *b);\nextern long  oggpack_read(oggpack_buffer *b,int bits);\nextern long  oggpack_read1(oggpack_buffer *b);\nextern long  oggpack_bytes(oggpack_buffer *b);\nextern long  oggpack_bits(oggpack_buffer *b);\nextern unsigned char *oggpack_get_buffer(oggpack_buffer *b);\n\nextern void  oggpackB_writeinit(oggpack_buffer *b);\nextern int   oggpackB_writecheck(oggpack_buffer *b);\nextern void  oggpackB_writetrunc(oggpack_buffer *b,long bits);\nextern void  oggpackB_writealign(oggpack_buffer *b);\nextern void  oggpackB_writecopy(oggpack_buffer *b,void *source,long bits);\nextern void  oggpackB_reset(oggpack_buffer *b);\nextern void  oggpackB_writeclear(oggpack_buffer *b);\nextern void  oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes);\nextern void  oggpackB_write(oggpack_buffer *b,unsigned long value,int bits);\nextern long  oggpackB_look(oggpack_buffer *b,int bits);\nextern long  oggpackB_look1(oggpack_buffer *b);\nextern void  oggpackB_adv(oggpack_buffer *b,int bits);\nextern void  oggpackB_adv1(oggpack_buffer *b);\nextern long  oggpackB_read(oggpack_buffer *b,int bits);\nextern long  oggpackB_read1(oggpack_buffer *b);\nextern long  oggpackB_bytes(oggpack_buffer *b);\nextern long  oggpackB_bits(oggpack_buffer *b);\nextern unsigned char *oggpackB_get_buffer(oggpack_buffer *b);\n\n/* Ogg BITSTREAM PRIMITIVES: encoding **************************/\n\nextern int      ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op);\nextern int      ogg_stream_iovecin(ogg_stream_state *os, ogg_iovec_t *iov,\n                                   int count, long e_o_s, ogg_int64_t granulepos);\nextern int      ogg_stream_pageout(ogg_stream_state *os, ogg_page *og);\nextern int      ogg_stream_pageout_fill(ogg_stream_state *os, ogg_page *og, int nfill);\nextern int      ogg_stream_flush(ogg_stream_state *os, ogg_page *og);\nextern int      ogg_stream_flush_fill(ogg_stream_state *os, ogg_page *og, int nfill);\n\n/* Ogg BITSTREAM PRIMITIVES: decoding **************************/\n\nextern int      ogg_sync_init(ogg_sync_state *oy);\nextern int      ogg_sync_clear(ogg_sync_state *oy);\nextern int      ogg_sync_reset(ogg_sync_state *oy);\nextern int      ogg_sync_destroy(ogg_sync_state *oy);\nextern int      ogg_sync_check(ogg_sync_state *oy);\n\nextern char    *ogg_sync_buffer(ogg_sync_state *oy, long size);\nextern int      ogg_sync_wrote(ogg_sync_state *oy, long bytes);\nextern long     ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og);\nextern int      ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og);\nextern int      ogg_stream_pagein(ogg_stream_state *os, ogg_page *og);\nextern int      ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op);\nextern int      ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op);\n\n/* Ogg BITSTREAM PRIMITIVES: general ***************************/\n\nextern int      ogg_stream_init(ogg_stream_state *os,int serialno);\nextern int      ogg_stream_clear(ogg_stream_state *os);\nextern int      ogg_stream_reset(ogg_stream_state *os);\nextern int      ogg_stream_reset_serialno(ogg_stream_state *os,int serialno);\nextern int      ogg_stream_destroy(ogg_stream_state *os);\nextern int      ogg_stream_check(ogg_stream_state *os);\nextern int      ogg_stream_eos(ogg_stream_state *os);\n\nextern void     ogg_page_checksum_set(ogg_page *og);\n\nextern int      ogg_page_version(const ogg_page *og);\nextern int      ogg_page_continued(const ogg_page *og);\nextern int      ogg_page_bos(const ogg_page *og);\nextern int      ogg_page_eos(const ogg_page *og);\nextern ogg_int64_t  ogg_page_granulepos(const ogg_page *og);\nextern int      ogg_page_serialno(const ogg_page *og);\nextern long     ogg_page_pageno(const ogg_page *og);\nextern int      ogg_page_packets(const ogg_page *og);\n\nextern void     ogg_packet_clear(ogg_packet *op);\n\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif  /* _OGG_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include/ogg/os_types.h",
    "content": "/********************************************************************\n *                                                                  *\n * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *\n * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *\n * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *\n * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *\n *                                                                  *\n * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002             *\n * by the Xiph.Org Foundation http://www.xiph.org/                  *\n *                                                                  *\n ********************************************************************\n\n function: Define a consistent set of types on each platform.\n\n ********************************************************************/\n#ifndef _OS_TYPES_H\n#define _OS_TYPES_H\n\n/* make it easy on the folks that want to compile the libs with a\n   different malloc than stdlib */\n#define _ogg_malloc  malloc\n#define _ogg_calloc  calloc\n#define _ogg_realloc realloc\n#define _ogg_free    free\n\n#if defined(_WIN32)\n\n#  if defined(__CYGWIN__)\n#    include <stdint.h>\n     typedef int16_t ogg_int16_t;\n     typedef uint16_t ogg_uint16_t;\n     typedef int32_t ogg_int32_t;\n     typedef uint32_t ogg_uint32_t;\n     typedef int64_t ogg_int64_t;\n     typedef uint64_t ogg_uint64_t;\n#  elif defined(__MINGW32__)\n#    include <sys/types.h>\n     typedef short ogg_int16_t;\n     typedef unsigned short ogg_uint16_t;\n     typedef int ogg_int32_t;\n     typedef unsigned int ogg_uint32_t;\n     typedef long long ogg_int64_t;\n     typedef unsigned long long ogg_uint64_t;\n#  elif defined(__MWERKS__)\n     typedef long long ogg_int64_t;\n     typedef unsigned long long ogg_uint64_t;\n     typedef int ogg_int32_t;\n     typedef unsigned int ogg_uint32_t;\n     typedef short ogg_int16_t;\n     typedef unsigned short ogg_uint16_t;\n#  else\n#    if defined(_MSC_VER) && (_MSC_VER >= 1800) /* MSVC 2013 and newer */\n#      include <stdint.h>\n       typedef int16_t ogg_int16_t;\n       typedef uint16_t ogg_uint16_t;\n       typedef int32_t ogg_int32_t;\n       typedef uint32_t ogg_uint32_t;\n       typedef int64_t ogg_int64_t;\n       typedef uint64_t ogg_uint64_t;\n#    else\n       /* MSVC/Borland */\n       typedef __int64 ogg_int64_t;\n       typedef __int32 ogg_int32_t;\n       typedef unsigned __int32 ogg_uint32_t;\n       typedef unsigned __int64 ogg_uint64_t;\n       typedef __int16 ogg_int16_t;\n       typedef unsigned __int16 ogg_uint16_t;\n#    endif\n#  endif\n\n#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */\n\n#  include <sys/types.h>\n   typedef int16_t ogg_int16_t;\n   typedef u_int16_t ogg_uint16_t;\n   typedef int32_t ogg_int32_t;\n   typedef u_int32_t ogg_uint32_t;\n   typedef int64_t ogg_int64_t;\n   typedef u_int64_t ogg_uint64_t;\n\n#elif defined(__HAIKU__)\n\n  /* Haiku */\n#  include <sys/types.h>\n   typedef short ogg_int16_t;\n   typedef unsigned short ogg_uint16_t;\n   typedef int ogg_int32_t;\n   typedef unsigned int ogg_uint32_t;\n   typedef long long ogg_int64_t;\n   typedef unsigned long long ogg_uint64_t;\n\n#elif defined(__BEOS__)\n\n   /* Be */\n#  include <inttypes.h>\n   typedef int16_t ogg_int16_t;\n   typedef uint16_t ogg_uint16_t;\n   typedef int32_t ogg_int32_t;\n   typedef uint32_t ogg_uint32_t;\n   typedef int64_t ogg_int64_t;\n   typedef uint64_t ogg_uint64_t;\n\n#elif defined (__EMX__)\n\n   /* OS/2 GCC */\n   typedef short ogg_int16_t;\n   typedef unsigned short ogg_uint16_t;\n   typedef int ogg_int32_t;\n   typedef unsigned int ogg_uint32_t;\n   typedef long long ogg_int64_t;\n   typedef unsigned long long ogg_uint64_t;\n\n\n#elif defined (DJGPP)\n\n   /* DJGPP */\n   typedef short ogg_int16_t;\n   typedef int ogg_int32_t;\n   typedef unsigned int ogg_uint32_t;\n   typedef long long ogg_int64_t;\n   typedef unsigned long long ogg_uint64_t;\n\n#elif defined(R5900)\n\n   /* PS2 EE */\n   typedef long ogg_int64_t;\n   typedef unsigned long ogg_uint64_t;\n   typedef int ogg_int32_t;\n   typedef unsigned ogg_uint32_t;\n   typedef short ogg_int16_t;\n\n#elif defined(__SYMBIAN32__)\n\n   /* Symbian GCC */\n   typedef signed short ogg_int16_t;\n   typedef unsigned short ogg_uint16_t;\n   typedef signed int ogg_int32_t;\n   typedef unsigned int ogg_uint32_t;\n   typedef long long int ogg_int64_t;\n   typedef unsigned long long int ogg_uint64_t;\n\n#elif defined(__TMS320C6X__)\n\n   /* TI C64x compiler */\n   typedef signed short ogg_int16_t;\n   typedef unsigned short ogg_uint16_t;\n   typedef signed int ogg_int32_t;\n   typedef unsigned int ogg_uint32_t;\n   typedef long long int ogg_int64_t;\n   typedef unsigned long long int ogg_uint64_t;\n\n#else\n\n#  include <ogg/config_types.h>\n\n#endif\n\n#endif  /* _OS_TYPES_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include/opus/opus.h",
    "content": "/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited\n   Written by Jean-Marc Valin and Koen Vos */\n/*\n   Redistribution and use in source and binary forms, with or without\n   modification, are permitted provided that the following conditions\n   are met:\n\n   - Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\n   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\n   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n * @file opus.h\n * @brief Opus reference implementation API\n */\n\n#ifndef OPUS_H\n#define OPUS_H\n\n#include \"opus_types.h\"\n#include \"opus_defines.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * @mainpage Opus\n *\n * The Opus codec is designed for interactive speech and audio transmission over the Internet.\n * It is designed by the IETF Codec Working Group and incorporates technology from\n * Skype's SILK codec and Xiph.Org's CELT codec.\n *\n * The Opus codec is designed to handle a wide range of interactive audio applications,\n * including Voice over IP, videoconferencing, in-game chat, and even remote live music\n * performances. It can scale from low bit-rate narrowband speech to very high quality\n * stereo music. Its main features are:\n\n * @li Sampling rates from 8 to 48 kHz\n * @li Bit-rates from 6 kb/s to 510 kb/s\n * @li Support for both constant bit-rate (CBR) and variable bit-rate (VBR)\n * @li Audio bandwidth from narrowband to full-band\n * @li Support for speech and music\n * @li Support for mono and stereo\n * @li Support for multichannel (up to 255 channels)\n * @li Frame sizes from 2.5 ms to 60 ms\n * @li Good loss robustness and packet loss concealment (PLC)\n * @li Floating point and fixed-point implementation\n *\n * Documentation sections:\n * @li @ref opus_encoder\n * @li @ref opus_decoder\n * @li @ref opus_repacketizer\n * @li @ref opus_multistream\n * @li @ref opus_libinfo\n * @li @ref opus_custom\n */\n\n/** @defgroup opus_encoder Opus Encoder\n  * @{\n  *\n  * @brief This page describes the process and functions used to encode Opus.\n  *\n  * Since Opus is a stateful codec, the encoding process starts with creating an encoder\n  * state. This can be done with:\n  *\n  * @code\n  * int          error;\n  * OpusEncoder *enc;\n  * enc = opus_encoder_create(Fs, channels, application, &error);\n  * @endcode\n  *\n  * From this point, @c enc can be used for encoding an audio stream. An encoder state\n  * @b must @b not be used for more than one stream at the same time. Similarly, the encoder\n  * state @b must @b not be re-initialized for each frame.\n  *\n  * While opus_encoder_create() allocates memory for the state, it's also possible\n  * to initialize pre-allocated memory:\n  *\n  * @code\n  * int          size;\n  * int          error;\n  * OpusEncoder *enc;\n  * size = opus_encoder_get_size(channels);\n  * enc = malloc(size);\n  * error = opus_encoder_init(enc, Fs, channels, application);\n  * @endcode\n  *\n  * where opus_encoder_get_size() returns the required size for the encoder state. Note that\n  * future versions of this code may change the size, so no assumptions should be made about it.\n  *\n  * The encoder state is always continuous in memory and only a shallow copy is sufficient\n  * to copy it (e.g. memcpy())\n  *\n  * It is possible to change some of the encoder's settings using the opus_encoder_ctl()\n  * interface. All these settings already default to the recommended value, so they should\n  * only be changed when necessary. The most common settings one may want to change are:\n  *\n  * @code\n  * opus_encoder_ctl(enc, OPUS_SET_BITRATE(bitrate));\n  * opus_encoder_ctl(enc, OPUS_SET_COMPLEXITY(complexity));\n  * opus_encoder_ctl(enc, OPUS_SET_SIGNAL(signal_type));\n  * @endcode\n  *\n  * where\n  *\n  * @arg bitrate is in bits per second (b/s)\n  * @arg complexity is a value from 1 to 10, where 1 is the lowest complexity and 10 is the highest\n  * @arg signal_type is either OPUS_AUTO (default), OPUS_SIGNAL_VOICE, or OPUS_SIGNAL_MUSIC\n  *\n  * See @ref opus_encoderctls and @ref opus_genericctls for a complete list of parameters that can be set or queried. Most parameters can be set or changed at any time during a stream.\n  *\n  * To encode a frame, opus_encode() or opus_encode_float() must be called with exactly one frame (2.5, 5, 10, 20, 40 or 60 ms) of audio data:\n  * @code\n  * len = opus_encode(enc, audio_frame, frame_size, packet, max_packet);\n  * @endcode\n  *\n  * where\n  * <ul>\n  * <li>audio_frame is the audio data in opus_int16 (or float for opus_encode_float())</li>\n  * <li>frame_size is the duration of the frame in samples (per channel)</li>\n  * <li>packet is the byte array to which the compressed data is written</li>\n  * <li>max_packet is the maximum number of bytes that can be written in the packet (4000 bytes is recommended).\n  *     Do not use max_packet to control VBR target bitrate, instead use the #OPUS_SET_BITRATE CTL.</li>\n  * </ul>\n  *\n  * opus_encode() and opus_encode_float() return the number of bytes actually written to the packet.\n  * The return value <b>can be negative</b>, which indicates that an error has occurred. If the return value\n  * is 2 bytes or less, then the packet does not need to be transmitted (DTX).\n  *\n  * Once the encoder state if no longer needed, it can be destroyed with\n  *\n  * @code\n  * opus_encoder_destroy(enc);\n  * @endcode\n  *\n  * If the encoder was created with opus_encoder_init() rather than opus_encoder_create(),\n  * then no action is required aside from potentially freeing the memory that was manually\n  * allocated for it (calling free(enc) for the example above)\n  *\n  */\n\n/** Opus encoder state.\n  * This contains the complete state of an Opus encoder.\n  * It is position independent and can be freely copied.\n  * @see opus_encoder_create,opus_encoder_init\n  */\ntypedef struct OpusEncoder OpusEncoder;\n\n/** Gets the size of an <code>OpusEncoder</code> structure.\n  * @param[in] channels <tt>int</tt>: Number of channels.\n  *                                   This must be 1 or 2.\n  * @returns The size in bytes.\n  * @note Since this function does not take the application as input, it will overestimate\n  * the size required for OPUS_APPLICATION_RESTRICTED_SILK and OPUS_APPLICATION_RESTRICTED_CELT.\n  * That is generally not a problem, except when trying to know the size to use for a copy.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_encoder_get_size(int channels);\n\n/**\n */\n\n/** Allocates and initializes an encoder state.\n * There are three coding modes:\n *\n * @ref OPUS_APPLICATION_VOIP gives best quality at a given bitrate for voice\n *    signals. It enhances the  input signal by high-pass filtering and\n *    emphasizing formants and harmonics. Optionally  it includes in-band\n *    forward error correction to protect against packet loss. Use this\n *    mode for typical VoIP applications. Because of the enhancement,\n *    even at high bitrates the output may sound different from the input.\n *\n * @ref OPUS_APPLICATION_AUDIO gives best quality at a given bitrate for most\n *    non-voice signals like music. Use this mode for music and mixed\n *    (music/voice) content, broadcast, and applications requiring less\n *    than 15 ms of coding delay.\n *\n * @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY configures low-delay mode that\n *    disables the speech-optimized mode in exchange for slightly reduced delay.\n *    This mode can only be set on an newly initialized or freshly reset encoder\n *    because it changes the codec delay.\n *\n * This is useful when the caller knows that the speech-optimized modes will not be needed (use with caution).\n * @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz)\n *                                     This must be one of 8000, 12000, 16000,\n *                                     24000, or 48000.\n * @param [in] channels <tt>int</tt>: Number of channels (1 or 2) in input signal\n * @param [in] application <tt>int</tt>: Coding mode (one of @ref OPUS_APPLICATION_VOIP, @ref OPUS_APPLICATION_AUDIO, or @ref OPUS_APPLICATION_RESTRICTED_LOWDELAY)\n * @param [out] error <tt>int*</tt>: @ref opus_errorcodes\n * @note Regardless of the sampling rate and number channels selected, the Opus encoder\n * can switch to a lower audio bandwidth or number of channels if the bitrate\n * selected is too low. This also means that it is safe to always use 48 kHz stereo input\n * and let the encoder optimize the encoding.\n */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusEncoder *opus_encoder_create(\n    opus_int32 Fs,\n    int channels,\n    int application,\n    int *error\n);\n\n/** Initializes a previously allocated encoder state\n  * The memory pointed to by st must be at least the size returned by opus_encoder_get_size().\n  * This is intended for applications which use their own allocator instead of malloc.\n  * @see opus_encoder_create(),opus_encoder_get_size()\n  * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.\n  * @param [in] st <tt>OpusEncoder*</tt>: Encoder state\n  * @param [in] Fs <tt>opus_int32</tt>: Sampling rate of input signal (Hz)\n *                                      This must be one of 8000, 12000, 16000,\n *                                      24000, or 48000.\n  * @param [in] channels <tt>int</tt>: Number of channels (1 or 2) in input signal\n  * @param [in] application <tt>int</tt>: Coding mode (one of OPUS_APPLICATION_VOIP, OPUS_APPLICATION_AUDIO, or OPUS_APPLICATION_RESTRICTED_LOWDELAY)\n  * @retval #OPUS_OK Success or @ref opus_errorcodes\n  */\nOPUS_EXPORT int opus_encoder_init(\n    OpusEncoder *st,\n    opus_int32 Fs,\n    int channels,\n    int application\n) OPUS_ARG_NONNULL(1);\n\n/** Encodes an Opus frame.\n  * @param [in] st <tt>OpusEncoder*</tt>: Encoder state\n  * @param [in] pcm <tt>opus_int16*</tt>: Input signal (interleaved if 2 channels). length is frame_size*channels*sizeof(opus_int16)\n  * @param [in] frame_size <tt>int</tt>: Number of samples per channel in the\n  *                                      input signal.\n  *                                      This must be an Opus frame size for\n  *                                      the encoder's sampling rate.\n  *                                      For example, at 48 kHz the permitted\n  *                                      values are 120, 240, 480, 960, 1920,\n  *                                      and 2880.\n  *                                      Passing in a duration of less than\n  *                                      10 ms (480 samples at 48 kHz) will\n  *                                      prevent the encoder from using the LPC\n  *                                      or hybrid modes.\n  * @param [out] data <tt>unsigned char*</tt>: Output payload.\n  *                                            This must contain storage for at\n  *                                            least \\a max_data_bytes.\n  * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated\n  *                                                 memory for the output\n  *                                                 payload. This may be\n  *                                                 used to impose an upper limit on\n  *                                                 the instant bitrate, but should\n  *                                                 not be used as the only bitrate\n  *                                                 control. Use #OPUS_SET_BITRATE to\n  *                                                 control the bitrate.\n  * @returns The length of the encoded packet (in bytes) on success or a\n  *          negative error code (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode(\n    OpusEncoder *st,\n    const opus_int16 *pcm,\n    int frame_size,\n    unsigned char *data,\n    opus_int32 max_data_bytes\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);\n\n/** Encodes an Opus frame.\n  * @param [in] st <tt>OpusEncoder*</tt>: Encoder state\n  * @param [in] pcm <tt>opus_int32*</tt>: Input signal (interleaved if 2 channels) representing (or slightly exceeding) 24-bit values. length is frame_size*channels*sizeof(opus_int32)\n  * @param [in] frame_size <tt>int</tt>: Number of samples per channel in the\n  *                                      input signal.\n  *                                      This must be an Opus frame size for\n  *                                      the encoder's sampling rate.\n  *                                      For example, at 48 kHz the permitted\n  *                                      values are 120, 240, 480, 960, 1920,\n  *                                      and 2880.\n  *                                      Passing in a duration of less than\n  *                                      10 ms (480 samples at 48 kHz) will\n  *                                      prevent the encoder from using the LPC\n  *                                      or hybrid modes.\n  * @param [out] data <tt>unsigned char*</tt>: Output payload.\n  *                                            This must contain storage for at\n  *                                            least \\a max_data_bytes.\n  * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated\n  *                                                 memory for the output\n  *                                                 payload. This may be\n  *                                                 used to impose an upper limit on\n  *                                                 the instant bitrate, but should\n  *                                                 not be used as the only bitrate\n  *                                                 control. Use #OPUS_SET_BITRATE to\n  *                                                 control the bitrate.\n  * @returns The length of the encoded packet (in bytes) on success or a\n  *          negative error code (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode24(\n    OpusEncoder *st,\n    const opus_int32 *pcm,\n    int frame_size,\n    unsigned char *data,\n    opus_int32 max_data_bytes\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);\n\n/** Encodes an Opus frame from floating point input.\n  * @param [in] st <tt>OpusEncoder*</tt>: Encoder state\n  * @param [in] pcm <tt>float*</tt>: Input in float format (interleaved if 2 channels), with a normal range of +/-1.0.\n  *          Samples with a range beyond +/-1.0 are supported but will\n  *          be clipped by decoders using the integer API and should\n  *          only be used if it is known that the far end supports\n  *          extended dynamic range.\n  *          length is frame_size*channels*sizeof(float)\n  * @param [in] frame_size <tt>int</tt>: Number of samples per channel in the\n  *                                      input signal.\n  *                                      This must be an Opus frame size for\n  *                                      the encoder's sampling rate.\n  *                                      For example, at 48 kHz the permitted\n  *                                      values are 120, 240, 480, 960, 1920,\n  *                                      and 2880.\n  *                                      Passing in a duration of less than\n  *                                      10 ms (480 samples at 48 kHz) will\n  *                                      prevent the encoder from using the LPC\n  *                                      or hybrid modes.\n  * @param [out] data <tt>unsigned char*</tt>: Output payload.\n  *                                            This must contain storage for at\n  *                                            least \\a max_data_bytes.\n  * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated\n  *                                                 memory for the output\n  *                                                 payload. This may be\n  *                                                 used to impose an upper limit on\n  *                                                 the instant bitrate, but should\n  *                                                 not be used as the only bitrate\n  *                                                 control. Use #OPUS_SET_BITRATE to\n  *                                                 control the bitrate.\n  * @returns The length of the encoded packet (in bytes) on success or a\n  *          negative error code (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_encode_float(\n    OpusEncoder *st,\n    const float *pcm,\n    int frame_size,\n    unsigned char *data,\n    opus_int32 max_data_bytes\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);\n\n/** Frees an <code>OpusEncoder</code> allocated by opus_encoder_create().\n  * @param[in] st <tt>OpusEncoder*</tt>: State to be freed.\n  */\nOPUS_EXPORT void opus_encoder_destroy(OpusEncoder *st);\n\n/** Perform a CTL function on an Opus encoder.\n  *\n  * Generally the request and subsequent arguments are generated\n  * by a convenience macro.\n  * @param st <tt>OpusEncoder*</tt>: Encoder state.\n  * @param request This and all remaining parameters should be replaced by one\n  *                of the convenience macros in @ref opus_genericctls or\n  *                @ref opus_encoderctls.\n  * @see opus_genericctls\n  * @see opus_encoderctls\n  */\nOPUS_EXPORT int opus_encoder_ctl(OpusEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);\n/**@}*/\n\n/** @defgroup opus_decoder Opus Decoder\n  * @{\n  *\n  * @brief This page describes the process and functions used to decode Opus.\n  *\n  * The decoding process also starts with creating a decoder\n  * state. This can be done with:\n  * @code\n  * int          error;\n  * OpusDecoder *dec;\n  * dec = opus_decoder_create(Fs, channels, &error);\n  * @endcode\n  * where\n  * @li Fs is the sampling rate and must be 8000, 12000, 16000, 24000, or 48000\n  * @li channels is the number of channels (1 or 2)\n  * @li error will hold the error code in case of failure (or #OPUS_OK on success)\n  * @li the return value is a newly created decoder state to be used for decoding\n  *\n  * While opus_decoder_create() allocates memory for the state, it's also possible\n  * to initialize pre-allocated memory:\n  * @code\n  * int          size;\n  * int          error;\n  * OpusDecoder *dec;\n  * size = opus_decoder_get_size(channels);\n  * dec = malloc(size);\n  * error = opus_decoder_init(dec, Fs, channels);\n  * @endcode\n  * where opus_decoder_get_size() returns the required size for the decoder state. Note that\n  * future versions of this code may change the size, so no assumptions should be made about it.\n  *\n  * The decoder state is always continuous in memory and only a shallow copy is sufficient\n  * to copy it (e.g. memcpy())\n  *\n  * To decode a frame, opus_decode() or opus_decode_float() must be called with a packet of compressed audio data:\n  * @code\n  * frame_size = opus_decode(dec, packet, len, decoded, max_size, 0);\n  * @endcode\n  * where\n  *\n  * @li packet is the byte array containing the compressed data\n  * @li len is the exact number of bytes contained in the packet\n  * @li decoded is the decoded audio data in opus_int16 (or float for opus_decode_float())\n  * @li max_size is the max duration of the frame in samples (per channel) that can fit into the decoded_frame array\n  *\n  * opus_decode() and opus_decode_float() return the number of samples (per channel) decoded from the packet.\n  * If that value is negative, then an error has occurred. This can occur if the packet is corrupted or if the audio\n  * buffer is too small to hold the decoded audio.\n  *\n  * Opus is a stateful codec with overlapping blocks and as a result Opus\n  * packets are not coded independently of each other. Packets must be\n  * passed into the decoder serially and in the correct order for a correct\n  * decode. Lost packets can be replaced with loss concealment by calling\n  * the decoder with a null pointer and zero length for the missing packet.\n  *\n  * A single codec state may only be accessed from a single thread at\n  * a time and any required locking must be performed by the caller. Separate\n  * streams must be decoded with separate decoder states and can be decoded\n  * in parallel unless the library was compiled with NONTHREADSAFE_PSEUDOSTACK\n  * defined.\n  *\n  */\n\n/** Opus decoder state.\n  * This contains the complete state of an Opus decoder.\n  * It is position independent and can be freely copied.\n  * @see opus_decoder_create,opus_decoder_init\n  */\ntypedef struct OpusDecoder OpusDecoder;\n\n/** Opus DRED decoder.\n  * This contains the complete state of an Opus DRED decoder.\n  * It is position independent and can be freely copied.\n  * @see opus_dred_decoder_create,opus_dred_decoder_init\n  */\ntypedef struct OpusDREDDecoder OpusDREDDecoder;\n\n\n/** Opus DRED state.\n  * This contains the complete state of an Opus DRED packet.\n  * It is position independent and can be freely copied.\n  * @see opus_dred_create,opus_dred_init\n  */\ntypedef struct OpusDRED OpusDRED;\n\n/** Gets the size of an <code>OpusDecoder</code> structure.\n  * @param [in] channels <tt>int</tt>: Number of channels.\n  *                                    This must be 1 or 2.\n  * @returns The size in bytes.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_size(int channels);\n\n/** Allocates and initializes a decoder state.\n  * @param [in] Fs <tt>opus_int32</tt>: Sample rate to decode at (Hz).\n  *                                     This must be one of 8000, 12000, 16000,\n  *                                     24000, or 48000.\n  * @param [in] channels <tt>int</tt>: Number of channels (1 or 2) to decode\n  * @param [out] error <tt>int*</tt>: #OPUS_OK Success or @ref opus_errorcodes\n  *\n  * Internally Opus stores data at 48000 Hz, so that should be the default\n  * value for Fs. However, the decoder can efficiently decode to buffers\n  * at 8, 12, 16, and 24 kHz so if for some reason the caller cannot use\n  * data at the full sample rate, or knows the compressed data doesn't\n  * use the full frequency range, it can request decoding at a reduced\n  * rate. Likewise, the decoder is capable of filling in either mono or\n  * interleaved stereo pcm buffers, at the caller's request.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusDecoder *opus_decoder_create(\n    opus_int32 Fs,\n    int channels,\n    int *error\n);\n\n/** Initializes a previously allocated decoder state.\n  * The state must be at least the size returned by opus_decoder_get_size().\n  * This is intended for applications which use their own allocator instead of malloc. @see opus_decoder_create,opus_decoder_get_size\n  * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.\n  * @param [in] st <tt>OpusDecoder*</tt>: Decoder state.\n  * @param [in] Fs <tt>opus_int32</tt>: Sampling rate to decode to (Hz).\n  *                                     This must be one of 8000, 12000, 16000,\n  *                                     24000, or 48000.\n  * @param [in] channels <tt>int</tt>: Number of channels (1 or 2) to decode\n  * @retval #OPUS_OK Success or @ref opus_errorcodes\n  */\nOPUS_EXPORT int opus_decoder_init(\n    OpusDecoder *st,\n    opus_int32 Fs,\n    int channels\n) OPUS_ARG_NONNULL(1);\n\n/** Decode an Opus packet.\n  * @param [in] st <tt>OpusDecoder*</tt>: Decoder state\n  * @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss\n  * @param [in] len <tt>opus_int32</tt>: Number of bytes in payload*\n  * @param [out] pcm <tt>opus_int16*</tt>: Output signal (interleaved if 2 channels). length\n  *  is frame_size*channels*sizeof(opus_int16)\n  * @param [in] frame_size Number of samples per channel of available space in \\a pcm.\n  *  If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will\n  *  not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1),\n  *  then frame_size needs to be exactly the duration of audio that is missing, otherwise the\n  *  decoder will not be in the optimal state to decode the next incoming packet. For the PLC and\n  *  FEC cases, frame_size <b>must</b> be a multiple of 2.5 ms.\n  * @param [in] decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band forward error correction data be\n  *  decoded. If no such data is available, the frame is decoded as if it were lost.\n  * @returns Number of decoded samples per channel or @ref opus_errorcodes\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode(\n    OpusDecoder *st,\n    const unsigned char *data,\n    opus_int32 len,\n    opus_int16 *pcm,\n    int frame_size,\n    int decode_fec\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);\n\n/** Decode an Opus packet.\n  * @param [in] st <tt>OpusDecoder*</tt>: Decoder state\n  * @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss\n  * @param [in] len <tt>opus_int32</tt>: Number of bytes in payload*\n  * @param [out] pcm <tt>opus_int32*</tt>: Output signal (interleaved if 2 channels) representing (or slightly exceeding) 24-bit values. length\n  *  is frame_size*channels*sizeof(opus_int32)\n  * @param [in] frame_size Number of samples per channel of available space in \\a pcm.\n  *  If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will\n  *  not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1),\n  *  then frame_size needs to be exactly the duration of audio that is missing, otherwise the\n  *  decoder will not be in the optimal state to decode the next incoming packet. For the PLC and\n  *  FEC cases, frame_size <b>must</b> be a multiple of 2.5 ms.\n  * @param [in] decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band forward error correction data be\n  *  decoded. If no such data is available, the frame is decoded as if it were lost.\n  * @returns Number of decoded samples or @ref opus_errorcodes\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode24(\n    OpusDecoder *st,\n    const unsigned char *data,\n    opus_int32 len,\n    opus_int32 *pcm,\n    int frame_size,\n    int decode_fec\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);\n\n/** Decode an Opus packet with floating point output.\n  * @param [in] st <tt>OpusDecoder*</tt>: Decoder state\n  * @param [in] data <tt>char*</tt>: Input payload. Use a NULL pointer to indicate packet loss\n  * @param [in] len <tt>opus_int32</tt>: Number of bytes in payload\n  * @param [out] pcm <tt>float*</tt>: Output signal (interleaved if 2 channels). length\n  *  is frame_size*channels*sizeof(float)\n  * @param [in] frame_size Number of samples per channel of available space in \\a pcm.\n  *  If this is less than the maximum packet duration (120ms; 5760 for 48kHz), this function will\n  *  not be capable of decoding some packets. In the case of PLC (data==NULL) or FEC (decode_fec=1),\n  *  then frame_size needs to be exactly the duration of audio that is missing, otherwise the\n  *  decoder will not be in the optimal state to decode the next incoming packet. For the PLC and\n  *  FEC cases, frame_size <b>must</b> be a multiple of 2.5 ms.\n  * @param [in] decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band forward error correction data be\n  *  decoded. If no such data is available the frame is decoded as if it were lost.\n  * @returns Number of decoded samples per channel or @ref opus_errorcodes\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decode_float(\n    OpusDecoder *st,\n    const unsigned char *data,\n    opus_int32 len,\n    float *pcm,\n    int frame_size,\n    int decode_fec\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);\n\n/** Perform a CTL function on an Opus decoder.\n  *\n  * Generally the request and subsequent arguments are generated\n  * by a convenience macro.\n  * @param st <tt>OpusDecoder*</tt>: Decoder state.\n  * @param request This and all remaining parameters should be replaced by one\n  *                of the convenience macros in @ref opus_genericctls or\n  *                @ref opus_decoderctls.\n  * @see opus_genericctls\n  * @see opus_decoderctls\n  */\nOPUS_EXPORT int opus_decoder_ctl(OpusDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);\n\n/** Frees an <code>OpusDecoder</code> allocated by opus_decoder_create().\n  * @param[in] st <tt>OpusDecoder*</tt>: State to be freed.\n  */\nOPUS_EXPORT void opus_decoder_destroy(OpusDecoder *st);\n\n/** Gets the size of an <code>OpusDREDDecoder</code> structure.\n  * @returns The size in bytes.\n  */\nOPUS_EXPORT int opus_dred_decoder_get_size(void);\n\n/** Allocates and initializes an OpusDREDDecoder state.\n  * @param [out] error <tt>int*</tt>: #OPUS_OK Success or @ref opus_errorcodes\n  */\nOPUS_EXPORT OpusDREDDecoder *opus_dred_decoder_create(int *error);\n\n/** Initializes an <code>OpusDREDDecoder</code> state.\n  * @param[in] dec <tt>OpusDREDDecoder*</tt>: State to be initialized.\n  */\nOPUS_EXPORT int opus_dred_decoder_init(OpusDREDDecoder *dec);\n\n/** Frees an <code>OpusDREDDecoder</code> allocated by opus_dred_decoder_create().\n  * @param[in] dec <tt>OpusDREDDecoder*</tt>: State to be freed.\n  */\nOPUS_EXPORT void opus_dred_decoder_destroy(OpusDREDDecoder *dec);\n\n/** Perform a CTL function on an Opus DRED decoder.\n  *\n  * Generally the request and subsequent arguments are generated\n  * by a convenience macro.\n  * @param dred_dec <tt>OpusDREDDecoder*</tt>: DRED Decoder state.\n  * @param request This and all remaining parameters should be replaced by one\n  *                of the convenience macros in @ref opus_genericctls or\n  *                @ref opus_decoderctls.\n  * @see opus_genericctls\n  * @see opus_decoderctls\n  */\nOPUS_EXPORT int opus_dred_decoder_ctl(OpusDREDDecoder *dred_dec, int request, ...);\n\n/** Gets the size of an <code>OpusDRED</code> structure.\n  * @returns The size in bytes.\n  */\nOPUS_EXPORT int opus_dred_get_size(void);\n\n/** Allocates and initializes a DRED state.\n  * @param [out] error <tt>int*</tt>: #OPUS_OK Success or @ref opus_errorcodes\n  */\nOPUS_EXPORT OpusDRED *opus_dred_alloc(int *error);\n\n/** Frees an <code>OpusDRED</code> allocated by opus_dred_create().\n  * @param[in] dec <tt>OpusDRED*</tt>: State to be freed.\n  */\nOPUS_EXPORT void opus_dred_free(OpusDRED *dec);\n\n/** Decode an Opus DRED packet.\n  * @param [in] dred_dec <tt>OpusDRED*</tt>: DRED Decoder state\n  * @param [in] dred <tt>OpusDRED*</tt>: DRED state\n  * @param [in] data <tt>char*</tt>: Input payload\n  * @param [in] len <tt>opus_int32</tt>: Number of bytes in payload\n  * @param [in] max_dred_samples <tt>opus_int32</tt>: Maximum number of DRED samples that may be needed (if available in the packet).\n  * @param [in] sampling_rate <tt>opus_int32</tt>: Sampling rate used for max_dred_samples argument. Needs not match the actual sampling rate of the decoder.\n  * @param [out] dred_end <tt>opus_int32*</tt>: Number of non-encoded (silence) samples between the DRED timestamp and the last DRED sample.\n  * @param [in] defer_processing <tt>int</tt>: Flag (0 or 1). If set to one, the CPU-intensive part of the DRED decoding is deferred until opus_dred_process() is called.\n  * @returns Offset (positive) of the first decoded DRED samples, zero if no DRED is present, or @ref opus_errorcodes\n  */\nOPUS_EXPORT int opus_dred_parse(OpusDREDDecoder *dred_dec, OpusDRED *dred, const unsigned char *data, opus_int32 len, opus_int32 max_dred_samples, opus_int32 sampling_rate, int *dred_end, int defer_processing) OPUS_ARG_NONNULL(1);\n\n/** Finish decoding an Opus DRED packet. The function only needs to be called if opus_dred_parse() was called with defer_processing=1.\n  * The source and destination will often be the same DRED state.\n  * @param [in] dred_dec <tt>OpusDRED*</tt>: DRED Decoder state\n  * @param [in] src <tt>OpusDRED*</tt>: Source DRED state to start the processing from.\n  * @param [out] dst <tt>OpusDRED*</tt>: Destination DRED state to store the updated state after processing.\n  * @returns @ref opus_errorcodes\n  */\nOPUS_EXPORT int opus_dred_process(OpusDREDDecoder *dred_dec, const OpusDRED *src, OpusDRED *dst);\n\n/** Decode audio from an Opus DRED packet with 16-bit output.\n  * @param [in] st <tt>OpusDecoder*</tt>: Decoder state\n  * @param [in] dred <tt>OpusDRED*</tt>: DRED state\n  * @param [in] dred_offset <tt>opus_int32</tt>: position of the redundancy to decode (in samples before the beginning of the real audio data in the packet).\n  * @param [out] pcm <tt>opus_int16*</tt>: Output signal (interleaved if 2 channels). length\n  *  is frame_size*channels*sizeof(opus_int16)\n  * @param [in] frame_size Number of samples per channel to decode in \\a pcm.\n  *  frame_size <b>must</b> be a multiple of 2.5 ms.\n  * @returns Number of decoded samples or @ref opus_errorcodes\n  */\nOPUS_EXPORT int opus_decoder_dred_decode(OpusDecoder *st, const OpusDRED *dred, opus_int32 dred_offset, opus_int16 *pcm, opus_int32 frame_size);\n\n/** Decode audio from an Opus DRED packet with 24-bit output.\n  * @param [in] st <tt>OpusDecoder*</tt>: Decoder state\n  * @param [in] dred <tt>OpusDRED*</tt>: DRED state\n  * @param [in] dred_offset <tt>opus_int32</tt>: position of the redundancy to decode (in samples before the beginning of the real audio data in the packet).\n  * @param [out] pcm <tt>opus_int32*</tt>: Output signal (interleaved if 2 channels). length\n  *  is frame_size*channels*sizeof(opus_int16)\n  * @param [in] frame_size Number of samples per channel to decode in \\a pcm.\n  *  frame_size <b>must</b> be a multiple of 2.5 ms.\n  * @returns Number of decoded samples or @ref opus_errorcodes\n  */\nOPUS_EXPORT int opus_decoder_dred_decode24(OpusDecoder *st, const OpusDRED *dred, opus_int32 dred_offset, opus_int32 *pcm, opus_int32 frame_size);\n\n/** Decode audio from an Opus DRED packet with floating point output.\n  * @param [in] st <tt>OpusDecoder*</tt>: Decoder state\n  * @param [in] dred <tt>OpusDRED*</tt>: DRED state\n  * @param [in] dred_offset <tt>opus_int32</tt>: position of the redundancy to decode (in samples before the beginning of the real audio data in the packet).\n  * @param [out] pcm <tt>float*</tt>: Output signal (interleaved if 2 channels). length\n  *  is frame_size*channels*sizeof(float)\n  * @param [in] frame_size Number of samples per channel to decode in \\a pcm.\n  *  frame_size <b>must</b> be a multiple of 2.5 ms.\n  * @returns Number of decoded samples or @ref opus_errorcodes\n  */\nOPUS_EXPORT int opus_decoder_dred_decode_float(OpusDecoder *st, const OpusDRED *dred, opus_int32 dred_offset, float *pcm, opus_int32 frame_size);\n\n\n/** Parse an opus packet into one or more frames.\n  * Opus_decode will perform this operation internally so most applications do\n  * not need to use this function.\n  * This function does not copy the frames, the returned pointers are pointers into\n  * the input packet.\n  * @param [in] data <tt>char*</tt>: Opus packet to be parsed\n  * @param [in] len <tt>opus_int32</tt>: size of data\n  * @param [out] out_toc <tt>char*</tt>: TOC pointer\n  * @param [out] frames <tt>char*[48]</tt> encapsulated frames\n  * @param [out] size <tt>opus_int16[48]</tt> sizes of the encapsulated frames\n  * @param [out] payload_offset <tt>int*</tt>: returns the position of the payload within the packet (in bytes)\n  * @returns number of frames\n  */\nOPUS_EXPORT int opus_packet_parse(\n   const unsigned char *data,\n   opus_int32 len,\n   unsigned char *out_toc,\n   const unsigned char *frames[48],\n   opus_int16 size[48],\n   int *payload_offset\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5);\n\n/** Gets the bandwidth of an Opus packet.\n  * @param [in] data <tt>char*</tt>: Opus packet\n  * @retval OPUS_BANDWIDTH_NARROWBAND Narrowband (4kHz bandpass)\n  * @retval OPUS_BANDWIDTH_MEDIUMBAND Mediumband (6kHz bandpass)\n  * @retval OPUS_BANDWIDTH_WIDEBAND Wideband (8kHz bandpass)\n  * @retval OPUS_BANDWIDTH_SUPERWIDEBAND Superwideband (12kHz bandpass)\n  * @retval OPUS_BANDWIDTH_FULLBAND Fullband (20kHz bandpass)\n  * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_bandwidth(const unsigned char *data) OPUS_ARG_NONNULL(1);\n\n/** Gets the number of samples per frame from an Opus packet.\n  * @param [in] data <tt>char*</tt>: Opus packet.\n  *                                  This must contain at least one byte of\n  *                                  data.\n  * @param [in] Fs <tt>opus_int32</tt>: Sampling rate in Hz.\n  *                                     This must be a multiple of 400, or\n  *                                     inaccurate results will be returned.\n  * @returns Number of samples per frame.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_samples_per_frame(const unsigned char *data, opus_int32 Fs) OPUS_ARG_NONNULL(1);\n\n/** Gets the number of channels from an Opus packet.\n  * @param [in] data <tt>char*</tt>: Opus packet\n  * @returns Number of channels\n  * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_channels(const unsigned char *data) OPUS_ARG_NONNULL(1);\n\n/** Gets the number of frames in an Opus packet.\n  * @param [in] packet <tt>char*</tt>: Opus packet\n  * @param [in] len <tt>opus_int32</tt>: Length of packet\n  * @returns Number of frames\n  * @retval OPUS_BAD_ARG Insufficient data was passed to the function\n  * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_frames(const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1);\n\n/** Gets the number of samples of an Opus packet.\n  * @param [in] packet <tt>char*</tt>: Opus packet\n  * @param [in] len <tt>opus_int32</tt>: Length of packet\n  * @param [in] Fs <tt>opus_int32</tt>: Sampling rate in Hz.\n  *                                     This must be a multiple of 400, or\n  *                                     inaccurate results will be returned.\n  * @returns Number of samples\n  * @retval OPUS_BAD_ARG Insufficient data was passed to the function\n  * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_get_nb_samples(const unsigned char packet[], opus_int32 len, opus_int32 Fs) OPUS_ARG_NONNULL(1);\n\n/** Checks whether an Opus packet has LBRR.\n  * @param [in] packet <tt>char*</tt>: Opus packet\n  * @param [in] len <tt>opus_int32</tt>: Length of packet\n  * @returns 1 is LBRR is present, 0 otherwise\n  * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_packet_has_lbrr(const unsigned char packet[], opus_int32 len);\n\n/** Gets the number of samples of an Opus packet.\n  * @param [in] dec <tt>OpusDecoder*</tt>: Decoder state\n  * @param [in] packet <tt>char*</tt>: Opus packet\n  * @param [in] len <tt>opus_int32</tt>: Length of packet\n  * @returns Number of samples\n  * @retval OPUS_BAD_ARG Insufficient data was passed to the function\n  * @retval OPUS_INVALID_PACKET The compressed data passed is corrupted or of an unsupported type\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_decoder_get_nb_samples(const OpusDecoder *dec, const unsigned char packet[], opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);\n\n/** Applies soft-clipping to bring a float signal within the [-1,1] range. If\n  * the signal is already in that range, nothing is done. If there are values\n  * outside of [-1,1], then the signal is clipped as smoothly as possible to\n  * both fit in the range and avoid creating excessive distortion in the\n  * process.\n  * @param [in,out] pcm <tt>float*</tt>: Input PCM and modified PCM\n  * @param [in] frame_size <tt>int</tt> Number of samples per channel to process\n  * @param [in] channels <tt>int</tt>: Number of channels\n  * @param [in,out] softclip_mem <tt>float*</tt>: State memory for the soft clipping process (one float per channel, initialized to zero)\n  */\nOPUS_EXPORT void opus_pcm_soft_clip(float *pcm, int frame_size, int channels, float *softclip_mem);\n\n\n/**@}*/\n\n/** @defgroup opus_repacketizer Repacketizer\n  * @{\n  *\n  * The repacketizer can be used to merge multiple Opus packets into a single\n  * packet or alternatively to split Opus packets that have previously been\n  * merged. Splitting valid Opus packets is always guaranteed to succeed,\n  * whereas merging valid packets only succeeds if all frames have the same\n  * mode, bandwidth, and frame size, and when the total duration of the merged\n  * packet is no more than 120 ms. The 120 ms limit comes from the\n  * specification and limits decoder memory requirements at a point where\n  * framing overhead becomes negligible.\n  *\n  * The repacketizer currently only operates on elementary Opus\n  * streams. It will not manipulate multistream packets successfully, except in\n  * the degenerate case where they consist of data from a single stream.\n  *\n  * The repacketizing process starts with creating a repacketizer state, either\n  * by calling opus_repacketizer_create() or by allocating the memory yourself,\n  * e.g.,\n  * @code\n  * OpusRepacketizer *rp;\n  * rp = (OpusRepacketizer*)malloc(opus_repacketizer_get_size());\n  * if (rp != NULL)\n  *     opus_repacketizer_init(rp);\n  * @endcode\n  *\n  * Then the application should submit packets with opus_repacketizer_cat(),\n  * extract new packets with opus_repacketizer_out() or\n  * opus_repacketizer_out_range(), and then reset the state for the next set of\n  * input packets via opus_repacketizer_init().\n  *\n  * For example, to split a sequence of packets into individual frames:\n  * @code\n  * unsigned char *data;\n  * int len;\n  * while (get_next_packet(&data, &len))\n  * {\n  *   unsigned char out[1276];\n  *   opus_int32 out_len;\n  *   int nb_frames;\n  *   int err;\n  *   int i;\n  *   err = opus_repacketizer_cat(rp, data, len);\n  *   if (err != OPUS_OK)\n  *   {\n  *     release_packet(data);\n  *     return err;\n  *   }\n  *   nb_frames = opus_repacketizer_get_nb_frames(rp);\n  *   for (i = 0; i < nb_frames; i++)\n  *   {\n  *     out_len = opus_repacketizer_out_range(rp, i, i+1, out, sizeof(out));\n  *     if (out_len < 0)\n  *     {\n  *        release_packet(data);\n  *        return (int)out_len;\n  *     }\n  *     output_next_packet(out, out_len);\n  *   }\n  *   opus_repacketizer_init(rp);\n  *   release_packet(data);\n  * }\n  * @endcode\n  *\n  * Alternatively, to combine a sequence of frames into packets that each\n  * contain up to <code>TARGET_DURATION_MS</code> milliseconds of data:\n  * @code\n  * // The maximum number of packets with duration TARGET_DURATION_MS occurs\n  * // when the frame size is 2.5 ms, for a total of (TARGET_DURATION_MS*2/5)\n  * // packets.\n  * unsigned char *data[(TARGET_DURATION_MS*2/5)+1];\n  * opus_int32 len[(TARGET_DURATION_MS*2/5)+1];\n  * int nb_packets;\n  * unsigned char out[1277*(TARGET_DURATION_MS*2/2)];\n  * opus_int32 out_len;\n  * int prev_toc;\n  * nb_packets = 0;\n  * while (get_next_packet(data+nb_packets, len+nb_packets))\n  * {\n  *   int nb_frames;\n  *   int err;\n  *   nb_frames = opus_packet_get_nb_frames(data[nb_packets], len[nb_packets]);\n  *   if (nb_frames < 1)\n  *   {\n  *     release_packets(data, nb_packets+1);\n  *     return nb_frames;\n  *   }\n  *   nb_frames += opus_repacketizer_get_nb_frames(rp);\n  *   // If adding the next packet would exceed our target, or it has an\n  *   // incompatible TOC sequence, output the packets we already have before\n  *   // submitting it.\n  *   // N.B., The nb_packets > 0 check ensures we've submitted at least one\n  *   // packet since the last call to opus_repacketizer_init(). Otherwise a\n  *   // single packet longer than TARGET_DURATION_MS would cause us to try to\n  *   // output an (invalid) empty packet. It also ensures that prev_toc has\n  *   // been set to a valid value. Additionally, len[nb_packets] > 0 is\n  *   // guaranteed by the call to opus_packet_get_nb_frames() above, so the\n  *   // reference to data[nb_packets][0] should be valid.\n  *   if (nb_packets > 0 && (\n  *       ((prev_toc & 0xFC) != (data[nb_packets][0] & 0xFC)) ||\n  *       opus_packet_get_samples_per_frame(data[nb_packets], 48000)*nb_frames >\n  *       TARGET_DURATION_MS*48))\n  *   {\n  *     out_len = opus_repacketizer_out(rp, out, sizeof(out));\n  *     if (out_len < 0)\n  *     {\n  *        release_packets(data, nb_packets+1);\n  *        return (int)out_len;\n  *     }\n  *     output_next_packet(out, out_len);\n  *     opus_repacketizer_init(rp);\n  *     release_packets(data, nb_packets);\n  *     data[0] = data[nb_packets];\n  *     len[0] = len[nb_packets];\n  *     nb_packets = 0;\n  *   }\n  *   err = opus_repacketizer_cat(rp, data[nb_packets], len[nb_packets]);\n  *   if (err != OPUS_OK)\n  *   {\n  *     release_packets(data, nb_packets+1);\n  *     return err;\n  *   }\n  *   prev_toc = data[nb_packets][0];\n  *   nb_packets++;\n  * }\n  * // Output the final, partial packet.\n  * if (nb_packets > 0)\n  * {\n  *   out_len = opus_repacketizer_out(rp, out, sizeof(out));\n  *   release_packets(data, nb_packets);\n  *   if (out_len < 0)\n  *     return (int)out_len;\n  *   output_next_packet(out, out_len);\n  * }\n  * @endcode\n  *\n  * An alternate way of merging packets is to simply call opus_repacketizer_cat()\n  * unconditionally until it fails. At that point, the merged packet can be\n  * obtained with opus_repacketizer_out() and the input packet for which\n  * opus_repacketizer_cat() needs to be re-added to a newly reinitialized\n  * repacketizer state.\n  */\n\ntypedef struct OpusRepacketizer OpusRepacketizer;\n\n/** Gets the size of an <code>OpusRepacketizer</code> structure.\n  * @returns The size in bytes.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_size(void);\n\n/** (Re)initializes a previously allocated repacketizer state.\n  * The state must be at least the size returned by opus_repacketizer_get_size().\n  * This can be used for applications which use their own allocator instead of\n  * malloc().\n  * It must also be called to reset the queue of packets waiting to be\n  * repacketized, which is necessary if the maximum packet duration of 120 ms\n  * is reached or if you wish to submit packets with a different Opus\n  * configuration (coding mode, audio bandwidth, frame size, or channel count).\n  * Failure to do so will prevent a new packet from being added with\n  * opus_repacketizer_cat().\n  * @see opus_repacketizer_create\n  * @see opus_repacketizer_get_size\n  * @see opus_repacketizer_cat\n  * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state to\n  *                                       (re)initialize.\n  * @returns A pointer to the same repacketizer state that was passed in.\n  */\nOPUS_EXPORT OpusRepacketizer *opus_repacketizer_init(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1);\n\n/** Allocates memory and initializes the new repacketizer with\n * opus_repacketizer_init().\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusRepacketizer *opus_repacketizer_create(void);\n\n/** Frees an <code>OpusRepacketizer</code> allocated by\n  * opus_repacketizer_create().\n  * @param[in] rp <tt>OpusRepacketizer*</tt>: State to be freed.\n  */\nOPUS_EXPORT void opus_repacketizer_destroy(OpusRepacketizer *rp);\n\n/** Add a packet to the current repacketizer state.\n  * This packet must match the configuration of any packets already submitted\n  * for repacketization since the last call to opus_repacketizer_init().\n  * This means that it must have the same coding mode, audio bandwidth, frame\n  * size, and channel count.\n  * This can be checked in advance by examining the top 6 bits of the first\n  * byte of the packet, and ensuring they match the top 6 bits of the first\n  * byte of any previously submitted packet.\n  * The total duration of audio in the repacketizer state also must not exceed\n  * 120 ms, the maximum duration of a single packet, after adding this packet.\n  *\n  * The contents of the current repacketizer state can be extracted into new\n  * packets using opus_repacketizer_out() or opus_repacketizer_out_range().\n  *\n  * In order to add a packet with a different configuration or to add more\n  * audio beyond 120 ms, you must clear the repacketizer state by calling\n  * opus_repacketizer_init().\n  * If a packet is too large to add to the current repacketizer state, no part\n  * of it is added, even if it contains multiple frames, some of which might\n  * fit.\n  * If you wish to be able to add parts of such packets, you should first use\n  * another repacketizer to split the packet into pieces and add them\n  * individually.\n  * @see opus_repacketizer_out_range\n  * @see opus_repacketizer_out\n  * @see opus_repacketizer_init\n  * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state to which to\n  *                                       add the packet.\n  * @param[in] data <tt>const unsigned char*</tt>: The packet data.\n  *                                                The application must ensure\n  *                                                this pointer remains valid\n  *                                                until the next call to\n  *                                                opus_repacketizer_init() or\n  *                                                opus_repacketizer_destroy().\n  * @param len <tt>opus_int32</tt>: The number of bytes in the packet data.\n  * @returns An error code indicating whether or not the operation succeeded.\n  * @retval #OPUS_OK The packet's contents have been added to the repacketizer\n  *                  state.\n  * @retval #OPUS_INVALID_PACKET The packet did not have a valid TOC sequence,\n  *                              the packet's TOC sequence was not compatible\n  *                              with previously submitted packets (because\n  *                              the coding mode, audio bandwidth, frame size,\n  *                              or channel count did not match), or adding\n  *                              this packet would increase the total amount of\n  *                              audio stored in the repacketizer state to more\n  *                              than 120 ms.\n  */\nOPUS_EXPORT int opus_repacketizer_cat(OpusRepacketizer *rp, const unsigned char *data, opus_int32 len) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2);\n\n\n/** Construct a new packet from data previously submitted to the repacketizer\n  * state via opus_repacketizer_cat().\n  * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state from which to\n  *                                       construct the new packet.\n  * @param begin <tt>int</tt>: The index of the first frame in the current\n  *                            repacketizer state to include in the output.\n  * @param end <tt>int</tt>: One past the index of the last frame in the\n  *                          current repacketizer state to include in the\n  *                          output.\n  * @param[out] data <tt>const unsigned char*</tt>: The buffer in which to\n  *                                                 store the output packet.\n  * @param maxlen <tt>opus_int32</tt>: The maximum number of bytes to store in\n  *                                    the output buffer. In order to guarantee\n  *                                    success, this should be at least\n  *                                    <code>1276</code> for a single frame,\n  *                                    or for multiple frames,\n  *                                    <code>1277*(end-begin)</code>.\n  *                                    However, <code>1*(end-begin)</code> plus\n  *                                    the size of all packet data submitted to\n  *                                    the repacketizer since the last call to\n  *                                    opus_repacketizer_init() or\n  *                                    opus_repacketizer_create() is also\n  *                                    sufficient, and possibly much smaller.\n  * @returns The total size of the output packet on success, or an error code\n  *          on failure.\n  * @retval #OPUS_BAD_ARG <code>[begin,end)</code> was an invalid range of\n  *                       frames (begin < 0, begin >= end, or end >\n  *                       opus_repacketizer_get_nb_frames()).\n  * @retval #OPUS_BUFFER_TOO_SMALL \\a maxlen was insufficient to contain the\n  *                                complete output packet.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out_range(OpusRepacketizer *rp, int begin, int end, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);\n\n/** Return the total number of frames contained in packet data submitted to\n  * the repacketizer state so far via opus_repacketizer_cat() since the last\n  * call to opus_repacketizer_init() or opus_repacketizer_create().\n  * This defines the valid range of packets that can be extracted with\n  * opus_repacketizer_out_range() or opus_repacketizer_out().\n  * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state containing the\n  *                                       frames.\n  * @returns The total number of frames contained in the packet data submitted\n  *          to the repacketizer state.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_repacketizer_get_nb_frames(OpusRepacketizer *rp) OPUS_ARG_NONNULL(1);\n\n/** Construct a new packet from data previously submitted to the repacketizer\n  * state via opus_repacketizer_cat().\n  * This is a convenience routine that returns all the data submitted so far\n  * in a single packet.\n  * It is equivalent to calling\n  * @code\n  * opus_repacketizer_out_range(rp, 0, opus_repacketizer_get_nb_frames(rp),\n  *                             data, maxlen)\n  * @endcode\n  * @param rp <tt>OpusRepacketizer*</tt>: The repacketizer state from which to\n  *                                       construct the new packet.\n  * @param[out] data <tt>const unsigned char*</tt>: The buffer in which to\n  *                                                 store the output packet.\n  * @param maxlen <tt>opus_int32</tt>: The maximum number of bytes to store in\n  *                                    the output buffer. In order to guarantee\n  *                                    success, this should be at least\n  *                                    <code>1277*opus_repacketizer_get_nb_frames(rp)</code>.\n  *                                    However,\n  *                                    <code>1*opus_repacketizer_get_nb_frames(rp)</code>\n  *                                    plus the size of all packet data\n  *                                    submitted to the repacketizer since the\n  *                                    last call to opus_repacketizer_init() or\n  *                                    opus_repacketizer_create() is also\n  *                                    sufficient, and possibly much smaller.\n  * @returns The total size of the output packet on success, or an error code\n  *          on failure.\n  * @retval #OPUS_BUFFER_TOO_SMALL \\a maxlen was insufficient to contain the\n  *                                complete output packet.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_repacketizer_out(OpusRepacketizer *rp, unsigned char *data, opus_int32 maxlen) OPUS_ARG_NONNULL(1);\n\n/** Pads a given Opus packet to a larger size (possibly changing the TOC sequence).\n  * @param[in,out] data <tt>const unsigned char*</tt>: The buffer containing the\n  *                                                   packet to pad.\n  * @param len <tt>opus_int32</tt>: The size of the packet.\n  *                                 This must be at least 1.\n  * @param new_len <tt>opus_int32</tt>: The desired size of the packet after padding.\n  *                                 This must be at least as large as len.\n  * @returns an error code\n  * @retval #OPUS_OK \\a on success.\n  * @retval #OPUS_BAD_ARG \\a len was less than 1 or new_len was less than len.\n  * @retval #OPUS_INVALID_PACKET \\a data did not contain a valid Opus packet.\n  */\nOPUS_EXPORT int opus_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len);\n\n/** Remove all padding from a given Opus packet and rewrite the TOC sequence to\n  * minimize space usage.\n  * @param[in,out] data <tt>const unsigned char*</tt>: The buffer containing the\n  *                                                   packet to strip.\n  * @param len <tt>opus_int32</tt>: The size of the packet.\n  *                                 This must be at least 1.\n  * @returns The new size of the output packet on success, or an error code\n  *          on failure.\n  * @retval #OPUS_BAD_ARG \\a len was less than 1.\n  * @retval #OPUS_INVALID_PACKET \\a data did not contain a valid Opus packet.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_packet_unpad(unsigned char *data, opus_int32 len);\n\n/** Pads a given Opus multi-stream packet to a larger size (possibly changing the TOC sequence).\n  * @param[in,out] data <tt>const unsigned char*</tt>: The buffer containing the\n  *                                                   packet to pad.\n  * @param len <tt>opus_int32</tt>: The size of the packet.\n  *                                 This must be at least 1.\n  * @param new_len <tt>opus_int32</tt>: The desired size of the packet after padding.\n  *                                 This must be at least 1.\n  * @param nb_streams <tt>opus_int32</tt>: The number of streams (not channels) in the packet.\n  *                                 This must be at least as large as len.\n  * @returns an error code\n  * @retval #OPUS_OK \\a on success.\n  * @retval #OPUS_BAD_ARG \\a len was less than 1.\n  * @retval #OPUS_INVALID_PACKET \\a data did not contain a valid Opus packet.\n  */\nOPUS_EXPORT int opus_multistream_packet_pad(unsigned char *data, opus_int32 len, opus_int32 new_len, int nb_streams);\n\n/** Remove all padding from a given Opus multi-stream packet and rewrite the TOC sequence to\n  * minimize space usage.\n  * @param[in,out] data <tt>const unsigned char*</tt>: The buffer containing the\n  *                                                   packet to strip.\n  * @param len <tt>opus_int32</tt>: The size of the packet.\n  *                                 This must be at least 1.\n  * @param nb_streams <tt>opus_int32</tt>: The number of streams (not channels) in the packet.\n  *                                 This must be at least 1.\n  * @returns The new size of the output packet on success, or an error code\n  *          on failure.\n  * @retval #OPUS_BAD_ARG \\a len was less than 1 or new_len was less than len.\n  * @retval #OPUS_INVALID_PACKET \\a data did not contain a valid Opus packet.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_packet_unpad(unsigned char *data, opus_int32 len, int nb_streams);\n\n/**@}*/\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* OPUS_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include/opus/opus_defines.h",
    "content": "/* Copyright (c) 2010-2011 Xiph.Org Foundation, Skype Limited\n   Written by Jean-Marc Valin and Koen Vos */\n/*\n   Redistribution and use in source and binary forms, with or without\n   modification, are permitted provided that the following conditions\n   are met:\n\n   - Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\n   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\n   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n * @file opus_defines.h\n * @brief Opus reference implementation constants\n */\n\n#ifndef OPUS_DEFINES_H\n#define OPUS_DEFINES_H\n\n#include \"opus_types.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @defgroup opus_errorcodes Error codes\n * @{\n */\n/** No error @hideinitializer*/\n#define OPUS_OK                0\n/** One or more invalid/out of range arguments @hideinitializer*/\n#define OPUS_BAD_ARG          -1\n/** Not enough bytes allocated in the buffer @hideinitializer*/\n#define OPUS_BUFFER_TOO_SMALL -2\n/** An internal error was detected @hideinitializer*/\n#define OPUS_INTERNAL_ERROR   -3\n/** The compressed data passed is corrupted @hideinitializer*/\n#define OPUS_INVALID_PACKET   -4\n/** Invalid/unsupported request number @hideinitializer*/\n#define OPUS_UNIMPLEMENTED    -5\n/** An encoder or decoder structure is invalid or already freed @hideinitializer*/\n#define OPUS_INVALID_STATE    -6\n/** Memory allocation has failed @hideinitializer*/\n#define OPUS_ALLOC_FAIL       -7\n/**@}*/\n\n/** @cond OPUS_INTERNAL_DOC */\n/**Export control for opus functions */\n\n#ifndef OPUS_EXPORT\n# if defined(_WIN32)\n#  if defined(OPUS_BUILD) && defined(DLL_EXPORT)\n#   define OPUS_EXPORT __declspec(dllexport)\n#  else\n#   define OPUS_EXPORT\n#  endif\n# elif defined(__GNUC__) && defined(OPUS_BUILD)\n#  define OPUS_EXPORT __attribute__ ((visibility (\"default\")))\n# else\n#  define OPUS_EXPORT\n# endif\n#endif\n\n# if !defined(OPUS_GNUC_PREREQ)\n#  if defined(__GNUC__)&&defined(__GNUC_MINOR__)\n#   define OPUS_GNUC_PREREQ(_maj,_min) \\\n ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min))\n#  else\n#   define OPUS_GNUC_PREREQ(_maj,_min) 0\n#  endif\n# endif\n\n#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )\n# if OPUS_GNUC_PREREQ(3,0)\n#  define OPUS_RESTRICT __restrict__\n# elif (defined(_MSC_VER) && _MSC_VER >= 1400)\n#  define OPUS_RESTRICT __restrict\n# else\n#  define OPUS_RESTRICT\n# endif\n#else\n# define OPUS_RESTRICT restrict\n#endif\n\n#if (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L) )\n# if OPUS_GNUC_PREREQ(2,7)\n#  define OPUS_INLINE __inline__\n# elif (defined(_MSC_VER))\n#  define OPUS_INLINE __inline\n# else\n#  define OPUS_INLINE\n# endif\n#else\n# define OPUS_INLINE inline\n#endif\n\n/**Warning attributes for opus functions\n  * NONNULL is not used in OPUS_BUILD to avoid the compiler optimizing out\n  * some paranoid null checks. */\n#if defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4)\n# define OPUS_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__))\n#else\n# define OPUS_WARN_UNUSED_RESULT\n#endif\n#if !defined(OPUS_BUILD) && defined(__GNUC__) && OPUS_GNUC_PREREQ(3, 4)\n# define OPUS_ARG_NONNULL(_x)  __attribute__ ((__nonnull__(_x)))\n#else\n# define OPUS_ARG_NONNULL(_x)\n#endif\n\n/** These are the actual Encoder CTL ID numbers.\n  * They should not be used directly by applications.\n  * In general, SETs should be even and GETs should be odd.*/\n#define OPUS_SET_APPLICATION_REQUEST         4000\n#define OPUS_GET_APPLICATION_REQUEST         4001\n#define OPUS_SET_BITRATE_REQUEST             4002\n#define OPUS_GET_BITRATE_REQUEST             4003\n#define OPUS_SET_MAX_BANDWIDTH_REQUEST       4004\n#define OPUS_GET_MAX_BANDWIDTH_REQUEST       4005\n#define OPUS_SET_VBR_REQUEST                 4006\n#define OPUS_GET_VBR_REQUEST                 4007\n#define OPUS_SET_BANDWIDTH_REQUEST           4008\n#define OPUS_GET_BANDWIDTH_REQUEST           4009\n#define OPUS_SET_COMPLEXITY_REQUEST          4010\n#define OPUS_GET_COMPLEXITY_REQUEST          4011\n#define OPUS_SET_INBAND_FEC_REQUEST          4012\n#define OPUS_GET_INBAND_FEC_REQUEST          4013\n#define OPUS_SET_PACKET_LOSS_PERC_REQUEST    4014\n#define OPUS_GET_PACKET_LOSS_PERC_REQUEST    4015\n#define OPUS_SET_DTX_REQUEST                 4016\n#define OPUS_GET_DTX_REQUEST                 4017\n#define OPUS_SET_VBR_CONSTRAINT_REQUEST      4020\n#define OPUS_GET_VBR_CONSTRAINT_REQUEST      4021\n#define OPUS_SET_FORCE_CHANNELS_REQUEST      4022\n#define OPUS_GET_FORCE_CHANNELS_REQUEST      4023\n#define OPUS_SET_SIGNAL_REQUEST              4024\n#define OPUS_GET_SIGNAL_REQUEST              4025\n#define OPUS_GET_LOOKAHEAD_REQUEST           4027\n/* #define OPUS_RESET_STATE 4028 */\n#define OPUS_GET_SAMPLE_RATE_REQUEST         4029\n#define OPUS_GET_FINAL_RANGE_REQUEST         4031\n#define OPUS_GET_PITCH_REQUEST               4033\n#define OPUS_SET_GAIN_REQUEST                4034\n#define OPUS_GET_GAIN_REQUEST                4045 /* Should have been 4035 */\n#define OPUS_SET_LSB_DEPTH_REQUEST           4036\n#define OPUS_GET_LSB_DEPTH_REQUEST           4037\n#define OPUS_GET_LAST_PACKET_DURATION_REQUEST 4039\n#define OPUS_SET_EXPERT_FRAME_DURATION_REQUEST 4040\n#define OPUS_GET_EXPERT_FRAME_DURATION_REQUEST 4041\n#define OPUS_SET_PREDICTION_DISABLED_REQUEST 4042\n#define OPUS_GET_PREDICTION_DISABLED_REQUEST 4043\n/* Don't use 4045, it's already taken by OPUS_GET_GAIN_REQUEST */\n#define OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST 4046\n#define OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST 4047\n#define OPUS_GET_IN_DTX_REQUEST              4049\n#define OPUS_SET_DRED_DURATION_REQUEST 4050\n#define OPUS_GET_DRED_DURATION_REQUEST 4051\n#define OPUS_SET_DNN_BLOB_REQUEST 4052\n/*#define OPUS_GET_DNN_BLOB_REQUEST 4053 */\n#define OPUS_SET_OSCE_BWE_REQUEST 4054\n#define OPUS_GET_OSCE_BWE_REQUEST 4055\n#define OPUS_SET_QEXT_REQUEST 4056\n#define OPUS_GET_QEXT_REQUEST 4057\n#define OPUS_SET_IGNORE_EXTENSIONS_REQUEST 4058\n#define OPUS_GET_IGNORE_EXTENSIONS_REQUEST 4059\n\n/** Defines for the presence of extended APIs. */\n#define OPUS_HAVE_OPUS_PROJECTION_H\n\n/* Macros to trigger compilation errors when the wrong types are provided to a CTL */\n#define opus_check_int(x) (((void)((x) == (opus_int32)0)), (opus_int32)(x))\n\n#ifdef DISABLE_PTR_CHECK\n/* Disable checks to prevent ubsan from complaining about NULL checks\n   in test_opus_api. */\n#define opus_check_int_ptr(ptr) (ptr)\n#define opus_check_uint_ptr(ptr) (ptr)\n#define opus_check_uint8_ptr(ptr) (ptr)\n#define opus_check_val16_ptr(ptr) (ptr)\n#define opus_check_void_ptr(ptr) (ptr)\n#else\n#define opus_check_int_ptr(ptr) ((ptr) + ((ptr) - (opus_int32*)(ptr)))\n#define opus_check_uint_ptr(ptr) ((ptr) + ((ptr) - (opus_uint32*)(ptr)))\n#define opus_check_uint8_ptr(ptr) ((ptr) + ((ptr) - (opus_uint8*)(ptr)))\n#define opus_check_val16_ptr(ptr) ((ptr) + ((ptr) - (opus_val16*)(ptr)))\n#define opus_check_void_ptr(x) ((void)((void *)0 == (x)), (x))\n#endif\n/** @endcond */\n\n/** @defgroup opus_ctlvalues Pre-defined values for CTL interface\n  * @see opus_genericctls, opus_encoderctls\n  * @{\n  */\n/* Values for the various encoder CTLs */\n#define OPUS_AUTO                           -1000 /**<Auto/default setting @hideinitializer*/\n#define OPUS_BITRATE_MAX                       -1 /**<Maximum bitrate @hideinitializer*/\n\n/** Best for most VoIP/videoconference applications where listening quality and intelligibility matter most\n * @hideinitializer */\n#define OPUS_APPLICATION_VOIP                2048\n/** Best for broadcast/high-fidelity application where the decoded audio should be as close as possible to the input\n * @hideinitializer */\n#define OPUS_APPLICATION_AUDIO               2049\n/** Only use when lowest-achievable latency is what matters most. Voice-optimized modes cannot be used.\n * @hideinitializer */\n#define OPUS_APPLICATION_RESTRICTED_LOWDELAY 2051\n/** Experts only: forces SILK encoding; don't allocate CELT state at all. Disables OPUS_SET_APPLICATION. */\n#define OPUS_APPLICATION_RESTRICTED_SILK     2052\n/** Experts only: forces CELT encoding; don't allocate SILK state at all. Disables OPUS_SET_APPLICATION. */\n#define OPUS_APPLICATION_RESTRICTED_CELT     2053\n\n#define OPUS_SIGNAL_VOICE                    3001 /**< Signal being encoded is voice */\n#define OPUS_SIGNAL_MUSIC                    3002 /**< Signal being encoded is music */\n#define OPUS_BANDWIDTH_NARROWBAND            1101 /**< 4 kHz bandpass @hideinitializer*/\n#define OPUS_BANDWIDTH_MEDIUMBAND            1102 /**< 6 kHz bandpass @hideinitializer*/\n#define OPUS_BANDWIDTH_WIDEBAND              1103 /**< 8 kHz bandpass @hideinitializer*/\n#define OPUS_BANDWIDTH_SUPERWIDEBAND         1104 /**<12 kHz bandpass @hideinitializer*/\n#define OPUS_BANDWIDTH_FULLBAND              1105 /**<20 kHz bandpass @hideinitializer*/\n\n#define OPUS_FRAMESIZE_ARG                   5000 /**< Select frame size from the argument (default) */\n#define OPUS_FRAMESIZE_2_5_MS                5001 /**< Use 2.5 ms frames */\n#define OPUS_FRAMESIZE_5_MS                  5002 /**< Use 5 ms frames */\n#define OPUS_FRAMESIZE_10_MS                 5003 /**< Use 10 ms frames */\n#define OPUS_FRAMESIZE_20_MS                 5004 /**< Use 20 ms frames */\n#define OPUS_FRAMESIZE_40_MS                 5005 /**< Use 40 ms frames */\n#define OPUS_FRAMESIZE_60_MS                 5006 /**< Use 60 ms frames */\n#define OPUS_FRAMESIZE_80_MS                 5007 /**< Use 80 ms frames */\n#define OPUS_FRAMESIZE_100_MS                5008 /**< Use 100 ms frames */\n#define OPUS_FRAMESIZE_120_MS                5009 /**< Use 120 ms frames */\n\n/**@}*/\n\n\n/** @defgroup opus_encoderctls Encoder related CTLs\n  *\n  * These are convenience macros for use with the \\c opus_encode_ctl\n  * interface. They are used to generate the appropriate series of\n  * arguments for that call, passing the correct type, size and so\n  * on as expected for each particular request.\n  *\n  * Some usage examples:\n  *\n  * @code\n  * int ret;\n  * ret = opus_encoder_ctl(enc_ctx, OPUS_SET_BANDWIDTH(OPUS_AUTO));\n  * if (ret != OPUS_OK) return ret;\n  *\n  * opus_int32 rate;\n  * opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&rate));\n  *\n  * opus_encoder_ctl(enc_ctx, OPUS_RESET_STATE);\n  * @endcode\n  *\n  * @see opus_genericctls, opus_encoder\n  * @{\n  */\n\n/** Configures the encoder's computational complexity.\n  * The supported range is 0-10 inclusive with 10 representing the highest complexity.\n  * @see OPUS_GET_COMPLEXITY\n  * @param[in] x <tt>opus_int32</tt>: Allowed values: 0-10, inclusive.\n  *\n  * @hideinitializer */\n#define OPUS_SET_COMPLEXITY(x) OPUS_SET_COMPLEXITY_REQUEST, opus_check_int(x)\n/** Gets the encoder's complexity configuration.\n  * @see OPUS_SET_COMPLEXITY\n  * @param[out] x <tt>opus_int32 *</tt>: Returns a value in the range 0-10,\n  *                                      inclusive.\n  * @hideinitializer */\n#define OPUS_GET_COMPLEXITY(x) OPUS_GET_COMPLEXITY_REQUEST, opus_check_int_ptr(x)\n\n/** Configures the bitrate in the encoder.\n  * Rates from 500 to 512000 bits per second are meaningful, as well as the\n  * special values #OPUS_AUTO and #OPUS_BITRATE_MAX.\n  * The value #OPUS_BITRATE_MAX can be used to cause the codec to use as much\n  * rate as it can, which is useful for controlling the rate by adjusting the\n  * output buffer size.\n  * @see OPUS_GET_BITRATE\n  * @param[in] x <tt>opus_int32</tt>: Bitrate in bits per second. The default\n  *                                   is determined based on the number of\n  *                                   channels and the input sampling rate.\n  * @hideinitializer */\n#define OPUS_SET_BITRATE(x) OPUS_SET_BITRATE_REQUEST, opus_check_int(x)\n/** Gets the encoder's bitrate configuration.\n  * @see OPUS_SET_BITRATE\n  * @param[out] x <tt>opus_int32 *</tt>: Returns the bitrate in bits per second.\n  *                                      The default is determined based on the\n  *                                      number of channels and the input\n  *                                      sampling rate.\n  * @hideinitializer */\n#define OPUS_GET_BITRATE(x) OPUS_GET_BITRATE_REQUEST, opus_check_int_ptr(x)\n\n/** Enables or disables variable bitrate (VBR) in the encoder.\n  * The configured bitrate may not be met exactly because frames must\n  * be an integer number of bytes in length.\n  * @see OPUS_GET_VBR\n  * @see OPUS_SET_VBR_CONSTRAINT\n  * @param[in] x <tt>opus_int32</tt>: Allowed values:\n  * <dl>\n  * <dt>0</dt><dd>Hard CBR. For LPC/hybrid modes at very low bit-rate, this can\n  *               cause noticeable quality degradation.</dd>\n  * <dt>1</dt><dd>VBR (default). The exact type of VBR is controlled by\n  *               #OPUS_SET_VBR_CONSTRAINT.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_SET_VBR(x) OPUS_SET_VBR_REQUEST, opus_check_int(x)\n/** Determine if variable bitrate (VBR) is enabled in the encoder.\n  * @see OPUS_SET_VBR\n  * @see OPUS_GET_VBR_CONSTRAINT\n  * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:\n  * <dl>\n  * <dt>0</dt><dd>Hard CBR.</dd>\n  * <dt>1</dt><dd>VBR (default). The exact type of VBR may be retrieved via\n  *               #OPUS_GET_VBR_CONSTRAINT.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_GET_VBR(x) OPUS_GET_VBR_REQUEST, opus_check_int_ptr(x)\n\n/** Enables or disables constrained VBR in the encoder.\n  * This setting is ignored when the encoder is in CBR mode.\n  * @warning Only the MDCT mode of Opus currently heeds the constraint.\n  *  Speech mode ignores it completely, hybrid mode may fail to obey it\n  *  if the LPC layer uses more bitrate than the constraint would have\n  *  permitted.\n  * @see OPUS_GET_VBR_CONSTRAINT\n  * @see OPUS_SET_VBR\n  * @param[in] x <tt>opus_int32</tt>: Allowed values:\n  * <dl>\n  * <dt>0</dt><dd>Unconstrained VBR.</dd>\n  * <dt>1</dt><dd>Constrained VBR (default). This creates a maximum of one\n  *               frame of buffering delay assuming a transport with a\n  *               serialization speed of the nominal bitrate.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_SET_VBR_CONSTRAINT(x) OPUS_SET_VBR_CONSTRAINT_REQUEST, opus_check_int(x)\n/** Determine if constrained VBR is enabled in the encoder.\n  * @see OPUS_SET_VBR_CONSTRAINT\n  * @see OPUS_GET_VBR\n  * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:\n  * <dl>\n  * <dt>0</dt><dd>Unconstrained VBR.</dd>\n  * <dt>1</dt><dd>Constrained VBR (default).</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_GET_VBR_CONSTRAINT(x) OPUS_GET_VBR_CONSTRAINT_REQUEST, opus_check_int_ptr(x)\n\n/** Configures mono/stereo forcing in the encoder.\n  * This can force the encoder to produce packets encoded as either mono or\n  * stereo, regardless of the format of the input audio. This is useful when\n  * the caller knows that the input signal is currently a mono source embedded\n  * in a stereo stream.\n  * @see OPUS_GET_FORCE_CHANNELS\n  * @param[in] x <tt>opus_int32</tt>: Allowed values:\n  * <dl>\n  * <dt>#OPUS_AUTO</dt><dd>Not forced (default)</dd>\n  * <dt>1</dt>         <dd>Forced mono</dd>\n  * <dt>2</dt>         <dd>Forced stereo</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_SET_FORCE_CHANNELS(x) OPUS_SET_FORCE_CHANNELS_REQUEST, opus_check_int(x)\n/** Gets the encoder's forced channel configuration.\n  * @see OPUS_SET_FORCE_CHANNELS\n  * @param[out] x <tt>opus_int32 *</tt>:\n  * <dl>\n  * <dt>#OPUS_AUTO</dt><dd>Not forced (default)</dd>\n  * <dt>1</dt>         <dd>Forced mono</dd>\n  * <dt>2</dt>         <dd>Forced stereo</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_GET_FORCE_CHANNELS(x) OPUS_GET_FORCE_CHANNELS_REQUEST, opus_check_int_ptr(x)\n\n/** Configures the maximum bandpass that the encoder will select automatically.\n  * Applications should normally use this instead of #OPUS_SET_BANDWIDTH\n  * (leaving that set to the default, #OPUS_AUTO). This allows the\n  * application to set an upper bound based on the type of input it is\n  * providing, but still gives the encoder the freedom to reduce the bandpass\n  * when the bitrate becomes too low, for better overall quality.\n  * @see OPUS_GET_MAX_BANDWIDTH\n  * @param[in] x <tt>opus_int32</tt>: Allowed values:\n  * <dl>\n  * <dt>OPUS_BANDWIDTH_NARROWBAND</dt>    <dd>4 kHz passband</dd>\n  * <dt>OPUS_BANDWIDTH_MEDIUMBAND</dt>    <dd>6 kHz passband</dd>\n  * <dt>OPUS_BANDWIDTH_WIDEBAND</dt>      <dd>8 kHz passband</dd>\n  * <dt>OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>\n  * <dt>OPUS_BANDWIDTH_FULLBAND</dt>     <dd>20 kHz passband (default)</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_SET_MAX_BANDWIDTH(x) OPUS_SET_MAX_BANDWIDTH_REQUEST, opus_check_int(x)\n\n/** Gets the encoder's configured maximum allowed bandpass.\n  * @see OPUS_SET_MAX_BANDWIDTH\n  * @param[out] x <tt>opus_int32 *</tt>: Allowed values:\n  * <dl>\n  * <dt>#OPUS_BANDWIDTH_NARROWBAND</dt>    <dd>4 kHz passband</dd>\n  * <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt>    <dd>6 kHz passband</dd>\n  * <dt>#OPUS_BANDWIDTH_WIDEBAND</dt>      <dd>8 kHz passband</dd>\n  * <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>\n  * <dt>#OPUS_BANDWIDTH_FULLBAND</dt>     <dd>20 kHz passband (default)</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_GET_MAX_BANDWIDTH(x) OPUS_GET_MAX_BANDWIDTH_REQUEST, opus_check_int_ptr(x)\n\n/** Sets the encoder's bandpass to a specific value.\n  * This prevents the encoder from automatically selecting the bandpass based\n  * on the available bitrate. If an application knows the bandpass of the input\n  * audio it is providing, it should normally use #OPUS_SET_MAX_BANDWIDTH\n  * instead, which still gives the encoder the freedom to reduce the bandpass\n  * when the bitrate becomes too low, for better overall quality.\n  * @see OPUS_GET_BANDWIDTH\n  * @param[in] x <tt>opus_int32</tt>: Allowed values:\n  * <dl>\n  * <dt>#OPUS_AUTO</dt>                    <dd>(default)</dd>\n  * <dt>#OPUS_BANDWIDTH_NARROWBAND</dt>    <dd>4 kHz passband</dd>\n  * <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt>    <dd>6 kHz passband</dd>\n  * <dt>#OPUS_BANDWIDTH_WIDEBAND</dt>      <dd>8 kHz passband</dd>\n  * <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>\n  * <dt>#OPUS_BANDWIDTH_FULLBAND</dt>     <dd>20 kHz passband</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_SET_BANDWIDTH(x) OPUS_SET_BANDWIDTH_REQUEST, opus_check_int(x)\n\n/** Configures the type of signal being encoded.\n  * This is a hint which helps the encoder's mode selection.\n  * @see OPUS_GET_SIGNAL\n  * @param[in] x <tt>opus_int32</tt>: Allowed values:\n  * <dl>\n  * <dt>#OPUS_AUTO</dt>        <dd>(default)</dd>\n  * <dt>#OPUS_SIGNAL_VOICE</dt><dd>Bias thresholds towards choosing LPC or Hybrid modes.</dd>\n  * <dt>#OPUS_SIGNAL_MUSIC</dt><dd>Bias thresholds towards choosing MDCT modes.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_SET_SIGNAL(x) OPUS_SET_SIGNAL_REQUEST, opus_check_int(x)\n/** Gets the encoder's configured signal type.\n  * @see OPUS_SET_SIGNAL\n  * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:\n  * <dl>\n  * <dt>#OPUS_AUTO</dt>        <dd>(default)</dd>\n  * <dt>#OPUS_SIGNAL_VOICE</dt><dd>Bias thresholds towards choosing LPC or Hybrid modes.</dd>\n  * <dt>#OPUS_SIGNAL_MUSIC</dt><dd>Bias thresholds towards choosing MDCT modes.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_GET_SIGNAL(x) OPUS_GET_SIGNAL_REQUEST, opus_check_int_ptr(x)\n\n\n/** Configures the encoder's intended application.\n  * The initial value is a mandatory argument to the encoder_create function.\n  * @see OPUS_GET_APPLICATION\n  * @param[in] x <tt>opus_int32</tt>: Returns one of the following values:\n  * <dl>\n  * <dt>#OPUS_APPLICATION_VOIP</dt>\n  * <dd>Process signal for improved speech intelligibility.</dd>\n  * <dt>#OPUS_APPLICATION_AUDIO</dt>\n  * <dd>Favor faithfulness to the original input.</dd>\n  * <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>\n  * <dd>Configure the minimum possible coding delay by disabling certain modes\n  * of operation.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_SET_APPLICATION(x) OPUS_SET_APPLICATION_REQUEST, opus_check_int(x)\n/** Gets the encoder's configured application.\n  * @see OPUS_SET_APPLICATION\n  * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:\n  * <dl>\n  * <dt>#OPUS_APPLICATION_VOIP</dt>\n  * <dd>Process signal for improved speech intelligibility.</dd>\n  * <dt>#OPUS_APPLICATION_AUDIO</dt>\n  * <dd>Favor faithfulness to the original input.</dd>\n  * <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>\n  * <dd>Configure the minimum possible coding delay by disabling certain modes\n  * of operation.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_GET_APPLICATION(x) OPUS_GET_APPLICATION_REQUEST, opus_check_int_ptr(x)\n\n/** Gets the total samples of delay added by the entire codec.\n  * This can be queried by the encoder and then the provided number of samples can be\n  * skipped on from the start of the decoder's output to provide time aligned input\n  * and output. From the perspective of a decoding application the real data begins this many\n  * samples late.\n  *\n  * The decoder contribution to this delay is identical for all decoders, but the\n  * encoder portion of the delay may vary from implementation to implementation,\n  * version to version, or even depend on the encoder's initial configuration.\n  * Applications needing delay compensation should call this CTL rather than\n  * hard-coding a value.\n  * @param[out] x <tt>opus_int32 *</tt>:   Number of lookahead samples\n  * @hideinitializer */\n#define OPUS_GET_LOOKAHEAD(x) OPUS_GET_LOOKAHEAD_REQUEST, opus_check_int_ptr(x)\n\n/** Configures the encoder's use of inband forward error correction (FEC).\n  * @note This is only applicable to the LPC layer\n  * @see OPUS_GET_INBAND_FEC\n  * @param[in] x <tt>opus_int32</tt>: Allowed values:\n  * <dl>\n  * <dt>0</dt><dd>Disable inband FEC (default).</dd>\n  * <dt>1</dt><dd>Inband FEC enabled. If the packet loss rate is sufficiently high, Opus will automatically switch to SILK even at high rates to enable use of that FEC.</dd>\n  * <dt>2</dt><dd>Inband FEC enabled, but does not necessarily switch to SILK if we have music.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_SET_INBAND_FEC(x) OPUS_SET_INBAND_FEC_REQUEST, opus_check_int(x)\n/** Gets encoder's configured use of inband forward error correction.\n  * @see OPUS_SET_INBAND_FEC\n  * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:\n  * <dl>\n  * <dt>0</dt><dd>Inband FEC disabled (default).</dd>\n  * <dt>1</dt><dd>Inband FEC enabled. If the packet loss rate is sufficiently high, Opus will automatically switch to SILK even at high rates to enable use of that FEC.</dd>\n  * <dt>2</dt><dd>Inband FEC enabled, but does not necessarily switch to SILK if we have music.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_GET_INBAND_FEC(x) OPUS_GET_INBAND_FEC_REQUEST, opus_check_int_ptr(x)\n\n/** Configures the encoder's expected packet loss percentage.\n  * Higher values trigger progressively more loss resistant behavior in the encoder\n  * at the expense of quality at a given bitrate in the absence of packet loss, but\n  * greater quality under loss.\n  * @see OPUS_GET_PACKET_LOSS_PERC\n  * @param[in] x <tt>opus_int32</tt>:   Loss percentage in the range 0-100, inclusive (default: 0).\n  * @hideinitializer */\n#define OPUS_SET_PACKET_LOSS_PERC(x) OPUS_SET_PACKET_LOSS_PERC_REQUEST, opus_check_int(x)\n/** Gets the encoder's configured packet loss percentage.\n  * @see OPUS_SET_PACKET_LOSS_PERC\n  * @param[out] x <tt>opus_int32 *</tt>: Returns the configured loss percentage\n  *                                      in the range 0-100, inclusive (default: 0).\n  * @hideinitializer */\n#define OPUS_GET_PACKET_LOSS_PERC(x) OPUS_GET_PACKET_LOSS_PERC_REQUEST, opus_check_int_ptr(x)\n\n/** Configures the encoder's use of discontinuous transmission (DTX).\n  * @note This is only applicable to the LPC layer\n  * @see OPUS_GET_DTX\n  * @param[in] x <tt>opus_int32</tt>: Allowed values:\n  * <dl>\n  * <dt>0</dt><dd>Disable DTX (default).</dd>\n  * <dt>1</dt><dd>Enabled DTX.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_SET_DTX(x) OPUS_SET_DTX_REQUEST, opus_check_int(x)\n/** Gets encoder's configured use of discontinuous transmission.\n  * @see OPUS_SET_DTX\n  * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:\n  * <dl>\n  * <dt>0</dt><dd>DTX disabled (default).</dd>\n  * <dt>1</dt><dd>DTX enabled.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_GET_DTX(x) OPUS_GET_DTX_REQUEST, opus_check_int_ptr(x)\n/** Configures the depth of signal being encoded.\n  *\n  * This is a hint which helps the encoder identify silence and near-silence.\n  * It represents the number of significant bits of linear intensity below\n  * which the signal contains ignorable quantization or other noise.\n  *\n  * For example, OPUS_SET_LSB_DEPTH(14) would be an appropriate setting\n  * for G.711 u-law input. OPUS_SET_LSB_DEPTH(16) would be appropriate\n  * for 16-bit linear pcm input with opus_encode_float().\n  *\n  * When using opus_encode() instead of opus_encode_float(), or when libopus\n  * is compiled for fixed-point, the encoder uses the minimum of the value\n  * set here and the value 16.\n  *\n  * @see OPUS_GET_LSB_DEPTH\n  * @param[in] x <tt>opus_int32</tt>: Input precision in bits, between 8 and 24\n  *                                   (default: 24).\n  * @hideinitializer */\n#define OPUS_SET_LSB_DEPTH(x) OPUS_SET_LSB_DEPTH_REQUEST, opus_check_int(x)\n/** Gets the encoder's configured signal depth.\n  * @see OPUS_SET_LSB_DEPTH\n  * @param[out] x <tt>opus_int32 *</tt>: Input precision in bits, between 8 and\n  *                                      24 (default: 24).\n  * @hideinitializer */\n#define OPUS_GET_LSB_DEPTH(x) OPUS_GET_LSB_DEPTH_REQUEST, opus_check_int_ptr(x)\n\n/** Configures the encoder's use of variable duration frames.\n  * When variable duration is enabled, the encoder is free to use a shorter frame\n  * size than the one requested in the opus_encode*() call.\n  * It is then the user's responsibility\n  * to verify how much audio was encoded by checking the ToC byte of the encoded\n  * packet. The part of the audio that was not encoded needs to be resent to the\n  * encoder for the next call. Do not use this option unless you <b>really</b>\n  * know what you are doing.\n  * @see OPUS_GET_EXPERT_FRAME_DURATION\n  * @param[in] x <tt>opus_int32</tt>: Allowed values:\n  * <dl>\n  * <dt>OPUS_FRAMESIZE_ARG</dt><dd>Select frame size from the argument (default).</dd>\n  * <dt>OPUS_FRAMESIZE_2_5_MS</dt><dd>Use 2.5 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_5_MS</dt><dd>Use 5 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_10_MS</dt><dd>Use 10 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_20_MS</dt><dd>Use 20 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_40_MS</dt><dd>Use 40 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_60_MS</dt><dd>Use 60 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_80_MS</dt><dd>Use 80 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_100_MS</dt><dd>Use 100 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_120_MS</dt><dd>Use 120 ms frames.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_SET_EXPERT_FRAME_DURATION(x) OPUS_SET_EXPERT_FRAME_DURATION_REQUEST, opus_check_int(x)\n/** Gets the encoder's configured use of variable duration frames.\n  * @see OPUS_SET_EXPERT_FRAME_DURATION\n  * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:\n  * <dl>\n  * <dt>OPUS_FRAMESIZE_ARG</dt><dd>Select frame size from the argument (default).</dd>\n  * <dt>OPUS_FRAMESIZE_2_5_MS</dt><dd>Use 2.5 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_5_MS</dt><dd>Use 5 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_10_MS</dt><dd>Use 10 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_20_MS</dt><dd>Use 20 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_40_MS</dt><dd>Use 40 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_60_MS</dt><dd>Use 60 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_80_MS</dt><dd>Use 80 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_100_MS</dt><dd>Use 100 ms frames.</dd>\n  * <dt>OPUS_FRAMESIZE_120_MS</dt><dd>Use 120 ms frames.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_GET_EXPERT_FRAME_DURATION(x) OPUS_GET_EXPERT_FRAME_DURATION_REQUEST, opus_check_int_ptr(x)\n\n/** If set to 1, disables almost all use of prediction, making frames almost\n  * completely independent. This reduces quality.\n  * @see OPUS_GET_PREDICTION_DISABLED\n  * @param[in] x <tt>opus_int32</tt>: Allowed values:\n  * <dl>\n  * <dt>0</dt><dd>Enable prediction (default).</dd>\n  * <dt>1</dt><dd>Disable prediction.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_SET_PREDICTION_DISABLED(x) OPUS_SET_PREDICTION_DISABLED_REQUEST, opus_check_int(x)\n/** Gets the encoder's configured prediction status.\n  * @see OPUS_SET_PREDICTION_DISABLED\n  * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:\n  * <dl>\n  * <dt>0</dt><dd>Prediction enabled (default).</dd>\n  * <dt>1</dt><dd>Prediction disabled.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_GET_PREDICTION_DISABLED(x) OPUS_GET_PREDICTION_DISABLED_REQUEST, opus_check_int_ptr(x)\n\n/** If non-zero, enables Deep Redundancy (DRED) and use the specified maximum number of 10-ms redundant frames\n  * @hideinitializer */\n#define OPUS_SET_DRED_DURATION(x) OPUS_SET_DRED_DURATION_REQUEST, opus_check_int(x)\n/** Gets the encoder's configured Deep Redundancy (DRED) maximum number of frames.\n  * @hideinitializer */\n#define OPUS_GET_DRED_DURATION(x) OPUS_GET_DRED_DURATION_REQUEST, opus_check_int_ptr(x)\n\n/** Provide external DNN weights from binary object (only when explicitly built without the weights)\n  * @hideinitializer */\n#define OPUS_SET_DNN_BLOB(data, len) OPUS_SET_DNN_BLOB_REQUEST, opus_check_void_ptr(data), opus_check_int(len)\n\n/** If set to 1, enables quality extension (QEXT), otherwise disables it (default). Warning: This will *hurt* audio quality unless operating at\n    a very high bitrate.\n  * @hideinitializer */\n#define OPUS_SET_QEXT(x) OPUS_SET_QEXT_REQUEST, opus_check_int(x)\n/** Gets the encoder's configured quality extension (QEXT).\n  * @hideinitializer */\n#define OPUS_GET_QEXT(x) OPUS_GET_QEXT_REQUEST, opus_check_int_ptr(x)\n\n/**@}*/\n\n/** @defgroup opus_genericctls Generic CTLs\n  *\n  * These macros are used with the \\c opus_decoder_ctl and\n  * \\c opus_encoder_ctl calls to generate a particular\n  * request.\n  *\n  * When called on an \\c OpusDecoder they apply to that\n  * particular decoder instance. When called on an\n  * \\c OpusEncoder they apply to the corresponding setting\n  * on that encoder instance, if present.\n  *\n  * Some usage examples:\n  *\n  * @code\n  * int ret;\n  * opus_int32 pitch;\n  * ret = opus_decoder_ctl(dec_ctx, OPUS_GET_PITCH(&pitch));\n  * if (ret == OPUS_OK) return ret;\n  *\n  * opus_encoder_ctl(enc_ctx, OPUS_RESET_STATE);\n  * opus_decoder_ctl(dec_ctx, OPUS_RESET_STATE);\n  *\n  * opus_int32 enc_bw, dec_bw;\n  * opus_encoder_ctl(enc_ctx, OPUS_GET_BANDWIDTH(&enc_bw));\n  * opus_decoder_ctl(dec_ctx, OPUS_GET_BANDWIDTH(&dec_bw));\n  * if (enc_bw != dec_bw) {\n  *   printf(\"packet bandwidth mismatch!\\n\");\n  * }\n  * @endcode\n  *\n  * @see opus_encoder, opus_decoder_ctl, opus_encoder_ctl, opus_decoderctls, opus_encoderctls\n  * @{\n  */\n\n/** Resets the codec state to be equivalent to a freshly initialized state.\n  * This should be called when switching streams in order to prevent\n  * the back to back decoding from giving different results from\n  * one at a time decoding.\n  * @hideinitializer */\n#define OPUS_RESET_STATE 4028\n\n/** Gets the final state of the codec's entropy coder.\n  * This is used for testing purposes,\n  * The encoder and decoder state should be identical after coding a payload\n  * (assuming no data corruption or software bugs)\n  *\n  * @param[out] x <tt>opus_uint32 *</tt>: Entropy coder state\n  *\n  * @hideinitializer */\n#define OPUS_GET_FINAL_RANGE(x) OPUS_GET_FINAL_RANGE_REQUEST, opus_check_uint_ptr(x)\n\n/** Gets the encoder's configured bandpass or the decoder's last bandpass.\n  * @see OPUS_SET_BANDWIDTH\n  * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:\n  * <dl>\n  * <dt>#OPUS_AUTO</dt>                    <dd>(default)</dd>\n  * <dt>#OPUS_BANDWIDTH_NARROWBAND</dt>    <dd>4 kHz passband</dd>\n  * <dt>#OPUS_BANDWIDTH_MEDIUMBAND</dt>    <dd>6 kHz passband</dd>\n  * <dt>#OPUS_BANDWIDTH_WIDEBAND</dt>      <dd>8 kHz passband</dd>\n  * <dt>#OPUS_BANDWIDTH_SUPERWIDEBAND</dt><dd>12 kHz passband</dd>\n  * <dt>#OPUS_BANDWIDTH_FULLBAND</dt>     <dd>20 kHz passband</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_GET_BANDWIDTH(x) OPUS_GET_BANDWIDTH_REQUEST, opus_check_int_ptr(x)\n\n/** Gets the sampling rate the encoder or decoder was initialized with.\n  * This simply returns the <code>Fs</code> value passed to opus_encoder_init()\n  * or opus_decoder_init().\n  * @param[out] x <tt>opus_int32 *</tt>: Sampling rate of encoder or decoder.\n  * @hideinitializer\n  */\n#define OPUS_GET_SAMPLE_RATE(x) OPUS_GET_SAMPLE_RATE_REQUEST, opus_check_int_ptr(x)\n\n/** If set to 1, disables the use of phase inversion for intensity stereo,\n  * improving the quality of mono downmixes, but slightly reducing normal\n  * stereo quality. Disabling phase inversion in the decoder does not comply\n  * with RFC 6716, although it does not cause any interoperability issue and\n  * is expected to become part of the Opus standard once RFC 6716 is updated\n  * by draft-ietf-codec-opus-update.\n  * @see OPUS_GET_PHASE_INVERSION_DISABLED\n  * @param[in] x <tt>opus_int32</tt>: Allowed values:\n  * <dl>\n  * <dt>0</dt><dd>Enable phase inversion (default).</dd>\n  * <dt>1</dt><dd>Disable phase inversion.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_SET_PHASE_INVERSION_DISABLED(x) OPUS_SET_PHASE_INVERSION_DISABLED_REQUEST, opus_check_int(x)\n/** Gets the encoder's configured phase inversion status.\n  * @see OPUS_SET_PHASE_INVERSION_DISABLED\n  * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:\n  * <dl>\n  * <dt>0</dt><dd>Stereo phase inversion enabled (default).</dd>\n  * <dt>1</dt><dd>Stereo phase inversion disabled.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_GET_PHASE_INVERSION_DISABLED(x) OPUS_GET_PHASE_INVERSION_DISABLED_REQUEST, opus_check_int_ptr(x)\n/** Gets the DTX state of the encoder.\n  * Returns whether the last encoded frame was either a comfort noise update\n  * during DTX or not encoded because of DTX.\n  * @param[out] x <tt>opus_int32 *</tt>: Returns one of the following values:\n  * <dl>\n  * <dt>0</dt><dd>The encoder is not in DTX.</dd>\n  * <dt>1</dt><dd>The encoder is in DTX.</dd>\n  * </dl>\n  * @hideinitializer */\n#define OPUS_GET_IN_DTX(x) OPUS_GET_IN_DTX_REQUEST, opus_check_int_ptr(x)\n\n/**@}*/\n\n/** @defgroup opus_decoderctls Decoder related CTLs\n  * @see opus_genericctls, opus_encoderctls, opus_decoder\n  * @{\n  */\n\n/** Configures decoder gain adjustment.\n  * Scales the decoded output by a factor specified in Q8 dB units.\n  * This has a maximum range of -32768 to 32767 inclusive, and returns\n  * OPUS_BAD_ARG otherwise. The default is zero indicating no adjustment.\n  * This setting survives decoder reset.\n  *\n  * gain = pow(10, x/(20.0*256))\n  *\n  * @param[in] x <tt>opus_int32</tt>:   Amount to scale PCM signal by in Q8 dB units.\n  * @hideinitializer */\n#define OPUS_SET_GAIN(x) OPUS_SET_GAIN_REQUEST, opus_check_int(x)\n/** Gets the decoder's configured gain adjustment. @see OPUS_SET_GAIN\n  *\n  * @param[out] x <tt>opus_int32 *</tt>: Amount to scale PCM signal by in Q8 dB units.\n  * @hideinitializer */\n#define OPUS_GET_GAIN(x) OPUS_GET_GAIN_REQUEST, opus_check_int_ptr(x)\n\n/** Gets the duration (in samples) of the last packet successfully decoded or concealed.\n  * @param[out] x <tt>opus_int32 *</tt>: Number of samples (at current sampling rate).\n  * @hideinitializer */\n#define OPUS_GET_LAST_PACKET_DURATION(x) OPUS_GET_LAST_PACKET_DURATION_REQUEST, opus_check_int_ptr(x)\n\n/** Gets the pitch of the last decoded frame, if available.\n  * This can be used for any post-processing algorithm requiring the use of pitch,\n  * e.g. time stretching/shortening. If the last frame was not voiced, or if the\n  * pitch was not coded in the frame, then zero is returned.\n  *\n  * This CTL is only implemented for decoder instances.\n  *\n  * @param[out] x <tt>opus_int32 *</tt>: pitch period at 48 kHz (or 0 if not available)\n  *\n  * @hideinitializer */\n#define OPUS_GET_PITCH(x) OPUS_GET_PITCH_REQUEST, opus_check_int_ptr(x)\n\n/** Enables blind bandwidth extension for wideband signals if decoding sampling rate is 48 kHz.\n  * @param[in] x <tt>opus_int32 </tt>: 1 enables bandwidth extension, 0 disables it.\n  * The default is 0.\n  *\n  * @hideinitializer */\n #define OPUS_SET_OSCE_BWE(x) OPUS_SET_OSCE_BWE_REQUEST, opus_check_int(x)\n/** Gets blind bandwidth extension flag for wideband signals if decoding sampling rate is 48 kHz.\n  * @param[out] x <tt>opus_int32 *</tt>: 1 if bwe enabled, 0 if disabled.\n  *\n  * @hideinitializer */\n #define OPUS_GET_OSCE_BWE(x) OPUS_GET_OSCE_BWE_REQUEST, opus_check_int_ptr(x)\n\n/** If set to 1, the decoder will ignore all extensions found in the padding area\n  * (does not affect DRED, which is decoded separately).\n  * @hideinitializer */\n#define OPUS_SET_IGNORE_EXTENSIONS(x) OPUS_SET_IGNORE_EXTENSIONS_REQUEST, opus_check_int(x)\n/** Gets whether the decoder is ignoring extensions.\n  * @hideinitializer */\n#define OPUS_GET_IGNORE_EXTENSIONS(x) OPUS_GET_IGNORE_EXTENSIONS_REQUEST, opus_check_int_ptr(x)\n\n/**@}*/\n\n/** @defgroup opus_libinfo Opus library information functions\n  * @{\n  */\n\n/** Converts an opus error code into a human readable string.\n  *\n  * @param[in] error <tt>int</tt>: Error number\n  * @returns Error string\n  */\nOPUS_EXPORT const char *opus_strerror(int error);\n\n/** Gets the libopus version string.\n  *\n  * Applications may look for the substring \"-fixed\" in the version string to\n  * determine whether they have a fixed-point or floating-point build at\n  * runtime.\n  *\n  * @returns Version string\n  */\nOPUS_EXPORT const char *opus_get_version_string(void);\n/**@}*/\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* OPUS_DEFINES_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include/opus/opus_multistream.h",
    "content": "/* Copyright (c) 2011 Xiph.Org Foundation\n   Written by Jean-Marc Valin */\n/*\n   Redistribution and use in source and binary forms, with or without\n   modification, are permitted provided that the following conditions\n   are met:\n\n   - Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\n   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\n   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n * @file opus_multistream.h\n * @brief Opus reference implementation multistream API\n */\n\n#ifndef OPUS_MULTISTREAM_H\n#define OPUS_MULTISTREAM_H\n\n#include \"opus.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @cond OPUS_INTERNAL_DOC */\n\n/** Macros to trigger compilation errors when the wrong types are provided to a\n  * CTL. */\n/**@{*/\n#define opus_check_encstate_ptr(ptr) ((ptr) + ((ptr) - (OpusEncoder**)(ptr)))\n#define opus_check_decstate_ptr(ptr) ((ptr) + ((ptr) - (OpusDecoder**)(ptr)))\n/**@}*/\n\n/** These are the actual encoder and decoder CTL ID numbers.\n  * They should not be used directly by applications.\n  * In general, SETs should be even and GETs should be odd.*/\n/**@{*/\n#define OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST 5120\n#define OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST 5122\n/**@}*/\n\n/** @endcond */\n\n/** @defgroup opus_multistream_ctls Multistream specific encoder and decoder CTLs\n  *\n  * These are convenience macros that are specific to the\n  * opus_multistream_encoder_ctl() and opus_multistream_decoder_ctl()\n  * interface.\n  * The CTLs from @ref opus_genericctls, @ref opus_encoderctls, and\n  * @ref opus_decoderctls may be applied to a multistream encoder or decoder as\n  * well.\n  * In addition, you may retrieve the encoder or decoder state for an specific\n  * stream via #OPUS_MULTISTREAM_GET_ENCODER_STATE or\n  * #OPUS_MULTISTREAM_GET_DECODER_STATE and apply CTLs to it individually.\n  */\n/**@{*/\n\n/** Gets the encoder state for an individual stream of a multistream encoder.\n  * @param[in] x <tt>opus_int32</tt>: The index of the stream whose encoder you\n  *                                   wish to retrieve.\n  *                                   This must be non-negative and less than\n  *                                   the <code>streams</code> parameter used\n  *                                   to initialize the encoder.\n  * @param[out] y <tt>OpusEncoder**</tt>: Returns a pointer to the given\n  *                                       encoder state.\n  * @retval OPUS_BAD_ARG The index of the requested stream was out of range.\n  * @hideinitializer\n  */\n#define OPUS_MULTISTREAM_GET_ENCODER_STATE(x,y) OPUS_MULTISTREAM_GET_ENCODER_STATE_REQUEST, opus_check_int(x), opus_check_encstate_ptr(y)\n\n/** Gets the decoder state for an individual stream of a multistream decoder.\n  * @param[in] x <tt>opus_int32</tt>: The index of the stream whose decoder you\n  *                                   wish to retrieve.\n  *                                   This must be non-negative and less than\n  *                                   the <code>streams</code> parameter used\n  *                                   to initialize the decoder.\n  * @param[out] y <tt>OpusDecoder**</tt>: Returns a pointer to the given\n  *                                       decoder state.\n  * @retval OPUS_BAD_ARG The index of the requested stream was out of range.\n  * @hideinitializer\n  */\n#define OPUS_MULTISTREAM_GET_DECODER_STATE(x,y) OPUS_MULTISTREAM_GET_DECODER_STATE_REQUEST, opus_check_int(x), opus_check_decstate_ptr(y)\n\n/**@}*/\n\n/** @defgroup opus_multistream Opus Multistream API\n  * @{\n  *\n  * The multistream API allows individual Opus streams to be combined into a\n  * single packet, enabling support for up to 255 channels. Unlike an\n  * elementary Opus stream, the encoder and decoder must negotiate the channel\n  * configuration before the decoder can successfully interpret the data in the\n  * packets produced by the encoder. Some basic information, such as packet\n  * duration, can be computed without any special negotiation.\n  *\n  * The format for multistream Opus packets is defined in\n  * <a href=\"https://tools.ietf.org/html/rfc7845\">RFC 7845</a>\n  * and is based on the self-delimited Opus framing described in Appendix B of\n  * <a href=\"https://tools.ietf.org/html/rfc6716\">RFC 6716</a>.\n  * Normal Opus packets are just a degenerate case of multistream Opus packets,\n  * and can be encoded or decoded with the multistream API by setting\n  * <code>streams</code> to <code>1</code> when initializing the encoder or\n  * decoder.\n  *\n  * Multistream Opus streams can contain up to 255 elementary Opus streams.\n  * These may be either \"uncoupled\" or \"coupled\", indicating that the decoder\n  * is configured to decode them to either 1 or 2 channels, respectively.\n  * The streams are ordered so that all coupled streams appear at the\n  * beginning.\n  *\n  * A <code>mapping</code> table defines which decoded channel <code>i</code>\n  * should be used for each input/output (I/O) channel <code>j</code>. This table is\n  * typically provided as an unsigned char array.\n  * Let <code>i = mapping[j]</code> be the index for I/O channel <code>j</code>.\n  * If <code>i < 2*coupled_streams</code>, then I/O channel <code>j</code> is\n  * encoded as the left channel of stream <code>(i/2)</code> if <code>i</code>\n  * is even, or  as the right channel of stream <code>(i/2)</code> if\n  * <code>i</code> is odd. Otherwise, I/O channel <code>j</code> is encoded as\n  * mono in stream <code>(i - coupled_streams)</code>, unless it has the special\n  * value 255, in which case it is omitted from the encoding entirely (the\n  * decoder will reproduce it as silence). Each value <code>i</code> must either\n  * be the special value 255 or be less than <code>streams + coupled_streams</code>.\n  *\n  * The output channels specified by the encoder\n  * should use the\n  * <a href=\"https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810004.3.9\">Vorbis\n  * channel ordering</a>. A decoder may wish to apply an additional permutation\n  * to the mapping the encoder used to achieve a different output channel\n  * order (e.g. for outputting in WAV order).\n  *\n  * Each multistream packet contains an Opus packet for each stream, and all of\n  * the Opus packets in a single multistream packet must have the same\n  * duration. Therefore the duration of a multistream packet can be extracted\n  * from the TOC sequence of the first stream, which is located at the\n  * beginning of the packet, just like an elementary Opus stream:\n  *\n  * @code\n  * int nb_samples;\n  * int nb_frames;\n  * nb_frames = opus_packet_get_nb_frames(data, len);\n  * if (nb_frames < 1)\n  *   return nb_frames;\n  * nb_samples = opus_packet_get_samples_per_frame(data, 48000) * nb_frames;\n  * @endcode\n  *\n  * The general encoding and decoding process proceeds exactly the same as in\n  * the normal @ref opus_encoder and @ref opus_decoder APIs.\n  * See their documentation for an overview of how to use the corresponding\n  * multistream functions.\n  */\n\n/** Opus multistream encoder state.\n  * This contains the complete state of a multistream Opus encoder.\n  * It is position independent and can be freely copied.\n  * @see opus_multistream_encoder_create\n  * @see opus_multistream_encoder_init\n  */\ntypedef struct OpusMSEncoder OpusMSEncoder;\n\n/** Opus multistream decoder state.\n  * This contains the complete state of a multistream Opus decoder.\n  * It is position independent and can be freely copied.\n  * @see opus_multistream_decoder_create\n  * @see opus_multistream_decoder_init\n  */\ntypedef struct OpusMSDecoder OpusMSDecoder;\n\n/**\\name Multistream encoder functions */\n/**@{*/\n\n/** Gets the size of an OpusMSEncoder structure.\n  * @param streams <tt>int</tt>: The total number of streams to encode from the\n  *                              input.\n  *                              This must be no more than 255.\n  * @param coupled_streams <tt>int</tt>: Number of coupled (2 channel) streams\n  *                                      to encode.\n  *                                      This must be no larger than the total\n  *                                      number of streams.\n  *                                      Additionally, The total number of\n  *                                      encoded channels (<code>streams +\n  *                                      coupled_streams</code>) must be no\n  *                                      more than 255.\n  * @returns The size in bytes on success, or a negative error code\n  *          (see @ref opus_errorcodes) on error.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_encoder_get_size(\n      int streams,\n      int coupled_streams\n);\n\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_surround_encoder_get_size(\n      int channels,\n      int mapping_family\n);\n\n\n/** Allocates and initializes a multistream encoder state.\n  * Call opus_multistream_encoder_destroy() to release\n  * this object when finished.\n  * @param Fs <tt>opus_int32</tt>: Sampling rate of the input signal (in Hz).\n  *                                This must be one of 8000, 12000, 16000,\n  *                                24000, or 48000.\n  * @param channels <tt>int</tt>: Number of channels in the input signal.\n  *                               This must be at most 255.\n  *                               It may be greater than the number of\n  *                               coded channels (<code>streams +\n  *                               coupled_streams</code>).\n  * @param streams <tt>int</tt>: The total number of streams to encode from the\n  *                              input.\n  *                              This must be no more than the number of channels.\n  * @param coupled_streams <tt>int</tt>: Number of coupled (2 channel) streams\n  *                                      to encode.\n  *                                      This must be no larger than the total\n  *                                      number of streams.\n  *                                      Additionally, The total number of\n  *                                      encoded channels (<code>streams +\n  *                                      coupled_streams</code>) must be no\n  *                                      more than the number of input channels.\n  * @param[in] mapping <code>const unsigned char[channels]</code>: Mapping from\n  *                    encoded channels to input channels, as described in\n  *                    @ref opus_multistream. As an extra constraint, the\n  *                    multistream encoder does not allow encoding coupled\n  *                    streams for which one channel is unused since this\n  *                    is never a good idea.\n  * @param application <tt>int</tt>: The target encoder application.\n  *                                  This must be one of the following:\n  * <dl>\n  * <dt>#OPUS_APPLICATION_VOIP</dt>\n  * <dd>Process signal for improved speech intelligibility.</dd>\n  * <dt>#OPUS_APPLICATION_AUDIO</dt>\n  * <dd>Favor faithfulness to the original input.</dd>\n  * <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>\n  * <dd>Configure the minimum possible coding delay by disabling certain modes\n  * of operation.</dd>\n  * </dl>\n  * @param[out] error <tt>int *</tt>: Returns #OPUS_OK on success, or an error\n  *                                   code (see @ref opus_errorcodes) on\n  *                                   failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_encoder_create(\n      opus_int32 Fs,\n      int channels,\n      int streams,\n      int coupled_streams,\n      const unsigned char *mapping,\n      int application,\n      int *error\n) OPUS_ARG_NONNULL(5);\n\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSEncoder *opus_multistream_surround_encoder_create(\n      opus_int32 Fs,\n      int channels,\n      int mapping_family,\n      int *streams,\n      int *coupled_streams,\n      unsigned char *mapping,\n      int application,\n      int *error\n) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6);\n\n/** Initialize a previously allocated multistream encoder state.\n  * The memory pointed to by \\a st must be at least the size returned by\n  * opus_multistream_encoder_get_size().\n  * This is intended for applications which use their own allocator instead of\n  * malloc.\n  * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.\n  * @see opus_multistream_encoder_create\n  * @see opus_multistream_encoder_get_size\n  * @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state to initialize.\n  * @param Fs <tt>opus_int32</tt>: Sampling rate of the input signal (in Hz).\n  *                                This must be one of 8000, 12000, 16000,\n  *                                24000, or 48000.\n  * @param channels <tt>int</tt>: Number of channels in the input signal.\n  *                               This must be at most 255.\n  *                               It may be greater than the number of\n  *                               coded channels (<code>streams +\n  *                               coupled_streams</code>).\n  * @param streams <tt>int</tt>: The total number of streams to encode from the\n  *                              input.\n  *                              This must be no more than the number of channels.\n  * @param coupled_streams <tt>int</tt>: Number of coupled (2 channel) streams\n  *                                      to encode.\n  *                                      This must be no larger than the total\n  *                                      number of streams.\n  *                                      Additionally, The total number of\n  *                                      encoded channels (<code>streams +\n  *                                      coupled_streams</code>) must be no\n  *                                      more than the number of input channels.\n  * @param[in] mapping <code>const unsigned char[channels]</code>: Mapping from\n  *                    encoded channels to input channels, as described in\n  *                    @ref opus_multistream. As an extra constraint, the\n  *                    multistream encoder does not allow encoding coupled\n  *                    streams for which one channel is unused since this\n  *                    is never a good idea.\n  * @param application <tt>int</tt>: The target encoder application.\n  *                                  This must be one of the following:\n  * <dl>\n  * <dt>#OPUS_APPLICATION_VOIP</dt>\n  * <dd>Process signal for improved speech intelligibility.</dd>\n  * <dt>#OPUS_APPLICATION_AUDIO</dt>\n  * <dd>Favor faithfulness to the original input.</dd>\n  * <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>\n  * <dd>Configure the minimum possible coding delay by disabling certain modes\n  * of operation.</dd>\n  * </dl>\n  * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)\n  *          on failure.\n  */\nOPUS_EXPORT int opus_multistream_encoder_init(\n      OpusMSEncoder *st,\n      opus_int32 Fs,\n      int channels,\n      int streams,\n      int coupled_streams,\n      const unsigned char *mapping,\n      int application\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);\n\nOPUS_EXPORT int opus_multistream_surround_encoder_init(\n      OpusMSEncoder *st,\n      opus_int32 Fs,\n      int channels,\n      int mapping_family,\n      int *streams,\n      int *coupled_streams,\n      unsigned char *mapping,\n      int application\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6) OPUS_ARG_NONNULL(7);\n\n/** Encodes a multistream Opus frame.\n  * @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state.\n  * @param[in] pcm <tt>const opus_int16*</tt>: The input signal as interleaved\n  *                                            samples.\n  *                                            This must contain\n  *                                            <code>frame_size*channels</code>\n  *                                            samples.\n  * @param frame_size <tt>int</tt>: Number of samples per channel in the input\n  *                                 signal.\n  *                                 This must be an Opus frame size for the\n  *                                 encoder's sampling rate.\n  *                                 For example, at 48 kHz the permitted values\n  *                                 are 120, 240, 480, 960, 1920, and 2880.\n  *                                 Passing in a duration of less than 10 ms\n  *                                 (480 samples at 48 kHz) will prevent the\n  *                                 encoder from using the LPC or hybrid modes.\n  * @param[out] data <tt>unsigned char*</tt>: Output payload.\n  *                                           This must contain storage for at\n  *                                           least \\a max_data_bytes.\n  * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated\n  *                                                 memory for the output\n  *                                                 payload. This may be\n  *                                                 used to impose an upper limit on\n  *                                                 the instant bitrate, but should\n  *                                                 not be used as the only bitrate\n  *                                                 control. Use #OPUS_SET_BITRATE to\n  *                                                 control the bitrate.\n  * @returns The length of the encoded packet (in bytes) on success or a\n  *          negative error code (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode(\n    OpusMSEncoder *st,\n    const opus_int16 *pcm,\n    int frame_size,\n    unsigned char *data,\n    opus_int32 max_data_bytes\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);\n\n/** Encodes a multistream Opus frame.\n  * @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state.\n  * @param[in] pcm <tt>const opus_int32*</tt>: The input signal as interleaved\n  *                                            samples representing (or slightly exceeding) 24-bit values.\n  *                                            This must contain\n  *                                            <code>frame_size*channels</code>\n  *                                            samples.\n  * @param frame_size <tt>int</tt>: Number of samples per channel in the input\n  *                                 signal.\n  *                                 This must be an Opus frame size for the\n  *                                 encoder's sampling rate.\n  *                                 For example, at 48 kHz the permitted values\n  *                                 are 120, 240, 480, 960, 1920, and 2880.\n  *                                 Passing in a duration of less than 10 ms\n  *                                 (480 samples at 48 kHz) will prevent the\n  *                                 encoder from using the LPC or hybrid modes.\n  * @param[out] data <tt>unsigned char*</tt>: Output payload.\n  *                                           This must contain storage for at\n  *                                           least \\a max_data_bytes.\n  * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated\n  *                                                 memory for the output\n  *                                                 payload. This may be\n  *                                                 used to impose an upper limit on\n  *                                                 the instant bitrate, but should\n  *                                                 not be used as the only bitrate\n  *                                                 control. Use #OPUS_SET_BITRATE to\n  *                                                 control the bitrate.\n  * @returns The length of the encoded packet (in bytes) on success or a\n  *          negative error code (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode24(\n    OpusMSEncoder *st,\n    const opus_int32 *pcm,\n    int frame_size,\n    unsigned char *data,\n    opus_int32 max_data_bytes\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);\n\n/** Encodes a multistream Opus frame from floating point input.\n  * @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state.\n  * @param[in] pcm <tt>const float*</tt>: The input signal as interleaved\n  *                                       samples with a normal range of\n  *                                       +/-1.0.\n  *                                       Samples with a range beyond +/-1.0\n  *                                       are supported but will be clipped by\n  *                                       decoders using the integer API and\n  *                                       should only be used if it is known\n  *                                       that the far end supports extended\n  *                                       dynamic range.\n  *                                       This must contain\n  *                                       <code>frame_size*channels</code>\n  *                                       samples.\n  * @param frame_size <tt>int</tt>: Number of samples per channel in the input\n  *                                 signal.\n  *                                 This must be an Opus frame size for the\n  *                                 encoder's sampling rate.\n  *                                 For example, at 48 kHz the permitted values\n  *                                 are 120, 240, 480, 960, 1920, and 2880.\n  *                                 Passing in a duration of less than 10 ms\n  *                                 (480 samples at 48 kHz) will prevent the\n  *                                 encoder from using the LPC or hybrid modes.\n  * @param[out] data <tt>unsigned char*</tt>: Output payload.\n  *                                           This must contain storage for at\n  *                                           least \\a max_data_bytes.\n  * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated\n  *                                                 memory for the output\n  *                                                 payload. This may be\n  *                                                 used to impose an upper limit on\n  *                                                 the instant bitrate, but should\n  *                                                 not be used as the only bitrate\n  *                                                 control. Use #OPUS_SET_BITRATE to\n  *                                                 control the bitrate.\n  * @returns The length of the encoded packet (in bytes) on success or a\n  *          negative error code (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_encode_float(\n      OpusMSEncoder *st,\n      const float *pcm,\n      int frame_size,\n      unsigned char *data,\n      opus_int32 max_data_bytes\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);\n\n/** Frees an <code>OpusMSEncoder</code> allocated by\n  * opus_multistream_encoder_create().\n  * @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state to be freed.\n  */\nOPUS_EXPORT void opus_multistream_encoder_destroy(OpusMSEncoder *st);\n\n/** Perform a CTL function on a multistream Opus encoder.\n  *\n  * Generally the request and subsequent arguments are generated by a\n  * convenience macro.\n  * @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state.\n  * @param request This and all remaining parameters should be replaced by one\n  *                of the convenience macros in @ref opus_genericctls,\n  *                @ref opus_encoderctls, or @ref opus_multistream_ctls.\n  * @see opus_genericctls\n  * @see opus_encoderctls\n  * @see opus_multistream_ctls\n  */\nOPUS_EXPORT int opus_multistream_encoder_ctl(OpusMSEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);\n\n/**@}*/\n\n/**\\name Multistream decoder functions */\n/**@{*/\n\n/** Gets the size of an <code>OpusMSDecoder</code> structure.\n  * @param streams <tt>int</tt>: The total number of streams coded in the\n  *                              input.\n  *                              This must be no more than 255.\n  * @param coupled_streams <tt>int</tt>: Number streams to decode as coupled\n  *                                      (2 channel) streams.\n  *                                      This must be no larger than the total\n  *                                      number of streams.\n  *                                      Additionally, The total number of\n  *                                      coded channels (<code>streams +\n  *                                      coupled_streams</code>) must be no\n  *                                      more than 255.\n  * @returns The size in bytes on success, or a negative error code\n  *          (see @ref opus_errorcodes) on error.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_multistream_decoder_get_size(\n      int streams,\n      int coupled_streams\n);\n\n/** Allocates and initializes a multistream decoder state.\n  * Call opus_multistream_decoder_destroy() to release\n  * this object when finished.\n  * @param Fs <tt>opus_int32</tt>: Sampling rate to decode at (in Hz).\n  *                                This must be one of 8000, 12000, 16000,\n  *                                24000, or 48000.\n  * @param channels <tt>int</tt>: Number of channels to output.\n  *                               This must be at most 255.\n  *                               It may be different from the number of coded\n  *                               channels (<code>streams +\n  *                               coupled_streams</code>).\n  * @param streams <tt>int</tt>: The total number of streams coded in the\n  *                              input.\n  *                              This must be no more than 255.\n  * @param coupled_streams <tt>int</tt>: Number of streams to decode as coupled\n  *                                      (2 channel) streams.\n  *                                      This must be no larger than the total\n  *                                      number of streams.\n  *                                      Additionally, The total number of\n  *                                      coded channels (<code>streams +\n  *                                      coupled_streams</code>) must be no\n  *                                      more than 255.\n  * @param[in] mapping <code>const unsigned char[channels]</code>: Mapping from\n  *                    coded channels to output channels, as described in\n  *                    @ref opus_multistream.\n  * @param[out] error <tt>int *</tt>: Returns #OPUS_OK on success, or an error\n  *                                   code (see @ref opus_errorcodes) on\n  *                                   failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusMSDecoder *opus_multistream_decoder_create(\n      opus_int32 Fs,\n      int channels,\n      int streams,\n      int coupled_streams,\n      const unsigned char *mapping,\n      int *error\n) OPUS_ARG_NONNULL(5);\n\n/** Initialize a previously allocated decoder state object.\n  * The memory pointed to by \\a st must be at least the size returned by\n  * opus_multistream_encoder_get_size().\n  * This is intended for applications which use their own allocator instead of\n  * malloc.\n  * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.\n  * @see opus_multistream_decoder_create\n  * @see opus_multistream_deocder_get_size\n  * @param st <tt>OpusMSEncoder*</tt>: Multistream encoder state to initialize.\n  * @param Fs <tt>opus_int32</tt>: Sampling rate to decode at (in Hz).\n  *                                This must be one of 8000, 12000, 16000,\n  *                                24000, or 48000.\n  * @param channels <tt>int</tt>: Number of channels to output.\n  *                               This must be at most 255.\n  *                               It may be different from the number of coded\n  *                               channels (<code>streams +\n  *                               coupled_streams</code>).\n  * @param streams <tt>int</tt>: The total number of streams coded in the\n  *                              input.\n  *                              This must be no more than 255.\n  * @param coupled_streams <tt>int</tt>: Number of streams to decode as coupled\n  *                                      (2 channel) streams.\n  *                                      This must be no larger than the total\n  *                                      number of streams.\n  *                                      Additionally, The total number of\n  *                                      coded channels (<code>streams +\n  *                                      coupled_streams</code>) must be no\n  *                                      more than 255.\n  * @param[in] mapping <code>const unsigned char[channels]</code>: Mapping from\n  *                    coded channels to output channels, as described in\n  *                    @ref opus_multistream.\n  * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)\n  *          on failure.\n  */\nOPUS_EXPORT int opus_multistream_decoder_init(\n      OpusMSDecoder *st,\n      opus_int32 Fs,\n      int channels,\n      int streams,\n      int coupled_streams,\n      const unsigned char *mapping\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);\n\n/** Decode a multistream Opus packet.\n  * @param st <tt>OpusMSDecoder*</tt>: Multistream decoder state.\n  * @param[in] data <tt>const unsigned char*</tt>: Input payload.\n  *                                                Use a <code>NULL</code>\n  *                                                pointer to indicate packet\n  *                                                loss.\n  * @param len <tt>opus_int32</tt>: Number of bytes in payload.\n  * @param[out] pcm <tt>opus_int16*</tt>: Output signal, with interleaved\n  *                                       samples.\n  *                                       This must contain room for\n  *                                       <code>frame_size*channels</code>\n  *                                       samples.\n  * @param frame_size <tt>int</tt>: The number of samples per channel of\n  *                                 available space in \\a pcm.\n  *                                 If this is less than the maximum packet duration\n  *                                 (120 ms; 5760 for 48kHz), this function will not be capable\n  *                                 of decoding some packets. In the case of PLC (data==NULL)\n  *                                 or FEC (decode_fec=1), then frame_size needs to be exactly\n  *                                 the duration of audio that is missing, otherwise the\n  *                                 decoder will not be in the optimal state to decode the\n  *                                 next incoming packet. For the PLC and FEC cases, frame_size\n  *                                 <b>must</b> be a multiple of 2.5 ms.\n  * @param decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band\n  *                                 forward error correction data be decoded.\n  *                                 If no such data is available, the frame is\n  *                                 decoded as if it were lost.\n  * @returns Number of samples decoded on success or a negative error code\n  *          (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode(\n    OpusMSDecoder *st,\n    const unsigned char *data,\n    opus_int32 len,\n    opus_int16 *pcm,\n    int frame_size,\n    int decode_fec\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);\n\n/** Decode a multistream Opus packet.\n  * @param st <tt>OpusMSDecoder*</tt>: Multistream decoder state.\n  * @param[in] data <tt>const unsigned char*</tt>: Input payload.\n  *                                                Use a <code>NULL</code>\n  *                                                pointer to indicate packet\n  *                                                loss.\n  * @param len <tt>opus_int32</tt>: Number of bytes in payload.\n  * @param[out] pcm <tt>opus_int32*</tt>: Output signal, with interleaved\n  *                                       samples representing (or slightly exceeding) 24-bit values.\n  *                                       This must contain room for\n  *                                       <code>frame_size*channels</code>\n  *                                       samples.\n  * @param frame_size <tt>int</tt>: The number of samples per channel of\n  *                                 available space in \\a pcm.\n  *                                 If this is less than the maximum packet duration\n  *                                 (120 ms; 5760 for 48kHz), this function will not be capable\n  *                                 of decoding some packets. In the case of PLC (data==NULL)\n  *                                 or FEC (decode_fec=1), then frame_size needs to be exactly\n  *                                 the duration of audio that is missing, otherwise the\n  *                                 decoder will not be in the optimal state to decode the\n  *                                 next incoming packet. For the PLC and FEC cases, frame_size\n  *                                 <b>must</b> be a multiple of 2.5 ms.\n  * @param decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band\n  *                                 forward error correction data be decoded.\n  *                                 If no such data is available, the frame is\n  *                                 decoded as if it were lost.\n  * @returns Number of samples decoded on success or a negative error code\n  *          (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode24(\n    OpusMSDecoder *st,\n    const unsigned char *data,\n    opus_int32 len,\n    opus_int32 *pcm,\n    int frame_size,\n    int decode_fec\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);\n\n/** Decode a multistream Opus packet with floating point output.\n  * @param st <tt>OpusMSDecoder*</tt>: Multistream decoder state.\n  * @param[in] data <tt>const unsigned char*</tt>: Input payload.\n  *                                                Use a <code>NULL</code>\n  *                                                pointer to indicate packet\n  *                                                loss.\n  * @param len <tt>opus_int32</tt>: Number of bytes in payload.\n  * @param[out] pcm <tt>opus_int16*</tt>: Output signal, with interleaved\n  *                                       samples.\n  *                                       This must contain room for\n  *                                       <code>frame_size*channels</code>\n  *                                       samples.\n  * @param frame_size <tt>int</tt>: The number of samples per channel of\n  *                                 available space in \\a pcm.\n  *                                 If this is less than the maximum packet duration\n  *                                 (120 ms; 5760 for 48kHz), this function will not be capable\n  *                                 of decoding some packets. In the case of PLC (data==NULL)\n  *                                 or FEC (decode_fec=1), then frame_size needs to be exactly\n  *                                 the duration of audio that is missing, otherwise the\n  *                                 decoder will not be in the optimal state to decode the\n  *                                 next incoming packet. For the PLC and FEC cases, frame_size\n  *                                 <b>must</b> be a multiple of 2.5 ms.\n  * @param decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band\n  *                                 forward error correction data be decoded.\n  *                                 If no such data is available, the frame is\n  *                                 decoded as if it were lost.\n  * @returns Number of samples decoded on success or a negative error code\n  *          (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_multistream_decode_float(\n    OpusMSDecoder *st,\n    const unsigned char *data,\n    opus_int32 len,\n    float *pcm,\n    int frame_size,\n    int decode_fec\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);\n\n/** Perform a CTL function on a multistream Opus decoder.\n  *\n  * Generally the request and subsequent arguments are generated by a\n  * convenience macro.\n  * @param st <tt>OpusMSDecoder*</tt>: Multistream decoder state.\n  * @param request This and all remaining parameters should be replaced by one\n  *                of the convenience macros in @ref opus_genericctls,\n  *                @ref opus_decoderctls, or @ref opus_multistream_ctls.\n  * @see opus_genericctls\n  * @see opus_decoderctls\n  * @see opus_multistream_ctls\n  */\nOPUS_EXPORT int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);\n\n/** Frees an <code>OpusMSDecoder</code> allocated by\n  * opus_multistream_decoder_create().\n  * @param st <tt>OpusMSDecoder</tt>: Multistream decoder state to be freed.\n  */\nOPUS_EXPORT void opus_multistream_decoder_destroy(OpusMSDecoder *st);\n\n/**@}*/\n\n/**@}*/\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* OPUS_MULTISTREAM_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include/opus/opus_projection.h",
    "content": "/* Copyright (c) 2017 Google Inc.\n   Written by Andrew Allen */\n/*\n   Redistribution and use in source and binary forms, with or without\n   modification, are permitted provided that the following conditions\n   are met:\n\n   - Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\n   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\n   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n/**\n * @file opus_projection.h\n * @brief Opus projection reference API\n */\n\n#ifndef OPUS_PROJECTION_H\n#define OPUS_PROJECTION_H\n\n#include \"opus_multistream.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/** @cond OPUS_INTERNAL_DOC */\n\n/** These are the actual encoder and decoder CTL ID numbers.\n  * They should not be used directly by applications.c\n  * In general, SETs should be even and GETs should be odd.*/\n/**@{*/\n#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST    6001\n#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST    6003\n#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST         6005\n/**@}*/\n\n\n/** @endcond */\n\n/** @defgroup opus_projection_ctls Projection specific encoder and decoder CTLs\n  *\n  * These are convenience macros that are specific to the\n  * opus_projection_encoder_ctl() and opus_projection_decoder_ctl()\n  * interface.\n  * The CTLs from @ref opus_genericctls, @ref opus_encoderctls,\n  * @ref opus_decoderctls, and @ref opus_multistream_ctls may be applied to a\n  * projection encoder or decoder as well.\n  */\n/**@{*/\n\n/** Gets the gain (in dB. S7.8-format) of the demixing matrix from the encoder.\n  * @param[out] x <tt>opus_int32 *</tt>: Returns the gain (in dB. S7.8-format)\n  *                                      of the demixing matrix.\n  * @hideinitializer\n  */\n#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_GAIN_REQUEST, opus_check_int_ptr(x)\n\n\n/** Gets the size in bytes of the demixing matrix from the encoder.\n  * @param[out] x <tt>opus_int32 *</tt>: Returns the size in bytes of the\n  *                                      demixing matrix.\n  * @hideinitializer\n  */\n#define OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE(x) OPUS_PROJECTION_GET_DEMIXING_MATRIX_SIZE_REQUEST, opus_check_int_ptr(x)\n\n\n/** Copies the demixing matrix to the supplied pointer location.\n  * @param[out] x <tt>unsigned char *</tt>: Returns the demixing matrix to the\n  *                                         supplied pointer location.\n  * @param y <tt>opus_int32</tt>: The size in bytes of the reserved memory at the\n  *                              pointer location.\n  * @hideinitializer\n  */\n#define OPUS_PROJECTION_GET_DEMIXING_MATRIX(x,y) OPUS_PROJECTION_GET_DEMIXING_MATRIX_REQUEST, x, opus_check_int(y)\n\n\n/**@}*/\n\n/** Opus projection encoder state.\n * This contains the complete state of a projection Opus encoder.\n * It is position independent and can be freely copied.\n * @see opus_projection_ambisonics_encoder_create\n */\ntypedef struct OpusProjectionEncoder OpusProjectionEncoder;\n\n\n/** Opus projection decoder state.\n  * This contains the complete state of a projection Opus decoder.\n  * It is position independent and can be freely copied.\n  * @see opus_projection_decoder_create\n  * @see opus_projection_decoder_init\n  */\ntypedef struct OpusProjectionDecoder OpusProjectionDecoder;\n\n\n/**\\name Projection encoder functions */\n/**@{*/\n\n/** Gets the size of an OpusProjectionEncoder structure.\n  * @param channels <tt>int</tt>: The total number of input channels to encode.\n  *                               This must be no more than 255.\n  * @param mapping_family <tt>int</tt>: The mapping family to use for selecting\n  *                                     the appropriate projection.\n  * @returns The size in bytes on success, or a negative error code\n  *          (see @ref opus_errorcodes) on error.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_ambisonics_encoder_get_size(\n    int channels,\n    int mapping_family\n);\n\n\n/** Allocates and initializes a projection encoder state.\n  * Call opus_projection_encoder_destroy() to release\n  * this object when finished.\n  * @param Fs <tt>opus_int32</tt>: Sampling rate of the input signal (in Hz).\n  *                                This must be one of 8000, 12000, 16000,\n  *                                24000, or 48000.\n  * @param channels <tt>int</tt>: Number of channels in the input signal.\n  *                               This must be at most 255.\n  *                               It may be greater than the number of\n  *                               coded channels (<code>streams +\n  *                               coupled_streams</code>).\n  * @param mapping_family <tt>int</tt>: The mapping family to use for selecting\n  *                                     the appropriate projection.\n  * @param[out] streams <tt>int *</tt>: The total number of streams that will\n  *                                     be encoded from the input.\n  * @param[out] coupled_streams <tt>int *</tt>: Number of coupled (2 channel)\n  *                                 streams that will be encoded from the input.\n  * @param application <tt>int</tt>: The target encoder application.\n  *                                  This must be one of the following:\n  * <dl>\n  * <dt>#OPUS_APPLICATION_VOIP</dt>\n  * <dd>Process signal for improved speech intelligibility.</dd>\n  * <dt>#OPUS_APPLICATION_AUDIO</dt>\n  * <dd>Favor faithfulness to the original input.</dd>\n  * <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>\n  * <dd>Configure the minimum possible coding delay by disabling certain modes\n  * of operation.</dd>\n  * </dl>\n  * @param[out] error <tt>int *</tt>: Returns #OPUS_OK on success, or an error\n  *                                   code (see @ref opus_errorcodes) on\n  *                                   failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionEncoder *opus_projection_ambisonics_encoder_create(\n    opus_int32 Fs,\n    int channels,\n    int mapping_family,\n    int *streams,\n    int *coupled_streams,\n    int application,\n    int *error\n) OPUS_ARG_NONNULL(4) OPUS_ARG_NONNULL(5);\n\n\n/** Initialize a previously allocated projection encoder state.\n  * The memory pointed to by \\a st must be at least the size returned by\n  * opus_projection_ambisonics_encoder_get_size().\n  * This is intended for applications which use their own allocator instead of\n  * malloc.\n  * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.\n  * @see opus_projection_ambisonics_encoder_create\n  * @see opus_projection_ambisonics_encoder_get_size\n  * @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state to initialize.\n  * @param Fs <tt>opus_int32</tt>: Sampling rate of the input signal (in Hz).\n  *                                This must be one of 8000, 12000, 16000,\n  *                                24000, or 48000.\n  * @param channels <tt>int</tt>: Number of channels in the input signal.\n  *                               This must be at most 255.\n  *                               It may be greater than the number of\n  *                               coded channels (<code>streams +\n  *                               coupled_streams</code>).\n  * @param streams <tt>int</tt>: The total number of streams to encode from the\n  *                              input.\n  *                              This must be no more than the number of channels.\n  * @param coupled_streams <tt>int</tt>: Number of coupled (2 channel) streams\n  *                                      to encode.\n  *                                      This must be no larger than the total\n  *                                      number of streams.\n  *                                      Additionally, The total number of\n  *                                      encoded channels (<code>streams +\n  *                                      coupled_streams</code>) must be no\n  *                                      more than the number of input channels.\n  * @param application <tt>int</tt>: The target encoder application.\n  *                                  This must be one of the following:\n  * <dl>\n  * <dt>#OPUS_APPLICATION_VOIP</dt>\n  * <dd>Process signal for improved speech intelligibility.</dd>\n  * <dt>#OPUS_APPLICATION_AUDIO</dt>\n  * <dd>Favor faithfulness to the original input.</dd>\n  * <dt>#OPUS_APPLICATION_RESTRICTED_LOWDELAY</dt>\n  * <dd>Configure the minimum possible coding delay by disabling certain modes\n  * of operation.</dd>\n  * </dl>\n  * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)\n  *          on failure.\n  */\nOPUS_EXPORT int opus_projection_ambisonics_encoder_init(\n    OpusProjectionEncoder *st,\n    opus_int32 Fs,\n    int channels,\n    int mapping_family,\n    int *streams,\n    int *coupled_streams,\n    int application\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(5) OPUS_ARG_NONNULL(6);\n\n\n/** Encodes a projection Opus frame.\n  * @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state.\n  * @param[in] pcm <tt>const opus_int16*</tt>: The input signal as interleaved\n  *                                            samples.\n  *                                            This must contain\n  *                                            <code>frame_size*channels</code>\n  *                                            samples.\n  * @param frame_size <tt>int</tt>: Number of samples per channel in the input\n  *                                 signal.\n  *                                 This must be an Opus frame size for the\n  *                                 encoder's sampling rate.\n  *                                 For example, at 48 kHz the permitted values\n  *                                 are 120, 240, 480, 960, 1920, and 2880.\n  *                                 Passing in a duration of less than 10 ms\n  *                                 (480 samples at 48 kHz) will prevent the\n  *                                 encoder from using the LPC or hybrid modes.\n  * @param[out] data <tt>unsigned char*</tt>: Output payload.\n  *                                           This must contain storage for at\n  *                                           least \\a max_data_bytes.\n  * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated\n  *                                                 memory for the output\n  *                                                 payload. This may be\n  *                                                 used to impose an upper limit on\n  *                                                 the instant bitrate, but should\n  *                                                 not be used as the only bitrate\n  *                                                 control. Use #OPUS_SET_BITRATE to\n  *                                                 control the bitrate.\n  * @returns The length of the encoded packet (in bytes) on success or a\n  *          negative error code (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode(\n    OpusProjectionEncoder *st,\n    const opus_int16 *pcm,\n    int frame_size,\n    unsigned char *data,\n    opus_int32 max_data_bytes\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);\n\n/** Encodes a projection Opus frame.\n  * @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state.\n  * @param[in] pcm <tt>const opus_int32*</tt>: The input signal as interleaved\n  *                                            samples representing (or slightly exceeding) 24-bit values.\n  *                                            This must contain\n  *                                            <code>frame_size*channels</code>\n  *                                            samples.\n  * @param frame_size <tt>int</tt>: Number of samples per channel in the input\n  *                                 signal.\n  *                                 This must be an Opus frame size for the\n  *                                 encoder's sampling rate.\n  *                                 For example, at 48 kHz the permitted values\n  *                                 are 120, 240, 480, 960, 1920, and 2880.\n  *                                 Passing in a duration of less than 10 ms\n  *                                 (480 samples at 48 kHz) will prevent the\n  *                                 encoder from using the LPC or hybrid modes.\n  * @param[out] data <tt>unsigned char*</tt>: Output payload.\n  *                                           This must contain storage for at\n  *                                           least \\a max_data_bytes.\n  * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated\n  *                                                 memory for the output\n  *                                                 payload. This may be\n  *                                                 used to impose an upper limit on\n  *                                                 the instant bitrate, but should\n  *                                                 not be used as the only bitrate\n  *                                                 control. Use #OPUS_SET_BITRATE to\n  *                                                 control the bitrate.\n  * @returns The length of the encoded packet (in bytes) on success or a\n  *          negative error code (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode24(\n    OpusProjectionEncoder *st,\n    const opus_int32 *pcm,\n    int frame_size,\n    unsigned char *data,\n    opus_int32 max_data_bytes\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);\n\n\n/** Encodes a projection Opus frame from floating point input.\n  * @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state.\n  * @param[in] pcm <tt>const float*</tt>: The input signal as interleaved\n  *                                       samples with a normal range of\n  *                                       +/-1.0.\n  *                                       Samples with a range beyond +/-1.0\n  *                                       are supported but will be clipped by\n  *                                       decoders using the integer API and\n  *                                       should only be used if it is known\n  *                                       that the far end supports extended\n  *                                       dynamic range.\n  *                                       This must contain\n  *                                       <code>frame_size*channels</code>\n  *                                       samples.\n  * @param frame_size <tt>int</tt>: Number of samples per channel in the input\n  *                                 signal.\n  *                                 This must be an Opus frame size for the\n  *                                 encoder's sampling rate.\n  *                                 For example, at 48 kHz the permitted values\n  *                                 are 120, 240, 480, 960, 1920, and 2880.\n  *                                 Passing in a duration of less than 10 ms\n  *                                 (480 samples at 48 kHz) will prevent the\n  *                                 encoder from using the LPC or hybrid modes.\n  * @param[out] data <tt>unsigned char*</tt>: Output payload.\n  *                                           This must contain storage for at\n  *                                           least \\a max_data_bytes.\n  * @param [in] max_data_bytes <tt>opus_int32</tt>: Size of the allocated\n  *                                                 memory for the output\n  *                                                 payload. This may be\n  *                                                 used to impose an upper limit on\n  *                                                 the instant bitrate, but should\n  *                                                 not be used as the only bitrate\n  *                                                 control. Use #OPUS_SET_BITRATE to\n  *                                                 control the bitrate.\n  * @returns The length of the encoded packet (in bytes) on success or a\n  *          negative error code (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_encode_float(\n    OpusProjectionEncoder *st,\n    const float *pcm,\n    int frame_size,\n    unsigned char *data,\n    opus_int32 max_data_bytes\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(2) OPUS_ARG_NONNULL(4);\n\n\n/** Frees an <code>OpusProjectionEncoder</code> allocated by\n  * opus_projection_ambisonics_encoder_create().\n  * @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state to be freed.\n  */\nOPUS_EXPORT void opus_projection_encoder_destroy(OpusProjectionEncoder *st);\n\n\n/** Perform a CTL function on a projection Opus encoder.\n  *\n  * Generally the request and subsequent arguments are generated by a\n  * convenience macro.\n  * @param st <tt>OpusProjectionEncoder*</tt>: Projection encoder state.\n  * @param request This and all remaining parameters should be replaced by one\n  *                of the convenience macros in @ref opus_genericctls,\n  *                @ref opus_encoderctls, @ref opus_multistream_ctls, or\n  *                @ref opus_projection_ctls\n  * @see opus_genericctls\n  * @see opus_encoderctls\n  * @see opus_multistream_ctls\n  * @see opus_projection_ctls\n  */\nOPUS_EXPORT int opus_projection_encoder_ctl(OpusProjectionEncoder *st, int request, ...) OPUS_ARG_NONNULL(1);\n\n\n/**@}*/\n\n/**\\name Projection decoder functions */\n/**@{*/\n\n/** Gets the size of an <code>OpusProjectionDecoder</code> structure.\n  * @param channels <tt>int</tt>: The total number of output channels.\n  *                               This must be no more than 255.\n  * @param streams <tt>int</tt>: The total number of streams coded in the\n  *                              input.\n  *                              This must be no more than 255.\n  * @param coupled_streams <tt>int</tt>: Number streams to decode as coupled\n  *                                      (2 channel) streams.\n  *                                      This must be no larger than the total\n  *                                      number of streams.\n  *                                      Additionally, The total number of\n  *                                      coded channels (<code>streams +\n  *                                      coupled_streams</code>) must be no\n  *                                      more than 255.\n  * @returns The size in bytes on success, or a negative error code\n  *          (see @ref opus_errorcodes) on error.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT opus_int32 opus_projection_decoder_get_size(\n    int channels,\n    int streams,\n    int coupled_streams\n);\n\n\n/** Allocates and initializes a projection decoder state.\n  * Call opus_projection_decoder_destroy() to release\n  * this object when finished.\n  * @param Fs <tt>opus_int32</tt>: Sampling rate to decode at (in Hz).\n  *                                This must be one of 8000, 12000, 16000,\n  *                                24000, or 48000.\n  * @param channels <tt>int</tt>: Number of channels to output.\n  *                               This must be at most 255.\n  *                               It may be different from the number of coded\n  *                               channels (<code>streams +\n  *                               coupled_streams</code>).\n  * @param streams <tt>int</tt>: The total number of streams coded in the\n  *                              input.\n  *                              This must be no more than 255.\n  * @param coupled_streams <tt>int</tt>: Number of streams to decode as coupled\n  *                                      (2 channel) streams.\n  *                                      This must be no larger than the total\n  *                                      number of streams.\n  *                                      Additionally, The total number of\n  *                                      coded channels (<code>streams +\n  *                                      coupled_streams</code>) must be no\n  *                                      more than 255.\n  * @param[in] demixing_matrix <tt>const unsigned char[demixing_matrix_size]</tt>: Demixing matrix\n  *                         that mapping from coded channels to output channels,\n  *                         as described in @ref opus_projection and\n  *                         @ref opus_projection_ctls.\n  * @param demixing_matrix_size <tt>opus_int32</tt>: The size in bytes of the\n  *                                                  demixing matrix, as\n  *                                                  described in @ref\n  *                                                  opus_projection_ctls.\n  * @param[out] error <tt>int *</tt>: Returns #OPUS_OK on success, or an error\n  *                                   code (see @ref opus_errorcodes) on\n  *                                   failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT OpusProjectionDecoder *opus_projection_decoder_create(\n    opus_int32 Fs,\n    int channels,\n    int streams,\n    int coupled_streams,\n    unsigned char *demixing_matrix,\n    opus_int32 demixing_matrix_size,\n    int *error\n) OPUS_ARG_NONNULL(5);\n\n\n/** Initialize a previously allocated projection decoder state object.\n  * The memory pointed to by \\a st must be at least the size returned by\n  * opus_projection_decoder_get_size().\n  * This is intended for applications which use their own allocator instead of\n  * malloc.\n  * To reset a previously initialized state, use the #OPUS_RESET_STATE CTL.\n  * @see opus_projection_decoder_create\n  * @see opus_projection_deocder_get_size\n  * @param st <tt>OpusProjectionDecoder*</tt>: Projection encoder state to initialize.\n  * @param Fs <tt>opus_int32</tt>: Sampling rate to decode at (in Hz).\n  *                                This must be one of 8000, 12000, 16000,\n  *                                24000, or 48000.\n  * @param channels <tt>int</tt>: Number of channels to output.\n  *                               This must be at most 255.\n  *                               It may be different from the number of coded\n  *                               channels (<code>streams +\n  *                               coupled_streams</code>).\n  * @param streams <tt>int</tt>: The total number of streams coded in the\n  *                              input.\n  *                              This must be no more than 255.\n  * @param coupled_streams <tt>int</tt>: Number of streams to decode as coupled\n  *                                      (2 channel) streams.\n  *                                      This must be no larger than the total\n  *                                      number of streams.\n  *                                      Additionally, The total number of\n  *                                      coded channels (<code>streams +\n  *                                      coupled_streams</code>) must be no\n  *                                      more than 255.\n  * @param[in] demixing_matrix <tt>const unsigned char[demixing_matrix_size]</tt>: Demixing matrix\n  *                         that mapping from coded channels to output channels,\n  *                         as described in @ref opus_projection and\n  *                         @ref opus_projection_ctls.\n  * @param demixing_matrix_size <tt>opus_int32</tt>: The size in bytes of the\n  *                                                  demixing matrix, as\n  *                                                  described in @ref\n  *                                                  opus_projection_ctls.\n  * @returns #OPUS_OK on success, or an error code (see @ref opus_errorcodes)\n  *          on failure.\n  */\nOPUS_EXPORT int opus_projection_decoder_init(\n    OpusProjectionDecoder *st,\n    opus_int32 Fs,\n    int channels,\n    int streams,\n    int coupled_streams,\n    unsigned char *demixing_matrix,\n    opus_int32 demixing_matrix_size\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(6);\n\n\n/** Decode a projection Opus packet.\n  * @param st <tt>OpusProjectionDecoder*</tt>: Projection decoder state.\n  * @param[in] data <tt>const unsigned char*</tt>: Input payload.\n  *                                                Use a <code>NULL</code>\n  *                                                pointer to indicate packet\n  *                                                loss.\n  * @param len <tt>opus_int32</tt>: Number of bytes in payload.\n  * @param[out] pcm <tt>opus_int16*</tt>: Output signal, with interleaved\n  *                                       samples.\n  *                                       This must contain room for\n  *                                       <code>frame_size*channels</code>\n  *                                       samples.\n  * @param frame_size <tt>int</tt>: The number of samples per channel of\n  *                                 available space in \\a pcm.\n  *                                 If this is less than the maximum packet duration\n  *                                 (120 ms; 5760 for 48kHz), this function will not be capable\n  *                                 of decoding some packets. In the case of PLC (data==NULL)\n  *                                 or FEC (decode_fec=1), then frame_size needs to be exactly\n  *                                 the duration of audio that is missing, otherwise the\n  *                                 decoder will not be in the optimal state to decode the\n  *                                 next incoming packet. For the PLC and FEC cases, frame_size\n  *                                 <b>must</b> be a multiple of 2.5 ms.\n  * @param decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band\n  *                                 forward error correction data be decoded.\n  *                                 If no such data is available, the frame is\n  *                                 decoded as if it were lost.\n  * @returns Number of samples decoded on success or a negative error code\n  *          (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode(\n    OpusProjectionDecoder *st,\n    const unsigned char *data,\n    opus_int32 len,\n    opus_int16 *pcm,\n    int frame_size,\n    int decode_fec\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);\n\n/** Decode a projection Opus packet.\n  * @param st <tt>OpusProjectionDecoder*</tt>: Projection decoder state.\n  * @param[in] data <tt>const unsigned char*</tt>: Input payload.\n  *                                                Use a <code>NULL</code>\n  *                                                pointer to indicate packet\n  *                                                loss.\n  * @param len <tt>opus_int32</tt>: Number of bytes in payload.\n  * @param[out] pcm <tt>opus_int32*</tt>: Output signal, with interleaved\n  *                                       samples representing (or slightly exceeding) 24-bit values.\n  *                                       This must contain room for\n  *                                       <code>frame_size*channels</code>\n  *                                       samples.\n  * @param frame_size <tt>int</tt>: The number of samples per channel of\n  *                                 available space in \\a pcm.\n  *                                 If this is less than the maximum packet duration\n  *                                 (120 ms; 5760 for 48kHz), this function will not be capable\n  *                                 of decoding some packets. In the case of PLC (data==NULL)\n  *                                 or FEC (decode_fec=1), then frame_size needs to be exactly\n  *                                 the duration of audio that is missing, otherwise the\n  *                                 decoder will not be in the optimal state to decode the\n  *                                 next incoming packet. For the PLC and FEC cases, frame_size\n  *                                 <b>must</b> be a multiple of 2.5 ms.\n  * @param decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band\n  *                                 forward error correction data be decoded.\n  *                                 If no such data is available, the frame is\n  *                                 decoded as if it were lost.\n  * @returns Number of samples decoded on success or a negative error code\n  *          (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode24(\n    OpusProjectionDecoder *st,\n    const unsigned char *data,\n    opus_int32 len,\n    opus_int32 *pcm,\n    int frame_size,\n    int decode_fec\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);\n\n/** Decode a projection Opus packet with floating point output.\n  * @param st <tt>OpusProjectionDecoder*</tt>: Projection decoder state.\n  * @param[in] data <tt>const unsigned char*</tt>: Input payload.\n  *                                                Use a <code>NULL</code>\n  *                                                pointer to indicate packet\n  *                                                loss.\n  * @param len <tt>opus_int32</tt>: Number of bytes in payload.\n  * @param[out] pcm <tt>opus_int16*</tt>: Output signal, with interleaved\n  *                                       samples.\n  *                                       This must contain room for\n  *                                       <code>frame_size*channels</code>\n  *                                       samples.\n  * @param frame_size <tt>int</tt>: The number of samples per channel of\n  *                                 available space in \\a pcm.\n  *                                 If this is less than the maximum packet duration\n  *                                 (120 ms; 5760 for 48kHz), this function will not be capable\n  *                                 of decoding some packets. In the case of PLC (data==NULL)\n  *                                 or FEC (decode_fec=1), then frame_size needs to be exactly\n  *                                 the duration of audio that is missing, otherwise the\n  *                                 decoder will not be in the optimal state to decode the\n  *                                 next incoming packet. For the PLC and FEC cases, frame_size\n  *                                 <b>must</b> be a multiple of 2.5 ms.\n  * @param decode_fec <tt>int</tt>: Flag (0 or 1) to request that any in-band\n  *                                 forward error correction data be decoded.\n  *                                 If no such data is available, the frame is\n  *                                 decoded as if it were lost.\n  * @returns Number of samples decoded on success or a negative error code\n  *          (see @ref opus_errorcodes) on failure.\n  */\nOPUS_EXPORT OPUS_WARN_UNUSED_RESULT int opus_projection_decode_float(\n    OpusProjectionDecoder *st,\n    const unsigned char *data,\n    opus_int32 len,\n    float *pcm,\n    int frame_size,\n    int decode_fec\n) OPUS_ARG_NONNULL(1) OPUS_ARG_NONNULL(4);\n\n\n/** Perform a CTL function on a projection Opus decoder.\n  *\n  * Generally the request and subsequent arguments are generated by a\n  * convenience macro.\n  * @param st <tt>OpusProjectionDecoder*</tt>: Projection decoder state.\n  * @param request This and all remaining parameters should be replaced by one\n  *                of the convenience macros in @ref opus_genericctls,\n  *                @ref opus_decoderctls, @ref opus_multistream_ctls, or\n  *                @ref opus_projection_ctls.\n  * @see opus_genericctls\n  * @see opus_decoderctls\n  * @see opus_multistream_ctls\n  * @see opus_projection_ctls\n  */\nOPUS_EXPORT int opus_projection_decoder_ctl(OpusProjectionDecoder *st, int request, ...) OPUS_ARG_NONNULL(1);\n\n\n/** Frees an <code>OpusProjectionDecoder</code> allocated by\n  * opus_projection_decoder_create().\n  * @param st <tt>OpusProjectionDecoder</tt>: Projection decoder state to be freed.\n  */\nOPUS_EXPORT void opus_projection_decoder_destroy(OpusProjectionDecoder *st);\n\n\n/**@}*/\n\n/**@}*/\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* OPUS_PROJECTION_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include/opus/opus_types.h",
    "content": "/* (C) COPYRIGHT 1994-2002 Xiph.Org Foundation */\n/* Modified by Jean-Marc Valin */\n/*\n   Redistribution and use in source and binary forms, with or without\n   modification, are permitted provided that the following conditions\n   are met:\n\n   - Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\n   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\n   OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n/* opus_types.h based on ogg_types.h from libogg */\n\n/**\n   @file opus_types.h\n   @brief Opus reference implementation types\n*/\n#ifndef OPUS_TYPES_H\n#define OPUS_TYPES_H\n\n#define opus_int         int                     /* used for counters etc; at least 16 bits */\n#define opus_int64       long long\n#define opus_int8        signed char\n\n#define opus_uint        unsigned int            /* used for counters etc; at least 16 bits */\n#define opus_uint64      unsigned long long\n#define opus_uint8       unsigned char\n\n/* Use the real stdint.h if it's there (taken from Paul Hsieh's pstdint.h) */\n#if (defined(__STDC__) && __STDC__ && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || (defined(__GNUC__) && (defined(_STDINT_H) || defined(_STDINT_H_)) || defined (HAVE_STDINT_H))\n#include <stdint.h>\n#  undef opus_int64\n#  undef opus_int8\n#  undef opus_uint64\n#  undef opus_uint8\n   typedef int8_t opus_int8;\n   typedef uint8_t opus_uint8;\n   typedef int16_t opus_int16;\n   typedef uint16_t opus_uint16;\n   typedef int32_t opus_int32;\n   typedef uint32_t opus_uint32;\n   typedef int64_t opus_int64;\n   typedef uint64_t opus_uint64;\n#elif defined(_WIN32)\n\n#  if defined(__CYGWIN__)\n#    include <_G_config.h>\n     typedef _G_int32_t opus_int32;\n     typedef _G_uint32_t opus_uint32;\n     typedef _G_int16 opus_int16;\n     typedef _G_uint16 opus_uint16;\n#  elif defined(__MINGW32__)\n     typedef short opus_int16;\n     typedef unsigned short opus_uint16;\n     typedef int opus_int32;\n     typedef unsigned int opus_uint32;\n#  elif defined(__MWERKS__)\n     typedef int opus_int32;\n     typedef unsigned int opus_uint32;\n     typedef short opus_int16;\n     typedef unsigned short opus_uint16;\n#  else\n     /* MSVC/Borland */\n     typedef __int32 opus_int32;\n     typedef unsigned __int32 opus_uint32;\n     typedef __int16 opus_int16;\n     typedef unsigned __int16 opus_uint16;\n#  endif\n\n#elif defined(__MACOS__)\n\n#  include <sys/types.h>\n   typedef SInt16 opus_int16;\n   typedef UInt16 opus_uint16;\n   typedef SInt32 opus_int32;\n   typedef UInt32 opus_uint32;\n\n#elif (defined(__APPLE__) && defined(__MACH__)) /* MacOS X Framework build */\n\n#  include <sys/types.h>\n   typedef int16_t opus_int16;\n   typedef u_int16_t opus_uint16;\n   typedef int32_t opus_int32;\n   typedef u_int32_t opus_uint32;\n\n#elif defined(__BEOS__)\n\n   /* Be */\n#  include <inttypes.h>\n   typedef int16 opus_int16;\n   typedef u_int16 opus_uint16;\n   typedef int32_t opus_int32;\n   typedef u_int32_t opus_uint32;\n\n#elif defined (__EMX__)\n\n   /* OS/2 GCC */\n   typedef short opus_int16;\n   typedef unsigned short opus_uint16;\n   typedef int opus_int32;\n   typedef unsigned int opus_uint32;\n\n#elif defined (DJGPP)\n\n   /* DJGPP */\n   typedef short opus_int16;\n   typedef unsigned short opus_uint16;\n   typedef int opus_int32;\n   typedef unsigned int opus_uint32;\n\n#elif defined(R5900)\n\n   /* PS2 EE */\n   typedef int opus_int32;\n   typedef unsigned opus_uint32;\n   typedef short opus_int16;\n   typedef unsigned short opus_uint16;\n\n#elif defined(__SYMBIAN32__)\n\n   /* Symbian GCC */\n   typedef signed short opus_int16;\n   typedef unsigned short opus_uint16;\n   typedef signed int opus_int32;\n   typedef unsigned int opus_uint32;\n\n#elif defined(CONFIG_TI_C54X) || defined (CONFIG_TI_C55X)\n\n   typedef short opus_int16;\n   typedef unsigned short opus_uint16;\n   typedef long opus_int32;\n   typedef unsigned long opus_uint32;\n\n#elif defined(CONFIG_TI_C6X)\n\n   typedef short opus_int16;\n   typedef unsigned short opus_uint16;\n   typedef int opus_int32;\n   typedef unsigned int opus_uint32;\n\n#else\n\n   /* Give up, take a reasonable guess */\n   typedef short opus_int16;\n   typedef unsigned short opus_uint16;\n   typedef int opus_int32;\n   typedef unsigned int opus_uint32;\n\n#endif\n\n#endif  /* OPUS_TYPES_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include/opusfile/opusfile.h",
    "content": "/********************************************************************\n *                                                                  *\n * THIS FILE IS PART OF THE libopusfile SOFTWARE CODEC SOURCE CODE. *\n * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *\n * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *\n * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *\n *                                                                  *\n * THE libopusfile SOURCE CODE IS (C) COPYRIGHT 1994-2012           *\n * by the Xiph.Org Foundation and contributors https://xiph.org/    *\n *                                                                  *\n ********************************************************************\n\n function: stdio-based convenience library for opening/seeking/decoding\n last mod: $Id: vorbisfile.h 17182 2010-04-29 03:48:32Z xiphmont $\n\n ********************************************************************/\n#if !defined(_opusfile_h)\n# define _opusfile_h (1)\n\n/**\\mainpage\n   \\section Introduction\n\n   This is the documentation for the <tt>libopusfile</tt> C API.\n\n   The <tt>libopusfile</tt> package provides a convenient high-level API for\n    decoding and basic manipulation of all Ogg Opus audio streams.\n   <tt>libopusfile</tt> is implemented as a layer on top of Xiph.Org's\n    reference\n    <tt><a href=\"https://www.xiph.org/ogg/doc/libogg/reference.html\">libogg</a></tt>\n    and\n    <tt><a href=\"https://opus-codec.org/docs/opus_api-1.3.1/\">libopus</a></tt>\n    libraries.\n\n   <tt>libopusfile</tt> provides several sets of built-in routines for\n    file/stream access, and may also use custom stream I/O routines provided by\n    the embedded environment.\n   There are built-in I/O routines provided for ANSI-compliant\n    <code>stdio</code> (<code>FILE *</code>), memory buffers, and URLs\n    (including <file:> URLs, plus optionally <http:> and <https:> URLs).\n\n   \\section Organization\n\n   The main API is divided into several sections:\n   - \\ref stream_open_close\n   - \\ref stream_info\n   - \\ref stream_decoding\n   - \\ref stream_seeking\n\n   Several additional sections are not tied to the main API.\n   - \\ref stream_callbacks\n   - \\ref header_info\n   - \\ref error_codes\n\n   \\section Overview\n\n   The <tt>libopusfile</tt> API always decodes files to 48&nbsp;kHz.\n   The original sample rate is not preserved by the lossy compression, though\n    it is stored in the header to allow you to resample to it after decoding\n    (the <tt>libopusfile</tt> API does not currently provide a resampler,\n    but the\n    <a href=\"https://www.speex.org/docs/manual/speex-manual/node7.html#SECTION00760000000000000000\">the\n    Speex resampler</a> is a good choice if you need one).\n   In general, if you are playing back the audio, you should leave it at\n    48&nbsp;kHz, provided your audio hardware supports it.\n   When decoding to a file, it may be worth resampling back to the original\n    sample rate, so as not to surprise users who might not expect the sample\n    rate to change after encoding to Opus and decoding.\n\n   Opus files can contain anywhere from 1 to 255 channels of audio.\n   The channel mappings for up to 8 channels are the same as the\n    <a href=\"https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810004.3.9\">Vorbis\n    mappings</a>.\n   A special stereo API can convert everything to 2 channels, making it simple\n    to support multichannel files in an application which only has stereo\n    output.\n   Although the <tt>libopusfile</tt> ABI provides support for the theoretical\n    maximum number of channels, the current implementation does not support\n    files with more than 8 channels, as they do not have well-defined channel\n    mappings.\n\n   Like all Ogg files, Opus files may be \"chained\".\n   That is, multiple Opus files may be combined into a single, longer file just\n    by concatenating the original files.\n   This is commonly done in internet radio streaming, as it allows the title\n    and artist to be updated each time the song changes, since each link in the\n    chain includes its own set of metadata.\n\n   <tt>libopusfile</tt> fully supports chained files.\n   It will decode the first Opus stream found in each link of a chained file\n    (ignoring any other streams that might be concurrently multiplexed with it,\n    such as a video stream).\n\n   The channel count can also change between links.\n   If your application is not prepared to deal with this, it can use the stereo\n    API to ensure the audio from all links will always get decoded into a\n    common format.\n   Since <tt>libopusfile</tt> always decodes to 48&nbsp;kHz, you do not have to\n    worry about the sample rate changing between links (as was possible with\n    Vorbis).\n   This makes application support for chained files with <tt>libopusfile</tt>\n    very easy.*/\n\n# if defined(__cplusplus)\nextern \"C\" {\n# endif\n\n# include <stdarg.h>\n# include <stdio.h>\n# include <ogg/ogg.h>\n# include <opus_multistream.h>\n\n/**@cond PRIVATE*/\n\n/*Enable special features for gcc and gcc-compatible compilers.*/\n# if !defined(OP_GNUC_PREREQ)\n#  if defined(__GNUC__)&&defined(__GNUC_MINOR__)\n#   define OP_GNUC_PREREQ(_maj,_min) \\\n ((__GNUC__<<16)+__GNUC_MINOR__>=((_maj)<<16)+(_min))\n#  else\n#   define OP_GNUC_PREREQ(_maj,_min) 0\n#  endif\n# endif\n\n# if OP_GNUC_PREREQ(4,0)\n#  pragma GCC visibility push(default)\n# endif\n\ntypedef struct OpusHead          OpusHead;\ntypedef struct OpusTags          OpusTags;\ntypedef struct OpusPictureTag    OpusPictureTag;\ntypedef struct OpusServerInfo    OpusServerInfo;\ntypedef struct OpusFileCallbacks OpusFileCallbacks;\ntypedef struct OggOpusFile       OggOpusFile;\n\n/*Warning attributes for libopusfile functions.*/\n# if OP_GNUC_PREREQ(3,4)\n#  define OP_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__))\n# else\n#  define OP_WARN_UNUSED_RESULT\n# endif\n# if OP_GNUC_PREREQ(3,4)\n#  define OP_ARG_NONNULL(_x) __attribute__((__nonnull__(_x)))\n# else\n#  define OP_ARG_NONNULL(_x)\n# endif\n\n/**@endcond*/\n\n/**\\defgroup error_codes Error Codes*/\n/*@{*/\n/**\\name List of possible error codes\n   Many of the functions in this library return a negative error code when a\n    function fails.\n   This list provides a brief explanation of the common errors.\n   See each individual function for more details on what a specific error code\n    means in that context.*/\n/*@{*/\n\n/**A request did not succeed.*/\n#define OP_FALSE         (-1)\n/*Currently not used externally.*/\n#define OP_EOF           (-2)\n/**There was a hole in the page sequence numbers (e.g., a page was corrupt or\n    missing).*/\n#define OP_HOLE          (-3)\n/**An underlying read, seek, or tell operation failed when it should have\n    succeeded.*/\n#define OP_EREAD         (-128)\n/**A <code>NULL</code> pointer was passed where one was unexpected, or an\n    internal memory allocation failed, or an internal library error was\n    encountered.*/\n#define OP_EFAULT        (-129)\n/**The stream used a feature that is not implemented, such as an unsupported\n    channel family.*/\n#define OP_EIMPL         (-130)\n/**One or more parameters to a function were invalid.*/\n#define OP_EINVAL        (-131)\n/**A purported Ogg Opus stream did not begin with an Ogg page, a purported\n    header packet did not start with one of the required strings, \"OpusHead\" or\n    \"OpusTags\", or a link in a chained file was encountered that did not\n    contain any logical Opus streams.*/\n#define OP_ENOTFORMAT    (-132)\n/**A required header packet was not properly formatted, contained illegal\n    values, or was missing altogether.*/\n#define OP_EBADHEADER    (-133)\n/**The ID header contained an unrecognized version number.*/\n#define OP_EVERSION      (-134)\n/*Currently not used at all.*/\n#define OP_ENOTAUDIO     (-135)\n/**An audio packet failed to decode properly.\n   This is usually caused by a multistream Ogg packet where the durations of\n    the individual Opus packets contained in it are not all the same.*/\n#define OP_EBADPACKET    (-136)\n/**We failed to find data we had seen before, or the bitstream structure was\n    sufficiently malformed that seeking to the target destination was\n    impossible.*/\n#define OP_EBADLINK      (-137)\n/**An operation that requires seeking was requested on an unseekable stream.*/\n#define OP_ENOSEEK       (-138)\n/**The first or last granule position of a link failed basic validity checks.*/\n#define OP_EBADTIMESTAMP (-139)\n\n/*@}*/\n/*@}*/\n\n/**\\defgroup header_info Header Information*/\n/*@{*/\n\n/**The maximum number of channels in an Ogg Opus stream.*/\n#define OPUS_CHANNEL_COUNT_MAX (255)\n\n/**Ogg Opus bitstream information.\n   This contains the basic playback parameters for a stream, and corresponds to\n    the initial ID header packet of an Ogg Opus stream.*/\nstruct OpusHead{\n  /**The Ogg Opus format version, in the range 0...255.\n     The top 4 bits represent a \"major\" version, and the bottom four bits\n      represent backwards-compatible \"minor\" revisions.\n     The current specification describes version 1.\n     This library will recognize versions up through 15 as backwards compatible\n      with the current specification.\n     An earlier draft of the specification described a version 0, but the only\n      difference between version 1 and version 0 is that version 0 did\n      not specify the semantics for handling the version field.*/\n  int           version;\n  /**The number of channels, in the range 1...255.*/\n  int           channel_count;\n  /**The number of samples that should be discarded from the beginning of the\n      stream.*/\n  unsigned      pre_skip;\n  /**The sampling rate of the original input.\n     All Opus audio is coded at 48 kHz, and should also be decoded at 48 kHz\n      for playback (unless the target hardware does not support this sampling\n      rate).\n     However, this field may be used to resample the audio back to the original\n      sampling rate, for example, when saving the output to a file.*/\n  opus_uint32   input_sample_rate;\n  /**The gain to apply to the decoded output, in dB, as a Q8 value in the range\n      -32768...32767.\n     The <tt>libopusfile</tt> API will automatically apply this gain to the\n      decoded output before returning it, scaling it by\n      <code>pow(10,output_gain/(20.0*256))</code>.\n     You can adjust this behavior with op_set_gain_offset().*/\n  int           output_gain;\n  /**The channel mapping family, in the range 0...255.\n     Channel mapping family 0 covers mono or stereo in a single stream.\n     Channel mapping family 1 covers 1 to 8 channels in one or more streams,\n      using the Vorbis speaker assignments.\n     Channel mapping family 255 covers 1 to 255 channels in one or more\n      streams, but without any defined speaker assignment.*/\n  int           mapping_family;\n  /**The number of Opus streams in each Ogg packet, in the range 1...255.*/\n  int           stream_count;\n  /**The number of coupled Opus streams in each Ogg packet, in the range\n      0...127.\n     This must satisfy <code>0 <= coupled_count <= stream_count</code> and\n      <code>coupled_count + stream_count <= 255</code>.\n     The coupled streams appear first, before all uncoupled streams, in an Ogg\n      Opus packet.*/\n  int           coupled_count;\n  /**The mapping from coded stream channels to output channels.\n     Let <code>index=mapping[k]</code> be the value for channel <code>k</code>.\n     If <code>index<2*coupled_count</code>, then it refers to the left channel\n      from stream <code>(index/2)</code> if even, and the right channel from\n      stream <code>(index/2)</code> if odd.\n     Otherwise, it refers to the output of the uncoupled stream\n      <code>(index-coupled_count)</code>.*/\n  unsigned char mapping[OPUS_CHANNEL_COUNT_MAX];\n};\n\n/**The metadata from an Ogg Opus stream.\n\n   This structure holds the in-stream metadata corresponding to the 'comment'\n    header packet of an Ogg Opus stream.\n   The comment header is meant to be used much like someone jotting a quick\n    note on the label of a CD.\n   It should be a short, to the point text note that can be more than a couple\n    words, but not more than a short paragraph.\n\n   The metadata is stored as a series of (tag, value) pairs, in length-encoded\n    string vectors, using the same format as Vorbis (without the final \"framing\n    bit\"), Theora, and Speex, except for the packet header.\n   The first occurrence of the '=' character delimits the tag and value.\n   A particular tag may occur more than once, and order is significant.\n   The character set encoding for the strings is always UTF-8, but the tag\n    names are limited to ASCII, and treated as case-insensitive.\n   See <a href=\"https://www.xiph.org/vorbis/doc/v-comment.html\">the Vorbis\n    comment header specification</a> for details.\n\n   In filling in this structure, <tt>libopusfile</tt> will null-terminate the\n    #user_comments strings for safety.\n   However, the bitstream format itself treats them as 8-bit clean vectors,\n    possibly containing NUL characters, so the #comment_lengths array should be\n    treated as their authoritative length.\n\n   This structure is binary and source-compatible with a\n    <code>vorbis_comment</code>, and pointers to it may be freely cast to\n    <code>vorbis_comment</code> pointers, and vice versa.\n   It is provided as a separate type to avoid introducing a compile-time\n    dependency on the libvorbis headers.*/\nstruct OpusTags{\n  /**The array of comment string vectors.*/\n  char **user_comments;\n  /**An array of the corresponding length of each vector, in bytes.*/\n  int   *comment_lengths;\n  /**The total number of comment streams.*/\n  int    comments;\n  /**The null-terminated vendor string.\n     This identifies the software used to encode the stream.*/\n  char  *vendor;\n};\n\n/**\\name Picture tag image formats*/\n/*@{*/\n\n/**The MIME type was not recognized, or the image data did not match the\n    declared MIME type.*/\n#define OP_PIC_FORMAT_UNKNOWN (-1)\n/**The MIME type indicates the image data is really a URL.*/\n#define OP_PIC_FORMAT_URL     (0)\n/**The image is a JPEG.*/\n#define OP_PIC_FORMAT_JPEG    (1)\n/**The image is a PNG.*/\n#define OP_PIC_FORMAT_PNG     (2)\n/**The image is a GIF.*/\n#define OP_PIC_FORMAT_GIF     (3)\n\n/*@}*/\n\n/**The contents of a METADATA_BLOCK_PICTURE tag.*/\nstruct OpusPictureTag{\n  /**The picture type according to the ID3v2 APIC frame:\n     <ol start=\"0\">\n     <li>Other</li>\n     <li>32x32 pixels 'file icon' (PNG only)</li>\n     <li>Other file icon</li>\n     <li>Cover (front)</li>\n     <li>Cover (back)</li>\n     <li>Leaflet page</li>\n     <li>Media (e.g. label side of CD)</li>\n     <li>Lead artist/lead performer/soloist</li>\n     <li>Artist/performer</li>\n     <li>Conductor</li>\n     <li>Band/Orchestra</li>\n     <li>Composer</li>\n     <li>Lyricist/text writer</li>\n     <li>Recording Location</li>\n     <li>During recording</li>\n     <li>During performance</li>\n     <li>Movie/video screen capture</li>\n     <li>A bright colored fish</li>\n     <li>Illustration</li>\n     <li>Band/artist logotype</li>\n     <li>Publisher/Studio logotype</li>\n     </ol>\n     Others are reserved and should not be used.\n     There may only be one each of picture type 1 and 2 in a file.*/\n  opus_int32     type;\n  /**The MIME type of the picture, in printable ASCII characters 0x20-0x7E.\n     The MIME type may also be <code>\"-->\"</code> to signify that the data part\n      is a URL pointing to the picture instead of the picture data itself.\n     In this case, a terminating NUL is appended to the URL string in #data,\n      but #data_length is set to the length of the string excluding that\n      terminating NUL.*/\n  char          *mime_type;\n  /**The description of the picture, in UTF-8.*/\n  char          *description;\n  /**The width of the picture in pixels.*/\n  opus_uint32    width;\n  /**The height of the picture in pixels.*/\n  opus_uint32    height;\n  /**The color depth of the picture in bits-per-pixel (<em>not</em>\n      bits-per-channel).*/\n  opus_uint32    depth;\n  /**For indexed-color pictures (e.g., GIF), the number of colors used, or 0\n      for non-indexed pictures.*/\n  opus_uint32    colors;\n  /**The length of the picture data in bytes.*/\n  opus_uint32    data_length;\n  /**The binary picture data.*/\n  unsigned char *data;\n  /**The format of the picture data, if known.\n     One of\n     <ul>\n     <li>#OP_PIC_FORMAT_UNKNOWN,</li>\n     <li>#OP_PIC_FORMAT_URL,</li>\n     <li>#OP_PIC_FORMAT_JPEG,</li>\n     <li>#OP_PIC_FORMAT_PNG, or</li>\n     <li>#OP_PIC_FORMAT_GIF.</li>\n     </ul>*/\n  int            format;\n};\n\n/**\\name Functions for manipulating header data\n\n   These functions manipulate the #OpusHead and #OpusTags structures,\n    which describe the audio parameters and tag-value metadata, respectively.\n   These can be used to query the headers returned by <tt>libopusfile</tt>, or\n    to parse Opus headers from sources other than an Ogg Opus stream, provided\n    they use the same format.*/\n/*@{*/\n\n/**Parses the contents of the ID header packet of an Ogg Opus stream.\n   \\param[out] _head Returns the contents of the parsed packet.\n                     The contents of this structure are untouched on error.\n                     This may be <code>NULL</code> to merely test the header\n                      for validity.\n   \\param[in]  _data The contents of the ID header packet.\n   \\param      _len  The number of bytes of data in the ID header packet.\n   \\return 0 on success or a negative value on error.\n   \\retval #OP_ENOTFORMAT If the data does not start with the \"OpusHead\"\n                           string.\n   \\retval #OP_EVERSION   If the version field signaled a version this library\n                           does not know how to parse.\n   \\retval #OP_EIMPL      If the channel mapping family was 255, which general\n                           purpose players should not attempt to play.\n   \\retval #OP_EBADHEADER If the contents of the packet otherwise violate the\n                           Ogg Opus specification:\n                          <ul>\n                           <li>Insufficient data,</li>\n                           <li>Too much data for the known minor versions,</li>\n                           <li>An unrecognized channel mapping family,</li>\n                           <li>Zero channels or too many channels,</li>\n                           <li>Zero coded streams,</li>\n                           <li>Too many coupled streams, or</li>\n                           <li>An invalid channel mapping index.</li>\n                          </ul>*/\nOP_WARN_UNUSED_RESULT int opus_head_parse(OpusHead *_head,\n const unsigned char *_data,size_t _len) OP_ARG_NONNULL(2);\n\n/**Converts a granule position to a sample offset for a given Ogg Opus stream.\n   The sample offset is simply <code>_gp-_head->pre_skip</code>.\n   Granule position values smaller than OpusHead#pre_skip correspond to audio\n    that should never be played, and thus have no associated sample offset.\n   This function returns -1 for such values.\n   This function also correctly handles extremely large granule positions,\n    which may have wrapped around to a negative number when stored in a signed\n    ogg_int64_t value.\n   \\param _head The #OpusHead information from the ID header of the stream.\n   \\param _gp   The granule position to convert.\n   \\return The sample offset associated with the given granule position\n            (counting at a 48 kHz sampling rate), or the special value -1 on\n            error (i.e., the granule position was smaller than the pre-skip\n            amount).*/\nogg_int64_t opus_granule_sample(const OpusHead *_head,ogg_int64_t _gp)\n OP_ARG_NONNULL(1);\n\n/**Parses the contents of the 'comment' header packet of an Ogg Opus stream.\n   \\param[out] _tags An uninitialized #OpusTags structure.\n                     This returns the contents of the parsed packet.\n                     The contents of this structure are untouched on error.\n                     This may be <code>NULL</code> to merely test the header\n                      for validity.\n   \\param[in]  _data The contents of the 'comment' header packet.\n   \\param      _len  The number of bytes of data in the 'info' header packet.\n   \\retval 0              Success.\n   \\retval #OP_ENOTFORMAT If the data does not start with the \"OpusTags\"\n                           string.\n   \\retval #OP_EBADHEADER If the contents of the packet otherwise violate the\n                           Ogg Opus specification.\n   \\retval #OP_EFAULT     If there wasn't enough memory to store the tags.*/\nOP_WARN_UNUSED_RESULT int opus_tags_parse(OpusTags *_tags,\n const unsigned char *_data,size_t _len) OP_ARG_NONNULL(2);\n\n/**Performs a deep copy of an #OpusTags structure.\n   \\param _dst The #OpusTags structure to copy into.\n               If this function fails, the contents of this structure remain\n                untouched.\n   \\param _src The #OpusTags structure to copy from.\n   \\retval 0          Success.\n   \\retval #OP_EFAULT If there wasn't enough memory to copy the tags.*/\nint opus_tags_copy(OpusTags *_dst,const OpusTags *_src) OP_ARG_NONNULL(1);\n\n/**Initializes an #OpusTags structure.\n   This should be called on a freshly allocated #OpusTags structure before\n    attempting to use it.\n   \\param _tags The #OpusTags structure to initialize.*/\nvoid opus_tags_init(OpusTags *_tags) OP_ARG_NONNULL(1);\n\n/**Add a (tag, value) pair to an initialized #OpusTags structure.\n   \\note Neither opus_tags_add() nor opus_tags_add_comment() support values\n    containing embedded NULs, although the bitstream format does support them.\n   To add such tags, you will need to manipulate the #OpusTags structure\n    directly.\n   \\param _tags  The #OpusTags structure to add the (tag, value) pair to.\n   \\param _tag   A NUL-terminated, case-insensitive, ASCII string containing\n                  the tag to add (without an '=' character).\n   \\param _value A NUL-terminated UTF-8 containing the corresponding value.\n   \\return 0 on success, or a negative value on failure.\n   \\retval #OP_EFAULT An internal memory allocation failed.*/\nint opus_tags_add(OpusTags *_tags,const char *_tag,const char *_value)\n OP_ARG_NONNULL(1) OP_ARG_NONNULL(2) OP_ARG_NONNULL(3);\n\n/**Add a comment to an initialized #OpusTags structure.\n   \\note Neither opus_tags_add_comment() nor opus_tags_add() support comments\n    containing embedded NULs, although the bitstream format does support them.\n   To add such tags, you will need to manipulate the #OpusTags structure\n    directly.\n   \\param _tags    The #OpusTags structure to add the comment to.\n   \\param _comment A NUL-terminated UTF-8 string containing the comment in\n                    \"TAG=value\" form.\n   \\return 0 on success, or a negative value on failure.\n   \\retval #OP_EFAULT An internal memory allocation failed.*/\nint opus_tags_add_comment(OpusTags *_tags,const char *_comment)\n OP_ARG_NONNULL(1) OP_ARG_NONNULL(2);\n\n/**Replace the binary suffix data at the end of the packet (if any).\n   \\param _tags An initialized #OpusTags structure.\n   \\param _data A buffer of binary data to append after the encoded user\n                 comments.\n                The least significant bit of the first byte of this data must\n                 be set (to ensure the data is preserved by other editors).\n   \\param _len  The number of bytes of binary data to append.\n                This may be zero to remove any existing binary suffix data.\n   \\return 0 on success, or a negative value on error.\n   \\retval #OP_EINVAL \\a _len was negative, or \\a _len was positive but\n                       \\a _data was <code>NULL</code> or the least significant\n                       bit of the first byte was not set.\n   \\retval #OP_EFAULT An internal memory allocation failed.*/\nint opus_tags_set_binary_suffix(OpusTags *_tags,\n const unsigned char *_data,int _len) OP_ARG_NONNULL(1);\n\n/**Look up a comment value by its tag.\n   \\param _tags  An initialized #OpusTags structure.\n   \\param _tag   The tag to look up.\n   \\param _count The instance of the tag.\n                 The same tag can appear multiple times, each with a distinct\n                  value, so an index is required to retrieve them all.\n                 The order in which these values appear is significant and\n                  should be preserved.\n                 Use opus_tags_query_count() to get the legal range for the\n                  \\a _count parameter.\n   \\return A pointer to the queried tag's value.\n           This points directly to data in the #OpusTags structure.\n           It should not be modified or freed by the application, and\n            modifications to the structure may invalidate the pointer.\n   \\retval NULL If no matching tag is found.*/\nconst char *opus_tags_query(const OpusTags *_tags,const char *_tag,int _count)\n OP_ARG_NONNULL(1) OP_ARG_NONNULL(2);\n\n/**Look up the number of instances of a tag.\n   Call this first when querying for a specific tag and then iterate over the\n    number of instances with separate calls to opus_tags_query() to retrieve\n    all the values for that tag in order.\n   \\param _tags An initialized #OpusTags structure.\n   \\param _tag  The tag to look up.\n   \\return The number of instances of this particular tag.*/\nint opus_tags_query_count(const OpusTags *_tags,const char *_tag)\n OP_ARG_NONNULL(1) OP_ARG_NONNULL(2);\n\n/**Retrieve the binary suffix data at the end of the packet (if any).\n   \\param      _tags An initialized #OpusTags structure.\n   \\param[out] _len  Returns the number of bytes of binary suffix data returned.\n   \\return A pointer to the binary suffix data, or <code>NULL</code> if none\n            was present.*/\nconst unsigned char *opus_tags_get_binary_suffix(const OpusTags *_tags,\n int *_len) OP_ARG_NONNULL(1) OP_ARG_NONNULL(2);\n\n/**Get the album gain from an R128_ALBUM_GAIN tag, if one was specified.\n   This searches for the first R128_ALBUM_GAIN tag with a valid signed,\n    16-bit decimal integer value and returns the value.\n   This routine is exposed merely for convenience for applications which wish\n    to do something special with the album gain (i.e., display it).\n   If you simply wish to apply the album gain instead of the header gain, you\n    can use op_set_gain_offset() with an #OP_ALBUM_GAIN type and no offset.\n   \\param      _tags    An initialized #OpusTags structure.\n   \\param[out] _gain_q8 The album gain, in 1/256ths of a dB.\n                        This will lie in the range [-32768,32767], and should\n                         be applied in <em>addition</em> to the header gain.\n                        On error, no value is returned, and the previous\n                         contents remain unchanged.\n   \\return 0 on success, or a negative value on error.\n   \\retval #OP_FALSE There was no album gain available in the given tags.*/\nint opus_tags_get_album_gain(const OpusTags *_tags,int *_gain_q8)\n OP_ARG_NONNULL(1) OP_ARG_NONNULL(2);\n\n/**Get the track gain from an R128_TRACK_GAIN tag, if one was specified.\n   This searches for the first R128_TRACK_GAIN tag with a valid signed,\n    16-bit decimal integer value and returns the value.\n   This routine is exposed merely for convenience for applications which wish\n    to do something special with the track gain (i.e., display it).\n   If you simply wish to apply the track gain instead of the header gain, you\n    can use op_set_gain_offset() with an #OP_TRACK_GAIN type and no offset.\n   \\param      _tags    An initialized #OpusTags structure.\n   \\param[out] _gain_q8 The track gain, in 1/256ths of a dB.\n                        This will lie in the range [-32768,32767], and should\n                         be applied in <em>addition</em> to the header gain.\n                        On error, no value is returned, and the previous\n                         contents remain unchanged.\n   \\return 0 on success, or a negative value on error.\n   \\retval #OP_FALSE There was no track gain available in the given tags.*/\nint opus_tags_get_track_gain(const OpusTags *_tags,int *_gain_q8)\n OP_ARG_NONNULL(1) OP_ARG_NONNULL(2);\n\n/**Clears the #OpusTags structure.\n   This should be called on an #OpusTags structure after it is no longer\n    needed.\n   It will free all memory used by the structure members.\n   \\param _tags The #OpusTags structure to clear.*/\nvoid opus_tags_clear(OpusTags *_tags) OP_ARG_NONNULL(1);\n\n/**Check if \\a _comment is an instance of a \\a _tag_name tag.\n   \\see opus_tagncompare\n   \\param _tag_name A NUL-terminated, case-insensitive, ASCII string containing\n                     the name of the tag to check for (without the terminating\n                     '=' character).\n   \\param _comment  The comment string to check.\n   \\return An integer less than, equal to, or greater than zero if \\a _comment\n            is found respectively, to be less than, to match, or be greater\n            than a \"tag=value\" string whose tag matches \\a _tag_name.*/\nint opus_tagcompare(const char *_tag_name,const char *_comment);\n\n/**Check if \\a _comment is an instance of a \\a _tag_name tag.\n   This version is slightly more efficient than opus_tagcompare() if the length\n    of the tag name is already known (e.g., because it is a constant).\n   \\see opus_tagcompare\n   \\param _tag_name A case-insensitive ASCII string containing the name of the\n                     tag to check for (without the terminating '=' character).\n   \\param _tag_len  The number of characters in the tag name.\n                    This must be non-negative.\n   \\param _comment  The comment string to check.\n   \\return An integer less than, equal to, or greater than zero if \\a _comment\n            is found respectively, to be less than, to match, or be greater\n            than a \"tag=value\" string whose tag matches the first \\a _tag_len\n            characters of \\a _tag_name.*/\nint opus_tagncompare(const char *_tag_name,int _tag_len,const char *_comment);\n\n/**Parse a single METADATA_BLOCK_PICTURE tag.\n   This decodes the BASE64-encoded content of the tag and returns a structure\n    with the MIME type, description, image parameters (if known), and the\n    compressed image data.\n   If the MIME type indicates the presence of an image format we recognize\n    (JPEG, PNG, or GIF) and the actual image data contains the magic signature\n    associated with that format, then the OpusPictureTag::format field will be\n    set to the corresponding format.\n   This is provided as a convenience to avoid requiring applications to parse\n    the MIME type and/or do their own format detection for the commonly used\n    formats.\n   In this case, we also attempt to extract the image parameters directly from\n    the image data (overriding any that were present in the tag, which the\n    specification says applications are not meant to rely on).\n   The application must still provide its own support for actually decoding the\n    image data and, if applicable, retrieving that data from URLs.\n   \\param[out] _pic Returns the parsed picture data.\n                    No sanitation is done on the type, MIME type, or\n                     description fields, so these might return invalid values.\n                    The contents of this structure are left unmodified on\n                     failure.\n   \\param      _tag The METADATA_BLOCK_PICTURE tag contents.\n                    The leading \"METADATA_BLOCK_PICTURE=\" portion is optional,\n                     to allow the function to be used on either directly on the\n                     values in OpusTags::user_comments or on the return value\n                     of opus_tags_query().\n   \\return 0 on success or a negative value on error.\n   \\retval #OP_ENOTFORMAT The METADATA_BLOCK_PICTURE contents were not valid.\n   \\retval #OP_EFAULT     There was not enough memory to store the picture tag\n                           contents.*/\nOP_WARN_UNUSED_RESULT int opus_picture_tag_parse(OpusPictureTag *_pic,\n const char *_tag) OP_ARG_NONNULL(1) OP_ARG_NONNULL(2);\n\n/**Initializes an #OpusPictureTag structure.\n   This should be called on a freshly allocated #OpusPictureTag structure\n    before attempting to use it.\n   \\param _pic The #OpusPictureTag structure to initialize.*/\nvoid opus_picture_tag_init(OpusPictureTag *_pic) OP_ARG_NONNULL(1);\n\n/**Clears the #OpusPictureTag structure.\n   This should be called on an #OpusPictureTag structure after it is no longer\n    needed.\n   It will free all memory used by the structure members.\n   \\param _pic The #OpusPictureTag structure to clear.*/\nvoid opus_picture_tag_clear(OpusPictureTag *_pic) OP_ARG_NONNULL(1);\n\n/*@}*/\n\n/*@}*/\n\n/**\\defgroup url_options URL Reading Options*/\n/*@{*/\n/**\\name URL reading options\n   Options for op_url_stream_create() and associated functions.\n   These allow you to provide proxy configuration parameters, skip SSL\n    certificate checks, etc.\n   Options are processed in order, and if the same option is passed multiple\n    times, only the value specified by the last occurrence has an effect\n    (unless otherwise specified).\n   They may be expanded in the future.*/\n/*@{*/\n\n/**@cond PRIVATE*/\n\n/*These are the raw numbers used to define the request codes.\n  They should not be used directly.*/\n#define OP_SSL_SKIP_CERTIFICATE_CHECK_REQUEST (6464)\n#define OP_HTTP_PROXY_HOST_REQUEST            (6528)\n#define OP_HTTP_PROXY_PORT_REQUEST            (6592)\n#define OP_HTTP_PROXY_USER_REQUEST            (6656)\n#define OP_HTTP_PROXY_PASS_REQUEST            (6720)\n#define OP_GET_SERVER_INFO_REQUEST            (6784)\n\n#define OP_URL_OPT(_request) ((char *)(_request))\n\n/*These macros trigger compilation errors or warnings if the wrong types are\n   provided to one of the URL options.*/\n#define OP_CHECK_INT(_x) ((void)((_x)==(opus_int32)0),(opus_int32)(_x))\n#define OP_CHECK_CONST_CHAR_PTR(_x) ((_x)+((_x)-(const char *)(_x)))\n#define OP_CHECK_SERVER_INFO_PTR(_x) ((_x)+((_x)-(OpusServerInfo *)(_x)))\n\n/**@endcond*/\n\n/**HTTP/Shoutcast/Icecast server information associated with a URL.*/\nstruct OpusServerInfo{\n  /**The name of the server (icy-name/ice-name).\n     This is <code>NULL</code> if there was no <code>icy-name</code> or\n      <code>ice-name</code> header.*/\n  char        *name;\n  /**A short description of the server (icy-description/ice-description).\n     This is <code>NULL</code> if there was no <code>icy-description</code> or\n      <code>ice-description</code> header.*/\n  char        *description;\n  /**The genre the server falls under (icy-genre/ice-genre).\n     This is <code>NULL</code> if there was no <code>icy-genre</code> or\n      <code>ice-genre</code> header.*/\n  char        *genre;\n  /**The homepage for the server (icy-url/ice-url).\n     This is <code>NULL</code> if there was no <code>icy-url</code> or\n      <code>ice-url</code> header.*/\n  char        *url;\n  /**The software used by the origin server (Server).\n     This is <code>NULL</code> if there was no <code>Server</code> header.*/\n  char        *server;\n  /**The media type of the entity sent to the recepient (Content-Type).\n     This is <code>NULL</code> if there was no <code>Content-Type</code>\n      header.*/\n  char        *content_type;\n  /**The nominal stream bitrate in kbps (icy-br/ice-bitrate).\n     This is <code>-1</code> if there was no <code>icy-br</code> or\n      <code>ice-bitrate</code> header.*/\n  opus_int32   bitrate_kbps;\n  /**Flag indicating whether the server is public (<code>1</code>) or not\n      (<code>0</code>) (icy-pub/ice-public).\n     This is <code>-1</code> if there was no <code>icy-pub</code> or\n      <code>ice-public</code> header.*/\n  int          is_public;\n  /**Flag indicating whether the server is using HTTPS instead of HTTP.\n     This is <code>0</code> unless HTTPS is being used.\n     This may not match the protocol used in the original URL if there were\n      redirections.*/\n  int          is_ssl;\n};\n\n/**Initializes an #OpusServerInfo structure.\n   All fields are set as if the corresponding header was not available.\n   \\param _info The #OpusServerInfo structure to initialize.\n   \\note If you use this function, you must link against <tt>libopusurl</tt>.*/\nvoid opus_server_info_init(OpusServerInfo *_info) OP_ARG_NONNULL(1);\n\n/**Clears the #OpusServerInfo structure.\n   This should be called on an #OpusServerInfo structure after it is no longer\n    needed.\n   It will free all memory used by the structure members.\n   \\param _info The #OpusServerInfo structure to clear.\n   \\note If you use this function, you must link against <tt>libopusurl</tt>.*/\nvoid opus_server_info_clear(OpusServerInfo *_info) OP_ARG_NONNULL(1);\n\n/**Skip the certificate check when connecting via TLS/SSL (https).\n   \\param _b <code>opus_int32</code>: Whether or not to skip the certificate\n              check.\n             The check will be skipped if \\a _b is non-zero, and will not be\n              skipped if \\a _b is zero.\n   \\hideinitializer*/\n#define OP_SSL_SKIP_CERTIFICATE_CHECK(_b) \\\n OP_URL_OPT(OP_SSL_SKIP_CERTIFICATE_CHECK_REQUEST),OP_CHECK_INT(_b)\n\n/**Proxy connections through the given host.\n   If no port is specified via #OP_HTTP_PROXY_PORT, the port number defaults\n    to 8080 (http-alt).\n   All proxy parameters are ignored for non-http and non-https URLs.\n   \\param _host <code>const char *</code>: The proxy server hostname.\n                This may be <code>NULL</code> to disable the use of a proxy\n                 server.\n   \\hideinitializer*/\n#define OP_HTTP_PROXY_HOST(_host) \\\n OP_URL_OPT(OP_HTTP_PROXY_HOST_REQUEST),OP_CHECK_CONST_CHAR_PTR(_host)\n\n/**Use the given port when proxying connections.\n   This option only has an effect if #OP_HTTP_PROXY_HOST is specified with a\n    non-<code>NULL</code> \\a _host.\n   If this option is not provided, the proxy port number defaults to 8080\n    (http-alt).\n   All proxy parameters are ignored for non-http and non-https URLs.\n   \\param _port <code>opus_int32</code>: The proxy server port.\n                This must be in the range 0...65535 (inclusive), or the\n                 URL function this is passed to will fail.\n   \\hideinitializer*/\n#define OP_HTTP_PROXY_PORT(_port) \\\n OP_URL_OPT(OP_HTTP_PROXY_PORT_REQUEST),OP_CHECK_INT(_port)\n\n/**Use the given user name for authentication when proxying connections.\n   All proxy parameters are ignored for non-http and non-https URLs.\n   \\param _user const char *: The proxy server user name.\n                              This may be <code>NULL</code> to disable proxy\n                               authentication.\n                              A non-<code>NULL</code> value only has an effect\n                               if #OP_HTTP_PROXY_HOST and #OP_HTTP_PROXY_PASS\n                               are also specified with non-<code>NULL</code>\n                               arguments.\n   \\hideinitializer*/\n#define OP_HTTP_PROXY_USER(_user) \\\n OP_URL_OPT(OP_HTTP_PROXY_USER_REQUEST),OP_CHECK_CONST_CHAR_PTR(_user)\n\n/**Use the given password for authentication when proxying connections.\n   All proxy parameters are ignored for non-http and non-https URLs.\n   \\param _pass const char *: The proxy server password.\n                              This may be <code>NULL</code> to disable proxy\n                               authentication.\n                              A non-<code>NULL</code> value only has an effect\n                               if #OP_HTTP_PROXY_HOST and #OP_HTTP_PROXY_USER\n                               are also specified with non-<code>NULL</code>\n                               arguments.\n   \\hideinitializer*/\n#define OP_HTTP_PROXY_PASS(_pass) \\\n OP_URL_OPT(OP_HTTP_PROXY_PASS_REQUEST),OP_CHECK_CONST_CHAR_PTR(_pass)\n\n/**Parse information about the streaming server (if any) and return it.\n   Very little validation is done.\n   In particular, OpusServerInfo::url may not be a valid URL,\n    OpusServerInfo::bitrate_kbps may not really be in kbps, and\n    OpusServerInfo::content_type may not be a valid MIME type.\n   The character set of the string fields is not specified anywhere, and should\n    not be assumed to be valid UTF-8.\n   \\param _info OpusServerInfo *: Returns information about the server.\n                                  If there is any error opening the stream, the\n                                   contents of this structure remain\n                                   unmodified.\n                                  On success, fills in the structure with the\n                                   server information that was available, if\n                                   any.\n                                  After a successful return, the contents of\n                                   this structure should be freed by calling\n                                   opus_server_info_clear().\n   \\hideinitializer*/\n#define OP_GET_SERVER_INFO(_info) \\\n OP_URL_OPT(OP_GET_SERVER_INFO_REQUEST),OP_CHECK_SERVER_INFO_PTR(_info)\n\n/*@}*/\n/*@}*/\n\n/**\\defgroup stream_callbacks Abstract Stream Reading Interface*/\n/*@{*/\n/**\\name Functions for reading from streams\n   These functions define the interface used to read from and seek in a stream\n    of data.\n   A stream does not need to implement seeking, but the decoder will not be\n    able to seek if it does not do so.\n   These functions also include some convenience routines for working with\n    standard <code>FILE</code> pointers, complete streams stored in a single\n    block of memory, or URLs.*/\n/*@{*/\n\n/**Reads up to \\a _nbytes bytes of data from \\a _stream.\n   \\param      _stream The stream to read from.\n   \\param[out] _ptr    The buffer to store the data in.\n   \\param      _nbytes The maximum number of bytes to read.\n                       This function may return fewer, though it will not\n                        return zero unless it reaches end-of-file.\n   \\return The number of bytes successfully read, or a negative value on\n            error.*/\ntypedef int (*op_read_func)(void *_stream,unsigned char *_ptr,int _nbytes);\n\n/**Sets the position indicator for \\a _stream.\n   The new position, measured in bytes, is obtained by adding \\a _offset\n    bytes to the position specified by \\a _whence.\n   If \\a _whence is set to <code>SEEK_SET</code>, <code>SEEK_CUR</code>, or\n    <code>SEEK_END</code>, the offset is relative to the start of the stream,\n    the current position indicator, or end-of-file, respectively.\n   \\retval 0  Success.\n   \\retval -1 Seeking is not supported or an error occurred.\n              <code>errno</code> need not be set.*/\ntypedef int (*op_seek_func)(void *_stream,opus_int64 _offset,int _whence);\n\n/**Obtains the current value of the position indicator for \\a _stream.\n   \\return The current position indicator.*/\ntypedef opus_int64 (*op_tell_func)(void *_stream);\n\n/**Closes the underlying stream.\n   \\retval 0   Success.\n   \\retval EOF An error occurred.\n               <code>errno</code> need not be set.*/\ntypedef int (*op_close_func)(void *_stream);\n\n/**The callbacks used to access non-<code>FILE</code> stream resources.\n   The function prototypes are basically the same as for the stdio functions\n    <code>fread()</code>, <code>fseek()</code>, <code>ftell()</code>, and\n    <code>fclose()</code>.\n   The differences are that the <code>FILE *</code> arguments have been\n    replaced with a <code>void *</code>, which is to be used as a pointer to\n    whatever internal data these functions might need, that #seek and #tell\n    take and return 64-bit offsets, and that #seek <em>must</em> return -1 if\n    the stream is unseekable.*/\nstruct OpusFileCallbacks{\n  /**Used to read data from the stream.\n     This must not be <code>NULL</code>.*/\n  op_read_func  read;\n  /**Used to seek in the stream.\n     This may be <code>NULL</code> if seeking is not implemented.*/\n  op_seek_func  seek;\n  /**Used to return the current read position in the stream.\n     This may be <code>NULL</code> if seeking is not implemented.*/\n  op_tell_func  tell;\n  /**Used to close the stream when the decoder is freed.\n     This may be <code>NULL</code> to leave the stream open.*/\n  op_close_func close;\n};\n\n/**Opens a stream with <code>fopen()</code> and fills in a set of callbacks\n    that can be used to access it.\n   This is useful to avoid writing your own portable 64-bit seeking wrappers,\n    and also avoids cross-module linking issues on Windows, where a\n    <code>FILE *</code> must be accessed by routines defined in the same module\n    that opened it.\n   \\param[out] _cb   The callbacks to use for this file.\n                     If there is an error opening the file, nothing will be\n                      filled in here.\n   \\param      _path The path to the file to open.\n                     On Windows, this string must be UTF-8 (to allow access to\n                      files whose names cannot be represented in the current\n                      MBCS code page).\n                     All other systems use the native character encoding.\n   \\param      _mode The mode to open the file in.\n   \\return A stream handle to use with the callbacks, or <code>NULL</code> on\n            error.*/\nOP_WARN_UNUSED_RESULT void *op_fopen(OpusFileCallbacks *_cb,\n const char *_path,const char *_mode) OP_ARG_NONNULL(1) OP_ARG_NONNULL(2)\n OP_ARG_NONNULL(3);\n\n/**Opens a stream with <code>fdopen()</code> and fills in a set of callbacks\n    that can be used to access it.\n   This is useful to avoid writing your own portable 64-bit seeking wrappers,\n    and also avoids cross-module linking issues on Windows, where a\n    <code>FILE *</code> must be accessed by routines defined in the same module\n    that opened it.\n   \\param[out] _cb   The callbacks to use for this file.\n                     If there is an error opening the file, nothing will be\n                      filled in here.\n   \\param      _fd   The file descriptor to open.\n   \\param      _mode The mode to open the file in.\n   \\return A stream handle to use with the callbacks, or <code>NULL</code> on\n            error.*/\nOP_WARN_UNUSED_RESULT void *op_fdopen(OpusFileCallbacks *_cb,\n int _fd,const char *_mode) OP_ARG_NONNULL(1) OP_ARG_NONNULL(3);\n\n/**Opens a stream with <code>freopen()</code> and fills in a set of callbacks\n    that can be used to access it.\n   This is useful to avoid writing your own portable 64-bit seeking wrappers,\n    and also avoids cross-module linking issues on Windows, where a\n    <code>FILE *</code> must be accessed by routines defined in the same module\n    that opened it.\n   \\param[out] _cb     The callbacks to use for this file.\n                       If there is an error opening the file, nothing will be\n                        filled in here.\n   \\param      _path   The path to the file to open.\n                       On Windows, this string must be UTF-8 (to allow access\n                        to files whose names cannot be represented in the\n                        current MBCS code page).\n                       All other systems use the native character encoding.\n   \\param      _mode   The mode to open the file in.\n   \\param      _stream A stream previously returned by op_fopen(), op_fdopen(),\n                        or op_freopen().\n   \\return A stream handle to use with the callbacks, or <code>NULL</code> on\n            error.*/\nOP_WARN_UNUSED_RESULT void *op_freopen(OpusFileCallbacks *_cb,\n const char *_path,const char *_mode,void *_stream) OP_ARG_NONNULL(1)\n OP_ARG_NONNULL(2) OP_ARG_NONNULL(3) OP_ARG_NONNULL(4);\n\n/**Creates a stream that reads from the given block of memory.\n   This block of memory must contain the complete stream to decode.\n   This is useful for caching small streams (e.g., sound effects) in RAM.\n   \\param[out] _cb   The callbacks to use for this stream.\n                     If there is an error creating the stream, nothing will be\n                      filled in here.\n   \\param      _data The block of memory to read from.\n   \\param      _size The size of the block of memory.\n   \\return A stream handle to use with the callbacks, or <code>NULL</code> on\n            error.*/\nOP_WARN_UNUSED_RESULT void *op_mem_stream_create(OpusFileCallbacks *_cb,\n const unsigned char *_data,size_t _size) OP_ARG_NONNULL(1);\n\n/**Creates a stream that reads from the given URL.\n   This function behaves identically to op_url_stream_create(), except that it\n    takes a va_list instead of a variable number of arguments.\n   It does not call the <code>va_end</code> macro, and because it invokes the\n    <code>va_arg</code> macro, the value of \\a _ap is undefined after the call.\n   \\note If you use this function, you must link against <tt>libopusurl</tt>.\n   \\param[out]    _cb  The callbacks to use for this stream.\n                       If there is an error creating the stream, nothing will\n                        be filled in here.\n   \\param         _url The URL to read from.\n                       Currently only the <file:>, <http:>, and <https:>\n                        schemes are supported.\n                       Both <http:> and <https:> may be disabled at compile\n                        time, in which case opening such URLs will always fail.\n                       Currently this only supports URIs.\n                       IRIs should be converted to UTF-8 and URL-escaped, with\n                        internationalized domain names encoded in punycode,\n                        before passing them to this function.\n   \\param[in,out] _ap  A list of the \\ref url_options \"optional flags\" to use.\n                       This is a variable-length list of options terminated\n                        with <code>NULL</code>.\n   \\return A stream handle to use with the callbacks, or <code>NULL</code> on\n            error.*/\nOP_WARN_UNUSED_RESULT void *op_url_stream_vcreate(OpusFileCallbacks *_cb,\n const char *_url,va_list _ap) OP_ARG_NONNULL(1) OP_ARG_NONNULL(2);\n\n/**Creates a stream that reads from the given URL.\n   \\note If you use this function, you must link against <tt>libopusurl</tt>.\n   \\param[out] _cb  The callbacks to use for this stream.\n                    If there is an error creating the stream, nothing will be\n                     filled in here.\n   \\param      _url The URL to read from.\n                    Currently only the <file:>, <http:>, and <https:> schemes\n                     are supported.\n                    Both <http:> and <https:> may be disabled at compile time,\n                     in which case opening such URLs will always fail.\n                    Currently this only supports URIs.\n                    IRIs should be converted to UTF-8 and URL-escaped, with\n                     internationalized domain names encoded in punycode, before\n                     passing them to this function.\n   \\param      ...  The \\ref url_options \"optional flags\" to use.\n                    This is a variable-length list of options terminated with\n                     <code>NULL</code>.\n   \\return A stream handle to use with the callbacks, or <code>NULL</code> on\n            error.*/\nOP_WARN_UNUSED_RESULT void *op_url_stream_create(OpusFileCallbacks *_cb,\n const char *_url,...) OP_ARG_NONNULL(1) OP_ARG_NONNULL(2);\n\n/*@}*/\n/*@}*/\n\n/**\\defgroup stream_open_close Opening and Closing*/\n/*@{*/\n/**\\name Functions for opening and closing streams\n\n   These functions allow you to test a stream to see if it is Opus, open it,\n    and close it.\n   Several flavors are provided for each of the built-in stream types, plus a\n    more general version which takes a set of application-provided callbacks.*/\n/*@{*/\n\n/**Test to see if this is an Opus stream.\n   For good results, you will need at least 57 bytes (for a pure Opus-only\n    stream).\n   Something like 512 bytes will give more reliable results for multiplexed\n    streams.\n   This function is meant to be a quick-rejection filter.\n   Its purpose is not to guarantee that a stream is a valid Opus stream, but to\n    ensure that it looks enough like Opus that it isn't going to be recognized\n    as some other format (except possibly an Opus stream that is also\n    multiplexed with other codecs, such as video).\n   \\param[out] _head     The parsed ID header contents.\n                         You may pass <code>NULL</code> if you do not need\n                          this information.\n                         If the function fails, the contents of this structure\n                          remain untouched.\n   \\param _initial_data  An initial buffer of data from the start of the\n                          stream.\n   \\param _initial_bytes The number of bytes in \\a _initial_data.\n   \\return 0 if the data appears to be Opus, or a negative value on error.\n   \\retval #OP_FALSE      There was not enough data to tell if this was an Opus\n                           stream or not.\n   \\retval #OP_EFAULT     An internal memory allocation failed.\n   \\retval #OP_EIMPL      The stream used a feature that is not implemented,\n                           such as an unsupported channel family.\n   \\retval #OP_ENOTFORMAT If the data did not contain a recognizable ID\n                           header for an Opus stream.\n   \\retval #OP_EVERSION   If the version field signaled a version this library\n                           does not know how to parse.\n   \\retval #OP_EBADHEADER The ID header was not properly formatted or contained\n                           illegal values.*/\nint op_test(OpusHead *_head,\n const unsigned char *_initial_data,size_t _initial_bytes);\n\n/**Open a stream from the given file path.\n   \\param      _path  The path to the file to open.\n   \\param[out] _error Returns 0 on success, or a failure code on error.\n                      You may pass in <code>NULL</code> if you don't want the\n                       failure code.\n                      The failure code will be #OP_EFAULT if the file could not\n                       be opened, or one of the other failure codes from\n                       op_open_callbacks() otherwise.\n   \\return A freshly opened \\c OggOpusFile, or <code>NULL</code> on error.*/\nOP_WARN_UNUSED_RESULT OggOpusFile *op_open_file(const char *_path,int *_error)\n OP_ARG_NONNULL(1);\n\n/**Open a stream from a memory buffer.\n   \\param      _data  The memory buffer to open.\n   \\param      _size  The number of bytes in the buffer.\n   \\param[out] _error Returns 0 on success, or a failure code on error.\n                      You may pass in <code>NULL</code> if you don't want the\n                       failure code.\n                      See op_open_callbacks() for a full list of failure codes.\n   \\return A freshly opened \\c OggOpusFile, or <code>NULL</code> on error.*/\nOP_WARN_UNUSED_RESULT OggOpusFile *op_open_memory(const unsigned char *_data,\n size_t _size,int *_error);\n\n/**Open a stream from a URL.\n   This function behaves identically to op_open_url(), except that it\n    takes a va_list instead of a variable number of arguments.\n   It does not call the <code>va_end</code> macro, and because it invokes the\n    <code>va_arg</code> macro, the value of \\a _ap is undefined after the call.\n   \\note If you use this function, you must link against <tt>libopusurl</tt>.\n   \\param         _url   The URL to open.\n                         Currently only the <file:>, <http:>, and <https:>\n                          schemes are supported.\n                         Both <http:> and <https:> may be disabled at compile\n                          time, in which case opening such URLs will always\n                          fail.\n                         Currently this only supports URIs.\n                         IRIs should be converted to UTF-8 and URL-escaped,\n                          with internationalized domain names encoded in\n                          punycode, before passing them to this function.\n   \\param[out]    _error Returns 0 on success, or a failure code on error.\n                         You may pass in <code>NULL</code> if you don't want\n                          the failure code.\n                         See op_open_callbacks() for a full list of failure\n                          codes.\n   \\param[in,out] _ap    A list of the \\ref url_options \"optional flags\" to\n                          use.\n                         This is a variable-length list of options terminated\n                          with <code>NULL</code>.\n   \\return A freshly opened \\c OggOpusFile, or <code>NULL</code> on error.*/\nOP_WARN_UNUSED_RESULT OggOpusFile *op_vopen_url(const char *_url,\n int *_error,va_list _ap) OP_ARG_NONNULL(1);\n\n/**Open a stream from a URL.\n   \\note If you use this function, you must link against <tt>libopusurl</tt>.\n   \\param      _url   The URL to open.\n                      Currently only the <file:>, <http:>, and <https:> schemes\n                       are supported.\n                      Both <http:> and <https:> may be disabled at compile\n                       time, in which case opening such URLs will always fail.\n                      Currently this only supports URIs.\n                      IRIs should be converted to UTF-8 and URL-escaped, with\n                       internationalized domain names encoded in punycode,\n                       before passing them to this function.\n   \\param[out] _error Returns 0 on success, or a failure code on error.\n                      You may pass in <code>NULL</code> if you don't want the\n                       failure code.\n                      See op_open_callbacks() for a full list of failure codes.\n   \\param      ...    The \\ref url_options \"optional flags\" to use.\n                      This is a variable-length list of options terminated with\n                       <code>NULL</code>.\n   \\return A freshly opened \\c OggOpusFile, or <code>NULL</code> on error.*/\nOP_WARN_UNUSED_RESULT OggOpusFile *op_open_url(const char *_url,\n int *_error,...) OP_ARG_NONNULL(1);\n\n/**Open a stream using the given set of callbacks to access it.\n   \\param _stream        The stream to read from (e.g., a <code>FILE *</code>).\n                         This value will be passed verbatim as the first\n                          argument to all of the callbacks.\n   \\param _cb            The callbacks with which to access the stream.\n                         <code><a href=\"#op_read_func\">read()</a></code> must\n                          be implemented.\n                         <code><a href=\"#op_seek_func\">seek()</a></code> and\n                          <code><a href=\"#op_tell_func\">tell()</a></code> may\n                          be <code>NULL</code>, or may always return -1 to\n                          indicate a stream is unseekable, but if\n                          <code><a href=\"#op_seek_func\">seek()</a></code> is\n                          implemented and succeeds on a particular stream, then\n                          <code><a href=\"#op_tell_func\">tell()</a></code> must\n                          also.\n                         <code><a href=\"#op_close_func\">close()</a></code> may\n                          be <code>NULL</code>, but if it is not, it will be\n                          called when the \\c OggOpusFile is destroyed by\n                          op_free().\n                         It will not be called if op_open_callbacks() fails\n                          with an error.\n   \\param _initial_data  An initial buffer of data from the start of the\n                          stream.\n                         Applications can read some number of bytes from the\n                          start of the stream to help identify this as an Opus\n                          stream, and then provide them here to allow the\n                          stream to be opened, even if it is unseekable.\n   \\param _initial_bytes The number of bytes in \\a _initial_data.\n                         If the stream is seekable, its current position (as\n                          reported by\n                          <code><a href=\"#opus_tell_func\">tell()</a></code>\n                          at the start of this function) must be equal to\n                          \\a _initial_bytes.\n                         Otherwise, seeking to absolute positions will\n                          generate inconsistent results.\n   \\param[out] _error    Returns 0 on success, or a failure code on error.\n                         You may pass in <code>NULL</code> if you don't want\n                          the failure code.\n                         The failure code will be one of\n                         <dl>\n                           <dt>#OP_EREAD</dt>\n                           <dd>An underlying read, seek, or tell operation\n                            failed when it should have succeeded, or we failed\n                            to find data in the stream we had seen before.</dd>\n                           <dt>#OP_EFAULT</dt>\n                           <dd>There was a memory allocation failure, or an\n                            internal library error.</dd>\n                           <dt>#OP_EIMPL</dt>\n                           <dd>The stream used a feature that is not\n                            implemented, such as an unsupported channel\n                            family.</dd>\n                           <dt>#OP_EINVAL</dt>\n                           <dd><code><a href=\"#op_seek_func\">seek()</a></code>\n                            was implemented and succeeded on this source, but\n                            <code><a href=\"#op_tell_func\">tell()</a></code>\n                            did not, or the starting position indicator was\n                            not equal to \\a _initial_bytes.</dd>\n                           <dt>#OP_ENOTFORMAT</dt>\n                           <dd>The stream contained a link that did not have\n                            any logical Opus streams in it.</dd>\n                           <dt>#OP_EBADHEADER</dt>\n                           <dd>A required header packet was not properly\n                            formatted, contained illegal values, or was missing\n                            altogether.</dd>\n                           <dt>#OP_EVERSION</dt>\n                           <dd>An ID header contained an unrecognized version\n                            number.</dd>\n                           <dt>#OP_EBADLINK</dt>\n                           <dd>We failed to find data we had seen before after\n                            seeking.</dd>\n                           <dt>#OP_EBADTIMESTAMP</dt>\n                           <dd>The first or last timestamp in a link failed\n                            basic validity checks.</dd>\n                         </dl>\n   \\return A freshly opened \\c OggOpusFile, or <code>NULL</code> on error.\n           <tt>libopusfile</tt> does <em>not</em> take ownership of the stream\n            if the call fails.\n           The calling application is responsible for closing the stream if\n            this call returns an error.*/\nOP_WARN_UNUSED_RESULT OggOpusFile *op_open_callbacks(void *_stream,\n const OpusFileCallbacks *_cb,const unsigned char *_initial_data,\n size_t _initial_bytes,int *_error) OP_ARG_NONNULL(2);\n\n/**Partially open a stream from the given file path.\n   \\see op_test_callbacks\n   \\param      _path  The path to the file to open.\n   \\param[out] _error Returns 0 on success, or a failure code on error.\n                      You may pass in <code>NULL</code> if you don't want the\n                       failure code.\n                      The failure code will be #OP_EFAULT if the file could not\n                       be opened, or one of the other failure codes from\n                       op_open_callbacks() otherwise.\n   \\return A partially opened \\c OggOpusFile, or <code>NULL</code> on error.*/\nOP_WARN_UNUSED_RESULT OggOpusFile *op_test_file(const char *_path,int *_error)\n OP_ARG_NONNULL(1);\n\n/**Partially open a stream from a memory buffer.\n   \\see op_test_callbacks\n   \\param      _data  The memory buffer to open.\n   \\param      _size  The number of bytes in the buffer.\n   \\param[out] _error Returns 0 on success, or a failure code on error.\n                      You may pass in <code>NULL</code> if you don't want the\n                       failure code.\n                      See op_open_callbacks() for a full list of failure codes.\n   \\return A partially opened \\c OggOpusFile, or <code>NULL</code> on error.*/\nOP_WARN_UNUSED_RESULT OggOpusFile *op_test_memory(const unsigned char *_data,\n size_t _size,int *_error);\n\n/**Partially open a stream from a URL.\n   This function behaves identically to op_test_url(), except that it\n    takes a va_list instead of a variable number of arguments.\n   It does not call the <code>va_end</code> macro, and because it invokes the\n    <code>va_arg</code> macro, the value of \\a _ap is undefined after the call.\n   \\note If you use this function, you must link against <tt>libopusurl</tt>.\n   \\see op_test_url\n   \\see op_test_callbacks\n   \\param         _url    The URL to open.\n                          Currently only the <file:>, <http:>, and <https:>\n                           schemes are supported.\n                          Both <http:> and <https:> may be disabled at compile\n                           time, in which case opening such URLs will always\n                           fail.\n                          Currently this only supports URIs.\n                          IRIs should be converted to UTF-8 and URL-escaped,\n                           with internationalized domain names encoded in\n                           punycode, before passing them to this function.\n   \\param[out]    _error  Returns 0 on success, or a failure code on error.\n                          You may pass in <code>NULL</code> if you don't want\n                           the failure code.\n                          See op_open_callbacks() for a full list of failure\n                           codes.\n   \\param[in,out] _ap     A list of the \\ref url_options \"optional flags\" to\n                           use.\n                          This is a variable-length list of options terminated\n                           with <code>NULL</code>.\n   \\return A partially opened \\c OggOpusFile, or <code>NULL</code> on error.*/\nOP_WARN_UNUSED_RESULT OggOpusFile *op_vtest_url(const char *_url,\n int *_error,va_list _ap) OP_ARG_NONNULL(1);\n\n/**Partially open a stream from a URL.\n   \\note If you use this function, you must link against <tt>libopusurl</tt>.\n   \\see op_test_callbacks\n   \\param      _url    The URL to open.\n                       Currently only the <file:>, <http:>, and <https:>\n                        schemes are supported.\n                       Both <http:> and <https:> may be disabled at compile\n                        time, in which case opening such URLs will always fail.\n                       Currently this only supports URIs.\n                       IRIs should be converted to UTF-8 and URL-escaped, with\n                        internationalized domain names encoded in punycode,\n                        before passing them to this function.\n   \\param[out] _error  Returns 0 on success, or a failure code on error.\n                       You may pass in <code>NULL</code> if you don't want the\n                        failure code.\n                       See op_open_callbacks() for a full list of failure\n                        codes.\n   \\param      ...     The \\ref url_options \"optional flags\" to use.\n                       This is a variable-length list of options terminated\n                        with <code>NULL</code>.\n   \\return A partially opened \\c OggOpusFile, or <code>NULL</code> on error.*/\nOP_WARN_UNUSED_RESULT OggOpusFile *op_test_url(const char *_url,\n int *_error,...) OP_ARG_NONNULL(1);\n\n/**Partially open a stream using the given set of callbacks to access it.\n   This tests for Opusness and loads the headers for the first link.\n   It does not seek (although it tests for seekability).\n   You can query a partially open stream for the few pieces of basic\n    information returned by op_serialno(), op_channel_count(), op_head(), and\n    op_tags() (but only for the first link).\n   You may also determine if it is seekable via a call to op_seekable().\n   You cannot read audio from the stream, seek, get the size or duration,\n    get information from links other than the first one, or even get the total\n    number of links until you finish opening the stream with op_test_open().\n   If you do not need to do any of these things, you can dispose of it with\n    op_free() instead.\n\n   This function is provided mostly to simplify porting existing code that used\n    <tt>libvorbisfile</tt>.\n   For new code, you are likely better off using op_test() instead, which\n    is less resource-intensive, requires less data to succeed, and imposes a\n    hard limit on the amount of data it examines (important for unseekable\n    streams, where all such data must be buffered until you are sure of the\n    stream type).\n   \\param _stream        The stream to read from (e.g., a <code>FILE *</code>).\n                         This value will be passed verbatim as the first\n                          argument to all of the callbacks.\n   \\param _cb            The callbacks with which to access the stream.\n                         <code><a href=\"#op_read_func\">read()</a></code> must\n                          be implemented.\n                         <code><a href=\"#op_seek_func\">seek()</a></code> and\n                          <code><a href=\"#op_tell_func\">tell()</a></code> may\n                          be <code>NULL</code>, or may always return -1 to\n                          indicate a stream is unseekable, but if\n                          <code><a href=\"#op_seek_func\">seek()</a></code> is\n                          implemented and succeeds on a particular stream, then\n                          <code><a href=\"#op_tell_func\">tell()</a></code> must\n                          also.\n                         <code><a href=\"#op_close_func\">close()</a></code> may\n                          be <code>NULL</code>, but if it is not, it will be\n                          called when the \\c OggOpusFile is destroyed by\n                          op_free().\n                         It will not be called if op_open_callbacks() fails\n                          with an error.\n   \\param _initial_data  An initial buffer of data from the start of the\n                          stream.\n                         Applications can read some number of bytes from the\n                          start of the stream to help identify this as an Opus\n                          stream, and then provide them here to allow the\n                          stream to be tested more thoroughly, even if it is\n                          unseekable.\n   \\param _initial_bytes The number of bytes in \\a _initial_data.\n                         If the stream is seekable, its current position (as\n                          reported by\n                          <code><a href=\"#opus_tell_func\">tell()</a></code>\n                          at the start of this function) must be equal to\n                          \\a _initial_bytes.\n                         Otherwise, seeking to absolute positions will\n                          generate inconsistent results.\n   \\param[out] _error    Returns 0 on success, or a failure code on error.\n                         You may pass in <code>NULL</code> if you don't want\n                          the failure code.\n                         See op_open_callbacks() for a full list of failure\n                          codes.\n   \\return A partially opened \\c OggOpusFile, or <code>NULL</code> on error.\n           <tt>libopusfile</tt> does <em>not</em> take ownership of the stream\n            if the call fails.\n           The calling application is responsible for closing the stream if\n            this call returns an error.*/\nOP_WARN_UNUSED_RESULT OggOpusFile *op_test_callbacks(void *_stream,\n const OpusFileCallbacks *_cb,const unsigned char *_initial_data,\n size_t _initial_bytes,int *_error) OP_ARG_NONNULL(2);\n\n/**Finish opening a stream partially opened with op_test_callbacks() or one of\n    the associated convenience functions.\n   If this function fails, you are still responsible for freeing the\n    \\c OggOpusFile with op_free().\n   \\param _of The \\c OggOpusFile to finish opening.\n   \\return 0 on success, or a negative value on error.\n   \\retval #OP_EREAD         An underlying read, seek, or tell operation failed\n                              when it should have succeeded.\n   \\retval #OP_EFAULT        There was a memory allocation failure, or an\n                              internal library error.\n   \\retval #OP_EIMPL         The stream used a feature that is not implemented,\n                              such as an unsupported channel family.\n   \\retval #OP_EINVAL        The stream was not partially opened with\n                              op_test_callbacks() or one of the associated\n                              convenience functions.\n   \\retval #OP_ENOTFORMAT    The stream contained a link that did not have any\n                              logical Opus streams in it.\n   \\retval #OP_EBADHEADER    A required header packet was not properly\n                              formatted, contained illegal values, or was\n                              missing altogether.\n   \\retval #OP_EVERSION      An ID header contained an unrecognized version\n                              number.\n   \\retval #OP_EBADLINK      We failed to find data we had seen before after\n                              seeking.\n   \\retval #OP_EBADTIMESTAMP The first or last timestamp in a link failed basic\n                              validity checks.*/\nint op_test_open(OggOpusFile *_of) OP_ARG_NONNULL(1);\n\n/**Release all memory used by an \\c OggOpusFile.\n   \\param _of The \\c OggOpusFile to free.*/\nvoid op_free(OggOpusFile *_of);\n\n/*@}*/\n/*@}*/\n\n/**\\defgroup stream_info Stream Information*/\n/*@{*/\n/**\\name Functions for obtaining information about streams\n\n   These functions allow you to get basic information about a stream, including\n    seekability, the number of links (for chained streams), plus the size,\n    duration, bitrate, header parameters, and meta information for each link\n    (or, where available, the stream as a whole).\n   Some of these (size, duration) are only available for seekable streams.\n   You can also query the current stream position, link, and playback time,\n    and instantaneous bitrate during playback.\n\n   Some of these functions may be used successfully on the partially open\n    streams returned by op_test_callbacks() or one of the associated\n    convenience functions.\n   Their documention will indicate so explicitly.*/\n/*@{*/\n\n/**Returns whether or not the stream being read is seekable.\n   This is true if\n   <ol>\n   <li>The <code><a href=\"#op_seek_func\">seek()</a></code> and\n    <code><a href=\"#op_tell_func\">tell()</a></code> callbacks are both\n    non-<code>NULL</code>,</li>\n   <li>The <code><a href=\"#op_seek_func\">seek()</a></code> callback was\n    successfully executed at least once, and</li>\n   <li>The <code><a href=\"#op_tell_func\">tell()</a></code> callback was\n    successfully able to report the position indicator afterwards.</li>\n   </ol>\n   This function may be called on partially-opened streams.\n   \\param _of The \\c OggOpusFile whose seekable status is to be returned.\n   \\return A non-zero value if seekable, and 0 if unseekable.*/\nint op_seekable(const OggOpusFile *_of) OP_ARG_NONNULL(1);\n\n/**Returns the number of links in this chained stream.\n   This function may be called on partially-opened streams, but it will always\n    return 1.\n   The actual number of links is not known until the stream is fully opened.\n   \\param _of The \\c OggOpusFile from which to retrieve the link count.\n   \\return For fully-open seekable streams, this returns the total number of\n            links in the whole stream, which will be at least 1.\n           For partially-open or unseekable streams, this always returns 1.*/\nint op_link_count(const OggOpusFile *_of) OP_ARG_NONNULL(1);\n\n/**Get the serial number of the given link in a (possibly-chained) Ogg Opus\n    stream.\n   This function may be called on partially-opened streams, but it will always\n    return the serial number of the Opus stream in the first link.\n   \\param _of The \\c OggOpusFile from which to retrieve the serial number.\n   \\param _li The index of the link whose serial number should be retrieved.\n              Use a negative number to get the serial number of the current\n               link.\n   \\return The serial number of the given link.\n           If \\a _li is greater than the total number of links, this returns\n            the serial number of the last link.\n           If the stream is not seekable, this always returns the serial number\n            of the current link.*/\nopus_uint32 op_serialno(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1);\n\n/**Get the channel count of the given link in a (possibly-chained) Ogg Opus\n    stream.\n   This is equivalent to <code>op_head(_of,_li)->channel_count</code>, but\n    is provided for convenience.\n   This function may be called on partially-opened streams, but it will always\n    return the channel count of the Opus stream in the first link.\n   \\param _of The \\c OggOpusFile from which to retrieve the channel count.\n   \\param _li The index of the link whose channel count should be retrieved.\n              Use a negative number to get the channel count of the current\n               link.\n   \\return The channel count of the given link.\n           If \\a _li is greater than the total number of links, this returns\n            the channel count of the last link.\n           If the stream is not seekable, this always returns the channel count\n            of the current link.*/\nint op_channel_count(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1);\n\n/**Get the total (compressed) size of the stream, or of an individual link in\n    a (possibly-chained) Ogg Opus stream, including all headers and Ogg muxing\n    overhead.\n   \\warning If the Opus stream (or link) is concurrently multiplexed with other\n    logical streams (e.g., video), this returns the size of the entire stream\n    (or link), not just the number of bytes in the first logical Opus stream.\n   Returning the latter would require scanning the entire file.\n   \\param _of The \\c OggOpusFile from which to retrieve the compressed size.\n   \\param _li The index of the link whose compressed size should be computed.\n              Use a negative number to get the compressed size of the entire\n               stream.\n   \\return The compressed size of the entire stream if \\a _li is negative, the\n            compressed size of link \\a _li if it is non-negative, or a negative\n            value on error.\n           The compressed size of the entire stream may be smaller than that\n            of the underlying stream if trailing garbage was detected in the\n            file.\n   \\retval #OP_EINVAL The stream is not seekable (so we can't know the length),\n                       \\a _li wasn't less than the total number of links in\n                       the stream, or the stream was only partially open.*/\nopus_int64 op_raw_total(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1);\n\n/**Get the total PCM length (number of samples at 48 kHz) of the stream, or of\n    an individual link in a (possibly-chained) Ogg Opus stream.\n   Users looking for <code>op_time_total()</code> should use op_pcm_total()\n    instead.\n   Because timestamps in Opus are fixed at 48 kHz, there is no need for a\n    separate function to convert this to seconds (and leaving it out avoids\n    introducing floating point to the API, for those that wish to avoid it).\n   \\param _of The \\c OggOpusFile from which to retrieve the PCM offset.\n   \\param _li The index of the link whose PCM length should be computed.\n              Use a negative number to get the PCM length of the entire stream.\n   \\return The PCM length of the entire stream if \\a _li is negative, the PCM\n            length of link \\a _li if it is non-negative, or a negative value on\n            error.\n   \\retval #OP_EINVAL The stream is not seekable (so we can't know the length),\n                       \\a _li wasn't less than the total number of links in\n                       the stream, or the stream was only partially open.*/\nogg_int64_t op_pcm_total(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1);\n\n/**Get the ID header information for the given link in a (possibly chained) Ogg\n    Opus stream.\n   This function may be called on partially-opened streams, but it will always\n    return the ID header information of the Opus stream in the first link.\n   \\param _of The \\c OggOpusFile from which to retrieve the ID header\n               information.\n   \\param _li The index of the link whose ID header information should be\n               retrieved.\n              Use a negative number to get the ID header information of the\n               current link.\n              For an unseekable stream, \\a _li is ignored, and the ID header\n               information for the current link is always returned, if\n               available.\n   \\return The contents of the ID header for the given link.*/\nconst OpusHead *op_head(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1);\n\n/**Get the comment header information for the given link in a (possibly\n    chained) Ogg Opus stream.\n   This function may be called on partially-opened streams, but it will always\n    return the tags from the Opus stream in the first link.\n   \\param _of The \\c OggOpusFile from which to retrieve the comment header\n               information.\n   \\param _li The index of the link whose comment header information should be\n               retrieved.\n              Use a negative number to get the comment header information of\n               the current link.\n              For an unseekable stream, \\a _li is ignored, and the comment\n               header information for the current link is always returned, if\n               available.\n   \\return The contents of the comment header for the given link, or\n            <code>NULL</code> if this is an unseekable stream that encountered\n            an invalid link.*/\nconst OpusTags *op_tags(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1);\n\n/**Retrieve the index of the current link.\n   This is the link that produced the data most recently read by\n    op_read_float() or its associated functions, or, after a seek, the link\n    that the seek target landed in.\n   Reading more data may advance the link index (even on the first read after a\n    seek).\n   \\param _of The \\c OggOpusFile from which to retrieve the current link index.\n   \\return The index of the current link on success, or a negative value on\n            failure.\n           For seekable streams, this is a number between 0 (inclusive) and the\n            value returned by op_link_count() (exclusive).\n           For unseekable streams, this value starts at 0 and increments by one\n            each time a new link is encountered (even though op_link_count()\n            always returns 1).\n   \\retval #OP_EINVAL The stream was only partially open.*/\nint op_current_link(const OggOpusFile *_of) OP_ARG_NONNULL(1);\n\n/**Computes the bitrate of the stream, or of an individual link in a\n    (possibly-chained) Ogg Opus stream.\n   The stream must be seekable to compute the bitrate.\n   For unseekable streams, use op_bitrate_instant() to get periodic estimates.\n   \\warning If the Opus stream (or link) is concurrently multiplexed with other\n    logical streams (e.g., video), this uses the size of the entire stream (or\n    link) to compute the bitrate, not just the number of bytes in the first\n    logical Opus stream.\n   Returning the latter requires scanning the entire file, but this may be done\n    by decoding the whole file and calling op_bitrate_instant() once at the\n    end.\n   Install a trivial decoding callback with op_set_decode_callback() if you\n    wish to skip actual decoding during this process.\n   \\param _of The \\c OggOpusFile from which to retrieve the bitrate.\n   \\param _li The index of the link whose bitrate should be computed.\n              Use a negative number to get the bitrate of the whole stream.\n   \\return The bitrate on success, or a negative value on error.\n   \\retval #OP_EINVAL The stream was only partially open, the stream was not\n                       seekable, or \\a _li was larger than the number of\n                       links.*/\nopus_int32 op_bitrate(const OggOpusFile *_of,int _li) OP_ARG_NONNULL(1);\n\n/**Compute the instantaneous bitrate, measured as the ratio of bits to playable\n    samples decoded since a) the last call to op_bitrate_instant(), b) the last\n    seek, or c) the start of playback, whichever was most recent.\n   This will spike somewhat after a seek or at the start/end of a chain\n    boundary, as pre-skip, pre-roll, and end-trimming causes samples to be\n    decoded but not played.\n   \\param _of The \\c OggOpusFile from which to retrieve the bitrate.\n   \\return The bitrate, in bits per second, or a negative value on error.\n   \\retval #OP_FALSE  No data has been decoded since any of the events\n                       described above.\n   \\retval #OP_EINVAL The stream was only partially open.*/\nopus_int32 op_bitrate_instant(OggOpusFile *_of) OP_ARG_NONNULL(1);\n\n/**Obtain the current value of the position indicator for \\a _of.\n   \\param _of The \\c OggOpusFile from which to retrieve the position indicator.\n   \\return The byte position that is currently being read from.\n   \\retval #OP_EINVAL The stream was only partially open.*/\nopus_int64 op_raw_tell(const OggOpusFile *_of) OP_ARG_NONNULL(1);\n\n/**Obtain the PCM offset of the next sample to be read.\n   If the stream is not properly timestamped, this might not increment by the\n    proper amount between reads, or even return monotonically increasing\n    values.\n   \\param _of The \\c OggOpusFile from which to retrieve the PCM offset.\n   \\return The PCM offset of the next sample to be read.\n   \\retval #OP_EINVAL The stream was only partially open.*/\nogg_int64_t op_pcm_tell(const OggOpusFile *_of) OP_ARG_NONNULL(1);\n\n/*@}*/\n/*@}*/\n\n/**\\defgroup stream_seeking Seeking*/\n/*@{*/\n/**\\name Functions for seeking in Opus streams\n\n   These functions let you seek in Opus streams, if the underlying stream\n    support it.\n   Seeking is implemented for all built-in stream I/O routines, though some\n    individual streams may not be seekable (pipes, live HTTP streams, or HTTP\n    streams from a server that does not support <code>Range</code> requests).\n\n   op_raw_seek() is the fastest: it is guaranteed to perform at most one\n    physical seek, but, since the target is a byte position, makes no guarantee\n    how close to a given time it will come.\n   op_pcm_seek() provides sample-accurate seeking.\n   The number of physical seeks it requires is still quite small (often 1 or\n    2, even in highly variable bitrate streams).\n\n   Seeking in Opus requires decoding some pre-roll amount before playback to\n    allow the internal state to converge (as if recovering from packet loss).\n   This is handled internally by <tt>libopusfile</tt>, but means there is\n    little extra overhead for decoding up to the exact position requested\n    (since it must decode some amount of audio anyway).\n   It also means that decoding after seeking may not return exactly the same\n    values as would be obtained by decoding the stream straight through.\n   However, such differences are expected to be smaller than the loss\n    introduced by Opus's lossy compression.*/\n/*@{*/\n\n/**Seek to a byte offset relative to the <b>compressed</b> data.\n   This also scans packets to update the PCM cursor.\n   It will cross a logical bitstream boundary, but only if it can't get any\n    packets out of the tail of the link to which it seeks.\n   \\param _of          The \\c OggOpusFile in which to seek.\n   \\param _byte_offset The byte position to seek to.\n                       This must be between 0 and #op_raw_total(\\a _of,\\c -1)\n                        (inclusive).\n   \\return 0 on success, or a negative error code on failure.\n   \\retval #OP_EREAD    The underlying seek operation failed.\n   \\retval #OP_EINVAL   The stream was only partially open, or the target was\n                         outside the valid range for the stream.\n   \\retval #OP_ENOSEEK  This stream is not seekable.\n   \\retval #OP_EBADLINK Failed to initialize a decoder for a stream for an\n                         unknown reason.*/\nint op_raw_seek(OggOpusFile *_of,opus_int64 _byte_offset) OP_ARG_NONNULL(1);\n\n/**Seek to the specified PCM offset, such that decoding will begin at exactly\n    the requested position.\n   \\param _of         The \\c OggOpusFile in which to seek.\n   \\param _pcm_offset The PCM offset to seek to.\n                      This is in samples at 48 kHz relative to the start of the\n                       stream.\n   \\return 0 on success, or a negative value on error.\n   \\retval #OP_EREAD    An underlying read or seek operation failed.\n   \\retval #OP_EINVAL   The stream was only partially open, or the target was\n                         outside the valid range for the stream.\n   \\retval #OP_ENOSEEK  This stream is not seekable.\n   \\retval #OP_EBADLINK We failed to find data we had seen before, or the\n                         bitstream structure was sufficiently malformed that\n                         seeking to the target destination was impossible.*/\nint op_pcm_seek(OggOpusFile *_of,ogg_int64_t _pcm_offset) OP_ARG_NONNULL(1);\n\n/*@}*/\n/*@}*/\n\n/**\\defgroup stream_decoding Decoding*/\n/*@{*/\n/**\\name Functions for decoding audio data\n\n   These functions retrieve actual decoded audio data from the stream.\n   The general functions, op_read() and op_read_float() return 16-bit or\n    floating-point output, both using native endian ordering.\n   The number of channels returned can change from link to link in a chained\n    stream.\n   There are special functions, op_read_stereo() and op_read_float_stereo(),\n    which always output two channels, to simplify applications which do not\n    wish to handle multichannel audio.\n   These downmix multichannel files to two channels, so they can always return\n    samples in the same format for every link in a chained file.\n\n   If the rest of your audio processing chain can handle floating point, the\n    floating-point routines should be preferred, as they prevent clipping and\n    other issues which might be avoided entirely if, e.g., you scale down the\n    volume at some other stage.\n   However, if you intend to consume 16-bit samples directly, the conversion in\n    <tt>libopusfile</tt> provides noise-shaping dithering and, if compiled\n    against <tt>libopus</tt>&nbsp;1.1 or later, soft-clipping prevention.\n\n   <tt>libopusfile</tt> can also be configured at compile time to use the\n    fixed-point <tt>libopus</tt> API.\n   If so, <tt>libopusfile</tt>'s floating-point API may also be disabled.\n   In that configuration, nothing in <tt>libopusfile</tt> will use any\n    floating-point operations, to simplify support on devices without an\n    adequate FPU.\n\n   \\warning HTTPS streams may be be vulnerable to truncation attacks if you do\n    not check the error return code from op_read_float() or its associated\n    functions.\n   If the remote peer does not close the connection gracefully (with a TLS\n    \"close notify\" message), these functions will return #OP_EREAD instead of 0\n    when they reach the end of the file.\n   If you are reading from an <https:> URL (particularly if seeking is not\n    supported), you should make sure to check for this error and warn the user\n    appropriately.*/\n/*@{*/\n\n/**Indicates that the decoding callback should produce signed 16-bit\n    native-endian output samples.*/\n#define OP_DEC_FORMAT_SHORT (7008)\n/**Indicates that the decoding callback should produce 32-bit native-endian\n    float samples.*/\n#define OP_DEC_FORMAT_FLOAT (7040)\n\n/**Indicates that the decoding callback did not decode anything, and that\n    <tt>libopusfile</tt> should decode normally instead.*/\n#define OP_DEC_USE_DEFAULT  (6720)\n\n/**Called to decode an Opus packet.\n   This should invoke the functional equivalent of opus_multistream_decode() or\n    opus_multistream_decode_float(), except that it returns 0 on success\n    instead of the number of decoded samples (which is known a priori).\n   \\param _ctx       The application-provided callback context.\n   \\param _decoder   The decoder to use to decode the packet.\n   \\param[out] _pcm  The buffer to decode into.\n                     This will always have enough room for \\a _nchannels of\n                      \\a _nsamples samples, which should be placed into this\n                      buffer interleaved.\n   \\param _op        The packet to decode.\n                     This will always have its granule position set to a valid\n                      value.\n   \\param _nsamples  The number of samples expected from the packet.\n   \\param _nchannels The number of channels expected from the packet.\n   \\param _format    The desired sample output format.\n                     This is either #OP_DEC_FORMAT_SHORT or\n                      #OP_DEC_FORMAT_FLOAT.\n   \\param _li        The index of the link from which this packet was decoded.\n   \\return A non-negative value on success, or a negative value on error.\n           Any error codes should be the same as those returned by\n            opus_multistream_decode() or opus_multistream_decode_float().\n           Success codes are as follows:\n   \\retval 0                   Decoding was successful.\n                               The application has filled the buffer with\n                                exactly <code>\\a _nsamples*\\a\n                                _nchannels</code> samples in the requested\n                                format.\n   \\retval #OP_DEC_USE_DEFAULT No decoding was done.\n                               <tt>libopusfile</tt> should do the decoding\n                                by itself instead.*/\ntypedef int (*op_decode_cb_func)(void *_ctx,OpusMSDecoder *_decoder,void *_pcm,\n const ogg_packet *_op,int _nsamples,int _nchannels,int _format,int _li);\n\n/**Sets the packet decode callback function.\n   If set, this is called once for each packet that needs to be decoded.\n   This can be used by advanced applications to do additional processing on the\n    compressed or uncompressed data.\n   For example, an application might save the final entropy coder state for\n    debugging and testing purposes, or it might apply additional filters\n    before the downmixing, dithering, or soft-clipping performed by\n    <tt>libopusfile</tt>, so long as these filters do not introduce any\n    latency.\n\n   A call to this function is no guarantee that the audio will eventually be\n    delivered to the application.\n   <tt>libopusfile</tt> may discard some or all of the decoded audio data\n    (i.e., at the beginning or end of a link, or after a seek), however the\n    callback is still required to provide all of it.\n   \\param _of        The \\c OggOpusFile on which to set the decode callback.\n   \\param _decode_cb The callback function to call.\n                     This may be <code>NULL</code> to disable calling the\n                      callback.\n   \\param _ctx       The application-provided context pointer to pass to the\n                      callback on each call.*/\nvoid op_set_decode_callback(OggOpusFile *_of,\n op_decode_cb_func _decode_cb,void *_ctx) OP_ARG_NONNULL(1);\n\n/**Gain offset type that indicates that the provided offset is relative to the\n    header gain.\n   This is the default.*/\n#define OP_HEADER_GAIN   (0)\n\n/**Gain offset type that indicates that the provided offset is relative to the\n    R128_ALBUM_GAIN value (if any), in addition to the header gain.*/\n#define OP_ALBUM_GAIN    (3007)\n\n/**Gain offset type that indicates that the provided offset is relative to the\n    R128_TRACK_GAIN value (if any), in addition to the header gain.*/\n#define OP_TRACK_GAIN    (3008)\n\n/**Gain offset type that indicates that the provided offset should be used as\n    the gain directly, without applying any the header or track gains.*/\n#define OP_ABSOLUTE_GAIN (3009)\n\n/**Sets the gain to be used for decoded output.\n   By default, the gain in the header is applied with no additional offset.\n   The total gain (including header gain and/or track gain, if applicable, and\n    this offset), will be clamped to [-32768,32767]/256 dB.\n   This is more than enough to saturate or underflow 16-bit PCM.\n   \\note The new gain will not be applied to any already buffered, decoded\n    output.\n   This means you cannot change it sample-by-sample, as at best it will be\n    updated packet-by-packet.\n   It is meant for setting a target volume level, rather than applying smooth\n    fades, etc.\n   \\param _of             The \\c OggOpusFile on which to set the gain offset.\n   \\param _gain_type      One of #OP_HEADER_GAIN, #OP_ALBUM_GAIN,\n                           #OP_TRACK_GAIN, or #OP_ABSOLUTE_GAIN.\n   \\param _gain_offset_q8 The gain offset to apply, in 1/256ths of a dB.\n   \\return 0 on success or a negative value on error.\n   \\retval #OP_EINVAL The \\a _gain_type was unrecognized.*/\nint op_set_gain_offset(OggOpusFile *_of,\n int _gain_type,opus_int32 _gain_offset_q8) OP_ARG_NONNULL(1);\n\n/**Sets whether or not dithering is enabled for 16-bit decoding.\n   By default, when <tt>libopusfile</tt> is compiled to use floating-point\n    internally, calling op_read() or op_read_stereo() will first decode to\n    float, and then convert to fixed-point using noise-shaping dithering.\n   This flag can be used to disable that dithering.\n   When the application uses op_read_float() or op_read_float_stereo(), or when\n    the library has been compiled to decode directly to fixed point, this flag\n    has no effect.\n   \\param _of      The \\c OggOpusFile on which to enable or disable dithering.\n   \\param _enabled A non-zero value to enable dithering, or 0 to disable it.*/\nvoid op_set_dither_enabled(OggOpusFile *_of,int _enabled) OP_ARG_NONNULL(1);\n\n/**Reads more samples from the stream.\n   \\note Although \\a _buf_size must indicate the total number of values that\n    can be stored in \\a _pcm, the return value is the number of samples\n    <em>per channel</em>.\n   This is done because\n   <ol>\n   <li>The channel count cannot be known a priori (reading more samples might\n        advance us into the next link, with a different channel count), so\n        \\a _buf_size cannot also be in units of samples per channel,</li>\n   <li>Returning the samples per channel matches the <code>libopus</code> API\n        as closely as we're able,</li>\n   <li>Returning the total number of values instead of samples per channel\n        would mean the caller would need a division to compute the samples per\n        channel, and might worry about the possibility of getting back samples\n        for some channels and not others, and</li>\n   <li>This approach is relatively fool-proof: if an application passes too\n        small a value to \\a _buf_size, they will simply get fewer samples back,\n        and if they assume the return value is the total number of values, then\n        they will simply read too few (rather than reading too many and going\n        off the end of the buffer).</li>\n   </ol>\n   \\param      _of       The \\c OggOpusFile from which to read.\n   \\param[out] _pcm      A buffer in which to store the output PCM samples, as\n                          signed native-endian 16-bit values at 48&nbsp;kHz\n                          with a nominal range of <code>[-32768,32767)</code>.\n                         Multiple channels are interleaved using the\n                          <a href=\"https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810004.3.9\">Vorbis\n                          channel ordering</a>.\n                         This must have room for at least \\a _buf_size values.\n   \\param      _buf_size The number of values that can be stored in \\a _pcm.\n                         It is recommended that this be large enough for at\n                          least 120 ms of data at 48 kHz per channel (5760\n                          values per channel).\n                         Smaller buffers will simply return less data, possibly\n                          consuming more memory to buffer the data internally.\n                         <tt>libopusfile</tt> may return less data than\n                          requested.\n                         If so, there is no guarantee that the remaining data\n                          in \\a _pcm will be unmodified.\n   \\param[out] _li       The index of the link this data was decoded from.\n                         You may pass <code>NULL</code> if you do not need this\n                          information.\n                         If this function fails (returning a negative value),\n                          this parameter is left unset.\n   \\return The number of samples read per channel on success, or a negative\n            value on failure.\n           The channel count can be retrieved on success by calling\n            <code>op_head(_of,*_li)</code>.\n           The number of samples returned may be 0 if the buffer was too small\n            to store even a single sample for all channels, or if end-of-file\n            was reached.\n           The list of possible failure codes follows.\n           Most of them can only be returned by unseekable, chained streams\n            that encounter a new link.\n   \\retval #OP_HOLE          There was a hole in the data, and some samples\n                              may have been skipped.\n                             Call this function again to continue decoding\n                              past the hole.\n   \\retval #OP_EREAD         An underlying read operation failed.\n                             This may signal a truncation attack from an\n                              <https:> source.\n   \\retval #OP_EFAULT        An internal memory allocation failed.\n   \\retval #OP_EIMPL         An unseekable stream encountered a new link that\n                              used a feature that is not implemented, such as\n                              an unsupported channel family.\n   \\retval #OP_EINVAL        The stream was only partially open.\n   \\retval #OP_ENOTFORMAT    An unseekable stream encountered a new link that\n                              did not have any logical Opus streams in it.\n   \\retval #OP_EBADHEADER    An unseekable stream encountered a new link with a\n                              required header packet that was not properly\n                              formatted, contained illegal values, or was\n                              missing altogether.\n   \\retval #OP_EVERSION      An unseekable stream encountered a new link with\n                              an ID header that contained an unrecognized\n                              version number.\n   \\retval #OP_EBADPACKET    Failed to properly decode the next packet.\n   \\retval #OP_EBADLINK      We failed to find data we had seen before.\n   \\retval #OP_EBADTIMESTAMP An unseekable stream encountered a new link with\n                              a starting timestamp that failed basic validity\n                              checks.*/\nOP_WARN_UNUSED_RESULT int op_read(OggOpusFile *_of,\n opus_int16 *_pcm,int _buf_size,int *_li) OP_ARG_NONNULL(1);\n\n/**Reads more samples from the stream.\n   \\note Although \\a _buf_size must indicate the total number of values that\n    can be stored in \\a _pcm, the return value is the number of samples\n    <em>per channel</em>.\n   <ol>\n   <li>The channel count cannot be known a priori (reading more samples might\n        advance us into the next link, with a different channel count), so\n        \\a _buf_size cannot also be in units of samples per channel,</li>\n   <li>Returning the samples per channel matches the <code>libopus</code> API\n        as closely as we're able,</li>\n   <li>Returning the total number of values instead of samples per channel\n        would mean the caller would need a division to compute the samples per\n        channel, and might worry about the possibility of getting back samples\n        for some channels and not others, and</li>\n   <li>This approach is relatively fool-proof: if an application passes too\n        small a value to \\a _buf_size, they will simply get fewer samples back,\n        and if they assume the return value is the total number of values, then\n        they will simply read too few (rather than reading too many and going\n        off the end of the buffer).</li>\n   </ol>\n   \\param      _of       The \\c OggOpusFile from which to read.\n   \\param[out] _pcm      A buffer in which to store the output PCM samples as\n                          signed floats at 48&nbsp;kHz with a nominal range of\n                          <code>[-1.0,1.0]</code>.\n                         Multiple channels are interleaved using the\n                          <a href=\"https://www.xiph.org/vorbis/doc/Vorbis_I_spec.html#x1-810004.3.9\">Vorbis\n                          channel ordering</a>.\n                         This must have room for at least \\a _buf_size floats.\n   \\param      _buf_size The number of floats that can be stored in \\a _pcm.\n                         It is recommended that this be large enough for at\n                          least 120 ms of data at 48 kHz per channel (5760\n                          samples per channel).\n                         Smaller buffers will simply return less data, possibly\n                          consuming more memory to buffer the data internally.\n                         If less than \\a _buf_size values are returned,\n                          <tt>libopusfile</tt> makes no guarantee that the\n                          remaining data in \\a _pcm will be unmodified.\n   \\param[out] _li       The index of the link this data was decoded from.\n                         You may pass <code>NULL</code> if you do not need this\n                          information.\n                         If this function fails (returning a negative value),\n                          this parameter is left unset.\n   \\return The number of samples read per channel on success, or a negative\n            value on failure.\n           The channel count can be retrieved on success by calling\n            <code>op_head(_of,*_li)</code>.\n           The number of samples returned may be 0 if the buffer was too small\n            to store even a single sample for all channels, or if end-of-file\n            was reached.\n           The list of possible failure codes follows.\n           Most of them can only be returned by unseekable, chained streams\n            that encounter a new link.\n   \\retval #OP_HOLE          There was a hole in the data, and some samples\n                              may have been skipped.\n                             Call this function again to continue decoding\n                              past the hole.\n   \\retval #OP_EREAD         An underlying read operation failed.\n                             This may signal a truncation attack from an\n                              <https:> source.\n   \\retval #OP_EFAULT        An internal memory allocation failed.\n   \\retval #OP_EIMPL         An unseekable stream encountered a new link that\n                              used a feature that is not implemented, such as\n                              an unsupported channel family.\n   \\retval #OP_EINVAL        The stream was only partially open.\n   \\retval #OP_ENOTFORMAT    An unseekable stream encountered a new link that\n                              did not have any logical Opus streams in it.\n   \\retval #OP_EBADHEADER    An unseekable stream encountered a new link with a\n                              required header packet that was not properly\n                              formatted, contained illegal values, or was\n                              missing altogether.\n   \\retval #OP_EVERSION      An unseekable stream encountered a new link with\n                              an ID header that contained an unrecognized\n                              version number.\n   \\retval #OP_EBADPACKET    Failed to properly decode the next packet.\n   \\retval #OP_EBADLINK      We failed to find data we had seen before.\n   \\retval #OP_EBADTIMESTAMP An unseekable stream encountered a new link with\n                              a starting timestamp that failed basic validity\n                              checks.*/\nOP_WARN_UNUSED_RESULT int op_read_float(OggOpusFile *_of,\n float *_pcm,int _buf_size,int *_li) OP_ARG_NONNULL(1);\n\n/**Reads more samples from the stream and downmixes to stereo, if necessary.\n   This function is intended for simple players that want a uniform output\n    format, even if the channel count changes between links in a chained\n    stream.\n   \\note \\a _buf_size indicates the total number of values that can be stored\n    in \\a _pcm, while the return value is the number of samples <em>per\n    channel</em>, even though the channel count is known, for consistency with\n    op_read().\n   \\param      _of       The \\c OggOpusFile from which to read.\n   \\param[out] _pcm      A buffer in which to store the output PCM samples, as\n                          signed native-endian 16-bit values at 48&nbsp;kHz\n                          with a nominal range of <code>[-32768,32767)</code>.\n                         The left and right channels are interleaved in the\n                          buffer.\n                         This must have room for at least \\a _buf_size values.\n   \\param      _buf_size The number of values that can be stored in \\a _pcm.\n                         It is recommended that this be large enough for at\n                          least 120 ms of data at 48 kHz per channel (11520\n                          values total).\n                         Smaller buffers will simply return less data, possibly\n                          consuming more memory to buffer the data internally.\n                         If less than \\a _buf_size values are returned,\n                          <tt>libopusfile</tt> makes no guarantee that the\n                          remaining data in \\a _pcm will be unmodified.\n   \\return The number of samples read per channel on success, or a negative\n            value on failure.\n           The number of samples returned may be 0 if the buffer was too small\n            to store even a single sample for both channels, or if end-of-file\n            was reached.\n           The list of possible failure codes follows.\n           Most of them can only be returned by unseekable, chained streams\n            that encounter a new link.\n   \\retval #OP_HOLE          There was a hole in the data, and some samples\n                              may have been skipped.\n                             Call this function again to continue decoding\n                              past the hole.\n   \\retval #OP_EREAD         An underlying read operation failed.\n                             This may signal a truncation attack from an\n                              <https:> source.\n   \\retval #OP_EFAULT        An internal memory allocation failed.\n   \\retval #OP_EIMPL         An unseekable stream encountered a new link that\n                              used a feature that is not implemented, such as\n                              an unsupported channel family.\n   \\retval #OP_EINVAL        The stream was only partially open.\n   \\retval #OP_ENOTFORMAT    An unseekable stream encountered a new link that\n                              did not have any logical Opus streams in it.\n   \\retval #OP_EBADHEADER    An unseekable stream encountered a new link with a\n                              required header packet that was not properly\n                              formatted, contained illegal values, or was\n                              missing altogether.\n   \\retval #OP_EVERSION      An unseekable stream encountered a new link with\n                              an ID header that contained an unrecognized\n                              version number.\n   \\retval #OP_EBADPACKET    Failed to properly decode the next packet.\n   \\retval #OP_EBADLINK      We failed to find data we had seen before.\n   \\retval #OP_EBADTIMESTAMP An unseekable stream encountered a new link with\n                              a starting timestamp that failed basic validity\n                              checks.*/\nOP_WARN_UNUSED_RESULT int op_read_stereo(OggOpusFile *_of,\n opus_int16 *_pcm,int _buf_size) OP_ARG_NONNULL(1);\n\n/**Reads more samples from the stream and downmixes to stereo, if necessary.\n   This function is intended for simple players that want a uniform output\n    format, even if the channel count changes between links in a chained\n    stream.\n   \\note \\a _buf_size indicates the total number of values that can be stored\n    in \\a _pcm, while the return value is the number of samples <em>per\n    channel</em>, even though the channel count is known, for consistency with\n    op_read_float().\n   \\param      _of       The \\c OggOpusFile from which to read.\n   \\param[out] _pcm      A buffer in which to store the output PCM samples, as\n                          signed floats at 48&nbsp;kHz with a nominal range of\n                          <code>[-1.0,1.0]</code>.\n                         The left and right channels are interleaved in the\n                          buffer.\n                         This must have room for at least \\a _buf_size values.\n   \\param      _buf_size The number of values that can be stored in \\a _pcm.\n                         It is recommended that this be large enough for at\n                          least 120 ms of data at 48 kHz per channel (11520\n                          values total).\n                         Smaller buffers will simply return less data, possibly\n                          consuming more memory to buffer the data internally.\n                         If less than \\a _buf_size values are returned,\n                          <tt>libopusfile</tt> makes no guarantee that the\n                          remaining data in \\a _pcm will be unmodified.\n   \\return The number of samples read per channel on success, or a negative\n            value on failure.\n           The number of samples returned may be 0 if the buffer was too small\n            to store even a single sample for both channels, or if end-of-file\n            was reached.\n           The list of possible failure codes follows.\n           Most of them can only be returned by unseekable, chained streams\n            that encounter a new link.\n   \\retval #OP_HOLE          There was a hole in the data, and some samples\n                              may have been skipped.\n                             Call this function again to continue decoding\n                              past the hole.\n   \\retval #OP_EREAD         An underlying read operation failed.\n                             This may signal a truncation attack from an\n                              <https:> source.\n   \\retval #OP_EFAULT        An internal memory allocation failed.\n   \\retval #OP_EIMPL         An unseekable stream encountered a new link that\n                              used a feature that is not implemented, such as\n                              an unsupported channel family.\n   \\retval #OP_EINVAL        The stream was only partially open.\n   \\retval #OP_ENOTFORMAT    An unseekable stream encountered a new link that\n                              that did not have any logical Opus streams in it.\n   \\retval #OP_EBADHEADER    An unseekable stream encountered a new link with a\n                              required header packet that was not properly\n                              formatted, contained illegal values, or was\n                              missing altogether.\n   \\retval #OP_EVERSION      An unseekable stream encountered a new link with\n                              an ID header that contained an unrecognized\n                              version number.\n   \\retval #OP_EBADPACKET    Failed to properly decode the next packet.\n   \\retval #OP_EBADLINK      We failed to find data we had seen before.\n   \\retval #OP_EBADTIMESTAMP An unseekable stream encountered a new link with\n                              a starting timestamp that failed basic validity\n                              checks.*/\nOP_WARN_UNUSED_RESULT int op_read_float_stereo(OggOpusFile *_of,\n float *_pcm,int _buf_size) OP_ARG_NONNULL(1);\n\n/*@}*/\n/*@}*/\n\n# if OP_GNUC_PREREQ(4,0)\n#  pragma GCC visibility pop\n# endif\n\n# if defined(__cplusplus)\n}\n# endif\n\n#endif\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include/vorbis/codec.h",
    "content": "/********************************************************************\n *                                                                  *\n * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *\n * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *\n * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *\n * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *\n *                                                                  *\n * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001             *\n * by the Xiph.Org Foundation https://xiph.org/                     *\n\n ********************************************************************\n\n function: libvorbis codec headers\n\n ********************************************************************/\n\n#ifndef _vorbis_codec_h_\n#define _vorbis_codec_h_\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif /* __cplusplus */\n\n#include <ogg/ogg.h>\n\ntypedef struct vorbis_info{\n  int version;\n  int channels;\n  long rate;\n\n  /* The below bitrate declarations are *hints*.\n     Combinations of the three values carry the following implications:\n\n     all three set to the same value:\n       implies a fixed rate bitstream\n     only nominal set:\n       implies a VBR stream that averages the nominal bitrate.  No hard\n       upper/lower limit\n     upper and or lower set:\n       implies a VBR bitstream that obeys the bitrate limits. nominal\n       may also be set to give a nominal rate.\n     none set:\n       the coder does not care to speculate.\n  */\n\n  long bitrate_upper;\n  long bitrate_nominal;\n  long bitrate_lower;\n  long bitrate_window;\n\n  void *codec_setup;\n} vorbis_info;\n\n/* vorbis_dsp_state buffers the current vorbis audio\n   analysis/synthesis state.  The DSP state belongs to a specific\n   logical bitstream ****************************************************/\ntypedef struct vorbis_dsp_state{\n  int analysisp;\n  vorbis_info *vi;\n\n  float **pcm;\n  float **pcmret;\n  int      pcm_storage;\n  int      pcm_current;\n  int      pcm_returned;\n\n  int  preextrapolate;\n  int  eofflag;\n\n  long lW;\n  long W;\n  long nW;\n  long centerW;\n\n  ogg_int64_t granulepos;\n  ogg_int64_t sequence;\n\n  ogg_int64_t glue_bits;\n  ogg_int64_t time_bits;\n  ogg_int64_t floor_bits;\n  ogg_int64_t res_bits;\n\n  void       *backend_state;\n} vorbis_dsp_state;\n\ntypedef struct vorbis_block{\n  /* necessary stream state for linking to the framing abstraction */\n  float  **pcm;       /* this is a pointer into local storage */\n  oggpack_buffer opb;\n\n  long  lW;\n  long  W;\n  long  nW;\n  int   pcmend;\n  int   mode;\n\n  int         eofflag;\n  ogg_int64_t granulepos;\n  ogg_int64_t sequence;\n  vorbis_dsp_state *vd; /* For read-only access of configuration */\n\n  /* local storage to avoid remallocing; it's up to the mapping to\n     structure it */\n  void               *localstore;\n  long                localtop;\n  long                localalloc;\n  long                totaluse;\n  struct alloc_chain *reap;\n\n  /* bitmetrics for the frame */\n  long glue_bits;\n  long time_bits;\n  long floor_bits;\n  long res_bits;\n\n  void *internal;\n\n} vorbis_block;\n\n/* vorbis_block is a single block of data to be processed as part of\nthe analysis/synthesis stream; it belongs to a specific logical\nbitstream, but is independent from other vorbis_blocks belonging to\nthat logical bitstream. *************************************************/\n\nstruct alloc_chain{\n  void *ptr;\n  struct alloc_chain *next;\n};\n\n/* vorbis_info contains all the setup information specific to the\n   specific compression/decompression mode in progress (eg,\n   psychoacoustic settings, channel setup, options, codebook\n   etc). vorbis_info and substructures are in backends.h.\n*********************************************************************/\n\n/* the comments are not part of vorbis_info so that vorbis_info can be\n   static storage */\ntypedef struct vorbis_comment{\n  /* unlimited user comment fields.  libvorbis writes 'libvorbis'\n     whatever vendor is set to in encode */\n  char **user_comments;\n  int   *comment_lengths;\n  int    comments;\n  char  *vendor;\n\n} vorbis_comment;\n\n\n/* libvorbis encodes in two abstraction layers; first we perform DSP\n   and produce a packet (see docs/analysis.txt).  The packet is then\n   coded into a framed OggSquish bitstream by the second layer (see\n   docs/framing.txt).  Decode is the reverse process; we sync/frame\n   the bitstream and extract individual packets, then decode the\n   packet back into PCM audio.\n\n   The extra framing/packetizing is used in streaming formats, such as\n   files.  Over the net (such as with UDP), the framing and\n   packetization aren't necessary as they're provided by the transport\n   and the streaming layer is not used */\n\n/* Vorbis PRIMITIVES: general ***************************************/\n\nextern void     vorbis_info_init(vorbis_info *vi);\nextern void     vorbis_info_clear(vorbis_info *vi);\nextern int      vorbis_info_blocksize(vorbis_info *vi,int zo);\nextern void     vorbis_comment_init(vorbis_comment *vc);\nextern void     vorbis_comment_add(vorbis_comment *vc, const char *comment);\nextern void     vorbis_comment_add_tag(vorbis_comment *vc,\n                                       const char *tag, const char *contents);\nextern char    *vorbis_comment_query(vorbis_comment *vc, const char *tag, int count);\nextern int      vorbis_comment_query_count(vorbis_comment *vc, const char *tag);\nextern void     vorbis_comment_clear(vorbis_comment *vc);\n\nextern int      vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb);\nextern int      vorbis_block_clear(vorbis_block *vb);\nextern void     vorbis_dsp_clear(vorbis_dsp_state *v);\nextern double   vorbis_granule_time(vorbis_dsp_state *v,\n                                    ogg_int64_t granulepos);\n\nextern const char *vorbis_version_string(void);\n\n/* Vorbis PRIMITIVES: analysis/DSP layer ****************************/\n\nextern int      vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi);\nextern int      vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op);\nextern int      vorbis_analysis_headerout(vorbis_dsp_state *v,\n                                          vorbis_comment *vc,\n                                          ogg_packet *op,\n                                          ogg_packet *op_comm,\n                                          ogg_packet *op_code);\nextern float  **vorbis_analysis_buffer(vorbis_dsp_state *v,int vals);\nextern int      vorbis_analysis_wrote(vorbis_dsp_state *v,int vals);\nextern int      vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb);\nextern int      vorbis_analysis(vorbis_block *vb,ogg_packet *op);\n\nextern int      vorbis_bitrate_addblock(vorbis_block *vb);\nextern int      vorbis_bitrate_flushpacket(vorbis_dsp_state *vd,\n                                           ogg_packet *op);\n\n/* Vorbis PRIMITIVES: synthesis layer *******************************/\nextern int      vorbis_synthesis_idheader(ogg_packet *op);\nextern int      vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc,\n                                          ogg_packet *op);\n\nextern int      vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi);\nextern int      vorbis_synthesis_restart(vorbis_dsp_state *v);\nextern int      vorbis_synthesis(vorbis_block *vb,ogg_packet *op);\nextern int      vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op);\nextern int      vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb);\nextern int      vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm);\nextern int      vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm);\nextern int      vorbis_synthesis_read(vorbis_dsp_state *v,int samples);\nextern long     vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op);\n\nextern int      vorbis_synthesis_halfrate(vorbis_info *v,int flag);\nextern int      vorbis_synthesis_halfrate_p(vorbis_info *v);\n\n/* Vorbis ERRORS and return codes ***********************************/\n\n#define OV_FALSE      -1\n#define OV_EOF        -2\n#define OV_HOLE       -3\n\n#define OV_EREAD      -128\n#define OV_EFAULT     -129\n#define OV_EIMPL      -130\n#define OV_EINVAL     -131\n#define OV_ENOTVORBIS -132\n#define OV_EBADHEADER -133\n#define OV_EVERSION   -134\n#define OV_ENOTAUDIO  -135\n#define OV_EBADPACKET -136\n#define OV_EBADLINK   -137\n#define OV_ENOSEEK    -138\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n#endif\n\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include/vorbis/vorbisenc.h",
    "content": "/********************************************************************\n *                                                                  *\n * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *\n * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *\n * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *\n * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *\n *                                                                  *\n * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001             *\n * by the Xiph.Org Foundation https://xiph.org/                     *\n *                                                                  *\n ********************************************************************\n\n function: vorbis encode-engine setup\n\n ********************************************************************/\n\n/** \\file\n * Libvorbisenc is a convenient API for setting up an encoding\n * environment using libvorbis. Libvorbisenc encapsulates the\n * actions needed to set up the encoder properly.\n */\n\n#ifndef _OV_ENC_H_\n#define _OV_ENC_H_\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif /* __cplusplus */\n\n#include \"codec.h\"\n\n/**\n * This is the primary function within libvorbisenc for setting up managed\n * bitrate modes.\n *\n * Before this function is called, the \\ref vorbis_info\n * struct should be initialized by using vorbis_info_init() from the libvorbis\n * API.  After encoding, vorbis_info_clear() should be called.\n *\n * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set\n * constraints for the encoded file.  This function uses these settings to\n * select the appropriate encoding mode and set it up.\n *\n * \\param vi               Pointer to an initialized \\ref vorbis_info struct.\n * \\param channels         The number of channels to be encoded.\n * \\param rate             The sampling rate of the source audio.\n * \\param max_bitrate      Desired maximum bitrate (limit). -1 indicates unset.\n * \\param nominal_bitrate  Desired average, or central, bitrate. -1 indicates unset.\n * \\param min_bitrate      Desired minimum bitrate. -1 indicates unset.\n *\n * \\return Zero for success, and negative values for failure.\n *\n * \\retval 0          Success.\n * \\retval OV_EFAULT  Internal logic fault; indicates a bug or heap/stack corruption.\n * \\retval OV_EINVAL  Invalid setup request, eg, out of range argument.\n * \\retval OV_EIMPL   Unimplemented mode; unable to comply with bitrate request.\n */\nextern int vorbis_encode_init(vorbis_info *vi,\n                              long channels,\n                              long rate,\n\n                              long max_bitrate,\n                              long nominal_bitrate,\n                              long min_bitrate);\n\n/**\n * This function performs step-one of a three-step bitrate-managed encode\n * setup.  It functions similarly to the one-step setup performed by \\ref\n * vorbis_encode_init but allows an application to make further encode setup\n * tweaks using \\ref vorbis_encode_ctl before finally calling \\ref\n * vorbis_encode_setup_init to complete the setup process.\n *\n * Before this function is called, the \\ref vorbis_info struct should be\n * initialized by using vorbis_info_init() from the libvorbis API.  After\n * encoding, vorbis_info_clear() should be called.\n *\n * The max_bitrate, nominal_bitrate, and min_bitrate settings are used to set\n * constraints for the encoded file.  This function uses these settings to\n * select the appropriate encoding mode and set it up.\n *\n * \\param vi                Pointer to an initialized vorbis_info struct.\n * \\param channels          The number of channels to be encoded.\n * \\param rate              The sampling rate of the source audio.\n * \\param max_bitrate       Desired maximum bitrate (limit). -1 indicates unset.\n * \\param nominal_bitrate   Desired average, or central, bitrate. -1 indicates unset.\n * \\param min_bitrate       Desired minimum bitrate. -1 indicates unset.\n *\n * \\return Zero for success, and negative for failure.\n *\n * \\retval 0           Success\n * \\retval OV_EFAULT   Internal logic fault; indicates a bug or heap/stack corruption.\n * \\retval OV_EINVAL   Invalid setup request, eg, out of range argument.\n * \\retval OV_EIMPL    Unimplemented mode; unable to comply with bitrate request.\n */\nextern int vorbis_encode_setup_managed(vorbis_info *vi,\n                                       long channels,\n                                       long rate,\n\n                                       long max_bitrate,\n                                       long nominal_bitrate,\n                                       long min_bitrate);\n\n/**\n * This function performs step-one of a three-step variable bitrate\n * (quality-based) encode setup.  It functions similarly to the one-step setup\n * performed by \\ref vorbis_encode_init_vbr() but allows an application to\n * make further encode setup tweaks using \\ref vorbis_encode_ctl() before\n * finally calling \\ref vorbis_encode_setup_init to complete the setup\n * process.\n *\n * Before this function is called, the \\ref vorbis_info struct should be\n * initialized by using \\ref vorbis_info_init() from the libvorbis API.  After\n * encoding, vorbis_info_clear() should be called.\n *\n * \\param vi        Pointer to an initialized vorbis_info struct.\n * \\param channels  The number of channels to be encoded.\n * \\param rate      The sampling rate of the source audio.\n * \\param quality   Desired quality level, currently from -0.1 to 1.0 (lo to hi).\n *\n * \\return Zero for success, and negative values for failure.\n *\n * \\retval  0          Success\n * \\retval  OV_EFAULT  Internal logic fault; indicates a bug or heap/stack corruption.\n * \\retval  OV_EINVAL  Invalid setup request, eg, out of range argument.\n * \\retval  OV_EIMPL   Unimplemented mode; unable to comply with quality level request.\n */\nextern int vorbis_encode_setup_vbr(vorbis_info *vi,\n                                  long channels,\n                                  long rate,\n\n                                  float quality\n                                  );\n\n/**\n * This is the primary function within libvorbisenc for setting up variable\n * bitrate (\"quality\" based) modes.\n *\n *\n * Before this function is called, the vorbis_info struct should be\n * initialized by using vorbis_info_init() from the libvorbis API. After\n * encoding, vorbis_info_clear() should be called.\n *\n * \\param vi           Pointer to an initialized vorbis_info struct.\n * \\param channels     The number of channels to be encoded.\n * \\param rate         The sampling rate of the source audio.\n * \\param base_quality Desired quality level, currently from -0.1 to 1.0 (lo to hi).\n *\n *\n * \\return Zero for success, or a negative number for failure.\n *\n * \\retval 0           Success\n * \\retval OV_EFAULT   Internal logic fault; indicates a bug or heap/stack corruption.\n * \\retval OV_EINVAL   Invalid setup request, eg, out of range argument.\n * \\retval OV_EIMPL    Unimplemented mode; unable to comply with quality level request.\n */\nextern int vorbis_encode_init_vbr(vorbis_info *vi,\n                                  long channels,\n                                  long rate,\n\n                                  float base_quality\n                                  );\n\n/**\n * This function performs the last stage of three-step encoding setup, as\n * described in the API overview under managed bitrate modes.\n *\n * Before this function is called, the \\ref vorbis_info struct should be\n * initialized by using vorbis_info_init() from the libvorbis API, one of\n * \\ref vorbis_encode_setup_managed() or \\ref vorbis_encode_setup_vbr() called to\n * initialize the high-level encoding setup, and \\ref vorbis_encode_ctl()\n * called if necessary to make encoding setup changes.\n * vorbis_encode_setup_init() finalizes the highlevel encoding structure into\n * a complete encoding setup after which the application may make no further\n * setup changes.\n *\n * After encoding, vorbis_info_clear() should be called.\n *\n * \\param vi Pointer to an initialized \\ref vorbis_info struct.\n *\n * \\return Zero for success, and negative values for failure.\n *\n * \\retval  0           Success.\n * \\retval  OV_EFAULT  Internal logic fault; indicates a bug or heap/stack corruption.\n *\n * \\retval OV_EINVAL   Attempt to use vorbis_encode_setup_init() without first\n * calling one of vorbis_encode_setup_managed() or vorbis_encode_setup_vbr() to\n * initialize the high-level encoding setup\n *\n */\nextern int vorbis_encode_setup_init(vorbis_info *vi);\n\n/**\n * This function implements a generic interface to miscellaneous encoder\n * settings similar to the classic UNIX 'ioctl()' system call.  Applications\n * may use vorbis_encode_ctl() to query or set bitrate management or quality\n * mode details by using one of several \\e request arguments detailed below.\n * vorbis_encode_ctl() must be called after one of\n * vorbis_encode_setup_managed() or vorbis_encode_setup_vbr().  When used\n * to modify settings, \\ref vorbis_encode_ctl() must be called before \\ref\n * vorbis_encode_setup_init().\n *\n * \\param vi      Pointer to an initialized vorbis_info struct.\n *\n * \\param number Specifies the desired action; See \\ref encctlcodes \"the list\n * of available requests\".\n *\n * \\param arg void * pointing to a data structure matching the request\n * argument.\n *\n * \\retval 0          Success. Any further return information (such as the result of a\n * query) is placed into the storage pointed to by *arg.\n *\n * \\retval OV_EINVAL  Invalid argument, or an attempt to modify a setting after\n * calling vorbis_encode_setup_init().\n *\n * \\retval OV_EIMPL   Unimplemented or unknown request\n */\nextern int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg);\n\n/**\n * \\deprecated This is a deprecated interface. Please use vorbis_encode_ctl()\n * with the \\ref ovectl_ratemanage2_arg struct and \\ref\n * OV_ECTL_RATEMANAGE2_GET and \\ref OV_ECTL_RATEMANAGE2_SET calls in new code.\n *\n * The \\ref ovectl_ratemanage_arg structure is used with vorbis_encode_ctl()\n * and the \\ref OV_ECTL_RATEMANAGE_GET, \\ref OV_ECTL_RATEMANAGE_SET, \\ref\n * OV_ECTL_RATEMANAGE_AVG, \\ref OV_ECTL_RATEMANAGE_HARD calls in order to\n * query and modify specifics of the encoder's bitrate management\n * configuration.\n*/\nstruct ovectl_ratemanage_arg {\n  int    management_active; /**< nonzero if bitrate management is active*/\n/** hard lower limit (in kilobits per second) below which the stream bitrate\n    will never be allowed for any given bitrate_hard_window seconds of time.*/\n  long   bitrate_hard_min;\n/** hard upper limit (in kilobits per second) above which the stream bitrate\n    will never be allowed for any given bitrate_hard_window seconds of time.*/\n  long   bitrate_hard_max;\n/** the window period (in seconds) used to regulate the hard bitrate minimum\n    and maximum*/\n  double bitrate_hard_window;\n/** soft lower limit (in kilobits per second) below which the average bitrate\n    tracker will start nudging the bitrate higher.*/\n  long   bitrate_av_lo;\n/** soft upper limit (in kilobits per second) above which the average bitrate\n    tracker will start nudging the bitrate lower.*/\n  long   bitrate_av_hi;\n/** the window period (in seconds) used to regulate the average bitrate\n    minimum and maximum.*/\n  double bitrate_av_window;\n/** Regulates the relative centering of the average and hard windows; in\n    libvorbis 1.0 and 1.0.1, the hard window regulation overlapped but\n    followed the average window regulation. In libvorbis 1.1 a bit-reservoir\n    interface replaces the old windowing interface; the older windowing\n    interface is simulated and this field has no effect.*/\n  double bitrate_av_window_center;\n};\n\n/**\n * \\name struct ovectl_ratemanage2_arg\n *\n * The ovectl_ratemanage2_arg structure is used with vorbis_encode_ctl() and\n * the OV_ECTL_RATEMANAGE2_GET and OV_ECTL_RATEMANAGE2_SET calls in order to\n * query and modify specifics of the encoder's bitrate management\n * configuration.\n *\n*/\nstruct ovectl_ratemanage2_arg {\n  int    management_active; /**< nonzero if bitrate management is active */\n/** Lower allowed bitrate limit in kilobits per second */\n  long   bitrate_limit_min_kbps;\n/** Upper allowed bitrate limit in kilobits per second */\n  long   bitrate_limit_max_kbps;\n  long   bitrate_limit_reservoir_bits; /**<Size of the bitrate reservoir in bits */\n/** Regulates the bitrate reservoir's preferred fill level in a range from 0.0\n * to 1.0; 0.0 tries to bank bits to buffer against future bitrate spikes, 1.0\n * buffers against future sudden drops in instantaneous bitrate. Default is\n * 0.1\n */\n  double bitrate_limit_reservoir_bias;\n/** Average bitrate setting in kilobits per second */\n  long   bitrate_average_kbps;\n/** Slew rate limit setting for average bitrate adjustment; sets the minimum\n *  time in seconds the bitrate tracker may swing from one extreme to the\n *  other when boosting or damping average bitrate.\n */\n  double bitrate_average_damping;\n};\n\n\n/**\n * \\name vorbis_encode_ctl() codes\n *\n * \\anchor encctlcodes\n *\n * These values are passed as the \\c number parameter of vorbis_encode_ctl().\n * The type of the referent of that function's \\c arg pointer depends on these\n * codes.\n */\n/*@{*/\n\n/**\n * Query the current encoder bitrate management setting.\n *\n *Argument: <tt>struct ovectl_ratemanage2_arg *</tt>\n *\n * Used to query the current encoder bitrate management setting. Also used to\n * initialize fields of an ovectl_ratemanage2_arg structure for use with\n * \\ref OV_ECTL_RATEMANAGE2_SET.\n */\n#define OV_ECTL_RATEMANAGE2_GET      0x14\n\n/**\n * Set the current encoder bitrate management settings.\n *\n * Argument: <tt>struct ovectl_ratemanage2_arg *</tt>\n *\n * Used to set the current encoder bitrate management settings to the values\n * listed in the ovectl_ratemanage2_arg. Passing a NULL pointer will disable\n * bitrate management.\n*/\n#define OV_ECTL_RATEMANAGE2_SET      0x15\n\n/**\n * Returns the current encoder hard-lowpass setting (kHz) in the double\n * pointed to by arg.\n *\n * Argument: <tt>double *</tt>\n*/\n#define OV_ECTL_LOWPASS_GET          0x20\n\n/**\n *  Sets the encoder hard-lowpass to the value (kHz) pointed to by arg. Valid\n *  lowpass settings range from 2 to 99.\n *\n * Argument: <tt>double *</tt>\n*/\n#define OV_ECTL_LOWPASS_SET          0x21\n\n/**\n *  Returns the current encoder impulse block setting in the double pointed\n *  to by arg.\n *\n * Argument: <tt>double *</tt>\n*/\n#define OV_ECTL_IBLOCK_GET           0x30\n\n/**\n *  Sets the impulse block bias to the the value pointed to by arg.\n *\n * Argument: <tt>double *</tt>\n *\n *  Valid range is -15.0 to 0.0 [default]. A negative impulse block bias will\n *  direct to encoder to use more bits when incoding short blocks that contain\n *  strong impulses, thus improving the accuracy of impulse encoding.\n */\n#define OV_ECTL_IBLOCK_SET           0x31\n\n/**\n *  Returns the current encoder coupling setting in the int pointed\n *  to by arg.\n *\n * Argument: <tt>int *</tt>\n*/\n#define OV_ECTL_COUPLING_GET         0x40\n\n/**\n *  Enables/disables channel coupling in multichannel encoding according to arg.\n *\n * Argument: <tt>int *</tt>\n *\n *  Zero disables channel coupling for multichannel inputs, nonzer enables\n *  channel coupling.  Setting has no effect on monophonic encoding or\n *  multichannel counts that do not offer coupling.  At present, coupling is\n *  available for stereo and 5.1 encoding.\n */\n#define OV_ECTL_COUPLING_SET         0x41\n\n  /* deprecated rate management supported only for compatibility */\n\n/**\n * Old interface to querying bitrate management settings.\n *\n * Deprecated after move to bit-reservoir style management in 1.1 rendered\n * this interface partially obsolete.\n\n * \\deprecated Please use \\ref OV_ECTL_RATEMANAGE2_GET instead.\n *\n * Argument: <tt>struct ovectl_ratemanage_arg *</tt>\n */\n#define OV_ECTL_RATEMANAGE_GET       0x10\n/**\n * Old interface to modifying bitrate management settings.\n *\n *  deprecated after move to bit-reservoir style management in 1.1 rendered\n *  this interface partially obsolete.\n *\n * \\deprecated Please use \\ref OV_ECTL_RATEMANAGE2_SET instead.\n *\n * Argument: <tt>struct ovectl_ratemanage_arg *</tt>\n */\n#define OV_ECTL_RATEMANAGE_SET       0x11\n/**\n * Old interface to setting average-bitrate encoding mode.\n *\n * Deprecated after move to bit-reservoir style management in 1.1 rendered\n * this interface partially obsolete.\n *\n *  \\deprecated Please use \\ref OV_ECTL_RATEMANAGE2_SET instead.\n *\n * Argument: <tt>struct ovectl_ratemanage_arg *</tt>\n */\n#define OV_ECTL_RATEMANAGE_AVG       0x12\n/**\n * Old interface to setting bounded-bitrate encoding modes.\n *\n * deprecated after move to bit-reservoir style management in 1.1 rendered\n * this interface partially obsolete.\n *\n *  \\deprecated Please use \\ref OV_ECTL_RATEMANAGE2_SET instead.\n *\n * Argument: <tt>struct ovectl_ratemanage_arg *</tt>\n */\n#define OV_ECTL_RATEMANAGE_HARD      0x13\n\n/*@}*/\n\n\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n#endif\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include/vorbis/vorbisfile.h",
    "content": "/********************************************************************\n *                                                                  *\n * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *\n * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *\n * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *\n * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *\n *                                                                  *\n * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2007             *\n * by the Xiph.Org Foundation https://xiph.org/                     *\n *                                                                  *\n ********************************************************************\n\n function: stdio-based convenience library for opening/seeking/decoding\n\n ********************************************************************/\n\n#ifndef _OV_FILE_H_\n#define _OV_FILE_H_\n\n#ifdef __cplusplus\nextern \"C\"\n{\n#endif /* __cplusplus */\n\n#include <stdio.h>\n#include \"codec.h\"\n\n/* The function prototypes for the callbacks are basically the same as for\n * the stdio functions fread, fseek, fclose, ftell.\n * The one difference is that the FILE * arguments have been replaced with\n * a void * - this is to be used as a pointer to whatever internal data these\n * functions might need. In the stdio case, it's just a FILE * cast to a void *\n *\n * If you use other functions, check the docs for these functions and return\n * the right values. For seek_func(), you *MUST* return -1 if the stream is\n * unseekable\n */\ntypedef struct {\n  size_t (*read_func)  (void *ptr, size_t size, size_t nmemb, void *datasource);\n  int    (*seek_func)  (void *datasource, ogg_int64_t offset, int whence);\n  int    (*close_func) (void *datasource);\n  long   (*tell_func)  (void *datasource);\n} ov_callbacks;\n\n#ifndef OV_EXCLUDE_STATIC_CALLBACKS\n\n/* a few sets of convenient callbacks, especially for use under\n * Windows where ov_open_callbacks() should always be used instead of\n * ov_open() to avoid problems with incompatible crt.o version linking\n * issues. */\n\nstatic int _ov_header_fseek_wrap(FILE *f,ogg_int64_t off,int whence){\n  if(f==NULL)return(-1);\n\n#ifdef __MINGW32__\n  return fseeko64(f,off,whence);\n#elif defined (_WIN32)\n  return _fseeki64(f,off,whence);\n#else\n  return fseek(f,off,whence);\n#endif\n}\n\n/* These structs below (OV_CALLBACKS_DEFAULT etc) are defined here as\n * static data. That means that every file which includes this header\n * will get its own copy of these structs whether it uses them or\n * not unless it #defines OV_EXCLUDE_STATIC_CALLBACKS.\n * These static symbols are essential on platforms such as Windows on\n * which several different versions of stdio support may be linked to\n * by different DLLs, and we need to be certain we know which one\n * we're using (the same one as the main application).\n */\n\nstatic ov_callbacks OV_CALLBACKS_DEFAULT = {\n  (size_t (*)(void *, size_t, size_t, void *))  fread,\n  (int (*)(void *, ogg_int64_t, int))           _ov_header_fseek_wrap,\n  (int (*)(void *))                             fclose,\n  (long (*)(void *))                            ftell\n};\n\nstatic ov_callbacks OV_CALLBACKS_NOCLOSE = {\n  (size_t (*)(void *, size_t, size_t, void *))  fread,\n  (int (*)(void *, ogg_int64_t, int))           _ov_header_fseek_wrap,\n  (int (*)(void *))                             NULL,\n  (long (*)(void *))                            ftell\n};\n\nstatic ov_callbacks OV_CALLBACKS_STREAMONLY = {\n  (size_t (*)(void *, size_t, size_t, void *))  fread,\n  (int (*)(void *, ogg_int64_t, int))           NULL,\n  (int (*)(void *))                             fclose,\n  (long (*)(void *))                            NULL\n};\n\nstatic ov_callbacks OV_CALLBACKS_STREAMONLY_NOCLOSE = {\n  (size_t (*)(void *, size_t, size_t, void *))  fread,\n  (int (*)(void *, ogg_int64_t, int))           NULL,\n  (int (*)(void *))                             NULL,\n  (long (*)(void *))                            NULL\n};\n\n#endif\n\n#define  NOTOPEN   0\n#define  PARTOPEN  1\n#define  OPENED    2\n#define  STREAMSET 3\n#define  INITSET   4\n\ntypedef struct OggVorbis_File {\n  void            *datasource; /* Pointer to a FILE *, etc. */\n  int              seekable;\n  ogg_int64_t      offset;\n  ogg_int64_t      end;\n  ogg_sync_state   oy;\n\n  /* If the FILE handle isn't seekable (eg, a pipe), only the current\n     stream appears */\n  int              links;\n  ogg_int64_t     *offsets;\n  ogg_int64_t     *dataoffsets;\n  long            *serialnos;\n  ogg_int64_t     *pcmlengths; /* overloaded to maintain binary\n                                  compatibility; x2 size, stores both\n                                  beginning and end values */\n  vorbis_info     *vi;\n  vorbis_comment  *vc;\n\n  /* Decoding working state local storage */\n  ogg_int64_t      pcm_offset;\n  int              ready_state;\n  long             current_serialno;\n  int              current_link;\n\n  double           bittrack;\n  double           samptrack;\n\n  ogg_stream_state os; /* take physical pages, weld into a logical\n                          stream of packets */\n  vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */\n  vorbis_block     vb; /* local working space for packet->PCM decode */\n\n  ov_callbacks callbacks;\n\n} OggVorbis_File;\n\n\nextern int ov_clear(OggVorbis_File *vf);\nextern int ov_fopen(const char *path,OggVorbis_File *vf);\nextern int ov_open(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes);\nextern int ov_open_callbacks(void *datasource, OggVorbis_File *vf,\n                const char *initial, long ibytes, ov_callbacks callbacks);\n\nextern int ov_test(FILE *f,OggVorbis_File *vf,const char *initial,long ibytes);\nextern int ov_test_callbacks(void *datasource, OggVorbis_File *vf,\n                const char *initial, long ibytes, ov_callbacks callbacks);\nextern int ov_test_open(OggVorbis_File *vf);\n\nextern long ov_bitrate(OggVorbis_File *vf,int i);\nextern long ov_bitrate_instant(OggVorbis_File *vf);\nextern long ov_streams(OggVorbis_File *vf);\nextern long ov_seekable(OggVorbis_File *vf);\nextern long ov_serialnumber(OggVorbis_File *vf,int i);\n\nextern ogg_int64_t ov_raw_total(OggVorbis_File *vf,int i);\nextern ogg_int64_t ov_pcm_total(OggVorbis_File *vf,int i);\nextern double ov_time_total(OggVorbis_File *vf,int i);\n\nextern int ov_raw_seek(OggVorbis_File *vf,ogg_int64_t pos);\nextern int ov_pcm_seek(OggVorbis_File *vf,ogg_int64_t pos);\nextern int ov_pcm_seek_page(OggVorbis_File *vf,ogg_int64_t pos);\nextern int ov_time_seek(OggVorbis_File *vf,double pos);\nextern int ov_time_seek_page(OggVorbis_File *vf,double pos);\n\nextern int ov_raw_seek_lap(OggVorbis_File *vf,ogg_int64_t pos);\nextern int ov_pcm_seek_lap(OggVorbis_File *vf,ogg_int64_t pos);\nextern int ov_pcm_seek_page_lap(OggVorbis_File *vf,ogg_int64_t pos);\nextern int ov_time_seek_lap(OggVorbis_File *vf,double pos);\nextern int ov_time_seek_page_lap(OggVorbis_File *vf,double pos);\n\nextern ogg_int64_t ov_raw_tell(OggVorbis_File *vf);\nextern ogg_int64_t ov_pcm_tell(OggVorbis_File *vf);\nextern double ov_time_tell(OggVorbis_File *vf);\n\nextern vorbis_info *ov_info(OggVorbis_File *vf,int link);\nextern vorbis_comment *ov_comment(OggVorbis_File *vf,int link);\n\nextern long ov_read_float(OggVorbis_File *vf,float ***pcm_channels,int samples,\n                          int *bitstream);\nextern long ov_read_filter(OggVorbis_File *vf,char *buffer,int length,\n                          int bigendianp,int word,int sgned,int *bitstream,\n                          void (*filter)(float **pcm,long channels,long samples,void *filter_param),void *filter_param);\nextern long ov_read(OggVorbis_File *vf,char *buffer,int length,\n                    int bigendianp,int word,int sgned,int *bitstream);\nextern int ov_crosslap(OggVorbis_File *vf1,OggVorbis_File *vf2);\n\nextern int ov_halfrate(OggVorbis_File *vf,int flag);\nextern int ov_halfrate_p(OggVorbis_File *vf);\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n#endif\n\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/ac3_parser.h",
    "content": "/*\n * AC-3 parser prototypes\n * Copyright (c) 2003 Fabrice Bellard\n * Copyright (c) 2003 Michael Niedermayer\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_AC3_PARSER_H\n#define AVCODEC_AC3_PARSER_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n/**\n * Extract the bitstream ID and the frame size from AC-3 data.\n */\nint av_ac3_parse_header(const uint8_t *buf, size_t size,\n                        uint8_t *bitstream_id, uint16_t *frame_size);\n\n\n#endif /* AVCODEC_AC3_PARSER_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/adts_parser.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_ADTS_PARSER_H\n#define AVCODEC_ADTS_PARSER_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#define AV_AAC_ADTS_HEADER_SIZE 7\n\n/**\n * Extract the number of samples and frames from AAC data.\n * @param[in]  buf     pointer to AAC data buffer\n * @param[out] samples Pointer to where number of samples is written\n * @param[out] frames  Pointer to where number of frames is written\n * @return Returns 0 on success, error code on failure.\n */\nint av_adts_header_parse(const uint8_t *buf, uint32_t *samples,\n                         uint8_t *frames);\n\n#endif /* AVCODEC_ADTS_PARSER_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/avcodec.h",
    "content": "/*\n * copyright (c) 2001 Fabrice Bellard\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_AVCODEC_H\n#define AVCODEC_AVCODEC_H\n\n/**\n * @file\n * @ingroup libavc\n * Libavcodec external API header\n */\n\n#include \"libavutil/samplefmt.h\"\n#include \"libavutil/attributes.h\"\n#include \"libavutil/avutil.h\"\n#include \"libavutil/buffer.h\"\n#include \"libavutil/channel_layout.h\"\n#include \"libavutil/dict.h\"\n#include \"libavutil/frame.h\"\n#include \"libavutil/log.h\"\n#include \"libavutil/pixfmt.h\"\n#include \"libavutil/rational.h\"\n\n#include \"codec.h\"\n#include \"codec_id.h\"\n#include \"defs.h\"\n#include \"packet.h\"\n#include \"version_major.h\"\n#ifndef HAVE_AV_CONFIG_H\n/* When included as part of the ffmpeg build, only include the major version\n * to avoid unnecessary rebuilds. When included externally, keep including\n * the full version information. */\n#include \"version.h\"\n\n#include \"codec_desc.h\"\n#include \"codec_par.h\"\n#endif\n\nstruct AVCodecParameters;\n\n/**\n * @defgroup libavc libavcodec\n * Encoding/Decoding Library\n *\n * @{\n *\n * @defgroup lavc_decoding Decoding\n * @{\n * @}\n *\n * @defgroup lavc_encoding Encoding\n * @{\n * @}\n *\n * @defgroup lavc_codec Codecs\n * @{\n * @defgroup lavc_codec_native Native Codecs\n * @{\n * @}\n * @defgroup lavc_codec_wrappers External library wrappers\n * @{\n * @}\n * @defgroup lavc_codec_hwaccel Hardware Accelerators bridge\n * @{\n * @}\n * @}\n * @defgroup lavc_internal Internal\n * @{\n * @}\n * @}\n */\n\n/**\n * @ingroup libavc\n * @defgroup lavc_encdec send/receive encoding and decoding API overview\n * @{\n *\n * The avcodec_send_packet()/avcodec_receive_frame()/avcodec_send_frame()/\n * avcodec_receive_packet() functions provide an encode/decode API, which\n * decouples input and output.\n *\n * The API is very similar for encoding/decoding and audio/video, and works as\n * follows:\n * - Set up and open the AVCodecContext as usual.\n * - Send valid input:\n *   - For decoding, call avcodec_send_packet() to give the decoder raw\n *     compressed data in an AVPacket.\n *   - For encoding, call avcodec_send_frame() to give the encoder an AVFrame\n *     containing uncompressed audio or video.\n *\n *   In both cases, it is recommended that AVPackets and AVFrames are\n *   refcounted, or libavcodec might have to copy the input data. (libavformat\n *   always returns refcounted AVPackets, and av_frame_get_buffer() allocates\n *   refcounted AVFrames.)\n * - Receive output in a loop. Periodically call one of the avcodec_receive_*()\n *   functions and process their output:\n *   - For decoding, call avcodec_receive_frame(). On success, it will return\n *     an AVFrame containing uncompressed audio or video data.\n *   - For encoding, call avcodec_receive_packet(). On success, it will return\n *     an AVPacket with a compressed frame.\n *\n *   Repeat this call until it returns AVERROR(EAGAIN) or an error. The\n *   AVERROR(EAGAIN) return value means that new input data is required to\n *   return new output. In this case, continue with sending input. For each\n *   input frame/packet, the codec will typically return 1 output frame/packet,\n *   but it can also be 0 or more than 1.\n *\n * At the beginning of decoding or encoding, the codec might accept multiple\n * input frames/packets without returning a frame, until its internal buffers\n * are filled. This situation is handled transparently if you follow the steps\n * outlined above.\n *\n * In theory, sending input can result in EAGAIN - this should happen only if\n * not all output was received. You can use this to structure alternative decode\n * or encode loops other than the one suggested above. For example, you could\n * try sending new input on each iteration, and try to receive output if that\n * returns EAGAIN.\n *\n * End of stream situations. These require \"flushing\" (aka draining) the codec,\n * as the codec might buffer multiple frames or packets internally for\n * performance or out of necessity (consider B-frames).\n * This is handled as follows:\n * - Instead of valid input, send NULL to the avcodec_send_packet() (decoding)\n *   or avcodec_send_frame() (encoding) functions. This will enter draining\n *   mode.\n * - Call avcodec_receive_frame() (decoding) or avcodec_receive_packet()\n *   (encoding) in a loop until AVERROR_EOF is returned. The functions will\n *   not return AVERROR(EAGAIN), unless you forgot to enter draining mode.\n * - Before decoding can be resumed again, the codec has to be reset with\n *   avcodec_flush_buffers().\n *\n * Using the API as outlined above is highly recommended. But it is also\n * possible to call functions outside of this rigid schema. For example, you can\n * call avcodec_send_packet() repeatedly without calling\n * avcodec_receive_frame(). In this case, avcodec_send_packet() will succeed\n * until the codec's internal buffer has been filled up (which is typically of\n * size 1 per output frame, after initial input), and then reject input with\n * AVERROR(EAGAIN). Once it starts rejecting input, you have no choice but to\n * read at least some output.\n *\n * Not all codecs will follow a rigid and predictable dataflow; the only\n * guarantee is that an AVERROR(EAGAIN) return value on a send/receive call on\n * one end implies that a receive/send call on the other end will succeed, or\n * at least will not fail with AVERROR(EAGAIN). In general, no codec will\n * permit unlimited buffering of input or output.\n *\n * A codec is not allowed to return AVERROR(EAGAIN) for both sending and receiving. This\n * would be an invalid state, which could put the codec user into an endless\n * loop. The API has no concept of time either: it cannot happen that trying to\n * do avcodec_send_packet() results in AVERROR(EAGAIN), but a repeated call 1 second\n * later accepts the packet (with no other receive/flush API calls involved).\n * The API is a strict state machine, and the passage of time is not supposed\n * to influence it. Some timing-dependent behavior might still be deemed\n * acceptable in certain cases. But it must never result in both send/receive\n * returning EAGAIN at the same time at any point. It must also absolutely be\n * avoided that the current state is \"unstable\" and can \"flip-flop\" between\n * the send/receive APIs allowing progress. For example, it's not allowed that\n * the codec randomly decides that it actually wants to consume a packet now\n * instead of returning a frame, after it just returned AVERROR(EAGAIN) on an\n * avcodec_send_packet() call.\n * @}\n */\n\n/**\n * @defgroup lavc_core Core functions/structures.\n * @ingroup libavc\n *\n * Basic definitions, functions for querying libavcodec capabilities,\n * allocating core structures, etc.\n * @{\n */\n\n/**\n * @ingroup lavc_encoding\n */\ntypedef struct RcOverride{\n    int start_frame;\n    int end_frame;\n    int qscale; // If this is 0 then quality_factor will be used instead.\n    float quality_factor;\n} RcOverride;\n\n/* encoding support\n   These flags can be passed in AVCodecContext.flags before initialization.\n   Note: Not everything is supported yet.\n*/\n\n/**\n * Allow decoders to produce frames with data planes that are not aligned\n * to CPU requirements (e.g. due to cropping).\n */\n#define AV_CODEC_FLAG_UNALIGNED       (1 <<  0)\n/**\n * Use fixed qscale.\n */\n#define AV_CODEC_FLAG_QSCALE          (1 <<  1)\n/**\n * 4 MV per MB allowed / advanced prediction for H.263.\n */\n#define AV_CODEC_FLAG_4MV             (1 <<  2)\n/**\n * Output even those frames that might be corrupted.\n */\n#define AV_CODEC_FLAG_OUTPUT_CORRUPT  (1 <<  3)\n/**\n * Use qpel MC.\n */\n#define AV_CODEC_FLAG_QPEL            (1 <<  4)\n/**\n * Request the encoder to output reconstructed frames, i.e.\\ frames that would\n * be produced by decoding the encoded bitstream. These frames may be retrieved\n * by calling avcodec_receive_frame() immediately after a successful call to\n * avcodec_receive_packet().\n *\n * Should only be used with encoders flagged with the\n * @ref AV_CODEC_CAP_ENCODER_RECON_FRAME capability.\n *\n * @note\n * Each reconstructed frame returned by the encoder corresponds to the last\n * encoded packet, i.e. the frames are returned in coded order rather than\n * presentation order.\n *\n * @note\n * Frame parameters (like pixel format or dimensions) do not have to match the\n * AVCodecContext values. Make sure to use the values from the returned frame.\n */\n#define AV_CODEC_FLAG_RECON_FRAME     (1 <<  6)\n/**\n * @par decoding\n * Request the decoder to propagate each packet's AVPacket.opaque and\n * AVPacket.opaque_ref to its corresponding output AVFrame.\n *\n * @par encoding:\n * Request the encoder to propagate each frame's AVFrame.opaque and\n * AVFrame.opaque_ref values to its corresponding output AVPacket.\n *\n * @par\n * May only be set on encoders that have the\n * @ref AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE capability flag.\n *\n * @note\n * While in typical cases one input frame produces exactly one output packet\n * (perhaps after a delay), in general the mapping of frames to packets is\n * M-to-N, so\n * - Any number of input frames may be associated with any given output packet.\n *   This includes zero - e.g. some encoders may output packets that carry only\n *   metadata about the whole stream.\n * - A given input frame may be associated with any number of output packets.\n *   Again this includes zero - e.g. some encoders may drop frames under certain\n *   conditions.\n * .\n * This implies that when using this flag, the caller must NOT assume that\n * - a given input frame's opaques will necessarily appear on some output packet;\n * - every output packet will have some non-NULL opaque value.\n * .\n * When an output packet contains multiple frames, the opaque values will be\n * taken from the first of those.\n *\n * @note\n * The converse holds for decoders, with frames and packets switched.\n */\n#define AV_CODEC_FLAG_COPY_OPAQUE     (1 <<  7)\n/**\n * Signal to the encoder that the values of AVFrame.duration are valid and\n * should be used (typically for transferring them to output packets).\n *\n * If this flag is not set, frame durations are ignored.\n */\n#define AV_CODEC_FLAG_FRAME_DURATION  (1 <<  8)\n/**\n * Use internal 2pass ratecontrol in first pass mode.\n */\n#define AV_CODEC_FLAG_PASS1           (1 <<  9)\n/**\n * Use internal 2pass ratecontrol in second pass mode.\n */\n#define AV_CODEC_FLAG_PASS2           (1 << 10)\n/**\n * loop filter.\n */\n#define AV_CODEC_FLAG_LOOP_FILTER     (1 << 11)\n/**\n * Only decode/encode grayscale.\n */\n#define AV_CODEC_FLAG_GRAY            (1 << 13)\n/**\n * error[?] variables will be set during encoding.\n */\n#define AV_CODEC_FLAG_PSNR            (1 << 15)\n/**\n * Use interlaced DCT.\n */\n#define AV_CODEC_FLAG_INTERLACED_DCT  (1 << 18)\n/**\n * Force low delay.\n */\n#define AV_CODEC_FLAG_LOW_DELAY       (1 << 19)\n/**\n * Place global headers in extradata instead of every keyframe.\n */\n#define AV_CODEC_FLAG_GLOBAL_HEADER   (1 << 22)\n/**\n * Use only bitexact stuff (except (I)DCT).\n */\n#define AV_CODEC_FLAG_BITEXACT        (1 << 23)\n/* Fx : Flag for H.263+ extra options */\n/**\n * H.263 advanced intra coding / MPEG-4 AC prediction\n */\n#define AV_CODEC_FLAG_AC_PRED         (1 << 24)\n/**\n * interlaced motion estimation\n */\n#define AV_CODEC_FLAG_INTERLACED_ME   (1 << 29)\n#define AV_CODEC_FLAG_CLOSED_GOP      (1U << 31)\n\n/**\n * Allow non spec compliant speedup tricks.\n */\n#define AV_CODEC_FLAG2_FAST           (1 <<  0)\n/**\n * Skip bitstream encoding.\n */\n#define AV_CODEC_FLAG2_NO_OUTPUT      (1 <<  2)\n/**\n * Place global headers at every keyframe instead of in extradata.\n */\n#define AV_CODEC_FLAG2_LOCAL_HEADER   (1 <<  3)\n\n/**\n * Input bitstream might be truncated at a packet boundaries\n * instead of only at frame boundaries.\n */\n#define AV_CODEC_FLAG2_CHUNKS         (1 << 15)\n/**\n * Discard cropping information from SPS.\n */\n#define AV_CODEC_FLAG2_IGNORE_CROP    (1 << 16)\n\n/**\n * Show all frames before the first keyframe\n */\n#define AV_CODEC_FLAG2_SHOW_ALL       (1 << 22)\n/**\n * Export motion vectors through frame side data\n */\n#define AV_CODEC_FLAG2_EXPORT_MVS     (1 << 28)\n/**\n * Do not skip samples and export skip information as frame side data\n */\n#define AV_CODEC_FLAG2_SKIP_MANUAL    (1 << 29)\n/**\n * Do not reset ASS ReadOrder field on flush (subtitles decoding)\n */\n#define AV_CODEC_FLAG2_RO_FLUSH_NOOP  (1 << 30)\n/**\n * Generate/parse ICC profiles on encode/decode, as appropriate for the type of\n * file. No effect on codecs which cannot contain embedded ICC profiles, or\n * when compiled without support for lcms2.\n */\n#define AV_CODEC_FLAG2_ICC_PROFILES   (1U << 31)\n\n/* Exported side data.\n   These flags can be passed in AVCodecContext.export_side_data before initialization.\n*/\n/**\n * Export motion vectors through frame side data\n */\n#define AV_CODEC_EXPORT_DATA_MVS         (1 << 0)\n/**\n * Export encoder Producer Reference Time through packet side data\n */\n#define AV_CODEC_EXPORT_DATA_PRFT        (1 << 1)\n/**\n * Decoding only.\n * Export the AVVideoEncParams structure through frame side data.\n */\n#define AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS (1 << 2)\n/**\n * Decoding only.\n * Do not apply film grain, export it instead.\n */\n#define AV_CODEC_EXPORT_DATA_FILM_GRAIN (1 << 3)\n\n/**\n * Decoding only.\n * Do not apply picture enhancement layers, export them instead.\n */\n#define AV_CODEC_EXPORT_DATA_ENHANCEMENTS (1 << 4)\n\n/**\n * The decoder will keep a reference to the frame and may reuse it later.\n */\n#define AV_GET_BUFFER_FLAG_REF (1 << 0)\n\n/**\n * The encoder will keep a reference to the packet and may reuse it later.\n */\n#define AV_GET_ENCODE_BUFFER_FLAG_REF (1 << 0)\n\n/**\n * main external API structure.\n * New fields can be added to the end with minor version bumps.\n * Removal, reordering and changes to existing fields require a major\n * version bump.\n * You can use AVOptions (av_opt* / av_set/get*()) to access these fields from user\n * applications.\n * The name string for AVOptions options matches the associated command line\n * parameter name and can be found in libavcodec/options_table.h\n * The AVOption/command line parameter names differ in some cases from the C\n * structure field names for historic reasons or brevity.\n * sizeof(AVCodecContext) must not be used outside libav*.\n */\ntypedef struct AVCodecContext {\n    /**\n     * information on struct for av_log\n     * - set by avcodec_alloc_context3\n     */\n    const AVClass *av_class;\n    int log_level_offset;\n\n    enum AVMediaTypeFFmpeg codec_type; /* see AVMEDIA_TYPE_xxx */\n    const struct AVCodec  *codec;\n    enum AVCodecID     codec_id; /* see AV_CODEC_ID_xxx */\n\n    /**\n     * fourcc (LSB first, so \"ABCD\" -> ('D'<<24) + ('C'<<16) + ('B'<<8) + 'A').\n     * This is used to work around some encoder bugs.\n     * A demuxer should set this to what is stored in the field used to identify the codec.\n     * If there are multiple such fields in a container then the demuxer should choose the one\n     * which maximizes the information about the used codec.\n     * If the codec tag field in a container is larger than 32 bits then the demuxer should\n     * remap the longer ID to 32 bits with a table or other structure. Alternatively a new\n     * extra_codec_tag + size could be added but for this a clear advantage must be demonstrated\n     * first.\n     * - encoding: Set by user, if not then the default based on codec_id will be used.\n     * - decoding: Set by user, will be converted to uppercase by libavcodec during init.\n     */\n    unsigned int codec_tag;\n\n    void *priv_data;\n\n    /**\n     * Private context used for internal data.\n     *\n     * Unlike priv_data, this is not codec-specific. It is used in general\n     * libavcodec functions.\n     */\n    struct AVCodecInternal *internal;\n\n    /**\n     * Private data of the user, can be used to carry app specific stuff.\n     * - encoding: Set by user.\n     * - decoding: Set by user.\n     */\n    void *opaque;\n\n    /**\n     * the average bitrate\n     * - encoding: Set by user; unused for constant quantizer encoding.\n     * - decoding: Set by user, may be overwritten by libavcodec\n     *             if this info is available in the stream\n     */\n    int64_t bit_rate;\n\n    /**\n     * AV_CODEC_FLAG_*.\n     * - encoding: Set by user.\n     * - decoding: Set by user.\n     */\n    int flags;\n\n    /**\n     * AV_CODEC_FLAG2_*\n     * - encoding: Set by user.\n     * - decoding: Set by user.\n     */\n    int flags2;\n\n    /**\n     * Out-of-band global headers that may be used by some codecs.\n     *\n     * - decoding: Should be set by the caller when available (typically from a\n     *   demuxer) before opening the decoder; some decoders require this to be\n     *   set and will fail to initialize otherwise.\n     *\n     *   The array must be allocated with the av_malloc() family of functions;\n     *   allocated size must be at least AV_INPUT_BUFFER_PADDING_SIZE bytes\n     *   larger than extradata_size.\n     *\n     * - encoding: May be set by the encoder in avcodec_open2() (possibly\n     *   depending on whether the AV_CODEC_FLAG_GLOBAL_HEADER flag is set).\n     *\n     * After being set, the array is owned by the codec and freed in\n     * avcodec_free_context().\n     */\n    uint8_t *extradata;\n    int extradata_size;\n\n    /**\n     * This is the fundamental unit of time (in seconds) in terms\n     * of which frame timestamps are represented. For fixed-fps content,\n     * timebase should be 1/framerate and timestamp increments should be\n     * identically 1.\n     * This often, but not always is the inverse of the frame rate or field rate\n     * for video. 1/time_base is not the average frame rate if the frame rate is not\n     * constant.\n     *\n     * Like containers, elementary streams also can store timestamps, 1/time_base\n     * is the unit in which these timestamps are specified.\n     * As example of such codec time base see ISO/IEC 14496-2:2001(E)\n     * vop_time_increment_resolution and fixed_vop_rate\n     * (fixed_vop_rate == 0 implies that it is different from the framerate)\n     *\n     * - encoding: MUST be set by user.\n     * - decoding: unused.\n     */\n    AVRational time_base;\n\n    /**\n     * Timebase in which pkt_dts/pts and AVPacket.dts/pts are expressed.\n     * - encoding: unused.\n     * - decoding: set by user.\n     */\n    AVRational pkt_timebase;\n\n    /**\n     * - decoding: For codecs that store a framerate value in the compressed\n     *             bitstream, the decoder may export it here. { 0, 1} when\n     *             unknown.\n     * - encoding: May be used to signal the framerate of CFR content to an\n     *             encoder.\n     */\n    AVRational framerate;\n\n    /**\n     * Codec delay.\n     *\n     * Encoding: Number of frames delay there will be from the encoder input to\n     *           the decoder output. (we assume the decoder matches the spec)\n     * Decoding: Number of frames delay in addition to what a standard decoder\n     *           as specified in the spec would produce.\n     *\n     * Video:\n     *   Number of frames the decoded output will be delayed relative to the\n     *   encoded input.\n     *\n     * Audio:\n     *   For encoding, this field is unused (see initial_padding).\n     *\n     *   For decoding, this is the number of samples the decoder needs to\n     *   output before the decoder's output is valid. When seeking, you should\n     *   start decoding this many samples prior to your desired seek point.\n     *\n     * - encoding: Set by libavcodec.\n     * - decoding: Set by libavcodec.\n     */\n    int delay;\n\n\n    /* video only */\n    /**\n     * picture width / height.\n     *\n     * @note Those fields may not match the values of the last\n     * AVFrame output by avcodec_receive_frame() due frame\n     * reordering.\n     *\n     * - encoding: MUST be set by user.\n     * - decoding: May be set by the user before opening the decoder if known e.g.\n     *             from the container. Some decoders will require the dimensions\n     *             to be set by the caller. During decoding, the decoder may\n     *             overwrite those values as required while parsing the data.\n     */\n    int width, height;\n\n    /**\n     * Bitstream width / height, may be different from width/height e.g. when\n     * the decoded frame is cropped before being output or lowres is enabled.\n     *\n     * @note Those field may not match the value of the last\n     * AVFrame output by avcodec_receive_frame() due frame\n     * reordering.\n     *\n     * - encoding: unused\n     * - decoding: May be set by the user before opening the decoder if known\n     *             e.g. from the container. During decoding, the decoder may\n     *             overwrite those values as required while parsing the data.\n     */\n    int coded_width, coded_height;\n\n    /**\n     * sample aspect ratio (0 if unknown)\n     * That is the width of a pixel divided by the height of the pixel.\n     * Numerator and denominator must be relatively prime and smaller than 256 for some video standards.\n     * - encoding: Set by user.\n     * - decoding: Set by libavcodec.\n     */\n    AVRational sample_aspect_ratio;\n\n    /**\n     * Pixel format, see AV_PIX_FMT_xxx.\n     * May be set by the demuxer if known from headers.\n     * May be overridden by the decoder if it knows better.\n     *\n     * @note This field may not match the value of the last\n     * AVFrame output by avcodec_receive_frame() due frame\n     * reordering.\n     *\n     * - encoding: Set by user.\n     * - decoding: Set by user if known, overridden by libavcodec while\n     *             parsing the data.\n     */\n    enum AVPixelFormat pix_fmt;\n\n    /**\n     * Nominal unaccelerated pixel format, see AV_PIX_FMT_xxx.\n     * - encoding: unused.\n     * - decoding: Set by libavcodec before calling get_format()\n     */\n    enum AVPixelFormat sw_pix_fmt;\n\n    /**\n     * Chromaticity coordinates of the source primaries.\n     * - encoding: Set by user\n     * - decoding: Set by libavcodec\n     */\n    enum AVColorPrimaries color_primaries;\n\n    /**\n     * Color Transfer Characteristic.\n     * - encoding: Set by user\n     * - decoding: Set by libavcodec\n     */\n    enum AVColorTransferCharacteristic color_trc;\n\n    /**\n     * YUV colorspace type.\n     * - encoding: Set by user\n     * - decoding: Set by libavcodec\n     */\n    enum AVColorSpace colorspace;\n\n    /**\n     * MPEG vs JPEG YUV range.\n     * - encoding: Set by user to override the default output color range value,\n     *   If not specified, libavcodec sets the color range depending on the\n     *   output format.\n     * - decoding: Set by libavcodec, can be set by the user to propagate the\n     *   color range to components reading from the decoder context.\n     */\n    enum AVColorRange color_range;\n\n    /**\n     * This defines the location of chroma samples.\n     * - encoding: Set by user\n     * - decoding: Set by libavcodec\n     */\n    enum AVChromaLocation chroma_sample_location;\n\n    /** Field order\n     * - encoding: set by libavcodec\n     * - decoding: Set by user.\n     */\n    enum AVFieldOrder field_order;\n\n    /**\n     * number of reference frames\n     * - encoding: Set by user.\n     * - decoding: Set by lavc.\n     */\n    int refs;\n\n    /**\n     * Size of the frame reordering buffer in the decoder.\n     * For MPEG-2 it is 1 IPB or 0 low delay IP.\n     * - encoding: Set by libavcodec.\n     * - decoding: Set by libavcodec.\n     */\n    int has_b_frames;\n\n    /**\n     * slice flags\n     * - encoding: unused\n     * - decoding: Set by user.\n     */\n    int slice_flags;\n#define SLICE_FLAG_CODED_ORDER    0x0001 ///< draw_horiz_band() is called in coded order instead of display\n#define SLICE_FLAG_ALLOW_FIELD    0x0002 ///< allow draw_horiz_band() with field slices (MPEG-2 field pics)\n#define SLICE_FLAG_ALLOW_PLANE    0x0004 ///< allow draw_horiz_band() with 1 component at a time (SVQ1)\n\n    /**\n     * If non NULL, 'draw_horiz_band' is called by the libavcodec\n     * decoder to draw a horizontal band. It improves cache usage. Not\n     * all codecs can do that. You must check the codec capabilities\n     * beforehand.\n     * When multithreading is used, it may be called from multiple threads\n     * at the same time; threads might draw different parts of the same AVFrame,\n     * or multiple AVFrames, and there is no guarantee that slices will be drawn\n     * in order.\n     * The function is also used by hardware acceleration APIs.\n     * It is called at least once during frame decoding to pass\n     * the data needed for hardware render.\n     * In that mode instead of pixel data, AVFrame points to\n     * a structure specific to the acceleration API. The application\n     * reads the structure and can change some fields to indicate progress\n     * or mark state.\n     * - encoding: unused\n     * - decoding: Set by user.\n     * @param height the height of the slice\n     * @param y the y position of the slice\n     * @param type 1->top field, 2->bottom field, 3->frame\n     * @param offset offset into the AVFrame.data from which the slice should be read\n     */\n    void (*draw_horiz_band)(struct AVCodecContext *s,\n                            const AVFrame *src, int offset[AV_NUM_DATA_POINTERS],\n                            int y, int type, int height);\n\n    /**\n     * Callback to negotiate the pixel format. Decoding only, may be set by the\n     * caller before avcodec_open2().\n     *\n     * Called by some decoders to select the pixel format that will be used for\n     * the output frames. This is mainly used to set up hardware acceleration,\n     * then the provided format list contains the corresponding hwaccel pixel\n     * formats alongside the \"software\" one. The software pixel format may also\n     * be retrieved from \\ref sw_pix_fmt.\n     *\n     * This callback will be called when the coded frame properties (such as\n     * resolution, pixel format, etc.) change and more than one output format is\n     * supported for those new properties. If a hardware pixel format is chosen\n     * and initialization for it fails, the callback may be called again\n     * immediately.\n     *\n     * This callback may be called from different threads if the decoder is\n     * multi-threaded, but not from more than one thread simultaneously.\n     *\n     * @param fmt list of formats which may be used in the current\n     *            configuration, terminated by AV_PIX_FMT_NONE.\n     * @warning Behavior is undefined if the callback returns a value other\n     *          than one of the formats in fmt or AV_PIX_FMT_NONE.\n     * @return the chosen format or AV_PIX_FMT_NONE\n     */\n    enum AVPixelFormat (*get_format)(struct AVCodecContext *s, const enum AVPixelFormat * fmt);\n\n    /**\n     * maximum number of B-frames between non-B-frames\n     * Note: The output will be delayed by max_b_frames+1 relative to the input.\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int max_b_frames;\n\n    /**\n     * qscale factor between IP and B-frames\n     * If > 0 then the last P-frame quantizer will be used (q= lastp_q*factor+offset).\n     * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    float b_quant_factor;\n\n    /**\n     * qscale offset between IP and B-frames\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    float b_quant_offset;\n\n    /**\n     * qscale factor between P- and I-frames\n     * If > 0 then the last P-frame quantizer will be used (q = lastp_q * factor + offset).\n     * If < 0 then normal ratecontrol will be done (q= -normal_q*factor+offset).\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    float i_quant_factor;\n\n    /**\n     * qscale offset between P and I-frames\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    float i_quant_offset;\n\n    /**\n     * luminance masking (0-> disabled)\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    float lumi_masking;\n\n    /**\n     * temporary complexity masking (0-> disabled)\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    float temporal_cplx_masking;\n\n    /**\n     * spatial complexity masking (0-> disabled)\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    float spatial_cplx_masking;\n\n    /**\n     * p block masking (0-> disabled)\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    float p_masking;\n\n    /**\n     * darkness masking (0-> disabled)\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    float dark_masking;\n\n    /**\n     * noise vs. sse weight for the nsse comparison function\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n     int nsse_weight;\n\n    /**\n     * motion estimation comparison function\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int me_cmp;\n    /**\n     * subpixel motion estimation comparison function\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int me_sub_cmp;\n    /**\n     * macroblock comparison function (not supported yet)\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int mb_cmp;\n    /**\n     * interlaced DCT comparison function\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int ildct_cmp;\n#define FF_CMP_SAD          0\n#define FF_CMP_SSE          1\n#define FF_CMP_SATD         2\n#define FF_CMP_DCT          3\n#define FF_CMP_PSNR         4\n#define FF_CMP_BIT          5\n#define FF_CMP_RD           6\n#define FF_CMP_ZERO         7\n#define FF_CMP_VSAD         8\n#define FF_CMP_VSSE         9\n#define FF_CMP_NSSE         10\n#define FF_CMP_W53          11\n#define FF_CMP_W97          12\n#define FF_CMP_DCTMAX       13\n#define FF_CMP_DCT264       14\n#define FF_CMP_MEDIAN_SAD   15\n#define FF_CMP_CHROMA       256\n\n    /**\n     * ME diamond size & shape\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int dia_size;\n\n    /**\n     * amount of previous MV predictors (2a+1 x 2a+1 square)\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int last_predictor_count;\n\n    /**\n     * motion estimation prepass comparison function\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int me_pre_cmp;\n\n    /**\n     * ME prepass diamond size & shape\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int pre_dia_size;\n\n    /**\n     * subpel ME quality\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int me_subpel_quality;\n\n    /**\n     * maximum motion estimation search range in subpel units\n     * If 0 then no limit.\n     *\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int me_range;\n\n    /**\n     * macroblock decision mode\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int mb_decision;\n#define FF_MB_DECISION_SIMPLE 0        ///< uses mb_cmp\n#define FF_MB_DECISION_BITS   1        ///< chooses the one which needs the fewest bits\n#define FF_MB_DECISION_RD     2        ///< rate distortion\n\n    /**\n     * custom intra quantization matrix\n     * Must be allocated with the av_malloc() family of functions, and will be freed in\n     * avcodec_free_context().\n     * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL.\n     * - decoding: Set/allocated/freed by libavcodec.\n     */\n    uint16_t *intra_matrix;\n\n    /**\n     * custom inter quantization matrix\n     * Must be allocated with the av_malloc() family of functions, and will be freed in\n     * avcodec_free_context().\n     * - encoding: Set/allocated by user, freed by libavcodec. Can be NULL.\n     * - decoding: Set/allocated/freed by libavcodec.\n     */\n    uint16_t *inter_matrix;\n\n    /**\n     * custom intra quantization matrix\n     * - encoding: Set by user, can be NULL.\n     * - decoding: unused.\n     */\n    uint16_t *chroma_intra_matrix;\n\n    /**\n     * precision of the intra DC coefficient - 8\n     * - encoding: Set by user.\n     * - decoding: Set by libavcodec\n     */\n    int intra_dc_precision;\n\n    /**\n     * minimum MB Lagrange multiplier\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int mb_lmin;\n\n    /**\n     * maximum MB Lagrange multiplier\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int mb_lmax;\n\n    /**\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int bidir_refine;\n\n    /**\n     * minimum GOP size\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int keyint_min;\n\n    /**\n     * the number of pictures in a group of pictures, or 0 for intra_only\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int gop_size;\n\n    /**\n     * Note: Value depends upon the compare function used for fullpel ME.\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int mv0_threshold;\n\n    /**\n     * Number of slices.\n     * Indicates number of picture subdivisions. Used for parallelized\n     * decoding.\n     * - encoding: Set by user\n     * - decoding: unused\n     */\n    int slices;\n\n    /* audio only */\n    int sample_rate; ///< samples per second\n\n    /**\n     * audio sample format\n     * - encoding: Set by user.\n     * - decoding: Set by libavcodec.\n     */\n    enum AVSampleFormat sample_fmt;  ///< sample format\n\n    /**\n     * Audio channel layout.\n     * - encoding: must be set by the caller, to one of AVCodec.ch_layouts.\n     * - decoding: may be set by the caller if known e.g. from the container.\n     *             The decoder can then override during decoding as needed.\n     */\n    AVChannelLayout ch_layout;\n\n    /* The following data should not be initialized. */\n    /**\n     * Number of samples per channel in an audio frame.\n     *\n     * - encoding: set by libavcodec in avcodec_open2(). Each submitted frame\n     *   except the last must contain exactly frame_size samples per channel.\n     *   May be 0 when the codec has AV_CODEC_CAP_VARIABLE_FRAME_SIZE set, then the\n     *   frame size is not restricted.\n     * - decoding: may be set by some decoders to indicate constant frame size\n     */\n    int frame_size;\n\n    /**\n     * number of bytes per packet if constant and known or 0\n     * Used by some WAV based audio codecs.\n     */\n    int block_align;\n\n    /**\n     * Audio cutoff bandwidth (0 means \"automatic\")\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int cutoff;\n\n    /**\n     * Type of service that the audio stream conveys.\n     * - encoding: Set by user.\n     * - decoding: Set by libavcodec.\n     */\n    enum AVAudioServiceType audio_service_type;\n\n    /**\n     * desired sample format\n     * - encoding: Not used.\n     * - decoding: Set by user.\n     * Decoder will decode to this format if it can.\n     */\n    enum AVSampleFormat request_sample_fmt;\n\n    /**\n     * Audio only. The number of \"priming\" samples (padding) inserted by the\n     * encoder at the beginning of the audio. I.e. this number of leading\n     * decoded samples must be discarded by the caller to get the original audio\n     * without leading padding.\n     *\n     * - decoding: unused\n     * - encoding: Set by libavcodec. The timestamps on the output packets are\n     *             adjusted by the encoder so that they always refer to the\n     *             first sample of the data actually contained in the packet,\n     *             including any added padding.  E.g. if the timebase is\n     *             1/samplerate and the timestamp of the first input sample is\n     *             0, the timestamp of the first output packet will be\n     *             -initial_padding.\n     */\n    int initial_padding;\n\n    /**\n     * Audio only. The amount of padding (in samples) appended by the encoder to\n     * the end of the audio. I.e. this number of decoded samples must be\n     * discarded by the caller from the end of the stream to get the original\n     * audio without any trailing padding.\n     *\n     * - decoding: unused\n     * - encoding: unused\n     */\n    int trailing_padding;\n\n    /**\n     * Number of samples to skip after a discontinuity\n     * - decoding: unused\n     * - encoding: set by libavcodec\n     */\n    int seek_preroll;\n\n    /**\n     * This callback is called at the beginning of each frame to get data\n     * buffer(s) for it. There may be one contiguous buffer for all the data or\n     * there may be a buffer per each data plane or anything in between. What\n     * this means is, you may set however many entries in buf[] you feel necessary.\n     * Each buffer must be reference-counted using the AVBuffer API (see description\n     * of buf[] below).\n     *\n     * The following fields will be set in the frame before this callback is\n     * called:\n     * - format\n     * - width, height (video only)\n     * - sample_rate, channel_layout, nb_samples (audio only)\n     * Their values may differ from the corresponding values in\n     * AVCodecContext. This callback must use the frame values, not the codec\n     * context values, to calculate the required buffer size.\n     *\n     * This callback must fill the following fields in the frame:\n     * - data[]\n     * - linesize[]\n     * - extended_data:\n     *   * if the data is planar audio with more than 8 channels, then this\n     *     callback must allocate and fill extended_data to contain all pointers\n     *     to all data planes. data[] must hold as many pointers as it can.\n     *     extended_data must be allocated with av_malloc() and will be freed in\n     *     av_frame_unref().\n     *   * otherwise extended_data must point to data\n     * - buf[] must contain one or more pointers to AVBufferRef structures. Each of\n     *   the frame's data and extended_data pointers must be contained in these. That\n     *   is, one AVBufferRef for each allocated chunk of memory, not necessarily one\n     *   AVBufferRef per data[] entry. See: av_buffer_create(), av_buffer_alloc(),\n     *   and av_buffer_ref().\n     * - extended_buf and nb_extended_buf must be allocated with av_malloc() by\n     *   this callback and filled with the extra buffers if there are more\n     *   buffers than buf[] can hold. extended_buf will be freed in\n     *   av_frame_unref().\n     *   Decoders will generally initialize the whole buffer before it is output\n     *   but it can in rare error conditions happen that uninitialized data is passed\n     *   through. \\important The buffers returned by get_buffer* should thus not contain sensitive\n     *   data.\n     *\n     * If AV_CODEC_CAP_DR1 is not set then get_buffer2() must call\n     * avcodec_default_get_buffer2() instead of providing buffers allocated by\n     * some other means.\n     *\n     * Each data plane must be aligned to the maximum required by the target\n     * CPU.\n     *\n     * @see avcodec_default_get_buffer2()\n     *\n     * Video:\n     *\n     * If AV_GET_BUFFER_FLAG_REF is set in flags then the frame may be reused\n     * (read and/or written to if it is writable) later by libavcodec.\n     *\n     * avcodec_align_dimensions2() should be used to find the required width and\n     * height, as they normally need to be rounded up to the next multiple of 16.\n     *\n     * Some decoders do not support linesizes changing between frames.\n     *\n     * If frame multithreading is used, this callback may be called from a\n     * different thread, but not from more than one at once. Does not need to be\n     * reentrant.\n     *\n     * @see avcodec_align_dimensions2()\n     *\n     * Audio:\n     *\n     * Decoders request a buffer of a particular size by setting\n     * AVFrame.nb_samples prior to calling get_buffer2(). The decoder may,\n     * however, utilize only part of the buffer by setting AVFrame.nb_samples\n     * to a smaller value in the output frame.\n     *\n     * As a convenience, av_samples_get_buffer_size() and\n     * av_samples_fill_arrays() in libavutil may be used by custom get_buffer2()\n     * functions to find the required data size and to fill data pointers and\n     * linesize. In AVFrame.linesize, only linesize[0] may be set for audio\n     * since all planes must be the same size.\n     *\n     * @see av_samples_get_buffer_size(), av_samples_fill_arrays()\n     *\n     * - encoding: unused\n     * - decoding: Set by libavcodec, user can override.\n     */\n    int (*get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags);\n\n    /* - encoding parameters */\n    /**\n     * number of bits the bitstream is allowed to diverge from the reference.\n     *           the reference can be CBR (for CBR pass1) or VBR (for pass2)\n     * - encoding: Set by user; unused for constant quantizer encoding.\n     * - decoding: unused\n     */\n    int bit_rate_tolerance;\n\n    /**\n     * Global quality for codecs which cannot change it per frame.\n     * This should be proportional to MPEG-1/2/4 qscale.\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int global_quality;\n\n    /**\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int compression_level;\n#define FF_COMPRESSION_DEFAULT -1\n\n    float qcompress;  ///< amount of qscale change between easy & hard scenes (0.0-1.0)\n    float qblur;      ///< amount of qscale smoothing over time (0.0-1.0)\n\n    /**\n     * minimum quantizer\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int qmin;\n\n    /**\n     * maximum quantizer\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int qmax;\n\n    /**\n     * maximum quantizer difference between frames\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int max_qdiff;\n\n    /**\n     * decoder bitstream buffer size\n     * - encoding: Set by user.\n     * - decoding: May be set by libavcodec.\n     */\n    int rc_buffer_size;\n\n    /**\n     * ratecontrol override, see RcOverride\n     * - encoding: Allocated/set/freed by user.\n     * - decoding: unused\n     */\n    int rc_override_count;\n    RcOverride *rc_override;\n\n    /**\n     * maximum bitrate\n     * - encoding: Set by user.\n     * - decoding: Set by user, may be overwritten by libavcodec.\n     */\n    int64_t rc_max_rate;\n\n    /**\n     * minimum bitrate\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int64_t rc_min_rate;\n\n    /**\n     * Ratecontrol attempt to use, at maximum, <value> of what can be used without an underflow.\n     * - encoding: Set by user.\n     * - decoding: unused.\n     */\n    float rc_max_available_vbv_use;\n\n    /**\n     * Ratecontrol attempt to use, at least, <value> times the amount needed to prevent a vbv overflow.\n     * - encoding: Set by user.\n     * - decoding: unused.\n     */\n    float rc_min_vbv_overflow_use;\n\n    /**\n     * Number of bits which should be loaded into the rc buffer before decoding starts.\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int rc_initial_buffer_occupancy;\n\n    /**\n     * trellis RD quantization\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int trellis;\n\n    /**\n     * pass1 encoding statistics output buffer\n     * - encoding: Set by libavcodec.\n     * - decoding: unused\n     */\n    char *stats_out;\n\n    /**\n     * pass2 encoding statistics input buffer\n     * Concatenated stuff from stats_out of pass1 should be placed here.\n     * - encoding: Allocated/set/freed by user.\n     * - decoding: unused\n     */\n    char *stats_in;\n\n    /**\n     * Work around bugs in encoders which sometimes cannot be detected automatically.\n     * - encoding: Set by user\n     * - decoding: Set by user\n     */\n    int workaround_bugs;\n#define FF_BUG_AUTODETECT       1  ///< autodetection\n#define FF_BUG_XVID_ILACE       4\n#define FF_BUG_UMP4             8\n#define FF_BUG_NO_PADDING       16\n#define FF_BUG_AMV              32\n#define FF_BUG_QPEL_CHROMA      64\n#define FF_BUG_STD_QPEL         128\n#define FF_BUG_QPEL_CHROMA2     256\n#define FF_BUG_DIRECT_BLOCKSIZE 512\n#define FF_BUG_EDGE             1024\n#define FF_BUG_HPEL_CHROMA      2048\n#define FF_BUG_DC_CLIP          4096\n#define FF_BUG_MS               8192 ///< Work around various bugs in Microsoft's broken decoders.\n#define FF_BUG_TRUNCATED       16384\n#define FF_BUG_IEDGE           32768\n\n    /**\n     * strictly follow the standard (MPEG-4, ...).\n     * - encoding: Set by user.\n     * - decoding: Set by user.\n     * Setting this to STRICT or higher means the encoder and decoder will\n     * generally do stupid things, whereas setting it to unofficial or lower\n     * will mean the encoder might produce output that is not supported by all\n     * spec-compliant decoders. Decoders don't differentiate between normal,\n     * unofficial and experimental (that is, they always try to decode things\n     * when they can) unless they are explicitly asked to behave stupidly\n     * (=strictly conform to the specs)\n     * This may only be set to one of the FF_COMPLIANCE_* values in defs.h.\n     */\n    int strict_std_compliance;\n\n    /**\n     * error concealment flags\n     * - encoding: unused\n     * - decoding: Set by user.\n     */\n    int error_concealment;\n#define FF_EC_GUESS_MVS   1\n#define FF_EC_DEBLOCK     2\n#define FF_EC_FAVOR_INTER 256\n\n    /**\n     * debug\n     * - encoding: Set by user.\n     * - decoding: Set by user.\n     */\n    int debug;\n#define FF_DEBUG_PICT_INFO   1\n#define FF_DEBUG_RC          2\n#define FF_DEBUG_BITSTREAM   4\n#define FF_DEBUG_MB_TYPE     8\n#define FF_DEBUG_QP          16\n#define FF_DEBUG_DCT_COEFF   0x00000040\n#define FF_DEBUG_SKIP        0x00000080\n#define FF_DEBUG_STARTCODE   0x00000100\n#define FF_DEBUG_ER          0x00000400\n#define FF_DEBUG_MMCO        0x00000800\n#define FF_DEBUG_BUGS        0x00001000\n#define FF_DEBUG_BUFFERS     0x00008000\n#define FF_DEBUG_THREADS     0x00010000\n#define FF_DEBUG_GREEN_MD    0x00800000\n#define FF_DEBUG_NOMC        0x01000000\n\n    /**\n     * Error recognition; may misdetect some more or less valid parts as errors.\n     * This is a bitfield of the AV_EF_* values defined in defs.h.\n     *\n     * - encoding: Set by user.\n     * - decoding: Set by user.\n     */\n    int err_recognition;\n\n    /**\n     * Hardware accelerator in use\n     * - encoding: unused.\n     * - decoding: Set by libavcodec\n     */\n    const struct AVHWAccel *hwaccel;\n\n    /**\n     * Legacy hardware accelerator context.\n     *\n     * For some hardware acceleration methods, the caller may use this field to\n     * signal hwaccel-specific data to the codec. The struct pointed to by this\n     * pointer is hwaccel-dependent and defined in the respective header. Please\n     * refer to the FFmpeg HW accelerator documentation to know how to fill\n     * this.\n     *\n     * In most cases this field is optional - the necessary information may also\n     * be provided to libavcodec through @ref hw_frames_ctx or @ref\n     * hw_device_ctx (see avcodec_get_hw_config()). However, in some cases it\n     * may be the only method of signalling some (optional) information.\n     *\n     * The struct and its contents are owned by the caller.\n     *\n     * - encoding: May be set by the caller before avcodec_open2(). Must remain\n     *             valid until avcodec_free_context().\n     * - decoding: May be set by the caller in the get_format() callback.\n     *             Must remain valid until the next get_format() call,\n     *             or avcodec_free_context() (whichever comes first).\n     */\n    void *hwaccel_context;\n\n    /**\n     * A reference to the AVHWFramesContext describing the input (for encoding)\n     * or output (decoding) frames. The reference is set by the caller and\n     * afterwards owned (and freed) by libavcodec - it should never be read by\n     * the caller after being set.\n     *\n     * - decoding: This field should be set by the caller from the get_format()\n     *             callback. The previous reference (if any) will always be\n     *             unreffed by libavcodec before the get_format() call.\n     *\n     *             If the default get_buffer2() is used with a hwaccel pixel\n     *             format, then this AVHWFramesContext will be used for\n     *             allocating the frame buffers.\n     *\n     * - encoding: For hardware encoders configured to use a hwaccel pixel\n     *             format, this field should be set by the caller to a reference\n     *             to the AVHWFramesContext describing input frames.\n     *             AVHWFramesContext.format must be equal to\n     *             AVCodecContext.pix_fmt.\n     *\n     *             This field should be set before avcodec_open2() is called.\n     */\n    AVBufferRef *hw_frames_ctx;\n\n    /**\n     * A reference to the AVHWDeviceContext describing the device which will\n     * be used by a hardware encoder/decoder.  The reference is set by the\n     * caller and afterwards owned (and freed) by libavcodec.\n     *\n     * This should be used if either the codec device does not require\n     * hardware frames or any that are used are to be allocated internally by\n     * libavcodec.  If the user wishes to supply any of the frames used as\n     * encoder input or decoder output then hw_frames_ctx should be used\n     * instead.  When hw_frames_ctx is set in get_format() for a decoder, this\n     * field will be ignored while decoding the associated stream segment, but\n     * may again be used on a following one after another get_format() call.\n     *\n     * For both encoders and decoders this field should be set before\n     * avcodec_open2() is called and must not be written to thereafter.\n     *\n     * Note that some decoders may require this field to be set initially in\n     * order to support hw_frames_ctx at all - in that case, all frames\n     * contexts used must be created on the same device.\n     */\n    AVBufferRef *hw_device_ctx;\n\n    /**\n     * Bit set of AV_HWACCEL_FLAG_* flags, which affect hardware accelerated\n     * decoding (if active).\n     * - encoding: unused\n     * - decoding: Set by user (either before avcodec_open2(), or in the\n     *             AVCodecContext.get_format callback)\n     */\n    int hwaccel_flags;\n\n    /**\n     * Video decoding only.  Sets the number of extra hardware frames which\n     * the decoder will allocate for use by the caller.  This must be set\n     * before avcodec_open2() is called.\n     *\n     * Some hardware decoders require all frames that they will use for\n     * output to be defined in advance before decoding starts.  For such\n     * decoders, the hardware frame pool must therefore be of a fixed size.\n     * The extra frames set here are on top of any number that the decoder\n     * needs internally in order to operate normally (for example, frames\n     * used as reference pictures).\n     */\n    int extra_hw_frames;\n\n    /**\n     * error\n     * - encoding: Set by libavcodec if flags & AV_CODEC_FLAG_PSNR.\n     * - decoding: unused\n     */\n    uint64_t error[AV_NUM_DATA_POINTERS];\n\n    /**\n     * DCT algorithm, see FF_DCT_* below\n     * - encoding: Set by user.\n     * - decoding: unused\n     */\n    int dct_algo;\n#define FF_DCT_AUTO    0\n#define FF_DCT_FASTINT 1\n#define FF_DCT_INT     2\n#define FF_DCT_MMX     3\n#define FF_DCT_ALTIVEC 5\n#define FF_DCT_FAAN    6\n#define FF_DCT_NEON    7\n\n    /**\n     * IDCT algorithm, see FF_IDCT_* below.\n     * - encoding: Set by user.\n     * - decoding: Set by user.\n     */\n    int idct_algo;\n#define FF_IDCT_AUTO          0\n#define FF_IDCT_INT           1\n#define FF_IDCT_SIMPLE        2\n#define FF_IDCT_SIMPLEMMX     3\n#define FF_IDCT_ARM           7\n#define FF_IDCT_ALTIVEC       8\n#define FF_IDCT_SIMPLEARM     10\n#define FF_IDCT_XVID          14\n#define FF_IDCT_SIMPLEARMV5TE 16\n#define FF_IDCT_SIMPLEARMV6   17\n#define FF_IDCT_FAAN          20\n#define FF_IDCT_SIMPLENEON    22\n#define FF_IDCT_SIMPLEAUTO    128\n\n    /**\n     * bits per sample/pixel from the demuxer (needed for huffyuv).\n     * - encoding: Set by libavcodec.\n     * - decoding: Set by user.\n     */\n     int bits_per_coded_sample;\n\n    /**\n     * Bits per sample/pixel of internal libavcodec pixel/sample format.\n     * - encoding: set by user.\n     * - decoding: set by libavcodec.\n     */\n    int bits_per_raw_sample;\n\n    /**\n     * thread count\n     * is used to decide how many independent tasks should be passed to execute()\n     * - encoding: Set by user.\n     * - decoding: Set by user.\n     */\n    int thread_count;\n\n    /**\n     * Which multithreading methods to use.\n     * Use of FF_THREAD_FRAME will increase decoding delay by one frame per thread,\n     * so clients which cannot provide future frames should not use it.\n     *\n     * - encoding: Set by user, otherwise the default is used.\n     * - decoding: Set by user, otherwise the default is used.\n     */\n    int thread_type;\n#define FF_THREAD_FRAME   1 ///< Decode more than one frame at once\n#define FF_THREAD_SLICE   2 ///< Decode more than one part of a single frame at once\n\n    /**\n     * Which multithreading methods are in use by the codec.\n     * - encoding: Set by libavcodec.\n     * - decoding: Set by libavcodec.\n     */\n    int active_thread_type;\n\n    /**\n     * The codec may call this to execute several independent things.\n     * It will return only after finishing all tasks.\n     * The user may replace this with some multithreaded implementation,\n     * the default implementation will execute the parts serially.\n     * @param count the number of things to execute\n     * - encoding: Set by libavcodec, user can override.\n     * - decoding: Set by libavcodec, user can override.\n     */\n    int (*execute)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size);\n\n    /**\n     * The codec may call this to execute several independent things.\n     * It will return only after finishing all tasks.\n     * The user may replace this with some multithreaded implementation,\n     * the default implementation will execute the parts serially.\n     * @param c context passed also to func\n     * @param count the number of things to execute\n     * @param arg2 argument passed unchanged to func\n     * @param ret return values of executed functions, must have space for \"count\" values. May be NULL.\n     * @param func function that will be called count times, with jobnr from 0 to count-1.\n     *             threadnr will be in the range 0 to c->thread_count-1 < MAX_THREADS and so that no\n     *             two instances of func executing at the same time will have the same threadnr.\n     * @return always 0 currently, but code should handle a future improvement where when any call to func\n     *         returns < 0 no further calls to func may be done and < 0 is returned.\n     * - encoding: Set by libavcodec, user can override.\n     * - decoding: Set by libavcodec, user can override.\n     */\n    int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count);\n\n    /**\n     * profile\n     * - encoding: Set by user.\n     * - decoding: Set by libavcodec.\n     * See the AV_PROFILE_* defines in defs.h.\n     */\n     int profile;\n\n    /**\n     * Encoding level descriptor.\n     * - encoding: Set by user, corresponds to a specific level defined by the\n     *   codec, usually corresponding to the profile level, if not specified it\n     *   is set to AV_LEVEL_UNKNOWN.\n     * - decoding: Set by libavcodec.\n     * See AV_LEVEL_* in defs.h.\n     */\n     int level;\n\n#if FF_API_CODEC_PROPS\n    /**\n     * Properties of the stream that gets decoded\n     * - encoding: unused\n     * - decoding: set by libavcodec\n     */\n    attribute_deprecated\n    unsigned properties;\n#define FF_CODEC_PROPERTY_LOSSLESS        0x00000001\n#define FF_CODEC_PROPERTY_CLOSED_CAPTIONS 0x00000002\n#define FF_CODEC_PROPERTY_FILM_GRAIN      0x00000004\n#endif\n\n    /**\n     * Skip loop filtering for selected frames.\n     * - encoding: unused\n     * - decoding: Set by user.\n     */\n    enum AVDiscard skip_loop_filter;\n\n    /**\n     * Skip IDCT/dequantization for selected frames.\n     * - encoding: unused\n     * - decoding: Set by user.\n     */\n    enum AVDiscard skip_idct;\n\n    /**\n     * Skip decoding for selected frames.\n     * - encoding: unused\n     * - decoding: Set by user.\n     */\n    enum AVDiscard skip_frame;\n\n    /**\n     * Skip processing alpha if supported by codec.\n     * Note that if the format uses pre-multiplied alpha (common with VP6,\n     * and recommended due to better video quality/compression)\n     * the image will look as if alpha-blended onto a black background.\n     * However for formats that do not use pre-multiplied alpha\n     * there might be serious artefacts (though e.g. libswscale currently\n     * assumes pre-multiplied alpha anyway).\n     *\n     * - decoding: set by user\n     * - encoding: unused\n     */\n    int skip_alpha;\n\n    /**\n     * Number of macroblock rows at the top which are skipped.\n     * - encoding: unused\n     * - decoding: Set by user.\n     */\n    int skip_top;\n\n    /**\n     * Number of macroblock rows at the bottom which are skipped.\n     * - encoding: unused\n     * - decoding: Set by user.\n     */\n    int skip_bottom;\n\n    /**\n     * low resolution decoding, 1-> 1/2 size, 2->1/4 size\n     * - encoding: unused\n     * - decoding: Set by user.\n     */\n     int lowres;\n\n    /**\n     * AVCodecDescriptor\n     * - encoding: unused.\n     * - decoding: set by libavcodec.\n     */\n    const struct AVCodecDescriptor *codec_descriptor;\n\n    /**\n     * Character encoding of the input subtitles file.\n     * - decoding: set by user\n     * - encoding: unused\n     */\n    char *sub_charenc;\n\n    /**\n     * Subtitles character encoding mode. Formats or codecs might be adjusting\n     * this setting (if they are doing the conversion themselves for instance).\n     * - decoding: set by libavcodec\n     * - encoding: unused\n     */\n    int sub_charenc_mode;\n#define FF_SUB_CHARENC_MODE_DO_NOTHING  -1  ///< do nothing (demuxer outputs a stream supposed to be already in UTF-8, or the codec is bitmap for instance)\n#define FF_SUB_CHARENC_MODE_AUTOMATIC    0  ///< libavcodec will select the mode itself\n#define FF_SUB_CHARENC_MODE_PRE_DECODER  1  ///< the AVPacket data needs to be recoded to UTF-8 before being fed to the decoder, requires iconv\n#define FF_SUB_CHARENC_MODE_IGNORE       2  ///< neither convert the subtitles, nor check them for valid UTF-8\n\n    /**\n     * Header containing style information for text subtitles.\n     * For SUBTITLE_ASS subtitle type, it should contain the whole ASS\n     * [Script Info] and [V4+ Styles] section, plus the [Events] line and\n     * the Format line following. It shouldn't include any Dialogue line.\n     *\n     * - encoding: May be set by the caller before avcodec_open2() to an array\n     *   allocated with the av_malloc() family of functions.\n     * - decoding: May be set by libavcodec in avcodec_open2().\n     *\n     * After being set, the array is owned by the codec and freed in\n     * avcodec_free_context().\n     */\n    int subtitle_header_size;\n    uint8_t *subtitle_header;\n\n    /**\n     * dump format separator.\n     * can be \", \" or \"\\n      \" or anything else\n     * - encoding: Set by user.\n     * - decoding: Set by user.\n     */\n    uint8_t *dump_separator;\n\n    /**\n     * ',' separated list of allowed decoders.\n     * If NULL then all are allowed\n     * - encoding: unused\n     * - decoding: set by user\n     */\n    char *codec_whitelist;\n\n    /**\n     * Additional data associated with the entire coded stream.\n     *\n     * - decoding: may be set by user before calling avcodec_open2().\n     * - encoding: may be set by libavcodec after avcodec_open2().\n     */\n    AVPacketSideData *coded_side_data;\n    int            nb_coded_side_data;\n\n    /**\n     * Bit set of AV_CODEC_EXPORT_DATA_* flags, which affects the kind of\n     * metadata exported in frame, packet, or coded stream side data by\n     * decoders and encoders.\n     *\n     * - decoding: set by user\n     * - encoding: set by user\n     */\n    int export_side_data;\n\n    /**\n     * The number of pixels per image to maximally accept.\n     *\n     * - decoding: set by user\n     * - encoding: set by user\n     */\n    int64_t max_pixels;\n\n    /**\n     * Video decoding only. Certain video codecs support cropping, meaning that\n     * only a sub-rectangle of the decoded frame is intended for display.  This\n     * option controls how cropping is handled by libavcodec.\n     *\n     * When set to 1 (the default), libavcodec will apply cropping internally.\n     * I.e. it will modify the output frame width/height fields and offset the\n     * data pointers (only by as much as possible while preserving alignment, or\n     * by the full amount if the AV_CODEC_FLAG_UNALIGNED flag is set) so that\n     * the frames output by the decoder refer only to the cropped area. The\n     * crop_* fields of the output frames will be zero.\n     *\n     * When set to 0, the width/height fields of the output frames will be set\n     * to the coded dimensions and the crop_* fields will describe the cropping\n     * rectangle. Applying the cropping is left to the caller.\n     *\n     * @warning When hardware acceleration with opaque output frames is used,\n     * libavcodec is unable to apply cropping from the top/left border.\n     *\n     * @note when this option is set to zero, the width/height fields of the\n     * AVCodecContext and output AVFrames have different meanings. The codec\n     * context fields store display dimensions (with the coded dimensions in\n     * coded_width/height), while the frame fields store the coded dimensions\n     * (with the display dimensions being determined by the crop_* fields).\n     */\n    int apply_cropping;\n\n    /**\n     * The percentage of damaged samples to discard a frame.\n     *\n     * - decoding: set by user\n     * - encoding: unused\n     */\n    int discard_damaged_percentage;\n\n    /**\n     * The number of samples per frame to maximally accept.\n     *\n     * - decoding: set by user\n     * - encoding: set by user\n     */\n    int64_t max_samples;\n\n    /**\n     * This callback is called at the beginning of each packet to get a data\n     * buffer for it.\n     *\n     * The following field will be set in the packet before this callback is\n     * called:\n     * - size\n     * This callback must use the above value to calculate the required buffer size,\n     * which must padded by at least AV_INPUT_BUFFER_PADDING_SIZE bytes.\n     *\n     * In some specific cases, the encoder may not use the entire buffer allocated by this\n     * callback. This will be reflected in the size value in the packet once returned by\n     * avcodec_receive_packet().\n     *\n     * This callback must fill the following fields in the packet:\n     * - data: alignment requirements for AVPacket apply, if any. Some architectures and\n     *   encoders may benefit from having aligned data.\n     * - buf: must contain a pointer to an AVBufferRef structure. The packet's\n     *   data pointer must be contained in it. See: av_buffer_create(), av_buffer_alloc(),\n     *   and av_buffer_ref().\n     *\n     * If AV_CODEC_CAP_DR1 is not set then get_encode_buffer() must call\n     * avcodec_default_get_encode_buffer() instead of providing a buffer allocated by\n     * some other means.\n     *\n     * The flags field may contain a combination of AV_GET_ENCODE_BUFFER_FLAG_ flags.\n     * They may be used for example to hint what use the buffer may get after being\n     * created.\n     * Implementations of this callback may ignore flags they don't understand.\n     * If AV_GET_ENCODE_BUFFER_FLAG_REF is set in flags then the packet may be reused\n     * (read and/or written to if it is writable) later by libavcodec.\n     *\n     * This callback must be thread-safe, as when frame threading is used, it may\n     * be called from multiple threads simultaneously.\n     *\n     * @see avcodec_default_get_encode_buffer()\n     *\n     * - encoding: Set by libavcodec, user can override.\n     * - decoding: unused\n     */\n    int (*get_encode_buffer)(struct AVCodecContext *s, AVPacket *pkt, int flags);\n\n    /**\n     * Frame counter, set by libavcodec.\n     *\n     * - decoding: total number of frames returned from the decoder so far.\n     * - encoding: total number of frames passed to the encoder so far.\n     *\n     *   @note the counter is not incremented if encoding/decoding resulted in\n     *   an error.\n     */\n    int64_t frame_num;\n\n    /**\n     * Decoding only. May be set by the caller before avcodec_open2() to an\n     * av_malloc()'ed array (or via AVOptions). Owned and freed by the decoder\n     * afterwards.\n     *\n     * Side data attached to decoded frames may come from several sources:\n     * 1. coded_side_data, which the decoder will for certain types translate\n     *    from packet-type to frame-type and attach to frames;\n     * 2. side data attached to an AVPacket sent for decoding (same\n     *    considerations as above);\n     * 3. extracted from the coded bytestream.\n     * The first two cases are supplied by the caller and typically come from a\n     * container.\n     *\n     * This array configures decoder behaviour in cases when side data of the\n     * same type is present both in the coded bytestream and in the\n     * user-supplied side data (items 1. and 2. above). In all cases, at most\n     * one instance of each side data type will be attached to output frames. By\n     * default it will be the bytestream side data. Adding an\n     * AVPacketSideDataType value to this array will flip the preference for\n     * this type, thus making the decoder prefer user-supplied side data over\n     * bytestream. In case side data of the same type is present both in\n     * coded_data and attacked to a packet, the packet instance always has\n     * priority.\n     *\n     * The array may also contain a single -1, in which case the preference is\n     * switched for all side data types.\n     */\n    int        *side_data_prefer_packet;\n    /**\n     * Number of entries in side_data_prefer_packet.\n     */\n    unsigned nb_side_data_prefer_packet;\n\n    /**\n     * Array containing static side data, such as HDR10 CLL / MDCV structures.\n     * Side data entries should be allocated by usage of helpers defined in\n     * libavutil/frame.h.\n     *\n     * - encoding: may be set by user before calling avcodec_open2() for\n     *             encoder configuration. Afterwards owned and freed by the\n     *             encoder.\n     * - decoding: may be set by libavcodec in avcodec_open2().\n     */\n    AVFrameSideData  **decoded_side_data;\n    int             nb_decoded_side_data;\n} AVCodecContext;\n\n/**\n * @defgroup lavc_hwaccel AVHWAccel\n *\n * @note  Nothing in this structure should be accessed by the user.  At some\n *        point in future it will not be externally visible at all.\n *\n * @{\n */\ntypedef struct AVHWAccel {\n    /**\n     * Name of the hardware accelerated codec.\n     * The name is globally unique among encoders and among decoders (but an\n     * encoder and a decoder can share the same name).\n     */\n    const char *name;\n\n    /**\n     * Type of codec implemented by the hardware accelerator.\n     *\n     * See AVMEDIA_TYPE_xxx\n     */\n    enum AVMediaTypeFFmpeg type;\n\n    /**\n     * Codec implemented by the hardware accelerator.\n     *\n     * See AV_CODEC_ID_xxx\n     */\n    enum AVCodecID id;\n\n    /**\n     * Supported pixel format.\n     *\n     * Only hardware accelerated formats are supported here.\n     */\n    enum AVPixelFormat pix_fmt;\n\n    /**\n     * Hardware accelerated codec capabilities.\n     * see AV_HWACCEL_CODEC_CAP_*\n     */\n    int capabilities;\n} AVHWAccel;\n\n/**\n * HWAccel is experimental and is thus avoided in favor of non experimental\n * codecs\n */\n#define AV_HWACCEL_CODEC_CAP_EXPERIMENTAL 0x0200\n\n/**\n * Hardware acceleration should be used for decoding even if the codec level\n * used is unknown or higher than the maximum supported level reported by the\n * hardware driver.\n *\n * It's generally a good idea to pass this flag unless you have a specific\n * reason not to, as hardware tends to under-report supported levels.\n */\n#define AV_HWACCEL_FLAG_IGNORE_LEVEL (1 << 0)\n\n/**\n * Hardware acceleration can output YUV pixel formats with a different chroma\n * sampling than 4:2:0 and/or other than 8 bits per component.\n */\n#define AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH (1 << 1)\n\n/**\n * Hardware acceleration should still be attempted for decoding when the\n * codec profile does not match the reported capabilities of the hardware.\n *\n * For example, this can be used to try to decode baseline profile H.264\n * streams in hardware - it will often succeed, because many streams marked\n * as baseline profile actually conform to constrained baseline profile.\n *\n * @warning If the stream is actually not supported then the behaviour is\n *          undefined, and may include returning entirely incorrect output\n *          while indicating success.\n */\n#define AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH (1 << 2)\n\n/**\n * Some hardware decoders (namely nvdec) can either output direct decoder\n * surfaces, or make an on-device copy and return said copy.\n * There is a hard limit on how many decoder surfaces there can be, and it\n * cannot be accurately guessed ahead of time.\n * For some processing chains, this can be okay, but others will run into the\n * limit and in turn produce very confusing errors that require fine tuning of\n * more or less obscure options by the user, or in extreme cases cannot be\n * resolved at all without inserting an avfilter that forces a copy.\n *\n * Thus, the hwaccel will by default make a copy for safety and resilience.\n * If a users really wants to minimize the amount of copies, they can set this\n * flag and ensure their processing chain does not exhaust the surface pool.\n */\n#define AV_HWACCEL_FLAG_UNSAFE_OUTPUT (1 << 3)\n\n/**\n * @}\n */\n\nenum AVSubtitleType {\n    SUBTITLE_NONE,\n\n    SUBTITLE_BITMAP,                ///< A bitmap, pict will be set\n\n    /**\n     * Plain text, the text field must be set by the decoder and is\n     * authoritative. ass and pict fields may contain approximations.\n     */\n    SUBTITLE_TEXT,\n\n    /**\n     * Formatted text, the ass field must be set by the decoder and is\n     * authoritative. pict and text fields may contain approximations.\n     */\n    SUBTITLE_ASS,\n};\n\n#define AV_SUBTITLE_FLAG_FORCED 0x00000001\n\ntypedef struct AVSubtitleRect {\n    int x;         ///< top left corner  of pict, undefined when pict is not set\n    int y;         ///< top left corner  of pict, undefined when pict is not set\n    int w;         ///< width            of pict, undefined when pict is not set\n    int h;         ///< height           of pict, undefined when pict is not set\n    int nb_colors; ///< number of colors in pict, undefined when pict is not set\n\n    /**\n     * data+linesize for the bitmap of this subtitle.\n     * Can be set for text/ass as well once they are rendered.\n     */\n    uint8_t *data[4];\n    int linesize[4];\n\n    int flags;\n    enum AVSubtitleType type;\n\n    char *text;                     ///< 0 terminated plain UTF-8 text\n\n    /**\n     * 0 terminated ASS/SSA compatible event line.\n     * The presentation of this is unaffected by the other values in this\n     * struct.\n     */\n    char *ass;\n} AVSubtitleRect;\n\ntypedef struct AVSubtitle {\n    uint16_t format; /* 0 = graphics */\n    uint32_t start_display_time; /* relative to packet pts, in ms */\n    uint32_t end_display_time; /* relative to packet pts, in ms */\n    unsigned num_rects;\n    AVSubtitleRect **rects;\n    int64_t pts;    ///< Same as packet pts, in AV_TIME_BASE\n} AVSubtitle;\n\n/**\n * Return the LIBAVCODEC_VERSION_INT constant.\n */\nunsigned avcodec_version(void);\n\n/**\n * Return the libavcodec build-time configuration.\n */\nconst char *avcodec_configuration(void);\n\n/**\n * Return the libavcodec license.\n */\nconst char *avcodec_license(void);\n\n/**\n * Allocate an AVCodecContext and set its fields to default values. The\n * resulting struct should be freed with avcodec_free_context().\n *\n * @param codec if non-NULL, allocate private data and initialize defaults\n *              for the given codec. It is illegal to then call avcodec_open2()\n *              with a different codec.\n *              If NULL, then the codec-specific defaults won't be initialized,\n *              which may result in suboptimal default settings (this is\n *              important mainly for encoders, e.g. libx264).\n *\n * @return An AVCodecContext filled with default values or NULL on failure.\n */\nAVCodecContext *avcodec_alloc_context3(const AVCodec *codec);\n\n/**\n * Free the codec context and everything associated with it and write NULL to\n * the provided pointer.\n */\nvoid avcodec_free_context(AVCodecContext **avctx);\n\n/**\n * Get the AVClass for AVCodecContext. It can be used in combination with\n * AV_OPT_SEARCH_FAKE_OBJ for examining options.\n *\n * @see av_opt_find().\n */\nconst AVClass *avcodec_get_class(void);\n\n/**\n * Get the AVClass for AVSubtitleRect. It can be used in combination with\n * AV_OPT_SEARCH_FAKE_OBJ for examining options.\n *\n * @see av_opt_find().\n */\nconst AVClass *avcodec_get_subtitle_rect_class(void);\n\n/**\n * Fill the parameters struct based on the values from the supplied codec\n * context. Any allocated fields in par are freed and replaced with duplicates\n * of the corresponding fields in codec.\n *\n * @return >= 0 on success, a negative AVERROR code on failure\n */\nint avcodec_parameters_from_context(struct AVCodecParameters *par,\n                                    const AVCodecContext *codec);\n\n/**\n * Fill the codec context based on the values from the supplied codec\n * parameters. Any allocated fields in codec that have a corresponding field in\n * par are freed and replaced with duplicates of the corresponding field in par.\n * Fields in codec that do not have a counterpart in par are not touched.\n *\n * @return >= 0 on success, a negative AVERROR code on failure.\n */\nint avcodec_parameters_to_context(AVCodecContext *codec,\n                                  const struct AVCodecParameters *par);\n\n/**\n * Initialize the AVCodecContext to use the given AVCodec. Prior to using this\n * function the context has to be allocated with avcodec_alloc_context3().\n *\n * The functions avcodec_find_decoder_by_name(), avcodec_find_encoder_by_name(),\n * avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for\n * retrieving a codec.\n *\n * Depending on the codec, you might need to set options in the codec context\n * also for decoding (e.g. width, height, or the pixel or audio sample format in\n * the case the information is not available in the bitstream, as when decoding\n * raw audio or video).\n *\n * Options in the codec context can be set either by setting them in the options\n * AVDictionary, or by setting the values in the context itself, directly or by\n * using the av_opt_set() API before calling this function.\n *\n * Example:\n * @code\n * av_dict_set(&opts, \"b\", \"2.5M\", 0);\n * codec = avcodec_find_decoder(AV_CODEC_ID_H264);\n * if (!codec)\n *     exit(1);\n *\n * context = avcodec_alloc_context3(codec);\n *\n * if (avcodec_open2(context, codec, opts) < 0)\n *     exit(1);\n * @endcode\n *\n * In the case AVCodecParameters are available (e.g. when demuxing a stream\n * using libavformat, and accessing the AVStream contained in the demuxer), the\n * codec parameters can be copied to the codec context using\n * avcodec_parameters_to_context(), as in the following example:\n *\n * @code\n * AVStream *stream = ...;\n * context = avcodec_alloc_context3(codec);\n * if (avcodec_parameters_to_context(context, stream->codecpar) < 0)\n *     exit(1);\n * if (avcodec_open2(context, codec, NULL) < 0)\n *     exit(1);\n * @endcode\n *\n * @note Always call this function before using decoding routines (such as\n * @ref avcodec_receive_frame()).\n *\n * @param avctx The context to initialize.\n * @param codec The codec to open this context for. If a non-NULL codec has been\n *              previously passed to avcodec_alloc_context3() or\n *              for this context, then this parameter MUST be either NULL or\n *              equal to the previously passed codec.\n * @param options A dictionary filled with AVCodecContext and codec-private\n *                options, which are set on top of the options already set in\n *                avctx, can be NULL. On return this object will be filled with\n *                options that were not found in the avctx codec context.\n *\n * @return zero on success, a negative value on error\n * @see avcodec_alloc_context3(), avcodec_find_decoder(), avcodec_find_encoder(),\n *      av_dict_set(), av_opt_set(), av_opt_find(), avcodec_parameters_to_context()\n */\nint avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);\n\n/**\n * Free all allocated data in the given subtitle struct.\n *\n * @param sub AVSubtitle to free.\n */\nvoid avsubtitle_free(AVSubtitle *sub);\n\n/**\n * @}\n */\n\n/**\n * @addtogroup lavc_decoding\n * @{\n */\n\n/**\n * The default callback for AVCodecContext.get_buffer2(). It is made public so\n * it can be called by custom get_buffer2() implementations for decoders without\n * AV_CODEC_CAP_DR1 set.\n */\nint avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags);\n\n/**\n * The default callback for AVCodecContext.get_encode_buffer(). It is made public so\n * it can be called by custom get_encode_buffer() implementations for encoders without\n * AV_CODEC_CAP_DR1 set.\n */\nint avcodec_default_get_encode_buffer(AVCodecContext *s, AVPacket *pkt, int flags);\n\n/**\n * Modify width and height values so that they will result in a memory\n * buffer that is acceptable for the codec if you do not use any horizontal\n * padding.\n *\n * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened.\n */\nvoid avcodec_align_dimensions(AVCodecContext *s, int *width, int *height);\n\n/**\n * Modify width and height values so that they will result in a memory\n * buffer that is acceptable for the codec if you also ensure that all\n * line sizes are a multiple of the respective linesize_align[i].\n *\n * May only be used if a codec with AV_CODEC_CAP_DR1 has been opened.\n */\nvoid avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,\n                               int linesize_align[AV_NUM_DATA_POINTERS]);\n\n/**\n * Decode a subtitle message.\n * Return a negative value on error, otherwise return the number of bytes used.\n * If no subtitle could be decompressed, got_sub_ptr is zero.\n * Otherwise, the subtitle is stored in *sub.\n * Note that AV_CODEC_CAP_DR1 is not available for subtitle codecs. This is for\n * simplicity, because the performance difference is expected to be negligible\n * and reusing a get_buffer written for video codecs would probably perform badly\n * due to a potentially very different allocation pattern.\n *\n * Some decoders (those marked with AV_CODEC_CAP_DELAY) have a delay between input\n * and output. This means that for some packets they will not immediately\n * produce decoded output and need to be flushed at the end of decoding to get\n * all the decoded data. Flushing is done by calling this function with packets\n * with avpkt->data set to NULL and avpkt->size set to 0 until it stops\n * returning subtitles. It is safe to flush even those decoders that are not\n * marked with AV_CODEC_CAP_DELAY, then no subtitles will be returned.\n *\n * @note The AVCodecContext MUST have been opened with @ref avcodec_open2()\n * before packets may be fed to the decoder.\n *\n * @param avctx the codec context\n * @param[out] sub The preallocated AVSubtitle in which the decoded subtitle will be stored,\n *                 must be freed with avsubtitle_free if *got_sub_ptr is set.\n * @param[in,out] got_sub_ptr Zero if no subtitle could be decompressed, otherwise, it is nonzero.\n * @param[in] avpkt The input AVPacket containing the input buffer.\n */\nint avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,\n                             int *got_sub_ptr, const AVPacket *avpkt);\n\n/**\n * Supply raw packet data as input to a decoder.\n *\n * Internally, this call will copy relevant AVCodecContext fields, which can\n * influence decoding per-packet, and apply them when the packet is actually\n * decoded. (For example AVCodecContext.skip_frame, which might direct the\n * decoder to drop the frame contained by the packet sent with this function.)\n *\n * @warning The input buffer, avpkt->data must be AV_INPUT_BUFFER_PADDING_SIZE\n *          larger than the actual read bytes because some optimized bitstream\n *          readers read 32 or 64 bits at once and could read over the end.\n *\n * @note The AVCodecContext MUST have been opened with @ref avcodec_open2()\n *       before packets may be fed to the decoder.\n *\n * @param avctx codec context\n * @param[in] avpkt The input AVPacket. Usually, this will be a single video\n *                  frame, or several complete audio frames.\n *                  Ownership of the packet remains with the caller, and the\n *                  decoder will not write to the packet. The decoder may create\n *                  a reference to the packet data (or copy it if the packet is\n *                  not reference-counted).\n *                  Unlike with older APIs, the packet is always fully consumed,\n *                  and if it contains multiple frames (e.g. some audio codecs),\n *                  will require you to call avcodec_receive_frame() multiple\n *                  times afterwards before you can send a new packet.\n *                  It can be NULL (or an AVPacket with data set to NULL and\n *                  size set to 0); in this case, it is considered a flush\n *                  packet, which signals the end of the stream. Sending the\n *                  first flush packet will return success. Subsequent ones are\n *                  unnecessary and will return AVERROR_EOF. If the decoder\n *                  still has frames buffered, it will return them after sending\n *                  a flush packet.\n *\n * @retval 0                 success\n * @retval AVERROR(EAGAIN)   input is not accepted in the current state - user\n *                           must read output with avcodec_receive_frame() (once\n *                           all output is read, the packet should be resent,\n *                           and the call will not fail with EAGAIN).\n * @retval AVERROR_EOF       the decoder has been flushed, and no new packets can be\n *                           sent to it (also returned if more than 1 flush\n *                           packet is sent)\n * @retval AVERROR(EINVAL)   codec not opened, it is an encoder, or requires flush\n * @retval AVERROR(ENOMEM)   failed to add packet to internal queue, or similar\n * @retval \"another negative error code\" legitimate decoding errors\n */\nint avcodec_send_packet(AVCodecContext *avctx, const AVPacket *avpkt);\n\n/**\n * Return decoded output data from a decoder or encoder (when the\n * @ref AV_CODEC_FLAG_RECON_FRAME flag is used).\n *\n * @param avctx codec context\n * @param frame This will be set to a reference-counted video or audio\n *              frame (depending on the decoder type) allocated by the\n *              codec. Note that the function will always call\n *              av_frame_unref(frame) before doing anything else.\n *\n * @retval 0                success, a frame was returned\n * @retval AVERROR(EAGAIN)  output is not available in this state - user must\n *                          try to send new input\n * @retval AVERROR_EOF      the codec has been fully flushed, and there will be\n *                          no more output frames\n * @retval AVERROR(EINVAL)  codec not opened, or it is an encoder without the\n *                          @ref AV_CODEC_FLAG_RECON_FRAME flag enabled\n * @retval \"other negative error code\" legitimate decoding errors\n */\nint avcodec_receive_frame(AVCodecContext *avctx, AVFrame *frame);\n\n/**\n * Supply a raw video or audio frame to the encoder. Use avcodec_receive_packet()\n * to retrieve buffered output packets.\n *\n * @param avctx     codec context\n * @param[in] frame AVFrame containing the raw audio or video frame to be encoded.\n *                  Ownership of the frame remains with the caller, and the\n *                  encoder will not write to the frame. The encoder may create\n *                  a reference to the frame data (or copy it if the frame is\n *                  not reference-counted).\n *                  It can be NULL, in which case it is considered a flush\n *                  packet.  This signals the end of the stream. If the encoder\n *                  still has packets buffered, it will return them after this\n *                  call. Once flushing mode has been entered, additional flush\n *                  packets are ignored, and sending frames will return\n *                  AVERROR_EOF.\n *\n *                  For audio:\n *                  If AV_CODEC_CAP_VARIABLE_FRAME_SIZE is set, then each frame\n *                  can have any number of samples.\n *                  If it is not set, frame->nb_samples must be equal to\n *                  avctx->frame_size for all frames except the last.\n *                  The final frame may be smaller than avctx->frame_size.\n * @retval 0                 success\n * @retval AVERROR(EAGAIN)   input is not accepted in the current state - user must\n *                           read output with avcodec_receive_packet() (once all\n *                           output is read, the packet should be resent, and the\n *                           call will not fail with EAGAIN).\n * @retval AVERROR_EOF       the encoder has been flushed, and no new frames can\n *                           be sent to it\n * @retval AVERROR(EINVAL)   codec not opened, it is a decoder, or requires flush\n * @retval AVERROR(ENOMEM)   failed to add packet to internal queue, or similar\n * @retval \"another negative error code\" legitimate encoding errors\n */\nint avcodec_send_frame(AVCodecContext *avctx, const AVFrame *frame);\n\n/**\n * Read encoded data from the encoder.\n *\n * @param avctx codec context\n * @param avpkt This will be set to a reference-counted packet allocated by the\n *              encoder. Note that the function will always call\n *              av_packet_unref(avpkt) before doing anything else.\n * @retval 0               success\n * @retval AVERROR(EAGAIN) output is not available in the current state - user must\n *                         try to send input\n * @retval AVERROR_EOF     the encoder has been fully flushed, and there will be no\n *                         more output packets\n * @retval AVERROR(EINVAL) codec not opened, or it is a decoder\n * @retval \"another negative error code\" legitimate encoding errors\n */\nint avcodec_receive_packet(AVCodecContext *avctx, AVPacket *avpkt);\n\n/**\n * Create and return a AVHWFramesContext with values adequate for hardware\n * decoding. This is meant to get called from the get_format callback, and is\n * a helper for preparing a AVHWFramesContext for AVCodecContext.hw_frames_ctx.\n * This API is for decoding with certain hardware acceleration modes/APIs only.\n *\n * The returned AVHWFramesContext is not initialized. The caller must do this\n * with av_hwframe_ctx_init().\n *\n * Calling this function is not a requirement, but makes it simpler to avoid\n * codec or hardware API specific details when manually allocating frames.\n *\n * Alternatively to this, an API user can set AVCodecContext.hw_device_ctx,\n * which sets up AVCodecContext.hw_frames_ctx fully automatically, and makes\n * it unnecessary to call this function or having to care about\n * AVHWFramesContext initialization at all.\n *\n * There are a number of requirements for calling this function:\n *\n * - It must be called from get_format with the same avctx parameter that was\n *   passed to get_format. Calling it outside of get_format is not allowed, and\n *   can trigger undefined behavior.\n * - The function is not always supported (see description of return values).\n *   Even if this function returns successfully, hwaccel initialization could\n *   fail later. (The degree to which implementations check whether the stream\n *   is actually supported varies. Some do this check only after the user's\n *   get_format callback returns.)\n * - The hw_pix_fmt must be one of the choices suggested by get_format. If the\n *   user decides to use a AVHWFramesContext prepared with this API function,\n *   the user must return the same hw_pix_fmt from get_format.\n * - The device_ref passed to this function must support the given hw_pix_fmt.\n * - After calling this API function, it is the user's responsibility to\n *   initialize the AVHWFramesContext (returned by the out_frames_ref parameter),\n *   and to set AVCodecContext.hw_frames_ctx to it. If done, this must be done\n *   before returning from get_format (this is implied by the normal\n *   AVCodecContext.hw_frames_ctx API rules).\n * - The AVHWFramesContext parameters may change every time time get_format is\n *   called. Also, AVCodecContext.hw_frames_ctx is reset before get_format. So\n *   you are inherently required to go through this process again on every\n *   get_format call.\n * - It is perfectly possible to call this function without actually using\n *   the resulting AVHWFramesContext. One use-case might be trying to reuse a\n *   previously initialized AVHWFramesContext, and calling this API function\n *   only to test whether the required frame parameters have changed.\n * - Fields that use dynamically allocated values of any kind must not be set\n *   by the user unless setting them is explicitly allowed by the documentation.\n *   If the user sets AVHWFramesContext.free and AVHWFramesContext.user_opaque,\n *   the new free callback must call the potentially set previous free callback.\n *   This API call may set any dynamically allocated fields, including the free\n *   callback.\n *\n * The function will set at least the following fields on AVHWFramesContext\n * (potentially more, depending on hwaccel API):\n *\n * - All fields set by av_hwframe_ctx_alloc().\n * - Set the format field to hw_pix_fmt.\n * - Set the sw_format field to the most suited and most versatile format. (An\n *   implication is that this will prefer generic formats over opaque formats\n *   with arbitrary restrictions, if possible.)\n * - Set the width/height fields to the coded frame size, rounded up to the\n *   API-specific minimum alignment.\n * - Only _if_ the hwaccel requires a pre-allocated pool: set the initial_pool_size\n *   field to the number of maximum reference surfaces possible with the codec,\n *   plus 1 surface for the user to work (meaning the user can safely reference\n *   at most 1 decoded surface at a time), plus additional buffering introduced\n *   by frame threading. If the hwaccel does not require pre-allocation, the\n *   field is left to 0, and the decoder will allocate new surfaces on demand\n *   during decoding.\n * - Possibly AVHWFramesContext.hwctx fields, depending on the underlying\n *   hardware API.\n *\n * Essentially, out_frames_ref returns the same as av_hwframe_ctx_alloc(), but\n * with basic frame parameters set.\n *\n * The function is stateless, and does not change the AVCodecContext or the\n * device_ref AVHWDeviceContext.\n *\n * @param avctx The context which is currently calling get_format, and which\n *              implicitly contains all state needed for filling the returned\n *              AVHWFramesContext properly.\n * @param device_ref A reference to the AVHWDeviceContext describing the device\n *                   which will be used by the hardware decoder.\n * @param hw_pix_fmt The hwaccel format you are going to return from get_format.\n * @param out_frames_ref On success, set to a reference to an _uninitialized_\n *                       AVHWFramesContext, created from the given device_ref.\n *                       Fields will be set to values required for decoding.\n *                       Not changed if an error is returned.\n * @return zero on success, a negative value on error. The following error codes\n *         have special semantics:\n *      AVERROR(ENOENT): the decoder does not support this functionality. Setup\n *                       is always manual, or it is a decoder which does not\n *                       support setting AVCodecContext.hw_frames_ctx at all,\n *                       or it is a software format.\n *      AVERROR(EINVAL): it is known that hardware decoding is not supported for\n *                       this configuration, or the device_ref is not supported\n *                       for the hwaccel referenced by hw_pix_fmt.\n */\nint avcodec_get_hw_frames_parameters(AVCodecContext *avctx,\n                                     AVBufferRef *device_ref,\n                                     enum AVPixelFormat hw_pix_fmt,\n                                     AVBufferRef **out_frames_ref);\n\nenum AVCodecConfig {\n    AV_CODEC_CONFIG_PIX_FORMAT,     ///< AVPixelFormat, terminated by AV_PIX_FMT_NONE\n    AV_CODEC_CONFIG_FRAME_RATE,     ///< AVRational, terminated by {0, 0}\n    AV_CODEC_CONFIG_SAMPLE_RATE,    ///< int, terminated by 0\n    AV_CODEC_CONFIG_SAMPLE_FORMAT,  ///< AVSampleFormat, terminated by AV_SAMPLE_FMT_NONE\n    AV_CODEC_CONFIG_CHANNEL_LAYOUT, ///< AVChannelLayout, terminated by {0}\n    AV_CODEC_CONFIG_COLOR_RANGE,    ///< AVColorRange, terminated by AVCOL_RANGE_UNSPECIFIED\n    AV_CODEC_CONFIG_COLOR_SPACE,    ///< AVColorSpace, terminated by AVCOL_SPC_UNSPECIFIED\n};\n\n/**\n * Retrieve a list of all supported values for a given configuration type.\n *\n * @param avctx An optional context to use. Values such as\n *              `strict_std_compliance` may affect the result. If NULL,\n *              default values are used.\n * @param codec The codec to query, or NULL to use avctx->codec.\n * @param config The configuration to query.\n * @param flags Currently unused; should be set to zero.\n * @param out_configs On success, set to a list of configurations, terminated\n *                    by a config-specific terminator, or NULL if all\n *                    possible values are supported.\n * @param out_num_configs On success, set to the number of elements in\n                          *out_configs, excluding the terminator. Optional.\n */\nint avcodec_get_supported_config(const AVCodecContext *avctx,\n                                 const AVCodec *codec, enum AVCodecConfig config,\n                                 unsigned flags, const void **out_configs,\n                                 int *out_num_configs);\n\n\n\n/**\n * @defgroup lavc_parsing Frame parsing\n * @{\n */\n\nenum AVPictureStructure {\n    AV_PICTURE_STRUCTURE_UNKNOWN,      ///< unknown\n    AV_PICTURE_STRUCTURE_TOP_FIELD,    ///< coded as top field\n    AV_PICTURE_STRUCTURE_BOTTOM_FIELD, ///< coded as bottom field\n    AV_PICTURE_STRUCTURE_FRAME,        ///< coded as frame\n};\n\ntypedef struct AVCodecParserContext {\n    void *priv_data;\n    const struct AVCodecParser *parser;\n    int64_t frame_offset; /* offset of the current frame */\n    int64_t cur_offset; /* current offset\n                           (incremented by each av_parser_parse()) */\n    int64_t next_frame_offset; /* offset of the next frame */\n    /* video info */\n    int pict_type; /* XXX: Put it back in AVCodecContext. */\n    /**\n     * This field is used for proper frame duration computation in lavf.\n     * It signals, how much longer the frame duration of the current frame\n     * is compared to normal frame duration.\n     *\n     * frame_duration = (1 + repeat_pict) * time_base\n     *\n     * It is used by codecs like H.264 to display telecined material.\n     */\n    int repeat_pict; /* XXX: Put it back in AVCodecContext. */\n    int64_t pts;     /* pts of the current frame */\n    int64_t dts;     /* dts of the current frame */\n\n    /* private data */\n    int64_t last_pts;\n    int64_t last_dts;\n    int fetch_timestamp;\n\n#define AV_PARSER_PTS_NB 4\n    int cur_frame_start_index;\n    int64_t cur_frame_offset[AV_PARSER_PTS_NB];\n    int64_t cur_frame_pts[AV_PARSER_PTS_NB];\n    int64_t cur_frame_dts[AV_PARSER_PTS_NB];\n\n    int flags;\n#define PARSER_FLAG_COMPLETE_FRAMES           0x0001\n#define PARSER_FLAG_ONCE                      0x0002\n/// Set if the parser has a valid file offset\n#define PARSER_FLAG_FETCHED_OFFSET            0x0004\n#define PARSER_FLAG_USE_CODEC_TS              0x1000\n\n    int64_t offset;      ///< byte offset from starting packet start\n    int64_t cur_frame_end[AV_PARSER_PTS_NB];\n\n    /**\n     * Set by parser to 1 for key frames and 0 for non-key frames.\n     * It is initialized to -1, so if the parser doesn't set this flag,\n     * old-style fallback using AV_PICTURE_TYPE_I picture type as key frames\n     * will be used.\n     */\n    int key_frame;\n\n    // Timestamp generation support:\n    /**\n     * Synchronization point for start of timestamp generation.\n     *\n     * Set to >0 for sync point, 0 for no sync point and <0 for undefined\n     * (default).\n     *\n     * For example, this corresponds to presence of H.264 buffering period\n     * SEI message.\n     */\n    int dts_sync_point;\n\n    /**\n     * Offset of the current timestamp against last timestamp sync point in\n     * units of AVCodecContext.time_base.\n     *\n     * Set to INT_MIN when dts_sync_point unused. Otherwise, it must\n     * contain a valid timestamp offset.\n     *\n     * Note that the timestamp of sync point has usually a nonzero\n     * dts_ref_dts_delta, which refers to the previous sync point. Offset of\n     * the next frame after timestamp sync point will be usually 1.\n     *\n     * For example, this corresponds to H.264 cpb_removal_delay.\n     */\n    int dts_ref_dts_delta;\n\n    /**\n     * Presentation delay of current frame in units of AVCodecContext.time_base.\n     *\n     * Set to INT_MIN when dts_sync_point unused. Otherwise, it must\n     * contain valid non-negative timestamp delta (presentation time of a frame\n     * must not lie in the past).\n     *\n     * This delay represents the difference between decoding and presentation\n     * time of the frame.\n     *\n     * For example, this corresponds to H.264 dpb_output_delay.\n     */\n    int pts_dts_delta;\n\n    /**\n     * Position of the packet in file.\n     *\n     * Analogous to cur_frame_pts/dts\n     */\n    int64_t cur_frame_pos[AV_PARSER_PTS_NB];\n\n    /**\n     * Byte position of currently parsed frame in stream.\n     */\n    int64_t pos;\n\n    /**\n     * Previous frame byte position.\n     */\n    int64_t last_pos;\n\n    /**\n     * Duration of the current frame.\n     * For audio, this is in units of 1 / AVCodecContext.sample_rate.\n     * For all other types, this is in units of AVCodecContext.time_base.\n     */\n    int duration;\n\n    enum AVFieldOrder field_order;\n\n    /**\n     * Indicate whether a picture is coded as a frame, top field or bottom field.\n     *\n     * For example, H.264 field_pic_flag equal to 0 corresponds to\n     * AV_PICTURE_STRUCTURE_FRAME. An H.264 picture with field_pic_flag\n     * equal to 1 and bottom_field_flag equal to 0 corresponds to\n     * AV_PICTURE_STRUCTURE_TOP_FIELD.\n     */\n    enum AVPictureStructure picture_structure;\n\n    /**\n     * Picture number incremented in presentation or output order.\n     * This field may be reinitialized at the first picture of a new sequence.\n     *\n     * For example, this corresponds to H.264 PicOrderCnt.\n     */\n    int output_picture_number;\n\n    /**\n     * Dimensions of the decoded video intended for presentation.\n     */\n    int width;\n    int height;\n\n    /**\n     * Dimensions of the coded video.\n     */\n    int coded_width;\n    int coded_height;\n\n    /**\n     * The format of the coded data, corresponds to enum AVPixelFormat for video\n     * and for enum AVSampleFormat for audio.\n     *\n     * Note that a decoder can have considerable freedom in how exactly it\n     * decodes the data, so the format reported here might be different from the\n     * one returned by a decoder.\n     */\n    int format;\n} AVCodecParserContext;\n\ntypedef struct AVCodecParser {\n    int codec_ids[7]; /* several codec IDs are permitted */\n    int priv_data_size;\n    int (*parser_init)(AVCodecParserContext *s);\n    /* This callback never returns an error, a negative value means that\n     * the frame start was in a previous packet. */\n    int (*parser_parse)(AVCodecParserContext *s,\n                        AVCodecContext *avctx,\n                        const uint8_t **poutbuf, int *poutbuf_size,\n                        const uint8_t *buf, int buf_size);\n    void (*parser_close)(AVCodecParserContext *s);\n    int (*split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size);\n} AVCodecParser;\n\n/**\n * Iterate over all registered codec parsers.\n *\n * @param opaque a pointer where libavcodec will store the iteration state. Must\n *               point to NULL to start the iteration.\n *\n * @return the next registered codec parser or NULL when the iteration is\n *         finished\n */\nconst AVCodecParser *av_parser_iterate(void **opaque);\n\nAVCodecParserContext *av_parser_init(int codec_id);\n\n/**\n * Parse a packet.\n *\n * @param s             parser context.\n * @param avctx         codec context.\n * @param poutbuf       set to pointer to parsed buffer or NULL if not yet finished.\n * @param poutbuf_size  set to size of parsed buffer or zero if not yet finished.\n * @param buf           input buffer.\n * @param buf_size      buffer size in bytes without the padding. I.e. the full buffer\n                        size is assumed to be buf_size + AV_INPUT_BUFFER_PADDING_SIZE.\n                        To signal EOF, this should be 0 (so that the last frame\n                        can be output).\n * @param pts           input presentation timestamp.\n * @param dts           input decoding timestamp.\n * @param pos           input byte position in stream.\n * @return the number of bytes of the input bitstream used.\n *\n * Example:\n * @code\n *   while(in_len){\n *       len = av_parser_parse2(myparser, AVCodecContext, &data, &size,\n *                                        in_data, in_len,\n *                                        pts, dts, pos);\n *       in_data += len;\n *       in_len  -= len;\n *\n *       if(size)\n *          decode_frame(data, size);\n *   }\n * @endcode\n */\nint av_parser_parse2(AVCodecParserContext *s,\n                     AVCodecContext *avctx,\n                     uint8_t **poutbuf, int *poutbuf_size,\n                     const uint8_t *buf, int buf_size,\n                     int64_t pts, int64_t dts,\n                     int64_t pos);\n\nvoid av_parser_close(AVCodecParserContext *s);\n\n/**\n * @}\n * @}\n */\n\n/**\n * @addtogroup lavc_encoding\n * @{\n */\n\nint avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,\n                            const AVSubtitle *sub);\n\n\n/**\n * @}\n */\n\n/**\n * @defgroup lavc_misc Utility functions\n * @ingroup libavc\n *\n * Miscellaneous utility functions related to both encoding and decoding\n * (or neither).\n * @{\n */\n\n/**\n * @defgroup lavc_misc_pixfmt Pixel formats\n *\n * Functions for working with pixel formats.\n * @{\n */\n\n/**\n * Return a value representing the fourCC code associated to the\n * pixel format pix_fmt, or 0 if no associated fourCC code can be\n * found.\n */\nunsigned int avcodec_pix_fmt_to_codec_tag(enum AVPixelFormat pix_fmt);\n\n/**\n * Find the best pixel format to convert to given a certain source pixel\n * format.  When converting from one pixel format to another, information loss\n * may occur.  For example, when converting from RGB24 to GRAY, the color\n * information will be lost. Similarly, other losses occur when converting from\n * some formats to other formats. avcodec_find_best_pix_fmt_of_2() searches which of\n * the given pixel formats should be used to suffer the least amount of loss.\n * The pixel formats from which it chooses one, are determined by the\n * pix_fmt_list parameter.\n *\n *\n * @param[in] pix_fmt_list AV_PIX_FMT_NONE terminated array of pixel formats to choose from\n * @param[in] src_pix_fmt source pixel format\n * @param[in] has_alpha Whether the source pixel format alpha channel is used.\n * @param[out] loss_ptr Combination of flags informing you what kind of losses will occur.\n * @return The best pixel format to convert to or -1 if none was found.\n */\nenum AVPixelFormat avcodec_find_best_pix_fmt_of_list(const enum AVPixelFormat *pix_fmt_list,\n                                            enum AVPixelFormat src_pix_fmt,\n                                            int has_alpha, int *loss_ptr);\n\nenum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat * fmt);\n\n/**\n * @}\n */\n\nvoid avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode);\n\nint avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size);\nint avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int, int),void *arg, int *ret, int count);\n//FIXME func typedef\n\n/**\n * Fill AVFrame audio data and linesize pointers.\n *\n * The buffer buf must be a preallocated buffer with a size big enough\n * to contain the specified samples amount. The filled AVFrame data\n * pointers will point to this buffer.\n *\n * AVFrame extended_data channel pointers are allocated if necessary for\n * planar audio.\n *\n * @param frame       the AVFrame\n *                    frame->nb_samples must be set prior to calling the\n *                    function. This function fills in frame->data,\n *                    frame->extended_data, frame->linesize[0].\n * @param nb_channels channel count\n * @param sample_fmt  sample format\n * @param buf         buffer to use for frame data\n * @param buf_size    size of buffer\n * @param align       plane size sample alignment (0 = default)\n * @return            >=0 on success, negative error code on failure\n * @todo return the size in bytes required to store the samples in\n * case of success, at the next libavutil bump\n */\nint avcodec_fill_audio_frame(AVFrame *frame, int nb_channels,\n                             enum AVSampleFormat sample_fmt, const uint8_t *buf,\n                             int buf_size, int align);\n\n/**\n * Reset the internal codec state / flush internal buffers. Should be called\n * e.g. when seeking or when switching to a different stream.\n *\n * @note for decoders, this function just releases any references the decoder\n * might keep internally, but the caller's references remain valid.\n *\n * @note for encoders, this function will only do something if the encoder\n * declares support for AV_CODEC_CAP_ENCODER_FLUSH. When called, the encoder\n * will drain any remaining packets, and can then be reused for a different\n * stream (as opposed to sending a null frame which will leave the encoder\n * in a permanent EOF state after draining). This can be desirable if the\n * cost of tearing down and replacing the encoder instance is high.\n */\nvoid avcodec_flush_buffers(AVCodecContext *avctx);\n\n/**\n * Return audio frame duration.\n *\n * @param avctx        codec context\n * @param frame_bytes  size of the frame, or 0 if unknown\n * @return             frame duration, in samples, if known. 0 if not able to\n *                     determine.\n */\nint av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes);\n\n/* memory */\n\n/**\n * Same behaviour av_fast_malloc but the buffer has additional\n * AV_INPUT_BUFFER_PADDING_SIZE at the end which will always be 0.\n *\n * In addition the whole buffer will initially and after resizes\n * be 0-initialized so that no uninitialized data will ever appear.\n */\nvoid av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size);\n\n/**\n * Same behaviour av_fast_padded_malloc except that buffer will always\n * be 0-initialized after call.\n */\nvoid av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size);\n\n/**\n * @return a positive value if s is open (i.e. avcodec_open2() was called on it),\n * 0 otherwise.\n */\nint avcodec_is_open(AVCodecContext *s);\n\n/**\n * @}\n */\n\n#endif /* AVCODEC_AVCODEC_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/avdct.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_AVDCT_H\n#define AVCODEC_AVDCT_H\n\n#include \"libavutil/opt.h\"\n\n/**\n * AVDCT context.\n * @note function pointers can be NULL if the specific features have been\n *       disabled at build time.\n */\ntypedef struct AVDCT {\n    const AVClass *av_class;\n\n    void (*idct)(int16_t *block /* align 16 */);\n\n    /**\n     * IDCT input permutation.\n     * Several optimized IDCTs need a permutated input (relative to the\n     * normal order of the reference IDCT).\n     * This permutation must be performed before the idct_put/add.\n     * Note, normally this can be merged with the zigzag/alternate scan<br>\n     * An example to avoid confusion:\n     * - (->decode coeffs -> zigzag reorder -> dequant -> reference IDCT -> ...)\n     * - (x -> reference DCT -> reference IDCT -> x)\n     * - (x -> reference DCT -> simple_mmx_perm = idct_permutation\n     *    -> simple_idct_mmx -> x)\n     * - (-> decode coeffs -> zigzag reorder -> simple_mmx_perm -> dequant\n     *    -> simple_idct_mmx -> ...)\n     */\n    uint8_t idct_permutation[64];\n\n    void (*fdct)(int16_t *block /* align 16 */);\n\n\n    /**\n     * DCT algorithm.\n     * must use AVOptions to set this field.\n     */\n    int dct_algo;\n\n    /**\n     * IDCT algorithm.\n     * must use AVOptions to set this field.\n     */\n    int idct_algo;\n\n    void (*get_pixels)(int16_t *block /* align 16 */,\n                       const uint8_t *pixels /* align 8 */,\n                       ptrdiff_t line_size);\n\n    int bits_per_sample;\n\n    void (*get_pixels_unaligned)(int16_t *block /* align 16 */,\n                       const uint8_t *pixels,\n                       ptrdiff_t line_size);\n} AVDCT;\n\n/**\n * Allocates a AVDCT context.\n * This needs to be initialized with avcodec_dct_init() after optionally\n * configuring it with AVOptions.\n *\n * To free it use av_free()\n */\nAVDCT *avcodec_dct_alloc(void);\nint avcodec_dct_init(AVDCT *);\n\nconst AVClass *avcodec_dct_get_class(void);\n\n#endif /* AVCODEC_AVDCT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/bsf.h",
    "content": "/*\n * Bitstream filters public API\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_BSF_H\n#define AVCODEC_BSF_H\n\n#include \"libavutil/dict.h\"\n#include \"libavutil/log.h\"\n#include \"libavutil/rational.h\"\n\n#include \"codec_id.h\"\n#include \"codec_par.h\"\n#include \"packet.h\"\n\n/**\n * @defgroup lavc_bsf Bitstream filters\n * @ingroup libavc\n *\n * Bitstream filters transform encoded media data without decoding it. This\n * allows e.g. manipulating various header values. Bitstream filters operate on\n * @ref AVPacket \"AVPackets\".\n *\n * The bitstream filtering API is centered around two structures:\n * AVBitStreamFilter and AVBSFContext. The former represents a bitstream filter\n * in abstract, the latter a specific filtering process. Obtain an\n * AVBitStreamFilter using av_bsf_get_by_name() or av_bsf_iterate(), then pass\n * it to av_bsf_alloc() to create an AVBSFContext. Fill in the user-settable\n * AVBSFContext fields, as described in its documentation, then call\n * av_bsf_init() to prepare the filter context for use.\n *\n * Submit packets for filtering using av_bsf_send_packet(), obtain filtered\n * results with av_bsf_receive_packet(). When no more input packets will be\n * sent, submit a NULL AVPacket to signal the end of the stream to the filter.\n * av_bsf_receive_packet() will then return trailing packets, if any are\n * produced by the filter.\n *\n * Finally, free the filter context with av_bsf_free().\n * @{\n */\n\n/**\n * The bitstream filter state.\n *\n * This struct must be allocated with av_bsf_alloc() and freed with\n * av_bsf_free().\n *\n * The fields in the struct will only be changed (by the caller or by the\n * filter) as described in their documentation, and are to be considered\n * immutable otherwise.\n */\ntypedef struct AVBSFContext {\n    /**\n     * A class for logging and AVOptions\n     */\n    const AVClass *av_class;\n\n    /**\n     * The bitstream filter this context is an instance of.\n     */\n    const struct AVBitStreamFilter *filter;\n\n    /**\n     * Opaque filter-specific private data. If filter->priv_class is non-NULL,\n     * this is an AVOptions-enabled struct.\n     */\n    void *priv_data;\n\n    /**\n     * Parameters of the input stream. This field is allocated in\n     * av_bsf_alloc(), it needs to be filled by the caller before\n     * av_bsf_init().\n     */\n    AVCodecParameters *par_in;\n\n    /**\n     * Parameters of the output stream. This field is allocated in\n     * av_bsf_alloc(), it is set by the filter in av_bsf_init().\n     */\n    AVCodecParameters *par_out;\n\n    /**\n     * The timebase used for the timestamps of the input packets. Set by the\n     * caller before av_bsf_init().\n     */\n    AVRational time_base_in;\n\n    /**\n     * The timebase used for the timestamps of the output packets. Set by the\n     * filter in av_bsf_init().\n     */\n    AVRational time_base_out;\n} AVBSFContext;\n\ntypedef struct AVBitStreamFilter {\n    const char *name;\n\n    /**\n     * A list of codec ids supported by the filter, terminated by\n     * AV_CODEC_ID_NONE.\n     * May be NULL, in that case the bitstream filter works with any codec id.\n     */\n    const enum AVCodecID *codec_ids;\n\n    /**\n     * A class for the private data, used to declare bitstream filter private\n     * AVOptions. This field is NULL for bitstream filters that do not declare\n     * any options.\n     *\n     * If this field is non-NULL, the first member of the filter private data\n     * must be a pointer to AVClass, which will be set by libavcodec generic\n     * code to this class.\n     */\n    const AVClass *priv_class;\n} AVBitStreamFilter;\n\n/**\n * @return a bitstream filter with the specified name or NULL if no such\n *         bitstream filter exists.\n */\nconst AVBitStreamFilter *av_bsf_get_by_name(const char *name);\n\n/**\n * Iterate over all registered bitstream filters.\n *\n * @param opaque a pointer where libavcodec will store the iteration state. Must\n *               point to NULL to start the iteration.\n *\n * @return the next registered bitstream filter or NULL when the iteration is\n *         finished\n */\nconst AVBitStreamFilter *av_bsf_iterate(void **opaque);\n\n/**\n * Allocate a context for a given bitstream filter. The caller must fill in the\n * context parameters as described in the documentation and then call\n * av_bsf_init() before sending any data to the filter.\n *\n * @param filter the filter for which to allocate an instance.\n * @param[out] ctx a pointer into which the pointer to the newly-allocated context\n *                 will be written. It must be freed with av_bsf_free() after the\n *                 filtering is done.\n *\n * @return 0 on success, a negative AVERROR code on failure\n */\nint av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **ctx);\n\n/**\n * Prepare the filter for use, after all the parameters and options have been\n * set.\n *\n * @param ctx a AVBSFContext previously allocated with av_bsf_alloc()\n */\nint av_bsf_init(AVBSFContext *ctx);\n\n/**\n * Submit a packet for filtering.\n *\n * After sending each packet, the filter must be completely drained by calling\n * av_bsf_receive_packet() repeatedly until it returns AVERROR(EAGAIN) or\n * AVERROR_EOF.\n *\n * @param ctx an initialized AVBSFContext\n * @param pkt the packet to filter. The bitstream filter will take ownership of\n * the packet and reset the contents of pkt. pkt is not touched if an error occurs.\n * If pkt is empty (i.e. NULL, or pkt->data is NULL and pkt->side_data_elems zero),\n * it signals the end of the stream (i.e. no more non-empty packets will be sent;\n * sending more empty packets does nothing) and will cause the filter to output\n * any packets it may have buffered internally.\n *\n * @return\n *  - 0 on success.\n *  - AVERROR(EAGAIN) if packets need to be retrieved from the filter (using\n *    av_bsf_receive_packet()) before new input can be consumed.\n *  - Another negative AVERROR value if an error occurs.\n */\nint av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt);\n\n/**\n * Retrieve a filtered packet.\n *\n * @param ctx an initialized AVBSFContext\n * @param[out] pkt this struct will be filled with the contents of the filtered\n *                 packet. It is owned by the caller and must be freed using\n *                 av_packet_unref() when it is no longer needed.\n *                 This parameter should be \"clean\" (i.e. freshly allocated\n *                 with av_packet_alloc() or unreffed with av_packet_unref())\n *                 when this function is called. If this function returns\n *                 successfully, the contents of pkt will be completely\n *                 overwritten by the returned data. On failure, pkt is not\n *                 touched.\n *\n * @return\n *  - 0 on success.\n *  - AVERROR(EAGAIN) if more packets need to be sent to the filter (using\n *    av_bsf_send_packet()) to get more output.\n *  - AVERROR_EOF if there will be no further output from the filter.\n *  - Another negative AVERROR value if an error occurs.\n *\n * @note one input packet may result in several output packets, so after sending\n * a packet with av_bsf_send_packet(), this function needs to be called\n * repeatedly until it stops returning 0. It is also possible for a filter to\n * output fewer packets than were sent to it, so this function may return\n * AVERROR(EAGAIN) immediately after a successful av_bsf_send_packet() call.\n */\nint av_bsf_receive_packet(AVBSFContext *ctx, AVPacket *pkt);\n\n/**\n * Reset the internal bitstream filter state. Should be called e.g. when seeking.\n */\nvoid av_bsf_flush(AVBSFContext *ctx);\n\n/**\n * Free a bitstream filter context and everything associated with it; write NULL\n * into the supplied pointer.\n */\nvoid av_bsf_free(AVBSFContext **ctx);\n\n/**\n * Get the AVClass for AVBSFContext. It can be used in combination with\n * AV_OPT_SEARCH_FAKE_OBJ for examining options.\n *\n * @see av_opt_find().\n */\nconst AVClass *av_bsf_get_class(void);\n\n/**\n * Structure for chain/list of bitstream filters.\n * Empty list can be allocated by av_bsf_list_alloc().\n */\ntypedef struct AVBSFList AVBSFList;\n\n/**\n * Allocate empty list of bitstream filters.\n * The list must be later freed by av_bsf_list_free()\n * or finalized by av_bsf_list_finalize().\n *\n * @return Pointer to @ref AVBSFList on success, NULL in case of failure\n */\nAVBSFList *av_bsf_list_alloc(void);\n\n/**\n * Free list of bitstream filters.\n *\n * @param lst Pointer to pointer returned by av_bsf_list_alloc()\n */\nvoid av_bsf_list_free(AVBSFList **lst);\n\n/**\n * Append bitstream filter to the list of bitstream filters.\n *\n * @param lst List to append to\n * @param bsf Filter context to be appended\n *\n * @return >=0 on success, negative AVERROR in case of failure\n */\nint av_bsf_list_append(AVBSFList *lst, AVBSFContext *bsf);\n\n/**\n * Construct new bitstream filter context given it's name and options\n * and append it to the list of bitstream filters.\n *\n * @param lst      List to append to\n * @param bsf_name Name of the bitstream filter\n * @param options  Options for the bitstream filter, can be set to NULL\n *\n * @return >=0 on success, negative AVERROR in case of failure\n */\nint av_bsf_list_append2(AVBSFList *lst, const char * bsf_name, AVDictionary **options);\n/**\n * Finalize list of bitstream filters.\n *\n * This function will transform @ref AVBSFList to single @ref AVBSFContext,\n * so the whole chain of bitstream filters can be treated as single filter\n * freshly allocated by av_bsf_alloc().\n * If the call is successful, @ref AVBSFList structure is freed and lst\n * will be set to NULL. In case of failure, caller is responsible for\n * freeing the structure by av_bsf_list_free()\n *\n * @param      lst Filter list structure to be transformed\n * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure\n *                 representing the chain of bitstream filters\n *\n * @return >=0 on success, negative AVERROR in case of failure\n */\nint av_bsf_list_finalize(AVBSFList **lst, AVBSFContext **bsf);\n\n/**\n * Parse string describing list of bitstream filters and create single\n * @ref AVBSFContext describing the whole chain of bitstream filters.\n * Resulting @ref AVBSFContext can be treated as any other @ref AVBSFContext freshly\n * allocated by av_bsf_alloc().\n *\n * @param      str String describing chain of bitstream filters in format\n *                 `bsf1[=opt1=val1:opt2=val2][,bsf2]`\n * @param[out] bsf Pointer to be set to newly created @ref AVBSFContext structure\n *                 representing the chain of bitstream filters\n *\n * @return >=0 on success, negative AVERROR in case of failure\n */\nint av_bsf_list_parse_str(const char *str, AVBSFContext **bsf);\n\n/**\n * Get null/pass-through bitstream filter.\n *\n * @param[out] bsf Pointer to be set to new instance of pass-through bitstream filter\n *\n * @return\n */\nint av_bsf_get_null_filter(AVBSFContext **bsf);\n\n/**\n * @}\n */\n\n#endif // AVCODEC_BSF_H\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/codec.h",
    "content": "/*\n * AVCodec public API\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_CODEC_H\n#define AVCODEC_CODEC_H\n\n#include <stdint.h>\n\n#include \"libavutil/avutil.h\"\n#include \"libavutil/hwcontext.h\"\n#include \"libavutil/log.h\"\n#include \"libavutil/pixfmt.h\"\n#include \"libavutil/rational.h\"\n#include \"libavutil/samplefmt.h\"\n\n#include \"libavcodec/codec_id.h\"\n#include \"libavcodec/version_major.h\"\n\n/**\n * @addtogroup lavc_core\n * @{\n */\n\n/**\n * Decoder can use draw_horiz_band callback.\n */\n#define AV_CODEC_CAP_DRAW_HORIZ_BAND     (1 <<  0)\n/**\n * Codec uses get_buffer() or get_encode_buffer() for allocating buffers and\n * supports custom allocators.\n * If not set, it might not use get_buffer() or get_encode_buffer() at all, or\n * use operations that assume the buffer was allocated by\n * avcodec_default_get_buffer2 or avcodec_default_get_encode_buffer.\n */\n#define AV_CODEC_CAP_DR1                 (1 <<  1)\n/**\n * Encoder or decoder requires flushing with NULL input at the end in order to\n * give the complete and correct output.\n *\n * NOTE: If this flag is not set, the codec is guaranteed to never be fed with\n *       with NULL data. The user can still send NULL data to the public encode\n *       or decode function, but libavcodec will not pass it along to the codec\n *       unless this flag is set.\n *\n * Decoders:\n * The decoder has a non-zero delay and needs to be fed with avpkt->data=NULL,\n * avpkt->size=0 at the end to get the delayed data until the decoder no longer\n * returns frames.\n *\n * Encoders:\n * The encoder needs to be fed with NULL data at the end of encoding until the\n * encoder no longer returns data.\n *\n * NOTE: For encoders implementing the AVCodec.encode2() function, setting this\n *       flag also means that the encoder must set the pts and duration for\n *       each output packet. If this flag is not set, the pts and duration will\n *       be determined by libavcodec from the input frame.\n */\n#define AV_CODEC_CAP_DELAY               (1 <<  5)\n/**\n * Codec can be fed a final frame with a smaller size.\n * This can be used to prevent truncation of the last audio samples.\n */\n#define AV_CODEC_CAP_SMALL_LAST_FRAME    (1 <<  6)\n\n/**\n * Codec is experimental and is thus avoided in favor of non experimental\n * encoders\n */\n#define AV_CODEC_CAP_EXPERIMENTAL        (1 <<  9)\n/**\n * Codec should fill in channel configuration and samplerate instead of container\n */\n#define AV_CODEC_CAP_CHANNEL_CONF        (1 << 10)\n/**\n * Codec supports frame-level multithreading.\n */\n#define AV_CODEC_CAP_FRAME_THREADS       (1 << 12)\n/**\n * Codec supports slice-based (or partition-based) multithreading.\n */\n#define AV_CODEC_CAP_SLICE_THREADS       (1 << 13)\n/**\n * Codec supports changed parameters at any point.\n */\n#define AV_CODEC_CAP_PARAM_CHANGE        (1 << 14)\n/**\n * Codec supports multithreading through a method other than slice- or\n * frame-level multithreading. Typically this marks wrappers around\n * multithreading-capable external libraries.\n */\n#define AV_CODEC_CAP_OTHER_THREADS       (1 << 15)\n/**\n * Audio encoder supports receiving a different number of samples in each call.\n */\n#define AV_CODEC_CAP_VARIABLE_FRAME_SIZE (1 << 16)\n/**\n * Decoder is not a preferred choice for probing.\n * This indicates that the decoder is not a good choice for probing.\n * It could for example be an expensive to spin up hardware decoder,\n * or it could simply not provide a lot of useful information about\n * the stream.\n * A decoder marked with this flag should only be used as last resort\n * choice for probing.\n */\n#define AV_CODEC_CAP_AVOID_PROBING       (1 << 17)\n\n/**\n * Codec is backed by a hardware implementation. Typically used to\n * identify a non-hwaccel hardware decoder. For information about hwaccels, use\n * avcodec_get_hw_config() instead.\n */\n#define AV_CODEC_CAP_HARDWARE            (1 << 18)\n\n/**\n * Codec is potentially backed by a hardware implementation, but not\n * necessarily. This is used instead of AV_CODEC_CAP_HARDWARE, if the\n * implementation provides some sort of internal fallback.\n */\n#define AV_CODEC_CAP_HYBRID              (1 << 19)\n\n/**\n * This encoder can reorder user opaque values from input AVFrames and return\n * them with corresponding output packets.\n * @see AV_CODEC_FLAG_COPY_OPAQUE\n */\n#define AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE (1 << 20)\n\n/**\n * This encoder can be flushed using avcodec_flush_buffers(). If this flag is\n * not set, the encoder must be closed and reopened to ensure that no frames\n * remain pending.\n */\n#define AV_CODEC_CAP_ENCODER_FLUSH   (1 << 21)\n\n/**\n * The encoder is able to output reconstructed frame data, i.e. raw frames that\n * would be produced by decoding the encoded bitstream.\n *\n * Reconstructed frame output is enabled by the AV_CODEC_FLAG_RECON_FRAME flag.\n */\n#define AV_CODEC_CAP_ENCODER_RECON_FRAME (1 << 22)\n\n/**\n * AVProfile.\n */\ntypedef struct AVProfile {\n    int profile;\n    const char *name; ///< short name for the profile\n} AVProfile;\n\n/**\n * AVCodec.\n */\ntypedef struct AVCodec {\n    /**\n     * Name of the codec implementation.\n     * The name is globally unique among encoders and among decoders (but an\n     * encoder and a decoder can share the same name).\n     * This is the primary way to find a codec from the user perspective.\n     */\n    const char *name;\n    /**\n     * Descriptive name for the codec, meant to be more human readable than name.\n     * You should use the NULL_IF_CONFIG_SMALL() macro to define it.\n     */\n    const char *long_name;\n    enum AVMediaTypeFFmpeg type;\n    enum AVCodecID id;\n    /**\n     * Codec capabilities.\n     * see AV_CODEC_CAP_*\n     */\n    int capabilities;\n    uint8_t max_lowres;                     ///< maximum value for lowres supported by the decoder\n\n    /**\n     * Deprecated codec capabilities.\n     */\n    attribute_deprecated\n    const AVRational *supported_framerates; ///< @deprecated use avcodec_get_supported_config()\n    attribute_deprecated\n    const enum AVPixelFormat *pix_fmts;     ///< @deprecated use avcodec_get_supported_config()\n    attribute_deprecated\n    const int *supported_samplerates;       ///< @deprecated use avcodec_get_supported_config()\n    attribute_deprecated\n    const enum AVSampleFormat *sample_fmts; ///< @deprecated use avcodec_get_supported_config()\n\n    const AVClass *priv_class;              ///< AVClass for the private context\n    const AVProfile *profiles;              ///< array of recognized profiles, or NULL if unknown, array is terminated by {AV_PROFILE_UNKNOWN}\n\n    /**\n     * Group name of the codec implementation.\n     * This is a short symbolic name of the wrapper backing this codec. A\n     * wrapper uses some kind of external implementation for the codec, such\n     * as an external library, or a codec implementation provided by the OS or\n     * the hardware.\n     * If this field is NULL, this is a builtin, libavcodec native codec.\n     * If non-NULL, this will be the suffix in AVCodec.name in most cases\n     * (usually AVCodec.name will be of the form \"<codec_name>_<wrapper_name>\").\n     */\n    const char *wrapper_name;\n\n    /**\n     * Array of supported channel layouts, terminated with a zeroed layout.\n     * @deprecated use avcodec_get_supported_config()\n     */\n    attribute_deprecated\n    const AVChannelLayout *ch_layouts;\n} AVCodec;\n\n/**\n * Iterate over all registered codecs.\n *\n * @param opaque a pointer where libavcodec will store the iteration state. Must\n *               point to NULL to start the iteration.\n *\n * @return the next registered codec or NULL when the iteration is\n *         finished\n */\nconst AVCodec *av_codec_iterate(void **opaque);\n\n/**\n * Find a registered decoder with a matching codec ID.\n *\n * @param id AVCodecID of the requested decoder\n * @return A decoder if one was found, NULL otherwise.\n */\nconst AVCodec *avcodec_find_decoder(enum AVCodecID id);\n\n/**\n * Find a registered decoder with the specified name.\n *\n * @param name name of the requested decoder\n * @return A decoder if one was found, NULL otherwise.\n */\nconst AVCodec *avcodec_find_decoder_by_name(const char *name);\n\n/**\n * Find a registered encoder with a matching codec ID.\n *\n * @param id AVCodecID of the requested encoder\n * @return An encoder if one was found, NULL otherwise.\n */\nconst AVCodec *avcodec_find_encoder(enum AVCodecID id);\n\n/**\n * Find a registered encoder with the specified name.\n *\n * @param name name of the requested encoder\n * @return An encoder if one was found, NULL otherwise.\n */\nconst AVCodec *avcodec_find_encoder_by_name(const char *name);\n/**\n * @return a non-zero number if codec is an encoder, zero otherwise\n */\nint av_codec_is_encoder(const AVCodec *codec);\n\n/**\n * @return a non-zero number if codec is a decoder, zero otherwise\n */\nint av_codec_is_decoder(const AVCodec *codec);\n\n/**\n * Return a name for the specified profile, if available.\n *\n * @param codec the codec that is searched for the given profile\n * @param profile the profile value for which a name is requested\n * @return A name for the profile if found, NULL otherwise.\n */\nconst char *av_get_profile_name(const AVCodec *codec, int profile);\n\nenum {\n    /**\n     * The codec supports this format via the hw_device_ctx interface.\n     *\n     * When selecting this format, AVCodecContext.hw_device_ctx should\n     * have been set to a device of the specified type before calling\n     * avcodec_open2().\n     */\n    AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX = 0x01,\n    /**\n     * The codec supports this format via the hw_frames_ctx interface.\n     *\n     * When selecting this format for a decoder,\n     * AVCodecContext.hw_frames_ctx should be set to a suitable frames\n     * context inside the get_format() callback.  The frames context\n     * must have been created on a device of the specified type.\n     *\n     * When selecting this format for an encoder,\n     * AVCodecContext.hw_frames_ctx should be set to the context which\n     * will be used for the input frames before calling avcodec_open2().\n     */\n    AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX = 0x02,\n    /**\n     * The codec supports this format by some internal method.\n     *\n     * This format can be selected without any additional configuration -\n     * no device or frames context is required.\n     */\n    AV_CODEC_HW_CONFIG_METHOD_INTERNAL      = 0x04,\n    /**\n     * The codec supports this format by some ad-hoc method.\n     *\n     * Additional settings and/or function calls are required.  See the\n     * codec-specific documentation for details.  (Methods requiring\n     * this sort of configuration are deprecated and others should be\n     * used in preference.)\n     */\n    AV_CODEC_HW_CONFIG_METHOD_AD_HOC        = 0x08,\n};\n\ntypedef struct AVCodecHWConfig {\n    /**\n     * For decoders, a hardware pixel format which that decoder may be\n     * able to decode to if suitable hardware is available.\n     *\n     * For encoders, a pixel format which the encoder may be able to\n     * accept.  If set to AV_PIX_FMT_NONE, this applies to all pixel\n     * formats supported by the codec.\n     */\n    enum AVPixelFormat pix_fmt;\n    /**\n     * Bit set of AV_CODEC_HW_CONFIG_METHOD_* flags, describing the possible\n     * setup methods which can be used with this configuration.\n     */\n    int methods;\n    /**\n     * The device type associated with the configuration.\n     *\n     * Must be set for AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX and\n     * AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, otherwise unused.\n     */\n    enum AVHWDeviceType device_type;\n} AVCodecHWConfig;\n\n/**\n * Retrieve supported hardware configurations for a codec.\n *\n * Values of index from zero to some maximum return the indexed configuration\n * descriptor; all other values return NULL.  If the codec does not support\n * any hardware configurations then it will always return NULL.\n */\nconst AVCodecHWConfig *avcodec_get_hw_config(const AVCodec *codec, int index);\n\n/**\n * @}\n */\n\n#endif /* AVCODEC_CODEC_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/codec_desc.h",
    "content": "/*\n * Codec descriptors public API\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_CODEC_DESC_H\n#define AVCODEC_CODEC_DESC_H\n\n#include \"libavutil/avutil.h\"\n\n#include \"codec_id.h\"\n\n/**\n * @addtogroup lavc_core\n * @{\n */\n\n/**\n * This struct describes the properties of a single codec described by an\n * AVCodecID.\n * @see avcodec_descriptor_get()\n */\ntypedef struct AVCodecDescriptor {\n    enum AVCodecID     id;\n    enum AVMediaTypeFFmpeg type;\n    /**\n     * Name of the codec described by this descriptor. It is non-empty and\n     * unique for each codec descriptor. It should contain alphanumeric\n     * characters and '_' only.\n     */\n    const char      *name;\n    /**\n     * A more descriptive name for this codec. May be NULL.\n     */\n    const char *long_name;\n    /**\n     * Codec properties, a combination of AV_CODEC_PROP_* flags.\n     */\n    int             props;\n    /**\n     * MIME type(s) associated with the codec.\n     * May be NULL; if not, a NULL-terminated array of MIME types.\n     * The first item is always non-NULL and is the preferred MIME type.\n     */\n    const char *const *mime_types;\n    /**\n     * If non-NULL, an array of profiles recognized for this codec.\n     * Terminated with AV_PROFILE_UNKNOWN.\n     */\n    const struct AVProfile *profiles;\n} AVCodecDescriptor;\n\n/**\n * Codec uses only intra compression.\n * Video and audio codecs only.\n */\n#define AV_CODEC_PROP_INTRA_ONLY    (1 << 0)\n/**\n * Codec supports lossy compression. Audio and video codecs only.\n * @note a codec may support both lossy and lossless\n * compression modes\n */\n#define AV_CODEC_PROP_LOSSY         (1 << 1)\n/**\n * Codec supports lossless compression. Audio and video codecs only.\n */\n#define AV_CODEC_PROP_LOSSLESS      (1 << 2)\n/**\n * Codec supports frame reordering. That is, the coded order (the order in which\n * the encoded packets are output by the encoders / stored / input to the\n * decoders) may be different from the presentation order of the corresponding\n * frames.\n *\n * For codecs that do not have this property set, PTS and DTS should always be\n * equal.\n */\n#define AV_CODEC_PROP_REORDER       (1 << 3)\n\n/**\n * Video codec supports separate coding of fields in interlaced frames.\n */\n#define AV_CODEC_PROP_FIELDS        (1 << 4)\n\n/**\n * Subtitle codec is bitmap based\n * Decoded AVSubtitle data can be read from the AVSubtitleRect->pict field.\n */\n#define AV_CODEC_PROP_BITMAP_SUB    (1 << 16)\n/**\n * Subtitle codec is text based.\n * Decoded AVSubtitle data can be read from the AVSubtitleRect->ass field.\n */\n#define AV_CODEC_PROP_TEXT_SUB      (1 << 17)\n\n/**\n * @return descriptor for given codec ID or NULL if no descriptor exists.\n */\nconst AVCodecDescriptor *avcodec_descriptor_get(enum AVCodecID id);\n\n/**\n * Iterate over all codec descriptors known to libavcodec.\n *\n * @param prev previous descriptor. NULL to get the first descriptor.\n *\n * @return next descriptor or NULL after the last descriptor\n */\nconst AVCodecDescriptor *avcodec_descriptor_next(const AVCodecDescriptor *prev);\n\n/**\n * @return codec descriptor with the given name or NULL if no such descriptor\n *         exists.\n */\nconst AVCodecDescriptor *avcodec_descriptor_get_by_name(const char *name);\n\n/**\n * @}\n */\n\n#endif // AVCODEC_CODEC_DESC_H\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/codec_id.h",
    "content": "/*\n * Codec IDs\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_CODEC_ID_H\n#define AVCODEC_CODEC_ID_H\n\n#include \"libavutil/avutil.h\"\n#include \"libavutil/samplefmt.h\"\n\n#include \"version_major.h\"\n\n/**\n * @addtogroup lavc_core\n * @{\n */\n\n/**\n * Identify the syntax and semantics of the bitstream.\n * The principle is roughly:\n * Two decoders with the same ID can decode the same streams.\n * Two encoders with the same ID can encode compatible streams.\n * There may be slight deviations from the principle due to implementation\n * details.\n *\n * If you add a codec ID to this list, add it so that\n * 1. no value of an existing codec ID changes (that would break ABI),\n * 2. it is as close as possible to similar codecs\n *\n * After adding new codec IDs, do not forget to add an entry to the codec\n * descriptor list and bump libavcodec minor version.\n */\nenum AVCodecID {\n    AV_CODEC_ID_NONE,\n\n    /* video codecs */\n    AV_CODEC_ID_MPEG1VIDEO,\n    AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding\n    AV_CODEC_ID_H261,\n    AV_CODEC_ID_H263,\n    AV_CODEC_ID_RV10,\n    AV_CODEC_ID_RV20,\n    AV_CODEC_ID_MJPEG,\n    AV_CODEC_ID_MJPEGB,\n    AV_CODEC_ID_LJPEG,\n    AV_CODEC_ID_SP5X,\n    AV_CODEC_ID_JPEGLS,\n    AV_CODEC_ID_MPEG4,\n    AV_CODEC_ID_RAWVIDEO,\n    AV_CODEC_ID_MSMPEG4V1,\n    AV_CODEC_ID_MSMPEG4V2,\n    AV_CODEC_ID_MSMPEG4V3,\n    AV_CODEC_ID_WMV1,\n    AV_CODEC_ID_WMV2,\n    AV_CODEC_ID_H263P,\n    AV_CODEC_ID_H263I,\n    AV_CODEC_ID_FLV1,\n    AV_CODEC_ID_SVQ1,\n    AV_CODEC_ID_SVQ3,\n    AV_CODEC_ID_DVVIDEO,\n    AV_CODEC_ID_HUFFYUV,\n    AV_CODEC_ID_CYUV,\n    AV_CODEC_ID_H264,\n    AV_CODEC_ID_INDEO3,\n    AV_CODEC_ID_VP3,\n    AV_CODEC_ID_THEORA,\n    AV_CODEC_ID_ASV1,\n    AV_CODEC_ID_ASV2,\n    AV_CODEC_ID_FFV1,\n    AV_CODEC_ID_4XM,\n    AV_CODEC_ID_VCR1,\n    AV_CODEC_ID_CLJR,\n    AV_CODEC_ID_MDEC,\n    AV_CODEC_ID_ROQ,\n    AV_CODEC_ID_INTERPLAY_VIDEO,\n    AV_CODEC_ID_XAN_WC3,\n    AV_CODEC_ID_XAN_WC4,\n    AV_CODEC_ID_RPZA,\n    AV_CODEC_ID_CINEPAK,\n    AV_CODEC_ID_WS_VQA,\n    AV_CODEC_ID_MSRLE,\n    AV_CODEC_ID_MSVIDEO1,\n    AV_CODEC_ID_IDCIN,\n    AV_CODEC_ID_8BPS,\n    AV_CODEC_ID_SMC,\n    AV_CODEC_ID_FLIC,\n    AV_CODEC_ID_TRUEMOTION1,\n    AV_CODEC_ID_VMDVIDEO,\n    AV_CODEC_ID_MSZH,\n    AV_CODEC_ID_ZLIB,\n    AV_CODEC_ID_QTRLE,\n    AV_CODEC_ID_TSCC,\n    AV_CODEC_ID_ULTI,\n    AV_CODEC_ID_QDRAW,\n    AV_CODEC_ID_VIXL,\n    AV_CODEC_ID_QPEG,\n    AV_CODEC_ID_PNG,\n    AV_CODEC_ID_PPM,\n    AV_CODEC_ID_PBM,\n    AV_CODEC_ID_PGM,\n    AV_CODEC_ID_PGMYUV,\n    AV_CODEC_ID_PAM,\n    AV_CODEC_ID_FFVHUFF,\n    AV_CODEC_ID_RV30,\n    AV_CODEC_ID_RV40,\n    AV_CODEC_ID_VC1,\n    AV_CODEC_ID_WMV3,\n    AV_CODEC_ID_LOCO,\n    AV_CODEC_ID_WNV1,\n    AV_CODEC_ID_AASC,\n    AV_CODEC_ID_INDEO2,\n    AV_CODEC_ID_FRAPS,\n    AV_CODEC_ID_TRUEMOTION2,\n    AV_CODEC_ID_BMP,\n    AV_CODEC_ID_CSCD,\n    AV_CODEC_ID_MMVIDEO,\n    AV_CODEC_ID_ZMBV,\n    AV_CODEC_ID_AVS,\n    AV_CODEC_ID_SMACKVIDEO,\n    AV_CODEC_ID_NUV,\n    AV_CODEC_ID_KMVC,\n    AV_CODEC_ID_FLASHSV,\n    AV_CODEC_ID_CAVS,\n    AV_CODEC_ID_JPEG2000,\n    AV_CODEC_ID_VMNC,\n    AV_CODEC_ID_VP5,\n    AV_CODEC_ID_VP6,\n    AV_CODEC_ID_VP6F,\n    AV_CODEC_ID_TARGA,\n    AV_CODEC_ID_DSICINVIDEO,\n    AV_CODEC_ID_TIERTEXSEQVIDEO,\n    AV_CODEC_ID_TIFF,\n    AV_CODEC_ID_GIF,\n    AV_CODEC_ID_DXA,\n    AV_CODEC_ID_DNXHD,\n    AV_CODEC_ID_THP,\n    AV_CODEC_ID_SGI,\n    AV_CODEC_ID_C93,\n    AV_CODEC_ID_BETHSOFTVID,\n    AV_CODEC_ID_PTX,\n    AV_CODEC_ID_TXD,\n    AV_CODEC_ID_VP6A,\n    AV_CODEC_ID_AMV,\n    AV_CODEC_ID_VB,\n    AV_CODEC_ID_PCX,\n    AV_CODEC_ID_SUNRAST,\n    AV_CODEC_ID_INDEO4,\n    AV_CODEC_ID_INDEO5,\n    AV_CODEC_ID_MIMIC,\n    AV_CODEC_ID_RL2,\n    AV_CODEC_ID_ESCAPE124,\n    AV_CODEC_ID_DIRAC,\n    AV_CODEC_ID_BFI,\n    AV_CODEC_ID_CMV,\n    AV_CODEC_ID_MOTIONPIXELS,\n    AV_CODEC_ID_TGV,\n    AV_CODEC_ID_TGQ,\n    AV_CODEC_ID_TQI,\n    AV_CODEC_ID_AURA,\n    AV_CODEC_ID_AURA2,\n    AV_CODEC_ID_V210X,\n    AV_CODEC_ID_TMV,\n    AV_CODEC_ID_V210,\n    AV_CODEC_ID_DPX,\n    AV_CODEC_ID_MAD,\n    AV_CODEC_ID_FRWU,\n    AV_CODEC_ID_FLASHSV2,\n    AV_CODEC_ID_CDGRAPHICS,\n    AV_CODEC_ID_R210,\n    AV_CODEC_ID_ANM,\n    AV_CODEC_ID_BINKVIDEO,\n    AV_CODEC_ID_IFF_ILBM,\n#define AV_CODEC_ID_IFF_BYTERUN1 AV_CODEC_ID_IFF_ILBM\n    AV_CODEC_ID_KGV1,\n    AV_CODEC_ID_YOP,\n    AV_CODEC_ID_VP8,\n    AV_CODEC_ID_PICTOR,\n    AV_CODEC_ID_ANSI,\n    AV_CODEC_ID_A64_MULTI,\n    AV_CODEC_ID_A64_MULTI5,\n    AV_CODEC_ID_R10K,\n    AV_CODEC_ID_MXPEG,\n    AV_CODEC_ID_LAGARITH,\n    AV_CODEC_ID_PRORES,\n    AV_CODEC_ID_JV,\n    AV_CODEC_ID_DFA,\n    AV_CODEC_ID_WMV3IMAGE,\n    AV_CODEC_ID_VC1IMAGE,\n    AV_CODEC_ID_UTVIDEO,\n    AV_CODEC_ID_BMV_VIDEO,\n    AV_CODEC_ID_VBLE,\n    AV_CODEC_ID_DXTORY,\n#if FF_API_V408_CODECID\n    AV_CODEC_ID_V410,\n#endif\n    AV_CODEC_ID_XWD,\n    AV_CODEC_ID_CDXL,\n    AV_CODEC_ID_XBM,\n    AV_CODEC_ID_ZEROCODEC,\n    AV_CODEC_ID_MSS1,\n    AV_CODEC_ID_MSA1,\n    AV_CODEC_ID_TSCC2,\n    AV_CODEC_ID_MTS2,\n    AV_CODEC_ID_CLLC,\n    AV_CODEC_ID_MSS2,\n    AV_CODEC_ID_VP9,\n    AV_CODEC_ID_AIC,\n    AV_CODEC_ID_ESCAPE130,\n    AV_CODEC_ID_G2M,\n    AV_CODEC_ID_WEBP,\n    AV_CODEC_ID_HNM4_VIDEO,\n    AV_CODEC_ID_HEVC,\n#define AV_CODEC_ID_H265 AV_CODEC_ID_HEVC\n    AV_CODEC_ID_FIC,\n    AV_CODEC_ID_ALIAS_PIX,\n    AV_CODEC_ID_BRENDER_PIX,\n    AV_CODEC_ID_PAF_VIDEO,\n    AV_CODEC_ID_EXR,\n    AV_CODEC_ID_VP7,\n    AV_CODEC_ID_SANM,\n    AV_CODEC_ID_SGIRLE,\n    AV_CODEC_ID_MVC1,\n    AV_CODEC_ID_MVC2,\n    AV_CODEC_ID_HQX,\n    AV_CODEC_ID_TDSC,\n    AV_CODEC_ID_HQ_HQA,\n    AV_CODEC_ID_HAP,\n    AV_CODEC_ID_DDS,\n    AV_CODEC_ID_DXV,\n    AV_CODEC_ID_SCREENPRESSO,\n    AV_CODEC_ID_RSCC,\n    AV_CODEC_ID_AVS2,\n    AV_CODEC_ID_PGX,\n    AV_CODEC_ID_AVS3,\n    AV_CODEC_ID_MSP2,\n    AV_CODEC_ID_VVC,\n#define AV_CODEC_ID_H266 AV_CODEC_ID_VVC\n    AV_CODEC_ID_Y41P,\n    AV_CODEC_ID_AVRP,\n    AV_CODEC_ID_012V,\n    AV_CODEC_ID_AVUI,\n    AV_CODEC_ID_TARGA_Y216,\n#if FF_API_V408_CODECID\n    AV_CODEC_ID_V308,\n    AV_CODEC_ID_V408,\n#endif\n    AV_CODEC_ID_YUV4,\n    AV_CODEC_ID_AVRN,\n    AV_CODEC_ID_CPIA,\n    AV_CODEC_ID_XFACE,\n    AV_CODEC_ID_SNOW,\n    AV_CODEC_ID_SMVJPEG,\n    AV_CODEC_ID_APNG,\n    AV_CODEC_ID_DAALA,\n    AV_CODEC_ID_CFHD,\n    AV_CODEC_ID_TRUEMOTION2RT,\n    AV_CODEC_ID_M101,\n    AV_CODEC_ID_MAGICYUV,\n    AV_CODEC_ID_SHEERVIDEO,\n    AV_CODEC_ID_YLC,\n    AV_CODEC_ID_PSD,\n    AV_CODEC_ID_PIXLET,\n    AV_CODEC_ID_SPEEDHQ,\n    AV_CODEC_ID_FMVC,\n    AV_CODEC_ID_SCPR,\n    AV_CODEC_ID_CLEARVIDEO,\n    AV_CODEC_ID_XPM,\n    AV_CODEC_ID_AV1,\n    AV_CODEC_ID_BITPACKED,\n    AV_CODEC_ID_MSCC,\n    AV_CODEC_ID_SRGC,\n    AV_CODEC_ID_SVG,\n    AV_CODEC_ID_GDV,\n    AV_CODEC_ID_FITS,\n    AV_CODEC_ID_IMM4,\n    AV_CODEC_ID_PROSUMER,\n    AV_CODEC_ID_MWSC,\n    AV_CODEC_ID_WCMV,\n    AV_CODEC_ID_RASC,\n    AV_CODEC_ID_HYMT,\n    AV_CODEC_ID_ARBC,\n    AV_CODEC_ID_AGM,\n    AV_CODEC_ID_LSCR,\n    AV_CODEC_ID_VP4,\n    AV_CODEC_ID_IMM5,\n    AV_CODEC_ID_MVDV,\n    AV_CODEC_ID_MVHA,\n    AV_CODEC_ID_CDTOONS,\n    AV_CODEC_ID_MV30,\n    AV_CODEC_ID_NOTCHLC,\n    AV_CODEC_ID_PFM,\n    AV_CODEC_ID_MOBICLIP,\n    AV_CODEC_ID_PHOTOCD,\n    AV_CODEC_ID_IPU,\n    AV_CODEC_ID_ARGO,\n    AV_CODEC_ID_CRI,\n    AV_CODEC_ID_SIMBIOSIS_IMX,\n    AV_CODEC_ID_SGA_VIDEO,\n    AV_CODEC_ID_GEM,\n    AV_CODEC_ID_VBN,\n    AV_CODEC_ID_JPEGXL,\n    AV_CODEC_ID_QOI,\n    AV_CODEC_ID_PHM,\n    AV_CODEC_ID_RADIANCE_HDR,\n    AV_CODEC_ID_WBMP,\n    AV_CODEC_ID_MEDIA100,\n    AV_CODEC_ID_VQC,\n    AV_CODEC_ID_PDV,\n    AV_CODEC_ID_EVC,\n    AV_CODEC_ID_RTV1,\n    AV_CODEC_ID_VMIX,\n    AV_CODEC_ID_LEAD,\n    AV_CODEC_ID_DNXUC,\n    AV_CODEC_ID_RV60,\n    AV_CODEC_ID_JPEGXL_ANIM,\n    AV_CODEC_ID_APV,\n    AV_CODEC_ID_PRORES_RAW,\n\n    /* various PCM \"codecs\" */\n    AV_CODEC_ID_FIRST_AUDIO = 0x10000,     ///< A dummy id pointing at the start of audio codecs\n    AV_CODEC_ID_PCM_S16LE = 0x10000,\n    AV_CODEC_ID_PCM_S16BE,\n    AV_CODEC_ID_PCM_U16LE,\n    AV_CODEC_ID_PCM_U16BE,\n    AV_CODEC_ID_PCM_S8,\n    AV_CODEC_ID_PCM_U8,\n    AV_CODEC_ID_PCM_MULAW,\n    AV_CODEC_ID_PCM_ALAW,\n    AV_CODEC_ID_PCM_S32LE,\n    AV_CODEC_ID_PCM_S32BE,\n    AV_CODEC_ID_PCM_U32LE,\n    AV_CODEC_ID_PCM_U32BE,\n    AV_CODEC_ID_PCM_S24LE,\n    AV_CODEC_ID_PCM_S24BE,\n    AV_CODEC_ID_PCM_U24LE,\n    AV_CODEC_ID_PCM_U24BE,\n    AV_CODEC_ID_PCM_S24DAUD,\n    AV_CODEC_ID_PCM_ZORK,\n    AV_CODEC_ID_PCM_S16LE_PLANAR,\n    AV_CODEC_ID_PCM_DVD,\n    AV_CODEC_ID_PCM_F32BE,\n    AV_CODEC_ID_PCM_F32LE,\n    AV_CODEC_ID_PCM_F64BE,\n    AV_CODEC_ID_PCM_F64LE,\n    AV_CODEC_ID_PCM_BLURAY,\n    AV_CODEC_ID_PCM_LXF,\n    AV_CODEC_ID_S302M,\n    AV_CODEC_ID_PCM_S8_PLANAR,\n    AV_CODEC_ID_PCM_S24LE_PLANAR,\n    AV_CODEC_ID_PCM_S32LE_PLANAR,\n    AV_CODEC_ID_PCM_S16BE_PLANAR,\n    AV_CODEC_ID_PCM_S64LE,\n    AV_CODEC_ID_PCM_S64BE,\n    AV_CODEC_ID_PCM_F16LE,\n    AV_CODEC_ID_PCM_F24LE,\n    AV_CODEC_ID_PCM_VIDC,\n    AV_CODEC_ID_PCM_SGA,\n\n    /* various ADPCM codecs */\n    AV_CODEC_ID_ADPCM_IMA_QT = 0x11000,\n    AV_CODEC_ID_ADPCM_IMA_WAV,\n    AV_CODEC_ID_ADPCM_IMA_DK3,\n    AV_CODEC_ID_ADPCM_IMA_DK4,\n    AV_CODEC_ID_ADPCM_IMA_WS,\n    AV_CODEC_ID_ADPCM_IMA_SMJPEG,\n    AV_CODEC_ID_ADPCM_MS,\n    AV_CODEC_ID_ADPCM_4XM,\n    AV_CODEC_ID_ADPCM_XA,\n    AV_CODEC_ID_ADPCM_ADX,\n    AV_CODEC_ID_ADPCM_EA,\n    AV_CODEC_ID_ADPCM_G726,\n    AV_CODEC_ID_ADPCM_CT,\n    AV_CODEC_ID_ADPCM_SWF,\n    AV_CODEC_ID_ADPCM_YAMAHA,\n    AV_CODEC_ID_ADPCM_SBPRO_4,\n    AV_CODEC_ID_ADPCM_SBPRO_3,\n    AV_CODEC_ID_ADPCM_SBPRO_2,\n    AV_CODEC_ID_ADPCM_THP,\n    AV_CODEC_ID_ADPCM_IMA_AMV,\n    AV_CODEC_ID_ADPCM_EA_R1,\n    AV_CODEC_ID_ADPCM_EA_R3,\n    AV_CODEC_ID_ADPCM_EA_R2,\n    AV_CODEC_ID_ADPCM_IMA_EA_SEAD,\n    AV_CODEC_ID_ADPCM_IMA_EA_EACS,\n    AV_CODEC_ID_ADPCM_EA_XAS,\n    AV_CODEC_ID_ADPCM_EA_MAXIS_XA,\n    AV_CODEC_ID_ADPCM_IMA_ISS,\n    AV_CODEC_ID_ADPCM_G722,\n    AV_CODEC_ID_ADPCM_IMA_APC,\n    AV_CODEC_ID_ADPCM_VIMA,\n    AV_CODEC_ID_ADPCM_AFC,\n    AV_CODEC_ID_ADPCM_IMA_OKI,\n    AV_CODEC_ID_ADPCM_DTK,\n    AV_CODEC_ID_ADPCM_IMA_RAD,\n    AV_CODEC_ID_ADPCM_G726LE,\n    AV_CODEC_ID_ADPCM_THP_LE,\n    AV_CODEC_ID_ADPCM_PSX,\n    AV_CODEC_ID_ADPCM_AICA,\n    AV_CODEC_ID_ADPCM_IMA_DAT4,\n    AV_CODEC_ID_ADPCM_MTAF,\n    AV_CODEC_ID_ADPCM_AGM,\n    AV_CODEC_ID_ADPCM_ARGO,\n    AV_CODEC_ID_ADPCM_IMA_SSI,\n    AV_CODEC_ID_ADPCM_ZORK,\n    AV_CODEC_ID_ADPCM_IMA_APM,\n    AV_CODEC_ID_ADPCM_IMA_ALP,\n    AV_CODEC_ID_ADPCM_IMA_MTF,\n    AV_CODEC_ID_ADPCM_IMA_CUNNING,\n    AV_CODEC_ID_ADPCM_IMA_MOFLEX,\n    AV_CODEC_ID_ADPCM_IMA_ACORN,\n    AV_CODEC_ID_ADPCM_XMD,\n    AV_CODEC_ID_ADPCM_IMA_XBOX,\n    AV_CODEC_ID_ADPCM_SANYO,\n\n    /* AMR */\n    AV_CODEC_ID_AMR_NB = 0x12000,\n    AV_CODEC_ID_AMR_WB,\n\n    /* RealAudio codecs*/\n    AV_CODEC_ID_RA_144 = 0x13000,\n    AV_CODEC_ID_RA_288,\n\n    /* various DPCM codecs */\n    AV_CODEC_ID_ROQ_DPCM = 0x14000,\n    AV_CODEC_ID_INTERPLAY_DPCM,\n    AV_CODEC_ID_XAN_DPCM,\n    AV_CODEC_ID_SOL_DPCM,\n    AV_CODEC_ID_SDX2_DPCM,\n    AV_CODEC_ID_GREMLIN_DPCM,\n    AV_CODEC_ID_DERF_DPCM,\n    AV_CODEC_ID_WADY_DPCM,\n    AV_CODEC_ID_CBD2_DPCM,\n\n    /* audio codecs */\n    AV_CODEC_ID_MP2 = 0x15000,\n    AV_CODEC_ID_MP3, ///< preferred ID for decoding MPEG audio layer 1, 2 or 3\n    AV_CODEC_ID_AAC,\n    AV_CODEC_ID_AC3,\n    AV_CODEC_ID_DTS,\n    AV_CODEC_ID_VORBIS,\n    AV_CODEC_ID_DVAUDIO,\n    AV_CODEC_ID_WMAV1,\n    AV_CODEC_ID_WMAV2,\n    AV_CODEC_ID_MACE3,\n    AV_CODEC_ID_MACE6,\n    AV_CODEC_ID_VMDAUDIO,\n    AV_CODEC_ID_FLAC,\n    AV_CODEC_ID_MP3ADU,\n    AV_CODEC_ID_MP3ON4,\n    AV_CODEC_ID_SHORTEN,\n    AV_CODEC_ID_ALAC,\n    AV_CODEC_ID_WESTWOOD_SND1,\n    AV_CODEC_ID_GSM, ///< as in Berlin toast format\n    AV_CODEC_ID_QDM2,\n    AV_CODEC_ID_COOK,\n    AV_CODEC_ID_TRUESPEECH,\n    AV_CODEC_ID_TTA,\n    AV_CODEC_ID_SMACKAUDIO,\n    AV_CODEC_ID_QCELP,\n    AV_CODEC_ID_WAVPACK,\n    AV_CODEC_ID_DSICINAUDIO,\n    AV_CODEC_ID_IMC,\n    AV_CODEC_ID_MUSEPACK7,\n    AV_CODEC_ID_MLP,\n    AV_CODEC_ID_GSM_MS, /* as found in WAV */\n    AV_CODEC_ID_ATRAC3,\n    AV_CODEC_ID_APE,\n    AV_CODEC_ID_NELLYMOSER,\n    AV_CODEC_ID_MUSEPACK8,\n    AV_CODEC_ID_SPEEX,\n    AV_CODEC_ID_WMAVOICE,\n    AV_CODEC_ID_WMAPRO,\n    AV_CODEC_ID_WMALOSSLESS,\n    AV_CODEC_ID_ATRAC3P,\n    AV_CODEC_ID_EAC3,\n    AV_CODEC_ID_SIPR,\n    AV_CODEC_ID_MP1,\n    AV_CODEC_ID_TWINVQ,\n    AV_CODEC_ID_TRUEHD,\n    AV_CODEC_ID_MP4ALS,\n    AV_CODEC_ID_ATRAC1,\n    AV_CODEC_ID_BINKAUDIO_RDFT,\n    AV_CODEC_ID_BINKAUDIO_DCT,\n    AV_CODEC_ID_AAC_LATM,\n    AV_CODEC_ID_QDMC,\n    AV_CODEC_ID_CELT,\n    AV_CODEC_ID_G723_1,\n    AV_CODEC_ID_G729,\n    AV_CODEC_ID_8SVX_EXP,\n    AV_CODEC_ID_8SVX_FIB,\n    AV_CODEC_ID_BMV_AUDIO,\n    AV_CODEC_ID_RALF,\n    AV_CODEC_ID_IAC,\n    AV_CODEC_ID_ILBC,\n    AV_CODEC_ID_OPUS,\n    AV_CODEC_ID_COMFORT_NOISE,\n    AV_CODEC_ID_TAK,\n    AV_CODEC_ID_METASOUND,\n    AV_CODEC_ID_PAF_AUDIO,\n    AV_CODEC_ID_ON2AVC,\n    AV_CODEC_ID_DSS_SP,\n    AV_CODEC_ID_CODEC2,\n    AV_CODEC_ID_FFWAVESYNTH,\n    AV_CODEC_ID_SONIC,\n    AV_CODEC_ID_SONIC_LS,\n    AV_CODEC_ID_EVRC,\n    AV_CODEC_ID_SMV,\n    AV_CODEC_ID_DSD_LSBF,\n    AV_CODEC_ID_DSD_MSBF,\n    AV_CODEC_ID_DSD_LSBF_PLANAR,\n    AV_CODEC_ID_DSD_MSBF_PLANAR,\n    AV_CODEC_ID_4GV,\n    AV_CODEC_ID_INTERPLAY_ACM,\n    AV_CODEC_ID_XMA1,\n    AV_CODEC_ID_XMA2,\n    AV_CODEC_ID_DST,\n    AV_CODEC_ID_ATRAC3AL,\n    AV_CODEC_ID_ATRAC3PAL,\n    AV_CODEC_ID_DOLBY_E,\n    AV_CODEC_ID_APTX,\n    AV_CODEC_ID_APTX_HD,\n    AV_CODEC_ID_SBC,\n    AV_CODEC_ID_ATRAC9,\n    AV_CODEC_ID_HCOM,\n    AV_CODEC_ID_ACELP_KELVIN,\n    AV_CODEC_ID_MPEGH_3D_AUDIO,\n    AV_CODEC_ID_SIREN,\n    AV_CODEC_ID_HCA,\n    AV_CODEC_ID_FASTAUDIO,\n    AV_CODEC_ID_MSNSIREN,\n    AV_CODEC_ID_DFPWM,\n    AV_CODEC_ID_BONK,\n    AV_CODEC_ID_MISC4,\n    AV_CODEC_ID_APAC,\n    AV_CODEC_ID_FTR,\n    AV_CODEC_ID_WAVARC,\n    AV_CODEC_ID_RKA,\n    AV_CODEC_ID_AC4,\n    AV_CODEC_ID_OSQ,\n    AV_CODEC_ID_QOA,\n    AV_CODEC_ID_LC3,\n    AV_CODEC_ID_G728,\n\n    /* subtitle codecs */\n    AV_CODEC_ID_FIRST_SUBTITLE = 0x17000,          ///< A dummy ID pointing at the start of subtitle codecs.\n    AV_CODEC_ID_DVD_SUBTITLE = 0x17000,\n    AV_CODEC_ID_DVB_SUBTITLE,\n    AV_CODEC_ID_TEXT,  ///< raw UTF-8 text\n    AV_CODEC_ID_XSUB,\n    AV_CODEC_ID_SSA,\n    AV_CODEC_ID_MOV_TEXT,\n    AV_CODEC_ID_HDMV_PGS_SUBTITLE,\n    AV_CODEC_ID_DVB_TELETEXT,\n    AV_CODEC_ID_SRT,\n    AV_CODEC_ID_MICRODVD,\n    AV_CODEC_ID_EIA_608,\n    AV_CODEC_ID_JACOSUB,\n    AV_CODEC_ID_SAMI,\n    AV_CODEC_ID_REALTEXT,\n    AV_CODEC_ID_STL,\n    AV_CODEC_ID_SUBVIEWER1,\n    AV_CODEC_ID_SUBVIEWER,\n    AV_CODEC_ID_SUBRIP,\n    AV_CODEC_ID_WEBVTT,\n    AV_CODEC_ID_MPL2,\n    AV_CODEC_ID_VPLAYER,\n    AV_CODEC_ID_PJS,\n    AV_CODEC_ID_ASS,\n    AV_CODEC_ID_HDMV_TEXT_SUBTITLE,\n    AV_CODEC_ID_TTML,\n    AV_CODEC_ID_ARIB_CAPTION,\n    AV_CODEC_ID_IVTV_VBI,\n\n    /* other specific kind of codecs (generally used for attachments) */\n    AV_CODEC_ID_FIRST_UNKNOWN = 0x18000,           ///< A dummy ID pointing at the start of various fake codecs.\n    AV_CODEC_ID_TTF = 0x18000,\n\n    AV_CODEC_ID_SCTE_35, ///< Contain timestamp estimated through PCR of program stream.\n    AV_CODEC_ID_EPG,\n    AV_CODEC_ID_BINTEXT,\n    AV_CODEC_ID_XBIN,\n    AV_CODEC_ID_IDF,\n    AV_CODEC_ID_OTF,\n    AV_CODEC_ID_SMPTE_KLV,\n    AV_CODEC_ID_DVD_NAV,\n    AV_CODEC_ID_TIMED_ID3,\n    AV_CODEC_ID_BIN_DATA,\n    AV_CODEC_ID_SMPTE_2038,\n    AV_CODEC_ID_LCEVC,\n    AV_CODEC_ID_SMPTE_436M_ANC,\n\n\n    AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it\n\n    AV_CODEC_ID_MPEG2TS = 0x20000, /**< _FAKE_ codec to indicate a raw MPEG-2 TS\n                                * stream (only used by libavformat) */\n    AV_CODEC_ID_MPEG4SYSTEMS = 0x20001, /**< _FAKE_ codec to indicate a MPEG-4 Systems\n                                * stream (only used by libavformat) */\n    AV_CODEC_ID_FFMETADATA = 0x21000,   ///< Dummy codec for streams containing only metadata information.\n    AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket\n    /**\n     * Dummy null video codec, useful mainly for development and debugging.\n     * Null encoder/decoder discard all input and never return any output.\n     */\n    AV_CODEC_ID_VNULL,\n    /**\n     * Dummy null audio codec, useful mainly for development and debugging.\n     * Null encoder/decoder discard all input and never return any output.\n     */\n    AV_CODEC_ID_ANULL,\n};\n\n/**\n * Get the type of the given codec.\n */\nenum AVMediaTypeFFmpeg avcodec_get_type(enum AVCodecID codec_id);\n\n/**\n * Get the name of a codec.\n * @return  a static string identifying the codec; never NULL\n */\nconst char *avcodec_get_name(enum AVCodecID id);\n\n/**\n * Return codec bits per sample.\n *\n * @param[in] codec_id the codec\n * @return Number of bits per sample or zero if unknown for the given codec.\n */\nint av_get_bits_per_sample(enum AVCodecID codec_id);\n\n/**\n * Return codec bits per sample.\n * Only return non-zero if the bits per sample is exactly correct, not an\n * approximation.\n *\n * @param[in] codec_id the codec\n * @return Number of bits per sample or zero if unknown for the given codec.\n */\nint av_get_exact_bits_per_sample(enum AVCodecID codec_id);\n\n/**\n * Return a name for the specified profile, if available.\n *\n * @param codec_id the ID of the codec to which the requested profile belongs\n * @param profile the profile value for which a name is requested\n * @return A name for the profile if found, NULL otherwise.\n *\n * @note unlike av_get_profile_name(), which searches a list of profiles\n *       supported by a specific decoder or encoder implementation, this\n *       function searches the list of profiles from the AVCodecDescriptor\n */\nconst char *avcodec_profile_name(enum AVCodecID codec_id, int profile);\n\n/**\n * Return the PCM codec associated with a sample format.\n * @param be  endianness, 0 for little, 1 for big,\n *            -1 (or anything else) for native\n * @return  AV_CODEC_ID_PCM_* or AV_CODEC_ID_NONE\n */\nenum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be);\n\n/**\n * @}\n */\n\n#endif // AVCODEC_CODEC_ID_H\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/codec_par.h",
    "content": "/*\n * Codec parameters public API\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_CODEC_PAR_H\n#define AVCODEC_CODEC_PAR_H\n\n#include <stdint.h>\n\n#include \"libavutil/avutil.h\"\n#include \"libavutil/channel_layout.h\"\n#include \"libavutil/rational.h\"\n#include \"libavutil/pixfmt.h\"\n\n#include \"codec_id.h\"\n#include \"defs.h\"\n#include \"packet.h\"\n\n/**\n * @addtogroup lavc_core\n * @{\n */\n\n/**\n * This struct describes the properties of an encoded stream.\n *\n * sizeof(AVCodecParameters) is not a part of the public ABI, this struct must\n * be allocated with avcodec_parameters_alloc() and freed with\n * avcodec_parameters_free().\n */\ntypedef struct AVCodecParameters {\n    /**\n     * General type of the encoded data.\n     */\n    enum AVMediaTypeFFmpeg codec_type;\n    /**\n     * Specific type of the encoded data (the codec used).\n     */\n    enum AVCodecID   codec_id;\n    /**\n     * Additional information about the codec (corresponds to the AVI FOURCC).\n     */\n    uint32_t         codec_tag;\n\n    /**\n     * Extra binary data needed for initializing the decoder, codec-dependent.\n     *\n     * Must be allocated with av_malloc() and will be freed by\n     * avcodec_parameters_free(). The allocated size of extradata must be at\n     * least extradata_size + AV_INPUT_BUFFER_PADDING_SIZE, with the padding\n     * bytes zeroed.\n     */\n    uint8_t *extradata;\n    /**\n     * Size of the extradata content in bytes.\n     */\n    int      extradata_size;\n\n    /**\n     * Additional data associated with the entire stream.\n     *\n     * Should be allocated with av_packet_side_data_new() or\n     * av_packet_side_data_add(), and will be freed by avcodec_parameters_free().\n     */\n    AVPacketSideData *coded_side_data;\n\n    /**\n     * Amount of entries in @ref coded_side_data.\n     */\n    int nb_coded_side_data;\n\n    /**\n     * - video: the pixel format, the value corresponds to enum AVPixelFormat.\n     * - audio: the sample format, the value corresponds to enum AVSampleFormat.\n     */\n    int format;\n\n    /**\n     * The average bitrate of the encoded data (in bits per second).\n     */\n    int64_t bit_rate;\n\n    /**\n     * The number of bits per sample in the codedwords.\n     *\n     * This is basically the bitrate per sample. It is mandatory for a bunch of\n     * formats to actually decode them. It's the number of bits for one sample in\n     * the actual coded bitstream.\n     *\n     * This could be for example 4 for ADPCM\n     * For PCM formats this matches bits_per_raw_sample\n     * Can be 0\n     */\n    int bits_per_coded_sample;\n\n    /**\n     * This is the number of valid bits in each output sample. If the\n     * sample format has more bits, the least significant bits are additional\n     * padding bits, which are always 0. Use right shifts to reduce the sample\n     * to its actual size. For example, audio formats with 24 bit samples will\n     * have bits_per_raw_sample set to 24, and format set to AV_SAMPLE_FMT_S32.\n     * To get the original sample use \"(int32_t)sample >> 8\".\"\n     *\n     * For ADPCM this might be 12 or 16 or similar\n     * Can be 0\n     */\n    int bits_per_raw_sample;\n\n    /**\n     * Codec-specific bitstream restrictions that the stream conforms to.\n     */\n    int profile;\n    int level;\n\n    /**\n     * Video only. The dimensions of the video frame in pixels.\n     */\n    int width;\n    int height;\n\n    /**\n     * Video only. The aspect ratio (width / height) which a single pixel\n     * should have when displayed.\n     *\n     * When the aspect ratio is unknown / undefined, the numerator should be\n     * set to 0 (the denominator may have any value).\n     */\n    AVRational sample_aspect_ratio;\n\n    /**\n     * Video only. Number of frames per second, for streams with constant frame\n     * durations. Should be set to { 0, 1 } when some frames have differing\n     * durations or if the value is not known.\n     *\n     * @note This field corresponds to values that are stored in codec-level\n     * headers and is typically overridden by container/transport-layer\n     * timestamps, when available. It should thus be used only as a last resort,\n     * when no higher-level timing information is available.\n     */\n    AVRational framerate;\n\n    /**\n     * Video only. The order of the fields in interlaced video.\n     */\n    enum AVFieldOrder                  field_order;\n\n    /**\n     * Video only. Additional colorspace characteristics.\n     */\n    enum AVColorRange                  color_range;\n    enum AVColorPrimaries              color_primaries;\n    enum AVColorTransferCharacteristic color_trc;\n    enum AVColorSpace                  color_space;\n    enum AVChromaLocation              chroma_location;\n\n    /**\n     * Video only. Number of delayed frames.\n     */\n    int video_delay;\n\n    /**\n     * Audio only. The channel layout and number of channels.\n     */\n    AVChannelLayout ch_layout;\n    /**\n     * Audio only. The number of audio samples per second.\n     */\n    int      sample_rate;\n    /**\n     * Audio only. The number of bytes per coded audio frame, required by some\n     * formats.\n     *\n     * Corresponds to nBlockAlign in WAVEFORMATEX.\n     */\n    int      block_align;\n    /**\n     * Audio only. Audio frame size, if known. Required by some formats to be static.\n     */\n    int      frame_size;\n\n    /**\n     * Audio only. The amount of padding (in samples) inserted by the encoder at\n     * the beginning of the audio. I.e. this number of leading decoded samples\n     * must be discarded by the caller to get the original audio without leading\n     * padding.\n     */\n    int initial_padding;\n    /**\n     * Audio only. The amount of padding (in samples) appended by the encoder to\n     * the end of the audio. I.e. this number of decoded samples must be\n     * discarded by the caller from the end of the stream to get the original\n     * audio without any trailing padding.\n     */\n    int trailing_padding;\n    /**\n     * Audio only. Number of samples to skip after a discontinuity.\n     */\n    int seek_preroll;\n} AVCodecParameters;\n\n/**\n * Allocate a new AVCodecParameters and set its fields to default values\n * (unknown/invalid/0). The returned struct must be freed with\n * avcodec_parameters_free().\n */\nAVCodecParameters *avcodec_parameters_alloc(void);\n\n/**\n * Free an AVCodecParameters instance and everything associated with it and\n * write NULL to the supplied pointer.\n */\nvoid avcodec_parameters_free(AVCodecParameters **par);\n\n/**\n * Copy the contents of src to dst. Any allocated fields in dst are freed and\n * replaced with newly allocated duplicates of the corresponding fields in src.\n *\n * @return >= 0 on success, a negative AVERROR code on failure.\n */\nint avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src);\n\n/**\n * This function is the same as av_get_audio_frame_duration(), except it works\n * with AVCodecParameters instead of an AVCodecContext.\n */\nint av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes);\n\n/**\n * @}\n */\n\n#endif // AVCODEC_CODEC_PAR_H\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/d3d11va.h",
    "content": "/*\n * Direct3D11 HW acceleration\n *\n * copyright (c) 2009 Laurent Aimar\n * copyright (c) 2015 Steve Lhomme\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_D3D11VA_H\n#define AVCODEC_D3D11VA_H\n\n/**\n * @file\n * @ingroup lavc_codec_hwaccel_d3d11va\n * Public libavcodec D3D11VA header.\n */\n\n#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602\n#undef _WIN32_WINNT\n#define _WIN32_WINNT 0x0602\n#endif\n\n#include <stdint.h>\n#include <d3d11.h>\n\n/**\n * @defgroup lavc_codec_hwaccel_d3d11va Direct3D11\n * @ingroup lavc_codec_hwaccel\n *\n * @{\n */\n\n/**\n * This structure is used to provides the necessary configurations and data\n * to the Direct3D11 FFmpeg HWAccel implementation.\n *\n * The application must make it available as AVCodecContext.hwaccel_context.\n *\n * Use av_d3d11va_alloc_context() exclusively to allocate an AVD3D11VAContext.\n */\ntypedef struct AVD3D11VAContext {\n    /**\n     * D3D11 decoder object\n     */\n    ID3D11VideoDecoder *decoder;\n\n    /**\n      * D3D11 VideoContext\n      */\n    ID3D11VideoContext *video_context;\n\n    /**\n     * D3D11 configuration used to create the decoder\n     */\n    D3D11_VIDEO_DECODER_CONFIG *cfg;\n\n    /**\n     * The number of surface in the surface array\n     */\n    unsigned surface_count;\n\n    /**\n     * The array of Direct3D surfaces used to create the decoder\n     */\n    ID3D11VideoDecoderOutputView **surface;\n\n    /**\n     * A bit field configuring the workarounds needed for using the decoder\n     */\n    uint64_t workaround;\n\n    /**\n     * Private to the FFmpeg AVHWAccel implementation\n     */\n    unsigned report_id;\n\n    /**\n      * Mutex to access video_context\n      */\n    HANDLE  context_mutex;\n} AVD3D11VAContext;\n\n/**\n * Allocate an AVD3D11VAContext.\n *\n * @return Newly-allocated AVD3D11VAContext or NULL on failure.\n */\nAVD3D11VAContext *av_d3d11va_alloc_context(void);\n\n/**\n * @}\n */\n\n#endif /* AVCODEC_D3D11VA_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/defs.h",
    "content": "/*\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_DEFS_H\n#define AVCODEC_DEFS_H\n\n/**\n * @file\n * @ingroup libavc\n * Misc types and constants that do not belong anywhere else.\n */\n\n#include <stdint.h>\n#include <stdlib.h>\n\n/**\n * @ingroup lavc_decoding\n * Required number of additionally allocated bytes at the end of the input bitstream for decoding.\n * This is mainly needed because some optimized bitstream readers read\n * 32 or 64 bit at once and could read over the end.<br>\n * Note: If the first 23 bits of the additional bytes are not 0, then damaged\n * MPEG bitstreams could cause overread and segfault.\n */\n#define AV_INPUT_BUFFER_PADDING_SIZE 64\n\n/**\n * Verify checksums embedded in the bitstream (could be of either encoded or\n * decoded data, depending on the format) and print an error message on mismatch.\n * If AV_EF_EXPLODE is also set, a mismatching checksum will result in the\n * decoder/demuxer returning an error.\n */\n#define AV_EF_CRCCHECK       (1<<0)\n#define AV_EF_BITSTREAM      (1<<1)   ///< detect bitstream specification deviations\n#define AV_EF_BUFFER         (1<<2)   ///< detect improper bitstream length\n#define AV_EF_EXPLODE        (1<<3)   ///< abort decoding on minor error detection\n\n#define AV_EF_IGNORE_ERR     (1<<15)  ///< ignore errors and continue\n#define AV_EF_CAREFUL        (1<<16)  ///< consider things that violate the spec, are fast to calculate and have not been seen in the wild as errors\n#define AV_EF_COMPLIANT      (1<<17)  ///< consider all spec non compliances as errors\n#define AV_EF_AGGRESSIVE     (1<<18)  ///< consider things that a sane encoder/muxer should not do as an error\n\n#define FF_COMPLIANCE_VERY_STRICT   2 ///< Strictly conform to an older more strict version of the spec or reference software.\n#define FF_COMPLIANCE_STRICT        1 ///< Strictly conform to all the things in the spec no matter what consequences.\n#define FF_COMPLIANCE_NORMAL        0\n#define FF_COMPLIANCE_UNOFFICIAL   -1 ///< Allow unofficial extensions\n#define FF_COMPLIANCE_EXPERIMENTAL -2 ///< Allow nonstandardized experimental things.\n\n\n#define AV_PROFILE_UNKNOWN        -99\n#define AV_PROFILE_RESERVED      -100\n\n#define AV_PROFILE_AAC_MAIN         0\n#define AV_PROFILE_AAC_LOW          1\n#define AV_PROFILE_AAC_SSR          2\n#define AV_PROFILE_AAC_LTP          3\n#define AV_PROFILE_AAC_HE           4\n#define AV_PROFILE_AAC_HE_V2       28\n#define AV_PROFILE_AAC_LD          22\n#define AV_PROFILE_AAC_ELD         38\n#define AV_PROFILE_AAC_USAC        41\n#define AV_PROFILE_MPEG2_AAC_LOW  128\n#define AV_PROFILE_MPEG2_AAC_HE   131\n\n#define AV_PROFILE_DNXHD         0\n#define AV_PROFILE_DNXHR_LB      1\n#define AV_PROFILE_DNXHR_SQ      2\n#define AV_PROFILE_DNXHR_HQ      3\n#define AV_PROFILE_DNXHR_HQX     4\n#define AV_PROFILE_DNXHR_444     5\n\n#define AV_PROFILE_DTS                20\n#define AV_PROFILE_DTS_ES             30\n#define AV_PROFILE_DTS_96_24          40\n#define AV_PROFILE_DTS_HD_HRA         50\n#define AV_PROFILE_DTS_HD_MA          60\n#define AV_PROFILE_DTS_EXPRESS        70\n#define AV_PROFILE_DTS_HD_MA_X        61\n#define AV_PROFILE_DTS_HD_MA_X_IMAX   62\n\n#define AV_PROFILE_EAC3_DDP_ATMOS         30\n\n#define AV_PROFILE_TRUEHD_ATMOS           30\n\n#define AV_PROFILE_MPEG2_422           0\n#define AV_PROFILE_MPEG2_HIGH          1\n#define AV_PROFILE_MPEG2_SS            2\n#define AV_PROFILE_MPEG2_SNR_SCALABLE  3\n#define AV_PROFILE_MPEG2_MAIN          4\n#define AV_PROFILE_MPEG2_SIMPLE        5\n\n#define AV_PROFILE_H264_CONSTRAINED  (1<<9)  // 8+1; constraint_set1_flag\n#define AV_PROFILE_H264_INTRA        (1<<11) // 8+3; constraint_set3_flag\n\n#define AV_PROFILE_H264_BASELINE             66\n#define AV_PROFILE_H264_CONSTRAINED_BASELINE (66|AV_PROFILE_H264_CONSTRAINED)\n#define AV_PROFILE_H264_MAIN                 77\n#define AV_PROFILE_H264_EXTENDED             88\n#define AV_PROFILE_H264_HIGH                 100\n#define AV_PROFILE_H264_HIGH_10              110\n#define AV_PROFILE_H264_HIGH_10_INTRA        (110|AV_PROFILE_H264_INTRA)\n#define AV_PROFILE_H264_MULTIVIEW_HIGH       118\n#define AV_PROFILE_H264_HIGH_422             122\n#define AV_PROFILE_H264_HIGH_422_INTRA       (122|AV_PROFILE_H264_INTRA)\n#define AV_PROFILE_H264_STEREO_HIGH          128\n#define AV_PROFILE_H264_HIGH_444             144\n#define AV_PROFILE_H264_HIGH_444_PREDICTIVE  244\n#define AV_PROFILE_H264_HIGH_444_INTRA       (244|AV_PROFILE_H264_INTRA)\n#define AV_PROFILE_H264_CAVLC_444            44\n\n#define AV_PROFILE_VC1_SIMPLE   0\n#define AV_PROFILE_VC1_MAIN     1\n#define AV_PROFILE_VC1_COMPLEX  2\n#define AV_PROFILE_VC1_ADVANCED 3\n\n#define AV_PROFILE_MPEG4_SIMPLE                     0\n#define AV_PROFILE_MPEG4_SIMPLE_SCALABLE            1\n#define AV_PROFILE_MPEG4_CORE                       2\n#define AV_PROFILE_MPEG4_MAIN                       3\n#define AV_PROFILE_MPEG4_N_BIT                      4\n#define AV_PROFILE_MPEG4_SCALABLE_TEXTURE           5\n#define AV_PROFILE_MPEG4_SIMPLE_FACE_ANIMATION      6\n#define AV_PROFILE_MPEG4_BASIC_ANIMATED_TEXTURE     7\n#define AV_PROFILE_MPEG4_HYBRID                     8\n#define AV_PROFILE_MPEG4_ADVANCED_REAL_TIME         9\n#define AV_PROFILE_MPEG4_CORE_SCALABLE             10\n#define AV_PROFILE_MPEG4_ADVANCED_CODING           11\n#define AV_PROFILE_MPEG4_ADVANCED_CORE             12\n#define AV_PROFILE_MPEG4_ADVANCED_SCALABLE_TEXTURE 13\n#define AV_PROFILE_MPEG4_SIMPLE_STUDIO             14\n#define AV_PROFILE_MPEG4_ADVANCED_SIMPLE           15\n\n#define AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_0   1\n#define AV_PROFILE_JPEG2000_CSTREAM_RESTRICTION_1   2\n#define AV_PROFILE_JPEG2000_CSTREAM_NO_RESTRICTION  32768\n#define AV_PROFILE_JPEG2000_DCINEMA_2K              3\n#define AV_PROFILE_JPEG2000_DCINEMA_4K              4\n\n#define AV_PROFILE_VP9_0                            0\n#define AV_PROFILE_VP9_1                            1\n#define AV_PROFILE_VP9_2                            2\n#define AV_PROFILE_VP9_3                            3\n\n#define AV_PROFILE_HEVC_MAIN                        1\n#define AV_PROFILE_HEVC_MAIN_10                     2\n#define AV_PROFILE_HEVC_MAIN_STILL_PICTURE          3\n#define AV_PROFILE_HEVC_REXT                        4\n#define AV_PROFILE_HEVC_MULTIVIEW_MAIN              6\n#define AV_PROFILE_HEVC_SCC                         9\n\n#define AV_PROFILE_VVC_MAIN_10                      1\n#define AV_PROFILE_VVC_MAIN_10_444                 33\n\n#define AV_PROFILE_AV1_MAIN                         0\n#define AV_PROFILE_AV1_HIGH                         1\n#define AV_PROFILE_AV1_PROFESSIONAL                 2\n\n#define AV_PROFILE_MJPEG_HUFFMAN_BASELINE_DCT            0xc0\n#define AV_PROFILE_MJPEG_HUFFMAN_EXTENDED_SEQUENTIAL_DCT 0xc1\n#define AV_PROFILE_MJPEG_HUFFMAN_PROGRESSIVE_DCT         0xc2\n#define AV_PROFILE_MJPEG_HUFFMAN_LOSSLESS                0xc3\n#define AV_PROFILE_MJPEG_JPEG_LS                         0xf7\n\n#define AV_PROFILE_SBC_MSBC                         1\n\n#define AV_PROFILE_PRORES_PROXY     0\n#define AV_PROFILE_PRORES_LT        1\n#define AV_PROFILE_PRORES_STANDARD  2\n#define AV_PROFILE_PRORES_HQ        3\n#define AV_PROFILE_PRORES_4444      4\n#define AV_PROFILE_PRORES_XQ        5\n\n#define AV_PROFILE_PRORES_RAW       0\n#define AV_PROFILE_PRORES_RAW_HQ    1\n\n#define AV_PROFILE_ARIB_PROFILE_A 0\n#define AV_PROFILE_ARIB_PROFILE_C 1\n\n#define AV_PROFILE_KLVA_SYNC  0\n#define AV_PROFILE_KLVA_ASYNC 1\n\n#define AV_PROFILE_EVC_BASELINE             0\n#define AV_PROFILE_EVC_MAIN                 1\n\n#define AV_PROFILE_APV_422_10  33\n#define AV_PROFILE_APV_422_12  44\n#define AV_PROFILE_APV_444_10  55\n#define AV_PROFILE_APV_444_12  66\n#define AV_PROFILE_APV_4444_10 77\n#define AV_PROFILE_APV_4444_12 88\n#define AV_PROFILE_APV_400_10  99\n\n\n#define AV_LEVEL_UNKNOWN                  -99\n\nenum AVFieldOrder {\n    AV_FIELD_UNKNOWN,\n    AV_FIELD_PROGRESSIVE,\n    AV_FIELD_TT,          ///< Top coded_first, top displayed first\n    AV_FIELD_BB,          ///< Bottom coded first, bottom displayed first\n    AV_FIELD_TB,          ///< Top coded first, bottom displayed first\n    AV_FIELD_BT,          ///< Bottom coded first, top displayed first\n};\n\n/**\n * @ingroup lavc_decoding\n */\nenum AVDiscard{\n    /* We leave some space between them for extensions (drop some\n     * keyframes for intra-only or drop just some bidir frames). */\n    AVDISCARD_NONE    =-16, ///< discard nothing\n    AVDISCARD_DEFAULT =  0, ///< discard useless packets like 0 size packets in avi\n    AVDISCARD_NONREF  =  8, ///< discard all non reference\n    AVDISCARD_BIDIR   = 16, ///< discard all bidirectional frames\n    AVDISCARD_NONINTRA= 24, ///< discard all non intra frames\n    AVDISCARD_NONKEY  = 32, ///< discard all frames except keyframes\n    AVDISCARD_ALL     = 48, ///< discard all\n};\n\nenum AVAudioServiceType {\n    AV_AUDIO_SERVICE_TYPE_MAIN              = 0,\n    AV_AUDIO_SERVICE_TYPE_EFFECTS           = 1,\n    AV_AUDIO_SERVICE_TYPE_VISUALLY_IMPAIRED = 2,\n    AV_AUDIO_SERVICE_TYPE_HEARING_IMPAIRED  = 3,\n    AV_AUDIO_SERVICE_TYPE_DIALOGUE          = 4,\n    AV_AUDIO_SERVICE_TYPE_COMMENTARY        = 5,\n    AV_AUDIO_SERVICE_TYPE_EMERGENCY         = 6,\n    AV_AUDIO_SERVICE_TYPE_VOICE_OVER        = 7,\n    AV_AUDIO_SERVICE_TYPE_KARAOKE           = 8,\n    AV_AUDIO_SERVICE_TYPE_NB                   , ///< Not part of ABI\n};\n\n/**\n * Pan Scan area.\n * This specifies the area which should be displayed.\n * Note there may be multiple such areas for one frame.\n */\ntypedef struct AVPanScan {\n    /**\n     * id\n     * - encoding: Set by user.\n     * - decoding: Set by libavcodec.\n     */\n    int id;\n\n    /**\n     * width and height in 1/16 pel\n     * - encoding: Set by user.\n     * - decoding: Set by libavcodec.\n     */\n    int width;\n    int height;\n\n    /**\n     * position of the top left corner in 1/16 pel for up to 3 fields/frames\n     * - encoding: Set by user.\n     * - decoding: Set by libavcodec.\n     */\n    int16_t position[3][2];\n} AVPanScan;\n\n/**\n * This structure describes the bitrate properties of an encoded bitstream. It\n * roughly corresponds to a subset the VBV parameters for MPEG-2 or HRD\n * parameters for H.264/HEVC.\n */\ntypedef struct AVCPBProperties {\n    /**\n     * Maximum bitrate of the stream, in bits per second.\n     * Zero if unknown or unspecified.\n     */\n    int64_t max_bitrate;\n    /**\n     * Minimum bitrate of the stream, in bits per second.\n     * Zero if unknown or unspecified.\n     */\n    int64_t min_bitrate;\n    /**\n     * Average bitrate of the stream, in bits per second.\n     * Zero if unknown or unspecified.\n     */\n    int64_t avg_bitrate;\n\n    /**\n     * The size of the buffer to which the ratecontrol is applied, in bits.\n     * Zero if unknown or unspecified.\n     */\n    int64_t buffer_size;\n\n    /**\n     * The delay between the time the packet this structure is associated with\n     * is received and the time when it should be decoded, in periods of a 27MHz\n     * clock.\n     *\n     * UINT64_MAX when unknown or unspecified.\n     */\n    uint64_t vbv_delay;\n} AVCPBProperties;\n\n/**\n * Allocate a CPB properties structure and initialize its fields to default\n * values.\n *\n * @param size if non-NULL, the size of the allocated struct will be written\n *             here. This is useful for embedding it in side data.\n *\n * @return the newly allocated struct or NULL on failure\n */\nAVCPBProperties *av_cpb_properties_alloc(size_t *size);\n\n/**\n * This structure supplies correlation between a packet timestamp and a wall clock\n * production time. The definition follows the Producer Reference Time ('prft')\n * as defined in ISO/IEC 14496-12\n */\ntypedef struct AVProducerReferenceTime {\n    /**\n     * A UTC timestamp, in microseconds, since Unix epoch (e.g, av_gettime()).\n     */\n    int64_t wallclock;\n    int flags;\n} AVProducerReferenceTime;\n\n/**\n * RTCP SR (Sender Report) information\n *\n * The received sender report information for an RTSP\n * stream, exposed as AV_PKT_DATA_RTCP_SR side data.\n */\ntypedef struct AVRTCPSenderReport {\n    uint32_t ssrc; ///< Synchronization source identifier\n    uint64_t ntp_timestamp; ///< NTP time when the report was sent\n    uint32_t rtp_timestamp; ///< RTP time when the report was sent\n    uint32_t sender_nb_packets; ///< Total number of packets sent\n    uint32_t sender_nb_bytes; ///< Total number of bytes sent (excluding headers or padding)\n} AVRTCPSenderReport;\n\n/**\n * Encode extradata length to a buffer. Used by xiph codecs.\n *\n * @param s buffer to write to; must be at least (v/255+1) bytes long\n * @param v size of extradata in bytes\n * @return number of bytes written to the buffer.\n */\nunsigned int av_xiphlacing(unsigned char *s, unsigned int v);\n\n#endif // AVCODEC_DEFS_H\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/dirac.h",
    "content": "/*\n * Copyright (C) 2007 Marco Gerards <marco@gnu.org>\n * Copyright (C) 2009 David Conrad\n * Copyright (C) 2011 Jordi Ortiz\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_DIRAC_H\n#define AVCODEC_DIRAC_H\n\n/**\n * @file\n * Interface to Dirac Decoder/Encoder\n * @author Marco Gerards <marco@gnu.org>\n * @author David Conrad\n * @author Jordi Ortiz\n */\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"libavutil/pixfmt.h\"\n#include \"libavutil/rational.h\"\n\n/**\n * The spec limits the number of wavelet decompositions to 4 for both\n * level 1 (VC-2) and 128 (long-gop default).\n * 5 decompositions is the maximum before >16-bit buffers are needed.\n * Schroedinger allows this for DD 9,7 and 13,7 wavelets only, limiting\n * the others to 4 decompositions (or 3 for the fidelity filter).\n *\n * We use this instead of MAX_DECOMPOSITIONS to save some memory.\n */\n#define MAX_DWT_LEVELS 5\n\n/**\n * Parse code values:\n *\n * Dirac Specification ->\n * 9.6.1  Table 9.1\n *\n * VC-2 Specification  ->\n * 10.4.1 Table 10.1\n */\n\nenum DiracParseCodes {\n    DIRAC_PCODE_SEQ_HEADER      = 0x00,\n    DIRAC_PCODE_END_SEQ         = 0x10,\n    DIRAC_PCODE_AUX             = 0x20,\n    DIRAC_PCODE_PAD             = 0x30,\n    DIRAC_PCODE_PICTURE_CODED   = 0x08,\n    DIRAC_PCODE_PICTURE_RAW     = 0x48,\n    DIRAC_PCODE_PICTURE_LOW_DEL = 0xC8,\n    DIRAC_PCODE_PICTURE_HQ      = 0xE8,\n    DIRAC_PCODE_INTER_NOREF_CO1 = 0x0A,\n    DIRAC_PCODE_INTER_NOREF_CO2 = 0x09,\n    DIRAC_PCODE_INTER_REF_CO1   = 0x0D,\n    DIRAC_PCODE_INTER_REF_CO2   = 0x0E,\n    DIRAC_PCODE_INTRA_REF_CO    = 0x0C,\n    DIRAC_PCODE_INTRA_REF_RAW   = 0x4C,\n    DIRAC_PCODE_INTRA_REF_PICT  = 0xCC,\n    DIRAC_PCODE_MAGIC           = 0x42424344,\n};\n\ntypedef struct DiracVersionInfo {\n    int major;\n    int minor;\n} DiracVersionInfo;\n\ntypedef struct AVDiracSeqHeader {\n    unsigned width;\n    unsigned height;\n    uint8_t chroma_format;          ///< 0: 444  1: 422  2: 420\n\n    uint8_t interlaced;\n    uint8_t top_field_first;\n\n    uint8_t frame_rate_index;       ///< index into dirac_frame_rate[]\n    uint8_t aspect_ratio_index;     ///< index into dirac_aspect_ratio[]\n\n    uint16_t clean_width;\n    uint16_t clean_height;\n    uint16_t clean_left_offset;\n    uint16_t clean_right_offset;\n\n    uint8_t pixel_range_index;      ///< index into dirac_pixel_range_presets[]\n    uint8_t color_spec_index;       ///< index into dirac_color_spec_presets[]\n\n    int profile;\n    int level;\n\n    AVRational framerate;\n    AVRational sample_aspect_ratio;\n\n    enum AVPixelFormat pix_fmt;\n    enum AVColorRange color_range;\n    enum AVColorPrimaries color_primaries;\n    enum AVColorTransferCharacteristic color_trc;\n    enum AVColorSpace colorspace;\n\n    DiracVersionInfo version;\n    int bit_depth;\n} AVDiracSeqHeader;\n\n/**\n * Parse a Dirac sequence header.\n *\n * @param dsh this function will allocate and fill an AVDiracSeqHeader struct\n *            and write it into this pointer. The caller must free it with\n *            av_free().\n * @param buf the data buffer\n * @param buf_size the size of the data buffer in bytes\n * @param log_ctx if non-NULL, this function will log errors here\n * @return 0 on success, a negative AVERROR code on failure\n */\nint av_dirac_parse_sequence_header(AVDiracSeqHeader **dsh,\n                                   const uint8_t *buf, size_t buf_size,\n                                   void *log_ctx);\n\n#endif /* AVCODEC_DIRAC_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/dv_profile.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_DV_PROFILE_H\n#define AVCODEC_DV_PROFILE_H\n\n#include <stdint.h>\n\n#include \"libavutil/pixfmt.h\"\n#include \"libavutil/rational.h\"\n\n/* minimum number of bytes to read from a DV stream in order to\n * determine the profile */\n#define DV_PROFILE_BYTES (6 * 80) /* 6 DIF blocks */\n\n\n/*\n * AVDVProfile is used to express the differences between various\n * DV flavors. For now it's primarily used for differentiating\n * 525/60 and 625/50, but the plans are to use it for various\n * DV specs as well (e.g. SMPTE314M vs. IEC 61834).\n */\ntypedef struct AVDVProfile {\n    int              dsf;                   /* value of the dsf in the DV header */\n    int              video_stype;           /* stype for VAUX source pack */\n    int              frame_size;            /* total size of one frame in bytes */\n    int              difseg_size;           /* number of DIF segments per DIF channel */\n    int              n_difchan;             /* number of DIF channels per frame */\n    AVRational       time_base;             /* 1/framerate */\n    int              ltc_divisor;           /* FPS from the LTS standpoint */\n    int              height;                /* picture height in pixels */\n    int              width;                 /* picture width in pixels */\n    AVRational       sar[2];                /* sample aspect ratios for 4:3 and 16:9 */\n    enum AVPixelFormat pix_fmt;             /* picture pixel format */\n    int              bpm;                   /* blocks per macroblock */\n    const uint8_t   *block_sizes;           /* AC block sizes, in bits */\n    int              audio_stride;          /* size of audio_shuffle table */\n    int              audio_min_samples[3];  /* min amount of audio samples */\n                                            /* for 48kHz, 44.1kHz and 32kHz */\n    int              audio_samples_dist[5]; /* how many samples are supposed to be */\n                                            /* in each frame in a 5 frames window */\n    const uint8_t  (*audio_shuffle)[9];     /* PCM shuffling table */\n} AVDVProfile;\n\n/**\n * Get a DV profile for the provided compressed frame.\n *\n * @param sys the profile used for the previous frame, may be NULL\n * @param frame the compressed data buffer\n * @param buf_size size of the buffer in bytes\n * @return the DV profile for the supplied data or NULL on failure\n */\nconst AVDVProfile *av_dv_frame_profile(const AVDVProfile *sys,\n                                       const uint8_t *frame, unsigned buf_size);\n\n/**\n * Get a DV profile for the provided stream parameters.\n */\nconst AVDVProfile *av_dv_codec_profile(int width, int height, enum AVPixelFormat pix_fmt);\n\n/**\n * Get a DV profile for the provided stream parameters.\n * The frame rate is used as a best-effort parameter.\n */\nconst AVDVProfile *av_dv_codec_profile2(int width, int height, enum AVPixelFormat pix_fmt, AVRational frame_rate);\n\n#endif /* AVCODEC_DV_PROFILE_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/dxva2.h",
    "content": "/*\n * DXVA2 HW acceleration\n *\n * copyright (c) 2009 Laurent Aimar\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_DXVA2_H\n#define AVCODEC_DXVA2_H\n\n/**\n * @file\n * @ingroup lavc_codec_hwaccel_dxva2\n * Public libavcodec DXVA2 header.\n */\n\n#if !defined(_WIN32_WINNT) || _WIN32_WINNT < 0x0602\n#undef _WIN32_WINNT\n#define _WIN32_WINNT 0x0602\n#endif\n\n#include <stdint.h>\n#include <d3d9.h>\n#include <dxva2api.h>\n\n/**\n * @defgroup lavc_codec_hwaccel_dxva2 DXVA2\n * @ingroup lavc_codec_hwaccel\n *\n * @{\n */\n\n/**\n * This structure is used to provides the necessary configurations and data\n * to the DXVA2 FFmpeg HWAccel implementation.\n *\n * The application must make it available as AVCodecContext.hwaccel_context.\n */\nstruct dxva_context {\n    /**\n     * DXVA2 decoder object\n     */\n    IDirectXVideoDecoder *decoder;\n\n    /**\n     * DXVA2 configuration used to create the decoder\n     */\n    const DXVA2_ConfigPictureDecode *cfg;\n\n    /**\n     * The number of surface in the surface array\n     */\n    unsigned surface_count;\n\n    /**\n     * The array of Direct3D surfaces used to create the decoder\n     */\n    LPDIRECT3DSURFACE9 *surface;\n\n    /**\n     * A bit field configuring the workarounds needed for using the decoder\n     */\n    uint64_t workaround;\n\n    /**\n     * Private to the FFmpeg AVHWAccel implementation\n     */\n    unsigned report_id;\n};\n\n/**\n * @}\n */\n\n#endif /* AVCODEC_DXVA2_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/jni.h",
    "content": "/*\n * JNI public API functions\n *\n * Copyright (c) 2015-2016 Matthieu Bouron <matthieu.bouron stupeflix.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_JNI_H\n#define AVCODEC_JNI_H\n\n/*\n * Manually set a Java virtual machine which will be used to retrieve the JNI\n * environment. Once a Java VM is set it cannot be changed afterwards, meaning\n * you can call multiple times av_jni_set_java_vm with the same Java VM pointer\n * however it will error out if you try to set a different Java VM.\n *\n * @param vm Java virtual machine\n * @param log_ctx context used for logging, can be NULL\n * @return 0 on success, < 0 otherwise\n */\nint av_jni_set_java_vm(void *vm, void *log_ctx);\n\n/*\n * Get the Java virtual machine which has been set with av_jni_set_java_vm.\n *\n * @param vm Java virtual machine\n * @return a pointer to the Java virtual machine\n */\nvoid *av_jni_get_java_vm(void *log_ctx);\n\n/*\n * Set the Android application context which will be used to retrieve the Android\n * content resolver to handle content uris.\n *\n * This function is only available on Android.\n *\n * @param app_ctx global JNI reference to the Android application context\n * @return 0 on success, < 0 otherwise\n */\nint av_jni_set_android_app_ctx(void *app_ctx, void *log_ctx);\n\n/*\n * Get the Android application context that has been set with\n * av_jni_set_android_app_ctx.\n *\n * This function is only available on Android.\n *\n * @return a pointer the the Android application context\n */\nvoid *av_jni_get_android_app_ctx(void);\n\n#endif /* AVCODEC_JNI_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/mediacodec.h",
    "content": "/*\n * Android MediaCodec public API\n *\n * Copyright (c) 2016 Matthieu Bouron <matthieu.bouron stupeflix.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_MEDIACODEC_H\n#define AVCODEC_MEDIACODEC_H\n\n#include \"libavcodec/avcodec.h\"\n\n/**\n * This structure holds a reference to a android/view/Surface object that will\n * be used as output by the decoder.\n *\n */\ntypedef struct AVMediaCodecContext {\n\n    /**\n     * android/view/Surface object reference.\n     */\n    void *surface;\n\n} AVMediaCodecContext;\n\n/**\n * Allocate and initialize a MediaCodec context.\n *\n * When decoding with MediaCodec is finished, the caller must free the\n * MediaCodec context with av_mediacodec_default_free.\n *\n * @return a pointer to a newly allocated AVMediaCodecContext on success, NULL otherwise\n */\nAVMediaCodecContext *av_mediacodec_alloc_context(void);\n\n/**\n * Convenience function that sets up the MediaCodec context.\n *\n * @param avctx codec context\n * @param ctx MediaCodec context to initialize\n * @param surface reference to an android/view/Surface\n * @return 0 on success, < 0 otherwise\n */\nint av_mediacodec_default_init(AVCodecContext *avctx, AVMediaCodecContext *ctx, void *surface);\n\n/**\n * This function must be called to free the MediaCodec context initialized with\n * av_mediacodec_default_init().\n *\n * @param avctx codec context\n */\nvoid av_mediacodec_default_free(AVCodecContext *avctx);\n\n/**\n * Opaque structure representing a MediaCodec buffer to render.\n */\ntypedef struct MediaCodecBuffer AVMediaCodecBuffer;\n\n/**\n * Release a MediaCodec buffer and render it to the surface that is associated\n * with the decoder. This function should only be called once on a given\n * buffer, once released the underlying buffer returns to the codec, thus\n * subsequent calls to this function will have no effect.\n *\n * @param buffer the buffer to render\n * @param render 1 to release and render the buffer to the surface or 0 to\n * discard the buffer\n * @return 0 on success, < 0 otherwise\n */\nint av_mediacodec_release_buffer(AVMediaCodecBuffer *buffer, int render);\n\n/**\n * Release a MediaCodec buffer and render it at the given time to the surface\n * that is associated with the decoder. The timestamp must be within one second\n * of the current `java/lang/System#nanoTime()` (which is implemented using\n * `CLOCK_MONOTONIC` on Android). See the Android MediaCodec documentation\n * of [`android/media/MediaCodec#releaseOutputBuffer(int,long)`][0] for more details.\n *\n * @param buffer the buffer to render\n * @param time timestamp in nanoseconds of when to render the buffer\n * @return 0 on success, < 0 otherwise\n *\n * [0]: https://developer.android.com/reference/android/media/MediaCodec#releaseOutputBuffer(int,%20long)\n */\nint av_mediacodec_render_buffer_at_time(AVMediaCodecBuffer *buffer, int64_t time);\n\n#endif /* AVCODEC_MEDIACODEC_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/packet.h",
    "content": "/*\n * AVPacket public API\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_PACKET_H\n#define AVCODEC_PACKET_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"libavutil/attributes.h\"\n#include \"libavutil/buffer.h\"\n#include \"libavutil/dict.h\"\n#include \"libavutil/rational.h\"\n#include \"libavutil/version.h\"\n\n#include \"libavcodec/version_major.h\"\n\n/**\n * @defgroup lavc_packet_side_data AVPacketSideData\n *\n * Types and functions for working with AVPacketSideData.\n * @{\n */\nenum AVPacketSideDataType {\n    /**\n     * An AV_PKT_DATA_PALETTE side data packet contains exactly AVPALETTE_SIZE\n     * bytes worth of palette. This side data signals that a new palette is\n     * present.\n     */\n    AV_PKT_DATA_PALETTE,\n\n    /**\n     * The AV_PKT_DATA_NEW_EXTRADATA is used to notify the codec or the format\n     * that the extradata buffer was changed and the receiving side should\n     * act upon it appropriately. The new extradata is embedded in the side\n     * data buffer and should be immediately used for processing the current\n     * frame or packet.\n     */\n    AV_PKT_DATA_NEW_EXTRADATA,\n\n    /**\n     * An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:\n     * @code\n     * u32le param_flags\n     * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE)\n     *     s32le sample_rate\n     * if (param_flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS)\n     *     s32le width\n     *     s32le height\n     * @endcode\n     */\n    AV_PKT_DATA_PARAM_CHANGE,\n\n    /**\n     * An AV_PKT_DATA_H263_MB_INFO side data packet contains a number of\n     * structures with info about macroblocks relevant to splitting the\n     * packet into smaller packets on macroblock edges (e.g. as for RFC 2190).\n     * That is, it does not necessarily contain info about all macroblocks,\n     * as long as the distance between macroblocks in the info is smaller\n     * than the target payload size.\n     * Each MB info structure is 12 bytes, and is laid out as follows:\n     * @code\n     * u32le bit offset from the start of the packet\n     * u8    current quantizer at the start of the macroblock\n     * u8    GOB number\n     * u16le macroblock address within the GOB\n     * u8    horizontal MV predictor\n     * u8    vertical MV predictor\n     * u8    horizontal MV predictor for block number 3\n     * u8    vertical MV predictor for block number 3\n     * @endcode\n     */\n    AV_PKT_DATA_H263_MB_INFO,\n\n    /**\n     * This side data should be associated with an audio stream and contains\n     * ReplayGain information in form of the AVReplayGain struct.\n     */\n    AV_PKT_DATA_REPLAYGAIN,\n\n    /**\n     * This side data contains a 3x3 transformation matrix describing an affine\n     * transformation that needs to be applied to the decoded video frames for\n     * correct presentation.\n     *\n     * See libavutil/display.h for a detailed description of the data.\n     */\n    AV_PKT_DATA_DISPLAYMATRIX,\n\n    /**\n     * This side data should be associated with a video stream and contains\n     * Stereoscopic 3D information in form of the AVStereo3D struct.\n     */\n    AV_PKT_DATA_STEREO3D,\n\n    /**\n     * This side data should be associated with an audio stream and corresponds\n     * to enum AVAudioServiceType.\n     */\n    AV_PKT_DATA_AUDIO_SERVICE_TYPE,\n\n    /**\n     * This side data contains quality related information from the encoder.\n     * @code\n     * u32le quality factor of the compressed frame. Allowed range is between 1 (good) and FF_LAMBDA_MAX (bad).\n     * u8    picture type\n     * u8    error count\n     * u16   reserved\n     * u64le[error count] sum of squared differences between encoder in and output\n     * @endcode\n     */\n    AV_PKT_DATA_QUALITY_STATS,\n\n    /**\n     * This side data contains an integer value representing the stream index\n     * of a \"fallback\" track.  A fallback track indicates an alternate\n     * track to use when the current track can not be decoded for some reason.\n     * e.g. no decoder available for codec.\n     */\n    AV_PKT_DATA_FALLBACK_TRACK,\n\n    /**\n     * This side data corresponds to the AVCPBProperties struct.\n     */\n    AV_PKT_DATA_CPB_PROPERTIES,\n\n    /**\n     * Recommends skipping the specified number of samples\n     * @code\n     * u32le number of samples to skip from start of this packet\n     * u32le number of samples to skip from end of this packet\n     * u8    reason for start skip\n     * u8    reason for end   skip (0=padding silence, 1=convergence)\n     * @endcode\n     */\n    AV_PKT_DATA_SKIP_SAMPLES,\n\n    /**\n     * An AV_PKT_DATA_JP_DUALMONO side data packet indicates that\n     * the packet may contain \"dual mono\" audio specific to Japanese DTV\n     * and if it is true, recommends only the selected channel to be used.\n     * @code\n     * u8    selected channels (0=main/left, 1=sub/right, 2=both)\n     * @endcode\n     */\n    AV_PKT_DATA_JP_DUALMONO,\n\n    /**\n     * A list of zero terminated key/value strings. There is no end marker for\n     * the list, so it is required to rely on the side data size to stop.\n     */\n    AV_PKT_DATA_STRINGS_METADATA,\n\n    /**\n     * Subtitle event position\n     * @code\n     * u32le x1\n     * u32le y1\n     * u32le x2\n     * u32le y2\n     * @endcode\n     */\n    AV_PKT_DATA_SUBTITLE_POSITION,\n\n    /**\n     * Data found in BlockAdditional element of matroska container. There is\n     * no end marker for the data, so it is required to rely on the side data\n     * size to recognize the end. 8 byte id (as found in BlockAddId) followed\n     * by data.\n     */\n    AV_PKT_DATA_MATROSKA_BLOCKADDITIONAL,\n\n    /**\n     * The optional first identifier line of a WebVTT cue.\n     */\n    AV_PKT_DATA_WEBVTT_IDENTIFIER,\n\n    /**\n     * The optional settings (rendering instructions) that immediately\n     * follow the timestamp specifier of a WebVTT cue.\n     */\n    AV_PKT_DATA_WEBVTT_SETTINGS,\n\n    /**\n     * A list of zero terminated key/value strings. There is no end marker for\n     * the list, so it is required to rely on the side data size to stop. This\n     * side data includes updated metadata which appeared in the stream.\n     */\n    AV_PKT_DATA_METADATA_UPDATE,\n\n    /**\n     * MPEGTS stream ID as uint8_t, this is required to pass the stream ID\n     * information from the demuxer to the corresponding muxer.\n     */\n    AV_PKT_DATA_MPEGTS_STREAM_ID,\n\n    /**\n     * Mastering display metadata (based on SMPTE-2086:2014). This metadata\n     * should be associated with a video stream and contains data in the form\n     * of the AVMasteringDisplayMetadata struct.\n     */\n    AV_PKT_DATA_MASTERING_DISPLAY_METADATA,\n\n    /**\n     * This side data should be associated with a video stream and corresponds\n     * to the AVSphericalMapping structure.\n     */\n    AV_PKT_DATA_SPHERICAL,\n\n    /**\n     * Content light level (based on CTA-861.3). This metadata should be\n     * associated with a video stream and contains data in the form of the\n     * AVContentLightMetadata struct.\n     */\n    AV_PKT_DATA_CONTENT_LIGHT_LEVEL,\n\n    /**\n     * ATSC A53 Part 4 Closed Captions. This metadata should be associated with\n     * a video stream. A53 CC bitstream is stored as uint8_t in AVPacketSideData.data.\n     * The number of bytes of CC data is AVPacketSideData.size.\n     */\n    AV_PKT_DATA_A53_CC,\n\n    /**\n     * This side data is encryption initialization data.\n     * The format is not part of ABI, use av_encryption_init_info_* methods to\n     * access.\n     */\n    AV_PKT_DATA_ENCRYPTION_INIT_INFO,\n\n    /**\n     * This side data contains encryption info for how to decrypt the packet.\n     * The format is not part of ABI, use av_encryption_info_* methods to access.\n     */\n    AV_PKT_DATA_ENCRYPTION_INFO,\n\n    /**\n     * Active Format Description data consisting of a single byte as specified\n     * in ETSI TS 101 154 using AVActiveFormatDescription enum.\n     */\n    AV_PKT_DATA_AFD,\n\n    /**\n     * Producer Reference Time data corresponding to the AVProducerReferenceTime struct,\n     * usually exported by some encoders (on demand through the prft flag set in the\n     * AVCodecContext export_side_data field).\n     */\n    AV_PKT_DATA_PRFT,\n\n    /**\n     * ICC profile data consisting of an opaque octet buffer following the\n     * format described by ISO 15076-1.\n     */\n    AV_PKT_DATA_ICC_PROFILE,\n\n    /**\n     * DOVI configuration\n     * ref:\n     * dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2.1.2, section 2.2\n     * dolby-vision-bitstreams-in-mpeg-2-transport-stream-multiplex-v1.2, section 3.3\n     * Tags are stored in struct AVDOVIDecoderConfigurationRecord.\n     */\n    AV_PKT_DATA_DOVI_CONF,\n\n    /**\n     * Timecode which conforms to SMPTE ST 12-1:2014. The data is an array of 4 uint32_t\n     * where the first uint32_t describes how many (1-3) of the other timecodes are used.\n     * The timecode format is described in the documentation of av_timecode_get_smpte_from_framenum()\n     * function in libavutil/timecode.h.\n     */\n    AV_PKT_DATA_S12M_TIMECODE,\n\n    /**\n     * HDR10+ dynamic metadata associated with a video frame. The metadata is in\n     * the form of the AVDynamicHDRPlus struct and contains\n     * information for color volume transform - application 4 of\n     * SMPTE 2094-40:2016 standard.\n     */\n    AV_PKT_DATA_DYNAMIC_HDR10_PLUS,\n\n    /**\n     * IAMF Mix Gain Parameter Data associated with the audio frame. This metadata\n     * is in the form of the AVIAMFParamDefinition struct and contains information\n     * defined in sections 3.6.1 and 3.8.1 of the Immersive Audio Model and\n     * Formats standard.\n     */\n    AV_PKT_DATA_IAMF_MIX_GAIN_PARAM,\n\n    /**\n     * IAMF Demixing Info Parameter Data associated with the audio frame. This\n     * metadata is in the form of the AVIAMFParamDefinition struct and contains\n     * information defined in sections 3.6.1 and 3.8.2 of the Immersive Audio Model\n     * and Formats standard.\n     */\n    AV_PKT_DATA_IAMF_DEMIXING_INFO_PARAM,\n\n    /**\n     * IAMF Recon Gain Info Parameter Data associated with the audio frame. This\n     * metadata is in the form of the AVIAMFParamDefinition struct and contains\n     * information defined in sections 3.6.1 and 3.8.3 of the Immersive Audio Model\n     * and Formats standard.\n     */\n    AV_PKT_DATA_IAMF_RECON_GAIN_INFO_PARAM,\n\n    /**\n     * Ambient viewing environment metadata, as defined by H.274. This metadata\n     * should be associated with a video stream and contains data in the form\n     * of the AVAmbientViewingEnvironment struct.\n    */\n    AV_PKT_DATA_AMBIENT_VIEWING_ENVIRONMENT,\n\n    /**\n     * The number of pixels to discard from the top/bottom/left/right border of the\n     * decoded frame to obtain the sub-rectangle intended for presentation.\n     *\n     * @code\n     * u32le crop_top\n     * u32le crop_bottom\n     * u32le crop_left\n     * u32le crop_right\n     * @endcode\n     */\n    AV_PKT_DATA_FRAME_CROPPING,\n\n    /**\n     * Raw LCEVC payload data, as a uint8_t array, with NAL emulation\n     * bytes intact.\n     */\n    AV_PKT_DATA_LCEVC,\n\n    /**\n     * This side data contains information about the reference display width(s)\n     * and reference viewing distance(s) as well as information about the\n     * corresponding reference stereo pair(s), i.e., the pair(s) of views to be\n     * displayed for the viewer's left and right eyes on the reference display\n     * at the reference viewing distance.\n     * The payload is the AV3DReferenceDisplaysInfo struct defined in\n     * libavutil/tdrdi.h.\n     */\n    AV_PKT_DATA_3D_REFERENCE_DISPLAYS,\n\n    /**\n     * Contains the last received RTCP SR (Sender Report) information\n     * in the form of the AVRTCPSenderReport struct.\n     */\n    AV_PKT_DATA_RTCP_SR,\n\n    /**\n     * The number of side data types.\n     * This is not part of the public API/ABI in the sense that it may\n     * change when new side data types are added.\n     * This must stay the last enum value.\n     * If its value becomes huge, some code using it\n     * needs to be updated as it assumes it to be smaller than other limits.\n     */\n    AV_PKT_DATA_NB\n};\n\n/**\n * This structure stores auxiliary information for decoding, presenting, or\n * otherwise processing the coded stream. It is typically exported by demuxers\n * and encoders and can be fed to decoders and muxers either in a per packet\n * basis, or as global side data (applying to the entire coded stream).\n *\n * Global side data is handled as follows:\n * - During demuxing, it may be exported through\n *   @ref AVCodecParameters.coded_side_data \"AVStream's codec parameters\", which can\n *   then be passed as input to decoders through the\n *   @ref AVCodecContext.coded_side_data \"decoder context's side data\", for\n *   initialization.\n * - For muxing, it can be fed through @ref AVCodecParameters.coded_side_data\n *   \"AVStream's codec parameters\", typically  the output of encoders through\n *   the @ref AVCodecContext.coded_side_data \"encoder context's side data\", for\n *   initialization.\n *\n * Packet specific side data is handled as follows:\n * - During demuxing, it may be exported through @ref AVPacket.side_data\n *   \"AVPacket's side data\", which can then be passed as input to decoders.\n * - For muxing, it can be fed through @ref AVPacket.side_data \"AVPacket's\n *   side data\", typically the output of encoders.\n *\n * Different modules may accept or export different types of side data\n * depending on media type and codec. Refer to @ref AVPacketSideDataType for a\n * list of defined types and where they may be found or used.\n */\ntypedef struct AVPacketSideData {\n    uint8_t *data;\n    size_t   size;\n    enum AVPacketSideDataType type;\n} AVPacketSideData;\n\n/**\n * Allocate a new packet side data.\n *\n * @param sd    pointer to an array of side data to which the side data should\n *              be added. *sd may be NULL, in which case the array will be\n *              initialized.\n * @param nb_sd pointer to an integer containing the number of entries in\n *              the array. The integer value will be increased by 1 on success.\n * @param type  side data type\n * @param size  desired side data size\n * @param flags currently unused. Must be zero\n *\n * @return pointer to freshly allocated side data on success, or NULL otherwise.\n */\nAVPacketSideData *av_packet_side_data_new(AVPacketSideData **psd, int *pnb_sd,\n                                          enum AVPacketSideDataType type,\n                                          size_t size, int flags);\n\n/**\n * Wrap existing data as packet side data.\n *\n * @param sd    pointer to an array of side data to which the side data should\n *              be added. *sd may be NULL, in which case the array will be\n *              initialized\n * @param nb_sd pointer to an integer containing the number of entries in\n *              the array. The integer value will be increased by 1 on success.\n * @param type  side data type\n * @param data  a data array. It must be allocated with the av_malloc() family\n *              of functions. The ownership of the data is transferred to the\n *              side data array on success\n * @param size  size of the data array\n * @param flags currently unused. Must be zero\n *\n * @return pointer to freshly allocated side data on success, or NULL otherwise\n *         On failure, the side data array is unchanged and the data remains\n *         owned by the caller.\n */\nAVPacketSideData *av_packet_side_data_add(AVPacketSideData **sd, int *nb_sd,\n                                          enum AVPacketSideDataType type,\n                                          void *data, size_t size, int flags);\n\n/**\n * Get side information from a side data array.\n *\n * @param sd    the array from which the side data should be fetched\n * @param nb_sd value containing the number of entries in the array.\n * @param type  desired side information type\n *\n * @return pointer to side data if present or NULL otherwise\n */\nconst AVPacketSideData *av_packet_side_data_get(const AVPacketSideData *sd,\n                                                int nb_sd,\n                                                enum AVPacketSideDataType type);\n\n/**\n * Remove side data of the given type from a side data array.\n *\n * @param sd    the array from which the side data should be removed\n * @param nb_sd pointer to an integer containing the number of entries in\n *              the array. Will be reduced by the amount of entries removed\n *              upon return\n * @param type  side information type\n */\nvoid av_packet_side_data_remove(AVPacketSideData *sd, int *nb_sd,\n                                enum AVPacketSideDataType type);\n\n/**\n * Convenience function to free all the side data stored in an array, and\n * the array itself.\n *\n * @param sd    pointer to array of side data to free. Will be set to NULL\n *              upon return.\n * @param nb_sd pointer to an integer containing the number of entries in\n *              the array. Will be set to 0 upon return.\n */\nvoid av_packet_side_data_free(AVPacketSideData **sd, int *nb_sd);\n\nconst char *av_packet_side_data_name(enum AVPacketSideDataType type);\n\n/**\n * @}\n */\n\n/**\n * @defgroup lavc_packet AVPacket\n *\n * Types and functions for working with AVPacket.\n * @{\n */\n\n/**\n * This structure stores compressed data. It is typically exported by demuxers\n * and then passed as input to decoders, or received as output from encoders and\n * then passed to muxers.\n *\n * For video, it should typically contain one compressed frame. For audio it may\n * contain several compressed frames. Encoders are allowed to output empty\n * packets, with no compressed data, containing only side data\n * (e.g. to update some stream parameters at the end of encoding).\n *\n * The semantics of data ownership depends on the buf field.\n * If it is set, the packet data is dynamically allocated and is\n * valid indefinitely until a call to av_packet_unref() reduces the\n * reference count to 0.\n *\n * If the buf field is not set av_packet_ref() would make a copy instead\n * of increasing the reference count.\n *\n * The side data is always allocated with av_malloc(), copied by\n * av_packet_ref() and freed by av_packet_unref().\n *\n * sizeof(AVPacket) being a part of the public ABI is deprecated. once\n * av_init_packet() is removed, new packets will only be able to be allocated\n * with av_packet_alloc(), and new fields may be added to the end of the struct\n * with a minor bump.\n *\n * @see av_packet_alloc\n * @see av_packet_ref\n * @see av_packet_unref\n */\ntypedef struct AVPacket {\n    /**\n     * A reference to the reference-counted buffer where the packet data is\n     * stored.\n     * May be NULL, then the packet data is not reference-counted.\n     */\n    AVBufferRef *buf;\n    /**\n     * Presentation timestamp in AVStream->time_base units; the time at which\n     * the decompressed packet will be presented to the user.\n     * Can be AV_NOPTS_VALUE if it is not stored in the file.\n     * pts MUST be larger or equal to dts as presentation cannot happen before\n     * decompression, unless one wants to view hex dumps. Some formats misuse\n     * the terms dts and pts/cts to mean something different. Such timestamps\n     * must be converted to true pts/dts before they are stored in AVPacket.\n     */\n    int64_t pts;\n    /**\n     * Decompression timestamp in AVStream->time_base units; the time at which\n     * the packet is decompressed.\n     * Can be AV_NOPTS_VALUE if it is not stored in the file.\n     */\n    int64_t dts;\n    uint8_t *data;\n    int   size;\n    int   stream_index;\n    /**\n     * A combination of AV_PKT_FLAG values\n     */\n    int   flags;\n    /**\n     * Additional packet data that can be provided by the container.\n     * Packet can contain several types of side information.\n     */\n    AVPacketSideData *side_data;\n    int side_data_elems;\n\n    /**\n     * Duration of this packet in AVStream->time_base units, 0 if unknown.\n     * Equals next_pts - this_pts in presentation order.\n     */\n    int64_t duration;\n\n    int64_t pos;                            ///< byte position in stream, -1 if unknown\n\n    /**\n     * for some private data of the user\n     */\n    void *opaque;\n\n    /**\n     * AVBufferRef for free use by the API user. FFmpeg will never check the\n     * contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when\n     * the packet is unreferenced. av_packet_copy_props() calls create a new\n     * reference with av_buffer_ref() for the target packet's opaque_ref field.\n     *\n     * This is unrelated to the opaque field, although it serves a similar\n     * purpose.\n     */\n    AVBufferRef *opaque_ref;\n\n    /**\n     * Time base of the packet's timestamps.\n     * In the future, this field may be set on packets output by encoders or\n     * demuxers, but its value will be by default ignored on input to decoders\n     * or muxers.\n     */\n    AVRational time_base;\n} AVPacket;\n\n#if FF_API_INIT_PACKET\nattribute_deprecated\ntypedef struct AVPacketList {\n    AVPacket pkt;\n    struct AVPacketList *next;\n} AVPacketList;\n#endif\n\n#define AV_PKT_FLAG_KEY     0x0001 ///< The packet contains a keyframe\n#define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted\n/**\n * Flag is used to discard packets which are required to maintain valid\n * decoder state but are not required for output and should be dropped\n * after decoding.\n **/\n#define AV_PKT_FLAG_DISCARD   0x0004\n/**\n * The packet comes from a trusted source.\n *\n * Otherwise-unsafe constructs such as arbitrary pointers to data\n * outside the packet may be followed.\n */\n#define AV_PKT_FLAG_TRUSTED   0x0008\n/**\n * Flag is used to indicate packets that contain frames that can\n * be discarded by the decoder.  I.e. Non-reference frames.\n */\n#define AV_PKT_FLAG_DISPOSABLE 0x0010\n\nenum AVSideDataParamChangeFlags {\n    AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE    = 0x0004,\n    AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS     = 0x0008,\n};\n\n/**\n * Allocate an AVPacket and set its fields to default values.  The resulting\n * struct must be freed using av_packet_free().\n *\n * @return An AVPacket filled with default values or NULL on failure.\n *\n * @note this only allocates the AVPacket itself, not the data buffers. Those\n * must be allocated through other means such as av_new_packet.\n *\n * @see av_new_packet\n */\nAVPacket *av_packet_alloc(void);\n\n/**\n * Create a new packet that references the same data as src.\n *\n * This is a shortcut for av_packet_alloc()+av_packet_ref().\n *\n * @return newly created AVPacket on success, NULL on error.\n *\n * @see av_packet_alloc\n * @see av_packet_ref\n */\nAVPacket *av_packet_clone(const AVPacket *src);\n\n/**\n * Free the packet, if the packet is reference counted, it will be\n * unreferenced first.\n *\n * @param pkt packet to be freed. The pointer will be set to NULL.\n * @note passing NULL is a no-op.\n */\nvoid av_packet_free(AVPacket **pkt);\n\n#if FF_API_INIT_PACKET\n/**\n * Initialize optional fields of a packet with default values.\n *\n * Note, this does not touch the data and size members, which have to be\n * initialized separately.\n *\n * @param pkt packet\n *\n * @see av_packet_alloc\n * @see av_packet_unref\n *\n * @deprecated This function is deprecated. Once it's removed,\n               sizeof(AVPacket) will not be a part of the ABI anymore.\n */\nattribute_deprecated\nvoid av_init_packet(AVPacket *pkt);\n#endif\n\n/**\n * Allocate the payload of a packet and initialize its fields with\n * default values.\n *\n * @param pkt packet\n * @param size wanted payload size\n * @return 0 if OK, AVERROR_xxx otherwise\n */\nint av_new_packet(AVPacket *pkt, int size);\n\n/**\n * Reduce packet size, correctly zeroing padding\n *\n * @param pkt packet\n * @param size new size\n */\nvoid av_shrink_packet(AVPacket *pkt, int size);\n\n/**\n * Increase packet size, correctly zeroing padding\n *\n * @param pkt packet\n * @param grow_by number of bytes by which to increase the size of the packet\n */\nint av_grow_packet(AVPacket *pkt, int grow_by);\n\n/**\n * Initialize a reference-counted packet from av_malloc()ed data.\n *\n * @param pkt packet to be initialized. This function will set the data, size,\n *        and buf fields, all others are left untouched.\n * @param data Data allocated by av_malloc() to be used as packet data. If this\n *        function returns successfully, the data is owned by the underlying AVBuffer.\n *        The caller may not access the data through other means.\n * @param size size of data in bytes, without the padding. I.e. the full buffer\n *        size is assumed to be size + AV_INPUT_BUFFER_PADDING_SIZE.\n *\n * @return 0 on success, a negative AVERROR on error\n */\nint av_packet_from_data(AVPacket *pkt, uint8_t *data, int size);\n\n/**\n * Allocate new information of a packet.\n *\n * @param pkt packet\n * @param type side information type\n * @param size side information size\n * @return pointer to fresh allocated data or NULL otherwise\n */\nuint8_t* av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type,\n                                 size_t size);\n\n/**\n * Wrap an existing array as a packet side data.\n *\n * @param pkt packet\n * @param type side information type\n * @param data the side data array. It must be allocated with the av_malloc()\n *             family of functions. The ownership of the data is transferred to\n *             pkt.\n * @param size side information size\n * @return a non-negative number on success, a negative AVERROR code on\n *         failure. On failure, the packet is unchanged and the data remains\n *         owned by the caller.\n */\nint av_packet_add_side_data(AVPacket *pkt, enum AVPacketSideDataType type,\n                            uint8_t *data, size_t size);\n\n/**\n * Shrink the already allocated side data buffer\n *\n * @param pkt packet\n * @param type side information type\n * @param size new side information size\n * @return 0 on success, < 0 on failure\n */\nint av_packet_shrink_side_data(AVPacket *pkt, enum AVPacketSideDataType type,\n                               size_t size);\n\n/**\n * Get side information from packet.\n *\n * @param pkt packet\n * @param type desired side information type\n * @param size If supplied, *size will be set to the size of the side data\n *             or to zero if the desired side data is not present.\n * @return pointer to data if present or NULL otherwise\n */\nuint8_t* av_packet_get_side_data(const AVPacket *pkt, enum AVPacketSideDataType type,\n                                 size_t *size);\n\n/**\n * Pack a dictionary for use in side_data.\n *\n * @param dict The dictionary to pack.\n * @param size pointer to store the size of the returned data\n * @return pointer to data if successful, NULL otherwise\n */\nuint8_t *av_packet_pack_dictionary(AVDictionary *dict, size_t *size);\n/**\n * Unpack a dictionary from side_data.\n *\n * @param data data from side_data\n * @param size size of the data\n * @param dict the metadata storage dictionary\n * @return 0 on success, < 0 on failure\n */\nint av_packet_unpack_dictionary(const uint8_t *data, size_t size,\n                                AVDictionary **dict);\n\n/**\n * Convenience function to free all the side data stored.\n * All the other fields stay untouched.\n *\n * @param pkt packet\n */\nvoid av_packet_free_side_data(AVPacket *pkt);\n\n/**\n * Setup a new reference to the data described by a given packet\n *\n * If src is reference-counted, setup dst as a new reference to the\n * buffer in src. Otherwise allocate a new buffer in dst and copy the\n * data from src into it.\n *\n * All the other fields are copied from src.\n *\n * @see av_packet_unref\n *\n * @param dst Destination packet. Will be completely overwritten.\n * @param src Source packet\n *\n * @return 0 on success, a negative AVERROR on error. On error, dst\n *         will be blank (as if returned by av_packet_alloc()).\n */\nint av_packet_ref(AVPacket *dst, const AVPacket *src);\n\n/**\n * Wipe the packet.\n *\n * Unreference the buffer referenced by the packet and reset the\n * remaining packet fields to their default values.\n *\n * @param pkt The packet to be unreferenced.\n */\nvoid av_packet_unref(AVPacket *pkt);\n\n/**\n * Move every field in src to dst and reset src.\n *\n * @see av_packet_unref\n *\n * @param src Source packet, will be reset\n * @param dst Destination packet\n */\nvoid av_packet_move_ref(AVPacket *dst, AVPacket *src);\n\n/**\n * Copy only \"properties\" fields from src to dst.\n *\n * Properties for the purpose of this function are all the fields\n * beside those related to the packet data (buf, data, size)\n *\n * @param dst Destination packet\n * @param src Source packet\n *\n * @return 0 on success AVERROR on failure.\n */\nint av_packet_copy_props(AVPacket *dst, const AVPacket *src);\n\n/**\n * Ensure the data described by a given packet is reference counted.\n *\n * @note This function does not ensure that the reference will be writable.\n *       Use av_packet_make_writable instead for that purpose.\n *\n * @see av_packet_ref\n * @see av_packet_make_writable\n *\n * @param pkt packet whose data should be made reference counted.\n *\n * @return 0 on success, a negative AVERROR on error. On failure, the\n *         packet is unchanged.\n */\nint av_packet_make_refcounted(AVPacket *pkt);\n\n/**\n * Create a writable reference for the data described by a given packet,\n * avoiding data copy if possible.\n *\n * @param pkt Packet whose data should be made writable.\n *\n * @return 0 on success, a negative AVERROR on failure. On failure, the\n *         packet is unchanged.\n */\nint av_packet_make_writable(AVPacket *pkt);\n\n/**\n * Convert valid timing fields (timestamps / durations) in a packet from one\n * timebase to another. Timestamps with unknown values (AV_NOPTS_VALUE) will be\n * ignored.\n *\n * @param pkt packet on which the conversion will be performed\n * @param tb_src source timebase, in which the timing fields in pkt are\n *               expressed\n * @param tb_dst destination timebase, to which the timing fields will be\n *               converted\n */\nvoid av_packet_rescale_ts(AVPacket *pkt, AVRational tb_src, AVRational tb_dst);\n\n/**\n * Allocate an AVContainerFifo instance for AVPacket.\n *\n * @param flags currently unused\n */\nstruct AVContainerFifo *av_container_fifo_alloc_avpacket(unsigned flags);\n\n/**\n * @}\n */\n\n#endif // AVCODEC_PACKET_H\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/qsv.h",
    "content": "/*\n * Intel MediaSDK QSV public API\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_QSV_H\n#define AVCODEC_QSV_H\n\n#include <mfxvideo.h>\n\n#include \"libavutil/buffer.h\"\n\n/**\n * This struct is used for communicating QSV parameters between libavcodec and\n * the caller. It is managed by the caller and must be assigned to\n * AVCodecContext.hwaccel_context.\n * - decoding: hwaccel_context must be set on return from the get_format()\n *             callback\n * - encoding: hwaccel_context must be set before avcodec_open2()\n */\ntypedef struct AVQSVContext {\n    /**\n     * If non-NULL, the session to use for encoding or decoding.\n     * Otherwise, libavcodec will try to create an internal session.\n     */\n    mfxSession session;\n\n    /**\n     * The IO pattern to use.\n     */\n    int iopattern;\n\n    /**\n     * Extra buffers to pass to encoder or decoder initialization.\n     */\n    mfxExtBuffer **ext_buffers;\n    int         nb_ext_buffers;\n\n    /**\n     * Encoding only. If this field is set to non-zero by the caller, libavcodec\n     * will create an mfxExtOpaqueSurfaceAlloc extended buffer and pass it to\n     * the encoder initialization. This only makes sense if iopattern is also\n     * set to MFX_IOPATTERN_IN_OPAQUE_MEMORY.\n     *\n     * The number of allocated opaque surfaces will be the sum of the number\n     * required by the encoder and the user-provided value nb_opaque_surfaces.\n     * The array of the opaque surfaces will be exported to the caller through\n     * the opaque_surfaces field.\n     *\n     * The caller must set this field to zero for oneVPL (MFX_VERSION >= 2.0)\n     */\n    int opaque_alloc;\n\n    /**\n     * Encoding only, and only if opaque_alloc is set to non-zero. Before\n     * calling avcodec_open2(), the caller should set this field to the number\n     * of extra opaque surfaces to allocate beyond what is required by the\n     * encoder.\n     *\n     * On return from avcodec_open2(), this field will be set by libavcodec to\n     * the total number of allocated opaque surfaces.\n     */\n    int nb_opaque_surfaces;\n\n    /**\n     * Encoding only, and only if opaque_alloc is set to non-zero. On return\n     * from avcodec_open2(), this field will be used by libavcodec to export the\n     * array of the allocated opaque surfaces to the caller, so they can be\n     * passed to other parts of the pipeline.\n     *\n     * The buffer reference exported here is owned and managed by libavcodec,\n     * the callers should make their own reference with av_buffer_ref() and free\n     * it with av_buffer_unref() when it is no longer needed.\n     *\n     * The buffer data is an nb_opaque_surfaces-sized array of mfxFrameSurface1.\n     */\n    AVBufferRef *opaque_surfaces;\n\n    /**\n     * Encoding only, and only if opaque_alloc is set to non-zero. On return\n     * from avcodec_open2(), this field will be set to the surface type used in\n     * the opaque allocation request.\n     */\n    int opaque_alloc_type;\n} AVQSVContext;\n\n/**\n * Allocate a new context.\n *\n * It must be freed by the caller with av_free().\n */\nAVQSVContext *av_qsv_alloc_context(void);\n\n#endif /* AVCODEC_QSV_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/smpte_436m.h",
    "content": "/*\n * MXF SMPTE-436M VBI/ANC parsing functions\n * Copyright (c) 2025 Jacob Lifshay\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_SMPTE_436M_H\n#define AVCODEC_SMPTE_436M_H\n\n#include <stdint.h>\n\n/**\n * Iterator over the ANC packets in a single AV_CODEC_ID_SMPTE_436M_ANC AVPacket's data\n */\ntypedef struct AVSmpte436mAncIterator {\n    uint16_t       anc_packets_left;\n    int            size_left;\n    const uint8_t *data_left;\n} AVSmpte436mAncIterator;\n\n/**\n * Wrapping Type from Table 7 (page 13) of:\n * https://pub.smpte.org/latest/st436/s436m-2006.pdf\n */\ntypedef enum AVSmpte436mWrappingType\n{\n    AV_SMPTE_436M_WRAPPING_TYPE_VANC_FRAME             = 1,\n    AV_SMPTE_436M_WRAPPING_TYPE_VANC_FIELD_1           = 2,\n    AV_SMPTE_436M_WRAPPING_TYPE_VANC_FIELD_2           = 3,\n    AV_SMPTE_436M_WRAPPING_TYPE_VANC_PROGRESSIVE_FRAME = 4,\n    AV_SMPTE_436M_WRAPPING_TYPE_HANC_FRAME             = 0x11,\n    AV_SMPTE_436M_WRAPPING_TYPE_HANC_FIELD_1           = 0x12,\n    AV_SMPTE_436M_WRAPPING_TYPE_HANC_FIELD_2           = 0x13,\n    AV_SMPTE_436M_WRAPPING_TYPE_HANC_PROGRESSIVE_FRAME = 0x14,\n    /** not a real wrapping type, just here to guarantee the enum is big enough */\n    AV_SMPTE_436M_WRAPPING_TYPE_MAX = 0xFF,\n} AVSmpte436mWrappingType;\n\n/**\n * Payload Sample Coding from Table 4 (page 10) and Table 7 (page 13) of:\n * https://pub.smpte.org/latest/st436/s436m-2006.pdf\n */\ntypedef enum AVSmpte436mPayloadSampleCoding\n{\n    /** only used for VBI */\n    AV_SMPTE_436M_PAYLOAD_SAMPLE_CODING_1BIT_LUMA = 1,\n    /** only used for VBI */\n    AV_SMPTE_436M_PAYLOAD_SAMPLE_CODING_1BIT_COLOR_DIFF = 2,\n    /** only used for VBI */\n    AV_SMPTE_436M_PAYLOAD_SAMPLE_CODING_1BIT_LUMA_AND_COLOR_DIFF = 3,\n    /** used for VBI and ANC */\n    AV_SMPTE_436M_PAYLOAD_SAMPLE_CODING_8BIT_LUMA = 4,\n    /** used for VBI and ANC */\n    AV_SMPTE_436M_PAYLOAD_SAMPLE_CODING_8BIT_COLOR_DIFF = 5,\n    /** used for VBI and ANC */\n    AV_SMPTE_436M_PAYLOAD_SAMPLE_CODING_8BIT_LUMA_AND_COLOR_DIFF = 6,\n    /** used for VBI and ANC */\n    AV_SMPTE_436M_PAYLOAD_SAMPLE_CODING_10BIT_LUMA = 7,\n    /** used for VBI and ANC */\n    AV_SMPTE_436M_PAYLOAD_SAMPLE_CODING_10BIT_COLOR_DIFF = 8,\n    /** used for VBI and ANC */\n    AV_SMPTE_436M_PAYLOAD_SAMPLE_CODING_10BIT_LUMA_AND_COLOR_DIFF = 9,\n    /** only used for ANC */\n    AV_SMPTE_436M_PAYLOAD_SAMPLE_CODING_8BIT_LUMA_WITH_PARITY_ERROR = 10,\n    /** only used for ANC */\n    AV_SMPTE_436M_PAYLOAD_SAMPLE_CODING_8BIT_COLOR_DIFF_WITH_PARITY_ERROR = 11,\n    /** only used for ANC */\n    AV_SMPTE_436M_PAYLOAD_SAMPLE_CODING_8BIT_LUMA_AND_COLOR_DIFF_WITH_PARITY_ERROR = 12,\n    /** not a real sample coding, just here to guarantee the enum is big enough */\n    AV_SMPTE_436M_PAYLOAD_SAMPLE_CODING_MAX = 0xFF,\n} AVSmpte436mPayloadSampleCoding;\n\n/** the payload capacity of AVSmpte291mAnc8bit (and of AVSmpte291mAnc10bit when that gets added) */\n#define AV_SMPTE_291M_ANC_PAYLOAD_CAPACITY 0xFF\n\n/**\n * An ANC packet with an 8-bit payload.\n * This can be decoded from AVSmpte436mCodedAnc::payload.\n *\n * Note: Some ANC packets need a 10-bit payload, if stored in this struct,\n * the most-significant 2 bits of each sample are discarded.\n */\ntypedef struct AVSmpte291mAnc8bit {\n    uint8_t did;\n    uint8_t sdid_or_dbn;\n    uint8_t data_count;\n    uint8_t payload[AV_SMPTE_291M_ANC_PAYLOAD_CAPACITY];\n    uint8_t checksum;\n} AVSmpte291mAnc8bit;\n\n/** max number of samples that can be stored in the payload of AVSmpte436mCodedAnc */\n#define AV_SMPTE_436M_CODED_ANC_SAMPLE_CAPACITY                                                     \\\n    (AV_SMPTE_291M_ANC_PAYLOAD_CAPACITY + 4) /* 4 for did, sdid_or_dbn, data_count, and checksum */\n/** max number of bytes that can be stored in the payload of AVSmpte436mCodedAnc */\n#define AV_SMPTE_436M_CODED_ANC_PAYLOAD_CAPACITY (((AV_SMPTE_436M_CODED_ANC_SAMPLE_CAPACITY + 2) / 3) * 4)\n\n/**\n * An encoded ANC packet within a single AV_CODEC_ID_SMPTE_436M_ANC AVPacket's data.\n * The repeated section of Table 7 (page 13) of:\n * https://pub.smpte.org/latest/st436/s436m-2006.pdf\n */\ntypedef struct AVSmpte436mCodedAnc {\n    uint16_t                       line_number;\n    AVSmpte436mWrappingType        wrapping_type;\n    AVSmpte436mPayloadSampleCoding payload_sample_coding;\n    uint16_t                       payload_sample_count;\n    uint32_t                       payload_array_length;\n    /** the payload, has size payload_array_length.\n     * can be decoded into AVSmpte291mAnc8bit\n     */\n    uint8_t payload[AV_SMPTE_436M_CODED_ANC_PAYLOAD_CAPACITY];\n} AVSmpte436mCodedAnc;\n\n/**\n * Validate a AVSmpte436mCodedAnc structure. Doesn't check if the payload is valid.\n * @param[in]  anc ANC packet to validate\n * @return 0 on success, AVERROR codes otherwise.\n */\nint av_smpte_436m_coded_anc_validate(const AVSmpte436mCodedAnc *anc);\n\n/**\n * Encode ANC packets into a single AV_CODEC_ID_SMPTE_436M_ANC AVPacket's data.\n * @param[in]  anc_packet_count number of ANC packets to encode\n * @param[in]  anc_packets      the ANC packets to encode\n * @param[in]  size             the size of out. ignored if out is NULL.\n * @param[out] out              Output bytes. Doesn't write anything if out is NULL.\n * @return the number of bytes written on success, AVERROR codes otherwise.\n *         If out is NULL, returns the number of bytes it would have written.\n */\nint av_smpte_436m_anc_encode(uint8_t *out, int size, int anc_packet_count, const AVSmpte436mCodedAnc *anc_packets);\n\nstruct AVPacket;\n\n/**\n * Append more ANC packets to a single AV_CODEC_ID_SMPTE_436M_ANC AVPacket's data.\n * @param[in]  anc_packet_count number of ANC packets to encode\n * @param[in]  anc_packets      the ANC packets to encode\n * @param      pkt              the AVPacket to append to.\n *                              it must either be size 0 or contain valid SMPTE_436M_ANC data.\n * @return 0 on success, AVERROR codes otherwise.\n */\nint av_smpte_436m_anc_append(struct AVPacket *pkt, int anc_packet_count, const AVSmpte436mCodedAnc *anc_packets);\n\n/**\n * Set up iteration over the ANC packets in a single AV_CODEC_ID_SMPTE_436M_ANC AVPacket's data.\n * @param[in]  buf      Pointer to the data from a AV_CODEC_ID_SMPTE_436M_ANC AVPacket.\n * @param[in]  buf_size Size of the data from a AV_CODEC_ID_SMPTE_436M_ANC AVPacket.\n * @param[out] iter     Pointer to the iterator.\n * @return 0 on success, AVERROR codes otherwise.\n */\nint av_smpte_436m_anc_iter_init(AVSmpte436mAncIterator *iter, const uint8_t *buf, int buf_size);\n\n/**\n * Get the next ANC packet from the iterator, advancing the iterator.\n * @param[in,out] iter Pointer to the iterator.\n * @param[out]    anc  The returned ANC packet.\n * @return 0 on success, AVERROR_EOF when the iterator has reached the end, AVERROR codes otherwise.\n */\nint av_smpte_436m_anc_iter_next(AVSmpte436mAncIterator *iter, AVSmpte436mCodedAnc *anc);\n\n/**\n * Get the minimum number of bytes needed to store a AVSmpte436mCodedAnc payload.\n * @param sample_coding the payload sample coding\n * @param sample_count  the number of samples stored in the payload\n * @return returns the minimum number of bytes needed, on error returns < 0.\n *         always <= SMPTE_436M_CODED_ANC_PAYLOAD_CAPACITY\n */\nint av_smpte_436m_coded_anc_payload_size(AVSmpte436mPayloadSampleCoding sample_coding, uint16_t sample_count);\n\n/**\n * Decode a AVSmpte436mCodedAnc payload into AVSmpte291mAnc8bit\n * @param[in]  sample_coding the payload sample coding\n * @param[in]  sample_count  the number of samples stored in the payload\n * @param[in]  payload       the bytes storing the payload,\n *                           the needed size can be obtained from\n                             avpriv_smpte_436m_coded_anc_payload_size\n * @param[in]  log_ctx       context pointer for av_log\n * @param[out] out           The decoded ANC packet.\n * @return returns 0 on success, otherwise < 0.\n */\nint av_smpte_291m_anc_8bit_decode(AVSmpte291mAnc8bit            *out,\n                                  AVSmpte436mPayloadSampleCoding sample_coding,\n                                  uint16_t                       sample_count,\n                                  const uint8_t                 *payload,\n                                  void                          *log_ctx);\n\n/**\n * Fill in the correct checksum for a AVSmpte291mAnc8bit\n * @param[in,out] anc The ANC packet.\n */\nvoid av_smpte_291m_anc_8bit_fill_checksum(AVSmpte291mAnc8bit *anc);\n\n/**\n * Compute the sample count needed to encode a AVSmpte291mAnc8bit into a AVSmpte436mCodedAnc payload\n * @param[in] anc           The ANC packet.\n * @param[in] sample_coding The sample coding.\n * @param[in] log_ctx       context pointer for av_log\n * @return returns the sample count on success, otherwise < 0.\n */\nint av_smpte_291m_anc_8bit_get_sample_count(const AVSmpte291mAnc8bit      *anc,\n                                            AVSmpte436mPayloadSampleCoding sample_coding,\n                                            void                          *log_ctx);\n\n/**\n * Encode a AVSmpte291mAnc8bit into a AVSmpte436mCodedAnc\n * @param[in]  line_number   the line number the ANC packet is on\n * @param[in]  wrapping_type the wrapping type\n * @param[in]  sample_coding the payload sample coding\n * @param[in]  payload       the ANC packet to encode.\n * @param[in]  log_ctx       context pointer for av_log\n * @param[out] out           The encoded ANC packet.\n * @return returns 0 on success, otherwise < 0.\n */\nint av_smpte_291m_anc_8bit_encode(AVSmpte436mCodedAnc           *out,\n                                  uint16_t                       line_number,\n                                  AVSmpte436mWrappingType        wrapping_type,\n                                  AVSmpte436mPayloadSampleCoding sample_coding,\n                                  const AVSmpte291mAnc8bit      *payload,\n                                  void                          *log_ctx);\n\n/** AVSmpte291mAnc8bit::did when carrying CTA-708 data (for AV_CODEC_ID_EIA_608) */\n#define AV_SMPTE_291M_ANC_DID_CTA_708 0x61\n\n/** AVSmpte291mAnc8bit::sdid_or_dbn when carrying CTA-708 data (for AV_CODEC_ID_EIA_608) */\n#define AV_SMPTE_291M_ANC_SDID_CTA_708 0x1\n\n/**\n * Try to decode an ANC packet into EIA-608/CTA-708 data (AV_CODEC_ID_EIA_608). This\n * @param[in]  anc     The ANC packet.\n * @param[in]  log_ctx Context pointer for av_log\n * @param[out] cc_data the buffer to store the extracted EIA-608/CTA-708 data,\n *                     you can pass NULL to not store the data.\n *                     the required size is 3 * cc_count bytes.\n *                     SMPTE_291M_ANC_PAYLOAD_CAPACITY is always enough size.\n * @return returns cc_count (>= 0) on success, AVERROR(EAGAIN) if it wasn't a CTA-708 ANC packet, < 0 on error.\n */\nint av_smpte_291m_anc_8bit_extract_cta_708(const AVSmpte291mAnc8bit *anc, uint8_t *cc_data, void *log_ctx);\n\n#endif /* AVCODEC_SMPTE_436M_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/vdpau.h",
    "content": "/*\n * The Video Decode and Presentation API for UNIX (VDPAU) is used for\n * hardware-accelerated decoding of MPEG-1/2, H.264 and VC-1.\n *\n * Copyright (C) 2008 NVIDIA\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_VDPAU_H\n#define AVCODEC_VDPAU_H\n\n/**\n * @file\n * @ingroup lavc_codec_hwaccel_vdpau\n * Public libavcodec VDPAU header.\n */\n\n\n/**\n * @defgroup lavc_codec_hwaccel_vdpau VDPAU Decoder and Renderer\n * @ingroup lavc_codec_hwaccel\n *\n * VDPAU hardware acceleration has two modules\n * - VDPAU decoding\n * - VDPAU presentation\n *\n * The VDPAU decoding module parses all headers using FFmpeg\n * parsing mechanisms and uses VDPAU for the actual decoding.\n *\n * As per the current implementation, the actual decoding\n * and rendering (API calls) are done as part of the VDPAU\n * presentation (vo_vdpau.c) module.\n *\n * @{\n */\n\n#include <vdpau/vdpau.h>\n\n#include \"libavutil/avconfig.h\"\n#include \"libavutil/attributes.h\"\n\n#include \"avcodec.h\"\n\nstruct AVCodecContext;\nstruct AVFrame;\n\ntypedef int (*AVVDPAU_Render2)(struct AVCodecContext *, struct AVFrame *,\n                               const VdpPictureInfo *, uint32_t,\n                               const VdpBitstreamBuffer *);\n\n/**\n * This structure is used to share data between the libavcodec library and\n * the client video application.\n * This structure will be allocated and stored in AVCodecContext.hwaccel_context\n * by av_vdpau_bind_context(). Members can be set by the user once\n * during initialization or through each AVCodecContext.get_buffer()\n * function call. In any case, they must be valid prior to calling\n * decoding functions.\n *\n * The size of this structure is not a part of the public ABI and must not\n * be used outside of libavcodec.\n */\ntypedef struct AVVDPAUContext {\n    /**\n     * VDPAU decoder handle\n     *\n     * Set by user.\n     */\n    VdpDecoder decoder;\n\n    /**\n     * VDPAU decoder render callback\n     *\n     * Set by the user.\n     */\n    VdpDecoderRender *render;\n\n    AVVDPAU_Render2 render2;\n} AVVDPAUContext;\n\n/**\n * Associate a VDPAU device with a codec context for hardware acceleration.\n * This function is meant to be called from the get_format() codec callback,\n * or earlier. It can also be called after avcodec_flush_buffers() to change\n * the underlying VDPAU device mid-stream (e.g. to recover from non-transparent\n * display preemption).\n *\n * @note get_format() must return AV_PIX_FMT_VDPAU if this function completes\n * successfully.\n *\n * @param avctx decoding context whose get_format() callback is invoked\n * @param device VDPAU device handle to use for hardware acceleration\n * @param get_proc_address VDPAU device driver\n * @param flags zero of more OR'd AV_HWACCEL_FLAG_* flags\n *\n * @return 0 on success, an AVERROR code on failure.\n */\nint av_vdpau_bind_context(AVCodecContext *avctx, VdpDevice device,\n                          VdpGetProcAddress *get_proc_address, unsigned flags);\n\n/**\n * Gets the parameters to create an adequate VDPAU video surface for the codec\n * context using VDPAU hardware decoding acceleration.\n *\n * @note Behavior is undefined if the context was not successfully bound to a\n * VDPAU device using av_vdpau_bind_context().\n *\n * @param avctx the codec context being used for decoding the stream\n * @param type storage space for the VDPAU video surface chroma type\n *              (or NULL to ignore)\n * @param width storage space for the VDPAU video surface pixel width\n *              (or NULL to ignore)\n * @param height storage space for the VDPAU video surface pixel height\n *              (or NULL to ignore)\n *\n * @return 0 on success, a negative AVERROR code on failure.\n */\nint av_vdpau_get_surface_parameters(AVCodecContext *avctx, VdpChromaType *type,\n                                    uint32_t *width, uint32_t *height);\n\n/** @} */\n\n#endif /* AVCODEC_VDPAU_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/version.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_VERSION_H\n#define AVCODEC_VERSION_H\n\n/**\n * @file\n * @ingroup libavc\n * Libavcodec version macros.\n */\n\n#include \"libavutil/version.h\"\n\n#include \"version_major.h\"\n\n#define LIBAVCODEC_VERSION_MINOR  11\n#define LIBAVCODEC_VERSION_MICRO 100\n\n#define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \\\n                                               LIBAVCODEC_VERSION_MINOR, \\\n                                               LIBAVCODEC_VERSION_MICRO)\n#define LIBAVCODEC_VERSION      AV_VERSION(LIBAVCODEC_VERSION_MAJOR,    \\\n                                           LIBAVCODEC_VERSION_MINOR,    \\\n                                           LIBAVCODEC_VERSION_MICRO)\n#define LIBAVCODEC_BUILD        LIBAVCODEC_VERSION_INT\n\n#define LIBAVCODEC_IDENT        \"Lavc\" AV_STRINGIFY(LIBAVCODEC_VERSION)\n\n#endif /* AVCODEC_VERSION_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/version_major.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_VERSION_MAJOR_H\n#define AVCODEC_VERSION_MAJOR_H\n\n/**\n * @file\n * @ingroup libavc\n * Libavcodec version macros.\n */\n\n#define LIBAVCODEC_VERSION_MAJOR  62\n\n/**\n * FF_API_* defines may be placed below to indicate public API that will be\n * dropped at a future version bump. The defines themselves are not part of\n * the public API and may change, break or disappear at any time.\n *\n * @note, when bumping the major version it is recommended to manually\n * disable each FF_API_* in its own commit instead of disabling them all\n * at once through the bump. This improves the git bisect-ability of the change.\n */\n\n#define FF_API_INIT_PACKET         (LIBAVCODEC_VERSION_MAJOR < 63)\n\n#define FF_API_V408_CODECID        (LIBAVCODEC_VERSION_MAJOR < 63)\n#define FF_API_CODEC_PROPS         (LIBAVCODEC_VERSION_MAJOR < 63)\n#define FF_API_EXR_GAMMA           (LIBAVCODEC_VERSION_MAJOR < 63)\n\n#define FF_API_NVDEC_OLD_PIX_FMTS  (LIBAVCODEC_VERSION_MAJOR < 63)\n\n// reminder to remove the OMX encoder on next major bump\n#define FF_CODEC_OMX               (LIBAVCODEC_VERSION_MAJOR < 63)\n// reminder to remove Sonic Lossy/Lossless encoders on next major bump\n#define FF_CODEC_SONIC_ENC         (LIBAVCODEC_VERSION_MAJOR < 63)\n// reminder to remove Sonic decoder on next-next major bump\n#define FF_CODEC_SONIC_DEC         (LIBAVCODEC_VERSION_MAJOR < 63)\n\n#endif /* AVCODEC_VERSION_MAJOR_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/videotoolbox.h",
    "content": "/*\n * Videotoolbox hardware acceleration\n *\n * copyright (c) 2012 Sebastien Zwickert\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVCODEC_VIDEOTOOLBOX_H\n#define AVCODEC_VIDEOTOOLBOX_H\n\n/**\n * @file\n * @ingroup lavc_codec_hwaccel_videotoolbox\n * Public libavcodec Videotoolbox header.\n */\n\n/**\n * @defgroup lavc_codec_hwaccel_videotoolbox VideoToolbox Decoder\n * @ingroup lavc_codec_hwaccel\n *\n * Hardware accelerated decoding using VideoToolbox on Apple Platforms\n *\n * @{\n */\n\n#include <stdint.h>\n\n#define Picture QuickdrawPicture\n#include <VideoToolbox/VideoToolbox.h>\n#undef Picture\n\n#include \"libavcodec/avcodec.h\"\n\n#include \"libavutil/attributes.h\"\n\n/**\n * This struct holds all the information that needs to be passed\n * between the caller and libavcodec for initializing Videotoolbox decoding.\n * Its size is not a part of the public ABI, it must be allocated with\n * av_videotoolbox_alloc_context() and freed with av_free().\n */\ntypedef struct AVVideotoolboxContext {\n    /**\n     * Videotoolbox decompression session object.\n     */\n    VTDecompressionSessionRef session;\n\n    /**\n     * CVPixelBuffer Format Type that Videotoolbox will use for decoded frames.\n     * set by the caller. If this is set to 0, then no specific format is\n     * requested from the decoder, and its native format is output.\n     */\n    OSType cv_pix_fmt_type;\n\n    /**\n     * CoreMedia Format Description that Videotoolbox will use to create the decompression session.\n     */\n    CMVideoFormatDescriptionRef cm_fmt_desc;\n\n    /**\n     * CoreMedia codec type that Videotoolbox will use to create the decompression session.\n     */\n    int cm_codec_type;\n} AVVideotoolboxContext;\n\n/**\n * @}\n */\n\n#endif /* AVCODEC_VIDEOTOOLBOX_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavcodec/vorbis_parser.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * A public API for Vorbis parsing\n *\n * Determines the duration for each packet.\n */\n\n#ifndef AVCODEC_VORBIS_PARSER_H\n#define AVCODEC_VORBIS_PARSER_H\n\n#include <stdint.h>\n\ntypedef struct AVVorbisParseContext AVVorbisParseContext;\n\n/**\n * Allocate and initialize the Vorbis parser using headers in the extradata.\n */\nAVVorbisParseContext *av_vorbis_parse_init(const uint8_t *extradata,\n                                           int extradata_size);\n\n/**\n * Free the parser and everything associated with it.\n */\nvoid av_vorbis_parse_free(AVVorbisParseContext **s);\n\n#define VORBIS_FLAG_HEADER  0x00000001\n#define VORBIS_FLAG_COMMENT 0x00000002\n#define VORBIS_FLAG_SETUP   0x00000004\n\n/**\n * Get the duration for a Vorbis packet.\n *\n * If @p flags is @c NULL,\n * special frames are considered invalid.\n *\n * @param s        Vorbis parser context\n * @param buf      buffer containing a Vorbis frame\n * @param buf_size size of the buffer\n * @param flags    flags for special frames\n */\nint av_vorbis_parse_frame_flags(AVVorbisParseContext *s, const uint8_t *buf,\n                                int buf_size, int *flags);\n\n/**\n * Get the duration for a Vorbis packet.\n *\n * @param s        Vorbis parser context\n * @param buf      buffer containing a Vorbis frame\n * @param buf_size size of the buffer\n */\nint av_vorbis_parse_frame(AVVorbisParseContext *s, const uint8_t *buf,\n                          int buf_size);\n\nvoid av_vorbis_parse_reset(AVVorbisParseContext *s);\n\n#endif /* AVCODEC_VORBIS_PARSER_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavformat/avformat.h",
    "content": "/*\n * copyright (c) 2001 Fabrice Bellard\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVFORMAT_AVFORMAT_H\n#define AVFORMAT_AVFORMAT_H\n\n/**\n * @file\n * @ingroup libavf\n * Main libavformat public API header\n */\n\n/**\n * @defgroup libavf libavformat\n * I/O and Muxing/Demuxing Library\n *\n * Libavformat (lavf) is a library for dealing with various media container\n * formats. Its main two purposes are demuxing - i.e. splitting a media file\n * into component streams, and the reverse process of muxing - writing supplied\n * data in a specified container format. It also has an @ref lavf_io\n * \"I/O module\" which supports a number of protocols for accessing the data (e.g.\n * file, tcp, http and others).\n * Unless you are absolutely sure you won't use libavformat's network\n * capabilities, you should also call avformat_network_init().\n *\n * A supported input format is described by an AVInputFormat struct, conversely\n * an output format is described by AVOutputFormat. You can iterate over all\n * input/output formats using the  av_demuxer_iterate / av_muxer_iterate() functions.\n * The protocols layer is not part of the public API, so you can only get the names\n * of supported protocols with the avio_enum_protocols() function.\n *\n * Main lavf structure used for both muxing and demuxing is AVFormatContext,\n * which exports all information about the file being read or written. As with\n * most Libavformat structures, its size is not part of public ABI, so it cannot be\n * allocated on stack or directly with av_malloc(). To create an\n * AVFormatContext, use avformat_alloc_context() (some functions, like\n * avformat_open_input() might do that for you).\n *\n * Most importantly an AVFormatContext contains:\n * @li the @ref AVFormatContext.iformat \"input\" or @ref AVFormatContext.oformat\n * \"output\" format. It is either autodetected or set by user for input;\n * always set by user for output.\n * @li an @ref AVFormatContext.streams \"array\" of AVStreams, which describe all\n * elementary streams stored in the file. AVStreams are typically referred to\n * using their index in this array.\n * @li an @ref AVFormatContext.pb \"I/O context\". It is either opened by lavf or\n * set by user for input, always set by user for output (unless you are dealing\n * with an AVFMT_NOFILE format).\n *\n * @section lavf_options Passing options to (de)muxers\n * It is possible to configure lavf muxers and demuxers using the @ref avoptions\n * mechanism. Generic (format-independent) libavformat options are provided by\n * AVFormatContext, they can be examined from a user program by calling\n * av_opt_next() / av_opt_find() on an allocated AVFormatContext (or its AVClass\n * from avformat_get_class()). Private (format-specific) options are provided by\n * AVFormatContext.priv_data if and only if AVInputFormat.priv_class /\n * AVOutputFormat.priv_class of the corresponding format struct is non-NULL.\n * Further options may be provided by the @ref AVFormatContext.pb \"I/O context\",\n * if its AVClass is non-NULL, and the protocols layer. See the discussion on\n * nesting in @ref avoptions documentation to learn how to access those.\n *\n * @section urls\n * URL strings in libavformat are made of a scheme/protocol, a ':', and a\n * scheme specific string. URLs without a scheme and ':' used for local files\n * are supported but deprecated. \"file:\" should be used for local files.\n *\n * It is important that the scheme string is not taken from untrusted\n * sources without checks.\n *\n * Note that some schemes/protocols are quite powerful, allowing access to\n * both local and remote files, parts of them, concatenations of them, local\n * audio and video devices and so on.\n *\n * @{\n *\n * @defgroup lavf_decoding Demuxing\n * @{\n * Demuxers read a media file and split it into chunks of data (@em packets). A\n * @ref AVPacket \"packet\" contains one or more encoded frames which belongs to a\n * single elementary stream. In the lavf API this process is represented by the\n * avformat_open_input() function for opening a file, av_read_frame() for\n * reading a single packet and finally avformat_close_input(), which does the\n * cleanup.\n *\n * @section lavf_decoding_open Opening a media file\n * The minimum information required to open a file is its URL, which\n * is passed to avformat_open_input(), as in the following code:\n * @code\n * const char    *url = \"file:in.mp3\";\n * AVFormatContext *s = NULL;\n * int ret = avformat_open_input(&s, url, NULL, NULL);\n * if (ret < 0)\n *     abort();\n * @endcode\n * The above code attempts to allocate an AVFormatContext, open the\n * specified file (autodetecting the format) and read the header, exporting the\n * information stored there into s. Some formats do not have a header or do not\n * store enough information there, so it is recommended that you call the\n * avformat_find_stream_info() function which tries to read and decode a few\n * frames to find missing information.\n *\n * In some cases you might want to preallocate an AVFormatContext yourself with\n * avformat_alloc_context() and do some tweaking on it before passing it to\n * avformat_open_input(). One such case is when you want to use custom functions\n * for reading input data instead of lavf internal I/O layer.\n * To do that, create your own AVIOContext with avio_alloc_context(), passing\n * your reading callbacks to it. Then set the @em pb field of your\n * AVFormatContext to newly created AVIOContext.\n *\n * Since the format of the opened file is in general not known until after\n * avformat_open_input() has returned, it is not possible to set demuxer private\n * options on a preallocated context. Instead, the options should be passed to\n * avformat_open_input() wrapped in an AVDictionary:\n * @code\n * AVDictionary *options = NULL;\n * av_dict_set(&options, \"video_size\", \"640x480\", 0);\n * av_dict_set(&options, \"pixel_format\", \"rgb24\", 0);\n *\n * if (avformat_open_input(&s, url, NULL, &options) < 0)\n *     abort();\n * av_dict_free(&options);\n * @endcode\n * This code passes the private options 'video_size' and 'pixel_format' to the\n * demuxer. They would be necessary for e.g. the rawvideo demuxer, since it\n * cannot know how to interpret raw video data otherwise. If the format turns\n * out to be something different than raw video, those options will not be\n * recognized by the demuxer and therefore will not be applied. Such unrecognized\n * options are then returned in the options dictionary (recognized options are\n * consumed). The calling program can handle such unrecognized options as it\n * wishes, e.g.\n * @code\n * const AVDictionaryEntry *e;\n * if ((e = av_dict_iterate(options, NULL))) {\n *     fprintf(stderr, \"Option %s not recognized by the demuxer.\\n\", e->key);\n *     abort();\n * }\n * @endcode\n *\n * After you have finished reading the file, you must close it with\n * avformat_close_input(). It will free everything associated with the file.\n *\n * @section lavf_decoding_read Reading from an opened file\n * Reading data from an opened AVFormatContext is done by repeatedly calling\n * av_read_frame() on it. Each call, if successful, will return an AVPacket\n * containing encoded data for one AVStream, identified by\n * AVPacket.stream_index. This packet may be passed straight into the libavcodec\n * decoding functions avcodec_send_packet() or avcodec_decode_subtitle2() if the\n * caller wishes to decode the data.\n *\n * AVPacket.pts, AVPacket.dts and AVPacket.duration timing information will be\n * set if known. They may also be unset (i.e. AV_NOPTS_VALUE for\n * pts/dts, 0 for duration) if the stream does not provide them. The timing\n * information will be in AVStream.time_base units, i.e. it has to be\n * multiplied by the timebase to convert them to seconds.\n *\n * A packet returned by av_read_frame() is always reference-counted,\n * i.e. AVPacket.buf is set and the user may keep it indefinitely.\n * The packet must be freed with av_packet_unref() when it is no\n * longer needed.\n *\n * @section lavf_decoding_seek Seeking\n * @}\n *\n * @defgroup lavf_encoding Muxing\n * @{\n * Muxers take encoded data in the form of @ref AVPacket \"AVPackets\" and write\n * it into files or other output bytestreams in the specified container format.\n *\n * The main API functions for muxing are avformat_write_header() for writing the\n * file header, av_write_frame() / av_interleaved_write_frame() for writing the\n * packets and av_write_trailer() for finalizing the file.\n *\n * At the beginning of the muxing process, the caller must first call\n * avformat_alloc_context() to create a muxing context. The caller then sets up\n * the muxer by filling the various fields in this context:\n *\n * - The @ref AVFormatContext.oformat \"oformat\" field must be set to select the\n *   muxer that will be used.\n * - Unless the format is of the AVFMT_NOFILE type, the @ref AVFormatContext.pb\n *   \"pb\" field must be set to an opened IO context, either returned from\n *   avio_open2() or a custom one.\n * - Unless the format is of the AVFMT_NOSTREAMS type, at least one stream must\n *   be created with the avformat_new_stream() function. The caller should fill\n *   the @ref AVStream.codecpar \"stream codec parameters\" information, such as the\n *   codec @ref AVCodecParameters.codec_type \"type\", @ref AVCodecParameters.codec_id\n *   \"id\" and other parameters (e.g. width / height, the pixel or sample format,\n *   etc.) as known. The @ref AVStream.time_base \"stream timebase\" should\n *   be set to the timebase that the caller desires to use for this stream (note\n *   that the timebase actually used by the muxer can be different, as will be\n *   described later).\n * - It is advised to manually initialize only the relevant fields in\n *   AVCodecParameters, rather than using @ref avcodec_parameters_copy() during\n *   remuxing: there is no guarantee that the codec context values remain valid\n *   for both input and output format contexts.\n * - The caller may fill in additional information, such as @ref\n *   AVFormatContext.metadata \"global\" or @ref AVStream.metadata \"per-stream\"\n *   metadata, @ref AVFormatContext.chapters \"chapters\", @ref\n *   AVFormatContext.programs \"programs\", etc. as described in the\n *   AVFormatContext documentation. Whether such information will actually be\n *   stored in the output depends on what the container format and the muxer\n *   support.\n *\n * When the muxing context is fully set up, the caller must call\n * avformat_write_header() to initialize the muxer internals and write the file\n * header. Whether anything actually is written to the IO context at this step\n * depends on the muxer, but this function must always be called. Any muxer\n * private options must be passed in the options parameter to this function.\n *\n * The data is then sent to the muxer by repeatedly calling av_write_frame() or\n * av_interleaved_write_frame() (consult those functions' documentation for\n * discussion on the difference between them; only one of them may be used with\n * a single muxing context, they should not be mixed). Do note that the timing\n * information on the packets sent to the muxer must be in the corresponding\n * AVStream's timebase. That timebase is set by the muxer (in the\n * avformat_write_header() step) and may be different from the timebase\n * requested by the caller.\n *\n * Once all the data has been written, the caller must call av_write_trailer()\n * to flush any buffered packets and finalize the output file, then close the IO\n * context (if any) and finally free the muxing context with\n * avformat_free_context().\n * @}\n *\n * @defgroup lavf_io I/O Read/Write\n * @{\n * @section lavf_io_dirlist Directory listing\n * The directory listing API makes it possible to list files on remote servers.\n *\n * Some of possible use cases:\n * - an \"open file\" dialog to choose files from a remote location,\n * - a recursive media finder providing a player with an ability to play all\n * files from a given directory.\n *\n * @subsection lavf_io_dirlist_open Opening a directory\n * At first, a directory needs to be opened by calling avio_open_dir()\n * supplied with a URL and, optionally, ::AVDictionary containing\n * protocol-specific parameters. The function returns zero or positive\n * integer and allocates AVIODirContext on success.\n *\n * @code\n * AVIODirContext *ctx = NULL;\n * if (avio_open_dir(&ctx, \"smb://example.com/some_dir\", NULL) < 0) {\n *     fprintf(stderr, \"Cannot open directory.\\n\");\n *     abort();\n * }\n * @endcode\n *\n * This code tries to open a sample directory using smb protocol without\n * any additional parameters.\n *\n * @subsection lavf_io_dirlist_read Reading entries\n * Each directory's entry (i.e. file, another directory, anything else\n * within ::AVIODirEntryType) is represented by AVIODirEntry.\n * Reading consecutive entries from an opened AVIODirContext is done by\n * repeatedly calling avio_read_dir() on it. Each call returns zero or\n * positive integer if successful. Reading can be stopped right after the\n * NULL entry has been read -- it means there are no entries left to be\n * read. The following code reads all entries from a directory associated\n * with ctx and prints their names to standard output.\n * @code\n * AVIODirEntry *entry = NULL;\n * for (;;) {\n *     if (avio_read_dir(ctx, &entry) < 0) {\n *         fprintf(stderr, \"Cannot list directory.\\n\");\n *         abort();\n *     }\n *     if (!entry)\n *         break;\n *     printf(\"%s\\n\", entry->name);\n *     avio_free_directory_entry(&entry);\n * }\n * @endcode\n * @}\n *\n * @defgroup lavf_codec Demuxers\n * @{\n * @defgroup lavf_codec_native Native Demuxers\n * @{\n * @}\n * @defgroup lavf_codec_wrappers External library wrappers\n * @{\n * @}\n * @}\n * @defgroup lavf_protos I/O Protocols\n * @{\n * @}\n * @defgroup lavf_internal Internal\n * @{\n * @}\n * @}\n */\n\n#include <stdio.h>  /* FILE */\n\n#include \"libavcodec/codec_par.h\"\n#include \"libavcodec/defs.h\"\n#include \"libavcodec/packet.h\"\n\n#include \"libavutil/dict.h\"\n#include \"libavutil/log.h\"\n\n#include \"avio.h\"\n#include \"libavformat/version_major.h\"\n#ifndef HAVE_AV_CONFIG_H\n/* When included as part of the ffmpeg build, only include the major version\n * to avoid unnecessary rebuilds. When included externally, keep including\n * the full version information. */\n#include \"libavformat/version.h\"\n\n#include \"libavutil/frame.h\"\n#include \"libavcodec/codec.h\"\n#endif\n\nstruct AVFormatContext;\nstruct AVFrame;\n\n/**\n * @defgroup metadata_api Public Metadata API\n * @{\n * @ingroup libavf\n * The metadata API allows libavformat to export metadata tags to a client\n * application when demuxing. Conversely it allows a client application to\n * set metadata when muxing.\n *\n * Metadata is exported or set as pairs of key/value strings in the 'metadata'\n * fields of the AVFormatContext, AVStream, AVChapter and AVProgram structs\n * using the @ref lavu_dict \"AVDictionary\" API. Like all strings in FFmpeg,\n * metadata is assumed to be UTF-8 encoded Unicode. Note that metadata\n * exported by demuxers isn't checked to be valid UTF-8 in most cases.\n *\n * Important concepts to keep in mind:\n * -  Keys are unique; there can never be 2 tags with the same key. This is\n *    also meant semantically, i.e., a demuxer should not knowingly produce\n *    several keys that are literally different but semantically identical.\n *    E.g., key=Author5, key=Author6. In this example, all authors must be\n *    placed in the same tag.\n * -  Metadata is flat, not hierarchical; there are no subtags. If you\n *    want to store, e.g., the email address of the child of producer Alice\n *    and actor Bob, that could have key=alice_and_bobs_childs_email_address.\n * -  Several modifiers can be applied to the tag name. This is done by\n *    appending a dash character ('-') and the modifier name in the order\n *    they appear in the list below -- e.g. foo-eng-sort, not foo-sort-eng.\n *    -  language -- a tag whose value is localized for a particular language\n *       is appended with the ISO 639-2/B 3-letter language code.\n *       For example: Author-ger=Michael, Author-eng=Mike\n *       The original/default language is in the unqualified \"Author\" tag.\n *       A demuxer should set a default if it sets any translated tag.\n *    -  sorting  -- a modified version of a tag that should be used for\n *       sorting will have '-sort' appended. E.g. artist=\"The Beatles\",\n *       artist-sort=\"Beatles, The\".\n * - Some protocols and demuxers support metadata updates. After a successful\n *   call to av_read_frame(), AVFormatContext.event_flags or AVStream.event_flags\n *   will be updated to indicate if metadata changed. In order to detect metadata\n *   changes on a stream, you need to loop through all streams in the AVFormatContext\n *   and check their individual event_flags.\n *\n * -  Demuxers attempt to export metadata in a generic format, however tags\n *    with no generic equivalents are left as they are stored in the container.\n *    Follows a list of generic tag names:\n *\n @verbatim\n album        -- name of the set this work belongs to\n album_artist -- main creator of the set/album, if different from artist.\n                 e.g. \"Various Artists\" for compilation albums.\n artist       -- main creator of the work\n comment      -- any additional description of the file.\n composer     -- who composed the work, if different from artist.\n copyright    -- name of copyright holder.\n creation_time-- date when the file was created, preferably in ISO 8601.\n date         -- date when the work was created, preferably in ISO 8601.\n disc         -- number of a subset, e.g. disc in a multi-disc collection.\n encoder      -- name/settings of the software/hardware that produced the file.\n encoded_by   -- person/group who created the file.\n filename     -- original name of the file.\n genre        -- <self-evident>.\n language     -- main language in which the work is performed, preferably\n                 in ISO 639-2 format. Multiple languages can be specified by\n                 separating them with commas.\n performer    -- artist who performed the work, if different from artist.\n                 E.g for \"Also sprach Zarathustra\", artist would be \"Richard\n                 Strauss\" and performer \"London Philharmonic Orchestra\".\n publisher    -- name of the label/publisher.\n service_name     -- name of the service in broadcasting (channel name).\n service_provider -- name of the service provider in broadcasting.\n title        -- name of the work.\n track        -- number of this work in the set, can be in form current/total.\n variant_bitrate -- the total bitrate of the bitrate variant that the current stream is part of\n @endverbatim\n *\n * Look in the examples section for an application example how to use the Metadata API.\n *\n * @}\n */\n\n/* packet functions */\n\n\n/**\n * Allocate and read the payload of a packet and initialize its\n * fields with default values.\n *\n * @param s    associated IO context\n * @param pkt packet\n * @param size desired payload size\n * @return >0 (read size) if OK, AVERROR_xxx otherwise\n */\nint av_get_packet(AVIOContext *s, AVPacket *pkt, int size);\n\n\n/**\n * Read data and append it to the current content of the AVPacket.\n * If pkt->size is 0 this is identical to av_get_packet.\n * Note that this uses av_grow_packet and thus involves a realloc\n * which is inefficient. Thus this function should only be used\n * when there is no reasonable way to know (an upper bound of)\n * the final size.\n *\n * @param s    associated IO context\n * @param pkt packet\n * @param size amount of data to read\n * @return >0 (read size) if OK, AVERROR_xxx otherwise, previous data\n *         will not be lost even if an error occurs.\n */\nint av_append_packet(AVIOContext *s, AVPacket *pkt, int size);\n\n/*************************************************/\n/* input/output formats */\n\nstruct AVCodecTag;\n\n/**\n * This structure contains the data a format has to probe a file.\n */\ntypedef struct AVProbeData {\n    const char *filename;\n    unsigned char *buf; /**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */\n    int buf_size;       /**< Size of buf except extra allocated bytes */\n    const char *mime_type; /**< mime_type, when known. */\n} AVProbeData;\n\n#define AVPROBE_SCORE_RETRY (AVPROBE_SCORE_MAX/4)\n#define AVPROBE_SCORE_STREAM_RETRY (AVPROBE_SCORE_MAX/4-1)\n\n#define AVPROBE_SCORE_EXTENSION  50 ///< score for file extension\n#define AVPROBE_SCORE_MIME_BONUS 30 ///< score added for matching mime type\n#define AVPROBE_SCORE_MAX       100 ///< maximum score\n\n#define AVPROBE_PADDING_SIZE 32             ///< extra allocated bytes at the end of the probe buffer\n\n/// Demuxer will use avio_open, no opened file should be provided by the caller.\n#define AVFMT_NOFILE        0x0001\n#define AVFMT_NEEDNUMBER    0x0002 /**< Needs '%d' in filename. */\n/**\n * The muxer/demuxer is experimental and should be used with caution.\n *\n * It will not be selected automatically, and must be specified explicitly.\n */\n#define AVFMT_EXPERIMENTAL  0x0004\n#define AVFMT_SHOW_IDS      0x0008 /**< Show format stream IDs numbers. */\n#define AVFMT_GLOBALHEADER  0x0040 /**< Format wants global header. */\n#define AVFMT_NOTIMESTAMPS  0x0080 /**< Format does not need / have any timestamps. */\n#define AVFMT_GENERIC_INDEX 0x0100 /**< Use generic index building code. */\n#define AVFMT_TS_DISCONT    0x0200 /**< Format allows timestamp discontinuities. Note, muxers always require valid (monotone) timestamps */\n#define AVFMT_VARIABLE_FPS  0x0400 /**< Format allows variable fps. */\n#define AVFMT_NODIMENSIONS  0x0800 /**< Format does not need width/height */\n#define AVFMT_NOSTREAMS     0x1000 /**< Format does not require any streams */\n#define AVFMT_NOBINSEARCH   0x2000 /**< Format does not allow to fall back on binary search via read_timestamp */\n#define AVFMT_NOGENSEARCH   0x4000 /**< Format does not allow to fall back on generic search */\n#define AVFMT_NO_BYTE_SEEK  0x8000 /**< Format does not allow seeking by bytes */\n#define AVFMT_TS_NONSTRICT 0x20000 /**< Format does not require strictly\n                                        increasing timestamps, but they must\n                                        still be monotonic */\n#define AVFMT_TS_NEGATIVE  0x40000 /**< Format allows muxing negative\n                                        timestamps. If not set the timestamp\n                                        will be shifted in av_write_frame and\n                                        av_interleaved_write_frame so they\n                                        start from 0.\n                                        The user or muxer can override this through\n                                        AVFormatContext.avoid_negative_ts\n                                        */\n\n#define AVFMT_SEEK_TO_PTS   0x4000000 /**< Seeking is based on PTS */\n\n/**\n * @addtogroup lavf_encoding\n * @{\n */\ntypedef struct AVOutputFormat {\n    const char *name;\n    /**\n     * Descriptive name for the format, meant to be more human-readable\n     * than name. You should use the NULL_IF_CONFIG_SMALL() macro\n     * to define it.\n     */\n    const char *long_name;\n    const char *mime_type;\n    const char *extensions; /**< comma-separated filename extensions */\n    /* output support */\n    enum AVCodecID audio_codec;    /**< default audio codec */\n    enum AVCodecID video_codec;    /**< default video codec */\n    enum AVCodecID subtitle_codec; /**< default subtitle codec */\n    /**\n     * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER,\n     * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS,\n     * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS,\n     * AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE\n     */\n    int flags;\n\n    /**\n     * List of supported codec_id-codec_tag pairs, ordered by \"better\n     * choice first\". The arrays are all terminated by AV_CODEC_ID_NONE.\n     */\n    const struct AVCodecTag * const *codec_tag;\n\n\n    const AVClass *priv_class; ///< AVClass for the private context\n} AVOutputFormat;\n/**\n * @}\n */\n\n/**\n * @addtogroup lavf_decoding\n * @{\n */\ntypedef struct AVInputFormat {\n    /**\n     * A comma separated list of short names for the format. New names\n     * may be appended with a minor bump.\n     */\n    const char *name;\n\n    /**\n     * Descriptive name for the format, meant to be more human-readable\n     * than name. You should use the NULL_IF_CONFIG_SMALL() macro\n     * to define it.\n     */\n    const char *long_name;\n\n    /**\n     * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,\n     * AVFMT_NOTIMESTAMPS, AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,\n     * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS.\n     */\n    int flags;\n\n    /**\n     * If extensions are defined, then no probe is done. You should\n     * usually not use extension format guessing because it is not\n     * reliable enough\n     */\n    const char *extensions;\n\n    const struct AVCodecTag * const *codec_tag;\n\n    const AVClass *priv_class; ///< AVClass for the private context\n\n    /**\n     * Comma-separated list of mime types.\n     * It is used check for matching mime types while probing.\n     * @see av_probe_input_format2\n     */\n    const char *mime_type;\n} AVInputFormat;\n/**\n * @}\n */\n\nenum AVStreamParseType {\n    AVSTREAM_PARSE_NONE,\n    AVSTREAM_PARSE_FULL,       /**< full parsing and repack */\n    AVSTREAM_PARSE_HEADERS,    /**< Only parse headers, do not repack. */\n    AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */\n    AVSTREAM_PARSE_FULL_ONCE,  /**< full parsing and repack of the first frame only, only implemented for H.264 currently */\n    AVSTREAM_PARSE_FULL_RAW,   /**< full parsing and repack with timestamp and position generation by parser for raw\n                                    this assumes that each packet in the file contains no demuxer level headers and\n                                    just codec level data, otherwise position generation would fail */\n};\n\ntypedef struct AVIndexEntry {\n    int64_t pos;\n    int64_t timestamp;        /**<\n                               * Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are available\n                               * when seeking to this entry. That means preferable PTS on keyframe based formats.\n                               * But demuxers can choose to store a different timestamp, if it is more convenient for the implementation or nothing better\n                               * is known\n                               */\n#define AVINDEX_KEYFRAME 0x0001\n#define AVINDEX_DISCARD_FRAME  0x0002    /**\n                                          * Flag is used to indicate which frame should be discarded after decoding.\n                                          */\n    int flags:2;\n    int size:30; //Yeah, trying to keep the size of this small to reduce memory requirements (it is 24 vs. 32 bytes due to possible 8-byte alignment).\n    int min_distance;         /**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. */\n} AVIndexEntry;\n\n/**\n * The stream should be chosen by default among other streams of the same type,\n * unless the user has explicitly specified otherwise.\n */\n#define AV_DISPOSITION_DEFAULT              (1 << 0)\n/**\n * The stream is not in original language.\n *\n * @note AV_DISPOSITION_ORIGINAL is the inverse of this disposition. At most\n *       one of them should be set in properly tagged streams.\n * @note This disposition may apply to any stream type, not just audio.\n */\n#define AV_DISPOSITION_DUB                  (1 << 1)\n/**\n * The stream is in original language.\n *\n * @see the notes for AV_DISPOSITION_DUB\n */\n#define AV_DISPOSITION_ORIGINAL             (1 << 2)\n/**\n * The stream is a commentary track.\n */\n#define AV_DISPOSITION_COMMENT              (1 << 3)\n/**\n * The stream contains song lyrics.\n */\n#define AV_DISPOSITION_LYRICS               (1 << 4)\n/**\n * The stream contains karaoke audio.\n */\n#define AV_DISPOSITION_KARAOKE              (1 << 5)\n\n/**\n * Track should be used during playback by default.\n * Useful for subtitle track that should be displayed\n * even when user did not explicitly ask for subtitles.\n */\n#define AV_DISPOSITION_FORCED               (1 << 6)\n/**\n * The stream is intended for hearing impaired audiences.\n */\n#define AV_DISPOSITION_HEARING_IMPAIRED     (1 << 7)\n/**\n * The stream is intended for visually impaired audiences.\n */\n#define AV_DISPOSITION_VISUAL_IMPAIRED      (1 << 8)\n/**\n * The audio stream contains music and sound effects without voice.\n */\n#define AV_DISPOSITION_CLEAN_EFFECTS        (1 << 9)\n/**\n * The stream is stored in the file as an attached picture/\"cover art\" (e.g.\n * APIC frame in ID3v2). The first (usually only) packet associated with it\n * will be returned among the first few packets read from the file unless\n * seeking takes place. It can also be accessed at any time in\n * AVStream.attached_pic.\n */\n#define AV_DISPOSITION_ATTACHED_PIC         (1 << 10)\n/**\n * The stream is sparse, and contains thumbnail images, often corresponding\n * to chapter markers. Only ever used with AV_DISPOSITION_ATTACHED_PIC.\n */\n#define AV_DISPOSITION_TIMED_THUMBNAILS     (1 << 11)\n\n/**\n * The stream is intended to be mixed with a spatial audio track. For example,\n * it could be used for narration or stereo music, and may remain unchanged by\n * listener head rotation.\n */\n#define AV_DISPOSITION_NON_DIEGETIC         (1 << 12)\n\n/**\n * The subtitle stream contains captions, providing a transcription and possibly\n * a translation of audio. Typically intended for hearing-impaired audiences.\n */\n#define AV_DISPOSITION_CAPTIONS             (1 << 16)\n/**\n * The subtitle stream contains a textual description of the video content.\n * Typically intended for visually-impaired audiences or for the cases where the\n * video cannot be seen.\n */\n#define AV_DISPOSITION_DESCRIPTIONS         (1 << 17)\n/**\n * The subtitle stream contains time-aligned metadata that is not intended to be\n * directly presented to the user.\n */\n#define AV_DISPOSITION_METADATA             (1 << 18)\n/**\n * The stream is intended to be mixed with another stream before presentation.\n * Used for example to signal the stream contains an image part of a HEIF grid,\n * or for mix_type=0 in mpegts.\n */\n#define AV_DISPOSITION_DEPENDENT            (1 << 19)\n/**\n * The video stream contains still images.\n */\n#define AV_DISPOSITION_STILL_IMAGE          (1 << 20)\n/**\n * The video stream contains multiple layers, e.g. stereoscopic views (cf. H.264\n * Annex G/H, or HEVC Annex F).\n */\n#define AV_DISPOSITION_MULTILAYER           (1 << 21)\n\n/**\n * @return The AV_DISPOSITION_* flag corresponding to disp or a negative error\n *         code if disp does not correspond to a known stream disposition.\n */\nint av_disposition_from_string(const char *disp);\n\n/**\n * @param disposition a combination of AV_DISPOSITION_* values\n * @return The string description corresponding to the lowest set bit in\n *         disposition. NULL when the lowest set bit does not correspond\n *         to a known disposition or when disposition is 0.\n */\nconst char *av_disposition_to_string(int disposition);\n\n/**\n * Options for behavior on timestamp wrap detection.\n */\n#define AV_PTS_WRAP_IGNORE      0   ///< ignore the wrap\n#define AV_PTS_WRAP_ADD_OFFSET  1   ///< add the format specific offset on wrap detection\n#define AV_PTS_WRAP_SUB_OFFSET  -1  ///< subtract the format specific offset on wrap detection\n\n/**\n * Stream structure.\n * New fields can be added to the end with minor version bumps.\n * Removal, reordering and changes to existing fields require a major\n * version bump.\n * sizeof(AVStream) must not be used outside libav*.\n */\ntypedef struct AVStream {\n    /**\n     * A class for @ref avoptions. Set on stream creation.\n     */\n    const AVClass *av_class;\n\n    int index;    /**< stream index in AVFormatContext */\n    /**\n     * Format-specific stream ID.\n     * decoding: set by libavformat\n     * encoding: set by the user, replaced by libavformat if left unset\n     */\n    int id;\n\n    /**\n     * Codec parameters associated with this stream. Allocated and freed by\n     * libavformat in avformat_new_stream() and avformat_free_context()\n     * respectively.\n     *\n     * - demuxing: filled by libavformat on stream creation or in\n     *             avformat_find_stream_info()\n     * - muxing: filled by the caller before avformat_write_header()\n     */\n    AVCodecParameters *codecpar;\n\n    void *priv_data;\n\n    /**\n     * This is the fundamental unit of time (in seconds) in terms\n     * of which frame timestamps are represented.\n     *\n     * decoding: set by libavformat\n     * encoding: May be set by the caller before avformat_write_header() to\n     *           provide a hint to the muxer about the desired timebase. In\n     *           avformat_write_header(), the muxer will overwrite this field\n     *           with the timebase that will actually be used for the timestamps\n     *           written into the file (which may or may not be related to the\n     *           user-provided one, depending on the format).\n     */\n    AVRational time_base;\n\n    /**\n     * Decoding: pts of the first frame of the stream in presentation order, in stream time base.\n     * Only set this if you are absolutely 100% sure that the value you set\n     * it to really is the pts of the first frame.\n     * This may be undefined (AV_NOPTS_VALUE).\n     * @note The ASF header does NOT contain a correct start_time the ASF\n     * demuxer must NOT set this.\n     */\n    int64_t start_time;\n\n    /**\n     * Decoding: duration of the stream, in stream time base.\n     * If a source file does not specify a duration, but does specify\n     * a bitrate, this value will be estimated from bitrate and file size.\n     *\n     * Encoding: May be set by the caller before avformat_write_header() to\n     * provide a hint to the muxer about the estimated duration.\n     */\n    int64_t duration;\n\n    int64_t nb_frames;                 ///< number of frames in this stream if known or 0\n\n    /**\n     * Stream disposition - a combination of AV_DISPOSITION_* flags.\n     * - demuxing: set by libavformat when creating the stream or in\n     *             avformat_find_stream_info().\n     * - muxing: may be set by the caller before avformat_write_header().\n     */\n    int disposition;\n\n    enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed.\n\n    /**\n     * sample aspect ratio (0 if unknown)\n     * - encoding: Set by user.\n     * - decoding: Set by libavformat.\n     */\n    AVRational sample_aspect_ratio;\n\n    AVDictionary *metadata;\n\n    /**\n     * Average framerate\n     *\n     * - demuxing: May be set by libavformat when creating the stream or in\n     *             avformat_find_stream_info().\n     * - muxing: May be set by the caller before avformat_write_header().\n     */\n    AVRational avg_frame_rate;\n\n    /**\n     * For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet\n     * will contain the attached picture.\n     *\n     * decoding: set by libavformat, must not be modified by the caller.\n     * encoding: unused\n     */\n    AVPacket attached_pic;\n\n    /**\n     * Flags indicating events happening on the stream, a combination of\n     * AVSTREAM_EVENT_FLAG_*.\n     *\n     * - demuxing: may be set by the demuxer in avformat_open_input(),\n     *   avformat_find_stream_info() and av_read_frame(). Flags must be cleared\n     *   by the user once the event has been handled.\n     * - muxing: may be set by the user after avformat_write_header(). to\n     *   indicate a user-triggered event.  The muxer will clear the flags for\n     *   events it has handled in av_[interleaved]_write_frame().\n     */\n    int event_flags;\n/**\n * - demuxing: the demuxer read new metadata from the file and updated\n *     AVStream.metadata accordingly\n * - muxing: the user updated AVStream.metadata and wishes the muxer to write\n *     it into the file\n */\n#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED 0x0001\n/**\n * - demuxing: new packets for this stream were read from the file. This\n *   event is informational only and does not guarantee that new packets\n *   for this stream will necessarily be returned from av_read_frame().\n */\n#define AVSTREAM_EVENT_FLAG_NEW_PACKETS (1 << 1)\n\n    /**\n     * Real base framerate of the stream.\n     * This is the lowest framerate with which all timestamps can be\n     * represented accurately (it is the least common multiple of all\n     * framerates in the stream). Note, this value is just a guess!\n     * For example, if the time base is 1/90000 and all frames have either\n     * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1.\n     */\n    AVRational r_frame_rate;\n\n    /**\n     * Number of bits in timestamps. Used for wrapping control.\n     *\n     * - demuxing: set by libavformat\n     * - muxing: set by libavformat\n     *\n     */\n    int pts_wrap_bits;\n} AVStream;\n\n/**\n * AVStreamGroupTileGrid holds information on how to combine several\n * independent images on a single canvas for presentation.\n *\n * The output should be a @ref AVStreamGroupTileGrid.background \"background\"\n * colored @ref AVStreamGroupTileGrid.coded_width \"coded_width\" x\n * @ref AVStreamGroupTileGrid.coded_height \"coded_height\" canvas where a\n * @ref AVStreamGroupTileGrid.nb_tiles \"nb_tiles\" amount of tiles are placed in\n * the order they appear in the @ref AVStreamGroupTileGrid.offsets \"offsets\"\n * array, at the exact offset described for them. In particular, if two or more\n * tiles overlap, the image with higher index in the\n * @ref AVStreamGroupTileGrid.offsets \"offsets\" array takes priority.\n * Note that a single image may be used multiple times, i.e. multiple entries\n * in @ref AVStreamGroupTileGrid.offsets \"offsets\" may have the same value of\n * idx.\n *\n * The following is an example of a simple grid with 3 rows and 4 columns:\n *\n * +---+---+---+---+\n * | 0 | 1 | 2 | 3 |\n * +---+---+---+---+\n * | 4 | 5 | 6 | 7 |\n * +---+---+---+---+\n * | 8 | 9 |10 |11 |\n * +---+---+---+---+\n *\n * Assuming all tiles have a dimension of 512x512, the\n * @ref AVStreamGroupTileGrid.offsets \"offset\" of the topleft pixel of\n * the first @ref AVStreamGroup.streams \"stream\" in the group is \"0,0\", the\n * @ref AVStreamGroupTileGrid.offsets \"offset\" of the topleft pixel of\n * the second @ref AVStreamGroup.streams \"stream\" in the group is \"512,0\", the\n * @ref AVStreamGroupTileGrid.offsets \"offset\" of the topleft pixel of\n * the fifth @ref AVStreamGroup.streams \"stream\" in the group is \"0,512\", the\n * @ref AVStreamGroupTileGrid.offsets \"offset\", of the topleft pixel of\n * the sixth @ref AVStreamGroup.streams \"stream\" in the group is \"512,512\",\n * etc.\n *\n * The following is an example of a canvas with overlapping tiles:\n *\n * +-----------+\n * |   %%%%%   |\n * |***%%3%%@@@|\n * |**0%%%%%2@@|\n * |***##1@@@@@|\n * |   #####   |\n * +-----------+\n *\n * Assuming a canvas with size 1024x1024 and all tiles with a dimension of\n * 512x512, a possible @ref AVStreamGroupTileGrid.offsets \"offset\" for the\n * topleft pixel of the first @ref AVStreamGroup.streams \"stream\" in the group\n * would be 0x256, the @ref AVStreamGroupTileGrid.offsets \"offset\" for the\n * topleft pixel of the second @ref AVStreamGroup.streams \"stream\" in the group\n * would be 256x512, the @ref AVStreamGroupTileGrid.offsets \"offset\" for the\n * topleft pixel of the third @ref AVStreamGroup.streams \"stream\" in the group\n * would be 512x256, and the @ref AVStreamGroupTileGrid.offsets \"offset\" for\n * the topleft pixel of the fourth @ref AVStreamGroup.streams \"stream\" in the\n * group would be 256x0.\n *\n * sizeof(AVStreamGroupTileGrid) is not a part of the ABI and may only be\n * allocated by avformat_stream_group_create().\n */\ntypedef struct AVStreamGroupTileGrid {\n    const AVClass *av_class;\n\n    /**\n     * Amount of tiles in the grid.\n     *\n     * Must be > 0.\n     */\n    unsigned int nb_tiles;\n\n    /**\n     * Width of the canvas.\n     *\n     * Must be > 0.\n     */\n    int coded_width;\n    /**\n     * Width of the canvas.\n     *\n     * Must be > 0.\n     */\n    int coded_height;\n\n    /**\n     * An @ref nb_tiles sized array of offsets in pixels from the topleft edge\n     * of the canvas, indicating where each stream should be placed.\n     * It must be allocated with the av_malloc() family of functions.\n     *\n     * - demuxing: set by libavformat, must not be modified by the caller.\n     * - muxing: set by the caller before avformat_write_header().\n     *\n     * Freed by libavformat in avformat_free_context().\n     */\n    struct {\n        /**\n         * Index of the stream in the group this tile references.\n         *\n         * Must be < @ref AVStreamGroup.nb_streams \"nb_streams\".\n         */\n        unsigned int idx;\n        /**\n         * Offset in pixels from the left edge of the canvas where the tile\n         * should be placed.\n         */\n        int horizontal;\n        /**\n         * Offset in pixels from the top edge of the canvas where the tile\n         * should be placed.\n         */\n        int vertical;\n    } *offsets;\n\n    /**\n     * The pixel value per channel in RGBA format used if no pixel of any tile\n     * is located at a particular pixel location.\n     *\n     * @see av_image_fill_color().\n     * @see av_parse_color().\n     */\n    uint8_t background[4];\n\n    /**\n     * Offset in pixels from the left edge of the canvas where the actual image\n     * meant for presentation starts.\n     *\n     * This field must be >= 0 and < @ref coded_width.\n     */\n    int horizontal_offset;\n    /**\n     * Offset in pixels from the top edge of the canvas where the actual image\n     * meant for presentation starts.\n     *\n     * This field must be >= 0 and < @ref coded_height.\n     */\n    int vertical_offset;\n\n    /**\n     * Width of the final image for presentation.\n     *\n     * Must be > 0 and <= (@ref coded_width - @ref horizontal_offset).\n     * When it's not equal to (@ref coded_width - @ref horizontal_offset), the\n     * result of (@ref coded_width - width - @ref horizontal_offset) is the\n     * amount amount of pixels to be cropped from the right edge of the\n     * final image before presentation.\n     */\n    int width;\n    /**\n     * Height of the final image for presentation.\n     *\n     * Must be > 0 and <= (@ref coded_height - @ref vertical_offset).\n     * When it's not equal to (@ref coded_height - @ref vertical_offset), the\n     * result of (@ref coded_height - height - @ref vertical_offset) is the\n     * amount amount of pixels to be cropped from the bottom edge of the\n     * final image before presentation.\n     */\n    int height;\n\n    /**\n     * Additional data associated with the grid.\n     *\n     * Should be allocated with av_packet_side_data_new() or\n     * av_packet_side_data_add(), and will be freed by avformat_free_context().\n     */\n    AVPacketSideData *coded_side_data;\n\n    /**\n     * Amount of entries in @ref coded_side_data.\n     */\n    int nb_coded_side_data;\n} AVStreamGroupTileGrid;\n\n/**\n * AVStreamGroupLCEVC is meant to define the relation between video streams\n * and a data stream containing LCEVC enhancement layer NALUs.\n *\n * No more than one stream of @ref AVCodecParameters.codec_type \"codec_type\"\n * AVMEDIA_TYPE_DATA shall be present, and it must be of\n * @ref AVCodecParameters.codec_id \"codec_id\" AV_CODEC_ID_LCEVC.\n */\ntypedef struct AVStreamGroupLCEVC {\n    const AVClass *av_class;\n\n    /**\n     * Index of the LCEVC data stream in AVStreamGroup.\n     */\n    unsigned int lcevc_index;\n    /**\n     * Width of the final stream for presentation.\n     */\n    int width;\n    /**\n     * Height of the final image for presentation.\n     */\n    int height;\n} AVStreamGroupLCEVC;\n\nenum AVStreamGroupParamsType {\n    AV_STREAM_GROUP_PARAMS_NONE,\n    AV_STREAM_GROUP_PARAMS_IAMF_AUDIO_ELEMENT,\n    AV_STREAM_GROUP_PARAMS_IAMF_MIX_PRESENTATION,\n    AV_STREAM_GROUP_PARAMS_TILE_GRID,\n    AV_STREAM_GROUP_PARAMS_LCEVC,\n};\n\nstruct AVIAMFAudioElement;\nstruct AVIAMFMixPresentation;\n\ntypedef struct AVStreamGroup {\n    /**\n     * A class for @ref avoptions. Set by avformat_stream_group_create().\n     */\n    const AVClass *av_class;\n\n    void *priv_data;\n\n    /**\n     * Group index in AVFormatContext.\n     */\n    unsigned int index;\n\n    /**\n     * Group type-specific group ID.\n     *\n     * decoding: set by libavformat\n     * encoding: may set by the user\n     */\n    int64_t id;\n\n    /**\n     * Group type\n     *\n     * decoding: set by libavformat on group creation\n     * encoding: set by avformat_stream_group_create()\n     */\n    enum AVStreamGroupParamsType type;\n\n    /**\n     * Group type-specific parameters\n     */\n    union {\n        struct AVIAMFAudioElement *iamf_audio_element;\n        struct AVIAMFMixPresentation *iamf_mix_presentation;\n        struct AVStreamGroupTileGrid *tile_grid;\n        struct AVStreamGroupLCEVC *lcevc;\n    } params;\n\n    /**\n     * Metadata that applies to the whole group.\n     *\n     * - demuxing: set by libavformat on group creation\n     * - muxing: may be set by the caller before avformat_write_header()\n     *\n     * Freed by libavformat in avformat_free_context().\n     */\n    AVDictionary *metadata;\n\n    /**\n     * Number of elements in AVStreamGroup.streams.\n     *\n     * Set by avformat_stream_group_add_stream() must not be modified by any other code.\n     */\n    unsigned int nb_streams;\n\n    /**\n     * A list of streams in the group. New entries are created with\n     * avformat_stream_group_add_stream().\n     *\n     * - demuxing: entries are created by libavformat on group creation.\n     *             If AVFMTCTX_NOHEADER is set in ctx_flags, then new entries may also\n     *             appear in av_read_frame().\n     * - muxing: entries are created by the user before avformat_write_header().\n     *\n     * Freed by libavformat in avformat_free_context().\n     */\n    AVStream **streams;\n\n    /**\n     * Stream group disposition - a combination of AV_DISPOSITION_* flags.\n     * This field currently applies to all defined AVStreamGroupParamsType.\n     *\n     * - demuxing: set by libavformat when creating the group or in\n     *             avformat_find_stream_info().\n     * - muxing: may be set by the caller before avformat_write_header().\n     */\n    int disposition;\n} AVStreamGroup;\n\nstruct AVCodecParserContext *av_stream_get_parser(const AVStream *s);\n\n#define AV_PROGRAM_RUNNING 1\n\n/**\n * New fields can be added to the end with minor version bumps.\n * Removal, reordering and changes to existing fields require a major\n * version bump.\n * sizeof(AVProgram) must not be used outside libav*.\n */\ntypedef struct AVProgram {\n    int            id;\n    int            flags;\n    enum AVDiscard discard;        ///< selects which program to discard and which to feed to the caller\n    unsigned int   *stream_index;\n    unsigned int   nb_stream_indexes;\n    AVDictionary *metadata;\n\n    int program_num;\n    int pmt_pid;\n    int pcr_pid;\n    int pmt_version;\n\n    /*****************************************************************\n     * All fields below this line are not part of the public API. They\n     * may not be used outside of libavformat and can be changed and\n     * removed at will.\n     * New public fields should be added right above.\n     *****************************************************************\n     */\n    int64_t start_time;\n    int64_t end_time;\n\n    int64_t pts_wrap_reference;    ///< reference dts for wrap detection\n    int pts_wrap_behavior;         ///< behavior on wrap detection\n} AVProgram;\n\n#define AVFMTCTX_NOHEADER      0x0001 /**< signal that no header is present\n                                         (streams are added dynamically) */\n#define AVFMTCTX_UNSEEKABLE    0x0002 /**< signal that the stream is definitely\n                                         not seekable, and attempts to call the\n                                         seek function will fail. For some\n                                         network protocols (e.g. HLS), this can\n                                         change dynamically at runtime. */\n\ntypedef struct AVChapter {\n    int64_t id;             ///< unique ID to identify the chapter\n    AVRational time_base;   ///< time base in which the start/end timestamps are specified\n    int64_t start, end;     ///< chapter start/end time in time_base units\n    AVDictionary *metadata;\n} AVChapter;\n\n\n/**\n * Callback used by devices to communicate with application.\n */\ntypedef int (*av_format_control_message)(struct AVFormatContext *s, int type,\n                                         void *data, size_t data_size);\n\ntypedef int (*AVOpenCallback)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags,\n                              const AVIOInterruptCB *int_cb, AVDictionary **options);\n\n/**\n * The duration of a video can be estimated through various ways, and this enum can be used\n * to know how the duration was estimated.\n */\nenum AVDurationEstimationMethod {\n    AVFMT_DURATION_FROM_PTS,    ///< Duration accurately estimated from PTSes\n    AVFMT_DURATION_FROM_STREAM, ///< Duration estimated from a stream with a known duration\n    AVFMT_DURATION_FROM_BITRATE ///< Duration estimated from bitrate (less accurate)\n};\n\n/**\n * Format I/O context.\n * New fields can be added to the end with minor version bumps.\n * Removal, reordering and changes to existing fields require a major\n * version bump.\n * sizeof(AVFormatContext) must not be used outside libav*, use\n * avformat_alloc_context() to create an AVFormatContext.\n *\n * Fields can be accessed through AVOptions (av_opt*),\n * the name string used matches the associated command line parameter name and\n * can be found in libavformat/options_table.h.\n * The AVOption/command line parameter names differ in some cases from the C\n * structure field names for historic reasons or brevity.\n */\ntypedef struct AVFormatContext {\n    /**\n     * A class for logging and @ref avoptions. Set by avformat_alloc_context().\n     * Exports (de)muxer private options if they exist.\n     */\n    const AVClass *av_class;\n\n    /**\n     * The input container format.\n     *\n     * Demuxing only, set by avformat_open_input().\n     */\n    const struct AVInputFormat *iformat;\n\n    /**\n     * The output container format.\n     *\n     * Muxing only, must be set by the caller before avformat_write_header().\n     */\n    const struct AVOutputFormat *oformat;\n\n    /**\n     * Format private data. This is an AVOptions-enabled struct\n     * if and only if iformat/oformat.priv_class is not NULL.\n     *\n     * - muxing: set by avformat_write_header()\n     * - demuxing: set by avformat_open_input()\n     */\n    void *priv_data;\n\n    /**\n     * I/O context.\n     *\n     * - demuxing: either set by the user before avformat_open_input() (then\n     *             the user must close it manually) or set by avformat_open_input().\n     * - muxing: set by the user before avformat_write_header(). The caller must\n     *           take care of closing / freeing the IO context.\n     *\n     * Do NOT set this field if AVFMT_NOFILE flag is set in\n     * iformat/oformat.flags. In such a case, the (de)muxer will handle\n     * I/O in some other way and this field will be NULL.\n     */\n    AVIOContext *pb;\n\n    /* stream info */\n    /**\n     * Flags signalling stream properties. A combination of AVFMTCTX_*.\n     * Set by libavformat.\n     */\n    int ctx_flags;\n\n    /**\n     * Number of elements in AVFormatContext.streams.\n     *\n     * Set by avformat_new_stream(), must not be modified by any other code.\n     */\n    unsigned int nb_streams;\n    /**\n     * A list of all streams in the file. New streams are created with\n     * avformat_new_stream().\n     *\n     * - demuxing: streams are created by libavformat in avformat_open_input().\n     *             If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also\n     *             appear in av_read_frame().\n     * - muxing: streams are created by the user before avformat_write_header().\n     *\n     * Freed by libavformat in avformat_free_context().\n     */\n    AVStream **streams;\n\n    /**\n     * Number of elements in AVFormatContext.stream_groups.\n     *\n     * Set by avformat_stream_group_create(), must not be modified by any other code.\n     */\n    unsigned int nb_stream_groups;\n    /**\n     * A list of all stream groups in the file. New groups are created with\n     * avformat_stream_group_create(), and filled with avformat_stream_group_add_stream().\n     *\n     * - demuxing: groups may be created by libavformat in avformat_open_input().\n     *             If AVFMTCTX_NOHEADER is set in ctx_flags, then new groups may also\n     *             appear in av_read_frame().\n     * - muxing: groups may be created by the user before avformat_write_header().\n     *\n     * Freed by libavformat in avformat_free_context().\n     */\n    AVStreamGroup **stream_groups;\n\n    /**\n     * Number of chapters in AVChapter array.\n     * When muxing, chapters are normally written in the file header,\n     * so nb_chapters should normally be initialized before write_header\n     * is called. Some muxers (e.g. mov and mkv) can also write chapters\n     * in the trailer.  To write chapters in the trailer, nb_chapters\n     * must be zero when write_header is called and non-zero when\n     * write_trailer is called.\n     * - muxing: set by user\n     * - demuxing: set by libavformat\n     */\n    unsigned int nb_chapters;\n    AVChapter **chapters;\n\n    /**\n     * input or output URL. Unlike the old filename field, this field has no\n     * length restriction.\n     *\n     * - demuxing: set by avformat_open_input(), initialized to an empty\n     *             string if url parameter was NULL in avformat_open_input().\n     * - muxing: may be set by the caller before calling avformat_write_header()\n     *           (or avformat_init_output() if that is called first) to a string\n     *           which is freeable by av_free(). Set to an empty string if it\n     *           was NULL in avformat_init_output().\n     *\n     * Freed by libavformat in avformat_free_context().\n     */\n    char *url;\n\n    /**\n     * Position of the first frame of the component, in\n     * AV_TIME_BASE fractional seconds. NEVER set this value directly:\n     * It is deduced from the AVStream values.\n     *\n     * Demuxing only, set by libavformat.\n     */\n    int64_t start_time;\n\n    /**\n     * Duration of the stream, in AV_TIME_BASE fractional\n     * seconds. Only set this value if you know none of the individual stream\n     * durations and also do not set any of them. This is deduced from the\n     * AVStream values if not set.\n     *\n     * Demuxing only, set by libavformat.\n     */\n    int64_t duration;\n\n    /**\n     * Total stream bitrate in bit/s, 0 if not\n     * available. Never set it directly if the file_size and the\n     * duration are known as FFmpeg can compute it automatically.\n     */\n    int64_t bit_rate;\n\n    unsigned int packet_size;\n    int max_delay;\n\n    /**\n     * Flags modifying the (de)muxer behaviour. A combination of AVFMT_FLAG_*.\n     * Set by the user before avformat_open_input() / avformat_write_header().\n     */\n    int flags;\n#define AVFMT_FLAG_GENPTS       0x0001 ///< Generate missing pts even if it requires parsing future frames.\n#define AVFMT_FLAG_IGNIDX       0x0002 ///< Ignore index.\n#define AVFMT_FLAG_NONBLOCK     0x0004 ///< Do not block when reading packets from input.\n#define AVFMT_FLAG_IGNDTS       0x0008 ///< Ignore DTS on frames that contain both DTS & PTS\n#define AVFMT_FLAG_NOFILLIN     0x0010 ///< Do not infer any values from other values, just return what is stored in the container\n#define AVFMT_FLAG_NOPARSE      0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the filling code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled\n#define AVFMT_FLAG_NOBUFFER     0x0040 ///< Do not buffer frames when possible\n#define AVFMT_FLAG_CUSTOM_IO    0x0080 ///< The caller has supplied a custom AVIOContext, don't avio_close() it.\n#define AVFMT_FLAG_DISCARD_CORRUPT  0x0100 ///< Discard frames marked corrupted\n#define AVFMT_FLAG_FLUSH_PACKETS    0x0200 ///< Flush the AVIOContext every packet.\n/**\n * When muxing, try to avoid writing any random/volatile data to the output.\n * This includes any random IDs, real-time timestamps/dates, muxer version, etc.\n *\n * This flag is mainly intended for testing.\n */\n#define AVFMT_FLAG_BITEXACT         0x0400\n#define AVFMT_FLAG_SORT_DTS    0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down)\n#define AVFMT_FLAG_FAST_SEEK   0x80000 ///< Enable fast, but inaccurate seeks for some formats\n#define AVFMT_FLAG_AUTO_BSF   0x200000 ///< Add bitstream filters as requested by the muxer\n\n    /**\n     * Maximum number of bytes read from input in order to determine stream\n     * properties. Used when reading the global header and in\n     * avformat_find_stream_info().\n     *\n     * Demuxing only, set by the caller before avformat_open_input().\n     *\n     * @note this is \\e not  used for determining the \\ref AVInputFormat\n     *       \"input format\"\n     * @see format_probesize\n     */\n    int64_t probesize;\n\n    /**\n     * Maximum duration (in AV_TIME_BASE units) of the data read\n     * from input in avformat_find_stream_info().\n     * Demuxing only, set by the caller before avformat_find_stream_info().\n     * Can be set to 0 to let avformat choose using a heuristic.\n     */\n    int64_t max_analyze_duration;\n\n    const uint8_t *key;\n    int keylen;\n\n    unsigned int nb_programs;\n    AVProgram **programs;\n\n    /**\n     * Forced video codec_id.\n     * Demuxing: Set by user.\n     */\n    enum AVCodecID video_codec_id;\n\n    /**\n     * Forced audio codec_id.\n     * Demuxing: Set by user.\n     */\n    enum AVCodecID audio_codec_id;\n\n    /**\n     * Forced subtitle codec_id.\n     * Demuxing: Set by user.\n     */\n    enum AVCodecID subtitle_codec_id;\n\n    /**\n     * Forced Data codec_id.\n     * Demuxing: Set by user.\n     */\n    enum AVCodecID data_codec_id;\n\n    /**\n     * Metadata that applies to the whole file.\n     *\n     * - demuxing: set by libavformat in avformat_open_input()\n     * - muxing: may be set by the caller before avformat_write_header()\n     *\n     * Freed by libavformat in avformat_free_context().\n     */\n    AVDictionary *metadata;\n\n    /**\n     * Start time of the stream in real world time, in microseconds\n     * since the Unix epoch (00:00 1st January 1970). That is, pts=0 in the\n     * stream was captured at this real world time.\n     * - muxing: Set by the caller before avformat_write_header(). If set to\n     *           either 0 or AV_NOPTS_VALUE, then the current wall-time will\n     *           be used.\n     * - demuxing: Set by libavformat. AV_NOPTS_VALUE if unknown. Note that\n     *             the value may become known after some number of frames\n     *             have been received.\n     */\n    int64_t start_time_realtime;\n\n    /**\n     * The number of frames used for determining the framerate in\n     * avformat_find_stream_info().\n     * Demuxing only, set by the caller before avformat_find_stream_info().\n     */\n    int fps_probe_size;\n\n    /**\n     * Error recognition; higher values will detect more errors but may\n     * misdetect some more or less valid parts as errors.\n     * Demuxing only, set by the caller before avformat_open_input().\n     */\n    int error_recognition;\n\n    /**\n     * Custom interrupt callbacks for the I/O layer.\n     *\n     * demuxing: set by the user before avformat_open_input().\n     * muxing: set by the user before avformat_write_header()\n     * (mainly useful for AVFMT_NOFILE formats). The callback\n     * should also be passed to avio_open2() if it's used to\n     * open the file.\n     */\n    AVIOInterruptCB interrupt_callback;\n\n    /**\n     * Flags to enable debugging.\n     */\n    int debug;\n#define FF_FDEBUG_TS        0x0001\n\n    /**\n     * The maximum number of streams.\n     * - encoding: unused\n     * - decoding: set by user\n     */\n    int max_streams;\n\n    /**\n     * Maximum amount of memory in bytes to use for the index of each stream.\n     * If the index exceeds this size, entries will be discarded as\n     * needed to maintain a smaller size. This can lead to slower or less\n     * accurate seeking (depends on demuxer).\n     * Demuxers for which a full in-memory index is mandatory will ignore\n     * this.\n     * - muxing: unused\n     * - demuxing: set by user\n     */\n    unsigned int max_index_size;\n\n    /**\n     * Maximum amount of memory in bytes to use for buffering frames\n     * obtained from realtime capture devices.\n     */\n    unsigned int max_picture_buffer;\n\n    /**\n     * Maximum buffering duration for interleaving.\n     *\n     * To ensure all the streams are interleaved correctly,\n     * av_interleaved_write_frame() will wait until it has at least one packet\n     * for each stream before actually writing any packets to the output file.\n     * When some streams are \"sparse\" (i.e. there are large gaps between\n     * successive packets), this can result in excessive buffering.\n     *\n     * This field specifies the maximum difference between the timestamps of the\n     * first and the last packet in the muxing queue, above which libavformat\n     * will output a packet regardless of whether it has queued a packet for all\n     * the streams.\n     *\n     * Muxing only, set by the caller before avformat_write_header().\n     */\n    int64_t max_interleave_delta;\n\n    /**\n     * Maximum number of packets to read while waiting for the first timestamp.\n     * Decoding only.\n     */\n    int max_ts_probe;\n\n    /**\n     * Max chunk time in microseconds.\n     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.\n     * - encoding: Set by user\n     * - decoding: unused\n     */\n    int max_chunk_duration;\n\n    /**\n     * Max chunk size in bytes\n     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.\n     * - encoding: Set by user\n     * - decoding: unused\n     */\n    int max_chunk_size;\n\n    /**\n     * Maximum number of packets that can be probed\n     * - encoding: unused\n     * - decoding: set by user\n     */\n    int max_probe_packets;\n\n    /**\n     * Allow non-standard and experimental extension\n     * @see AVCodecContext.strict_std_compliance\n     */\n    int strict_std_compliance;\n\n    /**\n     * Flags indicating events happening on the file, a combination of\n     * AVFMT_EVENT_FLAG_*.\n     *\n     * - demuxing: may be set by the demuxer in avformat_open_input(),\n     *   avformat_find_stream_info() and av_read_frame(). Flags must be cleared\n     *   by the user once the event has been handled.\n     * - muxing: may be set by the user after avformat_write_header() to\n     *   indicate a user-triggered event.  The muxer will clear the flags for\n     *   events it has handled in av_[interleaved]_write_frame().\n     */\n    int event_flags;\n/**\n * - demuxing: the demuxer read new metadata from the file and updated\n *   AVFormatContext.metadata accordingly\n * - muxing: the user updated AVFormatContext.metadata and wishes the muxer to\n *   write it into the file\n */\n#define AVFMT_EVENT_FLAG_METADATA_UPDATED 0x0001\n\n\n    /**\n     * Avoid negative timestamps during muxing.\n     * Any value of the AVFMT_AVOID_NEG_TS_* constants.\n     * Note, this works better when using av_interleaved_write_frame().\n     * - muxing: Set by user\n     * - demuxing: unused\n     */\n    int avoid_negative_ts;\n#define AVFMT_AVOID_NEG_TS_AUTO             -1 ///< Enabled when required by target format\n#define AVFMT_AVOID_NEG_TS_DISABLED          0 ///< Do not shift timestamps even when they are negative.\n#define AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE 1 ///< Shift timestamps so they are non negative\n#define AVFMT_AVOID_NEG_TS_MAKE_ZERO         2 ///< Shift timestamps so that they start at 0\n\n    /**\n     * Audio preload in microseconds.\n     * Note, not all formats support this and unpredictable things may happen if it is used when not supported.\n     * - encoding: Set by user\n     * - decoding: unused\n     */\n    int audio_preload;\n\n    /**\n     * forces the use of wallclock timestamps as pts/dts of packets\n     * This has undefined results in the presence of B frames.\n     * - encoding: unused\n     * - decoding: Set by user\n     */\n    int use_wallclock_as_timestamps;\n\n    /**\n     * Skip duration calculation in estimate_timings_from_pts.\n     * - encoding: unused\n     * - decoding: set by user\n     *\n     * @see duration_probesize\n     */\n    int skip_estimate_duration_from_pts;\n\n    /**\n     * avio flags, used to force AVIO_FLAG_DIRECT.\n     * - encoding: unused\n     * - decoding: Set by user\n     */\n    int avio_flags;\n\n    /**\n     * The duration field can be estimated through various ways, and this field can be used\n     * to know how the duration was estimated.\n     * - encoding: unused\n     * - decoding: Read by user\n     */\n    enum AVDurationEstimationMethod duration_estimation_method;\n\n    /**\n     * Skip initial bytes when opening stream\n     * - encoding: unused\n     * - decoding: Set by user\n     */\n    int64_t skip_initial_bytes;\n\n    /**\n     * Correct single timestamp overflows\n     * - encoding: unused\n     * - decoding: Set by user\n     */\n    unsigned int correct_ts_overflow;\n\n    /**\n     * Force seeking to any (also non key) frames.\n     * - encoding: unused\n     * - decoding: Set by user\n     */\n    int seek2any;\n\n    /**\n     * Flush the I/O context after each packet.\n     * - encoding: Set by user\n     * - decoding: unused\n     */\n    int flush_packets;\n\n    /**\n     * format probing score.\n     * The maximal score is AVPROBE_SCORE_MAX, its set when the demuxer probes\n     * the format.\n     * - encoding: unused\n     * - decoding: set by avformat, read by user\n     */\n    int probe_score;\n\n    /**\n     * Maximum number of bytes read from input in order to identify the\n     * \\ref AVInputFormat \"input format\". Only used when the format is not set\n     * explicitly by the caller.\n     *\n     * Demuxing only, set by the caller before avformat_open_input().\n     *\n     * @see probesize\n     */\n    int format_probesize;\n\n    /**\n     * ',' separated list of allowed decoders.\n     * If NULL then all are allowed\n     * - encoding: unused\n     * - decoding: set by user\n     */\n    char *codec_whitelist;\n\n    /**\n     * ',' separated list of allowed demuxers.\n     * If NULL then all are allowed\n     * - encoding: unused\n     * - decoding: set by user\n     */\n    char *format_whitelist;\n\n    /**\n     * ',' separated list of allowed protocols.\n     * - encoding: unused\n     * - decoding: set by user\n     */\n    char *protocol_whitelist;\n\n    /**\n     * ',' separated list of disallowed protocols.\n     * - encoding: unused\n     * - decoding: set by user\n     */\n    char *protocol_blacklist;\n\n    /**\n     * IO repositioned flag.\n     * This is set by avformat when the underlying IO context read pointer\n     * is repositioned, for example when doing byte based seeking.\n     * Demuxers can use the flag to detect such changes.\n     */\n    int io_repositioned;\n\n    /**\n     * Forced video codec.\n     * This allows forcing a specific decoder, even when there are multiple with\n     * the same codec_id.\n     * Demuxing: Set by user\n     */\n    const struct AVCodec *video_codec;\n\n    /**\n     * Forced audio codec.\n     * This allows forcing a specific decoder, even when there are multiple with\n     * the same codec_id.\n     * Demuxing: Set by user\n     */\n    const struct AVCodec *audio_codec;\n\n    /**\n     * Forced subtitle codec.\n     * This allows forcing a specific decoder, even when there are multiple with\n     * the same codec_id.\n     * Demuxing: Set by user\n     */\n    const struct AVCodec *subtitle_codec;\n\n    /**\n     * Forced data codec.\n     * This allows forcing a specific decoder, even when there are multiple with\n     * the same codec_id.\n     * Demuxing: Set by user\n     */\n    const struct AVCodec *data_codec;\n\n    /**\n     * Number of bytes to be written as padding in a metadata header.\n     * Demuxing: Unused.\n     * Muxing: Set by user.\n     */\n    int metadata_header_padding;\n\n    /**\n     * User data.\n     * This is a place for some private data of the user.\n     */\n    void *opaque;\n\n    /**\n     * Callback used by devices to communicate with application.\n     */\n    av_format_control_message control_message_cb;\n\n    /**\n     * Output timestamp offset, in microseconds.\n     * Muxing: set by user\n     */\n    int64_t output_ts_offset;\n\n    /**\n     * dump format separator.\n     * can be \", \" or \"\\n      \" or anything else\n     * - muxing: Set by user.\n     * - demuxing: Set by user.\n     */\n    uint8_t *dump_separator;\n\n    /**\n     * A callback for opening new IO streams.\n     *\n     * Whenever a muxer or a demuxer needs to open an IO stream (typically from\n     * avformat_open_input() for demuxers, but for certain formats can happen at\n     * other times as well), it will call this callback to obtain an IO context.\n     *\n     * @param s the format context\n     * @param pb on success, the newly opened IO context should be returned here\n     * @param url the url to open\n     * @param flags a combination of AVIO_FLAG_*\n     * @param options a dictionary of additional options, with the same\n     *                semantics as in avio_open2()\n     * @return 0 on success, a negative AVERROR code on failure\n     *\n     * @note Certain muxers and demuxers do nesting, i.e. they open one or more\n     * additional internal format contexts. Thus the AVFormatContext pointer\n     * passed to this callback may be different from the one facing the caller.\n     * It will, however, have the same 'opaque' field.\n     */\n    int (*io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url,\n                   int flags, AVDictionary **options);\n\n    /**\n     * A callback for closing the streams opened with AVFormatContext.io_open().\n     *\n     * @param s the format context\n     * @param pb IO context to be closed and freed\n     * @return 0 on success, a negative AVERROR code on failure\n     */\n    int (*io_close2)(struct AVFormatContext *s, AVIOContext *pb);\n\n    /**\n     * Maximum number of bytes read from input in order to determine stream durations\n     * when using estimate_timings_from_pts in avformat_find_stream_info().\n     * Demuxing only, set by the caller before avformat_find_stream_info().\n     * Can be set to 0 to let avformat choose using a heuristic.\n     *\n     * @see skip_estimate_duration_from_pts\n     */\n    int64_t duration_probesize;\n} AVFormatContext;\n\n/**\n * @defgroup lavf_core Core functions\n * @ingroup libavf\n *\n * Functions for querying libavformat capabilities, allocating core structures,\n * etc.\n * @{\n */\n\n/**\n * Return the LIBAVFORMAT_VERSION_INT constant.\n */\nunsigned avformat_version(void);\n\n/**\n * Return the libavformat build-time configuration.\n */\nconst char *avformat_configuration(void);\n\n/**\n * Return the libavformat license.\n */\nconst char *avformat_license(void);\n\n/**\n * Do global initialization of network libraries. This is optional,\n * and not recommended anymore.\n *\n * This functions only exists to work around thread-safety issues\n * with older GnuTLS or OpenSSL libraries. If libavformat is linked\n * to newer versions of those libraries, or if you do not use them,\n * calling this function is unnecessary. Otherwise, you need to call\n * this function before any other threads using them are started.\n *\n * This function will be deprecated once support for older GnuTLS and\n * OpenSSL libraries is removed, and this function has no purpose\n * anymore.\n */\nint avformat_network_init(void);\n\n/**\n * Undo the initialization done by avformat_network_init. Call it only\n * once for each time you called avformat_network_init.\n */\nint avformat_network_deinit(void);\n\n/**\n * Iterate over all registered muxers.\n *\n * @param opaque a pointer where libavformat will store the iteration state. Must\n *               point to NULL to start the iteration.\n *\n * @return the next registered muxer or NULL when the iteration is\n *         finished\n */\nconst AVOutputFormat *av_muxer_iterate(void **opaque);\n\n/**\n * Iterate over all registered demuxers.\n *\n * @param opaque a pointer where libavformat will store the iteration state.\n *               Must point to NULL to start the iteration.\n *\n * @return the next registered demuxer or NULL when the iteration is\n *         finished\n */\nconst AVInputFormat *av_demuxer_iterate(void **opaque);\n\n/**\n * Allocate an AVFormatContext.\n * avformat_free_context() can be used to free the context and everything\n * allocated by the framework within it.\n */\nAVFormatContext *avformat_alloc_context(void);\n\n/**\n * Free an AVFormatContext and all its streams.\n * @param s context to free\n */\nvoid avformat_free_context(AVFormatContext *s);\n\n/**\n * Get the AVClass for AVFormatContext. It can be used in combination with\n * AV_OPT_SEARCH_FAKE_OBJ for examining options.\n *\n * @see av_opt_find().\n */\nconst AVClass *avformat_get_class(void);\n\n/**\n * Get the AVClass for AVStream. It can be used in combination with\n * AV_OPT_SEARCH_FAKE_OBJ for examining options.\n *\n * @see av_opt_find().\n */\nconst AVClass *av_stream_get_class(void);\n\n/**\n * Get the AVClass for AVStreamGroup. It can be used in combination with\n * AV_OPT_SEARCH_FAKE_OBJ for examining options.\n *\n * @see av_opt_find().\n */\nconst AVClass *av_stream_group_get_class(void);\n\n/**\n * @return a string identifying the stream group type, or NULL if unknown\n */\nconst char *avformat_stream_group_name(enum AVStreamGroupParamsType type);\n\n/**\n * Add a new empty stream group to a media file.\n *\n * When demuxing, it may be called by the demuxer in read_header(). If the\n * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also\n * be called in read_packet().\n *\n * When muxing, may be called by the user before avformat_write_header().\n *\n * User is required to call avformat_free_context() to clean up the allocation\n * by avformat_stream_group_create().\n *\n * New streams can be added to the group with avformat_stream_group_add_stream().\n *\n * @param s media file handle\n *\n * @return newly created group or NULL on error.\n * @see avformat_new_stream, avformat_stream_group_add_stream.\n */\nAVStreamGroup *avformat_stream_group_create(AVFormatContext *s,\n                                            enum AVStreamGroupParamsType type,\n                                            AVDictionary **options);\n\n/**\n * Add a new stream to a media file.\n *\n * When demuxing, it is called by the demuxer in read_header(). If the\n * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also\n * be called in read_packet().\n *\n * When muxing, should be called by the user before avformat_write_header().\n *\n * User is required to call avformat_free_context() to clean up the allocation\n * by avformat_new_stream().\n *\n * @param s media file handle\n * @param c unused, does nothing\n *\n * @return newly created stream or NULL on error.\n */\nAVStream *avformat_new_stream(AVFormatContext *s, const struct AVCodec *c);\n\n/**\n * Add an already allocated stream to a stream group.\n *\n * When demuxing, it may be called by the demuxer in read_header(). If the\n * flag AVFMTCTX_NOHEADER is set in s.ctx_flags, then it may also\n * be called in read_packet().\n *\n * When muxing, may be called by the user before avformat_write_header() after\n * having allocated a new group with avformat_stream_group_create() and stream with\n * avformat_new_stream().\n *\n * User is required to call avformat_free_context() to clean up the allocation\n * by avformat_stream_group_add_stream().\n *\n * @param stg stream group belonging to a media file.\n * @param st  stream in the media file to add to the group.\n *\n * @retval 0                 success\n * @retval AVERROR(EEXIST)   the stream was already in the group\n * @retval \"another negative error code\" legitimate errors\n *\n * @see avformat_new_stream, avformat_stream_group_create.\n */\nint avformat_stream_group_add_stream(AVStreamGroup *stg, AVStream *st);\n\nAVProgram *av_new_program(AVFormatContext *s, int id);\n\n/**\n * @}\n */\n\n\n/**\n * Allocate an AVFormatContext for an output format.\n * avformat_free_context() can be used to free the context and\n * everything allocated by the framework within it.\n *\n * @param ctx           pointee is set to the created format context,\n *                      or to NULL in case of failure\n * @param oformat       format to use for allocating the context, if NULL\n *                      format_name and filename are used instead\n * @param format_name   the name of output format to use for allocating the\n *                      context, if NULL filename is used instead\n * @param filename      the name of the filename to use for allocating the\n *                      context, may be NULL\n *\n * @return  >= 0 in case of success, a negative AVERROR code in case of\n *          failure\n */\nint avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat,\n                                   const char *format_name, const char *filename);\n\n/**\n * @addtogroup lavf_decoding\n * @{\n */\n\n/**\n * Find AVInputFormat based on the short name of the input format.\n */\nconst AVInputFormat *av_find_input_format(const char *short_name);\n\n/**\n * Guess the file format.\n *\n * @param pd        data to be probed\n * @param is_opened Whether the file is already opened; determines whether\n *                  demuxers with or without AVFMT_NOFILE are probed.\n */\nconst AVInputFormat *av_probe_input_format(const AVProbeData *pd, int is_opened);\n\n/**\n * Guess the file format.\n *\n * @param pd        data to be probed\n * @param is_opened Whether the file is already opened; determines whether\n *                  demuxers with or without AVFMT_NOFILE are probed.\n * @param score_max A probe score larger that this is required to accept a\n *                  detection, the variable is set to the actual detection\n *                  score afterwards.\n *                  If the score is <= AVPROBE_SCORE_MAX / 4 it is recommended\n *                  to retry with a larger probe buffer.\n */\nconst AVInputFormat *av_probe_input_format2(const AVProbeData *pd,\n                                            int is_opened, int *score_max);\n\n/**\n * Guess the file format.\n *\n * @param is_opened Whether the file is already opened; determines whether\n *                  demuxers with or without AVFMT_NOFILE are probed.\n * @param score_ret The score of the best detection.\n */\nconst AVInputFormat *av_probe_input_format3(const AVProbeData *pd,\n                                            int is_opened, int *score_ret);\n\n/**\n * Probe a bytestream to determine the input format. Each time a probe returns\n * with a score that is too low, the probe buffer size is increased and another\n * attempt is made. When the maximum probe size is reached, the input format\n * with the highest score is returned.\n *\n * @param pb             the bytestream to probe\n * @param fmt            the input format is put here\n * @param url            the url of the stream\n * @param logctx         the log context\n * @param offset         the offset within the bytestream to probe from\n * @param max_probe_size the maximum probe buffer size (zero for default)\n *\n * @return the score in case of success, a negative value corresponding to an\n *         the maximal score is AVPROBE_SCORE_MAX\n *         AVERROR code otherwise\n */\nint av_probe_input_buffer2(AVIOContext *pb, const AVInputFormat **fmt,\n                           const char *url, void *logctx,\n                           unsigned int offset, unsigned int max_probe_size);\n\n/**\n * Like av_probe_input_buffer2() but returns 0 on success\n */\nint av_probe_input_buffer(AVIOContext *pb, const AVInputFormat **fmt,\n                          const char *url, void *logctx,\n                          unsigned int offset, unsigned int max_probe_size);\n\n/**\n * Open an input stream and read the header. The codecs are not opened.\n * The stream must be closed with avformat_close_input().\n *\n * @param ps       Pointer to user-supplied AVFormatContext (allocated by\n *                 avformat_alloc_context). May be a pointer to NULL, in\n *                 which case an AVFormatContext is allocated by this\n *                 function and written into ps.\n *                 Note that a user-supplied AVFormatContext will be freed\n *                 on failure and its pointer set to NULL.\n * @param url      URL of the stream to open.\n * @param fmt      If non-NULL, this parameter forces a specific input format.\n *                 Otherwise the format is autodetected.\n * @param options  A dictionary filled with AVFormatContext and demuxer-private\n *                 options.\n *                 On return this parameter will be destroyed and replaced with\n *                 a dict containing options that were not found. May be NULL.\n *\n * @return 0 on success; on failure: frees ps, sets its pointer to NULL,\n *         and returns a negative AVERROR.\n *\n * @note If you want to use custom IO, preallocate the format context and set its pb field.\n */\nint avformat_open_input(AVFormatContext **ps, const char *url,\n                        const AVInputFormat *fmt, AVDictionary **options);\n\n/**\n * Read packets of a media file to get stream information. This\n * is useful for file formats with no headers such as MPEG. This\n * function also computes the real framerate in case of MPEG-2 repeat\n * frame mode.\n * The logical file position is not changed by this function;\n * examined packets may be buffered for later processing.\n *\n * @param ic media file handle\n * @param options  If non-NULL, an ic.nb_streams long array of pointers to\n *                 dictionaries, where i-th member contains options for\n *                 codec corresponding to i-th stream.\n *                 On return each dictionary will be filled with options that were not found.\n * @return >=0 if OK, AVERROR_xxx on error\n *\n * @note this function isn't guaranteed to open all the codecs, so\n *       options being non-empty at return is a perfectly normal behavior.\n *\n * @todo Let the user decide somehow what information is needed so that\n *       we do not waste time getting stuff the user does not need.\n */\nint avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);\n\n/**\n * Find the programs which belong to a given stream.\n *\n * @param ic    media file handle\n * @param last  the last found program, the search will start after this\n *              program, or from the beginning if it is NULL\n * @param s     stream index\n *\n * @return the next program which belongs to s, NULL if no program is found or\n *         the last program is not among the programs of ic.\n */\nAVProgram *av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s);\n\nvoid av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx);\n\n/**\n * Find the \"best\" stream in the file.\n * The best stream is determined according to various heuristics as the most\n * likely to be what the user expects.\n * If the decoder parameter is non-NULL, av_find_best_stream will find the\n * default decoder for the stream's codec; streams for which no decoder can\n * be found are ignored.\n *\n * @param ic                media file handle\n * @param type              stream type: video, audio, subtitles, etc.\n * @param wanted_stream_nb  user-requested stream number,\n *                          or -1 for automatic selection\n * @param related_stream    try to find a stream related (eg. in the same\n *                          program) to this one, or -1 if none\n * @param decoder_ret       if non-NULL, returns the decoder for the\n *                          selected stream\n * @param flags             flags; none are currently defined\n *\n * @return  the non-negative stream number in case of success,\n *          AVERROR_STREAM_NOT_FOUND if no stream with the requested type\n *          could be found,\n *          AVERROR_DECODER_NOT_FOUND if streams were found but no decoder\n *\n * @note  If av_find_best_stream returns successfully and decoder_ret is not\n *        NULL, then *decoder_ret is guaranteed to be set to a valid AVCodec.\n */\nint av_find_best_stream(AVFormatContext *ic,\n                        enum AVMediaTypeFFmpeg type,\n                        int wanted_stream_nb,\n                        int related_stream,\n                        const struct AVCodec **decoder_ret,\n                        int flags);\n\n/**\n * Return the next frame of a stream.\n * This function returns what is stored in the file, and does not validate\n * that what is there are valid frames for the decoder. It will split what is\n * stored in the file into frames and return one for each call. It will not\n * omit invalid data between valid frames so as to give the decoder the maximum\n * information possible for decoding.\n *\n * On success, the returned packet is reference-counted (pkt->buf is set) and\n * valid indefinitely. The packet must be freed with av_packet_unref() when\n * it is no longer needed. For video, the packet contains exactly one frame.\n * For audio, it contains an integer number of frames if each frame has\n * a known fixed size (e.g. PCM or ADPCM data). If the audio frames have\n * a variable size (e.g. MPEG audio), then it contains one frame.\n *\n * pkt->pts, pkt->dts and pkt->duration are always set to correct\n * values in AVStream.time_base units (and guessed if the format cannot\n * provide them). pkt->pts can be AV_NOPTS_VALUE if the video format\n * has B-frames, so it is better to rely on pkt->dts if you do not\n * decompress the payload.\n *\n * @return 0 if OK, < 0 on error or end of file. On error, pkt will be blank\n *         (as if it came from av_packet_alloc()).\n *\n * @note pkt will be initialized, so it may be uninitialized, but it must not\n *       contain data that needs to be freed.\n */\nint av_read_frame(AVFormatContext *s, AVPacket *pkt);\n\n/**\n * Seek to the keyframe at timestamp.\n * 'timestamp' in 'stream_index'.\n *\n * @param s            media file handle\n * @param stream_index If stream_index is (-1), a default stream is selected,\n *                     and timestamp is automatically converted from\n *                     AV_TIME_BASE units to the stream specific time_base.\n * @param timestamp    Timestamp in AVStream.time_base units or, if no stream\n *                     is specified, in AV_TIME_BASE units.\n * @param flags        flags which select direction and seeking mode\n *\n * @return >= 0 on success\n */\nint av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp,\n                  int flags);\n\n/**\n * Seek to timestamp ts.\n * Seeking will be done so that the point from which all active streams\n * can be presented successfully will be closest to ts and within min/max_ts.\n * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL.\n *\n * If flags contain AVSEEK_FLAG_BYTE, then all timestamps are in bytes and\n * are the file position (this may not be supported by all demuxers).\n * If flags contain AVSEEK_FLAG_FRAME, then all timestamps are in frames\n * in the stream with stream_index (this may not be supported by all demuxers).\n * Otherwise all timestamps are in units of the stream selected by stream_index\n * or if stream_index is -1, in AV_TIME_BASE units.\n * If flags contain AVSEEK_FLAG_ANY, then non-keyframes are treated as\n * keyframes (this may not be supported by all demuxers).\n * If flags contain AVSEEK_FLAG_BACKWARD, it is ignored.\n *\n * @param s            media file handle\n * @param stream_index index of the stream which is used as time base reference\n * @param min_ts       smallest acceptable timestamp\n * @param ts           target timestamp\n * @param max_ts       largest acceptable timestamp\n * @param flags        flags\n * @return >=0 on success, error code otherwise\n *\n * @note This is part of the new seek API which is still under construction.\n */\nint avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags);\n\n/**\n * Discard all internally buffered data. This can be useful when dealing with\n * discontinuities in the byte stream. Generally works only with formats that\n * can resync. This includes headerless formats like MPEG-TS/TS but should also\n * work with NUT, Ogg and in a limited way AVI for example.\n *\n * The set of streams, the detected duration, stream parameters and codecs do\n * not change when calling this function. If you want a complete reset, it's\n * better to open a new AVFormatContext.\n *\n * This does not flush the AVIOContext (s->pb). If necessary, call\n * avio_flush(s->pb) before calling this function.\n *\n * @param s media file handle\n * @return >=0 on success, error code otherwise\n */\nint avformat_flush(AVFormatContext *s);\n\n/**\n * Start playing a network-based stream (e.g. RTSP stream) at the\n * current position.\n */\nint av_read_play(AVFormatContext *s);\n\n/**\n * Pause a network-based stream (e.g. RTSP stream).\n *\n * Use av_read_play() to resume it.\n */\nint av_read_pause(AVFormatContext *s);\n\n/**\n * Close an opened input AVFormatContext. Free it and all its contents\n * and set *s to NULL.\n */\nvoid avformat_close_input(AVFormatContext **s);\n/**\n * @}\n */\n\n#define AVSEEK_FLAG_BACKWARD 1 ///< seek backward\n#define AVSEEK_FLAG_BYTE     2 ///< seeking based on position in bytes\n#define AVSEEK_FLAG_ANY      4 ///< seek to any frame, even non-keyframes\n#define AVSEEK_FLAG_FRAME    8 ///< seeking based on frame number\n\n/**\n * @addtogroup lavf_encoding\n * @{\n */\n\n#define AVSTREAM_INIT_IN_WRITE_HEADER 0 ///< stream parameters initialized in avformat_write_header\n#define AVSTREAM_INIT_IN_INIT_OUTPUT  1 ///< stream parameters initialized in avformat_init_output\n\n/**\n * Allocate the stream private data and write the stream header to\n * an output media file.\n *\n * @param s        Media file handle, must be allocated with\n *                 avformat_alloc_context().\n *                 Its \\ref AVFormatContext.oformat \"oformat\" field must be set\n *                 to the desired output format;\n *                 Its \\ref AVFormatContext.pb \"pb\" field must be set to an\n *                 already opened ::AVIOContext.\n * @param options  An ::AVDictionary filled with AVFormatContext and\n *                 muxer-private options.\n *                 On return this parameter will be destroyed and replaced with\n *                 a dict containing options that were not found. May be NULL.\n *\n * @retval AVSTREAM_INIT_IN_WRITE_HEADER On success, if the codec had not already been\n *                                       fully initialized in avformat_init_output().\n * @retval AVSTREAM_INIT_IN_INIT_OUTPUT  On success, if the codec had already been fully\n *                                       initialized in avformat_init_output().\n * @retval AVERROR                       A negative AVERROR on failure.\n *\n * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_init_output.\n */\nav_warn_unused_result\nint avformat_write_header(AVFormatContext *s, AVDictionary **options);\n\n/**\n * Allocate the stream private data and initialize the codec, but do not write the header.\n * May optionally be used before avformat_write_header() to initialize stream parameters\n * before actually writing the header.\n * If using this function, do not pass the same options to avformat_write_header().\n *\n * @param s        Media file handle, must be allocated with\n *                 avformat_alloc_context().\n *                 Its \\ref AVFormatContext.oformat \"oformat\" field must be set\n *                 to the desired output format;\n *                 Its \\ref AVFormatContext.pb \"pb\" field must be set to an\n *                 already opened ::AVIOContext.\n * @param options  An ::AVDictionary filled with AVFormatContext and\n *                 muxer-private options.\n *                 On return this parameter will be destroyed and replaced with\n *                 a dict containing options that were not found. May be NULL.\n *\n * @retval AVSTREAM_INIT_IN_WRITE_HEADER On success, if the codec requires\n *                                       avformat_write_header to fully initialize.\n * @retval AVSTREAM_INIT_IN_INIT_OUTPUT  On success, if the codec has been fully\n *                                       initialized.\n * @retval AVERROR                       Anegative AVERROR on failure.\n *\n * @see av_opt_find, av_dict_set, avio_open, av_oformat_next, avformat_write_header.\n */\nav_warn_unused_result\nint avformat_init_output(AVFormatContext *s, AVDictionary **options);\n\n/**\n * Write a packet to an output media file.\n *\n * This function passes the packet directly to the muxer, without any buffering\n * or reordering. The caller is responsible for correctly interleaving the\n * packets if the format requires it. Callers that want libavformat to handle\n * the interleaving should call av_interleaved_write_frame() instead of this\n * function.\n *\n * @param s media file handle\n * @param pkt The packet containing the data to be written. Note that unlike\n *            av_interleaved_write_frame(), this function does not take\n *            ownership of the packet passed to it (though some muxers may make\n *            an internal reference to the input packet).\n *            <br>\n *            This parameter can be NULL (at any time, not just at the end), in\n *            order to immediately flush data buffered within the muxer, for\n *            muxers that buffer up data internally before writing it to the\n *            output.\n *            <br>\n *            Packet's @ref AVPacket.stream_index \"stream_index\" field must be\n *            set to the index of the corresponding stream in @ref\n *            AVFormatContext.streams \"s->streams\".\n *            <br>\n *            The timestamps (@ref AVPacket.pts \"pts\", @ref AVPacket.dts \"dts\")\n *            must be set to correct values in the stream's timebase (unless the\n *            output format is flagged with the AVFMT_NOTIMESTAMPS flag, then\n *            they can be set to AV_NOPTS_VALUE).\n *            The dts for subsequent packets passed to this function must be strictly\n *            increasing when compared in their respective timebases (unless the\n *            output format is flagged with the AVFMT_TS_NONSTRICT, then they\n *            merely have to be nondecreasing).  @ref AVPacket.duration\n *            \"duration\") should also be set if known.\n * @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush\n *\n * @see av_interleaved_write_frame()\n */\nint av_write_frame(AVFormatContext *s, AVPacket *pkt);\n\n/**\n * Write a packet to an output media file ensuring correct interleaving.\n *\n * This function will buffer the packets internally as needed to make sure the\n * packets in the output file are properly interleaved, usually ordered by\n * increasing dts. Callers doing their own interleaving should call\n * av_write_frame() instead of this function.\n *\n * Using this function instead of av_write_frame() can give muxers advance\n * knowledge of future packets, improving e.g. the behaviour of the mp4\n * muxer for VFR content in fragmenting mode.\n *\n * @param s media file handle\n * @param pkt The packet containing the data to be written.\n *            <br>\n *            If the packet is reference-counted, this function will take\n *            ownership of this reference and unreference it later when it sees\n *            fit. If the packet is not reference-counted, libavformat will\n *            make a copy.\n *            The returned packet will be blank (as if returned from\n *            av_packet_alloc()), even on error.\n *            <br>\n *            This parameter can be NULL (at any time, not just at the end), to\n *            flush the interleaving queues.\n *            <br>\n *            Packet's @ref AVPacket.stream_index \"stream_index\" field must be\n *            set to the index of the corresponding stream in @ref\n *            AVFormatContext.streams \"s->streams\".\n *            <br>\n *            The timestamps (@ref AVPacket.pts \"pts\", @ref AVPacket.dts \"dts\")\n *            must be set to correct values in the stream's timebase (unless the\n *            output format is flagged with the AVFMT_NOTIMESTAMPS flag, then\n *            they can be set to AV_NOPTS_VALUE).\n *            The dts for subsequent packets in one stream must be strictly\n *            increasing (unless the output format is flagged with the\n *            AVFMT_TS_NONSTRICT, then they merely have to be nondecreasing).\n *            @ref AVPacket.duration \"duration\" should also be set if known.\n *\n * @return 0 on success, a negative AVERROR on error.\n *\n * @see av_write_frame(), AVFormatContext.max_interleave_delta\n */\nint av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt);\n\n/**\n * Write an uncoded frame to an output media file.\n *\n * The frame must be correctly interleaved according to the container\n * specification; if not, av_interleaved_write_uncoded_frame() must be used.\n *\n * See av_interleaved_write_uncoded_frame() for details.\n */\nint av_write_uncoded_frame(AVFormatContext *s, int stream_index,\n                           struct AVFrame *frame);\n\n/**\n * Write an uncoded frame to an output media file.\n *\n * If the muxer supports it, this function makes it possible to write an AVFrame\n * structure directly, without encoding it into a packet.\n * It is mostly useful for devices and similar special muxers that use raw\n * video or PCM data and will not serialize it into a byte stream.\n *\n * To test whether it is possible to use it with a given muxer and stream,\n * use av_write_uncoded_frame_query().\n *\n * The caller gives up ownership of the frame and must not access it\n * afterwards.\n *\n * @return  >=0 for success, a negative code on error\n */\nint av_interleaved_write_uncoded_frame(AVFormatContext *s, int stream_index,\n                                       struct AVFrame *frame);\n\n/**\n * Test whether a muxer supports uncoded frame.\n *\n * @return  >=0 if an uncoded frame can be written to that muxer and stream,\n *          <0 if not\n */\nint av_write_uncoded_frame_query(AVFormatContext *s, int stream_index);\n\n/**\n * Write the stream trailer to an output media file and free the\n * file private data.\n *\n * May only be called after a successful call to avformat_write_header.\n *\n * @param s media file handle\n * @return 0 if OK, AVERROR_xxx on error\n */\nint av_write_trailer(AVFormatContext *s);\n\n/**\n * Return the output format in the list of registered output formats\n * which best matches the provided parameters, or return NULL if\n * there is no match.\n *\n * @param short_name if non-NULL checks if short_name matches with the\n *                   names of the registered formats\n * @param filename   if non-NULL checks if filename terminates with the\n *                   extensions of the registered formats\n * @param mime_type  if non-NULL checks if mime_type matches with the\n *                   MIME type of the registered formats\n */\nconst AVOutputFormat *av_guess_format(const char *short_name,\n                                      const char *filename,\n                                      const char *mime_type);\n\n/**\n * Guess the codec ID based upon muxer and filename.\n */\nenum AVCodecID av_guess_codec(const AVOutputFormat *fmt, const char *short_name,\n                              const char *filename, const char *mime_type,\n                              enum AVMediaTypeFFmpeg type);\n\n/**\n * Get timing information for the data currently output.\n * The exact meaning of \"currently output\" depends on the format.\n * It is mostly relevant for devices that have an internal buffer and/or\n * work in real time.\n * @param s          media file handle\n * @param stream     stream in the media file\n * @param[out] dts   DTS of the last packet output for the stream, in stream\n *                   time_base units\n * @param[out] wall  absolute time when that packet whas output,\n *                   in microsecond\n * @retval  0               Success\n * @retval  AVERROR(ENOSYS) The format does not support it\n *\n * @note Some formats or devices may not allow to measure dts and wall\n *       atomically.\n */\nint av_get_output_timestamp(struct AVFormatContext *s, int stream,\n                            int64_t *dts, int64_t *wall);\n\n\n/**\n * @}\n */\n\n\n/**\n * @defgroup lavf_misc Utility functions\n * @ingroup libavf\n * @{\n *\n * Miscellaneous utility functions related to both muxing and demuxing\n * (or neither).\n */\n\n/**\n * Send a nice hexadecimal dump of a buffer to the specified file stream.\n *\n * @param f The file stream pointer where the dump should be sent to.\n * @param buf buffer\n * @param size buffer size\n *\n * @see av_hex_dump_log, av_pkt_dump2, av_pkt_dump_log2\n */\nvoid av_hex_dump(FILE *f, const uint8_t *buf, int size);\n\n/**\n * Send a nice hexadecimal dump of a buffer to the log.\n *\n * @param avcl A pointer to an arbitrary struct of which the first field is a\n * pointer to an AVClass struct.\n * @param level The importance level of the message, lower values signifying\n * higher importance.\n * @param buf buffer\n * @param size buffer size\n *\n * @see av_hex_dump, av_pkt_dump2, av_pkt_dump_log2\n */\nvoid av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size);\n\n/**\n * Send a nice dump of a packet to the specified file stream.\n *\n * @param f The file stream pointer where the dump should be sent to.\n * @param pkt packet to dump\n * @param dump_payload True if the payload must be displayed, too.\n * @param st AVStream that the packet belongs to\n */\nvoid av_pkt_dump2(FILE *f, const AVPacket *pkt, int dump_payload, const AVStream *st);\n\n\n/**\n * Send a nice dump of a packet to the log.\n *\n * @param avcl A pointer to an arbitrary struct of which the first field is a\n * pointer to an AVClass struct.\n * @param level The importance level of the message, lower values signifying\n * higher importance.\n * @param pkt packet to dump\n * @param dump_payload True if the payload must be displayed, too.\n * @param st AVStream that the packet belongs to\n */\nvoid av_pkt_dump_log2(void *avcl, int level, const AVPacket *pkt, int dump_payload,\n                      const AVStream *st);\n\n/**\n * Get the AVCodecID for the given codec tag tag.\n * If no codec id is found returns AV_CODEC_ID_NONE.\n *\n * @param tags list of supported codec_id-codec_tag pairs, as stored\n * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag\n * @param tag  codec tag to match to a codec ID\n */\nenum AVCodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int tag);\n\n/**\n * Get the codec tag for the given codec id id.\n * If no codec tag is found returns 0.\n *\n * @param tags list of supported codec_id-codec_tag pairs, as stored\n * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag\n * @param id   codec ID to match to a codec tag\n */\nunsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum AVCodecID id);\n\n/**\n * Get the codec tag for the given codec id.\n *\n * @param tags list of supported codec_id - codec_tag pairs, as stored\n * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag\n * @param id codec id that should be searched for in the list\n * @param tag A pointer to the found tag\n * @return 0 if id was not found in tags, > 0 if it was found\n */\nint av_codec_get_tag2(const struct AVCodecTag * const *tags, enum AVCodecID id,\n                      unsigned int *tag);\n\nint av_find_default_stream_index(AVFormatContext *s);\n\n/**\n * Get the index for a specific timestamp.\n *\n * @param st        stream that the timestamp belongs to\n * @param timestamp timestamp to retrieve the index for\n * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond\n *                 to the timestamp which is <= the requested one, if backward\n *                 is 0, then it will be >=\n *              if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise\n * @return < 0 if no such timestamp could be found\n */\nint av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags);\n\n/**\n * Get the index entry count for the given AVStream.\n *\n * @param st stream\n * @return the number of index entries in the stream\n */\nint avformat_index_get_entries_count(const AVStream *st);\n\n/**\n * Get the AVIndexEntry corresponding to the given index.\n *\n * @param st          Stream containing the requested AVIndexEntry.\n * @param idx         The desired index.\n * @return A pointer to the requested AVIndexEntry if it exists, NULL otherwise.\n *\n * @note The pointer returned by this function is only guaranteed to be valid\n *       until any function that takes the stream or the parent AVFormatContext\n *       as input argument is called.\n */\nconst AVIndexEntry *avformat_index_get_entry(AVStream *st, int idx);\n\n/**\n * Get the AVIndexEntry corresponding to the given timestamp.\n *\n * @param st          Stream containing the requested AVIndexEntry.\n * @param wanted_timestamp   Timestamp to retrieve the index entry for.\n * @param flags       If AVSEEK_FLAG_BACKWARD then the returned entry will correspond\n *                    to the timestamp which is <= the requested one, if backward\n *                    is 0, then it will be >=\n *                    if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise.\n * @return A pointer to the requested AVIndexEntry if it exists, NULL otherwise.\n *\n * @note The pointer returned by this function is only guaranteed to be valid\n *       until any function that takes the stream or the parent AVFormatContext\n *       as input argument is called.\n */\nconst AVIndexEntry *avformat_index_get_entry_from_timestamp(AVStream *st,\n                                                            int64_t wanted_timestamp,\n                                                            int flags);\n/**\n * Add an index entry into a sorted list. Update the entry if the list\n * already contains it.\n *\n * @param timestamp timestamp in the time base of the given stream\n */\nint av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,\n                       int size, int distance, int flags);\n\n\n/**\n * Split a URL string into components.\n *\n * The pointers to buffers for storing individual components may be null,\n * in order to ignore that component. Buffers for components not found are\n * set to empty strings. If the port is not found, it is set to a negative\n * value.\n *\n * @param proto the buffer for the protocol\n * @param proto_size the size of the proto buffer\n * @param authorization the buffer for the authorization\n * @param authorization_size the size of the authorization buffer\n * @param hostname the buffer for the host name\n * @param hostname_size the size of the hostname buffer\n * @param port_ptr a pointer to store the port number in\n * @param path the buffer for the path\n * @param path_size the size of the path buffer\n * @param url the URL to split\n */\nvoid av_url_split(char *proto,         int proto_size,\n                  char *authorization, int authorization_size,\n                  char *hostname,      int hostname_size,\n                  int *port_ptr,\n                  char *path,          int path_size,\n                  const char *url);\n\n\n/**\n * Print detailed information about the input or output format, such as\n * duration, bitrate, streams, container, programs, metadata, side data,\n * codec and time base.\n *\n * @param ic        the context to analyze\n * @param index     index of the stream to dump information about\n * @param url       the URL to print, such as source or destination file\n * @param is_output Select whether the specified context is an input(0) or output(1)\n */\nvoid av_dump_format(AVFormatContext *ic,\n                    int index,\n                    const char *url,\n                    int is_output);\n\n\n#define AV_FRAME_FILENAME_FLAGS_MULTIPLE 1 ///< Allow multiple %d\n\n/**\n * Return in 'buf' the path with '%d' replaced by a number.\n *\n * Also handles the '%0nd' format where 'n' is the total number\n * of digits and '%%'.\n *\n * @param buf destination buffer\n * @param buf_size destination buffer size\n * @param path numbered sequence string\n * @param number frame number\n * @param flags AV_FRAME_FILENAME_FLAGS_*\n * @return 0 if OK, -1 on format error\n */\nint av_get_frame_filename2(char *buf, int buf_size,\n                          const char *path, int number, int flags);\n\nint av_get_frame_filename(char *buf, int buf_size,\n                          const char *path, int number);\n\n/**\n * Check whether filename actually is a numbered sequence generator.\n *\n * @param filename possible numbered sequence string\n * @return 1 if a valid numbered sequence string, 0 otherwise\n */\nint av_filename_number_test(const char *filename);\n\n/**\n * Generate an SDP for an RTP session.\n *\n * Note, this overwrites the id values of AVStreams in the muxer contexts\n * for getting unique dynamic payload types.\n *\n * @param ac array of AVFormatContexts describing the RTP streams. If the\n *           array is composed by only one context, such context can contain\n *           multiple AVStreams (one AVStream per RTP stream). Otherwise,\n *           all the contexts in the array (an AVCodecContext per RTP stream)\n *           must contain only one AVStream.\n * @param n_files number of AVCodecContexts contained in ac\n * @param buf buffer where the SDP will be stored (must be allocated by\n *            the caller)\n * @param size the size of the buffer\n * @return 0 if OK, AVERROR_xxx on error\n */\nint av_sdp_create(AVFormatContext *ac[], int n_files, char *buf, int size);\n\n/**\n * Return a positive value if the given filename has one of the given\n * extensions, 0 otherwise.\n *\n * @param filename   file name to check against the given extensions\n * @param extensions a comma-separated list of filename extensions\n */\nint av_match_ext(const char *filename, const char *extensions);\n\n/**\n * Test if the given container can store a codec.\n *\n * @param ofmt           container to check for compatibility\n * @param codec_id       codec to potentially store in container\n * @param std_compliance standards compliance level, one of FF_COMPLIANCE_*\n *\n * @return 1 if codec with ID codec_id can be stored in ofmt, 0 if it cannot.\n *         A negative number if this information is not available.\n */\nint avformat_query_codec(const AVOutputFormat *ofmt, enum AVCodecID codec_id,\n                         int std_compliance);\n\n/**\n * @defgroup riff_fourcc RIFF FourCCs\n * @{\n * Get the tables mapping RIFF FourCCs to libavcodec AVCodecIDs. The tables are\n * meant to be passed to av_codec_get_id()/av_codec_get_tag() as in the\n * following code:\n * @code\n * uint32_t tag = MKTAG('H', '2', '6', '4');\n * const struct AVCodecTag *table[] = { avformat_get_riff_video_tags(), 0 };\n * enum AVCodecID id = av_codec_get_id(table, tag);\n * @endcode\n */\n/**\n * @return the table mapping RIFF FourCCs for video to libavcodec AVCodecID.\n */\nconst struct AVCodecTag *avformat_get_riff_video_tags(void);\n/**\n * @return the table mapping RIFF FourCCs for audio to AVCodecID.\n */\nconst struct AVCodecTag *avformat_get_riff_audio_tags(void);\n/**\n * @return the table mapping MOV FourCCs for video to libavcodec AVCodecID.\n */\nconst struct AVCodecTag *avformat_get_mov_video_tags(void);\n/**\n * @return the table mapping MOV FourCCs for audio to AVCodecID.\n */\nconst struct AVCodecTag *avformat_get_mov_audio_tags(void);\n\n/**\n * @}\n */\n\n/**\n * Guess the sample aspect ratio of a frame, based on both the stream and the\n * frame aspect ratio.\n *\n * Since the frame aspect ratio is set by the codec but the stream aspect ratio\n * is set by the demuxer, these two may not be equal. This function tries to\n * return the value that you should use if you would like to display the frame.\n *\n * Basic logic is to use the stream aspect ratio if it is set to something sane\n * otherwise use the frame aspect ratio. This way a container setting, which is\n * usually easy to modify can override the coded value in the frames.\n *\n * @param format the format context which the stream is part of\n * @param stream the stream which the frame is part of\n * @param frame the frame with the aspect ratio to be determined\n * @return the guessed (valid) sample_aspect_ratio, 0/1 if no idea\n */\nAVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream,\n                                        struct AVFrame *frame);\n\n/**\n * Guess the frame rate, based on both the container and codec information.\n *\n * @param ctx the format context which the stream is part of\n * @param stream the stream which the frame is part of\n * @param frame the frame for which the frame rate should be determined, may be NULL\n * @return the guessed (valid) frame rate, 0/1 if no idea\n */\nAVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream,\n                               struct AVFrame *frame);\n\n/**\n * Check if the stream st contained in s is matched by the stream specifier\n * spec.\n *\n * See the \"stream specifiers\" chapter in the documentation for the syntax\n * of spec.\n *\n * @return  >0 if st is matched by spec;\n *          0  if st is not matched by spec;\n *          AVERROR code if spec is invalid\n *\n * @note  A stream specifier can match several streams in the format.\n */\nint avformat_match_stream_specifier(AVFormatContext *s, AVStream *st,\n                                    const char *spec);\n\nint avformat_queue_attached_pictures(AVFormatContext *s);\n\n#if FF_API_INTERNAL_TIMING\nenum AVTimebaseSource {\n    AVFMT_TBCF_AUTO = -1,\n    AVFMT_TBCF_DECODER,\n    AVFMT_TBCF_DEMUXER,\n#if FF_API_R_FRAME_RATE\n    AVFMT_TBCF_R_FRAMERATE,\n#endif\n};\n\n/**\n * @deprecated do not call this function\n */\nattribute_deprecated\nint avformat_transfer_internal_stream_timing_info(const AVOutputFormat *ofmt,\n                                                  AVStream *ost, const AVStream *ist,\n                                                  enum AVTimebaseSource copy_tb);\n\n/**\n * @deprecated do not call this function\n */\nattribute_deprecated\nAVRational av_stream_get_codec_timebase(const AVStream *st);\n#endif\n\n\n/**\n * @}\n */\n\n#endif /* AVFORMAT_AVFORMAT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavformat/avio.h",
    "content": "/*\n * copyright (c) 2001 Fabrice Bellard\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n#ifndef AVFORMAT_AVIO_H\n#define AVFORMAT_AVIO_H\n\n/**\n * @file\n * @ingroup lavf_io\n * Buffered I/O operations\n */\n\n#include <stdint.h>\n#include <stdio.h>\n\n#include \"libavutil/attributes.h\"\n#include \"libavutil/dict.h\"\n#include \"libavutil/log.h\"\n\n#include \"libavformat/version_major.h\"\n\n/**\n * Seeking works like for a local file.\n */\n#define AVIO_SEEKABLE_NORMAL (1 << 0)\n\n/**\n * Seeking by timestamp with avio_seek_time() is possible.\n */\n#define AVIO_SEEKABLE_TIME   (1 << 1)\n\n/**\n * Callback for checking whether to abort blocking functions.\n * AVERROR_EXIT is returned in this case by the interrupted\n * function. During blocking operations, callback is called with\n * opaque as parameter. If the callback returns 1, the\n * blocking operation will be aborted.\n *\n * No members can be added to this struct without a major bump, if\n * new elements have been added after this struct in AVFormatContext\n * or AVIOContext.\n */\ntypedef struct AVIOInterruptCB {\n    int (*callback)(void*);\n    void *opaque;\n} AVIOInterruptCB;\n\n/**\n * Directory entry types.\n */\nenum AVIODirEntryType {\n    AVIO_ENTRY_UNKNOWN,\n    AVIO_ENTRY_BLOCK_DEVICE,\n    AVIO_ENTRY_CHARACTER_DEVICE,\n    AVIO_ENTRY_DIRECTORY,\n    AVIO_ENTRY_NAMED_PIPE,\n    AVIO_ENTRY_SYMBOLIC_LINK,\n    AVIO_ENTRY_SOCKET,\n    AVIO_ENTRY_FILE,\n    AVIO_ENTRY_SERVER,\n    AVIO_ENTRY_SHARE,\n    AVIO_ENTRY_WORKGROUP,\n};\n\n/**\n * Describes single entry of the directory.\n *\n * Only name and type fields are guaranteed be set.\n * Rest of fields are protocol or/and platform dependent and might be unknown.\n */\ntypedef struct AVIODirEntry {\n    char *name;                           /**< Filename */\n    int type;                             /**< Type of the entry */\n    int utf8;                             /**< Set to 1 when name is encoded with UTF-8, 0 otherwise.\n                                               Name can be encoded with UTF-8 even though 0 is set. */\n    int64_t size;                         /**< File size in bytes, -1 if unknown. */\n    int64_t modification_timestamp;       /**< Time of last modification in microseconds since unix\n                                               epoch, -1 if unknown. */\n    int64_t access_timestamp;             /**< Time of last access in microseconds since unix epoch,\n                                               -1 if unknown. */\n    int64_t status_change_timestamp;      /**< Time of last status change in microseconds since unix\n                                               epoch, -1 if unknown. */\n    int64_t user_id;                      /**< User ID of owner, -1 if unknown. */\n    int64_t group_id;                     /**< Group ID of owner, -1 if unknown. */\n    int64_t filemode;                     /**< Unix file mode, -1 if unknown. */\n} AVIODirEntry;\n\ntypedef struct AVIODirContext AVIODirContext;\n\n/**\n * Different data types that can be returned via the AVIO\n * write_data_type callback.\n */\nenum AVIODataMarkerType {\n    /**\n     * Header data; this needs to be present for the stream to be decodeable.\n     */\n    AVIO_DATA_MARKER_HEADER,\n    /**\n     * A point in the output bytestream where a decoder can start decoding\n     * (i.e. a keyframe). A demuxer/decoder given the data flagged with\n     * AVIO_DATA_MARKER_HEADER, followed by any AVIO_DATA_MARKER_SYNC_POINT,\n     * should give decodeable results.\n     */\n    AVIO_DATA_MARKER_SYNC_POINT,\n    /**\n     * A point in the output bytestream where a demuxer can start parsing\n     * (for non self synchronizing bytestream formats). That is, any\n     * non-keyframe packet start point.\n     */\n    AVIO_DATA_MARKER_BOUNDARY_POINT,\n    /**\n     * This is any, unlabelled data. It can either be a muxer not marking\n     * any positions at all, it can be an actual boundary/sync point\n     * that the muxer chooses not to mark, or a later part of a packet/fragment\n     * that is cut into multiple write callbacks due to limited IO buffer size.\n     */\n    AVIO_DATA_MARKER_UNKNOWN,\n    /**\n     * Trailer data, which doesn't contain actual content, but only for\n     * finalizing the output file.\n     */\n    AVIO_DATA_MARKER_TRAILER,\n    /**\n     * A point in the output bytestream where the underlying AVIOContext might\n     * flush the buffer depending on latency or buffering requirements. Typically\n     * means the end of a packet.\n     */\n    AVIO_DATA_MARKER_FLUSH_POINT,\n};\n\n/**\n * Bytestream IO Context.\n * New public fields can be added with minor version bumps.\n * Removal, reordering and changes to existing public fields require\n * a major version bump.\n * sizeof(AVIOContext) must not be used outside libav*.\n *\n * @note None of the function pointers in AVIOContext should be called\n *       directly, they should only be set by the client application\n *       when implementing custom I/O. Normally these are set to the\n *       function pointers specified in avio_alloc_context()\n */\ntypedef struct AVIOContext {\n    /**\n     * A class for private options.\n     *\n     * If this AVIOContext is created by avio_open2(), av_class is set and\n     * passes the options down to protocols.\n     *\n     * If this AVIOContext is manually allocated, then av_class may be set by\n     * the caller.\n     *\n     * warning -- this field can be NULL, be sure to not pass this AVIOContext\n     * to any av_opt_* functions in that case.\n     */\n    const AVClass *av_class;\n\n    /*\n     * The following shows the relationship between buffer, buf_ptr,\n     * buf_ptr_max, buf_end, buf_size, and pos, when reading and when writing\n     * (since AVIOContext is used for both):\n     *\n     **********************************************************************************\n     *                                   READING\n     **********************************************************************************\n     *\n     *                            |              buffer_size              |\n     *                            |---------------------------------------|\n     *                            |                                       |\n     *\n     *                         buffer          buf_ptr       buf_end\n     *                            +---------------+-----------------------+\n     *                            |/ / / / / / / /|/ / / / / / /|         |\n     *  read buffer:              |/ / consumed / | to be read /|         |\n     *                            |/ / / / / / / /|/ / / / / / /|         |\n     *                            +---------------+-----------------------+\n     *\n     *                                                         pos\n     *              +-------------------------------------------+-----------------+\n     *  input file: |                                           |                 |\n     *              +-------------------------------------------+-----------------+\n     *\n     *\n     **********************************************************************************\n     *                                   WRITING\n     **********************************************************************************\n     *\n     *                             |          buffer_size                 |\n     *                             |--------------------------------------|\n     *                             |                                      |\n     *\n     *                                                buf_ptr_max\n     *                          buffer                 (buf_ptr)       buf_end\n     *                             +-----------------------+--------------+\n     *                             |/ / / / / / / / / / / /|              |\n     *  write buffer:              | / / to be flushed / / |              |\n     *                             |/ / / / / / / / / / / /|              |\n     *                             +-----------------------+--------------+\n     *                               buf_ptr can be in this\n     *                               due to a backward seek\n     *\n     *                            pos\n     *               +-------------+----------------------------------------------+\n     *  output file: |             |                                              |\n     *               +-------------+----------------------------------------------+\n     *\n     */\n    unsigned char *buffer;  /**< Start of the buffer. */\n    int buffer_size;        /**< Maximum buffer size */\n    unsigned char *buf_ptr; /**< Current position in the buffer */\n    unsigned char *buf_end; /**< End of the data, may be less than\n                                 buffer+buffer_size if the read function returned\n                                 less data than requested, e.g. for streams where\n                                 no more data has been received yet. */\n    void *opaque;           /**< A private pointer, passed to the read/write/seek/...\n                                 functions. */\n    int (*read_packet)(void *opaque, uint8_t *buf, int buf_size);\n    int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size);\n    int64_t (*seek)(void *opaque, int64_t offset, int whence);\n    int64_t pos;            /**< position in the file of the current buffer */\n    int eof_reached;        /**< true if was unable to read due to error or eof */\n    int error;              /**< contains the error code or 0 if no error happened */\n    int write_flag;         /**< true if open for writing */\n    int max_packet_size;\n    int min_packet_size;    /**< Try to buffer at least this amount of data\n                                 before flushing it. */\n    unsigned long checksum;\n    unsigned char *checksum_ptr;\n    unsigned long (*update_checksum)(unsigned long checksum, const uint8_t *buf, unsigned int size);\n    /**\n     * Pause or resume playback for network streaming protocols - e.g. MMS.\n     */\n    int (*read_pause)(void *opaque, int pause);\n    /**\n     * Seek to a given timestamp in stream with the specified stream_index.\n     * Needed for some network streaming protocols which don't support seeking\n     * to byte position.\n     */\n    int64_t (*read_seek)(void *opaque, int stream_index,\n                         int64_t timestamp, int flags);\n    /**\n     * A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.\n     */\n    int seekable;\n\n    /**\n     * avio_read and avio_write should if possible be satisfied directly\n     * instead of going through a buffer, and avio_seek will always\n     * call the underlying seek function directly.\n     */\n    int direct;\n\n    /**\n     * ',' separated list of allowed protocols.\n     */\n    const char *protocol_whitelist;\n\n    /**\n     * ',' separated list of disallowed protocols.\n     */\n    const char *protocol_blacklist;\n\n    /**\n     * A callback that is used instead of write_packet.\n     */\n    int (*write_data_type)(void *opaque, const uint8_t *buf, int buf_size,\n                           enum AVIODataMarkerType type, int64_t time);\n    /**\n     * If set, don't call write_data_type separately for AVIO_DATA_MARKER_BOUNDARY_POINT,\n     * but ignore them and treat them as AVIO_DATA_MARKER_UNKNOWN (to avoid needlessly\n     * small chunks of data returned from the callback).\n     */\n    int ignore_boundary_point;\n\n    /**\n     * Maximum reached position before a backward seek in the write buffer,\n     * used keeping track of already written data for a later flush.\n     */\n    unsigned char *buf_ptr_max;\n\n    /**\n     * Read-only statistic of bytes read for this AVIOContext.\n     */\n    int64_t bytes_read;\n\n    /**\n     * Read-only statistic of bytes written for this AVIOContext.\n     */\n    int64_t bytes_written;\n} AVIOContext;\n\n/**\n * Return the name of the protocol that will handle the passed URL.\n *\n * NULL is returned if no protocol could be found for the given URL.\n *\n * @return Name of the protocol or NULL.\n */\nconst char *avio_find_protocol_name(const char *url);\n\n/**\n * Return AVIO_FLAG_* access flags corresponding to the access permissions\n * of the resource in url, or a negative value corresponding to an\n * AVERROR code in case of failure. The returned access flags are\n * masked by the value in flags.\n *\n * @note This function is intrinsically unsafe, in the sense that the\n * checked resource may change its existence or permission status from\n * one call to another. Thus you should not trust the returned value,\n * unless you are sure that no other processes are accessing the\n * checked resource.\n */\nint avio_check(const char *url, int flags);\n\n/**\n * Open directory for reading.\n *\n * @param s       directory read context. Pointer to a NULL pointer must be passed.\n * @param url     directory to be listed.\n * @param options A dictionary filled with protocol-private options. On return\n *                this parameter will be destroyed and replaced with a dictionary\n *                containing options that were not found. May be NULL.\n * @return >=0 on success or negative on error.\n */\nint avio_open_dir(AVIODirContext **s, const char *url, AVDictionary **options);\n\n/**\n * Get next directory entry.\n *\n * Returned entry must be freed with avio_free_directory_entry(). In particular\n * it may outlive AVIODirContext.\n *\n * @param s         directory read context.\n * @param[out] next next entry or NULL when no more entries.\n * @return >=0 on success or negative on error. End of list is not considered an\n *             error.\n */\nint avio_read_dir(AVIODirContext *s, AVIODirEntry **next);\n\n/**\n * Close directory.\n *\n * @note Entries created using avio_read_dir() are not deleted and must be\n * freeded with avio_free_directory_entry().\n *\n * @param s         directory read context.\n * @return >=0 on success or negative on error.\n */\nint avio_close_dir(AVIODirContext **s);\n\n/**\n * Free entry allocated by avio_read_dir().\n *\n * @param entry entry to be freed.\n */\nvoid avio_free_directory_entry(AVIODirEntry **entry);\n\n/**\n * Allocate and initialize an AVIOContext for buffered I/O. It must be later\n * freed with avio_context_free().\n *\n * @param buffer Memory block for input/output operations via AVIOContext.\n *        The buffer must be allocated with av_malloc() and friends.\n *        It may be freed and replaced with a new buffer by libavformat.\n *        AVIOContext.buffer holds the buffer currently in use,\n *        which must be later freed with av_free().\n * @param buffer_size The buffer size is very important for performance.\n *        For protocols with fixed blocksize it should be set to this blocksize.\n *        For others a typical size is a cache page, e.g. 4kb.\n * @param write_flag Set to 1 if the buffer should be writable, 0 otherwise.\n * @param opaque An opaque pointer to user-specific data.\n * @param read_packet  A function for refilling the buffer, may be NULL.\n *                     For stream protocols, must never return 0 but rather\n *                     a proper AVERROR code.\n * @param write_packet A function for writing the buffer contents, may be NULL.\n *        The function may not change the input buffers content.\n * @param seek A function for seeking to specified byte position, may be NULL.\n *\n * @return Allocated AVIOContext or NULL on failure.\n */\nAVIOContext *avio_alloc_context(\n                  unsigned char *buffer,\n                  int buffer_size,\n                  int write_flag,\n                  void *opaque,\n                  int (*read_packet)(void *opaque, uint8_t *buf, int buf_size),\n                  int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size),\n                  int64_t (*seek)(void *opaque, int64_t offset, int whence));\n\n/**\n * Free the supplied IO context and everything associated with it.\n *\n * @param s Double pointer to the IO context. This function will write NULL\n * into s.\n */\nvoid avio_context_free(AVIOContext **s);\n\nvoid avio_w8(AVIOContext *s, int b);\nvoid avio_write(AVIOContext *s, const unsigned char *buf, int size);\nvoid avio_wl64(AVIOContext *s, uint64_t val);\nvoid avio_wb64(AVIOContext *s, uint64_t val);\nvoid avio_wl32(AVIOContext *s, unsigned int val);\nvoid avio_wb32(AVIOContext *s, unsigned int val);\nvoid avio_wl24(AVIOContext *s, unsigned int val);\nvoid avio_wb24(AVIOContext *s, unsigned int val);\nvoid avio_wl16(AVIOContext *s, unsigned int val);\nvoid avio_wb16(AVIOContext *s, unsigned int val);\n\n/**\n * Write a NULL-terminated string.\n * @return number of bytes written.\n */\nint avio_put_str(AVIOContext *s, const char *str);\n\n/**\n * Convert an UTF-8 string to UTF-16LE and write it.\n * @param s the AVIOContext\n * @param str NULL-terminated UTF-8 string\n *\n * @return number of bytes written.\n */\nint avio_put_str16le(AVIOContext *s, const char *str);\n\n/**\n * Convert an UTF-8 string to UTF-16BE and write it.\n * @param s the AVIOContext\n * @param str NULL-terminated UTF-8 string\n *\n * @return number of bytes written.\n */\nint avio_put_str16be(AVIOContext *s, const char *str);\n\n/**\n * Mark the written bytestream as a specific type.\n *\n * Zero-length ranges are omitted from the output.\n *\n * @param s    the AVIOContext\n * @param time the stream time the current bytestream pos corresponds to\n *             (in AV_TIME_BASE units), or AV_NOPTS_VALUE if unknown or not\n *             applicable\n * @param type the kind of data written starting at the current pos\n */\nvoid avio_write_marker(AVIOContext *s, int64_t time, enum AVIODataMarkerType type);\n\n/**\n * ORing this as the \"whence\" parameter to a seek function causes it to\n * return the filesize without seeking anywhere. Supporting this is optional.\n * If it is not supported then the seek function will return <0.\n */\n#define AVSEEK_SIZE 0x10000\n\n/**\n * Passing this flag as the \"whence\" parameter to a seek function causes it to\n * seek by any means (like reopening and linear reading) or other normally unreasonable\n * means that can be extremely slow.\n * This may be ignored by the seek code.\n */\n#define AVSEEK_FORCE 0x20000\n\n/**\n * fseek() equivalent for AVIOContext.\n * @return new position or AVERROR.\n */\nint64_t avio_seek(AVIOContext *s, int64_t offset, int whence);\n\n/**\n * Skip given number of bytes forward\n * @return new position or AVERROR.\n */\nint64_t avio_skip(AVIOContext *s, int64_t offset);\n\n/**\n * ftell() equivalent for AVIOContext.\n * @return position or AVERROR.\n */\nstatic av_always_inline int64_t avio_tell(AVIOContext *s)\n{\n    return avio_seek(s, 0, SEEK_CUR);\n}\n\n/**\n * Get the filesize.\n * @return filesize or AVERROR\n */\nint64_t avio_size(AVIOContext *s);\n\n/**\n * Similar to feof() but also returns nonzero on read errors.\n * @return non zero if and only if at end of file or a read error happened when reading.\n */\nint avio_feof(AVIOContext *s);\n\n/**\n * Writes a formatted string to the context taking a va_list.\n * @return number of bytes written, < 0 on error.\n */\nint avio_vprintf(AVIOContext *s, const char *fmt, va_list ap);\n\n/**\n * Writes a formatted string to the context.\n * @return number of bytes written, < 0 on error.\n */\nint avio_printf(AVIOContext *s, const char *fmt, ...) av_printf_format(2, 3);\n\n/**\n * Write a NULL terminated array of strings to the context.\n * Usually you don't need to use this function directly but its macro wrapper,\n * avio_print.\n */\nvoid avio_print_string_array(AVIOContext *s, const char * const strings[]);\n\n/**\n * Write strings (const char *) to the context.\n * This is a convenience macro around avio_print_string_array and it\n * automatically creates the string array from the variable argument list.\n * For simple string concatenations this function is more performant than using\n * avio_printf since it does not need a temporary buffer.\n */\n#define avio_print(s, ...) \\\n    avio_print_string_array(s, (const char*[]){__VA_ARGS__, NULL})\n\n/**\n * Force flushing of buffered data.\n *\n * For write streams, force the buffered data to be immediately written to the output,\n * without to wait to fill the internal buffer.\n *\n * For read streams, discard all currently buffered data, and advance the\n * reported file position to that of the underlying stream. This does not\n * read new data, and does not perform any seeks.\n */\nvoid avio_flush(AVIOContext *s);\n\n/**\n * Read size bytes from AVIOContext into buf.\n * @return number of bytes read or AVERROR\n */\nint avio_read(AVIOContext *s, unsigned char *buf, int size);\n\n/**\n * Read size bytes from AVIOContext into buf. Unlike avio_read(), this is allowed\n * to read fewer bytes than requested. The missing bytes can be read in the next\n * call. This always tries to read at least 1 byte.\n * Useful to reduce latency in certain cases.\n * @return number of bytes read or AVERROR\n */\nint avio_read_partial(AVIOContext *s, unsigned char *buf, int size);\n\n/**\n * @name Functions for reading from AVIOContext\n * @{\n *\n * @note return 0 if EOF, so you cannot use it if EOF handling is\n *       necessary\n */\nint          avio_r8  (AVIOContext *s);\nunsigned int avio_rl16(AVIOContext *s);\nunsigned int avio_rl24(AVIOContext *s);\nunsigned int avio_rl32(AVIOContext *s);\nuint64_t     avio_rl64(AVIOContext *s);\nunsigned int avio_rb16(AVIOContext *s);\nunsigned int avio_rb24(AVIOContext *s);\nunsigned int avio_rb32(AVIOContext *s);\nuint64_t     avio_rb64(AVIOContext *s);\n/**\n * @}\n */\n\n/**\n * Read a string from pb into buf. The reading will terminate when either\n * a NULL character was encountered, maxlen bytes have been read, or nothing\n * more can be read from pb. The result is guaranteed to be NULL-terminated, it\n * will be truncated if buf is too small.\n * Note that the string is not interpreted or validated in any way, it\n * might get truncated in the middle of a sequence for multi-byte encodings.\n *\n * @return number of bytes read (is always <= maxlen).\n * If reading ends on EOF or error, the return value will be one more than\n * bytes actually read.\n */\nint avio_get_str(AVIOContext *pb, int maxlen, char *buf, int buflen);\n\n/**\n * Read a UTF-16 string from pb and convert it to UTF-8.\n * The reading will terminate when either a null or invalid character was\n * encountered or maxlen bytes have been read.\n * @return number of bytes read (is always <= maxlen)\n */\nint avio_get_str16le(AVIOContext *pb, int maxlen, char *buf, int buflen);\nint avio_get_str16be(AVIOContext *pb, int maxlen, char *buf, int buflen);\n\n\n/**\n * @name URL open modes\n * The flags argument to avio_open must be one of the following\n * constants, optionally ORed with other flags.\n * @{\n */\n#define AVIO_FLAG_READ  1                                      /**< read-only */\n#define AVIO_FLAG_WRITE 2                                      /**< write-only */\n#define AVIO_FLAG_READ_WRITE (AVIO_FLAG_READ|AVIO_FLAG_WRITE)  /**< read-write pseudo flag */\n/**\n * @}\n */\n\n/**\n * Use non-blocking mode.\n * If this flag is set, operations on the context will return\n * AVERROR(EAGAIN) if they can not be performed immediately.\n * If this flag is not set, operations on the context will never return\n * AVERROR(EAGAIN).\n * Note that this flag does not affect the opening/connecting of the\n * context. Connecting a protocol will always block if necessary (e.g. on\n * network protocols) but never hang (e.g. on busy devices).\n * Warning: non-blocking protocols is work-in-progress; this flag may be\n * silently ignored.\n */\n#define AVIO_FLAG_NONBLOCK 8\n\n/**\n * Use direct mode.\n * avio_read and avio_write should if possible be satisfied directly\n * instead of going through a buffer, and avio_seek will always\n * call the underlying seek function directly.\n */\n#define AVIO_FLAG_DIRECT 0x8000\n\n/**\n * Create and initialize a AVIOContext for accessing the\n * resource indicated by url.\n * @note When the resource indicated by url has been opened in\n * read+write mode, the AVIOContext can be used only for writing.\n *\n * @param s Used to return the pointer to the created AVIOContext.\n * In case of failure the pointed to value is set to NULL.\n * @param url resource to access\n * @param flags flags which control how the resource indicated by url\n * is to be opened\n * @return >= 0 in case of success, a negative value corresponding to an\n * AVERROR code in case of failure\n */\nint avio_open(AVIOContext **s, const char *url, int flags);\n\n/**\n * Create and initialize a AVIOContext for accessing the\n * resource indicated by url.\n * @note When the resource indicated by url has been opened in\n * read+write mode, the AVIOContext can be used only for writing.\n *\n * @param s Used to return the pointer to the created AVIOContext.\n * In case of failure the pointed to value is set to NULL.\n * @param url resource to access\n * @param flags flags which control how the resource indicated by url\n * is to be opened\n * @param int_cb an interrupt callback to be used at the protocols level\n * @param options  A dictionary filled with protocol-private options. On return\n * this parameter will be destroyed and replaced with a dict containing options\n * that were not found. May be NULL.\n * @return >= 0 in case of success, a negative value corresponding to an\n * AVERROR code in case of failure\n */\nint avio_open2(AVIOContext **s, const char *url, int flags,\n               const AVIOInterruptCB *int_cb, AVDictionary **options);\n\n/**\n * Close the resource accessed by the AVIOContext s and free it.\n * This function can only be used if s was opened by avio_open().\n *\n * The internal buffer is automatically flushed before closing the\n * resource.\n *\n * @return 0 on success, an AVERROR < 0 on error.\n * @see avio_closep\n */\nint avio_close(AVIOContext *s);\n\n/**\n * Close the resource accessed by the AVIOContext *s, free it\n * and set the pointer pointing to it to NULL.\n * This function can only be used if s was opened by avio_open().\n *\n * The internal buffer is automatically flushed before closing the\n * resource.\n *\n * @return 0 on success, an AVERROR < 0 on error.\n * @see avio_close\n */\nint avio_closep(AVIOContext **s);\n\n\n/**\n * Open a write only memory stream.\n *\n * @param s new IO context\n * @return zero if no error.\n */\nint avio_open_dyn_buf(AVIOContext **s);\n\n/**\n * Return the written size and a pointer to the buffer.\n * The AVIOContext stream is left intact.\n * The buffer must NOT be freed.\n * No padding is added to the buffer.\n *\n * @param s IO context\n * @param pbuffer pointer to a byte buffer\n * @return the length of the byte buffer\n */\nint avio_get_dyn_buf(AVIOContext *s, uint8_t **pbuffer);\n\n/**\n * Return the written size and a pointer to the buffer. The buffer\n * must be freed with av_free().\n * Padding of AV_INPUT_BUFFER_PADDING_SIZE is added to the buffer.\n *\n * @param s IO context\n * @param pbuffer pointer to a byte buffer\n * @return the length of the byte buffer\n */\nint avio_close_dyn_buf(AVIOContext *s, uint8_t **pbuffer);\n\n/**\n * Iterate through names of available protocols.\n *\n * @param opaque A private pointer representing current protocol.\n *        It must be a pointer to NULL on first iteration and will\n *        be updated by successive calls to avio_enum_protocols.\n * @param output If set to 1, iterate over output protocols,\n *               otherwise over input protocols.\n *\n * @return A static string containing the name of current protocol or NULL\n */\nconst char *avio_enum_protocols(void **opaque, int output);\n\n/**\n * Get AVClass by names of available protocols.\n *\n * @return A AVClass of input protocol name or NULL\n */\nconst AVClass *avio_protocol_get_class(const char *name);\n\n/**\n * Pause and resume playing - only meaningful if using a network streaming\n * protocol (e.g. MMS).\n *\n * @param h     IO context from which to call the read_pause function pointer\n * @param pause 1 for pause, 0 for resume\n */\nint     avio_pause(AVIOContext *h, int pause);\n\n/**\n * Seek to a given timestamp relative to some component stream.\n * Only meaningful if using a network streaming protocol (e.g. MMS.).\n *\n * @param h IO context from which to call the seek function pointers\n * @param stream_index The stream index that the timestamp is relative to.\n *        If stream_index is (-1) the timestamp should be in AV_TIME_BASE\n *        units from the beginning of the presentation.\n *        If a stream_index >= 0 is used and the protocol does not support\n *        seeking based on component streams, the call will fail.\n * @param timestamp timestamp in AVStream.time_base units\n *        or if there is no stream specified then in AV_TIME_BASE units.\n * @param flags Optional combination of AVSEEK_FLAG_BACKWARD, AVSEEK_FLAG_BYTE\n *        and AVSEEK_FLAG_ANY. The protocol may silently ignore\n *        AVSEEK_FLAG_BACKWARD and AVSEEK_FLAG_ANY, but AVSEEK_FLAG_BYTE will\n *        fail if used and not supported.\n * @return >= 0 on success\n * @see AVInputFormat::read_seek\n */\nint64_t avio_seek_time(AVIOContext *h, int stream_index,\n                       int64_t timestamp, int flags);\n\n/* Avoid a warning. The header can not be included because it breaks c++. */\nstruct AVBPrint;\n\n/**\n * Read contents of h into print buffer, up to max_size bytes, or up to EOF.\n *\n * @return 0 for success (max_size bytes read or EOF reached), negative error\n * code otherwise\n */\nint avio_read_to_bprint(AVIOContext *h, struct AVBPrint *pb, size_t max_size);\n\n/**\n * Accept and allocate a client context on a server context.\n * @param  s the server context\n * @param  c the client context, must be unallocated\n * @return   >= 0 on success or a negative value corresponding\n *           to an AVERROR on failure\n */\nint avio_accept(AVIOContext *s, AVIOContext **c);\n\n/**\n * Perform one step of the protocol handshake to accept a new client.\n * This function must be called on a client returned by avio_accept() before\n * using it as a read/write context.\n * It is separate from avio_accept() because it may block.\n * A step of the handshake is defined by places where the application may\n * decide to change the proceedings.\n * For example, on a protocol with a request header and a reply header, each\n * one can constitute a step because the application may use the parameters\n * from the request to change parameters in the reply; or each individual\n * chunk of the request can constitute a step.\n * If the handshake is already finished, avio_handshake() does nothing and\n * returns 0 immediately.\n *\n * @param  c the client context to perform the handshake on\n * @return   0   on a complete and successful handshake\n *           > 0 if the handshake progressed, but is not complete\n *           < 0 for an AVERROR code\n */\nint avio_handshake(AVIOContext *c);\n#endif /* AVFORMAT_AVIO_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavformat/version.h",
    "content": "/*\n * Version macros.\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVFORMAT_VERSION_H\n#define AVFORMAT_VERSION_H\n\n/**\n * @file\n * @ingroup libavf\n * Libavformat version macros\n */\n\n#include \"libavutil/version.h\"\n\n#include \"version_major.h\"\n\n#define LIBAVFORMAT_VERSION_MINOR   3\n#define LIBAVFORMAT_VERSION_MICRO 100\n\n#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \\\n                                               LIBAVFORMAT_VERSION_MINOR, \\\n                                               LIBAVFORMAT_VERSION_MICRO)\n#define LIBAVFORMAT_VERSION     AV_VERSION(LIBAVFORMAT_VERSION_MAJOR,   \\\n                                           LIBAVFORMAT_VERSION_MINOR,   \\\n                                           LIBAVFORMAT_VERSION_MICRO)\n#define LIBAVFORMAT_BUILD       LIBAVFORMAT_VERSION_INT\n\n#define LIBAVFORMAT_IDENT       \"Lavf\" AV_STRINGIFY(LIBAVFORMAT_VERSION)\n\n#endif /* AVFORMAT_VERSION_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavformat/version_major.h",
    "content": "/*\n * Version macros.\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVFORMAT_VERSION_MAJOR_H\n#define AVFORMAT_VERSION_MAJOR_H\n\n/**\n * @file\n * @ingroup libavf\n * Libavformat version macros\n */\n\n// Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium)\n// Also please add any ticket numbers that you believe might be affected here\n#define LIBAVFORMAT_VERSION_MAJOR  62\n\n/**\n * FF_API_* defines may be placed below to indicate public API that will be\n * dropped at a future version bump. The defines themselves are not part of\n * the public API and may change, break or disappear at any time.\n *\n * @note, when bumping the major version it is recommended to manually\n * disable each FF_API_* in its own commit instead of disabling them all\n * at once through the bump. This improves the git bisect-ability of the change.\n *\n */\n#define FF_API_COMPUTE_PKT_FIELDS2      (LIBAVFORMAT_VERSION_MAJOR < 63)\n\n#define FF_API_INTERNAL_TIMING          (LIBAVFORMAT_VERSION_MAJOR < 63)\n\n#define FF_API_NO_DEFAULT_TLS_VERIFY    (LIBAVFORMAT_VERSION_MAJOR < 63)\n\n#define FF_API_R_FRAME_RATE            1\n\n#endif /* AVFORMAT_VERSION_MAJOR_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/adler32.h",
    "content": "/*\n * copyright (c) 2006 Mans Rullgard\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_adler32\n * Public header for Adler-32 hash function implementation.\n */\n\n#ifndef AVUTIL_ADLER32_H\n#define AVUTIL_ADLER32_H\n\n#include <stddef.h>\n#include <stdint.h>\n#include \"attributes.h\"\n\n/**\n * @defgroup lavu_adler32 Adler-32\n * @ingroup lavu_hash\n * Adler-32 hash function implementation.\n *\n * @{\n */\n\ntypedef uint32_t AVAdler;\n\n/**\n * Calculate the Adler32 checksum of a buffer.\n *\n * Passing the return value to a subsequent av_adler32_update() call\n * allows the checksum of multiple buffers to be calculated as though\n * they were concatenated.\n *\n * @param adler initial checksum value\n * @param buf   pointer to input buffer\n * @param len   size of input buffer\n * @return      updated checksum\n */\nAVAdler av_adler32_update(AVAdler adler, const uint8_t *buf,\n                          size_t len) av_pure;\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_ADLER32_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/aes.h",
    "content": "/*\n * copyright (c) 2007 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_AES_H\n#define AVUTIL_AES_H\n\n#include <stdint.h>\n\n#include \"attributes.h\"\n\n/**\n * @defgroup lavu_aes AES\n * @ingroup lavu_crypto\n * @{\n */\n\nextern const int av_aes_size;\n\nstruct AVAES;\n\n/**\n * Allocate an AVAES context.\n */\nstruct AVAES *av_aes_alloc(void);\n\n/**\n * Initialize an AVAES context.\n *\n * @param a The AVAES context\n * @param key Pointer to the key\n * @param key_bits 128, 192 or 256\n * @param decrypt 0 for encryption, 1 for decryption\n */\nint av_aes_init(struct AVAES *a, const uint8_t *key, int key_bits, int decrypt);\n\n/**\n * Encrypt or decrypt a buffer using a previously initialized context.\n *\n * @param a The AVAES context\n * @param dst destination array, can be equal to src\n * @param src source array, can be equal to dst\n * @param count number of 16 byte blocks\n * @param iv initialization vector for CBC mode, if NULL then ECB will be used\n * @param decrypt 0 for encryption, 1 for decryption\n */\nvoid av_aes_crypt(struct AVAES *a, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_AES_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/aes_ctr.h",
    "content": "/*\n * AES-CTR cipher\n * Copyright (c) 2015 Eran Kornblau <erankor at gmail dot com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_AES_CTR_H\n#define AVUTIL_AES_CTR_H\n\n/**\n * @defgroup lavu_aes_ctr AES-CTR\n * @ingroup lavu_crypto\n * @{\n */\n\n#include <stdint.h>\n\n#include \"attributes.h\"\n\n#define AES_CTR_KEY_SIZE (16)\n#define AES_CTR_IV_SIZE (8)\n\nstruct AVAESCTR;\n\n/**\n * Allocate an AVAESCTR context.\n */\nstruct AVAESCTR *av_aes_ctr_alloc(void);\n\n/**\n * Initialize an AVAESCTR context.\n *\n * @param a The AVAESCTR context to initialize\n * @param key encryption key, must have a length of AES_CTR_KEY_SIZE\n */\nint av_aes_ctr_init(struct AVAESCTR *a, const uint8_t *key);\n\n/**\n * Release an AVAESCTR context.\n *\n * @param a The AVAESCTR context\n */\nvoid av_aes_ctr_free(struct AVAESCTR *a);\n\n/**\n * Process a buffer using a previously initialized context.\n *\n * @param a The AVAESCTR context\n * @param dst destination array, can be equal to src\n * @param src source array, can be equal to dst\n * @param size the size of src and dst\n */\nvoid av_aes_ctr_crypt(struct AVAESCTR *a, uint8_t *dst, const uint8_t *src, int size);\n\n/**\n * Get the current iv\n */\nconst uint8_t* av_aes_ctr_get_iv(struct AVAESCTR *a);\n\n/**\n * Generate a random iv\n */\nvoid av_aes_ctr_set_random_iv(struct AVAESCTR *a);\n\n/**\n * Forcefully change the 8-byte iv\n */\nvoid av_aes_ctr_set_iv(struct AVAESCTR *a, const uint8_t* iv);\n\n/**\n * Forcefully change the \"full\" 16-byte iv, including the counter\n */\nvoid av_aes_ctr_set_full_iv(struct AVAESCTR *a, const uint8_t* iv);\n\n/**\n * Increment the top 64 bit of the iv (performed after each frame)\n */\nvoid av_aes_ctr_increment_iv(struct AVAESCTR *a);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_AES_CTR_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/ambient_viewing_environment.h",
    "content": "/*\n * Copyright (c) 2023 Jan Ekström <jeebjp@gmail.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_AMBIENT_VIEWING_ENVIRONMENT_H\n#define AVUTIL_AMBIENT_VIEWING_ENVIRONMENT_H\n\n#include <stddef.h>\n#include \"frame.h\"\n#include \"rational.h\"\n\n/**\n * Ambient viewing environment metadata as defined by H.274. The values are\n * saved in AVRationals so that they keep their exactness, while allowing for\n * easy access to a double value with f.ex. av_q2d.\n *\n * @note sizeof(AVAmbientViewingEnvironment) is not part of the public ABI, and\n *       it must be allocated using av_ambient_viewing_environment_alloc.\n */\ntypedef struct AVAmbientViewingEnvironment {\n    /**\n     * Environmental illuminance of the ambient viewing environment in lux.\n     */\n    AVRational ambient_illuminance;\n\n    /**\n     * Normalized x chromaticity coordinate of the environmental ambient light\n     * in the nominal viewing environment according to the CIE 1931 definition\n     * of x and y as specified in ISO/CIE 11664-1.\n     */\n    AVRational ambient_light_x;\n\n    /**\n     * Normalized y chromaticity coordinate of the environmental ambient light\n     * in the nominal viewing environment according to the CIE 1931 definition\n     * of x and y as specified in ISO/CIE 11664-1.\n     */\n    AVRational ambient_light_y;\n} AVAmbientViewingEnvironment;\n\n/**\n * Allocate an AVAmbientViewingEnvironment structure.\n *\n * @return the newly allocated struct or NULL on failure\n */\nAVAmbientViewingEnvironment *av_ambient_viewing_environment_alloc(size_t *size);\n\n/**\n * Allocate and add an AVAmbientViewingEnvironment structure to an existing\n * AVFrame as side data.\n *\n * @return the newly allocated struct, or NULL on failure\n */\nAVAmbientViewingEnvironment *av_ambient_viewing_environment_create_side_data(AVFrame *frame);\n\n#endif /* AVUTIL_AMBIENT_VIEWING_ENVIRONMENT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/attributes.h",
    "content": "/*\n * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * Macro definitions for various function/variable attributes\n */\n\n#ifndef AVUTIL_ATTRIBUTES_H\n#define AVUTIL_ATTRIBUTES_H\n\n#ifdef __GNUC__\n#    define AV_GCC_VERSION_AT_LEAST(x,y) (__GNUC__ > (x) || __GNUC__ == (x) && __GNUC_MINOR__ >= (y))\n#    define AV_GCC_VERSION_AT_MOST(x,y)  (__GNUC__ < (x) || __GNUC__ == (x) && __GNUC_MINOR__ <= (y))\n#else\n#    define AV_GCC_VERSION_AT_LEAST(x,y) 0\n#    define AV_GCC_VERSION_AT_MOST(x,y)  0\n#endif\n\n#ifdef __has_builtin\n#    define AV_HAS_BUILTIN(x) __has_builtin(x)\n#else\n#    define AV_HAS_BUILTIN(x) 0\n#endif\n\n#ifndef av_always_inline\n#if AV_GCC_VERSION_AT_LEAST(3,1)\n#    define av_always_inline __attribute__((always_inline)) inline\n#elif defined(_MSC_VER)\n#    define av_always_inline __forceinline\n#else\n#    define av_always_inline inline\n#endif\n#endif\n\n#ifndef av_extern_inline\n#if defined(__ICL) && __ICL >= 1210 || defined(__GNUC_STDC_INLINE__)\n#    define av_extern_inline extern inline\n#else\n#    define av_extern_inline inline\n#endif\n#endif\n\n#if AV_GCC_VERSION_AT_LEAST(3,4)\n#    define av_warn_unused_result __attribute__((warn_unused_result))\n#else\n#    define av_warn_unused_result\n#endif\n\n#if AV_GCC_VERSION_AT_LEAST(3,1)\n#    define av_noinline __attribute__((noinline))\n#elif defined(_MSC_VER)\n#    define av_noinline __declspec(noinline)\n#else\n#    define av_noinline\n#endif\n\n#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__)\n#    define av_pure __attribute__((pure))\n#else\n#    define av_pure\n#endif\n\n#if AV_GCC_VERSION_AT_LEAST(2,6) || defined(__clang__)\n#    define av_const __attribute__((const))\n#else\n#    define av_const\n#endif\n\n#if AV_GCC_VERSION_AT_LEAST(4,3) || defined(__clang__)\n#    define av_cold __attribute__((cold))\n#else\n#    define av_cold\n#endif\n\n#if AV_GCC_VERSION_AT_LEAST(4,1) && !defined(__llvm__)\n#    define av_flatten __attribute__((flatten))\n#else\n#    define av_flatten\n#endif\n\n#if AV_GCC_VERSION_AT_LEAST(3,1)\n#    define attribute_deprecated __attribute__((deprecated))\n#elif defined(_MSC_VER)\n#    define attribute_deprecated __declspec(deprecated)\n#else\n#    define attribute_deprecated\n#endif\n\n/**\n * Disable warnings about deprecated features\n * This is useful for sections of code kept for backward compatibility and\n * scheduled for removal.\n */\n#ifndef AV_NOWARN_DEPRECATED\n#if AV_GCC_VERSION_AT_LEAST(4,6) || defined(__clang__)\n#    define AV_NOWARN_DEPRECATED(code) \\\n        _Pragma(\"GCC diagnostic push\") \\\n        _Pragma(\"GCC diagnostic ignored \\\"-Wdeprecated-declarations\\\"\") \\\n        code \\\n        _Pragma(\"GCC diagnostic pop\")\n#elif defined(_MSC_VER)\n#    define AV_NOWARN_DEPRECATED(code) \\\n        __pragma(warning(push)) \\\n        __pragma(warning(disable : 4996)) \\\n        code; \\\n        __pragma(warning(pop))\n#else\n#    define AV_NOWARN_DEPRECATED(code) code\n#endif\n#endif\n\n#if defined(__GNUC__) || defined(__clang__)\n#    define av_unused __attribute__((unused))\n#else\n#    define av_unused\n#endif\n\n/**\n * Mark a variable as used and prevent the compiler from optimizing it\n * away.  This is useful for variables accessed only from inline\n * assembler without the compiler being aware.\n */\n#if AV_GCC_VERSION_AT_LEAST(3,1) || defined(__clang__)\n#    define av_used __attribute__((used))\n#else\n#    define av_used\n#endif\n\n#if AV_GCC_VERSION_AT_LEAST(3,3) || defined(__clang__)\n#   define av_alias __attribute__((may_alias))\n#else\n#   define av_alias\n#endif\n\n#if (defined(__GNUC__) || defined(__clang__)) && !defined(__INTEL_COMPILER)\n#    define av_uninit(x) x=x\n#else\n#    define av_uninit(x) x\n#endif\n\n#if defined(__GNUC__) || defined(__clang__)\n#    define av_builtin_constant_p __builtin_constant_p\n#    define av_printf_format(fmtpos, attrpos) __attribute__((__format__(__printf__, fmtpos, attrpos)))\n#    define av_scanf_format(fmtpos, attrpos) __attribute__((__format__(__scanf__, fmtpos, attrpos)))\n#else\n#    define av_builtin_constant_p(x) 0\n#    define av_printf_format(fmtpos, attrpos)\n#    define av_scanf_format(fmtpos, attrpos)\n#endif\n\n#if AV_GCC_VERSION_AT_LEAST(2,5) || defined(__clang__)\n#    define av_noreturn __attribute__((noreturn))\n#else\n#    define av_noreturn\n#endif\n\n#endif /* AVUTIL_ATTRIBUTES_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/audio_fifo.h",
    "content": "/*\n * Audio FIFO\n * Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * Audio FIFO Buffer\n */\n\n#ifndef AVUTIL_AUDIO_FIFO_H\n#define AVUTIL_AUDIO_FIFO_H\n\n#include \"attributes.h\"\n#include \"samplefmt.h\"\n\n/**\n * @addtogroup lavu_audio\n * @{\n *\n * @defgroup lavu_audiofifo Audio FIFO Buffer\n * @{\n */\n\n/**\n * Context for an Audio FIFO Buffer.\n *\n * - Operates at the sample level rather than the byte level.\n * - Supports multiple channels with either planar or packed sample format.\n * - Automatic reallocation when writing to a full buffer.\n */\ntypedef struct AVAudioFifo AVAudioFifo;\n\n/**\n * Free an AVAudioFifo.\n *\n * @param af  AVAudioFifo to free\n */\nvoid av_audio_fifo_free(AVAudioFifo *af);\n\n/**\n * Allocate an AVAudioFifo.\n *\n * @param sample_fmt  sample format\n * @param channels    number of channels\n * @param nb_samples  initial allocation size, in samples\n * @return            newly allocated AVAudioFifo, or NULL on error\n */\nAVAudioFifo *av_audio_fifo_alloc(enum AVSampleFormat sample_fmt, int channels,\n                                 int nb_samples);\n\n/**\n * Reallocate an AVAudioFifo.\n *\n * @param af          AVAudioFifo to reallocate\n * @param nb_samples  new allocation size, in samples\n * @return            0 if OK, or negative AVERROR code on failure\n */\nav_warn_unused_result\nint av_audio_fifo_realloc(AVAudioFifo *af, int nb_samples);\n\n/**\n * Write data to an AVAudioFifo.\n *\n * The AVAudioFifo will be reallocated automatically if the available space\n * is less than nb_samples.\n *\n * @see enum AVSampleFormat\n * The documentation for AVSampleFormat describes the data layout.\n *\n * @param af          AVAudioFifo to write to\n * @param data        audio data plane pointers\n * @param nb_samples  number of samples to write\n * @return            number of samples actually written, or negative AVERROR\n *                    code on failure. If successful, the number of samples\n *                    actually written will always be nb_samples.\n */\nint av_audio_fifo_write(AVAudioFifo *af, void * const *data, int nb_samples);\n\n/**\n * Peek data from an AVAudioFifo.\n *\n * @see enum AVSampleFormat\n * The documentation for AVSampleFormat describes the data layout.\n *\n * @param af          AVAudioFifo to read from\n * @param data        audio data plane pointers\n * @param nb_samples  number of samples to peek\n * @return            number of samples actually peek, or negative AVERROR code\n *                    on failure. The number of samples actually peek will not\n *                    be greater than nb_samples, and will only be less than\n *                    nb_samples if av_audio_fifo_size is less than nb_samples.\n */\nint av_audio_fifo_peek(const AVAudioFifo *af, void * const *data, int nb_samples);\n\n/**\n * Peek data from an AVAudioFifo.\n *\n * @see enum AVSampleFormat\n * The documentation for AVSampleFormat describes the data layout.\n *\n * @param af          AVAudioFifo to read from\n * @param data        audio data plane pointers\n * @param nb_samples  number of samples to peek\n * @param offset      offset from current read position\n * @return            number of samples actually peek, or negative AVERROR code\n *                    on failure. The number of samples actually peek will not\n *                    be greater than nb_samples, and will only be less than\n *                    nb_samples if av_audio_fifo_size is less than nb_samples.\n */\nint av_audio_fifo_peek_at(const AVAudioFifo *af, void * const *data,\n                          int nb_samples, int offset);\n\n/**\n * Read data from an AVAudioFifo.\n *\n * @see enum AVSampleFormat\n * The documentation for AVSampleFormat describes the data layout.\n *\n * @param af          AVAudioFifo to read from\n * @param data        audio data plane pointers\n * @param nb_samples  number of samples to read\n * @return            number of samples actually read, or negative AVERROR code\n *                    on failure. The number of samples actually read will not\n *                    be greater than nb_samples, and will only be less than\n *                    nb_samples if av_audio_fifo_size is less than nb_samples.\n */\nint av_audio_fifo_read(AVAudioFifo *af, void * const *data, int nb_samples);\n\n/**\n * Drain data from an AVAudioFifo.\n *\n * Removes the data without reading it.\n *\n * @param af          AVAudioFifo to drain\n * @param nb_samples  number of samples to drain\n * @return            0 if OK, or negative AVERROR code on failure\n */\nint av_audio_fifo_drain(AVAudioFifo *af, int nb_samples);\n\n/**\n * Reset the AVAudioFifo buffer.\n *\n * This empties all data in the buffer.\n *\n * @param af  AVAudioFifo to reset\n */\nvoid av_audio_fifo_reset(AVAudioFifo *af);\n\n/**\n * Get the current number of samples in the AVAudioFifo available for reading.\n *\n * @param af  the AVAudioFifo to query\n * @return    number of samples available for reading\n */\nint av_audio_fifo_size(AVAudioFifo *af);\n\n/**\n * Get the current number of samples in the AVAudioFifo available for writing.\n *\n * @param af  the AVAudioFifo to query\n * @return    number of samples available for writing\n */\nint av_audio_fifo_space(AVAudioFifo *af);\n\n/**\n * @}\n * @}\n */\n\n#endif /* AVUTIL_AUDIO_FIFO_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/avassert.h",
    "content": "/*\n * copyright (c) 2010 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * simple assert() macros that are a bit more flexible than ISO C assert().\n * @author Michael Niedermayer <michaelni@gmx.at>\n */\n\n#ifndef AVUTIL_AVASSERT_H\n#define AVUTIL_AVASSERT_H\n\n#include <stdlib.h>\n#ifdef HAVE_AV_CONFIG_H\n#   include \"config.h\"\n#endif\n#include \"attributes.h\"\n#include \"log.h\"\n#include \"macros.h\"\n\n/**\n * assert() equivalent, that is always enabled.\n */\n#define av_assert0(cond) do {                                           \\\n    if (!(cond)) {                                                      \\\n        av_log(NULL, AV_LOG_PANIC, \"Assertion %s failed at %s:%d\\n\",    \\\n               AV_STRINGIFY(cond), __FILE__, __LINE__);                 \\\n        abort();                                                        \\\n    }                                                                   \\\n} while (0)\n\n\n/**\n * assert() equivalent, that does not lie in speed critical code.\n * These asserts() thus can be enabled without fearing speed loss.\n */\n#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 0\n#define av_assert1(cond) av_assert0(cond)\n#else\n#define av_assert1(cond) ((void)0)\n#endif\n\n\n/**\n * assert() equivalent, that does lie in speed critical code.\n */\n#if defined(ASSERT_LEVEL) && ASSERT_LEVEL > 1\n#define av_assert2(cond) av_assert0(cond)\n#define av_assert2_fpu() av_assert0_fpu()\n#else\n#define av_assert2(cond) ((void)0)\n#define av_assert2_fpu() ((void)0)\n#endif\n\n/**\n * Assert that floating point operations can be executed.\n *\n * This will av_assert0() that the cpu is not in MMX state on X86\n */\nvoid av_assert0_fpu(void);\n\n/**\n * Asserts that are used as compiler optimization hints depending\n * upon ASSERT_LEVEL and NBDEBUG.\n *\n * Undefined behaviour occurs if execution reaches a point marked\n * with av_unreachable() or if a condition used with av_assume()\n * is false.\n *\n * The condition used with av_assume() should not have side-effects\n * and should be visible to the compiler.\n */\n#if defined(ASSERT_LEVEL) ? ASSERT_LEVEL > 0 : !defined(HAVE_AV_CONFIG_H) && !defined(NDEBUG)\n#define av_unreachable(msg)                                             \\\ndo {                                                                    \\\n    av_log(NULL, AV_LOG_PANIC,                                          \\\n           \"Reached supposedly unreachable code at %s:%d: %s\\n\",        \\\n           __FILE__, __LINE__, msg);                                    \\\n    abort();                                                            \\\n} while (0)\n#define av_assume(cond) av_assert0(cond)\n#else\n#if AV_GCC_VERSION_AT_LEAST(4, 5) || AV_HAS_BUILTIN(__builtin_unreachable)\n#define av_unreachable(msg) __builtin_unreachable()\n#elif  defined(_MSC_VER)\n#define av_unreachable(msg) __assume(0)\n#elif __STDC_VERSION__ >= 202311L\n#include <stddef.h>\n#define av_unreachable(msg) unreachable()\n#else\n#define av_unreachable(msg) ((void)0)\n#endif\n\n#if AV_HAS_BUILTIN(__builtin_assume)\n#define av_assume(cond) __builtin_assume(cond)\n#elif defined(_MSC_VER)\n#define av_assume(cond) __assume(cond)\n#else\n#define av_assume(cond) do { \\\n    if (!(cond))             \\\n        av_unreachable();    \\\n} while (0)\n#endif\n#endif\n\n#endif /* AVUTIL_AVASSERT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/avconfig.h",
    "content": "/* Generated by ffmpeg configure */\n#ifndef AVUTIL_AVCONFIG_H\n#define AVUTIL_AVCONFIG_H\n#define AV_HAVE_BIGENDIAN 0\n#define AV_HAVE_FAST_UNALIGNED 1\n#endif /* AVUTIL_AVCONFIG_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/avstring.h",
    "content": "/*\n * Copyright (c) 2007 Mans Rullgard\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_AVSTRING_H\n#define AVUTIL_AVSTRING_H\n\n#include <stddef.h>\n#include <stdint.h>\n#include \"attributes.h\"\n\n/**\n * @addtogroup lavu_string\n * @{\n */\n\n/**\n * Return non-zero if pfx is a prefix of str. If it is, *ptr is set to\n * the address of the first character in str after the prefix.\n *\n * @param str input string\n * @param pfx prefix to test\n * @param ptr updated if the prefix is matched inside str\n * @return non-zero if the prefix matches, zero otherwise\n */\nint av_strstart(const char *str, const char *pfx, const char **ptr);\n\n/**\n * Return non-zero if pfx is a prefix of str independent of case. If\n * it is, *ptr is set to the address of the first character in str\n * after the prefix.\n *\n * @param str input string\n * @param pfx prefix to test\n * @param ptr updated if the prefix is matched inside str\n * @return non-zero if the prefix matches, zero otherwise\n */\nint av_stristart(const char *str, const char *pfx, const char **ptr);\n\n/**\n * Locate the first case-independent occurrence in the string haystack\n * of the string needle.  A zero-length string needle is considered to\n * match at the start of haystack.\n *\n * This function is a case-insensitive version of the standard strstr().\n *\n * @param haystack string to search in\n * @param needle   string to search for\n * @return         pointer to the located match within haystack\n *                 or a null pointer if no match\n */\nchar *av_stristr(const char *haystack, const char *needle);\n\n/**\n * Locate the first occurrence of the string needle in the string haystack\n * where not more than hay_length characters are searched. A zero-length\n * string needle is considered to match at the start of haystack.\n *\n * This function is a length-limited version of the standard strstr().\n *\n * @param haystack   string to search in\n * @param needle     string to search for\n * @param hay_length length of string to search in\n * @return           pointer to the located match within haystack\n *                   or a null pointer if no match\n */\nchar *av_strnstr(const char *haystack, const char *needle, size_t hay_length);\n\n/**\n * Copy the string src to dst, but no more than size - 1 bytes, and\n * null-terminate dst.\n *\n * This function is the same as BSD strlcpy().\n *\n * @param dst destination buffer\n * @param src source string\n * @param size size of destination buffer\n * @return the length of src\n *\n * @warning since the return value is the length of src, src absolutely\n * _must_ be a properly 0-terminated string, otherwise this will read beyond\n * the end of the buffer and possibly crash.\n */\nsize_t av_strlcpy(char *dst, const char *src, size_t size);\n\n/**\n * Append the string src to the string dst, but to a total length of\n * no more than size - 1 bytes, and null-terminate dst.\n *\n * This function is similar to BSD strlcat(), but differs when\n * size <= strlen(dst).\n *\n * @param dst destination buffer\n * @param src source string\n * @param size size of destination buffer\n * @return the total length of src and dst\n *\n * @warning since the return value use the length of src and dst, these\n * absolutely _must_ be a properly 0-terminated strings, otherwise this\n * will read beyond the end of the buffer and possibly crash.\n */\nsize_t av_strlcat(char *dst, const char *src, size_t size);\n\n/**\n * Append output to a string, according to a format. Never write out of\n * the destination buffer, and always put a terminating 0 within\n * the buffer.\n * @param dst destination buffer (string to which the output is\n *  appended)\n * @param size total size of the destination buffer\n * @param fmt printf-compatible format string, specifying how the\n *  following parameters are used\n * @return the length of the string that would have been generated\n *  if enough space had been available\n */\nsize_t av_strlcatf(char *dst, size_t size, const char *fmt, ...) av_printf_format(3, 4);\n\n/**\n * Get the count of continuous non zero chars starting from the beginning.\n *\n * @param s   the string whose length to count\n * @param len maximum number of characters to check in the string, that\n *            is the maximum value which is returned by the function\n */\nstatic inline size_t av_strnlen(const char *s, size_t len)\n{\n    size_t i;\n    for (i = 0; i < len && s[i]; i++)\n        ;\n    return i;\n}\n\n/**\n * Print arguments following specified format into a large enough auto\n * allocated buffer. It is similar to GNU asprintf().\n * @param fmt printf-compatible format string, specifying how the\n *            following parameters are used.\n * @return the allocated string\n * @note You have to free the string yourself with av_free().\n */\nchar *av_asprintf(const char *fmt, ...) av_printf_format(1, 2);\n\n/**\n * Unescape the given string until a non escaped terminating char,\n * and return the token corresponding to the unescaped string.\n *\n * The normal \\ and ' escaping is supported. Leading and trailing\n * whitespaces are removed, unless they are escaped with '\\' or are\n * enclosed between ''.\n *\n * @param buf the buffer to parse, buf will be updated to point to the\n * terminating char\n * @param term a 0-terminated list of terminating chars\n * @return the malloced unescaped string, which must be av_freed by\n * the user, NULL in case of allocation failure\n */\nchar *av_get_token(const char **buf, const char *term);\n\n/**\n * Split the string into several tokens which can be accessed by\n * successive calls to av_strtok().\n *\n * A token is defined as a sequence of characters not belonging to the\n * set specified in delim.\n *\n * On the first call to av_strtok(), s should point to the string to\n * parse, and the value of saveptr is ignored. In subsequent calls, s\n * should be NULL, and saveptr should be unchanged since the previous\n * call.\n *\n * This function is similar to strtok_r() defined in POSIX.1.\n *\n * @param s the string to parse, may be NULL\n * @param delim 0-terminated list of token delimiters, must be non-NULL\n * @param saveptr user-provided pointer which points to stored\n * information necessary for av_strtok() to continue scanning the same\n * string. saveptr is updated to point to the next character after the\n * first delimiter found, or to NULL if the string was terminated\n * @return the found token, or NULL when no token is found\n */\nchar *av_strtok(char *s, const char *delim, char **saveptr);\n\n/**\n * Locale-independent conversion of ASCII isdigit.\n */\nstatic inline av_const int av_isdigit(int c)\n{\n    return c >= '0' && c <= '9';\n}\n\n/**\n * Locale-independent conversion of ASCII isgraph.\n */\nstatic inline av_const int av_isgraph(int c)\n{\n    return c > 32 && c < 127;\n}\n\n/**\n * Locale-independent conversion of ASCII isspace.\n */\nstatic inline av_const int av_isspace(int c)\n{\n    return c == ' ' || c == '\\f' || c == '\\n' || c == '\\r' || c == '\\t' ||\n           c == '\\v';\n}\n\n/**\n * Locale-independent conversion of ASCII characters to uppercase.\n */\nstatic inline av_const int av_toupper(int c)\n{\n    if (c >= 'a' && c <= 'z')\n        c ^= 0x20;\n    return c;\n}\n\n/**\n * Locale-independent conversion of ASCII characters to lowercase.\n */\nstatic inline av_const int av_tolower(int c)\n{\n    if (c >= 'A' && c <= 'Z')\n        c ^= 0x20;\n    return c;\n}\n\n/**\n * Locale-independent conversion of ASCII isxdigit.\n */\nstatic inline av_const int av_isxdigit(int c)\n{\n    c = av_tolower(c);\n    return av_isdigit(c) || (c >= 'a' && c <= 'f');\n}\n\n/**\n * Locale-independent case-insensitive compare.\n * @note This means only ASCII-range characters are case-insensitive\n */\nint av_strcasecmp(const char *a, const char *b);\n\n/**\n * Locale-independent case-insensitive compare.\n * @note This means only ASCII-range characters are case-insensitive\n */\nint av_strncasecmp(const char *a, const char *b, size_t n);\n\n/**\n * Locale-independent strings replace.\n * @note This means only ASCII-range characters are replaced.\n */\nchar *av_strireplace(const char *str, const char *from, const char *to);\n\n/**\n * Thread safe basename.\n * @param path the string to parse, on DOS both \\ and / are considered separators.\n * @return pointer to the basename substring.\n * If path does not contain a slash, the function returns a copy of path.\n * If path is a NULL pointer or points to an empty string, a pointer\n * to a string \".\" is returned.\n */\nconst char *av_basename(const char *path);\n\n/**\n * Thread safe dirname.\n * @param path the string to parse, on DOS both \\ and / are considered separators.\n * @return A pointer to a string that's the parent directory of path.\n * If path is a NULL pointer or points to an empty string, a pointer\n * to a string \".\" is returned.\n * @note the function may modify the contents of the path, so copies should be passed.\n */\nconst char *av_dirname(char *path);\n\n/**\n * Match instances of a name in a comma-separated list of names.\n * List entries are checked from the start to the end of the names list,\n * the first match ends further processing. If an entry prefixed with '-'\n * matches, then 0 is returned. The \"ALL\" list entry is considered to\n * match all names.\n *\n * @param name  Name to look for.\n * @param names List of names.\n * @return 1 on match, 0 otherwise.\n */\nint av_match_name(const char *name, const char *names);\n\n/**\n * Append path component to the existing path.\n * Path separator '/' is placed between when needed.\n * Resulting string have to be freed with av_free().\n * @param path      base path\n * @param component component to be appended\n * @return new path or NULL on error.\n */\nchar *av_append_path_component(const char *path, const char *component);\n\nenum AVEscapeMode {\n    AV_ESCAPE_MODE_AUTO,      ///< Use auto-selected escaping mode.\n    AV_ESCAPE_MODE_BACKSLASH, ///< Use backslash escaping.\n    AV_ESCAPE_MODE_QUOTE,     ///< Use single-quote escaping.\n    AV_ESCAPE_MODE_XML,       ///< Use XML non-markup character data escaping.\n};\n\n/**\n * Consider spaces special and escape them even in the middle of the\n * string.\n *\n * This is equivalent to adding the whitespace characters to the special\n * characters lists, except it is guaranteed to use the exact same list\n * of whitespace characters as the rest of libavutil.\n */\n#define AV_ESCAPE_FLAG_WHITESPACE (1 << 0)\n\n/**\n * Escape only specified special characters.\n * Without this flag, escape also any characters that may be considered\n * special by av_get_token(), such as the single quote.\n */\n#define AV_ESCAPE_FLAG_STRICT (1 << 1)\n\n/**\n * Within AV_ESCAPE_MODE_XML, additionally escape single quotes for single\n * quoted attributes.\n */\n#define AV_ESCAPE_FLAG_XML_SINGLE_QUOTES (1 << 2)\n\n/**\n * Within AV_ESCAPE_MODE_XML, additionally escape double quotes for double\n * quoted attributes.\n */\n#define AV_ESCAPE_FLAG_XML_DOUBLE_QUOTES (1 << 3)\n\n\n/**\n * Escape string in src, and put the escaped string in an allocated\n * string in *dst, which must be freed with av_free().\n *\n * @param dst           pointer where an allocated string is put\n * @param src           string to escape, must be non-NULL\n * @param special_chars string containing the special characters which\n *                      need to be escaped, can be NULL\n * @param mode          escape mode to employ, see AV_ESCAPE_MODE_* macros.\n *                      Any unknown value for mode will be considered equivalent to\n *                      AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without\n *                      notice.\n * @param flags         flags which control how to escape, see AV_ESCAPE_FLAG_ macros\n * @return the length of the allocated string, or a negative error code in case of error\n * @see av_bprint_escape()\n */\nav_warn_unused_result\nint av_escape(char **dst, const char *src, const char *special_chars,\n              enum AVEscapeMode mode, int flags);\n\n#define AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES          1 ///< accept codepoints over 0x10FFFF\n#define AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS             2 ///< accept non-characters - 0xFFFE and 0xFFFF\n#define AV_UTF8_FLAG_ACCEPT_SURROGATES                 4 ///< accept UTF-16 surrogates codes\n#define AV_UTF8_FLAG_EXCLUDE_XML_INVALID_CONTROL_CODES 8 ///< exclude control codes not accepted by XML\n\n#define AV_UTF8_FLAG_ACCEPT_ALL \\\n    AV_UTF8_FLAG_ACCEPT_INVALID_BIG_CODES|AV_UTF8_FLAG_ACCEPT_NON_CHARACTERS|AV_UTF8_FLAG_ACCEPT_SURROGATES\n\n/**\n * Read and decode a single UTF-8 code point (character) from the\n * buffer in *buf, and update *buf to point to the next byte to\n * decode.\n *\n * In case of an invalid byte sequence, the pointer will be updated to\n * the next byte after the invalid sequence and the function will\n * return an error code.\n *\n * Depending on the specified flags, the function will also fail in\n * case the decoded code point does not belong to a valid range.\n *\n * @note For speed-relevant code a carefully implemented use of\n * GET_UTF8() may be preferred.\n *\n * @param codep   pointer used to return the parsed code in case of success.\n *                The value in *codep is set even in case the range check fails.\n * @param bufp    pointer to the address the first byte of the sequence\n *                to decode, updated by the function to point to the\n *                byte next after the decoded sequence\n * @param buf_end pointer to the end of the buffer, points to the next\n *                byte past the last in the buffer. This is used to\n *                avoid buffer overreads (in case of an unfinished\n *                UTF-8 sequence towards the end of the buffer).\n * @param flags   a collection of AV_UTF8_FLAG_* flags\n * @return >= 0 in case a sequence was successfully read, a negative\n * value in case of invalid sequence\n */\nav_warn_unused_result\nint av_utf8_decode(int32_t *codep, const uint8_t **bufp, const uint8_t *buf_end,\n                   unsigned int flags);\n\n/**\n * Check if a name is in a list.\n * @returns 0 if not found, or the 1 based index where it has been found in the\n *            list.\n */\nint av_match_list(const char *name, const char *list, char separator);\n\n/**\n * See libc sscanf manual for more information.\n * Locale-independent sscanf implementation.\n */\nint av_sscanf(const char *string, const char *format, ...) av_scanf_format(2, 3);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_AVSTRING_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/avutil.h",
    "content": "/*\n * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_AVUTIL_H\n#define AVUTIL_AVUTIL_H\n\n/**\n * @file\n * @ingroup lavu\n * Convenience header that includes @ref lavu \"libavutil\"'s core.\n */\n\n/**\n * @mainpage\n *\n * @section ffmpeg_intro Introduction\n *\n * This document describes the usage of the different libraries\n * provided by FFmpeg.\n *\n * @li @ref libavc \"libavcodec\" encoding/decoding library\n * @li @ref lavfi \"libavfilter\" graph-based frame editing library\n * @li @ref libavf \"libavformat\" I/O and muxing/demuxing library\n * @li @ref lavd \"libavdevice\" special devices muxing/demuxing library\n * @li @ref lavu \"libavutil\" common utility library\n * @li @ref lswr \"libswresample\" audio resampling, format conversion and mixing\n * @li @ref libsws \"libswscale\" color conversion and scaling library\n *\n * @section ffmpeg_versioning Versioning and compatibility\n *\n * Each of the FFmpeg libraries contains a version.h header, which defines a\n * major, minor and micro version number with the\n * <em>LIBRARYNAME_VERSION_{MAJOR,MINOR,MICRO}</em> macros. The major version\n * number is incremented with backward incompatible changes - e.g. removing\n * parts of the public API, reordering public struct members, etc. The minor\n * version number is incremented for backward compatible API changes or major\n * new features - e.g. adding a new public function or a new decoder. The micro\n * version number is incremented for smaller changes that a calling program\n * might still want to check for - e.g. changing behavior in a previously\n * unspecified situation.\n *\n * FFmpeg guarantees backward API and ABI compatibility for each library as long\n * as its major version number is unchanged. This means that no public symbols\n * will be removed or renamed. Types and names of the public struct members and\n * values of public macros and enums will remain the same (unless they were\n * explicitly declared as not part of the public API). Documented behavior will\n * not change.\n *\n * In other words, any correct program that works with a given FFmpeg snapshot\n * should work just as well without any changes with any later snapshot with the\n * same major versions. This applies to both rebuilding the program against new\n * FFmpeg versions or to replacing the dynamic FFmpeg libraries that a program\n * links against.\n *\n * However, new public symbols may be added and new members may be appended to\n * public structs whose size is not part of public ABI (most public structs in\n * FFmpeg). New macros and enum values may be added. Behavior in undocumented\n * situations may change slightly (and be documented). All those are accompanied\n * by an entry in doc/APIchanges and incrementing either the minor or micro\n * version number.\n */\n\n/**\n * @defgroup lavu libavutil\n * Common code shared across all FFmpeg libraries.\n *\n * @note\n * libavutil is designed to be modular. In most cases, in order to use the\n * functions provided by one component of libavutil you must explicitly include\n * the specific header containing that feature. If you are only using\n * media-related components, you could simply include libavutil/avutil.h, which\n * brings in most of the \"core\" components.\n *\n * @{\n *\n * @defgroup lavu_crypto Crypto and Hashing\n *\n * @{\n * @}\n *\n * @defgroup lavu_math Mathematics\n * @{\n *\n * @}\n *\n * @defgroup lavu_string String Manipulation\n *\n * @{\n *\n * @}\n *\n * @defgroup lavu_mem Memory Management\n *\n * @{\n *\n * @}\n *\n * @defgroup lavu_data Data Structures\n * @{\n *\n * @}\n *\n * @defgroup lavu_video Video related\n *\n * @{\n *\n * @}\n *\n * @defgroup lavu_audio Audio related\n *\n * @{\n *\n * @}\n *\n * @defgroup lavu_error Error Codes\n *\n * @{\n *\n * @}\n *\n * @defgroup lavu_log Logging Facility\n *\n * @{\n *\n * @}\n *\n * @defgroup lavu_misc Other\n *\n * @{\n *\n * @defgroup preproc_misc Preprocessor String Macros\n *\n * @{\n *\n * @}\n *\n * @defgroup version_utils Library Version Macros\n *\n * @{\n *\n * @}\n */\n\n\n/**\n * @addtogroup lavu_ver\n * @{\n */\n\n/**\n * Return the LIBAVUTIL_VERSION_INT constant.\n */\nunsigned avutil_version(void);\n\n/**\n * Return an informative version string. This usually is the actual release\n * version number or a git commit description. This string has no fixed format\n * and can change any time. It should never be parsed by code.\n */\nconst char *av_version_info(void);\n\n/**\n * Return the libavutil build-time configuration.\n */\nconst char *avutil_configuration(void);\n\n/**\n * Return the libavutil license.\n */\nconst char *avutil_license(void);\n\n/**\n * @}\n */\n\n/**\n * @addtogroup lavu_media Media Type\n * @brief Media Type\n */\n\nenum AVMediaTypeFFmpeg {\n    AVMEDIA_TYPE_UNKNOWN = -1,  ///< Usually treated as AVMEDIA_TYPE_DATA\n    AVMEDIA_TYPE_VIDEO,\n    AVMEDIA_TYPE_AUDIO,\n    AVMEDIA_TYPE_DATA,          ///< Opaque data information usually continuous\n    AVMEDIA_TYPE_SUBTITLE,\n    AVMEDIA_TYPE_ATTACHMENT,    ///< Opaque data information usually sparse\n    AVMEDIA_TYPE_NB\n};\n\n/**\n * Return a string describing the media_type enum, NULL if media_type\n * is unknown.\n */\nconst char *av_get_media_type_string(enum AVMediaTypeFFmpeg media_type);\n\n/**\n * @defgroup lavu_const Constants\n * @{\n *\n * @defgroup lavu_enc Encoding specific\n *\n * @note those definition should move to avcodec\n * @{\n */\n\n#define FF_LAMBDA_SHIFT 7\n#define FF_LAMBDA_SCALE (1<<FF_LAMBDA_SHIFT)\n#define FF_QP2LAMBDA 118 ///< factor to convert from H.263 QP to lambda\n#define FF_LAMBDA_MAX (256*128-1)\n\n#define FF_QUALITY_SCALE FF_LAMBDA_SCALE //FIXME maybe remove\n\n/**\n * @}\n * @defgroup lavu_time Timestamp specific\n *\n * FFmpeg internal timebase and timestamp definitions\n *\n * @{\n */\n\n/**\n * @brief Undefined timestamp value\n *\n * Usually reported by demuxer that work on containers that do not provide\n * either pts or dts.\n */\n\n#define AV_NOPTS_VALUE          ((int64_t)UINT64_C(0x8000000000000000))\n\n/**\n * Internal time base represented as integer\n */\n\n#define AV_TIME_BASE            1000000\n\n/**\n * Internal time base represented as fractional value\n */\n\n#ifdef __cplusplus\n/* ISO C++ forbids compound-literals. */\n#define AV_TIME_BASE_Q          av_make_q(1, AV_TIME_BASE)\n#else\n#define AV_TIME_BASE_Q          (AVRational){1, AV_TIME_BASE}\n#endif\n\n/**\n * @}\n * @}\n * @defgroup lavu_picture Image related\n *\n * AVPicture types, pixel formats and basic image planes manipulation.\n *\n * @{\n */\n\nenum AVPictureType {\n    AV_PICTURE_TYPE_NONE = 0, ///< Undefined\n    AV_PICTURE_TYPE_I,     ///< Intra\n    AV_PICTURE_TYPE_P,     ///< Predicted\n    AV_PICTURE_TYPE_B,     ///< Bi-dir predicted\n    AV_PICTURE_TYPE_S,     ///< S(GMC)-VOP MPEG-4\n    AV_PICTURE_TYPE_SI,    ///< Switching Intra\n    AV_PICTURE_TYPE_SP,    ///< Switching Predicted\n    AV_PICTURE_TYPE_BI,    ///< BI type\n};\n\n/**\n * Return a single letter to describe the given picture type\n * pict_type.\n *\n * @param[in] pict_type the picture type @return a single character\n * representing the picture type, '?' if pict_type is unknown\n */\nchar av_get_picture_type_char(enum AVPictureType pict_type);\n\n/**\n * @}\n */\n\n#include \"common.h\"\n#include \"rational.h\"\n#include \"version.h\"\n#include \"macros.h\"\n#include \"mathematics.h\"\n#include \"log.h\"\n#include \"pixfmt.h\"\n\n/**\n * Return x default pointer in case p is NULL.\n */\nstatic inline void *av_x_if_null(const void *p, const void *x)\n{\n    return (void *)(intptr_t)(p ? p : x);\n}\n\n#if FF_API_OPT_INT_LIST\n/**\n * Compute the length of an integer list.\n *\n * @param elsize  size in bytes of each list element (only 1, 2, 4 or 8)\n * @param term    list terminator (usually 0 or -1)\n * @param list    pointer to the list\n * @return  length of the list, in elements, not counting the terminator\n */\nattribute_deprecated\nunsigned av_int_list_length_for_size(unsigned elsize,\n                                     const void *list, uint64_t term) av_pure;\n\n/**\n * Compute the length of an integer list.\n *\n * @param term  list terminator (usually 0 or -1)\n * @param list  pointer to the list\n * @return  length of the list, in elements, not counting the terminator\n */\n#define av_int_list_length(list, term) \\\n    av_int_list_length_for_size(sizeof(*(list)), list, term)\n#endif\n\n/**\n * Return the fractional representation of the internal time base.\n */\nAVRational av_get_time_base_q(void);\n\n#define AV_FOURCC_MAX_STRING_SIZE 32\n\n#define av_fourcc2str(fourcc) av_fourcc_make_string((char[AV_FOURCC_MAX_STRING_SIZE]){0}, fourcc)\n\n/**\n * Fill the provided buffer with a string containing a FourCC (four-character\n * code) representation.\n *\n * @param buf    a buffer with size in bytes of at least AV_FOURCC_MAX_STRING_SIZE\n * @param fourcc the fourcc to represent\n * @return the buffer in input\n */\nchar *av_fourcc_make_string(char *buf, uint32_t fourcc);\n\n/**\n * @}\n * @}\n */\n\n#endif /* AVUTIL_AVUTIL_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/base64.h",
    "content": "/*\n * Copyright (c) 2006 Ryan Martell. (rdm4@martellventures.com)\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_BASE64_H\n#define AVUTIL_BASE64_H\n\n#include <stdint.h>\n\n/**\n * @defgroup lavu_base64 Base64\n * @ingroup lavu_crypto\n * @{\n */\n\n/**\n * Decode a base64-encoded string.\n *\n * @param out      buffer for decoded data\n * @param in       null-terminated input string\n * @param out_size size in bytes of the out buffer, must be at\n *                 least 3/4 of the length of in, that is AV_BASE64_DECODE_SIZE(strlen(in))\n * @return         number of bytes written, or a negative value in case of\n *                 invalid input\n */\nint av_base64_decode(uint8_t *out, const char *in, int out_size);\n\n/**\n * Calculate the output size in bytes needed to decode a base64 string\n * with length x to a data buffer.\n */\n#define AV_BASE64_DECODE_SIZE(x) ((x) * 3LL / 4)\n\n/**\n * Encode data to base64 and null-terminate.\n *\n * @param out      buffer for encoded data\n * @param out_size size in bytes of the out buffer (including the\n *                 null terminator), must be at least AV_BASE64_SIZE(in_size)\n * @param in       input buffer containing the data to encode\n * @param in_size  size in bytes of the in buffer\n * @return         out or NULL in case of error\n */\nchar *av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size);\n\n/**\n * Calculate the output size needed to base64-encode x bytes to a\n * null-terminated string.\n */\n#define AV_BASE64_SIZE(x)  (((x)+2) / 3 * 4 + 1)\n\n /**\n  * @}\n  */\n\n#endif /* AVUTIL_BASE64_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/blowfish.h",
    "content": "/*\n * Blowfish algorithm\n * Copyright (c) 2012 Samuel Pitoiset\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_BLOWFISH_H\n#define AVUTIL_BLOWFISH_H\n\n#include <stdint.h>\n\n/**\n * @defgroup lavu_blowfish Blowfish\n * @ingroup lavu_crypto\n * @{\n */\n\n#define AV_BF_ROUNDS 16\n\ntypedef struct AVBlowfish {\n    uint32_t p[AV_BF_ROUNDS + 2];\n    uint32_t s[4][256];\n} AVBlowfish;\n\n/**\n * Allocate an AVBlowfish context.\n */\nAVBlowfish *av_blowfish_alloc(void);\n\n/**\n * Initialize an AVBlowfish context.\n *\n * @param ctx an AVBlowfish context\n * @param key a key\n * @param key_len length of the key\n */\nvoid av_blowfish_init(struct AVBlowfish *ctx, const uint8_t *key, int key_len);\n\n/**\n * Encrypt or decrypt a buffer using a previously initialized context.\n *\n * @param ctx an AVBlowfish context\n * @param xl left four bytes halves of input to be encrypted\n * @param xr right four bytes halves of input to be encrypted\n * @param decrypt 0 for encryption, 1 for decryption\n */\nvoid av_blowfish_crypt_ecb(struct AVBlowfish *ctx, uint32_t *xl, uint32_t *xr,\n                           int decrypt);\n\n/**\n * Encrypt or decrypt a buffer using a previously initialized context.\n *\n * @param ctx an AVBlowfish context\n * @param dst destination array, can be equal to src\n * @param src source array, can be equal to dst\n * @param count number of 8 byte blocks\n * @param iv initialization vector for CBC mode, if NULL ECB will be used\n * @param decrypt 0 for encryption, 1 for decryption\n */\nvoid av_blowfish_crypt(struct AVBlowfish *ctx, uint8_t *dst, const uint8_t *src,\n                       int count, uint8_t *iv, int decrypt);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_BLOWFISH_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/bprint.h",
    "content": "/*\n * Copyright (c) 2012 Nicolas George\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_avbprint\n * AVBPrint public header\n */\n\n#ifndef AVUTIL_BPRINT_H\n#define AVUTIL_BPRINT_H\n\n#include <stdarg.h>\n\n#include \"attributes.h\"\n#include \"avstring.h\"\n\n/**\n * @defgroup lavu_avbprint AVBPrint\n * @ingroup lavu_data\n *\n * A buffer to print data progressively\n * @{\n */\n\n/**\n * Define a structure with extra padding to a fixed size\n * This helps ensuring binary compatibility with future versions.\n */\n\n#define FF_PAD_STRUCTURE(name, size, ...) \\\nstruct ff_pad_helper_##name { __VA_ARGS__ }; \\\ntypedef struct name { \\\n    __VA_ARGS__ \\\n    char reserved_padding[size - sizeof(struct ff_pad_helper_##name)]; \\\n} name;\n\n/**\n * Buffer to print data progressively\n *\n * The string buffer grows as necessary and is always 0-terminated.\n * The content of the string is never accessed, and thus is\n * encoding-agnostic and can even hold binary data.\n *\n * Small buffers are kept in the structure itself, and thus require no\n * memory allocation at all (unless the contents of the buffer is needed\n * after the structure goes out of scope). This is almost as lightweight as\n * declaring a local `char buf[512]`.\n *\n * The length of the string can go beyond the allocated size: the buffer is\n * then truncated, but the functions still keep account of the actual total\n * length.\n *\n * In other words, AVBPrint.len can be greater than AVBPrint.size and records\n * the total length of what would have been to the buffer if there had been\n * enough memory.\n *\n * Append operations do not need to be tested for failure: if a memory\n * allocation fails, data stop being appended to the buffer, but the length\n * is still updated. This situation can be tested with\n * av_bprint_is_complete().\n *\n * The AVBPrint.size_max field determines several possible behaviours:\n * - `size_max = -1` (= `UINT_MAX`) or any large value will let the buffer be\n *   reallocated as necessary, with an amortized linear cost.\n * - `size_max = 0` prevents writing anything to the buffer: only the total\n *   length is computed. The write operations can then possibly be repeated in\n *   a buffer with exactly the necessary size\n *   (using `size_init = size_max = len + 1`).\n * - `size_max = 1` is automatically replaced by the exact size available in the\n *   structure itself, thus ensuring no dynamic memory allocation. The\n *   internal buffer is large enough to hold a reasonable paragraph of text,\n *   such as the current paragraph.\n */\n\nFF_PAD_STRUCTURE(AVBPrint, 1024,\n    char *str;         /**< string so far */\n    unsigned len;      /**< length so far */\n    unsigned size;     /**< allocated memory */\n    unsigned size_max; /**< maximum allocated memory */\n    char reserved_internal_buffer[1];\n)\n\n/**\n * @name Max size special values\n * Convenience macros for special values for av_bprint_init() size_max\n * parameter.\n * @{\n */\n\n/**\n * Buffer will be reallocated as necessary, with an amortized linear cost.\n */\n#define AV_BPRINT_SIZE_UNLIMITED  ((unsigned)-1)\n/**\n * Use the exact size available in the AVBPrint structure itself.\n *\n * Thus ensuring no dynamic memory allocation. The internal buffer is large\n * enough to hold a reasonable paragraph of text, such as the current paragraph.\n */\n#define AV_BPRINT_SIZE_AUTOMATIC  1\n/**\n * Do not write anything to the buffer, only calculate the total length.\n *\n * The write operations can then possibly be repeated in a buffer with\n * exactly the necessary size (using `size_init = size_max = AVBPrint.len + 1`).\n */\n#define AV_BPRINT_SIZE_COUNT_ONLY 0\n/** @} */\n\n/**\n * Init a print buffer.\n *\n * @param buf        buffer to init\n * @param size_init  initial size (including the final 0)\n * @param size_max   maximum size;\n *                   - `0` means do not write anything, just count the length\n *                   - `1` is replaced by the maximum value for automatic storage\n *                       any large value means that the internal buffer will be\n *                       reallocated as needed up to that limit\n *                   - `-1` is converted to `UINT_MAX`, the largest limit possible.\n *                   Check also `AV_BPRINT_SIZE_*` macros.\n */\nvoid av_bprint_init(AVBPrint *buf, unsigned size_init, unsigned size_max);\n\n/**\n * Init a print buffer using a pre-existing buffer.\n *\n * The buffer will not be reallocated.\n * In case size equals zero, the AVBPrint will be initialized to use\n * the internal buffer as if using AV_BPRINT_SIZE_COUNT_ONLY with\n * av_bprint_init().\n *\n * @param buf     buffer structure to init\n * @param buffer  byte buffer to use for the string data\n * @param size    size of buffer\n */\nvoid av_bprint_init_for_buffer(AVBPrint *buf, char *buffer, unsigned size);\n\n/**\n * Append a formatted string to a print buffer.\n */\nvoid av_bprintf(AVBPrint *buf, const char *fmt, ...) av_printf_format(2, 3);\n\n/**\n * Append a formatted string to a print buffer.\n */\nvoid av_vbprintf(AVBPrint *buf, const char *fmt, va_list vl_arg);\n\n/**\n * Append char c n times to a print buffer.\n */\nvoid av_bprint_chars(AVBPrint *buf, char c, unsigned n);\n\n/**\n * Append data to a print buffer.\n *\n * @param buf  bprint buffer to use\n * @param data pointer to data\n * @param size size of data\n */\nvoid av_bprint_append_data(AVBPrint *buf, const char *data, unsigned size);\n\nstruct tm;\n/**\n * Append a formatted date and time to a print buffer.\n *\n * @param buf  bprint buffer to use\n * @param fmt  date and time format string, see strftime()\n * @param tm   broken-down time structure to translate\n *\n * @note due to poor design of the standard strftime function, it may\n * produce poor results if the format string expands to a very long text and\n * the bprint buffer is near the limit stated by the size_max option.\n */\nvoid av_bprint_strftime(AVBPrint *buf, const char *fmt, const struct tm *tm);\n\n/**\n * Allocate bytes in the buffer for external use.\n *\n * @param[in]  buf          buffer structure\n * @param[in]  size         required size\n * @param[out] mem          pointer to the memory area\n * @param[out] actual_size  size of the memory area after allocation;\n *                          can be larger or smaller than size\n */\nvoid av_bprint_get_buffer(AVBPrint *buf, unsigned size,\n                          unsigned char **mem, unsigned *actual_size);\n\n/**\n * Reset the string to \"\" but keep internal allocated data.\n */\nvoid av_bprint_clear(AVBPrint *buf);\n\n/**\n * Test if the print buffer is complete (not truncated).\n *\n * It may have been truncated due to a memory allocation failure\n * or the size_max limit (compare size and size_max if necessary).\n */\nstatic inline int av_bprint_is_complete(const AVBPrint *buf)\n{\n    return buf->len < buf->size;\n}\n\n/**\n * Finalize a print buffer.\n *\n * The print buffer can no longer be used afterwards,\n * but the len and size fields are still valid.\n *\n * @arg[out] ret_str  if not NULL, used to return a permanent copy of the\n *                    buffer contents, or NULL if memory allocation fails;\n *                    if NULL, the buffer is discarded and freed\n * @return  0 for success or error code (probably AVERROR(ENOMEM))\n */\nint av_bprint_finalize(AVBPrint *buf, char **ret_str);\n\n/**\n * Escape the content in src and append it to dstbuf.\n *\n * @param dstbuf        already inited destination bprint buffer\n * @param src           string containing the text to escape\n * @param special_chars string containing the special characters which\n *                      need to be escaped, can be NULL\n * @param mode          escape mode to employ, see AV_ESCAPE_MODE_* macros.\n *                      Any unknown value for mode will be considered equivalent to\n *                      AV_ESCAPE_MODE_BACKSLASH, but this behaviour can change without\n *                      notice.\n * @param flags         flags which control how to escape, see AV_ESCAPE_FLAG_* macros\n */\nvoid av_bprint_escape(AVBPrint *dstbuf, const char *src, const char *special_chars,\n                      enum AVEscapeMode mode, int flags);\n\n/** @} */\n\n#endif /* AVUTIL_BPRINT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/bswap.h",
    "content": "/*\n * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * byte swapping routines\n */\n\n#ifndef AVUTIL_BSWAP_H\n#define AVUTIL_BSWAP_H\n\n#include <stdint.h>\n#include \"libavutil/avconfig.h\"\n#include \"attributes.h\"\n\n#ifdef HAVE_AV_CONFIG_H\n\n#include \"config.h\"\n\n#if ARCH_ARM\n#   include \"arm/bswap.h\"\n#elif ARCH_RISCV\n#   include \"riscv/bswap.h\"\n#elif ARCH_X86\n#   include \"x86/bswap.h\"\n#endif\n\n#endif /* HAVE_AV_CONFIG_H */\n\n#define AV_BSWAP16C(x) (((x) << 8 & 0xff00)  | ((x) >> 8 & 0x00ff))\n#define AV_BSWAP32C(x) (AV_BSWAP16C(x) << 16 | AV_BSWAP16C((x) >> 16))\n#define AV_BSWAP64C(x) (AV_BSWAP32C(x) << 32 | AV_BSWAP32C((x) >> 32))\n\n#define AV_BSWAPC(s, x) AV_BSWAP##s##C(x)\n\n#ifndef av_bswap16\nstatic av_always_inline av_const uint16_t av_bswap16(uint16_t x)\n{\n    x= (x>>8) | (x<<8);\n    return x;\n}\n#endif\n\n#ifndef av_bswap32\nstatic av_always_inline av_const uint32_t av_bswap32(uint32_t x)\n{\n    return AV_BSWAP32C(x);\n}\n#endif\n\n#ifndef av_bswap64\nstatic inline uint64_t av_const av_bswap64(uint64_t x)\n{\n    return (uint64_t)av_bswap32(x) << 32 | av_bswap32(x >> 32);\n}\n#endif\n\n// be2ne ... big-endian to native-endian\n// le2ne ... little-endian to native-endian\n\n#if AV_HAVE_BIGENDIAN\n#define av_be2ne16(x) (x)\n#define av_be2ne32(x) (x)\n#define av_be2ne64(x) (x)\n#define av_le2ne16(x) av_bswap16(x)\n#define av_le2ne32(x) av_bswap32(x)\n#define av_le2ne64(x) av_bswap64(x)\n#define AV_BE2NEC(s, x) (x)\n#define AV_LE2NEC(s, x) AV_BSWAPC(s, x)\n#else\n#define av_be2ne16(x) av_bswap16(x)\n#define av_be2ne32(x) av_bswap32(x)\n#define av_be2ne64(x) av_bswap64(x)\n#define av_le2ne16(x) (x)\n#define av_le2ne32(x) (x)\n#define av_le2ne64(x) (x)\n#define AV_BE2NEC(s, x) AV_BSWAPC(s, x)\n#define AV_LE2NEC(s, x) (x)\n#endif\n\n#define AV_BE2NE16C(x) AV_BE2NEC(16, x)\n#define AV_BE2NE32C(x) AV_BE2NEC(32, x)\n#define AV_BE2NE64C(x) AV_BE2NEC(64, x)\n#define AV_LE2NE16C(x) AV_LE2NEC(16, x)\n#define AV_LE2NE32C(x) AV_LE2NEC(32, x)\n#define AV_LE2NE64C(x) AV_LE2NEC(64, x)\n\n#endif /* AVUTIL_BSWAP_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/buffer.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_buffer\n * refcounted data buffer API\n */\n\n#ifndef AVUTIL_BUFFER_H\n#define AVUTIL_BUFFER_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n/**\n * @defgroup lavu_buffer AVBuffer\n * @ingroup lavu_data\n *\n * @{\n * AVBuffer is an API for reference-counted data buffers.\n *\n * There are two core objects in this API -- AVBuffer and AVBufferRef. AVBuffer\n * represents the data buffer itself; it is opaque and not meant to be accessed\n * by the caller directly, but only through AVBufferRef. However, the caller may\n * e.g. compare two AVBuffer pointers to check whether two different references\n * are describing the same data buffer. AVBufferRef represents a single\n * reference to an AVBuffer and it is the object that may be manipulated by the\n * caller directly.\n *\n * There are two functions provided for creating a new AVBuffer with a single\n * reference -- av_buffer_alloc() to just allocate a new buffer, and\n * av_buffer_create() to wrap an existing array in an AVBuffer. From an existing\n * reference, additional references may be created with av_buffer_ref().\n * Use av_buffer_unref() to free a reference (this will automatically free the\n * data once all the references are freed).\n *\n * The convention throughout this API and the rest of FFmpeg is such that the\n * buffer is considered writable if there exists only one reference to it (and\n * it has not been marked as read-only). The av_buffer_is_writable() function is\n * provided to check whether this is true and av_buffer_make_writable() will\n * automatically create a new writable buffer when necessary.\n * Of course nothing prevents the calling code from violating this convention,\n * however that is safe only when all the existing references are under its\n * control.\n *\n * @note Referencing and unreferencing the buffers is thread-safe and thus\n * may be done from multiple threads simultaneously without any need for\n * additional locking.\n *\n * @note Two different references to the same buffer can point to different\n * parts of the buffer (i.e. their AVBufferRef.data will not be equal).\n */\n\n/**\n * A reference counted buffer type. It is opaque and is meant to be used through\n * references (AVBufferRef).\n */\ntypedef struct AVBuffer AVBuffer;\n\n/**\n * A reference to a data buffer.\n *\n * The size of this struct is not a part of the public ABI and it is not meant\n * to be allocated directly.\n */\ntypedef struct AVBufferRef {\n    AVBuffer *buffer;\n\n    /**\n     * The data buffer. It is considered writable if and only if\n     * this is the only reference to the buffer, in which case\n     * av_buffer_is_writable() returns 1.\n     */\n    uint8_t *data;\n    /**\n     * Size of data in bytes.\n     */\n    size_t   size;\n} AVBufferRef;\n\n/**\n * Allocate an AVBuffer of the given size using av_malloc().\n *\n * @return an AVBufferRef of given size or NULL when out of memory\n */\nAVBufferRef *av_buffer_alloc(size_t size);\n\n/**\n * Same as av_buffer_alloc(), except the returned buffer will be initialized\n * to zero.\n */\nAVBufferRef *av_buffer_allocz(size_t size);\n\n/**\n * Always treat the buffer as read-only, even when it has only one\n * reference.\n */\n#define AV_BUFFER_FLAG_READONLY (1 << 0)\n\n/**\n * Create an AVBuffer from an existing array.\n *\n * If this function is successful, data is owned by the AVBuffer. The caller may\n * only access data through the returned AVBufferRef and references derived from\n * it.\n * If this function fails, data is left untouched.\n * @param data   data array\n * @param size   size of data in bytes\n * @param free   a callback for freeing this buffer's data\n * @param opaque parameter to be got for processing or passed to free\n * @param flags  a combination of AV_BUFFER_FLAG_*\n *\n * @return an AVBufferRef referring to data on success, NULL on failure.\n */\nAVBufferRef *av_buffer_create(uint8_t *data, size_t size,\n                              void (*free)(void *opaque, uint8_t *data),\n                              void *opaque, int flags);\n\n/**\n * Default free callback, which calls av_free() on the buffer data.\n * This function is meant to be passed to av_buffer_create(), not called\n * directly.\n */\nvoid av_buffer_default_free(void *opaque, uint8_t *data);\n\n/**\n * Create a new reference to an AVBuffer.\n *\n * @return a new AVBufferRef referring to the same AVBuffer as buf or NULL on\n * failure.\n */\nAVBufferRef *av_buffer_ref(const AVBufferRef *buf);\n\n/**\n * Free a given reference and automatically free the buffer if there are no more\n * references to it.\n *\n * @param buf the reference to be freed. The pointer is set to NULL on return.\n */\nvoid av_buffer_unref(AVBufferRef **buf);\n\n/**\n * @return 1 if the caller may write to the data referred to by buf (which is\n * true if and only if buf is the only reference to the underlying AVBuffer).\n * Return 0 otherwise.\n * A positive answer is valid until av_buffer_ref() is called on buf.\n */\nint av_buffer_is_writable(const AVBufferRef *buf);\n\n/**\n * @return the opaque parameter set by av_buffer_create.\n */\nvoid *av_buffer_get_opaque(const AVBufferRef *buf);\n\nint av_buffer_get_ref_count(const AVBufferRef *buf);\n\n/**\n * Create a writable reference from a given buffer reference, avoiding data copy\n * if possible.\n *\n * @param buf buffer reference to make writable. On success, buf is either left\n *            untouched, or it is unreferenced and a new writable AVBufferRef is\n *            written in its place. On failure, buf is left untouched.\n * @return 0 on success, a negative AVERROR on failure.\n */\nint av_buffer_make_writable(AVBufferRef **buf);\n\n/**\n * Reallocate a given buffer.\n *\n * @param buf  a buffer reference to reallocate. On success, buf will be\n *             unreferenced and a new reference with the required size will be\n *             written in its place. On failure buf will be left untouched. *buf\n *             may be NULL, then a new buffer is allocated.\n * @param size required new buffer size.\n * @return 0 on success, a negative AVERROR on failure.\n *\n * @note the buffer is actually reallocated with av_realloc() only if it was\n * initially allocated through av_buffer_realloc(NULL) and there is only one\n * reference to it (i.e. the one passed to this function). In all other cases\n * a new buffer is allocated and the data is copied.\n */\nint av_buffer_realloc(AVBufferRef **buf, size_t size);\n\n/**\n * Ensure dst refers to the same data as src.\n *\n * When *dst is already equivalent to src, do nothing. Otherwise unreference dst\n * and replace it with a new reference to src.\n *\n * @param dst Pointer to either a valid buffer reference or NULL. On success,\n *            this will point to a buffer reference equivalent to src. On\n *            failure, dst will be left untouched.\n * @param src A buffer reference to replace dst with. May be NULL, then this\n *            function is equivalent to av_buffer_unref(dst).\n * @return 0 on success\n *         AVERROR(ENOMEM) on memory allocation failure.\n */\nint av_buffer_replace(AVBufferRef **dst, const AVBufferRef *src);\n\n/**\n * @}\n */\n\n/**\n * @defgroup lavu_bufferpool AVBufferPool\n * @ingroup lavu_data\n *\n * @{\n * AVBufferPool is an API for a lock-free thread-safe pool of AVBuffers.\n *\n * Frequently allocating and freeing large buffers may be slow. AVBufferPool is\n * meant to solve this in cases when the caller needs a set of buffers of the\n * same size (the most obvious use case being buffers for raw video or audio\n * frames).\n *\n * At the beginning, the user must call av_buffer_pool_init() to create the\n * buffer pool. Then whenever a buffer is needed, call av_buffer_pool_get() to\n * get a reference to a new buffer, similar to av_buffer_alloc(). This new\n * reference works in all aspects the same way as the one created by\n * av_buffer_alloc(). However, when the last reference to this buffer is\n * unreferenced, it is returned to the pool instead of being freed and will be\n * reused for subsequent av_buffer_pool_get() calls.\n *\n * When the caller is done with the pool and no longer needs to allocate any new\n * buffers, av_buffer_pool_uninit() must be called to mark the pool as freeable.\n * Once all the buffers are released, it will automatically be freed.\n *\n * Allocating and releasing buffers with this API is thread-safe as long as\n * either the default alloc callback is used, or the user-supplied one is\n * thread-safe.\n */\n\n/**\n * The buffer pool. This structure is opaque and not meant to be accessed\n * directly. It is allocated with av_buffer_pool_init() and freed with\n * av_buffer_pool_uninit().\n */\ntypedef struct AVBufferPool AVBufferPool;\n\n/**\n * Allocate and initialize a buffer pool.\n *\n * @param size size of each buffer in this pool\n * @param alloc a function that will be used to allocate new buffers when the\n * pool is empty. May be NULL, then the default allocator will be used\n * (av_buffer_alloc()).\n * @return newly created buffer pool on success, NULL on error.\n */\nAVBufferPool *av_buffer_pool_init(size_t size, AVBufferRef* (*alloc)(size_t size));\n\n/**\n * Allocate and initialize a buffer pool with a more complex allocator.\n *\n * @param size size of each buffer in this pool\n * @param opaque arbitrary user data used by the allocator\n * @param alloc a function that will be used to allocate new buffers when the\n *              pool is empty. May be NULL, then the default allocator will be\n *              used (av_buffer_alloc()).\n * @param pool_free a function that will be called immediately before the pool\n *                  is freed. I.e. after av_buffer_pool_uninit() is called\n *                  by the caller and all the frames are returned to the pool\n *                  and freed. It is intended to uninitialize the user opaque\n *                  data. May be NULL.\n * @return newly created buffer pool on success, NULL on error.\n */\nAVBufferPool *av_buffer_pool_init2(size_t size, void *opaque,\n                                   AVBufferRef* (*alloc)(void *opaque, size_t size),\n                                   void (*pool_free)(void *opaque));\n\n/**\n * Mark the pool as being available for freeing. It will actually be freed only\n * once all the allocated buffers associated with the pool are released. Thus it\n * is safe to call this function while some of the allocated buffers are still\n * in use.\n *\n * @param pool pointer to the pool to be freed. It will be set to NULL.\n */\nvoid av_buffer_pool_uninit(AVBufferPool **pool);\n\n/**\n * Allocate a new AVBuffer, reusing an old buffer from the pool when available.\n * This function may be called simultaneously from multiple threads.\n *\n * @return a reference to the new buffer on success, NULL on error.\n */\nAVBufferRef *av_buffer_pool_get(AVBufferPool *pool);\n\n/**\n * Query the original opaque parameter of an allocated buffer in the pool.\n *\n * @param ref a buffer reference to a buffer returned by av_buffer_pool_get.\n * @return the opaque parameter set by the buffer allocator function of the\n *         buffer pool.\n *\n * @note the opaque parameter of ref is used by the buffer pool implementation,\n * therefore you have to use this function to access the original opaque\n * parameter of an allocated buffer.\n */\nvoid *av_buffer_pool_buffer_get_opaque(const AVBufferRef *ref);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_BUFFER_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/camellia.h",
    "content": "/*\n * An implementation of the CAMELLIA algorithm as mentioned in RFC3713\n * Copyright (c) 2014 Supraja Meedinti\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_CAMELLIA_H\n#define AVUTIL_CAMELLIA_H\n\n#include <stdint.h>\n\n\n/**\n  * @file\n  * @brief Public header for libavutil CAMELLIA algorithm\n  * @defgroup lavu_camellia CAMELLIA\n  * @ingroup lavu_crypto\n  * @{\n  */\n\nextern const int av_camellia_size;\n\nstruct AVCAMELLIA;\n\n/**\n  * Allocate an AVCAMELLIA context\n  * To free the struct: av_free(ptr)\n  */\nstruct AVCAMELLIA *av_camellia_alloc(void);\n\n/**\n  * Initialize an AVCAMELLIA context.\n  *\n  * @param ctx an AVCAMELLIA context\n  * @param key a key of 16, 24, 32 bytes used for encryption/decryption\n  * @param key_bits number of keybits: possible are 128, 192, 256\n */\nint av_camellia_init(struct AVCAMELLIA *ctx, const uint8_t *key, int key_bits);\n\n/**\n  * Encrypt or decrypt a buffer using a previously initialized context\n  *\n  * @param ctx an AVCAMELLIA context\n  * @param dst destination array, can be equal to src\n  * @param src source array, can be equal to dst\n  * @param count number of 16 byte blocks\n  * @param iv initialization vector for CBC mode, NULL for ECB mode\n  * @param decrypt 0 for encryption, 1 for decryption\n */\nvoid av_camellia_crypt(struct AVCAMELLIA *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt);\n\n/**\n * @}\n */\n#endif /* AVUTIL_CAMELLIA_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/cast5.h",
    "content": "/*\n * An implementation of the CAST128 algorithm as mentioned in RFC2144\n * Copyright (c) 2014 Supraja Meedinti\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_CAST5_H\n#define AVUTIL_CAST5_H\n\n#include <stdint.h>\n\n\n/**\n  * @file\n  * @brief Public header for libavutil CAST5 algorithm\n  * @defgroup lavu_cast5 CAST5\n  * @ingroup lavu_crypto\n  * @{\n  */\n\nextern const int av_cast5_size;\n\nstruct AVCAST5;\n\n/**\n  * Allocate an AVCAST5 context\n  * To free the struct: av_free(ptr)\n  */\nstruct AVCAST5 *av_cast5_alloc(void);\n/**\n  * Initialize an AVCAST5 context.\n  *\n  * @param ctx an AVCAST5 context\n  * @param key a key of 5,6,...16 bytes used for encryption/decryption\n  * @param key_bits number of keybits: possible are 40,48,...,128\n  * @return 0 on success, less than 0 on failure\n */\nint av_cast5_init(struct AVCAST5 *ctx, const uint8_t *key, int key_bits);\n\n/**\n  * Encrypt or decrypt a buffer using a previously initialized context, ECB mode only\n  *\n  * @param ctx an AVCAST5 context\n  * @param dst destination array, can be equal to src\n  * @param src source array, can be equal to dst\n  * @param count number of 8 byte blocks\n  * @param decrypt 0 for encryption, 1 for decryption\n */\nvoid av_cast5_crypt(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, int decrypt);\n\n/**\n  * Encrypt or decrypt a buffer using a previously initialized context\n  *\n  * @param ctx an AVCAST5 context\n  * @param dst destination array, can be equal to src\n  * @param src source array, can be equal to dst\n  * @param count number of 8 byte blocks\n  * @param iv initialization vector for CBC mode, NULL for ECB mode\n  * @param decrypt 0 for encryption, 1 for decryption\n */\nvoid av_cast5_crypt2(struct AVCAST5 *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt);\n/**\n * @}\n */\n#endif /* AVUTIL_CAST5_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/channel_layout.h",
    "content": "/*\n * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>\n * Copyright (c) 2008 Peter Ross\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_CHANNEL_LAYOUT_H\n#define AVUTIL_CHANNEL_LAYOUT_H\n\n#include <stdint.h>\n#include <stdlib.h>\n\n#include \"version.h\"\n#include \"attributes.h\"\n\n/**\n * @file\n * @ingroup lavu_audio_channels\n * Public libavutil channel layout APIs header.\n */\n\n\n/**\n * @defgroup lavu_audio_channels Audio channels\n * @ingroup lavu_audio\n *\n * Audio channel layout utility functions\n *\n * @{\n */\n\nenum AVChannel {\n    /// Invalid channel index\n    AV_CHAN_NONE = -1,\n    AV_CHAN_FRONT_LEFT,\n    AV_CHAN_FRONT_RIGHT,\n    AV_CHAN_FRONT_CENTER,\n    AV_CHAN_LOW_FREQUENCY,\n    AV_CHAN_BACK_LEFT,\n    AV_CHAN_BACK_RIGHT,\n    AV_CHAN_FRONT_LEFT_OF_CENTER,\n    AV_CHAN_FRONT_RIGHT_OF_CENTER,\n    AV_CHAN_BACK_CENTER,\n    AV_CHAN_SIDE_LEFT,\n    AV_CHAN_SIDE_RIGHT,\n    AV_CHAN_TOP_CENTER,\n    AV_CHAN_TOP_FRONT_LEFT,\n    AV_CHAN_TOP_FRONT_CENTER,\n    AV_CHAN_TOP_FRONT_RIGHT,\n    AV_CHAN_TOP_BACK_LEFT,\n    AV_CHAN_TOP_BACK_CENTER,\n    AV_CHAN_TOP_BACK_RIGHT,\n    /** Stereo downmix. */\n    AV_CHAN_STEREO_LEFT = 29,\n    /** See above. */\n    AV_CHAN_STEREO_RIGHT,\n    AV_CHAN_WIDE_LEFT,\n    AV_CHAN_WIDE_RIGHT,\n    AV_CHAN_SURROUND_DIRECT_LEFT,\n    AV_CHAN_SURROUND_DIRECT_RIGHT,\n    AV_CHAN_LOW_FREQUENCY_2,\n    AV_CHAN_TOP_SIDE_LEFT,\n    AV_CHAN_TOP_SIDE_RIGHT,\n    AV_CHAN_BOTTOM_FRONT_CENTER,\n    AV_CHAN_BOTTOM_FRONT_LEFT,\n    AV_CHAN_BOTTOM_FRONT_RIGHT,\n    AV_CHAN_SIDE_SURROUND_LEFT,     ///<  +90 degrees, Lss, SiL\n    AV_CHAN_SIDE_SURROUND_RIGHT,    ///<  -90 degrees, Rss, SiR\n    AV_CHAN_TOP_SURROUND_LEFT,      ///< +110 degrees, Lvs, TpLS\n    AV_CHAN_TOP_SURROUND_RIGHT,     ///< -110 degrees, Rvs, TpRS\n\n    AV_CHAN_BINAURAL_LEFT = 61,\n    AV_CHAN_BINAURAL_RIGHT,\n\n    /** Channel is empty can be safely skipped. */\n    AV_CHAN_UNUSED = 0x200,\n\n    /** Channel contains data, but its position is unknown. */\n    AV_CHAN_UNKNOWN = 0x300,\n\n    /**\n     * Range of channels between AV_CHAN_AMBISONIC_BASE and\n     * AV_CHAN_AMBISONIC_END represent Ambisonic components using the ACN system.\n     *\n     * Given a channel id `<i>` between AV_CHAN_AMBISONIC_BASE and\n     * AV_CHAN_AMBISONIC_END (inclusive), the ACN index of the channel `<n>` is\n     * `<n> = <i> - AV_CHAN_AMBISONIC_BASE`.\n     *\n     * @note these values are only used for AV_CHANNEL_ORDER_CUSTOM channel\n     * orderings, the AV_CHANNEL_ORDER_AMBISONIC ordering orders the channels\n     * implicitly by their position in the stream.\n     */\n    AV_CHAN_AMBISONIC_BASE = 0x400,\n    // leave space for 1024 ids, which correspond to maximum order-32 harmonics,\n    // which should be enough for the foreseeable use cases\n    AV_CHAN_AMBISONIC_END  = 0x7ff,\n};\n\nenum AVChannelOrder {\n    /**\n     * Only the channel count is specified, without any further information\n     * about the channel order.\n     */\n    AV_CHANNEL_ORDER_UNSPEC,\n    /**\n     * The native channel order, i.e. the channels are in the same order in\n     * which they are defined in the AVChannel enum. This supports up to 63\n     * different channels.\n     */\n    AV_CHANNEL_ORDER_NATIVE,\n    /**\n     * The channel order does not correspond to any other predefined order and\n     * is stored as an explicit map. For example, this could be used to support\n     * layouts with 64 or more channels, or with empty/skipped (AV_CHAN_UNUSED)\n     * channels at arbitrary positions.\n     */\n    AV_CHANNEL_ORDER_CUSTOM,\n    /**\n     * The audio is represented as the decomposition of the sound field into\n     * spherical harmonics. Each channel corresponds to a single expansion\n     * component. Channels are ordered according to ACN (Ambisonic Channel\n     * Number).\n     *\n     * The channel with the index n in the stream contains the spherical\n     * harmonic of degree l and order m given by\n     * @code{.unparsed}\n     *   l   = floor(sqrt(n)),\n     *   m   = n - l * (l + 1).\n     * @endcode\n     *\n     * Conversely given a spherical harmonic of degree l and order m, the\n     * corresponding channel index n is given by\n     * @code{.unparsed}\n     *   n = l * (l + 1) + m.\n     * @endcode\n     *\n     * Normalization is assumed to be SN3D (Schmidt Semi-Normalization)\n     * as defined in AmbiX format $ 2.1.\n     */\n    AV_CHANNEL_ORDER_AMBISONIC,\n    /**\n     * Number of channel orders, not part of ABI/API\n     */\n    FF_CHANNEL_ORDER_NB\n};\n\n\n/**\n * @defgroup channel_masks Audio channel masks\n *\n * A channel layout is a 64-bits integer with a bit set for every channel.\n * The number of bits set must be equal to the number of channels.\n * The value 0 means that the channel layout is not known.\n * @note this data structure is not powerful enough to handle channels\n * combinations that have the same channel multiple times, such as\n * dual-mono.\n *\n * @{\n */\n#define AV_CH_FRONT_LEFT             (1ULL << AV_CHAN_FRONT_LEFT           )\n#define AV_CH_FRONT_RIGHT            (1ULL << AV_CHAN_FRONT_RIGHT          )\n#define AV_CH_FRONT_CENTER           (1ULL << AV_CHAN_FRONT_CENTER         )\n#define AV_CH_LOW_FREQUENCY          (1ULL << AV_CHAN_LOW_FREQUENCY        )\n#define AV_CH_BACK_LEFT              (1ULL << AV_CHAN_BACK_LEFT            )\n#define AV_CH_BACK_RIGHT             (1ULL << AV_CHAN_BACK_RIGHT           )\n#define AV_CH_FRONT_LEFT_OF_CENTER   (1ULL << AV_CHAN_FRONT_LEFT_OF_CENTER )\n#define AV_CH_FRONT_RIGHT_OF_CENTER  (1ULL << AV_CHAN_FRONT_RIGHT_OF_CENTER)\n#define AV_CH_BACK_CENTER            (1ULL << AV_CHAN_BACK_CENTER          )\n#define AV_CH_SIDE_LEFT              (1ULL << AV_CHAN_SIDE_LEFT            )\n#define AV_CH_SIDE_RIGHT             (1ULL << AV_CHAN_SIDE_RIGHT           )\n#define AV_CH_TOP_CENTER             (1ULL << AV_CHAN_TOP_CENTER           )\n#define AV_CH_TOP_FRONT_LEFT         (1ULL << AV_CHAN_TOP_FRONT_LEFT       )\n#define AV_CH_TOP_FRONT_CENTER       (1ULL << AV_CHAN_TOP_FRONT_CENTER     )\n#define AV_CH_TOP_FRONT_RIGHT        (1ULL << AV_CHAN_TOP_FRONT_RIGHT      )\n#define AV_CH_TOP_BACK_LEFT          (1ULL << AV_CHAN_TOP_BACK_LEFT        )\n#define AV_CH_TOP_BACK_CENTER        (1ULL << AV_CHAN_TOP_BACK_CENTER      )\n#define AV_CH_TOP_BACK_RIGHT         (1ULL << AV_CHAN_TOP_BACK_RIGHT       )\n#define AV_CH_STEREO_LEFT            (1ULL << AV_CHAN_STEREO_LEFT          )\n#define AV_CH_STEREO_RIGHT           (1ULL << AV_CHAN_STEREO_RIGHT         )\n#define AV_CH_WIDE_LEFT              (1ULL << AV_CHAN_WIDE_LEFT            )\n#define AV_CH_WIDE_RIGHT             (1ULL << AV_CHAN_WIDE_RIGHT           )\n#define AV_CH_SURROUND_DIRECT_LEFT   (1ULL << AV_CHAN_SURROUND_DIRECT_LEFT )\n#define AV_CH_SURROUND_DIRECT_RIGHT  (1ULL << AV_CHAN_SURROUND_DIRECT_RIGHT)\n#define AV_CH_LOW_FREQUENCY_2        (1ULL << AV_CHAN_LOW_FREQUENCY_2      )\n#define AV_CH_TOP_SIDE_LEFT          (1ULL << AV_CHAN_TOP_SIDE_LEFT        )\n#define AV_CH_TOP_SIDE_RIGHT         (1ULL << AV_CHAN_TOP_SIDE_RIGHT       )\n#define AV_CH_BOTTOM_FRONT_CENTER    (1ULL << AV_CHAN_BOTTOM_FRONT_CENTER  )\n#define AV_CH_BOTTOM_FRONT_LEFT      (1ULL << AV_CHAN_BOTTOM_FRONT_LEFT    )\n#define AV_CH_BOTTOM_FRONT_RIGHT     (1ULL << AV_CHAN_BOTTOM_FRONT_RIGHT   )\n#define AV_CH_SIDE_SURROUND_LEFT     (1ULL << AV_CHAN_SIDE_SURROUND_LEFT   )\n#define AV_CH_SIDE_SURROUND_RIGHT    (1ULL << AV_CHAN_SIDE_SURROUND_RIGHT  )\n#define AV_CH_TOP_SURROUND_LEFT      (1ULL << AV_CHAN_TOP_SURROUND_LEFT    )\n#define AV_CH_TOP_SURROUND_RIGHT     (1ULL << AV_CHAN_TOP_SURROUND_RIGHT   )\n#define AV_CH_BINAURAL_LEFT          (1ULL << AV_CHAN_BINAURAL_LEFT        )\n#define AV_CH_BINAURAL_RIGHT         (1ULL << AV_CHAN_BINAURAL_RIGHT       )\n\n/**\n * @}\n * @defgroup channel_mask_c Audio channel layouts\n * @{\n * */\n#define AV_CH_LAYOUT_MONO              (AV_CH_FRONT_CENTER)\n#define AV_CH_LAYOUT_STEREO            (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT)\n#define AV_CH_LAYOUT_2POINT1           (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY)\n#define AV_CH_LAYOUT_2_1               (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER)\n#define AV_CH_LAYOUT_SURROUND          (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER)\n#define AV_CH_LAYOUT_3POINT1           (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY)\n#define AV_CH_LAYOUT_4POINT0           (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_CENTER)\n#define AV_CH_LAYOUT_4POINT1           (AV_CH_LAYOUT_4POINT0|AV_CH_LOW_FREQUENCY)\n#define AV_CH_LAYOUT_2_2               (AV_CH_LAYOUT_STEREO|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)\n#define AV_CH_LAYOUT_QUAD              (AV_CH_LAYOUT_STEREO|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)\n#define AV_CH_LAYOUT_5POINT0           (AV_CH_LAYOUT_SURROUND|AV_CH_SIDE_LEFT|AV_CH_SIDE_RIGHT)\n#define AV_CH_LAYOUT_5POINT1           (AV_CH_LAYOUT_5POINT0|AV_CH_LOW_FREQUENCY)\n#define AV_CH_LAYOUT_5POINT0_BACK      (AV_CH_LAYOUT_SURROUND|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)\n#define AV_CH_LAYOUT_5POINT1_BACK      (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_LOW_FREQUENCY)\n#define AV_CH_LAYOUT_6POINT0           (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_CENTER)\n#define AV_CH_LAYOUT_6POINT0_FRONT     (AV_CH_LAYOUT_2_2|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)\n#define AV_CH_LAYOUT_HEXAGONAL         (AV_CH_LAYOUT_5POINT0_BACK|AV_CH_BACK_CENTER)\n#define AV_CH_LAYOUT_3POINT1POINT2     (AV_CH_LAYOUT_3POINT1|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT)\n#define AV_CH_LAYOUT_6POINT1           (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_CENTER)\n#define AV_CH_LAYOUT_6POINT1_BACK      (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_BACK_CENTER)\n#define AV_CH_LAYOUT_6POINT1_FRONT     (AV_CH_LAYOUT_6POINT0_FRONT|AV_CH_LOW_FREQUENCY)\n#define AV_CH_LAYOUT_7POINT0           (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)\n#define AV_CH_LAYOUT_7POINT0_FRONT     (AV_CH_LAYOUT_5POINT0|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)\n#define AV_CH_LAYOUT_7POINT1           (AV_CH_LAYOUT_5POINT1|AV_CH_BACK_LEFT|AV_CH_BACK_RIGHT)\n#define AV_CH_LAYOUT_7POINT1_WIDE      (AV_CH_LAYOUT_5POINT1|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)\n#define AV_CH_LAYOUT_7POINT1_WIDE_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)\n#define AV_CH_LAYOUT_5POINT1POINT2     (AV_CH_LAYOUT_5POINT1|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT)\n#define AV_CH_LAYOUT_5POINT1POINT2_BACK (AV_CH_LAYOUT_5POINT1_BACK|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT)\n#define AV_CH_LAYOUT_OCTAGONAL         (AV_CH_LAYOUT_5POINT0|AV_CH_BACK_LEFT|AV_CH_BACK_CENTER|AV_CH_BACK_RIGHT)\n#define AV_CH_LAYOUT_CUBE              (AV_CH_LAYOUT_QUAD|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT)\n#define AV_CH_LAYOUT_5POINT1POINT4_BACK (AV_CH_LAYOUT_5POINT1POINT2|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT)\n#define AV_CH_LAYOUT_7POINT1POINT2     (AV_CH_LAYOUT_7POINT1|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT)\n#define AV_CH_LAYOUT_7POINT1POINT4_BACK (AV_CH_LAYOUT_7POINT1POINT2|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT)\n#define AV_CH_LAYOUT_7POINT2POINT3     (AV_CH_LAYOUT_7POINT1POINT2|AV_CH_TOP_BACK_CENTER|AV_CH_LOW_FREQUENCY_2)\n#define AV_CH_LAYOUT_9POINT1POINT4_BACK (AV_CH_LAYOUT_7POINT1POINT4_BACK|AV_CH_FRONT_LEFT_OF_CENTER|AV_CH_FRONT_RIGHT_OF_CENTER)\n#define AV_CH_LAYOUT_9POINT1POINT6     (AV_CH_LAYOUT_9POINT1POINT4_BACK|AV_CH_TOP_SIDE_LEFT|AV_CH_TOP_SIDE_RIGHT)\n#define AV_CH_LAYOUT_HEXADECAGONAL     (AV_CH_LAYOUT_OCTAGONAL|AV_CH_WIDE_LEFT|AV_CH_WIDE_RIGHT|AV_CH_TOP_BACK_LEFT|AV_CH_TOP_BACK_RIGHT|AV_CH_TOP_BACK_CENTER|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_FRONT_LEFT|AV_CH_TOP_FRONT_RIGHT)\n#define AV_CH_LAYOUT_BINAURAL          (AV_CH_BINAURAL_LEFT|AV_CH_BINAURAL_RIGHT)\n#define AV_CH_LAYOUT_STEREO_DOWNMIX    (AV_CH_STEREO_LEFT|AV_CH_STEREO_RIGHT)\n#define AV_CH_LAYOUT_22POINT2          (AV_CH_LAYOUT_9POINT1POINT6|AV_CH_BACK_CENTER|AV_CH_LOW_FREQUENCY_2|AV_CH_TOP_FRONT_CENTER|AV_CH_TOP_CENTER|AV_CH_TOP_BACK_CENTER|AV_CH_BOTTOM_FRONT_CENTER|AV_CH_BOTTOM_FRONT_LEFT|AV_CH_BOTTOM_FRONT_RIGHT)\n\n#define AV_CH_LAYOUT_7POINT1_TOP_BACK AV_CH_LAYOUT_5POINT1POINT2_BACK\n\nenum AVMatrixEncoding {\n    AV_MATRIX_ENCODING_NONE,\n    AV_MATRIX_ENCODING_DOLBY,\n    AV_MATRIX_ENCODING_DPLII,\n    AV_MATRIX_ENCODING_DPLIIX,\n    AV_MATRIX_ENCODING_DPLIIZ,\n    AV_MATRIX_ENCODING_DOLBYEX,\n    AV_MATRIX_ENCODING_DOLBYHEADPHONE,\n    AV_MATRIX_ENCODING_NB\n};\n\n/**\n * @}\n */\n\n/**\n * An AVChannelCustom defines a single channel within a custom order layout\n *\n * Unlike most structures in FFmpeg, sizeof(AVChannelCustom) is a part of the\n * public ABI.\n *\n * No new fields may be added to it without a major version bump.\n */\ntypedef struct AVChannelCustom {\n    enum AVChannel id;\n    char name[16];\n    void *opaque;\n} AVChannelCustom;\n\n/**\n * An AVChannelLayout holds information about the channel layout of audio data.\n *\n * A channel layout here is defined as a set of channels ordered in a specific\n * way (unless the channel order is AV_CHANNEL_ORDER_UNSPEC, in which case an\n * AVChannelLayout carries only the channel count).\n * All orders may be treated as if they were AV_CHANNEL_ORDER_UNSPEC by\n * ignoring everything but the channel count, as long as av_channel_layout_check()\n * considers they are valid.\n *\n * Unlike most structures in FFmpeg, sizeof(AVChannelLayout) is a part of the\n * public ABI and may be used by the caller. E.g. it may be allocated on stack\n * or embedded in caller-defined structs.\n *\n * AVChannelLayout can be initialized as follows:\n * - default initialization with {0}, followed by setting all used fields\n *   correctly;\n * - by assigning one of the predefined AV_CHANNEL_LAYOUT_* initializers;\n * - with a constructor function, such as av_channel_layout_default(),\n *   av_channel_layout_from_mask() or av_channel_layout_from_string().\n *\n * The channel layout must be uninitialized with av_channel_layout_uninit()\n *\n * Copying an AVChannelLayout via assigning is forbidden,\n * av_channel_layout_copy() must be used instead (and its return value should\n * be checked)\n *\n * No new fields may be added to it without a major version bump, except for\n * new elements of the union fitting in sizeof(uint64_t).\n */\ntypedef struct AVChannelLayout {\n    /**\n     * Channel order used in this layout.\n     * This is a mandatory field.\n     */\n    enum AVChannelOrder order;\n\n    /**\n     * Number of channels in this layout. Mandatory field.\n     */\n    int nb_channels;\n\n    /**\n     * Details about which channels are present in this layout.\n     * For AV_CHANNEL_ORDER_UNSPEC, this field is undefined and must not be\n     * used.\n     */\n    union {\n        /**\n         * This member must be used for AV_CHANNEL_ORDER_NATIVE, and may be used\n         * for AV_CHANNEL_ORDER_AMBISONIC to signal non-diegetic channels.\n         * It is a bitmask, where the position of each set bit means that the\n         * AVChannel with the corresponding value is present.\n         *\n         * I.e. when (mask & (1 << AV_CHAN_FOO)) is non-zero, then AV_CHAN_FOO\n         * is present in the layout. Otherwise it is not present.\n         *\n         * @note when a channel layout using a bitmask is constructed or\n         * modified manually (i.e.  not using any of the av_channel_layout_*\n         * functions), the code doing it must ensure that the number of set bits\n         * is equal to nb_channels.\n         */\n        uint64_t mask;\n        /**\n         * This member must be used when the channel order is\n         * AV_CHANNEL_ORDER_CUSTOM. It is a nb_channels-sized array, with each\n         * element signalling the presence of the AVChannel with the\n         * corresponding value in map[i].id.\n         *\n         * I.e. when map[i].id is equal to AV_CHAN_FOO, then AV_CH_FOO is the\n         * i-th channel in the audio data.\n         *\n         * When map[i].id is in the range between AV_CHAN_AMBISONIC_BASE and\n         * AV_CHAN_AMBISONIC_END (inclusive), the channel contains an ambisonic\n         * component with ACN index (as defined above)\n         * n = map[i].id - AV_CHAN_AMBISONIC_BASE.\n         *\n         * map[i].name may be filled with a 0-terminated string, in which case\n         * it will be used for the purpose of identifying the channel with the\n         * convenience functions below. Otherwise it must be zeroed.\n         */\n        AVChannelCustom *map;\n    } u;\n\n    /**\n     * For some private data of the user.\n     */\n    void *opaque;\n} AVChannelLayout;\n\n/**\n * Macro to define native channel layouts\n *\n * @note This doesn't use designated initializers for compatibility with C++ 17 and older.\n */\n#define AV_CHANNEL_LAYOUT_MASK(nb, m) \\\n    { /* .order */ AV_CHANNEL_ORDER_NATIVE, \\\n      /* .nb_channels */  (nb), \\\n      /* .u.mask */ { m }, \\\n      /* .opaque */ NULL }\n\n/**\n * @name Common pre-defined channel layouts\n * @{\n */\n#define AV_CHANNEL_LAYOUT_MONO              AV_CHANNEL_LAYOUT_MASK(1,  AV_CH_LAYOUT_MONO)\n#define AV_CHANNEL_LAYOUT_STEREO            AV_CHANNEL_LAYOUT_MASK(2,  AV_CH_LAYOUT_STEREO)\n#define AV_CHANNEL_LAYOUT_2POINT1           AV_CHANNEL_LAYOUT_MASK(3,  AV_CH_LAYOUT_2POINT1)\n#define AV_CHANNEL_LAYOUT_2_1               AV_CHANNEL_LAYOUT_MASK(3,  AV_CH_LAYOUT_2_1)\n#define AV_CHANNEL_LAYOUT_SURROUND          AV_CHANNEL_LAYOUT_MASK(3,  AV_CH_LAYOUT_SURROUND)\n#define AV_CHANNEL_LAYOUT_3POINT1           AV_CHANNEL_LAYOUT_MASK(4,  AV_CH_LAYOUT_3POINT1)\n#define AV_CHANNEL_LAYOUT_4POINT0           AV_CHANNEL_LAYOUT_MASK(4,  AV_CH_LAYOUT_4POINT0)\n#define AV_CHANNEL_LAYOUT_4POINT1           AV_CHANNEL_LAYOUT_MASK(5,  AV_CH_LAYOUT_4POINT1)\n#define AV_CHANNEL_LAYOUT_2_2               AV_CHANNEL_LAYOUT_MASK(4,  AV_CH_LAYOUT_2_2)\n#define AV_CHANNEL_LAYOUT_QUAD              AV_CHANNEL_LAYOUT_MASK(4,  AV_CH_LAYOUT_QUAD)\n#define AV_CHANNEL_LAYOUT_5POINT0           AV_CHANNEL_LAYOUT_MASK(5,  AV_CH_LAYOUT_5POINT0)\n#define AV_CHANNEL_LAYOUT_5POINT1           AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_5POINT1)\n#define AV_CHANNEL_LAYOUT_5POINT0_BACK      AV_CHANNEL_LAYOUT_MASK(5,  AV_CH_LAYOUT_5POINT0_BACK)\n#define AV_CHANNEL_LAYOUT_5POINT1_BACK      AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_5POINT1_BACK)\n#define AV_CHANNEL_LAYOUT_6POINT0           AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_6POINT0)\n#define AV_CHANNEL_LAYOUT_6POINT0_FRONT     AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_6POINT0_FRONT)\n#define AV_CHANNEL_LAYOUT_3POINT1POINT2     AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_3POINT1POINT2)\n#define AV_CHANNEL_LAYOUT_HEXAGONAL         AV_CHANNEL_LAYOUT_MASK(6,  AV_CH_LAYOUT_HEXAGONAL)\n#define AV_CHANNEL_LAYOUT_6POINT1           AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_6POINT1)\n#define AV_CHANNEL_LAYOUT_6POINT1_BACK      AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_6POINT1_BACK)\n#define AV_CHANNEL_LAYOUT_6POINT1_FRONT     AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_6POINT1_FRONT)\n#define AV_CHANNEL_LAYOUT_7POINT0           AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_7POINT0)\n#define AV_CHANNEL_LAYOUT_7POINT0_FRONT     AV_CHANNEL_LAYOUT_MASK(7,  AV_CH_LAYOUT_7POINT0_FRONT)\n#define AV_CHANNEL_LAYOUT_7POINT1           AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_7POINT1)\n#define AV_CHANNEL_LAYOUT_7POINT1_WIDE      AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_7POINT1_WIDE)\n#define AV_CHANNEL_LAYOUT_7POINT1_WIDE_BACK AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_7POINT1_WIDE_BACK)\n#define AV_CHANNEL_LAYOUT_5POINT1POINT2     AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_5POINT1POINT2)\n#define AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK AV_CHANNEL_LAYOUT_MASK(8, AV_CH_LAYOUT_5POINT1POINT2_BACK)\n#define AV_CHANNEL_LAYOUT_OCTAGONAL         AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_OCTAGONAL)\n#define AV_CHANNEL_LAYOUT_CUBE              AV_CHANNEL_LAYOUT_MASK(8,  AV_CH_LAYOUT_CUBE)\n#define AV_CHANNEL_LAYOUT_5POINT1POINT4_BACK AV_CHANNEL_LAYOUT_MASK(10, AV_CH_LAYOUT_5POINT1POINT4_BACK)\n#define AV_CHANNEL_LAYOUT_7POINT1POINT2     AV_CHANNEL_LAYOUT_MASK(10, AV_CH_LAYOUT_7POINT1POINT2)\n#define AV_CHANNEL_LAYOUT_7POINT1POINT4_BACK AV_CHANNEL_LAYOUT_MASK(12, AV_CH_LAYOUT_7POINT1POINT4_BACK)\n#define AV_CHANNEL_LAYOUT_7POINT2POINT3     AV_CHANNEL_LAYOUT_MASK(12, AV_CH_LAYOUT_7POINT2POINT3)\n#define AV_CHANNEL_LAYOUT_9POINT1POINT4_BACK AV_CHANNEL_LAYOUT_MASK(14, AV_CH_LAYOUT_9POINT1POINT4_BACK)\n#define AV_CHANNEL_LAYOUT_9POINT1POINT6     AV_CHANNEL_LAYOUT_MASK(16, AV_CH_LAYOUT_9POINT1POINT6)\n#define AV_CHANNEL_LAYOUT_HEXADECAGONAL     AV_CHANNEL_LAYOUT_MASK(16, AV_CH_LAYOUT_HEXADECAGONAL)\n#define AV_CHANNEL_LAYOUT_BINAURAL          AV_CHANNEL_LAYOUT_MASK(2,  AV_CH_LAYOUT_BINAURAL)\n#define AV_CHANNEL_LAYOUT_STEREO_DOWNMIX    AV_CHANNEL_LAYOUT_MASK(2,  AV_CH_LAYOUT_STEREO_DOWNMIX)\n#define AV_CHANNEL_LAYOUT_22POINT2          AV_CHANNEL_LAYOUT_MASK(24, AV_CH_LAYOUT_22POINT2)\n\n#define AV_CHANNEL_LAYOUT_7POINT1_TOP_BACK  AV_CHANNEL_LAYOUT_5POINT1POINT2_BACK\n\n#define AV_CHANNEL_LAYOUT_AMBISONIC_FIRST_ORDER \\\n    { /* .order */ AV_CHANNEL_ORDER_AMBISONIC, \\\n      /* .nb_channels */ 4, \\\n      /* .u.mask */ { 0 }, \\\n      /* .opaque */ NULL }\n/** @} */\n\nstruct AVBPrint;\n\n/**\n * Get a human readable string in an abbreviated form describing a given channel.\n * This is the inverse function of @ref av_channel_from_string().\n *\n * @param buf pre-allocated buffer where to put the generated string\n * @param buf_size size in bytes of the buffer.\n * @param channel the AVChannel whose name to get\n * @return amount of bytes needed to hold the output string, or a negative AVERROR\n *         on failure. If the returned value is bigger than buf_size, then the\n *         string was truncated.\n */\nint av_channel_name(char *buf, size_t buf_size, enum AVChannel channel);\n\n/**\n * bprint variant of av_channel_name().\n *\n * @note the string will be appended to the bprint buffer.\n */\nvoid av_channel_name_bprint(struct AVBPrint *bp, enum AVChannel channel_id);\n\n/**\n * Get a human readable string describing a given channel.\n *\n * @param buf pre-allocated buffer where to put the generated string\n * @param buf_size size in bytes of the buffer.\n * @param channel the AVChannel whose description to get\n * @return amount of bytes needed to hold the output string, or a negative AVERROR\n *         on failure. If the returned value is bigger than buf_size, then the\n *         string was truncated.\n */\nint av_channel_description(char *buf, size_t buf_size, enum AVChannel channel);\n\n/**\n * bprint variant of av_channel_description().\n *\n * @note the string will be appended to the bprint buffer.\n */\nvoid av_channel_description_bprint(struct AVBPrint *bp, enum AVChannel channel_id);\n\n/**\n * This is the inverse function of @ref av_channel_name().\n *\n * @return the channel with the given name\n *         AV_CHAN_NONE when name does not identify a known channel\n */\nenum AVChannel av_channel_from_string(const char *name);\n\n/**\n * Initialize a custom channel layout with the specified number of channels.\n * The channel map will be allocated and the designation of all channels will\n * be set to AV_CHAN_UNKNOWN.\n *\n * This is only a convenience helper function, a custom channel layout can also\n * be constructed without using this.\n *\n * @param channel_layout the layout structure to be initialized\n * @param nb_channels the number of channels\n *\n * @return 0 on success\n *         AVERROR(EINVAL) if the number of channels <= 0\n *         AVERROR(ENOMEM) if the channel map could not be allocated\n */\nint av_channel_layout_custom_init(AVChannelLayout *channel_layout, int nb_channels);\n\n/**\n * Initialize a native channel layout from a bitmask indicating which channels\n * are present.\n *\n * @param channel_layout the layout structure to be initialized\n * @param mask bitmask describing the channel layout\n *\n * @return 0 on success\n *         AVERROR(EINVAL) for invalid mask values\n */\nint av_channel_layout_from_mask(AVChannelLayout *channel_layout, uint64_t mask);\n\n/**\n * Initialize a channel layout from a given string description.\n * The input string can be represented by:\n *  - the formal channel layout name (returned by av_channel_layout_describe())\n *  - single or multiple channel names (returned by av_channel_name(), eg. \"FL\",\n *    or concatenated with \"+\", each optionally containing a custom name after\n *    a \"@\", eg. \"FL@Left+FR@Right+LFE\")\n *  - a decimal or hexadecimal value of a native channel layout (eg. \"4\" or \"0x4\")\n *  - the number of channels with default layout (eg. \"4c\")\n *  - the number of unordered channels (eg. \"4C\" or \"4 channels\")\n *  - the ambisonic order followed by optional non-diegetic channels (eg.\n *    \"ambisonic 2+stereo\")\n * On error, the channel layout will remain uninitialized, but not necessarily\n * untouched.\n *\n * @param channel_layout uninitialized channel layout for the result\n * @param str string describing the channel layout\n * @return 0 on success parsing the channel layout\n *         AVERROR(EINVAL) if an invalid channel layout string was provided\n *         AVERROR(ENOMEM) if there was not enough memory\n */\nint av_channel_layout_from_string(AVChannelLayout *channel_layout,\n                                  const char *str);\n\n/**\n * Get the default channel layout for a given number of channels.\n *\n * @param ch_layout the layout structure to be initialized\n * @param nb_channels number of channels\n */\nvoid av_channel_layout_default(AVChannelLayout *ch_layout, int nb_channels);\n\n/**\n * Iterate over all standard channel layouts.\n *\n * @param opaque a pointer where libavutil will store the iteration state. Must\n *               point to NULL to start the iteration.\n *\n * @return the standard channel layout or NULL when the iteration is\n *         finished\n */\nconst AVChannelLayout *av_channel_layout_standard(void **opaque);\n\n/**\n * Free any allocated data in the channel layout and reset the channel\n * count to 0.\n *\n * @param channel_layout the layout structure to be uninitialized\n */\nvoid av_channel_layout_uninit(AVChannelLayout *channel_layout);\n\n/**\n * Make a copy of a channel layout. This differs from just assigning src to dst\n * in that it allocates and copies the map for AV_CHANNEL_ORDER_CUSTOM.\n *\n * @note the destination channel_layout will be always uninitialized before copy.\n *\n * @param dst destination channel layout\n * @param src source channel layout\n * @return 0 on success, a negative AVERROR on error.\n */\nint av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src);\n\n/**\n * Get a human-readable string describing the channel layout properties.\n * The string will be in the same format that is accepted by\n * @ref av_channel_layout_from_string(), allowing to rebuild the same\n * channel layout, except for opaque pointers.\n *\n * @param channel_layout channel layout to be described\n * @param buf pre-allocated buffer where to put the generated string\n * @param buf_size size in bytes of the buffer.\n * @return amount of bytes needed to hold the output string, or a negative AVERROR\n *         on failure. If the returned value is bigger than buf_size, then the\n *         string was truncated.\n */\nint av_channel_layout_describe(const AVChannelLayout *channel_layout,\n                               char *buf, size_t buf_size);\n\n/**\n * bprint variant of av_channel_layout_describe().\n *\n * @note the string will be appended to the bprint buffer.\n * @return 0 on success, or a negative AVERROR value on failure.\n */\nint av_channel_layout_describe_bprint(const AVChannelLayout *channel_layout,\n                                      struct AVBPrint *bp);\n\n/**\n * Get the channel with the given index in a channel layout.\n *\n * @param channel_layout input channel layout\n * @param idx index of the channel\n * @return channel with the index idx in channel_layout on success or\n *         AV_CHAN_NONE on failure (if idx is not valid or the channel order is\n *         unspecified)\n */\nenum AVChannel\nav_channel_layout_channel_from_index(const AVChannelLayout *channel_layout, unsigned int idx);\n\n/**\n * Get the index of a given channel in a channel layout. In case multiple\n * channels are found, only the first match will be returned.\n *\n * @param channel_layout input channel layout\n * @param channel the channel whose index to obtain\n * @return index of channel in channel_layout on success or a negative number if\n *         channel is not present in channel_layout.\n */\nint av_channel_layout_index_from_channel(const AVChannelLayout *channel_layout,\n                                         enum AVChannel channel);\n\n/**\n * Get the index in a channel layout of a channel described by the given string.\n * In case multiple channels are found, only the first match will be returned.\n *\n * This function accepts channel names in the same format as\n * @ref av_channel_from_string().\n *\n * @param channel_layout input channel layout\n * @param name string describing the channel whose index to obtain\n * @return a channel index described by the given string, or a negative AVERROR\n *         value.\n */\nint av_channel_layout_index_from_string(const AVChannelLayout *channel_layout,\n                                        const char *name);\n\n/**\n * Get a channel described by the given string.\n *\n * This function accepts channel names in the same format as\n * @ref av_channel_from_string().\n *\n * @param channel_layout input channel layout\n * @param name string describing the channel to obtain\n * @return a channel described by the given string in channel_layout on success\n *         or AV_CHAN_NONE on failure (if the string is not valid or the channel\n *         order is unspecified)\n */\nenum AVChannel\nav_channel_layout_channel_from_string(const AVChannelLayout *channel_layout,\n                                      const char *name);\n\n/**\n * Find out what channels from a given set are present in a channel layout,\n * without regard for their positions.\n *\n * @param channel_layout input channel layout\n * @param mask a combination of AV_CH_* representing a set of channels\n * @return a bitfield representing all the channels from mask that are present\n *         in channel_layout\n */\nuint64_t av_channel_layout_subset(const AVChannelLayout *channel_layout,\n                                  uint64_t mask);\n\n/**\n * Check whether a channel layout is valid, i.e. can possibly describe audio\n * data.\n *\n * @param channel_layout input channel layout\n * @return 1 if channel_layout is valid, 0 otherwise.\n */\nint av_channel_layout_check(const AVChannelLayout *channel_layout);\n\n/**\n * Check whether two channel layouts are semantically the same, i.e. the same\n * channels are present on the same positions in both.\n *\n * If one of the channel layouts is AV_CHANNEL_ORDER_UNSPEC, while the other is\n * not, they are considered to be unequal. If both are AV_CHANNEL_ORDER_UNSPEC,\n * they are considered equal iff the channel counts are the same in both.\n *\n * @param chl input channel layout\n * @param chl1 input channel layout\n * @return 0 if chl and chl1 are equal, 1 if they are not equal. A negative\n *         AVERROR code if one or both are invalid.\n */\nint av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1);\n\n/**\n * Return the order if the layout is n-th order standard-order ambisonic.\n * The presence of optional extra non-diegetic channels at the end is not taken\n * into account.\n *\n * @param channel_layout input channel layout\n * @return the order of the layout, a negative error code otherwise.\n */\nint av_channel_layout_ambisonic_order(const AVChannelLayout *channel_layout);\n\n/**\n * The conversion must be lossless.\n */\n#define AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS (1 << 0)\n\n/**\n * The specified retype target order is ignored and the simplest possible\n * (canonical) order is used for which the input layout can be losslessy\n * represented.\n */\n#define AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL (1 << 1)\n\n/**\n * Change the AVChannelOrder of a channel layout.\n *\n * Change of AVChannelOrder can be either lossless or lossy. In case of a\n * lossless conversion all the channel designations and the associated channel\n * names (if any) are kept. On a lossy conversion the channel names and channel\n * designations might be lost depending on the capabilities of the desired\n * AVChannelOrder. Note that some conversions are simply not possible in which\n * case this function returns AVERROR(ENOSYS).\n *\n * The following conversions are supported:\n *\n * Any       -> Custom     : Always possible, always lossless.\n * Any       -> Unspecified: Always possible, lossless if channel designations\n *   are all unknown and channel names are not used, lossy otherwise.\n * Custom    -> Ambisonic  : Possible if it contains ambisonic channels with\n *   optional non-diegetic channels in the end. Lossy if the channels have\n *   custom names, lossless otherwise.\n * Custom    -> Native     : Possible if it contains native channels in native\n *     order. Lossy if the channels have custom names, lossless otherwise.\n *\n * On error this function keeps the original channel layout untouched.\n *\n * @param channel_layout channel layout which will be changed\n * @param order the desired channel layout order\n * @param flags a combination of AV_CHANNEL_LAYOUT_RETYPE_FLAG_* constants\n * @return 0 if the conversion was successful and lossless or if the channel\n *           layout was already in the desired order\n *         >0 if the conversion was successful but lossy\n *         AVERROR(ENOSYS) if the conversion was not possible (or would be\n *           lossy and AV_CHANNEL_LAYOUT_RETYPE_FLAG_LOSSLESS was specified)\n *         AVERROR(EINVAL), AVERROR(ENOMEM) on error\n */\nint av_channel_layout_retype(AVChannelLayout *channel_layout, enum AVChannelOrder order, int flags);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_CHANNEL_LAYOUT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/common.h",
    "content": "/*\n * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * common internal and external API header\n */\n\n#ifndef AVUTIL_COMMON_H\n#define AVUTIL_COMMON_H\n\n#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C)\n#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS\n#endif\n\n#include <errno.h>\n#include <inttypes.h>\n#include <limits.h>\n#include <math.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"attributes.h\"\n#include \"error.h\"\n#include \"macros.h\"\n#include \"version.h\"\n\n#ifdef HAVE_AV_CONFIG_H\n#   include \"config.h\"\n#   include \"intmath.h\"\n#   include \"internal.h\"\n#else\n#   include \"mem.h\"\n#endif /* HAVE_AV_CONFIG_H */\n\n//rounded division & shift\n#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))\n/* assume b>0 */\n#define ROUNDED_DIV(a,b) (((a)>=0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))\n/* Fast a/(1<<b) rounded toward +inf. Assume a>=0 and b>=0 */\n#define AV_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \\\n                                                       : ((a) + (1<<(b)) - 1) >> (b))\n/* Backwards compat. */\n#define FF_CEIL_RSHIFT AV_CEIL_RSHIFT\n\n#define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b))\n#define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b))\n\n/**\n * Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they\n * are not representable as absolute values of their type. This is the same\n * as with *abs()\n * @see FFNABS()\n */\n#define FFABS(a) ((a) >= 0 ? (a) : (-(a)))\n#define FFSIGN(a) ((a) > 0 ? 1 : -1)\n\n/**\n * Negative Absolute value.\n * this works for all integers of all types.\n * As with many macros, this evaluates its argument twice, it thus must not have\n * a sideeffect, that is FFNABS(x++) has undefined behavior.\n */\n#define FFNABS(a) ((a) <= 0 ? (a) : (-(a)))\n\n/**\n * Unsigned Absolute value.\n * This takes the absolute value of a signed int and returns it as a unsigned.\n * This also works with INT_MIN which would otherwise not be representable\n * As with many macros, this evaluates its argument twice.\n */\n#define FFABSU(a) ((a) <= 0 ? -(unsigned)(a) : (unsigned)(a))\n#define FFABS64U(a) ((a) <= 0 ? -(uint64_t)(a) : (uint64_t)(a))\n\n/* misc math functions */\n\n#ifndef av_ceil_log2\n#   define av_ceil_log2     av_ceil_log2_c\n#endif\n#ifndef av_clip\n#   define av_clip          av_clip_c\n#endif\n#ifndef av_clip64\n#   define av_clip64        av_clip64_c\n#endif\n#ifndef av_clip_uint8\n#   define av_clip_uint8    av_clip_uint8_c\n#endif\n#ifndef av_clip_int8\n#   define av_clip_int8     av_clip_int8_c\n#endif\n#ifndef av_clip_uint16\n#   define av_clip_uint16   av_clip_uint16_c\n#endif\n#ifndef av_clip_int16\n#   define av_clip_int16    av_clip_int16_c\n#endif\n#ifndef av_clipl_int32\n#   define av_clipl_int32   av_clipl_int32_c\n#endif\n#ifndef av_clip_intp2\n#   define av_clip_intp2    av_clip_intp2_c\n#endif\n#ifndef av_clip_uintp2\n#   define av_clip_uintp2   av_clip_uintp2_c\n#endif\n#ifndef av_sat_add32\n#   define av_sat_add32     av_sat_add32_c\n#endif\n#ifndef av_sat_dadd32\n#   define av_sat_dadd32    av_sat_dadd32_c\n#endif\n#ifndef av_sat_sub32\n#   define av_sat_sub32     av_sat_sub32_c\n#endif\n#ifndef av_sat_dsub32\n#   define av_sat_dsub32    av_sat_dsub32_c\n#endif\n#ifndef av_sat_add64\n#   define av_sat_add64     av_sat_add64_c\n#endif\n#ifndef av_sat_sub64\n#   define av_sat_sub64     av_sat_sub64_c\n#endif\n#ifndef av_clipf\n#   define av_clipf         av_clipf_c\n#endif\n#ifndef av_clipd\n#   define av_clipd         av_clipd_c\n#endif\n#ifndef av_zero_extend\n#   define av_zero_extend   av_zero_extend_c\n#endif\n#ifndef av_popcount\n#   define av_popcount      av_popcount_c\n#endif\n#ifndef av_popcount64\n#   define av_popcount64    av_popcount64_c\n#endif\n#ifndef av_parity\n#   define av_parity        av_parity_c\n#endif\n\n#ifndef av_log2\nav_const int av_log2(unsigned v);\n#endif\n\n#ifndef av_log2_16bit\nav_const int av_log2_16bit(unsigned v);\n#endif\n\n/**\n * Clip a signed integer value into the amin-amax range.\n * @param a value to clip\n * @param amin minimum value of the clip range\n * @param amax maximum value of the clip range\n * @return clipped value\n */\nstatic av_always_inline av_const int av_clip_c(int a, int amin, int amax)\n{\n#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2\n    if (amin > amax) abort();\n#endif\n    if      (a < amin) return amin;\n    else if (a > amax) return amax;\n    else               return a;\n}\n\n/**\n * Clip a signed 64bit integer value into the amin-amax range.\n * @param a value to clip\n * @param amin minimum value of the clip range\n * @param amax maximum value of the clip range\n * @return clipped value\n */\nstatic av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, int64_t amax)\n{\n#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2\n    if (amin > amax) abort();\n#endif\n    if      (a < amin) return amin;\n    else if (a > amax) return amax;\n    else               return a;\n}\n\n/**\n * Clip a signed integer value into the 0-255 range.\n * @param a value to clip\n * @return clipped value\n */\nstatic av_always_inline av_const uint8_t av_clip_uint8_c(int a)\n{\n    if (a&(~0xFF)) return (~a)>>31;\n    else           return a;\n}\n\n/**\n * Clip a signed integer value into the -128,127 range.\n * @param a value to clip\n * @return clipped value\n */\nstatic av_always_inline av_const int8_t av_clip_int8_c(int a)\n{\n    if ((a+0x80U) & ~0xFF) return (a>>31) ^ 0x7F;\n    else                  return a;\n}\n\n/**\n * Clip a signed integer value into the 0-65535 range.\n * @param a value to clip\n * @return clipped value\n */\nstatic av_always_inline av_const uint16_t av_clip_uint16_c(int a)\n{\n    if (a&(~0xFFFF)) return (~a)>>31;\n    else             return a;\n}\n\n/**\n * Clip a signed integer value into the -32768,32767 range.\n * @param a value to clip\n * @return clipped value\n */\nstatic av_always_inline av_const int16_t av_clip_int16_c(int a)\n{\n    if ((a+0x8000U) & ~0xFFFF) return (a>>31) ^ 0x7FFF;\n    else                      return a;\n}\n\n/**\n * Clip a signed 64-bit integer value into the -2147483648,2147483647 range.\n * @param a value to clip\n * @return clipped value\n */\nstatic av_always_inline av_const int32_t av_clipl_int32_c(int64_t a)\n{\n    if ((a+UINT64_C(0x80000000)) & ~UINT64_C(0xFFFFFFFF)) return (int32_t)((a>>63) ^ 0x7FFFFFFF);\n    else                                                  return (int32_t)a;\n}\n\n/**\n * Clip a signed integer into the -(2^p),(2^p-1) range.\n * @param  a value to clip\n * @param  p bit position to clip at\n * @return clipped value\n */\nstatic av_always_inline av_const int av_clip_intp2_c(int a, int p)\n{\n    if (((unsigned)a + (1U << p)) & ~((2U << p) - 1))\n        return (a >> 31) ^ ((1 << p) - 1);\n    else\n        return a;\n}\n\n/**\n * Clip a signed integer to an unsigned power of two range.\n * @param  a value to clip\n * @param  p bit position to clip at\n * @return clipped value\n */\nstatic av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p)\n{\n    if (a & ~((1U<<p) - 1)) return (~a) >> 31 & ((1U<<p) - 1);\n    else                    return  a;\n}\n\n/**\n * Clear high bits from an unsigned integer starting with specific bit position\n * @param  a value to clip\n * @param  p bit position to clip at. Must be between 0 and 31.\n * @return clipped value\n */\nstatic av_always_inline av_const unsigned av_zero_extend_c(unsigned a, unsigned p)\n{\n#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2\n    if (p > 31) abort();\n#endif\n    return a & ((1U << p) - 1);\n}\n\n#if FF_API_MOD_UINTP2\n#ifndef av_mod_uintp2\n#   define av_mod_uintp2 av_mod_uintp2_c\n#endif\nattribute_deprecated\nstatic av_always_inline av_const unsigned av_mod_uintp2_c(unsigned a, unsigned p)\n{\n    return av_zero_extend_c(a, p);\n}\n#endif\n\n/**\n * Add two signed 32-bit values with saturation.\n *\n * @param  a one value\n * @param  b another value\n * @return sum with signed saturation\n */\nstatic av_always_inline int av_sat_add32_c(int a, int b)\n{\n    return av_clipl_int32((int64_t)a + b);\n}\n\n/**\n * Add a doubled value to another value with saturation at both stages.\n *\n * @param  a first value\n * @param  b value doubled and added to a\n * @return sum sat(a + sat(2*b)) with signed saturation\n */\nstatic av_always_inline int av_sat_dadd32_c(int a, int b)\n{\n    return av_sat_add32(a, av_sat_add32(b, b));\n}\n\n/**\n * Subtract two signed 32-bit values with saturation.\n *\n * @param  a one value\n * @param  b another value\n * @return difference with signed saturation\n */\nstatic av_always_inline int av_sat_sub32_c(int a, int b)\n{\n    return av_clipl_int32((int64_t)a - b);\n}\n\n/**\n * Subtract a doubled value from another value with saturation at both stages.\n *\n * @param  a first value\n * @param  b value doubled and subtracted from a\n * @return difference sat(a - sat(2*b)) with signed saturation\n */\nstatic av_always_inline int av_sat_dsub32_c(int a, int b)\n{\n    return av_sat_sub32(a, av_sat_add32(b, b));\n}\n\n/**\n * Add two signed 64-bit values with saturation.\n *\n * @param  a one value\n * @param  b another value\n * @return sum with signed saturation\n */\nstatic av_always_inline int64_t av_sat_add64_c(int64_t a, int64_t b) {\n#if (!defined(__INTEL_COMPILER) && AV_GCC_VERSION_AT_LEAST(5,1)) || AV_HAS_BUILTIN(__builtin_add_overflow)\n    int64_t tmp;\n    return !__builtin_add_overflow(a, b, &tmp) ? tmp : (tmp < 0 ? INT64_MAX : INT64_MIN);\n#else\n    int64_t s = a+(uint64_t)b;\n    if ((int64_t)(a^b | ~s^b) >= 0)\n        return INT64_MAX ^ (b >> 63);\n    return s;\n#endif\n}\n\n/**\n * Subtract two signed 64-bit values with saturation.\n *\n * @param  a one value\n * @param  b another value\n * @return difference with signed saturation\n */\nstatic av_always_inline int64_t av_sat_sub64_c(int64_t a, int64_t b) {\n#if (!defined(__INTEL_COMPILER) && AV_GCC_VERSION_AT_LEAST(5,1)) || AV_HAS_BUILTIN(__builtin_sub_overflow)\n    int64_t tmp;\n    return !__builtin_sub_overflow(a, b, &tmp) ? tmp : (tmp < 0 ? INT64_MAX : INT64_MIN);\n#else\n    if (b <= 0 && a >= INT64_MAX + b)\n        return INT64_MAX;\n    if (b >= 0 && a <= INT64_MIN + b)\n        return INT64_MIN;\n    return a - b;\n#endif\n}\n\n/**\n * Clip a float value into the amin-amax range.\n * If a is nan or -inf amin will be returned.\n * If a is +inf amax will be returned.\n * @param a value to clip\n * @param amin minimum value of the clip range\n * @param amax maximum value of the clip range\n * @return clipped value\n */\nstatic av_always_inline av_const float av_clipf_c(float a, float amin, float amax)\n{\n#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2\n    if (amin > amax) abort();\n#endif\n    return FFMIN(FFMAX(a, amin), amax);\n}\n\n/**\n * Clip a double value into the amin-amax range.\n * If a is nan or -inf amin will be returned.\n * If a is +inf amax will be returned.\n * @param a value to clip\n * @param amin minimum value of the clip range\n * @param amax maximum value of the clip range\n * @return clipped value\n */\nstatic av_always_inline av_const double av_clipd_c(double a, double amin, double amax)\n{\n#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2\n    if (amin > amax) abort();\n#endif\n    return FFMIN(FFMAX(a, amin), amax);\n}\n\n/** Compute ceil(log2(x)).\n * @param x value used to compute ceil(log2(x))\n * @return computed ceiling of log2(x)\n */\nstatic av_always_inline av_const int av_ceil_log2_c(int x)\n{\n    return av_log2((x - 1U) << 1);\n}\n\n/**\n * Count number of bits set to one in x\n * @param x value to count bits of\n * @return the number of bits set to one in x\n */\nstatic av_always_inline av_const int av_popcount_c(uint32_t x)\n{\n    x -= (x >> 1) & 0x55555555;\n    x = (x & 0x33333333) + ((x >> 2) & 0x33333333);\n    x = (x + (x >> 4)) & 0x0F0F0F0F;\n    x += x >> 8;\n    return (x + (x >> 16)) & 0x3F;\n}\n\n/**\n * Count number of bits set to one in x\n * @param x value to count bits of\n * @return the number of bits set to one in x\n */\nstatic av_always_inline av_const int av_popcount64_c(uint64_t x)\n{\n    return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32));\n}\n\nstatic av_always_inline av_const int av_parity_c(uint32_t v)\n{\n    return av_popcount(v) & 1;\n}\n\n/**\n * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.\n *\n * @param val      Output value, must be an lvalue of type uint32_t.\n * @param GET_BYTE Expression reading one byte from the input.\n *                 Evaluated up to 7 times (4 for the currently\n *                 assigned Unicode range).  With a memory buffer\n *                 input, this could be *ptr++, or if you want to make sure\n *                 that *ptr stops at the end of a NULL terminated string then\n *                 *ptr ? *ptr++ : 0\n * @param ERROR    Expression to be evaluated on invalid input,\n *                 typically a goto statement.\n *\n * @warning ERROR should not contain a loop control statement which\n * could interact with the internal while loop, and should force an\n * exit from the macro code (e.g. through a goto or a return) in order\n * to prevent undefined results.\n */\n#define GET_UTF8(val, GET_BYTE, ERROR)\\\n    val= (uint8_t)(GET_BYTE);\\\n    {\\\n        uint32_t top = (val & 128) >> 1;\\\n        if ((val & 0xc0) == 0x80 || val >= 0xFE)\\\n            {ERROR}\\\n        while (val & top) {\\\n            unsigned int tmp = (uint8_t)(GET_BYTE) - 128;\\\n            if(tmp>>6)\\\n                {ERROR}\\\n            val= (val<<6) + tmp;\\\n            top <<= 5;\\\n        }\\\n        val &= (top << 1) - 1;\\\n    }\n\n/**\n * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form.\n *\n * @param val       Output value, must be an lvalue of type uint32_t.\n * @param GET_16BIT Expression returning two bytes of UTF-16 data converted\n *                  to native byte order.  Evaluated one or two times.\n * @param ERROR     Expression to be evaluated on invalid input,\n *                  typically a goto statement.\n */\n#define GET_UTF16(val, GET_16BIT, ERROR)\\\n    val = (uint16_t)(GET_16BIT);\\\n    {\\\n        unsigned int hi = val - 0xD800;\\\n        if (hi < 0x800) {\\\n            val = (uint16_t)(GET_16BIT) - 0xDC00;\\\n            if (val > 0x3FFU || hi > 0x3FFU)\\\n                {ERROR}\\\n            val += (hi<<10) + 0x10000;\\\n        }\\\n    }\\\n\n/**\n * @def PUT_UTF8(val, tmp, PUT_BYTE)\n * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long).\n * @param val is an input-only argument and should be of type uint32_t. It holds\n * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If\n * val is given as a function it is executed only once.\n * @param tmp is a temporary variable and should be of type uint8_t. It\n * represents an intermediate value during conversion that is to be\n * output by PUT_BYTE.\n * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.\n * It could be a function or a statement, and uses tmp as the input byte.\n * For example, PUT_BYTE could be \"*output++ = tmp;\" PUT_BYTE will be\n * executed up to 4 times for values in the valid UTF-8 range and up to\n * 7 times in the general case, depending on the length of the converted\n * Unicode character.\n */\n#define PUT_UTF8(val, tmp, PUT_BYTE)\\\n    {\\\n        int bytes, shift;\\\n        uint32_t in = val;\\\n        if (in < 0x80) {\\\n            tmp = in;\\\n            PUT_BYTE\\\n        } else {\\\n            bytes = (av_log2(in) + 4) / 5;\\\n            shift = (bytes - 1) * 6;\\\n            tmp = (256 - (256 >> bytes)) | (in >> shift);\\\n            PUT_BYTE\\\n            while (shift >= 6) {\\\n                shift -= 6;\\\n                tmp = 0x80 | ((in >> shift) & 0x3f);\\\n                PUT_BYTE\\\n            }\\\n        }\\\n    }\n\n/**\n * @def PUT_UTF16(val, tmp, PUT_16BIT)\n * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes).\n * @param val is an input-only argument and should be of type uint32_t. It holds\n * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If\n * val is given as a function it is executed only once.\n * @param tmp is a temporary variable and should be of type uint16_t. It\n * represents an intermediate value during conversion that is to be\n * output by PUT_16BIT.\n * @param PUT_16BIT writes the converted UTF-16 data to any proper destination\n * in desired endianness. It could be a function or a statement, and uses tmp\n * as the input byte.  For example, PUT_BYTE could be \"*output++ = tmp;\"\n * PUT_BYTE will be executed 1 or 2 times depending on input character.\n */\n#define PUT_UTF16(val, tmp, PUT_16BIT)\\\n    {\\\n        uint32_t in = val;\\\n        if (in < 0x10000) {\\\n            tmp = in;\\\n            PUT_16BIT\\\n        } else {\\\n            tmp = 0xD800 | ((in - 0x10000) >> 10);\\\n            PUT_16BIT\\\n            tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\\\n            PUT_16BIT\\\n        }\\\n    }\\\n\n#endif /* AVUTIL_COMMON_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/container_fifo.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_CONTAINER_FIFO_H\n#define AVUTIL_CONTAINER_FIFO_H\n\n#include <stddef.h>\n\n/**\n * AVContainerFifo is a FIFO for \"containers\" - dynamically allocated reusable\n * structs (e.g. AVFrame or AVPacket). AVContainerFifo uses an internal pool of\n * such containers to avoid allocating and freeing them repeatedly.\n */\ntypedef struct AVContainerFifo AVContainerFifo;\n\nenum AVContainerFifoFlags {\n    /**\n     * Signal to av_container_fifo_write() that it should make a new reference\n     * to data in src rather than consume its contents.\n     *\n     * @note you must handle this flag manually in your own fifo_transfer()\n     *       callback\n     */\n    AV_CONTAINER_FIFO_FLAG_REF  = (1 << 0),\n\n    /**\n     * This and all higher bits in flags may be set to any value by the caller\n     * and are guaranteed to be passed through to the fifo_transfer() callback\n     * and not be interpreted by AVContainerFifo code.\n     */\n    AV_CONTAINER_FIFO_FLAG_USER = (1 << 16),\n};\n\n/**\n * Allocate a new AVContainerFifo for the container type defined by provided\n * callbacks.\n *\n * @param opaque user data that will be passed to the callbacks provided to this\n *               function\n * @param container_alloc allocate a new container instance and return a pointer\n *                        to it, or NULL on failure\n * @param container_reset reset the provided container instance to a clean state\n * @param container_free free the provided container instance\n * @param fifo_transfer Transfer the contents of container src to dst.\n * @param flags currently unused\n *\n * @return newly allocated AVContainerFifo, or NULL on failure\n */\nAVContainerFifo*\nav_container_fifo_alloc(void *opaque,\n                        void* (*container_alloc)(void *opaque),\n                        void  (*container_reset)(void *opaque, void *obj),\n                        void  (*container_free) (void *opaque, void *obj),\n                        int   (*fifo_transfer)  (void *opaque, void *dst, void *src, unsigned flags),\n                        unsigned flags);\n\n/**\n * Allocate an AVContainerFifo instance for AVFrames.\n *\n * @param flags currently unused\n */\nAVContainerFifo *av_container_fifo_alloc_avframe(unsigned flags);\n\n/**\n * Free a AVContainerFifo and everything in it.\n */\nvoid av_container_fifo_free(AVContainerFifo **cf);\n\n/**\n * Write the contents of obj to the FIFO.\n *\n * The fifo_transfer() callback previously provided to av_container_fifo_alloc()\n * will be called with obj as src in order to perform the actual transfer.\n */\nint av_container_fifo_write(AVContainerFifo *cf, void *obj, unsigned flags);\n\n/**\n * Read the next available object from the FIFO into obj.\n *\n * The fifo_read() callback previously provided to av_container_fifo_alloc()\n * will be called with obj as dst in order to perform the actual transfer.\n */\nint av_container_fifo_read(AVContainerFifo *cf, void *obj, unsigned flags);\n\n/**\n * Access objects stored in the FIFO without retrieving them. The\n * fifo_transfer() callback will NOT be invoked and the FIFO state will not be\n * modified.\n *\n * @param pobj Pointer to the object stored in the FIFO will be written here on\n *             success. The object remains owned by the FIFO and the caller may\n *             only access it as long as the FIFO is not modified.\n * @param offset Position of the object to retrieve - 0 is the next item that\n *               would be read, 1 the one after, etc. Must be smaller than\n *               av_container_fifo_can_read().\n *\n * @retval 0 success, a pointer was written into pobj\n * @retval AVERROR(EINVAL) invalid offset value\n */\nint av_container_fifo_peek(AVContainerFifo *cf, void **pobj, size_t offset);\n\n/**\n * Discard the specified number of elements from the FIFO.\n *\n * @param nb_elems number of elements to discard, MUST NOT be larger than\n *                 av_fifo_can_read(f)\n */\nvoid av_container_fifo_drain(AVContainerFifo *cf, size_t nb_elems);\n\n/**\n * @return number of objects available for reading\n */\nsize_t av_container_fifo_can_read(const AVContainerFifo *cf);\n\n#endif // AVCODEC_CONTAINER_FIFO_H\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/cpu.h",
    "content": "/*\n * Copyright (c) 2000, 2001, 2002 Fabrice Bellard\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_CPU_H\n#define AVUTIL_CPU_H\n\n#include <stddef.h>\n#include \"version.h\"\n\n#define AV_CPU_FLAG_FORCE    0x80000000 /* force usage of selected flags (OR) */\n\n    /* lower 16 bits - CPU features */\n#define AV_CPU_FLAG_MMX          0x0001 ///< standard MMX\n#define AV_CPU_FLAG_MMXEXT       0x0002 ///< SSE integer functions or AMD MMX ext\n#define AV_CPU_FLAG_MMX2         0x0002 ///< SSE integer functions or AMD MMX ext\n#define AV_CPU_FLAG_3DNOW        0x0004 ///< AMD 3DNOW\n#define AV_CPU_FLAG_SSE          0x0008 ///< SSE functions\n#define AV_CPU_FLAG_SSE2         0x0010 ///< PIV SSE2 functions\n#define AV_CPU_FLAG_SSE2SLOW 0x40000000 ///< SSE2 supported, but usually not faster\n                                        ///< than regular MMX/SSE (e.g. Core1)\n#define AV_CPU_FLAG_3DNOWEXT     0x0020 ///< AMD 3DNowExt\n#define AV_CPU_FLAG_SSE3         0x0040 ///< Prescott SSE3 functions\n#define AV_CPU_FLAG_SSE3SLOW 0x20000000 ///< SSE3 supported, but usually not faster\n                                        ///< than regular MMX/SSE (e.g. Core1)\n#define AV_CPU_FLAG_SSSE3        0x0080 ///< Conroe SSSE3 functions\n#define AV_CPU_FLAG_SSSE3SLOW 0x4000000 ///< SSSE3 supported, but usually not faster\n#define AV_CPU_FLAG_ATOM     0x10000000 ///< Atom processor, some SSSE3 instructions are slower\n#define AV_CPU_FLAG_SSE4         0x0100 ///< Penryn SSE4.1 functions\n#define AV_CPU_FLAG_SSE42        0x0200 ///< Nehalem SSE4.2 functions\n#define AV_CPU_FLAG_AESNI       0x80000 ///< Advanced Encryption Standard functions\n#define AV_CPU_FLAG_AVX          0x4000 ///< AVX functions: requires OS support even if YMM registers aren't used\n#define AV_CPU_FLAG_AVXSLOW   0x8000000 ///< AVX supported, but slow when using YMM registers (e.g. Bulldozer)\n#define AV_CPU_FLAG_XOP          0x0400 ///< Bulldozer XOP functions\n#define AV_CPU_FLAG_FMA4         0x0800 ///< Bulldozer FMA4 functions\n#define AV_CPU_FLAG_CMOV         0x1000 ///< supports cmov instruction\n#define AV_CPU_FLAG_AVX2         0x8000 ///< AVX2 functions: requires OS support even if YMM registers aren't used\n#define AV_CPU_FLAG_FMA3        0x10000 ///< Haswell FMA3 functions\n#define AV_CPU_FLAG_BMI1        0x20000 ///< Bit Manipulation Instruction Set 1\n#define AV_CPU_FLAG_BMI2        0x40000 ///< Bit Manipulation Instruction Set 2\n#define AV_CPU_FLAG_AVX512     0x100000 ///< AVX-512 functions: requires OS support even if YMM/ZMM registers aren't used\n#define AV_CPU_FLAG_AVX512ICL  0x200000 ///< F/CD/BW/DQ/VL/VNNI/IFMA/VBMI/VBMI2/VPOPCNTDQ/BITALG/GFNI/VAES/VPCLMULQDQ\n#define AV_CPU_FLAG_SLOW_GATHER  0x2000000 ///< CPU has slow gathers.\n\n#define AV_CPU_FLAG_ALTIVEC      0x0001 ///< standard\n#define AV_CPU_FLAG_VSX          0x0002 ///< ISA 2.06\n#define AV_CPU_FLAG_POWER8       0x0004 ///< ISA 2.07\n\n#define AV_CPU_FLAG_ARMV5TE      (1 << 0)\n#define AV_CPU_FLAG_ARMV6        (1 << 1)\n#define AV_CPU_FLAG_ARMV6T2      (1 << 2)\n#define AV_CPU_FLAG_VFP          (1 << 3)\n#define AV_CPU_FLAG_VFPV3        (1 << 4)\n#define AV_CPU_FLAG_NEON         (1 << 5)\n#define AV_CPU_FLAG_ARMV8        (1 << 6)\n#define AV_CPU_FLAG_VFP_VM       (1 << 7) ///< VFPv2 vector mode, deprecated in ARMv7-A and unavailable in various CPUs implementations\n#define AV_CPU_FLAG_DOTPROD      (1 << 8)\n#define AV_CPU_FLAG_I8MM         (1 << 9)\n#define AV_CPU_FLAG_SVE          (1 <<10)\n#define AV_CPU_FLAG_SVE2         (1 <<11)\n#define AV_CPU_FLAG_SETEND       (1 <<16)\n\n#define AV_CPU_FLAG_MMI          (1 << 0)\n#define AV_CPU_FLAG_MSA          (1 << 1)\n\n//Loongarch SIMD extension.\n#define AV_CPU_FLAG_LSX          (1 << 0)\n#define AV_CPU_FLAG_LASX         (1 << 1)\n\n// RISC-V extensions\n#define AV_CPU_FLAG_RVI          (1 << 0) ///< I (full GPR bank)\n#if FF_API_RISCV_FD_ZBA\n#define AV_CPU_FLAG_RVF          (1 << 1) ///< F (single precision FP)\n#define AV_CPU_FLAG_RVD          (1 << 2) ///< D (double precision FP)\n#endif\n#define AV_CPU_FLAG_RVV_I32      (1 << 3) ///< Vectors of 8/16/32-bit int's */\n#define AV_CPU_FLAG_RVV_F32      (1 << 4) ///< Vectors of float's */\n#define AV_CPU_FLAG_RVV_I64      (1 << 5) ///< Vectors of 64-bit int's */\n#define AV_CPU_FLAG_RVV_F64      (1 << 6) ///< Vectors of double's\n#define AV_CPU_FLAG_RVB_BASIC    (1 << 7) ///< Basic bit-manipulations\n#if FF_API_RISCV_FD_ZBA\n#define AV_CPU_FLAG_RVB_ADDR     (1 << 8) ///< Address bit-manipulations\n#endif\n#define AV_CPU_FLAG_RV_ZVBB      (1 << 9) ///< Vector basic bit-manipulations\n#define AV_CPU_FLAG_RV_MISALIGNED (1 <<10) ///< Fast misaligned accesses\n#define AV_CPU_FLAG_RVB          (1 <<11) ///< B (bit manipulations)\n\n// WASM extensions\n#define AV_CPU_FLAG_SIMD128      (1 << 0)\n\n/**\n * Return the flags which specify extensions supported by the CPU.\n * The returned value is affected by av_force_cpu_flags() if that was used\n * before. So av_get_cpu_flags() can easily be used in an application to\n * detect the enabled cpu flags.\n */\nint av_get_cpu_flags(void);\n\n/**\n * Disables cpu detection and forces the specified flags.\n * -1 is a special case that disables forcing of specific flags.\n */\nvoid av_force_cpu_flags(int flags);\n\n/**\n * Parse CPU caps from a string and update the given AV_CPU_* flags based on that.\n *\n * @return negative on error.\n */\nint av_parse_cpu_caps(unsigned *flags, const char *s);\n\n/**\n * @return the number of logical CPU cores present.\n */\nint av_cpu_count(void);\n\n/**\n * Overrides cpu count detection and forces the specified count.\n * Count < 1 disables forcing of specific count.\n */\nvoid av_cpu_force_count(int count);\n\n/**\n * Get the maximum data alignment that may be required by FFmpeg.\n *\n * Note that this is affected by the build configuration and the CPU flags mask,\n * so e.g. if the CPU supports AVX, but libavutil has been built with\n * --disable-avx or the AV_CPU_FLAG_AVX flag has been disabled through\n *  av_set_cpu_flags_mask(), then this function will behave as if AVX is not\n *  present.\n */\nsize_t av_cpu_max_align(void);\n\n#endif /* AVUTIL_CPU_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/crc.h",
    "content": "/*\n * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_crc32\n * Public header for CRC hash function implementation.\n */\n\n#ifndef AVUTIL_CRC_H\n#define AVUTIL_CRC_H\n\n#include <stdint.h>\n#include <stddef.h>\n#include \"attributes.h\"\n\n/**\n * @defgroup lavu_crc32 CRC\n * @ingroup lavu_hash\n * CRC (Cyclic Redundancy Check) hash function implementation.\n *\n * This module supports numerous CRC polynomials, in addition to the most\n * widely used CRC-32-IEEE. See @ref AVCRCId for a list of available\n * polynomials.\n *\n * @{\n */\n\ntypedef uint32_t AVCRC;\n\ntypedef enum {\n    AV_CRC_8_ATM,\n    AV_CRC_16_ANSI,\n    AV_CRC_16_CCITT,\n    AV_CRC_32_IEEE,\n    AV_CRC_32_IEEE_LE,  /*< reversed bitorder version of AV_CRC_32_IEEE */\n    AV_CRC_16_ANSI_LE,  /*< reversed bitorder version of AV_CRC_16_ANSI */\n    AV_CRC_24_IEEE,\n    AV_CRC_8_EBU,\n    AV_CRC_MAX,         /*< Not part of public API! Do not use outside libavutil. */\n}AVCRCId;\n\n/**\n * Initialize a CRC table.\n * @param ctx must be an array of size sizeof(AVCRC)*257 or sizeof(AVCRC)*1024\n * @param le If 1, the lowest bit represents the coefficient for the highest\n *           exponent of the corresponding polynomial (both for poly and\n *           actual CRC).\n *           If 0, you must swap the CRC parameter and the result of av_crc\n *           if you need the standard representation (can be simplified in\n *           most cases to e.g. bswap16):\n *           av_bswap32(crc << (32-bits))\n * @param bits number of bits for the CRC\n * @param poly generator polynomial without the x**bits coefficient, in the\n *             representation as specified by le\n * @param ctx_size size of ctx in bytes\n * @return <0 on failure\n */\nint av_crc_init(AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size);\n\n/**\n * Get an initialized standard CRC table.\n * @param crc_id ID of a standard CRC\n * @return a pointer to the CRC table or NULL on failure\n */\nconst AVCRC *av_crc_get_table(AVCRCId crc_id);\n\n/**\n * Calculate the CRC of a block.\n * @param ctx initialized AVCRC array (see av_crc_init())\n * @param crc CRC of previous blocks if any or initial value for CRC\n * @param buffer buffer whose CRC to calculate\n * @param length length of the buffer\n * @return CRC updated with the data from the given block\n *\n * @see av_crc_init() \"le\" parameter\n */\nuint32_t av_crc(const AVCRC *ctx, uint32_t crc,\n                const uint8_t *buffer, size_t length) av_pure;\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_CRC_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/csp.h",
    "content": "/*\n * Copyright (c) 2015 Kevin Wheatley <kevin.j.wheatley@gmail.com>\n * Copyright (c) 2016 Ronald S. Bultje <rsbultje@gmail.com>\n * Copyright (c) 2023 Leo Izen <leo.izen@gmail.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_CSP_H\n#define AVUTIL_CSP_H\n\n#include \"pixfmt.h\"\n#include \"rational.h\"\n\n/**\n * @file\n * Colorspace value utility functions for libavutil.\n * @ingroup lavu_math_csp\n * @author Ronald S. Bultje <rsbultje@gmail.com>\n * @author Leo Izen <leo.izen@gmail.com>\n * @author Kevin Wheatley <kevin.j.wheatley@gmail.com>\n */\n\n/**\n * @defgroup lavu_math_csp Colorspace Utility\n * @ingroup lavu_math\n * @{\n */\n\n/**\n * Struct containing luma coefficients to be used for RGB to YUV/YCoCg, or similar\n * calculations.\n */\ntypedef struct AVLumaCoefficients {\n    AVRational cr, cg, cb;\n} AVLumaCoefficients;\n\n/**\n * Struct containing chromaticity x and y values for the standard CIE 1931\n * chromaticity definition.\n */\ntypedef struct AVCIExy {\n    AVRational x, y;\n} AVCIExy;\n\n/**\n * Struct defining the red, green, and blue primary locations in terms of CIE\n * 1931 chromaticity x and y.\n */\ntypedef struct AVPrimaryCoefficients {\n    AVCIExy r, g, b;\n} AVPrimaryCoefficients;\n\n/**\n * Struct defining white point location in terms of CIE 1931 chromaticity x\n * and y.\n */\ntypedef AVCIExy AVWhitepointCoefficients;\n\n/**\n * Struct that contains both white point location and primaries location, providing\n * the complete description of a color gamut.\n */\ntypedef struct AVColorPrimariesDesc {\n    AVWhitepointCoefficients wp;\n    AVPrimaryCoefficients prim;\n} AVColorPrimariesDesc;\n\n/**\n * Function pointer representing a double -> double transfer function that\n * performs either an OETF transfer function, or alternatively an inverse EOTF\n * function (in particular, for SMPTE ST 2084 / PQ). This function inputs\n * linear light, and outputs gamma encoded light.\n *\n * See ITU-T H.273 for more information.\n */\ntypedef double (*av_csp_trc_function)(double);\n\n/**\n * Retrieves the Luma coefficients necessary to construct a conversion matrix\n * from an enum constant describing the colorspace.\n * @param csp An enum constant indicating YUV or similar colorspace.\n * @return The Luma coefficients associated with that colorspace, or NULL\n *     if the constant is unknown to libavutil.\n */\nconst AVLumaCoefficients *av_csp_luma_coeffs_from_avcsp(enum AVColorSpace csp);\n\n/**\n * Retrieves a complete gamut description from an enum constant describing the\n * color primaries.\n * @param prm An enum constant indicating primaries\n * @return A description of the colorspace gamut associated with that enum\n *     constant, or NULL if the constant is unknown to libavutil.\n */\nconst AVColorPrimariesDesc *av_csp_primaries_desc_from_id(enum AVColorPrimaries prm);\n\n/**\n * Detects which enum AVColorPrimaries constant corresponds to the given complete\n * gamut description.\n * @see enum AVColorPrimaries\n * @param prm A description of the colorspace gamut\n * @return The enum constant associated with this gamut, or\n *     AVCOL_PRI_UNSPECIFIED if no clear match can be identified.\n */\nenum AVColorPrimaries av_csp_primaries_id_from_desc(const AVColorPrimariesDesc *prm);\n\n/**\n * Determine a suitable 'gamma' value to match the supplied\n * AVColorTransferCharacteristic.\n *\n * See Apple Technical Note TN2257 (https://developer.apple.com/library/mac/technotes/tn2257/_index.html)\n *\n * This function returns the gamma exponent for the OETF. For example, sRGB is approximated\n * by gamma 2.2, not by gamma 0.45455.\n *\n * @return Will return an approximation to the simple gamma function matching\n *         the supplied Transfer Characteristic, Will return 0.0 for any\n *         we cannot reasonably match against.\n */\ndouble av_csp_approximate_trc_gamma(enum AVColorTransferCharacteristic trc);\n\n/**\n * Determine the function needed to apply the given\n * AVColorTransferCharacteristic to linear input.\n *\n * The function returned should expect a nominal domain and range of [0.0-1.0]\n * values outside of this range maybe valid depending on the chosen\n * characteristic function.\n *\n * @return Will return pointer to the function matching the\n *         supplied Transfer Characteristic. If unspecified will\n *         return NULL:\n */\nav_csp_trc_function av_csp_trc_func_from_id(enum AVColorTransferCharacteristic trc);\n\n/**\n * Returns the mathematical inverse of the corresponding TRC function.\n */\nav_csp_trc_function av_csp_trc_func_inv_from_id(enum AVColorTransferCharacteristic trc);\n\n/**\n * Function pointer representing an ITU EOTF transfer for a given reference\n * display configuration.\n *\n * @param Lw The white point luminance of the display, in nits (cd/m^2).\n * @param Lb The black point luminance of the display, in nits (cd/m^2).\n */\ntypedef void (*av_csp_eotf_function)(double Lw, double Lb, double c[3]);\n\n/**\n * Returns the ITU EOTF corresponding to a given TRC. This converts from the\n * signal level [0,1] to the raw output display luminance in nits (cd/m^2).\n * This is done per channel in RGB space, except for AVCOL_TRC_SMPTE428, which\n * assumes CIE XYZ in- and output.\n *\n * @return A pointer to the function implementing the given TRC, or NULL if no\n *         such function is defined.\n *\n * @note In general, the resulting function is defined (wherever possible) for\n *       out-of-range values, even though these values do not have a physical\n *       meaning on the given display. Users should clamp inputs (or outputs)\n *       if this behavior is not desired.\n *\n *       This is also the case for functions like PQ, which are defined over an\n *       absolute signal range independent of the target display capabilities.\n */\nav_csp_eotf_function av_csp_itu_eotf(enum AVColorTransferCharacteristic trc);\n\n/**\n * Returns the mathematical inverse of the corresponding EOTF.\n */\nav_csp_eotf_function av_csp_itu_eotf_inv(enum AVColorTransferCharacteristic trc);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_CSP_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/des.h",
    "content": "/*\n * DES encryption/decryption\n * Copyright (c) 2007 Reimar Doeffinger\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_DES_H\n#define AVUTIL_DES_H\n\n#include <stdint.h>\n\n/**\n * @defgroup lavu_des DES\n * @ingroup lavu_crypto\n * @{\n */\n\ntypedef struct AVDES {\n    uint64_t round_keys[3][16];\n    int triple_des;\n} AVDES;\n\n/**\n * Allocate an AVDES context.\n */\nAVDES *av_des_alloc(void);\n\n/**\n * @brief Initializes an AVDES context.\n *\n * @param d pointer to a AVDES structure to initialize\n * @param key pointer to the key to use\n * @param key_bits must be 64 or 192\n * @param decrypt 0 for encryption/CBC-MAC, 1 for decryption\n * @return zero on success, negative value otherwise\n */\nint av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt);\n\n/**\n * @brief Encrypts / decrypts using the DES algorithm.\n *\n * @param d pointer to the AVDES structure\n * @param dst destination array, can be equal to src, must be 8-byte aligned\n * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL\n * @param count number of 8 byte blocks\n * @param iv initialization vector for CBC mode, if NULL then ECB will be used,\n *           must be 8-byte aligned\n * @param decrypt 0 for encryption, 1 for decryption\n */\nvoid av_des_crypt(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt);\n\n/**\n * @brief Calculates CBC-MAC using the DES algorithm.\n *\n * @param d pointer to the AVDES structure\n * @param dst destination array, can be equal to src, must be 8-byte aligned\n * @param src source array, can be equal to dst, must be 8-byte aligned, may be NULL\n * @param count number of 8 byte blocks\n */\nvoid av_des_mac(struct AVDES *d, uint8_t *dst, const uint8_t *src, int count);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_DES_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/detection_bbox.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_DETECTION_BBOX_H\n#define AVUTIL_DETECTION_BBOX_H\n\n#include \"rational.h\"\n#include \"avassert.h\"\n#include \"frame.h\"\n\ntypedef struct AVDetectionBBox {\n    /**\n     * Distance in pixels from the left/top edge of the frame,\n     * together with width and height, defining the bounding box.\n     */\n    int x;\n    int y;\n    int w;\n    int h;\n\n#define AV_DETECTION_BBOX_LABEL_NAME_MAX_SIZE 64\n\n    /**\n     * Detect result with confidence\n     */\n    char detect_label[AV_DETECTION_BBOX_LABEL_NAME_MAX_SIZE];\n    AVRational detect_confidence;\n\n    /**\n     * At most 4 classifications based on the detected bounding box.\n     * For example, we can get max 4 different attributes with 4 different\n     * DNN models on one bounding box.\n     * classify_count is zero if no classification.\n     */\n#define AV_NUM_DETECTION_BBOX_CLASSIFY 4\n    uint32_t classify_count;\n    char classify_labels[AV_NUM_DETECTION_BBOX_CLASSIFY][AV_DETECTION_BBOX_LABEL_NAME_MAX_SIZE];\n    AVRational classify_confidences[AV_NUM_DETECTION_BBOX_CLASSIFY];\n} AVDetectionBBox;\n\ntypedef struct AVDetectionBBoxHeader {\n    /**\n     * Information about how the bounding box is generated.\n     * for example, the DNN model name.\n     */\n    char source[256];\n\n    /**\n     * Number of bounding boxes in the array.\n     */\n    uint32_t nb_bboxes;\n\n    /**\n     * Offset in bytes from the beginning of this structure at which\n     * the array of bounding boxes starts.\n     */\n    size_t bboxes_offset;\n\n    /**\n     * Size of each bounding box in bytes.\n     */\n    size_t bbox_size;\n} AVDetectionBBoxHeader;\n\n/*\n * Get the bounding box at the specified {@code idx}. Must be between 0 and nb_bboxes.\n */\nstatic av_always_inline AVDetectionBBox *\nav_get_detection_bbox(const AVDetectionBBoxHeader *header, unsigned int idx)\n{\n    av_assert0(idx < header->nb_bboxes);\n    return (AVDetectionBBox *)((uint8_t *)header + header->bboxes_offset +\n                               idx * header->bbox_size);\n}\n\n/**\n * Allocates memory for AVDetectionBBoxHeader, plus an array of {@code nb_bboxes}\n * AVDetectionBBox, and initializes the variables.\n * Can be freed with a normal av_free() call.\n *\n * @param nb_bboxes number of AVDetectionBBox structures to allocate\n * @param out_size if non-NULL, the size in bytes of the resulting data array is\n * written here.\n */\nAVDetectionBBoxHeader *av_detection_bbox_alloc(uint32_t nb_bboxes, size_t *out_size);\n\n/**\n * Allocates memory for AVDetectionBBoxHeader, plus an array of {@code nb_bboxes}\n * AVDetectionBBox, in the given AVFrame {@code frame} as AVFrameSideData of type\n * AV_FRAME_DATA_DETECTION_BBOXES and initializes the variables.\n */\nAVDetectionBBoxHeader *av_detection_bbox_create_side_data(AVFrame *frame, uint32_t nb_bboxes);\n#endif\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/dict.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * Public dictionary API.\n * @deprecated\n *  AVDictionary is provided for compatibility with libav. It is both in\n *  implementation as well as API inefficient. It does not scale and is\n *  extremely slow with large dictionaries.\n *  It is recommended that new code uses our tree container from tree.c/h\n *  where applicable, which uses AVL trees to achieve O(log n) performance.\n */\n\n#ifndef AVUTIL_DICT_H\n#define AVUTIL_DICT_H\n\n#include <stdint.h>\n\n/**\n * @addtogroup lavu_dict AVDictionary\n * @ingroup lavu_data\n *\n * @brief Simple key:value store\n *\n * @{\n * Dictionaries are used for storing key-value pairs.\n *\n * - To **create an AVDictionary**, simply pass an address of a NULL\n *   pointer to av_dict_set(). NULL can be used as an empty dictionary\n *   wherever a pointer to an AVDictionary is required.\n * - To **insert an entry**, use av_dict_set().\n * - Use av_dict_get() to **retrieve an entry**.\n * - To **iterate over all entries**, use av_dict_iterate().\n * - In order to **free the dictionary and all its contents**, use av_dict_free().\n *\n @code\n   AVDictionary *d = NULL;           // \"create\" an empty dictionary\n   AVDictionaryEntry *t = NULL;\n\n   av_dict_set(&d, \"foo\", \"bar\", 0); // add an entry\n\n   char *k = av_strdup(\"key\");       // if your strings are already allocated,\n   char *v = av_strdup(\"value\");     // you can avoid copying them like this\n   av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);\n\n   while ((t = av_dict_iterate(d, t))) {\n       <....>                        // iterate over all entries in d\n   }\n   av_dict_free(&d);\n @endcode\n */\n\n/**\n * @name AVDictionary Flags\n * Flags that influence behavior of the matching of keys or insertion to the dictionary.\n * @{\n */\n#define AV_DICT_MATCH_CASE      1   /**< Only get an entry with exact-case key match. Only relevant in av_dict_get(). */\n#define AV_DICT_IGNORE_SUFFIX   2   /**< Return first entry in a dictionary whose first part corresponds to the search key,\n                                         ignoring the suffix of the found key string. Only relevant in av_dict_get(). */\n#define AV_DICT_DONT_STRDUP_KEY 4   /**< Take ownership of a key that's been\n                                         allocated with av_malloc() or another memory allocation function. */\n#define AV_DICT_DONT_STRDUP_VAL 8   /**< Take ownership of a value that's been\n                                         allocated with av_malloc() or another memory allocation function. */\n#define AV_DICT_DONT_OVERWRITE 16   /**< Don't overwrite existing entries. */\n#define AV_DICT_APPEND         32   /**< If the entry already exists, append to it.  Note that no\n                                         delimiter is added, the strings are simply concatenated. */\n#define AV_DICT_MULTIKEY       64   /**< Allow to store several equal keys in the dictionary */\n#define AV_DICT_DEDUP         128   /**< If inserting a value that already exists for a key, do nothing. Only relevant with AV_DICT_MULTIKEY. */\n/**\n * @}\n */\n\ntypedef struct AVDictionaryEntry {\n    char *key;\n    char *value;\n} AVDictionaryEntry;\n\ntypedef struct AVDictionary AVDictionary;\n\n/**\n * Get a dictionary entry with matching key.\n *\n * The returned entry key or value must not be changed, or it will\n * cause undefined behavior.\n *\n * @param prev  Set to the previous matching element to find the next.\n *              If set to NULL the first matching element is returned.\n * @param key   Matching key\n * @param flags A collection of AV_DICT_* flags controlling how the\n *              entry is retrieved\n *\n * @return      Found entry or NULL in case no matching entry was found in the dictionary\n */\nAVDictionaryEntry *av_dict_get(const AVDictionary *m, const char *key,\n                               const AVDictionaryEntry *prev, int flags);\n\n/**\n * Iterate over a dictionary\n *\n * Iterates through all entries in the dictionary.\n *\n * @warning The returned AVDictionaryEntry key/value must not be changed.\n *\n * @warning As av_dict_set() invalidates all previous entries returned\n * by this function, it must not be called while iterating over the dict.\n *\n * Typical usage:\n * @code\n * const AVDictionaryEntry *e = NULL;\n * while ((e = av_dict_iterate(m, e))) {\n *     // ...\n * }\n * @endcode\n *\n * @param m     The dictionary to iterate over\n * @param prev  Pointer to the previous AVDictionaryEntry, NULL initially\n *\n * @retval AVDictionaryEntry* The next element in the dictionary\n * @retval NULL               No more elements in the dictionary\n */\nconst AVDictionaryEntry *av_dict_iterate(const AVDictionary *m,\n                                         const AVDictionaryEntry *prev);\n\n/**\n * Get number of entries in dictionary.\n *\n * @param m dictionary\n * @return  number of entries in dictionary\n */\nint av_dict_count(const AVDictionary *m);\n\n/**\n * Set the given entry in *pm, overwriting an existing entry.\n *\n * Note: If AV_DICT_DONT_STRDUP_KEY or AV_DICT_DONT_STRDUP_VAL is set,\n * these arguments will be freed on error.\n *\n * @warning Adding a new entry to a dictionary invalidates all existing entries\n * previously returned with av_dict_get() or av_dict_iterate().\n *\n * @param pm        Pointer to a pointer to a dictionary struct. If *pm is NULL\n *                  a dictionary struct is allocated and put in *pm.\n * @param key       Entry key to add to *pm (will either be av_strduped or added as a new key depending on flags)\n * @param value     Entry value to add to *pm (will be av_strduped or added as a new key depending on flags).\n *                  Passing a NULL value will cause an existing entry to be deleted.\n *\n * @return          >= 0 on success otherwise an error code <0\n */\nint av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags);\n\n/**\n * Convenience wrapper for av_dict_set() that converts the value to a string\n * and stores it.\n *\n * Note: If ::AV_DICT_DONT_STRDUP_KEY is set, key will be freed on error.\n */\nint av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags);\n\n/**\n * Parse the key/value pairs list and add the parsed entries to a dictionary.\n *\n * In case of failure, all the successfully set entries are stored in\n * *pm. You may need to manually free the created dictionary.\n *\n * @param key_val_sep  A 0-terminated list of characters used to separate\n *                     key from value\n * @param pairs_sep    A 0-terminated list of characters used to separate\n *                     two pairs from each other\n * @param flags        Flags to use when adding to the dictionary.\n *                     ::AV_DICT_DONT_STRDUP_KEY and ::AV_DICT_DONT_STRDUP_VAL\n *                     are ignored since the key/value tokens will always\n *                     be duplicated.\n *\n * @return             0 on success, negative AVERROR code on failure\n */\nint av_dict_parse_string(AVDictionary **pm, const char *str,\n                         const char *key_val_sep, const char *pairs_sep,\n                         int flags);\n\n/**\n * Copy entries from one AVDictionary struct into another.\n *\n * @note Metadata is read using the ::AV_DICT_IGNORE_SUFFIX flag\n *\n * @param dst   Pointer to a pointer to a AVDictionary struct to copy into. If *dst is NULL,\n *              this function will allocate a struct for you and put it in *dst\n * @param src   Pointer to the source AVDictionary struct to copy items from.\n * @param flags Flags to use when setting entries in *dst\n *\n * @return 0 on success, negative AVERROR code on failure. If dst was allocated\n *           by this function, callers should free the associated memory.\n */\nint av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags);\n\n/**\n * Free all the memory allocated for an AVDictionary struct\n * and all keys and values.\n */\nvoid av_dict_free(AVDictionary **m);\n\n/**\n * Get dictionary entries as a string.\n *\n * Create a string containing dictionary's entries.\n * Such string may be passed back to av_dict_parse_string().\n * @note String is escaped with backslashes ('\\').\n *\n * @warning Separators cannot be neither '\\\\' nor '\\0'. They also cannot be the same.\n *\n * @param[in]  m             The dictionary\n * @param[out] buffer        Pointer to buffer that will be allocated with string containing entries.\n *                           Buffer must be freed by the caller when is no longer needed.\n * @param[in]  key_val_sep   Character used to separate key from value\n * @param[in]  pairs_sep     Character used to separate two pairs from each other\n *\n * @return                   >= 0 on success, negative on error\n */\nint av_dict_get_string(const AVDictionary *m, char **buffer,\n                       const char key_val_sep, const char pairs_sep);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_DICT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/display.h",
    "content": "/*\n * Copyright (c) 2014 Vittorio Giovara <vittorio.giovara@gmail.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_video_display\n * Display matrix\n */\n\n#ifndef AVUTIL_DISPLAY_H\n#define AVUTIL_DISPLAY_H\n\n#include <stdint.h>\n\n/**\n * @defgroup lavu_video_display Display transformation matrix functions\n * @ingroup lavu_video\n *\n * The display transformation matrix specifies an affine transformation that\n * should be applied to video frames for correct presentation. It is compatible\n * with the matrices stored in the ISO/IEC 14496-12 container format.\n *\n * The data is a 3x3 matrix represented as a 9-element array:\n *\n * @code{.unparsed}\n *                                  | a b u |\n *   (a, b, u, c, d, v, x, y, w) -> | c d v |\n *                                  | x y w |\n * @endcode\n *\n * All numbers are stored in native endianness, as 16.16 fixed-point values,\n * except for u, v and w, which are stored as 2.30 fixed-point values.\n *\n * The transformation maps a point (p, q) in the source (pre-transformation)\n * frame to the point (p', q') in the destination (post-transformation) frame as\n * follows:\n *\n * @code{.unparsed}\n *               | a b u |\n *   (p, q, 1) . | c d v | = z * (p', q', 1)\n *               | x y w |\n * @endcode\n *\n * The transformation can also be more explicitly written in components as\n * follows:\n *\n * @code{.unparsed}\n *   p' = (a * p + c * q + x) / z;\n *   q' = (b * p + d * q + y) / z;\n *   z  =  u * p + v * q + w\n * @endcode\n *\n * @{\n */\n\n/**\n * Extract the rotation component of the transformation matrix.\n *\n * @param matrix the transformation matrix\n * @return the angle (in degrees) by which the transformation rotates the frame\n *         counterclockwise. The angle will be in range [-180.0, 180.0],\n *         or NaN if the matrix is singular.\n *\n * @note floating point numbers are inherently inexact, so callers are\n *       recommended to round the return value to nearest integer before use.\n */\ndouble av_display_rotation_get(const int32_t matrix[9]);\n\n/**\n * Initialize a transformation matrix describing a pure clockwise\n * rotation by the specified angle (in degrees).\n *\n * @param[out] matrix a transformation matrix (will be fully overwritten\n *                    by this function)\n * @param angle rotation angle in degrees.\n */\nvoid av_display_rotation_set(int32_t matrix[9], double angle);\n\n/**\n * Flip the input matrix horizontally and/or vertically.\n *\n * @param[in,out] matrix a transformation matrix\n * @param hflip whether the matrix should be flipped horizontally\n * @param vflip whether the matrix should be flipped vertically\n */\nvoid av_display_matrix_flip(int32_t matrix[9], int hflip, int vflip);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_DISPLAY_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/dovi_meta.h",
    "content": "/*\n * Copyright (c) 2020 Vacing Fang <vacingfang@tencent.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * DOVI configuration\n */\n\n\n#ifndef AVUTIL_DOVI_META_H\n#define AVUTIL_DOVI_META_H\n\n#include <stdint.h>\n#include <stddef.h>\n\n#include \"rational.h\"\n#include \"csp.h\"\n\n/*\n * DOVI configuration\n * ref: dolby-vision-bitstreams-within-the-iso-base-media-file-format-v2.1.2\n        dolby-vision-bitstreams-in-mpeg-2-transport-stream-multiplex-v1.2\n * @code\n * uint8_t  dv_version_major, the major version number that the stream complies with\n * uint8_t  dv_version_minor, the minor version number that the stream complies with\n * uint8_t  dv_profile, the Dolby Vision profile\n * uint8_t  dv_level, the Dolby Vision level\n * uint8_t  rpu_present_flag\n * uint8_t  el_present_flag\n * uint8_t  bl_present_flag\n * uint8_t  dv_bl_signal_compatibility_id\n * uint8_t  dv_md_compression, the compression method in use\n * @endcode\n *\n * @note The struct must be allocated with av_dovi_alloc() and\n *       its size is not a part of the public ABI.\n */\ntypedef struct AVDOVIDecoderConfigurationRecord {\n    uint8_t dv_version_major;\n    uint8_t dv_version_minor;\n    uint8_t dv_profile;\n    uint8_t dv_level;\n    uint8_t rpu_present_flag;\n    uint8_t el_present_flag;\n    uint8_t bl_present_flag;\n    uint8_t dv_bl_signal_compatibility_id;\n    uint8_t dv_md_compression;\n} AVDOVIDecoderConfigurationRecord;\n\nenum AVDOVICompression {\n    AV_DOVI_COMPRESSION_NONE     = 0,\n    AV_DOVI_COMPRESSION_LIMITED  = 1,\n    AV_DOVI_COMPRESSION_RESERVED = 2,\n    AV_DOVI_COMPRESSION_EXTENDED = 3,\n};\n\n/**\n * Allocate a AVDOVIDecoderConfigurationRecord structure and initialize its\n * fields to default values.\n *\n * @return the newly allocated struct or NULL on failure\n */\nAVDOVIDecoderConfigurationRecord *av_dovi_alloc(size_t *size);\n\n/**\n * Dolby Vision RPU data header.\n *\n * @note sizeof(AVDOVIRpuDataHeader) is not part of the public ABI.\n */\ntypedef struct AVDOVIRpuDataHeader {\n    uint8_t rpu_type;\n    uint16_t rpu_format;\n    uint8_t vdr_rpu_profile;\n    uint8_t vdr_rpu_level;\n    uint8_t chroma_resampling_explicit_filter_flag;\n    uint8_t coef_data_type; /* informative, lavc always converts to fixed */\n    uint8_t coef_log2_denom;\n    uint8_t vdr_rpu_normalized_idc;\n    uint8_t bl_video_full_range_flag;\n    uint8_t bl_bit_depth; /* [8, 16] */\n    uint8_t el_bit_depth; /* [8, 16] */\n    uint8_t vdr_bit_depth; /* [8, 16] */\n    uint8_t spatial_resampling_filter_flag;\n    uint8_t el_spatial_resampling_filter_flag;\n    uint8_t disable_residual_flag;\n    uint8_t ext_mapping_idc_0_4; /* extended base layer inverse mapping indicator */\n    uint8_t ext_mapping_idc_5_7; /* reserved */\n} AVDOVIRpuDataHeader;\n\nenum AVDOVIMappingMethod {\n    AV_DOVI_MAPPING_POLYNOMIAL = 0,\n    AV_DOVI_MAPPING_MMR = 1,\n};\n\n/**\n * Coefficients of a piece-wise function. The pieces of the function span the\n * value ranges between two adjacent pivot values.\n */\n#define AV_DOVI_MAX_PIECES 8\ntypedef struct AVDOVIReshapingCurve {\n    uint8_t num_pivots;                         /* [2, 9] */\n    uint16_t pivots[AV_DOVI_MAX_PIECES + 1];    /* sorted ascending */\n    enum AVDOVIMappingMethod mapping_idc[AV_DOVI_MAX_PIECES];\n    /* AV_DOVI_MAPPING_POLYNOMIAL */\n    uint8_t poly_order[AV_DOVI_MAX_PIECES];     /* [1, 2] */\n    int64_t poly_coef[AV_DOVI_MAX_PIECES][3];   /* x^0, x^1, x^2 */\n    /* AV_DOVI_MAPPING_MMR */\n    uint8_t mmr_order[AV_DOVI_MAX_PIECES];      /* [1, 3] */\n    int64_t mmr_constant[AV_DOVI_MAX_PIECES];\n    int64_t mmr_coef[AV_DOVI_MAX_PIECES][3/* order - 1 */][7];\n} AVDOVIReshapingCurve;\n\nenum AVDOVINLQMethod {\n    AV_DOVI_NLQ_NONE = -1,\n    AV_DOVI_NLQ_LINEAR_DZ = 0,\n};\n\n/**\n * Coefficients of the non-linear inverse quantization. For the interpretation\n * of these, see ETSI GS CCM 001.\n */\ntypedef struct AVDOVINLQParams {\n    uint16_t nlq_offset;\n    uint64_t vdr_in_max;\n    /* AV_DOVI_NLQ_LINEAR_DZ */\n    uint64_t linear_deadzone_slope;\n    uint64_t linear_deadzone_threshold;\n} AVDOVINLQParams;\n\n/**\n * Dolby Vision RPU data mapping parameters.\n *\n * @note sizeof(AVDOVIDataMapping) is not part of the public ABI.\n */\ntypedef struct AVDOVIDataMapping {\n    uint8_t vdr_rpu_id;\n    uint8_t mapping_color_space;\n    uint8_t mapping_chroma_format_idc;\n    AVDOVIReshapingCurve curves[3]; /* per component */\n\n    /* Non-linear inverse quantization */\n    enum AVDOVINLQMethod nlq_method_idc;\n    uint32_t num_x_partitions;\n    uint32_t num_y_partitions;\n    AVDOVINLQParams nlq[3]; /* per component */\n    uint16_t nlq_pivots[2];\n} AVDOVIDataMapping;\n\n/**\n * Dolby Vision RPU colorspace metadata parameters.\n *\n * @note sizeof(AVDOVIColorMetadata) is not part of the public ABI.\n */\ntypedef struct AVDOVIColorMetadata {\n    uint8_t dm_metadata_id;\n    uint8_t scene_refresh_flag;\n\n    /**\n     * Coefficients of the custom Dolby Vision IPT-PQ matrices. These are to be\n     * used instead of the matrices indicated by the frame's colorspace tags.\n     * The output of rgb_to_lms_matrix is to be fed into a BT.2020 LMS->RGB\n     * matrix based on a Hunt-Pointer-Estevez transform, but without any\n     * crosstalk. (See the definition of the ICtCp colorspace for more\n     * information.)\n     */\n    AVRational ycc_to_rgb_matrix[9]; /* before PQ linearization */\n    AVRational ycc_to_rgb_offset[3]; /* input offset of neutral value */\n    AVRational rgb_to_lms_matrix[9]; /* after PQ linearization */\n\n    /**\n     * Extra signal metadata (see Dolby patents for more info).\n     */\n    uint16_t signal_eotf;\n    uint16_t signal_eotf_param0;\n    uint16_t signal_eotf_param1;\n    uint32_t signal_eotf_param2;\n    uint8_t signal_bit_depth;\n    uint8_t signal_color_space;\n    uint8_t signal_chroma_format;\n    uint8_t signal_full_range_flag; /* [0, 3] */\n    uint16_t source_min_pq;\n    uint16_t source_max_pq;\n    uint16_t source_diagonal;\n} AVDOVIColorMetadata;\n\ntypedef struct AVDOVIDmLevel1 {\n    /* Per-frame brightness metadata */\n    uint16_t min_pq;\n    uint16_t max_pq;\n    uint16_t avg_pq;\n} AVDOVIDmLevel1;\n\ntypedef struct AVDOVIDmLevel2 {\n    /* Usually derived from level 8 (at different levels) */\n    uint16_t target_max_pq;\n    uint16_t trim_slope;\n    uint16_t trim_offset;\n    uint16_t trim_power;\n    uint16_t trim_chroma_weight;\n    uint16_t trim_saturation_gain;\n    int16_t ms_weight;\n} AVDOVIDmLevel2;\n\ntypedef struct AVDOVIDmLevel3 {\n    uint16_t min_pq_offset;\n    uint16_t max_pq_offset;\n    uint16_t avg_pq_offset;\n} AVDOVIDmLevel3;\n\ntypedef struct AVDOVIDmLevel4 {\n    uint16_t anchor_pq;\n    uint16_t anchor_power;\n} AVDOVIDmLevel4;\n\ntypedef struct AVDOVIDmLevel5 {\n    /* Active area definition */\n    uint16_t left_offset;\n    uint16_t right_offset;\n    uint16_t top_offset;\n    uint16_t bottom_offset;\n} AVDOVIDmLevel5;\n\ntypedef struct AVDOVIDmLevel6 {\n    /* Static HDR10 metadata */\n    uint16_t max_luminance;\n    uint16_t min_luminance;\n    uint16_t max_cll;\n    uint16_t max_fall;\n} AVDOVIDmLevel6;\n\ntypedef struct AVDOVIDmLevel8 {\n    /* Extended version of level 2 */\n    uint8_t target_display_index;\n    uint16_t trim_slope;\n    uint16_t trim_offset;\n    uint16_t trim_power;\n    uint16_t trim_chroma_weight;\n    uint16_t trim_saturation_gain;\n    uint16_t ms_weight;\n    uint16_t target_mid_contrast;\n    uint16_t clip_trim;\n    uint8_t saturation_vector_field[6];\n    uint8_t hue_vector_field[6];\n} AVDOVIDmLevel8;\n\ntypedef struct AVDOVIDmLevel9 {\n    /* Source display characteristics */\n    uint8_t source_primary_index;\n    AVColorPrimariesDesc source_display_primaries;\n} AVDOVIDmLevel9;\n\ntypedef struct AVDOVIDmLevel10 {\n    /* Target display characteristics */\n    uint8_t target_display_index;\n    uint16_t target_max_pq;\n    uint16_t target_min_pq;\n    uint8_t target_primary_index;\n    AVColorPrimariesDesc target_display_primaries;\n} AVDOVIDmLevel10;\n\ntypedef struct AVDOVIDmLevel11 {\n    uint8_t content_type;\n    uint8_t whitepoint;\n    uint8_t reference_mode_flag;\n    uint8_t sharpness;\n    uint8_t noise_reduction;\n    uint8_t mpeg_noise_reduction;\n    uint8_t frame_rate_conversion;\n    uint8_t brightness;\n    uint8_t color;\n} AVDOVIDmLevel11;\n\ntypedef struct AVDOVIDmLevel254 {\n    /* DMv2 info block, always present in samples with DMv2 metadata */\n    uint8_t dm_mode;\n    uint8_t dm_version_index;\n} AVDOVIDmLevel254;\n\ntypedef struct AVDOVIDmLevel255 {\n    /* Debug block, not really used in samples */\n    uint8_t dm_run_mode;\n    uint8_t dm_run_version;\n    uint8_t dm_debug[4];\n} AVDOVIDmLevel255;\n\n/**\n * Dolby Vision metadata extension block. Dynamic extension blocks may change\n * from frame to frame, while static blocks are constant throughout the entire\n * sequence.\n *\n * @note sizeof(AVDOVIDmData) is not part of the public API.\n */\ntypedef struct AVDOVIDmData {\n    uint8_t level; /* [1, 255] */\n    union {\n        AVDOVIDmLevel1 l1; /* dynamic */\n        AVDOVIDmLevel2 l2; /* dynamic, may appear multiple times */\n        AVDOVIDmLevel3 l3; /* dynamic */\n        AVDOVIDmLevel4 l4; /* dynamic */\n        AVDOVIDmLevel5 l5; /* dynamic */\n        AVDOVIDmLevel6 l6; /* static */\n        /* level 7 is currently unused */\n        AVDOVIDmLevel8 l8; /* dynamic, may appear multiple times */\n        AVDOVIDmLevel9 l9; /* dynamic */\n        AVDOVIDmLevel10 l10; /* static, may appear multiple times */\n        AVDOVIDmLevel11 l11; /* dynamic */\n        AVDOVIDmLevel254 l254; /* static */\n        AVDOVIDmLevel255 l255; /* static */\n    };\n} AVDOVIDmData;\n\n/**\n * Combined struct representing a combination of header, mapping and color\n * metadata, for attaching to frames as side data.\n *\n * @note The struct must be allocated with av_dovi_metadata_alloc() and\n *       its size is not a part of the public ABI.\n */\n\ntypedef struct AVDOVIMetadata {\n    /**\n     * Offset in bytes from the beginning of this structure at which the\n     * respective structs start.\n     */\n    size_t header_offset;   /* AVDOVIRpuDataHeader */\n    size_t mapping_offset;  /* AVDOVIDataMapping */\n    size_t color_offset;    /* AVDOVIColorMetadata */\n\n    size_t ext_block_offset; /* offset to start of ext blocks array */\n    size_t ext_block_size; /* size per element */\n    int num_ext_blocks; /* number of extension blocks */\n\n    /* static limit on num_ext_blocks, derived from bitstream limitations */\n#define AV_DOVI_MAX_EXT_BLOCKS 32\n} AVDOVIMetadata;\n\nstatic av_always_inline AVDOVIRpuDataHeader *\nav_dovi_get_header(const AVDOVIMetadata *data)\n{\n    return (AVDOVIRpuDataHeader *)((uint8_t *) data + data->header_offset);\n}\n\nstatic av_always_inline AVDOVIDataMapping *\nav_dovi_get_mapping(const AVDOVIMetadata *data)\n{\n    return (AVDOVIDataMapping *)((uint8_t *) data + data->mapping_offset);\n}\n\nstatic av_always_inline AVDOVIColorMetadata *\nav_dovi_get_color(const AVDOVIMetadata *data)\n{\n    return (AVDOVIColorMetadata *)((uint8_t *) data + data->color_offset);\n}\n\nstatic av_always_inline AVDOVIDmData *\nav_dovi_get_ext(const AVDOVIMetadata *data, int index)\n{\n    return (AVDOVIDmData *)((uint8_t *) data + data->ext_block_offset +\n                            data->ext_block_size * index);\n}\n\n/**\n * Find an extension block with a given level, or NULL. In the case of\n * multiple extension blocks, only the first is returned.\n */\nAVDOVIDmData *av_dovi_find_level(const AVDOVIMetadata *data, uint8_t level);\n\n/**\n * Allocate an AVDOVIMetadata structure and initialize its\n * fields to default values.\n *\n * @param size If this parameter is non-NULL, the size in bytes of the\n *             allocated struct will be written here on success\n *\n * @return the newly allocated struct or NULL on failure\n */\nAVDOVIMetadata *av_dovi_metadata_alloc(size_t *size);\n\n#endif /* AVUTIL_DOVI_META_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/downmix_info.h",
    "content": "/*\n * Copyright (c) 2014 Tim Walker <tdskywalker@gmail.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_DOWNMIX_INFO_H\n#define AVUTIL_DOWNMIX_INFO_H\n\n#include \"frame.h\"\n\n/**\n * @file\n * audio downmix medatata\n */\n\n/**\n * @addtogroup lavu_audio\n * @{\n */\n\n/**\n * @defgroup downmix_info Audio downmix metadata\n * @{\n */\n\n/**\n * Possible downmix types.\n */\nenum AVDownmixType {\n    AV_DOWNMIX_TYPE_UNKNOWN, /**< Not indicated. */\n    AV_DOWNMIX_TYPE_LORO,    /**< Lo/Ro 2-channel downmix (Stereo). */\n    AV_DOWNMIX_TYPE_LTRT,    /**< Lt/Rt 2-channel downmix, Dolby Surround compatible. */\n    AV_DOWNMIX_TYPE_DPLII,   /**< Lt/Rt 2-channel downmix, Dolby Pro Logic II compatible. */\n    AV_DOWNMIX_TYPE_NB       /**< Number of downmix types. Not part of ABI. */\n};\n\n/**\n * This structure describes optional metadata relevant to a downmix procedure.\n *\n * All fields are set by the decoder to the value indicated in the audio\n * bitstream (if present), or to a \"sane\" default otherwise.\n */\ntypedef struct AVDownmixInfo {\n    /**\n     * Type of downmix preferred by the mastering engineer.\n     */\n    enum AVDownmixType preferred_downmix_type;\n\n    /**\n     * Absolute scale factor representing the nominal level of the center\n     * channel during a regular downmix.\n     */\n    double center_mix_level;\n\n    /**\n     * Absolute scale factor representing the nominal level of the center\n     * channel during an Lt/Rt compatible downmix.\n     */\n    double center_mix_level_ltrt;\n\n    /**\n     * Absolute scale factor representing the nominal level of the surround\n     * channels during a regular downmix.\n     */\n    double surround_mix_level;\n\n    /**\n     * Absolute scale factor representing the nominal level of the surround\n     * channels during an Lt/Rt compatible downmix.\n     */\n    double surround_mix_level_ltrt;\n\n    /**\n     * Absolute scale factor representing the level at which the LFE data is\n     * mixed into L/R channels during downmixing.\n     */\n    double lfe_mix_level;\n} AVDownmixInfo;\n\n/**\n * Get a frame's AV_FRAME_DATA_DOWNMIX_INFO side data for editing.\n *\n * If the side data is absent, it is created and added to the frame.\n *\n * @param frame the frame for which the side data is to be obtained or created\n *\n * @return the AVDownmixInfo structure to be edited by the caller, or NULL if\n *         the structure cannot be allocated.\n */\nAVDownmixInfo *av_downmix_info_update_side_data(AVFrame *frame);\n\n/**\n * @}\n */\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_DOWNMIX_INFO_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/encryption_info.h",
    "content": "/**\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_ENCRYPTION_INFO_H\n#define AVUTIL_ENCRYPTION_INFO_H\n\n#include <stddef.h>\n#include <stdint.h>\n\ntypedef struct AVSubsampleEncryptionInfo {\n    /** The number of bytes that are clear. */\n    unsigned int bytes_of_clear_data;\n\n    /**\n     * The number of bytes that are protected.  If using pattern encryption,\n     * the pattern applies to only the protected bytes; if not using pattern\n     * encryption, all these bytes are encrypted.\n     */\n    unsigned int bytes_of_protected_data;\n} AVSubsampleEncryptionInfo;\n\n/**\n * This describes encryption info for a packet.  This contains frame-specific\n * info for how to decrypt the packet before passing it to the decoder.\n *\n * The size of this struct is not part of the public ABI.\n */\ntypedef struct AVEncryptionInfo {\n    /** The fourcc encryption scheme, in big-endian byte order. */\n    uint32_t scheme;\n\n    /**\n     * Only used for pattern encryption.  This is the number of 16-byte blocks\n     * that are encrypted.\n     */\n    uint32_t crypt_byte_block;\n\n    /**\n     * Only used for pattern encryption.  This is the number of 16-byte blocks\n     * that are clear.\n     */\n    uint32_t skip_byte_block;\n\n    /**\n     * The ID of the key used to encrypt the packet.  This should always be\n     * 16 bytes long, but may be changed in the future.\n     */\n    uint8_t *key_id;\n    uint32_t key_id_size;\n\n    /**\n     * The initialization vector.  This may have been zero-filled to be the\n     * correct block size.  This should always be 16 bytes long, but may be\n     * changed in the future.\n     */\n    uint8_t *iv;\n    uint32_t iv_size;\n\n    /**\n     * An array of subsample encryption info specifying how parts of the sample\n     * are encrypted.  If there are no subsamples, then the whole sample is\n     * encrypted.\n     */\n    AVSubsampleEncryptionInfo *subsamples;\n    uint32_t subsample_count;\n} AVEncryptionInfo;\n\n/**\n * This describes info used to initialize an encryption key system.\n *\n * The size of this struct is not part of the public ABI.\n */\ntypedef struct AVEncryptionInitInfo {\n    /**\n     * A unique identifier for the key system this is for, can be NULL if it\n     * is not known.  This should always be 16 bytes, but may change in the\n     * future.\n     */\n    uint8_t* system_id;\n    uint32_t system_id_size;\n\n    /**\n     * An array of key IDs this initialization data is for.  All IDs are the\n     * same length.  Can be NULL if there are no known key IDs.\n     */\n    uint8_t** key_ids;\n    /** The number of key IDs. */\n    uint32_t num_key_ids;\n    /**\n     * The number of bytes in each key ID.  This should always be 16, but may\n     * change in the future.\n     */\n    uint32_t key_id_size;\n\n    /**\n     * Key-system specific initialization data.  This data is copied directly\n     * from the file and the format depends on the specific key system.  This\n     * can be NULL if there is no initialization data; in that case, there\n     * will be at least one key ID.\n     */\n    uint8_t* data;\n    uint32_t data_size;\n\n    /**\n     * An optional pointer to the next initialization info in the list.\n     */\n    struct AVEncryptionInitInfo *next;\n} AVEncryptionInitInfo;\n\n/**\n * Allocates an AVEncryptionInfo structure and sub-pointers to hold the given\n * number of subsamples.  This will allocate pointers for the key ID, IV,\n * and subsample entries, set the size members, and zero-initialize the rest.\n *\n * @param subsample_count The number of subsamples.\n * @param key_id_size The number of bytes in the key ID, should be 16.\n * @param iv_size The number of bytes in the IV, should be 16.\n *\n * @return The new AVEncryptionInfo structure, or NULL on error.\n */\nAVEncryptionInfo *av_encryption_info_alloc(uint32_t subsample_count, uint32_t key_id_size, uint32_t iv_size);\n\n/**\n * Allocates an AVEncryptionInfo structure with a copy of the given data.\n * @return The new AVEncryptionInfo structure, or NULL on error.\n */\nAVEncryptionInfo *av_encryption_info_clone(const AVEncryptionInfo *info);\n\n/**\n * Frees the given encryption info object.  This MUST NOT be used to free the\n * side-data data pointer, that should use normal side-data methods.\n */\nvoid av_encryption_info_free(AVEncryptionInfo *info);\n\n/**\n * Creates a copy of the AVEncryptionInfo that is contained in the given side\n * data.  The resulting object should be passed to av_encryption_info_free()\n * when done.\n *\n * @return The new AVEncryptionInfo structure, or NULL on error.\n */\nAVEncryptionInfo *av_encryption_info_get_side_data(const uint8_t *side_data, size_t side_data_size);\n\n/**\n * Allocates and initializes side data that holds a copy of the given encryption\n * info.  The resulting pointer should be either freed using av_free or given\n * to av_packet_add_side_data().\n *\n * @return The new side-data pointer, or NULL.\n */\nuint8_t *av_encryption_info_add_side_data(\n      const AVEncryptionInfo *info, size_t *side_data_size);\n\n\n/**\n * Allocates an AVEncryptionInitInfo structure and sub-pointers to hold the\n * given sizes.  This will allocate pointers and set all the fields.\n *\n * @return The new AVEncryptionInitInfo structure, or NULL on error.\n */\nAVEncryptionInitInfo *av_encryption_init_info_alloc(\n    uint32_t system_id_size, uint32_t num_key_ids, uint32_t key_id_size, uint32_t data_size);\n\n/**\n * Frees the given encryption init info object.  This MUST NOT be used to free\n * the side-data data pointer, that should use normal side-data methods.\n */\nvoid av_encryption_init_info_free(AVEncryptionInitInfo* info);\n\n/**\n * Creates a copy of the AVEncryptionInitInfo that is contained in the given\n * side data.  The resulting object should be passed to\n * av_encryption_init_info_free() when done.\n *\n * @return The new AVEncryptionInitInfo structure, or NULL on error.\n */\nAVEncryptionInitInfo *av_encryption_init_info_get_side_data(\n    const uint8_t* side_data, size_t side_data_size);\n\n/**\n * Allocates and initializes side data that holds a copy of the given encryption\n * init info.  The resulting pointer should be either freed using av_free or\n * given to av_packet_add_side_data().\n *\n * @return The new side-data pointer, or NULL.\n */\nuint8_t *av_encryption_init_info_add_side_data(\n    const AVEncryptionInitInfo *info, size_t *side_data_size);\n\n#endif /* AVUTIL_ENCRYPTION_INFO_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/error.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * error code definitions\n */\n\n#ifndef AVUTIL_ERROR_H\n#define AVUTIL_ERROR_H\n\n#include <errno.h>\n#include <stddef.h>\n\n#include \"macros.h\"\n\n/**\n * @addtogroup lavu_error\n *\n * @{\n */\n\n\n/* error handling */\n#if EDOM > 0\n#define AVERROR(e) (-(e))   ///< Returns a negative error code from a POSIX error code, to return from library functions.\n#define AVUNERROR(e) (-(e)) ///< Returns a POSIX error code from a library function error return value.\n#else\n/* Some platforms have E* and errno already negated. */\n#define AVERROR(e) (e)\n#define AVUNERROR(e) (e)\n#endif\n\n#define FFERRTAG(a, b, c, d) (-(int)MKTAG(a, b, c, d))\n\n#define AVERROR_BSF_NOT_FOUND      FFERRTAG(0xF8,'B','S','F') ///< Bitstream filter not found\n#define AVERROR_BUG                FFERRTAG( 'B','U','G','!') ///< Internal bug, also see AVERROR_BUG2\n#define AVERROR_BUFFER_TOO_SMALL   FFERRTAG( 'B','U','F','S') ///< Buffer too small\n#define AVERROR_DECODER_NOT_FOUND  FFERRTAG(0xF8,'D','E','C') ///< Decoder not found\n#define AVERROR_DEMUXER_NOT_FOUND  FFERRTAG(0xF8,'D','E','M') ///< Demuxer not found\n#define AVERROR_ENCODER_NOT_FOUND  FFERRTAG(0xF8,'E','N','C') ///< Encoder not found\n#define AVERROR_EOF                FFERRTAG( 'E','O','F',' ') ///< End of file\n#define AVERROR_EXIT               FFERRTAG( 'E','X','I','T') ///< Immediate exit was requested; the called function should not be restarted\n#define AVERROR_EXTERNAL           FFERRTAG( 'E','X','T',' ') ///< Generic error in an external library\n#define AVERROR_FILTER_NOT_FOUND   FFERRTAG(0xF8,'F','I','L') ///< Filter not found\n#define AVERROR_INVALIDDATA        FFERRTAG( 'I','N','D','A') ///< Invalid data found when processing input\n#define AVERROR_MUXER_NOT_FOUND    FFERRTAG(0xF8,'M','U','X') ///< Muxer not found\n#define AVERROR_OPTION_NOT_FOUND   FFERRTAG(0xF8,'O','P','T') ///< Option not found\n#define AVERROR_PATCHWELCOME       FFERRTAG( 'P','A','W','E') ///< Not yet implemented in FFmpeg, patches welcome\n#define AVERROR_PROTOCOL_NOT_FOUND FFERRTAG(0xF8,'P','R','O') ///< Protocol not found\n\n#define AVERROR_STREAM_NOT_FOUND   FFERRTAG(0xF8,'S','T','R') ///< Stream not found\n/**\n * This is semantically identical to AVERROR_BUG\n * it has been introduced in Libav after our AVERROR_BUG and with a modified value.\n */\n#define AVERROR_BUG2               FFERRTAG( 'B','U','G',' ')\n#define AVERROR_UNKNOWN            FFERRTAG( 'U','N','K','N') ///< Unknown error, typically from an external library\n#define AVERROR_EXPERIMENTAL       (-0x2bb2afa8) ///< Requested feature is flagged experimental. Set strict_std_compliance if you really want to use it.\n#define AVERROR_INPUT_CHANGED      (-0x636e6701) ///< Input changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_OUTPUT_CHANGED)\n#define AVERROR_OUTPUT_CHANGED     (-0x636e6702) ///< Output changed between calls. Reconfiguration is required. (can be OR-ed with AVERROR_INPUT_CHANGED)\n/* HTTP & RTSP errors */\n#define AVERROR_HTTP_BAD_REQUEST   FFERRTAG(0xF8,'4','0','0')\n#define AVERROR_HTTP_UNAUTHORIZED  FFERRTAG(0xF8,'4','0','1')\n#define AVERROR_HTTP_FORBIDDEN     FFERRTAG(0xF8,'4','0','3')\n#define AVERROR_HTTP_NOT_FOUND     FFERRTAG(0xF8,'4','0','4')\n#define AVERROR_HTTP_TOO_MANY_REQUESTS FFERRTAG(0xF8,'4','2','9')\n#define AVERROR_HTTP_OTHER_4XX     FFERRTAG(0xF8,'4','X','X')\n#define AVERROR_HTTP_SERVER_ERROR  FFERRTAG(0xF8,'5','X','X')\n\n#define AV_ERROR_MAX_STRING_SIZE 64\n\n/**\n * Put a description of the AVERROR code errnum in errbuf.\n * In case of failure the global variable errno is set to indicate the\n * error. Even in case of failure av_strerror() will print a generic\n * error message indicating the errnum provided to errbuf.\n *\n * @param errnum      error code to describe\n * @param errbuf      buffer to which description is written\n * @param errbuf_size the size in bytes of errbuf\n * @return 0 on success, a negative value if a description for errnum\n * cannot be found\n */\nint av_strerror(int errnum, char *errbuf, size_t errbuf_size);\n\n/**\n * Fill the provided buffer with a string containing an error string\n * corresponding to the AVERROR code errnum.\n *\n * @param errbuf         a buffer\n * @param errbuf_size    size in bytes of errbuf\n * @param errnum         error code to describe\n * @return the buffer in input, filled with the error description\n * @see av_strerror()\n */\nstatic inline char *av_make_error_string(char *errbuf, size_t errbuf_size, int errnum)\n{\n    av_strerror(errnum, errbuf, errbuf_size);\n    return errbuf;\n}\n\n/**\n * Convenience macro, the return value should be used only directly in\n * function arguments but never stand-alone.\n */\n#define av_err2str(errnum) \\\n    av_make_error_string((char[AV_ERROR_MAX_STRING_SIZE]){0}, AV_ERROR_MAX_STRING_SIZE, errnum)\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_ERROR_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/eval.h",
    "content": "/*\n * Copyright (c) 2002 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * simple arithmetic expression evaluator\n */\n\n#ifndef AVUTIL_EVAL_H\n#define AVUTIL_EVAL_H\n\ntypedef struct AVExpr AVExpr;\n\n/**\n * Parse and evaluate an expression.\n * Note, this is significantly slower than av_expr_eval().\n *\n * @param res a pointer to a double where is put the result value of\n * the expression, or NAN in case of error\n * @param s expression as a zero terminated string, for example \"1+2^3+5*5+sin(2/3)\"\n * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {\"PI\", \"E\", 0}\n * @param const_values a zero terminated array of values for the identifiers from const_names\n * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers\n * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument\n * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers\n * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments\n * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2\n * @param log_offset log level offset, can be used to silence error messages\n * @param log_ctx parent logging context\n * @return >= 0 in case of success, a negative value corresponding to an\n * AVERROR code otherwise\n */\nint av_expr_parse_and_eval(double *res, const char *s,\n                           const char * const *const_names, const double *const_values,\n                           const char * const *func1_names, double (* const *funcs1)(void *, double),\n                           const char * const *func2_names, double (* const *funcs2)(void *, double, double),\n                           void *opaque, int log_offset, void *log_ctx);\n\n/**\n * Parse an expression.\n *\n * @param expr a pointer where is put an AVExpr containing the parsed\n * value in case of successful parsing, or NULL otherwise.\n * The pointed to AVExpr must be freed with av_expr_free() by the user\n * when it is not needed anymore.\n * @param s expression as a zero terminated string, for example \"1+2^3+5*5+sin(2/3)\"\n * @param const_names NULL terminated array of zero terminated strings of constant identifiers, for example {\"PI\", \"E\", 0}\n * @param func1_names NULL terminated array of zero terminated strings of funcs1 identifiers\n * @param funcs1 NULL terminated array of function pointers for functions which take 1 argument\n * @param func2_names NULL terminated array of zero terminated strings of funcs2 identifiers\n * @param funcs2 NULL terminated array of function pointers for functions which take 2 arguments\n * @param log_offset log level offset, can be used to silence error messages\n * @param log_ctx parent logging context\n * @return >= 0 in case of success, a negative value corresponding to an\n * AVERROR code otherwise\n */\nint av_expr_parse(AVExpr **expr, const char *s,\n                  const char * const *const_names,\n                  const char * const *func1_names, double (* const *funcs1)(void *, double),\n                  const char * const *func2_names, double (* const *funcs2)(void *, double, double),\n                  int log_offset, void *log_ctx);\n\n/**\n * Evaluate a previously parsed expression.\n *\n * @param e the AVExpr to evaluate\n * @param const_values a zero terminated array of values for the identifiers from av_expr_parse() const_names\n * @param opaque a pointer which will be passed to all functions from funcs1 and funcs2\n * @return the value of the expression\n */\ndouble av_expr_eval(AVExpr *e, const double *const_values, void *opaque);\n\n/**\n * Track the presence of variables and their number of occurrences in a parsed expression\n *\n * @param e the AVExpr to track variables in\n * @param counter a zero-initialized array where the count of each variable will be stored\n * @param size size of array\n * @return 0 on success, a negative value indicates that no expression or array was passed\n * or size was zero\n */\nint av_expr_count_vars(AVExpr *e, unsigned *counter, int size);\n\n/**\n * Track the presence of user provided functions and their number of occurrences\n * in a parsed expression.\n *\n * @param e the AVExpr to track user provided functions in\n * @param counter a zero-initialized array where the count of each function will be stored\n *                if you passed 5 functions with 2 arguments to av_expr_parse()\n *                then for arg=2 this will use up to 5 entries.\n * @param size size of array\n * @param arg number of arguments the counted functions have\n * @return 0 on success, a negative value indicates that no expression or array was passed\n * or size was zero\n */\nint av_expr_count_func(AVExpr *e, unsigned *counter, int size, int arg);\n\n/**\n * Free a parsed expression previously created with av_expr_parse().\n */\nvoid av_expr_free(AVExpr *e);\n\n/**\n * Parse the string in numstr and return its value as a double. If\n * the string is empty, contains only whitespaces, or does not contain\n * an initial substring that has the expected syntax for a\n * floating-point number, no conversion is performed. In this case,\n * returns a value of zero and the value returned in tail is the value\n * of numstr.\n *\n * @param numstr a string representing a number, may contain one of\n * the International System number postfixes, for example 'K', 'M',\n * 'G'. If 'i' is appended after the postfix, powers of 2 are used\n * instead of powers of 10. The 'B' postfix multiplies the value by\n * 8, and can be appended after another postfix or used alone. This\n * allows using for example 'KB', 'MiB', 'G' and 'B' as postfix.\n * @param tail if non-NULL puts here the pointer to the char next\n * after the last parsed character\n */\ndouble av_strtod(const char *numstr, char **tail);\n\n#endif /* AVUTIL_EVAL_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/executor.h",
    "content": "/*\n * Copyright (C) 2023 Nuo Mi\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_EXECUTOR_H\n#define AVUTIL_EXECUTOR_H\n\ntypedef struct AVExecutor AVExecutor;\ntypedef struct AVTask AVTask;\n\nstruct AVTask {\n    AVTask *next;\n};\n\ntypedef struct AVTaskCallbacks {\n    void *user_data;\n\n    int local_context_size;\n\n    // return 1 if a's priority > b's priority\n    int (*priority_higher)(const AVTask *a, const AVTask *b);\n\n    // task is ready for run\n    int (*ready)(const AVTask *t, void *user_data);\n\n    // run the task\n    int (*run)(AVTask *t, void *local_context, void *user_data);\n} AVTaskCallbacks;\n\n/**\n * Alloc executor\n * @param callbacks callback structure for executor\n * @param thread_count worker thread number, 0 for run on caller's thread directly\n * @return return the executor\n */\nAVExecutor* av_executor_alloc(const AVTaskCallbacks *callbacks, int thread_count);\n\n/**\n * Free executor\n * @param e  pointer to executor\n */\nvoid av_executor_free(AVExecutor **e);\n\n/**\n * Add task to executor\n * @param e pointer to executor\n * @param t pointer to task. If NULL, it will wakeup one work thread\n */\nvoid av_executor_execute(AVExecutor *e, AVTask *t);\n\n#endif //AVUTIL_EXECUTOR_H\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/ffversion.h",
    "content": "/* Automatically generated by version.sh, do not manually edit! */\n#ifndef AVUTIL_FFVERSION_H\n#define AVUTIL_FFVERSION_H\n#define FFMPEG_VERSION \"8.0.1\"\n#endif /* AVUTIL_FFVERSION_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/fifo.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_fifo\n * A generic FIFO API\n */\n\n#ifndef AVUTIL_FIFO_H\n#define AVUTIL_FIFO_H\n\n#include <stddef.h>\n\n/**\n * @defgroup lavu_fifo AVFifo\n * @ingroup lavu_data\n *\n * @{\n * A generic FIFO API\n */\n\ntypedef struct AVFifo AVFifo;\n\n/**\n * Callback for writing or reading from a FIFO, passed to (and invoked from) the\n * av_fifo_*_cb() functions. It may be invoked multiple times from a single\n * av_fifo_*_cb() call and may process less data than the maximum size indicated\n * by nb_elems.\n *\n * @param opaque the opaque pointer provided to the av_fifo_*_cb() function\n * @param buf the buffer for reading or writing the data, depending on which\n *            av_fifo_*_cb function is called\n * @param nb_elems On entry contains the maximum number of elements that can be\n *                 read from / written into buf. On success, the callback should\n *                 update it to contain the number of elements actually written.\n *\n * @return 0 on success, a negative error code on failure (will be returned from\n *         the invoking av_fifo_*_cb() function)\n */\ntypedef int AVFifoCB(void *opaque, void *buf, size_t *nb_elems);\n\n/**\n * Automatically resize the FIFO on writes, so that the data fits. This\n * automatic resizing happens up to a limit that can be modified with\n * av_fifo_auto_grow_limit().\n */\n#define AV_FIFO_FLAG_AUTO_GROW      (1 << 0)\n\n/**\n * Allocate and initialize an AVFifo with a given element size.\n *\n * @param elems     initial number of elements that can be stored in the FIFO\n * @param elem_size Size in bytes of a single element. Further operations on\n *                  the returned FIFO will implicitly use this element size.\n * @param flags a combination of AV_FIFO_FLAG_*\n *\n * @return newly-allocated AVFifo on success, a negative error code on failure\n */\nAVFifo *av_fifo_alloc2(size_t elems, size_t elem_size,\n                       unsigned int flags);\n\n/**\n * @return Element size for FIFO operations. This element size is set at\n *         FIFO allocation and remains constant during its lifetime\n */\nsize_t av_fifo_elem_size(const AVFifo *f);\n\n/**\n * Set the maximum size (in elements) to which the FIFO can be resized\n * automatically. Has no effect unless AV_FIFO_FLAG_AUTO_GROW is used.\n */\nvoid av_fifo_auto_grow_limit(AVFifo *f, size_t max_elems);\n\n/**\n * @return number of elements available for reading from the given FIFO.\n */\nsize_t av_fifo_can_read(const AVFifo *f);\n\n/**\n * @return Number of elements that can be written into the given FIFO without\n *         growing it.\n *\n *         In other words, this number of elements or less is guaranteed to fit\n *         into the FIFO. More data may be written when the\n *         AV_FIFO_FLAG_AUTO_GROW flag was specified at FIFO creation, but this\n *         may involve memory allocation, which can fail.\n */\nsize_t av_fifo_can_write(const AVFifo *f);\n\n/**\n * Enlarge an AVFifo.\n *\n * On success, the FIFO will be large enough to hold exactly\n * inc + av_fifo_can_read() + av_fifo_can_write()\n * elements. In case of failure, the old FIFO is kept unchanged.\n *\n * @param f AVFifo to resize\n * @param inc number of elements to allocate for, in addition to the current\n *            allocated size\n * @return a non-negative number on success, a negative error code on failure\n */\nint av_fifo_grow2(AVFifo *f, size_t inc);\n\n/**\n * Write data into a FIFO.\n *\n * In case nb_elems > av_fifo_can_write(f) and the AV_FIFO_FLAG_AUTO_GROW flag\n * was not specified at FIFO creation, nothing is written and an error\n * is returned.\n *\n * Calling function is guaranteed to succeed if nb_elems <= av_fifo_can_write(f).\n *\n * @param f the FIFO buffer\n * @param buf Data to be written. nb_elems * av_fifo_elem_size(f) bytes will be\n *            read from buf on success.\n * @param nb_elems number of elements to write into FIFO\n *\n * @return a non-negative number on success, a negative error code on failure\n */\nint av_fifo_write(AVFifo *f, const void *buf, size_t nb_elems);\n\n/**\n * Write data from a user-provided callback into a FIFO.\n *\n * @param f the FIFO buffer\n * @param read_cb Callback supplying the data to the FIFO. May be called\n *                multiple times.\n * @param opaque opaque user data to be provided to read_cb\n * @param nb_elems Should point to the maximum number of elements that can be\n *                 written. Will be updated to contain the number of elements\n *                 actually written.\n *\n * @return non-negative number on success, a negative error code on failure\n */\nint av_fifo_write_from_cb(AVFifo *f, AVFifoCB read_cb,\n                          void *opaque, size_t *nb_elems);\n\n/**\n * Read data from a FIFO.\n *\n * In case nb_elems > av_fifo_can_read(f), nothing is read and an error\n * is returned.\n *\n * @param f the FIFO buffer\n * @param buf Buffer to store the data. nb_elems * av_fifo_elem_size(f) bytes\n *            will be written into buf on success.\n * @param nb_elems number of elements to read from FIFO\n *\n * @return a non-negative number on success, a negative error code on failure\n */\nint av_fifo_read(AVFifo *f, void *buf, size_t nb_elems);\n\n/**\n * Feed data from a FIFO into a user-provided callback.\n *\n * @param f the FIFO buffer\n * @param write_cb Callback the data will be supplied to. May be called\n *                 multiple times.\n * @param opaque opaque user data to be provided to write_cb\n * @param nb_elems Should point to the maximum number of elements that can be\n *                 read. Will be updated to contain the total number of elements\n *                 actually sent to the callback.\n *\n * @return non-negative number on success, a negative error code on failure\n */\nint av_fifo_read_to_cb(AVFifo *f, AVFifoCB write_cb,\n                       void *opaque, size_t *nb_elems);\n\n/**\n * Read data from a FIFO without modifying FIFO state.\n *\n * Returns an error if an attempt is made to peek to nonexistent elements\n * (i.e. if offset + nb_elems is larger than av_fifo_can_read(f)).\n *\n * @param f the FIFO buffer\n * @param buf Buffer to store the data. nb_elems * av_fifo_elem_size(f) bytes\n *            will be written into buf.\n * @param nb_elems number of elements to read from FIFO\n * @param offset number of initial elements to skip.\n *\n * @return a non-negative number on success, a negative error code on failure\n */\nint av_fifo_peek(const AVFifo *f, void *buf, size_t nb_elems, size_t offset);\n\n/**\n * Feed data from a FIFO into a user-provided callback.\n *\n * @param f the FIFO buffer\n * @param write_cb Callback the data will be supplied to. May be called\n *                 multiple times.\n * @param opaque opaque user data to be provided to write_cb\n * @param nb_elems Should point to the maximum number of elements that can be\n *                 read. Will be updated to contain the total number of elements\n *                 actually sent to the callback.\n * @param offset number of initial elements to skip; offset + *nb_elems must not\n *               be larger than av_fifo_can_read(f).\n *\n * @return a non-negative number on success, a negative error code on failure\n */\nint av_fifo_peek_to_cb(const AVFifo *f, AVFifoCB write_cb, void *opaque,\n                       size_t *nb_elems, size_t offset);\n\n/**\n * Discard the specified amount of data from an AVFifo.\n * @param size number of elements to discard, MUST NOT be larger than\n *             av_fifo_can_read(f)\n */\nvoid av_fifo_drain2(AVFifo *f, size_t size);\n\n/*\n * Empty the AVFifo.\n * @param f AVFifo to reset\n */\nvoid av_fifo_reset2(AVFifo *f);\n\n/**\n * Free an AVFifo and reset pointer to NULL.\n * @param f Pointer to an AVFifo to free. *f == NULL is allowed.\n */\nvoid av_fifo_freep2(AVFifo **f);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_FIFO_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/file.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_FILE_H\n#define AVUTIL_FILE_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"attributes.h\"\n\n/**\n * @file\n * Misc file utilities.\n */\n\n/**\n * Read the file with name filename, and put its content in a newly\n * allocated buffer or map it with mmap() when available.\n * In case of success set *bufptr to the read or mmapped buffer, and\n * *size to the size in bytes of the buffer in *bufptr.\n * Unlike mmap this function succeeds with zero sized files, in this\n * case *bufptr will be set to NULL and *size will be set to 0.\n * The returned buffer must be released with av_file_unmap().\n *\n * @param filename path to the file\n * @param[out] bufptr pointee is set to the mapped or allocated buffer\n * @param[out] size pointee is set to the size in bytes of the buffer\n * @param log_offset loglevel offset used for logging\n * @param log_ctx context used for logging\n * @return a non negative number in case of success, a negative value\n * corresponding to an AVERROR error code in case of failure\n */\nav_warn_unused_result\nint av_file_map(const char *filename, uint8_t **bufptr, size_t *size,\n                int log_offset, void *log_ctx);\n\n/**\n * Unmap or free the buffer bufptr created by av_file_map().\n *\n * @param bufptr the buffer previously created with av_file_map()\n * @param size size in bytes of bufptr, must be the same as returned\n * by av_file_map()\n */\nvoid av_file_unmap(uint8_t *bufptr, size_t size);\n\n#endif /* AVUTIL_FILE_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/film_grain_params.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_FILM_GRAIN_PARAMS_H\n#define AVUTIL_FILM_GRAIN_PARAMS_H\n\n#include \"frame.h\"\n\nenum AVFilmGrainParamsType {\n    AV_FILM_GRAIN_PARAMS_NONE = 0,\n\n    /**\n     * The union is valid when interpreted as AVFilmGrainAOMParams (codec.aom)\n     */\n    AV_FILM_GRAIN_PARAMS_AV1,\n\n    /**\n     * The union is valid when interpreted as AVFilmGrainH274Params (codec.h274)\n     */\n    AV_FILM_GRAIN_PARAMS_H274,\n};\n\n/**\n * This structure describes how to handle film grain synthesis for AOM codecs.\n *\n * @note The struct must be allocated as part of AVFilmGrainParams using\n *       av_film_grain_params_alloc(). Its size is not a part of the public ABI.\n */\ntypedef struct AVFilmGrainAOMParams {\n    /**\n     * Number of points, and the scale and value for each point of the\n     * piecewise linear scaling function for the uma plane.\n     */\n    int num_y_points;\n    uint8_t y_points[14][2 /* value, scaling */];\n\n    /**\n     * Signals whether to derive the chroma scaling function from the luma.\n     * Not equivalent to copying the luma values and scales.\n     */\n    int chroma_scaling_from_luma;\n\n    /**\n     * If chroma_scaling_from_luma is set to 0, signals the chroma scaling\n     * function parameters.\n     */\n    int num_uv_points[2 /* cb, cr */];\n    uint8_t uv_points[2 /* cb, cr */][10][2 /* value, scaling */];\n\n    /**\n     * Specifies the shift applied to the chroma components. For AV1, its within\n     * [8; 11] and determines the range and quantization of the film grain.\n     */\n    int scaling_shift;\n\n    /**\n     * Specifies the auto-regression lag.\n     */\n    int ar_coeff_lag;\n\n    /**\n     * Luma auto-regression coefficients. The number of coefficients is given by\n     * 2 * ar_coeff_lag * (ar_coeff_lag + 1).\n     */\n    int8_t ar_coeffs_y[24];\n\n    /**\n     * Chroma auto-regression coefficients. The number of coefficients is given by\n     * 2 * ar_coeff_lag * (ar_coeff_lag + 1) + !!num_y_points.\n     */\n    int8_t ar_coeffs_uv[2 /* cb, cr */][25];\n\n    /**\n     * Specifies the range of the auto-regressive coefficients. Values of 6,\n     * 7, 8 and so on represent a range of [-2, 2), [-1, 1), [-0.5, 0.5) and\n     * so on. For AV1 must be between 6 and 9.\n     */\n    int ar_coeff_shift;\n\n    /**\n     * Signals the down shift applied to the generated gaussian numbers during\n     * synthesis.\n     */\n    int grain_scale_shift;\n\n    /**\n     * Specifies the luma/chroma multipliers for the index to the component\n     * scaling function.\n     */\n    int uv_mult[2 /* cb, cr */];\n    int uv_mult_luma[2 /* cb, cr */];\n\n    /**\n     * Offset used for component scaling function. For AV1 its a 9-bit value\n     * with a range [-256, 255]\n     */\n    int uv_offset[2 /* cb, cr */];\n\n    /**\n     * Signals whether to overlap film grain blocks.\n     */\n    int overlap_flag;\n\n    /**\n     * Signals to clip to limited color levels after film grain application.\n     */\n    int limit_output_range;\n} AVFilmGrainAOMParams;\n\n/**\n * This structure describes how to handle film grain synthesis for codecs using\n * the ITU-T H.274 Versatile supplemental enhancement information message.\n *\n * @note The struct must be allocated as part of AVFilmGrainParams using\n *       av_film_grain_params_alloc(). Its size is not a part of the public ABI.\n */\ntypedef struct AVFilmGrainH274Params {\n    /**\n     * Specifies the film grain simulation mode.\n     * 0 = Frequency filtering, 1 = Auto-regression\n     */\n    int model_id;\n\n    /**\n     * Specifies the blending mode used to blend the simulated film grain\n     * with the decoded images.\n     *\n     * 0 = Additive, 1 = Multiplicative\n     */\n    int blending_mode_id;\n\n    /**\n     * Specifies a scale factor used in the film grain characterization equations.\n     */\n    int log2_scale_factor;\n\n    /**\n     * Indicates if the modelling of film grain for a given component is present.\n     */\n    int component_model_present[3 /* y, cb, cr */];\n\n    /**\n     * Specifies the number of intensity intervals for which a specific set of\n     * model values has been estimated, with a range of [1, 256].\n     */\n    uint16_t num_intensity_intervals[3 /* y, cb, cr */];\n\n    /**\n     * Specifies the number of model values present for each intensity interval\n     * in which the film grain has been modelled, with a range of [1, 6].\n     */\n    uint8_t num_model_values[3 /* y, cb, cr */];\n\n    /**\n     * Specifies the lower ounds of each intensity interval for whichthe set of\n     * model values applies for the component.\n     */\n    uint8_t intensity_interval_lower_bound[3 /* y, cb, cr */][256 /* intensity interval */];\n\n    /**\n     * Specifies the upper bound of each intensity interval for which the set of\n     * model values applies for the component.\n     */\n    uint8_t intensity_interval_upper_bound[3 /* y, cb, cr */][256 /* intensity interval */];\n\n    /**\n     * Specifies the model values for the component for each intensity interval.\n     * - When model_id == 0, the following applies:\n     *     For comp_model_value[y], the range of values is [0, 2^bit_depth_luma - 1]\n     *     For comp_model_value[cb..cr], the range of values is [0, 2^bit_depth_chroma - 1]\n     * - Otherwise, the following applies:\n     *     For comp_model_value[y], the range of values is [-2^(bit_depth_luma - 1), 2^(bit_depth_luma - 1) - 1]\n     *     For comp_model_value[cb..cr], the range of values is [-2^(bit_depth_chroma - 1), 2^(bit_depth_chroma - 1) - 1]\n     */\n    int16_t comp_model_value[3 /* y, cb, cr */][256 /* intensity interval */][6 /* model value */];\n} AVFilmGrainH274Params;\n\n/**\n * This structure describes how to handle film grain synthesis in video\n * for specific codecs. Must be present on every frame where film grain is\n * meant to be synthesised for correct presentation.\n *\n * @note The struct must be allocated with av_film_grain_params_alloc() and\n *       its size is not a part of the public ABI.\n */\ntypedef struct AVFilmGrainParams {\n    /**\n     * Specifies the codec for which this structure is valid.\n     */\n    enum AVFilmGrainParamsType type;\n\n    /**\n     * Seed to use for the synthesis process, if the codec allows for it.\n     *\n     * @note For H.264, this refers to `pic_offset` as defined in\n     *       SMPTE RDD 5-2006.\n     */\n    uint64_t seed;\n\n    /**\n     * Intended display resolution. May be 0 if the codec does not specify\n     * any restrictions.\n     */\n\n    int width, height;\n\n    /**\n     * Intended subsampling ratio, or 0 for luma-only streams.\n     */\n    int subsampling_x, subsampling_y;\n\n    /**\n     * Intended video signal characteristics.\n     */\n    enum AVColorRange                  color_range;\n    enum AVColorPrimaries              color_primaries;\n    enum AVColorTransferCharacteristic color_trc;\n    enum AVColorSpace                  color_space;\n\n    /**\n     * Intended bit depth, or 0 for unknown/unspecified.\n     */\n    int bit_depth_luma;\n    int bit_depth_chroma;\n\n    /**\n     * Additional fields may be added both here and in any structure included.\n     * If a codec's film grain structure differs slightly over another\n     * codec's, fields within may change meaning depending on the type.\n     */\n    union {\n        AVFilmGrainAOMParams aom;\n        AVFilmGrainH274Params h274;\n    } codec;\n} AVFilmGrainParams;\n\n/**\n * Allocate an AVFilmGrainParams structure and set its fields to\n * default values. The resulting struct can be freed using av_freep().\n * If size is not NULL it will be set to the number of bytes allocated.\n *\n * @return An AVFilmGrainParams filled with default values or NULL\n *         on failure.\n */\nAVFilmGrainParams *av_film_grain_params_alloc(size_t *size);\n\n/**\n * Allocate a complete AVFilmGrainParams and add it to the frame.\n *\n * @param frame The frame which side data is added to.\n *\n * @return The AVFilmGrainParams structure to be filled by caller.\n */\nAVFilmGrainParams *av_film_grain_params_create_side_data(AVFrame *frame);\n\n/**\n * Select the most appropriate film grain parameters set for the frame,\n * taking into account the frame's format, resolution and video signal\n * characteristics.\n *\n * @note, for H.274, this may select a film grain parameter set with\n * greater chroma resolution than the frame. Users should take care to\n * correctly adjust the chroma grain frequency to the frame.\n */\nconst AVFilmGrainParams *av_film_grain_params_select(const AVFrame *frame);\n\n#endif /* AVUTIL_FILM_GRAIN_PARAMS_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/frame.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_frame\n * reference-counted frame API\n */\n\n#ifndef AVUTIL_FRAME_H\n#define AVUTIL_FRAME_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"avutil.h\"\n#include \"buffer.h\"\n#include \"channel_layout.h\"\n#include \"dict.h\"\n#include \"rational.h\"\n#include \"samplefmt.h\"\n#include \"pixfmt.h\"\n#include \"version.h\"\n\n\n/**\n * @defgroup lavu_frame AVFrame\n * @ingroup lavu_data\n *\n * @{\n * AVFrame is an abstraction for reference-counted raw multimedia data.\n */\n\nenum AVFrameSideDataType {\n    /**\n     * The data is the AVPanScan struct defined in libavcodec.\n     */\n    AV_FRAME_DATA_PANSCAN,\n    /**\n     * ATSC A53 Part 4 Closed Captions.\n     * A53 CC bitstream is stored as uint8_t in AVFrameSideData.data.\n     * The number of bytes of CC data is AVFrameSideData.size.\n     */\n    AV_FRAME_DATA_A53_CC,\n    /**\n     * Stereoscopic 3d metadata.\n     * The data is the AVStereo3D struct defined in libavutil/stereo3d.h.\n     */\n    AV_FRAME_DATA_STEREO3D,\n    /**\n     * The data is the AVMatrixEncoding enum defined in libavutil/channel_layout.h.\n     */\n    AV_FRAME_DATA_MATRIXENCODING,\n    /**\n     * Metadata relevant to a downmix procedure.\n     * The data is the AVDownmixInfo struct defined in libavutil/downmix_info.h.\n     */\n    AV_FRAME_DATA_DOWNMIX_INFO,\n    /**\n     * ReplayGain information in the form of the AVReplayGain struct.\n     */\n    AV_FRAME_DATA_REPLAYGAIN,\n    /**\n     * This side data contains a 3x3 transformation matrix describing an affine\n     * transformation that needs to be applied to the frame for correct\n     * presentation.\n     *\n     * See libavutil/display.h for a detailed description of the data.\n     */\n    AV_FRAME_DATA_DISPLAYMATRIX,\n    /**\n     * Active Format Description data consisting of a single byte as specified\n     * in ETSI TS 101 154 using AVActiveFormatDescription enum.\n     */\n    AV_FRAME_DATA_AFD,\n    /**\n     * Motion vectors exported by some codecs (on demand through the export_mvs\n     * flag set in the libavcodec AVCodecContext flags2 option).\n     * The data is the AVMotionVector struct defined in\n     * libavutil/motion_vector.h.\n     */\n    AV_FRAME_DATA_MOTION_VECTORS,\n    /**\n     * Recommends skipping the specified number of samples. This is exported\n     * only if the \"skip_manual\" AVOption is set in libavcodec.\n     * This has the same format as AV_PKT_DATA_SKIP_SAMPLES.\n     * @code\n     * u32le number of samples to skip from start of this packet\n     * u32le number of samples to skip from end of this packet\n     * u8    reason for start skip\n     * u8    reason for end   skip (0=padding silence, 1=convergence)\n     * @endcode\n     */\n    AV_FRAME_DATA_SKIP_SAMPLES,\n    /**\n     * This side data must be associated with an audio frame and corresponds to\n     * enum AVAudioServiceType defined in avcodec.h.\n     */\n    AV_FRAME_DATA_AUDIO_SERVICE_TYPE,\n    /**\n     * Mastering display metadata associated with a video frame. The payload is\n     * an AVMasteringDisplayMetadata type and contains information about the\n     * mastering display color volume.\n     */\n    AV_FRAME_DATA_MASTERING_DISPLAY_METADATA,\n    /**\n     * The GOP timecode in 25 bit timecode format. Data format is 64-bit integer.\n     * This is set on the first frame of a GOP that has a temporal reference of 0.\n     */\n    AV_FRAME_DATA_GOP_TIMECODE,\n\n    /**\n     * The data represents the AVSphericalMapping structure defined in\n     * libavutil/spherical.h.\n     */\n    AV_FRAME_DATA_SPHERICAL,\n\n    /**\n     * Content light level (based on CTA-861.3). This payload contains data in\n     * the form of the AVContentLightMetadata struct.\n     */\n    AV_FRAME_DATA_CONTENT_LIGHT_LEVEL,\n\n    /**\n     * The data contains an ICC profile as an opaque octet buffer following the\n     * format described by ISO 15076-1 with an optional name defined in the\n     * metadata key entry \"name\".\n     */\n    AV_FRAME_DATA_ICC_PROFILE,\n\n    /**\n     * Timecode which conforms to SMPTE ST 12-1. The data is an array of 4 uint32_t\n     * where the first uint32_t describes how many (1-3) of the other timecodes are used.\n     * The timecode format is described in the documentation of av_timecode_get_smpte_from_framenum()\n     * function in libavutil/timecode.h.\n     */\n    AV_FRAME_DATA_S12M_TIMECODE,\n\n    /**\n     * HDR dynamic metadata associated with a video frame. The payload is\n     * an AVDynamicHDRPlus type and contains information for color\n     * volume transform - application 4 of SMPTE 2094-40:2016 standard.\n     */\n    AV_FRAME_DATA_DYNAMIC_HDR_PLUS,\n\n    /**\n     * Regions Of Interest, the data is an array of AVRegionOfInterest type, the number of\n     * array element is implied by AVFrameSideData.size / AVRegionOfInterest.self_size.\n     */\n    AV_FRAME_DATA_REGIONS_OF_INTEREST,\n\n    /**\n     * Encoding parameters for a video frame, as described by AVVideoEncParams.\n     */\n    AV_FRAME_DATA_VIDEO_ENC_PARAMS,\n\n    /**\n     * User data unregistered metadata associated with a video frame.\n     * This is the H.26[45] UDU SEI message, and shouldn't be used for any other purpose\n     * The data is stored as uint8_t in AVFrameSideData.data which is 16 bytes of\n     * uuid_iso_iec_11578 followed by AVFrameSideData.size - 16 bytes of user_data_payload_byte.\n     */\n    AV_FRAME_DATA_SEI_UNREGISTERED,\n\n    /**\n     * Film grain parameters for a frame, described by AVFilmGrainParams.\n     * Must be present for every frame which should have film grain applied.\n     *\n     * May be present multiple times, for example when there are multiple\n     * alternative parameter sets for different video signal characteristics.\n     * The user should select the most appropriate set for the application.\n     */\n    AV_FRAME_DATA_FILM_GRAIN_PARAMS,\n\n    /**\n     * Bounding boxes for object detection and classification,\n     * as described by AVDetectionBBoxHeader.\n     */\n    AV_FRAME_DATA_DETECTION_BBOXES,\n\n    /**\n     * Dolby Vision RPU raw data, suitable for passing to x265\n     * or other libraries. Array of uint8_t, with NAL emulation\n     * bytes intact.\n     */\n    AV_FRAME_DATA_DOVI_RPU_BUFFER,\n\n    /**\n     * Parsed Dolby Vision metadata, suitable for passing to a software\n     * implementation. The payload is the AVDOVIMetadata struct defined in\n     * libavutil/dovi_meta.h.\n     */\n    AV_FRAME_DATA_DOVI_METADATA,\n\n    /**\n     * HDR Vivid dynamic metadata associated with a video frame. The payload is\n     * an AVDynamicHDRVivid type and contains information for color\n     * volume transform - CUVA 005.1-2021.\n     */\n    AV_FRAME_DATA_DYNAMIC_HDR_VIVID,\n\n    /**\n     * Ambient viewing environment metadata, as defined by H.274.\n     */\n    AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT,\n\n    /**\n     * Provide encoder-specific hinting information about changed/unchanged\n     * portions of a frame.  It can be used to pass information about which\n     * macroblocks can be skipped because they didn't change from the\n     * corresponding ones in the previous frame. This could be useful for\n     * applications which know this information in advance to speed up\n     * encoding.\n     */\n    AV_FRAME_DATA_VIDEO_HINT,\n\n    /**\n     * Raw LCEVC payload data, as a uint8_t array, with NAL emulation\n     * bytes intact.\n     */\n    AV_FRAME_DATA_LCEVC,\n\n    /**\n     * This side data must be associated with a video frame.\n     * The presence of this side data indicates that the video stream is\n     * composed of multiple views (e.g. stereoscopic 3D content,\n     * cf. H.264 Annex H or H.265 Annex G).\n     * The data is an int storing the view ID.\n     */\n    AV_FRAME_DATA_VIEW_ID,\n\n    /**\n     * This side data contains information about the reference display width(s)\n     * and reference viewing distance(s) as well as information about the\n     * corresponding reference stereo pair(s), i.e., the pair(s) of views to be\n     * displayed for the viewer's left and right eyes on the reference display\n     * at the reference viewing distance.\n     * The payload is the AV3DReferenceDisplaysInfo struct defined in\n     * libavutil/tdrdi.h.\n     */\n    AV_FRAME_DATA_3D_REFERENCE_DISPLAYS,\n};\n\nenum AVActiveFormatDescription {\n    AV_AFD_SAME         = 8,\n    AV_AFD_4_3          = 9,\n    AV_AFD_16_9         = 10,\n    AV_AFD_14_9         = 11,\n    AV_AFD_4_3_SP_14_9  = 13,\n    AV_AFD_16_9_SP_14_9 = 14,\n    AV_AFD_SP_4_3       = 15,\n};\n\n\n/**\n * Structure to hold side data for an AVFrame.\n *\n * sizeof(AVFrameSideData) is not a part of the public ABI, so new fields may be added\n * to the end with a minor bump.\n */\ntypedef struct AVFrameSideData {\n    enum AVFrameSideDataType type;\n    uint8_t *data;\n    size_t   size;\n    AVDictionary *metadata;\n    AVBufferRef *buf;\n} AVFrameSideData;\n\nenum AVSideDataProps {\n    /**\n     * The side data type can be used in stream-global structures.\n     * Side data types without this property are only meaningful on per-frame\n     * basis.\n     */\n    AV_SIDE_DATA_PROP_GLOBAL = (1 << 0),\n\n    /**\n     * Multiple instances of this side data type can be meaningfully present in\n     * a single side data array.\n     */\n    AV_SIDE_DATA_PROP_MULTI  = (1 << 1),\n\n    /**\n     * Side data depends on the video dimensions. Side data with this property\n     * loses its meaning when rescaling or cropping the image, unless\n     * either recomputed or adjusted to the new resolution.\n     */\n    AV_SIDE_DATA_PROP_SIZE_DEPENDENT = (1 << 2),\n\n    /**\n     * Side data depends on the video color space. Side data with this property\n     * loses its meaning when changing the video color encoding, e.g. by\n     * adapting to a different set of primaries or transfer characteristics.\n     */\n    AV_SIDE_DATA_PROP_COLOR_DEPENDENT = (1 << 3),\n\n    /**\n     * Side data depends on the channel layout. Side data with this property\n     * loses its meaning when downmixing or upmixing, unless either recomputed\n     * or adjusted to the new layout.\n     */\n    AV_SIDE_DATA_PROP_CHANNEL_DEPENDENT = (1 << 4),\n};\n\n/**\n * This struct describes the properties of a side data type. Its instance\n * corresponding to a given type can be obtained from av_frame_side_data_desc().\n */\ntypedef struct AVSideDataDescriptor {\n    /**\n     * Human-readable side data description.\n     */\n    const char      *name;\n\n    /**\n     * Side data property flags, a combination of AVSideDataProps values.\n     */\n    unsigned         props;\n} AVSideDataDescriptor;\n\n/**\n * Structure describing a single Region Of Interest.\n *\n * When multiple regions are defined in a single side-data block, they\n * should be ordered from most to least important - some encoders are only\n * capable of supporting a limited number of distinct regions, so will have\n * to truncate the list.\n *\n * When overlapping regions are defined, the first region containing a given\n * area of the frame applies.\n */\ntypedef struct AVRegionOfInterest {\n    /**\n     * Must be set to the size of this data structure (that is,\n     * sizeof(AVRegionOfInterest)).\n     */\n    uint32_t self_size;\n    /**\n     * Distance in pixels from the top edge of the frame to the top and\n     * bottom edges and from the left edge of the frame to the left and\n     * right edges of the rectangle defining this region of interest.\n     *\n     * The constraints on a region are encoder dependent, so the region\n     * actually affected may be slightly larger for alignment or other\n     * reasons.\n     */\n    int top;\n    int bottom;\n    int left;\n    int right;\n    /**\n     * Quantisation offset.\n     *\n     * Must be in the range -1 to +1.  A value of zero indicates no quality\n     * change.  A negative value asks for better quality (less quantisation),\n     * while a positive value asks for worse quality (greater quantisation).\n     *\n     * The range is calibrated so that the extreme values indicate the\n     * largest possible offset - if the rest of the frame is encoded with the\n     * worst possible quality, an offset of -1 indicates that this region\n     * should be encoded with the best possible quality anyway.  Intermediate\n     * values are then interpolated in some codec-dependent way.\n     *\n     * For example, in 10-bit H.264 the quantisation parameter varies between\n     * -12 and 51.  A typical qoffset value of -1/10 therefore indicates that\n     * this region should be encoded with a QP around one-tenth of the full\n     * range better than the rest of the frame.  So, if most of the frame\n     * were to be encoded with a QP of around 30, this region would get a QP\n     * of around 24 (an offset of approximately -1/10 * (51 - -12) = -6.3).\n     * An extreme value of -1 would indicate that this region should be\n     * encoded with the best possible quality regardless of the treatment of\n     * the rest of the frame - that is, should be encoded at a QP of -12.\n     */\n    AVRational qoffset;\n} AVRegionOfInterest;\n\n/**\n * This structure describes decoded (raw) audio or video data.\n *\n * AVFrame must be allocated using av_frame_alloc(). Note that this only\n * allocates the AVFrame itself, the buffers for the data must be managed\n * through other means (see below).\n * AVFrame must be freed with av_frame_free().\n *\n * AVFrame is typically allocated once and then reused multiple times to hold\n * different data (e.g. a single AVFrame to hold frames received from a\n * decoder). In such a case, av_frame_unref() will free any references held by\n * the frame and reset it to its original clean state before it\n * is reused again.\n *\n * The data described by an AVFrame is usually reference counted through the\n * AVBuffer API. The underlying buffer references are stored in AVFrame.buf /\n * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at\n * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case,\n * every single data plane must be contained in one of the buffers in\n * AVFrame.buf or AVFrame.extended_buf.\n * There may be a single buffer for all the data, or one separate buffer for\n * each plane, or anything in between.\n *\n * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added\n * to the end with a minor bump.\n *\n * Fields can be accessed through AVOptions, the name string used, matches the\n * C structure field name for fields accessible through AVOptions.\n */\ntypedef struct AVFrame {\n#define AV_NUM_DATA_POINTERS 8\n    /**\n     * pointer to the picture/channel planes.\n     * This might be different from the first allocated byte. For video,\n     * it could even point to the end of the image data.\n     *\n     * All pointers in data and extended_data must point into one of the\n     * AVBufferRef in buf or extended_buf.\n     *\n     * Some decoders access areas outside 0,0 - width,height, please\n     * see avcodec_align_dimensions2(). Some filters and swscale can read\n     * up to 16 bytes beyond the planes, if these filters are to be used,\n     * then 16 extra bytes must be allocated.\n     *\n     * NOTE: Pointers not needed by the format MUST be set to NULL.\n     *\n     * @attention In case of video, the data[] pointers can point to the\n     * end of image data in order to reverse line order, when used in\n     * combination with negative values in the linesize[] array.\n     */\n    uint8_t *data[AV_NUM_DATA_POINTERS];\n\n    /**\n     * For video, a positive or negative value, which is typically indicating\n     * the size in bytes of each picture line, but it can also be:\n     * - the negative byte size of lines for vertical flipping\n     *   (with data[n] pointing to the end of the data\n     * - a positive or negative multiple of the byte size as for accessing\n     *   even and odd fields of a frame (possibly flipped)\n     *\n     * For audio, only linesize[0] may be set. For planar audio, each channel\n     * plane must be the same size.\n     *\n     * For video the linesizes should be multiples of the CPUs alignment\n     * preference, this is 16 or 32 for modern desktop CPUs.\n     * Some code requires such alignment other code can be slower without\n     * correct alignment, for yet other it makes no difference.\n     *\n     * @note The linesize may be larger than the size of usable data -- there\n     * may be extra padding present for performance reasons.\n     *\n     * @attention In case of video, line size values can be negative to achieve\n     * a vertically inverted iteration over image lines.\n     */\n    int linesize[AV_NUM_DATA_POINTERS];\n\n    /**\n     * pointers to the data planes/channels.\n     *\n     * For video, this should simply point to data[].\n     *\n     * For planar audio, each channel has a separate data pointer, and\n     * linesize[0] contains the size of each channel buffer.\n     * For packed audio, there is just one data pointer, and linesize[0]\n     * contains the total size of the buffer for all channels.\n     *\n     * Note: Both data and extended_data should always be set in a valid frame,\n     * but for planar audio with more channels that can fit in data,\n     * extended_data must be used in order to access all channels.\n     */\n    uint8_t **extended_data;\n\n    /**\n     * @name Video dimensions\n     * Video frames only. The coded dimensions (in pixels) of the video frame,\n     * i.e. the size of the rectangle that contains some well-defined values.\n     *\n     * @note The part of the frame intended for display/presentation is further\n     * restricted by the @ref cropping \"Cropping rectangle\".\n     * @{\n     */\n    int width, height;\n    /**\n     * @}\n     */\n\n    /**\n     * number of audio samples (per channel) described by this frame\n     */\n    int nb_samples;\n\n    /**\n     * format of the frame, -1 if unknown or unset\n     * Values correspond to enum AVPixelFormat for video frames,\n     * enum AVSampleFormat for audio)\n     */\n    int format;\n\n    /**\n     * Picture type of the frame.\n     */\n    enum AVPictureType pict_type;\n\n    /**\n     * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.\n     */\n    AVRational sample_aspect_ratio;\n\n    /**\n     * Presentation timestamp in time_base units (time when frame should be shown to user).\n     */\n    int64_t pts;\n\n    /**\n     * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isn't used)\n     * This is also the Presentation time of this AVFrame calculated from\n     * only AVPacket.dts values without pts values.\n     */\n    int64_t pkt_dts;\n\n    /**\n     * Time base for the timestamps in this frame.\n     * In the future, this field may be set on frames output by decoders or\n     * filters, but its value will be by default ignored on input to encoders\n     * or filters.\n     */\n    AVRational time_base;\n\n    /**\n     * quality (between 1 (good) and FF_LAMBDA_MAX (bad))\n     */\n    int quality;\n\n    /**\n     * Frame owner's private data.\n     *\n     * This field may be set by the code that allocates/owns the frame data.\n     * It is then not touched by any library functions, except:\n     * - it is copied to other references by av_frame_copy_props() (and hence by\n     *   av_frame_ref());\n     * - it is set to NULL when the frame is cleared by av_frame_unref()\n     * - on the caller's explicit request. E.g. libavcodec encoders/decoders\n     *   will copy this field to/from @ref AVPacket \"AVPackets\" if the caller sets\n     *   @ref AV_CODEC_FLAG_COPY_OPAQUE.\n     *\n     * @see opaque_ref the reference-counted analogue\n     */\n    void *opaque;\n\n    /**\n     * Number of fields in this frame which should be repeated, i.e. the total\n     * duration of this frame should be repeat_pict + 2 normal field durations.\n     *\n     * For interlaced frames this field may be set to 1, which signals that this\n     * frame should be presented as 3 fields: beginning with the first field (as\n     * determined by AV_FRAME_FLAG_TOP_FIELD_FIRST being set or not), followed\n     * by the second field, and then the first field again.\n     *\n     * For progressive frames this field may be set to a multiple of 2, which\n     * signals that this frame's duration should be (repeat_pict + 2) / 2\n     * normal frame durations.\n     *\n     * @note This field is computed from MPEG2 repeat_first_field flag and its\n     * associated flags, H.264 pic_struct from picture timing SEI, and\n     * their analogues in other codecs. Typically it should only be used when\n     * higher-layer timing information is not available.\n     */\n    int repeat_pict;\n\n    /**\n     * Sample rate of the audio data.\n     */\n    int sample_rate;\n\n    /**\n     * AVBuffer references backing the data for this frame. All the pointers in\n     * data and extended_data must point inside one of the buffers in buf or\n     * extended_buf. This array must be filled contiguously -- if buf[i] is\n     * non-NULL then buf[j] must also be non-NULL for all j < i.\n     *\n     * There may be at most one AVBuffer per data plane, so for video this array\n     * always contains all the references. For planar audio with more than\n     * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in\n     * this array. Then the extra AVBufferRef pointers are stored in the\n     * extended_buf array.\n     */\n    AVBufferRef *buf[AV_NUM_DATA_POINTERS];\n\n    /**\n     * For planar audio which requires more than AV_NUM_DATA_POINTERS\n     * AVBufferRef pointers, this array will hold all the references which\n     * cannot fit into AVFrame.buf.\n     *\n     * Note that this is different from AVFrame.extended_data, which always\n     * contains all the pointers. This array only contains the extra pointers,\n     * which cannot fit into AVFrame.buf.\n     *\n     * This array is always allocated using av_malloc() by whoever constructs\n     * the frame. It is freed in av_frame_unref().\n     */\n    AVBufferRef **extended_buf;\n    /**\n     * Number of elements in extended_buf.\n     */\n    int        nb_extended_buf;\n\n    AVFrameSideData **side_data;\n    int            nb_side_data;\n\n/**\n * @defgroup lavu_frame_flags AV_FRAME_FLAGS\n * @ingroup lavu_frame\n * Flags describing additional frame properties.\n *\n * @{\n */\n\n/**\n * The frame data may be corrupted, e.g. due to decoding errors.\n */\n#define AV_FRAME_FLAG_CORRUPT       (1 << 0)\n/**\n * A flag to mark frames that are keyframes.\n */\n#define AV_FRAME_FLAG_KEY (1 << 1)\n/**\n * A flag to mark the frames which need to be decoded, but shouldn't be output.\n */\n#define AV_FRAME_FLAG_DISCARD   (1 << 2)\n/**\n * A flag to mark frames whose content is interlaced.\n */\n#define AV_FRAME_FLAG_INTERLACED (1 << 3)\n/**\n * A flag to mark frames where the top field is displayed first if the content\n * is interlaced.\n */\n#define AV_FRAME_FLAG_TOP_FIELD_FIRST (1 << 4)\n/**\n * A decoder can use this flag to mark frames which were originally encoded losslessly.\n *\n * For coding bitstream formats which support both lossless and lossy\n * encoding, it is sometimes possible for a decoder to determine which method\n * was used when the bitsream was encoded.\n */\n#define AV_FRAME_FLAG_LOSSLESS        (1 << 5)\n/**\n * @}\n */\n\n    /**\n     * Frame flags, a combination of @ref lavu_frame_flags\n     */\n    int flags;\n\n    /**\n     * MPEG vs JPEG YUV range.\n     * - encoding: Set by user\n     * - decoding: Set by libavcodec\n     */\n    enum AVColorRange color_range;\n\n    enum AVColorPrimaries color_primaries;\n\n    enum AVColorTransferCharacteristic color_trc;\n\n    /**\n     * YUV colorspace type.\n     * - encoding: Set by user\n     * - decoding: Set by libavcodec\n     */\n    enum AVColorSpace colorspace;\n\n    enum AVChromaLocation chroma_location;\n\n    /**\n     * frame timestamp estimated using various heuristics, in stream time base\n     * - encoding: unused\n     * - decoding: set by libavcodec, read by user.\n     */\n    int64_t best_effort_timestamp;\n\n    /**\n     * metadata.\n     * - encoding: Set by user.\n     * - decoding: Set by libavcodec.\n     */\n    AVDictionary *metadata;\n\n    /**\n     * decode error flags of the frame, set to a combination of\n     * FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there\n     * were errors during the decoding.\n     * - encoding: unused\n     * - decoding: set by libavcodec, read by user.\n     */\n    int decode_error_flags;\n#define FF_DECODE_ERROR_INVALID_BITSTREAM   1\n#define FF_DECODE_ERROR_MISSING_REFERENCE   2\n#define FF_DECODE_ERROR_CONCEALMENT_ACTIVE  4\n#define FF_DECODE_ERROR_DECODE_SLICES       8\n\n    /**\n     * For hwaccel-format frames, this should be a reference to the\n     * AVHWFramesContext describing the frame.\n     */\n    AVBufferRef *hw_frames_ctx;\n\n    /**\n     * Frame owner's private data.\n     *\n     * This field may be set by the code that allocates/owns the frame data.\n     * It is then not touched by any library functions, except:\n     * - a new reference to the underlying buffer is propagated by\n     *   av_frame_copy_props() (and hence by av_frame_ref());\n     * - it is unreferenced in av_frame_unref();\n     * - on the caller's explicit request. E.g. libavcodec encoders/decoders\n     *   will propagate a new reference to/from @ref AVPacket \"AVPackets\" if the\n     *   caller sets @ref AV_CODEC_FLAG_COPY_OPAQUE.\n     *\n     * @see opaque the plain pointer analogue\n     */\n    AVBufferRef *opaque_ref;\n\n    /**\n     * @anchor cropping\n     * @name Cropping\n     * Video frames only. The number of pixels to discard from the the\n     * top/bottom/left/right border of the frame to obtain the sub-rectangle of\n     * the frame intended for presentation.\n     * @{\n     */\n    size_t crop_top;\n    size_t crop_bottom;\n    size_t crop_left;\n    size_t crop_right;\n    /**\n     * @}\n     */\n\n    /**\n     * RefStruct reference for internal use by a single libav* library.\n     * Must not be used to transfer data between libraries.\n     * Has to be NULL when ownership of the frame leaves the respective library.\n     *\n     * Code outside the FFmpeg libs must never check or change private_ref.\n     */\n    void *private_ref;\n\n    /**\n     * Channel layout of the audio data.\n     */\n    AVChannelLayout ch_layout;\n\n    /**\n     * Duration of the frame, in the same units as pts. 0 if unknown.\n     */\n    int64_t duration;\n} AVFrame;\n\n\n/**\n * Allocate an AVFrame and set its fields to default values.  The resulting\n * struct must be freed using av_frame_free().\n *\n * @return An AVFrame filled with default values or NULL on failure.\n *\n * @note this only allocates the AVFrame itself, not the data buffers. Those\n * must be allocated through other means, e.g. with av_frame_get_buffer() or\n * manually.\n */\nAVFrame *av_frame_alloc(void);\n\n/**\n * Free the frame and any dynamically allocated objects in it,\n * e.g. extended_data. If the frame is reference counted, it will be\n * unreferenced first.\n *\n * @param frame frame to be freed. The pointer will be set to NULL.\n */\nvoid av_frame_free(AVFrame **frame);\n\n/**\n * Set up a new reference to the data described by the source frame.\n *\n * Copy frame properties from src to dst and create a new reference for each\n * AVBufferRef from src.\n *\n * If src is not reference counted, new buffers are allocated and the data is\n * copied.\n *\n * @warning: dst MUST have been either unreferenced with av_frame_unref(dst),\n *           or newly allocated with av_frame_alloc() before calling this\n *           function, or undefined behavior will occur.\n *\n * @return 0 on success, a negative AVERROR on error\n */\nint av_frame_ref(AVFrame *dst, const AVFrame *src);\n\n/**\n * Ensure the destination frame refers to the same data described by the source\n * frame, either by creating a new reference for each AVBufferRef from src if\n * they differ from those in dst, by allocating new buffers and copying data if\n * src is not reference counted, or by unrefencing it if src is empty.\n *\n * Frame properties on dst will be replaced by those from src.\n *\n * @return 0 on success, a negative AVERROR on error. On error, dst is\n *         unreferenced.\n */\nint av_frame_replace(AVFrame *dst, const AVFrame *src);\n\n/**\n * Create a new frame that references the same data as src.\n *\n * This is a shortcut for av_frame_alloc()+av_frame_ref().\n *\n * @return newly created AVFrame on success, NULL on error.\n */\nAVFrame *av_frame_clone(const AVFrame *src);\n\n/**\n * Unreference all the buffers referenced by frame and reset the frame fields.\n */\nvoid av_frame_unref(AVFrame *frame);\n\n/**\n * Move everything contained in src to dst and reset src.\n *\n * @warning: dst is not unreferenced, but directly overwritten without reading\n *           or deallocating its contents. Call av_frame_unref(dst) manually\n *           before calling this function to ensure that no memory is leaked.\n */\nvoid av_frame_move_ref(AVFrame *dst, AVFrame *src);\n\n/**\n * Allocate new buffer(s) for audio or video data.\n *\n * The following fields must be set on frame before calling this function:\n * - format (pixel format for video, sample format for audio)\n * - width and height for video\n * - nb_samples and ch_layout for audio\n *\n * This function will fill AVFrame.data and AVFrame.buf arrays and, if\n * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf.\n * For planar formats, one buffer will be allocated for each plane.\n *\n * @warning: if frame already has been allocated, calling this function will\n *           leak memory. In addition, undefined behavior can occur in certain\n *           cases.\n *\n * @param frame frame in which to store the new buffers.\n * @param align Required buffer size and data pointer alignment. If equal to 0,\n *              alignment will be chosen automatically for the current CPU.\n *              It is highly recommended to pass 0 here unless you know what\n *              you are doing.\n *\n * @return 0 on success, a negative AVERROR on error.\n */\nint av_frame_get_buffer(AVFrame *frame, int align);\n\n/**\n * Check if the frame data is writable.\n *\n * @return A positive value if the frame data is writable (which is true if and\n * only if each of the underlying buffers has only one reference, namely the one\n * stored in this frame). Return 0 otherwise.\n *\n * If 1 is returned the answer is valid until av_buffer_ref() is called on any\n * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly).\n *\n * @see av_frame_make_writable(), av_buffer_is_writable()\n */\nint av_frame_is_writable(AVFrame *frame);\n\n/**\n * Ensure that the frame data is writable, avoiding data copy if possible.\n *\n * Do nothing if the frame is writable, allocate new buffers and copy the data\n * if it is not. Non-refcounted frames behave as non-writable, i.e. a copy\n * is always made.\n *\n * @return 0 on success, a negative AVERROR on error.\n *\n * @see av_frame_is_writable(), av_buffer_is_writable(),\n * av_buffer_make_writable()\n */\nint av_frame_make_writable(AVFrame *frame);\n\n/**\n * Copy the frame data from src to dst.\n *\n * This function does not allocate anything, dst must be already initialized and\n * allocated with the same parameters as src.\n *\n * This function only copies the frame data (i.e. the contents of the data /\n * extended data arrays), not any other properties.\n *\n * @return >= 0 on success, a negative AVERROR on error.\n */\nint av_frame_copy(AVFrame *dst, const AVFrame *src);\n\n/**\n * Copy only \"metadata\" fields from src to dst.\n *\n * Metadata for the purpose of this function are those fields that do not affect\n * the data layout in the buffers.  E.g. pts, sample rate (for audio) or sample\n * aspect ratio (for video), but not width/height or channel layout.\n * Side data is also copied.\n */\nint av_frame_copy_props(AVFrame *dst, const AVFrame *src);\n\n/**\n * Get the buffer reference a given data plane is stored in.\n *\n * @param frame the frame to get the plane's buffer from\n * @param plane index of the data plane of interest in frame->extended_data.\n *\n * @return the buffer reference that contains the plane or NULL if the input\n * frame is not valid.\n */\nAVBufferRef *av_frame_get_plane_buffer(const AVFrame *frame, int plane);\n\n/**\n * Add a new side data to a frame.\n *\n * @param frame a frame to which the side data should be added\n * @param type type of the added side data\n * @param size size of the side data\n *\n * @return newly added side data on success, NULL on error\n */\nAVFrameSideData *av_frame_new_side_data(AVFrame *frame,\n                                        enum AVFrameSideDataType type,\n                                        size_t size);\n\n/**\n * Add a new side data to a frame from an existing AVBufferRef\n *\n * @param frame a frame to which the side data should be added\n * @param type  the type of the added side data\n * @param buf   an AVBufferRef to add as side data. The ownership of\n *              the reference is transferred to the frame.\n *\n * @return newly added side data on success, NULL on error. On failure\n *         the frame is unchanged and the AVBufferRef remains owned by\n *         the caller.\n */\nAVFrameSideData *av_frame_new_side_data_from_buf(AVFrame *frame,\n                                                 enum AVFrameSideDataType type,\n                                                 AVBufferRef *buf);\n\n/**\n * @return a pointer to the side data of a given type on success, NULL if there\n * is no side data with such type in this frame.\n */\nAVFrameSideData *av_frame_get_side_data(const AVFrame *frame,\n                                        enum AVFrameSideDataType type);\n\n/**\n * Remove and free all side data instances of the given type.\n */\nvoid av_frame_remove_side_data(AVFrame *frame, enum AVFrameSideDataType type);\n\n\n/**\n * Flags for frame cropping.\n */\nenum {\n    /**\n     * Apply the maximum possible cropping, even if it requires setting the\n     * AVFrame.data[] entries to unaligned pointers. Passing unaligned data\n     * to FFmpeg API is generally not allowed, and causes undefined behavior\n     * (such as crashes). You can pass unaligned data only to FFmpeg APIs that\n     * are explicitly documented to accept it. Use this flag only if you\n     * absolutely know what you are doing.\n     */\n    AV_FRAME_CROP_UNALIGNED     = 1 << 0,\n};\n\n/**\n * Crop the given video AVFrame according to its crop_left/crop_top/crop_right/\n * crop_bottom fields. If cropping is successful, the function will adjust the\n * data pointers and the width/height fields, and set the crop fields to 0.\n *\n * In all cases, the cropping boundaries will be rounded to the inherent\n * alignment of the pixel format. In some cases, such as for opaque hwaccel\n * formats, the left/top cropping is ignored. The crop fields are set to 0 even\n * if the cropping was rounded or ignored.\n *\n * @param frame the frame which should be cropped\n * @param flags Some combination of AV_FRAME_CROP_* flags, or 0.\n *\n * @return >= 0 on success, a negative AVERROR on error. If the cropping fields\n * were invalid, AVERROR(ERANGE) is returned, and nothing is changed.\n */\nint av_frame_apply_cropping(AVFrame *frame, int flags);\n\n/**\n * @return a string identifying the side data type\n */\nconst char *av_frame_side_data_name(enum AVFrameSideDataType type);\n\n/**\n * @return side data descriptor corresponding to a given side data type, NULL\n *         when not available.\n */\nconst AVSideDataDescriptor *av_frame_side_data_desc(enum AVFrameSideDataType type);\n\n/**\n * Free all side data entries and their contents, then zeroes out the\n * values which the pointers are pointing to.\n *\n * @param sd    pointer to array of side data to free. Will be set to NULL\n *              upon return.\n * @param nb_sd pointer to an integer containing the number of entries in\n *              the array. Will be set to 0 upon return.\n */\nvoid av_frame_side_data_free(AVFrameSideData ***sd, int *nb_sd);\n\n/**\n * Remove existing entries before adding new ones.\n */\n#define AV_FRAME_SIDE_DATA_FLAG_UNIQUE (1 << 0)\n/**\n * Don't add a new entry if another of the same type exists.\n * Applies only for side data types without the AV_SIDE_DATA_PROP_MULTI prop.\n */\n#define AV_FRAME_SIDE_DATA_FLAG_REPLACE (1 << 1)\n/**\n * Create a new reference to the passed in buffer instead of taking ownership\n * of it.\n */\n#define AV_FRAME_SIDE_DATA_FLAG_NEW_REF (1 << 2)\n\n/**\n * Add new side data entry to an array.\n *\n * @param sd    pointer to array of side data to which to add another entry,\n *              or to NULL in order to start a new array.\n * @param nb_sd pointer to an integer containing the number of entries in\n *              the array.\n * @param type  type of the added side data\n * @param size  size of the side data\n * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0.\n *\n * @return newly added side data on success, NULL on error.\n * @note In case of AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of\n *       matching AVFrameSideDataType will be removed before the addition\n *       is attempted.\n * @note In case of AV_FRAME_SIDE_DATA_FLAG_REPLACE being set, if an\n *       entry of the same type already exists, it will be replaced instead.\n */\nAVFrameSideData *av_frame_side_data_new(AVFrameSideData ***sd, int *nb_sd,\n                                        enum AVFrameSideDataType type,\n                                        size_t size, unsigned int flags);\n\n/**\n * Add a new side data entry to an array from an existing AVBufferRef.\n *\n * @param sd    pointer to array of side data to which to add another entry,\n *              or to NULL in order to start a new array.\n * @param nb_sd pointer to an integer containing the number of entries in\n *              the array.\n * @param type  type of the added side data\n * @param buf   Pointer to AVBufferRef to add to the array. On success,\n *              the function takes ownership of the AVBufferRef and *buf is\n *              set to NULL, unless AV_FRAME_SIDE_DATA_FLAG_NEW_REF is set\n *              in which case the ownership will remain with the caller.\n * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0.\n *\n * @return newly added side data on success, NULL on error.\n * @note In case of AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of\n *       matching AVFrameSideDataType will be removed before the addition\n *       is attempted.\n * @note In case of AV_FRAME_SIDE_DATA_FLAG_REPLACE being set, if an\n *       entry of the same type already exists, it will be replaced instead.\n *\n */\nAVFrameSideData *av_frame_side_data_add(AVFrameSideData ***sd, int *nb_sd,\n                                        enum AVFrameSideDataType type,\n                                        AVBufferRef **buf, unsigned int flags);\n\n/**\n * Add a new side data entry to an array based on existing side data, taking\n * a reference towards the contained AVBufferRef.\n *\n * @param sd    pointer to array of side data to which to add another entry,\n *              or to NULL in order to start a new array.\n * @param nb_sd pointer to an integer containing the number of entries in\n *              the array.\n * @param src   side data to be cloned, with a new reference utilized\n *              for the buffer.\n * @param flags Some combination of AV_FRAME_SIDE_DATA_FLAG_* flags, or 0.\n *\n * @return negative error code on failure, >=0 on success.\n * @note In case of AV_FRAME_SIDE_DATA_FLAG_UNIQUE being set, entries of\n *       matching AVFrameSideDataType will be removed before the addition\n *       is attempted.\n * @note In case of AV_FRAME_SIDE_DATA_FLAG_REPLACE being set, if an\n *       entry of the same type already exists, it will be replaced instead.\n */\nint av_frame_side_data_clone(AVFrameSideData ***sd, int *nb_sd,\n                             const AVFrameSideData *src, unsigned int flags);\n\n/**\n * Get a side data entry of a specific type from an array.\n *\n * @param sd    array of side data.\n * @param nb_sd integer containing the number of entries in the array.\n * @param type  type of side data to be queried\n *\n * @return a pointer to the side data of a given type on success, NULL if there\n *         is no side data with such type in this set.\n */\nconst AVFrameSideData *av_frame_side_data_get_c(const AVFrameSideData * const *sd,\n                                                const int nb_sd,\n                                                enum AVFrameSideDataType type);\n\n/**\n * Wrapper around av_frame_side_data_get_c() to workaround the limitation\n * that for any type T the conversion from T * const * to const T * const *\n * is not performed automatically in C.\n * @see av_frame_side_data_get_c()\n */\nstatic inline\nconst AVFrameSideData *av_frame_side_data_get(AVFrameSideData * const *sd,\n                                              const int nb_sd,\n                                              enum AVFrameSideDataType type)\n{\n    return av_frame_side_data_get_c((const AVFrameSideData * const *)sd,\n                                    nb_sd, type);\n}\n\n/**\n * Remove and free all side data instances of the given type from an array.\n */\nvoid av_frame_side_data_remove(AVFrameSideData ***sd, int *nb_sd,\n                               enum AVFrameSideDataType type);\n\n/**\n * Remove and free all side data instances that match any of the given\n * side data properties. (See enum AVSideDataProps)\n */\nvoid av_frame_side_data_remove_by_props(AVFrameSideData ***sd, int *nb_sd,\n                                        int props);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_FRAME_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hash.h",
    "content": "/*\n * Copyright (C) 2013 Reimar Döffinger <Reimar.Doeffinger@gmx.de>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_hash_generic\n * Generic hashing API\n */\n\n#ifndef AVUTIL_HASH_H\n#define AVUTIL_HASH_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n/**\n * @defgroup lavu_hash Hash Functions\n * @ingroup lavu_crypto\n * Hash functions useful in multimedia.\n *\n * Hash functions are widely used in multimedia, from error checking and\n * concealment to internal regression testing. libavutil has efficient\n * implementations of a variety of hash functions that may be useful for\n * FFmpeg and other multimedia applications.\n *\n * @{\n *\n * @defgroup lavu_hash_generic Generic Hashing API\n * An abstraction layer for all hash functions supported by libavutil.\n *\n * If your application needs to support a wide range of different hash\n * functions, then the Generic Hashing API is for you. It provides a generic,\n * reusable API for @ref lavu_hash \"all hash functions\" implemented in libavutil.\n * If you just need to use one particular hash function, use the @ref lavu_hash\n * \"individual hash\" directly.\n *\n * @section Sample Code\n *\n * A basic template for using the Generic Hashing API follows:\n *\n * @code\n * struct AVHashContext *ctx = NULL;\n * const char *hash_name = NULL;\n * uint8_t *output_buf = NULL;\n *\n * // Select from a string returned by av_hash_names()\n * hash_name = ...;\n *\n * // Allocate a hash context\n * ret = av_hash_alloc(&ctx, hash_name);\n * if (ret < 0)\n *     return ret;\n *\n * // Initialize the hash context\n * av_hash_init(ctx);\n *\n * // Update the hash context with data\n * while (data_left) {\n *     av_hash_update(ctx, data, size);\n * }\n *\n * // Now we have no more data, so it is time to finalize the hash and get the\n * // output. But we need to first allocate an output buffer. Note that you can\n * // use any memory allocation function, including malloc(), not just\n * // av_malloc().\n * output_buf = av_malloc(av_hash_get_size(ctx));\n * if (!output_buf)\n *     return AVERROR(ENOMEM);\n *\n * // Finalize the hash context.\n * // You can use any of the av_hash_final*() functions provided, for other\n * // output formats. If you do so, be sure to adjust the memory allocation\n * // above. See the function documentation below for the exact amount of extra\n * // memory needed.\n * av_hash_final(ctx, output_buffer);\n *\n * // Free the context\n * av_hash_freep(&ctx);\n * @endcode\n *\n * @section Hash Function-Specific Information\n * If the CRC32 hash is selected, the #AV_CRC_32_IEEE polynomial will be\n * used.\n *\n * If the Murmur3 hash is selected, the default seed will be used. See @ref\n * lavu_murmur3_seedinfo \"Murmur3\" for more information.\n *\n * @{\n */\n\n/**\n * @example ffhash.c\n * This example is a simple command line application that takes one or more\n * arguments. It demonstrates a typical use of the hashing API with allocation,\n * initialization, updating, and finalizing.\n */\n\nstruct AVHashContext;\n\n/**\n * Allocate a hash context for the algorithm specified by name.\n *\n * @return  >= 0 for success, a negative error code for failure\n *\n * @note The context is not initialized after a call to this function; you must\n * call av_hash_init() to do so.\n */\nint av_hash_alloc(struct AVHashContext **ctx, const char *name);\n\n/**\n * Get the names of available hash algorithms.\n *\n * This function can be used to enumerate the algorithms.\n *\n * @param[in] i  Index of the hash algorithm, starting from 0\n * @return       Pointer to a static string or `NULL` if `i` is out of range\n */\nconst char *av_hash_names(int i);\n\n/**\n * Get the name of the algorithm corresponding to the given hash context.\n */\nconst char *av_hash_get_name(const struct AVHashContext *ctx);\n\n/**\n * Maximum value that av_hash_get_size() will currently return.\n *\n * You can use this if you absolutely want or need to use static allocation for\n * the output buffer and are fine with not supporting hashes newly added to\n * libavutil without recompilation.\n *\n * @warning\n * Adding new hashes with larger sizes, and increasing the macro while doing\n * so, will not be considered an ABI change. To prevent your code from\n * overflowing a buffer, either dynamically allocate the output buffer with\n * av_hash_get_size(), or limit your use of the Hashing API to hashes that are\n * already in FFmpeg during the time of compilation.\n */\n#define AV_HASH_MAX_SIZE 64\n\n/**\n * Get the size of the resulting hash value in bytes.\n *\n * The maximum value this function will currently return is available as macro\n * #AV_HASH_MAX_SIZE.\n *\n * @param[in]     ctx Hash context\n * @return            Size of the hash value in bytes\n */\nint av_hash_get_size(const struct AVHashContext *ctx);\n\n/**\n * Initialize or reset a hash context.\n *\n * @param[in,out] ctx Hash context\n */\nvoid av_hash_init(struct AVHashContext *ctx);\n\n/**\n * Update a hash context with additional data.\n *\n * @param[in,out] ctx Hash context\n * @param[in]     src Data to be added to the hash context\n * @param[in]     len Size of the additional data\n */\nvoid av_hash_update(struct AVHashContext *ctx, const uint8_t *src, size_t len);\n\n/**\n * Finalize a hash context and compute the actual hash value.\n *\n * The minimum size of `dst` buffer is given by av_hash_get_size() or\n * #AV_HASH_MAX_SIZE. The use of the latter macro is discouraged.\n *\n * It is not safe to update or finalize a hash context again, if it has already\n * been finalized.\n *\n * @param[in,out] ctx Hash context\n * @param[out]    dst Where the final hash value will be stored\n *\n * @see av_hash_final_bin() provides an alternative API\n */\nvoid av_hash_final(struct AVHashContext *ctx, uint8_t *dst);\n\n/**\n * Finalize a hash context and store the actual hash value in a buffer.\n *\n * It is not safe to update or finalize a hash context again, if it has already\n * been finalized.\n *\n * If `size` is smaller than the hash size (given by av_hash_get_size()), the\n * hash is truncated; if size is larger, the buffer is padded with 0.\n *\n * @param[in,out] ctx  Hash context\n * @param[out]    dst  Where the final hash value will be stored\n * @param[in]     size Number of bytes to write to `dst`\n */\nvoid av_hash_final_bin(struct AVHashContext *ctx, uint8_t *dst, int size);\n\n/**\n * Finalize a hash context and store the hexadecimal representation of the\n * actual hash value as a string.\n *\n * It is not safe to update or finalize a hash context again, if it has already\n * been finalized.\n *\n * The string is always 0-terminated.\n *\n * If `size` is smaller than `2 * hash_size + 1`, where `hash_size` is the\n * value returned by av_hash_get_size(), the string will be truncated.\n *\n * @param[in,out] ctx  Hash context\n * @param[out]    dst  Where the string will be stored\n * @param[in]     size Maximum number of bytes to write to `dst`\n */\nvoid av_hash_final_hex(struct AVHashContext *ctx, uint8_t *dst, int size);\n\n/**\n * Finalize a hash context and store the Base64 representation of the\n * actual hash value as a string.\n *\n * It is not safe to update or finalize a hash context again, if it has already\n * been finalized.\n *\n * The string is always 0-terminated.\n *\n * If `size` is smaller than AV_BASE64_SIZE(hash_size), where `hash_size` is\n * the value returned by av_hash_get_size(), the string will be truncated.\n *\n * @param[in,out] ctx  Hash context\n * @param[out]    dst  Where the final hash value will be stored\n * @param[in]     size Maximum number of bytes to write to `dst`\n */\nvoid av_hash_final_b64(struct AVHashContext *ctx, uint8_t *dst, int size);\n\n/**\n * Free hash context and set hash context pointer to `NULL`.\n *\n * @param[in,out] ctx  Pointer to hash context\n */\nvoid av_hash_freep(struct AVHashContext **ctx);\n\n/**\n * @}\n * @}\n */\n\n#endif /* AVUTIL_HASH_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hdr_dynamic_metadata.h",
    "content": "/*\n * Copyright (c) 2018 Mohammad Izadi <moh.izadi at gmail.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HDR_DYNAMIC_METADATA_H\n#define AVUTIL_HDR_DYNAMIC_METADATA_H\n\n#include \"frame.h\"\n#include \"rational.h\"\n\n/**\n * Option for overlapping elliptical pixel selectors in an image.\n */\nenum AVHDRPlusOverlapProcessOption {\n    AV_HDR_PLUS_OVERLAP_PROCESS_WEIGHTED_AVERAGING = 0,\n    AV_HDR_PLUS_OVERLAP_PROCESS_LAYERING = 1,\n};\n\n/**\n * Represents the percentile at a specific percentage in\n * a distribution.\n */\ntypedef struct AVHDRPlusPercentile {\n    /**\n     * The percentage value corresponding to a specific percentile linearized\n     * RGB value in the processing window in the scene. The value shall be in\n     * the range of 0 to100, inclusive.\n     */\n    uint8_t percentage;\n\n    /**\n     * The linearized maxRGB value at a specific percentile in the processing\n     * window in the scene. The value shall be in the range of 0 to 1, inclusive\n     * and in multiples of 0.00001.\n     */\n    AVRational percentile;\n} AVHDRPlusPercentile;\n\n/**\n * Color transform parameters at a processing window in a dynamic metadata for\n * SMPTE 2094-40.\n */\ntypedef struct AVHDRPlusColorTransformParams {\n    /**\n     * The relative x coordinate of the top left pixel of the processing\n     * window. The value shall be in the range of 0 and 1, inclusive and\n     * in multiples of 1/(width of Picture - 1). The value 1 corresponds\n     * to the absolute coordinate of width of Picture - 1. The value for\n     * first processing window shall be 0.\n     */\n    AVRational window_upper_left_corner_x;\n\n    /**\n     * The relative y coordinate of the top left pixel of the processing\n     * window. The value shall be in the range of 0 and 1, inclusive and\n     * in multiples of 1/(height of Picture - 1). The value 1 corresponds\n     * to the absolute coordinate of height of Picture - 1. The value for\n     * first processing window shall be 0.\n     */\n    AVRational window_upper_left_corner_y;\n\n    /**\n     * The relative x coordinate of the bottom right pixel of the processing\n     * window. The value shall be in the range of 0 and 1, inclusive and\n     * in multiples of 1/(width of Picture - 1). The value 1 corresponds\n     * to the absolute coordinate of width of Picture - 1. The value for\n     * first processing window shall be 1.\n     */\n    AVRational window_lower_right_corner_x;\n\n    /**\n     * The relative y coordinate of the bottom right pixel of the processing\n     * window. The value shall be in the range of 0 and 1, inclusive and\n     * in multiples of 1/(height of Picture - 1). The value 1 corresponds\n     * to the absolute coordinate of height of Picture - 1. The value for\n     * first processing window shall be 1.\n     */\n    AVRational window_lower_right_corner_y;\n\n    /**\n     * The x coordinate of the center position of the concentric internal and\n     * external ellipses of the elliptical pixel selector in the processing\n     * window. The value shall be in the range of 0 to (width of Picture - 1),\n     * inclusive and in multiples of 1 pixel.\n     */\n    uint16_t center_of_ellipse_x;\n\n    /**\n     * The y coordinate of the center position of the concentric internal and\n     * external ellipses of the elliptical pixel selector in the processing\n     * window. The value shall be in the range of 0 to (height of Picture - 1),\n     * inclusive and in multiples of 1 pixel.\n     */\n    uint16_t center_of_ellipse_y;\n\n    /**\n     * The clockwise rotation angle in degree of arc with respect to the\n     * positive direction of the x-axis of the concentric internal and external\n     * ellipses of the elliptical pixel selector in the processing window. The\n     * value shall be in the range of 0 to 180, inclusive and in multiples of 1.\n     */\n    uint8_t rotation_angle;\n\n    /**\n     * The semi-major axis value of the internal ellipse of the elliptical pixel\n     * selector in amount of pixels in the processing window. The value shall be\n     * in the range of 1 to 65535, inclusive and in multiples of 1 pixel.\n     */\n    uint16_t semimajor_axis_internal_ellipse;\n\n    /**\n     * The semi-major axis value of the external ellipse of the elliptical pixel\n     * selector in amount of pixels in the processing window. The value\n     * shall not be less than semimajor_axis_internal_ellipse of the current\n     * processing window. The value shall be in the range of 1 to 65535,\n     * inclusive and in multiples of 1 pixel.\n     */\n    uint16_t semimajor_axis_external_ellipse;\n\n    /**\n     * The semi-minor axis value of the external ellipse of the elliptical pixel\n     * selector in amount of pixels in the processing window. The value shall be\n     * in the range of 1 to 65535, inclusive and in multiples of 1 pixel.\n     */\n    uint16_t semiminor_axis_external_ellipse;\n\n    /**\n     * Overlap process option indicates one of the two methods of combining\n     * rendered pixels in the processing window in an image with at least one\n     * elliptical pixel selector. For overlapping elliptical pixel selectors\n     * in an image, overlap_process_option shall have the same value.\n     */\n    enum AVHDRPlusOverlapProcessOption overlap_process_option;\n\n    /**\n     * The maximum of the color components of linearized RGB values in the\n     * processing window in the scene. The values should be in the range of 0 to\n     * 1, inclusive and in multiples of 0.00001. maxscl[ 0 ], maxscl[ 1 ], and\n     * maxscl[ 2 ] are corresponding to R, G, B color components respectively.\n     */\n    AVRational maxscl[3];\n\n    /**\n     * The average of linearized maxRGB values in the processing window in the\n     * scene. The value should be in the range of 0 to 1, inclusive and in\n     * multiples of 0.00001.\n     */\n    AVRational average_maxrgb;\n\n    /**\n     * The number of linearized maxRGB values at given percentiles in the\n     * processing window in the scene. The maximum value shall be 15.\n     */\n    uint8_t num_distribution_maxrgb_percentiles;\n\n    /**\n     * The linearized maxRGB values at given percentiles in the\n     * processing window in the scene.\n     */\n    AVHDRPlusPercentile distribution_maxrgb[15];\n\n    /**\n     * The fraction of selected pixels in the image that contains the brightest\n     * pixel in the scene. The value shall be in the range of 0 to 1, inclusive\n     * and in multiples of 0.001.\n     */\n    AVRational fraction_bright_pixels;\n\n    /**\n     * This flag indicates that the metadata for the tone mapping function in\n     * the processing window is present (for value of 1).\n     */\n    uint8_t tone_mapping_flag;\n\n    /**\n     * The x coordinate of the separation point between the linear part and the\n     * curved part of the tone mapping function. The value shall be in the range\n     * of 0 to 1, excluding 0 and in multiples of 1/4095.\n     */\n    AVRational knee_point_x;\n\n    /**\n     * The y coordinate of the separation point between the linear part and the\n     * curved part of the tone mapping function. The value shall be in the range\n     * of 0 to 1, excluding 0 and in multiples of 1/4095.\n     */\n    AVRational knee_point_y;\n\n    /**\n     * The number of the intermediate anchor parameters of the tone mapping\n     * function in the processing window. The maximum value shall be 15.\n     */\n    uint8_t num_bezier_curve_anchors;\n\n    /**\n     * The intermediate anchor parameters of the tone mapping function in the\n     * processing window in the scene. The values should be in the range of 0\n     * to 1, inclusive and in multiples of 1/1023.\n     */\n    AVRational bezier_curve_anchors[15];\n\n    /**\n     * This flag shall be equal to 0 in bitstreams conforming to this version of\n     * this Specification. Other values are reserved for future use.\n     */\n    uint8_t color_saturation_mapping_flag;\n\n    /**\n     * The color saturation gain in the processing window in the scene. The\n     * value shall be in the range of 0 to 63/8, inclusive and in multiples of\n     * 1/8. The default value shall be 1.\n     */\n    AVRational color_saturation_weight;\n} AVHDRPlusColorTransformParams;\n\n/**\n * This struct represents dynamic metadata for color volume transform -\n * application 4 of SMPTE 2094-40:2016 standard.\n *\n * To be used as payload of a AVFrameSideData or AVPacketSideData with the\n * appropriate type.\n *\n * @note The struct should be allocated with\n * av_dynamic_hdr_plus_alloc() and its size is not a part of\n * the public ABI.\n */\ntypedef struct AVDynamicHDRPlus {\n    /**\n     * Country code by Rec. ITU-T T.35 Annex A. The value shall be 0xB5.\n     */\n    uint8_t itu_t_t35_country_code;\n\n    /**\n     * Application version in the application defining document in ST-2094\n     * suite. The value shall be set to 0.\n     */\n    uint8_t application_version;\n\n    /**\n     * The number of processing windows. The value shall be in the range\n     * of 1 to 3, inclusive.\n     */\n    uint8_t num_windows;\n\n    /**\n     * The color transform parameters for every processing window.\n     */\n    AVHDRPlusColorTransformParams params[3];\n\n    /**\n     * The nominal maximum display luminance of the targeted system display,\n     * in units of 0.0001 candelas per square metre. The value shall be in\n     * the range of 0 to 10000, inclusive.\n     */\n    AVRational targeted_system_display_maximum_luminance;\n\n    /**\n     * This flag shall be equal to 0 in bit streams conforming to this version\n     * of this Specification. The value 1 is reserved for future use.\n     */\n    uint8_t targeted_system_display_actual_peak_luminance_flag;\n\n    /**\n     * The number of rows in the targeted system_display_actual_peak_luminance\n     * array. The value shall be in the range of 2 to 25, inclusive.\n     */\n    uint8_t num_rows_targeted_system_display_actual_peak_luminance;\n\n    /**\n     * The number of columns in the\n     * targeted_system_display_actual_peak_luminance array. The value shall be\n     * in the range of 2 to 25, inclusive.\n     */\n    uint8_t num_cols_targeted_system_display_actual_peak_luminance;\n\n    /**\n     * The normalized actual peak luminance of the targeted system display. The\n     * values should be in the range of 0 to 1, inclusive and in multiples of\n     * 1/15.\n     */\n    AVRational targeted_system_display_actual_peak_luminance[25][25];\n\n    /**\n     * This flag shall be equal to 0 in bitstreams conforming to this version of\n     * this Specification. The value 1 is reserved for future use.\n     */\n    uint8_t mastering_display_actual_peak_luminance_flag;\n\n    /**\n     * The number of rows in the mastering_display_actual_peak_luminance array.\n     * The value shall be in the range of 2 to 25, inclusive.\n     */\n    uint8_t num_rows_mastering_display_actual_peak_luminance;\n\n    /**\n     * The number of columns in the mastering_display_actual_peak_luminance\n     * array. The value shall be in the range of 2 to 25, inclusive.\n     */\n    uint8_t num_cols_mastering_display_actual_peak_luminance;\n\n    /**\n     * The normalized actual peak luminance of the mastering display used for\n     * mastering the image essence. The values should be in the range of 0 to 1,\n     * inclusive and in multiples of 1/15.\n     */\n    AVRational mastering_display_actual_peak_luminance[25][25];\n} AVDynamicHDRPlus;\n\n/**\n * Allocate an AVDynamicHDRPlus structure and set its fields to\n * default values. The resulting struct can be freed using av_freep().\n *\n * @return An AVDynamicHDRPlus filled with default values or NULL\n *         on failure.\n */\nAVDynamicHDRPlus *av_dynamic_hdr_plus_alloc(size_t *size);\n\n/**\n * Allocate a complete AVDynamicHDRPlus and add it to the frame.\n * @param frame The frame which side data is added to.\n *\n * @return The AVDynamicHDRPlus structure to be filled by caller or NULL\n *         on failure.\n */\nAVDynamicHDRPlus *av_dynamic_hdr_plus_create_side_data(AVFrame *frame);\n\n/**\n * Parse the user data registered ITU-T T.35 to AVbuffer (AVDynamicHDRPlus).\n * The T.35 buffer must begin with the application mode, skipping the\n * country code, terminal provider codes, and application identifier.\n * @param s A pointer containing the decoded AVDynamicHDRPlus structure.\n * @param data The byte array containing the raw ITU-T T.35 data.\n * @param size Size of the data array in bytes.\n *\n * @return >= 0 on success. Otherwise, returns the appropriate AVERROR.\n */\nint av_dynamic_hdr_plus_from_t35(AVDynamicHDRPlus *s, const uint8_t *data,\n                                 size_t size);\n\n#define AV_HDR_PLUS_MAX_PAYLOAD_SIZE 907\n\n/**\n * Serialize dynamic HDR10+ metadata to a user data registered ITU-T T.35 buffer,\n * excluding the first 48 bytes of the header, and beginning with the application mode.\n * @param s A pointer containing the decoded AVDynamicHDRPlus structure.\n * @param[in,out] data A pointer to pointer to a byte buffer to be filled with the\n *                     serialized metadata.\n *                     If *data is NULL, a buffer be will be allocated and a pointer to\n *                     it stored in its place. The caller assumes ownership of the buffer.\n *                     May be NULL, in which case the function will only store the\n *                     required buffer size in *size.\n * @param[in,out] size A pointer to a size to be set to the returned buffer's size.\n *                     If *data is not NULL, *size must contain the size of the input\n *                     buffer. May be NULL only if *data is NULL.\n *\n * @return >= 0 on success. Otherwise, returns the appropriate AVERROR.\n */\nint av_dynamic_hdr_plus_to_t35(const AVDynamicHDRPlus *s, uint8_t **data, size_t *size);\n\n#endif /* AVUTIL_HDR_DYNAMIC_METADATA_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hdr_dynamic_vivid_metadata.h",
    "content": "/*\n * Copyright (c) 2021 Limin Wang <lance.lmwang at gmail.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HDR_DYNAMIC_VIVID_METADATA_H\n#define AVUTIL_HDR_DYNAMIC_VIVID_METADATA_H\n\n#include \"frame.h\"\n#include \"rational.h\"\n\n/**\n * HDR Vivid three spline params.\n */\ntypedef struct AVHDRVivid3SplineParams {\n    /**\n     * The mode of three Spline. the value shall be in the range\n     * of 0 to 3, inclusive.\n     */\n    int th_mode;\n\n    /**\n     * three_Spline_TH_enable_MB is in the range of 0.0 to 1.0, inclusive\n     * and in multiples of 1.0/255.\n     *\n     */\n    AVRational th_enable_mb;\n\n    /**\n     * 3Spline_TH_enable of three Spline.\n     * The value shall be in the range of 0.0 to 1.0, inclusive.\n     * and in multiples of 1.0/4095.\n     */\n    AVRational th_enable;\n\n    /**\n     * 3Spline_TH_Delta1 of three Spline.\n     * The value shall be in the range of 0.0 to 0.25, inclusive,\n     * and in multiples of 0.25/1023.\n     */\n    AVRational th_delta1;\n\n    /**\n     * 3Spline_TH_Delta2 of three Spline.\n     * The value shall be in the range of 0.0 to 0.25, inclusive,\n     * and in multiples of 0.25/1023.\n     */\n    AVRational th_delta2;\n\n    /**\n     * 3Spline_enable_Strength of three Spline.\n     * The value shall be in the range of 0.0 to 1.0, inclusive,\n     * and in multiples of 1.0/255.\n     */\n    AVRational enable_strength;\n} AVHDRVivid3SplineParams;\n\n/**\n * Color tone mapping parameters at a processing window in a dynamic metadata for\n * CUVA 005.1:2021.\n */\ntypedef struct AVHDRVividColorToneMappingParams {\n    /**\n     * The nominal maximum display luminance of the targeted system display,\n     * in multiples of 1.0/4095 candelas per square metre. The value shall be in\n     * the range of 0.0 to 1.0, inclusive.\n     */\n    AVRational targeted_system_display_maximum_luminance;\n\n    /**\n     * This flag indicates that transfer the base parameter(for value of 1)\n     */\n    int base_enable_flag;\n\n    /**\n     * base_param_m_p in the base parameter,\n     * in multiples of 1.0/16383. The value shall be in\n     * the range of 0.0 to 1.0, inclusive.\n     */\n    AVRational base_param_m_p;\n\n    /**\n     * base_param_m_m in the base parameter,\n     * in multiples of 1.0/10. The value shall be in\n     * the range of 0.0 to 6.3, inclusive.\n     */\n    AVRational base_param_m_m;\n\n    /**\n     * base_param_m_a in the base parameter,\n     * in multiples of 1.0/1023. The value shall be in\n     * the range of 0.0 to 1.0 inclusive.\n     */\n    AVRational base_param_m_a;\n\n    /**\n     * base_param_m_b in the base parameter,\n     * in multiples of 1/1023. The value shall be in\n     * the range of 0.0 to 1.0, inclusive.\n     */\n    AVRational base_param_m_b;\n\n    /**\n     * base_param_m_n in the base parameter,\n     * in multiples of 1.0/10. The value shall be in\n     * the range of 0.0 to 6.3, inclusive.\n     */\n    AVRational base_param_m_n;\n\n    /**\n     * indicates k1_0 in the base parameter,\n     * base_param_k1 <= 1: k1_0 = base_param_k1\n     * base_param_k1 > 1: reserved\n     */\n    int base_param_k1;\n\n    /**\n     * indicates k2_0 in the base parameter,\n     * base_param_k2 <= 1: k2_0 = base_param_k2\n     * base_param_k2 > 1: reserved\n     */\n    int base_param_k2;\n\n    /**\n     * indicates k3_0 in the base parameter,\n     * base_param_k3 == 1: k3_0 = base_param_k3\n     * base_param_k3 == 2: k3_0 = maximum_maxrgb\n     * base_param_k3 > 2: reserved\n     */\n    int base_param_k3;\n\n    /**\n     * This flag indicates that delta mode of base parameter(for value of 1)\n     */\n    int base_param_Delta_enable_mode;\n\n    /**\n     * base_param_Delta in the base parameter,\n     * in multiples of 1.0/127. The value shall be in\n     * the range of 0.0 to 1.0, inclusive.\n     */\n    AVRational base_param_Delta;\n\n    /**\n     * indicates 3Spline_enable_flag in the base parameter,\n     * This flag indicates that transfer three Spline of base parameter(for value of 1)\n     */\n    int three_Spline_enable_flag;\n\n    /**\n     * The number of three Spline. The value shall be in the range\n     * of 1 to 2, inclusive.\n     */\n    int three_Spline_num;\n\n    AVHDRVivid3SplineParams three_spline[2];\n} AVHDRVividColorToneMappingParams;\n\n\n/**\n * Color transform parameters at a processing window in a dynamic metadata for\n * CUVA 005.1:2021.\n */\ntypedef struct AVHDRVividColorTransformParams {\n    /**\n     * Indicates the minimum brightness of the displayed content.\n     * The values should be in the range of 0.0 to 1.0,\n     * inclusive and in multiples of 1/4095.\n     */\n    AVRational minimum_maxrgb;\n\n    /**\n     * Indicates the average brightness of the displayed content.\n     * The values should be in the range of 0.0 to 1.0,\n     * inclusive and in multiples of 1/4095.\n     */\n    AVRational average_maxrgb;\n\n    /**\n     * Indicates the variance brightness of the displayed content.\n     * The values should be in the range of 0.0 to 1.0,\n     * inclusive and in multiples of 1/4095.\n     */\n    AVRational variance_maxrgb;\n\n    /**\n     * Indicates the maximum brightness of the displayed content.\n     * The values should be in the range of 0.0 to 1.0, inclusive\n     * and in multiples of 1/4095.\n     */\n    AVRational maximum_maxrgb;\n\n    /**\n     * This flag indicates that the metadata for the tone mapping function in\n     * the processing window is present (for value of 1).\n     */\n    int tone_mapping_mode_flag;\n\n    /**\n     * The number of tone mapping param. The value shall be in the range\n     * of 1 to 2, inclusive.\n     */\n    int tone_mapping_param_num;\n\n    /**\n     * The color tone mapping parameters.\n     */\n    AVHDRVividColorToneMappingParams tm_params[2];\n\n    /**\n     * This flag indicates that the metadata for the color saturation mapping in\n     * the processing window is present (for value of 1).\n     */\n    int color_saturation_mapping_flag;\n\n    /**\n     * The number of color saturation param. The value shall be in the range\n     * of 0 to 7, inclusive.\n     */\n    int color_saturation_num;\n\n    /**\n     * Indicates the color correction strength parameter.\n     * The values should be in the range of 0.0 to 2.0, inclusive\n     * and in multiples of 1/128.\n     */\n    AVRational color_saturation_gain[8];\n} AVHDRVividColorTransformParams;\n\n/**\n * This struct represents dynamic metadata for color volume transform -\n * CUVA 005.1:2021 standard\n *\n * To be used as payload of a AVFrameSideData or AVPacketSideData with the\n * appropriate type.\n *\n * @note The struct should be allocated with\n * av_dynamic_hdr_vivid_alloc() and its size is not a part of\n * the public ABI.\n */\ntypedef struct AVDynamicHDRVivid {\n    /**\n     * The system start code. The value shall be set to 0x01.\n     */\n    uint8_t system_start_code;\n\n    /**\n     * The number of processing windows. The value shall be set to 0x01\n     * if the system_start_code is 0x01.\n     */\n    uint8_t num_windows;\n\n    /**\n     * The color transform parameters for every processing window.\n     */\n    AVHDRVividColorTransformParams params[3];\n} AVDynamicHDRVivid;\n\n/**\n * Allocate an AVDynamicHDRVivid structure and set its fields to\n * default values. The resulting struct can be freed using av_freep().\n *\n * @return An AVDynamicHDRVivid filled with default values or NULL\n *         on failure.\n */\nAVDynamicHDRVivid *av_dynamic_hdr_vivid_alloc(size_t *size);\n\n/**\n * Allocate a complete AVDynamicHDRVivid and add it to the frame.\n * @param frame The frame which side data is added to.\n *\n * @return The AVDynamicHDRVivid structure to be filled by caller or NULL\n *         on failure.\n */\nAVDynamicHDRVivid *av_dynamic_hdr_vivid_create_side_data(AVFrame *frame);\n\n#endif /* AVUTIL_HDR_DYNAMIC_VIVID_METADATA_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hmac.h",
    "content": "/*\n * Copyright (C) 2012 Martin Storsjo\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HMAC_H\n#define AVUTIL_HMAC_H\n\n#include <stdint.h>\n\n/**\n * @defgroup lavu_hmac HMAC\n * @ingroup lavu_crypto\n * @{\n */\n\nenum AVHMACType {\n    AV_HMAC_MD5,\n    AV_HMAC_SHA1,\n    AV_HMAC_SHA224,\n    AV_HMAC_SHA256,\n    AV_HMAC_SHA384,\n    AV_HMAC_SHA512,\n};\n\ntypedef struct AVHMAC AVHMAC;\n\n/**\n * Allocate an AVHMAC context.\n * @param type The hash function used for the HMAC.\n */\nAVHMAC *av_hmac_alloc(enum AVHMACType type);\n\n/**\n * Free an AVHMAC context.\n * @param ctx The context to free, may be NULL\n */\nvoid av_hmac_free(AVHMAC *ctx);\n\n/**\n * Initialize an AVHMAC context with an authentication key.\n * @param ctx    The HMAC context\n * @param key    The authentication key\n * @param keylen The length of the key, in bytes\n */\nvoid av_hmac_init(AVHMAC *ctx, const uint8_t *key, unsigned int keylen);\n\n/**\n * Hash data with the HMAC.\n * @param ctx  The HMAC context\n * @param data The data to hash\n * @param len  The length of the data, in bytes\n */\nvoid av_hmac_update(AVHMAC *ctx, const uint8_t *data, unsigned int len);\n\n/**\n * Finish hashing and output the HMAC digest.\n * @param ctx    The HMAC context\n * @param out    The output buffer to write the digest into\n * @param outlen The length of the out buffer, in bytes\n * @return       The number of bytes written to out, or a negative error code.\n */\nint av_hmac_final(AVHMAC *ctx, uint8_t *out, unsigned int outlen);\n\n/**\n * Hash an array of data with a key.\n * @param ctx    The HMAC context\n * @param data   The data to hash\n * @param len    The length of the data, in bytes\n * @param key    The authentication key\n * @param keylen The length of the key, in bytes\n * @param out    The output buffer to write the digest into\n * @param outlen The length of the out buffer, in bytes\n * @return       The number of bytes written to out, or a negative error code.\n */\nint av_hmac_calc(AVHMAC *ctx, const uint8_t *data, unsigned int len,\n                 const uint8_t *key, unsigned int keylen,\n                 uint8_t *out, unsigned int outlen);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_HMAC_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HWCONTEXT_H\n#define AVUTIL_HWCONTEXT_H\n\n#include \"buffer.h\"\n#include \"frame.h\"\n#include \"log.h\"\n#include \"pixfmt.h\"\n\nenum AVHWDeviceType {\n    AV_HWDEVICE_TYPE_NONE,\n    AV_HWDEVICE_TYPE_VDPAU,\n    AV_HWDEVICE_TYPE_CUDA,\n    AV_HWDEVICE_TYPE_VAAPI,\n    AV_HWDEVICE_TYPE_DXVA2,\n    AV_HWDEVICE_TYPE_QSV,\n    AV_HWDEVICE_TYPE_VIDEOTOOLBOX,\n    AV_HWDEVICE_TYPE_D3D11VA,\n    AV_HWDEVICE_TYPE_DRM,\n    AV_HWDEVICE_TYPE_OPENCL,\n    AV_HWDEVICE_TYPE_MEDIACODEC,\n    AV_HWDEVICE_TYPE_VULKAN,\n    AV_HWDEVICE_TYPE_D3D12VA,\n    AV_HWDEVICE_TYPE_AMF,\n    /* OpenHarmony Codec device */\n    AV_HWDEVICE_TYPE_OHCODEC,\n};\n\n/**\n * This struct aggregates all the (hardware/vendor-specific) \"high-level\" state,\n * i.e. state that is not tied to a concrete processing configuration.\n * E.g., in an API that supports hardware-accelerated encoding and decoding,\n * this struct will (if possible) wrap the state that is common to both encoding\n * and decoding and from which specific instances of encoders or decoders can be\n * derived.\n *\n * This struct is reference-counted with the AVBuffer mechanism. The\n * av_hwdevice_ctx_alloc() constructor yields a reference, whose data field\n * points to the actual AVHWDeviceContext. Further objects derived from\n * AVHWDeviceContext (such as AVHWFramesContext, describing a frame pool with\n * specific properties) will hold an internal reference to it. After all the\n * references are released, the AVHWDeviceContext itself will be freed,\n * optionally invoking a user-specified callback for uninitializing the hardware\n * state.\n */\ntypedef struct AVHWDeviceContext {\n    /**\n     * A class for logging. Set by av_hwdevice_ctx_alloc().\n     */\n    const AVClass *av_class;\n\n    /**\n     * This field identifies the underlying API used for hardware access.\n     *\n     * This field is set when this struct is allocated and never changed\n     * afterwards.\n     */\n    enum AVHWDeviceType type;\n\n    /**\n     * The format-specific data, allocated and freed by libavutil along with\n     * this context.\n     *\n     * Should be cast by the user to the format-specific context defined in the\n     * corresponding header (hwcontext_*.h) and filled as described in the\n     * documentation before calling av_hwdevice_ctx_init().\n     *\n     * After calling av_hwdevice_ctx_init() this struct should not be modified\n     * by the caller.\n     */\n    void *hwctx;\n\n    /**\n     * This field may be set by the caller before calling av_hwdevice_ctx_init().\n     *\n     * If non-NULL, this callback will be called when the last reference to\n     * this context is unreferenced, immediately before it is freed.\n     *\n     * @note when other objects (e.g an AVHWFramesContext) are derived from this\n     *       struct, this callback will be invoked after all such child objects\n     *       are fully uninitialized and their respective destructors invoked.\n     */\n    void (*free)(struct AVHWDeviceContext *ctx);\n\n    /**\n     * Arbitrary user data, to be used e.g. by the free() callback.\n     */\n    void *user_opaque;\n} AVHWDeviceContext;\n\n/**\n * This struct describes a set or pool of \"hardware\" frames (i.e. those with\n * data not located in normal system memory). All the frames in the pool are\n * assumed to be allocated in the same way and interchangeable.\n *\n * This struct is reference-counted with the AVBuffer mechanism and tied to a\n * given AVHWDeviceContext instance. The av_hwframe_ctx_alloc() constructor\n * yields a reference, whose data field points to the actual AVHWFramesContext\n * struct.\n */\ntypedef struct AVHWFramesContext {\n    /**\n     * A class for logging.\n     */\n    const AVClass *av_class;\n\n    /**\n     * A reference to the parent AVHWDeviceContext. This reference is owned and\n     * managed by the enclosing AVHWFramesContext, but the caller may derive\n     * additional references from it.\n     */\n    AVBufferRef *device_ref;\n\n    /**\n     * The parent AVHWDeviceContext. This is simply a pointer to\n     * device_ref->data provided for convenience.\n     *\n     * Set by libavutil in av_hwframe_ctx_init().\n     */\n    AVHWDeviceContext *device_ctx;\n\n    /**\n     * The format-specific data, allocated and freed automatically along with\n     * this context.\n     *\n     * The user shall ignore this field if the corresponding format-specific\n     * header (hwcontext_*.h) does not define a context to be used as\n     * AVHWFramesContext.hwctx.\n     *\n     * Otherwise, it should be cast by the user to said context and filled\n     * as described in the documentation before calling av_hwframe_ctx_init().\n     *\n     * After any frames using this context are created, the contents of this\n     * struct should not be modified by the caller.\n     */\n    void *hwctx;\n\n    /**\n     * This field may be set by the caller before calling av_hwframe_ctx_init().\n     *\n     * If non-NULL, this callback will be called when the last reference to\n     * this context is unreferenced, immediately before it is freed.\n     */\n    void (*free)(struct AVHWFramesContext *ctx);\n\n    /**\n     * Arbitrary user data, to be used e.g. by the free() callback.\n     */\n    void *user_opaque;\n\n    /**\n     * A pool from which the frames are allocated by av_hwframe_get_buffer().\n     * This field may be set by the caller before calling av_hwframe_ctx_init().\n     * The buffers returned by calling av_buffer_pool_get() on this pool must\n     * have the properties described in the documentation in the corresponding hw\n     * type's header (hwcontext_*.h). The pool will be freed strictly before\n     * this struct's free() callback is invoked.\n     *\n     * This field may be NULL, then libavutil will attempt to allocate a pool\n     * internally. Note that certain device types enforce pools allocated at\n     * fixed size (frame count), which cannot be extended dynamically. In such a\n     * case, initial_pool_size must be set appropriately.\n     */\n    AVBufferPool *pool;\n\n    /**\n     * Initial size of the frame pool. If a device type does not support\n     * dynamically resizing the pool, then this is also the maximum pool size.\n     *\n     * May be set by the caller before calling av_hwframe_ctx_init(). Must be\n     * set if pool is NULL and the device type does not support dynamic pools.\n     */\n    int initial_pool_size;\n\n    /**\n     * The pixel format identifying the underlying HW surface type.\n     *\n     * Must be a hwaccel format, i.e. the corresponding descriptor must have the\n     * AV_PIX_FMT_FLAG_HWACCEL flag set.\n     *\n     * Must be set by the user before calling av_hwframe_ctx_init().\n     */\n    enum AVPixelFormat format;\n\n    /**\n     * The pixel format identifying the actual data layout of the hardware\n     * frames.\n     *\n     * Must be set by the caller before calling av_hwframe_ctx_init().\n     *\n     * @note when the underlying API does not provide the exact data layout, but\n     * only the colorspace/bit depth, this field should be set to the fully\n     * planar version of that format (e.g. for 8-bit 420 YUV it should be\n     * AV_PIX_FMT_YUV420P, not AV_PIX_FMT_NV12 or anything else).\n     */\n    enum AVPixelFormat sw_format;\n\n    /**\n     * The allocated dimensions of the frames in this pool.\n     *\n     * Must be set by the user before calling av_hwframe_ctx_init().\n     */\n    int width, height;\n} AVHWFramesContext;\n\n/**\n * Look up an AVHWDeviceType by name.\n *\n * @param name String name of the device type (case-insensitive).\n * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if\n *         not found.\n */\nenum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name);\n\n/** Get the string name of an AVHWDeviceType.\n *\n * @param type Type from enum AVHWDeviceType.\n * @return Pointer to a static string containing the name, or NULL if the type\n *         is not valid.\n */\nconst char *av_hwdevice_get_type_name(enum AVHWDeviceType type);\n\n/**\n * Iterate over supported device types.\n *\n * @param prev AV_HWDEVICE_TYPE_NONE initially, then the previous type\n *             returned by this function in subsequent iterations.\n * @return The next usable device type from enum AVHWDeviceType, or\n *         AV_HWDEVICE_TYPE_NONE if there are no more.\n */\nenum AVHWDeviceType av_hwdevice_iterate_types(enum AVHWDeviceType prev);\n\n/**\n * Allocate an AVHWDeviceContext for a given hardware type.\n *\n * @param type the type of the hardware device to allocate.\n * @return a reference to the newly created AVHWDeviceContext on success or NULL\n *         on failure.\n */\nAVBufferRef *av_hwdevice_ctx_alloc(enum AVHWDeviceType type);\n\n/**\n * Finalize the device context before use. This function must be called after\n * the context is filled with all the required information and before it is\n * used in any way.\n *\n * @param ref a reference to the AVHWDeviceContext\n * @return 0 on success, a negative AVERROR code on failure\n */\nint av_hwdevice_ctx_init(AVBufferRef *ref);\n\n/**\n * Open a device of the specified type and create an AVHWDeviceContext for it.\n *\n * This is a convenience function intended to cover the simple cases. Callers\n * who need to fine-tune device creation/management should open the device\n * manually and then wrap it in an AVHWDeviceContext using\n * av_hwdevice_ctx_alloc()/av_hwdevice_ctx_init().\n *\n * The returned context is already initialized and ready for use, the caller\n * should not call av_hwdevice_ctx_init() on it. The user_opaque/free fields of\n * the created AVHWDeviceContext are set by this function and should not be\n * touched by the caller.\n *\n * @param device_ctx On success, a reference to the newly-created device context\n *                   will be written here. The reference is owned by the caller\n *                   and must be released with av_buffer_unref() when no longer\n *                   needed. On failure, NULL will be written to this pointer.\n * @param type The type of the device to create.\n * @param device A type-specific string identifying the device to open.\n * @param opts A dictionary of additional (type-specific) options to use in\n *             opening the device. The dictionary remains owned by the caller.\n * @param flags currently unused\n *\n * @return 0 on success, a negative AVERROR code on failure.\n */\nint av_hwdevice_ctx_create(AVBufferRef **device_ctx, enum AVHWDeviceType type,\n                           const char *device, AVDictionary *opts, int flags);\n\n/**\n * Create a new device of the specified type from an existing device.\n *\n * If the source device is a device of the target type or was originally\n * derived from such a device (possibly through one or more intermediate\n * devices of other types), then this will return a reference to the\n * existing device of the same type as is requested.\n *\n * Otherwise, it will attempt to derive a new device from the given source\n * device.  If direct derivation to the new type is not implemented, it will\n * attempt the same derivation from each ancestor of the source device in\n * turn looking for an implemented derivation method.\n *\n * @param dst_ctx On success, a reference to the newly-created\n *                AVHWDeviceContext.\n * @param type    The type of the new device to create.\n * @param src_ctx A reference to an existing AVHWDeviceContext which will be\n *                used to create the new device.\n * @param flags   Currently unused; should be set to zero.\n * @return        Zero on success, a negative AVERROR code on failure.\n */\nint av_hwdevice_ctx_create_derived(AVBufferRef **dst_ctx,\n                                   enum AVHWDeviceType type,\n                                   AVBufferRef *src_ctx, int flags);\n\n/**\n * Create a new device of the specified type from an existing device.\n *\n * This function performs the same action as av_hwdevice_ctx_create_derived,\n * however, it is able to set options for the new device to be derived.\n *\n * @param dst_ctx On success, a reference to the newly-created\n *                AVHWDeviceContext.\n * @param type    The type of the new device to create.\n * @param src_ctx A reference to an existing AVHWDeviceContext which will be\n *                used to create the new device.\n * @param options Options for the new device to create, same format as in\n *                av_hwdevice_ctx_create.\n * @param flags   Currently unused; should be set to zero.\n * @return        Zero on success, a negative AVERROR code on failure.\n */\nint av_hwdevice_ctx_create_derived_opts(AVBufferRef **dst_ctx,\n                                        enum AVHWDeviceType type,\n                                        AVBufferRef *src_ctx,\n                                        AVDictionary *options, int flags);\n\n/**\n * Allocate an AVHWFramesContext tied to a given device context.\n *\n * @param device_ctx a reference to a AVHWDeviceContext. This function will make\n *                   a new reference for internal use, the one passed to the\n *                   function remains owned by the caller.\n * @return a reference to the newly created AVHWFramesContext on success or NULL\n *         on failure.\n */\nAVBufferRef *av_hwframe_ctx_alloc(AVBufferRef *device_ctx);\n\n/**\n * Finalize the context before use. This function must be called after the\n * context is filled with all the required information and before it is attached\n * to any frames.\n *\n * @param ref a reference to the AVHWFramesContext\n * @return 0 on success, a negative AVERROR code on failure\n */\nint av_hwframe_ctx_init(AVBufferRef *ref);\n\n/**\n * Allocate a new frame attached to the given AVHWFramesContext.\n *\n * @param hwframe_ctx a reference to an AVHWFramesContext\n * @param frame an empty (freshly allocated or unreffed) frame to be filled with\n *              newly allocated buffers.\n * @param flags currently unused, should be set to zero\n * @return 0 on success, a negative AVERROR code on failure\n */\nint av_hwframe_get_buffer(AVBufferRef *hwframe_ctx, AVFrame *frame, int flags);\n\n/**\n * Copy data to or from a hw surface. At least one of dst/src must have an\n * AVHWFramesContext attached.\n *\n * If src has an AVHWFramesContext attached, then the format of dst (if set)\n * must use one of the formats returned by av_hwframe_transfer_get_formats(src,\n * AV_HWFRAME_TRANSFER_DIRECTION_FROM).\n * If dst has an AVHWFramesContext attached, then the format of src must use one\n * of the formats returned by av_hwframe_transfer_get_formats(dst,\n * AV_HWFRAME_TRANSFER_DIRECTION_TO)\n *\n * dst may be \"clean\" (i.e. with data/buf pointers unset), in which case the\n * data buffers will be allocated by this function using av_frame_get_buffer().\n * If dst->format is set, then this format will be used, otherwise (when\n * dst->format is AV_PIX_FMT_NONE) the first acceptable format will be chosen.\n *\n * The two frames must have matching allocated dimensions (i.e. equal to\n * AVHWFramesContext.width/height), since not all device types support\n * transferring a sub-rectangle of the whole surface. The display dimensions\n * (i.e. AVFrame.width/height) may be smaller than the allocated dimensions, but\n * also have to be equal for both frames. When the display dimensions are\n * smaller than the allocated dimensions, the content of the padding in the\n * destination frame is unspecified.\n *\n * @param dst the destination frame. dst is not touched on failure.\n * @param src the source frame.\n * @param flags currently unused, should be set to zero\n * @return 0 on success, a negative AVERROR error code on failure.\n */\nint av_hwframe_transfer_data(AVFrame *dst, const AVFrame *src, int flags);\n\nenum AVHWFrameTransferDirection {\n    /**\n     * Transfer the data from the queried hw frame.\n     */\n    AV_HWFRAME_TRANSFER_DIRECTION_FROM,\n\n    /**\n     * Transfer the data to the queried hw frame.\n     */\n    AV_HWFRAME_TRANSFER_DIRECTION_TO,\n};\n\n/**\n * Get a list of possible source or target formats usable in\n * av_hwframe_transfer_data().\n *\n * @param hwframe_ctx the frame context to obtain the information for\n * @param dir the direction of the transfer\n * @param formats the pointer to the output format list will be written here.\n *                The list is terminated with AV_PIX_FMT_NONE and must be freed\n *                by the caller when no longer needed using av_free().\n *                If this function returns successfully, the format list will\n *                have at least one item (not counting the terminator).\n *                On failure, the contents of this pointer are unspecified.\n * @param flags currently unused, should be set to zero\n * @return 0 on success, a negative AVERROR code on failure.\n */\nint av_hwframe_transfer_get_formats(AVBufferRef *hwframe_ctx,\n                                    enum AVHWFrameTransferDirection dir,\n                                    enum AVPixelFormat **formats, int flags);\n\n\n/**\n * This struct describes the constraints on hardware frames attached to\n * a given device with a hardware-specific configuration.  This is returned\n * by av_hwdevice_get_hwframe_constraints() and must be freed by\n * av_hwframe_constraints_free() after use.\n */\ntypedef struct AVHWFramesConstraints {\n    /**\n     * A list of possible values for format in the hw_frames_ctx,\n     * terminated by AV_PIX_FMT_NONE.  This member will always be filled.\n     */\n    enum AVPixelFormat *valid_hw_formats;\n\n    /**\n     * A list of possible values for sw_format in the hw_frames_ctx,\n     * terminated by AV_PIX_FMT_NONE.  Can be NULL if this information is\n     * not known.\n     */\n    enum AVPixelFormat *valid_sw_formats;\n\n    /**\n     * The minimum size of frames in this hw_frames_ctx.\n     * (Zero if not known.)\n     */\n    int min_width;\n    int min_height;\n\n    /**\n     * The maximum size of frames in this hw_frames_ctx.\n     * (INT_MAX if not known / no limit.)\n     */\n    int max_width;\n    int max_height;\n} AVHWFramesConstraints;\n\n/**\n * Allocate a HW-specific configuration structure for a given HW device.\n * After use, the user must free all members as required by the specific\n * hardware structure being used, then free the structure itself with\n * av_free().\n *\n * @param device_ctx a reference to the associated AVHWDeviceContext.\n * @return The newly created HW-specific configuration structure on\n *         success or NULL on failure.\n */\nvoid *av_hwdevice_hwconfig_alloc(AVBufferRef *device_ctx);\n\n/**\n * Get the constraints on HW frames given a device and the HW-specific\n * configuration to be used with that device.  If no HW-specific\n * configuration is provided, returns the maximum possible capabilities\n * of the device.\n *\n * @param ref a reference to the associated AVHWDeviceContext.\n * @param hwconfig a filled HW-specific configuration structure, or NULL\n *        to return the maximum possible capabilities of the device.\n * @return AVHWFramesConstraints structure describing the constraints\n *         on the device, or NULL if not available.\n */\nAVHWFramesConstraints *av_hwdevice_get_hwframe_constraints(AVBufferRef *ref,\n                                                           const void *hwconfig);\n\n/**\n * Free an AVHWFrameConstraints structure.\n *\n * @param constraints The (filled or unfilled) AVHWFrameConstraints structure.\n */\nvoid av_hwframe_constraints_free(AVHWFramesConstraints **constraints);\n\n\n/**\n * Flags to apply to frame mappings.\n */\nenum {\n    /**\n     * The mapping must be readable.\n     */\n    AV_HWFRAME_MAP_READ      = 1 << 0,\n    /**\n     * The mapping must be writeable.\n     */\n    AV_HWFRAME_MAP_WRITE     = 1 << 1,\n    /**\n     * The mapped frame will be overwritten completely in subsequent\n     * operations, so the current frame data need not be loaded.  Any values\n     * which are not overwritten are unspecified.\n     */\n    AV_HWFRAME_MAP_OVERWRITE = 1 << 2,\n    /**\n     * The mapping must be direct.  That is, there must not be any copying in\n     * the map or unmap steps.  Note that performance of direct mappings may\n     * be much lower than normal memory.\n     */\n    AV_HWFRAME_MAP_DIRECT    = 1 << 3,\n};\n\n/**\n * Map a hardware frame.\n *\n * This has a number of different possible effects, depending on the format\n * and origin of the src and dst frames.  On input, src should be a usable\n * frame with valid buffers and dst should be blank (typically as just created\n * by av_frame_alloc()).  src should have an associated hwframe context, and\n * dst may optionally have a format and associated hwframe context.\n *\n * If src was created by mapping a frame from the hwframe context of dst,\n * then this function undoes the mapping - dst is replaced by a reference to\n * the frame that src was originally mapped from.\n *\n * If both src and dst have an associated hwframe context, then this function\n * attempts to map the src frame from its hardware context to that of dst and\n * then fill dst with appropriate data to be usable there.  This will only be\n * possible if the hwframe contexts and associated devices are compatible -\n * given compatible devices, av_hwframe_ctx_create_derived() can be used to\n * create a hwframe context for dst in which mapping should be possible.\n *\n * If src has a hwframe context but dst does not, then the src frame is\n * mapped to normal memory and should thereafter be usable as a normal frame.\n * If the format is set on dst, then the mapping will attempt to create dst\n * with that format and fail if it is not possible.  If format is unset (is\n * AV_PIX_FMT_NONE) then dst will be mapped with whatever the most appropriate\n * format to use is (probably the sw_format of the src hwframe context).\n *\n * A return value of AVERROR(ENOSYS) indicates that the mapping is not\n * possible with the given arguments and hwframe setup, while other return\n * values indicate that it failed somehow.\n *\n * On failure, the destination frame will be left blank, except for the\n * hw_frames_ctx/format fields they may have been set by the caller - those will\n * be preserved as they were.\n *\n * @param dst Destination frame, to contain the mapping.\n * @param src Source frame, to be mapped.\n * @param flags Some combination of AV_HWFRAME_MAP_* flags.\n * @return Zero on success, negative AVERROR code on failure.\n */\nint av_hwframe_map(AVFrame *dst, const AVFrame *src, int flags);\n\n\n/**\n * Create and initialise an AVHWFramesContext as a mapping of another existing\n * AVHWFramesContext on a different device.\n *\n * av_hwframe_ctx_init() should not be called after this.\n *\n * @param derived_frame_ctx  On success, a reference to the newly created\n *                           AVHWFramesContext.\n * @param format             The AVPixelFormat for the derived context.\n * @param derived_device_ctx A reference to the device to create the new\n *                           AVHWFramesContext on.\n * @param source_frame_ctx   A reference to an existing AVHWFramesContext\n *                           which will be mapped to the derived context.\n * @param flags  Some combination of AV_HWFRAME_MAP_* flags, defining the\n *               mapping parameters to apply to frames which are allocated\n *               in the derived device.\n * @return       Zero on success, negative AVERROR code on failure.\n */\nint av_hwframe_ctx_create_derived(AVBufferRef **derived_frame_ctx,\n                                  enum AVPixelFormat format,\n                                  AVBufferRef *derived_device_ctx,\n                                  AVBufferRef *source_frame_ctx,\n                                  int flags);\n\n#endif /* AVUTIL_HWCONTEXT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_amf.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n\n#ifndef AVUTIL_HWCONTEXT_AMF_H\n#define AVUTIL_HWCONTEXT_AMF_H\n\n#include \"pixfmt.h\"\n#include \"hwcontext.h\"\n#include <AMF/core/Factory.h>\n#include <AMF/core/Context.h>\n#include <AMF/core/Trace.h>\n#include <AMF/core/Debug.h>\n\n/**\n * This struct is allocated as AVHWDeviceContext.hwctx\n */\ntypedef struct AVAMFDeviceContext {\n    void *              library;\n    AMFFactory         *factory;\n    void               *trace_writer;\n\n    int64_t             version; ///< version of AMF runtime\n    AMFContext         *context;\n    AMF_MEMORY_TYPE     memory_type;\n} AVAMFDeviceContext;\n\nenum AMF_SURFACE_FORMAT av_av_to_amf_format(enum AVPixelFormat fmt);\nenum AVPixelFormat av_amf_to_av_format(enum AMF_SURFACE_FORMAT fmt);\n\n#endif /* AVUTIL_HWCONTEXT_AMF_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_cuda.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n\n#ifndef AVUTIL_HWCONTEXT_CUDA_H\n#define AVUTIL_HWCONTEXT_CUDA_H\n\n#ifndef CUDA_VERSION\n#include <cuda.h>\n#endif\n\n#include \"pixfmt.h\"\n\n/**\n * @file\n * An API-specific header for AV_HWDEVICE_TYPE_CUDA.\n *\n * This API supports dynamic frame pools. AVHWFramesContext.pool must return\n * AVBufferRefs whose data pointer is a CUdeviceptr.\n */\n\ntypedef struct AVCUDADeviceContextInternal AVCUDADeviceContextInternal;\n\n/**\n * This struct is allocated as AVHWDeviceContext.hwctx\n */\ntypedef struct AVCUDADeviceContext {\n    CUcontext cuda_ctx;\n    CUstream stream;\n    AVCUDADeviceContextInternal *internal;\n} AVCUDADeviceContext;\n\n/**\n * AVHWFramesContext.hwctx is currently not used\n */\n\n/**\n * @defgroup hwcontext_cuda Device context creation flags\n *\n * Flags for av_hwdevice_ctx_create.\n *\n * @{\n */\n\n/**\n * Use primary device context instead of creating a new one.\n */\n#define AV_CUDA_USE_PRIMARY_CONTEXT (1 << 0)\n\n/**\n * Use current device context instead of creating a new one.\n */\n#define AV_CUDA_USE_CURRENT_CONTEXT (1 << 1)\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_HWCONTEXT_CUDA_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_d3d11va.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HWCONTEXT_D3D11VA_H\n#define AVUTIL_HWCONTEXT_D3D11VA_H\n\n/**\n * @file\n * An API-specific header for AV_HWDEVICE_TYPE_D3D11VA.\n *\n * The default pool implementation will be fixed-size if initial_pool_size is\n * set (and allocate elements from an array texture). Otherwise it will allocate\n * individual textures. Be aware that decoding requires a single array texture.\n *\n * Using sw_format==AV_PIX_FMT_YUV420P has special semantics, and maps to\n * DXGI_FORMAT_420_OPAQUE. av_hwframe_transfer_data() is not supported for\n * this format. Refer to MSDN for details.\n *\n * av_hwdevice_ctx_create() for this device type supports a key named \"debug\"\n * for the AVDictionary entry. If this is set to any value, the device creation\n * code will try to load various supported D3D debugging layers.\n */\n\n#include <d3d11.h>\n#include <stdint.h>\n\n/**\n * This struct is allocated as AVHWDeviceContext.hwctx\n */\ntypedef struct AVD3D11VADeviceContext {\n    /**\n     * Device used for texture creation and access. This can also be used to\n     * set the libavcodec decoding device.\n     *\n     * Must be set by the user. This is the only mandatory field - the other\n     * device context fields are set from this and are available for convenience.\n     *\n     * Deallocating the AVHWDeviceContext will always release this interface,\n     * and it does not matter whether it was user-allocated.\n     */\n    ID3D11Device        *device;\n\n    /**\n     * If unset, this will be set from the device field on init.\n     *\n     * Deallocating the AVHWDeviceContext will always release this interface,\n     * and it does not matter whether it was user-allocated.\n     */\n    ID3D11DeviceContext *device_context;\n\n    /**\n     * If unset, this will be set from the device field on init.\n     *\n     * Deallocating the AVHWDeviceContext will always release this interface,\n     * and it does not matter whether it was user-allocated.\n     */\n    ID3D11VideoDevice   *video_device;\n\n    /**\n     * If unset, this will be set from the device_context field on init.\n     *\n     * Deallocating the AVHWDeviceContext will always release this interface,\n     * and it does not matter whether it was user-allocated.\n     */\n    ID3D11VideoContext  *video_context;\n\n    /**\n     * Callbacks for locking. They protect accesses to device_context and\n     * video_context calls. They also protect access to the internal staging\n     * texture (for av_hwframe_transfer_data() calls). They do NOT protect\n     * access to hwcontext or decoder state in general.\n     *\n     * If unset on init, the hwcontext implementation will set them to use an\n     * internal mutex.\n     *\n     * The underlying lock must be recursive. lock_ctx is for free use by the\n     * locking implementation.\n     */\n    void (*lock)(void *lock_ctx);\n    void (*unlock)(void *lock_ctx);\n    void *lock_ctx;\n} AVD3D11VADeviceContext;\n\n/**\n * D3D11 frame descriptor for pool allocation.\n *\n * In user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs\n * with the data pointer pointing at an object of this type describing the\n * planes of the frame.\n *\n * This has no use outside of custom allocation, and AVFrame AVBufferRef do not\n * necessarily point to an instance of this struct.\n */\ntypedef struct AVD3D11FrameDescriptor {\n    /**\n     * The texture in which the frame is located. The reference count is\n     * managed by the AVBufferRef, and destroying the reference will release\n     * the interface.\n     *\n     * Normally stored in AVFrame.data[0].\n     */\n    ID3D11Texture2D *texture;\n\n    /**\n     * The index into the array texture element representing the frame, or 0\n     * if the texture is not an array texture.\n     *\n     * Normally stored in AVFrame.data[1] (cast from intptr_t).\n     */\n    intptr_t index;\n} AVD3D11FrameDescriptor;\n\n/**\n * This struct is allocated as AVHWFramesContext.hwctx\n */\ntypedef struct AVD3D11VAFramesContext {\n    /**\n     * The canonical texture used for pool allocation. If this is set to NULL\n     * on init, the hwframes implementation will allocate and set an array\n     * texture if initial_pool_size > 0.\n     *\n     * The only situation when the API user should set this is:\n     * - the user wants to do manual pool allocation (setting\n     *   AVHWFramesContext.pool), instead of letting AVHWFramesContext\n     *   allocate the pool\n     * - of an array texture\n     * - and wants it to use it for decoding\n     * - this has to be done before calling av_hwframe_ctx_init()\n     *\n     * Deallocating the AVHWFramesContext will always release this interface,\n     * and it does not matter whether it was user-allocated.\n     *\n     * This is in particular used by the libavcodec D3D11VA hwaccel, which\n     * requires a single array texture. It will create ID3D11VideoDecoderOutputView\n     * objects for each array texture element on decoder initialization.\n     */\n    ID3D11Texture2D *texture;\n\n    /**\n     * D3D11_TEXTURE2D_DESC.BindFlags used for texture creation. The user must\n     * at least set D3D11_BIND_DECODER if the frames context is to be used for\n     * video decoding.\n     * This field is ignored/invalid if a user-allocated texture is provided.\n     */\n    UINT BindFlags;\n\n    /**\n     * D3D11_TEXTURE2D_DESC.MiscFlags used for texture creation.\n     * This field is ignored/invalid if a user-allocated texture is provided.\n     */\n    UINT MiscFlags;\n\n    /**\n     * In case if texture structure member above is not NULL contains the same texture\n     * pointer for all elements and different indexes into the array texture.\n     * In case if texture structure member above is NULL, all elements contains\n     * pointers to separate non-array textures and 0 indexes.\n     * This field is ignored/invalid if a user-allocated texture is provided.\n    */\n    AVD3D11FrameDescriptor *texture_infos;\n} AVD3D11VAFramesContext;\n\n#endif /* AVUTIL_HWCONTEXT_D3D11VA_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_d3d12va.h",
    "content": "/*\n * Direct3D 12 HW acceleration.\n *\n * copyright (c) 2022-2023 Wu Jianhua <toqsxw@outlook.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HWCONTEXT_D3D12VA_H\n#define AVUTIL_HWCONTEXT_D3D12VA_H\n\n/**\n * @file\n * An API-specific header for AV_HWDEVICE_TYPE_D3D12VA.\n *\n * AVHWFramesContext.pool must contain AVBufferRefs whose\n * data pointer points to an AVD3D12VAFrame struct.\n */\n#include <stdint.h>\n#include <initguid.h>\n#include <d3d12.h>\n#include <d3d12sdklayers.h>\n#include <d3d12video.h>\n\n/**\n * @brief This struct is allocated as AVHWDeviceContext.hwctx\n *\n */\ntypedef struct AVD3D12VADeviceContext {\n    /**\n     * Device used for objects creation and access. This can also be\n     * used to set the libavcodec decoding device.\n     *\n     * Can be set by the user. This is the only mandatory field - the other\n     * device context fields are set from this and are available for convenience.\n     *\n     * Deallocating the AVHWDeviceContext will always release this interface,\n     * and it does not matter whether it was user-allocated.\n     */\n    ID3D12Device *device;\n\n    /**\n     * If unset, this will be set from the device field on init.\n     *\n     * Deallocating the AVHWDeviceContext will always release this interface,\n     * and it does not matter whether it was user-allocated.\n     */\n    ID3D12VideoDevice *video_device;\n\n    /**\n     * Callbacks for locking. They protect access to the internal staging\n     * texture (for av_hwframe_transfer_data() calls). They do NOT protect\n     * access to hwcontext or decoder state in general.\n     *\n     * If unset on init, the hwcontext implementation will set them to use an\n     * internal mutex.\n     *\n     * The underlying lock must be recursive. lock_ctx is for free use by the\n     * locking implementation.\n     */\n    void (*lock)(void *lock_ctx);\n    void (*unlock)(void *lock_ctx);\n    void *lock_ctx;\n} AVD3D12VADeviceContext;\n\n/**\n * @brief This struct is used to sync d3d12 execution\n *\n */\ntypedef struct AVD3D12VASyncContext {\n    /**\n     * D3D12 fence object\n     */\n    ID3D12Fence *fence;\n\n    /**\n     * A handle to the event object that's raised when the fence\n     * reaches a certain value.\n     */\n    HANDLE event;\n\n    /**\n     * The fence value used for sync\n     */\n    uint64_t fence_value;\n} AVD3D12VASyncContext;\n\n/**\n * @brief D3D12VA frame descriptor for pool allocation.\n *\n */\ntypedef struct AVD3D12VAFrame {\n    /**\n     * The texture in which the frame is located. The reference count is\n     * managed by the AVBufferRef, and destroying the reference will release\n     * the interface.\n     */\n    ID3D12Resource *texture;\n\n    /**\n     * The sync context for the texture\n     *\n     * @see: https://learn.microsoft.com/en-us/windows/win32/medfound/direct3d-12-video-overview#directx-12-fences\n     */\n    AVD3D12VASyncContext sync_ctx;\n} AVD3D12VAFrame;\n\n/**\n * @brief This struct is allocated as AVHWFramesContext.hwctx\n *\n */\ntypedef struct AVD3D12VAFramesContext {\n    /**\n     * DXGI_FORMAT format. MUST be compatible with the pixel format.\n     * If unset, will be automatically set.\n     */\n    DXGI_FORMAT format;\n\n    /**\n     * Options for working with resources.\n     * If unset, this will be D3D12_RESOURCE_FLAG_NONE.\n     *\n     * @see https://learn.microsoft.com/en-us/windows/win32/api/d3d12/ne-d3d12-d3d12_resource_flags\n     */\n    D3D12_RESOURCE_FLAGS flags;\n} AVD3D12VAFramesContext;\n\n#endif /* AVUTIL_HWCONTEXT_D3D12VA_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_drm.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HWCONTEXT_DRM_H\n#define AVUTIL_HWCONTEXT_DRM_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n/**\n * @file\n * API-specific header for AV_HWDEVICE_TYPE_DRM.\n *\n * Internal frame allocation is not currently supported - all frames\n * must be allocated by the user.  Thus AVHWFramesContext is always\n * NULL, though this may change if support for frame allocation is\n * added in future.\n */\n\nenum {\n    /**\n     * The maximum number of layers/planes in a DRM frame.\n     */\n    AV_DRM_MAX_PLANES = 4\n};\n\n/**\n * DRM object descriptor.\n *\n * Describes a single DRM object, addressing it as a PRIME file\n * descriptor.\n */\ntypedef struct AVDRMObjectDescriptor {\n    /**\n     * DRM PRIME fd for the object.\n     */\n    int fd;\n    /**\n     * Total size of the object.\n     *\n     * (This includes any parts not which do not contain image data.)\n     */\n    size_t size;\n    /**\n     * Format modifier applied to the object (DRM_FORMAT_MOD_*).\n     *\n     * If the format modifier is unknown then this should be set to\n     * DRM_FORMAT_MOD_INVALID.\n     */\n    uint64_t format_modifier;\n} AVDRMObjectDescriptor;\n\n/**\n * DRM plane descriptor.\n *\n * Describes a single plane of a layer, which is contained within\n * a single object.\n */\ntypedef struct AVDRMPlaneDescriptor {\n    /**\n     * Index of the object containing this plane in the objects\n     * array of the enclosing frame descriptor.\n     */\n    int object_index;\n    /**\n     * Offset within that object of this plane.\n     */\n    ptrdiff_t offset;\n    /**\n     * Pitch (linesize) of this plane.\n     */\n    ptrdiff_t pitch;\n} AVDRMPlaneDescriptor;\n\n/**\n * DRM layer descriptor.\n *\n * Describes a single layer within a frame.  This has the structure\n * defined by its format, and will contain one or more planes.\n */\ntypedef struct AVDRMLayerDescriptor {\n    /**\n     * Format of the layer (DRM_FORMAT_*).\n     */\n    uint32_t format;\n    /**\n     * Number of planes in the layer.\n     *\n     * This must match the number of planes required by format.\n     */\n    int nb_planes;\n    /**\n     * Array of planes in this layer.\n     */\n    AVDRMPlaneDescriptor planes[AV_DRM_MAX_PLANES];\n} AVDRMLayerDescriptor;\n\n/**\n * DRM frame descriptor.\n *\n * This is used as the data pointer for AV_PIX_FMT_DRM_PRIME frames.\n * It is also used by user-allocated frame pools - allocating in\n * AVHWFramesContext.pool must return AVBufferRefs which contain\n * an object of this type.\n *\n * The fields of this structure should be set such it can be\n * imported directly by EGL using the EGL_EXT_image_dma_buf_import\n * and EGL_EXT_image_dma_buf_import_modifiers extensions.\n * (Note that the exact layout of a particular format may vary between\n * platforms - we only specify that the same platform should be able\n * to import it.)\n *\n * The total number of planes must not exceed AV_DRM_MAX_PLANES, and\n * the order of the planes by increasing layer index followed by\n * increasing plane index must be the same as the order which would\n * be used for the data pointers in the equivalent software format.\n */\ntypedef struct AVDRMFrameDescriptor {\n    /**\n     * Number of DRM objects making up this frame.\n     */\n    int nb_objects;\n    /**\n     * Array of objects making up the frame.\n     */\n    AVDRMObjectDescriptor objects[AV_DRM_MAX_PLANES];\n    /**\n     * Number of layers in the frame.\n     */\n    int nb_layers;\n    /**\n     * Array of layers in the frame.\n     */\n    AVDRMLayerDescriptor layers[AV_DRM_MAX_PLANES];\n} AVDRMFrameDescriptor;\n\n/**\n * DRM device.\n *\n * Allocated as AVHWDeviceContext.hwctx.\n */\ntypedef struct AVDRMDeviceContext {\n    /**\n     * File descriptor of DRM device.\n     *\n     * This is used as the device to create frames on, and may also be\n     * used in some derivation and mapping operations.\n     *\n     * If no device is required, set to -1.\n     */\n    int fd;\n} AVDRMDeviceContext;\n\n#endif /* AVUTIL_HWCONTEXT_DRM_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_dxva2.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n\n#ifndef AVUTIL_HWCONTEXT_DXVA2_H\n#define AVUTIL_HWCONTEXT_DXVA2_H\n\n/**\n * @file\n * An API-specific header for AV_HWDEVICE_TYPE_DXVA2.\n *\n * Only fixed-size pools are supported.\n *\n * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs\n * with the data pointer set to a pointer to IDirect3DSurface9.\n */\n\n#include <d3d9.h>\n#include <dxva2api.h>\n\n/**\n * This struct is allocated as AVHWDeviceContext.hwctx\n */\ntypedef struct AVDXVA2DeviceContext {\n    IDirect3DDeviceManager9 *devmgr;\n} AVDXVA2DeviceContext;\n\n/**\n * This struct is allocated as AVHWFramesContext.hwctx\n */\ntypedef struct AVDXVA2FramesContext {\n    /**\n     * The surface type (e.g. DXVA2_VideoProcessorRenderTarget or\n     * DXVA2_VideoDecoderRenderTarget). Must be set by the caller.\n     */\n    DWORD               surface_type;\n\n    /**\n     * The surface pool. When an external pool is not provided by the caller,\n     * this will be managed (allocated and filled on init, freed on uninit) by\n     * libavutil.\n     */\n    IDirect3DSurface9 **surfaces;\n    int              nb_surfaces;\n\n    /**\n     * Certain drivers require the decoder to be destroyed before the surfaces.\n     * To allow internally managed pools to work properly in such cases, this\n     * field is provided.\n     *\n     * If it is non-NULL, libavutil will call IDirectXVideoDecoder_Release() on\n     * it just before the internal surface pool is freed.\n     *\n     * This is for convenience only. Some code uses other methods to manage the\n     * decoder reference.\n     */\n    IDirectXVideoDecoder *decoder_to_release;\n} AVDXVA2FramesContext;\n\n#endif /* AVUTIL_HWCONTEXT_DXVA2_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_mediacodec.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HWCONTEXT_MEDIACODEC_H\n#define AVUTIL_HWCONTEXT_MEDIACODEC_H\n\n/**\n * MediaCodec details.\n *\n * Allocated as AVHWDeviceContext.hwctx\n */\ntypedef struct AVMediaCodecDeviceContext {\n    /**\n     * android/view/Surface handle, to be filled by the user.\n     *\n     * This is the default surface used by decoders on this device.\n     */\n    void *surface;\n\n    /**\n     * Pointer to ANativeWindow.\n     *\n     * It both surface and native_window is NULL, try to create it\n     * automatically if create_window is true and OS support\n     * createPersistentInputSurface.\n     *\n     * It can be used as output surface for decoder and input surface for\n     * encoder.\n     */\n    void *native_window;\n\n    /**\n     * Enable createPersistentInputSurface automatically.\n     *\n     * Disabled by default.\n     *\n     * It can be enabled by setting this flag directly, or by setting\n     * AVDictionary of av_hwdevice_ctx_create(), with \"create_window\" as key.\n     * The second method is useful for ffmpeg cmdline, e.g., we can enable it\n     * via:\n     *   -init_hw_device mediacodec=mediacodec,create_window=1\n     */\n    int create_window;\n} AVMediaCodecDeviceContext;\n\n#endif /* AVUTIL_HWCONTEXT_MEDIACODEC_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_oh.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * Copyright (c) 2025 Zhao Zhili <quinkblack@foxmail.com>\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HWCONTEXT_OH_H\n#define AVUTIL_HWCONTEXT_OH_H\n\n/**\n * OpenHarmony codec device\n */\ntypedef struct AVOHCodecDeviceContext {\n    /**\n     * Pointer to OHNativeWindow\n     */\n    void *native_window;\n} AVOHCodecDeviceContext;\n\n#endif /* AVUTIL_HWCONTEXT_OH_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_opencl.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HWCONTEXT_OPENCL_H\n#define AVUTIL_HWCONTEXT_OPENCL_H\n\n#ifdef __APPLE__\n#include <OpenCL/cl.h>\n#else\n#include <CL/cl.h>\n#endif\n\n#include \"frame.h\"\n\n/**\n * @file\n * API-specific header for AV_HWDEVICE_TYPE_OPENCL.\n *\n * Pools allocated internally are always dynamic, and are primarily intended\n * to be used in OpenCL-only cases.  If interoperation is required, it is\n * typically required to allocate frames in the other API and then map the\n * frames context to OpenCL with av_hwframe_ctx_create_derived().\n */\n\n/**\n * OpenCL frame descriptor for pool allocation.\n *\n * In user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs\n * with the data pointer pointing at an object of this type describing the\n * planes of the frame.\n */\ntypedef struct AVOpenCLFrameDescriptor {\n    /**\n     * Number of planes in the frame.\n     */\n    int nb_planes;\n    /**\n     * OpenCL image2d objects for each plane of the frame.\n     */\n    cl_mem planes[AV_NUM_DATA_POINTERS];\n} AVOpenCLFrameDescriptor;\n\n/**\n * OpenCL device details.\n *\n * Allocated as AVHWDeviceContext.hwctx\n */\ntypedef struct AVOpenCLDeviceContext {\n    /**\n     * The primary device ID of the device.  If multiple OpenCL devices\n     * are associated with the context then this is the one which will\n     * be used for all operations internal to FFmpeg.\n     */\n    cl_device_id device_id;\n    /**\n     * The OpenCL context which will contain all operations and frames on\n     * this device.\n     */\n    cl_context context;\n    /**\n     * The default command queue for this device, which will be used by all\n     * frames contexts which do not have their own command queue.  If not\n     * initialised by the user, a default queue will be created on the\n     * primary device.\n     */\n    cl_command_queue command_queue;\n} AVOpenCLDeviceContext;\n\n/**\n * OpenCL-specific data associated with a frame pool.\n *\n * Allocated as AVHWFramesContext.hwctx.\n */\ntypedef struct AVOpenCLFramesContext {\n    /**\n     * The command queue used for internal asynchronous operations on this\n     * device (av_hwframe_transfer_data(), av_hwframe_map()).\n     *\n     * If this is not set, the command queue from the associated device is\n     * used instead.\n     */\n    cl_command_queue command_queue;\n} AVOpenCLFramesContext;\n\n#endif /* AVUTIL_HWCONTEXT_OPENCL_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_qsv.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HWCONTEXT_QSV_H\n#define AVUTIL_HWCONTEXT_QSV_H\n\n#include <mfxvideo.h>\n\n/**\n * @file\n * An API-specific header for AV_HWDEVICE_TYPE_QSV.\n *\n * AVHWFramesContext.pool must contain AVBufferRefs whose data pointer points\n * to a mfxFrameSurface1 struct.\n */\n\n/**\n * This struct is allocated as AVHWDeviceContext.hwctx\n */\ntypedef struct AVQSVDeviceContext {\n    mfxSession session;\n    /**\n     * The mfxLoader handle used for mfxSession creation\n     *\n     * This field is only available for oneVPL user. For non-oneVPL user, this\n     * field must be set to NULL.\n     *\n     * Filled by the user before calling av_hwdevice_ctx_init() and should be\n     * cast to mfxLoader handle. Deallocating the AVHWDeviceContext will always\n     * release this interface.\n     */\n    void *loader;\n} AVQSVDeviceContext;\n\n/**\n * This struct is allocated as AVHWFramesContext.hwctx\n */\ntypedef struct AVQSVFramesContext {\n    /**\n     * A pointer to a mfxFrameSurface1 struct\n     *\n     * It is available when nb_surfaces is non-zero.\n     */\n    mfxFrameSurface1 *surfaces;\n\n    /**\n     * Number of frames in the pool\n     *\n     * It is 0 for dynamic frame pools or AVHWFramesContext.initial_pool_size\n     * for fixed frame pools.\n     *\n     * Note only oneVPL GPU runtime 2.9+ can support dynamic frame pools\n     * on d3d11va or vaapi\n     */\n    int            nb_surfaces;\n\n    /**\n     * A combination of MFX_MEMTYPE_* describing the frame pool.\n     */\n    int frame_type;\n\n    /**\n     * A pointer to a mfxFrameInfo struct\n     *\n     * It is available when nb_surfaces is 0, all buffers allocated from the\n     * pool have the same mfxFrameInfo.\n     */\n    mfxFrameInfo *info;\n} AVQSVFramesContext;\n\n#endif /* AVUTIL_HWCONTEXT_QSV_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_vaapi.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HWCONTEXT_VAAPI_H\n#define AVUTIL_HWCONTEXT_VAAPI_H\n\n#include <va/va.h>\n\n/**\n * @file\n * API-specific header for AV_HWDEVICE_TYPE_VAAPI.\n *\n * Dynamic frame pools are supported, but note that any pool used as a render\n * target is required to be of fixed size in order to be be usable as an\n * argument to vaCreateContext().\n *\n * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs\n * with the data pointer set to a VASurfaceID.\n */\n\nenum {\n    /**\n     * The quirks field has been set by the user and should not be detected\n     * automatically by av_hwdevice_ctx_init().\n     */\n    AV_VAAPI_DRIVER_QUIRK_USER_SET = (1 << 0),\n    /**\n     * The driver does not destroy parameter buffers when they are used by\n     * vaRenderPicture().  Additional code will be required to destroy them\n     * separately afterwards.\n     */\n    AV_VAAPI_DRIVER_QUIRK_RENDER_PARAM_BUFFERS = (1 << 1),\n\n    /**\n     * The driver does not support the VASurfaceAttribMemoryType attribute,\n     * so the surface allocation code will not try to use it.\n     */\n    AV_VAAPI_DRIVER_QUIRK_ATTRIB_MEMTYPE = (1 << 2),\n\n    /**\n     * The driver does not support surface attributes at all.\n     * The surface allocation code will never pass them to surface allocation,\n     * and the results of the vaQuerySurfaceAttributes() call will be faked.\n     */\n    AV_VAAPI_DRIVER_QUIRK_SURFACE_ATTRIBUTES = (1 << 3),\n};\n\n/**\n * VAAPI connection details.\n *\n * Allocated as AVHWDeviceContext.hwctx\n */\ntypedef struct AVVAAPIDeviceContext {\n    /**\n     * The VADisplay handle, to be filled by the user.\n     */\n    VADisplay display;\n    /**\n     * Driver quirks to apply - this is filled by av_hwdevice_ctx_init(),\n     * with reference to a table of known drivers, unless the\n     * AV_VAAPI_DRIVER_QUIRK_USER_SET bit is already present.  The user\n     * may need to refer to this field when performing any later\n     * operations using VAAPI with the same VADisplay.\n     */\n    unsigned int driver_quirks;\n} AVVAAPIDeviceContext;\n\n/**\n * VAAPI-specific data associated with a frame pool.\n *\n * Allocated as AVHWFramesContext.hwctx.\n */\ntypedef struct AVVAAPIFramesContext {\n    /**\n     * Set by the user to apply surface attributes to all surfaces in\n     * the frame pool.  If null, default settings are used.\n     */\n    VASurfaceAttrib *attributes;\n    int           nb_attributes;\n    /**\n     * The surfaces IDs of all surfaces in the pool after creation.\n     * Only valid if AVHWFramesContext.initial_pool_size was positive.\n     * These are intended to be used as the render_targets arguments to\n     * vaCreateContext().\n     */\n    VASurfaceID     *surface_ids;\n    int           nb_surfaces;\n} AVVAAPIFramesContext;\n\n/**\n * VAAPI hardware pipeline configuration details.\n *\n * Allocated with av_hwdevice_hwconfig_alloc().\n */\ntypedef struct AVVAAPIHWConfig {\n    /**\n     * ID of a VAAPI pipeline configuration.\n     */\n    VAConfigID config_id;\n} AVVAAPIHWConfig;\n\n#endif /* AVUTIL_HWCONTEXT_VAAPI_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_vdpau.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HWCONTEXT_VDPAU_H\n#define AVUTIL_HWCONTEXT_VDPAU_H\n\n#include <vdpau/vdpau.h>\n\n/**\n * @file\n * An API-specific header for AV_HWDEVICE_TYPE_VDPAU.\n *\n * This API supports dynamic frame pools. AVHWFramesContext.pool must return\n * AVBufferRefs whose data pointer is a VdpVideoSurface.\n */\n\n/**\n * This struct is allocated as AVHWDeviceContext.hwctx\n */\ntypedef struct AVVDPAUDeviceContext {\n    VdpDevice          device;\n    VdpGetProcAddress *get_proc_address;\n} AVVDPAUDeviceContext;\n\n/**\n * AVHWFramesContext.hwctx is currently not used\n */\n\n#endif /* AVUTIL_HWCONTEXT_VDPAU_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_videotoolbox.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H\n#define AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H\n\n#include <stdint.h>\n\n#include <VideoToolbox/VideoToolbox.h>\n\n#include \"frame.h\"\n#include \"pixfmt.h\"\n\n/**\n * @file\n * An API-specific header for AV_HWDEVICE_TYPE_VIDEOTOOLBOX.\n *\n * This API supports frame allocation using a native CVPixelBufferPool\n * instead of an AVBufferPool.\n *\n * If the API user sets a custom pool, AVHWFramesContext.pool must return\n * AVBufferRefs whose data pointer is a CVImageBufferRef or CVPixelBufferRef.\n * Note that the underlying CVPixelBuffer could be retained by OS frameworks\n * depending on application usage, so it is preferable to let CoreVideo manage\n * the pool using the default implementation.\n *\n * Currently AVHWDeviceContext.hwctx are always NULL.\n */\n\ntypedef struct AVVTFramesContext {\n    enum AVColorRange color_range;\n} AVVTFramesContext;\n\n/**\n * Convert a VideoToolbox (actually CoreVideo) format to AVPixelFormat.\n * Returns AV_PIX_FMT_NONE if no known equivalent was found.\n */\nenum AVPixelFormat av_map_videotoolbox_format_to_pixfmt(uint32_t cv_fmt);\n\n/**\n * Convert an AVPixelFormat to a VideoToolbox (actually CoreVideo) format.\n * Returns 0 if no known equivalent was found.\n */\nuint32_t av_map_videotoolbox_format_from_pixfmt(enum AVPixelFormat pix_fmt);\n\n/**\n * Same as av_map_videotoolbox_format_from_pixfmt function, but can map and\n * return full range pixel formats via a flag.\n */\nuint32_t av_map_videotoolbox_format_from_pixfmt2(enum AVPixelFormat pix_fmt, bool full_range);\n\n/**\n * Convert an AVChromaLocation to a VideoToolbox/CoreVideo chroma location string.\n * Returns 0 if no known equivalent was found.\n */\nCFStringRef av_map_videotoolbox_chroma_loc_from_av(enum AVChromaLocation loc);\n\n/**\n * Convert an AVColorSpace to a VideoToolbox/CoreVideo color matrix string.\n * Returns 0 if no known equivalent was found.\n */\nCFStringRef av_map_videotoolbox_color_matrix_from_av(enum AVColorSpace space);\n\n/**\n * Convert an AVColorPrimaries to a VideoToolbox/CoreVideo color primaries string.\n * Returns 0 if no known equivalent was found.\n */\nCFStringRef av_map_videotoolbox_color_primaries_from_av(enum AVColorPrimaries pri);\n\n/**\n * Convert an AVColorTransferCharacteristic to a VideoToolbox/CoreVideo color transfer\n * function string.\n * Returns 0 if no known equivalent was found.\n */\nCFStringRef av_map_videotoolbox_color_trc_from_av(enum AVColorTransferCharacteristic trc);\n\n/**\n * Set CVPixelBufferRef's metadata based on an AVFrame.\n *\n * Sets/unsets the CVPixelBuffer attachments to match as closely as possible the\n * AVFrame metadata. To prevent inconsistent attachments, the attachments for properties\n * that could not be matched or are unspecified in the given AVFrame are unset. So if\n * any attachments already covered by AVFrame metadata need to be set to a specific\n * value, this should happen after calling this function.\n *\n * Returns < 0 in case of an error.\n */\nint av_vt_pixbuf_set_attachments(void *log_ctx,\n                                 CVPixelBufferRef pixbuf, const struct AVFrame *src);\n\n#endif /* AVUTIL_HWCONTEXT_VIDEOTOOLBOX_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/hwcontext_vulkan.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_HWCONTEXT_VULKAN_H\n#define AVUTIL_HWCONTEXT_VULKAN_H\n\n#if defined(_WIN32) && !defined(VK_USE_PLATFORM_WIN32_KHR)\n#define VK_USE_PLATFORM_WIN32_KHR\n#endif\n#include <vulkan/vulkan.h>\n\n#include \"pixfmt.h\"\n#include \"frame.h\"\n#include \"hwcontext.h\"\n\ntypedef struct AVVkFrame AVVkFrame;\n\ntypedef struct AVVulkanDeviceQueueFamily {\n    /* Queue family index */\n    int idx;\n    /* Number of queues in the queue family in use */\n    int num;\n    /* Queue family capabilities. Must be non-zero.\n     * Flags may be removed to indicate the queue family may not be used\n     * for a given purpose. */\n    VkQueueFlagBits flags;\n    /* Vulkan implementations are allowed to list multiple video queues\n     * which differ in what they can encode or decode. */\n    VkVideoCodecOperationFlagBitsKHR video_caps;\n} AVVulkanDeviceQueueFamily;\n\n/**\n * @file\n * API-specific header for AV_HWDEVICE_TYPE_VULKAN.\n *\n * For user-allocated pools, AVHWFramesContext.pool must return AVBufferRefs\n * with the data pointer set to an AVVkFrame.\n */\n\n/**\n * Main Vulkan context, allocated as AVHWDeviceContext.hwctx.\n * All of these can be set before init to change what the context uses\n */\ntypedef struct AVVulkanDeviceContext {\n    /**\n     * Custom memory allocator, else NULL\n     */\n    const VkAllocationCallbacks *alloc;\n\n    /**\n     * Pointer to a vkGetInstanceProcAddr loading function.\n     * If unset, will dynamically load and use libvulkan.\n     */\n    PFN_vkGetInstanceProcAddr get_proc_addr;\n\n    /**\n     * Vulkan instance. Must be at least version 1.3.\n     */\n    VkInstance inst;\n\n    /**\n     * Physical device\n     */\n    VkPhysicalDevice phys_dev;\n\n    /**\n     * Active device\n     */\n    VkDevice act_dev;\n\n    /**\n     * This structure should be set to the set of features that present and enabled\n     * during device creation. When a device is created by FFmpeg, it will default to\n     * enabling all that are present of the shaderImageGatherExtended,\n     * fragmentStoresAndAtomics, shaderInt64 and vertexPipelineStoresAndAtomics features.\n     */\n    VkPhysicalDeviceFeatures2 device_features;\n\n    /**\n     * Enabled instance extensions.\n     * If supplying your own device context, set this to an array of strings, with\n     * each entry containing the specified Vulkan extension string to enable.\n     * Duplicates are possible and accepted.\n     * If no extensions are enabled, set these fields to NULL, and 0 respectively.\n     */\n    const char * const *enabled_inst_extensions;\n    int nb_enabled_inst_extensions;\n\n    /**\n     * Enabled device extensions. By default, VK_KHR_external_memory_fd,\n     * VK_EXT_external_memory_dma_buf, VK_EXT_image_drm_format_modifier,\n     * VK_KHR_external_semaphore_fd and VK_EXT_external_memory_host are enabled if found.\n     * If supplying your own device context, these fields takes the same format as\n     * the above fields, with the same conditions that duplicates are possible\n     * and accepted, and that NULL and 0 respectively means no extensions are enabled.\n     */\n    const char * const *enabled_dev_extensions;\n    int nb_enabled_dev_extensions;\n\n#if FF_API_VULKAN_FIXED_QUEUES\n    /**\n     * Queue family index for graphics operations, and the number of queues\n     * enabled for it. If unavailable, will be set to -1. Not required.\n     * av_hwdevice_create() will attempt to find a dedicated queue for each\n     * queue family, or pick the one with the least unrelated flags set.\n     * Queue indices here may overlap if a queue has to share capabilities.\n     */\n    attribute_deprecated\n    int queue_family_index;\n    attribute_deprecated\n    int nb_graphics_queues;\n\n    /**\n     * Queue family index for transfer operations and the number of queues\n     * enabled. Required.\n     */\n    attribute_deprecated\n    int queue_family_tx_index;\n    attribute_deprecated\n    int nb_tx_queues;\n\n    /**\n     * Queue family index for compute operations and the number of queues\n     * enabled. Required.\n     */\n    attribute_deprecated\n    int queue_family_comp_index;\n    attribute_deprecated\n    int nb_comp_queues;\n\n    /**\n     * Queue family index for video encode ops, and the amount of queues enabled.\n     * If the device doesn't support such, queue_family_encode_index will be -1.\n     * Not required.\n     */\n    attribute_deprecated\n    int queue_family_encode_index;\n    attribute_deprecated\n    int nb_encode_queues;\n\n    /**\n     * Queue family index for video decode ops, and the amount of queues enabled.\n     * If the device doesn't support such, queue_family_decode_index will be -1.\n     * Not required.\n     */\n    attribute_deprecated\n    int queue_family_decode_index;\n    attribute_deprecated\n    int nb_decode_queues;\n#endif\n\n    /**\n     * Locks a queue, preventing other threads from submitting any command\n     * buffers to this queue.\n     * If set to NULL, will be set to lavu-internal functions that utilize a\n     * mutex.\n     */\n    void (*lock_queue)(struct AVHWDeviceContext *ctx, uint32_t queue_family, uint32_t index);\n\n    /**\n     * Similar to lock_queue(), unlocks a queue. Must only be called after locking.\n     */\n    void (*unlock_queue)(struct AVHWDeviceContext *ctx, uint32_t queue_family, uint32_t index);\n\n    /**\n     * Queue families used. Must be preferentially ordered. List may contain\n     * duplicates.\n     *\n     * For compatibility reasons, all the enabled queue families listed above\n     * (queue_family_(tx/comp/encode/decode)_index) must also be included in\n     * this list until they're removed after deprecation.\n     */\n    AVVulkanDeviceQueueFamily qf[64];\n    int nb_qf;\n} AVVulkanDeviceContext;\n\n/**\n * Defines the behaviour of frame allocation.\n */\ntypedef enum AVVkFrameFlags {\n    /* Unless this flag is set, autodetected flags will be OR'd based on the\n     * device and tiling during av_hwframe_ctx_init(). */\n    AV_VK_FRAME_FLAG_NONE              = (1ULL << 0),\n\n    /* Disables multiplane images.\n     * This is required to export/import images from CUDA. */\n    AV_VK_FRAME_FLAG_DISABLE_MULTIPLANE = (1ULL << 2),\n} AVVkFrameFlags;\n\n/**\n * Allocated as AVHWFramesContext.hwctx, used to set pool-specific options\n */\ntypedef struct AVVulkanFramesContext {\n    /**\n     * Controls the tiling of allocated frames.\n     * If left as VK_IMAGE_TILING_OPTIMAL (0), will use optimal tiling.\n     * Can be set to VK_IMAGE_TILING_LINEAR to force linear images,\n     * or VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT to force DMABUF-backed\n     * images.\n     * @note Imported frames from other APIs ignore this.\n     */\n    VkImageTiling tiling;\n\n    /**\n     * Defines extra usage of output frames. If non-zero, all flags MUST be\n     * supported by the VkFormat. Otherwise, will use supported flags amongst:\n     * - VK_IMAGE_USAGE_SAMPLED_BIT\n     * - VK_IMAGE_USAGE_STORAGE_BIT\n     * - VK_IMAGE_USAGE_TRANSFER_SRC_BIT\n     * - VK_IMAGE_USAGE_TRANSFER_DST_BIT\n     */\n    VkImageUsageFlagBits usage;\n\n    /**\n     * Extension data for image creation.\n     * If DRM tiling is used, a VkImageDrmFormatModifierListCreateInfoEXT structure\n     * can be added to specify the exact modifier to use.\n     *\n     * Additional structures may be added at av_hwframe_ctx_init() time,\n     * which will be freed automatically on uninit(), so users must only free\n     * any structures they've allocated themselves.\n     */\n    void *create_pnext;\n\n    /**\n     * Extension data for memory allocation. Must have as many entries as\n     * the number of planes of the sw_format.\n     * This will be chained to VkExportMemoryAllocateInfo, which is used\n     * to make all pool images exportable to other APIs if the necessary\n     * extensions are present in enabled_dev_extensions.\n     */\n    void *alloc_pnext[AV_NUM_DATA_POINTERS];\n\n    /**\n     * A combination of AVVkFrameFlags. Unless AV_VK_FRAME_FLAG_NONE is set,\n     * autodetected flags will be OR'd based on the device and tiling during\n     * av_hwframe_ctx_init().\n     */\n    AVVkFrameFlags flags;\n\n    /**\n     * Flags to set during image creation. If unset, defaults to\n     * VK_IMAGE_CREATE_ALIAS_BIT.\n     */\n    VkImageCreateFlags img_flags;\n\n    /**\n     * Vulkan format for each image. MUST be compatible with the pixel format.\n     * If unset, will be automatically set.\n     * There are at most two compatible formats for a frame - a multiplane\n     * format, and a single-plane multi-image format.\n     */\n    VkFormat format[AV_NUM_DATA_POINTERS];\n\n    /**\n     * Number of layers each image will have.\n     */\n    int nb_layers;\n\n    /**\n     * Locks a frame, preventing other threads from changing frame properties.\n     * Users SHOULD only ever lock just before command submission in order\n     * to get accurate frame properties, and unlock immediately after command\n     * submission without waiting for it to finish.\n     *\n     * If unset, will be set to lavu-internal functions that utilize a mutex.\n     */\n    void (*lock_frame)(struct AVHWFramesContext *fc, AVVkFrame *vkf);\n\n    /**\n     * Similar to lock_frame(), unlocks a frame. Must only be called after locking.\n     */\n    void (*unlock_frame)(struct AVHWFramesContext *fc, AVVkFrame *vkf);\n} AVVulkanFramesContext;\n\n/*\n * Frame structure.\n *\n * @note the size of this structure is not part of the ABI, to allocate\n * you must use @av_vk_frame_alloc().\n */\nstruct AVVkFrame {\n    /**\n     * Vulkan images to which the memory is bound to.\n     * May be one for multiplane formats, or multiple.\n     */\n    VkImage img[AV_NUM_DATA_POINTERS];\n\n    /**\n     * Tiling for the frame.\n     */\n    VkImageTiling tiling;\n\n    /**\n     * Memory backing the images. Either one, or as many as there are planes\n     * in the sw_format.\n     * In case of having multiple VkImages, but one memory, the offset field\n     * will indicate the bound offset for each image.\n     */\n    VkDeviceMemory mem[AV_NUM_DATA_POINTERS];\n    size_t size[AV_NUM_DATA_POINTERS];\n\n    /**\n     * OR'd flags for all memory allocated\n     */\n    VkMemoryPropertyFlagBits flags;\n\n    /**\n     * Updated after every barrier. One per VkImage.\n     */\n    VkAccessFlagBits access[AV_NUM_DATA_POINTERS];\n    VkImageLayout layout[AV_NUM_DATA_POINTERS];\n\n    /**\n     * Synchronization timeline semaphores, one for each VkImage.\n     * Must not be freed manually. Must be waited on at every submission using\n     * the value in sem_value, and must be signalled at every submission,\n     * using an incremented value.\n     */\n    VkSemaphore sem[AV_NUM_DATA_POINTERS];\n\n    /**\n     * Up to date semaphore value at which each image becomes accessible.\n     * One per VkImage.\n     * Clients must wait on this value when submitting a command queue,\n     * and increment it when signalling.\n     */\n    uint64_t sem_value[AV_NUM_DATA_POINTERS];\n\n    /**\n     * Internal data.\n     */\n    struct AVVkFrameInternal *internal;\n\n    /**\n     * Describes the binding offset of each image to the VkDeviceMemory.\n     * One per VkImage.\n     */\n    ptrdiff_t offset[AV_NUM_DATA_POINTERS];\n\n    /**\n     * Queue family of the images. Must be VK_QUEUE_FAMILY_IGNORED if\n     * the image was allocated with the CONCURRENT concurrency option.\n     * One per VkImage.\n     */\n    uint32_t queue_family[AV_NUM_DATA_POINTERS];\n};\n\n/**\n * Allocates a single AVVkFrame and initializes everything as 0.\n * @note Must be freed via av_free()\n */\nAVVkFrame *av_vk_frame_alloc(void);\n\n/**\n * Returns the optimal per-plane Vulkan format for a given sw_format,\n * one for each plane.\n * Returns NULL on unsupported formats.\n */\nconst VkFormat *av_vkfmt_from_pixfmt(enum AVPixelFormat p);\n\n#endif /* AVUTIL_HWCONTEXT_VULKAN_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/iamf.h",
    "content": "/*\n * Immersive Audio Model and Formats helper functions and defines\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_IAMF_H\n#define AVUTIL_IAMF_H\n\n/**\n * @file\n * Immersive Audio Model and Formats API header\n * @see <a href=\"https://aomediacodec.github.io/iamf/\">Immersive Audio Model and Formats</a>\n */\n\n#include <stdint.h>\n#include <stddef.h>\n\n#include \"attributes.h\"\n#include \"avassert.h\"\n#include \"channel_layout.h\"\n#include \"dict.h\"\n#include \"rational.h\"\n\n/**\n * @defgroup lavu_iamf Immersive Audio Model and Formats\n * @ingroup lavu_audio\n *\n * Immersive Audio Model and Formats related functions and defines\n *\n * @defgroup lavu_iamf_params Parameter Definition\n * @ingroup lavu_iamf\n * @{\n * Parameters as defined in section 3.6.1 and 3.8 of IAMF.\n * @}\n *\n * @defgroup lavu_iamf_audio Audio Element\n * @ingroup lavu_iamf\n * @{\n * Audio Elements as defined in section 3.6 of IAMF.\n * @}\n *\n * @defgroup lavu_iamf_mix Mix Presentation\n * @ingroup lavu_iamf\n * @{\n * Mix Presentations as defined in section 3.7 of IAMF.\n * @}\n *\n * @addtogroup lavu_iamf_params\n * @{\n */\nenum AVIAMFAnimationType {\n    AV_IAMF_ANIMATION_TYPE_STEP,\n    AV_IAMF_ANIMATION_TYPE_LINEAR,\n    AV_IAMF_ANIMATION_TYPE_BEZIER,\n};\n\n/**\n * Mix Gain Parameter Data as defined in section 3.8.1 of IAMF.\n *\n * @note This struct's size is not a part of the public ABI.\n */\ntypedef struct AVIAMFMixGain {\n    const AVClass *av_class;\n\n    /**\n     * Duration for the given subblock, in units of\n     * 1 / @ref AVIAMFParamDefinition.parameter_rate \"parameter_rate\".\n     * It must not be 0.\n     */\n    unsigned int subblock_duration;\n    /**\n     * The type of animation applied to the parameter values.\n     */\n    enum AVIAMFAnimationType animation_type;\n    /**\n     * Parameter value that is applied at the start of the subblock.\n     * Applies to all defined Animation Types.\n     *\n     * Valid range of values is -128.0 to 128.0\n     */\n    AVRational start_point_value;\n    /**\n     * Parameter value that is applied at the end of the subblock.\n     * Applies only to AV_IAMF_ANIMATION_TYPE_LINEAR and\n     * AV_IAMF_ANIMATION_TYPE_BEZIER Animation Types.\n     *\n     * Valid range of values is -128.0 to 128.0\n     */\n    AVRational end_point_value;\n    /**\n     * Parameter value of the middle control point of a quadratic Bezier\n     * curve, i.e., its y-axis value.\n     * Applies only to AV_IAMF_ANIMATION_TYPE_BEZIER Animation Type.\n     *\n     * Valid range of values is -128.0 to 128.0\n     */\n    AVRational control_point_value;\n    /**\n     * Parameter value of the time of the middle control point of a\n     * quadratic Bezier curve, i.e., its x-axis value.\n     * Applies only to AV_IAMF_ANIMATION_TYPE_BEZIER Animation Type.\n     *\n     * Valid range of values is 0.0 to 1.0\n     */\n    AVRational control_point_relative_time;\n} AVIAMFMixGain;\n\n/**\n * Demixing Info Parameter Data as defined in section 3.8.2 of IAMF.\n *\n * @note This struct's size is not a part of the public ABI.\n */\ntypedef struct AVIAMFDemixingInfo {\n    const AVClass *av_class;\n\n    /**\n     * Duration for the given subblock, in units of\n     * 1 / @ref AVIAMFParamDefinition.parameter_rate \"parameter_rate\".\n     * It must not be 0.\n     */\n    unsigned int subblock_duration;\n    /**\n     * Pre-defined combination of demixing parameters.\n     */\n    unsigned int dmixp_mode;\n} AVIAMFDemixingInfo;\n\n/**\n * Recon Gain Info Parameter Data as defined in section 3.8.3 of IAMF.\n *\n * @note This struct's size is not a part of the public ABI.\n */\ntypedef struct AVIAMFReconGain {\n    const AVClass *av_class;\n\n    /**\n     * Duration for the given subblock, in units of\n     * 1 / @ref AVIAMFParamDefinition.parameter_rate \"parameter_rate\".\n     * It must not be 0.\n     */\n    unsigned int subblock_duration;\n\n    /**\n     * Array of gain values to be applied to each channel for each layer\n     * defined in the Audio Element referencing the parent Parameter Definition.\n     * Values for layers where the AV_IAMF_LAYER_FLAG_RECON_GAIN flag is not set\n     * are undefined.\n     *\n     * Channel order is: FL, C, FR, SL, SR, TFL, TFR, BL, BR, TBL, TBR, LFE\n     */\n    uint8_t recon_gain[6][12];\n} AVIAMFReconGain;\n\nenum AVIAMFParamDefinitionType {\n   /**\n    * Subblocks are of struct type AVIAMFMixGain\n    */\n    AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN,\n   /**\n    * Subblocks are of struct type AVIAMFDemixingInfo\n    */\n    AV_IAMF_PARAMETER_DEFINITION_DEMIXING,\n   /**\n    * Subblocks are of struct type AVIAMFReconGain\n    */\n    AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN,\n};\n\n/**\n * Parameters as defined in section 3.6.1 of IAMF.\n *\n * The struct is allocated by av_iamf_param_definition_alloc() along with an\n * array of subblocks, its type depending on the value of type.\n * This array is placed subblocks_offset bytes after the start of this struct.\n *\n * @note This struct's size is not a part of the public ABI.\n */\ntypedef struct AVIAMFParamDefinition {\n    const AVClass *av_class;\n\n    /**\n     * Offset in bytes from the start of this struct, at which the subblocks\n     * array is located.\n     */\n    size_t subblocks_offset;\n    /**\n     * Size in bytes of each element in the subblocks array.\n     */\n    size_t subblock_size;\n    /**\n     * Number of subblocks in the array.\n     */\n    unsigned int nb_subblocks;\n\n    /**\n     * Parameters type. Determines the type of the subblock elements.\n     */\n    enum AVIAMFParamDefinitionType type;\n\n    /**\n     * Identifier for the parameter substream.\n     */\n    unsigned int parameter_id;\n    /**\n     * Sample rate for the parameter substream. It must not be 0.\n     */\n    unsigned int parameter_rate;\n\n    /**\n     * The accumulated duration of all blocks in this parameter definition,\n     * in units of 1 / @ref parameter_rate.\n     *\n     * May be 0, in which case all duration values should be specified in\n     * another parameter definition referencing the same parameter_id.\n     */\n    unsigned int duration;\n    /**\n     * The duration of every subblock in the case where all subblocks, with\n     * the optional exception of the last subblock, have equal durations.\n     *\n     * Must be 0 if subblocks have different durations.\n     */\n    unsigned int constant_subblock_duration;\n} AVIAMFParamDefinition;\n\nconst AVClass *av_iamf_param_definition_get_class(void);\n\n/**\n * Allocates memory for AVIAMFParamDefinition, plus an array of {@code nb_subblocks}\n * amount of subblocks of the given type and initializes the variables. Can be\n * freed with a normal av_free() call.\n *\n * @param size if non-NULL, the size in bytes of the resulting data array is written here.\n */\nAVIAMFParamDefinition *av_iamf_param_definition_alloc(enum AVIAMFParamDefinitionType type,\n                                                      unsigned int nb_subblocks, size_t *size);\n\n/**\n * Get the subblock at the specified {@code idx}. Must be between 0 and nb_subblocks - 1.\n *\n * The @ref AVIAMFParamDefinition.type \"param definition type\" defines\n * the struct type of the returned pointer.\n */\nstatic av_always_inline void*\nav_iamf_param_definition_get_subblock(const AVIAMFParamDefinition *par, unsigned int idx)\n{\n    av_assert0(idx < par->nb_subblocks);\n    return (void *)((uint8_t *)par + par->subblocks_offset + idx * par->subblock_size);\n}\n\n/**\n * @}\n * @addtogroup lavu_iamf_audio\n * @{\n */\n\nenum AVIAMFAmbisonicsMode {\n    AV_IAMF_AMBISONICS_MODE_MONO,\n    AV_IAMF_AMBISONICS_MODE_PROJECTION,\n};\n\n/**\n * Recon gain information for the layer is present in AVIAMFReconGain\n */\n#define AV_IAMF_LAYER_FLAG_RECON_GAIN (1 << 0)\n\n/**\n * A layer defining a Channel Layout in the Audio Element.\n *\n * When @ref AVIAMFAudioElement.audio_element_type \"the parent's Audio Element type\"\n * is AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL, this corresponds to an Scalable Channel\n * Layout layer as defined in section 3.6.2 of IAMF.\n * For AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE, it is an Ambisonics channel\n * layout as defined in section 3.6.3 of IAMF.\n *\n * @note The struct should be allocated with av_iamf_audio_element_add_layer()\n *       and its size is not a part of the public ABI.\n */\ntypedef struct AVIAMFLayer {\n    const AVClass *av_class;\n\n    AVChannelLayout ch_layout;\n\n    /**\n     * A bitmask which may contain a combination of AV_IAMF_LAYER_FLAG_* flags.\n     */\n    unsigned int flags;\n    /**\n     * Output gain channel flags as defined in section 3.6.2 of IAMF.\n     *\n     * This field is defined only if @ref AVIAMFAudioElement.audio_element_type\n     * \"the parent's Audio Element type\" is AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL,\n     * must be 0 otherwise.\n     */\n    unsigned int output_gain_flags;\n    /**\n     * Output gain as defined in section 3.6.2 of IAMF.\n     *\n     * Must be 0 if @ref output_gain_flags is 0.\n     */\n    AVRational output_gain;\n    /**\n     * Ambisonics mode as defined in section 3.6.3 of IAMF.\n     *\n     * This field is defined only if @ref AVIAMFAudioElement.audio_element_type\n     * \"the parent's Audio Element type\" is AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE.\n     *\n     * If AV_IAMF_AMBISONICS_MODE_MONO, channel_mapping is defined implicitly\n     * (Ambisonic Order) or explicitly (Custom Order with ambi channels) in\n     * @ref ch_layout.\n     * If AV_IAMF_AMBISONICS_MODE_PROJECTION, @ref demixing_matrix must be set.\n     */\n    enum AVIAMFAmbisonicsMode ambisonics_mode;\n\n    /**\n     * Demixing matrix as defined in section 3.6.3 of IAMF.\n     *\n     * The length of the array is ch_layout.nb_channels multiplied by the sum of\n     * the amount of streams in the group plus the amount of streams in the group\n     * that are stereo.\n     *\n     * May be set only if @ref ambisonics_mode == AV_IAMF_AMBISONICS_MODE_PROJECTION,\n     * must be NULL otherwise.\n     */\n    AVRational *demixing_matrix;\n} AVIAMFLayer;\n\n\nenum AVIAMFAudioElementType {\n    AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL,\n    AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE,\n};\n\n/**\n * Information on how to combine one or more audio streams, as defined in\n * section 3.6 of IAMF.\n *\n * @note The struct should be allocated with av_iamf_audio_element_alloc()\n *       and its size is not a part of the public ABI.\n */\ntypedef struct AVIAMFAudioElement {\n    const AVClass *av_class;\n\n    AVIAMFLayer **layers;\n    /**\n     * Number of layers, or channel groups, in the Audio Element.\n     * There may be 6 layers at most, and for @ref audio_element_type\n     * AV_IAMF_AUDIO_ELEMENT_TYPE_SCENE, there may be exactly 1.\n     *\n     * Set by av_iamf_audio_element_add_layer(), must not be\n     * modified by any other code.\n     */\n    unsigned int nb_layers;\n\n    /**\n     * Demixing information used to reconstruct a scalable channel audio\n     * representation.\n     * The @ref AVIAMFParamDefinition.type \"type\" must be\n     * AV_IAMF_PARAMETER_DEFINITION_DEMIXING.\n     */\n    AVIAMFParamDefinition *demixing_info;\n    /**\n     * Recon gain information used to reconstruct a scalable channel audio\n     * representation.\n     * The @ref AVIAMFParamDefinition.type \"type\" must be\n     * AV_IAMF_PARAMETER_DEFINITION_RECON_GAIN.\n     */\n    AVIAMFParamDefinition *recon_gain_info;\n\n    /**\n     * Audio element type as defined in section 3.6 of IAMF.\n     */\n    enum AVIAMFAudioElementType audio_element_type;\n\n    /**\n     * Default weight value as defined in section 3.6 of IAMF.\n     */\n    unsigned int default_w;\n} AVIAMFAudioElement;\n\nconst AVClass *av_iamf_audio_element_get_class(void);\n\n/**\n * Allocates a AVIAMFAudioElement, and initializes its fields with default values.\n * No layers are allocated. Must be freed with av_iamf_audio_element_free().\n *\n * @see av_iamf_audio_element_add_layer()\n */\nAVIAMFAudioElement *av_iamf_audio_element_alloc(void);\n\n/**\n * Allocate a layer and add it to a given AVIAMFAudioElement.\n * It is freed by av_iamf_audio_element_free() alongside the rest of the parent\n * AVIAMFAudioElement.\n *\n * @return a pointer to the allocated layer.\n */\nAVIAMFLayer *av_iamf_audio_element_add_layer(AVIAMFAudioElement *audio_element);\n\n/**\n * Free an AVIAMFAudioElement and all its contents.\n *\n * @param audio_element pointer to pointer to an allocated AVIAMFAudioElement.\n *                      upon return, *audio_element will be set to NULL.\n */\nvoid av_iamf_audio_element_free(AVIAMFAudioElement **audio_element);\n\n/**\n * @}\n * @addtogroup lavu_iamf_mix\n * @{\n */\n\nenum AVIAMFHeadphonesMode {\n    /**\n     * The referenced Audio Element shall be rendered to stereo loudspeakers.\n     */\n    AV_IAMF_HEADPHONES_MODE_STEREO,\n    /**\n     * The referenced Audio Element shall be rendered with a binaural renderer.\n     */\n    AV_IAMF_HEADPHONES_MODE_BINAURAL,\n};\n\n/**\n * Submix element as defined in section 3.7 of IAMF.\n *\n * @note The struct should be allocated with av_iamf_submix_add_element()\n *       and its size is not a part of the public ABI.\n */\ntypedef struct AVIAMFSubmixElement {\n    const AVClass *av_class;\n\n    /**\n     * The id of the Audio Element this submix element references.\n     */\n    unsigned int audio_element_id;\n\n    /**\n     * Information required required for applying any processing to the\n     * referenced and rendered Audio Element before being summed with other\n     * processed Audio Elements.\n     * The @ref AVIAMFParamDefinition.type \"type\" must be\n     * AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN.\n     */\n    AVIAMFParamDefinition *element_mix_config;\n\n    /**\n     * Default mix gain value to apply when there are no AVIAMFParamDefinition\n     * with @ref element_mix_config \"element_mix_config's\"\n     * @ref AVIAMFParamDefinition.parameter_id \"parameter_id\" available for a\n     * given audio frame.\n     */\n    AVRational default_mix_gain;\n\n    /**\n     * A value that indicates whether the referenced channel-based Audio Element\n     * shall be rendered to stereo loudspeakers or spatialized with a binaural\n     * renderer when played back on headphones.\n     * If the Audio Element is not of @ref AVIAMFAudioElement.audio_element_type\n     * \"type\" AV_IAMF_AUDIO_ELEMENT_TYPE_CHANNEL, then this field is undefined.\n     */\n    enum AVIAMFHeadphonesMode headphones_rendering_mode;\n\n    /**\n     * A dictionary of strings describing the submix in different languages.\n     * Must have the same amount of entries as\n     * @ref AVIAMFMixPresentation.annotations \"the mix's annotations\", stored\n     * in the same order, and with the same key strings.\n     *\n     * @ref AVDictionaryEntry.key \"key\" is a string conforming to BCP-47 that\n     * specifies the language for the string stored in\n     * @ref AVDictionaryEntry.value \"value\".\n     */\n    AVDictionary *annotations;\n} AVIAMFSubmixElement;\n\nenum AVIAMFSubmixLayoutType {\n    /**\n     * The layout follows the loudspeaker sound system convention of ITU-2051-3.\n     * @ref AVIAMFSubmixLayout.sound_system must be set.\n     */\n    AV_IAMF_SUBMIX_LAYOUT_TYPE_LOUDSPEAKERS = 2,\n    /**\n     * The layout is binaural.\n     *\n     * @note @ref AVIAMFSubmixLayout.sound_system may be set to\n     * AV_CHANNEL_LAYOUT_BINAURAL to simplify API usage, but it's not mandatory.\n     */\n    AV_IAMF_SUBMIX_LAYOUT_TYPE_BINAURAL = 3,\n};\n\n/**\n * Submix layout as defined in section 3.7.6 of IAMF.\n *\n * @note The struct should be allocated with av_iamf_submix_add_layout()\n *       and its size is not a part of the public ABI.\n */\ntypedef struct AVIAMFSubmixLayout {\n    const AVClass *av_class;\n\n    enum AVIAMFSubmixLayoutType layout_type;\n\n    /**\n     * Channel layout matching one of Sound Systems A to J of ITU-2051-3, plus\n     * 7.1.2ch, 3.1.2ch, and binaural.\n     * If layout_type is not AV_IAMF_SUBMIX_LAYOUT_TYPE_LOUDSPEAKERS or\n     * AV_IAMF_SUBMIX_LAYOUT_TYPE_BINAURAL, this field is undefined.\n     */\n    AVChannelLayout sound_system;\n    /**\n     * The program integrated loudness information, as defined in\n     * ITU-1770-4.\n     */\n    AVRational integrated_loudness;\n    /**\n     * The digital (sampled) peak value of the audio signal, as defined\n     * in ITU-1770-4.\n     */\n    AVRational digital_peak;\n    /**\n     * The true peak of the audio signal, as defined in ITU-1770-4.\n     */\n    AVRational true_peak;\n    /**\n     * The Dialogue loudness information, as defined in ITU-1770-4.\n     */\n    AVRational dialogue_anchored_loudness;\n    /**\n     * The Album loudness information, as defined in ITU-1770-4.\n     */\n    AVRational album_anchored_loudness;\n} AVIAMFSubmixLayout;\n\n/**\n * Submix layout as defined in section 3.7 of IAMF.\n *\n * @note The struct should be allocated with av_iamf_mix_presentation_add_submix()\n *       and its size is not a part of the public ABI.\n */\ntypedef struct AVIAMFSubmix {\n    const AVClass *av_class;\n\n    /**\n     * Array of submix elements.\n     *\n     * Set by av_iamf_submix_add_element(), must not be modified by any\n     * other code.\n     */\n    AVIAMFSubmixElement **elements;\n    /**\n     * Number of elements in the submix.\n     *\n     * Set by av_iamf_submix_add_element(), must not be modified by any\n     * other code.\n     */\n    unsigned int nb_elements;\n\n    /**\n     * Array of submix layouts.\n     *\n     * Set by av_iamf_submix_add_layout(), must not be modified by any\n     * other code.\n     */\n    AVIAMFSubmixLayout **layouts;\n    /**\n     * Number of layouts in the submix.\n     *\n     * Set by av_iamf_submix_add_layout(), must not be modified by any\n     * other code.\n     */\n    unsigned int nb_layouts;\n\n    /**\n     * Information required for post-processing the mixed audio signal to\n     * generate the audio signal for playback.\n     * The @ref AVIAMFParamDefinition.type \"type\" must be\n     * AV_IAMF_PARAMETER_DEFINITION_MIX_GAIN.\n     */\n    AVIAMFParamDefinition *output_mix_config;\n\n    /**\n     * Default mix gain value to apply when there are no AVIAMFParamDefinition\n     * with @ref output_mix_config \"output_mix_config's\"\n     * @ref AVIAMFParamDefinition.parameter_id \"parameter_id\" available for a\n     * given audio frame.\n     */\n    AVRational default_mix_gain;\n} AVIAMFSubmix;\n\n/**\n * Information on how to render and mix one or more AVIAMFAudioElement to generate\n * the final audio output, as defined in section 3.7 of IAMF.\n *\n * @note The struct should be allocated with av_iamf_mix_presentation_alloc()\n *       and its size is not a part of the public ABI.\n */\ntypedef struct AVIAMFMixPresentation {\n    const AVClass *av_class;\n\n    /**\n     * Array of submixes.\n     *\n     * Set by av_iamf_mix_presentation_add_submix(), must not be modified\n     * by any other code.\n     */\n    AVIAMFSubmix **submixes;\n    /**\n     * Number of submixes in the presentation.\n     *\n     * Set by av_iamf_mix_presentation_add_submix(), must not be modified\n     * by any other code.\n     */\n    unsigned int nb_submixes;\n\n    /**\n     * A dictionary of strings describing the mix in different languages.\n     * Must have the same amount of entries as every\n     * @ref AVIAMFSubmixElement.annotations \"Submix element annotations\",\n     * stored in the same order, and with the same key strings.\n     *\n     * @ref AVDictionaryEntry.key \"key\" is a string conforming to BCP-47\n     * that specifies the language for the string stored in\n     * @ref AVDictionaryEntry.value \"value\".\n     */\n    AVDictionary *annotations;\n} AVIAMFMixPresentation;\n\nconst AVClass *av_iamf_mix_presentation_get_class(void);\n\n/**\n * Allocates a AVIAMFMixPresentation, and initializes its fields with default\n * values. No submixes are allocated.\n * Must be freed with av_iamf_mix_presentation_free().\n *\n * @see av_iamf_mix_presentation_add_submix()\n */\nAVIAMFMixPresentation *av_iamf_mix_presentation_alloc(void);\n\n/**\n * Allocate a submix and add it to a given AVIAMFMixPresentation.\n * It is freed by av_iamf_mix_presentation_free() alongside the rest of the\n * parent AVIAMFMixPresentation.\n *\n * @return a pointer to the allocated submix.\n */\nAVIAMFSubmix *av_iamf_mix_presentation_add_submix(AVIAMFMixPresentation *mix_presentation);\n\n/**\n * Allocate a submix element and add it to a given AVIAMFSubmix.\n * It is freed by av_iamf_mix_presentation_free() alongside the rest of the\n * parent AVIAMFSubmix.\n *\n * @return a pointer to the allocated submix.\n */\nAVIAMFSubmixElement *av_iamf_submix_add_element(AVIAMFSubmix *submix);\n\n/**\n * Allocate a submix layout and add it to a given AVIAMFSubmix.\n * It is freed by av_iamf_mix_presentation_free() alongside the rest of the\n * parent AVIAMFSubmix.\n *\n * @return a pointer to the allocated submix.\n */\nAVIAMFSubmixLayout *av_iamf_submix_add_layout(AVIAMFSubmix *submix);\n\n/**\n * Free an AVIAMFMixPresentation and all its contents.\n *\n * @param mix_presentation pointer to pointer to an allocated AVIAMFMixPresentation.\n *                         upon return, *mix_presentation will be set to NULL.\n */\nvoid av_iamf_mix_presentation_free(AVIAMFMixPresentation **mix_presentation);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_IAMF_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/imgutils.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_IMGUTILS_H\n#define AVUTIL_IMGUTILS_H\n\n/**\n * @file\n * misc image utilities\n *\n * @addtogroup lavu_picture\n * @{\n */\n\n#include <stddef.h>\n#include <stdint.h>\n#include \"pixdesc.h\"\n#include \"pixfmt.h\"\n#include \"rational.h\"\n\n/**\n * Compute the max pixel step for each plane of an image with a\n * format described by pixdesc.\n *\n * The pixel step is the distance in bytes between the first byte of\n * the group of bytes which describe a pixel component and the first\n * byte of the successive group in the same plane for the same\n * component.\n *\n * @param max_pixsteps an array which is filled with the max pixel step\n * for each plane. Since a plane may contain different pixel\n * components, the computed max_pixsteps[plane] is relative to the\n * component in the plane with the max pixel step.\n * @param max_pixstep_comps an array which is filled with the component\n * for each plane which has the max pixel step. May be NULL.\n * @param pixdesc the AVPixFmtDescriptor for the image, describing its format\n */\nvoid av_image_fill_max_pixsteps(int max_pixsteps[4], int max_pixstep_comps[4],\n                                const AVPixFmtDescriptor *pixdesc);\n\n/**\n * Compute the size of an image line with format pix_fmt and width\n * width for the plane plane.\n *\n * @return the computed size in bytes\n */\nint av_image_get_linesize(enum AVPixelFormat pix_fmt, int width, int plane);\n\n/**\n * Fill plane linesizes for an image with pixel format pix_fmt and\n * width width.\n *\n * @param linesizes array to be filled with the linesize for each plane\n * @param pix_fmt the AVPixelFormat of the image\n * @param width width of the image in pixels\n * @return >= 0 in case of success, a negative error code otherwise\n */\nint av_image_fill_linesizes(int linesizes[4], enum AVPixelFormat pix_fmt, int width);\n\n/**\n * Fill plane sizes for an image with pixel format pix_fmt and height height.\n *\n * @param size the array to be filled with the size of each image plane\n * @param pix_fmt the AVPixelFormat of the image\n * @param height height of the image in pixels\n * @param linesizes the array containing the linesize for each\n *        plane, should be filled by av_image_fill_linesizes()\n * @return >= 0 in case of success, a negative error code otherwise\n *\n * @note The linesize parameters have the type ptrdiff_t here, while they are\n *       int for av_image_fill_linesizes().\n */\nint av_image_fill_plane_sizes(size_t size[4], enum AVPixelFormat pix_fmt,\n                              int height, const ptrdiff_t linesizes[4]);\n\n/**\n * Fill plane data pointers for an image with pixel format pix_fmt and\n * height height.\n *\n * @param data pointers array to be filled with the pointer for each image plane\n * @param pix_fmt the AVPixelFormat of the image\n * @param height height of the image in pixels\n * @param ptr the pointer to a buffer which will contain the image\n * @param linesizes the array containing the linesize for each\n * plane, should be filled by av_image_fill_linesizes()\n * @return the size in bytes required for the image buffer, a negative\n * error code in case of failure\n */\nint av_image_fill_pointers(uint8_t *data[4], enum AVPixelFormat pix_fmt, int height,\n                           uint8_t *ptr, const int linesizes[4]);\n\n/**\n * Allocate an image with size w and h and pixel format pix_fmt, and\n * fill pointers and linesizes accordingly.\n * The allocated image buffer has to be freed by using\n * av_freep(&pointers[0]).\n *\n * @param pointers array to be filled with the pointer for each image plane\n * @param linesizes the array filled with the linesize for each plane\n * @param w width of the image in pixels\n * @param h height of the image in pixels\n * @param pix_fmt the AVPixelFormat of the image\n * @param align the value to use for buffer size alignment\n * @return the size in bytes required for the image buffer, a negative\n * error code in case of failure\n */\nint av_image_alloc(uint8_t *pointers[4], int linesizes[4],\n                   int w, int h, enum AVPixelFormat pix_fmt, int align);\n\n/**\n * Copy image plane from src to dst.\n * That is, copy \"height\" number of lines of \"bytewidth\" bytes each.\n * The first byte of each successive line is separated by *_linesize\n * bytes.\n *\n * bytewidth must be contained by both absolute values of dst_linesize\n * and src_linesize, otherwise the function behavior is undefined.\n *\n * @param dst          destination plane to copy to\n * @param dst_linesize linesize for the image plane in dst\n * @param src          source plane to copy from\n * @param src_linesize linesize for the image plane in src\n * @param height       height (number of lines) of the plane\n */\nvoid av_image_copy_plane(uint8_t       *dst, int dst_linesize,\n                         const uint8_t *src, int src_linesize,\n                         int bytewidth, int height);\n\n/**\n * Copy image data located in uncacheable (e.g. GPU mapped) memory. Where\n * available, this function will use special functionality for reading from such\n * memory, which may result in greatly improved performance compared to plain\n * av_image_copy_plane().\n *\n * bytewidth must be contained by both absolute values of dst_linesize\n * and src_linesize, otherwise the function behavior is undefined.\n *\n * @note The linesize parameters have the type ptrdiff_t here, while they are\n *       int for av_image_copy_plane().\n * @note On x86, the linesizes currently need to be aligned to the cacheline\n *       size (i.e. 64) to get improved performance.\n */\nvoid av_image_copy_plane_uc_from(uint8_t       *dst, ptrdiff_t dst_linesize,\n                                 const uint8_t *src, ptrdiff_t src_linesize,\n                                 ptrdiff_t bytewidth, int height);\n\n/**\n * Copy image in src_data to dst_data.\n *\n * @param dst_data      destination image data buffer to copy to\n * @param dst_linesizes linesizes for the image in dst_data\n * @param src_data      source image data buffer to copy from\n * @param src_linesizes linesizes for the image in src_data\n * @param pix_fmt       the AVPixelFormat of the image\n * @param width         width of the image in pixels\n * @param height        height of the image in pixels\n */\nvoid av_image_copy(uint8_t * const dst_data[4], const int dst_linesizes[4],\n                   const uint8_t * const src_data[4], const int src_linesizes[4],\n                   enum AVPixelFormat pix_fmt, int width, int height);\n\n/**\n * Wrapper around av_image_copy() to workaround the limitation\n * that the conversion from uint8_t * const * to const uint8_t * const *\n * is not performed automatically in C.\n * @see av_image_copy()\n */\nstatic inline\nvoid av_image_copy2(uint8_t * const dst_data[4], const int dst_linesizes[4],\n                    uint8_t * const src_data[4], const int src_linesizes[4],\n                    enum AVPixelFormat pix_fmt, int width, int height)\n{\n    av_image_copy(dst_data, dst_linesizes,\n                  (const uint8_t * const *)src_data, src_linesizes,\n                  pix_fmt, width, height);\n}\n\n/**\n * Copy image data located in uncacheable (e.g. GPU mapped) memory. Where\n * available, this function will use special functionality for reading from such\n * memory, which may result in greatly improved performance compared to plain\n * av_image_copy().\n *\n * The data pointers and the linesizes must be aligned to the maximum required\n * by the CPU architecture.\n *\n * @note The linesize parameters have the type ptrdiff_t here, while they are\n *       int for av_image_copy().\n * @note On x86, the linesizes currently need to be aligned to the cacheline\n *       size (i.e. 64) to get improved performance.\n */\nvoid av_image_copy_uc_from(uint8_t * const dst_data[4],       const ptrdiff_t dst_linesizes[4],\n                           const uint8_t * const src_data[4], const ptrdiff_t src_linesizes[4],\n                           enum AVPixelFormat pix_fmt, int width, int height);\n\n/**\n * Setup the data pointers and linesizes based on the specified image\n * parameters and the provided array.\n *\n * The fields of the given image are filled in by using the src\n * address which points to the image data buffer. Depending on the\n * specified pixel format, one or multiple image data pointers and\n * line sizes will be set.  If a planar format is specified, several\n * pointers will be set pointing to the different picture planes and\n * the line sizes of the different planes will be stored in the\n * lines_sizes array. Call with src == NULL to get the required\n * size for the src buffer.\n *\n * To allocate the buffer and fill in the dst_data and dst_linesize in\n * one call, use av_image_alloc().\n *\n * @param dst_data      data pointers to be filled in\n * @param dst_linesize  linesizes for the image in dst_data to be filled in\n * @param src           buffer which will contain or contains the actual image data, can be NULL\n * @param pix_fmt       the pixel format of the image\n * @param width         the width of the image in pixels\n * @param height        the height of the image in pixels\n * @param align         the value used in src for linesize alignment\n * @return the size in bytes required for src, a negative error code\n * in case of failure\n */\nint av_image_fill_arrays(uint8_t *dst_data[4], int dst_linesize[4],\n                         const uint8_t *src,\n                         enum AVPixelFormat pix_fmt, int width, int height, int align);\n\n/**\n * Return the size in bytes of the amount of data required to store an\n * image with the given parameters.\n *\n * @param pix_fmt  the pixel format of the image\n * @param width    the width of the image in pixels\n * @param height   the height of the image in pixels\n * @param align    the assumed linesize alignment\n * @return the buffer size in bytes, a negative error code in case of failure\n */\nint av_image_get_buffer_size(enum AVPixelFormat pix_fmt, int width, int height, int align);\n\n/**\n * Copy image data from an image into a buffer.\n *\n * av_image_get_buffer_size() can be used to compute the required size\n * for the buffer to fill.\n *\n * @param dst           a buffer into which picture data will be copied\n * @param dst_size      the size in bytes of dst\n * @param src_data      pointers containing the source image data\n * @param src_linesize  linesizes for the image in src_data\n * @param pix_fmt       the pixel format of the source image\n * @param width         the width of the source image in pixels\n * @param height        the height of the source image in pixels\n * @param align         the assumed linesize alignment for dst\n * @return the number of bytes written to dst, or a negative value\n * (error code) on error\n */\nint av_image_copy_to_buffer(uint8_t *dst, int dst_size,\n                            const uint8_t * const src_data[4], const int src_linesize[4],\n                            enum AVPixelFormat pix_fmt, int width, int height, int align);\n\n/**\n * Check if the given dimension of an image is valid, meaning that all\n * bytes of the image can be addressed with a signed int.\n *\n * @param w the width of the picture\n * @param h the height of the picture\n * @param log_offset the offset to sum to the log level for logging with log_ctx\n * @param log_ctx the parent logging context, it may be NULL\n * @return >= 0 if valid, a negative error code otherwise\n */\nint av_image_check_size(unsigned int w, unsigned int h, int log_offset, void *log_ctx);\n\n/**\n * Check if the given dimension of an image is valid, meaning that all\n * bytes of a plane of an image with the specified pix_fmt can be addressed\n * with a signed int.\n *\n * @param w the width of the picture\n * @param h the height of the picture\n * @param max_pixels the maximum number of pixels the user wants to accept\n * @param pix_fmt the pixel format, can be AV_PIX_FMT_NONE if unknown.\n * @param log_offset the offset to sum to the log level for logging with log_ctx\n * @param log_ctx the parent logging context, it may be NULL\n * @return >= 0 if valid, a negative error code otherwise\n */\nint av_image_check_size2(unsigned int w, unsigned int h, int64_t max_pixels, enum AVPixelFormat pix_fmt, int log_offset, void *log_ctx);\n\n/**\n * Check if the given sample aspect ratio of an image is valid.\n *\n * It is considered invalid if the denominator is 0 or if applying the ratio\n * to the image size would make the smaller dimension less than 1. If the\n * sar numerator is 0, it is considered unknown and will return as valid.\n *\n * @param w width of the image\n * @param h height of the image\n * @param sar sample aspect ratio of the image\n * @return 0 if valid, a negative AVERROR code otherwise\n */\nint av_image_check_sar(unsigned int w, unsigned int h, AVRational sar);\n\n/**\n * Overwrite the image data with black. This is suitable for filling a\n * sub-rectangle of an image, meaning the padding between the right most pixel\n * and the left most pixel on the next line will not be overwritten. For some\n * formats, the image size might be rounded up due to inherent alignment.\n *\n * If the pixel format has alpha, the alpha is cleared to opaque.\n *\n * This can return an error if the pixel format is not supported. Normally, all\n * non-hwaccel pixel formats should be supported.\n *\n * Passing NULL for dst_data is allowed. Then the function returns whether the\n * operation would have succeeded. (It can return an error if the pix_fmt is\n * not supported.)\n *\n * @param dst_data      data pointers to destination image\n * @param dst_linesize  linesizes for the destination image\n * @param pix_fmt       the pixel format of the image\n * @param range         the color range of the image (important for colorspaces such as YUV)\n * @param width         the width of the image in pixels\n * @param height        the height of the image in pixels\n * @return 0 if the image data was cleared, a negative AVERROR code otherwise\n */\nint av_image_fill_black(uint8_t * const dst_data[4], const ptrdiff_t dst_linesize[4],\n                        enum AVPixelFormat pix_fmt, enum AVColorRange range,\n                        int width, int height);\n\n/**\n * Overwrite the image data with a color. This is suitable for filling a\n * sub-rectangle of an image, meaning the padding between the right most pixel\n * and the left most pixel on the next line will not be overwritten. For some\n * formats, the image size might be rounded up due to inherent alignment.\n *\n * If the pixel format has alpha, it is also replaced. Color component values\n * are interpreted as native integers (or intfloats) regardless of actual pixel\n * format endianness.\n *\n * This can return an error if the pixel format is not supported. Normally, all\n * non-hwaccel pixel formats should be supported.\n *\n * Passing NULL for dst_data is allowed. Then the function returns whether the\n * operation would have succeeded. (It can return an error if the pix_fmt is\n * not supported.)\n *\n * @param dst_data      data pointers to destination image\n * @param dst_linesize  linesizes for the destination image\n * @param pix_fmt       the pixel format of the image\n * @param color         the color components to be used for the fill\n * @param width         the width of the image in pixels\n * @param height        the height of the image in pixels\n * @param flags         currently unused\n * @return 0 if the image data was filled, a negative AVERROR code otherwise\n */\nint av_image_fill_color(uint8_t * const dst_data[4], const ptrdiff_t dst_linesize[4],\n                        enum AVPixelFormat pix_fmt, const uint32_t color[4],\n                        int width, int height, int flags);\n\n/**\n * @}\n */\n\n\n#endif /* AVUTIL_IMGUTILS_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/intfloat.h",
    "content": "/*\n * Copyright (c) 2011 Mans Rullgard\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_INTFLOAT_H\n#define AVUTIL_INTFLOAT_H\n\n#include <stdint.h>\n#include \"attributes.h\"\n\nunion av_intfloat32 {\n    uint32_t i;\n    float    f;\n};\n\nunion av_intfloat64 {\n    uint64_t i;\n    double   f;\n};\n\n/**\n * Reinterpret a 32-bit integer as a float.\n */\nstatic av_always_inline float av_int2float(uint32_t i)\n{\n    union av_intfloat32 v;\n    v.i = i;\n    return v.f;\n}\n\n/**\n * Reinterpret a float as a 32-bit integer.\n */\nstatic av_always_inline uint32_t av_float2int(float f)\n{\n    union av_intfloat32 v;\n    v.f = f;\n    return v.i;\n}\n\n/**\n * Reinterpret a 64-bit integer as a double.\n */\nstatic av_always_inline double av_int2double(uint64_t i)\n{\n    union av_intfloat64 v;\n    v.i = i;\n    return v.f;\n}\n\n/**\n * Reinterpret a double as a 64-bit integer.\n */\nstatic av_always_inline uint64_t av_double2int(double f)\n{\n    union av_intfloat64 v;\n    v.f = f;\n    return v.i;\n}\n\n#endif /* AVUTIL_INTFLOAT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/intreadwrite.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_INTREADWRITE_H\n#define AVUTIL_INTREADWRITE_H\n\n#include <stdint.h>\n#include \"libavutil/avconfig.h\"\n#include \"attributes.h\"\n#include \"bswap.h\"\n\ntypedef union {\n    uint64_t u64;\n    uint32_t u32[2];\n    uint16_t u16[4];\n    uint8_t  u8 [8];\n    double   f64;\n    float    f32[2];\n} av_alias av_alias64;\n\ntypedef union {\n    uint32_t u32;\n    uint16_t u16[2];\n    uint8_t  u8 [4];\n    float    f32;\n} av_alias av_alias32;\n\ntypedef union {\n    uint16_t u16;\n    uint8_t  u8 [2];\n} av_alias av_alias16;\n\n/*\n * Arch-specific headers can provide any combination of\n * AV_[RW][BLN](16|24|32|48|64) and AV_(COPY|SWAP|ZERO)(64|128) macros.\n * Preprocessor symbols must be defined, even if these are implemented\n * as inline functions.\n *\n * R/W means read/write, B/L/N means big/little/native endianness.\n * The following macros require aligned access, compared to their\n * unaligned variants: AV_(COPY|SWAP|ZERO)(64|128), AV_[RW]N[8-64]A.\n * Incorrect usage may range from abysmal performance to crash\n * depending on the platform.\n *\n * The unaligned variants are AV_[RW][BLN][8-64] and AV_COPY*U.\n */\n\n#ifdef HAVE_AV_CONFIG_H\n\n#include \"config.h\"\n\n#if ARCH_AARCH64\n#   include \"aarch64/intreadwrite.h\"\n#elif ARCH_MIPS\n#   include \"mips/intreadwrite.h\"\n#elif ARCH_PPC\n#   include \"ppc/intreadwrite.h\"\n#elif ARCH_X86\n#   include \"x86/intreadwrite.h\"\n#endif\n\n#endif /* HAVE_AV_CONFIG_H */\n\n/*\n * Map AV_RNXX <-> AV_R[BL]XX for all variants provided by per-arch headers.\n */\n\n#if AV_HAVE_BIGENDIAN\n\n#   if    defined(AV_RN16) && !defined(AV_RB16)\n#       define AV_RB16(p) AV_RN16(p)\n#   elif !defined(AV_RN16) &&  defined(AV_RB16)\n#       define AV_RN16(p) AV_RB16(p)\n#   endif\n\n#   if    defined(AV_WN16) && !defined(AV_WB16)\n#       define AV_WB16(p, v) AV_WN16(p, v)\n#   elif !defined(AV_WN16) &&  defined(AV_WB16)\n#       define AV_WN16(p, v) AV_WB16(p, v)\n#   endif\n\n#   if    defined(AV_RN24) && !defined(AV_RB24)\n#       define AV_RB24(p) AV_RN24(p)\n#   elif !defined(AV_RN24) &&  defined(AV_RB24)\n#       define AV_RN24(p) AV_RB24(p)\n#   endif\n\n#   if    defined(AV_WN24) && !defined(AV_WB24)\n#       define AV_WB24(p, v) AV_WN24(p, v)\n#   elif !defined(AV_WN24) &&  defined(AV_WB24)\n#       define AV_WN24(p, v) AV_WB24(p, v)\n#   endif\n\n#   if    defined(AV_RN32) && !defined(AV_RB32)\n#       define AV_RB32(p) AV_RN32(p)\n#   elif !defined(AV_RN32) &&  defined(AV_RB32)\n#       define AV_RN32(p) AV_RB32(p)\n#   endif\n\n#   if    defined(AV_WN32) && !defined(AV_WB32)\n#       define AV_WB32(p, v) AV_WN32(p, v)\n#   elif !defined(AV_WN32) &&  defined(AV_WB32)\n#       define AV_WN32(p, v) AV_WB32(p, v)\n#   endif\n\n#   if    defined(AV_RN48) && !defined(AV_RB48)\n#       define AV_RB48(p) AV_RN48(p)\n#   elif !defined(AV_RN48) &&  defined(AV_RB48)\n#       define AV_RN48(p) AV_RB48(p)\n#   endif\n\n#   if    defined(AV_WN48) && !defined(AV_WB48)\n#       define AV_WB48(p, v) AV_WN48(p, v)\n#   elif !defined(AV_WN48) &&  defined(AV_WB48)\n#       define AV_WN48(p, v) AV_WB48(p, v)\n#   endif\n\n#   if    defined(AV_RN64) && !defined(AV_RB64)\n#       define AV_RB64(p) AV_RN64(p)\n#   elif !defined(AV_RN64) &&  defined(AV_RB64)\n#       define AV_RN64(p) AV_RB64(p)\n#   endif\n\n#   if    defined(AV_WN64) && !defined(AV_WB64)\n#       define AV_WB64(p, v) AV_WN64(p, v)\n#   elif !defined(AV_WN64) &&  defined(AV_WB64)\n#       define AV_WN64(p, v) AV_WB64(p, v)\n#   endif\n\n#else /* AV_HAVE_BIGENDIAN */\n\n#   if    defined(AV_RN16) && !defined(AV_RL16)\n#       define AV_RL16(p) AV_RN16(p)\n#   elif !defined(AV_RN16) &&  defined(AV_RL16)\n#       define AV_RN16(p) AV_RL16(p)\n#   endif\n\n#   if    defined(AV_WN16) && !defined(AV_WL16)\n#       define AV_WL16(p, v) AV_WN16(p, v)\n#   elif !defined(AV_WN16) &&  defined(AV_WL16)\n#       define AV_WN16(p, v) AV_WL16(p, v)\n#   endif\n\n#   if    defined(AV_RN24) && !defined(AV_RL24)\n#       define AV_RL24(p) AV_RN24(p)\n#   elif !defined(AV_RN24) &&  defined(AV_RL24)\n#       define AV_RN24(p) AV_RL24(p)\n#   endif\n\n#   if    defined(AV_WN24) && !defined(AV_WL24)\n#       define AV_WL24(p, v) AV_WN24(p, v)\n#   elif !defined(AV_WN24) &&  defined(AV_WL24)\n#       define AV_WN24(p, v) AV_WL24(p, v)\n#   endif\n\n#   if    defined(AV_RN32) && !defined(AV_RL32)\n#       define AV_RL32(p) AV_RN32(p)\n#   elif !defined(AV_RN32) &&  defined(AV_RL32)\n#       define AV_RN32(p) AV_RL32(p)\n#   endif\n\n#   if    defined(AV_WN32) && !defined(AV_WL32)\n#       define AV_WL32(p, v) AV_WN32(p, v)\n#   elif !defined(AV_WN32) &&  defined(AV_WL32)\n#       define AV_WN32(p, v) AV_WL32(p, v)\n#   endif\n\n#   if    defined(AV_RN48) && !defined(AV_RL48)\n#       define AV_RL48(p) AV_RN48(p)\n#   elif !defined(AV_RN48) &&  defined(AV_RL48)\n#       define AV_RN48(p) AV_RL48(p)\n#   endif\n\n#   if    defined(AV_WN48) && !defined(AV_WL48)\n#       define AV_WL48(p, v) AV_WN48(p, v)\n#   elif !defined(AV_WN48) &&  defined(AV_WL48)\n#       define AV_WN48(p, v) AV_WL48(p, v)\n#   endif\n\n#   if    defined(AV_RN64) && !defined(AV_RL64)\n#       define AV_RL64(p) AV_RN64(p)\n#   elif !defined(AV_RN64) &&  defined(AV_RL64)\n#       define AV_RN64(p) AV_RL64(p)\n#   endif\n\n#   if    defined(AV_WN64) && !defined(AV_WL64)\n#       define AV_WL64(p, v) AV_WN64(p, v)\n#   elif !defined(AV_WN64) &&  defined(AV_WL64)\n#       define AV_WN64(p, v) AV_WL64(p, v)\n#   endif\n\n#endif /* !AV_HAVE_BIGENDIAN */\n\n/*\n * Define AV_[RW]N helper macros to simplify definitions not provided\n * by per-arch headers.\n */\n\n#if defined(__GNUC__) || defined(__clang__)\n\nunion unaligned_64 { uint64_t l; } __attribute__((packed)) av_alias;\nunion unaligned_32 { uint32_t l; } __attribute__((packed)) av_alias;\nunion unaligned_16 { uint16_t l; } __attribute__((packed)) av_alias;\n\n#   define AV_RN(s, p) (((const union unaligned_##s *) (p))->l)\n#   define AV_WN(s, p, v) ((((union unaligned_##s *) (p))->l) = (v))\n\n#elif defined(_MSC_VER) && (defined(_M_ARM) || defined(_M_X64) || defined(_M_ARM64)) && AV_HAVE_FAST_UNALIGNED\n\n#   define AV_RN(s, p) (*((const __unaligned uint##s##_t*)(p)))\n#   define AV_WN(s, p, v) (*((__unaligned uint##s##_t*)(p)) = (v))\n\n#elif AV_HAVE_FAST_UNALIGNED\n\n#   define AV_RN(s, p) (((const av_alias##s*)(p))->u##s)\n#   define AV_WN(s, p, v) (((av_alias##s*)(p))->u##s = (v))\n\n#else\n\n#ifndef AV_RB16\n#   define AV_RB16(x)                           \\\n    ((((const uint8_t*)(x))[0] << 8) |          \\\n      ((const uint8_t*)(x))[1])\n#endif\n#ifndef AV_WB16\n#   define AV_WB16(p, val) do {                 \\\n        uint16_t d = (val);                     \\\n        ((uint8_t*)(p))[1] = (d);               \\\n        ((uint8_t*)(p))[0] = (d)>>8;            \\\n    } while(0)\n#endif\n\n#ifndef AV_RL16\n#   define AV_RL16(x)                           \\\n    ((((const uint8_t*)(x))[1] << 8) |          \\\n      ((const uint8_t*)(x))[0])\n#endif\n#ifndef AV_WL16\n#   define AV_WL16(p, val) do {                 \\\n        uint16_t d = (val);                     \\\n        ((uint8_t*)(p))[0] = (d);               \\\n        ((uint8_t*)(p))[1] = (d)>>8;            \\\n    } while(0)\n#endif\n\n#ifndef AV_RB32\n#   define AV_RB32(x)                                \\\n    (((uint32_t)((const uint8_t*)(x))[0] << 24) |    \\\n               (((const uint8_t*)(x))[1] << 16) |    \\\n               (((const uint8_t*)(x))[2] <<  8) |    \\\n                ((const uint8_t*)(x))[3])\n#endif\n#ifndef AV_WB32\n#   define AV_WB32(p, val) do {                 \\\n        uint32_t d = (val);                     \\\n        ((uint8_t*)(p))[3] = (d);               \\\n        ((uint8_t*)(p))[2] = (d)>>8;            \\\n        ((uint8_t*)(p))[1] = (d)>>16;           \\\n        ((uint8_t*)(p))[0] = (d)>>24;           \\\n    } while(0)\n#endif\n\n#ifndef AV_RL32\n#   define AV_RL32(x)                                \\\n    (((uint32_t)((const uint8_t*)(x))[3] << 24) |    \\\n               (((const uint8_t*)(x))[2] << 16) |    \\\n               (((const uint8_t*)(x))[1] <<  8) |    \\\n                ((const uint8_t*)(x))[0])\n#endif\n#ifndef AV_WL32\n#   define AV_WL32(p, val) do {                 \\\n        uint32_t d = (val);                     \\\n        ((uint8_t*)(p))[0] = (d);               \\\n        ((uint8_t*)(p))[1] = (d)>>8;            \\\n        ((uint8_t*)(p))[2] = (d)>>16;           \\\n        ((uint8_t*)(p))[3] = (d)>>24;           \\\n    } while(0)\n#endif\n\n#ifndef AV_RB64\n#   define AV_RB64(x)                                   \\\n    (((uint64_t)((const uint8_t*)(x))[0] << 56) |       \\\n     ((uint64_t)((const uint8_t*)(x))[1] << 48) |       \\\n     ((uint64_t)((const uint8_t*)(x))[2] << 40) |       \\\n     ((uint64_t)((const uint8_t*)(x))[3] << 32) |       \\\n     ((uint64_t)((const uint8_t*)(x))[4] << 24) |       \\\n     ((uint64_t)((const uint8_t*)(x))[5] << 16) |       \\\n     ((uint64_t)((const uint8_t*)(x))[6] <<  8) |       \\\n      (uint64_t)((const uint8_t*)(x))[7])\n#endif\n#ifndef AV_WB64\n#   define AV_WB64(p, val) do {                 \\\n        uint64_t d = (val);                     \\\n        ((uint8_t*)(p))[7] = (d);               \\\n        ((uint8_t*)(p))[6] = (d)>>8;            \\\n        ((uint8_t*)(p))[5] = (d)>>16;           \\\n        ((uint8_t*)(p))[4] = (d)>>24;           \\\n        ((uint8_t*)(p))[3] = (d)>>32;           \\\n        ((uint8_t*)(p))[2] = (d)>>40;           \\\n        ((uint8_t*)(p))[1] = (d)>>48;           \\\n        ((uint8_t*)(p))[0] = (d)>>56;           \\\n    } while(0)\n#endif\n\n#ifndef AV_RL64\n#   define AV_RL64(x)                                   \\\n    (((uint64_t)((const uint8_t*)(x))[7] << 56) |       \\\n     ((uint64_t)((const uint8_t*)(x))[6] << 48) |       \\\n     ((uint64_t)((const uint8_t*)(x))[5] << 40) |       \\\n     ((uint64_t)((const uint8_t*)(x))[4] << 32) |       \\\n     ((uint64_t)((const uint8_t*)(x))[3] << 24) |       \\\n     ((uint64_t)((const uint8_t*)(x))[2] << 16) |       \\\n     ((uint64_t)((const uint8_t*)(x))[1] <<  8) |       \\\n      (uint64_t)((const uint8_t*)(x))[0])\n#endif\n#ifndef AV_WL64\n#   define AV_WL64(p, val) do {                 \\\n        uint64_t d = (val);                     \\\n        ((uint8_t*)(p))[0] = (d);               \\\n        ((uint8_t*)(p))[1] = (d)>>8;            \\\n        ((uint8_t*)(p))[2] = (d)>>16;           \\\n        ((uint8_t*)(p))[3] = (d)>>24;           \\\n        ((uint8_t*)(p))[4] = (d)>>32;           \\\n        ((uint8_t*)(p))[5] = (d)>>40;           \\\n        ((uint8_t*)(p))[6] = (d)>>48;           \\\n        ((uint8_t*)(p))[7] = (d)>>56;           \\\n    } while(0)\n#endif\n\n#if AV_HAVE_BIGENDIAN\n#   define AV_RN(s, p)    AV_RB##s(p)\n#   define AV_WN(s, p, v) AV_WB##s(p, v)\n#else\n#   define AV_RN(s, p)    AV_RL##s(p)\n#   define AV_WN(s, p, v) AV_WL##s(p, v)\n#endif\n\n#endif /* HAVE_FAST_UNALIGNED */\n\n#ifndef AV_RN16\n#   define AV_RN16(p) AV_RN(16, p)\n#endif\n\n#ifndef AV_RN32\n#   define AV_RN32(p) AV_RN(32, p)\n#endif\n\n#ifndef AV_RN64\n#   define AV_RN64(p) AV_RN(64, p)\n#endif\n\n#ifndef AV_WN16\n#   define AV_WN16(p, v) AV_WN(16, p, v)\n#endif\n\n#ifndef AV_WN32\n#   define AV_WN32(p, v) AV_WN(32, p, v)\n#endif\n\n#ifndef AV_WN64\n#   define AV_WN64(p, v) AV_WN(64, p, v)\n#endif\n\n#if AV_HAVE_BIGENDIAN\n#   define AV_RB(s, p)    AV_RN##s(p)\n#   define AV_WB(s, p, v) AV_WN##s(p, v)\n#   define AV_RL(s, p)    av_bswap##s(AV_RN##s(p))\n#   define AV_WL(s, p, v) AV_WN##s(p, av_bswap##s(v))\n#else\n#   define AV_RB(s, p)    av_bswap##s(AV_RN##s(p))\n#   define AV_WB(s, p, v) AV_WN##s(p, av_bswap##s(v))\n#   define AV_RL(s, p)    AV_RN##s(p)\n#   define AV_WL(s, p, v) AV_WN##s(p, v)\n#endif\n\n#define AV_RB8(x)     (((const uint8_t*)(x))[0])\n#define AV_WB8(p, d)  do { ((uint8_t*)(p))[0] = (d); } while(0)\n\n#define AV_RL8(x)     AV_RB8(x)\n#define AV_WL8(p, d)  AV_WB8(p, d)\n\n#ifndef AV_RB16\n#   define AV_RB16(p)    AV_RB(16, p)\n#endif\n#ifndef AV_WB16\n#   define AV_WB16(p, v) AV_WB(16, p, v)\n#endif\n\n#ifndef AV_RL16\n#   define AV_RL16(p)    AV_RL(16, p)\n#endif\n#ifndef AV_WL16\n#   define AV_WL16(p, v) AV_WL(16, p, v)\n#endif\n\n#ifndef AV_RB32\n#   define AV_RB32(p)    AV_RB(32, p)\n#endif\n#ifndef AV_WB32\n#   define AV_WB32(p, v) AV_WB(32, p, v)\n#endif\n\n#ifndef AV_RL32\n#   define AV_RL32(p)    AV_RL(32, p)\n#endif\n#ifndef AV_WL32\n#   define AV_WL32(p, v) AV_WL(32, p, v)\n#endif\n\n#ifndef AV_RB64\n#   define AV_RB64(p)    AV_RB(64, p)\n#endif\n#ifndef AV_WB64\n#   define AV_WB64(p, v) AV_WB(64, p, v)\n#endif\n\n#ifndef AV_RL64\n#   define AV_RL64(p)    AV_RL(64, p)\n#endif\n#ifndef AV_WL64\n#   define AV_WL64(p, v) AV_WL(64, p, v)\n#endif\n\n#ifndef AV_RB24\n#   define AV_RB24(x)                           \\\n    ((((const uint8_t*)(x))[0] << 16) |         \\\n     (((const uint8_t*)(x))[1] <<  8) |         \\\n      ((const uint8_t*)(x))[2])\n#endif\n#ifndef AV_WB24\n#   define AV_WB24(p, d) do {                   \\\n        ((uint8_t*)(p))[2] = (d);               \\\n        ((uint8_t*)(p))[1] = (d)>>8;            \\\n        ((uint8_t*)(p))[0] = (d)>>16;           \\\n    } while(0)\n#endif\n\n#ifndef AV_RL24\n#   define AV_RL24(x)                           \\\n    ((((const uint8_t*)(x))[2] << 16) |         \\\n     (((const uint8_t*)(x))[1] <<  8) |         \\\n      ((const uint8_t*)(x))[0])\n#endif\n#ifndef AV_WL24\n#   define AV_WL24(p, d) do {                   \\\n        ((uint8_t*)(p))[0] = (d);               \\\n        ((uint8_t*)(p))[1] = (d)>>8;            \\\n        ((uint8_t*)(p))[2] = (d)>>16;           \\\n    } while(0)\n#endif\n\n#ifndef AV_RB48\n#   define AV_RB48(x)                                     \\\n    (((uint64_t)((const uint8_t*)(x))[0] << 40) |         \\\n     ((uint64_t)((const uint8_t*)(x))[1] << 32) |         \\\n     ((uint64_t)((const uint8_t*)(x))[2] << 24) |         \\\n     ((uint64_t)((const uint8_t*)(x))[3] << 16) |         \\\n     ((uint64_t)((const uint8_t*)(x))[4] <<  8) |         \\\n      (uint64_t)((const uint8_t*)(x))[5])\n#endif\n#ifndef AV_WB48\n#   define AV_WB48(p, darg) do {                \\\n        uint64_t d = (darg);                    \\\n        ((uint8_t*)(p))[5] = (d);               \\\n        ((uint8_t*)(p))[4] = (d)>>8;            \\\n        ((uint8_t*)(p))[3] = (d)>>16;           \\\n        ((uint8_t*)(p))[2] = (d)>>24;           \\\n        ((uint8_t*)(p))[1] = (d)>>32;           \\\n        ((uint8_t*)(p))[0] = (d)>>40;           \\\n    } while(0)\n#endif\n\n#ifndef AV_RL48\n#   define AV_RL48(x)                                     \\\n    (((uint64_t)((const uint8_t*)(x))[5] << 40) |         \\\n     ((uint64_t)((const uint8_t*)(x))[4] << 32) |         \\\n     ((uint64_t)((const uint8_t*)(x))[3] << 24) |         \\\n     ((uint64_t)((const uint8_t*)(x))[2] << 16) |         \\\n     ((uint64_t)((const uint8_t*)(x))[1] <<  8) |         \\\n      (uint64_t)((const uint8_t*)(x))[0])\n#endif\n#ifndef AV_WL48\n#   define AV_WL48(p, darg) do {                \\\n        uint64_t d = (darg);                    \\\n        ((uint8_t*)(p))[0] = (d);               \\\n        ((uint8_t*)(p))[1] = (d)>>8;            \\\n        ((uint8_t*)(p))[2] = (d)>>16;           \\\n        ((uint8_t*)(p))[3] = (d)>>24;           \\\n        ((uint8_t*)(p))[4] = (d)>>32;           \\\n        ((uint8_t*)(p))[5] = (d)>>40;           \\\n    } while(0)\n#endif\n\n/*\n * The AV_[RW]NA macros access naturally aligned data\n * in a type-safe way.\n */\n\n#define AV_RNA(s, p)    (((const av_alias##s*)(p))->u##s)\n#define AV_WNA(s, p, v) (((av_alias##s*)(p))->u##s = (v))\n\n#ifndef AV_RN16A\n#   define AV_RN16A(p) AV_RNA(16, p)\n#endif\n\n#ifndef AV_RN32A\n#   define AV_RN32A(p) AV_RNA(32, p)\n#endif\n\n#ifndef AV_RN64A\n#   define AV_RN64A(p) AV_RNA(64, p)\n#endif\n\n#ifndef AV_WN16A\n#   define AV_WN16A(p, v) AV_WNA(16, p, v)\n#endif\n\n#ifndef AV_WN32A\n#   define AV_WN32A(p, v) AV_WNA(32, p, v)\n#endif\n\n#ifndef AV_WN64A\n#   define AV_WN64A(p, v) AV_WNA(64, p, v)\n#endif\n\n#if AV_HAVE_BIGENDIAN\n#   define AV_RLA(s, p)    av_bswap##s(AV_RN##s##A(p))\n#   define AV_WLA(s, p, v) AV_WN##s##A(p, av_bswap##s(v))\n#   define AV_RBA(s, p)    AV_RN##s##A(p)\n#   define AV_WBA(s, p, v) AV_WN##s##A(p, v)\n#else\n#   define AV_RLA(s, p)    AV_RN##s##A(p)\n#   define AV_WLA(s, p, v) AV_WN##s##A(p, v)\n#   define AV_RBA(s, p)    av_bswap##s(AV_RN##s##A(p))\n#   define AV_WBA(s, p, v) AV_WN##s##A(p, av_bswap##s(v))\n#endif\n\n#ifndef AV_RL16A\n#   define AV_RL16A(p) AV_RLA(16, p)\n#endif\n#ifndef AV_WL16A\n#   define AV_WL16A(p, v) AV_WLA(16, p, v)\n#endif\n\n#ifndef AV_RB16A\n#   define AV_RB16A(p) AV_RBA(16, p)\n#endif\n#ifndef AV_WB16A\n#   define AV_WB16A(p, v) AV_WBA(16, p, v)\n#endif\n\n#ifndef AV_RL32A\n#   define AV_RL32A(p) AV_RLA(32, p)\n#endif\n#ifndef AV_WL32A\n#   define AV_WL32A(p, v) AV_WLA(32, p, v)\n#endif\n\n#ifndef AV_RB32A\n#   define AV_RB32A(p) AV_RBA(32, p)\n#endif\n#ifndef AV_WB32A\n#   define AV_WB32A(p, v) AV_WBA(32, p, v)\n#endif\n\n#ifndef AV_RL64A\n#   define AV_RL64A(p) AV_RLA(64, p)\n#endif\n#ifndef AV_WL64A\n#   define AV_WL64A(p, v) AV_WLA(64, p, v)\n#endif\n\n#ifndef AV_RB64A\n#   define AV_RB64A(p) AV_RBA(64, p)\n#endif\n#ifndef AV_WB64A\n#   define AV_WB64A(p, v) AV_WBA(64, p, v)\n#endif\n\n/*\n * The AV_COPYxxU macros are suitable for copying data to/from unaligned\n * memory locations.\n */\n\n#define AV_COPYU(n, d, s) AV_WN##n(d, AV_RN##n(s));\n\n#ifndef AV_COPY16U\n#   define AV_COPY16U(d, s) AV_COPYU(16, d, s)\n#endif\n\n#ifndef AV_COPY32U\n#   define AV_COPY32U(d, s) AV_COPYU(32, d, s)\n#endif\n\n#ifndef AV_COPY64U\n#   define AV_COPY64U(d, s) AV_COPYU(64, d, s)\n#endif\n\n#ifndef AV_COPY128U\n#   define AV_COPY128U(d, s)                                    \\\n    do {                                                        \\\n        AV_COPY64U(d, s);                                       \\\n        AV_COPY64U((char *)(d) + 8, (const char *)(s) + 8);     \\\n    } while(0)\n#endif\n\n/* Parameters for AV_COPY*, AV_SWAP*, AV_ZERO* must be\n * naturally aligned.\n */\n\n#define AV_COPY(n, d, s) \\\n    (((av_alias##n*)(d))->u##n = ((const av_alias##n*)(s))->u##n)\n\n#ifndef AV_COPY16\n#   define AV_COPY16(d, s) AV_COPY(16, d, s)\n#endif\n\n#ifndef AV_COPY32\n#   define AV_COPY32(d, s) AV_COPY(32, d, s)\n#endif\n\n#ifndef AV_COPY64\n#   define AV_COPY64(d, s) AV_COPY(64, d, s)\n#endif\n\n#ifndef AV_COPY128\n#   define AV_COPY128(d, s)                    \\\n    do {                                       \\\n        AV_COPY64(d, s);                       \\\n        AV_COPY64((char*)(d)+8, (char*)(s)+8); \\\n    } while(0)\n#endif\n\n#define AV_SWAP(n, a, b) FFSWAP(av_alias##n, *(av_alias##n*)(a), *(av_alias##n*)(b))\n\n#ifndef AV_SWAP64\n#   define AV_SWAP64(a, b) AV_SWAP(64, a, b)\n#endif\n\n#define AV_ZERO(n, d) (((av_alias##n*)(d))->u##n = 0)\n\n#ifndef AV_ZERO16\n#   define AV_ZERO16(d) AV_ZERO(16, d)\n#endif\n\n#ifndef AV_ZERO32\n#   define AV_ZERO32(d) AV_ZERO(32, d)\n#endif\n\n#ifndef AV_ZERO64\n#   define AV_ZERO64(d) AV_ZERO(64, d)\n#endif\n\n#ifndef AV_ZERO128\n#   define AV_ZERO128(d)         \\\n    do {                         \\\n        AV_ZERO64(d);            \\\n        AV_ZERO64((char*)(d)+8); \\\n    } while(0)\n#endif\n\n#endif /* AVUTIL_INTREADWRITE_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/lfg.h",
    "content": "/*\n * Lagged Fibonacci PRNG\n * Copyright (c) 2008 Michael Niedermayer\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_LFG_H\n#define AVUTIL_LFG_H\n\n#include <stdint.h>\n\n/**\n * Context structure for the Lagged Fibonacci PRNG.\n * The exact layout, types and content of this struct may change and should\n * not be accessed directly. Only its `sizeof()` is guaranteed to stay the same\n * to allow easy instantiation.\n */\ntypedef struct AVLFG {\n    unsigned int state[64];\n    int index;\n} AVLFG;\n\nvoid av_lfg_init(AVLFG *c, unsigned int seed);\n\n/**\n * Seed the state of the ALFG using binary data.\n *\n * @return 0 on success, negative value (AVERROR) on failure.\n */\nint av_lfg_init_from_data(AVLFG *c, const uint8_t *data, unsigned int length);\n\n/**\n * Get the next random unsigned 32-bit number using an ALFG.\n *\n * Please also consider a simple LCG like state= state*1664525+1013904223,\n * it may be good enough and faster for your specific use case.\n */\nstatic inline unsigned int av_lfg_get(AVLFG *c){\n    unsigned a = c->state[c->index & 63] = c->state[(c->index-24) & 63] + c->state[(c->index-55) & 63];\n    c->index += 1U;\n    return a;\n}\n\n/**\n * Get the next random unsigned 32-bit number using a MLFG.\n *\n * Please also consider av_lfg_get() above, it is faster.\n */\nstatic inline unsigned int av_mlfg_get(AVLFG *c){\n    unsigned int a= c->state[(c->index-55) & 63];\n    unsigned int b= c->state[(c->index-24) & 63];\n    a = c->state[c->index & 63] = 2*a*b+a+b;\n    c->index += 1U;\n    return a;\n}\n\n/**\n * Get the next two numbers generated by a Box-Muller Gaussian\n * generator using the random numbers issued by lfg.\n *\n * @param lfg pointer to the context structure\n * @param out array where the two generated numbers are placed\n */\nvoid av_bmg_get(AVLFG *lfg, double out[2]);\n\n#endif /* AVUTIL_LFG_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/log.h",
    "content": "/*\n * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_LOG_H\n#define AVUTIL_LOG_H\n\n#include <stdarg.h>\n#include \"attributes.h\"\n#include \"version.h\"\n\ntypedef enum {\n    AV_CLASS_CATEGORY_NA = 0,\n    AV_CLASS_CATEGORY_INPUT,\n    AV_CLASS_CATEGORY_OUTPUT,\n    AV_CLASS_CATEGORY_MUXER,\n    AV_CLASS_CATEGORY_DEMUXER,\n    AV_CLASS_CATEGORY_ENCODER,\n    AV_CLASS_CATEGORY_DECODER,\n    AV_CLASS_CATEGORY_FILTER,\n    AV_CLASS_CATEGORY_BITSTREAM_FILTER,\n    AV_CLASS_CATEGORY_SWSCALER,\n    AV_CLASS_CATEGORY_SWRESAMPLER,\n    AV_CLASS_CATEGORY_HWDEVICE,\n    AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT = 40,\n    AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,\n    AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT,\n    AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,\n    AV_CLASS_CATEGORY_DEVICE_OUTPUT,\n    AV_CLASS_CATEGORY_DEVICE_INPUT,\n    AV_CLASS_CATEGORY_NB  ///< not part of ABI/API\n}AVClassCategory;\n\nenum AVClassStateFlags {\n    /**\n     * Object initialization has finished and it is now in the 'runtime' stage.\n     * This affects e.g. what options can be set on the object (only\n     * AV_OPT_FLAG_RUNTIME_PARAM options can be set on initialized objects).\n     */\n    AV_CLASS_STATE_INITIALIZED         = (1 << 0),\n};\n\n#define AV_IS_INPUT_DEVICE(category) \\\n    (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT) || \\\n     ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT) || \\\n     ((category) == AV_CLASS_CATEGORY_DEVICE_INPUT))\n\n#define AV_IS_OUTPUT_DEVICE(category) \\\n    (((category) == AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT) || \\\n     ((category) == AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT) || \\\n     ((category) == AV_CLASS_CATEGORY_DEVICE_OUTPUT))\n\nstruct AVOptionRanges;\n\n/**\n * Describe the class of an AVClass context structure. That is an\n * arbitrary struct of which the first field is a pointer to an\n * AVClass struct (e.g. AVCodecContext, AVFormatContext etc.).\n */\ntypedef struct AVClass {\n    /**\n     * The name of the class; usually it is the same name as the\n     * context structure type to which the AVClass is associated.\n     */\n    const char* class_name;\n\n    /**\n     * A pointer to a function which returns the name of a context\n     * instance ctx associated with the class.\n     */\n    const char* (*item_name)(void* ctx);\n\n    /**\n     * An array of options for the structure or NULL.\n     * When non-NULL, the array must be terminated by an option with a NULL\n     * name.\n     *\n     * @see av_set_default_options()\n     */\n    const struct AVOption *option;\n\n    /**\n     * LIBAVUTIL_VERSION with which this structure was created.\n     * This is used to allow fields to be added to AVClass without requiring\n     * major version bumps everywhere.\n     */\n\n    int version;\n\n    /**\n     * Offset in the structure where the log level offset is stored. The log\n     * level offset is an int added to the log level for logging with this\n     * object as the context.\n     *\n     * 0 means there is no such variable.\n     */\n    int log_level_offset_offset;\n\n    /**\n     * Offset in the structure where a pointer to the parent context for\n     * logging is stored. For example a decoder could pass its AVCodecContext\n     * to eval as such a parent context, which an ::av_log() implementation\n     * could then leverage to display the parent context.\n     *\n     * When the pointer is NULL, or this offset is zero, the object is assumed\n     * to have no parent.\n     */\n    int parent_log_context_offset;\n\n    /**\n     * Category used for visualization (like color).\n     *\n     * Only used when ::get_category() is NULL. Use this field when all\n     * instances of this class have the same category, use ::get_category()\n     * otherwise.\n     */\n    AVClassCategory category;\n\n    /**\n     * Callback to return the instance category. Use this callback when\n     * different instances of this class may have different categories,\n     * ::category otherwise.\n     */\n    AVClassCategory (*get_category)(void* ctx);\n\n    /**\n     * Callback to return the supported/allowed ranges.\n     */\n    int (*query_ranges)(struct AVOptionRanges **, void *obj, const char *key, int flags);\n\n    /**\n     * Return next AVOptions-enabled child or NULL\n     */\n    void* (*child_next)(void *obj, void *prev);\n\n    /**\n     * Iterate over the AVClasses corresponding to potential AVOptions-enabled\n     * children.\n     *\n     * @param iter pointer to opaque iteration state. The caller must initialize\n     *             *iter to NULL before the first call.\n     * @return AVClass for the next AVOptions-enabled child or NULL if there are\n     *         no more such children.\n     *\n     * @note The difference between ::child_next() and ::child_class_iterate()\n     *       is that ::child_next() iterates over _actual_ children of an\n     *       _existing_ object instance, while ::child_class_iterate() iterates\n     *       over the classes of all _potential_ children of any possible\n     *       instance of this class.\n     */\n    const struct AVClass* (*child_class_iterate)(void **iter);\n\n    /**\n     * When non-zero, offset in the object to an unsigned int holding object\n     * state flags, a combination of AVClassStateFlags values. The flags are\n     * updated by the object to signal its state to the generic code.\n     *\n     * Added in version 59.41.100.\n     */\n    int state_flags_offset;\n} AVClass;\n\n/**\n * @addtogroup lavu_log\n *\n * @{\n *\n * @defgroup lavu_log_constants Logging Constants\n *\n * @{\n */\n\n/**\n * Print no output.\n */\n#define AV_LOG_QUIET    -8\n\n/**\n * Something went really wrong and we will crash now.\n */\n#define AV_LOG_PANIC     0\n\n/**\n * Something went wrong and recovery is not possible.\n * For example, no header was found for a format which depends\n * on headers or an illegal combination of parameters is used.\n */\n#define AV_LOG_FATAL     8\n\n/**\n * Something went wrong and cannot losslessly be recovered.\n * However, not all future data is affected.\n */\n#define AV_LOG_ERROR    16\n\n/**\n * Something somehow does not look correct. This may or may not\n * lead to problems. An example would be the use of '-vstrict -2'.\n */\n#define AV_LOG_WARNING  24\n\n/**\n * Standard information.\n */\n#define AV_LOG_INFO     32\n\n/**\n * Detailed information.\n */\n#define AV_LOG_VERBOSE  40\n\n/**\n * Stuff which is only useful for libav* developers.\n */\n#define AV_LOG_DEBUG    48\n\n/**\n * Extremely verbose debugging, useful for libav* development.\n */\n#define AV_LOG_TRACE    56\n\n#define AV_LOG_MAX_OFFSET (AV_LOG_TRACE - AV_LOG_QUIET)\n\n/**\n * @}\n */\n\n/**\n * Sets additional colors for extended debugging sessions.\n * @code\n   av_log(ctx, AV_LOG_DEBUG|AV_LOG_C(134), \"Message in purple\\n\");\n   @endcode\n * Requires 256color terminal support. Uses outside debugging is not\n * recommended.\n */\n#define AV_LOG_C(x) ((x) << 8)\n\n/**\n * Send the specified message to the log if the level is less than or equal\n * to the current av_log_level. By default, all logging messages are sent to\n * stderr. This behavior can be altered by setting a different logging callback\n * function.\n * @see av_log_set_callback\n *\n * @param avcl A pointer to an arbitrary struct of which the first field is a\n *        pointer to an AVClass struct or NULL if general log.\n * @param level The importance level of the message expressed using a @ref\n *        lavu_log_constants \"Logging Constant\".\n * @param fmt The format string (printf-compatible) that specifies how\n *        subsequent arguments are converted to output.\n */\nvoid av_log(void *avcl, int level, const char *fmt, ...) av_printf_format(3, 4);\n\n/**\n * Send the specified message to the log once with the initial_level and then with\n * the subsequent_level. By default, all logging messages are sent to\n * stderr. This behavior can be altered by setting a different logging callback\n * function.\n * @see av_log\n *\n * @param avcl A pointer to an arbitrary struct of which the first field is a\n *        pointer to an AVClass struct or NULL if general log.\n * @param initial_level importance level of the message expressed using a @ref\n *        lavu_log_constants \"Logging Constant\" for the first occurrence.\n * @param subsequent_level importance level of the message expressed using a @ref\n *        lavu_log_constants \"Logging Constant\" after the first occurrence.\n * @param fmt The format string (printf-compatible) that specifies how\n *        subsequent arguments are converted to output.\n * @param state a variable to keep trak of if a message has already been printed\n *        this must be initialized to 0 before the first use. The same state\n *        must not be accessed by 2 Threads simultaneously.\n */\nvoid av_log_once(void* avcl, int initial_level, int subsequent_level, int *state, const char *fmt, ...) av_printf_format(5, 6);\n\n\n/**\n * Send the specified message to the log if the level is less than or equal\n * to the current av_log_level. By default, all logging messages are sent to\n * stderr. This behavior can be altered by setting a different logging callback\n * function.\n * @see av_log_set_callback\n *\n * @param avcl A pointer to an arbitrary struct of which the first field is a\n *        pointer to an AVClass struct.\n * @param level The importance level of the message expressed using a @ref\n *        lavu_log_constants \"Logging Constant\".\n * @param fmt The format string (printf-compatible) that specifies how\n *        subsequent arguments are converted to output.\n * @param vl The arguments referenced by the format string.\n */\nvoid av_vlog(void *avcl, int level, const char *fmt, va_list vl);\n\n/**\n * Get the current log level\n *\n * @see lavu_log_constants\n *\n * @return Current log level\n */\nint av_log_get_level(void);\n\n/**\n * Set the log level\n *\n * @see lavu_log_constants\n *\n * @param level Logging level\n */\nvoid av_log_set_level(int level);\n\n/**\n * Set the logging callback\n *\n * @note The callback must be thread safe, even if the application does not use\n *       threads itself as some codecs are multithreaded.\n *\n * @see av_log_default_callback\n *\n * @param callback A logging function with a compatible signature.\n */\nvoid av_log_set_callback(void (*callback)(void*, int, const char*, va_list));\n\n/**\n * Default logging callback\n *\n * It prints the message to stderr, optionally colorizing it.\n *\n * @param avcl A pointer to an arbitrary struct of which the first field is a\n *        pointer to an AVClass struct.\n * @param level The importance level of the message expressed using a @ref\n *        lavu_log_constants \"Logging Constant\".\n * @param fmt The format string (printf-compatible) that specifies how\n *        subsequent arguments are converted to output.\n * @param vl The arguments referenced by the format string.\n */\nvoid av_log_default_callback(void *avcl, int level, const char *fmt,\n                             va_list vl);\n\n/**\n * Return the context name\n *\n * @param  ctx The AVClass context\n *\n * @return The AVClass class_name\n */\nconst char* av_default_item_name(void* ctx);\nAVClassCategory av_default_get_category(void *ptr);\n\n/**\n * Format a line of log the same way as the default callback.\n * @param line          buffer to receive the formatted line\n * @param line_size     size of the buffer\n * @param print_prefix  used to store whether the prefix must be printed;\n *                      must point to a persistent integer initially set to 1\n */\nvoid av_log_format_line(void *ptr, int level, const char *fmt, va_list vl,\n                        char *line, int line_size, int *print_prefix);\n\n/**\n * Format a line of log the same way as the default callback.\n * @param line          buffer to receive the formatted line;\n *                      may be NULL if line_size is 0\n * @param line_size     size of the buffer; at most line_size-1 characters will\n *                      be written to the buffer, plus one null terminator\n * @param print_prefix  used to store whether the prefix must be printed;\n *                      must point to a persistent integer initially set to 1\n * @return Returns a negative value if an error occurred, otherwise returns\n *         the number of characters that would have been written for a\n *         sufficiently large buffer, not including the terminating null\n *         character. If the return value is not less than line_size, it means\n *         that the log message was truncated to fit the buffer.\n */\nint av_log_format_line2(void *ptr, int level, const char *fmt, va_list vl,\n                        char *line, int line_size, int *print_prefix);\n\n/**\n * Skip repeated messages, this requires the user app to use av_log() instead of\n * (f)printf as the 2 would otherwise interfere and lead to\n * \"Last message repeated x times\" messages below (f)printf messages with some\n * bad luck.\n * Also to receive the last, \"last repeated\" line if any, the user app must\n * call av_log(NULL, AV_LOG_QUIET, \"%s\", \"\"); at the end\n */\n#define AV_LOG_SKIP_REPEATED 1\n\n/**\n * Include the log severity in messages originating from codecs.\n *\n * Results in messages such as:\n * [rawvideo @ 0xDEADBEEF] [error] encode did not produce valid pts\n */\n#define AV_LOG_PRINT_LEVEL 2\n\n/**\n * Include system time in log output.\n */\n#define AV_LOG_PRINT_TIME 4\n\n/**\n * Include system date and time in log output.\n */\n#define AV_LOG_PRINT_DATETIME 8\n\nvoid av_log_set_flags(int arg);\nint av_log_get_flags(void);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_LOG_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/lzo.h",
    "content": "/*\n * LZO 1x decompression\n * copyright (c) 2006 Reimar Doeffinger\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_LZO_H\n#define AVUTIL_LZO_H\n\n/**\n * @defgroup lavu_lzo LZO\n * @ingroup lavu_crypto\n *\n * @{\n */\n\n#include <stdint.h>\n\n/** @name Error flags returned by av_lzo1x_decode\n * @{ */\n/// end of the input buffer reached before decoding finished\n#define AV_LZO_INPUT_DEPLETED  1\n/// decoded data did not fit into output buffer\n#define AV_LZO_OUTPUT_FULL     2\n/// a reference to previously decoded data was wrong\n#define AV_LZO_INVALID_BACKPTR 4\n/// a non-specific error in the compressed bitstream\n#define AV_LZO_ERROR           8\n/** @} */\n\n#define AV_LZO_INPUT_PADDING   8\n#define AV_LZO_OUTPUT_PADDING 12\n\n/**\n * @brief Decodes LZO 1x compressed data.\n * @param out output buffer\n * @param outlen size of output buffer, number of bytes left are returned here\n * @param in input buffer\n * @param inlen size of input buffer, number of bytes left are returned here\n * @return 0 on success, otherwise a combination of the error flags above\n *\n * Make sure all buffers are appropriately padded, in must provide\n * AV_LZO_INPUT_PADDING, out must provide AV_LZO_OUTPUT_PADDING additional bytes.\n */\nint av_lzo1x_decode(void *out, int *outlen, const void *in, int *inlen);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_LZO_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/macros.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu\n * Utility Preprocessor macros\n */\n\n#ifndef AVUTIL_MACROS_H\n#define AVUTIL_MACROS_H\n\n#include \"libavutil/avconfig.h\"\n\n#if AV_HAVE_BIGENDIAN\n#   define AV_NE(be, le) (be)\n#else\n#   define AV_NE(be, le) (le)\n#endif\n\n/**\n * Comparator.\n * For two numerical expressions x and y, gives 1 if x > y, -1 if x < y, and 0\n * if x == y. This is useful for instance in a qsort comparator callback.\n * Furthermore, compilers are able to optimize this to branchless code, and\n * there is no risk of overflow with signed types.\n * As with many macros, this evaluates its argument multiple times, it thus\n * must not have a side-effect.\n */\n#define FFDIFFSIGN(x,y) (((x)>(y)) - ((x)<(y)))\n\n#define FFMAX(a,b) ((a) > (b) ? (a) : (b))\n#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c)\n#define FFMIN(a,b) ((a) > (b) ? (b) : (a))\n#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c)\n\n#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0)\n#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))\n\n#define MKTAG(a,b,c,d)   ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))\n#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24))\n\n/**\n * @addtogroup preproc_misc Preprocessor String Macros\n *\n * String manipulation macros\n *\n * @{\n */\n\n#define AV_STRINGIFY(s)         AV_TOSTRING(s)\n#define AV_TOSTRING(s) #s\n\n#define AV_GLUE(a, b) a ## b\n#define AV_JOIN(a, b) AV_GLUE(a, b)\n\n/**\n * @}\n */\n\n#define AV_PRAGMA(s) _Pragma(#s)\n\n#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1))\n\n#endif /* AVUTIL_MACROS_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/mastering_display_metadata.h",
    "content": "/*\n * Copyright (c) 2016 Neil Birkbeck <neil.birkbeck@gmail.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_MASTERING_DISPLAY_METADATA_H\n#define AVUTIL_MASTERING_DISPLAY_METADATA_H\n\n#include \"frame.h\"\n#include \"rational.h\"\n\n\n/**\n * Mastering display metadata capable of representing the color volume of\n * the display used to master the content (SMPTE 2086:2014).\n *\n * To be used as payload of a AVFrameSideData or AVPacketSideData with the\n * appropriate type.\n *\n * @note The struct should be allocated with av_mastering_display_metadata_alloc()\n *       and its size is not a part of the public ABI.\n */\ntypedef struct AVMasteringDisplayMetadata {\n    /**\n     * CIE 1931 xy chromaticity coords of color primaries (r, g, b order).\n     */\n    AVRational display_primaries[3][2];\n\n    /**\n     * CIE 1931 xy chromaticity coords of white point.\n     */\n    AVRational white_point[2];\n\n    /**\n     * Min luminance of mastering display (cd/m^2).\n     */\n    AVRational min_luminance;\n\n    /**\n     * Max luminance of mastering display (cd/m^2).\n     */\n    AVRational max_luminance;\n\n    /**\n     * Flag indicating whether the display primaries (and white point) are set.\n     */\n    int has_primaries;\n\n    /**\n     * Flag indicating whether the luminance (min_ and max_) have been set.\n     */\n    int has_luminance;\n\n} AVMasteringDisplayMetadata;\n\n/**\n * Allocate an AVMasteringDisplayMetadata structure and set its fields to\n * default values. The resulting struct can be freed using av_freep().\n *\n * @return An AVMasteringDisplayMetadata filled with default values or NULL\n *         on failure.\n */\nAVMasteringDisplayMetadata *av_mastering_display_metadata_alloc(void);\n\n/**\n * Allocate an AVMasteringDisplayMetadata structure and set its fields to\n * default values. The resulting struct can be freed using av_freep().\n *\n * @return An AVMasteringDisplayMetadata filled with default values or NULL\n *         on failure.\n */\nAVMasteringDisplayMetadata *av_mastering_display_metadata_alloc_size(size_t *size);\n\n/**\n * Allocate a complete AVMasteringDisplayMetadata and add it to the frame.\n *\n * @param frame The frame which side data is added to.\n *\n * @return The AVMasteringDisplayMetadata structure to be filled by caller.\n */\nAVMasteringDisplayMetadata *av_mastering_display_metadata_create_side_data(AVFrame *frame);\n\n/**\n * Content light level needed by to transmit HDR over HDMI (CTA-861.3).\n *\n * To be used as payload of a AVFrameSideData or AVPacketSideData with the\n * appropriate type.\n *\n * @note The struct should be allocated with av_content_light_metadata_alloc()\n *       and its size is not a part of the public ABI.\n */\ntypedef struct AVContentLightMetadata {\n    /**\n     * Max content light level (cd/m^2).\n     */\n    unsigned MaxCLL;\n\n    /**\n     * Max average light level per frame (cd/m^2).\n     */\n    unsigned MaxFALL;\n} AVContentLightMetadata;\n\n/**\n * Allocate an AVContentLightMetadata structure and set its fields to\n * default values. The resulting struct can be freed using av_freep().\n *\n * @return An AVContentLightMetadata filled with default values or NULL\n *         on failure.\n */\nAVContentLightMetadata *av_content_light_metadata_alloc(size_t *size);\n\n/**\n * Allocate a complete AVContentLightMetadata and add it to the frame.\n *\n * @param frame The frame which side data is added to.\n *\n * @return The AVContentLightMetadata structure to be filled by caller.\n */\nAVContentLightMetadata *av_content_light_metadata_create_side_data(AVFrame *frame);\n\n#endif /* AVUTIL_MASTERING_DISPLAY_METADATA_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/mathematics.h",
    "content": "/*\n * copyright (c) 2005-2012 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @addtogroup lavu_math\n * Mathematical utilities for working with timestamp and time base.\n */\n\n#ifndef AVUTIL_MATHEMATICS_H\n#define AVUTIL_MATHEMATICS_H\n\n#include <stdint.h>\n#include <math.h>\n#include \"attributes.h\"\n#include \"rational.h\"\n#include \"intfloat.h\"\n\n#ifndef M_E\n#define M_E            2.7182818284590452354   /* e */\n#endif\n#ifndef M_Ef\n#define M_Ef           2.7182818284590452354f  /* e */\n#endif\n#ifndef M_LN2\n#define M_LN2          0.69314718055994530942  /* log_e 2 */\n#endif\n#ifndef M_LN2f\n#define M_LN2f         0.69314718055994530942f /* log_e 2 */\n#endif\n#ifndef M_LN10\n#define M_LN10         2.30258509299404568402  /* log_e 10 */\n#endif\n#ifndef M_LN10f\n#define M_LN10f        2.30258509299404568402f /* log_e 10 */\n#endif\n#ifndef M_LOG2_10\n#define M_LOG2_10      3.32192809488736234787  /* log_2 10 */\n#endif\n#ifndef M_LOG2_10f\n#define M_LOG2_10f     3.32192809488736234787f /* log_2 10 */\n#endif\n#ifndef M_PHI\n#define M_PHI          1.61803398874989484820   /* phi / golden ratio */\n#endif\n#ifndef M_PHIf\n#define M_PHIf         1.61803398874989484820f  /* phi / golden ratio */\n#endif\n#ifndef M_PI\n#define M_PI           3.14159265358979323846  /* pi */\n#endif\n#ifndef M_PIf\n#define M_PIf          3.14159265358979323846f /* pi */\n#endif\n#ifndef M_PI_2\n#define M_PI_2         1.57079632679489661923  /* pi/2 */\n#endif\n#ifndef M_PI_2f\n#define M_PI_2f        1.57079632679489661923f /* pi/2 */\n#endif\n#ifndef M_PI_4\n#define M_PI_4         0.78539816339744830962  /* pi/4 */\n#endif\n#ifndef M_PI_4f\n#define M_PI_4f        0.78539816339744830962f /* pi/4 */\n#endif\n#ifndef M_1_PI\n#define M_1_PI         0.31830988618379067154  /* 1/pi */\n#endif\n#ifndef M_1_PIf\n#define M_1_PIf        0.31830988618379067154f /* 1/pi */\n#endif\n#ifndef M_2_PI\n#define M_2_PI         0.63661977236758134308  /* 2/pi */\n#endif\n#ifndef M_2_PIf\n#define M_2_PIf        0.63661977236758134308f /* 2/pi */\n#endif\n#ifndef M_2_SQRTPI\n#define M_2_SQRTPI     1.12837916709551257390  /* 2/sqrt(pi) */\n#endif\n#ifndef M_2_SQRTPIf\n#define M_2_SQRTPIf    1.12837916709551257390f /* 2/sqrt(pi) */\n#endif\n#ifndef M_SQRT1_2\n#define M_SQRT1_2      0.70710678118654752440  /* 1/sqrt(2) */\n#endif\n#ifndef M_SQRT1_2f\n#define M_SQRT1_2f     0.70710678118654752440f /* 1/sqrt(2) */\n#endif\n#ifndef M_SQRT2\n#define M_SQRT2        1.41421356237309504880  /* sqrt(2) */\n#endif\n#ifndef M_SQRT2f\n#define M_SQRT2f       1.41421356237309504880f /* sqrt(2) */\n#endif\n#ifndef NAN\n#define NAN            av_int2float(0x7fc00000)\n#endif\n#ifndef INFINITY\n#define INFINITY       av_int2float(0x7f800000)\n#endif\n\n/**\n * @addtogroup lavu_math\n *\n * @{\n */\n\n/**\n * Rounding methods.\n */\nenum AVRounding {\n    AV_ROUND_ZERO     = 0, ///< Round toward zero.\n    AV_ROUND_INF      = 1, ///< Round away from zero.\n    AV_ROUND_DOWN     = 2, ///< Round toward -infinity.\n    AV_ROUND_UP       = 3, ///< Round toward +infinity.\n    AV_ROUND_NEAR_INF = 5, ///< Round to nearest and halfway cases away from zero.\n    /**\n     * Flag telling rescaling functions to pass `INT64_MIN`/`MAX` through\n     * unchanged, avoiding special cases for #AV_NOPTS_VALUE.\n     *\n     * Unlike other values of the enumeration AVRounding, this value is a\n     * bitmask that must be used in conjunction with another value of the\n     * enumeration through a bitwise OR, in order to set behavior for normal\n     * cases.\n     *\n     * @code{.c}\n     * av_rescale_rnd(3, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX);\n     * // Rescaling 3:\n     * //     Calculating 3 * 1 / 2\n     * //     3 / 2 is rounded up to 2\n     * //     => 2\n     *\n     * av_rescale_rnd(AV_NOPTS_VALUE, 1, 2, AV_ROUND_UP | AV_ROUND_PASS_MINMAX);\n     * // Rescaling AV_NOPTS_VALUE:\n     * //     AV_NOPTS_VALUE == INT64_MIN\n     * //     AV_NOPTS_VALUE is passed through\n     * //     => AV_NOPTS_VALUE\n     * @endcode\n     */\n    AV_ROUND_PASS_MINMAX = 8192,\n};\n\n/**\n * Compute the greatest common divisor of two integer operands.\n *\n * @param a Operand\n * @param b Operand\n * @return GCD of a and b up to sign; if a >= 0 and b >= 0, return value is >= 0;\n * if a == 0 and b == 0, returns 0.\n */\nint64_t av_const av_gcd(int64_t a, int64_t b);\n\n/**\n * Rescale a 64-bit integer with rounding to nearest.\n *\n * The operation is mathematically equivalent to `a * b / c`, but writing that\n * directly can overflow.\n *\n * This function is equivalent to av_rescale_rnd() with #AV_ROUND_NEAR_INF.\n *\n * @see av_rescale_rnd(), av_rescale_q(), av_rescale_q_rnd()\n */\nint64_t av_rescale(int64_t a, int64_t b, int64_t c) av_const;\n\n/**\n * Rescale a 64-bit integer with specified rounding.\n *\n * The operation is mathematically equivalent to `a * b / c`, but writing that\n * directly can overflow, and does not support different rounding methods.\n * If the result is not representable then INT64_MIN is returned.\n *\n * @see av_rescale(), av_rescale_q(), av_rescale_q_rnd()\n */\nint64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd) av_const;\n\n/**\n * Rescale a 64-bit integer by 2 rational numbers.\n *\n * The operation is mathematically equivalent to `a * bq / cq`.\n *\n * This function is equivalent to av_rescale_q_rnd() with #AV_ROUND_NEAR_INF.\n *\n * @see av_rescale(), av_rescale_rnd(), av_rescale_q_rnd()\n */\nint64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq) av_const;\n\n/**\n * Rescale a 64-bit integer by 2 rational numbers with specified rounding.\n *\n * The operation is mathematically equivalent to `a * bq / cq`.\n *\n * @see av_rescale(), av_rescale_rnd(), av_rescale_q()\n */\nint64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq,\n                         enum AVRounding rnd) av_const;\n\n/**\n * Compare two timestamps each in its own time base.\n *\n * @return One of the following values:\n *         - -1 if `ts_a` is before `ts_b`\n *         - 1 if `ts_a` is after `ts_b`\n *         - 0 if they represent the same position\n *\n * @warning\n * The result of the function is undefined if one of the timestamps is outside\n * the `int64_t` range when represented in the other's timebase.\n */\nint av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b);\n\n/**\n * Compare the remainders of two integer operands divided by a common divisor.\n *\n * In other words, compare the least significant `log2(mod)` bits of integers\n * `a` and `b`.\n *\n * @code{.c}\n * av_compare_mod(0x11, 0x02, 0x10) < 0 // since 0x11 % 0x10  (0x1) < 0x02 % 0x10  (0x2)\n * av_compare_mod(0x11, 0x02, 0x20) > 0 // since 0x11 % 0x20 (0x11) > 0x02 % 0x20 (0x02)\n * @endcode\n *\n * @param a Operand\n * @param b Operand\n * @param mod Divisor; must be a power of 2\n * @return\n *         - a negative value if `a % mod < b % mod`\n *         - a positive value if `a % mod > b % mod`\n *         - zero             if `a % mod == b % mod`\n */\nint64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod);\n\n/**\n * Rescale a timestamp while preserving known durations.\n *\n * This function is designed to be called per audio packet to scale the input\n * timestamp to a different time base. Compared to a simple av_rescale_q()\n * call, this function is robust against possible inconsistent frame durations.\n *\n * The `last` parameter is a state variable that must be preserved for all\n * subsequent calls for the same stream. For the first call, `*last` should be\n * initialized to #AV_NOPTS_VALUE.\n *\n * @param[in]     in_tb    Input time base\n * @param[in]     in_ts    Input timestamp\n * @param[in]     fs_tb    Duration time base; typically this is finer-grained\n *                         (greater) than `in_tb` and `out_tb`\n * @param[in]     duration Duration till the next call to this function (i.e.\n *                         duration of the current packet/frame)\n * @param[in,out] last     Pointer to a timestamp expressed in terms of\n *                         `fs_tb`, acting as a state variable\n * @param[in]     out_tb   Output timebase\n * @return        Timestamp expressed in terms of `out_tb`\n *\n * @note In the context of this function, \"duration\" is in term of samples, not\n *       seconds.\n */\nint64_t av_rescale_delta(AVRational in_tb, int64_t in_ts,  AVRational fs_tb, int duration, int64_t *last, AVRational out_tb);\n\n/**\n * Add a value to a timestamp.\n *\n * This function guarantees that when the same value is repeatedly added that\n * no accumulation of rounding errors occurs.\n *\n * @param[in] ts     Input timestamp\n * @param[in] ts_tb  Input timestamp time base\n * @param[in] inc    Value to be added\n * @param[in] inc_tb Time base of `inc`\n */\nint64_t av_add_stable(AVRational ts_tb, int64_t ts, AVRational inc_tb, int64_t inc);\n\n/**\n * 0th order modified bessel function of the first kind.\n */\ndouble av_bessel_i0(double x);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_MATHEMATICS_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/md5.h",
    "content": "/*\n * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_md5\n * Public header for MD5 hash function implementation.\n */\n\n#ifndef AVUTIL_MD5_H\n#define AVUTIL_MD5_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"attributes.h\"\n\n/**\n * @defgroup lavu_md5 MD5\n * @ingroup lavu_hash\n * MD5 hash function implementation.\n *\n * @{\n */\n\nextern const int av_md5_size;\n\nstruct AVMD5;\n\n/**\n * Allocate an AVMD5 context.\n */\nstruct AVMD5 *av_md5_alloc(void);\n\n/**\n * Initialize MD5 hashing.\n *\n * @param ctx pointer to the function context (of size av_md5_size)\n */\nvoid av_md5_init(struct AVMD5 *ctx);\n\n/**\n * Update hash value.\n *\n * @param ctx hash function context\n * @param src input data to update hash with\n * @param len input data length\n */\nvoid av_md5_update(struct AVMD5 *ctx, const uint8_t *src, size_t len);\n\n/**\n * Finish hashing and output digest value.\n *\n * @param ctx hash function context\n * @param dst buffer where output digest value is stored\n */\nvoid av_md5_final(struct AVMD5 *ctx, uint8_t *dst);\n\n/**\n * Hash an array of data.\n *\n * @param dst The output buffer to write the digest into\n * @param src The data to hash\n * @param len The length of the data, in bytes\n */\nvoid av_md5_sum(uint8_t *dst, const uint8_t *src, size_t len);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_MD5_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/mem.h",
    "content": "/*\n * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_mem\n * Memory handling functions\n */\n\n#ifndef AVUTIL_MEM_H\n#define AVUTIL_MEM_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"attributes.h\"\n\n/**\n * @addtogroup lavu_mem\n * Utilities for manipulating memory.\n *\n * FFmpeg has several applications of memory that are not required of a typical\n * program. For example, the computing-heavy components like video decoding and\n * encoding can be sped up significantly through the use of aligned memory.\n *\n * However, for each of FFmpeg's applications of memory, there might not be a\n * recognized or standardized API for that specific use. Memory alignment, for\n * instance, varies wildly depending on operating systems, architectures, and\n * compilers. Hence, this component of @ref libavutil is created to make\n * dealing with memory consistently possible on all platforms.\n *\n * @{\n */\n\n/**\n * @defgroup lavu_mem_attrs Function Attributes\n * Function attributes applicable to memory handling functions.\n *\n * These function attributes can help compilers emit more useful warnings, or\n * generate better code.\n * @{\n */\n\n/**\n * @def av_malloc_attrib\n * Function attribute denoting a malloc-like function.\n *\n * @see <a href=\"https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-g_t_0040code_007bmalloc_007d-function-attribute-3251\">Function attribute `malloc` in GCC's documentation</a>\n */\n\n#if AV_GCC_VERSION_AT_LEAST(3,1)\n    #define av_malloc_attrib __attribute__((__malloc__))\n#else\n    #define av_malloc_attrib\n#endif\n\n/**\n * @def av_alloc_size(...)\n * Function attribute used on a function that allocates memory, whose size is\n * given by the specified parameter(s).\n *\n * @code{.c}\n * void *av_malloc(size_t size) av_alloc_size(1);\n * void *av_calloc(size_t nmemb, size_t size) av_alloc_size(1, 2);\n * @endcode\n *\n * @param ... One or two parameter indexes, separated by a comma\n *\n * @see <a href=\"https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-g_t_0040code_007balloc_005fsize_007d-function-attribute-3220\">Function attribute `alloc_size` in GCC's documentation</a>\n */\n\n#if AV_GCC_VERSION_AT_LEAST(4,3)\n    #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))\n#else\n    #define av_alloc_size(...)\n#endif\n\n/**\n * @}\n */\n\n/**\n * @defgroup lavu_mem_funcs Heap Management\n * Functions responsible for allocating, freeing, and copying memory.\n *\n * All memory allocation functions have a built-in upper limit of `INT_MAX`\n * bytes. This may be changed with av_max_alloc(), although exercise extreme\n * caution when doing so.\n *\n * @{\n */\n\n/**\n * Allocate a memory block with alignment suitable for all memory accesses\n * (including vectors if available on the CPU).\n *\n * @param size Size in bytes for the memory block to be allocated\n * @return Pointer to the allocated block, or `NULL` if the block cannot\n *         be allocated\n * @see av_mallocz()\n */\nvoid *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1);\n\n/**\n * Allocate a memory block with alignment suitable for all memory accesses\n * (including vectors if available on the CPU) and zero all the bytes of the\n * block.\n *\n * @param size Size in bytes for the memory block to be allocated\n * @return Pointer to the allocated block, or `NULL` if it cannot be allocated\n * @see av_malloc()\n */\nvoid *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1);\n\n/**\n * Allocate a memory block for an array with av_malloc().\n *\n * The allocated memory will have size `size * nmemb` bytes.\n *\n * @param nmemb Number of element\n * @param size  Size of a single element\n * @return Pointer to the allocated block, or `NULL` if the block cannot\n *         be allocated\n * @see av_malloc()\n */\nav_alloc_size(1, 2) void *av_malloc_array(size_t nmemb, size_t size);\n\n/**\n * Allocate a memory block for an array with av_mallocz().\n *\n * The allocated memory will have size `size * nmemb` bytes.\n *\n * @param nmemb Number of elements\n * @param size  Size of the single element\n * @return Pointer to the allocated block, or `NULL` if the block cannot\n *         be allocated\n *\n * @see av_mallocz()\n * @see av_malloc_array()\n */\nvoid *av_calloc(size_t nmemb, size_t size) av_malloc_attrib av_alloc_size(1, 2);\n\n/**\n * Allocate, reallocate, or free a block of memory.\n *\n * If `ptr` is `NULL` and `size` > 0, allocate a new block. Otherwise, expand or\n * shrink that block of memory according to `size`.\n *\n * @param ptr  Pointer to a memory block already allocated with\n *             av_realloc() or `NULL`\n * @param size Size in bytes of the memory block to be allocated or\n *             reallocated\n *\n * @return Pointer to a newly-reallocated block or `NULL` if the block\n *         cannot be reallocated\n *\n * @warning Unlike av_malloc(), the returned pointer is not guaranteed to be\n *          correctly aligned. The returned pointer must be freed after even\n *          if size is zero.\n * @see av_fast_realloc()\n * @see av_reallocp()\n */\nvoid *av_realloc(void *ptr, size_t size) av_alloc_size(2);\n\n/**\n * Allocate, reallocate, or free a block of memory through a pointer to a\n * pointer.\n *\n * If `*ptr` is `NULL` and `size` > 0, allocate a new block. If `size` is\n * zero, free the memory block pointed to by `*ptr`. Otherwise, expand or\n * shrink that block of memory according to `size`.\n *\n * @param[in,out] ptr  Pointer to a pointer to a memory block already allocated\n *                     with av_realloc(), or a pointer to `NULL`. The pointer\n *                     is updated on success, or freed on failure.\n * @param[in]     size Size in bytes for the memory block to be allocated or\n *                     reallocated\n *\n * @return Zero on success, an AVERROR error code on failure\n *\n * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be\n *          correctly aligned.\n */\nav_warn_unused_result\nint av_reallocp(void *ptr, size_t size);\n\n/**\n * Allocate, reallocate, or free a block of memory.\n *\n * This function does the same thing as av_realloc(), except:\n * - It takes two size arguments and allocates `nelem * elsize` bytes,\n *   after checking the result of the multiplication for integer overflow.\n * - It frees the input block in case of failure, thus avoiding the memory\n *   leak with the classic\n *   @code{.c}\n *   buf = realloc(buf);\n *   if (!buf)\n *       return -1;\n *   @endcode\n *   pattern.\n */\nvoid *av_realloc_f(void *ptr, size_t nelem, size_t elsize);\n\n/**\n * Allocate, reallocate, or free an array.\n *\n * If `ptr` is `NULL` and `nmemb` > 0, allocate a new block.\n *\n * @param ptr   Pointer to a memory block already allocated with\n *              av_realloc() or `NULL`\n * @param nmemb Number of elements in the array\n * @param size  Size of the single element of the array\n *\n * @return Pointer to a newly-reallocated block or NULL if the block\n *         cannot be reallocated\n *\n * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be\n *          correctly aligned. The returned pointer must be freed after even if\n *          nmemb is zero.\n * @see av_reallocp_array()\n */\nav_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size);\n\n/**\n * Allocate, reallocate an array through a pointer to a pointer.\n *\n * If `*ptr` is `NULL` and `nmemb` > 0, allocate a new block.\n *\n * @param[in,out] ptr   Pointer to a pointer to a memory block already\n *                      allocated with av_realloc(), or a pointer to `NULL`.\n *                      The pointer is updated on success, or freed on failure.\n * @param[in]     nmemb Number of elements\n * @param[in]     size  Size of the single element\n *\n * @return Zero on success, an AVERROR error code on failure\n *\n * @warning Unlike av_malloc(), the allocated memory is not guaranteed to be\n *          correctly aligned. *ptr must be freed after even if nmemb is zero.\n */\nint av_reallocp_array(void *ptr, size_t nmemb, size_t size);\n\n/**\n * Reallocate the given buffer if it is not large enough, otherwise do nothing.\n *\n * If the given buffer is `NULL`, then a new uninitialized buffer is allocated.\n *\n * If the given buffer is not large enough, and reallocation fails, `NULL` is\n * returned and `*size` is set to 0, but the original buffer is not changed or\n * freed.\n *\n * A typical use pattern follows:\n *\n * @code{.c}\n * uint8_t *buf = ...;\n * uint8_t *new_buf = av_fast_realloc(buf, &current_size, size_needed);\n * if (!new_buf) {\n *     // Allocation failed; clean up original buffer\n *     av_freep(&buf);\n *     return AVERROR(ENOMEM);\n * }\n * @endcode\n *\n * @param[in,out] ptr      Already allocated buffer, or `NULL`\n * @param[in,out] size     Pointer to the size of buffer `ptr`. `*size` is\n *                         updated to the new allocated size, in particular 0\n *                         in case of failure.\n * @param[in]     min_size Desired minimal size of buffer `ptr`\n * @return `ptr` if the buffer is large enough, a pointer to newly reallocated\n *         buffer if the buffer was not large enough, or `NULL` in case of\n *         error\n * @see av_realloc()\n * @see av_fast_malloc()\n */\nvoid *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size);\n\n/**\n * Allocate a buffer, reusing the given one if large enough.\n *\n * Contrary to av_fast_realloc(), the current buffer contents might not be\n * preserved and on error the old buffer is freed, thus no special handling to\n * avoid memleaks is necessary.\n *\n * `*ptr` is allowed to be `NULL`, in which case allocation always happens if\n * `size_needed` is greater than 0.\n *\n * @code{.c}\n * uint8_t *buf = ...;\n * av_fast_malloc(&buf, &current_size, size_needed);\n * if (!buf) {\n *     // Allocation failed; buf already freed\n *     return AVERROR(ENOMEM);\n * }\n * @endcode\n *\n * @param[in,out] ptr      Pointer to pointer to an already allocated buffer.\n *                         `*ptr` will be overwritten with pointer to new\n *                         buffer on success or `NULL` on failure\n * @param[in,out] size     Pointer to the size of buffer `*ptr`. `*size` is\n *                         updated to the new allocated size, in particular 0\n *                         in case of failure.\n * @param[in]     min_size Desired minimal size of buffer `*ptr`\n * @see av_realloc()\n * @see av_fast_mallocz()\n */\nvoid av_fast_malloc(void *ptr, unsigned int *size, size_t min_size);\n\n/**\n * Allocate and clear a buffer, reusing the given one if large enough.\n *\n * Like av_fast_malloc(), but all newly allocated space is initially cleared.\n * Reused buffer is not cleared.\n *\n * `*ptr` is allowed to be `NULL`, in which case allocation always happens if\n * `size_needed` is greater than 0.\n *\n * @param[in,out] ptr      Pointer to pointer to an already allocated buffer.\n *                         `*ptr` will be overwritten with pointer to new\n *                         buffer on success or `NULL` on failure\n * @param[in,out] size     Pointer to the size of buffer `*ptr`. `*size` is\n *                         updated to the new allocated size, in particular 0\n *                         in case of failure.\n * @param[in]     min_size Desired minimal size of buffer `*ptr`\n * @see av_fast_malloc()\n */\nvoid av_fast_mallocz(void *ptr, unsigned int *size, size_t min_size);\n\n/**\n * Free a memory block which has been allocated with a function of av_malloc()\n * or av_realloc() family.\n *\n * @param ptr Pointer to the memory block which should be freed.\n *\n * @note `ptr = NULL` is explicitly allowed.\n * @note It is recommended that you use av_freep() instead, to prevent leaving\n *       behind dangling pointers.\n * @see av_freep()\n */\nvoid av_free(void *ptr);\n\n/**\n * Free a memory block which has been allocated with a function of av_malloc()\n * or av_realloc() family, and set the pointer pointing to it to `NULL`.\n *\n * @code{.c}\n * uint8_t *buf = av_malloc(16);\n * av_free(buf);\n * // buf now contains a dangling pointer to freed memory, and accidental\n * // dereference of buf will result in a use-after-free, which may be a\n * // security risk.\n *\n * uint8_t *buf = av_malloc(16);\n * av_freep(&buf);\n * // buf is now NULL, and accidental dereference will only result in a\n * // NULL-pointer dereference.\n * @endcode\n *\n * @param ptr Pointer to the pointer to the memory block which should be freed\n * @note `*ptr = NULL` is safe and leads to no action.\n * @see av_free()\n */\nvoid av_freep(void *ptr);\n\n/**\n * Duplicate a string.\n *\n * @param s String to be duplicated\n * @return Pointer to a newly-allocated string containing a\n *         copy of `s` or `NULL` if the string cannot be allocated\n * @see av_strndup()\n */\nchar *av_strdup(const char *s) av_malloc_attrib;\n\n/**\n * Duplicate a substring of a string.\n *\n * @param s   String to be duplicated\n * @param len Maximum length of the resulting string (not counting the\n *            terminating byte)\n * @return Pointer to a newly-allocated string containing a\n *         substring of `s` or `NULL` if the string cannot be allocated\n */\nchar *av_strndup(const char *s, size_t len) av_malloc_attrib;\n\n/**\n * Duplicate a buffer with av_malloc().\n *\n * @param p    Buffer to be duplicated\n * @param size Size in bytes of the buffer copied\n * @return Pointer to a newly allocated buffer containing a\n *         copy of `p` or `NULL` if the buffer cannot be allocated\n */\nvoid *av_memdup(const void *p, size_t size);\n\n/**\n * Overlapping memcpy() implementation.\n *\n * @param dst  Destination buffer\n * @param back Number of bytes back to start copying (i.e. the initial size of\n *             the overlapping window); must be > 0\n * @param cnt  Number of bytes to copy; must be >= 0\n *\n * @note `cnt > back` is valid, this will copy the bytes we just copied,\n *       thus creating a repeating pattern with a period length of `back`.\n */\nvoid av_memcpy_backptr(uint8_t *dst, int back, int cnt);\n\n/**\n * @}\n */\n\n/**\n * @defgroup lavu_mem_dynarray Dynamic Array\n *\n * Utilities to make an array grow when needed.\n *\n * Sometimes, the programmer would want to have an array that can grow when\n * needed. The libavutil dynamic array utilities fill that need.\n *\n * libavutil supports two systems of appending elements onto a dynamically\n * allocated array, the first one storing the pointer to the value in the\n * array, and the second storing the value directly. In both systems, the\n * caller is responsible for maintaining a variable containing the length of\n * the array, as well as freeing of the array after use.\n *\n * The first system stores pointers to values in a block of dynamically\n * allocated memory. Since only pointers are stored, the function does not need\n * to know the size of the type. Both av_dynarray_add() and\n * av_dynarray_add_nofree() implement this system.\n *\n * @code\n * type **array = NULL; //< an array of pointers to values\n * int    nb    = 0;    //< a variable to keep track of the length of the array\n *\n * type to_be_added  = ...;\n * type to_be_added2 = ...;\n *\n * av_dynarray_add(&array, &nb, &to_be_added);\n * if (nb == 0)\n *     return AVERROR(ENOMEM);\n *\n * av_dynarray_add(&array, &nb, &to_be_added2);\n * if (nb == 0)\n *     return AVERROR(ENOMEM);\n *\n * // Now:\n * //  nb           == 2\n * // &to_be_added  == array[0]\n * // &to_be_added2 == array[1]\n *\n * av_freep(&array);\n * @endcode\n *\n * The second system stores the value directly in a block of memory. As a\n * result, the function has to know the size of the type. av_dynarray2_add()\n * implements this mechanism.\n *\n * @code\n * type *array = NULL; //< an array of values\n * int   nb    = 0;    //< a variable to keep track of the length of the array\n *\n * type to_be_added  = ...;\n * type to_be_added2 = ...;\n *\n * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array), NULL);\n * if (!addr)\n *     return AVERROR(ENOMEM);\n * memcpy(addr, &to_be_added, sizeof(to_be_added));\n *\n * // Shortcut of the above.\n * type *addr = av_dynarray2_add((void **)&array, &nb, sizeof(*array),\n *                               (const void *)&to_be_added2);\n * if (!addr)\n *     return AVERROR(ENOMEM);\n *\n * // Now:\n * //  nb           == 2\n * //  to_be_added  == array[0]\n * //  to_be_added2 == array[1]\n *\n * av_freep(&array);\n * @endcode\n *\n * @{\n */\n\n/**\n * Add the pointer to an element to a dynamic array.\n *\n * The array to grow is supposed to be an array of pointers to\n * structures, and the element to add must be a pointer to an already\n * allocated structure.\n *\n * The array is reallocated when its size reaches powers of 2.\n * Therefore, the amortized cost of adding an element is constant.\n *\n * In case of success, the pointer to the array is updated in order to\n * point to the new grown array, and the number pointed to by `nb_ptr`\n * is incremented.\n * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and\n * `*nb_ptr` is set to 0.\n *\n * @param[in,out] tab_ptr Pointer to the array to grow\n * @param[in,out] nb_ptr  Pointer to the number of elements in the array\n * @param[in]     elem    Element to add\n * @see av_dynarray_add_nofree(), av_dynarray2_add()\n */\nvoid av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem);\n\n/**\n * Add an element to a dynamic array.\n *\n * Function has the same functionality as av_dynarray_add(),\n * but it doesn't free memory on fails. It returns error code\n * instead and leave current buffer untouched.\n *\n * @return >=0 on success, negative otherwise\n * @see av_dynarray_add(), av_dynarray2_add()\n */\nav_warn_unused_result\nint av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem);\n\n/**\n * Add an element of size `elem_size` to a dynamic array.\n *\n * The array is reallocated when its number of elements reaches powers of 2.\n * Therefore, the amortized cost of adding an element is constant.\n *\n * In case of success, the pointer to the array is updated in order to\n * point to the new grown array, and the number pointed to by `nb_ptr`\n * is incremented.\n * In case of failure, the array is freed, `*tab_ptr` is set to `NULL` and\n * `*nb_ptr` is set to 0.\n *\n * @param[in,out] tab_ptr   Pointer to the array to grow\n * @param[in,out] nb_ptr    Pointer to the number of elements in the array\n * @param[in]     elem_size Size in bytes of an element in the array\n * @param[in]     elem_data Pointer to the data of the element to add. If\n *                          `NULL`, the space of the newly added element is\n *                          allocated but left uninitialized.\n *\n * @return Pointer to the data of the element to copy in the newly allocated\n *         space\n * @see av_dynarray_add(), av_dynarray_add_nofree()\n */\nvoid *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size,\n                       const uint8_t *elem_data);\n\n/**\n * @}\n */\n\n/**\n * @defgroup lavu_mem_misc Miscellaneous Functions\n *\n * Other functions related to memory allocation.\n *\n * @{\n */\n\n/**\n * Multiply two `size_t` values checking for overflow.\n *\n * @param[in]  a   Operand of multiplication\n * @param[in]  b   Operand of multiplication\n * @param[out] r   Pointer to the result of the operation\n * @return 0 on success, AVERROR(EINVAL) on overflow\n */\nint av_size_mult(size_t a, size_t b, size_t *r);\n\n/**\n * Set the maximum size that may be allocated in one block.\n *\n * The value specified with this function is effective for all libavutil's @ref\n * lavu_mem_funcs \"heap management functions.\"\n *\n * By default, the max value is defined as `INT_MAX`.\n *\n * @param max Value to be set as the new maximum size\n *\n * @warning Exercise extreme caution when using this function. Don't touch\n *          this if you do not understand the full consequence of doing so.\n */\nvoid av_max_alloc(size_t max);\n\n/**\n * @}\n * @}\n */\n\n#endif /* AVUTIL_MEM_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/motion_vector.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_MOTION_VECTOR_H\n#define AVUTIL_MOTION_VECTOR_H\n\n#include <stdint.h>\n\ntypedef struct AVMotionVector {\n    /**\n     * Where the current macroblock comes from; negative value when it comes\n     * from the past, positive value when it comes from the future.\n     * XXX: set exact relative ref frame reference instead of a +/- 1 \"direction\".\n     */\n    int32_t source;\n    /**\n     * Width and height of the block.\n     */\n    uint8_t w, h;\n    /**\n     * Absolute source position. Can be outside the frame area.\n     */\n    int16_t src_x, src_y;\n    /**\n     * Absolute destination position. Can be outside the frame area.\n     */\n    int16_t dst_x, dst_y;\n    /**\n     * Extra flag information.\n     * Currently unused.\n     */\n    uint64_t flags;\n    /**\n     * Motion vector\n     * src_x = dst_x + motion_x / motion_scale\n     * src_y = dst_y + motion_y / motion_scale\n     */\n    int32_t motion_x, motion_y;\n    uint16_t motion_scale;\n} AVMotionVector;\n\n#endif /* AVUTIL_MOTION_VECTOR_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/murmur3.h",
    "content": "/*\n * Copyright (C) 2013 Reimar Döffinger <Reimar.Doeffinger@gmx.de>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_murmur3\n * Public header for MurmurHash3 hash function implementation.\n */\n\n#ifndef AVUTIL_MURMUR3_H\n#define AVUTIL_MURMUR3_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n/**\n * @defgroup lavu_murmur3 Murmur3\n * @ingroup lavu_hash\n * MurmurHash3 hash function implementation.\n *\n * MurmurHash3 is a non-cryptographic hash function, of which three\n * incompatible versions were created by its inventor Austin Appleby:\n *\n * - 32-bit output\n * - 128-bit output for 32-bit platforms\n * - 128-bit output for 64-bit platforms\n *\n * FFmpeg only implements the last variant: 128-bit output designed for 64-bit\n * platforms. Even though the hash function was designed for 64-bit platforms,\n * the function in reality works on 32-bit systems too, only with reduced\n * performance.\n *\n * @anchor lavu_murmur3_seedinfo\n * By design, MurmurHash3 requires a seed to operate. In response to this,\n * libavutil provides two functions for hash initiation, one that requires a\n * seed (av_murmur3_init_seeded()) and one that uses a fixed arbitrary integer\n * as the seed, and therefore does not (av_murmur3_init()).\n *\n * To make hashes comparable, you should provide the same seed for all calls to\n * this hash function -- if you are supplying one yourself, that is.\n *\n * @{\n */\n\n/**\n * Allocate an AVMurMur3 hash context.\n *\n * @return Uninitialized hash context or `NULL` in case of error\n */\nstruct AVMurMur3 *av_murmur3_alloc(void);\n\n/**\n * Initialize or reinitialize an AVMurMur3 hash context with a seed.\n *\n * @param[out] c    Hash context\n * @param[in]  seed Random seed\n *\n * @see av_murmur3_init()\n * @see @ref lavu_murmur3_seedinfo \"Detailed description\" on a discussion of\n * seeds for MurmurHash3.\n */\nvoid av_murmur3_init_seeded(struct AVMurMur3 *c, uint64_t seed);\n\n/**\n * Initialize or reinitialize an AVMurMur3 hash context.\n *\n * Equivalent to av_murmur3_init_seeded() with a built-in seed.\n *\n * @param[out] c    Hash context\n *\n * @see av_murmur3_init_seeded()\n * @see @ref lavu_murmur3_seedinfo \"Detailed description\" on a discussion of\n * seeds for MurmurHash3.\n */\nvoid av_murmur3_init(struct AVMurMur3 *c);\n\n/**\n * Update hash context with new data.\n *\n * @param[out] c    Hash context\n * @param[in]  src  Input data to update hash with\n * @param[in]  len  Number of bytes to read from `src`\n */\nvoid av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, size_t len);\n\n/**\n * Finish hashing and output digest value.\n *\n * @param[in,out] c    Hash context\n * @param[out]    dst  Buffer where output digest value is stored\n */\nvoid av_murmur3_final(struct AVMurMur3 *c, uint8_t dst[16]);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_MURMUR3_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/opt.h",
    "content": "/*\n * AVOptions\n * copyright (c) 2005 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_OPT_H\n#define AVUTIL_OPT_H\n\n/**\n * @file\n * AVOptions\n */\n\n#include \"rational.h\"\n#include \"avutil.h\"\n#include \"channel_layout.h\"\n#include \"dict.h\"\n#include \"log.h\"\n#include \"pixfmt.h\"\n#include \"samplefmt.h\"\n\n/**\n * @defgroup avoptions AVOptions\n * @ingroup lavu_data\n * @{\n * AVOptions provide a generic system to declare options on arbitrary structs\n * (\"objects\"). An option can have a help text, a type and a range of possible\n * values. Options may then be enumerated, read and written to.\n *\n * There are two modes of access to members of AVOption and its child structs.\n * One is called 'native access', and refers to access from the code that\n * declares the AVOption in question.  The other is 'foreign access', and refers\n * to access from other code.\n *\n * Certain struct members in this header are documented as 'native access only'\n * or similar - it means that only the code that declared the AVOption in\n * question is allowed to access the field. This allows us to extend the\n * semantics of those fields without breaking API compatibility.\n *\n * @section avoptions_scope Scope of AVOptions\n *\n * AVOptions is designed to support any set of multimedia configuration options\n * that can be defined at compile-time.  Although it is mainly used to expose\n * FFmpeg options, you are welcome to adapt it to your own use case.\n *\n * No single approach can ever fully solve the problem of configuration,\n * but please submit a patch if you believe you have found a problem\n * that is best solved by extending AVOptions.\n *\n * @section avoptions_implement Implementing AVOptions\n * This section describes how to add AVOptions capabilities to a struct.\n *\n * All AVOptions-related information is stored in an AVClass. Therefore\n * the first member of the struct should be a pointer to an AVClass describing it.\n * The option field of the AVClass must be set to a NULL-terminated static array\n * of AVOptions. Each AVOption must have a non-empty name, a type, a default\n * value and for number-type AVOptions also a range of allowed values. It must\n * also declare an offset in bytes from the start of the struct, where the field\n * associated with this AVOption is located. Other fields in the AVOption struct\n * should also be set when applicable, but are not required.\n *\n * The following example illustrates an AVOptions-enabled struct:\n * @code\n * typedef struct test_struct {\n *     const AVClass *class;\n *     int      int_opt;\n *     char    *str_opt;\n *     uint8_t *bin_opt;\n *     int      bin_len;\n * } test_struct;\n *\n * static const AVOption test_options[] = {\n *   { \"test_int\", \"This is a test option of int type.\", offsetof(test_struct, int_opt),\n *     AV_OPT_TYPE_INT, { .i64 = -1 }, INT_MIN, INT_MAX },\n *   { \"test_str\", \"This is a test option of string type.\", offsetof(test_struct, str_opt),\n *     AV_OPT_TYPE_STRING },\n *   { \"test_bin\", \"This is a test option of binary type.\", offsetof(test_struct, bin_opt),\n *     AV_OPT_TYPE_BINARY },\n *   { NULL },\n * };\n *\n * static const AVClass test_class = {\n *     .class_name = \"test class\",\n *     .item_name  = av_default_item_name,\n *     .option     = test_options,\n *     .version    = LIBAVUTIL_VERSION_INT,\n * };\n * @endcode\n *\n * Next, when allocating your struct, you must ensure that the AVClass pointer\n * is set to the correct value. Then, av_opt_set_defaults() can be called to\n * initialize defaults. After that the struct is ready to be used with the\n * AVOptions API.\n *\n * When cleaning up, you may use the av_opt_free() function to automatically\n * free all the allocated string and binary options.\n *\n * Continuing with the above example:\n *\n * @code\n * test_struct *alloc_test_struct(void)\n * {\n *     test_struct *ret = av_mallocz(sizeof(*ret));\n *     ret->class = &test_class;\n *     av_opt_set_defaults(ret);\n *     return ret;\n * }\n * void free_test_struct(test_struct **foo)\n * {\n *     av_opt_free(*foo);\n *     av_freep(foo);\n * }\n * @endcode\n *\n * @subsection avoptions_implement_nesting Nesting\n *      It may happen that an AVOptions-enabled struct contains another\n *      AVOptions-enabled struct as a member (e.g. AVCodecContext in\n *      libavcodec exports generic options, while its priv_data field exports\n *      codec-specific options). In such a case, it is possible to set up the\n *      parent struct to export a child's options. To do that, simply\n *      implement AVClass.child_next() and AVClass.child_class_iterate() in the\n *      parent struct's AVClass.\n *      Assuming that the test_struct from above now also contains a\n *      child_struct field:\n *\n *      @code\n *      typedef struct child_struct {\n *          AVClass *class;\n *          int flags_opt;\n *      } child_struct;\n *      static const AVOption child_opts[] = {\n *          { \"test_flags\", \"This is a test option of flags type.\",\n *            offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX },\n *          { NULL },\n *      };\n *      static const AVClass child_class = {\n *          .class_name = \"child class\",\n *          .item_name  = av_default_item_name,\n *          .option     = child_opts,\n *          .version    = LIBAVUTIL_VERSION_INT,\n *      };\n *\n *      void *child_next(void *obj, void *prev)\n *      {\n *          test_struct *t = obj;\n *          if (!prev && t->child_struct)\n *              return t->child_struct;\n *          return NULL\n *      }\n *      const AVClass child_class_iterate(void **iter)\n *      {\n *          const AVClass *c = *iter ? NULL : &child_class;\n *          *iter = (void*)(uintptr_t)c;\n *          return c;\n *      }\n *      @endcode\n *      Putting child_next() and child_class_iterate() as defined above into\n *      test_class will now make child_struct's options accessible through\n *      test_struct (again, proper setup as described above needs to be done on\n *      child_struct right after it is created).\n *\n *      From the above example it might not be clear why both child_next()\n *      and child_class_iterate() are needed. The distinction is that child_next()\n *      iterates over actually existing objects, while child_class_iterate()\n *      iterates over all possible child classes. E.g. if an AVCodecContext\n *      was initialized to use a codec which has private options, then its\n *      child_next() will return AVCodecContext.priv_data and finish\n *      iterating. OTOH child_class_iterate() on AVCodecContext.av_class will\n *      iterate over all available codecs with private options.\n *\n * @subsection avoptions_implement_named_constants Named constants\n *      It is possible to create named constants for options. Simply set the unit\n *      field of the option the constants should apply to a string and\n *      create the constants themselves as options of type AV_OPT_TYPE_CONST\n *      with their unit field set to the same string.\n *      Their default_val field should contain the value of the named\n *      constant.\n *      For example, to add some named constants for the test_flags option\n *      above, put the following into the child_opts array:\n *      @code\n *      { \"test_flags\", \"This is a test option of flags type.\",\n *        offsetof(child_struct, flags_opt), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT_MIN, INT_MAX, \"test_unit\" },\n *      { \"flag1\", \"This is a flag with value 16\", 0, AV_OPT_TYPE_CONST, { .i64 = 16 }, 0, 0, \"test_unit\" },\n *      @endcode\n *\n * @section avoptions_use Using AVOptions\n * This section deals with accessing options in an AVOptions-enabled struct.\n * Such structs in FFmpeg are e.g. AVCodecContext in libavcodec or\n * AVFormatContext in libavformat.\n *\n * @subsection avoptions_use_examine Examining AVOptions\n * The basic functions for examining options are av_opt_next(), which iterates\n * over all options defined for one object, and av_opt_find(), which searches\n * for an option with the given name.\n *\n * The situation is more complicated with nesting. An AVOptions-enabled struct\n * may have AVOptions-enabled children. Passing the AV_OPT_SEARCH_CHILDREN flag\n * to av_opt_find() will make the function search children recursively.\n *\n * For enumerating there are basically two cases. The first is when you want to\n * get all options that may potentially exist on the struct and its children\n * (e.g.  when constructing documentation). In that case you should call\n * av_opt_child_class_iterate() recursively on the parent struct's AVClass.  The\n * second case is when you have an already initialized struct with all its\n * children and you want to get all options that can be actually written or read\n * from it. In that case you should call av_opt_child_next() recursively (and\n * av_opt_next() on each result).\n *\n * @subsection avoptions_use_get_set Reading and writing AVOptions\n * When setting options, you often have a string read directly from the\n * user. In such a case, simply passing it to av_opt_set() is enough. For\n * non-string type options, av_opt_set() will parse the string according to the\n * option type.\n *\n * Similarly av_opt_get() will read any option type and convert it to a string\n * which will be returned. Do not forget that the string is allocated, so you\n * have to free it with av_free().\n *\n * In some cases it may be more convenient to put all options into an\n * AVDictionary and call av_opt_set_dict() on it. A specific case of this\n * are the format/codec open functions in lavf/lavc which take a dictionary\n * filled with option as a parameter. This makes it possible to set some options\n * that cannot be set otherwise, since e.g. the input file format is not known\n * before the file is actually opened.\n */\n\n/**\n * An option type determines:\n * - for native access, the underlying C type of the field that an AVOption\n *   refers to;\n * - for foreign access, the semantics of accessing the option through this API,\n *   e.g. which av_opt_get_*() and av_opt_set_*() functions can be called, or\n *   what format will av_opt_get()/av_opt_set() expect/produce.\n */\nenum AVOptionType{\n    /**\n     * Underlying C type is unsigned int.\n     */\n    AV_OPT_TYPE_FLAGS = 1,\n    /**\n     * Underlying C type is int.\n     */\n    AV_OPT_TYPE_INT,\n    /**\n     * Underlying C type is int64_t.\n     */\n    AV_OPT_TYPE_INT64,\n    /**\n     * Underlying C type is double.\n     */\n    AV_OPT_TYPE_DOUBLE,\n    /**\n     * Underlying C type is float.\n     */\n    AV_OPT_TYPE_FLOAT,\n    /**\n     * Underlying C type is a uint8_t* that is either NULL or points to a C\n     * string allocated with the av_malloc() family of functions.\n     */\n    AV_OPT_TYPE_STRING,\n    /**\n     * Underlying C type is AVRational.\n     */\n    AV_OPT_TYPE_RATIONAL,\n    /**\n     * Underlying C type is a uint8_t* that is either NULL or points to an array\n     * allocated with the av_malloc() family of functions. The pointer is\n     * immediately followed by an int containing the array length in bytes.\n     */\n    AV_OPT_TYPE_BINARY,\n    /**\n     * Underlying C type is AVDictionary*.\n     */\n    AV_OPT_TYPE_DICT,\n    /**\n     * Underlying C type is uint64_t.\n     */\n    AV_OPT_TYPE_UINT64,\n    /**\n     * Special option type for declaring named constants. Does not correspond to\n     * an actual field in the object, offset must be 0.\n     */\n    AV_OPT_TYPE_CONST,\n    /**\n     * Underlying C type is two consecutive integers.\n     */\n    AV_OPT_TYPE_IMAGE_SIZE,\n    /**\n     * Underlying C type is enum AVPixelFormat.\n     */\n    AV_OPT_TYPE_PIXEL_FMT,\n    /**\n     * Underlying C type is enum AVSampleFormat.\n     */\n    AV_OPT_TYPE_SAMPLE_FMT,\n    /**\n     * Underlying C type is AVRational.\n     */\n    AV_OPT_TYPE_VIDEO_RATE,\n    /**\n     * Underlying C type is int64_t.\n     */\n    AV_OPT_TYPE_DURATION,\n    /**\n     * Underlying C type is uint8_t[4].\n     */\n    AV_OPT_TYPE_COLOR,\n    /**\n     * Underlying C type is int.\n     */\n    AV_OPT_TYPE_BOOL,\n    /**\n     * Underlying C type is AVChannelLayout.\n     */\n    AV_OPT_TYPE_CHLAYOUT,\n    /**\n     * Underlying C type is unsigned int.\n     */\n    AV_OPT_TYPE_UINT,\n\n    /**\n     * May be combined with another regular option type to declare an array\n     * option.\n     *\n     * For array options, @ref AVOption.offset should refer to a pointer\n     * corresponding to the option type. The pointer should be immediately\n     * followed by an unsigned int that will store the number of elements in the\n     * array.\n     */\n    AV_OPT_TYPE_FLAG_ARRAY = (1 << 16),\n};\n\n/**\n * A generic parameter which can be set by the user for muxing or encoding.\n */\n#define AV_OPT_FLAG_ENCODING_PARAM  (1 << 0)\n/**\n * A generic parameter which can be set by the user for demuxing or decoding.\n */\n#define AV_OPT_FLAG_DECODING_PARAM  (1 << 1)\n#define AV_OPT_FLAG_AUDIO_PARAM     (1 << 3)\n#define AV_OPT_FLAG_VIDEO_PARAM     (1 << 4)\n#define AV_OPT_FLAG_SUBTITLE_PARAM  (1 << 5)\n/**\n * The option is intended for exporting values to the caller.\n */\n#define AV_OPT_FLAG_EXPORT          (1 << 6)\n/**\n * The option may not be set through the AVOptions API, only read.\n * This flag only makes sense when AV_OPT_FLAG_EXPORT is also set.\n */\n#define AV_OPT_FLAG_READONLY        (1 << 7)\n/**\n * A generic parameter which can be set by the user for bit stream filtering.\n */\n#define AV_OPT_FLAG_BSF_PARAM       (1 << 8)\n\n/**\n * A generic parameter which can be set by the user at runtime.\n */\n#define AV_OPT_FLAG_RUNTIME_PARAM   (1 << 15)\n/**\n * A generic parameter which can be set by the user for filtering.\n */\n#define AV_OPT_FLAG_FILTERING_PARAM (1 << 16)\n/**\n * Set if option is deprecated, users should refer to AVOption.help text for\n * more information.\n */\n#define AV_OPT_FLAG_DEPRECATED      (1 << 17)\n/**\n * Set if option constants can also reside in child objects.\n */\n#define AV_OPT_FLAG_CHILD_CONSTS    (1 << 18)\n\n/**\n * May be set as default_val for AV_OPT_TYPE_FLAG_ARRAY options.\n */\ntypedef struct AVOptionArrayDef {\n    /**\n     * Native access only.\n     *\n     * Default value of the option, as would be serialized by av_opt_get() (i.e.\n     * using the value of sep as the separator).\n     */\n    const char         *def;\n\n    /**\n     * Minimum number of elements in the array. When this field is non-zero, def\n     * must be non-NULL and contain at least this number of elements.\n     */\n    unsigned            size_min;\n    /**\n     * Maximum number of elements in the array, 0 when unlimited.\n     */\n    unsigned            size_max;\n\n    /**\n     * Separator between array elements in string representations of this\n     * option, used by av_opt_set() and av_opt_get(). It must be a printable\n     * ASCII character, excluding alphanumeric and the backslash. A comma is\n     * used when sep=0.\n     *\n     * The separator and the backslash must be backslash-escaped in order to\n     * appear in string representations of the option value.\n     */\n    char                sep;\n} AVOptionArrayDef;\n\n/**\n * AVOption\n */\ntypedef struct AVOption {\n    const char *name;\n\n    /**\n     * short English help text\n     * @todo What about other languages?\n     */\n    const char *help;\n\n    /**\n     * Native access only.\n     *\n     * The offset relative to the context structure where the option\n     * value is stored. It should be 0 for named constants.\n     */\n    int offset;\n    enum AVOptionType type;\n\n    /**\n     * Native access only, except when documented otherwise.\n     * the default value for scalar options\n     */\n    union {\n        int64_t i64;\n        double dbl;\n        const char *str;\n        /* TODO those are unused now */\n        AVRational q;\n\n        /**\n         * Used for AV_OPT_TYPE_FLAG_ARRAY options. May be NULL.\n         *\n         * Foreign access to some members allowed, as noted in AVOptionArrayDef\n         * documentation.\n         */\n        const AVOptionArrayDef *arr;\n    } default_val;\n    double min;                 ///< minimum valid value for the option\n    double max;                 ///< maximum valid value for the option\n\n    /**\n     * A combination of AV_OPT_FLAG_*.\n     */\n    int flags;\n\n    /**\n     * The logical unit to which the option belongs. Non-constant\n     * options and corresponding named constants share the same\n     * unit. May be NULL.\n     */\n    const char *unit;\n} AVOption;\n\n/**\n * A single allowed range of values, or a single allowed value.\n */\ntypedef struct AVOptionRange {\n    const char *str;\n    /**\n     * Value range.\n     * For string ranges this represents the min/max length.\n     * For dimensions this represents the min/max pixel count or width/height in multi-component case.\n     */\n    double value_min, value_max;\n    /**\n     * Value's component range.\n     * For string this represents the unicode range for chars, 0-127 limits to ASCII.\n     */\n    double component_min, component_max;\n    /**\n     * Range flag.\n     * If set to 1 the struct encodes a range, if set to 0 a single value.\n     */\n    int is_range;\n} AVOptionRange;\n\n/**\n * List of AVOptionRange structs.\n */\ntypedef struct AVOptionRanges {\n    /**\n     * Array of option ranges.\n     *\n     * Most of option types use just one component.\n     * Following describes multi-component option types:\n     *\n     * AV_OPT_TYPE_IMAGE_SIZE:\n     * component index 0: range of pixel count (width * height).\n     * component index 1: range of width.\n     * component index 2: range of height.\n     *\n     * @note To obtain multi-component version of this structure, user must\n     *       provide AV_OPT_MULTI_COMPONENT_RANGE to av_opt_query_ranges or\n     *       av_opt_query_ranges_default function.\n     *\n     * Multi-component range can be read as in following example:\n     *\n     * @code\n     * int range_index, component_index;\n     * AVOptionRanges *ranges;\n     * AVOptionRange *range[3]; //may require more than 3 in the future.\n     * av_opt_query_ranges(&ranges, obj, key, AV_OPT_MULTI_COMPONENT_RANGE);\n     * for (range_index = 0; range_index < ranges->nb_ranges; range_index++) {\n     *     for (component_index = 0; component_index < ranges->nb_components; component_index++)\n     *         range[component_index] = ranges->range[ranges->nb_ranges * component_index + range_index];\n     *     //do something with range here.\n     * }\n     * av_opt_freep_ranges(&ranges);\n     * @endcode\n     */\n    AVOptionRange **range;\n    /**\n     * Number of ranges per component.\n     */\n    int nb_ranges;\n    /**\n     * Number of components.\n     */\n    int nb_components;\n} AVOptionRanges;\n\n/**\n * @defgroup opt_mng AVOption (un)initialization and inspection.\n * @{\n */\n\n/**\n * Set the values of all AVOption fields to their default values.\n *\n * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass)\n */\nvoid av_opt_set_defaults(void *s);\n\n/**\n * Set the values of all AVOption fields to their default values. Only these\n * AVOption fields for which (opt->flags & mask) == flags will have their\n * default applied to s.\n *\n * @param s an AVOption-enabled struct (its first member must be a pointer to AVClass)\n * @param mask combination of AV_OPT_FLAG_*\n * @param flags combination of AV_OPT_FLAG_*\n */\nvoid av_opt_set_defaults2(void *s, int mask, int flags);\n\n/**\n * Free all allocated objects in obj.\n */\nvoid av_opt_free(void *obj);\n\n/**\n * Iterate over all AVOptions belonging to obj.\n *\n * @param obj an AVOptions-enabled struct or a double pointer to an\n *            AVClass describing it.\n * @param prev result of the previous call to av_opt_next() on this object\n *             or NULL\n * @return next AVOption or NULL\n */\nconst AVOption *av_opt_next(const void *obj, const AVOption *prev);\n\n/**\n * Iterate over AVOptions-enabled children of obj.\n *\n * @param prev result of a previous call to this function or NULL\n * @return next AVOptions-enabled child or NULL\n */\nvoid *av_opt_child_next(void *obj, void *prev);\n\n/**\n * Iterate over potential AVOptions-enabled children of parent.\n *\n * @param iter a pointer where iteration state is stored.\n * @return AVClass corresponding to next potential child or NULL\n */\nconst AVClass *av_opt_child_class_iterate(const AVClass *parent, void **iter);\n\n#define AV_OPT_SEARCH_CHILDREN   (1 << 0) /**< Search in possible children of the\n                                               given object first. */\n/**\n *  The obj passed to av_opt_find() is fake -- only a double pointer to AVClass\n *  instead of a required pointer to a struct containing AVClass. This is\n *  useful for searching for options without needing to allocate the corresponding\n *  object.\n */\n#define AV_OPT_SEARCH_FAKE_OBJ   (1 << 1)\n\n/**\n *  In av_opt_get, return NULL if the option has a pointer type and is set to NULL,\n *  rather than returning an empty string.\n */\n#define AV_OPT_ALLOW_NULL (1 << 2)\n\n/**\n * May be used with av_opt_set_array() to signal that new elements should\n * replace the existing ones in the indicated range.\n */\n#define AV_OPT_ARRAY_REPLACE (1 << 3)\n\n/**\n *  Allows av_opt_query_ranges and av_opt_query_ranges_default to return more than\n *  one component for certain option types.\n *  @see AVOptionRanges for details.\n */\n#define AV_OPT_MULTI_COMPONENT_RANGE (1 << 12)\n\n/**\n * Look for an option in an object. Consider only options which\n * have all the specified flags set.\n *\n * @param[in] obj A pointer to a struct whose first element is a\n *                pointer to an AVClass.\n *                Alternatively a double pointer to an AVClass, if\n *                AV_OPT_SEARCH_FAKE_OBJ search flag is set.\n * @param[in] name The name of the option to look for.\n * @param[in] unit When searching for named constants, name of the unit\n *                 it belongs to.\n * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG).\n * @param search_flags A combination of AV_OPT_SEARCH_*.\n *\n * @return A pointer to the option found, or NULL if no option\n *         was found.\n *\n * @note Options found with AV_OPT_SEARCH_CHILDREN flag may not be settable\n * directly with av_opt_set(). Use special calls which take an options\n * AVDictionary (e.g. avformat_open_input()) to set options found with this\n * flag.\n */\nconst AVOption *av_opt_find(void *obj, const char *name, const char *unit,\n                            int opt_flags, int search_flags);\n\n/**\n * Look for an option in an object. Consider only options which\n * have all the specified flags set.\n *\n * @param[in] obj A pointer to a struct whose first element is a\n *                pointer to an AVClass.\n *                Alternatively a double pointer to an AVClass, if\n *                AV_OPT_SEARCH_FAKE_OBJ search flag is set.\n * @param[in] name The name of the option to look for.\n * @param[in] unit When searching for named constants, name of the unit\n *                 it belongs to.\n * @param opt_flags Find only options with all the specified flags set (AV_OPT_FLAG).\n * @param search_flags A combination of AV_OPT_SEARCH_*.\n * @param[out] target_obj if non-NULL, an object to which the option belongs will be\n * written here. It may be different from obj if AV_OPT_SEARCH_CHILDREN is present\n * in search_flags. This parameter is ignored if search_flags contain\n * AV_OPT_SEARCH_FAKE_OBJ.\n *\n * @return A pointer to the option found, or NULL if no option\n *         was found.\n */\nconst AVOption *av_opt_find2(void *obj, const char *name, const char *unit,\n                             int opt_flags, int search_flags, void **target_obj);\n\n/**\n * Show the obj options.\n *\n * @param req_flags requested flags for the options to show. Show only the\n * options for which it is opt->flags & req_flags.\n * @param rej_flags rejected flags for the options to show. Show only the\n * options for which it is !(opt->flags & req_flags).\n * @param av_log_obj log context to use for showing the options\n */\nint av_opt_show2(void *obj, void *av_log_obj, int req_flags, int rej_flags);\n\n/**\n * Extract a key-value pair from the beginning of a string.\n *\n * @param ropts        pointer to the options string, will be updated to\n *                     point to the rest of the string (one of the pairs_sep\n *                     or the final NUL)\n * @param key_val_sep  a 0-terminated list of characters used to separate\n *                     key from value, for example '='\n * @param pairs_sep    a 0-terminated list of characters used to separate\n *                     two pairs from each other, for example ':' or ','\n * @param flags        flags; see the AV_OPT_FLAG_* values below\n * @param rkey         parsed key; must be freed using av_free()\n * @param rval         parsed value; must be freed using av_free()\n *\n * @return  >=0 for success, or a negative value corresponding to an\n *          AVERROR code in case of error; in particular:\n *          AVERROR(EINVAL) if no key is present\n *\n */\nint av_opt_get_key_value(const char **ropts,\n                         const char *key_val_sep, const char *pairs_sep,\n                         unsigned flags,\n                         char **rkey, char **rval);\n\nenum {\n\n    /**\n     * Accept to parse a value without a key; the key will then be returned\n     * as NULL.\n     */\n    AV_OPT_FLAG_IMPLICIT_KEY = 1,\n};\n\n/**\n * @}\n */\n\n/**\n * @defgroup opt_write Setting and modifying option values\n * @{\n */\n\n/**\n * Parse the key/value pairs list in opts. For each key/value pair\n * found, stores the value in the field in ctx that is named like the\n * key. ctx must be an AVClass context, storing is done using\n * AVOptions.\n *\n * @param opts options string to parse, may be NULL\n * @param key_val_sep a 0-terminated list of characters used to\n * separate key from value\n * @param pairs_sep a 0-terminated list of characters used to separate\n * two pairs from each other\n * @return the number of successfully set key/value pairs, or a negative\n * value corresponding to an AVERROR code in case of error:\n * AVERROR(EINVAL) if opts cannot be parsed,\n * the error code issued by av_opt_set() if a key/value pair\n * cannot be set\n */\nint av_set_options_string(void *ctx, const char *opts,\n                          const char *key_val_sep, const char *pairs_sep);\n\n/**\n * Parse the key-value pairs list in opts. For each key=value pair found,\n * set the value of the corresponding option in ctx.\n *\n * @param ctx          the AVClass object to set options on\n * @param opts         the options string, key-value pairs separated by a\n *                     delimiter\n * @param shorthand    a NULL-terminated array of options names for shorthand\n *                     notation: if the first field in opts has no key part,\n *                     the key is taken from the first element of shorthand;\n *                     then again for the second, etc., until either opts is\n *                     finished, shorthand is finished or a named option is\n *                     found; after that, all options must be named\n * @param key_val_sep  a 0-terminated list of characters used to separate\n *                     key from value, for example '='\n * @param pairs_sep    a 0-terminated list of characters used to separate\n *                     two pairs from each other, for example ':' or ','\n * @return  the number of successfully set key=value pairs, or a negative\n *          value corresponding to an AVERROR code in case of error:\n *          AVERROR(EINVAL) if opts cannot be parsed,\n *          the error code issued by av_set_string3() if a key/value pair\n *          cannot be set\n *\n * Options names must use only the following characters: a-z A-Z 0-9 - . / _\n * Separators must use characters distinct from option names and from each\n * other.\n */\nint av_opt_set_from_string(void *ctx, const char *opts,\n                           const char *const *shorthand,\n                           const char *key_val_sep, const char *pairs_sep);\n\n/**\n * Set all the options from a given dictionary on an object.\n *\n * @param obj a struct whose first element is a pointer to AVClass\n * @param options options to process. This dictionary will be freed and replaced\n *                by a new one containing all options not found in obj.\n *                Of course this new dictionary needs to be freed by caller\n *                with av_dict_free().\n *\n * @return 0 on success, a negative AVERROR if some option was found in obj,\n *         but could not be set.\n *\n * @see av_dict_copy()\n */\nint av_opt_set_dict(void *obj, struct AVDictionary **options);\n\n\n/**\n * Set all the options from a given dictionary on an object.\n *\n * @param obj a struct whose first element is a pointer to AVClass\n * @param options options to process. This dictionary will be freed and replaced\n *                by a new one containing all options not found in obj.\n *                Of course this new dictionary needs to be freed by caller\n *                with av_dict_free().\n * @param search_flags A combination of AV_OPT_SEARCH_*.\n *\n * @return 0 on success, a negative AVERROR if some option was found in obj,\n *         but could not be set.\n *\n * @see av_dict_copy()\n */\nint av_opt_set_dict2(void *obj, struct AVDictionary **options, int search_flags);\n\n/**\n * Copy options from src object into dest object.\n *\n * The underlying AVClass of both src and dest must coincide. The guarantee\n * below does not apply if this is not fulfilled.\n *\n * Options that require memory allocation (e.g. string or binary) are malloc'ed in dest object.\n * Original memory allocated for such options is freed unless both src and dest options points to the same memory.\n *\n * Even on error it is guaranteed that allocated options from src and dest\n * no longer alias each other afterwards; in particular calling av_opt_free()\n * on both src and dest is safe afterwards if dest has been memdup'ed from src.\n *\n * @param dest Object to copy from\n * @param src  Object to copy into\n * @return 0 on success, negative on error\n */\nint av_opt_copy(void *dest, const void *src);\n\n/**\n * @defgroup opt_set_funcs Option setting functions\n * @{\n * Those functions set the field of obj with the given name to value.\n *\n * @param[in] obj A struct whose first element is a pointer to an AVClass.\n * @param[in] name the name of the field to set\n * @param[in] val The value to set. In case of av_opt_set() if the field is not\n * of a string type, then the given string is parsed.\n * SI postfixes and some named scalars are supported.\n * If the field is of a numeric type, it has to be a numeric or named\n * scalar. Behavior with more than one scalar and +- infix operators\n * is undefined.\n * If the field is of a flags type, it has to be a sequence of numeric\n * scalars or named flags separated by '+' or '-'. Prefixing a flag\n * with '+' causes it to be set without affecting the other flags;\n * similarly, '-' unsets a flag.\n * If the field is of a dictionary type, it has to be a ':' separated list of\n * key=value parameters. Values containing ':' special characters must be\n * escaped.\n * @param search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN\n * is passed here, then the option may be set on a child of obj.\n *\n * @return 0 if the value has been set, or an AVERROR code in case of\n * error:\n * AVERROR_OPTION_NOT_FOUND if no matching option exists\n * AVERROR(ERANGE) if the value is out of range\n * AVERROR(EINVAL) if the value is not valid\n */\nint av_opt_set         (void *obj, const char *name, const char *val, int search_flags);\nint av_opt_set_int     (void *obj, const char *name, int64_t     val, int search_flags);\nint av_opt_set_double  (void *obj, const char *name, double      val, int search_flags);\nint av_opt_set_q       (void *obj, const char *name, AVRational  val, int search_flags);\nint av_opt_set_bin     (void *obj, const char *name, const uint8_t *val, int size, int search_flags);\nint av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_flags);\nint av_opt_set_pixel_fmt (void *obj, const char *name, enum AVPixelFormat fmt, int search_flags);\nint av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags);\nint av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags);\n/**\n * @note Any old chlayout present is discarded and replaced with a copy of the new one. The\n * caller still owns layout and is responsible for uninitializing it.\n */\nint av_opt_set_chlayout(void *obj, const char *name, const AVChannelLayout *layout, int search_flags);\n/**\n * @note Any old dictionary present is discarded and replaced with a copy of the new one. The\n * caller still owns val is and responsible for freeing it.\n */\nint av_opt_set_dict_val(void *obj, const char *name, const AVDictionary *val, int search_flags);\n\n#if FF_API_OPT_INT_LIST\n/**\n * Set a binary option to an integer list.\n *\n * @param obj    AVClass object to set options on\n * @param name   name of the binary option\n * @param val    pointer to an integer list (must have the correct type with\n *               regard to the contents of the list)\n * @param term   list terminator (usually 0 or -1)\n * @param flags  search flags\n */\n#define av_opt_set_int_list(obj, name, val, term, flags) \\\n    (av_int_list_length(val, term) > INT_MAX / sizeof(*(val)) ? \\\n     AVERROR(EINVAL) : \\\n     av_opt_set_bin(obj, name, (const uint8_t *)(val), \\\n                    av_int_list_length(val, term) * sizeof(*(val)), flags))\n#endif\n\n/**\n * Add, replace, or remove elements for an array option. Which of these\n * operations is performed depends on the values of val and search_flags.\n *\n * @param start_elem Index of the first array element to modify; must not be\n *                   larger than array size as returned by\n *                   av_opt_get_array_size().\n * @param nb_elems number of array elements to modify; when val is NULL,\n *                 start_elem+nb_elems must not be larger than array size as\n *                 returned by av_opt_get_array_size()\n *\n * @param val_type Option type corresponding to the type of val, ignored when val is\n *                 NULL.\n *\n *                 The effect of this function will will be as if av_opt_setX()\n *                 was called for each element, where X is specified by type.\n *                 E.g. AV_OPT_TYPE_STRING corresponds to av_opt_set().\n *\n *                 Typically this should be the same as the scalarized type of\n *                 the AVOption being set, but certain conversions are also\n *                 possible - the same as those done by the corresponding\n *                 av_opt_set*() function. E.g. any option type can be set from\n *                 a string, numeric types can be set from int64, double, or\n *                 rational, etc.\n *\n * @param val Array with nb_elems elements or NULL.\n *\n *            When NULL, nb_elems array elements starting at start_elem are\n *            removed from the array. Any array elements remaining at the end\n *            are shifted by nb_elems towards the first element in order to keep\n *            the array contiguous.\n *\n *            Otherwise (val is non-NULL), the type of val must match the\n *            underlying C type as documented for val_type.\n *\n *            When AV_OPT_ARRAY_REPLACE is not set in search_flags, the array is\n *            enlarged by nb_elems, and the contents of val are inserted at\n *            start_elem. Previously existing array elements from start_elem\n *            onwards (if present) are shifted by nb_elems away from the first\n *            element in order to make space for the new elements.\n *\n *            When AV_OPT_ARRAY_REPLACE is set in search_flags, the contents\n *            of val replace existing array elements from start_elem to\n *            start_elem+nb_elems (if present). New array size is\n *            max(start_elem + nb_elems, old array size).\n */\nint av_opt_set_array(void *obj, const char *name, int search_flags,\n                     unsigned int start_elem, unsigned int nb_elems,\n                     enum AVOptionType val_type, const void *val);\n\n/**\n * @}\n * @}\n */\n\n/**\n * @defgroup opt_read Reading option values\n * @{\n */\n\n/**\n * @defgroup opt_get_funcs Option getting functions\n * @{\n * Those functions get a value of the option with the given name from an object.\n *\n * @param[in] obj a struct whose first element is a pointer to an AVClass.\n * @param[in] name name of the option to get.\n * @param[in] search_flags flags passed to av_opt_find2. I.e. if AV_OPT_SEARCH_CHILDREN\n * is passed here, then the option may be found in a child of obj.\n * @param[out] out_val value of the option will be written here\n * @return >=0 on success, a negative error code otherwise\n */\n/**\n * @note the returned string will be av_malloc()ed and must be av_free()ed by the caller\n *\n * @note if AV_OPT_ALLOW_NULL is set in search_flags in av_opt_get, and the\n * option is of type AV_OPT_TYPE_STRING, AV_OPT_TYPE_BINARY or AV_OPT_TYPE_DICT\n * and is set to NULL, *out_val will be set to NULL instead of an allocated\n * empty string.\n */\nint av_opt_get         (void *obj, const char *name, int search_flags, uint8_t   **out_val);\nint av_opt_get_int     (void *obj, const char *name, int search_flags, int64_t    *out_val);\nint av_opt_get_double  (void *obj, const char *name, int search_flags, double     *out_val);\nint av_opt_get_q       (void *obj, const char *name, int search_flags, AVRational *out_val);\nint av_opt_get_image_size(void *obj, const char *name, int search_flags, int *w_out, int *h_out);\nint av_opt_get_pixel_fmt (void *obj, const char *name, int search_flags, enum AVPixelFormat *out_fmt);\nint av_opt_get_sample_fmt(void *obj, const char *name, int search_flags, enum AVSampleFormat *out_fmt);\nint av_opt_get_video_rate(void *obj, const char *name, int search_flags, AVRational *out_val);\n/**\n * @param[out] layout The returned layout is a copy of the actual value and must\n * be freed with av_channel_layout_uninit() by the caller\n */\nint av_opt_get_chlayout(void *obj, const char *name, int search_flags, AVChannelLayout *layout);\n/**\n * @param[out] out_val The returned dictionary is a copy of the actual value and must\n * be freed with av_dict_free() by the caller\n */\nint av_opt_get_dict_val(void *obj, const char *name, int search_flags, AVDictionary **out_val);\n\n/**\n * For an array-type option, get the number of elements in the array.\n */\nint av_opt_get_array_size(void *obj, const char *name, int search_flags,\n                          unsigned int *out_val);\n\n/**\n * For an array-type option, retrieve the values of one or more array elements.\n *\n * @param start_elem index of the first array element to retrieve\n * @param nb_elems number of array elements to retrieve; start_elem+nb_elems\n *                 must not be larger than array size as returned by\n *                 av_opt_get_array_size()\n *\n * @param out_type Option type corresponding to the desired output.\n *\n *                 The array elements produced by this function will\n *                 will be as if av_opt_getX() was called for each element,\n *                 where X is specified by out_type. E.g. AV_OPT_TYPE_STRING\n *                 corresponds to av_opt_get().\n *\n *                 Typically this should be the same as the scalarized type of\n *                 the AVOption being retrieved, but certain conversions are\n *                 also possible - the same as those done by the corresponding\n *                 av_opt_get*() function. E.g. any option type can be retrieved\n *                 as a string, numeric types can be retrieved as int64, double,\n *                 or rational, etc.\n *\n * @param out_val  Array with nb_elems members into which the output will be\n *                 written. The array type must match the underlying C type as\n *                 documented for out_type, and be zeroed on entry to this\n *                 function.\n *\n *                 For dynamically allocated types (strings, binary, dicts,\n *                 etc.), the result is owned and freed by the caller.\n */\nint av_opt_get_array(void *obj, const char *name, int search_flags,\n                     unsigned int start_elem, unsigned int nb_elems,\n                     enum AVOptionType out_type, void *out_val);\n/**\n * @}\n */\n\n/**\n * @defgroup opt_eval_funcs Evaluating option strings\n * @{\n * This group of functions can be used to evaluate option strings\n * and get numbers out of them. They do the same thing as av_opt_set(),\n * except the result is written into the caller-supplied pointer.\n *\n * @param obj a struct whose first element is a pointer to AVClass.\n * @param o an option for which the string is to be evaluated.\n * @param val string to be evaluated.\n * @param *_out value of the string will be written here.\n *\n * @return 0 on success, a negative number on failure.\n */\nint av_opt_eval_flags (void *obj, const AVOption *o, const char *val, int        *flags_out);\nint av_opt_eval_int   (void *obj, const AVOption *o, const char *val, int        *int_out);\nint av_opt_eval_uint  (void *obj, const AVOption *o, const char *val, unsigned   *uint_out);\nint av_opt_eval_int64 (void *obj, const AVOption *o, const char *val, int64_t    *int64_out);\nint av_opt_eval_float (void *obj, const AVOption *o, const char *val, float      *float_out);\nint av_opt_eval_double(void *obj, const AVOption *o, const char *val, double     *double_out);\nint av_opt_eval_q     (void *obj, const AVOption *o, const char *val, AVRational *q_out);\n/**\n * @}\n */\n\n#if FF_API_OPT_PTR\n/**\n * Gets a pointer to the requested field in a struct.\n * This function allows accessing a struct even when its fields are moved or\n * renamed since the application making the access has been compiled,\n *\n * @returns a pointer to the field, it can be cast to the correct type and read\n *          or written to.\n *\n * @deprecated direct access to AVOption-exported fields is not supported\n */\nattribute_deprecated\nvoid *av_opt_ptr(const AVClass *avclass, void *obj, const char *name);\n#endif\n\n/**\n * Check if given option is set to its default value.\n *\n * Options o must belong to the obj. This function must not be called to check child's options state.\n * @see av_opt_is_set_to_default_by_name().\n *\n * @param obj  AVClass object to check option on\n * @param o    option to be checked\n * @return     >0 when option is set to its default,\n *              0 when option is not set its default,\n *             <0 on error\n */\nint av_opt_is_set_to_default(void *obj, const AVOption *o);\n\n/**\n * Check if given option is set to its default value.\n *\n * @param obj          AVClass object to check option on\n * @param name         option name\n * @param search_flags combination of AV_OPT_SEARCH_*\n * @return             >0 when option is set to its default,\n *                     0 when option is not set its default,\n *                     <0 on error\n */\nint av_opt_is_set_to_default_by_name(void *obj, const char *name, int search_flags);\n\n/**\n * Check whether a particular flag is set in a flags field.\n *\n * @param field_name the name of the flag field option\n * @param flag_name the name of the flag to check\n * @return non-zero if the flag is set, zero if the flag isn't set,\n *         isn't of the right type, or the flags field doesn't exist.\n */\nint av_opt_flag_is_set(void *obj, const char *field_name, const char *flag_name);\n\n#define AV_OPT_SERIALIZE_SKIP_DEFAULTS              0x00000001  ///< Serialize options that are not set to default values only.\n#define AV_OPT_SERIALIZE_OPT_FLAGS_EXACT            0x00000002  ///< Serialize options that exactly match opt_flags only.\n#define AV_OPT_SERIALIZE_SEARCH_CHILDREN            0x00000004  ///< Serialize options in possible children of the given object.\n\n/**\n * Serialize object's options.\n *\n * Create a string containing object's serialized options.\n * Such string may be passed back to av_opt_set_from_string() in order to restore option values.\n * A key/value or pairs separator occurring in the serialized value or\n * name string are escaped through the av_escape() function.\n *\n * @param[in]  obj           AVClass object to serialize\n * @param[in]  opt_flags     serialize options with all the specified flags set (AV_OPT_FLAG)\n * @param[in]  flags         combination of AV_OPT_SERIALIZE_* flags\n * @param[out] buffer        Pointer to buffer that will be allocated with string containing serialized options.\n *                           Buffer must be freed by the caller when is no longer needed.\n * @param[in]  key_val_sep   character used to separate key from value\n * @param[in]  pairs_sep     character used to separate two pairs from each other\n * @return                   >= 0 on success, negative on error\n * @warning Separators cannot be neither '\\\\' nor '\\0'. They also cannot be the same.\n */\nint av_opt_serialize(void *obj, int opt_flags, int flags, char **buffer,\n                     const char key_val_sep, const char pairs_sep);\n\n/**\n * @}\n */\n\n/**\n * Free an AVOptionRanges struct and set it to NULL.\n */\nvoid av_opt_freep_ranges(AVOptionRanges **ranges);\n\n/**\n * Get a list of allowed ranges for the given option.\n *\n * The returned list may depend on other fields in obj like for example profile.\n *\n * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored\n *              AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance\n *              AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges\n *\n * The result must be freed with av_opt_freep_ranges.\n *\n * @return number of components returned on success, a negative error code otherwise\n */\nint av_opt_query_ranges(AVOptionRanges **, void *obj, const char *key, int flags);\n\n/**\n * Get a default list of allowed ranges for the given option.\n *\n * This list is constructed without using the AVClass.query_ranges() callback\n * and can be used as fallback from within the callback.\n *\n * @param flags is a bitmask of flags, undefined flags should not be set and should be ignored\n *              AV_OPT_SEARCH_FAKE_OBJ indicates that the obj is a double pointer to a AVClass instead of a full instance\n *              AV_OPT_MULTI_COMPONENT_RANGE indicates that function may return more than one component, @see AVOptionRanges\n *\n * The result must be freed with av_opt_free_ranges.\n *\n * @return number of components returned on success, a negative error code otherwise\n */\nint av_opt_query_ranges_default(AVOptionRanges **, void *obj, const char *key, int flags);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_OPT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/parseutils.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_PARSEUTILS_H\n#define AVUTIL_PARSEUTILS_H\n\n#include <time.h>\n\n#include \"rational.h\"\n\n/**\n * @file\n * misc parsing utilities\n */\n\n/**\n * Parse str and store the parsed ratio in q.\n *\n * Note that a ratio with infinite (1/0) or negative value is\n * considered valid, so you should check on the returned value if you\n * want to exclude those values.\n *\n * The undefined value can be expressed using the \"0:0\" string.\n *\n * @param[in,out] q pointer to the AVRational which will contain the ratio\n * @param[in] str the string to parse: it has to be a string in the format\n * num:den, a float number or an expression\n * @param[in] max the maximum allowed numerator and denominator\n * @param[in] log_offset log level offset which is applied to the log\n * level of log_ctx\n * @param[in] log_ctx parent logging context\n * @return >= 0 on success, a negative error code otherwise\n */\nint av_parse_ratio(AVRational *q, const char *str, int max,\n                   int log_offset, void *log_ctx);\n\n#define av_parse_ratio_quiet(rate, str, max) \\\n    av_parse_ratio(rate, str, max, AV_LOG_MAX_OFFSET, NULL)\n\n/**\n * Parse str and put in width_ptr and height_ptr the detected values.\n *\n * @param[in,out] width_ptr pointer to the variable which will contain the detected\n * width value\n * @param[in,out] height_ptr pointer to the variable which will contain the detected\n * height value\n * @param[in] str the string to parse: it has to be a string in the format\n * width x height or a valid video size abbreviation.\n * @return >= 0 on success, a negative error code otherwise\n */\nint av_parse_video_size(int *width_ptr, int *height_ptr, const char *str);\n\n/**\n * Parse str and store the detected values in *rate.\n *\n * @param[in,out] rate pointer to the AVRational which will contain the detected\n * frame rate\n * @param[in] str the string to parse: it has to be a string in the format\n * rate_num / rate_den, a float number or a valid video rate abbreviation\n * @return >= 0 on success, a negative error code otherwise\n */\nint av_parse_video_rate(AVRational *rate, const char *str);\n\n/**\n * Put the RGBA values that correspond to color_string in rgba_color.\n *\n * @param rgba_color 4-elements array of uint8_t values, where the respective\n * red, green, blue and alpha component values are written.\n * @param color_string a string specifying a color. It can be the name of\n * a color (case insensitive match) or a [0x|#]RRGGBB[AA] sequence,\n * possibly followed by \"@\" and a string representing the alpha\n * component.\n * The alpha component may be a string composed by \"0x\" followed by an\n * hexadecimal number or a decimal number between 0.0 and 1.0, which\n * represents the opacity value (0x00/0.0 means completely transparent,\n * 0xff/1.0 completely opaque).\n * If the alpha component is not specified then 0xff is assumed.\n * The string \"random\" will result in a random color.\n * @param slen length of the initial part of color_string containing the\n * color. It can be set to -1 if color_string is a null terminated string\n * containing nothing else than the color.\n * @param log_ctx a pointer to an arbitrary struct of which the first field\n * is a pointer to an AVClass struct (used for av_log()). Can be NULL.\n * @return >= 0 in case of success, a negative value in case of\n * failure (for example if color_string cannot be parsed).\n */\nint av_parse_color(uint8_t *rgba_color, const char *color_string, int slen,\n                   void *log_ctx);\n\n/**\n * Get the name of a color from the internal table of hard-coded named\n * colors.\n *\n * This function is meant to enumerate the color names recognized by\n * av_parse_color().\n *\n * @param color_idx index of the requested color, starting from 0\n * @param rgb      if not NULL, will point to a 3-elements array with the color value in RGB\n * @return the color name string or NULL if color_idx is not in the array\n */\nconst char *av_get_known_color_name(int color_idx, const uint8_t **rgb);\n\n/**\n * Parse timestr and return in *time a corresponding number of\n * microseconds.\n *\n * @param timeval puts here the number of microseconds corresponding\n * to the string in timestr. If the string represents a duration, it\n * is the number of microseconds contained in the time interval.  If\n * the string is a date, is the number of microseconds since 1st of\n * January, 1970 up to the time of the parsed date.  If timestr cannot\n * be successfully parsed, set *time to INT64_MIN.\n\n * @param timestr a string representing a date or a duration.\n * - If a date the syntax is:\n * @code\n * [{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH:MM:SS[.m...]]]}|{HHMMSS[.m...]]]}}[Z]\n * now\n * @endcode\n * If the value is \"now\" it takes the current time.\n * Time is local time unless Z is appended, in which case it is\n * interpreted as UTC.\n * If the year-month-day part is not specified it takes the current\n * year-month-day.\n * - If a duration the syntax is:\n * @code\n * [-][HH:]MM:SS[.m...]\n * [-]S+[.m...]\n * @endcode\n * @param duration flag which tells how to interpret timestr, if not\n * zero timestr is interpreted as a duration, otherwise as a date\n * @return >= 0 in case of success, a negative value corresponding to an\n * AVERROR code otherwise\n */\nint av_parse_time(int64_t *timeval, const char *timestr, int duration);\n\n/**\n * Attempt to find a specific tag in a URL.\n *\n * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done.\n * Return 1 if found.\n */\nint av_find_info_tag(char *arg, int arg_size, const char *tag1, const char *info);\n\n/**\n * Simplified version of strptime\n *\n * Parse the input string p according to the format string fmt and\n * store its results in the structure dt.\n * This implementation supports only a subset of the formats supported\n * by the standard strptime().\n *\n * The supported input field descriptors are listed below.\n * - `%%H`: the hour as a decimal number, using a 24-hour clock, in the\n *   range '00' through '23'\n * - `%%J`: hours as a decimal number, in the range '0' through INT_MAX\n * - `%%M`: the minute as a decimal number, using a 24-hour clock, in the\n *   range '00' through '59'\n * - `%%S`: the second as a decimal number, using a 24-hour clock, in the\n *   range '00' through '59'\n * - `%%Y`: the year as a decimal number, using the Gregorian calendar\n * - `%%m`: the month as a decimal number, in the range '1' through '12'\n * - `%%d`: the day of the month as a decimal number, in the range '1'\n *   through '31'\n * - `%%T`: alias for `%%H:%%M:%%S`\n * - `%%`: a literal `%`\n *\n * @return a pointer to the first character not processed in this function\n *         call. In case the input string contains more characters than\n *         required by the format string the return value points right after\n *         the last consumed input character. In case the whole input string\n *         is consumed the return value points to the null byte at the end of\n *         the string. On failure NULL is returned.\n */\nchar *av_small_strptime(const char *p, const char *fmt, struct tm *dt);\n\n/**\n * Convert the decomposed UTC time in tm to a time_t value.\n */\ntime_t av_timegm(struct tm *tm);\n\n#endif /* AVUTIL_PARSEUTILS_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/pixdesc.h",
    "content": "/*\n * pixel format descriptor\n * Copyright (c) 2009 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_PIXDESC_H\n#define AVUTIL_PIXDESC_H\n\n#include <inttypes.h>\n\n#include \"attributes.h\"\n#include \"pixfmt.h\"\n\ntypedef struct AVComponentDescriptor {\n    /**\n     * Which of the 4 planes contains the component.\n     */\n    int plane;\n\n    /**\n     * Number of elements between 2 horizontally consecutive pixels.\n     * Elements are bits for bitstream formats, bytes otherwise.\n     */\n    int step;\n\n    /**\n     * Number of elements before the component of the first pixel.\n     * Elements are bits for bitstream formats, bytes otherwise.\n     */\n    int offset;\n\n    /**\n     * Number of least significant bits that must be shifted away\n     * to get the value.\n     */\n    int shift;\n\n    /**\n     * Number of bits in the component.\n     */\n    int depth;\n} AVComponentDescriptor;\n\n/**\n * Descriptor that unambiguously describes how the bits of a pixel are\n * stored in the up to 4 data planes of an image. It also stores the\n * subsampling factors and number of components.\n *\n * @note This is separate of the colorspace (RGB, YCbCr, YPbPr, JPEG-style YUV\n *       and all the YUV variants) AVPixFmtDescriptor just stores how values\n *       are stored not what these values represent.\n */\ntypedef struct AVPixFmtDescriptor {\n    const char *name;\n    uint8_t nb_components;  ///< The number of components each pixel has, (1-4)\n\n    /**\n     * Amount to shift the luma width right to find the chroma width.\n     * For YV12 this is 1 for example.\n     * chroma_width = AV_CEIL_RSHIFT(luma_width, log2_chroma_w)\n     * The note above is needed to ensure rounding up.\n     * This value only refers to the chroma components.\n     */\n    uint8_t log2_chroma_w;\n\n    /**\n     * Amount to shift the luma height right to find the chroma height.\n     * For YV12 this is 1 for example.\n     * chroma_height= AV_CEIL_RSHIFT(luma_height, log2_chroma_h)\n     * The note above is needed to ensure rounding up.\n     * This value only refers to the chroma components.\n     */\n    uint8_t log2_chroma_h;\n\n    /**\n     * Combination of AV_PIX_FMT_FLAG_... flags.\n     */\n    uint64_t flags;\n\n    /**\n     * Parameters that describe how pixels are packed.\n     * If the format has 1 or 2 components, then luma is 0.\n     * If the format has 3 or 4 components:\n     *   if the RGB flag is set then 0 is red, 1 is green and 2 is blue;\n     *   otherwise 0 is luma, 1 is chroma-U and 2 is chroma-V.\n     *\n     * If present, the Alpha channel is always the last component.\n     */\n    AVComponentDescriptor comp[4];\n\n    /**\n     * Alternative comma-separated names.\n     */\n    const char *alias;\n} AVPixFmtDescriptor;\n\n/**\n * Pixel format is big-endian.\n */\n#define AV_PIX_FMT_FLAG_BE           (1 << 0)\n/**\n * Pixel format has a palette in data[1], values are indexes in this palette.\n */\n#define AV_PIX_FMT_FLAG_PAL          (1 << 1)\n/**\n * All values of a component are bit-wise packed end to end.\n */\n#define AV_PIX_FMT_FLAG_BITSTREAM    (1 << 2)\n/**\n * Pixel format is an HW accelerated format.\n */\n#define AV_PIX_FMT_FLAG_HWACCEL      (1 << 3)\n/**\n * At least one pixel component is not in the first data plane.\n */\n#define AV_PIX_FMT_FLAG_PLANAR       (1 << 4)\n/**\n * The pixel format contains RGB-like data (as opposed to YUV/grayscale).\n */\n#define AV_PIX_FMT_FLAG_RGB          (1 << 5)\n\n/**\n * The pixel format has an alpha channel. This is set on all formats that\n * support alpha in some way, including AV_PIX_FMT_PAL8. The alpha is always\n * straight, never pre-multiplied.\n *\n * If a codec or a filter does not support alpha, it should set all alpha to\n * opaque, or use the equivalent pixel formats without alpha component, e.g.\n * AV_PIX_FMT_RGB0 (or AV_PIX_FMT_RGB24 etc.) instead of AV_PIX_FMT_RGBA.\n */\n#define AV_PIX_FMT_FLAG_ALPHA        (1 << 7)\n\n/**\n * The pixel format is following a Bayer pattern\n */\n#define AV_PIX_FMT_FLAG_BAYER        (1 << 8)\n\n/**\n * The pixel format contains IEEE-754 floating point values. Precision (double,\n * single, or half) should be determined by the pixel size (64, 32, or 16 bits).\n */\n#define AV_PIX_FMT_FLAG_FLOAT        (1 << 9)\n\n/**\n * The pixel format contains XYZ-like data (as opposed to YUV/RGB/grayscale).\n */\n#define AV_PIX_FMT_FLAG_XYZ          (1 << 10)\n\n/**\n * Return the number of bits per pixel used by the pixel format\n * described by pixdesc. Note that this is not the same as the number\n * of bits per sample.\n *\n * The returned number of bits refers to the number of bits actually\n * used for storing the pixel information, that is padding bits are\n * not counted.\n */\nint av_get_bits_per_pixel(const AVPixFmtDescriptor *pixdesc);\n\n/**\n * Return the number of bits per pixel for the pixel format\n * described by pixdesc, including any padding or unused bits.\n */\nint av_get_padded_bits_per_pixel(const AVPixFmtDescriptor *pixdesc);\n\n/**\n * @return a pixel format descriptor for provided pixel format or NULL if\n * this pixel format is unknown.\n */\nconst AVPixFmtDescriptor *av_pix_fmt_desc_get(enum AVPixelFormat pix_fmt);\n\n/**\n * Iterate over all pixel format descriptors known to libavutil.\n *\n * @param prev previous descriptor. NULL to get the first descriptor.\n *\n * @return next descriptor or NULL after the last descriptor\n */\nconst AVPixFmtDescriptor *av_pix_fmt_desc_next(const AVPixFmtDescriptor *prev);\n\n/**\n * @return an AVPixelFormat id described by desc, or AV_PIX_FMT_NONE if desc\n * is not a valid pointer to a pixel format descriptor.\n */\nenum AVPixelFormat av_pix_fmt_desc_get_id(const AVPixFmtDescriptor *desc);\n\n/**\n * Utility function to access log2_chroma_w log2_chroma_h from\n * the pixel format AVPixFmtDescriptor.\n *\n * @param[in]  pix_fmt the pixel format\n * @param[out] h_shift store log2_chroma_w (horizontal/width shift)\n * @param[out] v_shift store log2_chroma_h (vertical/height shift)\n *\n * @return 0 on success, AVERROR(ENOSYS) on invalid or unknown pixel format\n */\nint av_pix_fmt_get_chroma_sub_sample(enum AVPixelFormat pix_fmt,\n                                     int *h_shift, int *v_shift);\n\n/**\n * @return number of planes in pix_fmt, a negative AVERROR if pix_fmt is not a\n * valid pixel format.\n */\nint av_pix_fmt_count_planes(enum AVPixelFormat pix_fmt);\n\n/**\n * @return the name for provided color range or NULL if unknown.\n */\nconst char *av_color_range_name(enum AVColorRange range);\n\n/**\n * @return the AVColorRange value for name or an AVError if not found.\n */\nint av_color_range_from_name(const char *name);\n\n/**\n * @return the name for provided color primaries or NULL if unknown.\n */\nconst char *av_color_primaries_name(enum AVColorPrimaries primaries);\n\n/**\n * @return the AVColorPrimaries value for name or an AVError if not found.\n */\nint av_color_primaries_from_name(const char *name);\n\n/**\n * @return the name for provided color transfer or NULL if unknown.\n */\nconst char *av_color_transfer_name(enum AVColorTransferCharacteristic transfer);\n\n/**\n * @return the AVColorTransferCharacteristic value for name or an AVError if not found.\n */\nint av_color_transfer_from_name(const char *name);\n\n/**\n * @return the name for provided color space or NULL if unknown.\n */\nconst char *av_color_space_name(enum AVColorSpace space);\n\n/**\n * @return the AVColorSpace value for name or an AVError if not found.\n */\nint av_color_space_from_name(const char *name);\n\n/**\n * @return the name for provided chroma location or NULL if unknown.\n */\nconst char *av_chroma_location_name(enum AVChromaLocation location);\n\n/**\n * @return the AVChromaLocation value for name or an AVError if not found.\n */\nint av_chroma_location_from_name(const char *name);\n\n/**\n * Converts AVChromaLocation to swscale x/y chroma position.\n *\n * The positions represent the chroma (0,0) position in a coordinates system\n * with luma (0,0) representing the origin and luma(1,1) representing 256,256\n *\n * @param xpos  horizontal chroma sample position\n * @param ypos  vertical   chroma sample position\n */\nint av_chroma_location_enum_to_pos(int *xpos, int *ypos, enum AVChromaLocation pos);\n\n/**\n * Converts swscale x/y chroma position to AVChromaLocation.\n *\n * The positions represent the chroma (0,0) position in a coordinates system\n * with luma (0,0) representing the origin and luma(1,1) representing 256,256\n *\n * @param xpos  horizontal chroma sample position\n * @param ypos  vertical   chroma sample position\n */\nenum AVChromaLocation av_chroma_location_pos_to_enum(int xpos, int ypos);\n\n/**\n * Return the pixel format corresponding to name.\n *\n * If there is no pixel format with name name, then looks for a\n * pixel format with the name corresponding to the native endian\n * format of name.\n * For example in a little-endian system, first looks for \"gray16\",\n * then for \"gray16le\".\n *\n * Finally if no pixel format has been found, returns AV_PIX_FMT_NONE.\n */\nenum AVPixelFormat av_get_pix_fmt(const char *name);\n\n/**\n * Return the short name for a pixel format, NULL in case pix_fmt is\n * unknown.\n *\n * @see av_get_pix_fmt(), av_get_pix_fmt_string()\n */\nconst char *av_get_pix_fmt_name(enum AVPixelFormat pix_fmt);\n\n/**\n * Print in buf the string corresponding to the pixel format with\n * number pix_fmt, or a header if pix_fmt is negative.\n *\n * @param buf the buffer where to write the string\n * @param buf_size the size of buf\n * @param pix_fmt the number of the pixel format to print the\n * corresponding info string, or a negative value to print the\n * corresponding header.\n */\nchar *av_get_pix_fmt_string(char *buf, int buf_size,\n                            enum AVPixelFormat pix_fmt);\n\n/**\n * Read a line from an image, and write the values of the\n * pixel format component c to dst.\n *\n * @param data the array containing the pointers to the planes of the image\n * @param linesize the array containing the linesizes of the image\n * @param desc the pixel format descriptor for the image\n * @param x the horizontal coordinate of the first pixel to read\n * @param y the vertical coordinate of the first pixel to read\n * @param w the width of the line to read, that is the number of\n * values to write to dst\n * @param read_pal_component if not zero and the format is a paletted\n * format writes the values corresponding to the palette\n * component c in data[1] to dst, rather than the palette indexes in\n * data[0]. The behavior is undefined if the format is not paletted.\n * @param dst_element_size size of elements in dst array (2 or 4 byte)\n */\nvoid av_read_image_line2(void *dst, const uint8_t *data[4],\n                        const int linesize[4], const AVPixFmtDescriptor *desc,\n                        int x, int y, int c, int w, int read_pal_component,\n                        int dst_element_size);\n\nvoid av_read_image_line(uint16_t *dst, const uint8_t *data[4],\n                        const int linesize[4], const AVPixFmtDescriptor *desc,\n                        int x, int y, int c, int w, int read_pal_component);\n\n/**\n * Write the values from src to the pixel format component c of an\n * image line.\n *\n * @param src array containing the values to write\n * @param data the array containing the pointers to the planes of the\n * image to write into. It is supposed to be zeroed.\n * @param linesize the array containing the linesizes of the image\n * @param desc the pixel format descriptor for the image\n * @param x the horizontal coordinate of the first pixel to write\n * @param y the vertical coordinate of the first pixel to write\n * @param w the width of the line to write, that is the number of\n * values to write to the image line\n * @param src_element_size size of elements in src array (2 or 4 byte)\n */\nvoid av_write_image_line2(const void *src, uint8_t *data[4],\n                         const int linesize[4], const AVPixFmtDescriptor *desc,\n                         int x, int y, int c, int w, int src_element_size);\n\nvoid av_write_image_line(const uint16_t *src, uint8_t *data[4],\n                         const int linesize[4], const AVPixFmtDescriptor *desc,\n                         int x, int y, int c, int w);\n\n/**\n * Utility function to swap the endianness of a pixel format.\n *\n * @param[in]  pix_fmt the pixel format\n *\n * @return pixel format with swapped endianness if it exists,\n * otherwise AV_PIX_FMT_NONE\n */\nenum AVPixelFormat av_pix_fmt_swap_endianness(enum AVPixelFormat pix_fmt);\n\n#define FF_LOSS_RESOLUTION        0x0001 /**< loss due to resolution change */\n#define FF_LOSS_DEPTH             0x0002 /**< loss due to color depth change */\n#define FF_LOSS_COLORSPACE        0x0004 /**< loss due to color space conversion */\n#define FF_LOSS_ALPHA             0x0008 /**< loss of alpha bits */\n#define FF_LOSS_COLORQUANT        0x0010 /**< loss due to color quantization */\n#define FF_LOSS_CHROMA            0x0020 /**< loss of chroma (e.g. RGB to gray conversion) */\n#define FF_LOSS_EXCESS_RESOLUTION 0x0040 /**< loss due to unneeded extra resolution */\n#define FF_LOSS_EXCESS_DEPTH      0x0080 /**< loss due to unneeded extra color depth */\n\n\n/**\n * Compute what kind of losses will occur when converting from one specific\n * pixel format to another.\n * When converting from one pixel format to another, information loss may occur.\n * For example, when converting from RGB24 to GRAY, the color information will\n * be lost. Similarly, other losses occur when converting from some formats to\n * other formats. These losses can involve loss of chroma, but also loss of\n * resolution, loss of color depth, loss due to the color space conversion, loss\n * of the alpha bits or loss due to color quantization.\n * av_get_fix_fmt_loss() informs you about the various types of losses\n * which will occur when converting from one pixel format to another.\n *\n * @param[in] dst_pix_fmt destination pixel format\n * @param[in] src_pix_fmt source pixel format\n * @param[in] has_alpha Whether the source pixel format alpha channel is used.\n * @return Combination of flags informing you what kind of losses will occur\n * (maximum loss for an invalid dst_pix_fmt).\n */\nint av_get_pix_fmt_loss(enum AVPixelFormat dst_pix_fmt,\n                        enum AVPixelFormat src_pix_fmt,\n                        int has_alpha);\n\n/**\n * Compute what kind of losses will occur when converting from one specific\n * pixel format to another.\n * When converting from one pixel format to another, information loss may occur.\n * For example, when converting from RGB24 to GRAY, the color information will\n * be lost. Similarly, other losses occur when converting from some formats to\n * other formats. These losses can involve loss of chroma, but also loss of\n * resolution, loss of color depth, loss due to the color space conversion, loss\n * of the alpha bits or loss due to color quantization.\n * av_get_fix_fmt_loss() informs you about the various types of losses\n * which will occur when converting from one pixel format to another.\n *\n * @param[in] dst_pix_fmt destination pixel format\n * @param[in] src_pix_fmt source pixel format\n * @param[in] has_alpha Whether the source pixel format alpha channel is used.\n * @return Combination of flags informing you what kind of losses will occur\n * (maximum loss for an invalid dst_pix_fmt).\n */\nenum AVPixelFormat av_find_best_pix_fmt_of_2(enum AVPixelFormat dst_pix_fmt1, enum AVPixelFormat dst_pix_fmt2,\n                                             enum AVPixelFormat src_pix_fmt, int has_alpha, int *loss_ptr);\n\n#endif /* AVUTIL_PIXDESC_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/pixelutils.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_PIXELUTILS_H\n#define AVUTIL_PIXELUTILS_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n/**\n * Sum of abs(src1[x] - src2[x])\n */\ntypedef int (*av_pixelutils_sad_fn)(const uint8_t *src1, ptrdiff_t stride1,\n                                    const uint8_t *src2, ptrdiff_t stride2);\n\n/**\n * Get a potentially optimized pointer to a Sum-of-absolute-differences\n * function (see the av_pixelutils_sad_fn prototype).\n *\n * @param w_bits  1<<w_bits is the requested width of the block size\n * @param h_bits  1<<h_bits is the requested height of the block size\n * @param aligned If set to 2, the returned sad function will assume src1 and\n *                src2 addresses are aligned on the block size.\n *                If set to 1, the returned sad function will assume src1 is\n *                aligned on the block size.\n *                If set to 0, the returned sad function assume no particular\n *                alignment.\n * @param log_ctx context used for logging, can be NULL\n *\n * @return a pointer to the SAD function or NULL in case of error (because of\n *         invalid parameters)\n */\nav_pixelutils_sad_fn av_pixelutils_get_sad_fn(int w_bits, int h_bits,\n                                              int aligned, void *log_ctx);\n\n#endif /* AVUTIL_PIXELUTILS_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/pixfmt.h",
    "content": "/*\n * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_PIXFMT_H\n#define AVUTIL_PIXFMT_H\n\n/**\n * @file\n * pixel format definitions\n */\n\n#include \"libavutil/avconfig.h\"\n#include \"version.h\"\n\n#define AVPALETTE_SIZE 1024\n#define AVPALETTE_COUNT 256\n\n/**\n * Maximum number of planes in any pixel format.\n * This should be used when a maximum is needed, but code should not\n * be written to require a maximum for no good reason.\n */\n#define AV_VIDEO_MAX_PLANES 4\n\n/**\n * Pixel format.\n *\n * @note\n * AV_PIX_FMT_RGB32 is handled in an endian-specific manner. An RGBA\n * color is put together as:\n *  (A << 24) | (R << 16) | (G << 8) | B\n * This is stored as BGRA on little-endian CPU architectures and ARGB on\n * big-endian CPUs.\n *\n * @note\n * If the resolution is not a multiple of the chroma subsampling factor\n * then the chroma plane resolution must be rounded up.\n *\n * @par\n * When the pixel format is palettized RGB32 (AV_PIX_FMT_PAL8), the palettized\n * image data is stored in AVFrame.data[0]. The palette is transported in\n * AVFrame.data[1], is 1024 bytes long (256 4-byte entries) and is\n * formatted the same as in AV_PIX_FMT_RGB32 described above (i.e., it is\n * also endian-specific). Note also that the individual RGB32 palette\n * components stored in AVFrame.data[1] should be in the range 0..255.\n * This is important as many custom PAL8 video codecs that were designed\n * to run on the IBM VGA graphics adapter use 6-bit palette components.\n *\n * @par\n * For all the 8 bits per pixel formats, an RGB32 palette is in data[1] like\n * for pal8. This palette is filled in automatically by the function\n * allocating the picture.\n */\nenum AVPixelFormat {\n    AV_PIX_FMT_NONE = -1,\n    AV_PIX_FMT_YUV420P,   ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)\n    AV_PIX_FMT_YUYV422,   ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr\n    AV_PIX_FMT_RGB24,     ///< packed RGB 8:8:8, 24bpp, RGBRGB...\n    AV_PIX_FMT_BGR24,     ///< packed RGB 8:8:8, 24bpp, BGRBGR...\n    AV_PIX_FMT_YUV422P,   ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)\n    AV_PIX_FMT_YUV444P,   ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)\n    AV_PIX_FMT_YUV410P,   ///< planar YUV 4:1:0,  9bpp, (1 Cr & Cb sample per 4x4 Y samples)\n    AV_PIX_FMT_YUV411P,   ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)\n    AV_PIX_FMT_GRAY8,     ///<        Y        ,  8bpp\n    AV_PIX_FMT_MONOWHITE, ///<        Y        ,  1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb\n    AV_PIX_FMT_MONOBLACK, ///<        Y        ,  1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb\n    AV_PIX_FMT_PAL8,      ///< 8 bits with AV_PIX_FMT_RGB32 palette\n    AV_PIX_FMT_YUVJ420P,  ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting color_range\n    AV_PIX_FMT_YUVJ422P,  ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting color_range\n    AV_PIX_FMT_YUVJ444P,  ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting color_range\n    AV_PIX_FMT_UYVY422,   ///< packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1\n    AV_PIX_FMT_UYYVYY411, ///< packed YUV 4:1:1, 12bpp, Cb Y0 Y1 Cr Y2 Y3\n    AV_PIX_FMT_BGR8,      ///< packed RGB 3:3:2,  8bpp, (msb)2B 3G 3R(lsb)\n    AV_PIX_FMT_BGR4,      ///< packed RGB 1:2:1 bitstream,  4bpp, (msb)1B 2G 1R(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits\n    AV_PIX_FMT_BGR4_BYTE, ///< packed RGB 1:2:1,  8bpp, (msb)1B 2G 1R(lsb)\n    AV_PIX_FMT_RGB8,      ///< packed RGB 3:3:2,  8bpp, (msb)3R 3G 2B(lsb)\n    AV_PIX_FMT_RGB4,      ///< packed RGB 1:2:1 bitstream,  4bpp, (msb)1R 2G 1B(lsb), a byte contains two pixels, the first pixel in the byte is the one composed by the 4 msb bits\n    AV_PIX_FMT_RGB4_BYTE, ///< packed RGB 1:2:1,  8bpp, (msb)1R 2G 1B(lsb)\n    AV_PIX_FMT_NV12,      ///< planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)\n    AV_PIX_FMT_NV21,      ///< as above, but U and V bytes are swapped\n\n    AV_PIX_FMT_ARGB,      ///< packed ARGB 8:8:8:8, 32bpp, ARGBARGB...\n    AV_PIX_FMT_RGBA,      ///< packed RGBA 8:8:8:8, 32bpp, RGBARGBA...\n    AV_PIX_FMT_ABGR,      ///< packed ABGR 8:8:8:8, 32bpp, ABGRABGR...\n    AV_PIX_FMT_BGRA,      ///< packed BGRA 8:8:8:8, 32bpp, BGRABGRA...\n\n    AV_PIX_FMT_GRAY16BE,  ///<        Y        , 16bpp, big-endian\n    AV_PIX_FMT_GRAY16LE,  ///<        Y        , 16bpp, little-endian\n    AV_PIX_FMT_YUV440P,   ///< planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)\n    AV_PIX_FMT_YUVJ440P,  ///< planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range\n    AV_PIX_FMT_YUVA420P,  ///< planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)\n    AV_PIX_FMT_RGB48BE,   ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as big-endian\n    AV_PIX_FMT_RGB48LE,   ///< packed RGB 16:16:16, 48bpp, 16R, 16G, 16B, the 2-byte value for each R/G/B component is stored as little-endian\n\n    AV_PIX_FMT_RGB565BE,  ///< packed RGB 5:6:5, 16bpp, (msb)   5R 6G 5B(lsb), big-endian\n    AV_PIX_FMT_RGB565LE,  ///< packed RGB 5:6:5, 16bpp, (msb)   5R 6G 5B(lsb), little-endian\n    AV_PIX_FMT_RGB555BE,  ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), big-endian   , X=unused/undefined\n    AV_PIX_FMT_RGB555LE,  ///< packed RGB 5:5:5, 16bpp, (msb)1X 5R 5G 5B(lsb), little-endian, X=unused/undefined\n\n    AV_PIX_FMT_BGR565BE,  ///< packed BGR 5:6:5, 16bpp, (msb)   5B 6G 5R(lsb), big-endian\n    AV_PIX_FMT_BGR565LE,  ///< packed BGR 5:6:5, 16bpp, (msb)   5B 6G 5R(lsb), little-endian\n    AV_PIX_FMT_BGR555BE,  ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), big-endian   , X=unused/undefined\n    AV_PIX_FMT_BGR555LE,  ///< packed BGR 5:5:5, 16bpp, (msb)1X 5B 5G 5R(lsb), little-endian, X=unused/undefined\n\n    /**\n     *  Hardware acceleration through VA-API, data[3] contains a\n     *  VASurfaceID.\n     */\n    AV_PIX_FMT_VAAPI,\n\n    AV_PIX_FMT_YUV420P16LE,  ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian\n    AV_PIX_FMT_YUV420P16BE,  ///< planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian\n    AV_PIX_FMT_YUV422P16LE,  ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian\n    AV_PIX_FMT_YUV422P16BE,  ///< planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian\n    AV_PIX_FMT_YUV444P16LE,  ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian\n    AV_PIX_FMT_YUV444P16BE,  ///< planar YUV 4:4:4, 48bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian\n    AV_PIX_FMT_DXVA2_VLD,    ///< HW decoding through DXVA2, Picture.data[3] contains a LPDIRECT3DSURFACE9 pointer\n\n    AV_PIX_FMT_RGB444LE,  ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), little-endian, X=unused/undefined\n    AV_PIX_FMT_RGB444BE,  ///< packed RGB 4:4:4, 16bpp, (msb)4X 4R 4G 4B(lsb), big-endian,    X=unused/undefined\n    AV_PIX_FMT_BGR444LE,  ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), little-endian, X=unused/undefined\n    AV_PIX_FMT_BGR444BE,  ///< packed BGR 4:4:4, 16bpp, (msb)4X 4B 4G 4R(lsb), big-endian,    X=unused/undefined\n    AV_PIX_FMT_YA8,       ///< 8 bits gray, 8 bits alpha\n\n    AV_PIX_FMT_Y400A = AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8\n    AV_PIX_FMT_GRAY8A= AV_PIX_FMT_YA8, ///< alias for AV_PIX_FMT_YA8\n\n    AV_PIX_FMT_BGR48BE,   ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as big-endian\n    AV_PIX_FMT_BGR48LE,   ///< packed RGB 16:16:16, 48bpp, 16B, 16G, 16R, the 2-byte value for each R/G/B component is stored as little-endian\n\n    /**\n     * The following 12 formats have the disadvantage of needing 1 format for each bit depth.\n     * Notice that each 9/10 bits sample is stored in 16 bits with extra padding.\n     * If you want to support multiple bit depths, then using AV_PIX_FMT_YUV420P16* with the bpp stored separately is better.\n     */\n    AV_PIX_FMT_YUV420P9BE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian\n    AV_PIX_FMT_YUV420P9LE, ///< planar YUV 4:2:0, 13.5bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian\n    AV_PIX_FMT_YUV420P10BE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian\n    AV_PIX_FMT_YUV420P10LE,///< planar YUV 4:2:0, 15bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian\n    AV_PIX_FMT_YUV422P10BE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian\n    AV_PIX_FMT_YUV422P10LE,///< planar YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian\n    AV_PIX_FMT_YUV444P9BE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian\n    AV_PIX_FMT_YUV444P9LE, ///< planar YUV 4:4:4, 27bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian\n    AV_PIX_FMT_YUV444P10BE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian\n    AV_PIX_FMT_YUV444P10LE,///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian\n    AV_PIX_FMT_YUV422P9BE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian\n    AV_PIX_FMT_YUV422P9LE, ///< planar YUV 4:2:2, 18bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian\n    AV_PIX_FMT_GBRP,      ///< planar GBR 4:4:4 24bpp\n    AV_PIX_FMT_GBR24P = AV_PIX_FMT_GBRP, // alias for #AV_PIX_FMT_GBRP\n    AV_PIX_FMT_GBRP9BE,   ///< planar GBR 4:4:4 27bpp, big-endian\n    AV_PIX_FMT_GBRP9LE,   ///< planar GBR 4:4:4 27bpp, little-endian\n    AV_PIX_FMT_GBRP10BE,  ///< planar GBR 4:4:4 30bpp, big-endian\n    AV_PIX_FMT_GBRP10LE,  ///< planar GBR 4:4:4 30bpp, little-endian\n    AV_PIX_FMT_GBRP16BE,  ///< planar GBR 4:4:4 48bpp, big-endian\n    AV_PIX_FMT_GBRP16LE,  ///< planar GBR 4:4:4 48bpp, little-endian\n    AV_PIX_FMT_YUVA422P,  ///< planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)\n    AV_PIX_FMT_YUVA444P,  ///< planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)\n    AV_PIX_FMT_YUVA420P9BE,  ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), big-endian\n    AV_PIX_FMT_YUVA420P9LE,  ///< planar YUV 4:2:0 22.5bpp, (1 Cr & Cb sample per 2x2 Y & A samples), little-endian\n    AV_PIX_FMT_YUVA422P9BE,  ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), big-endian\n    AV_PIX_FMT_YUVA422P9LE,  ///< planar YUV 4:2:2 27bpp, (1 Cr & Cb sample per 2x1 Y & A samples), little-endian\n    AV_PIX_FMT_YUVA444P9BE,  ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), big-endian\n    AV_PIX_FMT_YUVA444P9LE,  ///< planar YUV 4:4:4 36bpp, (1 Cr & Cb sample per 1x1 Y & A samples), little-endian\n    AV_PIX_FMT_YUVA420P10BE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)\n    AV_PIX_FMT_YUVA420P10LE, ///< planar YUV 4:2:0 25bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)\n    AV_PIX_FMT_YUVA422P10BE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)\n    AV_PIX_FMT_YUVA422P10LE, ///< planar YUV 4:2:2 30bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)\n    AV_PIX_FMT_YUVA444P10BE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)\n    AV_PIX_FMT_YUVA444P10LE, ///< planar YUV 4:4:4 40bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)\n    AV_PIX_FMT_YUVA420P16BE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, big-endian)\n    AV_PIX_FMT_YUVA420P16LE, ///< planar YUV 4:2:0 40bpp, (1 Cr & Cb sample per 2x2 Y & A samples, little-endian)\n    AV_PIX_FMT_YUVA422P16BE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, big-endian)\n    AV_PIX_FMT_YUVA422P16LE, ///< planar YUV 4:2:2 48bpp, (1 Cr & Cb sample per 2x1 Y & A samples, little-endian)\n    AV_PIX_FMT_YUVA444P16BE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, big-endian)\n    AV_PIX_FMT_YUVA444P16LE, ///< planar YUV 4:4:4 64bpp, (1 Cr & Cb sample per 1x1 Y & A samples, little-endian)\n\n    AV_PIX_FMT_VDPAU,     ///< HW acceleration through VDPAU, Picture.data[3] contains a VdpVideoSurface\n\n    AV_PIX_FMT_XYZ12LE,      ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as little-endian, the 4 lower bits are set to 0\n    AV_PIX_FMT_XYZ12BE,      ///< packed XYZ 4:4:4, 36 bpp, (msb) 12X, 12Y, 12Z (lsb), the 2-byte value for each X/Y/Z is stored as big-endian, the 4 lower bits are set to 0\n    AV_PIX_FMT_NV16,         ///< interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)\n    AV_PIX_FMT_NV20LE,       ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian\n    AV_PIX_FMT_NV20BE,       ///< interleaved chroma YUV 4:2:2, 20bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian\n\n    AV_PIX_FMT_RGBA64BE,     ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian\n    AV_PIX_FMT_RGBA64LE,     ///< packed RGBA 16:16:16:16, 64bpp, 16R, 16G, 16B, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian\n    AV_PIX_FMT_BGRA64BE,     ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as big-endian\n    AV_PIX_FMT_BGRA64LE,     ///< packed RGBA 16:16:16:16, 64bpp, 16B, 16G, 16R, 16A, the 2-byte value for each R/G/B/A component is stored as little-endian\n\n    AV_PIX_FMT_YVYU422,   ///< packed YUV 4:2:2, 16bpp, Y0 Cr Y1 Cb\n\n    AV_PIX_FMT_YA16BE,       ///< 16 bits gray, 16 bits alpha (big-endian)\n    AV_PIX_FMT_YA16LE,       ///< 16 bits gray, 16 bits alpha (little-endian)\n\n    AV_PIX_FMT_GBRAP,        ///< planar GBRA 4:4:4:4 32bpp\n    AV_PIX_FMT_GBRAP16BE,    ///< planar GBRA 4:4:4:4 64bpp, big-endian\n    AV_PIX_FMT_GBRAP16LE,    ///< planar GBRA 4:4:4:4 64bpp, little-endian\n    /**\n     * HW acceleration through QSV, data[3] contains a pointer to the\n     * mfxFrameSurface1 structure.\n     *\n     * Before FFmpeg 5.0:\n     * mfxFrameSurface1.Data.MemId contains a pointer when importing\n     * the following frames as QSV frames:\n     *\n     * VAAPI:\n     * mfxFrameSurface1.Data.MemId contains a pointer to VASurfaceID\n     *\n     * DXVA2:\n     * mfxFrameSurface1.Data.MemId contains a pointer to IDirect3DSurface9\n     *\n     * FFmpeg 5.0 and above:\n     * mfxFrameSurface1.Data.MemId contains a pointer to the mfxHDLPair\n     * structure when importing the following frames as QSV frames:\n     *\n     * VAAPI:\n     * mfxHDLPair.first contains a VASurfaceID pointer.\n     * mfxHDLPair.second is always MFX_INFINITE.\n     *\n     * DXVA2:\n     * mfxHDLPair.first contains IDirect3DSurface9 pointer.\n     * mfxHDLPair.second is always MFX_INFINITE.\n     *\n     * D3D11:\n     * mfxHDLPair.first contains a ID3D11Texture2D pointer.\n     * mfxHDLPair.second contains the texture array index of the frame if the\n     * ID3D11Texture2D is an array texture, or always MFX_INFINITE if it is a\n     * normal texture.\n     */\n    AV_PIX_FMT_QSV,\n    /**\n     * HW acceleration though MMAL, data[3] contains a pointer to the\n     * MMAL_BUFFER_HEADER_T structure.\n     */\n    AV_PIX_FMT_MMAL,\n\n    AV_PIX_FMT_D3D11VA_VLD,  ///< HW decoding through Direct3D11 via old API, Picture.data[3] contains a ID3D11VideoDecoderOutputView pointer\n\n    /**\n     * HW acceleration through CUDA. data[i] contain CUdeviceptr pointers\n     * exactly as for system memory frames.\n     */\n    AV_PIX_FMT_CUDA,\n\n    AV_PIX_FMT_0RGB,        ///< packed RGB 8:8:8, 32bpp, XRGBXRGB...   X=unused/undefined\n    AV_PIX_FMT_RGB0,        ///< packed RGB 8:8:8, 32bpp, RGBXRGBX...   X=unused/undefined\n    AV_PIX_FMT_0BGR,        ///< packed BGR 8:8:8, 32bpp, XBGRXBGR...   X=unused/undefined\n    AV_PIX_FMT_BGR0,        ///< packed BGR 8:8:8, 32bpp, BGRXBGRX...   X=unused/undefined\n\n    AV_PIX_FMT_YUV420P12BE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian\n    AV_PIX_FMT_YUV420P12LE, ///< planar YUV 4:2:0,18bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian\n    AV_PIX_FMT_YUV420P14BE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), big-endian\n    AV_PIX_FMT_YUV420P14LE, ///< planar YUV 4:2:0,21bpp, (1 Cr & Cb sample per 2x2 Y samples), little-endian\n    AV_PIX_FMT_YUV422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian\n    AV_PIX_FMT_YUV422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian\n    AV_PIX_FMT_YUV422P14BE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), big-endian\n    AV_PIX_FMT_YUV422P14LE, ///< planar YUV 4:2:2,28bpp, (1 Cr & Cb sample per 2x1 Y samples), little-endian\n    AV_PIX_FMT_YUV444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian\n    AV_PIX_FMT_YUV444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian\n    AV_PIX_FMT_YUV444P14BE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), big-endian\n    AV_PIX_FMT_YUV444P14LE, ///< planar YUV 4:4:4,42bpp, (1 Cr & Cb sample per 1x1 Y samples), little-endian\n    AV_PIX_FMT_GBRP12BE,    ///< planar GBR 4:4:4 36bpp, big-endian\n    AV_PIX_FMT_GBRP12LE,    ///< planar GBR 4:4:4 36bpp, little-endian\n    AV_PIX_FMT_GBRP14BE,    ///< planar GBR 4:4:4 42bpp, big-endian\n    AV_PIX_FMT_GBRP14LE,    ///< planar GBR 4:4:4 42bpp, little-endian\n    AV_PIX_FMT_YUVJ411P,    ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV411P and setting color_range\n\n    AV_PIX_FMT_BAYER_BGGR8,    ///< bayer, BGBG..(odd line), GRGR..(even line), 8-bit samples\n    AV_PIX_FMT_BAYER_RGGB8,    ///< bayer, RGRG..(odd line), GBGB..(even line), 8-bit samples\n    AV_PIX_FMT_BAYER_GBRG8,    ///< bayer, GBGB..(odd line), RGRG..(even line), 8-bit samples\n    AV_PIX_FMT_BAYER_GRBG8,    ///< bayer, GRGR..(odd line), BGBG..(even line), 8-bit samples\n    AV_PIX_FMT_BAYER_BGGR16LE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, little-endian\n    AV_PIX_FMT_BAYER_BGGR16BE, ///< bayer, BGBG..(odd line), GRGR..(even line), 16-bit samples, big-endian\n    AV_PIX_FMT_BAYER_RGGB16LE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, little-endian\n    AV_PIX_FMT_BAYER_RGGB16BE, ///< bayer, RGRG..(odd line), GBGB..(even line), 16-bit samples, big-endian\n    AV_PIX_FMT_BAYER_GBRG16LE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, little-endian\n    AV_PIX_FMT_BAYER_GBRG16BE, ///< bayer, GBGB..(odd line), RGRG..(even line), 16-bit samples, big-endian\n    AV_PIX_FMT_BAYER_GRBG16LE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, little-endian\n    AV_PIX_FMT_BAYER_GRBG16BE, ///< bayer, GRGR..(odd line), BGBG..(even line), 16-bit samples, big-endian\n\n    AV_PIX_FMT_YUV440P10LE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian\n    AV_PIX_FMT_YUV440P10BE, ///< planar YUV 4:4:0,20bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian\n    AV_PIX_FMT_YUV440P12LE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), little-endian\n    AV_PIX_FMT_YUV440P12BE, ///< planar YUV 4:4:0,24bpp, (1 Cr & Cb sample per 1x2 Y samples), big-endian\n    AV_PIX_FMT_AYUV64LE,    ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), little-endian\n    AV_PIX_FMT_AYUV64BE,    ///< packed AYUV 4:4:4,64bpp (1 Cr & Cb sample per 1x1 Y & A samples), big-endian\n\n    AV_PIX_FMT_VIDEOTOOLBOX, ///< hardware decoding through Videotoolbox\n\n    AV_PIX_FMT_P010LE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, little-endian\n    AV_PIX_FMT_P010BE, ///< like NV12, with 10bpp per component, data in the high bits, zeros in the low bits, big-endian\n\n    AV_PIX_FMT_GBRAP12BE,  ///< planar GBR 4:4:4:4 48bpp, big-endian\n    AV_PIX_FMT_GBRAP12LE,  ///< planar GBR 4:4:4:4 48bpp, little-endian\n\n    AV_PIX_FMT_GBRAP10BE,  ///< planar GBR 4:4:4:4 40bpp, big-endian\n    AV_PIX_FMT_GBRAP10LE,  ///< planar GBR 4:4:4:4 40bpp, little-endian\n\n    AV_PIX_FMT_MEDIACODEC, ///< hardware decoding through MediaCodec\n\n    AV_PIX_FMT_GRAY12BE,   ///<        Y        , 12bpp, big-endian\n    AV_PIX_FMT_GRAY12LE,   ///<        Y        , 12bpp, little-endian\n    AV_PIX_FMT_GRAY10BE,   ///<        Y        , 10bpp, big-endian\n    AV_PIX_FMT_GRAY10LE,   ///<        Y        , 10bpp, little-endian\n\n    AV_PIX_FMT_P016LE, ///< like NV12, with 16bpp per component, little-endian\n    AV_PIX_FMT_P016BE, ///< like NV12, with 16bpp per component, big-endian\n\n    /**\n     * Hardware surfaces for Direct3D11.\n     *\n     * This is preferred over the legacy AV_PIX_FMT_D3D11VA_VLD. The new D3D11\n     * hwaccel API and filtering support AV_PIX_FMT_D3D11 only.\n     *\n     * data[0] contains a ID3D11Texture2D pointer, and data[1] contains the\n     * texture array index of the frame as intptr_t if the ID3D11Texture2D is\n     * an array texture (or always 0 if it's a normal texture).\n     */\n    AV_PIX_FMT_D3D11,\n\n    AV_PIX_FMT_GRAY9BE,   ///<        Y        , 9bpp, big-endian\n    AV_PIX_FMT_GRAY9LE,   ///<        Y        , 9bpp, little-endian\n\n    AV_PIX_FMT_GBRPF32BE,  ///< IEEE-754 single precision planar GBR 4:4:4,     96bpp, big-endian\n    AV_PIX_FMT_GBRPF32LE,  ///< IEEE-754 single precision planar GBR 4:4:4,     96bpp, little-endian\n    AV_PIX_FMT_GBRAPF32BE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, big-endian\n    AV_PIX_FMT_GBRAPF32LE, ///< IEEE-754 single precision planar GBRA 4:4:4:4, 128bpp, little-endian\n\n    /**\n     * DRM-managed buffers exposed through PRIME buffer sharing.\n     *\n     * data[0] points to an AVDRMFrameDescriptor.\n     */\n    AV_PIX_FMT_DRM_PRIME,\n    /**\n     * Hardware surfaces for OpenCL.\n     *\n     * data[i] contain 2D image objects (typed in C as cl_mem, used\n     * in OpenCL as image2d_t) for each plane of the surface.\n     */\n    AV_PIX_FMT_OPENCL,\n\n    AV_PIX_FMT_GRAY14BE,   ///<        Y        , 14bpp, big-endian\n    AV_PIX_FMT_GRAY14LE,   ///<        Y        , 14bpp, little-endian\n\n    AV_PIX_FMT_GRAYF32BE,  ///< IEEE-754 single precision Y, 32bpp, big-endian\n    AV_PIX_FMT_GRAYF32LE,  ///< IEEE-754 single precision Y, 32bpp, little-endian\n\n    AV_PIX_FMT_YUVA422P12BE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, big-endian\n    AV_PIX_FMT_YUVA422P12LE, ///< planar YUV 4:2:2,24bpp, (1 Cr & Cb sample per 2x1 Y samples), 12b alpha, little-endian\n    AV_PIX_FMT_YUVA444P12BE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, big-endian\n    AV_PIX_FMT_YUVA444P12LE, ///< planar YUV 4:4:4,36bpp, (1 Cr & Cb sample per 1x1 Y samples), 12b alpha, little-endian\n\n    AV_PIX_FMT_NV24,      ///< planar YUV 4:4:4, 24bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (first byte U and the following byte V)\n    AV_PIX_FMT_NV42,      ///< as above, but U and V bytes are swapped\n\n    /**\n     * Vulkan hardware images.\n     *\n     * data[0] points to an AVVkFrame\n     */\n    AV_PIX_FMT_VULKAN,\n\n    AV_PIX_FMT_Y210BE,    ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, big-endian\n    AV_PIX_FMT_Y210LE,    ///< packed YUV 4:2:2 like YUYV422, 20bpp, data in the high bits, little-endian\n\n    AV_PIX_FMT_X2RGB10LE, ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), little-endian, X=unused/undefined\n    AV_PIX_FMT_X2RGB10BE, ///< packed RGB 10:10:10, 30bpp, (msb)2X 10R 10G 10B(lsb), big-endian, X=unused/undefined\n    AV_PIX_FMT_X2BGR10LE, ///< packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), little-endian, X=unused/undefined\n    AV_PIX_FMT_X2BGR10BE, ///< packed BGR 10:10:10, 30bpp, (msb)2X 10B 10G 10R(lsb), big-endian, X=unused/undefined\n\n    AV_PIX_FMT_P210BE,      ///< interleaved chroma YUV 4:2:2, 20bpp, data in the high bits, big-endian\n    AV_PIX_FMT_P210LE,      ///< interleaved chroma YUV 4:2:2, 20bpp, data in the high bits, little-endian\n\n    AV_PIX_FMT_P410BE,      ///< interleaved chroma YUV 4:4:4, 30bpp, data in the high bits, big-endian\n    AV_PIX_FMT_P410LE,      ///< interleaved chroma YUV 4:4:4, 30bpp, data in the high bits, little-endian\n\n    AV_PIX_FMT_P216BE,      ///< interleaved chroma YUV 4:2:2, 32bpp, big-endian\n    AV_PIX_FMT_P216LE,      ///< interleaved chroma YUV 4:2:2, 32bpp, little-endian\n\n    AV_PIX_FMT_P416BE,      ///< interleaved chroma YUV 4:4:4, 48bpp, big-endian\n    AV_PIX_FMT_P416LE,      ///< interleaved chroma YUV 4:4:4, 48bpp, little-endian\n\n    AV_PIX_FMT_VUYA,        ///< packed VUYA 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), VUYAVUYA...\n\n    AV_PIX_FMT_RGBAF16BE,   ///< IEEE-754 half precision packed RGBA 16:16:16:16, 64bpp, RGBARGBA..., big-endian\n    AV_PIX_FMT_RGBAF16LE,   ///< IEEE-754 half precision packed RGBA 16:16:16:16, 64bpp, RGBARGBA..., little-endian\n\n    AV_PIX_FMT_VUYX,        ///< packed VUYX 4:4:4:4, 32bpp, Variant of VUYA where alpha channel is left undefined\n\n    AV_PIX_FMT_P012LE,      ///< like NV12, with 12bpp per component, data in the high bits, zeros in the low bits, little-endian\n    AV_PIX_FMT_P012BE,      ///< like NV12, with 12bpp per component, data in the high bits, zeros in the low bits, big-endian\n\n    AV_PIX_FMT_Y212BE,      ///< packed YUV 4:2:2 like YUYV422, 24bpp, data in the high bits, zeros in the low bits, big-endian\n    AV_PIX_FMT_Y212LE,      ///< packed YUV 4:2:2 like YUYV422, 24bpp, data in the high bits, zeros in the low bits, little-endian\n\n    AV_PIX_FMT_XV30BE,      ///< packed XVYU 4:4:4, 32bpp, (msb)2X 10V 10Y 10U(lsb), big-endian, variant of Y410 where alpha channel is left undefined\n    AV_PIX_FMT_XV30LE,      ///< packed XVYU 4:4:4, 32bpp, (msb)2X 10V 10Y 10U(lsb), little-endian, variant of Y410 where alpha channel is left undefined\n\n    AV_PIX_FMT_XV36BE,      ///< packed XVYU 4:4:4, 48bpp, data in the high bits, zeros in the low bits, big-endian, variant of Y412 where alpha channel is left undefined\n    AV_PIX_FMT_XV36LE,      ///< packed XVYU 4:4:4, 48bpp, data in the high bits, zeros in the low bits, little-endian, variant of Y412 where alpha channel is left undefined\n\n    AV_PIX_FMT_RGBF32BE,    ///< IEEE-754 single precision packed RGB 32:32:32, 96bpp, RGBRGB..., big-endian\n    AV_PIX_FMT_RGBF32LE,    ///< IEEE-754 single precision packed RGB 32:32:32, 96bpp, RGBRGB..., little-endian\n\n    AV_PIX_FMT_RGBAF32BE,   ///< IEEE-754 single precision packed RGBA 32:32:32:32, 128bpp, RGBARGBA..., big-endian\n    AV_PIX_FMT_RGBAF32LE,   ///< IEEE-754 single precision packed RGBA 32:32:32:32, 128bpp, RGBARGBA..., little-endian\n\n    AV_PIX_FMT_P212BE,      ///< interleaved chroma YUV 4:2:2, 24bpp, data in the high bits, big-endian\n    AV_PIX_FMT_P212LE,      ///< interleaved chroma YUV 4:2:2, 24bpp, data in the high bits, little-endian\n\n    AV_PIX_FMT_P412BE,      ///< interleaved chroma YUV 4:4:4, 36bpp, data in the high bits, big-endian\n    AV_PIX_FMT_P412LE,      ///< interleaved chroma YUV 4:4:4, 36bpp, data in the high bits, little-endian\n\n    AV_PIX_FMT_GBRAP14BE,  ///< planar GBR 4:4:4:4 56bpp, big-endian\n    AV_PIX_FMT_GBRAP14LE,  ///< planar GBR 4:4:4:4 56bpp, little-endian\n\n    /**\n     * Hardware surfaces for Direct3D 12.\n     *\n     * data[0] points to an AVD3D12VAFrame\n     */\n    AV_PIX_FMT_D3D12,\n\n    AV_PIX_FMT_AYUV,        ///< packed AYUV 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), AYUVAYUV...\n\n    AV_PIX_FMT_UYVA,        ///< packed UYVA 4:4:4:4, 32bpp (1 Cr & Cb sample per 1x1 Y & A samples), UYVAUYVA...\n\n    AV_PIX_FMT_VYU444,      ///< packed VYU 4:4:4, 24bpp (1 Cr & Cb sample per 1x1 Y), VYUVYU...\n\n    AV_PIX_FMT_V30XBE,      ///< packed VYUX 4:4:4 like XV30, 32bpp, (msb)10V 10Y 10U 2X(lsb), big-endian\n    AV_PIX_FMT_V30XLE,      ///< packed VYUX 4:4:4 like XV30, 32bpp, (msb)10V 10Y 10U 2X(lsb), little-endian\n\n    AV_PIX_FMT_RGBF16BE,    ///< IEEE-754 half precision packed RGB 16:16:16, 48bpp, RGBRGB..., big-endian\n    AV_PIX_FMT_RGBF16LE,    ///< IEEE-754 half precision packed RGB 16:16:16, 48bpp, RGBRGB..., little-endian\n\n    AV_PIX_FMT_RGBA128BE,   ///< packed RGBA 32:32:32:32, 128bpp, RGBARGBA..., big-endian\n    AV_PIX_FMT_RGBA128LE,   ///< packed RGBA 32:32:32:32, 128bpp, RGBARGBA..., little-endian\n\n    AV_PIX_FMT_RGB96BE,     ///< packed RGBA 32:32:32, 96bpp, RGBRGB..., big-endian\n    AV_PIX_FMT_RGB96LE,     ///< packed RGBA 32:32:32, 96bpp, RGBRGB..., little-endian\n\n    AV_PIX_FMT_Y216BE,      ///< packed YUV 4:2:2 like YUYV422, 32bpp, big-endian\n    AV_PIX_FMT_Y216LE,      ///< packed YUV 4:2:2 like YUYV422, 32bpp, little-endian\n\n    AV_PIX_FMT_XV48BE,      ///< packed XVYU 4:4:4, 64bpp, big-endian, variant of Y416 where alpha channel is left undefined\n    AV_PIX_FMT_XV48LE,      ///< packed XVYU 4:4:4, 64bpp, little-endian, variant of Y416 where alpha channel is left undefined\n\n    AV_PIX_FMT_GBRPF16BE,  ///< IEEE-754 half precision planer GBR 4:4:4, 48bpp, big-endian\n    AV_PIX_FMT_GBRPF16LE,  ///< IEEE-754 half precision planer GBR 4:4:4, 48bpp, little-endian\n    AV_PIX_FMT_GBRAPF16BE, ///< IEEE-754 half precision planar GBRA 4:4:4:4, 64bpp, big-endian\n    AV_PIX_FMT_GBRAPF16LE, ///< IEEE-754 half precision planar GBRA 4:4:4:4, 64bpp, little-endian\n\n    AV_PIX_FMT_GRAYF16BE,  ///< IEEE-754 half precision Y, 16bpp, big-endian\n    AV_PIX_FMT_GRAYF16LE,  ///< IEEE-754 half precision Y, 16bpp, little-endian\n\n    /**\n     * HW acceleration through AMF. data[0] contain AMFSurface pointer\n     */\n    AV_PIX_FMT_AMF_SURFACE,\n\n    AV_PIX_FMT_GRAY32BE,    ///<         Y        , 32bpp, big-endian\n    AV_PIX_FMT_GRAY32LE,    ///<         Y        , 32bpp, little-endian\n\n    AV_PIX_FMT_YAF32BE,  ///< IEEE-754 single precision packed YA, 32 bits gray, 32 bits alpha, 64bpp, big-endian\n    AV_PIX_FMT_YAF32LE,  ///< IEEE-754 single precision packed YA, 32 bits gray, 32 bits alpha, 64bpp, little-endian\n\n    AV_PIX_FMT_YAF16BE,  ///< IEEE-754 half precision packed YA, 16 bits gray, 16 bits alpha, 32bpp, big-endian\n    AV_PIX_FMT_YAF16LE,  ///< IEEE-754 half precision packed YA, 16 bits gray, 16 bits alpha, 32bpp, little-endian\n\n    AV_PIX_FMT_GBRAP32BE,   ///< planar GBRA 4:4:4:4 128bpp, big-endian\n    AV_PIX_FMT_GBRAP32LE,   ///< planar GBRA 4:4:4:4 128bpp, little-endian\n\n    AV_PIX_FMT_YUV444P10MSBBE, ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, big-endian\n    AV_PIX_FMT_YUV444P10MSBLE, ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, little-endian\n    AV_PIX_FMT_YUV444P12MSBBE, ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, big-endian\n    AV_PIX_FMT_YUV444P12MSBLE, ///< planar YUV 4:4:4, 30bpp, (1 Cr & Cb sample per 1x1 Y samples), lowest bits zero, little-endian\n    AV_PIX_FMT_GBRP10MSBBE,    ///< planar GBR 4:4:4 30bpp, lowest bits zero, big-endian\n    AV_PIX_FMT_GBRP10MSBLE,    ///< planar GBR 4:4:4 30bpp, lowest bits zero, little-endian\n    AV_PIX_FMT_GBRP12MSBBE,    ///< planar GBR 4:4:4 36bpp, lowest bits zero, big-endian\n    AV_PIX_FMT_GBRP12MSBLE,    ///< planar GBR 4:4:4 36bpp, lowest bits zero, little-endian\n\n    AV_PIX_FMT_OHCODEC, /// hardware decoding through openharmony\n\n    AV_PIX_FMT_NB         ///< number of pixel formats, DO NOT USE THIS if you want to link with shared libav* because the number of formats might differ between versions\n};\n\n#if AV_HAVE_BIGENDIAN\n#   define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##be\n#else\n#   define AV_PIX_FMT_NE(be, le) AV_PIX_FMT_##le\n#endif\n\n#define AV_PIX_FMT_RGB32   AV_PIX_FMT_NE(ARGB, BGRA)\n#define AV_PIX_FMT_RGB32_1 AV_PIX_FMT_NE(RGBA, ABGR)\n#define AV_PIX_FMT_BGR32   AV_PIX_FMT_NE(ABGR, RGBA)\n#define AV_PIX_FMT_BGR32_1 AV_PIX_FMT_NE(BGRA, ARGB)\n#define AV_PIX_FMT_0RGB32  AV_PIX_FMT_NE(0RGB, BGR0)\n#define AV_PIX_FMT_0BGR32  AV_PIX_FMT_NE(0BGR, RGB0)\n\n#define AV_PIX_FMT_GRAY9  AV_PIX_FMT_NE(GRAY9BE,  GRAY9LE)\n#define AV_PIX_FMT_GRAY10 AV_PIX_FMT_NE(GRAY10BE, GRAY10LE)\n#define AV_PIX_FMT_GRAY12 AV_PIX_FMT_NE(GRAY12BE, GRAY12LE)\n#define AV_PIX_FMT_GRAY14 AV_PIX_FMT_NE(GRAY14BE, GRAY14LE)\n#define AV_PIX_FMT_GRAY16 AV_PIX_FMT_NE(GRAY16BE, GRAY16LE)\n#define AV_PIX_FMT_GRAY32 AV_PIX_FMT_NE(GRAY32BE, GRAY32LE)\n#define AV_PIX_FMT_YA16   AV_PIX_FMT_NE(YA16BE,   YA16LE)\n#define AV_PIX_FMT_RGB48  AV_PIX_FMT_NE(RGB48BE,  RGB48LE)\n#define AV_PIX_FMT_RGB565 AV_PIX_FMT_NE(RGB565BE, RGB565LE)\n#define AV_PIX_FMT_RGB555 AV_PIX_FMT_NE(RGB555BE, RGB555LE)\n#define AV_PIX_FMT_RGB444 AV_PIX_FMT_NE(RGB444BE, RGB444LE)\n#define AV_PIX_FMT_RGBA64 AV_PIX_FMT_NE(RGBA64BE, RGBA64LE)\n#define AV_PIX_FMT_BGR48  AV_PIX_FMT_NE(BGR48BE,  BGR48LE)\n#define AV_PIX_FMT_BGR565 AV_PIX_FMT_NE(BGR565BE, BGR565LE)\n#define AV_PIX_FMT_BGR555 AV_PIX_FMT_NE(BGR555BE, BGR555LE)\n#define AV_PIX_FMT_BGR444 AV_PIX_FMT_NE(BGR444BE, BGR444LE)\n#define AV_PIX_FMT_BGRA64 AV_PIX_FMT_NE(BGRA64BE, BGRA64LE)\n\n#define AV_PIX_FMT_YUV420P9  AV_PIX_FMT_NE(YUV420P9BE , YUV420P9LE)\n#define AV_PIX_FMT_YUV422P9  AV_PIX_FMT_NE(YUV422P9BE , YUV422P9LE)\n#define AV_PIX_FMT_YUV444P9  AV_PIX_FMT_NE(YUV444P9BE , YUV444P9LE)\n#define AV_PIX_FMT_YUV420P10 AV_PIX_FMT_NE(YUV420P10BE, YUV420P10LE)\n#define AV_PIX_FMT_YUV422P10 AV_PIX_FMT_NE(YUV422P10BE, YUV422P10LE)\n#define AV_PIX_FMT_YUV440P10 AV_PIX_FMT_NE(YUV440P10BE, YUV440P10LE)\n#define AV_PIX_FMT_YUV444P10 AV_PIX_FMT_NE(YUV444P10BE, YUV444P10LE)\n#define AV_PIX_FMT_YUV420P12 AV_PIX_FMT_NE(YUV420P12BE, YUV420P12LE)\n#define AV_PIX_FMT_YUV422P12 AV_PIX_FMT_NE(YUV422P12BE, YUV422P12LE)\n#define AV_PIX_FMT_YUV440P12 AV_PIX_FMT_NE(YUV440P12BE, YUV440P12LE)\n#define AV_PIX_FMT_YUV444P12 AV_PIX_FMT_NE(YUV444P12BE, YUV444P12LE)\n#define AV_PIX_FMT_YUV420P14 AV_PIX_FMT_NE(YUV420P14BE, YUV420P14LE)\n#define AV_PIX_FMT_YUV422P14 AV_PIX_FMT_NE(YUV422P14BE, YUV422P14LE)\n#define AV_PIX_FMT_YUV444P14 AV_PIX_FMT_NE(YUV444P14BE, YUV444P14LE)\n#define AV_PIX_FMT_YUV420P16 AV_PIX_FMT_NE(YUV420P16BE, YUV420P16LE)\n#define AV_PIX_FMT_YUV422P16 AV_PIX_FMT_NE(YUV422P16BE, YUV422P16LE)\n#define AV_PIX_FMT_YUV444P16 AV_PIX_FMT_NE(YUV444P16BE, YUV444P16LE)\n\n#define AV_PIX_FMT_YUV444P10MSB AV_PIX_FMT_NE(YUV444P10MSBBE, YUV444P10MSBLE)\n#define AV_PIX_FMT_YUV444P12MSB AV_PIX_FMT_NE(YUV444P12MSBBE, YUV444P12MSBLE)\n\n#define AV_PIX_FMT_GBRP9     AV_PIX_FMT_NE(GBRP9BE ,    GBRP9LE)\n#define AV_PIX_FMT_GBRP10    AV_PIX_FMT_NE(GBRP10BE,    GBRP10LE)\n#define AV_PIX_FMT_GBRP12    AV_PIX_FMT_NE(GBRP12BE,    GBRP12LE)\n#define AV_PIX_FMT_GBRP14    AV_PIX_FMT_NE(GBRP14BE,    GBRP14LE)\n#define AV_PIX_FMT_GBRP16    AV_PIX_FMT_NE(GBRP16BE,    GBRP16LE)\n#define AV_PIX_FMT_GBRAP10   AV_PIX_FMT_NE(GBRAP10BE,   GBRAP10LE)\n#define AV_PIX_FMT_GBRAP12   AV_PIX_FMT_NE(GBRAP12BE,   GBRAP12LE)\n#define AV_PIX_FMT_GBRAP14   AV_PIX_FMT_NE(GBRAP14BE,   GBRAP14LE)\n#define AV_PIX_FMT_GBRAP16   AV_PIX_FMT_NE(GBRAP16BE,   GBRAP16LE)\n#define AV_PIX_FMT_GBRAP32   AV_PIX_FMT_NE(GBRAP32BE,   GBRAP32LE)\n\n#define AV_PIX_FMT_GBRP10MSB AV_PIX_FMT_NE(GBRP10MSBBE, GBRP10MSBLE)\n#define AV_PIX_FMT_GBRP12MSB AV_PIX_FMT_NE(GBRP12MSBBE, GBRP12MSBLE)\n\n#define AV_PIX_FMT_BAYER_BGGR16 AV_PIX_FMT_NE(BAYER_BGGR16BE,    BAYER_BGGR16LE)\n#define AV_PIX_FMT_BAYER_RGGB16 AV_PIX_FMT_NE(BAYER_RGGB16BE,    BAYER_RGGB16LE)\n#define AV_PIX_FMT_BAYER_GBRG16 AV_PIX_FMT_NE(BAYER_GBRG16BE,    BAYER_GBRG16LE)\n#define AV_PIX_FMT_BAYER_GRBG16 AV_PIX_FMT_NE(BAYER_GRBG16BE,    BAYER_GRBG16LE)\n\n#define AV_PIX_FMT_GBRPF16    AV_PIX_FMT_NE(GBRPF16BE,  GBRPF16LE)\n#define AV_PIX_FMT_GBRAPF16   AV_PIX_FMT_NE(GBRAPF16BE, GBRAPF16LE)\n#define AV_PIX_FMT_GBRPF32    AV_PIX_FMT_NE(GBRPF32BE,  GBRPF32LE)\n#define AV_PIX_FMT_GBRAPF32   AV_PIX_FMT_NE(GBRAPF32BE, GBRAPF32LE)\n\n#define AV_PIX_FMT_GRAYF16    AV_PIX_FMT_NE(GRAYF16BE, GRAYF16LE)\n#define AV_PIX_FMT_GRAYF32    AV_PIX_FMT_NE(GRAYF32BE, GRAYF32LE)\n\n#define AV_PIX_FMT_YAF16      AV_PIX_FMT_NE(YAF16BE, YAF16LE)\n#define AV_PIX_FMT_YAF32      AV_PIX_FMT_NE(YAF32BE, YAF32LE)\n\n#define AV_PIX_FMT_YUVA420P9  AV_PIX_FMT_NE(YUVA420P9BE , YUVA420P9LE)\n#define AV_PIX_FMT_YUVA422P9  AV_PIX_FMT_NE(YUVA422P9BE , YUVA422P9LE)\n#define AV_PIX_FMT_YUVA444P9  AV_PIX_FMT_NE(YUVA444P9BE , YUVA444P9LE)\n#define AV_PIX_FMT_YUVA420P10 AV_PIX_FMT_NE(YUVA420P10BE, YUVA420P10LE)\n#define AV_PIX_FMT_YUVA422P10 AV_PIX_FMT_NE(YUVA422P10BE, YUVA422P10LE)\n#define AV_PIX_FMT_YUVA444P10 AV_PIX_FMT_NE(YUVA444P10BE, YUVA444P10LE)\n#define AV_PIX_FMT_YUVA422P12 AV_PIX_FMT_NE(YUVA422P12BE, YUVA422P12LE)\n#define AV_PIX_FMT_YUVA444P12 AV_PIX_FMT_NE(YUVA444P12BE, YUVA444P12LE)\n#define AV_PIX_FMT_YUVA420P16 AV_PIX_FMT_NE(YUVA420P16BE, YUVA420P16LE)\n#define AV_PIX_FMT_YUVA422P16 AV_PIX_FMT_NE(YUVA422P16BE, YUVA422P16LE)\n#define AV_PIX_FMT_YUVA444P16 AV_PIX_FMT_NE(YUVA444P16BE, YUVA444P16LE)\n\n#define AV_PIX_FMT_XYZ12      AV_PIX_FMT_NE(XYZ12BE, XYZ12LE)\n#define AV_PIX_FMT_NV20       AV_PIX_FMT_NE(NV20BE,  NV20LE)\n#define AV_PIX_FMT_AYUV64     AV_PIX_FMT_NE(AYUV64BE, AYUV64LE)\n#define AV_PIX_FMT_P010       AV_PIX_FMT_NE(P010BE,  P010LE)\n#define AV_PIX_FMT_P012       AV_PIX_FMT_NE(P012BE,  P012LE)\n#define AV_PIX_FMT_P016       AV_PIX_FMT_NE(P016BE,  P016LE)\n\n#define AV_PIX_FMT_Y210       AV_PIX_FMT_NE(Y210BE,  Y210LE)\n#define AV_PIX_FMT_Y212       AV_PIX_FMT_NE(Y212BE,  Y212LE)\n#define AV_PIX_FMT_Y216       AV_PIX_FMT_NE(Y216BE,  Y216LE)\n#define AV_PIX_FMT_XV30       AV_PIX_FMT_NE(XV30BE,  XV30LE)\n#define AV_PIX_FMT_XV36       AV_PIX_FMT_NE(XV36BE,  XV36LE)\n#define AV_PIX_FMT_XV48       AV_PIX_FMT_NE(XV48BE,  XV48LE)\n#define AV_PIX_FMT_V30X       AV_PIX_FMT_NE(V30XBE,  V30XLE)\n#define AV_PIX_FMT_X2RGB10    AV_PIX_FMT_NE(X2RGB10BE, X2RGB10LE)\n#define AV_PIX_FMT_X2BGR10    AV_PIX_FMT_NE(X2BGR10BE, X2BGR10LE)\n\n#define AV_PIX_FMT_P210       AV_PIX_FMT_NE(P210BE, P210LE)\n#define AV_PIX_FMT_P410       AV_PIX_FMT_NE(P410BE, P410LE)\n#define AV_PIX_FMT_P212       AV_PIX_FMT_NE(P212BE, P212LE)\n#define AV_PIX_FMT_P412       AV_PIX_FMT_NE(P412BE, P412LE)\n#define AV_PIX_FMT_P216       AV_PIX_FMT_NE(P216BE, P216LE)\n#define AV_PIX_FMT_P416       AV_PIX_FMT_NE(P416BE, P416LE)\n\n#define AV_PIX_FMT_RGBF16     AV_PIX_FMT_NE(RGBF16BE, RGBF16LE)\n#define AV_PIX_FMT_RGBAF16    AV_PIX_FMT_NE(RGBAF16BE, RGBAF16LE)\n\n#define AV_PIX_FMT_RGBF32     AV_PIX_FMT_NE(RGBF32BE, RGBF32LE)\n#define AV_PIX_FMT_RGBAF32    AV_PIX_FMT_NE(RGBAF32BE, RGBAF32LE)\n\n#define AV_PIX_FMT_RGB96      AV_PIX_FMT_NE(RGB96BE, RGB96LE)\n#define AV_PIX_FMT_RGBA128    AV_PIX_FMT_NE(RGBA128BE, RGBA128LE)\n\n/**\n  * Chromaticity coordinates of the source primaries.\n  * These values match the ones defined by ISO/IEC 23091-2_2019 subclause 8.1 and ITU-T H.273.\n  */\nenum AVColorPrimaries {\n    AVCOL_PRI_RESERVED0   = 0,\n    AVCOL_PRI_BT709       = 1,  ///< also ITU-R BT1361 / IEC 61966-2-4 / SMPTE RP 177 Annex B\n    AVCOL_PRI_UNSPECIFIED = 2,\n    AVCOL_PRI_RESERVED    = 3,\n    AVCOL_PRI_BT470M      = 4,  ///< also FCC Title 47 Code of Federal Regulations 73.682 (a)(20)\n\n    AVCOL_PRI_BT470BG     = 5,  ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM\n    AVCOL_PRI_SMPTE170M   = 6,  ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC\n    AVCOL_PRI_SMPTE240M   = 7,  ///< identical to above, also called \"SMPTE C\" even though it uses D65\n    AVCOL_PRI_FILM        = 8,  ///< colour filters using Illuminant C\n    AVCOL_PRI_BT2020      = 9,  ///< ITU-R BT2020\n    AVCOL_PRI_SMPTE428    = 10, ///< SMPTE ST 428-1 (CIE 1931 XYZ)\n    AVCOL_PRI_SMPTEST428_1 = AVCOL_PRI_SMPTE428,\n    AVCOL_PRI_SMPTE431    = 11, ///< SMPTE ST 431-2 (2011) / DCI P3\n    AVCOL_PRI_SMPTE432    = 12, ///< SMPTE ST 432-1 (2010) / P3 D65 / Display P3\n    AVCOL_PRI_EBU3213     = 22, ///< EBU Tech. 3213-E (nothing there) / one of JEDEC P22 group phosphors\n    AVCOL_PRI_JEDEC_P22   = AVCOL_PRI_EBU3213,\n    AVCOL_PRI_NB                ///< Not part of ABI\n};\n\n/**\n * Color Transfer Characteristic.\n * These values match the ones defined by ISO/IEC 23091-2_2019 subclause 8.2.\n */\nenum AVColorTransferCharacteristic {\n    AVCOL_TRC_RESERVED0    = 0,\n    AVCOL_TRC_BT709        = 1,  ///< also ITU-R BT1361\n    AVCOL_TRC_UNSPECIFIED  = 2,\n    AVCOL_TRC_RESERVED     = 3,\n    AVCOL_TRC_GAMMA22      = 4,  ///< also ITU-R BT470M / ITU-R BT1700 625 PAL & SECAM\n    AVCOL_TRC_GAMMA28      = 5,  ///< also ITU-R BT470BG\n    AVCOL_TRC_SMPTE170M    = 6,  ///< also ITU-R BT601-6 525 or 625 / ITU-R BT1358 525 or 625 / ITU-R BT1700 NTSC\n    AVCOL_TRC_SMPTE240M    = 7,\n    AVCOL_TRC_LINEAR       = 8,  ///< \"Linear transfer characteristics\"\n    AVCOL_TRC_LOG          = 9,  ///< \"Logarithmic transfer characteristic (100:1 range)\"\n    AVCOL_TRC_LOG_SQRT     = 10, ///< \"Logarithmic transfer characteristic (100 * Sqrt(10) : 1 range)\"\n    AVCOL_TRC_IEC61966_2_4 = 11, ///< IEC 61966-2-4\n    AVCOL_TRC_BT1361_ECG   = 12, ///< ITU-R BT1361 Extended Colour Gamut\n    AVCOL_TRC_IEC61966_2_1 = 13, ///< IEC 61966-2-1 (sRGB or sYCC)\n    AVCOL_TRC_BT2020_10    = 14, ///< ITU-R BT2020 for 10-bit system\n    AVCOL_TRC_BT2020_12    = 15, ///< ITU-R BT2020 for 12-bit system\n    AVCOL_TRC_SMPTE2084    = 16, ///< SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems\n    AVCOL_TRC_SMPTEST2084  = AVCOL_TRC_SMPTE2084,\n    AVCOL_TRC_SMPTE428     = 17, ///< SMPTE ST 428-1\n    AVCOL_TRC_SMPTEST428_1 = AVCOL_TRC_SMPTE428,\n    AVCOL_TRC_ARIB_STD_B67 = 18, ///< ARIB STD-B67, known as \"Hybrid log-gamma\"\n    AVCOL_TRC_NB                 ///< Not part of ABI\n};\n\n/**\n * YUV colorspace type.\n * These values match the ones defined by ISO/IEC 23091-2_2019 subclause 8.3.\n */\nenum AVColorSpace {\n    AVCOL_SPC_RGB         = 0,  ///< order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB), YZX and ST 428-1\n    AVCOL_SPC_BT709       = 1,  ///< also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / derived in SMPTE RP 177 Annex B\n    AVCOL_SPC_UNSPECIFIED = 2,\n    AVCOL_SPC_RESERVED    = 3,  ///< reserved for future use by ITU-T and ISO/IEC just like 15-255 are\n    AVCOL_SPC_FCC         = 4,  ///< FCC Title 47 Code of Federal Regulations 73.682 (a)(20)\n    AVCOL_SPC_BT470BG     = 5,  ///< also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601\n    AVCOL_SPC_SMPTE170M   = 6,  ///< also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC / functionally identical to above\n    AVCOL_SPC_SMPTE240M   = 7,  ///< derived from 170M primaries and D65 white point, 170M is derived from BT470 System M's primaries\n    AVCOL_SPC_YCGCO       = 8,  ///< used by Dirac / VC-2 and H.264 FRext, see ITU-T SG16\n    AVCOL_SPC_YCOCG       = AVCOL_SPC_YCGCO,\n    AVCOL_SPC_BT2020_NCL  = 9,  ///< ITU-R BT2020 non-constant luminance system\n    AVCOL_SPC_BT2020_CL   = 10, ///< ITU-R BT2020 constant luminance system\n    AVCOL_SPC_SMPTE2085   = 11, ///< SMPTE 2085, Y'D'zD'x\n    AVCOL_SPC_CHROMA_DERIVED_NCL = 12, ///< Chromaticity-derived non-constant luminance system\n    AVCOL_SPC_CHROMA_DERIVED_CL = 13, ///< Chromaticity-derived constant luminance system\n    AVCOL_SPC_ICTCP       = 14, ///< ITU-R BT.2100-0, ICtCp\n    AVCOL_SPC_IPT_C2      = 15, ///< SMPTE ST 2128, IPT-C2\n    AVCOL_SPC_YCGCO_RE    = 16, ///< YCgCo-R, even addition of bits\n    AVCOL_SPC_YCGCO_RO    = 17, ///< YCgCo-R, odd addition of bits\n    AVCOL_SPC_NB                ///< Not part of ABI\n};\n\n/**\n * Visual content value range.\n *\n * These values are based on definitions that can be found in multiple\n * specifications, such as ITU-T BT.709 (3.4 - Quantization of RGB, luminance\n * and colour-difference signals), ITU-T BT.2020 (Table 5 - Digital\n * Representation) as well as ITU-T BT.2100 (Table 9 - Digital 10- and 12-bit\n * integer representation). At the time of writing, the BT.2100 one is\n * recommended, as it also defines the full range representation.\n *\n * Common definitions:\n *   - For RGB and luma planes such as Y in YCbCr and I in ICtCp,\n *     'E' is the original value in range of 0.0 to 1.0.\n *   - For chroma planes such as Cb,Cr and Ct,Cp, 'E' is the original\n *     value in range of -0.5 to 0.5.\n *   - 'n' is the output bit depth.\n *   - For additional definitions such as rounding and clipping to valid n\n *     bit unsigned integer range, please refer to BT.2100 (Table 9).\n */\nenum AVColorRange {\n    AVCOL_RANGE_UNSPECIFIED = 0,\n\n    /**\n     * Narrow or limited range content.\n     *\n     * - For luma planes:\n     *\n     *       (219 * E + 16) * 2^(n-8)\n     *\n     *   F.ex. the range of 16-235 for 8 bits\n     *\n     * - For chroma planes:\n     *\n     *       (224 * E + 128) * 2^(n-8)\n     *\n     *   F.ex. the range of 16-240 for 8 bits\n     */\n    AVCOL_RANGE_MPEG        = 1,\n\n    /**\n     * Full range content.\n     *\n     * - For RGB and luma planes:\n     *\n     *       (2^n - 1) * E\n     *\n     *   F.ex. the range of 0-255 for 8 bits\n     *\n     * - For chroma planes:\n     *\n     *       (2^n - 1) * E + 2^(n - 1)\n     *\n     *   F.ex. the range of 1-255 for 8 bits\n     */\n    AVCOL_RANGE_JPEG        = 2,\n    AVCOL_RANGE_NB               ///< Not part of ABI\n};\n\n/**\n * Location of chroma samples.\n *\n * Illustration showing the location of the first (top left) chroma sample of the\n * image, the left shows only luma, the right\n * shows the location of the chroma sample, the 2 could be imagined to overlay\n * each other but are drawn separately due to limitations of ASCII\n *\n *                1st 2nd       1st 2nd horizontal luma sample positions\n *                 v   v         v   v\n *                 ______        ______\n *1st luma line > |X   X ...    |3 4 X ...     X are luma samples,\n *                |             |1 2           1-6 are possible chroma positions\n *2nd luma line > |X   X ...    |5 6 X ...     0 is undefined/unknown position\n */\nenum AVChromaLocation {\n    AVCHROMA_LOC_UNSPECIFIED = 0,\n    AVCHROMA_LOC_LEFT        = 1, ///< MPEG-2/4 4:2:0, H.264 default for 4:2:0\n    AVCHROMA_LOC_CENTER      = 2, ///< MPEG-1 4:2:0, JPEG 4:2:0, H.263 4:2:0\n    AVCHROMA_LOC_TOPLEFT     = 3, ///< ITU-R 601, SMPTE 274M 296M S314M(DV 4:1:1), mpeg2 4:2:2\n    AVCHROMA_LOC_TOP         = 4,\n    AVCHROMA_LOC_BOTTOMLEFT  = 5,\n    AVCHROMA_LOC_BOTTOM      = 6,\n    AVCHROMA_LOC_NB               ///< Not part of ABI\n};\n\n#endif /* AVUTIL_PIXFMT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/random_seed.h",
    "content": "/*\n * Copyright (c) 2009 Baptiste Coudurier <baptiste.coudurier@gmail.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_RANDOM_SEED_H\n#define AVUTIL_RANDOM_SEED_H\n\n#include <stddef.h>\n#include <stdint.h>\n/**\n * @addtogroup lavu_crypto\n * @{\n */\n\n/**\n * Get a seed to use in conjunction with random functions.\n * This function tries to provide a good seed at a best effort bases.\n * Its possible to call this function multiple times if more bits are needed.\n * It can be quite slow, which is why it should only be used as seed for a faster\n * PRNG. The quality of the seed depends on the platform.\n */\nuint32_t av_get_random_seed(void);\n\n/**\n * Generate cryptographically secure random data, i.e. suitable for use as\n * encryption keys and similar.\n *\n * @param buf buffer into which the random data will be written\n * @param len size of buf in bytes\n *\n * @retval 0                         success, len bytes of random data was written\n *                                   into buf\n * @retval \"a negative AVERROR code\" random data could not be generated\n */\nint av_random_bytes(uint8_t *buf, size_t len);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_RANDOM_SEED_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/rational.h",
    "content": "/*\n * rational numbers\n * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_math_rational\n * Utilities for rational number calculation.\n * @author Michael Niedermayer <michaelni@gmx.at>\n */\n\n#ifndef AVUTIL_RATIONAL_H\n#define AVUTIL_RATIONAL_H\n\n#include <stdint.h>\n#include <limits.h>\n#include \"attributes.h\"\n\n/**\n * @defgroup lavu_math_rational AVRational\n * @ingroup lavu_math\n * Rational number calculation.\n *\n * While rational numbers can be expressed as floating-point numbers, the\n * conversion process is a lossy one, so are floating-point operations. On the\n * other hand, the nature of FFmpeg demands highly accurate calculation of\n * timestamps. This set of rational number utilities serves as a generic\n * interface for manipulating rational numbers as pairs of numerators and\n * denominators.\n *\n * Many of the functions that operate on AVRational's have the suffix `_q`, in\n * reference to the mathematical symbol \"ℚ\" (Q) which denotes the set of all\n * rational numbers.\n *\n * @{\n */\n\n/**\n * Rational number (pair of numerator and denominator).\n */\ntypedef struct AVRational{\n    int num; ///< Numerator\n    int den; ///< Denominator\n} AVRational;\n\n/**\n * Create an AVRational.\n *\n * Useful for compilers that do not support compound literals.\n *\n * @note The return value is not reduced.\n * @see av_reduce()\n */\nstatic inline AVRational av_make_q(int num, int den)\n{\n    AVRational r = { num, den };\n    return r;\n}\n\n/**\n * Compare two rationals.\n *\n * @param a First rational\n * @param b Second rational\n *\n * @return One of the following values:\n *         - 0 if `a == b`\n *         - 1 if `a > b`\n *         - -1 if `a < b`\n *         - `INT_MIN` if one of the values is of the form `0 / 0`\n */\nstatic inline int av_cmp_q(AVRational a, AVRational b){\n    const int64_t tmp= a.num * (int64_t)b.den - b.num * (int64_t)a.den;\n\n    if(tmp) return (int)((tmp ^ a.den ^ b.den)>>63)|1;\n    else if(b.den && a.den) return 0;\n    else if(a.num && b.num) return (a.num>>31) - (b.num>>31);\n    else                    return INT_MIN;\n}\n\n/**\n * Convert an AVRational to a `double`.\n * @param a AVRational to convert\n * @return `a` in floating-point form\n * @see av_d2q()\n */\nstatic inline double av_q2d(AVRational a){\n    return a.num / (double) a.den;\n}\n\n/**\n * Reduce a fraction.\n *\n * This is useful for framerate calculations.\n *\n * @param[out] dst_num Destination numerator\n * @param[out] dst_den Destination denominator\n * @param[in]      num Source numerator\n * @param[in]      den Source denominator\n * @param[in]      max Maximum allowed values for `dst_num` & `dst_den`\n * @return 1 if the operation is exact, 0 otherwise\n */\nint av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max);\n\n/**\n * Multiply two rationals.\n * @param b First rational\n * @param c Second rational\n * @return b*c\n */\nAVRational av_mul_q(AVRational b, AVRational c) av_const;\n\n/**\n * Divide one rational by another.\n * @param b First rational\n * @param c Second rational\n * @return b/c\n */\nAVRational av_div_q(AVRational b, AVRational c) av_const;\n\n/**\n * Add two rationals.\n * @param b First rational\n * @param c Second rational\n * @return b+c\n */\nAVRational av_add_q(AVRational b, AVRational c) av_const;\n\n/**\n * Subtract one rational from another.\n * @param b First rational\n * @param c Second rational\n * @return b-c\n */\nAVRational av_sub_q(AVRational b, AVRational c) av_const;\n\n/**\n * Invert a rational.\n * @param q value\n * @return 1 / q\n */\nstatic av_always_inline AVRational av_inv_q(AVRational q)\n{\n    AVRational r = { q.den, q.num };\n    return r;\n}\n\n/**\n * Convert a double precision floating point number to a rational.\n *\n * In case of infinity, the returned value is expressed as `{1, 0}` or\n * `{-1, 0}` depending on the sign.\n *\n * In general rational numbers with |num| <= 1<<26 && |den| <= 1<<26\n * can be recovered exactly from their double representation.\n * (no exceptions were found within 1B random ones)\n *\n * @param d   `double` to convert\n * @param max Maximum allowed numerator and denominator\n * @return `d` in AVRational form\n * @see av_q2d()\n */\nAVRational av_d2q(double d, int max) av_const;\n\n/**\n * Find which of the two rationals is closer to another rational.\n *\n * @param q     Rational to be compared against\n * @param q1    Rational to be tested\n * @param q2    Rational to be tested\n * @return One of the following values:\n *         - 1 if `q1` is nearer to `q` than `q2`\n *         - -1 if `q2` is nearer to `q` than `q1`\n *         - 0 if they have the same distance\n */\nint av_nearer_q(AVRational q, AVRational q1, AVRational q2);\n\n/**\n * Find the value in a list of rationals nearest a given reference rational.\n *\n * @param q      Reference rational\n * @param q_list Array of rationals terminated by `{0, 0}`\n * @return Index of the nearest value found in the array\n */\nint av_find_nearest_q_idx(AVRational q, const AVRational* q_list);\n\n/**\n * Convert an AVRational to a IEEE 32-bit `float` expressed in fixed-point\n * format.\n *\n * @param q Rational to be converted\n * @return Equivalent floating-point value, expressed as an unsigned 32-bit\n *         integer.\n * @note The returned value is platform-indepedant.\n */\nuint32_t av_q2intfloat(AVRational q);\n\n/**\n * Return the best rational so that a and b are multiple of it.\n * If the resulting denominator is larger than max_den, return def.\n */\nAVRational av_gcd_q(AVRational a, AVRational b, int max_den, AVRational def);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_RATIONAL_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/rc4.h",
    "content": "/*\n * RC4 encryption/decryption/pseudo-random number generator\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_RC4_H\n#define AVUTIL_RC4_H\n\n#include <stdint.h>\n\n/**\n * @defgroup lavu_rc4 RC4\n * @ingroup lavu_crypto\n * @{\n */\n\ntypedef struct AVRC4 {\n    uint8_t state[256];\n    int x, y;\n} AVRC4;\n\n/**\n * Allocate an AVRC4 context.\n */\nAVRC4 *av_rc4_alloc(void);\n\n/**\n * @brief Initializes an AVRC4 context.\n *\n * @param d pointer to the AVRC4 context\n * @param key buffer containing the key\n * @param key_bits must be a multiple of 8\n * @param decrypt 0 for encryption, 1 for decryption, currently has no effect\n * @return zero on success, negative value otherwise\n */\nint av_rc4_init(struct AVRC4 *d, const uint8_t *key, int key_bits, int decrypt);\n\n/**\n * @brief Encrypts / decrypts using the RC4 algorithm.\n *\n * @param d pointer to the AVRC4 context\n * @param count number of bytes\n * @param dst destination array, can be equal to src\n * @param src source array, can be equal to dst, may be NULL\n * @param iv not (yet) used for RC4, should be NULL\n * @param decrypt 0 for encryption, 1 for decryption, not (yet) used\n */\nvoid av_rc4_crypt(struct AVRC4 *d, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_RC4_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/refstruct.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_REFSTRUCT_H\n#define AVUTIL_REFSTRUCT_H\n\n#include <stddef.h>\n\n/**\n * RefStruct is an API for creating reference-counted objects\n * with minimal overhead. The API is designed for objects,\n * not buffers like the AVBuffer API. The main differences\n * to the AVBuffer API are as follows:\n *\n * - It uses void* instead of uint8_t* as its base type due to\n *   its focus on objects.\n * - There are no equivalents of AVBuffer and AVBufferRef.\n *   E.g. there is no way to get the usable size of the object:\n *   The user is supposed to know what is at the other end of\n *   the pointer. It also avoids one level of indirection.\n * - Custom allocators are not supported. This allows to simplify\n *   the implementation and reduce the amount of allocations.\n * - It also has the advantage that the user's free callback need\n *   only free the resources owned by the object, but not the\n *   object itself.\n * - Because referencing (and replacing) an object managed by the\n *   RefStruct API does not involve allocations, they can not fail\n *   and therefore need not be checked.\n *\n * @note Referencing and unreferencing the buffers is thread-safe and thus\n * may be done from multiple threads simultaneously without any need for\n * additional locking.\n */\n\n/**\n * This union is used for all opaque parameters in this API to spare the user\n * to cast const away in case the opaque to use is const-qualified.\n *\n * The functions provided by this API with an AVRefStructOpaque come in pairs\n * named foo_c and foo. The foo function accepts void* as opaque and is just\n * a wrapper around the foo_c function; \"_c\" means \"(potentially) const\".\n */\ntypedef union {\n    void *nc;\n    const void *c;\n} AVRefStructOpaque;\n\n/**\n * If this flag is set in av_refstruct_alloc_ext_c(), the object will not\n * be initially zeroed.\n */\n#define AV_REFSTRUCT_FLAG_NO_ZEROING (1 << 0)\n\n/**\n * Allocate a refcounted object of usable size `size` managed via\n * the RefStruct API.\n *\n * By default (in the absence of flags to the contrary),\n * the returned object is initially zeroed.\n *\n * @param size    Desired usable size of the returned object.\n * @param flags   A bitwise combination of AV_REFSTRUCT_FLAG_* flags.\n * @param opaque  A pointer that will be passed to the free_cb callback.\n * @param free_cb A callback for freeing this object's content\n *                when its reference count reaches zero;\n *                it must not free the object itself.\n * @return A pointer to an object of the desired size or NULL on failure.\n */\nvoid *av_refstruct_alloc_ext_c(size_t size, unsigned flags, AVRefStructOpaque opaque,\n                               void (*free_cb)(AVRefStructOpaque opaque, void *obj));\n\n/**\n * A wrapper around av_refstruct_alloc_ext_c() for the common case\n * of a non-const qualified opaque.\n *\n * @see av_refstruct_alloc_ext_c()\n */\nstatic inline\nvoid *av_refstruct_alloc_ext(size_t size, unsigned flags, void *opaque,\n                             void (*free_cb)(AVRefStructOpaque opaque, void *obj))\n{\n    return av_refstruct_alloc_ext_c(size, flags, (AVRefStructOpaque){.nc = opaque},\n                                    free_cb);\n}\n\n/**\n * Equivalent to av_refstruct_alloc_ext(size, 0, NULL, NULL)\n */\nstatic inline\nvoid *av_refstruct_allocz(size_t size)\n{\n    return av_refstruct_alloc_ext(size, 0, NULL, NULL);\n}\n\n/**\n * Decrement the reference count of the underlying object and automatically\n * free the object if there are no more references to it.\n *\n * `*objp == NULL` is legal and a no-op.\n *\n * @param objp Pointer to a pointer that is either NULL or points to an object\n *             managed via this API. `*objp` is set to NULL on return.\n */\nvoid av_refstruct_unref(void *objp);\n\n/**\n * Create a new reference to an object managed via this API,\n * i.e. increment the reference count of the underlying object\n * and return obj.\n * @return a pointer equal to obj.\n */\nvoid *av_refstruct_ref(void *obj);\n\n/**\n * Analog of av_refstruct_ref(), but for constant objects.\n * @see av_refstruct_ref()\n */\nconst void *av_refstruct_ref_c(const void *obj);\n\n/**\n * Ensure `*dstp` refers to the same object as src.\n *\n * If `*dstp` is already equal to src, do nothing. Otherwise unreference `*dstp`\n * and replace it with a new reference to src in case `src != NULL` (this\n * involves incrementing the reference count of src's underlying object) or\n * with NULL otherwise.\n *\n * @param dstp Pointer to a pointer that is either NULL or points to an object\n *             managed via this API.\n * @param src  A pointer to an object managed via this API or NULL.\n */\nvoid av_refstruct_replace(void *dstp, const void *src);\n\n/**\n * Check whether the reference count of an object managed\n * via this API is 1.\n *\n * @param obj A pointer to an object managed via this API.\n * @return 1 if the reference count of obj is 1; 0 otherwise.\n */\nint av_refstruct_exclusive(const void *obj);\n\n/**\n * AVRefStructPool is an API for a thread-safe pool of objects managed\n * via the RefStruct API.\n *\n * Frequently allocating and freeing large or complicated objects may be slow\n * and wasteful. This API is meant to solve this in cases when the caller\n * needs a set of interchangeable objects.\n *\n * At the beginning, the user must call allocate the pool via\n * av_refstruct_pool_alloc() or its analogue av_refstruct_pool_alloc_ext().\n * Then whenever an object is needed, call av_refstruct_pool_get() to\n * get a new or reused object from the pool. This new object works in all\n * aspects the same way as the ones created by av_refstruct_alloc_ext().\n * However, when the last reference to this object is unreferenced, it is\n * (optionally) reset and returned to the pool instead of being freed and\n * will be reused for subsequent av_refstruct_pool_get() calls.\n *\n * When the caller is done with the pool and no longer needs to create any new\n * objects, av_refstruct_pool_uninit() must be called to mark the pool as\n * freeable. Then entries returned to the pool will then be freed.\n * Once all the entries are freed, the pool will automatically be freed.\n *\n * Allocating and releasing objects with this API is thread-safe as long as\n * the user-supplied callbacks (if provided) are thread-safe.\n */\n\n/**\n * The buffer pool. This structure is opaque and not meant to be accessed\n * directly. It is allocated with the allocators below and freed with\n * av_refstruct_pool_uninit().\n */\ntypedef struct AVRefStructPool AVRefStructPool;\n\n/**\n * If this flag is not set, every object in the pool will be zeroed before\n * the init callback is called or before it is turned over to the user\n * for the first time if no init callback has been provided.\n */\n#define AV_REFSTRUCT_POOL_FLAG_NO_ZEROING         AV_REFSTRUCT_FLAG_NO_ZEROING\n/**\n * If this flag is set and both init_cb and reset_cb callbacks are provided,\n * then reset_cb will be called if init_cb fails.\n * The object passed to reset_cb will be in the state left by init_cb.\n */\n#define AV_REFSTRUCT_POOL_FLAG_RESET_ON_INIT_ERROR                   (1 << 16)\n/**\n * If this flag is set and both init_cb and free_entry_cb callbacks are\n * provided, then free_cb will be called if init_cb fails.\n *\n * It will be called after reset_cb in case reset_cb and the\n * AV_REFSTRUCT_POOL_FLAG_RESET_ON_INIT_ERROR flag are also set.\n *\n * The object passed to free_cb will be in the state left by\n * the callbacks applied earlier (init_cb potentially followed by reset_cb).\n */\n#define AV_REFSTRUCT_POOL_FLAG_FREE_ON_INIT_ERROR                    (1 << 17)\n/**\n * If this flag is set, the entries will be zeroed before\n * being returned to the user (after the init or reset callbacks\n * have been called (if provided)). Furthermore, to avoid zeroing twice\n * it also makes the pool behave as if the AV_REFSTRUCT_POOL_FLAG_NO_ZEROING\n * flag had been provided.\n */\n#define AV_REFSTRUCT_POOL_FLAG_ZERO_EVERY_TIME                       (1 << 18)\n\n/**\n * Equivalent to av_refstruct_pool_alloc(size, flags, NULL, NULL, NULL, NULL, NULL)\n */\nAVRefStructPool *av_refstruct_pool_alloc(size_t size, unsigned flags);\n\n/**\n * Allocate an AVRefStructPool, potentially using complex callbacks.\n *\n * @param size size of the entries of the pool\n * @param flags a bitwise combination of AV_REFSTRUCT_POOL_FLAG_* flags\n * @param opaque A pointer that will be passed to the callbacks below.\n * @param init  A callback that will be called directly after a new entry\n *              has been allocated. obj has already been zeroed unless\n *              the AV_REFSTRUCT_POOL_FLAG_NO_ZEROING flag is in use.\n * @param reset A callback that will be called after an entry has been\n *              returned to the pool and before it is reused.\n * @param free_entry A callback that will be called when an entry is freed\n *                   after the pool has been marked as to be uninitialized.\n * @param free       A callback that will be called when the pool itself is\n *                   freed (after the last entry has been returned and freed).\n */\nAVRefStructPool *av_refstruct_pool_alloc_ext_c(size_t size, unsigned flags,\n                                               AVRefStructOpaque opaque,\n                                               int  (*init_cb)(AVRefStructOpaque opaque, void *obj),\n                                               void (*reset_cb)(AVRefStructOpaque opaque, void *obj),\n                                               void (*free_entry_cb)(AVRefStructOpaque opaque, void *obj),\n                                               void (*free_cb)(AVRefStructOpaque opaque));\n\n/**\n * A wrapper around av_refstruct_pool_alloc_ext_c() for the common case\n * of a non-const qualified opaque.\n *\n * @see av_refstruct_pool_alloc_ext_c()\n */\nstatic inline\nAVRefStructPool *av_refstruct_pool_alloc_ext(size_t size, unsigned flags,\n                                             void *opaque,\n                                             int  (*init_cb)(AVRefStructOpaque opaque, void *obj),\n                                             void (*reset_cb)(AVRefStructOpaque opaque, void *obj),\n                                             void (*free_entry_cb)(AVRefStructOpaque opaque, void *obj),\n                                             void (*free_cb)(AVRefStructOpaque opaque))\n{\n    return av_refstruct_pool_alloc_ext_c(size, flags, (AVRefStructOpaque){.nc = opaque},\n                                         init_cb, reset_cb, free_entry_cb, free_cb);\n}\n\n/**\n * Get an object from the pool, reusing an old one from the pool when\n * available.\n *\n * Every call to this function must happen before av_refstruct_pool_uninit().\n * Otherwise undefined behaviour may occur.\n *\n * @param pool the pool from which to get the object\n * @return a reference to the object on success, NULL on error.\n */\nvoid *av_refstruct_pool_get(AVRefStructPool *pool);\n\n/**\n * Mark the pool as being available for freeing. It will actually be freed\n * only once all the allocated buffers associated with the pool are released.\n * Thus it is safe to call this function while some of the allocated buffers\n * are still in use.\n *\n * It is illegal to try to get a new entry after this function has been called.\n *\n * @param poolp pointer to a pointer to either NULL or a pool to be freed.\n *              `*poolp` will be set to NULL.\n */\nstatic inline void av_refstruct_pool_uninit(AVRefStructPool **poolp)\n{\n    av_refstruct_unref(poolp);\n}\n\n#endif /* AVUTIL_REFSTRUCT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/replaygain.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_REPLAYGAIN_H\n#define AVUTIL_REPLAYGAIN_H\n\n#include <stdint.h>\n\n/**\n * ReplayGain information (see\n * http://wiki.hydrogenaudio.org/index.php?title=ReplayGain_1.0_specification).\n * The size of this struct is a part of the public ABI.\n */\ntypedef struct AVReplayGain {\n    /**\n     * Track replay gain in microbels (divide by 100000 to get the value in dB).\n     * Should be set to INT32_MIN when unknown.\n     */\n    int32_t track_gain;\n    /**\n     * Peak track amplitude, with 100000 representing full scale (but values\n     * may overflow). 0 when unknown.\n     */\n    uint32_t track_peak;\n    /**\n     * Same as track_gain, but for the whole album.\n     */\n    int32_t album_gain;\n    /**\n     * Same as track_peak, but for the whole album,\n     */\n    uint32_t album_peak;\n} AVReplayGain;\n\n#endif /* AVUTIL_REPLAYGAIN_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/ripemd.h",
    "content": "/*\n * Copyright (C) 2007 Michael Niedermayer <michaelni@gmx.at>\n * Copyright (C) 2013 James Almer <jamrial@gmail.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_ripemd\n * Public header for RIPEMD hash function implementation.\n */\n\n#ifndef AVUTIL_RIPEMD_H\n#define AVUTIL_RIPEMD_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"attributes.h\"\n\n/**\n * @defgroup lavu_ripemd RIPEMD\n * @ingroup lavu_hash\n * RIPEMD hash function implementation.\n *\n * @{\n */\n\nextern const int av_ripemd_size;\n\nstruct AVRIPEMD;\n\n/**\n * Allocate an AVRIPEMD context.\n */\nstruct AVRIPEMD *av_ripemd_alloc(void);\n\n/**\n * Initialize RIPEMD hashing.\n *\n * @param context pointer to the function context (of size av_ripemd_size)\n * @param bits    number of bits in digest (128, 160, 256 or 320 bits)\n * @return        zero if initialization succeeded, -1 otherwise\n */\nint av_ripemd_init(struct AVRIPEMD* context, int bits);\n\n/**\n * Update hash value.\n *\n * @param context hash function context\n * @param data    input data to update hash with\n * @param len     input data length\n */\nvoid av_ripemd_update(struct AVRIPEMD* context, const uint8_t* data, size_t len);\n\n/**\n * Finish hashing and output digest value.\n *\n * @param context hash function context\n * @param digest  buffer where output digest value is stored\n */\nvoid av_ripemd_final(struct AVRIPEMD* context, uint8_t *digest);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_RIPEMD_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/samplefmt.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_SAMPLEFMT_H\n#define AVUTIL_SAMPLEFMT_H\n\n#include <stdint.h>\n\n/**\n * @addtogroup lavu_audio\n * @{\n *\n * @defgroup lavu_sampfmts Audio sample formats\n *\n * Audio sample format enumeration and related convenience functions.\n * @{\n */\n\n/**\n * Audio sample formats\n *\n * - The data described by the sample format is always in native-endian order.\n *   Sample values can be expressed by native C types, hence the lack of a signed\n *   24-bit sample format even though it is a common raw audio data format.\n *\n * - The floating-point formats are based on full volume being in the range\n *   [-1.0, 1.0]. Any values outside this range are beyond full volume level.\n *\n * - The data layout as used in av_samples_fill_arrays() and elsewhere in FFmpeg\n *   (such as AVFrame in libavcodec) is as follows:\n *\n * @par\n * For planar sample formats, each audio channel is in a separate data plane,\n * and linesize is the buffer size, in bytes, for a single plane. All data\n * planes must be the same size. For packed sample formats, only the first data\n * plane is used, and samples for each channel are interleaved. In this case,\n * linesize is the buffer size, in bytes, for the 1 plane.\n *\n */\nenum AVSampleFormat {\n    AV_SAMPLE_FMT_NONE = -1,\n    AV_SAMPLE_FMT_U8,          ///< unsigned 8 bits\n    AV_SAMPLE_FMT_S16,         ///< signed 16 bits\n    AV_SAMPLE_FMT_S32,         ///< signed 32 bits\n    AV_SAMPLE_FMT_FLT,         ///< float\n    AV_SAMPLE_FMT_DBL,         ///< double\n\n    AV_SAMPLE_FMT_U8P,         ///< unsigned 8 bits, planar\n    AV_SAMPLE_FMT_S16P,        ///< signed 16 bits, planar\n    AV_SAMPLE_FMT_S32P,        ///< signed 32 bits, planar\n    AV_SAMPLE_FMT_FLTP,        ///< float, planar\n    AV_SAMPLE_FMT_DBLP,        ///< double, planar\n    AV_SAMPLE_FMT_S64,         ///< signed 64 bits\n    AV_SAMPLE_FMT_S64P,        ///< signed 64 bits, planar\n\n    AV_SAMPLE_FMT_NB           ///< Number of sample formats. DO NOT USE if linking dynamically\n};\n\n/**\n * Return the name of sample_fmt, or NULL if sample_fmt is not\n * recognized.\n */\nconst char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt);\n\n/**\n * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE\n * on error.\n */\nenum AVSampleFormat av_get_sample_fmt(const char *name);\n\n/**\n * Return the planar<->packed alternative form of the given sample format, or\n * AV_SAMPLE_FMT_NONE on error. If the passed sample_fmt is already in the\n * requested planar/packed format, the format returned is the same as the\n * input.\n */\nenum AVSampleFormat av_get_alt_sample_fmt(enum AVSampleFormat sample_fmt, int planar);\n\n/**\n * Get the packed alternative form of the given sample format.\n *\n * If the passed sample_fmt is already in packed format, the format returned is\n * the same as the input.\n *\n * @return  the packed alternative form of the given sample format or\n            AV_SAMPLE_FMT_NONE on error.\n */\nenum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt);\n\n/**\n * Get the planar alternative form of the given sample format.\n *\n * If the passed sample_fmt is already in planar format, the format returned is\n * the same as the input.\n *\n * @return  the planar alternative form of the given sample format or\n            AV_SAMPLE_FMT_NONE on error.\n */\nenum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt);\n\n/**\n * Generate a string corresponding to the sample format with\n * sample_fmt, or a header if sample_fmt is negative.\n *\n * @param buf the buffer where to write the string\n * @param buf_size the size of buf\n * @param sample_fmt the number of the sample format to print the\n * corresponding info string, or a negative value to print the\n * corresponding header.\n * @return the pointer to the filled buffer or NULL if sample_fmt is\n * unknown or in case of other errors\n */\nchar *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt);\n\n/**\n * Return number of bytes per sample.\n *\n * @param sample_fmt the sample format\n * @return number of bytes per sample or zero if unknown for the given\n * sample format\n */\nint av_get_bytes_per_sample(enum AVSampleFormat sample_fmt);\n\n/**\n * Check if the sample format is planar.\n *\n * @param sample_fmt the sample format to inspect\n * @return 1 if the sample format is planar, 0 if it is interleaved\n */\nint av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt);\n\n/**\n * Get the required buffer size for the given audio parameters.\n *\n * @param[out] linesize calculated linesize, may be NULL\n * @param nb_channels   the number of channels\n * @param nb_samples    the number of samples in a single channel\n * @param sample_fmt    the sample format\n * @param align         buffer size alignment (0 = default, 1 = no alignment)\n * @return              required buffer size, or negative error code on failure\n */\nint av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples,\n                               enum AVSampleFormat sample_fmt, int align);\n\n/**\n * @}\n *\n * @defgroup lavu_sampmanip Samples manipulation\n *\n * Functions that manipulate audio samples\n * @{\n */\n\n/**\n * Fill plane data pointers and linesize for samples with sample\n * format sample_fmt.\n *\n * The audio_data array is filled with the pointers to the samples data planes:\n * for planar, set the start point of each channel's data within the buffer,\n * for packed, set the start point of the entire buffer only.\n *\n * The value pointed to by linesize is set to the aligned size of each\n * channel's data buffer for planar layout, or to the aligned size of the\n * buffer for all channels for packed layout.\n *\n * The buffer in buf must be big enough to contain all the samples\n * (use av_samples_get_buffer_size() to compute its minimum size),\n * otherwise the audio_data pointers will point to invalid data.\n *\n * @see enum AVSampleFormat\n * The documentation for AVSampleFormat describes the data layout.\n *\n * @param[out] audio_data  array to be filled with the pointer for each channel\n * @param[out] linesize    calculated linesize, may be NULL\n * @param buf              the pointer to a buffer containing the samples\n * @param nb_channels      the number of channels\n * @param nb_samples       the number of samples in a single channel\n * @param sample_fmt       the sample format\n * @param align            buffer size alignment (0 = default, 1 = no alignment)\n * @return                 minimum size in bytes required for the buffer on success,\n *                         or a negative error code on failure\n */\nint av_samples_fill_arrays(uint8_t **audio_data, int *linesize,\n                           const uint8_t *buf,\n                           int nb_channels, int nb_samples,\n                           enum AVSampleFormat sample_fmt, int align);\n\n/**\n * Allocate a samples buffer for nb_samples samples, and fill data pointers and\n * linesize accordingly.\n * The allocated samples buffer can be freed by using av_freep(&audio_data[0])\n * Allocated data will be initialized to silence.\n *\n * @see enum AVSampleFormat\n * The documentation for AVSampleFormat describes the data layout.\n *\n * @param[out] audio_data  array to be filled with the pointer for each channel\n * @param[out] linesize    aligned size for audio buffer(s), may be NULL\n * @param nb_channels      number of audio channels\n * @param nb_samples       number of samples per channel\n * @param sample_fmt       the sample format\n * @param align            buffer size alignment (0 = default, 1 = no alignment)\n * @return                 >=0 on success or a negative error code on failure\n * @todo return the size of the allocated buffer in case of success at the next bump\n * @see av_samples_fill_arrays()\n * @see av_samples_alloc_array_and_samples()\n */\nint av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels,\n                     int nb_samples, enum AVSampleFormat sample_fmt, int align);\n\n/**\n * Allocate a data pointers array, samples buffer for nb_samples\n * samples, and fill data pointers and linesize accordingly.\n *\n * This is the same as av_samples_alloc(), but also allocates the data\n * pointers array.\n *\n * @see av_samples_alloc()\n */\nint av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels,\n                                       int nb_samples, enum AVSampleFormat sample_fmt, int align);\n\n/**\n * Copy samples from src to dst.\n *\n * @param dst destination array of pointers to data planes\n * @param src source array of pointers to data planes\n * @param dst_offset offset in samples at which the data will be written to dst\n * @param src_offset offset in samples at which the data will be read from src\n * @param nb_samples number of samples to be copied\n * @param nb_channels number of audio channels\n * @param sample_fmt audio sample format\n */\nint av_samples_copy(uint8_t * const *dst, uint8_t * const *src, int dst_offset,\n                    int src_offset, int nb_samples, int nb_channels,\n                    enum AVSampleFormat sample_fmt);\n\n/**\n * Fill an audio buffer with silence.\n *\n * @param audio_data  array of pointers to data planes\n * @param offset      offset in samples at which to start filling\n * @param nb_samples  number of samples to fill\n * @param nb_channels number of audio channels\n * @param sample_fmt  audio sample format\n */\nint av_samples_set_silence(uint8_t * const *audio_data, int offset, int nb_samples,\n                           int nb_channels, enum AVSampleFormat sample_fmt);\n\n/**\n * @}\n * @}\n */\n#endif /* AVUTIL_SAMPLEFMT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/sha.h",
    "content": "/*\n * Copyright (C) 2007 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_sha\n * Public header for SHA-1 & SHA-256 hash function implementations.\n */\n\n#ifndef AVUTIL_SHA_H\n#define AVUTIL_SHA_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"attributes.h\"\n\n/**\n * @defgroup lavu_sha SHA\n * @ingroup lavu_hash\n * SHA-1 and SHA-256 (Secure Hash Algorithm) hash function implementations.\n *\n * This module supports the following SHA hash functions:\n *\n * - SHA-1: 160 bits\n * - SHA-224: 224 bits, as a variant of SHA-2\n * - SHA-256: 256 bits, as a variant of SHA-2\n *\n * @see For SHA-384, SHA-512, and variants thereof, see @ref lavu_sha512.\n *\n * @{\n */\n\nextern const int av_sha_size;\n\nstruct AVSHA;\n\n/**\n * Allocate an AVSHA context.\n */\nstruct AVSHA *av_sha_alloc(void);\n\n/**\n * Initialize SHA-1 or SHA-2 hashing.\n *\n * @param context pointer to the function context (of size av_sha_size)\n * @param bits    number of bits in digest (SHA-1 - 160 bits, SHA-2 224 or 256 bits)\n * @return        zero if initialization succeeded, -1 otherwise\n */\nint av_sha_init(struct AVSHA* context, int bits);\n\n/**\n * Update hash value.\n *\n * @param ctx     hash function context\n * @param data    input data to update hash with\n * @param len     input data length\n */\nvoid av_sha_update(struct AVSHA *ctx, const uint8_t *data, size_t len);\n\n/**\n * Finish hashing and output digest value.\n *\n * @param context hash function context\n * @param digest  buffer where output digest value is stored\n */\nvoid av_sha_final(struct AVSHA* context, uint8_t *digest);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_SHA_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/sha512.h",
    "content": "/*\n * Copyright (C) 2007 Michael Niedermayer <michaelni@gmx.at>\n * Copyright (C) 2013 James Almer <jamrial@gmail.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_sha512\n * Public header for SHA-512 implementation.\n */\n\n#ifndef AVUTIL_SHA512_H\n#define AVUTIL_SHA512_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"attributes.h\"\n\n/**\n * @defgroup lavu_sha512 SHA-512\n * @ingroup lavu_hash\n * SHA-512 (Secure Hash Algorithm) hash function implementations.\n *\n * This module supports the following SHA-2 hash functions:\n *\n * - SHA-512/224: 224 bits\n * - SHA-512/256: 256 bits\n * - SHA-384: 384 bits\n * - SHA-512: 512 bits\n *\n * @see For SHA-1, SHA-256, and variants thereof, see @ref lavu_sha.\n *\n * @{\n */\n\nextern const int av_sha512_size;\n\nstruct AVSHA512;\n\n/**\n * Allocate an AVSHA512 context.\n */\nstruct AVSHA512 *av_sha512_alloc(void);\n\n/**\n * Initialize SHA-2 512 hashing.\n *\n * @param context pointer to the function context (of size av_sha512_size)\n * @param bits    number of bits in digest (224, 256, 384 or 512 bits)\n * @return        zero if initialization succeeded, -1 otherwise\n */\nint av_sha512_init(struct AVSHA512* context, int bits);\n\n/**\n * Update hash value.\n *\n * @param context hash function context\n * @param data    input data to update hash with\n * @param len     input data length\n */\nvoid av_sha512_update(struct AVSHA512* context, const uint8_t* data, size_t len);\n\n/**\n * Finish hashing and output digest value.\n *\n * @param context hash function context\n * @param digest  buffer where output digest value is stored\n */\nvoid av_sha512_final(struct AVSHA512* context, uint8_t *digest);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_SHA512_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/spherical.h",
    "content": "/*\n * Copyright (c) 2016 Vittorio Giovara <vittorio.giovara@gmail.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_video_spherical\n * Spherical video\n */\n\n#ifndef AVUTIL_SPHERICAL_H\n#define AVUTIL_SPHERICAL_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n/**\n * @defgroup lavu_video_spherical Spherical video mapping\n * @ingroup lavu_video\n *\n * A spherical video file contains surfaces that need to be mapped onto a\n * sphere. Depending on how the frame was converted, a different distortion\n * transformation or surface recomposition function needs to be applied before\n * the video should be mapped and displayed.\n * @{\n */\n\n/**\n * Projection of the video surface(s) on a sphere.\n */\nenum AVSphericalProjection {\n    /**\n     * Video represents a sphere mapped on a flat surface using\n     * equirectangular projection.\n     */\n    AV_SPHERICAL_EQUIRECTANGULAR,\n\n    /**\n     * Video frame is split into 6 faces of a cube, and arranged on a\n     * 3x2 layout. Faces are oriented upwards for the front, left, right,\n     * and back faces. The up face is oriented so the top of the face is\n     * forwards and the down face is oriented so the top of the face is\n     * to the back.\n     */\n    AV_SPHERICAL_CUBEMAP,\n\n    /**\n     * Video represents a portion of a sphere mapped on a flat surface\n     * using equirectangular projection. The @ref bounding fields indicate\n     * the position of the current video in a larger surface.\n     */\n    AV_SPHERICAL_EQUIRECTANGULAR_TILE,\n\n    /**\n     * Video frame displays as a 180 degree equirectangular projection.\n     */\n    AV_SPHERICAL_HALF_EQUIRECTANGULAR,\n\n    /**\n     * Video frame displays on a flat, rectangular 2D surface.\n     */\n    AV_SPHERICAL_RECTILINEAR,\n\n    /**\n     * Fisheye projection (Apple).\n     * See: https://developer.apple.com/documentation/coremedia/cmprojectiontype/fisheye\n     */\n    AV_SPHERICAL_FISHEYE,\n\n    /**\n     * Parametric Immersive projection (Apple).\n     * See: https://developer.apple.com/documentation/coremedia/cmprojectiontype/parametricimmersive\n     */\n    AV_SPHERICAL_PARAMETRIC_IMMERSIVE,\n};\n\n/**\n * This structure describes how to handle spherical videos, outlining\n * information about projection, initial layout, and any other view modifier.\n *\n * @note The struct must be allocated with av_spherical_alloc() and\n *       its size is not a part of the public ABI.\n */\ntypedef struct AVSphericalMapping {\n    /**\n     * Projection type.\n     */\n    enum AVSphericalProjection projection;\n\n    /**\n     * @name Initial orientation\n     * @{\n     * There fields describe additional rotations applied to the sphere after\n     * the video frame is mapped onto it. The sphere is rotated around the\n     * viewer, who remains stationary. The order of transformation is always\n     * yaw, followed by pitch, and finally by roll.\n     *\n     * The coordinate system matches the one defined in OpenGL, where the\n     * forward vector (z) is coming out of screen, and it is equivalent to\n     * a rotation matrix of R = r_y(yaw) * r_x(pitch) * r_z(roll).\n     *\n     * A positive yaw rotates the portion of the sphere in front of the viewer\n     * toward their right. A positive pitch rotates the portion of the sphere\n     * in front of the viewer upwards. A positive roll tilts the portion of\n     * the sphere in front of the viewer to the viewer's right.\n     *\n     * These values are exported as 16.16 fixed point.\n     *\n     * See this equirectangular projection as example:\n     *\n     * @code{.unparsed}\n     *                   Yaw\n     *     -180           0           180\n     *   90 +-------------+-------------+  180\n     *      |             |             |                  up\n     * P    |             |             |                 y|    forward\n     * i    |             ^             |                  |   /z\n     * t  0 +-------------X-------------+    0 Roll        |  /\n     * c    |             |             |                  | /\n     * h    |             |             |                 0|/_____right\n     *      |             |             |                        x\n     *  -90 +-------------+-------------+ -180\n     *\n     * X - the default camera center\n     * ^ - the default up vector\n     * @endcode\n     */\n    int32_t yaw;   ///< Rotation around the up vector [-180, 180].\n    int32_t pitch; ///< Rotation around the right vector [-90, 90].\n    int32_t roll;  ///< Rotation around the forward vector [-180, 180].\n    /**\n     * @}\n     */\n\n    /**\n     * @name Bounding rectangle\n     * @anchor bounding\n     * @{\n     * These fields indicate the location of the current tile, and where\n     * it should be mapped relative to the original surface. They are\n     * exported as 0.32 fixed point, and can be converted to classic\n     * pixel values with av_spherical_bounds().\n     *\n     * @code{.unparsed}\n     *      +----------------+----------+\n     *      |                |bound_top |\n     *      |            +--------+     |\n     *      | bound_left |tile    |     |\n     *      +<---------->|        |<--->+bound_right\n     *      |            +--------+     |\n     *      |                |          |\n     *      |    bound_bottom|          |\n     *      +----------------+----------+\n     * @endcode\n     *\n     * If needed, the original video surface dimensions can be derived\n     * by adding the current stream or frame size to the related bounds,\n     * like in the following example:\n     *\n     * @code{c}\n     *     original_width  = tile->width  + bound_left + bound_right;\n     *     original_height = tile->height + bound_top  + bound_bottom;\n     * @endcode\n     *\n     * @note These values are valid only for the tiled equirectangular\n     *       projection type (@ref AV_SPHERICAL_EQUIRECTANGULAR_TILE),\n     *       and should be ignored in all other cases.\n     */\n    uint32_t bound_left;   ///< Distance from the left edge\n    uint32_t bound_top;    ///< Distance from the top edge\n    uint32_t bound_right;  ///< Distance from the right edge\n    uint32_t bound_bottom; ///< Distance from the bottom edge\n    /**\n     * @}\n     */\n\n    /**\n     * Number of pixels to pad from the edge of each cube face.\n     *\n     * @note This value is valid for only for the cubemap projection type\n     *       (@ref AV_SPHERICAL_CUBEMAP), and should be ignored in all other\n     *       cases.\n     */\n    uint32_t padding;\n} AVSphericalMapping;\n\n/**\n * Allocate a AVSphericalVideo structure and initialize its fields to default\n * values.\n *\n * @return the newly allocated struct or NULL on failure\n */\nAVSphericalMapping *av_spherical_alloc(size_t *size);\n\n/**\n * Convert the @ref bounding fields from an AVSphericalVideo\n * from 0.32 fixed point to pixels.\n *\n * @param map    The AVSphericalVideo map to read bound values from.\n * @param width  Width of the current frame or stream.\n * @param height Height of the current frame or stream.\n * @param left   Pixels from the left edge.\n * @param top    Pixels from the top edge.\n * @param right  Pixels from the right edge.\n * @param bottom Pixels from the bottom edge.\n */\nvoid av_spherical_tile_bounds(const AVSphericalMapping *map,\n                              size_t width, size_t height,\n                              size_t *left, size_t *top,\n                              size_t *right, size_t *bottom);\n\n/**\n * Provide a human-readable name of a given AVSphericalProjection.\n *\n * @param projection The input AVSphericalProjection.\n *\n * @return The name of the AVSphericalProjection, or \"unknown\".\n */\nconst char *av_spherical_projection_name(enum AVSphericalProjection projection);\n\n/**\n * Get the AVSphericalProjection form a human-readable name.\n *\n * @param name The input string.\n *\n * @return The AVSphericalProjection value, or -1 if not found.\n */\nint av_spherical_from_name(const char *name);\n/**\n * @}\n */\n\n#endif /* AVUTIL_SPHERICAL_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/stereo3d.h",
    "content": "/*\n * Copyright (c) 2013 Vittorio Giovara <vittorio.giovara@gmail.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_video_stereo3d\n * Stereoscopic video\n */\n\n#ifndef AVUTIL_STEREO3D_H\n#define AVUTIL_STEREO3D_H\n\n#include <stdint.h>\n\n#include \"frame.h\"\n\n/**\n * @defgroup lavu_video_stereo3d Stereo3D types and functions\n * @ingroup lavu_video\n *\n * A stereoscopic video file consists in multiple views embedded in a single\n * frame, usually describing two views of a scene. This file describes all\n * possible codec-independent view arrangements.\n *\n * @{\n */\n\n/**\n * List of possible 3D Types\n */\nenum AVStereo3DType {\n    /**\n     * Video is not stereoscopic (and metadata has to be there).\n     */\n    AV_STEREO3D_2D,\n\n    /**\n     * Views are next to each other.\n     *\n     * @code{.unparsed}\n     *    LLLLRRRR\n     *    LLLLRRRR\n     *    LLLLRRRR\n     *    ...\n     * @endcode\n     */\n    AV_STEREO3D_SIDEBYSIDE,\n\n    /**\n     * Views are on top of each other.\n     *\n     * @code{.unparsed}\n     *    LLLLLLLL\n     *    LLLLLLLL\n     *    RRRRRRRR\n     *    RRRRRRRR\n     * @endcode\n     */\n    AV_STEREO3D_TOPBOTTOM,\n\n    /**\n     * Views are alternated temporally.\n     *\n     * @code{.unparsed}\n     *     frame0   frame1   frame2   ...\n     *    LLLLLLLL RRRRRRRR LLLLLLLL\n     *    LLLLLLLL RRRRRRRR LLLLLLLL\n     *    LLLLLLLL RRRRRRRR LLLLLLLL\n     *    ...      ...      ...\n     * @endcode\n     */\n    AV_STEREO3D_FRAMESEQUENCE,\n\n    /**\n     * Views are packed in a checkerboard-like structure per pixel.\n     *\n     * @code{.unparsed}\n     *    LRLRLRLR\n     *    RLRLRLRL\n     *    LRLRLRLR\n     *    ...\n     * @endcode\n     */\n    AV_STEREO3D_CHECKERBOARD,\n\n    /**\n     * Views are next to each other, but when upscaling\n     * apply a checkerboard pattern.\n     *\n     * @code{.unparsed}\n     *     LLLLRRRR          L L L L    R R R R\n     *     LLLLRRRR    =>     L L L L  R R R R\n     *     LLLLRRRR          L L L L    R R R R\n     *     LLLLRRRR           L L L L  R R R R\n     * @endcode\n     */\n    AV_STEREO3D_SIDEBYSIDE_QUINCUNX,\n\n    /**\n     * Views are packed per line, as if interlaced.\n     *\n     * @code{.unparsed}\n     *    LLLLLLLL\n     *    RRRRRRRR\n     *    LLLLLLLL\n     *    ...\n     * @endcode\n     */\n    AV_STEREO3D_LINES,\n\n    /**\n     * Views are packed per column.\n     *\n     * @code{.unparsed}\n     *    LRLRLRLR\n     *    LRLRLRLR\n     *    LRLRLRLR\n     *    ...\n     * @endcode\n     */\n    AV_STEREO3D_COLUMNS,\n\n    /**\n     * Video is stereoscopic but the packing is unspecified.\n     */\n    AV_STEREO3D_UNSPEC,\n};\n\n/**\n * List of possible view types.\n */\nenum AVStereo3DView {\n    /**\n     * Frame contains two packed views.\n     */\n    AV_STEREO3D_VIEW_PACKED,\n\n    /**\n     * Frame contains only the left view.\n     */\n    AV_STEREO3D_VIEW_LEFT,\n\n    /**\n     * Frame contains only the right view.\n     */\n    AV_STEREO3D_VIEW_RIGHT,\n\n    /**\n     * Content is unspecified.\n     */\n    AV_STEREO3D_VIEW_UNSPEC,\n};\n\n/**\n * List of possible primary eyes.\n */\nenum AVStereo3DPrimaryEye {\n    /**\n     * Neither eye.\n     */\n    AV_PRIMARY_EYE_NONE,\n\n    /**\n     * Left eye.\n     */\n    AV_PRIMARY_EYE_LEFT,\n\n    /**\n     * Right eye\n     */\n    AV_PRIMARY_EYE_RIGHT,\n};\n\n/**\n * Inverted views, Right/Bottom represents the left view.\n */\n#define AV_STEREO3D_FLAG_INVERT     (1 << 0)\n\n/**\n * Stereo 3D type: this structure describes how two videos are packed\n * within a single video surface, with additional information as needed.\n *\n * @note The struct must be allocated with av_stereo3d_alloc() and\n *       its size is not a part of the public ABI.\n */\ntypedef struct AVStereo3D {\n    /**\n     * How views are packed within the video.\n     */\n    enum AVStereo3DType type;\n\n    /**\n     * Additional information about the frame packing.\n     */\n    int flags;\n\n    /**\n     * Determines which views are packed.\n     */\n    enum AVStereo3DView view;\n\n    /**\n     * Which eye is the primary eye when rendering in 2D.\n     */\n    enum AVStereo3DPrimaryEye primary_eye;\n\n    /**\n     * The distance between the centres of the lenses of the camera system,\n     * in micrometers. Zero if unset.\n     */\n    uint32_t baseline;\n\n    /**\n     * Relative shift of the left and right images, which changes the zero parallax plane.\n     * Range is -1.0 to 1.0. Zero if unset.\n     */\n    AVRational horizontal_disparity_adjustment;\n\n    /**\n     * Horizontal field of view, in degrees. Zero if unset.\n     */\n    AVRational horizontal_field_of_view;\n} AVStereo3D;\n\n/**\n * Allocate an AVStereo3D structure and set its fields to default values.\n * The resulting struct can be freed using av_freep().\n *\n * @return An AVStereo3D filled with default values or NULL on failure.\n */\nAVStereo3D *av_stereo3d_alloc(void);\n\n/**\n * Allocate an AVStereo3D structure and set its fields to default values.\n * The resulting struct can be freed using av_freep().\n *\n * @return An AVStereo3D filled with default values or NULL on failure.\n */\nAVStereo3D *av_stereo3d_alloc_size(size_t *size);\n\n/**\n * Allocate a complete AVFrameSideData and add it to the frame.\n *\n * @param frame The frame which side data is added to.\n *\n * @return The AVStereo3D structure to be filled by caller.\n */\nAVStereo3D *av_stereo3d_create_side_data(AVFrame *frame);\n\n/**\n * Provide a human-readable name of a given stereo3d type.\n *\n * @param type The input stereo3d type value.\n *\n * @return The name of the stereo3d value, or \"unknown\".\n */\nconst char *av_stereo3d_type_name(unsigned int type);\n\n/**\n * Get the AVStereo3DType form a human-readable name.\n *\n * @param name The input string.\n *\n * @return The AVStereo3DType value, or -1 if not found.\n */\nint av_stereo3d_from_name(const char *name);\n\n/**\n * Provide a human-readable name of a given stereo3d view.\n *\n * @param type The input stereo3d view value.\n *\n * @return The name of the stereo3d view value, or \"unknown\".\n */\nconst char *av_stereo3d_view_name(unsigned int view);\n\n/**\n * Get the AVStereo3DView form a human-readable name.\n *\n * @param name The input string.\n *\n * @return The AVStereo3DView value, or -1 if not found.\n */\nint av_stereo3d_view_from_name(const char *name);\n\n/**\n * Provide a human-readable name of a given stereo3d primary eye.\n *\n * @param type The input stereo3d primary eye value.\n *\n * @return The name of the stereo3d primary eye value, or \"unknown\".\n */\nconst char *av_stereo3d_primary_eye_name(unsigned int eye);\n\n/**\n * Get the AVStereo3DPrimaryEye form a human-readable name.\n *\n * @param name The input string.\n *\n * @return The AVStereo3DPrimaryEye value, or -1 if not found.\n */\nint av_stereo3d_primary_eye_from_name(const char *name);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_STEREO3D_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/tdrdi.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu_video_3d_reference_displays_info\n * Spherical video\n */\n\n#ifndef AVUTIL_TDRDI_H\n#define AVUTIL_TDRDI_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"libavutil/avassert.h\"\n\n/**\n * @defgroup lavu_video_3d_reference_displays_info 3D Reference Displays Information\n * @ingroup lavu_video\n *\n * The 3D Reference Displays Information describes information about the reference display\n * width(s) and reference viewing distance(s) as well as information about the corresponding\n * reference stereo pair(s).\n * @{\n */\n\n#define AV_TDRDI_MAX_NUM_REF_DISPLAY 32\n\n/**\n * This structure describes information about the reference display width(s) and reference\n * viewing distance(s) as well as information about the corresponding reference stereo pair(s).\n * See section G.14.3.2.3 of ITU-T H.265 for more information.\n *\n * @note The struct must be allocated with av_tdrdi_alloc() and\n *       its size is not a part of the public ABI.\n */\ntypedef struct AV3DReferenceDisplaysInfo {\n    /**\n     * The exponent of the maximum allowable truncation error for\n     * {exponent,mantissa}_ref_display_width as given by 2<sup>(-prec_ref_display_width)</sup>.\n     */\n    uint8_t prec_ref_display_width;\n\n    /**\n     * A flag to indicate the presence of reference viewing distance.\n     * If false, the values of prec_ref_viewing_dist, exponent_ref_viewing_distance,\n     * and mantissa_ref_viewing_distance are undefined.\n     */\n    uint8_t ref_viewing_distance_flag;\n\n    /**\n     * The exponent of the maximum allowable truncation error for\n     * {exponent,mantissa}_ref_viewing_distance as given by 2<sup>^(-prec_ref_viewing_dist)</sup>.\n     * The value of prec_ref_viewing_dist shall be in the range of 0 to 31, inclusive.\n     */\n    uint8_t prec_ref_viewing_dist;\n\n    /**\n     * The number of reference displays that are signalled in this struct.\n     * Allowed range is 1 to 32, inclusive.\n     */\n    uint8_t num_ref_displays;\n\n    /**\n     * Offset in bytes from the beginning of this structure at which the array\n     * of reference displays starts.\n     */\n    size_t entries_offset;\n\n    /**\n     * Size of each entry in bytes. May not match sizeof(AV3DReferenceDisplay).\n     */\n    size_t entry_size;\n} AV3DReferenceDisplaysInfo;\n\n/**\n * Data structure for single deference display information.\n * It is allocated as a part of AV3DReferenceDisplaysInfo and should be retrieved with\n * av_tdrdi_get_display().\n *\n * sizeof(AV3DReferenceDisplay) is not a part of the ABI and new fields may be\n * added to it.\n*/\ntypedef struct AV3DReferenceDisplay {\n    /**\n     * The ViewId of the left view of a stereo pair corresponding to the n-th reference display.\n     */\n    uint16_t left_view_id;\n\n    /**\n     * The ViewId of the left view of a stereo pair corresponding to the n-th reference display.\n     */\n    uint16_t right_view_id;\n\n    /**\n     * The exponent part of the reference display width of the n-th reference display.\n     */\n    uint8_t exponent_ref_display_width;\n\n    /**\n     * The mantissa part of the reference display width of the n-th reference display.\n     */\n    uint8_t mantissa_ref_display_width;\n\n    /**\n     * The exponent part of the reference viewing distance of the n-th reference display.\n     */\n    uint8_t exponent_ref_viewing_distance;\n\n    /**\n     * The mantissa part of the reference viewing distance of the n-th reference display.\n     */\n    uint8_t mantissa_ref_viewing_distance;\n\n    /**\n     * An array of flags to indicates that the information about additional horizontal shift of\n     * the left and right views for the n-th reference display is present.\n     */\n    uint8_t additional_shift_present_flag;\n\n    /**\n     * The recommended additional horizontal shift for a stereo pair corresponding to the n-th\n     * reference baseline and the n-th reference display.\n     */\n    int16_t num_sample_shift;\n} AV3DReferenceDisplay;\n\nstatic av_always_inline AV3DReferenceDisplay*\nav_tdrdi_get_display(AV3DReferenceDisplaysInfo *tdrdi, unsigned int idx)\n{\n    av_assert0(idx < tdrdi->num_ref_displays);\n    return (AV3DReferenceDisplay *)((uint8_t *)tdrdi + tdrdi->entries_offset +\n                                    idx * tdrdi->entry_size);\n}\n\n/**\n * Allocate a AV3DReferenceDisplaysInfo structure and initialize its fields to default\n * values.\n *\n * @return the newly allocated struct or NULL on failure\n */\nAV3DReferenceDisplaysInfo *av_tdrdi_alloc(unsigned int nb_displays, size_t *size);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_TDRDI_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/tea.h",
    "content": "/*\n * A 32-bit implementation of the TEA algorithm\n * Copyright (c) 2015 Vesselin Bontchev\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_TEA_H\n#define AVUTIL_TEA_H\n\n#include <stdint.h>\n\n/**\n * @file\n * @brief Public header for libavutil TEA algorithm\n * @defgroup lavu_tea TEA\n * @ingroup lavu_crypto\n * @{\n */\n\nextern const int av_tea_size;\n\nstruct AVTEA;\n\n/**\n  * Allocate an AVTEA context\n  * To free the struct: av_free(ptr)\n  */\nstruct AVTEA *av_tea_alloc(void);\n\n/**\n * Initialize an AVTEA context.\n *\n * @param ctx an AVTEA context\n * @param key a key of 16 bytes used for encryption/decryption\n * @param rounds the number of rounds in TEA (64 is the \"standard\")\n */\nvoid av_tea_init(struct AVTEA *ctx, const uint8_t key[16], int rounds);\n\n/**\n * Encrypt or decrypt a buffer using a previously initialized context.\n *\n * @param ctx an AVTEA context\n * @param dst destination array, can be equal to src\n * @param src source array, can be equal to dst\n * @param count number of 8 byte blocks\n * @param iv initialization vector for CBC mode, if NULL then ECB will be used\n * @param decrypt 0 for encryption, 1 for decryption\n */\nvoid av_tea_crypt(struct AVTEA *ctx, uint8_t *dst, const uint8_t *src,\n                  int count, uint8_t *iv, int decrypt);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_TEA_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/threadmessage.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public License\n * as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with FFmpeg; if not, write to the Free Software Foundation, Inc.,\n * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_THREADMESSAGE_H\n#define AVUTIL_THREADMESSAGE_H\n\ntypedef struct AVThreadMessageQueue AVThreadMessageQueue;\n\ntypedef enum AVThreadMessageFlags {\n\n    /**\n     * Perform non-blocking operation.\n     * If this flag is set, send and recv operations are non-blocking and\n     * return AVERROR(EAGAIN) immediately if they can not proceed.\n     */\n    AV_THREAD_MESSAGE_NONBLOCK = 1,\n\n} AVThreadMessageFlags;\n\n/**\n * Allocate a new message queue.\n *\n * @param mq      pointer to the message queue\n * @param nelem   maximum number of elements in the queue\n * @param elsize  size of each element in the queue\n * @return  >=0 for success; <0 for error, in particular AVERROR(ENOSYS) if\n *          lavu was built without thread support\n */\nint av_thread_message_queue_alloc(AVThreadMessageQueue **mq,\n                                  unsigned nelem,\n                                  unsigned elsize);\n\n/**\n * Free a message queue.\n *\n * The message queue must no longer be in use by another thread.\n */\nvoid av_thread_message_queue_free(AVThreadMessageQueue **mq);\n\n/**\n * Send a message on the queue.\n */\nint av_thread_message_queue_send(AVThreadMessageQueue *mq,\n                                 void *msg,\n                                 unsigned flags);\n\n/**\n * Receive a message from the queue.\n */\nint av_thread_message_queue_recv(AVThreadMessageQueue *mq,\n                                 void *msg,\n                                 unsigned flags);\n\n/**\n * Set the sending error code.\n *\n * If the error code is set to non-zero, av_thread_message_queue_send() will\n * return it immediately. Conventional values, such as AVERROR_EOF or\n * AVERROR(EAGAIN), can be used to cause the sending thread to stop or\n * suspend its operation.\n */\nvoid av_thread_message_queue_set_err_send(AVThreadMessageQueue *mq,\n                                          int err);\n\n/**\n * Set the receiving error code.\n *\n * If the error code is set to non-zero, av_thread_message_queue_recv() will\n * return it immediately when there are no longer available messages.\n * Conventional values, such as AVERROR_EOF or AVERROR(EAGAIN), can be used\n * to cause the receiving thread to stop or suspend its operation.\n */\nvoid av_thread_message_queue_set_err_recv(AVThreadMessageQueue *mq,\n                                          int err);\n\n/**\n * Set the optional free message callback function which will be called if an\n * operation is removing messages from the queue.\n */\nvoid av_thread_message_queue_set_free_func(AVThreadMessageQueue *mq,\n                                           void (*free_func)(void *msg));\n\n/**\n * Return the current number of messages in the queue.\n *\n * @return the current number of messages or AVERROR(ENOSYS) if lavu was built\n *         without thread support\n */\nint av_thread_message_queue_nb_elems(AVThreadMessageQueue *mq);\n\n/**\n * Flush the message queue\n *\n * This function is mostly equivalent to reading and free-ing every message\n * except that it will be done in a single operation (no lock/unlock between\n * reads).\n */\nvoid av_thread_message_flush(AVThreadMessageQueue *mq);\n\n#endif /* AVUTIL_THREADMESSAGE_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/timecode.h",
    "content": "/*\n * Copyright (c) 2006 Smartjog S.A.S, Baptiste Coudurier <baptiste.coudurier@gmail.com>\n * Copyright (c) 2011-2012 Smartjog S.A.S, Clément Bœsch <clement.boesch@smartjog.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * Timecode helpers header\n */\n\n#ifndef AVUTIL_TIMECODE_H\n#define AVUTIL_TIMECODE_H\n\n#include <stdint.h>\n#include \"rational.h\"\n\n#define AV_TIMECODE_STR_SIZE 23\n\nenum AVTimecodeFlag {\n    AV_TIMECODE_FLAG_DROPFRAME      = 1<<0, ///< timecode is drop frame\n    AV_TIMECODE_FLAG_24HOURSMAX     = 1<<1, ///< timecode wraps after 24 hours\n    AV_TIMECODE_FLAG_ALLOWNEGATIVE  = 1<<2, ///< negative time values are allowed\n};\n\ntypedef struct {\n    int start;          ///< timecode frame start (first base frame number)\n    uint32_t flags;     ///< flags such as drop frame, +24 hours support, ...\n    AVRational rate;    ///< frame rate in rational form\n    unsigned fps;       ///< frame per second; must be consistent with the rate field\n} AVTimecode;\n\n/**\n * Adjust frame number for NTSC drop frame time code.\n *\n * @param framenum frame number to adjust\n * @param fps      frame per second, multiples of 30\n * @return         adjusted frame number\n * @warning        adjustment is only valid for multiples of NTSC 29.97\n */\nint av_timecode_adjust_ntsc_framenum2(int framenum, int fps);\n\n/**\n * Convert frame number to SMPTE 12M binary representation.\n *\n * @param tc       timecode data correctly initialized\n * @param framenum frame number\n * @return         the SMPTE binary representation\n *\n * See SMPTE ST 314M-2005 Sec 4.4.2.2.1 \"Time code pack (TC)\"\n * the format description as follows:\n * bits 0-5:   hours, in BCD(6bits)\n * bits 6:     BGF1\n * bits 7:     BGF2 (NTSC) or FIELD (PAL)\n * bits 8-14:  minutes, in BCD(7bits)\n * bits 15:    BGF0 (NTSC) or BGF2 (PAL)\n * bits 16-22: seconds, in BCD(7bits)\n * bits 23:    FIELD (NTSC) or BGF0 (PAL)\n * bits 24-29: frames, in BCD(6bits)\n * bits 30:    drop  frame flag (0: non drop,    1: drop)\n * bits 31:    color frame flag (0: unsync mode, 1: sync mode)\n * @note BCD numbers (6 or 7 bits): 4 or 5 lower bits for units, 2 higher bits for tens.\n * @note Frame number adjustment is automatically done in case of drop timecode,\n *       you do NOT have to call av_timecode_adjust_ntsc_framenum2().\n * @note The frame number is relative to tc->start.\n * @note Color frame (CF) and binary group flags (BGF) bits are set to zero.\n */\nuint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum);\n\n/**\n * Convert sei info to SMPTE 12M binary representation.\n *\n * @param rate     frame rate in rational form\n * @param drop     drop flag\n * @param hh       hour\n * @param mm       minute\n * @param ss       second\n * @param ff       frame number\n * @return         the SMPTE binary representation\n */\nuint32_t av_timecode_get_smpte(AVRational rate, int drop, int hh, int mm, int ss, int ff);\n\n/**\n * Load timecode string in buf.\n *\n * @param tc       timecode data correctly initialized\n * @param buf      destination buffer, must be at least AV_TIMECODE_STR_SIZE long\n * @param framenum frame number\n * @return         the buf parameter\n *\n * @note Timecode representation can be a negative timecode and have more than\n *       24 hours, but will only be honored if the flags are correctly set.\n * @note The frame number is relative to tc->start.\n */\nchar *av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum);\n\n/**\n * Get the timecode string from the SMPTE timecode format.\n *\n * In contrast to av_timecode_make_smpte_tc_string this function supports 50/60\n * fps timecodes by using the field bit.\n *\n * @param buf        destination buffer, must be at least AV_TIMECODE_STR_SIZE long\n * @param rate       frame rate of the timecode\n * @param tcsmpte    the 32-bit SMPTE timecode\n * @param prevent_df prevent the use of a drop flag when it is known the DF bit\n *                   is arbitrary\n * @param skip_field prevent the use of a field flag when it is known the field\n *                   bit is arbitrary (e.g. because it is used as PC flag)\n * @return           the buf parameter\n */\nchar *av_timecode_make_smpte_tc_string2(char *buf, AVRational rate, uint32_t tcsmpte, int prevent_df, int skip_field);\n\n/**\n * Get the timecode string from the SMPTE timecode format.\n *\n * @param buf        destination buffer, must be at least AV_TIMECODE_STR_SIZE long\n * @param tcsmpte    the 32-bit SMPTE timecode\n * @param prevent_df prevent the use of a drop flag when it is known the DF bit\n *                   is arbitrary\n * @return           the buf parameter\n */\nchar *av_timecode_make_smpte_tc_string(char *buf, uint32_t tcsmpte, int prevent_df);\n\n/**\n * Get the timecode string from the 25-bit timecode format (MPEG GOP format).\n *\n * @param buf     destination buffer, must be at least AV_TIMECODE_STR_SIZE long\n * @param tc25bit the 25-bits timecode\n * @return        the buf parameter\n */\nchar *av_timecode_make_mpeg_tc_string(char *buf, uint32_t tc25bit);\n\n/**\n * Init a timecode struct with the passed parameters.\n *\n * @param tc          pointer to an allocated AVTimecode\n * @param rate        frame rate in rational form\n * @param flags       miscellaneous flags such as drop frame, +24 hours, ...\n *                    (see AVTimecodeFlag)\n * @param frame_start the first frame number\n * @param log_ctx     a pointer to an arbitrary struct of which the first field\n *                    is a pointer to an AVClass struct (used for av_log)\n * @return            0 on success, AVERROR otherwise\n */\nint av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx);\n\n/**\n * Init a timecode struct from the passed timecode components.\n *\n * @param tc          pointer to an allocated AVTimecode\n * @param rate        frame rate in rational form\n * @param flags       miscellaneous flags such as drop frame, +24 hours, ...\n *                    (see AVTimecodeFlag)\n * @param hh          hours\n * @param mm          minutes\n * @param ss          seconds\n * @param ff          frames\n * @param log_ctx     a pointer to an arbitrary struct of which the first field\n *                    is a pointer to an AVClass struct (used for av_log)\n * @return            0 on success, AVERROR otherwise\n */\nint av_timecode_init_from_components(AVTimecode *tc, AVRational rate, int flags, int hh, int mm, int ss, int ff, void *log_ctx);\n\n/**\n * Parse timecode representation (hh:mm:ss[:;.]ff).\n *\n * @param tc      pointer to an allocated AVTimecode\n * @param rate    frame rate in rational form\n * @param str     timecode string which will determine the frame start\n * @param log_ctx a pointer to an arbitrary struct of which the first field is a\n *                pointer to an AVClass struct (used for av_log).\n * @return        0 on success, AVERROR otherwise\n */\nint av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx);\n\n/**\n * Check if the timecode feature is available for the given frame rate\n *\n * @return 0 if supported, <0 otherwise\n */\nint av_timecode_check_frame_rate(AVRational rate);\n\n#endif /* AVUTIL_TIMECODE_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/timestamp.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * timestamp utils, mostly useful for debugging/logging purposes\n */\n\n#ifndef AVUTIL_TIMESTAMP_H\n#define AVUTIL_TIMESTAMP_H\n\n#include \"avutil.h\"\n\n#if defined(__cplusplus) && !defined(__STDC_FORMAT_MACROS) && !defined(PRId64)\n#error missing -D__STDC_FORMAT_MACROS / #define __STDC_FORMAT_MACROS\n#endif\n\n#define AV_TS_MAX_STRING_SIZE 32\n\n/**\n * Fill the provided buffer with a string containing a timestamp\n * representation.\n *\n * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE\n * @param ts the timestamp to represent\n * @return the buffer in input\n */\nstatic inline char *av_ts_make_string(char *buf, int64_t ts)\n{\n    if (ts == AV_NOPTS_VALUE) snprintf(buf, AV_TS_MAX_STRING_SIZE, \"NOPTS\");\n    else                      snprintf(buf, AV_TS_MAX_STRING_SIZE, \"%\" PRId64, ts);\n    return buf;\n}\n\n/**\n * Convenience macro, the return value should be used only directly in\n * function arguments but never stand-alone.\n */\n#define av_ts2str(ts) av_ts_make_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts)\n\n/**\n * Fill the provided buffer with a string containing a timestamp time\n * representation.\n *\n * @param buf a buffer with size in bytes of at least AV_TS_MAX_STRING_SIZE\n * @param ts the timestamp to represent\n * @param tb the timebase of the timestamp\n * @return the buffer in input\n */\nchar *av_ts_make_time_string2(char *buf, int64_t ts, AVRational tb);\n\n/**\n * Fill the provided buffer with a string containing a timestamp\n * representation.\n *\n * @see av_ts_make_time_string2\n */\nstatic inline char *av_ts_make_time_string(char *buf, int64_t ts,\n                                           const AVRational *tb)\n{\n    return av_ts_make_time_string2(buf, ts, *tb);\n}\n\n/**\n * Convenience macro, the return value should be used only directly in\n * function arguments but never stand-alone.\n */\n#define av_ts2timestr(ts, tb) av_ts_make_time_string((char[AV_TS_MAX_STRING_SIZE]){0}, ts, tb)\n\n#endif /* AVUTIL_TIMESTAMP_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/tree.h",
    "content": "/*\n * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * A tree container.\n * @author Michael Niedermayer <michaelni@gmx.at>\n */\n\n#ifndef AVUTIL_TREE_H\n#define AVUTIL_TREE_H\n\n#include \"attributes.h\"\n\n/**\n * @addtogroup lavu_tree AVTree\n * @ingroup lavu_data\n *\n * Low-complexity tree container\n *\n * Insertion, removal, finding equal, largest which is smaller than and\n * smallest which is larger than, all have O(log n) worst-case complexity.\n * @{\n */\n\n\nstruct AVTreeNode;\nextern const int av_tree_node_size;\n\n/**\n * Allocate an AVTreeNode.\n */\nstruct AVTreeNode *av_tree_node_alloc(void);\n\n/**\n * Find an element.\n * @param root a pointer to the root node of the tree\n * @param next If next is not NULL, then next[0] will contain the previous\n *             element and next[1] the next element. If either does not exist,\n *             then the corresponding entry in next is unchanged.\n * @param cmp compare function used to compare elements in the tree,\n *            API identical to that of Standard C's qsort\n *            It is guaranteed that the first and only the first argument to cmp()\n *            will be the key parameter to av_tree_find(), thus it could if the\n *            user wants, be a different type (like an opaque context).\n * @return An element with cmp(key, elem) == 0 or NULL if no such element\n *         exists in the tree.\n */\nvoid *av_tree_find(const struct AVTreeNode *root, void *key,\n                   int (*cmp)(const void *key, const void *b), void *next[2]);\n\n/**\n * Insert or remove an element.\n *\n * If *next is NULL, then the supplied element will be removed if it exists.\n * If *next is non-NULL, then the supplied element will be inserted, unless\n * it already exists in the tree.\n *\n * @param rootp A pointer to a pointer to the root node of the tree; note that\n *              the root node can change during insertions, this is required\n *              to keep the tree balanced.\n * @param key  pointer to the element key to insert in the tree\n * @param next Used to allocate and free AVTreeNodes. For insertion the user\n *             must set it to an allocated and zeroed object of at least\n *             av_tree_node_size bytes size. av_tree_insert() will set it to\n *             NULL if it has been consumed.\n *             For deleting elements *next is set to NULL by the user and\n *             av_tree_insert() will set it to the AVTreeNode which was\n *             used for the removed element.\n *             This allows the use of flat arrays, which have\n *             lower overhead compared to many malloced elements.\n *             You might want to define a function like:\n *             @code\n *             void *tree_insert(struct AVTreeNode **rootp, void *key,\n *                               int (*cmp)(void *key, const void *b),\n *                               AVTreeNode **next)\n *             {\n *                 if (!*next)\n *                     *next = av_mallocz(av_tree_node_size);\n *                 return av_tree_insert(rootp, key, cmp, next);\n *             }\n *             void *tree_remove(struct AVTreeNode **rootp, void *key,\n *                               int (*cmp)(void *key, const void *b, AVTreeNode **next))\n *             {\n *                 av_freep(next);\n *                 return av_tree_insert(rootp, key, cmp, next);\n *             }\n *             @endcode\n * @param cmp compare function used to compare elements in the tree, API identical\n *            to that of Standard C's qsort\n * @return If no insertion happened, the found element; if an insertion or\n *         removal happened, then either key or NULL will be returned.\n *         Which one it is depends on the tree state and the implementation. You\n *         should make no assumptions that it's one or the other in the code.\n */\nvoid *av_tree_insert(struct AVTreeNode **rootp, void *key,\n                     int (*cmp)(const void *key, const void *b),\n                     struct AVTreeNode **next);\n\nvoid av_tree_destroy(struct AVTreeNode *t);\n\n/**\n * Apply enu(opaque, &elem) to all the elements in the tree in a given range.\n *\n * @param cmp a comparison function that returns < 0 for an element below the\n *            range, > 0 for an element above the range and == 0 for an\n *            element inside the range\n *\n * @note The cmp function should use the same ordering used to construct the\n *       tree.\n */\nvoid av_tree_enumerate(struct AVTreeNode *t, void *opaque,\n                       int (*cmp)(void *opaque, void *elem),\n                       int (*enu)(void *opaque, void *elem));\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_TREE_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/twofish.h",
    "content": "/*\n * An implementation of the TwoFish algorithm\n * Copyright (c) 2015 Supraja Meedinti\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_TWOFISH_H\n#define AVUTIL_TWOFISH_H\n\n#include <stdint.h>\n\n\n/**\n  * @file\n  * @brief Public header for libavutil TWOFISH algorithm\n  * @defgroup lavu_twofish TWOFISH\n  * @ingroup lavu_crypto\n  * @{\n  */\n\nextern const int av_twofish_size;\n\nstruct AVTWOFISH;\n\n/**\n  * Allocate an AVTWOFISH context\n  * To free the struct: av_free(ptr)\n  */\nstruct AVTWOFISH *av_twofish_alloc(void);\n\n/**\n  * Initialize an AVTWOFISH context.\n  *\n  * @param ctx an AVTWOFISH context\n  * @param key a key of size ranging from 1 to 32 bytes used for encryption/decryption\n  * @param key_bits number of keybits: 128, 192, 256 If less than the required, padded with zeroes to nearest valid value; return value is 0 if key_bits is 128/192/256, -1 if less than 0, 1 otherwise\n */\nint av_twofish_init(struct AVTWOFISH *ctx, const uint8_t *key, int key_bits);\n\n/**\n  * Encrypt or decrypt a buffer using a previously initialized context\n  *\n  * @param ctx an AVTWOFISH context\n  * @param dst destination array, can be equal to src\n  * @param src source array, can be equal to dst\n  * @param count number of 16 byte blocks\n  * @param iv initialization vector for CBC mode, NULL for ECB mode\n  * @param decrypt 0 for encryption, 1 for decryption\n */\nvoid av_twofish_crypt(struct AVTWOFISH *ctx, uint8_t *dst, const uint8_t *src, int count, uint8_t* iv, int decrypt);\n\n/**\n * @}\n */\n#endif /* AVUTIL_TWOFISH_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/tx.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_TX_H\n#define AVUTIL_TX_H\n\n#include <stdint.h>\n#include <stddef.h>\n\ntypedef struct AVTXContext AVTXContext;\n\ntypedef struct AVComplexFloat {\n    float re, im;\n} AVComplexFloat;\n\ntypedef struct AVComplexDouble {\n    double re, im;\n} AVComplexDouble;\n\ntypedef struct AVComplexInt32 {\n    int32_t re, im;\n} AVComplexInt32;\n\nenum AVTXType {\n    /**\n     * Standard complex to complex FFT with sample data type of AVComplexFloat,\n     * AVComplexDouble or AVComplexInt32, for each respective variant.\n     *\n     * Output is not 1/len normalized. Scaling currently unsupported.\n     * The stride parameter must be set to the size of a single sample in bytes.\n     */\n    AV_TX_FLOAT_FFT  = 0,\n    AV_TX_DOUBLE_FFT = 2,\n    AV_TX_INT32_FFT  = 4,\n\n    /**\n     * Standard MDCT with a sample data type of float, double or int32_t,\n     * respectively. For the float and int32 variants, the scale type is\n     * 'float', while for the double variant, it's 'double'.\n     * If scale is NULL, 1.0 will be used as a default.\n     *\n     * Length is the frame size, not the window size (which is 2x frame).\n     * For forward transforms, the stride specifies the spacing between each\n     * sample in the output array in bytes. The input must be a flat array.\n     *\n     * For inverse transforms, the stride specifies the spacing between each\n     * sample in the input array in bytes. The output must be a flat array.\n     *\n     * NOTE: the inverse transform is half-length, meaning the output will not\n     * contain redundant data. This is what most codecs work with. To do a full\n     * inverse transform, set the AV_TX_FULL_IMDCT flag on init.\n     */\n    AV_TX_FLOAT_MDCT  = 1,\n    AV_TX_DOUBLE_MDCT = 3,\n    AV_TX_INT32_MDCT  = 5,\n\n    /**\n     * Real to complex and complex to real DFTs.\n     * For the float and int32 variants, the scale type is 'float', while for\n     * the double variant, it's a 'double'. If scale is NULL, 1.0 will be used\n     * as a default.\n     *\n     * For forward transforms (R2C), stride must be the spacing between two\n     * samples in bytes. For inverse transforms, the stride must be set\n     * to the spacing between two complex values in bytes.\n     *\n     * The forward transform performs a real-to-complex DFT of N samples to\n     * N/2+1 complex values.\n     *\n     * The inverse transform performs a complex-to-real DFT of N/2+1 complex\n     * values to N real samples. The output is not normalized, but can be\n     * made so by setting the scale value to 1.0/len.\n     * NOTE: the inverse transform always overwrites the input.\n     */\n    AV_TX_FLOAT_RDFT  = 6,\n    AV_TX_DOUBLE_RDFT = 7,\n    AV_TX_INT32_RDFT  = 8,\n\n    /**\n     * Real to real (DCT) transforms.\n     *\n     * The forward transform is a DCT-II.\n     * The inverse transform is a DCT-III.\n     *\n     * The input array is always overwritten. DCT-III requires that the\n     * input be padded with 2 extra samples. Stride must be set to the\n     * spacing between two samples in bytes.\n     */\n    AV_TX_FLOAT_DCT  = 9,\n    AV_TX_DOUBLE_DCT = 10,\n    AV_TX_INT32_DCT  = 11,\n\n    /**\n     * Discrete Cosine Transform I\n     *\n     * The forward transform is a DCT-I.\n     * The inverse transform is a DCT-I multiplied by 2/(N + 1).\n     *\n     * The input array is always overwritten.\n     */\n    AV_TX_FLOAT_DCT_I  = 12,\n    AV_TX_DOUBLE_DCT_I = 13,\n    AV_TX_INT32_DCT_I  = 14,\n\n    /**\n     * Discrete Sine Transform I\n     *\n     * The forward transform is a DST-I.\n     * The inverse transform is a DST-I multiplied by 2/(N + 1).\n     *\n     * The input array is always overwritten.\n     */\n    AV_TX_FLOAT_DST_I  = 15,\n    AV_TX_DOUBLE_DST_I = 16,\n    AV_TX_INT32_DST_I  = 17,\n\n    /* Not part of the API, do not use */\n    AV_TX_NB,\n};\n\n/**\n * Function pointer to a function to perform the transform.\n *\n * @note Using a different context than the one allocated during av_tx_init()\n * is not allowed.\n *\n * @param s the transform context\n * @param out the output array\n * @param in the input array\n * @param stride the input or output stride in bytes\n *\n * The out and in arrays must be aligned to the maximum required by the CPU\n * architecture unless the AV_TX_UNALIGNED flag was set in av_tx_init().\n * The stride must follow the constraints the transform type has specified.\n */\ntypedef void (*av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride);\n\n/**\n * Flags for av_tx_init()\n */\nenum AVTXFlags {\n    /**\n     * Allows for in-place transformations, where input == output.\n     * May be unsupported or slower for some transform types.\n     */\n    AV_TX_INPLACE = 1ULL << 0,\n\n    /**\n     * Relaxes alignment requirement for the in and out arrays of av_tx_fn().\n     * May be slower with certain transform types.\n     */\n    AV_TX_UNALIGNED = 1ULL << 1,\n\n    /**\n     * Performs a full inverse MDCT rather than leaving out samples that can be\n     * derived through symmetry. Requires an output array of 'len' floats,\n     * rather than the usual 'len/2' floats.\n     * Ignored for all transforms but inverse MDCTs.\n     */\n    AV_TX_FULL_IMDCT = 1ULL << 2,\n\n    /**\n     * Perform a real to half-complex RDFT.\n     * Only the real, or imaginary coefficients will\n     * be output, depending on the flag used. Only available for forward RDFTs.\n     * Output array must have enough space to hold N complex values\n     * (regular size for a real to complex transform).\n     */\n    AV_TX_REAL_TO_REAL      = 1ULL << 3,\n    AV_TX_REAL_TO_IMAGINARY = 1ULL << 4,\n};\n\n/**\n * Initialize a transform context with the given configuration\n * (i)MDCTs with an odd length are currently not supported.\n *\n * @param ctx the context to allocate, will be NULL on error\n * @param tx pointer to the transform function pointer to set\n * @param type type the type of transform\n * @param inv whether to do an inverse or a forward transform\n * @param len the size of the transform in samples\n * @param scale pointer to the value to scale the output if supported by type\n * @param flags a bitmask of AVTXFlags or 0\n *\n * @return 0 on success, negative error code on failure\n */\nint av_tx_init(AVTXContext **ctx, av_tx_fn *tx, enum AVTXType type,\n               int inv, int len, const void *scale, uint64_t flags);\n\n/**\n * Frees a context and sets *ctx to NULL, does nothing when *ctx == NULL.\n */\nvoid av_tx_uninit(AVTXContext **ctx);\n\n#endif /* AVUTIL_TX_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/uuid.h",
    "content": "/*\n * Copyright (c) 2022 Pierre-Anthony Lemieux <pal@palemieux.com>\n *                    Zane van Iperen <zane@zanevaniperen.com>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * UUID parsing and serialization utilities.\n * The library treats the UUID as an opaque sequence of 16 unsigned bytes,\n * i.e. ignoring the internal layout of the UUID, which depends on the type\n * of the UUID.\n *\n * @author Pierre-Anthony Lemieux <pal@palemieux.com>\n * @author Zane van Iperen <zane@zanevaniperen.com>\n */\n\n#ifndef AVUTIL_UUID_H\n#define AVUTIL_UUID_H\n\n#include <stdint.h>\n#include <string.h>\n\n#define AV_PRI_UUID                          \\\n    \"%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-\" \\\n    \"%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx\"\n\n#define AV_PRI_URN_UUID                               \\\n    \"urn:uuid:%02hhx%02hhx%02hhx%02hhx-%02hhx%02hhx-\" \\\n    \"%02hhx%02hhx-%02hhx%02hhx-%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx\"\n\n/* AV_UUID_ARG() is used together with AV_PRI_UUID() or AV_PRI_URN_UUID\n * to print UUIDs, e.g.\n * av_log(NULL, AV_LOG_DEBUG, \"UUID: \" AV_PRI_UUID, AV_UUID_ARG(uuid));\n */\n#define AV_UUID_ARG(x)                  \\\n    (x)[ 0], (x)[ 1], (x)[ 2], (x)[ 3], \\\n    (x)[ 4], (x)[ 5], (x)[ 6], (x)[ 7], \\\n    (x)[ 8], (x)[ 9], (x)[10], (x)[11], \\\n    (x)[12], (x)[13], (x)[14], (x)[15]\n\n#define AV_UUID_LEN 16\n\n/* Binary representation of a UUID */\ntypedef uint8_t AVUUID[AV_UUID_LEN];\n\n/**\n * Parses a string representation of a UUID formatted according to IETF RFC 4122\n * into an AVUUID. The parsing is case-insensitive. The string must be 37\n * characters long, including the terminating NUL character.\n *\n * Example string representation: \"2fceebd0-7017-433d-bafb-d073a7116696\"\n *\n * @param[in]  in  String representation of a UUID,\n *                 e.g. 2fceebd0-7017-433d-bafb-d073a7116696\n * @param[out] uu  AVUUID\n * @return         A non-zero value in case of an error.\n */\nint av_uuid_parse(const char *in, AVUUID uu);\n\n/**\n * Parses a URN representation of a UUID, as specified at IETF RFC 4122,\n * into an AVUUID. The parsing is case-insensitive. The string must be 46\n * characters long, including the terminating NUL character.\n *\n * Example string representation: \"urn:uuid:2fceebd0-7017-433d-bafb-d073a7116696\"\n *\n * @param[in]  in  URN UUID\n * @param[out] uu  AVUUID\n * @return         A non-zero value in case of an error.\n */\nint av_uuid_urn_parse(const char *in, AVUUID uu);\n\n/**\n * Parses a string representation of a UUID formatted according to IETF RFC 4122\n * into an AVUUID. The parsing is case-insensitive.\n *\n * @param[in]  in_start Pointer to the first character of the string representation\n * @param[in]  in_end   Pointer to the character after the last character of the\n *                      string representation. That memory location is never\n *                      accessed. It is an error if `in_end - in_start != 36`.\n * @param[out] uu       AVUUID\n * @return              A non-zero value in case of an error.\n */\nint av_uuid_parse_range(const char *in_start, const char *in_end, AVUUID uu);\n\n/**\n * Serializes a AVUUID into a string representation according to IETF RFC 4122.\n * The string is lowercase and always 37 characters long, including the\n * terminating NUL character.\n *\n * @param[in]  uu  AVUUID\n * @param[out] out Pointer to an array of no less than 37 characters.\n */\nvoid av_uuid_unparse(const AVUUID uu, char *out);\n\n/**\n * Compares two UUIDs for equality.\n *\n * @param[in]  uu1  AVUUID\n * @param[in]  uu2  AVUUID\n * @return          Nonzero if uu1 and uu2 are identical, 0 otherwise\n */\nstatic inline int av_uuid_equal(const AVUUID uu1, const AVUUID uu2)\n{\n    return memcmp(uu1, uu2, AV_UUID_LEN) == 0;\n}\n\n/**\n * Copies the bytes of src into dest.\n *\n * @param[out]  dest  AVUUID\n * @param[in]   src   AVUUID\n */\nstatic inline void av_uuid_copy(AVUUID dest, const AVUUID src)\n{\n    memcpy(dest, src, AV_UUID_LEN);\n}\n\n/**\n * Sets a UUID to the nil UUID, i.e. a UUID with have all\n * its 128 bits set to zero.\n *\n * @param[in,out]  uu  UUID to be set to the nil UUID\n */\nstatic inline void av_uuid_nil(AVUUID uu)\n{\n    memset(uu, 0, AV_UUID_LEN);\n}\n\n#endif /* AVUTIL_UUID_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/version.h",
    "content": "/*\n * copyright (c) 2003 Fabrice Bellard\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @file\n * @ingroup lavu\n * Libavutil version macros\n */\n\n#ifndef AVUTIL_VERSION_H\n#define AVUTIL_VERSION_H\n\n#include \"macros.h\"\n\n/**\n * @addtogroup version_utils\n *\n * Useful to check and match library version in order to maintain\n * backward compatibility.\n *\n * The FFmpeg libraries follow a versioning scheme very similar to\n * Semantic Versioning (http://semver.org/)\n * The difference is that the component called PATCH is called MICRO in FFmpeg\n * and its value is reset to 100 instead of 0 to keep it above or equal to 100.\n * Also we do not increase MICRO for every bugfix or change in git master.\n *\n * Prior to FFmpeg 3.2 point releases did not change any lib version number to\n * avoid aliassing different git master checkouts.\n * Starting with FFmpeg 3.2, the released library versions will occupy\n * a separate MAJOR.MINOR that is not used on the master development branch.\n * That is if we branch a release of master 55.10.123 we will bump to 55.11.100\n * for the release and master will continue at 55.12.100 after it. Each new\n * point release will then bump the MICRO improving the usefulness of the lib\n * versions.\n *\n * @{\n */\n\n#define AV_VERSION_INT(a, b, c) ((a)<<16 | (b)<<8 | (c))\n#define AV_VERSION_DOT(a, b, c) a ##.## b ##.## c\n#define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)\n\n/**\n * Extract version components from the full ::AV_VERSION_INT int as returned\n * by functions like ::avformat_version() and ::avcodec_version()\n */\n#define AV_VERSION_MAJOR(a) ((a) >> 16)\n#define AV_VERSION_MINOR(a) (((a) & 0x00FF00) >> 8)\n#define AV_VERSION_MICRO(a) ((a) & 0xFF)\n\n/**\n * @}\n */\n\n/**\n * @defgroup lavu_ver Version and Build diagnostics\n *\n * Macros and function useful to check at compile time and at runtime\n * which version of libavutil is in use.\n *\n * @{\n */\n\n#define LIBAVUTIL_VERSION_MAJOR  60\n#define LIBAVUTIL_VERSION_MINOR   8\n#define LIBAVUTIL_VERSION_MICRO 100\n\n#define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \\\n                                               LIBAVUTIL_VERSION_MINOR, \\\n                                               LIBAVUTIL_VERSION_MICRO)\n#define LIBAVUTIL_VERSION       AV_VERSION(LIBAVUTIL_VERSION_MAJOR,     \\\n                                           LIBAVUTIL_VERSION_MINOR,     \\\n                                           LIBAVUTIL_VERSION_MICRO)\n#define LIBAVUTIL_BUILD         LIBAVUTIL_VERSION_INT\n\n#define LIBAVUTIL_IDENT         \"Lavu\" AV_STRINGIFY(LIBAVUTIL_VERSION)\n\n/**\n * @defgroup lavu_depr_guards Deprecation Guards\n * FF_API_* defines may be placed below to indicate public API that will be\n * dropped at a future version bump. The defines themselves are not part of\n * the public API and may change, break or disappear at any time.\n *\n * @note, when bumping the major version it is recommended to manually\n * disable each FF_API_* in its own commit instead of disabling them all\n * at once through the bump. This improves the git bisect-ability of the change.\n *\n * @{\n */\n\n#define FF_API_MOD_UINTP2               (LIBAVUTIL_VERSION_MAJOR < 61)\n#define FF_API_RISCV_FD_ZBA             (LIBAVUTIL_VERSION_MAJOR < 61)\n#define FF_API_VULKAN_FIXED_QUEUES      (LIBAVUTIL_VERSION_MAJOR < 61)\n#define FF_API_OPT_INT_LIST             (LIBAVUTIL_VERSION_MAJOR < 61)\n#define FF_API_OPT_PTR                  (LIBAVUTIL_VERSION_MAJOR < 61)\n\n/**\n * @}\n * @}\n */\n\n#endif /* AVUTIL_VERSION_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/video_enc_params.h",
    "content": "/*\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_VIDEO_ENC_PARAMS_H\n#define AVUTIL_VIDEO_ENC_PARAMS_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"libavutil/avassert.h\"\n#include \"libavutil/frame.h\"\n\nenum AVVideoEncParamsType {\n    AV_VIDEO_ENC_PARAMS_NONE = -1,\n    /**\n     * VP9 stores:\n     * - per-frame base (luma AC) quantizer index, exported as AVVideoEncParams.qp\n     * - deltas for luma DC, chroma AC and chroma DC, exported in the\n     *   corresponding entries in AVVideoEncParams.delta_qp\n     * - per-segment delta, exported as for each block as AVVideoBlockParams.delta_qp\n     *\n     * To compute the resulting quantizer index for a block:\n     * - for luma AC, add the base qp and the per-block delta_qp, saturating to\n     *   unsigned 8-bit.\n     * - for luma DC and chroma AC/DC, add the corresponding\n     *   AVVideoBlockParams.delta_qp to the luma AC index, again saturating to\n     *   unsigned 8-bit.\n     */\n    AV_VIDEO_ENC_PARAMS_VP9,\n\n    /**\n     * H.264 stores:\n     * - in PPS (per-picture):\n     *   * initial QP_Y (luma) value, exported as AVVideoEncParams.qp\n     *   * delta(s) for chroma QP values (same for both, or each separately),\n     *     exported as in the corresponding entries in AVVideoEncParams.delta_qp\n     * - per-slice QP delta, not exported directly, added to the per-MB value\n     * - per-MB delta; not exported directly; the final per-MB quantizer\n     *   parameter - QP_Y - minus the value in AVVideoEncParams.qp is exported\n     *   as AVVideoBlockParams.qp_delta.\n     */\n    AV_VIDEO_ENC_PARAMS_H264,\n\n    /*\n     * MPEG-2-compatible quantizer.\n     *\n     * Summing the frame-level qp with the per-block delta_qp gives the\n     * resulting quantizer for the block.\n     */\n    AV_VIDEO_ENC_PARAMS_MPEG2,\n};\n\n/**\n * Video encoding parameters for a given frame. This struct is allocated along\n * with an optional array of per-block AVVideoBlockParams descriptors.\n * Must be allocated with av_video_enc_params_alloc().\n */\ntypedef struct AVVideoEncParams {\n    /**\n     * Number of blocks in the array.\n     *\n     * May be 0, in which case no per-block information is present. In this case\n     * the values of blocks_offset / block_size are unspecified and should not\n     * be accessed.\n     */\n    unsigned int nb_blocks;\n    /**\n     * Offset in bytes from the beginning of this structure at which the array\n     * of blocks starts.\n     */\n    size_t blocks_offset;\n    /*\n     * Size of each block in bytes. May not match sizeof(AVVideoBlockParams).\n     */\n    size_t block_size;\n\n    /**\n     * Type of the parameters (the codec they are used with).\n     */\n    enum AVVideoEncParamsType type;\n\n    /**\n     * Base quantisation parameter for the frame. The final quantiser for a\n     * given block in a given plane is obtained from this value, possibly\n     * combined with {@code delta_qp} and the per-block delta in a manner\n     * documented for each type.\n     */\n    int32_t qp;\n\n    /**\n     * Quantisation parameter offset from the base (per-frame) qp for a given\n     * plane (first index) and AC/DC coefficients (second index).\n     */\n    int32_t delta_qp[4][2];\n} AVVideoEncParams;\n\n/**\n * Data structure for storing block-level encoding information.\n * It is allocated as a part of AVVideoEncParams and should be retrieved with\n * av_video_enc_params_block().\n *\n * sizeof(AVVideoBlockParams) is not a part of the ABI and new fields may be\n * added to it.\n */\ntypedef struct AVVideoBlockParams {\n    /**\n     * Distance in luma pixels from the top-left corner of the visible frame\n     * to the top-left corner of the block.\n     * Can be negative if top/right padding is present on the coded frame.\n     */\n    int src_x, src_y;\n    /**\n     * Width and height of the block in luma pixels.\n     */\n    int w, h;\n\n    /**\n     * Difference between this block's final quantization parameter and the\n     * corresponding per-frame value.\n     */\n    int32_t delta_qp;\n} AVVideoBlockParams;\n\n/**\n * Get the block at the specified {@code idx}. Must be between 0 and nb_blocks - 1.\n */\nstatic av_always_inline AVVideoBlockParams*\nav_video_enc_params_block(AVVideoEncParams *par, unsigned int idx)\n{\n    av_assert0(idx < par->nb_blocks);\n    return (AVVideoBlockParams *)((uint8_t *)par + par->blocks_offset +\n                                  idx * par->block_size);\n}\n\n/**\n * Allocates memory for AVVideoEncParams of the given type, plus an array of\n * {@code nb_blocks} AVVideoBlockParams and initializes the variables. Can be\n * freed with a normal av_free() call.\n *\n * @param out_size if non-NULL, the size in bytes of the resulting data array is\n * written here.\n */\nAVVideoEncParams *av_video_enc_params_alloc(enum AVVideoEncParamsType type,\n                                            unsigned int nb_blocks, size_t *out_size);\n\n/**\n * Allocates memory for AVEncodeInfoFrame plus an array of\n * {@code nb_blocks} AVEncodeInfoBlock in the given AVFrame {@code frame}\n * as AVFrameSideData of type AV_FRAME_DATA_VIDEO_ENC_PARAMS\n * and initializes the variables.\n */\nAVVideoEncParams*\nav_video_enc_params_create_side_data(AVFrame *frame, enum AVVideoEncParamsType type,\n                                     unsigned int nb_blocks);\n\n#endif /* AVUTIL_VIDEO_ENC_PARAMS_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/video_hint.h",
    "content": "/**\n * Copyright 2023 Elias Carotti <eliascrt at amazon dot it>\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_VIDEO_HINT_H\n#define AVUTIL_VIDEO_HINT_H\n\n#include <stddef.h>\n#include <stdint.h>\n#include \"libavutil/avassert.h\"\n#include \"libavutil/frame.h\"\n\ntypedef struct AVVideoRect {\n    uint32_t x, y;\n    uint32_t width, height;\n} AVVideoRect;\n\ntypedef enum AVVideoHintType {\n    /* rectangled delimit the constant areas (unchanged), default is changed */\n    AV_VIDEO_HINT_TYPE_CONSTANT,\n\n    /* rectangled delimit the constant areas (changed), default is not changed */\n    AV_VIDEO_HINT_TYPE_CHANGED,\n} AVVideoHintType;\n\ntypedef struct AVVideoHint {\n    /**\n     * Number of AVVideoRect present.\n     *\n     * May be 0, in which case no per-rectangle information is present. In this\n     * case the values of rect_offset / rect_size are unspecified and should\n     * not be accessed.\n     */\n    size_t nb_rects;\n\n    /**\n     * Offset in bytes from the beginning of this structure at which the array\n     * of AVVideoRect starts.\n     */\n    size_t rect_offset;\n\n    /**\n     * Size in bytes of AVVideoRect.\n     */\n    size_t rect_size;\n\n    AVVideoHintType type;\n} AVVideoHint;\n\nstatic av_always_inline AVVideoRect *\nav_video_hint_rects(const AVVideoHint *hints) {\n    return (AVVideoRect *)((uint8_t *)hints + hints->rect_offset);\n}\n\nstatic av_always_inline AVVideoRect *\nav_video_hint_get_rect(const AVVideoHint *hints, size_t idx) {\n    return (AVVideoRect *)((uint8_t *)hints + hints->rect_offset + idx * hints->rect_size);\n}\n\n/**\n * Allocate memory for the AVVideoHint struct along with an nb_rects-sized\n * arrays of AVVideoRect.\n *\n * The side data contains a list of rectangles for the portions of the frame\n * which changed from the last encoded one (and the remainder are assumed to be\n * changed), or, alternately (depending on the type parameter) the unchanged\n * ones (and the remaining ones are those which changed).\n * Macroblocks will thus be hinted either to be P_SKIP-ped or go through the\n * regular encoding procedure.\n *\n * It's responsibility of the caller to fill the AVRects accordingly, and to set\n * the proper AVVideoHintType field.\n *\n * @param out_size if non-NULL, the size in bytes of the resulting data array is\n *                 written here\n *\n * @return newly allocated AVVideoHint struct (must be freed by the caller using\n *         av_free()) on success, NULL on memory allocation failure\n */\nAVVideoHint *av_video_hint_alloc(size_t nb_rects,\n                                 size_t *out_size);\n\n/**\n * Same as av_video_hint_alloc(), except newly-allocated AVVideoHint is attached\n * as side data of type AV_FRAME_DATA_VIDEO_HINT_INFO to frame.\n */\nAVVideoHint *av_video_hint_create_side_data(AVFrame *frame,\n                                            size_t nb_rects);\n\n\n#endif /* AVUTIL_VIDEO_HINT_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libavutil/xtea.h",
    "content": "/*\n * A 32-bit implementation of the XTEA algorithm\n * Copyright (c) 2012 Samuel Pitoiset\n *\n * This file is part of FFmpeg.\n *\n * FFmpeg is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * FFmpeg is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with FFmpeg; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AVUTIL_XTEA_H\n#define AVUTIL_XTEA_H\n\n#include <stdint.h>\n\n/**\n * @file\n * @brief Public header for libavutil XTEA algorithm\n * @defgroup lavu_xtea XTEA\n * @ingroup lavu_crypto\n * @{\n */\n\ntypedef struct AVXTEA {\n    uint32_t key[16];\n} AVXTEA;\n\n/**\n * Allocate an AVXTEA context.\n */\nAVXTEA *av_xtea_alloc(void);\n\n/**\n * Initialize an AVXTEA context.\n *\n * @param ctx an AVXTEA context\n * @param key a key of 16 bytes used for encryption/decryption,\n *            interpreted as big endian 32 bit numbers\n */\nvoid av_xtea_init(struct AVXTEA *ctx, const uint8_t key[16]);\n\n/**\n * Initialize an AVXTEA context.\n *\n * @param ctx an AVXTEA context\n * @param key a key of 16 bytes used for encryption/decryption,\n *            interpreted as little endian 32 bit numbers\n */\nvoid av_xtea_le_init(struct AVXTEA *ctx, const uint8_t key[16]);\n\n/**\n * Encrypt or decrypt a buffer using a previously initialized context,\n * in big endian format.\n *\n * @param ctx an AVXTEA context\n * @param dst destination array, can be equal to src\n * @param src source array, can be equal to dst\n * @param count number of 8 byte blocks\n * @param iv initialization vector for CBC mode, if NULL then ECB will be used\n * @param decrypt 0 for encryption, 1 for decryption\n */\nvoid av_xtea_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src,\n                   int count, uint8_t *iv, int decrypt);\n\n/**\n * Encrypt or decrypt a buffer using a previously initialized context,\n * in little endian format.\n *\n * @param ctx an AVXTEA context\n * @param dst destination array, can be equal to src\n * @param src source array, can be equal to dst\n * @param count number of 8 byte blocks\n * @param iv initialization vector for CBC mode, if NULL then ECB will be used\n * @param decrypt 0 for encryption, 1 for decryption\n */\nvoid av_xtea_le_crypt(struct AVXTEA *ctx, uint8_t *dst, const uint8_t *src,\n                      int count, uint8_t *iv, int decrypt);\n\n/**\n * @}\n */\n\n#endif /* AVUTIL_XTEA_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libswresample/swresample.h",
    "content": "/*\n * Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at)\n *\n * This file is part of libswresample\n *\n * libswresample is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * libswresample is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with libswresample; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef SWRESAMPLE_SWRESAMPLE_H\n#define SWRESAMPLE_SWRESAMPLE_H\n\n/**\n * @file\n * @ingroup lswr\n * libswresample public header\n */\n\n/**\n * @defgroup lswr libswresample\n * @{\n *\n * Audio resampling, sample format conversion and mixing library.\n *\n * Interaction with lswr is done through SwrContext, which is\n * allocated with swr_alloc() or swr_alloc_set_opts2(). It is opaque, so all parameters\n * must be set with the @ref avoptions API.\n *\n * The first thing you will need to do in order to use lswr is to allocate\n * SwrContext. This can be done with swr_alloc() or swr_alloc_set_opts2(). If you\n * are using the former, you must set options through the @ref avoptions API.\n * The latter function provides the same feature, but it allows you to set some\n * common options in the same statement.\n *\n * For example the following code will setup conversion from planar float sample\n * format to interleaved signed 16-bit integer, downsampling from 48kHz to\n * 44.1kHz and downmixing from 5.1 channels to stereo (using the default mixing\n * matrix). This is using the swr_alloc() function.\n * @code\n * SwrContext *swr = swr_alloc();\n * av_opt_set_chlayout(swr, \"in_chlayout\", &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1, 0);\n * av_opt_set_chlayout(swr, \"out_chlayout\", &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO, 0);\n * av_opt_set_int(swr, \"in_sample_rate\",     48000,                0);\n * av_opt_set_int(swr, \"out_sample_rate\",    44100,                0);\n * av_opt_set_sample_fmt(swr, \"in_sample_fmt\",  AV_SAMPLE_FMT_FLTP, 0);\n * av_opt_set_sample_fmt(swr, \"out_sample_fmt\", AV_SAMPLE_FMT_S16,  0);\n * @endcode\n *\n * The same job can be done using swr_alloc_set_opts2() as well:\n * @code\n * SwrContext *swr = NULL;\n * int ret = swr_alloc_set_opts2(&swr,         // we're allocating a new context\n *                       &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO, // out_ch_layout\n *                       AV_SAMPLE_FMT_S16,    // out_sample_fmt\n *                       44100,                // out_sample_rate\n *                       &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1, // in_ch_layout\n *                       AV_SAMPLE_FMT_FLTP,   // in_sample_fmt\n *                       48000,                // in_sample_rate\n *                       0,                    // log_offset\n *                       NULL);                // log_ctx\n * @endcode\n *\n * Once all values have been set, it must be initialized with swr_init(). If\n * you need to change the conversion parameters, you can change the parameters\n * using @ref avoptions, as described above in the first example; or by using\n * swr_alloc_set_opts2(), but with the first argument the allocated context.\n * You must then call swr_init() again.\n *\n * The conversion itself is done by repeatedly calling swr_convert().\n * Note that the samples may get buffered in swr if you provide insufficient\n * output space or if sample rate conversion is done, which requires \"future\"\n * samples. Samples that do not require future input can be retrieved at any\n * time by using swr_convert() (in_count can be set to 0).\n * At the end of conversion the resampling buffer can be flushed by calling\n * swr_convert() with NULL in and 0 in_count.\n *\n * The samples used in the conversion process can be managed with the libavutil\n * @ref lavu_sampmanip \"samples manipulation\" API, including av_samples_alloc()\n * function used in the following example.\n *\n * The delay between input and output, can at any time be found by using\n * swr_get_delay().\n *\n * The following code demonstrates the conversion loop assuming the parameters\n * from above and caller-defined functions get_input() and handle_output():\n * @code\n * uint8_t **input;\n * int in_samples;\n *\n * while (get_input(&input, &in_samples)) {\n *     uint8_t *output;\n *     int out_samples = av_rescale_rnd(swr_get_delay(swr, 48000) +\n *                                      in_samples, 44100, 48000, AV_ROUND_UP);\n *     av_samples_alloc(&output, NULL, 2, out_samples,\n *                      AV_SAMPLE_FMT_S16, 0);\n *     out_samples = swr_convert(swr, &output, out_samples,\n *                                      input, in_samples);\n *     handle_output(output, out_samples);\n *     av_freep(&output);\n * }\n * @endcode\n *\n * When the conversion is finished, the conversion\n * context and everything associated with it must be freed with swr_free().\n * A swr_close() function is also available, but it exists mainly for\n * compatibility with libavresample, and is not required to be called.\n *\n * There will be no memory leak if the data is not completely flushed before\n * swr_free().\n */\n\n#include <stdint.h>\n#include \"libavutil/channel_layout.h\"\n#include \"libavutil/frame.h\"\n#include \"libavutil/samplefmt.h\"\n\n#include \"libswresample/version_major.h\"\n#ifndef HAVE_AV_CONFIG_H\n/* When included as part of the ffmpeg build, only include the major version\n * to avoid unnecessary rebuilds. When included externally, keep including\n * the full version information. */\n#include \"libswresample/version.h\"\n#endif\n\n/**\n * @name Option constants\n * These constants are used for the @ref avoptions interface for lswr.\n * @{\n *\n */\n\n#define SWR_FLAG_RESAMPLE 1 ///< Force resampling even if equal sample rate\n//TODO use int resample ?\n//long term TODO can we enable this dynamically?\n\n/** Dithering algorithms */\nenum SwrDitherType {\n    SWR_DITHER_NONE = 0,\n    SWR_DITHER_RECTANGULAR,\n    SWR_DITHER_TRIANGULAR,\n    SWR_DITHER_TRIANGULAR_HIGHPASS,\n\n    SWR_DITHER_NS = 64,         ///< not part of API/ABI\n    SWR_DITHER_NS_LIPSHITZ,\n    SWR_DITHER_NS_F_WEIGHTED,\n    SWR_DITHER_NS_MODIFIED_E_WEIGHTED,\n    SWR_DITHER_NS_IMPROVED_E_WEIGHTED,\n    SWR_DITHER_NS_SHIBATA,\n    SWR_DITHER_NS_LOW_SHIBATA,\n    SWR_DITHER_NS_HIGH_SHIBATA,\n    SWR_DITHER_NB,              ///< not part of API/ABI\n};\n\n/** Resampling Engines */\nenum SwrEngine {\n    SWR_ENGINE_SWR,             /**< SW Resampler */\n    SWR_ENGINE_SOXR,            /**< SoX Resampler */\n    SWR_ENGINE_NB,              ///< not part of API/ABI\n};\n\n/** Resampling Filter Types */\nenum SwrFilterType {\n    SWR_FILTER_TYPE_CUBIC,              /**< Cubic */\n    SWR_FILTER_TYPE_BLACKMAN_NUTTALL,   /**< Blackman Nuttall windowed sinc */\n    SWR_FILTER_TYPE_KAISER,             /**< Kaiser windowed sinc */\n};\n\n/**\n * @}\n */\n\n/**\n * The libswresample context. Unlike libavcodec and libavformat, this structure\n * is opaque. This means that if you would like to set options, you must use\n * the @ref avoptions API and cannot directly set values to members of the\n * structure.\n */\ntypedef struct SwrContext SwrContext;\n\n/**\n * Get the AVClass for SwrContext. It can be used in combination with\n * AV_OPT_SEARCH_FAKE_OBJ for examining options.\n *\n * @see av_opt_find().\n * @return the AVClass of SwrContext\n */\nconst AVClass *swr_get_class(void);\n\n/**\n * @name SwrContext constructor functions\n * @{\n */\n\n/**\n * Allocate SwrContext.\n *\n * If you use this function you will need to set the parameters (manually or\n * with swr_alloc_set_opts2()) before calling swr_init().\n *\n * @see swr_alloc_set_opts2(), swr_init(), swr_free()\n * @return NULL on error, allocated context otherwise\n */\nstruct SwrContext *swr_alloc(void);\n\n/**\n * Initialize context after user parameters have been set.\n * @note The context must be configured using the AVOption API.\n *\n * @see av_opt_set_int()\n * @see av_opt_set_dict()\n *\n * @param[in,out]   s Swr context to initialize\n * @return AVERROR error code in case of failure.\n */\nint swr_init(struct SwrContext *s);\n\n/**\n * Check whether an swr context has been initialized or not.\n *\n * @param[in]       s Swr context to check\n * @see swr_init()\n * @return positive if it has been initialized, 0 if not initialized\n */\nint swr_is_initialized(struct SwrContext *s);\n\n/**\n * Allocate SwrContext if needed and set/reset common parameters.\n *\n * This function does not require *ps to be allocated with swr_alloc(). On the\n * other hand, swr_alloc() can use swr_alloc_set_opts2() to set the parameters\n * on the allocated context.\n *\n * @param ps              Pointer to an existing Swr context if available, or to NULL if not.\n *                        On success, *ps will be set to the allocated context.\n * @param out_ch_layout   output channel layout (e.g. AV_CHANNEL_LAYOUT_*)\n * @param out_sample_fmt  output sample format (AV_SAMPLE_FMT_*).\n * @param out_sample_rate output sample rate (frequency in Hz)\n * @param in_ch_layout    input channel layout (e.g. AV_CHANNEL_LAYOUT_*)\n * @param in_sample_fmt   input sample format (AV_SAMPLE_FMT_*).\n * @param in_sample_rate  input sample rate (frequency in Hz)\n * @param log_offset      logging level offset\n * @param log_ctx         parent logging context, can be NULL\n *\n * @see swr_init(), swr_free()\n * @return 0 on success, a negative AVERROR code on error.\n *         On error, the Swr context is freed and *ps set to NULL.\n */\nint swr_alloc_set_opts2(struct SwrContext **ps,\n                        const AVChannelLayout *out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate,\n                        const AVChannelLayout *in_ch_layout, enum AVSampleFormat  in_sample_fmt, int  in_sample_rate,\n                        int log_offset, void *log_ctx);\n/**\n * @}\n *\n * @name SwrContext destructor functions\n * @{\n */\n\n/**\n * Free the given SwrContext and set the pointer to NULL.\n *\n * @param[in] s a pointer to a pointer to Swr context\n */\nvoid swr_free(struct SwrContext **s);\n\n/**\n * Closes the context so that swr_is_initialized() returns 0.\n *\n * The context can be brought back to life by running swr_init(),\n * swr_init() can also be used without swr_close().\n * This function is mainly provided for simplifying the usecase\n * where one tries to support libavresample and libswresample.\n *\n * @param[in,out] s Swr context to be closed\n */\nvoid swr_close(struct SwrContext *s);\n\n/**\n * @}\n *\n * @name Core conversion functions\n * @{\n */\n\n/** Convert audio.\n *\n * in and in_count can be set to 0 to flush the last few samples out at the\n * end.\n *\n * If more input is provided than output space, then the input will be buffered.\n * You can avoid this buffering by using swr_get_out_samples() to retrieve an\n * upper bound on the required number of output samples for the given number of\n * input samples. Conversion will run directly without copying whenever possible.\n *\n * @param s         allocated Swr context, with parameters set\n * @param out       output buffers, only the first one need be set in case of packed audio\n * @param out_count amount of space available for output in samples per channel\n * @param in        input buffers, only the first one need to be set in case of packed audio\n * @param in_count  number of input samples available in one channel\n *\n * @return number of samples output per channel, negative value on error\n */\nint swr_convert(struct SwrContext *s, uint8_t * const *out, int out_count,\n                                const uint8_t * const *in , int in_count);\n\n/**\n * Convert the next timestamp from input to output\n * timestamps are in 1/(in_sample_rate * out_sample_rate) units.\n *\n * @note There are 2 slightly differently behaving modes.\n *       @li When automatic timestamp compensation is not used, (min_compensation >= FLT_MAX)\n *              in this case timestamps will be passed through with delays compensated\n *       @li When automatic timestamp compensation is used, (min_compensation < FLT_MAX)\n *              in this case the output timestamps will match output sample numbers.\n *              See ffmpeg-resampler(1) for the two modes of compensation.\n *\n * @param[in] s     initialized Swr context\n * @param[in] pts   timestamp for the next input sample, INT64_MIN if unknown\n * @see swr_set_compensation(), swr_drop_output(), and swr_inject_silence() are\n *      function used internally for timestamp compensation.\n * @return the output timestamp for the next output sample\n */\nint64_t swr_next_pts(struct SwrContext *s, int64_t pts);\n\n/**\n * @}\n *\n * @name Low-level option setting functions\n * These functions provide a means to set low-level options that is not possible\n * with the AVOption API.\n * @{\n */\n\n/**\n * Activate resampling compensation (\"soft\" compensation). This function is\n * internally called when needed in swr_next_pts().\n *\n * @param[in,out] s             allocated Swr context. If it is not initialized,\n *                              or SWR_FLAG_RESAMPLE is not set, swr_init() is\n *                              called with the flag set.\n * @param[in]     sample_delta  delta in PTS per sample\n * @param[in]     compensation_distance number of samples to compensate for\n * @return    >= 0 on success, AVERROR error codes if:\n *            @li @c s is NULL,\n *            @li @c compensation_distance is less than 0,\n *            @li @c compensation_distance is 0 but sample_delta is not,\n *            @li compensation unsupported by resampler, or\n *            @li swr_init() fails when called.\n */\nint swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance);\n\n/**\n * Set a customized input channel mapping.\n *\n * @param[in,out] s           allocated Swr context, not yet initialized\n * @param[in]     channel_map customized input channel mapping (array of channel\n *                            indexes, -1 for a muted channel)\n * @return >= 0 on success, or AVERROR error code in case of failure.\n */\nint swr_set_channel_mapping(struct SwrContext *s, const int *channel_map);\n\n/**\n * Generate a channel mixing matrix.\n *\n * This function is the one used internally by libswresample for building the\n * default mixing matrix. It is made public just as a utility function for\n * building custom matrices.\n *\n * @param in_layout           input channel layout\n * @param out_layout          output channel layout\n * @param center_mix_level    mix level for the center channel\n * @param surround_mix_level  mix level for the surround channel(s)\n * @param lfe_mix_level       mix level for the low-frequency effects channel\n * @param rematrix_maxval     if 1.0, coefficients will be normalized to prevent\n *                            overflow. if INT_MAX, coefficients will not be\n *                            normalized.\n * @param[out] matrix         mixing coefficients; matrix[i + stride * o] is\n *                            the weight of input channel i in output channel o.\n * @param stride              distance between adjacent input channels in the\n *                            matrix array\n * @param matrix_encoding     matrixed stereo downmix mode (e.g. dplii)\n * @param log_ctx             parent logging context, can be NULL\n * @return                    0 on success, negative AVERROR code on failure\n */\nint swr_build_matrix2(const AVChannelLayout *in_layout, const AVChannelLayout *out_layout,\n                      double center_mix_level, double surround_mix_level,\n                      double lfe_mix_level, double maxval,\n                      double rematrix_volume, double *matrix,\n                      ptrdiff_t stride, enum AVMatrixEncoding matrix_encoding,\n                      void *log_context);\n\n/**\n * Set a customized remix matrix.\n *\n * @param s       allocated Swr context, not yet initialized\n * @param matrix  remix coefficients; matrix[i + stride * o] is\n *                the weight of input channel i in output channel o\n * @param stride  offset between lines of the matrix\n * @return  >= 0 on success, or AVERROR error code in case of failure.\n */\nint swr_set_matrix(struct SwrContext *s, const double *matrix, int stride);\n\n/**\n * @}\n *\n * @name Sample handling functions\n * @{\n */\n\n/**\n * Drops the specified number of output samples.\n *\n * This function, along with swr_inject_silence(), is called by swr_next_pts()\n * if needed for \"hard\" compensation.\n *\n * @param s     allocated Swr context\n * @param count number of samples to be dropped\n *\n * @return >= 0 on success, or a negative AVERROR code on failure\n */\nint swr_drop_output(struct SwrContext *s, int count);\n\n/**\n * Injects the specified number of silence samples.\n *\n * This function, along with swr_drop_output(), is called by swr_next_pts()\n * if needed for \"hard\" compensation.\n *\n * @param s     allocated Swr context\n * @param count number of samples to be dropped\n *\n * @return >= 0 on success, or a negative AVERROR code on failure\n */\nint swr_inject_silence(struct SwrContext *s, int count);\n\n/**\n * Gets the delay the next input sample will experience relative to the next output sample.\n *\n * Swresample can buffer data if more input has been provided than available\n * output space, also converting between sample rates needs a delay.\n * This function returns the sum of all such delays.\n * The exact delay is not necessarily an integer value in either input or\n * output sample rate. Especially when downsampling by a large value, the\n * output sample rate may be a poor choice to represent the delay, similarly\n * for upsampling and the input sample rate.\n *\n * @param s     swr context\n * @param base  timebase in which the returned delay will be:\n *              @li if it's set to 1 the returned delay is in seconds\n *              @li if it's set to 1000 the returned delay is in milliseconds\n *              @li if it's set to the input sample rate then the returned\n *                  delay is in input samples\n *              @li if it's set to the output sample rate then the returned\n *                  delay is in output samples\n *              @li if it's the least common multiple of in_sample_rate and\n *                  out_sample_rate then an exact rounding-free delay will be\n *                  returned\n * @returns     the delay in 1 / @c base units.\n */\nint64_t swr_get_delay(struct SwrContext *s, int64_t base);\n\n/**\n * Find an upper bound on the number of samples that the next swr_convert\n * call will output, if called with in_samples of input samples. This\n * depends on the internal state, and anything changing the internal state\n * (like further swr_convert() calls) will may change the number of samples\n * swr_get_out_samples() returns for the same number of input samples.\n *\n * @param in_samples    number of input samples.\n * @note any call to swr_inject_silence(), swr_convert(), swr_next_pts()\n *       or swr_set_compensation() invalidates this limit\n * @note it is recommended to pass the correct available buffer size\n *       to all functions like swr_convert() even if swr_get_out_samples()\n *       indicates that less would be used.\n * @returns an upper bound on the number of samples that the next swr_convert\n *          will output or a negative value to indicate an error\n */\nint swr_get_out_samples(struct SwrContext *s, int in_samples);\n\n/**\n * @}\n *\n * @name Configuration accessors\n * @{\n */\n\n/**\n * Return the @ref LIBSWRESAMPLE_VERSION_INT constant.\n *\n * This is useful to check if the build-time libswresample has the same version\n * as the run-time one.\n *\n * @returns     the unsigned int-typed version\n */\nunsigned swresample_version(void);\n\n/**\n * Return the swr build-time configuration.\n *\n * @returns     the build-time @c ./configure flags\n */\nconst char *swresample_configuration(void);\n\n/**\n * Return the swr license.\n *\n * @returns     the license of libswresample, determined at build-time\n */\nconst char *swresample_license(void);\n\n/**\n * @}\n *\n * @name AVFrame based API\n * @{\n */\n\n/**\n * Convert the samples in the input AVFrame and write them to the output AVFrame.\n *\n * Input and output AVFrames must have channel_layout, sample_rate and format set.\n *\n * If the output AVFrame does not have the data pointers allocated the nb_samples\n * field will be set using av_frame_get_buffer()\n * is called to allocate the frame.\n *\n * The output AVFrame can be NULL or have fewer allocated samples than required.\n * In this case, any remaining samples not written to the output will be added\n * to an internal FIFO buffer, to be returned at the next call to this function\n * or to swr_convert().\n *\n * If converting sample rate, there may be data remaining in the internal\n * resampling delay buffer. swr_get_delay() tells the number of\n * remaining samples. To get this data as output, call this function or\n * swr_convert() with NULL input.\n *\n * If the SwrContext configuration does not match the output and\n * input AVFrame settings the conversion does not take place and depending on\n * which AVFrame is not matching AVERROR_OUTPUT_CHANGED, AVERROR_INPUT_CHANGED\n * or the result of a bitwise-OR of them is returned.\n *\n * @see swr_delay()\n * @see swr_convert()\n * @see swr_get_delay()\n *\n * @param swr             audio resample context\n * @param output          output AVFrame\n * @param input           input AVFrame\n * @return                0 on success, AVERROR on failure or nonmatching\n *                        configuration.\n */\nint swr_convert_frame(SwrContext *swr,\n                      AVFrame *output, const AVFrame *input);\n\n/**\n * Configure or reconfigure the SwrContext using the information\n * provided by the AVFrames.\n *\n * The original resampling context is reset even on failure.\n * The function calls swr_close() internally if the context is open.\n *\n * @see swr_close();\n *\n * @param swr             audio resample context\n * @param out             output AVFrame\n * @param in              input AVFrame\n * @return                0 on success, AVERROR on failure.\n */\nint swr_config_frame(SwrContext *swr, const AVFrame *out, const AVFrame *in);\n\n/**\n * @}\n * @}\n */\n\n#endif /* SWRESAMPLE_SWRESAMPLE_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libswresample/version.h",
    "content": "/*\n * Version macros.\n *\n * This file is part of libswresample\n *\n * libswresample is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * libswresample is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with libswresample; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef SWRESAMPLE_VERSION_H\n#define SWRESAMPLE_VERSION_H\n\n/**\n * @file\n * Libswresample version macros\n */\n\n#include \"libavutil/version.h\"\n\n#include \"version_major.h\"\n\n#define LIBSWRESAMPLE_VERSION_MINOR   1\n#define LIBSWRESAMPLE_VERSION_MICRO 100\n\n#define LIBSWRESAMPLE_VERSION_INT  AV_VERSION_INT(LIBSWRESAMPLE_VERSION_MAJOR, \\\n                                                  LIBSWRESAMPLE_VERSION_MINOR, \\\n                                                  LIBSWRESAMPLE_VERSION_MICRO)\n#define LIBSWRESAMPLE_VERSION      AV_VERSION(LIBSWRESAMPLE_VERSION_MAJOR, \\\n                                              LIBSWRESAMPLE_VERSION_MINOR, \\\n                                              LIBSWRESAMPLE_VERSION_MICRO)\n#define LIBSWRESAMPLE_BUILD        LIBSWRESAMPLE_VERSION_INT\n\n#define LIBSWRESAMPLE_IDENT        \"SwR\" AV_STRINGIFY(LIBSWRESAMPLE_VERSION)\n\n#endif /* SWRESAMPLE_VERSION_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/external/include_ffmpeg/libswresample/version_major.h",
    "content": "/*\n * Version macros.\n *\n * This file is part of libswresample\n *\n * libswresample is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * libswresample is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with libswresample; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef SWRESAMPLE_VERSION_MAJOR_H\n#define SWRESAMPLE_VERSION_MAJOR_H\n\n/**\n * @file\n * Libswresample version macros\n */\n\n#define LIBSWRESAMPLE_VERSION_MAJOR   6\n\n#endif /* SWRESAMPLE_VERSION_MAJOR_H */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/jsi/JsiHostObject.cpp",
    "content": "#include <audioapi/jsi/JsiHostObject.h>\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\n//  set this value to 1 in order to debug the construction/destruction\n#define JSI_DEBUG_ALLOCATIONS 0\n\nnamespace audioapi {\n\n#if JSI_DEBUG_ALLOCATIONS\nint objCounter = 0;\nstd::vector<JsiHostObject *> objects;\n#endif\n\nJsiHostObject::JsiHostObject() {\n  getters_ = std::make_unique<\n      std::unordered_map<std::string, jsi::Value (JsiHostObject::*)(jsi::Runtime &)>>();\n  functions_ = std::make_unique<std::unordered_map<\n      std::string,\n      jsi::Value (JsiHostObject::*)(\n          jsi::Runtime &, const jsi::Value &, const jsi::Value *, size_t)>>();\n  setters_ = std::make_unique<std::unordered_map<\n      std::string,\n      void (JsiHostObject::*)(jsi::Runtime &, const jsi::Value &)>>();\n\n#if JSI_DEBUG_ALLOCATIONS\n  objects.push_back(this);\n  objCounter++;\n#endif\n}\n\nJsiHostObject::JsiHostObject(JsiHostObject &&other) noexcept\n    : getters_(std::move(other.getters_)),\n      functions_(std::move(other.functions_)),\n      setters_(std::move(other.setters_)) {\n#if JSI_DEBUG_ALLOCATIONS\n  auto it = std::find(objects.begin(), objects.end(), &other);\n  if (it != objects.end()) {\n    objects.erase(it);\n  }\n  objects.push_back(this);\n#endif\n}\n\nJsiHostObject &JsiHostObject::operator=(JsiHostObject &&other) noexcept {\n  if (this != &other) {\n    getters_ = std::move(other.getters_);\n    functions_ = std::move(other.functions_);\n    setters_ = std::move(other.setters_);\n\n#if JSI_DEBUG_ALLOCATIONS\n    auto it = std::find(objects.begin(), objects.end(), &other);\n    if (it != objects.end()) {\n      objects.erase(it);\n    }\n    objects.push_back(this);\n#endif\n  }\n  return *this;\n}\n\nJsiHostObject::~JsiHostObject() {\n#if JSI_DEBUG_ALLOCATIONS\n  auto it = std::find(objects.begin(), objects.end(), this);\n  if (it != objects.end()) {\n    objects.erase(it);\n    objCounter--;\n  }\n#endif\n}\n\nstd::vector<jsi::PropNameID> JsiHostObject::getPropertyNames(jsi::Runtime &rt) {\n  std::vector<jsi::PropNameID> propertyNames;\n  propertyNames.reserve(getters_->size() + functions_->size() + setters_->size());\n\n  for (const auto &it : *getters_) {\n    propertyNames.push_back(jsi::PropNameID::forUtf8(rt, it.first));\n  }\n\n  for (const auto &it : *functions_) {\n    propertyNames.push_back(jsi::PropNameID::forAscii(rt, it.first));\n  }\n\n  for (const auto &it : *setters_) {\n    propertyNames.push_back(jsi::PropNameID::forAscii(rt, it.first));\n  }\n\n  return propertyNames;\n}\n\njsi::Value JsiHostObject::get(jsi::Runtime &runtime, const jsi::PropNameID &name) {\n  auto nameAsString = name.utf8(runtime);\n  auto &hostFunctionCache = hostFunctionCache_.get(runtime);\n\n  auto cachedFunction = hostFunctionCache.find(nameAsString);\n  if (cachedFunction != hostFunctionCache.end()) {\n    return cachedFunction->second.asFunction(runtime);\n  }\n\n  auto getter = getters_->find(nameAsString);\n  if (getter != getters_->end()) {\n    auto dispatcher = std::bind(getter->second, this, std::placeholders::_1);\n\n    return dispatcher(runtime);\n  }\n\n  auto function = functions_->find(nameAsString);\n  if (function != functions_->end()) {\n    auto dispatcher = std::bind(\n        function->second,\n        reinterpret_cast<JsiHostObject *>(this),\n        std::placeholders::_1,\n        std::placeholders::_2,\n        std::placeholders::_3,\n        std::placeholders::_4);\n\n    return hostFunctionCache\n        .emplace(nameAsString, jsi::Function::createFromHostFunction(runtime, name, 0, dispatcher))\n        .first->second.asFunction(runtime);\n  }\n\n  return jsi::Value::undefined();\n}\n\nvoid JsiHostObject::set(\n    jsi::Runtime &runtime,\n    const jsi::PropNameID &name,\n    const jsi::Value &value) {\n  auto nameAsString = name.utf8(runtime);\n\n  auto setter = setters_->find(nameAsString);\n\n  if (setter != setters_->end()) {\n    auto dispatcher = std::bind(setter->second, this, std::placeholders::_1, std::placeholders::_2);\n\n    return dispatcher(runtime, value);\n  }\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/jsi/JsiHostObject.h",
    "content": "#pragma once\n\n#include <audioapi/jsi/RuntimeAwareCache.h>\n\n#include <jsi/jsi.h>\n#include <map>\n#include <memory>\n#include <string>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\n#define JSI_HOST_FUNCTION_DECL(name) \\\n  jsi::Value name( \\\n      jsi::Runtime &runtime, const jsi::Value &thisValue, const jsi::Value *args, size_t count)\n#define JSI_HOST_FUNCTION_IMPL(CLASS, name) \\\n  jsi::Value CLASS::name( \\\n      jsi::Runtime &runtime, const jsi::Value &thisValue, const jsi::Value *args, size_t count)\n#define JSI_EXPORT_FUNCTION(CLASS, FUNCTION) \\\n  std::make_pair( \\\n      std::string(#FUNCTION), \\\n      static_cast<jsi::Value (JsiHostObject::*)( \\\n          jsi::Runtime &, const jsi::Value &, const jsi::Value *, size_t)>(&CLASS::FUNCTION))\n\n#define JSI_PROPERTY_GETTER_DECL(name) jsi::Value name(jsi::Runtime &runtime)\n#define JSI_PROPERTY_GETTER_IMPL(CLASS, name) jsi::Value CLASS::name(jsi::Runtime &runtime)\n#define JSI_EXPORT_PROPERTY_GETTER(CLASS, FUNCTION) \\\n  std::make_pair( \\\n      std::string(#FUNCTION), \\\n      static_cast<jsi::Value (JsiHostObject::*)(jsi::Runtime &)>(&CLASS::FUNCTION))\n\n#define JSI_PROPERTY_SETTER_DECL(name) void name(jsi::Runtime &runtime, const jsi::Value &value)\n#define JSI_PROPERTY_SETTER_IMPL(CLASS, name) \\\n  void CLASS::name(jsi::Runtime &runtime, const jsi::Value &value)\n#define JSI_EXPORT_PROPERTY_SETTER(CLASS, FUNCTION) \\\n  std::make_pair( \\\n      std::string(#FUNCTION), \\\n      static_cast<void (JsiHostObject::*)(jsi::Runtime &, const jsi::Value &)>(&CLASS::FUNCTION))\n\nnamespace audioapi {\n\nusing namespace facebook;\n\nclass JsiHostObject : public jsi::HostObject {\n public:\n  JsiHostObject();\n  JsiHostObject(const JsiHostObject &) = delete;\n  JsiHostObject &operator=(const JsiHostObject &) = delete;\n  JsiHostObject(JsiHostObject &&) noexcept;\n  JsiHostObject &operator=(JsiHostObject &&other) noexcept;\n  ~JsiHostObject() override;\n\n  std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime &rt) override;\n\n  jsi::Value get(jsi::Runtime &runtime, const jsi::PropNameID &name) override;\n\n  void set(jsi::Runtime &runtime, const jsi::PropNameID &name, const jsi::Value &value) override;\n\n  template <typename... Args>\n  void addGetters(Args... args) {\n    (getters_->insert(args), ...);\n  }\n\n  template <typename... Args>\n  void addSetters(Args... args) {\n    (setters_->insert(args), ...);\n  }\n\n  template <typename... Args>\n  void addFunctions(Args... args) {\n    (functions_->insert(args), ...);\n  }\n\n protected:\n  std::unique_ptr<std::unordered_map<std::string, jsi::Value (JsiHostObject::*)(jsi::Runtime &)>>\n      getters_;\n\n  std::unique_ptr<std::unordered_map<\n      std::string,\n      jsi::Value (\n          JsiHostObject::*)(jsi::Runtime &, const jsi::Value &, const jsi::Value *, size_t)>>\n      functions_;\n\n  std::unique_ptr<\n      std::unordered_map<std::string, void (JsiHostObject::*)(jsi::Runtime &, const jsi::Value &)>>\n      setters_;\n\n private:\n  RuntimeAwareCache<std::map<std::string, jsi::Function>> hostFunctionCache_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/jsi/JsiPromise.cpp",
    "content": "#include <audioapi/jsi/JsiPromise.h>\n#include <memory>\n#include <string>\n#include <utility>\n\nnamespace audioapi {\n\nusing namespace facebook;\n\njsi::Value PromiseVendor::createAsyncPromise(std::function<PromiseResolver()> &&function) {\n  auto &runtime = *runtime_;\n  auto callInvoker = callInvoker_;\n  auto threadPool = threadPool_;\n  auto promiseCtor = runtime.global().getPropertyAsFunction(runtime, \"Promise\");\n  auto promiseLambda = [threadPool = std::move(threadPool),\n                        callInvoker = std::move(callInvoker),\n                        function = std::move(function)](\n                           jsi::Runtime &runtime,\n                           const jsi::Value &thisValue,\n                           const jsi::Value *arguments,\n                           size_t count) mutable -> jsi::Value {\n    auto resolveLocal = arguments[0].asObject(runtime).asFunction(runtime);\n    auto resolve = std::make_shared<jsi::Function>(std::move(resolveLocal));\n    auto rejectLocal = arguments[1].asObject(runtime).asFunction(runtime);\n    auto reject = std::make_shared<jsi::Function>(std::move(rejectLocal));\n\n    threadPool->schedule(\n        &PromiseVendor::asyncPromiseJob,\n        std::move(callInvoker),\n        std::move(function),\n        std::move(resolve),\n        std::move(reject));\n    return jsi::Value::undefined();\n  };\n  auto promiseFunction = jsi::Function::createFromHostFunction(\n      runtime, jsi::PropNameID::forUtf8(runtime, \"asyncPromise\"), 2, std::move(promiseLambda));\n  return promiseCtor.callAsConstructor(runtime, std::move(promiseFunction));\n}\n\njsi::Value PromiseVendor::createAsyncPromise(std::function<void(Promise &&)> &&function) {\n  auto &runtime = *runtime_;\n  auto callInvoker = callInvoker_;\n  auto threadPool = threadPool_;\n  auto promiseCtor = runtime.global().getPropertyAsFunction(runtime, \"Promise\");\n  auto promiseLambda = [threadPool = std::move(threadPool),\n                        callInvoker = std::move(callInvoker),\n                        function = std::move(function)](\n                           jsi::Runtime &runtime,\n                           const jsi::Value &thisValue,\n                           const jsi::Value *arguments,\n                           size_t count) mutable -> jsi::Value {\n    auto resolveLocal = arguments[0].asObject(runtime).asFunction(runtime);\n    auto rejectLocal = arguments[1].asObject(runtime).asFunction(runtime);\n\n    Promise promise(std::move(callInvoker), std::move(resolveLocal), std::move(rejectLocal));\n\n    threadPool->schedule(std::move(function), std::move(promise));\n\n    return jsi::Value::undefined();\n  };\n  auto promiseFunction = jsi::Function::createFromHostFunction(\n      runtime, jsi::PropNameID::forUtf8(runtime, \"asyncPromise\"), 2, std::move(promiseLambda));\n  return promiseCtor.callAsConstructor(runtime, std::move(promiseFunction));\n}\n\nvoid PromiseVendor::asyncPromiseJob(\n    std::shared_ptr<react::CallInvoker> callInvoker,\n    std::function<PromiseResolver()> &&function,\n    std::shared_ptr<jsi::Function> &&resolve,\n    std::shared_ptr<jsi::Function> &&reject) {\n  auto resolver = function();\n  callInvoker->invokeAsync(\n      [resolver = std::move(resolver), reject = std::move(reject), resolve = std::move(resolve)](\n          jsi::Runtime &runtime) -> void {\n        auto result = resolver(runtime);\n        if (std::holds_alternative<jsi::Value>(result)) {\n          auto valueShared = std::make_shared<jsi::Value>(std::move(std::get<jsi::Value>(result)));\n          resolve->call(runtime, *valueShared);\n        } else {\n          auto errorMessage = std::get<std::string>(result);\n          auto error = jsi::JSError(runtime, errorMessage);\n          reject->call(runtime, error.value());\n        }\n      });\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/jsi/JsiPromise.h",
    "content": "#pragma once\n\n#include <ReactCommon/CallInvoker.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/utils/ThreadPool.hpp>\n#include <jsi/jsi.h>\n#include <functional>\n#include <memory>\n#include <string>\n#include <utility>\n#include <variant>\n\nnamespace audioapi {\n\nusing namespace facebook;\n\nclass Promise {\n  struct Inner {\n    std::shared_ptr<react::CallInvoker> callInvoker;\n    jsi::Function resolve;\n    jsi::Function reject;\n  };\n\n public:\n  explicit Promise(\n      std::shared_ptr<react::CallInvoker> &&callInvoker,\n      jsi::Function &&resolve,\n      jsi::Function &&reject)\n      : inner_(\n            std::make_shared<Inner>(\n                Inner{std::move(callInvoker), std::move(resolve), std::move(reject)})) {}\n\n  Promise(const Promise &other) {\n    inner_ = other.inner_;\n  }\n  Promise(Promise &&other) noexcept : inner_(std::move(other.inner_)) {}\n  Promise &operator=(Promise &&other) noexcept {\n    if (this != &other) {\n      inner_ = std::move(other.inner_);\n    }\n    return *this;\n  }\n\n  void resolve(const std::function<jsi::Value(jsi::Runtime &)> &&resolver) const {\n    auto inner = inner_;\n    inner->callInvoker->invokeAsync(\n        [inner = std::move(inner),\n         resolver = std::forward<decltype(resolver)>(resolver)](jsi::Runtime &runtime) -> void {\n          auto valueShared = std::make_shared<jsi::Value>(resolver(runtime));\n          inner->resolve.call(runtime, *valueShared);\n        });\n  }\n\n  void reject(const std::string &errorMessage) const {\n    auto inner = inner_;\n    inner->callInvoker->invokeAsync(\n        [inner = std::move(inner), errorMessage](jsi::Runtime &runtime) -> void {\n          auto error = jsi::JSError(runtime, errorMessage);\n          inner->reject.call(runtime, error.value());\n        });\n  }\n\n private:\n  std::shared_ptr<Inner> inner_;\n};\n\nusing PromiseResolver = std::function<std::variant<jsi::Value, std::string>(jsi::Runtime &)>;\n\nclass PromiseVendor {\n public:\n  PromiseVendor(jsi::Runtime *runtime, const std::shared_ptr<react::CallInvoker> &callInvoker)\n      : runtime_(runtime),\n        callInvoker_(callInvoker),\n        threadPool_(\n            std::make_shared<ThreadPool>(\n                audioapi::PROMISE_VENDOR_THREAD_POOL_WORKER_COUNT,\n                audioapi::PROMISE_VENDOR_THREAD_POOL_LOAD_BALANCER_QUEUE_SIZE,\n                audioapi::PROMISE_VENDOR_THREAD_POOL_WORKER_QUEUE_SIZE)) {}\n\n  /// @brief Creates an asynchronous promise.\n  /// @param function The function to execute asynchronously. It should return either a jsi::Value on success or a std::string error message on failure.\n  /// @return The created promise.\n  /// @note The function is executed on a different thread, and the promise is resolved or rejected based on the function's outcome.\n  /// @note IMPORTANT: This function is not thread-safe and should be called from a single thread only. (comes from underlying ThreadPool implementation)\n  /// @example\n  /// ```cpp\n  /// auto promise = promiseVendor_->createAsyncPromise(\n  ///     []() -> PromiseResolver {\n  ///    // Simulate some heavy work on a background thread\n  ///    std::this_thread::sleep_for(std::chrono::seconds(2));\n  ///    return [](jsi::Runtime &rt) -> std::variant<jsi::Value, std::string> {\n  ///      // Prepare and return the result on javascript thread\n  ///      return jsi::String::createFromUtf8(rt, \"Promise resolved successfully!\");\n  ///    };\n  ///  }\n  /// );\n  ///\n  /// return promise;\n  jsi::Value createAsyncPromise(std::function<PromiseResolver()> &&function);\n\n  /// @brief Creates an asynchronous promise.\n  /// @param function The function to execute asynchronously. It receives a Promise object to resolve or reject the promise.\n  /// @return The created promise.\n  /// @note The function is executed on a different thread, the promise should be resolved or rejected using the provided Promise object.\n  /// @note IMPORTANT: This function is not thread-safe and should be called from a single thread only. (comes from underlying ThreadPool implementation)\n  jsi::Value createAsyncPromise(std::function<void(Promise &&)> &&function);\n\n private:\n  jsi::Runtime *runtime_;\n  std::shared_ptr<react::CallInvoker> callInvoker_;\n  std::shared_ptr<ThreadPool> threadPool_;\n\n  static void asyncPromiseJob(\n      std::shared_ptr<react::CallInvoker> callInvoker,\n      std::function<PromiseResolver()> &&function,\n      std::shared_ptr<jsi::Function> &&resolve,\n      std::shared_ptr<jsi::Function> &&reject);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/jsi/JsiUtils.cpp",
    "content": "#include <audioapi/jsi/JsiUtils.h>\n#include <string>\n\nnamespace audioapi::jsiutils {\n\nusing namespace facebook;\n\nstd::string argToString(\n    jsi::Runtime &runtime,\n    const jsi::Value *args,\n    size_t count,\n    size_t index,\n    const std::string &defaultValue) {\n  if (index < count && args[index].isString()) {\n    return args[index].asString(runtime).utf8(runtime);\n  }\n\n  return defaultValue;\n}\n\n} // namespace audioapi::jsiutils\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/jsi/JsiUtils.h",
    "content": "#pragma once\n\n#include <jsi/jsi.h>\n#include <string>\n\nnamespace audioapi::jsiutils {\n\nusing namespace facebook;\n\nstd::string argToString(\n    jsi::Runtime &runtime,\n    const jsi::Value *args,\n    size_t count,\n    size_t index,\n    const std::string &defaultValue = \"\");\n\n} // namespace audioapi::jsiutils\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/jsi/RuntimeAwareCache.h",
    "content": "#pragma once\n\n#include <audioapi/jsi/RuntimeLifecycleMonitor.h>\n\n#include <jsi/jsi.h>\n#include <unordered_map>\n#include <utility>\n\nnamespace audioapi {\n\nusing namespace facebook;\n\n/**\n * Provides a way to keep data specific to a jsi::Runtime instance that gets\n * cleaned up when that runtime is destroyed. This is necessary because JSI does\n * not allow for its associated objects to be retained past the runtime\n * lifetime. If an object (e.g. jsi::Values or jsi::Function instances) is kept\n * after the runtime is torn down, its destructor (once it is destroyed\n * eventually) will result in a crash (JSI objects keep a pointer to memory\n * managed by the runtime, accessing that portion of the memory after runtime is\n * deleted is the root cause of that crash).\n */\ntemplate <typename T>\nclass RuntimeAwareCache : public RuntimeLifecycleListener {\n public:\n  void onRuntimeDestroyed(jsi::Runtime *rt) override {\n    // A runtime has been destroyed, so destroy the related cache.\n    runtimeCaches_.erase(rt);\n  }\n\n  ~RuntimeAwareCache() override {\n    for (auto &cache : runtimeCaches_) {\n      // remove all `onRuntimeDestroyed` listeners.\n      RuntimeLifecycleMonitor::removeListener(*cache.first, this);\n    }\n  }\n\n  T &get(jsi::Runtime &rt) {\n    if (runtimeCaches_.count(&rt) == 0) {\n      // This is the first time this Runtime has been accessed.\n      // We set up a `onRuntimeDestroyed` listener for it and\n      // initialize the cache map.\n      RuntimeLifecycleMonitor::addListener(rt, this);\n\n      T cache;\n      runtimeCaches_.emplace(&rt, std::move(cache));\n    }\n    return runtimeCaches_.at(&rt);\n  }\n\n private:\n  std::unordered_map<jsi::Runtime *, T> runtimeCaches_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.cpp",
    "content": "#include <audioapi/jsi/RuntimeLifecycleMonitor.h>\n#include <memory>\n#include <unordered_map>\n#include <unordered_set>\n#include <utility>\n\nnamespace audioapi {\n\nstatic std::unordered_map<jsi::Runtime *, std::unordered_set<RuntimeLifecycleListener *>> listeners;\n\nstruct RuntimeLifecycleMonitorObject : public jsi::HostObject {\n  jsi::Runtime *rt_;\n  explicit RuntimeLifecycleMonitorObject(jsi::Runtime *rt) : rt_(rt) {}\n  ~RuntimeLifecycleMonitorObject() override {\n    auto listenersSet = listeners.find(rt_);\n    if (listenersSet != listeners.end()) {\n      for (auto listener : listenersSet->second) {\n        listener->onRuntimeDestroyed(rt_);\n      }\n      listeners.erase(listenersSet);\n    }\n  }\n};\n\nvoid RuntimeLifecycleMonitor::addListener(jsi::Runtime &rt, RuntimeLifecycleListener *listener) {\n  auto listenersSet = listeners.find(&rt);\n  if (listenersSet == listeners.end()) {\n    // We install a global host object in the provided runtime, this way we can\n    // use that host object destructor to get notified when the runtime is being\n    // terminated. We use a unique name for the object as it gets saved with the\n    // runtime's global object.\n    rt.global().setProperty(\n        rt,\n        \"__rnaudioapi_runtime_lifecycle_monitor\",\n        jsi::Object::createFromHostObject(\n            rt, std::make_shared<RuntimeLifecycleMonitorObject>(&rt)));\n    std::unordered_set<RuntimeLifecycleListener *> newSet;\n    newSet.insert(listener);\n    listeners.emplace(&rt, std::move(newSet));\n  } else {\n    listenersSet->second.insert(listener);\n  }\n}\n\nvoid RuntimeLifecycleMonitor::removeListener(jsi::Runtime &rt, RuntimeLifecycleListener *listener) {\n  auto listenersSet = listeners.find(&rt);\n  if (listenersSet == listeners.end()) {\n    // nothing to do here\n  } else {\n    listenersSet->second.erase(listener);\n  }\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/jsi/RuntimeLifecycleMonitor.h",
    "content": "#pragma once\n\n#include <jsi/jsi.h>\n\nnamespace audioapi {\n\nusing namespace facebook;\n\n/**\n * Listener interface that allows for getting notified when a jsi::Runtime\n * instance is destroyed.\n */\nstruct RuntimeLifecycleListener {\n  virtual ~RuntimeLifecycleListener() = default;\n  virtual void onRuntimeDestroyed(jsi::Runtime *) = 0;\n};\n\n/**\n * This class provides an API via static methods for registering and\n * unregistering runtime lifecycle listeners. The listeners can be used to\n * cleanup any data that references a given jsi::Runtime instance before it gets\n * destroyed.\n */\nstruct RuntimeLifecycleMonitor {\n  static void addListener(jsi::Runtime &rt, RuntimeLifecycleListener *listener);\n  static void removeListener(jsi::Runtime &rt, RuntimeLifecycleListener *listener);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/audio-stretch/stretch.c",
    "content": "////////////////////////////////////////////////////////////////////////////\n//                        **** AUDIO-STRETCH ****                         //\n//                      Time Domain Harmonic Scaler                       //\n//                    Copyright (c) 2022 David Bryant                     //\n//                          All Rights Reserved.                          //\n//      Distributed under the BSD Software License (see license.txt)      //\n////////////////////////////////////////////////////////////////////////////\n\n// stretch.c\n\n// Time Domain Harmonic Compression and Expansion\n//\n// This library performs time domain harmonic scaling with pitch detection\n// to stretch the timing of a 16-bit PCM signal (either mono or stereo) from\n// 1/2 to 2 times its original length. This is done without altering any of\n// the tonal characteristics.\n//\n// Use stereo (num_chans = 2), when both channels are from same source\n// and should contain approximately similar content.\n// For independent channels, prefer using multiple StretchHandle-instances.\n// see https://github.com/dbry/audio-stretch/issues/6\n\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <stdint.h>\n#include <string.h>\n#include <math.h>\n\n#include \"stretch.h\"\n\n#define MIN_PERIOD  24          /* minimum allowable pitch period */\n#define MAX_PERIOD  2400        /* maximum allowable pitch period */\n\n#if INT_MAX == 32767\n#define MERGE_OFFSET    32768L      /* promote to long before offset */\n#define abs32           labs        /* use long abs to avoid UB */\n#else\n#define MERGE_OFFSET    32768\n#define abs32           abs\n#endif\n\n#define MAX_CORR    UINT32_MAX  /* maximum value for correlation ratios */\n\nstruct stretch_cnxt {\n    int num_chans, inbuff_samples, shortest, longest, tail, head, fast_mode;\n    int16_t *inbuff, *calcbuff;\n    float outsamples_error;\n    uint32_t *results;\n\n    struct stretch_cnxt *next;\n    int16_t *intermediate;\n};\n\nstatic void merge_blocks (int16_t *output, int16_t *input1, int16_t *input2, int samples);\nstatic int find_period_fast (struct stretch_cnxt *cnxt, int16_t *samples);\nstatic int find_period (struct stretch_cnxt *cnxt, int16_t *samples);\n\n/*\n * Initialize a context of the time stretching code. The shortest and longest periods\n * are specified here. The longest period determines the lowest fundamental frequency\n * that can be handled correctly. Note that higher frequencies can be handled than the\n * shortest period would suggest because multiple periods can be combined, and the\n * worst-case performance will suffer if too short a period is selected. The flags are:\n *\n * STRETCH_FAST_FLAG    0x1     Use the \"fast\" version of the period calculation\n *\n * STRETCH_DUAL_FLAG    0x2     Cascade two instances of the stretcher to expand\n *                              available ratios to 0.25X to 4.00X\n */\n\nStretchHandle stretch_init (int shortest_period, int longest_period, int num_channels, int flags)\n{\n    struct stretch_cnxt *cnxt;\n    int max_periods = 3;\n\n    if (flags & STRETCH_FAST_FLAG) {\n        longest_period = (longest_period + 1) & ~1;\n        shortest_period &= ~1;\n        max_periods = 4;\n    }\n\n    if (longest_period <= shortest_period || shortest_period < MIN_PERIOD || longest_period > MAX_PERIOD) {\n        fprintf (stderr, \"stretch_init(): invalid periods!\\n\");\n        return NULL;\n    }\n\n    cnxt = (struct stretch_cnxt *) calloc (1, sizeof (struct stretch_cnxt));\n\n    if (cnxt) {\n        cnxt->inbuff_samples = longest_period * num_channels * max_periods;\n        cnxt->inbuff = calloc (cnxt->inbuff_samples, sizeof (*cnxt->inbuff));\n\n        if (num_channels == 2 || (flags & STRETCH_FAST_FLAG))\n            cnxt->calcbuff = calloc (longest_period * num_channels, sizeof (*cnxt->calcbuff));\n\n        if ((flags & STRETCH_FAST_FLAG))\n            cnxt->results = calloc (longest_period, sizeof (*cnxt->results));\n    }\n\n    if (!cnxt || !cnxt->inbuff || (num_channels == 2 && (flags & STRETCH_FAST_FLAG) && !cnxt->calcbuff) || ((flags & STRETCH_FAST_FLAG) && !cnxt->results)) {\n        fprintf (stderr, \"stretch_init(): out of memory!\\n\");\n        return NULL;\n    }\n\n    cnxt->head = cnxt->tail = cnxt->longest = longest_period * num_channels;\n    cnxt->fast_mode = (flags & STRETCH_FAST_FLAG) ? 1 : 0;\n    cnxt->shortest = shortest_period * num_channels;\n    cnxt->num_chans = num_channels;\n\n    if (flags & STRETCH_DUAL_FLAG) {\n        cnxt->next = stretch_init (shortest_period, longest_period, num_channels, flags & ~STRETCH_DUAL_FLAG);\n        cnxt->intermediate = calloc (longest_period * num_channels * max_periods, sizeof (*cnxt->intermediate));\n    }\n\n    return (StretchHandle) cnxt;\n}\n\n/*\n * Re-Initialize a context of the time stretching code - as if freshly created\n * with stretch_init(). This drops all internal state.\n */\n\nvoid stretch_reset (StretchHandle handle)\n{\n    struct stretch_cnxt *cnxt = (struct stretch_cnxt *) handle;\n\n    cnxt->head = cnxt->tail = cnxt->longest;\n    memset (cnxt->inbuff, 0, cnxt->tail * sizeof (*cnxt->inbuff));\n\n    if (cnxt->next)\n        stretch_reset (cnxt->next);\n}\n\n/*\n * Determine how many samples (per channel) should be reserved in 'output'-array\n * for stretch_samples() and stretch_flush(). max_num_samples and max_ratio are the\n * maximum values that will be passed to stretch_samples().\n */\n\nint stretch_output_capacity (StretchHandle handle, int max_num_samples, float max_ratio)\n{\n    struct stretch_cnxt *cnxt = (struct stretch_cnxt *) handle;\n    int max_period = cnxt->longest / cnxt->num_chans;\n    int max_expected_samples;\n    float next_ratio;\n\n    if (cnxt->next) {\n        if (max_ratio < 0.5) {\n            next_ratio = max_ratio / 0.5;\n            max_ratio = 0.5;\n        }\n        else if (max_ratio > 2.0) {\n            next_ratio = max_ratio / 2.0;\n            max_ratio = 2.0;\n        }\n        else\n            next_ratio = 1.0;\n    }\n\n    max_expected_samples = (int) ceil (max_num_samples * ceil (max_ratio * 2.0) / 2.0) +\n        max_period * (cnxt->fast_mode ? 4 : 3);\n\n    if (cnxt->next)\n        max_expected_samples = stretch_output_capacity (cnxt->next, max_expected_samples, next_ratio);\n\n    return max_expected_samples;\n}\n\n/*\n * Process the specified samples with the given ratio (which is normally clipped to\n * the range 0.5 to 2.0, or 0.25 to 4.00 for the \"dual\" mode). Note that in stereo\n * the number of samples refers to the samples for one channel (i.e., not the total\n * number of values passed) and can be as large as desired (samples are buffered here).\n * The ratio may change between calls, but there is some latency to consider because\n * audio is buffered here and a new ratio may be applied to previously sent samples.\n *\n * The exact number of samples output is not easy to determine in advance, so a function\n * is provided (stretch_output_capacity()) that calculates the maximum number of samples\n * that can be generated from a single call to this function (or stretch_flush()) given\n * a number of samples and maximum ratio. It is reccomended that that function be used\n * after initialization to allocate in advance the buffer size required. Be sure to\n * multiply the return value by the number channels!\n */\n\nint stretch_samples (StretchHandle handle, const int16_t *samples, int num_samples, int16_t *output, float ratio)\n{\n    struct stretch_cnxt *cnxt = (struct stretch_cnxt *) handle;\n    int out_samples = 0, next_samples = 0;\n    int16_t *outbuf = output;\n    float next_ratio;\n\n    /* if there's a cascaded instance after this one, try to do as much of the ratio here and the rest in \"next\" */\n\n    if (cnxt->next) {\n        outbuf = cnxt->intermediate;\n\n        if (ratio < 0.5) {\n            next_ratio = ratio / 0.5;\n            ratio = 0.5;\n        }\n        else if (ratio > 2.0) {\n            next_ratio = ratio / 2.0;\n            ratio = 2.0;\n        }\n        else\n            next_ratio = 1.0;\n    }\n\n    num_samples *= cnxt->num_chans;\n\n    /* this really should not happen, but a good idea to clamp in case */\n\n    if (ratio < 0.5)\n        ratio = 0.5;\n    else if (ratio > 2.0)\n        ratio = 2.0;\n\n    /* while we have pending samples to read into our buffer */\n\n    while (num_samples) {\n\n        /* copy in as many samples as we have room for */\n\n        int samples_to_copy = num_samples;\n\n        if (samples_to_copy > cnxt->inbuff_samples - cnxt->head)\n            samples_to_copy = cnxt->inbuff_samples - cnxt->head;\n\n        memcpy (cnxt->inbuff + cnxt->head, samples, samples_to_copy * sizeof (cnxt->inbuff [0]));\n        num_samples -= samples_to_copy;\n        samples += samples_to_copy;\n        cnxt->head += samples_to_copy;\n\n        /* while there are enough samples to process (3 or 4 times the longest period), do so */\n\n        while (cnxt->tail >= cnxt->longest && cnxt->head - cnxt->tail >= cnxt->longest * (cnxt->fast_mode ? 3 : 2)) {\n            float process_ratio;\n            int period;\n\n            if (ratio != 1.0 || cnxt->outsamples_error)\n                period = cnxt->fast_mode ? find_period_fast (cnxt, cnxt->inbuff + cnxt->tail) :\n                    find_period (cnxt, cnxt->inbuff + cnxt->tail);\n            else\n                period = cnxt->longest;\n\n            /*\n             * Once we have calculated the best-match period, there are 4 possible transformations\n             * available to convert the input samples to output samples. Obviously we can simply\n             * copy the samples verbatim (1:1). Standard TDHS provides algorithms for 2:1 and\n             * 1:2 scaling, and I have created an obvious extension for 2:3 scaling. To achieve\n             * intermediate ratios we maintain a \"error\" term (in samples) and use that here to\n             * calculate the actual transformation to apply.\n             */\n\n            if (cnxt->outsamples_error == 0.0)\n                process_ratio = floor (ratio * 2.0 + 0.5) / 2.0;\n            else if (cnxt->outsamples_error > 0.0)\n                process_ratio = floor (ratio * 2.0) / 2.0;\n            else\n                process_ratio = ceil (ratio * 2.0) / 2.0;\n\n            if (process_ratio == 0.5) {\n                merge_blocks (outbuf + out_samples, cnxt->inbuff + cnxt->tail,\n                    cnxt->inbuff + cnxt->tail + period, period);\n                cnxt->outsamples_error += period - (period * 2.0 * ratio);\n                out_samples += period;\n                cnxt->tail += period * 2;\n            }\n            else if (process_ratio == 1.0) {\n                memcpy (outbuf + out_samples, cnxt->inbuff + cnxt->tail, period * 2 * sizeof (cnxt->inbuff [0]));\n\n                if (ratio != 1.0)\n                    cnxt->outsamples_error += (period * 2.0) - (period * 2.0 * ratio);\n                else\n                    cnxt->outsamples_error = 0; /* if the ratio is 1.0, we can never cancel the error, so just do it now */\n\n                out_samples += period * 2;\n                cnxt->tail += period * 2;\n            }\n            else if (process_ratio == 1.5) {\n                memcpy (outbuf + out_samples, cnxt->inbuff + cnxt->tail, period * sizeof (cnxt->inbuff [0]));\n                merge_blocks (outbuf + out_samples + period, cnxt->inbuff + cnxt->tail + period,\n                    cnxt->inbuff + cnxt->tail, period);\n                memcpy (outbuf + out_samples + period * 2, cnxt->inbuff + cnxt->tail + period, period * sizeof (cnxt->inbuff [0]));\n                cnxt->outsamples_error += (period * 3.0) - (period * 2.0 * ratio);\n                out_samples += period * 3;\n                cnxt->tail += period * 2;\n            }\n            else if (process_ratio == 2.0) {\n                merge_blocks (outbuf + out_samples, cnxt->inbuff + cnxt->tail,\n                    cnxt->inbuff + cnxt->tail - period, period * 2);\n\n                cnxt->outsamples_error += (period * 2.0) - (period * ratio);\n                out_samples += period * 2;\n                cnxt->tail += period;\n\n                if (cnxt->fast_mode) {\n                    merge_blocks (outbuf + out_samples, cnxt->inbuff + cnxt->tail,\n                        cnxt->inbuff + cnxt->tail - period, period * 2);\n\n                    cnxt->outsamples_error += (period * 2.0) - (period * ratio);\n                    out_samples += period * 2;\n                    cnxt->tail += period;\n                }\n            }\n            else\n                fprintf (stderr, \"stretch_samples: fatal programming error: process_ratio == %g\\n\", process_ratio);\n\n            /* if there's another cascaded instance after this, pass the just stretched samples into that */\n\n            if (cnxt->next) {\n                next_samples += stretch_samples (cnxt->next, outbuf, out_samples / cnxt->num_chans, output + next_samples * cnxt->num_chans, next_ratio);\n                out_samples = 0;\n            }\n\n            /* finally, left-justify the samples in the buffer leaving one longest period of history */\n\n            int samples_to_move = cnxt->inbuff_samples - cnxt->tail + cnxt->longest;\n\n            memmove (cnxt->inbuff, cnxt->inbuff + cnxt->tail - cnxt->longest,\n                samples_to_move * sizeof (cnxt->inbuff [0]));\n\n            cnxt->head -= cnxt->tail - cnxt->longest;\n            cnxt->tail = cnxt->longest;\n        }\n    }\n\n    /*\n     * This code is not strictly required, but will reduce latency, especially in the dual-instance case, by\n     * always flushing all pending samples if no actual stretching is desired (i.e., ratio is 1.0 and there's\n     * no error to compensate for). This case is more common now than previously because of the gap detection\n     * and cascaded instances.\n     */\n\n    if (ratio == 1.0 && !cnxt->outsamples_error && cnxt->head != cnxt->tail) {\n        int samples_leftover = cnxt->head - cnxt->tail;\n\n        if (cnxt->next)\n            next_samples += stretch_samples (cnxt->next, cnxt->inbuff + cnxt->tail, samples_leftover / cnxt->num_chans,\n                output + next_samples * cnxt->num_chans, next_ratio);\n        else {\n            memcpy (outbuf + out_samples, cnxt->inbuff + cnxt->tail, samples_leftover * sizeof (*output));\n            out_samples += samples_leftover;\n        }\n\n        memmove (cnxt->inbuff, cnxt->inbuff + cnxt->head - cnxt->longest, cnxt->longest * sizeof (cnxt->inbuff [0]));\n        cnxt->head = cnxt->tail = cnxt->longest;\n    }\n\n    return cnxt->next ? next_samples : out_samples / cnxt->num_chans;\n}  \n\n/*\n * Flush any leftover samples out at normal speed. For cascaded dual instances this must be called\n * twice to completely flush, or simply call it until it returns zero samples. The maximum number\n * of samples that can be returned from each call of this function can be determined in advance with\n * stretch_output_capacity().\n */\n\nint stretch_flush (StretchHandle handle, int16_t *output)\n{\n    struct stretch_cnxt *cnxt = (struct stretch_cnxt *) handle;\n    int samples_leftover = cnxt->head - cnxt->tail;\n    int samples_flushed = 0;\n\n    if (cnxt->next) {\n        if (samples_leftover)\n            samples_flushed = stretch_samples (cnxt->next, cnxt->inbuff + cnxt->tail, samples_leftover / cnxt->num_chans, output, 1.0);\n\n        if (!samples_flushed)\n            samples_flushed = stretch_flush (cnxt->next, output);\n    }\n    else {\n        memcpy (output, cnxt->inbuff + cnxt->tail, samples_leftover * sizeof (*output));\n        samples_flushed = samples_leftover / cnxt->num_chans;\n    }\n\n    cnxt->tail = cnxt->head;\n    memset (cnxt->inbuff, 0, cnxt->tail * sizeof (*cnxt->inbuff));\n\n    return samples_flushed;\n}\n\n/* free handle */\n\nvoid stretch_deinit (StretchHandle handle)\n{\n    struct stretch_cnxt *cnxt = (struct stretch_cnxt *) handle;\n\n    free (cnxt->calcbuff);\n    free (cnxt->results);\n    free (cnxt->inbuff);\n\n    if (cnxt->next) {\n        stretch_deinit (cnxt->next);\n        free (cnxt->intermediate);\n    }\n\n    free (cnxt);\n}\n\n/*\n * The pitch detection is done by finding the period that produces the\n * maximum value for the following correlation formula applied to two\n * consecutive blocks of the given period length:\n *\n *         sum of the absolute values of each sample in both blocks\n *   ---------------------------------------------------------------------\n *   sum of the absolute differences of each corresponding pair of samples\n *\n * This formula was chosen for two reasons.  First, it produces output values\n * that can directly compared regardless of the pitch period.  Second, the\n * numerator can be accumulated for successive periods, and only the\n * denominator need be completely recalculated.\n */\n\nstatic int find_period (struct stretch_cnxt *cnxt, int16_t *samples)\n{\n    uint32_t sum, diff, factor, scaler, best_factor = 0;\n    int16_t *calcbuff = samples;\n    int period, best_period;\n    int i, j;\n\n    period = best_period = cnxt->shortest / cnxt->num_chans;\n\n    // convert stereo to mono, and accumulate sum for longest period\n\n    if (cnxt->num_chans == 2) {\n        calcbuff = cnxt->calcbuff;\n\n        for (sum = i = j = 0; i < cnxt->longest * 2; i += 2)\n            sum += abs32 (calcbuff [j++] = ((int32_t) samples [i] + samples [i+1]) >> 1);\n    }\n    else\n        for (sum = i = 0; i < cnxt->longest; ++i)\n            sum += abs32 (calcbuff [i]) + abs32 (calcbuff [i+cnxt->longest]);\n\n    // if silence return longest period, else calculate scaler based on largest sum\n\n    if (sum)\n        scaler = (MAX_CORR - 1) / sum;\n    else\n        return cnxt->longest;\n\n    /* accumulate sum for shortest period size */\n\n    for (sum = i = 0; i < period; ++i)\n        sum += abs32 (calcbuff [i]) + abs32 (calcbuff [i+period]);\n\n    /* this loop actually cycles through all period lengths */\n\n    while (1) {\n        int16_t *comp = calcbuff + period * 2;\n        int16_t *ref = calcbuff + period;\n\n        /* compute sum of absolute differences */\n\n        diff = 0;\n\n        while (ref != calcbuff)\n            diff += abs32 ((int32_t) *--ref - *--comp);\n\n        /*\n         * Here we calculate and store the resulting correlation\n         * factor.  Note that we must watch for a difference of\n         * zero, meaning a perfect match.  Also, for increased\n         * precision using integer math, we scale the sum.\n         */\n\n        factor = diff ? (sum * scaler) / diff : MAX_CORR;\n\n        if (factor >= best_factor) {\n            best_factor = factor;\n            best_period = period;\n        }\n\n        /* see if we're done */\n\n        if (period * cnxt->num_chans == cnxt->longest)\n            break;\n\n        /* update accumulating sum and current period */\n\n        sum += abs32 (calcbuff [period * 2]) + abs32 (calcbuff [period * 2 + 1]);\n        period++;\n    }\n\n    return best_period * cnxt->num_chans;\n}\n\n/*\n * This pitch detection function is similar to find_period() above, except that it\n * is optimized for speed. The audio data corresponding to two maximum periods is\n * averaged 2:1 into the calculation buffer, and then the calulations are done\n * for every other period length. Because the time is essentially proportional to\n * both the number of samples and the number of period lengths to try, this scheme\n * can reduce the time by a factor approaching 4x. The correlation results on either\n * side of the peak are compared to calculate a more accurate center of the period.\n */\n\nstatic int find_period_fast (struct stretch_cnxt *cnxt, int16_t *samples)\n{\n    uint32_t sum, diff, scaler, best_factor = 0;\n    int period, best_period;\n    int i, j;\n\n    best_period = period = cnxt->shortest / (cnxt->num_chans * 2);\n\n    /* first step is compressing data 2:1 into calcbuff, and calculating maximum sum */\n\n    if (cnxt->num_chans == 2)\n        for (sum = i = j = 0; i < cnxt->longest * 2; i += 4)\n            sum += abs32 (cnxt->calcbuff [j++] = ((int32_t) samples [i] + samples [i+1] + samples [i+2] + samples [i+3]) >> 2);\n    else\n        for (sum = i = j = 0; i < cnxt->longest * 2; i += 2)\n            sum += abs32 (cnxt->calcbuff [j++] = ((int32_t) samples [i] + samples [i+1]) >> 1);\n\n    // if silence return longest period, else calculate scaler based on largest sum\n\n    if (sum)\n        scaler = (MAX_CORR - 1) / sum;\n    else\n        return cnxt->longest;\n\n    /* accumulate sum for shortest period */\n\n    for (sum = i = 0; i < period; ++i)\n        sum += abs32 (cnxt->calcbuff [i]) + abs32 (cnxt->calcbuff [i+period]);\n\n    /* this loop actually cycles through all period lengths */\n\n    while (1) {\n        int16_t *comp = cnxt->calcbuff + period * 2;\n        int16_t *ref = cnxt->calcbuff + period;\n\n        /* compute sum of absolute differences */\n\n        diff = 0;\n\n        while (ref != cnxt->calcbuff)\n            diff += abs32 ((int32_t) *--ref - *--comp);\n\n        /*\n         * Here we calculate and store the resulting correlation\n         * factor.  Note that we must watch for a difference of\n         * zero, meaning a perfect match.  Also, for increased\n         * precision using integer math, we scale the sum.\n         */\n\n        cnxt->results [period] = diff ? (sum * scaler) / diff : MAX_CORR;\n\n        if (cnxt->results [period] >= best_factor) {    /* check if best yet */\n            best_factor = cnxt->results [period];\n            best_period = period;\n        }\n\n        /* see if we're done */\n\n        if (period * cnxt->num_chans * 2 == cnxt->longest)\n            break;\n\n        /* update accumulating sum and current period */\n\n        sum += abs32 (cnxt->calcbuff [period * 2]) + abs32 (cnxt->calcbuff [period * 2 + 1]);\n        period++;\n    }\n\n    if (best_period * cnxt->num_chans * 2 != cnxt->shortest && best_period * cnxt->num_chans * 2 != cnxt->longest) {\n        uint32_t high_side_diff = cnxt->results [best_period] - cnxt->results [best_period+1];\n        uint32_t low_side_diff = cnxt->results [best_period] - cnxt->results [best_period-1];\n\n        if ((low_side_diff + 1) / 2 > high_side_diff)\n            best_period = best_period * 2 + 1;\n        else if ((high_side_diff + 1) / 2 > low_side_diff)\n            best_period = best_period * 2 - 1;\n        else\n            best_period *= 2;\n    }\n    else\n        best_period *= 2;           /* shortest or longest use as is */\n\n    return best_period * cnxt->num_chans;\n}\n\n/*\n * To combine the two periods into one, each corresponding pair of samples\n * are averaged with a linearly sliding scale.  At the beginning of the period\n * the first sample dominates, and at the end the second sample dominates.  In\n * this way the resulting block blends with the previous and next blocks.\n *\n * The signed values are offset to unsigned for the calculation and then offset\n * back to signed.  This is done to avoid the compression around zero that occurs\n * with calculations of this type on C implementations that round division toward\n * zero.\n *\n * The maximum period handled here without overflow possibility is 65535 samples.\n * This corresponds to a maximum calculated period of 16383 samples (2x for stereo\n * and 2x for the \"2.0\" version of the stretch algorithm). Since the maximum\n * calculated period is currently set for 2400 samples, we have plenty of margin.\n */\n\nstatic void merge_blocks (int16_t *output, int16_t *input1, int16_t *input2, int samples)\n{\n    int i;\n\n    for (i = 0; i < samples; ++i)\n        output [i] = (int32_t)(((uint32_t)(input1 [i] + MERGE_OFFSET) * (samples - i) +\n            (uint32_t)(input2 [i] + MERGE_OFFSET) * i) / samples) - MERGE_OFFSET;\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/audio-stretch/stretch.h",
    "content": "////////////////////////////////////////////////////////////////////////////\n//                        **** AUDIO-STRETCH ****                         //\n//                      Time Domain Harmonic Scaler                       //\n//                    Copyright (c) 2022 David Bryant                     //\n//                          All Rights Reserved.                          //\n//      Distributed under the BSD Software License (see license.txt)      //\n////////////////////////////////////////////////////////////////////////////\n\n// stretch.h\n\n// Time Domain Harmonic Compression and Expansion\n//\n// This library performs time domain harmonic scaling with pitch detection\n// to stretch the timing of a 16-bit PCM signal (either mono or stereo) from\n// 1/2 to 2 times its original length. This is done without altering any of\n// its tonal characteristics.\n//\n// Use stereo (num_chans = 2), when both channels are from same source\n// and should contain approximately similar content.\n// For independent channels, prefer using multiple StretchHandle-instances.\n// see https://github.com/dbry/audio-stretch/issues/6\n\n#ifndef STRETCH_H\n#define STRETCH_H\n\n#include <stdint.h>\n\n#define STRETCH_FAST_FLAG    0x1    // use \"fast\" version of period determination code\n#define STRETCH_DUAL_FLAG    0x2    // cascade two instances (doubles usable ratio range)\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\ntypedef void *StretchHandle;\n\nStretchHandle stretch_init (int shortest_period, int longest_period, int num_chans, int flags);\nint stretch_output_capacity (StretchHandle handle, int max_num_samples, float max_ratio);\nint stretch_samples (StretchHandle handle, const int16_t *samples, int num_samples, int16_t *output, float ratio);\nint stretch_flush (StretchHandle handle, int16_t *output);\nvoid stretch_reset (StretchHandle handle);\nvoid stretch_deinit (StretchHandle handle);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/base64/base64.h",
    "content": "/*\n   base64.h\n\n   base64 encoding and decoding with C++.\n   More information at\n     https://renenyffenegger.ch/notes/development/Base64/Encoding-and-decoding-base-64-with-cpp\n\n   Version: 2.rc.09 (release candidate)\n\n   Copyright (C) 2004-2017, 2020-2022 René Nyffenegger\n\n   This source code is provided 'as-is', without any express or implied\n   warranty. In no event will the author be held liable for any damages\n   arising from the use of this software.\n\n   Permission is granted to anyone to use this software for any purpose,\n   including commercial applications, and to alter it and redistribute it\n   freely, subject to the following restrictions:\n\n   1. The origin of this source code must not be misrepresented; you must not\n      claim that you wrote the original source code. If you use this source code\n      in a product, an acknowledgment in the product documentation would be\n      appreciated but is not required.\n\n   2. Altered source versions must be plainly marked as such, and must not be\n      misrepresented as being the original source code.\n\n   3. This notice may not be removed or altered from any source distribution.\n\n   René Nyffenegger rene.nyffenegger@adp-gmbh.ch\n*/\n/**\n * Copyright (C) 2023 Kevin Heifner\n *\n * Modified to be header only.\n * Templated for std::string, std::string_view, std::vector<char> and other char containers.\n */\n\n#pragma once\n\n#include <algorithm>\n#include <string>\n#include <string_view>\n#include <stdexcept>\n\n// Interface:\n// Defaults allow for use:\n//   std::string s = \"foobar\";\n//   std::string encoded = base64_encode(s);\n//   std::string_view sv = \"foobar\";\n//   std::string encoded = base64_encode(sv);\n//   std::vector<char> vc = {'f', 'o', 'o'};\n//   std::string encoded = base64_encode(vc);\n//\n// Also allows for user provided char containers and specified return types:\n//   std::string s = \"foobar\";\n//   std::vector<char> encoded = base64_encode<std::vector<char>>(s);\n\ntemplate <typename RetString = std::string, typename String = std::string>\nRetString base64_encode(const String& s, bool url = false);\n\ntemplate <typename RetString = std::string, typename String = std::string>\nRetString base64_encode_pem(const String& s);\n\ntemplate <typename RetString = std::string, typename String = std::string>\nRetString base64_encode_mime(const String& s);\n\ntemplate <typename RetString = std::string, typename String = std::string>\nRetString base64_decode(const String& s, bool remove_linebreaks = false);\n\ntemplate <typename RetString = std::string>\nRetString base64_encode(const unsigned char* s, size_t len, bool url = false);\n\nnamespace detail {\n //\n // Depending on the url parameter in base64_chars, one of\n // two sets of base64 characters needs to be chosen.\n // They differ in their last two characters.\n //\nconstexpr const char* to_base64_chars[2] = {\n             \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n             \"abcdefghijklmnopqrstuvwxyz\"\n             \"0123456789\"\n             \"+/\",\n\n             \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n             \"abcdefghijklmnopqrstuvwxyz\"\n             \"0123456789\"\n             \"-_\"};\n\nconstexpr unsigned char from_base64_chars[256] = {\n    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,\n    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,\n    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 62, 64, 63,\n    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,\n    64,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,\n    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 63,\n    64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,\n    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,\n    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,\n    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,\n    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,\n    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,\n    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,\n    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,\n    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,\n    64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64\n};\n\ninline unsigned int pos_of_char(const unsigned char chr) {\n   //\n   // Return the position of chr within base64_encode()\n   //\n\n   if (from_base64_chars[chr] != 64) return from_base64_chars[chr];\n\n   //\n   // 2020-10-23: Throw std::exception rather than const char*\n   //(Pablo Martin-Gomez, https://github.com/Bouska)\n   //\n   throw std::runtime_error(\"Input is not valid base64-encoded data.\");\n}\n\ntemplate <typename RetString, typename String>\ninline RetString insert_linebreaks(const String& str, size_t distance) {\n   //\n   // Provided by https://github.com/JomaCorpFX, adapted by Rene & Kevin\n   //\n   if (!str.size()) {\n      return RetString{};\n   }\n\n   if (distance < str.size()) {\n      size_t pos = distance;\n      String s{str};\n      while (pos < s.size()) {\n         s.insert(pos, \"\\n\");\n         pos += distance + 1;\n      }\n      return s;\n   } else {\n      return str;\n   }\n}\n\ntemplate <typename RetString, typename String, unsigned int line_length>\ninline RetString encode_with_line_breaks(String s) {\n   return insert_linebreaks<RetString, String>(base64_encode(s, false), line_length);\n}\n\ntemplate <typename RetString, typename String>\ninline RetString encode_pem(String s) {\n   return encode_with_line_breaks<RetString, String, 64>(s);\n}\n\ntemplate <typename RetString, typename String>\ninline RetString encode_mime(String s) {\n   return encode_with_line_breaks<RetString, String, 76>(s);\n}\n\ntemplate <typename RetString, typename String>\ninline RetString encode(String s, bool url) {\n   return base64_encode<RetString>(reinterpret_cast<const unsigned char*>(s.data()), s.size(), url);\n}\n\n} // namespace detail\n\ntemplate <typename RetString>\ninline RetString base64_encode(const unsigned char* bytes_to_encode, size_t in_len, bool url) {\n   size_t len_encoded = (in_len + 2) / 3 * 4;\n\n   unsigned char trailing_char = url ? '.' : '=';\n\n   //\n   // Choose set of base64 characters. They differ\n   // for the last two positions, depending on the url\n   // parameter.\n   // A bool (as is the parameter url) is guaranteed\n   // to evaluate to either 0 or 1 in C++ therefore,\n   // the correct character set is chosen by subscripting\n   // base64_chars with url.\n   //\n   const char *base64_chars_ = detail::to_base64_chars[url];\n\n   RetString ret;\n   ret.reserve(len_encoded);\n\n   unsigned int pos = 0;\n\n   while (pos < in_len) {\n      ret.push_back(base64_chars_[(bytes_to_encode[pos + 0] & 0xfc) >> 2]);\n\n      if (pos + 1 < in_len) {\n         ret.push_back(base64_chars_[((bytes_to_encode[pos + 0] & 0x03) << 4) +\n                                     ((bytes_to_encode[pos + 1] & 0xf0) >> 4)]);\n\n         if (pos + 2 < in_len) {\n            ret.push_back(base64_chars_[((bytes_to_encode[pos + 1] & 0x0f) << 2) +\n                                        ((bytes_to_encode[pos + 2] & 0xc0) >> 6)]);\n            ret.push_back(base64_chars_[bytes_to_encode[pos + 2] & 0x3f]);\n         } else {\n            ret.push_back(base64_chars_[(bytes_to_encode[pos + 1] & 0x0f) << 2]);\n            ret.push_back(trailing_char);\n         }\n      } else {\n         ret.push_back(base64_chars_[(bytes_to_encode[pos + 0] & 0x03) << 4]);\n         ret.push_back(trailing_char);\n         ret.push_back(trailing_char);\n      }\n\n      pos += 3;\n   }\n\n   return ret;\n}\n\nnamespace detail {\n\ntemplate <typename RetString, typename String>\ninline RetString decode(const String& encoded_string, bool remove_linebreaks) {\n    static_assert(!std::is_same<RetString, std::string_view>::value,\n                  \"RetString should not be std::string_view\");\n\n   //\n   // decode(…) is templated so that it can be used with String = const std::string&\n   // or std::string_view (requires at least C++17)\n   //\n\n   if (encoded_string.empty())\n      return RetString{};\n\n   if (remove_linebreaks) {\n      String copy{encoded_string};\n\n      copy.erase(std::remove(copy.begin(), copy.end(), '\\n'), copy.end());\n\n      return base64_decode<RetString, String>(copy, false);\n   }\n\n   size_t length_of_string = encoded_string.size();\n   size_t pos = 0;\n\n   //\n   // The approximate length (bytes) of the decoded string might be one or\n   // two bytes smaller, depending on the amount of trailing equal signs\n   // in the encoded string. This approximation is needed to reserve\n   // enough space in the string to be returned.\n   //\n   size_t approx_length_of_decoded_string = length_of_string / 4 * 3;\n   RetString ret;\n   ret.reserve(approx_length_of_decoded_string);\n\n   while (pos < length_of_string) {\n      //\n      // Iterate over encoded input string in chunks. The size of all\n      // chunks except the last one is 4 bytes.\n      //\n      // The last chunk might be padded with equal signs or dots\n      // in order to make it 4 bytes in size as well, but this\n      // is not required as per RFC 2045.\n      //\n      // All chunks except the last one produce three output bytes.\n      //\n      // The last chunk produces at least one and up to three bytes.\n      //\n\n      size_t pos_of_char_1 = pos_of_char(encoded_string.at(pos + 1));\n\n      //\n      // Emit the first output byte that is produced in each chunk:\n      //\n      ret.push_back(static_cast<typename RetString::value_type>(((pos_of_char(encoded_string.at(pos + 0))) << 2) + ((pos_of_char_1 & 0x30) >> 4)));\n\n      if ((pos + 2 < length_of_string) &&\n          // Check for data that is not padded with equal signs (which is allowed by RFC 2045)\n          encoded_string.at(pos + 2) != '=' &&\n          encoded_string.at(pos + 2) != '.' ) {     // accept URL-safe base 64 strings, too, so check for '.' also.\n         //\n         // Emit a chunk's second byte (which might not be produced in the last chunk).\n         //\n         unsigned int pos_of_char_2 = pos_of_char(encoded_string.at(pos + 2));\n         ret.push_back(static_cast<typename RetString::value_type>(((pos_of_char_1 & 0x0f) << 4) + ((pos_of_char_2 & 0x3c) >> 2)));\n\n         if ((pos + 3 < length_of_string) &&\n             encoded_string.at(pos + 3) != '=' &&\n             encoded_string.at(pos + 3) != '.' ) {\n            //\n            // Emit a chunk's third byte (which might not be produced in the last chunk).\n            //\n            ret.push_back(static_cast<typename RetString::value_type>(((pos_of_char_2 & 0x03) << 6) + pos_of_char(encoded_string.at(pos + 3))));\n         }\n      }\n\n      pos += 4;\n   }\n\n   return ret;\n}\n\n} // namespace detail\n\ntemplate <typename RetString, typename String>\ninline RetString base64_decode(const String& s, bool remove_linebreaks) {\n   return detail::decode<RetString, String>(s, remove_linebreaks);\n}\n\ntemplate <typename RetString, typename String>\ninline RetString base64_encode(const String& s, bool url) {\n   return detail::encode<RetString, String>(s, url);\n}\n\ntemplate <typename RetString, typename String>\ninline RetString base64_encode_pem (const String& s) {\n   return detail::encode_pem<RetString, String>(s);\n}\n\ntemplate <typename RetString, typename String>\ninline RetString base64_encode_mime(const String& s) {\n   return detail::encode_mime<RetString, String>(s);\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/decoding/IncrementalAudioDecoder.h",
    "content": "#pragma once\n#include <cstddef>\n#include <string>\n#include <audioapi/utils/Macros.h>\n\nnamespace audioapi::decoding {\n/**\n * Incremental PCM decoder: openFile or openMemory → readPcmFrames in a loop → close.\n * Shared contract for FFmpeg-based and MiniAudio-based implementations.\n */\nclass IIncrementalAudioDecoder {\n public:\n  static constexpr size_t CHUNK_SIZE = 4096;\n  IIncrementalAudioDecoder() = default;\n  virtual ~IIncrementalAudioDecoder() = default;\n  DELETE_COPY_AND_MOVE(IIncrementalAudioDecoder);\n\n  /// @brief Opens a file for decoding.\n  /// @param outputSampleRate The output sample rate.\n  /// @param path The path to the file.\n  /// @return True if the file was opened successfully, false otherwise.\n  [[nodiscard]] virtual bool openFile(\n      int outputSampleRate,\n      const std::string &path) = 0;\n\n  /// @brief Opens a memory block for decoding.\n  /// @param outputSampleRate The output sample rate.\n  /// @param data The data to decode.\n  /// @param size The size of the data.\n  /// @return True if the memory block was opened successfully, false otherwise.\n  [[nodiscard]] virtual bool openMemory(\n      int outputSampleRate,\n      const void *data,\n      size_t size) = 0;\n\n  /// @brief Reads PCM frames from the decoder.\n  /// @param outInterleaved The output buffer for the decoded frames.\n  /// @param frameCount The number of frames to read.\n  /// @return The number of frames read.\n  [[nodiscard]] virtual size_t readPcmFrames(float *outInterleaved, size_t frameCount) = 0;\n\n  /// @brief Closes the decoder.\n  virtual void close() = 0;\n\n  /// @brief Checks if the decoder is open.\n  /// @return True if the decoder is open, false otherwise.\n  [[nodiscard]] virtual bool isOpen() const = 0;\n\n  /// @brief Gets the number of output channels.\n  /// @return The number of output channels.\n  [[nodiscard]] virtual int outputChannels() const = 0;\n\n  /// @brief Gets the output sample rate.\n  /// @return The output sample rate.\n  [[nodiscard]] virtual int outputSampleRate() const = 0;\n\n  /// @brief Gets the duration of the audio in seconds.\n  /// @return The duration of the audio in seconds.\n  [[nodiscard]] virtual float getDurationInSeconds() const = 0;\n\n  /// @brief Gets the current position of the audio in seconds.\n  /// @return The current position of the audio in seconds.\n  [[nodiscard]] virtual float getCurrentPositionInSeconds() const = 0;\n\n  /// @brief Seeks to a specific time in the audio.\n  /// @param seconds The time to seek to in seconds.\n  /// @return True if the seek was successful, false otherwise.\n  [[nodiscard]] virtual bool seekToTime(double seconds) = 0;\n};\n} // namespace audioapi::decoding\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp",
    "content": "/*\n * This file dynamically links to the FFmpeg library, which is licensed under\n * the GNU Lesser General Public License (LGPL) version 2.1 or later.\n *\n * Our own code in this file is licensed under the MIT License and dynamic\n * linking allows you to use this code without your entire project being subject\n * to the terms of the LGPL. However, note that if you link statically to\n * FFmpeg, you must comply with the terms of the LGPL for FFmpeg itself.\n */\n\n#include <audioapi/libs/ffmpeg/FFmpegDecoding.h>\n#if !RN_AUDIO_API_FFMPEG_DISABLED\n\n#include <algorithm>\n#include <cmath>\n#include <cstring>\n\nextern \"C\" {\n#include <libavutil/avutil.h>\n#include <libavutil/channel_layout.h>\n#include <libavutil/mathematics.h>\n#include <libavutil/rational.h>\n}\n\nnamespace audioapi::ffmpegdecoder {\n\nint read_packet(void *opaque, uint8_t *buf, int buf_size) {\n  auto *ctx = static_cast<MemoryIOContext *>(opaque);\n  if (ctx->pos >= ctx->size) {\n    return AVERROR_EOF;\n  }\n  int n = std::min(buf_size, static_cast<int>(ctx->size - ctx->pos));\n  memcpy(buf, ctx->data + ctx->pos, n);\n  ctx->pos += static_cast<size_t>(n);\n  return n;\n}\n\nint64_t seek_packet(void *opaque, int64_t offset, int whence) {\n  auto *ctx = static_cast<MemoryIOContext *>(opaque);\n  switch (whence) {\n    case SEEK_SET:\n      ctx->pos = static_cast<size_t>(offset);\n      break;\n    case SEEK_CUR:\n      ctx->pos += static_cast<size_t>(offset);\n      break;\n    case SEEK_END:\n      ctx->pos = ctx->size + static_cast<size_t>(offset);\n      break;\n    case AVSEEK_SIZE:\n      return static_cast<int64_t>(ctx->size);\n    default:\n      return AVERROR(EINVAL);\n  }\n  ctx->pos = std::min(ctx->pos, ctx->size);\n  return static_cast<int64_t>(ctx->pos);\n}\n\nint findAudioStreamIndex(AVFormatContext *fmt_ctx) {\n  for (unsigned i = 0; i < fmt_ctx->nb_streams; i++) {\n    if (fmt_ctx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {\n      return static_cast<int>(i);\n    }\n  }\n  return -1;\n}\n\nbool openCodec(AVFormatContext *fmt_ctx, int &audio_stream_index, AVCodecContext **out_codec) {\n  audio_stream_index = findAudioStreamIndex(fmt_ctx);\n  if (audio_stream_index < 0) {\n    return false;\n  }\n  AVCodecParameters *codecpar = fmt_ctx->streams[audio_stream_index]->codecpar;\n  const AVCodec *codec = avcodec_find_decoder(codecpar->codec_id);\n  if (codec == nullptr) {\n    return false;\n  }\n  AVCodecContext *ctx = avcodec_alloc_context3(codec);\n  if (ctx == nullptr) {\n    return false;\n  }\n  if (avcodec_parameters_to_context(ctx, codecpar) < 0) {\n    avcodec_free_context(&ctx);\n    return false;\n  }\n  if (avcodec_open2(ctx, codec, nullptr) < 0) {\n    avcodec_free_context(&ctx);\n    return false;\n  }\n  *out_codec = ctx;\n  return true;\n}\n\nFFmpegDecoder::~FFmpegDecoder() {\n  close();\n}\n\nvoid FFmpegDecoder::close() {\n  if (resampled_data_ != nullptr) {\n    av_freep(&resampled_data_[0]);\n    av_freep(&resampled_data_);\n  }\n  max_resampled_samples_ = 0;\n  if (swr_ != nullptr) {\n    swr_free(&swr_);\n  }\n  if (packet_ != nullptr) {\n    av_packet_free(&packet_);\n  }\n  if (frame_ != nullptr) {\n    av_frame_free(&frame_);\n  }\n  if (codec_ctx_ != nullptr) {\n    avcodec_free_context(&codec_ctx_);\n  }\n  if (fmt_ctx_ != nullptr) {\n    avformat_close_input(&fmt_ctx_);\n  }\n  if (avio_ctx_ != nullptr) {\n    avio_context_free(&avio_ctx_);\n  }\n  mem_io_.reset();\n  leftover_.clear();\n  leftover_offset_ = 0;\n  audio_stream_index_ = -1;\n  output_channels_ = 0;\n  output_sample_rate_ = 0;\n  total_output_frames_ = 0;\n}\n\nbool FFmpegDecoder::setupSwr() {\n  swr_ = swr_alloc();\n  if (swr_ == nullptr) {\n    return false;\n  }\n  av_opt_set_chlayout(swr_, \"in_chlayout\", &codec_ctx_->ch_layout, 0);\n  av_opt_set_int(swr_, \"in_sample_rate\", codec_ctx_->sample_rate, 0);\n  av_opt_set_sample_fmt(swr_, \"in_sample_fmt\", codec_ctx_->sample_fmt, 0);\n\n  AVChannelLayout out_layout;\n  av_channel_layout_default(&out_layout, output_channels_);\n  av_opt_set_chlayout(swr_, \"out_chlayout\", &out_layout, 0);\n  av_opt_set_int(swr_, \"out_sample_rate\", output_sample_rate_, 0);\n  av_opt_set_sample_fmt(swr_, \"out_sample_fmt\", AV_SAMPLE_FMT_FLT, 0);\n  if (swr_init(swr_) < 0) {\n    av_channel_layout_uninit(&out_layout);\n    return false;\n  }\n  av_channel_layout_uninit(&out_layout);\n\n    if (av_samples_alloc_array_and_samples(\n          &resampled_data_,\n          nullptr,\n          output_channels_,\n          decoding::IIncrementalAudioDecoder::CHUNK_SIZE,\n          AV_SAMPLE_FMT_FLT,\n          0) < 0) {\n    return false;\n  }\n  max_resampled_samples_ = static_cast<int>(decoding::IIncrementalAudioDecoder::CHUNK_SIZE);\n  return true;\n}\n\nbool FFmpegDecoder::openFile(int outputSampleRate, const std::string &path) {\n  close();\n  if (path.empty()) {\n    return false;\n  }\n  if (avformat_open_input(&fmt_ctx_, path.c_str(), nullptr, nullptr) < 0) {\n    fmt_ctx_ = nullptr;\n    return false;\n  }\n  if (avformat_find_stream_info(fmt_ctx_, nullptr) < 0) {\n    avformat_close_input(&fmt_ctx_);\n    fmt_ctx_ = nullptr;\n    return false;\n  }\n  if (!openCodec(fmt_ctx_, audio_stream_index_, &codec_ctx_)) {\n    avformat_close_input(&fmt_ctx_);\n    fmt_ctx_ = nullptr;\n    return false;\n  }\n  output_channels_ = codec_ctx_->ch_layout.nb_channels;\n  output_sample_rate_ =\n      (outputSampleRate > 0) ? outputSampleRate : codec_ctx_->sample_rate;\n\n  packet_ = av_packet_alloc();\n  frame_ = av_frame_alloc();\n  if (packet_ == nullptr || frame_ == nullptr || !setupSwr()) {\n    close();\n    return false;\n  }\n  total_output_frames_ = 0;\n  return true;\n}\n\nbool FFmpegDecoder::openMemory(\n    int outputSampleRate,\n    const void *data,\n    size_t size) {\n  close();\n  if (data == nullptr || size == 0) {\n    return false;\n  }\n  mem_io_ = std::make_unique<MemoryIOContext>();\n  mem_io_->data = static_cast<const uint8_t *>(data);\n  mem_io_->size = size;\n  mem_io_->pos = 0;\n\n  auto* io_buf =\n      static_cast<uint8_t *>(av_malloc(decoding::IIncrementalAudioDecoder::CHUNK_SIZE));\n  if (io_buf == nullptr) {\n    close();\n    return false;\n  }\n  avio_ctx_ = avio_alloc_context(\n    io_buf,\n    static_cast<int>(decoding::IIncrementalAudioDecoder::CHUNK_SIZE),\n    0,\n    mem_io_.get(),\n    read_packet,\n    nullptr,\n    seek_packet);\n  if (avio_ctx_ == nullptr) {\n    av_free(io_buf);\n    mem_io_.reset();\n    return false;\n  }\n\n  fmt_ctx_ = avformat_alloc_context();\n  if (fmt_ctx_ == nullptr) {\n    close();\n    return false;\n  }\n  fmt_ctx_->pb = avio_ctx_;\n\n  if (avformat_open_input(&fmt_ctx_, nullptr, nullptr, nullptr) < 0) {\n    close();\n    return false;\n  }\n  if (avformat_find_stream_info(fmt_ctx_, nullptr) < 0) {\n    close();\n    return false;\n  }\n  if (!openCodec(fmt_ctx_, audio_stream_index_, &codec_ctx_)) {\n    close();\n    return false;\n  }\n  output_channels_ = codec_ctx_->ch_layout.nb_channels;\n  output_sample_rate_ =\n      (outputSampleRate > 0) ? outputSampleRate : codec_ctx_->sample_rate;\n\n  packet_ = av_packet_alloc();\n  frame_ = av_frame_alloc();\n  if (packet_ == nullptr || frame_ == nullptr || !setupSwr()) {\n    close();\n    return false;\n  }\n  total_output_frames_ = 0;\n  return true;\n}\n\nvoid FFmpegDecoder::appendFrameResampled(AVFrame *frame) {\n  int out_samples = swr_get_out_samples(swr_, frame->nb_samples);\n  if (out_samples > max_resampled_samples_) {\n    av_freep(&resampled_data_[0]);\n    av_freep(&resampled_data_);\n    max_resampled_samples_ = out_samples;\n    if (av_samples_alloc_array_and_samples(\n            &resampled_data_,\n            nullptr,\n            output_channels_,\n            max_resampled_samples_,\n            AV_SAMPLE_FMT_FLT,\n            0) < 0) {\n      return;\n    }\n  }\n  int converted = swr_convert(\n      swr_,\n      resampled_data_,\n      max_resampled_samples_,\n      const_cast<const uint8_t **>(frame->data),\n      frame->nb_samples);\n  if (converted > 0) {\n    size_t n = static_cast<size_t>(converted) * static_cast<size_t>(output_channels_);\n    const float *src = reinterpret_cast<float *>(resampled_data_[0]);\n    leftover_.insert(leftover_.end(), src, src + n);\n  }\n}\n\nbool FFmpegDecoder::feedPipeline() {\n  for (;;) {\n    int r = avcodec_receive_frame(codec_ctx_, frame_);\n    if (r == 0) {\n      appendFrameResampled(frame_);\n      return true;\n    }\n    if (r == AVERROR_EOF) {\n      return !leftover_.empty();\n    }\n    if (r != AVERROR(EAGAIN)) {\n      return false;\n    }\n\n    r = av_read_frame(fmt_ctx_, packet_);\n    if (r == AVERROR_EOF) {\n      if (avcodec_send_packet(codec_ctx_, nullptr) < 0) {\n        return false;\n      }\n      continue;\n    }\n    if (r < 0) {\n      return false;\n    }\n    if (packet_->stream_index != audio_stream_index_) {\n      av_packet_unref(packet_);\n      continue;\n    }\n    r = avcodec_send_packet(codec_ctx_, packet_);\n    av_packet_unref(packet_);\n    if (r < 0) {\n      return false;\n    }\n  }\n}\n\nfloat FFmpegDecoder::getDurationInSeconds() const {\n  if (!isOpen() || fmt_ctx_ == nullptr || audio_stream_index_ < 0) {\n    return 0;\n  }\n  AVStream *st = fmt_ctx_->streams[audio_stream_index_];\n  if (st == nullptr) {\n    return 0;\n  }\n\n  auto validSeconds = [](double s) -> bool { return s > 0 && std::isfinite(s); };\n\n  // Prefer per-stream duration (e.g. MP4 mdhd) — often exact vs container-level\n  // guesses that trigger AAC “bitrate duration” warnings.\n  if (st->duration != AV_NOPTS_VALUE && st->duration > 0) {\n    double t = static_cast<double>(st->duration) * av_q2d(st->time_base);\n    if (validSeconds(t)) {\n      return static_cast<float>(t);\n    }\n  }\n\n  if (fmt_ctx_->duration != AV_NOPTS_VALUE && fmt_ctx_->duration >= 0) {\n    double t = static_cast<double>(fmt_ctx_->duration) / static_cast<double>(AV_TIME_BASE);\n    if (validSeconds(t)) {\n      return static_cast<float>(t);\n    }\n  }\n\n  return 0;\n}\n\nfloat FFmpegDecoder::getCurrentPositionInSeconds() const {\n  if (!isOpen() || output_sample_rate_ <= 0) {\n    return 0;\n  }\n  return static_cast<float>(total_output_frames_) / static_cast<float>(output_sample_rate_);\n}\n\n// todo: offload this call to a separate thread because seeking decoder can take a while\n// current implementation suspends audio thread, which disable multiple playbacks\nbool FFmpegDecoder::seekToTime(double seconds) {\n  if (!isOpen() || audio_stream_index_ < 0 || output_sample_rate_ <= 0) {\n    return false;\n  }\n  float dur = getDurationInSeconds();\n  if (dur > 0 && std::isfinite(dur)) {\n    seconds = std::clamp(seconds, 0.0, static_cast<double>(dur));\n  } else {\n    seconds = std::max(0.0, seconds);\n    if (!std::isfinite(seconds)) {\n      return false;\n    }\n  }\n\n  auto ts = static_cast<int64_t>(seconds * static_cast<double>(AV_TIME_BASE));\n  if (avformat_seek_file(fmt_ctx_, -1, INT64_MIN, ts, INT64_MAX, 0) < 0) {\n    return false;\n  }\n  avcodec_flush_buffers(codec_ctx_);\n  leftover_.clear();\n  leftover_offset_ = 0;\n  total_output_frames_ = static_cast<size_t>(\n      std::llround(seconds * static_cast<double>(output_sample_rate_)));\n  return true;\n}\n\nsize_t FFmpegDecoder::readPcmFrames(float *outInterleaved, size_t frameCount) {\n  if (!isOpen() || outInterleaved == nullptr || frameCount == 0 || output_channels_ <= 0) {\n    return 0;\n  }\n  size_t delivered = 0;\n  const auto ch = static_cast<size_t>(output_channels_);\n\n  while (delivered < frameCount) {\n    size_t need = frameCount - delivered;\n    size_t available_samples = leftover_.size() > leftover_offset_\n        ? leftover_.size() - leftover_offset_\n        : 0;\n    size_t leftover_frames = available_samples / ch;\n    if (leftover_frames > 0) {\n      size_t take = std::min(need, leftover_frames);\n      size_t samples = take * ch;\n      memcpy(\n          outInterleaved + delivered * ch,\n          leftover_.data() + leftover_offset_,\n          samples * sizeof(float));\n      leftover_offset_ += samples;\n      if (leftover_offset_ >= leftover_.size()) {\n        leftover_.clear();\n        leftover_offset_ = 0;\n      }\n      delivered += take;\n    } else if (!feedPipeline()) {\n      break;\n    }\n  }\n  total_output_frames_ += delivered;\n  return delivered;\n}\n\nstatic std::shared_ptr<AudioBuffer> buildAudioBufferFromInterleaved(\n    std::vector<float> &interleaved,\n    int channels,\n    int sample_rate) {\n  if (interleaved.empty() || channels <= 0) {\n    return nullptr;\n  }\n  size_t frames = interleaved.size() / static_cast<size_t>(channels);\n  auto buf = std::make_shared<AudioBuffer>(frames, channels, static_cast<float>(sample_rate));\n  buf->deinterleaveFrom(interleaved.data(), frames);\n  return buf;\n}\n\nstd::shared_ptr<AudioBuffer> decodeWithFilePath(const std::string &path, int sample_rate) {\n  FFmpegDecoder dec;\n  if (!dec.openFile(sample_rate, path)) {\n    return nullptr;\n  }\n  std::vector<float> acc;\n  std::vector<float> tmp(\n      decoding::IIncrementalAudioDecoder::CHUNK_SIZE *\n      static_cast<size_t>(std::max(1, dec.outputChannels())));\n  while (true) {\n    size_t n = dec.readPcmFrames(tmp.data(), decoding::IIncrementalAudioDecoder::CHUNK_SIZE);\n    if (n == 0) {\n      break;\n    }\n    acc.insert(\n        acc.end(),\n        tmp.begin(),\n        tmp.begin() + static_cast<ptrdiff_t>(n * static_cast<size_t>(dec.outputChannels())));\n  }\n  return buildAudioBufferFromInterleaved(acc, dec.outputChannels(), dec.outputSampleRate());\n}\n\nstd::shared_ptr<AudioBuffer> decodeWithMemoryBlock(const void *data, size_t size, int sample_rate) {\n  FFmpegDecoder dec;\n  if (!dec.openMemory(sample_rate, data, size)) {\n    return nullptr;\n  }\n  std::vector<float> acc;\n  std::vector<float> tmp(\n      decoding::IIncrementalAudioDecoder::CHUNK_SIZE *\n      static_cast<size_t>(std::max(1, dec.outputChannels())));\n  while (true) {\n    size_t n = dec.readPcmFrames(tmp.data(), decoding::IIncrementalAudioDecoder::CHUNK_SIZE);\n    if (n == 0) {\n      break;\n    }\n    acc.insert(\n        acc.end(),\n        tmp.begin(),\n        tmp.begin() + static_cast<ptrdiff_t>(n * static_cast<size_t>(dec.outputChannels())));\n  }\n  return buildAudioBufferFromInterleaved(acc, dec.outputChannels(), dec.outputSampleRate());\n}\n\n} // namespace audioapi::ffmpegdecoder\n\n#else\n\nnamespace audioapi::ffmpegdecoder {\nFFmpegDecoder::~FFmpegDecoder() = default;\nvoid FFmpegDecoder::close() {}\nbool FFmpegDecoder::openFile(int, const std::string &) {\n  return false;\n}\nbool FFmpegDecoder::openMemory(int, const void *, size_t) {\n  return false;\n}\nfloat FFmpegDecoder::getDurationInSeconds() const {\n  return 0;\n}\nfloat FFmpegDecoder::getCurrentPositionInSeconds() const {\n  return 0;\n}\nbool FFmpegDecoder::seekToTime(double) {\n  return false;\n}\nsize_t FFmpegDecoder::readPcmFrames(float *, size_t) {\n  return 0;\n}\nstd::shared_ptr<AudioBuffer> decodeWithFilePath(const std::string &, int) {\n  return nullptr;\n}\nstd::shared_ptr<AudioBuffer> decodeWithMemoryBlock(const void *, size_t, int) {\n  return nullptr;\n}\n\n} // namespace audioapi::ffmpegdecoder\n\n#endif // !RN_AUDIO_API_FFMPEG_DISABLED\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.h",
    "content": "/*\n * This file dynamically links to the FFmpeg library, which is licensed under\n * the GNU Lesser General Public License (LGPL) version 2.1 or later.\n *\n * Our own code in this file is licensed under the MIT License and dynamic\n * linking allows you to use this code without your entire project being subject\n * to the terms of the LGPL. However, note that if you link statically to\n * FFmpeg, you must comply with the terms of the LGPL for FFmpeg itself.\n */\n\n#pragma once\n\n#include <audioapi/libs/decoding/IncrementalAudioDecoder.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <cstddef>\n#include <memory>\n#include <string>\n#include <vector>\n\nextern \"C\" {\n#include <libavcodec/avcodec.h>\n#include <libavformat/avformat.h>\n#include <libavutil/opt.h>\n#include <libswresample/swresample.h>\n}\n\nnamespace audioapi::ffmpegdecoder {\n\n/// Opaque IO state for openMemory (must outlive decode until close).\nstruct MemoryIOContext {\n  const uint8_t *data = nullptr;\n  size_t size = 0;\n  size_t pos = 0;\n};\n\n/**\n * FFmpeg decoder with incremental read, analogous to ma_decoder:\n *   1) openFile or openMemory\n *   2) readPcmFrames repeatedly; 0 returned = end of stream\n *   3) close when done\n */\nclass FFmpegDecoder : public decoding::IIncrementalAudioDecoder {\n public:\n  FFmpegDecoder() = default;\n  FFmpegDecoder(const FFmpegDecoder &) = delete;\n  FFmpegDecoder &operator=(const FFmpegDecoder &) = delete;\n  FFmpegDecoder(FFmpegDecoder &&other) = delete;\n  FFmpegDecoder &operator=(FFmpegDecoder &&other) = delete;\n  ~FFmpegDecoder() override;\n\n  [[nodiscard]] bool openFile(\n      int outputSampleRate,\n      const std::string &path) override;\n\n  [[nodiscard]] bool openMemory(\n      int outputSampleRate,\n      const void *data,\n      size_t size) override;\n\n  [[nodiscard]] size_t readPcmFrames(float *outInterleaved, size_t frameCount) override;\n\n  void close() override;\n\n  [[nodiscard]] bool isOpen() const override {\n    return fmt_ctx_ != nullptr && codec_ctx_ != nullptr;\n  }\n  [[nodiscard]] int outputChannels() const override { return output_channels_; }\n  [[nodiscard]] int outputSampleRate() const override { return output_sample_rate_; }\n\n  [[nodiscard]] float getDurationInSeconds() const override;\n\n  [[nodiscard]] float getCurrentPositionInSeconds() const override;\n\n  [[nodiscard]] bool seekToTime(double seconds) override;\n\n private:\n  bool setupSwr();\n  bool feedPipeline();\n  void appendFrameResampled(AVFrame *frame);\n\n  AVFormatContext *fmt_ctx_ = nullptr;\n  AVCodecContext *codec_ctx_ = nullptr;\n  SwrContext *swr_ = nullptr;\n  AVPacket *packet_ = nullptr;\n  AVFrame *frame_ = nullptr;\n\n  uint8_t **resampled_data_ = nullptr;\n  int max_resampled_samples_ = 0;\n\n  std::unique_ptr<MemoryIOContext> mem_io_;\n  AVIOContext *avio_ctx_ = nullptr;\n\n  std::vector<float> leftover_;\n  size_t leftover_offset_ = 0;\n  int audio_stream_index_ = -1;\n  int output_channels_ = 0;\n  int output_sample_rate_ = 0;\n  size_t total_output_frames_ = 0;\n};\n\nstd::shared_ptr<AudioBuffer> decodeWithMemoryBlock(const void *data, size_t size, int sample_rate);\nstd::shared_ptr<AudioBuffer> decodeWithFilePath(const std::string &path, int sample_rate);\n\n} // namespace audioapi::ffmpegdecoder\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/ffmpeg/relinking.md",
    "content": "## If you would like to relink ffmpeg to your implementation there are two options:\n\n### Option A)\n\nyou can modify script in scripts/download-prebuilt-binaries.sh\n\n- ios dynamic frameworks are in `ffmpeg_ios.zip` directory\n- android shared libraries are in `jniLibs.zip`\n\njust replace way of downloading them that links to your binaries\n\n### Option B)\n\ndirectly modify libraries in source code\n\n- ios dynamic frameworks are placed in `common/cpp/audioapi/external`\n- android shared libraries are placed in `android/src/main/jniLibs`\n\n---\n`USED_LIBRARIES`:\n- libavcodec\n- libavformat\n- libavutil\n- libswresample\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/miniaudio/MiniAudioDecoding.cpp",
    "content": "#include <audioapi/libs/miniaudio/MiniAudioDecoding.h>\n\n#include <audioapi/libs/miniaudio/decoders/libopus/miniaudio_libopus.h>\n#include <audioapi/libs/miniaudio/decoders/libvorbis/miniaudio_libvorbis.h>\n#include <audioapi/libs/miniaudio/miniaudio.h>\n\n#include <algorithm>\n#include <cmath>\n#include <cstddef>\n#include <vector>\n\nnamespace audioapi::miniaudio_decoder {\n\nnamespace {\n\nma_decoder_config makeDecoderConfig(const int outputSampleRate) {\n  const ma_uint32 outRate =\n      outputSampleRate > 0 ? static_cast<ma_uint32>(outputSampleRate) : 0;\n  ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 0, outRate);\n  static ma_decoding_backend_vtable *customBackends[] = {\n      ma_decoding_backend_libvorbis,\n      ma_decoding_backend_libopus,\n  };\n  config.ppCustomBackendVTables = customBackends;\n  config.customBackendCount =\n      sizeof(customBackends) / sizeof(customBackends[0]);\n  return config;\n}\n\n} // namespace\n\nMiniAudioDecoder::MiniAudioDecoder() = default;\n\nMiniAudioDecoder::~MiniAudioDecoder() {\n  close();\n}\n\nvoid MiniAudioDecoder::teardownDecoder() {\n  if (decoder_ != nullptr) {\n    ma_decoder_uninit(decoder_.get());\n    decoder_.reset();\n  }\n  memoryCopy_.clear();\n  outputChannels_ = 0;\n  outputSampleRate_ = 0;\n  totalOutputFrames_ = 0;\n  totalLengthFrames_ = 0;\n}\n\nvoid MiniAudioDecoder::close() {\n  teardownDecoder();\n}\n\nbool MiniAudioDecoder::isOpen() const {\n  return decoder_ != nullptr;\n}\n\nint MiniAudioDecoder::outputChannels() const {\n  return outputChannels_;\n}\n\nint MiniAudioDecoder::outputSampleRate() const {\n  return outputSampleRate_;\n}\n\nfloat MiniAudioDecoder::getDurationInSeconds() const {\n  if (!isOpen() || outputSampleRate_ <= 0 || totalLengthFrames_ == 0) {\n    return 0;\n  }\n  return static_cast<float>(static_cast<double>(totalLengthFrames_) /\n      static_cast<double>(outputSampleRate_));\n}\n\nfloat MiniAudioDecoder::getCurrentPositionInSeconds() const {\n  if (!isOpen() || outputSampleRate_ <= 0) {\n    return 0;\n  }\n  return static_cast<float>(static_cast<double>(totalOutputFrames_) /\n      static_cast<double>(outputSampleRate_));\n}\n\nbool MiniAudioDecoder::openFile(\n    int outputSampleRate,\n    const std::string &path) {\n  close();\n  if (path.empty()) {\n    return false;\n  }\n\n  ma_decoder_config config = makeDecoderConfig(outputSampleRate);\n  decoder_ = std::make_unique<ma_decoder>();\n  const ma_result result =\n      ma_decoder_init_file(path.c_str(), &config, decoder_.get());\n  if (result != MA_SUCCESS) {\n    teardownDecoder();\n    return false;\n  }\n\n  outputChannels_ = static_cast<int>(decoder_->outputChannels);\n  outputSampleRate_ = static_cast<int>(decoder_->outputSampleRate);\n\n  ma_uint64 length = 0;\n  if (ma_decoder_get_length_in_pcm_frames(decoder_.get(), &length) == MA_SUCCESS) {\n    totalLengthFrames_ = static_cast<std::uint64_t>(length);\n  } else {\n    totalLengthFrames_ = 0;\n  }\n  totalOutputFrames_ = 0;\n  return true;\n}\n\nbool MiniAudioDecoder::openMemory(\n    int outputSampleRate,\n    const void *data,\n    size_t size) {\n  close();\n  if (data == nullptr || size == 0) {\n    return false;\n  }\n  memoryCopy_.assign(\n      static_cast<const uint8_t *>(data),\n      static_cast<const uint8_t *>(data) + size);\n\n  ma_decoder_config config = makeDecoderConfig(outputSampleRate);\n  decoder_ = std::make_unique<ma_decoder>();\n  const ma_result result = ma_decoder_init_memory(\n      memoryCopy_.data(),\n      memoryCopy_.size(),\n      &config,\n      decoder_.get());\n  if (result != MA_SUCCESS) {\n    teardownDecoder();\n    return false;\n  }\n\n  outputChannels_ = static_cast<int>(decoder_->outputChannels);\n  outputSampleRate_ = static_cast<int>(decoder_->outputSampleRate);\n\n  ma_uint64 length = 0;\n  if (ma_decoder_get_length_in_pcm_frames(decoder_.get(), &length) == MA_SUCCESS) {\n    totalLengthFrames_ = static_cast<std::uint64_t>(length);\n  } else {\n    totalLengthFrames_ = 0;\n  }\n  totalOutputFrames_ = 0;\n  return true;\n}\n\nsize_t MiniAudioDecoder::readPcmFrames(float *outInterleaved, size_t frameCount) {\n  if (!isOpen() || outInterleaved == nullptr || frameCount == 0 || outputChannels_ <= 0) {\n    return 0;\n  }\n  ma_uint64 framesRead = 0;\n  ma_decoder_read_pcm_frames(\n      decoder_.get(),\n      outInterleaved,\n      static_cast<ma_uint64>(frameCount),\n      &framesRead);\n  totalOutputFrames_ += static_cast<size_t>(framesRead);\n  return static_cast<size_t>(framesRead);\n}\n\nbool MiniAudioDecoder::seekToTime(double seconds) {\n  if (!isOpen() || outputSampleRate_ <= 0) {\n    return false;\n  }\n  const float dur = getDurationInSeconds();\n  if (dur > 0 && std::isfinite(dur)) {\n    seconds = std::clamp(seconds, 0.0, static_cast<double>(dur));\n  } else {\n    seconds = std::max(0.0, seconds);\n    if (!std::isfinite(seconds)) {\n      return false;\n    }\n  }\n\n  const ma_uint64 frame =\n      static_cast<ma_uint64>(std::llround(seconds * static_cast<double>(outputSampleRate_)));\n  if (ma_decoder_seek_to_pcm_frame(decoder_.get(), frame) != MA_SUCCESS) {\n    return false;\n  }\n  totalOutputFrames_ = static_cast<size_t>(frame);\n  return true;\n}\n\nnamespace {\n\nstd::shared_ptr<AudioBuffer> buildAudioBufferFromInterleaved(\n    std::vector<float> &interleaved,\n    int channels,\n    int sample_rate) {\n  if (interleaved.empty() || channels <= 0 || sample_rate <= 0) {\n    return nullptr;\n  }\n  const size_t frames = interleaved.size() / static_cast<size_t>(channels);\n  auto buf = std::make_shared<AudioBuffer>(\n      frames, channels, static_cast<float>(sample_rate));\n  buf->deinterleaveFrom(interleaved.data(), frames);\n  return buf;\n}\n\n} // namespace\n\nstd::shared_ptr<AudioBuffer> decodeWithFilePath(const std::string &path, int sample_rate) {\n  MiniAudioDecoder dec;\n  if (!dec.openFile(sample_rate, path)) {\n    return nullptr;\n  }\n  const int ch = std::max(1, dec.outputChannels());\n  std::vector<float> acc;\n  std::vector<float> tmp(decoding::IIncrementalAudioDecoder::CHUNK_SIZE * static_cast<size_t>(ch));\n  while (true) {\n    const size_t n = dec.readPcmFrames(tmp.data(), decoding::IIncrementalAudioDecoder::CHUNK_SIZE);\n    if (n == 0) {\n      break;\n    }\n    acc.insert(\n        acc.end(),\n        tmp.begin(),\n        tmp.begin() + static_cast<std::ptrdiff_t>(n * static_cast<size_t>(ch)));\n  }\n  return buildAudioBufferFromInterleaved(acc, dec.outputChannels(), dec.outputSampleRate());\n}\n\nstd::shared_ptr<AudioBuffer> decodeWithMemoryBlock(const void *data, size_t size, int sample_rate) {\n  MiniAudioDecoder dec;\n  if (!dec.openMemory(sample_rate, data, size)) {\n    return nullptr;\n  }\n  const int ch = std::max(1, dec.outputChannels());\n  std::vector<float> acc;\n  std::vector<float> tmp(decoding::IIncrementalAudioDecoder::CHUNK_SIZE * static_cast<size_t>(ch));\n  while (true) {\n    const size_t n = dec.readPcmFrames(tmp.data(), decoding::IIncrementalAudioDecoder::CHUNK_SIZE);\n    if (n == 0) {\n      break;\n    }\n    acc.insert(\n        acc.end(),\n        tmp.begin(),\n        tmp.begin() + static_cast<std::ptrdiff_t>(n * static_cast<size_t>(ch)));\n  }\n  return buildAudioBufferFromInterleaved(acc, dec.outputChannels(), dec.outputSampleRate());\n}\n\n} // namespace audioapi::miniaudio_decoder\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/miniaudio/MiniAudioDecoding.h",
    "content": "#pragma once\n\n#include <audioapi/libs/decoding/IncrementalAudioDecoder.h>\n#include <audioapi/libs/miniaudio/miniaudio.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/Macros.h>\n\n#include <cstddef>\n#include <cstdint>\n#include <memory>\n#include <string>\n#include <vector>\n\nnamespace audioapi::miniaudio_decoder {\n\n/**\n * MiniAudio-backed incremental decoder (Vorbis/Opus/WAV, etc. via ma_decoder + custom backends).\n * Same usage contract as ffmpegdecoder::FFmpegDecoder.\n */\nclass MiniAudioDecoder : public decoding::IIncrementalAudioDecoder {\n public:\n  MiniAudioDecoder();\n  ~MiniAudioDecoder() override;\n  DELETE_COPY_AND_MOVE(MiniAudioDecoder);\n\n  [[nodiscard]] bool openFile(\n      int outputSampleRate,\n      const std::string &path) override;\n  [[nodiscard]] bool openMemory(\n      int outputSampleRate,\n      const void *data,\n      size_t size) override;\n  [[nodiscard]] size_t readPcmFrames(float *outInterleaved, size_t frameCount) override;\n  void close() override;\n  [[nodiscard]] bool isOpen() const override;\n  [[nodiscard]] int outputChannels() const override;\n  [[nodiscard]] int outputSampleRate() const override;\n  [[nodiscard]] float getDurationInSeconds() const override;\n  [[nodiscard]] float getCurrentPositionInSeconds() const override;\n  [[nodiscard]] bool seekToTime(double seconds) override;\n\n private:\n  void teardownDecoder();\n\n  std::unique_ptr<ma_decoder> decoder_;\n  std::vector<uint8_t> memoryCopy_;\n  int outputChannels_ = 0;\n  int outputSampleRate_ = 0;\n  size_t totalOutputFrames_ = 0;\n  std::uint64_t totalLengthFrames_ = 0;\n};\n\nstd::shared_ptr<AudioBuffer> decodeWithMemoryBlock(const void *data, size_t size, int sample_rate);\nstd::shared_ptr<AudioBuffer> decodeWithFilePath(const std::string &path, int sample_rate);\n\n} // namespace audioapi::miniaudio_decoder\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/miniaudio/decoders/libopus/miniaudio_libopus.c",
    "content": "#ifndef miniaudio_libopus_c\n#define miniaudio_libopus_c\n\n#include <audioapi/libs/miniaudio/decoders/libopus/miniaudio_libopus.h>\n\n#if !defined(MA_NO_LIBOPUS)\n#include <audioapi/external/include/opusfile/opusfile.h>\n#endif\n\n#include <assert.h>\n#include <string.h> /* For memset(). */\n\nstatic ma_result ma_libopus_ds_read(\n    ma_data_source *pDataSource,\n    void *pFramesOut,\n    ma_uint64 frameCount,\n    ma_uint64 *pFramesRead) {\n  return ma_libopus_read_pcm_frames(\n      (ma_libopus *)pDataSource, pFramesOut, frameCount, pFramesRead);\n}\n\nstatic ma_result ma_libopus_ds_seek(\n    ma_data_source *pDataSource,\n    ma_uint64 frameIndex) {\n  return ma_libopus_seek_to_pcm_frame((ma_libopus *)pDataSource, frameIndex);\n}\n\nstatic ma_result ma_libopus_ds_get_data_format(\n    ma_data_source *pDataSource,\n    ma_format *pFormat,\n    ma_uint32 *pChannels,\n    ma_uint32 *pSampleRate,\n    ma_channel *pChannelMap,\n    size_t channelMapCap) {\n  return ma_libopus_get_data_format(\n      (ma_libopus *)pDataSource,\n      pFormat,\n      pChannels,\n      pSampleRate,\n      pChannelMap,\n      channelMapCap);\n}\n\nstatic ma_result ma_libopus_ds_get_cursor(\n    ma_data_source *pDataSource,\n    ma_uint64 *pCursor) {\n  return ma_libopus_get_cursor_in_pcm_frames(\n      (ma_libopus *)pDataSource, pCursor);\n}\n\nstatic ma_result ma_libopus_ds_get_length(\n    ma_data_source *pDataSource,\n    ma_uint64 *pLength) {\n  return ma_libopus_get_length_in_pcm_frames(\n      (ma_libopus *)pDataSource, pLength);\n}\n\nstatic ma_data_source_vtable g_ma_libopus_ds_vtable = {\n    ma_libopus_ds_read,\n    ma_libopus_ds_seek,\n    ma_libopus_ds_get_data_format,\n    ma_libopus_ds_get_cursor,\n    ma_libopus_ds_get_length,\n    NULL, /* onSetLooping */\n    0 /* flags */\n};\n\n#if !defined(MA_NO_LIBOPUS)\nstatic int ma_libopus_of_callback__read(\n    void *pUserData,\n    unsigned char *pBufferOut,\n    int bytesToRead) {\n  ma_libopus *pOpus = (ma_libopus *)pUserData;\n  ma_result result;\n  size_t bytesRead;\n\n  result = pOpus->onRead(\n      pOpus->pReadSeekTellUserData,\n      (void *)pBufferOut,\n      bytesToRead,\n      &bytesRead);\n\n  if (result != MA_SUCCESS) {\n    return -1;\n  }\n\n  return (int)bytesRead;\n}\n\nstatic int\nma_libopus_of_callback__seek(void *pUserData, ogg_int64_t offset, int whence) {\n  ma_libopus *pOpus = (ma_libopus *)pUserData;\n  ma_result result;\n  ma_seek_origin origin;\n\n  if (whence == SEEK_SET) {\n    origin = ma_seek_origin_start;\n  } else if (whence == SEEK_END) {\n    origin = ma_seek_origin_end;\n  } else {\n    origin = ma_seek_origin_current;\n  }\n\n  result = pOpus->onSeek(pOpus->pReadSeekTellUserData, offset, origin);\n  if (result != MA_SUCCESS) {\n    return -1;\n  }\n\n  return 0;\n}\n\nstatic opus_int64 ma_libopus_of_callback__tell(void *pUserData) {\n  ma_libopus *pOpus = (ma_libopus *)pUserData;\n  ma_result result;\n  ma_int64 cursor;\n\n  if (pOpus->onTell == NULL) {\n    return -1;\n  }\n\n  result = pOpus->onTell(pOpus->pReadSeekTellUserData, &cursor);\n  if (result != MA_SUCCESS) {\n    return -1;\n  }\n\n  return cursor;\n}\n#endif\n\nstatic ma_result ma_libopus_init_internal(\n    const ma_decoding_backend_config *pConfig,\n    ma_libopus *pOpus) {\n  ma_result result;\n  ma_data_source_config dataSourceConfig;\n\n  if (pOpus == NULL) {\n    return MA_INVALID_ARGS;\n  }\n\n  memset(pOpus, 0, sizeof(*pOpus));\n  pOpus->format = ma_format_f32; /* f32 by default. */\n\n  if (pConfig != NULL &&\n      (pConfig->preferredFormat == ma_format_f32 ||\n       pConfig->preferredFormat == ma_format_s16)) {\n    pOpus->format = pConfig->preferredFormat;\n  } else {\n    /* Getting here means something other than f32 and s16 was specified. Just\n     * leave this unset to use the default format. */\n  }\n\n  dataSourceConfig = ma_data_source_config_init();\n  dataSourceConfig.vtable = &g_ma_libopus_ds_vtable;\n\n  result = ma_data_source_init(&dataSourceConfig, &pOpus->ds);\n  if (result != MA_SUCCESS) {\n    return result; /* Failed to initialize the base data source. */\n  }\n\n  return MA_SUCCESS;\n}\n\nMA_API ma_result ma_libopus_init(\n    ma_read_proc onRead,\n    ma_seek_proc onSeek,\n    ma_tell_proc onTell,\n    void *pReadSeekTellUserData,\n    const ma_decoding_backend_config *pConfig,\n    const ma_allocation_callbacks *pAllocationCallbacks,\n    ma_libopus *pOpus) {\n  ma_result result;\n\n  (void)pAllocationCallbacks; /* Can't seem to find a way to configure memory\n                                 allocations in libopus. */\n\n  result = ma_libopus_init_internal(pConfig, pOpus);\n  if (result != MA_SUCCESS) {\n    return result;\n  }\n\n  if (onRead == NULL || onSeek == NULL) {\n    return MA_INVALID_ARGS; /* onRead and onSeek are mandatory. */\n  }\n\n  pOpus->onRead = onRead;\n  pOpus->onSeek = onSeek;\n  pOpus->onTell = onTell;\n  pOpus->pReadSeekTellUserData = pReadSeekTellUserData;\n\n#if !defined(MA_NO_LIBOPUS)\n  {\n    int libopusResult;\n    OpusFileCallbacks libopusCallbacks;\n\n    /* We can now initialize the Opus decoder. This must be done after we've set\n     * up the callbacks. */\n    libopusCallbacks.read = ma_libopus_of_callback__read;\n    libopusCallbacks.seek = ma_libopus_of_callback__seek;\n    libopusCallbacks.close = NULL;\n    libopusCallbacks.tell = ma_libopus_of_callback__tell;\n\n    pOpus->of =\n        op_open_callbacks(pOpus, &libopusCallbacks, NULL, 0, &libopusResult);\n    if (pOpus->of == NULL) {\n      return MA_INVALID_FILE;\n    }\n\n    return MA_SUCCESS;\n  }\n#else\n  {\n    /* libopus is disabled. */\n    return MA_NOT_IMPLEMENTED;\n  }\n#endif\n}\n\nMA_API ma_result ma_libopus_init_file(\n    const char *pFilePath,\n    const ma_decoding_backend_config *pConfig,\n    const ma_allocation_callbacks *pAllocationCallbacks,\n    ma_libopus *pOpus) {\n  ma_result result;\n\n  (void)pAllocationCallbacks; /* Can't seem to find a way to configure memory\n                                 allocations in libopus. */\n\n  result = ma_libopus_init_internal(pConfig, pOpus);\n  if (result != MA_SUCCESS) {\n    return result;\n  }\n\n#if !defined(MA_NO_LIBOPUS)\n  {\n    int libopusResult;\n\n    pOpus->of = op_open_file(pFilePath, &libopusResult);\n    if (pOpus->of == NULL) {\n      return MA_INVALID_FILE;\n    }\n\n    return MA_SUCCESS;\n  }\n#else\n  {\n    /* libopus is disabled. */\n    (void)pFilePath;\n    return MA_NOT_IMPLEMENTED;\n  }\n#endif\n}\n\nMA_API void ma_libopus_uninit(\n    ma_libopus *pOpus,\n    const ma_allocation_callbacks *pAllocationCallbacks) {\n  if (pOpus == NULL) {\n    return;\n  }\n\n  (void)pAllocationCallbacks;\n\n#if !defined(MA_NO_LIBOPUS)\n  {\n    op_free((OggOpusFile *)pOpus->of);\n  }\n#else\n  {\n    /* libopus is disabled. Should never hit this since initialization would\n     * have failed. */\n    assert(MA_FALSE);\n  }\n#endif\n\n  ma_data_source_uninit(&pOpus->ds);\n}\n\nMA_API ma_result ma_libopus_read_pcm_frames(\n    ma_libopus *pOpus,\n    void *pFramesOut,\n    ma_uint64 frameCount,\n    ma_uint64 *pFramesRead) {\n  if (pFramesRead != NULL) {\n    *pFramesRead = 0;\n  }\n\n  if (frameCount == 0) {\n    return MA_INVALID_ARGS;\n  }\n\n  if (pOpus == NULL) {\n    return MA_INVALID_ARGS;\n  }\n\n#if !defined(MA_NO_LIBOPUS)\n  {\n    /* We always use floating point format. */\n    ma_result result = MA_SUCCESS; /* Must be initialized to MA_SUCCESS. */\n    ma_uint64 totalFramesRead;\n    ma_format format;\n    ma_uint32 channels;\n\n    ma_libopus_get_data_format(pOpus, &format, &channels, NULL, NULL, 0);\n\n    totalFramesRead = 0;\n    while (totalFramesRead < frameCount) {\n      long libopusResult;\n      ma_uint64 framesToRead;\n      ma_uint64 framesRemaining;\n\n      framesRemaining = (frameCount - totalFramesRead);\n      framesToRead = 1024;\n      if (framesToRead > framesRemaining) {\n        framesToRead = framesRemaining;\n      }\n\n      if (format == ma_format_f32) {\n        libopusResult = op_read_float(\n            (OggOpusFile *)pOpus->of,\n            (float *)ma_offset_pcm_frames_ptr(\n                pFramesOut, totalFramesRead, format, channels),\n            (int)(framesToRead * channels),\n            NULL);\n      } else {\n        libopusResult = op_read(\n            (OggOpusFile *)pOpus->of,\n            (opus_int16 *)ma_offset_pcm_frames_ptr(\n                pFramesOut, totalFramesRead, format, channels),\n            (int)(framesToRead * channels),\n            NULL);\n      }\n\n      if (libopusResult < 0) {\n        result = MA_ERROR; /* Error while decoding. */\n        break;\n      } else {\n        totalFramesRead += libopusResult;\n\n        if (libopusResult == 0) {\n          result = MA_AT_END;\n          break;\n        }\n      }\n    }\n\n    if (pFramesRead != NULL) {\n      *pFramesRead = totalFramesRead;\n    }\n\n    if (result == MA_SUCCESS && totalFramesRead == 0) {\n      result = MA_AT_END;\n    }\n\n    return result;\n  }\n#else\n  {\n    /* libopus is disabled. Should never hit this since initialization would\n     * have failed. */\n    assert(MA_FALSE);\n\n    (void)pFramesOut;\n    (void)frameCount;\n    (void)pFramesRead;\n\n    return MA_NOT_IMPLEMENTED;\n  }\n#endif\n}\n\nMA_API ma_result\nma_libopus_seek_to_pcm_frame(ma_libopus *pOpus, ma_uint64 frameIndex) {\n  if (pOpus == NULL) {\n    return MA_INVALID_ARGS;\n  }\n\n#if !defined(MA_NO_LIBOPUS)\n  {\n    int libopusResult =\n        op_pcm_seek((OggOpusFile *)pOpus->of, (ogg_int64_t)frameIndex);\n    if (libopusResult != 0) {\n      if (libopusResult == OP_ENOSEEK) {\n        return MA_INVALID_OPERATION; /* Not seekable. */\n      } else if (libopusResult == OP_EINVAL) {\n        return MA_INVALID_ARGS;\n      } else {\n        return MA_ERROR;\n      }\n    }\n\n    return MA_SUCCESS;\n  }\n#else\n  {\n    /* libopus is disabled. Should never hit this since initialization would\n     * have failed. */\n    assert(MA_FALSE);\n\n    (void)frameIndex;\n\n    return MA_NOT_IMPLEMENTED;\n  }\n#endif\n}\n\nMA_API ma_result ma_libopus_get_data_format(\n    ma_libopus *pOpus,\n    ma_format *pFormat,\n    ma_uint32 *pChannels,\n    ma_uint32 *pSampleRate,\n    ma_channel *pChannelMap,\n    size_t channelMapCap) {\n  /* Defaults for safety. */\n  if (pFormat != NULL) {\n    *pFormat = ma_format_unknown;\n  }\n  if (pChannels != NULL) {\n    *pChannels = 0;\n  }\n  if (pSampleRate != NULL) {\n    *pSampleRate = 0;\n  }\n  if (pChannelMap != NULL) {\n    memset(pChannelMap, 0, sizeof(*pChannelMap) * channelMapCap);\n  }\n\n  if (pOpus == NULL) {\n    return MA_INVALID_OPERATION;\n  }\n\n  if (pFormat != NULL) {\n    *pFormat = pOpus->format;\n  }\n\n#if !defined(MA_NO_LIBOPUS)\n  {\n    ma_uint32 channels = op_channel_count((OggOpusFile *)pOpus->of, -1);\n\n    if (pChannels != NULL) {\n      *pChannels = channels;\n    }\n\n    if (pSampleRate != NULL) {\n      *pSampleRate = 48000;\n    }\n\n    if (pChannelMap != NULL) {\n      ma_channel_map_init_standard(\n          ma_standard_channel_map_vorbis, pChannelMap, channelMapCap, channels);\n    }\n\n    return MA_SUCCESS;\n  }\n#else\n  {\n    /* libopus is disabled. Should never hit this since initialization would\n     * have failed. */\n    assert(MA_FALSE);\n    return MA_NOT_IMPLEMENTED;\n  }\n#endif\n}\n\nMA_API ma_result\nma_libopus_get_cursor_in_pcm_frames(ma_libopus *pOpus, ma_uint64 *pCursor) {\n  if (pCursor == NULL) {\n    return MA_INVALID_ARGS;\n  }\n\n  *pCursor = 0; /* Safety. */\n\n  if (pOpus == NULL) {\n    return MA_INVALID_ARGS;\n  }\n\n#if !defined(MA_NO_LIBOPUS)\n  {\n    ogg_int64_t offset = op_pcm_tell((OggOpusFile *)pOpus->of);\n    if (offset < 0) {\n      return MA_INVALID_FILE;\n    }\n\n    *pCursor = (ma_uint64)offset;\n\n    return MA_SUCCESS;\n  }\n#else\n  {\n    /* libopus is disabled. Should never hit this since initialization would\n     * have failed. */\n    assert(MA_FALSE);\n    return MA_NOT_IMPLEMENTED;\n  }\n#endif\n}\n\nMA_API ma_result\nma_libopus_get_length_in_pcm_frames(ma_libopus *pOpus, ma_uint64 *pLength) {\n  if (pLength == NULL) {\n    return MA_INVALID_ARGS;\n  }\n\n  *pLength = 0; /* Safety. */\n\n  if (pOpus == NULL) {\n    return MA_INVALID_ARGS;\n  }\n\n#if !defined(MA_NO_LIBOPUS)\n  {\n    ogg_int64_t length = op_pcm_total((OggOpusFile *)pOpus->of, -1);\n    if (length < 0) {\n      return MA_ERROR;\n    }\n\n    *pLength = (ma_uint64)length;\n\n    return MA_SUCCESS;\n  }\n#else\n  {\n    /* libopus is disabled. Should never hit this since initialization would\n     * have failed. */\n    assert(MA_FALSE);\n    return MA_NOT_IMPLEMENTED;\n  }\n#endif\n}\n\n/*\nThe code below defines the vtable that you'll plug into your `ma_decoder_config`\nobject.\n*/\n#if !defined(MA_NO_LIBOPUS)\nstatic ma_result ma_decoding_backend_init__libopus(\n    void *pUserData,\n    ma_read_proc onRead,\n    ma_seek_proc onSeek,\n    ma_tell_proc onTell,\n    void *pReadSeekTellUserData,\n    const ma_decoding_backend_config *pConfig,\n    const ma_allocation_callbacks *pAllocationCallbacks,\n    ma_data_source **ppBackend) {\n  ma_result result;\n  ma_libopus *pOpus;\n\n  (void)pUserData;\n\n  pOpus = (ma_libopus *)ma_malloc(sizeof(*pOpus), pAllocationCallbacks);\n  if (pOpus == NULL) {\n    return MA_OUT_OF_MEMORY;\n  }\n\n  result = ma_libopus_init(\n      onRead,\n      onSeek,\n      onTell,\n      pReadSeekTellUserData,\n      pConfig,\n      pAllocationCallbacks,\n      pOpus);\n  if (result != MA_SUCCESS) {\n    ma_free(pOpus, pAllocationCallbacks);\n    return result;\n  }\n\n  *ppBackend = pOpus;\n\n  return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoding_backend_init_file__libopus(\n    void *pUserData,\n    const char *pFilePath,\n    const ma_decoding_backend_config *pConfig,\n    const ma_allocation_callbacks *pAllocationCallbacks,\n    ma_data_source **ppBackend) {\n  ma_result result;\n  ma_libopus *pOpus;\n\n  (void)pUserData;\n\n  pOpus = (ma_libopus *)ma_malloc(sizeof(*pOpus), pAllocationCallbacks);\n  if (pOpus == NULL) {\n    return MA_OUT_OF_MEMORY;\n  }\n\n  result =\n      ma_libopus_init_file(pFilePath, pConfig, pAllocationCallbacks, pOpus);\n  if (result != MA_SUCCESS) {\n    ma_free(pOpus, pAllocationCallbacks);\n    return result;\n  }\n\n  *ppBackend = pOpus;\n\n  return MA_SUCCESS;\n}\n\nstatic void ma_decoding_backend_uninit__libopus(\n    void *pUserData,\n    ma_data_source *pBackend,\n    const ma_allocation_callbacks *pAllocationCallbacks) {\n  ma_libopus *pOpus = (ma_libopus *)pBackend;\n\n  (void)pUserData;\n\n  ma_libopus_uninit(pOpus, pAllocationCallbacks);\n  ma_free(pOpus, pAllocationCallbacks);\n}\n\nstatic ma_decoding_backend_vtable ma_gDecodingBackendVTable_libopus = {\n    ma_decoding_backend_init__libopus,\n    ma_decoding_backend_init_file__libopus,\n    NULL, /* onInitFileW() */\n    NULL, /* onInitMemory() */\n    ma_decoding_backend_uninit__libopus};\nma_decoding_backend_vtable *ma_decoding_backend_libopus =\n    &ma_gDecodingBackendVTable_libopus;\n#else\nma_decoding_backend_vtable *ma_decoding_backend_libopus = NULL;\n#endif\n\n#endif /* miniaudio_libopus_c */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/miniaudio/decoders/libopus/miniaudio_libopus.h",
    "content": "/*\nThis implements a data source that decodes Opus streams via libopus +\nlibopusfile\n\nThis object can be plugged into any `ma_data_source_*()` API and can also be\nused as a custom decoding backend. See the custom_decoder example.\n*/\n#ifndef miniaudio_libopus_h\n#define miniaudio_libopus_h\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include <audioapi/libs/miniaudio/miniaudio.h>\n\ntypedef struct {\n  ma_data_source_base\n      ds; /* The libopus decoder can be used independently as a data source. */\n  ma_read_proc onRead;\n  ma_seek_proc onSeek;\n  ma_tell_proc onTell;\n  void *pReadSeekTellUserData;\n  ma_format format; /* Will be either f32 or s16. */\n  /*OggOpusFile**/ void *of; /* Typed as void* so we can avoid a dependency on\n                                opusfile in the header section. */\n} ma_libopus;\n\nMA_API ma_result ma_libopus_init(\n    ma_read_proc onRead,\n    ma_seek_proc onSeek,\n    ma_tell_proc onTell,\n    void *pReadSeekTellUserData,\n    const ma_decoding_backend_config *pConfig,\n    const ma_allocation_callbacks *pAllocationCallbacks,\n    ma_libopus *pOpus);\nMA_API ma_result ma_libopus_init_file(\n    const char *pFilePath,\n    const ma_decoding_backend_config *pConfig,\n    const ma_allocation_callbacks *pAllocationCallbacks,\n    ma_libopus *pOpus);\nMA_API void ma_libopus_uninit(\n    ma_libopus *pOpus,\n    const ma_allocation_callbacks *pAllocationCallbacks);\nMA_API ma_result ma_libopus_read_pcm_frames(\n    ma_libopus *pOpus,\n    void *pFramesOut,\n    ma_uint64 frameCount,\n    ma_uint64 *pFramesRead);\nMA_API ma_result\nma_libopus_seek_to_pcm_frame(ma_libopus *pOpus, ma_uint64 frameIndex);\nMA_API ma_result ma_libopus_get_data_format(\n    ma_libopus *pOpus,\n    ma_format *pFormat,\n    ma_uint32 *pChannels,\n    ma_uint32 *pSampleRate,\n    ma_channel *pChannelMap,\n    size_t channelMapCap);\nMA_API ma_result\nma_libopus_get_cursor_in_pcm_frames(ma_libopus *pOpus, ma_uint64 *pCursor);\nMA_API ma_result\nma_libopus_get_length_in_pcm_frames(ma_libopus *pOpus, ma_uint64 *pLength);\n\n/* Decoding backend vtable. This is what you'll plug into\n * ma_decoder_config.pBackendVTables. No user data required. */\nextern ma_decoding_backend_vtable *ma_decoding_backend_libopus;\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* miniaudio_libopus_h */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/miniaudio/decoders/libvorbis/miniaudio_libvorbis.c",
    "content": "#ifndef miniaudio_libvorbis_c\n#define miniaudio_libvorbis_c\n\n#include <audioapi/libs/miniaudio/decoders/libvorbis/miniaudio_libvorbis.h>\n\n#if !defined(MA_NO_LIBVORBIS)\n#ifndef OV_EXCLUDE_STATIC_CALLBACKS\n#define OV_EXCLUDE_STATIC_CALLBACKS\n#endif\n#include <audioapi/external/include/vorbis/vorbisfile.h>\n#endif\n\n#include <string.h> /* For memset(). */\n#include <assert.h>\n\nstatic ma_result ma_libvorbis_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    return ma_libvorbis_read_pcm_frames((ma_libvorbis*)pDataSource, pFramesOut, frameCount, pFramesRead);\n}\n\nstatic ma_result ma_libvorbis_ds_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    return ma_libvorbis_seek_to_pcm_frame((ma_libvorbis*)pDataSource, frameIndex);\n}\n\nstatic ma_result ma_libvorbis_ds_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    return ma_libvorbis_get_data_format((ma_libvorbis*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap);\n}\n\nstatic ma_result ma_libvorbis_ds_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)\n{\n    return ma_libvorbis_get_cursor_in_pcm_frames((ma_libvorbis*)pDataSource, pCursor);\n}\n\nstatic ma_result ma_libvorbis_ds_get_length(ma_data_source* pDataSource, ma_uint64* pLength)\n{\n    return ma_libvorbis_get_length_in_pcm_frames((ma_libvorbis*)pDataSource, pLength);\n}\n\nstatic ma_data_source_vtable g_ma_libvorbis_ds_vtable =\n{\n    ma_libvorbis_ds_read,\n    ma_libvorbis_ds_seek,\n    ma_libvorbis_ds_get_data_format,\n    ma_libvorbis_ds_get_cursor,\n    ma_libvorbis_ds_get_length,\n    NULL,   /* onSetLooping */\n    0       /* flags */\n};\n\n\n#if !defined(MA_NO_LIBVORBIS)\nstatic size_t ma_libvorbis_vf_callback__read(void* pBufferOut, size_t size, size_t count, void* pUserData)\n{\n    ma_libvorbis* pVorbis = (ma_libvorbis*)pUserData;\n    ma_result result;\n    size_t bytesToRead;\n    size_t bytesRead;\n\n    /* For consistency with fread(). If `size` of `count` is 0, return 0 immediately without changing anything. */\n    if (size == 0 || count == 0) {\n        return 0;\n    }\n\n    bytesToRead = size * count;\n    result = pVorbis->onRead(pVorbis->pReadSeekTellUserData, pBufferOut, bytesToRead, &bytesRead);\n    if (result != MA_SUCCESS) {\n        /* Not entirely sure what to return here. What if an error occurs, but some data was read and bytesRead is > 0? */\n        return 0;\n    }\n\n    return bytesRead / size;\n}\n\nstatic int ma_libvorbis_vf_callback__seek(void* pUserData, ogg_int64_t offset, int whence)\n{\n    ma_libvorbis* pVorbis = (ma_libvorbis*)pUserData;\n    ma_result result;\n    ma_seek_origin origin;\n\n    if (whence == SEEK_SET) {\n        origin = ma_seek_origin_start;\n    } else if (whence == SEEK_END) {\n        origin = ma_seek_origin_end;\n    } else {\n        origin = ma_seek_origin_current;\n    }\n\n    result = pVorbis->onSeek(pVorbis->pReadSeekTellUserData, offset, origin);\n    if (result != MA_SUCCESS) {\n        return -1;\n    }\n\n    return 0;\n}\n\nstatic long ma_libvorbis_vf_callback__tell(void* pUserData)\n{\n    ma_libvorbis* pVorbis = (ma_libvorbis*)pUserData;\n    ma_result result;\n    ma_int64 cursor;\n\n    result = pVorbis->onTell(pVorbis->pReadSeekTellUserData, &cursor);\n    if (result != MA_SUCCESS) {\n        return -1;\n    }\n\n    return (long)cursor;\n}\n#endif\n\nstatic ma_result ma_libvorbis_init_internal(const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_libvorbis* pVorbis)\n{\n    ma_result result;\n    ma_data_source_config dataSourceConfig;\n\n    if (pVorbis == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    memset(pVorbis, 0, sizeof(*pVorbis));\n    pVorbis->format = ma_format_f32;    /* f32 by default. */\n\n    if (pConfig != NULL && (pConfig->preferredFormat == ma_format_f32 || pConfig->preferredFormat == ma_format_s16)) {\n        pVorbis->format = pConfig->preferredFormat;\n    } else {\n        /* Getting here means something other than f32 and s16 was specified. Just leave this unset to use the default format. */\n    }\n\n    dataSourceConfig = ma_data_source_config_init();\n    dataSourceConfig.vtable = &g_ma_libvorbis_ds_vtable;\n\n    result = ma_data_source_init(&dataSourceConfig, &pVorbis->ds);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to initialize the base data source. */\n    }\n\n    #if !defined(MA_NO_LIBVORBIS)\n    {\n        pVorbis->vf = (OggVorbis_File*)ma_malloc(sizeof(OggVorbis_File), pAllocationCallbacks);\n        if (pVorbis->vf == NULL) {\n            ma_data_source_uninit(&pVorbis->ds);\n            return MA_OUT_OF_MEMORY;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* libvorbis is disabled. */\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_libvorbis_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_libvorbis* pVorbis)\n{\n    ma_result result;\n\n    (void)pAllocationCallbacks; /* Can't seem to find a way to configure memory allocations in libvorbis. */\n\n    result = ma_libvorbis_init_internal(pConfig, pAllocationCallbacks, pVorbis);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (onRead == NULL || onSeek == NULL) {\n        return MA_INVALID_ARGS; /* onRead and onSeek are mandatory. */\n    }\n\n    pVorbis->onRead = onRead;\n    pVorbis->onSeek = onSeek;\n    pVorbis->onTell = onTell;\n    pVorbis->pReadSeekTellUserData = pReadSeekTellUserData;\n\n    #if !defined(MA_NO_LIBVORBIS)\n    {\n        int libvorbisResult;\n        ov_callbacks libvorbisCallbacks;\n\n        /* We can now initialize the vorbis decoder. This must be done after we've set up the callbacks. */\n        libvorbisCallbacks.read_func  = ma_libvorbis_vf_callback__read;\n        libvorbisCallbacks.seek_func  = ma_libvorbis_vf_callback__seek;\n        libvorbisCallbacks.close_func = NULL;\n        libvorbisCallbacks.tell_func  = ma_libvorbis_vf_callback__tell;\n\n        libvorbisResult = ov_open_callbacks(pVorbis, (OggVorbis_File*)pVorbis->vf, NULL, 0, libvorbisCallbacks);\n        if (libvorbisResult < 0) {\n            return MA_INVALID_FILE;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* libvorbis is disabled. */\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_libvorbis_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_libvorbis* pVorbis)\n{\n    ma_result result;\n\n    (void)pAllocationCallbacks; /* Can't seem to find a way to configure memory allocations in libvorbis. */\n\n    result = ma_libvorbis_init_internal(pConfig, pAllocationCallbacks, pVorbis);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    #if !defined(MA_NO_LIBVORBIS)\n    {\n        int libvorbisResult;\n\n        libvorbisResult = ov_fopen(pFilePath, (OggVorbis_File*)pVorbis->vf);\n        if (libvorbisResult < 0) {\n            return MA_INVALID_FILE;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* libvorbis is disabled. */\n        (void)pFilePath;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API void ma_libvorbis_uninit(ma_libvorbis* pVorbis, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pVorbis == NULL) {\n        return;\n    }\n\n    (void)pAllocationCallbacks;\n\n    #if !defined(MA_NO_LIBVORBIS)\n    {\n        ov_clear((OggVorbis_File*)pVorbis->vf);\n    }\n    #else\n    {\n        /* libvorbis is disabled. Should never hit this since initialization would have failed. */\n        assert(MA_FALSE);\n    }\n    #endif\n\n    ma_data_source_uninit(&pVorbis->ds);\n    ma_free(pVorbis->vf, pAllocationCallbacks);\n}\n\nMA_API ma_result ma_libvorbis_read_pcm_frames(ma_libvorbis* pVorbis, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    if (frameCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pVorbis == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_LIBVORBIS)\n    {\n        /* We always use floating point format. */\n        ma_result result = MA_SUCCESS;  /* Must be initialized to MA_SUCCESS. */\n        ma_uint64 totalFramesRead;\n        ma_format format;\n        ma_uint32 channels;\n\n        ma_libvorbis_get_data_format(pVorbis, &format, &channels, NULL, NULL, 0);\n\n        totalFramesRead = 0;\n        while (totalFramesRead < frameCount) {\n            long libvorbisResult;\n            ma_uint64 framesToRead;\n            ma_uint64 framesRemaining;\n\n            framesRemaining = (frameCount - totalFramesRead);\n            framesToRead = 1024;\n            if (framesToRead > framesRemaining) {\n                framesToRead = framesRemaining;\n            }\n\n            if (format == ma_format_f32) {\n                float** ppFramesF32;\n\n                libvorbisResult = ov_read_float((OggVorbis_File*)pVorbis->vf, &ppFramesF32, (int)framesToRead, NULL);\n                if (libvorbisResult < 0) {\n                    result = MA_ERROR;  /* Error while decoding. */\n                    break;\n                } else {\n                    /* Frames need to be interleaved. */\n                    ma_interleave_pcm_frames(format, channels, libvorbisResult, (const void**)ppFramesF32, ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, format, channels));\n                    totalFramesRead += libvorbisResult;\n\n                    if (libvorbisResult == 0) {\n                        result = MA_AT_END;\n                        break;\n                    }\n                }\n            } else {\n                libvorbisResult = ov_read((OggVorbis_File*)pVorbis->vf, (char*)ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, format, channels), (int)(framesToRead * ma_get_bytes_per_frame(format, channels)), 0, 2, 1, NULL);\n                if (libvorbisResult < 0) {\n                    result = MA_ERROR;  /* Error while decoding. */\n                    break;\n                } else {\n                    /* Conveniently, there's no need to interleaving when using ov_read(). I'm not sure why ov_read_float() is different in that regard... */\n                    totalFramesRead += libvorbisResult / ma_get_bytes_per_frame(format, channels);\n\n                    if (libvorbisResult == 0) {\n                        result = MA_AT_END;\n                        break;\n                    }\n                }\n            }\n        }\n\n        if (pFramesRead != NULL) {\n            *pFramesRead = totalFramesRead;\n        }\n\n        if (result == MA_SUCCESS && totalFramesRead == 0) {\n            result = MA_AT_END;\n        }\n\n        return result;\n    }\n    #else\n    {\n        /* libvorbis is disabled. Should never hit this since initialization would have failed. */\n        assert(MA_FALSE);\n\n        (void)pFramesOut;\n        (void)frameCount;\n        (void)pFramesRead;\n\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_libvorbis_seek_to_pcm_frame(ma_libvorbis* pVorbis, ma_uint64 frameIndex)\n{\n    if (pVorbis == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_LIBVORBIS)\n    {\n        int libvorbisResult = ov_pcm_seek((OggVorbis_File*)pVorbis->vf, (ogg_int64_t)frameIndex);\n        if (libvorbisResult != 0) {\n            if (libvorbisResult == OV_ENOSEEK) {\n                return MA_INVALID_OPERATION;    /* Not seekable. */\n            } else if (libvorbisResult == OV_EINVAL) {\n                return MA_INVALID_ARGS;\n            } else {\n                return MA_ERROR;\n            }\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* libvorbis is disabled. Should never hit this since initialization would have failed. */\n        assert(MA_FALSE);\n\n        (void)frameIndex;\n\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_libvorbis_get_data_format(ma_libvorbis* pVorbis, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    /* Defaults for safety. */\n    if (pFormat != NULL) {\n        *pFormat = ma_format_unknown;\n    }\n    if (pChannels != NULL) {\n        *pChannels = 0;\n    }\n    if (pSampleRate != NULL) {\n        *pSampleRate = 0;\n    }\n    if (pChannelMap != NULL) {\n        memset(pChannelMap, 0, sizeof(*pChannelMap) * channelMapCap);\n    }\n\n    if (pVorbis == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    if (pFormat != NULL) {\n        *pFormat = pVorbis->format;\n    }\n\n    #if !defined(MA_NO_LIBVORBIS)\n    {\n        vorbis_info* pInfo = ov_info((OggVorbis_File*)pVorbis->vf, 0);\n        if (pInfo == NULL) {\n            return MA_INVALID_OPERATION;\n        }\n\n        if (pChannels != NULL) {\n            *pChannels = pInfo->channels;\n        }\n\n        if (pSampleRate != NULL) {\n            *pSampleRate = pInfo->rate;\n        }\n\n        if (pChannelMap != NULL) {\n            ma_channel_map_init_standard(ma_standard_channel_map_vorbis, pChannelMap, channelMapCap, pInfo->channels);\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* libvorbis is disabled. Should never hit this since initialization would have failed. */\n        assert(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_libvorbis_get_cursor_in_pcm_frames(ma_libvorbis* pVorbis, ma_uint64* pCursor)\n{\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;   /* Safety. */\n\n    if (pVorbis == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_LIBVORBIS)\n    {\n        ogg_int64_t offset = ov_pcm_tell((OggVorbis_File*)pVorbis->vf);\n        if (offset < 0) {\n            return MA_INVALID_FILE;\n        }\n\n        *pCursor = (ma_uint64)offset;\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* libvorbis is disabled. Should never hit this since initialization would have failed. */\n        assert(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_libvorbis_get_length_in_pcm_frames(ma_libvorbis* pVorbis, ma_uint64* pLength)\n{\n    if (pLength == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pLength = 0;   /* Safety. */\n\n    if (pVorbis == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_LIBVORBIS)\n    {\n        /* I don't know how to reliably retrieve the length in frames using libvorbis, so returning 0 for now. */\n        *pLength = 0;\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* libvorbis is disabled. Should never hit this since initialization would have failed. */\n        assert(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\n\n/*\nThe code below defines the vtable that you'll plug into your `ma_decoder_config` object.\n*/\n#if !defined(MA_NO_LIBVORBIS)\nstatic ma_result ma_decoding_backend_init__libvorbis(void* pUserData, ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_libvorbis* pVorbis;\n\n    (void)pUserData;\n\n    pVorbis = (ma_libvorbis*)ma_malloc(sizeof(*pVorbis), pAllocationCallbacks);\n    if (pVorbis == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_libvorbis_init(onRead, onSeek, onTell, pReadSeekTellUserData, pConfig, pAllocationCallbacks, pVorbis);\n    if (result != MA_SUCCESS) {\n        ma_free(pVorbis, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pVorbis;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoding_backend_init_file__libvorbis(void* pUserData, const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_libvorbis* pVorbis;\n\n    (void)pUserData;\n\n    pVorbis = (ma_libvorbis*)ma_malloc(sizeof(*pVorbis), pAllocationCallbacks);\n    if (pVorbis == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_libvorbis_init_file(pFilePath, pConfig, pAllocationCallbacks, pVorbis);\n    if (result != MA_SUCCESS) {\n        ma_free(pVorbis, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pVorbis;\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_decoding_backend_uninit__libvorbis(void* pUserData, ma_data_source* pBackend, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_libvorbis* pVorbis = (ma_libvorbis*)pBackend;\n\n    (void)pUserData;\n\n    ma_libvorbis_uninit(pVorbis, pAllocationCallbacks);\n    ma_free(pVorbis, pAllocationCallbacks);\n}\n\n\nstatic ma_decoding_backend_vtable ma_gDecodingBackendVTable_libvorbis =\n{\n    ma_decoding_backend_init__libvorbis,\n    ma_decoding_backend_init_file__libvorbis,\n    NULL, /* onInitFileW() */\n    NULL, /* onInitMemory() */\n    ma_decoding_backend_uninit__libvorbis\n};\nma_decoding_backend_vtable* ma_decoding_backend_libvorbis = &ma_gDecodingBackendVTable_libvorbis;\n#else\nma_decoding_backend_vtable* ma_decoding_backend_libvorbis = NULL;\n#endif\n\n#endif /* miniaudio_libvorbis_c */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/miniaudio/decoders/libvorbis/miniaudio_libvorbis.h",
    "content": "/*\nThis implements a data source that decodes Vorbis streams via libvorbis + libvorbisfile\n\nThis object can be plugged into any `ma_data_source_*()` API and can also be used as a custom\ndecoding backend. See the custom_decoder example.\n*/\n#ifndef miniaudio_libvorbis_h\n#define miniaudio_libvorbis_h\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#include <audioapi/libs/miniaudio/miniaudio.h>\n\ntypedef struct\n{\n    ma_data_source_base ds;     /* The libvorbis decoder can be used independently as a data source. */\n    ma_read_proc onRead;\n    ma_seek_proc onSeek;\n    ma_tell_proc onTell;\n    void* pReadSeekTellUserData;\n    ma_format format;           /* Will be either f32 or s16. */\n    /*OggVorbis_File**/ void* vf;   /* Typed as void* so we can avoid a dependency on opusfile in the header section. */\n} ma_libvorbis;\n\nMA_API ma_result ma_libvorbis_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_libvorbis* pVorbis);\nMA_API ma_result ma_libvorbis_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_libvorbis* pVorbis);\nMA_API void ma_libvorbis_uninit(ma_libvorbis* pVorbis, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_libvorbis_read_pcm_frames(ma_libvorbis* pVorbis, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\nMA_API ma_result ma_libvorbis_seek_to_pcm_frame(ma_libvorbis* pVorbis, ma_uint64 frameIndex);\nMA_API ma_result ma_libvorbis_get_data_format(ma_libvorbis* pVorbis, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);\nMA_API ma_result ma_libvorbis_get_cursor_in_pcm_frames(ma_libvorbis* pVorbis, ma_uint64* pCursor);\nMA_API ma_result ma_libvorbis_get_length_in_pcm_frames(ma_libvorbis* pVorbis, ma_uint64* pLength);\n\n/* Decoding backend vtable. This is what you'll plug into ma_decoder_config.pBackendVTables. No user data required. */\nextern ma_decoding_backend_vtable* ma_decoding_backend_libvorbis;\n\n#ifdef __cplusplus\n}\n#endif\n#endif  /* miniaudio_libvorbis_h */\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/miniaudio/miniaudio.h",
    "content": "/*\nAudio playback and capture library. Choice of public domain or MIT-0. See license statements at the end of this file.\nminiaudio - v0.11.21 - 2023-11-15\n\nDavid Reid - mackron@gmail.com\n\nWebsite:       https://miniaud.io\nDocumentation: https://miniaud.io/docs\nGitHub:        https://github.com/mackron/miniaudio\n*/\n\n/*\n1. Introduction\n===============\nminiaudio is a single file library for audio playback and capture. To use it, do the following in\none .c file:\n\n    ```c\n    #define MINIAUDIO_IMPLEMENTATION\n    #include \"miniaudio.h\"\n    ```\n\nYou can do `#include \"miniaudio.h\"` in other parts of the program just like any other header.\n\nminiaudio includes both low level and high level APIs. The low level API is good for those who want\nto do all of their mixing themselves and only require a light weight interface to the underlying\naudio device. The high level API is good for those who have complex mixing and effect requirements.\n\nIn miniaudio, objects are transparent structures. Unlike many other libraries, there are no handles\nto opaque objects which means you need to allocate memory for objects yourself. In the examples\npresented in this documentation you will often see objects declared on the stack. You need to be\ncareful when translating these examples to your own code so that you don't accidentally declare\nyour objects on the stack and then cause them to become invalid once the function returns. In\naddition, you must ensure the memory address of your objects remain the same throughout their\nlifetime. You therefore cannot be making copies of your objects.\n\nA config/init pattern is used throughout the entire library. The idea is that you set up a config\nobject and pass that into the initialization routine. The advantage to this system is that the\nconfig object can be initialized with logical defaults and new properties added to it without\nbreaking the API. The config object can be allocated on the stack and does not need to be\nmaintained after initialization of the corresponding object.\n\n\n1.1. Low Level API\n------------------\nThe low level API gives you access to the raw audio data of an audio device. It supports playback,\ncapture, full-duplex and loopback (WASAPI only). You can enumerate over devices to determine which\nphysical device(s) you want to connect to.\n\nThe low level API uses the concept of a \"device\" as the abstraction for physical devices. The idea\nis that you choose a physical device to emit or capture audio from, and then move data to/from the\ndevice when miniaudio tells you to. Data is delivered to and from devices asynchronously via a\ncallback which you specify when initializing the device.\n\nWhen initializing the device you first need to configure it. The device configuration allows you to\nspecify things like the format of the data delivered via the callback, the size of the internal\nbuffer and the ID of the device you want to emit or capture audio from.\n\nOnce you have the device configuration set up you can initialize the device. When initializing a\ndevice you need to allocate memory for the device object beforehand. This gives the application\ncomplete control over how the memory is allocated. In the example below we initialize a playback\ndevice on the stack, but you could allocate it on the heap if that suits your situation better.\n\n    ```c\n    void data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount)\n    {\n        // In playback mode copy data to pOutput. In capture mode read data from pInput. In full-duplex mode, both\n        // pOutput and pInput will be valid and you can move data from pInput into pOutput. Never process more than\n        // frameCount frames.\n    }\n\n    int main()\n    {\n        ma_device_config config = ma_device_config_init(ma_device_type_playback);\n        config.playback.format   = ma_format_f32;   // Set to ma_format_unknown to use the device's native format.\n        config.playback.channels = 2;               // Set to 0 to use the device's native channel count.\n        config.sampleRate        = 48000;           // Set to 0 to use the device's native sample rate.\n        config.dataCallback      = data_callback;   // This function will be called when miniaudio needs more data.\n        config.pUserData         = pMyCustomData;   // Can be accessed from the device object (device.pUserData).\n\n        ma_device device;\n        if (ma_device_init(NULL, &config, &device) != MA_SUCCESS) {\n            return -1;  // Failed to initialize the device.\n        }\n\n        ma_device_start(&device);     // The device is sleeping by default so you'll need to start it manually.\n\n        // Do something here. Probably your program's main loop.\n\n        ma_device_uninit(&device);\n        return 0;\n    }\n    ```\n\nIn the example above, `data_callback()` is where audio data is written and read from the device.\nThe idea is in playback mode you cause sound to be emitted from the speakers by writing audio data\nto the output buffer (`pOutput` in the example). In capture mode you read data from the input\nbuffer (`pInput`) to extract sound captured by the microphone. The `frameCount` parameter tells you\nhow many frames can be written to the output buffer and read from the input buffer. A \"frame\" is\none sample for each channel. For example, in a stereo stream (2 channels), one frame is 2\nsamples: one for the left, one for the right. The channel count is defined by the device config.\nThe size in bytes of an individual sample is defined by the sample format which is also specified\nin the device config. Multi-channel audio data is always interleaved, which means the samples for\neach frame are stored next to each other in memory. For example, in a stereo stream the first pair\nof samples will be the left and right samples for the first frame, the second pair of samples will\nbe the left and right samples for the second frame, etc.\n\nThe configuration of the device is defined by the `ma_device_config` structure. The config object\nis always initialized with `ma_device_config_init()`. It's important to always initialize the\nconfig with this function as it initializes it with logical defaults and ensures your program\ndoesn't break when new members are added to the `ma_device_config` structure. The example above\nuses a fairly simple and standard device configuration. The call to `ma_device_config_init()` takes\na single parameter, which is whether or not the device is a playback, capture, duplex or loopback\ndevice (loopback devices are not supported on all backends). The `config.playback.format` member\nsets the sample format which can be one of the following (all formats are native-endian):\n\n    +---------------+----------------------------------------+---------------------------+\n    | Symbol        | Description                            | Range                     |\n    +---------------+----------------------------------------+---------------------------+\n    | ma_format_f32 | 32-bit floating point                  | [-1, 1]                   |\n    | ma_format_s16 | 16-bit signed integer                  | [-32768, 32767]           |\n    | ma_format_s24 | 24-bit signed integer (tightly packed) | [-8388608, 8388607]       |\n    | ma_format_s32 | 32-bit signed integer                  | [-2147483648, 2147483647] |\n    | ma_format_u8  | 8-bit unsigned integer                 | [0, 255]                  |\n    +---------------+----------------------------------------+---------------------------+\n\nThe `config.playback.channels` member sets the number of channels to use with the device. The\nchannel count cannot exceed MA_MAX_CHANNELS. The `config.sampleRate` member sets the sample rate\n(which must be the same for both playback and capture in full-duplex configurations). This is\nusually set to 44100 or 48000, but can be set to anything. It's recommended to keep this between\n8000 and 384000, however.\n\nNote that leaving the format, channel count and/or sample rate at their default values will result\nin the internal device's native configuration being used which is useful if you want to avoid the\noverhead of miniaudio's automatic data conversion.\n\nIn addition to the sample format, channel count and sample rate, the data callback and user data\npointer are also set via the config. The user data pointer is not passed into the callback as a\nparameter, but is instead set to the `pUserData` member of `ma_device` which you can access\ndirectly since all miniaudio structures are transparent.\n\nInitializing the device is done with `ma_device_init()`. This will return a result code telling you\nwhat went wrong, if anything. On success it will return `MA_SUCCESS`. After initialization is\ncomplete the device will be in a stopped state. To start it, use `ma_device_start()`.\nUninitializing the device will stop it, which is what the example above does, but you can also stop\nthe device with `ma_device_stop()`. To resume the device simply call `ma_device_start()` again.\nNote that it's important to never stop or start the device from inside the callback. This will\nresult in a deadlock. Instead you set a variable or signal an event indicating that the device\nneeds to stop and handle it in a different thread. The following APIs must never be called inside\nthe callback:\n\n    ```c\n    ma_device_init()\n    ma_device_init_ex()\n    ma_device_uninit()\n    ma_device_start()\n    ma_device_stop()\n    ```\n\nYou must never try uninitializing and reinitializing a device inside the callback. You must also\nnever try to stop and start it from inside the callback. There are a few other things you shouldn't\ndo in the callback depending on your requirements, however this isn't so much a thread-safety\nthing, but rather a real-time processing thing which is beyond the scope of this introduction.\n\nThe example above demonstrates the initialization of a playback device, but it works exactly the\nsame for capture. All you need to do is change the device type from `ma_device_type_playback` to\n`ma_device_type_capture` when setting up the config, like so:\n\n    ```c\n    ma_device_config config = ma_device_config_init(ma_device_type_capture);\n    config.capture.format   = MY_FORMAT;\n    config.capture.channels = MY_CHANNEL_COUNT;\n    ```\n\nIn the data callback you just read from the input buffer (`pInput` in the example above) and leave\nthe output buffer alone (it will be set to NULL when the device type is set to\n`ma_device_type_capture`).\n\nThese are the available device types and how you should handle the buffers in the callback:\n\n    +-------------------------+--------------------------------------------------------+\n    | Device Type             | Callback Behavior                                      |\n    +-------------------------+--------------------------------------------------------+\n    | ma_device_type_playback | Write to output buffer, leave input buffer untouched.  |\n    | ma_device_type_capture  | Read from input buffer, leave output buffer untouched. |\n    | ma_device_type_duplex   | Read from input buffer, write to output buffer.        |\n    | ma_device_type_loopback | Read from input buffer, leave output buffer untouched. |\n    +-------------------------+--------------------------------------------------------+\n\nYou will notice in the example above that the sample format and channel count is specified\nseparately for playback and capture. This is to support different data formats between the playback\nand capture devices in a full-duplex system. An example may be that you want to capture audio data\nas a monaural stream (one channel), but output sound to a stereo speaker system. Note that if you\nuse different formats between playback and capture in a full-duplex configuration you will need to\nconvert the data yourself. There are functions available to help you do this which will be\nexplained later.\n\nThe example above did not specify a physical device to connect to which means it will use the\noperating system's default device. If you have multiple physical devices connected and you want to\nuse a specific one you will need to specify the device ID in the configuration, like so:\n\n    ```c\n    config.playback.pDeviceID = pMyPlaybackDeviceID;    // Only if requesting a playback or duplex device.\n    config.capture.pDeviceID = pMyCaptureDeviceID;      // Only if requesting a capture, duplex or loopback device.\n    ```\n\nTo retrieve the device ID you will need to perform device enumeration, however this requires the\nuse of a new concept called the \"context\". Conceptually speaking the context sits above the device.\nThere is one context to many devices. The purpose of the context is to represent the backend at a\nmore global level and to perform operations outside the scope of an individual device. Mainly it is\nused for performing run-time linking against backend libraries, initializing backends and\nenumerating devices. The example below shows how to enumerate devices.\n\n    ```c\n    ma_context context;\n    if (ma_context_init(NULL, 0, NULL, &context) != MA_SUCCESS) {\n        // Error.\n    }\n\n    ma_device_info* pPlaybackInfos;\n    ma_uint32 playbackCount;\n    ma_device_info* pCaptureInfos;\n    ma_uint32 captureCount;\n    if (ma_context_get_devices(&context, &pPlaybackInfos, &playbackCount, &pCaptureInfos, &captureCount) != MA_SUCCESS) {\n        // Error.\n    }\n\n    // Loop over each device info and do something with it. Here we just print the name with their index. You may want\n    // to give the user the opportunity to choose which device they'd prefer.\n    for (ma_uint32 iDevice = 0; iDevice < playbackCount; iDevice += 1) {\n        printf(\"%d - %s\\n\", iDevice, pPlaybackInfos[iDevice].name);\n    }\n\n    ma_device_config config = ma_device_config_init(ma_device_type_playback);\n    config.playback.pDeviceID = &pPlaybackInfos[chosenPlaybackDeviceIndex].id;\n    config.playback.format    = MY_FORMAT;\n    config.playback.channels  = MY_CHANNEL_COUNT;\n    config.sampleRate         = MY_SAMPLE_RATE;\n    config.dataCallback       = data_callback;\n    config.pUserData          = pMyCustomData;\n\n    ma_device device;\n    if (ma_device_init(&context, &config, &device) != MA_SUCCESS) {\n        // Error\n    }\n\n    ...\n\n    ma_device_uninit(&device);\n    ma_context_uninit(&context);\n    ```\n\nThe first thing we do in this example is initialize a `ma_context` object with `ma_context_init()`.\nThe first parameter is a pointer to a list of `ma_backend` values which are used to override the\ndefault backend priorities. When this is NULL, as in this example, miniaudio's default priorities\nare used. The second parameter is the number of backends listed in the array pointed to by the\nfirst parameter. The third parameter is a pointer to a `ma_context_config` object which can be\nNULL, in which case defaults are used. The context configuration is used for setting the logging\ncallback, custom memory allocation callbacks, user-defined data and some backend-specific\nconfigurations.\n\nOnce the context has been initialized you can enumerate devices. In the example above we use the\nsimpler `ma_context_get_devices()`, however you can also use a callback for handling devices by\nusing `ma_context_enumerate_devices()`. When using `ma_context_get_devices()` you provide a pointer\nto a pointer that will, upon output, be set to a pointer to a buffer containing a list of\n`ma_device_info` structures. You also provide a pointer to an unsigned integer that will receive\nthe number of items in the returned buffer. Do not free the returned buffers as their memory is\nmanaged internally by miniaudio.\n\nThe `ma_device_info` structure contains an `id` member which is the ID you pass to the device\nconfig. It also contains the name of the device which is useful for presenting a list of devices\nto the user via the UI.\n\nWhen creating your own context you will want to pass it to `ma_device_init()` when initializing the\ndevice. Passing in NULL, like we do in the first example, will result in miniaudio creating the\ncontext for you, which you don't want to do since you've already created a context. Note that\ninternally the context is only tracked by it's pointer which means you must not change the location\nof the `ma_context` object. If this is an issue, consider using `malloc()` to allocate memory for\nthe context.\n\n\n1.2. High Level API\n-------------------\nThe high level API consists of three main parts:\n\n  * Resource management for loading and streaming sounds.\n  * A node graph for advanced mixing and effect processing.\n  * A high level \"engine\" that wraps around the resource manager and node graph.\n\nThe resource manager (`ma_resource_manager`) is used for loading sounds. It supports loading sounds\nfully into memory and also streaming. It will also deal with reference counting for you which\navoids the same sound being loaded multiple times.\n\nThe node graph is used for mixing and effect processing. The idea is that you connect a number of\nnodes into the graph by connecting each node's outputs to another node's inputs. Each node can\nimplement it's own effect. By chaining nodes together, advanced mixing and effect processing can\nbe achieved.\n\nThe engine encapsulates both the resource manager and the node graph to create a simple, easy to\nuse high level API. The resource manager and node graph APIs are covered in more later sections of\nthis manual.\n\nThe code below shows how you can initialize an engine using it's default configuration.\n\n    ```c\n    ma_result result;\n    ma_engine engine;\n\n    result = ma_engine_init(NULL, &engine);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to initialize the engine.\n    }\n    ```\n\nThis creates an engine instance which will initialize a device internally which you can access with\n`ma_engine_get_device()`. It will also initialize a resource manager for you which can be accessed\nwith `ma_engine_get_resource_manager()`. The engine itself is a node graph (`ma_node_graph`) which\nmeans you can pass a pointer to the engine object into any of the `ma_node_graph` APIs (with a\ncast). Alternatively, you can use `ma_engine_get_node_graph()` instead of a cast.\n\nNote that all objects in miniaudio, including the `ma_engine` object in the example above, are\ntransparent structures. There are no handles to opaque structures in miniaudio which means you need\nto be mindful of how you declare them. In the example above we are declaring it on the stack, but\nthis will result in the struct being invalidated once the function encapsulating it returns. If\nallocating the engine on the heap is more appropriate, you can easily do so with a standard call\nto `malloc()` or whatever heap allocation routine you like:\n\n    ```c\n    ma_engine* pEngine = malloc(sizeof(*pEngine));\n    ```\n\nThe `ma_engine` API uses the same config/init pattern used all throughout miniaudio. To configure\nan engine, you can fill out a `ma_engine_config` object and pass it into the first parameter of\n`ma_engine_init()`:\n\n    ```c\n    ma_result result;\n    ma_engine engine;\n    ma_engine_config engineConfig;\n\n    engineConfig = ma_engine_config_init();\n    engineConfig.pResourceManager = &myCustomResourceManager;   // <-- Initialized as some earlier stage.\n\n    result = ma_engine_init(&engineConfig, &engine);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n    ```\n\nThis creates an engine instance using a custom config. In this particular example it's showing how\nyou can specify a custom resource manager rather than having the engine initialize one internally.\nThis is particularly useful if you want to have multiple engine's share the same resource manager.\n\nThe engine must be uninitialized with `ma_engine_uninit()` when it's no longer needed.\n\nBy default the engine will be started, but nothing will be playing because no sounds have been\ninitialized. The easiest but least flexible way of playing a sound is like so:\n\n    ```c\n    ma_engine_play_sound(&engine, \"my_sound.wav\", NULL);\n    ```\n\nThis plays what miniaudio calls an \"inline\" sound. It plays the sound once, and then puts the\ninternal sound up for recycling. The last parameter is used to specify which sound group the sound\nshould be associated with which will be explained later. This particular way of playing a sound is\nsimple, but lacks flexibility and features. A more flexible way of playing a sound is to first\ninitialize a sound:\n\n    ```c\n    ma_result result;\n    ma_sound sound;\n\n    result = ma_sound_init_from_file(&engine, \"my_sound.wav\", 0, NULL, NULL, &sound);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    ma_sound_start(&sound);\n    ```\n\nThis returns a `ma_sound` object which represents a single instance of the specified sound file. If\nyou want to play the same file multiple times simultaneously, you need to create one sound for each\ninstance.\n\nSounds should be uninitialized with `ma_sound_uninit()`.\n\nSounds are not started by default. Start a sound with `ma_sound_start()` and stop it with\n`ma_sound_stop()`. When a sound is stopped, it is not rewound to the start. Use\n`ma_sound_seek_to_pcm_frame(&sound, 0)` to seek back to the start of a sound. By default, starting\nand stopping sounds happens immediately, but sometimes it might be convenient to schedule the sound\nthe be started and/or stopped at a specific time. This can be done with the following functions:\n\n    ```c\n    ma_sound_set_start_time_in_pcm_frames()\n    ma_sound_set_start_time_in_milliseconds()\n    ma_sound_set_stop_time_in_pcm_frames()\n    ma_sound_set_stop_time_in_milliseconds()\n    ```\n\nThe start/stop time needs to be specified based on the absolute timer which is controlled by the\nengine. The current global time time in PCM frames can be retrieved with\n`ma_engine_get_time_in_pcm_frames()`. The engine's global time can be changed with\n`ma_engine_set_time_in_pcm_frames()` for synchronization purposes if required. Note that scheduling\na start time still requires an explicit call to `ma_sound_start()` before anything will play:\n\n    ```c\n    ma_sound_set_start_time_in_pcm_frames(&sound, ma_engine_get_time_in_pcm_frames(&engine) + (ma_engine_get_sample_rate(&engine) * 2);\n    ma_sound_start(&sound);\n    ```\n\nThe third parameter of `ma_sound_init_from_file()` is a set of flags that control how the sound be\nloaded and a few options on which features should be enabled for that sound. By default, the sound\nis synchronously loaded fully into memory straight from the file system without any kind of\ndecoding. If you want to decode the sound before storing it in memory, you need to specify the\n`MA_SOUND_FLAG_DECODE` flag. This is useful if you want to incur the cost of decoding at an earlier\nstage, such as a loading stage. Without this option, decoding will happen dynamically at mixing\ntime which might be too expensive on the audio thread.\n\nIf you want to load the sound asynchronously, you can specify the `MA_SOUND_FLAG_ASYNC` flag. This\nwill result in `ma_sound_init_from_file()` returning quickly, but the sound will not start playing\nuntil the sound has had some audio decoded.\n\nThe fourth parameter is a pointer to sound group. A sound group is used as a mechanism to organise\nsounds into groups which have their own effect processing and volume control. An example is a game\nwhich might have separate groups for sfx, voice and music. Each of these groups have their own\nindependent volume control. Use `ma_sound_group_init()` or `ma_sound_group_init_ex()` to initialize\na sound group.\n\nSounds and sound groups are nodes in the engine's node graph and can be plugged into any `ma_node`\nAPI. This makes it possible to connect sounds and sound groups to effect nodes to produce complex\neffect chains.\n\nA sound can have it's volume changed with `ma_sound_set_volume()`. If you prefer decibel volume\ncontrol you can use `ma_volume_db_to_linear()` to convert from decibel representation to linear.\n\nPanning and pitching is supported with `ma_sound_set_pan()` and `ma_sound_set_pitch()`. If you know\na sound will never have it's pitch changed with `ma_sound_set_pitch()` or via the doppler effect,\nyou can specify the `MA_SOUND_FLAG_NO_PITCH` flag when initializing the sound for an optimization.\n\nBy default, sounds and sound groups have spatialization enabled. If you don't ever want to\nspatialize your sounds, initialize the sound with the `MA_SOUND_FLAG_NO_SPATIALIZATION` flag. The\nspatialization model is fairly simple and is roughly on feature parity with OpenAL. HRTF and\nenvironmental occlusion are not currently supported, but planned for the future. The supported\nfeatures include:\n\n  * Sound and listener positioning and orientation with cones\n  * Attenuation models: none, inverse, linear and exponential\n  * Doppler effect\n\nSounds can be faded in and out with `ma_sound_set_fade_in_pcm_frames()`.\n\nTo check if a sound is currently playing, you can use `ma_sound_is_playing()`. To check if a sound\nis at the end, use `ma_sound_at_end()`. Looping of a sound can be controlled with\n`ma_sound_set_looping()`. Use `ma_sound_is_looping()` to check whether or not the sound is looping.\n\n\n\n2. Building\n===========\nminiaudio should work cleanly out of the box without the need to download or install any\ndependencies. See below for platform-specific details.\n\nNote that GCC and Clang require `-msse2`, `-mavx2`, etc. for SIMD optimizations.\n\nIf you get errors about undefined references to `__sync_val_compare_and_swap_8`, `__atomic_load_8`,\netc. you need to link with `-latomic`.\n\n\n2.1. Windows\n------------\nThe Windows build should compile cleanly on all popular compilers without the need to configure any\ninclude paths nor link to any libraries.\n\nThe UWP build may require linking to mmdevapi.lib if you get errors about an unresolved external\nsymbol for `ActivateAudioInterfaceAsync()`.\n\n\n2.2. macOS and iOS\n------------------\nThe macOS build should compile cleanly without the need to download any dependencies nor link to\nany libraries or frameworks. The iOS build needs to be compiled as Objective-C and will need to\nlink the relevant frameworks but should compile cleanly out of the box with Xcode. Compiling\nthrough the command line requires linking to `-lpthread` and `-lm`.\n\nDue to the way miniaudio links to frameworks at runtime, your application may not pass Apple's\nnotarization process. To fix this there are two options. The first is to use the\n`MA_NO_RUNTIME_LINKING` option, like so:\n\n    ```c\n    #ifdef __APPLE__\n        #define MA_NO_RUNTIME_LINKING\n    #endif\n    #define MINIAUDIO_IMPLEMENTATION\n    #include \"miniaudio.h\"\n    ```\n\nThis will require linking with `-framework CoreFoundation -framework CoreAudio -framework AudioToolbox`.\nIf you get errors about AudioToolbox, try with `-framework AudioUnit` instead. You may get this when\nusing older versions of iOS. Alternatively, if you would rather keep using runtime linking you can\nadd the following to your entitlements.xcent file:\n\n    ```\n    <key>com.apple.security.cs.allow-dyld-environment-variables</key>\n    <true/>\n    <key>com.apple.security.cs.allow-unsigned-executable-memory</key>\n    <true/>\n    ```\n\nSee this discussion for more info: https://github.com/mackron/miniaudio/issues/203.\n\n\n2.3. Linux\n----------\nThe Linux build only requires linking to `-ldl`, `-lpthread` and `-lm`. You do not need any\ndevelopment packages. You may need to link with `-latomic` if you're compiling for 32-bit ARM.\n\n\n2.4. BSD\n--------\nThe BSD build only requires linking to `-lpthread` and `-lm`. NetBSD uses audio(4), OpenBSD uses\nsndio and FreeBSD uses OSS. You may need to link with `-latomic` if you're compiling for 32-bit\nARM.\n\n\n2.5. Android\n------------\nAAudio is the highest priority backend on Android. This should work out of the box without needing\nany kind of compiler configuration. Support for AAudio starts with Android 8 which means older\nversions will fall back to OpenSL|ES which requires API level 16+.\n\nThere have been reports that the OpenSL|ES backend fails to initialize on some Android based\ndevices due to `dlopen()` failing to open \"libOpenSLES.so\". If this happens on your platform\nyou'll need to disable run-time linking with `MA_NO_RUNTIME_LINKING` and link with -lOpenSLES.\n\n\n2.6. Emscripten\n---------------\nThe Emscripten build emits Web Audio JavaScript directly and should compile cleanly out of the box.\nYou cannot use `-std=c*` compiler flags, nor `-ansi`.\n\nYou can enable the use of AudioWorkets by defining `MA_ENABLE_AUDIO_WORKLETS` and then compiling\nwith the following options:\n\n    -sAUDIO_WORKLET=1 -sWASM_WORKERS=1 -sASYNCIFY\n\nAn example for compiling with AudioWorklet support might look like this:\n\n    emcc program.c -o bin/program.html -DMA_ENABLE_AUDIO_WORKLETS -sAUDIO_WORKLET=1 -sWASM_WORKERS=1 -sASYNCIFY\n\nTo run locally, you'll need to use emrun:\n\n    emrun bin/program.html\n\n\n\n2.7. Build Options\n------------------\n`#define` these options before including miniaudio.h.\n\n    +----------------------------------+--------------------------------------------------------------------+\n    | Option                           | Description                                                        |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_WASAPI                     | Disables the WASAPI backend.                                       |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_DSOUND                     | Disables the DirectSound backend.                                  |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_WINMM                      | Disables the WinMM backend.                                        |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_ALSA                       | Disables the ALSA backend.                                         |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_PULSEAUDIO                 | Disables the PulseAudio backend.                                   |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_JACK                       | Disables the JACK backend.                                         |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_COREAUDIO                  | Disables the Core Audio backend.                                   |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_SNDIO                      | Disables the sndio backend.                                        |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_AUDIO4                     | Disables the audio(4) backend.                                     |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_OSS                        | Disables the OSS backend.                                          |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_AAUDIO                     | Disables the AAudio backend.                                       |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_OPENSL                     | Disables the OpenSL|ES backend.                                    |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_WEBAUDIO                   | Disables the Web Audio backend.                                    |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_NULL                       | Disables the null backend.                                         |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_ONLY_SPECIFIC_BACKENDS | Disables all backends by default and requires `MA_ENABLE_*` to     |\n    |                                  | enable specific backends.                                          |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_WASAPI                 | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the WASAPI backend.                                         |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_DSOUND                 | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the DirectSound backend.                                    |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_WINMM                  | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the WinMM backend.                                          |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_ALSA                   | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the ALSA backend.                                           |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_PULSEAUDIO             | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the PulseAudio backend.                                     |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_JACK                   | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the JACK backend.                                           |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_COREAUDIO              | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the Core Audio backend.                                     |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_SNDIO                  | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the sndio backend.                                          |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_AUDIO4                 | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the audio(4) backend.                                       |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_OSS                    | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the OSS backend.                                            |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_AAUDIO                 | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the AAudio backend.                                         |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_OPENSL                 | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the OpenSL|ES backend.                                      |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_WEBAUDIO               | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the Web Audio backend.                                      |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_ENABLE_NULL                   | Used in conjunction with MA_ENABLE_ONLY_SPECIFIC_BACKENDS to       |\n    |                                  | enable the null backend.                                           |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_DECODING                   | Disables decoding APIs.                                            |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_ENCODING                   | Disables encoding APIs.                                            |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_WAV                        | Disables the built-in WAV decoder and encoder.                     |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_FLAC                       | Disables the built-in FLAC decoder.                                |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_MP3                        | Disables the built-in MP3 decoder.                                 |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_DEVICE_IO                  | Disables playback and recording. This will disable `ma_context`    |\n    |                                  | and `ma_device` APIs. This is useful if you only want to use       |\n    |                                  | miniaudio's data conversion and/or decoding APIs.                  |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_RESOURCE_MANAGER           | Disables the resource manager. When using the engine this will     |\n    |                                  | also disable the following functions:                              |\n    |                                  |                                                                    |\n    |                                  | ```                                                                |\n    |                                  | ma_sound_init_from_file()                                          |\n    |                                  | ma_sound_init_from_file_w()                                        |\n    |                                  | ma_sound_init_copy()                                               |\n    |                                  | ma_engine_play_sound_ex()                                          |\n    |                                  | ma_engine_play_sound()                                             |\n    |                                  | ```                                                                |\n    |                                  |                                                                    |\n    |                                  | The only way to initialize a `ma_sound` object is to initialize it |\n    |                                  | from a data source.                                                |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_NODE_GRAPH                 | Disables the node graph API. This will also disable the engine API |\n    |                                  | because it depends on the node graph.                              |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_ENGINE                     | Disables the engine API.                                           |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_THREADING                  | Disables the `ma_thread`, `ma_mutex`, `ma_semaphore` and           |\n    |                                  | `ma_event` APIs. This option is useful if you only need to use     |\n    |                                  | miniaudio for data conversion, decoding and/or encoding. Some      |\n    |                                  | families of APIs require threading which means the following       |\n    |                                  | options must also be set:                                          |\n    |                                  |                                                                    |\n    |                                  |     ```                                                            |\n    |                                  |     MA_NO_DEVICE_IO                                                |\n    |                                  |     ```                                                            |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_GENERATION                 | Disables generation APIs such a `ma_waveform` and `ma_noise`.      |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_SSE2                       | Disables SSE2 optimizations.                                       |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_AVX2                       | Disables AVX2 optimizations.                                       |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_NEON                       | Disables NEON optimizations.                                       |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_NO_RUNTIME_LINKING            | Disables runtime linking. This is useful for passing Apple's       |\n    |                                  | notarization process. When enabling this, you may need to avoid    |\n    |                                  | using `-std=c89` or `-std=c99` on Linux builds or else you may end |\n    |                                  | up with compilation errors due to conflicts with `timespec` and    |\n    |                                  | `timeval` data types.                                              |\n    |                                  |                                                                    |\n    |                                  | You may need to enable this if your target platform does not allow |\n    |                                  | runtime linking via `dlopen()`.                                    |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_DEBUG_OUTPUT                  | Enable `printf()` output of debug logs (`MA_LOG_LEVEL_DEBUG`).     |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_COINIT_VALUE                  | Windows only. The value to pass to internal calls to               |\n    |                                  | `CoInitializeEx()`. Defaults to `COINIT_MULTITHREADED`.            |\n    +----------------------------------+--------------------------------------------------------------------+\n    | MA_API                           | Controls how public APIs should be decorated. Default is `extern`. |\n    +----------------------------------+--------------------------------------------------------------------+\n\n\n3. Definitions\n==============\nThis section defines common terms used throughout miniaudio. Unfortunately there is often ambiguity\nin the use of terms throughout the audio space, so this section is intended to clarify how miniaudio\nuses each term.\n\n3.1. Sample\n-----------\nA sample is a single unit of audio data. If the sample format is f32, then one sample is one 32-bit\nfloating point number.\n\n3.2. Frame / PCM Frame\n----------------------\nA frame is a group of samples equal to the number of channels. For a stereo stream a frame is 2\nsamples, a mono frame is 1 sample, a 5.1 surround sound frame is 6 samples, etc. The terms \"frame\"\nand \"PCM frame\" are the same thing in miniaudio. Note that this is different to a compressed frame.\nIf ever miniaudio needs to refer to a compressed frame, such as a FLAC frame, it will always\nclarify what it's referring to with something like \"FLAC frame\".\n\n3.3. Channel\n------------\nA stream of monaural audio that is emitted from an individual speaker in a speaker system, or\nreceived from an individual microphone in a microphone system. A stereo stream has two channels (a\nleft channel, and a right channel), a 5.1 surround sound system has 6 channels, etc. Some audio\nsystems refer to a channel as a complex audio stream that's mixed with other channels to produce\nthe final mix - this is completely different to miniaudio's use of the term \"channel\" and should\nnot be confused.\n\n3.4. Sample Rate\n----------------\nThe sample rate in miniaudio is always expressed in Hz, such as 44100, 48000, etc. It's the number\nof PCM frames that are processed per second.\n\n3.5. Formats\n------------\nThroughout miniaudio you will see references to different sample formats:\n\n    +---------------+----------------------------------------+---------------------------+\n    | Symbol        | Description                            | Range                     |\n    +---------------+----------------------------------------+---------------------------+\n    | ma_format_f32 | 32-bit floating point                  | [-1, 1]                   |\n    | ma_format_s16 | 16-bit signed integer                  | [-32768, 32767]           |\n    | ma_format_s24 | 24-bit signed integer (tightly packed) | [-8388608, 8388607]       |\n    | ma_format_s32 | 32-bit signed integer                  | [-2147483648, 2147483647] |\n    | ma_format_u8  | 8-bit unsigned integer                 | [0, 255]                  |\n    +---------------+----------------------------------------+---------------------------+\n\nAll formats are native-endian.\n\n\n\n4. Data Sources\n===============\nThe data source abstraction in miniaudio is used for retrieving audio data from some source. A few\nexamples include `ma_decoder`, `ma_noise` and `ma_waveform`. You will need to be familiar with data\nsources in order to make sense of some of the higher level concepts in miniaudio.\n\nThe `ma_data_source` API is a generic interface for reading from a data source. Any object that\nimplements the data source interface can be plugged into any `ma_data_source` function.\n\nTo read data from a data source:\n\n    ```c\n    ma_result result;\n    ma_uint64 framesRead;\n\n    result = ma_data_source_read_pcm_frames(pDataSource, pFramesOut, frameCount, &framesRead);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to read data from the data source.\n    }\n    ```\n\nIf you don't need the number of frames that were successfully read you can pass in `NULL` to the\n`pFramesRead` parameter. If this returns a value less than the number of frames requested it means\nthe end of the file has been reached. `MA_AT_END` will be returned only when the number of frames\nread is 0.\n\nWhen calling any data source function, with the exception of `ma_data_source_init()` and\n`ma_data_source_uninit()`, you can pass in any object that implements a data source. For example,\nyou could plug in a decoder like so:\n\n    ```c\n    ma_result result;\n    ma_uint64 framesRead;\n    ma_decoder decoder;   // <-- This would be initialized with `ma_decoder_init_*()`.\n\n    result = ma_data_source_read_pcm_frames(&decoder, pFramesOut, frameCount, &framesRead);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to read data from the decoder.\n    }\n    ```\n\nIf you want to seek forward you can pass in `NULL` to the `pFramesOut` parameter. Alternatively you\ncan use `ma_data_source_seek_pcm_frames()`.\n\nTo seek to a specific PCM frame:\n\n    ```c\n    result = ma_data_source_seek_to_pcm_frame(pDataSource, frameIndex);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to seek to PCM frame.\n    }\n    ```\n\nYou can retrieve the total length of a data source in PCM frames, but note that some data sources\nmay not have the notion of a length, such as noise and waveforms, and others may just not have a\nway of determining the length such as some decoders. To retrieve the length:\n\n    ```c\n    ma_uint64 length;\n\n    result = ma_data_source_get_length_in_pcm_frames(pDataSource, &length);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to retrieve the length.\n    }\n    ```\n\nCare should be taken when retrieving the length of a data source where the underlying decoder is\npulling data from a data stream with an undefined length, such as internet radio or some kind of\nbroadcast. If you do this, `ma_data_source_get_length_in_pcm_frames()` may never return.\n\nThe current position of the cursor in PCM frames can also be retrieved:\n\n    ```c\n    ma_uint64 cursor;\n\n    result = ma_data_source_get_cursor_in_pcm_frames(pDataSource, &cursor);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to retrieve the cursor.\n    }\n    ```\n\nYou will often need to know the data format that will be returned after reading. This can be\nretrieved like so:\n\n    ```c\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_channel channelMap[MA_MAX_CHANNELS];\n\n    result = ma_data_source_get_data_format(pDataSource, &format, &channels, &sampleRate, channelMap, MA_MAX_CHANNELS);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to retrieve data format.\n    }\n    ```\n\nIf you do not need a specific data format property, just pass in NULL to the respective parameter.\n\nThere may be cases where you want to implement something like a sound bank where you only want to\nread data within a certain range of the underlying data. To do this you can use a range:\n\n    ```c\n    result = ma_data_source_set_range_in_pcm_frames(pDataSource, rangeBegInFrames, rangeEndInFrames);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to set the range.\n    }\n    ```\n\nThis is useful if you have a sound bank where many sounds are stored in the same file and you want\nthe data source to only play one of those sub-sounds. Note that once the range is set, everything\nthat takes a position, such as cursors and loop points, should always be relatvie to the start of\nthe range. When the range is set, any previously defined loop point will be reset.\n\nCustom loop points can also be used with data sources. By default, data sources will loop after\nthey reach the end of the data source, but if you need to loop at a specific location, you can do\nthe following:\n\n    ```c\n    result = ma_data_set_loop_point_in_pcm_frames(pDataSource, loopBegInFrames, loopEndInFrames);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to set the loop point.\n    }\n    ```\n\nThe loop point is relative to the current range.\n\nIt's sometimes useful to chain data sources together so that a seamless transition can be achieved.\nTo do this, you can use chaining:\n\n    ```c\n    ma_decoder decoder1;\n    ma_decoder decoder2;\n\n    // ... initialize decoders with ma_decoder_init_*() ...\n\n    result = ma_data_source_set_next(&decoder1, &decoder2);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to set the next data source.\n    }\n\n    result = ma_data_source_read_pcm_frames(&decoder1, pFramesOut, frameCount, pFramesRead);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to read from the decoder.\n    }\n    ```\n\nIn the example above we're using decoders. When reading from a chain, you always want to read from\nthe top level data source in the chain. In the example above, `decoder1` is the top level data\nsource in the chain. When `decoder1` reaches the end, `decoder2` will start seamlessly without any\ngaps.\n\nNote that when looping is enabled, only the current data source will be looped. You can loop the\nentire chain by linking in a loop like so:\n\n    ```c\n    ma_data_source_set_next(&decoder1, &decoder2);  // decoder1 -> decoder2\n    ma_data_source_set_next(&decoder2, &decoder1);  // decoder2 -> decoder1 (loop back to the start).\n    ```\n\nNote that setting up chaining is not thread safe, so care needs to be taken if you're dynamically\nchanging links while the audio thread is in the middle of reading.\n\nDo not use `ma_decoder_seek_to_pcm_frame()` as a means to reuse a data source to play multiple\ninstances of the same sound simultaneously. This can be extremely inefficient depending on the type\nof data source and can result in glitching due to subtle changes to the state of internal filters.\nInstead, initialize multiple data sources for each instance.\n\n\n4.1. Custom Data Sources\n------------------------\nYou can implement a custom data source by implementing the functions in `ma_data_source_vtable`.\nYour custom object must have `ma_data_source_base` as it's first member:\n\n    ```c\n    struct my_data_source\n    {\n        ma_data_source_base base;\n        ...\n    };\n    ```\n\nIn your initialization routine, you need to call `ma_data_source_init()` in order to set up the\nbase object (`ma_data_source_base`):\n\n    ```c\n    static ma_result my_data_source_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n    {\n        // Read data here. Output in the same format returned by my_data_source_get_data_format().\n    }\n\n    static ma_result my_data_source_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)\n    {\n        // Seek to a specific PCM frame here. Return MA_NOT_IMPLEMENTED if seeking is not supported.\n    }\n\n    static ma_result my_data_source_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n    {\n        // Return the format of the data here.\n    }\n\n    static ma_result my_data_source_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)\n    {\n        // Retrieve the current position of the cursor here. Return MA_NOT_IMPLEMENTED and set *pCursor to 0 if there is no notion of a cursor.\n    }\n\n    static ma_result my_data_source_get_length(ma_data_source* pDataSource, ma_uint64* pLength)\n    {\n        // Retrieve the length in PCM frames here. Return MA_NOT_IMPLEMENTED and set *pLength to 0 if there is no notion of a length or if the length is unknown.\n    }\n\n    static ma_data_source_vtable g_my_data_source_vtable =\n    {\n        my_data_source_read,\n        my_data_source_seek,\n        my_data_source_get_data_format,\n        my_data_source_get_cursor,\n        my_data_source_get_length\n    };\n\n    ma_result my_data_source_init(my_data_source* pMyDataSource)\n    {\n        ma_result result;\n        ma_data_source_config baseConfig;\n\n        baseConfig = ma_data_source_config_init();\n        baseConfig.vtable = &g_my_data_source_vtable;\n\n        result = ma_data_source_init(&baseConfig, &pMyDataSource->base);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        // ... do the initialization of your custom data source here ...\n\n        return MA_SUCCESS;\n    }\n\n    void my_data_source_uninit(my_data_source* pMyDataSource)\n    {\n        // ... do the uninitialization of your custom data source here ...\n\n        // You must uninitialize the base data source.\n        ma_data_source_uninit(&pMyDataSource->base);\n    }\n    ```\n\nNote that `ma_data_source_init()` and `ma_data_source_uninit()` are never called directly outside\nof the custom data source. It's up to the custom data source itself to call these within their own\ninit/uninit functions.\n\n\n\n5. Engine\n=========\nThe `ma_engine` API is a high level API for managing and mixing sounds and effect processing. The\n`ma_engine` object encapsulates a resource manager and a node graph, both of which will be\nexplained in more detail later.\n\nSounds are called `ma_sound` and are created from an engine. Sounds can be associated with a mixing\ngroup called `ma_sound_group` which are also created from the engine. Both `ma_sound` and\n`ma_sound_group` objects are nodes within the engine's node graph.\n\nWhen the engine is initialized, it will normally create a device internally. If you would rather\nmanage the device yourself, you can do so and just pass a pointer to it via the engine config when\nyou initialize the engine. You can also just use the engine without a device, which again can be\nconfigured via the engine config.\n\nThe most basic way to initialize the engine is with a default config, like so:\n\n    ```c\n    ma_result result;\n    ma_engine engine;\n\n    result = ma_engine_init(NULL, &engine);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to initialize the engine.\n    }\n    ```\n\nThis will result in the engine initializing a playback device using the operating system's default\ndevice. This will be sufficient for many use cases, but if you need more flexibility you'll want to\nconfigure the engine with an engine config:\n\n    ```c\n    ma_result result;\n    ma_engine engine;\n    ma_engine_config engineConfig;\n\n    engineConfig = ma_engine_config_init();\n    engineConfig.pDevice = &myDevice;\n\n    result = ma_engine_init(&engineConfig, &engine);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to initialize the engine.\n    }\n    ```\n\nIn the example above we're passing in a pre-initialized device. Since the caller is the one in\ncontrol of the device's data callback, it's their responsibility to manually call\n`ma_engine_read_pcm_frames()` from inside their data callback:\n\n    ```c\n    void playback_data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount)\n    {\n        ma_engine_read_pcm_frames(&g_Engine, pOutput, frameCount, NULL);\n    }\n    ```\n\nYou can also use the engine independent of a device entirely:\n\n    ```c\n    ma_result result;\n    ma_engine engine;\n    ma_engine_config engineConfig;\n\n    engineConfig = ma_engine_config_init();\n    engineConfig.noDevice   = MA_TRUE;\n    engineConfig.channels   = 2;        // Must be set when not using a device.\n    engineConfig.sampleRate = 48000;    // Must be set when not using a device.\n\n    result = ma_engine_init(&engineConfig, &engine);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to initialize the engine.\n    }\n    ```\n\nNote that when you're not using a device, you must set the channel count and sample rate in the\nconfig or else miniaudio won't know what to use (miniaudio will use the device to determine this\nnormally). When not using a device, you need to use `ma_engine_read_pcm_frames()` to process audio\ndata from the engine. This kind of setup is useful if you want to do something like offline\nprocessing or want to use a different audio system for playback such as SDL.\n\nWhen a sound is loaded it goes through a resource manager. By default the engine will initialize a\nresource manager internally, but you can also specify a pre-initialized resource manager:\n\n    ```c\n    ma_result result;\n    ma_engine engine1;\n    ma_engine engine2;\n    ma_engine_config engineConfig;\n\n    engineConfig = ma_engine_config_init();\n    engineConfig.pResourceManager = &myResourceManager;\n\n    ma_engine_init(&engineConfig, &engine1);\n    ma_engine_init(&engineConfig, &engine2);\n    ```\n\nIn this example we are initializing two engines, both of which are sharing the same resource\nmanager. This is especially useful for saving memory when loading the same file across multiple\nengines. If you were not to use a shared resource manager, each engine instance would use their own\nwhich would result in any sounds that are used between both engine's being loaded twice. By using\na shared resource manager, it would only be loaded once. Using multiple engine's is useful when you\nneed to output to multiple playback devices, such as in a local multiplayer game where each player\nis using their own set of headphones.\n\nBy default an engine will be in a started state. To make it so the engine is not automatically\nstarted you can configure it as such:\n\n    ```c\n    engineConfig.noAutoStart = MA_TRUE;\n\n    // The engine will need to be started manually.\n    ma_engine_start(&engine);\n\n    // Later on the engine can be stopped with ma_engine_stop().\n    ma_engine_stop(&engine);\n    ```\n\nThe concept of starting or stopping an engine is only relevant when using the engine with a\ndevice. Attempting to start or stop an engine that is not associated with a device will result in\n`MA_INVALID_OPERATION`.\n\nThe master volume of the engine can be controlled with `ma_engine_set_volume()` which takes a\nlinear scale, with 0 resulting in silence and anything above 1 resulting in amplification. If you\nprefer decibel based volume control, use `ma_volume_db_to_linear()` to convert from dB to linear.\n\nWhen a sound is spatialized, it is done so relative to a listener. An engine can be configured to\nhave multiple listeners which can be configured via the config:\n\n    ```c\n    engineConfig.listenerCount = 2;\n    ```\n\nThe maximum number of listeners is restricted to `MA_ENGINE_MAX_LISTENERS`. By default, when a\nsound is spatialized, it will be done so relative to the closest listener. You can also pin a sound\nto a specific listener which will be explained later. Listener's have a position, direction, cone,\nand velocity (for doppler effect). A listener is referenced by an index, the meaning of which is up\nto the caller (the index is 0 based and cannot go beyond the listener count, minus 1). The\nposition, direction and velocity are all specified in absolute terms:\n\n    ```c\n    ma_engine_listener_set_position(&engine, listenerIndex, worldPosX, worldPosY, worldPosZ);\n    ```\n\nThe direction of the listener represents it's forward vector. The listener's up vector can also be\nspecified and defaults to +1 on the Y axis.\n\n    ```c\n    ma_engine_listener_set_direction(&engine, listenerIndex, forwardX, forwardY, forwardZ);\n    ma_engine_listener_set_world_up(&engine, listenerIndex, 0, 1, 0);\n    ```\n\nThe engine supports directional attenuation. The listener can have a cone the controls how sound is\nattenuated based on the listener's direction. When a sound is between the inner and outer cones, it\nwill be attenuated between 1 and the cone's outer gain:\n\n    ```c\n    ma_engine_listener_set_cone(&engine, listenerIndex, innerAngleInRadians, outerAngleInRadians, outerGain);\n    ```\n\nWhen a sound is inside the inner code, no directional attenuation is applied. When the sound is\noutside of the outer cone, the attenuation will be set to `outerGain` in the example above. When\nthe sound is in between the inner and outer cones, the attenuation will be interpolated between 1\nand the outer gain.\n\nThe engine's coordinate system follows the OpenGL coordinate system where positive X points right,\npositive Y points up and negative Z points forward.\n\nThe simplest and least flexible way to play a sound is like so:\n\n    ```c\n    ma_engine_play_sound(&engine, \"my_sound.wav\", pGroup);\n    ```\n\nThis is a \"fire and forget\" style of function. The engine will manage the `ma_sound` object\ninternally. When the sound finishes playing, it'll be put up for recycling. For more flexibility\nyou'll want to initialize a sound object:\n\n    ```c\n    ma_sound sound;\n\n    result = ma_sound_init_from_file(&engine, \"my_sound.wav\", flags, pGroup, NULL, &sound);\n    if (result != MA_SUCCESS) {\n        return result;  // Failed to load sound.\n    }\n    ```\n\nSounds need to be uninitialized with `ma_sound_uninit()`.\n\nThe example above loads a sound from a file. If the resource manager has been disabled you will not\nbe able to use this function and instead you'll need to initialize a sound directly from a data\nsource:\n\n    ```c\n    ma_sound sound;\n\n    result = ma_sound_init_from_data_source(&engine, &dataSource, flags, pGroup, &sound);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n    ```\n\nEach `ma_sound` object represents a single instance of the sound. If you want to play the same\nsound multiple times at the same time, you need to initialize a separate `ma_sound` object.\n\nFor the most flexibility when initializing sounds, use `ma_sound_init_ex()`. This uses miniaudio's\nstandard config/init pattern:\n\n    ```c\n    ma_sound sound;\n    ma_sound_config soundConfig;\n\n    soundConfig = ma_sound_config_init();\n    soundConfig.pFilePath   = NULL; // Set this to load from a file path.\n    soundConfig.pDataSource = NULL; // Set this to initialize from an existing data source.\n    soundConfig.pInitialAttachment = &someNodeInTheNodeGraph;\n    soundConfig.initialAttachmentInputBusIndex = 0;\n    soundConfig.channelsIn  = 1;\n    soundConfig.channelsOut = 0;    // Set to 0 to use the engine's native channel count.\n\n    result = ma_sound_init_ex(&soundConfig, &sound);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n    ```\n\nIn the example above, the sound is being initialized without a file nor a data source. This is\nvalid, in which case the sound acts as a node in the middle of the node graph. This means you can\nconnect other sounds to this sound and allow it to act like a sound group. Indeed, this is exactly\nwhat a `ma_sound_group` is.\n\nWhen loading a sound, you specify a set of flags that control how the sound is loaded and what\nfeatures are enabled for that sound. When no flags are set, the sound will be fully loaded into\nmemory in exactly the same format as how it's stored on the file system. The resource manager will\nallocate a block of memory and then load the file directly into it. When reading audio data, it\nwill be decoded dynamically on the fly. In order to save processing time on the audio thread, it\nmight be beneficial to pre-decode the sound. You can do this with the `MA_SOUND_FLAG_DECODE` flag:\n\n    ```c\n    ma_sound_init_from_file(&engine, \"my_sound.wav\", MA_SOUND_FLAG_DECODE, pGroup, NULL, &sound);\n    ```\n\nBy default, sounds will be loaded synchronously, meaning `ma_sound_init_*()` will not return until\nthe sound has been fully loaded. If this is prohibitive you can instead load sounds asynchronously\nby specifying the `MA_SOUND_FLAG_ASYNC` flag:\n\n    ```c\n    ma_sound_init_from_file(&engine, \"my_sound.wav\", MA_SOUND_FLAG_DECODE | MA_SOUND_FLAG_ASYNC, pGroup, NULL, &sound);\n    ```\n\nThis will result in `ma_sound_init_*()` returning quickly, but the sound won't yet have been fully\nloaded. When you start the sound, it won't output anything until some sound is available. The sound\nwill start outputting audio before the sound has been fully decoded when the `MA_SOUND_FLAG_DECODE`\nis specified.\n\nIf you need to wait for an asynchronously loaded sound to be fully loaded, you can use a fence. A\nfence in miniaudio is a simple synchronization mechanism which simply blocks until it's internal\ncounter hit's zero. You can specify a fence like so:\n\n    ```c\n    ma_result result;\n    ma_fence fence;\n    ma_sound sounds[4];\n\n    result = ma_fence_init(&fence);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    // Load some sounds asynchronously.\n    for (int iSound = 0; iSound < 4; iSound += 1) {\n        ma_sound_init_from_file(&engine, mySoundFilesPaths[iSound], MA_SOUND_FLAG_DECODE | MA_SOUND_FLAG_ASYNC, pGroup, &fence, &sounds[iSound]);\n    }\n\n    // ... do some other stuff here in the mean time ...\n\n    // Wait for all sounds to finish loading.\n    ma_fence_wait(&fence);\n    ```\n\nIf loading the entire sound into memory is prohibitive, you can also configure the engine to stream\nthe audio data:\n\n    ```c\n    ma_sound_init_from_file(&engine, \"my_sound.wav\", MA_SOUND_FLAG_STREAM, pGroup, NULL, &sound);\n    ```\n\nWhen streaming sounds, 2 seconds worth of audio data is stored in memory. Although it should work\nfine, it's inefficient to use streaming for short sounds. Streaming is useful for things like music\ntracks in games.\n\nWhen loading a sound from a file path, the engine will reference count the file to prevent it from\nbeing loaded if it's already in memory. When you uninitialize a sound, the reference count will be\ndecremented, and if it hits zero, the sound will be unloaded from memory. This reference counting\nsystem is not used for streams. The engine will use a 64-bit hash of the file name when comparing\nfile paths which means there's a small chance you might encounter a name collision. If this is an\nissue, you'll need to use a different name for one of the colliding file paths, or just not load\nfrom files and instead load from a data source.\n\nYou can use `ma_sound_init_copy()` to initialize a copy of another sound. Note, however, that this\nonly works for sounds that were initialized with `ma_sound_init_from_file()` and without the\n`MA_SOUND_FLAG_STREAM` flag.\n\nWhen you initialize a sound, if you specify a sound group the sound will be attached to that group\nautomatically. If you set it to NULL, it will be automatically attached to the engine's endpoint.\nIf you would instead rather leave the sound unattached by default, you can can specify the\n`MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT` flag. This is useful if you want to set up a complex node\ngraph.\n\nSounds are not started by default. To start a sound, use `ma_sound_start()`. Stop a sound with\n`ma_sound_stop()`.\n\nSounds can have their volume controlled with `ma_sound_set_volume()` in the same way as the\nengine's master volume.\n\nSounds support stereo panning and pitching. Set the pan with `ma_sound_set_pan()`. Setting the pan\nto 0 will result in an unpanned sound. Setting it to -1 will shift everything to the left, whereas\n+1 will shift it to the right. The pitch can be controlled with `ma_sound_set_pitch()`. A larger\nvalue will result in a higher pitch. The pitch must be greater than 0.\n\nThe engine supports 3D spatialization of sounds. By default sounds will have spatialization\nenabled, but if a sound does not need to be spatialized it's best to disable it. There are two ways\nto disable spatialization of a sound:\n\n    ```c\n    // Disable spatialization at initialization time via a flag:\n    ma_sound_init_from_file(&engine, \"my_sound.wav\", MA_SOUND_FLAG_NO_SPATIALIZATION, NULL, NULL, &sound);\n\n    // Dynamically disable or enable spatialization post-initialization:\n    ma_sound_set_spatialization_enabled(&sound, isSpatializationEnabled);\n    ```\n\nBy default sounds will be spatialized based on the closest listener. If a sound should always be\nspatialized relative to a specific listener it can be pinned to one:\n\n    ```c\n    ma_sound_set_pinned_listener_index(&sound, listenerIndex);\n    ```\n\nLike listeners, sounds have a position. By default, the position of a sound is in absolute space,\nbut it can be changed to be relative to a listener:\n\n    ```c\n    ma_sound_set_positioning(&sound, ma_positioning_relative);\n    ```\n\nNote that relative positioning of a sound only makes sense if there is either only one listener, or\nthe sound is pinned to a specific listener. To set the position of a sound:\n\n    ```c\n    ma_sound_set_position(&sound, posX, posY, posZ);\n    ```\n\nThe direction works the same way as a listener and represents the sound's forward direction:\n\n    ```c\n    ma_sound_set_direction(&sound, forwardX, forwardY, forwardZ);\n    ```\n\nSound's also have a cone for controlling directional attenuation. This works exactly the same as\nlisteners:\n\n    ```c\n    ma_sound_set_cone(&sound, innerAngleInRadians, outerAngleInRadians, outerGain);\n    ```\n\nThe velocity of a sound is used for doppler effect and can be set as such:\n\n    ```c\n    ma_sound_set_velocity(&sound, velocityX, velocityY, velocityZ);\n    ```\n\nThe engine supports different attenuation models which can be configured on a per-sound basis. By\ndefault the attenuation model is set to `ma_attenuation_model_inverse` which is the equivalent to\nOpenAL's `AL_INVERSE_DISTANCE_CLAMPED`. Configure the attenuation model like so:\n\n    ```c\n    ma_sound_set_attenuation_model(&sound, ma_attenuation_model_inverse);\n    ```\n\nThe supported attenuation models include the following:\n\n    +----------------------------------+----------------------------------------------+\n    | ma_attenuation_model_none        | No distance attenuation.                     |\n    +----------------------------------+----------------------------------------------+\n    | ma_attenuation_model_inverse     | Equivalent to `AL_INVERSE_DISTANCE_CLAMPED`. |\n    +----------------------------------+----------------------------------------------+\n    | ma_attenuation_model_linear      | Linear attenuation.                          |\n    +----------------------------------+----------------------------------------------+\n    | ma_attenuation_model_exponential | Exponential attenuation.                     |\n    +----------------------------------+----------------------------------------------+\n\nTo control how quickly a sound rolls off as it moves away from the listener, you need to configure\nthe rolloff:\n\n    ```c\n    ma_sound_set_rolloff(&sound, rolloff);\n    ```\n\nYou can control the minimum and maximum gain to apply from spatialization:\n\n    ```c\n    ma_sound_set_min_gain(&sound, minGain);\n    ma_sound_set_max_gain(&sound, maxGain);\n    ```\n\nLikewise, in the calculation of attenuation, you can control the minimum and maximum distances for\nthe attenuation calculation. This is useful if you want to ensure sounds don't drop below a certain\nvolume after the listener moves further away and to have sounds play a maximum volume when the\nlistener is within a certain distance:\n\n    ```c\n    ma_sound_set_min_distance(&sound, minDistance);\n    ma_sound_set_max_distance(&sound, maxDistance);\n    ```\n\nThe engine's spatialization system supports doppler effect. The doppler factor can be configure on\na per-sound basis like so:\n\n    ```c\n    ma_sound_set_doppler_factor(&sound, dopplerFactor);\n    ```\n\nYou can fade sounds in and out with `ma_sound_set_fade_in_pcm_frames()` and\n`ma_sound_set_fade_in_milliseconds()`. Set the volume to -1 to use the current volume as the\nstarting volume:\n\n    ```c\n    // Fade in over 1 second.\n    ma_sound_set_fade_in_milliseconds(&sound, 0, 1, 1000);\n\n    // ... sometime later ...\n\n    // Fade out over 1 second, starting from the current volume.\n    ma_sound_set_fade_in_milliseconds(&sound, -1, 0, 1000);\n    ```\n\nBy default sounds will start immediately, but sometimes for timing and synchronization purposes it\ncan be useful to schedule a sound to start or stop:\n\n    ```c\n    // Start the sound in 1 second from now.\n    ma_sound_set_start_time_in_pcm_frames(&sound, ma_engine_get_time_in_pcm_frames(&engine) + (ma_engine_get_sample_rate(&engine) * 1));\n\n    // Stop the sound in 2 seconds from now.\n    ma_sound_set_stop_time_in_pcm_frames(&sound, ma_engine_get_time_in_pcm_frames(&engine) + (ma_engine_get_sample_rate(&engine) * 2));\n    ```\n\nNote that scheduling a start time still requires an explicit call to `ma_sound_start()` before\nanything will play.\n\nThe time is specified in global time which is controlled by the engine. You can get the engine's\ncurrent time with `ma_engine_get_time_in_pcm_frames()`. The engine's global time is incremented\nautomatically as audio data is read, but it can be reset with `ma_engine_set_time_in_pcm_frames()`\nin case it needs to be resynchronized for some reason.\n\nTo determine whether or not a sound is currently playing, use `ma_sound_is_playing()`. This will\ntake the scheduled start and stop times into account.\n\nWhether or not a sound should loop can be controlled with `ma_sound_set_looping()`. Sounds will not\nbe looping by default. Use `ma_sound_is_looping()` to determine whether or not a sound is looping.\n\nUse `ma_sound_at_end()` to determine whether or not a sound is currently at the end. For a looping\nsound this should never return true. Alternatively, you can configure a callback that will be fired\nwhen the sound reaches the end. Note that the callback is fired from the audio thread which means\nyou cannot be uninitializing sound from the callback. To set the callback you can use\n`ma_sound_set_end_callback()`. Alternatively, if you're using `ma_sound_init_ex()`, you can pass it\ninto the config like so:\n\n    ```c\n    soundConfig.endCallback = my_end_callback;\n    soundConfig.pEndCallbackUserData = pMyEndCallbackUserData;\n    ```\n\nThe end callback is declared like so:\n\n    ```c\n    void my_end_callback(void* pUserData, ma_sound* pSound)\n    {\n        ...\n    }\n    ```\n\nInternally a sound wraps around a data source. Some APIs exist to control the underlying data\nsource, mainly for convenience:\n\n    ```c\n    ma_sound_seek_to_pcm_frame(&sound, frameIndex);\n    ma_sound_get_data_format(&sound, &format, &channels, &sampleRate, pChannelMap, channelMapCapacity);\n    ma_sound_get_cursor_in_pcm_frames(&sound, &cursor);\n    ma_sound_get_length_in_pcm_frames(&sound, &length);\n    ```\n\nSound groups have the same API as sounds, only they are called `ma_sound_group`, and since they do\nnot have any notion of a data source, anything relating to a data source is unavailable.\n\nInternally, sound data is loaded via the `ma_decoder` API which means by default it only supports\nfile formats that have built-in support in miniaudio. You can extend this to support any kind of\nfile format through the use of custom decoders. To do this you'll need to use a self-managed\nresource manager and configure it appropriately. See the \"Resource Management\" section below for\ndetails on how to set this up.\n\n\n6. Resource Management\n======================\nMany programs will want to manage sound resources for things such as reference counting and\nstreaming. This is supported by miniaudio via the `ma_resource_manager` API.\n\nThe resource manager is mainly responsible for the following:\n\n  * Loading of sound files into memory with reference counting.\n  * Streaming of sound data.\n\nWhen loading a sound file, the resource manager will give you back a `ma_data_source` compatible\nobject called `ma_resource_manager_data_source`. This object can be passed into any\n`ma_data_source` API which is how you can read and seek audio data. When loading a sound file, you\nspecify whether or not you want the sound to be fully loaded into memory (and optionally\npre-decoded) or streamed. When loading into memory, you can also specify whether or not you want\nthe data to be loaded asynchronously.\n\nThe example below is how you can initialize a resource manager using it's default configuration:\n\n    ```c\n    ma_resource_manager_config config;\n    ma_resource_manager resourceManager;\n\n    config = ma_resource_manager_config_init();\n    result = ma_resource_manager_init(&config, &resourceManager);\n    if (result != MA_SUCCESS) {\n        ma_device_uninit(&device);\n        printf(\"Failed to initialize the resource manager.\");\n        return -1;\n    }\n    ```\n\nYou can configure the format, channels and sample rate of the decoded audio data. By default it\nwill use the file's native data format, but you can configure it to use a consistent format. This\nis useful for offloading the cost of data conversion to load time rather than dynamically\nconverting at mixing time. To do this, you configure the decoded format, channels and sample rate\nlike the code below:\n\n    ```c\n    config = ma_resource_manager_config_init();\n    config.decodedFormat     = device.playback.format;\n    config.decodedChannels   = device.playback.channels;\n    config.decodedSampleRate = device.sampleRate;\n    ```\n\nIn the code above, the resource manager will be configured so that any decoded audio data will be\npre-converted at load time to the device's native data format. If instead you used defaults and\nthe data format of the file did not match the device's data format, you would need to convert the\ndata at mixing time which may be prohibitive in high-performance and large scale scenarios like\ngames.\n\nInternally the resource manager uses the `ma_decoder` API to load sounds. This means by default it\nonly supports decoders that are built into miniaudio. It's possible to support additional encoding\nformats through the use of custom decoders. To do so, pass in your `ma_decoding_backend_vtable`\nvtables into the resource manager config:\n\n    ```c\n    ma_decoding_backend_vtable* pCustomBackendVTables[] =\n    {\n        &g_ma_decoding_backend_vtable_libvorbis,\n        &g_ma_decoding_backend_vtable_libopus\n    };\n\n    ...\n\n    resourceManagerConfig.ppCustomDecodingBackendVTables = pCustomBackendVTables;\n    resourceManagerConfig.customDecodingBackendCount     = sizeof(pCustomBackendVTables) / sizeof(pCustomBackendVTables[0]);\n    resourceManagerConfig.pCustomDecodingBackendUserData = NULL;\n    ```\n\nThis system can allow you to support any kind of file format. See the \"Decoding\" section for\ndetails on how to implement custom decoders. The miniaudio repository includes examples for Opus\nvia libopus and libopusfile and Vorbis via libvorbis and libvorbisfile.\n\nAsynchronicity is achieved via a job system. When an operation needs to be performed, such as the\ndecoding of a page, a job will be posted to a queue which will then be processed by a job thread.\nBy default there will be only one job thread running, but this can be configured, like so:\n\n    ```c\n    config = ma_resource_manager_config_init();\n    config.jobThreadCount = MY_JOB_THREAD_COUNT;\n    ```\n\nBy default job threads are managed internally by the resource manager, however you can also self\nmanage your job threads if, for example, you want to integrate the job processing into your\nexisting job infrastructure, or if you simply don't like the way the resource manager does it. To\ndo this, just set the job thread count to 0 and process jobs manually. To process jobs, you first\nneed to retrieve a job using `ma_resource_manager_next_job()` and then process it using\n`ma_job_process()`:\n\n    ```c\n    config = ma_resource_manager_config_init();\n    config.jobThreadCount = 0;                            // Don't manage any job threads internally.\n    config.flags = MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING; // Optional. Makes `ma_resource_manager_next_job()` non-blocking.\n\n    // ... Initialize your custom job threads ...\n\n    void my_custom_job_thread(...)\n    {\n        for (;;) {\n            ma_job job;\n            ma_result result = ma_resource_manager_next_job(pMyResourceManager, &job);\n            if (result != MA_SUCCESS) {\n                if (result == MA_NO_DATA_AVAILABLE) {\n                    // No jobs are available. Keep going. Will only get this if the resource manager was initialized\n                    // with MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING.\n                    continue;\n                } else if (result == MA_CANCELLED) {\n                    // MA_JOB_TYPE_QUIT was posted. Exit.\n                    break;\n                } else {\n                    // Some other error occurred.\n                    break;\n                }\n            }\n\n            ma_job_process(&job);\n        }\n    }\n    ```\n\nIn the example above, the `MA_JOB_TYPE_QUIT` event is the used as the termination\nindicator, but you can use whatever you would like to terminate the thread. The call to\n`ma_resource_manager_next_job()` is blocking by default, but can be configured to be non-blocking\nby initializing the resource manager with the `MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING` configuration\nflag. Note that the `MA_JOB_TYPE_QUIT` will never be removed from the job queue. This\nis to give every thread the opportunity to catch the event and terminate naturally.\n\nWhen loading a file, it's sometimes convenient to be able to customize how files are opened and\nread instead of using standard `fopen()`, `fclose()`, etc. which is what miniaudio will use by\ndefault. This can be done by setting `pVFS` member of the resource manager's config:\n\n    ```c\n    // Initialize your custom VFS object. See documentation for VFS for information on how to do this.\n    my_custom_vfs vfs = my_custom_vfs_init();\n\n    config = ma_resource_manager_config_init();\n    config.pVFS = &vfs;\n    ```\n\nThis is particularly useful in programs like games where you want to read straight from an archive\nrather than the normal file system. If you do not specify a custom VFS, the resource manager will\nuse the operating system's normal file operations.\n\nTo load a sound file and create a data source, call `ma_resource_manager_data_source_init()`. When\nloading a sound you need to specify the file path and options for how the sounds should be loaded.\nBy default a sound will be loaded synchronously. The returned data source is owned by the caller\nwhich means the caller is responsible for the allocation and freeing of the data source. Below is\nan example for initializing a data source:\n\n    ```c\n    ma_resource_manager_data_source dataSource;\n    ma_result result = ma_resource_manager_data_source_init(pResourceManager, pFilePath, flags, &dataSource);\n    if (result != MA_SUCCESS) {\n        // Error.\n    }\n\n    // ...\n\n    // A ma_resource_manager_data_source object is compatible with the `ma_data_source` API. To read data, just call\n    // the `ma_data_source_read_pcm_frames()` like you would with any normal data source.\n    result = ma_data_source_read_pcm_frames(&dataSource, pDecodedData, frameCount, &framesRead);\n    if (result != MA_SUCCESS) {\n        // Failed to read PCM frames.\n    }\n\n    // ...\n\n    ma_resource_manager_data_source_uninit(&dataSource);\n    ```\n\nThe `flags` parameter specifies how you want to perform loading of the sound file. It can be a\ncombination of the following flags:\n\n    ```\n    MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM\n    MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE\n    MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC\n    MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT\n    ```\n\nWhen no flags are specified (set to 0), the sound will be fully loaded into memory, but not\ndecoded, meaning the raw file data will be stored in memory, and then dynamically decoded when\n`ma_data_source_read_pcm_frames()` is called. To instead decode the audio data before storing it in\nmemory, use the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE` flag. By default, the sound file will\nbe loaded synchronously, meaning `ma_resource_manager_data_source_init()` will only return after\nthe entire file has been loaded. This is good for simplicity, but can be prohibitively slow. You\ncan instead load the sound asynchronously using the `MA_RESOURCE_MANAGER_DATA_SOURCE_ASYNC` flag.\nThis will result in `ma_resource_manager_data_source_init()` returning quickly, but no data will be\nreturned by `ma_data_source_read_pcm_frames()` until some data is available. When no data is\navailable because the asynchronous decoding hasn't caught up, `MA_BUSY` will be returned by\n`ma_data_source_read_pcm_frames()`.\n\nFor large sounds, it's often prohibitive to store the entire file in memory. To mitigate this, you\ncan instead stream audio data which you can do by specifying the\n`MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM` flag. When streaming, data will be decoded in 1\nsecond pages. When a new page needs to be decoded, a job will be posted to the job queue and then\nsubsequently processed in a job thread.\n\nFor in-memory sounds, reference counting is used to ensure the data is loaded only once. This means\nmultiple calls to `ma_resource_manager_data_source_init()` with the same file path will result in\nthe file data only being loaded once. Each call to `ma_resource_manager_data_source_init()` must be\nmatched up with a call to `ma_resource_manager_data_source_uninit()`. Sometimes it can be useful\nfor a program to register self-managed raw audio data and associate it with a file path. Use the\n`ma_resource_manager_register_*()` and `ma_resource_manager_unregister_*()` APIs to do this.\n`ma_resource_manager_register_decoded_data()` is used to associate a pointer to raw, self-managed\ndecoded audio data in the specified data format with the specified name. Likewise,\n`ma_resource_manager_register_encoded_data()` is used to associate a pointer to raw self-managed\nencoded audio data (the raw file data) with the specified name. Note that these names need not be\nactual file paths. When `ma_resource_manager_data_source_init()` is called (without the\n`MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM` flag), the resource manager will look for these\nexplicitly registered data buffers and, if found, will use it as the backing data for the data\nsource. Note that the resource manager does *not* make a copy of this data so it is up to the\ncaller to ensure the pointer stays valid for it's lifetime. Use\n`ma_resource_manager_unregister_data()` to unregister the self-managed data. You can also use\n`ma_resource_manager_register_file()` and `ma_resource_manager_unregister_file()` to register and\nunregister a file. It does not make sense to use the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM`\nflag with a self-managed data pointer.\n\n\n6.1. Asynchronous Loading and Synchronization\n---------------------------------------------\nWhen loading asynchronously, it can be useful to poll whether or not loading has finished. Use\n`ma_resource_manager_data_source_result()` to determine this. For in-memory sounds, this will\nreturn `MA_SUCCESS` when the file has been *entirely* decoded. If the sound is still being decoded,\n`MA_BUSY` will be returned. Otherwise, some other error code will be returned if the sound failed\nto load. For streaming data sources, `MA_SUCCESS` will be returned when the first page has been\ndecoded and the sound is ready to be played. If the first page is still being decoded, `MA_BUSY`\nwill be returned. Otherwise, some other error code will be returned if the sound failed to load.\n\nIn addition to polling, you can also use a simple synchronization object called a \"fence\" to wait\nfor asynchronously loaded sounds to finish. This is called `ma_fence`. The advantage to using a\nfence is that it can be used to wait for a group of sounds to finish loading rather than waiting\nfor sounds on an individual basis. There are two stages to loading a sound:\n\n  * Initialization of the internal decoder; and\n  * Completion of decoding of the file (the file is fully decoded)\n\nYou can specify separate fences for each of the different stages. Waiting for the initialization\nof the internal decoder is important for when you need to know the sample format, channels and\nsample rate of the file.\n\nThe example below shows how you could use a fence when loading a number of sounds:\n\n    ```c\n    // This fence will be released when all sounds are finished loading entirely.\n    ma_fence fence;\n    ma_fence_init(&fence);\n\n    // This will be passed into the initialization routine for each sound.\n    ma_resource_manager_pipeline_notifications notifications = ma_resource_manager_pipeline_notifications_init();\n    notifications.done.pFence = &fence;\n\n    // Now load a bunch of sounds:\n    for (iSound = 0; iSound < soundCount; iSound += 1) {\n        ma_resource_manager_data_source_init(pResourceManager, pSoundFilePaths[iSound], flags, &notifications, &pSoundSources[iSound]);\n    }\n\n    // ... DO SOMETHING ELSE WHILE SOUNDS ARE LOADING ...\n\n    // Wait for loading of sounds to finish.\n    ma_fence_wait(&fence);\n    ```\n\nIn the example above we used a fence for waiting until the entire file has been fully decoded. If\nyou only need to wait for the initialization of the internal decoder to complete, you can use the\n`init` member of the `ma_resource_manager_pipeline_notifications` object:\n\n    ```c\n    notifications.init.pFence = &fence;\n    ```\n\nIf a fence is not appropriate for your situation, you can instead use a callback that is fired on\nan individual sound basis. This is done in a very similar way to fences:\n\n    ```c\n    typedef struct\n    {\n        ma_async_notification_callbacks cb;\n        void* pMyData;\n    } my_notification;\n\n    void my_notification_callback(ma_async_notification* pNotification)\n    {\n        my_notification* pMyNotification = (my_notification*)pNotification;\n\n        // Do something in response to the sound finishing loading.\n    }\n\n    ...\n\n    my_notification myCallback;\n    myCallback.cb.onSignal = my_notification_callback;\n    myCallback.pMyData     = pMyData;\n\n    ma_resource_manager_pipeline_notifications notifications = ma_resource_manager_pipeline_notifications_init();\n    notifications.done.pNotification = &myCallback;\n\n    ma_resource_manager_data_source_init(pResourceManager, \"my_sound.wav\", flags, &notifications, &mySound);\n    ```\n\nIn the example above we just extend the `ma_async_notification_callbacks` object and pass an\ninstantiation into the `ma_resource_manager_pipeline_notifications` in the same way as we did with\nthe fence, only we set `pNotification` instead of `pFence`. You can set both of these at the same\ntime and they should both work as expected. If using the `pNotification` system, you need to ensure\nyour `ma_async_notification_callbacks` object stays valid.\n\n\n\n6.2. Resource Manager Implementation Details\n--------------------------------------------\nResources are managed in two main ways:\n\n  * By storing the entire sound inside an in-memory buffer (referred to as a data buffer)\n  * By streaming audio data on the fly (referred to as a data stream)\n\nA resource managed data source (`ma_resource_manager_data_source`) encapsulates a data buffer or\ndata stream, depending on whether or not the data source was initialized with the\n`MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM` flag. If so, it will make use of a\n`ma_resource_manager_data_stream` object. Otherwise it will use a `ma_resource_manager_data_buffer`\nobject. Both of these objects are data sources which means they can be used with any\n`ma_data_source_*()` API.\n\nAnother major feature of the resource manager is the ability to asynchronously decode audio files.\nThis relieves the audio thread of time-consuming decoding which can negatively affect scalability\ndue to the audio thread needing to complete it's work extremely quickly to avoid glitching.\nAsynchronous decoding is achieved through a job system. There is a central multi-producer,\nmulti-consumer, fixed-capacity job queue. When some asynchronous work needs to be done, a job is\nposted to the queue which is then read by a job thread. The number of job threads can be\nconfigured for improved scalability, and job threads can all run in parallel without needing to\nworry about the order of execution (how this is achieved is explained below).\n\nWhen a sound is being loaded asynchronously, playback can begin before the sound has been fully\ndecoded. This enables the application to start playback of the sound quickly, while at the same\ntime allowing to resource manager to keep loading in the background. Since there may be less\nthreads than the number of sounds being loaded at a given time, a simple scheduling system is used\nto keep decoding time balanced and fair. The resource manager solves this by splitting decoding\ninto chunks called pages. By default, each page is 1 second long. When a page has been decoded, a\nnew job will be posted to start decoding the next page. By dividing up decoding into pages, an\nindividual sound shouldn't ever delay every other sound from having their first page decoded. Of\ncourse, when loading many sounds at the same time, there will always be an amount of time required\nto process jobs in the queue so in heavy load situations there will still be some delay. To\ndetermine if a data source is ready to have some frames read, use\n`ma_resource_manager_data_source_get_available_frames()`. This will return the number of frames\navailable starting from the current position.\n\n\n6.2.1. Job Queue\n----------------\nThe resource manager uses a job queue which is multi-producer, multi-consumer, and fixed-capacity.\nThis job queue is not currently lock-free, and instead uses a spinlock to achieve thread-safety.\nOnly a fixed number of jobs can be allocated and inserted into the queue which is done through a\nlock-free data structure for allocating an index into a fixed sized array, with reference counting\nfor mitigation of the ABA problem. The reference count is 32-bit.\n\nFor many types of jobs it's important that they execute in a specific order. In these cases, jobs\nare executed serially. For the resource manager, serial execution of jobs is only required on a\nper-object basis (per data buffer or per data stream). Each of these objects stores an execution\ncounter. When a job is posted it is associated with an execution counter. When the job is\nprocessed, it checks if the execution counter of the job equals the execution counter of the\nowning object and if so, processes the job. If the counters are not equal, the job will be posted\nback onto the job queue for later processing. When the job finishes processing the execution order\nof the main object is incremented. This system means the no matter how many job threads are\nexecuting, decoding of an individual sound will always get processed serially. The advantage to\nhaving multiple threads comes into play when loading multiple sounds at the same time.\n\nThe resource manager's job queue is not 100% lock-free and will use a spinlock to achieve\nthread-safety for a very small section of code. This is only relevant when the resource manager\nuses more than one job thread. If only using a single job thread, which is the default, the\nlock should never actually wait in practice. The amount of time spent locking should be quite\nshort, but it's something to be aware of for those who have pedantic lock-free requirements and\nneed to use more than one job thread. There are plans to remove this lock in a future version.\n\nIn addition, posting a job will release a semaphore, which on Win32 is implemented with\n`ReleaseSemaphore` and on POSIX platforms via a condition variable:\n\n    ```c\n    pthread_mutex_lock(&pSemaphore->lock);\n    {\n        pSemaphore->value += 1;\n        pthread_cond_signal(&pSemaphore->cond);\n    }\n    pthread_mutex_unlock(&pSemaphore->lock);\n    ```\n\nAgain, this is relevant for those with strict lock-free requirements in the audio thread. To avoid\nthis, you can use non-blocking mode (via the `MA_JOB_QUEUE_FLAG_NON_BLOCKING`\nflag) and implement your own job processing routine (see the \"Resource Manager\" section above for\ndetails on how to do this).\n\n\n\n6.2.2. Data Buffers\n-------------------\nWhen the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM` flag is excluded at initialization time, the\nresource manager will try to load the data into an in-memory data buffer. Before doing so, however,\nit will first check if the specified file is already loaded. If so, it will increment a reference\ncounter and just use the already loaded data. This saves both time and memory. When the data buffer\nis uninitialized, the reference counter will be decremented. If the counter hits zero, the file\nwill be unloaded. This is a detail to keep in mind because it could result in excessive loading and\nunloading of a sound. For example, the following sequence will result in a file be loaded twice,\nonce after the other:\n\n    ```c\n    ma_resource_manager_data_source_init(pResourceManager, \"my_file\", ..., &myDataBuffer0); // Refcount = 1. Initial load.\n    ma_resource_manager_data_source_uninit(&myDataBuffer0);                                 // Refcount = 0. Unloaded.\n\n    ma_resource_manager_data_source_init(pResourceManager, \"my_file\", ..., &myDataBuffer1); // Refcount = 1. Reloaded because previous uninit() unloaded it.\n    ma_resource_manager_data_source_uninit(&myDataBuffer1);                                 // Refcount = 0. Unloaded.\n    ```\n\nA binary search tree (BST) is used for storing data buffers as it has good balance between\nefficiency and simplicity. The key of the BST is a 64-bit hash of the file path that was passed\ninto `ma_resource_manager_data_source_init()`. The advantage of using a hash is that it saves\nmemory over storing the entire path, has faster comparisons, and results in a mostly balanced BST\ndue to the random nature of the hash. The disadvantages are that file names are case-sensitive and\nthere's a small chance of name collisions. If case-sensitivity is an issue, you should normalize\nyour file names to upper- or lower-case before initializing your data sources. If name collisions\nbecome an issue, you'll need to change the name of one of the colliding names or just not use the\nresource manager.\n\nWhen a sound file has not already been loaded and the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC`\nflag is excluded, the file will be decoded synchronously by the calling thread. There are two\noptions for controlling how the audio is stored in the data buffer - encoded or decoded. When the\n`MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE` option is excluded, the raw file data will be stored\nin memory. Otherwise the sound will be decoded before storing it in memory. Synchronous loading is\na very simple and standard process of simply adding an item to the BST, allocating a block of\nmemory and then decoding (if `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE` is specified).\n\nWhen the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC` flag is specified, loading of the data buffer\nis done asynchronously. In this case, a job is posted to the queue to start loading and then the\nfunction immediately returns, setting an internal result code to `MA_BUSY`. This result code is\nreturned when the program calls `ma_resource_manager_data_source_result()`. When decoding has fully\ncompleted `MA_SUCCESS` will be returned. This can be used to know if loading has fully completed.\n\nWhen loading asynchronously, a single job is posted to the queue of the type\n`MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE`. This involves making a copy of the file path and\nassociating it with job. When the job is processed by the job thread, it will first load the file\nusing the VFS associated with the resource manager. When using a custom VFS, it's important that it\nbe completely thread-safe because it will be used from one or more job threads at the same time.\nIndividual files should only ever be accessed by one thread at a time, however. After opening the\nfile via the VFS, the job will determine whether or not the file is being decoded. If not, it\nsimply allocates a block of memory and loads the raw file contents into it and returns. On the\nother hand, when the file is being decoded, it will first allocate a decoder on the heap and\ninitialize it. Then it will check if the length of the file is known. If so it will allocate a\nblock of memory to store the decoded output and initialize it to silence. If the size is unknown,\nit will allocate room for one page. After memory has been allocated, the first page will be\ndecoded. If the sound is shorter than a page, the result code will be set to `MA_SUCCESS` and the\ncompletion event will be signalled and loading is now complete. If, however, there is more to\ndecode, a job with the code `MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE` is posted. This job\nwill decode the next page and perform the same process if it reaches the end. If there is more to\ndecode, the job will post another `MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE` job which will\nkeep on happening until the sound has been fully decoded. For sounds of an unknown length, each\npage will be linked together as a linked list. Internally this is implemented via the\n`ma_paged_audio_buffer` object.\n\n\n6.2.3. Data Streams\n-------------------\nData streams only ever store two pages worth of data for each instance. They are most useful for\nlarge sounds like music tracks in games that would consume too much memory if fully decoded in\nmemory. After every frame from a page has been read, a job will be posted to load the next page\nwhich is done from the VFS.\n\nFor data streams, the `MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC` flag will determine whether or\nnot initialization of the data source waits until the two pages have been decoded. When unset,\n`ma_resource_manager_data_source_init()` will wait until the two pages have been loaded, otherwise\nit will return immediately.\n\nWhen frames are read from a data stream using `ma_resource_manager_data_source_read_pcm_frames()`,\n`MA_BUSY` will be returned if there are no frames available. If there are some frames available,\nbut less than the number requested, `MA_SUCCESS` will be returned, but the actual number of frames\nread will be less than the number requested. Due to the asynchronous nature of data streams,\nseeking is also asynchronous. If the data stream is in the middle of a seek, `MA_BUSY` will be\nreturned when trying to read frames.\n\nWhen `ma_resource_manager_data_source_read_pcm_frames()` results in a page getting fully consumed\na job is posted to load the next page. This will be posted from the same thread that called\n`ma_resource_manager_data_source_read_pcm_frames()`.\n\nData streams are uninitialized by posting a job to the queue, but the function won't return until\nthat job has been processed. The reason for this is that the caller owns the data stream object and\ntherefore miniaudio needs to ensure everything completes before handing back control to the caller.\nAlso, if the data stream is uninitialized while pages are in the middle of decoding, they must\ncomplete before destroying any underlying object and the job system handles this cleanly.\n\nNote that when a new page needs to be loaded, a job will be posted to the resource manager's job\nthread from the audio thread. You must keep in mind the details mentioned in the \"Job Queue\"\nsection above regarding locking when posting an event if you require a strictly lock-free audio\nthread.\n\n\n\n7. Node Graph\n=============\nminiaudio's routing infrastructure follows a node graph paradigm. The idea is that you create a\nnode whose outputs are attached to inputs of another node, thereby creating a graph. There are\ndifferent types of nodes, with each node in the graph processing input data to produce output,\nwhich is then fed through the chain. Each node in the graph can apply their own custom effects. At\nthe start of the graph will usually be one or more data source nodes which have no inputs and\ninstead pull their data from a data source. At the end of the graph is an endpoint which represents\nthe end of the chain and is where the final output is ultimately extracted from.\n\nEach node has a number of input buses and a number of output buses. An output bus from a node is\nattached to an input bus of another. Multiple nodes can connect their output buses to another\nnode's input bus, in which case their outputs will be mixed before processing by the node. Below is\na diagram that illustrates a hypothetical node graph setup:\n\n    ```\n    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Data flows left to right >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n\n    +---------------+                              +-----------------+\n    | Data Source 1 =----+    +----------+    +----= Low Pass Filter =----+\n    +---------------+    |    |          =----+    +-----------------+    |    +----------+\n                         +----= Splitter |                                +----= ENDPOINT |\n    +---------------+    |    |          =----+    +-----------------+    |    +----------+\n    | Data Source 2 =----+    +----------+    +----=  Echo / Delay   =----+\n    +---------------+                              +-----------------+\n    ```\n\nIn the above graph, it starts with two data sources whose outputs are attached to the input of a\nsplitter node. It's at this point that the two data sources are mixed. After mixing, the splitter\nperforms it's processing routine and produces two outputs which is simply a duplication of the\ninput stream. One output is attached to a low pass filter, whereas the other output is attached to\na echo/delay. The outputs of the the low pass filter and the echo are attached to the endpoint, and\nsince they're both connected to the same input bus, they'll be mixed.\n\nEach input bus must be configured to accept the same number of channels, but the number of channels\nused by input buses can be different to the number of channels for output buses in which case\nminiaudio will automatically convert the input data to the output channel count before processing.\nThe number of channels of an output bus of one node must match the channel count of the input bus\nit's attached to. The channel counts cannot be changed after the node has been initialized. If you\nattempt to attach an output bus to an input bus with a different channel count, attachment will\nfail.\n\nTo use a node graph, you first need to initialize a `ma_node_graph` object. This is essentially a\ncontainer around the entire graph. The `ma_node_graph` object is required for some thread-safety\nissues which will be explained later. A `ma_node_graph` object is initialized using miniaudio's\nstandard config/init system:\n\n    ```c\n    ma_node_graph_config nodeGraphConfig = ma_node_graph_config_init(myChannelCount);\n\n    result = ma_node_graph_init(&nodeGraphConfig, NULL, &nodeGraph);    // Second parameter is a pointer to allocation callbacks.\n    if (result != MA_SUCCESS) {\n        // Failed to initialize node graph.\n    }\n    ```\n\nWhen you initialize the node graph, you're specifying the channel count of the endpoint. The\nendpoint is a special node which has one input bus and one output bus, both of which have the\nsame channel count, which is specified in the config. Any nodes that connect directly to the\nendpoint must be configured such that their output buses have the same channel count. When you read\naudio data from the node graph, it'll have the channel count you specified in the config. To read\ndata from the graph:\n\n    ```c\n    ma_uint32 framesRead;\n    result = ma_node_graph_read_pcm_frames(&nodeGraph, pFramesOut, frameCount, &framesRead);\n    if (result != MA_SUCCESS) {\n        // Failed to read data from the node graph.\n    }\n    ```\n\nWhen you read audio data, miniaudio starts at the node graph's endpoint node which then pulls in\ndata from it's input attachments, which in turn recursively pull in data from their inputs, and so\non. At the start of the graph there will be some kind of data source node which will have zero\ninputs and will instead read directly from a data source. The base nodes don't literally need to\nread from a `ma_data_source` object, but they will always have some kind of underlying object that\nsources some kind of audio. The `ma_data_source_node` node can be used to read from a\n`ma_data_source`. Data is always in floating-point format and in the number of channels you\nspecified when the graph was initialized. The sample rate is defined by the underlying data sources.\nIt's up to you to ensure they use a consistent and appropriate sample rate.\n\nThe `ma_node` API is designed to allow custom nodes to be implemented with relative ease, but\nminiaudio includes a few stock nodes for common functionality. This is how you would initialize a\nnode which reads directly from a data source (`ma_data_source_node`) which is an example of one\nof the stock nodes that comes with miniaudio:\n\n    ```c\n    ma_data_source_node_config config = ma_data_source_node_config_init(pMyDataSource);\n\n    ma_data_source_node dataSourceNode;\n    result = ma_data_source_node_init(&nodeGraph, &config, NULL, &dataSourceNode);\n    if (result != MA_SUCCESS) {\n        // Failed to create data source node.\n    }\n    ```\n\nThe data source node will use the output channel count to determine the channel count of the output\nbus. There will be 1 output bus and 0 input buses (data will be drawn directly from the data\nsource). The data source must output to floating-point (`ma_format_f32`) or else an error will be\nreturned from `ma_data_source_node_init()`.\n\nBy default the node will not be attached to the graph. To do so, use `ma_node_attach_output_bus()`:\n\n    ```c\n    result = ma_node_attach_output_bus(&dataSourceNode, 0, ma_node_graph_get_endpoint(&nodeGraph), 0);\n    if (result != MA_SUCCESS) {\n        // Failed to attach node.\n    }\n    ```\n\nThe code above connects the data source node directly to the endpoint. Since the data source node\nhas only a single output bus, the index will always be 0. Likewise, the endpoint only has a single\ninput bus which means the input bus index will also always be 0.\n\nTo detach a specific output bus, use `ma_node_detach_output_bus()`. To detach all output buses, use\n`ma_node_detach_all_output_buses()`. If you want to just move the output bus from one attachment to\nanother, you do not need to detach first. You can just call `ma_node_attach_output_bus()` and it'll\ndeal with it for you.\n\nLess frequently you may want to create a specialized node. This will be a node where you implement\nyour own processing callback to apply a custom effect of some kind. This is similar to initializing\none of the stock node types, only this time you need to specify a pointer to a vtable containing a\npointer to the processing function and the number of input and output buses. Example:\n\n    ```c\n    static void my_custom_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n    {\n        // Do some processing of ppFramesIn (one stream of audio data per input bus)\n        const float* pFramesIn_0 = ppFramesIn[0]; // Input bus @ index 0.\n        const float* pFramesIn_1 = ppFramesIn[1]; // Input bus @ index 1.\n        float* pFramesOut_0 = ppFramesOut[0];     // Output bus @ index 0.\n\n        // Do some processing. On input, `pFrameCountIn` will be the number of input frames in each\n        // buffer in `ppFramesIn` and `pFrameCountOut` will be the capacity of each of the buffers\n        // in `ppFramesOut`. On output, `pFrameCountIn` should be set to the number of input frames\n        // your node consumed and `pFrameCountOut` should be set the number of output frames that\n        // were produced.\n        //\n        // You should process as many frames as you can. If your effect consumes input frames at the\n        // same rate as output frames (always the case, unless you're doing resampling), you need\n        // only look at `ppFramesOut` and process that exact number of frames. If you're doing\n        // resampling, you'll need to be sure to set both `pFrameCountIn` and `pFrameCountOut`\n        // properly.\n    }\n\n    static ma_node_vtable my_custom_node_vtable =\n    {\n        my_custom_node_process_pcm_frames, // The function that will be called to process your custom node. This is where you'd implement your effect processing.\n        NULL,   // Optional. A callback for calculating the number of input frames that are required to process a specified number of output frames.\n        2,      // 2 input buses.\n        1,      // 1 output bus.\n        0       // Default flags.\n    };\n\n    ...\n\n    // Each bus needs to have a channel count specified. To do this you need to specify the channel\n    // counts in an array and then pass that into the node config.\n    ma_uint32 inputChannels[2];     // Equal in size to the number of input channels specified in the vtable.\n    ma_uint32 outputChannels[1];    // Equal in size to the number of output channels specified in the vtable.\n\n    inputChannels[0]  = channelsIn;\n    inputChannels[1]  = channelsIn;\n    outputChannels[0] = channelsOut;\n\n    ma_node_config nodeConfig = ma_node_config_init();\n    nodeConfig.vtable          = &my_custom_node_vtable;\n    nodeConfig.pInputChannels  = inputChannels;\n    nodeConfig.pOutputChannels = outputChannels;\n\n    ma_node_base node;\n    result = ma_node_init(&nodeGraph, &nodeConfig, NULL, &node);\n    if (result != MA_SUCCESS) {\n        // Failed to initialize node.\n    }\n    ```\n\nWhen initializing a custom node, as in the code above, you'll normally just place your vtable in\nstatic space. The number of input and output buses are specified as part of the vtable. If you need\na variable number of buses on a per-node bases, the vtable should have the relevant bus count set\nto `MA_NODE_BUS_COUNT_UNKNOWN`. In this case, the bus count should be set in the node config:\n\n    ```c\n    static ma_node_vtable my_custom_node_vtable =\n    {\n        my_custom_node_process_pcm_frames, // The function that will be called process your custom node. This is where you'd implement your effect processing.\n        NULL,   // Optional. A callback for calculating the number of input frames that are required to process a specified number of output frames.\n        MA_NODE_BUS_COUNT_UNKNOWN,  // The number of input buses is determined on a per-node basis.\n        1,      // 1 output bus.\n        0       // Default flags.\n    };\n\n    ...\n\n    ma_node_config nodeConfig = ma_node_config_init();\n    nodeConfig.vtable          = &my_custom_node_vtable;\n    nodeConfig.inputBusCount   = myBusCount;        // <-- Since the vtable specifies MA_NODE_BUS_COUNT_UNKNOWN, the input bus count should be set here.\n    nodeConfig.pInputChannels  = inputChannels;     // <-- Make sure there are nodeConfig.inputBusCount elements in this array.\n    nodeConfig.pOutputChannels = outputChannels;    // <-- The vtable specifies 1 output bus, so there must be 1 element in this array.\n    ```\n\nIn the above example it's important to never set the `inputBusCount` and `outputBusCount` members\nto anything other than their defaults if the vtable specifies an explicit count. They can only be\nset if the vtable specifies MA_NODE_BUS_COUNT_UNKNOWN in the relevant bus count.\n\nMost often you'll want to create a structure to encapsulate your node with some extra data. You\nneed to make sure the `ma_node_base` object is your first member of the structure:\n\n    ```c\n    typedef struct\n    {\n        ma_node_base base; // <-- Make sure this is always the first member.\n        float someCustomData;\n    } my_custom_node;\n    ```\n\nBy doing this, your object will be compatible with all `ma_node` APIs and you can attach it to the\ngraph just like any other node.\n\nIn the custom processing callback (`my_custom_node_process_pcm_frames()` in the example above), the\nnumber of channels for each bus is what was specified by the config when the node was initialized\nwith `ma_node_init()`. In addition, all attachments to each of the input buses will have been\npre-mixed by miniaudio. The config allows you to specify different channel counts for each\nindividual input and output bus. It's up to the effect to handle it appropriate, and if it can't,\nreturn an error in it's initialization routine.\n\nCustom nodes can be assigned some flags to describe their behaviour. These are set via the vtable\nand include the following:\n\n    +-----------------------------------------+---------------------------------------------------+\n    | Flag Name                               | Description                                       |\n    +-----------------------------------------+---------------------------------------------------+\n    | MA_NODE_FLAG_PASSTHROUGH                | Useful for nodes that do not do any kind of audio |\n    |                                         | processing, but are instead used for tracking     |\n    |                                         | time, handling events, etc. Also used by the      |\n    |                                         | internal endpoint node. It reads directly from    |\n    |                                         | the input bus to the output bus. Nodes with this  |\n    |                                         | flag must have exactly 1 input bus and 1 output   |\n    |                                         | bus, and both buses must have the same channel    |\n    |                                         | counts.                                           |\n    +-----------------------------------------+---------------------------------------------------+\n    | MA_NODE_FLAG_CONTINUOUS_PROCESSING      | Causes the processing callback to be called even  |\n    |                                         | when no data is available to be read from input   |\n    |                                         | attachments. When a node has at least one input   |\n    |                                         | bus, but there are no inputs attached or the      |\n    |                                         | inputs do not deliver any data, the node's        |\n    |                                         | processing callback will not get fired. This flag |\n    |                                         | will make it so the callback is always fired      |\n    |                                         | regardless of whether or not any input data is    |\n    |                                         | received. This is useful for effects like         |\n    |                                         | echos where there will be a tail of audio data    |\n    |                                         | that still needs to be processed even when the    |\n    |                                         | original data sources have reached their ends. It |\n    |                                         | may also be useful for nodes that must always     |\n    |                                         | have their processing callback fired when there   |\n    |                                         | are no inputs attached.                           |\n    +-----------------------------------------+---------------------------------------------------+\n    | MA_NODE_FLAG_ALLOW_NULL_INPUT           | Used in conjunction with                          |\n    |                                         | `MA_NODE_FLAG_CONTINUOUS_PROCESSING`. When this   |\n    |                                         | is set, the `ppFramesIn` parameter of the         |\n    |                                         | processing callback will be set to NULL when      |\n    |                                         | there are no input frames are available. When     |\n    |                                         | this is unset, silence will be posted to the      |\n    |                                         | processing callback.                              |\n    +-----------------------------------------+---------------------------------------------------+\n    | MA_NODE_FLAG_DIFFERENT_PROCESSING_RATES | Used to tell miniaudio that input and output      |\n    |                                         | frames are processed at different rates. You      |\n    |                                         | should set this for any nodes that perform        |\n    |                                         | resampling.                                       |\n    +-----------------------------------------+---------------------------------------------------+\n    | MA_NODE_FLAG_SILENT_OUTPUT              | Used to tell miniaudio that a node produces only  |\n    |                                         | silent output. This is useful for nodes where you |\n    |                                         | don't want the output to contribute to the final  |\n    |                                         | mix. An example might be if you want split your   |\n    |                                         | stream and have one branch be output to a file.   |\n    |                                         | When using this flag, you should avoid writing to |\n    |                                         | the output buffer of the node's processing        |\n    |                                         | callback because miniaudio will ignore it anyway. |\n    +-----------------------------------------+---------------------------------------------------+\n\n\nIf you need to make a copy of an audio stream for effect processing you can use a splitter node\ncalled `ma_splitter_node`. This takes has 1 input bus and splits the stream into 2 output buses.\nYou can use it like this:\n\n    ```c\n    ma_splitter_node_config splitterNodeConfig = ma_splitter_node_config_init(channels);\n\n    ma_splitter_node splitterNode;\n    result = ma_splitter_node_init(&nodeGraph, &splitterNodeConfig, NULL, &splitterNode);\n    if (result != MA_SUCCESS) {\n        // Failed to create node.\n    }\n\n    // Attach your output buses to two different input buses (can be on two different nodes).\n    ma_node_attach_output_bus(&splitterNode, 0, ma_node_graph_get_endpoint(&nodeGraph), 0); // Attach directly to the endpoint.\n    ma_node_attach_output_bus(&splitterNode, 1, &myEffectNode,                          0); // Attach to input bus 0 of some effect node.\n    ```\n\nThe volume of an output bus can be configured on a per-bus basis:\n\n    ```c\n    ma_node_set_output_bus_volume(&splitterNode, 0, 0.5f);\n    ma_node_set_output_bus_volume(&splitterNode, 1, 0.5f);\n    ```\n\nIn the code above we're using the splitter node from before and changing the volume of each of the\ncopied streams.\n\nYou can start and stop a node with the following:\n\n    ```c\n    ma_node_set_state(&splitterNode, ma_node_state_started);    // The default state.\n    ma_node_set_state(&splitterNode, ma_node_state_stopped);\n    ```\n\nBy default the node is in a started state, but since it won't be connected to anything won't\nactually be invoked by the node graph until it's connected. When you stop a node, data will not be\nread from any of it's input connections. You can use this property to stop a group of sounds\natomically.\n\nYou can configure the initial state of a node in it's config:\n\n    ```c\n    nodeConfig.initialState = ma_node_state_stopped;\n    ```\n\nNote that for the stock specialized nodes, all of their configs will have a `nodeConfig` member\nwhich is the config to use with the base node. This is where the initial state can be configured\nfor specialized nodes:\n\n    ```c\n    dataSourceNodeConfig.nodeConfig.initialState = ma_node_state_stopped;\n    ```\n\nWhen using a specialized node like `ma_data_source_node` or `ma_splitter_node`, be sure to not\nmodify the `vtable` member of the `nodeConfig` object.\n\n\n7.1. Timing\n-----------\nThe node graph supports starting and stopping nodes at scheduled times. This is especially useful\nfor data source nodes where you want to get the node set up, but only start playback at a specific\ntime. There are two clocks: local and global.\n\nA local clock is per-node, whereas the global clock is per graph. Scheduling starts and stops can\nonly be done based on the global clock because the local clock will not be running while the node\nis stopped. The global clocks advances whenever `ma_node_graph_read_pcm_frames()` is called. On the\nother hand, the local clock only advances when the node's processing callback is fired, and is\nadvanced based on the output frame count.\n\nTo retrieve the global time, use `ma_node_graph_get_time()`. The global time can be set with\n`ma_node_graph_set_time()` which might be useful if you want to do seeking on a global timeline.\nGetting and setting the local time is similar. Use `ma_node_get_time()` to retrieve the local time,\nand `ma_node_set_time()` to set the local time. The global and local times will be advanced by the\naudio thread, so care should be taken to avoid data races. Ideally you should avoid calling these\noutside of the node processing callbacks which are always run on the audio thread.\n\nThere is basic support for scheduling the starting and stopping of nodes. You can only schedule one\nstart and one stop at a time. This is mainly intended for putting nodes into a started or stopped\nstate in a frame-exact manner. Without this mechanism, starting and stopping of a node is limited\nto the resolution of a call to `ma_node_graph_read_pcm_frames()` which would typically be in blocks\nof several milliseconds. The following APIs can be used for scheduling node states:\n\n    ```c\n    ma_node_set_state_time()\n    ma_node_get_state_time()\n    ```\n\nThe time is absolute and must be based on the global clock. An example is below:\n\n    ```c\n    ma_node_set_state_time(&myNode, ma_node_state_started, sampleRate*1);   // Delay starting to 1 second.\n    ma_node_set_state_time(&myNode, ma_node_state_stopped, sampleRate*5);   // Delay stopping to 5 seconds.\n    ```\n\nAn example for changing the state using a relative time.\n\n    ```c\n    ma_node_set_state_time(&myNode, ma_node_state_started, sampleRate*1 + ma_node_graph_get_time(&myNodeGraph));\n    ma_node_set_state_time(&myNode, ma_node_state_stopped, sampleRate*5 + ma_node_graph_get_time(&myNodeGraph));\n    ```\n\nNote that due to the nature of multi-threading the times may not be 100% exact. If this is an\nissue, consider scheduling state changes from within a processing callback. An idea might be to\nhave some kind of passthrough trigger node that is used specifically for tracking time and handling\nevents.\n\n\n\n7.2. Thread Safety and Locking\n------------------------------\nWhen processing audio, it's ideal not to have any kind of locking in the audio thread. Since it's\nexpected that `ma_node_graph_read_pcm_frames()` would be run on the audio thread, it does so\nwithout the use of any locks. This section discusses the implementation used by miniaudio and goes\nover some of the compromises employed by miniaudio to achieve this goal. Note that the current\nimplementation may not be ideal - feedback and critiques are most welcome.\n\nThe node graph API is not *entirely* lock-free. Only `ma_node_graph_read_pcm_frames()` is expected\nto be lock-free. Attachment, detachment and uninitialization of nodes use locks to simplify the\nimplementation, but are crafted in a way such that such locking is not required when reading audio\ndata from the graph. Locking in these areas are achieved by means of spinlocks.\n\nThe main complication with keeping `ma_node_graph_read_pcm_frames()` lock-free stems from the fact\nthat a node can be uninitialized, and it's memory potentially freed, while in the middle of being\nprocessed on the audio thread. There are times when the audio thread will be referencing a node,\nwhich means the uninitialization process of a node needs to make sure it delays returning until the\naudio thread is finished so that control is not handed back to the caller thereby giving them a\nchance to free the node's memory.\n\nWhen the audio thread is processing a node, it does so by reading from each of the output buses of\nthe node. In order for a node to process data for one of it's output buses, it needs to read from\neach of it's input buses, and so on an so forth. It follows that once all output buses of a node\nare detached, the node as a whole will be disconnected and no further processing will occur unless\nit's output buses are reattached, which won't be happening when the node is being uninitialized.\nBy having `ma_node_detach_output_bus()` wait until the audio thread is finished with it, we can\nsimplify a few things, at the expense of making `ma_node_detach_output_bus()` a bit slower. By\ndoing this, the implementation of `ma_node_uninit()` becomes trivial - just detach all output\nnodes, followed by each of the attachments to each of it's input nodes, and then do any final clean\nup.\n\nWith the above design, the worst-case scenario is `ma_node_detach_output_bus()` taking as long as\nit takes to process the output bus being detached. This will happen if it's called at just the\nwrong moment where the audio thread has just iterated it and has just started processing. The\ncaller of `ma_node_detach_output_bus()` will stall until the audio thread is finished, which\nincludes the cost of recursively processing it's inputs. This is the biggest compromise made with\nthe approach taken by miniaudio for it's lock-free processing system. The cost of detaching nodes\nearlier in the pipeline (data sources, for example) will be cheaper than the cost of detaching\nhigher level nodes, such as some kind of final post-processing endpoint. If you need to do mass\ndetachments, detach starting from the lowest level nodes and work your way towards the final\nendpoint node (but don't try detaching the node graph's endpoint). If the audio thread is not\nrunning, detachment will be fast and detachment in any order will be the same. The reason nodes\nneed to wait for their input attachments to complete is due to the potential for desyncs between\ndata sources. If the node was to terminate processing mid way through processing it's inputs,\nthere's a chance that some of the underlying data sources will have been read, but then others not.\nThat will then result in a potential desynchronization when detaching and reattaching higher-level\nnodes. A possible solution to this is to have an option when detaching to terminate processing\nbefore processing all input attachments which should be fairly simple.\n\nAnother compromise, albeit less significant, is locking when attaching and detaching nodes. This\nlocking is achieved by means of a spinlock in order to reduce memory overhead. A lock is present\nfor each input bus and output bus. When an output bus is connected to an input bus, both the output\nbus and input bus is locked. This locking is specifically for attaching and detaching across\ndifferent threads and does not affect `ma_node_graph_read_pcm_frames()` in any way. The locking and\nunlocking is mostly self-explanatory, but a slightly less intuitive aspect comes into it when\nconsidering that iterating over attachments must not break as a result of attaching or detaching a\nnode while iteration is occurring.\n\nAttaching and detaching are both quite simple. When an output bus of a node is attached to an input\nbus of another node, it's added to a linked list. Basically, an input bus is a linked list, where\neach item in the list is and output bus. We have some intentional (and convenient) restrictions on\nwhat can done with the linked list in order to simplify the implementation. First of all, whenever\nsomething needs to iterate over the list, it must do so in a forward direction. Backwards iteration\nis not supported. Also, items can only be added to the start of the list.\n\nThe linked list is a doubly-linked list where each item in the list (an output bus) holds a pointer\nto the next item in the list, and another to the previous item. A pointer to the previous item is\nonly required for fast detachment of the node - it is never used in iteration. This is an\nimportant property because it means from the perspective of iteration, attaching and detaching of\nan item can be done with a single atomic assignment. This is exploited by both the attachment and\ndetachment process. When attaching the node, the first thing that is done is the setting of the\nlocal \"next\" and \"previous\" pointers of the node. After that, the item is \"attached\" to the list\nby simply performing an atomic exchange with the head pointer. After that, the node is \"attached\"\nto the list from the perspective of iteration. Even though the \"previous\" pointer of the next item\nhasn't yet been set, from the perspective of iteration it's been attached because iteration will\nonly be happening in a forward direction which means the \"previous\" pointer won't actually ever get\nused. The same general process applies to detachment. See `ma_node_attach_output_bus()` and\n`ma_node_detach_output_bus()` for the implementation of this mechanism.\n\n\n\n8. Decoding\n===========\nThe `ma_decoder` API is used for reading audio files. Decoders are completely decoupled from\ndevices and can be used independently. Built-in support is included for the following formats:\n\n    +---------+\n    | Format  |\n    +---------+\n    | WAV     |\n    | MP3     |\n    | FLAC    |\n    +---------+\n\nYou can disable the built-in decoders by specifying one or more of the following options before the\nminiaudio implementation:\n\n    ```c\n    #define MA_NO_WAV\n    #define MA_NO_MP3\n    #define MA_NO_FLAC\n    ```\n\nminiaudio supports the ability to plug in custom decoders. See the section below for details on how\nto use custom decoders.\n\nA decoder can be initialized from a file with `ma_decoder_init_file()`, a block of memory with\n`ma_decoder_init_memory()`, or from data delivered via callbacks with `ma_decoder_init()`. Here is\nan example for loading a decoder from a file:\n\n    ```c\n    ma_decoder decoder;\n    ma_result result = ma_decoder_init_file(\"MySong.mp3\", NULL, &decoder);\n    if (result != MA_SUCCESS) {\n        return false;   // An error occurred.\n    }\n\n    ...\n\n    ma_decoder_uninit(&decoder);\n    ```\n\nWhen initializing a decoder, you can optionally pass in a pointer to a `ma_decoder_config` object\n(the `NULL` argument in the example above) which allows you to configure the output format, channel\ncount, sample rate and channel map:\n\n    ```c\n    ma_decoder_config config = ma_decoder_config_init(ma_format_f32, 2, 48000);\n    ```\n\nWhen passing in `NULL` for decoder config in `ma_decoder_init*()`, the output format will be the\nsame as that defined by the decoding backend.\n\nData is read from the decoder as PCM frames. This will output the number of PCM frames actually\nread. If this is less than the requested number of PCM frames it means you've reached the end. The\nreturn value will be `MA_AT_END` if no samples have been read and the end has been reached.\n\n    ```c\n    ma_result result = ma_decoder_read_pcm_frames(pDecoder, pFrames, framesToRead, &framesRead);\n    if (framesRead < framesToRead) {\n        // Reached the end.\n    }\n    ```\n\nYou can also seek to a specific frame like so:\n\n    ```c\n    ma_result result = ma_decoder_seek_to_pcm_frame(pDecoder, targetFrame);\n    if (result != MA_SUCCESS) {\n        return false;   // An error occurred.\n    }\n    ```\n\nIf you want to loop back to the start, you can simply seek back to the first PCM frame:\n\n    ```c\n    ma_decoder_seek_to_pcm_frame(pDecoder, 0);\n    ```\n\nWhen loading a decoder, miniaudio uses a trial and error technique to find the appropriate decoding\nbackend. This can be unnecessarily inefficient if the type is already known. In this case you can\nuse `encodingFormat` variable in the device config to specify a specific encoding format you want\nto decode:\n\n    ```c\n    decoderConfig.encodingFormat = ma_encoding_format_wav;\n    ```\n\nSee the `ma_encoding_format` enum for possible encoding formats.\n\nThe `ma_decoder_init_file()` API will try using the file extension to determine which decoding\nbackend to prefer.\n\n\n8.1. Custom Decoders\n--------------------\nIt's possible to implement a custom decoder and plug it into miniaudio. This is extremely useful\nwhen you want to use the `ma_decoder` API, but need to support an encoding format that's not one of\nthe stock formats supported by miniaudio. This can be put to particularly good use when using the\n`ma_engine` and/or `ma_resource_manager` APIs because they use `ma_decoder` internally. If, for\nexample, you wanted to support Opus, you can do so with a custom decoder (there if a reference\nOpus decoder in the \"extras\" folder of the miniaudio repository which uses libopus + libopusfile).\n\nA custom decoder must implement a data source. A vtable called `ma_decoding_backend_vtable` needs\nto be implemented which is then passed into the decoder config:\n\n    ```c\n    ma_decoding_backend_vtable* pCustomBackendVTables[] =\n    {\n        &g_ma_decoding_backend_vtable_libvorbis,\n        &g_ma_decoding_backend_vtable_libopus\n    };\n\n    ...\n\n    decoderConfig = ma_decoder_config_init_default();\n    decoderConfig.pCustomBackendUserData = NULL;\n    decoderConfig.ppCustomBackendVTables = pCustomBackendVTables;\n    decoderConfig.customBackendCount     = sizeof(pCustomBackendVTables) / sizeof(pCustomBackendVTables[0]);\n    ```\n\nThe `ma_decoding_backend_vtable` vtable has the following functions:\n\n    ```\n    onInit\n    onInitFile\n    onInitFileW\n    onInitMemory\n    onUninit\n    ```\n\nThere are only two functions that must be implemented - `onInit` and `onUninit`. The other\nfunctions can be implemented for a small optimization for loading from a file path or memory. If\nthese are not specified, miniaudio will deal with it for you via a generic implementation.\n\nWhen you initialize a custom data source (by implementing the `onInit` function in the vtable) you\nwill need to output a pointer to a `ma_data_source` which implements your custom decoder. See the\nsection about data sources for details on how to implement this. Alternatively, see the\n\"custom_decoders\" example in the miniaudio repository.\n\nThe `onInit` function takes a pointer to some callbacks for the purpose of reading raw audio data\nfrom some arbitrary source. You'll use these functions to read from the raw data and perform the\ndecoding. When you call them, you will pass in the `pReadSeekTellUserData` pointer to the relevant\nparameter.\n\nThe `pConfig` parameter in `onInit` can be used to configure the backend if appropriate. It's only\nused as a hint and can be ignored. However, if any of the properties are relevant to your decoder,\nan optimal implementation will handle the relevant properties appropriately.\n\nIf memory allocation is required, it should be done so via the specified allocation callbacks if\npossible (the `pAllocationCallbacks` parameter).\n\nIf an error occurs when initializing the decoder, you should leave `ppBackend` unset, or set to\nNULL, and make sure everything is cleaned up appropriately and an appropriate result code returned.\nWhen multiple custom backends are specified, miniaudio will cycle through the vtables in the order\nthey're listed in the array that's passed into the decoder config so it's important that your\ninitialization routine is clean.\n\nWhen a decoder is uninitialized, the `onUninit` callback will be fired which will give you an\nopportunity to clean up and internal data.\n\n\n\n9. Encoding\n===========\nThe `ma_encoding` API is used for writing audio files. The only supported output format is WAV.\nThis can be disabled by specifying the following option before the implementation of miniaudio:\n\n    ```c\n    #define MA_NO_WAV\n    ```\n\nAn encoder can be initialized to write to a file with `ma_encoder_init_file()` or from data\ndelivered via callbacks with `ma_encoder_init()`. Below is an example for initializing an encoder\nto output to a file.\n\n    ```c\n    ma_encoder_config config = ma_encoder_config_init(ma_encoding_format_wav, FORMAT, CHANNELS, SAMPLE_RATE);\n    ma_encoder encoder;\n    ma_result result = ma_encoder_init_file(\"my_file.wav\", &config, &encoder);\n    if (result != MA_SUCCESS) {\n        // Error\n    }\n\n    ...\n\n    ma_encoder_uninit(&encoder);\n    ```\n\nWhen initializing an encoder you must specify a config which is initialized with\n`ma_encoder_config_init()`. Here you must specify the file type, the output sample format, output\nchannel count and output sample rate. The following file types are supported:\n\n    +------------------------+-------------+\n    | Enum                   | Description |\n    +------------------------+-------------+\n    | ma_encoding_format_wav | WAV         |\n    +------------------------+-------------+\n\nIf the format, channel count or sample rate is not supported by the output file type an error will\nbe returned. The encoder will not perform data conversion so you will need to convert it before\noutputting any audio data. To output audio data, use `ma_encoder_write_pcm_frames()`, like in the\nexample below:\n\n    ```c\n    ma_uint64 framesWritten;\n    result = ma_encoder_write_pcm_frames(&encoder, pPCMFramesToWrite, framesToWrite, &framesWritten);\n    if (result != MA_SUCCESS) {\n        ... handle error ...\n    }\n    ```\n\nThe `framesWritten` variable will contain the number of PCM frames that were actually written. This\nis optionally and you can pass in `NULL` if you need this.\n\nEncoders must be uninitialized with `ma_encoder_uninit()`.\n\n\n\n10. Data Conversion\n===================\nA data conversion API is included with miniaudio which supports the majority of data conversion\nrequirements. This supports conversion between sample formats, channel counts (with channel\nmapping) and sample rates.\n\n\n10.1. Sample Format Conversion\n------------------------------\nConversion between sample formats is achieved with the `ma_pcm_*_to_*()`, `ma_pcm_convert()` and\n`ma_convert_pcm_frames_format()` APIs. Use `ma_pcm_*_to_*()` to convert between two specific\nformats. Use `ma_pcm_convert()` to convert based on a `ma_format` variable. Use\n`ma_convert_pcm_frames_format()` to convert PCM frames where you want to specify the frame count\nand channel count as a variable instead of the total sample count.\n\n\n10.1.1. Dithering\n-----------------\nDithering can be set using the ditherMode parameter.\n\nThe different dithering modes include the following, in order of efficiency:\n\n    +-----------+--------------------------+\n    | Type      | Enum Token               |\n    +-----------+--------------------------+\n    | None      | ma_dither_mode_none      |\n    | Rectangle | ma_dither_mode_rectangle |\n    | Triangle  | ma_dither_mode_triangle  |\n    +-----------+--------------------------+\n\nNote that even if the dither mode is set to something other than `ma_dither_mode_none`, it will be\nignored for conversions where dithering is not needed. Dithering is available for the following\nconversions:\n\n    ```\n    s16 -> u8\n    s24 -> u8\n    s32 -> u8\n    f32 -> u8\n    s24 -> s16\n    s32 -> s16\n    f32 -> s16\n    ```\n\nNote that it is not an error to pass something other than ma_dither_mode_none for conversions where\ndither is not used. It will just be ignored.\n\n\n\n10.2. Channel Conversion\n------------------------\nChannel conversion is used for channel rearrangement and conversion from one channel count to\nanother. The `ma_channel_converter` API is used for channel conversion. Below is an example of\ninitializing a simple channel converter which converts from mono to stereo.\n\n    ```c\n    ma_channel_converter_config config = ma_channel_converter_config_init(\n        ma_format,                      // Sample format\n        1,                              // Input channels\n        NULL,                           // Input channel map\n        2,                              // Output channels\n        NULL,                           // Output channel map\n        ma_channel_mix_mode_default);   // The mixing algorithm to use when combining channels.\n\n    result = ma_channel_converter_init(&config, NULL, &converter);\n    if (result != MA_SUCCESS) {\n        // Error.\n    }\n    ```\n\nTo perform the conversion simply call `ma_channel_converter_process_pcm_frames()` like so:\n\n    ```c\n    ma_result result = ma_channel_converter_process_pcm_frames(&converter, pFramesOut, pFramesIn, frameCount);\n    if (result != MA_SUCCESS) {\n        // Error.\n    }\n    ```\n\nIt is up to the caller to ensure the output buffer is large enough to accommodate the new PCM\nframes.\n\nInput and output PCM frames are always interleaved. Deinterleaved layouts are not supported.\n\n\n10.2.1. Channel Mapping\n-----------------------\nIn addition to converting from one channel count to another, like the example above, the channel\nconverter can also be used to rearrange channels. When initializing the channel converter, you can\noptionally pass in channel maps for both the input and output frames. If the channel counts are the\nsame, and each channel map contains the same channel positions with the exception that they're in\na different order, a simple shuffling of the channels will be performed. If, however, there is not\na 1:1 mapping of channel positions, or the channel counts differ, the input channels will be mixed\nbased on a mixing mode which is specified when initializing the `ma_channel_converter_config`\nobject.\n\nWhen converting from mono to multi-channel, the mono channel is simply copied to each output\nchannel. When going the other way around, the audio of each output channel is simply averaged and\ncopied to the mono channel.\n\nIn more complicated cases blending is used. The `ma_channel_mix_mode_simple` mode will drop excess\nchannels and silence extra channels. For example, converting from 4 to 2 channels, the 3rd and 4th\nchannels will be dropped, whereas converting from 2 to 4 channels will put silence into the 3rd and\n4th channels.\n\nThe `ma_channel_mix_mode_rectangle` mode uses spacial locality based on a rectangle to compute a\nsimple distribution between input and output. Imagine sitting in the middle of a room, with\nspeakers on the walls representing channel positions. The `MA_CHANNEL_FRONT_LEFT` position can be\nthought of as being in the corner of the front and left walls.\n\nFinally, the `ma_channel_mix_mode_custom_weights` mode can be used to use custom user-defined\nweights. Custom weights can be passed in as the last parameter of\n`ma_channel_converter_config_init()`.\n\nPredefined channel maps can be retrieved with `ma_channel_map_init_standard()`. This takes a\n`ma_standard_channel_map` enum as it's first parameter, which can be one of the following:\n\n    +-----------------------------------+-----------------------------------------------------------+\n    | Name                              | Description                                               |\n    +-----------------------------------+-----------------------------------------------------------+\n    | ma_standard_channel_map_default   | Default channel map used by miniaudio. See below.         |\n    | ma_standard_channel_map_microsoft | Channel map used by Microsoft's bitfield channel maps.    |\n    | ma_standard_channel_map_alsa      | Default ALSA channel map.                                 |\n    | ma_standard_channel_map_rfc3551   | RFC 3551. Based on AIFF.                                  |\n    | ma_standard_channel_map_flac      | FLAC channel map.                                         |\n    | ma_standard_channel_map_vorbis    | Vorbis channel map.                                       |\n    | ma_standard_channel_map_sound4    | FreeBSD's sound(4).                                       |\n    | ma_standard_channel_map_sndio     | sndio channel map. http://www.sndio.org/tips.html.        |\n    | ma_standard_channel_map_webaudio  | https://webaudio.github.io/web-audio-api/#ChannelOrdering |\n    +-----------------------------------+-----------------------------------------------------------+\n\nBelow are the channel maps used by default in miniaudio (`ma_standard_channel_map_default`):\n\n    +---------------+---------------------------------+\n    | Channel Count | Mapping                         |\n    +---------------+---------------------------------+\n    | 1 (Mono)      | 0: MA_CHANNEL_MONO              |\n    +---------------+---------------------------------+\n    | 2 (Stereo)    | 0: MA_CHANNEL_FRONT_LEFT   <br> |\n    |               | 1: MA_CHANNEL_FRONT_RIGHT       |\n    +---------------+---------------------------------+\n    | 3             | 0: MA_CHANNEL_FRONT_LEFT   <br> |\n    |               | 1: MA_CHANNEL_FRONT_RIGHT  <br> |\n    |               | 2: MA_CHANNEL_FRONT_CENTER      |\n    +---------------+---------------------------------+\n    | 4 (Surround)  | 0: MA_CHANNEL_FRONT_LEFT   <br> |\n    |               | 1: MA_CHANNEL_FRONT_RIGHT  <br> |\n    |               | 2: MA_CHANNEL_FRONT_CENTER <br> |\n    |               | 3: MA_CHANNEL_BACK_CENTER       |\n    +---------------+---------------------------------+\n    | 5             | 0: MA_CHANNEL_FRONT_LEFT   <br> |\n    |               | 1: MA_CHANNEL_FRONT_RIGHT  <br> |\n    |               | 2: MA_CHANNEL_FRONT_CENTER <br> |\n    |               | 3: MA_CHANNEL_BACK_LEFT    <br> |\n    |               | 4: MA_CHANNEL_BACK_RIGHT        |\n    +---------------+---------------------------------+\n    | 6 (5.1)       | 0: MA_CHANNEL_FRONT_LEFT   <br> |\n    |               | 1: MA_CHANNEL_FRONT_RIGHT  <br> |\n    |               | 2: MA_CHANNEL_FRONT_CENTER <br> |\n    |               | 3: MA_CHANNEL_LFE          <br> |\n    |               | 4: MA_CHANNEL_SIDE_LEFT    <br> |\n    |               | 5: MA_CHANNEL_SIDE_RIGHT        |\n    +---------------+---------------------------------+\n    | 7             | 0: MA_CHANNEL_FRONT_LEFT   <br> |\n    |               | 1: MA_CHANNEL_FRONT_RIGHT  <br> |\n    |               | 2: MA_CHANNEL_FRONT_CENTER <br> |\n    |               | 3: MA_CHANNEL_LFE          <br> |\n    |               | 4: MA_CHANNEL_BACK_CENTER  <br> |\n    |               | 4: MA_CHANNEL_SIDE_LEFT    <br> |\n    |               | 5: MA_CHANNEL_SIDE_RIGHT        |\n    +---------------+---------------------------------+\n    | 8 (7.1)       | 0: MA_CHANNEL_FRONT_LEFT   <br> |\n    |               | 1: MA_CHANNEL_FRONT_RIGHT  <br> |\n    |               | 2: MA_CHANNEL_FRONT_CENTER <br> |\n    |               | 3: MA_CHANNEL_LFE          <br> |\n    |               | 4: MA_CHANNEL_BACK_LEFT    <br> |\n    |               | 5: MA_CHANNEL_BACK_RIGHT   <br> |\n    |               | 6: MA_CHANNEL_SIDE_LEFT    <br> |\n    |               | 7: MA_CHANNEL_SIDE_RIGHT        |\n    +---------------+---------------------------------+\n    | Other         | All channels set to 0. This     |\n    |               | is equivalent to the same       |\n    |               | mapping as the device.          |\n    +---------------+---------------------------------+\n\n\n\n10.3. Resampling\n----------------\nResampling is achieved with the `ma_resampler` object. To create a resampler object, do something\nlike the following:\n\n    ```c\n    ma_resampler_config config = ma_resampler_config_init(\n        ma_format_s16,\n        channels,\n        sampleRateIn,\n        sampleRateOut,\n        ma_resample_algorithm_linear);\n\n    ma_resampler resampler;\n    ma_result result = ma_resampler_init(&config, &resampler);\n    if (result != MA_SUCCESS) {\n        // An error occurred...\n    }\n    ```\n\nDo the following to uninitialize the resampler:\n\n    ```c\n    ma_resampler_uninit(&resampler);\n    ```\n\nThe following example shows how data can be processed\n\n    ```c\n    ma_uint64 frameCountIn  = 1000;\n    ma_uint64 frameCountOut = 2000;\n    ma_result result = ma_resampler_process_pcm_frames(&resampler, pFramesIn, &frameCountIn, pFramesOut, &frameCountOut);\n    if (result != MA_SUCCESS) {\n        // An error occurred...\n    }\n\n    // At this point, frameCountIn contains the number of input frames that were consumed and frameCountOut contains the\n    // number of output frames written.\n    ```\n\nTo initialize the resampler you first need to set up a config (`ma_resampler_config`) with\n`ma_resampler_config_init()`. You need to specify the sample format you want to use, the number of\nchannels, the input and output sample rate, and the algorithm.\n\nThe sample format can be either `ma_format_s16` or `ma_format_f32`. If you need a different format\nyou will need to perform pre- and post-conversions yourself where necessary. Note that the format\nis the same for both input and output. The format cannot be changed after initialization.\n\nThe resampler supports multiple channels and is always interleaved (both input and output). The\nchannel count cannot be changed after initialization.\n\nThe sample rates can be anything other than zero, and are always specified in hertz. They should be\nset to something like 44100, etc. The sample rate is the only configuration property that can be\nchanged after initialization.\n\nThe miniaudio resampler has built-in support for the following algorithms:\n\n    +-----------+------------------------------+\n    | Algorithm | Enum Token                   |\n    +-----------+------------------------------+\n    | Linear    | ma_resample_algorithm_linear |\n    | Custom    | ma_resample_algorithm_custom |\n    +-----------+------------------------------+\n\nThe algorithm cannot be changed after initialization.\n\nProcessing always happens on a per PCM frame basis and always assumes interleaved input and output.\nDe-interleaved processing is not supported. To process frames, use\n`ma_resampler_process_pcm_frames()`. On input, this function takes the number of output frames you\ncan fit in the output buffer and the number of input frames contained in the input buffer. On\noutput these variables contain the number of output frames that were written to the output buffer\nand the number of input frames that were consumed in the process. You can pass in NULL for the\ninput buffer in which case it will be treated as an infinitely large buffer of zeros. The output\nbuffer can also be NULL, in which case the processing will be treated as seek.\n\nThe sample rate can be changed dynamically on the fly. You can change this with explicit sample\nrates with `ma_resampler_set_rate()` and also with a decimal ratio with\n`ma_resampler_set_rate_ratio()`. The ratio is in/out.\n\nSometimes it's useful to know exactly how many input frames will be required to output a specific\nnumber of frames. You can calculate this with `ma_resampler_get_required_input_frame_count()`.\nLikewise, it's sometimes useful to know exactly how many frames would be output given a certain\nnumber of input frames. You can do this with `ma_resampler_get_expected_output_frame_count()`.\n\nDue to the nature of how resampling works, the resampler introduces some latency. This can be\nretrieved in terms of both the input rate and the output rate with\n`ma_resampler_get_input_latency()` and `ma_resampler_get_output_latency()`.\n\n\n10.3.1. Resampling Algorithms\n-----------------------------\nThe choice of resampling algorithm depends on your situation and requirements.\n\n\n10.3.1.1. Linear Resampling\n---------------------------\nThe linear resampler is the fastest, but comes at the expense of poorer quality. There is, however,\nsome control over the quality of the linear resampler which may make it a suitable option depending\non your requirements.\n\nThe linear resampler performs low-pass filtering before or after downsampling or upsampling,\ndepending on the sample rates you're converting between. When decreasing the sample rate, the\nlow-pass filter will be applied before downsampling. When increasing the rate it will be performed\nafter upsampling. By default a fourth order low-pass filter will be applied. This can be configured\nvia the `lpfOrder` configuration variable. Setting this to 0 will disable filtering.\n\nThe low-pass filter has a cutoff frequency which defaults to half the sample rate of the lowest of\nthe input and output sample rates (Nyquist Frequency).\n\nThe API for the linear resampler is the same as the main resampler API, only it's called\n`ma_linear_resampler`.\n\n\n10.3.2. Custom Resamplers\n-------------------------\nYou can implement a custom resampler by using the `ma_resample_algorithm_custom` resampling\nalgorithm and setting a vtable in the resampler config:\n\n    ```c\n    ma_resampler_config config = ma_resampler_config_init(..., ma_resample_algorithm_custom);\n    config.pBackendVTable = &g_customResamplerVTable;\n    ```\n\nCustom resamplers are useful if the stock algorithms are not appropriate for your use case. You\nneed to implement the required functions in `ma_resampling_backend_vtable`. Note that not all\nfunctions in the vtable need to be implemented, but if it's possible to implement, they should be.\n\nYou can use the `ma_linear_resampler` object for an example on how to implement the vtable. The\n`onGetHeapSize` callback is used to calculate the size of any internal heap allocation the custom\nresampler will need to make given the supplied config. When you initialize the resampler via the\n`onInit` callback, you'll be given a pointer to a heap allocation which is where you should store\nthe heap allocated data. You should not free this data in `onUninit` because miniaudio will manage\nit for you.\n\nThe `onProcess` callback is where the actual resampling takes place. On input, `pFrameCountIn`\npoints to a variable containing the number of frames in the `pFramesIn` buffer and\n`pFrameCountOut` points to a variable containing the capacity in frames of the `pFramesOut` buffer.\nOn output, `pFrameCountIn` should be set to the number of input frames that were fully consumed,\nwhereas `pFrameCountOut` should be set to the number of frames that were written to `pFramesOut`.\n\nThe `onSetRate` callback is optional and is used for dynamically changing the sample rate. If\ndynamic rate changes are not supported, you can set this callback to NULL.\n\nThe `onGetInputLatency` and `onGetOutputLatency` functions are used for retrieving the latency in\ninput and output rates respectively. These can be NULL in which case latency calculations will be\nassumed to be NULL.\n\nThe `onGetRequiredInputFrameCount` callback is used to give miniaudio a hint as to how many input\nframes are required to be available to produce the given number of output frames. Likewise, the\n`onGetExpectedOutputFrameCount` callback is used to determine how many output frames will be\nproduced given the specified number of input frames. miniaudio will use these as a hint, but they\nare optional and can be set to NULL if you're unable to implement them.\n\n\n\n10.4. General Data Conversion\n-----------------------------\nThe `ma_data_converter` API can be used to wrap sample format conversion, channel conversion and\nresampling into one operation. This is what miniaudio uses internally to convert between the format\nrequested when the device was initialized and the format of the backend's native device. The API\nfor general data conversion is very similar to the resampling API. Create a `ma_data_converter`\nobject like this:\n\n    ```c\n    ma_data_converter_config config = ma_data_converter_config_init(\n        inputFormat,\n        outputFormat,\n        inputChannels,\n        outputChannels,\n        inputSampleRate,\n        outputSampleRate\n    );\n\n    ma_data_converter converter;\n    ma_result result = ma_data_converter_init(&config, NULL, &converter);\n    if (result != MA_SUCCESS) {\n        // An error occurred...\n    }\n    ```\n\nIn the example above we use `ma_data_converter_config_init()` to initialize the config, however\nthere's many more properties that can be configured, such as channel maps and resampling quality.\nSomething like the following may be more suitable depending on your requirements:\n\n    ```c\n    ma_data_converter_config config = ma_data_converter_config_init_default();\n    config.formatIn = inputFormat;\n    config.formatOut = outputFormat;\n    config.channelsIn = inputChannels;\n    config.channelsOut = outputChannels;\n    config.sampleRateIn = inputSampleRate;\n    config.sampleRateOut = outputSampleRate;\n    ma_channel_map_init_standard(ma_standard_channel_map_flac, config.channelMapIn, sizeof(config.channelMapIn)/sizeof(config.channelMapIn[0]), config.channelCountIn);\n    config.resampling.linear.lpfOrder = MA_MAX_FILTER_ORDER;\n    ```\n\nDo the following to uninitialize the data converter:\n\n    ```c\n    ma_data_converter_uninit(&converter, NULL);\n    ```\n\nThe following example shows how data can be processed\n\n    ```c\n    ma_uint64 frameCountIn  = 1000;\n    ma_uint64 frameCountOut = 2000;\n    ma_result result = ma_data_converter_process_pcm_frames(&converter, pFramesIn, &frameCountIn, pFramesOut, &frameCountOut);\n    if (result != MA_SUCCESS) {\n        // An error occurred...\n    }\n\n    // At this point, frameCountIn contains the number of input frames that were consumed and frameCountOut contains the number\n    // of output frames written.\n    ```\n\nThe data converter supports multiple channels and is always interleaved (both input and output).\nThe channel count cannot be changed after initialization.\n\nSample rates can be anything other than zero, and are always specified in hertz. They should be set\nto something like 44100, etc. The sample rate is the only configuration property that can be\nchanged after initialization, but only if the `resampling.allowDynamicSampleRate` member of\n`ma_data_converter_config` is set to `MA_TRUE`. To change the sample rate, use\n`ma_data_converter_set_rate()` or `ma_data_converter_set_rate_ratio()`. The ratio must be in/out.\nThe resampling algorithm cannot be changed after initialization.\n\nProcessing always happens on a per PCM frame basis and always assumes interleaved input and output.\nDe-interleaved processing is not supported. To process frames, use\n`ma_data_converter_process_pcm_frames()`. On input, this function takes the number of output frames\nyou can fit in the output buffer and the number of input frames contained in the input buffer. On\noutput these variables contain the number of output frames that were written to the output buffer\nand the number of input frames that were consumed in the process. You can pass in NULL for the\ninput buffer in which case it will be treated as an infinitely large\nbuffer of zeros. The output buffer can also be NULL, in which case the processing will be treated\nas seek.\n\nSometimes it's useful to know exactly how many input frames will be required to output a specific\nnumber of frames. You can calculate this with `ma_data_converter_get_required_input_frame_count()`.\nLikewise, it's sometimes useful to know exactly how many frames would be output given a certain\nnumber of input frames. You can do this with `ma_data_converter_get_expected_output_frame_count()`.\n\nDue to the nature of how resampling works, the data converter introduces some latency if resampling\nis required. This can be retrieved in terms of both the input rate and the output rate with\n`ma_data_converter_get_input_latency()` and `ma_data_converter_get_output_latency()`.\n\n\n\n11. Filtering\n=============\n\n11.1. Biquad Filtering\n----------------------\nBiquad filtering is achieved with the `ma_biquad` API. Example:\n\n    ```c\n    ma_biquad_config config = ma_biquad_config_init(ma_format_f32, channels, b0, b1, b2, a0, a1, a2);\n    ma_result result = ma_biquad_init(&config, &biquad);\n    if (result != MA_SUCCESS) {\n        // Error.\n    }\n\n    ...\n\n    ma_biquad_process_pcm_frames(&biquad, pFramesOut, pFramesIn, frameCount);\n    ```\n\nBiquad filtering is implemented using transposed direct form 2. The numerator coefficients are b0,\nb1 and b2, and the denominator coefficients are a0, a1 and a2. The a0 coefficient is required and\ncoefficients must not be pre-normalized.\n\nSupported formats are `ma_format_s16` and `ma_format_f32`. If you need to use a different format\nyou need to convert it yourself beforehand. When using `ma_format_s16` the biquad filter will use\nfixed point arithmetic. When using `ma_format_f32`, floating point arithmetic will be used.\n\nInput and output frames are always interleaved.\n\nFiltering can be applied in-place by passing in the same pointer for both the input and output\nbuffers, like so:\n\n    ```c\n    ma_biquad_process_pcm_frames(&biquad, pMyData, pMyData, frameCount);\n    ```\n\nIf you need to change the values of the coefficients, but maintain the values in the registers you\ncan do so with `ma_biquad_reinit()`. This is useful if you need to change the properties of the\nfilter while keeping the values of registers valid to avoid glitching. Do not use\n`ma_biquad_init()` for this as it will do a full initialization which involves clearing the\nregisters to 0. Note that changing the format or channel count after initialization is invalid and\nwill result in an error.\n\n\n11.2. Low-Pass Filtering\n------------------------\nLow-pass filtering is achieved with the following APIs:\n\n    +---------+------------------------------------------+\n    | API     | Description                              |\n    +---------+------------------------------------------+\n    | ma_lpf1 | First order low-pass filter              |\n    | ma_lpf2 | Second order low-pass filter             |\n    | ma_lpf  | High order low-pass filter (Butterworth) |\n    +---------+------------------------------------------+\n\nLow-pass filter example:\n\n    ```c\n    ma_lpf_config config = ma_lpf_config_init(ma_format_f32, channels, sampleRate, cutoffFrequency, order);\n    ma_result result = ma_lpf_init(&config, &lpf);\n    if (result != MA_SUCCESS) {\n        // Error.\n    }\n\n    ...\n\n    ma_lpf_process_pcm_frames(&lpf, pFramesOut, pFramesIn, frameCount);\n    ```\n\nSupported formats are `ma_format_s16` and` ma_format_f32`. If you need to use a different format\nyou need to convert it yourself beforehand. Input and output frames are always interleaved.\n\nFiltering can be applied in-place by passing in the same pointer for both the input and output\nbuffers, like so:\n\n    ```c\n    ma_lpf_process_pcm_frames(&lpf, pMyData, pMyData, frameCount);\n    ```\n\nThe maximum filter order is limited to `MA_MAX_FILTER_ORDER` which is set to 8. If you need more,\nyou can chain first and second order filters together.\n\n    ```c\n    for (iFilter = 0; iFilter < filterCount; iFilter += 1) {\n        ma_lpf2_process_pcm_frames(&lpf2[iFilter], pMyData, pMyData, frameCount);\n    }\n    ```\n\nIf you need to change the configuration of the filter, but need to maintain the state of internal\nregisters you can do so with `ma_lpf_reinit()`. This may be useful if you need to change the sample\nrate and/or cutoff frequency dynamically while maintaining smooth transitions. Note that changing the\nformat or channel count after initialization is invalid and will result in an error.\n\nThe `ma_lpf` object supports a configurable order, but if you only need a first order filter you\nmay want to consider using `ma_lpf1`. Likewise, if you only need a second order filter you can use\n`ma_lpf2`. The advantage of this is that they're lighter weight and a bit more efficient.\n\nIf an even filter order is specified, a series of second order filters will be processed in a\nchain. If an odd filter order is specified, a first order filter will be applied, followed by a\nseries of second order filters in a chain.\n\n\n11.3. High-Pass Filtering\n-------------------------\nHigh-pass filtering is achieved with the following APIs:\n\n    +---------+-------------------------------------------+\n    | API     | Description                               |\n    +---------+-------------------------------------------+\n    | ma_hpf1 | First order high-pass filter              |\n    | ma_hpf2 | Second order high-pass filter             |\n    | ma_hpf  | High order high-pass filter (Butterworth) |\n    +---------+-------------------------------------------+\n\nHigh-pass filters work exactly the same as low-pass filters, only the APIs are called `ma_hpf1`,\n`ma_hpf2` and `ma_hpf`. See example code for low-pass filters for example usage.\n\n\n11.4. Band-Pass Filtering\n-------------------------\nBand-pass filtering is achieved with the following APIs:\n\n    +---------+-------------------------------+\n    | API     | Description                   |\n    +---------+-------------------------------+\n    | ma_bpf2 | Second order band-pass filter |\n    | ma_bpf  | High order band-pass filter   |\n    +---------+-------------------------------+\n\nBand-pass filters work exactly the same as low-pass filters, only the APIs are called `ma_bpf2` and\n`ma_hpf`. See example code for low-pass filters for example usage. Note that the order for\nband-pass filters must be an even number which means there is no first order band-pass filter,\nunlike low-pass and high-pass filters.\n\n\n11.5. Notch Filtering\n---------------------\nNotch filtering is achieved with the following APIs:\n\n    +-----------+------------------------------------------+\n    | API       | Description                              |\n    +-----------+------------------------------------------+\n    | ma_notch2 | Second order notching filter             |\n    +-----------+------------------------------------------+\n\n\n11.6. Peaking EQ Filtering\n-------------------------\nPeaking filtering is achieved with the following APIs:\n\n    +----------+------------------------------------------+\n    | API      | Description                              |\n    +----------+------------------------------------------+\n    | ma_peak2 | Second order peaking filter              |\n    +----------+------------------------------------------+\n\n\n11.7. Low Shelf Filtering\n-------------------------\nLow shelf filtering is achieved with the following APIs:\n\n    +-------------+------------------------------------------+\n    | API         | Description                              |\n    +-------------+------------------------------------------+\n    | ma_loshelf2 | Second order low shelf filter            |\n    +-------------+------------------------------------------+\n\nWhere a high-pass filter is used to eliminate lower frequencies, a low shelf filter can be used to\njust turn them down rather than eliminate them entirely.\n\n\n11.8. High Shelf Filtering\n--------------------------\nHigh shelf filtering is achieved with the following APIs:\n\n    +-------------+------------------------------------------+\n    | API         | Description                              |\n    +-------------+------------------------------------------+\n    | ma_hishelf2 | Second order high shelf filter           |\n    +-------------+------------------------------------------+\n\nThe high shelf filter has the same API as the low shelf filter, only you would use `ma_hishelf`\ninstead of `ma_loshelf`. Where a low shelf filter is used to adjust the volume of low frequencies,\nthe high shelf filter does the same thing for high frequencies.\n\n\n\n\n12. Waveform and Noise Generation\n=================================\n\n12.1. Waveforms\n---------------\nminiaudio supports generation of sine, square, triangle and sawtooth waveforms. This is achieved\nwith the `ma_waveform` API. Example:\n\n    ```c\n    ma_waveform_config config = ma_waveform_config_init(\n        FORMAT,\n        CHANNELS,\n        SAMPLE_RATE,\n        ma_waveform_type_sine,\n        amplitude,\n        frequency);\n\n    ma_waveform waveform;\n    ma_result result = ma_waveform_init(&config, &waveform);\n    if (result != MA_SUCCESS) {\n        // Error.\n    }\n\n    ...\n\n    ma_waveform_read_pcm_frames(&waveform, pOutput, frameCount);\n    ```\n\nThe amplitude, frequency, type, and sample rate can be changed dynamically with\n`ma_waveform_set_amplitude()`, `ma_waveform_set_frequency()`, `ma_waveform_set_type()`, and\n`ma_waveform_set_sample_rate()` respectively.\n\nYou can invert the waveform by setting the amplitude to a negative value. You can use this to\ncontrol whether or not a sawtooth has a positive or negative ramp, for example.\n\nBelow are the supported waveform types:\n\n    +---------------------------+\n    | Enum Name                 |\n    +---------------------------+\n    | ma_waveform_type_sine     |\n    | ma_waveform_type_square   |\n    | ma_waveform_type_triangle |\n    | ma_waveform_type_sawtooth |\n    +---------------------------+\n\n\n\n12.2. Noise\n-----------\nminiaudio supports generation of white, pink and Brownian noise via the `ma_noise` API. Example:\n\n    ```c\n    ma_noise_config config = ma_noise_config_init(\n        FORMAT,\n        CHANNELS,\n        ma_noise_type_white,\n        SEED,\n        amplitude);\n\n    ma_noise noise;\n    ma_result result = ma_noise_init(&config, &noise);\n    if (result != MA_SUCCESS) {\n        // Error.\n    }\n\n    ...\n\n    ma_noise_read_pcm_frames(&noise, pOutput, frameCount);\n    ```\n\nThe noise API uses simple LCG random number generation. It supports a custom seed which is useful\nfor things like automated testing requiring reproducibility. Setting the seed to zero will default\nto `MA_DEFAULT_LCG_SEED`.\n\nThe amplitude and seed can be changed dynamically with `ma_noise_set_amplitude()` and\n`ma_noise_set_seed()` respectively.\n\nBy default, the noise API will use different values for different channels. So, for example, the\nleft side in a stereo stream will be different to the right side. To instead have each channel use\nthe same random value, set the `duplicateChannels` member of the noise config to true, like so:\n\n    ```c\n    config.duplicateChannels = MA_TRUE;\n    ```\n\nBelow are the supported noise types.\n\n    +------------------------+\n    | Enum Name              |\n    +------------------------+\n    | ma_noise_type_white    |\n    | ma_noise_type_pink     |\n    | ma_noise_type_brownian |\n    +------------------------+\n\n\n\n13. Audio Buffers\n=================\nminiaudio supports reading from a buffer of raw audio data via the `ma_audio_buffer` API. This can\nread from memory that's managed by the application, but can also handle the memory management for\nyou internally. Memory management is flexible and should support most use cases.\n\nAudio buffers are initialized using the standard configuration system used everywhere in miniaudio:\n\n    ```c\n    ma_audio_buffer_config config = ma_audio_buffer_config_init(\n        format,\n        channels,\n        sizeInFrames,\n        pExistingData,\n        &allocationCallbacks);\n\n    ma_audio_buffer buffer;\n    result = ma_audio_buffer_init(&config, &buffer);\n    if (result != MA_SUCCESS) {\n        // Error.\n    }\n\n    ...\n\n    ma_audio_buffer_uninit(&buffer);\n    ```\n\nIn the example above, the memory pointed to by `pExistingData` will *not* be copied and is how an\napplication can do self-managed memory allocation. If you would rather make a copy of the data, use\n`ma_audio_buffer_init_copy()`. To uninitialize the buffer, use `ma_audio_buffer_uninit()`.\n\nSometimes it can be convenient to allocate the memory for the `ma_audio_buffer` structure and the\nraw audio data in a contiguous block of memory. That is, the raw audio data will be located\nimmediately after the `ma_audio_buffer` structure. To do this, use\n`ma_audio_buffer_alloc_and_init()`:\n\n    ```c\n    ma_audio_buffer_config config = ma_audio_buffer_config_init(\n        format,\n        channels,\n        sizeInFrames,\n        pExistingData,\n        &allocationCallbacks);\n\n    ma_audio_buffer* pBuffer\n    result = ma_audio_buffer_alloc_and_init(&config, &pBuffer);\n    if (result != MA_SUCCESS) {\n        // Error\n    }\n\n    ...\n\n    ma_audio_buffer_uninit_and_free(&buffer);\n    ```\n\nIf you initialize the buffer with `ma_audio_buffer_alloc_and_init()` you should uninitialize it\nwith `ma_audio_buffer_uninit_and_free()`. In the example above, the memory pointed to by\n`pExistingData` will be copied into the buffer, which is contrary to the behavior of\n`ma_audio_buffer_init()`.\n\nAn audio buffer has a playback cursor just like a decoder. As you read frames from the buffer, the\ncursor moves forward. The last parameter (`loop`) can be used to determine if the buffer should\nloop. The return value is the number of frames actually read. If this is less than the number of\nframes requested it means the end has been reached. This should never happen if the `loop`\nparameter is set to true. If you want to manually loop back to the start, you can do so with with\n`ma_audio_buffer_seek_to_pcm_frame(pAudioBuffer, 0)`. Below is an example for reading data from an\naudio buffer.\n\n    ```c\n    ma_uint64 framesRead = ma_audio_buffer_read_pcm_frames(pAudioBuffer, pFramesOut, desiredFrameCount, isLooping);\n    if (framesRead < desiredFrameCount) {\n        // If not looping, this means the end has been reached. This should never happen in looping mode with valid input.\n    }\n    ```\n\nSometimes you may want to avoid the cost of data movement between the internal buffer and the\noutput buffer. Instead you can use memory mapping to retrieve a pointer to a segment of data:\n\n    ```c\n    void* pMappedFrames;\n    ma_uint64 frameCount = frameCountToTryMapping;\n    ma_result result = ma_audio_buffer_map(pAudioBuffer, &pMappedFrames, &frameCount);\n    if (result == MA_SUCCESS) {\n        // Map was successful. The value in frameCount will be how many frames were _actually_ mapped, which may be\n        // less due to the end of the buffer being reached.\n        ma_copy_pcm_frames(pFramesOut, pMappedFrames, frameCount, pAudioBuffer->format, pAudioBuffer->channels);\n\n        // You must unmap the buffer.\n        ma_audio_buffer_unmap(pAudioBuffer, frameCount);\n    }\n    ```\n\nWhen you use memory mapping, the read cursor is increment by the frame count passed in to\n`ma_audio_buffer_unmap()`. If you decide not to process every frame you can pass in a value smaller\nthan the value returned by `ma_audio_buffer_map()`. The disadvantage to using memory mapping is\nthat it does not handle looping for you. You can determine if the buffer is at the end for the\npurpose of looping with `ma_audio_buffer_at_end()` or by inspecting the return value of\n`ma_audio_buffer_unmap()` and checking if it equals `MA_AT_END`. You should not treat `MA_AT_END`\nas an error when returned by `ma_audio_buffer_unmap()`.\n\n\n\n14. Ring Buffers\n================\nminiaudio supports lock free (single producer, single consumer) ring buffers which are exposed via\nthe `ma_rb` and `ma_pcm_rb` APIs. The `ma_rb` API operates on bytes, whereas the `ma_pcm_rb`\noperates on PCM frames. They are otherwise identical as `ma_pcm_rb` is just a wrapper around\n`ma_rb`.\n\nUnlike most other APIs in miniaudio, ring buffers support both interleaved and deinterleaved\nstreams. The caller can also allocate their own backing memory for the ring buffer to use\ninternally for added flexibility. Otherwise the ring buffer will manage it's internal memory for\nyou.\n\nThe examples below use the PCM frame variant of the ring buffer since that's most likely the one\nyou will want to use. To initialize a ring buffer, do something like the following:\n\n    ```c\n    ma_pcm_rb rb;\n    ma_result result = ma_pcm_rb_init(FORMAT, CHANNELS, BUFFER_SIZE_IN_FRAMES, NULL, NULL, &rb);\n    if (result != MA_SUCCESS) {\n        // Error\n    }\n    ```\n\nThe `ma_pcm_rb_init()` function takes the sample format and channel count as parameters because\nit's the PCM variant of the ring buffer API. For the regular ring buffer that operates on bytes you\nwould call `ma_rb_init()` which leaves these out and just takes the size of the buffer in bytes\ninstead of frames. The fourth parameter is an optional pre-allocated buffer and the fifth parameter\nis a pointer to a `ma_allocation_callbacks` structure for custom memory allocation routines.\nPassing in `NULL` for this results in `MA_MALLOC()` and `MA_FREE()` being used.\n\nUse `ma_pcm_rb_init_ex()` if you need a deinterleaved buffer. The data for each sub-buffer is\noffset from each other based on the stride. To manage your sub-buffers you can use\n`ma_pcm_rb_get_subbuffer_stride()`, `ma_pcm_rb_get_subbuffer_offset()` and\n`ma_pcm_rb_get_subbuffer_ptr()`.\n\nUse `ma_pcm_rb_acquire_read()` and `ma_pcm_rb_acquire_write()` to retrieve a pointer to a section\nof the ring buffer. You specify the number of frames you need, and on output it will set to what\nwas actually acquired. If the read or write pointer is positioned such that the number of frames\nrequested will require a loop, it will be clamped to the end of the buffer. Therefore, the number\nof frames you're given may be less than the number you requested.\n\nAfter calling `ma_pcm_rb_acquire_read()` or `ma_pcm_rb_acquire_write()`, you do your work on the\nbuffer and then \"commit\" it with `ma_pcm_rb_commit_read()` or `ma_pcm_rb_commit_write()`. This is\nwhere the read/write pointers are updated. When you commit you need to pass in the buffer that was\nreturned by the earlier call to `ma_pcm_rb_acquire_read()` or `ma_pcm_rb_acquire_write()` and is\nonly used for validation. The number of frames passed to `ma_pcm_rb_commit_read()` and\n`ma_pcm_rb_commit_write()` is what's used to increment the pointers, and can be less that what was\noriginally requested.\n\nIf you want to correct for drift between the write pointer and the read pointer you can use a\ncombination of `ma_pcm_rb_pointer_distance()`, `ma_pcm_rb_seek_read()` and\n`ma_pcm_rb_seek_write()`. Note that you can only move the pointers forward, and you should only\nmove the read pointer forward via the consumer thread, and the write pointer forward by the\nproducer thread. If there is too much space between the pointers, move the read pointer forward. If\nthere is too little space between the pointers, move the write pointer forward.\n\nYou can use a ring buffer at the byte level instead of the PCM frame level by using the `ma_rb`\nAPI. This is exactly the same, only you will use the `ma_rb` functions instead of `ma_pcm_rb` and\ninstead of frame counts you will pass around byte counts.\n\nThe maximum size of the buffer in bytes is `0x7FFFFFFF-(MA_SIMD_ALIGNMENT-1)` due to the most\nsignificant bit being used to encode a loop flag and the internally managed buffers always being\naligned to `MA_SIMD_ALIGNMENT`.\n\nNote that the ring buffer is only thread safe when used by a single consumer thread and single\nproducer thread.\n\n\n\n15. Backends\n============\nThe following backends are supported by miniaudio. These are listed in order of default priority.\nWhen no backend is specified when initializing a context or device, miniaudio will attempt to use\neach of these backends in the order listed in the table below.\n\nNote that backends that are not usable by the build target will not be included in the build. For\nexample, ALSA, which is specific to Linux, will not be included in the Windows build.\n\n    +-------------+-----------------------+--------------------------------------------------------+\n    | Name        | Enum Name             | Supported Operating Systems                            |\n    +-------------+-----------------------+--------------------------------------------------------+\n    | WASAPI      | ma_backend_wasapi     | Windows Vista+                                         |\n    | DirectSound | ma_backend_dsound     | Windows XP+                                            |\n    | WinMM       | ma_backend_winmm      | Windows 95+                                            |\n    | Core Audio  | ma_backend_coreaudio  | macOS, iOS                                             |\n    | sndio       | ma_backend_sndio      | OpenBSD                                                |\n    | audio(4)    | ma_backend_audio4     | NetBSD, OpenBSD                                        |\n    | OSS         | ma_backend_oss        | FreeBSD                                                |\n    | PulseAudio  | ma_backend_pulseaudio | Cross Platform (disabled on Windows, BSD and Android)  |\n    | ALSA        | ma_backend_alsa       | Linux                                                  |\n    | JACK        | ma_backend_jack       | Cross Platform (disabled on BSD and Android)           |\n    | AAudio      | ma_backend_aaudio     | Android 8+                                             |\n    | OpenSL ES   | ma_backend_opensl     | Android (API level 16+)                                |\n    | Web Audio   | ma_backend_webaudio   | Web (via Emscripten)                                   |\n    | Custom      | ma_backend_custom     | Cross Platform                                         |\n    | Null        | ma_backend_null       | Cross Platform (not used on Web)                       |\n    +-------------+-----------------------+--------------------------------------------------------+\n\nSome backends have some nuance details you may want to be aware of.\n\n15.1. WASAPI\n------------\n- Low-latency shared mode will be disabled when using an application-defined sample rate which is\n  different to the device's native sample rate. To work around this, set `wasapi.noAutoConvertSRC`\n  to true in the device config. This is due to IAudioClient3_InitializeSharedAudioStream() failing\n  when the `AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM` flag is specified. Setting wasapi.noAutoConvertSRC\n  will result in miniaudio's internal resampler being used instead which will in turn enable the\n  use of low-latency shared mode.\n\n15.2. PulseAudio\n----------------\n- If you experience bad glitching/noise on Arch Linux, consider this fix from the Arch wiki:\n  https://wiki.archlinux.org/index.php/PulseAudio/Troubleshooting#Glitches,_skips_or_crackling.\n  Alternatively, consider using a different backend such as ALSA.\n\n15.3. Android\n-------------\n- To capture audio on Android, remember to add the RECORD_AUDIO permission to your manifest:\n  `<uses-permission android:name=\"android.permission.RECORD_AUDIO\" />`\n- With OpenSL|ES, only a single ma_context can be active at any given time. This is due to a\n  limitation with OpenSL|ES.\n- With AAudio, only default devices are enumerated. This is due to AAudio not having an enumeration\n  API (devices are enumerated through Java). You can however perform your own device enumeration\n  through Java and then set the ID in the ma_device_id structure (ma_device_id.aaudio) and pass it\n  to ma_device_init().\n- The backend API will perform resampling where possible. The reason for this as opposed to using\n  miniaudio's built-in resampler is to take advantage of any potential device-specific\n  optimizations the driver may implement.\n\nBSD\n---\n- The sndio backend is currently only enabled on OpenBSD builds.\n- The audio(4) backend is supported on OpenBSD, but you may need to disable sndiod before you can\n  use it.\n\n15.4. UWP\n---------\n- UWP only supports default playback and capture devices.\n- UWP requires the Microphone capability to be enabled in the application's manifest (Package.appxmanifest):\n\n    ```\n    <Package ...>\n        ...\n        <Capabilities>\n            <DeviceCapability Name=\"microphone\" />\n        </Capabilities>\n    </Package>\n    ```\n\n15.5. Web Audio / Emscripten\n----------------------------\n- You cannot use `-std=c*` compiler flags, nor `-ansi`. This only applies to the Emscripten build.\n- The first time a context is initialized it will create a global object called \"miniaudio\" whose\n  primary purpose is to act as a factory for device objects.\n- Currently the Web Audio backend uses ScriptProcessorNode's, but this may need to change later as\n  they've been deprecated.\n- Google has implemented a policy in their browsers that prevent automatic media output without\n  first receiving some kind of user input. The following web page has additional details:\n  https://developers.google.com/web/updates/2017/09/autoplay-policy-changes. Starting the device\n  may fail if you try to start playback without first handling some kind of user input.\n\n\n\n16. Optimization Tips\n=====================\nSee below for some tips on improving performance.\n\n16.1. Low Level API\n-------------------\n- In the data callback, if your data is already clipped prior to copying it into the output buffer,\n  set the `noClip` config option in the device config to true. This will disable miniaudio's built\n  in clipping function.\n- By default, miniaudio will pre-silence the data callback's output buffer. If you know that you\n  will always write valid data to the output buffer you can disable pre-silencing by setting the\n  `noPreSilence` config option in the device config to true.\n\n16.2. High Level API\n--------------------\n- If a sound does not require doppler or pitch shifting, consider disabling pitching by\n  initializing the sound with the `MA_SOUND_FLAG_NO_PITCH` flag.\n- If a sound does not require spatialization, disable it by initializing the sound with the\n  `MA_SOUND_FLAG_NO_SPATIALIZATION` flag. It can be re-enabled again post-initialization with\n  `ma_sound_set_spatialization_enabled()`.\n- If you know all of your sounds will always be the same sample rate, set the engine's sample\n  rate to match that of the sounds. Likewise, if you're using a self-managed resource manager,\n  consider setting the decoded sample rate to match your sounds. By configuring everything to\n  use a consistent sample rate, sample rate conversion can be avoided.\n\n\n\n17. Miscellaneous Notes\n=======================\n- Automatic stream routing is enabled on a per-backend basis. Support is explicitly enabled for\n  WASAPI and Core Audio, however other backends such as PulseAudio may naturally support it, though\n  not all have been tested.\n- When compiling with VC6 and earlier, decoding is restricted to files less than 2GB in size. This\n  is due to 64-bit file APIs not being available.\n*/\n\n#ifndef miniaudio_h\n#define miniaudio_h\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define MA_STRINGIFY(x)     #x\n#define MA_XSTRINGIFY(x)    MA_STRINGIFY(x)\n\n#define MA_VERSION_MAJOR    0\n#define MA_VERSION_MINOR    11\n#define MA_VERSION_REVISION 21\n#define MA_VERSION_STRING   MA_XSTRINGIFY(MA_VERSION_MAJOR) \".\" MA_XSTRINGIFY(MA_VERSION_MINOR) \".\" MA_XSTRINGIFY(MA_VERSION_REVISION)\n\n#if defined(_MSC_VER) && !defined(__clang__)\n    #pragma warning(push)\n    #pragma warning(disable:4201)   /* nonstandard extension used: nameless struct/union */\n    #pragma warning(disable:4214)   /* nonstandard extension used: bit field types other than int */\n    #pragma warning(disable:4324)   /* structure was padded due to alignment specifier */\n#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wpedantic\" /* For ISO C99 doesn't support unnamed structs/unions [-Wpedantic] */\n    #if defined(__clang__)\n        #pragma GCC diagnostic ignored \"-Wc11-extensions\"   /* anonymous unions are a C11 extension */\n    #endif\n#endif\n\n\n\n#if defined(__LP64__) || defined(_WIN64) || (defined(__x86_64__) && !defined(__ILP32__)) || defined(_M_X64) || defined(__ia64) || defined(_M_IA64) || defined(__aarch64__) || defined(_M_ARM64) || defined(__powerpc64__)\n    #define MA_SIZEOF_PTR   8\n#else\n    #define MA_SIZEOF_PTR   4\n#endif\n\n#include <stddef.h> /* For size_t. */\n\n/* Sized types. */\n#if defined(MA_USE_STDINT)\n    #include <stdint.h>\n    typedef int8_t   ma_int8;\n    typedef uint8_t  ma_uint8;\n    typedef int16_t  ma_int16;\n    typedef uint16_t ma_uint16;\n    typedef int32_t  ma_int32;\n    typedef uint32_t ma_uint32;\n    typedef int64_t  ma_int64;\n    typedef uint64_t ma_uint64;\n#else\n    typedef   signed char           ma_int8;\n    typedef unsigned char           ma_uint8;\n    typedef   signed short          ma_int16;\n    typedef unsigned short          ma_uint16;\n    typedef   signed int            ma_int32;\n    typedef unsigned int            ma_uint32;\n    #if defined(_MSC_VER) && !defined(__clang__)\n        typedef   signed __int64    ma_int64;\n        typedef unsigned __int64    ma_uint64;\n    #else\n        #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n            #pragma GCC diagnostic push\n            #pragma GCC diagnostic ignored \"-Wlong-long\"\n            #if defined(__clang__)\n                #pragma GCC diagnostic ignored \"-Wc++11-long-long\"\n            #endif\n        #endif\n        typedef   signed long long  ma_int64;\n        typedef unsigned long long  ma_uint64;\n        #if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n            #pragma GCC diagnostic pop\n        #endif\n    #endif\n#endif  /* MA_USE_STDINT */\n\n#if MA_SIZEOF_PTR == 8\n    typedef ma_uint64           ma_uintptr;\n#else\n    typedef ma_uint32           ma_uintptr;\n#endif\n\ntypedef ma_uint8    ma_bool8;\ntypedef ma_uint32   ma_bool32;\n#define MA_TRUE     1\n#define MA_FALSE    0\n\n/* These float types are not used universally by miniaudio. It's to simplify some macro expansion for atomic types. */\ntypedef float       ma_float;\ntypedef double      ma_double;\n\ntypedef void* ma_handle;\ntypedef void* ma_ptr;\n\n/*\nma_proc is annoying because when compiling with GCC we get pendantic warnings about converting\nbetween `void*` and `void (*)()`. We can't use `void (*)()` with MSVC however, because we'll get\nwarning C4191 about \"type cast between incompatible function types\". To work around this I'm going\nto use a different data type depending on the compiler.\n*/\n#if defined(__GNUC__)\ntypedef void (*ma_proc)(void);\n#else\ntypedef void* ma_proc;\n#endif\n\n#if defined(_MSC_VER) && !defined(_WCHAR_T_DEFINED)\ntypedef ma_uint16 wchar_t;\n#endif\n\n/* Define NULL for some compilers. */\n#ifndef NULL\n#define NULL 0\n#endif\n\n#if defined(SIZE_MAX)\n    #define MA_SIZE_MAX    SIZE_MAX\n#else\n    #define MA_SIZE_MAX    0xFFFFFFFF  /* When SIZE_MAX is not defined by the standard library just default to the maximum 32-bit unsigned integer. */\n#endif\n\n\n/* Platform/backend detection. */\n#if defined(_WIN32) || defined(__COSMOPOLITAN__)\n    #define MA_WIN32\n    #if defined(MA_FORCE_UWP) || (defined(WINAPI_FAMILY) && ((defined(WINAPI_FAMILY_PC_APP) && WINAPI_FAMILY == WINAPI_FAMILY_PC_APP) || (defined(WINAPI_FAMILY_PHONE_APP) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)))\n        #define MA_WIN32_UWP\n    #elif defined(WINAPI_FAMILY) && (defined(WINAPI_FAMILY_GAMES) && WINAPI_FAMILY == WINAPI_FAMILY_GAMES)\n        #define MA_WIN32_GDK\n    #else\n        #define MA_WIN32_DESKTOP\n    #endif\n#endif\n#if !defined(_WIN32)    /* If it's not Win32, assume POSIX. */\n    #define MA_POSIX\n\n    /*\n    Use the MA_NO_PTHREAD_IN_HEADER option at your own risk. This is intentionally undocumented.\n    You can use this to avoid including pthread.h in the header section. The downside is that it\n    results in some fixed sized structures being declared for the various types that are used in\n    miniaudio. The risk here is that these types might be too small for a given platform. This\n    risk is yours to take and no support will be offered if you enable this option.\n    */\n    #ifndef MA_NO_PTHREAD_IN_HEADER\n        #include <pthread.h>    /* Unfortunate #include, but needed for pthread_t, pthread_mutex_t and pthread_cond_t types. */\n        typedef pthread_t       ma_pthread_t;\n        typedef pthread_mutex_t ma_pthread_mutex_t;\n        typedef pthread_cond_t  ma_pthread_cond_t;\n    #else\n        typedef ma_uintptr      ma_pthread_t;\n        typedef union           ma_pthread_mutex_t { char __data[40]; ma_uint64 __alignment; } ma_pthread_mutex_t;\n        typedef union           ma_pthread_cond_t  { char __data[48]; ma_uint64 __alignment; } ma_pthread_cond_t;\n    #endif\n\n    #if defined(__unix__)\n        #define MA_UNIX\n    #endif\n    #if defined(__linux__)\n        #define MA_LINUX\n    #endif\n    #if defined(__APPLE__)\n        #define MA_APPLE\n    #endif\n    #if defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)\n        #define MA_BSD\n    #endif\n    #if defined(__ANDROID__)\n        #define MA_ANDROID\n    #endif\n    #if defined(__EMSCRIPTEN__)\n        #define MA_EMSCRIPTEN\n    #endif\n    #if defined(__ORBIS__)\n        #define MA_ORBIS\n    #endif\n    #if defined(__PROSPERO__)\n        #define MA_PROSPERO\n    #endif\n    #if defined(__NX__)\n        #define MA_NX\n    #endif\n    #if defined(__BEOS__) || defined(__HAIKU__)\n        #define MA_BEOS\n    #endif\n    #if defined(__HAIKU__)\n        #define MA_HAIKU\n    #endif\n#endif\n\n#if defined(__has_c_attribute)\n    #if __has_c_attribute(fallthrough)\n        #define MA_FALLTHROUGH [[fallthrough]]\n    #endif\n#endif\n#if !defined(MA_FALLTHROUGH) && defined(__has_attribute) && (defined(__clang__) || defined(__GNUC__))\n    #if __has_attribute(fallthrough)\n        #define MA_FALLTHROUGH __attribute__((fallthrough))\n    #endif\n#endif\n#if !defined(MA_FALLTHROUGH)\n    #define MA_FALLTHROUGH ((void)0)\n#endif\n\n#ifdef _MSC_VER\n    #define MA_INLINE __forceinline\n\n    /* noinline was introduced in Visual Studio 2005. */\n    #if _MSC_VER >= 1400\n        #define MA_NO_INLINE __declspec(noinline)\n    #else\n        #define MA_NO_INLINE\n    #endif\n#elif defined(__GNUC__)\n    /*\n    I've had a bug report where GCC is emitting warnings about functions possibly not being inlineable. This warning happens when\n    the __attribute__((always_inline)) attribute is defined without an \"inline\" statement. I think therefore there must be some\n    case where \"__inline__\" is not always defined, thus the compiler emitting these warnings. When using -std=c89 or -ansi on the\n    command line, we cannot use the \"inline\" keyword and instead need to use \"__inline__\". In an attempt to work around this issue\n    I am using \"__inline__\" only when we're compiling in strict ANSI mode.\n    */\n    #if defined(__STRICT_ANSI__)\n        #define MA_GNUC_INLINE_HINT __inline__\n    #else\n        #define MA_GNUC_INLINE_HINT inline\n    #endif\n\n    #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 2)) || defined(__clang__)\n        #define MA_INLINE MA_GNUC_INLINE_HINT __attribute__((always_inline))\n        #define MA_NO_INLINE __attribute__((noinline))\n    #else\n        #define MA_INLINE MA_GNUC_INLINE_HINT\n        #define MA_NO_INLINE __attribute__((noinline))\n    #endif\n#elif defined(__WATCOMC__)\n    #define MA_INLINE __inline\n    #define MA_NO_INLINE\n#else\n    #define MA_INLINE\n    #define MA_NO_INLINE\n#endif\n\n/* MA_DLL is not officially supported. You're on your own if you want to use this. */\n#if defined(MA_DLL)\n    #if defined(_WIN32)\n        #define MA_DLL_IMPORT  __declspec(dllimport)\n        #define MA_DLL_EXPORT  __declspec(dllexport)\n        #define MA_DLL_PRIVATE static\n    #else\n        #if defined(__GNUC__) && __GNUC__ >= 4\n            #define MA_DLL_IMPORT  __attribute__((visibility(\"default\")))\n            #define MA_DLL_EXPORT  __attribute__((visibility(\"default\")))\n            #define MA_DLL_PRIVATE __attribute__((visibility(\"hidden\")))\n        #else\n            #define MA_DLL_IMPORT\n            #define MA_DLL_EXPORT\n            #define MA_DLL_PRIVATE static\n        #endif\n    #endif\n#endif\n\n#if !defined(MA_API)\n    #if defined(MA_DLL)\n        #if defined(MINIAUDIO_IMPLEMENTATION) || defined(MA_IMPLEMENTATION)\n            #define MA_API  MA_DLL_EXPORT\n        #else\n            #define MA_API  MA_DLL_IMPORT\n        #endif\n    #else\n        #define MA_API extern\n    #endif\n#endif\n\n#if !defined(MA_STATIC)\n    #if defined(MA_DLL)\n        #define MA_PRIVATE MA_DLL_PRIVATE\n    #else\n        #define MA_PRIVATE static\n    #endif\n#endif\n\n\n/* SIMD alignment in bytes. Currently set to 32 bytes in preparation for future AVX optimizations. */\n#define MA_SIMD_ALIGNMENT  32\n\n/*\nSpecial wchar_t type to ensure any structures in the public sections that reference it have a\nconsistent size across all platforms.\n\nOn Windows, wchar_t is 2 bytes, whereas everywhere else it's 4 bytes. Since Windows likes to use\nwchar_t for it's IDs, we need a special explicitly sized wchar type that is always 2 bytes on all\nplatforms.\n*/\n#if !defined(MA_POSIX) && defined(MA_WIN32)\ntypedef wchar_t     ma_wchar_win32;\n#else\ntypedef ma_uint16   ma_wchar_win32;\n#endif\n\n\n\n/*\nLogging Levels\n==============\nLog levels are only used to give logging callbacks some context as to the severity of a log message\nso they can do filtering. All log levels will be posted to registered logging callbacks. If you\ndon't want to output a certain log level you can discriminate against the log level in the callback.\n\nMA_LOG_LEVEL_DEBUG\n    Used for debugging. Useful for debug and test builds, but should be disabled in release builds.\n\nMA_LOG_LEVEL_INFO\n    Informational logging. Useful for debugging. This will never be called from within the data\n    callback.\n\nMA_LOG_LEVEL_WARNING\n    Warnings. You should enable this in you development builds and action them when encounted. These\n    logs usually indicate a potential problem or misconfiguration, but still allow you to keep\n    running. This will never be called from within the data callback.\n\nMA_LOG_LEVEL_ERROR\n    Error logging. This will be fired when an operation fails and is subsequently aborted. This can\n    be fired from within the data callback, in which case the device will be stopped. You should\n    always have this log level enabled.\n*/\ntypedef enum\n{\n    MA_LOG_LEVEL_DEBUG   = 4,\n    MA_LOG_LEVEL_INFO    = 3,\n    MA_LOG_LEVEL_WARNING = 2,\n    MA_LOG_LEVEL_ERROR   = 1\n} ma_log_level;\n\n/*\nVariables needing to be accessed atomically should be declared with this macro for two reasons:\n\n    1) It allows people who read the code to identify a variable as such; and\n    2) It forces alignment on platforms where it's required or optimal.\n\nNote that for x86/64, alignment is not strictly necessary, but does have some performance\nimplications. Where supported by the compiler, alignment will be used, but otherwise if the CPU\narchitecture does not require it, it will simply leave it unaligned. This is the case with old\nversions of Visual Studio, which I've confirmed with at least VC6.\n*/\n#if !defined(_MSC_VER) && defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)\n    #include <stdalign.h>\n    #define MA_ATOMIC(alignment, type)            _Alignas(alignment) type\n#else\n    #if defined(__GNUC__)\n        /* GCC-style compilers. */\n        #define MA_ATOMIC(alignment, type)        type __attribute__((aligned(alignment)))\n    #elif defined(_MSC_VER) && _MSC_VER > 1200  /* 1200 = VC6. Alignment not supported, but not necessary because x86 is the only supported target. */\n        /* MSVC. */\n        #define MA_ATOMIC(alignment, type)        __declspec(align(alignment)) type\n    #else\n        /* Other compilers. */\n        #define MA_ATOMIC(alignment, type)        type\n    #endif\n#endif\n\ntypedef struct ma_context ma_context;\ntypedef struct ma_device ma_device;\n\ntypedef ma_uint8 ma_channel;\ntypedef enum\n{\n    MA_CHANNEL_NONE               = 0,\n    MA_CHANNEL_MONO               = 1,\n    MA_CHANNEL_FRONT_LEFT         = 2,\n    MA_CHANNEL_FRONT_RIGHT        = 3,\n    MA_CHANNEL_FRONT_CENTER       = 4,\n    MA_CHANNEL_LFE                = 5,\n    MA_CHANNEL_BACK_LEFT          = 6,\n    MA_CHANNEL_BACK_RIGHT         = 7,\n    MA_CHANNEL_FRONT_LEFT_CENTER  = 8,\n    MA_CHANNEL_FRONT_RIGHT_CENTER = 9,\n    MA_CHANNEL_BACK_CENTER        = 10,\n    MA_CHANNEL_SIDE_LEFT          = 11,\n    MA_CHANNEL_SIDE_RIGHT         = 12,\n    MA_CHANNEL_TOP_CENTER         = 13,\n    MA_CHANNEL_TOP_FRONT_LEFT     = 14,\n    MA_CHANNEL_TOP_FRONT_CENTER   = 15,\n    MA_CHANNEL_TOP_FRONT_RIGHT    = 16,\n    MA_CHANNEL_TOP_BACK_LEFT      = 17,\n    MA_CHANNEL_TOP_BACK_CENTER    = 18,\n    MA_CHANNEL_TOP_BACK_RIGHT     = 19,\n    MA_CHANNEL_AUX_0              = 20,\n    MA_CHANNEL_AUX_1              = 21,\n    MA_CHANNEL_AUX_2              = 22,\n    MA_CHANNEL_AUX_3              = 23,\n    MA_CHANNEL_AUX_4              = 24,\n    MA_CHANNEL_AUX_5              = 25,\n    MA_CHANNEL_AUX_6              = 26,\n    MA_CHANNEL_AUX_7              = 27,\n    MA_CHANNEL_AUX_8              = 28,\n    MA_CHANNEL_AUX_9              = 29,\n    MA_CHANNEL_AUX_10             = 30,\n    MA_CHANNEL_AUX_11             = 31,\n    MA_CHANNEL_AUX_12             = 32,\n    MA_CHANNEL_AUX_13             = 33,\n    MA_CHANNEL_AUX_14             = 34,\n    MA_CHANNEL_AUX_15             = 35,\n    MA_CHANNEL_AUX_16             = 36,\n    MA_CHANNEL_AUX_17             = 37,\n    MA_CHANNEL_AUX_18             = 38,\n    MA_CHANNEL_AUX_19             = 39,\n    MA_CHANNEL_AUX_20             = 40,\n    MA_CHANNEL_AUX_21             = 41,\n    MA_CHANNEL_AUX_22             = 42,\n    MA_CHANNEL_AUX_23             = 43,\n    MA_CHANNEL_AUX_24             = 44,\n    MA_CHANNEL_AUX_25             = 45,\n    MA_CHANNEL_AUX_26             = 46,\n    MA_CHANNEL_AUX_27             = 47,\n    MA_CHANNEL_AUX_28             = 48,\n    MA_CHANNEL_AUX_29             = 49,\n    MA_CHANNEL_AUX_30             = 50,\n    MA_CHANNEL_AUX_31             = 51,\n    MA_CHANNEL_LEFT               = MA_CHANNEL_FRONT_LEFT,\n    MA_CHANNEL_RIGHT              = MA_CHANNEL_FRONT_RIGHT,\n    MA_CHANNEL_POSITION_COUNT     = (MA_CHANNEL_AUX_31 + 1)\n} _ma_channel_position; /* Do not use `_ma_channel_position` directly. Use `ma_channel` instead. */\n\ntypedef enum\n{\n    MA_SUCCESS                        =  0,\n    MA_ERROR                          = -1,  /* A generic error. */\n    MA_INVALID_ARGS                   = -2,\n    MA_INVALID_OPERATION              = -3,\n    MA_OUT_OF_MEMORY                  = -4,\n    MA_OUT_OF_RANGE                   = -5,\n    MA_ACCESS_DENIED                  = -6,\n    MA_DOES_NOT_EXIST                 = -7,\n    MA_ALREADY_EXISTS                 = -8,\n    MA_TOO_MANY_OPEN_FILES            = -9,\n    MA_INVALID_FILE                   = -10,\n    MA_TOO_BIG                        = -11,\n    MA_PATH_TOO_LONG                  = -12,\n    MA_NAME_TOO_LONG                  = -13,\n    MA_NOT_DIRECTORY                  = -14,\n    MA_IS_DIRECTORY                   = -15,\n    MA_DIRECTORY_NOT_EMPTY            = -16,\n    MA_AT_END                         = -17,\n    MA_NO_SPACE                       = -18,\n    MA_BUSY                           = -19,\n    MA_IO_ERROR                       = -20,\n    MA_INTERRUPT                      = -21,\n    MA_UNAVAILABLE                    = -22,\n    MA_ALREADY_IN_USE                 = -23,\n    MA_BAD_ADDRESS                    = -24,\n    MA_BAD_SEEK                       = -25,\n    MA_BAD_PIPE                       = -26,\n    MA_DEADLOCK                       = -27,\n    MA_TOO_MANY_LINKS                 = -28,\n    MA_NOT_IMPLEMENTED                = -29,\n    MA_NO_MESSAGE                     = -30,\n    MA_BAD_MESSAGE                    = -31,\n    MA_NO_DATA_AVAILABLE              = -32,\n    MA_INVALID_DATA                   = -33,\n    MA_TIMEOUT                        = -34,\n    MA_NO_NETWORK                     = -35,\n    MA_NOT_UNIQUE                     = -36,\n    MA_NOT_SOCKET                     = -37,\n    MA_NO_ADDRESS                     = -38,\n    MA_BAD_PROTOCOL                   = -39,\n    MA_PROTOCOL_UNAVAILABLE           = -40,\n    MA_PROTOCOL_NOT_SUPPORTED         = -41,\n    MA_PROTOCOL_FAMILY_NOT_SUPPORTED  = -42,\n    MA_ADDRESS_FAMILY_NOT_SUPPORTED   = -43,\n    MA_SOCKET_NOT_SUPPORTED           = -44,\n    MA_CONNECTION_RESET               = -45,\n    MA_ALREADY_CONNECTED              = -46,\n    MA_NOT_CONNECTED                  = -47,\n    MA_CONNECTION_REFUSED             = -48,\n    MA_NO_HOST                        = -49,\n    MA_IN_PROGRESS                    = -50,\n    MA_CANCELLED                      = -51,\n    MA_MEMORY_ALREADY_MAPPED          = -52,\n\n    /* General non-standard errors. */\n    MA_CRC_MISMATCH                   = -100,\n\n    /* General miniaudio-specific errors. */\n    MA_FORMAT_NOT_SUPPORTED           = -200,\n    MA_DEVICE_TYPE_NOT_SUPPORTED      = -201,\n    MA_SHARE_MODE_NOT_SUPPORTED       = -202,\n    MA_NO_BACKEND                     = -203,\n    MA_NO_DEVICE                      = -204,\n    MA_API_NOT_FOUND                  = -205,\n    MA_INVALID_DEVICE_CONFIG          = -206,\n    MA_LOOP                           = -207,\n    MA_BACKEND_NOT_ENABLED            = -208,\n\n    /* State errors. */\n    MA_DEVICE_NOT_INITIALIZED         = -300,\n    MA_DEVICE_ALREADY_INITIALIZED     = -301,\n    MA_DEVICE_NOT_STARTED             = -302,\n    MA_DEVICE_NOT_STOPPED             = -303,\n\n    /* Operation errors. */\n    MA_FAILED_TO_INIT_BACKEND         = -400,\n    MA_FAILED_TO_OPEN_BACKEND_DEVICE  = -401,\n    MA_FAILED_TO_START_BACKEND_DEVICE = -402,\n    MA_FAILED_TO_STOP_BACKEND_DEVICE  = -403\n} ma_result;\n\n\n#define MA_MIN_CHANNELS                 1\n#ifndef MA_MAX_CHANNELS\n#define MA_MAX_CHANNELS                 254\n#endif\n\n#ifndef MA_MAX_FILTER_ORDER\n#define MA_MAX_FILTER_ORDER             8\n#endif\n\ntypedef enum\n{\n    ma_stream_format_pcm = 0\n} ma_stream_format;\n\ntypedef enum\n{\n    ma_stream_layout_interleaved = 0,\n    ma_stream_layout_deinterleaved\n} ma_stream_layout;\n\ntypedef enum\n{\n    ma_dither_mode_none = 0,\n    ma_dither_mode_rectangle,\n    ma_dither_mode_triangle\n} ma_dither_mode;\n\ntypedef enum\n{\n    /*\n    I like to keep these explicitly defined because they're used as a key into a lookup table. When items are\n    added to this, make sure there are no gaps and that they're added to the lookup table in ma_get_bytes_per_sample().\n    */\n    ma_format_unknown = 0,     /* Mainly used for indicating an error, but also used as the default for the output format for decoders. */\n    ma_format_u8      = 1,\n    ma_format_s16     = 2,     /* Seems to be the most widely supported format. */\n    ma_format_s24     = 3,     /* Tightly packed. 3 bytes per sample. */\n    ma_format_s32     = 4,\n    ma_format_f32     = 5,\n    ma_format_count\n} ma_format;\n\ntypedef enum\n{\n    /* Standard rates need to be in priority order. */\n    ma_standard_sample_rate_48000  = 48000,     /* Most common */\n    ma_standard_sample_rate_44100  = 44100,\n\n    ma_standard_sample_rate_32000  = 32000,     /* Lows */\n    ma_standard_sample_rate_24000  = 24000,\n    ma_standard_sample_rate_22050  = 22050,\n\n    ma_standard_sample_rate_88200  = 88200,     /* Highs */\n    ma_standard_sample_rate_96000  = 96000,\n    ma_standard_sample_rate_176400 = 176400,\n    ma_standard_sample_rate_192000 = 192000,\n\n    ma_standard_sample_rate_16000  = 16000,     /* Extreme lows */\n    ma_standard_sample_rate_11025  = 11025,\n    ma_standard_sample_rate_8000   = 8000,\n\n    ma_standard_sample_rate_352800 = 352800,    /* Extreme highs */\n    ma_standard_sample_rate_384000 = 384000,\n\n    ma_standard_sample_rate_min    = ma_standard_sample_rate_8000,\n    ma_standard_sample_rate_max    = ma_standard_sample_rate_384000,\n    ma_standard_sample_rate_count  = 14         /* Need to maintain the count manually. Make sure this is updated if items are added to enum. */\n} ma_standard_sample_rate;\n\n\ntypedef enum\n{\n    ma_channel_mix_mode_rectangular = 0,   /* Simple averaging based on the plane(s) the channel is sitting on. */\n    ma_channel_mix_mode_simple,            /* Drop excess channels; zeroed out extra channels. */\n    ma_channel_mix_mode_custom_weights,    /* Use custom weights specified in ma_channel_converter_config. */\n    ma_channel_mix_mode_default = ma_channel_mix_mode_rectangular\n} ma_channel_mix_mode;\n\ntypedef enum\n{\n    ma_standard_channel_map_microsoft,\n    ma_standard_channel_map_alsa,\n    ma_standard_channel_map_rfc3551,   /* Based off AIFF. */\n    ma_standard_channel_map_flac,\n    ma_standard_channel_map_vorbis,\n    ma_standard_channel_map_sound4,    /* FreeBSD's sound(4). */\n    ma_standard_channel_map_sndio,     /* www.sndio.org/tips.html */\n    ma_standard_channel_map_webaudio = ma_standard_channel_map_flac, /* https://webaudio.github.io/web-audio-api/#ChannelOrdering. Only 1, 2, 4 and 6 channels are defined, but can fill in the gaps with logical assumptions. */\n    ma_standard_channel_map_default = ma_standard_channel_map_microsoft\n} ma_standard_channel_map;\n\ntypedef enum\n{\n    ma_performance_profile_low_latency = 0,\n    ma_performance_profile_conservative\n} ma_performance_profile;\n\n\ntypedef struct\n{\n    void* pUserData;\n    void* (* onMalloc)(size_t sz, void* pUserData);\n    void* (* onRealloc)(void* p, size_t sz, void* pUserData);\n    void  (* onFree)(void* p, void* pUserData);\n} ma_allocation_callbacks;\n\ntypedef struct\n{\n    ma_int32 state;\n} ma_lcg;\n\n\n/*\nAtomics.\n\nThese are typesafe structures to prevent errors as a result of forgetting to reference variables atomically. It's too\neasy to introduce subtle bugs where you accidentally do a regular assignment instead of an atomic load/store, etc. By\nusing a struct we can enforce the use of atomics at compile time.\n\nThese types are declared in the header section because we need to reference them in structs below, but functions for\nusing them are only exposed in the implementation section. I do not want these to be part of the public API.\n\nThere's a few downsides to this system. The first is that you need to declare a new struct for each type. Below are\nsome macros to help with the declarations. They will be named like so:\n\n    ma_atomic_uint32 - atomic ma_uint32\n    ma_atomic_int32  - atomic ma_int32\n    ma_atomic_uint64 - atomic ma_uint64\n    ma_atomic_float  - atomic float\n    ma_atomic_bool32 - atomic ma_bool32\n\nThe other downside is that atomic pointers are extremely messy. You need to declare a new struct for each specific\ntype of pointer you need to make atomic. For example, an atomic ma_node* will look like this:\n\n    MA_ATOMIC_SAFE_TYPE_IMPL_PTR(node)\n\nWhich will declare a type struct that's named like so:\n\n    ma_atomic_ptr_node\n\nFunctions to use the atomic types are declared in the implementation section. All atomic functions are prefixed with\nthe name of the struct. For example:\n\n    ma_atomic_uint32_set() - Atomic store of ma_uint32\n    ma_atomic_uint32_get() - Atomic load of ma_uint32\n    etc.\n\nFor pointer types it's the same, which makes them a bit messy to use due to the length of each function name, but in\nreturn you get type safety and enforcement of atomic operations.\n*/\n#define MA_ATOMIC_SAFE_TYPE_DECL(c89TypeExtension, typeSize, type) \\\n    typedef struct \\\n    { \\\n        MA_ATOMIC(typeSize, ma_##type) value; \\\n    } ma_atomic_##type; \\\n\n#define MA_ATOMIC_SAFE_TYPE_DECL_PTR(type) \\\n    typedef struct \\\n    { \\\n        MA_ATOMIC(MA_SIZEOF_PTR, ma_##type*) value; \\\n    } ma_atomic_ptr_##type; \\\n\nMA_ATOMIC_SAFE_TYPE_DECL(32,  4, uint32)\nMA_ATOMIC_SAFE_TYPE_DECL(i32, 4, int32)\nMA_ATOMIC_SAFE_TYPE_DECL(64,  8, uint64)\nMA_ATOMIC_SAFE_TYPE_DECL(f32, 4, float)\nMA_ATOMIC_SAFE_TYPE_DECL(32,  4, bool32)\n\n\n/* Spinlocks are 32-bit for compatibility reasons. */\ntypedef ma_uint32 ma_spinlock;\n\n#ifndef MA_NO_THREADING\n    /* Thread priorities should be ordered such that the default priority of the worker thread is 0. */\n    typedef enum\n    {\n        ma_thread_priority_idle     = -5,\n        ma_thread_priority_lowest   = -4,\n        ma_thread_priority_low      = -3,\n        ma_thread_priority_normal   = -2,\n        ma_thread_priority_high     = -1,\n        ma_thread_priority_highest  =  0,\n        ma_thread_priority_realtime =  1,\n        ma_thread_priority_default  =  0\n    } ma_thread_priority;\n\n    #if defined(MA_POSIX)\n        typedef ma_pthread_t ma_thread;\n    #elif defined(MA_WIN32)\n        typedef ma_handle ma_thread;\n    #endif\n\n    #if defined(MA_POSIX)\n        typedef ma_pthread_mutex_t ma_mutex;\n    #elif defined(MA_WIN32)\n        typedef ma_handle ma_mutex;\n    #endif\n\n    #if defined(MA_POSIX)\n        typedef struct\n        {\n            ma_uint32 value;\n            ma_pthread_mutex_t lock;\n            ma_pthread_cond_t cond;\n        } ma_event;\n    #elif defined(MA_WIN32)\n        typedef ma_handle ma_event;\n    #endif\n\n    #if defined(MA_POSIX)\n        typedef struct\n        {\n            int value;\n            ma_pthread_mutex_t lock;\n            ma_pthread_cond_t cond;\n        } ma_semaphore;\n    #elif defined(MA_WIN32)\n        typedef ma_handle ma_semaphore;\n    #endif\n#else\n    /* MA_NO_THREADING is set which means threading is disabled. Threading is required by some API families. If any of these are enabled we need to throw an error. */\n    #ifndef MA_NO_DEVICE_IO\n        #error \"MA_NO_THREADING cannot be used without MA_NO_DEVICE_IO\";\n    #endif\n#endif  /* MA_NO_THREADING */\n\n\n/*\nRetrieves the version of miniaudio as separated integers. Each component can be NULL if it's not required.\n*/\nMA_API void ma_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* pRevision);\n\n/*\nRetrieves the version of miniaudio as a string which can be useful for logging purposes.\n*/\nMA_API const char* ma_version_string(void);\n\n\n/**************************************************************************************************************************************************************\n\nLogging\n\n**************************************************************************************************************************************************************/\n#include <stdarg.h> /* For va_list. */\n\n#if defined(__has_attribute)\n    #if __has_attribute(format)\n        #define MA_ATTRIBUTE_FORMAT(fmt, va) __attribute__((format(printf, fmt, va)))\n    #endif\n#endif\n#ifndef MA_ATTRIBUTE_FORMAT\n#define MA_ATTRIBUTE_FORMAT(fmt, va)\n#endif\n\n#ifndef MA_MAX_LOG_CALLBACKS\n#define MA_MAX_LOG_CALLBACKS    4\n#endif\n\n\n/*\nThe callback for handling log messages.\n\n\nParameters\n----------\npUserData (in)\n    The user data pointer that was passed into ma_log_register_callback().\n\nlogLevel (in)\n    The log level. This can be one of the following:\n\n    +----------------------+\n    | Log Level            |\n    +----------------------+\n    | MA_LOG_LEVEL_DEBUG   |\n    | MA_LOG_LEVEL_INFO    |\n    | MA_LOG_LEVEL_WARNING |\n    | MA_LOG_LEVEL_ERROR   |\n    +----------------------+\n\npMessage (in)\n    The log message.\n*/\ntypedef void (* ma_log_callback_proc)(void* pUserData, ma_uint32 level, const char* pMessage);\n\ntypedef struct\n{\n    ma_log_callback_proc onLog;\n    void* pUserData;\n} ma_log_callback;\n\nMA_API ma_log_callback ma_log_callback_init(ma_log_callback_proc onLog, void* pUserData);\n\n\ntypedef struct\n{\n    ma_log_callback callbacks[MA_MAX_LOG_CALLBACKS];\n    ma_uint32 callbackCount;\n    ma_allocation_callbacks allocationCallbacks;    /* Need to store these persistently because ma_log_postv() might need to allocate a buffer on the heap. */\n#ifndef MA_NO_THREADING\n    ma_mutex lock;  /* For thread safety just to make it easier and safer for the logging implementation. */\n#endif\n} ma_log;\n\nMA_API ma_result ma_log_init(const ma_allocation_callbacks* pAllocationCallbacks, ma_log* pLog);\nMA_API void ma_log_uninit(ma_log* pLog);\nMA_API ma_result ma_log_register_callback(ma_log* pLog, ma_log_callback callback);\nMA_API ma_result ma_log_unregister_callback(ma_log* pLog, ma_log_callback callback);\nMA_API ma_result ma_log_post(ma_log* pLog, ma_uint32 level, const char* pMessage);\nMA_API ma_result ma_log_postv(ma_log* pLog, ma_uint32 level, const char* pFormat, va_list args);\nMA_API ma_result ma_log_postf(ma_log* pLog, ma_uint32 level, const char* pFormat, ...) MA_ATTRIBUTE_FORMAT(3, 4);\n\n\n/**************************************************************************************************************************************************************\n\nBiquad Filtering\n\n**************************************************************************************************************************************************************/\ntypedef union\n{\n    float    f32;\n    ma_int32 s32;\n} ma_biquad_coefficient;\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    double b0;\n    double b1;\n    double b2;\n    double a0;\n    double a1;\n    double a2;\n} ma_biquad_config;\n\nMA_API ma_biquad_config ma_biquad_config_init(ma_format format, ma_uint32 channels, double b0, double b1, double b2, double a0, double a1, double a2);\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_biquad_coefficient b0;\n    ma_biquad_coefficient b1;\n    ma_biquad_coefficient b2;\n    ma_biquad_coefficient a1;\n    ma_biquad_coefficient a2;\n    ma_biquad_coefficient* pR1;\n    ma_biquad_coefficient* pR2;\n\n    /* Memory management. */\n    void* _pHeap;\n    ma_bool32 _ownsHeap;\n} ma_biquad;\n\nMA_API ma_result ma_biquad_get_heap_size(const ma_biquad_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_biquad_init_preallocated(const ma_biquad_config* pConfig, void* pHeap, ma_biquad* pBQ);\nMA_API ma_result ma_biquad_init(const ma_biquad_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_biquad* pBQ);\nMA_API void ma_biquad_uninit(ma_biquad* pBQ, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_biquad_reinit(const ma_biquad_config* pConfig, ma_biquad* pBQ);\nMA_API ma_result ma_biquad_clear_cache(ma_biquad* pBQ);\nMA_API ma_result ma_biquad_process_pcm_frames(ma_biquad* pBQ, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_uint32 ma_biquad_get_latency(const ma_biquad* pBQ);\n\n\n/**************************************************************************************************************************************************************\n\nLow-Pass Filtering\n\n**************************************************************************************************************************************************************/\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    double cutoffFrequency;\n    double q;\n} ma_lpf1_config, ma_lpf2_config;\n\nMA_API ma_lpf1_config ma_lpf1_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency);\nMA_API ma_lpf2_config ma_lpf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, double q);\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_biquad_coefficient a;\n    ma_biquad_coefficient* pR1;\n\n    /* Memory management. */\n    void* _pHeap;\n    ma_bool32 _ownsHeap;\n} ma_lpf1;\n\nMA_API ma_result ma_lpf1_get_heap_size(const ma_lpf1_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_lpf1_init_preallocated(const ma_lpf1_config* pConfig, void* pHeap, ma_lpf1* pLPF);\nMA_API ma_result ma_lpf1_init(const ma_lpf1_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf1* pLPF);\nMA_API void ma_lpf1_uninit(ma_lpf1* pLPF, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_lpf1_reinit(const ma_lpf1_config* pConfig, ma_lpf1* pLPF);\nMA_API ma_result ma_lpf1_clear_cache(ma_lpf1* pLPF);\nMA_API ma_result ma_lpf1_process_pcm_frames(ma_lpf1* pLPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_uint32 ma_lpf1_get_latency(const ma_lpf1* pLPF);\n\ntypedef struct\n{\n    ma_biquad bq;   /* The second order low-pass filter is implemented as a biquad filter. */\n} ma_lpf2;\n\nMA_API ma_result ma_lpf2_get_heap_size(const ma_lpf2_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_lpf2_init_preallocated(const ma_lpf2_config* pConfig, void* pHeap, ma_lpf2* pHPF);\nMA_API ma_result ma_lpf2_init(const ma_lpf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf2* pLPF);\nMA_API void ma_lpf2_uninit(ma_lpf2* pLPF, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_lpf2_reinit(const ma_lpf2_config* pConfig, ma_lpf2* pLPF);\nMA_API ma_result ma_lpf2_clear_cache(ma_lpf2* pLPF);\nMA_API ma_result ma_lpf2_process_pcm_frames(ma_lpf2* pLPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_uint32 ma_lpf2_get_latency(const ma_lpf2* pLPF);\n\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    double cutoffFrequency;\n    ma_uint32 order;    /* If set to 0, will be treated as a passthrough (no filtering will be applied). */\n} ma_lpf_config;\n\nMA_API ma_lpf_config ma_lpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order);\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_uint32 lpf1Count;\n    ma_uint32 lpf2Count;\n    ma_lpf1* pLPF1;\n    ma_lpf2* pLPF2;\n\n    /* Memory management. */\n    void* _pHeap;\n    ma_bool32 _ownsHeap;\n} ma_lpf;\n\nMA_API ma_result ma_lpf_get_heap_size(const ma_lpf_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_lpf_init_preallocated(const ma_lpf_config* pConfig, void* pHeap, ma_lpf* pLPF);\nMA_API ma_result ma_lpf_init(const ma_lpf_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf* pLPF);\nMA_API void ma_lpf_uninit(ma_lpf* pLPF, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_lpf_reinit(const ma_lpf_config* pConfig, ma_lpf* pLPF);\nMA_API ma_result ma_lpf_clear_cache(ma_lpf* pLPF);\nMA_API ma_result ma_lpf_process_pcm_frames(ma_lpf* pLPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_uint32 ma_lpf_get_latency(const ma_lpf* pLPF);\n\n\n/**************************************************************************************************************************************************************\n\nHigh-Pass Filtering\n\n**************************************************************************************************************************************************************/\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    double cutoffFrequency;\n    double q;\n} ma_hpf1_config, ma_hpf2_config;\n\nMA_API ma_hpf1_config ma_hpf1_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency);\nMA_API ma_hpf2_config ma_hpf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, double q);\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_biquad_coefficient a;\n    ma_biquad_coefficient* pR1;\n\n    /* Memory management. */\n    void* _pHeap;\n    ma_bool32 _ownsHeap;\n} ma_hpf1;\n\nMA_API ma_result ma_hpf1_get_heap_size(const ma_hpf1_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_hpf1_init_preallocated(const ma_hpf1_config* pConfig, void* pHeap, ma_hpf1* pLPF);\nMA_API ma_result ma_hpf1_init(const ma_hpf1_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf1* pHPF);\nMA_API void ma_hpf1_uninit(ma_hpf1* pHPF, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_hpf1_reinit(const ma_hpf1_config* pConfig, ma_hpf1* pHPF);\nMA_API ma_result ma_hpf1_process_pcm_frames(ma_hpf1* pHPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_uint32 ma_hpf1_get_latency(const ma_hpf1* pHPF);\n\ntypedef struct\n{\n    ma_biquad bq;   /* The second order high-pass filter is implemented as a biquad filter. */\n} ma_hpf2;\n\nMA_API ma_result ma_hpf2_get_heap_size(const ma_hpf2_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_hpf2_init_preallocated(const ma_hpf2_config* pConfig, void* pHeap, ma_hpf2* pHPF);\nMA_API ma_result ma_hpf2_init(const ma_hpf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf2* pHPF);\nMA_API void ma_hpf2_uninit(ma_hpf2* pHPF, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_hpf2_reinit(const ma_hpf2_config* pConfig, ma_hpf2* pHPF);\nMA_API ma_result ma_hpf2_process_pcm_frames(ma_hpf2* pHPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_uint32 ma_hpf2_get_latency(const ma_hpf2* pHPF);\n\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    double cutoffFrequency;\n    ma_uint32 order;    /* If set to 0, will be treated as a passthrough (no filtering will be applied). */\n} ma_hpf_config;\n\nMA_API ma_hpf_config ma_hpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order);\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_uint32 hpf1Count;\n    ma_uint32 hpf2Count;\n    ma_hpf1* pHPF1;\n    ma_hpf2* pHPF2;\n\n    /* Memory management. */\n    void* _pHeap;\n    ma_bool32 _ownsHeap;\n} ma_hpf;\n\nMA_API ma_result ma_hpf_get_heap_size(const ma_hpf_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_hpf_init_preallocated(const ma_hpf_config* pConfig, void* pHeap, ma_hpf* pLPF);\nMA_API ma_result ma_hpf_init(const ma_hpf_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf* pHPF);\nMA_API void ma_hpf_uninit(ma_hpf* pHPF, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_hpf_reinit(const ma_hpf_config* pConfig, ma_hpf* pHPF);\nMA_API ma_result ma_hpf_process_pcm_frames(ma_hpf* pHPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_uint32 ma_hpf_get_latency(const ma_hpf* pHPF);\n\n\n/**************************************************************************************************************************************************************\n\nBand-Pass Filtering\n\n**************************************************************************************************************************************************************/\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    double cutoffFrequency;\n    double q;\n} ma_bpf2_config;\n\nMA_API ma_bpf2_config ma_bpf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, double q);\n\ntypedef struct\n{\n    ma_biquad bq;   /* The second order band-pass filter is implemented as a biquad filter. */\n} ma_bpf2;\n\nMA_API ma_result ma_bpf2_get_heap_size(const ma_bpf2_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_bpf2_init_preallocated(const ma_bpf2_config* pConfig, void* pHeap, ma_bpf2* pBPF);\nMA_API ma_result ma_bpf2_init(const ma_bpf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_bpf2* pBPF);\nMA_API void ma_bpf2_uninit(ma_bpf2* pBPF, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_bpf2_reinit(const ma_bpf2_config* pConfig, ma_bpf2* pBPF);\nMA_API ma_result ma_bpf2_process_pcm_frames(ma_bpf2* pBPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_uint32 ma_bpf2_get_latency(const ma_bpf2* pBPF);\n\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    double cutoffFrequency;\n    ma_uint32 order;    /* If set to 0, will be treated as a passthrough (no filtering will be applied). */\n} ma_bpf_config;\n\nMA_API ma_bpf_config ma_bpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order);\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 bpf2Count;\n    ma_bpf2* pBPF2;\n\n    /* Memory management. */\n    void* _pHeap;\n    ma_bool32 _ownsHeap;\n} ma_bpf;\n\nMA_API ma_result ma_bpf_get_heap_size(const ma_bpf_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_bpf_init_preallocated(const ma_bpf_config* pConfig, void* pHeap, ma_bpf* pBPF);\nMA_API ma_result ma_bpf_init(const ma_bpf_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_bpf* pBPF);\nMA_API void ma_bpf_uninit(ma_bpf* pBPF, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_bpf_reinit(const ma_bpf_config* pConfig, ma_bpf* pBPF);\nMA_API ma_result ma_bpf_process_pcm_frames(ma_bpf* pBPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_uint32 ma_bpf_get_latency(const ma_bpf* pBPF);\n\n\n/**************************************************************************************************************************************************************\n\nNotching Filter\n\n**************************************************************************************************************************************************************/\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    double q;\n    double frequency;\n} ma_notch2_config, ma_notch_config;\n\nMA_API ma_notch2_config ma_notch2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double q, double frequency);\n\ntypedef struct\n{\n    ma_biquad bq;\n} ma_notch2;\n\nMA_API ma_result ma_notch2_get_heap_size(const ma_notch2_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_notch2_init_preallocated(const ma_notch2_config* pConfig, void* pHeap, ma_notch2* pFilter);\nMA_API ma_result ma_notch2_init(const ma_notch2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_notch2* pFilter);\nMA_API void ma_notch2_uninit(ma_notch2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_notch2_reinit(const ma_notch2_config* pConfig, ma_notch2* pFilter);\nMA_API ma_result ma_notch2_process_pcm_frames(ma_notch2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_uint32 ma_notch2_get_latency(const ma_notch2* pFilter);\n\n\n/**************************************************************************************************************************************************************\n\nPeaking EQ Filter\n\n**************************************************************************************************************************************************************/\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    double gainDB;\n    double q;\n    double frequency;\n} ma_peak2_config, ma_peak_config;\n\nMA_API ma_peak2_config ma_peak2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency);\n\ntypedef struct\n{\n    ma_biquad bq;\n} ma_peak2;\n\nMA_API ma_result ma_peak2_get_heap_size(const ma_peak2_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_peak2_init_preallocated(const ma_peak2_config* pConfig, void* pHeap, ma_peak2* pFilter);\nMA_API ma_result ma_peak2_init(const ma_peak2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_peak2* pFilter);\nMA_API void ma_peak2_uninit(ma_peak2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_peak2_reinit(const ma_peak2_config* pConfig, ma_peak2* pFilter);\nMA_API ma_result ma_peak2_process_pcm_frames(ma_peak2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_uint32 ma_peak2_get_latency(const ma_peak2* pFilter);\n\n\n/**************************************************************************************************************************************************************\n\nLow Shelf Filter\n\n**************************************************************************************************************************************************************/\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    double gainDB;\n    double shelfSlope;\n    double frequency;\n} ma_loshelf2_config, ma_loshelf_config;\n\nMA_API ma_loshelf2_config ma_loshelf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double shelfSlope, double frequency);\n\ntypedef struct\n{\n    ma_biquad bq;\n} ma_loshelf2;\n\nMA_API ma_result ma_loshelf2_get_heap_size(const ma_loshelf2_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_loshelf2_init_preallocated(const ma_loshelf2_config* pConfig, void* pHeap, ma_loshelf2* pFilter);\nMA_API ma_result ma_loshelf2_init(const ma_loshelf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_loshelf2* pFilter);\nMA_API void ma_loshelf2_uninit(ma_loshelf2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_loshelf2_reinit(const ma_loshelf2_config* pConfig, ma_loshelf2* pFilter);\nMA_API ma_result ma_loshelf2_process_pcm_frames(ma_loshelf2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_uint32 ma_loshelf2_get_latency(const ma_loshelf2* pFilter);\n\n\n/**************************************************************************************************************************************************************\n\nHigh Shelf Filter\n\n**************************************************************************************************************************************************************/\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    double gainDB;\n    double shelfSlope;\n    double frequency;\n} ma_hishelf2_config, ma_hishelf_config;\n\nMA_API ma_hishelf2_config ma_hishelf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double shelfSlope, double frequency);\n\ntypedef struct\n{\n    ma_biquad bq;\n} ma_hishelf2;\n\nMA_API ma_result ma_hishelf2_get_heap_size(const ma_hishelf2_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_hishelf2_init_preallocated(const ma_hishelf2_config* pConfig, void* pHeap, ma_hishelf2* pFilter);\nMA_API ma_result ma_hishelf2_init(const ma_hishelf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hishelf2* pFilter);\nMA_API void ma_hishelf2_uninit(ma_hishelf2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_hishelf2_reinit(const ma_hishelf2_config* pConfig, ma_hishelf2* pFilter);\nMA_API ma_result ma_hishelf2_process_pcm_frames(ma_hishelf2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_uint32 ma_hishelf2_get_latency(const ma_hishelf2* pFilter);\n\n\n\n/*\nDelay\n*/\ntypedef struct\n{\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_uint32 delayInFrames;\n    ma_bool32 delayStart;       /* Set to true to delay the start of the output; false otherwise. */\n    float wet;                  /* 0..1. Default = 1. */\n    float dry;                  /* 0..1. Default = 1. */\n    float decay;                /* 0..1. Default = 0 (no feedback). Feedback decay. Use this for echo. */\n} ma_delay_config;\n\nMA_API ma_delay_config ma_delay_config_init(ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 delayInFrames, float decay);\n\n\ntypedef struct\n{\n    ma_delay_config config;\n    ma_uint32 cursor;               /* Feedback is written to this cursor. Always equal or in front of the read cursor. */\n    ma_uint32 bufferSizeInFrames;\n    float* pBuffer;\n} ma_delay;\n\nMA_API ma_result ma_delay_init(const ma_delay_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_delay* pDelay);\nMA_API void ma_delay_uninit(ma_delay* pDelay, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_delay_process_pcm_frames(ma_delay* pDelay, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount);\nMA_API void ma_delay_set_wet(ma_delay* pDelay, float value);\nMA_API float ma_delay_get_wet(const ma_delay* pDelay);\nMA_API void ma_delay_set_dry(ma_delay* pDelay, float value);\nMA_API float ma_delay_get_dry(const ma_delay* pDelay);\nMA_API void ma_delay_set_decay(ma_delay* pDelay, float value);\nMA_API float ma_delay_get_decay(const ma_delay* pDelay);\n\n\n/* Gainer for smooth volume changes. */\ntypedef struct\n{\n    ma_uint32 channels;\n    ma_uint32 smoothTimeInFrames;\n} ma_gainer_config;\n\nMA_API ma_gainer_config ma_gainer_config_init(ma_uint32 channels, ma_uint32 smoothTimeInFrames);\n\n\ntypedef struct\n{\n    ma_gainer_config config;\n    ma_uint32 t;\n    float masterVolume;\n    float* pOldGains;\n    float* pNewGains;\n\n    /* Memory management. */\n    void* _pHeap;\n    ma_bool32 _ownsHeap;\n} ma_gainer;\n\nMA_API ma_result ma_gainer_get_heap_size(const ma_gainer_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_gainer_init_preallocated(const ma_gainer_config* pConfig, void* pHeap, ma_gainer* pGainer);\nMA_API ma_result ma_gainer_init(const ma_gainer_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_gainer* pGainer);\nMA_API void ma_gainer_uninit(ma_gainer* pGainer, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_gainer_process_pcm_frames(ma_gainer* pGainer, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_result ma_gainer_set_gain(ma_gainer* pGainer, float newGain);\nMA_API ma_result ma_gainer_set_gains(ma_gainer* pGainer, float* pNewGains);\nMA_API ma_result ma_gainer_set_master_volume(ma_gainer* pGainer, float volume);\nMA_API ma_result ma_gainer_get_master_volume(const ma_gainer* pGainer, float* pVolume);\n\n\n\n/* Stereo panner. */\ntypedef enum\n{\n    ma_pan_mode_balance = 0,    /* Does not blend one side with the other. Technically just a balance. Compatible with other popular audio engines and therefore the default. */\n    ma_pan_mode_pan             /* A true pan. The sound from one side will \"move\" to the other side and blend with it. */\n} ma_pan_mode;\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_pan_mode mode;\n    float pan;\n} ma_panner_config;\n\nMA_API ma_panner_config ma_panner_config_init(ma_format format, ma_uint32 channels);\n\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_pan_mode mode;\n    float pan;  /* -1..1 where 0 is no pan, -1 is left side, +1 is right side. Defaults to 0. */\n} ma_panner;\n\nMA_API ma_result ma_panner_init(const ma_panner_config* pConfig, ma_panner* pPanner);\nMA_API ma_result ma_panner_process_pcm_frames(ma_panner* pPanner, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API void ma_panner_set_mode(ma_panner* pPanner, ma_pan_mode mode);\nMA_API ma_pan_mode ma_panner_get_mode(const ma_panner* pPanner);\nMA_API void ma_panner_set_pan(ma_panner* pPanner, float pan);\nMA_API float ma_panner_get_pan(const ma_panner* pPanner);\n\n\n\n/* Fader. */\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n} ma_fader_config;\n\nMA_API ma_fader_config ma_fader_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate);\n\ntypedef struct\n{\n    ma_fader_config config;\n    float volumeBeg;            /* If volumeBeg and volumeEnd is equal to 1, no fading happens (ma_fader_process_pcm_frames() will run as a passthrough). */\n    float volumeEnd;\n    ma_uint64 lengthInFrames;   /* The total length of the fade. */\n    ma_int64  cursorInFrames;   /* The current time in frames. Incremented by ma_fader_process_pcm_frames(). Signed because it'll be offset by startOffsetInFrames in set_fade_ex(). */\n} ma_fader;\n\nMA_API ma_result ma_fader_init(const ma_fader_config* pConfig, ma_fader* pFader);\nMA_API ma_result ma_fader_process_pcm_frames(ma_fader* pFader, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API void ma_fader_get_data_format(const ma_fader* pFader, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate);\nMA_API void ma_fader_set_fade(ma_fader* pFader, float volumeBeg, float volumeEnd, ma_uint64 lengthInFrames);\nMA_API void ma_fader_set_fade_ex(ma_fader* pFader, float volumeBeg, float volumeEnd, ma_uint64 lengthInFrames, ma_int64 startOffsetInFrames);\nMA_API float ma_fader_get_current_volume(const ma_fader* pFader);\n\n\n\n/* Spatializer. */\ntypedef struct\n{\n    float x;\n    float y;\n    float z;\n} ma_vec3f;\n\ntypedef struct\n{\n    ma_vec3f v;\n    ma_spinlock lock;\n} ma_atomic_vec3f;\n\ntypedef enum\n{\n    ma_attenuation_model_none,          /* No distance attenuation and no spatialization. */\n    ma_attenuation_model_inverse,       /* Equivalent to OpenAL's AL_INVERSE_DISTANCE_CLAMPED. */\n    ma_attenuation_model_linear,        /* Linear attenuation. Equivalent to OpenAL's AL_LINEAR_DISTANCE_CLAMPED. */\n    ma_attenuation_model_exponential    /* Exponential attenuation. Equivalent to OpenAL's AL_EXPONENT_DISTANCE_CLAMPED. */\n} ma_attenuation_model;\n\ntypedef enum\n{\n    ma_positioning_absolute,\n    ma_positioning_relative\n} ma_positioning;\n\ntypedef enum\n{\n    ma_handedness_right,\n    ma_handedness_left\n} ma_handedness;\n\n\ntypedef struct\n{\n    ma_uint32 channelsOut;\n    ma_channel* pChannelMapOut;\n    ma_handedness handedness;   /* Defaults to right. Forward is -1 on the Z axis. In a left handed system, forward is +1 on the Z axis. */\n    float coneInnerAngleInRadians;\n    float coneOuterAngleInRadians;\n    float coneOuterGain;\n    float speedOfSound;\n    ma_vec3f worldUp;\n} ma_spatializer_listener_config;\n\nMA_API ma_spatializer_listener_config ma_spatializer_listener_config_init(ma_uint32 channelsOut);\n\n\ntypedef struct\n{\n    ma_spatializer_listener_config config;\n    ma_atomic_vec3f position;  /* The absolute position of the listener. */\n    ma_atomic_vec3f direction; /* The direction the listener is facing. The world up vector is config.worldUp. */\n    ma_atomic_vec3f velocity;\n    ma_bool32 isEnabled;\n\n    /* Memory management. */\n    ma_bool32 _ownsHeap;\n    void* _pHeap;\n} ma_spatializer_listener;\n\nMA_API ma_result ma_spatializer_listener_get_heap_size(const ma_spatializer_listener_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_spatializer_listener_init_preallocated(const ma_spatializer_listener_config* pConfig, void* pHeap, ma_spatializer_listener* pListener);\nMA_API ma_result ma_spatializer_listener_init(const ma_spatializer_listener_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_spatializer_listener* pListener);\nMA_API void ma_spatializer_listener_uninit(ma_spatializer_listener* pListener, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_channel* ma_spatializer_listener_get_channel_map(ma_spatializer_listener* pListener);\nMA_API void ma_spatializer_listener_set_cone(ma_spatializer_listener* pListener, float innerAngleInRadians, float outerAngleInRadians, float outerGain);\nMA_API void ma_spatializer_listener_get_cone(const ma_spatializer_listener* pListener, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain);\nMA_API void ma_spatializer_listener_set_position(ma_spatializer_listener* pListener, float x, float y, float z);\nMA_API ma_vec3f ma_spatializer_listener_get_position(const ma_spatializer_listener* pListener);\nMA_API void ma_spatializer_listener_set_direction(ma_spatializer_listener* pListener, float x, float y, float z);\nMA_API ma_vec3f ma_spatializer_listener_get_direction(const ma_spatializer_listener* pListener);\nMA_API void ma_spatializer_listener_set_velocity(ma_spatializer_listener* pListener, float x, float y, float z);\nMA_API ma_vec3f ma_spatializer_listener_get_velocity(const ma_spatializer_listener* pListener);\nMA_API void ma_spatializer_listener_set_speed_of_sound(ma_spatializer_listener* pListener, float speedOfSound);\nMA_API float ma_spatializer_listener_get_speed_of_sound(const ma_spatializer_listener* pListener);\nMA_API void ma_spatializer_listener_set_world_up(ma_spatializer_listener* pListener, float x, float y, float z);\nMA_API ma_vec3f ma_spatializer_listener_get_world_up(const ma_spatializer_listener* pListener);\nMA_API void ma_spatializer_listener_set_enabled(ma_spatializer_listener* pListener, ma_bool32 isEnabled);\nMA_API ma_bool32 ma_spatializer_listener_is_enabled(const ma_spatializer_listener* pListener);\n\n\ntypedef struct\n{\n    ma_uint32 channelsIn;\n    ma_uint32 channelsOut;\n    ma_channel* pChannelMapIn;\n    ma_attenuation_model attenuationModel;\n    ma_positioning positioning;\n    ma_handedness handedness;           /* Defaults to right. Forward is -1 on the Z axis. In a left handed system, forward is +1 on the Z axis. */\n    float minGain;\n    float maxGain;\n    float minDistance;\n    float maxDistance;\n    float rolloff;\n    float coneInnerAngleInRadians;\n    float coneOuterAngleInRadians;\n    float coneOuterGain;\n    float dopplerFactor;                /* Set to 0 to disable doppler effect. */\n    float directionalAttenuationFactor; /* Set to 0 to disable directional attenuation. */\n    float minSpatializationChannelGain; /* The minimal scaling factor to apply to channel gains when accounting for the direction of the sound relative to the listener. Must be in the range of 0..1. Smaller values means more aggressive directional panning, larger values means more subtle directional panning. */\n    ma_uint32 gainSmoothTimeInFrames;   /* When the gain of a channel changes during spatialization, the transition will be linearly interpolated over this number of frames. */\n} ma_spatializer_config;\n\nMA_API ma_spatializer_config ma_spatializer_config_init(ma_uint32 channelsIn, ma_uint32 channelsOut);\n\n\ntypedef struct\n{\n    ma_uint32 channelsIn;\n    ma_uint32 channelsOut;\n    ma_channel* pChannelMapIn;\n    ma_attenuation_model attenuationModel;\n    ma_positioning positioning;\n    ma_handedness handedness;           /* Defaults to right. Forward is -1 on the Z axis. In a left handed system, forward is +1 on the Z axis. */\n    float minGain;\n    float maxGain;\n    float minDistance;\n    float maxDistance;\n    float rolloff;\n    float coneInnerAngleInRadians;\n    float coneOuterAngleInRadians;\n    float coneOuterGain;\n    float dopplerFactor;                /* Set to 0 to disable doppler effect. */\n    float directionalAttenuationFactor; /* Set to 0 to disable directional attenuation. */\n    ma_uint32 gainSmoothTimeInFrames;   /* When the gain of a channel changes during spatialization, the transition will be linearly interpolated over this number of frames. */\n    ma_atomic_vec3f position;\n    ma_atomic_vec3f direction;\n    ma_atomic_vec3f velocity;  /* For doppler effect. */\n    float dopplerPitch; /* Will be updated by ma_spatializer_process_pcm_frames() and can be used by higher level functions to apply a pitch shift for doppler effect. */\n    float minSpatializationChannelGain;\n    ma_gainer gainer;   /* For smooth gain transitions. */\n    float* pNewChannelGainsOut; /* An offset of _pHeap. Used by ma_spatializer_process_pcm_frames() to store new channel gains. The number of elements in this array is equal to config.channelsOut. */\n\n    /* Memory management. */\n    void* _pHeap;\n    ma_bool32 _ownsHeap;\n} ma_spatializer;\n\nMA_API ma_result ma_spatializer_get_heap_size(const ma_spatializer_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_spatializer_init_preallocated(const ma_spatializer_config* pConfig, void* pHeap, ma_spatializer* pSpatializer);\nMA_API ma_result ma_spatializer_init(const ma_spatializer_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_uninit(ma_spatializer* pSpatializer, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_spatializer_process_pcm_frames(ma_spatializer* pSpatializer, ma_spatializer_listener* pListener, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_result ma_spatializer_set_master_volume(ma_spatializer* pSpatializer, float volume);\nMA_API ma_result ma_spatializer_get_master_volume(const ma_spatializer* pSpatializer, float* pVolume);\nMA_API ma_uint32 ma_spatializer_get_input_channels(const ma_spatializer* pSpatializer);\nMA_API ma_uint32 ma_spatializer_get_output_channels(const ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_set_attenuation_model(ma_spatializer* pSpatializer, ma_attenuation_model attenuationModel);\nMA_API ma_attenuation_model ma_spatializer_get_attenuation_model(const ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_set_positioning(ma_spatializer* pSpatializer, ma_positioning positioning);\nMA_API ma_positioning ma_spatializer_get_positioning(const ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_set_rolloff(ma_spatializer* pSpatializer, float rolloff);\nMA_API float ma_spatializer_get_rolloff(const ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_set_min_gain(ma_spatializer* pSpatializer, float minGain);\nMA_API float ma_spatializer_get_min_gain(const ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_set_max_gain(ma_spatializer* pSpatializer, float maxGain);\nMA_API float ma_spatializer_get_max_gain(const ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_set_min_distance(ma_spatializer* pSpatializer, float minDistance);\nMA_API float ma_spatializer_get_min_distance(const ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_set_max_distance(ma_spatializer* pSpatializer, float maxDistance);\nMA_API float ma_spatializer_get_max_distance(const ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_set_cone(ma_spatializer* pSpatializer, float innerAngleInRadians, float outerAngleInRadians, float outerGain);\nMA_API void ma_spatializer_get_cone(const ma_spatializer* pSpatializer, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain);\nMA_API void ma_spatializer_set_doppler_factor(ma_spatializer* pSpatializer, float dopplerFactor);\nMA_API float ma_spatializer_get_doppler_factor(const ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_set_directional_attenuation_factor(ma_spatializer* pSpatializer, float directionalAttenuationFactor);\nMA_API float ma_spatializer_get_directional_attenuation_factor(const ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_set_position(ma_spatializer* pSpatializer, float x, float y, float z);\nMA_API ma_vec3f ma_spatializer_get_position(const ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_set_direction(ma_spatializer* pSpatializer, float x, float y, float z);\nMA_API ma_vec3f ma_spatializer_get_direction(const ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_set_velocity(ma_spatializer* pSpatializer, float x, float y, float z);\nMA_API ma_vec3f ma_spatializer_get_velocity(const ma_spatializer* pSpatializer);\nMA_API void ma_spatializer_get_relative_position_and_direction(const ma_spatializer* pSpatializer, const ma_spatializer_listener* pListener, ma_vec3f* pRelativePos, ma_vec3f* pRelativeDir);\n\n\n\n/************************************************************************************************************************************************************\n*************************************************************************************************************************************************************\n\nDATA CONVERSION\n===============\n\nThis section contains the APIs for data conversion. You will find everything here for channel mapping, sample format conversion, resampling, etc.\n\n*************************************************************************************************************************************************************\n************************************************************************************************************************************************************/\n\n/**************************************************************************************************************************************************************\n\nResampling\n\n**************************************************************************************************************************************************************/\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRateIn;\n    ma_uint32 sampleRateOut;\n    ma_uint32 lpfOrder;         /* The low-pass filter order. Setting this to 0 will disable low-pass filtering. */\n    double    lpfNyquistFactor; /* 0..1. Defaults to 1. 1 = Half the sampling frequency (Nyquist Frequency), 0.5 = Quarter the sampling frequency (half Nyquest Frequency), etc. */\n} ma_linear_resampler_config;\n\nMA_API ma_linear_resampler_config ma_linear_resampler_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut);\n\ntypedef struct\n{\n    ma_linear_resampler_config config;\n    ma_uint32 inAdvanceInt;\n    ma_uint32 inAdvanceFrac;\n    ma_uint32 inTimeInt;\n    ma_uint32 inTimeFrac;\n    union\n    {\n        float* f32;\n        ma_int16* s16;\n    } x0; /* The previous input frame. */\n    union\n    {\n        float* f32;\n        ma_int16* s16;\n    } x1; /* The next input frame. */\n    ma_lpf lpf;\n\n    /* Memory management. */\n    void* _pHeap;\n    ma_bool32 _ownsHeap;\n} ma_linear_resampler;\n\nMA_API ma_result ma_linear_resampler_get_heap_size(const ma_linear_resampler_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_linear_resampler_init_preallocated(const ma_linear_resampler_config* pConfig, void* pHeap, ma_linear_resampler* pResampler);\nMA_API ma_result ma_linear_resampler_init(const ma_linear_resampler_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_linear_resampler* pResampler);\nMA_API void ma_linear_resampler_uninit(ma_linear_resampler* pResampler, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_linear_resampler_process_pcm_frames(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut);\nMA_API ma_result ma_linear_resampler_set_rate(ma_linear_resampler* pResampler, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut);\nMA_API ma_result ma_linear_resampler_set_rate_ratio(ma_linear_resampler* pResampler, float ratioInOut);\nMA_API ma_uint64 ma_linear_resampler_get_input_latency(const ma_linear_resampler* pResampler);\nMA_API ma_uint64 ma_linear_resampler_get_output_latency(const ma_linear_resampler* pResampler);\nMA_API ma_result ma_linear_resampler_get_required_input_frame_count(const ma_linear_resampler* pResampler, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount);\nMA_API ma_result ma_linear_resampler_get_expected_output_frame_count(const ma_linear_resampler* pResampler, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount);\nMA_API ma_result ma_linear_resampler_reset(ma_linear_resampler* pResampler);\n\n\ntypedef struct ma_resampler_config ma_resampler_config;\n\ntypedef void ma_resampling_backend;\ntypedef struct\n{\n    ma_result (* onGetHeapSize                )(void* pUserData, const ma_resampler_config* pConfig, size_t* pHeapSizeInBytes);\n    ma_result (* onInit                       )(void* pUserData, const ma_resampler_config* pConfig, void* pHeap, ma_resampling_backend** ppBackend);\n    void      (* onUninit                     )(void* pUserData, ma_resampling_backend* pBackend, const ma_allocation_callbacks* pAllocationCallbacks);\n    ma_result (* onProcess                    )(void* pUserData, ma_resampling_backend* pBackend, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut);\n    ma_result (* onSetRate                    )(void* pUserData, ma_resampling_backend* pBackend, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut);                 /* Optional. Rate changes will be disabled. */\n    ma_uint64 (* onGetInputLatency            )(void* pUserData, const ma_resampling_backend* pBackend);                                                            /* Optional. Latency will be reported as 0. */\n    ma_uint64 (* onGetOutputLatency           )(void* pUserData, const ma_resampling_backend* pBackend);                                                            /* Optional. Latency will be reported as 0. */\n    ma_result (* onGetRequiredInputFrameCount )(void* pUserData, const ma_resampling_backend* pBackend, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount);   /* Optional. Latency mitigation will be disabled. */\n    ma_result (* onGetExpectedOutputFrameCount)(void* pUserData, const ma_resampling_backend* pBackend, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount);   /* Optional. Latency mitigation will be disabled. */\n    ma_result (* onReset                      )(void* pUserData, ma_resampling_backend* pBackend);\n} ma_resampling_backend_vtable;\n\ntypedef enum\n{\n    ma_resample_algorithm_linear = 0,    /* Fastest, lowest quality. Optional low-pass filtering. Default. */\n    ma_resample_algorithm_custom,\n} ma_resample_algorithm;\n\nstruct ma_resampler_config\n{\n    ma_format format;   /* Must be either ma_format_f32 or ma_format_s16. */\n    ma_uint32 channels;\n    ma_uint32 sampleRateIn;\n    ma_uint32 sampleRateOut;\n    ma_resample_algorithm algorithm;    /* When set to ma_resample_algorithm_custom, pBackendVTable will be used. */\n    ma_resampling_backend_vtable* pBackendVTable;\n    void* pBackendUserData;\n    struct\n    {\n        ma_uint32 lpfOrder;\n    } linear;\n};\n\nMA_API ma_resampler_config ma_resampler_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut, ma_resample_algorithm algorithm);\n\ntypedef struct\n{\n    ma_resampling_backend* pBackend;\n    ma_resampling_backend_vtable* pBackendVTable;\n    void* pBackendUserData;\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRateIn;\n    ma_uint32 sampleRateOut;\n    union\n    {\n        ma_linear_resampler linear;\n    } state;    /* State for stock resamplers so we can avoid a malloc. For stock resamplers, pBackend will point here. */\n\n    /* Memory management. */\n    void* _pHeap;\n    ma_bool32 _ownsHeap;\n} ma_resampler;\n\nMA_API ma_result ma_resampler_get_heap_size(const ma_resampler_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_resampler_init_preallocated(const ma_resampler_config* pConfig, void* pHeap, ma_resampler* pResampler);\n\n/*\nInitializes a new resampler object from a config.\n*/\nMA_API ma_result ma_resampler_init(const ma_resampler_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_resampler* pResampler);\n\n/*\nUninitializes a resampler.\n*/\nMA_API void ma_resampler_uninit(ma_resampler* pResampler, const ma_allocation_callbacks* pAllocationCallbacks);\n\n/*\nConverts the given input data.\n\nBoth the input and output frames must be in the format specified in the config when the resampler was initialized.\n\nOn input, [pFrameCountOut] contains the number of output frames to process. On output it contains the number of output frames that\nwere actually processed, which may be less than the requested amount which will happen if there's not enough input data. You can use\nma_resampler_get_expected_output_frame_count() to know how many output frames will be processed for a given number of input frames.\n\nOn input, [pFrameCountIn] contains the number of input frames contained in [pFramesIn]. On output it contains the number of whole\ninput frames that were actually processed. You can use ma_resampler_get_required_input_frame_count() to know how many input frames\nyou should provide for a given number of output frames. [pFramesIn] can be NULL, in which case zeroes will be used instead.\n\nIf [pFramesOut] is NULL, a seek is performed. In this case, if [pFrameCountOut] is not NULL it will seek by the specified number of\noutput frames. Otherwise, if [pFramesCountOut] is NULL and [pFrameCountIn] is not NULL, it will seek by the specified number of input\nframes. When seeking, [pFramesIn] is allowed to NULL, in which case the internal timing state will be updated, but no input will be\nprocessed. In this case, any internal filter state will be updated as if zeroes were passed in.\n\nIt is an error for [pFramesOut] to be non-NULL and [pFrameCountOut] to be NULL.\n\nIt is an error for both [pFrameCountOut] and [pFrameCountIn] to be NULL.\n*/\nMA_API ma_result ma_resampler_process_pcm_frames(ma_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut);\n\n\n/*\nSets the input and output sample rate.\n*/\nMA_API ma_result ma_resampler_set_rate(ma_resampler* pResampler, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut);\n\n/*\nSets the input and output sample rate as a ratio.\n\nThe ration is in/out.\n*/\nMA_API ma_result ma_resampler_set_rate_ratio(ma_resampler* pResampler, float ratio);\n\n/*\nRetrieves the latency introduced by the resampler in input frames.\n*/\nMA_API ma_uint64 ma_resampler_get_input_latency(const ma_resampler* pResampler);\n\n/*\nRetrieves the latency introduced by the resampler in output frames.\n*/\nMA_API ma_uint64 ma_resampler_get_output_latency(const ma_resampler* pResampler);\n\n/*\nCalculates the number of whole input frames that would need to be read from the client in order to output the specified\nnumber of output frames.\n\nThe returned value does not include cached input frames. It only returns the number of extra frames that would need to be\nread from the input buffer in order to output the specified number of output frames.\n*/\nMA_API ma_result ma_resampler_get_required_input_frame_count(const ma_resampler* pResampler, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount);\n\n/*\nCalculates the number of whole output frames that would be output after fully reading and consuming the specified number of\ninput frames.\n*/\nMA_API ma_result ma_resampler_get_expected_output_frame_count(const ma_resampler* pResampler, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount);\n\n/*\nResets the resampler's timer and clears it's internal cache.\n*/\nMA_API ma_result ma_resampler_reset(ma_resampler* pResampler);\n\n\n/**************************************************************************************************************************************************************\n\nChannel Conversion\n\n**************************************************************************************************************************************************************/\ntypedef enum\n{\n    ma_channel_conversion_path_unknown,\n    ma_channel_conversion_path_passthrough,\n    ma_channel_conversion_path_mono_out,    /* Converting to mono. */\n    ma_channel_conversion_path_mono_in,     /* Converting from mono. */\n    ma_channel_conversion_path_shuffle,     /* Simple shuffle. Will use this when all channels are present in both input and output channel maps, but just in a different order. */\n    ma_channel_conversion_path_weights      /* Blended based on weights. */\n} ma_channel_conversion_path;\n\ntypedef enum\n{\n    ma_mono_expansion_mode_duplicate = 0,   /* The default. */\n    ma_mono_expansion_mode_average,         /* Average the mono channel across all channels. */\n    ma_mono_expansion_mode_stereo_only,     /* Duplicate to the left and right channels only and ignore the others. */\n    ma_mono_expansion_mode_default = ma_mono_expansion_mode_duplicate\n} ma_mono_expansion_mode;\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channelsIn;\n    ma_uint32 channelsOut;\n    const ma_channel* pChannelMapIn;\n    const ma_channel* pChannelMapOut;\n    ma_channel_mix_mode mixingMode;\n    ma_bool32 calculateLFEFromSpatialChannels;  /* When an output LFE channel is present, but no input LFE, set to true to set the output LFE to the average of all spatial channels (LR, FR, etc.). Ignored when an input LFE is present. */\n    float** ppWeights;  /* [in][out]. Only used when mixingMode is set to ma_channel_mix_mode_custom_weights. */\n} ma_channel_converter_config;\n\nMA_API ma_channel_converter_config ma_channel_converter_config_init(ma_format format, ma_uint32 channelsIn, const ma_channel* pChannelMapIn, ma_uint32 channelsOut, const ma_channel* pChannelMapOut, ma_channel_mix_mode mixingMode);\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channelsIn;\n    ma_uint32 channelsOut;\n    ma_channel_mix_mode mixingMode;\n    ma_channel_conversion_path conversionPath;\n    ma_channel* pChannelMapIn;\n    ma_channel* pChannelMapOut;\n    ma_uint8* pShuffleTable;    /* Indexed by output channel index. */\n    union\n    {\n        float**    f32;\n        ma_int32** s16;\n    } weights;  /* [in][out] */\n\n    /* Memory management. */\n    void* _pHeap;\n    ma_bool32 _ownsHeap;\n} ma_channel_converter;\n\nMA_API ma_result ma_channel_converter_get_heap_size(const ma_channel_converter_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_channel_converter_init_preallocated(const ma_channel_converter_config* pConfig, void* pHeap, ma_channel_converter* pConverter);\nMA_API ma_result ma_channel_converter_init(const ma_channel_converter_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_channel_converter* pConverter);\nMA_API void ma_channel_converter_uninit(ma_channel_converter* pConverter, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_channel_converter_process_pcm_frames(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount);\nMA_API ma_result ma_channel_converter_get_input_channel_map(const ma_channel_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap);\nMA_API ma_result ma_channel_converter_get_output_channel_map(const ma_channel_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap);\n\n\n/**************************************************************************************************************************************************************\n\nData Conversion\n\n**************************************************************************************************************************************************************/\ntypedef struct\n{\n    ma_format formatIn;\n    ma_format formatOut;\n    ma_uint32 channelsIn;\n    ma_uint32 channelsOut;\n    ma_uint32 sampleRateIn;\n    ma_uint32 sampleRateOut;\n    ma_channel* pChannelMapIn;\n    ma_channel* pChannelMapOut;\n    ma_dither_mode ditherMode;\n    ma_channel_mix_mode channelMixMode;\n    ma_bool32 calculateLFEFromSpatialChannels;  /* When an output LFE channel is present, but no input LFE, set to true to set the output LFE to the average of all spatial channels (LR, FR, etc.). Ignored when an input LFE is present. */\n    float** ppChannelWeights;  /* [in][out]. Only used when mixingMode is set to ma_channel_mix_mode_custom_weights. */\n    ma_bool32 allowDynamicSampleRate;\n    ma_resampler_config resampling;\n} ma_data_converter_config;\n\nMA_API ma_data_converter_config ma_data_converter_config_init_default(void);\nMA_API ma_data_converter_config ma_data_converter_config_init(ma_format formatIn, ma_format formatOut, ma_uint32 channelsIn, ma_uint32 channelsOut, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut);\n\n\ntypedef enum\n{\n    ma_data_converter_execution_path_passthrough,       /* No conversion. */\n    ma_data_converter_execution_path_format_only,       /* Only format conversion. */\n    ma_data_converter_execution_path_channels_only,     /* Only channel conversion. */\n    ma_data_converter_execution_path_resample_only,     /* Only resampling. */\n    ma_data_converter_execution_path_resample_first,    /* All conversions, but resample as the first step. */\n    ma_data_converter_execution_path_channels_first     /* All conversions, but channels as the first step. */\n} ma_data_converter_execution_path;\n\ntypedef struct\n{\n    ma_format formatIn;\n    ma_format formatOut;\n    ma_uint32 channelsIn;\n    ma_uint32 channelsOut;\n    ma_uint32 sampleRateIn;\n    ma_uint32 sampleRateOut;\n    ma_dither_mode ditherMode;\n    ma_data_converter_execution_path executionPath; /* The execution path the data converter will follow when processing. */\n    ma_channel_converter channelConverter;\n    ma_resampler resampler;\n    ma_bool8 hasPreFormatConversion;\n    ma_bool8 hasPostFormatConversion;\n    ma_bool8 hasChannelConverter;\n    ma_bool8 hasResampler;\n    ma_bool8 isPassthrough;\n\n    /* Memory management. */\n    ma_bool8 _ownsHeap;\n    void* _pHeap;\n} ma_data_converter;\n\nMA_API ma_result ma_data_converter_get_heap_size(const ma_data_converter_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_data_converter_init_preallocated(const ma_data_converter_config* pConfig, void* pHeap, ma_data_converter* pConverter);\nMA_API ma_result ma_data_converter_init(const ma_data_converter_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_converter* pConverter);\nMA_API void ma_data_converter_uninit(ma_data_converter* pConverter, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_data_converter_process_pcm_frames(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut);\nMA_API ma_result ma_data_converter_set_rate(ma_data_converter* pConverter, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut);\nMA_API ma_result ma_data_converter_set_rate_ratio(ma_data_converter* pConverter, float ratioInOut);\nMA_API ma_uint64 ma_data_converter_get_input_latency(const ma_data_converter* pConverter);\nMA_API ma_uint64 ma_data_converter_get_output_latency(const ma_data_converter* pConverter);\nMA_API ma_result ma_data_converter_get_required_input_frame_count(const ma_data_converter* pConverter, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount);\nMA_API ma_result ma_data_converter_get_expected_output_frame_count(const ma_data_converter* pConverter, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount);\nMA_API ma_result ma_data_converter_get_input_channel_map(const ma_data_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap);\nMA_API ma_result ma_data_converter_get_output_channel_map(const ma_data_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap);\nMA_API ma_result ma_data_converter_reset(ma_data_converter* pConverter);\n\n\n/************************************************************************************************************************************************************\n\nFormat Conversion\n\n************************************************************************************************************************************************************/\nMA_API void ma_pcm_u8_to_s16(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_u8_to_s24(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_u8_to_s32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_u8_to_f32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_s16_to_u8(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_s16_to_s24(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_s16_to_s32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_s16_to_f32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_s24_to_u8(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_s24_to_s16(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_s24_to_s32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_s24_to_f32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_s32_to_u8(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_s32_to_s16(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_s32_to_s24(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_s32_to_f32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_f32_to_u8(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_f32_to_s16(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_f32_to_s24(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_f32_to_s32(void* pOut, const void* pIn, ma_uint64 count, ma_dither_mode ditherMode);\nMA_API void ma_pcm_convert(void* pOut, ma_format formatOut, const void* pIn, ma_format formatIn, ma_uint64 sampleCount, ma_dither_mode ditherMode);\nMA_API void ma_convert_pcm_frames_format(void* pOut, ma_format formatOut, const void* pIn, ma_format formatIn, ma_uint64 frameCount, ma_uint32 channels, ma_dither_mode ditherMode);\n\n/*\nDeinterleaves an interleaved buffer.\n*/\nMA_API void ma_deinterleave_pcm_frames(ma_format format, ma_uint32 channels, ma_uint64 frameCount, const void* pInterleavedPCMFrames, void** ppDeinterleavedPCMFrames);\n\n/*\nInterleaves a group of deinterleaved buffers.\n*/\nMA_API void ma_interleave_pcm_frames(ma_format format, ma_uint32 channels, ma_uint64 frameCount, const void** ppDeinterleavedPCMFrames, void* pInterleavedPCMFrames);\n\n\n/************************************************************************************************************************************************************\n\nChannel Maps\n\n************************************************************************************************************************************************************/\n/*\nThis is used in the shuffle table to indicate that the channel index is undefined and should be ignored.\n*/\n#define MA_CHANNEL_INDEX_NULL   255\n\n/*\nRetrieves the channel position of the specified channel in the given channel map.\n\nThe pChannelMap parameter can be null, in which case miniaudio's default channel map will be assumed.\n*/\nMA_API ma_channel ma_channel_map_get_channel(const ma_channel* pChannelMap, ma_uint32 channelCount, ma_uint32 channelIndex);\n\n/*\nInitializes a blank channel map.\n\nWhen a blank channel map is specified anywhere it indicates that the native channel map should be used.\n*/\nMA_API void ma_channel_map_init_blank(ma_channel* pChannelMap, ma_uint32 channels);\n\n/*\nHelper for retrieving a standard channel map.\n\nThe output channel map buffer must have a capacity of at least `channelMapCap`.\n*/\nMA_API void ma_channel_map_init_standard(ma_standard_channel_map standardChannelMap, ma_channel* pChannelMap, size_t channelMapCap, ma_uint32 channels);\n\n/*\nCopies a channel map.\n\nBoth input and output channel map buffers must have a capacity of at at least `channels`.\n*/\nMA_API void ma_channel_map_copy(ma_channel* pOut, const ma_channel* pIn, ma_uint32 channels);\n\n/*\nCopies a channel map if one is specified, otherwise copies the default channel map.\n\nThe output buffer must have a capacity of at least `channels`. If not NULL, the input channel map must also have a capacity of at least `channels`.\n*/\nMA_API void ma_channel_map_copy_or_default(ma_channel* pOut, size_t channelMapCapOut, const ma_channel* pIn, ma_uint32 channels);\n\n\n/*\nDetermines whether or not a channel map is valid.\n\nA blank channel map is valid (all channels set to MA_CHANNEL_NONE). The way a blank channel map is handled is context specific, but\nis usually treated as a passthrough.\n\nInvalid channel maps:\n  - A channel map with no channels\n  - A channel map with more than one channel and a mono channel\n\nThe channel map buffer must have a capacity of at least `channels`.\n*/\nMA_API ma_bool32 ma_channel_map_is_valid(const ma_channel* pChannelMap, ma_uint32 channels);\n\n/*\nHelper for comparing two channel maps for equality.\n\nThis assumes the channel count is the same between the two.\n\nBoth channels map buffers must have a capacity of at least `channels`.\n*/\nMA_API ma_bool32 ma_channel_map_is_equal(const ma_channel* pChannelMapA, const ma_channel* pChannelMapB, ma_uint32 channels);\n\n/*\nHelper for determining if a channel map is blank (all channels set to MA_CHANNEL_NONE).\n\nThe channel map buffer must have a capacity of at least `channels`.\n*/\nMA_API ma_bool32 ma_channel_map_is_blank(const ma_channel* pChannelMap, ma_uint32 channels);\n\n/*\nHelper for determining whether or not a channel is present in the given channel map.\n\nThe channel map buffer must have a capacity of at least `channels`.\n*/\nMA_API ma_bool32 ma_channel_map_contains_channel_position(ma_uint32 channels, const ma_channel* pChannelMap, ma_channel channelPosition);\n\n/*\nFind a channel position in the given channel map. Returns MA_TRUE if the channel is found; MA_FALSE otherwise. The\nindex of the channel is output to `pChannelIndex`.\n\nThe channel map buffer must have a capacity of at least `channels`.\n*/\nMA_API ma_bool32 ma_channel_map_find_channel_position(ma_uint32 channels, const ma_channel* pChannelMap, ma_channel channelPosition, ma_uint32* pChannelIndex);\n\n/*\nGenerates a string representing the given channel map.\n\nThis is for printing and debugging purposes, not serialization/deserialization.\n\nReturns the length of the string, not including the null terminator.\n*/\nMA_API size_t ma_channel_map_to_string(const ma_channel* pChannelMap, ma_uint32 channels, char* pBufferOut, size_t bufferCap);\n\n/*\nRetrieves a human readable version of a channel position.\n*/\nMA_API const char* ma_channel_position_to_string(ma_channel channel);\n\n\n/************************************************************************************************************************************************************\n\nConversion Helpers\n\n************************************************************************************************************************************************************/\n\n/*\nHigh-level helper for doing a full format conversion in one go. Returns the number of output frames. Call this with pOut set to NULL to\ndetermine the required size of the output buffer. frameCountOut should be set to the capacity of pOut. If pOut is NULL, frameCountOut is\nignored.\n\nA return value of 0 indicates an error.\n\nThis function is useful for one-off bulk conversions, but if you're streaming data you should use the ma_data_converter APIs instead.\n*/\nMA_API ma_uint64 ma_convert_frames(void* pOut, ma_uint64 frameCountOut, ma_format formatOut, ma_uint32 channelsOut, ma_uint32 sampleRateOut, const void* pIn, ma_uint64 frameCountIn, ma_format formatIn, ma_uint32 channelsIn, ma_uint32 sampleRateIn);\nMA_API ma_uint64 ma_convert_frames_ex(void* pOut, ma_uint64 frameCountOut, const void* pIn, ma_uint64 frameCountIn, const ma_data_converter_config* pConfig);\n\n\n/************************************************************************************************************************************************************\n\nData Source\n\n************************************************************************************************************************************************************/\ntypedef void ma_data_source;\n\n#define MA_DATA_SOURCE_SELF_MANAGED_RANGE_AND_LOOP_POINT    0x00000001\n\ntypedef struct\n{\n    ma_result (* onRead)(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\n    ma_result (* onSeek)(ma_data_source* pDataSource, ma_uint64 frameIndex);\n    ma_result (* onGetDataFormat)(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);\n    ma_result (* onGetCursor)(ma_data_source* pDataSource, ma_uint64* pCursor);\n    ma_result (* onGetLength)(ma_data_source* pDataSource, ma_uint64* pLength);\n    ma_result (* onSetLooping)(ma_data_source* pDataSource, ma_bool32 isLooping);\n    ma_uint32 flags;\n} ma_data_source_vtable;\n\ntypedef ma_data_source* (* ma_data_source_get_next_proc)(ma_data_source* pDataSource);\n\ntypedef struct\n{\n    const ma_data_source_vtable* vtable;\n} ma_data_source_config;\n\nMA_API ma_data_source_config ma_data_source_config_init(void);\n\n\ntypedef struct\n{\n    const ma_data_source_vtable* vtable;\n    ma_uint64 rangeBegInFrames;\n    ma_uint64 rangeEndInFrames;             /* Set to -1 for unranged (default). */\n    ma_uint64 loopBegInFrames;              /* Relative to rangeBegInFrames. */\n    ma_uint64 loopEndInFrames;              /* Relative to rangeBegInFrames. Set to -1 for the end of the range. */\n    ma_data_source* pCurrent;               /* When non-NULL, the data source being initialized will act as a proxy and will route all operations to pCurrent. Used in conjunction with pNext/onGetNext for seamless chaining. */\n    ma_data_source* pNext;                  /* When set to NULL, onGetNext will be used. */\n    ma_data_source_get_next_proc onGetNext; /* Will be used when pNext is NULL. If both are NULL, no next will be used. */\n    MA_ATOMIC(4, ma_bool32) isLooping;\n} ma_data_source_base;\n\nMA_API ma_result ma_data_source_init(const ma_data_source_config* pConfig, ma_data_source* pDataSource);\nMA_API void ma_data_source_uninit(ma_data_source* pDataSource);\nMA_API ma_result ma_data_source_read_pcm_frames(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);   /* Must support pFramesOut = NULL in which case a forward seek should be performed. */\nMA_API ma_result ma_data_source_seek_pcm_frames(ma_data_source* pDataSource, ma_uint64 frameCount, ma_uint64* pFramesSeeked); /* Can only seek forward. Equivalent to ma_data_source_read_pcm_frames(pDataSource, NULL, frameCount, &framesRead); */\nMA_API ma_result ma_data_source_seek_to_pcm_frame(ma_data_source* pDataSource, ma_uint64 frameIndex);\nMA_API ma_result ma_data_source_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);\nMA_API ma_result ma_data_source_get_cursor_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pCursor);\nMA_API ma_result ma_data_source_get_length_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pLength);    /* Returns MA_NOT_IMPLEMENTED if the length is unknown or cannot be determined. Decoders can return this. */\nMA_API ma_result ma_data_source_get_cursor_in_seconds(ma_data_source* pDataSource, float* pCursor);\nMA_API ma_result ma_data_source_get_length_in_seconds(ma_data_source* pDataSource, float* pLength);\nMA_API ma_result ma_data_source_set_looping(ma_data_source* pDataSource, ma_bool32 isLooping);\nMA_API ma_bool32 ma_data_source_is_looping(const ma_data_source* pDataSource);\nMA_API ma_result ma_data_source_set_range_in_pcm_frames(ma_data_source* pDataSource, ma_uint64 rangeBegInFrames, ma_uint64 rangeEndInFrames);\nMA_API void ma_data_source_get_range_in_pcm_frames(const ma_data_source* pDataSource, ma_uint64* pRangeBegInFrames, ma_uint64* pRangeEndInFrames);\nMA_API ma_result ma_data_source_set_loop_point_in_pcm_frames(ma_data_source* pDataSource, ma_uint64 loopBegInFrames, ma_uint64 loopEndInFrames);\nMA_API void ma_data_source_get_loop_point_in_pcm_frames(const ma_data_source* pDataSource, ma_uint64* pLoopBegInFrames, ma_uint64* pLoopEndInFrames);\nMA_API ma_result ma_data_source_set_current(ma_data_source* pDataSource, ma_data_source* pCurrentDataSource);\nMA_API ma_data_source* ma_data_source_get_current(const ma_data_source* pDataSource);\nMA_API ma_result ma_data_source_set_next(ma_data_source* pDataSource, ma_data_source* pNextDataSource);\nMA_API ma_data_source* ma_data_source_get_next(const ma_data_source* pDataSource);\nMA_API ma_result ma_data_source_set_next_callback(ma_data_source* pDataSource, ma_data_source_get_next_proc onGetNext);\nMA_API ma_data_source_get_next_proc ma_data_source_get_next_callback(const ma_data_source* pDataSource);\n\n\ntypedef struct\n{\n    ma_data_source_base ds;\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_uint64 cursor;\n    ma_uint64 sizeInFrames;\n    const void* pData;\n} ma_audio_buffer_ref;\n\nMA_API ma_result ma_audio_buffer_ref_init(ma_format format, ma_uint32 channels, const void* pData, ma_uint64 sizeInFrames, ma_audio_buffer_ref* pAudioBufferRef);\nMA_API void ma_audio_buffer_ref_uninit(ma_audio_buffer_ref* pAudioBufferRef);\nMA_API ma_result ma_audio_buffer_ref_set_data(ma_audio_buffer_ref* pAudioBufferRef, const void* pData, ma_uint64 sizeInFrames);\nMA_API ma_uint64 ma_audio_buffer_ref_read_pcm_frames(ma_audio_buffer_ref* pAudioBufferRef, void* pFramesOut, ma_uint64 frameCount, ma_bool32 loop);\nMA_API ma_result ma_audio_buffer_ref_seek_to_pcm_frame(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameIndex);\nMA_API ma_result ma_audio_buffer_ref_map(ma_audio_buffer_ref* pAudioBufferRef, void** ppFramesOut, ma_uint64* pFrameCount);\nMA_API ma_result ma_audio_buffer_ref_unmap(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameCount);    /* Returns MA_AT_END if the end has been reached. This should be considered successful. */\nMA_API ma_bool32 ma_audio_buffer_ref_at_end(const ma_audio_buffer_ref* pAudioBufferRef);\nMA_API ma_result ma_audio_buffer_ref_get_cursor_in_pcm_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pCursor);\nMA_API ma_result ma_audio_buffer_ref_get_length_in_pcm_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pLength);\nMA_API ma_result ma_audio_buffer_ref_get_available_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pAvailableFrames);\n\n\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_uint64 sizeInFrames;\n    const void* pData;  /* If set to NULL, will allocate a block of memory for you. */\n    ma_allocation_callbacks allocationCallbacks;\n} ma_audio_buffer_config;\n\nMA_API ma_audio_buffer_config ma_audio_buffer_config_init(ma_format format, ma_uint32 channels, ma_uint64 sizeInFrames, const void* pData, const ma_allocation_callbacks* pAllocationCallbacks);\n\ntypedef struct\n{\n    ma_audio_buffer_ref ref;\n    ma_allocation_callbacks allocationCallbacks;\n    ma_bool32 ownsData;             /* Used to control whether or not miniaudio owns the data buffer. If set to true, pData will be freed in ma_audio_buffer_uninit(). */\n    ma_uint8 _pExtraData[1];        /* For allocating a buffer with the memory located directly after the other memory of the structure. */\n} ma_audio_buffer;\n\nMA_API ma_result ma_audio_buffer_init(const ma_audio_buffer_config* pConfig, ma_audio_buffer* pAudioBuffer);\nMA_API ma_result ma_audio_buffer_init_copy(const ma_audio_buffer_config* pConfig, ma_audio_buffer* pAudioBuffer);\nMA_API ma_result ma_audio_buffer_alloc_and_init(const ma_audio_buffer_config* pConfig, ma_audio_buffer** ppAudioBuffer);  /* Always copies the data. Doesn't make sense to use this otherwise. Use ma_audio_buffer_uninit_and_free() to uninit. */\nMA_API void ma_audio_buffer_uninit(ma_audio_buffer* pAudioBuffer);\nMA_API void ma_audio_buffer_uninit_and_free(ma_audio_buffer* pAudioBuffer);\nMA_API ma_uint64 ma_audio_buffer_read_pcm_frames(ma_audio_buffer* pAudioBuffer, void* pFramesOut, ma_uint64 frameCount, ma_bool32 loop);\nMA_API ma_result ma_audio_buffer_seek_to_pcm_frame(ma_audio_buffer* pAudioBuffer, ma_uint64 frameIndex);\nMA_API ma_result ma_audio_buffer_map(ma_audio_buffer* pAudioBuffer, void** ppFramesOut, ma_uint64* pFrameCount);\nMA_API ma_result ma_audio_buffer_unmap(ma_audio_buffer* pAudioBuffer, ma_uint64 frameCount);    /* Returns MA_AT_END if the end has been reached. This should be considered successful. */\nMA_API ma_bool32 ma_audio_buffer_at_end(const ma_audio_buffer* pAudioBuffer);\nMA_API ma_result ma_audio_buffer_get_cursor_in_pcm_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pCursor);\nMA_API ma_result ma_audio_buffer_get_length_in_pcm_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pLength);\nMA_API ma_result ma_audio_buffer_get_available_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pAvailableFrames);\n\n\n/*\nPaged Audio Buffer\n==================\nA paged audio buffer is made up of a linked list of pages. It's expandable, but not shrinkable. It\ncan be used for cases where audio data is streamed in asynchronously while allowing data to be read\nat the same time.\n\nThis is lock-free, but not 100% thread safe. You can append a page and read from the buffer across\nsimultaneously across different threads, however only one thread at a time can append, and only one\nthread at a time can read and seek.\n*/\ntypedef struct ma_paged_audio_buffer_page ma_paged_audio_buffer_page;\nstruct ma_paged_audio_buffer_page\n{\n    MA_ATOMIC(MA_SIZEOF_PTR, ma_paged_audio_buffer_page*) pNext;\n    ma_uint64 sizeInFrames;\n    ma_uint8 pAudioData[1];\n};\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_paged_audio_buffer_page head;                                /* Dummy head for the lock-free algorithm. Always has a size of 0. */\n    MA_ATOMIC(MA_SIZEOF_PTR, ma_paged_audio_buffer_page*) pTail;    /* Never null. Initially set to &head. */\n} ma_paged_audio_buffer_data;\n\nMA_API ma_result ma_paged_audio_buffer_data_init(ma_format format, ma_uint32 channels, ma_paged_audio_buffer_data* pData);\nMA_API void ma_paged_audio_buffer_data_uninit(ma_paged_audio_buffer_data* pData, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_paged_audio_buffer_page* ma_paged_audio_buffer_data_get_head(ma_paged_audio_buffer_data* pData);\nMA_API ma_paged_audio_buffer_page* ma_paged_audio_buffer_data_get_tail(ma_paged_audio_buffer_data* pData);\nMA_API ma_result ma_paged_audio_buffer_data_get_length_in_pcm_frames(ma_paged_audio_buffer_data* pData, ma_uint64* pLength);\nMA_API ma_result ma_paged_audio_buffer_data_allocate_page(ma_paged_audio_buffer_data* pData, ma_uint64 pageSizeInFrames, const void* pInitialData, const ma_allocation_callbacks* pAllocationCallbacks, ma_paged_audio_buffer_page** ppPage);\nMA_API ma_result ma_paged_audio_buffer_data_free_page(ma_paged_audio_buffer_data* pData, ma_paged_audio_buffer_page* pPage, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_paged_audio_buffer_data_append_page(ma_paged_audio_buffer_data* pData, ma_paged_audio_buffer_page* pPage);\nMA_API ma_result ma_paged_audio_buffer_data_allocate_and_append_page(ma_paged_audio_buffer_data* pData, ma_uint32 pageSizeInFrames, const void* pInitialData, const ma_allocation_callbacks* pAllocationCallbacks);\n\n\ntypedef struct\n{\n    ma_paged_audio_buffer_data* pData;  /* Must not be null. */\n} ma_paged_audio_buffer_config;\n\nMA_API ma_paged_audio_buffer_config ma_paged_audio_buffer_config_init(ma_paged_audio_buffer_data* pData);\n\n\ntypedef struct\n{\n    ma_data_source_base ds;\n    ma_paged_audio_buffer_data* pData;              /* Audio data is read from here. Cannot be null. */\n    ma_paged_audio_buffer_page* pCurrent;\n    ma_uint64 relativeCursor;                       /* Relative to the current page. */\n    ma_uint64 absoluteCursor;\n} ma_paged_audio_buffer;\n\nMA_API ma_result ma_paged_audio_buffer_init(const ma_paged_audio_buffer_config* pConfig, ma_paged_audio_buffer* pPagedAudioBuffer);\nMA_API void ma_paged_audio_buffer_uninit(ma_paged_audio_buffer* pPagedAudioBuffer);\nMA_API ma_result ma_paged_audio_buffer_read_pcm_frames(ma_paged_audio_buffer* pPagedAudioBuffer, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);   /* Returns MA_AT_END if no more pages available. */\nMA_API ma_result ma_paged_audio_buffer_seek_to_pcm_frame(ma_paged_audio_buffer* pPagedAudioBuffer, ma_uint64 frameIndex);\nMA_API ma_result ma_paged_audio_buffer_get_cursor_in_pcm_frames(ma_paged_audio_buffer* pPagedAudioBuffer, ma_uint64* pCursor);\nMA_API ma_result ma_paged_audio_buffer_get_length_in_pcm_frames(ma_paged_audio_buffer* pPagedAudioBuffer, ma_uint64* pLength);\n\n\n\n/************************************************************************************************************************************************************\n\nRing Buffer\n\n************************************************************************************************************************************************************/\ntypedef struct\n{\n    void* pBuffer;\n    ma_uint32 subbufferSizeInBytes;\n    ma_uint32 subbufferCount;\n    ma_uint32 subbufferStrideInBytes;\n    MA_ATOMIC(4, ma_uint32) encodedReadOffset;  /* Most significant bit is the loop flag. Lower 31 bits contains the actual offset in bytes. Must be used atomically. */\n    MA_ATOMIC(4, ma_uint32) encodedWriteOffset; /* Most significant bit is the loop flag. Lower 31 bits contains the actual offset in bytes. Must be used atomically. */\n    ma_bool8 ownsBuffer;                        /* Used to know whether or not miniaudio is responsible for free()-ing the buffer. */\n    ma_bool8 clearOnWriteAcquire;               /* When set, clears the acquired write buffer before returning from ma_rb_acquire_write(). */\n    ma_allocation_callbacks allocationCallbacks;\n} ma_rb;\n\nMA_API ma_result ma_rb_init_ex(size_t subbufferSizeInBytes, size_t subbufferCount, size_t subbufferStrideInBytes, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_rb* pRB);\nMA_API ma_result ma_rb_init(size_t bufferSizeInBytes, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_rb* pRB);\nMA_API void ma_rb_uninit(ma_rb* pRB);\nMA_API void ma_rb_reset(ma_rb* pRB);\nMA_API ma_result ma_rb_acquire_read(ma_rb* pRB, size_t* pSizeInBytes, void** ppBufferOut);\nMA_API ma_result ma_rb_commit_read(ma_rb* pRB, size_t sizeInBytes);\nMA_API ma_result ma_rb_acquire_write(ma_rb* pRB, size_t* pSizeInBytes, void** ppBufferOut);\nMA_API ma_result ma_rb_commit_write(ma_rb* pRB, size_t sizeInBytes);\nMA_API ma_result ma_rb_seek_read(ma_rb* pRB, size_t offsetInBytes);\nMA_API ma_result ma_rb_seek_write(ma_rb* pRB, size_t offsetInBytes);\nMA_API ma_int32 ma_rb_pointer_distance(ma_rb* pRB);    /* Returns the distance between the write pointer and the read pointer. Should never be negative for a correct program. Will return the number of bytes that can be read before the read pointer hits the write pointer. */\nMA_API ma_uint32 ma_rb_available_read(ma_rb* pRB);\nMA_API ma_uint32 ma_rb_available_write(ma_rb* pRB);\nMA_API size_t ma_rb_get_subbuffer_size(ma_rb* pRB);\nMA_API size_t ma_rb_get_subbuffer_stride(ma_rb* pRB);\nMA_API size_t ma_rb_get_subbuffer_offset(ma_rb* pRB, size_t subbufferIndex);\nMA_API void* ma_rb_get_subbuffer_ptr(ma_rb* pRB, size_t subbufferIndex, void* pBuffer);\n\n\ntypedef struct\n{\n    ma_data_source_base ds;\n    ma_rb rb;\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate; /* Not required for the ring buffer itself, but useful for associating the data with some sample rate, particularly for data sources. */\n} ma_pcm_rb;\n\nMA_API ma_result ma_pcm_rb_init_ex(ma_format format, ma_uint32 channels, ma_uint32 subbufferSizeInFrames, ma_uint32 subbufferCount, ma_uint32 subbufferStrideInFrames, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_pcm_rb* pRB);\nMA_API ma_result ma_pcm_rb_init(ma_format format, ma_uint32 channels, ma_uint32 bufferSizeInFrames, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_pcm_rb* pRB);\nMA_API void ma_pcm_rb_uninit(ma_pcm_rb* pRB);\nMA_API void ma_pcm_rb_reset(ma_pcm_rb* pRB);\nMA_API ma_result ma_pcm_rb_acquire_read(ma_pcm_rb* pRB, ma_uint32* pSizeInFrames, void** ppBufferOut);\nMA_API ma_result ma_pcm_rb_commit_read(ma_pcm_rb* pRB, ma_uint32 sizeInFrames);\nMA_API ma_result ma_pcm_rb_acquire_write(ma_pcm_rb* pRB, ma_uint32* pSizeInFrames, void** ppBufferOut);\nMA_API ma_result ma_pcm_rb_commit_write(ma_pcm_rb* pRB, ma_uint32 sizeInFrames);\nMA_API ma_result ma_pcm_rb_seek_read(ma_pcm_rb* pRB, ma_uint32 offsetInFrames);\nMA_API ma_result ma_pcm_rb_seek_write(ma_pcm_rb* pRB, ma_uint32 offsetInFrames);\nMA_API ma_int32 ma_pcm_rb_pointer_distance(ma_pcm_rb* pRB); /* Return value is in frames. */\nMA_API ma_uint32 ma_pcm_rb_available_read(ma_pcm_rb* pRB);\nMA_API ma_uint32 ma_pcm_rb_available_write(ma_pcm_rb* pRB);\nMA_API ma_uint32 ma_pcm_rb_get_subbuffer_size(ma_pcm_rb* pRB);\nMA_API ma_uint32 ma_pcm_rb_get_subbuffer_stride(ma_pcm_rb* pRB);\nMA_API ma_uint32 ma_pcm_rb_get_subbuffer_offset(ma_pcm_rb* pRB, ma_uint32 subbufferIndex);\nMA_API void* ma_pcm_rb_get_subbuffer_ptr(ma_pcm_rb* pRB, ma_uint32 subbufferIndex, void* pBuffer);\nMA_API ma_format ma_pcm_rb_get_format(const ma_pcm_rb* pRB);\nMA_API ma_uint32 ma_pcm_rb_get_channels(const ma_pcm_rb* pRB);\nMA_API ma_uint32 ma_pcm_rb_get_sample_rate(const ma_pcm_rb* pRB);\nMA_API void ma_pcm_rb_set_sample_rate(ma_pcm_rb* pRB, ma_uint32 sampleRate);\n\n\n/*\nThe idea of the duplex ring buffer is to act as the intermediary buffer when running two asynchronous devices in a duplex set up. The\ncapture device writes to it, and then a playback device reads from it.\n\nAt the moment this is just a simple naive implementation, but in the future I want to implement some dynamic resampling to seamlessly\nhandle desyncs. Note that the API is work in progress and may change at any time in any version.\n\nThe size of the buffer is based on the capture side since that's what'll be written to the buffer. It is based on the capture period size\nin frames. The internal sample rate of the capture device is also needed in order to calculate the size.\n*/\ntypedef struct\n{\n    ma_pcm_rb rb;\n} ma_duplex_rb;\n\nMA_API ma_result ma_duplex_rb_init(ma_format captureFormat, ma_uint32 captureChannels, ma_uint32 sampleRate, ma_uint32 captureInternalSampleRate, ma_uint32 captureInternalPeriodSizeInFrames, const ma_allocation_callbacks* pAllocationCallbacks, ma_duplex_rb* pRB);\nMA_API ma_result ma_duplex_rb_uninit(ma_duplex_rb* pRB);\n\n\n/************************************************************************************************************************************************************\n\nMiscellaneous Helpers\n\n************************************************************************************************************************************************************/\n/*\nRetrieves a human readable description of the given result code.\n*/\nMA_API const char* ma_result_description(ma_result result);\n\n/*\nmalloc()\n*/\nMA_API void* ma_malloc(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks);\n\n/*\ncalloc()\n*/\nMA_API void* ma_calloc(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks);\n\n/*\nrealloc()\n*/\nMA_API void* ma_realloc(void* p, size_t sz, const ma_allocation_callbacks* pAllocationCallbacks);\n\n/*\nfree()\n*/\nMA_API void ma_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks);\n\n/*\nPerforms an aligned malloc, with the assumption that the alignment is a power of 2.\n*/\nMA_API void* ma_aligned_malloc(size_t sz, size_t alignment, const ma_allocation_callbacks* pAllocationCallbacks);\n\n/*\nFree's an aligned malloc'd buffer.\n*/\nMA_API void ma_aligned_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks);\n\n/*\nRetrieves a friendly name for a format.\n*/\nMA_API const char* ma_get_format_name(ma_format format);\n\n/*\nBlends two frames in floating point format.\n*/\nMA_API void ma_blend_f32(float* pOut, float* pInA, float* pInB, float factor, ma_uint32 channels);\n\n/*\nRetrieves the size of a sample in bytes for the given format.\n\nThis API is efficient and is implemented using a lookup table.\n\nThread Safety: SAFE\n  This API is pure.\n*/\nMA_API ma_uint32 ma_get_bytes_per_sample(ma_format format);\nstatic MA_INLINE ma_uint32 ma_get_bytes_per_frame(ma_format format, ma_uint32 channels) { return ma_get_bytes_per_sample(format) * channels; }\n\n/*\nConverts a log level to a string.\n*/\nMA_API const char* ma_log_level_to_string(ma_uint32 logLevel);\n\n\n\n\n/************************************************************************************************************************************************************\n\nSynchronization\n\n************************************************************************************************************************************************************/\n/*\nLocks a spinlock.\n*/\nMA_API ma_result ma_spinlock_lock(volatile ma_spinlock* pSpinlock);\n\n/*\nLocks a spinlock, but does not yield() when looping.\n*/\nMA_API ma_result ma_spinlock_lock_noyield(volatile ma_spinlock* pSpinlock);\n\n/*\nUnlocks a spinlock.\n*/\nMA_API ma_result ma_spinlock_unlock(volatile ma_spinlock* pSpinlock);\n\n\n#ifndef MA_NO_THREADING\n\n/*\nCreates a mutex.\n\nA mutex must be created from a valid context. A mutex is initially unlocked.\n*/\nMA_API ma_result ma_mutex_init(ma_mutex* pMutex);\n\n/*\nDeletes a mutex.\n*/\nMA_API void ma_mutex_uninit(ma_mutex* pMutex);\n\n/*\nLocks a mutex with an infinite timeout.\n*/\nMA_API void ma_mutex_lock(ma_mutex* pMutex);\n\n/*\nUnlocks a mutex.\n*/\nMA_API void ma_mutex_unlock(ma_mutex* pMutex);\n\n\n/*\nInitializes an auto-reset event.\n*/\nMA_API ma_result ma_event_init(ma_event* pEvent);\n\n/*\nUninitializes an auto-reset event.\n*/\nMA_API void ma_event_uninit(ma_event* pEvent);\n\n/*\nWaits for the specified auto-reset event to become signalled.\n*/\nMA_API ma_result ma_event_wait(ma_event* pEvent);\n\n/*\nSignals the specified auto-reset event.\n*/\nMA_API ma_result ma_event_signal(ma_event* pEvent);\n#endif  /* MA_NO_THREADING */\n\n\n/*\nFence\n=====\nThis locks while the counter is larger than 0. Counter can be incremented and decremented by any\nthread, but care needs to be taken when waiting. It is possible for one thread to acquire the\nfence just as another thread returns from ma_fence_wait().\n\nThe idea behind a fence is to allow you to wait for a group of operations to complete. When an\noperation starts, the counter is incremented which locks the fence. When the operation completes,\nthe fence will be released which decrements the counter. ma_fence_wait() will block until the\ncounter hits zero.\n\nIf threading is disabled, ma_fence_wait() will spin on the counter.\n*/\ntypedef struct\n{\n#ifndef MA_NO_THREADING\n    ma_event e;\n#endif\n    ma_uint32 counter;\n} ma_fence;\n\nMA_API ma_result ma_fence_init(ma_fence* pFence);\nMA_API void ma_fence_uninit(ma_fence* pFence);\nMA_API ma_result ma_fence_acquire(ma_fence* pFence);    /* Increment counter. */\nMA_API ma_result ma_fence_release(ma_fence* pFence);    /* Decrement counter. */\nMA_API ma_result ma_fence_wait(ma_fence* pFence);       /* Wait for counter to reach 0. */\n\n\n\n/*\nNotification callback for asynchronous operations.\n*/\ntypedef void ma_async_notification;\n\ntypedef struct\n{\n    void (* onSignal)(ma_async_notification* pNotification);\n} ma_async_notification_callbacks;\n\nMA_API ma_result ma_async_notification_signal(ma_async_notification* pNotification);\n\n\n/*\nSimple polling notification.\n\nThis just sets a variable when the notification has been signalled which is then polled with ma_async_notification_poll_is_signalled()\n*/\ntypedef struct\n{\n    ma_async_notification_callbacks cb;\n    ma_bool32 signalled;\n} ma_async_notification_poll;\n\nMA_API ma_result ma_async_notification_poll_init(ma_async_notification_poll* pNotificationPoll);\nMA_API ma_bool32 ma_async_notification_poll_is_signalled(const ma_async_notification_poll* pNotificationPoll);\n\n\n/*\nEvent Notification\n\nThis uses an ma_event. If threading is disabled (MA_NO_THREADING), initialization will fail.\n*/\ntypedef struct\n{\n    ma_async_notification_callbacks cb;\n#ifndef MA_NO_THREADING\n    ma_event e;\n#endif\n} ma_async_notification_event;\n\nMA_API ma_result ma_async_notification_event_init(ma_async_notification_event* pNotificationEvent);\nMA_API ma_result ma_async_notification_event_uninit(ma_async_notification_event* pNotificationEvent);\nMA_API ma_result ma_async_notification_event_wait(ma_async_notification_event* pNotificationEvent);\nMA_API ma_result ma_async_notification_event_signal(ma_async_notification_event* pNotificationEvent);\n\n\n\n\n/************************************************************************************************************************************************************\n\nJob Queue\n\n************************************************************************************************************************************************************/\n\n/*\nSlot Allocator\n--------------\nThe idea of the slot allocator is for it to be used in conjunction with a fixed sized buffer. You use the slot allocator to allocator an index that can be used\nas the insertion point for an object.\n\nSlots are reference counted to help mitigate the ABA problem in the lock-free queue we use for tracking jobs.\n\nThe slot index is stored in the low 32 bits. The reference counter is stored in the high 32 bits:\n\n    +-----------------+-----------------+\n    | 32 Bits         | 32 Bits         |\n    +-----------------+-----------------+\n    | Reference Count | Slot Index      |\n    +-----------------+-----------------+\n*/\ntypedef struct\n{\n    ma_uint32 capacity;    /* The number of slots to make available. */\n} ma_slot_allocator_config;\n\nMA_API ma_slot_allocator_config ma_slot_allocator_config_init(ma_uint32 capacity);\n\n\ntypedef struct\n{\n    MA_ATOMIC(4, ma_uint32) bitfield;   /* Must be used atomically because the allocation and freeing routines need to make copies of this which must never be optimized away by the compiler. */\n} ma_slot_allocator_group;\n\ntypedef struct\n{\n    ma_slot_allocator_group* pGroups;   /* Slots are grouped in chunks of 32. */\n    ma_uint32* pSlots;                  /* 32 bits for reference counting for ABA mitigation. */\n    ma_uint32 count;                    /* Allocation count. */\n    ma_uint32 capacity;\n\n    /* Memory management. */\n    ma_bool32 _ownsHeap;\n    void* _pHeap;\n} ma_slot_allocator;\n\nMA_API ma_result ma_slot_allocator_get_heap_size(const ma_slot_allocator_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_slot_allocator_init_preallocated(const ma_slot_allocator_config* pConfig, void* pHeap, ma_slot_allocator* pAllocator);\nMA_API ma_result ma_slot_allocator_init(const ma_slot_allocator_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_slot_allocator* pAllocator);\nMA_API void ma_slot_allocator_uninit(ma_slot_allocator* pAllocator, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_slot_allocator_alloc(ma_slot_allocator* pAllocator, ma_uint64* pSlot);\nMA_API ma_result ma_slot_allocator_free(ma_slot_allocator* pAllocator, ma_uint64 slot);\n\n\ntypedef struct ma_job ma_job;\n\n/*\nCallback for processing a job. Each job type will have their own processing callback which will be\ncalled by ma_job_process().\n*/\ntypedef ma_result (* ma_job_proc)(ma_job* pJob);\n\n/* When a job type is added here an callback needs to be added go \"g_jobVTable\" in the implementation section. */\ntypedef enum\n{\n    /* Miscellaneous. */\n    MA_JOB_TYPE_QUIT = 0,\n    MA_JOB_TYPE_CUSTOM,\n\n    /* Resource Manager. */\n    MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE,\n    MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER_NODE,\n    MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE,\n    MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER,\n    MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER,\n    MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_STREAM,\n    MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_STREAM,\n    MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_STREAM,\n    MA_JOB_TYPE_RESOURCE_MANAGER_SEEK_DATA_STREAM,\n\n    /* Device. */\n    MA_JOB_TYPE_DEVICE_AAUDIO_REROUTE,\n\n    /* Count. Must always be last. */\n    MA_JOB_TYPE_COUNT\n} ma_job_type;\n\nstruct ma_job\n{\n    union\n    {\n        struct\n        {\n            ma_uint16 code;         /* Job type. */\n            ma_uint16 slot;         /* Index into a ma_slot_allocator. */\n            ma_uint32 refcount;\n        } breakup;\n        ma_uint64 allocation;\n    } toc;  /* 8 bytes. We encode the job code into the slot allocation data to save space. */\n    MA_ATOMIC(8, ma_uint64) next; /* refcount + slot for the next item. Does not include the job code. */\n    ma_uint32 order;    /* Execution order. Used to create a data dependency and ensure a job is executed in order. Usage is contextual depending on the job type. */\n\n    union\n    {\n        /* Miscellaneous. */\n        struct\n        {\n            ma_job_proc proc;\n            ma_uintptr data0;\n            ma_uintptr data1;\n        } custom;\n\n        /* Resource Manager */\n        union\n        {\n            struct\n            {\n                /*ma_resource_manager**/ void* pResourceManager;\n                /*ma_resource_manager_data_buffer_node**/ void* pDataBufferNode;\n                char* pFilePath;\n                wchar_t* pFilePathW;\n                ma_uint32 flags;                                /* Resource manager data source flags that were used when initializing the data buffer. */\n                ma_async_notification* pInitNotification;       /* Signalled when the data buffer has been initialized and the format/channels/rate can be retrieved. */\n                ma_async_notification* pDoneNotification;       /* Signalled when the data buffer has been fully decoded. Will be passed through to MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE when decoding. */\n                ma_fence* pInitFence;                           /* Released when initialization of the decoder is complete. */\n                ma_fence* pDoneFence;                           /* Released if initialization of the decoder fails. Passed through to PAGE_DATA_BUFFER_NODE untouched if init is successful. */\n            } loadDataBufferNode;\n            struct\n            {\n                /*ma_resource_manager**/ void* pResourceManager;\n                /*ma_resource_manager_data_buffer_node**/ void* pDataBufferNode;\n                ma_async_notification* pDoneNotification;\n                ma_fence* pDoneFence;\n            } freeDataBufferNode;\n            struct\n            {\n                /*ma_resource_manager**/ void* pResourceManager;\n                /*ma_resource_manager_data_buffer_node**/ void* pDataBufferNode;\n                /*ma_decoder**/ void* pDecoder;\n                ma_async_notification* pDoneNotification;       /* Signalled when the data buffer has been fully decoded. */\n                ma_fence* pDoneFence;                           /* Passed through from LOAD_DATA_BUFFER_NODE and released when the data buffer completes decoding or an error occurs. */\n            } pageDataBufferNode;\n\n            struct\n            {\n                /*ma_resource_manager_data_buffer**/ void* pDataBuffer;\n                ma_async_notification* pInitNotification;       /* Signalled when the data buffer has been initialized and the format/channels/rate can be retrieved. */\n                ma_async_notification* pDoneNotification;       /* Signalled when the data buffer has been fully decoded. */\n                ma_fence* pInitFence;                           /* Released when the data buffer has been initialized and the format/channels/rate can be retrieved. */\n                ma_fence* pDoneFence;                           /* Released when the data buffer has been fully decoded. */\n                ma_uint64 rangeBegInPCMFrames;\n                ma_uint64 rangeEndInPCMFrames;\n                ma_uint64 loopPointBegInPCMFrames;\n                ma_uint64 loopPointEndInPCMFrames;\n                ma_uint32 isLooping;\n            } loadDataBuffer;\n            struct\n            {\n                /*ma_resource_manager_data_buffer**/ void* pDataBuffer;\n                ma_async_notification* pDoneNotification;\n                ma_fence* pDoneFence;\n            } freeDataBuffer;\n\n            struct\n            {\n                /*ma_resource_manager_data_stream**/ void* pDataStream;\n                char* pFilePath;                            /* Allocated when the job is posted, freed by the job thread after loading. */\n                wchar_t* pFilePathW;                        /* ^ As above ^. Only used if pFilePath is NULL. */\n                ma_uint64 initialSeekPoint;\n                ma_async_notification* pInitNotification;   /* Signalled after the first two pages have been decoded and frames can be read from the stream. */\n                ma_fence* pInitFence;\n            } loadDataStream;\n            struct\n            {\n                /*ma_resource_manager_data_stream**/ void* pDataStream;\n                ma_async_notification* pDoneNotification;\n                ma_fence* pDoneFence;\n            } freeDataStream;\n            struct\n            {\n                /*ma_resource_manager_data_stream**/ void* pDataStream;\n                ma_uint32 pageIndex;                    /* The index of the page to decode into. */\n            } pageDataStream;\n            struct\n            {\n                /*ma_resource_manager_data_stream**/ void* pDataStream;\n                ma_uint64 frameIndex;\n            } seekDataStream;\n        } resourceManager;\n\n        /* Device. */\n        union\n        {\n            union\n            {\n                struct\n                {\n                    /*ma_device**/ void* pDevice;\n                    /*ma_device_type*/ ma_uint32 deviceType;\n                } reroute;\n            } aaudio;\n        } device;\n    } data;\n};\n\nMA_API ma_job ma_job_init(ma_uint16 code);\nMA_API ma_result ma_job_process(ma_job* pJob);\n\n\n/*\nWhen set, ma_job_queue_next() will not wait and no semaphore will be signaled in\nma_job_queue_post(). ma_job_queue_next() will return MA_NO_DATA_AVAILABLE if nothing is available.\n\nThis flag should always be used for platforms that do not support multithreading.\n*/\ntypedef enum\n{\n    MA_JOB_QUEUE_FLAG_NON_BLOCKING = 0x00000001\n} ma_job_queue_flags;\n\ntypedef struct\n{\n    ma_uint32 flags;\n    ma_uint32 capacity; /* The maximum number of jobs that can fit in the queue at a time. */\n} ma_job_queue_config;\n\nMA_API ma_job_queue_config ma_job_queue_config_init(ma_uint32 flags, ma_uint32 capacity);\n\n\ntypedef struct\n{\n    ma_uint32 flags;                /* Flags passed in at initialization time. */\n    ma_uint32 capacity;             /* The maximum number of jobs that can fit in the queue at a time. Set by the config. */\n    MA_ATOMIC(8, ma_uint64) head;   /* The first item in the list. Required for removing from the top of the list. */\n    MA_ATOMIC(8, ma_uint64) tail;   /* The last item in the list. Required for appending to the end of the list. */\n#ifndef MA_NO_THREADING\n    ma_semaphore sem;               /* Only used when MA_JOB_QUEUE_FLAG_NON_BLOCKING is unset. */\n#endif\n    ma_slot_allocator allocator;\n    ma_job* pJobs;\n#ifndef MA_USE_EXPERIMENTAL_LOCK_FREE_JOB_QUEUE\n    ma_spinlock lock;\n#endif\n\n    /* Memory management. */\n    void* _pHeap;\n    ma_bool32 _ownsHeap;\n} ma_job_queue;\n\nMA_API ma_result ma_job_queue_get_heap_size(const ma_job_queue_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_job_queue_init_preallocated(const ma_job_queue_config* pConfig, void* pHeap, ma_job_queue* pQueue);\nMA_API ma_result ma_job_queue_init(const ma_job_queue_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_job_queue* pQueue);\nMA_API void ma_job_queue_uninit(ma_job_queue* pQueue, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_job_queue_post(ma_job_queue* pQueue, const ma_job* pJob);\nMA_API ma_result ma_job_queue_next(ma_job_queue* pQueue, ma_job* pJob); /* Returns MA_CANCELLED if the next job is a quit job. */\n\n\n\n/************************************************************************************************************************************************************\n*************************************************************************************************************************************************************\n\nDEVICE I/O\n==========\n\nThis section contains the APIs for device playback and capture. Here is where you'll find ma_device_init(), etc.\n\n*************************************************************************************************************************************************************\n************************************************************************************************************************************************************/\n#ifndef MA_NO_DEVICE_IO\n/* Some backends are only supported on certain platforms. */\n#if defined(MA_WIN32)\n    #define MA_SUPPORT_WASAPI\n\n    #if defined(MA_WIN32_DESKTOP)   /* DirectSound and WinMM backends are only supported on desktops. */\n        #define MA_SUPPORT_DSOUND\n        #define MA_SUPPORT_WINMM\n\n        /* Don't enable JACK here if compiling with Cosmopolitan. It'll be enabled in the Linux section below. */\n        #if !defined(__COSMOPOLITAN__)\n            #define MA_SUPPORT_JACK    /* JACK is technically supported on Windows, but I don't know how many people use it in practice... */\n        #endif\n    #endif\n#endif\n#if defined(MA_UNIX) && !defined(MA_ORBIS) && !defined(MA_PROSPERO)\n    #if defined(MA_LINUX)\n        #if !defined(MA_ANDROID) && !defined(__COSMOPOLITAN__)   /* ALSA is not supported on Android. */\n            #define MA_SUPPORT_ALSA\n        #endif\n    #endif\n    #if !defined(MA_BSD) && !defined(MA_ANDROID) && !defined(MA_EMSCRIPTEN)\n        #define MA_SUPPORT_PULSEAUDIO\n        #define MA_SUPPORT_JACK\n    #endif\n    #if defined(__OpenBSD__)        /* <-- Change this to \"#if defined(MA_BSD)\" to enable sndio on all BSD flavors. */\n        #define MA_SUPPORT_SNDIO    /* sndio is only supported on OpenBSD for now. May be expanded later if there's demand. */\n    #endif\n    #if defined(__NetBSD__) || defined(__OpenBSD__)\n        #define MA_SUPPORT_AUDIO4   /* Only support audio(4) on platforms with known support. */\n    #endif\n    #if defined(__FreeBSD__) || defined(__DragonFly__)\n        #define MA_SUPPORT_OSS      /* Only support OSS on specific platforms with known support. */\n    #endif\n#endif\n#if defined(MA_ANDROID)\n    #define MA_SUPPORT_AAUDIO\n    #define MA_SUPPORT_OPENSL\n#endif\n#if defined(MA_APPLE)\n    #define MA_SUPPORT_COREAUDIO\n#endif\n#if defined(MA_EMSCRIPTEN)\n    #define MA_SUPPORT_WEBAUDIO\n#endif\n\n/* All platforms should support custom backends. */\n#define MA_SUPPORT_CUSTOM\n\n/* Explicitly disable the Null backend for Emscripten because it uses a background thread which is not properly supported right now. */\n#if !defined(MA_EMSCRIPTEN)\n#define MA_SUPPORT_NULL\n#endif\n\n\n#if defined(MA_SUPPORT_WASAPI) && !defined(MA_NO_WASAPI) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_WASAPI))\n    #define MA_HAS_WASAPI\n#endif\n#if defined(MA_SUPPORT_DSOUND) && !defined(MA_NO_DSOUND) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_DSOUND))\n    #define MA_HAS_DSOUND\n#endif\n#if defined(MA_SUPPORT_WINMM) && !defined(MA_NO_WINMM) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_WINMM))\n    #define MA_HAS_WINMM\n#endif\n#if defined(MA_SUPPORT_ALSA) && !defined(MA_NO_ALSA) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_ALSA))\n    #define MA_HAS_ALSA\n#endif\n#if defined(MA_SUPPORT_PULSEAUDIO) && !defined(MA_NO_PULSEAUDIO) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_PULSEAUDIO))\n    #define MA_HAS_PULSEAUDIO\n#endif\n#if defined(MA_SUPPORT_JACK) && !defined(MA_NO_JACK) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_JACK))\n    #define MA_HAS_JACK\n#endif\n#if defined(MA_SUPPORT_COREAUDIO) && !defined(MA_NO_COREAUDIO) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_COREAUDIO))\n    #define MA_HAS_COREAUDIO\n#endif\n#if defined(MA_SUPPORT_SNDIO) && !defined(MA_NO_SNDIO) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_SNDIO))\n    #define MA_HAS_SNDIO\n#endif\n#if defined(MA_SUPPORT_AUDIO4) && !defined(MA_NO_AUDIO4) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_AUDIO4))\n    #define MA_HAS_AUDIO4\n#endif\n#if defined(MA_SUPPORT_OSS) && !defined(MA_NO_OSS) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_OSS))\n    #define MA_HAS_OSS\n#endif\n#if defined(MA_SUPPORT_AAUDIO) && !defined(MA_NO_AAUDIO) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_AAUDIO))\n    #define MA_HAS_AAUDIO\n#endif\n#if defined(MA_SUPPORT_OPENSL) && !defined(MA_NO_OPENSL) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_OPENSL))\n    #define MA_HAS_OPENSL\n#endif\n#if defined(MA_SUPPORT_WEBAUDIO) && !defined(MA_NO_WEBAUDIO) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_WEBAUDIO))\n    #define MA_HAS_WEBAUDIO\n#endif\n#if defined(MA_SUPPORT_CUSTOM) && !defined(MA_NO_CUSTOM) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_CUSTOM))\n    #define MA_HAS_CUSTOM\n#endif\n#if defined(MA_SUPPORT_NULL) && !defined(MA_NO_NULL) && (!defined(MA_ENABLE_ONLY_SPECIFIC_BACKENDS) || defined(MA_ENABLE_NULL))\n    #define MA_HAS_NULL\n#endif\n\ntypedef enum\n{\n    ma_device_state_uninitialized = 0,\n    ma_device_state_stopped       = 1,  /* The device's default state after initialization. */\n    ma_device_state_started       = 2,  /* The device is started and is requesting and/or delivering audio data. */\n    ma_device_state_starting      = 3,  /* Transitioning from a stopped state to started. */\n    ma_device_state_stopping      = 4   /* Transitioning from a started state to stopped. */\n} ma_device_state;\n\nMA_ATOMIC_SAFE_TYPE_DECL(i32, 4, device_state)\n\n\n#ifdef MA_SUPPORT_WASAPI\n/* We need a IMMNotificationClient object for WASAPI. */\ntypedef struct\n{\n    void* lpVtbl;\n    ma_uint32 counter;\n    ma_device* pDevice;\n} ma_IMMNotificationClient;\n#endif\n\n/* Backend enums must be in priority order. */\ntypedef enum\n{\n    ma_backend_wasapi,\n    ma_backend_dsound,\n    ma_backend_winmm,\n    ma_backend_coreaudio,\n    ma_backend_sndio,\n    ma_backend_audio4,\n    ma_backend_oss,\n    ma_backend_pulseaudio,\n    ma_backend_alsa,\n    ma_backend_jack,\n    ma_backend_aaudio,\n    ma_backend_opensl,\n    ma_backend_webaudio,\n    ma_backend_custom,  /* <-- Custom backend, with callbacks defined by the context config. */\n    ma_backend_null     /* <-- Must always be the last item. Lowest priority, and used as the terminator for backend enumeration. */\n} ma_backend;\n\n#define MA_BACKEND_COUNT (ma_backend_null+1)\n\n\n/*\nDevice job thread. This is used by backends that require asynchronous processing of certain\noperations. It is not used by all backends.\n\nThe device job thread is made up of a thread and a job queue. You can post a job to the thread with\nma_device_job_thread_post(). The thread will do the processing of the job.\n*/\ntypedef struct\n{\n    ma_bool32 noThread; /* Set this to true if you want to process jobs yourself. */\n    ma_uint32 jobQueueCapacity;\n    ma_uint32 jobQueueFlags;\n} ma_device_job_thread_config;\n\nMA_API ma_device_job_thread_config ma_device_job_thread_config_init(void);\n\ntypedef struct\n{\n    ma_thread thread;\n    ma_job_queue jobQueue;\n    ma_bool32 _hasThread;\n} ma_device_job_thread;\n\nMA_API ma_result ma_device_job_thread_init(const ma_device_job_thread_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_device_job_thread* pJobThread);\nMA_API void ma_device_job_thread_uninit(ma_device_job_thread* pJobThread, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_device_job_thread_post(ma_device_job_thread* pJobThread, const ma_job* pJob);\nMA_API ma_result ma_device_job_thread_next(ma_device_job_thread* pJobThread, ma_job* pJob);\n\n\n\n/* Device notification types. */\ntypedef enum\n{\n    ma_device_notification_type_started,\n    ma_device_notification_type_stopped,\n    ma_device_notification_type_rerouted,\n    ma_device_notification_type_interruption_began,\n    ma_device_notification_type_interruption_ended,\n    ma_device_notification_type_unlocked\n} ma_device_notification_type;\n\ntypedef struct\n{\n    ma_device* pDevice;\n    ma_device_notification_type type;\n    union\n    {\n        struct\n        {\n            int _unused;\n        } started;\n        struct\n        {\n            int _unused;\n        } stopped;\n        struct\n        {\n            int _unused;\n        } rerouted;\n        struct\n        {\n            int _unused;\n        } interruption;\n    } data;\n} ma_device_notification;\n\n/*\nThe notification callback for when the application should be notified of a change to the device.\n\nThis callback is used for notifying the application of changes such as when the device has started,\nstopped, rerouted or an interruption has occurred. Note that not all backends will post all\nnotification types. For example, some backends will perform automatic stream routing without any\nkind of notification to the host program which means miniaudio will never know about it and will\nnever be able to fire the rerouted notification. You should keep this in mind when designing your\nprogram.\n\nThe stopped notification will *not* get fired when a device is rerouted.\n\n\nParameters\n----------\npNotification (in)\n    A pointer to a structure containing information about the event. Use the `pDevice` member of\n    this object to retrieve the relevant device. The `type` member can be used to discriminate\n    against each of the notification types.\n\n\nRemarks\n-------\nDo not restart or uninitialize the device from the callback.\n\nNot all notifications will be triggered by all backends, however the started and stopped events\nshould be reliable for all backends. Some backends do not have a good way to detect device\nstoppages due to unplugging the device which may result in the stopped callback not getting\nfired. This has been observed with at least one BSD variant.\n\nThe rerouted notification is fired *after* the reroute has occurred. The stopped notification will\n*not* get fired when a device is rerouted. The following backends are known to do automatic stream\nrerouting, but do not have a way to be notified of the change:\n\n  * DirectSound\n\nThe interruption notifications are used on mobile platforms for detecting when audio is interrupted\ndue to things like an incoming phone call. Currently this is only implemented on iOS. None of the\nAndroid backends will report this notification.\n*/\ntypedef void (* ma_device_notification_proc)(const ma_device_notification* pNotification);\n\n\n/*\nThe callback for processing audio data from the device.\n\nThe data callback is fired by miniaudio whenever the device needs to have more data delivered to a playback device, or when a capture device has some data\navailable. This is called as soon as the backend asks for more data which means it may be called with inconsistent frame counts. You cannot assume the\ncallback will be fired with a consistent frame count.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to the relevant device.\n\npOutput (out)\n    A pointer to the output buffer that will receive audio data that will later be played back through the speakers. This will be non-null for a playback or\n    full-duplex device and null for a capture and loopback device.\n\npInput (in)\n    A pointer to the buffer containing input data from a recording device. This will be non-null for a capture, full-duplex or loopback device and null for a\n    playback device.\n\nframeCount (in)\n    The number of PCM frames to process. Note that this will not necessarily be equal to what you requested when you initialized the device. The\n    `periodSizeInFrames` and `periodSizeInMilliseconds` members of the device config are just hints, and are not necessarily exactly what you'll get. You must\n    not assume this will always be the same value each time the callback is fired.\n\n\nRemarks\n-------\nYou cannot stop and start the device from inside the callback or else you'll get a deadlock. You must also not uninitialize the device from inside the\ncallback. The following APIs cannot be called from inside the callback:\n\n    ma_device_init()\n    ma_device_init_ex()\n    ma_device_uninit()\n    ma_device_start()\n    ma_device_stop()\n\nThe proper way to stop the device is to call `ma_device_stop()` from a different thread, normally the main application thread.\n*/\ntypedef void (* ma_device_data_proc)(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount);\n\n\n\n\n/*\nDEPRECATED. Use ma_device_notification_proc instead.\n\nThe callback for when the device has been stopped.\n\nThis will be called when the device is stopped explicitly with `ma_device_stop()` and also called implicitly when the device is stopped through external forces\nsuch as being unplugged or an internal error occurring.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to the device that has just stopped.\n\n\nRemarks\n-------\nDo not restart or uninitialize the device from the callback.\n*/\ntypedef void (* ma_stop_proc)(ma_device* pDevice);  /* DEPRECATED. Use ma_device_notification_proc instead. */\n\ntypedef enum\n{\n    ma_device_type_playback = 1,\n    ma_device_type_capture  = 2,\n    ma_device_type_duplex   = ma_device_type_playback | ma_device_type_capture, /* 3 */\n    ma_device_type_loopback = 4\n} ma_device_type;\n\ntypedef enum\n{\n    ma_share_mode_shared = 0,\n    ma_share_mode_exclusive\n} ma_share_mode;\n\n/* iOS/tvOS/watchOS session categories. */\ntypedef enum\n{\n    ma_ios_session_category_default = 0,        /* AVAudioSessionCategoryPlayAndRecord. */\n    ma_ios_session_category_none,               /* Leave the session category unchanged. */\n    ma_ios_session_category_ambient,            /* AVAudioSessionCategoryAmbient */\n    ma_ios_session_category_solo_ambient,       /* AVAudioSessionCategorySoloAmbient */\n    ma_ios_session_category_playback,           /* AVAudioSessionCategoryPlayback */\n    ma_ios_session_category_record,             /* AVAudioSessionCategoryRecord */\n    ma_ios_session_category_play_and_record,    /* AVAudioSessionCategoryPlayAndRecord */\n    ma_ios_session_category_multi_route         /* AVAudioSessionCategoryMultiRoute */\n} ma_ios_session_category;\n\n/* iOS/tvOS/watchOS session category options */\ntypedef enum\n{\n    ma_ios_session_category_option_mix_with_others                            = 0x01,   /* AVAudioSessionCategoryOptionMixWithOthers */\n    ma_ios_session_category_option_duck_others                                = 0x02,   /* AVAudioSessionCategoryOptionDuckOthers */\n    ma_ios_session_category_option_allow_bluetooth                            = 0x04,   /* AVAudioSessionCategoryOptionAllowBluetooth */\n    ma_ios_session_category_option_default_to_speaker                         = 0x08,   /* AVAudioSessionCategoryOptionDefaultToSpeaker */\n    ma_ios_session_category_option_interrupt_spoken_audio_and_mix_with_others = 0x11,   /* AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers */\n    ma_ios_session_category_option_allow_bluetooth_a2dp                       = 0x20,   /* AVAudioSessionCategoryOptionAllowBluetoothA2DP */\n    ma_ios_session_category_option_allow_air_play                             = 0x40,   /* AVAudioSessionCategoryOptionAllowAirPlay */\n} ma_ios_session_category_option;\n\n/* OpenSL stream types. */\ntypedef enum\n{\n    ma_opensl_stream_type_default = 0,              /* Leaves the stream type unset. */\n    ma_opensl_stream_type_voice,                    /* SL_ANDROID_STREAM_VOICE */\n    ma_opensl_stream_type_system,                   /* SL_ANDROID_STREAM_SYSTEM */\n    ma_opensl_stream_type_ring,                     /* SL_ANDROID_STREAM_RING */\n    ma_opensl_stream_type_media,                    /* SL_ANDROID_STREAM_MEDIA */\n    ma_opensl_stream_type_alarm,                    /* SL_ANDROID_STREAM_ALARM */\n    ma_opensl_stream_type_notification              /* SL_ANDROID_STREAM_NOTIFICATION */\n} ma_opensl_stream_type;\n\n/* OpenSL recording presets. */\ntypedef enum\n{\n    ma_opensl_recording_preset_default = 0,         /* Leaves the input preset unset. */\n    ma_opensl_recording_preset_generic,             /* SL_ANDROID_RECORDING_PRESET_GENERIC */\n    ma_opensl_recording_preset_camcorder,           /* SL_ANDROID_RECORDING_PRESET_CAMCORDER */\n    ma_opensl_recording_preset_voice_recognition,   /* SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION */\n    ma_opensl_recording_preset_voice_communication, /* SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION */\n    ma_opensl_recording_preset_voice_unprocessed    /* SL_ANDROID_RECORDING_PRESET_UNPROCESSED */\n} ma_opensl_recording_preset;\n\n/* WASAPI audio thread priority characteristics. */\ntypedef enum\n{\n    ma_wasapi_usage_default = 0,\n    ma_wasapi_usage_games,\n    ma_wasapi_usage_pro_audio,\n} ma_wasapi_usage;\n\n/* AAudio usage types. */\ntypedef enum\n{\n    ma_aaudio_usage_default = 0,                    /* Leaves the usage type unset. */\n    ma_aaudio_usage_media,                          /* AAUDIO_USAGE_MEDIA */\n    ma_aaudio_usage_voice_communication,            /* AAUDIO_USAGE_VOICE_COMMUNICATION */\n    ma_aaudio_usage_voice_communication_signalling, /* AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING */\n    ma_aaudio_usage_alarm,                          /* AAUDIO_USAGE_ALARM */\n    ma_aaudio_usage_notification,                   /* AAUDIO_USAGE_NOTIFICATION */\n    ma_aaudio_usage_notification_ringtone,          /* AAUDIO_USAGE_NOTIFICATION_RINGTONE */\n    ma_aaudio_usage_notification_event,             /* AAUDIO_USAGE_NOTIFICATION_EVENT */\n    ma_aaudio_usage_assistance_accessibility,       /* AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY */\n    ma_aaudio_usage_assistance_navigation_guidance, /* AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE */\n    ma_aaudio_usage_assistance_sonification,        /* AAUDIO_USAGE_ASSISTANCE_SONIFICATION */\n    ma_aaudio_usage_game,                           /* AAUDIO_USAGE_GAME */\n    ma_aaudio_usage_assitant,                       /* AAUDIO_USAGE_ASSISTANT */\n    ma_aaudio_usage_emergency,                      /* AAUDIO_SYSTEM_USAGE_EMERGENCY */\n    ma_aaudio_usage_safety,                         /* AAUDIO_SYSTEM_USAGE_SAFETY */\n    ma_aaudio_usage_vehicle_status,                 /* AAUDIO_SYSTEM_USAGE_VEHICLE_STATUS */\n    ma_aaudio_usage_announcement                    /* AAUDIO_SYSTEM_USAGE_ANNOUNCEMENT */\n} ma_aaudio_usage;\n\n/* AAudio content types. */\ntypedef enum\n{\n    ma_aaudio_content_type_default = 0,             /* Leaves the content type unset. */\n    ma_aaudio_content_type_speech,                  /* AAUDIO_CONTENT_TYPE_SPEECH */\n    ma_aaudio_content_type_music,                   /* AAUDIO_CONTENT_TYPE_MUSIC */\n    ma_aaudio_content_type_movie,                   /* AAUDIO_CONTENT_TYPE_MOVIE */\n    ma_aaudio_content_type_sonification             /* AAUDIO_CONTENT_TYPE_SONIFICATION */\n} ma_aaudio_content_type;\n\n/* AAudio input presets. */\ntypedef enum\n{\n    ma_aaudio_input_preset_default = 0,             /* Leaves the input preset unset. */\n    ma_aaudio_input_preset_generic,                 /* AAUDIO_INPUT_PRESET_GENERIC */\n    ma_aaudio_input_preset_camcorder,               /* AAUDIO_INPUT_PRESET_CAMCORDER */\n    ma_aaudio_input_preset_voice_recognition,       /* AAUDIO_INPUT_PRESET_VOICE_RECOGNITION */\n    ma_aaudio_input_preset_voice_communication,     /* AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION */\n    ma_aaudio_input_preset_unprocessed,             /* AAUDIO_INPUT_PRESET_UNPROCESSED */\n    ma_aaudio_input_preset_voice_performance        /* AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE */\n} ma_aaudio_input_preset;\n\ntypedef enum\n{\n    ma_aaudio_allow_capture_default = 0,            /* Leaves the allowed capture policy unset. */\n    ma_aaudio_allow_capture_by_all,                 /* AAUDIO_ALLOW_CAPTURE_BY_ALL */\n    ma_aaudio_allow_capture_by_system,              /* AAUDIO_ALLOW_CAPTURE_BY_SYSTEM */\n    ma_aaudio_allow_capture_by_none                 /* AAUDIO_ALLOW_CAPTURE_BY_NONE */\n} ma_aaudio_allowed_capture_policy;\n\ntypedef union\n{\n    ma_int64 counter;\n    double counterD;\n} ma_timer;\n\ntypedef union\n{\n    ma_wchar_win32 wasapi[64];      /* WASAPI uses a wchar_t string for identification. */\n    ma_uint8 dsound[16];            /* DirectSound uses a GUID for identification. */\n    /*UINT_PTR*/ ma_uint32 winmm;   /* When creating a device, WinMM expects a Win32 UINT_PTR for device identification. In practice it's actually just a UINT. */\n    char alsa[256];                 /* ALSA uses a name string for identification. */\n    char pulse[256];                /* PulseAudio uses a name string for identification. */\n    int jack;                       /* JACK always uses default devices. */\n    char coreaudio[256];            /* Core Audio uses a string for identification. */\n    char sndio[256];                /* \"snd/0\", etc. */\n    char audio4[256];               /* \"/dev/audio\", etc. */\n    char oss[64];                   /* \"dev/dsp0\", etc. \"dev/dsp\" for the default device. */\n    ma_int32 aaudio;                /* AAudio uses a 32-bit integer for identification. */\n    ma_uint32 opensl;               /* OpenSL|ES uses a 32-bit unsigned integer for identification. */\n    char webaudio[32];              /* Web Audio always uses default devices for now, but if this changes it'll be a GUID. */\n    union\n    {\n        int i;\n        char s[256];\n        void* p;\n    } custom;                       /* The custom backend could be anything. Give them a few options. */\n    int nullbackend;                /* The null backend uses an integer for device IDs. */\n} ma_device_id;\n\n\ntypedef struct ma_context_config    ma_context_config;\ntypedef struct ma_device_config     ma_device_config;\ntypedef struct ma_backend_callbacks ma_backend_callbacks;\n\n#define MA_DATA_FORMAT_FLAG_EXCLUSIVE_MODE (1U << 1)    /* If set, this is supported in exclusive mode. Otherwise not natively supported by exclusive mode. */\n\n#ifndef MA_MAX_DEVICE_NAME_LENGTH\n#define MA_MAX_DEVICE_NAME_LENGTH   255\n#endif\n\ntypedef struct\n{\n    /* Basic info. This is the only information guaranteed to be filled in during device enumeration. */\n    ma_device_id id;\n    char name[MA_MAX_DEVICE_NAME_LENGTH + 1];   /* +1 for null terminator. */\n    ma_bool32 isDefault;\n\n    ma_uint32 nativeDataFormatCount;\n    struct\n    {\n        ma_format format;       /* Sample format. If set to ma_format_unknown, all sample formats are supported. */\n        ma_uint32 channels;     /* If set to 0, all channels are supported. */\n        ma_uint32 sampleRate;   /* If set to 0, all sample rates are supported. */\n        ma_uint32 flags;        /* A combination of MA_DATA_FORMAT_FLAG_* flags. */\n    } nativeDataFormats[/*ma_format_count * ma_standard_sample_rate_count * MA_MAX_CHANNELS*/ 64];  /* Not sure how big to make this. There can be *many* permutations for virtual devices which can support anything. */\n} ma_device_info;\n\nstruct ma_device_config\n{\n    ma_device_type deviceType;\n    ma_uint32 sampleRate;\n    ma_uint32 periodSizeInFrames;\n    ma_uint32 periodSizeInMilliseconds;\n    ma_uint32 periods;\n    ma_performance_profile performanceProfile;\n    ma_bool8 noPreSilencedOutputBuffer; /* When set to true, the contents of the output buffer passed into the data callback will be left undefined rather than initialized to silence. */\n    ma_bool8 noClip;                    /* When set to true, the contents of the output buffer passed into the data callback will not be clipped after returning. Only applies when the playback sample format is f32. */\n    ma_bool8 noDisableDenormals;        /* Do not disable denormals when firing the data callback. */\n    ma_bool8 noFixedSizedCallback;      /* Disables strict fixed-sized data callbacks. Setting this to true will result in the period size being treated only as a hint to the backend. This is an optimization for those who don't need fixed sized callbacks. */\n    ma_device_data_proc dataCallback;\n    ma_device_notification_proc notificationCallback;\n    ma_stop_proc stopCallback;\n    void* pUserData;\n    ma_resampler_config resampling;\n    struct\n    {\n        const ma_device_id* pDeviceID;\n        ma_format format;\n        ma_uint32 channels;\n        ma_channel* pChannelMap;\n        ma_channel_mix_mode channelMixMode;\n        ma_bool32 calculateLFEFromSpatialChannels;  /* When an output LFE channel is present, but no input LFE, set to true to set the output LFE to the average of all spatial channels (LR, FR, etc.). Ignored when an input LFE is present. */\n        ma_share_mode shareMode;\n    } playback;\n    struct\n    {\n        const ma_device_id* pDeviceID;\n        ma_format format;\n        ma_uint32 channels;\n        ma_channel* pChannelMap;\n        ma_channel_mix_mode channelMixMode;\n        ma_bool32 calculateLFEFromSpatialChannels;  /* When an output LFE channel is present, but no input LFE, set to true to set the output LFE to the average of all spatial channels (LR, FR, etc.). Ignored when an input LFE is present. */\n        ma_share_mode shareMode;\n    } capture;\n\n    struct\n    {\n        ma_wasapi_usage usage;              /* When configured, uses Avrt APIs to set the thread characteristics. */\n        ma_bool8 noAutoConvertSRC;          /* When set to true, disables the use of AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM. */\n        ma_bool8 noDefaultQualitySRC;       /* When set to true, disables the use of AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY. */\n        ma_bool8 noAutoStreamRouting;       /* Disables automatic stream routing. */\n        ma_bool8 noHardwareOffloading;      /* Disables WASAPI's hardware offloading feature. */\n        ma_uint32 loopbackProcessID;        /* The process ID to include or exclude for loopback mode. Set to 0 to capture audio from all processes. Ignored when an explicit device ID is specified. */\n        ma_bool8 loopbackProcessExclude;    /* When set to true, excludes the process specified by loopbackProcessID. By default, the process will be included. */\n    } wasapi;\n    struct\n    {\n        ma_bool32 noMMap;           /* Disables MMap mode. */\n        ma_bool32 noAutoFormat;     /* Opens the ALSA device with SND_PCM_NO_AUTO_FORMAT. */\n        ma_bool32 noAutoChannels;   /* Opens the ALSA device with SND_PCM_NO_AUTO_CHANNELS. */\n        ma_bool32 noAutoResample;   /* Opens the ALSA device with SND_PCM_NO_AUTO_RESAMPLE. */\n    } alsa;\n    struct\n    {\n        const char* pStreamNamePlayback;\n        const char* pStreamNameCapture;\n    } pulse;\n    struct\n    {\n        ma_bool32 allowNominalSampleRateChange; /* Desktop only. When enabled, allows changing of the sample rate at the operating system level. */\n    } coreaudio;\n    struct\n    {\n        ma_opensl_stream_type streamType;\n        ma_opensl_recording_preset recordingPreset;\n        ma_bool32 enableCompatibilityWorkarounds;\n    } opensl;\n    struct\n    {\n        ma_aaudio_usage usage;\n        ma_aaudio_content_type contentType;\n        ma_aaudio_input_preset inputPreset;\n        ma_aaudio_allowed_capture_policy allowedCapturePolicy;\n        ma_bool32 noAutoStartAfterReroute;\n        ma_bool32 enableCompatibilityWorkarounds;\n    } aaudio;\n};\n\n\n/*\nThe callback for handling device enumeration. This is fired from `ma_context_enumerate_devices()`.\n\n\nParameters\n----------\npContext (in)\n    A pointer to the context performing the enumeration.\n\ndeviceType (in)\n    The type of the device being enumerated. This will always be either `ma_device_type_playback` or `ma_device_type_capture`.\n\npInfo (in)\n    A pointer to a `ma_device_info` containing the ID and name of the enumerated device. Note that this will not include detailed information about the device,\n    only basic information (ID and name). The reason for this is that it would otherwise require opening the backend device to probe for the information which\n    is too inefficient.\n\npUserData (in)\n    The user data pointer passed into `ma_context_enumerate_devices()`.\n*/\ntypedef ma_bool32 (* ma_enum_devices_callback_proc)(ma_context* pContext, ma_device_type deviceType, const ma_device_info* pInfo, void* pUserData);\n\n\n/*\nDescribes some basic details about a playback or capture device.\n*/\ntypedef struct\n{\n    const ma_device_id* pDeviceID;\n    ma_share_mode shareMode;\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_channel channelMap[MA_MAX_CHANNELS];\n    ma_uint32 periodSizeInFrames;\n    ma_uint32 periodSizeInMilliseconds;\n    ma_uint32 periodCount;\n} ma_device_descriptor;\n\n/*\nThese are the callbacks required to be implemented for a backend. These callbacks are grouped into two parts: context and device. There is one context\nto many devices. A device is created from a context.\n\nThe general flow goes like this:\n\n  1) A context is created with `onContextInit()`\n     1a) Available devices can be enumerated with `onContextEnumerateDevices()` if required.\n     1b) Detailed information about a device can be queried with `onContextGetDeviceInfo()` if required.\n  2) A device is created from the context that was created in the first step using `onDeviceInit()`, and optionally a device ID that was\n     selected from device enumeration via `onContextEnumerateDevices()`.\n  3) A device is started or stopped with `onDeviceStart()` / `onDeviceStop()`\n  4) Data is delivered to and from the device by the backend. This is always done based on the native format returned by the prior call\n     to `onDeviceInit()`. Conversion between the device's native format and the format requested by the application will be handled by\n     miniaudio internally.\n\nInitialization of the context is quite simple. You need to do any necessary initialization of internal objects and then output the\ncallbacks defined in this structure.\n\nOnce the context has been initialized you can initialize a device. Before doing so, however, the application may want to know which\nphysical devices are available. This is where `onContextEnumerateDevices()` comes in. This is fairly simple. For each device, fire the\ngiven callback with, at a minimum, the basic information filled out in `ma_device_info`. When the callback returns `MA_FALSE`, enumeration\nneeds to stop and the `onContextEnumerateDevices()` function returns with a success code.\n\nDetailed device information can be retrieved from a device ID using `onContextGetDeviceInfo()`. This takes as input the device type and ID,\nand on output returns detailed information about the device in `ma_device_info`. The `onContextGetDeviceInfo()` callback must handle the\ncase when the device ID is NULL, in which case information about the default device needs to be retrieved.\n\nOnce the context has been created and the device ID retrieved (if using anything other than the default device), the device can be created.\nThis is a little bit more complicated than initialization of the context due to it's more complicated configuration. When initializing a\ndevice, a duplex device may be requested. This means a separate data format needs to be specified for both playback and capture. On input,\nthe data format is set to what the application wants. On output it's set to the native format which should match as closely as possible to\nthe requested format. The conversion between the format requested by the application and the device's native format will be handled\ninternally by miniaudio.\n\nOn input, if the sample format is set to `ma_format_unknown`, the backend is free to use whatever sample format it desires, so long as it's\nsupported by miniaudio. When the channel count is set to 0, the backend should use the device's native channel count. The same applies for\nsample rate. For the channel map, the default should be used when `ma_channel_map_is_blank()` returns true (all channels set to\n`MA_CHANNEL_NONE`). On input, the `periodSizeInFrames` or `periodSizeInMilliseconds` option should always be set. The backend should\ninspect both of these variables. If `periodSizeInFrames` is set, it should take priority, otherwise it needs to be derived from the period\nsize in milliseconds (`periodSizeInMilliseconds`) and the sample rate, keeping in mind that the sample rate may be 0, in which case the\nsample rate will need to be determined before calculating the period size in frames. On output, all members of the `ma_device_descriptor`\nobject should be set to a valid value, except for `periodSizeInMilliseconds` which is optional (`periodSizeInFrames` *must* be set).\n\nStarting and stopping of the device is done with `onDeviceStart()` and `onDeviceStop()` and should be self-explanatory. If the backend uses\nasynchronous reading and writing, `onDeviceStart()` and `onDeviceStop()` should always be implemented.\n\nThe handling of data delivery between the application and the device is the most complicated part of the process. To make this a bit\neasier, some helper callbacks are available. If the backend uses a blocking read/write style of API, the `onDeviceRead()` and\n`onDeviceWrite()` callbacks can optionally be implemented. These are blocking and work just like reading and writing from a file. If the\nbackend uses a callback for data delivery, that callback must call `ma_device_handle_backend_data_callback()` from within it's callback.\nThis allows miniaudio to then process any necessary data conversion and then pass it to the miniaudio data callback.\n\nIf the backend requires absolute flexibility with it's data delivery, it can optionally implement the `onDeviceDataLoop()` callback\nwhich will allow it to implement the logic that will run on the audio thread. This is much more advanced and is completely optional.\n\nThe audio thread should run data delivery logic in a loop while `ma_device_get_state() == ma_device_state_started` and no errors have been\nencountered. Do not start or stop the device here. That will be handled from outside the `onDeviceDataLoop()` callback.\n\nThe invocation of the `onDeviceDataLoop()` callback will be handled by miniaudio. When you start the device, miniaudio will fire this\ncallback. When the device is stopped, the `ma_device_get_state() == ma_device_state_started` condition will fail and the loop will be terminated\nwhich will then fall through to the part that stops the device. For an example on how to implement the `onDeviceDataLoop()` callback,\nlook at `ma_device_audio_thread__default_read_write()`. Implement the `onDeviceDataLoopWakeup()` callback if you need a mechanism to\nwake up the audio thread.\n\nIf the backend supports an optimized retrieval of device information from an initialized `ma_device` object, it should implement the\n`onDeviceGetInfo()` callback. This is optional, in which case it will fall back to `onContextGetDeviceInfo()` which is less efficient.\n*/\nstruct ma_backend_callbacks\n{\n    ma_result (* onContextInit)(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks);\n    ma_result (* onContextUninit)(ma_context* pContext);\n    ma_result (* onContextEnumerateDevices)(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData);\n    ma_result (* onContextGetDeviceInfo)(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo);\n    ma_result (* onDeviceInit)(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture);\n    ma_result (* onDeviceUninit)(ma_device* pDevice);\n    ma_result (* onDeviceStart)(ma_device* pDevice);\n    ma_result (* onDeviceStop)(ma_device* pDevice);\n    ma_result (* onDeviceRead)(ma_device* pDevice, void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesRead);\n    ma_result (* onDeviceWrite)(ma_device* pDevice, const void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten);\n    ma_result (* onDeviceDataLoop)(ma_device* pDevice);\n    ma_result (* onDeviceDataLoopWakeup)(ma_device* pDevice);\n    ma_result (* onDeviceGetInfo)(ma_device* pDevice, ma_device_type type, ma_device_info* pDeviceInfo);\n};\n\nstruct ma_context_config\n{\n    ma_log* pLog;\n    ma_thread_priority threadPriority;\n    size_t threadStackSize;\n    void* pUserData;\n    ma_allocation_callbacks allocationCallbacks;\n    struct\n    {\n        ma_bool32 useVerboseDeviceEnumeration;\n    } alsa;\n    struct\n    {\n        const char* pApplicationName;\n        const char* pServerName;\n        ma_bool32 tryAutoSpawn; /* Enables autospawning of the PulseAudio daemon if necessary. */\n    } pulse;\n    struct\n    {\n        ma_ios_session_category sessionCategory;\n        ma_uint32 sessionCategoryOptions;\n        ma_bool32 noAudioSessionActivate;   /* iOS only. When set to true, does not perform an explicit [[AVAudioSession sharedInstace] setActive:true] on initialization. */\n        ma_bool32 noAudioSessionDeactivate; /* iOS only. When set to true, does not perform an explicit [[AVAudioSession sharedInstace] setActive:false] on uninitialization. */\n    } coreaudio;\n    struct\n    {\n        const char* pClientName;\n        ma_bool32 tryStartServer;\n    } jack;\n    ma_backend_callbacks custom;\n};\n\n/* WASAPI specific structure for some commands which must run on a common thread due to bugs in WASAPI. */\ntypedef struct\n{\n    int code;\n    ma_event* pEvent;   /* This will be signalled when the event is complete. */\n    union\n    {\n        struct\n        {\n            int _unused;\n        } quit;\n        struct\n        {\n            ma_device_type deviceType;\n            void* pAudioClient;\n            void** ppAudioClientService;\n            ma_result* pResult; /* The result from creating the audio client service. */\n        } createAudioClient;\n        struct\n        {\n            ma_device* pDevice;\n            ma_device_type deviceType;\n        } releaseAudioClient;\n    } data;\n} ma_context_command__wasapi;\n\nstruct ma_context\n{\n    ma_backend_callbacks callbacks;\n    ma_backend backend;                 /* DirectSound, ALSA, etc. */\n    ma_log* pLog;\n    ma_log log; /* Only used if the log is owned by the context. The pLog member will be set to &log in this case. */\n    ma_thread_priority threadPriority;\n    size_t threadStackSize;\n    void* pUserData;\n    ma_allocation_callbacks allocationCallbacks;\n    ma_mutex deviceEnumLock;            /* Used to make ma_context_get_devices() thread safe. */\n    ma_mutex deviceInfoLock;            /* Used to make ma_context_get_device_info() thread safe. */\n    ma_uint32 deviceInfoCapacity;       /* Total capacity of pDeviceInfos. */\n    ma_uint32 playbackDeviceInfoCount;\n    ma_uint32 captureDeviceInfoCount;\n    ma_device_info* pDeviceInfos;       /* Playback devices first, then capture. */\n\n    union\n    {\n#ifdef MA_SUPPORT_WASAPI\n        struct\n        {\n            ma_thread commandThread;\n            ma_mutex commandLock;\n            ma_semaphore commandSem;\n            ma_uint32 commandIndex;\n            ma_uint32 commandCount;\n            ma_context_command__wasapi commands[4];\n            ma_handle hAvrt;\n            ma_proc AvSetMmThreadCharacteristicsA;\n            ma_proc AvRevertMmThreadcharacteristics;\n            ma_handle hMMDevapi;\n            ma_proc ActivateAudioInterfaceAsync;\n        } wasapi;\n#endif\n#ifdef MA_SUPPORT_DSOUND\n        struct\n        {\n            ma_handle hDSoundDLL;\n            ma_proc DirectSoundCreate;\n            ma_proc DirectSoundEnumerateA;\n            ma_proc DirectSoundCaptureCreate;\n            ma_proc DirectSoundCaptureEnumerateA;\n        } dsound;\n#endif\n#ifdef MA_SUPPORT_WINMM\n        struct\n        {\n            ma_handle hWinMM;\n            ma_proc waveOutGetNumDevs;\n            ma_proc waveOutGetDevCapsA;\n            ma_proc waveOutOpen;\n            ma_proc waveOutClose;\n            ma_proc waveOutPrepareHeader;\n            ma_proc waveOutUnprepareHeader;\n            ma_proc waveOutWrite;\n            ma_proc waveOutReset;\n            ma_proc waveInGetNumDevs;\n            ma_proc waveInGetDevCapsA;\n            ma_proc waveInOpen;\n            ma_proc waveInClose;\n            ma_proc waveInPrepareHeader;\n            ma_proc waveInUnprepareHeader;\n            ma_proc waveInAddBuffer;\n            ma_proc waveInStart;\n            ma_proc waveInReset;\n        } winmm;\n#endif\n#ifdef MA_SUPPORT_ALSA\n        struct\n        {\n            ma_handle asoundSO;\n            ma_proc snd_pcm_open;\n            ma_proc snd_pcm_close;\n            ma_proc snd_pcm_hw_params_sizeof;\n            ma_proc snd_pcm_hw_params_any;\n            ma_proc snd_pcm_hw_params_set_format;\n            ma_proc snd_pcm_hw_params_set_format_first;\n            ma_proc snd_pcm_hw_params_get_format_mask;\n            ma_proc snd_pcm_hw_params_set_channels;\n            ma_proc snd_pcm_hw_params_set_channels_near;\n            ma_proc snd_pcm_hw_params_set_channels_minmax;\n            ma_proc snd_pcm_hw_params_set_rate_resample;\n            ma_proc snd_pcm_hw_params_set_rate;\n            ma_proc snd_pcm_hw_params_set_rate_near;\n            ma_proc snd_pcm_hw_params_set_buffer_size_near;\n            ma_proc snd_pcm_hw_params_set_periods_near;\n            ma_proc snd_pcm_hw_params_set_access;\n            ma_proc snd_pcm_hw_params_get_format;\n            ma_proc snd_pcm_hw_params_get_channels;\n            ma_proc snd_pcm_hw_params_get_channels_min;\n            ma_proc snd_pcm_hw_params_get_channels_max;\n            ma_proc snd_pcm_hw_params_get_rate;\n            ma_proc snd_pcm_hw_params_get_rate_min;\n            ma_proc snd_pcm_hw_params_get_rate_max;\n            ma_proc snd_pcm_hw_params_get_buffer_size;\n            ma_proc snd_pcm_hw_params_get_periods;\n            ma_proc snd_pcm_hw_params_get_access;\n            ma_proc snd_pcm_hw_params_test_format;\n            ma_proc snd_pcm_hw_params_test_channels;\n            ma_proc snd_pcm_hw_params_test_rate;\n            ma_proc snd_pcm_hw_params;\n            ma_proc snd_pcm_sw_params_sizeof;\n            ma_proc snd_pcm_sw_params_current;\n            ma_proc snd_pcm_sw_params_get_boundary;\n            ma_proc snd_pcm_sw_params_set_avail_min;\n            ma_proc snd_pcm_sw_params_set_start_threshold;\n            ma_proc snd_pcm_sw_params_set_stop_threshold;\n            ma_proc snd_pcm_sw_params;\n            ma_proc snd_pcm_format_mask_sizeof;\n            ma_proc snd_pcm_format_mask_test;\n            ma_proc snd_pcm_get_chmap;\n            ma_proc snd_pcm_state;\n            ma_proc snd_pcm_prepare;\n            ma_proc snd_pcm_start;\n            ma_proc snd_pcm_drop;\n            ma_proc snd_pcm_drain;\n            ma_proc snd_pcm_reset;\n            ma_proc snd_device_name_hint;\n            ma_proc snd_device_name_get_hint;\n            ma_proc snd_card_get_index;\n            ma_proc snd_device_name_free_hint;\n            ma_proc snd_pcm_mmap_begin;\n            ma_proc snd_pcm_mmap_commit;\n            ma_proc snd_pcm_recover;\n            ma_proc snd_pcm_readi;\n            ma_proc snd_pcm_writei;\n            ma_proc snd_pcm_avail;\n            ma_proc snd_pcm_avail_update;\n            ma_proc snd_pcm_wait;\n            ma_proc snd_pcm_nonblock;\n            ma_proc snd_pcm_info;\n            ma_proc snd_pcm_info_sizeof;\n            ma_proc snd_pcm_info_get_name;\n            ma_proc snd_pcm_poll_descriptors;\n            ma_proc snd_pcm_poll_descriptors_count;\n            ma_proc snd_pcm_poll_descriptors_revents;\n            ma_proc snd_config_update_free_global;\n\n            ma_mutex internalDeviceEnumLock;\n            ma_bool32 useVerboseDeviceEnumeration;\n        } alsa;\n#endif\n#ifdef MA_SUPPORT_PULSEAUDIO\n        struct\n        {\n            ma_handle pulseSO;\n            ma_proc pa_mainloop_new;\n            ma_proc pa_mainloop_free;\n            ma_proc pa_mainloop_quit;\n            ma_proc pa_mainloop_get_api;\n            ma_proc pa_mainloop_iterate;\n            ma_proc pa_mainloop_wakeup;\n            ma_proc pa_threaded_mainloop_new;\n            ma_proc pa_threaded_mainloop_free;\n            ma_proc pa_threaded_mainloop_start;\n            ma_proc pa_threaded_mainloop_stop;\n            ma_proc pa_threaded_mainloop_lock;\n            ma_proc pa_threaded_mainloop_unlock;\n            ma_proc pa_threaded_mainloop_wait;\n            ma_proc pa_threaded_mainloop_signal;\n            ma_proc pa_threaded_mainloop_accept;\n            ma_proc pa_threaded_mainloop_get_retval;\n            ma_proc pa_threaded_mainloop_get_api;\n            ma_proc pa_threaded_mainloop_in_thread;\n            ma_proc pa_threaded_mainloop_set_name;\n            ma_proc pa_context_new;\n            ma_proc pa_context_unref;\n            ma_proc pa_context_connect;\n            ma_proc pa_context_disconnect;\n            ma_proc pa_context_set_state_callback;\n            ma_proc pa_context_get_state;\n            ma_proc pa_context_get_sink_info_list;\n            ma_proc pa_context_get_source_info_list;\n            ma_proc pa_context_get_sink_info_by_name;\n            ma_proc pa_context_get_source_info_by_name;\n            ma_proc pa_operation_unref;\n            ma_proc pa_operation_get_state;\n            ma_proc pa_channel_map_init_extend;\n            ma_proc pa_channel_map_valid;\n            ma_proc pa_channel_map_compatible;\n            ma_proc pa_stream_new;\n            ma_proc pa_stream_unref;\n            ma_proc pa_stream_connect_playback;\n            ma_proc pa_stream_connect_record;\n            ma_proc pa_stream_disconnect;\n            ma_proc pa_stream_get_state;\n            ma_proc pa_stream_get_sample_spec;\n            ma_proc pa_stream_get_channel_map;\n            ma_proc pa_stream_get_buffer_attr;\n            ma_proc pa_stream_set_buffer_attr;\n            ma_proc pa_stream_get_device_name;\n            ma_proc pa_stream_set_write_callback;\n            ma_proc pa_stream_set_read_callback;\n            ma_proc pa_stream_set_suspended_callback;\n            ma_proc pa_stream_set_moved_callback;\n            ma_proc pa_stream_is_suspended;\n            ma_proc pa_stream_flush;\n            ma_proc pa_stream_drain;\n            ma_proc pa_stream_is_corked;\n            ma_proc pa_stream_cork;\n            ma_proc pa_stream_trigger;\n            ma_proc pa_stream_begin_write;\n            ma_proc pa_stream_write;\n            ma_proc pa_stream_peek;\n            ma_proc pa_stream_drop;\n            ma_proc pa_stream_writable_size;\n            ma_proc pa_stream_readable_size;\n\n            /*pa_mainloop**/ ma_ptr pMainLoop;\n            /*pa_context**/ ma_ptr pPulseContext;\n            char* pApplicationName; /* Set when the context is initialized. Used by devices for their local pa_context objects. */\n            char* pServerName;      /* Set when the context is initialized. Used by devices for their local pa_context objects. */\n        } pulse;\n#endif\n#ifdef MA_SUPPORT_JACK\n        struct\n        {\n            ma_handle jackSO;\n            ma_proc jack_client_open;\n            ma_proc jack_client_close;\n            ma_proc jack_client_name_size;\n            ma_proc jack_set_process_callback;\n            ma_proc jack_set_buffer_size_callback;\n            ma_proc jack_on_shutdown;\n            ma_proc jack_get_sample_rate;\n            ma_proc jack_get_buffer_size;\n            ma_proc jack_get_ports;\n            ma_proc jack_activate;\n            ma_proc jack_deactivate;\n            ma_proc jack_connect;\n            ma_proc jack_port_register;\n            ma_proc jack_port_name;\n            ma_proc jack_port_get_buffer;\n            ma_proc jack_free;\n\n            char* pClientName;\n            ma_bool32 tryStartServer;\n        } jack;\n#endif\n#ifdef MA_SUPPORT_COREAUDIO\n        struct\n        {\n            ma_handle hCoreFoundation;\n            ma_proc CFStringGetCString;\n            ma_proc CFRelease;\n\n            ma_handle hCoreAudio;\n            ma_proc AudioObjectGetPropertyData;\n            ma_proc AudioObjectGetPropertyDataSize;\n            ma_proc AudioObjectSetPropertyData;\n            ma_proc AudioObjectAddPropertyListener;\n            ma_proc AudioObjectRemovePropertyListener;\n\n            ma_handle hAudioUnit;  /* Could possibly be set to AudioToolbox on later versions of macOS. */\n            ma_proc AudioComponentFindNext;\n            ma_proc AudioComponentInstanceDispose;\n            ma_proc AudioComponentInstanceNew;\n            ma_proc AudioOutputUnitStart;\n            ma_proc AudioOutputUnitStop;\n            ma_proc AudioUnitAddPropertyListener;\n            ma_proc AudioUnitGetPropertyInfo;\n            ma_proc AudioUnitGetProperty;\n            ma_proc AudioUnitSetProperty;\n            ma_proc AudioUnitInitialize;\n            ma_proc AudioUnitRender;\n\n            /*AudioComponent*/ ma_ptr component;\n            ma_bool32 noAudioSessionDeactivate; /* For tracking whether or not the iOS audio session should be explicitly deactivated. Set from the config in ma_context_init__coreaudio(). */\n        } coreaudio;\n#endif\n#ifdef MA_SUPPORT_SNDIO\n        struct\n        {\n            ma_handle sndioSO;\n            ma_proc sio_open;\n            ma_proc sio_close;\n            ma_proc sio_setpar;\n            ma_proc sio_getpar;\n            ma_proc sio_getcap;\n            ma_proc sio_start;\n            ma_proc sio_stop;\n            ma_proc sio_read;\n            ma_proc sio_write;\n            ma_proc sio_onmove;\n            ma_proc sio_nfds;\n            ma_proc sio_pollfd;\n            ma_proc sio_revents;\n            ma_proc sio_eof;\n            ma_proc sio_setvol;\n            ma_proc sio_onvol;\n            ma_proc sio_initpar;\n        } sndio;\n#endif\n#ifdef MA_SUPPORT_AUDIO4\n        struct\n        {\n            int _unused;\n        } audio4;\n#endif\n#ifdef MA_SUPPORT_OSS\n        struct\n        {\n            int versionMajor;\n            int versionMinor;\n        } oss;\n#endif\n#ifdef MA_SUPPORT_AAUDIO\n        struct\n        {\n            ma_handle hAAudio; /* libaaudio.so */\n            ma_proc AAudio_createStreamBuilder;\n            ma_proc AAudioStreamBuilder_delete;\n            ma_proc AAudioStreamBuilder_setDeviceId;\n            ma_proc AAudioStreamBuilder_setDirection;\n            ma_proc AAudioStreamBuilder_setSharingMode;\n            ma_proc AAudioStreamBuilder_setFormat;\n            ma_proc AAudioStreamBuilder_setChannelCount;\n            ma_proc AAudioStreamBuilder_setSampleRate;\n            ma_proc AAudioStreamBuilder_setBufferCapacityInFrames;\n            ma_proc AAudioStreamBuilder_setFramesPerDataCallback;\n            ma_proc AAudioStreamBuilder_setDataCallback;\n            ma_proc AAudioStreamBuilder_setErrorCallback;\n            ma_proc AAudioStreamBuilder_setPerformanceMode;\n            ma_proc AAudioStreamBuilder_setUsage;\n            ma_proc AAudioStreamBuilder_setContentType;\n            ma_proc AAudioStreamBuilder_setInputPreset;\n            ma_proc AAudioStreamBuilder_setAllowedCapturePolicy;\n            ma_proc AAudioStreamBuilder_openStream;\n            ma_proc AAudioStream_close;\n            ma_proc AAudioStream_getState;\n            ma_proc AAudioStream_waitForStateChange;\n            ma_proc AAudioStream_getFormat;\n            ma_proc AAudioStream_getChannelCount;\n            ma_proc AAudioStream_getSampleRate;\n            ma_proc AAudioStream_getBufferCapacityInFrames;\n            ma_proc AAudioStream_getFramesPerDataCallback;\n            ma_proc AAudioStream_getFramesPerBurst;\n            ma_proc AAudioStream_requestStart;\n            ma_proc AAudioStream_requestStop;\n            ma_device_job_thread jobThread; /* For processing operations outside of the error callback, specifically device disconnections and rerouting. */\n        } aaudio;\n#endif\n#ifdef MA_SUPPORT_OPENSL\n        struct\n        {\n            ma_handle libOpenSLES;\n            ma_handle SL_IID_ENGINE;\n            ma_handle SL_IID_AUDIOIODEVICECAPABILITIES;\n            ma_handle SL_IID_ANDROIDSIMPLEBUFFERQUEUE;\n            ma_handle SL_IID_RECORD;\n            ma_handle SL_IID_PLAY;\n            ma_handle SL_IID_OUTPUTMIX;\n            ma_handle SL_IID_ANDROIDCONFIGURATION;\n            ma_proc   slCreateEngine;\n        } opensl;\n#endif\n#ifdef MA_SUPPORT_WEBAUDIO\n        struct\n        {\n            int _unused;\n        } webaudio;\n#endif\n#ifdef MA_SUPPORT_NULL\n        struct\n        {\n            int _unused;\n        } null_backend;\n#endif\n    };\n\n    union\n    {\n#if defined(MA_WIN32)\n        struct\n        {\n            /*HMODULE*/ ma_handle hOle32DLL;\n            ma_proc CoInitialize;\n            ma_proc CoInitializeEx;\n            ma_proc CoUninitialize;\n            ma_proc CoCreateInstance;\n            ma_proc CoTaskMemFree;\n            ma_proc PropVariantClear;\n            ma_proc StringFromGUID2;\n\n            /*HMODULE*/ ma_handle hUser32DLL;\n            ma_proc GetForegroundWindow;\n            ma_proc GetDesktopWindow;\n\n            /*HMODULE*/ ma_handle hAdvapi32DLL;\n            ma_proc RegOpenKeyExA;\n            ma_proc RegCloseKey;\n            ma_proc RegQueryValueExA;\n\n            /*HRESULT*/ long CoInitializeResult;\n        } win32;\n#endif\n#ifdef MA_POSIX\n        struct\n        {\n            int _unused;\n        } posix;\n#endif\n        int _unused;\n    };\n};\n\nstruct ma_device\n{\n    ma_context* pContext;\n    ma_device_type type;\n    ma_uint32 sampleRate;\n    ma_atomic_device_state state;               /* The state of the device is variable and can change at any time on any thread. Must be used atomically. */\n    ma_device_data_proc onData;                 /* Set once at initialization time and should not be changed after. */\n    ma_device_notification_proc onNotification; /* Set once at initialization time and should not be changed after. */\n    ma_stop_proc onStop;                        /* DEPRECATED. Use the notification callback instead. Set once at initialization time and should not be changed after. */\n    void* pUserData;                            /* Application defined data. */\n    ma_mutex startStopLock;\n    ma_event wakeupEvent;\n    ma_event startEvent;\n    ma_event stopEvent;\n    ma_thread thread;\n    ma_result workResult;                       /* This is set by the worker thread after it's finished doing a job. */\n    ma_bool8 isOwnerOfContext;                  /* When set to true, uninitializing the device will also uninitialize the context. Set to true when NULL is passed into ma_device_init(). */\n    ma_bool8 noPreSilencedOutputBuffer;\n    ma_bool8 noClip;\n    ma_bool8 noDisableDenormals;\n    ma_bool8 noFixedSizedCallback;\n    ma_atomic_float masterVolumeFactor;         /* Linear 0..1. Can be read and written simultaneously by different threads. Must be used atomically. */\n    ma_duplex_rb duplexRB;                      /* Intermediary buffer for duplex device on asynchronous backends. */\n    struct\n    {\n        ma_resample_algorithm algorithm;\n        ma_resampling_backend_vtable* pBackendVTable;\n        void* pBackendUserData;\n        struct\n        {\n            ma_uint32 lpfOrder;\n        } linear;\n    } resampling;\n    struct\n    {\n        ma_device_id* pID;                  /* Set to NULL if using default ID, otherwise set to the address of \"id\". */\n        ma_device_id id;                    /* If using an explicit device, will be set to a copy of the ID used for initialization. Otherwise cleared to 0. */\n        char name[MA_MAX_DEVICE_NAME_LENGTH + 1];                     /* Maybe temporary. Likely to be replaced with a query API. */\n        ma_share_mode shareMode;            /* Set to whatever was passed in when the device was initialized. */\n        ma_format format;\n        ma_uint32 channels;\n        ma_channel channelMap[MA_MAX_CHANNELS];\n        ma_format internalFormat;\n        ma_uint32 internalChannels;\n        ma_uint32 internalSampleRate;\n        ma_channel internalChannelMap[MA_MAX_CHANNELS];\n        ma_uint32 internalPeriodSizeInFrames;\n        ma_uint32 internalPeriods;\n        ma_channel_mix_mode channelMixMode;\n        ma_bool32 calculateLFEFromSpatialChannels;\n        ma_data_converter converter;\n        void* pIntermediaryBuffer;          /* For implementing fixed sized buffer callbacks. Will be null if using variable sized callbacks. */\n        ma_uint32 intermediaryBufferCap;\n        ma_uint32 intermediaryBufferLen;    /* How many valid frames are sitting in the intermediary buffer. */\n        void* pInputCache;                  /* In external format. Can be null. */\n        ma_uint64 inputCacheCap;\n        ma_uint64 inputCacheConsumed;\n        ma_uint64 inputCacheRemaining;\n    } playback;\n    struct\n    {\n        ma_device_id* pID;                  /* Set to NULL if using default ID, otherwise set to the address of \"id\". */\n        ma_device_id id;                    /* If using an explicit device, will be set to a copy of the ID used for initialization. Otherwise cleared to 0. */\n        char name[MA_MAX_DEVICE_NAME_LENGTH + 1];                     /* Maybe temporary. Likely to be replaced with a query API. */\n        ma_share_mode shareMode;            /* Set to whatever was passed in when the device was initialized. */\n        ma_format format;\n        ma_uint32 channels;\n        ma_channel channelMap[MA_MAX_CHANNELS];\n        ma_format internalFormat;\n        ma_uint32 internalChannels;\n        ma_uint32 internalSampleRate;\n        ma_channel internalChannelMap[MA_MAX_CHANNELS];\n        ma_uint32 internalPeriodSizeInFrames;\n        ma_uint32 internalPeriods;\n        ma_channel_mix_mode channelMixMode;\n        ma_bool32 calculateLFEFromSpatialChannels;\n        ma_data_converter converter;\n        void* pIntermediaryBuffer;          /* For implementing fixed sized buffer callbacks. Will be null if using variable sized callbacks. */\n        ma_uint32 intermediaryBufferCap;\n        ma_uint32 intermediaryBufferLen;    /* How many valid frames are sitting in the intermediary buffer. */\n    } capture;\n\n    union\n    {\n#ifdef MA_SUPPORT_WASAPI\n        struct\n        {\n            /*IAudioClient**/ ma_ptr pAudioClientPlayback;\n            /*IAudioClient**/ ma_ptr pAudioClientCapture;\n            /*IAudioRenderClient**/ ma_ptr pRenderClient;\n            /*IAudioCaptureClient**/ ma_ptr pCaptureClient;\n            /*IMMDeviceEnumerator**/ ma_ptr pDeviceEnumerator;      /* Used for IMMNotificationClient notifications. Required for detecting default device changes. */\n            ma_IMMNotificationClient notificationClient;\n            /*HANDLE*/ ma_handle hEventPlayback;                    /* Auto reset. Initialized to signaled. */\n            /*HANDLE*/ ma_handle hEventCapture;                     /* Auto reset. Initialized to unsignaled. */\n            ma_uint32 actualBufferSizeInFramesPlayback;             /* Value from GetBufferSize(). internalPeriodSizeInFrames is not set to the _actual_ buffer size when low-latency shared mode is being used due to the way the IAudioClient3 API works. */\n            ma_uint32 actualBufferSizeInFramesCapture;\n            ma_uint32 originalPeriodSizeInFrames;\n            ma_uint32 originalPeriodSizeInMilliseconds;\n            ma_uint32 originalPeriods;\n            ma_performance_profile originalPerformanceProfile;\n            ma_uint32 periodSizeInFramesPlayback;\n            ma_uint32 periodSizeInFramesCapture;\n            void* pMappedBufferCapture;\n            ma_uint32 mappedBufferCaptureCap;\n            ma_uint32 mappedBufferCaptureLen;\n            void* pMappedBufferPlayback;\n            ma_uint32 mappedBufferPlaybackCap;\n            ma_uint32 mappedBufferPlaybackLen;\n            ma_atomic_bool32 isStartedCapture;                      /* Can be read and written simultaneously across different threads. Must be used atomically, and must be 32-bit. */\n            ma_atomic_bool32 isStartedPlayback;                     /* Can be read and written simultaneously across different threads. Must be used atomically, and must be 32-bit. */\n            ma_uint32 loopbackProcessID;\n            ma_bool8 loopbackProcessExclude;\n            ma_bool8 noAutoConvertSRC;                              /* When set to true, disables the use of AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM. */\n            ma_bool8 noDefaultQualitySRC;                           /* When set to true, disables the use of AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY. */\n            ma_bool8 noHardwareOffloading;\n            ma_bool8 allowCaptureAutoStreamRouting;\n            ma_bool8 allowPlaybackAutoStreamRouting;\n            ma_bool8 isDetachedPlayback;\n            ma_bool8 isDetachedCapture;\n            ma_wasapi_usage usage;\n            void* hAvrtHandle;\n            ma_mutex rerouteLock;\n        } wasapi;\n#endif\n#ifdef MA_SUPPORT_DSOUND\n        struct\n        {\n            /*LPDIRECTSOUND*/ ma_ptr pPlayback;\n            /*LPDIRECTSOUNDBUFFER*/ ma_ptr pPlaybackPrimaryBuffer;\n            /*LPDIRECTSOUNDBUFFER*/ ma_ptr pPlaybackBuffer;\n            /*LPDIRECTSOUNDCAPTURE*/ ma_ptr pCapture;\n            /*LPDIRECTSOUNDCAPTUREBUFFER*/ ma_ptr pCaptureBuffer;\n        } dsound;\n#endif\n#ifdef MA_SUPPORT_WINMM\n        struct\n        {\n            /*HWAVEOUT*/ ma_handle hDevicePlayback;\n            /*HWAVEIN*/ ma_handle hDeviceCapture;\n            /*HANDLE*/ ma_handle hEventPlayback;\n            /*HANDLE*/ ma_handle hEventCapture;\n            ma_uint32 fragmentSizeInFrames;\n            ma_uint32 iNextHeaderPlayback;             /* [0,periods). Used as an index into pWAVEHDRPlayback. */\n            ma_uint32 iNextHeaderCapture;              /* [0,periods). Used as an index into pWAVEHDRCapture. */\n            ma_uint32 headerFramesConsumedPlayback;    /* The number of PCM frames consumed in the buffer in pWAVEHEADER[iNextHeader]. */\n            ma_uint32 headerFramesConsumedCapture;     /* ^^^ */\n            /*WAVEHDR**/ ma_uint8* pWAVEHDRPlayback;   /* One instantiation for each period. */\n            /*WAVEHDR**/ ma_uint8* pWAVEHDRCapture;    /* One instantiation for each period. */\n            ma_uint8* pIntermediaryBufferPlayback;\n            ma_uint8* pIntermediaryBufferCapture;\n            ma_uint8* _pHeapData;                      /* Used internally and is used for the heap allocated data for the intermediary buffer and the WAVEHDR structures. */\n        } winmm;\n#endif\n#ifdef MA_SUPPORT_ALSA\n        struct\n        {\n            /*snd_pcm_t**/ ma_ptr pPCMPlayback;\n            /*snd_pcm_t**/ ma_ptr pPCMCapture;\n            /*struct pollfd**/ void* pPollDescriptorsPlayback;\n            /*struct pollfd**/ void* pPollDescriptorsCapture;\n            int pollDescriptorCountPlayback;\n            int pollDescriptorCountCapture;\n            int wakeupfdPlayback;   /* eventfd for waking up from poll() when the playback device is stopped. */\n            int wakeupfdCapture;    /* eventfd for waking up from poll() when the capture device is stopped. */\n            ma_bool8 isUsingMMapPlayback;\n            ma_bool8 isUsingMMapCapture;\n        } alsa;\n#endif\n#ifdef MA_SUPPORT_PULSEAUDIO\n        struct\n        {\n            /*pa_mainloop**/ ma_ptr pMainLoop;\n            /*pa_context**/ ma_ptr pPulseContext;\n            /*pa_stream**/ ma_ptr pStreamPlayback;\n            /*pa_stream**/ ma_ptr pStreamCapture;\n        } pulse;\n#endif\n#ifdef MA_SUPPORT_JACK\n        struct\n        {\n            /*jack_client_t**/ ma_ptr pClient;\n            /*jack_port_t**/ ma_ptr* ppPortsPlayback;\n            /*jack_port_t**/ ma_ptr* ppPortsCapture;\n            float* pIntermediaryBufferPlayback; /* Typed as a float because JACK is always floating point. */\n            float* pIntermediaryBufferCapture;\n        } jack;\n#endif\n#ifdef MA_SUPPORT_COREAUDIO\n        struct\n        {\n            ma_uint32 deviceObjectIDPlayback;\n            ma_uint32 deviceObjectIDCapture;\n            /*AudioUnit*/ ma_ptr audioUnitPlayback;\n            /*AudioUnit*/ ma_ptr audioUnitCapture;\n            /*AudioBufferList**/ ma_ptr pAudioBufferList;   /* Only used for input devices. */\n            ma_uint32 audioBufferCapInFrames;               /* Only used for input devices. The capacity in frames of each buffer in pAudioBufferList. */\n            ma_event stopEvent;\n            ma_uint32 originalPeriodSizeInFrames;\n            ma_uint32 originalPeriodSizeInMilliseconds;\n            ma_uint32 originalPeriods;\n            ma_performance_profile originalPerformanceProfile;\n            ma_bool32 isDefaultPlaybackDevice;\n            ma_bool32 isDefaultCaptureDevice;\n            ma_bool32 isSwitchingPlaybackDevice;   /* <-- Set to true when the default device has changed and miniaudio is in the process of switching. */\n            ma_bool32 isSwitchingCaptureDevice;    /* <-- Set to true when the default device has changed and miniaudio is in the process of switching. */\n            void* pNotificationHandler;             /* Only used on mobile platforms. Obj-C object for handling route changes. */\n        } coreaudio;\n#endif\n#ifdef MA_SUPPORT_SNDIO\n        struct\n        {\n            ma_ptr handlePlayback;\n            ma_ptr handleCapture;\n            ma_bool32 isStartedPlayback;\n            ma_bool32 isStartedCapture;\n        } sndio;\n#endif\n#ifdef MA_SUPPORT_AUDIO4\n        struct\n        {\n            int fdPlayback;\n            int fdCapture;\n        } audio4;\n#endif\n#ifdef MA_SUPPORT_OSS\n        struct\n        {\n            int fdPlayback;\n            int fdCapture;\n        } oss;\n#endif\n#ifdef MA_SUPPORT_AAUDIO\n        struct\n        {\n            /*AAudioStream**/ ma_ptr pStreamPlayback;\n            /*AAudioStream**/ ma_ptr pStreamCapture;\n            ma_aaudio_usage usage;\n            ma_aaudio_content_type contentType;\n            ma_aaudio_input_preset inputPreset;\n            ma_aaudio_allowed_capture_policy allowedCapturePolicy;\n            ma_bool32 noAutoStartAfterReroute;\n        } aaudio;\n#endif\n#ifdef MA_SUPPORT_OPENSL\n        struct\n        {\n            /*SLObjectItf*/ ma_ptr pOutputMixObj;\n            /*SLOutputMixItf*/ ma_ptr pOutputMix;\n            /*SLObjectItf*/ ma_ptr pAudioPlayerObj;\n            /*SLPlayItf*/ ma_ptr pAudioPlayer;\n            /*SLObjectItf*/ ma_ptr pAudioRecorderObj;\n            /*SLRecordItf*/ ma_ptr pAudioRecorder;\n            /*SLAndroidSimpleBufferQueueItf*/ ma_ptr pBufferQueuePlayback;\n            /*SLAndroidSimpleBufferQueueItf*/ ma_ptr pBufferQueueCapture;\n            ma_bool32 isDrainingCapture;\n            ma_bool32 isDrainingPlayback;\n            ma_uint32 currentBufferIndexPlayback;\n            ma_uint32 currentBufferIndexCapture;\n            ma_uint8* pBufferPlayback;      /* This is malloc()'d and is used for storing audio data. Typed as ma_uint8 for easy offsetting. */\n            ma_uint8* pBufferCapture;\n        } opensl;\n#endif\n#ifdef MA_SUPPORT_WEBAUDIO\n        struct\n        {\n            /* AudioWorklets path. */\n            /* EMSCRIPTEN_WEBAUDIO_T */ int audioContext;\n            /* EMSCRIPTEN_WEBAUDIO_T */ int audioWorklet;\n            float* pIntermediaryBuffer;\n            void* pStackBuffer;\n            ma_result initResult;   /* Set to MA_BUSY while initialization is in progress. */\n            int deviceIndex;        /* We store the device in a list on the JavaScript side. This is used to map our C object to the JS object. */\n        } webaudio;\n#endif\n#ifdef MA_SUPPORT_NULL\n        struct\n        {\n            ma_thread deviceThread;\n            ma_event operationEvent;\n            ma_event operationCompletionEvent;\n            ma_semaphore operationSemaphore;\n            ma_uint32 operation;\n            ma_result operationResult;\n            ma_timer timer;\n            double priorRunTime;\n            ma_uint32 currentPeriodFramesRemainingPlayback;\n            ma_uint32 currentPeriodFramesRemainingCapture;\n            ma_uint64 lastProcessedFramePlayback;\n            ma_uint64 lastProcessedFrameCapture;\n            ma_atomic_bool32 isStarted; /* Read and written by multiple threads. Must be used atomically, and must be 32-bit for compiler compatibility. */\n        } null_device;\n#endif\n    };\n};\n#if defined(_MSC_VER) && !defined(__clang__)\n    #pragma warning(pop)\n#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))\n    #pragma GCC diagnostic pop  /* For ISO C99 doesn't support unnamed structs/unions [-Wpedantic] */\n#endif\n\n/*\nInitializes a `ma_context_config` object.\n\n\nReturn Value\n------------\nA `ma_context_config` initialized to defaults.\n\n\nRemarks\n-------\nYou must always use this to initialize the default state of the `ma_context_config` object. Not using this will result in your program breaking when miniaudio\nis updated and new members are added to `ma_context_config`. It also sets logical defaults.\n\nYou can override members of the returned object by changing it's members directly.\n\n\nSee Also\n--------\nma_context_init()\n*/\nMA_API ma_context_config ma_context_config_init(void);\n\n/*\nInitializes a context.\n\nThe context is used for selecting and initializing an appropriate backend and to represent the backend at a more global level than that of an individual\ndevice. There is one context to many devices, and a device is created from a context. A context is required to enumerate devices.\n\n\nParameters\n----------\nbackends (in, optional)\n    A list of backends to try initializing, in priority order. Can be NULL, in which case it uses default priority order.\n\nbackendCount (in, optional)\n    The number of items in `backend`. Ignored if `backend` is NULL.\n\npConfig (in, optional)\n    The context configuration.\n\npContext (in)\n    A pointer to the context object being initialized.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful; any other error code otherwise.\n\n\nThread Safety\n-------------\nUnsafe. Do not call this function across multiple threads as some backends read and write to global state.\n\n\nRemarks\n-------\nWhen `backends` is NULL, the default priority order will be used. Below is a list of backends in priority order:\n\n    |-------------|-----------------------|--------------------------------------------------------|\n    | Name        | Enum Name             | Supported Operating Systems                            |\n    |-------------|-----------------------|--------------------------------------------------------|\n    | WASAPI      | ma_backend_wasapi     | Windows Vista+                                         |\n    | DirectSound | ma_backend_dsound     | Windows XP+                                            |\n    | WinMM       | ma_backend_winmm      | Windows XP+ (may work on older versions, but untested) |\n    | Core Audio  | ma_backend_coreaudio  | macOS, iOS                                             |\n    | ALSA        | ma_backend_alsa       | Linux                                                  |\n    | PulseAudio  | ma_backend_pulseaudio | Cross Platform (disabled on Windows, BSD and Android)  |\n    | JACK        | ma_backend_jack       | Cross Platform (disabled on BSD and Android)           |\n    | sndio       | ma_backend_sndio      | OpenBSD                                                |\n    | audio(4)    | ma_backend_audio4     | NetBSD, OpenBSD                                        |\n    | OSS         | ma_backend_oss        | FreeBSD                                                |\n    | AAudio      | ma_backend_aaudio     | Android 8+                                             |\n    | OpenSL|ES   | ma_backend_opensl     | Android (API level 16+)                                |\n    | Web Audio   | ma_backend_webaudio   | Web (via Emscripten)                                   |\n    | Null        | ma_backend_null       | Cross Platform (not used on Web)                       |\n    |-------------|-----------------------|--------------------------------------------------------|\n\nThe context can be configured via the `pConfig` argument. The config object is initialized with `ma_context_config_init()`. Individual configuration settings\ncan then be set directly on the structure. Below are the members of the `ma_context_config` object.\n\n    pLog\n        A pointer to the `ma_log` to post log messages to. Can be NULL if the application does not\n        require logging. See the `ma_log` API for details on how to use the logging system.\n\n    threadPriority\n        The desired priority to use for the audio thread. Allowable values include the following:\n\n        |--------------------------------------|\n        | Thread Priority                      |\n        |--------------------------------------|\n        | ma_thread_priority_idle              |\n        | ma_thread_priority_lowest            |\n        | ma_thread_priority_low               |\n        | ma_thread_priority_normal            |\n        | ma_thread_priority_high              |\n        | ma_thread_priority_highest (default) |\n        | ma_thread_priority_realtime          |\n        | ma_thread_priority_default           |\n        |--------------------------------------|\n\n    threadStackSize\n        The desired size of the stack for the audio thread. Defaults to the operating system's default.\n\n    pUserData\n        A pointer to application-defined data. This can be accessed from the context object directly such as `context.pUserData`.\n\n    allocationCallbacks\n        Structure containing custom allocation callbacks. Leaving this at defaults will cause it to use MA_MALLOC, MA_REALLOC and MA_FREE. These allocation\n        callbacks will be used for anything tied to the context, including devices.\n\n    alsa.useVerboseDeviceEnumeration\n        ALSA will typically enumerate many different devices which can be intrusive and not user-friendly. To combat this, miniaudio will enumerate only unique\n        card/device pairs by default. The problem with this is that you lose a bit of flexibility and control. Setting alsa.useVerboseDeviceEnumeration makes\n        it so the ALSA backend includes all devices. Defaults to false.\n\n    pulse.pApplicationName\n        PulseAudio only. The application name to use when initializing the PulseAudio context with `pa_context_new()`.\n\n    pulse.pServerName\n        PulseAudio only. The name of the server to connect to with `pa_context_connect()`.\n\n    pulse.tryAutoSpawn\n        PulseAudio only. Whether or not to try automatically starting the PulseAudio daemon. Defaults to false. If you set this to true, keep in mind that\n        miniaudio uses a trial and error method to find the most appropriate backend, and this will result in the PulseAudio daemon starting which may be\n        intrusive for the end user.\n\n    coreaudio.sessionCategory\n        iOS only. The session category to use for the shared AudioSession instance. Below is a list of allowable values and their Core Audio equivalents.\n\n        |-----------------------------------------|-------------------------------------|\n        | miniaudio Token                         | Core Audio Token                    |\n        |-----------------------------------------|-------------------------------------|\n        | ma_ios_session_category_ambient         | AVAudioSessionCategoryAmbient       |\n        | ma_ios_session_category_solo_ambient    | AVAudioSessionCategorySoloAmbient   |\n        | ma_ios_session_category_playback        | AVAudioSessionCategoryPlayback      |\n        | ma_ios_session_category_record          | AVAudioSessionCategoryRecord        |\n        | ma_ios_session_category_play_and_record | AVAudioSessionCategoryPlayAndRecord |\n        | ma_ios_session_category_multi_route     | AVAudioSessionCategoryMultiRoute    |\n        | ma_ios_session_category_none            | AVAudioSessionCategoryAmbient       |\n        | ma_ios_session_category_default         | AVAudioSessionCategoryAmbient       |\n        |-----------------------------------------|-------------------------------------|\n\n    coreaudio.sessionCategoryOptions\n        iOS only. Session category options to use with the shared AudioSession instance. Below is a list of allowable values and their Core Audio equivalents.\n\n        |---------------------------------------------------------------------------|------------------------------------------------------------------|\n        | miniaudio Token                                                           | Core Audio Token                                                 |\n        |---------------------------------------------------------------------------|------------------------------------------------------------------|\n        | ma_ios_session_category_option_mix_with_others                            | AVAudioSessionCategoryOptionMixWithOthers                        |\n        | ma_ios_session_category_option_duck_others                                | AVAudioSessionCategoryOptionDuckOthers                           |\n        | ma_ios_session_category_option_allow_bluetooth                            | AVAudioSessionCategoryOptionAllowBluetooth                       |\n        | ma_ios_session_category_option_default_to_speaker                         | AVAudioSessionCategoryOptionDefaultToSpeaker                     |\n        | ma_ios_session_category_option_interrupt_spoken_audio_and_mix_with_others | AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers |\n        | ma_ios_session_category_option_allow_bluetooth_a2dp                       | AVAudioSessionCategoryOptionAllowBluetoothA2DP                   |\n        | ma_ios_session_category_option_allow_air_play                             | AVAudioSessionCategoryOptionAllowAirPlay                         |\n        |---------------------------------------------------------------------------|------------------------------------------------------------------|\n\n    coreaudio.noAudioSessionActivate\n        iOS only. When set to true, does not perform an explicit [[AVAudioSession sharedInstace] setActive:true] on initialization.\n\n    coreaudio.noAudioSessionDeactivate\n        iOS only. When set to true, does not perform an explicit [[AVAudioSession sharedInstace] setActive:false] on uninitialization.\n\n    jack.pClientName\n        The name of the client to pass to `jack_client_open()`.\n\n    jack.tryStartServer\n        Whether or not to try auto-starting the JACK server. Defaults to false.\n\n\nIt is recommended that only a single context is active at any given time because it's a bulky data structure which performs run-time linking for the\nrelevant backends every time it's initialized.\n\nThe location of the context cannot change throughout it's lifetime. Consider allocating the `ma_context` object with `malloc()` if this is an issue. The\nreason for this is that a pointer to the context is stored in the `ma_device` structure.\n\n\nExample 1 - Default Initialization\n----------------------------------\nThe example below shows how to initialize the context using the default configuration.\n\n```c\nma_context context;\nma_result result = ma_context_init(NULL, 0, NULL, &context);\nif (result != MA_SUCCESS) {\n    // Error.\n}\n```\n\n\nExample 2 - Custom Configuration\n--------------------------------\nThe example below shows how to initialize the context using custom backend priorities and a custom configuration. In this hypothetical example, the program\nwants to prioritize ALSA over PulseAudio on Linux. They also want to avoid using the WinMM backend on Windows because it's latency is too high. They also\nwant an error to be returned if no valid backend is available which they achieve by excluding the Null backend.\n\nFor the configuration, the program wants to capture any log messages so they can, for example, route it to a log file and user interface.\n\n```c\nma_backend backends[] = {\n    ma_backend_alsa,\n    ma_backend_pulseaudio,\n    ma_backend_wasapi,\n    ma_backend_dsound\n};\n\nma_log log;\nma_log_init(&log);\nma_log_register_callback(&log, ma_log_callback_init(my_log_callbac, pMyLogUserData));\n\nma_context_config config = ma_context_config_init();\nconfig.pLog = &log; // Specify a custom log object in the config so any logs that are posted from ma_context_init() are captured.\n\nma_context context;\nma_result result = ma_context_init(backends, sizeof(backends)/sizeof(backends[0]), &config, &context);\nif (result != MA_SUCCESS) {\n    // Error.\n    if (result == MA_NO_BACKEND) {\n        // Couldn't find an appropriate backend.\n    }\n}\n\n// You could also attach a log callback post-initialization:\nma_log_register_callback(ma_context_get_log(&context), ma_log_callback_init(my_log_callback, pMyLogUserData));\n```\n\n\nSee Also\n--------\nma_context_config_init()\nma_context_uninit()\n*/\nMA_API ma_result ma_context_init(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config* pConfig, ma_context* pContext);\n\n/*\nUninitializes a context.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful; any other error code otherwise.\n\n\nThread Safety\n-------------\nUnsafe. Do not call this function across multiple threads as some backends read and write to global state.\n\n\nRemarks\n-------\nResults are undefined if you call this while any device created by this context is still active.\n\n\nSee Also\n--------\nma_context_init()\n*/\nMA_API ma_result ma_context_uninit(ma_context* pContext);\n\n/*\nRetrieves the size of the ma_context object.\n\nThis is mainly for the purpose of bindings to know how much memory to allocate.\n*/\nMA_API size_t ma_context_sizeof(void);\n\n/*\nRetrieves a pointer to the log object associated with this context.\n\n\nRemarks\n-------\nPass the returned pointer to `ma_log_post()`, `ma_log_postv()` or `ma_log_postf()` to post a log\nmessage.\n\nYou can attach your own logging callback to the log with `ma_log_register_callback()`\n\n\nReturn Value\n------------\nA pointer to the `ma_log` object that the context uses to post log messages. If some error occurs,\nNULL will be returned.\n*/\nMA_API ma_log* ma_context_get_log(ma_context* pContext);\n\n/*\nEnumerates over every device (both playback and capture).\n\nThis is a lower-level enumeration function to the easier to use `ma_context_get_devices()`. Use `ma_context_enumerate_devices()` if you would rather not incur\nan internal heap allocation, or it simply suits your code better.\n\nNote that this only retrieves the ID and name/description of the device. The reason for only retrieving basic information is that it would otherwise require\nopening the backend device in order to probe it for more detailed information which can be inefficient. Consider using `ma_context_get_device_info()` for this,\nbut don't call it from within the enumeration callback.\n\nReturning false from the callback will stop enumeration. Returning true will continue enumeration.\n\n\nParameters\n----------\npContext (in)\n    A pointer to the context performing the enumeration.\n\ncallback (in)\n    The callback to fire for each enumerated device.\n\npUserData (in)\n    A pointer to application-defined data passed to the callback.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful; any other error code otherwise.\n\n\nThread Safety\n-------------\nSafe. This is guarded using a simple mutex lock.\n\n\nRemarks\n-------\nDo _not_ assume the first enumerated device of a given type is the default device.\n\nSome backends and platforms may only support default playback and capture devices.\n\nIn general, you should not do anything complicated from within the callback. In particular, do not try initializing a device from within the callback. Also,\ndo not try to call `ma_context_get_device_info()` from within the callback.\n\nConsider using `ma_context_get_devices()` for a simpler and safer API, albeit at the expense of an internal heap allocation.\n\n\nExample 1 - Simple Enumeration\n------------------------------\nma_bool32 ma_device_enum_callback(ma_context* pContext, ma_device_type deviceType, const ma_device_info* pInfo, void* pUserData)\n{\n    printf(\"Device Name: %s\\n\", pInfo->name);\n    return MA_TRUE;\n}\n\nma_result result = ma_context_enumerate_devices(&context, my_device_enum_callback, pMyUserData);\nif (result != MA_SUCCESS) {\n    // Error.\n}\n\n\nSee Also\n--------\nma_context_get_devices()\n*/\nMA_API ma_result ma_context_enumerate_devices(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData);\n\n/*\nRetrieves basic information about every active playback and/or capture device.\n\nThis function will allocate memory internally for the device lists and return a pointer to them through the `ppPlaybackDeviceInfos` and `ppCaptureDeviceInfos`\nparameters. If you do not want to incur the overhead of these allocations consider using `ma_context_enumerate_devices()` which will instead use a callback.\n\n\nParameters\n----------\npContext (in)\n    A pointer to the context performing the enumeration.\n\nppPlaybackDeviceInfos (out)\n    A pointer to a pointer that will receive the address of a buffer containing the list of `ma_device_info` structures for playback devices.\n\npPlaybackDeviceCount (out)\n    A pointer to an unsigned integer that will receive the number of playback devices.\n\nppCaptureDeviceInfos (out)\n    A pointer to a pointer that will receive the address of a buffer containing the list of `ma_device_info` structures for capture devices.\n\npCaptureDeviceCount (out)\n    A pointer to an unsigned integer that will receive the number of capture devices.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful; any other error code otherwise.\n\n\nThread Safety\n-------------\nUnsafe. Since each call to this function invalidates the pointers from the previous call, you should not be calling this simultaneously across multiple\nthreads. Instead, you need to make a copy of the returned data with your own higher level synchronization.\n\n\nRemarks\n-------\nIt is _not_ safe to assume the first device in the list is the default device.\n\nYou can pass in NULL for the playback or capture lists in which case they'll be ignored.\n\nThe returned pointers will become invalid upon the next call this this function, or when the context is uninitialized. Do not free the returned pointers.\n\n\nSee Also\n--------\nma_context_get_devices()\n*/\nMA_API ma_result ma_context_get_devices(ma_context* pContext, ma_device_info** ppPlaybackDeviceInfos, ma_uint32* pPlaybackDeviceCount, ma_device_info** ppCaptureDeviceInfos, ma_uint32* pCaptureDeviceCount);\n\n/*\nRetrieves information about a device of the given type, with the specified ID and share mode.\n\n\nParameters\n----------\npContext (in)\n    A pointer to the context performing the query.\n\ndeviceType (in)\n    The type of the device being queried. Must be either `ma_device_type_playback` or `ma_device_type_capture`.\n\npDeviceID (in)\n    The ID of the device being queried.\n\npDeviceInfo (out)\n    A pointer to the `ma_device_info` structure that will receive the device information.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful; any other error code otherwise.\n\n\nThread Safety\n-------------\nSafe. This is guarded using a simple mutex lock.\n\n\nRemarks\n-------\nDo _not_ call this from within the `ma_context_enumerate_devices()` callback.\n\nIt's possible for a device to have different information and capabilities depending on whether or not it's opened in shared or exclusive mode. For example, in\nshared mode, WASAPI always uses floating point samples for mixing, but in exclusive mode it can be anything. Therefore, this function allows you to specify\nwhich share mode you want information for. Note that not all backends and devices support shared or exclusive mode, in which case this function will fail if\nthe requested share mode is unsupported.\n\nThis leaves pDeviceInfo unmodified in the result of an error.\n*/\nMA_API ma_result ma_context_get_device_info(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo);\n\n/*\nDetermines if the given context supports loopback mode.\n\n\nParameters\n----------\npContext (in)\n    A pointer to the context getting queried.\n\n\nReturn Value\n------------\nMA_TRUE if the context supports loopback mode; MA_FALSE otherwise.\n*/\nMA_API ma_bool32 ma_context_is_loopback_supported(ma_context* pContext);\n\n\n\n/*\nInitializes a device config with default settings.\n\n\nParameters\n----------\ndeviceType (in)\n    The type of the device this config is being initialized for. This must set to one of the following:\n\n    |-------------------------|\n    | Device Type             |\n    |-------------------------|\n    | ma_device_type_playback |\n    | ma_device_type_capture  |\n    | ma_device_type_duplex   |\n    | ma_device_type_loopback |\n    |-------------------------|\n\n\nReturn Value\n------------\nA new device config object with default settings. You will typically want to adjust the config after this function returns. See remarks.\n\n\nThread Safety\n-------------\nSafe.\n\n\nCallback Safety\n---------------\nSafe, but don't try initializing a device in a callback.\n\n\nRemarks\n-------\nThe returned config will be initialized to defaults. You will normally want to customize a few variables before initializing the device. See Example 1 for a\ntypical configuration which sets the sample format, channel count, sample rate, data callback and user data. These are usually things you will want to change\nbefore initializing the device.\n\nSee `ma_device_init()` for details on specific configuration options.\n\n\nExample 1 - Simple Configuration\n--------------------------------\nThe example below is what a program will typically want to configure for each device at a minimum. Notice how `ma_device_config_init()` is called first, and\nthen the returned object is modified directly. This is important because it ensures that your program continues to work as new configuration options are added\nto the `ma_device_config` structure.\n\n```c\nma_device_config config = ma_device_config_init(ma_device_type_playback);\nconfig.playback.format   = ma_format_f32;\nconfig.playback.channels = 2;\nconfig.sampleRate        = 48000;\nconfig.dataCallback      = ma_data_callback;\nconfig.pUserData         = pMyUserData;\n```\n\n\nSee Also\n--------\nma_device_init()\nma_device_init_ex()\n*/\nMA_API ma_device_config ma_device_config_init(ma_device_type deviceType);\n\n\n/*\nInitializes a device.\n\nA device represents a physical audio device. The idea is you send or receive audio data from the device to either play it back through a speaker, or capture it\nfrom a microphone. Whether or not you should send or receive data from the device (or both) depends on the type of device you are initializing which can be\nplayback, capture, full-duplex or loopback. (Note that loopback mode is only supported on select backends.) Sending and receiving audio data to and from the\ndevice is done via a callback which is fired by miniaudio at periodic time intervals.\n\nThe frequency at which data is delivered to and from a device depends on the size of it's period. The size of the period can be defined in terms of PCM frames\nor milliseconds, whichever is more convenient. Generally speaking, the smaller the period, the lower the latency at the expense of higher CPU usage and\nincreased risk of glitching due to the more frequent and granular data deliver intervals. The size of a period will depend on your requirements, but\nminiaudio's defaults should work fine for most scenarios. If you're building a game you should leave this fairly small, whereas if you're building a simple\nmedia player you can make it larger. Note that the period size you request is actually just a hint - miniaudio will tell the backend what you want, but the\nbackend is ultimately responsible for what it gives you. You cannot assume you will get exactly what you ask for.\n\nWhen delivering data to and from a device you need to make sure it's in the correct format which you can set through the device configuration. You just set the\nformat that you want to use and miniaudio will perform all of the necessary conversion for you internally. When delivering data to and from the callback you\ncan assume the format is the same as what you requested when you initialized the device. See Remarks for more details on miniaudio's data conversion pipeline.\n\n\nParameters\n----------\npContext (in, optional)\n    A pointer to the context that owns the device. This can be null, in which case it creates a default context internally.\n\npConfig (in)\n    A pointer to the device configuration. Cannot be null. See remarks for details.\n\npDevice (out)\n    A pointer to the device object being initialized.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful; any other error code otherwise.\n\n\nThread Safety\n-------------\nUnsafe. It is not safe to call this function simultaneously for different devices because some backends depend on and mutate global state. The same applies to\ncalling this at the same time as `ma_device_uninit()`.\n\n\nCallback Safety\n---------------\nUnsafe. It is not safe to call this inside any callback.\n\n\nRemarks\n-------\nSetting `pContext` to NULL will result in miniaudio creating a default context internally and is equivalent to passing in a context initialized like so:\n\n    ```c\n    ma_context_init(NULL, 0, NULL, &context);\n    ```\n\nDo not set `pContext` to NULL if you are needing to open multiple devices. You can, however, use NULL when initializing the first device, and then use\ndevice.pContext for the initialization of other devices.\n\nThe device can be configured via the `pConfig` argument. The config object is initialized with `ma_device_config_init()`. Individual configuration settings can\nthen be set directly on the structure. Below are the members of the `ma_device_config` object.\n\n    deviceType\n        Must be `ma_device_type_playback`, `ma_device_type_capture`, `ma_device_type_duplex` of `ma_device_type_loopback`.\n\n    sampleRate\n        The sample rate, in hertz. The most common sample rates are 48000 and 44100. Setting this to 0 will use the device's native sample rate.\n\n    periodSizeInFrames\n        The desired size of a period in PCM frames. If this is 0, `periodSizeInMilliseconds` will be used instead. If both are 0 the default buffer size will\n        be used depending on the selected performance profile. This value affects latency. See below for details.\n\n    periodSizeInMilliseconds\n        The desired size of a period in milliseconds. If this is 0, `periodSizeInFrames` will be used instead. If both are 0 the default buffer size will be\n        used depending on the selected performance profile. The value affects latency. See below for details.\n\n    periods\n        The number of periods making up the device's entire buffer. The total buffer size is `periodSizeInFrames` or `periodSizeInMilliseconds` multiplied by\n        this value. This is just a hint as backends will be the ones who ultimately decide how your periods will be configured.\n\n    performanceProfile\n        A hint to miniaudio as to the performance requirements of your program. Can be either `ma_performance_profile_low_latency` (default) or\n        `ma_performance_profile_conservative`. This mainly affects the size of default buffers and can usually be left at it's default value.\n\n    noPreSilencedOutputBuffer\n        When set to true, the contents of the output buffer passed into the data callback will be left undefined. When set to false (default), the contents of\n        the output buffer will be cleared the zero. You can use this to avoid the overhead of zeroing out the buffer if you can guarantee that your data\n        callback will write to every sample in the output buffer, or if you are doing your own clearing.\n\n    noClip\n        When set to true, the contents of the output buffer are left alone after returning and it will be left up to the backend itself to decide whether or\n        not to clip. When set to false (default), the contents of the output buffer passed into the data callback will be clipped after returning. This only\n        applies when the playback sample format is f32.\n\n    noDisableDenormals\n        By default, miniaudio will disable denormals when the data callback is called. Setting this to true will prevent the disabling of denormals.\n\n    noFixedSizedCallback\n        Allows miniaudio to fire the data callback with any frame count. When this is set to false (the default), the data callback will be fired with a\n        consistent frame count as specified by `periodSizeInFrames` or `periodSizeInMilliseconds`. When set to true, miniaudio will fire the callback with\n        whatever the backend requests, which could be anything.\n\n    dataCallback\n        The callback to fire whenever data is ready to be delivered to or from the device.\n\n    notificationCallback\n        The callback to fire when something has changed with the device, such as whether or not it has been started or stopped.\n\n    pUserData\n        The user data pointer to use with the device. You can access this directly from the device object like `device.pUserData`.\n\n    resampling.algorithm\n        The resampling algorithm to use when miniaudio needs to perform resampling between the rate specified by `sampleRate` and the device's native rate. The\n        default value is `ma_resample_algorithm_linear`, and the quality can be configured with `resampling.linear.lpfOrder`.\n\n    resampling.pBackendVTable\n        A pointer to an optional vtable that can be used for plugging in a custom resampler.\n\n    resampling.pBackendUserData\n        A pointer that will passed to callbacks in pBackendVTable.\n\n    resampling.linear.lpfOrder\n        The linear resampler applies a low-pass filter as part of it's processing for anti-aliasing. This setting controls the order of the filter. The higher\n        the value, the better the quality, in general. Setting this to 0 will disable low-pass filtering altogether. The maximum value is\n        `MA_MAX_FILTER_ORDER`. The default value is `min(4, MA_MAX_FILTER_ORDER)`.\n\n    playback.pDeviceID\n        A pointer to a `ma_device_id` structure containing the ID of the playback device to initialize. Setting this NULL (default) will use the system's\n        default playback device. Retrieve the device ID from the `ma_device_info` structure, which can be retrieved using device enumeration.\n\n    playback.format\n        The sample format to use for playback. When set to `ma_format_unknown` the device's native format will be used. This can be retrieved after\n        initialization from the device object directly with `device.playback.format`.\n\n    playback.channels\n        The number of channels to use for playback. When set to 0 the device's native channel count will be used. This can be retrieved after initialization\n        from the device object directly with `device.playback.channels`.\n\n    playback.pChannelMap\n        The channel map to use for playback. When left empty, the device's native channel map will be used. This can be retrieved after initialization from the\n        device object direct with `device.playback.pChannelMap`. When set, the buffer should contain `channels` items.\n\n    playback.shareMode\n        The preferred share mode to use for playback. Can be either `ma_share_mode_shared` (default) or `ma_share_mode_exclusive`. Note that if you specify\n        exclusive mode, but it's not supported by the backend, initialization will fail. You can then fall back to shared mode if desired by changing this to\n        ma_share_mode_shared and reinitializing.\n\n    capture.pDeviceID\n        A pointer to a `ma_device_id` structure containing the ID of the capture device to initialize. Setting this NULL (default) will use the system's\n        default capture device. Retrieve the device ID from the `ma_device_info` structure, which can be retrieved using device enumeration.\n\n    capture.format\n        The sample format to use for capture. When set to `ma_format_unknown` the device's native format will be used. This can be retrieved after\n        initialization from the device object directly with `device.capture.format`.\n\n    capture.channels\n        The number of channels to use for capture. When set to 0 the device's native channel count will be used. This can be retrieved after initialization\n        from the device object directly with `device.capture.channels`.\n\n    capture.pChannelMap\n        The channel map to use for capture. When left empty, the device's native channel map will be used. This can be retrieved after initialization from the\n        device object direct with `device.capture.pChannelMap`. When set, the buffer should contain `channels` items.\n\n    capture.shareMode\n        The preferred share mode to use for capture. Can be either `ma_share_mode_shared` (default) or `ma_share_mode_exclusive`. Note that if you specify\n        exclusive mode, but it's not supported by the backend, initialization will fail. You can then fall back to shared mode if desired by changing this to\n        ma_share_mode_shared and reinitializing.\n\n    wasapi.noAutoConvertSRC\n        WASAPI only. When set to true, disables WASAPI's automatic resampling and forces the use of miniaudio's resampler. Defaults to false.\n\n    wasapi.noDefaultQualitySRC\n        WASAPI only. Only used when `wasapi.noAutoConvertSRC` is set to false. When set to true, disables the use of `AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY`.\n        You should usually leave this set to false, which is the default.\n\n    wasapi.noAutoStreamRouting\n        WASAPI only. When set to true, disables automatic stream routing on the WASAPI backend. Defaults to false.\n\n    wasapi.noHardwareOffloading\n        WASAPI only. When set to true, disables the use of WASAPI's hardware offloading feature. Defaults to false.\n\n    alsa.noMMap\n        ALSA only. When set to true, disables MMap mode. Defaults to false.\n\n    alsa.noAutoFormat\n        ALSA only. When set to true, disables ALSA's automatic format conversion by including the SND_PCM_NO_AUTO_FORMAT flag. Defaults to false.\n\n    alsa.noAutoChannels\n        ALSA only. When set to true, disables ALSA's automatic channel conversion by including the SND_PCM_NO_AUTO_CHANNELS flag. Defaults to false.\n\n    alsa.noAutoResample\n        ALSA only. When set to true, disables ALSA's automatic resampling by including the SND_PCM_NO_AUTO_RESAMPLE flag. Defaults to false.\n\n    pulse.pStreamNamePlayback\n        PulseAudio only. Sets the stream name for playback.\n\n    pulse.pStreamNameCapture\n        PulseAudio only. Sets the stream name for capture.\n\n    coreaudio.allowNominalSampleRateChange\n        Core Audio only. Desktop only. When enabled, allows the sample rate of the device to be changed at the operating system level. This\n        is disabled by default in order to prevent intrusive changes to the user's system. This is useful if you want to use a sample rate\n        that is known to be natively supported by the hardware thereby avoiding the cost of resampling. When set to true, miniaudio will\n        find the closest match between the sample rate requested in the device config and the sample rates natively supported by the\n        hardware. When set to false, the sample rate currently set by the operating system will always be used.\n\n    opensl.streamType\n        OpenSL only. Explicitly sets the stream type. If left unset (`ma_opensl_stream_type_default`), the\n        stream type will be left unset. Think of this as the type of audio you're playing.\n\n    opensl.recordingPreset\n        OpenSL only. Explicitly sets the type of recording your program will be doing. When left\n        unset, the recording preset will be left unchanged.\n\n    aaudio.usage\n        AAudio only. Explicitly sets the nature of the audio the program will be consuming. When\n        left unset, the usage will be left unchanged.\n\n    aaudio.contentType\n        AAudio only. Sets the content type. When left unset, the content type will be left unchanged.\n\n    aaudio.inputPreset\n        AAudio only. Explicitly sets the type of recording your program will be doing. When left\n        unset, the input preset will be left unchanged.\n\n    aaudio.noAutoStartAfterReroute\n        AAudio only. Controls whether or not the device should be automatically restarted after a\n        stream reroute. When set to false (default) the device will be restarted automatically;\n        otherwise the device will be stopped.\n\n\nOnce initialized, the device's config is immutable. If you need to change the config you will need to initialize a new device.\n\nAfter initializing the device it will be in a stopped state. To start it, use `ma_device_start()`.\n\nIf both `periodSizeInFrames` and `periodSizeInMilliseconds` are set to zero, it will default to `MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_LOW_LATENCY` or\n`MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE`, depending on whether or not `performanceProfile` is set to `ma_performance_profile_low_latency` or\n`ma_performance_profile_conservative`.\n\nIf you request exclusive mode and the backend does not support it an error will be returned. For robustness, you may want to first try initializing the device\nin exclusive mode, and then fall back to shared mode if required. Alternatively you can just request shared mode (the default if you leave it unset in the\nconfig) which is the most reliable option. Some backends do not have a practical way of choosing whether or not the device should be exclusive or not (ALSA,\nfor example) in which case it just acts as a hint. Unless you have special requirements you should try avoiding exclusive mode as it's intrusive to the user.\nStarting with Windows 10, miniaudio will use low-latency shared mode where possible which may make exclusive mode unnecessary.\n\nWhen sending or receiving data to/from a device, miniaudio will internally perform a format conversion to convert between the format specified by the config\nand the format used internally by the backend. If you pass in 0 for the sample format, channel count, sample rate _and_ channel map, data transmission will run\non an optimized pass-through fast path. You can retrieve the format, channel count and sample rate by inspecting the `playback/capture.format`,\n`playback/capture.channels` and `sampleRate` members of the device object.\n\nWhen compiling for UWP you must ensure you call this function on the main UI thread because the operating system may need to present the user with a message\nasking for permissions. Please refer to the official documentation for ActivateAudioInterfaceAsync() for more information.\n\nALSA Specific: When initializing the default device, requesting shared mode will try using the \"dmix\" device for playback and the \"dsnoop\" device for capture.\nIf these fail it will try falling back to the \"hw\" device.\n\n\nExample 1 - Simple Initialization\n---------------------------------\nThis example shows how to initialize a simple playback device using a standard configuration. If you are just needing to do simple playback from the default\nplayback device this is usually all you need.\n\n```c\nma_device_config config = ma_device_config_init(ma_device_type_playback);\nconfig.playback.format   = ma_format_f32;\nconfig.playback.channels = 2;\nconfig.sampleRate        = 48000;\nconfig.dataCallback      = ma_data_callback;\nconfig.pMyUserData       = pMyUserData;\n\nma_device device;\nma_result result = ma_device_init(NULL, &config, &device);\nif (result != MA_SUCCESS) {\n    // Error\n}\n```\n\n\nExample 2 - Advanced Initialization\n-----------------------------------\nThis example shows how you might do some more advanced initialization. In this hypothetical example we want to control the latency by setting the buffer size\nand period count. We also want to allow the user to be able to choose which device to output from which means we need a context so we can perform device\nenumeration.\n\n```c\nma_context context;\nma_result result = ma_context_init(NULL, 0, NULL, &context);\nif (result != MA_SUCCESS) {\n    // Error\n}\n\nma_device_info* pPlaybackDeviceInfos;\nma_uint32 playbackDeviceCount;\nresult = ma_context_get_devices(&context, &pPlaybackDeviceInfos, &playbackDeviceCount, NULL, NULL);\nif (result != MA_SUCCESS) {\n    // Error\n}\n\n// ... choose a device from pPlaybackDeviceInfos ...\n\nma_device_config config = ma_device_config_init(ma_device_type_playback);\nconfig.playback.pDeviceID       = pMyChosenDeviceID;    // <-- Get this from the `id` member of one of the `ma_device_info` objects returned by ma_context_get_devices().\nconfig.playback.format          = ma_format_f32;\nconfig.playback.channels        = 2;\nconfig.sampleRate               = 48000;\nconfig.dataCallback             = ma_data_callback;\nconfig.pUserData                = pMyUserData;\nconfig.periodSizeInMilliseconds = 10;\nconfig.periods                  = 3;\n\nma_device device;\nresult = ma_device_init(&context, &config, &device);\nif (result != MA_SUCCESS) {\n    // Error\n}\n```\n\n\nSee Also\n--------\nma_device_config_init()\nma_device_uninit()\nma_device_start()\nma_context_init()\nma_context_get_devices()\nma_context_enumerate_devices()\n*/\nMA_API ma_result ma_device_init(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice);\n\n/*\nInitializes a device without a context, with extra parameters for controlling the configuration of the internal self-managed context.\n\nThis is the same as `ma_device_init()`, only instead of a context being passed in, the parameters from `ma_context_init()` are passed in instead. This function\nallows you to configure the internally created context.\n\n\nParameters\n----------\nbackends (in, optional)\n    A list of backends to try initializing, in priority order. Can be NULL, in which case it uses default priority order.\n\nbackendCount (in, optional)\n    The number of items in `backend`. Ignored if `backend` is NULL.\n\npContextConfig (in, optional)\n    The context configuration.\n\npConfig (in)\n    A pointer to the device configuration. Cannot be null. See remarks for details.\n\npDevice (out)\n    A pointer to the device object being initialized.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful; any other error code otherwise.\n\n\nThread Safety\n-------------\nUnsafe. It is not safe to call this function simultaneously for different devices because some backends depend on and mutate global state. The same applies to\ncalling this at the same time as `ma_device_uninit()`.\n\n\nCallback Safety\n---------------\nUnsafe. It is not safe to call this inside any callback.\n\n\nRemarks\n-------\nYou only need to use this function if you want to configure the context differently to it's defaults. You should never use this function if you want to manage\nyour own context.\n\nSee the documentation for `ma_context_init()` for information on the different context configuration options.\n\n\nSee Also\n--------\nma_device_init()\nma_device_uninit()\nma_device_config_init()\nma_context_init()\n*/\nMA_API ma_result ma_device_init_ex(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config* pContextConfig, const ma_device_config* pConfig, ma_device* pDevice);\n\n/*\nUninitializes a device.\n\nThis will explicitly stop the device. You do not need to call `ma_device_stop()` beforehand, but it's harmless if you do.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to the device to stop.\n\n\nReturn Value\n------------\nNothing\n\n\nThread Safety\n-------------\nUnsafe. As soon as this API is called the device should be considered undefined.\n\n\nCallback Safety\n---------------\nUnsafe. It is not safe to call this inside any callback. Doing this will result in a deadlock.\n\n\nSee Also\n--------\nma_device_init()\nma_device_stop()\n*/\nMA_API void ma_device_uninit(ma_device* pDevice);\n\n\n/*\nRetrieves a pointer to the context that owns the given device.\n*/\nMA_API ma_context* ma_device_get_context(ma_device* pDevice);\n\n/*\nHelper function for retrieving the log object associated with the context that owns this device.\n*/\nMA_API ma_log* ma_device_get_log(ma_device* pDevice);\n\n\n/*\nRetrieves information about the device.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to the device whose information is being retrieved.\n\ntype (in)\n    The device type. This parameter is required for duplex devices. When retrieving device\n    information, you are doing so for an individual playback or capture device.\n\npDeviceInfo (out)\n    A pointer to the `ma_device_info` that will receive the device information.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful; any other error code otherwise.\n\n\nThread Safety\n-------------\nUnsafe. This should be considered unsafe because it may be calling into the backend which may or\nmay not be safe.\n\n\nCallback Safety\n---------------\nUnsafe. You should avoid calling this in the data callback because it may call into the backend\nwhich may or may not be safe.\n*/\nMA_API ma_result ma_device_get_info(ma_device* pDevice, ma_device_type type, ma_device_info* pDeviceInfo);\n\n\n/*\nRetrieves the name of the device.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to the device whose information is being retrieved.\n\ntype (in)\n    The device type. This parameter is required for duplex devices. When retrieving device\n    information, you are doing so for an individual playback or capture device.\n\npName (out)\n    A pointer to the buffer that will receive the name.\n\nnameCap (in)\n    The capacity of the output buffer, including space for the null terminator.\n\npLengthNotIncludingNullTerminator (out, optional)\n    A pointer to the variable that will receive the length of the name, not including the null\n    terminator.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful; any other error code otherwise.\n\n\nThread Safety\n-------------\nUnsafe. This should be considered unsafe because it may be calling into the backend which may or\nmay not be safe.\n\n\nCallback Safety\n---------------\nUnsafe. You should avoid calling this in the data callback because it may call into the backend\nwhich may or may not be safe.\n\n\nRemarks\n-------\nIf the name does not fully fit into the output buffer, it'll be truncated. You can pass in NULL to\n`pName` if you want to first get the length of the name for the purpose of memory allocation of the\noutput buffer. Allocating a buffer of size `MA_MAX_DEVICE_NAME_LENGTH + 1` should be enough for\nmost cases and will avoid the need for the inefficiency of calling this function twice.\n\nThis is implemented in terms of `ma_device_get_info()`.\n*/\nMA_API ma_result ma_device_get_name(ma_device* pDevice, ma_device_type type, char* pName, size_t nameCap, size_t* pLengthNotIncludingNullTerminator);\n\n\n/*\nStarts the device. For playback devices this begins playback. For capture devices it begins recording.\n\nUse `ma_device_stop()` to stop the device.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to the device to start.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful; any other error code otherwise.\n\n\nThread Safety\n-------------\nSafe. It's safe to call this from any thread with the exception of the callback thread.\n\n\nCallback Safety\n---------------\nUnsafe. It is not safe to call this inside any callback.\n\n\nRemarks\n-------\nFor a playback device, this will retrieve an initial chunk of audio data from the client before returning. The reason for this is to ensure there is valid\naudio data in the buffer, which needs to be done before the device begins playback.\n\nThis API waits until the backend device has been started for real by the worker thread. It also waits on a mutex for thread-safety.\n\nDo not call this in any callback.\n\n\nSee Also\n--------\nma_device_stop()\n*/\nMA_API ma_result ma_device_start(ma_device* pDevice);\n\n/*\nStops the device. For playback devices this stops playback. For capture devices it stops recording.\n\nUse `ma_device_start()` to start the device again.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to the device to stop.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful; any other error code otherwise.\n\n\nThread Safety\n-------------\nSafe. It's safe to call this from any thread with the exception of the callback thread.\n\n\nCallback Safety\n---------------\nUnsafe. It is not safe to call this inside any callback. Doing this will result in a deadlock.\n\n\nRemarks\n-------\nThis API needs to wait on the worker thread to stop the backend device properly before returning. It also waits on a mutex for thread-safety. In addition, some\nbackends need to wait for the device to finish playback/recording of the current fragment which can take some time (usually proportionate to the buffer size\nthat was specified at initialization time).\n\nBackends are required to either pause the stream in-place or drain the buffer if pausing is not possible. The reason for this is that stopping the device and\nthe resuming it with ma_device_start() (which you might do when your program loses focus) may result in a situation where those samples are never output to the\nspeakers or received from the microphone which can in turn result in de-syncs.\n\nDo not call this in any callback.\n\n\nSee Also\n--------\nma_device_start()\n*/\nMA_API ma_result ma_device_stop(ma_device* pDevice);\n\n/*\nDetermines whether or not the device is started.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to the device whose start state is being retrieved.\n\n\nReturn Value\n------------\nTrue if the device is started, false otherwise.\n\n\nThread Safety\n-------------\nSafe. If another thread calls `ma_device_start()` or `ma_device_stop()` at this same time as this function is called, there's a very small chance the return\nvalue will be out of sync.\n\n\nCallback Safety\n---------------\nSafe. This is implemented as a simple accessor.\n\n\nSee Also\n--------\nma_device_start()\nma_device_stop()\n*/\nMA_API ma_bool32 ma_device_is_started(const ma_device* pDevice);\n\n\n/*\nRetrieves the state of the device.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to the device whose state is being retrieved.\n\n\nReturn Value\n------------\nThe current state of the device. The return value will be one of the following:\n\n    +-------------------------------+------------------------------------------------------------------------------+\n    | ma_device_state_uninitialized | Will only be returned if the device is in the middle of initialization.      |\n    +-------------------------------+------------------------------------------------------------------------------+\n    | ma_device_state_stopped       | The device is stopped. The initial state of the device after initialization. |\n    +-------------------------------+------------------------------------------------------------------------------+\n    | ma_device_state_started       | The device started and requesting and/or delivering audio data.              |\n    +-------------------------------+------------------------------------------------------------------------------+\n    | ma_device_state_starting      | The device is in the process of starting.                                    |\n    +-------------------------------+------------------------------------------------------------------------------+\n    | ma_device_state_stopping      | The device is in the process of stopping.                                    |\n    +-------------------------------+------------------------------------------------------------------------------+\n\n\nThread Safety\n-------------\nSafe. This is implemented as a simple accessor. Note that if the device is started or stopped at the same time as this function is called,\nthere's a possibility the return value could be out of sync. See remarks.\n\n\nCallback Safety\n---------------\nSafe. This is implemented as a simple accessor.\n\n\nRemarks\n-------\nThe general flow of a devices state goes like this:\n\n    ```\n    ma_device_init()  -> ma_device_state_uninitialized -> ma_device_state_stopped\n    ma_device_start() -> ma_device_state_starting      -> ma_device_state_started\n    ma_device_stop()  -> ma_device_state_stopping      -> ma_device_state_stopped\n    ```\n\nWhen the state of the device is changed with `ma_device_start()` or `ma_device_stop()` at this same time as this function is called, the\nvalue returned by this function could potentially be out of sync. If this is significant to your program you need to implement your own\nsynchronization.\n*/\nMA_API ma_device_state ma_device_get_state(const ma_device* pDevice);\n\n\n/*\nPerforms post backend initialization routines for setting up internal data conversion.\n\nThis should be called whenever the backend is initialized. The only time this should be called from\noutside of miniaudio is if you're implementing a custom backend, and you would only do it if you\nare reinitializing the backend due to rerouting or reinitializing for some reason.\n\n\nParameters\n----------\npDevice [in]\n    A pointer to the device.\n\ndeviceType [in]\n    The type of the device that was just reinitialized.\n\npPlaybackDescriptor [in]\n    The descriptor of the playback device containing the internal data format and buffer sizes.\n\npPlaybackDescriptor [in]\n    The descriptor of the capture device containing the internal data format and buffer sizes.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful; any other error otherwise.\n\n\nThread Safety\n-------------\nUnsafe. This will be reinitializing internal data converters which may be in use by another thread.\n\n\nCallback Safety\n---------------\nUnsafe. This will be reinitializing internal data converters which may be in use by the callback.\n\n\nRemarks\n-------\nFor a duplex device, you can call this for only one side of the system. This is why the deviceType\nis specified as a parameter rather than deriving it from the device.\n\nYou do not need to call this manually unless you are doing a custom backend, in which case you need\nonly do it if you're manually performing rerouting or reinitialization.\n*/\nMA_API ma_result ma_device_post_init(ma_device* pDevice, ma_device_type deviceType, const ma_device_descriptor* pPlaybackDescriptor, const ma_device_descriptor* pCaptureDescriptor);\n\n\n/*\nSets the master volume factor for the device.\n\nThe volume factor must be between 0 (silence) and 1 (full volume). Use `ma_device_set_master_volume_db()` to use decibel notation, where 0 is full volume and\nvalues less than 0 decreases the volume.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to the device whose volume is being set.\n\nvolume (in)\n    The new volume factor. Must be >= 0.\n\n\nReturn Value\n------------\nMA_SUCCESS if the volume was set successfully.\nMA_INVALID_ARGS if pDevice is NULL.\nMA_INVALID_ARGS if volume is negative.\n\n\nThread Safety\n-------------\nSafe. This just sets a local member of the device object.\n\n\nCallback Safety\n---------------\nSafe. If you set the volume in the data callback, that data written to the output buffer will have the new volume applied.\n\n\nRemarks\n-------\nThis applies the volume factor across all channels.\n\nThis does not change the operating system's volume. It only affects the volume for the given `ma_device` object's audio stream.\n\n\nSee Also\n--------\nma_device_get_master_volume()\nma_device_set_master_volume_db()\nma_device_get_master_volume_db()\n*/\nMA_API ma_result ma_device_set_master_volume(ma_device* pDevice, float volume);\n\n/*\nRetrieves the master volume factor for the device.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to the device whose volume factor is being retrieved.\n\npVolume (in)\n    A pointer to the variable that will receive the volume factor. The returned value will be in the range of [0, 1].\n\n\nReturn Value\n------------\nMA_SUCCESS if successful.\nMA_INVALID_ARGS if pDevice is NULL.\nMA_INVALID_ARGS if pVolume is NULL.\n\n\nThread Safety\n-------------\nSafe. This just a simple member retrieval.\n\n\nCallback Safety\n---------------\nSafe.\n\n\nRemarks\n-------\nIf an error occurs, `*pVolume` will be set to 0.\n\n\nSee Also\n--------\nma_device_set_master_volume()\nma_device_set_master_volume_gain_db()\nma_device_get_master_volume_gain_db()\n*/\nMA_API ma_result ma_device_get_master_volume(ma_device* pDevice, float* pVolume);\n\n/*\nSets the master volume for the device as gain in decibels.\n\nA gain of 0 is full volume, whereas a gain of < 0 will decrease the volume.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to the device whose gain is being set.\n\ngainDB (in)\n    The new volume as gain in decibels. Must be less than or equal to 0, where 0 is full volume and anything less than 0 decreases the volume.\n\n\nReturn Value\n------------\nMA_SUCCESS if the volume was set successfully.\nMA_INVALID_ARGS if pDevice is NULL.\nMA_INVALID_ARGS if the gain is > 0.\n\n\nThread Safety\n-------------\nSafe. This just sets a local member of the device object.\n\n\nCallback Safety\n---------------\nSafe. If you set the volume in the data callback, that data written to the output buffer will have the new volume applied.\n\n\nRemarks\n-------\nThis applies the gain across all channels.\n\nThis does not change the operating system's volume. It only affects the volume for the given `ma_device` object's audio stream.\n\n\nSee Also\n--------\nma_device_get_master_volume_gain_db()\nma_device_set_master_volume()\nma_device_get_master_volume()\n*/\nMA_API ma_result ma_device_set_master_volume_db(ma_device* pDevice, float gainDB);\n\n/*\nRetrieves the master gain in decibels.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to the device whose gain is being retrieved.\n\npGainDB (in)\n    A pointer to the variable that will receive the gain in decibels. The returned value will be <= 0.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful.\nMA_INVALID_ARGS if pDevice is NULL.\nMA_INVALID_ARGS if pGainDB is NULL.\n\n\nThread Safety\n-------------\nSafe. This just a simple member retrieval.\n\n\nCallback Safety\n---------------\nSafe.\n\n\nRemarks\n-------\nIf an error occurs, `*pGainDB` will be set to 0.\n\n\nSee Also\n--------\nma_device_set_master_volume_db()\nma_device_set_master_volume()\nma_device_get_master_volume()\n*/\nMA_API ma_result ma_device_get_master_volume_db(ma_device* pDevice, float* pGainDB);\n\n\n/*\nCalled from the data callback of asynchronous backends to allow miniaudio to process the data and fire the miniaudio data callback.\n\n\nParameters\n----------\npDevice (in)\n    A pointer to device whose processing the data callback.\n\npOutput (out)\n    A pointer to the buffer that will receive the output PCM frame data. On a playback device this must not be NULL. On a duplex device\n    this can be NULL, in which case pInput must not be NULL.\n\npInput (in)\n    A pointer to the buffer containing input PCM frame data. On a capture device this must not be NULL. On a duplex device this can be\n    NULL, in which case `pOutput` must not be NULL.\n\nframeCount (in)\n    The number of frames being processed.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful; any other result code otherwise.\n\n\nThread Safety\n-------------\nThis function should only ever be called from the internal data callback of the backend. It is safe to call this simultaneously between a\nplayback and capture device in duplex setups.\n\n\nCallback Safety\n---------------\nDo not call this from the miniaudio data callback. It should only ever be called from the internal data callback of the backend.\n\n\nRemarks\n-------\nIf both `pOutput` and `pInput` are NULL, and error will be returned. In duplex scenarios, both `pOutput` and `pInput` can be non-NULL, in\nwhich case `pInput` will be processed first, followed by `pOutput`.\n\nIf you are implementing a custom backend, and that backend uses a callback for data delivery, you'll need to call this from inside that\ncallback.\n*/\nMA_API ma_result ma_device_handle_backend_data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount);\n\n\n/*\nCalculates an appropriate buffer size from a descriptor, native sample rate and performance profile.\n\nThis function is used by backends for helping determine an appropriately sized buffer to use with\nthe device depending on the values of `periodSizeInFrames` and `periodSizeInMilliseconds` in the\n`pDescriptor` object. Since buffer size calculations based on time depends on the sample rate, a\nbest guess at the device's native sample rate is also required which is where `nativeSampleRate`\ncomes in. In addition, the performance profile is also needed for cases where both the period size\nin frames and milliseconds are both zero.\n\n\nParameters\n----------\npDescriptor (in)\n    A pointer to device descriptor whose `periodSizeInFrames` and `periodSizeInMilliseconds` members\n    will be used for the calculation of the buffer size.\n\nnativeSampleRate (in)\n    The device's native sample rate. This is only ever used when the `periodSizeInFrames` member of\n    `pDescriptor` is zero. In this case, `periodSizeInMilliseconds` will be used instead, in which\n    case a sample rate is required to convert to a size in frames.\n\nperformanceProfile (in)\n    When both the `periodSizeInFrames` and `periodSizeInMilliseconds` members of `pDescriptor` are\n    zero, miniaudio will fall back to a buffer size based on the performance profile. The profile\n    to use for this calculation is determine by this parameter.\n\n\nReturn Value\n------------\nThe calculated buffer size in frames.\n\n\nThread Safety\n-------------\nThis is safe so long as nothing modifies `pDescriptor` at the same time. However, this function\nshould only ever be called from within the backend's device initialization routine and therefore\nshouldn't have any multithreading concerns.\n\n\nCallback Safety\n---------------\nThis is safe to call within the data callback, but there is no reason to ever do this.\n\n\nRemarks\n-------\nIf `nativeSampleRate` is zero, this function will fall back to `pDescriptor->sampleRate`. If that\nis also zero, `MA_DEFAULT_SAMPLE_RATE` will be used instead.\n*/\nMA_API ma_uint32 ma_calculate_buffer_size_in_frames_from_descriptor(const ma_device_descriptor* pDescriptor, ma_uint32 nativeSampleRate, ma_performance_profile performanceProfile);\n\n\n\n/*\nRetrieves a friendly name for a backend.\n*/\nMA_API const char* ma_get_backend_name(ma_backend backend);\n\n/*\nRetrieves the backend enum from the given name.\n*/\nMA_API ma_result ma_get_backend_from_name(const char* pBackendName, ma_backend* pBackend);\n\n/*\nDetermines whether or not the given backend is available by the compilation environment.\n*/\nMA_API ma_bool32 ma_is_backend_enabled(ma_backend backend);\n\n/*\nRetrieves compile-time enabled backends.\n\n\nParameters\n----------\npBackends (out, optional)\n    A pointer to the buffer that will receive the enabled backends. Set to NULL to retrieve the backend count. Setting\n    the capacity of the buffer to `MA_BUFFER_COUNT` will guarantee it's large enough for all backends.\n\nbackendCap (in)\n    The capacity of the `pBackends` buffer.\n\npBackendCount (out)\n    A pointer to the variable that will receive the enabled backend count.\n\n\nReturn Value\n------------\nMA_SUCCESS if successful.\nMA_INVALID_ARGS if `pBackendCount` is NULL.\nMA_NO_SPACE if the capacity of `pBackends` is not large enough.\n\nIf `MA_NO_SPACE` is returned, the `pBackends` buffer will be filled with `*pBackendCount` values.\n\n\nThread Safety\n-------------\nSafe.\n\n\nCallback Safety\n---------------\nSafe.\n\n\nRemarks\n-------\nIf you want to retrieve the number of backends so you can determine the capacity of `pBackends` buffer, you can call\nthis function with `pBackends` set to NULL.\n\nThis will also enumerate the null backend. If you don't want to include this you need to check for `ma_backend_null`\nwhen you enumerate over the returned backends and handle it appropriately. Alternatively, you can disable it at\ncompile time with `MA_NO_NULL`.\n\nThe returned backends are determined based on compile time settings, not the platform it's currently running on. For\nexample, PulseAudio will be returned if it was enabled at compile time, even when the user doesn't actually have\nPulseAudio installed.\n\n\nExample 1\n---------\nThe example below retrieves the enabled backend count using a fixed sized buffer allocated on the stack. The buffer is\ngiven a capacity of `MA_BACKEND_COUNT` which will guarantee it'll be large enough to store all available backends.\nSince `MA_BACKEND_COUNT` is always a relatively small value, this should be suitable for most scenarios.\n\n```\nma_backend enabledBackends[MA_BACKEND_COUNT];\nsize_t enabledBackendCount;\n\nresult = ma_get_enabled_backends(enabledBackends, MA_BACKEND_COUNT, &enabledBackendCount);\nif (result != MA_SUCCESS) {\n    // Failed to retrieve enabled backends. Should never happen in this example since all inputs are valid.\n}\n```\n\n\nSee Also\n--------\nma_is_backend_enabled()\n*/\nMA_API ma_result ma_get_enabled_backends(ma_backend* pBackends, size_t backendCap, size_t* pBackendCount);\n\n/*\nDetermines whether or not loopback mode is support by a backend.\n*/\nMA_API ma_bool32 ma_is_loopback_supported(ma_backend backend);\n\n#endif  /* MA_NO_DEVICE_IO */\n\n\n\n/************************************************************************************************************************************************************\n\nUtilities\n\n************************************************************************************************************************************************************/\n\n/*\nCalculates a buffer size in milliseconds from the specified number of frames and sample rate.\n*/\nMA_API ma_uint32 ma_calculate_buffer_size_in_milliseconds_from_frames(ma_uint32 bufferSizeInFrames, ma_uint32 sampleRate);\n\n/*\nCalculates a buffer size in frames from the specified number of milliseconds and sample rate.\n*/\nMA_API ma_uint32 ma_calculate_buffer_size_in_frames_from_milliseconds(ma_uint32 bufferSizeInMilliseconds, ma_uint32 sampleRate);\n\n/*\nCopies PCM frames from one buffer to another.\n*/\nMA_API void ma_copy_pcm_frames(void* dst, const void* src, ma_uint64 frameCount, ma_format format, ma_uint32 channels);\n\n/*\nCopies silent frames into the given buffer.\n\nRemarks\n-------\nFor all formats except `ma_format_u8`, the output buffer will be filled with 0. For `ma_format_u8` it will be filled with 128. The reason for this is that it\nmakes more sense for the purpose of mixing to initialize it to the center point.\n*/\nMA_API void ma_silence_pcm_frames(void* p, ma_uint64 frameCount, ma_format format, ma_uint32 channels);\n\n\n/*\nOffsets a pointer by the specified number of PCM frames.\n*/\nMA_API void* ma_offset_pcm_frames_ptr(void* p, ma_uint64 offsetInFrames, ma_format format, ma_uint32 channels);\nMA_API const void* ma_offset_pcm_frames_const_ptr(const void* p, ma_uint64 offsetInFrames, ma_format format, ma_uint32 channels);\nstatic MA_INLINE float* ma_offset_pcm_frames_ptr_f32(float* p, ma_uint64 offsetInFrames, ma_uint32 channels) { return (float*)ma_offset_pcm_frames_ptr((void*)p, offsetInFrames, ma_format_f32, channels); }\nstatic MA_INLINE const float* ma_offset_pcm_frames_const_ptr_f32(const float* p, ma_uint64 offsetInFrames, ma_uint32 channels) { return (const float*)ma_offset_pcm_frames_const_ptr((const void*)p, offsetInFrames, ma_format_f32, channels); }\n\n\n/*\nClips samples.\n*/\nMA_API void ma_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count);\nMA_API void ma_clip_samples_s16(ma_int16* pDst, const ma_int32* pSrc, ma_uint64 count);\nMA_API void ma_clip_samples_s24(ma_uint8* pDst, const ma_int64* pSrc, ma_uint64 count);\nMA_API void ma_clip_samples_s32(ma_int32* pDst, const ma_int64* pSrc, ma_uint64 count);\nMA_API void ma_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count);\nMA_API void ma_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels);\n\n/*\nHelper for applying a volume factor to samples.\n\nNote that the source and destination buffers can be the same, in which case it'll perform the operation in-place.\n*/\nMA_API void ma_copy_and_apply_volume_factor_u8(ma_uint8* pSamplesOut, const ma_uint8* pSamplesIn, ma_uint64 sampleCount, float factor);\nMA_API void ma_copy_and_apply_volume_factor_s16(ma_int16* pSamplesOut, const ma_int16* pSamplesIn, ma_uint64 sampleCount, float factor);\nMA_API void ma_copy_and_apply_volume_factor_s24(void* pSamplesOut, const void* pSamplesIn, ma_uint64 sampleCount, float factor);\nMA_API void ma_copy_and_apply_volume_factor_s32(ma_int32* pSamplesOut, const ma_int32* pSamplesIn, ma_uint64 sampleCount, float factor);\nMA_API void ma_copy_and_apply_volume_factor_f32(float* pSamplesOut, const float* pSamplesIn, ma_uint64 sampleCount, float factor);\n\nMA_API void ma_apply_volume_factor_u8(ma_uint8* pSamples, ma_uint64 sampleCount, float factor);\nMA_API void ma_apply_volume_factor_s16(ma_int16* pSamples, ma_uint64 sampleCount, float factor);\nMA_API void ma_apply_volume_factor_s24(void* pSamples, ma_uint64 sampleCount, float factor);\nMA_API void ma_apply_volume_factor_s32(ma_int32* pSamples, ma_uint64 sampleCount, float factor);\nMA_API void ma_apply_volume_factor_f32(float* pSamples, ma_uint64 sampleCount, float factor);\n\nMA_API void ma_copy_and_apply_volume_factor_pcm_frames_u8(ma_uint8* pFramesOut, const ma_uint8* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor);\nMA_API void ma_copy_and_apply_volume_factor_pcm_frames_s16(ma_int16* pFramesOut, const ma_int16* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor);\nMA_API void ma_copy_and_apply_volume_factor_pcm_frames_s24(void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor);\nMA_API void ma_copy_and_apply_volume_factor_pcm_frames_s32(ma_int32* pFramesOut, const ma_int32* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor);\nMA_API void ma_copy_and_apply_volume_factor_pcm_frames_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor);\nMA_API void ma_copy_and_apply_volume_factor_pcm_frames(void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float factor);\n\nMA_API void ma_apply_volume_factor_pcm_frames_u8(ma_uint8* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor);\nMA_API void ma_apply_volume_factor_pcm_frames_s16(ma_int16* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor);\nMA_API void ma_apply_volume_factor_pcm_frames_s24(void* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor);\nMA_API void ma_apply_volume_factor_pcm_frames_s32(ma_int32* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor);\nMA_API void ma_apply_volume_factor_pcm_frames_f32(float* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor);\nMA_API void ma_apply_volume_factor_pcm_frames(void* pFrames, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float factor);\n\nMA_API void ma_copy_and_apply_volume_factor_per_channel_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float* pChannelGains);\n\n\nMA_API void ma_copy_and_apply_volume_and_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count, float volume);\nMA_API void ma_copy_and_apply_volume_and_clip_samples_s16(ma_int16* pDst, const ma_int32* pSrc, ma_uint64 count, float volume);\nMA_API void ma_copy_and_apply_volume_and_clip_samples_s24(ma_uint8* pDst, const ma_int64* pSrc, ma_uint64 count, float volume);\nMA_API void ma_copy_and_apply_volume_and_clip_samples_s32(ma_int32* pDst, const ma_int64* pSrc, ma_uint64 count, float volume);\nMA_API void ma_copy_and_apply_volume_and_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count, float volume);\nMA_API void ma_copy_and_apply_volume_and_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float volume);\n\n\n/*\nHelper for converting a linear factor to gain in decibels.\n*/\nMA_API float ma_volume_linear_to_db(float factor);\n\n/*\nHelper for converting gain in decibels to a linear factor.\n*/\nMA_API float ma_volume_db_to_linear(float gain);\n\n\n/*\nMixes the specified number of frames in floating point format with a volume factor.\n\nThis will run on an optimized path when the volume is equal to 1.\n*/\nMA_API ma_result ma_mix_pcm_frames_f32(float* pDst, const float* pSrc, ma_uint64 frameCount, ma_uint32 channels, float volume);\n\n\n\n\n/************************************************************************************************************************************************************\n\nVFS\n===\n\nThe VFS object (virtual file system) is what's used to customize file access. This is useful in cases where stdio FILE* based APIs may not be entirely\nappropriate for a given situation.\n\n************************************************************************************************************************************************************/\ntypedef void      ma_vfs;\ntypedef ma_handle ma_vfs_file;\n\ntypedef enum\n{\n    MA_OPEN_MODE_READ  = 0x00000001,\n    MA_OPEN_MODE_WRITE = 0x00000002\n} ma_open_mode_flags;\n\ntypedef enum\n{\n    ma_seek_origin_start,\n    ma_seek_origin_current,\n    ma_seek_origin_end  /* Not used by decoders. */\n} ma_seek_origin;\n\ntypedef struct\n{\n    ma_uint64 sizeInBytes;\n} ma_file_info;\n\ntypedef struct\n{\n    ma_result (* onOpen) (ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile);\n    ma_result (* onOpenW)(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile);\n    ma_result (* onClose)(ma_vfs* pVFS, ma_vfs_file file);\n    ma_result (* onRead) (ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead);\n    ma_result (* onWrite)(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten);\n    ma_result (* onSeek) (ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin);\n    ma_result (* onTell) (ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor);\n    ma_result (* onInfo) (ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo);\n} ma_vfs_callbacks;\n\nMA_API ma_result ma_vfs_open(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile);\nMA_API ma_result ma_vfs_open_w(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile);\nMA_API ma_result ma_vfs_close(ma_vfs* pVFS, ma_vfs_file file);\nMA_API ma_result ma_vfs_read(ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead);\nMA_API ma_result ma_vfs_write(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten);\nMA_API ma_result ma_vfs_seek(ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin);\nMA_API ma_result ma_vfs_tell(ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor);\nMA_API ma_result ma_vfs_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo);\nMA_API ma_result ma_vfs_open_and_read_file(ma_vfs* pVFS, const char* pFilePath, void** ppData, size_t* pSize, const ma_allocation_callbacks* pAllocationCallbacks);\n\ntypedef struct\n{\n    ma_vfs_callbacks cb;\n    ma_allocation_callbacks allocationCallbacks;    /* Only used for the wchar_t version of open() on non-Windows platforms. */\n} ma_default_vfs;\n\nMA_API ma_result ma_default_vfs_init(ma_default_vfs* pVFS, const ma_allocation_callbacks* pAllocationCallbacks);\n\n\n\ntypedef ma_result (* ma_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead);\ntypedef ma_result (* ma_seek_proc)(void* pUserData, ma_int64 offset, ma_seek_origin origin);\ntypedef ma_result (* ma_tell_proc)(void* pUserData, ma_int64* pCursor);\n\n\n\n#if !defined(MA_NO_DECODING) || !defined(MA_NO_ENCODING)\ntypedef enum\n{\n    ma_encoding_format_unknown = 0,\n    ma_encoding_format_wav,\n    ma_encoding_format_flac,\n    ma_encoding_format_mp3,\n    ma_encoding_format_vorbis\n} ma_encoding_format;\n#endif\n\n/************************************************************************************************************************************************************\n\nDecoding\n========\n\nDecoders are independent of the main device API. Decoding APIs can be called freely inside the device's data callback, but they are not thread safe unless\nyou do your own synchronization.\n\n************************************************************************************************************************************************************/\n#ifndef MA_NO_DECODING\ntypedef struct ma_decoder ma_decoder;\n\n\ntypedef struct\n{\n    ma_format preferredFormat;\n    ma_uint32 seekPointCount;   /* Set to > 0 to generate a seektable if the decoding backend supports it. */\n} ma_decoding_backend_config;\n\nMA_API ma_decoding_backend_config ma_decoding_backend_config_init(ma_format preferredFormat, ma_uint32 seekPointCount);\n\n\ntypedef struct\n{\n    ma_result (* onInit      )(void* pUserData, ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend);\n    ma_result (* onInitFile  )(void* pUserData, const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend);               /* Optional. */\n    ma_result (* onInitFileW )(void* pUserData, const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend);            /* Optional. */\n    ma_result (* onInitMemory)(void* pUserData, const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend);  /* Optional. */\n    void      (* onUninit    )(void* pUserData, ma_data_source* pBackend, const ma_allocation_callbacks* pAllocationCallbacks);\n} ma_decoding_backend_vtable;\n\n\ntypedef ma_result (* ma_decoder_read_proc)(ma_decoder* pDecoder, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead);         /* Returns the number of bytes read. */\ntypedef ma_result (* ma_decoder_seek_proc)(ma_decoder* pDecoder, ma_int64 byteOffset, ma_seek_origin origin);\ntypedef ma_result (* ma_decoder_tell_proc)(ma_decoder* pDecoder, ma_int64* pCursor);\n\ntypedef struct\n{\n    ma_format format;      /* Set to 0 or ma_format_unknown to use the stream's internal format. */\n    ma_uint32 channels;    /* Set to 0 to use the stream's internal channels. */\n    ma_uint32 sampleRate;  /* Set to 0 to use the stream's internal sample rate. */\n    ma_channel* pChannelMap;\n    ma_channel_mix_mode channelMixMode;\n    ma_dither_mode ditherMode;\n    ma_resampler_config resampling;\n    ma_allocation_callbacks allocationCallbacks;\n    ma_encoding_format encodingFormat;\n    ma_uint32 seekPointCount;   /* When set to > 0, specifies the number of seek points to use for the generation of a seek table. Not all decoding backends support this. */\n    ma_decoding_backend_vtable** ppCustomBackendVTables;\n    ma_uint32 customBackendCount;\n    void* pCustomBackendUserData;\n} ma_decoder_config;\n\nstruct ma_decoder\n{\n    ma_data_source_base ds;\n    ma_data_source* pBackend;                   /* The decoding backend we'll be pulling data from. */\n    const ma_decoding_backend_vtable* pBackendVTable; /* The vtable for the decoding backend. This needs to be stored so we can access the onUninit() callback. */\n    void* pBackendUserData;\n    ma_decoder_read_proc onRead;\n    ma_decoder_seek_proc onSeek;\n    ma_decoder_tell_proc onTell;\n    void* pUserData;\n    ma_uint64 readPointerInPCMFrames;      /* In output sample rate. Used for keeping track of how many frames are available for decoding. */\n    ma_format outputFormat;\n    ma_uint32 outputChannels;\n    ma_uint32 outputSampleRate;\n    ma_data_converter converter;    /* Data conversion is achieved by running frames through this. */\n    void* pInputCache;              /* In input format. Can be null if it's not needed. */\n    ma_uint64 inputCacheCap;        /* The capacity of the input cache. */\n    ma_uint64 inputCacheConsumed;   /* The number of frames that have been consumed in the cache. Used for determining the next valid frame. */\n    ma_uint64 inputCacheRemaining;  /* The number of valid frames remaining in the cahce. */\n    ma_allocation_callbacks allocationCallbacks;\n    union\n    {\n        struct\n        {\n            ma_vfs* pVFS;\n            ma_vfs_file file;\n        } vfs;\n        struct\n        {\n            const ma_uint8* pData;\n            size_t dataSize;\n            size_t currentReadPos;\n        } memory;               /* Only used for decoders that were opened against a block of memory. */\n    } data;\n};\n\nMA_API ma_decoder_config ma_decoder_config_init(ma_format outputFormat, ma_uint32 outputChannels, ma_uint32 outputSampleRate);\nMA_API ma_decoder_config ma_decoder_config_init_default(void);\n\nMA_API ma_result ma_decoder_init(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nMA_API ma_result ma_decoder_init_memory(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nMA_API ma_result ma_decoder_init_vfs(ma_vfs* pVFS, const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nMA_API ma_result ma_decoder_init_vfs_w(ma_vfs* pVFS, const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nMA_API ma_result ma_decoder_init_file(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\nMA_API ma_result ma_decoder_init_file_w(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder);\n\n/*\nUninitializes a decoder.\n*/\nMA_API ma_result ma_decoder_uninit(ma_decoder* pDecoder);\n\n/*\nReads PCM frames from the given decoder.\n\nThis is not thread safe without your own synchronization.\n*/\nMA_API ma_result ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\n\n/*\nSeeks to a PCM frame based on it's absolute index.\n\nThis is not thread safe without your own synchronization.\n*/\nMA_API ma_result ma_decoder_seek_to_pcm_frame(ma_decoder* pDecoder, ma_uint64 frameIndex);\n\n/*\nRetrieves the decoder's output data format.\n*/\nMA_API ma_result ma_decoder_get_data_format(ma_decoder* pDecoder, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);\n\n/*\nRetrieves the current position of the read cursor in PCM frames.\n*/\nMA_API ma_result ma_decoder_get_cursor_in_pcm_frames(ma_decoder* pDecoder, ma_uint64* pCursor);\n\n/*\nRetrieves the length of the decoder in PCM frames.\n\nDo not call this on streams of an undefined length, such as internet radio.\n\nIf the length is unknown or an error occurs, 0 will be returned.\n\nThis will always return 0 for Vorbis decoders. This is due to a limitation with stb_vorbis in push mode which is what miniaudio\nuses internally.\n\nFor MP3's, this will decode the entire file. Do not call this in time critical scenarios.\n\nThis function is not thread safe without your own synchronization.\n*/\nMA_API ma_result ma_decoder_get_length_in_pcm_frames(ma_decoder* pDecoder, ma_uint64* pLength);\n\n/*\nRetrieves the number of frames that can be read before reaching the end.\n\nThis calls `ma_decoder_get_length_in_pcm_frames()` so you need to be aware of the rules for that function, in\nparticular ensuring you do not call it on streams of an undefined length, such as internet radio.\n\nIf the total length of the decoder cannot be retrieved, such as with Vorbis decoders, `MA_NOT_IMPLEMENTED` will be\nreturned.\n*/\nMA_API ma_result ma_decoder_get_available_frames(ma_decoder* pDecoder, ma_uint64* pAvailableFrames);\n\n/*\nHelper for opening and decoding a file into a heap allocated block of memory. Free the returned pointer with ma_free(). On input,\npConfig should be set to what you want. On output it will be set to what you got.\n*/\nMA_API ma_result ma_decode_from_vfs(ma_vfs* pVFS, const char* pFilePath, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut);\nMA_API ma_result ma_decode_file(const char* pFilePath, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut);\nMA_API ma_result ma_decode_memory(const void* pData, size_t dataSize, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut);\n\n#endif  /* MA_NO_DECODING */\n\n\n/************************************************************************************************************************************************************\n\nEncoding\n========\n\nEncoders do not perform any format conversion for you. If your target format does not support the format, and error will be returned.\n\n************************************************************************************************************************************************************/\n#ifndef MA_NO_ENCODING\ntypedef struct ma_encoder ma_encoder;\n\ntypedef ma_result (* ma_encoder_write_proc)           (ma_encoder* pEncoder, const void* pBufferIn, size_t bytesToWrite, size_t* pBytesWritten);\ntypedef ma_result (* ma_encoder_seek_proc)            (ma_encoder* pEncoder, ma_int64 offset, ma_seek_origin origin);\ntypedef ma_result (* ma_encoder_init_proc)            (ma_encoder* pEncoder);\ntypedef void      (* ma_encoder_uninit_proc)          (ma_encoder* pEncoder);\ntypedef ma_result (* ma_encoder_write_pcm_frames_proc)(ma_encoder* pEncoder, const void* pFramesIn, ma_uint64 frameCount, ma_uint64* pFramesWritten);\n\ntypedef struct\n{\n    ma_encoding_format encodingFormat;\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_allocation_callbacks allocationCallbacks;\n} ma_encoder_config;\n\nMA_API ma_encoder_config ma_encoder_config_init(ma_encoding_format encodingFormat, ma_format format, ma_uint32 channels, ma_uint32 sampleRate);\n\nstruct ma_encoder\n{\n    ma_encoder_config config;\n    ma_encoder_write_proc onWrite;\n    ma_encoder_seek_proc onSeek;\n    ma_encoder_init_proc onInit;\n    ma_encoder_uninit_proc onUninit;\n    ma_encoder_write_pcm_frames_proc onWritePCMFrames;\n    void* pUserData;\n    void* pInternalEncoder;\n    union\n    {\n        struct\n        {\n            ma_vfs* pVFS;\n            ma_vfs_file file;\n        } vfs;\n    } data;\n};\n\nMA_API ma_result ma_encoder_init(ma_encoder_write_proc onWrite, ma_encoder_seek_proc onSeek, void* pUserData, const ma_encoder_config* pConfig, ma_encoder* pEncoder);\nMA_API ma_result ma_encoder_init_vfs(ma_vfs* pVFS, const char* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder);\nMA_API ma_result ma_encoder_init_vfs_w(ma_vfs* pVFS, const wchar_t* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder);\nMA_API ma_result ma_encoder_init_file(const char* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder);\nMA_API ma_result ma_encoder_init_file_w(const wchar_t* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder);\nMA_API void ma_encoder_uninit(ma_encoder* pEncoder);\nMA_API ma_result ma_encoder_write_pcm_frames(ma_encoder* pEncoder, const void* pFramesIn, ma_uint64 frameCount, ma_uint64* pFramesWritten);\n\n#endif /* MA_NO_ENCODING */\n\n\n/************************************************************************************************************************************************************\n\nGeneration\n\n************************************************************************************************************************************************************/\n#ifndef MA_NO_GENERATION\ntypedef enum\n{\n    ma_waveform_type_sine,\n    ma_waveform_type_square,\n    ma_waveform_type_triangle,\n    ma_waveform_type_sawtooth\n} ma_waveform_type;\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_waveform_type type;\n    double amplitude;\n    double frequency;\n} ma_waveform_config;\n\nMA_API ma_waveform_config ma_waveform_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_waveform_type type, double amplitude, double frequency);\n\ntypedef struct\n{\n    ma_data_source_base ds;\n    ma_waveform_config config;\n    double advance;\n    double time;\n} ma_waveform;\n\nMA_API ma_result ma_waveform_init(const ma_waveform_config* pConfig, ma_waveform* pWaveform);\nMA_API void ma_waveform_uninit(ma_waveform* pWaveform);\nMA_API ma_result ma_waveform_read_pcm_frames(ma_waveform* pWaveform, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\nMA_API ma_result ma_waveform_seek_to_pcm_frame(ma_waveform* pWaveform, ma_uint64 frameIndex);\nMA_API ma_result ma_waveform_set_amplitude(ma_waveform* pWaveform, double amplitude);\nMA_API ma_result ma_waveform_set_frequency(ma_waveform* pWaveform, double frequency);\nMA_API ma_result ma_waveform_set_type(ma_waveform* pWaveform, ma_waveform_type type);\nMA_API ma_result ma_waveform_set_sample_rate(ma_waveform* pWaveform, ma_uint32 sampleRate);\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    double dutyCycle;\n    double amplitude;\n    double frequency;\n} ma_pulsewave_config;\n\nMA_API ma_pulsewave_config ma_pulsewave_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double dutyCycle, double amplitude, double frequency);\n\ntypedef struct\n{\n    ma_waveform waveform;\n    ma_pulsewave_config config;\n} ma_pulsewave;\n\nMA_API ma_result ma_pulsewave_init(const ma_pulsewave_config* pConfig, ma_pulsewave* pWaveform);\nMA_API void ma_pulsewave_uninit(ma_pulsewave* pWaveform);\nMA_API ma_result ma_pulsewave_read_pcm_frames(ma_pulsewave* pWaveform, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\nMA_API ma_result ma_pulsewave_seek_to_pcm_frame(ma_pulsewave* pWaveform, ma_uint64 frameIndex);\nMA_API ma_result ma_pulsewave_set_amplitude(ma_pulsewave* pWaveform, double amplitude);\nMA_API ma_result ma_pulsewave_set_frequency(ma_pulsewave* pWaveform, double frequency);\nMA_API ma_result ma_pulsewave_set_sample_rate(ma_pulsewave* pWaveform, ma_uint32 sampleRate);\nMA_API ma_result ma_pulsewave_set_duty_cycle(ma_pulsewave* pWaveform, double dutyCycle);\n\ntypedef enum\n{\n    ma_noise_type_white,\n    ma_noise_type_pink,\n    ma_noise_type_brownian\n} ma_noise_type;\n\n\ntypedef struct\n{\n    ma_format format;\n    ma_uint32 channels;\n    ma_noise_type type;\n    ma_int32 seed;\n    double amplitude;\n    ma_bool32 duplicateChannels;\n} ma_noise_config;\n\nMA_API ma_noise_config ma_noise_config_init(ma_format format, ma_uint32 channels, ma_noise_type type, ma_int32 seed, double amplitude);\n\ntypedef struct\n{\n    ma_data_source_base ds;\n    ma_noise_config config;\n    ma_lcg lcg;\n    union\n    {\n        struct\n        {\n            double** bin;\n            double* accumulation;\n            ma_uint32* counter;\n        } pink;\n        struct\n        {\n            double* accumulation;\n        } brownian;\n    } state;\n\n    /* Memory management. */\n    void* _pHeap;\n    ma_bool32 _ownsHeap;\n} ma_noise;\n\nMA_API ma_result ma_noise_get_heap_size(const ma_noise_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_noise_init_preallocated(const ma_noise_config* pConfig, void* pHeap, ma_noise* pNoise);\nMA_API ma_result ma_noise_init(const ma_noise_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_noise* pNoise);\nMA_API void ma_noise_uninit(ma_noise* pNoise, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_noise_read_pcm_frames(ma_noise* pNoise, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\nMA_API ma_result ma_noise_set_amplitude(ma_noise* pNoise, double amplitude);\nMA_API ma_result ma_noise_set_seed(ma_noise* pNoise, ma_int32 seed);\nMA_API ma_result ma_noise_set_type(ma_noise* pNoise, ma_noise_type type);\n\n#endif  /* MA_NO_GENERATION */\n\n\n\n/************************************************************************************************************************************************************\n\nResource Manager\n\n************************************************************************************************************************************************************/\n/* The resource manager cannot be enabled if there is no decoder. */\n#if !defined(MA_NO_RESOURCE_MANAGER) && defined(MA_NO_DECODING)\n#define MA_NO_RESOURCE_MANAGER\n#endif\n\n#ifndef MA_NO_RESOURCE_MANAGER\ntypedef struct ma_resource_manager                  ma_resource_manager;\ntypedef struct ma_resource_manager_data_buffer_node ma_resource_manager_data_buffer_node;\ntypedef struct ma_resource_manager_data_buffer      ma_resource_manager_data_buffer;\ntypedef struct ma_resource_manager_data_stream      ma_resource_manager_data_stream;\ntypedef struct ma_resource_manager_data_source      ma_resource_manager_data_source;\n\ntypedef enum\n{\n    MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM         = 0x00000001,   /* When set, does not load the entire data source in memory. Disk I/O will happen on job threads. */\n    MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE         = 0x00000002,   /* Decode data before storing in memory. When set, decoding is done at the resource manager level rather than the mixing thread. Results in faster mixing, but higher memory usage. */\n    MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC          = 0x00000004,   /* When set, the resource manager will load the data source asynchronously. */\n    MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT      = 0x00000008,   /* When set, waits for initialization of the underlying data source before returning from ma_resource_manager_data_source_init(). */\n    MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_UNKNOWN_LENGTH = 0x00000010    /* Gives the resource manager a hint that the length of the data source is unknown and calling `ma_data_source_get_length_in_pcm_frames()` should be avoided. */\n} ma_resource_manager_data_source_flags;\n\n\n/*\nPipeline notifications used by the resource manager. Made up of both an async notification and a fence, both of which are optional.\n*/\ntypedef struct\n{\n    ma_async_notification* pNotification;\n    ma_fence* pFence;\n} ma_resource_manager_pipeline_stage_notification;\n\ntypedef struct\n{\n    ma_resource_manager_pipeline_stage_notification init;    /* Initialization of the decoder. */\n    ma_resource_manager_pipeline_stage_notification done;    /* Decoding fully completed. */\n} ma_resource_manager_pipeline_notifications;\n\nMA_API ma_resource_manager_pipeline_notifications ma_resource_manager_pipeline_notifications_init(void);\n\n\n\n/* BEGIN BACKWARDS COMPATIBILITY */\n/* TODO: Remove this block in version 0.12. */\n#if 1\n#define ma_resource_manager_job                         ma_job\n#define ma_resource_manager_job_init                    ma_job_init\n#define MA_JOB_TYPE_RESOURCE_MANAGER_QUEUE_FLAG_NON_BLOCKING MA_JOB_QUEUE_FLAG_NON_BLOCKING\n#define ma_resource_manager_job_queue_config            ma_job_queue_config\n#define ma_resource_manager_job_queue_config_init       ma_job_queue_config_init\n#define ma_resource_manager_job_queue                   ma_job_queue\n#define ma_resource_manager_job_queue_get_heap_size     ma_job_queue_get_heap_size\n#define ma_resource_manager_job_queue_init_preallocated ma_job_queue_init_preallocated\n#define ma_resource_manager_job_queue_init              ma_job_queue_init\n#define ma_resource_manager_job_queue_uninit            ma_job_queue_uninit\n#define ma_resource_manager_job_queue_post              ma_job_queue_post\n#define ma_resource_manager_job_queue_next              ma_job_queue_next\n#endif\n/* END BACKWARDS COMPATIBILITY */\n\n\n\n\n/* Maximum job thread count will be restricted to this, but this may be removed later and replaced with a heap allocation thereby removing any limitation. */\n#ifndef MA_RESOURCE_MANAGER_MAX_JOB_THREAD_COUNT\n#define MA_RESOURCE_MANAGER_MAX_JOB_THREAD_COUNT    64\n#endif\n\ntypedef enum\n{\n    /* Indicates ma_resource_manager_next_job() should not block. Only valid when the job thread count is 0. */\n    MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING = 0x00000001,\n\n    /* Disables any kind of multithreading. Implicitly enables MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING. */\n    MA_RESOURCE_MANAGER_FLAG_NO_THREADING = 0x00000002\n} ma_resource_manager_flags;\n\ntypedef struct\n{\n    const char* pFilePath;\n    const wchar_t* pFilePathW;\n    const ma_resource_manager_pipeline_notifications* pNotifications;\n    ma_uint64 initialSeekPointInPCMFrames;\n    ma_uint64 rangeBegInPCMFrames;\n    ma_uint64 rangeEndInPCMFrames;\n    ma_uint64 loopPointBegInPCMFrames;\n    ma_uint64 loopPointEndInPCMFrames;\n    ma_bool32 isLooping;\n    ma_uint32 flags;\n} ma_resource_manager_data_source_config;\n\nMA_API ma_resource_manager_data_source_config ma_resource_manager_data_source_config_init(void);\n\n\ntypedef enum\n{\n    ma_resource_manager_data_supply_type_unknown = 0,   /* Used for determining whether or the data supply has been initialized. */\n    ma_resource_manager_data_supply_type_encoded,       /* Data supply is an encoded buffer. Connector is ma_decoder. */\n    ma_resource_manager_data_supply_type_decoded,       /* Data supply is a decoded buffer. Connector is ma_audio_buffer. */\n    ma_resource_manager_data_supply_type_decoded_paged  /* Data supply is a linked list of decoded buffers. Connector is ma_paged_audio_buffer. */\n} ma_resource_manager_data_supply_type;\n\ntypedef struct\n{\n    MA_ATOMIC(4, ma_resource_manager_data_supply_type) type;    /* Read and written from different threads so needs to be accessed atomically. */\n    union\n    {\n        struct\n        {\n            const void* pData;\n            size_t sizeInBytes;\n        } encoded;\n        struct\n        {\n            const void* pData;\n            ma_uint64 totalFrameCount;\n            ma_uint64 decodedFrameCount;\n            ma_format format;\n            ma_uint32 channels;\n            ma_uint32 sampleRate;\n        } decoded;\n        struct\n        {\n            ma_paged_audio_buffer_data data;\n            ma_uint64 decodedFrameCount;\n            ma_uint32 sampleRate;\n        } decodedPaged;\n    } backend;\n} ma_resource_manager_data_supply;\n\nstruct ma_resource_manager_data_buffer_node\n{\n    ma_uint32 hashedName32;                         /* The hashed name. This is the key. */\n    ma_uint32 refCount;\n    MA_ATOMIC(4, ma_result) result;                 /* Result from asynchronous loading. When loading set to MA_BUSY. When fully loaded set to MA_SUCCESS. When deleting set to MA_UNAVAILABLE. */\n    MA_ATOMIC(4, ma_uint32) executionCounter;       /* For allocating execution orders for jobs. */\n    MA_ATOMIC(4, ma_uint32) executionPointer;       /* For managing the order of execution for asynchronous jobs relating to this object. Incremented as jobs complete processing. */\n    ma_bool32 isDataOwnedByResourceManager;         /* Set to true when the underlying data buffer was allocated the resource manager. Set to false if it is owned by the application (via ma_resource_manager_register_*()). */\n    ma_resource_manager_data_supply data;\n    ma_resource_manager_data_buffer_node* pParent;\n    ma_resource_manager_data_buffer_node* pChildLo;\n    ma_resource_manager_data_buffer_node* pChildHi;\n};\n\nstruct ma_resource_manager_data_buffer\n{\n    ma_data_source_base ds;                         /* Base data source. A data buffer is a data source. */\n    ma_resource_manager* pResourceManager;          /* A pointer to the resource manager that owns this buffer. */\n    ma_resource_manager_data_buffer_node* pNode;    /* The data node. This is reference counted and is what supplies the data. */\n    ma_uint32 flags;                                /* The flags that were passed used to initialize the buffer. */\n    MA_ATOMIC(4, ma_uint32) executionCounter;       /* For allocating execution orders for jobs. */\n    MA_ATOMIC(4, ma_uint32) executionPointer;       /* For managing the order of execution for asynchronous jobs relating to this object. Incremented as jobs complete processing. */\n    ma_uint64 seekTargetInPCMFrames;                /* Only updated by the public API. Never written nor read from the job thread. */\n    ma_bool32 seekToCursorOnNextRead;               /* On the next read we need to seek to the frame cursor. */\n    MA_ATOMIC(4, ma_result) result;                 /* Keeps track of a result of decoding. Set to MA_BUSY while the buffer is still loading. Set to MA_SUCCESS when loading is finished successfully. Otherwise set to some other code. */\n    MA_ATOMIC(4, ma_bool32) isLooping;              /* Can be read and written by different threads at the same time. Must be used atomically. */\n    ma_atomic_bool32 isConnectorInitialized;        /* Used for asynchronous loading to ensure we don't try to initialize the connector multiple times while waiting for the node to fully load. */\n    union\n    {\n        ma_decoder decoder;                 /* Supply type is ma_resource_manager_data_supply_type_encoded */\n        ma_audio_buffer buffer;             /* Supply type is ma_resource_manager_data_supply_type_decoded */\n        ma_paged_audio_buffer pagedBuffer;  /* Supply type is ma_resource_manager_data_supply_type_decoded_paged */\n    } connector;    /* Connects this object to the node's data supply. */\n};\n\nstruct ma_resource_manager_data_stream\n{\n    ma_data_source_base ds;                     /* Base data source. A data stream is a data source. */\n    ma_resource_manager* pResourceManager;      /* A pointer to the resource manager that owns this data stream. */\n    ma_uint32 flags;                            /* The flags that were passed used to initialize the stream. */\n    ma_decoder decoder;                         /* Used for filling pages with data. This is only ever accessed by the job thread. The public API should never touch this. */\n    ma_bool32 isDecoderInitialized;             /* Required for determining whether or not the decoder should be uninitialized in MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_STREAM. */\n    ma_uint64 totalLengthInPCMFrames;           /* This is calculated when first loaded by the MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_STREAM. */\n    ma_uint32 relativeCursor;                   /* The playback cursor, relative to the current page. Only ever accessed by the public API. Never accessed by the job thread. */\n    MA_ATOMIC(8, ma_uint64) absoluteCursor;     /* The playback cursor, in absolute position starting from the start of the file. */\n    ma_uint32 currentPageIndex;                 /* Toggles between 0 and 1. Index 0 is the first half of pPageData. Index 1 is the second half. Only ever accessed by the public API. Never accessed by the job thread. */\n    MA_ATOMIC(4, ma_uint32) executionCounter;   /* For allocating execution orders for jobs. */\n    MA_ATOMIC(4, ma_uint32) executionPointer;   /* For managing the order of execution for asynchronous jobs relating to this object. Incremented as jobs complete processing. */\n\n    /* Written by the public API, read by the job thread. */\n    MA_ATOMIC(4, ma_bool32) isLooping;          /* Whether or not the stream is looping. It's important to set the looping flag at the data stream level for smooth loop transitions. */\n\n    /* Written by the job thread, read by the public API. */\n    void* pPageData;                            /* Buffer containing the decoded data of each page. Allocated once at initialization time. */\n    MA_ATOMIC(4, ma_uint32) pageFrameCount[2];  /* The number of valid PCM frames in each page. Used to determine the last valid frame. */\n\n    /* Written and read by both the public API and the job thread. These must be atomic. */\n    MA_ATOMIC(4, ma_result) result;             /* Result from asynchronous loading. When loading set to MA_BUSY. When initialized set to MA_SUCCESS. When deleting set to MA_UNAVAILABLE. If an error occurs when loading, set to an error code. */\n    MA_ATOMIC(4, ma_bool32) isDecoderAtEnd;     /* Whether or not the decoder has reached the end. */\n    MA_ATOMIC(4, ma_bool32) isPageValid[2];     /* Booleans to indicate whether or not a page is valid. Set to false by the public API, set to true by the job thread. Set to false as the pages are consumed, true when they are filled. */\n    MA_ATOMIC(4, ma_bool32) seekCounter;        /* When 0, no seeking is being performed. When > 0, a seek is being performed and reading should be delayed with MA_BUSY. */\n};\n\nstruct ma_resource_manager_data_source\n{\n    union\n    {\n        ma_resource_manager_data_buffer buffer;\n        ma_resource_manager_data_stream stream;\n    } backend;  /* Must be the first item because we need the first item to be the data source callbacks for the buffer or stream. */\n\n    ma_uint32 flags;                          /* The flags that were passed in to ma_resource_manager_data_source_init(). */\n    MA_ATOMIC(4, ma_uint32) executionCounter;     /* For allocating execution orders for jobs. */\n    MA_ATOMIC(4, ma_uint32) executionPointer;     /* For managing the order of execution for asynchronous jobs relating to this object. Incremented as jobs complete processing. */\n};\n\ntypedef struct\n{\n    ma_allocation_callbacks allocationCallbacks;\n    ma_log* pLog;\n    ma_format decodedFormat;        /* The decoded format to use. Set to ma_format_unknown (default) to use the file's native format. */\n    ma_uint32 decodedChannels;      /* The decoded channel count to use. Set to 0 (default) to use the file's native channel count. */\n    ma_uint32 decodedSampleRate;    /* the decoded sample rate to use. Set to 0 (default) to use the file's native sample rate. */\n    ma_uint32 jobThreadCount;       /* Set to 0 if you want to self-manage your job threads. Defaults to 1. */\n    size_t jobThreadStackSize;\n    ma_uint32 jobQueueCapacity;     /* The maximum number of jobs that can fit in the queue at a time. Defaults to MA_JOB_TYPE_RESOURCE_MANAGER_QUEUE_CAPACITY. Cannot be zero. */\n    ma_uint32 flags;\n    ma_vfs* pVFS;                   /* Can be NULL in which case defaults will be used. */\n    ma_decoding_backend_vtable** ppCustomDecodingBackendVTables;\n    ma_uint32 customDecodingBackendCount;\n    void* pCustomDecodingBackendUserData;\n} ma_resource_manager_config;\n\nMA_API ma_resource_manager_config ma_resource_manager_config_init(void);\n\nstruct ma_resource_manager\n{\n    ma_resource_manager_config config;\n    ma_resource_manager_data_buffer_node* pRootDataBufferNode;      /* The root buffer in the binary tree. */\n#ifndef MA_NO_THREADING\n    ma_mutex dataBufferBSTLock;                                     /* For synchronizing access to the data buffer binary tree. */\n    ma_thread jobThreads[MA_RESOURCE_MANAGER_MAX_JOB_THREAD_COUNT]; /* The threads for executing jobs. */\n#endif\n    ma_job_queue jobQueue;                                          /* Multi-consumer, multi-producer job queue for managing jobs for asynchronous decoding and streaming. */\n    ma_default_vfs defaultVFS;                                      /* Only used if a custom VFS is not specified. */\n    ma_log log;                                                     /* Only used if no log was specified in the config. */\n};\n\n/* Init. */\nMA_API ma_result ma_resource_manager_init(const ma_resource_manager_config* pConfig, ma_resource_manager* pResourceManager);\nMA_API void ma_resource_manager_uninit(ma_resource_manager* pResourceManager);\nMA_API ma_log* ma_resource_manager_get_log(ma_resource_manager* pResourceManager);\n\n/* Registration. */\nMA_API ma_result ma_resource_manager_register_file(ma_resource_manager* pResourceManager, const char* pFilePath, ma_uint32 flags);\nMA_API ma_result ma_resource_manager_register_file_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath, ma_uint32 flags);\nMA_API ma_result ma_resource_manager_register_decoded_data(ma_resource_manager* pResourceManager, const char* pName, const void* pData, ma_uint64 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate);  /* Does not copy. Increments the reference count if already exists and returns MA_SUCCESS. */\nMA_API ma_result ma_resource_manager_register_decoded_data_w(ma_resource_manager* pResourceManager, const wchar_t* pName, const void* pData, ma_uint64 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate);\nMA_API ma_result ma_resource_manager_register_encoded_data(ma_resource_manager* pResourceManager, const char* pName, const void* pData, size_t sizeInBytes);    /* Does not copy. Increments the reference count if already exists and returns MA_SUCCESS. */\nMA_API ma_result ma_resource_manager_register_encoded_data_w(ma_resource_manager* pResourceManager, const wchar_t* pName, const void* pData, size_t sizeInBytes);\nMA_API ma_result ma_resource_manager_unregister_file(ma_resource_manager* pResourceManager, const char* pFilePath);\nMA_API ma_result ma_resource_manager_unregister_file_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath);\nMA_API ma_result ma_resource_manager_unregister_data(ma_resource_manager* pResourceManager, const char* pName);\nMA_API ma_result ma_resource_manager_unregister_data_w(ma_resource_manager* pResourceManager, const wchar_t* pName);\n\n/* Data Buffers. */\nMA_API ma_result ma_resource_manager_data_buffer_init_ex(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_buffer* pDataBuffer);\nMA_API ma_result ma_resource_manager_data_buffer_init(ma_resource_manager* pResourceManager, const char* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_buffer* pDataBuffer);\nMA_API ma_result ma_resource_manager_data_buffer_init_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_buffer* pDataBuffer);\nMA_API ma_result ma_resource_manager_data_buffer_init_copy(ma_resource_manager* pResourceManager, const ma_resource_manager_data_buffer* pExistingDataBuffer, ma_resource_manager_data_buffer* pDataBuffer);\nMA_API ma_result ma_resource_manager_data_buffer_uninit(ma_resource_manager_data_buffer* pDataBuffer);\nMA_API ma_result ma_resource_manager_data_buffer_read_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\nMA_API ma_result ma_resource_manager_data_buffer_seek_to_pcm_frame(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64 frameIndex);\nMA_API ma_result ma_resource_manager_data_buffer_get_data_format(ma_resource_manager_data_buffer* pDataBuffer, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);\nMA_API ma_result ma_resource_manager_data_buffer_get_cursor_in_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pCursor);\nMA_API ma_result ma_resource_manager_data_buffer_get_length_in_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pLength);\nMA_API ma_result ma_resource_manager_data_buffer_result(const ma_resource_manager_data_buffer* pDataBuffer);\nMA_API ma_result ma_resource_manager_data_buffer_set_looping(ma_resource_manager_data_buffer* pDataBuffer, ma_bool32 isLooping);\nMA_API ma_bool32 ma_resource_manager_data_buffer_is_looping(const ma_resource_manager_data_buffer* pDataBuffer);\nMA_API ma_result ma_resource_manager_data_buffer_get_available_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pAvailableFrames);\n\n/* Data Streams. */\nMA_API ma_result ma_resource_manager_data_stream_init_ex(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_stream* pDataStream);\nMA_API ma_result ma_resource_manager_data_stream_init(ma_resource_manager* pResourceManager, const char* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_stream* pDataStream);\nMA_API ma_result ma_resource_manager_data_stream_init_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_stream* pDataStream);\nMA_API ma_result ma_resource_manager_data_stream_uninit(ma_resource_manager_data_stream* pDataStream);\nMA_API ma_result ma_resource_manager_data_stream_read_pcm_frames(ma_resource_manager_data_stream* pDataStream, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\nMA_API ma_result ma_resource_manager_data_stream_seek_to_pcm_frame(ma_resource_manager_data_stream* pDataStream, ma_uint64 frameIndex);\nMA_API ma_result ma_resource_manager_data_stream_get_data_format(ma_resource_manager_data_stream* pDataStream, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);\nMA_API ma_result ma_resource_manager_data_stream_get_cursor_in_pcm_frames(ma_resource_manager_data_stream* pDataStream, ma_uint64* pCursor);\nMA_API ma_result ma_resource_manager_data_stream_get_length_in_pcm_frames(ma_resource_manager_data_stream* pDataStream, ma_uint64* pLength);\nMA_API ma_result ma_resource_manager_data_stream_result(const ma_resource_manager_data_stream* pDataStream);\nMA_API ma_result ma_resource_manager_data_stream_set_looping(ma_resource_manager_data_stream* pDataStream, ma_bool32 isLooping);\nMA_API ma_bool32 ma_resource_manager_data_stream_is_looping(const ma_resource_manager_data_stream* pDataStream);\nMA_API ma_result ma_resource_manager_data_stream_get_available_frames(ma_resource_manager_data_stream* pDataStream, ma_uint64* pAvailableFrames);\n\n/* Data Sources. */\nMA_API ma_result ma_resource_manager_data_source_init_ex(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_source* pDataSource);\nMA_API ma_result ma_resource_manager_data_source_init(ma_resource_manager* pResourceManager, const char* pName, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_source* pDataSource);\nMA_API ma_result ma_resource_manager_data_source_init_w(ma_resource_manager* pResourceManager, const wchar_t* pName, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_source* pDataSource);\nMA_API ma_result ma_resource_manager_data_source_init_copy(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source* pExistingDataSource, ma_resource_manager_data_source* pDataSource);\nMA_API ma_result ma_resource_manager_data_source_uninit(ma_resource_manager_data_source* pDataSource);\nMA_API ma_result ma_resource_manager_data_source_read_pcm_frames(ma_resource_manager_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\nMA_API ma_result ma_resource_manager_data_source_seek_to_pcm_frame(ma_resource_manager_data_source* pDataSource, ma_uint64 frameIndex);\nMA_API ma_result ma_resource_manager_data_source_get_data_format(ma_resource_manager_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);\nMA_API ma_result ma_resource_manager_data_source_get_cursor_in_pcm_frames(ma_resource_manager_data_source* pDataSource, ma_uint64* pCursor);\nMA_API ma_result ma_resource_manager_data_source_get_length_in_pcm_frames(ma_resource_manager_data_source* pDataSource, ma_uint64* pLength);\nMA_API ma_result ma_resource_manager_data_source_result(const ma_resource_manager_data_source* pDataSource);\nMA_API ma_result ma_resource_manager_data_source_set_looping(ma_resource_manager_data_source* pDataSource, ma_bool32 isLooping);\nMA_API ma_bool32 ma_resource_manager_data_source_is_looping(const ma_resource_manager_data_source* pDataSource);\nMA_API ma_result ma_resource_manager_data_source_get_available_frames(ma_resource_manager_data_source* pDataSource, ma_uint64* pAvailableFrames);\n\n/* Job management. */\nMA_API ma_result ma_resource_manager_post_job(ma_resource_manager* pResourceManager, const ma_job* pJob);\nMA_API ma_result ma_resource_manager_post_job_quit(ma_resource_manager* pResourceManager);  /* Helper for posting a quit job. */\nMA_API ma_result ma_resource_manager_next_job(ma_resource_manager* pResourceManager, ma_job* pJob);\nMA_API ma_result ma_resource_manager_process_job(ma_resource_manager* pResourceManager, ma_job* pJob);  /* DEPRECATED. Use ma_job_process(). Will be removed in version 0.12. */\nMA_API ma_result ma_resource_manager_process_next_job(ma_resource_manager* pResourceManager);   /* Returns MA_CANCELLED if a MA_JOB_TYPE_QUIT job is found. In non-blocking mode, returns MA_NO_DATA_AVAILABLE if no jobs are available. */\n#endif  /* MA_NO_RESOURCE_MANAGER */\n\n\n\n/************************************************************************************************************************************************************\n\nNode Graph\n\n************************************************************************************************************************************************************/\n#ifndef MA_NO_NODE_GRAPH\n/* Must never exceed 254. */\n#ifndef MA_MAX_NODE_BUS_COUNT\n#define MA_MAX_NODE_BUS_COUNT       254\n#endif\n\n/* Used internally by miniaudio for memory management. Must never exceed MA_MAX_NODE_BUS_COUNT. */\n#ifndef MA_MAX_NODE_LOCAL_BUS_COUNT\n#define MA_MAX_NODE_LOCAL_BUS_COUNT 2\n#endif\n\n/* Use this when the bus count is determined by the node instance rather than the vtable. */\n#define MA_NODE_BUS_COUNT_UNKNOWN   255\n\ntypedef struct ma_node_graph ma_node_graph;\ntypedef void ma_node;\n\n\n/* Node flags. */\ntypedef enum\n{\n    MA_NODE_FLAG_PASSTHROUGH                = 0x00000001,\n    MA_NODE_FLAG_CONTINUOUS_PROCESSING      = 0x00000002,\n    MA_NODE_FLAG_ALLOW_NULL_INPUT           = 0x00000004,\n    MA_NODE_FLAG_DIFFERENT_PROCESSING_RATES = 0x00000008,\n    MA_NODE_FLAG_SILENT_OUTPUT              = 0x00000010\n} ma_node_flags;\n\n\n/* The playback state of a node. Either started or stopped. */\ntypedef enum\n{\n    ma_node_state_started = 0,\n    ma_node_state_stopped = 1\n} ma_node_state;\n\n\ntypedef struct\n{\n    /*\n    Extended processing callback. This callback is used for effects that process input and output\n    at different rates (i.e. they perform resampling). This is similar to the simple version, only\n    they take two separate frame counts: one for input, and one for output.\n\n    On input, `pFrameCountOut` is equal to the capacity of the output buffer for each bus, whereas\n    `pFrameCountIn` will be equal to the number of PCM frames in each of the buffers in `ppFramesIn`.\n\n    On output, set `pFrameCountOut` to the number of PCM frames that were actually output and set\n    `pFrameCountIn` to the number of input frames that were consumed.\n    */\n    void (* onProcess)(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut);\n\n    /*\n    A callback for retrieving the number of a input frames that are required to output the\n    specified number of output frames. You would only want to implement this when the node performs\n    resampling. This is optional, even for nodes that perform resampling, but it does offer a\n    small reduction in latency as it allows miniaudio to calculate the exact number of input frames\n    to read at a time instead of having to estimate.\n    */\n    ma_result (* onGetRequiredInputFrameCount)(ma_node* pNode, ma_uint32 outputFrameCount, ma_uint32* pInputFrameCount);\n\n    /*\n    The number of input buses. This is how many sub-buffers will be contained in the `ppFramesIn`\n    parameters of the callbacks above.\n    */\n    ma_uint8 inputBusCount;\n\n    /*\n    The number of output buses. This is how many sub-buffers will be contained in the `ppFramesOut`\n    parameters of the callbacks above.\n    */\n    ma_uint8 outputBusCount;\n\n    /*\n    Flags describing characteristics of the node. This is currently just a placeholder for some\n    ideas for later on.\n    */\n    ma_uint32 flags;\n} ma_node_vtable;\n\ntypedef struct\n{\n    const ma_node_vtable* vtable;       /* Should never be null. Initialization of the node will fail if so. */\n    ma_node_state initialState;         /* Defaults to ma_node_state_started. */\n    ma_uint32 inputBusCount;            /* Only used if the vtable specifies an input bus count of `MA_NODE_BUS_COUNT_UNKNOWN`, otherwise must be set to `MA_NODE_BUS_COUNT_UNKNOWN` (default). */\n    ma_uint32 outputBusCount;           /* Only used if the vtable specifies an output bus count of `MA_NODE_BUS_COUNT_UNKNOWN`, otherwise  be set to `MA_NODE_BUS_COUNT_UNKNOWN` (default). */\n    const ma_uint32* pInputChannels;    /* The number of elements are determined by the input bus count as determined by the vtable, or `inputBusCount` if the vtable specifies `MA_NODE_BUS_COUNT_UNKNOWN`. */\n    const ma_uint32* pOutputChannels;   /* The number of elements are determined by the output bus count as determined by the vtable, or `outputBusCount` if the vtable specifies `MA_NODE_BUS_COUNT_UNKNOWN`. */\n} ma_node_config;\n\nMA_API ma_node_config ma_node_config_init(void);\n\n\n/*\nA node has multiple output buses. An output bus is attached to an input bus as an item in a linked\nlist. Think of the input bus as a linked list, with the output bus being an item in that list.\n*/\ntypedef struct ma_node_output_bus ma_node_output_bus;\nstruct ma_node_output_bus\n{\n    /* Immutable. */\n    ma_node* pNode;                                         /* The node that owns this output bus. The input node. Will be null for dummy head and tail nodes. */\n    ma_uint8 outputBusIndex;                                /* The index of the output bus on pNode that this output bus represents. */\n    ma_uint8 channels;                                      /* The number of channels in the audio stream for this bus. */\n\n    /* Mutable via multiple threads. Must be used atomically. The weird ordering here is for packing reasons. */\n    ma_uint8 inputNodeInputBusIndex;                        /* The index of the input bus on the input. Required for detaching. Will only be used within the spinlock so does not need to be atomic. */\n    MA_ATOMIC(4, ma_uint32) flags;                          /* Some state flags for tracking the read state of the output buffer. A combination of MA_NODE_OUTPUT_BUS_FLAG_*. */\n    MA_ATOMIC(4, ma_uint32) refCount;                       /* Reference count for some thread-safety when detaching. */\n    MA_ATOMIC(4, ma_bool32) isAttached;                     /* This is used to prevent iteration of nodes that are in the middle of being detached. Used for thread safety. */\n    MA_ATOMIC(4, ma_spinlock) lock;                         /* Unfortunate lock, but significantly simplifies the implementation. Required for thread-safe attaching and detaching. */\n    MA_ATOMIC(4, float) volume;                             /* Linear. */\n    MA_ATOMIC(MA_SIZEOF_PTR, ma_node_output_bus*) pNext;    /* If null, it's the tail node or detached. */\n    MA_ATOMIC(MA_SIZEOF_PTR, ma_node_output_bus*) pPrev;    /* If null, it's the head node or detached. */\n    MA_ATOMIC(MA_SIZEOF_PTR, ma_node*) pInputNode;          /* The node that this output bus is attached to. Required for detaching. */\n};\n\n/*\nA node has multiple input buses. The output buses of a node are connecting to the input busses of\nanother. An input bus is essentially just a linked list of output buses.\n*/\ntypedef struct ma_node_input_bus ma_node_input_bus;\nstruct ma_node_input_bus\n{\n    /* Mutable via multiple threads. */\n    ma_node_output_bus head;                /* Dummy head node for simplifying some lock-free thread-safety stuff. */\n    MA_ATOMIC(4, ma_uint32) nextCounter;    /* This is used to determine whether or not the input bus is finding the next node in the list. Used for thread safety when detaching output buses. */\n    MA_ATOMIC(4, ma_spinlock) lock;         /* Unfortunate lock, but significantly simplifies the implementation. Required for thread-safe attaching and detaching. */\n\n    /* Set once at startup. */\n    ma_uint8 channels;                      /* The number of channels in the audio stream for this bus. */\n};\n\n\ntypedef struct ma_node_base ma_node_base;\nstruct ma_node_base\n{\n    /* These variables are set once at startup. */\n    ma_node_graph* pNodeGraph;              /* The graph this node belongs to. */\n    const ma_node_vtable* vtable;\n    float* pCachedData;                     /* Allocated on the heap. Fixed size. Needs to be stored on the heap because reading from output buses is done in separate function calls. */\n    ma_uint16 cachedDataCapInFramesPerBus;  /* The capacity of the input data cache in frames, per bus. */\n\n    /* These variables are read and written only from the audio thread. */\n    ma_uint16 cachedFrameCountOut;\n    ma_uint16 cachedFrameCountIn;\n    ma_uint16 consumedFrameCountIn;\n\n    /* These variables are read and written between different threads. */\n    MA_ATOMIC(4, ma_node_state) state;      /* When set to stopped, nothing will be read, regardless of the times in stateTimes. */\n    MA_ATOMIC(8, ma_uint64) stateTimes[2];  /* Indexed by ma_node_state. Specifies the time based on the global clock that a node should be considered to be in the relevant state. */\n    MA_ATOMIC(8, ma_uint64) localTime;      /* The node's local clock. This is just a running sum of the number of output frames that have been processed. Can be modified by any thread with `ma_node_set_time()`. */\n    ma_uint32 inputBusCount;\n    ma_uint32 outputBusCount;\n    ma_node_input_bus* pInputBuses;\n    ma_node_output_bus* pOutputBuses;\n\n    /* Memory management. */\n    ma_node_input_bus _inputBuses[MA_MAX_NODE_LOCAL_BUS_COUNT];\n    ma_node_output_bus _outputBuses[MA_MAX_NODE_LOCAL_BUS_COUNT];\n    void* _pHeap;   /* A heap allocation for internal use only. pInputBuses and/or pOutputBuses will point to this if the bus count exceeds MA_MAX_NODE_LOCAL_BUS_COUNT. */\n    ma_bool32 _ownsHeap;    /* If set to true, the node owns the heap allocation and _pHeap will be freed in ma_node_uninit(). */\n};\n\nMA_API ma_result ma_node_get_heap_size(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_node_init_preallocated(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, void* pHeap, ma_node* pNode);\nMA_API ma_result ma_node_init(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_node* pNode);\nMA_API void ma_node_uninit(ma_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_node_graph* ma_node_get_node_graph(const ma_node* pNode);\nMA_API ma_uint32 ma_node_get_input_bus_count(const ma_node* pNode);\nMA_API ma_uint32 ma_node_get_output_bus_count(const ma_node* pNode);\nMA_API ma_uint32 ma_node_get_input_channels(const ma_node* pNode, ma_uint32 inputBusIndex);\nMA_API ma_uint32 ma_node_get_output_channels(const ma_node* pNode, ma_uint32 outputBusIndex);\nMA_API ma_result ma_node_attach_output_bus(ma_node* pNode, ma_uint32 outputBusIndex, ma_node* pOtherNode, ma_uint32 otherNodeInputBusIndex);\nMA_API ma_result ma_node_detach_output_bus(ma_node* pNode, ma_uint32 outputBusIndex);\nMA_API ma_result ma_node_detach_all_output_buses(ma_node* pNode);\nMA_API ma_result ma_node_set_output_bus_volume(ma_node* pNode, ma_uint32 outputBusIndex, float volume);\nMA_API float ma_node_get_output_bus_volume(const ma_node* pNode, ma_uint32 outputBusIndex);\nMA_API ma_result ma_node_set_state(ma_node* pNode, ma_node_state state);\nMA_API ma_node_state ma_node_get_state(const ma_node* pNode);\nMA_API ma_result ma_node_set_state_time(ma_node* pNode, ma_node_state state, ma_uint64 globalTime);\nMA_API ma_uint64 ma_node_get_state_time(const ma_node* pNode, ma_node_state state);\nMA_API ma_node_state ma_node_get_state_by_time(const ma_node* pNode, ma_uint64 globalTime);\nMA_API ma_node_state ma_node_get_state_by_time_range(const ma_node* pNode, ma_uint64 globalTimeBeg, ma_uint64 globalTimeEnd);\nMA_API ma_uint64 ma_node_get_time(const ma_node* pNode);\nMA_API ma_result ma_node_set_time(ma_node* pNode, ma_uint64 localTime);\n\n\ntypedef struct\n{\n    ma_uint32 channels;\n    ma_uint16 nodeCacheCapInFrames;\n} ma_node_graph_config;\n\nMA_API ma_node_graph_config ma_node_graph_config_init(ma_uint32 channels);\n\n\nstruct ma_node_graph\n{\n    /* Immutable. */\n    ma_node_base base;                  /* The node graph itself is a node so it can be connected as an input to different node graph. This has zero inputs and calls ma_node_graph_read_pcm_frames() to generate it's output. */\n    ma_node_base endpoint;              /* Special node that all nodes eventually connect to. Data is read from this node in ma_node_graph_read_pcm_frames(). */\n    ma_uint16 nodeCacheCapInFrames;\n\n    /* Read and written by multiple threads. */\n    MA_ATOMIC(4, ma_bool32) isReading;\n};\n\nMA_API ma_result ma_node_graph_init(const ma_node_graph_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_node_graph* pNodeGraph);\nMA_API void ma_node_graph_uninit(ma_node_graph* pNodeGraph, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_node* ma_node_graph_get_endpoint(ma_node_graph* pNodeGraph);\nMA_API ma_result ma_node_graph_read_pcm_frames(ma_node_graph* pNodeGraph, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\nMA_API ma_uint32 ma_node_graph_get_channels(const ma_node_graph* pNodeGraph);\nMA_API ma_uint64 ma_node_graph_get_time(const ma_node_graph* pNodeGraph);\nMA_API ma_result ma_node_graph_set_time(ma_node_graph* pNodeGraph, ma_uint64 globalTime);\n\n\n\n/* Data source node. 0 input buses, 1 output bus. Used for reading from a data source. */\ntypedef struct\n{\n    ma_node_config nodeConfig;\n    ma_data_source* pDataSource;\n} ma_data_source_node_config;\n\nMA_API ma_data_source_node_config ma_data_source_node_config_init(ma_data_source* pDataSource);\n\n\ntypedef struct\n{\n    ma_node_base base;\n    ma_data_source* pDataSource;\n} ma_data_source_node;\n\nMA_API ma_result ma_data_source_node_init(ma_node_graph* pNodeGraph, const ma_data_source_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source_node* pDataSourceNode);\nMA_API void ma_data_source_node_uninit(ma_data_source_node* pDataSourceNode, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_data_source_node_set_looping(ma_data_source_node* pDataSourceNode, ma_bool32 isLooping);\nMA_API ma_bool32 ma_data_source_node_is_looping(ma_data_source_node* pDataSourceNode);\n\n\n/* Splitter Node. 1 input, many outputs. Used for splitting/copying a stream so it can be as input into two separate output nodes. */\ntypedef struct\n{\n    ma_node_config nodeConfig;\n    ma_uint32 channels;\n    ma_uint32 outputBusCount;\n} ma_splitter_node_config;\n\nMA_API ma_splitter_node_config ma_splitter_node_config_init(ma_uint32 channels);\n\n\ntypedef struct\n{\n    ma_node_base base;\n} ma_splitter_node;\n\nMA_API ma_result ma_splitter_node_init(ma_node_graph* pNodeGraph, const ma_splitter_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_splitter_node* pSplitterNode);\nMA_API void ma_splitter_node_uninit(ma_splitter_node* pSplitterNode, const ma_allocation_callbacks* pAllocationCallbacks);\n\n\n/*\nBiquad Node\n*/\ntypedef struct\n{\n    ma_node_config nodeConfig;\n    ma_biquad_config biquad;\n} ma_biquad_node_config;\n\nMA_API ma_biquad_node_config ma_biquad_node_config_init(ma_uint32 channels, float b0, float b1, float b2, float a0, float a1, float a2);\n\n\ntypedef struct\n{\n    ma_node_base baseNode;\n    ma_biquad biquad;\n} ma_biquad_node;\n\nMA_API ma_result ma_biquad_node_init(ma_node_graph* pNodeGraph, const ma_biquad_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_biquad_node* pNode);\nMA_API ma_result ma_biquad_node_reinit(const ma_biquad_config* pConfig, ma_biquad_node* pNode);\nMA_API void ma_biquad_node_uninit(ma_biquad_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks);\n\n\n/*\nLow Pass Filter Node\n*/\ntypedef struct\n{\n    ma_node_config nodeConfig;\n    ma_lpf_config lpf;\n} ma_lpf_node_config;\n\nMA_API ma_lpf_node_config ma_lpf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order);\n\n\ntypedef struct\n{\n    ma_node_base baseNode;\n    ma_lpf lpf;\n} ma_lpf_node;\n\nMA_API ma_result ma_lpf_node_init(ma_node_graph* pNodeGraph, const ma_lpf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf_node* pNode);\nMA_API ma_result ma_lpf_node_reinit(const ma_lpf_config* pConfig, ma_lpf_node* pNode);\nMA_API void ma_lpf_node_uninit(ma_lpf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks);\n\n\n/*\nHigh Pass Filter Node\n*/\ntypedef struct\n{\n    ma_node_config nodeConfig;\n    ma_hpf_config hpf;\n} ma_hpf_node_config;\n\nMA_API ma_hpf_node_config ma_hpf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order);\n\n\ntypedef struct\n{\n    ma_node_base baseNode;\n    ma_hpf hpf;\n} ma_hpf_node;\n\nMA_API ma_result ma_hpf_node_init(ma_node_graph* pNodeGraph, const ma_hpf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf_node* pNode);\nMA_API ma_result ma_hpf_node_reinit(const ma_hpf_config* pConfig, ma_hpf_node* pNode);\nMA_API void ma_hpf_node_uninit(ma_hpf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks);\n\n\n/*\nBand Pass Filter Node\n*/\ntypedef struct\n{\n    ma_node_config nodeConfig;\n    ma_bpf_config bpf;\n} ma_bpf_node_config;\n\nMA_API ma_bpf_node_config ma_bpf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order);\n\n\ntypedef struct\n{\n    ma_node_base baseNode;\n    ma_bpf bpf;\n} ma_bpf_node;\n\nMA_API ma_result ma_bpf_node_init(ma_node_graph* pNodeGraph, const ma_bpf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_bpf_node* pNode);\nMA_API ma_result ma_bpf_node_reinit(const ma_bpf_config* pConfig, ma_bpf_node* pNode);\nMA_API void ma_bpf_node_uninit(ma_bpf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks);\n\n\n/*\nNotching Filter Node\n*/\ntypedef struct\n{\n    ma_node_config nodeConfig;\n    ma_notch_config notch;\n} ma_notch_node_config;\n\nMA_API ma_notch_node_config ma_notch_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double q, double frequency);\n\n\ntypedef struct\n{\n    ma_node_base baseNode;\n    ma_notch2 notch;\n} ma_notch_node;\n\nMA_API ma_result ma_notch_node_init(ma_node_graph* pNodeGraph, const ma_notch_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_notch_node* pNode);\nMA_API ma_result ma_notch_node_reinit(const ma_notch_config* pConfig, ma_notch_node* pNode);\nMA_API void ma_notch_node_uninit(ma_notch_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks);\n\n\n/*\nPeaking Filter Node\n*/\ntypedef struct\n{\n    ma_node_config nodeConfig;\n    ma_peak_config peak;\n} ma_peak_node_config;\n\nMA_API ma_peak_node_config ma_peak_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency);\n\n\ntypedef struct\n{\n    ma_node_base baseNode;\n    ma_peak2 peak;\n} ma_peak_node;\n\nMA_API ma_result ma_peak_node_init(ma_node_graph* pNodeGraph, const ma_peak_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_peak_node* pNode);\nMA_API ma_result ma_peak_node_reinit(const ma_peak_config* pConfig, ma_peak_node* pNode);\nMA_API void ma_peak_node_uninit(ma_peak_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks);\n\n\n/*\nLow Shelf Filter Node\n*/\ntypedef struct\n{\n    ma_node_config nodeConfig;\n    ma_loshelf_config loshelf;\n} ma_loshelf_node_config;\n\nMA_API ma_loshelf_node_config ma_loshelf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency);\n\n\ntypedef struct\n{\n    ma_node_base baseNode;\n    ma_loshelf2 loshelf;\n} ma_loshelf_node;\n\nMA_API ma_result ma_loshelf_node_init(ma_node_graph* pNodeGraph, const ma_loshelf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_loshelf_node* pNode);\nMA_API ma_result ma_loshelf_node_reinit(const ma_loshelf_config* pConfig, ma_loshelf_node* pNode);\nMA_API void ma_loshelf_node_uninit(ma_loshelf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks);\n\n\n/*\nHigh Shelf Filter Node\n*/\ntypedef struct\n{\n    ma_node_config nodeConfig;\n    ma_hishelf_config hishelf;\n} ma_hishelf_node_config;\n\nMA_API ma_hishelf_node_config ma_hishelf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency);\n\n\ntypedef struct\n{\n    ma_node_base baseNode;\n    ma_hishelf2 hishelf;\n} ma_hishelf_node;\n\nMA_API ma_result ma_hishelf_node_init(ma_node_graph* pNodeGraph, const ma_hishelf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hishelf_node* pNode);\nMA_API ma_result ma_hishelf_node_reinit(const ma_hishelf_config* pConfig, ma_hishelf_node* pNode);\nMA_API void ma_hishelf_node_uninit(ma_hishelf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks);\n\n\ntypedef struct\n{\n    ma_node_config nodeConfig;\n    ma_delay_config delay;\n} ma_delay_node_config;\n\nMA_API ma_delay_node_config ma_delay_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 delayInFrames, float decay);\n\n\ntypedef struct\n{\n    ma_node_base baseNode;\n    ma_delay delay;\n} ma_delay_node;\n\nMA_API ma_result ma_delay_node_init(ma_node_graph* pNodeGraph, const ma_delay_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_delay_node* pDelayNode);\nMA_API void ma_delay_node_uninit(ma_delay_node* pDelayNode, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API void ma_delay_node_set_wet(ma_delay_node* pDelayNode, float value);\nMA_API float ma_delay_node_get_wet(const ma_delay_node* pDelayNode);\nMA_API void ma_delay_node_set_dry(ma_delay_node* pDelayNode, float value);\nMA_API float ma_delay_node_get_dry(const ma_delay_node* pDelayNode);\nMA_API void ma_delay_node_set_decay(ma_delay_node* pDelayNode, float value);\nMA_API float ma_delay_node_get_decay(const ma_delay_node* pDelayNode);\n#endif  /* MA_NO_NODE_GRAPH */\n\n\n/* SECTION: miniaudio_engine.h */\n/************************************************************************************************************************************************************\n\nEngine\n\n************************************************************************************************************************************************************/\n#if !defined(MA_NO_ENGINE) && !defined(MA_NO_NODE_GRAPH)\ntypedef struct ma_engine ma_engine;\ntypedef struct ma_sound  ma_sound;\n\n\n/* Sound flags. */\ntypedef enum\n{\n    /* Resource manager flags. */\n    MA_SOUND_FLAG_STREAM                = 0x00000001,   /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM */\n    MA_SOUND_FLAG_DECODE                = 0x00000002,   /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE */\n    MA_SOUND_FLAG_ASYNC                 = 0x00000004,   /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC */\n    MA_SOUND_FLAG_WAIT_INIT             = 0x00000008,   /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT */\n    MA_SOUND_FLAG_UNKNOWN_LENGTH        = 0x00000010,   /* MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_UNKNOWN_LENGTH */\n\n    /* ma_sound specific flags. */\n    MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT = 0x00001000,   /* Do not attach to the endpoint by default. Useful for when setting up nodes in a complex graph system. */\n    MA_SOUND_FLAG_NO_PITCH              = 0x00002000,   /* Disable pitch shifting with ma_sound_set_pitch() and ma_sound_group_set_pitch(). This is an optimization. */\n    MA_SOUND_FLAG_NO_SPATIALIZATION     = 0x00004000    /* Disable spatialization. */\n} ma_sound_flags;\n\n#ifndef MA_ENGINE_MAX_LISTENERS\n#define MA_ENGINE_MAX_LISTENERS             4\n#endif\n\n#define MA_LISTENER_INDEX_CLOSEST           ((ma_uint8)-1)\n\ntypedef enum\n{\n    ma_engine_node_type_sound,\n    ma_engine_node_type_group\n} ma_engine_node_type;\n\ntypedef struct\n{\n    ma_engine* pEngine;\n    ma_engine_node_type type;\n    ma_uint32 channelsIn;\n    ma_uint32 channelsOut;\n    ma_uint32 sampleRate;               /* Only used when the type is set to ma_engine_node_type_sound. */\n    ma_uint32 volumeSmoothTimeInPCMFrames;  /* The number of frames to smooth over volume changes. Defaults to 0 in which case no smoothing is used. */\n    ma_mono_expansion_mode monoExpansionMode;\n    ma_bool8 isPitchDisabled;           /* Pitching can be explicitly disabled with MA_SOUND_FLAG_NO_PITCH to optimize processing. */\n    ma_bool8 isSpatializationDisabled;  /* Spatialization can be explicitly disabled with MA_SOUND_FLAG_NO_SPATIALIZATION. */\n    ma_uint8 pinnedListenerIndex;       /* The index of the listener this node should always use for spatialization. If set to MA_LISTENER_INDEX_CLOSEST the engine will use the closest listener. */\n} ma_engine_node_config;\n\nMA_API ma_engine_node_config ma_engine_node_config_init(ma_engine* pEngine, ma_engine_node_type type, ma_uint32 flags);\n\n\n/* Base node object for both ma_sound and ma_sound_group. */\ntypedef struct\n{\n    ma_node_base baseNode;                              /* Must be the first member for compatiblity with the ma_node API. */\n    ma_engine* pEngine;                                 /* A pointer to the engine. Set based on the value from the config. */\n    ma_uint32 sampleRate;                               /* The sample rate of the input data. For sounds backed by a data source, this will be the data source's sample rate. Otherwise it'll be the engine's sample rate. */\n    ma_uint32 volumeSmoothTimeInPCMFrames;\n    ma_mono_expansion_mode monoExpansionMode;\n    ma_fader fader;\n    ma_linear_resampler resampler;                      /* For pitch shift. */\n    ma_spatializer spatializer;\n    ma_panner panner;\n    ma_gainer volumeGainer;                             /* This will only be used if volumeSmoothTimeInPCMFrames is > 0. */\n    ma_atomic_float volume;                             /* Defaults to 1. */\n    MA_ATOMIC(4, float) pitch;\n    float oldPitch;                                     /* For determining whether or not the resampler needs to be updated to reflect the new pitch. The resampler will be updated on the mixing thread. */\n    float oldDopplerPitch;                              /* For determining whether or not the resampler needs to be updated to take a new doppler pitch into account. */\n    MA_ATOMIC(4, ma_bool32) isPitchDisabled;            /* When set to true, pitching will be disabled which will allow the resampler to be bypassed to save some computation. */\n    MA_ATOMIC(4, ma_bool32) isSpatializationDisabled;   /* Set to false by default. When set to false, will not have spatialisation applied. */\n    MA_ATOMIC(4, ma_uint32) pinnedListenerIndex;        /* The index of the listener this node should always use for spatialization. If set to MA_LISTENER_INDEX_CLOSEST the engine will use the closest listener. */\n\n    /* When setting a fade, it's not done immediately in ma_sound_set_fade(). It's deferred to the audio thread which means we need to store the settings here. */\n    struct\n    {\n        ma_atomic_float volumeBeg;\n        ma_atomic_float volumeEnd;\n        ma_atomic_uint64 fadeLengthInFrames;            /* <-- Defaults to (~(ma_uint64)0) which is used to indicate that no fade should be applied. */\n        ma_atomic_uint64 absoluteGlobalTimeInFrames;    /* <-- The time to start the fade. */\n    } fadeSettings;\n\n    /* Memory management. */\n    ma_bool8 _ownsHeap;\n    void* _pHeap;\n} ma_engine_node;\n\nMA_API ma_result ma_engine_node_get_heap_size(const ma_engine_node_config* pConfig, size_t* pHeapSizeInBytes);\nMA_API ma_result ma_engine_node_init_preallocated(const ma_engine_node_config* pConfig, void* pHeap, ma_engine_node* pEngineNode);\nMA_API ma_result ma_engine_node_init(const ma_engine_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_engine_node* pEngineNode);\nMA_API void ma_engine_node_uninit(ma_engine_node* pEngineNode, const ma_allocation_callbacks* pAllocationCallbacks);\n\n\n#define MA_SOUND_SOURCE_CHANNEL_COUNT   0xFFFFFFFF\n\n/* Callback for when a sound reaches the end. */\ntypedef void (* ma_sound_end_proc)(void* pUserData, ma_sound* pSound);\n\ntypedef struct\n{\n    const char* pFilePath;                      /* Set this to load from the resource manager. */\n    const wchar_t* pFilePathW;                  /* Set this to load from the resource manager. */\n    ma_data_source* pDataSource;                /* Set this to load from an existing data source. */\n    ma_node* pInitialAttachment;                /* If set, the sound will be attached to an input of this node. This can be set to a ma_sound. If set to NULL, the sound will be attached directly to the endpoint unless MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT is set in `flags`. */\n    ma_uint32 initialAttachmentInputBusIndex;   /* The index of the input bus of pInitialAttachment to attach the sound to. */\n    ma_uint32 channelsIn;                       /* Ignored if using a data source as input (the data source's channel count will be used always). Otherwise, setting to 0 will cause the engine's channel count to be used. */\n    ma_uint32 channelsOut;                      /* Set this to 0 (default) to use the engine's channel count. Set to MA_SOUND_SOURCE_CHANNEL_COUNT to use the data source's channel count (only used if using a data source as input). */\n    ma_mono_expansion_mode monoExpansionMode;   /* Controls how the mono channel should be expanded to other channels when spatialization is disabled on a sound. */\n    ma_uint32 flags;                            /* A combination of MA_SOUND_FLAG_* flags. */\n    ma_uint32 volumeSmoothTimeInPCMFrames;      /* The number of frames to smooth over volume changes. Defaults to 0 in which case no smoothing is used. */\n    ma_uint64 initialSeekPointInPCMFrames;      /* Initializes the sound such that it's seeked to this location by default. */\n    ma_uint64 rangeBegInPCMFrames;\n    ma_uint64 rangeEndInPCMFrames;\n    ma_uint64 loopPointBegInPCMFrames;\n    ma_uint64 loopPointEndInPCMFrames;\n    ma_bool32 isLooping;\n    ma_sound_end_proc endCallback;              /* Fired when the sound reaches the end. Will be fired from the audio thread. Do not restart, uninitialize or otherwise change the state of the sound from here. Instead fire an event or set a variable to indicate to a different thread to change the start of the sound. Will not be fired in response to a scheduled stop with ma_sound_set_stop_time_*(). */\n    void* pEndCallbackUserData;\n#ifndef MA_NO_RESOURCE_MANAGER\n    ma_resource_manager_pipeline_notifications initNotifications;\n#endif\n    ma_fence* pDoneFence;                       /* Deprecated. Use initNotifications instead. Released when the resource manager has finished decoding the entire sound. Not used with streams. */\n} ma_sound_config;\n\nMA_API ma_sound_config ma_sound_config_init(void);                  /* Deprecated. Will be removed in version 0.12. Use ma_sound_config_2() instead. */\nMA_API ma_sound_config ma_sound_config_init_2(ma_engine* pEngine);  /* Will be renamed to ma_sound_config_init() in version 0.12. */\n\nstruct ma_sound\n{\n    ma_engine_node engineNode;          /* Must be the first member for compatibility with the ma_node API. */\n    ma_data_source* pDataSource;\n    MA_ATOMIC(8, ma_uint64) seekTarget; /* The PCM frame index to seek to in the mixing thread. Set to (~(ma_uint64)0) to not perform any seeking. */\n    MA_ATOMIC(4, ma_bool32) atEnd;\n    ma_sound_end_proc endCallback;\n    void* pEndCallbackUserData;\n    ma_bool8 ownsDataSource;\n\n    /*\n    We're declaring a resource manager data source object here to save us a malloc when loading a\n    sound via the resource manager, which I *think* will be the most common scenario.\n    */\n#ifndef MA_NO_RESOURCE_MANAGER\n    ma_resource_manager_data_source* pResourceManagerDataSource;\n#endif\n};\n\n/* Structure specifically for sounds played with ma_engine_play_sound(). Making this a separate structure to reduce overhead. */\ntypedef struct ma_sound_inlined ma_sound_inlined;\nstruct ma_sound_inlined\n{\n    ma_sound sound;\n    ma_sound_inlined* pNext;\n    ma_sound_inlined* pPrev;\n};\n\n/* A sound group is just a sound. */\ntypedef ma_sound_config ma_sound_group_config;\ntypedef ma_sound        ma_sound_group;\n\nMA_API ma_sound_group_config ma_sound_group_config_init(void);                  /* Deprecated. Will be removed in version 0.12. Use ma_sound_config_2() instead. */\nMA_API ma_sound_group_config ma_sound_group_config_init_2(ma_engine* pEngine);  /* Will be renamed to ma_sound_config_init() in version 0.12. */\n\ntypedef void (* ma_engine_process_proc)(void* pUserData, float* pFramesOut, ma_uint64 frameCount);\n\ntypedef struct\n{\n#if !defined(MA_NO_RESOURCE_MANAGER)\n    ma_resource_manager* pResourceManager;          /* Can be null in which case a resource manager will be created for you. */\n#endif\n#if !defined(MA_NO_DEVICE_IO)\n    ma_context* pContext;\n    ma_device* pDevice;                             /* If set, the caller is responsible for calling ma_engine_data_callback() in the device's data callback. */\n    ma_device_id* pPlaybackDeviceID;                /* The ID of the playback device to use with the default listener. */\n    ma_device_data_proc dataCallback;               /* Can be null. Can be used to provide a custom device data callback. */\n    ma_device_notification_proc notificationCallback;\n#endif\n    ma_log* pLog;                                   /* When set to NULL, will use the context's log. */\n    ma_uint32 listenerCount;                        /* Must be between 1 and MA_ENGINE_MAX_LISTENERS. */\n    ma_uint32 channels;                             /* The number of channels to use when mixing and spatializing. When set to 0, will use the native channel count of the device. */\n    ma_uint32 sampleRate;                           /* The sample rate. When set to 0 will use the native channel count of the device. */\n    ma_uint32 periodSizeInFrames;                   /* If set to something other than 0, updates will always be exactly this size. The underlying device may be a different size, but from the perspective of the mixer that won't matter.*/\n    ma_uint32 periodSizeInMilliseconds;             /* Used if periodSizeInFrames is unset. */\n    ma_uint32 gainSmoothTimeInFrames;               /* The number of frames to interpolate the gain of spatialized sounds across. If set to 0, will use gainSmoothTimeInMilliseconds. */\n    ma_uint32 gainSmoothTimeInMilliseconds;         /* When set to 0, gainSmoothTimeInFrames will be used. If both are set to 0, a default value will be used. */\n    ma_uint32 defaultVolumeSmoothTimeInPCMFrames;   /* Defaults to 0. Controls the default amount of smoothing to apply to volume changes to sounds. High values means more smoothing at the expense of high latency (will take longer to reach the new volume). */\n    ma_allocation_callbacks allocationCallbacks;\n    ma_bool32 noAutoStart;                          /* When set to true, requires an explicit call to ma_engine_start(). This is false by default, meaning the engine will be started automatically in ma_engine_init(). */\n    ma_bool32 noDevice;                             /* When set to true, don't create a default device. ma_engine_read_pcm_frames() can be called manually to read data. */\n    ma_mono_expansion_mode monoExpansionMode;       /* Controls how the mono channel should be expanded to other channels when spatialization is disabled on a sound. */\n    ma_vfs* pResourceManagerVFS;                    /* A pointer to a pre-allocated VFS object to use with the resource manager. This is ignored if pResourceManager is not NULL. */\n    ma_engine_process_proc onProcess;               /* Fired at the end of each call to ma_engine_read_pcm_frames(). For engine's that manage their own internal device (the default configuration), this will be fired from the audio thread, and you do not need to call ma_engine_read_pcm_frames() manually in order to trigger this. */\n    void* pProcessUserData;                         /* User data that's passed into onProcess. */\n} ma_engine_config;\n\nMA_API ma_engine_config ma_engine_config_init(void);\n\n\nstruct ma_engine\n{\n    ma_node_graph nodeGraph;                /* An engine is a node graph. It should be able to be plugged into any ma_node_graph API (with a cast) which means this must be the first member of this struct. */\n#if !defined(MA_NO_RESOURCE_MANAGER)\n    ma_resource_manager* pResourceManager;\n#endif\n#if !defined(MA_NO_DEVICE_IO)\n    ma_device* pDevice;                     /* Optionally set via the config, otherwise allocated by the engine in ma_engine_init(). */\n#endif\n    ma_log* pLog;\n    ma_uint32 sampleRate;\n    ma_uint32 listenerCount;\n    ma_spatializer_listener listeners[MA_ENGINE_MAX_LISTENERS];\n    ma_allocation_callbacks allocationCallbacks;\n    ma_bool8 ownsResourceManager;\n    ma_bool8 ownsDevice;\n    ma_spinlock inlinedSoundLock;               /* For synchronizing access so the inlined sound list. */\n    ma_sound_inlined* pInlinedSoundHead;        /* The first inlined sound. Inlined sounds are tracked in a linked list. */\n    MA_ATOMIC(4, ma_uint32) inlinedSoundCount;  /* The total number of allocated inlined sound objects. Used for debugging. */\n    ma_uint32 gainSmoothTimeInFrames;           /* The number of frames to interpolate the gain of spatialized sounds across. */\n    ma_uint32 defaultVolumeSmoothTimeInPCMFrames;\n    ma_mono_expansion_mode monoExpansionMode;\n    ma_engine_process_proc onProcess;\n    void* pProcessUserData;\n};\n\nMA_API ma_result ma_engine_init(const ma_engine_config* pConfig, ma_engine* pEngine);\nMA_API void ma_engine_uninit(ma_engine* pEngine);\nMA_API ma_result ma_engine_read_pcm_frames(ma_engine* pEngine, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\nMA_API ma_node_graph* ma_engine_get_node_graph(ma_engine* pEngine);\n#if !defined(MA_NO_RESOURCE_MANAGER)\nMA_API ma_resource_manager* ma_engine_get_resource_manager(ma_engine* pEngine);\n#endif\nMA_API ma_device* ma_engine_get_device(ma_engine* pEngine);\nMA_API ma_log* ma_engine_get_log(ma_engine* pEngine);\nMA_API ma_node* ma_engine_get_endpoint(ma_engine* pEngine);\nMA_API ma_uint64 ma_engine_get_time_in_pcm_frames(const ma_engine* pEngine);\nMA_API ma_uint64 ma_engine_get_time_in_milliseconds(const ma_engine* pEngine);\nMA_API ma_result ma_engine_set_time_in_pcm_frames(ma_engine* pEngine, ma_uint64 globalTime);\nMA_API ma_result ma_engine_set_time_in_milliseconds(ma_engine* pEngine, ma_uint64 globalTime);\nMA_API ma_uint64 ma_engine_get_time(const ma_engine* pEngine);                  /* Deprecated. Use ma_engine_get_time_in_pcm_frames(). Will be removed in version 0.12. */\nMA_API ma_result ma_engine_set_time(ma_engine* pEngine, ma_uint64 globalTime);  /* Deprecated. Use ma_engine_set_time_in_pcm_frames(). Will be removed in version 0.12. */\nMA_API ma_uint32 ma_engine_get_channels(const ma_engine* pEngine);\nMA_API ma_uint32 ma_engine_get_sample_rate(const ma_engine* pEngine);\n\nMA_API ma_result ma_engine_start(ma_engine* pEngine);\nMA_API ma_result ma_engine_stop(ma_engine* pEngine);\nMA_API ma_result ma_engine_set_volume(ma_engine* pEngine, float volume);\nMA_API float ma_engine_get_volume(ma_engine* pEngine);\nMA_API ma_result ma_engine_set_gain_db(ma_engine* pEngine, float gainDB);\nMA_API float ma_engine_get_gain_db(ma_engine* pEngine);\n\nMA_API ma_uint32 ma_engine_get_listener_count(const ma_engine* pEngine);\nMA_API ma_uint32 ma_engine_find_closest_listener(const ma_engine* pEngine, float absolutePosX, float absolutePosY, float absolutePosZ);\nMA_API void ma_engine_listener_set_position(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z);\nMA_API ma_vec3f ma_engine_listener_get_position(const ma_engine* pEngine, ma_uint32 listenerIndex);\nMA_API void ma_engine_listener_set_direction(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z);\nMA_API ma_vec3f ma_engine_listener_get_direction(const ma_engine* pEngine, ma_uint32 listenerIndex);\nMA_API void ma_engine_listener_set_velocity(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z);\nMA_API ma_vec3f ma_engine_listener_get_velocity(const ma_engine* pEngine, ma_uint32 listenerIndex);\nMA_API void ma_engine_listener_set_cone(ma_engine* pEngine, ma_uint32 listenerIndex, float innerAngleInRadians, float outerAngleInRadians, float outerGain);\nMA_API void ma_engine_listener_get_cone(const ma_engine* pEngine, ma_uint32 listenerIndex, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain);\nMA_API void ma_engine_listener_set_world_up(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z);\nMA_API ma_vec3f ma_engine_listener_get_world_up(const ma_engine* pEngine, ma_uint32 listenerIndex);\nMA_API void ma_engine_listener_set_enabled(ma_engine* pEngine, ma_uint32 listenerIndex, ma_bool32 isEnabled);\nMA_API ma_bool32 ma_engine_listener_is_enabled(const ma_engine* pEngine, ma_uint32 listenerIndex);\n\n#ifndef MA_NO_RESOURCE_MANAGER\nMA_API ma_result ma_engine_play_sound_ex(ma_engine* pEngine, const char* pFilePath, ma_node* pNode, ma_uint32 nodeInputBusIndex);\nMA_API ma_result ma_engine_play_sound(ma_engine* pEngine, const char* pFilePath, ma_sound_group* pGroup);   /* Fire and forget. */\n#endif\n\n#ifndef MA_NO_RESOURCE_MANAGER\nMA_API ma_result ma_sound_init_from_file(ma_engine* pEngine, const char* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, ma_fence* pDoneFence, ma_sound* pSound);\nMA_API ma_result ma_sound_init_from_file_w(ma_engine* pEngine, const wchar_t* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, ma_fence* pDoneFence, ma_sound* pSound);\nMA_API ma_result ma_sound_init_copy(ma_engine* pEngine, const ma_sound* pExistingSound, ma_uint32 flags, ma_sound_group* pGroup, ma_sound* pSound);\n#endif\nMA_API ma_result ma_sound_init_from_data_source(ma_engine* pEngine, ma_data_source* pDataSource, ma_uint32 flags, ma_sound_group* pGroup, ma_sound* pSound);\nMA_API ma_result ma_sound_init_ex(ma_engine* pEngine, const ma_sound_config* pConfig, ma_sound* pSound);\nMA_API void ma_sound_uninit(ma_sound* pSound);\nMA_API ma_engine* ma_sound_get_engine(const ma_sound* pSound);\nMA_API ma_data_source* ma_sound_get_data_source(const ma_sound* pSound);\nMA_API ma_result ma_sound_start(ma_sound* pSound);\nMA_API ma_result ma_sound_stop(ma_sound* pSound);\nMA_API ma_result ma_sound_stop_with_fade_in_pcm_frames(ma_sound* pSound, ma_uint64 fadeLengthInFrames);     /* Will overwrite any scheduled stop and fade. */\nMA_API ma_result ma_sound_stop_with_fade_in_milliseconds(ma_sound* pSound, ma_uint64 fadeLengthInFrames);   /* Will overwrite any scheduled stop and fade. */\nMA_API void ma_sound_set_volume(ma_sound* pSound, float volume);\nMA_API float ma_sound_get_volume(const ma_sound* pSound);\nMA_API void ma_sound_set_pan(ma_sound* pSound, float pan);\nMA_API float ma_sound_get_pan(const ma_sound* pSound);\nMA_API void ma_sound_set_pan_mode(ma_sound* pSound, ma_pan_mode panMode);\nMA_API ma_pan_mode ma_sound_get_pan_mode(const ma_sound* pSound);\nMA_API void ma_sound_set_pitch(ma_sound* pSound, float pitch);\nMA_API float ma_sound_get_pitch(const ma_sound* pSound);\nMA_API void ma_sound_set_spatialization_enabled(ma_sound* pSound, ma_bool32 enabled);\nMA_API ma_bool32 ma_sound_is_spatialization_enabled(const ma_sound* pSound);\nMA_API void ma_sound_set_pinned_listener_index(ma_sound* pSound, ma_uint32 listenerIndex);\nMA_API ma_uint32 ma_sound_get_pinned_listener_index(const ma_sound* pSound);\nMA_API ma_uint32 ma_sound_get_listener_index(const ma_sound* pSound);\nMA_API ma_vec3f ma_sound_get_direction_to_listener(const ma_sound* pSound);\nMA_API void ma_sound_set_position(ma_sound* pSound, float x, float y, float z);\nMA_API ma_vec3f ma_sound_get_position(const ma_sound* pSound);\nMA_API void ma_sound_set_direction(ma_sound* pSound, float x, float y, float z);\nMA_API ma_vec3f ma_sound_get_direction(const ma_sound* pSound);\nMA_API void ma_sound_set_velocity(ma_sound* pSound, float x, float y, float z);\nMA_API ma_vec3f ma_sound_get_velocity(const ma_sound* pSound);\nMA_API void ma_sound_set_attenuation_model(ma_sound* pSound, ma_attenuation_model attenuationModel);\nMA_API ma_attenuation_model ma_sound_get_attenuation_model(const ma_sound* pSound);\nMA_API void ma_sound_set_positioning(ma_sound* pSound, ma_positioning positioning);\nMA_API ma_positioning ma_sound_get_positioning(const ma_sound* pSound);\nMA_API void ma_sound_set_rolloff(ma_sound* pSound, float rolloff);\nMA_API float ma_sound_get_rolloff(const ma_sound* pSound);\nMA_API void ma_sound_set_min_gain(ma_sound* pSound, float minGain);\nMA_API float ma_sound_get_min_gain(const ma_sound* pSound);\nMA_API void ma_sound_set_max_gain(ma_sound* pSound, float maxGain);\nMA_API float ma_sound_get_max_gain(const ma_sound* pSound);\nMA_API void ma_sound_set_min_distance(ma_sound* pSound, float minDistance);\nMA_API float ma_sound_get_min_distance(const ma_sound* pSound);\nMA_API void ma_sound_set_max_distance(ma_sound* pSound, float maxDistance);\nMA_API float ma_sound_get_max_distance(const ma_sound* pSound);\nMA_API void ma_sound_set_cone(ma_sound* pSound, float innerAngleInRadians, float outerAngleInRadians, float outerGain);\nMA_API void ma_sound_get_cone(const ma_sound* pSound, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain);\nMA_API void ma_sound_set_doppler_factor(ma_sound* pSound, float dopplerFactor);\nMA_API float ma_sound_get_doppler_factor(const ma_sound* pSound);\nMA_API void ma_sound_set_directional_attenuation_factor(ma_sound* pSound, float directionalAttenuationFactor);\nMA_API float ma_sound_get_directional_attenuation_factor(const ma_sound* pSound);\nMA_API void ma_sound_set_fade_in_pcm_frames(ma_sound* pSound, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInFrames);\nMA_API void ma_sound_set_fade_in_milliseconds(ma_sound* pSound, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInMilliseconds);\nMA_API void ma_sound_set_fade_start_in_pcm_frames(ma_sound* pSound, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInFrames, ma_uint64 absoluteGlobalTimeInFrames);\nMA_API void ma_sound_set_fade_start_in_milliseconds(ma_sound* pSound, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInMilliseconds, ma_uint64 absoluteGlobalTimeInMilliseconds);\nMA_API float ma_sound_get_current_fade_volume(const ma_sound* pSound);\nMA_API void ma_sound_set_start_time_in_pcm_frames(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInFrames);\nMA_API void ma_sound_set_start_time_in_milliseconds(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInMilliseconds);\nMA_API void ma_sound_set_stop_time_in_pcm_frames(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInFrames);\nMA_API void ma_sound_set_stop_time_in_milliseconds(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInMilliseconds);\nMA_API void ma_sound_set_stop_time_with_fade_in_pcm_frames(ma_sound* pSound, ma_uint64 stopAbsoluteGlobalTimeInFrames, ma_uint64 fadeLengthInFrames);\nMA_API void ma_sound_set_stop_time_with_fade_in_milliseconds(ma_sound* pSound, ma_uint64 stopAbsoluteGlobalTimeInMilliseconds, ma_uint64 fadeLengthInMilliseconds);\nMA_API ma_bool32 ma_sound_is_playing(const ma_sound* pSound);\nMA_API ma_uint64 ma_sound_get_time_in_pcm_frames(const ma_sound* pSound);\nMA_API ma_uint64 ma_sound_get_time_in_milliseconds(const ma_sound* pSound);\nMA_API void ma_sound_set_looping(ma_sound* pSound, ma_bool32 isLooping);\nMA_API ma_bool32 ma_sound_is_looping(const ma_sound* pSound);\nMA_API ma_bool32 ma_sound_at_end(const ma_sound* pSound);\nMA_API ma_result ma_sound_seek_to_pcm_frame(ma_sound* pSound, ma_uint64 frameIndex); /* Just a wrapper around ma_data_source_seek_to_pcm_frame(). */\nMA_API ma_result ma_sound_get_data_format(ma_sound* pSound, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);\nMA_API ma_result ma_sound_get_cursor_in_pcm_frames(ma_sound* pSound, ma_uint64* pCursor);\nMA_API ma_result ma_sound_get_length_in_pcm_frames(ma_sound* pSound, ma_uint64* pLength);\nMA_API ma_result ma_sound_get_cursor_in_seconds(ma_sound* pSound, float* pCursor);\nMA_API ma_result ma_sound_get_length_in_seconds(ma_sound* pSound, float* pLength);\nMA_API ma_result ma_sound_set_end_callback(ma_sound* pSound, ma_sound_end_proc callback, void* pUserData);\n\nMA_API ma_result ma_sound_group_init(ma_engine* pEngine, ma_uint32 flags, ma_sound_group* pParentGroup, ma_sound_group* pGroup);\nMA_API ma_result ma_sound_group_init_ex(ma_engine* pEngine, const ma_sound_group_config* pConfig, ma_sound_group* pGroup);\nMA_API void ma_sound_group_uninit(ma_sound_group* pGroup);\nMA_API ma_engine* ma_sound_group_get_engine(const ma_sound_group* pGroup);\nMA_API ma_result ma_sound_group_start(ma_sound_group* pGroup);\nMA_API ma_result ma_sound_group_stop(ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_volume(ma_sound_group* pGroup, float volume);\nMA_API float ma_sound_group_get_volume(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_pan(ma_sound_group* pGroup, float pan);\nMA_API float ma_sound_group_get_pan(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_pan_mode(ma_sound_group* pGroup, ma_pan_mode panMode);\nMA_API ma_pan_mode ma_sound_group_get_pan_mode(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_pitch(ma_sound_group* pGroup, float pitch);\nMA_API float ma_sound_group_get_pitch(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_spatialization_enabled(ma_sound_group* pGroup, ma_bool32 enabled);\nMA_API ma_bool32 ma_sound_group_is_spatialization_enabled(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_pinned_listener_index(ma_sound_group* pGroup, ma_uint32 listenerIndex);\nMA_API ma_uint32 ma_sound_group_get_pinned_listener_index(const ma_sound_group* pGroup);\nMA_API ma_uint32 ma_sound_group_get_listener_index(const ma_sound_group* pGroup);\nMA_API ma_vec3f ma_sound_group_get_direction_to_listener(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_position(ma_sound_group* pGroup, float x, float y, float z);\nMA_API ma_vec3f ma_sound_group_get_position(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_direction(ma_sound_group* pGroup, float x, float y, float z);\nMA_API ma_vec3f ma_sound_group_get_direction(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_velocity(ma_sound_group* pGroup, float x, float y, float z);\nMA_API ma_vec3f ma_sound_group_get_velocity(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_attenuation_model(ma_sound_group* pGroup, ma_attenuation_model attenuationModel);\nMA_API ma_attenuation_model ma_sound_group_get_attenuation_model(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_positioning(ma_sound_group* pGroup, ma_positioning positioning);\nMA_API ma_positioning ma_sound_group_get_positioning(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_rolloff(ma_sound_group* pGroup, float rolloff);\nMA_API float ma_sound_group_get_rolloff(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_min_gain(ma_sound_group* pGroup, float minGain);\nMA_API float ma_sound_group_get_min_gain(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_max_gain(ma_sound_group* pGroup, float maxGain);\nMA_API float ma_sound_group_get_max_gain(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_min_distance(ma_sound_group* pGroup, float minDistance);\nMA_API float ma_sound_group_get_min_distance(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_max_distance(ma_sound_group* pGroup, float maxDistance);\nMA_API float ma_sound_group_get_max_distance(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_cone(ma_sound_group* pGroup, float innerAngleInRadians, float outerAngleInRadians, float outerGain);\nMA_API void ma_sound_group_get_cone(const ma_sound_group* pGroup, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain);\nMA_API void ma_sound_group_set_doppler_factor(ma_sound_group* pGroup, float dopplerFactor);\nMA_API float ma_sound_group_get_doppler_factor(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_directional_attenuation_factor(ma_sound_group* pGroup, float directionalAttenuationFactor);\nMA_API float ma_sound_group_get_directional_attenuation_factor(const ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_fade_in_pcm_frames(ma_sound_group* pGroup, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInFrames);\nMA_API void ma_sound_group_set_fade_in_milliseconds(ma_sound_group* pGroup, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInMilliseconds);\nMA_API float ma_sound_group_get_current_fade_volume(ma_sound_group* pGroup);\nMA_API void ma_sound_group_set_start_time_in_pcm_frames(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInFrames);\nMA_API void ma_sound_group_set_start_time_in_milliseconds(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInMilliseconds);\nMA_API void ma_sound_group_set_stop_time_in_pcm_frames(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInFrames);\nMA_API void ma_sound_group_set_stop_time_in_milliseconds(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInMilliseconds);\nMA_API ma_bool32 ma_sound_group_is_playing(const ma_sound_group* pGroup);\nMA_API ma_uint64 ma_sound_group_get_time_in_pcm_frames(const ma_sound_group* pGroup);\n#endif  /* MA_NO_ENGINE */\n/* END SECTION: miniaudio_engine.h */\n\n#ifdef __cplusplus\n}\n#endif\n#endif  /* miniaudio_h */\n\n\n/*\nThis is for preventing greying out of the implementation section.\n*/\n#if defined(Q_CREATOR_RUN) || defined(__INTELLISENSE__) || defined(__CDT_PARSER__)\n#define MINIAUDIO_IMPLEMENTATION\n#endif\n\n/************************************************************************************************************************************************************\n*************************************************************************************************************************************************************\n\nIMPLEMENTATION\n\n*************************************************************************************************************************************************************\n************************************************************************************************************************************************************/\n#if defined(MINIAUDIO_IMPLEMENTATION) || defined(MA_IMPLEMENTATION)\n#ifndef miniaudio_c\n#define miniaudio_c\n\n#include <assert.h>\n#include <limits.h>         /* For INT_MAX */\n#include <math.h>           /* sin(), etc. */\n#include <stdlib.h>         /* For malloc(), free(), wcstombs(). */\n#include <string.h>         /* For memset() */\n\n#include <stdarg.h>\n#include <stdio.h>\n#if !defined(_MSC_VER) && !defined(__DMC__)\n    #include <strings.h>    /* For strcasecmp(). */\n    #include <wchar.h>      /* For wcslen(), wcsrtombs() */\n#endif\n#ifdef _MSC_VER\n    #include <float.h>      /* For _controlfp_s constants */\n#endif\n\n#if defined(MA_WIN32)\n    #include <windows.h>\n\n    /*\n    There's a possibility that WIN32_LEAN_AND_MEAN has been defined which will exclude some symbols\n    such as STGM_READ and CLSCTL_ALL. We need to check these and define them ourselves if they're\n    unavailable.\n    */\n    #ifndef STGM_READ\n    #define STGM_READ   0x00000000L\n    #endif\n    #ifndef CLSCTX_ALL\n    #define CLSCTX_ALL  23\n    #endif\n\n    /* IUnknown is used by both the WASAPI and DirectSound backends. It easier to just declare our version here. */\n    typedef struct ma_IUnknown  ma_IUnknown;\n#endif\n\n#if !defined(MA_WIN32)\n#include <sched.h>\n#include <sys/time.h>   /* select() (used for ma_sleep()). */\n#include <pthread.h>\n#endif\n\n#ifdef MA_NX\n#include <time.h>       /* For nanosleep() */\n#endif\n\n#include <sys/stat.h>   /* For fstat(), etc. */\n\n#ifdef MA_EMSCRIPTEN\n#include <emscripten/emscripten.h>\n#endif\n\n\n/* Architecture Detection */\n#if !defined(MA_64BIT) && !defined(MA_32BIT)\n#ifdef _WIN32\n#ifdef _WIN64\n#define MA_64BIT\n#else\n#define MA_32BIT\n#endif\n#endif\n#endif\n\n#if !defined(MA_64BIT) && !defined(MA_32BIT)\n#ifdef __GNUC__\n#ifdef __LP64__\n#define MA_64BIT\n#else\n#define MA_32BIT\n#endif\n#endif\n#endif\n\n#if !defined(MA_64BIT) && !defined(MA_32BIT)\n#include <stdint.h>\n#if INTPTR_MAX == INT64_MAX\n#define MA_64BIT\n#else\n#define MA_32BIT\n#endif\n#endif\n\n#if defined(__arm__) || defined(_M_ARM)\n#define MA_ARM32\n#endif\n#if defined(__arm64) || defined(__arm64__) || defined(__aarch64__) || defined(_M_ARM64)\n#define MA_ARM64\n#endif\n\n#if defined(__x86_64__) || defined(_M_X64)\n#define MA_X64\n#elif defined(__i386) || defined(_M_IX86)\n#define MA_X86\n#elif defined(MA_ARM32) || defined(MA_ARM64)\n#define MA_ARM\n#endif\n\n/* Intrinsics Support */\n#if (defined(MA_X64) || defined(MA_X86)) && !defined(__COSMOPOLITAN__)\n    #if defined(_MSC_VER) && !defined(__clang__)\n        /* MSVC. */\n        #if _MSC_VER >= 1400 && !defined(MA_NO_SSE2)   /* 2005 */\n            #define MA_SUPPORT_SSE2\n        #endif\n        /*#if _MSC_VER >= 1600 && !defined(MA_NO_AVX)*/    /* 2010 */\n        /*    #define MA_SUPPORT_AVX*/\n        /*#endif*/\n        #if _MSC_VER >= 1700 && !defined(MA_NO_AVX2)   /* 2012 */\n            #define MA_SUPPORT_AVX2\n        #endif\n    #else\n        /* Assume GNUC-style. */\n        #if defined(__SSE2__) && !defined(MA_NO_SSE2)\n            #define MA_SUPPORT_SSE2\n        #endif\n        /*#if defined(__AVX__) && !defined(MA_NO_AVX)*/\n        /*    #define MA_SUPPORT_AVX*/\n        /*#endif*/\n        #if defined(__AVX2__) && !defined(MA_NO_AVX2)\n            #define MA_SUPPORT_AVX2\n        #endif\n    #endif\n\n    /* If at this point we still haven't determined compiler support for the intrinsics just fall back to __has_include. */\n    #if !defined(__GNUC__) && !defined(__clang__) && defined(__has_include)\n        #if !defined(MA_SUPPORT_SSE2)   && !defined(MA_NO_SSE2)   && __has_include(<emmintrin.h>)\n            #define MA_SUPPORT_SSE2\n        #endif\n        /*#if !defined(MA_SUPPORT_AVX)    && !defined(MA_NO_AVX)    && __has_include(<immintrin.h>)*/\n        /*    #define MA_SUPPORT_AVX*/\n        /*#endif*/\n        #if !defined(MA_SUPPORT_AVX2)   && !defined(MA_NO_AVX2)   && __has_include(<immintrin.h>)\n            #define MA_SUPPORT_AVX2\n        #endif\n    #endif\n\n    #if defined(MA_SUPPORT_AVX2) || defined(MA_SUPPORT_AVX)\n        #include <immintrin.h>\n    #elif defined(MA_SUPPORT_SSE2)\n        #include <emmintrin.h>\n    #endif\n#endif\n\n#if defined(MA_ARM)\n    #if !defined(MA_NO_NEON) && (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64))\n        #define MA_SUPPORT_NEON\n        #include <arm_neon.h>\n    #endif\n#endif\n\n/* Begin globally disabled warnings. */\n#if defined(_MSC_VER)\n    #pragma warning(push)\n    #pragma warning(disable:4752)   /* found Intel(R) Advanced Vector Extensions; consider using /arch:AVX */\n    #pragma warning(disable:4049)   /* compiler limit : terminating line number emission */\n#endif\n\n#if defined(MA_X64) || defined(MA_X86)\n    #if defined(_MSC_VER) && !defined(__clang__)\n        #if _MSC_VER >= 1400\n            #include <intrin.h>\n            static MA_INLINE void ma_cpuid(int info[4], int fid)\n            {\n                __cpuid(info, fid);\n            }\n        #else\n            #define MA_NO_CPUID\n        #endif\n\n        #if _MSC_VER >= 1600 && (defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 160040219)\n            static MA_INLINE unsigned __int64 ma_xgetbv(int reg)\n            {\n                return _xgetbv(reg);\n            }\n        #else\n            #define MA_NO_XGETBV\n        #endif\n    #elif (defined(__GNUC__) || defined(__clang__)) && !defined(MA_ANDROID)\n        static MA_INLINE void ma_cpuid(int info[4], int fid)\n        {\n            /*\n            It looks like the -fPIC option uses the ebx register which GCC complains about. We can work around this by just using a different register, the\n            specific register of which I'm letting the compiler decide on. The \"k\" prefix is used to specify a 32-bit register. The {...} syntax is for\n            supporting different assembly dialects.\n\n            What's basically happening is that we're saving and restoring the ebx register manually.\n            */\n            #if defined(MA_X86) && defined(__PIC__)\n                __asm__ __volatile__ (\n                    \"xchg{l} {%%}ebx, %k1;\"\n                    \"cpuid;\"\n                    \"xchg{l} {%%}ebx, %k1;\"\n                    : \"=a\"(info[0]), \"=&r\"(info[1]), \"=c\"(info[2]), \"=d\"(info[3]) : \"a\"(fid), \"c\"(0)\n                );\n            #else\n                __asm__ __volatile__ (\n                    \"cpuid\" : \"=a\"(info[0]), \"=b\"(info[1]), \"=c\"(info[2]), \"=d\"(info[3]) : \"a\"(fid), \"c\"(0)\n                );\n            #endif\n        }\n\n        static MA_INLINE ma_uint64 ma_xgetbv(int reg)\n        {\n            unsigned int hi;\n            unsigned int lo;\n\n            __asm__ __volatile__ (\n                \"xgetbv\" : \"=a\"(lo), \"=d\"(hi) : \"c\"(reg)\n            );\n\n            return ((ma_uint64)hi << 32) | (ma_uint64)lo;\n        }\n    #else\n        #define MA_NO_CPUID\n        #define MA_NO_XGETBV\n    #endif\n#else\n    #define MA_NO_CPUID\n    #define MA_NO_XGETBV\n#endif\n\nstatic MA_INLINE ma_bool32 ma_has_sse2(void)\n{\n#if defined(MA_SUPPORT_SSE2)\n    #if (defined(MA_X64) || defined(MA_X86)) && !defined(MA_NO_SSE2)\n        #if defined(MA_X64)\n            return MA_TRUE;    /* 64-bit targets always support SSE2. */\n        #elif (defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE2__)\n            return MA_TRUE;    /* If the compiler is allowed to freely generate SSE2 code we can assume support. */\n        #else\n            #if defined(MA_NO_CPUID)\n                return MA_FALSE;\n            #else\n                int info[4];\n                ma_cpuid(info, 1);\n                return (info[3] & (1 << 26)) != 0;\n            #endif\n        #endif\n    #else\n        return MA_FALSE;       /* SSE2 is only supported on x86 and x64 architectures. */\n    #endif\n#else\n    return MA_FALSE;           /* No compiler support. */\n#endif\n}\n\n#if 0\nstatic MA_INLINE ma_bool32 ma_has_avx()\n{\n#if defined(MA_SUPPORT_AVX)\n    #if (defined(MA_X64) || defined(MA_X86)) && !defined(MA_NO_AVX)\n        #if defined(_AVX_) || defined(__AVX__)\n            return MA_TRUE;    /* If the compiler is allowed to freely generate AVX code we can assume support. */\n        #else\n            /* AVX requires both CPU and OS support. */\n            #if defined(MA_NO_CPUID) || defined(MA_NO_XGETBV)\n                return MA_FALSE;\n            #else\n                int info[4];\n                ma_cpuid(info, 1);\n                if (((info[2] & (1 << 27)) != 0) && ((info[2] & (1 << 28)) != 0)) {\n                    ma_uint64 xrc = ma_xgetbv(0);\n                    if ((xrc & 0x06) == 0x06) {\n                        return MA_TRUE;\n                    } else {\n                        return MA_FALSE;\n                    }\n                } else {\n                    return MA_FALSE;\n                }\n            #endif\n        #endif\n    #else\n        return MA_FALSE;       /* AVX is only supported on x86 and x64 architectures. */\n    #endif\n#else\n    return MA_FALSE;           /* No compiler support. */\n#endif\n}\n#endif\n\nstatic MA_INLINE ma_bool32 ma_has_avx2(void)\n{\n#if defined(MA_SUPPORT_AVX2)\n    #if (defined(MA_X64) || defined(MA_X86)) && !defined(MA_NO_AVX2)\n        #if defined(_AVX2_) || defined(__AVX2__)\n            return MA_TRUE;    /* If the compiler is allowed to freely generate AVX2 code we can assume support. */\n        #else\n            /* AVX2 requires both CPU and OS support. */\n            #if defined(MA_NO_CPUID) || defined(MA_NO_XGETBV)\n                return MA_FALSE;\n            #else\n                int info1[4];\n                int info7[4];\n                ma_cpuid(info1, 1);\n                ma_cpuid(info7, 7);\n                if (((info1[2] & (1 << 27)) != 0) && ((info7[1] & (1 << 5)) != 0)) {\n                    ma_uint64 xrc = ma_xgetbv(0);\n                    if ((xrc & 0x06) == 0x06) {\n                        return MA_TRUE;\n                    } else {\n                        return MA_FALSE;\n                    }\n                } else {\n                    return MA_FALSE;\n                }\n            #endif\n        #endif\n    #else\n        return MA_FALSE;       /* AVX2 is only supported on x86 and x64 architectures. */\n    #endif\n#else\n    return MA_FALSE;           /* No compiler support. */\n#endif\n}\n\nstatic MA_INLINE ma_bool32 ma_has_neon(void)\n{\n#if defined(MA_SUPPORT_NEON)\n    #if defined(MA_ARM) && !defined(MA_NO_NEON)\n        #if (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64))\n            return MA_TRUE;    /* If the compiler is allowed to freely generate NEON code we can assume support. */\n        #else\n            /* TODO: Runtime check. */\n            return MA_FALSE;\n        #endif\n    #else\n        return MA_FALSE;       /* NEON is only supported on ARM architectures. */\n    #endif\n#else\n    return MA_FALSE;           /* No compiler support. */\n#endif\n}\n\n#if defined(__has_builtin)\n    #define MA_COMPILER_HAS_BUILTIN(x) __has_builtin(x)\n#else\n    #define MA_COMPILER_HAS_BUILTIN(x) 0\n#endif\n\n#ifndef MA_ASSUME\n    #if MA_COMPILER_HAS_BUILTIN(__builtin_assume)\n        #define MA_ASSUME(x) __builtin_assume(x)\n    #elif MA_COMPILER_HAS_BUILTIN(__builtin_unreachable)\n        #define MA_ASSUME(x) do { if (!(x)) __builtin_unreachable(); } while (0)\n    #elif defined(_MSC_VER)\n        #define MA_ASSUME(x) __assume(x)\n    #else\n        #define MA_ASSUME(x) (void)(x)\n    #endif\n#endif\n\n#ifndef MA_RESTRICT\n    #if defined(__clang__) || defined(__GNUC__) || defined(_MSC_VER)\n        #define MA_RESTRICT __restrict\n    #else\n        #define MA_RESTRICT\n    #endif\n#endif\n\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n    #define MA_HAS_BYTESWAP16_INTRINSIC\n    #define MA_HAS_BYTESWAP32_INTRINSIC\n    #define MA_HAS_BYTESWAP64_INTRINSIC\n#elif defined(__clang__)\n    #if MA_COMPILER_HAS_BUILTIN(__builtin_bswap16)\n        #define MA_HAS_BYTESWAP16_INTRINSIC\n    #endif\n    #if MA_COMPILER_HAS_BUILTIN(__builtin_bswap32)\n        #define MA_HAS_BYTESWAP32_INTRINSIC\n    #endif\n    #if MA_COMPILER_HAS_BUILTIN(__builtin_bswap64)\n        #define MA_HAS_BYTESWAP64_INTRINSIC\n    #endif\n#elif defined(__GNUC__)\n    #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))\n        #define MA_HAS_BYTESWAP32_INTRINSIC\n        #define MA_HAS_BYTESWAP64_INTRINSIC\n    #endif\n    #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))\n        #define MA_HAS_BYTESWAP16_INTRINSIC\n    #endif\n#endif\n\n\nstatic MA_INLINE ma_bool32 ma_is_little_endian(void)\n{\n#if defined(MA_X86) || defined(MA_X64)\n    return MA_TRUE;\n#else\n    int n = 1;\n    return (*(char*)&n) == 1;\n#endif\n}\n\nstatic MA_INLINE ma_bool32 ma_is_big_endian(void)\n{\n    return !ma_is_little_endian();\n}\n\n\nstatic MA_INLINE ma_uint32 ma_swap_endian_uint32(ma_uint32 n)\n{\n#ifdef MA_HAS_BYTESWAP32_INTRINSIC\n    #if defined(_MSC_VER)\n        return _byteswap_ulong(n);\n    #elif defined(__GNUC__) || defined(__clang__)\n        #if defined(MA_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 6) && !defined(MA_64BIT)   /* <-- 64-bit inline assembly has not been tested, so disabling for now. */\n            /* Inline assembly optimized implementation for ARM. In my testing, GCC does not generate optimized code with __builtin_bswap32(). */\n            ma_uint32 r;\n            __asm__ __volatile__ (\n            #if defined(MA_64BIT)\n                \"rev %w[out], %w[in]\" : [out]\"=r\"(r) : [in]\"r\"(n)   /* <-- This is untested. If someone in the community could test this, that would be appreciated! */\n            #else\n                \"rev %[out], %[in]\" : [out]\"=r\"(r) : [in]\"r\"(n)\n            #endif\n            );\n            return r;\n        #else\n            return __builtin_bswap32(n);\n        #endif\n    #else\n        #error \"This compiler does not support the byte swap intrinsic.\"\n    #endif\n#else\n    return ((n & 0xFF000000) >> 24) |\n           ((n & 0x00FF0000) >>  8) |\n           ((n & 0x0000FF00) <<  8) |\n           ((n & 0x000000FF) << 24);\n#endif\n}\n\n\n#if !defined(MA_EMSCRIPTEN)\n#ifdef MA_WIN32\nstatic void ma_sleep__win32(ma_uint32 milliseconds)\n{\n    Sleep((DWORD)milliseconds);\n}\n#endif\n#ifdef MA_POSIX\nstatic void ma_sleep__posix(ma_uint32 milliseconds)\n{\n#ifdef MA_EMSCRIPTEN\n    (void)milliseconds;\n    MA_ASSERT(MA_FALSE);  /* The Emscripten build should never sleep. */\n#else\n    #if (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L) || defined(MA_NX)\n        struct timespec ts;\n        ts.tv_sec  = milliseconds / 1000;\n        ts.tv_nsec = milliseconds % 1000 * 1000000;\n        nanosleep(&ts, NULL);\n    #else\n        struct timeval tv;\n        tv.tv_sec  = milliseconds / 1000;\n        tv.tv_usec = milliseconds % 1000 * 1000;\n        select(0, NULL, NULL, NULL, &tv);\n    #endif\n#endif\n}\n#endif\n\nstatic MA_INLINE void ma_sleep(ma_uint32 milliseconds)\n{\n#ifdef MA_WIN32\n    ma_sleep__win32(milliseconds);\n#endif\n#ifdef MA_POSIX\n    ma_sleep__posix(milliseconds);\n#endif\n}\n#endif\n\nstatic MA_INLINE void ma_yield(void)\n{\n#if defined(__i386) || defined(_M_IX86) || defined(__x86_64__) || defined(_M_X64)\n    /* x86/x64 */\n    #if (defined(_MSC_VER) || defined(__WATCOMC__) || defined(__DMC__)) && !defined(__clang__)\n        #if _MSC_VER >= 1400\n            _mm_pause();\n        #else\n            #if defined(__DMC__)\n                /* Digital Mars does not recognize the PAUSE opcode. Fall back to NOP. */\n                __asm nop;\n            #else\n                __asm pause;\n            #endif\n        #endif\n    #else\n        __asm__ __volatile__ (\"pause\");\n    #endif\n#elif (defined(__arm__) && defined(__ARM_ARCH) && __ARM_ARCH >= 7) || defined(_M_ARM64) || (defined(_M_ARM) && _M_ARM >= 7) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6T2__)\n    /* ARM */\n    #if defined(_MSC_VER)\n        /* Apparently there is a __yield() intrinsic that's compatible with ARM, but I cannot find documentation for it nor can I find where it's declared. */\n        __yield();\n    #else\n        __asm__ __volatile__ (\"yield\"); /* ARMv6K/ARMv6T2 and above. */\n    #endif\n#else\n    /* Unknown or unsupported architecture. No-op. */\n#endif\n}\n\n\n#define MA_MM_DENORMALS_ZERO_MASK   0x0040\n#define MA_MM_FLUSH_ZERO_MASK       0x8000\n\nstatic MA_INLINE unsigned int ma_disable_denormals(void)\n{\n    unsigned int prevState;\n\n    #if defined(_MSC_VER)\n    {\n        /*\n        Older versions of Visual Studio don't support the \"safe\" versions of _controlfp_s(). I don't\n        know which version of Visual Studio first added support for _controlfp_s(), but I do know\n        that VC6 lacks support. _MSC_VER = 1200 is VC6, but if you get compilation errors on older\n        versions of Visual Studio, let me know and I'll make the necessary adjustment.\n        */\n        #if _MSC_VER <= 1200\n        {\n            prevState = _statusfp();\n            _controlfp(prevState | _DN_FLUSH, _MCW_DN);\n        }\n        #else\n        {\n            unsigned int unused;\n            _controlfp_s(&prevState, 0, 0);\n            _controlfp_s(&unused, prevState | _DN_FLUSH, _MCW_DN);\n        }\n        #endif\n    }\n    #elif defined(MA_X86) || defined(MA_X64)\n    {\n        #if defined(__SSE2__) && !(defined(__TINYC__) || defined(__WATCOMC__) || defined(__COSMOPOLITAN__)) /* <-- Add compilers that lack support for _mm_getcsr() and _mm_setcsr() to this list. */\n        {\n            prevState = _mm_getcsr();\n            _mm_setcsr(prevState | MA_MM_DENORMALS_ZERO_MASK | MA_MM_FLUSH_ZERO_MASK);\n        }\n        #else\n        {\n            /* x88/64, but no support for _mm_getcsr()/_mm_setcsr(). May need to fall back to inlined assembly here. */\n            prevState = 0;\n        }\n        #endif\n    }\n    #else\n    {\n        /* Unknown or unsupported architecture. No-op. */\n        prevState = 0;\n    }\n    #endif\n\n    return prevState;\n}\n\nstatic MA_INLINE void ma_restore_denormals(unsigned int prevState)\n{\n    #if defined(_MSC_VER)\n    {\n        /* Older versions of Visual Studio do not support _controlfp_s(). See ma_disable_denormals(). */\n        #if _MSC_VER <= 1200\n        {\n            _controlfp(prevState, _MCW_DN);\n        }\n        #else\n        {\n            unsigned int unused;\n            _controlfp_s(&unused, prevState, _MCW_DN);\n        }\n        #endif\n    }\n    #elif defined(MA_X86) || defined(MA_X64)\n    {\n        #if defined(__SSE2__) && !(defined(__TINYC__) || defined(__WATCOMC__) || defined(__COSMOPOLITAN__))   /* <-- Add compilers that lack support for _mm_getcsr() and _mm_setcsr() to this list. */\n        {\n            _mm_setcsr(prevState);\n        }\n        #else\n        {\n            /* x88/64, but no support for _mm_getcsr()/_mm_setcsr(). May need to fall back to inlined assembly here. */\n            (void)prevState;\n        }\n        #endif\n    }\n    #else\n    {\n        /* Unknown or unsupported architecture. No-op. */\n        (void)prevState;\n    }\n    #endif\n}\n\n\n#ifdef MA_ANDROID\n#include <sys/system_properties.h>\n\nint ma_android_sdk_version()\n{\n    char sdkVersion[PROP_VALUE_MAX + 1] = {0, };\n    if (__system_property_get(\"ro.build.version.sdk\", sdkVersion)) {\n        return atoi(sdkVersion);\n    }\n\n    return 0;\n}\n#endif\n\n\n#ifndef MA_COINIT_VALUE\n#define MA_COINIT_VALUE    0   /* 0 = COINIT_MULTITHREADED */\n#endif\n\n\n#ifndef MA_FLT_MAX\n    #ifdef FLT_MAX\n        #define MA_FLT_MAX FLT_MAX\n    #else\n        #define MA_FLT_MAX 3.402823466e+38F\n    #endif\n#endif\n\n\n#ifndef MA_PI\n#define MA_PI      3.14159265358979323846264f\n#endif\n#ifndef MA_PI_D\n#define MA_PI_D    3.14159265358979323846264\n#endif\n#ifndef MA_TAU\n#define MA_TAU     6.28318530717958647693f\n#endif\n#ifndef MA_TAU_D\n#define MA_TAU_D   6.28318530717958647693\n#endif\n\n\n/* The default format when ma_format_unknown (0) is requested when initializing a device. */\n#ifndef MA_DEFAULT_FORMAT\n#define MA_DEFAULT_FORMAT                                   ma_format_f32\n#endif\n\n/* The default channel count to use when 0 is used when initializing a device. */\n#ifndef MA_DEFAULT_CHANNELS\n#define MA_DEFAULT_CHANNELS                                 2\n#endif\n\n/* The default sample rate to use when 0 is used when initializing a device. */\n#ifndef MA_DEFAULT_SAMPLE_RATE\n#define MA_DEFAULT_SAMPLE_RATE                              48000\n#endif\n\n/* Default periods when none is specified in ma_device_init(). More periods means more work on the CPU. */\n#ifndef MA_DEFAULT_PERIODS\n#define MA_DEFAULT_PERIODS                                  3\n#endif\n\n/* The default period size in milliseconds for low latency mode. */\n#ifndef MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_LOW_LATENCY\n#define MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_LOW_LATENCY  10\n#endif\n\n/* The default buffer size in milliseconds for conservative mode. */\n#ifndef MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE\n#define MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE 100\n#endif\n\n/* The default LPF filter order for linear resampling. Note that this is clamped to MA_MAX_FILTER_ORDER. */\n#ifndef MA_DEFAULT_RESAMPLER_LPF_ORDER\n    #if MA_MAX_FILTER_ORDER >= 4\n        #define MA_DEFAULT_RESAMPLER_LPF_ORDER  4\n    #else\n        #define MA_DEFAULT_RESAMPLER_LPF_ORDER  MA_MAX_FILTER_ORDER\n    #endif\n#endif\n\n\n#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wunused-variable\"\n#endif\n\n/* Standard sample rates, in order of priority. */\nstatic ma_uint32 g_maStandardSampleRatePriorities[] = {\n    (ma_uint32)ma_standard_sample_rate_48000,\n    (ma_uint32)ma_standard_sample_rate_44100,\n\n    (ma_uint32)ma_standard_sample_rate_32000,\n    (ma_uint32)ma_standard_sample_rate_24000,\n    (ma_uint32)ma_standard_sample_rate_22050,\n\n    (ma_uint32)ma_standard_sample_rate_88200,\n    (ma_uint32)ma_standard_sample_rate_96000,\n    (ma_uint32)ma_standard_sample_rate_176400,\n    (ma_uint32)ma_standard_sample_rate_192000,\n\n    (ma_uint32)ma_standard_sample_rate_16000,\n    (ma_uint32)ma_standard_sample_rate_11025,\n    (ma_uint32)ma_standard_sample_rate_8000,\n\n    (ma_uint32)ma_standard_sample_rate_352800,\n    (ma_uint32)ma_standard_sample_rate_384000\n};\n\nstatic MA_INLINE ma_bool32 ma_is_standard_sample_rate(ma_uint32 sampleRate)\n{\n    ma_uint32 iSampleRate;\n\n    for (iSampleRate = 0; iSampleRate < sizeof(g_maStandardSampleRatePriorities) / sizeof(g_maStandardSampleRatePriorities[0]); iSampleRate += 1) {\n        if (g_maStandardSampleRatePriorities[iSampleRate] == sampleRate) {\n            return MA_TRUE;\n        }\n    }\n\n    /* Getting here means the sample rate is not supported. */\n    return MA_FALSE;\n}\n\n\nstatic ma_format g_maFormatPriorities[] = {\n    ma_format_s16,         /* Most common */\n    ma_format_f32,\n\n    /*ma_format_s24_32,*/    /* Clean alignment */\n    ma_format_s32,\n\n    ma_format_s24,         /* Unclean alignment */\n\n    ma_format_u8           /* Low quality */\n};\n#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n    #pragma GCC diagnostic pop\n#endif\n\n\nMA_API void ma_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* pRevision)\n{\n    if (pMajor) {\n        *pMajor = MA_VERSION_MAJOR;\n    }\n\n    if (pMinor) {\n        *pMinor = MA_VERSION_MINOR;\n    }\n\n    if (pRevision) {\n        *pRevision = MA_VERSION_REVISION;\n    }\n}\n\nMA_API const char* ma_version_string(void)\n{\n    return MA_VERSION_STRING;\n}\n\n\n/******************************************************************************\n\nStandard Library Stuff\n\n******************************************************************************/\n#ifndef MA_ASSERT\n#define MA_ASSERT(condition)            assert(condition)\n#endif\n\n#ifndef MA_MALLOC\n#define MA_MALLOC(sz)                   malloc((sz))\n#endif\n#ifndef MA_REALLOC\n#define MA_REALLOC(p, sz)               realloc((p), (sz))\n#endif\n#ifndef MA_FREE\n#define MA_FREE(p)                      free((p))\n#endif\n\nstatic MA_INLINE void ma_zero_memory_default(void* p, size_t sz)\n{\n    if (p == NULL) {\n        MA_ASSERT(sz == 0); /* If this is triggered there's an error with the calling code. */\n        return;\n    }\n\n    if (sz > 0) {\n        memset(p, 0, sz);\n    }\n}\n\n\n#ifndef MA_ZERO_MEMORY\n#define MA_ZERO_MEMORY(p, sz)           ma_zero_memory_default((p), (sz))\n#endif\n#ifndef MA_COPY_MEMORY\n#define MA_COPY_MEMORY(dst, src, sz)    memcpy((dst), (src), (sz))\n#endif\n#ifndef MA_MOVE_MEMORY\n#define MA_MOVE_MEMORY(dst, src, sz)    memmove((dst), (src), (sz))\n#endif\n\n#define MA_ZERO_OBJECT(p)               MA_ZERO_MEMORY((p), sizeof(*(p)))\n\n#define ma_countof(x)                   (sizeof(x) / sizeof(x[0]))\n#define ma_max(x, y)                    (((x) > (y)) ? (x) : (y))\n#define ma_min(x, y)                    (((x) < (y)) ? (x) : (y))\n#define ma_abs(x)                       (((x) > 0) ? (x) : -(x))\n#define ma_clamp(x, lo, hi)             (ma_max(lo, ma_min(x, hi)))\n#define ma_offset_ptr(p, offset)        (((ma_uint8*)(p)) + (offset))\n#define ma_align(x, a)                  (((x) + ((a)-1)) & ~((a)-1))\n#define ma_align_64(x)                  ma_align(x, 8)\n\n#define ma_buffer_frame_capacity(buffer, channels, format) (sizeof(buffer) / ma_get_bytes_per_sample(format) / (channels))\n\nstatic MA_INLINE double ma_sind(double x)\n{\n    /* TODO: Implement custom sin(x). */\n    return sin(x);\n}\n\nstatic MA_INLINE double ma_expd(double x)\n{\n    /* TODO: Implement custom exp(x). */\n    return exp(x);\n}\n\nstatic MA_INLINE double ma_logd(double x)\n{\n    /* TODO: Implement custom log(x). */\n    return log(x);\n}\n\nstatic MA_INLINE double ma_powd(double x, double y)\n{\n    /* TODO: Implement custom pow(x, y). */\n    return pow(x, y);\n}\n\nstatic MA_INLINE double ma_sqrtd(double x)\n{\n    /* TODO: Implement custom sqrt(x). */\n    return sqrt(x);\n}\n\n\nstatic MA_INLINE float ma_rsqrtf(float x)\n{\n    #if defined(MA_SUPPORT_SSE2) && !defined(MA_NO_SSE2) && (defined(MA_X64) || (defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE2__))\n    {\n        /*\n        For SSE we can use RSQRTSS.\n\n        This Stack Overflow post suggests that compilers don't necessarily generate optimal code\n        when using intrinsics:\n\n            https://web.archive.org/web/20221211012522/https://stackoverflow.com/questions/32687079/getting-fewest-instructions-for-rsqrtss-wrapper\n\n        I'm going to do something similar here, but a bit simpler.\n        */\n        #if defined(__GNUC__) || defined(__clang__)\n        {\n            float result;\n            __asm__ __volatile__(\"rsqrtss %1, %0\" : \"=x\"(result) : \"x\"(x));\n            return result;\n        }\n        #else\n        {\n            return _mm_cvtss_f32(_mm_rsqrt_ss(_mm_set_ps1(x)));\n        }\n        #endif\n    }\n    #else\n    {\n        return 1 / (float)ma_sqrtd(x);\n    }\n    #endif\n}\n\n\nstatic MA_INLINE float ma_sinf(float x)\n{\n    return (float)ma_sind((float)x);\n}\n\nstatic MA_INLINE double ma_cosd(double x)\n{\n    return ma_sind((MA_PI_D*0.5) - x);\n}\n\nstatic MA_INLINE float ma_cosf(float x)\n{\n    return (float)ma_cosd((float)x);\n}\n\nstatic MA_INLINE double ma_log10d(double x)\n{\n    return ma_logd(x) * 0.43429448190325182765;\n}\n\nstatic MA_INLINE float ma_powf(float x, float y)\n{\n    return (float)ma_powd((double)x, (double)y);\n}\n\nstatic MA_INLINE float ma_log10f(float x)\n{\n    return (float)ma_log10d((double)x);\n}\n\n\nstatic MA_INLINE double ma_degrees_to_radians(double degrees)\n{\n    return degrees * 0.01745329252;\n}\n\nstatic MA_INLINE double ma_radians_to_degrees(double radians)\n{\n    return radians * 57.295779512896;\n}\n\nstatic MA_INLINE float ma_degrees_to_radians_f(float degrees)\n{\n    return degrees * 0.01745329252f;\n}\n\nstatic MA_INLINE float ma_radians_to_degrees_f(float radians)\n{\n    return radians * 57.295779512896f;\n}\n\n\n/*\nReturn Values:\n  0:  Success\n  22: EINVAL\n  34: ERANGE\n\nNot using symbolic constants for errors because I want to avoid #including errno.h\n\nThese are marked as no-inline because of some bad code generation by Clang. None of these functions\nare used in any performance-critical code within miniaudio.\n*/\nMA_API MA_NO_INLINE int ma_strcpy_s(char* dst, size_t dstSizeInBytes, const char* src)\n{\n    size_t i;\n\n    if (dst == 0) {\n        return 22;\n    }\n    if (dstSizeInBytes == 0) {\n        return 34;\n    }\n    if (src == 0) {\n        dst[0] = '\\0';\n        return 22;\n    }\n\n    for (i = 0; i < dstSizeInBytes && src[i] != '\\0'; ++i) {\n        dst[i] = src[i];\n    }\n\n    if (i < dstSizeInBytes) {\n        dst[i] = '\\0';\n        return 0;\n    }\n\n    dst[0] = '\\0';\n    return 34;\n}\n\nMA_API MA_NO_INLINE int ma_wcscpy_s(wchar_t* dst, size_t dstCap, const wchar_t* src)\n{\n    size_t i;\n\n    if (dst == 0) {\n        return 22;\n    }\n    if (dstCap == 0) {\n        return 34;\n    }\n    if (src == 0) {\n        dst[0] = '\\0';\n        return 22;\n    }\n\n    for (i = 0; i < dstCap && src[i] != '\\0'; ++i) {\n        dst[i] = src[i];\n    }\n\n    if (i < dstCap) {\n        dst[i] = '\\0';\n        return 0;\n    }\n\n    dst[0] = '\\0';\n    return 34;\n}\n\n\nMA_API MA_NO_INLINE int ma_strncpy_s(char* dst, size_t dstSizeInBytes, const char* src, size_t count)\n{\n    size_t maxcount;\n    size_t i;\n\n    if (dst == 0) {\n        return 22;\n    }\n    if (dstSizeInBytes == 0) {\n        return 34;\n    }\n    if (src == 0) {\n        dst[0] = '\\0';\n        return 22;\n    }\n\n    maxcount = count;\n    if (count == ((size_t)-1) || count >= dstSizeInBytes) {        /* -1 = _TRUNCATE */\n        maxcount = dstSizeInBytes - 1;\n    }\n\n    for (i = 0; i < maxcount && src[i] != '\\0'; ++i) {\n        dst[i] = src[i];\n    }\n\n    if (src[i] == '\\0' || i == count || count == ((size_t)-1)) {\n        dst[i] = '\\0';\n        return 0;\n    }\n\n    dst[0] = '\\0';\n    return 34;\n}\n\nMA_API MA_NO_INLINE int ma_strcat_s(char* dst, size_t dstSizeInBytes, const char* src)\n{\n    char* dstorig;\n\n    if (dst == 0) {\n        return 22;\n    }\n    if (dstSizeInBytes == 0) {\n        return 34;\n    }\n    if (src == 0) {\n        dst[0] = '\\0';\n        return 22;\n    }\n\n    dstorig = dst;\n\n    while (dstSizeInBytes > 0 && dst[0] != '\\0') {\n        dst += 1;\n        dstSizeInBytes -= 1;\n    }\n\n    if (dstSizeInBytes == 0) {\n        return 22;  /* Unterminated. */\n    }\n\n\n    while (dstSizeInBytes > 0 && src[0] != '\\0') {\n        *dst++ = *src++;\n        dstSizeInBytes -= 1;\n    }\n\n    if (dstSizeInBytes > 0) {\n        dst[0] = '\\0';\n    } else {\n        dstorig[0] = '\\0';\n        return 34;\n    }\n\n    return 0;\n}\n\nMA_API MA_NO_INLINE int ma_strncat_s(char* dst, size_t dstSizeInBytes, const char* src, size_t count)\n{\n    char* dstorig;\n\n    if (dst == 0) {\n        return 22;\n    }\n    if (dstSizeInBytes == 0) {\n        return 34;\n    }\n    if (src == 0) {\n        return 22;\n    }\n\n    dstorig = dst;\n\n    while (dstSizeInBytes > 0 && dst[0] != '\\0') {\n        dst += 1;\n        dstSizeInBytes -= 1;\n    }\n\n    if (dstSizeInBytes == 0) {\n        return 22;  /* Unterminated. */\n    }\n\n\n    if (count == ((size_t)-1)) {        /* _TRUNCATE */\n        count = dstSizeInBytes - 1;\n    }\n\n    while (dstSizeInBytes > 0 && src[0] != '\\0' && count > 0) {\n        *dst++ = *src++;\n        dstSizeInBytes -= 1;\n        count -= 1;\n    }\n\n    if (dstSizeInBytes > 0) {\n        dst[0] = '\\0';\n    } else {\n        dstorig[0] = '\\0';\n        return 34;\n    }\n\n    return 0;\n}\n\nMA_API MA_NO_INLINE int ma_itoa_s(int value, char* dst, size_t dstSizeInBytes, int radix)\n{\n    int sign;\n    unsigned int valueU;\n    char* dstEnd;\n\n    if (dst == NULL || dstSizeInBytes == 0) {\n        return 22;\n    }\n    if (radix < 2 || radix > 36) {\n        dst[0] = '\\0';\n        return 22;\n    }\n\n    sign = (value < 0 && radix == 10) ? -1 : 1;     /* The negative sign is only used when the base is 10. */\n\n    if (value < 0) {\n        valueU = -value;\n    } else {\n        valueU = value;\n    }\n\n    dstEnd = dst;\n    do\n    {\n        int remainder = valueU % radix;\n        if (remainder > 9) {\n            *dstEnd = (char)((remainder - 10) + 'a');\n        } else {\n            *dstEnd = (char)(remainder + '0');\n        }\n\n        dstEnd += 1;\n        dstSizeInBytes -= 1;\n        valueU /= radix;\n    } while (dstSizeInBytes > 0 && valueU > 0);\n\n    if (dstSizeInBytes == 0) {\n        dst[0] = '\\0';\n        return 22;  /* Ran out of room in the output buffer. */\n    }\n\n    if (sign < 0) {\n        *dstEnd++ = '-';\n        dstSizeInBytes -= 1;\n    }\n\n    if (dstSizeInBytes == 0) {\n        dst[0] = '\\0';\n        return 22;  /* Ran out of room in the output buffer. */\n    }\n\n    *dstEnd = '\\0';\n\n\n    /* At this point the string will be reversed. */\n    dstEnd -= 1;\n    while (dst < dstEnd) {\n        char temp = *dst;\n        *dst = *dstEnd;\n        *dstEnd = temp;\n\n        dst += 1;\n        dstEnd -= 1;\n    }\n\n    return 0;\n}\n\nMA_API MA_NO_INLINE int ma_strcmp(const char* str1, const char* str2)\n{\n    if (str1 == str2) return  0;\n\n    /* These checks differ from the standard implementation. It's not important, but I prefer it just for sanity. */\n    if (str1 == NULL) return -1;\n    if (str2 == NULL) return  1;\n\n    for (;;) {\n        if (str1[0] == '\\0') {\n            break;\n        }\n        if (str1[0] != str2[0]) {\n            break;\n        }\n\n        str1 += 1;\n        str2 += 1;\n    }\n\n    return ((unsigned char*)str1)[0] - ((unsigned char*)str2)[0];\n}\n\nMA_API MA_NO_INLINE int ma_strappend(char* dst, size_t dstSize, const char* srcA, const char* srcB)\n{\n    int result;\n\n    result = ma_strncpy_s(dst, dstSize, srcA, (size_t)-1);\n    if (result != 0) {\n        return result;\n    }\n\n    result = ma_strncat_s(dst, dstSize, srcB, (size_t)-1);\n    if (result != 0) {\n        return result;\n    }\n\n    return result;\n}\n\nMA_API MA_NO_INLINE char* ma_copy_string(const char* src, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    size_t sz;\n    char* dst;\n\n    if (src == NULL) {\n        return NULL;\n    }\n\n    sz = strlen(src)+1;\n    dst = (char*)ma_malloc(sz, pAllocationCallbacks);\n    if (dst == NULL) {\n        return NULL;\n    }\n\n    ma_strcpy_s(dst, sz, src);\n\n    return dst;\n}\n\nMA_API MA_NO_INLINE wchar_t* ma_copy_string_w(const wchar_t* src, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    size_t sz = wcslen(src)+1;\n    wchar_t* dst = (wchar_t*)ma_malloc(sz * sizeof(*dst), pAllocationCallbacks);\n    if (dst == NULL) {\n        return NULL;\n    }\n\n    ma_wcscpy_s(dst, sz, src);\n\n    return dst;\n}\n\n\n\n#include <errno.h>\nstatic ma_result ma_result_from_errno(int e)\n{\n    if (e == 0) {\n        return MA_SUCCESS;\n    }\n#ifdef EPERM\n    else if (e == EPERM) { return MA_INVALID_OPERATION; }\n#endif\n#ifdef ENOENT\n    else if (e == ENOENT) { return MA_DOES_NOT_EXIST; }\n#endif\n#ifdef ESRCH\n    else if (e == ESRCH) { return MA_DOES_NOT_EXIST; }\n#endif\n#ifdef EINTR\n    else if (e == EINTR) { return MA_INTERRUPT; }\n#endif\n#ifdef EIO\n    else if (e == EIO) { return MA_IO_ERROR; }\n#endif\n#ifdef ENXIO\n    else if (e == ENXIO) { return MA_DOES_NOT_EXIST; }\n#endif\n#ifdef E2BIG\n    else if (e == E2BIG) { return MA_INVALID_ARGS; }\n#endif\n#ifdef ENOEXEC\n    else if (e == ENOEXEC) { return MA_INVALID_FILE; }\n#endif\n#ifdef EBADF\n    else if (e == EBADF) { return MA_INVALID_FILE; }\n#endif\n#ifdef ECHILD\n    else if (e == ECHILD) { return MA_ERROR; }\n#endif\n#ifdef EAGAIN\n    else if (e == EAGAIN) { return MA_UNAVAILABLE; }\n#endif\n#ifdef ENOMEM\n    else if (e == ENOMEM) { return MA_OUT_OF_MEMORY; }\n#endif\n#ifdef EACCES\n    else if (e == EACCES) { return MA_ACCESS_DENIED; }\n#endif\n#ifdef EFAULT\n    else if (e == EFAULT) { return MA_BAD_ADDRESS; }\n#endif\n#ifdef ENOTBLK\n    else if (e == ENOTBLK) { return MA_ERROR; }\n#endif\n#ifdef EBUSY\n    else if (e == EBUSY) { return MA_BUSY; }\n#endif\n#ifdef EEXIST\n    else if (e == EEXIST) { return MA_ALREADY_EXISTS; }\n#endif\n#ifdef EXDEV\n    else if (e == EXDEV) { return MA_ERROR; }\n#endif\n#ifdef ENODEV\n    else if (e == ENODEV) { return MA_DOES_NOT_EXIST; }\n#endif\n#ifdef ENOTDIR\n    else if (e == ENOTDIR) { return MA_NOT_DIRECTORY; }\n#endif\n#ifdef EISDIR\n    else if (e == EISDIR) { return MA_IS_DIRECTORY; }\n#endif\n#ifdef EINVAL\n    else if (e == EINVAL) { return MA_INVALID_ARGS; }\n#endif\n#ifdef ENFILE\n    else if (e == ENFILE) { return MA_TOO_MANY_OPEN_FILES; }\n#endif\n#ifdef EMFILE\n    else if (e == EMFILE) { return MA_TOO_MANY_OPEN_FILES; }\n#endif\n#ifdef ENOTTY\n    else if (e == ENOTTY) { return MA_INVALID_OPERATION; }\n#endif\n#ifdef ETXTBSY\n    else if (e == ETXTBSY) { return MA_BUSY; }\n#endif\n#ifdef EFBIG\n    else if (e == EFBIG) { return MA_TOO_BIG; }\n#endif\n#ifdef ENOSPC\n    else if (e == ENOSPC) { return MA_NO_SPACE; }\n#endif\n#ifdef ESPIPE\n    else if (e == ESPIPE) { return MA_BAD_SEEK; }\n#endif\n#ifdef EROFS\n    else if (e == EROFS) { return MA_ACCESS_DENIED; }\n#endif\n#ifdef EMLINK\n    else if (e == EMLINK) { return MA_TOO_MANY_LINKS; }\n#endif\n#ifdef EPIPE\n    else if (e == EPIPE) { return MA_BAD_PIPE; }\n#endif\n#ifdef EDOM\n    else if (e == EDOM) { return MA_OUT_OF_RANGE; }\n#endif\n#ifdef ERANGE\n    else if (e == ERANGE) { return MA_OUT_OF_RANGE; }\n#endif\n#ifdef EDEADLK\n    else if (e == EDEADLK) { return MA_DEADLOCK; }\n#endif\n#ifdef ENAMETOOLONG\n    else if (e == ENAMETOOLONG) { return MA_PATH_TOO_LONG; }\n#endif\n#ifdef ENOLCK\n    else if (e == ENOLCK) { return MA_ERROR; }\n#endif\n#ifdef ENOSYS\n    else if (e == ENOSYS) { return MA_NOT_IMPLEMENTED; }\n#endif\n#ifdef ENOTEMPTY\n    else if (e == ENOTEMPTY) { return MA_DIRECTORY_NOT_EMPTY; }\n#endif\n#ifdef ELOOP\n    else if (e == ELOOP) { return MA_TOO_MANY_LINKS; }\n#endif\n#ifdef ENOMSG\n    else if (e == ENOMSG) { return MA_NO_MESSAGE; }\n#endif\n#ifdef EIDRM\n    else if (e == EIDRM) { return MA_ERROR; }\n#endif\n#ifdef ECHRNG\n    else if (e == ECHRNG) { return MA_ERROR; }\n#endif\n#ifdef EL2NSYNC\n    else if (e == EL2NSYNC) { return MA_ERROR; }\n#endif\n#ifdef EL3HLT\n    else if (e == EL3HLT) { return MA_ERROR; }\n#endif\n#ifdef EL3RST\n    else if (e == EL3RST) { return MA_ERROR; }\n#endif\n#ifdef ELNRNG\n    else if (e == ELNRNG) { return MA_OUT_OF_RANGE; }\n#endif\n#ifdef EUNATCH\n    else if (e == EUNATCH) { return MA_ERROR; }\n#endif\n#ifdef ENOCSI\n    else if (e == ENOCSI) { return MA_ERROR; }\n#endif\n#ifdef EL2HLT\n    else if (e == EL2HLT) { return MA_ERROR; }\n#endif\n#ifdef EBADE\n    else if (e == EBADE) { return MA_ERROR; }\n#endif\n#ifdef EBADR\n    else if (e == EBADR) { return MA_ERROR; }\n#endif\n#ifdef EXFULL\n    else if (e == EXFULL) { return MA_ERROR; }\n#endif\n#ifdef ENOANO\n    else if (e == ENOANO) { return MA_ERROR; }\n#endif\n#ifdef EBADRQC\n    else if (e == EBADRQC) { return MA_ERROR; }\n#endif\n#ifdef EBADSLT\n    else if (e == EBADSLT) { return MA_ERROR; }\n#endif\n#ifdef EBFONT\n    else if (e == EBFONT) { return MA_INVALID_FILE; }\n#endif\n#ifdef ENOSTR\n    else if (e == ENOSTR) { return MA_ERROR; }\n#endif\n#ifdef ENODATA\n    else if (e == ENODATA) { return MA_NO_DATA_AVAILABLE; }\n#endif\n#ifdef ETIME\n    else if (e == ETIME) { return MA_TIMEOUT; }\n#endif\n#ifdef ENOSR\n    else if (e == ENOSR) { return MA_NO_DATA_AVAILABLE; }\n#endif\n#ifdef ENONET\n    else if (e == ENONET) { return MA_NO_NETWORK; }\n#endif\n#ifdef ENOPKG\n    else if (e == ENOPKG) { return MA_ERROR; }\n#endif\n#ifdef EREMOTE\n    else if (e == EREMOTE) { return MA_ERROR; }\n#endif\n#ifdef ENOLINK\n    else if (e == ENOLINK) { return MA_ERROR; }\n#endif\n#ifdef EADV\n    else if (e == EADV) { return MA_ERROR; }\n#endif\n#ifdef ESRMNT\n    else if (e == ESRMNT) { return MA_ERROR; }\n#endif\n#ifdef ECOMM\n    else if (e == ECOMM) { return MA_ERROR; }\n#endif\n#ifdef EPROTO\n    else if (e == EPROTO) { return MA_ERROR; }\n#endif\n#ifdef EMULTIHOP\n    else if (e == EMULTIHOP) { return MA_ERROR; }\n#endif\n#ifdef EDOTDOT\n    else if (e == EDOTDOT) { return MA_ERROR; }\n#endif\n#ifdef EBADMSG\n    else if (e == EBADMSG) { return MA_BAD_MESSAGE; }\n#endif\n#ifdef EOVERFLOW\n    else if (e == EOVERFLOW) { return MA_TOO_BIG; }\n#endif\n#ifdef ENOTUNIQ\n    else if (e == ENOTUNIQ) { return MA_NOT_UNIQUE; }\n#endif\n#ifdef EBADFD\n    else if (e == EBADFD) { return MA_ERROR; }\n#endif\n#ifdef EREMCHG\n    else if (e == EREMCHG) { return MA_ERROR; }\n#endif\n#ifdef ELIBACC\n    else if (e == ELIBACC) { return MA_ACCESS_DENIED; }\n#endif\n#ifdef ELIBBAD\n    else if (e == ELIBBAD) { return MA_INVALID_FILE; }\n#endif\n#ifdef ELIBSCN\n    else if (e == ELIBSCN) { return MA_INVALID_FILE; }\n#endif\n#ifdef ELIBMAX\n    else if (e == ELIBMAX) { return MA_ERROR; }\n#endif\n#ifdef ELIBEXEC\n    else if (e == ELIBEXEC) { return MA_ERROR; }\n#endif\n#ifdef EILSEQ\n    else if (e == EILSEQ) { return MA_INVALID_DATA; }\n#endif\n#ifdef ERESTART\n    else if (e == ERESTART) { return MA_ERROR; }\n#endif\n#ifdef ESTRPIPE\n    else if (e == ESTRPIPE) { return MA_ERROR; }\n#endif\n#ifdef EUSERS\n    else if (e == EUSERS) { return MA_ERROR; }\n#endif\n#ifdef ENOTSOCK\n    else if (e == ENOTSOCK) { return MA_NOT_SOCKET; }\n#endif\n#ifdef EDESTADDRREQ\n    else if (e == EDESTADDRREQ) { return MA_NO_ADDRESS; }\n#endif\n#ifdef EMSGSIZE\n    else if (e == EMSGSIZE) { return MA_TOO_BIG; }\n#endif\n#ifdef EPROTOTYPE\n    else if (e == EPROTOTYPE) { return MA_BAD_PROTOCOL; }\n#endif\n#ifdef ENOPROTOOPT\n    else if (e == ENOPROTOOPT) { return MA_PROTOCOL_UNAVAILABLE; }\n#endif\n#ifdef EPROTONOSUPPORT\n    else if (e == EPROTONOSUPPORT) { return MA_PROTOCOL_NOT_SUPPORTED; }\n#endif\n#ifdef ESOCKTNOSUPPORT\n    else if (e == ESOCKTNOSUPPORT) { return MA_SOCKET_NOT_SUPPORTED; }\n#endif\n#ifdef EOPNOTSUPP\n    else if (e == EOPNOTSUPP) { return MA_INVALID_OPERATION; }\n#endif\n#ifdef EPFNOSUPPORT\n    else if (e == EPFNOSUPPORT) { return MA_PROTOCOL_FAMILY_NOT_SUPPORTED; }\n#endif\n#ifdef EAFNOSUPPORT\n    else if (e == EAFNOSUPPORT) { return MA_ADDRESS_FAMILY_NOT_SUPPORTED; }\n#endif\n#ifdef EADDRINUSE\n    else if (e == EADDRINUSE) { return MA_ALREADY_IN_USE; }\n#endif\n#ifdef EADDRNOTAVAIL\n    else if (e == EADDRNOTAVAIL) { return MA_ERROR; }\n#endif\n#ifdef ENETDOWN\n    else if (e == ENETDOWN) { return MA_NO_NETWORK; }\n#endif\n#ifdef ENETUNREACH\n    else if (e == ENETUNREACH) { return MA_NO_NETWORK; }\n#endif\n#ifdef ENETRESET\n    else if (e == ENETRESET) { return MA_NO_NETWORK; }\n#endif\n#ifdef ECONNABORTED\n    else if (e == ECONNABORTED) { return MA_NO_NETWORK; }\n#endif\n#ifdef ECONNRESET\n    else if (e == ECONNRESET) { return MA_CONNECTION_RESET; }\n#endif\n#ifdef ENOBUFS\n    else if (e == ENOBUFS) { return MA_NO_SPACE; }\n#endif\n#ifdef EISCONN\n    else if (e == EISCONN) { return MA_ALREADY_CONNECTED; }\n#endif\n#ifdef ENOTCONN\n    else if (e == ENOTCONN) { return MA_NOT_CONNECTED; }\n#endif\n#ifdef ESHUTDOWN\n    else if (e == ESHUTDOWN) { return MA_ERROR; }\n#endif\n#ifdef ETOOMANYREFS\n    else if (e == ETOOMANYREFS) { return MA_ERROR; }\n#endif\n#ifdef ETIMEDOUT\n    else if (e == ETIMEDOUT) { return MA_TIMEOUT; }\n#endif\n#ifdef ECONNREFUSED\n    else if (e == ECONNREFUSED) { return MA_CONNECTION_REFUSED; }\n#endif\n#ifdef EHOSTDOWN\n    else if (e == EHOSTDOWN) { return MA_NO_HOST; }\n#endif\n#ifdef EHOSTUNREACH\n    else if (e == EHOSTUNREACH) { return MA_NO_HOST; }\n#endif\n#ifdef EALREADY\n    else if (e == EALREADY) { return MA_IN_PROGRESS; }\n#endif\n#ifdef EINPROGRESS\n    else if (e == EINPROGRESS) { return MA_IN_PROGRESS; }\n#endif\n#ifdef ESTALE\n    else if (e == ESTALE) { return MA_INVALID_FILE; }\n#endif\n#ifdef EUCLEAN\n    else if (e == EUCLEAN) { return MA_ERROR; }\n#endif\n#ifdef ENOTNAM\n    else if (e == ENOTNAM) { return MA_ERROR; }\n#endif\n#ifdef ENAVAIL\n    else if (e == ENAVAIL) { return MA_ERROR; }\n#endif\n#ifdef EISNAM\n    else if (e == EISNAM) { return MA_ERROR; }\n#endif\n#ifdef EREMOTEIO\n    else if (e == EREMOTEIO) { return MA_IO_ERROR; }\n#endif\n#ifdef EDQUOT\n    else if (e == EDQUOT) { return MA_NO_SPACE; }\n#endif\n#ifdef ENOMEDIUM\n    else if (e == ENOMEDIUM) { return MA_DOES_NOT_EXIST; }\n#endif\n#ifdef EMEDIUMTYPE\n    else if (e == EMEDIUMTYPE) { return MA_ERROR; }\n#endif\n#ifdef ECANCELED\n    else if (e == ECANCELED) { return MA_CANCELLED; }\n#endif\n#ifdef ENOKEY\n    else if (e == ENOKEY) { return MA_ERROR; }\n#endif\n#ifdef EKEYEXPIRED\n    else if (e == EKEYEXPIRED) { return MA_ERROR; }\n#endif\n#ifdef EKEYREVOKED\n    else if (e == EKEYREVOKED) { return MA_ERROR; }\n#endif\n#ifdef EKEYREJECTED\n    else if (e == EKEYREJECTED) { return MA_ERROR; }\n#endif\n#ifdef EOWNERDEAD\n    else if (e == EOWNERDEAD) { return MA_ERROR; }\n#endif\n#ifdef ENOTRECOVERABLE\n    else if (e == ENOTRECOVERABLE) { return MA_ERROR; }\n#endif\n#ifdef ERFKILL\n    else if (e == ERFKILL) { return MA_ERROR; }\n#endif\n#ifdef EHWPOISON\n    else if (e == EHWPOISON) { return MA_ERROR; }\n#endif\n    else {\n        return MA_ERROR;\n    }\n}\n\nMA_API ma_result ma_fopen(FILE** ppFile, const char* pFilePath, const char* pOpenMode)\n{\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n    errno_t err;\n#endif\n\n    if (ppFile != NULL) {\n        *ppFile = NULL;  /* Safety. */\n    }\n\n    if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n    err = fopen_s(ppFile, pFilePath, pOpenMode);\n    if (err != 0) {\n        return ma_result_from_errno(err);\n    }\n#else\n#if defined(_WIN32) || defined(__APPLE__)\n    *ppFile = fopen(pFilePath, pOpenMode);\n#else\n    #if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64 && defined(_LARGEFILE64_SOURCE)\n        *ppFile = fopen64(pFilePath, pOpenMode);\n    #else\n        *ppFile = fopen(pFilePath, pOpenMode);\n    #endif\n#endif\n    if (*ppFile == NULL) {\n        ma_result result = ma_result_from_errno(errno);\n        if (result == MA_SUCCESS) {\n            result = MA_ERROR;   /* Just a safety check to make sure we never ever return success when pFile == NULL. */\n        }\n\n        return result;\n    }\n#endif\n\n    return MA_SUCCESS;\n}\n\n\n\n/*\n_wfopen() isn't always available in all compilation environments.\n\n    * Windows only.\n    * MSVC seems to support it universally as far back as VC6 from what I can tell (haven't checked further back).\n    * MinGW-64 (both 32- and 64-bit) seems to support it.\n    * MinGW wraps it in !defined(__STRICT_ANSI__).\n    * OpenWatcom wraps it in !defined(_NO_EXT_KEYS).\n\nThis can be reviewed as compatibility issues arise. The preference is to use _wfopen_s() and _wfopen() as opposed to the wcsrtombs()\nfallback, so if you notice your compiler not detecting this properly I'm happy to look at adding support.\n*/\n#if defined(_WIN32)\n    #if defined(_MSC_VER) || defined(__MINGW64__) || (!defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS))\n        #define MA_HAS_WFOPEN\n    #endif\n#endif\n\nMA_API ma_result ma_wfopen(FILE** ppFile, const wchar_t* pFilePath, const wchar_t* pOpenMode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (ppFile != NULL) {\n        *ppFile = NULL;  /* Safety. */\n    }\n\n    if (pFilePath == NULL || pOpenMode == NULL || ppFile == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_HAS_WFOPEN)\n    {\n        /* Use _wfopen() on Windows. */\n    #if defined(_MSC_VER) && _MSC_VER >= 1400\n        errno_t err = _wfopen_s(ppFile, pFilePath, pOpenMode);\n        if (err != 0) {\n            return ma_result_from_errno(err);\n        }\n    #else\n        *ppFile = _wfopen(pFilePath, pOpenMode);\n        if (*ppFile == NULL) {\n            return ma_result_from_errno(errno);\n        }\n    #endif\n        (void)pAllocationCallbacks;\n    }\n#else\n    /*\n    Use fopen() on anything other than Windows. Requires a conversion. This is annoying because fopen() is locale specific. The only real way I can\n    think of to do this is with wcsrtombs(). Note that wcstombs() is apparently not thread-safe because it uses a static global mbstate_t object for\n    maintaining state. I've checked this with -std=c89 and it works, but if somebody get's a compiler error I'll look into improving compatibility.\n    */\n    {\n        mbstate_t mbs;\n        size_t lenMB;\n        const wchar_t* pFilePathTemp = pFilePath;\n        char* pFilePathMB = NULL;\n        char pOpenModeMB[32] = {0};\n\n        /* Get the length first. */\n        MA_ZERO_OBJECT(&mbs);\n        lenMB = wcsrtombs(NULL, &pFilePathTemp, 0, &mbs);\n        if (lenMB == (size_t)-1) {\n            return ma_result_from_errno(errno);\n        }\n\n        pFilePathMB = (char*)ma_malloc(lenMB + 1, pAllocationCallbacks);\n        if (pFilePathMB == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n\n        pFilePathTemp = pFilePath;\n        MA_ZERO_OBJECT(&mbs);\n        wcsrtombs(pFilePathMB, &pFilePathTemp, lenMB + 1, &mbs);\n\n        /* The open mode should always consist of ASCII characters so we should be able to do a trivial conversion. */\n        {\n            size_t i = 0;\n            for (;;) {\n                if (pOpenMode[i] == 0) {\n                    pOpenModeMB[i] = '\\0';\n                    break;\n                }\n\n                pOpenModeMB[i] = (char)pOpenMode[i];\n                i += 1;\n            }\n        }\n\n        *ppFile = fopen(pFilePathMB, pOpenModeMB);\n\n        ma_free(pFilePathMB, pAllocationCallbacks);\n    }\n\n    if (*ppFile == NULL) {\n        return MA_ERROR;\n    }\n#endif\n\n    return MA_SUCCESS;\n}\n\n\n\nstatic MA_INLINE void ma_copy_memory_64(void* dst, const void* src, ma_uint64 sizeInBytes)\n{\n#if 0xFFFFFFFFFFFFFFFF <= MA_SIZE_MAX\n    MA_COPY_MEMORY(dst, src, (size_t)sizeInBytes);\n#else\n    while (sizeInBytes > 0) {\n        ma_uint64 bytesToCopyNow = sizeInBytes;\n        if (bytesToCopyNow > MA_SIZE_MAX) {\n            bytesToCopyNow = MA_SIZE_MAX;\n        }\n\n        MA_COPY_MEMORY(dst, src, (size_t)bytesToCopyNow);  /* Safe cast to size_t. */\n\n        sizeInBytes -= bytesToCopyNow;\n        dst = (      void*)((      ma_uint8*)dst + bytesToCopyNow);\n        src = (const void*)((const ma_uint8*)src + bytesToCopyNow);\n    }\n#endif\n}\n\nstatic MA_INLINE void ma_zero_memory_64(void* dst, ma_uint64 sizeInBytes)\n{\n#if 0xFFFFFFFFFFFFFFFF <= MA_SIZE_MAX\n    MA_ZERO_MEMORY(dst, (size_t)sizeInBytes);\n#else\n    while (sizeInBytes > 0) {\n        ma_uint64 bytesToZeroNow = sizeInBytes;\n        if (bytesToZeroNow > MA_SIZE_MAX) {\n            bytesToZeroNow = MA_SIZE_MAX;\n        }\n\n        MA_ZERO_MEMORY(dst, (size_t)bytesToZeroNow);  /* Safe cast to size_t. */\n\n        sizeInBytes -= bytesToZeroNow;\n        dst = (void*)((ma_uint8*)dst + bytesToZeroNow);\n    }\n#endif\n}\n\n\n/* Thanks to good old Bit Twiddling Hacks for this one: http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2 */\nstatic MA_INLINE unsigned int ma_next_power_of_2(unsigned int x)\n{\n    x--;\n    x |= x >> 1;\n    x |= x >> 2;\n    x |= x >> 4;\n    x |= x >> 8;\n    x |= x >> 16;\n    x++;\n\n    return x;\n}\n\nstatic MA_INLINE unsigned int ma_prev_power_of_2(unsigned int x)\n{\n    return ma_next_power_of_2(x) >> 1;\n}\n\nstatic MA_INLINE unsigned int ma_round_to_power_of_2(unsigned int x)\n{\n    unsigned int prev = ma_prev_power_of_2(x);\n    unsigned int next = ma_next_power_of_2(x);\n    if ((next - x) > (x - prev)) {\n        return prev;\n    } else {\n        return next;\n    }\n}\n\nstatic MA_INLINE unsigned int ma_count_set_bits(unsigned int x)\n{\n    unsigned int count = 0;\n    while (x != 0) {\n        if (x & 1) {\n            count += 1;\n        }\n\n        x = x >> 1;\n    }\n\n    return count;\n}\n\n\n\n/**************************************************************************************************************************************************************\n\nAllocation Callbacks\n\n**************************************************************************************************************************************************************/\nstatic void* ma__malloc_default(size_t sz, void* pUserData)\n{\n    (void)pUserData;\n    return MA_MALLOC(sz);\n}\n\nstatic void* ma__realloc_default(void* p, size_t sz, void* pUserData)\n{\n    (void)pUserData;\n    return MA_REALLOC(p, sz);\n}\n\nstatic void ma__free_default(void* p, void* pUserData)\n{\n    (void)pUserData;\n    MA_FREE(p);\n}\n\nstatic ma_allocation_callbacks ma_allocation_callbacks_init_default(void)\n{\n    ma_allocation_callbacks callbacks;\n    callbacks.pUserData = NULL;\n    callbacks.onMalloc  = ma__malloc_default;\n    callbacks.onRealloc = ma__realloc_default;\n    callbacks.onFree    = ma__free_default;\n\n    return callbacks;\n}\n\nstatic ma_result ma_allocation_callbacks_init_copy(ma_allocation_callbacks* pDst, const ma_allocation_callbacks* pSrc)\n{\n    if (pDst == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pSrc == NULL) {\n        *pDst = ma_allocation_callbacks_init_default();\n    } else {\n        if (pSrc->pUserData == NULL && pSrc->onFree == NULL && pSrc->onMalloc == NULL && pSrc->onRealloc == NULL) {\n            *pDst = ma_allocation_callbacks_init_default();\n        } else {\n            if (pSrc->onFree == NULL || (pSrc->onMalloc == NULL && pSrc->onRealloc == NULL)) {\n                return MA_INVALID_ARGS;    /* Invalid allocation callbacks. */\n            } else {\n                *pDst = *pSrc;\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n\n\n\n/**************************************************************************************************************************************************************\n\nLogging\n\n**************************************************************************************************************************************************************/\nMA_API const char* ma_log_level_to_string(ma_uint32 logLevel)\n{\n    switch (logLevel)\n    {\n        case MA_LOG_LEVEL_DEBUG:   return \"DEBUG\";\n        case MA_LOG_LEVEL_INFO:    return \"INFO\";\n        case MA_LOG_LEVEL_WARNING: return \"WARNING\";\n        case MA_LOG_LEVEL_ERROR:   return \"ERROR\";\n        default:                   return \"ERROR\";\n    }\n}\n\n#if defined(MA_DEBUG_OUTPUT)\n#if defined(MA_ANDROID)\n    #include <android/log.h>\n#endif\n\n/* Customize this to use a specific tag in __android_log_print() for debug output messages. */\n#ifndef MA_ANDROID_LOG_TAG\n#define MA_ANDROID_LOG_TAG  \"miniaudio\"\n#endif\n\nvoid ma_log_callback_debug(void* pUserData, ma_uint32 level, const char* pMessage)\n{\n    (void)pUserData;\n\n    /* Special handling for some platforms. */\n    #if defined(MA_ANDROID)\n    {\n        /* Android. */\n        __android_log_print(ANDROID_LOG_DEBUG, MA_ANDROID_LOG_TAG, \"%s: %s\", ma_log_level_to_string(level), pMessage);\n    }\n    #else\n    {\n        /* Everything else. */\n        printf(\"%s: %s\", ma_log_level_to_string(level), pMessage);\n    }\n    #endif\n}\n#endif\n\nMA_API ma_log_callback ma_log_callback_init(ma_log_callback_proc onLog, void* pUserData)\n{\n    ma_log_callback callback;\n\n    MA_ZERO_OBJECT(&callback);\n    callback.onLog     = onLog;\n    callback.pUserData = pUserData;\n\n    return callback;\n}\n\n\nMA_API ma_result ma_log_init(const ma_allocation_callbacks* pAllocationCallbacks, ma_log* pLog)\n{\n    if (pLog == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pLog);\n    ma_allocation_callbacks_init_copy(&pLog->allocationCallbacks, pAllocationCallbacks);\n\n    /* We need a mutex for thread safety. */\n    #ifndef MA_NO_THREADING\n    {\n        ma_result result = ma_mutex_init(&pLog->lock);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n    #endif\n\n    /* If we're using debug output, enable it. */\n    #if defined(MA_DEBUG_OUTPUT)\n    {\n        ma_log_register_callback(pLog, ma_log_callback_init(ma_log_callback_debug, NULL)); /* Doesn't really matter if this fails. */\n    }\n    #endif\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_log_uninit(ma_log* pLog)\n{\n    if (pLog == NULL) {\n        return;\n    }\n\n#ifndef MA_NO_THREADING\n    ma_mutex_uninit(&pLog->lock);\n#endif\n}\n\nstatic void ma_log_lock(ma_log* pLog)\n{\n#ifndef MA_NO_THREADING\n    ma_mutex_lock(&pLog->lock);\n#else\n    (void)pLog;\n#endif\n}\n\nstatic void ma_log_unlock(ma_log* pLog)\n{\n#ifndef MA_NO_THREADING\n    ma_mutex_unlock(&pLog->lock);\n#else\n    (void)pLog;\n#endif\n}\n\nMA_API ma_result ma_log_register_callback(ma_log* pLog, ma_log_callback callback)\n{\n    ma_result result = MA_SUCCESS;\n\n    if (pLog == NULL || callback.onLog == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_log_lock(pLog);\n    {\n        if (pLog->callbackCount == ma_countof(pLog->callbacks)) {\n            result = MA_OUT_OF_MEMORY;  /* Reached the maximum allowed log callbacks. */\n        } else {\n            pLog->callbacks[pLog->callbackCount] = callback;\n            pLog->callbackCount += 1;\n        }\n    }\n    ma_log_unlock(pLog);\n\n    return result;\n}\n\nMA_API ma_result ma_log_unregister_callback(ma_log* pLog, ma_log_callback callback)\n{\n    if (pLog == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_log_lock(pLog);\n    {\n        ma_uint32 iLog;\n        for (iLog = 0; iLog < pLog->callbackCount; ) {\n            if (pLog->callbacks[iLog].onLog == callback.onLog) {\n                /* Found. Move everything down a slot. */\n                ma_uint32 jLog;\n                for (jLog = iLog; jLog < pLog->callbackCount-1; jLog += 1) {\n                    pLog->callbacks[jLog] = pLog->callbacks[jLog + 1];\n                }\n\n                pLog->callbackCount -= 1;\n            } else {\n                /* Not found. */\n                iLog += 1;\n            }\n        }\n    }\n    ma_log_unlock(pLog);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_log_post(ma_log* pLog, ma_uint32 level, const char* pMessage)\n{\n    if (pLog == NULL || pMessage == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_log_lock(pLog);\n    {\n        ma_uint32 iLog;\n        for (iLog = 0; iLog < pLog->callbackCount; iLog += 1) {\n            if (pLog->callbacks[iLog].onLog) {\n                pLog->callbacks[iLog].onLog(pLog->callbacks[iLog].pUserData, level, pMessage);\n            }\n        }\n    }\n    ma_log_unlock(pLog);\n\n    return MA_SUCCESS;\n}\n\n\n/*\nWe need to emulate _vscprintf() for the VC6 build. This can be more efficient, but since it's only VC6, and it's just a\nlogging function, I'm happy to keep this simple. In the VC6 build we can implement this in terms of _vsnprintf().\n*/\n#if defined(_MSC_VER) && _MSC_VER < 1900\nstatic int ma_vscprintf(const ma_allocation_callbacks* pAllocationCallbacks, const char* format, va_list args)\n{\n#if _MSC_VER > 1200\n    return _vscprintf(format, args);\n#else\n    int result;\n    char* pTempBuffer = NULL;\n    size_t tempBufferCap = 1024;\n\n    if (format == NULL) {\n        errno = EINVAL;\n        return -1;\n    }\n\n    for (;;) {\n        char* pNewTempBuffer = (char*)ma_realloc(pTempBuffer, tempBufferCap, pAllocationCallbacks);\n        if (pNewTempBuffer == NULL) {\n            ma_free(pTempBuffer, pAllocationCallbacks);\n            errno = ENOMEM;\n            return -1;  /* Out of memory. */\n        }\n\n        pTempBuffer = pNewTempBuffer;\n\n        result = _vsnprintf(pTempBuffer, tempBufferCap, format, args);\n        ma_free(pTempBuffer, NULL);\n\n        if (result != -1) {\n            break;  /* Got it. */\n        }\n\n        /* Buffer wasn't big enough. Ideally it'd be nice to use an error code to know the reason for sure, but this is reliable enough. */\n        tempBufferCap *= 2;\n    }\n\n    return result;\n#endif\n}\n#endif\n\nMA_API ma_result ma_log_postv(ma_log* pLog, ma_uint32 level, const char* pFormat, va_list args)\n{\n    if (pLog == NULL || pFormat == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || ((!defined(_MSC_VER) || _MSC_VER >= 1900) && !defined(__STRICT_ANSI__) && !defined(_NO_EXT_KEYS)) || (defined(__cplusplus) && __cplusplus >= 201103L)\n    {\n        ma_result result;\n        int length;\n        char  pFormattedMessageStack[1024];\n        char* pFormattedMessageHeap = NULL;\n\n        /* First try formatting into our fixed sized stack allocated buffer. If this is too small we'll fallback to a heap allocation. */\n        length = vsnprintf(pFormattedMessageStack, sizeof(pFormattedMessageStack), pFormat, args);\n        if (length < 0) {\n            return MA_INVALID_OPERATION;    /* An error occurred when trying to convert the buffer. */\n        }\n\n        if ((size_t)length < sizeof(pFormattedMessageStack)) {\n            /* The string was written to the stack. */\n            result = ma_log_post(pLog, level, pFormattedMessageStack);\n        } else {\n            /* The stack buffer was too small, try the heap. */\n            pFormattedMessageHeap = (char*)ma_malloc(length + 1, &pLog->allocationCallbacks);\n            if (pFormattedMessageHeap == NULL) {\n                return MA_OUT_OF_MEMORY;\n            }\n\n            length = vsnprintf(pFormattedMessageHeap, length + 1, pFormat, args);\n            if (length < 0) {\n                ma_free(pFormattedMessageHeap, &pLog->allocationCallbacks);\n                return MA_INVALID_OPERATION;\n            }\n\n            result = ma_log_post(pLog, level, pFormattedMessageHeap);\n            ma_free(pFormattedMessageHeap, &pLog->allocationCallbacks);\n        }\n\n        return result;\n    }\n    #else\n    {\n        /*\n        Without snprintf() we need to first measure the string and then heap allocate it. I'm only aware of Visual Studio having support for this without snprintf(), so we'll\n        need to restrict this branch to Visual Studio. For other compilers we need to just not support formatted logging because I don't want the security risk of overflowing\n        a fixed sized stack allocated buffer.\n        */\n        #if defined(_MSC_VER) && _MSC_VER >= 1200   /* 1200 = VC6 */\n        {\n            ma_result result;\n            int formattedLen;\n            char* pFormattedMessage = NULL;\n            va_list args2;\n\n            #if _MSC_VER >= 1800\n            {\n                va_copy(args2, args);\n            }\n            #else\n            {\n                args2 = args;\n            }\n            #endif\n\n            formattedLen = ma_vscprintf(&pLog->allocationCallbacks, pFormat, args2);\n            va_end(args2);\n\n            if (formattedLen <= 0) {\n                return MA_INVALID_OPERATION;\n            }\n\n            pFormattedMessage = (char*)ma_malloc(formattedLen + 1, &pLog->allocationCallbacks);\n            if (pFormattedMessage == NULL) {\n                return MA_OUT_OF_MEMORY;\n            }\n\n            /* We'll get errors on newer versions of Visual Studio if we try to use vsprintf().  */\n            #if _MSC_VER >= 1400    /* 1400 = Visual Studio 2005 */\n            {\n                vsprintf_s(pFormattedMessage, formattedLen + 1, pFormat, args);\n            }\n            #else\n            {\n                vsprintf(pFormattedMessage, pFormat, args);\n            }\n            #endif\n\n            result = ma_log_post(pLog, level, pFormattedMessage);\n            ma_free(pFormattedMessage, &pLog->allocationCallbacks);\n\n            return result;\n        }\n        #else\n        {\n            /* Can't do anything because we don't have a safe way of to emulate vsnprintf() without a manual solution. */\n            (void)level;\n            (void)args;\n\n            return MA_INVALID_OPERATION;\n        }\n        #endif\n    }\n    #endif\n}\n\nMA_API ma_result ma_log_postf(ma_log* pLog, ma_uint32 level, const char* pFormat, ...)\n{\n    ma_result result;\n    va_list args;\n\n    if (pLog == NULL || pFormat == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    va_start(args, pFormat);\n    {\n        result = ma_log_postv(pLog, level, pFormat, args);\n    }\n    va_end(args);\n\n    return result;\n}\n\n\n\nstatic MA_INLINE ma_uint8 ma_clip_u8(ma_int32 x)\n{\n    return (ma_uint8)(ma_clamp(x, -128, 127) + 128);\n}\n\nstatic MA_INLINE ma_int16 ma_clip_s16(ma_int32 x)\n{\n    return (ma_int16)ma_clamp(x, -32768, 32767);\n}\n\nstatic MA_INLINE ma_int64 ma_clip_s24(ma_int64 x)\n{\n    return (ma_int64)ma_clamp(x, -8388608, 8388607);\n}\n\nstatic MA_INLINE ma_int32 ma_clip_s32(ma_int64 x)\n{\n    /* This dance is to silence warnings with -std=c89. A good compiler should be able to optimize this away. */\n    ma_int64 clipMin;\n    ma_int64 clipMax;\n    clipMin = -((ma_int64)2147483647 + 1);\n    clipMax =   (ma_int64)2147483647;\n\n    return (ma_int32)ma_clamp(x, clipMin, clipMax);\n}\n\nstatic MA_INLINE float ma_clip_f32(float x)\n{\n    if (x < -1) return -1;\n    if (x > +1) return +1;\n    return x;\n}\n\n\nstatic MA_INLINE float ma_mix_f32(float x, float y, float a)\n{\n    return x*(1-a) + y*a;\n}\nstatic MA_INLINE float ma_mix_f32_fast(float x, float y, float a)\n{\n    float r0 = (y - x);\n    float r1 = r0*a;\n    return x + r1;\n    /*return x + (y - x)*a;*/\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE __m128 ma_mix_f32_fast__sse2(__m128 x, __m128 y, __m128 a)\n{\n    return _mm_add_ps(x, _mm_mul_ps(_mm_sub_ps(y, x), a));\n}\n#endif\n#if defined(MA_SUPPORT_AVX2)\nstatic MA_INLINE __m256 ma_mix_f32_fast__avx2(__m256 x, __m256 y, __m256 a)\n{\n    return _mm256_add_ps(x, _mm256_mul_ps(_mm256_sub_ps(y, x), a));\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE float32x4_t ma_mix_f32_fast__neon(float32x4_t x, float32x4_t y, float32x4_t a)\n{\n    return vaddq_f32(x, vmulq_f32(vsubq_f32(y, x), a));\n}\n#endif\n\n\nstatic MA_INLINE double ma_mix_f64(double x, double y, double a)\n{\n    return x*(1-a) + y*a;\n}\nstatic MA_INLINE double ma_mix_f64_fast(double x, double y, double a)\n{\n    return x + (y - x)*a;\n}\n\nstatic MA_INLINE float ma_scale_to_range_f32(float x, float lo, float hi)\n{\n    return lo + x*(hi-lo);\n}\n\n\n/*\nGreatest common factor using Euclid's algorithm iteratively.\n*/\nstatic MA_INLINE ma_uint32 ma_gcf_u32(ma_uint32 a, ma_uint32 b)\n{\n    for (;;) {\n        if (b == 0) {\n            break;\n        } else {\n            ma_uint32 t = a;\n            a = b;\n            b = t % a;\n        }\n    }\n\n    return a;\n}\n\n\nstatic ma_uint32 ma_ffs_32(ma_uint32 x)\n{\n    ma_uint32 i;\n\n    /* Just a naive implementation just to get things working for now. Will optimize this later. */\n    for (i = 0; i < 32; i += 1) {\n        if ((x & (1 << i)) != 0) {\n            return i;\n        }\n    }\n\n    return i;\n}\n\nstatic MA_INLINE ma_int16 ma_float_to_fixed_16(float x)\n{\n    return (ma_int16)(x * (1 << 8));\n}\n\n\n\n/*\nRandom Number Generation\n\nminiaudio uses the LCG random number generation algorithm. This is good enough for audio.\n\nNote that miniaudio's global LCG implementation uses global state which is _not_ thread-local. When this is called across\nmultiple threads, results will be unpredictable. However, it won't crash and results will still be random enough for\nminiaudio's purposes.\n*/\n#ifndef MA_DEFAULT_LCG_SEED\n#define MA_DEFAULT_LCG_SEED 4321\n#endif\n\n#define MA_LCG_M   2147483647\n#define MA_LCG_A   48271\n#define MA_LCG_C   0\n\nstatic ma_lcg g_maLCG = {MA_DEFAULT_LCG_SEED}; /* Non-zero initial seed. Use ma_seed() to use an explicit seed. */\n\nstatic MA_INLINE void ma_lcg_seed(ma_lcg* pLCG, ma_int32 seed)\n{\n    MA_ASSERT(pLCG != NULL);\n    pLCG->state = seed;\n}\n\nstatic MA_INLINE ma_int32 ma_lcg_rand_s32(ma_lcg* pLCG)\n{\n    pLCG->state = (MA_LCG_A * pLCG->state + MA_LCG_C) % MA_LCG_M;\n    return pLCG->state;\n}\n\nstatic MA_INLINE ma_uint32 ma_lcg_rand_u32(ma_lcg* pLCG)\n{\n    return (ma_uint32)ma_lcg_rand_s32(pLCG);\n}\n\nstatic MA_INLINE ma_int16 ma_lcg_rand_s16(ma_lcg* pLCG)\n{\n    return (ma_int16)(ma_lcg_rand_s32(pLCG) & 0xFFFF);\n}\n\nstatic MA_INLINE double ma_lcg_rand_f64(ma_lcg* pLCG)\n{\n    return ma_lcg_rand_s32(pLCG) / (double)0x7FFFFFFF;\n}\n\nstatic MA_INLINE float ma_lcg_rand_f32(ma_lcg* pLCG)\n{\n    return (float)ma_lcg_rand_f64(pLCG);\n}\n\nstatic MA_INLINE float ma_lcg_rand_range_f32(ma_lcg* pLCG, float lo, float hi)\n{\n    return ma_scale_to_range_f32(ma_lcg_rand_f32(pLCG), lo, hi);\n}\n\nstatic MA_INLINE ma_int32 ma_lcg_rand_range_s32(ma_lcg* pLCG, ma_int32 lo, ma_int32 hi)\n{\n    if (lo == hi) {\n        return lo;\n    }\n\n    return lo + ma_lcg_rand_u32(pLCG) / (0xFFFFFFFF / (hi - lo + 1) + 1);\n}\n\n\n\nstatic MA_INLINE void ma_seed(ma_int32 seed)\n{\n    ma_lcg_seed(&g_maLCG, seed);\n}\n\nstatic MA_INLINE ma_int32 ma_rand_s32(void)\n{\n    return ma_lcg_rand_s32(&g_maLCG);\n}\n\nstatic MA_INLINE ma_uint32 ma_rand_u32(void)\n{\n    return ma_lcg_rand_u32(&g_maLCG);\n}\n\nstatic MA_INLINE double ma_rand_f64(void)\n{\n    return ma_lcg_rand_f64(&g_maLCG);\n}\n\nstatic MA_INLINE float ma_rand_f32(void)\n{\n    return ma_lcg_rand_f32(&g_maLCG);\n}\n\nstatic MA_INLINE float ma_rand_range_f32(float lo, float hi)\n{\n    return ma_lcg_rand_range_f32(&g_maLCG, lo, hi);\n}\n\nstatic MA_INLINE ma_int32 ma_rand_range_s32(ma_int32 lo, ma_int32 hi)\n{\n    return ma_lcg_rand_range_s32(&g_maLCG, lo, hi);\n}\n\n\nstatic MA_INLINE float ma_dither_f32_rectangle(float ditherMin, float ditherMax)\n{\n    return ma_rand_range_f32(ditherMin, ditherMax);\n}\n\nstatic MA_INLINE float ma_dither_f32_triangle(float ditherMin, float ditherMax)\n{\n    float a = ma_rand_range_f32(ditherMin, 0);\n    float b = ma_rand_range_f32(0, ditherMax);\n    return a + b;\n}\n\nstatic MA_INLINE float ma_dither_f32(ma_dither_mode ditherMode, float ditherMin, float ditherMax)\n{\n    if (ditherMode == ma_dither_mode_rectangle) {\n        return ma_dither_f32_rectangle(ditherMin, ditherMax);\n    }\n    if (ditherMode == ma_dither_mode_triangle) {\n        return ma_dither_f32_triangle(ditherMin, ditherMax);\n    }\n\n    return 0;\n}\n\nstatic MA_INLINE ma_int32 ma_dither_s32(ma_dither_mode ditherMode, ma_int32 ditherMin, ma_int32 ditherMax)\n{\n    if (ditherMode == ma_dither_mode_rectangle) {\n        ma_int32 a = ma_rand_range_s32(ditherMin, ditherMax);\n        return a;\n    }\n    if (ditherMode == ma_dither_mode_triangle) {\n        ma_int32 a = ma_rand_range_s32(ditherMin, 0);\n        ma_int32 b = ma_rand_range_s32(0, ditherMax);\n        return a + b;\n    }\n\n    return 0;\n}\n\n\n/**************************************************************************************************************************************************************\n\nAtomics\n\n**************************************************************************************************************************************************************/\n/* ma_atomic.h begin */\n#ifndef ma_atomic_h\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wlong-long\"\n    #if defined(__clang__)\n        #pragma GCC diagnostic ignored \"-Wc++11-long-long\"\n    #endif\n#endif\ntypedef int ma_atomic_memory_order;\n#define MA_ATOMIC_HAS_8\n#define MA_ATOMIC_HAS_16\n#define MA_ATOMIC_HAS_32\n#define MA_ATOMIC_HAS_64\n#if (defined(_MSC_VER) ) || defined(__WATCOMC__) || defined(__DMC__)\n    #define MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, intrin, ma_atomicType, msvcType)   \\\n        ma_atomicType result; \\\n        switch (order) \\\n        { \\\n            case ma_atomic_memory_order_relaxed: \\\n            { \\\n                result = (ma_atomicType)intrin##_nf((volatile msvcType*)dst, (msvcType)src); \\\n            } break; \\\n            case ma_atomic_memory_order_consume: \\\n            case ma_atomic_memory_order_acquire: \\\n            { \\\n                result = (ma_atomicType)intrin##_acq((volatile msvcType*)dst, (msvcType)src); \\\n            } break; \\\n            case ma_atomic_memory_order_release: \\\n            { \\\n                result = (ma_atomicType)intrin##_rel((volatile msvcType*)dst, (msvcType)src); \\\n            } break; \\\n            case ma_atomic_memory_order_acq_rel: \\\n            case ma_atomic_memory_order_seq_cst: \\\n            default: \\\n            { \\\n                result = (ma_atomicType)intrin((volatile msvcType*)dst, (msvcType)src); \\\n            } break; \\\n        } \\\n        return result;\n    #define MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, expected, desired, order, intrin, ma_atomicType, msvcType)   \\\n        ma_atomicType result; \\\n        switch (order) \\\n        { \\\n            case ma_atomic_memory_order_relaxed: \\\n            { \\\n                result = (ma_atomicType)intrin##_nf((volatile msvcType*)ptr, (msvcType)expected, (msvcType)desired); \\\n            } break; \\\n            case ma_atomic_memory_order_consume: \\\n            case ma_atomic_memory_order_acquire: \\\n            { \\\n                result = (ma_atomicType)intrin##_acq((volatile msvcType*)ptr, (msvcType)expected, (msvcType)desired); \\\n            } break; \\\n            case ma_atomic_memory_order_release: \\\n            { \\\n                result = (ma_atomicType)intrin##_rel((volatile msvcType*)ptr, (msvcType)expected, (msvcType)desired); \\\n            } break; \\\n            case ma_atomic_memory_order_acq_rel: \\\n            case ma_atomic_memory_order_seq_cst: \\\n            default: \\\n            { \\\n                result = (ma_atomicType)intrin((volatile msvcType*)ptr, (msvcType)expected, (msvcType)desired); \\\n            } break; \\\n        } \\\n        return result;\n    #define ma_atomic_memory_order_relaxed  0\n    #define ma_atomic_memory_order_consume  1\n    #define ma_atomic_memory_order_acquire  2\n    #define ma_atomic_memory_order_release  3\n    #define ma_atomic_memory_order_acq_rel  4\n    #define ma_atomic_memory_order_seq_cst  5\n    #if _MSC_VER < 1600 && defined(MA_X86)\n        #define MA_ATOMIC_MSVC_USE_INLINED_ASSEMBLY\n    #endif\n    #if _MSC_VER < 1600\n        #undef MA_ATOMIC_HAS_8\n        #undef MA_ATOMIC_HAS_16\n    #endif\n    #if !defined(MA_ATOMIC_MSVC_USE_INLINED_ASSEMBLY)\n        #include <intrin.h>\n    #endif\n    #if defined(MA_ATOMIC_MSVC_USE_INLINED_ASSEMBLY)\n        #if defined(MA_ATOMIC_HAS_8)\n            static MA_INLINE ma_uint8 __stdcall ma_atomic_compare_and_swap_8(volatile ma_uint8* dst, ma_uint8 expected, ma_uint8 desired)\n            {\n                ma_uint8 result = 0;\n                __asm {\n                    mov ecx, dst\n                    mov al,  expected\n                    mov dl,  desired\n                    lock cmpxchg [ecx], dl\n                    mov result, al\n                }\n                return result;\n            }\n        #endif\n        #if defined(MA_ATOMIC_HAS_16)\n            static MA_INLINE ma_uint16 __stdcall ma_atomic_compare_and_swap_16(volatile ma_uint16* dst, ma_uint16 expected, ma_uint16 desired)\n            {\n                ma_uint16 result = 0;\n                __asm {\n                    mov ecx, dst\n                    mov ax,  expected\n                    mov dx,  desired\n                    lock cmpxchg [ecx], dx\n                    mov result, ax\n                }\n                return result;\n            }\n        #endif\n        #if defined(MA_ATOMIC_HAS_32)\n            static MA_INLINE ma_uint32 __stdcall ma_atomic_compare_and_swap_32(volatile ma_uint32* dst, ma_uint32 expected, ma_uint32 desired)\n            {\n                ma_uint32 result = 0;\n                __asm {\n                    mov ecx, dst\n                    mov eax, expected\n                    mov edx, desired\n                    lock cmpxchg [ecx], edx\n                    mov result, eax\n                }\n                return result;\n            }\n        #endif\n        #if defined(MA_ATOMIC_HAS_64)\n            static MA_INLINE ma_uint64 __stdcall ma_atomic_compare_and_swap_64(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 desired)\n            {\n                ma_uint32 resultEAX = 0;\n                ma_uint32 resultEDX = 0;\n                __asm {\n                    mov esi, dst\n                    mov eax, dword ptr expected\n                    mov edx, dword ptr expected + 4\n                    mov ebx, dword ptr desired\n                    mov ecx, dword ptr desired + 4\n                    lock cmpxchg8b qword ptr [esi]\n                    mov resultEAX, eax\n                    mov resultEDX, edx\n                }\n                return ((ma_uint64)resultEDX << 32) | resultEAX;\n            }\n        #endif\n    #else\n        #if defined(MA_ATOMIC_HAS_8)\n            #define ma_atomic_compare_and_swap_8( dst, expected, desired) (ma_uint8 )_InterlockedCompareExchange8((volatile char*)dst, (char)desired, (char)expected)\n        #endif\n        #if defined(MA_ATOMIC_HAS_16)\n            #define ma_atomic_compare_and_swap_16(dst, expected, desired) (ma_uint16)_InterlockedCompareExchange16((volatile short*)dst, (short)desired, (short)expected)\n        #endif\n        #if defined(MA_ATOMIC_HAS_32)\n            #define ma_atomic_compare_and_swap_32(dst, expected, desired) (ma_uint32)_InterlockedCompareExchange((volatile long*)dst, (long)desired, (long)expected)\n        #endif\n        #if defined(MA_ATOMIC_HAS_64)\n            #define ma_atomic_compare_and_swap_64(dst, expected, desired) (ma_uint64)_InterlockedCompareExchange64((volatile ma_int64*)dst, (ma_int64)desired, (ma_int64)expected)\n        #endif\n    #endif\n    #if defined(MA_ATOMIC_MSVC_USE_INLINED_ASSEMBLY)\n        #if defined(MA_ATOMIC_HAS_8)\n            static MA_INLINE ma_uint8 __stdcall ma_atomic_exchange_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n            {\n                ma_uint8 result = 0;\n                (void)order;\n                __asm {\n                    mov ecx, dst\n                    mov al,  src\n                    lock xchg [ecx], al\n                    mov result, al\n                }\n                return result;\n            }\n        #endif\n        #if defined(MA_ATOMIC_HAS_16)\n            static MA_INLINE ma_uint16 __stdcall ma_atomic_exchange_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n            {\n                ma_uint16 result = 0;\n                (void)order;\n                __asm {\n                    mov ecx, dst\n                    mov ax,  src\n                    lock xchg [ecx], ax\n                    mov result, ax\n                }\n                return result;\n            }\n        #endif\n        #if defined(MA_ATOMIC_HAS_32)\n            static MA_INLINE ma_uint32 __stdcall ma_atomic_exchange_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n            {\n                ma_uint32 result = 0;\n                (void)order;\n                __asm {\n                    mov ecx, dst\n                    mov eax, src\n                    lock xchg [ecx], eax\n                    mov result, eax\n                }\n                return result;\n            }\n        #endif\n    #else\n        #if defined(MA_ATOMIC_HAS_8)\n            static MA_INLINE ma_uint8 __stdcall ma_atomic_exchange_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n            {\n            #if defined(MA_ARM)\n                MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchange8, ma_uint8, char);\n            #else\n                (void)order;\n                return (ma_uint8)_InterlockedExchange8((volatile char*)dst, (char)src);\n            #endif\n            }\n        #endif\n        #if defined(MA_ATOMIC_HAS_16)\n            static MA_INLINE ma_uint16 __stdcall ma_atomic_exchange_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n            {\n            #if defined(MA_ARM)\n                MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchange16, ma_uint16, short);\n            #else\n                (void)order;\n                return (ma_uint16)_InterlockedExchange16((volatile short*)dst, (short)src);\n            #endif\n            }\n        #endif\n        #if defined(MA_ATOMIC_HAS_32)\n            static MA_INLINE ma_uint32 __stdcall ma_atomic_exchange_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n            {\n            #if defined(MA_ARM)\n                MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchange, ma_uint32, long);\n            #else\n                (void)order;\n                return (ma_uint32)_InterlockedExchange((volatile long*)dst, (long)src);\n            #endif\n            }\n        #endif\n        #if defined(MA_ATOMIC_HAS_64) && defined(MA_64BIT)\n            static MA_INLINE ma_uint64 __stdcall ma_atomic_exchange_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n            {\n            #if defined(MA_ARM)\n                MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchange64, ma_uint64, long long);\n            #else\n                (void)order;\n                return (ma_uint64)_InterlockedExchange64((volatile long long*)dst, (long long)src);\n            #endif\n            }\n        #else\n        #endif\n    #endif\n    #if defined(MA_ATOMIC_HAS_64) && !defined(MA_64BIT)\n        static MA_INLINE ma_uint64 __stdcall ma_atomic_exchange_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            ma_uint64 oldValue;\n            do {\n                oldValue = *dst;\n            } while (ma_atomic_compare_and_swap_64(dst, oldValue, src) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n    #endif\n    #if defined(MA_ATOMIC_MSVC_USE_INLINED_ASSEMBLY)\n        #if defined(MA_ATOMIC_HAS_8)\n            static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_add_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n            {\n                ma_uint8 result = 0;\n                (void)order;\n                __asm {\n                    mov ecx, dst\n                    mov al,  src\n                    lock xadd [ecx], al\n                    mov result, al\n                }\n                return result;\n            }\n        #endif\n        #if defined(MA_ATOMIC_HAS_16)\n            static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_add_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n            {\n                ma_uint16 result = 0;\n                (void)order;\n                __asm {\n                    mov ecx, dst\n                    mov ax,  src\n                    lock xadd [ecx], ax\n                    mov result, ax\n                }\n                return result;\n            }\n        #endif\n        #if defined(MA_ATOMIC_HAS_32)\n            static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_add_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n            {\n                ma_uint32 result = 0;\n                (void)order;\n                __asm {\n                    mov ecx, dst\n                    mov eax, src\n                    lock xadd [ecx], eax\n                    mov result, eax\n                }\n                return result;\n            }\n        #endif\n    #else\n        #if defined(MA_ATOMIC_HAS_8)\n            static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_add_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n            {\n            #if defined(MA_ARM)\n                MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchangeAdd8, ma_uint8, char);\n            #else\n                (void)order;\n                return (ma_uint8)_InterlockedExchangeAdd8((volatile char*)dst, (char)src);\n            #endif\n            }\n        #endif\n        #if defined(MA_ATOMIC_HAS_16)\n            static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_add_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n            {\n            #if defined(MA_ARM)\n                MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchangeAdd16, ma_uint16, short);\n            #else\n                (void)order;\n                return (ma_uint16)_InterlockedExchangeAdd16((volatile short*)dst, (short)src);\n            #endif\n            }\n        #endif\n        #if defined(MA_ATOMIC_HAS_32)\n            static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_add_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n            {\n            #if defined(MA_ARM)\n                MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchangeAdd, ma_uint32, long);\n            #else\n                (void)order;\n                return (ma_uint32)_InterlockedExchangeAdd((volatile long*)dst, (long)src);\n            #endif\n            }\n        #endif\n        #if defined(MA_ATOMIC_HAS_64) && defined(MA_64BIT)\n            static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_add_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n            {\n            #if defined(MA_ARM)\n                MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedExchangeAdd64, ma_uint64, long long);\n            #else\n                (void)order;\n                return (ma_uint64)_InterlockedExchangeAdd64((volatile long long*)dst, (long long)src);\n            #endif\n            }\n        #else\n        #endif\n    #endif\n    #if defined(MA_ATOMIC_HAS_64) && !defined(MA_64BIT)\n        static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_add_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            ma_uint64 oldValue;\n            ma_uint64 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue + src;\n            } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n    #endif\n    #if defined(MA_ATOMIC_MSVC_USE_INLINED_ASSEMBLY)\n        static MA_INLINE void __stdcall ma_atomic_thread_fence(ma_atomic_memory_order order)\n        {\n            (void)order;\n            __asm {\n                lock add [esp], 0\n            }\n        }\n    #else\n        #if defined(MA_X64)\n            #define ma_atomic_thread_fence(order)   __faststorefence(), (void)order\n        #elif defined(MA_ARM64)\n            #define ma_atomic_thread_fence(order)   __dmb(_ARM64_BARRIER_ISH), (void)order\n        #else\n            static MA_INLINE void ma_atomic_thread_fence(ma_atomic_memory_order order)\n            {\n                volatile ma_uint32 barrier = 0;\n                ma_atomic_fetch_add_explicit_32(&barrier, 0, order);\n            }\n        #endif\n    #endif\n    #define ma_atomic_compiler_fence()      ma_atomic_thread_fence(ma_atomic_memory_order_seq_cst)\n    #define ma_atomic_signal_fence(order)   ma_atomic_thread_fence(order)\n    #if defined(MA_ATOMIC_HAS_8)\n        static MA_INLINE ma_uint8 ma_atomic_load_explicit_8(volatile const ma_uint8* ptr, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, 0, 0, order, _InterlockedCompareExchange8, ma_uint8, char);\n        #else\n            (void)order;\n            return ma_atomic_compare_and_swap_8((volatile ma_uint8*)ptr, 0, 0);\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_16)\n        static MA_INLINE ma_uint16 ma_atomic_load_explicit_16(volatile const ma_uint16* ptr, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, 0, 0, order, _InterlockedCompareExchange16, ma_uint16, short);\n        #else\n            (void)order;\n            return ma_atomic_compare_and_swap_16((volatile ma_uint16*)ptr, 0, 0);\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_32)\n        static MA_INLINE ma_uint32 ma_atomic_load_explicit_32(volatile const ma_uint32* ptr, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, 0, 0, order, _InterlockedCompareExchange, ma_uint32, long);\n        #else\n            (void)order;\n            return ma_atomic_compare_and_swap_32((volatile ma_uint32*)ptr, 0, 0);\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_64)\n        static MA_INLINE ma_uint64 ma_atomic_load_explicit_64(volatile const ma_uint64* ptr, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC_COMPARE_EXCHANGE(ptr, 0, 0, order, _InterlockedCompareExchange64, ma_uint64, long long);\n        #else\n            (void)order;\n            return ma_atomic_compare_and_swap_64((volatile ma_uint64*)ptr, 0, 0);\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_8)\n        #define ma_atomic_store_explicit_8( dst, src, order) (void)ma_atomic_exchange_explicit_8 (dst, src, order)\n    #endif\n    #if defined(MA_ATOMIC_HAS_16)\n        #define ma_atomic_store_explicit_16(dst, src, order) (void)ma_atomic_exchange_explicit_16(dst, src, order)\n    #endif\n    #if defined(MA_ATOMIC_HAS_32)\n        #define ma_atomic_store_explicit_32(dst, src, order) (void)ma_atomic_exchange_explicit_32(dst, src, order)\n    #endif\n    #if defined(MA_ATOMIC_HAS_64)\n        #define ma_atomic_store_explicit_64(dst, src, order) (void)ma_atomic_exchange_explicit_64(dst, src, order)\n    #endif\n    #if defined(MA_ATOMIC_HAS_8)\n        static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_sub_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n            ma_uint8 oldValue;\n            ma_uint8 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint8)(oldValue - src);\n            } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_16)\n        static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_sub_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n            ma_uint16 oldValue;\n            ma_uint16 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint16)(oldValue - src);\n            } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_32)\n        static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_sub_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n            ma_uint32 oldValue;\n            ma_uint32 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue - src;\n            } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_64)\n        static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_sub_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            ma_uint64 oldValue;\n            ma_uint64 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue - src;\n            } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_8)\n        static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_and_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedAnd8, ma_uint8, char);\n        #else\n            ma_uint8 oldValue;\n            ma_uint8 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint8)(oldValue & src);\n            } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_16)\n        static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_and_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedAnd16, ma_uint16, short);\n        #else\n            ma_uint16 oldValue;\n            ma_uint16 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint16)(oldValue & src);\n            } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_32)\n        static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_and_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedAnd, ma_uint32, long);\n        #else\n            ma_uint32 oldValue;\n            ma_uint32 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue & src;\n            } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_64)\n        static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_and_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedAnd64, ma_uint64, long long);\n        #else\n            ma_uint64 oldValue;\n            ma_uint64 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue & src;\n            } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_8)\n        static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_xor_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedXor8, ma_uint8, char);\n        #else\n            ma_uint8 oldValue;\n            ma_uint8 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint8)(oldValue ^ src);\n            } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_16)\n        static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_xor_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedXor16, ma_uint16, short);\n        #else\n            ma_uint16 oldValue;\n            ma_uint16 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint16)(oldValue ^ src);\n            } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_32)\n        static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_xor_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedXor, ma_uint32, long);\n        #else\n            ma_uint32 oldValue;\n            ma_uint32 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue ^ src;\n            } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_64)\n        static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_xor_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedXor64, ma_uint64, long long);\n        #else\n            ma_uint64 oldValue;\n            ma_uint64 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue ^ src;\n            } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_8)\n        static MA_INLINE ma_uint8 __stdcall ma_atomic_fetch_or_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedOr8, ma_uint8, char);\n        #else\n            ma_uint8 oldValue;\n            ma_uint8 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint8)(oldValue | src);\n            } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_16)\n        static MA_INLINE ma_uint16 __stdcall ma_atomic_fetch_or_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedOr16, ma_uint16, short);\n        #else\n            ma_uint16 oldValue;\n            ma_uint16 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint16)(oldValue | src);\n            } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_32)\n        static MA_INLINE ma_uint32 __stdcall ma_atomic_fetch_or_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedOr, ma_uint32, long);\n        #else\n            ma_uint32 oldValue;\n            ma_uint32 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue | src;\n            } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_64)\n        static MA_INLINE ma_uint64 __stdcall ma_atomic_fetch_or_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n        #if defined(MA_ARM)\n            MA_ATOMIC_MSVC_ARM_INTRINSIC(dst, src, order, _InterlockedOr64, ma_uint64, long long);\n        #else\n            ma_uint64 oldValue;\n            ma_uint64 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue | src;\n            } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        #endif\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_8)\n        #define ma_atomic_test_and_set_explicit_8( dst, order) ma_atomic_exchange_explicit_8 (dst, 1, order)\n    #endif\n    #if defined(MA_ATOMIC_HAS_16)\n        #define ma_atomic_test_and_set_explicit_16(dst, order) ma_atomic_exchange_explicit_16(dst, 1, order)\n    #endif\n    #if defined(MA_ATOMIC_HAS_32)\n        #define ma_atomic_test_and_set_explicit_32(dst, order) ma_atomic_exchange_explicit_32(dst, 1, order)\n    #endif\n    #if defined(MA_ATOMIC_HAS_64)\n        #define ma_atomic_test_and_set_explicit_64(dst, order) ma_atomic_exchange_explicit_64(dst, 1, order)\n    #endif\n    #if defined(MA_ATOMIC_HAS_8)\n        #define ma_atomic_clear_explicit_8( dst, order) ma_atomic_store_explicit_8 (dst, 0, order)\n    #endif\n    #if defined(MA_ATOMIC_HAS_16)\n        #define ma_atomic_clear_explicit_16(dst, order) ma_atomic_store_explicit_16(dst, 0, order)\n    #endif\n    #if defined(MA_ATOMIC_HAS_32)\n        #define ma_atomic_clear_explicit_32(dst, order) ma_atomic_store_explicit_32(dst, 0, order)\n    #endif\n    #if defined(MA_ATOMIC_HAS_64)\n        #define ma_atomic_clear_explicit_64(dst, order) ma_atomic_store_explicit_64(dst, 0, order)\n    #endif\n    #if defined(MA_ATOMIC_HAS_8)\n        typedef ma_uint8 ma_atomic_flag;\n        #define ma_atomic_flag_test_and_set_explicit(ptr, order)    (ma_bool32)ma_atomic_test_and_set_explicit_8(ptr, order)\n        #define ma_atomic_flag_clear_explicit(ptr, order)           ma_atomic_clear_explicit_8(ptr, order)\n        #define c89atoimc_flag_load_explicit(ptr, order)            ma_atomic_load_explicit_8(ptr, order)\n    #else\n        typedef ma_uint32 ma_atomic_flag;\n        #define ma_atomic_flag_test_and_set_explicit(ptr, order)    (ma_bool32)ma_atomic_test_and_set_explicit_32(ptr, order)\n        #define ma_atomic_flag_clear_explicit(ptr, order)           ma_atomic_clear_explicit_32(ptr, order)\n        #define c89atoimc_flag_load_explicit(ptr, order)            ma_atomic_load_explicit_32(ptr, order)\n    #endif\n#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)))\n    #define MA_ATOMIC_HAS_NATIVE_COMPARE_EXCHANGE\n    #define MA_ATOMIC_HAS_NATIVE_IS_LOCK_FREE\n    #define ma_atomic_memory_order_relaxed                          __ATOMIC_RELAXED\n    #define ma_atomic_memory_order_consume                          __ATOMIC_CONSUME\n    #define ma_atomic_memory_order_acquire                          __ATOMIC_ACQUIRE\n    #define ma_atomic_memory_order_release                          __ATOMIC_RELEASE\n    #define ma_atomic_memory_order_acq_rel                          __ATOMIC_ACQ_REL\n    #define ma_atomic_memory_order_seq_cst                          __ATOMIC_SEQ_CST\n    #define ma_atomic_compiler_fence()                              __asm__ __volatile__(\"\":::\"memory\")\n    #define ma_atomic_thread_fence(order)                           __atomic_thread_fence(order)\n    #define ma_atomic_signal_fence(order)                           __atomic_signal_fence(order)\n    #define ma_atomic_is_lock_free_8(ptr)                           __atomic_is_lock_free(1, ptr)\n    #define ma_atomic_is_lock_free_16(ptr)                          __atomic_is_lock_free(2, ptr)\n    #define ma_atomic_is_lock_free_32(ptr)                          __atomic_is_lock_free(4, ptr)\n    #define ma_atomic_is_lock_free_64(ptr)                          __atomic_is_lock_free(8, ptr)\n    #define ma_atomic_test_and_set_explicit_8( dst, order)          __atomic_exchange_n(dst, 1, order)\n    #define ma_atomic_test_and_set_explicit_16(dst, order)          __atomic_exchange_n(dst, 1, order)\n    #define ma_atomic_test_and_set_explicit_32(dst, order)          __atomic_exchange_n(dst, 1, order)\n    #define ma_atomic_test_and_set_explicit_64(dst, order)          __atomic_exchange_n(dst, 1, order)\n    #define ma_atomic_clear_explicit_8( dst, order)                 __atomic_store_n(dst, 0, order)\n    #define ma_atomic_clear_explicit_16(dst, order)                 __atomic_store_n(dst, 0, order)\n    #define ma_atomic_clear_explicit_32(dst, order)                 __atomic_store_n(dst, 0, order)\n    #define ma_atomic_clear_explicit_64(dst, order)                 __atomic_store_n(dst, 0, order)\n    #define ma_atomic_store_explicit_8( dst, src, order)            __atomic_store_n(dst, src, order)\n    #define ma_atomic_store_explicit_16(dst, src, order)            __atomic_store_n(dst, src, order)\n    #define ma_atomic_store_explicit_32(dst, src, order)            __atomic_store_n(dst, src, order)\n    #define ma_atomic_store_explicit_64(dst, src, order)            __atomic_store_n(dst, src, order)\n    #define ma_atomic_load_explicit_8( dst, order)                  __atomic_load_n(dst, order)\n    #define ma_atomic_load_explicit_16(dst, order)                  __atomic_load_n(dst, order)\n    #define ma_atomic_load_explicit_32(dst, order)                  __atomic_load_n(dst, order)\n    #define ma_atomic_load_explicit_64(dst, order)                  __atomic_load_n(dst, order)\n    #define ma_atomic_exchange_explicit_8( dst, src, order)         __atomic_exchange_n(dst, src, order)\n    #define ma_atomic_exchange_explicit_16(dst, src, order)         __atomic_exchange_n(dst, src, order)\n    #define ma_atomic_exchange_explicit_32(dst, src, order)         __atomic_exchange_n(dst, src, order)\n    #define ma_atomic_exchange_explicit_64(dst, src, order)         __atomic_exchange_n(dst, src, order)\n    #define ma_atomic_compare_exchange_strong_explicit_8( dst, expected, desired, successOrder, failureOrder)   __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder)\n    #define ma_atomic_compare_exchange_strong_explicit_16(dst, expected, desired, successOrder, failureOrder)   __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder)\n    #define ma_atomic_compare_exchange_strong_explicit_32(dst, expected, desired, successOrder, failureOrder)   __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder)\n    #define ma_atomic_compare_exchange_strong_explicit_64(dst, expected, desired, successOrder, failureOrder)   __atomic_compare_exchange_n(dst, expected, desired, 0, successOrder, failureOrder)\n    #define ma_atomic_compare_exchange_weak_explicit_8( dst, expected, desired, successOrder, failureOrder)     __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder)\n    #define ma_atomic_compare_exchange_weak_explicit_16(dst, expected, desired, successOrder, failureOrder)     __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder)\n    #define ma_atomic_compare_exchange_weak_explicit_32(dst, expected, desired, successOrder, failureOrder)     __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder)\n    #define ma_atomic_compare_exchange_weak_explicit_64(dst, expected, desired, successOrder, failureOrder)     __atomic_compare_exchange_n(dst, expected, desired, 1, successOrder, failureOrder)\n    #define ma_atomic_fetch_add_explicit_8( dst, src, order)        __atomic_fetch_add(dst, src, order)\n    #define ma_atomic_fetch_add_explicit_16(dst, src, order)        __atomic_fetch_add(dst, src, order)\n    #define ma_atomic_fetch_add_explicit_32(dst, src, order)        __atomic_fetch_add(dst, src, order)\n    #define ma_atomic_fetch_add_explicit_64(dst, src, order)        __atomic_fetch_add(dst, src, order)\n    #define ma_atomic_fetch_sub_explicit_8( dst, src, order)        __atomic_fetch_sub(dst, src, order)\n    #define ma_atomic_fetch_sub_explicit_16(dst, src, order)        __atomic_fetch_sub(dst, src, order)\n    #define ma_atomic_fetch_sub_explicit_32(dst, src, order)        __atomic_fetch_sub(dst, src, order)\n    #define ma_atomic_fetch_sub_explicit_64(dst, src, order)        __atomic_fetch_sub(dst, src, order)\n    #define ma_atomic_fetch_or_explicit_8( dst, src, order)         __atomic_fetch_or(dst, src, order)\n    #define ma_atomic_fetch_or_explicit_16(dst, src, order)         __atomic_fetch_or(dst, src, order)\n    #define ma_atomic_fetch_or_explicit_32(dst, src, order)         __atomic_fetch_or(dst, src, order)\n    #define ma_atomic_fetch_or_explicit_64(dst, src, order)         __atomic_fetch_or(dst, src, order)\n    #define ma_atomic_fetch_xor_explicit_8( dst, src, order)        __atomic_fetch_xor(dst, src, order)\n    #define ma_atomic_fetch_xor_explicit_16(dst, src, order)        __atomic_fetch_xor(dst, src, order)\n    #define ma_atomic_fetch_xor_explicit_32(dst, src, order)        __atomic_fetch_xor(dst, src, order)\n    #define ma_atomic_fetch_xor_explicit_64(dst, src, order)        __atomic_fetch_xor(dst, src, order)\n    #define ma_atomic_fetch_and_explicit_8( dst, src, order)        __atomic_fetch_and(dst, src, order)\n    #define ma_atomic_fetch_and_explicit_16(dst, src, order)        __atomic_fetch_and(dst, src, order)\n    #define ma_atomic_fetch_and_explicit_32(dst, src, order)        __atomic_fetch_and(dst, src, order)\n    #define ma_atomic_fetch_and_explicit_64(dst, src, order)        __atomic_fetch_and(dst, src, order)\n    static MA_INLINE ma_uint8 ma_atomic_compare_and_swap_8(volatile ma_uint8* dst, ma_uint8 expected, ma_uint8 desired)\n    {\n        __atomic_compare_exchange_n(dst, &expected, desired, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);\n        return expected;\n    }\n    static MA_INLINE ma_uint16 ma_atomic_compare_and_swap_16(volatile ma_uint16* dst, ma_uint16 expected, ma_uint16 desired)\n    {\n        __atomic_compare_exchange_n(dst, &expected, desired, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);\n        return expected;\n    }\n    static MA_INLINE ma_uint32 ma_atomic_compare_and_swap_32(volatile ma_uint32* dst, ma_uint32 expected, ma_uint32 desired)\n    {\n        __atomic_compare_exchange_n(dst, &expected, desired, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);\n        return expected;\n    }\n    static MA_INLINE ma_uint64 ma_atomic_compare_and_swap_64(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 desired)\n    {\n        __atomic_compare_exchange_n(dst, &expected, desired, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);\n        return expected;\n    }\n    typedef ma_uint8 ma_atomic_flag;\n    #define ma_atomic_flag_test_and_set_explicit(dst, order)        (ma_bool32)__atomic_test_and_set(dst, order)\n    #define ma_atomic_flag_clear_explicit(dst, order)               __atomic_clear(dst, order)\n    #define c89atoimc_flag_load_explicit(ptr, order)                ma_atomic_load_explicit_8(ptr, order)\n#else\n    #define ma_atomic_memory_order_relaxed  1\n    #define ma_atomic_memory_order_consume  2\n    #define ma_atomic_memory_order_acquire  3\n    #define ma_atomic_memory_order_release  4\n    #define ma_atomic_memory_order_acq_rel  5\n    #define ma_atomic_memory_order_seq_cst  6\n    #define ma_atomic_compiler_fence() __asm__ __volatile__(\"\":::\"memory\")\n    #if defined(__GNUC__)\n        #define ma_atomic_thread_fence(order) __sync_synchronize(), (void)order\n        static MA_INLINE ma_uint8 ma_atomic_exchange_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n            if (order > ma_atomic_memory_order_acquire) {\n                __sync_synchronize();\n            }\n            return __sync_lock_test_and_set(dst, src);\n        }\n        static MA_INLINE ma_uint16 ma_atomic_exchange_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n            ma_uint16 oldValue;\n            do {\n                oldValue = *dst;\n            } while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint32 ma_atomic_exchange_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n            ma_uint32 oldValue;\n            do {\n                oldValue = *dst;\n            } while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint64 ma_atomic_exchange_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            ma_uint64 oldValue;\n            do {\n                oldValue = *dst;\n            } while (__sync_val_compare_and_swap(dst, oldValue, src) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint8 ma_atomic_fetch_add_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_add(dst, src);\n        }\n        static MA_INLINE ma_uint16 ma_atomic_fetch_add_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_add(dst, src);\n        }\n        static MA_INLINE ma_uint32 ma_atomic_fetch_add_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_add(dst, src);\n        }\n        static MA_INLINE ma_uint64 ma_atomic_fetch_add_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_add(dst, src);\n        }\n        static MA_INLINE ma_uint8 ma_atomic_fetch_sub_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_sub(dst, src);\n        }\n        static MA_INLINE ma_uint16 ma_atomic_fetch_sub_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_sub(dst, src);\n        }\n        static MA_INLINE ma_uint32 ma_atomic_fetch_sub_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_sub(dst, src);\n        }\n        static MA_INLINE ma_uint64 ma_atomic_fetch_sub_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_sub(dst, src);\n        }\n        static MA_INLINE ma_uint8 ma_atomic_fetch_or_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_or(dst, src);\n        }\n        static MA_INLINE ma_uint16 ma_atomic_fetch_or_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_or(dst, src);\n        }\n        static MA_INLINE ma_uint32 ma_atomic_fetch_or_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_or(dst, src);\n        }\n        static MA_INLINE ma_uint64 ma_atomic_fetch_or_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_or(dst, src);\n        }\n        static MA_INLINE ma_uint8 ma_atomic_fetch_xor_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_xor(dst, src);\n        }\n        static MA_INLINE ma_uint16 ma_atomic_fetch_xor_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_xor(dst, src);\n        }\n        static MA_INLINE ma_uint32 ma_atomic_fetch_xor_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_xor(dst, src);\n        }\n        static MA_INLINE ma_uint64 ma_atomic_fetch_xor_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_xor(dst, src);\n        }\n        static MA_INLINE ma_uint8 ma_atomic_fetch_and_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_and(dst, src);\n        }\n        static MA_INLINE ma_uint16 ma_atomic_fetch_and_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_and(dst, src);\n        }\n        static MA_INLINE ma_uint32 ma_atomic_fetch_and_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_and(dst, src);\n        }\n        static MA_INLINE ma_uint64 ma_atomic_fetch_and_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            (void)order;\n            return __sync_fetch_and_and(dst, src);\n        }\n        #define ma_atomic_compare_and_swap_8( dst, expected, desired)   __sync_val_compare_and_swap(dst, expected, desired)\n        #define ma_atomic_compare_and_swap_16(dst, expected, desired)   __sync_val_compare_and_swap(dst, expected, desired)\n        #define ma_atomic_compare_and_swap_32(dst, expected, desired)   __sync_val_compare_and_swap(dst, expected, desired)\n        #define ma_atomic_compare_and_swap_64(dst, expected, desired)   __sync_val_compare_and_swap(dst, expected, desired)\n    #else\n        #if defined(MA_X86)\n            #define ma_atomic_thread_fence(order) __asm__ __volatile__(\"lock; addl $0, (%%esp)\" ::: \"memory\", \"cc\")\n        #elif defined(MA_X64)\n            #define ma_atomic_thread_fence(order) __asm__ __volatile__(\"lock; addq $0, (%%rsp)\" ::: \"memory\", \"cc\")\n        #else\n            #error Unsupported architecture. Please submit a feature request.\n        #endif\n        static MA_INLINE ma_uint8 ma_atomic_compare_and_swap_8(volatile ma_uint8* dst, ma_uint8 expected, ma_uint8 desired)\n        {\n            ma_uint8 result;\n        #if defined(MA_X86) || defined(MA_X64)\n            __asm__ __volatile__(\"lock; cmpxchg %3, %0\" : \"+m\"(*dst), \"=a\"(result) : \"a\"(expected), \"d\"(desired) : \"cc\");\n        #else\n            #error Unsupported architecture. Please submit a feature request.\n        #endif\n            return result;\n        }\n        static MA_INLINE ma_uint16 ma_atomic_compare_and_swap_16(volatile ma_uint16* dst, ma_uint16 expected, ma_uint16 desired)\n        {\n            ma_uint16 result;\n        #if defined(MA_X86) || defined(MA_X64)\n            __asm__ __volatile__(\"lock; cmpxchg %3, %0\" : \"+m\"(*dst), \"=a\"(result) : \"a\"(expected), \"d\"(desired) : \"cc\");\n        #else\n            #error Unsupported architecture. Please submit a feature request.\n        #endif\n            return result;\n        }\n        static MA_INLINE ma_uint32 ma_atomic_compare_and_swap_32(volatile ma_uint32* dst, ma_uint32 expected, ma_uint32 desired)\n        {\n            ma_uint32 result;\n        #if defined(MA_X86) || defined(MA_X64)\n            __asm__ __volatile__(\"lock; cmpxchg %3, %0\" : \"+m\"(*dst), \"=a\"(result) : \"a\"(expected), \"d\"(desired) : \"cc\");\n        #else\n            #error Unsupported architecture. Please submit a feature request.\n        #endif\n            return result;\n        }\n        static MA_INLINE ma_uint64 ma_atomic_compare_and_swap_64(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 desired)\n        {\n            volatile ma_uint64 result;\n        #if defined(MA_X86)\n            ma_uint32 resultEAX;\n            ma_uint32 resultEDX;\n            __asm__ __volatile__(\"push %%ebx; xchg %5, %%ebx; lock; cmpxchg8b %0; pop %%ebx\" : \"+m\"(*dst), \"=a\"(resultEAX), \"=d\"(resultEDX) : \"a\"(expected & 0xFFFFFFFF), \"d\"(expected >> 32), \"r\"(desired & 0xFFFFFFFF), \"c\"(desired >> 32) : \"cc\");\n            result = ((ma_uint64)resultEDX << 32) | resultEAX;\n        #elif defined(MA_X64)\n            __asm__ __volatile__(\"lock; cmpxchg %3, %0\" : \"+m\"(*dst), \"=a\"(result) : \"a\"(expected), \"d\"(desired) : \"cc\");\n        #else\n            #error Unsupported architecture. Please submit a feature request.\n        #endif\n            return result;\n        }\n        static MA_INLINE ma_uint8 ma_atomic_exchange_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n            ma_uint8 result = 0;\n            (void)order;\n        #if defined(MA_X86) || defined(MA_X64)\n            __asm__ __volatile__(\"lock; xchg %1, %0\" : \"+m\"(*dst), \"=a\"(result) : \"a\"(src));\n        #else\n            #error Unsupported architecture. Please submit a feature request.\n        #endif\n            return result;\n        }\n        static MA_INLINE ma_uint16 ma_atomic_exchange_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n            ma_uint16 result = 0;\n            (void)order;\n        #if defined(MA_X86) || defined(MA_X64)\n            __asm__ __volatile__(\"lock; xchg %1, %0\" : \"+m\"(*dst), \"=a\"(result) : \"a\"(src));\n        #else\n            #error Unsupported architecture. Please submit a feature request.\n        #endif\n            return result;\n        }\n        static MA_INLINE ma_uint32 ma_atomic_exchange_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n            ma_uint32 result;\n            (void)order;\n        #if defined(MA_X86) || defined(MA_X64)\n            __asm__ __volatile__(\"lock; xchg %1, %0\" : \"+m\"(*dst), \"=a\"(result) : \"a\"(src));\n        #else\n            #error Unsupported architecture. Please submit a feature request.\n        #endif\n            return result;\n        }\n        static MA_INLINE ma_uint64 ma_atomic_exchange_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            ma_uint64 result;\n            (void)order;\n        #if defined(MA_X86)\n            do {\n                result = *dst;\n            } while (ma_atomic_compare_and_swap_64(dst, result, src) != result);\n        #elif defined(MA_X64)\n            __asm__ __volatile__(\"lock; xchg %1, %0\" : \"+m\"(*dst), \"=a\"(result) : \"a\"(src));\n        #else\n            #error Unsupported architecture. Please submit a feature request.\n        #endif\n            return result;\n        }\n        static MA_INLINE ma_uint8 ma_atomic_fetch_add_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n            ma_uint8 result;\n            (void)order;\n        #if defined(MA_X86) || defined(MA_X64)\n            __asm__ __volatile__(\"lock; xadd %1, %0\" : \"+m\"(*dst), \"=a\"(result) : \"a\"(src) : \"cc\");\n        #else\n            #error Unsupported architecture. Please submit a feature request.\n        #endif\n            return result;\n        }\n        static MA_INLINE ma_uint16 ma_atomic_fetch_add_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n            ma_uint16 result;\n            (void)order;\n        #if defined(MA_X86) || defined(MA_X64)\n            __asm__ __volatile__(\"lock; xadd %1, %0\" : \"+m\"(*dst), \"=a\"(result) : \"a\"(src) : \"cc\");\n        #else\n            #error Unsupported architecture. Please submit a feature request.\n        #endif\n            return result;\n        }\n        static MA_INLINE ma_uint32 ma_atomic_fetch_add_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n            ma_uint32 result;\n            (void)order;\n        #if defined(MA_X86) || defined(MA_X64)\n            __asm__ __volatile__(\"lock; xadd %1, %0\" : \"+m\"(*dst), \"=a\"(result) : \"a\"(src) : \"cc\");\n        #else\n            #error Unsupported architecture. Please submit a feature request.\n        #endif\n            return result;\n        }\n        static MA_INLINE ma_uint64 ma_atomic_fetch_add_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n        #if defined(MA_X86)\n            ma_uint64 oldValue;\n            ma_uint64 newValue;\n            (void)order;\n            do {\n                oldValue = *dst;\n                newValue = oldValue + src;\n            } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);\n            return oldValue;\n        #elif defined(MA_X64)\n            ma_uint64 result;\n            (void)order;\n            __asm__ __volatile__(\"lock; xadd %1, %0\" : \"+m\"(*dst), \"=a\"(result) : \"a\"(src) : \"cc\");\n            return result;\n        #endif\n        }\n        static MA_INLINE ma_uint8 ma_atomic_fetch_sub_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n            ma_uint8 oldValue;\n            ma_uint8 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint8)(oldValue - src);\n            } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint16 ma_atomic_fetch_sub_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n            ma_uint16 oldValue;\n            ma_uint16 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint16)(oldValue - src);\n            } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint32 ma_atomic_fetch_sub_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n            ma_uint32 oldValue;\n            ma_uint32 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue - src;\n            } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint64 ma_atomic_fetch_sub_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            ma_uint64 oldValue;\n            ma_uint64 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue - src;\n            } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint8 ma_atomic_fetch_and_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n            ma_uint8 oldValue;\n            ma_uint8 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint8)(oldValue & src);\n            } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint16 ma_atomic_fetch_and_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n            ma_uint16 oldValue;\n            ma_uint16 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint16)(oldValue & src);\n            } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint32 ma_atomic_fetch_and_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n            ma_uint32 oldValue;\n            ma_uint32 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue & src;\n            } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint64 ma_atomic_fetch_and_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            ma_uint64 oldValue;\n            ma_uint64 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue & src;\n            } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint8 ma_atomic_fetch_xor_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n            ma_uint8 oldValue;\n            ma_uint8 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint8)(oldValue ^ src);\n            } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint16 ma_atomic_fetch_xor_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n            ma_uint16 oldValue;\n            ma_uint16 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint16)(oldValue ^ src);\n            } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint32 ma_atomic_fetch_xor_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n            ma_uint32 oldValue;\n            ma_uint32 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue ^ src;\n            } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint64 ma_atomic_fetch_xor_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            ma_uint64 oldValue;\n            ma_uint64 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue ^ src;\n            } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint8 ma_atomic_fetch_or_explicit_8(volatile ma_uint8* dst, ma_uint8 src, ma_atomic_memory_order order)\n        {\n            ma_uint8 oldValue;\n            ma_uint8 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint8)(oldValue | src);\n            } while (ma_atomic_compare_and_swap_8(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint16 ma_atomic_fetch_or_explicit_16(volatile ma_uint16* dst, ma_uint16 src, ma_atomic_memory_order order)\n        {\n            ma_uint16 oldValue;\n            ma_uint16 newValue;\n            do {\n                oldValue = *dst;\n                newValue = (ma_uint16)(oldValue | src);\n            } while (ma_atomic_compare_and_swap_16(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint32 ma_atomic_fetch_or_explicit_32(volatile ma_uint32* dst, ma_uint32 src, ma_atomic_memory_order order)\n        {\n            ma_uint32 oldValue;\n            ma_uint32 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue | src;\n            } while (ma_atomic_compare_and_swap_32(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n        static MA_INLINE ma_uint64 ma_atomic_fetch_or_explicit_64(volatile ma_uint64* dst, ma_uint64 src, ma_atomic_memory_order order)\n        {\n            ma_uint64 oldValue;\n            ma_uint64 newValue;\n            do {\n                oldValue = *dst;\n                newValue = oldValue | src;\n            } while (ma_atomic_compare_and_swap_64(dst, oldValue, newValue) != oldValue);\n            (void)order;\n            return oldValue;\n        }\n    #endif\n    #define ma_atomic_signal_fence(order)                           ma_atomic_thread_fence(order)\n    static MA_INLINE ma_uint8 ma_atomic_load_explicit_8(volatile const ma_uint8* ptr, ma_atomic_memory_order order)\n    {\n        (void)order;\n        return ma_atomic_compare_and_swap_8((ma_uint8*)ptr, 0, 0);\n    }\n    static MA_INLINE ma_uint16 ma_atomic_load_explicit_16(volatile const ma_uint16* ptr, ma_atomic_memory_order order)\n    {\n        (void)order;\n        return ma_atomic_compare_and_swap_16((ma_uint16*)ptr, 0, 0);\n    }\n    static MA_INLINE ma_uint32 ma_atomic_load_explicit_32(volatile const ma_uint32* ptr, ma_atomic_memory_order order)\n    {\n        (void)order;\n        return ma_atomic_compare_and_swap_32((ma_uint32*)ptr, 0, 0);\n    }\n    static MA_INLINE ma_uint64 ma_atomic_load_explicit_64(volatile const ma_uint64* ptr, ma_atomic_memory_order order)\n    {\n        (void)order;\n        return ma_atomic_compare_and_swap_64((ma_uint64*)ptr, 0, 0);\n    }\n    #define ma_atomic_store_explicit_8( dst, src, order)            (void)ma_atomic_exchange_explicit_8 (dst, src, order)\n    #define ma_atomic_store_explicit_16(dst, src, order)            (void)ma_atomic_exchange_explicit_16(dst, src, order)\n    #define ma_atomic_store_explicit_32(dst, src, order)            (void)ma_atomic_exchange_explicit_32(dst, src, order)\n    #define ma_atomic_store_explicit_64(dst, src, order)            (void)ma_atomic_exchange_explicit_64(dst, src, order)\n    #define ma_atomic_test_and_set_explicit_8( dst, order)          ma_atomic_exchange_explicit_8 (dst, 1, order)\n    #define ma_atomic_test_and_set_explicit_16(dst, order)          ma_atomic_exchange_explicit_16(dst, 1, order)\n    #define ma_atomic_test_and_set_explicit_32(dst, order)          ma_atomic_exchange_explicit_32(dst, 1, order)\n    #define ma_atomic_test_and_set_explicit_64(dst, order)          ma_atomic_exchange_explicit_64(dst, 1, order)\n    #define ma_atomic_clear_explicit_8( dst, order)                 ma_atomic_store_explicit_8 (dst, 0, order)\n    #define ma_atomic_clear_explicit_16(dst, order)                 ma_atomic_store_explicit_16(dst, 0, order)\n    #define ma_atomic_clear_explicit_32(dst, order)                 ma_atomic_store_explicit_32(dst, 0, order)\n    #define ma_atomic_clear_explicit_64(dst, order)                 ma_atomic_store_explicit_64(dst, 0, order)\n    typedef ma_uint8 ma_atomic_flag;\n    #define ma_atomic_flag_test_and_set_explicit(ptr, order)        (ma_bool32)ma_atomic_test_and_set_explicit_8(ptr, order)\n    #define ma_atomic_flag_clear_explicit(ptr, order)               ma_atomic_clear_explicit_8(ptr, order)\n    #define c89atoimc_flag_load_explicit(ptr, order)                ma_atomic_load_explicit_8(ptr, order)\n#endif\n#if !defined(MA_ATOMIC_HAS_NATIVE_COMPARE_EXCHANGE)\n    #if defined(MA_ATOMIC_HAS_8)\n        static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_8(volatile ma_uint8* dst, ma_uint8* expected, ma_uint8 desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder)\n        {\n            ma_uint8 expectedValue;\n            ma_uint8 result;\n            (void)successOrder;\n            (void)failureOrder;\n            expectedValue = ma_atomic_load_explicit_8(expected, ma_atomic_memory_order_seq_cst);\n            result = ma_atomic_compare_and_swap_8(dst, expectedValue, desired);\n            if (result == expectedValue) {\n                return 1;\n            } else {\n                ma_atomic_store_explicit_8(expected, result, failureOrder);\n                return 0;\n            }\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_16)\n        static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_16(volatile ma_uint16* dst, ma_uint16* expected, ma_uint16 desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder)\n        {\n            ma_uint16 expectedValue;\n            ma_uint16 result;\n            (void)successOrder;\n            (void)failureOrder;\n            expectedValue = ma_atomic_load_explicit_16(expected, ma_atomic_memory_order_seq_cst);\n            result = ma_atomic_compare_and_swap_16(dst, expectedValue, desired);\n            if (result == expectedValue) {\n                return 1;\n            } else {\n                ma_atomic_store_explicit_16(expected, result, failureOrder);\n                return 0;\n            }\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_32)\n        static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_32(volatile ma_uint32* dst, ma_uint32* expected, ma_uint32 desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder)\n        {\n            ma_uint32 expectedValue;\n            ma_uint32 result;\n            (void)successOrder;\n            (void)failureOrder;\n            expectedValue = ma_atomic_load_explicit_32(expected, ma_atomic_memory_order_seq_cst);\n            result = ma_atomic_compare_and_swap_32(dst, expectedValue, desired);\n            if (result == expectedValue) {\n                return 1;\n            } else {\n                ma_atomic_store_explicit_32(expected, result, failureOrder);\n                return 0;\n            }\n        }\n    #endif\n    #if defined(MA_ATOMIC_HAS_64)\n        static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_64(volatile ma_uint64* dst, volatile ma_uint64* expected, ma_uint64 desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder)\n        {\n            ma_uint64 expectedValue;\n            ma_uint64 result;\n            (void)successOrder;\n            (void)failureOrder;\n            expectedValue = ma_atomic_load_explicit_64(expected, ma_atomic_memory_order_seq_cst);\n            result = ma_atomic_compare_and_swap_64(dst, expectedValue, desired);\n            if (result == expectedValue) {\n                return 1;\n            } else {\n                ma_atomic_store_explicit_64(expected, result, failureOrder);\n                return 0;\n            }\n        }\n    #endif\n    #define ma_atomic_compare_exchange_weak_explicit_8( dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_8 (dst, expected, desired, successOrder, failureOrder)\n    #define ma_atomic_compare_exchange_weak_explicit_16(dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_16(dst, expected, desired, successOrder, failureOrder)\n    #define ma_atomic_compare_exchange_weak_explicit_32(dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_32(dst, expected, desired, successOrder, failureOrder)\n    #define ma_atomic_compare_exchange_weak_explicit_64(dst, expected, desired, successOrder, failureOrder) ma_atomic_compare_exchange_strong_explicit_64(dst, expected, desired, successOrder, failureOrder)\n#endif\n#if !defined(MA_ATOMIC_HAS_NATIVE_IS_LOCK_FREE)\n    static MA_INLINE ma_bool32 ma_atomic_is_lock_free_8(volatile void* ptr)\n    {\n        (void)ptr;\n        return 1;\n    }\n    static MA_INLINE ma_bool32 ma_atomic_is_lock_free_16(volatile void* ptr)\n    {\n        (void)ptr;\n        return 1;\n    }\n    static MA_INLINE ma_bool32 ma_atomic_is_lock_free_32(volatile void* ptr)\n    {\n        (void)ptr;\n        return 1;\n    }\n    static MA_INLINE ma_bool32 ma_atomic_is_lock_free_64(volatile void* ptr)\n    {\n        (void)ptr;\n    #if defined(MA_64BIT)\n        return 1;\n    #else\n        #if defined(MA_X86) || defined(MA_X64)\n            return 1;\n        #else\n            return 0;\n        #endif\n    #endif\n    }\n#endif\n#if defined(MA_64BIT)\n    static MA_INLINE ma_bool32 ma_atomic_is_lock_free_ptr(volatile void** ptr)\n    {\n        return ma_atomic_is_lock_free_64((volatile ma_uint64*)ptr);\n    }\n    static MA_INLINE void* ma_atomic_load_explicit_ptr(volatile void** ptr, ma_atomic_memory_order order)\n    {\n        return (void*)ma_atomic_load_explicit_64((volatile ma_uint64*)ptr, order);\n    }\n    static MA_INLINE void ma_atomic_store_explicit_ptr(volatile void** dst, void* src, ma_atomic_memory_order order)\n    {\n        ma_atomic_store_explicit_64((volatile ma_uint64*)dst, (ma_uint64)src, order);\n    }\n    static MA_INLINE void* ma_atomic_exchange_explicit_ptr(volatile void** dst, void* src, ma_atomic_memory_order order)\n    {\n        return (void*)ma_atomic_exchange_explicit_64((volatile ma_uint64*)dst, (ma_uint64)src, order);\n    }\n    static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_ptr(volatile void** dst, void** expected, void* desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder)\n    {\n        return ma_atomic_compare_exchange_strong_explicit_64((volatile ma_uint64*)dst, (ma_uint64*)expected, (ma_uint64)desired, successOrder, failureOrder);\n    }\n    static MA_INLINE ma_bool32 ma_atomic_compare_exchange_weak_explicit_ptr(volatile void** dst, void** expected, void* desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder)\n    {\n        return ma_atomic_compare_exchange_weak_explicit_64((volatile ma_uint64*)dst, (ma_uint64*)expected, (ma_uint64)desired, successOrder, failureOrder);\n    }\n    static MA_INLINE void* ma_atomic_compare_and_swap_ptr(volatile void** dst, void* expected, void* desired)\n    {\n        return (void*)ma_atomic_compare_and_swap_64((volatile ma_uint64*)dst, (ma_uint64)expected, (ma_uint64)desired);\n    }\n#elif defined(MA_32BIT)\n    static MA_INLINE ma_bool32 ma_atomic_is_lock_free_ptr(volatile void** ptr)\n    {\n        return ma_atomic_is_lock_free_32((volatile ma_uint32*)ptr);\n    }\n    static MA_INLINE void* ma_atomic_load_explicit_ptr(volatile void** ptr, ma_atomic_memory_order order)\n    {\n        return (void*)ma_atomic_load_explicit_32((volatile ma_uint32*)ptr, order);\n    }\n    static MA_INLINE void ma_atomic_store_explicit_ptr(volatile void** dst, void* src, ma_atomic_memory_order order)\n    {\n        ma_atomic_store_explicit_32((volatile ma_uint32*)dst, (ma_uint32)src, order);\n    }\n    static MA_INLINE void* ma_atomic_exchange_explicit_ptr(volatile void** dst, void* src, ma_atomic_memory_order order)\n    {\n        return (void*)ma_atomic_exchange_explicit_32((volatile ma_uint32*)dst, (ma_uint32)src, order);\n    }\n    static MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_ptr(volatile void** dst, void** expected, void* desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder)\n    {\n        return ma_atomic_compare_exchange_strong_explicit_32((volatile ma_uint32*)dst, (ma_uint32*)expected, (ma_uint32)desired, successOrder, failureOrder);\n    }\n    static MA_INLINE ma_bool32 ma_atomic_compare_exchange_weak_explicit_ptr(volatile void** dst, void** expected, void* desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder)\n    {\n        return ma_atomic_compare_exchange_weak_explicit_32((volatile ma_uint32*)dst, (ma_uint32*)expected, (ma_uint32)desired, successOrder, failureOrder);\n    }\n    static MA_INLINE void* ma_atomic_compare_and_swap_ptr(volatile void** dst, void* expected, void* desired)\n    {\n        return (void*)ma_atomic_compare_and_swap_32((volatile ma_uint32*)dst, (ma_uint32)expected, (ma_uint32)desired);\n    }\n#else\n    #error Unsupported architecture.\n#endif\n#define ma_atomic_flag_test_and_set(ptr)                                ma_atomic_flag_test_and_set_explicit(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_flag_clear(ptr)                                       ma_atomic_flag_clear_explicit(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_store_ptr(dst, src)                                   ma_atomic_store_explicit_ptr((volatile void**)dst, (void*)src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_load_ptr(ptr)                                         ma_atomic_load_explicit_ptr((volatile void**)ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_exchange_ptr(dst, src)                                ma_atomic_exchange_explicit_ptr((volatile void**)dst, (void*)src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_strong_ptr(dst, expected, desired)   ma_atomic_compare_exchange_strong_explicit_ptr((volatile void**)dst, (void**)expected, (void*)desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_weak_ptr(dst, expected, desired)     ma_atomic_compare_exchange_weak_explicit_ptr((volatile void**)dst, (void**)expected, (void*)desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_test_and_set_8( ptr)                                  ma_atomic_test_and_set_explicit_8( ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_test_and_set_16(ptr)                                  ma_atomic_test_and_set_explicit_16(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_test_and_set_32(ptr)                                  ma_atomic_test_and_set_explicit_32(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_test_and_set_64(ptr)                                  ma_atomic_test_and_set_explicit_64(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_clear_8( ptr)                                         ma_atomic_clear_explicit_8( ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_clear_16(ptr)                                         ma_atomic_clear_explicit_16(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_clear_32(ptr)                                         ma_atomic_clear_explicit_32(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_clear_64(ptr)                                         ma_atomic_clear_explicit_64(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_store_8( dst, src)                                    ma_atomic_store_explicit_8( dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_store_16(dst, src)                                    ma_atomic_store_explicit_16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_store_32(dst, src)                                    ma_atomic_store_explicit_32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_store_64(dst, src)                                    ma_atomic_store_explicit_64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_load_8( ptr)                                          ma_atomic_load_explicit_8( ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_load_16(ptr)                                          ma_atomic_load_explicit_16(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_load_32(ptr)                                          ma_atomic_load_explicit_32(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_load_64(ptr)                                          ma_atomic_load_explicit_64(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_exchange_8( dst, src)                                 ma_atomic_exchange_explicit_8( dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_exchange_16(dst, src)                                 ma_atomic_exchange_explicit_16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_exchange_32(dst, src)                                 ma_atomic_exchange_explicit_32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_exchange_64(dst, src)                                 ma_atomic_exchange_explicit_64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_strong_8( dst, expected, desired)    ma_atomic_compare_exchange_strong_explicit_8( dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_strong_16(dst, expected, desired)    ma_atomic_compare_exchange_strong_explicit_16(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_strong_32(dst, expected, desired)    ma_atomic_compare_exchange_strong_explicit_32(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_strong_64(dst, expected, desired)    ma_atomic_compare_exchange_strong_explicit_64(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_weak_8(  dst, expected, desired)     ma_atomic_compare_exchange_weak_explicit_8( dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_weak_16( dst, expected, desired)     ma_atomic_compare_exchange_weak_explicit_16(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_weak_32( dst, expected, desired)     ma_atomic_compare_exchange_weak_explicit_32(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_weak_64( dst, expected, desired)     ma_atomic_compare_exchange_weak_explicit_64(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_add_8( dst, src)                                ma_atomic_fetch_add_explicit_8( dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_add_16(dst, src)                                ma_atomic_fetch_add_explicit_16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_add_32(dst, src)                                ma_atomic_fetch_add_explicit_32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_add_64(dst, src)                                ma_atomic_fetch_add_explicit_64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_sub_8( dst, src)                                ma_atomic_fetch_sub_explicit_8( dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_sub_16(dst, src)                                ma_atomic_fetch_sub_explicit_16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_sub_32(dst, src)                                ma_atomic_fetch_sub_explicit_32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_sub_64(dst, src)                                ma_atomic_fetch_sub_explicit_64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_or_8( dst, src)                                 ma_atomic_fetch_or_explicit_8( dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_or_16(dst, src)                                 ma_atomic_fetch_or_explicit_16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_or_32(dst, src)                                 ma_atomic_fetch_or_explicit_32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_or_64(dst, src)                                 ma_atomic_fetch_or_explicit_64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_xor_8( dst, src)                                ma_atomic_fetch_xor_explicit_8( dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_xor_16(dst, src)                                ma_atomic_fetch_xor_explicit_16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_xor_32(dst, src)                                ma_atomic_fetch_xor_explicit_32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_xor_64(dst, src)                                ma_atomic_fetch_xor_explicit_64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_and_8( dst, src)                                ma_atomic_fetch_and_explicit_8 (dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_and_16(dst, src)                                ma_atomic_fetch_and_explicit_16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_and_32(dst, src)                                ma_atomic_fetch_and_explicit_32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_and_64(dst, src)                                ma_atomic_fetch_and_explicit_64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_test_and_set_explicit_i8( ptr, order)                 (ma_int8 )ma_atomic_test_and_set_explicit_8( (ma_uint8* )ptr, order)\n#define ma_atomic_test_and_set_explicit_i16(ptr, order)                 (ma_int16)ma_atomic_test_and_set_explicit_16((ma_uint16*)ptr, order)\n#define ma_atomic_test_and_set_explicit_i32(ptr, order)                 (ma_int32)ma_atomic_test_and_set_explicit_32((ma_uint32*)ptr, order)\n#define ma_atomic_test_and_set_explicit_i64(ptr, order)                 (ma_int64)ma_atomic_test_and_set_explicit_64((ma_uint64*)ptr, order)\n#define ma_atomic_clear_explicit_i8( ptr, order)                        ma_atomic_clear_explicit_8( (ma_uint8* )ptr, order)\n#define ma_atomic_clear_explicit_i16(ptr, order)                        ma_atomic_clear_explicit_16((ma_uint16*)ptr, order)\n#define ma_atomic_clear_explicit_i32(ptr, order)                        ma_atomic_clear_explicit_32((ma_uint32*)ptr, order)\n#define ma_atomic_clear_explicit_i64(ptr, order)                        ma_atomic_clear_explicit_64((ma_uint64*)ptr, order)\n#define ma_atomic_store_explicit_i8( dst, src, order)                   ma_atomic_store_explicit_8( (ma_uint8* )dst, (ma_uint8 )src, order)\n#define ma_atomic_store_explicit_i16(dst, src, order)                   ma_atomic_store_explicit_16((ma_uint16*)dst, (ma_uint16)src, order)\n#define ma_atomic_store_explicit_i32(dst, src, order)                   ma_atomic_store_explicit_32((ma_uint32*)dst, (ma_uint32)src, order)\n#define ma_atomic_store_explicit_i64(dst, src, order)                   ma_atomic_store_explicit_64((ma_uint64*)dst, (ma_uint64)src, order)\n#define ma_atomic_load_explicit_i8( ptr, order)                         (ma_int8 )ma_atomic_load_explicit_8( (ma_uint8* )ptr, order)\n#define ma_atomic_load_explicit_i16(ptr, order)                         (ma_int16)ma_atomic_load_explicit_16((ma_uint16*)ptr, order)\n#define ma_atomic_load_explicit_i32(ptr, order)                         (ma_int32)ma_atomic_load_explicit_32((ma_uint32*)ptr, order)\n#define ma_atomic_load_explicit_i64(ptr, order)                         (ma_int64)ma_atomic_load_explicit_64((ma_uint64*)ptr, order)\n#define ma_atomic_exchange_explicit_i8( dst, src, order)                (ma_int8 )ma_atomic_exchange_explicit_8 ((ma_uint8* )dst, (ma_uint8 )src, order)\n#define ma_atomic_exchange_explicit_i16(dst, src, order)                (ma_int16)ma_atomic_exchange_explicit_16((ma_uint16*)dst, (ma_uint16)src, order)\n#define ma_atomic_exchange_explicit_i32(dst, src, order)                (ma_int32)ma_atomic_exchange_explicit_32((ma_uint32*)dst, (ma_uint32)src, order)\n#define ma_atomic_exchange_explicit_i64(dst, src, order)                (ma_int64)ma_atomic_exchange_explicit_64((ma_uint64*)dst, (ma_uint64)src, order)\n#define ma_atomic_compare_exchange_strong_explicit_i8( dst, expected, desired, successOrder, failureOrder)  ma_atomic_compare_exchange_strong_explicit_8( (ma_uint8* )dst, (ma_uint8* )expected, (ma_uint8 )desired, successOrder, failureOrder)\n#define ma_atomic_compare_exchange_strong_explicit_i16(dst, expected, desired, successOrder, failureOrder)  ma_atomic_compare_exchange_strong_explicit_16((ma_uint16*)dst, (ma_uint16*)expected, (ma_uint16)desired, successOrder, failureOrder)\n#define ma_atomic_compare_exchange_strong_explicit_i32(dst, expected, desired, successOrder, failureOrder)  ma_atomic_compare_exchange_strong_explicit_32((ma_uint32*)dst, (ma_uint32*)expected, (ma_uint32)desired, successOrder, failureOrder)\n#define ma_atomic_compare_exchange_strong_explicit_i64(dst, expected, desired, successOrder, failureOrder)  ma_atomic_compare_exchange_strong_explicit_64((ma_uint64*)dst, (ma_uint64*)expected, (ma_uint64)desired, successOrder, failureOrder)\n#define ma_atomic_compare_exchange_weak_explicit_i8( dst, expected, desired, successOrder, failureOrder)    ma_atomic_compare_exchange_weak_explicit_8( (ma_uint8* )dst, (ma_uint8* )expected, (ma_uint8 )desired, successOrder, failureOrder)\n#define ma_atomic_compare_exchange_weak_explicit_i16(dst, expected, desired, successOrder, failureOrder)    ma_atomic_compare_exchange_weak_explicit_16((ma_uint16*)dst, (ma_uint16*)expected, (ma_uint16)desired, successOrder, failureOrder)\n#define ma_atomic_compare_exchange_weak_explicit_i32(dst, expected, desired, successOrder, failureOrder)    ma_atomic_compare_exchange_weak_explicit_32((ma_uint32*)dst, (ma_uint32*)expected, (ma_uint32)desired, successOrder, failureOrder)\n#define ma_atomic_compare_exchange_weak_explicit_i64(dst, expected, desired, successOrder, failureOrder)    ma_atomic_compare_exchange_weak_explicit_64((ma_uint64*)dst, (ma_uint64*)expected, (ma_uint64)desired, successOrder, failureOrder)\n#define ma_atomic_fetch_add_explicit_i8( dst, src, order)               (ma_int8 )ma_atomic_fetch_add_explicit_8( (ma_uint8* )dst, (ma_uint8 )src, order)\n#define ma_atomic_fetch_add_explicit_i16(dst, src, order)               (ma_int16)ma_atomic_fetch_add_explicit_16((ma_uint16*)dst, (ma_uint16)src, order)\n#define ma_atomic_fetch_add_explicit_i32(dst, src, order)               (ma_int32)ma_atomic_fetch_add_explicit_32((ma_uint32*)dst, (ma_uint32)src, order)\n#define ma_atomic_fetch_add_explicit_i64(dst, src, order)               (ma_int64)ma_atomic_fetch_add_explicit_64((ma_uint64*)dst, (ma_uint64)src, order)\n#define ma_atomic_fetch_sub_explicit_i8( dst, src, order)               (ma_int8 )ma_atomic_fetch_sub_explicit_8( (ma_uint8* )dst, (ma_uint8 )src, order)\n#define ma_atomic_fetch_sub_explicit_i16(dst, src, order)               (ma_int16)ma_atomic_fetch_sub_explicit_16((ma_uint16*)dst, (ma_uint16)src, order)\n#define ma_atomic_fetch_sub_explicit_i32(dst, src, order)               (ma_int32)ma_atomic_fetch_sub_explicit_32((ma_uint32*)dst, (ma_uint32)src, order)\n#define ma_atomic_fetch_sub_explicit_i64(dst, src, order)               (ma_int64)ma_atomic_fetch_sub_explicit_64((ma_uint64*)dst, (ma_uint64)src, order)\n#define ma_atomic_fetch_or_explicit_i8( dst, src, order)                (ma_int8 )ma_atomic_fetch_or_explicit_8( (ma_uint8* )dst, (ma_uint8 )src, order)\n#define ma_atomic_fetch_or_explicit_i16(dst, src, order)                (ma_int16)ma_atomic_fetch_or_explicit_16((ma_uint16*)dst, (ma_uint16)src, order)\n#define ma_atomic_fetch_or_explicit_i32(dst, src, order)                (ma_int32)ma_atomic_fetch_or_explicit_32((ma_uint32*)dst, (ma_uint32)src, order)\n#define ma_atomic_fetch_or_explicit_i64(dst, src, order)                (ma_int64)ma_atomic_fetch_or_explicit_64((ma_uint64*)dst, (ma_uint64)src, order)\n#define ma_atomic_fetch_xor_explicit_i8( dst, src, order)               (ma_int8 )ma_atomic_fetch_xor_explicit_8( (ma_uint8* )dst, (ma_uint8 )src, order)\n#define ma_atomic_fetch_xor_explicit_i16(dst, src, order)               (ma_int16)ma_atomic_fetch_xor_explicit_16((ma_uint16*)dst, (ma_uint16)src, order)\n#define ma_atomic_fetch_xor_explicit_i32(dst, src, order)               (ma_int32)ma_atomic_fetch_xor_explicit_32((ma_uint32*)dst, (ma_uint32)src, order)\n#define ma_atomic_fetch_xor_explicit_i64(dst, src, order)               (ma_int64)ma_atomic_fetch_xor_explicit_64((ma_uint64*)dst, (ma_uint64)src, order)\n#define ma_atomic_fetch_and_explicit_i8( dst, src, order)               (ma_int8 )ma_atomic_fetch_and_explicit_8( (ma_uint8* )dst, (ma_uint8 )src, order)\n#define ma_atomic_fetch_and_explicit_i16(dst, src, order)               (ma_int16)ma_atomic_fetch_and_explicit_16((ma_uint16*)dst, (ma_uint16)src, order)\n#define ma_atomic_fetch_and_explicit_i32(dst, src, order)               (ma_int32)ma_atomic_fetch_and_explicit_32((ma_uint32*)dst, (ma_uint32)src, order)\n#define ma_atomic_fetch_and_explicit_i64(dst, src, order)               (ma_int64)ma_atomic_fetch_and_explicit_64((ma_uint64*)dst, (ma_uint64)src, order)\n#define ma_atomic_test_and_set_i8( ptr)                                 ma_atomic_test_and_set_explicit_i8( ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_test_and_set_i16(ptr)                                 ma_atomic_test_and_set_explicit_i16(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_test_and_set_i32(ptr)                                 ma_atomic_test_and_set_explicit_i32(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_test_and_set_i64(ptr)                                 ma_atomic_test_and_set_explicit_i64(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_clear_i8( ptr)                                        ma_atomic_clear_explicit_i8( ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_clear_i16(ptr)                                        ma_atomic_clear_explicit_i16(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_clear_i32(ptr)                                        ma_atomic_clear_explicit_i32(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_clear_i64(ptr)                                        ma_atomic_clear_explicit_i64(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_store_i8( dst, src)                                   ma_atomic_store_explicit_i8( dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_store_i16(dst, src)                                   ma_atomic_store_explicit_i16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_store_i32(dst, src)                                   ma_atomic_store_explicit_i32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_store_i64(dst, src)                                   ma_atomic_store_explicit_i64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_load_i8( ptr)                                         ma_atomic_load_explicit_i8( ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_load_i16(ptr)                                         ma_atomic_load_explicit_i16(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_load_i32(ptr)                                         ma_atomic_load_explicit_i32(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_load_i64(ptr)                                         ma_atomic_load_explicit_i64(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_exchange_i8( dst, src)                                ma_atomic_exchange_explicit_i8( dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_exchange_i16(dst, src)                                ma_atomic_exchange_explicit_i16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_exchange_i32(dst, src)                                ma_atomic_exchange_explicit_i32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_exchange_i64(dst, src)                                ma_atomic_exchange_explicit_i64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_strong_i8( dst, expected, desired)   ma_atomic_compare_exchange_strong_explicit_i8( dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_strong_i16(dst, expected, desired)   ma_atomic_compare_exchange_strong_explicit_i16(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_strong_i32(dst, expected, desired)   ma_atomic_compare_exchange_strong_explicit_i32(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_strong_i64(dst, expected, desired)   ma_atomic_compare_exchange_strong_explicit_i64(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_weak_i8( dst, expected, desired)     ma_atomic_compare_exchange_weak_explicit_i8( dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_weak_i16(dst, expected, desired)     ma_atomic_compare_exchange_weak_explicit_i16(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_weak_i32(dst, expected, desired)     ma_atomic_compare_exchange_weak_explicit_i32(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_weak_i64(dst, expected, desired)     ma_atomic_compare_exchange_weak_explicit_i64(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_add_i8( dst, src)                               ma_atomic_fetch_add_explicit_i8( dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_add_i16(dst, src)                               ma_atomic_fetch_add_explicit_i16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_add_i32(dst, src)                               ma_atomic_fetch_add_explicit_i32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_add_i64(dst, src)                               ma_atomic_fetch_add_explicit_i64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_sub_i8( dst, src)                               ma_atomic_fetch_sub_explicit_i8( dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_sub_i16(dst, src)                               ma_atomic_fetch_sub_explicit_i16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_sub_i32(dst, src)                               ma_atomic_fetch_sub_explicit_i32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_sub_i64(dst, src)                               ma_atomic_fetch_sub_explicit_i64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_or_i8( dst, src)                                ma_atomic_fetch_or_explicit_i8( dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_or_i16(dst, src)                                ma_atomic_fetch_or_explicit_i16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_or_i32(dst, src)                                ma_atomic_fetch_or_explicit_i32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_or_i64(dst, src)                                ma_atomic_fetch_or_explicit_i64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_xor_i8( dst, src)                               ma_atomic_fetch_xor_explicit_i8( dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_xor_i16(dst, src)                               ma_atomic_fetch_xor_explicit_i16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_xor_i32(dst, src)                               ma_atomic_fetch_xor_explicit_i32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_xor_i64(dst, src)                               ma_atomic_fetch_xor_explicit_i64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_and_i8( dst, src)                               ma_atomic_fetch_and_explicit_i8( dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_and_i16(dst, src)                               ma_atomic_fetch_and_explicit_i16(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_and_i32(dst, src)                               ma_atomic_fetch_and_explicit_i32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_and_i64(dst, src)                               ma_atomic_fetch_and_explicit_i64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_and_swap_i8( dst, expected, dedsired)         (ma_int8 )ma_atomic_compare_and_swap_8( (ma_uint8* )dst, (ma_uint8 )expected, (ma_uint8 )dedsired)\n#define ma_atomic_compare_and_swap_i16(dst, expected, dedsired)         (ma_int16)ma_atomic_compare_and_swap_16((ma_uint16*)dst, (ma_uint16)expected, (ma_uint16)dedsired)\n#define ma_atomic_compare_and_swap_i32(dst, expected, dedsired)         (ma_int32)ma_atomic_compare_and_swap_32((ma_uint32*)dst, (ma_uint32)expected, (ma_uint32)dedsired)\n#define ma_atomic_compare_and_swap_i64(dst, expected, dedsired)         (ma_int64)ma_atomic_compare_and_swap_64((ma_uint64*)dst, (ma_uint64)expected, (ma_uint64)dedsired)\ntypedef union\n{\n    ma_uint32 i;\n    float f;\n} ma_atomic_if32;\ntypedef union\n{\n    ma_uint64 i;\n    double f;\n} ma_atomic_if64;\n#define ma_atomic_clear_explicit_f32(ptr, order)                        ma_atomic_clear_explicit_32((ma_uint32*)ptr, order)\n#define ma_atomic_clear_explicit_f64(ptr, order)                        ma_atomic_clear_explicit_64((ma_uint64*)ptr, order)\nstatic MA_INLINE void ma_atomic_store_explicit_f32(volatile float* dst, float src, ma_atomic_memory_order order)\n{\n    ma_atomic_if32 x;\n    x.f = src;\n    ma_atomic_store_explicit_32((volatile ma_uint32*)dst, x.i, order);\n}\nstatic MA_INLINE void ma_atomic_store_explicit_f64(volatile double* dst, double src, ma_atomic_memory_order order)\n{\n    ma_atomic_if64 x;\n    x.f = src;\n    ma_atomic_store_explicit_64((volatile ma_uint64*)dst, x.i, order);\n}\nstatic MA_INLINE float ma_atomic_load_explicit_f32(volatile const float* ptr, ma_atomic_memory_order order)\n{\n    ma_atomic_if32 r;\n    r.i = ma_atomic_load_explicit_32((volatile const ma_uint32*)ptr, order);\n    return r.f;\n}\nstatic MA_INLINE double ma_atomic_load_explicit_f64(volatile const double* ptr, ma_atomic_memory_order order)\n{\n    ma_atomic_if64 r;\n    r.i = ma_atomic_load_explicit_64((volatile const ma_uint64*)ptr, order);\n    return r.f;\n}\nstatic MA_INLINE float ma_atomic_exchange_explicit_f32(volatile float* dst, float src, ma_atomic_memory_order order)\n{\n    ma_atomic_if32 r;\n    ma_atomic_if32 x;\n    x.f = src;\n    r.i = ma_atomic_exchange_explicit_32((volatile ma_uint32*)dst, x.i, order);\n    return r.f;\n}\nstatic MA_INLINE double ma_atomic_exchange_explicit_f64(volatile double* dst, double src, ma_atomic_memory_order order)\n{\n    ma_atomic_if64 r;\n    ma_atomic_if64 x;\n    x.f = src;\n    r.i = ma_atomic_exchange_explicit_64((volatile ma_uint64*)dst, x.i, order);\n    return r.f;\n}\nstatic MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_f32(volatile float* dst, float* expected, float desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder)\n{\n    ma_atomic_if32 d;\n    d.f = desired;\n    return ma_atomic_compare_exchange_strong_explicit_32((volatile ma_uint32*)dst, (ma_uint32*)expected, d.i, successOrder, failureOrder);\n}\nstatic MA_INLINE ma_bool32 ma_atomic_compare_exchange_strong_explicit_f64(volatile double* dst, double* expected, double desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder)\n{\n    ma_atomic_if64 d;\n    d.f = desired;\n    return ma_atomic_compare_exchange_strong_explicit_64((volatile ma_uint64*)dst, (ma_uint64*)expected, d.i, successOrder, failureOrder);\n}\nstatic MA_INLINE ma_bool32 ma_atomic_compare_exchange_weak_explicit_f32(volatile float* dst, float* expected, float desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder)\n{\n    ma_atomic_if32 d;\n    d.f = desired;\n    return ma_atomic_compare_exchange_weak_explicit_32((volatile ma_uint32*)dst, (ma_uint32*)expected, d.i, successOrder, failureOrder);\n}\nstatic MA_INLINE ma_bool32 ma_atomic_compare_exchange_weak_explicit_f64(volatile double* dst, double* expected, double desired, ma_atomic_memory_order successOrder, ma_atomic_memory_order failureOrder)\n{\n    ma_atomic_if64 d;\n    d.f = desired;\n    return ma_atomic_compare_exchange_weak_explicit_64((volatile ma_uint64*)dst, (ma_uint64*)expected, d.i, successOrder, failureOrder);\n}\nstatic MA_INLINE float ma_atomic_fetch_add_explicit_f32(volatile float* dst, float src, ma_atomic_memory_order order)\n{\n    ma_atomic_if32 r;\n    ma_atomic_if32 x;\n    x.f = src;\n    r.i = ma_atomic_fetch_add_explicit_32((volatile ma_uint32*)dst, x.i, order);\n    return r.f;\n}\nstatic MA_INLINE double ma_atomic_fetch_add_explicit_f64(volatile double* dst, double src, ma_atomic_memory_order order)\n{\n    ma_atomic_if64 r;\n    ma_atomic_if64 x;\n    x.f = src;\n    r.i = ma_atomic_fetch_add_explicit_64((volatile ma_uint64*)dst, x.i, order);\n    return r.f;\n}\nstatic MA_INLINE float ma_atomic_fetch_sub_explicit_f32(volatile float* dst, float src, ma_atomic_memory_order order)\n{\n    ma_atomic_if32 r;\n    ma_atomic_if32 x;\n    x.f = src;\n    r.i = ma_atomic_fetch_sub_explicit_32((volatile ma_uint32*)dst, x.i, order);\n    return r.f;\n}\nstatic MA_INLINE double ma_atomic_fetch_sub_explicit_f64(volatile double* dst, double src, ma_atomic_memory_order order)\n{\n    ma_atomic_if64 r;\n    ma_atomic_if64 x;\n    x.f = src;\n    r.i = ma_atomic_fetch_sub_explicit_64((volatile ma_uint64*)dst, x.i, order);\n    return r.f;\n}\nstatic MA_INLINE float ma_atomic_fetch_or_explicit_f32(volatile float* dst, float src, ma_atomic_memory_order order)\n{\n    ma_atomic_if32 r;\n    ma_atomic_if32 x;\n    x.f = src;\n    r.i = ma_atomic_fetch_or_explicit_32((volatile ma_uint32*)dst, x.i, order);\n    return r.f;\n}\nstatic MA_INLINE double ma_atomic_fetch_or_explicit_f64(volatile double* dst, double src, ma_atomic_memory_order order)\n{\n    ma_atomic_if64 r;\n    ma_atomic_if64 x;\n    x.f = src;\n    r.i = ma_atomic_fetch_or_explicit_64((volatile ma_uint64*)dst, x.i, order);\n    return r.f;\n}\nstatic MA_INLINE float ma_atomic_fetch_xor_explicit_f32(volatile float* dst, float src, ma_atomic_memory_order order)\n{\n    ma_atomic_if32 r;\n    ma_atomic_if32 x;\n    x.f = src;\n    r.i = ma_atomic_fetch_xor_explicit_32((volatile ma_uint32*)dst, x.i, order);\n    return r.f;\n}\nstatic MA_INLINE double ma_atomic_fetch_xor_explicit_f64(volatile double* dst, double src, ma_atomic_memory_order order)\n{\n    ma_atomic_if64 r;\n    ma_atomic_if64 x;\n    x.f = src;\n    r.i = ma_atomic_fetch_xor_explicit_64((volatile ma_uint64*)dst, x.i, order);\n    return r.f;\n}\nstatic MA_INLINE float ma_atomic_fetch_and_explicit_f32(volatile float* dst, float src, ma_atomic_memory_order order)\n{\n    ma_atomic_if32 r;\n    ma_atomic_if32 x;\n    x.f = src;\n    r.i = ma_atomic_fetch_and_explicit_32((volatile ma_uint32*)dst, x.i, order);\n    return r.f;\n}\nstatic MA_INLINE double ma_atomic_fetch_and_explicit_f64(volatile double* dst, double src, ma_atomic_memory_order order)\n{\n    ma_atomic_if64 r;\n    ma_atomic_if64 x;\n    x.f = src;\n    r.i = ma_atomic_fetch_and_explicit_64((volatile ma_uint64*)dst, x.i, order);\n    return r.f;\n}\n#define ma_atomic_clear_f32(ptr)                                        (float )ma_atomic_clear_explicit_f32(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_clear_f64(ptr)                                        (double)ma_atomic_clear_explicit_f64(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_store_f32(dst, src)                                   ma_atomic_store_explicit_f32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_store_f64(dst, src)                                   ma_atomic_store_explicit_f64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_load_f32(ptr)                                         (float )ma_atomic_load_explicit_f32(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_load_f64(ptr)                                         (double)ma_atomic_load_explicit_f64(ptr, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_exchange_f32(dst, src)                                (float )ma_atomic_exchange_explicit_f32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_exchange_f64(dst, src)                                (double)ma_atomic_exchange_explicit_f64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_strong_f32(dst, expected, desired)   ma_atomic_compare_exchange_strong_explicit_f32(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_strong_f64(dst, expected, desired)   ma_atomic_compare_exchange_strong_explicit_f64(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_weak_f32(dst, expected, desired)     ma_atomic_compare_exchange_weak_explicit_f32(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_compare_exchange_weak_f64(dst, expected, desired)     ma_atomic_compare_exchange_weak_explicit_f64(dst, expected, desired, ma_atomic_memory_order_seq_cst, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_add_f32(dst, src)                               ma_atomic_fetch_add_explicit_f32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_add_f64(dst, src)                               ma_atomic_fetch_add_explicit_f64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_sub_f32(dst, src)                               ma_atomic_fetch_sub_explicit_f32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_sub_f64(dst, src)                               ma_atomic_fetch_sub_explicit_f64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_or_f32(dst, src)                                ma_atomic_fetch_or_explicit_f32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_or_f64(dst, src)                                ma_atomic_fetch_or_explicit_f64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_xor_f32(dst, src)                               ma_atomic_fetch_xor_explicit_f32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_xor_f64(dst, src)                               ma_atomic_fetch_xor_explicit_f64(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_and_f32(dst, src)                               ma_atomic_fetch_and_explicit_f32(dst, src, ma_atomic_memory_order_seq_cst)\n#define ma_atomic_fetch_and_f64(dst, src)                               ma_atomic_fetch_and_explicit_f64(dst, src, ma_atomic_memory_order_seq_cst)\nstatic MA_INLINE float ma_atomic_compare_and_swap_f32(volatile float* dst, float expected, float desired)\n{\n    ma_atomic_if32 r;\n    ma_atomic_if32 e, d;\n    e.f = expected;\n    d.f = desired;\n    r.i = ma_atomic_compare_and_swap_32((volatile ma_uint32*)dst, e.i, d.i);\n    return r.f;\n}\nstatic MA_INLINE double ma_atomic_compare_and_swap_f64(volatile double* dst, double expected, double desired)\n{\n    ma_atomic_if64 r;\n    ma_atomic_if64 e, d;\n    e.f = expected;\n    d.f = desired;\n    r.i = ma_atomic_compare_and_swap_64((volatile ma_uint64*)dst, e.i, d.i);\n    return r.f;\n}\ntypedef ma_atomic_flag ma_atomic_spinlock;\nstatic MA_INLINE void ma_atomic_spinlock_lock(volatile ma_atomic_spinlock* pSpinlock)\n{\n    for (;;) {\n        if (ma_atomic_flag_test_and_set_explicit(pSpinlock, ma_atomic_memory_order_acquire) == 0) {\n            break;\n        }\n        while (c89atoimc_flag_load_explicit(pSpinlock, ma_atomic_memory_order_relaxed) == 1) {\n        }\n    }\n}\nstatic MA_INLINE void ma_atomic_spinlock_unlock(volatile ma_atomic_spinlock* pSpinlock)\n{\n    ma_atomic_flag_clear_explicit(pSpinlock, ma_atomic_memory_order_release);\n}\n#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n    #pragma GCC diagnostic pop\n#endif\n#if defined(__cplusplus)\n}\n#endif\n#endif\n/* ma_atomic.h end */\n\n#define MA_ATOMIC_SAFE_TYPE_IMPL(c89TypeExtension, type) \\\n    static MA_INLINE ma_##type ma_atomic_##type##_get(ma_atomic_##type* x) \\\n    { \\\n        return (ma_##type)ma_atomic_load_##c89TypeExtension(&x->value); \\\n    } \\\n    static MA_INLINE void ma_atomic_##type##_set(ma_atomic_##type* x, ma_##type value) \\\n    { \\\n        ma_atomic_store_##c89TypeExtension(&x->value, value); \\\n    } \\\n    static MA_INLINE ma_##type ma_atomic_##type##_exchange(ma_atomic_##type* x, ma_##type value) \\\n    { \\\n        return (ma_##type)ma_atomic_exchange_##c89TypeExtension(&x->value, value); \\\n    } \\\n    static MA_INLINE ma_bool32 ma_atomic_##type##_compare_exchange(ma_atomic_##type* x, ma_##type* expected, ma_##type desired) \\\n    { \\\n        return ma_atomic_compare_exchange_weak_##c89TypeExtension(&x->value, expected, desired); \\\n    } \\\n    static MA_INLINE ma_##type ma_atomic_##type##_fetch_add(ma_atomic_##type* x, ma_##type y) \\\n    { \\\n        return (ma_##type)ma_atomic_fetch_add_##c89TypeExtension(&x->value, y); \\\n    } \\\n    static MA_INLINE ma_##type ma_atomic_##type##_fetch_sub(ma_atomic_##type* x, ma_##type y) \\\n    { \\\n        return (ma_##type)ma_atomic_fetch_sub_##c89TypeExtension(&x->value, y); \\\n    } \\\n    static MA_INLINE ma_##type ma_atomic_##type##_fetch_or(ma_atomic_##type* x, ma_##type y) \\\n    { \\\n        return (ma_##type)ma_atomic_fetch_or_##c89TypeExtension(&x->value, y); \\\n    } \\\n    static MA_INLINE ma_##type ma_atomic_##type##_fetch_xor(ma_atomic_##type* x, ma_##type y) \\\n    { \\\n        return (ma_##type)ma_atomic_fetch_xor_##c89TypeExtension(&x->value, y); \\\n    } \\\n    static MA_INLINE ma_##type ma_atomic_##type##_fetch_and(ma_atomic_##type* x, ma_##type y) \\\n    { \\\n        return (ma_##type)ma_atomic_fetch_and_##c89TypeExtension(&x->value, y); \\\n    } \\\n    static MA_INLINE ma_##type ma_atomic_##type##_compare_and_swap(ma_atomic_##type* x, ma_##type expected, ma_##type desired) \\\n    { \\\n        return (ma_##type)ma_atomic_compare_and_swap_##c89TypeExtension(&x->value, expected, desired); \\\n    } \\\n\n#define MA_ATOMIC_SAFE_TYPE_IMPL_PTR(type) \\\n    static MA_INLINE ma_##type* ma_atomic_ptr_##type##_get(ma_atomic_ptr_##type* x) \\\n    { \\\n        return ma_atomic_load_ptr((void**)&x->value); \\\n    } \\\n    static MA_INLINE void ma_atomic_ptr_##type##_set(ma_atomic_ptr_##type* x, ma_##type* value) \\\n    { \\\n        ma_atomic_store_ptr((void**)&x->value, (void*)value); \\\n    } \\\n    static MA_INLINE ma_##type* ma_atomic_ptr_##type##_exchange(ma_atomic_ptr_##type* x, ma_##type* value) \\\n    { \\\n        return ma_atomic_exchange_ptr((void**)&x->value, (void*)value); \\\n    } \\\n    static MA_INLINE ma_bool32 ma_atomic_ptr_##type##_compare_exchange(ma_atomic_ptr_##type* x, ma_##type** expected, ma_##type* desired) \\\n    { \\\n        return ma_atomic_compare_exchange_weak_ptr((void**)&x->value, (void*)expected, (void*)desired); \\\n    } \\\n    static MA_INLINE ma_##type* ma_atomic_ptr_##type##_compare_and_swap(ma_atomic_ptr_##type* x, ma_##type* expected, ma_##type* desired) \\\n    { \\\n        return (ma_##type*)ma_atomic_compare_and_swap_ptr((void**)&x->value, (void*)expected, (void*)desired); \\\n    } \\\n\nMA_ATOMIC_SAFE_TYPE_IMPL(32,  uint32)\nMA_ATOMIC_SAFE_TYPE_IMPL(i32, int32)\nMA_ATOMIC_SAFE_TYPE_IMPL(64,  uint64)\nMA_ATOMIC_SAFE_TYPE_IMPL(f32, float)\nMA_ATOMIC_SAFE_TYPE_IMPL(32,  bool32)\n\n#if !defined(MA_NO_DEVICE_IO)\nMA_ATOMIC_SAFE_TYPE_IMPL(i32, device_state)\n#endif\n\n\nMA_API ma_uint64 ma_calculate_frame_count_after_resampling(ma_uint32 sampleRateOut, ma_uint32 sampleRateIn, ma_uint64 frameCountIn)\n{\n    /* This is based on the calculation in ma_linear_resampler_get_expected_output_frame_count(). */\n    ma_uint64 outputFrameCount;\n    ma_uint64 preliminaryInputFrameCountFromFrac;\n    ma_uint64 preliminaryInputFrameCount;\n\n    if (sampleRateIn == 0 || sampleRateOut == 0 || frameCountIn == 0) {\n        return 0;\n    }\n\n    if (sampleRateOut == sampleRateIn) {\n        return frameCountIn;\n    }\n\n    outputFrameCount = (frameCountIn * sampleRateOut) / sampleRateIn;\n\n    preliminaryInputFrameCountFromFrac = (outputFrameCount * (sampleRateIn / sampleRateOut)) / sampleRateOut;\n    preliminaryInputFrameCount         = (outputFrameCount * (sampleRateIn % sampleRateOut)) + preliminaryInputFrameCountFromFrac;\n\n    if (preliminaryInputFrameCount <= frameCountIn) {\n        outputFrameCount += 1;\n    }\n\n    return outputFrameCount;\n}\n\n#ifndef MA_DATA_CONVERTER_STACK_BUFFER_SIZE\n#define MA_DATA_CONVERTER_STACK_BUFFER_SIZE     4096\n#endif\n\n\n\n#if defined(MA_WIN32)\nstatic ma_result ma_result_from_GetLastError(DWORD error)\n{\n    switch (error)\n    {\n        case ERROR_SUCCESS:             return MA_SUCCESS;\n        case ERROR_PATH_NOT_FOUND:      return MA_DOES_NOT_EXIST;\n        case ERROR_TOO_MANY_OPEN_FILES: return MA_TOO_MANY_OPEN_FILES;\n        case ERROR_NOT_ENOUGH_MEMORY:   return MA_OUT_OF_MEMORY;\n        case ERROR_DISK_FULL:           return MA_NO_SPACE;\n        case ERROR_HANDLE_EOF:          return MA_AT_END;\n        case ERROR_NEGATIVE_SEEK:       return MA_BAD_SEEK;\n        case ERROR_INVALID_PARAMETER:   return MA_INVALID_ARGS;\n        case ERROR_ACCESS_DENIED:       return MA_ACCESS_DENIED;\n        case ERROR_SEM_TIMEOUT:         return MA_TIMEOUT;\n        case ERROR_FILE_NOT_FOUND:      return MA_DOES_NOT_EXIST;\n        default: break;\n    }\n\n    return MA_ERROR;\n}\n#endif  /* MA_WIN32 */\n\n\n/*******************************************************************************\n\nThreading\n\n*******************************************************************************/\nstatic MA_INLINE ma_result ma_spinlock_lock_ex(volatile ma_spinlock* pSpinlock, ma_bool32 yield)\n{\n    if (pSpinlock == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    for (;;) {\n        if (ma_atomic_exchange_explicit_32(pSpinlock, 1, ma_atomic_memory_order_acquire) == 0) {\n            break;\n        }\n\n        while (ma_atomic_load_explicit_32(pSpinlock, ma_atomic_memory_order_relaxed) == 1) {\n            if (yield) {\n                ma_yield();\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_spinlock_lock(volatile ma_spinlock* pSpinlock)\n{\n    return ma_spinlock_lock_ex(pSpinlock, MA_TRUE);\n}\n\nMA_API ma_result ma_spinlock_lock_noyield(volatile ma_spinlock* pSpinlock)\n{\n    return ma_spinlock_lock_ex(pSpinlock, MA_FALSE);\n}\n\nMA_API ma_result ma_spinlock_unlock(volatile ma_spinlock* pSpinlock)\n{\n    if (pSpinlock == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_atomic_store_explicit_32(pSpinlock, 0, ma_atomic_memory_order_release);\n    return MA_SUCCESS;\n}\n\n\n#ifndef MA_NO_THREADING\n#if defined(MA_POSIX)\n    #define MA_THREADCALL\n    typedef void* ma_thread_result;\n#elif defined(MA_WIN32)\n    #define MA_THREADCALL WINAPI\n    typedef unsigned long ma_thread_result;\n#endif\n\ntypedef ma_thread_result (MA_THREADCALL * ma_thread_entry_proc)(void* pData);\n\n#ifdef MA_POSIX\nstatic ma_result ma_thread_create__posix(ma_thread* pThread, ma_thread_priority priority, size_t stackSize, ma_thread_entry_proc entryProc, void* pData)\n{\n    int result;\n    pthread_attr_t* pAttr = NULL;\n\n#if !defined(__EMSCRIPTEN__)\n    /* Try setting the thread priority. It's not critical if anything fails here. */\n    pthread_attr_t attr;\n    if (pthread_attr_init(&attr) == 0) {\n        int scheduler = -1;\n\n        /* We successfully initialized our attributes object so we can assign the pointer so it's passed into pthread_create(). */\n        pAttr = &attr;\n\n        /* We need to set the scheduler policy. Only do this if the OS supports pthread_attr_setschedpolicy() */\n        #if !defined(MA_BEOS)\n        {\n            if (priority == ma_thread_priority_idle) {\n            #ifdef SCHED_IDLE\n                if (pthread_attr_setschedpolicy(&attr, SCHED_IDLE) == 0) {\n                    scheduler = SCHED_IDLE;\n                }\n            #endif\n            } else if (priority == ma_thread_priority_realtime) {\n            #ifdef SCHED_FIFO\n                if (pthread_attr_setschedpolicy(&attr, SCHED_FIFO) == 0) {\n                    scheduler = SCHED_FIFO;\n                }\n            #endif\n            #ifdef MA_LINUX\n            } else {\n                scheduler = sched_getscheduler(0);\n            #endif\n            }\n        }\n        #endif\n\n        if (stackSize > 0) {\n            pthread_attr_setstacksize(&attr, stackSize);\n        }\n\n        if (scheduler != -1) {\n            int priorityMin = sched_get_priority_min(scheduler);\n            int priorityMax = sched_get_priority_max(scheduler);\n            int priorityStep = (priorityMax - priorityMin) / 7;  /* 7 = number of priorities supported by miniaudio. */\n\n            struct sched_param sched;\n            if (pthread_attr_getschedparam(&attr, &sched) == 0) {\n                if (priority == ma_thread_priority_idle) {\n                    sched.sched_priority = priorityMin;\n                } else if (priority == ma_thread_priority_realtime) {\n                    sched.sched_priority = priorityMax;\n                } else {\n                    sched.sched_priority += ((int)priority + 5) * priorityStep;  /* +5 because the lowest priority is -5. */\n                    if (sched.sched_priority < priorityMin) {\n                        sched.sched_priority = priorityMin;\n                    }\n                    if (sched.sched_priority > priorityMax) {\n                        sched.sched_priority = priorityMax;\n                    }\n                }\n\n                /* I'm not treating a failure of setting the priority as a critical error so not checking the return value here. */\n                pthread_attr_setschedparam(&attr, &sched);\n            }\n        }\n    }\n#else\n    /* It's the emscripten build. We'll have a few unused parameters. */\n    (void)priority;\n    (void)stackSize;\n#endif\n\n    result = pthread_create((pthread_t*)pThread, pAttr, entryProc, pData);\n\n    /* The thread attributes object is no longer required. */\n    if (pAttr != NULL) {\n        pthread_attr_destroy(pAttr);\n    }\n\n    if (result != 0) {\n        return ma_result_from_errno(result);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_thread_wait__posix(ma_thread* pThread)\n{\n    pthread_join((pthread_t)*pThread, NULL);\n}\n\n\nstatic ma_result ma_mutex_init__posix(ma_mutex* pMutex)\n{\n    int result;\n    \n    if (pMutex == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pMutex);\n\n    result = pthread_mutex_init((pthread_mutex_t*)pMutex, NULL);\n    if (result != 0) {\n        return ma_result_from_errno(result);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_mutex_uninit__posix(ma_mutex* pMutex)\n{\n    pthread_mutex_destroy((pthread_mutex_t*)pMutex);\n}\n\nstatic void ma_mutex_lock__posix(ma_mutex* pMutex)\n{\n    pthread_mutex_lock((pthread_mutex_t*)pMutex);\n}\n\nstatic void ma_mutex_unlock__posix(ma_mutex* pMutex)\n{\n    pthread_mutex_unlock((pthread_mutex_t*)pMutex);\n}\n\n\nstatic ma_result ma_event_init__posix(ma_event* pEvent)\n{\n    int result;\n\n    result = pthread_mutex_init((pthread_mutex_t*)&pEvent->lock, NULL);\n    if (result != 0) {\n        return ma_result_from_errno(result);\n    }\n\n    result = pthread_cond_init((pthread_cond_t*)&pEvent->cond, NULL);\n    if (result != 0) {\n        pthread_mutex_destroy((pthread_mutex_t*)&pEvent->lock);\n        return ma_result_from_errno(result);\n    }\n\n    pEvent->value = 0;\n    return MA_SUCCESS;\n}\n\nstatic void ma_event_uninit__posix(ma_event* pEvent)\n{\n    pthread_cond_destroy((pthread_cond_t*)&pEvent->cond);\n    pthread_mutex_destroy((pthread_mutex_t*)&pEvent->lock);\n}\n\nstatic ma_result ma_event_wait__posix(ma_event* pEvent)\n{\n    pthread_mutex_lock((pthread_mutex_t*)&pEvent->lock);\n    {\n        while (pEvent->value == 0) {\n            pthread_cond_wait((pthread_cond_t*)&pEvent->cond, (pthread_mutex_t*)&pEvent->lock);\n        }\n        pEvent->value = 0;  /* Auto-reset. */\n    }\n    pthread_mutex_unlock((pthread_mutex_t*)&pEvent->lock);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_event_signal__posix(ma_event* pEvent)\n{\n    pthread_mutex_lock((pthread_mutex_t*)&pEvent->lock);\n    {\n        pEvent->value = 1;\n        pthread_cond_signal((pthread_cond_t*)&pEvent->cond);\n    }\n    pthread_mutex_unlock((pthread_mutex_t*)&pEvent->lock);\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_semaphore_init__posix(int initialValue, ma_semaphore* pSemaphore)\n{\n    int result;\n\n    if (pSemaphore == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pSemaphore->value = initialValue;\n\n    result = pthread_mutex_init((pthread_mutex_t*)&pSemaphore->lock, NULL);\n    if (result != 0) {\n        return ma_result_from_errno(result);  /* Failed to create mutex. */\n    }\n\n    result = pthread_cond_init((pthread_cond_t*)&pSemaphore->cond, NULL);\n    if (result != 0) {\n        pthread_mutex_destroy((pthread_mutex_t*)&pSemaphore->lock);\n        return ma_result_from_errno(result);  /* Failed to create condition variable. */\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_semaphore_uninit__posix(ma_semaphore* pSemaphore)\n{\n    if (pSemaphore == NULL) {\n        return;\n    }\n\n    pthread_cond_destroy((pthread_cond_t*)&pSemaphore->cond);\n    pthread_mutex_destroy((pthread_mutex_t*)&pSemaphore->lock);\n}\n\nstatic ma_result ma_semaphore_wait__posix(ma_semaphore* pSemaphore)\n{\n    if (pSemaphore == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pthread_mutex_lock((pthread_mutex_t*)&pSemaphore->lock);\n    {\n        /* We need to wait on a condition variable before escaping. We can't return from this function until the semaphore has been signaled. */\n        while (pSemaphore->value == 0) {\n            pthread_cond_wait((pthread_cond_t*)&pSemaphore->cond, (pthread_mutex_t*)&pSemaphore->lock);\n        }\n\n        pSemaphore->value -= 1;\n    }\n    pthread_mutex_unlock((pthread_mutex_t*)&pSemaphore->lock);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_semaphore_release__posix(ma_semaphore* pSemaphore)\n{\n    if (pSemaphore == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pthread_mutex_lock((pthread_mutex_t*)&pSemaphore->lock);\n    {\n        pSemaphore->value += 1;\n        pthread_cond_signal((pthread_cond_t*)&pSemaphore->cond);\n    }\n    pthread_mutex_unlock((pthread_mutex_t*)&pSemaphore->lock);\n\n    return MA_SUCCESS;\n}\n#elif defined(MA_WIN32)\nstatic int ma_thread_priority_to_win32(ma_thread_priority priority)\n{\n    switch (priority) {\n        case ma_thread_priority_idle:     return THREAD_PRIORITY_IDLE;\n        case ma_thread_priority_lowest:   return THREAD_PRIORITY_LOWEST;\n        case ma_thread_priority_low:      return THREAD_PRIORITY_BELOW_NORMAL;\n        case ma_thread_priority_normal:   return THREAD_PRIORITY_NORMAL;\n        case ma_thread_priority_high:     return THREAD_PRIORITY_ABOVE_NORMAL;\n        case ma_thread_priority_highest:  return THREAD_PRIORITY_HIGHEST;\n        case ma_thread_priority_realtime: return THREAD_PRIORITY_TIME_CRITICAL;\n        default:                          return THREAD_PRIORITY_NORMAL;\n    }\n}\n\nstatic ma_result ma_thread_create__win32(ma_thread* pThread, ma_thread_priority priority, size_t stackSize, ma_thread_entry_proc entryProc, void* pData)\n{\n    DWORD threadID; /* Not used. Only used for passing into CreateThread() so it doesn't fail on Windows 98. */\n\n    *pThread = CreateThread(NULL, stackSize, entryProc, pData, 0, &threadID);\n    if (*pThread == NULL) {\n        return ma_result_from_GetLastError(GetLastError());\n    }\n\n    SetThreadPriority((HANDLE)*pThread, ma_thread_priority_to_win32(priority));\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_thread_wait__win32(ma_thread* pThread)\n{\n    WaitForSingleObject((HANDLE)*pThread, INFINITE);\n    CloseHandle((HANDLE)*pThread);\n}\n\n\nstatic ma_result ma_mutex_init__win32(ma_mutex* pMutex)\n{\n    *pMutex = CreateEventA(NULL, FALSE, TRUE, NULL);\n    if (*pMutex == NULL) {\n        return ma_result_from_GetLastError(GetLastError());\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_mutex_uninit__win32(ma_mutex* pMutex)\n{\n    CloseHandle((HANDLE)*pMutex);\n}\n\nstatic void ma_mutex_lock__win32(ma_mutex* pMutex)\n{\n    WaitForSingleObject((HANDLE)*pMutex, INFINITE);\n}\n\nstatic void ma_mutex_unlock__win32(ma_mutex* pMutex)\n{\n    SetEvent((HANDLE)*pMutex);\n}\n\n\nstatic ma_result ma_event_init__win32(ma_event* pEvent)\n{\n    *pEvent = CreateEventA(NULL, FALSE, FALSE, NULL);\n    if (*pEvent == NULL) {\n        return ma_result_from_GetLastError(GetLastError());\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_event_uninit__win32(ma_event* pEvent)\n{\n    CloseHandle((HANDLE)*pEvent);\n}\n\nstatic ma_result ma_event_wait__win32(ma_event* pEvent)\n{\n    DWORD result = WaitForSingleObject((HANDLE)*pEvent, INFINITE);\n    if (result == WAIT_OBJECT_0) {\n        return MA_SUCCESS;\n    }\n\n    if (result == WAIT_TIMEOUT) {\n        return MA_TIMEOUT;\n    }\n\n    return ma_result_from_GetLastError(GetLastError());\n}\n\nstatic ma_result ma_event_signal__win32(ma_event* pEvent)\n{\n    BOOL result = SetEvent((HANDLE)*pEvent);\n    if (result == 0) {\n        return ma_result_from_GetLastError(GetLastError());\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_semaphore_init__win32(int initialValue, ma_semaphore* pSemaphore)\n{\n    *pSemaphore = CreateSemaphoreW(NULL, (LONG)initialValue, LONG_MAX, NULL);\n    if (*pSemaphore == NULL) {\n        return ma_result_from_GetLastError(GetLastError());\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_semaphore_uninit__win32(ma_semaphore* pSemaphore)\n{\n    CloseHandle((HANDLE)*pSemaphore);\n}\n\nstatic ma_result ma_semaphore_wait__win32(ma_semaphore* pSemaphore)\n{\n    DWORD result = WaitForSingleObject((HANDLE)*pSemaphore, INFINITE);\n    if (result == WAIT_OBJECT_0) {\n        return MA_SUCCESS;\n    }\n\n    if (result == WAIT_TIMEOUT) {\n        return MA_TIMEOUT;\n    }\n\n    return ma_result_from_GetLastError(GetLastError());\n}\n\nstatic ma_result ma_semaphore_release__win32(ma_semaphore* pSemaphore)\n{\n    BOOL result = ReleaseSemaphore((HANDLE)*pSemaphore, 1, NULL);\n    if (result == 0) {\n        return ma_result_from_GetLastError(GetLastError());\n    }\n\n    return MA_SUCCESS;\n}\n#endif\n\ntypedef struct\n{\n    ma_thread_entry_proc entryProc;\n    void* pData;\n    ma_allocation_callbacks allocationCallbacks;\n} ma_thread_proxy_data;\n\nstatic ma_thread_result MA_THREADCALL ma_thread_entry_proxy(void* pData)\n{\n    ma_thread_proxy_data* pProxyData = (ma_thread_proxy_data*)pData;\n    ma_thread_entry_proc entryProc;\n    void* pEntryProcData;\n    ma_thread_result result;\n\n    #if defined(MA_ON_THREAD_ENTRY)\n        MA_ON_THREAD_ENTRY\n    #endif\n\n    entryProc = pProxyData->entryProc;\n    pEntryProcData = pProxyData->pData;\n\n    /* Free the proxy data before getting into the real thread entry proc. */\n    ma_free(pProxyData, &pProxyData->allocationCallbacks);\n\n    result = entryProc(pEntryProcData);\n\n    #if defined(MA_ON_THREAD_EXIT)\n        MA_ON_THREAD_EXIT\n    #endif\n\n    return result;\n}\n\nstatic ma_result ma_thread_create(ma_thread* pThread, ma_thread_priority priority, size_t stackSize, ma_thread_entry_proc entryProc, void* pData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_result result;\n    ma_thread_proxy_data* pProxyData;\n\n    if (pThread == NULL || entryProc == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pProxyData = (ma_thread_proxy_data*)ma_malloc(sizeof(*pProxyData), pAllocationCallbacks);   /* Will be freed by the proxy entry proc. */\n    if (pProxyData == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n#if defined(MA_THREAD_DEFAULT_STACK_SIZE)\n    if (stackSize == 0) {\n        stackSize = MA_THREAD_DEFAULT_STACK_SIZE;\n    }\n#endif\n\n    pProxyData->entryProc = entryProc;\n    pProxyData->pData     = pData;\n    ma_allocation_callbacks_init_copy(&pProxyData->allocationCallbacks, pAllocationCallbacks);\n\n#if defined(MA_POSIX)\n    result = ma_thread_create__posix(pThread, priority, stackSize, ma_thread_entry_proxy, pProxyData);\n#elif defined(MA_WIN32)\n    result = ma_thread_create__win32(pThread, priority, stackSize, ma_thread_entry_proxy, pProxyData);\n#endif\n\n    if (result != MA_SUCCESS) {\n        ma_free(pProxyData, pAllocationCallbacks);\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_thread_wait(ma_thread* pThread)\n{\n    if (pThread == NULL) {\n        return;\n    }\n\n#if defined(MA_POSIX)\n    ma_thread_wait__posix(pThread);\n#elif defined(MA_WIN32)\n    ma_thread_wait__win32(pThread);\n#endif\n}\n\n\nMA_API ma_result ma_mutex_init(ma_mutex* pMutex)\n{\n    if (pMutex == NULL) {\n        MA_ASSERT(MA_FALSE);    /* Fire an assert so the caller is aware of this bug. */\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_POSIX)\n    return ma_mutex_init__posix(pMutex);\n#elif defined(MA_WIN32)\n    return ma_mutex_init__win32(pMutex);\n#endif\n}\n\nMA_API void ma_mutex_uninit(ma_mutex* pMutex)\n{\n    if (pMutex == NULL) {\n        return;\n    }\n\n#if defined(MA_POSIX)\n    ma_mutex_uninit__posix(pMutex);\n#elif defined(MA_WIN32)\n    ma_mutex_uninit__win32(pMutex);\n#endif\n}\n\nMA_API void ma_mutex_lock(ma_mutex* pMutex)\n{\n    if (pMutex == NULL) {\n        MA_ASSERT(MA_FALSE);    /* Fire an assert so the caller is aware of this bug. */\n        return;\n    }\n\n#if defined(MA_POSIX)\n    ma_mutex_lock__posix(pMutex);\n#elif defined(MA_WIN32)\n    ma_mutex_lock__win32(pMutex);\n#endif\n}\n\nMA_API void ma_mutex_unlock(ma_mutex* pMutex)\n{\n    if (pMutex == NULL) {\n        MA_ASSERT(MA_FALSE);    /* Fire an assert so the caller is aware of this bug. */\n        return;\n    }\n\n#if defined(MA_POSIX)\n    ma_mutex_unlock__posix(pMutex);\n#elif defined(MA_WIN32)\n    ma_mutex_unlock__win32(pMutex);\n#endif\n}\n\n\nMA_API ma_result ma_event_init(ma_event* pEvent)\n{\n    if (pEvent == NULL) {\n        MA_ASSERT(MA_FALSE);    /* Fire an assert so the caller is aware of this bug. */\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_POSIX)\n    return ma_event_init__posix(pEvent);\n#elif defined(MA_WIN32)\n    return ma_event_init__win32(pEvent);\n#endif\n}\n\n#if 0\nstatic ma_result ma_event_alloc_and_init(ma_event** ppEvent, ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_result result;\n    ma_event* pEvent;\n\n    if (ppEvent == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *ppEvent = NULL;\n\n    pEvent = ma_malloc(sizeof(*pEvent), pAllocationCallbacks);\n    if (pEvent == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_event_init(pEvent);\n    if (result != MA_SUCCESS) {\n        ma_free(pEvent, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppEvent = pEvent;\n    return result;\n}\n#endif\n\nMA_API void ma_event_uninit(ma_event* pEvent)\n{\n    if (pEvent == NULL) {\n        return;\n    }\n\n#if defined(MA_POSIX)\n    ma_event_uninit__posix(pEvent);\n#elif defined(MA_WIN32)\n    ma_event_uninit__win32(pEvent);\n#endif\n}\n\n#if 0\nstatic void ma_event_uninit_and_free(ma_event* pEvent, ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pEvent == NULL) {\n        return;\n    }\n\n    ma_event_uninit(pEvent);\n    ma_free(pEvent, pAllocationCallbacks);\n}\n#endif\n\nMA_API ma_result ma_event_wait(ma_event* pEvent)\n{\n    if (pEvent == NULL) {\n        MA_ASSERT(MA_FALSE);    /* Fire an assert to the caller is aware of this bug. */\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_POSIX)\n    return ma_event_wait__posix(pEvent);\n#elif defined(MA_WIN32)\n    return ma_event_wait__win32(pEvent);\n#endif\n}\n\nMA_API ma_result ma_event_signal(ma_event* pEvent)\n{\n    if (pEvent == NULL) {\n        MA_ASSERT(MA_FALSE);    /* Fire an assert to the caller is aware of this bug. */\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_POSIX)\n    return ma_event_signal__posix(pEvent);\n#elif defined(MA_WIN32)\n    return ma_event_signal__win32(pEvent);\n#endif\n}\n\n\nMA_API ma_result ma_semaphore_init(int initialValue, ma_semaphore* pSemaphore)\n{\n    if (pSemaphore == NULL) {\n        MA_ASSERT(MA_FALSE);    /* Fire an assert so the caller is aware of this bug. */\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_POSIX)\n    return ma_semaphore_init__posix(initialValue, pSemaphore);\n#elif defined(MA_WIN32)\n    return ma_semaphore_init__win32(initialValue, pSemaphore);\n#endif\n}\n\nMA_API void ma_semaphore_uninit(ma_semaphore* pSemaphore)\n{\n    if (pSemaphore == NULL) {\n        MA_ASSERT(MA_FALSE);    /* Fire an assert so the caller is aware of this bug. */\n        return;\n    }\n\n#if defined(MA_POSIX)\n    ma_semaphore_uninit__posix(pSemaphore);\n#elif defined(MA_WIN32)\n    ma_semaphore_uninit__win32(pSemaphore);\n#endif\n}\n\nMA_API ma_result ma_semaphore_wait(ma_semaphore* pSemaphore)\n{\n    if (pSemaphore == NULL) {\n        MA_ASSERT(MA_FALSE);    /* Fire an assert so the caller is aware of this bug. */\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_POSIX)\n    return ma_semaphore_wait__posix(pSemaphore);\n#elif defined(MA_WIN32)\n    return ma_semaphore_wait__win32(pSemaphore);\n#endif\n}\n\nMA_API ma_result ma_semaphore_release(ma_semaphore* pSemaphore)\n{\n    if (pSemaphore == NULL) {\n        MA_ASSERT(MA_FALSE);    /* Fire an assert so the caller is aware of this bug. */\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_POSIX)\n    return ma_semaphore_release__posix(pSemaphore);\n#elif defined(MA_WIN32)\n    return ma_semaphore_release__win32(pSemaphore);\n#endif\n}\n#else\n/* MA_NO_THREADING is set which means threading is disabled. Threading is required by some API families. If any of these are enabled we need to throw an error. */\n#ifndef MA_NO_DEVICE_IO\n#error \"MA_NO_THREADING cannot be used without MA_NO_DEVICE_IO\";\n#endif\n#endif  /* MA_NO_THREADING */\n\n\n\n#define MA_FENCE_COUNTER_MAX    0x7FFFFFFF\n\nMA_API ma_result ma_fence_init(ma_fence* pFence)\n{\n    if (pFence == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pFence);\n    pFence->counter = 0;\n\n    #ifndef MA_NO_THREADING\n    {\n        ma_result result;\n\n        result = ma_event_init(&pFence->e);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n    #endif\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_fence_uninit(ma_fence* pFence)\n{\n    if (pFence == NULL) {\n        return;\n    }\n\n    #ifndef MA_NO_THREADING\n    {\n        ma_event_uninit(&pFence->e);\n    }\n    #endif\n\n    MA_ZERO_OBJECT(pFence);\n}\n\nMA_API ma_result ma_fence_acquire(ma_fence* pFence)\n{\n    if (pFence == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    for (;;) {\n        ma_uint32 oldCounter = ma_atomic_load_32(&pFence->counter);\n        ma_uint32 newCounter = oldCounter + 1;\n\n        /* Make sure we're not about to exceed our maximum value. */\n        if (newCounter > MA_FENCE_COUNTER_MAX) {\n            MA_ASSERT(MA_FALSE);\n            return MA_OUT_OF_RANGE;\n        }\n\n        if (ma_atomic_compare_exchange_weak_32(&pFence->counter, &oldCounter, newCounter)) {\n            return MA_SUCCESS;\n        } else {\n            if (oldCounter == MA_FENCE_COUNTER_MAX) {\n                MA_ASSERT(MA_FALSE);\n                return MA_OUT_OF_RANGE; /* The other thread took the last available slot. Abort. */\n            }\n        }\n    }\n\n    /* Should never get here. */\n    /*return MA_SUCCESS;*/\n}\n\nMA_API ma_result ma_fence_release(ma_fence* pFence)\n{\n    if (pFence == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    for (;;) {\n        ma_uint32 oldCounter = ma_atomic_load_32(&pFence->counter);\n        ma_uint32 newCounter = oldCounter - 1;\n\n        if (oldCounter == 0) {\n            MA_ASSERT(MA_FALSE);\n            return MA_INVALID_OPERATION;    /* Acquire/release mismatch. */\n        }\n\n        if (ma_atomic_compare_exchange_weak_32(&pFence->counter, &oldCounter, newCounter)) {\n            #ifndef MA_NO_THREADING\n            {\n                if (newCounter == 0) {\n                    ma_event_signal(&pFence->e);    /* <-- ma_fence_wait() will be waiting on this. */\n                }\n            }\n            #endif\n\n            return MA_SUCCESS;\n        } else {\n            if (oldCounter == 0) {\n                MA_ASSERT(MA_FALSE);\n                return MA_INVALID_OPERATION;    /* Another thread has taken the 0 slot. Acquire/release mismatch. */\n            }\n        }\n    }\n\n    /* Should never get here. */\n    /*return MA_SUCCESS;*/\n}\n\nMA_API ma_result ma_fence_wait(ma_fence* pFence)\n{\n    if (pFence == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    for (;;) {\n        ma_uint32 counter;\n\n        counter = ma_atomic_load_32(&pFence->counter);\n        if (counter == 0) {\n            /*\n            Counter has hit zero. By the time we get here some other thread may have acquired the\n            fence again, but that is where the caller needs to take care with how they se the fence.\n            */\n            return MA_SUCCESS;\n        }\n\n        /* Getting here means the counter is > 0. We'll need to wait for something to happen. */\n        #ifndef MA_NO_THREADING\n        {\n            ma_result result;\n\n            result = ma_event_wait(&pFence->e);\n            if (result != MA_SUCCESS) {\n                return result;\n            }\n        }\n        #endif\n    }\n\n    /* Should never get here. */\n    /*return MA_INVALID_OPERATION;*/\n}\n\n\nMA_API ma_result ma_async_notification_signal(ma_async_notification* pNotification)\n{\n    ma_async_notification_callbacks* pNotificationCallbacks = (ma_async_notification_callbacks*)pNotification;\n\n    if (pNotification == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pNotificationCallbacks->onSignal == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    pNotificationCallbacks->onSignal(pNotification);\n    return MA_INVALID_ARGS;\n}\n\n\nstatic void ma_async_notification_poll__on_signal(ma_async_notification* pNotification)\n{\n    ((ma_async_notification_poll*)pNotification)->signalled = MA_TRUE;\n}\n\nMA_API ma_result ma_async_notification_poll_init(ma_async_notification_poll* pNotificationPoll)\n{\n    if (pNotificationPoll == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pNotificationPoll->cb.onSignal = ma_async_notification_poll__on_signal;\n    pNotificationPoll->signalled = MA_FALSE;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_bool32 ma_async_notification_poll_is_signalled(const ma_async_notification_poll* pNotificationPoll)\n{\n    if (pNotificationPoll == NULL) {\n        return MA_FALSE;\n    }\n\n    return pNotificationPoll->signalled;\n}\n\n\nstatic void ma_async_notification_event__on_signal(ma_async_notification* pNotification)\n{\n    ma_async_notification_event_signal((ma_async_notification_event*)pNotification);\n}\n\nMA_API ma_result ma_async_notification_event_init(ma_async_notification_event* pNotificationEvent)\n{\n    if (pNotificationEvent == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pNotificationEvent->cb.onSignal = ma_async_notification_event__on_signal;\n\n    #ifndef MA_NO_THREADING\n    {\n        ma_result result;\n\n        result = ma_event_init(&pNotificationEvent->e);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        return MA_NOT_IMPLEMENTED;  /* Threading is disabled. */\n    }\n    #endif\n}\n\nMA_API ma_result ma_async_notification_event_uninit(ma_async_notification_event* pNotificationEvent)\n{\n    if (pNotificationEvent == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #ifndef MA_NO_THREADING\n    {\n        ma_event_uninit(&pNotificationEvent->e);\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        return MA_NOT_IMPLEMENTED;  /* Threading is disabled. */\n    }\n    #endif\n}\n\nMA_API ma_result ma_async_notification_event_wait(ma_async_notification_event* pNotificationEvent)\n{\n    if (pNotificationEvent == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #ifndef MA_NO_THREADING\n    {\n        return ma_event_wait(&pNotificationEvent->e);\n    }\n    #else\n    {\n        return MA_NOT_IMPLEMENTED;  /* Threading is disabled. */\n    }\n    #endif\n}\n\nMA_API ma_result ma_async_notification_event_signal(ma_async_notification_event* pNotificationEvent)\n{\n    if (pNotificationEvent == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #ifndef MA_NO_THREADING\n    {\n        return ma_event_signal(&pNotificationEvent->e);\n    }\n    #else\n    {\n        return MA_NOT_IMPLEMENTED;  /* Threading is disabled. */\n    }\n    #endif\n}\n\n\n\n/************************************************************************************************************************************************************\n\nJob Queue\n\n************************************************************************************************************************************************************/\nMA_API ma_slot_allocator_config ma_slot_allocator_config_init(ma_uint32 capacity)\n{\n    ma_slot_allocator_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.capacity = capacity;\n\n    return config;\n}\n\n\nstatic MA_INLINE ma_uint32 ma_slot_allocator_calculate_group_capacity(ma_uint32 slotCapacity)\n{\n    ma_uint32 cap = slotCapacity / 32;\n    if ((slotCapacity % 32) != 0) {\n        cap += 1;\n    }\n\n    return cap;\n}\n\nstatic MA_INLINE ma_uint32 ma_slot_allocator_group_capacity(const ma_slot_allocator* pAllocator)\n{\n    return ma_slot_allocator_calculate_group_capacity(pAllocator->capacity);\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t groupsOffset;\n    size_t slotsOffset;\n} ma_slot_allocator_heap_layout;\n\nstatic ma_result ma_slot_allocator_get_heap_layout(const ma_slot_allocator_config* pConfig, ma_slot_allocator_heap_layout* pHeapLayout)\n{\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->capacity == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* Groups. */\n    pHeapLayout->groupsOffset = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += ma_align_64(ma_slot_allocator_calculate_group_capacity(pConfig->capacity) * sizeof(ma_slot_allocator_group));\n\n    /* Slots. */\n    pHeapLayout->slotsOffset  = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += ma_align_64(pConfig->capacity * sizeof(ma_uint32));\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_slot_allocator_get_heap_size(const ma_slot_allocator_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_slot_allocator_heap_layout layout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_slot_allocator_get_heap_layout(pConfig, &layout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = layout.sizeInBytes;\n\n    return result;\n}\n\nMA_API ma_result ma_slot_allocator_init_preallocated(const ma_slot_allocator_config* pConfig, void* pHeap, ma_slot_allocator* pAllocator)\n{\n    ma_result result;\n    ma_slot_allocator_heap_layout heapLayout;\n\n    if (pAllocator == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pAllocator);\n\n    if (pHeap == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_slot_allocator_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pAllocator->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n    pAllocator->pGroups  = (ma_slot_allocator_group*)ma_offset_ptr(pHeap, heapLayout.groupsOffset);\n    pAllocator->pSlots   = (ma_uint32*)ma_offset_ptr(pHeap, heapLayout.slotsOffset);\n    pAllocator->capacity = pConfig->capacity;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_slot_allocator_init(const ma_slot_allocator_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_slot_allocator* pAllocator)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_slot_allocator_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to retrieve the size of the heap allocation. */\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_slot_allocator_init_preallocated(pConfig, pHeap, pAllocator);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pAllocator->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_slot_allocator_uninit(ma_slot_allocator* pAllocator, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocator == NULL) {\n        return;\n    }\n\n    if (pAllocator->_ownsHeap) {\n        ma_free(pAllocator->_pHeap, pAllocationCallbacks);\n    }\n}\n\nMA_API ma_result ma_slot_allocator_alloc(ma_slot_allocator* pAllocator, ma_uint64* pSlot)\n{\n    ma_uint32 iAttempt;\n    const ma_uint32 maxAttempts = 2;    /* The number of iterations to perform until returning MA_OUT_OF_MEMORY if no slots can be found. */\n\n    if (pAllocator == NULL || pSlot == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    for (iAttempt = 0; iAttempt < maxAttempts; iAttempt += 1) {\n        /* We need to acquire a suitable bitfield first. This is a bitfield that's got an available slot within it. */\n        ma_uint32 iGroup;\n        for (iGroup = 0; iGroup < ma_slot_allocator_group_capacity(pAllocator); iGroup += 1) {\n            /* CAS */\n            for (;;) {\n                ma_uint32 oldBitfield;\n                ma_uint32 newBitfield;\n                ma_uint32 bitOffset;\n\n                oldBitfield = ma_atomic_load_32(&pAllocator->pGroups[iGroup].bitfield);  /* <-- This copy must happen. The compiler must not optimize this away. */\n\n                /* Fast check to see if anything is available. */\n                if (oldBitfield == 0xFFFFFFFF) {\n                    break;  /* No available bits in this bitfield. */\n                }\n\n                bitOffset = ma_ffs_32(~oldBitfield);\n                MA_ASSERT(bitOffset < 32);\n\n                newBitfield = oldBitfield | (1 << bitOffset);\n\n                if (ma_atomic_compare_and_swap_32(&pAllocator->pGroups[iGroup].bitfield, oldBitfield, newBitfield) == oldBitfield) {\n                    ma_uint32 slotIndex;\n\n                    /* Increment the counter as soon as possible to have other threads report out-of-memory sooner than later. */\n                    ma_atomic_fetch_add_32(&pAllocator->count, 1);\n\n                    /* The slot index is required for constructing the output value. */\n                    slotIndex = (iGroup << 5) + bitOffset;  /* iGroup << 5 = iGroup * 32 */\n                    if (slotIndex >= pAllocator->capacity) {\n                        return MA_OUT_OF_MEMORY;\n                    }\n\n                    /* Increment the reference count before constructing the output value. */\n                    pAllocator->pSlots[slotIndex] += 1;\n\n                    /* Construct the output value. */\n                    *pSlot = (((ma_uint64)pAllocator->pSlots[slotIndex] << 32) | slotIndex);\n\n                    return MA_SUCCESS;\n                }\n            }\n        }\n\n        /* We weren't able to find a slot. If it's because we've reached our capacity we need to return MA_OUT_OF_MEMORY. Otherwise we need to do another iteration and try again. */\n        if (pAllocator->count < pAllocator->capacity) {\n            ma_yield();\n        } else {\n            return MA_OUT_OF_MEMORY;\n        }\n    }\n\n    /* We couldn't find a slot within the maximum number of attempts. */\n    return MA_OUT_OF_MEMORY;\n}\n\nMA_API ma_result ma_slot_allocator_free(ma_slot_allocator* pAllocator, ma_uint64 slot)\n{\n    ma_uint32 iGroup;\n    ma_uint32 iBit;\n\n    if (pAllocator == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    iGroup = (ma_uint32)((slot & 0xFFFFFFFF) >> 5);   /* slot / 32 */\n    iBit   = (ma_uint32)((slot & 0xFFFFFFFF) & 31);   /* slot % 32 */\n\n    if (iGroup >= ma_slot_allocator_group_capacity(pAllocator)) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ASSERT(iBit < 32);   /* This must be true due to the logic we used to actually calculate it. */\n\n    while (ma_atomic_load_32(&pAllocator->count) > 0) {\n        /* CAS */\n        ma_uint32 oldBitfield;\n        ma_uint32 newBitfield;\n\n        oldBitfield = ma_atomic_load_32(&pAllocator->pGroups[iGroup].bitfield);  /* <-- This copy must happen. The compiler must not optimize this away. */\n        newBitfield = oldBitfield & ~(1 << iBit);\n\n        /* Debugging for checking for double-frees. */\n        #if defined(MA_DEBUG_OUTPUT)\n        {\n            if ((oldBitfield & (1 << iBit)) == 0) {\n                MA_ASSERT(MA_FALSE);    /* Double free detected.*/\n            }\n        }\n        #endif\n\n        if (ma_atomic_compare_and_swap_32(&pAllocator->pGroups[iGroup].bitfield, oldBitfield, newBitfield) == oldBitfield) {\n            ma_atomic_fetch_sub_32(&pAllocator->count, 1);\n            return MA_SUCCESS;\n        }\n    }\n\n    /* Getting here means there are no allocations available for freeing. */\n    return MA_INVALID_OPERATION;\n}\n\n\n#define MA_JOB_ID_NONE      ~((ma_uint64)0)\n#define MA_JOB_SLOT_NONE    (ma_uint16)(~0)\n\nstatic MA_INLINE ma_uint32 ma_job_extract_refcount(ma_uint64 toc)\n{\n    return (ma_uint32)(toc >> 32);\n}\n\nstatic MA_INLINE ma_uint16 ma_job_extract_slot(ma_uint64 toc)\n{\n    return (ma_uint16)(toc & 0x0000FFFF);\n}\n\nstatic MA_INLINE ma_uint16 ma_job_extract_code(ma_uint64 toc)\n{\n    return (ma_uint16)((toc & 0xFFFF0000) >> 16);\n}\n\nstatic MA_INLINE ma_uint64 ma_job_toc_to_allocation(ma_uint64 toc)\n{\n    return ((ma_uint64)ma_job_extract_refcount(toc) << 32) | (ma_uint64)ma_job_extract_slot(toc);\n}\n\nstatic MA_INLINE ma_uint64 ma_job_set_refcount(ma_uint64 toc, ma_uint32 refcount)\n{\n    /* Clear the reference count first. */\n    toc = toc & ~((ma_uint64)0xFFFFFFFF << 32);\n    toc = toc |  ((ma_uint64)refcount   << 32);\n\n    return toc;\n}\n\n\nMA_API ma_job ma_job_init(ma_uint16 code)\n{\n    ma_job job;\n\n    MA_ZERO_OBJECT(&job);\n    job.toc.breakup.code = code;\n    job.toc.breakup.slot = MA_JOB_SLOT_NONE;    /* Temp value. Will be allocated when posted to a queue. */\n    job.next             = MA_JOB_ID_NONE;\n\n    return job;\n}\n\n\nstatic ma_result ma_job_process__noop(ma_job* pJob);\nstatic ma_result ma_job_process__quit(ma_job* pJob);\nstatic ma_result ma_job_process__custom(ma_job* pJob);\nstatic ma_result ma_job_process__resource_manager__load_data_buffer_node(ma_job* pJob);\nstatic ma_result ma_job_process__resource_manager__free_data_buffer_node(ma_job* pJob);\nstatic ma_result ma_job_process__resource_manager__page_data_buffer_node(ma_job* pJob);\nstatic ma_result ma_job_process__resource_manager__load_data_buffer(ma_job* pJob);\nstatic ma_result ma_job_process__resource_manager__free_data_buffer(ma_job* pJob);\nstatic ma_result ma_job_process__resource_manager__load_data_stream(ma_job* pJob);\nstatic ma_result ma_job_process__resource_manager__free_data_stream(ma_job* pJob);\nstatic ma_result ma_job_process__resource_manager__page_data_stream(ma_job* pJob);\nstatic ma_result ma_job_process__resource_manager__seek_data_stream(ma_job* pJob);\n\n#if !defined(MA_NO_DEVICE_IO)\nstatic ma_result ma_job_process__device__aaudio_reroute(ma_job* pJob);\n#endif\n\nstatic ma_job_proc g_jobVTable[MA_JOB_TYPE_COUNT] =\n{\n    /* Miscellaneous. */\n    ma_job_process__quit,                                       /* MA_JOB_TYPE_QUIT */\n    ma_job_process__custom,                                     /* MA_JOB_TYPE_CUSTOM */\n\n    /* Resource Manager. */\n    ma_job_process__resource_manager__load_data_buffer_node,    /* MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE */\n    ma_job_process__resource_manager__free_data_buffer_node,    /* MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER_NODE */\n    ma_job_process__resource_manager__page_data_buffer_node,    /* MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE */\n    ma_job_process__resource_manager__load_data_buffer,         /* MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER */\n    ma_job_process__resource_manager__free_data_buffer,         /* MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER */\n    ma_job_process__resource_manager__load_data_stream,         /* MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_STREAM */\n    ma_job_process__resource_manager__free_data_stream,         /* MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_STREAM */\n    ma_job_process__resource_manager__page_data_stream,         /* MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_STREAM */\n    ma_job_process__resource_manager__seek_data_stream,         /* MA_JOB_TYPE_RESOURCE_MANAGER_SEEK_DATA_STREAM */\n\n    /* Device. */\n#if !defined(MA_NO_DEVICE_IO)\n    ma_job_process__device__aaudio_reroute                      /*MA_JOB_TYPE_DEVICE_AAUDIO_REROUTE*/\n#endif\n};\n\nMA_API ma_result ma_job_process(ma_job* pJob)\n{\n    if (pJob == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pJob->toc.breakup.code >= MA_JOB_TYPE_COUNT) {\n        return MA_INVALID_OPERATION;\n    }\n\n    return g_jobVTable[pJob->toc.breakup.code](pJob);\n}\n\nstatic ma_result ma_job_process__noop(ma_job* pJob)\n{\n    MA_ASSERT(pJob != NULL);\n\n    /* No-op. */\n    (void)pJob;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_job_process__quit(ma_job* pJob)\n{\n    return ma_job_process__noop(pJob);\n}\n\nstatic ma_result ma_job_process__custom(ma_job* pJob)\n{\n    MA_ASSERT(pJob != NULL);\n\n    /* No-op if there's no callback. */\n    if (pJob->data.custom.proc == NULL) {\n        return MA_SUCCESS;\n    }\n\n    return pJob->data.custom.proc(pJob);\n}\n\n\n\nMA_API ma_job_queue_config ma_job_queue_config_init(ma_uint32 flags, ma_uint32 capacity)\n{\n    ma_job_queue_config config;\n\n    config.flags    = flags;\n    config.capacity = capacity;\n\n    return config;\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t allocatorOffset;\n    size_t jobsOffset;\n} ma_job_queue_heap_layout;\n\nstatic ma_result ma_job_queue_get_heap_layout(const ma_job_queue_config* pConfig, ma_job_queue_heap_layout* pHeapLayout)\n{\n    ma_result result;\n\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->capacity == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* Allocator. */\n    {\n        ma_slot_allocator_config allocatorConfig;\n        size_t allocatorHeapSizeInBytes;\n\n        allocatorConfig = ma_slot_allocator_config_init(pConfig->capacity);\n        result = ma_slot_allocator_get_heap_size(&allocatorConfig, &allocatorHeapSizeInBytes);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pHeapLayout->allocatorOffset = pHeapLayout->sizeInBytes;\n        pHeapLayout->sizeInBytes    += allocatorHeapSizeInBytes;\n    }\n\n    /* Jobs. */\n    pHeapLayout->jobsOffset   = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += ma_align_64(pConfig->capacity * sizeof(ma_job));\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_job_queue_get_heap_size(const ma_job_queue_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_job_queue_heap_layout layout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_job_queue_get_heap_layout(pConfig, &layout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = layout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_job_queue_init_preallocated(const ma_job_queue_config* pConfig, void* pHeap, ma_job_queue* pQueue)\n{\n    ma_result result;\n    ma_job_queue_heap_layout heapLayout;\n    ma_slot_allocator_config allocatorConfig;\n\n    if (pQueue == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pQueue);\n\n    result = ma_job_queue_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pQueue->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n    pQueue->flags    = pConfig->flags;\n    pQueue->capacity = pConfig->capacity;\n    pQueue->pJobs    = (ma_job*)ma_offset_ptr(pHeap, heapLayout.jobsOffset);\n\n    allocatorConfig = ma_slot_allocator_config_init(pConfig->capacity);\n    result = ma_slot_allocator_init_preallocated(&allocatorConfig, ma_offset_ptr(pHeap, heapLayout.allocatorOffset), &pQueue->allocator);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* We need a semaphore if we're running in non-blocking mode. If threading is disabled we need to return an error. */\n    if ((pQueue->flags & MA_JOB_QUEUE_FLAG_NON_BLOCKING) == 0) {\n        #ifndef MA_NO_THREADING\n        {\n            ma_semaphore_init(0, &pQueue->sem);\n        }\n        #else\n        {\n            /* Threading is disabled and we've requested non-blocking mode. */\n            return MA_INVALID_OPERATION;\n        }\n        #endif\n    }\n\n    /*\n    Our queue needs to be initialized with a free standing node. This should always be slot 0. Required for the lock free algorithm. The first job in the queue is\n    just a dummy item for giving us the first item in the list which is stored in the \"next\" member.\n    */\n    ma_slot_allocator_alloc(&pQueue->allocator, &pQueue->head);  /* Will never fail. */\n    pQueue->pJobs[ma_job_extract_slot(pQueue->head)].next = MA_JOB_ID_NONE;\n    pQueue->tail = pQueue->head;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_job_queue_init(const ma_job_queue_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_job_queue* pQueue)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_job_queue_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_job_queue_init_preallocated(pConfig, pHeap, pQueue);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pQueue->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_job_queue_uninit(ma_job_queue* pQueue, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pQueue == NULL) {\n        return;\n    }\n\n    /* All we need to do is uninitialize the semaphore. */\n    if ((pQueue->flags & MA_JOB_QUEUE_FLAG_NON_BLOCKING) == 0) {\n        #ifndef MA_NO_THREADING\n        {\n            ma_semaphore_uninit(&pQueue->sem);\n        }\n        #else\n        {\n            MA_ASSERT(MA_FALSE);    /* Should never get here. Should have been checked at initialization time. */\n        }\n        #endif\n    }\n\n    ma_slot_allocator_uninit(&pQueue->allocator, pAllocationCallbacks);\n\n    if (pQueue->_ownsHeap) {\n        ma_free(pQueue->_pHeap, pAllocationCallbacks);\n    }\n}\n\nstatic ma_bool32 ma_job_queue_cas(volatile ma_uint64* dst, ma_uint64 expected, ma_uint64 desired)\n{\n    /* The new counter is taken from the expected value. */\n    return ma_atomic_compare_and_swap_64(dst, expected, ma_job_set_refcount(desired, ma_job_extract_refcount(expected) + 1)) == expected;\n}\n\nMA_API ma_result ma_job_queue_post(ma_job_queue* pQueue, const ma_job* pJob)\n{\n    /*\n    Lock free queue implementation based on the paper by Michael and Scott: Nonblocking Algorithms and Preemption-Safe Locking on Multiprogrammed Shared Memory Multiprocessors\n    */\n    ma_result result;\n    ma_uint64 slot;\n    ma_uint64 tail;\n    ma_uint64 next;\n\n    if (pQueue == NULL || pJob == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* We need a new slot. */\n    result = ma_slot_allocator_alloc(&pQueue->allocator, &slot);\n    if (result != MA_SUCCESS) {\n        return result;  /* Probably ran out of slots. If so, MA_OUT_OF_MEMORY will be returned. */\n    }\n\n    /* At this point we should have a slot to place the job. */\n    MA_ASSERT(ma_job_extract_slot(slot) < pQueue->capacity);\n\n    /* We need to put the job into memory before we do anything. */\n    pQueue->pJobs[ma_job_extract_slot(slot)]                  = *pJob;\n    pQueue->pJobs[ma_job_extract_slot(slot)].toc.allocation   = slot;                    /* This will overwrite the job code. */\n    pQueue->pJobs[ma_job_extract_slot(slot)].toc.breakup.code = pJob->toc.breakup.code;  /* The job code needs to be applied again because the line above overwrote it. */\n    pQueue->pJobs[ma_job_extract_slot(slot)].next             = MA_JOB_ID_NONE;          /* Reset for safety. */\n\n    #ifndef MA_USE_EXPERIMENTAL_LOCK_FREE_JOB_QUEUE\n    ma_spinlock_lock(&pQueue->lock);\n    #endif\n    {\n        /* The job is stored in memory so now we need to add it to our linked list. We only ever add items to the end of the list. */\n        for (;;) {\n            tail = ma_atomic_load_64(&pQueue->tail);\n            next = ma_atomic_load_64(&pQueue->pJobs[ma_job_extract_slot(tail)].next);\n\n            if (ma_job_toc_to_allocation(tail) == ma_job_toc_to_allocation(ma_atomic_load_64(&pQueue->tail))) {\n                if (ma_job_extract_slot(next) == 0xFFFF) {\n                    if (ma_job_queue_cas(&pQueue->pJobs[ma_job_extract_slot(tail)].next, next, slot)) {\n                        break;\n                    }\n                } else {\n                    ma_job_queue_cas(&pQueue->tail, tail, ma_job_extract_slot(next));\n                }\n            }\n        }\n        ma_job_queue_cas(&pQueue->tail, tail, slot);\n    }\n    #ifndef MA_USE_EXPERIMENTAL_LOCK_FREE_JOB_QUEUE\n    ma_spinlock_unlock(&pQueue->lock);\n    #endif\n\n\n    /* Signal the semaphore as the last step if we're using synchronous mode. */\n    if ((pQueue->flags & MA_JOB_QUEUE_FLAG_NON_BLOCKING) == 0) {\n        #ifndef MA_NO_THREADING\n        {\n            ma_semaphore_release(&pQueue->sem);\n        }\n        #else\n        {\n            MA_ASSERT(MA_FALSE);    /* Should never get here. Should have been checked at initialization time. */\n        }\n        #endif\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_job_queue_next(ma_job_queue* pQueue, ma_job* pJob)\n{\n    ma_uint64 head;\n    ma_uint64 tail;\n    ma_uint64 next;\n\n    if (pQueue == NULL || pJob == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* If we're running in synchronous mode we'll need to wait on a semaphore. */\n    if ((pQueue->flags & MA_JOB_QUEUE_FLAG_NON_BLOCKING) == 0) {\n        #ifndef MA_NO_THREADING\n        {\n            ma_semaphore_wait(&pQueue->sem);\n        }\n        #else\n        {\n            MA_ASSERT(MA_FALSE);    /* Should never get here. Should have been checked at initialization time. */\n        }\n        #endif\n    }\n\n    #ifndef MA_USE_EXPERIMENTAL_LOCK_FREE_JOB_QUEUE\n    ma_spinlock_lock(&pQueue->lock);\n    #endif\n    {\n        /*\n        BUG: In lock-free mode, multiple threads can be in this section of code. The \"head\" variable in the loop below\n        is stored. One thread can fall through to the freeing of this item while another is still using \"head\" for the\n        retrieval of the \"next\" variable.\n\n        The slot allocator might need to make use of some reference counting to ensure it's only truely freed when\n        there are no more references to the item. This must be fixed before removing these locks.\n        */\n\n        /* Now we need to remove the root item from the list. */\n        for (;;) {\n            head = ma_atomic_load_64(&pQueue->head);\n            tail = ma_atomic_load_64(&pQueue->tail);\n            next = ma_atomic_load_64(&pQueue->pJobs[ma_job_extract_slot(head)].next);\n\n            if (ma_job_toc_to_allocation(head) == ma_job_toc_to_allocation(ma_atomic_load_64(&pQueue->head))) {\n                if (ma_job_extract_slot(head) == ma_job_extract_slot(tail)) {\n                    if (ma_job_extract_slot(next) == 0xFFFF) {\n                        #ifndef MA_USE_EXPERIMENTAL_LOCK_FREE_JOB_QUEUE\n                        ma_spinlock_unlock(&pQueue->lock);\n                        #endif\n                        return MA_NO_DATA_AVAILABLE;\n                    }\n                    ma_job_queue_cas(&pQueue->tail, tail, ma_job_extract_slot(next));\n                } else {\n                    *pJob = pQueue->pJobs[ma_job_extract_slot(next)];\n                    if (ma_job_queue_cas(&pQueue->head, head, ma_job_extract_slot(next))) {\n                        break;\n                    }\n                }\n            }\n        }\n    }\n    #ifndef MA_USE_EXPERIMENTAL_LOCK_FREE_JOB_QUEUE\n    ma_spinlock_unlock(&pQueue->lock);\n    #endif\n\n    ma_slot_allocator_free(&pQueue->allocator, head);\n\n    /*\n    If it's a quit job make sure it's put back on the queue to ensure other threads have an opportunity to detect it and terminate naturally. We\n    could instead just leave it on the queue, but that would involve fiddling with the lock-free code above and I want to keep that as simple as\n    possible.\n    */\n    if (pJob->toc.breakup.code == MA_JOB_TYPE_QUIT) {\n        ma_job_queue_post(pQueue, pJob);\n        return MA_CANCELLED;    /* Return a cancelled status just in case the thread is checking return codes and not properly checking for a quit job. */\n    }\n\n    return MA_SUCCESS;\n}\n\n\n\n/*******************************************************************************\n\nDynamic Linking\n\n*******************************************************************************/\n#ifdef MA_POSIX\n    /* No need for dlfcn.h if we're not using runtime linking. */\n    #ifndef MA_NO_RUNTIME_LINKING\n        #include <dlfcn.h>\n    #endif\n#endif\n\nMA_API ma_handle ma_dlopen(ma_log* pLog, const char* filename)\n{\n#ifndef MA_NO_RUNTIME_LINKING\n    ma_handle handle;\n\n    ma_log_postf(pLog, MA_LOG_LEVEL_DEBUG, \"Loading library: %s\\n\", filename);\n\n    #ifdef MA_WIN32\n        /* From MSDN: Desktop applications cannot use LoadPackagedLibrary; if a desktop application calls this function it fails with APPMODEL_ERROR_NO_PACKAGE.*/\n        #if !defined(MA_WIN32_UWP) || !(defined(WINAPI_FAMILY) && ((defined(WINAPI_FAMILY_PHONE_APP) && WINAPI_FAMILY == WINAPI_FAMILY_PHONE_APP)))\n            handle = (ma_handle)LoadLibraryA(filename);\n        #else\n            /* *sigh* It appears there is no ANSI version of LoadPackagedLibrary()... */\n            WCHAR filenameW[4096];\n            if (MultiByteToWideChar(CP_UTF8, 0, filename, -1, filenameW, sizeof(filenameW)) == 0) {\n                handle = NULL;\n            } else {\n                handle = (ma_handle)LoadPackagedLibrary(filenameW, 0);\n            }\n        #endif\n    #else\n        handle = (ma_handle)dlopen(filename, RTLD_NOW);\n    #endif\n\n    /*\n    I'm not considering failure to load a library an error nor a warning because seamlessly falling through to a lower-priority\n    backend is a deliberate design choice. Instead I'm logging it as an informational message.\n    */\n    if (handle == NULL) {\n        ma_log_postf(pLog, MA_LOG_LEVEL_INFO, \"Failed to load library: %s\\n\", filename);\n    }\n\n    return handle;\n#else\n    /* Runtime linking is disabled. */\n    (void)pLog;\n    (void)filename;\n    return NULL;\n#endif\n}\n\nMA_API void ma_dlclose(ma_log* pLog, ma_handle handle)\n{\n#ifndef MA_NO_RUNTIME_LINKING\n    #ifdef MA_WIN32\n        FreeLibrary((HMODULE)handle);\n    #else\n        dlclose((void*)handle);\n    #endif\n\n    (void)pLog;\n#else\n    /* Runtime linking is disabled. */\n    (void)pLog;\n    (void)handle;\n#endif\n}\n\nMA_API ma_proc ma_dlsym(ma_log* pLog, ma_handle handle, const char* symbol)\n{\n#ifndef MA_NO_RUNTIME_LINKING\n    ma_proc proc;\n\n    ma_log_postf(pLog, MA_LOG_LEVEL_DEBUG, \"Loading symbol: %s\\n\", symbol);\n\n#ifdef _WIN32\n    proc = (ma_proc)GetProcAddress((HMODULE)handle, symbol);\n#else\n#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wpedantic\"\n#endif\n    proc = (ma_proc)dlsym((void*)handle, symbol);\n#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))\n    #pragma GCC diagnostic pop\n#endif\n#endif\n\n    if (proc == NULL) {\n        ma_log_postf(pLog, MA_LOG_LEVEL_WARNING, \"Failed to load symbol: %s\\n\", symbol);\n    }\n\n    (void)pLog; /* It's possible for pContext to be unused. */\n    return proc;\n#else\n    /* Runtime linking is disabled. */\n    (void)pLog;\n    (void)handle;\n    (void)symbol;\n    return NULL;\n#endif\n}\n\n\n\n/************************************************************************************************************************************************************\n*************************************************************************************************************************************************************\n\nDEVICE I/O\n==========\n\n*************************************************************************************************************************************************************\n************************************************************************************************************************************************************/\n\n/* Disable run-time linking on certain backends and platforms. */\n#ifndef MA_NO_RUNTIME_LINKING\n    #if defined(MA_EMSCRIPTEN) || defined(MA_ORBIS) || defined(MA_PROSPERO)\n        #define MA_NO_RUNTIME_LINKING\n    #endif\n#endif\n\n#ifndef MA_NO_DEVICE_IO\n\n#if defined(MA_APPLE) && (__MAC_OS_X_VERSION_MIN_REQUIRED < 101200)\n    #include <mach/mach_time.h> /* For mach_absolute_time() */\n#endif\n\n#ifdef MA_POSIX\n    #include <sys/types.h>\n    #include <unistd.h>\n\n    /* No need for dlfcn.h if we're not using runtime linking. */\n    #ifndef MA_NO_RUNTIME_LINKING\n        #include <dlfcn.h>\n    #endif\n#endif\n\n\n\nMA_API void ma_device_info_add_native_data_format(ma_device_info* pDeviceInfo, ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 flags)\n{\n    if (pDeviceInfo == NULL) {\n        return;\n    }\n\n    if (pDeviceInfo->nativeDataFormatCount < ma_countof(pDeviceInfo->nativeDataFormats)) {\n        pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format     = format;\n        pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels   = channels;\n        pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = sampleRate;\n        pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags      = flags;\n        pDeviceInfo->nativeDataFormatCount += 1;\n    }\n}\n\n\ntypedef struct\n{\n    ma_backend backend;\n    const char* pName;\n} ma_backend_info;\n\nstatic ma_backend_info gBackendInfo[] = /* Indexed by the backend enum. Must be in the order backends are declared in the ma_backend enum. */\n{\n    {ma_backend_wasapi,     \"WASAPI\"},\n    {ma_backend_dsound,     \"DirectSound\"},\n    {ma_backend_winmm,      \"WinMM\"},\n    {ma_backend_coreaudio,  \"Core Audio\"},\n    {ma_backend_sndio,      \"sndio\"},\n    {ma_backend_audio4,     \"audio(4)\"},\n    {ma_backend_oss,        \"OSS\"},\n    {ma_backend_pulseaudio, \"PulseAudio\"},\n    {ma_backend_alsa,       \"ALSA\"},\n    {ma_backend_jack,       \"JACK\"},\n    {ma_backend_aaudio,     \"AAudio\"},\n    {ma_backend_opensl,     \"OpenSL|ES\"},\n    {ma_backend_webaudio,   \"Web Audio\"},\n    {ma_backend_custom,     \"Custom\"},\n    {ma_backend_null,       \"Null\"}\n};\n\nMA_API const char* ma_get_backend_name(ma_backend backend)\n{\n    if (backend < 0 || backend >= (int)ma_countof(gBackendInfo)) {\n        return \"Unknown\";\n    }\n\n    return gBackendInfo[backend].pName;\n}\n\nMA_API ma_result ma_get_backend_from_name(const char* pBackendName, ma_backend* pBackend)\n{\n    size_t iBackend;\n\n    if (pBackendName == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    for (iBackend = 0; iBackend < ma_countof(gBackendInfo); iBackend += 1) {\n        if (ma_strcmp(pBackendName, gBackendInfo[iBackend].pName) == 0) {\n            if (pBackend != NULL) {\n                *pBackend = gBackendInfo[iBackend].backend;\n            }\n\n            return MA_SUCCESS;\n        }\n    }\n\n    /* Getting here means the backend name is unknown. */\n    return MA_INVALID_ARGS;\n}\n\nMA_API ma_bool32 ma_is_backend_enabled(ma_backend backend)\n{\n    /*\n    This looks a little bit gross, but we want all backends to be included in the switch to avoid warnings on some compilers\n    about some enums not being handled by the switch statement.\n    */\n    switch (backend)\n    {\n        case ma_backend_wasapi:\n        #if defined(MA_HAS_WASAPI)\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_dsound:\n        #if defined(MA_HAS_DSOUND)\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_winmm:\n        #if defined(MA_HAS_WINMM)\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_coreaudio:\n        #if defined(MA_HAS_COREAUDIO)\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_sndio:\n        #if defined(MA_HAS_SNDIO)\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_audio4:\n        #if defined(MA_HAS_AUDIO4)\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_oss:\n        #if defined(MA_HAS_OSS)\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_pulseaudio:\n        #if defined(MA_HAS_PULSEAUDIO)\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_alsa:\n        #if defined(MA_HAS_ALSA)\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_jack:\n        #if defined(MA_HAS_JACK)\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_aaudio:\n        #if defined(MA_HAS_AAUDIO)\n            #if defined(MA_ANDROID)\n            {\n                return ma_android_sdk_version() >= 26;\n            }\n            #else\n                return MA_FALSE;\n            #endif\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_opensl:\n        #if defined(MA_HAS_OPENSL)\n            #if defined(MA_ANDROID)\n            {\n                return ma_android_sdk_version() >= 9;\n            }\n            #else\n                return MA_TRUE;\n            #endif\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_webaudio:\n        #if defined(MA_HAS_WEBAUDIO)\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_custom:\n        #if defined(MA_HAS_CUSTOM)\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n        case ma_backend_null:\n        #if defined(MA_HAS_NULL)\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n\n        default: return MA_FALSE;\n    }\n}\n\nMA_API ma_result ma_get_enabled_backends(ma_backend* pBackends, size_t backendCap, size_t* pBackendCount)\n{\n    size_t backendCount;\n    size_t iBackend;\n    ma_result result = MA_SUCCESS;\n\n    if (pBackendCount == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    backendCount = 0;\n\n    for (iBackend = 0; iBackend <= ma_backend_null; iBackend += 1) {\n        ma_backend backend = (ma_backend)iBackend;\n\n        if (ma_is_backend_enabled(backend)) {\n            /* The backend is enabled. Try adding it to the list. If there's no room, MA_NO_SPACE needs to be returned. */\n            if (backendCount == backendCap) {\n                result = MA_NO_SPACE;\n                break;\n            } else {\n                pBackends[backendCount] = backend;\n                backendCount += 1;\n            }\n        }\n    }\n\n    if (pBackendCount != NULL) {\n        *pBackendCount = backendCount;\n    }\n\n    return result;\n}\n\nMA_API ma_bool32 ma_is_loopback_supported(ma_backend backend)\n{\n    switch (backend)\n    {\n        case ma_backend_wasapi:     return MA_TRUE;\n        case ma_backend_dsound:     return MA_FALSE;\n        case ma_backend_winmm:      return MA_FALSE;\n        case ma_backend_coreaudio:  return MA_FALSE;\n        case ma_backend_sndio:      return MA_FALSE;\n        case ma_backend_audio4:     return MA_FALSE;\n        case ma_backend_oss:        return MA_FALSE;\n        case ma_backend_pulseaudio: return MA_FALSE;\n        case ma_backend_alsa:       return MA_FALSE;\n        case ma_backend_jack:       return MA_FALSE;\n        case ma_backend_aaudio:     return MA_FALSE;\n        case ma_backend_opensl:     return MA_FALSE;\n        case ma_backend_webaudio:   return MA_FALSE;\n        case ma_backend_custom:     return MA_FALSE;    /* <-- Will depend on the implementation of the backend. */\n        case ma_backend_null:       return MA_FALSE;\n        default:                    return MA_FALSE;\n    }\n}\n\n\n\n#if defined(MA_WIN32)\n/* WASAPI error codes. */\n#define MA_AUDCLNT_E_NOT_INITIALIZED              ((HRESULT)0x88890001)\n#define MA_AUDCLNT_E_ALREADY_INITIALIZED          ((HRESULT)0x88890002)\n#define MA_AUDCLNT_E_WRONG_ENDPOINT_TYPE          ((HRESULT)0x88890003)\n#define MA_AUDCLNT_E_DEVICE_INVALIDATED           ((HRESULT)0x88890004)\n#define MA_AUDCLNT_E_NOT_STOPPED                  ((HRESULT)0x88890005)\n#define MA_AUDCLNT_E_BUFFER_TOO_LARGE             ((HRESULT)0x88890006)\n#define MA_AUDCLNT_E_OUT_OF_ORDER                 ((HRESULT)0x88890007)\n#define MA_AUDCLNT_E_UNSUPPORTED_FORMAT           ((HRESULT)0x88890008)\n#define MA_AUDCLNT_E_INVALID_SIZE                 ((HRESULT)0x88890009)\n#define MA_AUDCLNT_E_DEVICE_IN_USE                ((HRESULT)0x8889000A)\n#define MA_AUDCLNT_E_BUFFER_OPERATION_PENDING     ((HRESULT)0x8889000B)\n#define MA_AUDCLNT_E_THREAD_NOT_REGISTERED        ((HRESULT)0x8889000C)\n#define MA_AUDCLNT_E_NO_SINGLE_PROCESS            ((HRESULT)0x8889000D)\n#define MA_AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED   ((HRESULT)0x8889000E)\n#define MA_AUDCLNT_E_ENDPOINT_CREATE_FAILED       ((HRESULT)0x8889000F)\n#define MA_AUDCLNT_E_SERVICE_NOT_RUNNING          ((HRESULT)0x88890010)\n#define MA_AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED     ((HRESULT)0x88890011)\n#define MA_AUDCLNT_E_EXCLUSIVE_MODE_ONLY          ((HRESULT)0x88890012)\n#define MA_AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL ((HRESULT)0x88890013)\n#define MA_AUDCLNT_E_EVENTHANDLE_NOT_SET          ((HRESULT)0x88890014)\n#define MA_AUDCLNT_E_INCORRECT_BUFFER_SIZE        ((HRESULT)0x88890015)\n#define MA_AUDCLNT_E_BUFFER_SIZE_ERROR            ((HRESULT)0x88890016)\n#define MA_AUDCLNT_E_CPUUSAGE_EXCEEDED            ((HRESULT)0x88890017)\n#define MA_AUDCLNT_E_BUFFER_ERROR                 ((HRESULT)0x88890018)\n#define MA_AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED      ((HRESULT)0x88890019)\n#define MA_AUDCLNT_E_INVALID_DEVICE_PERIOD        ((HRESULT)0x88890020)\n#define MA_AUDCLNT_E_INVALID_STREAM_FLAG          ((HRESULT)0x88890021)\n#define MA_AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE ((HRESULT)0x88890022)\n#define MA_AUDCLNT_E_OUT_OF_OFFLOAD_RESOURCES     ((HRESULT)0x88890023)\n#define MA_AUDCLNT_E_OFFLOAD_MODE_ONLY            ((HRESULT)0x88890024)\n#define MA_AUDCLNT_E_NONOFFLOAD_MODE_ONLY         ((HRESULT)0x88890025)\n#define MA_AUDCLNT_E_RESOURCES_INVALIDATED        ((HRESULT)0x88890026)\n#define MA_AUDCLNT_E_RAW_MODE_UNSUPPORTED         ((HRESULT)0x88890027)\n#define MA_AUDCLNT_E_ENGINE_PERIODICITY_LOCKED    ((HRESULT)0x88890028)\n#define MA_AUDCLNT_E_ENGINE_FORMAT_LOCKED         ((HRESULT)0x88890029)\n#define MA_AUDCLNT_E_HEADTRACKING_ENABLED         ((HRESULT)0x88890030)\n#define MA_AUDCLNT_E_HEADTRACKING_UNSUPPORTED     ((HRESULT)0x88890040)\n#define MA_AUDCLNT_S_BUFFER_EMPTY                 ((HRESULT)0x08890001)\n#define MA_AUDCLNT_S_THREAD_ALREADY_REGISTERED    ((HRESULT)0x08890002)\n#define MA_AUDCLNT_S_POSITION_STALLED             ((HRESULT)0x08890003)\n\n#define MA_DS_OK                                  ((HRESULT)0)\n#define MA_DS_NO_VIRTUALIZATION                   ((HRESULT)0x0878000A)\n#define MA_DSERR_ALLOCATED                        ((HRESULT)0x8878000A)\n#define MA_DSERR_CONTROLUNAVAIL                   ((HRESULT)0x8878001E)\n#define MA_DSERR_INVALIDPARAM                     ((HRESULT)0x80070057) /*E_INVALIDARG*/\n#define MA_DSERR_INVALIDCALL                      ((HRESULT)0x88780032)\n#define MA_DSERR_GENERIC                          ((HRESULT)0x80004005) /*E_FAIL*/\n#define MA_DSERR_PRIOLEVELNEEDED                  ((HRESULT)0x88780046)\n#define MA_DSERR_OUTOFMEMORY                      ((HRESULT)0x8007000E) /*E_OUTOFMEMORY*/\n#define MA_DSERR_BADFORMAT                        ((HRESULT)0x88780064)\n#define MA_DSERR_UNSUPPORTED                      ((HRESULT)0x80004001) /*E_NOTIMPL*/\n#define MA_DSERR_NODRIVER                         ((HRESULT)0x88780078)\n#define MA_DSERR_ALREADYINITIALIZED               ((HRESULT)0x88780082)\n#define MA_DSERR_NOAGGREGATION                    ((HRESULT)0x80040110) /*CLASS_E_NOAGGREGATION*/\n#define MA_DSERR_BUFFERLOST                       ((HRESULT)0x88780096)\n#define MA_DSERR_OTHERAPPHASPRIO                  ((HRESULT)0x887800A0)\n#define MA_DSERR_UNINITIALIZED                    ((HRESULT)0x887800AA)\n#define MA_DSERR_NOINTERFACE                      ((HRESULT)0x80004002) /*E_NOINTERFACE*/\n#define MA_DSERR_ACCESSDENIED                     ((HRESULT)0x80070005) /*E_ACCESSDENIED*/\n#define MA_DSERR_BUFFERTOOSMALL                   ((HRESULT)0x887800B4)\n#define MA_DSERR_DS8_REQUIRED                     ((HRESULT)0x887800BE)\n#define MA_DSERR_SENDLOOP                         ((HRESULT)0x887800C8)\n#define MA_DSERR_BADSENDBUFFERGUID                ((HRESULT)0x887800D2)\n#define MA_DSERR_OBJECTNOTFOUND                   ((HRESULT)0x88781161)\n#define MA_DSERR_FXUNAVAILABLE                    ((HRESULT)0x887800DC)\n\nstatic ma_result ma_result_from_HRESULT(HRESULT hr)\n{\n    switch (hr)\n    {\n        case NOERROR:                                   return MA_SUCCESS;\n        /*case S_OK:                                      return MA_SUCCESS;*/\n\n        case E_POINTER:                                 return MA_INVALID_ARGS;\n        case E_UNEXPECTED:                              return MA_ERROR;\n        case E_NOTIMPL:                                 return MA_NOT_IMPLEMENTED;\n        case E_OUTOFMEMORY:                             return MA_OUT_OF_MEMORY;\n        case E_INVALIDARG:                              return MA_INVALID_ARGS;\n        case E_NOINTERFACE:                             return MA_API_NOT_FOUND;\n        case E_HANDLE:                                  return MA_INVALID_ARGS;\n        case E_ABORT:                                   return MA_ERROR;\n        case E_FAIL:                                    return MA_ERROR;\n        case E_ACCESSDENIED:                            return MA_ACCESS_DENIED;\n\n        /* WASAPI */\n        case MA_AUDCLNT_E_NOT_INITIALIZED:              return MA_DEVICE_NOT_INITIALIZED;\n        case MA_AUDCLNT_E_ALREADY_INITIALIZED:          return MA_DEVICE_ALREADY_INITIALIZED;\n        case MA_AUDCLNT_E_WRONG_ENDPOINT_TYPE:          return MA_INVALID_ARGS;\n        case MA_AUDCLNT_E_DEVICE_INVALIDATED:           return MA_UNAVAILABLE;\n        case MA_AUDCLNT_E_NOT_STOPPED:                  return MA_DEVICE_NOT_STOPPED;\n        case MA_AUDCLNT_E_BUFFER_TOO_LARGE:             return MA_TOO_BIG;\n        case MA_AUDCLNT_E_OUT_OF_ORDER:                 return MA_INVALID_OPERATION;\n        case MA_AUDCLNT_E_UNSUPPORTED_FORMAT:           return MA_FORMAT_NOT_SUPPORTED;\n        case MA_AUDCLNT_E_INVALID_SIZE:                 return MA_INVALID_ARGS;\n        case MA_AUDCLNT_E_DEVICE_IN_USE:                return MA_BUSY;\n        case MA_AUDCLNT_E_BUFFER_OPERATION_PENDING:     return MA_INVALID_OPERATION;\n        case MA_AUDCLNT_E_THREAD_NOT_REGISTERED:        return MA_DOES_NOT_EXIST;\n        case MA_AUDCLNT_E_NO_SINGLE_PROCESS:            return MA_INVALID_OPERATION;\n        case MA_AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED:   return MA_SHARE_MODE_NOT_SUPPORTED;\n        case MA_AUDCLNT_E_ENDPOINT_CREATE_FAILED:       return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n        case MA_AUDCLNT_E_SERVICE_NOT_RUNNING:          return MA_NOT_CONNECTED;\n        case MA_AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED:     return MA_INVALID_ARGS;\n        case MA_AUDCLNT_E_EXCLUSIVE_MODE_ONLY:          return MA_SHARE_MODE_NOT_SUPPORTED;\n        case MA_AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL: return MA_INVALID_ARGS;\n        case MA_AUDCLNT_E_EVENTHANDLE_NOT_SET:          return MA_INVALID_ARGS;\n        case MA_AUDCLNT_E_INCORRECT_BUFFER_SIZE:        return MA_INVALID_ARGS;\n        case MA_AUDCLNT_E_BUFFER_SIZE_ERROR:            return MA_INVALID_ARGS;\n        case MA_AUDCLNT_E_CPUUSAGE_EXCEEDED:            return MA_ERROR;\n        case MA_AUDCLNT_E_BUFFER_ERROR:                 return MA_ERROR;\n        case MA_AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED:      return MA_INVALID_ARGS;\n        case MA_AUDCLNT_E_INVALID_DEVICE_PERIOD:        return MA_INVALID_ARGS;\n        case MA_AUDCLNT_E_INVALID_STREAM_FLAG:          return MA_INVALID_ARGS;\n        case MA_AUDCLNT_E_ENDPOINT_OFFLOAD_NOT_CAPABLE: return MA_INVALID_OPERATION;\n        case MA_AUDCLNT_E_OUT_OF_OFFLOAD_RESOURCES:     return MA_OUT_OF_MEMORY;\n        case MA_AUDCLNT_E_OFFLOAD_MODE_ONLY:            return MA_INVALID_OPERATION;\n        case MA_AUDCLNT_E_NONOFFLOAD_MODE_ONLY:         return MA_INVALID_OPERATION;\n        case MA_AUDCLNT_E_RESOURCES_INVALIDATED:        return MA_INVALID_DATA;\n        case MA_AUDCLNT_E_RAW_MODE_UNSUPPORTED:         return MA_INVALID_OPERATION;\n        case MA_AUDCLNT_E_ENGINE_PERIODICITY_LOCKED:    return MA_INVALID_OPERATION;\n        case MA_AUDCLNT_E_ENGINE_FORMAT_LOCKED:         return MA_INVALID_OPERATION;\n        case MA_AUDCLNT_E_HEADTRACKING_ENABLED:         return MA_INVALID_OPERATION;\n        case MA_AUDCLNT_E_HEADTRACKING_UNSUPPORTED:     return MA_INVALID_OPERATION;\n        case MA_AUDCLNT_S_BUFFER_EMPTY:                 return MA_NO_SPACE;\n        case MA_AUDCLNT_S_THREAD_ALREADY_REGISTERED:    return MA_ALREADY_EXISTS;\n        case MA_AUDCLNT_S_POSITION_STALLED:             return MA_ERROR;\n\n        /* DirectSound */\n        /*case MA_DS_OK:                                  return MA_SUCCESS;*/          /* S_OK */\n        case MA_DS_NO_VIRTUALIZATION:                   return MA_SUCCESS;\n        case MA_DSERR_ALLOCATED:                        return MA_ALREADY_IN_USE;\n        case MA_DSERR_CONTROLUNAVAIL:                   return MA_INVALID_OPERATION;\n        /*case MA_DSERR_INVALIDPARAM:                    return MA_INVALID_ARGS;*/      /* E_INVALIDARG */\n        case MA_DSERR_INVALIDCALL:                      return MA_INVALID_OPERATION;\n        /*case MA_DSERR_GENERIC:                          return MA_ERROR;*/            /* E_FAIL */\n        case MA_DSERR_PRIOLEVELNEEDED:                  return MA_INVALID_OPERATION;\n        /*case MA_DSERR_OUTOFMEMORY:                      return MA_OUT_OF_MEMORY;*/    /* E_OUTOFMEMORY */\n        case MA_DSERR_BADFORMAT:                        return MA_FORMAT_NOT_SUPPORTED;\n        /*case MA_DSERR_UNSUPPORTED:                      return MA_NOT_IMPLEMENTED;*/  /* E_NOTIMPL */\n        case MA_DSERR_NODRIVER:                         return MA_FAILED_TO_INIT_BACKEND;\n        case MA_DSERR_ALREADYINITIALIZED:               return MA_DEVICE_ALREADY_INITIALIZED;\n        case MA_DSERR_NOAGGREGATION:                    return MA_ERROR;\n        case MA_DSERR_BUFFERLOST:                       return MA_UNAVAILABLE;\n        case MA_DSERR_OTHERAPPHASPRIO:                  return MA_ACCESS_DENIED;\n        case MA_DSERR_UNINITIALIZED:                    return MA_DEVICE_NOT_INITIALIZED;\n        /*case MA_DSERR_NOINTERFACE:                      return MA_API_NOT_FOUND;*/    /* E_NOINTERFACE */\n        /*case MA_DSERR_ACCESSDENIED:                     return MA_ACCESS_DENIED;*/    /* E_ACCESSDENIED */\n        case MA_DSERR_BUFFERTOOSMALL:                   return MA_NO_SPACE;\n        case MA_DSERR_DS8_REQUIRED:                     return MA_INVALID_OPERATION;\n        case MA_DSERR_SENDLOOP:                         return MA_DEADLOCK;\n        case MA_DSERR_BADSENDBUFFERGUID:                return MA_INVALID_ARGS;\n        case MA_DSERR_OBJECTNOTFOUND:                   return MA_NO_DEVICE;\n        case MA_DSERR_FXUNAVAILABLE:                    return MA_UNAVAILABLE;\n\n        default:                                        return MA_ERROR;\n    }\n}\n\n/* PROPVARIANT */\n#define MA_VT_LPWSTR    31\n#define MA_VT_BLOB      65\n\n#if defined(_MSC_VER) && !defined(__clang__)\n    #pragma warning(push)\n    #pragma warning(disable:4201)   /* nonstandard extension used: nameless struct/union */\n#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wpedantic\" /* For ISO C99 doesn't support unnamed structs/unions [-Wpedantic] */\n    #if defined(__clang__)\n        #pragma GCC diagnostic ignored \"-Wc11-extensions\"   /* anonymous unions are a C11 extension */\n    #endif\n#endif\ntypedef struct\n{\n    WORD vt;\n    WORD wReserved1;\n    WORD wReserved2;\n    WORD wReserved3;\n    union\n    {\n        struct\n        {\n            ULONG cbSize;\n            BYTE* pBlobData;\n        } blob;\n        WCHAR* pwszVal;\n        char pad[16];   /* Just to ensure the size of the struct matches the official version. */\n    };\n} MA_PROPVARIANT;\n#if defined(_MSC_VER) && !defined(__clang__)\n    #pragma warning(pop)\n#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))\n    #pragma GCC diagnostic pop\n#endif\n\ntypedef HRESULT (WINAPI * MA_PFN_CoInitialize)(void* pvReserved);\ntypedef HRESULT (WINAPI * MA_PFN_CoInitializeEx)(void* pvReserved, DWORD  dwCoInit);\ntypedef void    (WINAPI * MA_PFN_CoUninitialize)(void);\ntypedef HRESULT (WINAPI * MA_PFN_CoCreateInstance)(const IID* rclsid, void* pUnkOuter, DWORD dwClsContext, const IID* riid, void* ppv);\ntypedef void    (WINAPI * MA_PFN_CoTaskMemFree)(void* pv);\ntypedef HRESULT (WINAPI * MA_PFN_PropVariantClear)(MA_PROPVARIANT *pvar);\ntypedef int     (WINAPI * MA_PFN_StringFromGUID2)(const GUID* const rguid, WCHAR* lpsz, int cchMax);\n\ntypedef HWND    (WINAPI * MA_PFN_GetForegroundWindow)(void);\ntypedef HWND    (WINAPI * MA_PFN_GetDesktopWindow)(void);\n\n#if defined(MA_WIN32_DESKTOP)\n/* Microsoft documents these APIs as returning LSTATUS, but the Win32 API shipping with some compilers do not define it. It's just a LONG. */\ntypedef LONG    (WINAPI * MA_PFN_RegOpenKeyExA)(HKEY hKey, const char* lpSubKey, DWORD ulOptions, DWORD samDesired, HKEY* phkResult);\ntypedef LONG    (WINAPI * MA_PFN_RegCloseKey)(HKEY hKey);\ntypedef LONG    (WINAPI * MA_PFN_RegQueryValueExA)(HKEY hKey, const char* lpValueName, DWORD* lpReserved, DWORD* lpType, BYTE* lpData, DWORD* lpcbData);\n#endif  /* MA_WIN32_DESKTOP */\n\n\nMA_API size_t ma_strlen_WCHAR(const WCHAR* str)\n{\n    size_t len = 0;\n    while (str[len] != '\\0') {\n        len += 1;\n    }\n\n    return len;\n}\n\nMA_API int ma_strcmp_WCHAR(const WCHAR *s1, const WCHAR *s2)\n{\n    while (*s1 != '\\0' && *s1 == *s2) {\n        s1 += 1;\n        s2 += 1;\n    }\n\n    return *s1 - *s2;\n}\n\nMA_API int ma_strcpy_s_WCHAR(WCHAR* dst, size_t dstCap, const WCHAR* src)\n{\n    size_t i;\n\n    if (dst == 0) {\n        return 22;\n    }\n    if (dstCap == 0) {\n        return 34;\n    }\n    if (src == 0) {\n        dst[0] = '\\0';\n        return 22;\n    }\n\n    for (i = 0; i < dstCap && src[i] != '\\0'; ++i) {\n        dst[i] = src[i];\n    }\n\n    if (i < dstCap) {\n        dst[i] = '\\0';\n        return 0;\n    }\n\n    dst[0] = '\\0';\n    return 34;\n}\n#endif  /* MA_WIN32 */\n\n\n#define MA_DEFAULT_PLAYBACK_DEVICE_NAME    \"Default Playback Device\"\n#define MA_DEFAULT_CAPTURE_DEVICE_NAME     \"Default Capture Device\"\n\n\n\n\n/*******************************************************************************\n\nTiming\n\n*******************************************************************************/\n#if defined(MA_WIN32) && !defined(MA_POSIX)\n    static LARGE_INTEGER g_ma_TimerFrequency;   /* <-- Initialized to zero since it's static. */\n    static void ma_timer_init(ma_timer* pTimer)\n    {\n        LARGE_INTEGER counter;\n\n        if (g_ma_TimerFrequency.QuadPart == 0) {\n            QueryPerformanceFrequency(&g_ma_TimerFrequency);\n        }\n\n        QueryPerformanceCounter(&counter);\n        pTimer->counter = counter.QuadPart;\n    }\n\n    static double ma_timer_get_time_in_seconds(ma_timer* pTimer)\n    {\n        LARGE_INTEGER counter;\n        if (!QueryPerformanceCounter(&counter)) {\n            return 0;\n        }\n\n        return (double)(counter.QuadPart - pTimer->counter) / g_ma_TimerFrequency.QuadPart;\n    }\n#elif defined(MA_APPLE) && (__MAC_OS_X_VERSION_MIN_REQUIRED < 101200)\n    static ma_uint64 g_ma_TimerFrequency = 0;\n    static void ma_timer_init(ma_timer* pTimer)\n    {\n        mach_timebase_info_data_t baseTime;\n        mach_timebase_info(&baseTime);\n        g_ma_TimerFrequency = (baseTime.denom * 1e9) / baseTime.numer;\n\n        pTimer->counter = mach_absolute_time();\n    }\n\n    static double ma_timer_get_time_in_seconds(ma_timer* pTimer)\n    {\n        ma_uint64 newTimeCounter = mach_absolute_time();\n        ma_uint64 oldTimeCounter = pTimer->counter;\n\n        return (newTimeCounter - oldTimeCounter) / g_ma_TimerFrequency;\n    }\n#elif defined(MA_EMSCRIPTEN)\n    static MA_INLINE void ma_timer_init(ma_timer* pTimer)\n    {\n        pTimer->counterD = emscripten_get_now();\n    }\n\n    static MA_INLINE double ma_timer_get_time_in_seconds(ma_timer* pTimer)\n    {\n        return (emscripten_get_now() - pTimer->counterD) / 1000;    /* Emscripten is in milliseconds. */\n    }\n#else\n    #if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309L\n        #if defined(CLOCK_MONOTONIC)\n            #define MA_CLOCK_ID CLOCK_MONOTONIC\n        #else\n            #define MA_CLOCK_ID CLOCK_REALTIME\n        #endif\n\n        static void ma_timer_init(ma_timer* pTimer)\n        {\n            struct timespec newTime;\n            clock_gettime(MA_CLOCK_ID, &newTime);\n\n            pTimer->counter = (newTime.tv_sec * 1000000000) + newTime.tv_nsec;\n        }\n\n        static double ma_timer_get_time_in_seconds(ma_timer* pTimer)\n        {\n            ma_uint64 newTimeCounter;\n            ma_uint64 oldTimeCounter;\n\n            struct timespec newTime;\n            clock_gettime(MA_CLOCK_ID, &newTime);\n\n            newTimeCounter = (newTime.tv_sec * 1000000000) + newTime.tv_nsec;\n            oldTimeCounter = pTimer->counter;\n\n            return (newTimeCounter - oldTimeCounter) / 1000000000.0;\n        }\n    #else\n        static void ma_timer_init(ma_timer* pTimer)\n        {\n            struct timeval newTime;\n            gettimeofday(&newTime, NULL);\n\n            pTimer->counter = (newTime.tv_sec * 1000000) + newTime.tv_usec;\n        }\n\n        static double ma_timer_get_time_in_seconds(ma_timer* pTimer)\n        {\n            ma_uint64 newTimeCounter;\n            ma_uint64 oldTimeCounter;\n\n            struct timeval newTime;\n            gettimeofday(&newTime, NULL);\n\n            newTimeCounter = (newTime.tv_sec * 1000000) + newTime.tv_usec;\n            oldTimeCounter = pTimer->counter;\n\n            return (newTimeCounter - oldTimeCounter) / 1000000.0;\n        }\n    #endif\n#endif\n\n\n\n#if 0\nstatic ma_uint32 ma_get_closest_standard_sample_rate(ma_uint32 sampleRateIn)\n{\n    ma_uint32 closestRate = 0;\n    ma_uint32 closestDiff = 0xFFFFFFFF;\n    size_t iStandardRate;\n\n    for (iStandardRate = 0; iStandardRate < ma_countof(g_maStandardSampleRatePriorities); ++iStandardRate) {\n        ma_uint32 standardRate = g_maStandardSampleRatePriorities[iStandardRate];\n        ma_uint32 diff;\n\n        if (sampleRateIn > standardRate) {\n            diff = sampleRateIn - standardRate;\n        } else {\n            diff = standardRate - sampleRateIn;\n        }\n\n        if (diff == 0) {\n            return standardRate;    /* The input sample rate is a standard rate. */\n        }\n\n        if (closestDiff > diff) {\n            closestDiff = diff;\n            closestRate = standardRate;\n        }\n    }\n\n    return closestRate;\n}\n#endif\n\n\nstatic MA_INLINE unsigned int ma_device_disable_denormals(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (!pDevice->noDisableDenormals) {\n        return ma_disable_denormals();\n    } else {\n        return 0;\n    }\n}\n\nstatic MA_INLINE void ma_device_restore_denormals(ma_device* pDevice, unsigned int prevState)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (!pDevice->noDisableDenormals) {\n        ma_restore_denormals(prevState);\n    } else {\n        /* Do nothing. */\n        (void)prevState;\n    }\n}\n\nstatic ma_device_notification ma_device_notification_init(ma_device* pDevice, ma_device_notification_type type)\n{\n    ma_device_notification notification;\n\n    MA_ZERO_OBJECT(&notification);\n    notification.pDevice = pDevice;\n    notification.type    = type;\n\n    return notification;\n}\n\nstatic void ma_device__on_notification(ma_device_notification notification)\n{\n    MA_ASSERT(notification.pDevice != NULL);\n\n    if (notification.pDevice->onNotification != NULL) {\n        notification.pDevice->onNotification(&notification);\n    }\n\n    /* TEMP FOR COMPATIBILITY: If it's a stopped notification, fire the onStop callback as well. This is only for backwards compatibility and will be removed. */\n    if (notification.pDevice->onStop != NULL && notification.type == ma_device_notification_type_stopped) {\n        notification.pDevice->onStop(notification.pDevice);\n    }\n}\n\nstatic void ma_device__on_notification_started(ma_device* pDevice)\n{\n    ma_device__on_notification(ma_device_notification_init(pDevice, ma_device_notification_type_started));\n}\n\nstatic void ma_device__on_notification_stopped(ma_device* pDevice)\n{\n    ma_device__on_notification(ma_device_notification_init(pDevice, ma_device_notification_type_stopped));\n}\n\n/* Not all platforms support reroute notifications. */\n#if !defined(MA_EMSCRIPTEN)\nstatic void ma_device__on_notification_rerouted(ma_device* pDevice)\n{\n    ma_device__on_notification(ma_device_notification_init(pDevice, ma_device_notification_type_rerouted));\n}\n#endif\n\n#if defined(MA_EMSCRIPTEN)\nEMSCRIPTEN_KEEPALIVE\nvoid ma_device__on_notification_unlocked(ma_device* pDevice)\n{\n    ma_device__on_notification(ma_device_notification_init(pDevice, ma_device_notification_type_unlocked));\n}\n#endif\n\n\nstatic void ma_device__on_data_inner(ma_device* pDevice, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount)\n{\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(pDevice->onData != NULL);\n\n    if (!pDevice->noPreSilencedOutputBuffer && pFramesOut != NULL) {\n        ma_silence_pcm_frames(pFramesOut, frameCount, pDevice->playback.format, pDevice->playback.channels);\n    }\n\n    pDevice->onData(pDevice, pFramesOut, pFramesIn, frameCount);\n}\n\nstatic void ma_device__on_data(ma_device* pDevice, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    /* Don't read more data from the client if we're in the process of stopping. */\n    if (ma_device_get_state(pDevice) == ma_device_state_stopping) {\n        return;\n    }\n\n    if (pDevice->noFixedSizedCallback) {\n        /* Fast path. Not using a fixed sized callback. Process directly from the specified buffers. */\n        ma_device__on_data_inner(pDevice, pFramesOut, pFramesIn, frameCount);\n    } else {\n        /* Slow path. Using a fixed sized callback. Need to use the intermediary buffer. */\n        ma_uint32 totalFramesProcessed = 0;\n\n        while (totalFramesProcessed < frameCount) {\n            ma_uint32 totalFramesRemaining = frameCount - totalFramesProcessed;\n            ma_uint32 framesToProcessThisIteration = 0;\n\n            if (pFramesIn != NULL) {\n                /* Capturing. Write to the intermediary buffer. If there's no room, fire the callback to empty it. */\n                if (pDevice->capture.intermediaryBufferLen < pDevice->capture.intermediaryBufferCap) {\n                    /* There's some room left in the intermediary buffer. Write to it without firing the callback. */\n                    framesToProcessThisIteration = totalFramesRemaining;\n                    if (framesToProcessThisIteration > pDevice->capture.intermediaryBufferCap - pDevice->capture.intermediaryBufferLen) {\n                        framesToProcessThisIteration = pDevice->capture.intermediaryBufferCap - pDevice->capture.intermediaryBufferLen;\n                    }\n\n                    ma_copy_pcm_frames(\n                        ma_offset_pcm_frames_ptr(pDevice->capture.pIntermediaryBuffer, pDevice->capture.intermediaryBufferLen, pDevice->capture.format, pDevice->capture.channels),\n                        ma_offset_pcm_frames_const_ptr(pFramesIn, totalFramesProcessed, pDevice->capture.format, pDevice->capture.channels),\n                        framesToProcessThisIteration,\n                        pDevice->capture.format, pDevice->capture.channels);\n\n                    pDevice->capture.intermediaryBufferLen += framesToProcessThisIteration;\n                }\n\n                if (pDevice->capture.intermediaryBufferLen == pDevice->capture.intermediaryBufferCap) {\n                    /* No room left in the intermediary buffer. Fire the data callback. */\n                    if (pDevice->type == ma_device_type_duplex) {\n                        /* We'll do the duplex data callback later after we've processed the playback data. */\n                    } else {\n                        ma_device__on_data_inner(pDevice, NULL, pDevice->capture.pIntermediaryBuffer, pDevice->capture.intermediaryBufferCap);\n\n                        /* The intermediary buffer has just been drained. */\n                        pDevice->capture.intermediaryBufferLen = 0;\n                    }\n                }\n            }\n\n            if (pFramesOut != NULL) {\n                /* Playing back. Read from the intermediary buffer. If there's nothing in it, fire the callback to fill it. */\n                if (pDevice->playback.intermediaryBufferLen > 0) {\n                    /* There's some content in the intermediary buffer. Read from that without firing the callback. */\n                    if (pDevice->type == ma_device_type_duplex) {\n                        /* The frames processed this iteration for a duplex device will always be based on the capture side. Leave it unmodified. */\n                    } else {\n                        framesToProcessThisIteration = totalFramesRemaining;\n                        if (framesToProcessThisIteration > pDevice->playback.intermediaryBufferLen) {\n                            framesToProcessThisIteration = pDevice->playback.intermediaryBufferLen;\n                        }\n                    }\n\n                    ma_copy_pcm_frames(\n                        ma_offset_pcm_frames_ptr(pFramesOut, totalFramesProcessed, pDevice->playback.format, pDevice->playback.channels),\n                        ma_offset_pcm_frames_ptr(pDevice->playback.pIntermediaryBuffer, pDevice->playback.intermediaryBufferCap - pDevice->playback.intermediaryBufferLen, pDevice->playback.format, pDevice->playback.channels),\n                        framesToProcessThisIteration,\n                        pDevice->playback.format, pDevice->playback.channels);\n\n                    pDevice->playback.intermediaryBufferLen -= framesToProcessThisIteration;\n                }\n\n                if (pDevice->playback.intermediaryBufferLen == 0) {\n                    /* There's nothing in the intermediary buffer. Fire the data callback to fill it. */\n                    if (pDevice->type == ma_device_type_duplex) {\n                        /* In duplex mode, the data callback will be fired later. Nothing to do here. */\n                    } else {\n                        ma_device__on_data_inner(pDevice, pDevice->playback.pIntermediaryBuffer, NULL, pDevice->playback.intermediaryBufferCap);\n\n                        /* The intermediary buffer has just been filled. */\n                        pDevice->playback.intermediaryBufferLen = pDevice->playback.intermediaryBufferCap;\n                    }\n                }\n            }\n\n            /* If we're in duplex mode we might need to do a refill of the data. */\n            if (pDevice->type == ma_device_type_duplex) {\n                if (pDevice->capture.intermediaryBufferLen == pDevice->capture.intermediaryBufferCap) {\n                    ma_device__on_data_inner(pDevice, pDevice->playback.pIntermediaryBuffer, pDevice->capture.pIntermediaryBuffer, pDevice->capture.intermediaryBufferCap);\n\n                    pDevice->playback.intermediaryBufferLen = pDevice->playback.intermediaryBufferCap;  /* The playback buffer will have just been filled. */\n                    pDevice->capture.intermediaryBufferLen  = 0;                                        /* The intermediary buffer has just been drained. */\n                }\n            }\n\n            /* Make sure this is only incremented once in the duplex case. */\n            totalFramesProcessed += framesToProcessThisIteration;\n        }\n    }\n}\n\nstatic void ma_device__handle_data_callback(ma_device* pDevice, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount)\n{\n    float masterVolumeFactor;\n\n    ma_device_get_master_volume(pDevice, &masterVolumeFactor);  /* Use ma_device_get_master_volume() to ensure the volume is loaded atomically. */\n\n    if (pDevice->onData) {\n        unsigned int prevDenormalState = ma_device_disable_denormals(pDevice);\n        {\n            /* Volume control of input makes things a bit awkward because the input buffer is read-only. We'll need to use a temp buffer and loop in this case. */\n            if (pFramesIn != NULL && masterVolumeFactor < 1) {\n                ma_uint8 tempFramesIn[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n                ma_uint32 bpfCapture  = ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels);\n                ma_uint32 bpfPlayback = ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels);\n                ma_uint32 totalFramesProcessed = 0;\n                while (totalFramesProcessed < frameCount) {\n                    ma_uint32 framesToProcessThisIteration = frameCount - totalFramesProcessed;\n                    if (framesToProcessThisIteration > sizeof(tempFramesIn)/bpfCapture) {\n                        framesToProcessThisIteration = sizeof(tempFramesIn)/bpfCapture;\n                    }\n\n                    ma_copy_and_apply_volume_factor_pcm_frames(tempFramesIn, ma_offset_ptr(pFramesIn, totalFramesProcessed*bpfCapture), framesToProcessThisIteration, pDevice->capture.format, pDevice->capture.channels, masterVolumeFactor);\n\n                    ma_device__on_data(pDevice, ma_offset_ptr(pFramesOut, totalFramesProcessed*bpfPlayback), tempFramesIn, framesToProcessThisIteration);\n\n                    totalFramesProcessed += framesToProcessThisIteration;\n                }\n            } else {\n                ma_device__on_data(pDevice, pFramesOut, pFramesIn, frameCount);\n            }\n\n            /* Volume control and clipping for playback devices. */\n            if (pFramesOut != NULL) {\n                if (masterVolumeFactor < 1) {\n                    if (pFramesIn == NULL) {    /* <-- In full-duplex situations, the volume will have been applied to the input samples before the data callback. Applying it again post-callback will incorrectly compound it. */\n                        ma_apply_volume_factor_pcm_frames(pFramesOut, frameCount, pDevice->playback.format, pDevice->playback.channels, masterVolumeFactor);\n                    }\n                }\n\n                if (!pDevice->noClip && pDevice->playback.format == ma_format_f32) {\n                    ma_clip_samples_f32((float*)pFramesOut, (const float*)pFramesOut, frameCount * pDevice->playback.channels);   /* Intentionally specifying the same pointer for both input and output for in-place processing. */\n                }\n            }\n        }\n        ma_device_restore_denormals(pDevice, prevDenormalState);\n    }\n}\n\n\n\n/* A helper function for reading sample data from the client. */\nstatic void ma_device__read_frames_from_client(ma_device* pDevice, ma_uint32 frameCount, void* pFramesOut)\n{\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(frameCount > 0);\n    MA_ASSERT(pFramesOut != NULL);\n\n    if (pDevice->playback.converter.isPassthrough) {\n        ma_device__handle_data_callback(pDevice, pFramesOut, NULL, frameCount);\n    } else {\n        ma_result result;\n        ma_uint64 totalFramesReadOut;\n        void* pRunningFramesOut;\n\n        totalFramesReadOut = 0;\n        pRunningFramesOut  = pFramesOut;\n\n        /*\n        We run slightly different logic depending on whether or not we're using a heap-allocated\n        buffer for caching input data. This will be the case if the data converter does not have\n        the ability to retrieve the required input frame count for a given output frame count.\n        */\n        if (pDevice->playback.pInputCache != NULL) {\n            while (totalFramesReadOut < frameCount) {\n                ma_uint64 framesToReadThisIterationIn;\n                ma_uint64 framesToReadThisIterationOut;\n\n                /* If there's any data available in the cache, that needs to get processed first. */\n                if (pDevice->playback.inputCacheRemaining > 0) {\n                    framesToReadThisIterationOut = (frameCount - totalFramesReadOut);\n                    framesToReadThisIterationIn  = framesToReadThisIterationOut;\n                    if (framesToReadThisIterationIn > pDevice->playback.inputCacheRemaining) {\n                        framesToReadThisIterationIn = pDevice->playback.inputCacheRemaining;\n                    }\n\n                    result = ma_data_converter_process_pcm_frames(&pDevice->playback.converter, ma_offset_pcm_frames_ptr(pDevice->playback.pInputCache, pDevice->playback.inputCacheConsumed, pDevice->playback.format, pDevice->playback.channels), &framesToReadThisIterationIn, pRunningFramesOut, &framesToReadThisIterationOut);\n                    if (result != MA_SUCCESS) {\n                        break;\n                    }\n\n                    pDevice->playback.inputCacheConsumed  += framesToReadThisIterationIn;\n                    pDevice->playback.inputCacheRemaining -= framesToReadThisIterationIn;\n\n                    totalFramesReadOut += framesToReadThisIterationOut;\n                    pRunningFramesOut   = ma_offset_ptr(pRunningFramesOut, framesToReadThisIterationOut * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n\n                    if (framesToReadThisIterationIn == 0 && framesToReadThisIterationOut == 0) {\n                        break;  /* We're done. */\n                    }\n                }\n\n                /* Getting here means there's no data in the cache and we need to fill it up with data from the client. */\n                if (pDevice->playback.inputCacheRemaining == 0) {\n                    ma_device__handle_data_callback(pDevice, pDevice->playback.pInputCache, NULL, (ma_uint32)pDevice->playback.inputCacheCap);\n\n                    pDevice->playback.inputCacheConsumed  = 0;\n                    pDevice->playback.inputCacheRemaining = pDevice->playback.inputCacheCap;\n                }\n            }\n        } else {\n            while (totalFramesReadOut < frameCount) {\n                ma_uint8 pIntermediaryBuffer[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];  /* In client format. */\n                ma_uint64 intermediaryBufferCap = sizeof(pIntermediaryBuffer) / ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels);\n                ma_uint64 framesToReadThisIterationIn;\n                ma_uint64 framesReadThisIterationIn;\n                ma_uint64 framesToReadThisIterationOut;\n                ma_uint64 framesReadThisIterationOut;\n                ma_uint64 requiredInputFrameCount;\n\n                framesToReadThisIterationOut = (frameCount - totalFramesReadOut);\n                framesToReadThisIterationIn = framesToReadThisIterationOut;\n                if (framesToReadThisIterationIn > intermediaryBufferCap) {\n                    framesToReadThisIterationIn = intermediaryBufferCap;\n                }\n\n                ma_data_converter_get_required_input_frame_count(&pDevice->playback.converter, framesToReadThisIterationOut, &requiredInputFrameCount);\n                if (framesToReadThisIterationIn > requiredInputFrameCount) {\n                    framesToReadThisIterationIn = requiredInputFrameCount;\n                }\n\n                if (framesToReadThisIterationIn > 0) {\n                    ma_device__handle_data_callback(pDevice, pIntermediaryBuffer, NULL, (ma_uint32)framesToReadThisIterationIn);\n                }\n\n                /*\n                At this point we have our decoded data in input format and now we need to convert to output format. Note that even if we didn't read any\n                input frames, we still want to try processing frames because there may some output frames generated from cached input data.\n                */\n                framesReadThisIterationIn  = framesToReadThisIterationIn;\n                framesReadThisIterationOut = framesToReadThisIterationOut;\n                result = ma_data_converter_process_pcm_frames(&pDevice->playback.converter, pIntermediaryBuffer, &framesReadThisIterationIn, pRunningFramesOut, &framesReadThisIterationOut);\n                if (result != MA_SUCCESS) {\n                    break;\n                }\n\n                totalFramesReadOut += framesReadThisIterationOut;\n                pRunningFramesOut   = ma_offset_ptr(pRunningFramesOut, framesReadThisIterationOut * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n\n                if (framesReadThisIterationIn == 0 && framesReadThisIterationOut == 0) {\n                    break;  /* We're done. */\n                }\n            }\n        }\n    }\n}\n\n/* A helper for sending sample data to the client. */\nstatic void ma_device__send_frames_to_client(ma_device* pDevice, ma_uint32 frameCountInDeviceFormat, const void* pFramesInDeviceFormat)\n{\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(frameCountInDeviceFormat > 0);\n    MA_ASSERT(pFramesInDeviceFormat != NULL);\n\n    if (pDevice->capture.converter.isPassthrough) {\n        ma_device__handle_data_callback(pDevice, NULL, pFramesInDeviceFormat, frameCountInDeviceFormat);\n    } else {\n        ma_result result;\n        ma_uint8 pFramesInClientFormat[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n        ma_uint64 framesInClientFormatCap = sizeof(pFramesInClientFormat) / ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels);\n        ma_uint64 totalDeviceFramesProcessed = 0;\n        ma_uint64 totalClientFramesProcessed = 0;\n        const void* pRunningFramesInDeviceFormat = pFramesInDeviceFormat;\n\n        /* We just keep going until we've exhaused all of our input frames and cannot generate any more output frames. */\n        for (;;) {\n            ma_uint64 deviceFramesProcessedThisIteration;\n            ma_uint64 clientFramesProcessedThisIteration;\n\n            deviceFramesProcessedThisIteration = (frameCountInDeviceFormat - totalDeviceFramesProcessed);\n            clientFramesProcessedThisIteration = framesInClientFormatCap;\n\n            result = ma_data_converter_process_pcm_frames(&pDevice->capture.converter, pRunningFramesInDeviceFormat, &deviceFramesProcessedThisIteration, pFramesInClientFormat, &clientFramesProcessedThisIteration);\n            if (result != MA_SUCCESS) {\n                break;\n            }\n\n            if (clientFramesProcessedThisIteration > 0) {\n                ma_device__handle_data_callback(pDevice, NULL, pFramesInClientFormat, (ma_uint32)clientFramesProcessedThisIteration);    /* Safe cast. */\n            }\n\n            pRunningFramesInDeviceFormat = ma_offset_ptr(pRunningFramesInDeviceFormat, deviceFramesProcessedThisIteration * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels));\n            totalDeviceFramesProcessed  += deviceFramesProcessedThisIteration;\n            totalClientFramesProcessed  += clientFramesProcessedThisIteration;\n\n            /* This is just to silence a warning. I might want to use this variable later so leaving in place for now. */\n            (void)totalClientFramesProcessed;\n\n            if (deviceFramesProcessedThisIteration == 0 && clientFramesProcessedThisIteration == 0) {\n                break;  /* We're done. */\n            }\n        }\n    }\n}\n\nstatic ma_result ma_device__handle_duplex_callback_capture(ma_device* pDevice, ma_uint32 frameCountInDeviceFormat, const void* pFramesInDeviceFormat, ma_pcm_rb* pRB)\n{\n    ma_result result;\n    ma_uint32 totalDeviceFramesProcessed = 0;\n    const void* pRunningFramesInDeviceFormat = pFramesInDeviceFormat;\n\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(frameCountInDeviceFormat > 0);\n    MA_ASSERT(pFramesInDeviceFormat != NULL);\n    MA_ASSERT(pRB != NULL);\n\n    /* Write to the ring buffer. The ring buffer is in the client format which means we need to convert. */\n    for (;;) {\n        ma_uint32 framesToProcessInDeviceFormat = (frameCountInDeviceFormat - totalDeviceFramesProcessed);\n        ma_uint32 framesToProcessInClientFormat = MA_DATA_CONVERTER_STACK_BUFFER_SIZE / ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels);\n        ma_uint64 framesProcessedInDeviceFormat;\n        ma_uint64 framesProcessedInClientFormat;\n        void* pFramesInClientFormat;\n\n        result = ma_pcm_rb_acquire_write(pRB, &framesToProcessInClientFormat, &pFramesInClientFormat);\n        if (result != MA_SUCCESS) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"Failed to acquire capture PCM frames from ring buffer.\");\n            break;\n        }\n\n        if (framesToProcessInClientFormat == 0) {\n            if (ma_pcm_rb_pointer_distance(pRB) == (ma_int32)ma_pcm_rb_get_subbuffer_size(pRB)) {\n                break;  /* Overrun. Not enough room in the ring buffer for input frame. Excess frames are dropped. */\n            }\n        }\n\n        /* Convert. */\n        framesProcessedInDeviceFormat = framesToProcessInDeviceFormat;\n        framesProcessedInClientFormat = framesToProcessInClientFormat;\n        result = ma_data_converter_process_pcm_frames(&pDevice->capture.converter, pRunningFramesInDeviceFormat, &framesProcessedInDeviceFormat, pFramesInClientFormat, &framesProcessedInClientFormat);\n        if (result != MA_SUCCESS) {\n            break;\n        }\n\n        result = ma_pcm_rb_commit_write(pRB, (ma_uint32)framesProcessedInClientFormat);  /* Safe cast. */\n        if (result != MA_SUCCESS) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"Failed to commit capture PCM frames to ring buffer.\");\n            break;\n        }\n\n        pRunningFramesInDeviceFormat = ma_offset_ptr(pRunningFramesInDeviceFormat, framesProcessedInDeviceFormat * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels));\n        totalDeviceFramesProcessed += (ma_uint32)framesProcessedInDeviceFormat; /* Safe cast. */\n\n        /* We're done when we're unable to process any client nor device frames. */\n        if (framesProcessedInClientFormat == 0 && framesProcessedInDeviceFormat == 0) {\n            break;  /* Done. */\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device__handle_duplex_callback_playback(ma_device* pDevice, ma_uint32 frameCount, void* pFramesInInternalFormat, ma_pcm_rb* pRB)\n{\n    ma_result result;\n    ma_uint8 silentInputFrames[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n    ma_uint32 totalFramesReadOut = 0;\n\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(frameCount > 0);\n    MA_ASSERT(pFramesInInternalFormat != NULL);\n    MA_ASSERT(pRB != NULL);\n    MA_ASSERT(pDevice->playback.pInputCache != NULL);\n\n    /*\n    Sitting in the ring buffer should be captured data from the capture callback in external format. If there's not enough data in there for\n    the whole frameCount frames we just use silence instead for the input data.\n    */\n    MA_ZERO_MEMORY(silentInputFrames, sizeof(silentInputFrames));\n\n    while (totalFramesReadOut < frameCount && ma_device_is_started(pDevice)) {\n        /*\n        We should have a buffer allocated on the heap. Any playback frames still sitting in there\n        need to be sent to the internal device before we process any more data from the client.\n        */\n        if (pDevice->playback.inputCacheRemaining > 0) {\n            ma_uint64 framesConvertedIn  = pDevice->playback.inputCacheRemaining;\n            ma_uint64 framesConvertedOut = (frameCount - totalFramesReadOut);\n            ma_data_converter_process_pcm_frames(&pDevice->playback.converter, ma_offset_pcm_frames_ptr(pDevice->playback.pInputCache, pDevice->playback.inputCacheConsumed, pDevice->playback.format, pDevice->playback.channels), &framesConvertedIn, pFramesInInternalFormat, &framesConvertedOut);\n\n            pDevice->playback.inputCacheConsumed  += framesConvertedIn;\n            pDevice->playback.inputCacheRemaining -= framesConvertedIn;\n\n            totalFramesReadOut        += (ma_uint32)framesConvertedOut; /* Safe cast. */\n            pFramesInInternalFormat    = ma_offset_ptr(pFramesInInternalFormat, framesConvertedOut * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n        }\n\n        /* If there's no more data in the cache we'll need to fill it with some. */\n        if (totalFramesReadOut < frameCount && pDevice->playback.inputCacheRemaining == 0) {\n            ma_uint32 inputFrameCount;\n            void* pInputFrames;\n\n            inputFrameCount = (ma_uint32)pDevice->playback.inputCacheCap;\n            result = ma_pcm_rb_acquire_read(pRB, &inputFrameCount, &pInputFrames);\n            if (result == MA_SUCCESS) {\n                if (inputFrameCount > 0) {\n                    ma_device__handle_data_callback(pDevice, pDevice->playback.pInputCache, pInputFrames, inputFrameCount);\n                } else {\n                    if (ma_pcm_rb_pointer_distance(pRB) == 0) {\n                        break;  /* Underrun. */\n                    }\n                }\n            } else {\n                /* No capture data available. Feed in silence. */\n                inputFrameCount = (ma_uint32)ma_min(pDevice->playback.inputCacheCap, sizeof(silentInputFrames) / ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels));\n                ma_device__handle_data_callback(pDevice, pDevice->playback.pInputCache, silentInputFrames, inputFrameCount);\n            }\n\n            pDevice->playback.inputCacheConsumed  = 0;\n            pDevice->playback.inputCacheRemaining = inputFrameCount;\n\n            result = ma_pcm_rb_commit_read(pRB, inputFrameCount);\n            if (result != MA_SUCCESS) {\n                return result;  /* Should never happen. */\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n/* A helper for changing the state of the device. */\nstatic MA_INLINE void ma_device__set_state(ma_device* pDevice, ma_device_state newState)\n{\n    ma_atomic_device_state_set(&pDevice->state, newState);\n}\n\n\n#if defined(MA_WIN32)\n    static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_PCM        = {0x00000001, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};\n    static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT = {0x00000003, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};\n    /*static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_ALAW       = {0x00000006, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/\n    /*static GUID MA_GUID_KSDATAFORMAT_SUBTYPE_MULAW      = {0x00000007, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};*/\n#endif\n\n\n\nMA_API ma_uint32 ma_get_format_priority_index(ma_format format) /* Lower = better. */\n{\n    ma_uint32 i;\n    for (i = 0; i < ma_countof(g_maFormatPriorities); ++i) {\n        if (g_maFormatPriorities[i] == format) {\n            return i;\n        }\n    }\n\n    /* Getting here means the format could not be found or is equal to ma_format_unknown. */\n    return (ma_uint32)-1;\n}\n\nstatic ma_result ma_device__post_init_setup(ma_device* pDevice, ma_device_type deviceType);\n\nstatic ma_bool32 ma_device_descriptor_is_valid(const ma_device_descriptor* pDeviceDescriptor)\n{\n    if (pDeviceDescriptor == NULL) {\n        return MA_FALSE;\n    }\n\n    if (pDeviceDescriptor->format == ma_format_unknown) {\n        return MA_FALSE;\n    }\n\n    if (pDeviceDescriptor->channels == 0 || pDeviceDescriptor->channels > MA_MAX_CHANNELS) {\n        return MA_FALSE;\n    }\n\n    if (pDeviceDescriptor->sampleRate == 0) {\n        return MA_FALSE;\n    }\n\n    return MA_TRUE;\n}\n\n\nstatic ma_result ma_device_audio_thread__default_read_write(ma_device* pDevice)\n{\n    ma_result result = MA_SUCCESS;\n    ma_bool32 exitLoop = MA_FALSE;\n    ma_uint8  capturedDeviceData[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n    ma_uint8  playbackDeviceData[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n    ma_uint32 capturedDeviceDataCapInFrames = 0;\n    ma_uint32 playbackDeviceDataCapInFrames = 0;\n\n    MA_ASSERT(pDevice != NULL);\n\n    /* Just some quick validation on the device type and the available callbacks. */\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex || pDevice->type == ma_device_type_loopback) {\n        if (pDevice->pContext->callbacks.onDeviceRead == NULL) {\n            return MA_NOT_IMPLEMENTED;\n        }\n\n        capturedDeviceDataCapInFrames = sizeof(capturedDeviceData) / ma_get_bytes_per_frame(pDevice->capture.internalFormat,  pDevice->capture.internalChannels);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->pContext->callbacks.onDeviceWrite == NULL) {\n            return MA_NOT_IMPLEMENTED;\n        }\n\n        playbackDeviceDataCapInFrames = sizeof(playbackDeviceData) / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n    }\n\n    /* NOTE: The device was started outside of this function, in the worker thread. */\n\n    while (ma_device_get_state(pDevice) == ma_device_state_started && !exitLoop) {\n        switch (pDevice->type) {\n            case ma_device_type_duplex:\n            {\n                /* The process is: onDeviceRead() -> convert -> callback -> convert -> onDeviceWrite() */\n                ma_uint32 totalCapturedDeviceFramesProcessed = 0;\n                ma_uint32 capturedDevicePeriodSizeInFrames = ma_min(pDevice->capture.internalPeriodSizeInFrames, pDevice->playback.internalPeriodSizeInFrames);\n\n                while (totalCapturedDeviceFramesProcessed < capturedDevicePeriodSizeInFrames) {\n                    ma_uint32 capturedDeviceFramesRemaining;\n                    ma_uint32 capturedDeviceFramesProcessed;\n                    ma_uint32 capturedDeviceFramesToProcess;\n                    ma_uint32 capturedDeviceFramesToTryProcessing = capturedDevicePeriodSizeInFrames - totalCapturedDeviceFramesProcessed;\n                    if (capturedDeviceFramesToTryProcessing > capturedDeviceDataCapInFrames) {\n                        capturedDeviceFramesToTryProcessing = capturedDeviceDataCapInFrames;\n                    }\n\n                    result = pDevice->pContext->callbacks.onDeviceRead(pDevice, capturedDeviceData, capturedDeviceFramesToTryProcessing, &capturedDeviceFramesToProcess);\n                    if (result != MA_SUCCESS) {\n                        exitLoop = MA_TRUE;\n                        break;\n                    }\n\n                    capturedDeviceFramesRemaining = capturedDeviceFramesToProcess;\n                    capturedDeviceFramesProcessed = 0;\n\n                    /* At this point we have our captured data in device format and we now need to convert it to client format. */\n                    for (;;) {\n                        ma_uint8  capturedClientData[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n                        ma_uint8  playbackClientData[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n                        ma_uint32 capturedClientDataCapInFrames = sizeof(capturedClientData) / ma_get_bytes_per_frame(pDevice->capture.format,  pDevice->capture.channels);\n                        ma_uint32 playbackClientDataCapInFrames = sizeof(playbackClientData) / ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels);\n                        ma_uint64 capturedClientFramesToProcessThisIteration = ma_min(capturedClientDataCapInFrames, playbackClientDataCapInFrames);\n                        ma_uint64 capturedDeviceFramesToProcessThisIteration = capturedDeviceFramesRemaining;\n                        ma_uint8* pRunningCapturedDeviceFrames = ma_offset_ptr(capturedDeviceData, capturedDeviceFramesProcessed * ma_get_bytes_per_frame(pDevice->capture.internalFormat,  pDevice->capture.internalChannels));\n\n                        /* Convert capture data from device format to client format. */\n                        result = ma_data_converter_process_pcm_frames(&pDevice->capture.converter, pRunningCapturedDeviceFrames, &capturedDeviceFramesToProcessThisIteration, capturedClientData, &capturedClientFramesToProcessThisIteration);\n                        if (result != MA_SUCCESS) {\n                            break;\n                        }\n\n                        /*\n                        If we weren't able to generate any output frames it must mean we've exhaused all of our input. The only time this would not be the case is if capturedClientData was too small\n                        which should never be the case when it's of the size MA_DATA_CONVERTER_STACK_BUFFER_SIZE.\n                        */\n                        if (capturedClientFramesToProcessThisIteration == 0) {\n                            break;\n                        }\n\n                        ma_device__handle_data_callback(pDevice, playbackClientData, capturedClientData, (ma_uint32)capturedClientFramesToProcessThisIteration);    /* Safe cast .*/\n\n                        capturedDeviceFramesProcessed += (ma_uint32)capturedDeviceFramesToProcessThisIteration; /* Safe cast. */\n                        capturedDeviceFramesRemaining -= (ma_uint32)capturedDeviceFramesToProcessThisIteration; /* Safe cast. */\n\n                        /* At this point the playbackClientData buffer should be holding data that needs to be written to the device. */\n                        for (;;) {\n                            ma_uint64 convertedClientFrameCount = capturedClientFramesToProcessThisIteration;\n                            ma_uint64 convertedDeviceFrameCount = playbackDeviceDataCapInFrames;\n                            result = ma_data_converter_process_pcm_frames(&pDevice->playback.converter, playbackClientData, &convertedClientFrameCount, playbackDeviceData, &convertedDeviceFrameCount);\n                            if (result != MA_SUCCESS) {\n                                break;\n                            }\n\n                            result = pDevice->pContext->callbacks.onDeviceWrite(pDevice, playbackDeviceData, (ma_uint32)convertedDeviceFrameCount, NULL);   /* Safe cast. */\n                            if (result != MA_SUCCESS) {\n                                exitLoop = MA_TRUE;\n                                break;\n                            }\n\n                            capturedClientFramesToProcessThisIteration -= (ma_uint32)convertedClientFrameCount;  /* Safe cast. */\n                            if (capturedClientFramesToProcessThisIteration == 0) {\n                                break;\n                            }\n                        }\n\n                        /* In case an error happened from ma_device_write__null()... */\n                        if (result != MA_SUCCESS) {\n                            exitLoop = MA_TRUE;\n                            break;\n                        }\n                    }\n\n                    /* Make sure we don't get stuck in the inner loop. */\n                    if (capturedDeviceFramesProcessed == 0) {\n                        break;\n                    }\n\n                    totalCapturedDeviceFramesProcessed += capturedDeviceFramesProcessed;\n                }\n            } break;\n\n            case ma_device_type_capture:\n            case ma_device_type_loopback:\n            {\n                ma_uint32 periodSizeInFrames = pDevice->capture.internalPeriodSizeInFrames;\n                ma_uint32 framesReadThisPeriod = 0;\n                while (framesReadThisPeriod < periodSizeInFrames) {\n                    ma_uint32 framesRemainingInPeriod = periodSizeInFrames - framesReadThisPeriod;\n                    ma_uint32 framesProcessed;\n                    ma_uint32 framesToReadThisIteration = framesRemainingInPeriod;\n                    if (framesToReadThisIteration > capturedDeviceDataCapInFrames) {\n                        framesToReadThisIteration = capturedDeviceDataCapInFrames;\n                    }\n\n                    result = pDevice->pContext->callbacks.onDeviceRead(pDevice, capturedDeviceData, framesToReadThisIteration, &framesProcessed);\n                    if (result != MA_SUCCESS) {\n                        exitLoop = MA_TRUE;\n                        break;\n                    }\n\n                    /* Make sure we don't get stuck in the inner loop. */\n                    if (framesProcessed == 0) {\n                        break;\n                    }\n\n                    ma_device__send_frames_to_client(pDevice, framesProcessed, capturedDeviceData);\n\n                    framesReadThisPeriod += framesProcessed;\n                }\n            } break;\n\n            case ma_device_type_playback:\n            {\n                /* We write in chunks of the period size, but use a stack allocated buffer for the intermediary. */\n                ma_uint32 periodSizeInFrames = pDevice->playback.internalPeriodSizeInFrames;\n                ma_uint32 framesWrittenThisPeriod = 0;\n                while (framesWrittenThisPeriod < periodSizeInFrames) {\n                    ma_uint32 framesRemainingInPeriod = periodSizeInFrames - framesWrittenThisPeriod;\n                    ma_uint32 framesProcessed;\n                    ma_uint32 framesToWriteThisIteration = framesRemainingInPeriod;\n                    if (framesToWriteThisIteration > playbackDeviceDataCapInFrames) {\n                        framesToWriteThisIteration = playbackDeviceDataCapInFrames;\n                    }\n\n                    ma_device__read_frames_from_client(pDevice, framesToWriteThisIteration, playbackDeviceData);\n\n                    result = pDevice->pContext->callbacks.onDeviceWrite(pDevice, playbackDeviceData, framesToWriteThisIteration, &framesProcessed);\n                    if (result != MA_SUCCESS) {\n                        exitLoop = MA_TRUE;\n                        break;\n                    }\n\n                    /* Make sure we don't get stuck in the inner loop. */\n                    if (framesProcessed == 0) {\n                        break;\n                    }\n\n                    framesWrittenThisPeriod += framesProcessed;\n                }\n            } break;\n\n            /* Should never get here. */\n            default: break;\n        }\n    }\n\n    return result;\n}\n\n\n\n/*******************************************************************************\n\nNull Backend\n\n*******************************************************************************/\n#ifdef MA_HAS_NULL\n\n#define MA_DEVICE_OP_NONE__NULL    0\n#define MA_DEVICE_OP_START__NULL   1\n#define MA_DEVICE_OP_SUSPEND__NULL 2\n#define MA_DEVICE_OP_KILL__NULL    3\n\nstatic ma_thread_result MA_THREADCALL ma_device_thread__null(void* pData)\n{\n    ma_device* pDevice = (ma_device*)pData;\n    MA_ASSERT(pDevice != NULL);\n\n    for (;;) {  /* Keep the thread alive until the device is uninitialized. */\n        ma_uint32 operation;\n\n        /* Wait for an operation to be requested. */\n        ma_event_wait(&pDevice->null_device.operationEvent);\n\n        /* At this point an event should have been triggered. */\n        operation = pDevice->null_device.operation;\n\n        /* Starting the device needs to put the thread into a loop. */\n        if (operation == MA_DEVICE_OP_START__NULL) {\n            /* Reset the timer just in case. */\n            ma_timer_init(&pDevice->null_device.timer);\n\n            /* Getting here means a suspend or kill operation has been requested. */\n            pDevice->null_device.operationResult = MA_SUCCESS;\n            ma_event_signal(&pDevice->null_device.operationCompletionEvent);\n            ma_semaphore_release(&pDevice->null_device.operationSemaphore);\n            continue;\n        }\n\n        /* Suspending the device means we need to stop the timer and just continue the loop. */\n        if (operation == MA_DEVICE_OP_SUSPEND__NULL) {\n            /* We need to add the current run time to the prior run time, then reset the timer. */\n            pDevice->null_device.priorRunTime += ma_timer_get_time_in_seconds(&pDevice->null_device.timer);\n            ma_timer_init(&pDevice->null_device.timer);\n\n            /* We're done. */\n            pDevice->null_device.operationResult = MA_SUCCESS;\n            ma_event_signal(&pDevice->null_device.operationCompletionEvent);\n            ma_semaphore_release(&pDevice->null_device.operationSemaphore);\n            continue;\n        }\n\n        /* Killing the device means we need to get out of this loop so that this thread can terminate. */\n        if (operation == MA_DEVICE_OP_KILL__NULL) {\n            pDevice->null_device.operationResult = MA_SUCCESS;\n            ma_event_signal(&pDevice->null_device.operationCompletionEvent);\n            ma_semaphore_release(&pDevice->null_device.operationSemaphore);\n            break;\n        }\n\n        /* Getting a signal on a \"none\" operation probably means an error. Return invalid operation. */\n        if (operation == MA_DEVICE_OP_NONE__NULL) {\n            MA_ASSERT(MA_FALSE);  /* <-- Trigger this in debug mode to ensure developers are aware they're doing something wrong (or there's a bug in a miniaudio). */\n            pDevice->null_device.operationResult = MA_INVALID_OPERATION;\n            ma_event_signal(&pDevice->null_device.operationCompletionEvent);\n            ma_semaphore_release(&pDevice->null_device.operationSemaphore);\n            continue;   /* Continue the loop. Don't terminate. */\n        }\n    }\n\n    return (ma_thread_result)0;\n}\n\nstatic ma_result ma_device_do_operation__null(ma_device* pDevice, ma_uint32 operation)\n{\n    ma_result result;\n\n    /*\n    TODO: Need to review this and consider just using mutual exclusion. I think the original motivation\n    for this was to just post the event to a queue and return immediately, but that has since changed\n    and now this function is synchronous. I think this can be simplified to just use a mutex.\n    */\n\n    /*\n    The first thing to do is wait for an operation slot to become available. We only have a single slot for this, but we could extend this later\n    to support queing of operations.\n    */\n    result = ma_semaphore_wait(&pDevice->null_device.operationSemaphore);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to wait for the event. */\n    }\n\n    /*\n    When we get here it means the background thread is not referencing the operation code and it can be changed. After changing this we need to\n    signal an event to the worker thread to let it know that it can start work.\n    */\n    pDevice->null_device.operation = operation;\n\n    /* Once the operation code has been set, the worker thread can start work. */\n    if (ma_event_signal(&pDevice->null_device.operationEvent) != MA_SUCCESS) {\n        return MA_ERROR;\n    }\n\n    /* We want everything to be synchronous so we're going to wait for the worker thread to complete it's operation. */\n    if (ma_event_wait(&pDevice->null_device.operationCompletionEvent) != MA_SUCCESS) {\n        return MA_ERROR;\n    }\n\n    return pDevice->null_device.operationResult;\n}\n\nstatic ma_uint64 ma_device_get_total_run_time_in_frames__null(ma_device* pDevice)\n{\n    ma_uint32 internalSampleRate;\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        internalSampleRate = pDevice->capture.internalSampleRate;\n    } else {\n        internalSampleRate = pDevice->playback.internalSampleRate;\n    }\n\n    return (ma_uint64)((pDevice->null_device.priorRunTime + ma_timer_get_time_in_seconds(&pDevice->null_device.timer)) * internalSampleRate);\n}\n\nstatic ma_result ma_context_enumerate_devices__null(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_bool32 cbResult = MA_TRUE;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(callback != NULL);\n\n    /* Playback. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        MA_ZERO_OBJECT(&deviceInfo);\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), \"NULL Playback Device\", (size_t)-1);\n        deviceInfo.isDefault = MA_TRUE; /* Only one playback and capture device for the null backend, so might as well mark as default. */\n        cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n    }\n\n    /* Capture. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        MA_ZERO_OBJECT(&deviceInfo);\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), \"NULL Capture Device\", (size_t)-1);\n        deviceInfo.isDefault = MA_TRUE; /* Only one playback and capture device for the null backend, so might as well mark as default. */\n        cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n    }\n\n    (void)cbResult; /* Silence a static analysis warning. */\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_get_device_info__null(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    MA_ASSERT(pContext != NULL);\n\n    if (pDeviceID != NULL && pDeviceID->nullbackend != 0) {\n        return MA_NO_DEVICE;   /* Don't know the device. */\n    }\n\n    /* Name / Description */\n    if (deviceType == ma_device_type_playback) {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), \"NULL Playback Device\", (size_t)-1);\n    } else {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), \"NULL Capture Device\", (size_t)-1);\n    }\n\n    pDeviceInfo->isDefault = MA_TRUE;   /* Only one playback and capture device for the null backend, so might as well mark as default. */\n\n    /* Support everything on the null backend. */\n    pDeviceInfo->nativeDataFormats[0].format     = ma_format_unknown;\n    pDeviceInfo->nativeDataFormats[0].channels   = 0;\n    pDeviceInfo->nativeDataFormats[0].sampleRate = 0;\n    pDeviceInfo->nativeDataFormats[0].flags      = 0;\n    pDeviceInfo->nativeDataFormatCount = 1;\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_device_uninit__null(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    /* Keep it clean and wait for the device thread to finish before returning. */\n    ma_device_do_operation__null(pDevice, MA_DEVICE_OP_KILL__NULL);\n\n    /* Wait for the thread to finish before continuing. */\n    ma_thread_wait(&pDevice->null_device.deviceThread);\n\n    /* At this point the loop in the device thread is as good as terminated so we can uninitialize our events. */\n    ma_semaphore_uninit(&pDevice->null_device.operationSemaphore);\n    ma_event_uninit(&pDevice->null_device.operationCompletionEvent);\n    ma_event_uninit(&pDevice->null_device.operationEvent);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_init__null(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n    ma_result result;\n\n    MA_ASSERT(pDevice != NULL);\n\n    MA_ZERO_OBJECT(&pDevice->null_device);\n\n    if (pConfig->deviceType == ma_device_type_loopback) {\n        return MA_DEVICE_TYPE_NOT_SUPPORTED;\n    }\n\n    /* The null backend supports everything exactly as we specify it. */\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        pDescriptorCapture->format     = (pDescriptorCapture->format     != ma_format_unknown) ? pDescriptorCapture->format     : MA_DEFAULT_FORMAT;\n        pDescriptorCapture->channels   = (pDescriptorCapture->channels   != 0)                 ? pDescriptorCapture->channels   : MA_DEFAULT_CHANNELS;\n        pDescriptorCapture->sampleRate = (pDescriptorCapture->sampleRate != 0)                 ? pDescriptorCapture->sampleRate : MA_DEFAULT_SAMPLE_RATE;\n\n        if (pDescriptorCapture->channelMap[0] == MA_CHANNEL_NONE) {\n            ma_channel_map_init_standard(ma_standard_channel_map_default, pDescriptorCapture->channelMap, ma_countof(pDescriptorCapture->channelMap), pDescriptorCapture->channels);\n        }\n\n        pDescriptorCapture->periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptorCapture, pDescriptorCapture->sampleRate, pConfig->performanceProfile);\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        pDescriptorPlayback->format     = (pDescriptorPlayback->format     != ma_format_unknown) ? pDescriptorPlayback->format     : MA_DEFAULT_FORMAT;\n        pDescriptorPlayback->channels   = (pDescriptorPlayback->channels   != 0)                 ? pDescriptorPlayback->channels   : MA_DEFAULT_CHANNELS;\n        pDescriptorPlayback->sampleRate = (pDescriptorPlayback->sampleRate != 0)                 ? pDescriptorPlayback->sampleRate : MA_DEFAULT_SAMPLE_RATE;\n\n        if (pDescriptorPlayback->channelMap[0] == MA_CHANNEL_NONE) {\n            ma_channel_map_init_standard(ma_standard_channel_map_default, pDescriptorPlayback->channelMap, ma_countof(pDescriptorCapture->channelMap), pDescriptorPlayback->channels);\n        }\n\n        pDescriptorPlayback->periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptorPlayback, pDescriptorPlayback->sampleRate, pConfig->performanceProfile);\n    }\n\n    /*\n    In order to get timing right, we need to create a thread that does nothing but keeps track of the timer. This timer is started when the\n    first period is \"written\" to it, and then stopped in ma_device_stop__null().\n    */\n    result = ma_event_init(&pDevice->null_device.operationEvent);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = ma_event_init(&pDevice->null_device.operationCompletionEvent);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = ma_semaphore_init(1, &pDevice->null_device.operationSemaphore);    /* <-- It's important that the initial value is set to 1. */\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = ma_thread_create(&pDevice->null_device.deviceThread, pDevice->pContext->threadPriority, 0, ma_device_thread__null, pDevice, &pDevice->pContext->allocationCallbacks);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_start__null(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    ma_device_do_operation__null(pDevice, MA_DEVICE_OP_START__NULL);\n\n    ma_atomic_bool32_set(&pDevice->null_device.isStarted, MA_TRUE);\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop__null(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    ma_device_do_operation__null(pDevice, MA_DEVICE_OP_SUSPEND__NULL);\n\n    ma_atomic_bool32_set(&pDevice->null_device.isStarted, MA_FALSE);\n    return MA_SUCCESS;\n}\n\nstatic ma_bool32 ma_device_is_started__null(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    return ma_atomic_bool32_get(&pDevice->null_device.isStarted);\n}\n\nstatic ma_result ma_device_write__null(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint32 totalPCMFramesProcessed;\n    ma_bool32 wasStartedOnEntry;\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = 0;\n    }\n\n    wasStartedOnEntry = ma_device_is_started__null(pDevice);\n\n    /* Keep going until everything has been read. */\n    totalPCMFramesProcessed = 0;\n    while (totalPCMFramesProcessed < frameCount) {\n        ma_uint64 targetFrame;\n\n        /* If there are any frames remaining in the current period, consume those first. */\n        if (pDevice->null_device.currentPeriodFramesRemainingPlayback > 0) {\n            ma_uint32 framesRemaining = (frameCount - totalPCMFramesProcessed);\n            ma_uint32 framesToProcess = pDevice->null_device.currentPeriodFramesRemainingPlayback;\n            if (framesToProcess > framesRemaining) {\n                framesToProcess = framesRemaining;\n            }\n\n            /* We don't actually do anything with pPCMFrames, so just mark it as unused to prevent a warning. */\n            (void)pPCMFrames;\n\n            pDevice->null_device.currentPeriodFramesRemainingPlayback -= framesToProcess;\n            totalPCMFramesProcessed += framesToProcess;\n        }\n\n        /* If we've consumed the current period we'll need to mark it as such an ensure the device is started if it's not already. */\n        if (pDevice->null_device.currentPeriodFramesRemainingPlayback == 0) {\n            pDevice->null_device.currentPeriodFramesRemainingPlayback = 0;\n\n            if (!ma_device_is_started__null(pDevice) && !wasStartedOnEntry) {\n                result = ma_device_start__null(pDevice);\n                if (result != MA_SUCCESS) {\n                    break;\n                }\n            }\n        }\n\n        /* If we've consumed the whole buffer we can return now. */\n        MA_ASSERT(totalPCMFramesProcessed <= frameCount);\n        if (totalPCMFramesProcessed == frameCount) {\n            break;\n        }\n\n        /* Getting here means we've still got more frames to consume, we but need to wait for it to become available. */\n        targetFrame = pDevice->null_device.lastProcessedFramePlayback;\n        for (;;) {\n            ma_uint64 currentFrame;\n\n            /* Stop waiting if the device has been stopped. */\n            if (!ma_device_is_started__null(pDevice)) {\n                break;\n            }\n\n            currentFrame = ma_device_get_total_run_time_in_frames__null(pDevice);\n            if (currentFrame >= targetFrame) {\n                break;\n            }\n\n            /* Getting here means we haven't yet reached the target sample, so continue waiting. */\n            ma_sleep(10);\n        }\n\n        pDevice->null_device.lastProcessedFramePlayback          += pDevice->playback.internalPeriodSizeInFrames;\n        pDevice->null_device.currentPeriodFramesRemainingPlayback = pDevice->playback.internalPeriodSizeInFrames;\n    }\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = totalPCMFramesProcessed;\n    }\n\n    return result;\n}\n\nstatic ma_result ma_device_read__null(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesRead)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint32 totalPCMFramesProcessed;\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    /* Keep going until everything has been read. */\n    totalPCMFramesProcessed = 0;\n    while (totalPCMFramesProcessed < frameCount) {\n        ma_uint64 targetFrame;\n\n        /* If there are any frames remaining in the current period, consume those first. */\n        if (pDevice->null_device.currentPeriodFramesRemainingCapture > 0) {\n            ma_uint32 bpf = ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n            ma_uint32 framesRemaining = (frameCount - totalPCMFramesProcessed);\n            ma_uint32 framesToProcess = pDevice->null_device.currentPeriodFramesRemainingCapture;\n            if (framesToProcess > framesRemaining) {\n                framesToProcess = framesRemaining;\n            }\n\n            /* We need to ensure the output buffer is zeroed. */\n            MA_ZERO_MEMORY(ma_offset_ptr(pPCMFrames, totalPCMFramesProcessed*bpf), framesToProcess*bpf);\n\n            pDevice->null_device.currentPeriodFramesRemainingCapture -= framesToProcess;\n            totalPCMFramesProcessed += framesToProcess;\n        }\n\n        /* If we've consumed the current period we'll need to mark it as such an ensure the device is started if it's not already. */\n        if (pDevice->null_device.currentPeriodFramesRemainingCapture == 0) {\n            pDevice->null_device.currentPeriodFramesRemainingCapture = 0;\n        }\n\n        /* If we've consumed the whole buffer we can return now. */\n        MA_ASSERT(totalPCMFramesProcessed <= frameCount);\n        if (totalPCMFramesProcessed == frameCount) {\n            break;\n        }\n\n        /* Getting here means we've still got more frames to consume, we but need to wait for it to become available. */\n        targetFrame = pDevice->null_device.lastProcessedFrameCapture + pDevice->capture.internalPeriodSizeInFrames;\n        for (;;) {\n            ma_uint64 currentFrame;\n\n            /* Stop waiting if the device has been stopped. */\n            if (!ma_device_is_started__null(pDevice)) {\n                break;\n            }\n\n            currentFrame = ma_device_get_total_run_time_in_frames__null(pDevice);\n            if (currentFrame >= targetFrame) {\n                break;\n            }\n\n            /* Getting here means we haven't yet reached the target sample, so continue waiting. */\n            ma_sleep(10);\n        }\n\n        pDevice->null_device.lastProcessedFrameCapture          += pDevice->capture.internalPeriodSizeInFrames;\n        pDevice->null_device.currentPeriodFramesRemainingCapture = pDevice->capture.internalPeriodSizeInFrames;\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = totalPCMFramesProcessed;\n    }\n\n    return result;\n}\n\nstatic ma_result ma_context_uninit__null(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_null);\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init__null(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n    MA_ASSERT(pContext != NULL);\n\n    (void)pConfig;\n    (void)pContext;\n\n    pCallbacks->onContextInit             = ma_context_init__null;\n    pCallbacks->onContextUninit           = ma_context_uninit__null;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__null;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__null;\n    pCallbacks->onDeviceInit              = ma_device_init__null;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__null;\n    pCallbacks->onDeviceStart             = ma_device_start__null;\n    pCallbacks->onDeviceStop              = ma_device_stop__null;\n    pCallbacks->onDeviceRead              = ma_device_read__null;\n    pCallbacks->onDeviceWrite             = ma_device_write__null;\n    pCallbacks->onDeviceDataLoop          = NULL;   /* Our backend is asynchronous with a blocking read-write API which means we can get miniaudio to deal with the audio thread. */\n\n    /* The null backend always works. */\n    return MA_SUCCESS;\n}\n#endif\n\n\n\n/*******************************************************************************\n\nWIN32 COMMON\n\n*******************************************************************************/\n#if defined(MA_WIN32)\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    #define ma_CoInitializeEx(pContext, pvReserved, dwCoInit)                          ((pContext->win32.CoInitializeEx) ? ((MA_PFN_CoInitializeEx)pContext->win32.CoInitializeEx)(pvReserved, dwCoInit) : ((MA_PFN_CoInitialize)pContext->win32.CoInitialize)(pvReserved))\n    #define ma_CoUninitialize(pContext)                                                ((MA_PFN_CoUninitialize)pContext->win32.CoUninitialize)()\n    #define ma_CoCreateInstance(pContext, rclsid, pUnkOuter, dwClsContext, riid, ppv)  ((MA_PFN_CoCreateInstance)pContext->win32.CoCreateInstance)(rclsid, pUnkOuter, dwClsContext, riid, ppv)\n    #define ma_CoTaskMemFree(pContext, pv)                                             ((MA_PFN_CoTaskMemFree)pContext->win32.CoTaskMemFree)(pv)\n    #define ma_PropVariantClear(pContext, pvar)                                        ((MA_PFN_PropVariantClear)pContext->win32.PropVariantClear)(pvar)\n#else\n    #define ma_CoInitializeEx(pContext, pvReserved, dwCoInit)                          CoInitializeEx(pvReserved, dwCoInit)\n    #define ma_CoUninitialize(pContext)                                                CoUninitialize()\n    #define ma_CoCreateInstance(pContext, rclsid, pUnkOuter, dwClsContext, riid, ppv)  CoCreateInstance(rclsid, pUnkOuter, dwClsContext, riid, ppv)\n    #define ma_CoTaskMemFree(pContext, pv)                                             CoTaskMemFree(pv)\n    #define ma_PropVariantClear(pContext, pvar)                                        PropVariantClear(pvar)\n#endif\n\n#if !defined(MAXULONG_PTR) && !defined(__WATCOMC__)\ntypedef size_t DWORD_PTR;\n#endif\n\n#if !defined(WAVE_FORMAT_1M08)\n#define WAVE_FORMAT_1M08    0x00000001\n#define WAVE_FORMAT_1S08    0x00000002\n#define WAVE_FORMAT_1M16    0x00000004\n#define WAVE_FORMAT_1S16    0x00000008\n#define WAVE_FORMAT_2M08    0x00000010\n#define WAVE_FORMAT_2S08    0x00000020\n#define WAVE_FORMAT_2M16    0x00000040\n#define WAVE_FORMAT_2S16    0x00000080\n#define WAVE_FORMAT_4M08    0x00000100\n#define WAVE_FORMAT_4S08    0x00000200\n#define WAVE_FORMAT_4M16    0x00000400\n#define WAVE_FORMAT_4S16    0x00000800\n#endif\n\n#if !defined(WAVE_FORMAT_44M08)\n#define WAVE_FORMAT_44M08   0x00000100\n#define WAVE_FORMAT_44S08   0x00000200\n#define WAVE_FORMAT_44M16   0x00000400\n#define WAVE_FORMAT_44S16   0x00000800\n#define WAVE_FORMAT_48M08   0x00001000\n#define WAVE_FORMAT_48S08   0x00002000\n#define WAVE_FORMAT_48M16   0x00004000\n#define WAVE_FORMAT_48S16   0x00008000\n#define WAVE_FORMAT_96M08   0x00010000\n#define WAVE_FORMAT_96S08   0x00020000\n#define WAVE_FORMAT_96M16   0x00040000\n#define WAVE_FORMAT_96S16   0x00080000\n#endif\n\n#ifndef SPEAKER_FRONT_LEFT\n#define SPEAKER_FRONT_LEFT            0x1\n#define SPEAKER_FRONT_RIGHT           0x2\n#define SPEAKER_FRONT_CENTER          0x4\n#define SPEAKER_LOW_FREQUENCY         0x8\n#define SPEAKER_BACK_LEFT             0x10\n#define SPEAKER_BACK_RIGHT            0x20\n#define SPEAKER_FRONT_LEFT_OF_CENTER  0x40\n#define SPEAKER_FRONT_RIGHT_OF_CENTER 0x80\n#define SPEAKER_BACK_CENTER           0x100\n#define SPEAKER_SIDE_LEFT             0x200\n#define SPEAKER_SIDE_RIGHT            0x400\n#define SPEAKER_TOP_CENTER            0x800\n#define SPEAKER_TOP_FRONT_LEFT        0x1000\n#define SPEAKER_TOP_FRONT_CENTER      0x2000\n#define SPEAKER_TOP_FRONT_RIGHT       0x4000\n#define SPEAKER_TOP_BACK_LEFT         0x8000\n#define SPEAKER_TOP_BACK_CENTER       0x10000\n#define SPEAKER_TOP_BACK_RIGHT        0x20000\n#endif\n\n/*\nImplement our own version of MA_WAVEFORMATEXTENSIBLE so we can avoid a header. Be careful with this\nbecause MA_WAVEFORMATEX has an extra two bytes over standard WAVEFORMATEX due to padding. The\nstandard version uses tight packing, but for compiler compatibility we're not doing that with ours.\n*/\ntypedef struct\n{\n    WORD wFormatTag;\n    WORD nChannels;\n    DWORD nSamplesPerSec;\n    DWORD nAvgBytesPerSec;\n    WORD nBlockAlign;\n    WORD wBitsPerSample;\n    WORD cbSize;\n} MA_WAVEFORMATEX;\n\ntypedef struct\n{\n    WORD wFormatTag;\n    WORD nChannels;\n    DWORD nSamplesPerSec;\n    DWORD nAvgBytesPerSec;\n    WORD nBlockAlign;\n    WORD wBitsPerSample;\n    WORD cbSize;\n    union\n    {\n        WORD wValidBitsPerSample;\n        WORD wSamplesPerBlock;\n        WORD wReserved;\n    } Samples;\n    DWORD dwChannelMask;\n    GUID SubFormat;\n} MA_WAVEFORMATEXTENSIBLE;\n\n\n\n#ifndef WAVE_FORMAT_EXTENSIBLE\n#define WAVE_FORMAT_EXTENSIBLE  0xFFFE\n#endif\n\n#ifndef WAVE_FORMAT_PCM\n#define WAVE_FORMAT_PCM         1\n#endif\n\n#ifndef WAVE_FORMAT_IEEE_FLOAT\n#define WAVE_FORMAT_IEEE_FLOAT  0x0003\n#endif\n\n/* Converts an individual Win32-style channel identifier (SPEAKER_FRONT_LEFT, etc.) to miniaudio. */\nstatic ma_uint8 ma_channel_id_to_ma__win32(DWORD id)\n{\n    switch (id)\n    {\n        case SPEAKER_FRONT_LEFT:            return MA_CHANNEL_FRONT_LEFT;\n        case SPEAKER_FRONT_RIGHT:           return MA_CHANNEL_FRONT_RIGHT;\n        case SPEAKER_FRONT_CENTER:          return MA_CHANNEL_FRONT_CENTER;\n        case SPEAKER_LOW_FREQUENCY:         return MA_CHANNEL_LFE;\n        case SPEAKER_BACK_LEFT:             return MA_CHANNEL_BACK_LEFT;\n        case SPEAKER_BACK_RIGHT:            return MA_CHANNEL_BACK_RIGHT;\n        case SPEAKER_FRONT_LEFT_OF_CENTER:  return MA_CHANNEL_FRONT_LEFT_CENTER;\n        case SPEAKER_FRONT_RIGHT_OF_CENTER: return MA_CHANNEL_FRONT_RIGHT_CENTER;\n        case SPEAKER_BACK_CENTER:           return MA_CHANNEL_BACK_CENTER;\n        case SPEAKER_SIDE_LEFT:             return MA_CHANNEL_SIDE_LEFT;\n        case SPEAKER_SIDE_RIGHT:            return MA_CHANNEL_SIDE_RIGHT;\n        case SPEAKER_TOP_CENTER:            return MA_CHANNEL_TOP_CENTER;\n        case SPEAKER_TOP_FRONT_LEFT:        return MA_CHANNEL_TOP_FRONT_LEFT;\n        case SPEAKER_TOP_FRONT_CENTER:      return MA_CHANNEL_TOP_FRONT_CENTER;\n        case SPEAKER_TOP_FRONT_RIGHT:       return MA_CHANNEL_TOP_FRONT_RIGHT;\n        case SPEAKER_TOP_BACK_LEFT:         return MA_CHANNEL_TOP_BACK_LEFT;\n        case SPEAKER_TOP_BACK_CENTER:       return MA_CHANNEL_TOP_BACK_CENTER;\n        case SPEAKER_TOP_BACK_RIGHT:        return MA_CHANNEL_TOP_BACK_RIGHT;\n        default: return 0;\n    }\n}\n\n/* Converts an individual miniaudio channel identifier (MA_CHANNEL_FRONT_LEFT, etc.) to Win32-style. */\nstatic DWORD ma_channel_id_to_win32(DWORD id)\n{\n    switch (id)\n    {\n        case MA_CHANNEL_MONO:               return SPEAKER_FRONT_CENTER;\n        case MA_CHANNEL_FRONT_LEFT:         return SPEAKER_FRONT_LEFT;\n        case MA_CHANNEL_FRONT_RIGHT:        return SPEAKER_FRONT_RIGHT;\n        case MA_CHANNEL_FRONT_CENTER:       return SPEAKER_FRONT_CENTER;\n        case MA_CHANNEL_LFE:                return SPEAKER_LOW_FREQUENCY;\n        case MA_CHANNEL_BACK_LEFT:          return SPEAKER_BACK_LEFT;\n        case MA_CHANNEL_BACK_RIGHT:         return SPEAKER_BACK_RIGHT;\n        case MA_CHANNEL_FRONT_LEFT_CENTER:  return SPEAKER_FRONT_LEFT_OF_CENTER;\n        case MA_CHANNEL_FRONT_RIGHT_CENTER: return SPEAKER_FRONT_RIGHT_OF_CENTER;\n        case MA_CHANNEL_BACK_CENTER:        return SPEAKER_BACK_CENTER;\n        case MA_CHANNEL_SIDE_LEFT:          return SPEAKER_SIDE_LEFT;\n        case MA_CHANNEL_SIDE_RIGHT:         return SPEAKER_SIDE_RIGHT;\n        case MA_CHANNEL_TOP_CENTER:         return SPEAKER_TOP_CENTER;\n        case MA_CHANNEL_TOP_FRONT_LEFT:     return SPEAKER_TOP_FRONT_LEFT;\n        case MA_CHANNEL_TOP_FRONT_CENTER:   return SPEAKER_TOP_FRONT_CENTER;\n        case MA_CHANNEL_TOP_FRONT_RIGHT:    return SPEAKER_TOP_FRONT_RIGHT;\n        case MA_CHANNEL_TOP_BACK_LEFT:      return SPEAKER_TOP_BACK_LEFT;\n        case MA_CHANNEL_TOP_BACK_CENTER:    return SPEAKER_TOP_BACK_CENTER;\n        case MA_CHANNEL_TOP_BACK_RIGHT:     return SPEAKER_TOP_BACK_RIGHT;\n        default: return 0;\n    }\n}\n\n/* Converts a channel mapping to a Win32-style channel mask. */\nstatic DWORD ma_channel_map_to_channel_mask__win32(const ma_channel* pChannelMap, ma_uint32 channels)\n{\n    DWORD dwChannelMask = 0;\n    ma_uint32 iChannel;\n\n    for (iChannel = 0; iChannel < channels; ++iChannel) {\n        dwChannelMask |= ma_channel_id_to_win32(pChannelMap[iChannel]);\n    }\n\n    return dwChannelMask;\n}\n\n/* Converts a Win32-style channel mask to a miniaudio channel map. */\nstatic void ma_channel_mask_to_channel_map__win32(DWORD dwChannelMask, ma_uint32 channels, ma_channel* pChannelMap)\n{\n    /* If the channel mask is set to 0, just assume a default Win32 channel map. */\n    if (dwChannelMask == 0) {\n        ma_channel_map_init_standard(ma_standard_channel_map_microsoft, pChannelMap, channels, channels);\n    } else {\n        if (channels == 1 && (dwChannelMask & SPEAKER_FRONT_CENTER) != 0) {\n            pChannelMap[0] = MA_CHANNEL_MONO;\n        } else {\n            /* Just iterate over each bit. */\n            ma_uint32 iChannel = 0;\n            ma_uint32 iBit;\n\n            for (iBit = 0; iBit < 32 && iChannel < channels; ++iBit) {\n                DWORD bitValue = (dwChannelMask & (1UL << iBit));\n                if (bitValue != 0) {\n                    /* The bit is set. */\n                    pChannelMap[iChannel] = ma_channel_id_to_ma__win32(bitValue);\n                    iChannel += 1;\n                }\n            }\n        }\n    }\n}\n\n#ifdef __cplusplus\nstatic ma_bool32 ma_is_guid_equal(const void* a, const void* b)\n{\n    return IsEqualGUID(*(const GUID*)a, *(const GUID*)b);\n}\n#else\n#define ma_is_guid_equal(a, b) IsEqualGUID((const GUID*)a, (const GUID*)b)\n#endif\n\nstatic MA_INLINE ma_bool32 ma_is_guid_null(const void* guid)\n{\n    static GUID nullguid = {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}};\n    return ma_is_guid_equal(guid, &nullguid);\n}\n\nstatic ma_format ma_format_from_WAVEFORMATEX(const MA_WAVEFORMATEX* pWF)\n{\n    MA_ASSERT(pWF != NULL);\n\n    if (pWF->wFormatTag == WAVE_FORMAT_EXTENSIBLE) {\n        const MA_WAVEFORMATEXTENSIBLE* pWFEX = (const MA_WAVEFORMATEXTENSIBLE*)pWF;\n        if (ma_is_guid_equal(&pWFEX->SubFormat, &MA_GUID_KSDATAFORMAT_SUBTYPE_PCM)) {\n            if (pWFEX->Samples.wValidBitsPerSample == 32) {\n                return ma_format_s32;\n            }\n            if (pWFEX->Samples.wValidBitsPerSample == 24) {\n                if (pWFEX->wBitsPerSample == 32) {\n                    return ma_format_s32;\n                }\n                if (pWFEX->wBitsPerSample == 24) {\n                    return ma_format_s24;\n                }\n            }\n            if (pWFEX->Samples.wValidBitsPerSample == 16) {\n                return ma_format_s16;\n            }\n            if (pWFEX->Samples.wValidBitsPerSample == 8) {\n                return ma_format_u8;\n            }\n        }\n        if (ma_is_guid_equal(&pWFEX->SubFormat, &MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) {\n            if (pWFEX->Samples.wValidBitsPerSample == 32) {\n                return ma_format_f32;\n            }\n            /*\n            if (pWFEX->Samples.wValidBitsPerSample == 64) {\n                return ma_format_f64;\n            }\n            */\n        }\n    } else {\n        if (pWF->wFormatTag == WAVE_FORMAT_PCM) {\n            if (pWF->wBitsPerSample == 32) {\n                return ma_format_s32;\n            }\n            if (pWF->wBitsPerSample == 24) {\n                return ma_format_s24;\n            }\n            if (pWF->wBitsPerSample == 16) {\n                return ma_format_s16;\n            }\n            if (pWF->wBitsPerSample == 8) {\n                return ma_format_u8;\n            }\n        }\n        if (pWF->wFormatTag == WAVE_FORMAT_IEEE_FLOAT) {\n            if (pWF->wBitsPerSample == 32) {\n                return ma_format_f32;\n            }\n            if (pWF->wBitsPerSample == 64) {\n                /*return ma_format_f64;*/\n            }\n        }\n    }\n\n    return ma_format_unknown;\n}\n#endif\n\n\n/*******************************************************************************\n\nWASAPI Backend\n\n*******************************************************************************/\n#ifdef MA_HAS_WASAPI\n#if 0\n#if defined(_MSC_VER)\n    #pragma warning(push)\n    #pragma warning(disable:4091)   /* 'typedef ': ignored on left of '' when no variable is declared */\n#endif\n#include <audioclient.h>\n#include <mmdeviceapi.h>\n#if defined(_MSC_VER)\n    #pragma warning(pop)\n#endif\n#endif  /* 0 */\n\nstatic ma_result ma_device_reroute__wasapi(ma_device* pDevice, ma_device_type deviceType);\n\n/* Some compilers don't define VerifyVersionInfoW. Need to write this ourselves. */\n#define MA_WIN32_WINNT_VISTA    0x0600\n#define MA_VER_MINORVERSION     0x01\n#define MA_VER_MAJORVERSION     0x02\n#define MA_VER_SERVICEPACKMAJOR 0x20\n#define MA_VER_GREATER_EQUAL    0x03\n\ntypedef struct  {\n    DWORD dwOSVersionInfoSize;\n    DWORD dwMajorVersion;\n    DWORD dwMinorVersion;\n    DWORD dwBuildNumber;\n    DWORD dwPlatformId;\n    WCHAR szCSDVersion[128];\n    WORD  wServicePackMajor;\n    WORD  wServicePackMinor;\n    WORD  wSuiteMask;\n    BYTE  wProductType;\n    BYTE  wReserved;\n} ma_OSVERSIONINFOEXW;\n\ntypedef BOOL      (WINAPI * ma_PFNVerifyVersionInfoW) (ma_OSVERSIONINFOEXW* lpVersionInfo, DWORD dwTypeMask, DWORDLONG dwlConditionMask);\ntypedef ULONGLONG (WINAPI * ma_PFNVerSetConditionMask)(ULONGLONG dwlConditionMask, DWORD dwTypeBitMask, BYTE dwConditionMask);\n\n\n#ifndef PROPERTYKEY_DEFINED\n#define PROPERTYKEY_DEFINED\n#ifndef __WATCOMC__\ntypedef struct\n{\n    GUID fmtid;\n    DWORD pid;\n} PROPERTYKEY;\n#endif\n#endif\n\n/* Some compilers don't define PropVariantInit(). We just do this ourselves since it's just a memset(). */\nstatic MA_INLINE void ma_PropVariantInit(MA_PROPVARIANT* pProp)\n{\n    MA_ZERO_OBJECT(pProp);\n}\n\n\nstatic const PROPERTYKEY MA_PKEY_Device_FriendlyName             = {{0xA45C254E, 0xDF1C, 0x4EFD, {0x80, 0x20, 0x67, 0xD1, 0x46, 0xA8, 0x50, 0xE0}}, 14};\nstatic const PROPERTYKEY MA_PKEY_AudioEngine_DeviceFormat        = {{0xF19F064D, 0x82C,  0x4E27, {0xBC, 0x73, 0x68, 0x82, 0xA1, 0xBB, 0x8E, 0x4C}},  0};\n\nstatic const IID MA_IID_IUnknown                                 = {0x00000000, 0x0000, 0x0000, {0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}; /* 00000000-0000-0000-C000-000000000046 */\n#if !defined(MA_WIN32_DESKTOP) && !defined(MA_WIN32_GDK)\nstatic const IID MA_IID_IAgileObject                             = {0x94EA2B94, 0xE9CC, 0x49E0, {0xC0, 0xFF, 0xEE, 0x64, 0xCA, 0x8F, 0x5B, 0x90}}; /* 94EA2B94-E9CC-49E0-C0FF-EE64CA8F5B90 */\n#endif\n\nstatic const IID MA_IID_IAudioClient                             = {0x1CB9AD4C, 0xDBFA, 0x4C32, {0xB1, 0x78, 0xC2, 0xF5, 0x68, 0xA7, 0x03, 0xB2}}; /* 1CB9AD4C-DBFA-4C32-B178-C2F568A703B2 = __uuidof(IAudioClient) */\nstatic const IID MA_IID_IAudioClient2                            = {0x726778CD, 0xF60A, 0x4EDA, {0x82, 0xDE, 0xE4, 0x76, 0x10, 0xCD, 0x78, 0xAA}}; /* 726778CD-F60A-4EDA-82DE-E47610CD78AA = __uuidof(IAudioClient2) */\nstatic const IID MA_IID_IAudioClient3                            = {0x7ED4EE07, 0x8E67, 0x4CD4, {0x8C, 0x1A, 0x2B, 0x7A, 0x59, 0x87, 0xAD, 0x42}}; /* 7ED4EE07-8E67-4CD4-8C1A-2B7A5987AD42 = __uuidof(IAudioClient3) */\nstatic const IID MA_IID_IAudioRenderClient                       = {0xF294ACFC, 0x3146, 0x4483, {0xA7, 0xBF, 0xAD, 0xDC, 0xA7, 0xC2, 0x60, 0xE2}}; /* F294ACFC-3146-4483-A7BF-ADDCA7C260E2 = __uuidof(IAudioRenderClient) */\nstatic const IID MA_IID_IAudioCaptureClient                      = {0xC8ADBD64, 0xE71E, 0x48A0, {0xA4, 0xDE, 0x18, 0x5C, 0x39, 0x5C, 0xD3, 0x17}}; /* C8ADBD64-E71E-48A0-A4DE-185C395CD317 = __uuidof(IAudioCaptureClient) */\nstatic const IID MA_IID_IMMNotificationClient                    = {0x7991EEC9, 0x7E89, 0x4D85, {0x83, 0x90, 0x6C, 0x70, 0x3C, 0xEC, 0x60, 0xC0}}; /* 7991EEC9-7E89-4D85-8390-6C703CEC60C0 = __uuidof(IMMNotificationClient) */\n#if !defined(MA_WIN32_DESKTOP) && !defined(MA_WIN32_GDK)\nstatic const IID MA_IID_DEVINTERFACE_AUDIO_RENDER                = {0xE6327CAD, 0xDCEC, 0x4949, {0xAE, 0x8A, 0x99, 0x1E, 0x97, 0x6A, 0x79, 0xD2}}; /* E6327CAD-DCEC-4949-AE8A-991E976A79D2 */\nstatic const IID MA_IID_DEVINTERFACE_AUDIO_CAPTURE               = {0x2EEF81BE, 0x33FA, 0x4800, {0x96, 0x70, 0x1C, 0xD4, 0x74, 0x97, 0x2C, 0x3F}}; /* 2EEF81BE-33FA-4800-9670-1CD474972C3F */\nstatic const IID MA_IID_IActivateAudioInterfaceCompletionHandler = {0x41D949AB, 0x9862, 0x444A, {0x80, 0xF6, 0xC2, 0x61, 0x33, 0x4D, 0xA5, 0xEB}}; /* 41D949AB-9862-444A-80F6-C261334DA5EB */\n#endif\n\nstatic const IID MA_CLSID_MMDeviceEnumerator                     = {0xBCDE0395, 0xE52F, 0x467C, {0x8E, 0x3D, 0xC4, 0x57, 0x92, 0x91, 0x69, 0x2E}}; /* BCDE0395-E52F-467C-8E3D-C4579291692E = __uuidof(MMDeviceEnumerator) */\nstatic const IID MA_IID_IMMDeviceEnumerator                      = {0xA95664D2, 0x9614, 0x4F35, {0xA7, 0x46, 0xDE, 0x8D, 0xB6, 0x36, 0x17, 0xE6}}; /* A95664D2-9614-4F35-A746-DE8DB63617E6 = __uuidof(IMMDeviceEnumerator) */\n\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n#define MA_MM_DEVICE_STATE_ACTIVE                          1\n#define MA_MM_DEVICE_STATE_DISABLED                        2\n#define MA_MM_DEVICE_STATE_NOTPRESENT                      4\n#define MA_MM_DEVICE_STATE_UNPLUGGED                       8\n\ntypedef struct ma_IMMDeviceEnumerator                      ma_IMMDeviceEnumerator;\ntypedef struct ma_IMMDeviceCollection                      ma_IMMDeviceCollection;\ntypedef struct ma_IMMDevice                                ma_IMMDevice;\n#else\ntypedef struct ma_IActivateAudioInterfaceCompletionHandler ma_IActivateAudioInterfaceCompletionHandler;\ntypedef struct ma_IActivateAudioInterfaceAsyncOperation    ma_IActivateAudioInterfaceAsyncOperation;\n#endif\ntypedef struct ma_IPropertyStore                           ma_IPropertyStore;\ntypedef struct ma_IAudioClient                             ma_IAudioClient;\ntypedef struct ma_IAudioClient2                            ma_IAudioClient2;\ntypedef struct ma_IAudioClient3                            ma_IAudioClient3;\ntypedef struct ma_IAudioRenderClient                       ma_IAudioRenderClient;\ntypedef struct ma_IAudioCaptureClient                      ma_IAudioCaptureClient;\n\ntypedef ma_int64                                           MA_REFERENCE_TIME;\n\n#define MA_AUDCLNT_STREAMFLAGS_CROSSPROCESS                0x00010000\n#define MA_AUDCLNT_STREAMFLAGS_LOOPBACK                    0x00020000\n#define MA_AUDCLNT_STREAMFLAGS_EVENTCALLBACK               0x00040000\n#define MA_AUDCLNT_STREAMFLAGS_NOPERSIST                   0x00080000\n#define MA_AUDCLNT_STREAMFLAGS_RATEADJUST                  0x00100000\n#define MA_AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY         0x08000000\n#define MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM              0x80000000\n#define MA_AUDCLNT_SESSIONFLAGS_EXPIREWHENUNOWNED          0x10000000\n#define MA_AUDCLNT_SESSIONFLAGS_DISPLAY_HIDE               0x20000000\n#define MA_AUDCLNT_SESSIONFLAGS_DISPLAY_HIDEWHENEXPIRED    0x40000000\n\n/* Buffer flags. */\n#define MA_AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY          1\n#define MA_AUDCLNT_BUFFERFLAGS_SILENT                      2\n#define MA_AUDCLNT_BUFFERFLAGS_TIMESTAMP_ERROR             4\n\ntypedef enum\n{\n    ma_eRender  = 0,\n    ma_eCapture = 1,\n    ma_eAll     = 2\n} ma_EDataFlow;\n\ntypedef enum\n{\n    ma_eConsole        = 0,\n    ma_eMultimedia     = 1,\n    ma_eCommunications = 2\n} ma_ERole;\n\ntypedef enum\n{\n    MA_AUDCLNT_SHAREMODE_SHARED,\n    MA_AUDCLNT_SHAREMODE_EXCLUSIVE\n} MA_AUDCLNT_SHAREMODE;\n\ntypedef enum\n{\n    MA_AudioCategory_Other = 0  /* <-- miniaudio is only caring about Other. */\n} MA_AUDIO_STREAM_CATEGORY;\n\ntypedef struct\n{\n    ma_uint32 cbSize;\n    BOOL bIsOffload;\n    MA_AUDIO_STREAM_CATEGORY eCategory;\n} ma_AudioClientProperties;\n\n/* IUnknown */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IUnknown* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IUnknown* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IUnknown* pThis);\n} ma_IUnknownVtbl;\nstruct ma_IUnknown\n{\n    ma_IUnknownVtbl* lpVtbl;\n};\nstatic MA_INLINE HRESULT ma_IUnknown_QueryInterface(ma_IUnknown* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nstatic MA_INLINE ULONG   ma_IUnknown_AddRef(ma_IUnknown* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nstatic MA_INLINE ULONG   ma_IUnknown_Release(ma_IUnknown* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\n\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    /* IMMNotificationClient */\n    typedef struct\n    {\n        /* IUnknown */\n        HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IMMNotificationClient* pThis, const IID* const riid, void** ppObject);\n        ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IMMNotificationClient* pThis);\n        ULONG   (STDMETHODCALLTYPE * Release)       (ma_IMMNotificationClient* pThis);\n\n        /* IMMNotificationClient */\n        HRESULT (STDMETHODCALLTYPE * OnDeviceStateChanged)  (ma_IMMNotificationClient* pThis, const WCHAR* pDeviceID, DWORD dwNewState);\n        HRESULT (STDMETHODCALLTYPE * OnDeviceAdded)         (ma_IMMNotificationClient* pThis, const WCHAR* pDeviceID);\n        HRESULT (STDMETHODCALLTYPE * OnDeviceRemoved)       (ma_IMMNotificationClient* pThis, const WCHAR* pDeviceID);\n        HRESULT (STDMETHODCALLTYPE * OnDefaultDeviceChanged)(ma_IMMNotificationClient* pThis, ma_EDataFlow dataFlow, ma_ERole role, const WCHAR* pDefaultDeviceID);\n        HRESULT (STDMETHODCALLTYPE * OnPropertyValueChanged)(ma_IMMNotificationClient* pThis, const WCHAR* pDeviceID, const PROPERTYKEY key);\n    } ma_IMMNotificationClientVtbl;\n\n    /* IMMDeviceEnumerator */\n    typedef struct\n    {\n        /* IUnknown */\n        HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IMMDeviceEnumerator* pThis, const IID* const riid, void** ppObject);\n        ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IMMDeviceEnumerator* pThis);\n        ULONG   (STDMETHODCALLTYPE * Release)       (ma_IMMDeviceEnumerator* pThis);\n\n        /* IMMDeviceEnumerator */\n        HRESULT (STDMETHODCALLTYPE * EnumAudioEndpoints)                    (ma_IMMDeviceEnumerator* pThis, ma_EDataFlow dataFlow, DWORD dwStateMask, ma_IMMDeviceCollection** ppDevices);\n        HRESULT (STDMETHODCALLTYPE * GetDefaultAudioEndpoint)               (ma_IMMDeviceEnumerator* pThis, ma_EDataFlow dataFlow, ma_ERole role, ma_IMMDevice** ppEndpoint);\n        HRESULT (STDMETHODCALLTYPE * GetDevice)                             (ma_IMMDeviceEnumerator* pThis, const WCHAR* pID, ma_IMMDevice** ppDevice);\n        HRESULT (STDMETHODCALLTYPE * RegisterEndpointNotificationCallback)  (ma_IMMDeviceEnumerator* pThis, ma_IMMNotificationClient* pClient);\n        HRESULT (STDMETHODCALLTYPE * UnregisterEndpointNotificationCallback)(ma_IMMDeviceEnumerator* pThis, ma_IMMNotificationClient* pClient);\n    } ma_IMMDeviceEnumeratorVtbl;\n    struct ma_IMMDeviceEnumerator\n    {\n        ma_IMMDeviceEnumeratorVtbl* lpVtbl;\n    };\n    static MA_INLINE HRESULT ma_IMMDeviceEnumerator_QueryInterface(ma_IMMDeviceEnumerator* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\n    static MA_INLINE ULONG   ma_IMMDeviceEnumerator_AddRef(ma_IMMDeviceEnumerator* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\n    static MA_INLINE ULONG   ma_IMMDeviceEnumerator_Release(ma_IMMDeviceEnumerator* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\n    static MA_INLINE HRESULT ma_IMMDeviceEnumerator_EnumAudioEndpoints(ma_IMMDeviceEnumerator* pThis, ma_EDataFlow dataFlow, DWORD dwStateMask, ma_IMMDeviceCollection** ppDevices) { return pThis->lpVtbl->EnumAudioEndpoints(pThis, dataFlow, dwStateMask, ppDevices); }\n    static MA_INLINE HRESULT ma_IMMDeviceEnumerator_GetDefaultAudioEndpoint(ma_IMMDeviceEnumerator* pThis, ma_EDataFlow dataFlow, ma_ERole role, ma_IMMDevice** ppEndpoint) { return pThis->lpVtbl->GetDefaultAudioEndpoint(pThis, dataFlow, role, ppEndpoint); }\n    static MA_INLINE HRESULT ma_IMMDeviceEnumerator_GetDevice(ma_IMMDeviceEnumerator* pThis, const WCHAR* pID, ma_IMMDevice** ppDevice) { return pThis->lpVtbl->GetDevice(pThis, pID, ppDevice); }\n    static MA_INLINE HRESULT ma_IMMDeviceEnumerator_RegisterEndpointNotificationCallback(ma_IMMDeviceEnumerator* pThis, ma_IMMNotificationClient* pClient) { return pThis->lpVtbl->RegisterEndpointNotificationCallback(pThis, pClient); }\n    static MA_INLINE HRESULT ma_IMMDeviceEnumerator_UnregisterEndpointNotificationCallback(ma_IMMDeviceEnumerator* pThis, ma_IMMNotificationClient* pClient) { return pThis->lpVtbl->UnregisterEndpointNotificationCallback(pThis, pClient); }\n\n\n    /* IMMDeviceCollection */\n    typedef struct\n    {\n        /* IUnknown */\n        HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IMMDeviceCollection* pThis, const IID* const riid, void** ppObject);\n        ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IMMDeviceCollection* pThis);\n        ULONG   (STDMETHODCALLTYPE * Release)       (ma_IMMDeviceCollection* pThis);\n\n        /* IMMDeviceCollection */\n        HRESULT (STDMETHODCALLTYPE * GetCount)(ma_IMMDeviceCollection* pThis, UINT* pDevices);\n        HRESULT (STDMETHODCALLTYPE * Item)    (ma_IMMDeviceCollection* pThis, UINT nDevice, ma_IMMDevice** ppDevice);\n    } ma_IMMDeviceCollectionVtbl;\n    struct ma_IMMDeviceCollection\n    {\n        ma_IMMDeviceCollectionVtbl* lpVtbl;\n    };\n    static MA_INLINE HRESULT ma_IMMDeviceCollection_QueryInterface(ma_IMMDeviceCollection* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\n    static MA_INLINE ULONG   ma_IMMDeviceCollection_AddRef(ma_IMMDeviceCollection* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\n    static MA_INLINE ULONG   ma_IMMDeviceCollection_Release(ma_IMMDeviceCollection* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\n    static MA_INLINE HRESULT ma_IMMDeviceCollection_GetCount(ma_IMMDeviceCollection* pThis, UINT* pDevices)                               { return pThis->lpVtbl->GetCount(pThis, pDevices); }\n    static MA_INLINE HRESULT ma_IMMDeviceCollection_Item(ma_IMMDeviceCollection* pThis, UINT nDevice, ma_IMMDevice** ppDevice)            { return pThis->lpVtbl->Item(pThis, nDevice, ppDevice); }\n\n\n    /* IMMDevice */\n    typedef struct\n    {\n        /* IUnknown */\n        HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IMMDevice* pThis, const IID* const riid, void** ppObject);\n        ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IMMDevice* pThis);\n        ULONG   (STDMETHODCALLTYPE * Release)       (ma_IMMDevice* pThis);\n\n        /* IMMDevice */\n        HRESULT (STDMETHODCALLTYPE * Activate)         (ma_IMMDevice* pThis, const IID* const iid, DWORD dwClsCtx, MA_PROPVARIANT* pActivationParams, void** ppInterface);\n        HRESULT (STDMETHODCALLTYPE * OpenPropertyStore)(ma_IMMDevice* pThis, DWORD stgmAccess, ma_IPropertyStore** ppProperties);\n        HRESULT (STDMETHODCALLTYPE * GetId)            (ma_IMMDevice* pThis, WCHAR** pID);\n        HRESULT (STDMETHODCALLTYPE * GetState)         (ma_IMMDevice* pThis, DWORD *pState);\n    } ma_IMMDeviceVtbl;\n    struct ma_IMMDevice\n    {\n        ma_IMMDeviceVtbl* lpVtbl;\n    };\n    static MA_INLINE HRESULT ma_IMMDevice_QueryInterface(ma_IMMDevice* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\n    static MA_INLINE ULONG   ma_IMMDevice_AddRef(ma_IMMDevice* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\n    static MA_INLINE ULONG   ma_IMMDevice_Release(ma_IMMDevice* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\n    static MA_INLINE HRESULT ma_IMMDevice_Activate(ma_IMMDevice* pThis, const IID* const iid, DWORD dwClsCtx, MA_PROPVARIANT* pActivationParams, void** ppInterface) { return pThis->lpVtbl->Activate(pThis, iid, dwClsCtx, pActivationParams, ppInterface); }\n    static MA_INLINE HRESULT ma_IMMDevice_OpenPropertyStore(ma_IMMDevice* pThis, DWORD stgmAccess, ma_IPropertyStore** ppProperties) { return pThis->lpVtbl->OpenPropertyStore(pThis, stgmAccess, ppProperties); }\n    static MA_INLINE HRESULT ma_IMMDevice_GetId(ma_IMMDevice* pThis, WCHAR** pID)                                     { return pThis->lpVtbl->GetId(pThis, pID); }\n    static MA_INLINE HRESULT ma_IMMDevice_GetState(ma_IMMDevice* pThis, DWORD *pState)                                { return pThis->lpVtbl->GetState(pThis, pState); }\n#else\n    /* IActivateAudioInterfaceAsyncOperation */\n    typedef struct\n    {\n        /* IUnknown */\n        HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IActivateAudioInterfaceAsyncOperation* pThis, const IID* const riid, void** ppObject);\n        ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IActivateAudioInterfaceAsyncOperation* pThis);\n        ULONG   (STDMETHODCALLTYPE * Release)       (ma_IActivateAudioInterfaceAsyncOperation* pThis);\n\n        /* IActivateAudioInterfaceAsyncOperation */\n        HRESULT (STDMETHODCALLTYPE * GetActivateResult)(ma_IActivateAudioInterfaceAsyncOperation* pThis, HRESULT *pActivateResult, ma_IUnknown** ppActivatedInterface);\n    } ma_IActivateAudioInterfaceAsyncOperationVtbl;\n    struct ma_IActivateAudioInterfaceAsyncOperation\n    {\n        ma_IActivateAudioInterfaceAsyncOperationVtbl* lpVtbl;\n    };\n    static MA_INLINE HRESULT ma_IActivateAudioInterfaceAsyncOperation_QueryInterface(ma_IActivateAudioInterfaceAsyncOperation* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\n    static MA_INLINE ULONG   ma_IActivateAudioInterfaceAsyncOperation_AddRef(ma_IActivateAudioInterfaceAsyncOperation* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\n    static MA_INLINE ULONG   ma_IActivateAudioInterfaceAsyncOperation_Release(ma_IActivateAudioInterfaceAsyncOperation* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\n    static MA_INLINE HRESULT ma_IActivateAudioInterfaceAsyncOperation_GetActivateResult(ma_IActivateAudioInterfaceAsyncOperation* pThis, HRESULT *pActivateResult, ma_IUnknown** ppActivatedInterface) { return pThis->lpVtbl->GetActivateResult(pThis, pActivateResult, ppActivatedInterface); }\n#endif\n\n/* IPropertyStore */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IPropertyStore* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IPropertyStore* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IPropertyStore* pThis);\n\n    /* IPropertyStore */\n    HRESULT (STDMETHODCALLTYPE * GetCount)(ma_IPropertyStore* pThis, DWORD* pPropCount);\n    HRESULT (STDMETHODCALLTYPE * GetAt)   (ma_IPropertyStore* pThis, DWORD propIndex, PROPERTYKEY* pPropKey);\n    HRESULT (STDMETHODCALLTYPE * GetValue)(ma_IPropertyStore* pThis, const PROPERTYKEY* const pKey, MA_PROPVARIANT* pPropVar);\n    HRESULT (STDMETHODCALLTYPE * SetValue)(ma_IPropertyStore* pThis, const PROPERTYKEY* const pKey, const MA_PROPVARIANT* const pPropVar);\n    HRESULT (STDMETHODCALLTYPE * Commit)  (ma_IPropertyStore* pThis);\n} ma_IPropertyStoreVtbl;\nstruct ma_IPropertyStore\n{\n    ma_IPropertyStoreVtbl* lpVtbl;\n};\nstatic MA_INLINE HRESULT ma_IPropertyStore_QueryInterface(ma_IPropertyStore* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nstatic MA_INLINE ULONG   ma_IPropertyStore_AddRef(ma_IPropertyStore* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nstatic MA_INLINE ULONG   ma_IPropertyStore_Release(ma_IPropertyStore* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nstatic MA_INLINE HRESULT ma_IPropertyStore_GetCount(ma_IPropertyStore* pThis, DWORD* pPropCount)                            { return pThis->lpVtbl->GetCount(pThis, pPropCount); }\nstatic MA_INLINE HRESULT ma_IPropertyStore_GetAt(ma_IPropertyStore* pThis, DWORD propIndex, PROPERTYKEY* pPropKey)          { return pThis->lpVtbl->GetAt(pThis, propIndex, pPropKey); }\nstatic MA_INLINE HRESULT ma_IPropertyStore_GetValue(ma_IPropertyStore* pThis, const PROPERTYKEY* const pKey, MA_PROPVARIANT* pPropVar) { return pThis->lpVtbl->GetValue(pThis, pKey, pPropVar); }\nstatic MA_INLINE HRESULT ma_IPropertyStore_SetValue(ma_IPropertyStore* pThis, const PROPERTYKEY* const pKey, const MA_PROPVARIANT* const pPropVar) { return pThis->lpVtbl->SetValue(pThis, pKey, pPropVar); }\nstatic MA_INLINE HRESULT ma_IPropertyStore_Commit(ma_IPropertyStore* pThis)                                                 { return pThis->lpVtbl->Commit(pThis); }\n\n\n/* IAudioClient */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioClient* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IAudioClient* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IAudioClient* pThis);\n\n    /* IAudioClient */\n    HRESULT (STDMETHODCALLTYPE * Initialize)       (ma_IAudioClient* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const MA_WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid);\n    HRESULT (STDMETHODCALLTYPE * GetBufferSize)    (ma_IAudioClient* pThis, ma_uint32* pNumBufferFrames);\n    HRESULT (STDMETHODCALLTYPE * GetStreamLatency) (ma_IAudioClient* pThis, MA_REFERENCE_TIME* pLatency);\n    HRESULT (STDMETHODCALLTYPE * GetCurrentPadding)(ma_IAudioClient* pThis, ma_uint32* pNumPaddingFrames);\n    HRESULT (STDMETHODCALLTYPE * IsFormatSupported)(ma_IAudioClient* pThis, MA_AUDCLNT_SHAREMODE shareMode, const MA_WAVEFORMATEX* pFormat, MA_WAVEFORMATEX** ppClosestMatch);\n    HRESULT (STDMETHODCALLTYPE * GetMixFormat)     (ma_IAudioClient* pThis, MA_WAVEFORMATEX** ppDeviceFormat);\n    HRESULT (STDMETHODCALLTYPE * GetDevicePeriod)  (ma_IAudioClient* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod);\n    HRESULT (STDMETHODCALLTYPE * Start)            (ma_IAudioClient* pThis);\n    HRESULT (STDMETHODCALLTYPE * Stop)             (ma_IAudioClient* pThis);\n    HRESULT (STDMETHODCALLTYPE * Reset)            (ma_IAudioClient* pThis);\n    HRESULT (STDMETHODCALLTYPE * SetEventHandle)   (ma_IAudioClient* pThis, HANDLE eventHandle);\n    HRESULT (STDMETHODCALLTYPE * GetService)       (ma_IAudioClient* pThis, const IID* const riid, void** pp);\n} ma_IAudioClientVtbl;\nstruct ma_IAudioClient\n{\n    ma_IAudioClientVtbl* lpVtbl;\n};\nstatic MA_INLINE HRESULT ma_IAudioClient_QueryInterface(ma_IAudioClient* pThis, const IID* const riid, void** ppObject)    { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nstatic MA_INLINE ULONG   ma_IAudioClient_AddRef(ma_IAudioClient* pThis)                                                    { return pThis->lpVtbl->AddRef(pThis); }\nstatic MA_INLINE ULONG   ma_IAudioClient_Release(ma_IAudioClient* pThis)                                                   { return pThis->lpVtbl->Release(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioClient_Initialize(ma_IAudioClient* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const MA_WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid) { return pThis->lpVtbl->Initialize(pThis, shareMode, streamFlags, bufferDuration, periodicity, pFormat, pAudioSessionGuid); }\nstatic MA_INLINE HRESULT ma_IAudioClient_GetBufferSize(ma_IAudioClient* pThis, ma_uint32* pNumBufferFrames)                { return pThis->lpVtbl->GetBufferSize(pThis, pNumBufferFrames); }\nstatic MA_INLINE HRESULT ma_IAudioClient_GetStreamLatency(ma_IAudioClient* pThis, MA_REFERENCE_TIME* pLatency)             { return pThis->lpVtbl->GetStreamLatency(pThis, pLatency); }\nstatic MA_INLINE HRESULT ma_IAudioClient_GetCurrentPadding(ma_IAudioClient* pThis, ma_uint32* pNumPaddingFrames)           { return pThis->lpVtbl->GetCurrentPadding(pThis, pNumPaddingFrames); }\nstatic MA_INLINE HRESULT ma_IAudioClient_IsFormatSupported(ma_IAudioClient* pThis, MA_AUDCLNT_SHAREMODE shareMode, const MA_WAVEFORMATEX* pFormat, MA_WAVEFORMATEX** ppClosestMatch) { return pThis->lpVtbl->IsFormatSupported(pThis, shareMode, pFormat, ppClosestMatch); }\nstatic MA_INLINE HRESULT ma_IAudioClient_GetMixFormat(ma_IAudioClient* pThis, MA_WAVEFORMATEX** ppDeviceFormat)            { return pThis->lpVtbl->GetMixFormat(pThis, ppDeviceFormat); }\nstatic MA_INLINE HRESULT ma_IAudioClient_GetDevicePeriod(ma_IAudioClient* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod) { return pThis->lpVtbl->GetDevicePeriod(pThis, pDefaultDevicePeriod, pMinimumDevicePeriod); }\nstatic MA_INLINE HRESULT ma_IAudioClient_Start(ma_IAudioClient* pThis)                                                     { return pThis->lpVtbl->Start(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioClient_Stop(ma_IAudioClient* pThis)                                                      { return pThis->lpVtbl->Stop(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioClient_Reset(ma_IAudioClient* pThis)                                                     { return pThis->lpVtbl->Reset(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioClient_SetEventHandle(ma_IAudioClient* pThis, HANDLE eventHandle)                        { return pThis->lpVtbl->SetEventHandle(pThis, eventHandle); }\nstatic MA_INLINE HRESULT ma_IAudioClient_GetService(ma_IAudioClient* pThis, const IID* const riid, void** pp)              { return pThis->lpVtbl->GetService(pThis, riid, pp); }\n\n/* IAudioClient2 */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioClient2* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IAudioClient2* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IAudioClient2* pThis);\n\n    /* IAudioClient */\n    HRESULT (STDMETHODCALLTYPE * Initialize)       (ma_IAudioClient2* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const MA_WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid);\n    HRESULT (STDMETHODCALLTYPE * GetBufferSize)    (ma_IAudioClient2* pThis, ma_uint32* pNumBufferFrames);\n    HRESULT (STDMETHODCALLTYPE * GetStreamLatency) (ma_IAudioClient2* pThis, MA_REFERENCE_TIME* pLatency);\n    HRESULT (STDMETHODCALLTYPE * GetCurrentPadding)(ma_IAudioClient2* pThis, ma_uint32* pNumPaddingFrames);\n    HRESULT (STDMETHODCALLTYPE * IsFormatSupported)(ma_IAudioClient2* pThis, MA_AUDCLNT_SHAREMODE shareMode, const MA_WAVEFORMATEX* pFormat, MA_WAVEFORMATEX** ppClosestMatch);\n    HRESULT (STDMETHODCALLTYPE * GetMixFormat)     (ma_IAudioClient2* pThis, MA_WAVEFORMATEX** ppDeviceFormat);\n    HRESULT (STDMETHODCALLTYPE * GetDevicePeriod)  (ma_IAudioClient2* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod);\n    HRESULT (STDMETHODCALLTYPE * Start)            (ma_IAudioClient2* pThis);\n    HRESULT (STDMETHODCALLTYPE * Stop)             (ma_IAudioClient2* pThis);\n    HRESULT (STDMETHODCALLTYPE * Reset)            (ma_IAudioClient2* pThis);\n    HRESULT (STDMETHODCALLTYPE * SetEventHandle)   (ma_IAudioClient2* pThis, HANDLE eventHandle);\n    HRESULT (STDMETHODCALLTYPE * GetService)       (ma_IAudioClient2* pThis, const IID* const riid, void** pp);\n\n    /* IAudioClient2 */\n    HRESULT (STDMETHODCALLTYPE * IsOffloadCapable)   (ma_IAudioClient2* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable);\n    HRESULT (STDMETHODCALLTYPE * SetClientProperties)(ma_IAudioClient2* pThis, const ma_AudioClientProperties* pProperties);\n    HRESULT (STDMETHODCALLTYPE * GetBufferSizeLimits)(ma_IAudioClient2* pThis, const MA_WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration);\n} ma_IAudioClient2Vtbl;\nstruct ma_IAudioClient2\n{\n    ma_IAudioClient2Vtbl* lpVtbl;\n};\nstatic MA_INLINE HRESULT ma_IAudioClient2_QueryInterface(ma_IAudioClient2* pThis, const IID* const riid, void** ppObject)    { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nstatic MA_INLINE ULONG   ma_IAudioClient2_AddRef(ma_IAudioClient2* pThis)                                                    { return pThis->lpVtbl->AddRef(pThis); }\nstatic MA_INLINE ULONG   ma_IAudioClient2_Release(ma_IAudioClient2* pThis)                                                   { return pThis->lpVtbl->Release(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_Initialize(ma_IAudioClient2* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const MA_WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid) { return pThis->lpVtbl->Initialize(pThis, shareMode, streamFlags, bufferDuration, periodicity, pFormat, pAudioSessionGuid); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_GetBufferSize(ma_IAudioClient2* pThis, ma_uint32* pNumBufferFrames)                { return pThis->lpVtbl->GetBufferSize(pThis, pNumBufferFrames); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_GetStreamLatency(ma_IAudioClient2* pThis, MA_REFERENCE_TIME* pLatency)             { return pThis->lpVtbl->GetStreamLatency(pThis, pLatency); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_GetCurrentPadding(ma_IAudioClient2* pThis, ma_uint32* pNumPaddingFrames)           { return pThis->lpVtbl->GetCurrentPadding(pThis, pNumPaddingFrames); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_IsFormatSupported(ma_IAudioClient2* pThis, MA_AUDCLNT_SHAREMODE shareMode, const MA_WAVEFORMATEX* pFormat, MA_WAVEFORMATEX** ppClosestMatch) { return pThis->lpVtbl->IsFormatSupported(pThis, shareMode, pFormat, ppClosestMatch); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_GetMixFormat(ma_IAudioClient2* pThis, MA_WAVEFORMATEX** ppDeviceFormat)            { return pThis->lpVtbl->GetMixFormat(pThis, ppDeviceFormat); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_GetDevicePeriod(ma_IAudioClient2* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod) { return pThis->lpVtbl->GetDevicePeriod(pThis, pDefaultDevicePeriod, pMinimumDevicePeriod); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_Start(ma_IAudioClient2* pThis)                                                     { return pThis->lpVtbl->Start(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_Stop(ma_IAudioClient2* pThis)                                                      { return pThis->lpVtbl->Stop(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_Reset(ma_IAudioClient2* pThis)                                                     { return pThis->lpVtbl->Reset(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_SetEventHandle(ma_IAudioClient2* pThis, HANDLE eventHandle)                        { return pThis->lpVtbl->SetEventHandle(pThis, eventHandle); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_GetService(ma_IAudioClient2* pThis, const IID* const riid, void** pp)              { return pThis->lpVtbl->GetService(pThis, riid, pp); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_IsOffloadCapable(ma_IAudioClient2* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable) { return pThis->lpVtbl->IsOffloadCapable(pThis, category, pOffloadCapable); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_SetClientProperties(ma_IAudioClient2* pThis, const ma_AudioClientProperties* pProperties)           { return pThis->lpVtbl->SetClientProperties(pThis, pProperties); }\nstatic MA_INLINE HRESULT ma_IAudioClient2_GetBufferSizeLimits(ma_IAudioClient2* pThis, const MA_WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration) { return pThis->lpVtbl->GetBufferSizeLimits(pThis, pFormat, eventDriven, pMinBufferDuration, pMaxBufferDuration); }\n\n\n/* IAudioClient3 */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioClient3* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IAudioClient3* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IAudioClient3* pThis);\n\n    /* IAudioClient */\n    HRESULT (STDMETHODCALLTYPE * Initialize)       (ma_IAudioClient3* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const MA_WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid);\n    HRESULT (STDMETHODCALLTYPE * GetBufferSize)    (ma_IAudioClient3* pThis, ma_uint32* pNumBufferFrames);\n    HRESULT (STDMETHODCALLTYPE * GetStreamLatency) (ma_IAudioClient3* pThis, MA_REFERENCE_TIME* pLatency);\n    HRESULT (STDMETHODCALLTYPE * GetCurrentPadding)(ma_IAudioClient3* pThis, ma_uint32* pNumPaddingFrames);\n    HRESULT (STDMETHODCALLTYPE * IsFormatSupported)(ma_IAudioClient3* pThis, MA_AUDCLNT_SHAREMODE shareMode, const MA_WAVEFORMATEX* pFormat, MA_WAVEFORMATEX** ppClosestMatch);\n    HRESULT (STDMETHODCALLTYPE * GetMixFormat)     (ma_IAudioClient3* pThis, MA_WAVEFORMATEX** ppDeviceFormat);\n    HRESULT (STDMETHODCALLTYPE * GetDevicePeriod)  (ma_IAudioClient3* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod);\n    HRESULT (STDMETHODCALLTYPE * Start)            (ma_IAudioClient3* pThis);\n    HRESULT (STDMETHODCALLTYPE * Stop)             (ma_IAudioClient3* pThis);\n    HRESULT (STDMETHODCALLTYPE * Reset)            (ma_IAudioClient3* pThis);\n    HRESULT (STDMETHODCALLTYPE * SetEventHandle)   (ma_IAudioClient3* pThis, HANDLE eventHandle);\n    HRESULT (STDMETHODCALLTYPE * GetService)       (ma_IAudioClient3* pThis, const IID* const riid, void** pp);\n\n    /* IAudioClient2 */\n    HRESULT (STDMETHODCALLTYPE * IsOffloadCapable)   (ma_IAudioClient3* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable);\n    HRESULT (STDMETHODCALLTYPE * SetClientProperties)(ma_IAudioClient3* pThis, const ma_AudioClientProperties* pProperties);\n    HRESULT (STDMETHODCALLTYPE * GetBufferSizeLimits)(ma_IAudioClient3* pThis, const MA_WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration);\n\n    /* IAudioClient3 */\n    HRESULT (STDMETHODCALLTYPE * GetSharedModeEnginePeriod)       (ma_IAudioClient3* pThis, const MA_WAVEFORMATEX* pFormat, ma_uint32* pDefaultPeriodInFrames, ma_uint32* pFundamentalPeriodInFrames, ma_uint32* pMinPeriodInFrames, ma_uint32* pMaxPeriodInFrames);\n    HRESULT (STDMETHODCALLTYPE * GetCurrentSharedModeEnginePeriod)(ma_IAudioClient3* pThis, MA_WAVEFORMATEX** ppFormat, ma_uint32* pCurrentPeriodInFrames);\n    HRESULT (STDMETHODCALLTYPE * InitializeSharedAudioStream)     (ma_IAudioClient3* pThis, DWORD streamFlags, ma_uint32 periodInFrames, const MA_WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid);\n} ma_IAudioClient3Vtbl;\nstruct ma_IAudioClient3\n{\n    ma_IAudioClient3Vtbl* lpVtbl;\n};\nstatic MA_INLINE HRESULT ma_IAudioClient3_QueryInterface(ma_IAudioClient3* pThis, const IID* const riid, void** ppObject)    { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nstatic MA_INLINE ULONG   ma_IAudioClient3_AddRef(ma_IAudioClient3* pThis)                                                    { return pThis->lpVtbl->AddRef(pThis); }\nstatic MA_INLINE ULONG   ma_IAudioClient3_Release(ma_IAudioClient3* pThis)                                                   { return pThis->lpVtbl->Release(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_Initialize(ma_IAudioClient3* pThis, MA_AUDCLNT_SHAREMODE shareMode, DWORD streamFlags, MA_REFERENCE_TIME bufferDuration, MA_REFERENCE_TIME periodicity, const MA_WAVEFORMATEX* pFormat, const GUID* pAudioSessionGuid) { return pThis->lpVtbl->Initialize(pThis, shareMode, streamFlags, bufferDuration, periodicity, pFormat, pAudioSessionGuid); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_GetBufferSize(ma_IAudioClient3* pThis, ma_uint32* pNumBufferFrames)                { return pThis->lpVtbl->GetBufferSize(pThis, pNumBufferFrames); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_GetStreamLatency(ma_IAudioClient3* pThis, MA_REFERENCE_TIME* pLatency)             { return pThis->lpVtbl->GetStreamLatency(pThis, pLatency); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_GetCurrentPadding(ma_IAudioClient3* pThis, ma_uint32* pNumPaddingFrames)           { return pThis->lpVtbl->GetCurrentPadding(pThis, pNumPaddingFrames); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_IsFormatSupported(ma_IAudioClient3* pThis, MA_AUDCLNT_SHAREMODE shareMode, const MA_WAVEFORMATEX* pFormat, MA_WAVEFORMATEX** ppClosestMatch) { return pThis->lpVtbl->IsFormatSupported(pThis, shareMode, pFormat, ppClosestMatch); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_GetMixFormat(ma_IAudioClient3* pThis, MA_WAVEFORMATEX** ppDeviceFormat)               { return pThis->lpVtbl->GetMixFormat(pThis, ppDeviceFormat); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_GetDevicePeriod(ma_IAudioClient3* pThis, MA_REFERENCE_TIME* pDefaultDevicePeriod, MA_REFERENCE_TIME* pMinimumDevicePeriod) { return pThis->lpVtbl->GetDevicePeriod(pThis, pDefaultDevicePeriod, pMinimumDevicePeriod); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_Start(ma_IAudioClient3* pThis)                                                     { return pThis->lpVtbl->Start(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_Stop(ma_IAudioClient3* pThis)                                                      { return pThis->lpVtbl->Stop(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_Reset(ma_IAudioClient3* pThis)                                                     { return pThis->lpVtbl->Reset(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_SetEventHandle(ma_IAudioClient3* pThis, HANDLE eventHandle)                        { return pThis->lpVtbl->SetEventHandle(pThis, eventHandle); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_GetService(ma_IAudioClient3* pThis, const IID* const riid, void** pp)              { return pThis->lpVtbl->GetService(pThis, riid, pp); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_IsOffloadCapable(ma_IAudioClient3* pThis, MA_AUDIO_STREAM_CATEGORY category, BOOL* pOffloadCapable) { return pThis->lpVtbl->IsOffloadCapable(pThis, category, pOffloadCapable); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_SetClientProperties(ma_IAudioClient3* pThis, const ma_AudioClientProperties* pProperties)           { return pThis->lpVtbl->SetClientProperties(pThis, pProperties); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_GetBufferSizeLimits(ma_IAudioClient3* pThis, const MA_WAVEFORMATEX* pFormat, BOOL eventDriven, MA_REFERENCE_TIME* pMinBufferDuration, MA_REFERENCE_TIME* pMaxBufferDuration) { return pThis->lpVtbl->GetBufferSizeLimits(pThis, pFormat, eventDriven, pMinBufferDuration, pMaxBufferDuration); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_GetSharedModeEnginePeriod(ma_IAudioClient3* pThis, const MA_WAVEFORMATEX* pFormat, ma_uint32* pDefaultPeriodInFrames, ma_uint32* pFundamentalPeriodInFrames, ma_uint32* pMinPeriodInFrames, ma_uint32* pMaxPeriodInFrames) { return pThis->lpVtbl->GetSharedModeEnginePeriod(pThis, pFormat, pDefaultPeriodInFrames, pFundamentalPeriodInFrames, pMinPeriodInFrames, pMaxPeriodInFrames); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_GetCurrentSharedModeEnginePeriod(ma_IAudioClient3* pThis, MA_WAVEFORMATEX** ppFormat, ma_uint32* pCurrentPeriodInFrames) { return pThis->lpVtbl->GetCurrentSharedModeEnginePeriod(pThis, ppFormat, pCurrentPeriodInFrames); }\nstatic MA_INLINE HRESULT ma_IAudioClient3_InitializeSharedAudioStream(ma_IAudioClient3* pThis, DWORD streamFlags, ma_uint32 periodInFrames, const MA_WAVEFORMATEX* pFormat, const GUID* pAudioSessionGUID) { return pThis->lpVtbl->InitializeSharedAudioStream(pThis, streamFlags, periodInFrames, pFormat, pAudioSessionGUID); }\n\n\n/* IAudioRenderClient */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioRenderClient* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IAudioRenderClient* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IAudioRenderClient* pThis);\n\n    /* IAudioRenderClient */\n    HRESULT (STDMETHODCALLTYPE * GetBuffer)    (ma_IAudioRenderClient* pThis, ma_uint32 numFramesRequested, BYTE** ppData);\n    HRESULT (STDMETHODCALLTYPE * ReleaseBuffer)(ma_IAudioRenderClient* pThis, ma_uint32 numFramesWritten, DWORD dwFlags);\n} ma_IAudioRenderClientVtbl;\nstruct ma_IAudioRenderClient\n{\n    ma_IAudioRenderClientVtbl* lpVtbl;\n};\nstatic MA_INLINE HRESULT ma_IAudioRenderClient_QueryInterface(ma_IAudioRenderClient* pThis, const IID* const riid, void** ppObject)   { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nstatic MA_INLINE ULONG   ma_IAudioRenderClient_AddRef(ma_IAudioRenderClient* pThis)                                                   { return pThis->lpVtbl->AddRef(pThis); }\nstatic MA_INLINE ULONG   ma_IAudioRenderClient_Release(ma_IAudioRenderClient* pThis)                                                  { return pThis->lpVtbl->Release(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioRenderClient_GetBuffer(ma_IAudioRenderClient* pThis, ma_uint32 numFramesRequested, BYTE** ppData)   { return pThis->lpVtbl->GetBuffer(pThis, numFramesRequested, ppData); }\nstatic MA_INLINE HRESULT ma_IAudioRenderClient_ReleaseBuffer(ma_IAudioRenderClient* pThis, ma_uint32 numFramesWritten, DWORD dwFlags) { return pThis->lpVtbl->ReleaseBuffer(pThis, numFramesWritten, dwFlags); }\n\n\n/* IAudioCaptureClient */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IAudioCaptureClient* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IAudioCaptureClient* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IAudioCaptureClient* pThis);\n\n    /* IAudioRenderClient */\n    HRESULT (STDMETHODCALLTYPE * GetBuffer)        (ma_IAudioCaptureClient* pThis, BYTE** ppData, ma_uint32* pNumFramesToRead, DWORD* pFlags, ma_uint64* pDevicePosition, ma_uint64* pQPCPosition);\n    HRESULT (STDMETHODCALLTYPE * ReleaseBuffer)    (ma_IAudioCaptureClient* pThis, ma_uint32 numFramesRead);\n    HRESULT (STDMETHODCALLTYPE * GetNextPacketSize)(ma_IAudioCaptureClient* pThis, ma_uint32* pNumFramesInNextPacket);\n} ma_IAudioCaptureClientVtbl;\nstruct ma_IAudioCaptureClient\n{\n    ma_IAudioCaptureClientVtbl* lpVtbl;\n};\nstatic MA_INLINE HRESULT ma_IAudioCaptureClient_QueryInterface(ma_IAudioCaptureClient* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nstatic MA_INLINE ULONG   ma_IAudioCaptureClient_AddRef(ma_IAudioCaptureClient* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nstatic MA_INLINE ULONG   ma_IAudioCaptureClient_Release(ma_IAudioCaptureClient* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nstatic MA_INLINE HRESULT ma_IAudioCaptureClient_GetBuffer(ma_IAudioCaptureClient* pThis, BYTE** ppData, ma_uint32* pNumFramesToRead, DWORD* pFlags, ma_uint64* pDevicePosition, ma_uint64* pQPCPosition) { return pThis->lpVtbl->GetBuffer(pThis, ppData, pNumFramesToRead, pFlags, pDevicePosition, pQPCPosition); }\nstatic MA_INLINE HRESULT ma_IAudioCaptureClient_ReleaseBuffer(ma_IAudioCaptureClient* pThis, ma_uint32 numFramesRead)                 { return pThis->lpVtbl->ReleaseBuffer(pThis, numFramesRead); }\nstatic MA_INLINE HRESULT ma_IAudioCaptureClient_GetNextPacketSize(ma_IAudioCaptureClient* pThis, ma_uint32* pNumFramesInNextPacket)   { return pThis->lpVtbl->GetNextPacketSize(pThis, pNumFramesInNextPacket); }\n\n#if defined(MA_WIN32_UWP)\n/* mmdevapi Functions */\ntypedef HRESULT (WINAPI * MA_PFN_ActivateAudioInterfaceAsync)(const wchar_t* deviceInterfacePath, const IID* riid, MA_PROPVARIANT* activationParams, ma_IActivateAudioInterfaceCompletionHandler* completionHandler, ma_IActivateAudioInterfaceAsyncOperation** activationOperation);\n#endif\n\n/* Avrt Functions */\ntypedef HANDLE (WINAPI * MA_PFN_AvSetMmThreadCharacteristicsA)(const char* TaskName, DWORD* TaskIndex);\ntypedef BOOL   (WINAPI * MA_PFN_AvRevertMmThreadCharacteristics)(HANDLE AvrtHandle);\n\n#if !defined(MA_WIN32_DESKTOP) && !defined(MA_WIN32_GDK)\ntypedef struct ma_completion_handler_uwp ma_completion_handler_uwp;\n\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_completion_handler_uwp* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_completion_handler_uwp* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_completion_handler_uwp* pThis);\n\n    /* IActivateAudioInterfaceCompletionHandler */\n    HRESULT (STDMETHODCALLTYPE * ActivateCompleted)(ma_completion_handler_uwp* pThis, ma_IActivateAudioInterfaceAsyncOperation* pActivateOperation);\n} ma_completion_handler_uwp_vtbl;\nstruct ma_completion_handler_uwp\n{\n    ma_completion_handler_uwp_vtbl* lpVtbl;\n    MA_ATOMIC(4, ma_uint32) counter;\n    HANDLE hEvent;\n};\n\nstatic HRESULT STDMETHODCALLTYPE ma_completion_handler_uwp_QueryInterface(ma_completion_handler_uwp* pThis, const IID* const riid, void** ppObject)\n{\n    /*\n    We need to \"implement\" IAgileObject which is just an indicator that's used internally by WASAPI for some multithreading management. To\n    \"implement\" this, we just make sure we return pThis when the IAgileObject is requested.\n    */\n    if (!ma_is_guid_equal(riid, &MA_IID_IUnknown) && !ma_is_guid_equal(riid, &MA_IID_IActivateAudioInterfaceCompletionHandler) && !ma_is_guid_equal(riid, &MA_IID_IAgileObject)) {\n        *ppObject = NULL;\n        return E_NOINTERFACE;\n    }\n\n    /* Getting here means the IID is IUnknown or IMMNotificationClient. */\n    *ppObject = (void*)pThis;\n    ((ma_completion_handler_uwp_vtbl*)pThis->lpVtbl)->AddRef(pThis);\n    return S_OK;\n}\n\nstatic ULONG STDMETHODCALLTYPE ma_completion_handler_uwp_AddRef(ma_completion_handler_uwp* pThis)\n{\n    return (ULONG)ma_atomic_fetch_add_32(&pThis->counter, 1) + 1;\n}\n\nstatic ULONG STDMETHODCALLTYPE ma_completion_handler_uwp_Release(ma_completion_handler_uwp* pThis)\n{\n    ma_uint32 newRefCount = ma_atomic_fetch_sub_32(&pThis->counter, 1) - 1;\n    if (newRefCount == 0) {\n        return 0;   /* We don't free anything here because we never allocate the object on the heap. */\n    }\n\n    return (ULONG)newRefCount;\n}\n\nstatic HRESULT STDMETHODCALLTYPE ma_completion_handler_uwp_ActivateCompleted(ma_completion_handler_uwp* pThis, ma_IActivateAudioInterfaceAsyncOperation* pActivateOperation)\n{\n    (void)pActivateOperation;\n    SetEvent(pThis->hEvent);\n    return S_OK;\n}\n\n\nstatic ma_completion_handler_uwp_vtbl g_maCompletionHandlerVtblInstance = {\n    ma_completion_handler_uwp_QueryInterface,\n    ma_completion_handler_uwp_AddRef,\n    ma_completion_handler_uwp_Release,\n    ma_completion_handler_uwp_ActivateCompleted\n};\n\nstatic ma_result ma_completion_handler_uwp_init(ma_completion_handler_uwp* pHandler)\n{\n    MA_ASSERT(pHandler != NULL);\n    MA_ZERO_OBJECT(pHandler);\n\n    pHandler->lpVtbl = &g_maCompletionHandlerVtblInstance;\n    pHandler->counter = 1;\n    pHandler->hEvent = CreateEventA(NULL, FALSE, FALSE, NULL);\n    if (pHandler->hEvent == NULL) {\n        return ma_result_from_GetLastError(GetLastError());\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_completion_handler_uwp_uninit(ma_completion_handler_uwp* pHandler)\n{\n    if (pHandler->hEvent != NULL) {\n        CloseHandle(pHandler->hEvent);\n    }\n}\n\nstatic void ma_completion_handler_uwp_wait(ma_completion_handler_uwp* pHandler)\n{\n    WaitForSingleObject((HANDLE)pHandler->hEvent, INFINITE);\n}\n#endif  /* !MA_WIN32_DESKTOP */\n\n/* We need a virtual table for our notification client object that's used for detecting changes to the default device. */\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\nstatic HRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_QueryInterface(ma_IMMNotificationClient* pThis, const IID* const riid, void** ppObject)\n{\n    /*\n    We care about two interfaces - IUnknown and IMMNotificationClient. If the requested IID is something else\n    we just return E_NOINTERFACE. Otherwise we need to increment the reference counter and return S_OK.\n    */\n    if (!ma_is_guid_equal(riid, &MA_IID_IUnknown) && !ma_is_guid_equal(riid, &MA_IID_IMMNotificationClient)) {\n        *ppObject = NULL;\n        return E_NOINTERFACE;\n    }\n\n    /* Getting here means the IID is IUnknown or IMMNotificationClient. */\n    *ppObject = (void*)pThis;\n    ((ma_IMMNotificationClientVtbl*)pThis->lpVtbl)->AddRef(pThis);\n    return S_OK;\n}\n\nstatic ULONG STDMETHODCALLTYPE ma_IMMNotificationClient_AddRef(ma_IMMNotificationClient* pThis)\n{\n    return (ULONG)ma_atomic_fetch_add_32(&pThis->counter, 1) + 1;\n}\n\nstatic ULONG STDMETHODCALLTYPE ma_IMMNotificationClient_Release(ma_IMMNotificationClient* pThis)\n{\n    ma_uint32 newRefCount = ma_atomic_fetch_sub_32(&pThis->counter, 1) - 1;\n    if (newRefCount == 0) {\n        return 0;   /* We don't free anything here because we never allocate the object on the heap. */\n    }\n\n    return (ULONG)newRefCount;\n}\n\nstatic HRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnDeviceStateChanged(ma_IMMNotificationClient* pThis, const WCHAR* pDeviceID, DWORD dwNewState)\n{\n    ma_bool32 isThisDevice = MA_FALSE;\n    ma_bool32 isCapture    = MA_FALSE;\n    ma_bool32 isPlayback   = MA_FALSE;\n\n#ifdef MA_DEBUG_OUTPUT\n    /*ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, \"IMMNotificationClient_OnDeviceStateChanged(pDeviceID=%S, dwNewState=%u)\\n\", (pDeviceID != NULL) ? pDeviceID : L\"(NULL)\", (unsigned int)dwNewState);*/\n#endif\n\n    /*\n    There have been reports of a hang when a playback device is disconnected. The idea with this code is to explicitly stop the device if we detect\n    that the device is disabled or has been unplugged.\n    */\n    if (pThis->pDevice->wasapi.allowCaptureAutoStreamRouting && (pThis->pDevice->type == ma_device_type_capture || pThis->pDevice->type == ma_device_type_duplex || pThis->pDevice->type == ma_device_type_loopback)) {\n        isCapture = MA_TRUE;\n        if (ma_strcmp_WCHAR(pThis->pDevice->capture.id.wasapi, pDeviceID) == 0) {\n            isThisDevice = MA_TRUE;\n        }\n    }\n\n    if (pThis->pDevice->wasapi.allowPlaybackAutoStreamRouting && (pThis->pDevice->type == ma_device_type_playback || pThis->pDevice->type == ma_device_type_duplex)) {\n        isPlayback = MA_TRUE;\n        if (ma_strcmp_WCHAR(pThis->pDevice->playback.id.wasapi, pDeviceID) == 0) {\n            isThisDevice = MA_TRUE;\n        }\n    }\n\n\n    /*\n    If the device ID matches our device we need to mark our device as detached and stop it. When a\n    device is added in OnDeviceAdded(), we'll restart it. We only mark it as detached if the device\n    was started at the time of being removed.\n    */\n    if (isThisDevice) {\n        if ((dwNewState & MA_MM_DEVICE_STATE_ACTIVE) == 0) {\n            /*\n            Unplugged or otherwise unavailable. Mark as detached if we were in a playing state. We'll\n            use this to determine whether or not we need to automatically start the device when it's\n            plugged back in again.\n            */\n            if (ma_device_get_state(pThis->pDevice) == ma_device_state_started) {\n                if (isPlayback) {\n                    pThis->pDevice->wasapi.isDetachedPlayback = MA_TRUE;\n                }\n                if (isCapture) {\n                    pThis->pDevice->wasapi.isDetachedCapture = MA_TRUE;\n                }\n\n                ma_device_stop(pThis->pDevice);\n            }\n        }\n\n        if ((dwNewState & MA_MM_DEVICE_STATE_ACTIVE) != 0) {\n            /* The device was activated. If we were detached, we need to start it again. */\n            ma_bool8 tryRestartingDevice = MA_FALSE;\n\n            if (isPlayback) {\n                if (pThis->pDevice->wasapi.isDetachedPlayback) {\n                    pThis->pDevice->wasapi.isDetachedPlayback = MA_FALSE;\n                    ma_device_reroute__wasapi(pThis->pDevice, ma_device_type_playback);\n                    tryRestartingDevice = MA_TRUE;\n                }\n            }\n\n            if (isCapture) {\n                if (pThis->pDevice->wasapi.isDetachedCapture) {\n                    pThis->pDevice->wasapi.isDetachedCapture = MA_FALSE;\n                    ma_device_reroute__wasapi(pThis->pDevice, (pThis->pDevice->type == ma_device_type_loopback) ? ma_device_type_loopback : ma_device_type_capture);\n                    tryRestartingDevice = MA_TRUE;\n                }\n            }\n\n            if (tryRestartingDevice) {\n                if (pThis->pDevice->wasapi.isDetachedPlayback == MA_FALSE && pThis->pDevice->wasapi.isDetachedCapture == MA_FALSE) {\n                    ma_device_start(pThis->pDevice);\n                }\n            }\n        }\n    }\n\n    return S_OK;\n}\n\nstatic HRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnDeviceAdded(ma_IMMNotificationClient* pThis, const WCHAR* pDeviceID)\n{\n#ifdef MA_DEBUG_OUTPUT\n    /*ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, \"IMMNotificationClient_OnDeviceAdded(pDeviceID=%S)\\n\", (pDeviceID != NULL) ? pDeviceID : L\"(NULL)\");*/\n#endif\n\n    /* We don't need to worry about this event for our purposes. */\n    (void)pThis;\n    (void)pDeviceID;\n    return S_OK;\n}\n\nstatic HRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnDeviceRemoved(ma_IMMNotificationClient* pThis, const WCHAR* pDeviceID)\n{\n#ifdef MA_DEBUG_OUTPUT\n    /*ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, \"IMMNotificationClient_OnDeviceRemoved(pDeviceID=%S)\\n\", (pDeviceID != NULL) ? pDeviceID : L\"(NULL)\");*/\n#endif\n\n    /* We don't need to worry about this event for our purposes. */\n    (void)pThis;\n    (void)pDeviceID;\n    return S_OK;\n}\n\nstatic HRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnDefaultDeviceChanged(ma_IMMNotificationClient* pThis, ma_EDataFlow dataFlow, ma_ERole role, const WCHAR* pDefaultDeviceID)\n{\n#ifdef MA_DEBUG_OUTPUT\n    /*ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, \"IMMNotificationClient_OnDefaultDeviceChanged(dataFlow=%d, role=%d, pDefaultDeviceID=%S)\\n\", dataFlow, role, (pDefaultDeviceID != NULL) ? pDefaultDeviceID : L\"(NULL)\");*/\n#endif\n\n    (void)role;\n\n    /* We only care about devices with the same data flow as the current device. */\n    if ((pThis->pDevice->type == ma_device_type_playback && dataFlow != ma_eRender)  ||\n        (pThis->pDevice->type == ma_device_type_capture  && dataFlow != ma_eCapture) ||\n        (pThis->pDevice->type == ma_device_type_loopback && dataFlow != ma_eRender)) {\n        ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Stream rerouting abandoned because dataFlow does match device type.\\n\");\n        return S_OK;\n    }\n\n    /* We need to consider dataFlow as ma_eCapture if device is ma_device_type_loopback */\n    if (pThis->pDevice->type == ma_device_type_loopback) {\n        dataFlow = ma_eCapture;\n    }\n\n    /* Don't do automatic stream routing if we're not allowed. */\n    if ((dataFlow == ma_eRender  && pThis->pDevice->wasapi.allowPlaybackAutoStreamRouting == MA_FALSE) ||\n        (dataFlow == ma_eCapture && pThis->pDevice->wasapi.allowCaptureAutoStreamRouting  == MA_FALSE)) {\n        ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Stream rerouting abandoned because automatic stream routing has been disabled by the device config.\\n\");\n        return S_OK;\n    }\n\n    /*\n    Not currently supporting automatic stream routing in exclusive mode. This is not working correctly on my machine due to\n    AUDCLNT_E_DEVICE_IN_USE errors when reinitializing the device. If this is a bug in miniaudio, we can try re-enabling this once\n    it's fixed.\n    */\n    if ((dataFlow == ma_eRender  && pThis->pDevice->playback.shareMode == ma_share_mode_exclusive) ||\n        (dataFlow == ma_eCapture && pThis->pDevice->capture.shareMode  == ma_share_mode_exclusive)) {\n        ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Stream rerouting abandoned because the device shared mode is exclusive.\\n\");\n        return S_OK;\n    }\n\n\n\n    /*\n    Second attempt at device rerouting. We're going to retrieve the device's state at the time of\n    the route change. We're then going to stop the device, reinitialize the device, and then start\n    it again if the state before stopping was ma_device_state_started.\n    */\n    {\n        ma_uint32 previousState = ma_device_get_state(pThis->pDevice);\n        ma_bool8 restartDevice = MA_FALSE;\n\n        if (previousState == ma_device_state_uninitialized || previousState == ma_device_state_starting) {\n            ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Stream rerouting abandoned because the device is in the process of starting.\\n\");\n            return S_OK;\n        }\n\n        if (previousState == ma_device_state_started) {\n            ma_device_stop(pThis->pDevice);\n            restartDevice = MA_TRUE;\n        }\n\n        if (pDefaultDeviceID != NULL) { /* <-- The input device ID will be null if there's no other device available. */\n            ma_mutex_lock(&pThis->pDevice->wasapi.rerouteLock);\n            {\n                if (dataFlow == ma_eRender) {\n                    ma_device_reroute__wasapi(pThis->pDevice, ma_device_type_playback);\n\n                    if (pThis->pDevice->wasapi.isDetachedPlayback) {\n                        pThis->pDevice->wasapi.isDetachedPlayback = MA_FALSE;\n\n                        if (pThis->pDevice->type == ma_device_type_duplex && pThis->pDevice->wasapi.isDetachedCapture) {\n                            restartDevice = MA_FALSE;   /* It's a duplex device and the capture side is detached. We cannot be restarting the device just yet. */\n                        }\n                        else {\n                            restartDevice = MA_TRUE;    /* It's not a duplex device, or the capture side is also attached so we can go ahead and restart the device. */\n                        }\n                    }\n                }\n                else {\n                    ma_device_reroute__wasapi(pThis->pDevice, (pThis->pDevice->type == ma_device_type_loopback) ? ma_device_type_loopback : ma_device_type_capture);\n\n                    if (pThis->pDevice->wasapi.isDetachedCapture) {\n                        pThis->pDevice->wasapi.isDetachedCapture = MA_FALSE;\n\n                        if (pThis->pDevice->type == ma_device_type_duplex && pThis->pDevice->wasapi.isDetachedPlayback) {\n                            restartDevice = MA_FALSE;   /* It's a duplex device and the playback side is detached. We cannot be restarting the device just yet. */\n                        }\n                        else {\n                            restartDevice = MA_TRUE;    /* It's not a duplex device, or the playback side is also attached so we can go ahead and restart the device. */\n                        }\n                    }\n                }\n            }\n            ma_mutex_unlock(&pThis->pDevice->wasapi.rerouteLock);\n\n            if (restartDevice) {\n                ma_device_start(pThis->pDevice);\n            }\n        }\n    }\n\n    return S_OK;\n}\n\nstatic HRESULT STDMETHODCALLTYPE ma_IMMNotificationClient_OnPropertyValueChanged(ma_IMMNotificationClient* pThis, const WCHAR* pDeviceID, const PROPERTYKEY key)\n{\n#ifdef MA_DEBUG_OUTPUT\n    /*ma_log_postf(ma_device_get_log(pThis->pDevice), MA_LOG_LEVEL_DEBUG, \"IMMNotificationClient_OnPropertyValueChanged(pDeviceID=%S)\\n\", (pDeviceID != NULL) ? pDeviceID : L\"(NULL)\");*/\n#endif\n\n    (void)pThis;\n    (void)pDeviceID;\n    (void)key;\n    return S_OK;\n}\n\nstatic ma_IMMNotificationClientVtbl g_maNotificationCientVtbl = {\n    ma_IMMNotificationClient_QueryInterface,\n    ma_IMMNotificationClient_AddRef,\n    ma_IMMNotificationClient_Release,\n    ma_IMMNotificationClient_OnDeviceStateChanged,\n    ma_IMMNotificationClient_OnDeviceAdded,\n    ma_IMMNotificationClient_OnDeviceRemoved,\n    ma_IMMNotificationClient_OnDefaultDeviceChanged,\n    ma_IMMNotificationClient_OnPropertyValueChanged\n};\n#endif  /* MA_WIN32_DESKTOP */\n\nstatic const char* ma_to_usage_string__wasapi(ma_wasapi_usage usage)\n{\n    switch (usage)\n    {\n        case ma_wasapi_usage_default:   return NULL;\n        case ma_wasapi_usage_games:     return \"Games\";\n        case ma_wasapi_usage_pro_audio: return \"Pro Audio\";\n        default: break;\n    }\n\n    return NULL;\n}\n\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\ntypedef ma_IMMDevice ma_WASAPIDeviceInterface;\n#else\ntypedef ma_IUnknown ma_WASAPIDeviceInterface;\n#endif\n\n\n#define MA_CONTEXT_COMMAND_QUIT__WASAPI                 1\n#define MA_CONTEXT_COMMAND_CREATE_IAUDIOCLIENT__WASAPI  2\n#define MA_CONTEXT_COMMAND_RELEASE_IAUDIOCLIENT__WASAPI 3\n\nstatic ma_context_command__wasapi ma_context_init_command__wasapi(int code)\n{\n    ma_context_command__wasapi cmd;\n\n    MA_ZERO_OBJECT(&cmd);\n    cmd.code = code;\n\n    return cmd;\n}\n\nstatic ma_result ma_context_post_command__wasapi(ma_context* pContext, const ma_context_command__wasapi* pCmd)\n{\n    /* For now we are doing everything synchronously, but I might relax this later if the need arises. */\n    ma_result result;\n    ma_bool32 isUsingLocalEvent = MA_FALSE;\n    ma_event localEvent;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pCmd     != NULL);\n\n    if (pCmd->pEvent == NULL) {\n        isUsingLocalEvent = MA_TRUE;\n\n        result = ma_event_init(&localEvent);\n        if (result != MA_SUCCESS) {\n            return result;  /* Failed to create the event for this command. */\n        }\n    }\n\n    /* Here is where we add the command to the list. If there's not enough room we'll spin until there is. */\n    ma_mutex_lock(&pContext->wasapi.commandLock);\n    {\n        ma_uint32 index;\n\n        /* Spin until we've got some space available. */\n        while (pContext->wasapi.commandCount == ma_countof(pContext->wasapi.commands)) {\n            ma_yield();\n        }\n\n        /* Space is now available. Can safely add to the list. */\n        index = (pContext->wasapi.commandIndex + pContext->wasapi.commandCount) % ma_countof(pContext->wasapi.commands);\n        pContext->wasapi.commands[index]        = *pCmd;\n        pContext->wasapi.commands[index].pEvent = &localEvent;\n        pContext->wasapi.commandCount += 1;\n\n        /* Now that the command has been added, release the semaphore so ma_context_next_command__wasapi() can return. */\n        ma_semaphore_release(&pContext->wasapi.commandSem);\n    }\n    ma_mutex_unlock(&pContext->wasapi.commandLock);\n\n    if (isUsingLocalEvent) {\n        ma_event_wait(&localEvent);\n        ma_event_uninit(&localEvent);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_next_command__wasapi(ma_context* pContext, ma_context_command__wasapi* pCmd)\n{\n    ma_result result = MA_SUCCESS;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pCmd     != NULL);\n\n    result = ma_semaphore_wait(&pContext->wasapi.commandSem);\n    if (result == MA_SUCCESS) {\n        ma_mutex_lock(&pContext->wasapi.commandLock);\n        {\n            *pCmd = pContext->wasapi.commands[pContext->wasapi.commandIndex];\n            pContext->wasapi.commandIndex  = (pContext->wasapi.commandIndex + 1) % ma_countof(pContext->wasapi.commands);\n            pContext->wasapi.commandCount -= 1;\n        }\n        ma_mutex_unlock(&pContext->wasapi.commandLock);\n    }\n\n    return result;\n}\n\nstatic ma_thread_result MA_THREADCALL ma_context_command_thread__wasapi(void* pUserData)\n{\n    ma_result result;\n    ma_context* pContext = (ma_context*)pUserData;\n    MA_ASSERT(pContext != NULL);\n\n    for (;;) {\n        ma_context_command__wasapi cmd;\n        result = ma_context_next_command__wasapi(pContext, &cmd);\n        if (result != MA_SUCCESS) {\n            break;\n        }\n\n        switch (cmd.code)\n        {\n            case MA_CONTEXT_COMMAND_QUIT__WASAPI:\n            {\n                /* Do nothing. Handled after the switch. */\n            } break;\n\n            case MA_CONTEXT_COMMAND_CREATE_IAUDIOCLIENT__WASAPI:\n            {\n                if (cmd.data.createAudioClient.deviceType == ma_device_type_playback) {\n                    *cmd.data.createAudioClient.pResult = ma_result_from_HRESULT(ma_IAudioClient_GetService((ma_IAudioClient*)cmd.data.createAudioClient.pAudioClient, &MA_IID_IAudioRenderClient, cmd.data.createAudioClient.ppAudioClientService));\n                } else {\n                    *cmd.data.createAudioClient.pResult = ma_result_from_HRESULT(ma_IAudioClient_GetService((ma_IAudioClient*)cmd.data.createAudioClient.pAudioClient, &MA_IID_IAudioCaptureClient, cmd.data.createAudioClient.ppAudioClientService));\n                }\n            } break;\n\n            case MA_CONTEXT_COMMAND_RELEASE_IAUDIOCLIENT__WASAPI:\n            {\n                if (cmd.data.releaseAudioClient.deviceType == ma_device_type_playback) {\n                    if (cmd.data.releaseAudioClient.pDevice->wasapi.pAudioClientPlayback != NULL) {\n                        ma_IAudioClient_Release((ma_IAudioClient*)cmd.data.releaseAudioClient.pDevice->wasapi.pAudioClientPlayback);\n                        cmd.data.releaseAudioClient.pDevice->wasapi.pAudioClientPlayback = NULL;\n                    }\n                }\n\n                if (cmd.data.releaseAudioClient.deviceType == ma_device_type_capture) {\n                    if (cmd.data.releaseAudioClient.pDevice->wasapi.pAudioClientCapture != NULL) {\n                        ma_IAudioClient_Release((ma_IAudioClient*)cmd.data.releaseAudioClient.pDevice->wasapi.pAudioClientCapture);\n                        cmd.data.releaseAudioClient.pDevice->wasapi.pAudioClientCapture = NULL;\n                    }\n                }\n            } break;\n\n            default:\n            {\n                /* Unknown command. Ignore it, but trigger an assert in debug mode so we're aware of it. */\n                MA_ASSERT(MA_FALSE);\n            } break;\n        }\n\n        if (cmd.pEvent != NULL) {\n            ma_event_signal(cmd.pEvent);\n        }\n\n        if (cmd.code == MA_CONTEXT_COMMAND_QUIT__WASAPI) {\n            break;  /* Received a quit message. Get out of here. */\n        }\n    }\n\n    return (ma_thread_result)0;\n}\n\nstatic ma_result ma_device_create_IAudioClient_service__wasapi(ma_context* pContext, ma_device_type deviceType, ma_IAudioClient* pAudioClient, void** ppAudioClientService)\n{\n    ma_result result;\n    ma_result cmdResult;\n    ma_context_command__wasapi cmd = ma_context_init_command__wasapi(MA_CONTEXT_COMMAND_CREATE_IAUDIOCLIENT__WASAPI);\n    cmd.data.createAudioClient.deviceType           = deviceType;\n    cmd.data.createAudioClient.pAudioClient         = (void*)pAudioClient;\n    cmd.data.createAudioClient.ppAudioClientService = ppAudioClientService;\n    cmd.data.createAudioClient.pResult              = &cmdResult;   /* Declared locally, but won't be dereferenced after this function returns since execution of the command will wait here. */\n\n    result = ma_context_post_command__wasapi(pContext, &cmd);  /* This will not return until the command has actually been run. */\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return *cmd.data.createAudioClient.pResult;\n}\n\n#if 0   /* Not used at the moment, but leaving here for future use. */\nstatic ma_result ma_device_release_IAudioClient_service__wasapi(ma_device* pDevice, ma_device_type deviceType)\n{\n    ma_result result;\n    ma_context_command__wasapi cmd = ma_context_init_command__wasapi(MA_CONTEXT_COMMAND_RELEASE_IAUDIOCLIENT__WASAPI);\n    cmd.data.releaseAudioClient.pDevice    = pDevice;\n    cmd.data.releaseAudioClient.deviceType = deviceType;\n\n    result = ma_context_post_command__wasapi(pDevice->pContext, &cmd);  /* This will not return until the command has actually been run. */\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n#endif\n\n\nstatic void ma_add_native_data_format_to_device_info_from_WAVEFORMATEX(const MA_WAVEFORMATEX* pWF, ma_share_mode shareMode, ma_device_info* pInfo)\n{\n    MA_ASSERT(pWF != NULL);\n    MA_ASSERT(pInfo != NULL);\n\n    if (pInfo->nativeDataFormatCount >= ma_countof(pInfo->nativeDataFormats)) {\n        return; /* Too many data formats. Need to ignore this one. Don't think this should ever happen with WASAPI. */\n    }\n\n    pInfo->nativeDataFormats[pInfo->nativeDataFormatCount].format     = ma_format_from_WAVEFORMATEX(pWF);\n    pInfo->nativeDataFormats[pInfo->nativeDataFormatCount].channels   = pWF->nChannels;\n    pInfo->nativeDataFormats[pInfo->nativeDataFormatCount].sampleRate = pWF->nSamplesPerSec;\n    pInfo->nativeDataFormats[pInfo->nativeDataFormatCount].flags      = (shareMode == ma_share_mode_exclusive) ? MA_DATA_FORMAT_FLAG_EXCLUSIVE_MODE : 0;\n    pInfo->nativeDataFormatCount += 1;\n}\n\nstatic ma_result ma_context_get_device_info_from_IAudioClient__wasapi(ma_context* pContext, /*ma_IMMDevice**/void* pMMDevice, ma_IAudioClient* pAudioClient, ma_device_info* pInfo)\n{\n    HRESULT hr;\n    MA_WAVEFORMATEX* pWF = NULL;\n\n    MA_ASSERT(pAudioClient != NULL);\n    MA_ASSERT(pInfo != NULL);\n\n    /* Shared Mode. We use GetMixFormat() here. */\n    hr = ma_IAudioClient_GetMixFormat((ma_IAudioClient*)pAudioClient, (MA_WAVEFORMATEX**)&pWF);\n    if (SUCCEEDED(hr)) {\n        ma_add_native_data_format_to_device_info_from_WAVEFORMATEX(pWF, ma_share_mode_shared, pInfo);\n    } else {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to retrieve mix format for device info retrieval.\");\n        return ma_result_from_HRESULT(hr);\n    }\n\n    /*\n    Exlcusive Mode. We repeatedly call IsFormatSupported() here. This is not currently supported on\n    UWP. Failure to retrieve the exclusive mode format is not considered an error, so from here on\n    out, MA_SUCCESS is guaranteed to be returned.\n    */\n    #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    {\n        ma_IPropertyStore *pProperties;\n\n        /*\n        The first thing to do is get the format from PKEY_AudioEngine_DeviceFormat. This should give us a channel count we assume is\n        correct which will simplify our searching.\n        */\n        hr = ma_IMMDevice_OpenPropertyStore((ma_IMMDevice*)pMMDevice, STGM_READ, &pProperties);\n        if (SUCCEEDED(hr)) {\n            MA_PROPVARIANT var;\n            ma_PropVariantInit(&var);\n\n            hr = ma_IPropertyStore_GetValue(pProperties, &MA_PKEY_AudioEngine_DeviceFormat, &var);\n            if (SUCCEEDED(hr)) {\n                pWF = (MA_WAVEFORMATEX*)var.blob.pBlobData;\n\n                /*\n                In my testing, the format returned by PKEY_AudioEngine_DeviceFormat is suitable for exclusive mode so we check this format\n                first. If this fails, fall back to a search.\n                */\n                hr = ma_IAudioClient_IsFormatSupported((ma_IAudioClient*)pAudioClient, MA_AUDCLNT_SHAREMODE_EXCLUSIVE, pWF, NULL);\n                if (SUCCEEDED(hr)) {\n                    /* The format returned by PKEY_AudioEngine_DeviceFormat is supported. */\n                    ma_add_native_data_format_to_device_info_from_WAVEFORMATEX(pWF, ma_share_mode_exclusive, pInfo);\n                } else {\n                    /*\n                    The format returned by PKEY_AudioEngine_DeviceFormat is not supported, so fall back to a search. We assume the channel\n                    count returned by MA_PKEY_AudioEngine_DeviceFormat is valid and correct. For simplicity we're only returning one format.\n                    */\n                    ma_uint32 channels = pWF->nChannels;\n                    ma_channel defaultChannelMap[MA_MAX_CHANNELS];\n                    MA_WAVEFORMATEXTENSIBLE wf;\n                    ma_bool32 found;\n                    ma_uint32 iFormat;\n\n                    /* Make sure we don't overflow the channel map. */\n                    if (channels > MA_MAX_CHANNELS) {\n                        channels = MA_MAX_CHANNELS;\n                    }\n\n                    ma_channel_map_init_standard(ma_standard_channel_map_microsoft, defaultChannelMap, ma_countof(defaultChannelMap), channels);\n\n                    MA_ZERO_OBJECT(&wf);\n                    wf.cbSize     = sizeof(wf);\n                    wf.wFormatTag = WAVE_FORMAT_EXTENSIBLE;\n                    wf.nChannels  = (WORD)channels;\n                    wf.dwChannelMask     = ma_channel_map_to_channel_mask__win32(defaultChannelMap, channels);\n\n                    found = MA_FALSE;\n                    for (iFormat = 0; iFormat < ma_countof(g_maFormatPriorities); ++iFormat) {\n                        ma_format format = g_maFormatPriorities[iFormat];\n                        ma_uint32 iSampleRate;\n\n                        wf.wBitsPerSample       = (WORD)(ma_get_bytes_per_sample(format)*8);\n                        wf.nBlockAlign          = (WORD)(wf.nChannels * wf.wBitsPerSample / 8);\n                        wf.nAvgBytesPerSec      = wf.nBlockAlign * wf.nSamplesPerSec;\n                        wf.Samples.wValidBitsPerSample = /*(format == ma_format_s24_32) ? 24 :*/ wf.wBitsPerSample;\n                        if (format == ma_format_f32) {\n                            wf.SubFormat = MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;\n                        } else {\n                            wf.SubFormat = MA_GUID_KSDATAFORMAT_SUBTYPE_PCM;\n                        }\n\n                        for (iSampleRate = 0; iSampleRate < ma_countof(g_maStandardSampleRatePriorities); ++iSampleRate) {\n                            wf.nSamplesPerSec = g_maStandardSampleRatePriorities[iSampleRate];\n\n                            hr = ma_IAudioClient_IsFormatSupported((ma_IAudioClient*)pAudioClient, MA_AUDCLNT_SHAREMODE_EXCLUSIVE, (MA_WAVEFORMATEX*)&wf, NULL);\n                            if (SUCCEEDED(hr)) {\n                                ma_add_native_data_format_to_device_info_from_WAVEFORMATEX((MA_WAVEFORMATEX*)&wf, ma_share_mode_exclusive, pInfo);\n                                found = MA_TRUE;\n                                break;\n                            }\n                        }\n\n                        if (found) {\n                            break;\n                        }\n                    }\n\n                    ma_PropVariantClear(pContext, &var);\n\n                    if (!found) {\n                        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, \"[WASAPI] Failed to find suitable device format for device info retrieval.\");\n                    }\n                }\n            } else {\n                ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, \"[WASAPI] Failed to retrieve device format for device info retrieval.\");\n            }\n\n            ma_IPropertyStore_Release(pProperties);\n        } else {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, \"[WASAPI] Failed to open property store for device info retrieval.\");\n        }\n    }\n    #else\n    {\n        (void)pMMDevice;    /* Unused. */\n    }\n    #endif\n\n    return MA_SUCCESS;\n}\n\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\nstatic ma_EDataFlow ma_device_type_to_EDataFlow(ma_device_type deviceType)\n{\n    if (deviceType == ma_device_type_playback) {\n        return ma_eRender;\n    } else if (deviceType == ma_device_type_capture) {\n        return ma_eCapture;\n    } else {\n        MA_ASSERT(MA_FALSE);\n        return ma_eRender; /* Should never hit this. */\n    }\n}\n\nstatic ma_result ma_context_create_IMMDeviceEnumerator__wasapi(ma_context* pContext, ma_IMMDeviceEnumerator** ppDeviceEnumerator)\n{\n    HRESULT hr;\n    ma_IMMDeviceEnumerator* pDeviceEnumerator;\n\n    MA_ASSERT(pContext           != NULL);\n    MA_ASSERT(ppDeviceEnumerator != NULL);\n\n    *ppDeviceEnumerator = NULL; /* Safety. */\n\n    hr = ma_CoCreateInstance(pContext, &MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, &MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator);\n    if (FAILED(hr)) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to create device enumerator.\");\n        return ma_result_from_HRESULT(hr);\n    }\n\n    *ppDeviceEnumerator = pDeviceEnumerator;\n\n    return MA_SUCCESS;\n}\n\nstatic WCHAR* ma_context_get_default_device_id_from_IMMDeviceEnumerator__wasapi(ma_context* pContext, ma_IMMDeviceEnumerator* pDeviceEnumerator, ma_device_type deviceType)\n{\n    HRESULT hr;\n    ma_IMMDevice* pMMDefaultDevice = NULL;\n    WCHAR* pDefaultDeviceID = NULL;\n    ma_EDataFlow dataFlow;\n    ma_ERole role;\n\n    MA_ASSERT(pContext          != NULL);\n    MA_ASSERT(pDeviceEnumerator != NULL);\n\n    (void)pContext;\n\n    /* Grab the EDataFlow type from the device type. */\n    dataFlow = ma_device_type_to_EDataFlow(deviceType);\n\n    /* The role is always eConsole, but we may make this configurable later. */\n    role = ma_eConsole;\n\n    hr = ma_IMMDeviceEnumerator_GetDefaultAudioEndpoint(pDeviceEnumerator, dataFlow, role, &pMMDefaultDevice);\n    if (FAILED(hr)) {\n        return NULL;\n    }\n\n    hr = ma_IMMDevice_GetId(pMMDefaultDevice, &pDefaultDeviceID);\n\n    ma_IMMDevice_Release(pMMDefaultDevice);\n    pMMDefaultDevice = NULL;\n\n    if (FAILED(hr)) {\n        return NULL;\n    }\n\n    return pDefaultDeviceID;\n}\n\nstatic WCHAR* ma_context_get_default_device_id__wasapi(ma_context* pContext, ma_device_type deviceType)    /* Free the returned pointer with ma_CoTaskMemFree() */\n{\n    ma_result result;\n    ma_IMMDeviceEnumerator* pDeviceEnumerator;\n    WCHAR* pDefaultDeviceID = NULL;\n\n    MA_ASSERT(pContext != NULL);\n\n    result = ma_context_create_IMMDeviceEnumerator__wasapi(pContext, &pDeviceEnumerator);\n    if (result != MA_SUCCESS) {\n        return NULL;\n    }\n\n    pDefaultDeviceID = ma_context_get_default_device_id_from_IMMDeviceEnumerator__wasapi(pContext, pDeviceEnumerator, deviceType);\n\n    ma_IMMDeviceEnumerator_Release(pDeviceEnumerator);\n    return pDefaultDeviceID;\n}\n\nstatic ma_result ma_context_get_MMDevice__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_IMMDevice** ppMMDevice)\n{\n    ma_IMMDeviceEnumerator* pDeviceEnumerator;\n    HRESULT hr;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(ppMMDevice != NULL);\n\n    hr = ma_CoCreateInstance(pContext, &MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, &MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator);\n    if (FAILED(hr)) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to create IMMDeviceEnumerator.\\n\");\n        return ma_result_from_HRESULT(hr);\n    }\n\n    if (pDeviceID == NULL) {\n        hr = ma_IMMDeviceEnumerator_GetDefaultAudioEndpoint(pDeviceEnumerator, (deviceType == ma_device_type_capture) ? ma_eCapture : ma_eRender, ma_eConsole, ppMMDevice);\n    } else {\n        hr = ma_IMMDeviceEnumerator_GetDevice(pDeviceEnumerator, pDeviceID->wasapi, ppMMDevice);\n    }\n\n    ma_IMMDeviceEnumerator_Release(pDeviceEnumerator);\n    if (FAILED(hr)) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to retrieve IMMDevice.\\n\");\n        return ma_result_from_HRESULT(hr);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_get_device_id_from_MMDevice__wasapi(ma_context* pContext, ma_IMMDevice* pMMDevice, ma_device_id* pDeviceID)\n{\n    WCHAR* pDeviceIDString;\n    HRESULT hr;\n\n    MA_ASSERT(pDeviceID != NULL);\n\n    hr = ma_IMMDevice_GetId(pMMDevice, &pDeviceIDString);\n    if (SUCCEEDED(hr)) {\n        size_t idlen = ma_strlen_WCHAR(pDeviceIDString);\n        if (idlen+1 > ma_countof(pDeviceID->wasapi)) {\n            ma_CoTaskMemFree(pContext, pDeviceIDString);\n            MA_ASSERT(MA_FALSE);  /* NOTE: If this is triggered, please report it. It means the format of the ID must haved change and is too long to fit in our fixed sized buffer. */\n            return MA_ERROR;\n        }\n\n        MA_COPY_MEMORY(pDeviceID->wasapi, pDeviceIDString, idlen * sizeof(wchar_t));\n        pDeviceID->wasapi[idlen] = '\\0';\n\n        ma_CoTaskMemFree(pContext, pDeviceIDString);\n\n        return MA_SUCCESS;\n    }\n\n    return MA_ERROR;\n}\n\nstatic ma_result ma_context_get_device_info_from_MMDevice__wasapi(ma_context* pContext, ma_IMMDevice* pMMDevice, WCHAR* pDefaultDeviceID, ma_bool32 onlySimpleInfo, ma_device_info* pInfo)\n{\n    ma_result result;\n    HRESULT hr;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pMMDevice != NULL);\n    MA_ASSERT(pInfo != NULL);\n\n    /* ID. */\n    result = ma_context_get_device_id_from_MMDevice__wasapi(pContext, pMMDevice, &pInfo->id);\n    if (result == MA_SUCCESS) {\n        if (pDefaultDeviceID != NULL) {\n            if (ma_strcmp_WCHAR(pInfo->id.wasapi, pDefaultDeviceID) == 0) {\n                pInfo->isDefault = MA_TRUE;\n            }\n        }\n    }\n\n    /* Description / Friendly Name */\n    {\n        ma_IPropertyStore *pProperties;\n        hr = ma_IMMDevice_OpenPropertyStore(pMMDevice, STGM_READ, &pProperties);\n        if (SUCCEEDED(hr)) {\n            MA_PROPVARIANT var;\n\n            ma_PropVariantInit(&var);\n            hr = ma_IPropertyStore_GetValue(pProperties, &MA_PKEY_Device_FriendlyName, &var);\n            if (SUCCEEDED(hr)) {\n                WideCharToMultiByte(CP_UTF8, 0, var.pwszVal, -1, pInfo->name, sizeof(pInfo->name), 0, FALSE);\n                ma_PropVariantClear(pContext, &var);\n            }\n\n            ma_IPropertyStore_Release(pProperties);\n        }\n    }\n\n    /* Format */\n    if (!onlySimpleInfo) {\n        ma_IAudioClient* pAudioClient;\n        hr = ma_IMMDevice_Activate(pMMDevice, &MA_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&pAudioClient);\n        if (SUCCEEDED(hr)) {\n            result = ma_context_get_device_info_from_IAudioClient__wasapi(pContext, pMMDevice, pAudioClient, pInfo);\n\n            ma_IAudioClient_Release(pAudioClient);\n            return result;\n        } else {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to activate audio client for device info retrieval.\");\n            return ma_result_from_HRESULT(hr);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_enumerate_devices_by_type__wasapi(ma_context* pContext, ma_IMMDeviceEnumerator* pDeviceEnumerator, ma_device_type deviceType, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_result result = MA_SUCCESS;\n    UINT deviceCount;\n    HRESULT hr;\n    ma_uint32 iDevice;\n    WCHAR* pDefaultDeviceID = NULL;\n    ma_IMMDeviceCollection* pDeviceCollection = NULL;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(callback != NULL);\n\n    /* Grab the default device. We use this to know whether or not flag the returned device info as being the default. */\n    pDefaultDeviceID = ma_context_get_default_device_id_from_IMMDeviceEnumerator__wasapi(pContext, pDeviceEnumerator, deviceType);\n\n    /* We need to enumerate the devices which returns a device collection. */\n    hr = ma_IMMDeviceEnumerator_EnumAudioEndpoints(pDeviceEnumerator, ma_device_type_to_EDataFlow(deviceType), MA_MM_DEVICE_STATE_ACTIVE, &pDeviceCollection);\n    if (SUCCEEDED(hr)) {\n        hr = ma_IMMDeviceCollection_GetCount(pDeviceCollection, &deviceCount);\n        if (FAILED(hr)) {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to get device count.\\n\");\n            result = ma_result_from_HRESULT(hr);\n            goto done;\n        }\n\n        for (iDevice = 0; iDevice < deviceCount; ++iDevice) {\n            ma_device_info deviceInfo;\n            ma_IMMDevice* pMMDevice;\n\n            MA_ZERO_OBJECT(&deviceInfo);\n\n            hr = ma_IMMDeviceCollection_Item(pDeviceCollection, iDevice, &pMMDevice);\n            if (SUCCEEDED(hr)) {\n                result = ma_context_get_device_info_from_MMDevice__wasapi(pContext, pMMDevice, pDefaultDeviceID, MA_TRUE, &deviceInfo);   /* MA_TRUE = onlySimpleInfo. */\n\n                ma_IMMDevice_Release(pMMDevice);\n                if (result == MA_SUCCESS) {\n                    ma_bool32 cbResult = callback(pContext, deviceType, &deviceInfo, pUserData);\n                    if (cbResult == MA_FALSE) {\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\ndone:\n    if (pDefaultDeviceID != NULL) {\n        ma_CoTaskMemFree(pContext, pDefaultDeviceID);\n        pDefaultDeviceID = NULL;\n    }\n\n    if (pDeviceCollection != NULL) {\n        ma_IMMDeviceCollection_Release(pDeviceCollection);\n        pDeviceCollection = NULL;\n    }\n\n    return result;\n}\n\nstatic ma_result ma_context_get_IAudioClient_Desktop__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, MA_PROPVARIANT* pActivationParams, ma_IAudioClient** ppAudioClient, ma_IMMDevice** ppMMDevice)\n{\n    ma_result result;\n    HRESULT hr;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(ppAudioClient != NULL);\n    MA_ASSERT(ppMMDevice != NULL);\n\n    result = ma_context_get_MMDevice__wasapi(pContext, deviceType, pDeviceID, ppMMDevice);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    hr = ma_IMMDevice_Activate(*ppMMDevice, &MA_IID_IAudioClient, CLSCTX_ALL, pActivationParams, (void**)ppAudioClient);\n    if (FAILED(hr)) {\n        return ma_result_from_HRESULT(hr);\n    }\n\n    return MA_SUCCESS;\n}\n#else\nstatic ma_result ma_context_get_IAudioClient_UWP__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, MA_PROPVARIANT* pActivationParams, ma_IAudioClient** ppAudioClient, ma_IUnknown** ppActivatedInterface)\n{\n    ma_IActivateAudioInterfaceAsyncOperation *pAsyncOp = NULL;\n    ma_completion_handler_uwp completionHandler;\n    IID iid;\n    WCHAR* iidStr;\n    HRESULT hr;\n    ma_result result;\n    HRESULT activateResult;\n    ma_IUnknown* pActivatedInterface;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(ppAudioClient != NULL);\n\n    if (pDeviceID != NULL) {\n        iidStr = (WCHAR*)pDeviceID->wasapi;\n    } else {\n        if (deviceType == ma_device_type_capture) {\n            iid = MA_IID_DEVINTERFACE_AUDIO_CAPTURE;\n        } else {\n            iid = MA_IID_DEVINTERFACE_AUDIO_RENDER;\n        }\n\n    #if defined(__cplusplus)\n        hr = StringFromIID(iid, &iidStr);\n    #else\n        hr = StringFromIID(&iid, &iidStr);\n    #endif\n        if (FAILED(hr)) {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to convert device IID to string for ActivateAudioInterfaceAsync(). Out of memory.\\n\");\n            return ma_result_from_HRESULT(hr);\n        }\n    }\n\n    result = ma_completion_handler_uwp_init(&completionHandler);\n    if (result != MA_SUCCESS) {\n        ma_CoTaskMemFree(pContext, iidStr);\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to create event for waiting for ActivateAudioInterfaceAsync().\\n\");\n        return result;\n    }\n\n    hr = ((MA_PFN_ActivateAudioInterfaceAsync)pContext->wasapi.ActivateAudioInterfaceAsync)(iidStr, &MA_IID_IAudioClient, pActivationParams, (ma_IActivateAudioInterfaceCompletionHandler*)&completionHandler, (ma_IActivateAudioInterfaceAsyncOperation**)&pAsyncOp);\n    if (FAILED(hr)) {\n        ma_completion_handler_uwp_uninit(&completionHandler);\n        ma_CoTaskMemFree(pContext, iidStr);\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[WASAPI] ActivateAudioInterfaceAsync() failed.\\n\");\n        return ma_result_from_HRESULT(hr);\n    }\n\n    if (pDeviceID == NULL) {\n        ma_CoTaskMemFree(pContext, iidStr);\n    }\n\n    /* Wait for the async operation for finish. */\n    ma_completion_handler_uwp_wait(&completionHandler);\n    ma_completion_handler_uwp_uninit(&completionHandler);\n\n    hr = ma_IActivateAudioInterfaceAsyncOperation_GetActivateResult(pAsyncOp, &activateResult, &pActivatedInterface);\n    ma_IActivateAudioInterfaceAsyncOperation_Release(pAsyncOp);\n\n    if (FAILED(hr) || FAILED(activateResult)) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to activate device.\\n\");\n        return FAILED(hr) ? ma_result_from_HRESULT(hr) : ma_result_from_HRESULT(activateResult);\n    }\n\n    /* Here is where we grab the IAudioClient interface. */\n    hr = ma_IUnknown_QueryInterface(pActivatedInterface, &MA_IID_IAudioClient, (void**)ppAudioClient);\n    if (FAILED(hr)) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to query IAudioClient interface.\\n\");\n        return ma_result_from_HRESULT(hr);\n    }\n\n    if (ppActivatedInterface) {\n        *ppActivatedInterface = pActivatedInterface;\n    } else {\n        ma_IUnknown_Release(pActivatedInterface);\n    }\n\n    return MA_SUCCESS;\n}\n#endif\n\n\n/* https://docs.microsoft.com/en-us/windows/win32/api/audioclientactivationparams/ne-audioclientactivationparams-audioclient_activation_type */\ntypedef enum\n{\n    MA_AUDIOCLIENT_ACTIVATION_TYPE_DEFAULT,\n    MA_AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK\n} MA_AUDIOCLIENT_ACTIVATION_TYPE;\n\n/* https://docs.microsoft.com/en-us/windows/win32/api/audioclientactivationparams/ne-audioclientactivationparams-process_loopback_mode */\ntypedef enum\n{\n    MA_PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE,\n    MA_PROCESS_LOOPBACK_MODE_EXCLUDE_TARGET_PROCESS_TREE\n} MA_PROCESS_LOOPBACK_MODE;\n\n/* https://docs.microsoft.com/en-us/windows/win32/api/audioclientactivationparams/ns-audioclientactivationparams-audioclient_process_loopback_params */\ntypedef struct\n{\n    DWORD TargetProcessId;\n    MA_PROCESS_LOOPBACK_MODE ProcessLoopbackMode;\n} MA_AUDIOCLIENT_PROCESS_LOOPBACK_PARAMS;\n\n#if defined(_MSC_VER) && !defined(__clang__)\n    #pragma warning(push)\n    #pragma warning(disable:4201)   /* nonstandard extension used: nameless struct/union */\n#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))\n    #pragma GCC diagnostic push\n    #pragma GCC diagnostic ignored \"-Wpedantic\" /* For ISO C99 doesn't support unnamed structs/unions [-Wpedantic] */\n    #if defined(__clang__)\n        #pragma GCC diagnostic ignored \"-Wc11-extensions\"   /* anonymous unions are a C11 extension */\n    #endif\n#endif\n/* https://docs.microsoft.com/en-us/windows/win32/api/audioclientactivationparams/ns-audioclientactivationparams-audioclient_activation_params */\ntypedef struct\n{\n    MA_AUDIOCLIENT_ACTIVATION_TYPE ActivationType;\n    union\n    {\n        MA_AUDIOCLIENT_PROCESS_LOOPBACK_PARAMS ProcessLoopbackParams;\n    };\n} MA_AUDIOCLIENT_ACTIVATION_PARAMS;\n#if defined(_MSC_VER) && !defined(__clang__)\n    #pragma warning(pop)\n#elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)))\n    #pragma GCC diagnostic pop\n#endif\n\n#define MA_VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK L\"VAD\\\\Process_Loopback\"\n\nstatic ma_result ma_context_get_IAudioClient__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_uint32 loopbackProcessID, ma_bool32 loopbackProcessExclude, ma_IAudioClient** ppAudioClient, ma_WASAPIDeviceInterface** ppDeviceInterface)\n{\n    ma_result result;\n    ma_bool32 usingProcessLoopback = MA_FALSE;\n    MA_AUDIOCLIENT_ACTIVATION_PARAMS audioclientActivationParams;\n    MA_PROPVARIANT activationParams;\n    MA_PROPVARIANT* pActivationParams = NULL;\n    ma_device_id virtualDeviceID;\n\n    /* Activation parameters specific to loopback mode. Note that process-specific loopback will only work when a default device ID is specified. */\n    if (deviceType == ma_device_type_loopback && loopbackProcessID != 0 && pDeviceID == NULL) {\n        usingProcessLoopback = MA_TRUE;\n    }\n\n    if (usingProcessLoopback) {\n        MA_ZERO_OBJECT(&audioclientActivationParams);\n        audioclientActivationParams.ActivationType                            = MA_AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK;\n        audioclientActivationParams.ProcessLoopbackParams.ProcessLoopbackMode = (loopbackProcessExclude) ? MA_PROCESS_LOOPBACK_MODE_EXCLUDE_TARGET_PROCESS_TREE : MA_PROCESS_LOOPBACK_MODE_INCLUDE_TARGET_PROCESS_TREE;\n        audioclientActivationParams.ProcessLoopbackParams.TargetProcessId     = (DWORD)loopbackProcessID;\n\n        ma_PropVariantInit(&activationParams);\n        activationParams.vt             = MA_VT_BLOB;\n        activationParams.blob.cbSize    = sizeof(audioclientActivationParams);\n        activationParams.blob.pBlobData = (BYTE*)&audioclientActivationParams;\n        pActivationParams = &activationParams;\n\n        /* When requesting a specific device ID we need to use a special device ID. */\n        MA_COPY_MEMORY(virtualDeviceID.wasapi, MA_VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK, (wcslen(MA_VIRTUAL_AUDIO_DEVICE_PROCESS_LOOPBACK) + 1) * sizeof(wchar_t)); /* +1 for the null terminator. */\n        pDeviceID = &virtualDeviceID;\n    } else {\n        pActivationParams = NULL;   /* No activation parameters required. */\n    }\n\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    result = ma_context_get_IAudioClient_Desktop__wasapi(pContext, deviceType, pDeviceID, pActivationParams, ppAudioClient, ppDeviceInterface);\n#else\n    result = ma_context_get_IAudioClient_UWP__wasapi(pContext, deviceType, pDeviceID, pActivationParams, ppAudioClient, ppDeviceInterface);\n#endif\n\n    /*\n    If loopback mode was requested with a process ID and initialization failed, it could be because it's\n    trying to run on an older version of Windows where it's not supported. We need to let the caller\n    know about this with a log message.\n    */\n    if (result != MA_SUCCESS) {\n        if (usingProcessLoopback) {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[WASAPI] Loopback mode requested to %s process ID %u, but initialization failed. Support for this feature begins with Windows 10 Build 20348. Confirm your version of Windows or consider not using process-specific loopback.\\n\", (loopbackProcessExclude) ? \"exclude\" : \"include\", loopbackProcessID);\n        }\n    }\n\n    return result;\n}\n\n\nstatic ma_result ma_context_enumerate_devices__wasapi(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    /* Different enumeration for desktop and UWP. */\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    /* Desktop */\n    HRESULT hr;\n    ma_IMMDeviceEnumerator* pDeviceEnumerator;\n\n    hr = ma_CoCreateInstance(pContext, &MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, &MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator);\n    if (FAILED(hr)) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to create device enumerator.\");\n        return ma_result_from_HRESULT(hr);\n    }\n\n    ma_context_enumerate_devices_by_type__wasapi(pContext, pDeviceEnumerator, ma_device_type_playback, callback, pUserData);\n    ma_context_enumerate_devices_by_type__wasapi(pContext, pDeviceEnumerator, ma_device_type_capture,  callback, pUserData);\n\n    ma_IMMDeviceEnumerator_Release(pDeviceEnumerator);\n#else\n    /*\n    UWP\n\n    The MMDevice API is only supported on desktop applications. For now, while I'm still figuring out how to properly enumerate\n    over devices without using MMDevice, I'm restricting devices to defaults.\n\n    Hint: DeviceInformation::FindAllAsync() with DeviceClass.AudioCapture/AudioRender. https://blogs.windows.com/buildingapps/2014/05/15/real-time-audio-in-windows-store-and-windows-phone-apps/\n    */\n    if (callback) {\n        ma_bool32 cbResult = MA_TRUE;\n\n        /* Playback. */\n        if (cbResult) {\n            ma_device_info deviceInfo;\n            MA_ZERO_OBJECT(&deviceInfo);\n            ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n            deviceInfo.isDefault = MA_TRUE;\n            cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n        }\n\n        /* Capture. */\n        if (cbResult) {\n            ma_device_info deviceInfo;\n            MA_ZERO_OBJECT(&deviceInfo);\n            ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n            deviceInfo.isDefault = MA_TRUE;\n            cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n        }\n    }\n#endif\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_get_device_info__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    ma_result result;\n    ma_IMMDevice* pMMDevice = NULL;\n    WCHAR* pDefaultDeviceID = NULL;\n\n    result = ma_context_get_MMDevice__wasapi(pContext, deviceType, pDeviceID, &pMMDevice);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* We need the default device ID so we can set the isDefault flag in the device info. */\n    pDefaultDeviceID = ma_context_get_default_device_id__wasapi(pContext, deviceType);\n\n    result = ma_context_get_device_info_from_MMDevice__wasapi(pContext, pMMDevice, pDefaultDeviceID, MA_FALSE, pDeviceInfo);   /* MA_FALSE = !onlySimpleInfo. */\n\n    if (pDefaultDeviceID != NULL) {\n        ma_CoTaskMemFree(pContext, pDefaultDeviceID);\n        pDefaultDeviceID = NULL;\n    }\n\n    ma_IMMDevice_Release(pMMDevice);\n\n    return result;\n#else\n    ma_IAudioClient* pAudioClient;\n    ma_result result;\n\n    /* UWP currently only uses default devices. */\n    if (deviceType == ma_device_type_playback) {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n    } else {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n    }\n\n    result = ma_context_get_IAudioClient_UWP__wasapi(pContext, deviceType, pDeviceID, NULL, &pAudioClient, NULL);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = ma_context_get_device_info_from_IAudioClient__wasapi(pContext, NULL, pAudioClient, pDeviceInfo);\n\n    pDeviceInfo->isDefault = MA_TRUE;  /* UWP only supports default devices. */\n\n    ma_IAudioClient_Release(pAudioClient);\n    return result;\n#endif\n}\n\nstatic ma_result ma_device_uninit__wasapi(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    if (pDevice->wasapi.pDeviceEnumerator) {\n        ((ma_IMMDeviceEnumerator*)pDevice->wasapi.pDeviceEnumerator)->lpVtbl->UnregisterEndpointNotificationCallback((ma_IMMDeviceEnumerator*)pDevice->wasapi.pDeviceEnumerator, &pDevice->wasapi.notificationClient);\n        ma_IMMDeviceEnumerator_Release((ma_IMMDeviceEnumerator*)pDevice->wasapi.pDeviceEnumerator);\n    }\n#endif\n\n    if (pDevice->wasapi.pRenderClient) {\n        if (pDevice->wasapi.pMappedBufferPlayback != NULL) {\n            ma_IAudioRenderClient_ReleaseBuffer((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient, pDevice->wasapi.mappedBufferPlaybackCap, 0);\n            pDevice->wasapi.pMappedBufferPlayback   = NULL;\n            pDevice->wasapi.mappedBufferPlaybackCap = 0;\n            pDevice->wasapi.mappedBufferPlaybackLen = 0;\n        }\n\n        ma_IAudioRenderClient_Release((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient);\n    }\n    if (pDevice->wasapi.pCaptureClient) {\n        if (pDevice->wasapi.pMappedBufferCapture != NULL) {\n            ma_IAudioCaptureClient_ReleaseBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, pDevice->wasapi.mappedBufferCaptureCap);\n            pDevice->wasapi.pMappedBufferCapture   = NULL;\n            pDevice->wasapi.mappedBufferCaptureCap = 0;\n            pDevice->wasapi.mappedBufferCaptureLen = 0;\n        }\n\n        ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient);\n    }\n\n    if (pDevice->wasapi.pAudioClientPlayback) {\n        ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback);\n    }\n    if (pDevice->wasapi.pAudioClientCapture) {\n        ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n    }\n\n    if (pDevice->wasapi.hEventPlayback) {\n        CloseHandle((HANDLE)pDevice->wasapi.hEventPlayback);\n    }\n    if (pDevice->wasapi.hEventCapture) {\n        CloseHandle((HANDLE)pDevice->wasapi.hEventCapture);\n    }\n\n    return MA_SUCCESS;\n}\n\n\ntypedef struct\n{\n    /* Input. */\n    ma_format formatIn;\n    ma_uint32 channelsIn;\n    ma_uint32 sampleRateIn;\n    ma_channel channelMapIn[MA_MAX_CHANNELS];\n    ma_uint32 periodSizeInFramesIn;\n    ma_uint32 periodSizeInMillisecondsIn;\n    ma_uint32 periodsIn;\n    ma_share_mode shareMode;\n    ma_performance_profile performanceProfile;\n    ma_bool32 noAutoConvertSRC;\n    ma_bool32 noDefaultQualitySRC;\n    ma_bool32 noHardwareOffloading;\n    ma_uint32 loopbackProcessID;\n    ma_bool32 loopbackProcessExclude;\n\n    /* Output. */\n    ma_IAudioClient* pAudioClient;\n    ma_IAudioRenderClient* pRenderClient;\n    ma_IAudioCaptureClient* pCaptureClient;\n    ma_format formatOut;\n    ma_uint32 channelsOut;\n    ma_uint32 sampleRateOut;\n    ma_channel channelMapOut[MA_MAX_CHANNELS];\n    ma_uint32 periodSizeInFramesOut;\n    ma_uint32 periodsOut;\n    ma_bool32 usingAudioClient3;\n    char deviceName[256];\n    ma_device_id id;\n} ma_device_init_internal_data__wasapi;\n\nstatic ma_result ma_device_init_internal__wasapi(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_init_internal_data__wasapi* pData)\n{\n    HRESULT hr;\n    ma_result result = MA_SUCCESS;\n    const char* errorMsg = \"\";\n    MA_AUDCLNT_SHAREMODE shareMode = MA_AUDCLNT_SHAREMODE_SHARED;\n    DWORD streamFlags = 0;\n    MA_REFERENCE_TIME periodDurationInMicroseconds;\n    ma_bool32 wasInitializedUsingIAudioClient3 = MA_FALSE;\n    MA_WAVEFORMATEXTENSIBLE wf;\n    ma_WASAPIDeviceInterface* pDeviceInterface = NULL;\n    ma_IAudioClient2* pAudioClient2;\n    ma_uint32 nativeSampleRate;\n    ma_bool32 usingProcessLoopback = MA_FALSE;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pData != NULL);\n\n    /* This function is only used to initialize one device type: either playback, capture or loopback. Never full-duplex. */\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n    usingProcessLoopback = deviceType == ma_device_type_loopback && pData->loopbackProcessID != 0 && pDeviceID == NULL;\n\n    pData->pAudioClient = NULL;\n    pData->pRenderClient = NULL;\n    pData->pCaptureClient = NULL;\n\n    streamFlags = MA_AUDCLNT_STREAMFLAGS_EVENTCALLBACK;\n    if (!pData->noAutoConvertSRC && pData->sampleRateIn != 0 && pData->shareMode != ma_share_mode_exclusive) {    /* <-- Exclusive streams must use the native sample rate. */\n        streamFlags |= MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM;\n    }\n    if (!pData->noDefaultQualitySRC && pData->sampleRateIn != 0 && (streamFlags & MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM) != 0) {\n        streamFlags |= MA_AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY;\n    }\n    if (deviceType == ma_device_type_loopback) {\n        streamFlags |= MA_AUDCLNT_STREAMFLAGS_LOOPBACK;\n    }\n\n    result = ma_context_get_IAudioClient__wasapi(pContext, deviceType, pDeviceID, pData->loopbackProcessID, pData->loopbackProcessExclude, &pData->pAudioClient, &pDeviceInterface);\n    if (result != MA_SUCCESS) {\n        goto done;\n    }\n\n    MA_ZERO_OBJECT(&wf);\n\n    /* Try enabling hardware offloading. */\n    if (!pData->noHardwareOffloading) {\n        hr = ma_IAudioClient_QueryInterface(pData->pAudioClient, &MA_IID_IAudioClient2, (void**)&pAudioClient2);\n        if (SUCCEEDED(hr)) {\n            BOOL isHardwareOffloadingSupported = 0;\n            hr = ma_IAudioClient2_IsOffloadCapable(pAudioClient2, MA_AudioCategory_Other, &isHardwareOffloadingSupported);\n            if (SUCCEEDED(hr) && isHardwareOffloadingSupported) {\n                ma_AudioClientProperties clientProperties;\n                MA_ZERO_OBJECT(&clientProperties);\n                clientProperties.cbSize = sizeof(clientProperties);\n                clientProperties.bIsOffload = 1;\n                clientProperties.eCategory = MA_AudioCategory_Other;\n                ma_IAudioClient2_SetClientProperties(pAudioClient2, &clientProperties);\n            }\n\n            pAudioClient2->lpVtbl->Release(pAudioClient2);\n        }\n    }\n\n    /* Here is where we try to determine the best format to use with the device. If the client if wanting exclusive mode, first try finding the best format for that. If this fails, fall back to shared mode. */\n    result = MA_FORMAT_NOT_SUPPORTED;\n    if (pData->shareMode == ma_share_mode_exclusive) {\n    #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n        /* In exclusive mode on desktop we always use the backend's native format. */\n        ma_IPropertyStore* pStore = NULL;\n        hr = ma_IMMDevice_OpenPropertyStore(pDeviceInterface, STGM_READ, &pStore);\n        if (SUCCEEDED(hr)) {\n            MA_PROPVARIANT prop;\n            ma_PropVariantInit(&prop);\n            hr = ma_IPropertyStore_GetValue(pStore, &MA_PKEY_AudioEngine_DeviceFormat, &prop);\n            if (SUCCEEDED(hr)) {\n                MA_WAVEFORMATEX* pActualFormat = (MA_WAVEFORMATEX*)prop.blob.pBlobData;\n                hr = ma_IAudioClient_IsFormatSupported((ma_IAudioClient*)pData->pAudioClient, MA_AUDCLNT_SHAREMODE_EXCLUSIVE, pActualFormat, NULL);\n                if (SUCCEEDED(hr)) {\n                    MA_COPY_MEMORY(&wf, pActualFormat, sizeof(MA_WAVEFORMATEXTENSIBLE));\n                }\n\n                ma_PropVariantClear(pContext, &prop);\n            }\n\n            ma_IPropertyStore_Release(pStore);\n        }\n    #else\n        /*\n        I do not know how to query the device's native format on UWP so for now I'm just disabling support for\n        exclusive mode. The alternative is to enumerate over different formats and check IsFormatSupported()\n        until you find one that works.\n\n        TODO: Add support for exclusive mode to UWP.\n        */\n        hr = S_FALSE;\n    #endif\n\n        if (hr == S_OK) {\n            shareMode = MA_AUDCLNT_SHAREMODE_EXCLUSIVE;\n            result = MA_SUCCESS;\n        } else {\n            result = MA_SHARE_MODE_NOT_SUPPORTED;\n        }\n    } else {\n        /* In shared mode we are always using the format reported by the operating system. */\n        MA_WAVEFORMATEXTENSIBLE* pNativeFormat = NULL;\n        hr = ma_IAudioClient_GetMixFormat((ma_IAudioClient*)pData->pAudioClient, (MA_WAVEFORMATEX**)&pNativeFormat);\n        if (hr != S_OK) {\n            /* When using process-specific loopback, GetMixFormat() seems to always fail. */\n            if (usingProcessLoopback) {\n                wf.wFormatTag      = WAVE_FORMAT_IEEE_FLOAT;\n                wf.nChannels       = 2;\n                wf.nSamplesPerSec  = 44100;\n                wf.wBitsPerSample  = 32;\n                wf.nBlockAlign     = wf.nChannels * wf.wBitsPerSample / 8;\n                wf.nAvgBytesPerSec = wf.nSamplesPerSec * wf.nBlockAlign;\n                wf.cbSize          = sizeof(MA_WAVEFORMATEX);\n\n                result = MA_SUCCESS;\n            } else {\n                result = MA_FORMAT_NOT_SUPPORTED;\n            }\n        } else {\n            /*\n            I've seen cases where cbSize will be set to sizeof(WAVEFORMATEX) even though the structure itself\n            is given the format tag of WAVE_FORMAT_EXTENSIBLE. If the format tag is WAVE_FORMAT_EXTENSIBLE\n            want to make sure we copy the whole WAVEFORMATEXTENSIBLE structure. Otherwise we'll have to be\n            safe and only copy the WAVEFORMATEX part.\n            */\n            if (pNativeFormat->wFormatTag == WAVE_FORMAT_EXTENSIBLE) {\n                MA_COPY_MEMORY(&wf, pNativeFormat, sizeof(MA_WAVEFORMATEXTENSIBLE));\n            } else {\n                /* I've seen a case where cbSize was set to 0. Assume sizeof(WAVEFORMATEX) in this case. */\n                size_t cbSize = pNativeFormat->cbSize;\n                if (cbSize == 0) {\n                    cbSize = sizeof(MA_WAVEFORMATEX);\n                }\n\n                /* Make sure we don't copy more than the capacity of `wf`. */\n                if (cbSize > sizeof(wf)) {\n                    cbSize = sizeof(wf);\n                }\n\n                MA_COPY_MEMORY(&wf, pNativeFormat, cbSize);\n            }\n\n            result = MA_SUCCESS;\n        }\n\n        ma_CoTaskMemFree(pContext, pNativeFormat);\n\n        shareMode = MA_AUDCLNT_SHAREMODE_SHARED;\n    }\n\n    /* Return an error if we still haven't found a format. */\n    if (result != MA_SUCCESS) {\n        errorMsg = \"[WASAPI] Failed to find best device mix format.\";\n        goto done;\n    }\n\n    /*\n    Override the native sample rate with the one requested by the caller, but only if we're not using the default sample rate. We'll use\n    WASAPI to perform the sample rate conversion.\n    */\n    nativeSampleRate = wf.nSamplesPerSec;\n    if (streamFlags & MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM) {\n        wf.nSamplesPerSec = (pData->sampleRateIn != 0) ? pData->sampleRateIn : MA_DEFAULT_SAMPLE_RATE;\n        wf.nAvgBytesPerSec = wf.nSamplesPerSec * wf.nBlockAlign;\n    }\n\n    pData->formatOut = ma_format_from_WAVEFORMATEX((MA_WAVEFORMATEX*)&wf);\n    if (pData->formatOut == ma_format_unknown) {\n        /*\n        The format isn't supported. This is almost certainly because the exclusive mode format isn't supported by miniaudio. We need to return MA_SHARE_MODE_NOT_SUPPORTED\n        in this case so that the caller can detect it and fall back to shared mode if desired. We should never get here if shared mode was requested, but just for\n        completeness we'll check for it and return MA_FORMAT_NOT_SUPPORTED.\n        */\n        if (shareMode == MA_AUDCLNT_SHAREMODE_EXCLUSIVE) {\n            result = MA_SHARE_MODE_NOT_SUPPORTED;\n        } else {\n            result = MA_FORMAT_NOT_SUPPORTED;\n        }\n\n        errorMsg = \"[WASAPI] Native format not supported.\";\n        goto done;\n    }\n\n    pData->channelsOut = wf.nChannels;\n    pData->sampleRateOut = wf.nSamplesPerSec;\n\n    /*\n    Get the internal channel map based on the channel mask. There is a possibility that GetMixFormat() returns\n    a WAVEFORMATEX instead of a WAVEFORMATEXTENSIBLE, in which case the channel mask will be undefined. In this\n    case we'll just use the default channel map.\n    */\n    if (wf.wFormatTag == WAVE_FORMAT_EXTENSIBLE || wf.cbSize >= sizeof(MA_WAVEFORMATEXTENSIBLE)) {\n        ma_channel_mask_to_channel_map__win32(wf.dwChannelMask, pData->channelsOut, pData->channelMapOut);\n    } else {\n        ma_channel_map_init_standard(ma_standard_channel_map_microsoft, pData->channelMapOut, ma_countof(pData->channelMapOut), pData->channelsOut);\n    }\n\n    /* Period size. */\n    pData->periodsOut = (pData->periodsIn != 0) ? pData->periodsIn : MA_DEFAULT_PERIODS;\n    pData->periodSizeInFramesOut = pData->periodSizeInFramesIn;\n    if (pData->periodSizeInFramesOut == 0) {\n        if (pData->periodSizeInMillisecondsIn == 0) {\n            if (pData->performanceProfile == ma_performance_profile_low_latency) {\n                pData->periodSizeInFramesOut = ma_calculate_buffer_size_in_frames_from_milliseconds(MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_LOW_LATENCY, wf.nSamplesPerSec);\n            } else {\n                pData->periodSizeInFramesOut = ma_calculate_buffer_size_in_frames_from_milliseconds(MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE, wf.nSamplesPerSec);\n            }\n        } else {\n            pData->periodSizeInFramesOut = ma_calculate_buffer_size_in_frames_from_milliseconds(pData->periodSizeInMillisecondsIn, wf.nSamplesPerSec);\n        }\n    }\n\n    periodDurationInMicroseconds = ((ma_uint64)pData->periodSizeInFramesOut * 1000 * 1000) / wf.nSamplesPerSec;\n\n\n    /* Slightly different initialization for shared and exclusive modes. We try exclusive mode first, and if it fails, fall back to shared mode. */\n    if (shareMode == MA_AUDCLNT_SHAREMODE_EXCLUSIVE) {\n        MA_REFERENCE_TIME bufferDuration = periodDurationInMicroseconds * pData->periodsOut * 10;\n\n        /*\n        If the periodicy is too small, Initialize() will fail with AUDCLNT_E_INVALID_DEVICE_PERIOD. In this case we should just keep increasing\n        it and trying it again.\n        */\n        hr = E_FAIL;\n        for (;;) {\n            hr = ma_IAudioClient_Initialize((ma_IAudioClient*)pData->pAudioClient, shareMode, streamFlags, bufferDuration, bufferDuration, (MA_WAVEFORMATEX*)&wf, NULL);\n            if (hr == MA_AUDCLNT_E_INVALID_DEVICE_PERIOD) {\n                if (bufferDuration > 500*10000) {\n                    break;\n                } else {\n                    if (bufferDuration == 0) {  /* <-- Just a sanity check to prevent an infinit loop. Should never happen, but it makes me feel better. */\n                        break;\n                    }\n\n                    bufferDuration = bufferDuration * 2;\n                    continue;\n                }\n            } else {\n                break;\n            }\n        }\n\n        if (hr == MA_AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED) {\n            ma_uint32 bufferSizeInFrames;\n            hr = ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pData->pAudioClient, &bufferSizeInFrames);\n            if (SUCCEEDED(hr)) {\n                bufferDuration = (MA_REFERENCE_TIME)((10000.0 * 1000 / wf.nSamplesPerSec * bufferSizeInFrames) + 0.5);\n\n                /* Unfortunately we need to release and re-acquire the audio client according to MSDN. Seems silly - why not just call IAudioClient_Initialize() again?! */\n                ma_IAudioClient_Release((ma_IAudioClient*)pData->pAudioClient);\n\n            #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n                hr = ma_IMMDevice_Activate(pDeviceInterface, &MA_IID_IAudioClient, CLSCTX_ALL, NULL, (void**)&pData->pAudioClient);\n            #else\n                hr = ma_IUnknown_QueryInterface(pDeviceInterface, &MA_IID_IAudioClient, (void**)&pData->pAudioClient);\n            #endif\n\n                if (SUCCEEDED(hr)) {\n                    hr = ma_IAudioClient_Initialize((ma_IAudioClient*)pData->pAudioClient, shareMode, streamFlags, bufferDuration, bufferDuration, (MA_WAVEFORMATEX*)&wf, NULL);\n                }\n            }\n        }\n\n        if (FAILED(hr)) {\n            /* Failed to initialize in exclusive mode. Don't fall back to shared mode - instead tell the client about it. They can reinitialize in shared mode if they want. */\n            if (hr == E_ACCESSDENIED) {\n                errorMsg = \"[WASAPI] Failed to initialize device in exclusive mode. Access denied.\", result = MA_ACCESS_DENIED;\n            } else if (hr == MA_AUDCLNT_E_DEVICE_IN_USE) {\n                errorMsg = \"[WASAPI] Failed to initialize device in exclusive mode. Device in use.\", result = MA_BUSY;\n            } else {\n                errorMsg = \"[WASAPI] Failed to initialize device in exclusive mode.\"; result = ma_result_from_HRESULT(hr);\n            }\n            goto done;\n        }\n    }\n\n    if (shareMode == MA_AUDCLNT_SHAREMODE_SHARED) {\n        /*\n        Low latency shared mode via IAudioClient3.\n\n        NOTE\n        ====\n        Contrary to the documentation on MSDN (https://docs.microsoft.com/en-us/windows/win32/api/audioclient/nf-audioclient-iaudioclient3-initializesharedaudiostream), the\n        use of AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM and AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY with IAudioClient3_InitializeSharedAudioStream() absolutely does not work. Using\n        any of these flags will result in HRESULT code 0x88890021. The other problem is that calling IAudioClient3_GetSharedModeEnginePeriod() with a sample rate different to\n        that returned by IAudioClient_GetMixFormat() also results in an error. I'm therefore disabling low-latency shared mode with AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM.\n        */\n        #ifndef MA_WASAPI_NO_LOW_LATENCY_SHARED_MODE\n        {\n            if ((streamFlags & MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM) == 0 || nativeSampleRate == wf.nSamplesPerSec) {\n                ma_IAudioClient3* pAudioClient3 = NULL;\n                hr = ma_IAudioClient_QueryInterface(pData->pAudioClient, &MA_IID_IAudioClient3, (void**)&pAudioClient3);\n                if (SUCCEEDED(hr)) {\n                    ma_uint32 defaultPeriodInFrames;\n                    ma_uint32 fundamentalPeriodInFrames;\n                    ma_uint32 minPeriodInFrames;\n                    ma_uint32 maxPeriodInFrames;\n                    hr = ma_IAudioClient3_GetSharedModeEnginePeriod(pAudioClient3, (MA_WAVEFORMATEX*)&wf, &defaultPeriodInFrames, &fundamentalPeriodInFrames, &minPeriodInFrames, &maxPeriodInFrames);\n                    if (SUCCEEDED(hr)) {\n                        ma_uint32 desiredPeriodInFrames = pData->periodSizeInFramesOut;\n                        ma_uint32 actualPeriodInFrames  = desiredPeriodInFrames;\n\n                        /* Make sure the period size is a multiple of fundamentalPeriodInFrames. */\n                        actualPeriodInFrames = actualPeriodInFrames / fundamentalPeriodInFrames;\n                        actualPeriodInFrames = actualPeriodInFrames * fundamentalPeriodInFrames;\n\n                        /* The period needs to be clamped between minPeriodInFrames and maxPeriodInFrames. */\n                        actualPeriodInFrames = ma_clamp(actualPeriodInFrames, minPeriodInFrames, maxPeriodInFrames);\n\n                        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Trying IAudioClient3_InitializeSharedAudioStream(actualPeriodInFrames=%d)\\n\", actualPeriodInFrames);\n                        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"    defaultPeriodInFrames=%d\\n\", defaultPeriodInFrames);\n                        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"    fundamentalPeriodInFrames=%d\\n\", fundamentalPeriodInFrames);\n                        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"    minPeriodInFrames=%d\\n\", minPeriodInFrames);\n                        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"    maxPeriodInFrames=%d\\n\", maxPeriodInFrames);\n\n                        /* If the client requested a largish buffer than we don't actually want to use low latency shared mode because it forces small buffers. */\n                        if (actualPeriodInFrames >= desiredPeriodInFrames) {\n                            /*\n                            MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | MA_AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY must not be in the stream flags. If either of these are specified,\n                            IAudioClient3_InitializeSharedAudioStream() will fail.\n                            */\n                            hr = ma_IAudioClient3_InitializeSharedAudioStream(pAudioClient3, streamFlags & ~(MA_AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | MA_AUDCLNT_STREAMFLAGS_SRC_DEFAULT_QUALITY), actualPeriodInFrames, (MA_WAVEFORMATEX*)&wf, NULL);\n                            if (SUCCEEDED(hr)) {\n                                wasInitializedUsingIAudioClient3 = MA_TRUE;\n                                pData->periodSizeInFramesOut = actualPeriodInFrames;\n\n                                ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Using IAudioClient3\\n\");\n                                ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"    periodSizeInFramesOut=%d\\n\", pData->periodSizeInFramesOut);\n                            } else {\n                                ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"[WASAPI] IAudioClient3_InitializeSharedAudioStream failed. Falling back to IAudioClient.\\n\");\n                            }\n                        } else {\n                            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Not using IAudioClient3 because the desired period size is larger than the maximum supported by IAudioClient3.\\n\");\n                        }\n                    } else {\n                        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"[WASAPI] IAudioClient3_GetSharedModeEnginePeriod failed. Falling back to IAudioClient.\\n\");\n                    }\n\n                    ma_IAudioClient3_Release(pAudioClient3);\n                    pAudioClient3 = NULL;\n                }\n            }\n        }\n        #else\n        {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Not using IAudioClient3 because MA_WASAPI_NO_LOW_LATENCY_SHARED_MODE is enabled.\\n\");\n        }\n        #endif\n\n        /* If we don't have an IAudioClient3 then we need to use the normal initialization routine. */\n        if (!wasInitializedUsingIAudioClient3) {\n            MA_REFERENCE_TIME bufferDuration = periodDurationInMicroseconds * pData->periodsOut * 10;   /* <-- Multiply by 10 for microseconds to 100-nanoseconds. */\n            hr = ma_IAudioClient_Initialize((ma_IAudioClient*)pData->pAudioClient, shareMode, streamFlags, bufferDuration, 0, (const MA_WAVEFORMATEX*)&wf, NULL);\n            if (FAILED(hr)) {\n                if (hr == E_ACCESSDENIED) {\n                    errorMsg = \"[WASAPI] Failed to initialize device. Access denied.\", result = MA_ACCESS_DENIED;\n                } else if (hr == MA_AUDCLNT_E_DEVICE_IN_USE) {\n                    errorMsg = \"[WASAPI] Failed to initialize device. Device in use.\", result = MA_BUSY;\n                } else {\n                    errorMsg = \"[WASAPI] Failed to initialize device.\", result = ma_result_from_HRESULT(hr);\n                }\n\n                goto done;\n            }\n        }\n    }\n\n    if (!wasInitializedUsingIAudioClient3) {\n        ma_uint32 bufferSizeInFrames = 0;\n        hr = ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pData->pAudioClient, &bufferSizeInFrames);\n        if (FAILED(hr)) {\n            errorMsg = \"[WASAPI] Failed to get audio client's actual buffer size.\", result = ma_result_from_HRESULT(hr);\n            goto done;\n        }\n\n        /*\n        When using process loopback mode, retrieval of the buffer size seems to result in totally\n        incorrect values. In this case we'll just assume it's the same size as what we requested\n        when we initialized the client.\n        */\n        if (usingProcessLoopback) {\n            bufferSizeInFrames = (ma_uint32)((periodDurationInMicroseconds * pData->periodsOut) * pData->sampleRateOut / 1000000);\n        }\n\n        pData->periodSizeInFramesOut = bufferSizeInFrames / pData->periodsOut;\n    }\n\n    pData->usingAudioClient3 = wasInitializedUsingIAudioClient3;\n\n\n    if (deviceType == ma_device_type_playback) {\n        result = ma_device_create_IAudioClient_service__wasapi(pContext, deviceType, (ma_IAudioClient*)pData->pAudioClient, (void**)&pData->pRenderClient);\n    } else {\n        result = ma_device_create_IAudioClient_service__wasapi(pContext, deviceType, (ma_IAudioClient*)pData->pAudioClient, (void**)&pData->pCaptureClient);\n    }\n\n    /*if (FAILED(hr)) {*/\n    if (result != MA_SUCCESS) {\n        errorMsg = \"[WASAPI] Failed to get audio client service.\";\n        goto done;\n    }\n\n\n    /* Grab the name of the device. */\n    #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    {\n        ma_IPropertyStore *pProperties;\n        hr = ma_IMMDevice_OpenPropertyStore(pDeviceInterface, STGM_READ, &pProperties);\n        if (SUCCEEDED(hr)) {\n            MA_PROPVARIANT varName;\n            ma_PropVariantInit(&varName);\n            hr = ma_IPropertyStore_GetValue(pProperties, &MA_PKEY_Device_FriendlyName, &varName);\n            if (SUCCEEDED(hr)) {\n                WideCharToMultiByte(CP_UTF8, 0, varName.pwszVal, -1, pData->deviceName, sizeof(pData->deviceName), 0, FALSE);\n                ma_PropVariantClear(pContext, &varName);\n            }\n\n            ma_IPropertyStore_Release(pProperties);\n        }\n    }\n    #endif\n\n    /*\n    For the WASAPI backend we need to know the actual IDs of the device in order to do automatic\n    stream routing so that IDs can be compared and we can determine which device has been detached\n    and whether or not it matches with our ma_device.\n    */\n    #if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    {\n        /* Desktop */\n        ma_context_get_device_id_from_MMDevice__wasapi(pContext, pDeviceInterface, &pData->id);\n    }\n    #else\n    {\n        /* UWP */\n        /* TODO: Implement me. Need to figure out how to get the ID of the default device. */\n    }\n    #endif\n\ndone:\n    /* Clean up. */\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    if (pDeviceInterface != NULL) {\n        ma_IMMDevice_Release(pDeviceInterface);\n    }\n#else\n    if (pDeviceInterface != NULL) {\n        ma_IUnknown_Release(pDeviceInterface);\n    }\n#endif\n\n    if (result != MA_SUCCESS) {\n        if (pData->pRenderClient) {\n            ma_IAudioRenderClient_Release((ma_IAudioRenderClient*)pData->pRenderClient);\n            pData->pRenderClient = NULL;\n        }\n        if (pData->pCaptureClient) {\n            ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pData->pCaptureClient);\n            pData->pCaptureClient = NULL;\n        }\n        if (pData->pAudioClient) {\n            ma_IAudioClient_Release((ma_IAudioClient*)pData->pAudioClient);\n            pData->pAudioClient = NULL;\n        }\n\n        if (errorMsg != NULL && errorMsg[0] != '\\0') {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"%s\\n\", errorMsg);\n        }\n\n        return result;\n    } else {\n        return MA_SUCCESS;\n    }\n}\n\nstatic ma_result ma_device_reinit__wasapi(ma_device* pDevice, ma_device_type deviceType)\n{\n    ma_device_init_internal_data__wasapi data;\n    ma_result result;\n\n    MA_ASSERT(pDevice != NULL);\n\n    /* We only re-initialize the playback or capture device. Never a full-duplex device. */\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n\n    /*\n    Before reinitializing the device we need to free the previous audio clients.\n\n    There's a known memory leak here. We will be calling this from the routing change callback that\n    is fired by WASAPI. If we attempt to release the IAudioClient we will deadlock. In my opinion\n    this is a bug. I'm not sure what I need to do to handle this cleanly, but I think we'll probably\n    need some system where we post an event, but delay the execution of it until the callback has\n    returned. I'm not sure how to do this reliably, however. I have set up some infrastructure for\n    a command thread which might be useful for this.\n    */\n    if (deviceType == ma_device_type_capture || deviceType == ma_device_type_loopback) {\n        if (pDevice->wasapi.pCaptureClient) {\n            ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient);\n            pDevice->wasapi.pCaptureClient = NULL;\n        }\n\n        if (pDevice->wasapi.pAudioClientCapture) {\n            /*ma_device_release_IAudioClient_service__wasapi(pDevice, ma_device_type_capture);*/\n            pDevice->wasapi.pAudioClientCapture = NULL;\n        }\n    }\n\n    if (deviceType == ma_device_type_playback) {\n        if (pDevice->wasapi.pRenderClient) {\n            ma_IAudioRenderClient_Release((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient);\n            pDevice->wasapi.pRenderClient = NULL;\n        }\n\n        if (pDevice->wasapi.pAudioClientPlayback) {\n            /*ma_device_release_IAudioClient_service__wasapi(pDevice, ma_device_type_playback);*/\n            pDevice->wasapi.pAudioClientPlayback = NULL;\n        }\n    }\n\n\n    if (deviceType == ma_device_type_playback) {\n        data.formatIn               = pDevice->playback.format;\n        data.channelsIn             = pDevice->playback.channels;\n        MA_COPY_MEMORY(data.channelMapIn, pDevice->playback.channelMap, sizeof(pDevice->playback.channelMap));\n        data.shareMode              = pDevice->playback.shareMode;\n    } else {\n        data.formatIn               = pDevice->capture.format;\n        data.channelsIn             = pDevice->capture.channels;\n        MA_COPY_MEMORY(data.channelMapIn, pDevice->capture.channelMap, sizeof(pDevice->capture.channelMap));\n        data.shareMode              = pDevice->capture.shareMode;\n    }\n\n    data.sampleRateIn               = pDevice->sampleRate;\n    data.periodSizeInFramesIn       = pDevice->wasapi.originalPeriodSizeInFrames;\n    data.periodSizeInMillisecondsIn = pDevice->wasapi.originalPeriodSizeInMilliseconds;\n    data.periodsIn                  = pDevice->wasapi.originalPeriods;\n    data.performanceProfile         = pDevice->wasapi.originalPerformanceProfile;\n    data.noAutoConvertSRC           = pDevice->wasapi.noAutoConvertSRC;\n    data.noDefaultQualitySRC        = pDevice->wasapi.noDefaultQualitySRC;\n    data.noHardwareOffloading       = pDevice->wasapi.noHardwareOffloading;\n    data.loopbackProcessID          = pDevice->wasapi.loopbackProcessID;\n    data.loopbackProcessExclude     = pDevice->wasapi.loopbackProcessExclude;\n    result = ma_device_init_internal__wasapi(pDevice->pContext, deviceType, NULL, &data);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* At this point we have some new objects ready to go. We need to uninitialize the previous ones and then set the new ones. */\n    if (deviceType == ma_device_type_capture || deviceType == ma_device_type_loopback) {\n        pDevice->wasapi.pAudioClientCapture         = data.pAudioClient;\n        pDevice->wasapi.pCaptureClient              = data.pCaptureClient;\n\n        pDevice->capture.internalFormat             = data.formatOut;\n        pDevice->capture.internalChannels           = data.channelsOut;\n        pDevice->capture.internalSampleRate         = data.sampleRateOut;\n        MA_COPY_MEMORY(pDevice->capture.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDevice->capture.internalPeriodSizeInFrames = data.periodSizeInFramesOut;\n        pDevice->capture.internalPeriods            = data.periodsOut;\n        ma_strcpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), data.deviceName);\n\n        ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, (HANDLE)pDevice->wasapi.hEventCapture);\n\n        pDevice->wasapi.periodSizeInFramesCapture = data.periodSizeInFramesOut;\n        ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, &pDevice->wasapi.actualBufferSizeInFramesCapture);\n\n        /* We must always have a valid ID. */\n        ma_strcpy_s_WCHAR(pDevice->capture.id.wasapi, sizeof(pDevice->capture.id.wasapi), data.id.wasapi);\n    }\n\n    if (deviceType == ma_device_type_playback) {\n        pDevice->wasapi.pAudioClientPlayback         = data.pAudioClient;\n        pDevice->wasapi.pRenderClient                = data.pRenderClient;\n\n        pDevice->playback.internalFormat             = data.formatOut;\n        pDevice->playback.internalChannels           = data.channelsOut;\n        pDevice->playback.internalSampleRate         = data.sampleRateOut;\n        MA_COPY_MEMORY(pDevice->playback.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDevice->playback.internalPeriodSizeInFrames = data.periodSizeInFramesOut;\n        pDevice->playback.internalPeriods            = data.periodsOut;\n        ma_strcpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), data.deviceName);\n\n        ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, (HANDLE)pDevice->wasapi.hEventPlayback);\n\n        pDevice->wasapi.periodSizeInFramesPlayback = data.periodSizeInFramesOut;\n        ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, &pDevice->wasapi.actualBufferSizeInFramesPlayback);\n\n        /* We must always have a valid ID because rerouting will look at it. */\n        ma_strcpy_s_WCHAR(pDevice->playback.id.wasapi, sizeof(pDevice->playback.id.wasapi), data.id.wasapi);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_init__wasapi(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n    ma_result result = MA_SUCCESS;\n\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    HRESULT hr;\n    ma_IMMDeviceEnumerator* pDeviceEnumerator;\n#endif\n\n    MA_ASSERT(pDevice != NULL);\n\n    MA_ZERO_OBJECT(&pDevice->wasapi);\n    pDevice->wasapi.usage                  = pConfig->wasapi.usage;\n    pDevice->wasapi.noAutoConvertSRC       = pConfig->wasapi.noAutoConvertSRC;\n    pDevice->wasapi.noDefaultQualitySRC    = pConfig->wasapi.noDefaultQualitySRC;\n    pDevice->wasapi.noHardwareOffloading   = pConfig->wasapi.noHardwareOffloading;\n    pDevice->wasapi.loopbackProcessID      = pConfig->wasapi.loopbackProcessID;\n    pDevice->wasapi.loopbackProcessExclude = pConfig->wasapi.loopbackProcessExclude;\n\n    /* Exclusive mode is not allowed with loopback. */\n    if (pConfig->deviceType == ma_device_type_loopback && pConfig->playback.shareMode == ma_share_mode_exclusive) {\n        return MA_INVALID_DEVICE_CONFIG;\n    }\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex || pConfig->deviceType == ma_device_type_loopback) {\n        ma_device_init_internal_data__wasapi data;\n        data.formatIn                   = pDescriptorCapture->format;\n        data.channelsIn                 = pDescriptorCapture->channels;\n        data.sampleRateIn               = pDescriptorCapture->sampleRate;\n        MA_COPY_MEMORY(data.channelMapIn, pDescriptorCapture->channelMap, sizeof(pDescriptorCapture->channelMap));\n        data.periodSizeInFramesIn       = pDescriptorCapture->periodSizeInFrames;\n        data.periodSizeInMillisecondsIn = pDescriptorCapture->periodSizeInMilliseconds;\n        data.periodsIn                  = pDescriptorCapture->periodCount;\n        data.shareMode                  = pDescriptorCapture->shareMode;\n        data.performanceProfile         = pConfig->performanceProfile;\n        data.noAutoConvertSRC           = pConfig->wasapi.noAutoConvertSRC;\n        data.noDefaultQualitySRC        = pConfig->wasapi.noDefaultQualitySRC;\n        data.noHardwareOffloading       = pConfig->wasapi.noHardwareOffloading;\n        data.loopbackProcessID          = pConfig->wasapi.loopbackProcessID;\n        data.loopbackProcessExclude     = pConfig->wasapi.loopbackProcessExclude;\n\n        result = ma_device_init_internal__wasapi(pDevice->pContext, (pConfig->deviceType == ma_device_type_loopback) ? ma_device_type_loopback : ma_device_type_capture, pDescriptorCapture->pDeviceID, &data);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pDevice->wasapi.pAudioClientCapture              = data.pAudioClient;\n        pDevice->wasapi.pCaptureClient                   = data.pCaptureClient;\n        pDevice->wasapi.originalPeriodSizeInMilliseconds = pDescriptorCapture->periodSizeInMilliseconds;\n        pDevice->wasapi.originalPeriodSizeInFrames       = pDescriptorCapture->periodSizeInFrames;\n        pDevice->wasapi.originalPeriods                  = pDescriptorCapture->periodCount;\n        pDevice->wasapi.originalPerformanceProfile       = pConfig->performanceProfile;\n\n        /*\n        The event for capture needs to be manual reset for the same reason as playback. We keep the initial state set to unsignaled,\n        however, because we want to block until we actually have something for the first call to ma_device_read().\n        */\n        pDevice->wasapi.hEventCapture = (ma_handle)CreateEventA(NULL, FALSE, FALSE, NULL);  /* Auto reset, unsignaled by default. */\n        if (pDevice->wasapi.hEventCapture == NULL) {\n            result = ma_result_from_GetLastError(GetLastError());\n\n            if (pDevice->wasapi.pCaptureClient != NULL) {\n                ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient);\n                pDevice->wasapi.pCaptureClient = NULL;\n            }\n            if (pDevice->wasapi.pAudioClientCapture != NULL) {\n                ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n                pDevice->wasapi.pAudioClientCapture = NULL;\n            }\n\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to create event for capture.\");\n            return result;\n        }\n        ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, (HANDLE)pDevice->wasapi.hEventCapture);\n\n        pDevice->wasapi.periodSizeInFramesCapture = data.periodSizeInFramesOut;\n        ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture, &pDevice->wasapi.actualBufferSizeInFramesCapture);\n\n        /* We must always have a valid ID. */\n        ma_strcpy_s_WCHAR(pDevice->capture.id.wasapi, sizeof(pDevice->capture.id.wasapi), data.id.wasapi);\n\n        /* The descriptor needs to be updated with actual values. */\n        pDescriptorCapture->format             = data.formatOut;\n        pDescriptorCapture->channels           = data.channelsOut;\n        pDescriptorCapture->sampleRate         = data.sampleRateOut;\n        MA_COPY_MEMORY(pDescriptorCapture->channelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDescriptorCapture->periodSizeInFrames = data.periodSizeInFramesOut;\n        pDescriptorCapture->periodCount        = data.periodsOut;\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_device_init_internal_data__wasapi data;\n        data.formatIn                   = pDescriptorPlayback->format;\n        data.channelsIn                 = pDescriptorPlayback->channels;\n        data.sampleRateIn               = pDescriptorPlayback->sampleRate;\n        MA_COPY_MEMORY(data.channelMapIn, pDescriptorPlayback->channelMap, sizeof(pDescriptorPlayback->channelMap));\n        data.periodSizeInFramesIn       = pDescriptorPlayback->periodSizeInFrames;\n        data.periodSizeInMillisecondsIn = pDescriptorPlayback->periodSizeInMilliseconds;\n        data.periodsIn                  = pDescriptorPlayback->periodCount;\n        data.shareMode                  = pDescriptorPlayback->shareMode;\n        data.performanceProfile         = pConfig->performanceProfile;\n        data.noAutoConvertSRC           = pConfig->wasapi.noAutoConvertSRC;\n        data.noDefaultQualitySRC        = pConfig->wasapi.noDefaultQualitySRC;\n        data.noHardwareOffloading       = pConfig->wasapi.noHardwareOffloading;\n        data.loopbackProcessID          = pConfig->wasapi.loopbackProcessID;\n        data.loopbackProcessExclude     = pConfig->wasapi.loopbackProcessExclude;\n\n        result = ma_device_init_internal__wasapi(pDevice->pContext, ma_device_type_playback, pDescriptorPlayback->pDeviceID, &data);\n        if (result != MA_SUCCESS) {\n            if (pConfig->deviceType == ma_device_type_duplex) {\n                if (pDevice->wasapi.pCaptureClient != NULL) {\n                    ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient);\n                    pDevice->wasapi.pCaptureClient = NULL;\n                }\n                if (pDevice->wasapi.pAudioClientCapture != NULL) {\n                    ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n                    pDevice->wasapi.pAudioClientCapture = NULL;\n                }\n\n                CloseHandle((HANDLE)pDevice->wasapi.hEventCapture);\n                pDevice->wasapi.hEventCapture = NULL;\n            }\n            return result;\n        }\n\n        pDevice->wasapi.pAudioClientPlayback             = data.pAudioClient;\n        pDevice->wasapi.pRenderClient                    = data.pRenderClient;\n        pDevice->wasapi.originalPeriodSizeInMilliseconds = pDescriptorPlayback->periodSizeInMilliseconds;\n        pDevice->wasapi.originalPeriodSizeInFrames       = pDescriptorPlayback->periodSizeInFrames;\n        pDevice->wasapi.originalPeriods                  = pDescriptorPlayback->periodCount;\n        pDevice->wasapi.originalPerformanceProfile       = pConfig->performanceProfile;\n\n        /*\n        The event for playback is needs to be manual reset because we want to explicitly control the fact that it becomes signalled\n        only after the whole available space has been filled, never before.\n\n        The playback event also needs to be initially set to a signaled state so that the first call to ma_device_write() is able\n        to get passed WaitForMultipleObjects().\n        */\n        pDevice->wasapi.hEventPlayback = (ma_handle)CreateEventA(NULL, FALSE, TRUE, NULL);  /* Auto reset, signaled by default. */\n        if (pDevice->wasapi.hEventPlayback == NULL) {\n            result = ma_result_from_GetLastError(GetLastError());\n\n            if (pConfig->deviceType == ma_device_type_duplex) {\n                if (pDevice->wasapi.pCaptureClient != NULL) {\n                    ma_IAudioCaptureClient_Release((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient);\n                    pDevice->wasapi.pCaptureClient = NULL;\n                }\n                if (pDevice->wasapi.pAudioClientCapture != NULL) {\n                    ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n                    pDevice->wasapi.pAudioClientCapture = NULL;\n                }\n\n                CloseHandle((HANDLE)pDevice->wasapi.hEventCapture);\n                pDevice->wasapi.hEventCapture = NULL;\n            }\n\n            if (pDevice->wasapi.pRenderClient != NULL) {\n                ma_IAudioRenderClient_Release((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient);\n                pDevice->wasapi.pRenderClient = NULL;\n            }\n            if (pDevice->wasapi.pAudioClientPlayback != NULL) {\n                ma_IAudioClient_Release((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback);\n                pDevice->wasapi.pAudioClientPlayback = NULL;\n            }\n\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to create event for playback.\");\n            return result;\n        }\n        ma_IAudioClient_SetEventHandle((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, (HANDLE)pDevice->wasapi.hEventPlayback);\n\n        pDevice->wasapi.periodSizeInFramesPlayback = data.periodSizeInFramesOut;\n        ma_IAudioClient_GetBufferSize((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, &pDevice->wasapi.actualBufferSizeInFramesPlayback);\n\n        /* We must always have a valid ID because rerouting will look at it. */\n        ma_strcpy_s_WCHAR(pDevice->playback.id.wasapi, sizeof(pDevice->playback.id.wasapi), data.id.wasapi);\n\n        /* The descriptor needs to be updated with actual values. */\n        pDescriptorPlayback->format             = data.formatOut;\n        pDescriptorPlayback->channels           = data.channelsOut;\n        pDescriptorPlayback->sampleRate         = data.sampleRateOut;\n        MA_COPY_MEMORY(pDescriptorPlayback->channelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDescriptorPlayback->periodSizeInFrames = data.periodSizeInFramesOut;\n        pDescriptorPlayback->periodCount        = data.periodsOut;\n    }\n\n    /*\n    We need to register a notification client to detect when the device has been disabled, unplugged or re-routed (when the default device changes). When\n    we are connecting to the default device we want to do automatic stream routing when the device is disabled or unplugged. Otherwise we want to just\n    stop the device outright and let the application handle it.\n    */\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    if (pConfig->wasapi.noAutoStreamRouting == MA_FALSE) {\n        if ((pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex || pConfig->deviceType == ma_device_type_loopback) && pConfig->capture.pDeviceID == NULL) {\n            pDevice->wasapi.allowCaptureAutoStreamRouting = MA_TRUE;\n        }\n        if ((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.pDeviceID == NULL) {\n            pDevice->wasapi.allowPlaybackAutoStreamRouting = MA_TRUE;\n        }\n    }\n\n    ma_mutex_init(&pDevice->wasapi.rerouteLock);\n\n    hr = ma_CoCreateInstance(pDevice->pContext, &MA_CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL, &MA_IID_IMMDeviceEnumerator, (void**)&pDeviceEnumerator);\n    if (FAILED(hr)) {\n        ma_device_uninit__wasapi(pDevice);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to create device enumerator.\");\n        return ma_result_from_HRESULT(hr);\n    }\n\n    pDevice->wasapi.notificationClient.lpVtbl  = (void*)&g_maNotificationCientVtbl;\n    pDevice->wasapi.notificationClient.counter = 1;\n    pDevice->wasapi.notificationClient.pDevice = pDevice;\n\n    hr = pDeviceEnumerator->lpVtbl->RegisterEndpointNotificationCallback(pDeviceEnumerator, &pDevice->wasapi.notificationClient);\n    if (SUCCEEDED(hr)) {\n        pDevice->wasapi.pDeviceEnumerator = (ma_ptr)pDeviceEnumerator;\n    } else {\n        /* Not the end of the world if we fail to register the notification callback. We just won't support automatic stream routing. */\n        ma_IMMDeviceEnumerator_Release(pDeviceEnumerator);\n    }\n#endif\n\n    ma_atomic_bool32_set(&pDevice->wasapi.isStartedCapture,  MA_FALSE);\n    ma_atomic_bool32_set(&pDevice->wasapi.isStartedPlayback, MA_FALSE);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device__get_available_frames__wasapi(ma_device* pDevice, ma_IAudioClient* pAudioClient, ma_uint32* pFrameCount)\n{\n    ma_uint32 paddingFramesCount;\n    HRESULT hr;\n    ma_share_mode shareMode;\n\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(pFrameCount != NULL);\n\n    *pFrameCount = 0;\n\n    if ((ma_ptr)pAudioClient != pDevice->wasapi.pAudioClientPlayback && (ma_ptr)pAudioClient != pDevice->wasapi.pAudioClientCapture) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /*\n    I've had a report that GetCurrentPadding() is returning a frame count of 0 which is preventing\n    higher level function calls from doing anything because it thinks nothing is available. I have\n    taken a look at the documentation and it looks like this is unnecessary in exclusive mode.\n\n    From Microsoft's documentation:\n\n        For an exclusive-mode rendering or capture stream that was initialized with the\n        AUDCLNT_STREAMFLAGS_EVENTCALLBACK flag, the client typically has no use for the padding\n        value reported by GetCurrentPadding. Instead, the client accesses an entire buffer during\n        each processing pass.\n\n    Considering this, I'm going to skip GetCurrentPadding() for exclusive mode and just report the\n    entire buffer. This depends on the caller making sure they wait on the event handler.\n    */\n    shareMode = ((ma_ptr)pAudioClient == pDevice->wasapi.pAudioClientPlayback) ? pDevice->playback.shareMode : pDevice->capture.shareMode;\n    if (shareMode == ma_share_mode_shared) {\n        /* Shared mode. */\n        hr = ma_IAudioClient_GetCurrentPadding(pAudioClient, &paddingFramesCount);\n        if (FAILED(hr)) {\n            return ma_result_from_HRESULT(hr);\n        }\n\n        if ((ma_ptr)pAudioClient == pDevice->wasapi.pAudioClientPlayback) {\n            *pFrameCount = pDevice->wasapi.actualBufferSizeInFramesPlayback - paddingFramesCount;\n        } else {\n            *pFrameCount = paddingFramesCount;\n        }\n    } else {\n        /* Exclusive mode. */\n        if ((ma_ptr)pAudioClient == pDevice->wasapi.pAudioClientPlayback) {\n            *pFrameCount = pDevice->wasapi.actualBufferSizeInFramesPlayback;\n        } else {\n            *pFrameCount = pDevice->wasapi.actualBufferSizeInFramesCapture;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_device_reroute__wasapi(ma_device* pDevice, ma_device_type deviceType)\n{\n    ma_result result;\n\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"=== CHANGING DEVICE ===\\n\");\n\n    result = ma_device_reinit__wasapi(pDevice, deviceType);\n    if (result != MA_SUCCESS) {\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, \"[WASAPI] Reinitializing device after route change failed.\\n\");\n        return result;\n    }\n\n    ma_device__post_init_setup(pDevice, deviceType);\n    ma_device__on_notification_rerouted(pDevice);\n\n    ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"=== DEVICE CHANGED ===\\n\");\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_start__wasapi_nolock(ma_device* pDevice)\n{\n    HRESULT hr;\n\n    if (pDevice->pContext->wasapi.hAvrt) {\n        const char* pTaskName = ma_to_usage_string__wasapi(pDevice->wasapi.usage);\n        if (pTaskName) {\n            DWORD idx = 0;\n            pDevice->wasapi.hAvrtHandle = (ma_handle)((MA_PFN_AvSetMmThreadCharacteristicsA)pDevice->pContext->wasapi.AvSetMmThreadCharacteristicsA)(pTaskName, &idx);\n        }\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex || pDevice->type == ma_device_type_loopback) {\n        hr = ma_IAudioClient_Start((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n        if (FAILED(hr)) {\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to start internal capture device. HRESULT = %d.\", (int)hr);\n            return ma_result_from_HRESULT(hr);\n        }\n\n        ma_atomic_bool32_set(&pDevice->wasapi.isStartedCapture, MA_TRUE);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        hr = ma_IAudioClient_Start((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback);\n        if (FAILED(hr)) {\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to start internal playback device. HRESULT = %d.\", (int)hr);\n            return ma_result_from_HRESULT(hr);\n        }\n\n        ma_atomic_bool32_set(&pDevice->wasapi.isStartedPlayback, MA_TRUE);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_start__wasapi(ma_device* pDevice)\n{\n    ma_result result;\n\n    MA_ASSERT(pDevice != NULL);\n\n    /* Wait for any rerouting to finish before attempting to start the device. */\n    ma_mutex_lock(&pDevice->wasapi.rerouteLock);\n    {\n        result = ma_device_start__wasapi_nolock(pDevice);\n    }\n    ma_mutex_unlock(&pDevice->wasapi.rerouteLock);\n\n    return result;\n}\n\nstatic ma_result ma_device_stop__wasapi_nolock(ma_device* pDevice)\n{\n    ma_result result;\n    HRESULT hr;\n\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->wasapi.hAvrtHandle) {\n        ((MA_PFN_AvRevertMmThreadCharacteristics)pDevice->pContext->wasapi.AvRevertMmThreadcharacteristics)((HANDLE)pDevice->wasapi.hAvrtHandle);\n        pDevice->wasapi.hAvrtHandle = NULL;\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex || pDevice->type == ma_device_type_loopback) {\n        hr = ma_IAudioClient_Stop((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n        if (FAILED(hr)) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to stop internal capture device.\");\n            return ma_result_from_HRESULT(hr);\n        }\n\n        /* The audio client needs to be reset otherwise restarting will fail. */\n        hr = ma_IAudioClient_Reset((ma_IAudioClient*)pDevice->wasapi.pAudioClientCapture);\n        if (FAILED(hr)) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to reset internal capture device.\");\n            return ma_result_from_HRESULT(hr);\n        }\n\n        /* If we have a mapped buffer we need to release it. */\n        if (pDevice->wasapi.pMappedBufferCapture != NULL) {\n            ma_IAudioCaptureClient_ReleaseBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, pDevice->wasapi.mappedBufferCaptureCap);\n            pDevice->wasapi.pMappedBufferCapture = NULL;\n            pDevice->wasapi.mappedBufferCaptureCap = 0;\n            pDevice->wasapi.mappedBufferCaptureLen = 0;\n        }\n\n        ma_atomic_bool32_set(&pDevice->wasapi.isStartedCapture, MA_FALSE);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        /*\n        The buffer needs to be drained before stopping the device. Not doing this will result in the last few frames not getting output to\n        the speakers. This is a problem for very short sounds because it'll result in a significant portion of it not getting played.\n        */\n        if (ma_atomic_bool32_get(&pDevice->wasapi.isStartedPlayback)) {\n            /* We need to make sure we put a timeout here or else we'll risk getting stuck in a deadlock in some cases. */\n            DWORD waitTime = pDevice->wasapi.actualBufferSizeInFramesPlayback / pDevice->playback.internalSampleRate;\n\n            if (pDevice->playback.shareMode == ma_share_mode_exclusive) {\n                WaitForSingleObject((HANDLE)pDevice->wasapi.hEventPlayback, waitTime);\n            }\n            else {\n                ma_uint32 prevFramesAvaialablePlayback = (ma_uint32)-1;\n                ma_uint32 framesAvailablePlayback;\n                for (;;) {\n                    result = ma_device__get_available_frames__wasapi(pDevice, (ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback, &framesAvailablePlayback);\n                    if (result != MA_SUCCESS) {\n                        break;\n                    }\n\n                    if (framesAvailablePlayback >= pDevice->wasapi.actualBufferSizeInFramesPlayback) {\n                        break;\n                    }\n\n                    /*\n                    Just a safety check to avoid an infinite loop. If this iteration results in a situation where the number of available frames\n                    has not changed, get out of the loop. I don't think this should ever happen, but I think it's nice to have just in case.\n                    */\n                    if (framesAvailablePlayback == prevFramesAvaialablePlayback) {\n                        break;\n                    }\n                    prevFramesAvaialablePlayback = framesAvailablePlayback;\n\n                    WaitForSingleObject((HANDLE)pDevice->wasapi.hEventPlayback, waitTime * 1000);\n                    ResetEvent((HANDLE)pDevice->wasapi.hEventPlayback); /* Manual reset. */\n                }\n            }\n        }\n\n        hr = ma_IAudioClient_Stop((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback);\n        if (FAILED(hr)) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to stop internal playback device.\");\n            return ma_result_from_HRESULT(hr);\n        }\n\n        /* The audio client needs to be reset otherwise restarting will fail. */\n        hr = ma_IAudioClient_Reset((ma_IAudioClient*)pDevice->wasapi.pAudioClientPlayback);\n        if (FAILED(hr)) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to reset internal playback device.\");\n            return ma_result_from_HRESULT(hr);\n        }\n\n        if (pDevice->wasapi.pMappedBufferPlayback != NULL) {\n            ma_IAudioRenderClient_ReleaseBuffer((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient, pDevice->wasapi.mappedBufferPlaybackCap, 0);\n            pDevice->wasapi.pMappedBufferPlayback = NULL;\n            pDevice->wasapi.mappedBufferPlaybackCap = 0;\n            pDevice->wasapi.mappedBufferPlaybackLen = 0;\n        }\n\n        ma_atomic_bool32_set(&pDevice->wasapi.isStartedPlayback, MA_FALSE);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop__wasapi(ma_device* pDevice)\n{\n    ma_result result;\n\n    MA_ASSERT(pDevice != NULL);\n\n    /* Wait for any rerouting to finish before attempting to stop the device. */\n    ma_mutex_lock(&pDevice->wasapi.rerouteLock);\n    {\n        result = ma_device_stop__wasapi_nolock(pDevice);\n    }\n    ma_mutex_unlock(&pDevice->wasapi.rerouteLock);\n\n    return result;\n}\n\n\n#ifndef MA_WASAPI_WAIT_TIMEOUT_MILLISECONDS\n#define MA_WASAPI_WAIT_TIMEOUT_MILLISECONDS 5000\n#endif\n\nstatic ma_result ma_device_read__wasapi(ma_device* pDevice, void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesRead)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint32 totalFramesProcessed = 0;\n\n    /*\n    When reading, we need to get a buffer and process all of it before releasing it. Because the\n    frame count (frameCount) can be different to the size of the buffer, we'll need to cache the\n    pointer to the buffer.\n    */\n\n    /* Keep running until we've processed the requested number of frames. */\n    while (ma_device_get_state(pDevice) == ma_device_state_started && totalFramesProcessed < frameCount) {\n        ma_uint32 framesRemaining = frameCount - totalFramesProcessed;\n\n        /* If we have a mapped data buffer, consume that first. */\n        if (pDevice->wasapi.pMappedBufferCapture != NULL) {\n            /* We have a cached data pointer so consume that before grabbing another one from WASAPI. */\n            ma_uint32 framesToProcessNow = framesRemaining;\n            if (framesToProcessNow > pDevice->wasapi.mappedBufferCaptureLen) {\n                framesToProcessNow = pDevice->wasapi.mappedBufferCaptureLen;\n            }\n\n            /* Now just copy the data over to the output buffer. */\n            ma_copy_pcm_frames(\n                ma_offset_pcm_frames_ptr(pFrames, totalFramesProcessed, pDevice->capture.internalFormat, pDevice->capture.internalChannels),\n                ma_offset_pcm_frames_const_ptr(pDevice->wasapi.pMappedBufferCapture, pDevice->wasapi.mappedBufferCaptureCap - pDevice->wasapi.mappedBufferCaptureLen, pDevice->capture.internalFormat, pDevice->capture.internalChannels),\n                framesToProcessNow,\n                pDevice->capture.internalFormat, pDevice->capture.internalChannels\n            );\n\n            totalFramesProcessed                   += framesToProcessNow;\n            pDevice->wasapi.mappedBufferCaptureLen -= framesToProcessNow;\n\n            /* If the data buffer has been fully consumed we need to release it. */\n            if (pDevice->wasapi.mappedBufferCaptureLen == 0) {\n                ma_IAudioCaptureClient_ReleaseBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, pDevice->wasapi.mappedBufferCaptureCap);\n                pDevice->wasapi.pMappedBufferCapture   = NULL;\n                pDevice->wasapi.mappedBufferCaptureCap = 0;\n            }\n        } else {\n            /* We don't have any cached data pointer, so grab another one. */\n            HRESULT hr;\n            DWORD flags = 0;\n\n            /* First just ask WASAPI for a data buffer. If it's not available, we'll wait for more. */\n            hr = ma_IAudioCaptureClient_GetBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, (BYTE**)&pDevice->wasapi.pMappedBufferCapture, &pDevice->wasapi.mappedBufferCaptureCap, &flags, NULL, NULL);\n            if (hr == S_OK) {\n                /* We got a data buffer. Continue to the next loop iteration which will then read from the mapped pointer. */\n                pDevice->wasapi.mappedBufferCaptureLen = pDevice->wasapi.mappedBufferCaptureCap;\n\n                /*\n                There have been reports that indicate that at times the AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY is reported for every\n                call to IAudioCaptureClient_GetBuffer() above which results in spamming of the debug messages below. To partially\n                work around this, I'm only outputting these messages when MA_DEBUG_OUTPUT is explicitly defined. The better solution\n                would be to figure out why the flag is always getting reported.\n                */\n                #if defined(MA_DEBUG_OUTPUT)\n                {\n                    if (flags != 0) {\n                        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Capture Flags: %ld\\n\", flags);\n\n                        if ((flags & MA_AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY) != 0) {\n                            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Data discontinuity (possible overrun). Attempting recovery. mappedBufferCaptureCap=%d\\n\", pDevice->wasapi.mappedBufferCaptureCap);\n                        }\n                    }\n                }\n                #endif\n\n                /* Overrun detection. */\n                if ((flags & MA_AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY) != 0) {\n                    /* Glitched. Probably due to an overrun. */\n\n                    /*\n                    If we got an overrun it probably means we're straddling the end of the buffer. In normal capture\n                    mode this is the fault of the client application because they're responsible for ensuring data is\n                    processed fast enough. In duplex mode, however, the processing of audio is tied to the playback\n                    device, so this can possibly be the result of a timing de-sync.\n\n                    In capture mode we're not going to do any kind of recovery because the real fix is for the client\n                    application to process faster. In duplex mode, we'll treat this as a desync and reset the buffers\n                    to prevent a never-ending sequence of glitches due to straddling the end of the buffer.\n                    */\n                    if (pDevice->type == ma_device_type_duplex) {\n                        /*\n                        Experiment:\n\n                        If we empty out the *entire* buffer we may end up putting ourselves into an underrun position\n                        which isn't really any better than the overrun we're probably in right now. Instead we'll just\n                        empty out about half.\n                        */\n                        ma_uint32 i;\n                        ma_uint32 periodCount = (pDevice->wasapi.actualBufferSizeInFramesCapture / pDevice->wasapi.periodSizeInFramesCapture);\n                        ma_uint32 iterationCount = periodCount / 2;\n                        if ((periodCount % 2) > 0) {\n                            iterationCount += 1;\n                        }\n\n                        for (i = 0; i < iterationCount; i += 1) {\n                            hr = ma_IAudioCaptureClient_ReleaseBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, pDevice->wasapi.mappedBufferCaptureCap);\n                            if (FAILED(hr)) {\n                                ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Data discontinuity recovery: IAudioCaptureClient_ReleaseBuffer() failed with %ld.\\n\", hr);\n                                break;\n                            }\n\n                            flags = 0;\n                            hr = ma_IAudioCaptureClient_GetBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, (BYTE**)&pDevice->wasapi.pMappedBufferCapture, &pDevice->wasapi.mappedBufferCaptureCap, &flags, NULL, NULL);\n                            if (hr == MA_AUDCLNT_S_BUFFER_EMPTY || FAILED(hr)) {\n                                /*\n                                The buffer has been completely emptied or an error occurred. In this case we'll need\n                                to reset the state of the mapped buffer which will trigger the next iteration to get\n                                a fresh buffer from WASAPI.\n                                */\n                                pDevice->wasapi.pMappedBufferCapture   = NULL;\n                                pDevice->wasapi.mappedBufferCaptureCap = 0;\n                                pDevice->wasapi.mappedBufferCaptureLen = 0;\n\n                                if (hr == MA_AUDCLNT_S_BUFFER_EMPTY) {\n                                    if ((flags & MA_AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY) != 0) {\n                                        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Data discontinuity recovery: Buffer emptied, and data discontinuity still reported.\\n\");\n                                    } else {\n                                        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Data discontinuity recovery: Buffer emptied.\\n\");\n                                    }\n                                }\n\n                                if (FAILED(hr)) {\n                                    ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[WASAPI] Data discontinuity recovery: IAudioCaptureClient_GetBuffer() failed with %ld.\\n\", hr);\n                                }\n\n                                break;\n                            }\n                        }\n\n                        /* If at this point we have a valid buffer mapped, make sure the buffer length is set appropriately. */\n                        if (pDevice->wasapi.pMappedBufferCapture != NULL) {\n                            pDevice->wasapi.mappedBufferCaptureLen = pDevice->wasapi.mappedBufferCaptureCap;\n                        }\n                    }\n                }\n\n                continue;\n            } else {\n                if (hr == MA_AUDCLNT_S_BUFFER_EMPTY || hr == MA_AUDCLNT_E_BUFFER_ERROR) {\n                    /*\n                    No data is available. We need to wait for more. There's two situations to consider\n                    here. The first is normal capture mode. If this times out it probably means the\n                    microphone isn't delivering data for whatever reason. In this case we'll just\n                    abort the read and return whatever we were able to get. The other situations is\n                    loopback mode, in which case a timeout probably just means the nothing is playing\n                    through the speakers.\n                    */\n\n                    /* Experiment: Use a shorter timeout for loopback mode. */\n                    DWORD timeoutInMilliseconds = MA_WASAPI_WAIT_TIMEOUT_MILLISECONDS;\n                    if (pDevice->type == ma_device_type_loopback) {\n                        timeoutInMilliseconds = 10;\n                    }\n\n                    if (WaitForSingleObject((HANDLE)pDevice->wasapi.hEventCapture, timeoutInMilliseconds) != WAIT_OBJECT_0) {\n                        if (pDevice->type == ma_device_type_loopback) {\n                            continue;   /* Keep waiting in loopback mode. */\n                        } else {\n                            result = MA_ERROR;\n                            break;      /* Wait failed. */\n                        }\n                    }\n\n                    /* At this point we should be able to loop back to the start of the loop and try retrieving a data buffer again. */\n                } else {\n                    /* An error occurred and we need to abort. */\n                    ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to retrieve internal buffer from capture device in preparation for reading from the device. HRESULT = %d. Stopping device.\\n\", (int)hr);\n                    result = ma_result_from_HRESULT(hr);\n                    break;\n                }\n            }\n        }\n    }\n\n    /*\n    If we were unable to process the entire requested frame count, but we still have a mapped buffer,\n    there's a good chance either an error occurred or the device was stopped mid-read. In this case\n    we'll need to make sure the buffer is released.\n    */\n    if (totalFramesProcessed < frameCount && pDevice->wasapi.pMappedBufferCapture != NULL) {\n        ma_IAudioCaptureClient_ReleaseBuffer((ma_IAudioCaptureClient*)pDevice->wasapi.pCaptureClient, pDevice->wasapi.mappedBufferCaptureCap);\n        pDevice->wasapi.pMappedBufferCapture   = NULL;\n        pDevice->wasapi.mappedBufferCaptureCap = 0;\n        pDevice->wasapi.mappedBufferCaptureLen = 0;\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = totalFramesProcessed;\n    }\n\n    return result;\n}\n\nstatic ma_result ma_device_write__wasapi(ma_device* pDevice, const void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint32 totalFramesProcessed = 0;\n\n    /* Keep writing to the device until it's stopped or we've consumed all of our input. */\n    while (ma_device_get_state(pDevice) == ma_device_state_started && totalFramesProcessed < frameCount) {\n        ma_uint32 framesRemaining = frameCount - totalFramesProcessed;\n\n        /*\n        We're going to do this in a similar way to capture. We'll first check if the cached data pointer\n        is valid, and if so, read from that. Otherwise We will call IAudioRenderClient_GetBuffer() with\n        a requested buffer size equal to our actual period size. If it returns AUDCLNT_E_BUFFER_TOO_LARGE\n        it means we need to wait for some data to become available.\n        */\n        if (pDevice->wasapi.pMappedBufferPlayback != NULL) {\n            /* We still have some space available in the mapped data buffer. Write to it. */\n            ma_uint32 framesToProcessNow = framesRemaining;\n            if (framesToProcessNow > (pDevice->wasapi.mappedBufferPlaybackCap - pDevice->wasapi.mappedBufferPlaybackLen)) {\n                framesToProcessNow = (pDevice->wasapi.mappedBufferPlaybackCap - pDevice->wasapi.mappedBufferPlaybackLen);\n            }\n\n            /* Now just copy the data over to the output buffer. */\n            ma_copy_pcm_frames(\n                ma_offset_pcm_frames_ptr(pDevice->wasapi.pMappedBufferPlayback, pDevice->wasapi.mappedBufferPlaybackLen, pDevice->playback.internalFormat, pDevice->playback.internalChannels),\n                ma_offset_pcm_frames_const_ptr(pFrames, totalFramesProcessed, pDevice->playback.internalFormat, pDevice->playback.internalChannels),\n                framesToProcessNow,\n                pDevice->playback.internalFormat, pDevice->playback.internalChannels\n            );\n\n            totalFramesProcessed                    += framesToProcessNow;\n            pDevice->wasapi.mappedBufferPlaybackLen += framesToProcessNow;\n\n            /* If the data buffer has been fully consumed we need to release it. */\n            if (pDevice->wasapi.mappedBufferPlaybackLen == pDevice->wasapi.mappedBufferPlaybackCap) {\n                ma_IAudioRenderClient_ReleaseBuffer((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient, pDevice->wasapi.mappedBufferPlaybackCap, 0);\n                pDevice->wasapi.pMappedBufferPlayback   = NULL;\n                pDevice->wasapi.mappedBufferPlaybackCap = 0;\n                pDevice->wasapi.mappedBufferPlaybackLen = 0;\n\n                /*\n                In exclusive mode we need to wait here. Exclusive mode is weird because GetBuffer() never\n                seems to return AUDCLNT_E_BUFFER_TOO_LARGE, which is what we normally use to determine\n                whether or not we need to wait for more data.\n                */\n                if (pDevice->playback.shareMode == ma_share_mode_exclusive) {\n                    if (WaitForSingleObject((HANDLE)pDevice->wasapi.hEventPlayback, MA_WASAPI_WAIT_TIMEOUT_MILLISECONDS) != WAIT_OBJECT_0) {\n                        result = MA_ERROR;\n                        break;   /* Wait failed. Probably timed out. */\n                    }\n                }\n            }\n        } else {\n            /* We don't have a mapped data buffer so we'll need to get one. */\n            HRESULT hr;\n            ma_uint32 bufferSizeInFrames;\n\n            /* Special rules for exclusive mode. */\n            if (pDevice->playback.shareMode == ma_share_mode_exclusive) {\n                bufferSizeInFrames = pDevice->wasapi.actualBufferSizeInFramesPlayback;\n            } else {\n                bufferSizeInFrames = pDevice->wasapi.periodSizeInFramesPlayback;\n            }\n\n            hr = ma_IAudioRenderClient_GetBuffer((ma_IAudioRenderClient*)pDevice->wasapi.pRenderClient, bufferSizeInFrames, (BYTE**)&pDevice->wasapi.pMappedBufferPlayback);\n            if (hr == S_OK) {\n                /* We have data available. */\n                pDevice->wasapi.mappedBufferPlaybackCap = bufferSizeInFrames;\n                pDevice->wasapi.mappedBufferPlaybackLen = 0;\n            } else {\n                if (hr == MA_AUDCLNT_E_BUFFER_TOO_LARGE || hr == MA_AUDCLNT_E_BUFFER_ERROR) {\n                    /* Not enough data available. We need to wait for more. */\n                    if (WaitForSingleObject((HANDLE)pDevice->wasapi.hEventPlayback, MA_WASAPI_WAIT_TIMEOUT_MILLISECONDS) != WAIT_OBJECT_0) {\n                        result = MA_ERROR;\n                        break;   /* Wait failed. Probably timed out. */\n                    }\n                } else {\n                    /* Some error occurred. We'll need to abort. */\n                    ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WASAPI] Failed to retrieve internal buffer from playback device in preparation for writing to the device. HRESULT = %d. Stopping device.\\n\", (int)hr);\n                    result = ma_result_from_HRESULT(hr);\n                    break;\n                }\n            }\n        }\n    }\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = totalFramesProcessed;\n    }\n\n    return result;\n}\n\nstatic ma_result ma_device_data_loop_wakeup__wasapi(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex || pDevice->type == ma_device_type_loopback) {\n        SetEvent((HANDLE)pDevice->wasapi.hEventCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        SetEvent((HANDLE)pDevice->wasapi.hEventPlayback);\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_context_uninit__wasapi(ma_context* pContext)\n{\n    ma_context_command__wasapi cmd = ma_context_init_command__wasapi(MA_CONTEXT_COMMAND_QUIT__WASAPI);\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_wasapi);\n\n    ma_context_post_command__wasapi(pContext, &cmd);\n    ma_thread_wait(&pContext->wasapi.commandThread);\n\n    if (pContext->wasapi.hAvrt) {\n        ma_dlclose(ma_context_get_log(pContext), pContext->wasapi.hAvrt);\n        pContext->wasapi.hAvrt = NULL;\n    }\n\n    #if defined(MA_WIN32_UWP)\n    {\n        if (pContext->wasapi.hMMDevapi) {\n            ma_dlclose(ma_context_get_log(pContext), pContext->wasapi.hMMDevapi);\n            pContext->wasapi.hMMDevapi = NULL;\n        }\n    }\n    #endif\n\n    /* Only after the thread has been terminated can we uninitialize the sync objects for the command thread. */\n    ma_semaphore_uninit(&pContext->wasapi.commandSem);\n    ma_mutex_uninit(&pContext->wasapi.commandLock);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init__wasapi(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n    ma_result result = MA_SUCCESS;\n\n    MA_ASSERT(pContext != NULL);\n\n    (void)pConfig;\n\n#ifdef MA_WIN32_DESKTOP\n    /*\n    WASAPI is only supported in Vista SP1 and newer. The reason for SP1 and not the base version of Vista is that event-driven\n    exclusive mode does not work until SP1.\n\n    Unfortunately older compilers don't define these functions so we need to dynamically load them in order to avoid a link error.\n    */\n    {\n        ma_OSVERSIONINFOEXW osvi;\n        ma_handle kernel32DLL;\n        ma_PFNVerifyVersionInfoW _VerifyVersionInfoW;\n        ma_PFNVerSetConditionMask _VerSetConditionMask;\n\n        kernel32DLL = ma_dlopen(ma_context_get_log(pContext), \"kernel32.dll\");\n        if (kernel32DLL == NULL) {\n            return MA_NO_BACKEND;\n        }\n\n        _VerifyVersionInfoW  = (ma_PFNVerifyVersionInfoW )ma_dlsym(ma_context_get_log(pContext), kernel32DLL, \"VerifyVersionInfoW\");\n        _VerSetConditionMask = (ma_PFNVerSetConditionMask)ma_dlsym(ma_context_get_log(pContext), kernel32DLL, \"VerSetConditionMask\");\n        if (_VerifyVersionInfoW == NULL || _VerSetConditionMask == NULL) {\n            ma_dlclose(ma_context_get_log(pContext), kernel32DLL);\n            return MA_NO_BACKEND;\n        }\n\n        MA_ZERO_OBJECT(&osvi);\n        osvi.dwOSVersionInfoSize = sizeof(osvi);\n        osvi.dwMajorVersion = ((MA_WIN32_WINNT_VISTA >> 8) & 0xFF);\n        osvi.dwMinorVersion = ((MA_WIN32_WINNT_VISTA >> 0) & 0xFF);\n        osvi.wServicePackMajor = 1;\n        if (_VerifyVersionInfoW(&osvi, MA_VER_MAJORVERSION | MA_VER_MINORVERSION | MA_VER_SERVICEPACKMAJOR, _VerSetConditionMask(_VerSetConditionMask(_VerSetConditionMask(0, MA_VER_MAJORVERSION, MA_VER_GREATER_EQUAL), MA_VER_MINORVERSION, MA_VER_GREATER_EQUAL), MA_VER_SERVICEPACKMAJOR, MA_VER_GREATER_EQUAL))) {\n            result = MA_SUCCESS;\n        } else {\n            result = MA_NO_BACKEND;\n        }\n\n        ma_dlclose(ma_context_get_log(pContext), kernel32DLL);\n    }\n#endif\n\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    MA_ZERO_OBJECT(&pContext->wasapi);\n\n\n    #if defined(MA_WIN32_UWP)\n    {\n        /* Link to mmdevapi so we can get access to ActivateAudioInterfaceAsync(). */\n        pContext->wasapi.hMMDevapi = ma_dlopen(ma_context_get_log(pContext), \"mmdevapi.dll\");\n        if (pContext->wasapi.hMMDevapi) {\n            pContext->wasapi.ActivateAudioInterfaceAsync = ma_dlsym(ma_context_get_log(pContext), pContext->wasapi.hMMDevapi, \"ActivateAudioInterfaceAsync\");\n            if (pContext->wasapi.ActivateAudioInterfaceAsync == NULL) {\n                ma_dlclose(ma_context_get_log(pContext), pContext->wasapi.hMMDevapi);\n                return MA_NO_BACKEND;   /* ActivateAudioInterfaceAsync() could not be loaded. */\n            }\n        } else {\n            return MA_NO_BACKEND;   /* Failed to load mmdevapi.dll which is required for ActivateAudioInterfaceAsync() */\n        }\n    }\n    #endif\n\n    /* Optionally use the Avrt API to specify the audio thread's latency sensitivity requirements */\n    pContext->wasapi.hAvrt = ma_dlopen(ma_context_get_log(pContext), \"avrt.dll\");\n    if (pContext->wasapi.hAvrt) {\n        pContext->wasapi.AvSetMmThreadCharacteristicsA   = ma_dlsym(ma_context_get_log(pContext), pContext->wasapi.hAvrt, \"AvSetMmThreadCharacteristicsA\");\n        pContext->wasapi.AvRevertMmThreadcharacteristics = ma_dlsym(ma_context_get_log(pContext), pContext->wasapi.hAvrt, \"AvRevertMmThreadCharacteristics\");\n\n        /* If either function could not be found, disable use of avrt entirely. */\n        if (!pContext->wasapi.AvSetMmThreadCharacteristicsA || !pContext->wasapi.AvRevertMmThreadcharacteristics) {\n            pContext->wasapi.AvSetMmThreadCharacteristicsA   = NULL;\n            pContext->wasapi.AvRevertMmThreadcharacteristics = NULL;\n            ma_dlclose(ma_context_get_log(pContext), pContext->wasapi.hAvrt);\n            pContext->wasapi.hAvrt = NULL;\n        }\n    }\n\n\n    /*\n    Annoyingly, WASAPI does not allow you to release an IAudioClient object from a different thread\n    than the one that retrieved it with GetService(). This can result in a deadlock in two\n    situations:\n\n        1) When calling ma_device_uninit() from a different thread to ma_device_init(); and\n        2) When uninitializing and reinitializing the internal IAudioClient object in response to\n           automatic stream routing.\n\n    We could define ma_device_uninit() such that it must be called on the same thread as\n    ma_device_init(). We could also just not release the IAudioClient when performing automatic\n    stream routing to avoid the deadlock. Neither of these are acceptable solutions in my view so\n    we're going to have to work around this with a worker thread. This is not ideal, but I can't\n    think of a better way to do this.\n\n    More information about this can be found here:\n\n        https://docs.microsoft.com/en-us/windows/win32/api/audioclient/nn-audioclient-iaudiorenderclient\n\n    Note this section:\n\n        When releasing an IAudioRenderClient interface instance, the client must call the interface's\n        Release method from the same thread as the call to IAudioClient::GetService that created the\n        object.\n    */\n    {\n        result = ma_mutex_init(&pContext->wasapi.commandLock);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        result = ma_semaphore_init(0, &pContext->wasapi.commandSem);\n        if (result != MA_SUCCESS) {\n            ma_mutex_uninit(&pContext->wasapi.commandLock);\n            return result;\n        }\n\n        result = ma_thread_create(&pContext->wasapi.commandThread, ma_thread_priority_normal, 0, ma_context_command_thread__wasapi, pContext, &pContext->allocationCallbacks);\n        if (result != MA_SUCCESS) {\n            ma_semaphore_uninit(&pContext->wasapi.commandSem);\n            ma_mutex_uninit(&pContext->wasapi.commandLock);\n            return result;\n        }\n    }\n\n\n    pCallbacks->onContextInit             = ma_context_init__wasapi;\n    pCallbacks->onContextUninit           = ma_context_uninit__wasapi;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__wasapi;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__wasapi;\n    pCallbacks->onDeviceInit              = ma_device_init__wasapi;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__wasapi;\n    pCallbacks->onDeviceStart             = ma_device_start__wasapi;\n    pCallbacks->onDeviceStop              = ma_device_stop__wasapi;\n    pCallbacks->onDeviceRead              = ma_device_read__wasapi;\n    pCallbacks->onDeviceWrite             = ma_device_write__wasapi;\n    pCallbacks->onDeviceDataLoop          = NULL;\n    pCallbacks->onDeviceDataLoopWakeup    = ma_device_data_loop_wakeup__wasapi;\n\n    return MA_SUCCESS;\n}\n#endif\n\n/******************************************************************************\n\nDirectSound Backend\n\n******************************************************************************/\n#ifdef MA_HAS_DSOUND\n/*#include <dsound.h>*/\n\n/*static const GUID MA_GUID_IID_DirectSoundNotify = {0xb0210783, 0x89cd, 0x11d0, {0xaf, 0x08, 0x00, 0xa0, 0xc9, 0x25, 0xcd, 0x16}};*/\n\n/* miniaudio only uses priority or exclusive modes. */\n#define MA_DSSCL_NORMAL                 1\n#define MA_DSSCL_PRIORITY               2\n#define MA_DSSCL_EXCLUSIVE              3\n#define MA_DSSCL_WRITEPRIMARY           4\n\n#define MA_DSCAPS_PRIMARYMONO           0x00000001\n#define MA_DSCAPS_PRIMARYSTEREO         0x00000002\n#define MA_DSCAPS_PRIMARY8BIT           0x00000004\n#define MA_DSCAPS_PRIMARY16BIT          0x00000008\n#define MA_DSCAPS_CONTINUOUSRATE        0x00000010\n#define MA_DSCAPS_EMULDRIVER            0x00000020\n#define MA_DSCAPS_CERTIFIED             0x00000040\n#define MA_DSCAPS_SECONDARYMONO         0x00000100\n#define MA_DSCAPS_SECONDARYSTEREO       0x00000200\n#define MA_DSCAPS_SECONDARY8BIT         0x00000400\n#define MA_DSCAPS_SECONDARY16BIT        0x00000800\n\n#define MA_DSBCAPS_PRIMARYBUFFER        0x00000001\n#define MA_DSBCAPS_STATIC               0x00000002\n#define MA_DSBCAPS_LOCHARDWARE          0x00000004\n#define MA_DSBCAPS_LOCSOFTWARE          0x00000008\n#define MA_DSBCAPS_CTRL3D               0x00000010\n#define MA_DSBCAPS_CTRLFREQUENCY        0x00000020\n#define MA_DSBCAPS_CTRLPAN              0x00000040\n#define MA_DSBCAPS_CTRLVOLUME           0x00000080\n#define MA_DSBCAPS_CTRLPOSITIONNOTIFY   0x00000100\n#define MA_DSBCAPS_CTRLFX               0x00000200\n#define MA_DSBCAPS_STICKYFOCUS          0x00004000\n#define MA_DSBCAPS_GLOBALFOCUS          0x00008000\n#define MA_DSBCAPS_GETCURRENTPOSITION2  0x00010000\n#define MA_DSBCAPS_MUTE3DATMAXDISTANCE  0x00020000\n#define MA_DSBCAPS_LOCDEFER             0x00040000\n#define MA_DSBCAPS_TRUEPLAYPOSITION     0x00080000\n\n#define MA_DSBPLAY_LOOPING              0x00000001\n#define MA_DSBPLAY_LOCHARDWARE          0x00000002\n#define MA_DSBPLAY_LOCSOFTWARE          0x00000004\n#define MA_DSBPLAY_TERMINATEBY_TIME     0x00000008\n#define MA_DSBPLAY_TERMINATEBY_DISTANCE 0x00000010\n#define MA_DSBPLAY_TERMINATEBY_PRIORITY 0x00000020\n\n#define MA_DSCBSTART_LOOPING            0x00000001\n\ntypedef struct\n{\n    DWORD dwSize;\n    DWORD dwFlags;\n    DWORD dwBufferBytes;\n    DWORD dwReserved;\n    MA_WAVEFORMATEX* lpwfxFormat;\n    GUID guid3DAlgorithm;\n} MA_DSBUFFERDESC;\n\ntypedef struct\n{\n    DWORD dwSize;\n    DWORD dwFlags;\n    DWORD dwBufferBytes;\n    DWORD dwReserved;\n    MA_WAVEFORMATEX* lpwfxFormat;\n    DWORD dwFXCount;\n    void* lpDSCFXDesc;  /* <-- miniaudio doesn't use this, so set to void*. */\n} MA_DSCBUFFERDESC;\n\ntypedef struct\n{\n    DWORD dwSize;\n    DWORD dwFlags;\n    DWORD dwMinSecondarySampleRate;\n    DWORD dwMaxSecondarySampleRate;\n    DWORD dwPrimaryBuffers;\n    DWORD dwMaxHwMixingAllBuffers;\n    DWORD dwMaxHwMixingStaticBuffers;\n    DWORD dwMaxHwMixingStreamingBuffers;\n    DWORD dwFreeHwMixingAllBuffers;\n    DWORD dwFreeHwMixingStaticBuffers;\n    DWORD dwFreeHwMixingStreamingBuffers;\n    DWORD dwMaxHw3DAllBuffers;\n    DWORD dwMaxHw3DStaticBuffers;\n    DWORD dwMaxHw3DStreamingBuffers;\n    DWORD dwFreeHw3DAllBuffers;\n    DWORD dwFreeHw3DStaticBuffers;\n    DWORD dwFreeHw3DStreamingBuffers;\n    DWORD dwTotalHwMemBytes;\n    DWORD dwFreeHwMemBytes;\n    DWORD dwMaxContigFreeHwMemBytes;\n    DWORD dwUnlockTransferRateHwBuffers;\n    DWORD dwPlayCpuOverheadSwBuffers;\n    DWORD dwReserved1;\n    DWORD dwReserved2;\n} MA_DSCAPS;\n\ntypedef struct\n{\n    DWORD dwSize;\n    DWORD dwFlags;\n    DWORD dwBufferBytes;\n    DWORD dwUnlockTransferRate;\n    DWORD dwPlayCpuOverhead;\n} MA_DSBCAPS;\n\ntypedef struct\n{\n    DWORD dwSize;\n    DWORD dwFlags;\n    DWORD dwFormats;\n    DWORD dwChannels;\n} MA_DSCCAPS;\n\ntypedef struct\n{\n    DWORD dwSize;\n    DWORD dwFlags;\n    DWORD dwBufferBytes;\n    DWORD dwReserved;\n} MA_DSCBCAPS;\n\ntypedef struct\n{\n    DWORD  dwOffset;\n    HANDLE hEventNotify;\n} MA_DSBPOSITIONNOTIFY;\n\ntypedef struct ma_IDirectSound              ma_IDirectSound;\ntypedef struct ma_IDirectSoundBuffer        ma_IDirectSoundBuffer;\ntypedef struct ma_IDirectSoundCapture       ma_IDirectSoundCapture;\ntypedef struct ma_IDirectSoundCaptureBuffer ma_IDirectSoundCaptureBuffer;\ntypedef struct ma_IDirectSoundNotify        ma_IDirectSoundNotify;\n\n\n/*\nCOM objects. The way these work is that you have a vtable (a list of function pointers, kind of\nlike how C++ works internally), and then you have a structure with a single member, which is a\npointer to the vtable. The vtable is where the methods of the object are defined. Methods need\nto be in a specific order, and parent classes need to have their methods declared first.\n*/\n\n/* IDirectSound */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSound* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IDirectSound* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IDirectSound* pThis);\n\n    /* IDirectSound */\n    HRESULT (STDMETHODCALLTYPE * CreateSoundBuffer)   (ma_IDirectSound* pThis, const MA_DSBUFFERDESC* pDSBufferDesc, ma_IDirectSoundBuffer** ppDSBuffer, void* pUnkOuter);\n    HRESULT (STDMETHODCALLTYPE * GetCaps)             (ma_IDirectSound* pThis, MA_DSCAPS* pDSCaps);\n    HRESULT (STDMETHODCALLTYPE * DuplicateSoundBuffer)(ma_IDirectSound* pThis, ma_IDirectSoundBuffer* pDSBufferOriginal, ma_IDirectSoundBuffer** ppDSBufferDuplicate);\n    HRESULT (STDMETHODCALLTYPE * SetCooperativeLevel) (ma_IDirectSound* pThis, HWND hwnd, DWORD dwLevel);\n    HRESULT (STDMETHODCALLTYPE * Compact)             (ma_IDirectSound* pThis);\n    HRESULT (STDMETHODCALLTYPE * GetSpeakerConfig)    (ma_IDirectSound* pThis, DWORD* pSpeakerConfig);\n    HRESULT (STDMETHODCALLTYPE * SetSpeakerConfig)    (ma_IDirectSound* pThis, DWORD dwSpeakerConfig);\n    HRESULT (STDMETHODCALLTYPE * Initialize)          (ma_IDirectSound* pThis, const GUID* pGuidDevice);\n} ma_IDirectSoundVtbl;\nstruct ma_IDirectSound\n{\n    ma_IDirectSoundVtbl* lpVtbl;\n};\nstatic MA_INLINE HRESULT ma_IDirectSound_QueryInterface(ma_IDirectSound* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nstatic MA_INLINE ULONG   ma_IDirectSound_AddRef(ma_IDirectSound* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nstatic MA_INLINE ULONG   ma_IDirectSound_Release(ma_IDirectSound* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nstatic MA_INLINE HRESULT ma_IDirectSound_CreateSoundBuffer(ma_IDirectSound* pThis, const MA_DSBUFFERDESC* pDSBufferDesc, ma_IDirectSoundBuffer** ppDSBuffer, void* pUnkOuter) { return pThis->lpVtbl->CreateSoundBuffer(pThis, pDSBufferDesc, ppDSBuffer, pUnkOuter); }\nstatic MA_INLINE HRESULT ma_IDirectSound_GetCaps(ma_IDirectSound* pThis, MA_DSCAPS* pDSCaps)                            { return pThis->lpVtbl->GetCaps(pThis, pDSCaps); }\nstatic MA_INLINE HRESULT ma_IDirectSound_DuplicateSoundBuffer(ma_IDirectSound* pThis, ma_IDirectSoundBuffer* pDSBufferOriginal, ma_IDirectSoundBuffer** ppDSBufferDuplicate) { return pThis->lpVtbl->DuplicateSoundBuffer(pThis, pDSBufferOriginal, ppDSBufferDuplicate); }\nstatic MA_INLINE HRESULT ma_IDirectSound_SetCooperativeLevel(ma_IDirectSound* pThis, HWND hwnd, DWORD dwLevel)          { return pThis->lpVtbl->SetCooperativeLevel(pThis, hwnd, dwLevel); }\nstatic MA_INLINE HRESULT ma_IDirectSound_Compact(ma_IDirectSound* pThis)                                                { return pThis->lpVtbl->Compact(pThis); }\nstatic MA_INLINE HRESULT ma_IDirectSound_GetSpeakerConfig(ma_IDirectSound* pThis, DWORD* pSpeakerConfig)                { return pThis->lpVtbl->GetSpeakerConfig(pThis, pSpeakerConfig); }\nstatic MA_INLINE HRESULT ma_IDirectSound_SetSpeakerConfig(ma_IDirectSound* pThis, DWORD dwSpeakerConfig)                { return pThis->lpVtbl->SetSpeakerConfig(pThis, dwSpeakerConfig); }\nstatic MA_INLINE HRESULT ma_IDirectSound_Initialize(ma_IDirectSound* pThis, const GUID* pGuidDevice)                    { return pThis->lpVtbl->Initialize(pThis, pGuidDevice); }\n\n\n/* IDirectSoundBuffer */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSoundBuffer* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IDirectSoundBuffer* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IDirectSoundBuffer* pThis);\n\n    /* IDirectSoundBuffer */\n    HRESULT (STDMETHODCALLTYPE * GetCaps)           (ma_IDirectSoundBuffer* pThis, MA_DSBCAPS* pDSBufferCaps);\n    HRESULT (STDMETHODCALLTYPE * GetCurrentPosition)(ma_IDirectSoundBuffer* pThis, DWORD* pCurrentPlayCursor, DWORD* pCurrentWriteCursor);\n    HRESULT (STDMETHODCALLTYPE * GetFormat)         (ma_IDirectSoundBuffer* pThis, MA_WAVEFORMATEX* pFormat, DWORD dwSizeAllocated, DWORD* pSizeWritten);\n    HRESULT (STDMETHODCALLTYPE * GetVolume)         (ma_IDirectSoundBuffer* pThis, LONG* pVolume);\n    HRESULT (STDMETHODCALLTYPE * GetPan)            (ma_IDirectSoundBuffer* pThis, LONG* pPan);\n    HRESULT (STDMETHODCALLTYPE * GetFrequency)      (ma_IDirectSoundBuffer* pThis, DWORD* pFrequency);\n    HRESULT (STDMETHODCALLTYPE * GetStatus)         (ma_IDirectSoundBuffer* pThis, DWORD* pStatus);\n    HRESULT (STDMETHODCALLTYPE * Initialize)        (ma_IDirectSoundBuffer* pThis, ma_IDirectSound* pDirectSound, const MA_DSBUFFERDESC* pDSBufferDesc);\n    HRESULT (STDMETHODCALLTYPE * Lock)              (ma_IDirectSoundBuffer* pThis, DWORD dwOffset, DWORD dwBytes, void** ppAudioPtr1, DWORD* pAudioBytes1, void** ppAudioPtr2, DWORD* pAudioBytes2, DWORD dwFlags);\n    HRESULT (STDMETHODCALLTYPE * Play)              (ma_IDirectSoundBuffer* pThis, DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags);\n    HRESULT (STDMETHODCALLTYPE * SetCurrentPosition)(ma_IDirectSoundBuffer* pThis, DWORD dwNewPosition);\n    HRESULT (STDMETHODCALLTYPE * SetFormat)         (ma_IDirectSoundBuffer* pThis, const MA_WAVEFORMATEX* pFormat);\n    HRESULT (STDMETHODCALLTYPE * SetVolume)         (ma_IDirectSoundBuffer* pThis, LONG volume);\n    HRESULT (STDMETHODCALLTYPE * SetPan)            (ma_IDirectSoundBuffer* pThis, LONG pan);\n    HRESULT (STDMETHODCALLTYPE * SetFrequency)      (ma_IDirectSoundBuffer* pThis, DWORD dwFrequency);\n    HRESULT (STDMETHODCALLTYPE * Stop)              (ma_IDirectSoundBuffer* pThis);\n    HRESULT (STDMETHODCALLTYPE * Unlock)            (ma_IDirectSoundBuffer* pThis, void* pAudioPtr1, DWORD dwAudioBytes1, void* pAudioPtr2, DWORD dwAudioBytes2);\n    HRESULT (STDMETHODCALLTYPE * Restore)           (ma_IDirectSoundBuffer* pThis);\n} ma_IDirectSoundBufferVtbl;\nstruct ma_IDirectSoundBuffer\n{\n    ma_IDirectSoundBufferVtbl* lpVtbl;\n};\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_QueryInterface(ma_IDirectSoundBuffer* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nstatic MA_INLINE ULONG   ma_IDirectSoundBuffer_AddRef(ma_IDirectSoundBuffer* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nstatic MA_INLINE ULONG   ma_IDirectSoundBuffer_Release(ma_IDirectSoundBuffer* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_GetCaps(ma_IDirectSoundBuffer* pThis, MA_DSBCAPS* pDSBufferCaps)                     { return pThis->lpVtbl->GetCaps(pThis, pDSBufferCaps); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_GetCurrentPosition(ma_IDirectSoundBuffer* pThis, DWORD* pCurrentPlayCursor, DWORD* pCurrentWriteCursor) { return pThis->lpVtbl->GetCurrentPosition(pThis, pCurrentPlayCursor, pCurrentWriteCursor); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_GetFormat(ma_IDirectSoundBuffer* pThis, MA_WAVEFORMATEX* pFormat, DWORD dwSizeAllocated, DWORD* pSizeWritten) { return pThis->lpVtbl->GetFormat(pThis, pFormat, dwSizeAllocated, pSizeWritten); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_GetVolume(ma_IDirectSoundBuffer* pThis, LONG* pVolume)                               { return pThis->lpVtbl->GetVolume(pThis, pVolume); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_GetPan(ma_IDirectSoundBuffer* pThis, LONG* pPan)                                     { return pThis->lpVtbl->GetPan(pThis, pPan); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_GetFrequency(ma_IDirectSoundBuffer* pThis, DWORD* pFrequency)                        { return pThis->lpVtbl->GetFrequency(pThis, pFrequency); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_GetStatus(ma_IDirectSoundBuffer* pThis, DWORD* pStatus)                              { return pThis->lpVtbl->GetStatus(pThis, pStatus); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_Initialize(ma_IDirectSoundBuffer* pThis, ma_IDirectSound* pDirectSound, const MA_DSBUFFERDESC* pDSBufferDesc) { return pThis->lpVtbl->Initialize(pThis, pDirectSound, pDSBufferDesc); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_Lock(ma_IDirectSoundBuffer* pThis, DWORD dwOffset, DWORD dwBytes, void** ppAudioPtr1, DWORD* pAudioBytes1, void** ppAudioPtr2, DWORD* pAudioBytes2, DWORD dwFlags) { return pThis->lpVtbl->Lock(pThis, dwOffset, dwBytes, ppAudioPtr1, pAudioBytes1, ppAudioPtr2, pAudioBytes2, dwFlags); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_Play(ma_IDirectSoundBuffer* pThis, DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags) { return pThis->lpVtbl->Play(pThis, dwReserved1, dwPriority, dwFlags); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_SetCurrentPosition(ma_IDirectSoundBuffer* pThis, DWORD dwNewPosition)                { return pThis->lpVtbl->SetCurrentPosition(pThis, dwNewPosition); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_SetFormat(ma_IDirectSoundBuffer* pThis, const MA_WAVEFORMATEX* pFormat)              { return pThis->lpVtbl->SetFormat(pThis, pFormat); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_SetVolume(ma_IDirectSoundBuffer* pThis, LONG volume)                                 { return pThis->lpVtbl->SetVolume(pThis, volume); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_SetPan(ma_IDirectSoundBuffer* pThis, LONG pan)                                       { return pThis->lpVtbl->SetPan(pThis, pan); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_SetFrequency(ma_IDirectSoundBuffer* pThis, DWORD dwFrequency)                        { return pThis->lpVtbl->SetFrequency(pThis, dwFrequency); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_Stop(ma_IDirectSoundBuffer* pThis)                                                   { return pThis->lpVtbl->Stop(pThis); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_Unlock(ma_IDirectSoundBuffer* pThis, void* pAudioPtr1, DWORD dwAudioBytes1, void* pAudioPtr2, DWORD dwAudioBytes2) { return pThis->lpVtbl->Unlock(pThis, pAudioPtr1, dwAudioBytes1, pAudioPtr2, dwAudioBytes2); }\nstatic MA_INLINE HRESULT ma_IDirectSoundBuffer_Restore(ma_IDirectSoundBuffer* pThis)                                                { return pThis->lpVtbl->Restore(pThis); }\n\n\n/* IDirectSoundCapture */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSoundCapture* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IDirectSoundCapture* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IDirectSoundCapture* pThis);\n\n    /* IDirectSoundCapture */\n    HRESULT (STDMETHODCALLTYPE * CreateCaptureBuffer)(ma_IDirectSoundCapture* pThis, const MA_DSCBUFFERDESC* pDSCBufferDesc, ma_IDirectSoundCaptureBuffer** ppDSCBuffer, void* pUnkOuter);\n    HRESULT (STDMETHODCALLTYPE * GetCaps)            (ma_IDirectSoundCapture* pThis, MA_DSCCAPS* pDSCCaps);\n    HRESULT (STDMETHODCALLTYPE * Initialize)         (ma_IDirectSoundCapture* pThis, const GUID* pGuidDevice);\n} ma_IDirectSoundCaptureVtbl;\nstruct ma_IDirectSoundCapture\n{\n    ma_IDirectSoundCaptureVtbl* lpVtbl;\n};\nstatic MA_INLINE HRESULT ma_IDirectSoundCapture_QueryInterface     (ma_IDirectSoundCapture* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nstatic MA_INLINE ULONG   ma_IDirectSoundCapture_AddRef             (ma_IDirectSoundCapture* pThis)                                    { return pThis->lpVtbl->AddRef(pThis); }\nstatic MA_INLINE ULONG   ma_IDirectSoundCapture_Release            (ma_IDirectSoundCapture* pThis)                                    { return pThis->lpVtbl->Release(pThis); }\nstatic MA_INLINE HRESULT ma_IDirectSoundCapture_CreateCaptureBuffer(ma_IDirectSoundCapture* pThis, const MA_DSCBUFFERDESC* pDSCBufferDesc, ma_IDirectSoundCaptureBuffer** ppDSCBuffer, void* pUnkOuter) { return pThis->lpVtbl->CreateCaptureBuffer(pThis, pDSCBufferDesc, ppDSCBuffer, pUnkOuter); }\nstatic MA_INLINE HRESULT ma_IDirectSoundCapture_GetCaps            (ma_IDirectSoundCapture* pThis, MA_DSCCAPS* pDSCCaps)              { return pThis->lpVtbl->GetCaps(pThis, pDSCCaps); }\nstatic MA_INLINE HRESULT ma_IDirectSoundCapture_Initialize         (ma_IDirectSoundCapture* pThis, const GUID* pGuidDevice)           { return pThis->lpVtbl->Initialize(pThis, pGuidDevice); }\n\n\n/* IDirectSoundCaptureBuffer */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSoundCaptureBuffer* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IDirectSoundCaptureBuffer* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IDirectSoundCaptureBuffer* pThis);\n\n    /* IDirectSoundCaptureBuffer */\n    HRESULT (STDMETHODCALLTYPE * GetCaps)           (ma_IDirectSoundCaptureBuffer* pThis, MA_DSCBCAPS* pDSCBCaps);\n    HRESULT (STDMETHODCALLTYPE * GetCurrentPosition)(ma_IDirectSoundCaptureBuffer* pThis, DWORD* pCapturePosition, DWORD* pReadPosition);\n    HRESULT (STDMETHODCALLTYPE * GetFormat)         (ma_IDirectSoundCaptureBuffer* pThis, MA_WAVEFORMATEX* pFormat, DWORD dwSizeAllocated, DWORD* pSizeWritten);\n    HRESULT (STDMETHODCALLTYPE * GetStatus)         (ma_IDirectSoundCaptureBuffer* pThis, DWORD* pStatus);\n    HRESULT (STDMETHODCALLTYPE * Initialize)        (ma_IDirectSoundCaptureBuffer* pThis, ma_IDirectSoundCapture* pDirectSoundCapture, const MA_DSCBUFFERDESC* pDSCBufferDesc);\n    HRESULT (STDMETHODCALLTYPE * Lock)              (ma_IDirectSoundCaptureBuffer* pThis, DWORD dwOffset, DWORD dwBytes, void** ppAudioPtr1, DWORD* pAudioBytes1, void** ppAudioPtr2, DWORD* pAudioBytes2, DWORD dwFlags);\n    HRESULT (STDMETHODCALLTYPE * Start)             (ma_IDirectSoundCaptureBuffer* pThis, DWORD dwFlags);\n    HRESULT (STDMETHODCALLTYPE * Stop)              (ma_IDirectSoundCaptureBuffer* pThis);\n    HRESULT (STDMETHODCALLTYPE * Unlock)            (ma_IDirectSoundCaptureBuffer* pThis, void* pAudioPtr1, DWORD dwAudioBytes1, void* pAudioPtr2, DWORD dwAudioBytes2);\n} ma_IDirectSoundCaptureBufferVtbl;\nstruct ma_IDirectSoundCaptureBuffer\n{\n    ma_IDirectSoundCaptureBufferVtbl* lpVtbl;\n};\nstatic MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_QueryInterface(ma_IDirectSoundCaptureBuffer* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nstatic MA_INLINE ULONG   ma_IDirectSoundCaptureBuffer_AddRef(ma_IDirectSoundCaptureBuffer* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nstatic MA_INLINE ULONG   ma_IDirectSoundCaptureBuffer_Release(ma_IDirectSoundCaptureBuffer* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nstatic MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_GetCaps(ma_IDirectSoundCaptureBuffer* pThis, MA_DSCBCAPS* pDSCBCaps)                        { return pThis->lpVtbl->GetCaps(pThis, pDSCBCaps); }\nstatic MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_GetCurrentPosition(ma_IDirectSoundCaptureBuffer* pThis, DWORD* pCapturePosition, DWORD* pReadPosition) { return pThis->lpVtbl->GetCurrentPosition(pThis, pCapturePosition, pReadPosition); }\nstatic MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_GetFormat(ma_IDirectSoundCaptureBuffer* pThis, MA_WAVEFORMATEX* pFormat, DWORD dwSizeAllocated, DWORD* pSizeWritten) { return pThis->lpVtbl->GetFormat(pThis, pFormat, dwSizeAllocated, pSizeWritten); }\nstatic MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_GetStatus(ma_IDirectSoundCaptureBuffer* pThis, DWORD* pStatus)                              { return pThis->lpVtbl->GetStatus(pThis, pStatus); }\nstatic MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_Initialize(ma_IDirectSoundCaptureBuffer* pThis, ma_IDirectSoundCapture* pDirectSoundCapture, const MA_DSCBUFFERDESC* pDSCBufferDesc) { return pThis->lpVtbl->Initialize(pThis, pDirectSoundCapture, pDSCBufferDesc); }\nstatic MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_Lock(ma_IDirectSoundCaptureBuffer* pThis, DWORD dwOffset, DWORD dwBytes, void** ppAudioPtr1, DWORD* pAudioBytes1, void** ppAudioPtr2, DWORD* pAudioBytes2, DWORD dwFlags) { return pThis->lpVtbl->Lock(pThis, dwOffset, dwBytes, ppAudioPtr1, pAudioBytes1, ppAudioPtr2, pAudioBytes2, dwFlags); }\nstatic MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_Start(ma_IDirectSoundCaptureBuffer* pThis, DWORD dwFlags)                                   { return pThis->lpVtbl->Start(pThis, dwFlags); }\nstatic MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_Stop(ma_IDirectSoundCaptureBuffer* pThis)                                                   { return pThis->lpVtbl->Stop(pThis); }\nstatic MA_INLINE HRESULT ma_IDirectSoundCaptureBuffer_Unlock(ma_IDirectSoundCaptureBuffer* pThis, void* pAudioPtr1, DWORD dwAudioBytes1, void* pAudioPtr2, DWORD dwAudioBytes2) { return pThis->lpVtbl->Unlock(pThis, pAudioPtr1, dwAudioBytes1, pAudioPtr2, dwAudioBytes2); }\n\n\n/* IDirectSoundNotify */\ntypedef struct\n{\n    /* IUnknown */\n    HRESULT (STDMETHODCALLTYPE * QueryInterface)(ma_IDirectSoundNotify* pThis, const IID* const riid, void** ppObject);\n    ULONG   (STDMETHODCALLTYPE * AddRef)        (ma_IDirectSoundNotify* pThis);\n    ULONG   (STDMETHODCALLTYPE * Release)       (ma_IDirectSoundNotify* pThis);\n\n    /* IDirectSoundNotify */\n    HRESULT (STDMETHODCALLTYPE * SetNotificationPositions)(ma_IDirectSoundNotify* pThis, DWORD dwPositionNotifies, const MA_DSBPOSITIONNOTIFY* pPositionNotifies);\n} ma_IDirectSoundNotifyVtbl;\nstruct ma_IDirectSoundNotify\n{\n    ma_IDirectSoundNotifyVtbl* lpVtbl;\n};\nstatic MA_INLINE HRESULT ma_IDirectSoundNotify_QueryInterface(ma_IDirectSoundNotify* pThis, const IID* const riid, void** ppObject) { return pThis->lpVtbl->QueryInterface(pThis, riid, ppObject); }\nstatic MA_INLINE ULONG   ma_IDirectSoundNotify_AddRef(ma_IDirectSoundNotify* pThis)                                                 { return pThis->lpVtbl->AddRef(pThis); }\nstatic MA_INLINE ULONG   ma_IDirectSoundNotify_Release(ma_IDirectSoundNotify* pThis)                                                { return pThis->lpVtbl->Release(pThis); }\nstatic MA_INLINE HRESULT ma_IDirectSoundNotify_SetNotificationPositions(ma_IDirectSoundNotify* pThis, DWORD dwPositionNotifies, const MA_DSBPOSITIONNOTIFY* pPositionNotifies) { return pThis->lpVtbl->SetNotificationPositions(pThis, dwPositionNotifies, pPositionNotifies); }\n\n\ntypedef BOOL    (CALLBACK * ma_DSEnumCallbackAProc)             (GUID* pDeviceGUID, const char* pDeviceDescription, const char* pModule, void* pContext);\ntypedef HRESULT (WINAPI   * ma_DirectSoundCreateProc)           (const GUID* pcGuidDevice, ma_IDirectSound** ppDS8, ma_IUnknown* pUnkOuter);\ntypedef HRESULT (WINAPI   * ma_DirectSoundEnumerateAProc)       (ma_DSEnumCallbackAProc pDSEnumCallback, void* pContext);\ntypedef HRESULT (WINAPI   * ma_DirectSoundCaptureCreateProc)    (const GUID* pcGuidDevice, ma_IDirectSoundCapture** ppDSC8, ma_IUnknown* pUnkOuter);\ntypedef HRESULT (WINAPI   * ma_DirectSoundCaptureEnumerateAProc)(ma_DSEnumCallbackAProc pDSEnumCallback, void* pContext);\n\nstatic ma_uint32 ma_get_best_sample_rate_within_range(ma_uint32 sampleRateMin, ma_uint32 sampleRateMax)\n{\n    /* Normalize the range in case we were given something stupid. */\n    if (sampleRateMin < (ma_uint32)ma_standard_sample_rate_min) {\n        sampleRateMin = (ma_uint32)ma_standard_sample_rate_min;\n    }\n    if (sampleRateMax > (ma_uint32)ma_standard_sample_rate_max) {\n        sampleRateMax = (ma_uint32)ma_standard_sample_rate_max;\n    }\n    if (sampleRateMin > sampleRateMax) {\n        sampleRateMin = sampleRateMax;\n    }\n\n    if (sampleRateMin == sampleRateMax) {\n        return sampleRateMax;\n    } else {\n        size_t iStandardRate;\n        for (iStandardRate = 0; iStandardRate < ma_countof(g_maStandardSampleRatePriorities); ++iStandardRate) {\n            ma_uint32 standardRate = g_maStandardSampleRatePriorities[iStandardRate];\n            if (standardRate >= sampleRateMin && standardRate <= sampleRateMax) {\n                return standardRate;\n            }\n        }\n    }\n\n    /* Should never get here. */\n    MA_ASSERT(MA_FALSE);\n    return 0;\n}\n\n/*\nRetrieves the channel count and channel map for the given speaker configuration. If the speaker configuration is unknown,\nthe channel count and channel map will be left unmodified.\n*/\nstatic void ma_get_channels_from_speaker_config__dsound(DWORD speakerConfig, WORD* pChannelsOut, DWORD* pChannelMapOut)\n{\n    WORD  channels;\n    DWORD channelMap;\n\n    channels = 0;\n    if (pChannelsOut != NULL) {\n        channels = *pChannelsOut;\n    }\n\n    channelMap = 0;\n    if (pChannelMapOut != NULL) {\n        channelMap = *pChannelMapOut;\n    }\n\n    /*\n    The speaker configuration is a combination of speaker config and speaker geometry. The lower 8 bits is what we care about. The upper\n    16 bits is for the geometry.\n    */\n    switch ((BYTE)(speakerConfig)) {\n        case 1 /*DSSPEAKER_HEADPHONE*/:                          channels = 2; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; break;\n        case 2 /*DSSPEAKER_MONO*/:                               channels = 1; channelMap = SPEAKER_FRONT_CENTER; break;\n        case 3 /*DSSPEAKER_QUAD*/:                               channels = 4; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT; break;\n        case 4 /*DSSPEAKER_STEREO*/:                             channels = 2; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT; break;\n        case 5 /*DSSPEAKER_SURROUND*/:                           channels = 4; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER; break;\n        case 6 /*DSSPEAKER_5POINT1_BACK*/ /*DSSPEAKER_5POINT1*/: channels = 6; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT; break;\n        case 7 /*DSSPEAKER_7POINT1_WIDE*/ /*DSSPEAKER_7POINT1*/: channels = 8; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_FRONT_LEFT_OF_CENTER | SPEAKER_FRONT_RIGHT_OF_CENTER; break;\n        case 8 /*DSSPEAKER_7POINT1_SURROUND*/:                   channels = 8; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT; break;\n        case 9 /*DSSPEAKER_5POINT1_SURROUND*/:                   channels = 6; channelMap = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT; break;\n        default: break;\n    }\n\n    if (pChannelsOut != NULL) {\n        *pChannelsOut = channels;\n    }\n\n    if (pChannelMapOut != NULL) {\n        *pChannelMapOut = channelMap;\n    }\n}\n\n\nstatic ma_result ma_context_create_IDirectSound__dsound(ma_context* pContext, ma_share_mode shareMode, const ma_device_id* pDeviceID, ma_IDirectSound** ppDirectSound)\n{\n    ma_IDirectSound* pDirectSound;\n    HWND hWnd;\n    HRESULT hr;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(ppDirectSound != NULL);\n\n    *ppDirectSound = NULL;\n    pDirectSound = NULL;\n\n    if (FAILED(((ma_DirectSoundCreateProc)pContext->dsound.DirectSoundCreate)((pDeviceID == NULL) ? NULL : (const GUID*)pDeviceID->dsound, &pDirectSound, NULL))) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[DirectSound] DirectSoundCreate() failed for playback device.\");\n        return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n    }\n\n    /* The cooperative level must be set before doing anything else. */\n    hWnd = ((MA_PFN_GetForegroundWindow)pContext->win32.GetForegroundWindow)();\n    if (hWnd == 0) {\n        hWnd = ((MA_PFN_GetDesktopWindow)pContext->win32.GetDesktopWindow)();\n    }\n\n    hr = ma_IDirectSound_SetCooperativeLevel(pDirectSound, hWnd, (shareMode == ma_share_mode_exclusive) ? MA_DSSCL_EXCLUSIVE : MA_DSSCL_PRIORITY);\n    if (FAILED(hr)) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSound_SetCooperateiveLevel() failed for playback device.\");\n        return ma_result_from_HRESULT(hr);\n    }\n\n    *ppDirectSound = pDirectSound;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_create_IDirectSoundCapture__dsound(ma_context* pContext, ma_share_mode shareMode, const ma_device_id* pDeviceID, ma_IDirectSoundCapture** ppDirectSoundCapture)\n{\n    ma_IDirectSoundCapture* pDirectSoundCapture;\n    HRESULT hr;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(ppDirectSoundCapture != NULL);\n\n    /* DirectSound does not support exclusive mode for capture. */\n    if (shareMode == ma_share_mode_exclusive) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    *ppDirectSoundCapture = NULL;\n    pDirectSoundCapture = NULL;\n\n    hr = ((ma_DirectSoundCaptureCreateProc)pContext->dsound.DirectSoundCaptureCreate)((pDeviceID == NULL) ? NULL : (const GUID*)pDeviceID->dsound, &pDirectSoundCapture, NULL);\n    if (FAILED(hr)) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[DirectSound] DirectSoundCaptureCreate() failed for capture device.\");\n        return ma_result_from_HRESULT(hr);\n    }\n\n    *ppDirectSoundCapture = pDirectSoundCapture;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_get_format_info_for_IDirectSoundCapture__dsound(ma_context* pContext, ma_IDirectSoundCapture* pDirectSoundCapture, WORD* pChannels, WORD* pBitsPerSample, DWORD* pSampleRate)\n{\n    HRESULT hr;\n    MA_DSCCAPS caps;\n    WORD bitsPerSample;\n    DWORD sampleRate;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pDirectSoundCapture != NULL);\n\n    if (pChannels) {\n        *pChannels = 0;\n    }\n    if (pBitsPerSample) {\n        *pBitsPerSample = 0;\n    }\n    if (pSampleRate) {\n        *pSampleRate = 0;\n    }\n\n    MA_ZERO_OBJECT(&caps);\n    caps.dwSize = sizeof(caps);\n    hr = ma_IDirectSoundCapture_GetCaps(pDirectSoundCapture, &caps);\n    if (FAILED(hr)) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundCapture_GetCaps() failed for capture device.\");\n        return ma_result_from_HRESULT(hr);\n    }\n\n    if (pChannels) {\n        *pChannels = (WORD)caps.dwChannels;\n    }\n\n    /* The device can support multiple formats. We just go through the different formats in order of priority and pick the first one. This the same type of system as the WinMM backend. */\n    bitsPerSample = 16;\n    sampleRate = 48000;\n\n    if (caps.dwChannels == 1) {\n        if ((caps.dwFormats & WAVE_FORMAT_48M16) != 0) {\n            sampleRate = 48000;\n        } else if ((caps.dwFormats & WAVE_FORMAT_44M16) != 0) {\n            sampleRate = 44100;\n        } else if ((caps.dwFormats & WAVE_FORMAT_2M16) != 0) {\n            sampleRate = 22050;\n        } else if ((caps.dwFormats & WAVE_FORMAT_1M16) != 0) {\n            sampleRate = 11025;\n        } else if ((caps.dwFormats & WAVE_FORMAT_96M16) != 0) {\n            sampleRate = 96000;\n        } else {\n            bitsPerSample = 8;\n            if ((caps.dwFormats & WAVE_FORMAT_48M08) != 0) {\n                sampleRate = 48000;\n            } else if ((caps.dwFormats & WAVE_FORMAT_44M08) != 0) {\n                sampleRate = 44100;\n            } else if ((caps.dwFormats & WAVE_FORMAT_2M08) != 0) {\n                sampleRate = 22050;\n            } else if ((caps.dwFormats & WAVE_FORMAT_1M08) != 0) {\n                sampleRate = 11025;\n            } else if ((caps.dwFormats & WAVE_FORMAT_96M08) != 0) {\n                sampleRate = 96000;\n            } else {\n                bitsPerSample = 16;  /* Didn't find it. Just fall back to 16-bit. */\n            }\n        }\n    } else if (caps.dwChannels == 2) {\n        if ((caps.dwFormats & WAVE_FORMAT_48S16) != 0) {\n            sampleRate = 48000;\n        } else if ((caps.dwFormats & WAVE_FORMAT_44S16) != 0) {\n            sampleRate = 44100;\n        } else if ((caps.dwFormats & WAVE_FORMAT_2S16) != 0) {\n            sampleRate = 22050;\n        } else if ((caps.dwFormats & WAVE_FORMAT_1S16) != 0) {\n            sampleRate = 11025;\n        } else if ((caps.dwFormats & WAVE_FORMAT_96S16) != 0) {\n            sampleRate = 96000;\n        } else {\n            bitsPerSample = 8;\n            if ((caps.dwFormats & WAVE_FORMAT_48S08) != 0) {\n                sampleRate = 48000;\n            } else if ((caps.dwFormats & WAVE_FORMAT_44S08) != 0) {\n                sampleRate = 44100;\n            } else if ((caps.dwFormats & WAVE_FORMAT_2S08) != 0) {\n                sampleRate = 22050;\n            } else if ((caps.dwFormats & WAVE_FORMAT_1S08) != 0) {\n                sampleRate = 11025;\n            } else if ((caps.dwFormats & WAVE_FORMAT_96S08) != 0) {\n                sampleRate = 96000;\n            } else {\n                bitsPerSample = 16;  /* Didn't find it. Just fall back to 16-bit. */\n            }\n        }\n    }\n\n    if (pBitsPerSample) {\n        *pBitsPerSample = bitsPerSample;\n    }\n    if (pSampleRate) {\n        *pSampleRate = sampleRate;\n    }\n\n    return MA_SUCCESS;\n}\n\n\ntypedef struct\n{\n    ma_context* pContext;\n    ma_device_type deviceType;\n    ma_enum_devices_callback_proc callback;\n    void* pUserData;\n    ma_bool32 terminated;\n} ma_context_enumerate_devices_callback_data__dsound;\n\nstatic BOOL CALLBACK ma_context_enumerate_devices_callback__dsound(GUID* lpGuid, const char* lpcstrDescription, const char* lpcstrModule, void* lpContext)\n{\n    ma_context_enumerate_devices_callback_data__dsound* pData = (ma_context_enumerate_devices_callback_data__dsound*)lpContext;\n    ma_device_info deviceInfo;\n\n    (void)lpcstrModule;\n\n    MA_ZERO_OBJECT(&deviceInfo);\n\n    /* ID. */\n    if (lpGuid != NULL) {\n        MA_COPY_MEMORY(deviceInfo.id.dsound, lpGuid, 16);\n    } else {\n        MA_ZERO_MEMORY(deviceInfo.id.dsound, 16);\n        deviceInfo.isDefault = MA_TRUE;\n    }\n\n    /* Name / Description */\n    ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), lpcstrDescription, (size_t)-1);\n\n\n    /* Call the callback function, but make sure we stop enumerating if the callee requested so. */\n    MA_ASSERT(pData != NULL);\n    pData->terminated = (pData->callback(pData->pContext, pData->deviceType, &deviceInfo, pData->pUserData) == MA_FALSE);\n    if (pData->terminated) {\n        return FALSE;   /* Stop enumeration. */\n    } else {\n        return TRUE;    /* Continue enumeration. */\n    }\n}\n\nstatic ma_result ma_context_enumerate_devices__dsound(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_context_enumerate_devices_callback_data__dsound data;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(callback != NULL);\n\n    data.pContext = pContext;\n    data.callback = callback;\n    data.pUserData = pUserData;\n    data.terminated = MA_FALSE;\n\n    /* Playback. */\n    if (!data.terminated) {\n        data.deviceType = ma_device_type_playback;\n        ((ma_DirectSoundEnumerateAProc)pContext->dsound.DirectSoundEnumerateA)(ma_context_enumerate_devices_callback__dsound, &data);\n    }\n\n    /* Capture. */\n    if (!data.terminated) {\n        data.deviceType = ma_device_type_capture;\n        ((ma_DirectSoundCaptureEnumerateAProc)pContext->dsound.DirectSoundCaptureEnumerateA)(ma_context_enumerate_devices_callback__dsound, &data);\n    }\n\n    return MA_SUCCESS;\n}\n\n\ntypedef struct\n{\n    const ma_device_id* pDeviceID;\n    ma_device_info* pDeviceInfo;\n    ma_bool32 found;\n} ma_context_get_device_info_callback_data__dsound;\n\nstatic BOOL CALLBACK ma_context_get_device_info_callback__dsound(GUID* lpGuid, const char* lpcstrDescription, const char* lpcstrModule, void* lpContext)\n{\n    ma_context_get_device_info_callback_data__dsound* pData = (ma_context_get_device_info_callback_data__dsound*)lpContext;\n    MA_ASSERT(pData != NULL);\n\n    if ((pData->pDeviceID == NULL || ma_is_guid_null(pData->pDeviceID->dsound)) && (lpGuid == NULL || ma_is_guid_null(lpGuid))) {\n        /* Default device. */\n        ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), lpcstrDescription, (size_t)-1);\n        pData->pDeviceInfo->isDefault = MA_TRUE;\n        pData->found = MA_TRUE;\n        return FALSE;   /* Stop enumeration. */\n    } else {\n        /* Not the default device. */\n        if (lpGuid != NULL && pData->pDeviceID != NULL) {\n            if (memcmp(pData->pDeviceID->dsound, lpGuid, sizeof(pData->pDeviceID->dsound)) == 0) {\n                ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), lpcstrDescription, (size_t)-1);\n                pData->found = MA_TRUE;\n                return FALSE;   /* Stop enumeration. */\n            }\n        }\n    }\n\n    (void)lpcstrModule;\n    return TRUE;\n}\n\nstatic ma_result ma_context_get_device_info__dsound(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    ma_result result;\n    HRESULT hr;\n\n    if (pDeviceID != NULL) {\n        ma_context_get_device_info_callback_data__dsound data;\n\n        /* ID. */\n        MA_COPY_MEMORY(pDeviceInfo->id.dsound, pDeviceID->dsound, 16);\n\n        /* Name / Description. This is retrieved by enumerating over each device until we find that one that matches the input ID. */\n        data.pDeviceID = pDeviceID;\n        data.pDeviceInfo = pDeviceInfo;\n        data.found = MA_FALSE;\n        if (deviceType == ma_device_type_playback) {\n            ((ma_DirectSoundEnumerateAProc)pContext->dsound.DirectSoundEnumerateA)(ma_context_get_device_info_callback__dsound, &data);\n        } else {\n            ((ma_DirectSoundCaptureEnumerateAProc)pContext->dsound.DirectSoundCaptureEnumerateA)(ma_context_get_device_info_callback__dsound, &data);\n        }\n\n        if (!data.found) {\n            return MA_NO_DEVICE;\n        }\n    } else {\n        /* I don't think there's a way to get the name of the default device with DirectSound. In this case we just need to use defaults. */\n\n        /* ID */\n        MA_ZERO_MEMORY(pDeviceInfo->id.dsound, 16);\n\n        /* Name / Description */\n        if (deviceType == ma_device_type_playback) {\n            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n        } else {\n            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n        }\n\n        pDeviceInfo->isDefault = MA_TRUE;\n    }\n\n    /* Retrieving detailed information is slightly different depending on the device type. */\n    if (deviceType == ma_device_type_playback) {\n        /* Playback. */\n        ma_IDirectSound* pDirectSound;\n        MA_DSCAPS caps;\n        WORD channels;\n\n        result = ma_context_create_IDirectSound__dsound(pContext, ma_share_mode_shared, pDeviceID, &pDirectSound);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        MA_ZERO_OBJECT(&caps);\n        caps.dwSize = sizeof(caps);\n        hr = ma_IDirectSound_GetCaps(pDirectSound, &caps);\n        if (FAILED(hr)) {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSound_GetCaps() failed for playback device.\");\n            return ma_result_from_HRESULT(hr);\n        }\n\n\n        /* Channels. Only a single channel count is reported for DirectSound. */\n        if ((caps.dwFlags & MA_DSCAPS_PRIMARYSTEREO) != 0) {\n            /* It supports at least stereo, but could support more. */\n            DWORD speakerConfig;\n\n            channels = 2;\n\n            /* Look at the speaker configuration to get a better idea on the channel count. */\n            hr = ma_IDirectSound_GetSpeakerConfig(pDirectSound, &speakerConfig);\n            if (SUCCEEDED(hr)) {\n                ma_get_channels_from_speaker_config__dsound(speakerConfig, &channels, NULL);\n            }\n        } else {\n            /* It does not support stereo, which means we are stuck with mono. */\n            channels = 1;\n        }\n\n\n        /*\n        In DirectSound, our native formats are centered around sample rates. All formats are supported, and we're only reporting a single channel\n        count. However, DirectSound can report a range of supported sample rates. We're only going to include standard rates known by miniaudio\n        in order to keep the size of this within reason.\n        */\n        if ((caps.dwFlags & MA_DSCAPS_CONTINUOUSRATE) != 0) {\n            /* Multiple sample rates are supported. We'll report in order of our preferred sample rates. */\n            size_t iStandardSampleRate;\n            for (iStandardSampleRate = 0; iStandardSampleRate < ma_countof(g_maStandardSampleRatePriorities); iStandardSampleRate += 1) {\n                ma_uint32 sampleRate = g_maStandardSampleRatePriorities[iStandardSampleRate];\n                if (sampleRate >= caps.dwMinSecondarySampleRate && sampleRate <= caps.dwMaxSecondarySampleRate) {\n                    pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format     = ma_format_unknown;\n                    pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels   = channels;\n                    pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = sampleRate;\n                    pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags      = 0;\n                    pDeviceInfo->nativeDataFormatCount += 1;\n                }\n            }\n        } else {\n            /* Only a single sample rate is supported. */\n            pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format     = ma_format_unknown;\n            pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels   = channels;\n            pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = caps.dwMaxSecondarySampleRate;\n            pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags      = 0;\n            pDeviceInfo->nativeDataFormatCount += 1;\n        }\n\n        ma_IDirectSound_Release(pDirectSound);\n    } else {\n        /*\n        Capture. This is a little different to playback due to the say the supported formats are reported. Technically capture\n        devices can support a number of different formats, but for simplicity and consistency with ma_device_init() I'm just\n        reporting the best format.\n        */\n        ma_IDirectSoundCapture* pDirectSoundCapture;\n        WORD channels;\n        WORD bitsPerSample;\n        DWORD sampleRate;\n\n        result = ma_context_create_IDirectSoundCapture__dsound(pContext, ma_share_mode_shared, pDeviceID, &pDirectSoundCapture);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        result = ma_context_get_format_info_for_IDirectSoundCapture__dsound(pContext, pDirectSoundCapture, &channels, &bitsPerSample, &sampleRate);\n        if (result != MA_SUCCESS) {\n            ma_IDirectSoundCapture_Release(pDirectSoundCapture);\n            return result;\n        }\n\n        ma_IDirectSoundCapture_Release(pDirectSoundCapture);\n\n        /* The format is always an integer format and is based on the bits per sample. */\n        if (bitsPerSample == 8) {\n            pDeviceInfo->nativeDataFormats[0].format = ma_format_u8;\n        } else if (bitsPerSample == 16) {\n            pDeviceInfo->nativeDataFormats[0].format = ma_format_s16;\n        } else if (bitsPerSample == 24) {\n            pDeviceInfo->nativeDataFormats[0].format = ma_format_s24;\n        } else if (bitsPerSample == 32) {\n            pDeviceInfo->nativeDataFormats[0].format = ma_format_s32;\n        } else {\n            return MA_FORMAT_NOT_SUPPORTED;\n        }\n\n        pDeviceInfo->nativeDataFormats[0].channels   = channels;\n        pDeviceInfo->nativeDataFormats[0].sampleRate = sampleRate;\n        pDeviceInfo->nativeDataFormats[0].flags      = 0;\n        pDeviceInfo->nativeDataFormatCount = 1;\n    }\n\n    return MA_SUCCESS;\n}\n\n\n\nstatic ma_result ma_device_uninit__dsound(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->dsound.pCaptureBuffer != NULL) {\n        ma_IDirectSoundCaptureBuffer_Release((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer);\n    }\n    if (pDevice->dsound.pCapture != NULL) {\n        ma_IDirectSoundCapture_Release((ma_IDirectSoundCapture*)pDevice->dsound.pCapture);\n    }\n\n    if (pDevice->dsound.pPlaybackBuffer != NULL) {\n        ma_IDirectSoundBuffer_Release((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer);\n    }\n    if (pDevice->dsound.pPlaybackPrimaryBuffer != NULL) {\n        ma_IDirectSoundBuffer_Release((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackPrimaryBuffer);\n    }\n    if (pDevice->dsound.pPlayback != NULL) {\n        ma_IDirectSound_Release((ma_IDirectSound*)pDevice->dsound.pPlayback);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_config_to_WAVEFORMATEXTENSIBLE(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, const ma_channel* pChannelMap, MA_WAVEFORMATEXTENSIBLE* pWF)\n{\n    GUID subformat;\n\n    if (format == ma_format_unknown) {\n        format = MA_DEFAULT_FORMAT;\n    }\n\n    if (channels == 0) {\n        channels = MA_DEFAULT_CHANNELS;\n    }\n\n    if (sampleRate == 0) {\n        sampleRate = MA_DEFAULT_SAMPLE_RATE;\n    }\n\n    switch (format)\n    {\n        case ma_format_u8:\n        case ma_format_s16:\n        case ma_format_s24:\n        /*case ma_format_s24_32:*/\n        case ma_format_s32:\n        {\n            subformat = MA_GUID_KSDATAFORMAT_SUBTYPE_PCM;\n        } break;\n\n        case ma_format_f32:\n        {\n            subformat = MA_GUID_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;\n        } break;\n\n        default:\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n\n    MA_ZERO_OBJECT(pWF);\n    pWF->cbSize                      = sizeof(*pWF);\n    pWF->wFormatTag                  = WAVE_FORMAT_EXTENSIBLE;\n    pWF->nChannels                   = (WORD)channels;\n    pWF->nSamplesPerSec              = (DWORD)sampleRate;\n    pWF->wBitsPerSample              = (WORD)(ma_get_bytes_per_sample(format)*8);\n    pWF->nBlockAlign                 = (WORD)(pWF->nChannels * pWF->wBitsPerSample / 8);\n    pWF->nAvgBytesPerSec             = pWF->nBlockAlign * pWF->nSamplesPerSec;\n    pWF->Samples.wValidBitsPerSample = pWF->wBitsPerSample;\n    pWF->dwChannelMask               = ma_channel_map_to_channel_mask__win32(pChannelMap, channels);\n    pWF->SubFormat                   = subformat;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_uint32 ma_calculate_period_size_in_frames_from_descriptor__dsound(const ma_device_descriptor* pDescriptor, ma_uint32 nativeSampleRate, ma_performance_profile performanceProfile)\n{\n    /*\n    DirectSound has a minimum period size of 20ms. In practice, this doesn't seem to be enough for\n    reliable glitch-free processing so going to use 30ms instead.\n    */\n    ma_uint32 minPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(30, nativeSampleRate);\n    ma_uint32 periodSizeInFrames;\n\n    periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, nativeSampleRate, performanceProfile);\n    if (periodSizeInFrames < minPeriodSizeInFrames) {\n        periodSizeInFrames = minPeriodSizeInFrames;\n    }\n\n    return periodSizeInFrames;\n}\n\nstatic ma_result ma_device_init__dsound(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n    ma_result result;\n    HRESULT hr;\n\n    MA_ASSERT(pDevice != NULL);\n\n    MA_ZERO_OBJECT(&pDevice->dsound);\n\n    if (pConfig->deviceType == ma_device_type_loopback) {\n        return MA_DEVICE_TYPE_NOT_SUPPORTED;\n    }\n\n    /*\n    Unfortunately DirectSound uses different APIs and data structures for playback and catpure devices. We need to initialize\n    the capture device first because we'll want to match it's buffer size and period count on the playback side if we're using\n    full-duplex mode.\n    */\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        MA_WAVEFORMATEXTENSIBLE wf;\n        MA_DSCBUFFERDESC descDS;\n        ma_uint32 periodSizeInFrames;\n        ma_uint32 periodCount;\n        char rawdata[1024]; /* <-- Ugly hack to avoid a malloc() due to a crappy DirectSound API. */\n        MA_WAVEFORMATEXTENSIBLE* pActualFormat;\n\n        result = ma_config_to_WAVEFORMATEXTENSIBLE(pDescriptorCapture->format, pDescriptorCapture->channels, pDescriptorCapture->sampleRate, pDescriptorCapture->channelMap, &wf);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        result = ma_context_create_IDirectSoundCapture__dsound(pDevice->pContext, pDescriptorCapture->shareMode, pDescriptorCapture->pDeviceID, (ma_IDirectSoundCapture**)&pDevice->dsound.pCapture);\n        if (result != MA_SUCCESS) {\n            ma_device_uninit__dsound(pDevice);\n            return result;\n        }\n\n        result = ma_context_get_format_info_for_IDirectSoundCapture__dsound(pDevice->pContext, (ma_IDirectSoundCapture*)pDevice->dsound.pCapture, &wf.nChannels, &wf.wBitsPerSample, &wf.nSamplesPerSec);\n        if (result != MA_SUCCESS) {\n            ma_device_uninit__dsound(pDevice);\n            return result;\n        }\n\n        wf.nBlockAlign                 = (WORD)(wf.nChannels * wf.wBitsPerSample / 8);\n        wf.nAvgBytesPerSec             = wf.nBlockAlign * wf.nSamplesPerSec;\n        wf.Samples.wValidBitsPerSample = wf.wBitsPerSample;\n        wf.SubFormat                   = MA_GUID_KSDATAFORMAT_SUBTYPE_PCM;\n\n        /* The size of the buffer must be a clean multiple of the period count. */\n        periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__dsound(pDescriptorCapture, wf.nSamplesPerSec, pConfig->performanceProfile);\n        periodCount = (pDescriptorCapture->periodCount > 0) ? pDescriptorCapture->periodCount : MA_DEFAULT_PERIODS;\n\n        MA_ZERO_OBJECT(&descDS);\n        descDS.dwSize        = sizeof(descDS);\n        descDS.dwFlags       = 0;\n        descDS.dwBufferBytes = periodSizeInFrames * periodCount * wf.nBlockAlign;\n        descDS.lpwfxFormat   = (MA_WAVEFORMATEX*)&wf;\n        hr = ma_IDirectSoundCapture_CreateCaptureBuffer((ma_IDirectSoundCapture*)pDevice->dsound.pCapture, &descDS, (ma_IDirectSoundCaptureBuffer**)&pDevice->dsound.pCaptureBuffer, NULL);\n        if (FAILED(hr)) {\n            ma_device_uninit__dsound(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundCapture_CreateCaptureBuffer() failed for capture device.\");\n            return ma_result_from_HRESULT(hr);\n        }\n\n        /* Get the _actual_ properties of the buffer. */\n        pActualFormat = (MA_WAVEFORMATEXTENSIBLE*)rawdata;\n        hr = ma_IDirectSoundCaptureBuffer_GetFormat((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, (MA_WAVEFORMATEX*)pActualFormat, sizeof(rawdata), NULL);\n        if (FAILED(hr)) {\n            ma_device_uninit__dsound(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to retrieve the actual format of the capture device's buffer.\");\n            return ma_result_from_HRESULT(hr);\n        }\n\n        /* We can now start setting the output data formats. */\n        pDescriptorCapture->format     = ma_format_from_WAVEFORMATEX((MA_WAVEFORMATEX*)pActualFormat);\n        pDescriptorCapture->channels   = pActualFormat->nChannels;\n        pDescriptorCapture->sampleRate = pActualFormat->nSamplesPerSec;\n\n        /* Get the native channel map based on the channel mask. */\n        if (pActualFormat->wFormatTag == WAVE_FORMAT_EXTENSIBLE) {\n            ma_channel_mask_to_channel_map__win32(pActualFormat->dwChannelMask, pDescriptorCapture->channels, pDescriptorCapture->channelMap);\n        } else {\n            ma_channel_mask_to_channel_map__win32(wf.dwChannelMask, pDescriptorCapture->channels, pDescriptorCapture->channelMap);\n        }\n\n        /*\n        After getting the actual format the size of the buffer in frames may have actually changed. However, we want this to be as close to what the\n        user has asked for as possible, so let's go ahead and release the old capture buffer and create a new one in this case.\n        */\n        if (periodSizeInFrames != (descDS.dwBufferBytes / ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels) / periodCount)) {\n            descDS.dwBufferBytes = periodSizeInFrames * ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels) * periodCount;\n            ma_IDirectSoundCaptureBuffer_Release((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer);\n\n            hr = ma_IDirectSoundCapture_CreateCaptureBuffer((ma_IDirectSoundCapture*)pDevice->dsound.pCapture, &descDS, (ma_IDirectSoundCaptureBuffer**)&pDevice->dsound.pCaptureBuffer, NULL);\n            if (FAILED(hr)) {\n                ma_device_uninit__dsound(pDevice);\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] Second attempt at IDirectSoundCapture_CreateCaptureBuffer() failed for capture device.\");\n                return ma_result_from_HRESULT(hr);\n            }\n        }\n\n        /* DirectSound should give us a buffer exactly the size we asked for. */\n        pDescriptorCapture->periodSizeInFrames = periodSizeInFrames;\n        pDescriptorCapture->periodCount        = periodCount;\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        MA_WAVEFORMATEXTENSIBLE wf;\n        MA_DSBUFFERDESC descDSPrimary;\n        MA_DSCAPS caps;\n        char rawdata[1024]; /* <-- Ugly hack to avoid a malloc() due to a crappy DirectSound API. */\n        MA_WAVEFORMATEXTENSIBLE* pActualFormat;\n        ma_uint32 periodSizeInFrames;\n        ma_uint32 periodCount;\n        MA_DSBUFFERDESC descDS;\n        WORD nativeChannelCount;\n        DWORD nativeChannelMask = 0;\n\n        result = ma_config_to_WAVEFORMATEXTENSIBLE(pDescriptorPlayback->format, pDescriptorPlayback->channels, pDescriptorPlayback->sampleRate, pDescriptorPlayback->channelMap, &wf);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        result = ma_context_create_IDirectSound__dsound(pDevice->pContext, pDescriptorPlayback->shareMode, pDescriptorPlayback->pDeviceID, (ma_IDirectSound**)&pDevice->dsound.pPlayback);\n        if (result != MA_SUCCESS) {\n            ma_device_uninit__dsound(pDevice);\n            return result;\n        }\n\n        MA_ZERO_OBJECT(&descDSPrimary);\n        descDSPrimary.dwSize  = sizeof(MA_DSBUFFERDESC);\n        descDSPrimary.dwFlags = MA_DSBCAPS_PRIMARYBUFFER | MA_DSBCAPS_CTRLVOLUME;\n        hr = ma_IDirectSound_CreateSoundBuffer((ma_IDirectSound*)pDevice->dsound.pPlayback, &descDSPrimary, (ma_IDirectSoundBuffer**)&pDevice->dsound.pPlaybackPrimaryBuffer, NULL);\n        if (FAILED(hr)) {\n            ma_device_uninit__dsound(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSound_CreateSoundBuffer() failed for playback device's primary buffer.\");\n            return ma_result_from_HRESULT(hr);\n        }\n\n\n        /* We may want to make some adjustments to the format if we are using defaults. */\n        MA_ZERO_OBJECT(&caps);\n        caps.dwSize = sizeof(caps);\n        hr = ma_IDirectSound_GetCaps((ma_IDirectSound*)pDevice->dsound.pPlayback, &caps);\n        if (FAILED(hr)) {\n            ma_device_uninit__dsound(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSound_GetCaps() failed for playback device.\");\n            return ma_result_from_HRESULT(hr);\n        }\n\n        if ((caps.dwFlags & MA_DSCAPS_PRIMARYSTEREO) != 0) {\n            DWORD speakerConfig;\n\n            /* It supports at least stereo, but could support more. */\n            nativeChannelCount = 2;\n\n            /* Look at the speaker configuration to get a better idea on the channel count. */\n            if (SUCCEEDED(ma_IDirectSound_GetSpeakerConfig((ma_IDirectSound*)pDevice->dsound.pPlayback, &speakerConfig))) {\n                ma_get_channels_from_speaker_config__dsound(speakerConfig, &nativeChannelCount, &nativeChannelMask);\n            }\n        } else {\n            /* It does not support stereo, which means we are stuck with mono. */\n            nativeChannelCount = 1;\n            nativeChannelMask  = 0x00000001;\n        }\n\n        if (pDescriptorPlayback->channels == 0) {\n            wf.nChannels = nativeChannelCount;\n            wf.dwChannelMask    = nativeChannelMask;\n        }\n\n        if (pDescriptorPlayback->sampleRate == 0) {\n            /* We base the sample rate on the values returned by GetCaps(). */\n            if ((caps.dwFlags & MA_DSCAPS_CONTINUOUSRATE) != 0) {\n                wf.nSamplesPerSec = ma_get_best_sample_rate_within_range(caps.dwMinSecondarySampleRate, caps.dwMaxSecondarySampleRate);\n            } else {\n                wf.nSamplesPerSec = caps.dwMaxSecondarySampleRate;\n            }\n        }\n\n        wf.nBlockAlign     = (WORD)(wf.nChannels * wf.wBitsPerSample / 8);\n        wf.nAvgBytesPerSec = wf.nBlockAlign * wf.nSamplesPerSec;\n\n        /*\n        From MSDN:\n\n        The method succeeds even if the hardware does not support the requested format; DirectSound sets the buffer to the closest\n        supported format. To determine whether this has happened, an application can call the GetFormat method for the primary buffer\n        and compare the result with the format that was requested with the SetFormat method.\n        */\n        hr = ma_IDirectSoundBuffer_SetFormat((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackPrimaryBuffer, (MA_WAVEFORMATEX*)&wf);\n        if (FAILED(hr)) {\n            /*\n            If setting of the format failed we'll try again with some fallback settings. On Windows 98 I have\n            observed that IEEE_FLOAT does not work. We'll therefore enforce PCM. I also had issues where a\n            sample rate of 48000 did not work correctly. Not sure if it was a driver issue or not, but will\n            use 44100 for the sample rate.\n            */\n            wf.cbSize          = 18;    /* NOTE: Don't use sizeof(MA_WAVEFORMATEX) here because it's got an extra 2 bytes due to padding. */\n            wf.wFormatTag      = WAVE_FORMAT_PCM;\n            wf.wBitsPerSample  = 16;\n            wf.nChannels       = nativeChannelCount;\n            wf.nSamplesPerSec  = 44100;\n            wf.nBlockAlign     = wf.nChannels * (wf.wBitsPerSample / 8);\n            wf.nAvgBytesPerSec = wf.nSamplesPerSec * wf.nBlockAlign;\n\n            hr = ma_IDirectSoundBuffer_SetFormat((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackPrimaryBuffer, (MA_WAVEFORMATEX*)&wf);\n            if (FAILED(hr)) {\n                ma_device_uninit__dsound(pDevice);\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to set format of playback device's primary buffer.\");\n                return ma_result_from_HRESULT(hr);\n            }\n        }\n\n        /* Get the _actual_ properties of the buffer. */\n        pActualFormat = (MA_WAVEFORMATEXTENSIBLE*)rawdata;\n        hr = ma_IDirectSoundBuffer_GetFormat((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackPrimaryBuffer, (MA_WAVEFORMATEX*)pActualFormat, sizeof(rawdata), NULL);\n        if (FAILED(hr)) {\n            ma_device_uninit__dsound(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to retrieve the actual format of the playback device's primary buffer.\");\n            return ma_result_from_HRESULT(hr);\n        }\n\n        /* We now have enough information to start setting some output properties. */\n        pDescriptorPlayback->format     = ma_format_from_WAVEFORMATEX((MA_WAVEFORMATEX*)pActualFormat);\n        pDescriptorPlayback->channels   = pActualFormat->nChannels;\n        pDescriptorPlayback->sampleRate = pActualFormat->nSamplesPerSec;\n\n        /* Get the internal channel map based on the channel mask. */\n        if (pActualFormat->wFormatTag == WAVE_FORMAT_EXTENSIBLE) {\n            ma_channel_mask_to_channel_map__win32(pActualFormat->dwChannelMask, pDescriptorPlayback->channels, pDescriptorPlayback->channelMap);\n        } else {\n            ma_channel_mask_to_channel_map__win32(wf.dwChannelMask, pDescriptorPlayback->channels, pDescriptorPlayback->channelMap);\n        }\n\n        /* The size of the buffer must be a clean multiple of the period count. */\n        periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__dsound(pDescriptorPlayback, pDescriptorPlayback->sampleRate, pConfig->performanceProfile);\n        periodCount = (pDescriptorPlayback->periodCount > 0) ? pDescriptorPlayback->periodCount : MA_DEFAULT_PERIODS;\n\n        /*\n        Meaning of dwFlags (from MSDN):\n\n        DSBCAPS_CTRLPOSITIONNOTIFY\n          The buffer has position notification capability.\n\n        DSBCAPS_GLOBALFOCUS\n          With this flag set, an application using DirectSound can continue to play its buffers if the user switches focus to\n          another application, even if the new application uses DirectSound.\n\n        DSBCAPS_GETCURRENTPOSITION2\n          In the first version of DirectSound, the play cursor was significantly ahead of the actual playing sound on emulated\n          sound cards; it was directly behind the write cursor. Now, if the DSBCAPS_GETCURRENTPOSITION2 flag is specified, the\n          application can get a more accurate play cursor.\n        */\n        MA_ZERO_OBJECT(&descDS);\n        descDS.dwSize = sizeof(descDS);\n        descDS.dwFlags = MA_DSBCAPS_CTRLPOSITIONNOTIFY | MA_DSBCAPS_GLOBALFOCUS | MA_DSBCAPS_GETCURRENTPOSITION2;\n        descDS.dwBufferBytes = periodSizeInFrames * periodCount * ma_get_bytes_per_frame(pDescriptorPlayback->format, pDescriptorPlayback->channels);\n        descDS.lpwfxFormat = (MA_WAVEFORMATEX*)pActualFormat;\n        hr = ma_IDirectSound_CreateSoundBuffer((ma_IDirectSound*)pDevice->dsound.pPlayback, &descDS, (ma_IDirectSoundBuffer**)&pDevice->dsound.pPlaybackBuffer, NULL);\n        if (FAILED(hr)) {\n            ma_device_uninit__dsound(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSound_CreateSoundBuffer() failed for playback device's secondary buffer.\");\n            return ma_result_from_HRESULT(hr);\n        }\n\n        /* DirectSound should give us a buffer exactly the size we asked for. */\n        pDescriptorPlayback->periodSizeInFrames = periodSizeInFrames;\n        pDescriptorPlayback->periodCount        = periodCount;\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_device_data_loop__dsound(ma_device* pDevice)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint32 bpfDeviceCapture  = ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n    ma_uint32 bpfDevicePlayback = ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n    HRESULT hr;\n    DWORD lockOffsetInBytesCapture;\n    DWORD lockSizeInBytesCapture;\n    DWORD mappedSizeInBytesCapture;\n    DWORD mappedDeviceFramesProcessedCapture;\n    void* pMappedDeviceBufferCapture;\n    DWORD lockOffsetInBytesPlayback;\n    DWORD lockSizeInBytesPlayback;\n    DWORD mappedSizeInBytesPlayback;\n    void* pMappedDeviceBufferPlayback;\n    DWORD prevReadCursorInBytesCapture = 0;\n    DWORD prevPlayCursorInBytesPlayback = 0;\n    ma_bool32 physicalPlayCursorLoopFlagPlayback = 0;\n    DWORD virtualWriteCursorInBytesPlayback = 0;\n    ma_bool32 virtualWriteCursorLoopFlagPlayback = 0;\n    ma_bool32 isPlaybackDeviceStarted = MA_FALSE;\n    ma_uint32 framesWrittenToPlaybackDevice = 0;   /* For knowing whether or not the playback device needs to be started. */\n    ma_uint32 waitTimeInMilliseconds = 1;\n\n    MA_ASSERT(pDevice != NULL);\n\n    /* The first thing to do is start the capture device. The playback device is only started after the first period is written. */\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        hr = ma_IDirectSoundCaptureBuffer_Start((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, MA_DSCBSTART_LOOPING);\n        if (FAILED(hr)) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundCaptureBuffer_Start() failed.\");\n            return ma_result_from_HRESULT(hr);\n        }\n    }\n\n    while (ma_device_get_state(pDevice) == ma_device_state_started) {\n        switch (pDevice->type)\n        {\n            case ma_device_type_duplex:\n            {\n                DWORD physicalCaptureCursorInBytes;\n                DWORD physicalReadCursorInBytes;\n                hr = ma_IDirectSoundCaptureBuffer_GetCurrentPosition((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, &physicalCaptureCursorInBytes, &physicalReadCursorInBytes);\n                if (FAILED(hr)) {\n                    return ma_result_from_HRESULT(hr);\n                }\n\n                /* If nothing is available we just sleep for a bit and return from this iteration. */\n                if (physicalReadCursorInBytes == prevReadCursorInBytesCapture) {\n                    ma_sleep(waitTimeInMilliseconds);\n                    continue; /* Nothing is available in the capture buffer. */\n                }\n\n                /*\n                The current position has moved. We need to map all of the captured samples and write them to the playback device, making sure\n                we don't return until every frame has been copied over.\n                */\n                if (prevReadCursorInBytesCapture < physicalReadCursorInBytes) {\n                    /* The capture position has not looped. This is the simple case. */\n                    lockOffsetInBytesCapture = prevReadCursorInBytesCapture;\n                    lockSizeInBytesCapture   = (physicalReadCursorInBytes - prevReadCursorInBytesCapture);\n                } else {\n                    /*\n                    The capture position has looped. This is the more complex case. Map to the end of the buffer. If this does not return anything,\n                    do it again from the start.\n                    */\n                    if (prevReadCursorInBytesCapture < pDevice->capture.internalPeriodSizeInFrames*pDevice->capture.internalPeriods*bpfDeviceCapture) {\n                        /* Lock up to the end of the buffer. */\n                        lockOffsetInBytesCapture = prevReadCursorInBytesCapture;\n                        lockSizeInBytesCapture   = (pDevice->capture.internalPeriodSizeInFrames*pDevice->capture.internalPeriods*bpfDeviceCapture) - prevReadCursorInBytesCapture;\n                    } else {\n                        /* Lock starting from the start of the buffer. */\n                        lockOffsetInBytesCapture = 0;\n                        lockSizeInBytesCapture   = physicalReadCursorInBytes;\n                    }\n                }\n\n                if (lockSizeInBytesCapture == 0) {\n                    ma_sleep(waitTimeInMilliseconds);\n                    continue; /* Nothing is available in the capture buffer. */\n                }\n\n                hr = ma_IDirectSoundCaptureBuffer_Lock((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, lockOffsetInBytesCapture, lockSizeInBytesCapture, &pMappedDeviceBufferCapture, &mappedSizeInBytesCapture, NULL, NULL, 0);\n                if (FAILED(hr)) {\n                    ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to map buffer from capture device in preparation for writing to the device.\");\n                    return ma_result_from_HRESULT(hr);\n                }\n\n\n                /* At this point we have some input data that we need to output. We do not return until every mapped frame of the input data is written to the playback device. */\n                mappedDeviceFramesProcessedCapture = 0;\n\n                for (;;) {  /* Keep writing to the playback device. */\n                    ma_uint8  inputFramesInClientFormat[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n                    ma_uint32 inputFramesInClientFormatCap = sizeof(inputFramesInClientFormat) / ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels);\n                    ma_uint8  outputFramesInClientFormat[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n                    ma_uint32 outputFramesInClientFormatCap = sizeof(outputFramesInClientFormat) / ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels);\n                    ma_uint32 outputFramesInClientFormatCount;\n                    ma_uint32 outputFramesInClientFormatConsumed = 0;\n                    ma_uint64 clientCapturedFramesToProcess = ma_min(inputFramesInClientFormatCap, outputFramesInClientFormatCap);\n                    ma_uint64 deviceCapturedFramesToProcess = (mappedSizeInBytesCapture / bpfDeviceCapture) - mappedDeviceFramesProcessedCapture;\n                    void* pRunningMappedDeviceBufferCapture = ma_offset_ptr(pMappedDeviceBufferCapture, mappedDeviceFramesProcessedCapture * bpfDeviceCapture);\n\n                    result = ma_data_converter_process_pcm_frames(&pDevice->capture.converter, pRunningMappedDeviceBufferCapture, &deviceCapturedFramesToProcess, inputFramesInClientFormat, &clientCapturedFramesToProcess);\n                    if (result != MA_SUCCESS) {\n                        break;\n                    }\n\n                    outputFramesInClientFormatCount     = (ma_uint32)clientCapturedFramesToProcess;\n                    mappedDeviceFramesProcessedCapture += (ma_uint32)deviceCapturedFramesToProcess;\n\n                    ma_device__handle_data_callback(pDevice, outputFramesInClientFormat, inputFramesInClientFormat, (ma_uint32)clientCapturedFramesToProcess);\n\n                    /* At this point we have input and output data in client format. All we need to do now is convert it to the output device format. This may take a few passes. */\n                    for (;;) {\n                        ma_uint32 framesWrittenThisIteration;\n                        DWORD physicalPlayCursorInBytes;\n                        DWORD physicalWriteCursorInBytes;\n                        DWORD availableBytesPlayback;\n                        DWORD silentPaddingInBytes = 0; /* <-- Must be initialized to 0. */\n\n                        /* We need the physical play and write cursors. */\n                        if (FAILED(ma_IDirectSoundBuffer_GetCurrentPosition((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, &physicalPlayCursorInBytes, &physicalWriteCursorInBytes))) {\n                            break;\n                        }\n\n                        if (physicalPlayCursorInBytes < prevPlayCursorInBytesPlayback) {\n                            physicalPlayCursorLoopFlagPlayback = !physicalPlayCursorLoopFlagPlayback;\n                        }\n                        prevPlayCursorInBytesPlayback  = physicalPlayCursorInBytes;\n\n                        /* If there's any bytes available for writing we can do that now. The space between the virtual cursor position and play cursor. */\n                        if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) {\n                            /* Same loop iteration. The available bytes wraps all the way around from the virtual write cursor to the physical play cursor. */\n                            if (physicalPlayCursorInBytes <= virtualWriteCursorInBytesPlayback) {\n                                availableBytesPlayback  = (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) - virtualWriteCursorInBytesPlayback;\n                                availableBytesPlayback += physicalPlayCursorInBytes;    /* Wrap around. */\n                            } else {\n                                /* This is an error. */\n                                ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, \"[DirectSound] (Duplex/Playback): Play cursor has moved in front of the write cursor (same loop iteration). physicalPlayCursorInBytes=%ld, virtualWriteCursorInBytes=%ld.\\n\", physicalPlayCursorInBytes, virtualWriteCursorInBytesPlayback);\n                                availableBytesPlayback = 0;\n                            }\n                        } else {\n                            /* Different loop iterations. The available bytes only goes from the virtual write cursor to the physical play cursor. */\n                            if (physicalPlayCursorInBytes >= virtualWriteCursorInBytesPlayback) {\n                                availableBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback;\n                            } else {\n                                /* This is an error. */\n                                ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, \"[DirectSound] (Duplex/Playback): Write cursor has moved behind the play cursor (different loop iterations). physicalPlayCursorInBytes=%ld, virtualWriteCursorInBytes=%ld.\\n\", physicalPlayCursorInBytes, virtualWriteCursorInBytesPlayback);\n                                availableBytesPlayback = 0;\n                            }\n                        }\n\n                        /* If there's no room available for writing we need to wait for more. */\n                        if (availableBytesPlayback == 0) {\n                            /* If we haven't started the device yet, this will never get beyond 0. In this case we need to get the device started. */\n                            if (!isPlaybackDeviceStarted) {\n                                hr = ma_IDirectSoundBuffer_Play((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0, 0, MA_DSBPLAY_LOOPING);\n                                if (FAILED(hr)) {\n                                    ma_IDirectSoundCaptureBuffer_Stop((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer);\n                                    ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundBuffer_Play() failed.\");\n                                    return ma_result_from_HRESULT(hr);\n                                }\n                                isPlaybackDeviceStarted = MA_TRUE;\n                            } else {\n                                ma_sleep(waitTimeInMilliseconds);\n                                continue;\n                            }\n                        }\n\n\n                        /* Getting here means there room available somewhere. We limit this to either the end of the buffer or the physical play cursor, whichever is closest. */\n                        lockOffsetInBytesPlayback = virtualWriteCursorInBytesPlayback;\n                        if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) {\n                            /* Same loop iteration. Go up to the end of the buffer. */\n                            lockSizeInBytesPlayback = (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) - virtualWriteCursorInBytesPlayback;\n                        } else {\n                            /* Different loop iterations. Go up to the physical play cursor. */\n                            lockSizeInBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback;\n                        }\n\n                        hr = ma_IDirectSoundBuffer_Lock((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, lockOffsetInBytesPlayback, lockSizeInBytesPlayback, &pMappedDeviceBufferPlayback, &mappedSizeInBytesPlayback, NULL, NULL, 0);\n                        if (FAILED(hr)) {\n                            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to map buffer from playback device in preparation for writing to the device.\");\n                            result = ma_result_from_HRESULT(hr);\n                            break;\n                        }\n\n                        /*\n                        Experiment: If the playback buffer is being starved, pad it with some silence to get it back in sync. This will cause a glitch, but it may prevent\n                        endless glitching due to it constantly running out of data.\n                        */\n                        if (isPlaybackDeviceStarted) {\n                            DWORD bytesQueuedForPlayback = (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) - availableBytesPlayback;\n                            if (bytesQueuedForPlayback < (pDevice->playback.internalPeriodSizeInFrames*bpfDevicePlayback)) {\n                                silentPaddingInBytes   = (pDevice->playback.internalPeriodSizeInFrames*2*bpfDevicePlayback) - bytesQueuedForPlayback;\n                                if (silentPaddingInBytes > lockSizeInBytesPlayback) {\n                                    silentPaddingInBytes = lockSizeInBytesPlayback;\n                                }\n\n                                ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, \"[DirectSound] (Duplex/Playback) Playback buffer starved. availableBytesPlayback=%ld, silentPaddingInBytes=%ld\\n\", availableBytesPlayback, silentPaddingInBytes);\n                            }\n                        }\n\n                        /* At this point we have a buffer for output. */\n                        if (silentPaddingInBytes > 0) {\n                            MA_ZERO_MEMORY(pMappedDeviceBufferPlayback, silentPaddingInBytes);\n                            framesWrittenThisIteration = silentPaddingInBytes/bpfDevicePlayback;\n                        } else {\n                            ma_uint64 convertedFrameCountIn  = (outputFramesInClientFormatCount - outputFramesInClientFormatConsumed);\n                            ma_uint64 convertedFrameCountOut = mappedSizeInBytesPlayback/bpfDevicePlayback;\n                            void* pConvertedFramesIn  = ma_offset_ptr(outputFramesInClientFormat, outputFramesInClientFormatConsumed * bpfDevicePlayback);\n                            void* pConvertedFramesOut = pMappedDeviceBufferPlayback;\n\n                            result = ma_data_converter_process_pcm_frames(&pDevice->playback.converter, pConvertedFramesIn, &convertedFrameCountIn, pConvertedFramesOut, &convertedFrameCountOut);\n                            if (result != MA_SUCCESS) {\n                                break;\n                            }\n\n                            outputFramesInClientFormatConsumed += (ma_uint32)convertedFrameCountOut;\n                            framesWrittenThisIteration          = (ma_uint32)convertedFrameCountOut;\n                        }\n\n\n                        hr = ma_IDirectSoundBuffer_Unlock((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, pMappedDeviceBufferPlayback, framesWrittenThisIteration*bpfDevicePlayback, NULL, 0);\n                        if (FAILED(hr)) {\n                            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to unlock internal buffer from playback device after writing to the device.\");\n                            result = ma_result_from_HRESULT(hr);\n                            break;\n                        }\n\n                        virtualWriteCursorInBytesPlayback += framesWrittenThisIteration*bpfDevicePlayback;\n                        if ((virtualWriteCursorInBytesPlayback/bpfDevicePlayback) == pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods) {\n                            virtualWriteCursorInBytesPlayback  = 0;\n                            virtualWriteCursorLoopFlagPlayback = !virtualWriteCursorLoopFlagPlayback;\n                        }\n\n                        /*\n                        We may need to start the device. We want two full periods to be written before starting the playback device. Having an extra period adds\n                        a bit of a buffer to prevent the playback buffer from getting starved.\n                        */\n                        framesWrittenToPlaybackDevice += framesWrittenThisIteration;\n                        if (!isPlaybackDeviceStarted && framesWrittenToPlaybackDevice >= (pDevice->playback.internalPeriodSizeInFrames*2)) {\n                            hr = ma_IDirectSoundBuffer_Play((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0, 0, MA_DSBPLAY_LOOPING);\n                            if (FAILED(hr)) {\n                                ma_IDirectSoundCaptureBuffer_Stop((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer);\n                                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundBuffer_Play() failed.\");\n                                return ma_result_from_HRESULT(hr);\n                            }\n                            isPlaybackDeviceStarted = MA_TRUE;\n                        }\n\n                        if (framesWrittenThisIteration < mappedSizeInBytesPlayback/bpfDevicePlayback) {\n                            break;  /* We're finished with the output data.*/\n                        }\n                    }\n\n                    if (clientCapturedFramesToProcess == 0) {\n                        break;  /* We just consumed every input sample. */\n                    }\n                }\n\n\n                /* At this point we're done with the mapped portion of the capture buffer. */\n                hr = ma_IDirectSoundCaptureBuffer_Unlock((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, pMappedDeviceBufferCapture, mappedSizeInBytesCapture, NULL, 0);\n                if (FAILED(hr)) {\n                    ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to unlock internal buffer from capture device after reading from the device.\");\n                    return ma_result_from_HRESULT(hr);\n                }\n                prevReadCursorInBytesCapture = (lockOffsetInBytesCapture + mappedSizeInBytesCapture);\n            } break;\n\n\n\n            case ma_device_type_capture:\n            {\n                DWORD physicalCaptureCursorInBytes;\n                DWORD physicalReadCursorInBytes;\n                hr = ma_IDirectSoundCaptureBuffer_GetCurrentPosition((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, &physicalCaptureCursorInBytes, &physicalReadCursorInBytes);\n                if (FAILED(hr)) {\n                    return MA_ERROR;\n                }\n\n                /* If the previous capture position is the same as the current position we need to wait a bit longer. */\n                if (prevReadCursorInBytesCapture == physicalReadCursorInBytes) {\n                    ma_sleep(waitTimeInMilliseconds);\n                    continue;\n                }\n\n                /* Getting here means we have capture data available. */\n                if (prevReadCursorInBytesCapture < physicalReadCursorInBytes) {\n                    /* The capture position has not looped. This is the simple case. */\n                    lockOffsetInBytesCapture = prevReadCursorInBytesCapture;\n                    lockSizeInBytesCapture   = (physicalReadCursorInBytes - prevReadCursorInBytesCapture);\n                } else {\n                    /*\n                    The capture position has looped. This is the more complex case. Map to the end of the buffer. If this does not return anything,\n                    do it again from the start.\n                    */\n                    if (prevReadCursorInBytesCapture < pDevice->capture.internalPeriodSizeInFrames*pDevice->capture.internalPeriods*bpfDeviceCapture) {\n                        /* Lock up to the end of the buffer. */\n                        lockOffsetInBytesCapture = prevReadCursorInBytesCapture;\n                        lockSizeInBytesCapture   = (pDevice->capture.internalPeriodSizeInFrames*pDevice->capture.internalPeriods*bpfDeviceCapture) - prevReadCursorInBytesCapture;\n                    } else {\n                        /* Lock starting from the start of the buffer. */\n                        lockOffsetInBytesCapture = 0;\n                        lockSizeInBytesCapture   = physicalReadCursorInBytes;\n                    }\n                }\n\n                if (lockSizeInBytesCapture < pDevice->capture.internalPeriodSizeInFrames) {\n                    ma_sleep(waitTimeInMilliseconds);\n                    continue; /* Nothing is available in the capture buffer. */\n                }\n\n                hr = ma_IDirectSoundCaptureBuffer_Lock((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, lockOffsetInBytesCapture, lockSizeInBytesCapture, &pMappedDeviceBufferCapture, &mappedSizeInBytesCapture, NULL, NULL, 0);\n                if (FAILED(hr)) {\n                    ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to map buffer from capture device in preparation for writing to the device.\");\n                    result = ma_result_from_HRESULT(hr);\n                }\n\n                if (lockSizeInBytesCapture != mappedSizeInBytesCapture) {\n                    ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[DirectSound] (Capture) lockSizeInBytesCapture=%ld != mappedSizeInBytesCapture=%ld\\n\", lockSizeInBytesCapture, mappedSizeInBytesCapture);\n                }\n\n                ma_device__send_frames_to_client(pDevice, mappedSizeInBytesCapture/bpfDeviceCapture, pMappedDeviceBufferCapture);\n\n                hr = ma_IDirectSoundCaptureBuffer_Unlock((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer, pMappedDeviceBufferCapture, mappedSizeInBytesCapture, NULL, 0);\n                if (FAILED(hr)) {\n                    ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to unlock internal buffer from capture device after reading from the device.\");\n                    return ma_result_from_HRESULT(hr);\n                }\n                prevReadCursorInBytesCapture = lockOffsetInBytesCapture + mappedSizeInBytesCapture;\n\n                if (prevReadCursorInBytesCapture == (pDevice->capture.internalPeriodSizeInFrames*pDevice->capture.internalPeriods*bpfDeviceCapture)) {\n                    prevReadCursorInBytesCapture = 0;\n                }\n            } break;\n\n\n\n            case ma_device_type_playback:\n            {\n                DWORD availableBytesPlayback;\n                DWORD physicalPlayCursorInBytes;\n                DWORD physicalWriteCursorInBytes;\n                hr = ma_IDirectSoundBuffer_GetCurrentPosition((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, &physicalPlayCursorInBytes, &physicalWriteCursorInBytes);\n                if (FAILED(hr)) {\n                    break;\n                }\n\n                if (physicalPlayCursorInBytes < prevPlayCursorInBytesPlayback) {\n                    physicalPlayCursorLoopFlagPlayback = !physicalPlayCursorLoopFlagPlayback;\n                }\n                prevPlayCursorInBytesPlayback  = physicalPlayCursorInBytes;\n\n                /* If there's any bytes available for writing we can do that now. The space between the virtual cursor position and play cursor. */\n                if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) {\n                    /* Same loop iteration. The available bytes wraps all the way around from the virtual write cursor to the physical play cursor. */\n                    if (physicalPlayCursorInBytes <= virtualWriteCursorInBytesPlayback) {\n                        availableBytesPlayback  = (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) - virtualWriteCursorInBytesPlayback;\n                        availableBytesPlayback += physicalPlayCursorInBytes;    /* Wrap around. */\n                    } else {\n                        /* This is an error. */\n                        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, \"[DirectSound] (Playback): Play cursor has moved in front of the write cursor (same loop iterations). physicalPlayCursorInBytes=%ld, virtualWriteCursorInBytes=%ld.\\n\", physicalPlayCursorInBytes, virtualWriteCursorInBytesPlayback);\n                        availableBytesPlayback = 0;\n                    }\n                } else {\n                    /* Different loop iterations. The available bytes only goes from the virtual write cursor to the physical play cursor. */\n                    if (physicalPlayCursorInBytes >= virtualWriteCursorInBytesPlayback) {\n                        availableBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback;\n                    } else {\n                        /* This is an error. */\n                        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, \"[DirectSound] (Playback): Write cursor has moved behind the play cursor (different loop iterations). physicalPlayCursorInBytes=%ld, virtualWriteCursorInBytes=%ld.\\n\", physicalPlayCursorInBytes, virtualWriteCursorInBytesPlayback);\n                        availableBytesPlayback = 0;\n                    }\n                }\n\n                /* If there's no room available for writing we need to wait for more. */\n                if (availableBytesPlayback < pDevice->playback.internalPeriodSizeInFrames) {\n                    /* If we haven't started the device yet, this will never get beyond 0. In this case we need to get the device started. */\n                    if (availableBytesPlayback == 0 && !isPlaybackDeviceStarted) {\n                        hr = ma_IDirectSoundBuffer_Play((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0, 0, MA_DSBPLAY_LOOPING);\n                        if (FAILED(hr)) {\n                            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundBuffer_Play() failed.\");\n                            return ma_result_from_HRESULT(hr);\n                        }\n                        isPlaybackDeviceStarted = MA_TRUE;\n                    } else {\n                        ma_sleep(waitTimeInMilliseconds);\n                        continue;\n                    }\n                }\n\n                /* Getting here means there room available somewhere. We limit this to either the end of the buffer or the physical play cursor, whichever is closest. */\n                lockOffsetInBytesPlayback = virtualWriteCursorInBytesPlayback;\n                if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) {\n                    /* Same loop iteration. Go up to the end of the buffer. */\n                    lockSizeInBytesPlayback = (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) - virtualWriteCursorInBytesPlayback;\n                } else {\n                    /* Different loop iterations. Go up to the physical play cursor. */\n                    lockSizeInBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback;\n                }\n\n                hr = ma_IDirectSoundBuffer_Lock((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, lockOffsetInBytesPlayback, lockSizeInBytesPlayback, &pMappedDeviceBufferPlayback, &mappedSizeInBytesPlayback, NULL, NULL, 0);\n                if (FAILED(hr)) {\n                    ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to map buffer from playback device in preparation for writing to the device.\");\n                    result = ma_result_from_HRESULT(hr);\n                    break;\n                }\n\n                /* At this point we have a buffer for output. */\n                ma_device__read_frames_from_client(pDevice, (mappedSizeInBytesPlayback/bpfDevicePlayback), pMappedDeviceBufferPlayback);\n\n                hr = ma_IDirectSoundBuffer_Unlock((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, pMappedDeviceBufferPlayback, mappedSizeInBytesPlayback, NULL, 0);\n                if (FAILED(hr)) {\n                    ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] Failed to unlock internal buffer from playback device after writing to the device.\");\n                    result = ma_result_from_HRESULT(hr);\n                    break;\n                }\n\n                virtualWriteCursorInBytesPlayback += mappedSizeInBytesPlayback;\n                if (virtualWriteCursorInBytesPlayback == pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) {\n                    virtualWriteCursorInBytesPlayback  = 0;\n                    virtualWriteCursorLoopFlagPlayback = !virtualWriteCursorLoopFlagPlayback;\n                }\n\n                /*\n                We may need to start the device. We want two full periods to be written before starting the playback device. Having an extra period adds\n                a bit of a buffer to prevent the playback buffer from getting starved.\n                */\n                framesWrittenToPlaybackDevice += mappedSizeInBytesPlayback/bpfDevicePlayback;\n                if (!isPlaybackDeviceStarted && framesWrittenToPlaybackDevice >= pDevice->playback.internalPeriodSizeInFrames) {\n                    hr = ma_IDirectSoundBuffer_Play((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0, 0, MA_DSBPLAY_LOOPING);\n                    if (FAILED(hr)) {\n                        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundBuffer_Play() failed.\");\n                        return ma_result_from_HRESULT(hr);\n                    }\n                    isPlaybackDeviceStarted = MA_TRUE;\n                }\n            } break;\n\n\n            default: return MA_INVALID_ARGS;   /* Invalid device type. */\n        }\n\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    /* Getting here means the device is being stopped. */\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        hr = ma_IDirectSoundCaptureBuffer_Stop((ma_IDirectSoundCaptureBuffer*)pDevice->dsound.pCaptureBuffer);\n        if (FAILED(hr)) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundCaptureBuffer_Stop() failed.\");\n            return ma_result_from_HRESULT(hr);\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        /* The playback device should be drained before stopping. All we do is wait until the available bytes is equal to the size of the buffer. */\n        if (isPlaybackDeviceStarted) {\n            for (;;) {\n                DWORD availableBytesPlayback = 0;\n                DWORD physicalPlayCursorInBytes;\n                DWORD physicalWriteCursorInBytes;\n                hr = ma_IDirectSoundBuffer_GetCurrentPosition((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, &physicalPlayCursorInBytes, &physicalWriteCursorInBytes);\n                if (FAILED(hr)) {\n                    break;\n                }\n\n                if (physicalPlayCursorInBytes < prevPlayCursorInBytesPlayback) {\n                    physicalPlayCursorLoopFlagPlayback = !physicalPlayCursorLoopFlagPlayback;\n                }\n                prevPlayCursorInBytesPlayback  = physicalPlayCursorInBytes;\n\n                if (physicalPlayCursorLoopFlagPlayback == virtualWriteCursorLoopFlagPlayback) {\n                    /* Same loop iteration. The available bytes wraps all the way around from the virtual write cursor to the physical play cursor. */\n                    if (physicalPlayCursorInBytes <= virtualWriteCursorInBytesPlayback) {\n                        availableBytesPlayback  = (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback) - virtualWriteCursorInBytesPlayback;\n                        availableBytesPlayback += physicalPlayCursorInBytes;    /* Wrap around. */\n                    } else {\n                        break;\n                    }\n                } else {\n                    /* Different loop iterations. The available bytes only goes from the virtual write cursor to the physical play cursor. */\n                    if (physicalPlayCursorInBytes >= virtualWriteCursorInBytesPlayback) {\n                        availableBytesPlayback = physicalPlayCursorInBytes - virtualWriteCursorInBytesPlayback;\n                    } else {\n                        break;\n                    }\n                }\n\n                if (availableBytesPlayback >= (pDevice->playback.internalPeriodSizeInFrames*pDevice->playback.internalPeriods*bpfDevicePlayback)) {\n                    break;\n                }\n\n                ma_sleep(waitTimeInMilliseconds);\n            }\n        }\n\n        hr = ma_IDirectSoundBuffer_Stop((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer);\n        if (FAILED(hr)) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[DirectSound] IDirectSoundBuffer_Stop() failed.\");\n            return ma_result_from_HRESULT(hr);\n        }\n\n        ma_IDirectSoundBuffer_SetCurrentPosition((ma_IDirectSoundBuffer*)pDevice->dsound.pPlaybackBuffer, 0);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_uninit__dsound(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_dsound);\n\n    ma_dlclose(ma_context_get_log(pContext), pContext->dsound.hDSoundDLL);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init__dsound(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n    MA_ASSERT(pContext != NULL);\n\n    (void)pConfig;\n\n    pContext->dsound.hDSoundDLL = ma_dlopen(ma_context_get_log(pContext), \"dsound.dll\");\n    if (pContext->dsound.hDSoundDLL == NULL) {\n        return MA_API_NOT_FOUND;\n    }\n\n    pContext->dsound.DirectSoundCreate            = ma_dlsym(ma_context_get_log(pContext), pContext->dsound.hDSoundDLL, \"DirectSoundCreate\");\n    pContext->dsound.DirectSoundEnumerateA        = ma_dlsym(ma_context_get_log(pContext), pContext->dsound.hDSoundDLL, \"DirectSoundEnumerateA\");\n    pContext->dsound.DirectSoundCaptureCreate     = ma_dlsym(ma_context_get_log(pContext), pContext->dsound.hDSoundDLL, \"DirectSoundCaptureCreate\");\n    pContext->dsound.DirectSoundCaptureEnumerateA = ma_dlsym(ma_context_get_log(pContext), pContext->dsound.hDSoundDLL, \"DirectSoundCaptureEnumerateA\");\n\n    /*\n    We need to support all functions or nothing. DirectSound with Windows 95 seems to not work too\n    well in my testing. For example, it's missing DirectSoundCaptureEnumerateA(). This is a convenient\n    place to just disable the DirectSound backend for Windows 95.\n    */\n    if (pContext->dsound.DirectSoundCreate            == NULL ||\n        pContext->dsound.DirectSoundEnumerateA        == NULL ||\n        pContext->dsound.DirectSoundCaptureCreate     == NULL ||\n        pContext->dsound.DirectSoundCaptureEnumerateA == NULL) {\n        return MA_API_NOT_FOUND;\n    }\n\n    pCallbacks->onContextInit             = ma_context_init__dsound;\n    pCallbacks->onContextUninit           = ma_context_uninit__dsound;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__dsound;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__dsound;\n    pCallbacks->onDeviceInit              = ma_device_init__dsound;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__dsound;\n    pCallbacks->onDeviceStart             = NULL;   /* Not used. Started in onDeviceDataLoop. */\n    pCallbacks->onDeviceStop              = NULL;   /* Not used. Stopped in onDeviceDataLoop. */\n    pCallbacks->onDeviceRead              = NULL;   /* Not used. Data is read directly in onDeviceDataLoop. */\n    pCallbacks->onDeviceWrite             = NULL;   /* Not used. Data is written directly in onDeviceDataLoop. */\n    pCallbacks->onDeviceDataLoop          = ma_device_data_loop__dsound;\n\n    return MA_SUCCESS;\n}\n#endif\n\n\n\n/******************************************************************************\n\nWinMM Backend\n\n******************************************************************************/\n#ifdef MA_HAS_WINMM\n\n/*\nSome build configurations will exclude the WinMM API. An example is when WIN32_LEAN_AND_MEAN\nis defined. We need to define the types and functions we need manually.\n*/\n#define MA_MMSYSERR_NOERROR     0\n#define MA_MMSYSERR_ERROR       1\n#define MA_MMSYSERR_BADDEVICEID 2\n#define MA_MMSYSERR_INVALHANDLE 5\n#define MA_MMSYSERR_NOMEM       7\n#define MA_MMSYSERR_INVALFLAG   10\n#define MA_MMSYSERR_INVALPARAM  11\n#define MA_MMSYSERR_HANDLEBUSY  12\n\n#define MA_CALLBACK_EVENT       0x00050000\n#define MA_WAVE_ALLOWSYNC       0x0002\n\n#define MA_WHDR_DONE            0x00000001\n#define MA_WHDR_PREPARED        0x00000002\n#define MA_WHDR_BEGINLOOP       0x00000004\n#define MA_WHDR_ENDLOOP         0x00000008\n#define MA_WHDR_INQUEUE         0x00000010\n\n#define MA_MAXPNAMELEN          32\n\ntypedef void* MA_HWAVEIN;\ntypedef void* MA_HWAVEOUT;\ntypedef UINT MA_MMRESULT;\ntypedef UINT MA_MMVERSION;\n\ntypedef struct\n{\n    WORD wMid;\n    WORD wPid;\n    MA_MMVERSION vDriverVersion;\n    CHAR szPname[MA_MAXPNAMELEN];\n    DWORD dwFormats;\n    WORD wChannels;\n    WORD wReserved1;\n} MA_WAVEINCAPSA;\n\ntypedef struct\n{\n    WORD wMid;\n    WORD wPid;\n    MA_MMVERSION vDriverVersion;\n    CHAR szPname[MA_MAXPNAMELEN];\n    DWORD dwFormats;\n    WORD wChannels;\n    WORD wReserved1;\n    DWORD dwSupport;\n} MA_WAVEOUTCAPSA;\n\ntypedef struct tagWAVEHDR\n{\n    char* lpData;\n    DWORD dwBufferLength;\n    DWORD dwBytesRecorded;\n    DWORD_PTR dwUser;\n    DWORD dwFlags;\n    DWORD dwLoops;\n    struct tagWAVEHDR* lpNext;\n    DWORD_PTR reserved;\n} MA_WAVEHDR;\n\ntypedef struct\n{\n    WORD wMid;\n    WORD wPid;\n    MA_MMVERSION vDriverVersion;\n    CHAR szPname[MA_MAXPNAMELEN];\n    DWORD dwFormats;\n    WORD wChannels;\n    WORD wReserved1;\n    DWORD dwSupport;\n    GUID ManufacturerGuid;\n    GUID ProductGuid;\n    GUID NameGuid;\n} MA_WAVEOUTCAPS2A;\n\ntypedef struct\n{\n    WORD wMid;\n    WORD wPid;\n    MA_MMVERSION vDriverVersion;\n    CHAR szPname[MA_MAXPNAMELEN];\n    DWORD dwFormats;\n    WORD wChannels;\n    WORD wReserved1;\n    GUID ManufacturerGuid;\n    GUID ProductGuid;\n    GUID NameGuid;\n} MA_WAVEINCAPS2A;\n\ntypedef UINT        (WINAPI * MA_PFN_waveOutGetNumDevs)(void);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveOutGetDevCapsA)(ma_uintptr uDeviceID, MA_WAVEOUTCAPSA* pwoc, UINT cbwoc);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveOutOpen)(MA_HWAVEOUT* phwo, UINT uDeviceID, const MA_WAVEFORMATEX* pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveOutClose)(MA_HWAVEOUT hwo);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveOutPrepareHeader)(MA_HWAVEOUT hwo, MA_WAVEHDR* pwh, UINT cbwh);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveOutUnprepareHeader)(MA_HWAVEOUT hwo, MA_WAVEHDR* pwh, UINT cbwh);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveOutWrite)(MA_HWAVEOUT hwo, MA_WAVEHDR* pwh, UINT cbwh);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveOutReset)(MA_HWAVEOUT hwo);\ntypedef UINT        (WINAPI * MA_PFN_waveInGetNumDevs)(void);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveInGetDevCapsA)(ma_uintptr uDeviceID, MA_WAVEINCAPSA* pwic, UINT cbwic);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveInOpen)(MA_HWAVEIN* phwi, UINT uDeviceID, const MA_WAVEFORMATEX* pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveInClose)(MA_HWAVEIN hwi);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveInPrepareHeader)(MA_HWAVEIN hwi, MA_WAVEHDR* pwh, UINT cbwh);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveInUnprepareHeader)(MA_HWAVEIN hwi, MA_WAVEHDR* pwh, UINT cbwh);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveInAddBuffer)(MA_HWAVEIN hwi, MA_WAVEHDR* pwh, UINT cbwh);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveInStart)(MA_HWAVEIN hwi);\ntypedef MA_MMRESULT (WINAPI * MA_PFN_waveInReset)(MA_HWAVEIN hwi);\n\nstatic ma_result ma_result_from_MMRESULT(MA_MMRESULT resultMM)\n{\n    switch (resultMM)\n    {\n        case MA_MMSYSERR_NOERROR:       return MA_SUCCESS;\n        case MA_MMSYSERR_BADDEVICEID:   return MA_INVALID_ARGS;\n        case MA_MMSYSERR_INVALHANDLE:   return MA_INVALID_ARGS;\n        case MA_MMSYSERR_NOMEM:         return MA_OUT_OF_MEMORY;\n        case MA_MMSYSERR_INVALFLAG:     return MA_INVALID_ARGS;\n        case MA_MMSYSERR_INVALPARAM:    return MA_INVALID_ARGS;\n        case MA_MMSYSERR_HANDLEBUSY:    return MA_BUSY;\n        case MA_MMSYSERR_ERROR:         return MA_ERROR;\n        default:                        return MA_ERROR;\n    }\n}\n\nstatic char* ma_find_last_character(char* str, char ch)\n{\n    char* last;\n\n    if (str == NULL) {\n        return NULL;\n    }\n\n    last = NULL;\n    while (*str != '\\0') {\n        if (*str == ch) {\n            last = str;\n        }\n\n        str += 1;\n    }\n\n    return last;\n}\n\nstatic ma_uint32 ma_get_period_size_in_bytes(ma_uint32 periodSizeInFrames, ma_format format, ma_uint32 channels)\n{\n    return periodSizeInFrames * ma_get_bytes_per_frame(format, channels);\n}\n\n\n/*\nOur own \"WAVECAPS\" structure that contains generic information shared between WAVEOUTCAPS2 and WAVEINCAPS2 so\nwe can do things generically and typesafely. Names are being kept the same for consistency.\n*/\ntypedef struct\n{\n    CHAR szPname[MA_MAXPNAMELEN];\n    DWORD dwFormats;\n    WORD wChannels;\n    GUID NameGuid;\n} MA_WAVECAPSA;\n\nstatic ma_result ma_get_best_info_from_formats_flags__winmm(DWORD dwFormats, WORD channels, WORD* pBitsPerSample, DWORD* pSampleRate)\n{\n    WORD bitsPerSample = 0;\n    DWORD sampleRate = 0;\n\n    if (pBitsPerSample) {\n        *pBitsPerSample = 0;\n    }\n    if (pSampleRate) {\n        *pSampleRate = 0;\n    }\n\n    if (channels == 1) {\n        bitsPerSample = 16;\n        if ((dwFormats & WAVE_FORMAT_48M16) != 0) {\n            sampleRate = 48000;\n        } else if ((dwFormats & WAVE_FORMAT_44M16) != 0) {\n            sampleRate = 44100;\n        } else if ((dwFormats & WAVE_FORMAT_2M16) != 0) {\n            sampleRate = 22050;\n        } else if ((dwFormats & WAVE_FORMAT_1M16) != 0) {\n            sampleRate = 11025;\n        } else if ((dwFormats & WAVE_FORMAT_96M16) != 0) {\n            sampleRate = 96000;\n        } else {\n            bitsPerSample = 8;\n            if ((dwFormats & WAVE_FORMAT_48M08) != 0) {\n                sampleRate = 48000;\n            } else if ((dwFormats & WAVE_FORMAT_44M08) != 0) {\n                sampleRate = 44100;\n            } else if ((dwFormats & WAVE_FORMAT_2M08) != 0) {\n                sampleRate = 22050;\n            } else if ((dwFormats & WAVE_FORMAT_1M08) != 0) {\n                sampleRate = 11025;\n            } else if ((dwFormats & WAVE_FORMAT_96M08) != 0) {\n                sampleRate = 96000;\n            } else {\n                return MA_FORMAT_NOT_SUPPORTED;\n            }\n        }\n    } else {\n        bitsPerSample = 16;\n        if ((dwFormats & WAVE_FORMAT_48S16) != 0) {\n            sampleRate = 48000;\n        } else if ((dwFormats & WAVE_FORMAT_44S16) != 0) {\n            sampleRate = 44100;\n        } else if ((dwFormats & WAVE_FORMAT_2S16) != 0) {\n            sampleRate = 22050;\n        } else if ((dwFormats & WAVE_FORMAT_1S16) != 0) {\n            sampleRate = 11025;\n        } else if ((dwFormats & WAVE_FORMAT_96S16) != 0) {\n            sampleRate = 96000;\n        } else {\n            bitsPerSample = 8;\n            if ((dwFormats & WAVE_FORMAT_48S08) != 0) {\n                sampleRate = 48000;\n            } else if ((dwFormats & WAVE_FORMAT_44S08) != 0) {\n                sampleRate = 44100;\n            } else if ((dwFormats & WAVE_FORMAT_2S08) != 0) {\n                sampleRate = 22050;\n            } else if ((dwFormats & WAVE_FORMAT_1S08) != 0) {\n                sampleRate = 11025;\n            } else if ((dwFormats & WAVE_FORMAT_96S08) != 0) {\n                sampleRate = 96000;\n            } else {\n                return MA_FORMAT_NOT_SUPPORTED;\n            }\n        }\n    }\n\n    if (pBitsPerSample) {\n        *pBitsPerSample = bitsPerSample;\n    }\n    if (pSampleRate) {\n        *pSampleRate = sampleRate;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_formats_flags_to_WAVEFORMATEX__winmm(DWORD dwFormats, WORD channels, MA_WAVEFORMATEX* pWF)\n{\n    ma_result result;\n\n    MA_ASSERT(pWF != NULL);\n\n    MA_ZERO_OBJECT(pWF);\n    pWF->cbSize     = sizeof(*pWF);\n    pWF->wFormatTag = WAVE_FORMAT_PCM;\n    pWF->nChannels  = (WORD)channels;\n    if (pWF->nChannels > 2) {\n        pWF->nChannels = 2;\n    }\n\n    result = ma_get_best_info_from_formats_flags__winmm(dwFormats, channels, &pWF->wBitsPerSample, &pWF->nSamplesPerSec);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pWF->nBlockAlign     = (WORD)(pWF->nChannels * pWF->wBitsPerSample / 8);\n    pWF->nAvgBytesPerSec = pWF->nBlockAlign * pWF->nSamplesPerSec;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_get_device_info_from_WAVECAPS(ma_context* pContext, MA_WAVECAPSA* pCaps, ma_device_info* pDeviceInfo)\n{\n    WORD bitsPerSample;\n    DWORD sampleRate;\n    ma_result result;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pCaps != NULL);\n    MA_ASSERT(pDeviceInfo != NULL);\n\n    /*\n    Name / Description\n\n    Unfortunately the name specified in WAVE(OUT/IN)CAPS2 is limited to 31 characters. This results in an unprofessional looking\n    situation where the names of the devices are truncated. To help work around this, we need to look at the name GUID and try\n    looking in the registry for the full name. If we can't find it there, we need to just fall back to the default name.\n    */\n\n    /* Set the default to begin with. */\n    ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), pCaps->szPname, (size_t)-1);\n\n    /*\n    Now try the registry. There's a few things to consider here:\n    - The name GUID can be null, in which we case we just need to stick to the original 31 characters.\n    - If the name GUID is not present in the registry we'll also need to stick to the original 31 characters.\n    - I like consistency, so I want the returned device names to be consistent with those returned by WASAPI and DirectSound. The\n      problem, however is that WASAPI and DirectSound use \"<component> (<name>)\" format (such as \"Speakers (High Definition Audio)\"),\n      but WinMM does not specificy the component name. From my admittedly limited testing, I've notice the component name seems to\n      usually fit within the 31 characters of the fixed sized buffer, so what I'm going to do is parse that string for the component\n      name, and then concatenate the name from the registry.\n    */\n    if (!ma_is_guid_null(&pCaps->NameGuid)) {\n        WCHAR guidStrW[256];\n        if (((MA_PFN_StringFromGUID2)pContext->win32.StringFromGUID2)(&pCaps->NameGuid, guidStrW, ma_countof(guidStrW)) > 0) {\n            char guidStr[256];\n            char keyStr[1024];\n            HKEY hKey;\n\n            WideCharToMultiByte(CP_UTF8, 0, guidStrW, -1, guidStr, sizeof(guidStr), 0, FALSE);\n\n            ma_strcpy_s(keyStr, sizeof(keyStr), \"SYSTEM\\\\CurrentControlSet\\\\Control\\\\MediaCategories\\\\\");\n            ma_strcat_s(keyStr, sizeof(keyStr), guidStr);\n\n            if (((MA_PFN_RegOpenKeyExA)pContext->win32.RegOpenKeyExA)(HKEY_LOCAL_MACHINE, keyStr, 0, KEY_READ, &hKey) == ERROR_SUCCESS) {\n                BYTE nameFromReg[512];\n                DWORD nameFromRegSize = sizeof(nameFromReg);\n                LONG resultWin32 = ((MA_PFN_RegQueryValueExA)pContext->win32.RegQueryValueExA)(hKey, \"Name\", 0, NULL, (BYTE*)nameFromReg, (DWORD*)&nameFromRegSize);\n                ((MA_PFN_RegCloseKey)pContext->win32.RegCloseKey)(hKey);\n\n                if (resultWin32 == ERROR_SUCCESS) {\n                    /* We have the value from the registry, so now we need to construct the name string. */\n                    char name[1024];\n                    if (ma_strcpy_s(name, sizeof(name), pDeviceInfo->name) == 0) {\n                        char* nameBeg = ma_find_last_character(name, '(');\n                        if (nameBeg != NULL) {\n                            size_t leadingLen = (nameBeg - name);\n                            ma_strncpy_s(nameBeg + 1, sizeof(name) - leadingLen, (const char*)nameFromReg, (size_t)-1);\n\n                            /* The closing \")\", if it can fit. */\n                            if (leadingLen + nameFromRegSize < sizeof(name)-1) {\n                                ma_strcat_s(name, sizeof(name), \")\");\n                            }\n\n                            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), name, (size_t)-1);\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n\n    result = ma_get_best_info_from_formats_flags__winmm(pCaps->dwFormats, pCaps->wChannels, &bitsPerSample, &sampleRate);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (bitsPerSample == 8) {\n        pDeviceInfo->nativeDataFormats[0].format = ma_format_u8;\n    } else if (bitsPerSample == 16) {\n        pDeviceInfo->nativeDataFormats[0].format = ma_format_s16;\n    } else if (bitsPerSample == 24) {\n        pDeviceInfo->nativeDataFormats[0].format = ma_format_s24;\n    } else if (bitsPerSample == 32) {\n        pDeviceInfo->nativeDataFormats[0].format = ma_format_s32;\n    } else {\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n    pDeviceInfo->nativeDataFormats[0].channels   = pCaps->wChannels;\n    pDeviceInfo->nativeDataFormats[0].sampleRate = sampleRate;\n    pDeviceInfo->nativeDataFormats[0].flags      = 0;\n    pDeviceInfo->nativeDataFormatCount = 1;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_get_device_info_from_WAVEOUTCAPS2(ma_context* pContext, MA_WAVEOUTCAPS2A* pCaps, ma_device_info* pDeviceInfo)\n{\n    MA_WAVECAPSA caps;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pCaps != NULL);\n    MA_ASSERT(pDeviceInfo != NULL);\n\n    MA_COPY_MEMORY(caps.szPname, pCaps->szPname, sizeof(caps.szPname));\n    caps.dwFormats = pCaps->dwFormats;\n    caps.wChannels = pCaps->wChannels;\n    caps.NameGuid  = pCaps->NameGuid;\n    return ma_context_get_device_info_from_WAVECAPS(pContext, &caps, pDeviceInfo);\n}\n\nstatic ma_result ma_context_get_device_info_from_WAVEINCAPS2(ma_context* pContext, MA_WAVEINCAPS2A* pCaps, ma_device_info* pDeviceInfo)\n{\n    MA_WAVECAPSA caps;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pCaps != NULL);\n    MA_ASSERT(pDeviceInfo != NULL);\n\n    MA_COPY_MEMORY(caps.szPname, pCaps->szPname, sizeof(caps.szPname));\n    caps.dwFormats = pCaps->dwFormats;\n    caps.wChannels = pCaps->wChannels;\n    caps.NameGuid  = pCaps->NameGuid;\n    return ma_context_get_device_info_from_WAVECAPS(pContext, &caps, pDeviceInfo);\n}\n\n\nstatic ma_result ma_context_enumerate_devices__winmm(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    UINT playbackDeviceCount;\n    UINT captureDeviceCount;\n    UINT iPlaybackDevice;\n    UINT iCaptureDevice;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(callback != NULL);\n\n    /* Playback. */\n    playbackDeviceCount = ((MA_PFN_waveOutGetNumDevs)pContext->winmm.waveOutGetNumDevs)();\n    for (iPlaybackDevice = 0; iPlaybackDevice < playbackDeviceCount; ++iPlaybackDevice) {\n        MA_MMRESULT result;\n        MA_WAVEOUTCAPS2A caps;\n\n        MA_ZERO_OBJECT(&caps);\n\n        result = ((MA_PFN_waveOutGetDevCapsA)pContext->winmm.waveOutGetDevCapsA)(iPlaybackDevice, (MA_WAVEOUTCAPSA*)&caps, sizeof(caps));\n        if (result == MA_MMSYSERR_NOERROR) {\n            ma_device_info deviceInfo;\n\n            MA_ZERO_OBJECT(&deviceInfo);\n            deviceInfo.id.winmm = iPlaybackDevice;\n\n            /* The first enumerated device is the default device. */\n            if (iPlaybackDevice == 0) {\n                deviceInfo.isDefault = MA_TRUE;\n            }\n\n            if (ma_context_get_device_info_from_WAVEOUTCAPS2(pContext, &caps, &deviceInfo) == MA_SUCCESS) {\n                ma_bool32 cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n                if (cbResult == MA_FALSE) {\n                    return MA_SUCCESS; /* Enumeration was stopped. */\n                }\n            }\n        }\n    }\n\n    /* Capture. */\n    captureDeviceCount = ((MA_PFN_waveInGetNumDevs)pContext->winmm.waveInGetNumDevs)();\n    for (iCaptureDevice = 0; iCaptureDevice < captureDeviceCount; ++iCaptureDevice) {\n        MA_MMRESULT result;\n        MA_WAVEINCAPS2A caps;\n\n        MA_ZERO_OBJECT(&caps);\n\n        result = ((MA_PFN_waveInGetDevCapsA)pContext->winmm.waveInGetDevCapsA)(iCaptureDevice, (MA_WAVEINCAPSA*)&caps, sizeof(caps));\n        if (result == MA_MMSYSERR_NOERROR) {\n            ma_device_info deviceInfo;\n\n            MA_ZERO_OBJECT(&deviceInfo);\n            deviceInfo.id.winmm = iCaptureDevice;\n\n            /* The first enumerated device is the default device. */\n            if (iCaptureDevice == 0) {\n                deviceInfo.isDefault = MA_TRUE;\n            }\n\n            if (ma_context_get_device_info_from_WAVEINCAPS2(pContext, &caps, &deviceInfo) == MA_SUCCESS) {\n                ma_bool32 cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n                if (cbResult == MA_FALSE) {\n                    return MA_SUCCESS; /* Enumeration was stopped. */\n                }\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_get_device_info__winmm(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    UINT winMMDeviceID;\n\n    MA_ASSERT(pContext != NULL);\n\n    winMMDeviceID = 0;\n    if (pDeviceID != NULL) {\n        winMMDeviceID = (UINT)pDeviceID->winmm;\n    }\n\n    pDeviceInfo->id.winmm = winMMDeviceID;\n\n    /* The first ID is the default device. */\n    if (winMMDeviceID == 0) {\n        pDeviceInfo->isDefault = MA_TRUE;\n    }\n\n    if (deviceType == ma_device_type_playback) {\n        MA_MMRESULT result;\n        MA_WAVEOUTCAPS2A caps;\n\n        MA_ZERO_OBJECT(&caps);\n\n        result = ((MA_PFN_waveOutGetDevCapsA)pContext->winmm.waveOutGetDevCapsA)(winMMDeviceID, (MA_WAVEOUTCAPSA*)&caps, sizeof(caps));\n        if (result == MA_MMSYSERR_NOERROR) {\n            return ma_context_get_device_info_from_WAVEOUTCAPS2(pContext, &caps, pDeviceInfo);\n        }\n    } else {\n        MA_MMRESULT result;\n        MA_WAVEINCAPS2A caps;\n\n        MA_ZERO_OBJECT(&caps);\n\n        result = ((MA_PFN_waveInGetDevCapsA)pContext->winmm.waveInGetDevCapsA)(winMMDeviceID, (MA_WAVEINCAPSA*)&caps, sizeof(caps));\n        if (result == MA_MMSYSERR_NOERROR) {\n            return ma_context_get_device_info_from_WAVEINCAPS2(pContext, &caps, pDeviceInfo);\n        }\n    }\n\n    return MA_NO_DEVICE;\n}\n\n\nstatic ma_result ma_device_uninit__winmm(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ((MA_PFN_waveInClose)pDevice->pContext->winmm.waveInClose)((MA_HWAVEIN)pDevice->winmm.hDeviceCapture);\n        CloseHandle((HANDLE)pDevice->winmm.hEventCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ((MA_PFN_waveOutReset)pDevice->pContext->winmm.waveOutReset)((MA_HWAVEOUT)pDevice->winmm.hDevicePlayback);\n        ((MA_PFN_waveOutClose)pDevice->pContext->winmm.waveOutClose)((MA_HWAVEOUT)pDevice->winmm.hDevicePlayback);\n        CloseHandle((HANDLE)pDevice->winmm.hEventPlayback);\n    }\n\n    ma_free(pDevice->winmm._pHeapData, &pDevice->pContext->allocationCallbacks);\n\n    MA_ZERO_OBJECT(&pDevice->winmm);   /* Safety. */\n\n    return MA_SUCCESS;\n}\n\nstatic ma_uint32 ma_calculate_period_size_in_frames_from_descriptor__winmm(const ma_device_descriptor* pDescriptor, ma_uint32 nativeSampleRate, ma_performance_profile performanceProfile)\n{\n    /* WinMM has a minimum period size of 40ms. */\n    ma_uint32 minPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(40, nativeSampleRate);\n    ma_uint32 periodSizeInFrames;\n\n    periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, nativeSampleRate, performanceProfile);\n    if (periodSizeInFrames < minPeriodSizeInFrames) {\n        periodSizeInFrames = minPeriodSizeInFrames;\n    }\n\n    return periodSizeInFrames;\n}\n\nstatic ma_result ma_device_init__winmm(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n    const char* errorMsg = \"\";\n    ma_result errorCode = MA_ERROR;\n    ma_result result = MA_SUCCESS;\n    ma_uint32 heapSize;\n    UINT winMMDeviceIDPlayback = 0;\n    UINT winMMDeviceIDCapture  = 0;\n\n    MA_ASSERT(pDevice != NULL);\n\n    MA_ZERO_OBJECT(&pDevice->winmm);\n\n    if (pConfig->deviceType == ma_device_type_loopback) {\n        return MA_DEVICE_TYPE_NOT_SUPPORTED;\n    }\n\n    /* No exlusive mode with WinMM. */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->shareMode == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->shareMode  == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    if (pDescriptorPlayback->pDeviceID != NULL) {\n        winMMDeviceIDPlayback = (UINT)pDescriptorPlayback->pDeviceID->winmm;\n    }\n    if (pDescriptorCapture->pDeviceID != NULL) {\n        winMMDeviceIDCapture = (UINT)pDescriptorCapture->pDeviceID->winmm;\n    }\n\n    /* The capture device needs to be initialized first. */\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        MA_WAVEINCAPSA caps;\n        MA_WAVEFORMATEX wf;\n        MA_MMRESULT resultMM;\n\n        /* We use an event to know when a new fragment needs to be enqueued. */\n        pDevice->winmm.hEventCapture = (ma_handle)CreateEventA(NULL, TRUE, TRUE, NULL);\n        if (pDevice->winmm.hEventCapture == NULL) {\n            errorMsg = \"[WinMM] Failed to create event for fragment enqueing for the capture device.\", errorCode = ma_result_from_GetLastError(GetLastError());\n            goto on_error;\n        }\n\n        /* The format should be based on the device's actual format. */\n        if (((MA_PFN_waveInGetDevCapsA)pDevice->pContext->winmm.waveInGetDevCapsA)(winMMDeviceIDCapture, &caps, sizeof(caps)) != MA_MMSYSERR_NOERROR) {\n            errorMsg = \"[WinMM] Failed to retrieve internal device caps.\", errorCode = MA_FORMAT_NOT_SUPPORTED;\n            goto on_error;\n        }\n\n        result = ma_formats_flags_to_WAVEFORMATEX__winmm(caps.dwFormats, caps.wChannels, &wf);\n        if (result != MA_SUCCESS) {\n            errorMsg = \"[WinMM] Could not find appropriate format for internal device.\", errorCode = result;\n            goto on_error;\n        }\n\n        resultMM = ((MA_PFN_waveInOpen)pDevice->pContext->winmm.waveInOpen)((MA_HWAVEIN*)&pDevice->winmm.hDeviceCapture, winMMDeviceIDCapture, &wf, (DWORD_PTR)pDevice->winmm.hEventCapture, (DWORD_PTR)pDevice, MA_CALLBACK_EVENT | MA_WAVE_ALLOWSYNC);\n        if (resultMM != MA_MMSYSERR_NOERROR) {\n            errorMsg = \"[WinMM] Failed to open capture device.\", errorCode = MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n            goto on_error;\n        }\n\n        pDescriptorCapture->format             = ma_format_from_WAVEFORMATEX(&wf);\n        pDescriptorCapture->channels           = wf.nChannels;\n        pDescriptorCapture->sampleRate         = wf.nSamplesPerSec;\n        ma_channel_map_init_standard(ma_standard_channel_map_microsoft, pDescriptorCapture->channelMap, ma_countof(pDescriptorCapture->channelMap), pDescriptorCapture->channels);\n        pDescriptorCapture->periodCount        = pDescriptorCapture->periodCount;\n        pDescriptorCapture->periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__winmm(pDescriptorCapture, pDescriptorCapture->sampleRate, pConfig->performanceProfile);\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        MA_WAVEOUTCAPSA caps;\n        MA_WAVEFORMATEX wf;\n        MA_MMRESULT resultMM;\n\n        /* We use an event to know when a new fragment needs to be enqueued. */\n        pDevice->winmm.hEventPlayback = (ma_handle)CreateEventA(NULL, TRUE, TRUE, NULL);\n        if (pDevice->winmm.hEventPlayback == NULL) {\n            errorMsg = \"[WinMM] Failed to create event for fragment enqueing for the playback device.\", errorCode = ma_result_from_GetLastError(GetLastError());\n            goto on_error;\n        }\n\n        /* The format should be based on the device's actual format. */\n        if (((MA_PFN_waveOutGetDevCapsA)pDevice->pContext->winmm.waveOutGetDevCapsA)(winMMDeviceIDPlayback, &caps, sizeof(caps)) != MA_MMSYSERR_NOERROR) {\n            errorMsg = \"[WinMM] Failed to retrieve internal device caps.\", errorCode = MA_FORMAT_NOT_SUPPORTED;\n            goto on_error;\n        }\n\n        result = ma_formats_flags_to_WAVEFORMATEX__winmm(caps.dwFormats, caps.wChannels, &wf);\n        if (result != MA_SUCCESS) {\n            errorMsg = \"[WinMM] Could not find appropriate format for internal device.\", errorCode = result;\n            goto on_error;\n        }\n\n        resultMM = ((MA_PFN_waveOutOpen)pDevice->pContext->winmm.waveOutOpen)((MA_HWAVEOUT*)&pDevice->winmm.hDevicePlayback, winMMDeviceIDPlayback, &wf, (DWORD_PTR)pDevice->winmm.hEventPlayback, (DWORD_PTR)pDevice, MA_CALLBACK_EVENT | MA_WAVE_ALLOWSYNC);\n        if (resultMM != MA_MMSYSERR_NOERROR) {\n            errorMsg = \"[WinMM] Failed to open playback device.\", errorCode = MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n            goto on_error;\n        }\n\n        pDescriptorPlayback->format             = ma_format_from_WAVEFORMATEX(&wf);\n        pDescriptorPlayback->channels           = wf.nChannels;\n        pDescriptorPlayback->sampleRate         = wf.nSamplesPerSec;\n        ma_channel_map_init_standard(ma_standard_channel_map_microsoft, pDescriptorPlayback->channelMap, ma_countof(pDescriptorPlayback->channelMap), pDescriptorPlayback->channels);\n        pDescriptorPlayback->periodCount        = pDescriptorPlayback->periodCount;\n        pDescriptorPlayback->periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__winmm(pDescriptorPlayback, pDescriptorPlayback->sampleRate, pConfig->performanceProfile);\n    }\n\n    /*\n    The heap allocated data is allocated like so:\n\n    [Capture WAVEHDRs][Playback WAVEHDRs][Capture Intermediary Buffer][Playback Intermediary Buffer]\n    */\n    heapSize = 0;\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        heapSize += sizeof(MA_WAVEHDR)*pDescriptorCapture->periodCount + (pDescriptorCapture->periodSizeInFrames * pDescriptorCapture->periodCount * ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels));\n    }\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        heapSize += sizeof(MA_WAVEHDR)*pDescriptorPlayback->periodCount + (pDescriptorPlayback->periodSizeInFrames * pDescriptorPlayback->periodCount * ma_get_bytes_per_frame(pDescriptorPlayback->format, pDescriptorPlayback->channels));\n    }\n\n    pDevice->winmm._pHeapData = (ma_uint8*)ma_calloc(heapSize, &pDevice->pContext->allocationCallbacks);\n    if (pDevice->winmm._pHeapData == NULL) {\n        errorMsg = \"[WinMM] Failed to allocate memory for the intermediary buffer.\", errorCode = MA_OUT_OF_MEMORY;\n        goto on_error;\n    }\n\n    MA_ZERO_MEMORY(pDevice->winmm._pHeapData, heapSize);\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_uint32 iPeriod;\n\n        if (pConfig->deviceType == ma_device_type_capture) {\n            pDevice->winmm.pWAVEHDRCapture            = pDevice->winmm._pHeapData;\n            pDevice->winmm.pIntermediaryBufferCapture = pDevice->winmm._pHeapData + (sizeof(MA_WAVEHDR)*(pDescriptorCapture->periodCount));\n        } else {\n            pDevice->winmm.pWAVEHDRCapture            = pDevice->winmm._pHeapData;\n            pDevice->winmm.pIntermediaryBufferCapture = pDevice->winmm._pHeapData + (sizeof(MA_WAVEHDR)*(pDescriptorCapture->periodCount + pDescriptorPlayback->periodCount));\n        }\n\n        /* Prepare headers. */\n        for (iPeriod = 0; iPeriod < pDescriptorCapture->periodCount; ++iPeriod) {\n            ma_uint32 periodSizeInBytes = ma_get_period_size_in_bytes(pDescriptorCapture->periodSizeInFrames, pDescriptorCapture->format, pDescriptorCapture->channels);\n\n            ((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].lpData         = (char*)(pDevice->winmm.pIntermediaryBufferCapture + (periodSizeInBytes*iPeriod));\n            ((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].dwBufferLength = periodSizeInBytes;\n            ((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].dwFlags        = 0L;\n            ((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].dwLoops        = 0L;\n            ((MA_PFN_waveInPrepareHeader)pDevice->pContext->winmm.waveInPrepareHeader)((MA_HWAVEIN)pDevice->winmm.hDeviceCapture, &((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod], sizeof(MA_WAVEHDR));\n\n            /*\n            The user data of the MA_WAVEHDR structure is a single flag the controls whether or not it is ready for writing. Consider it to be named \"isLocked\". A value of 0 means\n            it's unlocked and available for writing. A value of 1 means it's locked.\n            */\n            ((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod].dwUser = 0;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_uint32 iPeriod;\n\n        if (pConfig->deviceType == ma_device_type_playback) {\n            pDevice->winmm.pWAVEHDRPlayback            = pDevice->winmm._pHeapData;\n            pDevice->winmm.pIntermediaryBufferPlayback = pDevice->winmm._pHeapData + (sizeof(MA_WAVEHDR)*pDescriptorPlayback->periodCount);\n        } else {\n            pDevice->winmm.pWAVEHDRPlayback            = pDevice->winmm._pHeapData + (sizeof(MA_WAVEHDR)*(pDescriptorCapture->periodCount));\n            pDevice->winmm.pIntermediaryBufferPlayback = pDevice->winmm._pHeapData + (sizeof(MA_WAVEHDR)*(pDescriptorCapture->periodCount + pDescriptorPlayback->periodCount)) + (pDescriptorCapture->periodSizeInFrames*pDescriptorCapture->periodCount*ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels));\n        }\n\n        /* Prepare headers. */\n        for (iPeriod = 0; iPeriod < pDescriptorPlayback->periodCount; ++iPeriod) {\n            ma_uint32 periodSizeInBytes = ma_get_period_size_in_bytes(pDescriptorPlayback->periodSizeInFrames, pDescriptorPlayback->format, pDescriptorPlayback->channels);\n\n            ((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].lpData         = (char*)(pDevice->winmm.pIntermediaryBufferPlayback + (periodSizeInBytes*iPeriod));\n            ((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].dwBufferLength = periodSizeInBytes;\n            ((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].dwFlags        = 0L;\n            ((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].dwLoops        = 0L;\n            ((MA_PFN_waveOutPrepareHeader)pDevice->pContext->winmm.waveOutPrepareHeader)((MA_HWAVEOUT)pDevice->winmm.hDevicePlayback, &((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod], sizeof(MA_WAVEHDR));\n\n            /*\n            The user data of the MA_WAVEHDR structure is a single flag the controls whether or not it is ready for writing. Consider it to be named \"isLocked\". A value of 0 means\n            it's unlocked and available for writing. A value of 1 means it's locked.\n            */\n            ((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod].dwUser = 0;\n        }\n    }\n\n    return MA_SUCCESS;\n\non_error:\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->winmm.pWAVEHDRCapture != NULL) {\n            ma_uint32 iPeriod;\n            for (iPeriod = 0; iPeriod < pDescriptorCapture->periodCount; ++iPeriod) {\n                ((MA_PFN_waveInUnprepareHeader)pDevice->pContext->winmm.waveInUnprepareHeader)((MA_HWAVEIN)pDevice->winmm.hDeviceCapture, &((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod], sizeof(MA_WAVEHDR));\n            }\n        }\n\n        ((MA_PFN_waveInClose)pDevice->pContext->winmm.waveInClose)((MA_HWAVEIN)pDevice->winmm.hDeviceCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->winmm.pWAVEHDRCapture != NULL) {\n            ma_uint32 iPeriod;\n            for (iPeriod = 0; iPeriod < pDescriptorPlayback->periodCount; ++iPeriod) {\n                ((MA_PFN_waveOutUnprepareHeader)pDevice->pContext->winmm.waveOutUnprepareHeader)((MA_HWAVEOUT)pDevice->winmm.hDevicePlayback, &((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback)[iPeriod], sizeof(MA_WAVEHDR));\n            }\n        }\n\n        ((MA_PFN_waveOutClose)pDevice->pContext->winmm.waveOutClose)((MA_HWAVEOUT)pDevice->winmm.hDevicePlayback);\n    }\n\n    ma_free(pDevice->winmm._pHeapData, &pDevice->pContext->allocationCallbacks);\n\n    if (errorMsg != NULL && errorMsg[0] != '\\0') {\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"%s\", errorMsg);\n    }\n\n    return errorCode;\n}\n\nstatic ma_result ma_device_start__winmm(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        MA_MMRESULT resultMM;\n        MA_WAVEHDR* pWAVEHDR;\n        ma_uint32 iPeriod;\n\n        pWAVEHDR = (MA_WAVEHDR*)pDevice->winmm.pWAVEHDRCapture;\n\n        /* Make sure the event is reset to a non-signaled state to ensure we don't prematurely return from WaitForSingleObject(). */\n        ResetEvent((HANDLE)pDevice->winmm.hEventCapture);\n\n        /* To start the device we attach all of the buffers and then start it. As the buffers are filled with data we will get notifications. */\n        for (iPeriod = 0; iPeriod < pDevice->capture.internalPeriods; ++iPeriod) {\n            resultMM = ((MA_PFN_waveInAddBuffer)pDevice->pContext->winmm.waveInAddBuffer)((MA_HWAVEIN)pDevice->winmm.hDeviceCapture, &((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[iPeriod], sizeof(MA_WAVEHDR));\n            if (resultMM != MA_MMSYSERR_NOERROR) {\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WinMM] Failed to attach input buffers to capture device in preparation for capture.\");\n                return ma_result_from_MMRESULT(resultMM);\n            }\n\n            /* Make sure all of the buffers start out locked. We don't want to access them until the backend tells us we can. */\n            pWAVEHDR[iPeriod].dwUser = 1;   /* 1 = locked. */\n        }\n\n        /* Capture devices need to be explicitly started, unlike playback devices. */\n        resultMM = ((MA_PFN_waveInStart)pDevice->pContext->winmm.waveInStart)((MA_HWAVEIN)pDevice->winmm.hDeviceCapture);\n        if (resultMM != MA_MMSYSERR_NOERROR) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WinMM] Failed to start backend device.\");\n            return ma_result_from_MMRESULT(resultMM);\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        /* Don't need to do anything for playback. It'll be started automatically in ma_device_start__winmm(). */\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop__winmm(ma_device* pDevice)\n{\n    MA_MMRESULT resultMM;\n\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->winmm.hDeviceCapture == NULL) {\n            return MA_INVALID_ARGS;\n        }\n\n        resultMM = ((MA_PFN_waveInReset)pDevice->pContext->winmm.waveInReset)((MA_HWAVEIN)pDevice->winmm.hDeviceCapture);\n        if (resultMM != MA_MMSYSERR_NOERROR) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, \"[WinMM] WARNING: Failed to reset capture device.\");\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_uint32 iPeriod;\n        MA_WAVEHDR* pWAVEHDR;\n\n        if (pDevice->winmm.hDevicePlayback == NULL) {\n            return MA_INVALID_ARGS;\n        }\n\n        /* We need to drain the device. To do this we just loop over each header and if it's locked just wait for the event. */\n        pWAVEHDR = (MA_WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback;\n        for (iPeriod = 0; iPeriod < pDevice->playback.internalPeriods; iPeriod += 1) {\n            if (pWAVEHDR[iPeriod].dwUser == 1) { /* 1 = locked. */\n                if (WaitForSingleObject((HANDLE)pDevice->winmm.hEventPlayback, INFINITE) != WAIT_OBJECT_0) {\n                    break;  /* An error occurred so just abandon ship and stop the device without draining. */\n                }\n\n                pWAVEHDR[iPeriod].dwUser = 0;\n            }\n        }\n\n        resultMM = ((MA_PFN_waveOutReset)pDevice->pContext->winmm.waveOutReset)((MA_HWAVEOUT)pDevice->winmm.hDevicePlayback);\n        if (resultMM != MA_MMSYSERR_NOERROR) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, \"[WinMM] WARNING: Failed to reset playback device.\");\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_write__winmm(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten)\n{\n    ma_result result = MA_SUCCESS;\n    MA_MMRESULT resultMM;\n    ma_uint32 totalFramesWritten;\n    MA_WAVEHDR* pWAVEHDR;\n\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(pPCMFrames != NULL);\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = 0;\n    }\n\n    pWAVEHDR = (MA_WAVEHDR*)pDevice->winmm.pWAVEHDRPlayback;\n\n    /* Keep processing as much data as possible. */\n    totalFramesWritten = 0;\n    while (totalFramesWritten < frameCount) {\n        /* If the current header has some space available we need to write part of it. */\n        if (pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwUser == 0) { /* 0 = unlocked. */\n            /*\n            This header has room in it. We copy as much of it as we can. If we end up fully consuming the buffer we need to\n            write it out and move on to the next iteration.\n            */\n            ma_uint32 bpf = ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n            ma_uint32 framesRemainingInHeader = (pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwBufferLength/bpf) - pDevice->winmm.headerFramesConsumedPlayback;\n\n            ma_uint32 framesToCopy = ma_min(framesRemainingInHeader, (frameCount - totalFramesWritten));\n            const void* pSrc = ma_offset_ptr(pPCMFrames, totalFramesWritten*bpf);\n            void* pDst = ma_offset_ptr(pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].lpData, pDevice->winmm.headerFramesConsumedPlayback*bpf);\n            MA_COPY_MEMORY(pDst, pSrc, framesToCopy*bpf);\n\n            pDevice->winmm.headerFramesConsumedPlayback += framesToCopy;\n            totalFramesWritten += framesToCopy;\n\n            /* If we've consumed the buffer entirely we need to write it out to the device. */\n            if (pDevice->winmm.headerFramesConsumedPlayback == (pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwBufferLength/bpf)) {\n                pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwUser = 1;            /* 1 = locked. */\n                pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwFlags &= ~MA_WHDR_DONE; /* <-- Need to make sure the WHDR_DONE flag is unset. */\n\n                /* Make sure the event is reset to a non-signaled state to ensure we don't prematurely return from WaitForSingleObject(). */\n                ResetEvent((HANDLE)pDevice->winmm.hEventPlayback);\n\n                /* The device will be started here. */\n                resultMM = ((MA_PFN_waveOutWrite)pDevice->pContext->winmm.waveOutWrite)((MA_HWAVEOUT)pDevice->winmm.hDevicePlayback, &pWAVEHDR[pDevice->winmm.iNextHeaderPlayback], sizeof(MA_WAVEHDR));\n                if (resultMM != MA_MMSYSERR_NOERROR) {\n                    result = ma_result_from_MMRESULT(resultMM);\n                    ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WinMM] waveOutWrite() failed.\");\n                    break;\n                }\n\n                /* Make sure we move to the next header. */\n                pDevice->winmm.iNextHeaderPlayback = (pDevice->winmm.iNextHeaderPlayback + 1) % pDevice->playback.internalPeriods;\n                pDevice->winmm.headerFramesConsumedPlayback = 0;\n            }\n\n            /* If at this point we have consumed the entire input buffer we can return. */\n            MA_ASSERT(totalFramesWritten <= frameCount);\n            if (totalFramesWritten == frameCount) {\n                break;\n            }\n\n            /* Getting here means there's more to process. */\n            continue;\n        }\n\n        /* Getting here means there isn't enough room in the buffer and we need to wait for one to become available. */\n        if (WaitForSingleObject((HANDLE)pDevice->winmm.hEventPlayback, INFINITE) != WAIT_OBJECT_0) {\n            result = MA_ERROR;\n            break;\n        }\n\n        /* Something happened. If the next buffer has been marked as done we need to reset a bit of state. */\n        if ((pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwFlags & MA_WHDR_DONE) != 0) {\n            pWAVEHDR[pDevice->winmm.iNextHeaderPlayback].dwUser = 0;    /* 0 = unlocked (make it available for writing). */\n            pDevice->winmm.headerFramesConsumedPlayback = 0;\n        }\n\n        /* If the device has been stopped we need to break. */\n        if (ma_device_get_state(pDevice) != ma_device_state_started) {\n            break;\n        }\n    }\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = totalFramesWritten;\n    }\n\n    return result;\n}\n\nstatic ma_result ma_device_read__winmm(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesRead)\n{\n    ma_result result = MA_SUCCESS;\n    MA_MMRESULT resultMM;\n    ma_uint32 totalFramesRead;\n    MA_WAVEHDR* pWAVEHDR;\n\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(pPCMFrames != NULL);\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    pWAVEHDR = (MA_WAVEHDR*)pDevice->winmm.pWAVEHDRCapture;\n\n    /* Keep processing as much data as possible. */\n    totalFramesRead = 0;\n    while (totalFramesRead < frameCount) {\n        /* If the current header has some space available we need to write part of it. */\n        if (pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwUser == 0) { /* 0 = unlocked. */\n            /* The buffer is available for reading. If we fully consume it we need to add it back to the buffer. */\n            ma_uint32 bpf = ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n            ma_uint32 framesRemainingInHeader = (pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwBufferLength/bpf) - pDevice->winmm.headerFramesConsumedCapture;\n\n            ma_uint32 framesToCopy = ma_min(framesRemainingInHeader, (frameCount - totalFramesRead));\n            const void* pSrc = ma_offset_ptr(pWAVEHDR[pDevice->winmm.iNextHeaderCapture].lpData, pDevice->winmm.headerFramesConsumedCapture*bpf);\n            void* pDst = ma_offset_ptr(pPCMFrames, totalFramesRead*bpf);\n            MA_COPY_MEMORY(pDst, pSrc, framesToCopy*bpf);\n\n            pDevice->winmm.headerFramesConsumedCapture += framesToCopy;\n            totalFramesRead += framesToCopy;\n\n            /* If we've consumed the buffer entirely we need to add it back to the device. */\n            if (pDevice->winmm.headerFramesConsumedCapture == (pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwBufferLength/bpf)) {\n                pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwUser = 1;            /* 1 = locked. */\n                pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwFlags &= ~MA_WHDR_DONE; /* <-- Need to make sure the WHDR_DONE flag is unset. */\n\n                /* Make sure the event is reset to a non-signaled state to ensure we don't prematurely return from WaitForSingleObject(). */\n                ResetEvent((HANDLE)pDevice->winmm.hEventCapture);\n\n                /* The device will be started here. */\n                resultMM = ((MA_PFN_waveInAddBuffer)pDevice->pContext->winmm.waveInAddBuffer)((MA_HWAVEIN)pDevice->winmm.hDeviceCapture, &((MA_WAVEHDR*)pDevice->winmm.pWAVEHDRCapture)[pDevice->winmm.iNextHeaderCapture], sizeof(MA_WAVEHDR));\n                if (resultMM != MA_MMSYSERR_NOERROR) {\n                    result = ma_result_from_MMRESULT(resultMM);\n                    ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[WinMM] waveInAddBuffer() failed.\");\n                    break;\n                }\n\n                /* Make sure we move to the next header. */\n                pDevice->winmm.iNextHeaderCapture = (pDevice->winmm.iNextHeaderCapture + 1) % pDevice->capture.internalPeriods;\n                pDevice->winmm.headerFramesConsumedCapture = 0;\n            }\n\n            /* If at this point we have filled the entire input buffer we can return. */\n            MA_ASSERT(totalFramesRead <= frameCount);\n            if (totalFramesRead == frameCount) {\n                break;\n            }\n\n            /* Getting here means there's more to process. */\n            continue;\n        }\n\n        /* Getting here means there isn't enough any data left to send to the client which means we need to wait for more. */\n        if (WaitForSingleObject((HANDLE)pDevice->winmm.hEventCapture, INFINITE) != WAIT_OBJECT_0) {\n            result = MA_ERROR;\n            break;\n        }\n\n        /* Something happened. If the next buffer has been marked as done we need to reset a bit of state. */\n        if ((pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwFlags & MA_WHDR_DONE) != 0) {\n            pWAVEHDR[pDevice->winmm.iNextHeaderCapture].dwUser = 0;    /* 0 = unlocked (make it available for reading). */\n            pDevice->winmm.headerFramesConsumedCapture = 0;\n        }\n\n        /* If the device has been stopped we need to break. */\n        if (ma_device_get_state(pDevice) != ma_device_state_started) {\n            break;\n        }\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = totalFramesRead;\n    }\n\n    return result;\n}\n\nstatic ma_result ma_context_uninit__winmm(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_winmm);\n\n    ma_dlclose(ma_context_get_log(pContext), pContext->winmm.hWinMM);\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init__winmm(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n    MA_ASSERT(pContext != NULL);\n\n    (void)pConfig;\n\n    pContext->winmm.hWinMM = ma_dlopen(ma_context_get_log(pContext), \"winmm.dll\");\n    if (pContext->winmm.hWinMM == NULL) {\n        return MA_NO_BACKEND;\n    }\n\n    pContext->winmm.waveOutGetNumDevs      = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveOutGetNumDevs\");\n    pContext->winmm.waveOutGetDevCapsA     = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveOutGetDevCapsA\");\n    pContext->winmm.waveOutOpen            = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveOutOpen\");\n    pContext->winmm.waveOutClose           = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveOutClose\");\n    pContext->winmm.waveOutPrepareHeader   = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveOutPrepareHeader\");\n    pContext->winmm.waveOutUnprepareHeader = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveOutUnprepareHeader\");\n    pContext->winmm.waveOutWrite           = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveOutWrite\");\n    pContext->winmm.waveOutReset           = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveOutReset\");\n    pContext->winmm.waveInGetNumDevs       = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveInGetNumDevs\");\n    pContext->winmm.waveInGetDevCapsA      = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveInGetDevCapsA\");\n    pContext->winmm.waveInOpen             = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveInOpen\");\n    pContext->winmm.waveInClose            = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveInClose\");\n    pContext->winmm.waveInPrepareHeader    = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveInPrepareHeader\");\n    pContext->winmm.waveInUnprepareHeader  = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveInUnprepareHeader\");\n    pContext->winmm.waveInAddBuffer        = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveInAddBuffer\");\n    pContext->winmm.waveInStart            = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveInStart\");\n    pContext->winmm.waveInReset            = ma_dlsym(ma_context_get_log(pContext), pContext->winmm.hWinMM, \"waveInReset\");\n\n    pCallbacks->onContextInit             = ma_context_init__winmm;\n    pCallbacks->onContextUninit           = ma_context_uninit__winmm;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__winmm;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__winmm;\n    pCallbacks->onDeviceInit              = ma_device_init__winmm;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__winmm;\n    pCallbacks->onDeviceStart             = ma_device_start__winmm;\n    pCallbacks->onDeviceStop              = ma_device_stop__winmm;\n    pCallbacks->onDeviceRead              = ma_device_read__winmm;\n    pCallbacks->onDeviceWrite             = ma_device_write__winmm;\n    pCallbacks->onDeviceDataLoop          = NULL;   /* This is a blocking read-write API, so this can be NULL since miniaudio will manage the audio thread for us. */\n\n    return MA_SUCCESS;\n}\n#endif\n\n\n\n\n/******************************************************************************\n\nALSA Backend\n\n******************************************************************************/\n#ifdef MA_HAS_ALSA\n\n#include <poll.h>           /* poll(), struct pollfd */\n#include <sys/eventfd.h>    /* eventfd() */\n\n#ifdef MA_NO_RUNTIME_LINKING\n\n/* asoundlib.h marks some functions with \"inline\" which isn't always supported. Need to emulate it. */\n#if !defined(__cplusplus)\n    #if defined(__STRICT_ANSI__)\n        #if !defined(inline)\n            #define inline __inline__ __attribute__((always_inline))\n            #define MA_INLINE_DEFINED\n        #endif\n    #endif\n#endif\n#include <alsa/asoundlib.h>\n#if defined(MA_INLINE_DEFINED)\n    #undef inline\n    #undef MA_INLINE_DEFINED\n#endif\n\ntypedef snd_pcm_uframes_t                       ma_snd_pcm_uframes_t;\ntypedef snd_pcm_sframes_t                       ma_snd_pcm_sframes_t;\ntypedef snd_pcm_stream_t                        ma_snd_pcm_stream_t;\ntypedef snd_pcm_format_t                        ma_snd_pcm_format_t;\ntypedef snd_pcm_access_t                        ma_snd_pcm_access_t;\ntypedef snd_pcm_t                               ma_snd_pcm_t;\ntypedef snd_pcm_hw_params_t                     ma_snd_pcm_hw_params_t;\ntypedef snd_pcm_sw_params_t                     ma_snd_pcm_sw_params_t;\ntypedef snd_pcm_format_mask_t                   ma_snd_pcm_format_mask_t;\ntypedef snd_pcm_info_t                          ma_snd_pcm_info_t;\ntypedef snd_pcm_channel_area_t                  ma_snd_pcm_channel_area_t;\ntypedef snd_pcm_chmap_t                         ma_snd_pcm_chmap_t;\ntypedef snd_pcm_state_t                         ma_snd_pcm_state_t;\n\n/* snd_pcm_stream_t */\n#define MA_SND_PCM_STREAM_PLAYBACK              SND_PCM_STREAM_PLAYBACK\n#define MA_SND_PCM_STREAM_CAPTURE               SND_PCM_STREAM_CAPTURE\n\n/* snd_pcm_format_t */\n#define MA_SND_PCM_FORMAT_UNKNOWN               SND_PCM_FORMAT_UNKNOWN\n#define MA_SND_PCM_FORMAT_U8                    SND_PCM_FORMAT_U8\n#define MA_SND_PCM_FORMAT_S16_LE                SND_PCM_FORMAT_S16_LE\n#define MA_SND_PCM_FORMAT_S16_BE                SND_PCM_FORMAT_S16_BE\n#define MA_SND_PCM_FORMAT_S24_LE                SND_PCM_FORMAT_S24_LE\n#define MA_SND_PCM_FORMAT_S24_BE                SND_PCM_FORMAT_S24_BE\n#define MA_SND_PCM_FORMAT_S32_LE                SND_PCM_FORMAT_S32_LE\n#define MA_SND_PCM_FORMAT_S32_BE                SND_PCM_FORMAT_S32_BE\n#define MA_SND_PCM_FORMAT_FLOAT_LE              SND_PCM_FORMAT_FLOAT_LE\n#define MA_SND_PCM_FORMAT_FLOAT_BE              SND_PCM_FORMAT_FLOAT_BE\n#define MA_SND_PCM_FORMAT_FLOAT64_LE            SND_PCM_FORMAT_FLOAT64_LE\n#define MA_SND_PCM_FORMAT_FLOAT64_BE            SND_PCM_FORMAT_FLOAT64_BE\n#define MA_SND_PCM_FORMAT_MU_LAW                SND_PCM_FORMAT_MU_LAW\n#define MA_SND_PCM_FORMAT_A_LAW                 SND_PCM_FORMAT_A_LAW\n#define MA_SND_PCM_FORMAT_S24_3LE               SND_PCM_FORMAT_S24_3LE\n#define MA_SND_PCM_FORMAT_S24_3BE               SND_PCM_FORMAT_S24_3BE\n\n/* ma_snd_pcm_access_t */\n#define MA_SND_PCM_ACCESS_MMAP_INTERLEAVED      SND_PCM_ACCESS_MMAP_INTERLEAVED\n#define MA_SND_PCM_ACCESS_MMAP_NONINTERLEAVED   SND_PCM_ACCESS_MMAP_NONINTERLEAVED\n#define MA_SND_PCM_ACCESS_MMAP_COMPLEX          SND_PCM_ACCESS_MMAP_COMPLEX\n#define MA_SND_PCM_ACCESS_RW_INTERLEAVED        SND_PCM_ACCESS_RW_INTERLEAVED\n#define MA_SND_PCM_ACCESS_RW_NONINTERLEAVED     SND_PCM_ACCESS_RW_NONINTERLEAVED\n\n/* Channel positions. */\n#define MA_SND_CHMAP_UNKNOWN                    SND_CHMAP_UNKNOWN\n#define MA_SND_CHMAP_NA                         SND_CHMAP_NA\n#define MA_SND_CHMAP_MONO                       SND_CHMAP_MONO\n#define MA_SND_CHMAP_FL                         SND_CHMAP_FL\n#define MA_SND_CHMAP_FR                         SND_CHMAP_FR\n#define MA_SND_CHMAP_RL                         SND_CHMAP_RL\n#define MA_SND_CHMAP_RR                         SND_CHMAP_RR\n#define MA_SND_CHMAP_FC                         SND_CHMAP_FC\n#define MA_SND_CHMAP_LFE                        SND_CHMAP_LFE\n#define MA_SND_CHMAP_SL                         SND_CHMAP_SL\n#define MA_SND_CHMAP_SR                         SND_CHMAP_SR\n#define MA_SND_CHMAP_RC                         SND_CHMAP_RC\n#define MA_SND_CHMAP_FLC                        SND_CHMAP_FLC\n#define MA_SND_CHMAP_FRC                        SND_CHMAP_FRC\n#define MA_SND_CHMAP_RLC                        SND_CHMAP_RLC\n#define MA_SND_CHMAP_RRC                        SND_CHMAP_RRC\n#define MA_SND_CHMAP_FLW                        SND_CHMAP_FLW\n#define MA_SND_CHMAP_FRW                        SND_CHMAP_FRW\n#define MA_SND_CHMAP_FLH                        SND_CHMAP_FLH\n#define MA_SND_CHMAP_FCH                        SND_CHMAP_FCH\n#define MA_SND_CHMAP_FRH                        SND_CHMAP_FRH\n#define MA_SND_CHMAP_TC                         SND_CHMAP_TC\n#define MA_SND_CHMAP_TFL                        SND_CHMAP_TFL\n#define MA_SND_CHMAP_TFR                        SND_CHMAP_TFR\n#define MA_SND_CHMAP_TFC                        SND_CHMAP_TFC\n#define MA_SND_CHMAP_TRL                        SND_CHMAP_TRL\n#define MA_SND_CHMAP_TRR                        SND_CHMAP_TRR\n#define MA_SND_CHMAP_TRC                        SND_CHMAP_TRC\n#define MA_SND_CHMAP_TFLC                       SND_CHMAP_TFLC\n#define MA_SND_CHMAP_TFRC                       SND_CHMAP_TFRC\n#define MA_SND_CHMAP_TSL                        SND_CHMAP_TSL\n#define MA_SND_CHMAP_TSR                        SND_CHMAP_TSR\n#define MA_SND_CHMAP_LLFE                       SND_CHMAP_LLFE\n#define MA_SND_CHMAP_RLFE                       SND_CHMAP_RLFE\n#define MA_SND_CHMAP_BC                         SND_CHMAP_BC\n#define MA_SND_CHMAP_BLC                        SND_CHMAP_BLC\n#define MA_SND_CHMAP_BRC                        SND_CHMAP_BRC\n\n/* Open mode flags. */\n#define MA_SND_PCM_NO_AUTO_RESAMPLE             SND_PCM_NO_AUTO_RESAMPLE\n#define MA_SND_PCM_NO_AUTO_CHANNELS             SND_PCM_NO_AUTO_CHANNELS\n#define MA_SND_PCM_NO_AUTO_FORMAT               SND_PCM_NO_AUTO_FORMAT\n#else\n#include <errno.h>  /* For EPIPE, etc. */\ntypedef unsigned long                           ma_snd_pcm_uframes_t;\ntypedef long                                    ma_snd_pcm_sframes_t;\ntypedef int                                     ma_snd_pcm_stream_t;\ntypedef int                                     ma_snd_pcm_format_t;\ntypedef int                                     ma_snd_pcm_access_t;\ntypedef int                                     ma_snd_pcm_state_t;\ntypedef struct ma_snd_pcm_t                     ma_snd_pcm_t;\ntypedef struct ma_snd_pcm_hw_params_t           ma_snd_pcm_hw_params_t;\ntypedef struct ma_snd_pcm_sw_params_t           ma_snd_pcm_sw_params_t;\ntypedef struct ma_snd_pcm_format_mask_t         ma_snd_pcm_format_mask_t;\ntypedef struct ma_snd_pcm_info_t                ma_snd_pcm_info_t;\ntypedef struct\n{\n    void* addr;\n    unsigned int first;\n    unsigned int step;\n} ma_snd_pcm_channel_area_t;\ntypedef struct\n{\n    unsigned int channels;\n    unsigned int pos[1];\n} ma_snd_pcm_chmap_t;\n\n/* snd_pcm_state_t */\n#define MA_SND_PCM_STATE_OPEN                  0\n#define MA_SND_PCM_STATE_SETUP                 1\n#define MA_SND_PCM_STATE_PREPARED              2\n#define MA_SND_PCM_STATE_RUNNING               3\n#define MA_SND_PCM_STATE_XRUN                  4\n#define MA_SND_PCM_STATE_DRAINING              5\n#define MA_SND_PCM_STATE_PAUSED                6\n#define MA_SND_PCM_STATE_SUSPENDED             7\n#define MA_SND_PCM_STATE_DISCONNECTED          8\n\n/* snd_pcm_stream_t */\n#define MA_SND_PCM_STREAM_PLAYBACK             0\n#define MA_SND_PCM_STREAM_CAPTURE              1\n\n/* snd_pcm_format_t */\n#define MA_SND_PCM_FORMAT_UNKNOWN              -1\n#define MA_SND_PCM_FORMAT_U8                   1\n#define MA_SND_PCM_FORMAT_S16_LE               2\n#define MA_SND_PCM_FORMAT_S16_BE               3\n#define MA_SND_PCM_FORMAT_S24_LE               6\n#define MA_SND_PCM_FORMAT_S24_BE               7\n#define MA_SND_PCM_FORMAT_S32_LE               10\n#define MA_SND_PCM_FORMAT_S32_BE               11\n#define MA_SND_PCM_FORMAT_FLOAT_LE             14\n#define MA_SND_PCM_FORMAT_FLOAT_BE             15\n#define MA_SND_PCM_FORMAT_FLOAT64_LE           16\n#define MA_SND_PCM_FORMAT_FLOAT64_BE           17\n#define MA_SND_PCM_FORMAT_MU_LAW               20\n#define MA_SND_PCM_FORMAT_A_LAW                21\n#define MA_SND_PCM_FORMAT_S24_3LE              32\n#define MA_SND_PCM_FORMAT_S24_3BE              33\n\n/* snd_pcm_access_t */\n#define MA_SND_PCM_ACCESS_MMAP_INTERLEAVED     0\n#define MA_SND_PCM_ACCESS_MMAP_NONINTERLEAVED  1\n#define MA_SND_PCM_ACCESS_MMAP_COMPLEX         2\n#define MA_SND_PCM_ACCESS_RW_INTERLEAVED       3\n#define MA_SND_PCM_ACCESS_RW_NONINTERLEAVED    4\n\n/* Channel positions. */\n#define MA_SND_CHMAP_UNKNOWN                   0\n#define MA_SND_CHMAP_NA                        1\n#define MA_SND_CHMAP_MONO                      2\n#define MA_SND_CHMAP_FL                        3\n#define MA_SND_CHMAP_FR                        4\n#define MA_SND_CHMAP_RL                        5\n#define MA_SND_CHMAP_RR                        6\n#define MA_SND_CHMAP_FC                        7\n#define MA_SND_CHMAP_LFE                       8\n#define MA_SND_CHMAP_SL                        9\n#define MA_SND_CHMAP_SR                        10\n#define MA_SND_CHMAP_RC                        11\n#define MA_SND_CHMAP_FLC                       12\n#define MA_SND_CHMAP_FRC                       13\n#define MA_SND_CHMAP_RLC                       14\n#define MA_SND_CHMAP_RRC                       15\n#define MA_SND_CHMAP_FLW                       16\n#define MA_SND_CHMAP_FRW                       17\n#define MA_SND_CHMAP_FLH                       18\n#define MA_SND_CHMAP_FCH                       19\n#define MA_SND_CHMAP_FRH                       20\n#define MA_SND_CHMAP_TC                        21\n#define MA_SND_CHMAP_TFL                       22\n#define MA_SND_CHMAP_TFR                       23\n#define MA_SND_CHMAP_TFC                       24\n#define MA_SND_CHMAP_TRL                       25\n#define MA_SND_CHMAP_TRR                       26\n#define MA_SND_CHMAP_TRC                       27\n#define MA_SND_CHMAP_TFLC                      28\n#define MA_SND_CHMAP_TFRC                      29\n#define MA_SND_CHMAP_TSL                       30\n#define MA_SND_CHMAP_TSR                       31\n#define MA_SND_CHMAP_LLFE                      32\n#define MA_SND_CHMAP_RLFE                      33\n#define MA_SND_CHMAP_BC                        34\n#define MA_SND_CHMAP_BLC                       35\n#define MA_SND_CHMAP_BRC                       36\n\n/* Open mode flags. */\n#define MA_SND_PCM_NO_AUTO_RESAMPLE            0x00010000\n#define MA_SND_PCM_NO_AUTO_CHANNELS            0x00020000\n#define MA_SND_PCM_NO_AUTO_FORMAT              0x00040000\n#endif\n\ntypedef int                  (* ma_snd_pcm_open_proc)                          (ma_snd_pcm_t **pcm, const char *name, ma_snd_pcm_stream_t stream, int mode);\ntypedef int                  (* ma_snd_pcm_close_proc)                         (ma_snd_pcm_t *pcm);\ntypedef size_t               (* ma_snd_pcm_hw_params_sizeof_proc)              (void);\ntypedef int                  (* ma_snd_pcm_hw_params_any_proc)                 (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params);\ntypedef int                  (* ma_snd_pcm_hw_params_set_format_proc)          (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_t val);\ntypedef int                  (* ma_snd_pcm_hw_params_set_format_first_proc)    (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_t *format);\ntypedef void                 (* ma_snd_pcm_hw_params_get_format_mask_proc)     (ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_mask_t *mask);\ntypedef int                  (* ma_snd_pcm_hw_params_set_channels_proc)        (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val);\ntypedef int                  (* ma_snd_pcm_hw_params_set_channels_near_proc)   (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *val);\ntypedef int                  (* ma_snd_pcm_hw_params_set_channels_minmax_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *minimum, unsigned int *maximum);\ntypedef int                  (* ma_snd_pcm_hw_params_set_rate_resample_proc)   (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val);\ntypedef int                  (* ma_snd_pcm_hw_params_set_rate_proc)            (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val, int dir);\ntypedef int                  (* ma_snd_pcm_hw_params_set_rate_near_proc)       (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *val, int *dir);\ntypedef int                  (* ma_snd_pcm_hw_params_set_buffer_size_near_proc)(ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_uframes_t *val);\ntypedef int                  (* ma_snd_pcm_hw_params_set_periods_near_proc)    (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int *val, int *dir);\ntypedef int                  (* ma_snd_pcm_hw_params_set_access_proc)          (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_access_t _access);\ntypedef int                  (* ma_snd_pcm_hw_params_get_format_proc)          (const ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_t *format);\ntypedef int                  (* ma_snd_pcm_hw_params_get_channels_proc)        (const ma_snd_pcm_hw_params_t *params, unsigned int *val);\ntypedef int                  (* ma_snd_pcm_hw_params_get_channels_min_proc)    (const ma_snd_pcm_hw_params_t *params, unsigned int *val);\ntypedef int                  (* ma_snd_pcm_hw_params_get_channels_max_proc)    (const ma_snd_pcm_hw_params_t *params, unsigned int *val);\ntypedef int                  (* ma_snd_pcm_hw_params_get_rate_proc)            (const ma_snd_pcm_hw_params_t *params, unsigned int *rate, int *dir);\ntypedef int                  (* ma_snd_pcm_hw_params_get_rate_min_proc)        (const ma_snd_pcm_hw_params_t *params, unsigned int *rate, int *dir);\ntypedef int                  (* ma_snd_pcm_hw_params_get_rate_max_proc)        (const ma_snd_pcm_hw_params_t *params, unsigned int *rate, int *dir);\ntypedef int                  (* ma_snd_pcm_hw_params_get_buffer_size_proc)     (const ma_snd_pcm_hw_params_t *params, ma_snd_pcm_uframes_t *val);\ntypedef int                  (* ma_snd_pcm_hw_params_get_periods_proc)         (const ma_snd_pcm_hw_params_t *params, unsigned int *val, int *dir);\ntypedef int                  (* ma_snd_pcm_hw_params_get_access_proc)          (const ma_snd_pcm_hw_params_t *params, ma_snd_pcm_access_t *_access);\ntypedef int                  (* ma_snd_pcm_hw_params_test_format_proc)         (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, ma_snd_pcm_format_t val);\ntypedef int                  (* ma_snd_pcm_hw_params_test_channels_proc)       (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val);\ntypedef int                  (* ma_snd_pcm_hw_params_test_rate_proc)           (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params, unsigned int val, int dir);\ntypedef int                  (* ma_snd_pcm_hw_params_proc)                     (ma_snd_pcm_t *pcm, ma_snd_pcm_hw_params_t *params);\ntypedef size_t               (* ma_snd_pcm_sw_params_sizeof_proc)              (void);\ntypedef int                  (* ma_snd_pcm_sw_params_current_proc)             (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params);\ntypedef int                  (* ma_snd_pcm_sw_params_get_boundary_proc)        (const ma_snd_pcm_sw_params_t *params, ma_snd_pcm_uframes_t* val);\ntypedef int                  (* ma_snd_pcm_sw_params_set_avail_min_proc)       (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params, ma_snd_pcm_uframes_t val);\ntypedef int                  (* ma_snd_pcm_sw_params_set_start_threshold_proc) (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params, ma_snd_pcm_uframes_t val);\ntypedef int                  (* ma_snd_pcm_sw_params_set_stop_threshold_proc)  (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params, ma_snd_pcm_uframes_t val);\ntypedef int                  (* ma_snd_pcm_sw_params_proc)                     (ma_snd_pcm_t *pcm, ma_snd_pcm_sw_params_t *params);\ntypedef size_t               (* ma_snd_pcm_format_mask_sizeof_proc)            (void);\ntypedef int                  (* ma_snd_pcm_format_mask_test_proc)              (const ma_snd_pcm_format_mask_t *mask, ma_snd_pcm_format_t val);\ntypedef ma_snd_pcm_chmap_t * (* ma_snd_pcm_get_chmap_proc)                     (ma_snd_pcm_t *pcm);\ntypedef ma_snd_pcm_state_t   (* ma_snd_pcm_state_proc)                         (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_pcm_prepare_proc)                       (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_pcm_start_proc)                         (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_pcm_drop_proc)                          (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_pcm_drain_proc)                         (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_pcm_reset_proc)                         (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_device_name_hint_proc)                  (int card, const char *iface, void ***hints);\ntypedef char *               (* ma_snd_device_name_get_hint_proc)              (const void *hint, const char *id);\ntypedef int                  (* ma_snd_card_get_index_proc)                    (const char *name);\ntypedef int                  (* ma_snd_device_name_free_hint_proc)             (void **hints);\ntypedef int                  (* ma_snd_pcm_mmap_begin_proc)                    (ma_snd_pcm_t *pcm, const ma_snd_pcm_channel_area_t **areas, ma_snd_pcm_uframes_t *offset, ma_snd_pcm_uframes_t *frames);\ntypedef ma_snd_pcm_sframes_t (* ma_snd_pcm_mmap_commit_proc)                   (ma_snd_pcm_t *pcm, ma_snd_pcm_uframes_t offset, ma_snd_pcm_uframes_t frames);\ntypedef int                  (* ma_snd_pcm_recover_proc)                       (ma_snd_pcm_t *pcm, int err, int silent);\ntypedef ma_snd_pcm_sframes_t (* ma_snd_pcm_readi_proc)                         (ma_snd_pcm_t *pcm, void *buffer, ma_snd_pcm_uframes_t size);\ntypedef ma_snd_pcm_sframes_t (* ma_snd_pcm_writei_proc)                        (ma_snd_pcm_t *pcm, const void *buffer, ma_snd_pcm_uframes_t size);\ntypedef ma_snd_pcm_sframes_t (* ma_snd_pcm_avail_proc)                         (ma_snd_pcm_t *pcm);\ntypedef ma_snd_pcm_sframes_t (* ma_snd_pcm_avail_update_proc)                  (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_pcm_wait_proc)                          (ma_snd_pcm_t *pcm, int timeout);\ntypedef int                  (* ma_snd_pcm_nonblock_proc)                      (ma_snd_pcm_t *pcm, int nonblock);\ntypedef int                  (* ma_snd_pcm_info_proc)                          (ma_snd_pcm_t *pcm, ma_snd_pcm_info_t* info);\ntypedef size_t               (* ma_snd_pcm_info_sizeof_proc)                   (void);\ntypedef const char*          (* ma_snd_pcm_info_get_name_proc)                 (const ma_snd_pcm_info_t* info);\ntypedef int                  (* ma_snd_pcm_poll_descriptors_proc)              (ma_snd_pcm_t *pcm, struct pollfd *pfds, unsigned int space);\ntypedef int                  (* ma_snd_pcm_poll_descriptors_count_proc)        (ma_snd_pcm_t *pcm);\ntypedef int                  (* ma_snd_pcm_poll_descriptors_revents_proc)      (ma_snd_pcm_t *pcm, struct pollfd *pfds, unsigned int nfds, unsigned short *revents);\ntypedef int                  (* ma_snd_config_update_free_global_proc)         (void);\n\n/* This array specifies each of the common devices that can be used for both playback and capture. */\nstatic const char* g_maCommonDeviceNamesALSA[] = {\n    \"default\",\n    \"null\",\n    \"pulse\",\n    \"jack\"\n};\n\n/* This array allows us to blacklist specific playback devices. */\nstatic const char* g_maBlacklistedPlaybackDeviceNamesALSA[] = {\n    \"\"\n};\n\n/* This array allows us to blacklist specific capture devices. */\nstatic const char* g_maBlacklistedCaptureDeviceNamesALSA[] = {\n    \"\"\n};\n\n\nstatic ma_snd_pcm_format_t ma_convert_ma_format_to_alsa_format(ma_format format)\n{\n    ma_snd_pcm_format_t ALSAFormats[] = {\n        MA_SND_PCM_FORMAT_UNKNOWN,     /* ma_format_unknown */\n        MA_SND_PCM_FORMAT_U8,          /* ma_format_u8 */\n        MA_SND_PCM_FORMAT_S16_LE,      /* ma_format_s16 */\n        MA_SND_PCM_FORMAT_S24_3LE,     /* ma_format_s24 */\n        MA_SND_PCM_FORMAT_S32_LE,      /* ma_format_s32 */\n        MA_SND_PCM_FORMAT_FLOAT_LE     /* ma_format_f32 */\n    };\n\n    if (ma_is_big_endian()) {\n        ALSAFormats[0] = MA_SND_PCM_FORMAT_UNKNOWN;\n        ALSAFormats[1] = MA_SND_PCM_FORMAT_U8;\n        ALSAFormats[2] = MA_SND_PCM_FORMAT_S16_BE;\n        ALSAFormats[3] = MA_SND_PCM_FORMAT_S24_3BE;\n        ALSAFormats[4] = MA_SND_PCM_FORMAT_S32_BE;\n        ALSAFormats[5] = MA_SND_PCM_FORMAT_FLOAT_BE;\n    }\n\n    return ALSAFormats[format];\n}\n\nstatic ma_format ma_format_from_alsa(ma_snd_pcm_format_t formatALSA)\n{\n    if (ma_is_little_endian()) {\n        switch (formatALSA) {\n            case MA_SND_PCM_FORMAT_S16_LE:   return ma_format_s16;\n            case MA_SND_PCM_FORMAT_S24_3LE:  return ma_format_s24;\n            case MA_SND_PCM_FORMAT_S32_LE:   return ma_format_s32;\n            case MA_SND_PCM_FORMAT_FLOAT_LE: return ma_format_f32;\n            default: break;\n        }\n    } else {\n        switch (formatALSA) {\n            case MA_SND_PCM_FORMAT_S16_BE:   return ma_format_s16;\n            case MA_SND_PCM_FORMAT_S24_3BE:  return ma_format_s24;\n            case MA_SND_PCM_FORMAT_S32_BE:   return ma_format_s32;\n            case MA_SND_PCM_FORMAT_FLOAT_BE: return ma_format_f32;\n            default: break;\n        }\n    }\n\n    /* Endian agnostic. */\n    switch (formatALSA) {\n        case MA_SND_PCM_FORMAT_U8: return ma_format_u8;\n        default: return ma_format_unknown;\n    }\n}\n\nstatic ma_channel ma_convert_alsa_channel_position_to_ma_channel(unsigned int alsaChannelPos)\n{\n    switch (alsaChannelPos)\n    {\n        case MA_SND_CHMAP_MONO: return MA_CHANNEL_MONO;\n        case MA_SND_CHMAP_FL:   return MA_CHANNEL_FRONT_LEFT;\n        case MA_SND_CHMAP_FR:   return MA_CHANNEL_FRONT_RIGHT;\n        case MA_SND_CHMAP_RL:   return MA_CHANNEL_BACK_LEFT;\n        case MA_SND_CHMAP_RR:   return MA_CHANNEL_BACK_RIGHT;\n        case MA_SND_CHMAP_FC:   return MA_CHANNEL_FRONT_CENTER;\n        case MA_SND_CHMAP_LFE:  return MA_CHANNEL_LFE;\n        case MA_SND_CHMAP_SL:   return MA_CHANNEL_SIDE_LEFT;\n        case MA_SND_CHMAP_SR:   return MA_CHANNEL_SIDE_RIGHT;\n        case MA_SND_CHMAP_RC:   return MA_CHANNEL_BACK_CENTER;\n        case MA_SND_CHMAP_FLC:  return MA_CHANNEL_FRONT_LEFT_CENTER;\n        case MA_SND_CHMAP_FRC:  return MA_CHANNEL_FRONT_RIGHT_CENTER;\n        case MA_SND_CHMAP_RLC:  return 0;\n        case MA_SND_CHMAP_RRC:  return 0;\n        case MA_SND_CHMAP_FLW:  return 0;\n        case MA_SND_CHMAP_FRW:  return 0;\n        case MA_SND_CHMAP_FLH:  return 0;\n        case MA_SND_CHMAP_FCH:  return 0;\n        case MA_SND_CHMAP_FRH:  return 0;\n        case MA_SND_CHMAP_TC:   return MA_CHANNEL_TOP_CENTER;\n        case MA_SND_CHMAP_TFL:  return MA_CHANNEL_TOP_FRONT_LEFT;\n        case MA_SND_CHMAP_TFR:  return MA_CHANNEL_TOP_FRONT_RIGHT;\n        case MA_SND_CHMAP_TFC:  return MA_CHANNEL_TOP_FRONT_CENTER;\n        case MA_SND_CHMAP_TRL:  return MA_CHANNEL_TOP_BACK_LEFT;\n        case MA_SND_CHMAP_TRR:  return MA_CHANNEL_TOP_BACK_RIGHT;\n        case MA_SND_CHMAP_TRC:  return MA_CHANNEL_TOP_BACK_CENTER;\n        default: break;\n    }\n\n    return 0;\n}\n\nstatic ma_bool32 ma_is_common_device_name__alsa(const char* name)\n{\n    size_t iName;\n    for (iName = 0; iName < ma_countof(g_maCommonDeviceNamesALSA); ++iName) {\n        if (ma_strcmp(name, g_maCommonDeviceNamesALSA[iName]) == 0) {\n            return MA_TRUE;\n        }\n    }\n\n    return MA_FALSE;\n}\n\n\nstatic ma_bool32 ma_is_playback_device_blacklisted__alsa(const char* name)\n{\n    size_t iName;\n    for (iName = 0; iName < ma_countof(g_maBlacklistedPlaybackDeviceNamesALSA); ++iName) {\n        if (ma_strcmp(name, g_maBlacklistedPlaybackDeviceNamesALSA[iName]) == 0) {\n            return MA_TRUE;\n        }\n    }\n\n    return MA_FALSE;\n}\n\nstatic ma_bool32 ma_is_capture_device_blacklisted__alsa(const char* name)\n{\n    size_t iName;\n    for (iName = 0; iName < ma_countof(g_maBlacklistedCaptureDeviceNamesALSA); ++iName) {\n        if (ma_strcmp(name, g_maBlacklistedCaptureDeviceNamesALSA[iName]) == 0) {\n            return MA_TRUE;\n        }\n    }\n\n    return MA_FALSE;\n}\n\nstatic ma_bool32 ma_is_device_blacklisted__alsa(ma_device_type deviceType, const char* name)\n{\n    if (deviceType == ma_device_type_playback) {\n        return ma_is_playback_device_blacklisted__alsa(name);\n    } else {\n        return ma_is_capture_device_blacklisted__alsa(name);\n    }\n}\n\n\nstatic const char* ma_find_char(const char* str, char c, int* index)\n{\n    int i = 0;\n    for (;;) {\n        if (str[i] == '\\0') {\n            if (index) *index = -1;\n            return NULL;\n        }\n\n        if (str[i] == c) {\n            if (index) *index = i;\n            return str + i;\n        }\n\n        i += 1;\n    }\n\n    /* Should never get here, but treat it as though the character was not found to make me feel better inside. */\n    if (index) *index = -1;\n    return NULL;\n}\n\nstatic ma_bool32 ma_is_device_name_in_hw_format__alsa(const char* hwid)\n{\n    /* This function is just checking whether or not hwid is in \"hw:%d,%d\" format. */\n\n    int commaPos;\n    const char* dev;\n    int i;\n\n    if (hwid == NULL) {\n        return MA_FALSE;\n    }\n\n    if (hwid[0] != 'h' || hwid[1] != 'w' || hwid[2] != ':') {\n        return MA_FALSE;\n    }\n\n    hwid += 3;\n\n    dev = ma_find_char(hwid, ',', &commaPos);\n    if (dev == NULL) {\n        return MA_FALSE;\n    } else {\n        dev += 1;   /* Skip past the \",\". */\n    }\n\n    /* Check if the part between the \":\" and the \",\" contains only numbers. If not, return false. */\n    for (i = 0; i < commaPos; ++i) {\n        if (hwid[i] < '0' || hwid[i] > '9') {\n            return MA_FALSE;\n        }\n    }\n\n    /* Check if everything after the \",\" is numeric. If not, return false. */\n    i = 0;\n    while (dev[i] != '\\0') {\n        if (dev[i] < '0' || dev[i] > '9') {\n            return MA_FALSE;\n        }\n        i += 1;\n    }\n\n    return MA_TRUE;\n}\n\nstatic int ma_convert_device_name_to_hw_format__alsa(ma_context* pContext, char* dst, size_t dstSize, const char* src)  /* Returns 0 on success, non-0 on error. */\n{\n    /* src should look something like this: \"hw:CARD=I82801AAICH,DEV=0\" */\n\n    int colonPos;\n    int commaPos;\n    char card[256];\n    const char* dev;\n    int cardIndex;\n\n    if (dst == NULL) {\n        return -1;\n    }\n    if (dstSize < 7) {\n        return -1;     /* Absolute minimum size of the output buffer is 7 bytes. */\n    }\n\n    *dst = '\\0';    /* Safety. */\n    if (src == NULL) {\n        return -1;\n    }\n\n    /* If the input name is already in \"hw:%d,%d\" format, just return that verbatim. */\n    if (ma_is_device_name_in_hw_format__alsa(src)) {\n        return ma_strcpy_s(dst, dstSize, src);\n    }\n\n    src = ma_find_char(src, ':', &colonPos);\n    if (src == NULL) {\n        return -1;  /* Couldn't find a colon */\n    }\n\n    dev = ma_find_char(src, ',', &commaPos);\n    if (dev == NULL) {\n        dev = \"0\";\n        ma_strncpy_s(card, sizeof(card), src+6, (size_t)-1);   /* +6 = \":CARD=\" */\n    } else {\n        dev = dev + 5;  /* +5 = \",DEV=\" */\n        ma_strncpy_s(card, sizeof(card), src+6, commaPos-6);   /* +6 = \":CARD=\" */\n    }\n\n    cardIndex = ((ma_snd_card_get_index_proc)pContext->alsa.snd_card_get_index)(card);\n    if (cardIndex < 0) {\n        return -2;  /* Failed to retrieve the card index. */\n    }\n\n\n    /* Construction. */\n    dst[0] = 'h'; dst[1] = 'w'; dst[2] = ':';\n    if (ma_itoa_s(cardIndex, dst+3, dstSize-3, 10) != 0) {\n        return -3;\n    }\n    if (ma_strcat_s(dst, dstSize, \",\") != 0) {\n        return -3;\n    }\n    if (ma_strcat_s(dst, dstSize, dev) != 0) {\n        return -3;\n    }\n\n    return 0;\n}\n\nstatic ma_bool32 ma_does_id_exist_in_list__alsa(ma_device_id* pUniqueIDs, ma_uint32 count, const char* pHWID)\n{\n    ma_uint32 i;\n\n    MA_ASSERT(pHWID != NULL);\n\n    for (i = 0; i < count; ++i) {\n        if (ma_strcmp(pUniqueIDs[i].alsa, pHWID) == 0) {\n            return MA_TRUE;\n        }\n    }\n\n    return MA_FALSE;\n}\n\n\nstatic ma_result ma_context_open_pcm__alsa(ma_context* pContext, ma_share_mode shareMode, ma_device_type deviceType, const ma_device_id* pDeviceID, int openMode, ma_snd_pcm_t** ppPCM)\n{\n    ma_snd_pcm_t* pPCM;\n    ma_snd_pcm_stream_t stream;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(ppPCM != NULL);\n\n    *ppPCM = NULL;\n    pPCM = NULL;\n\n    stream = (deviceType == ma_device_type_playback) ? MA_SND_PCM_STREAM_PLAYBACK : MA_SND_PCM_STREAM_CAPTURE;\n\n    if (pDeviceID == NULL) {\n        ma_bool32 isDeviceOpen;\n        size_t i;\n\n        /*\n        We're opening the default device. I don't know if trying anything other than \"default\" is necessary, but it makes\n        me feel better to try as hard as we can get to get _something_ working.\n        */\n        const char* defaultDeviceNames[] = {\n            \"default\",\n            NULL,\n            NULL,\n            NULL,\n            NULL,\n            NULL,\n            NULL\n        };\n\n        if (shareMode == ma_share_mode_exclusive) {\n            defaultDeviceNames[1] = \"hw\";\n            defaultDeviceNames[2] = \"hw:0\";\n            defaultDeviceNames[3] = \"hw:0,0\";\n        } else {\n            if (deviceType == ma_device_type_playback) {\n                defaultDeviceNames[1] = \"dmix\";\n                defaultDeviceNames[2] = \"dmix:0\";\n                defaultDeviceNames[3] = \"dmix:0,0\";\n            } else {\n                defaultDeviceNames[1] = \"dsnoop\";\n                defaultDeviceNames[2] = \"dsnoop:0\";\n                defaultDeviceNames[3] = \"dsnoop:0,0\";\n            }\n            defaultDeviceNames[4] = \"hw\";\n            defaultDeviceNames[5] = \"hw:0\";\n            defaultDeviceNames[6] = \"hw:0,0\";\n        }\n\n        isDeviceOpen = MA_FALSE;\n        for (i = 0; i < ma_countof(defaultDeviceNames); ++i) {\n            if (defaultDeviceNames[i] != NULL && defaultDeviceNames[i][0] != '\\0') {\n                if (((ma_snd_pcm_open_proc)pContext->alsa.snd_pcm_open)(&pPCM, defaultDeviceNames[i], stream, openMode) == 0) {\n                    isDeviceOpen = MA_TRUE;\n                    break;\n                }\n            }\n        }\n\n        if (!isDeviceOpen) {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[ALSA] snd_pcm_open() failed when trying to open an appropriate default device.\");\n            return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n        }\n    } else {\n        /*\n        We're trying to open a specific device. There's a few things to consider here:\n\n        miniaudio recongnizes a special format of device id that excludes the \"hw\", \"dmix\", etc. prefix. It looks like this: \":0,0\", \":0,1\", etc. When\n        an ID of this format is specified, it indicates to miniaudio that it can try different combinations of plugins (\"hw\", \"dmix\", etc.) until it\n        finds an appropriate one that works. This comes in very handy when trying to open a device in shared mode (\"dmix\"), vs exclusive mode (\"hw\").\n        */\n\n        /* May end up needing to make small adjustments to the ID, so make a copy. */\n        ma_device_id deviceID = *pDeviceID;\n        int resultALSA = -ENODEV;\n\n        if (deviceID.alsa[0] != ':') {\n            /* The ID is not in \":0,0\" format. Use the ID exactly as-is. */\n            resultALSA = ((ma_snd_pcm_open_proc)pContext->alsa.snd_pcm_open)(&pPCM, deviceID.alsa, stream, openMode);\n        } else {\n            char hwid[256];\n\n            /* The ID is in \":0,0\" format. Try different plugins depending on the shared mode. */\n            if (deviceID.alsa[1] == '\\0') {\n                deviceID.alsa[0] = '\\0';  /* An ID of \":\" should be converted to \"\". */\n            }\n\n            if (shareMode == ma_share_mode_shared) {\n                if (deviceType == ma_device_type_playback) {\n                    ma_strcpy_s(hwid, sizeof(hwid), \"dmix\");\n                } else {\n                    ma_strcpy_s(hwid, sizeof(hwid), \"dsnoop\");\n                }\n\n                if (ma_strcat_s(hwid, sizeof(hwid), deviceID.alsa) == 0) {\n                    resultALSA = ((ma_snd_pcm_open_proc)pContext->alsa.snd_pcm_open)(&pPCM, hwid, stream, openMode);\n                }\n            }\n\n            /* If at this point we still don't have an open device it means we're either preferencing exclusive mode or opening with \"dmix\"/\"dsnoop\" failed. */\n            if (resultALSA != 0) {\n                ma_strcpy_s(hwid, sizeof(hwid), \"hw\");\n                if (ma_strcat_s(hwid, sizeof(hwid), deviceID.alsa) == 0) {\n                    resultALSA = ((ma_snd_pcm_open_proc)pContext->alsa.snd_pcm_open)(&pPCM, hwid, stream, openMode);\n                }\n            }\n        }\n\n        if (resultALSA < 0) {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[ALSA] snd_pcm_open() failed.\");\n            return ma_result_from_errno(-resultALSA);\n        }\n    }\n\n    *ppPCM = pPCM;\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_context_enumerate_devices__alsa(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    int resultALSA;\n    ma_bool32 cbResult = MA_TRUE;\n    char** ppDeviceHints;\n    ma_device_id* pUniqueIDs = NULL;\n    ma_uint32 uniqueIDCount = 0;\n    char** ppNextDeviceHint;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(callback != NULL);\n\n    ma_mutex_lock(&pContext->alsa.internalDeviceEnumLock);\n\n    resultALSA = ((ma_snd_device_name_hint_proc)pContext->alsa.snd_device_name_hint)(-1, \"pcm\", (void***)&ppDeviceHints);\n    if (resultALSA < 0) {\n        ma_mutex_unlock(&pContext->alsa.internalDeviceEnumLock);\n        return ma_result_from_errno(-resultALSA);\n    }\n\n    ppNextDeviceHint = ppDeviceHints;\n    while (*ppNextDeviceHint != NULL) {\n        char* NAME = ((ma_snd_device_name_get_hint_proc)pContext->alsa.snd_device_name_get_hint)(*ppNextDeviceHint, \"NAME\");\n        char* DESC = ((ma_snd_device_name_get_hint_proc)pContext->alsa.snd_device_name_get_hint)(*ppNextDeviceHint, \"DESC\");\n        char* IOID = ((ma_snd_device_name_get_hint_proc)pContext->alsa.snd_device_name_get_hint)(*ppNextDeviceHint, \"IOID\");\n        ma_device_type deviceType = ma_device_type_playback;\n        ma_bool32 stopEnumeration = MA_FALSE;\n        char hwid[sizeof(pUniqueIDs->alsa)];\n        ma_device_info deviceInfo;\n\n        if ((IOID == NULL || ma_strcmp(IOID, \"Output\") == 0)) {\n            deviceType = ma_device_type_playback;\n        }\n        if ((IOID != NULL && ma_strcmp(IOID, \"Input\" ) == 0)) {\n            deviceType = ma_device_type_capture;\n        }\n\n        if (NAME != NULL) {\n            if (pContext->alsa.useVerboseDeviceEnumeration) {\n                /* Verbose mode. Use the name exactly as-is. */\n                ma_strncpy_s(hwid, sizeof(hwid), NAME, (size_t)-1);\n            } else {\n                /* Simplified mode. Use \":%d,%d\" format. */\n                if (ma_convert_device_name_to_hw_format__alsa(pContext, hwid, sizeof(hwid), NAME) == 0) {\n                    /*\n                    At this point, hwid looks like \"hw:0,0\". In simplified enumeration mode, we actually want to strip off the\n                    plugin name so it looks like \":0,0\". The reason for this is that this special format is detected at device\n                    initialization time and is used as an indicator to try and use the most appropriate plugin depending on the\n                    device type and sharing mode.\n                    */\n                    char* dst = hwid;\n                    char* src = hwid+2;\n                    while ((*dst++ = *src++));\n                } else {\n                    /* Conversion to \"hw:%d,%d\" failed. Just use the name as-is. */\n                    ma_strncpy_s(hwid, sizeof(hwid), NAME, (size_t)-1);\n                }\n\n                if (ma_does_id_exist_in_list__alsa(pUniqueIDs, uniqueIDCount, hwid)) {\n                    goto next_device;   /* The device has already been enumerated. Move on to the next one. */\n                } else {\n                    /* The device has not yet been enumerated. Make sure it's added to our list so that it's not enumerated again. */\n                    size_t newCapacity = sizeof(*pUniqueIDs) * (uniqueIDCount + 1);\n                    ma_device_id* pNewUniqueIDs = (ma_device_id*)ma_realloc(pUniqueIDs, newCapacity, &pContext->allocationCallbacks);\n                    if (pNewUniqueIDs == NULL) {\n                        goto next_device;   /* Failed to allocate memory. */\n                    }\n\n                    pUniqueIDs = pNewUniqueIDs;\n                    MA_COPY_MEMORY(pUniqueIDs[uniqueIDCount].alsa, hwid, sizeof(hwid));\n                    uniqueIDCount += 1;\n                }\n            }\n        } else {\n            MA_ZERO_MEMORY(hwid, sizeof(hwid));\n        }\n\n        MA_ZERO_OBJECT(&deviceInfo);\n        ma_strncpy_s(deviceInfo.id.alsa, sizeof(deviceInfo.id.alsa), hwid, (size_t)-1);\n\n        /*\n        There's no good way to determine whether or not a device is the default on Linux. We're just going to do something simple and\n        just use the name of \"default\" as the indicator.\n        */\n        if (ma_strcmp(deviceInfo.id.alsa, \"default\") == 0) {\n            deviceInfo.isDefault = MA_TRUE;\n        }\n\n\n        /*\n        DESC is the friendly name. We treat this slightly differently depending on whether or not we are using verbose\n        device enumeration. In verbose mode we want to take the entire description so that the end-user can distinguish\n        between the subdevices of each card/dev pair. In simplified mode, however, we only want the first part of the\n        description.\n\n        The value in DESC seems to be split into two lines, with the first line being the name of the device and the\n        second line being a description of the device. I don't like having the description be across two lines because\n        it makes formatting ugly and annoying. I'm therefore deciding to put it all on a single line with the second line\n        being put into parentheses. In simplified mode I'm just stripping the second line entirely.\n        */\n        if (DESC != NULL) {\n            int lfPos;\n            const char* line2 = ma_find_char(DESC, '\\n', &lfPos);\n            if (line2 != NULL) {\n                line2 += 1; /* Skip past the new-line character. */\n\n                if (pContext->alsa.useVerboseDeviceEnumeration) {\n                    /* Verbose mode. Put the second line in brackets. */\n                    ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), DESC, lfPos);\n                    ma_strcat_s (deviceInfo.name, sizeof(deviceInfo.name), \" (\");\n                    ma_strcat_s (deviceInfo.name, sizeof(deviceInfo.name), line2);\n                    ma_strcat_s (deviceInfo.name, sizeof(deviceInfo.name), \")\");\n                } else {\n                    /* Simplified mode. Strip the second line entirely. */\n                    ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), DESC, lfPos);\n                }\n            } else {\n                /* There's no second line. Just copy the whole description. */\n                ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), DESC, (size_t)-1);\n            }\n        }\n\n        if (!ma_is_device_blacklisted__alsa(deviceType, NAME)) {\n            cbResult = callback(pContext, deviceType, &deviceInfo, pUserData);\n        }\n\n        /*\n        Some devices are both playback and capture, but they are only enumerated by ALSA once. We need to fire the callback\n        again for the other device type in this case. We do this for known devices and where the IOID hint is NULL, which\n        means both Input and Output.\n        */\n        if (cbResult) {\n            if (ma_is_common_device_name__alsa(NAME) || IOID == NULL) {\n                if (deviceType == ma_device_type_playback) {\n                    if (!ma_is_capture_device_blacklisted__alsa(NAME)) {\n                        cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n                    }\n                } else {\n                    if (!ma_is_playback_device_blacklisted__alsa(NAME)) {\n                        cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n                    }\n                }\n            }\n        }\n\n        if (cbResult == MA_FALSE) {\n            stopEnumeration = MA_TRUE;\n        }\n\n    next_device:\n        free(NAME);\n        free(DESC);\n        free(IOID);\n        ppNextDeviceHint += 1;\n\n        /* We need to stop enumeration if the callback returned false. */\n        if (stopEnumeration) {\n            break;\n        }\n    }\n\n    ma_free(pUniqueIDs, &pContext->allocationCallbacks);\n    ((ma_snd_device_name_free_hint_proc)pContext->alsa.snd_device_name_free_hint)((void**)ppDeviceHints);\n\n    ma_mutex_unlock(&pContext->alsa.internalDeviceEnumLock);\n\n    return MA_SUCCESS;\n}\n\n\ntypedef struct\n{\n    ma_device_type deviceType;\n    const ma_device_id* pDeviceID;\n    ma_share_mode shareMode;\n    ma_device_info* pDeviceInfo;\n    ma_bool32 foundDevice;\n} ma_context_get_device_info_enum_callback_data__alsa;\n\nstatic ma_bool32 ma_context_get_device_info_enum_callback__alsa(ma_context* pContext, ma_device_type deviceType, const ma_device_info* pDeviceInfo, void* pUserData)\n{\n    ma_context_get_device_info_enum_callback_data__alsa* pData = (ma_context_get_device_info_enum_callback_data__alsa*)pUserData;\n    MA_ASSERT(pData != NULL);\n\n    (void)pContext;\n\n    if (pData->pDeviceID == NULL && ma_strcmp(pDeviceInfo->id.alsa, \"default\") == 0) {\n        ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), pDeviceInfo->name, (size_t)-1);\n        pData->foundDevice = MA_TRUE;\n    } else {\n        if (pData->deviceType == deviceType && (pData->pDeviceID != NULL && ma_strcmp(pData->pDeviceID->alsa, pDeviceInfo->id.alsa) == 0)) {\n            ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), pDeviceInfo->name, (size_t)-1);\n            pData->foundDevice = MA_TRUE;\n        }\n    }\n\n    /* Keep enumerating until we have found the device. */\n    return !pData->foundDevice;\n}\n\nstatic void ma_context_test_rate_and_add_native_data_format__alsa(ma_context* pContext, ma_snd_pcm_t* pPCM, ma_snd_pcm_hw_params_t* pHWParams, ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 flags, ma_device_info* pDeviceInfo)\n{\n    MA_ASSERT(pPCM        != NULL);\n    MA_ASSERT(pHWParams   != NULL);\n    MA_ASSERT(pDeviceInfo != NULL);\n\n    if (pDeviceInfo->nativeDataFormatCount < ma_countof(pDeviceInfo->nativeDataFormats) && ((ma_snd_pcm_hw_params_test_rate_proc)pContext->alsa.snd_pcm_hw_params_test_rate)(pPCM, pHWParams, sampleRate, 0) == 0) {\n        pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format     = format;\n        pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels   = channels;\n        pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = sampleRate;\n        pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags      = flags;\n        pDeviceInfo->nativeDataFormatCount += 1;\n    }\n}\n\nstatic void ma_context_iterate_rates_and_add_native_data_format__alsa(ma_context* pContext, ma_snd_pcm_t* pPCM, ma_snd_pcm_hw_params_t* pHWParams, ma_format format, ma_uint32 channels, ma_uint32 flags, ma_device_info* pDeviceInfo)\n{\n    ma_uint32 iSampleRate;\n    unsigned int minSampleRate;\n    unsigned int maxSampleRate;\n    int sampleRateDir;  /* Not used. Just passed into snd_pcm_hw_params_get_rate_min/max(). */\n\n    /* There could be a range. */\n    ((ma_snd_pcm_hw_params_get_rate_min_proc)pContext->alsa.snd_pcm_hw_params_get_rate_min)(pHWParams, &minSampleRate, &sampleRateDir);\n    ((ma_snd_pcm_hw_params_get_rate_max_proc)pContext->alsa.snd_pcm_hw_params_get_rate_max)(pHWParams, &maxSampleRate, &sampleRateDir);\n\n    /* Make sure our sample rates are clamped to sane values. Stupid devices like \"pulse\" will reports rates like \"1\" which is ridiculus. */\n    minSampleRate = ma_clamp(minSampleRate, (unsigned int)ma_standard_sample_rate_min, (unsigned int)ma_standard_sample_rate_max);\n    maxSampleRate = ma_clamp(maxSampleRate, (unsigned int)ma_standard_sample_rate_min, (unsigned int)ma_standard_sample_rate_max);\n\n    for (iSampleRate = 0; iSampleRate < ma_countof(g_maStandardSampleRatePriorities); iSampleRate += 1) {\n        ma_uint32 standardSampleRate = g_maStandardSampleRatePriorities[iSampleRate];\n\n        if (standardSampleRate >= minSampleRate && standardSampleRate <= maxSampleRate) {\n            ma_context_test_rate_and_add_native_data_format__alsa(pContext, pPCM, pHWParams, format, channels, standardSampleRate, flags, pDeviceInfo);\n        }\n    }\n\n    /* Now make sure our min and max rates are included just in case they aren't in the range of our standard rates. */\n    if (!ma_is_standard_sample_rate(minSampleRate)) {\n        ma_context_test_rate_and_add_native_data_format__alsa(pContext, pPCM, pHWParams, format, channels, minSampleRate, flags, pDeviceInfo);\n    }\n\n    if (!ma_is_standard_sample_rate(maxSampleRate) && maxSampleRate != minSampleRate) {\n        ma_context_test_rate_and_add_native_data_format__alsa(pContext, pPCM, pHWParams, format, channels, maxSampleRate, flags, pDeviceInfo);\n    }\n}\n\nstatic ma_result ma_context_get_device_info__alsa(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    ma_context_get_device_info_enum_callback_data__alsa data;\n    ma_result result;\n    int resultALSA;\n    ma_snd_pcm_t* pPCM;\n    ma_snd_pcm_hw_params_t* pHWParams;\n    ma_uint32 iFormat;\n    ma_uint32 iChannel;\n\n    MA_ASSERT(pContext != NULL);\n\n    /* We just enumerate to find basic information about the device. */\n    data.deviceType  = deviceType;\n    data.pDeviceID   = pDeviceID;\n    data.pDeviceInfo = pDeviceInfo;\n    data.foundDevice = MA_FALSE;\n    result = ma_context_enumerate_devices__alsa(pContext, ma_context_get_device_info_enum_callback__alsa, &data);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (!data.foundDevice) {\n        return MA_NO_DEVICE;\n    }\n\n    if (ma_strcmp(pDeviceInfo->id.alsa, \"default\") == 0) {\n        pDeviceInfo->isDefault = MA_TRUE;\n    }\n\n    /* For detailed info we need to open the device. */\n    result = ma_context_open_pcm__alsa(pContext, ma_share_mode_shared, deviceType, pDeviceID, 0, &pPCM);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* We need to initialize a HW parameters object in order to know what formats are supported. */\n    pHWParams = (ma_snd_pcm_hw_params_t*)ma_calloc(((ma_snd_pcm_hw_params_sizeof_proc)pContext->alsa.snd_pcm_hw_params_sizeof)(), &pContext->allocationCallbacks);\n    if (pHWParams == NULL) {\n        ((ma_snd_pcm_close_proc)pContext->alsa.snd_pcm_close)(pPCM);\n        return MA_OUT_OF_MEMORY;\n    }\n\n    resultALSA = ((ma_snd_pcm_hw_params_any_proc)pContext->alsa.snd_pcm_hw_params_any)(pPCM, pHWParams);\n    if (resultALSA < 0) {\n        ma_free(pHWParams, &pContext->allocationCallbacks);\n        ((ma_snd_pcm_close_proc)pContext->alsa.snd_pcm_close)(pPCM);\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to initialize hardware parameters. snd_pcm_hw_params_any() failed.\");\n        return ma_result_from_errno(-resultALSA);\n    }\n\n    /*\n    Some ALSA devices can support many permutations of formats, channels and rates. We only support\n    a fixed number of permutations which means we need to employ some strategies to ensure the best\n    combinations are returned. An example is the \"pulse\" device which can do it's own data conversion\n    in software and as a result can support any combination of format, channels and rate.\n\n    We want to ensure the the first data formats are the best. We have a list of favored sample\n    formats and sample rates, so these will be the basis of our iteration.\n    */\n\n    /* Formats. We just iterate over our standard formats and test them, making sure we reset the configuration space each iteration. */\n    for (iFormat = 0; iFormat < ma_countof(g_maFormatPriorities); iFormat += 1) {\n        ma_format format = g_maFormatPriorities[iFormat];\n\n        /*\n        For each format we need to make sure we reset the configuration space so we don't return\n        channel counts and rates that aren't compatible with a format.\n        */\n        ((ma_snd_pcm_hw_params_any_proc)pContext->alsa.snd_pcm_hw_params_any)(pPCM, pHWParams);\n\n        /* Test the format first. If this fails it means the format is not supported and we can skip it. */\n        if (((ma_snd_pcm_hw_params_test_format_proc)pContext->alsa.snd_pcm_hw_params_test_format)(pPCM, pHWParams, ma_convert_ma_format_to_alsa_format(format)) == 0) {\n            /* The format is supported. */\n            unsigned int minChannels;\n            unsigned int maxChannels;\n\n            /*\n            The configuration space needs to be restricted to this format so we can get an accurate\n            picture of which sample rates and channel counts are support with this format.\n            */\n            ((ma_snd_pcm_hw_params_set_format_proc)pContext->alsa.snd_pcm_hw_params_set_format)(pPCM, pHWParams, ma_convert_ma_format_to_alsa_format(format));\n\n            /* Now we need to check for supported channels. */\n            ((ma_snd_pcm_hw_params_get_channels_min_proc)pContext->alsa.snd_pcm_hw_params_get_channels_min)(pHWParams, &minChannels);\n            ((ma_snd_pcm_hw_params_get_channels_max_proc)pContext->alsa.snd_pcm_hw_params_get_channels_max)(pHWParams, &maxChannels);\n\n            if (minChannels > MA_MAX_CHANNELS) {\n                continue;   /* Too many channels. */\n            }\n            if (maxChannels < MA_MIN_CHANNELS) {\n                continue;   /* Not enough channels. */\n            }\n\n            /*\n            Make sure the channel count is clamped. This is mainly intended for the max channels\n            because some devices can report an unbound maximum.\n            */\n            minChannels = ma_clamp(minChannels, MA_MIN_CHANNELS, MA_MAX_CHANNELS);\n            maxChannels = ma_clamp(maxChannels, MA_MIN_CHANNELS, MA_MAX_CHANNELS);\n\n            if (minChannels == MA_MIN_CHANNELS && maxChannels == MA_MAX_CHANNELS) {\n                /* The device supports all channels. Don't iterate over every single one. Instead just set the channels to 0 which means all channels are supported. */\n                ma_context_iterate_rates_and_add_native_data_format__alsa(pContext, pPCM, pHWParams, format, 0, 0, pDeviceInfo);    /* Intentionally setting the channel count to 0 as that means all channels are supported. */\n            } else {\n                /* The device only supports a specific set of channels. We need to iterate over all of them. */\n                for (iChannel = minChannels; iChannel <= maxChannels; iChannel += 1) {\n                    /* Test the channel before applying it to the configuration space. */\n                    unsigned int channels = iChannel;\n\n                    /* Make sure our channel range is reset before testing again or else we'll always fail the test. */\n                    ((ma_snd_pcm_hw_params_any_proc)pContext->alsa.snd_pcm_hw_params_any)(pPCM, pHWParams);\n                    ((ma_snd_pcm_hw_params_set_format_proc)pContext->alsa.snd_pcm_hw_params_set_format)(pPCM, pHWParams, ma_convert_ma_format_to_alsa_format(format));\n\n                    if (((ma_snd_pcm_hw_params_test_channels_proc)pContext->alsa.snd_pcm_hw_params_test_channels)(pPCM, pHWParams, channels) == 0) {\n                        /* The channel count is supported. */\n\n                        /* The configuration space now needs to be restricted to the channel count before extracting the sample rate. */\n                        ((ma_snd_pcm_hw_params_set_channels_proc)pContext->alsa.snd_pcm_hw_params_set_channels)(pPCM, pHWParams, channels);\n\n                        /* Only after the configuration space has been restricted to the specific channel count should we iterate over our sample rates. */\n                        ma_context_iterate_rates_and_add_native_data_format__alsa(pContext, pPCM, pHWParams, format, channels, 0, pDeviceInfo);\n                    } else {\n                        /* The channel count is not supported. Skip. */\n                    }\n                }\n            }\n        } else {\n            /* The format is not supported. Skip. */\n        }\n    }\n\n    ma_free(pHWParams, &pContext->allocationCallbacks);\n\n    ((ma_snd_pcm_close_proc)pContext->alsa.snd_pcm_close)(pPCM);\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_uninit__alsa(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if ((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture) {\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture);\n        close(pDevice->alsa.wakeupfdCapture);\n        ma_free(pDevice->alsa.pPollDescriptorsCapture, &pDevice->pContext->allocationCallbacks);\n    }\n\n    if ((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback) {\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback);\n        close(pDevice->alsa.wakeupfdPlayback);\n        ma_free(pDevice->alsa.pPollDescriptorsPlayback, &pDevice->pContext->allocationCallbacks);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_init_by_type__alsa(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptor, ma_device_type deviceType)\n{\n    ma_result result;\n    int resultALSA;\n    ma_snd_pcm_t* pPCM;\n    ma_bool32 isUsingMMap;\n    ma_snd_pcm_format_t formatALSA;\n    ma_format internalFormat;\n    ma_uint32 internalChannels;\n    ma_uint32 internalSampleRate;\n    ma_channel internalChannelMap[MA_MAX_CHANNELS];\n    ma_uint32 internalPeriodSizeInFrames;\n    ma_uint32 internalPeriods;\n    int openMode;\n    ma_snd_pcm_hw_params_t* pHWParams;\n    ma_snd_pcm_sw_params_t* pSWParams;\n    ma_snd_pcm_uframes_t bufferBoundary;\n    int pollDescriptorCount;\n    struct pollfd* pPollDescriptors;\n    int wakeupfd;\n\n    MA_ASSERT(pConfig != NULL);\n    MA_ASSERT(deviceType != ma_device_type_duplex); /* This function should only be called for playback _or_ capture, never duplex. */\n    MA_ASSERT(pDevice != NULL);\n\n    formatALSA = ma_convert_ma_format_to_alsa_format(pDescriptor->format);\n\n    openMode = 0;\n    if (pConfig->alsa.noAutoResample) {\n        openMode |= MA_SND_PCM_NO_AUTO_RESAMPLE;\n    }\n    if (pConfig->alsa.noAutoChannels) {\n        openMode |= MA_SND_PCM_NO_AUTO_CHANNELS;\n    }\n    if (pConfig->alsa.noAutoFormat) {\n        openMode |= MA_SND_PCM_NO_AUTO_FORMAT;\n    }\n\n    result = ma_context_open_pcm__alsa(pDevice->pContext, pDescriptor->shareMode, deviceType, pDescriptor->pDeviceID, openMode, &pPCM);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n\n    /* Hardware parameters. */\n    pHWParams = (ma_snd_pcm_hw_params_t*)ma_calloc(((ma_snd_pcm_hw_params_sizeof_proc)pDevice->pContext->alsa.snd_pcm_hw_params_sizeof)(), &pDevice->pContext->allocationCallbacks);\n    if (pHWParams == NULL) {\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to allocate memory for hardware parameters.\");\n        return MA_OUT_OF_MEMORY;\n    }\n\n    resultALSA = ((ma_snd_pcm_hw_params_any_proc)pDevice->pContext->alsa.snd_pcm_hw_params_any)(pPCM, pHWParams);\n    if (resultALSA < 0) {\n        ma_free(pHWParams, &pDevice->pContext->allocationCallbacks);\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to initialize hardware parameters. snd_pcm_hw_params_any() failed.\");\n        return ma_result_from_errno(-resultALSA);\n    }\n\n    /* MMAP Mode. Try using interleaved MMAP access. If this fails, fall back to standard readi/writei. */\n    isUsingMMap = MA_FALSE;\n#if 0   /* NOTE: MMAP mode temporarily disabled. */\n    if (deviceType != ma_device_type_capture) {    /* <-- Disabling MMAP mode for capture devices because I apparently do not have a device that supports it which means I can't test it... Contributions welcome. */\n        if (!pConfig->alsa.noMMap) {\n            if (((ma_snd_pcm_hw_params_set_access_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_access)(pPCM, pHWParams, MA_SND_PCM_ACCESS_MMAP_INTERLEAVED) == 0) {\n                pDevice->alsa.isUsingMMap = MA_TRUE;\n            }\n        }\n    }\n#endif\n\n    if (!isUsingMMap) {\n        resultALSA = ((ma_snd_pcm_hw_params_set_access_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_access)(pPCM, pHWParams, MA_SND_PCM_ACCESS_RW_INTERLEAVED);\n        if (resultALSA < 0) {\n            ma_free(pHWParams, &pDevice->pContext->allocationCallbacks);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set access mode to neither SND_PCM_ACCESS_MMAP_INTERLEAVED nor SND_PCM_ACCESS_RW_INTERLEAVED. snd_pcm_hw_params_set_access() failed.\");\n            return ma_result_from_errno(-resultALSA);\n        }\n    }\n\n    /*\n    Most important properties first. The documentation for OSS (yes, I know this is ALSA!) recommends format, channels, then sample rate. I can't\n    find any documentation for ALSA specifically, so I'm going to copy the recommendation for OSS.\n    */\n\n    /* Format. */\n    {\n        /*\n        At this point we should have a list of supported formats, so now we need to find the best one. We first check if the requested format is\n        supported, and if so, use that one. If it's not supported, we just run though a list of formats and try to find the best one.\n        */\n        if (formatALSA == MA_SND_PCM_FORMAT_UNKNOWN || ((ma_snd_pcm_hw_params_test_format_proc)pDevice->pContext->alsa.snd_pcm_hw_params_test_format)(pPCM, pHWParams, formatALSA) != 0) {\n            /* We're either requesting the native format or the specified format is not supported. */\n            size_t iFormat;\n\n            formatALSA = MA_SND_PCM_FORMAT_UNKNOWN;\n            for (iFormat = 0; iFormat < ma_countof(g_maFormatPriorities); ++iFormat) {\n                if (((ma_snd_pcm_hw_params_test_format_proc)pDevice->pContext->alsa.snd_pcm_hw_params_test_format)(pPCM, pHWParams, ma_convert_ma_format_to_alsa_format(g_maFormatPriorities[iFormat])) == 0) {\n                    formatALSA = ma_convert_ma_format_to_alsa_format(g_maFormatPriorities[iFormat]);\n                    break;\n                }\n            }\n\n            if (formatALSA == MA_SND_PCM_FORMAT_UNKNOWN) {\n                ma_free(pHWParams, &pDevice->pContext->allocationCallbacks);\n                ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Format not supported. The device does not support any miniaudio formats.\");\n                return MA_FORMAT_NOT_SUPPORTED;\n            }\n        }\n\n        resultALSA = ((ma_snd_pcm_hw_params_set_format_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_format)(pPCM, pHWParams, formatALSA);\n        if (resultALSA < 0) {\n            ma_free(pHWParams, &pDevice->pContext->allocationCallbacks);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Format not supported. snd_pcm_hw_params_set_format() failed.\");\n            return ma_result_from_errno(-resultALSA);\n        }\n\n        internalFormat = ma_format_from_alsa(formatALSA);\n        if (internalFormat == ma_format_unknown) {\n            ma_free(pHWParams, &pDevice->pContext->allocationCallbacks);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] The chosen format is not supported by miniaudio.\");\n            return MA_FORMAT_NOT_SUPPORTED;\n        }\n    }\n\n    /* Channels. */\n    {\n        unsigned int channels = pDescriptor->channels;\n        if (channels == 0) {\n            channels = MA_DEFAULT_CHANNELS;\n        }\n\n        resultALSA = ((ma_snd_pcm_hw_params_set_channels_near_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_channels_near)(pPCM, pHWParams, &channels);\n        if (resultALSA < 0) {\n            ma_free(pHWParams, &pDevice->pContext->allocationCallbacks);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set channel count. snd_pcm_hw_params_set_channels_near() failed.\");\n            return ma_result_from_errno(-resultALSA);\n        }\n\n        internalChannels = (ma_uint32)channels;\n    }\n\n    /* Sample Rate */\n    {\n        unsigned int sampleRate;\n\n        /*\n        It appears there's either a bug in ALSA, a bug in some drivers, or I'm doing something silly; but having resampling enabled causes\n        problems with some device configurations when used in conjunction with MMAP access mode. To fix this problem we need to disable\n        resampling.\n\n        To reproduce this problem, open the \"plug:dmix\" device, and set the sample rate to 44100. Internally, it looks like dmix uses a\n        sample rate of 48000. The hardware parameters will get set correctly with no errors, but it looks like the 44100 -> 48000 resampling\n        doesn't work properly - but only with MMAP access mode. You will notice skipping/crackling in the audio, and it'll run at a slightly\n        faster rate.\n\n        miniaudio has built-in support for sample rate conversion (albeit low quality at the moment), so disabling resampling should be fine\n        for us. The only problem is that it won't be taking advantage of any kind of hardware-accelerated resampling and it won't be very\n        good quality until I get a chance to improve the quality of miniaudio's software sample rate conversion.\n\n        I don't currently know if the dmix plugin is the only one with this error. Indeed, this is the only one I've been able to reproduce\n        this error with. In the future, we may want to restrict the disabling of resampling to only known bad plugins.\n        */\n        ((ma_snd_pcm_hw_params_set_rate_resample_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_rate_resample)(pPCM, pHWParams, 0);\n\n        sampleRate = pDescriptor->sampleRate;\n        if (sampleRate == 0) {\n            sampleRate = MA_DEFAULT_SAMPLE_RATE;\n        }\n\n        resultALSA = ((ma_snd_pcm_hw_params_set_rate_near_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_rate_near)(pPCM, pHWParams, &sampleRate, 0);\n        if (resultALSA < 0) {\n            ma_free(pHWParams, &pDevice->pContext->allocationCallbacks);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Sample rate not supported. snd_pcm_hw_params_set_rate_near() failed.\");\n            return ma_result_from_errno(-resultALSA);\n        }\n\n        internalSampleRate = (ma_uint32)sampleRate;\n    }\n\n    /* Periods. */\n    {\n        ma_uint32 periods = pDescriptor->periodCount;\n\n        resultALSA = ((ma_snd_pcm_hw_params_set_periods_near_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_periods_near)(pPCM, pHWParams, &periods, NULL);\n        if (resultALSA < 0) {\n            ma_free(pHWParams, &pDevice->pContext->allocationCallbacks);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set period count. snd_pcm_hw_params_set_periods_near() failed.\");\n            return ma_result_from_errno(-resultALSA);\n        }\n\n        internalPeriods = periods;\n    }\n\n    /* Buffer Size */\n    {\n        ma_snd_pcm_uframes_t actualBufferSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, internalSampleRate, pConfig->performanceProfile) * internalPeriods;\n\n        resultALSA = ((ma_snd_pcm_hw_params_set_buffer_size_near_proc)pDevice->pContext->alsa.snd_pcm_hw_params_set_buffer_size_near)(pPCM, pHWParams, &actualBufferSizeInFrames);\n        if (resultALSA < 0) {\n            ma_free(pHWParams, &pDevice->pContext->allocationCallbacks);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set buffer size for device. snd_pcm_hw_params_set_buffer_size() failed.\");\n            return ma_result_from_errno(-resultALSA);\n        }\n\n        internalPeriodSizeInFrames = actualBufferSizeInFrames / internalPeriods;\n    }\n\n    /* Apply hardware parameters. */\n    resultALSA = ((ma_snd_pcm_hw_params_proc)pDevice->pContext->alsa.snd_pcm_hw_params)(pPCM, pHWParams);\n    if (resultALSA < 0) {\n        ma_free(pHWParams, &pDevice->pContext->allocationCallbacks);\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set hardware parameters. snd_pcm_hw_params() failed.\");\n        return ma_result_from_errno(-resultALSA);\n    }\n\n    ma_free(pHWParams, &pDevice->pContext->allocationCallbacks);\n    pHWParams = NULL;\n\n\n    /* Software parameters. */\n    pSWParams = (ma_snd_pcm_sw_params_t*)ma_calloc(((ma_snd_pcm_sw_params_sizeof_proc)pDevice->pContext->alsa.snd_pcm_sw_params_sizeof)(), &pDevice->pContext->allocationCallbacks);\n    if (pSWParams == NULL) {\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to allocate memory for software parameters.\");\n        return MA_OUT_OF_MEMORY;\n    }\n\n    resultALSA = ((ma_snd_pcm_sw_params_current_proc)pDevice->pContext->alsa.snd_pcm_sw_params_current)(pPCM, pSWParams);\n    if (resultALSA < 0) {\n        ma_free(pSWParams, &pDevice->pContext->allocationCallbacks);\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to initialize software parameters. snd_pcm_sw_params_current() failed.\");\n        return ma_result_from_errno(-resultALSA);\n    }\n\n    resultALSA = ((ma_snd_pcm_sw_params_set_avail_min_proc)pDevice->pContext->alsa.snd_pcm_sw_params_set_avail_min)(pPCM, pSWParams, ma_prev_power_of_2(internalPeriodSizeInFrames));\n    if (resultALSA < 0) {\n        ma_free(pSWParams, &pDevice->pContext->allocationCallbacks);\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] snd_pcm_sw_params_set_avail_min() failed.\");\n        return ma_result_from_errno(-resultALSA);\n    }\n\n    resultALSA = ((ma_snd_pcm_sw_params_get_boundary_proc)pDevice->pContext->alsa.snd_pcm_sw_params_get_boundary)(pSWParams, &bufferBoundary);\n    if (resultALSA < 0) {\n        bufferBoundary = internalPeriodSizeInFrames * internalPeriods;\n    }\n\n    if (deviceType == ma_device_type_playback && !isUsingMMap) {   /* Only playback devices in writei/readi mode need a start threshold. */\n        /*\n        Subtle detail here with the start threshold. When in playback-only mode (no full-duplex) we can set the start threshold to\n        the size of a period. But for full-duplex we need to set it such that it is at least two periods.\n        */\n        resultALSA = ((ma_snd_pcm_sw_params_set_start_threshold_proc)pDevice->pContext->alsa.snd_pcm_sw_params_set_start_threshold)(pPCM, pSWParams, internalPeriodSizeInFrames*2);\n        if (resultALSA < 0) {\n            ma_free(pSWParams, &pDevice->pContext->allocationCallbacks);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set start threshold for playback device. snd_pcm_sw_params_set_start_threshold() failed.\");\n            return ma_result_from_errno(-resultALSA);\n        }\n\n        resultALSA = ((ma_snd_pcm_sw_params_set_stop_threshold_proc)pDevice->pContext->alsa.snd_pcm_sw_params_set_stop_threshold)(pPCM, pSWParams, bufferBoundary);\n        if (resultALSA < 0) { /* Set to boundary to loop instead of stop in the event of an xrun. */\n            ma_free(pSWParams, &pDevice->pContext->allocationCallbacks);\n            ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set stop threshold for playback device. snd_pcm_sw_params_set_stop_threshold() failed.\");\n            return ma_result_from_errno(-resultALSA);\n        }\n    }\n\n    resultALSA = ((ma_snd_pcm_sw_params_proc)pDevice->pContext->alsa.snd_pcm_sw_params)(pPCM, pSWParams);\n    if (resultALSA < 0) {\n        ma_free(pSWParams, &pDevice->pContext->allocationCallbacks);\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to set software parameters. snd_pcm_sw_params() failed.\");\n        return ma_result_from_errno(-resultALSA);\n    }\n\n    ma_free(pSWParams, &pDevice->pContext->allocationCallbacks);\n    pSWParams = NULL;\n\n\n    /* Grab the internal channel map. For now we're not going to bother trying to change the channel map and instead just do it ourselves. */\n    {\n        ma_snd_pcm_chmap_t* pChmap = NULL;\n        if (pDevice->pContext->alsa.snd_pcm_get_chmap != NULL) {\n            pChmap = ((ma_snd_pcm_get_chmap_proc)pDevice->pContext->alsa.snd_pcm_get_chmap)(pPCM);\n        }\n\n        if (pChmap != NULL) {\n            ma_uint32 iChannel;\n\n            /* There are cases where the returned channel map can have a different channel count than was returned by snd_pcm_hw_params_set_channels_near(). */\n            if (pChmap->channels >= internalChannels) {\n                /* Drop excess channels. */\n                for (iChannel = 0; iChannel < internalChannels; ++iChannel) {\n                    internalChannelMap[iChannel] = ma_convert_alsa_channel_position_to_ma_channel(pChmap->pos[iChannel]);\n                }\n            } else {\n                ma_uint32 i;\n\n                /*\n                Excess channels use defaults. Do an initial fill with defaults, overwrite the first pChmap->channels, validate to ensure there are no duplicate\n                channels. If validation fails, fall back to defaults.\n                */\n                ma_bool32 isValid = MA_TRUE;\n\n                /* Fill with defaults. */\n                ma_channel_map_init_standard(ma_standard_channel_map_alsa, internalChannelMap, ma_countof(internalChannelMap), internalChannels);\n\n                /* Overwrite first pChmap->channels channels. */\n                for (iChannel = 0; iChannel < pChmap->channels; ++iChannel) {\n                    internalChannelMap[iChannel] = ma_convert_alsa_channel_position_to_ma_channel(pChmap->pos[iChannel]);\n                }\n\n                /* Validate. */\n                for (i = 0; i < internalChannels && isValid; ++i) {\n                    ma_uint32 j;\n                    for (j = i+1; j < internalChannels; ++j) {\n                        if (internalChannelMap[i] == internalChannelMap[j]) {\n                            isValid = MA_FALSE;\n                            break;\n                        }\n                    }\n                }\n\n                /* If our channel map is invalid, fall back to defaults. */\n                if (!isValid) {\n                    ma_channel_map_init_standard(ma_standard_channel_map_alsa, internalChannelMap, ma_countof(internalChannelMap), internalChannels);\n                }\n            }\n\n            free(pChmap);\n            pChmap = NULL;\n        } else {\n            /* Could not retrieve the channel map. Fall back to a hard-coded assumption. */\n            ma_channel_map_init_standard(ma_standard_channel_map_alsa, internalChannelMap, ma_countof(internalChannelMap), internalChannels);\n        }\n    }\n\n\n    /*\n    We need to retrieve the poll descriptors so we can use poll() to wait for data to become\n    available for reading or writing. There's no well defined maximum for this so we're just going\n    to allocate this on the heap.\n    */\n    pollDescriptorCount = ((ma_snd_pcm_poll_descriptors_count_proc)pDevice->pContext->alsa.snd_pcm_poll_descriptors_count)(pPCM);\n    if (pollDescriptorCount <= 0) {\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to retrieve poll descriptors count.\");\n        return MA_ERROR;\n    }\n\n    pPollDescriptors = (struct pollfd*)ma_malloc(sizeof(*pPollDescriptors) * (pollDescriptorCount + 1), &pDevice->pContext->allocationCallbacks);   /* +1 because we want room for the wakeup descriptor. */\n    if (pPollDescriptors == NULL) {\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to allocate memory for poll descriptors.\");\n        return MA_OUT_OF_MEMORY;\n    }\n\n    /*\n    We need an eventfd to wakeup from poll() and avoid a deadlock in situations where the driver\n    never returns from writei() and readi(). This has been observed with the \"pulse\" device.\n    */\n    wakeupfd = eventfd(0, 0);\n    if (wakeupfd < 0) {\n        ma_free(pPollDescriptors, &pDevice->pContext->allocationCallbacks);\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to create eventfd for poll wakeup.\");\n        return ma_result_from_errno(errno);\n    }\n\n    /* We'll place the wakeup fd at the start of the buffer. */\n    pPollDescriptors[0].fd      = wakeupfd;\n    pPollDescriptors[0].events  = POLLIN;    /* We only care about waiting to read from the wakeup file descriptor. */\n    pPollDescriptors[0].revents = 0;\n\n    /* We can now extract the PCM poll descriptors which we place after the wakeup descriptor. */\n    pollDescriptorCount = ((ma_snd_pcm_poll_descriptors_proc)pDevice->pContext->alsa.snd_pcm_poll_descriptors)(pPCM, pPollDescriptors + 1, pollDescriptorCount);    /* +1 because we want to place these descriptors after the wakeup descriptor. */\n    if (pollDescriptorCount <= 0) {\n        close(wakeupfd);\n        ma_free(pPollDescriptors, &pDevice->pContext->allocationCallbacks);\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to retrieve poll descriptors.\");\n        return MA_ERROR;\n    }\n\n    if (deviceType == ma_device_type_capture) {\n        pDevice->alsa.pollDescriptorCountCapture = pollDescriptorCount;\n        pDevice->alsa.pPollDescriptorsCapture = pPollDescriptors;\n        pDevice->alsa.wakeupfdCapture = wakeupfd;\n    } else {\n        pDevice->alsa.pollDescriptorCountPlayback = pollDescriptorCount;\n        pDevice->alsa.pPollDescriptorsPlayback = pPollDescriptors;\n        pDevice->alsa.wakeupfdPlayback = wakeupfd;\n    }\n\n\n    /* We're done. Prepare the device. */\n    resultALSA = ((ma_snd_pcm_prepare_proc)pDevice->pContext->alsa.snd_pcm_prepare)(pPCM);\n    if (resultALSA < 0) {\n        close(wakeupfd);\n        ma_free(pPollDescriptors, &pDevice->pContext->allocationCallbacks);\n        ((ma_snd_pcm_close_proc)pDevice->pContext->alsa.snd_pcm_close)(pPCM);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to prepare device.\");\n        return ma_result_from_errno(-resultALSA);\n    }\n\n\n    if (deviceType == ma_device_type_capture) {\n        pDevice->alsa.pPCMCapture         = (ma_ptr)pPCM;\n        pDevice->alsa.isUsingMMapCapture  = isUsingMMap;\n    } else {\n        pDevice->alsa.pPCMPlayback        = (ma_ptr)pPCM;\n        pDevice->alsa.isUsingMMapPlayback = isUsingMMap;\n    }\n\n    pDescriptor->format             = internalFormat;\n    pDescriptor->channels           = internalChannels;\n    pDescriptor->sampleRate         = internalSampleRate;\n    ma_channel_map_copy(pDescriptor->channelMap, internalChannelMap, ma_min(internalChannels, MA_MAX_CHANNELS));\n    pDescriptor->periodSizeInFrames = internalPeriodSizeInFrames;\n    pDescriptor->periodCount        = internalPeriods;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_init__alsa(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    MA_ZERO_OBJECT(&pDevice->alsa);\n\n    if (pConfig->deviceType == ma_device_type_loopback) {\n        return MA_DEVICE_TYPE_NOT_SUPPORTED;\n    }\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_by_type__alsa(pDevice, pConfig, pDescriptorCapture, ma_device_type_capture);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_by_type__alsa(pDevice, pConfig, pDescriptorPlayback, ma_device_type_playback);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_start__alsa(ma_device* pDevice)\n{\n    int resultALSA;\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        resultALSA = ((ma_snd_pcm_start_proc)pDevice->pContext->alsa.snd_pcm_start)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture);\n        if (resultALSA < 0) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to start capture device.\");\n            return ma_result_from_errno(-resultALSA);\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        /* Don't need to do anything for playback because it'll be started automatically when enough data has been written. */\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop__alsa(ma_device* pDevice)\n{\n    /*\n    The stop callback will get called on the worker thread after read/write__alsa() has returned. At this point there is\n    a small chance that our wakeupfd has not been cleared. We'll clear that out now if applicable.\n    */\n    int resultPoll;\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[ALSA] Dropping capture device...\\n\");\n        ((ma_snd_pcm_drop_proc)pDevice->pContext->alsa.snd_pcm_drop)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture);\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[ALSA] Dropping capture device successful.\\n\");\n\n        /* We need to prepare the device again, otherwise we won't be able to restart the device. */\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[ALSA] Preparing capture device...\\n\");\n        if (((ma_snd_pcm_prepare_proc)pDevice->pContext->alsa.snd_pcm_prepare)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture) < 0) {\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[ALSA] Preparing capture device failed.\\n\");\n        } else {\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[ALSA] Preparing capture device successful.\\n\");\n        }\n\n    /* Clear the wakeupfd. */\n    resultPoll = poll((struct pollfd*)pDevice->alsa.pPollDescriptorsCapture, 1, 0);\n    if (resultPoll > 0) {\n        ma_uint64 t;\n        read(((struct pollfd*)pDevice->alsa.pPollDescriptorsCapture)[0].fd, &t, sizeof(t));\n    }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[ALSA] Dropping playback device...\\n\");\n        ((ma_snd_pcm_drop_proc)pDevice->pContext->alsa.snd_pcm_drop)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback);\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[ALSA] Dropping playback device successful.\\n\");\n\n        /* We need to prepare the device again, otherwise we won't be able to restart the device. */\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[ALSA] Preparing playback device...\\n\");\n        if (((ma_snd_pcm_prepare_proc)pDevice->pContext->alsa.snd_pcm_prepare)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback) < 0) {\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[ALSA] Preparing playback device failed.\\n\");\n        } else {\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[ALSA] Preparing playback device successful.\\n\");\n        }\n\n        /* Clear the wakeupfd. */\n    resultPoll = poll((struct pollfd*)pDevice->alsa.pPollDescriptorsPlayback, 1, 0);\n    if (resultPoll > 0) {\n        ma_uint64 t;\n        read(((struct pollfd*)pDevice->alsa.pPollDescriptorsPlayback)[0].fd, &t, sizeof(t));\n    }\n\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_wait__alsa(ma_device* pDevice, ma_snd_pcm_t* pPCM, struct pollfd* pPollDescriptors, int pollDescriptorCount, short requiredEvent)\n{\n    for (;;) {\n        unsigned short revents;\n        int resultALSA;\n        int resultPoll = poll(pPollDescriptors, pollDescriptorCount, -1);\n        if (resultPoll < 0) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] poll() failed.\\n\");\n            return ma_result_from_errno(errno);\n        }\n\n        /*\n        Before checking the ALSA poll descriptor flag we need to check if the wakeup descriptor\n        has had it's POLLIN flag set. If so, we need to actually read the data and then exit\n        function. The wakeup descriptor will be the first item in the descriptors buffer.\n        */\n        if ((pPollDescriptors[0].revents & POLLIN) != 0) {\n            ma_uint64 t;\n            int resultRead = read(pPollDescriptors[0].fd, &t, sizeof(t));    /* <-- Important that we read here so that the next write() does not block. */\n            if (resultRead < 0) {\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] read() failed.\\n\");\n                return ma_result_from_errno(errno);\n            }\n\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[ALSA] POLLIN set for wakeupfd\\n\");\n            return MA_DEVICE_NOT_STARTED;\n        }\n\n        /*\n        Getting here means that some data should be able to be read. We need to use ALSA to\n        translate the revents flags for us.\n        */\n        resultALSA = ((ma_snd_pcm_poll_descriptors_revents_proc)pDevice->pContext->alsa.snd_pcm_poll_descriptors_revents)(pPCM, pPollDescriptors + 1, pollDescriptorCount - 1, &revents);   /* +1, -1 to ignore the wakeup descriptor. */\n        if (resultALSA < 0) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] snd_pcm_poll_descriptors_revents() failed.\\n\");\n            return ma_result_from_errno(-resultALSA);\n        }\n\n        if ((revents & POLLERR) != 0) {\n            ma_snd_pcm_state_t state = ((ma_snd_pcm_state_proc)pDevice->pContext->alsa.snd_pcm_state)(pPCM);\n            if (state == MA_SND_PCM_STATE_XRUN) {\n                /* The PCM is in a xrun state. This will be recovered from at a higher level. We can disregard this. */\n        } else {\n                ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_WARNING, \"[ALSA] POLLERR detected. status = %d\\n\", ((ma_snd_pcm_state_proc)pDevice->pContext->alsa.snd_pcm_state)(pPCM));\n            }\n        }\n\n        if ((revents & requiredEvent) == requiredEvent) {\n            break;  /* We're done. Data available for reading or writing. */\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_wait_read__alsa(ma_device* pDevice)\n{\n    return ma_device_wait__alsa(pDevice, (ma_snd_pcm_t*)pDevice->alsa.pPCMCapture, (struct pollfd*)pDevice->alsa.pPollDescriptorsCapture, pDevice->alsa.pollDescriptorCountCapture + 1, POLLIN); /* +1 to account for the wakeup descriptor. */\n}\n\nstatic ma_result ma_device_wait_write__alsa(ma_device* pDevice)\n{\n    return ma_device_wait__alsa(pDevice, (ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback, (struct pollfd*)pDevice->alsa.pPollDescriptorsPlayback, pDevice->alsa.pollDescriptorCountPlayback + 1, POLLOUT); /* +1 to account for the wakeup descriptor. */\n}\n\nstatic ma_result ma_device_read__alsa(ma_device* pDevice, void* pFramesOut, ma_uint32 frameCount, ma_uint32* pFramesRead)\n{\n    ma_snd_pcm_sframes_t resultALSA = 0;\n\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(pFramesOut != NULL);\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    while (ma_device_get_state(pDevice) == ma_device_state_started) {\n        ma_result result;\n\n        /* The first thing to do is wait for data to become available for reading. This will return an error code if the device has been stopped. */\n        result = ma_device_wait_read__alsa(pDevice);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        /* Getting here means we should have data available. */\n        resultALSA = ((ma_snd_pcm_readi_proc)pDevice->pContext->alsa.snd_pcm_readi)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture, pFramesOut, frameCount);\n        if (resultALSA >= 0) {\n            break;  /* Success. */\n        } else {\n            if (resultALSA == -EAGAIN) {\n                /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"EGAIN (read)\\n\");*/\n                continue;   /* Try again. */\n            } else if (resultALSA == -EPIPE) {\n                ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"EPIPE (read)\\n\");\n\n                /* Overrun. Recover and try again. If this fails we need to return an error. */\n                resultALSA = ((ma_snd_pcm_recover_proc)pDevice->pContext->alsa.snd_pcm_recover)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture, resultALSA, MA_TRUE);\n                if (resultALSA < 0) {\n                    ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to recover device after overrun.\");\n                    return ma_result_from_errno((int)-resultALSA);\n                }\n\n                resultALSA = ((ma_snd_pcm_start_proc)pDevice->pContext->alsa.snd_pcm_start)((ma_snd_pcm_t*)pDevice->alsa.pPCMCapture);\n                if (resultALSA < 0) {\n                    ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to start device after underrun.\");\n                    return ma_result_from_errno((int)-resultALSA);\n                }\n\n                continue;   /* Try reading again. */\n            }\n        }\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = resultALSA;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_write__alsa(ma_device* pDevice, const void* pFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten)\n{\n    ma_snd_pcm_sframes_t resultALSA = 0;\n\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(pFrames != NULL);\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = 0;\n    }\n\n    while (ma_device_get_state(pDevice) == ma_device_state_started) {\n        ma_result result;\n\n        /* The first thing to do is wait for space to become available for writing. This will return an error code if the device has been stopped. */\n        result = ma_device_wait_write__alsa(pDevice);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        resultALSA = ((ma_snd_pcm_writei_proc)pDevice->pContext->alsa.snd_pcm_writei)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback, pFrames, frameCount);\n        if (resultALSA >= 0) {\n            break;  /* Success. */\n        } else {\n            if (resultALSA == -EAGAIN) {\n                /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"EGAIN (write)\\n\");*/\n                continue;   /* Try again. */\n            } else if (resultALSA == -EPIPE) {\n                ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"EPIPE (write)\\n\");\n\n                /* Underrun. Recover and try again. If this fails we need to return an error. */\n                resultALSA = ((ma_snd_pcm_recover_proc)pDevice->pContext->alsa.snd_pcm_recover)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback, resultALSA, MA_TRUE);    /* MA_TRUE=silent (don't print anything on error). */\n                if (resultALSA < 0) {\n                    ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to recover device after underrun.\");\n                    return ma_result_from_errno((int)-resultALSA);\n                }\n\n                /*\n                In my testing I have had a situation where writei() does not automatically restart the device even though I've set it\n                up as such in the software parameters. What will happen is writei() will block indefinitely even though the number of\n                frames is well beyond the auto-start threshold. To work around this I've needed to add an explicit start here. Not sure\n                if this is me just being stupid and not recovering the device properly, but this definitely feels like something isn't\n                quite right here.\n                */\n                resultALSA = ((ma_snd_pcm_start_proc)pDevice->pContext->alsa.snd_pcm_start)((ma_snd_pcm_t*)pDevice->alsa.pPCMPlayback);\n                if (resultALSA < 0) {\n                    ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] Failed to start device after underrun.\");\n                    return ma_result_from_errno((int)-resultALSA);\n                }\n\n                continue;   /* Try writing again. */\n            }\n        }\n    }\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = resultALSA;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_data_loop_wakeup__alsa(ma_device* pDevice)\n{\n    ma_uint64 t = 1;\n    int resultWrite = 0;\n\n    MA_ASSERT(pDevice != NULL);\n\n    ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[ALSA] Waking up...\\n\");\n\n    /* Write to an eventfd to trigger a wakeup from poll() and abort any reading or writing. */\n    if (pDevice->alsa.pPollDescriptorsCapture != NULL) {\n        resultWrite = write(pDevice->alsa.wakeupfdCapture, &t, sizeof(t));\n    }\n    if (pDevice->alsa.pPollDescriptorsPlayback != NULL) {\n        resultWrite = write(pDevice->alsa.wakeupfdPlayback, &t, sizeof(t));\n    }\n\n    if (resultWrite < 0) {\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[ALSA] write() failed.\\n\");\n        return ma_result_from_errno(errno);\n    }\n\n    ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[ALSA] Waking up completed successfully.\\n\");\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_uninit__alsa(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_alsa);\n\n    /* Clean up memory for memory leak checkers. */\n    ((ma_snd_config_update_free_global_proc)pContext->alsa.snd_config_update_free_global)();\n\n#ifndef MA_NO_RUNTIME_LINKING\n    ma_dlclose(ma_context_get_log(pContext), pContext->alsa.asoundSO);\n#endif\n\n    ma_mutex_uninit(&pContext->alsa.internalDeviceEnumLock);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init__alsa(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n    ma_result result;\n#ifndef MA_NO_RUNTIME_LINKING\n    const char* libasoundNames[] = {\n        \"libasound.so.2\",\n        \"libasound.so\"\n    };\n    size_t i;\n\n    for (i = 0; i < ma_countof(libasoundNames); ++i) {\n        pContext->alsa.asoundSO = ma_dlopen(ma_context_get_log(pContext), libasoundNames[i]);\n        if (pContext->alsa.asoundSO != NULL) {\n            break;\n        }\n    }\n\n    if (pContext->alsa.asoundSO == NULL) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"[ALSA] Failed to open shared object.\\n\");\n        return MA_NO_BACKEND;\n    }\n\n    pContext->alsa.snd_pcm_open                           = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_open\");\n    pContext->alsa.snd_pcm_close                          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_close\");\n    pContext->alsa.snd_pcm_hw_params_sizeof               = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_sizeof\");\n    pContext->alsa.snd_pcm_hw_params_any                  = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_any\");\n    pContext->alsa.snd_pcm_hw_params_set_format           = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_format\");\n    pContext->alsa.snd_pcm_hw_params_set_format_first     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_format_first\");\n    pContext->alsa.snd_pcm_hw_params_get_format_mask      = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_format_mask\");\n    pContext->alsa.snd_pcm_hw_params_set_channels         = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_channels\");\n    pContext->alsa.snd_pcm_hw_params_set_channels_near    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_channels_near\");\n    pContext->alsa.snd_pcm_hw_params_set_channels_minmax  = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_channels_minmax\");\n    pContext->alsa.snd_pcm_hw_params_set_rate_resample    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_rate_resample\");\n    pContext->alsa.snd_pcm_hw_params_set_rate             = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_rate\");\n    pContext->alsa.snd_pcm_hw_params_set_rate_near        = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_rate_near\");\n    pContext->alsa.snd_pcm_hw_params_set_buffer_size_near = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_buffer_size_near\");\n    pContext->alsa.snd_pcm_hw_params_set_periods_near     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_periods_near\");\n    pContext->alsa.snd_pcm_hw_params_set_access           = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_set_access\");\n    pContext->alsa.snd_pcm_hw_params_get_format           = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_format\");\n    pContext->alsa.snd_pcm_hw_params_get_channels         = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_channels\");\n    pContext->alsa.snd_pcm_hw_params_get_channels_min     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_channels_min\");\n    pContext->alsa.snd_pcm_hw_params_get_channels_max     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_channels_max\");\n    pContext->alsa.snd_pcm_hw_params_get_rate             = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_rate\");\n    pContext->alsa.snd_pcm_hw_params_get_rate_min         = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_rate_min\");\n    pContext->alsa.snd_pcm_hw_params_get_rate_max         = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_rate_max\");\n    pContext->alsa.snd_pcm_hw_params_get_buffer_size      = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_buffer_size\");\n    pContext->alsa.snd_pcm_hw_params_get_periods          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_periods\");\n    pContext->alsa.snd_pcm_hw_params_get_access           = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_get_access\");\n    pContext->alsa.snd_pcm_hw_params_test_format          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_test_format\");\n    pContext->alsa.snd_pcm_hw_params_test_channels        = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_test_channels\");\n    pContext->alsa.snd_pcm_hw_params_test_rate            = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params_test_rate\");\n    pContext->alsa.snd_pcm_hw_params                      = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_hw_params\");\n    pContext->alsa.snd_pcm_sw_params_sizeof               = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_sw_params_sizeof\");\n    pContext->alsa.snd_pcm_sw_params_current              = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_sw_params_current\");\n    pContext->alsa.snd_pcm_sw_params_get_boundary         = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_sw_params_get_boundary\");\n    pContext->alsa.snd_pcm_sw_params_set_avail_min        = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_sw_params_set_avail_min\");\n    pContext->alsa.snd_pcm_sw_params_set_start_threshold  = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_sw_params_set_start_threshold\");\n    pContext->alsa.snd_pcm_sw_params_set_stop_threshold   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_sw_params_set_stop_threshold\");\n    pContext->alsa.snd_pcm_sw_params                      = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_sw_params\");\n    pContext->alsa.snd_pcm_format_mask_sizeof             = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_format_mask_sizeof\");\n    pContext->alsa.snd_pcm_format_mask_test               = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_format_mask_test\");\n    pContext->alsa.snd_pcm_get_chmap                      = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_get_chmap\");\n    pContext->alsa.snd_pcm_state                          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_state\");\n    pContext->alsa.snd_pcm_prepare                        = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_prepare\");\n    pContext->alsa.snd_pcm_start                          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_start\");\n    pContext->alsa.snd_pcm_drop                           = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_drop\");\n    pContext->alsa.snd_pcm_drain                          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_drain\");\n    pContext->alsa.snd_pcm_reset                          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_reset\");\n    pContext->alsa.snd_device_name_hint                   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_device_name_hint\");\n    pContext->alsa.snd_device_name_get_hint               = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_device_name_get_hint\");\n    pContext->alsa.snd_card_get_index                     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_card_get_index\");\n    pContext->alsa.snd_device_name_free_hint              = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_device_name_free_hint\");\n    pContext->alsa.snd_pcm_mmap_begin                     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_mmap_begin\");\n    pContext->alsa.snd_pcm_mmap_commit                    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_mmap_commit\");\n    pContext->alsa.snd_pcm_recover                        = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_recover\");\n    pContext->alsa.snd_pcm_readi                          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_readi\");\n    pContext->alsa.snd_pcm_writei                         = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_writei\");\n    pContext->alsa.snd_pcm_avail                          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_avail\");\n    pContext->alsa.snd_pcm_avail_update                   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_avail_update\");\n    pContext->alsa.snd_pcm_wait                           = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_wait\");\n    pContext->alsa.snd_pcm_nonblock                       = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_nonblock\");\n    pContext->alsa.snd_pcm_info                           = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_info\");\n    pContext->alsa.snd_pcm_info_sizeof                    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_info_sizeof\");\n    pContext->alsa.snd_pcm_info_get_name                  = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_info_get_name\");\n    pContext->alsa.snd_pcm_poll_descriptors               = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_poll_descriptors\");\n    pContext->alsa.snd_pcm_poll_descriptors_count         = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_poll_descriptors_count\");\n    pContext->alsa.snd_pcm_poll_descriptors_revents       = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_pcm_poll_descriptors_revents\");\n    pContext->alsa.snd_config_update_free_global          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->alsa.asoundSO, \"snd_config_update_free_global\");\n#else\n    /* The system below is just for type safety. */\n    ma_snd_pcm_open_proc                           _snd_pcm_open                           = snd_pcm_open;\n    ma_snd_pcm_close_proc                          _snd_pcm_close                          = snd_pcm_close;\n    ma_snd_pcm_hw_params_sizeof_proc               _snd_pcm_hw_params_sizeof               = snd_pcm_hw_params_sizeof;\n    ma_snd_pcm_hw_params_any_proc                  _snd_pcm_hw_params_any                  = snd_pcm_hw_params_any;\n    ma_snd_pcm_hw_params_set_format_proc           _snd_pcm_hw_params_set_format           = snd_pcm_hw_params_set_format;\n    ma_snd_pcm_hw_params_set_format_first_proc     _snd_pcm_hw_params_set_format_first     = snd_pcm_hw_params_set_format_first;\n    ma_snd_pcm_hw_params_get_format_mask_proc      _snd_pcm_hw_params_get_format_mask      = snd_pcm_hw_params_get_format_mask;\n    ma_snd_pcm_hw_params_set_channels_proc         _snd_pcm_hw_params_set_channels         = snd_pcm_hw_params_set_channels;\n    ma_snd_pcm_hw_params_set_channels_near_proc    _snd_pcm_hw_params_set_channels_near    = snd_pcm_hw_params_set_channels_near;\n    ma_snd_pcm_hw_params_set_rate_resample_proc    _snd_pcm_hw_params_set_rate_resample    = snd_pcm_hw_params_set_rate_resample;\n    ma_snd_pcm_hw_params_set_rate_near             _snd_pcm_hw_params_set_rate             = snd_pcm_hw_params_set_rate;\n    ma_snd_pcm_hw_params_set_rate_near_proc        _snd_pcm_hw_params_set_rate_near        = snd_pcm_hw_params_set_rate_near;\n    ma_snd_pcm_hw_params_set_rate_minmax_proc      _snd_pcm_hw_params_set_rate_minmax      = snd_pcm_hw_params_set_rate_minmax;\n    ma_snd_pcm_hw_params_set_buffer_size_near_proc _snd_pcm_hw_params_set_buffer_size_near = snd_pcm_hw_params_set_buffer_size_near;\n    ma_snd_pcm_hw_params_set_periods_near_proc     _snd_pcm_hw_params_set_periods_near     = snd_pcm_hw_params_set_periods_near;\n    ma_snd_pcm_hw_params_set_access_proc           _snd_pcm_hw_params_set_access           = snd_pcm_hw_params_set_access;\n    ma_snd_pcm_hw_params_get_format_proc           _snd_pcm_hw_params_get_format           = snd_pcm_hw_params_get_format;\n    ma_snd_pcm_hw_params_get_channels_proc         _snd_pcm_hw_params_get_channels         = snd_pcm_hw_params_get_channels;\n    ma_snd_pcm_hw_params_get_channels_min_proc     _snd_pcm_hw_params_get_channels_min     = snd_pcm_hw_params_get_channels_min;\n    ma_snd_pcm_hw_params_get_channels_max_proc     _snd_pcm_hw_params_get_channels_max     = snd_pcm_hw_params_get_channels_max;\n    ma_snd_pcm_hw_params_get_rate_proc             _snd_pcm_hw_params_get_rate             = snd_pcm_hw_params_get_rate;\n    ma_snd_pcm_hw_params_get_rate_min_proc         _snd_pcm_hw_params_get_rate_min         = snd_pcm_hw_params_get_rate_min;\n    ma_snd_pcm_hw_params_get_rate_max_proc         _snd_pcm_hw_params_get_rate_max         = snd_pcm_hw_params_get_rate_max;\n    ma_snd_pcm_hw_params_get_buffer_size_proc      _snd_pcm_hw_params_get_buffer_size      = snd_pcm_hw_params_get_buffer_size;\n    ma_snd_pcm_hw_params_get_periods_proc          _snd_pcm_hw_params_get_periods          = snd_pcm_hw_params_get_periods;\n    ma_snd_pcm_hw_params_get_access_proc           _snd_pcm_hw_params_get_access           = snd_pcm_hw_params_get_access;\n    ma_snd_pcm_hw_params_test_format_proc          _snd_pcm_hw_params_test_format          = snd_pcm_hw_params_test_format;\n    ma_snd_pcm_hw_params_test_channels_proc        _snd_pcm_hw_params_test_channels        = snd_pcm_hw_params_test_channels;\n    ma_snd_pcm_hw_params_test_rate_proc            _snd_pcm_hw_params_test_rate            = snd_pcm_hw_params_test_rate;\n    ma_snd_pcm_hw_params_proc                      _snd_pcm_hw_params                      = snd_pcm_hw_params;\n    ma_snd_pcm_sw_params_sizeof_proc               _snd_pcm_sw_params_sizeof               = snd_pcm_sw_params_sizeof;\n    ma_snd_pcm_sw_params_current_proc              _snd_pcm_sw_params_current              = snd_pcm_sw_params_current;\n    ma_snd_pcm_sw_params_get_boundary_proc         _snd_pcm_sw_params_get_boundary         = snd_pcm_sw_params_get_boundary;\n    ma_snd_pcm_sw_params_set_avail_min_proc        _snd_pcm_sw_params_set_avail_min        = snd_pcm_sw_params_set_avail_min;\n    ma_snd_pcm_sw_params_set_start_threshold_proc  _snd_pcm_sw_params_set_start_threshold  = snd_pcm_sw_params_set_start_threshold;\n    ma_snd_pcm_sw_params_set_stop_threshold_proc   _snd_pcm_sw_params_set_stop_threshold   = snd_pcm_sw_params_set_stop_threshold;\n    ma_snd_pcm_sw_params_proc                      _snd_pcm_sw_params                      = snd_pcm_sw_params;\n    ma_snd_pcm_format_mask_sizeof_proc             _snd_pcm_format_mask_sizeof             = snd_pcm_format_mask_sizeof;\n    ma_snd_pcm_format_mask_test_proc               _snd_pcm_format_mask_test               = snd_pcm_format_mask_test;\n    ma_snd_pcm_get_chmap_proc                      _snd_pcm_get_chmap                      = snd_pcm_get_chmap;\n    ma_snd_pcm_state_proc                          _snd_pcm_state                          = snd_pcm_state;\n    ma_snd_pcm_prepare_proc                        _snd_pcm_prepare                        = snd_pcm_prepare;\n    ma_snd_pcm_start_proc                          _snd_pcm_start                          = snd_pcm_start;\n    ma_snd_pcm_drop_proc                           _snd_pcm_drop                           = snd_pcm_drop;\n    ma_snd_pcm_drain_proc                          _snd_pcm_drain                          = snd_pcm_drain;\n    ma_snd_pcm_reset_proc                          _snd_pcm_reset                          = snd_pcm_reset;\n    ma_snd_device_name_hint_proc                   _snd_device_name_hint                   = snd_device_name_hint;\n    ma_snd_device_name_get_hint_proc               _snd_device_name_get_hint               = snd_device_name_get_hint;\n    ma_snd_card_get_index_proc                     _snd_card_get_index                     = snd_card_get_index;\n    ma_snd_device_name_free_hint_proc              _snd_device_name_free_hint              = snd_device_name_free_hint;\n    ma_snd_pcm_mmap_begin_proc                     _snd_pcm_mmap_begin                     = snd_pcm_mmap_begin;\n    ma_snd_pcm_mmap_commit_proc                    _snd_pcm_mmap_commit                    = snd_pcm_mmap_commit;\n    ma_snd_pcm_recover_proc                        _snd_pcm_recover                        = snd_pcm_recover;\n    ma_snd_pcm_readi_proc                          _snd_pcm_readi                          = snd_pcm_readi;\n    ma_snd_pcm_writei_proc                         _snd_pcm_writei                         = snd_pcm_writei;\n    ma_snd_pcm_avail_proc                          _snd_pcm_avail                          = snd_pcm_avail;\n    ma_snd_pcm_avail_update_proc                   _snd_pcm_avail_update                   = snd_pcm_avail_update;\n    ma_snd_pcm_wait_proc                           _snd_pcm_wait                           = snd_pcm_wait;\n    ma_snd_pcm_nonblock_proc                       _snd_pcm_nonblock                       = snd_pcm_nonblock;\n    ma_snd_pcm_info_proc                           _snd_pcm_info                           = snd_pcm_info;\n    ma_snd_pcm_info_sizeof_proc                    _snd_pcm_info_sizeof                    = snd_pcm_info_sizeof;\n    ma_snd_pcm_info_get_name_proc                  _snd_pcm_info_get_name                  = snd_pcm_info_get_name;\n    ma_snd_pcm_poll_descriptors                    _snd_pcm_poll_descriptors               = snd_pcm_poll_descriptors;\n    ma_snd_pcm_poll_descriptors_count              _snd_pcm_poll_descriptors_count         = snd_pcm_poll_descriptors_count;\n    ma_snd_pcm_poll_descriptors_revents            _snd_pcm_poll_descriptors_revents       = snd_pcm_poll_descriptors_revents;\n    ma_snd_config_update_free_global_proc          _snd_config_update_free_global          = snd_config_update_free_global;\n\n    pContext->alsa.snd_pcm_open                           = (ma_proc)_snd_pcm_open;\n    pContext->alsa.snd_pcm_close                          = (ma_proc)_snd_pcm_close;\n    pContext->alsa.snd_pcm_hw_params_sizeof               = (ma_proc)_snd_pcm_hw_params_sizeof;\n    pContext->alsa.snd_pcm_hw_params_any                  = (ma_proc)_snd_pcm_hw_params_any;\n    pContext->alsa.snd_pcm_hw_params_set_format           = (ma_proc)_snd_pcm_hw_params_set_format;\n    pContext->alsa.snd_pcm_hw_params_set_format_first     = (ma_proc)_snd_pcm_hw_params_set_format_first;\n    pContext->alsa.snd_pcm_hw_params_get_format_mask      = (ma_proc)_snd_pcm_hw_params_get_format_mask;\n    pContext->alsa.snd_pcm_hw_params_set_channels         = (ma_proc)_snd_pcm_hw_params_set_channels;\n    pContext->alsa.snd_pcm_hw_params_set_channels_near    = (ma_proc)_snd_pcm_hw_params_set_channels_near;\n    pContext->alsa.snd_pcm_hw_params_set_channels_minmax  = (ma_proc)_snd_pcm_hw_params_set_channels_minmax;\n    pContext->alsa.snd_pcm_hw_params_set_rate_resample    = (ma_proc)_snd_pcm_hw_params_set_rate_resample;\n    pContext->alsa.snd_pcm_hw_params_set_rate             = (ma_proc)_snd_pcm_hw_params_set_rate;\n    pContext->alsa.snd_pcm_hw_params_set_rate_near        = (ma_proc)_snd_pcm_hw_params_set_rate_near;\n    pContext->alsa.snd_pcm_hw_params_set_buffer_size_near = (ma_proc)_snd_pcm_hw_params_set_buffer_size_near;\n    pContext->alsa.snd_pcm_hw_params_set_periods_near     = (ma_proc)_snd_pcm_hw_params_set_periods_near;\n    pContext->alsa.snd_pcm_hw_params_set_access           = (ma_proc)_snd_pcm_hw_params_set_access;\n    pContext->alsa.snd_pcm_hw_params_get_format           = (ma_proc)_snd_pcm_hw_params_get_format;\n    pContext->alsa.snd_pcm_hw_params_get_channels         = (ma_proc)_snd_pcm_hw_params_get_channels;\n    pContext->alsa.snd_pcm_hw_params_get_channels_min     = (ma_proc)_snd_pcm_hw_params_get_channels_min;\n    pContext->alsa.snd_pcm_hw_params_get_channels_max     = (ma_proc)_snd_pcm_hw_params_get_channels_max;\n    pContext->alsa.snd_pcm_hw_params_get_rate             = (ma_proc)_snd_pcm_hw_params_get_rate;\n    pContext->alsa.snd_pcm_hw_params_get_rate_min         = (ma_proc)_snd_pcm_hw_params_get_rate_min;\n    pContext->alsa.snd_pcm_hw_params_get_rate_max         = (ma_proc)_snd_pcm_hw_params_get_rate_max;\n    pContext->alsa.snd_pcm_hw_params_get_buffer_size      = (ma_proc)_snd_pcm_hw_params_get_buffer_size;\n    pContext->alsa.snd_pcm_hw_params_get_periods          = (ma_proc)_snd_pcm_hw_params_get_periods;\n    pContext->alsa.snd_pcm_hw_params_get_access           = (ma_proc)_snd_pcm_hw_params_get_access;\n    pContext->alsa.snd_pcm_hw_params_test_format          = (ma_proc)_snd_pcm_hw_params_test_format;\n    pContext->alsa.snd_pcm_hw_params_test_channels        = (ma_proc)_snd_pcm_hw_params_test_channels;\n    pContext->alsa.snd_pcm_hw_params_test_rate            = (ma_proc)_snd_pcm_hw_params_test_rate;\n    pContext->alsa.snd_pcm_hw_params                      = (ma_proc)_snd_pcm_hw_params;\n    pContext->alsa.snd_pcm_sw_params_sizeof               = (ma_proc)_snd_pcm_sw_params_sizeof;\n    pContext->alsa.snd_pcm_sw_params_current              = (ma_proc)_snd_pcm_sw_params_current;\n    pContext->alsa.snd_pcm_sw_params_get_boundary         = (ma_proc)_snd_pcm_sw_params_get_boundary;\n    pContext->alsa.snd_pcm_sw_params_set_avail_min        = (ma_proc)_snd_pcm_sw_params_set_avail_min;\n    pContext->alsa.snd_pcm_sw_params_set_start_threshold  = (ma_proc)_snd_pcm_sw_params_set_start_threshold;\n    pContext->alsa.snd_pcm_sw_params_set_stop_threshold   = (ma_proc)_snd_pcm_sw_params_set_stop_threshold;\n    pContext->alsa.snd_pcm_sw_params                      = (ma_proc)_snd_pcm_sw_params;\n    pContext->alsa.snd_pcm_format_mask_sizeof             = (ma_proc)_snd_pcm_format_mask_sizeof;\n    pContext->alsa.snd_pcm_format_mask_test               = (ma_proc)_snd_pcm_format_mask_test;\n    pContext->alsa.snd_pcm_get_chmap                      = (ma_proc)_snd_pcm_get_chmap;\n    pContext->alsa.snd_pcm_state                          = (ma_proc)_snd_pcm_state;\n    pContext->alsa.snd_pcm_prepare                        = (ma_proc)_snd_pcm_prepare;\n    pContext->alsa.snd_pcm_start                          = (ma_proc)_snd_pcm_start;\n    pContext->alsa.snd_pcm_drop                           = (ma_proc)_snd_pcm_drop;\n    pContext->alsa.snd_pcm_drain                          = (ma_proc)_snd_pcm_drain;\n    pContext->alsa.snd_pcm_reset                          = (ma_proc)_snd_pcm_reset;\n    pContext->alsa.snd_device_name_hint                   = (ma_proc)_snd_device_name_hint;\n    pContext->alsa.snd_device_name_get_hint               = (ma_proc)_snd_device_name_get_hint;\n    pContext->alsa.snd_card_get_index                     = (ma_proc)_snd_card_get_index;\n    pContext->alsa.snd_device_name_free_hint              = (ma_proc)_snd_device_name_free_hint;\n    pContext->alsa.snd_pcm_mmap_begin                     = (ma_proc)_snd_pcm_mmap_begin;\n    pContext->alsa.snd_pcm_mmap_commit                    = (ma_proc)_snd_pcm_mmap_commit;\n    pContext->alsa.snd_pcm_recover                        = (ma_proc)_snd_pcm_recover;\n    pContext->alsa.snd_pcm_readi                          = (ma_proc)_snd_pcm_readi;\n    pContext->alsa.snd_pcm_writei                         = (ma_proc)_snd_pcm_writei;\n    pContext->alsa.snd_pcm_avail                          = (ma_proc)_snd_pcm_avail;\n    pContext->alsa.snd_pcm_avail_update                   = (ma_proc)_snd_pcm_avail_update;\n    pContext->alsa.snd_pcm_wait                           = (ma_proc)_snd_pcm_wait;\n    pContext->alsa.snd_pcm_nonblock                       = (ma_proc)_snd_pcm_nonblock;\n    pContext->alsa.snd_pcm_info                           = (ma_proc)_snd_pcm_info;\n    pContext->alsa.snd_pcm_info_sizeof                    = (ma_proc)_snd_pcm_info_sizeof;\n    pContext->alsa.snd_pcm_info_get_name                  = (ma_proc)_snd_pcm_info_get_name;\n    pContext->alsa.snd_pcm_poll_descriptors               = (ma_proc)_snd_pcm_poll_descriptors;\n    pContext->alsa.snd_pcm_poll_descriptors_count         = (ma_proc)_snd_pcm_poll_descriptors_count;\n    pContext->alsa.snd_pcm_poll_descriptors_revents       = (ma_proc)_snd_pcm_poll_descriptors_revents;\n    pContext->alsa.snd_config_update_free_global          = (ma_proc)_snd_config_update_free_global;\n#endif\n\n    pContext->alsa.useVerboseDeviceEnumeration = pConfig->alsa.useVerboseDeviceEnumeration;\n\n    result = ma_mutex_init(&pContext->alsa.internalDeviceEnumLock);\n    if (result != MA_SUCCESS) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[ALSA] WARNING: Failed to initialize mutex for internal device enumeration.\");\n        return result;\n    }\n\n    pCallbacks->onContextInit             = ma_context_init__alsa;\n    pCallbacks->onContextUninit           = ma_context_uninit__alsa;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__alsa;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__alsa;\n    pCallbacks->onDeviceInit              = ma_device_init__alsa;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__alsa;\n    pCallbacks->onDeviceStart             = ma_device_start__alsa;\n    pCallbacks->onDeviceStop              = ma_device_stop__alsa;\n    pCallbacks->onDeviceRead              = ma_device_read__alsa;\n    pCallbacks->onDeviceWrite             = ma_device_write__alsa;\n    pCallbacks->onDeviceDataLoop          = NULL;\n    pCallbacks->onDeviceDataLoopWakeup    = ma_device_data_loop_wakeup__alsa;\n\n    return MA_SUCCESS;\n}\n#endif  /* ALSA */\n\n\n\n/******************************************************************************\n\nPulseAudio Backend\n\n******************************************************************************/\n#ifdef MA_HAS_PULSEAUDIO\n/*\nThe PulseAudio API, along with Apple's Core Audio, is the worst of the maintream audio APIs. This is a brief description of what's going on\nin the PulseAudio backend. I apologize if this gets a bit ranty for your liking - you might want to skip this discussion.\n\nPulseAudio has something they call the \"Simple API\", which unfortunately isn't suitable for miniaudio. I've not seen anywhere where it\nallows you to enumerate over devices, nor does it seem to support the ability to stop and start streams. Looking at the documentation, it\nappears as though the stream is constantly running and you prevent sound from being emitted or captured by simply not calling the read or\nwrite functions. This is not a professional solution as it would be much better to *actually* stop the underlying stream. Perhaps the\nsimple API has some smarts to do this automatically, but I'm not sure. Another limitation with the simple API is that it seems inefficient\nwhen you want to have multiple streams to a single context. For these reasons, miniaudio is not using the simple API.\n\nSince we're not using the simple API, we're left with the asynchronous API as our only other option. And boy, is this where it starts to\nget fun, and I don't mean that in a good way...\n\nThe problems start with the very name of the API - \"asynchronous\". Yes, this is an asynchronous oriented API which means your commands\ndon't immediately take effect. You instead need to issue your commands, and then wait for them to complete. The waiting mechanism is\nenabled through the use of a \"main loop\". In the asychronous API you cannot get away from the main loop, and the main loop is where almost\nall of PulseAudio's problems stem from.\n\nWhen you first initialize PulseAudio you need an object referred to as \"main loop\". You can implement this yourself by defining your own\nvtable, but it's much easier to just use one of the built-in main loop implementations. There's two generic implementations called\npa_mainloop and pa_threaded_mainloop, and another implementation specific to GLib called pa_glib_mainloop. We're using pa_threaded_mainloop\nbecause it simplifies management of the worker thread. The idea of the main loop object is pretty self explanatory - you're supposed to use\nit to implement a worker thread which runs in a loop. The main loop is where operations are actually executed.\n\nTo initialize the main loop, you just use `pa_threaded_mainloop_new()`. This is the first function you'll call. You can then get a pointer\nto the vtable with `pa_threaded_mainloop_get_api()` (the main loop vtable is called `pa_mainloop_api`). Again, you can bypass the threaded\nmain loop object entirely and just implement `pa_mainloop_api` directly, but there's no need for it unless you're doing something extremely\nspecialized such as if you want to integrate it into your application's existing main loop infrastructure.\n\n(EDIT 2021-01-26: miniaudio is no longer using `pa_threaded_mainloop` due to this issue: https://github.com/mackron/miniaudio/issues/262.\nIt is now using `pa_mainloop` which turns out to be a simpler solution anyway. The rest of this rant still applies, however.)\n\nOnce you have your main loop vtable (the `pa_mainloop_api` object) you can create the PulseAudio context. This is very similar to\nminiaudio's context and they map to each other quite well. You have one context to many streams, which is basically the same as miniaudio's\none `ma_context` to many `ma_device`s. Here's where it starts to get annoying, however. When you first create the PulseAudio context, which\nis done with `pa_context_new()`, it's not actually connected to anything. When you connect, you call `pa_context_connect()`. However, if\nyou remember, PulseAudio is an asynchronous API. That means you cannot just assume the context is connected after `pa_context_context()`\nhas returned. You instead need to wait for it to connect. To do this, you need to either wait for a callback to get fired, which you can\nset with `pa_context_set_state_callback()`, or you can continuously poll the context's state. Either way, you need to run this in a loop.\nAll objects from here out are created from the context, and, I believe, you can't be creating these objects until the context is connected.\nThis waiting loop is therefore unavoidable. In order for the waiting to ever complete, however, the main loop needs to be running. Before\nattempting to connect the context, the main loop needs to be started with `pa_threaded_mainloop_start()`.\n\nThe reason for this asynchronous design is to support cases where you're connecting to a remote server, say through a local network or an\ninternet connection. However, the *VAST* majority of cases don't involve this at all - they just connect to a local \"server\" running on the\nhost machine. The fact that this would be the default rather than making `pa_context_connect()` synchronous tends to boggle the mind.\n\nOnce the context has been created and connected you can start creating a stream. A PulseAudio stream is analogous to miniaudio's device.\nThe initialization of a stream is fairly standard - you configure some attributes (analogous to miniaudio's device config) and then call\n`pa_stream_new()` to actually create it. Here is where we start to get into \"operations\". When configuring the stream, you can get\ninformation about the source (such as sample format, sample rate, etc.), however it's not synchronous. Instead, a `pa_operation` object\nis returned from `pa_context_get_source_info_by_name()` (capture) or `pa_context_get_sink_info_by_name()` (playback). Then, you need to\nrun a loop (again!) to wait for the operation to complete which you can determine via a callback or polling, just like we did with the\ncontext. Then, as an added bonus, you need to decrement the reference counter of the `pa_operation` object to ensure memory is cleaned up.\nAll of that just to retrieve basic information about a device!\n\nOnce the basic information about the device has been retrieved, miniaudio can now create the stream with `ma_stream_new()`. Like the\ncontext, this needs to be connected. But we need to be careful here, because we're now about to introduce one of the most horrific design\nchoices in PulseAudio.\n\nPulseAudio allows you to specify a callback that is fired when data can be written to or read from a stream. The language is important here\nbecause PulseAudio takes it literally, specifically the \"can be\". You would think these callbacks would be appropriate as the place for\nwriting and reading data to and from the stream, and that would be right, except when it's not. When you initialize the stream, you can\nset a flag that tells PulseAudio to not start the stream automatically. This is required because miniaudio does not auto-start devices\nstraight after initialization - you need to call `ma_device_start()` manually. The problem is that even when this flag is specified,\nPulseAudio will immediately fire it's write or read callback. This is *technically* correct (based on the wording in the documentation)\nbecause indeed, data *can* be written at this point. The problem is that it's not *practical*. It makes sense that the write/read callback\nwould be where a program will want to write or read data to or from the stream, but when it's called before the application has even\nrequested that the stream be started, it's just not practical because the program probably isn't ready for any kind of data delivery at\nthat point (it may still need to load files or whatnot). Instead, this callback should only be fired when the application requests the\nstream be started which is how it works with literally *every* other callback-based audio API. Since miniaudio forbids firing of the data\ncallback until the device has been started (as it should be with *all* callback based APIs), logic needs to be added to ensure miniaudio\ndoesn't just blindly fire the application-defined data callback from within the PulseAudio callback before the stream has actually been\nstarted. The device state is used for this - if the state is anything other than `ma_device_state_starting` or `ma_device_state_started`, the main data\ncallback is not fired.\n\nThis, unfortunately, is not the end of the problems with the PulseAudio write callback. Any normal callback based audio API will\ncontinuously fire the callback at regular intervals based on the size of the internal buffer. This will only ever be fired when the device\nis running, and will be fired regardless of whether or not the user actually wrote anything to the device/stream. This not the case in\nPulseAudio. In PulseAudio, the data callback will *only* be called if you wrote something to it previously. That means, if you don't call\n`pa_stream_write()`, the callback will not get fired. On the surface you wouldn't think this would matter because you should be always\nwriting data, and if you don't have anything to write, just write silence. That's fine until you want to drain the stream. You see, if\nyou're continuously writing data to the stream, the stream will never get drained! That means in order to drain the stream, you need to\n*not* write data to it! But remember, when you don't write data to the stream, the callback won't get fired again! Why is draining\nimportant? Because that's how we've defined stopping to work in miniaudio. In miniaudio, stopping the device requires it to be drained\nbefore returning from ma_device_stop(). So we've stopped the device, which requires us to drain, but draining requires us to *not* write\ndata to the stream (or else it won't ever complete draining), but not writing to the stream means the callback won't get fired again!\n\nThis becomes a problem when stopping and then restarting the device. When the device is stopped, it's drained, which requires us to *not*\nwrite anything to the stream. But then, since we didn't write anything to it, the write callback will *never* get called again if we just\nresume the stream naively. This means that starting the stream requires us to write data to the stream from outside the callback. This\ndisconnect is something PulseAudio has got seriously wrong - there should only ever be a single source of data delivery, that being the\ncallback. (I have tried using `pa_stream_flush()` to trigger the write callback to fire, but this just doesn't work for some reason.)\n\nOnce you've created the stream, you need to connect it which involves the whole waiting procedure. This is the same process as the context,\nonly this time you'll poll for the state with `pa_stream_get_status()`. The starting and stopping of a streaming is referred to as\n\"corking\" in PulseAudio. The analogy is corking a barrel. To start the stream, you uncork it, to stop it you cork it. Personally I think\nit's silly - why would you not just call it \"starting\" and \"stopping\" like any other normal audio API? Anyway, the act of corking is, you\nguessed it, asynchronous. This means you'll need our waiting loop as usual. Again, why this asynchronous design is the default is\nabsolutely beyond me. Would it really be that hard to just make it run synchronously?\n\nTeardown is pretty simple (what?!). It's just a matter of calling the relevant `_unref()` function on each object in reverse order that\nthey were initialized in.\n\nThat's about it from the PulseAudio side. A bit ranty, I know, but they really need to fix that main loop and callback system. They're\nembarrassingly unpractical. The main loop thing is an easy fix - have synchronous versions of all APIs. If an application wants these to\nrun asynchronously, they can execute them in a separate thread themselves. The desire to run these asynchronously is such a niche\nrequirement - it makes no sense to make it the default. The stream write callback needs to be change, or an alternative provided, that is\nconstantly fired, regardless of whether or not `pa_stream_write()` has been called, and it needs to take a pointer to a buffer as a\nparameter which the program just writes to directly rather than having to call `pa_stream_writable_size()` and `pa_stream_write()`. These\nchanges alone will change PulseAudio from one of the worst audio APIs to one of the best.\n*/\n\n\n/*\nIt is assumed pulseaudio.h is available when linking at compile time. When linking at compile time, we use the declarations in the header\nto check for type safety. We cannot do this when linking at run time because the header might not be available.\n*/\n#ifdef MA_NO_RUNTIME_LINKING\n\n/* pulseaudio.h marks some functions with \"inline\" which isn't always supported. Need to emulate it. */\n#if !defined(__cplusplus)\n    #if defined(__STRICT_ANSI__)\n        #if !defined(inline)\n            #define inline __inline__ __attribute__((always_inline))\n            #define MA_INLINE_DEFINED\n        #endif\n    #endif\n#endif\n#include <pulse/pulseaudio.h>\n#if defined(MA_INLINE_DEFINED)\n    #undef inline\n    #undef MA_INLINE_DEFINED\n#endif\n\n#define MA_PA_OK                                       PA_OK\n#define MA_PA_ERR_ACCESS                               PA_ERR_ACCESS\n#define MA_PA_ERR_INVALID                              PA_ERR_INVALID\n#define MA_PA_ERR_NOENTITY                             PA_ERR_NOENTITY\n#define MA_PA_ERR_NOTSUPPORTED                         PA_ERR_NOTSUPPORTED\n\n#define MA_PA_CHANNELS_MAX                             PA_CHANNELS_MAX\n#define MA_PA_RATE_MAX                                 PA_RATE_MAX\n\ntypedef pa_context_flags_t ma_pa_context_flags_t;\n#define MA_PA_CONTEXT_NOFLAGS                          PA_CONTEXT_NOFLAGS\n#define MA_PA_CONTEXT_NOAUTOSPAWN                      PA_CONTEXT_NOAUTOSPAWN\n#define MA_PA_CONTEXT_NOFAIL                           PA_CONTEXT_NOFAIL\n\ntypedef pa_stream_flags_t ma_pa_stream_flags_t;\n#define MA_PA_STREAM_NOFLAGS                           PA_STREAM_NOFLAGS\n#define MA_PA_STREAM_START_CORKED                      PA_STREAM_START_CORKED\n#define MA_PA_STREAM_INTERPOLATE_TIMING                PA_STREAM_INTERPOLATE_TIMING\n#define MA_PA_STREAM_NOT_MONOTONIC                     PA_STREAM_NOT_MONOTONIC\n#define MA_PA_STREAM_AUTO_TIMING_UPDATE                PA_STREAM_AUTO_TIMING_UPDATE\n#define MA_PA_STREAM_NO_REMAP_CHANNELS                 PA_STREAM_NO_REMAP_CHANNELS\n#define MA_PA_STREAM_NO_REMIX_CHANNELS                 PA_STREAM_NO_REMIX_CHANNELS\n#define MA_PA_STREAM_FIX_FORMAT                        PA_STREAM_FIX_FORMAT\n#define MA_PA_STREAM_FIX_RATE                          PA_STREAM_FIX_RATE\n#define MA_PA_STREAM_FIX_CHANNELS                      PA_STREAM_FIX_CHANNELS\n#define MA_PA_STREAM_DONT_MOVE                         PA_STREAM_DONT_MOVE\n#define MA_PA_STREAM_VARIABLE_RATE                     PA_STREAM_VARIABLE_RATE\n#define MA_PA_STREAM_PEAK_DETECT                       PA_STREAM_PEAK_DETECT\n#define MA_PA_STREAM_START_MUTED                       PA_STREAM_START_MUTED\n#define MA_PA_STREAM_ADJUST_LATENCY                    PA_STREAM_ADJUST_LATENCY\n#define MA_PA_STREAM_EARLY_REQUESTS                    PA_STREAM_EARLY_REQUESTS\n#define MA_PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND         PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND\n#define MA_PA_STREAM_START_UNMUTED                     PA_STREAM_START_UNMUTED\n#define MA_PA_STREAM_FAIL_ON_SUSPEND                   PA_STREAM_FAIL_ON_SUSPEND\n#define MA_PA_STREAM_RELATIVE_VOLUME                   PA_STREAM_RELATIVE_VOLUME\n#define MA_PA_STREAM_PASSTHROUGH                       PA_STREAM_PASSTHROUGH\n\ntypedef pa_sink_flags_t ma_pa_sink_flags_t;\n#define MA_PA_SINK_NOFLAGS                             PA_SINK_NOFLAGS\n#define MA_PA_SINK_HW_VOLUME_CTRL                      PA_SINK_HW_VOLUME_CTRL\n#define MA_PA_SINK_LATENCY                             PA_SINK_LATENCY\n#define MA_PA_SINK_HARDWARE                            PA_SINK_HARDWARE\n#define MA_PA_SINK_NETWORK                             PA_SINK_NETWORK\n#define MA_PA_SINK_HW_MUTE_CTRL                        PA_SINK_HW_MUTE_CTRL\n#define MA_PA_SINK_DECIBEL_VOLUME                      PA_SINK_DECIBEL_VOLUME\n#define MA_PA_SINK_FLAT_VOLUME                         PA_SINK_FLAT_VOLUME\n#define MA_PA_SINK_DYNAMIC_LATENCY                     PA_SINK_DYNAMIC_LATENCY\n#define MA_PA_SINK_SET_FORMATS                         PA_SINK_SET_FORMATS\n\ntypedef pa_source_flags_t ma_pa_source_flags_t;\n#define MA_PA_SOURCE_NOFLAGS                           PA_SOURCE_NOFLAGS\n#define MA_PA_SOURCE_HW_VOLUME_CTRL                    PA_SOURCE_HW_VOLUME_CTRL\n#define MA_PA_SOURCE_LATENCY                           PA_SOURCE_LATENCY\n#define MA_PA_SOURCE_HARDWARE                          PA_SOURCE_HARDWARE\n#define MA_PA_SOURCE_NETWORK                           PA_SOURCE_NETWORK\n#define MA_PA_SOURCE_HW_MUTE_CTRL                      PA_SOURCE_HW_MUTE_CTRL\n#define MA_PA_SOURCE_DECIBEL_VOLUME                    PA_SOURCE_DECIBEL_VOLUME\n#define MA_PA_SOURCE_DYNAMIC_LATENCY                   PA_SOURCE_DYNAMIC_LATENCY\n#define MA_PA_SOURCE_FLAT_VOLUME                       PA_SOURCE_FLAT_VOLUME\n\ntypedef pa_context_state_t ma_pa_context_state_t;\n#define MA_PA_CONTEXT_UNCONNECTED                      PA_CONTEXT_UNCONNECTED\n#define MA_PA_CONTEXT_CONNECTING                       PA_CONTEXT_CONNECTING\n#define MA_PA_CONTEXT_AUTHORIZING                      PA_CONTEXT_AUTHORIZING\n#define MA_PA_CONTEXT_SETTING_NAME                     PA_CONTEXT_SETTING_NAME\n#define MA_PA_CONTEXT_READY                            PA_CONTEXT_READY\n#define MA_PA_CONTEXT_FAILED                           PA_CONTEXT_FAILED\n#define MA_PA_CONTEXT_TERMINATED                       PA_CONTEXT_TERMINATED\n\ntypedef pa_stream_state_t ma_pa_stream_state_t;\n#define MA_PA_STREAM_UNCONNECTED                       PA_STREAM_UNCONNECTED\n#define MA_PA_STREAM_CREATING                          PA_STREAM_CREATING\n#define MA_PA_STREAM_READY                             PA_STREAM_READY\n#define MA_PA_STREAM_FAILED                            PA_STREAM_FAILED\n#define MA_PA_STREAM_TERMINATED                        PA_STREAM_TERMINATED\n\ntypedef pa_operation_state_t ma_pa_operation_state_t;\n#define MA_PA_OPERATION_RUNNING                        PA_OPERATION_RUNNING\n#define MA_PA_OPERATION_DONE                           PA_OPERATION_DONE\n#define MA_PA_OPERATION_CANCELLED                      PA_OPERATION_CANCELLED\n\ntypedef pa_sink_state_t ma_pa_sink_state_t;\n#define MA_PA_SINK_INVALID_STATE                       PA_SINK_INVALID_STATE\n#define MA_PA_SINK_RUNNING                             PA_SINK_RUNNING\n#define MA_PA_SINK_IDLE                                PA_SINK_IDLE\n#define MA_PA_SINK_SUSPENDED                           PA_SINK_SUSPENDED\n\ntypedef pa_source_state_t ma_pa_source_state_t;\n#define MA_PA_SOURCE_INVALID_STATE                     PA_SOURCE_INVALID_STATE\n#define MA_PA_SOURCE_RUNNING                           PA_SOURCE_RUNNING\n#define MA_PA_SOURCE_IDLE                              PA_SOURCE_IDLE\n#define MA_PA_SOURCE_SUSPENDED                         PA_SOURCE_SUSPENDED\n\ntypedef pa_seek_mode_t ma_pa_seek_mode_t;\n#define MA_PA_SEEK_RELATIVE                            PA_SEEK_RELATIVE\n#define MA_PA_SEEK_ABSOLUTE                            PA_SEEK_ABSOLUTE\n#define MA_PA_SEEK_RELATIVE_ON_READ                    PA_SEEK_RELATIVE_ON_READ\n#define MA_PA_SEEK_RELATIVE_END                        PA_SEEK_RELATIVE_END\n\ntypedef pa_channel_position_t ma_pa_channel_position_t;\n#define MA_PA_CHANNEL_POSITION_INVALID                 PA_CHANNEL_POSITION_INVALID\n#define MA_PA_CHANNEL_POSITION_MONO                    PA_CHANNEL_POSITION_MONO\n#define MA_PA_CHANNEL_POSITION_FRONT_LEFT              PA_CHANNEL_POSITION_FRONT_LEFT\n#define MA_PA_CHANNEL_POSITION_FRONT_RIGHT             PA_CHANNEL_POSITION_FRONT_RIGHT\n#define MA_PA_CHANNEL_POSITION_FRONT_CENTER            PA_CHANNEL_POSITION_FRONT_CENTER\n#define MA_PA_CHANNEL_POSITION_REAR_CENTER             PA_CHANNEL_POSITION_REAR_CENTER\n#define MA_PA_CHANNEL_POSITION_REAR_LEFT               PA_CHANNEL_POSITION_REAR_LEFT\n#define MA_PA_CHANNEL_POSITION_REAR_RIGHT              PA_CHANNEL_POSITION_REAR_RIGHT\n#define MA_PA_CHANNEL_POSITION_LFE                     PA_CHANNEL_POSITION_LFE\n#define MA_PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER    PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER\n#define MA_PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER   PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER\n#define MA_PA_CHANNEL_POSITION_SIDE_LEFT               PA_CHANNEL_POSITION_SIDE_LEFT\n#define MA_PA_CHANNEL_POSITION_SIDE_RIGHT              PA_CHANNEL_POSITION_SIDE_RIGHT\n#define MA_PA_CHANNEL_POSITION_AUX0                    PA_CHANNEL_POSITION_AUX0\n#define MA_PA_CHANNEL_POSITION_AUX1                    PA_CHANNEL_POSITION_AUX1\n#define MA_PA_CHANNEL_POSITION_AUX2                    PA_CHANNEL_POSITION_AUX2\n#define MA_PA_CHANNEL_POSITION_AUX3                    PA_CHANNEL_POSITION_AUX3\n#define MA_PA_CHANNEL_POSITION_AUX4                    PA_CHANNEL_POSITION_AUX4\n#define MA_PA_CHANNEL_POSITION_AUX5                    PA_CHANNEL_POSITION_AUX5\n#define MA_PA_CHANNEL_POSITION_AUX6                    PA_CHANNEL_POSITION_AUX6\n#define MA_PA_CHANNEL_POSITION_AUX7                    PA_CHANNEL_POSITION_AUX7\n#define MA_PA_CHANNEL_POSITION_AUX8                    PA_CHANNEL_POSITION_AUX8\n#define MA_PA_CHANNEL_POSITION_AUX9                    PA_CHANNEL_POSITION_AUX9\n#define MA_PA_CHANNEL_POSITION_AUX10                   PA_CHANNEL_POSITION_AUX10\n#define MA_PA_CHANNEL_POSITION_AUX11                   PA_CHANNEL_POSITION_AUX11\n#define MA_PA_CHANNEL_POSITION_AUX12                   PA_CHANNEL_POSITION_AUX12\n#define MA_PA_CHANNEL_POSITION_AUX13                   PA_CHANNEL_POSITION_AUX13\n#define MA_PA_CHANNEL_POSITION_AUX14                   PA_CHANNEL_POSITION_AUX14\n#define MA_PA_CHANNEL_POSITION_AUX15                   PA_CHANNEL_POSITION_AUX15\n#define MA_PA_CHANNEL_POSITION_AUX16                   PA_CHANNEL_POSITION_AUX16\n#define MA_PA_CHANNEL_POSITION_AUX17                   PA_CHANNEL_POSITION_AUX17\n#define MA_PA_CHANNEL_POSITION_AUX18                   PA_CHANNEL_POSITION_AUX18\n#define MA_PA_CHANNEL_POSITION_AUX19                   PA_CHANNEL_POSITION_AUX19\n#define MA_PA_CHANNEL_POSITION_AUX20                   PA_CHANNEL_POSITION_AUX20\n#define MA_PA_CHANNEL_POSITION_AUX21                   PA_CHANNEL_POSITION_AUX21\n#define MA_PA_CHANNEL_POSITION_AUX22                   PA_CHANNEL_POSITION_AUX22\n#define MA_PA_CHANNEL_POSITION_AUX23                   PA_CHANNEL_POSITION_AUX23\n#define MA_PA_CHANNEL_POSITION_AUX24                   PA_CHANNEL_POSITION_AUX24\n#define MA_PA_CHANNEL_POSITION_AUX25                   PA_CHANNEL_POSITION_AUX25\n#define MA_PA_CHANNEL_POSITION_AUX26                   PA_CHANNEL_POSITION_AUX26\n#define MA_PA_CHANNEL_POSITION_AUX27                   PA_CHANNEL_POSITION_AUX27\n#define MA_PA_CHANNEL_POSITION_AUX28                   PA_CHANNEL_POSITION_AUX28\n#define MA_PA_CHANNEL_POSITION_AUX29                   PA_CHANNEL_POSITION_AUX29\n#define MA_PA_CHANNEL_POSITION_AUX30                   PA_CHANNEL_POSITION_AUX30\n#define MA_PA_CHANNEL_POSITION_AUX31                   PA_CHANNEL_POSITION_AUX31\n#define MA_PA_CHANNEL_POSITION_TOP_CENTER              PA_CHANNEL_POSITION_TOP_CENTER\n#define MA_PA_CHANNEL_POSITION_TOP_FRONT_LEFT          PA_CHANNEL_POSITION_TOP_FRONT_LEFT\n#define MA_PA_CHANNEL_POSITION_TOP_FRONT_RIGHT         PA_CHANNEL_POSITION_TOP_FRONT_RIGHT\n#define MA_PA_CHANNEL_POSITION_TOP_FRONT_CENTER        PA_CHANNEL_POSITION_TOP_FRONT_CENTER\n#define MA_PA_CHANNEL_POSITION_TOP_REAR_LEFT           PA_CHANNEL_POSITION_TOP_REAR_LEFT\n#define MA_PA_CHANNEL_POSITION_TOP_REAR_RIGHT          PA_CHANNEL_POSITION_TOP_REAR_RIGHT\n#define MA_PA_CHANNEL_POSITION_TOP_REAR_CENTER         PA_CHANNEL_POSITION_TOP_REAR_CENTER\n#define MA_PA_CHANNEL_POSITION_LEFT                    PA_CHANNEL_POSITION_LEFT\n#define MA_PA_CHANNEL_POSITION_RIGHT                   PA_CHANNEL_POSITION_RIGHT\n#define MA_PA_CHANNEL_POSITION_CENTER                  PA_CHANNEL_POSITION_CENTER\n#define MA_PA_CHANNEL_POSITION_SUBWOOFER               PA_CHANNEL_POSITION_SUBWOOFER\n\ntypedef pa_channel_map_def_t ma_pa_channel_map_def_t;\n#define MA_PA_CHANNEL_MAP_AIFF                         PA_CHANNEL_MAP_AIFF\n#define MA_PA_CHANNEL_MAP_ALSA                         PA_CHANNEL_MAP_ALSA\n#define MA_PA_CHANNEL_MAP_AUX                          PA_CHANNEL_MAP_AUX\n#define MA_PA_CHANNEL_MAP_WAVEEX                       PA_CHANNEL_MAP_WAVEEX\n#define MA_PA_CHANNEL_MAP_OSS                          PA_CHANNEL_MAP_OSS\n#define MA_PA_CHANNEL_MAP_DEFAULT                      PA_CHANNEL_MAP_DEFAULT\n\ntypedef pa_sample_format_t ma_pa_sample_format_t;\n#define MA_PA_SAMPLE_INVALID                           PA_SAMPLE_INVALID\n#define MA_PA_SAMPLE_U8                                PA_SAMPLE_U8\n#define MA_PA_SAMPLE_ALAW                              PA_SAMPLE_ALAW\n#define MA_PA_SAMPLE_ULAW                              PA_SAMPLE_ULAW\n#define MA_PA_SAMPLE_S16LE                             PA_SAMPLE_S16LE\n#define MA_PA_SAMPLE_S16BE                             PA_SAMPLE_S16BE\n#define MA_PA_SAMPLE_FLOAT32LE                         PA_SAMPLE_FLOAT32LE\n#define MA_PA_SAMPLE_FLOAT32BE                         PA_SAMPLE_FLOAT32BE\n#define MA_PA_SAMPLE_S32LE                             PA_SAMPLE_S32LE\n#define MA_PA_SAMPLE_S32BE                             PA_SAMPLE_S32BE\n#define MA_PA_SAMPLE_S24LE                             PA_SAMPLE_S24LE\n#define MA_PA_SAMPLE_S24BE                             PA_SAMPLE_S24BE\n#define MA_PA_SAMPLE_S24_32LE                          PA_SAMPLE_S24_32LE\n#define MA_PA_SAMPLE_S24_32BE                          PA_SAMPLE_S24_32BE\n\ntypedef pa_mainloop             ma_pa_mainloop;\ntypedef pa_threaded_mainloop    ma_pa_threaded_mainloop;\ntypedef pa_mainloop_api         ma_pa_mainloop_api;\ntypedef pa_context              ma_pa_context;\ntypedef pa_operation            ma_pa_operation;\ntypedef pa_stream               ma_pa_stream;\ntypedef pa_spawn_api            ma_pa_spawn_api;\ntypedef pa_buffer_attr          ma_pa_buffer_attr;\ntypedef pa_channel_map          ma_pa_channel_map;\ntypedef pa_cvolume              ma_pa_cvolume;\ntypedef pa_sample_spec          ma_pa_sample_spec;\ntypedef pa_sink_info            ma_pa_sink_info;\ntypedef pa_source_info          ma_pa_source_info;\n\ntypedef pa_context_notify_cb_t  ma_pa_context_notify_cb_t;\ntypedef pa_sink_info_cb_t       ma_pa_sink_info_cb_t;\ntypedef pa_source_info_cb_t     ma_pa_source_info_cb_t;\ntypedef pa_stream_success_cb_t  ma_pa_stream_success_cb_t;\ntypedef pa_stream_request_cb_t  ma_pa_stream_request_cb_t;\ntypedef pa_stream_notify_cb_t   ma_pa_stream_notify_cb_t;\ntypedef pa_free_cb_t            ma_pa_free_cb_t;\n#else\n#define MA_PA_OK                                       0\n#define MA_PA_ERR_ACCESS                               1\n#define MA_PA_ERR_INVALID                              2\n#define MA_PA_ERR_NOENTITY                             5\n#define MA_PA_ERR_NOTSUPPORTED                         19\n\n#define MA_PA_CHANNELS_MAX                             32\n#define MA_PA_RATE_MAX                                 384000\n\ntypedef int ma_pa_context_flags_t;\n#define MA_PA_CONTEXT_NOFLAGS                          0x00000000\n#define MA_PA_CONTEXT_NOAUTOSPAWN                      0x00000001\n#define MA_PA_CONTEXT_NOFAIL                           0x00000002\n\ntypedef int ma_pa_stream_flags_t;\n#define MA_PA_STREAM_NOFLAGS                           0x00000000\n#define MA_PA_STREAM_START_CORKED                      0x00000001\n#define MA_PA_STREAM_INTERPOLATE_TIMING                0x00000002\n#define MA_PA_STREAM_NOT_MONOTONIC                     0x00000004\n#define MA_PA_STREAM_AUTO_TIMING_UPDATE                0x00000008\n#define MA_PA_STREAM_NO_REMAP_CHANNELS                 0x00000010\n#define MA_PA_STREAM_NO_REMIX_CHANNELS                 0x00000020\n#define MA_PA_STREAM_FIX_FORMAT                        0x00000040\n#define MA_PA_STREAM_FIX_RATE                          0x00000080\n#define MA_PA_STREAM_FIX_CHANNELS                      0x00000100\n#define MA_PA_STREAM_DONT_MOVE                         0x00000200\n#define MA_PA_STREAM_VARIABLE_RATE                     0x00000400\n#define MA_PA_STREAM_PEAK_DETECT                       0x00000800\n#define MA_PA_STREAM_START_MUTED                       0x00001000\n#define MA_PA_STREAM_ADJUST_LATENCY                    0x00002000\n#define MA_PA_STREAM_EARLY_REQUESTS                    0x00004000\n#define MA_PA_STREAM_DONT_INHIBIT_AUTO_SUSPEND         0x00008000\n#define MA_PA_STREAM_START_UNMUTED                     0x00010000\n#define MA_PA_STREAM_FAIL_ON_SUSPEND                   0x00020000\n#define MA_PA_STREAM_RELATIVE_VOLUME                   0x00040000\n#define MA_PA_STREAM_PASSTHROUGH                       0x00080000\n\ntypedef int ma_pa_sink_flags_t;\n#define MA_PA_SINK_NOFLAGS                             0x00000000\n#define MA_PA_SINK_HW_VOLUME_CTRL                      0x00000001\n#define MA_PA_SINK_LATENCY                             0x00000002\n#define MA_PA_SINK_HARDWARE                            0x00000004\n#define MA_PA_SINK_NETWORK                             0x00000008\n#define MA_PA_SINK_HW_MUTE_CTRL                        0x00000010\n#define MA_PA_SINK_DECIBEL_VOLUME                      0x00000020\n#define MA_PA_SINK_FLAT_VOLUME                         0x00000040\n#define MA_PA_SINK_DYNAMIC_LATENCY                     0x00000080\n#define MA_PA_SINK_SET_FORMATS                         0x00000100\n\ntypedef int ma_pa_source_flags_t;\n#define MA_PA_SOURCE_NOFLAGS                           0x00000000\n#define MA_PA_SOURCE_HW_VOLUME_CTRL                    0x00000001\n#define MA_PA_SOURCE_LATENCY                           0x00000002\n#define MA_PA_SOURCE_HARDWARE                          0x00000004\n#define MA_PA_SOURCE_NETWORK                           0x00000008\n#define MA_PA_SOURCE_HW_MUTE_CTRL                      0x00000010\n#define MA_PA_SOURCE_DECIBEL_VOLUME                    0x00000020\n#define MA_PA_SOURCE_DYNAMIC_LATENCY                   0x00000040\n#define MA_PA_SOURCE_FLAT_VOLUME                       0x00000080\n\ntypedef int ma_pa_context_state_t;\n#define MA_PA_CONTEXT_UNCONNECTED                      0\n#define MA_PA_CONTEXT_CONNECTING                       1\n#define MA_PA_CONTEXT_AUTHORIZING                      2\n#define MA_PA_CONTEXT_SETTING_NAME                     3\n#define MA_PA_CONTEXT_READY                            4\n#define MA_PA_CONTEXT_FAILED                           5\n#define MA_PA_CONTEXT_TERMINATED                       6\n\ntypedef int ma_pa_stream_state_t;\n#define MA_PA_STREAM_UNCONNECTED                       0\n#define MA_PA_STREAM_CREATING                          1\n#define MA_PA_STREAM_READY                             2\n#define MA_PA_STREAM_FAILED                            3\n#define MA_PA_STREAM_TERMINATED                        4\n\ntypedef int ma_pa_operation_state_t;\n#define MA_PA_OPERATION_RUNNING                        0\n#define MA_PA_OPERATION_DONE                           1\n#define MA_PA_OPERATION_CANCELLED                      2\n\ntypedef int ma_pa_sink_state_t;\n#define MA_PA_SINK_INVALID_STATE                       -1\n#define MA_PA_SINK_RUNNING                             0\n#define MA_PA_SINK_IDLE                                1\n#define MA_PA_SINK_SUSPENDED                           2\n\ntypedef int ma_pa_source_state_t;\n#define MA_PA_SOURCE_INVALID_STATE                     -1\n#define MA_PA_SOURCE_RUNNING                           0\n#define MA_PA_SOURCE_IDLE                              1\n#define MA_PA_SOURCE_SUSPENDED                         2\n\ntypedef int ma_pa_seek_mode_t;\n#define MA_PA_SEEK_RELATIVE                            0\n#define MA_PA_SEEK_ABSOLUTE                            1\n#define MA_PA_SEEK_RELATIVE_ON_READ                    2\n#define MA_PA_SEEK_RELATIVE_END                        3\n\ntypedef int ma_pa_channel_position_t;\n#define MA_PA_CHANNEL_POSITION_INVALID                 -1\n#define MA_PA_CHANNEL_POSITION_MONO                    0\n#define MA_PA_CHANNEL_POSITION_FRONT_LEFT              1\n#define MA_PA_CHANNEL_POSITION_FRONT_RIGHT             2\n#define MA_PA_CHANNEL_POSITION_FRONT_CENTER            3\n#define MA_PA_CHANNEL_POSITION_REAR_CENTER             4\n#define MA_PA_CHANNEL_POSITION_REAR_LEFT               5\n#define MA_PA_CHANNEL_POSITION_REAR_RIGHT              6\n#define MA_PA_CHANNEL_POSITION_LFE                     7\n#define MA_PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER    8\n#define MA_PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER   9\n#define MA_PA_CHANNEL_POSITION_SIDE_LEFT               10\n#define MA_PA_CHANNEL_POSITION_SIDE_RIGHT              11\n#define MA_PA_CHANNEL_POSITION_AUX0                    12\n#define MA_PA_CHANNEL_POSITION_AUX1                    13\n#define MA_PA_CHANNEL_POSITION_AUX2                    14\n#define MA_PA_CHANNEL_POSITION_AUX3                    15\n#define MA_PA_CHANNEL_POSITION_AUX4                    16\n#define MA_PA_CHANNEL_POSITION_AUX5                    17\n#define MA_PA_CHANNEL_POSITION_AUX6                    18\n#define MA_PA_CHANNEL_POSITION_AUX7                    19\n#define MA_PA_CHANNEL_POSITION_AUX8                    20\n#define MA_PA_CHANNEL_POSITION_AUX9                    21\n#define MA_PA_CHANNEL_POSITION_AUX10                   22\n#define MA_PA_CHANNEL_POSITION_AUX11                   23\n#define MA_PA_CHANNEL_POSITION_AUX12                   24\n#define MA_PA_CHANNEL_POSITION_AUX13                   25\n#define MA_PA_CHANNEL_POSITION_AUX14                   26\n#define MA_PA_CHANNEL_POSITION_AUX15                   27\n#define MA_PA_CHANNEL_POSITION_AUX16                   28\n#define MA_PA_CHANNEL_POSITION_AUX17                   29\n#define MA_PA_CHANNEL_POSITION_AUX18                   30\n#define MA_PA_CHANNEL_POSITION_AUX19                   31\n#define MA_PA_CHANNEL_POSITION_AUX20                   32\n#define MA_PA_CHANNEL_POSITION_AUX21                   33\n#define MA_PA_CHANNEL_POSITION_AUX22                   34\n#define MA_PA_CHANNEL_POSITION_AUX23                   35\n#define MA_PA_CHANNEL_POSITION_AUX24                   36\n#define MA_PA_CHANNEL_POSITION_AUX25                   37\n#define MA_PA_CHANNEL_POSITION_AUX26                   38\n#define MA_PA_CHANNEL_POSITION_AUX27                   39\n#define MA_PA_CHANNEL_POSITION_AUX28                   40\n#define MA_PA_CHANNEL_POSITION_AUX29                   41\n#define MA_PA_CHANNEL_POSITION_AUX30                   42\n#define MA_PA_CHANNEL_POSITION_AUX31                   43\n#define MA_PA_CHANNEL_POSITION_TOP_CENTER              44\n#define MA_PA_CHANNEL_POSITION_TOP_FRONT_LEFT          45\n#define MA_PA_CHANNEL_POSITION_TOP_FRONT_RIGHT         46\n#define MA_PA_CHANNEL_POSITION_TOP_FRONT_CENTER        47\n#define MA_PA_CHANNEL_POSITION_TOP_REAR_LEFT           48\n#define MA_PA_CHANNEL_POSITION_TOP_REAR_RIGHT          49\n#define MA_PA_CHANNEL_POSITION_TOP_REAR_CENTER         50\n#define MA_PA_CHANNEL_POSITION_LEFT                    MA_PA_CHANNEL_POSITION_FRONT_LEFT\n#define MA_PA_CHANNEL_POSITION_RIGHT                   MA_PA_CHANNEL_POSITION_FRONT_RIGHT\n#define MA_PA_CHANNEL_POSITION_CENTER                  MA_PA_CHANNEL_POSITION_FRONT_CENTER\n#define MA_PA_CHANNEL_POSITION_SUBWOOFER               MA_PA_CHANNEL_POSITION_LFE\n\ntypedef int ma_pa_channel_map_def_t;\n#define MA_PA_CHANNEL_MAP_AIFF                         0\n#define MA_PA_CHANNEL_MAP_ALSA                         1\n#define MA_PA_CHANNEL_MAP_AUX                          2\n#define MA_PA_CHANNEL_MAP_WAVEEX                       3\n#define MA_PA_CHANNEL_MAP_OSS                          4\n#define MA_PA_CHANNEL_MAP_DEFAULT                      MA_PA_CHANNEL_MAP_AIFF\n\ntypedef int ma_pa_sample_format_t;\n#define MA_PA_SAMPLE_INVALID                           -1\n#define MA_PA_SAMPLE_U8                                0\n#define MA_PA_SAMPLE_ALAW                              1\n#define MA_PA_SAMPLE_ULAW                              2\n#define MA_PA_SAMPLE_S16LE                             3\n#define MA_PA_SAMPLE_S16BE                             4\n#define MA_PA_SAMPLE_FLOAT32LE                         5\n#define MA_PA_SAMPLE_FLOAT32BE                         6\n#define MA_PA_SAMPLE_S32LE                             7\n#define MA_PA_SAMPLE_S32BE                             8\n#define MA_PA_SAMPLE_S24LE                             9\n#define MA_PA_SAMPLE_S24BE                             10\n#define MA_PA_SAMPLE_S24_32LE                          11\n#define MA_PA_SAMPLE_S24_32BE                          12\n\ntypedef struct ma_pa_mainloop           ma_pa_mainloop;\ntypedef struct ma_pa_threaded_mainloop  ma_pa_threaded_mainloop;\ntypedef struct ma_pa_mainloop_api       ma_pa_mainloop_api;\ntypedef struct ma_pa_context            ma_pa_context;\ntypedef struct ma_pa_operation          ma_pa_operation;\ntypedef struct ma_pa_stream             ma_pa_stream;\ntypedef struct ma_pa_spawn_api          ma_pa_spawn_api;\n\ntypedef struct\n{\n    ma_uint32 maxlength;\n    ma_uint32 tlength;\n    ma_uint32 prebuf;\n    ma_uint32 minreq;\n    ma_uint32 fragsize;\n} ma_pa_buffer_attr;\n\ntypedef struct\n{\n    ma_uint8 channels;\n    ma_pa_channel_position_t map[MA_PA_CHANNELS_MAX];\n} ma_pa_channel_map;\n\ntypedef struct\n{\n    ma_uint8 channels;\n    ma_uint32 values[MA_PA_CHANNELS_MAX];\n} ma_pa_cvolume;\n\ntypedef struct\n{\n    ma_pa_sample_format_t format;\n    ma_uint32 rate;\n    ma_uint8 channels;\n} ma_pa_sample_spec;\n\ntypedef struct\n{\n    const char* name;\n    ma_uint32 index;\n    const char* description;\n    ma_pa_sample_spec sample_spec;\n    ma_pa_channel_map channel_map;\n    ma_uint32 owner_module;\n    ma_pa_cvolume volume;\n    int mute;\n    ma_uint32 monitor_source;\n    const char* monitor_source_name;\n    ma_uint64 latency;\n    const char* driver;\n    ma_pa_sink_flags_t flags;\n    void* proplist;\n    ma_uint64 configured_latency;\n    ma_uint32 base_volume;\n    ma_pa_sink_state_t state;\n    ma_uint32 n_volume_steps;\n    ma_uint32 card;\n    ma_uint32 n_ports;\n    void** ports;\n    void* active_port;\n    ma_uint8 n_formats;\n    void** formats;\n} ma_pa_sink_info;\n\ntypedef struct\n{\n    const char *name;\n    ma_uint32 index;\n    const char *description;\n    ma_pa_sample_spec sample_spec;\n    ma_pa_channel_map channel_map;\n    ma_uint32 owner_module;\n    ma_pa_cvolume volume;\n    int mute;\n    ma_uint32 monitor_of_sink;\n    const char *monitor_of_sink_name;\n    ma_uint64 latency;\n    const char *driver;\n    ma_pa_source_flags_t flags;\n    void* proplist;\n    ma_uint64 configured_latency;\n    ma_uint32 base_volume;\n    ma_pa_source_state_t state;\n    ma_uint32 n_volume_steps;\n    ma_uint32 card;\n    ma_uint32 n_ports;\n    void** ports;\n    void* active_port;\n    ma_uint8 n_formats;\n    void** formats;\n} ma_pa_source_info;\n\ntypedef void (* ma_pa_context_notify_cb_t)(ma_pa_context* c, void* userdata);\ntypedef void (* ma_pa_sink_info_cb_t)     (ma_pa_context* c, const ma_pa_sink_info* i, int eol, void* userdata);\ntypedef void (* ma_pa_source_info_cb_t)   (ma_pa_context* c, const ma_pa_source_info* i, int eol, void* userdata);\ntypedef void (* ma_pa_stream_success_cb_t)(ma_pa_stream* s, int success, void* userdata);\ntypedef void (* ma_pa_stream_request_cb_t)(ma_pa_stream* s, size_t nbytes, void* userdata);\ntypedef void (* ma_pa_stream_notify_cb_t) (ma_pa_stream* s, void* userdata);\ntypedef void (* ma_pa_free_cb_t)          (void* p);\n#endif\n\n\ntypedef ma_pa_mainloop*          (* ma_pa_mainloop_new_proc)                   (void);\ntypedef void                     (* ma_pa_mainloop_free_proc)                  (ma_pa_mainloop* m);\ntypedef void                     (* ma_pa_mainloop_quit_proc)                  (ma_pa_mainloop* m, int retval);\ntypedef ma_pa_mainloop_api*      (* ma_pa_mainloop_get_api_proc)               (ma_pa_mainloop* m);\ntypedef int                      (* ma_pa_mainloop_iterate_proc)               (ma_pa_mainloop* m, int block, int* retval);\ntypedef void                     (* ma_pa_mainloop_wakeup_proc)                (ma_pa_mainloop* m);\ntypedef ma_pa_threaded_mainloop* (* ma_pa_threaded_mainloop_new_proc)          (void);\ntypedef void                     (* ma_pa_threaded_mainloop_free_proc)         (ma_pa_threaded_mainloop* m);\ntypedef int                      (* ma_pa_threaded_mainloop_start_proc)        (ma_pa_threaded_mainloop* m);\ntypedef void                     (* ma_pa_threaded_mainloop_stop_proc)         (ma_pa_threaded_mainloop* m);\ntypedef void                     (* ma_pa_threaded_mainloop_lock_proc)         (ma_pa_threaded_mainloop* m);\ntypedef void                     (* ma_pa_threaded_mainloop_unlock_proc)       (ma_pa_threaded_mainloop* m);\ntypedef void                     (* ma_pa_threaded_mainloop_wait_proc)         (ma_pa_threaded_mainloop* m);\ntypedef void                     (* ma_pa_threaded_mainloop_signal_proc)       (ma_pa_threaded_mainloop* m, int wait_for_accept);\ntypedef void                     (* ma_pa_threaded_mainloop_accept_proc)       (ma_pa_threaded_mainloop* m);\ntypedef int                      (* ma_pa_threaded_mainloop_get_retval_proc)   (ma_pa_threaded_mainloop* m);\ntypedef ma_pa_mainloop_api*      (* ma_pa_threaded_mainloop_get_api_proc)      (ma_pa_threaded_mainloop* m);\ntypedef int                      (* ma_pa_threaded_mainloop_in_thread_proc)    (ma_pa_threaded_mainloop* m);\ntypedef void                     (* ma_pa_threaded_mainloop_set_name_proc)     (ma_pa_threaded_mainloop* m, const char* name);\ntypedef ma_pa_context*           (* ma_pa_context_new_proc)                    (ma_pa_mainloop_api* mainloop, const char* name);\ntypedef void                     (* ma_pa_context_unref_proc)                  (ma_pa_context* c);\ntypedef int                      (* ma_pa_context_connect_proc)                (ma_pa_context* c, const char* server, ma_pa_context_flags_t flags, const ma_pa_spawn_api* api);\ntypedef void                     (* ma_pa_context_disconnect_proc)             (ma_pa_context* c);\ntypedef void                     (* ma_pa_context_set_state_callback_proc)     (ma_pa_context* c, ma_pa_context_notify_cb_t cb, void* userdata);\ntypedef ma_pa_context_state_t    (* ma_pa_context_get_state_proc)              (ma_pa_context* c);\ntypedef ma_pa_operation*         (* ma_pa_context_get_sink_info_list_proc)     (ma_pa_context* c, ma_pa_sink_info_cb_t cb, void* userdata);\ntypedef ma_pa_operation*         (* ma_pa_context_get_source_info_list_proc)   (ma_pa_context* c, ma_pa_source_info_cb_t cb, void* userdata);\ntypedef ma_pa_operation*         (* ma_pa_context_get_sink_info_by_name_proc)  (ma_pa_context* c, const char* name, ma_pa_sink_info_cb_t cb, void* userdata);\ntypedef ma_pa_operation*         (* ma_pa_context_get_source_info_by_name_proc)(ma_pa_context* c, const char* name, ma_pa_source_info_cb_t cb, void* userdata);\ntypedef void                     (* ma_pa_operation_unref_proc)                (ma_pa_operation* o);\ntypedef ma_pa_operation_state_t  (* ma_pa_operation_get_state_proc)            (ma_pa_operation* o);\ntypedef ma_pa_channel_map*       (* ma_pa_channel_map_init_extend_proc)        (ma_pa_channel_map* m, unsigned channels, ma_pa_channel_map_def_t def);\ntypedef int                      (* ma_pa_channel_map_valid_proc)              (const ma_pa_channel_map* m);\ntypedef int                      (* ma_pa_channel_map_compatible_proc)         (const ma_pa_channel_map* m, const ma_pa_sample_spec* ss);\ntypedef ma_pa_stream*            (* ma_pa_stream_new_proc)                     (ma_pa_context* c, const char* name, const ma_pa_sample_spec* ss, const ma_pa_channel_map* map);\ntypedef void                     (* ma_pa_stream_unref_proc)                   (ma_pa_stream* s);\ntypedef int                      (* ma_pa_stream_connect_playback_proc)        (ma_pa_stream* s, const char* dev, const ma_pa_buffer_attr* attr, ma_pa_stream_flags_t flags, const ma_pa_cvolume* volume, ma_pa_stream* sync_stream);\ntypedef int                      (* ma_pa_stream_connect_record_proc)          (ma_pa_stream* s, const char* dev, const ma_pa_buffer_attr* attr, ma_pa_stream_flags_t flags);\ntypedef int                      (* ma_pa_stream_disconnect_proc)              (ma_pa_stream* s);\ntypedef ma_pa_stream_state_t     (* ma_pa_stream_get_state_proc)               (ma_pa_stream* s);\ntypedef const ma_pa_sample_spec* (* ma_pa_stream_get_sample_spec_proc)         (ma_pa_stream* s);\ntypedef const ma_pa_channel_map* (* ma_pa_stream_get_channel_map_proc)         (ma_pa_stream* s);\ntypedef const ma_pa_buffer_attr* (* ma_pa_stream_get_buffer_attr_proc)         (ma_pa_stream* s);\ntypedef ma_pa_operation*         (* ma_pa_stream_set_buffer_attr_proc)         (ma_pa_stream* s, const ma_pa_buffer_attr* attr, ma_pa_stream_success_cb_t cb, void* userdata);\ntypedef const char*              (* ma_pa_stream_get_device_name_proc)         (ma_pa_stream* s);\ntypedef void                     (* ma_pa_stream_set_write_callback_proc)      (ma_pa_stream* s, ma_pa_stream_request_cb_t cb, void* userdata);\ntypedef void                     (* ma_pa_stream_set_read_callback_proc)       (ma_pa_stream* s, ma_pa_stream_request_cb_t cb, void* userdata);\ntypedef void                     (* ma_pa_stream_set_suspended_callback_proc)  (ma_pa_stream* s, ma_pa_stream_notify_cb_t cb, void* userdata);\ntypedef void                     (* ma_pa_stream_set_moved_callback_proc)      (ma_pa_stream* s, ma_pa_stream_notify_cb_t cb, void* userdata);\ntypedef int                      (* ma_pa_stream_is_suspended_proc)            (const ma_pa_stream* s);\ntypedef ma_pa_operation*         (* ma_pa_stream_flush_proc)                   (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata);\ntypedef ma_pa_operation*         (* ma_pa_stream_drain_proc)                   (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata);\ntypedef int                      (* ma_pa_stream_is_corked_proc)               (ma_pa_stream* s);\ntypedef ma_pa_operation*         (* ma_pa_stream_cork_proc)                    (ma_pa_stream* s, int b, ma_pa_stream_success_cb_t cb, void* userdata);\ntypedef ma_pa_operation*         (* ma_pa_stream_trigger_proc)                 (ma_pa_stream* s, ma_pa_stream_success_cb_t cb, void* userdata);\ntypedef int                      (* ma_pa_stream_begin_write_proc)             (ma_pa_stream* s, void** data, size_t* nbytes);\ntypedef int                      (* ma_pa_stream_write_proc)                   (ma_pa_stream* s, const void* data, size_t nbytes, ma_pa_free_cb_t free_cb, int64_t offset, ma_pa_seek_mode_t seek);\ntypedef int                      (* ma_pa_stream_peek_proc)                    (ma_pa_stream* s, const void** data, size_t* nbytes);\ntypedef int                      (* ma_pa_stream_drop_proc)                    (ma_pa_stream* s);\ntypedef size_t                   (* ma_pa_stream_writable_size_proc)           (ma_pa_stream* s);\ntypedef size_t                   (* ma_pa_stream_readable_size_proc)           (ma_pa_stream* s);\n\ntypedef struct\n{\n    ma_uint32 count;\n    ma_uint32 capacity;\n    ma_device_info* pInfo;\n} ma_pulse_device_enum_data;\n\nstatic ma_result ma_result_from_pulse(int result)\n{\n    if (result < 0) {\n        return MA_ERROR;\n    }\n\n    switch (result) {\n        case MA_PA_OK:           return MA_SUCCESS;\n        case MA_PA_ERR_ACCESS:   return MA_ACCESS_DENIED;\n        case MA_PA_ERR_INVALID:  return MA_INVALID_ARGS;\n        case MA_PA_ERR_NOENTITY: return MA_NO_DEVICE;\n        default:                 return MA_ERROR;\n    }\n}\n\n#if 0\nstatic ma_pa_sample_format_t ma_format_to_pulse(ma_format format)\n{\n    if (ma_is_little_endian()) {\n        switch (format) {\n            case ma_format_s16: return MA_PA_SAMPLE_S16LE;\n            case ma_format_s24: return MA_PA_SAMPLE_S24LE;\n            case ma_format_s32: return MA_PA_SAMPLE_S32LE;\n            case ma_format_f32: return MA_PA_SAMPLE_FLOAT32LE;\n            default: break;\n        }\n    } else {\n        switch (format) {\n            case ma_format_s16: return MA_PA_SAMPLE_S16BE;\n            case ma_format_s24: return MA_PA_SAMPLE_S24BE;\n            case ma_format_s32: return MA_PA_SAMPLE_S32BE;\n            case ma_format_f32: return MA_PA_SAMPLE_FLOAT32BE;\n            default: break;\n        }\n    }\n\n    /* Endian agnostic. */\n    switch (format) {\n        case ma_format_u8: return MA_PA_SAMPLE_U8;\n        default: return MA_PA_SAMPLE_INVALID;\n    }\n}\n#endif\n\nstatic ma_format ma_format_from_pulse(ma_pa_sample_format_t format)\n{\n    if (ma_is_little_endian()) {\n        switch (format) {\n            case MA_PA_SAMPLE_S16LE:     return ma_format_s16;\n            case MA_PA_SAMPLE_S24LE:     return ma_format_s24;\n            case MA_PA_SAMPLE_S32LE:     return ma_format_s32;\n            case MA_PA_SAMPLE_FLOAT32LE: return ma_format_f32;\n            default: break;\n        }\n    } else {\n        switch (format) {\n            case MA_PA_SAMPLE_S16BE:     return ma_format_s16;\n            case MA_PA_SAMPLE_S24BE:     return ma_format_s24;\n            case MA_PA_SAMPLE_S32BE:     return ma_format_s32;\n            case MA_PA_SAMPLE_FLOAT32BE: return ma_format_f32;\n            default: break;\n        }\n    }\n\n    /* Endian agnostic. */\n    switch (format) {\n        case MA_PA_SAMPLE_U8: return ma_format_u8;\n        default: return ma_format_unknown;\n    }\n}\n\nstatic ma_channel ma_channel_position_from_pulse(ma_pa_channel_position_t position)\n{\n    switch (position)\n    {\n        case MA_PA_CHANNEL_POSITION_INVALID:               return MA_CHANNEL_NONE;\n        case MA_PA_CHANNEL_POSITION_MONO:                  return MA_CHANNEL_MONO;\n        case MA_PA_CHANNEL_POSITION_FRONT_LEFT:            return MA_CHANNEL_FRONT_LEFT;\n        case MA_PA_CHANNEL_POSITION_FRONT_RIGHT:           return MA_CHANNEL_FRONT_RIGHT;\n        case MA_PA_CHANNEL_POSITION_FRONT_CENTER:          return MA_CHANNEL_FRONT_CENTER;\n        case MA_PA_CHANNEL_POSITION_REAR_CENTER:           return MA_CHANNEL_BACK_CENTER;\n        case MA_PA_CHANNEL_POSITION_REAR_LEFT:             return MA_CHANNEL_BACK_LEFT;\n        case MA_PA_CHANNEL_POSITION_REAR_RIGHT:            return MA_CHANNEL_BACK_RIGHT;\n        case MA_PA_CHANNEL_POSITION_LFE:                   return MA_CHANNEL_LFE;\n        case MA_PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER:  return MA_CHANNEL_FRONT_LEFT_CENTER;\n        case MA_PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER: return MA_CHANNEL_FRONT_RIGHT_CENTER;\n        case MA_PA_CHANNEL_POSITION_SIDE_LEFT:             return MA_CHANNEL_SIDE_LEFT;\n        case MA_PA_CHANNEL_POSITION_SIDE_RIGHT:            return MA_CHANNEL_SIDE_RIGHT;\n        case MA_PA_CHANNEL_POSITION_AUX0:                  return MA_CHANNEL_AUX_0;\n        case MA_PA_CHANNEL_POSITION_AUX1:                  return MA_CHANNEL_AUX_1;\n        case MA_PA_CHANNEL_POSITION_AUX2:                  return MA_CHANNEL_AUX_2;\n        case MA_PA_CHANNEL_POSITION_AUX3:                  return MA_CHANNEL_AUX_3;\n        case MA_PA_CHANNEL_POSITION_AUX4:                  return MA_CHANNEL_AUX_4;\n        case MA_PA_CHANNEL_POSITION_AUX5:                  return MA_CHANNEL_AUX_5;\n        case MA_PA_CHANNEL_POSITION_AUX6:                  return MA_CHANNEL_AUX_6;\n        case MA_PA_CHANNEL_POSITION_AUX7:                  return MA_CHANNEL_AUX_7;\n        case MA_PA_CHANNEL_POSITION_AUX8:                  return MA_CHANNEL_AUX_8;\n        case MA_PA_CHANNEL_POSITION_AUX9:                  return MA_CHANNEL_AUX_9;\n        case MA_PA_CHANNEL_POSITION_AUX10:                 return MA_CHANNEL_AUX_10;\n        case MA_PA_CHANNEL_POSITION_AUX11:                 return MA_CHANNEL_AUX_11;\n        case MA_PA_CHANNEL_POSITION_AUX12:                 return MA_CHANNEL_AUX_12;\n        case MA_PA_CHANNEL_POSITION_AUX13:                 return MA_CHANNEL_AUX_13;\n        case MA_PA_CHANNEL_POSITION_AUX14:                 return MA_CHANNEL_AUX_14;\n        case MA_PA_CHANNEL_POSITION_AUX15:                 return MA_CHANNEL_AUX_15;\n        case MA_PA_CHANNEL_POSITION_AUX16:                 return MA_CHANNEL_AUX_16;\n        case MA_PA_CHANNEL_POSITION_AUX17:                 return MA_CHANNEL_AUX_17;\n        case MA_PA_CHANNEL_POSITION_AUX18:                 return MA_CHANNEL_AUX_18;\n        case MA_PA_CHANNEL_POSITION_AUX19:                 return MA_CHANNEL_AUX_19;\n        case MA_PA_CHANNEL_POSITION_AUX20:                 return MA_CHANNEL_AUX_20;\n        case MA_PA_CHANNEL_POSITION_AUX21:                 return MA_CHANNEL_AUX_21;\n        case MA_PA_CHANNEL_POSITION_AUX22:                 return MA_CHANNEL_AUX_22;\n        case MA_PA_CHANNEL_POSITION_AUX23:                 return MA_CHANNEL_AUX_23;\n        case MA_PA_CHANNEL_POSITION_AUX24:                 return MA_CHANNEL_AUX_24;\n        case MA_PA_CHANNEL_POSITION_AUX25:                 return MA_CHANNEL_AUX_25;\n        case MA_PA_CHANNEL_POSITION_AUX26:                 return MA_CHANNEL_AUX_26;\n        case MA_PA_CHANNEL_POSITION_AUX27:                 return MA_CHANNEL_AUX_27;\n        case MA_PA_CHANNEL_POSITION_AUX28:                 return MA_CHANNEL_AUX_28;\n        case MA_PA_CHANNEL_POSITION_AUX29:                 return MA_CHANNEL_AUX_29;\n        case MA_PA_CHANNEL_POSITION_AUX30:                 return MA_CHANNEL_AUX_30;\n        case MA_PA_CHANNEL_POSITION_AUX31:                 return MA_CHANNEL_AUX_31;\n        case MA_PA_CHANNEL_POSITION_TOP_CENTER:            return MA_CHANNEL_TOP_CENTER;\n        case MA_PA_CHANNEL_POSITION_TOP_FRONT_LEFT:        return MA_CHANNEL_TOP_FRONT_LEFT;\n        case MA_PA_CHANNEL_POSITION_TOP_FRONT_RIGHT:       return MA_CHANNEL_TOP_FRONT_RIGHT;\n        case MA_PA_CHANNEL_POSITION_TOP_FRONT_CENTER:      return MA_CHANNEL_TOP_FRONT_CENTER;\n        case MA_PA_CHANNEL_POSITION_TOP_REAR_LEFT:         return MA_CHANNEL_TOP_BACK_LEFT;\n        case MA_PA_CHANNEL_POSITION_TOP_REAR_RIGHT:        return MA_CHANNEL_TOP_BACK_RIGHT;\n        case MA_PA_CHANNEL_POSITION_TOP_REAR_CENTER:       return MA_CHANNEL_TOP_BACK_CENTER;\n        default: return MA_CHANNEL_NONE;\n    }\n}\n\n#if 0\nstatic ma_pa_channel_position_t ma_channel_position_to_pulse(ma_channel position)\n{\n    switch (position)\n    {\n        case MA_CHANNEL_NONE:               return MA_PA_CHANNEL_POSITION_INVALID;\n        case MA_CHANNEL_FRONT_LEFT:         return MA_PA_CHANNEL_POSITION_FRONT_LEFT;\n        case MA_CHANNEL_FRONT_RIGHT:        return MA_PA_CHANNEL_POSITION_FRONT_RIGHT;\n        case MA_CHANNEL_FRONT_CENTER:       return MA_PA_CHANNEL_POSITION_FRONT_CENTER;\n        case MA_CHANNEL_LFE:                return MA_PA_CHANNEL_POSITION_LFE;\n        case MA_CHANNEL_BACK_LEFT:          return MA_PA_CHANNEL_POSITION_REAR_LEFT;\n        case MA_CHANNEL_BACK_RIGHT:         return MA_PA_CHANNEL_POSITION_REAR_RIGHT;\n        case MA_CHANNEL_FRONT_LEFT_CENTER:  return MA_PA_CHANNEL_POSITION_FRONT_LEFT_OF_CENTER;\n        case MA_CHANNEL_FRONT_RIGHT_CENTER: return MA_PA_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER;\n        case MA_CHANNEL_BACK_CENTER:        return MA_PA_CHANNEL_POSITION_REAR_CENTER;\n        case MA_CHANNEL_SIDE_LEFT:          return MA_PA_CHANNEL_POSITION_SIDE_LEFT;\n        case MA_CHANNEL_SIDE_RIGHT:         return MA_PA_CHANNEL_POSITION_SIDE_RIGHT;\n        case MA_CHANNEL_TOP_CENTER:         return MA_PA_CHANNEL_POSITION_TOP_CENTER;\n        case MA_CHANNEL_TOP_FRONT_LEFT:     return MA_PA_CHANNEL_POSITION_TOP_FRONT_LEFT;\n        case MA_CHANNEL_TOP_FRONT_CENTER:   return MA_PA_CHANNEL_POSITION_TOP_FRONT_CENTER;\n        case MA_CHANNEL_TOP_FRONT_RIGHT:    return MA_PA_CHANNEL_POSITION_TOP_FRONT_RIGHT;\n        case MA_CHANNEL_TOP_BACK_LEFT:      return MA_PA_CHANNEL_POSITION_TOP_REAR_LEFT;\n        case MA_CHANNEL_TOP_BACK_CENTER:    return MA_PA_CHANNEL_POSITION_TOP_REAR_CENTER;\n        case MA_CHANNEL_TOP_BACK_RIGHT:     return MA_PA_CHANNEL_POSITION_TOP_REAR_RIGHT;\n        case MA_CHANNEL_19:                 return MA_PA_CHANNEL_POSITION_AUX18;\n        case MA_CHANNEL_20:                 return MA_PA_CHANNEL_POSITION_AUX19;\n        case MA_CHANNEL_21:                 return MA_PA_CHANNEL_POSITION_AUX20;\n        case MA_CHANNEL_22:                 return MA_PA_CHANNEL_POSITION_AUX21;\n        case MA_CHANNEL_23:                 return MA_PA_CHANNEL_POSITION_AUX22;\n        case MA_CHANNEL_24:                 return MA_PA_CHANNEL_POSITION_AUX23;\n        case MA_CHANNEL_25:                 return MA_PA_CHANNEL_POSITION_AUX24;\n        case MA_CHANNEL_26:                 return MA_PA_CHANNEL_POSITION_AUX25;\n        case MA_CHANNEL_27:                 return MA_PA_CHANNEL_POSITION_AUX26;\n        case MA_CHANNEL_28:                 return MA_PA_CHANNEL_POSITION_AUX27;\n        case MA_CHANNEL_29:                 return MA_PA_CHANNEL_POSITION_AUX28;\n        case MA_CHANNEL_30:                 return MA_PA_CHANNEL_POSITION_AUX29;\n        case MA_CHANNEL_31:                 return MA_PA_CHANNEL_POSITION_AUX30;\n        case MA_CHANNEL_32:                 return MA_PA_CHANNEL_POSITION_AUX31;\n        default: return (ma_pa_channel_position_t)position;\n    }\n}\n#endif\n\nstatic ma_result ma_wait_for_operation__pulse(ma_context* pContext, ma_ptr pMainLoop, ma_pa_operation* pOP)\n{\n    int resultPA;\n    ma_pa_operation_state_t state;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pOP != NULL);\n\n    for (;;) {\n        state = ((ma_pa_operation_get_state_proc)pContext->pulse.pa_operation_get_state)(pOP);\n        if (state != MA_PA_OPERATION_RUNNING) {\n            break;  /* Done. */\n        }\n\n        resultPA = ((ma_pa_mainloop_iterate_proc)pContext->pulse.pa_mainloop_iterate)((ma_pa_mainloop*)pMainLoop, 1, NULL);\n        if (resultPA < 0) {\n            return ma_result_from_pulse(resultPA);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_wait_for_operation_and_unref__pulse(ma_context* pContext, ma_ptr pMainLoop, ma_pa_operation* pOP)\n{\n    ma_result result;\n\n    if (pOP == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_wait_for_operation__pulse(pContext, pMainLoop, pOP);\n    ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP);\n\n    return result;\n}\n\nstatic ma_result ma_wait_for_pa_context_to_connect__pulse(ma_context* pContext, ma_ptr pMainLoop, ma_ptr pPulseContext)\n{\n    int resultPA;\n    ma_pa_context_state_t state;\n\n    for (;;) {\n        state = ((ma_pa_context_get_state_proc)pContext->pulse.pa_context_get_state)((ma_pa_context*)pPulseContext);\n        if (state == MA_PA_CONTEXT_READY) {\n            break;  /* Done. */\n        }\n\n        if (state == MA_PA_CONTEXT_FAILED || state == MA_PA_CONTEXT_TERMINATED) {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[PulseAudio] An error occurred while connecting the PulseAudio context.\");\n            return MA_ERROR;\n        }\n\n        resultPA = ((ma_pa_mainloop_iterate_proc)pContext->pulse.pa_mainloop_iterate)((ma_pa_mainloop*)pMainLoop, 1, NULL);\n        if (resultPA < 0) {\n            return ma_result_from_pulse(resultPA);\n        }\n    }\n\n    /* Should never get here. */\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_wait_for_pa_stream_to_connect__pulse(ma_context* pContext, ma_ptr pMainLoop, ma_ptr pStream)\n{\n    int resultPA;\n    ma_pa_stream_state_t state;\n\n    for (;;) {\n        state = ((ma_pa_stream_get_state_proc)pContext->pulse.pa_stream_get_state)((ma_pa_stream*)pStream);\n        if (state == MA_PA_STREAM_READY) {\n            break;  /* Done. */\n        }\n\n        if (state == MA_PA_STREAM_FAILED || state == MA_PA_STREAM_TERMINATED) {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[PulseAudio] An error occurred while connecting the PulseAudio stream.\");\n            return MA_ERROR;\n        }\n\n        resultPA = ((ma_pa_mainloop_iterate_proc)pContext->pulse.pa_mainloop_iterate)((ma_pa_mainloop*)pMainLoop, 1, NULL);\n        if (resultPA < 0) {\n            return ma_result_from_pulse(resultPA);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_init_pa_mainloop_and_pa_context__pulse(ma_context* pContext, const char* pApplicationName, const char* pServerName, ma_bool32 tryAutoSpawn, ma_ptr* ppMainLoop, ma_ptr* ppPulseContext)\n{\n    ma_result result;\n    ma_ptr pMainLoop;\n    ma_ptr pPulseContext;\n\n    MA_ASSERT(ppMainLoop     != NULL);\n    MA_ASSERT(ppPulseContext != NULL);\n\n    /* The PulseAudio context maps well to miniaudio's notion of a context. The pa_context object will be initialized as part of the ma_context. */\n    pMainLoop = ((ma_pa_mainloop_new_proc)pContext->pulse.pa_mainloop_new)();\n    if (pMainLoop == NULL) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to create mainloop.\");\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    pPulseContext = ((ma_pa_context_new_proc)pContext->pulse.pa_context_new)(((ma_pa_mainloop_get_api_proc)pContext->pulse.pa_mainloop_get_api)((ma_pa_mainloop*)pMainLoop), pApplicationName);\n    if (pPulseContext == NULL) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to create PulseAudio context.\");\n        ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)(pMainLoop));\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    /* Now we need to connect to the context. Everything is asynchronous so we need to wait for it to connect before returning. */\n    result = ma_result_from_pulse(((ma_pa_context_connect_proc)pContext->pulse.pa_context_connect)((ma_pa_context*)pPulseContext, pServerName, (tryAutoSpawn) ? 0 : MA_PA_CONTEXT_NOAUTOSPAWN, NULL));\n    if (result != MA_SUCCESS) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to connect PulseAudio context.\");\n        ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)(pMainLoop));\n        return result;\n    }\n\n    /* Since ma_context_init() runs synchronously we need to wait for the PulseAudio context to connect before we return. */\n    result = ma_wait_for_pa_context_to_connect__pulse(pContext, pMainLoop, pPulseContext);\n    if (result != MA_SUCCESS) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Waiting for connection failed.\");\n        ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)(pMainLoop));\n        return result;\n    }\n\n    *ppMainLoop     = pMainLoop;\n    *ppPulseContext = pPulseContext;\n\n    return MA_SUCCESS;\n}\n\n\nstatic void ma_device_sink_info_callback(ma_pa_context* pPulseContext, const ma_pa_sink_info* pInfo, int endOfList, void* pUserData)\n{\n    ma_pa_sink_info* pInfoOut;\n\n    if (endOfList > 0) {\n        return;\n    }\n\n    /*\n    There has been a report that indicates that pInfo can be null which results\n    in a null pointer dereference below. We'll check for this for safety.\n    */\n    if (pInfo == NULL) {\n        return;\n    }\n\n    pInfoOut = (ma_pa_sink_info*)pUserData;\n    MA_ASSERT(pInfoOut != NULL);\n\n    *pInfoOut = *pInfo;\n\n    (void)pPulseContext; /* Unused. */\n}\n\nstatic void ma_device_source_info_callback(ma_pa_context* pPulseContext, const ma_pa_source_info* pInfo, int endOfList, void* pUserData)\n{\n    ma_pa_source_info* pInfoOut;\n\n    if (endOfList > 0) {\n        return;\n    }\n\n    /*\n    There has been a report that indicates that pInfo can be null which results\n    in a null pointer dereference below. We'll check for this for safety.\n    */\n    if (pInfo == NULL) {\n        return;\n    }\n\n    pInfoOut = (ma_pa_source_info*)pUserData;\n    MA_ASSERT(pInfoOut != NULL);\n\n    *pInfoOut = *pInfo;\n\n    (void)pPulseContext; /* Unused. */\n}\n\n#if 0\nstatic void ma_device_sink_name_callback(ma_pa_context* pPulseContext, const ma_pa_sink_info* pInfo, int endOfList, void* pUserData)\n{\n    ma_device* pDevice;\n\n    if (endOfList > 0) {\n        return;\n    }\n\n    pDevice = (ma_device*)pUserData;\n    MA_ASSERT(pDevice != NULL);\n\n    ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), pInfo->description, (size_t)-1);\n\n    (void)pPulseContext; /* Unused. */\n}\n\nstatic void ma_device_source_name_callback(ma_pa_context* pPulseContext, const ma_pa_source_info* pInfo, int endOfList, void* pUserData)\n{\n    ma_device* pDevice;\n\n    if (endOfList > 0) {\n        return;\n    }\n\n    pDevice = (ma_device*)pUserData;\n    MA_ASSERT(pDevice != NULL);\n\n    ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), pInfo->description, (size_t)-1);\n\n    (void)pPulseContext; /* Unused. */\n}\n#endif\n\nstatic ma_result ma_context_get_sink_info__pulse(ma_context* pContext, const char* pDeviceName, ma_pa_sink_info* pSinkInfo)\n{\n    ma_pa_operation* pOP;\n\n    pOP = ((ma_pa_context_get_sink_info_by_name_proc)pContext->pulse.pa_context_get_sink_info_by_name)((ma_pa_context*)pContext->pulse.pPulseContext, pDeviceName, ma_device_sink_info_callback, pSinkInfo);\n    if (pOP == NULL) {\n        return MA_ERROR;\n    }\n\n    return ma_wait_for_operation_and_unref__pulse(pContext, pContext->pulse.pMainLoop, pOP);\n}\n\nstatic ma_result ma_context_get_source_info__pulse(ma_context* pContext, const char* pDeviceName, ma_pa_source_info* pSourceInfo)\n{\n    ma_pa_operation* pOP;\n\n    pOP = ((ma_pa_context_get_source_info_by_name_proc)pContext->pulse.pa_context_get_source_info_by_name)((ma_pa_context*)pContext->pulse.pPulseContext, pDeviceName, ma_device_source_info_callback, pSourceInfo);\n    if (pOP == NULL) {\n        return MA_ERROR;\n    }\n\n    return ma_wait_for_operation_and_unref__pulse(pContext, pContext->pulse.pMainLoop, pOP);\n}\n\nstatic ma_result ma_context_get_default_device_index__pulse(ma_context* pContext, ma_device_type deviceType, ma_uint32* pIndex)\n{\n    ma_result result;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pIndex   != NULL);\n\n    if (pIndex != NULL) {\n        *pIndex = (ma_uint32)-1;\n    }\n\n    if (deviceType == ma_device_type_playback) {\n        ma_pa_sink_info sinkInfo;\n        result = ma_context_get_sink_info__pulse(pContext, NULL, &sinkInfo);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        if (pIndex != NULL) {\n            *pIndex = sinkInfo.index;\n        }\n    }\n\n    if (deviceType == ma_device_type_capture) {\n        ma_pa_source_info sourceInfo;\n        result = ma_context_get_source_info__pulse(pContext, NULL, &sourceInfo);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        if (pIndex != NULL) {\n            *pIndex = sourceInfo.index;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n\ntypedef struct\n{\n    ma_context* pContext;\n    ma_enum_devices_callback_proc callback;\n    void* pUserData;\n    ma_bool32 isTerminated;\n    ma_uint32 defaultDeviceIndexPlayback;\n    ma_uint32 defaultDeviceIndexCapture;\n} ma_context_enumerate_devices_callback_data__pulse;\n\nstatic void ma_context_enumerate_devices_sink_callback__pulse(ma_pa_context* pPulseContext, const ma_pa_sink_info* pSinkInfo, int endOfList, void* pUserData)\n{\n    ma_context_enumerate_devices_callback_data__pulse* pData = (ma_context_enumerate_devices_callback_data__pulse*)pUserData;\n    ma_device_info deviceInfo;\n\n    MA_ASSERT(pData != NULL);\n\n    if (endOfList || pData->isTerminated) {\n        return;\n    }\n\n    MA_ZERO_OBJECT(&deviceInfo);\n\n    /* The name from PulseAudio is the ID for miniaudio. */\n    if (pSinkInfo->name != NULL) {\n        ma_strncpy_s(deviceInfo.id.pulse, sizeof(deviceInfo.id.pulse), pSinkInfo->name, (size_t)-1);\n    }\n\n    /* The description from PulseAudio is the name for miniaudio. */\n    if (pSinkInfo->description != NULL) {\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), pSinkInfo->description, (size_t)-1);\n    }\n\n    if (pSinkInfo->index == pData->defaultDeviceIndexPlayback) {\n        deviceInfo.isDefault = MA_TRUE;\n    }\n\n    pData->isTerminated = !pData->callback(pData->pContext, ma_device_type_playback, &deviceInfo, pData->pUserData);\n\n    (void)pPulseContext; /* Unused. */\n}\n\nstatic void ma_context_enumerate_devices_source_callback__pulse(ma_pa_context* pPulseContext, const ma_pa_source_info* pSourceInfo, int endOfList, void* pUserData)\n{\n    ma_context_enumerate_devices_callback_data__pulse* pData = (ma_context_enumerate_devices_callback_data__pulse*)pUserData;\n    ma_device_info deviceInfo;\n\n    MA_ASSERT(pData != NULL);\n\n    if (endOfList || pData->isTerminated) {\n        return;\n    }\n\n    MA_ZERO_OBJECT(&deviceInfo);\n\n    /* The name from PulseAudio is the ID for miniaudio. */\n    if (pSourceInfo->name != NULL) {\n        ma_strncpy_s(deviceInfo.id.pulse, sizeof(deviceInfo.id.pulse), pSourceInfo->name, (size_t)-1);\n    }\n\n    /* The description from PulseAudio is the name for miniaudio. */\n    if (pSourceInfo->description != NULL) {\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), pSourceInfo->description, (size_t)-1);\n    }\n\n    if (pSourceInfo->index == pData->defaultDeviceIndexCapture) {\n        deviceInfo.isDefault = MA_TRUE;\n    }\n\n    pData->isTerminated = !pData->callback(pData->pContext, ma_device_type_capture, &deviceInfo, pData->pUserData);\n\n    (void)pPulseContext; /* Unused. */\n}\n\nstatic ma_result ma_context_enumerate_devices__pulse(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_result result = MA_SUCCESS;\n    ma_context_enumerate_devices_callback_data__pulse callbackData;\n    ma_pa_operation* pOP = NULL;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(callback != NULL);\n\n    callbackData.pContext = pContext;\n    callbackData.callback = callback;\n    callbackData.pUserData = pUserData;\n    callbackData.isTerminated = MA_FALSE;\n    callbackData.defaultDeviceIndexPlayback = (ma_uint32)-1;\n    callbackData.defaultDeviceIndexCapture  = (ma_uint32)-1;\n\n    /* We need to get the index of the default devices. */\n    ma_context_get_default_device_index__pulse(pContext, ma_device_type_playback, &callbackData.defaultDeviceIndexPlayback);\n    ma_context_get_default_device_index__pulse(pContext, ma_device_type_capture,  &callbackData.defaultDeviceIndexCapture);\n\n    /* Playback. */\n    if (!callbackData.isTerminated) {\n        pOP = ((ma_pa_context_get_sink_info_list_proc)pContext->pulse.pa_context_get_sink_info_list)((ma_pa_context*)(pContext->pulse.pPulseContext), ma_context_enumerate_devices_sink_callback__pulse, &callbackData);\n        if (pOP == NULL) {\n            result = MA_ERROR;\n            goto done;\n        }\n\n        result = ma_wait_for_operation__pulse(pContext, pContext->pulse.pMainLoop, pOP);\n        ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP);\n\n        if (result != MA_SUCCESS) {\n            goto done;\n        }\n    }\n\n\n    /* Capture. */\n    if (!callbackData.isTerminated) {\n        pOP = ((ma_pa_context_get_source_info_list_proc)pContext->pulse.pa_context_get_source_info_list)((ma_pa_context*)(pContext->pulse.pPulseContext), ma_context_enumerate_devices_source_callback__pulse, &callbackData);\n        if (pOP == NULL) {\n            result = MA_ERROR;\n            goto done;\n        }\n\n        result = ma_wait_for_operation__pulse(pContext, pContext->pulse.pMainLoop, pOP);\n        ((ma_pa_operation_unref_proc)pContext->pulse.pa_operation_unref)(pOP);\n\n        if (result != MA_SUCCESS) {\n            goto done;\n        }\n    }\n\ndone:\n    return result;\n}\n\n\ntypedef struct\n{\n    ma_device_info* pDeviceInfo;\n    ma_uint32 defaultDeviceIndex;\n    ma_bool32 foundDevice;\n} ma_context_get_device_info_callback_data__pulse;\n\nstatic void ma_context_get_device_info_sink_callback__pulse(ma_pa_context* pPulseContext, const ma_pa_sink_info* pInfo, int endOfList, void* pUserData)\n{\n    ma_context_get_device_info_callback_data__pulse* pData = (ma_context_get_device_info_callback_data__pulse*)pUserData;\n\n    if (endOfList > 0) {\n        return;\n    }\n\n    MA_ASSERT(pData != NULL);\n    pData->foundDevice = MA_TRUE;\n\n    if (pInfo->name != NULL) {\n        ma_strncpy_s(pData->pDeviceInfo->id.pulse, sizeof(pData->pDeviceInfo->id.pulse), pInfo->name, (size_t)-1);\n    }\n\n    if (pInfo->description != NULL) {\n        ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), pInfo->description, (size_t)-1);\n    }\n\n    /*\n    We're just reporting a single data format here. I think technically PulseAudio might support\n    all formats, but I don't trust that PulseAudio will do *anything* right, so I'm just going to\n    report the \"native\" device format.\n    */\n    pData->pDeviceInfo->nativeDataFormats[0].format     = ma_format_from_pulse(pInfo->sample_spec.format);\n    pData->pDeviceInfo->nativeDataFormats[0].channels   = pInfo->sample_spec.channels;\n    pData->pDeviceInfo->nativeDataFormats[0].sampleRate = pInfo->sample_spec.rate;\n    pData->pDeviceInfo->nativeDataFormats[0].flags      = 0;\n    pData->pDeviceInfo->nativeDataFormatCount = 1;\n\n    if (pData->defaultDeviceIndex == pInfo->index) {\n        pData->pDeviceInfo->isDefault = MA_TRUE;\n    }\n\n    (void)pPulseContext; /* Unused. */\n}\n\nstatic void ma_context_get_device_info_source_callback__pulse(ma_pa_context* pPulseContext, const ma_pa_source_info* pInfo, int endOfList, void* pUserData)\n{\n    ma_context_get_device_info_callback_data__pulse* pData = (ma_context_get_device_info_callback_data__pulse*)pUserData;\n\n    if (endOfList > 0) {\n        return;\n    }\n\n    MA_ASSERT(pData != NULL);\n    pData->foundDevice = MA_TRUE;\n\n    if (pInfo->name != NULL) {\n        ma_strncpy_s(pData->pDeviceInfo->id.pulse, sizeof(pData->pDeviceInfo->id.pulse), pInfo->name, (size_t)-1);\n    }\n\n    if (pInfo->description != NULL) {\n        ma_strncpy_s(pData->pDeviceInfo->name, sizeof(pData->pDeviceInfo->name), pInfo->description, (size_t)-1);\n    }\n\n    /*\n    We're just reporting a single data format here. I think technically PulseAudio might support\n    all formats, but I don't trust that PulseAudio will do *anything* right, so I'm just going to\n    report the \"native\" device format.\n    */\n    pData->pDeviceInfo->nativeDataFormats[0].format     = ma_format_from_pulse(pInfo->sample_spec.format);\n    pData->pDeviceInfo->nativeDataFormats[0].channels   = pInfo->sample_spec.channels;\n    pData->pDeviceInfo->nativeDataFormats[0].sampleRate = pInfo->sample_spec.rate;\n    pData->pDeviceInfo->nativeDataFormats[0].flags      = 0;\n    pData->pDeviceInfo->nativeDataFormatCount = 1;\n\n    if (pData->defaultDeviceIndex == pInfo->index) {\n        pData->pDeviceInfo->isDefault = MA_TRUE;\n    }\n\n    (void)pPulseContext; /* Unused. */\n}\n\nstatic ma_result ma_context_get_device_info__pulse(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    ma_result result = MA_SUCCESS;\n    ma_context_get_device_info_callback_data__pulse callbackData;\n    ma_pa_operation* pOP = NULL;\n    const char* pDeviceName = NULL;\n\n    MA_ASSERT(pContext != NULL);\n\n    callbackData.pDeviceInfo = pDeviceInfo;\n    callbackData.foundDevice = MA_FALSE;\n\n    if (pDeviceID != NULL) {\n        pDeviceName = pDeviceID->pulse;\n    } else {\n        pDeviceName = NULL;\n    }\n\n    result = ma_context_get_default_device_index__pulse(pContext, deviceType, &callbackData.defaultDeviceIndex);\n\n    if (deviceType == ma_device_type_playback) {\n        pOP = ((ma_pa_context_get_sink_info_by_name_proc)pContext->pulse.pa_context_get_sink_info_by_name)((ma_pa_context*)(pContext->pulse.pPulseContext), pDeviceName, ma_context_get_device_info_sink_callback__pulse, &callbackData);\n    } else {\n        pOP = ((ma_pa_context_get_source_info_by_name_proc)pContext->pulse.pa_context_get_source_info_by_name)((ma_pa_context*)(pContext->pulse.pPulseContext), pDeviceName, ma_context_get_device_info_source_callback__pulse, &callbackData);\n    }\n\n    if (pOP != NULL) {\n        ma_wait_for_operation_and_unref__pulse(pContext, pContext->pulse.pMainLoop, pOP);\n    } else {\n        result = MA_ERROR;\n        goto done;\n    }\n\n    if (!callbackData.foundDevice) {\n        result = MA_NO_DEVICE;\n        goto done;\n    }\n\ndone:\n    return result;\n}\n\nstatic ma_result ma_device_uninit__pulse(ma_device* pDevice)\n{\n    ma_context* pContext;\n\n    MA_ASSERT(pDevice != NULL);\n\n    pContext = pDevice->pContext;\n    MA_ASSERT(pContext != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ((ma_pa_stream_disconnect_proc)pContext->pulse.pa_stream_disconnect)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n        ((ma_pa_stream_unref_proc)pContext->pulse.pa_stream_unref)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ((ma_pa_stream_disconnect_proc)pContext->pulse.pa_stream_disconnect)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n        ((ma_pa_stream_unref_proc)pContext->pulse.pa_stream_unref)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n    }\n\n    if (pDevice->type == ma_device_type_duplex) {\n        ma_duplex_rb_uninit(&pDevice->duplexRB);\n    }\n\n    ((ma_pa_context_disconnect_proc)pContext->pulse.pa_context_disconnect)((ma_pa_context*)pDevice->pulse.pPulseContext);\n    ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)((ma_pa_context*)pDevice->pulse.pPulseContext);\n    ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)pDevice->pulse.pMainLoop);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_pa_buffer_attr ma_device__pa_buffer_attr_new(ma_uint32 periodSizeInFrames, ma_uint32 periods, const ma_pa_sample_spec* ss)\n{\n    ma_pa_buffer_attr attr;\n    attr.maxlength = periodSizeInFrames * periods * ma_get_bytes_per_frame(ma_format_from_pulse(ss->format), ss->channels);\n    attr.tlength   = attr.maxlength / periods;\n    attr.prebuf    = (ma_uint32)-1;\n    attr.minreq    = (ma_uint32)-1;\n    attr.fragsize  = attr.maxlength / periods;\n\n    return attr;\n}\n\nstatic ma_pa_stream* ma_device__pa_stream_new__pulse(ma_device* pDevice, const char* pStreamName, const ma_pa_sample_spec* ss, const ma_pa_channel_map* cmap)\n{\n    static int g_StreamCounter = 0;\n    char actualStreamName[256];\n\n    if (pStreamName != NULL) {\n        ma_strncpy_s(actualStreamName, sizeof(actualStreamName), pStreamName, (size_t)-1);\n    } else {\n        ma_strcpy_s(actualStreamName, sizeof(actualStreamName), \"miniaudio:\");\n        ma_itoa_s(g_StreamCounter, actualStreamName + 8, sizeof(actualStreamName)-8, 10);  /* 8 = strlen(\"miniaudio:\") */\n    }\n    g_StreamCounter += 1;\n\n    return ((ma_pa_stream_new_proc)pDevice->pContext->pulse.pa_stream_new)((ma_pa_context*)pDevice->pulse.pPulseContext, actualStreamName, ss, cmap);\n}\n\n\nstatic void ma_device_on_read__pulse(ma_pa_stream* pStream, size_t byteCount, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_uint32 bpf;\n    ma_uint32 deviceState;\n    ma_uint64 frameCount;\n    ma_uint64 framesProcessed;\n\n    MA_ASSERT(pDevice != NULL);\n\n    /*\n    Don't do anything if the device isn't initialized yet. Yes, this can happen because PulseAudio\n    can fire this callback before the stream has even started. Ridiculous.\n    */\n    deviceState = ma_device_get_state(pDevice);\n    if (deviceState != ma_device_state_starting && deviceState != ma_device_state_started) {\n        return;\n    }\n\n    bpf = ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n    MA_ASSERT(bpf > 0);\n\n    frameCount = byteCount / bpf;\n    framesProcessed = 0;\n\n    while (ma_device_get_state(pDevice) == ma_device_state_started && framesProcessed < frameCount) {\n        const void* pMappedPCMFrames;\n        size_t bytesMapped;\n        ma_uint64 framesMapped;\n\n        int pulseResult = ((ma_pa_stream_peek_proc)pDevice->pContext->pulse.pa_stream_peek)(pStream, &pMappedPCMFrames, &bytesMapped);\n        if (pulseResult < 0) {\n            break; /* Failed to map. Abort. */\n        }\n\n        framesMapped = bytesMapped / bpf;\n        if (framesMapped > 0) {\n            if (pMappedPCMFrames != NULL) {\n                ma_device_handle_backend_data_callback(pDevice, NULL, pMappedPCMFrames, framesMapped);\n            } else {\n                /* It's a hole. */\n                ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[PulseAudio] ma_device_on_read__pulse: Hole.\\n\");\n            }\n\n            pulseResult = ((ma_pa_stream_drop_proc)pDevice->pContext->pulse.pa_stream_drop)(pStream);\n            if (pulseResult < 0) {\n                break;  /* Failed to drop the buffer. */\n            }\n\n            framesProcessed += framesMapped;\n\n        } else {\n            /* Nothing was mapped. Just abort. */\n            break;\n        }\n    }\n}\n\nstatic ma_result ma_device_write_to_stream__pulse(ma_device* pDevice, ma_pa_stream* pStream, ma_uint64* pFramesProcessed)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint64 framesProcessed = 0;\n    size_t bytesMapped;\n    ma_uint32 bpf;\n    ma_uint32 deviceState;\n\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(pStream != NULL);\n\n    bpf = ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n    MA_ASSERT(bpf > 0);\n\n    deviceState = ma_device_get_state(pDevice);\n\n    bytesMapped = ((ma_pa_stream_writable_size_proc)pDevice->pContext->pulse.pa_stream_writable_size)(pStream);\n    if (bytesMapped != (size_t)-1) {\n        if (bytesMapped > 0) {\n            ma_uint64 framesMapped;\n            void* pMappedPCMFrames;\n            int pulseResult = ((ma_pa_stream_begin_write_proc)pDevice->pContext->pulse.pa_stream_begin_write)(pStream, &pMappedPCMFrames, &bytesMapped);\n            if (pulseResult < 0) {\n                result = ma_result_from_pulse(pulseResult);\n                goto done;\n            }\n\n            framesMapped = bytesMapped / bpf;\n\n            if (deviceState == ma_device_state_started || deviceState == ma_device_state_starting) {  /* Check for starting state just in case this is being used to do the initial fill. */\n                ma_device_handle_backend_data_callback(pDevice, pMappedPCMFrames, NULL, framesMapped);\n            } else {\n                /* Device is not started. Write silence. */\n                ma_silence_pcm_frames(pMappedPCMFrames, framesMapped, pDevice->playback.format, pDevice->playback.channels);\n            }\n\n            pulseResult = ((ma_pa_stream_write_proc)pDevice->pContext->pulse.pa_stream_write)(pStream, pMappedPCMFrames, bytesMapped, NULL, 0, MA_PA_SEEK_RELATIVE);\n            if (pulseResult < 0) {\n                result = ma_result_from_pulse(pulseResult);\n                goto done;  /* Failed to write data to stream. */\n            }\n\n            framesProcessed += framesMapped;\n        } else {\n            result = MA_SUCCESS;  /* No data available for writing. */\n            goto done;\n        }\n    } else {\n        result = MA_ERROR;  /* Failed to retrieve the writable size. Abort. */\n        goto done;\n    }\n\ndone:\n    if (pFramesProcessed != NULL) {\n        *pFramesProcessed = framesProcessed;\n    }\n\n    return result;\n}\n\nstatic void ma_device_on_write__pulse(ma_pa_stream* pStream, size_t byteCount, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_uint32 bpf;\n    ma_uint64 frameCount;\n    ma_uint64 framesProcessed;\n    ma_uint32 deviceState;\n    ma_result result;\n\n    MA_ASSERT(pDevice != NULL);\n\n    /*\n    Don't do anything if the device isn't initialized yet. Yes, this can happen because PulseAudio\n    can fire this callback before the stream has even started. Ridiculous.\n    */\n    deviceState = ma_device_get_state(pDevice);\n    if (deviceState != ma_device_state_starting && deviceState != ma_device_state_started) {\n        return;\n    }\n\n    bpf = ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n    MA_ASSERT(bpf > 0);\n\n    frameCount = byteCount / bpf;\n    framesProcessed = 0;\n\n    while (framesProcessed < frameCount) {\n        ma_uint64 framesProcessedThisIteration;\n\n        /* Don't keep trying to process frames if the device isn't started. */\n        deviceState = ma_device_get_state(pDevice);\n        if (deviceState != ma_device_state_starting && deviceState != ma_device_state_started) {\n            break;\n        }\n\n        result = ma_device_write_to_stream__pulse(pDevice, pStream, &framesProcessedThisIteration);\n        if (result != MA_SUCCESS) {\n            break;\n        }\n\n        framesProcessed += framesProcessedThisIteration;\n    }\n}\n\nstatic void ma_device_on_suspended__pulse(ma_pa_stream* pStream, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    int suspended;\n\n    (void)pStream;\n\n    suspended = ((ma_pa_stream_is_suspended_proc)pDevice->pContext->pulse.pa_stream_is_suspended)(pStream);\n    ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[Pulse] Device suspended state changed. pa_stream_is_suspended() returned %d.\\n\", suspended);\n\n    if (suspended < 0) {\n        return;\n    }\n\n    if (suspended == 1) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[Pulse] Device suspended state changed. Suspended.\\n\");\n        ma_device__on_notification_stopped(pDevice);\n    } else {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"[Pulse] Device suspended state changed. Resumed.\\n\");\n        ma_device__on_notification_started(pDevice);\n    }\n}\n\nstatic void ma_device_on_rerouted__pulse(ma_pa_stream* pStream, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n\n    (void)pStream;\n    (void)pUserData;\n\n    ma_device__on_notification_rerouted(pDevice);\n}\n\nstatic ma_uint32 ma_calculate_period_size_in_frames_from_descriptor__pulse(const ma_device_descriptor* pDescriptor, ma_uint32 nativeSampleRate, ma_performance_profile performanceProfile)\n{\n    /*\n    There have been reports from users where buffers of < ~20ms result glitches when running through\n    PipeWire. To work around this we're going to have to use a different default buffer size.\n    */\n    const ma_uint32 defaultPeriodSizeInMilliseconds_LowLatency   = 25;\n    const ma_uint32 defaultPeriodSizeInMilliseconds_Conservative = MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE;\n\n    MA_ASSERT(nativeSampleRate != 0);\n\n    if (pDescriptor->periodSizeInFrames == 0) {\n        if (pDescriptor->periodSizeInMilliseconds == 0) {\n            if (performanceProfile == ma_performance_profile_low_latency) {\n                return ma_calculate_buffer_size_in_frames_from_milliseconds(defaultPeriodSizeInMilliseconds_LowLatency, nativeSampleRate);\n            } else {\n                return ma_calculate_buffer_size_in_frames_from_milliseconds(defaultPeriodSizeInMilliseconds_Conservative, nativeSampleRate);\n            }\n        } else {\n            return ma_calculate_buffer_size_in_frames_from_milliseconds(pDescriptor->periodSizeInMilliseconds, nativeSampleRate);\n        }\n    } else {\n        return pDescriptor->periodSizeInFrames;\n    }\n}\n\nstatic ma_result ma_device_init__pulse(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n    /*\n    Notes for PulseAudio:\n\n      - When both the period size in frames and milliseconds are 0, we default to miniaudio's\n        default buffer sizes rather than leaving it up to PulseAudio because I don't trust\n        PulseAudio to give us any kind of reasonable latency by default.\n\n      - Do not ever, *ever* forget to use MA_PA_STREAM_ADJUST_LATENCY. If you don't specify this\n        flag, capture mode will just not work properly until you open another PulseAudio app.\n    */\n\n    ma_result result = MA_SUCCESS;\n    int error = 0;\n    const char* devPlayback = NULL;\n    const char* devCapture  = NULL;\n    ma_format format = ma_format_unknown;\n    ma_uint32 channels = 0;\n    ma_uint32 sampleRate = 0;\n    ma_pa_sink_info sinkInfo;\n    ma_pa_source_info sourceInfo;\n    ma_pa_sample_spec ss;\n    ma_pa_channel_map cmap;\n    ma_pa_buffer_attr attr;\n    const ma_pa_sample_spec* pActualSS   = NULL;\n    const ma_pa_buffer_attr* pActualAttr = NULL;\n    ma_uint32 iChannel;\n    ma_pa_stream_flags_t streamFlags;\n\n    MA_ASSERT(pDevice != NULL);\n    MA_ZERO_OBJECT(&pDevice->pulse);\n\n    if (pConfig->deviceType == ma_device_type_loopback) {\n        return MA_DEVICE_TYPE_NOT_SUPPORTED;\n    }\n\n    /* No exclusive mode with the PulseAudio backend. */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pConfig->playback.shareMode == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pConfig->capture.shareMode  == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        if (pDescriptorPlayback->pDeviceID != NULL) {\n            devPlayback = pDescriptorPlayback->pDeviceID->pulse;\n        }\n\n        format     = pDescriptorPlayback->format;\n        channels   = pDescriptorPlayback->channels;\n        sampleRate = pDescriptorPlayback->sampleRate;\n    }\n\n    if (pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) {\n        if (pDescriptorCapture->pDeviceID != NULL) {\n            devCapture = pDescriptorCapture->pDeviceID->pulse;\n        }\n\n        format     = pDescriptorCapture->format;\n        channels   = pDescriptorCapture->channels;\n        sampleRate = pDescriptorCapture->sampleRate;\n    }\n\n\n\n    result = ma_init_pa_mainloop_and_pa_context__pulse(pDevice->pContext, pDevice->pContext->pulse.pApplicationName, pDevice->pContext->pulse.pServerName, MA_FALSE, &pDevice->pulse.pMainLoop, &pDevice->pulse.pPulseContext);\n    if (result != MA_SUCCESS) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to initialize PA mainloop and context for device.\\n\");\n        return result;\n    }\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        result = ma_context_get_source_info__pulse(pDevice->pContext, devCapture, &sourceInfo);\n        if (result != MA_SUCCESS) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to retrieve source info for capture device.\");\n            goto on_error0;\n        }\n\n        ss   = sourceInfo.sample_spec;\n        cmap = sourceInfo.channel_map;\n\n        /* Use the requested channel count if we have one. */\n        if (pDescriptorCapture->channels != 0) {\n            ss.channels = pDescriptorCapture->channels;\n        }\n\n        /* Use a default channel map. */\n        ((ma_pa_channel_map_init_extend_proc)pDevice->pContext->pulse.pa_channel_map_init_extend)(&cmap, ss.channels, MA_PA_CHANNEL_MAP_DEFAULT);\n\n        /* Use the requested sample rate if one was specified. */\n        if (pDescriptorCapture->sampleRate != 0) {\n            ss.rate = pDescriptorCapture->sampleRate;\n        }\n        streamFlags = MA_PA_STREAM_START_CORKED | MA_PA_STREAM_ADJUST_LATENCY;\n\n        if (ma_format_from_pulse(ss.format) == ma_format_unknown) {\n            if (ma_is_little_endian()) {\n                ss.format = MA_PA_SAMPLE_FLOAT32LE;\n            } else {\n                ss.format = MA_PA_SAMPLE_FLOAT32BE;\n            }\n            streamFlags |= MA_PA_STREAM_FIX_FORMAT;\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] sample_spec.format not supported by miniaudio. Defaulting to PA_SAMPLE_FLOAT32.\\n\");\n        }\n        if (ss.rate == 0) {\n            ss.rate = MA_DEFAULT_SAMPLE_RATE;\n            streamFlags |= MA_PA_STREAM_FIX_RATE;\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] sample_spec.rate = 0. Defaulting to %d.\\n\", ss.rate);\n        }\n        if (ss.channels == 0) {\n            ss.channels = MA_DEFAULT_CHANNELS;\n            streamFlags |= MA_PA_STREAM_FIX_CHANNELS;\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] sample_spec.channels = 0. Defaulting to %d.\\n\", ss.channels);\n        }\n\n        /* We now have enough information to calculate our actual period size in frames. */\n        pDescriptorCapture->periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__pulse(pDescriptorCapture, ss.rate, pConfig->performanceProfile);\n\n        attr = ma_device__pa_buffer_attr_new(pDescriptorCapture->periodSizeInFrames, pDescriptorCapture->periodCount, &ss);\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] Capture attr: maxlength=%d, tlength=%d, prebuf=%d, minreq=%d, fragsize=%d; periodSizeInFrames=%d\\n\", attr.maxlength, attr.tlength, attr.prebuf, attr.minreq, attr.fragsize, pDescriptorCapture->periodSizeInFrames);\n\n        pDevice->pulse.pStreamCapture = ma_device__pa_stream_new__pulse(pDevice, pConfig->pulse.pStreamNameCapture, &ss, &cmap);\n        if (pDevice->pulse.pStreamCapture == NULL) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to create PulseAudio capture stream.\\n\");\n            result = MA_ERROR;\n            goto on_error0;\n        }\n\n\n        /* The callback needs to be set before connecting the stream. */\n        ((ma_pa_stream_set_read_callback_proc)pDevice->pContext->pulse.pa_stream_set_read_callback)((ma_pa_stream*)pDevice->pulse.pStreamCapture, ma_device_on_read__pulse, pDevice);\n\n        /* State callback for checking when the device has been corked. */\n        ((ma_pa_stream_set_suspended_callback_proc)pDevice->pContext->pulse.pa_stream_set_suspended_callback)((ma_pa_stream*)pDevice->pulse.pStreamCapture, ma_device_on_suspended__pulse, pDevice);\n\n        /* Rerouting notification. */\n        ((ma_pa_stream_set_moved_callback_proc)pDevice->pContext->pulse.pa_stream_set_moved_callback)((ma_pa_stream*)pDevice->pulse.pStreamCapture, ma_device_on_rerouted__pulse, pDevice);\n\n\n        /* Connect after we've got all of our internal state set up. */\n        if (devCapture != NULL) {\n            streamFlags |= MA_PA_STREAM_DONT_MOVE;\n        }\n\n        error = ((ma_pa_stream_connect_record_proc)pDevice->pContext->pulse.pa_stream_connect_record)((ma_pa_stream*)pDevice->pulse.pStreamCapture, devCapture, &attr, streamFlags);\n        if (error != MA_PA_OK) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to connect PulseAudio capture stream.\");\n            result = ma_result_from_pulse(error);\n            goto on_error1;\n        }\n\n        result = ma_wait_for_pa_stream_to_connect__pulse(pDevice->pContext, pDevice->pulse.pMainLoop, (ma_pa_stream*)pDevice->pulse.pStreamCapture);\n        if (result != MA_SUCCESS) {\n            goto on_error2;\n        }\n\n\n        /* Internal format. */\n        pActualSS = ((ma_pa_stream_get_sample_spec_proc)pDevice->pContext->pulse.pa_stream_get_sample_spec)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n        if (pActualSS != NULL) {\n            ss = *pActualSS;\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] Capture sample spec: format=%s, channels=%d, rate=%d\\n\", ma_get_format_name(ma_format_from_pulse(ss.format)), ss.channels, ss.rate);\n        } else {\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] Failed to retrieve capture sample spec.\\n\");\n        }\n\n        pDescriptorCapture->format     = ma_format_from_pulse(ss.format);\n        pDescriptorCapture->channels   = ss.channels;\n        pDescriptorCapture->sampleRate = ss.rate;\n\n        if (pDescriptorCapture->format == ma_format_unknown || pDescriptorCapture->channels == 0 || pDescriptorCapture->sampleRate == 0) {\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Capture sample spec is invalid. Device unusable by miniaudio. format=%s, channels=%d, sampleRate=%d.\\n\", ma_get_format_name(pDescriptorCapture->format), pDescriptorCapture->channels, pDescriptorCapture->sampleRate);\n            result = MA_ERROR;\n            goto on_error4;\n        }\n\n        /* Internal channel map. */\n\n        /*\n        Bug in PipeWire. There have been reports that PipeWire is returning AUX channels when reporting\n        the channel map. To somewhat workaround this, I'm hacking in a hard coded channel map for mono\n        and stereo. In this case it should be safe to assume mono = MONO and stereo = LEFT/RIGHT. For\n        all other channel counts we need to just put up with whatever PipeWire reports and hope it gets\n        fixed sooner than later. I might remove this hack later.\n        */\n        if (pDescriptorCapture->channels > 2) {\n            for (iChannel = 0; iChannel < pDescriptorCapture->channels; ++iChannel) {\n                pDescriptorCapture->channelMap[iChannel] = ma_channel_position_from_pulse(cmap.map[iChannel]);\n            }\n        } else {\n            /* Hack for mono and stereo. */\n            if (pDescriptorCapture->channels == 1) {\n                pDescriptorCapture->channelMap[0] = MA_CHANNEL_MONO;\n            } else if (pDescriptorCapture->channels == 2) {\n                pDescriptorCapture->channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n                pDescriptorCapture->channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            } else {\n                MA_ASSERT(MA_FALSE);    /* Should never hit this. */\n            }\n        }\n\n\n        /* Buffer. */\n        pActualAttr = ((ma_pa_stream_get_buffer_attr_proc)pDevice->pContext->pulse.pa_stream_get_buffer_attr)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n        if (pActualAttr != NULL) {\n            attr = *pActualAttr;\n        }\n\n        if (attr.fragsize > 0) {\n            pDescriptorCapture->periodCount = ma_max(attr.maxlength / attr.fragsize, 1);\n        } else {\n            pDescriptorCapture->periodCount = 1;\n        }\n\n        pDescriptorCapture->periodSizeInFrames = attr.maxlength / ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels) / pDescriptorCapture->periodCount;\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] Capture actual attr: maxlength=%d, tlength=%d, prebuf=%d, minreq=%d, fragsize=%d; periodSizeInFrames=%d\\n\", attr.maxlength, attr.tlength, attr.prebuf, attr.minreq, attr.fragsize, pDescriptorCapture->periodSizeInFrames);\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        result = ma_context_get_sink_info__pulse(pDevice->pContext, devPlayback, &sinkInfo);\n        if (result != MA_SUCCESS) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to retrieve sink info for playback device.\\n\");\n            goto on_error2;\n        }\n\n        ss   = sinkInfo.sample_spec;\n        cmap = sinkInfo.channel_map;\n\n        /* Use the requested channel count if we have one. */\n        if (pDescriptorPlayback->channels != 0) {\n            ss.channels = pDescriptorPlayback->channels;\n        }\n\n        /* Use a default channel map. */\n        ((ma_pa_channel_map_init_extend_proc)pDevice->pContext->pulse.pa_channel_map_init_extend)(&cmap, ss.channels, MA_PA_CHANNEL_MAP_DEFAULT);\n\n\n        /* Use the requested sample rate if one was specified. */\n        if (pDescriptorPlayback->sampleRate != 0) {\n            ss.rate = pDescriptorPlayback->sampleRate;\n        }\n\n        streamFlags = MA_PA_STREAM_START_CORKED | MA_PA_STREAM_ADJUST_LATENCY;\n        if (ma_format_from_pulse(ss.format) == ma_format_unknown) {\n            if (ma_is_little_endian()) {\n                ss.format = MA_PA_SAMPLE_FLOAT32LE;\n            } else {\n                ss.format = MA_PA_SAMPLE_FLOAT32BE;\n            }\n            streamFlags |= MA_PA_STREAM_FIX_FORMAT;\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] sample_spec.format not supported by miniaudio. Defaulting to PA_SAMPLE_FLOAT32.\\n\");\n        }\n        if (ss.rate == 0) {\n            ss.rate = MA_DEFAULT_SAMPLE_RATE;\n            streamFlags |= MA_PA_STREAM_FIX_RATE;\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] sample_spec.rate = 0. Defaulting to %d.\\n\", ss.rate);\n        }\n        if (ss.channels == 0) {\n            ss.channels = MA_DEFAULT_CHANNELS;\n            streamFlags |= MA_PA_STREAM_FIX_CHANNELS;\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] sample_spec.channels = 0. Defaulting to %d.\\n\", ss.channels);\n        }\n\n        /* We now have enough information to calculate the actual buffer size in frames. */\n        pDescriptorPlayback->periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__pulse(pDescriptorPlayback, ss.rate, pConfig->performanceProfile);\n\n        attr = ma_device__pa_buffer_attr_new(pDescriptorPlayback->periodSizeInFrames, pDescriptorPlayback->periodCount, &ss);\n\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] Playback attr: maxlength=%d, tlength=%d, prebuf=%d, minreq=%d, fragsize=%d; periodSizeInFrames=%d\\n\", attr.maxlength, attr.tlength, attr.prebuf, attr.minreq, attr.fragsize, pDescriptorPlayback->periodSizeInFrames);\n\n        pDevice->pulse.pStreamPlayback = ma_device__pa_stream_new__pulse(pDevice, pConfig->pulse.pStreamNamePlayback, &ss, &cmap);\n        if (pDevice->pulse.pStreamPlayback == NULL) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to create PulseAudio playback stream.\\n\");\n            result = MA_ERROR;\n            goto on_error2;\n        }\n\n\n        /*\n        Note that this callback will be fired as soon as the stream is connected, even though it's started as corked. The callback needs to handle a\n        device state of ma_device_state_uninitialized.\n        */\n        ((ma_pa_stream_set_write_callback_proc)pDevice->pContext->pulse.pa_stream_set_write_callback)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, ma_device_on_write__pulse, pDevice);\n\n        /* State callback for checking when the device has been corked. */\n        ((ma_pa_stream_set_suspended_callback_proc)pDevice->pContext->pulse.pa_stream_set_suspended_callback)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, ma_device_on_suspended__pulse, pDevice);\n\n        /* Rerouting notification. */\n        ((ma_pa_stream_set_moved_callback_proc)pDevice->pContext->pulse.pa_stream_set_moved_callback)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, ma_device_on_rerouted__pulse, pDevice);\n\n\n        /* Connect after we've got all of our internal state set up. */\n        if (devPlayback != NULL) {\n            streamFlags |= MA_PA_STREAM_DONT_MOVE;\n        }\n\n        error = ((ma_pa_stream_connect_playback_proc)pDevice->pContext->pulse.pa_stream_connect_playback)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, devPlayback, &attr, streamFlags, NULL, NULL);\n        if (error != MA_PA_OK) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to connect PulseAudio playback stream.\");\n            result = ma_result_from_pulse(error);\n            goto on_error3;\n        }\n\n        result = ma_wait_for_pa_stream_to_connect__pulse(pDevice->pContext, pDevice->pulse.pMainLoop, (ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n        if (result != MA_SUCCESS) {\n            goto on_error3;\n        }\n\n\n        /* Internal format. */\n        pActualSS = ((ma_pa_stream_get_sample_spec_proc)pDevice->pContext->pulse.pa_stream_get_sample_spec)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n        if (pActualSS != NULL) {\n            ss = *pActualSS;\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] Playback sample spec: format=%s, channels=%d, rate=%d\\n\", ma_get_format_name(ma_format_from_pulse(ss.format)), ss.channels, ss.rate);\n        } else {\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] Failed to retrieve playback sample spec.\\n\");\n        }\n\n        pDescriptorPlayback->format     = ma_format_from_pulse(ss.format);\n        pDescriptorPlayback->channels   = ss.channels;\n        pDescriptorPlayback->sampleRate = ss.rate;\n\n        if (pDescriptorPlayback->format == ma_format_unknown || pDescriptorPlayback->channels == 0 || pDescriptorPlayback->sampleRate == 0) {\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Playback sample spec is invalid. Device unusable by miniaudio. format=%s, channels=%d, sampleRate=%d.\\n\", ma_get_format_name(pDescriptorPlayback->format), pDescriptorPlayback->channels, pDescriptorPlayback->sampleRate);\n            result = MA_ERROR;\n            goto on_error4;\n        }\n\n        /* Internal channel map. */\n\n        /*\n        Bug in PipeWire. There have been reports that PipeWire is returning AUX channels when reporting\n        the channel map. To somewhat workaround this, I'm hacking in a hard coded channel map for mono\n        and stereo. In this case it should be safe to assume mono = MONO and stereo = LEFT/RIGHT. For\n        all other channel counts we need to just put up with whatever PipeWire reports and hope it gets\n        fixed sooner than later. I might remove this hack later.\n        */\n        if (pDescriptorPlayback->channels > 2) {\n            for (iChannel = 0; iChannel < pDescriptorPlayback->channels; ++iChannel) {\n                pDescriptorPlayback->channelMap[iChannel] = ma_channel_position_from_pulse(cmap.map[iChannel]);\n            }\n        } else {\n            /* Hack for mono and stereo. */\n            if (pDescriptorPlayback->channels == 1) {\n                pDescriptorPlayback->channelMap[0] = MA_CHANNEL_MONO;\n            } else if (pDescriptorPlayback->channels == 2) {\n                pDescriptorPlayback->channelMap[0] = MA_CHANNEL_FRONT_LEFT;\n                pDescriptorPlayback->channelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n            } else {\n                MA_ASSERT(MA_FALSE);    /* Should never hit this. */\n            }\n        }\n\n\n        /* Buffer. */\n        pActualAttr = ((ma_pa_stream_get_buffer_attr_proc)pDevice->pContext->pulse.pa_stream_get_buffer_attr)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n        if (pActualAttr != NULL) {\n            attr = *pActualAttr;\n        }\n\n        if (attr.tlength > 0) {\n            pDescriptorPlayback->periodCount = ma_max(attr.maxlength / attr.tlength, 1);\n        } else {\n            pDescriptorPlayback->periodCount = 1;\n        }\n\n        pDescriptorPlayback->periodSizeInFrames = attr.maxlength / ma_get_bytes_per_frame(pDescriptorPlayback->format, pDescriptorPlayback->channels) / pDescriptorPlayback->periodCount;\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[PulseAudio] Playback actual attr: maxlength=%d, tlength=%d, prebuf=%d, minreq=%d, fragsize=%d; internalPeriodSizeInFrames=%d\\n\", attr.maxlength, attr.tlength, attr.prebuf, attr.minreq, attr.fragsize, pDescriptorPlayback->periodSizeInFrames);\n    }\n\n\n    /*\n    We need a ring buffer for handling duplex mode. We can use the main duplex ring buffer in the main\n    part of the ma_device struct. We cannot, however, depend on ma_device_init() initializing this for\n    us later on because that will only do it if it's a fully asynchronous backend - i.e. the\n    onDeviceDataLoop callback is NULL, which is not the case for PulseAudio.\n    */\n    if (pConfig->deviceType == ma_device_type_duplex) {\n        ma_format rbFormat     = (format != ma_format_unknown) ? format     : pDescriptorCapture->format;\n        ma_uint32 rbChannels   = (channels   > 0)              ? channels   : pDescriptorCapture->channels;\n        ma_uint32 rbSampleRate = (sampleRate > 0)              ? sampleRate : pDescriptorCapture->sampleRate;\n\n        result = ma_duplex_rb_init(rbFormat, rbChannels, rbSampleRate, pDescriptorCapture->sampleRate, pDescriptorCapture->periodSizeInFrames, &pDevice->pContext->allocationCallbacks, &pDevice->duplexRB);\n        if (result != MA_SUCCESS) {\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to initialize ring buffer. %s.\\n\", ma_result_description(result));\n            goto on_error4;\n        }\n    }\n\n    return MA_SUCCESS;\n\n\non_error4:\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ((ma_pa_stream_disconnect_proc)pDevice->pContext->pulse.pa_stream_disconnect)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n    }\non_error3:\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ((ma_pa_stream_unref_proc)pDevice->pContext->pulse.pa_stream_unref)((ma_pa_stream*)pDevice->pulse.pStreamPlayback);\n    }\non_error2:\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ((ma_pa_stream_disconnect_proc)pDevice->pContext->pulse.pa_stream_disconnect)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n    }\non_error1:\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ((ma_pa_stream_unref_proc)pDevice->pContext->pulse.pa_stream_unref)((ma_pa_stream*)pDevice->pulse.pStreamCapture);\n    }\non_error0:\n    return result;\n}\n\n\nstatic void ma_pulse_operation_complete_callback(ma_pa_stream* pStream, int success, void* pUserData)\n{\n    ma_bool32* pIsSuccessful = (ma_bool32*)pUserData;\n    MA_ASSERT(pIsSuccessful != NULL);\n\n    *pIsSuccessful = (ma_bool32)success;\n\n    (void)pStream; /* Unused. */\n}\n\nstatic ma_result ma_device__cork_stream__pulse(ma_device* pDevice, ma_device_type deviceType, int cork)\n{\n    ma_context* pContext = pDevice->pContext;\n    ma_bool32 wasSuccessful;\n    ma_pa_stream* pStream;\n    ma_pa_operation* pOP;\n    ma_result result;\n\n    /* This should not be called with a duplex device type. */\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n    wasSuccessful = MA_FALSE;\n\n    pStream = (ma_pa_stream*)((deviceType == ma_device_type_capture) ? pDevice->pulse.pStreamCapture : pDevice->pulse.pStreamPlayback);\n    MA_ASSERT(pStream != NULL);\n\n    pOP = ((ma_pa_stream_cork_proc)pContext->pulse.pa_stream_cork)(pStream, cork, ma_pulse_operation_complete_callback, &wasSuccessful);\n    if (pOP == NULL) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to cork PulseAudio stream.\");\n        return MA_ERROR;\n    }\n\n    result = ma_wait_for_operation_and_unref__pulse(pDevice->pContext, pDevice->pulse.pMainLoop, pOP);\n    if (result != MA_SUCCESS) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[PulseAudio] An error occurred while waiting for the PulseAudio stream to cork.\");\n        return result;\n    }\n\n    if (!wasSuccessful) {\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[PulseAudio] Failed to %s PulseAudio stream.\", (cork) ? \"stop\" : \"start\");\n        return MA_ERROR;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_start__pulse(ma_device* pDevice)\n{\n    ma_result result;\n\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        result = ma_device__cork_stream__pulse(pDevice, ma_device_type_capture, 0);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        /*\n        We need to fill some data before uncorking. Not doing this will result in the write callback\n        never getting fired. We're not going to abort if writing fails because I still want the device\n        to get uncorked.\n        */\n        ma_device_write_to_stream__pulse(pDevice, (ma_pa_stream*)(pDevice->pulse.pStreamPlayback), NULL);   /* No need to check the result here. Always want to fall through an uncork.*/\n\n        result = ma_device__cork_stream__pulse(pDevice, ma_device_type_playback, 0);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop__pulse(ma_device* pDevice)\n{\n    ma_result result;\n\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        result = ma_device__cork_stream__pulse(pDevice, ma_device_type_capture, 1);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        /*\n        Ideally we would drain the device here, but there's been cases where PulseAudio seems to be\n        broken on some systems to the point where no audio processing seems to happen. When this\n        happens, draining never completes and we get stuck here. For now I'm disabling draining of\n        the device so we don't just freeze the application.\n        */\n    #if 0\n        ma_pa_operation* pOP = ((ma_pa_stream_drain_proc)pDevice->pContext->pulse.pa_stream_drain)((ma_pa_stream*)pDevice->pulse.pStreamPlayback, ma_pulse_operation_complete_callback, &wasSuccessful);\n        ma_wait_for_operation_and_unref__pulse(pDevice->pContext, pDevice->pulse.pMainLoop, pOP);\n    #endif\n\n        result = ma_device__cork_stream__pulse(pDevice, ma_device_type_playback, 1);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_data_loop__pulse(ma_device* pDevice)\n{\n    int resultPA;\n\n    MA_ASSERT(pDevice != NULL);\n\n    /* NOTE: Don't start the device here. It'll be done at a higher level. */\n\n    /*\n    All data is handled through callbacks. All we need to do is iterate over the main loop and let\n    the callbacks deal with it.\n    */\n    while (ma_device_get_state(pDevice) == ma_device_state_started) {\n        resultPA = ((ma_pa_mainloop_iterate_proc)pDevice->pContext->pulse.pa_mainloop_iterate)((ma_pa_mainloop*)pDevice->pulse.pMainLoop, 1, NULL);\n        if (resultPA < 0) {\n            break;\n        }\n    }\n\n    /* NOTE: Don't stop the device here. It'll be done at a higher level. */\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_data_loop_wakeup__pulse(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    ((ma_pa_mainloop_wakeup_proc)pDevice->pContext->pulse.pa_mainloop_wakeup)((ma_pa_mainloop*)pDevice->pulse.pMainLoop);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_uninit__pulse(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_pulseaudio);\n\n    ((ma_pa_context_disconnect_proc)pContext->pulse.pa_context_disconnect)((ma_pa_context*)pContext->pulse.pPulseContext);\n    ((ma_pa_context_unref_proc)pContext->pulse.pa_context_unref)((ma_pa_context*)pContext->pulse.pPulseContext);\n    ((ma_pa_mainloop_free_proc)pContext->pulse.pa_mainloop_free)((ma_pa_mainloop*)pContext->pulse.pMainLoop);\n\n    ma_free(pContext->pulse.pServerName, &pContext->allocationCallbacks);\n    ma_free(pContext->pulse.pApplicationName, &pContext->allocationCallbacks);\n\n#ifndef MA_NO_RUNTIME_LINKING\n    ma_dlclose(ma_context_get_log(pContext), pContext->pulse.pulseSO);\n#endif\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init__pulse(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n    ma_result result;\n#ifndef MA_NO_RUNTIME_LINKING\n    const char* libpulseNames[] = {\n        \"libpulse.so\",\n        \"libpulse.so.0\"\n    };\n    size_t i;\n\n    for (i = 0; i < ma_countof(libpulseNames); ++i) {\n        pContext->pulse.pulseSO = ma_dlopen(ma_context_get_log(pContext), libpulseNames[i]);\n        if (pContext->pulse.pulseSO != NULL) {\n            break;\n        }\n    }\n\n    if (pContext->pulse.pulseSO == NULL) {\n        return MA_NO_BACKEND;\n    }\n\n    pContext->pulse.pa_mainloop_new                    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_mainloop_new\");\n    pContext->pulse.pa_mainloop_free                   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_mainloop_free\");\n    pContext->pulse.pa_mainloop_quit                   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_mainloop_quit\");\n    pContext->pulse.pa_mainloop_get_api                = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_mainloop_get_api\");\n    pContext->pulse.pa_mainloop_iterate                = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_mainloop_iterate\");\n    pContext->pulse.pa_mainloop_wakeup                 = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_mainloop_wakeup\");\n    pContext->pulse.pa_threaded_mainloop_new           = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_threaded_mainloop_new\");\n    pContext->pulse.pa_threaded_mainloop_free          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_threaded_mainloop_free\");\n    pContext->pulse.pa_threaded_mainloop_start         = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_threaded_mainloop_start\");\n    pContext->pulse.pa_threaded_mainloop_stop          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_threaded_mainloop_stop\");\n    pContext->pulse.pa_threaded_mainloop_lock          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_threaded_mainloop_lock\");\n    pContext->pulse.pa_threaded_mainloop_unlock        = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_threaded_mainloop_unlock\");\n    pContext->pulse.pa_threaded_mainloop_wait          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_threaded_mainloop_wait\");\n    pContext->pulse.pa_threaded_mainloop_signal        = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_threaded_mainloop_signal\");\n    pContext->pulse.pa_threaded_mainloop_accept        = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_threaded_mainloop_accept\");\n    pContext->pulse.pa_threaded_mainloop_get_retval    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_threaded_mainloop_get_retval\");\n    pContext->pulse.pa_threaded_mainloop_get_api       = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_threaded_mainloop_get_api\");\n    pContext->pulse.pa_threaded_mainloop_in_thread     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_threaded_mainloop_in_thread\");\n    pContext->pulse.pa_threaded_mainloop_set_name      = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_threaded_mainloop_set_name\");\n    pContext->pulse.pa_context_new                     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_context_new\");\n    pContext->pulse.pa_context_unref                   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_context_unref\");\n    pContext->pulse.pa_context_connect                 = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_context_connect\");\n    pContext->pulse.pa_context_disconnect              = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_context_disconnect\");\n    pContext->pulse.pa_context_set_state_callback      = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_context_set_state_callback\");\n    pContext->pulse.pa_context_get_state               = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_context_get_state\");\n    pContext->pulse.pa_context_get_sink_info_list      = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_context_get_sink_info_list\");\n    pContext->pulse.pa_context_get_source_info_list    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_context_get_source_info_list\");\n    pContext->pulse.pa_context_get_sink_info_by_name   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_context_get_sink_info_by_name\");\n    pContext->pulse.pa_context_get_source_info_by_name = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_context_get_source_info_by_name\");\n    pContext->pulse.pa_operation_unref                 = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_operation_unref\");\n    pContext->pulse.pa_operation_get_state             = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_operation_get_state\");\n    pContext->pulse.pa_channel_map_init_extend         = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_channel_map_init_extend\");\n    pContext->pulse.pa_channel_map_valid               = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_channel_map_valid\");\n    pContext->pulse.pa_channel_map_compatible          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_channel_map_compatible\");\n    pContext->pulse.pa_stream_new                      = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_new\");\n    pContext->pulse.pa_stream_unref                    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_unref\");\n    pContext->pulse.pa_stream_connect_playback         = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_connect_playback\");\n    pContext->pulse.pa_stream_connect_record           = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_connect_record\");\n    pContext->pulse.pa_stream_disconnect               = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_disconnect\");\n    pContext->pulse.pa_stream_get_state                = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_get_state\");\n    pContext->pulse.pa_stream_get_sample_spec          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_get_sample_spec\");\n    pContext->pulse.pa_stream_get_channel_map          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_get_channel_map\");\n    pContext->pulse.pa_stream_get_buffer_attr          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_get_buffer_attr\");\n    pContext->pulse.pa_stream_set_buffer_attr          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_set_buffer_attr\");\n    pContext->pulse.pa_stream_get_device_name          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_get_device_name\");\n    pContext->pulse.pa_stream_set_write_callback       = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_set_write_callback\");\n    pContext->pulse.pa_stream_set_read_callback        = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_set_read_callback\");\n    pContext->pulse.pa_stream_set_suspended_callback   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_set_suspended_callback\");\n    pContext->pulse.pa_stream_set_moved_callback       = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_set_moved_callback\");\n    pContext->pulse.pa_stream_is_suspended             = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_is_suspended\");\n    pContext->pulse.pa_stream_flush                    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_flush\");\n    pContext->pulse.pa_stream_drain                    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_drain\");\n    pContext->pulse.pa_stream_is_corked                = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_is_corked\");\n    pContext->pulse.pa_stream_cork                     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_cork\");\n    pContext->pulse.pa_stream_trigger                  = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_trigger\");\n    pContext->pulse.pa_stream_begin_write              = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_begin_write\");\n    pContext->pulse.pa_stream_write                    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_write\");\n    pContext->pulse.pa_stream_peek                     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_peek\");\n    pContext->pulse.pa_stream_drop                     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_drop\");\n    pContext->pulse.pa_stream_writable_size            = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_writable_size\");\n    pContext->pulse.pa_stream_readable_size            = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->pulse.pulseSO, \"pa_stream_readable_size\");\n#else\n    /* This strange assignment system is just for type safety. */\n    ma_pa_mainloop_new_proc                    _pa_mainloop_new                   = pa_mainloop_new;\n    ma_pa_mainloop_free_proc                   _pa_mainloop_free                  = pa_mainloop_free;\n    ma_pa_mainloop_quit_proc                   _pa_mainloop_quit                  = pa_mainloop_quit;\n    ma_pa_mainloop_get_api_proc                _pa_mainloop_get_api               = pa_mainloop_get_api;\n    ma_pa_mainloop_iterate_proc                _pa_mainloop_iterate               = pa_mainloop_iterate;\n    ma_pa_mainloop_wakeup_proc                 _pa_mainloop_wakeup                = pa_mainloop_wakeup;\n    ma_pa_threaded_mainloop_new_proc           _pa_threaded_mainloop_new          = pa_threaded_mainloop_new;\n    ma_pa_threaded_mainloop_free_proc          _pa_threaded_mainloop_free         = pa_threaded_mainloop_free;\n    ma_pa_threaded_mainloop_start_proc         _pa_threaded_mainloop_start        = pa_threaded_mainloop_start;\n    ma_pa_threaded_mainloop_stop_proc          _pa_threaded_mainloop_stop         = pa_threaded_mainloop_stop;\n    ma_pa_threaded_mainloop_lock_proc          _pa_threaded_mainloop_lock         = pa_threaded_mainloop_lock;\n    ma_pa_threaded_mainloop_unlock_proc        _pa_threaded_mainloop_unlock       = pa_threaded_mainloop_unlock;\n    ma_pa_threaded_mainloop_wait_proc          _pa_threaded_mainloop_wait         = pa_threaded_mainloop_wait;\n    ma_pa_threaded_mainloop_signal_proc        _pa_threaded_mainloop_signal       = pa_threaded_mainloop_signal;\n    ma_pa_threaded_mainloop_accept_proc        _pa_threaded_mainloop_accept       = pa_threaded_mainloop_accept;\n    ma_pa_threaded_mainloop_get_retval_proc    _pa_threaded_mainloop_get_retval   = pa_threaded_mainloop_get_retval;\n    ma_pa_threaded_mainloop_get_api_proc       _pa_threaded_mainloop_get_api      = pa_threaded_mainloop_get_api;\n    ma_pa_threaded_mainloop_in_thread_proc     _pa_threaded_mainloop_in_thread    = pa_threaded_mainloop_in_thread;\n    ma_pa_threaded_mainloop_set_name_proc      _pa_threaded_mainloop_set_name     = pa_threaded_mainloop_set_name;\n    ma_pa_context_new_proc                     _pa_context_new                    = pa_context_new;\n    ma_pa_context_unref_proc                   _pa_context_unref                  = pa_context_unref;\n    ma_pa_context_connect_proc                 _pa_context_connect                = pa_context_connect;\n    ma_pa_context_disconnect_proc              _pa_context_disconnect             = pa_context_disconnect;\n    ma_pa_context_set_state_callback_proc      _pa_context_set_state_callback     = pa_context_set_state_callback;\n    ma_pa_context_get_state_proc               _pa_context_get_state              = pa_context_get_state;\n    ma_pa_context_get_sink_info_list_proc      _pa_context_get_sink_info_list     = pa_context_get_sink_info_list;\n    ma_pa_context_get_source_info_list_proc    _pa_context_get_source_info_list   = pa_context_get_source_info_list;\n    ma_pa_context_get_sink_info_by_name_proc   _pa_context_get_sink_info_by_name  = pa_context_get_sink_info_by_name;\n    ma_pa_context_get_source_info_by_name_proc _pa_context_get_source_info_by_name= pa_context_get_source_info_by_name;\n    ma_pa_operation_unref_proc                 _pa_operation_unref                = pa_operation_unref;\n    ma_pa_operation_get_state_proc             _pa_operation_get_state            = pa_operation_get_state;\n    ma_pa_channel_map_init_extend_proc         _pa_channel_map_init_extend        = pa_channel_map_init_extend;\n    ma_pa_channel_map_valid_proc               _pa_channel_map_valid              = pa_channel_map_valid;\n    ma_pa_channel_map_compatible_proc          _pa_channel_map_compatible         = pa_channel_map_compatible;\n    ma_pa_stream_new_proc                      _pa_stream_new                     = pa_stream_new;\n    ma_pa_stream_unref_proc                    _pa_stream_unref                   = pa_stream_unref;\n    ma_pa_stream_connect_playback_proc         _pa_stream_connect_playback        = pa_stream_connect_playback;\n    ma_pa_stream_connect_record_proc           _pa_stream_connect_record          = pa_stream_connect_record;\n    ma_pa_stream_disconnect_proc               _pa_stream_disconnect              = pa_stream_disconnect;\n    ma_pa_stream_get_state_proc                _pa_stream_get_state               = pa_stream_get_state;\n    ma_pa_stream_get_sample_spec_proc          _pa_stream_get_sample_spec         = pa_stream_get_sample_spec;\n    ma_pa_stream_get_channel_map_proc          _pa_stream_get_channel_map         = pa_stream_get_channel_map;\n    ma_pa_stream_get_buffer_attr_proc          _pa_stream_get_buffer_attr         = pa_stream_get_buffer_attr;\n    ma_pa_stream_set_buffer_attr_proc          _pa_stream_set_buffer_attr         = pa_stream_set_buffer_attr;\n    ma_pa_stream_get_device_name_proc          _pa_stream_get_device_name         = pa_stream_get_device_name;\n    ma_pa_stream_set_write_callback_proc       _pa_stream_set_write_callback      = pa_stream_set_write_callback;\n    ma_pa_stream_set_read_callback_proc        _pa_stream_set_read_callback       = pa_stream_set_read_callback;\n    ma_pa_stream_set_suspended_callback_proc   _pa_stream_set_suspended_callback  = pa_stream_set_suspended_callback;\n    ma_pa_stream_set_moved_callback_proc       _pa_stream_set_moved_callback      = pa_stream_set_moved_callback;\n    ma_pa_stream_is_suspended_proc             _pa_stream_is_suspended            = pa_stream_is_suspended;\n    ma_pa_stream_flush_proc                    _pa_stream_flush                   = pa_stream_flush;\n    ma_pa_stream_drain_proc                    _pa_stream_drain                   = pa_stream_drain;\n    ma_pa_stream_is_corked_proc                _pa_stream_is_corked               = pa_stream_is_corked;\n    ma_pa_stream_cork_proc                     _pa_stream_cork                    = pa_stream_cork;\n    ma_pa_stream_trigger_proc                  _pa_stream_trigger                 = pa_stream_trigger;\n    ma_pa_stream_begin_write_proc              _pa_stream_begin_write             = pa_stream_begin_write;\n    ma_pa_stream_write_proc                    _pa_stream_write                   = pa_stream_write;\n    ma_pa_stream_peek_proc                     _pa_stream_peek                    = pa_stream_peek;\n    ma_pa_stream_drop_proc                     _pa_stream_drop                    = pa_stream_drop;\n    ma_pa_stream_writable_size_proc            _pa_stream_writable_size           = pa_stream_writable_size;\n    ma_pa_stream_readable_size_proc            _pa_stream_readable_size           = pa_stream_readable_size;\n\n    pContext->pulse.pa_mainloop_new                    = (ma_proc)_pa_mainloop_new;\n    pContext->pulse.pa_mainloop_free                   = (ma_proc)_pa_mainloop_free;\n    pContext->pulse.pa_mainloop_quit                   = (ma_proc)_pa_mainloop_quit;\n    pContext->pulse.pa_mainloop_get_api                = (ma_proc)_pa_mainloop_get_api;\n    pContext->pulse.pa_mainloop_iterate                = (ma_proc)_pa_mainloop_iterate;\n    pContext->pulse.pa_mainloop_wakeup                 = (ma_proc)_pa_mainloop_wakeup;\n    pContext->pulse.pa_threaded_mainloop_new           = (ma_proc)_pa_threaded_mainloop_new;\n    pContext->pulse.pa_threaded_mainloop_free          = (ma_proc)_pa_threaded_mainloop_free;\n    pContext->pulse.pa_threaded_mainloop_start         = (ma_proc)_pa_threaded_mainloop_start;\n    pContext->pulse.pa_threaded_mainloop_stop          = (ma_proc)_pa_threaded_mainloop_stop;\n    pContext->pulse.pa_threaded_mainloop_lock          = (ma_proc)_pa_threaded_mainloop_lock;\n    pContext->pulse.pa_threaded_mainloop_unlock        = (ma_proc)_pa_threaded_mainloop_unlock;\n    pContext->pulse.pa_threaded_mainloop_wait          = (ma_proc)_pa_threaded_mainloop_wait;\n    pContext->pulse.pa_threaded_mainloop_signal        = (ma_proc)_pa_threaded_mainloop_signal;\n    pContext->pulse.pa_threaded_mainloop_accept        = (ma_proc)_pa_threaded_mainloop_accept;\n    pContext->pulse.pa_threaded_mainloop_get_retval    = (ma_proc)_pa_threaded_mainloop_get_retval;\n    pContext->pulse.pa_threaded_mainloop_get_api       = (ma_proc)_pa_threaded_mainloop_get_api;\n    pContext->pulse.pa_threaded_mainloop_in_thread     = (ma_proc)_pa_threaded_mainloop_in_thread;\n    pContext->pulse.pa_threaded_mainloop_set_name      = (ma_proc)_pa_threaded_mainloop_set_name;\n    pContext->pulse.pa_context_new                     = (ma_proc)_pa_context_new;\n    pContext->pulse.pa_context_unref                   = (ma_proc)_pa_context_unref;\n    pContext->pulse.pa_context_connect                 = (ma_proc)_pa_context_connect;\n    pContext->pulse.pa_context_disconnect              = (ma_proc)_pa_context_disconnect;\n    pContext->pulse.pa_context_set_state_callback      = (ma_proc)_pa_context_set_state_callback;\n    pContext->pulse.pa_context_get_state               = (ma_proc)_pa_context_get_state;\n    pContext->pulse.pa_context_get_sink_info_list      = (ma_proc)_pa_context_get_sink_info_list;\n    pContext->pulse.pa_context_get_source_info_list    = (ma_proc)_pa_context_get_source_info_list;\n    pContext->pulse.pa_context_get_sink_info_by_name   = (ma_proc)_pa_context_get_sink_info_by_name;\n    pContext->pulse.pa_context_get_source_info_by_name = (ma_proc)_pa_context_get_source_info_by_name;\n    pContext->pulse.pa_operation_unref                 = (ma_proc)_pa_operation_unref;\n    pContext->pulse.pa_operation_get_state             = (ma_proc)_pa_operation_get_state;\n    pContext->pulse.pa_channel_map_init_extend         = (ma_proc)_pa_channel_map_init_extend;\n    pContext->pulse.pa_channel_map_valid               = (ma_proc)_pa_channel_map_valid;\n    pContext->pulse.pa_channel_map_compatible          = (ma_proc)_pa_channel_map_compatible;\n    pContext->pulse.pa_stream_new                      = (ma_proc)_pa_stream_new;\n    pContext->pulse.pa_stream_unref                    = (ma_proc)_pa_stream_unref;\n    pContext->pulse.pa_stream_connect_playback         = (ma_proc)_pa_stream_connect_playback;\n    pContext->pulse.pa_stream_connect_record           = (ma_proc)_pa_stream_connect_record;\n    pContext->pulse.pa_stream_disconnect               = (ma_proc)_pa_stream_disconnect;\n    pContext->pulse.pa_stream_get_state                = (ma_proc)_pa_stream_get_state;\n    pContext->pulse.pa_stream_get_sample_spec          = (ma_proc)_pa_stream_get_sample_spec;\n    pContext->pulse.pa_stream_get_channel_map          = (ma_proc)_pa_stream_get_channel_map;\n    pContext->pulse.pa_stream_get_buffer_attr          = (ma_proc)_pa_stream_get_buffer_attr;\n    pContext->pulse.pa_stream_set_buffer_attr          = (ma_proc)_pa_stream_set_buffer_attr;\n    pContext->pulse.pa_stream_get_device_name          = (ma_proc)_pa_stream_get_device_name;\n    pContext->pulse.pa_stream_set_write_callback       = (ma_proc)_pa_stream_set_write_callback;\n    pContext->pulse.pa_stream_set_read_callback        = (ma_proc)_pa_stream_set_read_callback;\n    pContext->pulse.pa_stream_set_suspended_callback   = (ma_proc)_pa_stream_set_suspended_callback;\n    pContext->pulse.pa_stream_set_moved_callback       = (ma_proc)_pa_stream_set_moved_callback;\n    pContext->pulse.pa_stream_is_suspended             = (ma_proc)_pa_stream_is_suspended;\n    pContext->pulse.pa_stream_flush                    = (ma_proc)_pa_stream_flush;\n    pContext->pulse.pa_stream_drain                    = (ma_proc)_pa_stream_drain;\n    pContext->pulse.pa_stream_is_corked                = (ma_proc)_pa_stream_is_corked;\n    pContext->pulse.pa_stream_cork                     = (ma_proc)_pa_stream_cork;\n    pContext->pulse.pa_stream_trigger                  = (ma_proc)_pa_stream_trigger;\n    pContext->pulse.pa_stream_begin_write              = (ma_proc)_pa_stream_begin_write;\n    pContext->pulse.pa_stream_write                    = (ma_proc)_pa_stream_write;\n    pContext->pulse.pa_stream_peek                     = (ma_proc)_pa_stream_peek;\n    pContext->pulse.pa_stream_drop                     = (ma_proc)_pa_stream_drop;\n    pContext->pulse.pa_stream_writable_size            = (ma_proc)_pa_stream_writable_size;\n    pContext->pulse.pa_stream_readable_size            = (ma_proc)_pa_stream_readable_size;\n#endif\n\n    /* We need to make a copy of the application and server names so we can pass them to the pa_context of each device. */\n    pContext->pulse.pApplicationName = ma_copy_string(pConfig->pulse.pApplicationName, &pContext->allocationCallbacks);\n    if (pContext->pulse.pApplicationName == NULL && pConfig->pulse.pApplicationName != NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    pContext->pulse.pServerName = ma_copy_string(pConfig->pulse.pServerName, &pContext->allocationCallbacks);\n    if (pContext->pulse.pServerName == NULL && pConfig->pulse.pServerName != NULL) {\n        ma_free(pContext->pulse.pApplicationName, &pContext->allocationCallbacks);\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_init_pa_mainloop_and_pa_context__pulse(pContext, pConfig->pulse.pApplicationName, pConfig->pulse.pServerName, pConfig->pulse.tryAutoSpawn, &pContext->pulse.pMainLoop, &pContext->pulse.pPulseContext);\n    if (result != MA_SUCCESS) {\n        ma_free(pContext->pulse.pServerName, &pContext->allocationCallbacks);\n        ma_free(pContext->pulse.pApplicationName, &pContext->allocationCallbacks);\n    #ifndef MA_NO_RUNTIME_LINKING\n        ma_dlclose(ma_context_get_log(pContext), pContext->pulse.pulseSO);\n    #endif\n        return result;\n    }\n\n    /* With pa_mainloop we run a synchronous backend, but we implement our own main loop. */\n    pCallbacks->onContextInit             = ma_context_init__pulse;\n    pCallbacks->onContextUninit           = ma_context_uninit__pulse;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__pulse;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__pulse;\n    pCallbacks->onDeviceInit              = ma_device_init__pulse;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__pulse;\n    pCallbacks->onDeviceStart             = ma_device_start__pulse;\n    pCallbacks->onDeviceStop              = ma_device_stop__pulse;\n    pCallbacks->onDeviceRead              = NULL;   /* Not used because we're implementing onDeviceDataLoop. */\n    pCallbacks->onDeviceWrite             = NULL;   /* Not used because we're implementing onDeviceDataLoop. */\n    pCallbacks->onDeviceDataLoop          = ma_device_data_loop__pulse;\n    pCallbacks->onDeviceDataLoopWakeup    = ma_device_data_loop_wakeup__pulse;\n\n    return MA_SUCCESS;\n}\n#endif\n\n\n/******************************************************************************\n\nJACK Backend\n\n******************************************************************************/\n#ifdef MA_HAS_JACK\n\n/* It is assumed jack.h is available when compile-time linking is being used. */\n#ifdef MA_NO_RUNTIME_LINKING\n#include <jack/jack.h>\n\ntypedef jack_nframes_t              ma_jack_nframes_t;\ntypedef jack_options_t              ma_jack_options_t;\ntypedef jack_status_t               ma_jack_status_t;\ntypedef jack_client_t               ma_jack_client_t;\ntypedef jack_port_t                 ma_jack_port_t;\ntypedef JackProcessCallback         ma_JackProcessCallback;\ntypedef JackBufferSizeCallback      ma_JackBufferSizeCallback;\ntypedef JackShutdownCallback        ma_JackShutdownCallback;\n#define MA_JACK_DEFAULT_AUDIO_TYPE  JACK_DEFAULT_AUDIO_TYPE\n#define ma_JackNoStartServer        JackNoStartServer\n#define ma_JackPortIsInput          JackPortIsInput\n#define ma_JackPortIsOutput         JackPortIsOutput\n#define ma_JackPortIsPhysical       JackPortIsPhysical\n#else\ntypedef ma_uint32               ma_jack_nframes_t;\ntypedef int                     ma_jack_options_t;\ntypedef int                     ma_jack_status_t;\ntypedef struct ma_jack_client_t ma_jack_client_t;\ntypedef struct ma_jack_port_t   ma_jack_port_t;\ntypedef int  (* ma_JackProcessCallback)   (ma_jack_nframes_t nframes, void* arg);\ntypedef int  (* ma_JackBufferSizeCallback)(ma_jack_nframes_t nframes, void* arg);\ntypedef void (* ma_JackShutdownCallback)  (void* arg);\n#define MA_JACK_DEFAULT_AUDIO_TYPE \"32 bit float mono audio\"\n#define ma_JackNoStartServer       1\n#define ma_JackPortIsInput         1\n#define ma_JackPortIsOutput        2\n#define ma_JackPortIsPhysical      4\n#endif\n\ntypedef ma_jack_client_t* (* ma_jack_client_open_proc)             (const char* client_name, ma_jack_options_t options, ma_jack_status_t* status, ...);\ntypedef int               (* ma_jack_client_close_proc)            (ma_jack_client_t* client);\ntypedef int               (* ma_jack_client_name_size_proc)        (void);\ntypedef int               (* ma_jack_set_process_callback_proc)    (ma_jack_client_t* client, ma_JackProcessCallback process_callback, void* arg);\ntypedef int               (* ma_jack_set_buffer_size_callback_proc)(ma_jack_client_t* client, ma_JackBufferSizeCallback bufsize_callback, void* arg);\ntypedef void              (* ma_jack_on_shutdown_proc)             (ma_jack_client_t* client, ma_JackShutdownCallback function, void* arg);\ntypedef ma_jack_nframes_t (* ma_jack_get_sample_rate_proc)         (ma_jack_client_t* client);\ntypedef ma_jack_nframes_t (* ma_jack_get_buffer_size_proc)         (ma_jack_client_t* client);\ntypedef const char**      (* ma_jack_get_ports_proc)               (ma_jack_client_t* client, const char* port_name_pattern, const char* type_name_pattern, unsigned long flags);\ntypedef int               (* ma_jack_activate_proc)                (ma_jack_client_t* client);\ntypedef int               (* ma_jack_deactivate_proc)              (ma_jack_client_t* client);\ntypedef int               (* ma_jack_connect_proc)                 (ma_jack_client_t* client, const char* source_port, const char* destination_port);\ntypedef ma_jack_port_t*   (* ma_jack_port_register_proc)           (ma_jack_client_t* client, const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size);\ntypedef const char*       (* ma_jack_port_name_proc)               (const ma_jack_port_t* port);\ntypedef void*             (* ma_jack_port_get_buffer_proc)         (ma_jack_port_t* port, ma_jack_nframes_t nframes);\ntypedef void              (* ma_jack_free_proc)                    (void* ptr);\n\nstatic ma_result ma_context_open_client__jack(ma_context* pContext, ma_jack_client_t** ppClient)\n{\n    size_t maxClientNameSize;\n    char clientName[256];\n    ma_jack_status_t status;\n    ma_jack_client_t* pClient;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(ppClient != NULL);\n\n    if (ppClient) {\n        *ppClient = NULL;\n    }\n\n    maxClientNameSize = ((ma_jack_client_name_size_proc)pContext->jack.jack_client_name_size)(); /* Includes null terminator. */\n    ma_strncpy_s(clientName, ma_min(sizeof(clientName), maxClientNameSize), (pContext->jack.pClientName != NULL) ? pContext->jack.pClientName : \"miniaudio\", (size_t)-1);\n\n    pClient = ((ma_jack_client_open_proc)pContext->jack.jack_client_open)(clientName, (pContext->jack.tryStartServer) ? 0 : ma_JackNoStartServer, &status, NULL);\n    if (pClient == NULL) {\n        return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n    }\n\n    if (ppClient) {\n        *ppClient = pClient;\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_context_enumerate_devices__jack(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_bool32 cbResult = MA_TRUE;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(callback != NULL);\n\n    /* Playback. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        MA_ZERO_OBJECT(&deviceInfo);\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n        deviceInfo.isDefault = MA_TRUE;    /* JACK only uses default devices. */\n        cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n    }\n\n    /* Capture. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        MA_ZERO_OBJECT(&deviceInfo);\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n        deviceInfo.isDefault = MA_TRUE;    /* JACK only uses default devices. */\n        cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n    }\n\n    (void)cbResult; /* For silencing a static analysis warning. */\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_get_device_info__jack(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    ma_jack_client_t* pClient;\n    ma_result result;\n    const char** ppPorts;\n\n    MA_ASSERT(pContext != NULL);\n\n    if (pDeviceID != NULL && pDeviceID->jack != 0) {\n        return MA_NO_DEVICE;   /* Don't know the device. */\n    }\n\n    /* Name / Description */\n    if (deviceType == ma_device_type_playback) {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n    } else {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n    }\n\n    /* Jack only uses default devices. */\n    pDeviceInfo->isDefault = MA_TRUE;\n\n    /* Jack only supports f32 and has a specific channel count and sample rate. */\n    pDeviceInfo->nativeDataFormats[0].format = ma_format_f32;\n\n    /* The channel count and sample rate can only be determined by opening the device. */\n    result = ma_context_open_client__jack(pContext, &pClient);\n    if (result != MA_SUCCESS) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to open client.\");\n        return result;\n    }\n\n    pDeviceInfo->nativeDataFormats[0].sampleRate = ((ma_jack_get_sample_rate_proc)pContext->jack.jack_get_sample_rate)((ma_jack_client_t*)pClient);\n    pDeviceInfo->nativeDataFormats[0].channels   = 0;\n\n    ppPorts = ((ma_jack_get_ports_proc)pContext->jack.jack_get_ports)((ma_jack_client_t*)pClient, NULL, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsPhysical | ((deviceType == ma_device_type_playback) ? ma_JackPortIsInput : ma_JackPortIsOutput));\n    if (ppPorts == NULL) {\n        ((ma_jack_client_close_proc)pContext->jack.jack_client_close)((ma_jack_client_t*)pClient);\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to query physical ports.\");\n        return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n    }\n\n    while (ppPorts[pDeviceInfo->nativeDataFormats[0].channels] != NULL) {\n        pDeviceInfo->nativeDataFormats[0].channels += 1;\n    }\n\n    pDeviceInfo->nativeDataFormats[0].flags = 0;\n    pDeviceInfo->nativeDataFormatCount = 1;\n\n    ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppPorts);\n    ((ma_jack_client_close_proc)pContext->jack.jack_client_close)((ma_jack_client_t*)pClient);\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_device_uninit__jack(ma_device* pDevice)\n{\n    ma_context* pContext;\n\n    MA_ASSERT(pDevice != NULL);\n\n    pContext = pDevice->pContext;\n    MA_ASSERT(pContext != NULL);\n\n    if (pDevice->jack.pClient != NULL) {\n        ((ma_jack_client_close_proc)pContext->jack.jack_client_close)((ma_jack_client_t*)pDevice->jack.pClient);\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ma_free(pDevice->jack.pIntermediaryBufferCapture, &pDevice->pContext->allocationCallbacks);\n        ma_free(pDevice->jack.ppPortsCapture, &pDevice->pContext->allocationCallbacks);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_free(pDevice->jack.pIntermediaryBufferPlayback, &pDevice->pContext->allocationCallbacks);\n        ma_free(pDevice->jack.ppPortsPlayback, &pDevice->pContext->allocationCallbacks);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_device__jack_shutdown_callback(void* pUserData)\n{\n    /* JACK died. Stop the device. */\n    ma_device* pDevice = (ma_device*)pUserData;\n    MA_ASSERT(pDevice != NULL);\n\n    ma_device_stop(pDevice);\n}\n\nstatic int ma_device__jack_buffer_size_callback(ma_jack_nframes_t frameCount, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        size_t newBufferSize = frameCount * (pDevice->capture.internalChannels * ma_get_bytes_per_sample(pDevice->capture.internalFormat));\n        float* pNewBuffer = (float*)ma_calloc(newBufferSize, &pDevice->pContext->allocationCallbacks);\n        if (pNewBuffer == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n\n        ma_free(pDevice->jack.pIntermediaryBufferCapture, &pDevice->pContext->allocationCallbacks);\n\n        pDevice->jack.pIntermediaryBufferCapture = pNewBuffer;\n        pDevice->playback.internalPeriodSizeInFrames = frameCount;\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        size_t newBufferSize = frameCount * (pDevice->playback.internalChannels * ma_get_bytes_per_sample(pDevice->playback.internalFormat));\n        float* pNewBuffer = (float*)ma_calloc(newBufferSize, &pDevice->pContext->allocationCallbacks);\n        if (pNewBuffer == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n\n        ma_free(pDevice->jack.pIntermediaryBufferPlayback, &pDevice->pContext->allocationCallbacks);\n\n        pDevice->jack.pIntermediaryBufferPlayback = pNewBuffer;\n        pDevice->playback.internalPeriodSizeInFrames = frameCount;\n    }\n\n    return 0;\n}\n\nstatic int ma_device__jack_process_callback(ma_jack_nframes_t frameCount, void* pUserData)\n{\n    ma_device* pDevice;\n    ma_context* pContext;\n    ma_uint32 iChannel;\n\n    pDevice = (ma_device*)pUserData;\n    MA_ASSERT(pDevice != NULL);\n\n    pContext = pDevice->pContext;\n    MA_ASSERT(pContext != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        /* Channels need to be interleaved. */\n        for (iChannel = 0; iChannel < pDevice->capture.internalChannels; ++iChannel) {\n            const float* pSrc = (const float*)((ma_jack_port_get_buffer_proc)pContext->jack.jack_port_get_buffer)((ma_jack_port_t*)pDevice->jack.ppPortsCapture[iChannel], frameCount);\n            if (pSrc != NULL) {\n                float* pDst = pDevice->jack.pIntermediaryBufferCapture + iChannel;\n                ma_jack_nframes_t iFrame;\n                for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                    *pDst = *pSrc;\n\n                    pDst += pDevice->capture.internalChannels;\n                    pSrc += 1;\n                }\n            }\n        }\n\n        ma_device_handle_backend_data_callback(pDevice, NULL, pDevice->jack.pIntermediaryBufferCapture, frameCount);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_device_handle_backend_data_callback(pDevice, pDevice->jack.pIntermediaryBufferPlayback, NULL, frameCount);\n\n        /* Channels need to be deinterleaved. */\n        for (iChannel = 0; iChannel < pDevice->playback.internalChannels; ++iChannel) {\n            float* pDst = (float*)((ma_jack_port_get_buffer_proc)pContext->jack.jack_port_get_buffer)((ma_jack_port_t*)pDevice->jack.ppPortsPlayback[iChannel], frameCount);\n            if (pDst != NULL) {\n                const float* pSrc = pDevice->jack.pIntermediaryBufferPlayback + iChannel;\n                ma_jack_nframes_t iFrame;\n                for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                    *pDst = *pSrc;\n\n                    pDst += 1;\n                    pSrc += pDevice->playback.internalChannels;\n                }\n            }\n        }\n    }\n\n    return 0;\n}\n\nstatic ma_result ma_device_init__jack(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n    ma_result result;\n    ma_uint32 periodSizeInFrames;\n\n    MA_ASSERT(pConfig != NULL);\n    MA_ASSERT(pDevice != NULL);\n\n    if (pConfig->deviceType == ma_device_type_loopback) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Loopback mode not supported.\");\n        return MA_DEVICE_TYPE_NOT_SUPPORTED;\n    }\n\n    /* Only supporting default devices with JACK. */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->pDeviceID != NULL && pDescriptorPlayback->pDeviceID->jack != 0) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->pDeviceID  != NULL && pDescriptorCapture->pDeviceID->jack  != 0)) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Only default devices are supported.\");\n        return MA_NO_DEVICE;\n    }\n\n    /* No exclusive mode with the JACK backend. */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->shareMode == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->shareMode  == ma_share_mode_exclusive)) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Exclusive mode not supported.\");\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    /* Open the client. */\n    result = ma_context_open_client__jack(pDevice->pContext, (ma_jack_client_t**)&pDevice->jack.pClient);\n    if (result != MA_SUCCESS) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to open client.\");\n        return result;\n    }\n\n    /* Callbacks. */\n    if (((ma_jack_set_process_callback_proc)pDevice->pContext->jack.jack_set_process_callback)((ma_jack_client_t*)pDevice->jack.pClient, ma_device__jack_process_callback, pDevice) != 0) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to set process callback.\");\n        return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n    }\n    if (((ma_jack_set_buffer_size_callback_proc)pDevice->pContext->jack.jack_set_buffer_size_callback)((ma_jack_client_t*)pDevice->jack.pClient, ma_device__jack_buffer_size_callback, pDevice) != 0) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to set buffer size callback.\");\n        return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n    }\n\n    ((ma_jack_on_shutdown_proc)pDevice->pContext->jack.jack_on_shutdown)((ma_jack_client_t*)pDevice->jack.pClient, ma_device__jack_shutdown_callback, pDevice);\n\n\n    /* The buffer size in frames can change. */\n    periodSizeInFrames = ((ma_jack_get_buffer_size_proc)pDevice->pContext->jack.jack_get_buffer_size)((ma_jack_client_t*)pDevice->jack.pClient);\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_uint32 iPort;\n        const char** ppPorts;\n\n        pDescriptorCapture->format     = ma_format_f32;\n        pDescriptorCapture->channels   = 0;\n        pDescriptorCapture->sampleRate = ((ma_jack_get_sample_rate_proc)pDevice->pContext->jack.jack_get_sample_rate)((ma_jack_client_t*)pDevice->jack.pClient);\n        ma_channel_map_init_standard(ma_standard_channel_map_alsa, pDescriptorCapture->channelMap, ma_countof(pDescriptorCapture->channelMap), pDescriptorCapture->channels);\n\n        ppPorts = ((ma_jack_get_ports_proc)pDevice->pContext->jack.jack_get_ports)((ma_jack_client_t*)pDevice->jack.pClient, NULL, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsPhysical | ma_JackPortIsOutput);\n        if (ppPorts == NULL) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to query physical ports.\");\n            return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n        }\n\n        /* Need to count the number of ports first so we can allocate some memory. */\n        while (ppPorts[pDescriptorCapture->channels] != NULL) {\n            pDescriptorCapture->channels += 1;\n        }\n\n        pDevice->jack.ppPortsCapture = (ma_ptr*)ma_malloc(sizeof(*pDevice->jack.ppPortsCapture) * pDescriptorCapture->channels, &pDevice->pContext->allocationCallbacks);\n        if (pDevice->jack.ppPortsCapture == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n\n        for (iPort = 0; iPort < pDescriptorCapture->channels; iPort += 1) {\n            char name[64];\n            ma_strcpy_s(name, sizeof(name), \"capture\");\n            ma_itoa_s((int)iPort, name+7, sizeof(name)-7, 10); /* 7 = length of \"capture\" */\n\n            pDevice->jack.ppPortsCapture[iPort] = ((ma_jack_port_register_proc)pDevice->pContext->jack.jack_port_register)((ma_jack_client_t*)pDevice->jack.pClient, name, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsInput, 0);\n            if (pDevice->jack.ppPortsCapture[iPort] == NULL) {\n                ((ma_jack_free_proc)pDevice->pContext->jack.jack_free)((void*)ppPorts);\n                ma_device_uninit__jack(pDevice);\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to register ports.\");\n                return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n            }\n        }\n\n        ((ma_jack_free_proc)pDevice->pContext->jack.jack_free)((void*)ppPorts);\n\n        pDescriptorCapture->periodSizeInFrames = periodSizeInFrames;\n        pDescriptorCapture->periodCount        = 1; /* There's no notion of a period in JACK. Just set to 1. */\n\n        pDevice->jack.pIntermediaryBufferCapture = (float*)ma_calloc(pDescriptorCapture->periodSizeInFrames * ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels), &pDevice->pContext->allocationCallbacks);\n        if (pDevice->jack.pIntermediaryBufferCapture == NULL) {\n            ma_device_uninit__jack(pDevice);\n            return MA_OUT_OF_MEMORY;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_uint32 iPort;\n        const char** ppPorts;\n\n        pDescriptorPlayback->format     = ma_format_f32;\n        pDescriptorPlayback->channels   = 0;\n        pDescriptorPlayback->sampleRate = ((ma_jack_get_sample_rate_proc)pDevice->pContext->jack.jack_get_sample_rate)((ma_jack_client_t*)pDevice->jack.pClient);\n        ma_channel_map_init_standard(ma_standard_channel_map_alsa, pDescriptorPlayback->channelMap, ma_countof(pDescriptorPlayback->channelMap), pDescriptorPlayback->channels);\n\n        ppPorts = ((ma_jack_get_ports_proc)pDevice->pContext->jack.jack_get_ports)((ma_jack_client_t*)pDevice->jack.pClient, NULL, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsPhysical | ma_JackPortIsInput);\n        if (ppPorts == NULL) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to query physical ports.\");\n            return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n        }\n\n        /* Need to count the number of ports first so we can allocate some memory. */\n        while (ppPorts[pDescriptorPlayback->channels] != NULL) {\n            pDescriptorPlayback->channels += 1;\n        }\n\n        pDevice->jack.ppPortsPlayback = (ma_ptr*)ma_malloc(sizeof(*pDevice->jack.ppPortsPlayback) * pDescriptorPlayback->channels, &pDevice->pContext->allocationCallbacks);\n        if (pDevice->jack.ppPortsPlayback == NULL) {\n            ma_free(pDevice->jack.ppPortsCapture, &pDevice->pContext->allocationCallbacks);\n            return MA_OUT_OF_MEMORY;\n        }\n\n        for (iPort = 0; iPort < pDescriptorPlayback->channels; iPort += 1) {\n            char name[64];\n            ma_strcpy_s(name, sizeof(name), \"playback\");\n            ma_itoa_s((int)iPort, name+8, sizeof(name)-8, 10); /* 8 = length of \"playback\" */\n\n            pDevice->jack.ppPortsPlayback[iPort] = ((ma_jack_port_register_proc)pDevice->pContext->jack.jack_port_register)((ma_jack_client_t*)pDevice->jack.pClient, name, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsOutput, 0);\n            if (pDevice->jack.ppPortsPlayback[iPort] == NULL) {\n                ((ma_jack_free_proc)pDevice->pContext->jack.jack_free)((void*)ppPorts);\n                ma_device_uninit__jack(pDevice);\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to register ports.\");\n                return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n            }\n        }\n\n        ((ma_jack_free_proc)pDevice->pContext->jack.jack_free)((void*)ppPorts);\n\n        pDescriptorPlayback->periodSizeInFrames = periodSizeInFrames;\n        pDescriptorPlayback->periodCount        = 1;   /* There's no notion of a period in JACK. Just set to 1. */\n\n        pDevice->jack.pIntermediaryBufferPlayback = (float*)ma_calloc(pDescriptorPlayback->periodSizeInFrames * ma_get_bytes_per_frame(pDescriptorPlayback->format, pDescriptorPlayback->channels), &pDevice->pContext->allocationCallbacks);\n        if (pDevice->jack.pIntermediaryBufferPlayback == NULL) {\n            ma_device_uninit__jack(pDevice);\n            return MA_OUT_OF_MEMORY;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_device_start__jack(ma_device* pDevice)\n{\n    ma_context* pContext = pDevice->pContext;\n    int resultJACK;\n    size_t i;\n\n    resultJACK = ((ma_jack_activate_proc)pContext->jack.jack_activate)((ma_jack_client_t*)pDevice->jack.pClient);\n    if (resultJACK != 0) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to activate the JACK client.\");\n        return MA_FAILED_TO_START_BACKEND_DEVICE;\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        const char** ppServerPorts = ((ma_jack_get_ports_proc)pContext->jack.jack_get_ports)((ma_jack_client_t*)pDevice->jack.pClient, NULL, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsPhysical | ma_JackPortIsOutput);\n        if (ppServerPorts == NULL) {\n            ((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to retrieve physical ports.\");\n            return MA_ERROR;\n        }\n\n        for (i = 0; ppServerPorts[i] != NULL; ++i) {\n            const char* pServerPort = ppServerPorts[i];\n            const char* pClientPort = ((ma_jack_port_name_proc)pContext->jack.jack_port_name)((ma_jack_port_t*)pDevice->jack.ppPortsCapture[i]);\n\n            resultJACK = ((ma_jack_connect_proc)pContext->jack.jack_connect)((ma_jack_client_t*)pDevice->jack.pClient, pServerPort, pClientPort);\n            if (resultJACK != 0) {\n                ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppServerPorts);\n                ((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient);\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to connect ports.\");\n                return MA_ERROR;\n            }\n        }\n\n        ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppServerPorts);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        const char** ppServerPorts = ((ma_jack_get_ports_proc)pContext->jack.jack_get_ports)((ma_jack_client_t*)pDevice->jack.pClient, NULL, MA_JACK_DEFAULT_AUDIO_TYPE, ma_JackPortIsPhysical | ma_JackPortIsInput);\n        if (ppServerPorts == NULL) {\n            ((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to retrieve physical ports.\");\n            return MA_ERROR;\n        }\n\n        for (i = 0; ppServerPorts[i] != NULL; ++i) {\n            const char* pServerPort = ppServerPorts[i];\n            const char* pClientPort = ((ma_jack_port_name_proc)pContext->jack.jack_port_name)((ma_jack_port_t*)pDevice->jack.ppPortsPlayback[i]);\n\n            resultJACK = ((ma_jack_connect_proc)pContext->jack.jack_connect)((ma_jack_client_t*)pDevice->jack.pClient, pClientPort, pServerPort);\n            if (resultJACK != 0) {\n                ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppServerPorts);\n                ((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient);\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] Failed to connect ports.\");\n                return MA_ERROR;\n            }\n        }\n\n        ((ma_jack_free_proc)pContext->jack.jack_free)((void*)ppServerPorts);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop__jack(ma_device* pDevice)\n{\n    ma_context* pContext = pDevice->pContext;\n\n    if (((ma_jack_deactivate_proc)pContext->jack.jack_deactivate)((ma_jack_client_t*)pDevice->jack.pClient) != 0) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[JACK] An error occurred when deactivating the JACK client.\");\n        return MA_ERROR;\n    }\n\n    ma_device__on_notification_stopped(pDevice);\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_context_uninit__jack(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_jack);\n\n    ma_free(pContext->jack.pClientName, &pContext->allocationCallbacks);\n    pContext->jack.pClientName = NULL;\n\n#ifndef MA_NO_RUNTIME_LINKING\n    ma_dlclose(ma_context_get_log(pContext), pContext->jack.jackSO);\n#endif\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init__jack(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n#ifndef MA_NO_RUNTIME_LINKING\n    const char* libjackNames[] = {\n#if defined(MA_WIN32)\n        \"libjack.dll\",\n        \"libjack64.dll\"\n#endif\n#if defined(MA_UNIX)\n        \"libjack.so\",\n        \"libjack.so.0\"\n#endif\n    };\n    size_t i;\n\n    for (i = 0; i < ma_countof(libjackNames); ++i) {\n        pContext->jack.jackSO = ma_dlopen(ma_context_get_log(pContext), libjackNames[i]);\n        if (pContext->jack.jackSO != NULL) {\n            break;\n        }\n    }\n\n    if (pContext->jack.jackSO == NULL) {\n        return MA_NO_BACKEND;\n    }\n\n    pContext->jack.jack_client_open              = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_client_open\");\n    pContext->jack.jack_client_close             = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_client_close\");\n    pContext->jack.jack_client_name_size         = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_client_name_size\");\n    pContext->jack.jack_set_process_callback     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_set_process_callback\");\n    pContext->jack.jack_set_buffer_size_callback = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_set_buffer_size_callback\");\n    pContext->jack.jack_on_shutdown              = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_on_shutdown\");\n    pContext->jack.jack_get_sample_rate          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_get_sample_rate\");\n    pContext->jack.jack_get_buffer_size          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_get_buffer_size\");\n    pContext->jack.jack_get_ports                = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_get_ports\");\n    pContext->jack.jack_activate                 = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_activate\");\n    pContext->jack.jack_deactivate               = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_deactivate\");\n    pContext->jack.jack_connect                  = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_connect\");\n    pContext->jack.jack_port_register            = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_port_register\");\n    pContext->jack.jack_port_name                = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_port_name\");\n    pContext->jack.jack_port_get_buffer          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_port_get_buffer\");\n    pContext->jack.jack_free                     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->jack.jackSO, \"jack_free\");\n#else\n    /*\n    This strange assignment system is here just to ensure type safety of miniaudio's function pointer\n    types. If anything differs slightly the compiler should throw a warning.\n    */\n    ma_jack_client_open_proc              _jack_client_open              = jack_client_open;\n    ma_jack_client_close_proc             _jack_client_close             = jack_client_close;\n    ma_jack_client_name_size_proc         _jack_client_name_size         = jack_client_name_size;\n    ma_jack_set_process_callback_proc     _jack_set_process_callback     = jack_set_process_callback;\n    ma_jack_set_buffer_size_callback_proc _jack_set_buffer_size_callback = jack_set_buffer_size_callback;\n    ma_jack_on_shutdown_proc              _jack_on_shutdown              = jack_on_shutdown;\n    ma_jack_get_sample_rate_proc          _jack_get_sample_rate          = jack_get_sample_rate;\n    ma_jack_get_buffer_size_proc          _jack_get_buffer_size          = jack_get_buffer_size;\n    ma_jack_get_ports_proc                _jack_get_ports                = jack_get_ports;\n    ma_jack_activate_proc                 _jack_activate                 = jack_activate;\n    ma_jack_deactivate_proc               _jack_deactivate               = jack_deactivate;\n    ma_jack_connect_proc                  _jack_connect                  = jack_connect;\n    ma_jack_port_register_proc            _jack_port_register            = jack_port_register;\n    ma_jack_port_name_proc                _jack_port_name                = jack_port_name;\n    ma_jack_port_get_buffer_proc          _jack_port_get_buffer          = jack_port_get_buffer;\n    ma_jack_free_proc                     _jack_free                     = jack_free;\n\n    pContext->jack.jack_client_open              = (ma_proc)_jack_client_open;\n    pContext->jack.jack_client_close             = (ma_proc)_jack_client_close;\n    pContext->jack.jack_client_name_size         = (ma_proc)_jack_client_name_size;\n    pContext->jack.jack_set_process_callback     = (ma_proc)_jack_set_process_callback;\n    pContext->jack.jack_set_buffer_size_callback = (ma_proc)_jack_set_buffer_size_callback;\n    pContext->jack.jack_on_shutdown              = (ma_proc)_jack_on_shutdown;\n    pContext->jack.jack_get_sample_rate          = (ma_proc)_jack_get_sample_rate;\n    pContext->jack.jack_get_buffer_size          = (ma_proc)_jack_get_buffer_size;\n    pContext->jack.jack_get_ports                = (ma_proc)_jack_get_ports;\n    pContext->jack.jack_activate                 = (ma_proc)_jack_activate;\n    pContext->jack.jack_deactivate               = (ma_proc)_jack_deactivate;\n    pContext->jack.jack_connect                  = (ma_proc)_jack_connect;\n    pContext->jack.jack_port_register            = (ma_proc)_jack_port_register;\n    pContext->jack.jack_port_name                = (ma_proc)_jack_port_name;\n    pContext->jack.jack_port_get_buffer          = (ma_proc)_jack_port_get_buffer;\n    pContext->jack.jack_free                     = (ma_proc)_jack_free;\n#endif\n\n    if (pConfig->jack.pClientName != NULL) {\n        pContext->jack.pClientName = ma_copy_string(pConfig->jack.pClientName, &pContext->allocationCallbacks);\n    }\n    pContext->jack.tryStartServer = pConfig->jack.tryStartServer;\n\n    /*\n    Getting here means the JACK library is installed, but it doesn't necessarily mean it's usable. We need to quickly test this by connecting\n    a temporary client.\n    */\n    {\n        ma_jack_client_t* pDummyClient;\n        ma_result result = ma_context_open_client__jack(pContext, &pDummyClient);\n        if (result != MA_SUCCESS) {\n            ma_free(pContext->jack.pClientName, &pContext->allocationCallbacks);\n        #ifndef MA_NO_RUNTIME_LINKING\n            ma_dlclose(ma_context_get_log(pContext), pContext->jack.jackSO);\n        #endif\n            return MA_NO_BACKEND;\n        }\n\n        ((ma_jack_client_close_proc)pContext->jack.jack_client_close)((ma_jack_client_t*)pDummyClient);\n    }\n\n\n    pCallbacks->onContextInit             = ma_context_init__jack;\n    pCallbacks->onContextUninit           = ma_context_uninit__jack;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__jack;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__jack;\n    pCallbacks->onDeviceInit              = ma_device_init__jack;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__jack;\n    pCallbacks->onDeviceStart             = ma_device_start__jack;\n    pCallbacks->onDeviceStop              = ma_device_stop__jack;\n    pCallbacks->onDeviceRead              = NULL;   /* Not used because JACK is asynchronous. */\n    pCallbacks->onDeviceWrite             = NULL;   /* Not used because JACK is asynchronous. */\n    pCallbacks->onDeviceDataLoop          = NULL;   /* Not used because JACK is asynchronous. */\n\n    return MA_SUCCESS;\n}\n#endif  /* JACK */\n\n\n\n/******************************************************************************\n\nCore Audio Backend\n\nReferences\n==========\n- Technical Note TN2091: Device input using the HAL Output Audio Unit\n    https://developer.apple.com/library/archive/technotes/tn2091/_index.html\n\n******************************************************************************/\n#ifdef MA_HAS_COREAUDIO\n#include <TargetConditionals.h>\n\n#if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1\n    #define MA_APPLE_MOBILE\n    #if defined(TARGET_OS_TV) && TARGET_OS_TV == 1\n        #define MA_APPLE_TV\n    #endif\n    #if defined(TARGET_OS_WATCH) && TARGET_OS_WATCH == 1\n        #define MA_APPLE_WATCH\n    #endif\n    #if __has_feature(objc_arc)\n        #define MA_BRIDGE_TRANSFER  __bridge_transfer\n        #define MA_BRIDGE_RETAINED  __bridge_retained\n    #else\n        #define MA_BRIDGE_TRANSFER\n        #define MA_BRIDGE_RETAINED\n    #endif\n#else\n    #define MA_APPLE_DESKTOP\n#endif\n\n#if defined(MA_APPLE_DESKTOP)\n#include <CoreAudio/CoreAudio.h>\n#else\n#include <AVFoundation/AVFoundation.h>\n#endif\n\n#include <AudioToolbox/AudioToolbox.h>\n\n/* CoreFoundation */\ntypedef Boolean (* ma_CFStringGetCString_proc)(CFStringRef theString, char* buffer, CFIndex bufferSize, CFStringEncoding encoding);\ntypedef void (* ma_CFRelease_proc)(CFTypeRef cf);\n\n/* CoreAudio */\n#if defined(MA_APPLE_DESKTOP)\ntypedef OSStatus (* ma_AudioObjectGetPropertyData_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32* ioDataSize, void* outData);\ntypedef OSStatus (* ma_AudioObjectGetPropertyDataSize_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32* outDataSize);\ntypedef OSStatus (* ma_AudioObjectSetPropertyData_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, UInt32 inQualifierDataSize, const void* inQualifierData, UInt32 inDataSize, const void* inData);\ntypedef OSStatus (* ma_AudioObjectAddPropertyListener_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, AudioObjectPropertyListenerProc inListener, void* inClientData);\ntypedef OSStatus (* ma_AudioObjectRemovePropertyListener_proc)(AudioObjectID inObjectID, const AudioObjectPropertyAddress* inAddress, AudioObjectPropertyListenerProc inListener, void* inClientData);\n#endif\n\n/* AudioToolbox */\ntypedef AudioComponent (* ma_AudioComponentFindNext_proc)(AudioComponent inComponent, const AudioComponentDescription* inDesc);\ntypedef OSStatus (* ma_AudioComponentInstanceDispose_proc)(AudioComponentInstance inInstance);\ntypedef OSStatus (* ma_AudioComponentInstanceNew_proc)(AudioComponent inComponent, AudioComponentInstance* outInstance);\ntypedef OSStatus (* ma_AudioOutputUnitStart_proc)(AudioUnit inUnit);\ntypedef OSStatus (* ma_AudioOutputUnitStop_proc)(AudioUnit inUnit);\ntypedef OSStatus (* ma_AudioUnitAddPropertyListener_proc)(AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitPropertyListenerProc inProc, void* inProcUserData);\ntypedef OSStatus (* ma_AudioUnitGetPropertyInfo_proc)(AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, UInt32* outDataSize, Boolean* outWriteable);\ntypedef OSStatus (* ma_AudioUnitGetProperty_proc)(AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, void* outData, UInt32* ioDataSize);\ntypedef OSStatus (* ma_AudioUnitSetProperty_proc)(AudioUnit inUnit, AudioUnitPropertyID inID, AudioUnitScope inScope, AudioUnitElement inElement, const void* inData, UInt32 inDataSize);\ntypedef OSStatus (* ma_AudioUnitInitialize_proc)(AudioUnit inUnit);\ntypedef OSStatus (* ma_AudioUnitRender_proc)(AudioUnit inUnit, AudioUnitRenderActionFlags* ioActionFlags, const AudioTimeStamp* inTimeStamp, UInt32 inOutputBusNumber, UInt32 inNumberFrames, AudioBufferList* ioData);\n\n\n#define MA_COREAUDIO_OUTPUT_BUS    0\n#define MA_COREAUDIO_INPUT_BUS     1\n\n#if defined(MA_APPLE_DESKTOP)\nstatic ma_result ma_device_reinit_internal__coreaudio(ma_device* pDevice, ma_device_type deviceType, ma_bool32 disposePreviousAudioUnit);\n#endif\n\n/*\nCore Audio\n\nSo far, Core Audio has been the worst backend to work with due to being both unintuitive and having almost no documentation\napart from comments in the headers (which admittedly are quite good). For my own purposes, and for anybody out there whose\nneeding to figure out how this darn thing works, I'm going to outline a few things here.\n\nSince miniaudio is a fairly low-level API, one of the things it needs is control over specific devices, and it needs to be\nable to identify whether or not it can be used as playback and/or capture. The AudioObject API is the only one I've seen\nthat supports this level of detail. There was some public domain sample code I stumbled across that used the AudioComponent\nand AudioUnit APIs, but I couldn't see anything that gave low-level control over device selection and capabilities (the\ndistinction between playback and capture in particular). Therefore, miniaudio is using the AudioObject API.\n\nMost (all?) functions in the AudioObject API take a AudioObjectID as it's input. This is the device identifier. When\nretrieving global information, such as the device list, you use kAudioObjectSystemObject. When retrieving device-specific\ndata, you pass in the ID for that device. In order to retrieve device-specific IDs you need to enumerate over each of the\ndevices. This is done using the AudioObjectGetPropertyDataSize() and AudioObjectGetPropertyData() APIs which seem to be\nthe central APIs for retrieving information about the system and specific devices.\n\nTo use the AudioObjectGetPropertyData() API you need to use the notion of a property address. A property address is a\nstructure with three variables and is used to identify which property you are getting or setting. The first is the \"selector\"\nwhich is basically the specific property that you're wanting to retrieve or set. The second is the \"scope\", which is\ntypically set to kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyScopeInput for input-specific properties and\nkAudioObjectPropertyScopeOutput for output-specific properties. The last is the \"element\" which is always set to\nkAudioObjectPropertyElementMain in miniaudio's case. I don't know of any cases where this would be set to anything different.\n\nBack to the earlier issue of device retrieval, you first use the AudioObjectGetPropertyDataSize() API to retrieve the size\nof the raw data which is just a list of AudioDeviceID's. You use the kAudioObjectSystemObject AudioObjectID, and a property\naddress with the kAudioHardwarePropertyDevices selector and the kAudioObjectPropertyScopeGlobal scope. Once you have the\nsize, allocate a block of memory of that size and then call AudioObjectGetPropertyData(). The data is just a list of\nAudioDeviceID's so just do \"dataSize/sizeof(AudioDeviceID)\" to know the device count.\n*/\n\n#if defined(MA_APPLE_MOBILE)\nstatic void ma_device__on_notification_interruption_began(ma_device* pDevice)\n{\n    ma_device__on_notification(ma_device_notification_init(pDevice, ma_device_notification_type_interruption_began));\n}\n\nstatic void ma_device__on_notification_interruption_ended(ma_device* pDevice)\n{\n    ma_device__on_notification(ma_device_notification_init(pDevice, ma_device_notification_type_interruption_ended));\n}\n#endif\n\nstatic ma_result ma_result_from_OSStatus(OSStatus status)\n{\n    switch (status)\n    {\n        case noErr:                                   return MA_SUCCESS;\n    #if defined(MA_APPLE_DESKTOP)\n        case kAudioHardwareNotRunningError:           return MA_DEVICE_NOT_STARTED;\n        case kAudioHardwareUnspecifiedError:          return MA_ERROR;\n        case kAudioHardwareUnknownPropertyError:      return MA_INVALID_ARGS;\n        case kAudioHardwareBadPropertySizeError:      return MA_INVALID_OPERATION;\n        case kAudioHardwareIllegalOperationError:     return MA_INVALID_OPERATION;\n        case kAudioHardwareBadObjectError:            return MA_INVALID_ARGS;\n        case kAudioHardwareBadDeviceError:            return MA_INVALID_ARGS;\n        case kAudioHardwareBadStreamError:            return MA_INVALID_ARGS;\n        case kAudioHardwareUnsupportedOperationError: return MA_INVALID_OPERATION;\n        case kAudioDeviceUnsupportedFormatError:      return MA_FORMAT_NOT_SUPPORTED;\n        case kAudioDevicePermissionsError:            return MA_ACCESS_DENIED;\n    #endif\n        default:                                      return MA_ERROR;\n    }\n}\n\n#if 0\nstatic ma_channel ma_channel_from_AudioChannelBitmap(AudioChannelBitmap bit)\n{\n    switch (bit)\n    {\n        case kAudioChannelBit_Left:                 return MA_CHANNEL_LEFT;\n        case kAudioChannelBit_Right:                return MA_CHANNEL_RIGHT;\n        case kAudioChannelBit_Center:               return MA_CHANNEL_FRONT_CENTER;\n        case kAudioChannelBit_LFEScreen:            return MA_CHANNEL_LFE;\n        case kAudioChannelBit_LeftSurround:         return MA_CHANNEL_BACK_LEFT;\n        case kAudioChannelBit_RightSurround:        return MA_CHANNEL_BACK_RIGHT;\n        case kAudioChannelBit_LeftCenter:           return MA_CHANNEL_FRONT_LEFT_CENTER;\n        case kAudioChannelBit_RightCenter:          return MA_CHANNEL_FRONT_RIGHT_CENTER;\n        case kAudioChannelBit_CenterSurround:       return MA_CHANNEL_BACK_CENTER;\n        case kAudioChannelBit_LeftSurroundDirect:   return MA_CHANNEL_SIDE_LEFT;\n        case kAudioChannelBit_RightSurroundDirect:  return MA_CHANNEL_SIDE_RIGHT;\n        case kAudioChannelBit_TopCenterSurround:    return MA_CHANNEL_TOP_CENTER;\n        case kAudioChannelBit_VerticalHeightLeft:   return MA_CHANNEL_TOP_FRONT_LEFT;\n        case kAudioChannelBit_VerticalHeightCenter: return MA_CHANNEL_TOP_FRONT_CENTER;\n        case kAudioChannelBit_VerticalHeightRight:  return MA_CHANNEL_TOP_FRONT_RIGHT;\n        case kAudioChannelBit_TopBackLeft:          return MA_CHANNEL_TOP_BACK_LEFT;\n        case kAudioChannelBit_TopBackCenter:        return MA_CHANNEL_TOP_BACK_CENTER;\n        case kAudioChannelBit_TopBackRight:         return MA_CHANNEL_TOP_BACK_RIGHT;\n        default:                                    return MA_CHANNEL_NONE;\n    }\n}\n#endif\n\nstatic ma_result ma_format_from_AudioStreamBasicDescription(const AudioStreamBasicDescription* pDescription, ma_format* pFormatOut)\n{\n    MA_ASSERT(pDescription != NULL);\n    MA_ASSERT(pFormatOut != NULL);\n\n    *pFormatOut = ma_format_unknown;   /* Safety. */\n\n    /* There's a few things miniaudio doesn't support. */\n    if (pDescription->mFormatID != kAudioFormatLinearPCM) {\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n\n    /* We don't support any non-packed formats that are aligned high. */\n    if ((pDescription->mFormatFlags & kLinearPCMFormatFlagIsAlignedHigh) != 0) {\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n\n    /* Only supporting native-endian. */\n    if ((ma_is_little_endian() && (pDescription->mFormatFlags & kAudioFormatFlagIsBigEndian) != 0) || (ma_is_big_endian() && (pDescription->mFormatFlags & kAudioFormatFlagIsBigEndian) == 0)) {\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n\n    /* We are not currently supporting non-interleaved formats (this will be added in a future version of miniaudio). */\n    /*if ((pDescription->mFormatFlags & kAudioFormatFlagIsNonInterleaved) != 0) {\n        return MA_FORMAT_NOT_SUPPORTED;\n    }*/\n\n    if ((pDescription->mFormatFlags & kLinearPCMFormatFlagIsFloat) != 0) {\n        if (pDescription->mBitsPerChannel == 32) {\n            *pFormatOut = ma_format_f32;\n            return MA_SUCCESS;\n        }\n    } else {\n        if ((pDescription->mFormatFlags & kLinearPCMFormatFlagIsSignedInteger) != 0) {\n            if (pDescription->mBitsPerChannel == 16) {\n                *pFormatOut = ma_format_s16;\n                return MA_SUCCESS;\n            } else if (pDescription->mBitsPerChannel == 24) {\n                if (pDescription->mBytesPerFrame == (pDescription->mBitsPerChannel/8 * pDescription->mChannelsPerFrame)) {\n                    *pFormatOut = ma_format_s24;\n                    return MA_SUCCESS;\n                } else {\n                    if (pDescription->mBytesPerFrame/pDescription->mChannelsPerFrame == sizeof(ma_int32)) {\n                        /* TODO: Implement ma_format_s24_32. */\n                        /**pFormatOut = ma_format_s24_32;*/\n                        /*return MA_SUCCESS;*/\n                        return MA_FORMAT_NOT_SUPPORTED;\n                    }\n                }\n            } else if (pDescription->mBitsPerChannel == 32) {\n                *pFormatOut = ma_format_s32;\n                return MA_SUCCESS;\n            }\n        } else {\n            if (pDescription->mBitsPerChannel == 8) {\n                *pFormatOut = ma_format_u8;\n                return MA_SUCCESS;\n            }\n        }\n    }\n\n    /* Getting here means the format is not supported. */\n    return MA_FORMAT_NOT_SUPPORTED;\n}\n\n#if defined(MA_APPLE_DESKTOP)\nstatic ma_channel ma_channel_from_AudioChannelLabel(AudioChannelLabel label)\n{\n    switch (label)\n    {\n        case kAudioChannelLabel_Unknown:              return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Unused:               return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_UseCoordinates:       return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Left:                 return MA_CHANNEL_LEFT;\n        case kAudioChannelLabel_Right:                return MA_CHANNEL_RIGHT;\n        case kAudioChannelLabel_Center:               return MA_CHANNEL_FRONT_CENTER;\n        case kAudioChannelLabel_LFEScreen:            return MA_CHANNEL_LFE;\n        case kAudioChannelLabel_LeftSurround:         return MA_CHANNEL_BACK_LEFT;\n        case kAudioChannelLabel_RightSurround:        return MA_CHANNEL_BACK_RIGHT;\n        case kAudioChannelLabel_LeftCenter:           return MA_CHANNEL_FRONT_LEFT_CENTER;\n        case kAudioChannelLabel_RightCenter:          return MA_CHANNEL_FRONT_RIGHT_CENTER;\n        case kAudioChannelLabel_CenterSurround:       return MA_CHANNEL_BACK_CENTER;\n        case kAudioChannelLabel_LeftSurroundDirect:   return MA_CHANNEL_SIDE_LEFT;\n        case kAudioChannelLabel_RightSurroundDirect:  return MA_CHANNEL_SIDE_RIGHT;\n        case kAudioChannelLabel_TopCenterSurround:    return MA_CHANNEL_TOP_CENTER;\n        case kAudioChannelLabel_VerticalHeightLeft:   return MA_CHANNEL_TOP_FRONT_LEFT;\n        case kAudioChannelLabel_VerticalHeightCenter: return MA_CHANNEL_TOP_FRONT_CENTER;\n        case kAudioChannelLabel_VerticalHeightRight:  return MA_CHANNEL_TOP_FRONT_RIGHT;\n        case kAudioChannelLabel_TopBackLeft:          return MA_CHANNEL_TOP_BACK_LEFT;\n        case kAudioChannelLabel_TopBackCenter:        return MA_CHANNEL_TOP_BACK_CENTER;\n        case kAudioChannelLabel_TopBackRight:         return MA_CHANNEL_TOP_BACK_RIGHT;\n        case kAudioChannelLabel_RearSurroundLeft:     return MA_CHANNEL_BACK_LEFT;\n        case kAudioChannelLabel_RearSurroundRight:    return MA_CHANNEL_BACK_RIGHT;\n        case kAudioChannelLabel_LeftWide:             return MA_CHANNEL_SIDE_LEFT;\n        case kAudioChannelLabel_RightWide:            return MA_CHANNEL_SIDE_RIGHT;\n        case kAudioChannelLabel_LFE2:                 return MA_CHANNEL_LFE;\n        case kAudioChannelLabel_LeftTotal:            return MA_CHANNEL_LEFT;\n        case kAudioChannelLabel_RightTotal:           return MA_CHANNEL_RIGHT;\n        case kAudioChannelLabel_HearingImpaired:      return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Narration:            return MA_CHANNEL_MONO;\n        case kAudioChannelLabel_Mono:                 return MA_CHANNEL_MONO;\n        case kAudioChannelLabel_DialogCentricMix:     return MA_CHANNEL_MONO;\n        case kAudioChannelLabel_CenterSurroundDirect: return MA_CHANNEL_BACK_CENTER;\n        case kAudioChannelLabel_Haptic:               return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Ambisonic_W:          return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Ambisonic_X:          return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Ambisonic_Y:          return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Ambisonic_Z:          return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_MS_Mid:               return MA_CHANNEL_LEFT;\n        case kAudioChannelLabel_MS_Side:              return MA_CHANNEL_RIGHT;\n        case kAudioChannelLabel_XY_X:                 return MA_CHANNEL_LEFT;\n        case kAudioChannelLabel_XY_Y:                 return MA_CHANNEL_RIGHT;\n        case kAudioChannelLabel_HeadphonesLeft:       return MA_CHANNEL_LEFT;\n        case kAudioChannelLabel_HeadphonesRight:      return MA_CHANNEL_RIGHT;\n        case kAudioChannelLabel_ClickTrack:           return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_ForeignLanguage:      return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Discrete:             return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_Discrete_0:           return MA_CHANNEL_AUX_0;\n        case kAudioChannelLabel_Discrete_1:           return MA_CHANNEL_AUX_1;\n        case kAudioChannelLabel_Discrete_2:           return MA_CHANNEL_AUX_2;\n        case kAudioChannelLabel_Discrete_3:           return MA_CHANNEL_AUX_3;\n        case kAudioChannelLabel_Discrete_4:           return MA_CHANNEL_AUX_4;\n        case kAudioChannelLabel_Discrete_5:           return MA_CHANNEL_AUX_5;\n        case kAudioChannelLabel_Discrete_6:           return MA_CHANNEL_AUX_6;\n        case kAudioChannelLabel_Discrete_7:           return MA_CHANNEL_AUX_7;\n        case kAudioChannelLabel_Discrete_8:           return MA_CHANNEL_AUX_8;\n        case kAudioChannelLabel_Discrete_9:           return MA_CHANNEL_AUX_9;\n        case kAudioChannelLabel_Discrete_10:          return MA_CHANNEL_AUX_10;\n        case kAudioChannelLabel_Discrete_11:          return MA_CHANNEL_AUX_11;\n        case kAudioChannelLabel_Discrete_12:          return MA_CHANNEL_AUX_12;\n        case kAudioChannelLabel_Discrete_13:          return MA_CHANNEL_AUX_13;\n        case kAudioChannelLabel_Discrete_14:          return MA_CHANNEL_AUX_14;\n        case kAudioChannelLabel_Discrete_15:          return MA_CHANNEL_AUX_15;\n        case kAudioChannelLabel_Discrete_65535:       return MA_CHANNEL_NONE;\n\n    #if 0   /* Introduced in a later version of macOS. */\n        case kAudioChannelLabel_HOA_ACN:              return MA_CHANNEL_NONE;\n        case kAudioChannelLabel_HOA_ACN_0:            return MA_CHANNEL_AUX_0;\n        case kAudioChannelLabel_HOA_ACN_1:            return MA_CHANNEL_AUX_1;\n        case kAudioChannelLabel_HOA_ACN_2:            return MA_CHANNEL_AUX_2;\n        case kAudioChannelLabel_HOA_ACN_3:            return MA_CHANNEL_AUX_3;\n        case kAudioChannelLabel_HOA_ACN_4:            return MA_CHANNEL_AUX_4;\n        case kAudioChannelLabel_HOA_ACN_5:            return MA_CHANNEL_AUX_5;\n        case kAudioChannelLabel_HOA_ACN_6:            return MA_CHANNEL_AUX_6;\n        case kAudioChannelLabel_HOA_ACN_7:            return MA_CHANNEL_AUX_7;\n        case kAudioChannelLabel_HOA_ACN_8:            return MA_CHANNEL_AUX_8;\n        case kAudioChannelLabel_HOA_ACN_9:            return MA_CHANNEL_AUX_9;\n        case kAudioChannelLabel_HOA_ACN_10:           return MA_CHANNEL_AUX_10;\n        case kAudioChannelLabel_HOA_ACN_11:           return MA_CHANNEL_AUX_11;\n        case kAudioChannelLabel_HOA_ACN_12:           return MA_CHANNEL_AUX_12;\n        case kAudioChannelLabel_HOA_ACN_13:           return MA_CHANNEL_AUX_13;\n        case kAudioChannelLabel_HOA_ACN_14:           return MA_CHANNEL_AUX_14;\n        case kAudioChannelLabel_HOA_ACN_15:           return MA_CHANNEL_AUX_15;\n        case kAudioChannelLabel_HOA_ACN_65024:        return MA_CHANNEL_NONE;\n    #endif\n\n        default:                                      return MA_CHANNEL_NONE;\n    }\n}\n\nstatic ma_result ma_get_channel_map_from_AudioChannelLayout(AudioChannelLayout* pChannelLayout, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    MA_ASSERT(pChannelLayout != NULL);\n\n    if (pChannelLayout->mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelDescriptions) {\n        UInt32 iChannel;\n        for (iChannel = 0; iChannel < pChannelLayout->mNumberChannelDescriptions && iChannel < channelMapCap; ++iChannel) {\n            pChannelMap[iChannel] = ma_channel_from_AudioChannelLabel(pChannelLayout->mChannelDescriptions[iChannel].mChannelLabel);\n        }\n    } else\n#if 0\n    if (pChannelLayout->mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelBitmap) {\n        /* This is the same kind of system that's used by Windows audio APIs. */\n        UInt32 iChannel = 0;\n        UInt32 iBit;\n        AudioChannelBitmap bitmap = pChannelLayout->mChannelBitmap;\n        for (iBit = 0; iBit < 32 && iChannel < channelMapCap; ++iBit) {\n            AudioChannelBitmap bit = bitmap & (1 << iBit);\n            if (bit != 0) {\n                pChannelMap[iChannel++] = ma_channel_from_AudioChannelBit(bit);\n            }\n        }\n    } else\n#endif\n    {\n        /*\n        Need to use the tag to determine the channel map. For now I'm just assuming a default channel map, but later on this should\n        be updated to determine the mapping based on the tag.\n        */\n        UInt32 channelCount;\n\n        /* Our channel map retrieval APIs below take 32-bit integers, so we'll want to clamp the channel map capacity. */\n        if (channelMapCap > 0xFFFFFFFF) {\n            channelMapCap = 0xFFFFFFFF;\n        }\n\n        channelCount = ma_min(AudioChannelLayoutTag_GetNumberOfChannels(pChannelLayout->mChannelLayoutTag), (UInt32)channelMapCap);\n\n        switch (pChannelLayout->mChannelLayoutTag)\n        {\n            case kAudioChannelLayoutTag_Mono:\n            case kAudioChannelLayoutTag_Stereo:\n            case kAudioChannelLayoutTag_StereoHeadphones:\n            case kAudioChannelLayoutTag_MatrixStereo:\n            case kAudioChannelLayoutTag_MidSide:\n            case kAudioChannelLayoutTag_XY:\n            case kAudioChannelLayoutTag_Binaural:\n            case kAudioChannelLayoutTag_Ambisonic_B_Format:\n            {\n                ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, channelCount);\n            } break;\n\n            case kAudioChannelLayoutTag_Octagonal:\n            {\n                pChannelMap[7] = MA_CHANNEL_SIDE_RIGHT;\n                pChannelMap[6] = MA_CHANNEL_SIDE_LEFT;\n            } MA_FALLTHROUGH; /* Intentional fallthrough. */\n            case kAudioChannelLayoutTag_Hexagonal:\n            {\n                pChannelMap[5] = MA_CHANNEL_BACK_CENTER;\n            } MA_FALLTHROUGH; /* Intentional fallthrough. */\n            case kAudioChannelLayoutTag_Pentagonal:\n            {\n                pChannelMap[4] = MA_CHANNEL_FRONT_CENTER;\n            } MA_FALLTHROUGH; /* Intentional fallthrough. */\n            case kAudioChannelLayoutTag_Quadraphonic:\n            {\n                pChannelMap[3] = MA_CHANNEL_BACK_RIGHT;\n                pChannelMap[2] = MA_CHANNEL_BACK_LEFT;\n                pChannelMap[1] = MA_CHANNEL_RIGHT;\n                pChannelMap[0] = MA_CHANNEL_LEFT;\n            } break;\n\n            /* TODO: Add support for more tags here. */\n\n            default:\n            {\n                ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, channelCount);\n            } break;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n#if (defined(MAC_OS_VERSION_12_0) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_VERSION_12_0) || \\\n    (defined(__IPHONE_15_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_15_0)\n#define AUDIO_OBJECT_PROPERTY_ELEMENT kAudioObjectPropertyElementMain\n#else\n/* kAudioObjectPropertyElementMaster is deprecated. */\n#define AUDIO_OBJECT_PROPERTY_ELEMENT kAudioObjectPropertyElementMaster\n#endif\n\nstatic ma_result ma_get_device_object_ids__coreaudio(ma_context* pContext, UInt32* pDeviceCount, AudioObjectID** ppDeviceObjectIDs) /* NOTE: Free the returned buffer with ma_free(). */\n{\n    AudioObjectPropertyAddress propAddressDevices;\n    UInt32 deviceObjectsDataSize;\n    OSStatus status;\n    AudioObjectID* pDeviceObjectIDs;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pDeviceCount != NULL);\n    MA_ASSERT(ppDeviceObjectIDs != NULL);\n\n    /* Safety. */\n    *pDeviceCount = 0;\n    *ppDeviceObjectIDs = NULL;\n\n    propAddressDevices.mSelector = kAudioHardwarePropertyDevices;\n    propAddressDevices.mScope    = kAudioObjectPropertyScopeGlobal;\n    propAddressDevices.mElement  = AUDIO_OBJECT_PROPERTY_ELEMENT;\n\n    status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(kAudioObjectSystemObject, &propAddressDevices, 0, NULL, &deviceObjectsDataSize);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n\n    pDeviceObjectIDs = (AudioObjectID*)ma_malloc(deviceObjectsDataSize, &pContext->allocationCallbacks);\n    if (pDeviceObjectIDs == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(kAudioObjectSystemObject, &propAddressDevices, 0, NULL, &deviceObjectsDataSize, pDeviceObjectIDs);\n    if (status != noErr) {\n        ma_free(pDeviceObjectIDs, &pContext->allocationCallbacks);\n        return ma_result_from_OSStatus(status);\n    }\n\n    *pDeviceCount = deviceObjectsDataSize / sizeof(AudioObjectID);\n    *ppDeviceObjectIDs = pDeviceObjectIDs;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_get_AudioObject_uid_as_CFStringRef(ma_context* pContext, AudioObjectID objectID, CFStringRef* pUID)\n{\n    AudioObjectPropertyAddress propAddress;\n    UInt32 dataSize;\n    OSStatus status;\n\n    MA_ASSERT(pContext != NULL);\n\n    propAddress.mSelector = kAudioDevicePropertyDeviceUID;\n    propAddress.mScope    = kAudioObjectPropertyScopeGlobal;\n    propAddress.mElement  = AUDIO_OBJECT_PROPERTY_ELEMENT;\n\n    dataSize = sizeof(*pUID);\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(objectID, &propAddress, 0, NULL, &dataSize, pUID);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_get_AudioObject_uid(ma_context* pContext, AudioObjectID objectID, size_t bufferSize, char* bufferOut)\n{\n    CFStringRef uid;\n    ma_result result;\n\n    MA_ASSERT(pContext != NULL);\n\n    result = ma_get_AudioObject_uid_as_CFStringRef(pContext, objectID, &uid);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (!((ma_CFStringGetCString_proc)pContext->coreaudio.CFStringGetCString)(uid, bufferOut, bufferSize, kCFStringEncodingUTF8)) {\n        return MA_ERROR;\n    }\n\n    ((ma_CFRelease_proc)pContext->coreaudio.CFRelease)(uid);\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_get_AudioObject_name(ma_context* pContext, AudioObjectID objectID, size_t bufferSize, char* bufferOut)\n{\n    AudioObjectPropertyAddress propAddress;\n    CFStringRef deviceName = NULL;\n    UInt32 dataSize;\n    OSStatus status;\n\n    MA_ASSERT(pContext != NULL);\n\n    propAddress.mSelector = kAudioDevicePropertyDeviceNameCFString;\n    propAddress.mScope    = kAudioObjectPropertyScopeGlobal;\n    propAddress.mElement  = AUDIO_OBJECT_PROPERTY_ELEMENT;\n\n    dataSize = sizeof(deviceName);\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(objectID, &propAddress, 0, NULL, &dataSize, &deviceName);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n\n    if (!((ma_CFStringGetCString_proc)pContext->coreaudio.CFStringGetCString)(deviceName, bufferOut, bufferSize, kCFStringEncodingUTF8)) {\n        return MA_ERROR;\n    }\n\n    ((ma_CFRelease_proc)pContext->coreaudio.CFRelease)(deviceName);\n    return MA_SUCCESS;\n}\n\nstatic ma_bool32 ma_does_AudioObject_support_scope(ma_context* pContext, AudioObjectID deviceObjectID, AudioObjectPropertyScope scope)\n{\n    AudioObjectPropertyAddress propAddress;\n    UInt32 dataSize;\n    OSStatus status;\n    AudioBufferList* pBufferList;\n    ma_bool32 isSupported;\n\n    MA_ASSERT(pContext != NULL);\n\n    /* To know whether or not a device is an input device we need ot look at the stream configuration. If it has an output channel it's a playback device. */\n    propAddress.mSelector = kAudioDevicePropertyStreamConfiguration;\n    propAddress.mScope    = scope;\n    propAddress.mElement  = AUDIO_OBJECT_PROPERTY_ELEMENT;\n\n    status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(deviceObjectID, &propAddress, 0, NULL, &dataSize);\n    if (status != noErr) {\n        return MA_FALSE;\n    }\n\n    pBufferList = (AudioBufferList*)ma_malloc(dataSize, &pContext->allocationCallbacks);\n    if (pBufferList == NULL) {\n        return MA_FALSE;   /* Out of memory. */\n    }\n\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, pBufferList);\n    if (status != noErr) {\n        ma_free(pBufferList, &pContext->allocationCallbacks);\n        return MA_FALSE;\n    }\n\n    isSupported = MA_FALSE;\n    if (pBufferList->mNumberBuffers > 0) {\n        isSupported = MA_TRUE;\n    }\n\n    ma_free(pBufferList, &pContext->allocationCallbacks);\n    return isSupported;\n}\n\nstatic ma_bool32 ma_does_AudioObject_support_playback(ma_context* pContext, AudioObjectID deviceObjectID)\n{\n    return ma_does_AudioObject_support_scope(pContext, deviceObjectID, kAudioObjectPropertyScopeOutput);\n}\n\nstatic ma_bool32 ma_does_AudioObject_support_capture(ma_context* pContext, AudioObjectID deviceObjectID)\n{\n    return ma_does_AudioObject_support_scope(pContext, deviceObjectID, kAudioObjectPropertyScopeInput);\n}\n\n\nstatic ma_result ma_get_AudioObject_stream_descriptions(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, UInt32* pDescriptionCount, AudioStreamRangedDescription** ppDescriptions) /* NOTE: Free the returned pointer with ma_free(). */\n{\n    AudioObjectPropertyAddress propAddress;\n    UInt32 dataSize;\n    OSStatus status;\n    AudioStreamRangedDescription* pDescriptions;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pDescriptionCount != NULL);\n    MA_ASSERT(ppDescriptions != NULL);\n\n    /*\n    TODO: Experiment with kAudioStreamPropertyAvailablePhysicalFormats instead of (or in addition to) kAudioStreamPropertyAvailableVirtualFormats. My\n          MacBook Pro uses s24/32 format, however, which miniaudio does not currently support.\n    */\n    propAddress.mSelector = kAudioStreamPropertyAvailableVirtualFormats; /*kAudioStreamPropertyAvailablePhysicalFormats;*/\n    propAddress.mScope    = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput;\n    propAddress.mElement  = AUDIO_OBJECT_PROPERTY_ELEMENT;\n\n    status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(deviceObjectID, &propAddress, 0, NULL, &dataSize);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n\n    pDescriptions = (AudioStreamRangedDescription*)ma_malloc(dataSize, &pContext->allocationCallbacks);\n    if (pDescriptions == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, pDescriptions);\n    if (status != noErr) {\n        ma_free(pDescriptions, &pContext->allocationCallbacks);\n        return ma_result_from_OSStatus(status);\n    }\n\n    *pDescriptionCount = dataSize / sizeof(*pDescriptions);\n    *ppDescriptions = pDescriptions;\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_get_AudioObject_channel_layout(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, AudioChannelLayout** ppChannelLayout)   /* NOTE: Free the returned pointer with ma_free(). */\n{\n    AudioObjectPropertyAddress propAddress;\n    UInt32 dataSize;\n    OSStatus status;\n    AudioChannelLayout* pChannelLayout;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(ppChannelLayout != NULL);\n\n    *ppChannelLayout = NULL;    /* Safety. */\n\n    propAddress.mSelector = kAudioDevicePropertyPreferredChannelLayout;\n    propAddress.mScope    = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput;\n    propAddress.mElement  = AUDIO_OBJECT_PROPERTY_ELEMENT;\n\n    status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(deviceObjectID, &propAddress, 0, NULL, &dataSize);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n\n    pChannelLayout = (AudioChannelLayout*)ma_malloc(dataSize, &pContext->allocationCallbacks);\n    if (pChannelLayout == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, pChannelLayout);\n    if (status != noErr) {\n        ma_free(pChannelLayout, &pContext->allocationCallbacks);\n        return ma_result_from_OSStatus(status);\n    }\n\n    *ppChannelLayout = pChannelLayout;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_get_AudioObject_channel_count(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_uint32* pChannelCount)\n{\n    AudioChannelLayout* pChannelLayout;\n    ma_result result;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pChannelCount != NULL);\n\n    *pChannelCount = 0; /* Safety. */\n\n    result = ma_get_AudioObject_channel_layout(pContext, deviceObjectID, deviceType, &pChannelLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pChannelLayout->mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelDescriptions) {\n        *pChannelCount = pChannelLayout->mNumberChannelDescriptions;\n    } else if (pChannelLayout->mChannelLayoutTag == kAudioChannelLayoutTag_UseChannelBitmap) {\n        *pChannelCount = ma_count_set_bits(pChannelLayout->mChannelBitmap);\n    } else {\n        *pChannelCount = AudioChannelLayoutTag_GetNumberOfChannels(pChannelLayout->mChannelLayoutTag);\n    }\n\n    ma_free(pChannelLayout, &pContext->allocationCallbacks);\n    return MA_SUCCESS;\n}\n\n#if 0\nstatic ma_result ma_get_AudioObject_channel_map(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    AudioChannelLayout* pChannelLayout;\n    ma_result result;\n\n    MA_ASSERT(pContext != NULL);\n\n    result = ma_get_AudioObject_channel_layout(pContext, deviceObjectID, deviceType, &pChannelLayout);\n    if (result != MA_SUCCESS) {\n        return result;  /* Rather than always failing here, would it be more robust to simply assume a default? */\n    }\n\n    result = ma_get_channel_map_from_AudioChannelLayout(pChannelLayout, pChannelMap, channelMapCap);\n    if (result != MA_SUCCESS) {\n        ma_free(pChannelLayout, &pContext->allocationCallbacks);\n        return result;\n    }\n\n    ma_free(pChannelLayout, &pContext->allocationCallbacks);\n    return result;\n}\n#endif\n\nstatic ma_result ma_get_AudioObject_sample_rates(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, UInt32* pSampleRateRangesCount, AudioValueRange** ppSampleRateRanges)   /* NOTE: Free the returned pointer with ma_free(). */\n{\n    AudioObjectPropertyAddress propAddress;\n    UInt32 dataSize;\n    OSStatus status;\n    AudioValueRange* pSampleRateRanges;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pSampleRateRangesCount != NULL);\n    MA_ASSERT(ppSampleRateRanges != NULL);\n\n    /* Safety. */\n    *pSampleRateRangesCount = 0;\n    *ppSampleRateRanges = NULL;\n\n    propAddress.mSelector = kAudioDevicePropertyAvailableNominalSampleRates;\n    propAddress.mScope    = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput;\n    propAddress.mElement  = AUDIO_OBJECT_PROPERTY_ELEMENT;\n\n    status = ((ma_AudioObjectGetPropertyDataSize_proc)pContext->coreaudio.AudioObjectGetPropertyDataSize)(deviceObjectID, &propAddress, 0, NULL, &dataSize);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n\n    pSampleRateRanges = (AudioValueRange*)ma_malloc(dataSize, &pContext->allocationCallbacks);\n    if (pSampleRateRanges == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, pSampleRateRanges);\n    if (status != noErr) {\n        ma_free(pSampleRateRanges, &pContext->allocationCallbacks);\n        return ma_result_from_OSStatus(status);\n    }\n\n    *pSampleRateRangesCount = dataSize / sizeof(*pSampleRateRanges);\n    *ppSampleRateRanges = pSampleRateRanges;\n    return MA_SUCCESS;\n}\n\n#if 0\nstatic ma_result ma_get_AudioObject_get_closest_sample_rate(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_uint32 sampleRateIn, ma_uint32* pSampleRateOut)\n{\n    UInt32 sampleRateRangeCount;\n    AudioValueRange* pSampleRateRanges;\n    ma_result result;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pSampleRateOut != NULL);\n\n    *pSampleRateOut = 0;    /* Safety. */\n\n    result = ma_get_AudioObject_sample_rates(pContext, deviceObjectID, deviceType, &sampleRateRangeCount, &pSampleRateRanges);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (sampleRateRangeCount == 0) {\n        ma_free(pSampleRateRanges, &pContext->allocationCallbacks);\n        return MA_ERROR;   /* Should never hit this case should we? */\n    }\n\n    if (sampleRateIn == 0) {\n        /* Search in order of miniaudio's preferred priority. */\n        UInt32 iMALSampleRate;\n        for (iMALSampleRate = 0; iMALSampleRate < ma_countof(g_maStandardSampleRatePriorities); ++iMALSampleRate) {\n            ma_uint32 malSampleRate = g_maStandardSampleRatePriorities[iMALSampleRate];\n            UInt32 iCASampleRate;\n            for (iCASampleRate = 0; iCASampleRate < sampleRateRangeCount; ++iCASampleRate) {\n                AudioValueRange caSampleRate = pSampleRateRanges[iCASampleRate];\n                if (caSampleRate.mMinimum <= malSampleRate && caSampleRate.mMaximum >= malSampleRate) {\n                    *pSampleRateOut = malSampleRate;\n                    ma_free(pSampleRateRanges, &pContext->allocationCallbacks);\n                    return MA_SUCCESS;\n                }\n            }\n        }\n\n        /*\n        If we get here it means none of miniaudio's standard sample rates matched any of the supported sample rates from the device. In this\n        case we just fall back to the first one reported by Core Audio.\n        */\n        MA_ASSERT(sampleRateRangeCount > 0);\n\n        *pSampleRateOut = pSampleRateRanges[0].mMinimum;\n        ma_free(pSampleRateRanges, &pContext->allocationCallbacks);\n        return MA_SUCCESS;\n    } else {\n        /* Find the closest match to this sample rate. */\n        UInt32 currentAbsoluteDifference = INT32_MAX;\n        UInt32 iCurrentClosestRange = (UInt32)-1;\n        UInt32 iRange;\n        for (iRange = 0; iRange < sampleRateRangeCount; ++iRange) {\n            if (pSampleRateRanges[iRange].mMinimum <= sampleRateIn && pSampleRateRanges[iRange].mMaximum >= sampleRateIn) {\n                *pSampleRateOut = sampleRateIn;\n                ma_free(pSampleRateRanges, &pContext->allocationCallbacks);\n                return MA_SUCCESS;\n            } else {\n                UInt32 absoluteDifference;\n                if (pSampleRateRanges[iRange].mMinimum > sampleRateIn) {\n                    absoluteDifference = pSampleRateRanges[iRange].mMinimum - sampleRateIn;\n                } else {\n                    absoluteDifference = sampleRateIn - pSampleRateRanges[iRange].mMaximum;\n                }\n\n                if (currentAbsoluteDifference > absoluteDifference) {\n                    currentAbsoluteDifference = absoluteDifference;\n                    iCurrentClosestRange = iRange;\n                }\n            }\n        }\n\n        MA_ASSERT(iCurrentClosestRange != (UInt32)-1);\n\n        *pSampleRateOut = pSampleRateRanges[iCurrentClosestRange].mMinimum;\n        ma_free(pSampleRateRanges, &pContext->allocationCallbacks);\n        return MA_SUCCESS;\n    }\n\n    /* Should never get here, but it would mean we weren't able to find any suitable sample rates. */\n    /*ma_free(pSampleRateRanges, &pContext->allocationCallbacks);*/\n    /*return MA_ERROR;*/\n}\n#endif\n\nstatic ma_result ma_get_AudioObject_closest_buffer_size_in_frames(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_uint32 bufferSizeInFramesIn, ma_uint32* pBufferSizeInFramesOut)\n{\n    AudioObjectPropertyAddress propAddress;\n    AudioValueRange bufferSizeRange;\n    UInt32 dataSize;\n    OSStatus status;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pBufferSizeInFramesOut != NULL);\n\n    *pBufferSizeInFramesOut = 0;    /* Safety. */\n\n    propAddress.mSelector = kAudioDevicePropertyBufferFrameSizeRange;\n    propAddress.mScope    = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput;\n    propAddress.mElement  = AUDIO_OBJECT_PROPERTY_ELEMENT;\n\n    dataSize = sizeof(bufferSizeRange);\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, &bufferSizeRange);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n\n    /* This is just a clamp. */\n    if (bufferSizeInFramesIn < bufferSizeRange.mMinimum) {\n        *pBufferSizeInFramesOut = (ma_uint32)bufferSizeRange.mMinimum;\n    } else if (bufferSizeInFramesIn > bufferSizeRange.mMaximum) {\n        *pBufferSizeInFramesOut = (ma_uint32)bufferSizeRange.mMaximum;\n    } else {\n        *pBufferSizeInFramesOut = bufferSizeInFramesIn;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_set_AudioObject_buffer_size_in_frames(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_uint32* pPeriodSizeInOut)\n{\n    ma_result result;\n    ma_uint32 chosenBufferSizeInFrames;\n    AudioObjectPropertyAddress propAddress;\n    UInt32 dataSize;\n    OSStatus status;\n\n    MA_ASSERT(pContext != NULL);\n\n    result = ma_get_AudioObject_closest_buffer_size_in_frames(pContext, deviceObjectID, deviceType, *pPeriodSizeInOut, &chosenBufferSizeInFrames);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* Try setting the size of the buffer... If this fails we just use whatever is currently set. */\n    propAddress.mSelector = kAudioDevicePropertyBufferFrameSize;\n    propAddress.mScope    = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput;\n    propAddress.mElement  = AUDIO_OBJECT_PROPERTY_ELEMENT;\n\n    ((ma_AudioObjectSetPropertyData_proc)pContext->coreaudio.AudioObjectSetPropertyData)(deviceObjectID, &propAddress, 0, NULL, sizeof(chosenBufferSizeInFrames), &chosenBufferSizeInFrames);\n\n    /* Get the actual size of the buffer. */\n    dataSize = sizeof(*pPeriodSizeInOut);\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(deviceObjectID, &propAddress, 0, NULL, &dataSize, &chosenBufferSizeInFrames);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n\n    *pPeriodSizeInOut = chosenBufferSizeInFrames;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_find_default_AudioObjectID(ma_context* pContext, ma_device_type deviceType, AudioObjectID* pDeviceObjectID)\n{\n    AudioObjectPropertyAddress propAddressDefaultDevice;\n    UInt32 defaultDeviceObjectIDSize = sizeof(AudioObjectID);\n    AudioObjectID defaultDeviceObjectID;\n    OSStatus status;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pDeviceObjectID != NULL);\n\n    /* Safety. */\n    *pDeviceObjectID = 0;\n\n    propAddressDefaultDevice.mScope = kAudioObjectPropertyScopeGlobal;\n    propAddressDefaultDevice.mElement = AUDIO_OBJECT_PROPERTY_ELEMENT;\n    if (deviceType == ma_device_type_playback) {\n        propAddressDefaultDevice.mSelector = kAudioHardwarePropertyDefaultOutputDevice;\n    } else {\n        propAddressDefaultDevice.mSelector = kAudioHardwarePropertyDefaultInputDevice;\n    }\n\n    defaultDeviceObjectIDSize = sizeof(AudioObjectID);\n    status = ((ma_AudioObjectGetPropertyData_proc)pContext->coreaudio.AudioObjectGetPropertyData)(kAudioObjectSystemObject, &propAddressDefaultDevice, 0, NULL, &defaultDeviceObjectIDSize, &defaultDeviceObjectID);\n    if (status == noErr) {\n        *pDeviceObjectID = defaultDeviceObjectID;\n        return MA_SUCCESS;\n    }\n\n    /* If we get here it means we couldn't find the device. */\n    return MA_NO_DEVICE;\n}\n\nstatic ma_result ma_find_AudioObjectID(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, AudioObjectID* pDeviceObjectID)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pDeviceObjectID != NULL);\n\n    /* Safety. */\n    *pDeviceObjectID = 0;\n\n    if (pDeviceID == NULL) {\n        /* Default device. */\n        return ma_find_default_AudioObjectID(pContext, deviceType, pDeviceObjectID);\n    } else {\n        /* Explicit device. */\n        UInt32 deviceCount;\n        AudioObjectID* pDeviceObjectIDs;\n        ma_result result;\n        UInt32 iDevice;\n\n        result = ma_get_device_object_ids__coreaudio(pContext, &deviceCount, &pDeviceObjectIDs);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        for (iDevice = 0; iDevice < deviceCount; ++iDevice) {\n            AudioObjectID deviceObjectID = pDeviceObjectIDs[iDevice];\n\n            char uid[256];\n            if (ma_get_AudioObject_uid(pContext, deviceObjectID, sizeof(uid), uid) != MA_SUCCESS) {\n                continue;\n            }\n\n            if (deviceType == ma_device_type_playback) {\n                if (ma_does_AudioObject_support_playback(pContext, deviceObjectID)) {\n                    if (strcmp(uid, pDeviceID->coreaudio) == 0) {\n                        *pDeviceObjectID = deviceObjectID;\n                        ma_free(pDeviceObjectIDs, &pContext->allocationCallbacks);\n                        return MA_SUCCESS;\n                    }\n                }\n            } else {\n                if (ma_does_AudioObject_support_capture(pContext, deviceObjectID)) {\n                    if (strcmp(uid, pDeviceID->coreaudio) == 0) {\n                        *pDeviceObjectID = deviceObjectID;\n                        ma_free(pDeviceObjectIDs, &pContext->allocationCallbacks);\n                        return MA_SUCCESS;\n                    }\n                }\n            }\n        }\n\n        ma_free(pDeviceObjectIDs, &pContext->allocationCallbacks);\n    }\n\n    /* If we get here it means we couldn't find the device. */\n    return MA_NO_DEVICE;\n}\n\n\nstatic ma_result ma_find_best_format__coreaudio(ma_context* pContext, AudioObjectID deviceObjectID, ma_device_type deviceType, ma_format format, ma_uint32 channels, ma_uint32 sampleRate, const AudioStreamBasicDescription* pOrigFormat, AudioStreamBasicDescription* pFormat)\n{\n    UInt32 deviceFormatDescriptionCount;\n    AudioStreamRangedDescription* pDeviceFormatDescriptions;\n    ma_result result;\n    ma_uint32 desiredSampleRate;\n    ma_uint32 desiredChannelCount;\n    ma_format desiredFormat;\n    AudioStreamBasicDescription bestDeviceFormatSoFar;\n    ma_bool32 hasSupportedFormat;\n    UInt32 iFormat;\n\n    result = ma_get_AudioObject_stream_descriptions(pContext, deviceObjectID, deviceType, &deviceFormatDescriptionCount, &pDeviceFormatDescriptions);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    desiredSampleRate = sampleRate;\n    if (desiredSampleRate == 0) {\n        desiredSampleRate = pOrigFormat->mSampleRate;\n    }\n\n    desiredChannelCount = channels;\n    if (desiredChannelCount == 0) {\n        desiredChannelCount = pOrigFormat->mChannelsPerFrame;\n    }\n\n    desiredFormat = format;\n    if (desiredFormat == ma_format_unknown) {\n        result = ma_format_from_AudioStreamBasicDescription(pOrigFormat, &desiredFormat);\n        if (result != MA_SUCCESS || desiredFormat == ma_format_unknown) {\n            desiredFormat = g_maFormatPriorities[0];\n        }\n    }\n\n    /*\n    If we get here it means we don't have an exact match to what the client is asking for. We'll need to find the closest one. The next\n    loop will check for formats that have the same sample rate to what we're asking for. If there is, we prefer that one in all cases.\n    */\n    MA_ZERO_OBJECT(&bestDeviceFormatSoFar);\n\n    hasSupportedFormat = MA_FALSE;\n    for (iFormat = 0; iFormat < deviceFormatDescriptionCount; ++iFormat) {\n        ma_format formatFromDescription;\n        ma_result formatResult = ma_format_from_AudioStreamBasicDescription(&pDeviceFormatDescriptions[iFormat].mFormat, &formatFromDescription);\n        if (formatResult == MA_SUCCESS && formatFromDescription != ma_format_unknown) {\n            hasSupportedFormat = MA_TRUE;\n            bestDeviceFormatSoFar = pDeviceFormatDescriptions[iFormat].mFormat;\n            break;\n        }\n    }\n\n    if (!hasSupportedFormat) {\n        ma_free(pDeviceFormatDescriptions, &pContext->allocationCallbacks);\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n\n\n    for (iFormat = 0; iFormat < deviceFormatDescriptionCount; ++iFormat) {\n        AudioStreamBasicDescription thisDeviceFormat = pDeviceFormatDescriptions[iFormat].mFormat;\n        ma_format thisSampleFormat;\n        ma_result formatResult;\n        ma_format bestSampleFormatSoFar;\n\n        /* If the format is not supported by miniaudio we need to skip this one entirely. */\n        formatResult = ma_format_from_AudioStreamBasicDescription(&pDeviceFormatDescriptions[iFormat].mFormat, &thisSampleFormat);\n        if (formatResult != MA_SUCCESS || thisSampleFormat == ma_format_unknown) {\n            continue;   /* The format is not supported by miniaudio. Skip. */\n        }\n\n        ma_format_from_AudioStreamBasicDescription(&bestDeviceFormatSoFar, &bestSampleFormatSoFar);\n\n        /* Getting here means the format is supported by miniaudio which makes this format a candidate. */\n        if (thisDeviceFormat.mSampleRate != desiredSampleRate) {\n            /*\n            The sample rate does not match, but this format could still be usable, although it's a very low priority. If the best format\n            so far has an equal sample rate we can just ignore this one.\n            */\n            if (bestDeviceFormatSoFar.mSampleRate == desiredSampleRate) {\n                continue;   /* The best sample rate so far has the same sample rate as what we requested which means it's still the best so far. Skip this format. */\n            } else {\n                /* In this case, neither the best format so far nor this one have the same sample rate. Check the channel count next. */\n                if (thisDeviceFormat.mChannelsPerFrame != desiredChannelCount) {\n                    /* This format has a different sample rate _and_ a different channel count. */\n                    if (bestDeviceFormatSoFar.mChannelsPerFrame == desiredChannelCount) {\n                        continue;   /* No change to the best format. */\n                    } else {\n                        /*\n                        Both this format and the best so far have different sample rates and different channel counts. Whichever has the\n                        best format is the new best.\n                        */\n                        if (ma_get_format_priority_index(thisSampleFormat) < ma_get_format_priority_index(bestSampleFormatSoFar)) {\n                            bestDeviceFormatSoFar = thisDeviceFormat;\n                            continue;\n                        } else {\n                            continue;   /* No change to the best format. */\n                        }\n                    }\n                } else {\n                    /* This format has a different sample rate but the desired channel count. */\n                    if (bestDeviceFormatSoFar.mChannelsPerFrame == desiredChannelCount) {\n                        /* Both this format and the best so far have the desired channel count. Whichever has the best format is the new best. */\n                        if (ma_get_format_priority_index(thisSampleFormat) < ma_get_format_priority_index(bestSampleFormatSoFar)) {\n                            bestDeviceFormatSoFar = thisDeviceFormat;\n                            continue;\n                        } else {\n                            continue;   /* No change to the best format for now. */\n                        }\n                    } else {\n                        /* This format has the desired channel count, but the best so far does not. We have a new best. */\n                        bestDeviceFormatSoFar = thisDeviceFormat;\n                        continue;\n                    }\n                }\n            }\n        } else {\n            /*\n            The sample rates match which makes this format a very high priority contender. If the best format so far has a different\n            sample rate it needs to be replaced with this one.\n            */\n            if (bestDeviceFormatSoFar.mSampleRate != desiredSampleRate) {\n                bestDeviceFormatSoFar = thisDeviceFormat;\n                continue;\n            } else {\n                /* In this case both this format and the best format so far have the same sample rate. Check the channel count next. */\n                if (thisDeviceFormat.mChannelsPerFrame == desiredChannelCount) {\n                    /*\n                    In this case this format has the same channel count as what the client is requesting. If the best format so far has\n                    a different count, this one becomes the new best.\n                    */\n                    if (bestDeviceFormatSoFar.mChannelsPerFrame != desiredChannelCount) {\n                        bestDeviceFormatSoFar = thisDeviceFormat;\n                        continue;\n                    } else {\n                        /* In this case both this format and the best so far have the ideal sample rate and channel count. Check the format. */\n                        if (thisSampleFormat == desiredFormat) {\n                            bestDeviceFormatSoFar = thisDeviceFormat;\n                            break;  /* Found the exact match. */\n                        } else {\n                            /* The formats are different. The new best format is the one with the highest priority format according to miniaudio. */\n                            if (ma_get_format_priority_index(thisSampleFormat) < ma_get_format_priority_index(bestSampleFormatSoFar)) {\n                                bestDeviceFormatSoFar = thisDeviceFormat;\n                                continue;\n                            } else {\n                                continue;   /* No change to the best format for now. */\n                            }\n                        }\n                    }\n                } else {\n                    /*\n                    In this case the channel count is different to what the client has requested. If the best so far has the same channel\n                    count as the requested count then it remains the best.\n                    */\n                    if (bestDeviceFormatSoFar.mChannelsPerFrame == desiredChannelCount) {\n                        continue;\n                    } else {\n                        /*\n                        This is the case where both have the same sample rate (good) but different channel counts. Right now both have about\n                        the same priority, but we need to compare the format now.\n                        */\n                        if (thisSampleFormat == bestSampleFormatSoFar) {\n                            if (ma_get_format_priority_index(thisSampleFormat) < ma_get_format_priority_index(bestSampleFormatSoFar)) {\n                                bestDeviceFormatSoFar = thisDeviceFormat;\n                                continue;\n                            } else {\n                                continue;   /* No change to the best format for now. */\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    *pFormat = bestDeviceFormatSoFar;\n\n    ma_free(pDeviceFormatDescriptions, &pContext->allocationCallbacks);\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_get_AudioUnit_channel_map(ma_context* pContext, AudioUnit audioUnit, ma_device_type deviceType, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    AudioUnitScope deviceScope;\n    AudioUnitElement deviceBus;\n    UInt32 channelLayoutSize;\n    OSStatus status;\n    AudioChannelLayout* pChannelLayout;\n    ma_result result;\n\n    MA_ASSERT(pContext != NULL);\n\n    if (deviceType == ma_device_type_playback) {\n        deviceScope = kAudioUnitScope_Input;\n        deviceBus = MA_COREAUDIO_OUTPUT_BUS;\n    } else {\n        deviceScope = kAudioUnitScope_Output;\n        deviceBus = MA_COREAUDIO_INPUT_BUS;\n    }\n\n    status = ((ma_AudioUnitGetPropertyInfo_proc)pContext->coreaudio.AudioUnitGetPropertyInfo)(audioUnit, kAudioUnitProperty_AudioChannelLayout, deviceScope, deviceBus, &channelLayoutSize, NULL);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n\n    pChannelLayout = (AudioChannelLayout*)ma_malloc(channelLayoutSize, &pContext->allocationCallbacks);\n    if (pChannelLayout == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    status = ((ma_AudioUnitGetProperty_proc)pContext->coreaudio.AudioUnitGetProperty)(audioUnit, kAudioUnitProperty_AudioChannelLayout, deviceScope, deviceBus, pChannelLayout, &channelLayoutSize);\n    if (status != noErr) {\n        ma_free(pChannelLayout, &pContext->allocationCallbacks);\n        return ma_result_from_OSStatus(status);\n    }\n\n    result = ma_get_channel_map_from_AudioChannelLayout(pChannelLayout, pChannelMap, channelMapCap);\n    if (result != MA_SUCCESS) {\n        ma_free(pChannelLayout, &pContext->allocationCallbacks);\n        return result;\n    }\n\n    ma_free(pChannelLayout, &pContext->allocationCallbacks);\n    return MA_SUCCESS;\n}\n#endif /* MA_APPLE_DESKTOP */\n\n\n#if !defined(MA_APPLE_DESKTOP)\nstatic void ma_AVAudioSessionPortDescription_to_device_info(AVAudioSessionPortDescription* pPortDesc, ma_device_info* pInfo)\n{\n    MA_ZERO_OBJECT(pInfo);\n    ma_strncpy_s(pInfo->name,         sizeof(pInfo->name),         [pPortDesc.portName UTF8String], (size_t)-1);\n    ma_strncpy_s(pInfo->id.coreaudio, sizeof(pInfo->id.coreaudio), [pPortDesc.UID      UTF8String], (size_t)-1);\n}\n#endif\n\nstatic ma_result ma_context_enumerate_devices__coreaudio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n#if defined(MA_APPLE_DESKTOP)\n    UInt32 deviceCount;\n    AudioObjectID* pDeviceObjectIDs;\n    AudioObjectID defaultDeviceObjectIDPlayback;\n    AudioObjectID defaultDeviceObjectIDCapture;\n    ma_result result;\n    UInt32 iDevice;\n\n    ma_find_default_AudioObjectID(pContext, ma_device_type_playback, &defaultDeviceObjectIDPlayback);   /* OK if this fails. */\n    ma_find_default_AudioObjectID(pContext, ma_device_type_capture,  &defaultDeviceObjectIDCapture);    /* OK if this fails. */\n\n    result = ma_get_device_object_ids__coreaudio(pContext, &deviceCount, &pDeviceObjectIDs);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    for (iDevice = 0; iDevice < deviceCount; ++iDevice) {\n        AudioObjectID deviceObjectID = pDeviceObjectIDs[iDevice];\n        ma_device_info info;\n\n        MA_ZERO_OBJECT(&info);\n        if (ma_get_AudioObject_uid(pContext, deviceObjectID, sizeof(info.id.coreaudio), info.id.coreaudio) != MA_SUCCESS) {\n            continue;\n        }\n        if (ma_get_AudioObject_name(pContext, deviceObjectID, sizeof(info.name), info.name) != MA_SUCCESS) {\n            continue;\n        }\n\n        if (ma_does_AudioObject_support_playback(pContext, deviceObjectID)) {\n            if (deviceObjectID == defaultDeviceObjectIDPlayback) {\n                info.isDefault = MA_TRUE;\n            }\n\n            if (!callback(pContext, ma_device_type_playback, &info, pUserData)) {\n                break;\n            }\n        }\n        if (ma_does_AudioObject_support_capture(pContext, deviceObjectID)) {\n            if (deviceObjectID == defaultDeviceObjectIDCapture) {\n                info.isDefault = MA_TRUE;\n            }\n\n            if (!callback(pContext, ma_device_type_capture, &info, pUserData)) {\n                break;\n            }\n        }\n    }\n\n    ma_free(pDeviceObjectIDs, &pContext->allocationCallbacks);\n#else\n    ma_device_info info;\n    NSArray *pInputs  = [[[AVAudioSession sharedInstance] currentRoute] inputs];\n    NSArray *pOutputs = [[[AVAudioSession sharedInstance] currentRoute] outputs];\n\n    for (AVAudioSessionPortDescription* pPortDesc in pOutputs) {\n        ma_AVAudioSessionPortDescription_to_device_info(pPortDesc, &info);\n        if (!callback(pContext, ma_device_type_playback, &info, pUserData)) {\n            return MA_SUCCESS;\n        }\n    }\n\n    for (AVAudioSessionPortDescription* pPortDesc in pInputs) {\n        ma_AVAudioSessionPortDescription_to_device_info(pPortDesc, &info);\n        if (!callback(pContext, ma_device_type_capture, &info, pUserData)) {\n            return MA_SUCCESS;\n        }\n    }\n#endif\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_get_device_info__coreaudio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    ma_result result;\n\n    MA_ASSERT(pContext != NULL);\n\n#if defined(MA_APPLE_DESKTOP)\n    /* Desktop */\n    {\n        AudioObjectID deviceObjectID;\n        AudioObjectID defaultDeviceObjectID;\n        UInt32 streamDescriptionCount;\n        AudioStreamRangedDescription* pStreamDescriptions;\n        UInt32 iStreamDescription;\n        UInt32 sampleRateRangeCount;\n        AudioValueRange* pSampleRateRanges;\n\n        ma_find_default_AudioObjectID(pContext, deviceType, &defaultDeviceObjectID);     /* OK if this fails. */\n\n        result = ma_find_AudioObjectID(pContext, deviceType, pDeviceID, &deviceObjectID);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        result = ma_get_AudioObject_uid(pContext, deviceObjectID, sizeof(pDeviceInfo->id.coreaudio), pDeviceInfo->id.coreaudio);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        result = ma_get_AudioObject_name(pContext, deviceObjectID, sizeof(pDeviceInfo->name), pDeviceInfo->name);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        if (deviceObjectID == defaultDeviceObjectID) {\n            pDeviceInfo->isDefault = MA_TRUE;\n        }\n\n        /*\n        There could be a large number of permutations here. Fortunately there is only a single channel count\n        being reported which reduces this quite a bit. For sample rates we're only reporting those that are\n        one of miniaudio's recognized \"standard\" rates. If there are still more formats than can fit into\n        our fixed sized array we'll just need to truncate them. This is unlikely and will probably only happen\n        if some driver performs software data conversion and therefore reports every possible format and\n        sample rate.\n        */\n        pDeviceInfo->nativeDataFormatCount = 0;\n\n        /* Formats. */\n        {\n            ma_format uniqueFormats[ma_format_count];\n            ma_uint32 uniqueFormatCount = 0;\n            ma_uint32 channels;\n\n            /* Channels. */\n            result = ma_get_AudioObject_channel_count(pContext, deviceObjectID, deviceType, &channels);\n            if (result != MA_SUCCESS) {\n                return result;\n            }\n\n            /* Formats. */\n            result = ma_get_AudioObject_stream_descriptions(pContext, deviceObjectID, deviceType, &streamDescriptionCount, &pStreamDescriptions);\n            if (result != MA_SUCCESS) {\n                return result;\n            }\n\n            for (iStreamDescription = 0; iStreamDescription < streamDescriptionCount; ++iStreamDescription) {\n                ma_format format;\n                ma_bool32 hasFormatBeenHandled = MA_FALSE;\n                ma_uint32 iOutputFormat;\n                ma_uint32 iSampleRate;\n\n                result = ma_format_from_AudioStreamBasicDescription(&pStreamDescriptions[iStreamDescription].mFormat, &format);\n                if (result != MA_SUCCESS) {\n                    continue;\n                }\n\n                MA_ASSERT(format != ma_format_unknown);\n\n                /* Make sure the format isn't already in the output list. */\n                for (iOutputFormat = 0; iOutputFormat < uniqueFormatCount; ++iOutputFormat) {\n                    if (uniqueFormats[iOutputFormat] == format) {\n                        hasFormatBeenHandled = MA_TRUE;\n                        break;\n                    }\n                }\n\n                /* If we've already handled this format just skip it. */\n                if (hasFormatBeenHandled) {\n                    continue;\n                }\n\n                uniqueFormats[uniqueFormatCount] = format;\n                uniqueFormatCount += 1;\n\n                /* Sample Rates */\n                result = ma_get_AudioObject_sample_rates(pContext, deviceObjectID, deviceType, &sampleRateRangeCount, &pSampleRateRanges);\n                if (result != MA_SUCCESS) {\n                    return result;\n                }\n\n                /*\n                Annoyingly Core Audio reports a sample rate range. We just get all the standard rates that are\n                between this range.\n                */\n                for (iSampleRate = 0; iSampleRate < sampleRateRangeCount; ++iSampleRate) {\n                    ma_uint32 iStandardSampleRate;\n                    for (iStandardSampleRate = 0; iStandardSampleRate < ma_countof(g_maStandardSampleRatePriorities); iStandardSampleRate += 1) {\n                        ma_uint32 standardSampleRate = g_maStandardSampleRatePriorities[iStandardSampleRate];\n                        if (standardSampleRate >= pSampleRateRanges[iSampleRate].mMinimum && standardSampleRate <= pSampleRateRanges[iSampleRate].mMaximum) {\n                            /* We have a new data format. Add it to the list. */\n                            pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format     = format;\n                            pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels   = channels;\n                            pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = standardSampleRate;\n                            pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags      = 0;\n                            pDeviceInfo->nativeDataFormatCount += 1;\n\n                            if (pDeviceInfo->nativeDataFormatCount >= ma_countof(pDeviceInfo->nativeDataFormats)) {\n                                break;  /* No more room for any more formats. */\n                            }\n                        }\n                    }\n                }\n\n                ma_free(pSampleRateRanges, &pContext->allocationCallbacks);\n\n                if (pDeviceInfo->nativeDataFormatCount >= ma_countof(pDeviceInfo->nativeDataFormats)) {\n                    break;  /* No more room for any more formats. */\n                }\n            }\n\n            ma_free(pStreamDescriptions, &pContext->allocationCallbacks);\n        }\n    }\n#else\n    /* Mobile */\n    {\n        AudioComponentDescription desc;\n        AudioComponent component;\n        AudioUnit audioUnit;\n        OSStatus status;\n        AudioUnitScope formatScope;\n        AudioUnitElement formatElement;\n        AudioStreamBasicDescription bestFormat;\n        UInt32 propSize;\n\n        /* We want to ensure we use a consistent device name to device enumeration. */\n        if (pDeviceID != NULL && pDeviceID->coreaudio[0] != '\\0') {\n            ma_bool32 found = MA_FALSE;\n            if (deviceType == ma_device_type_playback) {\n                NSArray *pOutputs = [[[AVAudioSession sharedInstance] currentRoute] outputs];\n                for (AVAudioSessionPortDescription* pPortDesc in pOutputs) {\n                    if (strcmp(pDeviceID->coreaudio, [pPortDesc.UID UTF8String]) == 0) {\n                        ma_AVAudioSessionPortDescription_to_device_info(pPortDesc, pDeviceInfo);\n                        found = MA_TRUE;\n                        break;\n                    }\n                }\n            } else {\n                NSArray *pInputs = [[[AVAudioSession sharedInstance] currentRoute] inputs];\n                for (AVAudioSessionPortDescription* pPortDesc in pInputs) {\n                    if (strcmp(pDeviceID->coreaudio, [pPortDesc.UID UTF8String]) == 0) {\n                        ma_AVAudioSessionPortDescription_to_device_info(pPortDesc, pDeviceInfo);\n                        found = MA_TRUE;\n                        break;\n                    }\n                }\n            }\n\n            if (!found) {\n                return MA_DOES_NOT_EXIST;\n            }\n        } else {\n            if (deviceType == ma_device_type_playback) {\n                ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n            } else {\n                ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n            }\n        }\n\n\n        /*\n        Retrieving device information is more annoying on mobile than desktop. For simplicity I'm locking this down to whatever format is\n        reported on a temporary I/O unit. The problem, however, is that this doesn't return a value for the sample rate which we need to\n        retrieve from the AVAudioSession shared instance.\n        */\n        desc.componentType = kAudioUnitType_Output;\n        desc.componentSubType = kAudioUnitSubType_RemoteIO;\n        desc.componentManufacturer = kAudioUnitManufacturer_Apple;\n        desc.componentFlags = 0;\n        desc.componentFlagsMask = 0;\n\n        component = ((ma_AudioComponentFindNext_proc)pContext->coreaudio.AudioComponentFindNext)(NULL, &desc);\n        if (component == NULL) {\n            return MA_FAILED_TO_INIT_BACKEND;\n        }\n\n        status = ((ma_AudioComponentInstanceNew_proc)pContext->coreaudio.AudioComponentInstanceNew)(component, &audioUnit);\n        if (status != noErr) {\n            return ma_result_from_OSStatus(status);\n        }\n\n        formatScope   = (deviceType == ma_device_type_playback) ? kAudioUnitScope_Input : kAudioUnitScope_Output;\n        formatElement = (deviceType == ma_device_type_playback) ? MA_COREAUDIO_OUTPUT_BUS : MA_COREAUDIO_INPUT_BUS;\n\n        propSize = sizeof(bestFormat);\n        status = ((ma_AudioUnitGetProperty_proc)pContext->coreaudio.AudioUnitGetProperty)(audioUnit, kAudioUnitProperty_StreamFormat, formatScope, formatElement, &bestFormat, &propSize);\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(audioUnit);\n            return ma_result_from_OSStatus(status);\n        }\n\n        ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(audioUnit);\n        audioUnit = NULL;\n\n        /* Only a single format is being reported for iOS. */\n        pDeviceInfo->nativeDataFormatCount = 1;\n\n        result = ma_format_from_AudioStreamBasicDescription(&bestFormat, &pDeviceInfo->nativeDataFormats[0].format);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pDeviceInfo->nativeDataFormats[0].channels = bestFormat.mChannelsPerFrame;\n\n        /*\n        It looks like Apple are wanting to push the whole AVAudioSession thing. Thus, we need to use that to determine device settings. To do\n        this we just get the shared instance and inspect.\n        */\n        @autoreleasepool {\n            AVAudioSession* pAudioSession = [AVAudioSession sharedInstance];\n            MA_ASSERT(pAudioSession != NULL);\n\n            pDeviceInfo->nativeDataFormats[0].sampleRate = (ma_uint32)pAudioSession.sampleRate;\n        }\n    }\n#endif\n\n    (void)pDeviceInfo; /* Unused. */\n    return MA_SUCCESS;\n}\n\nstatic AudioBufferList* ma_allocate_AudioBufferList__coreaudio(ma_uint32 sizeInFrames, ma_format format, ma_uint32 channels, ma_stream_layout layout, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    AudioBufferList* pBufferList;\n    UInt32 audioBufferSizeInBytes;\n    size_t allocationSize;\n\n    MA_ASSERT(sizeInFrames > 0);\n    MA_ASSERT(format != ma_format_unknown);\n    MA_ASSERT(channels > 0);\n\n    allocationSize = sizeof(AudioBufferList) - sizeof(AudioBuffer);  /* Subtract sizeof(AudioBuffer) because that part is dynamically sized. */\n    if (layout == ma_stream_layout_interleaved) {\n        /* Interleaved case. This is the simple case because we just have one buffer. */\n        allocationSize += sizeof(AudioBuffer) * 1;\n    } else {\n        /* Non-interleaved case. This is the more complex case because there's more than one buffer. */\n        allocationSize += sizeof(AudioBuffer) * channels;\n    }\n\n    allocationSize += sizeInFrames * ma_get_bytes_per_frame(format, channels);\n\n    pBufferList = (AudioBufferList*)ma_malloc(allocationSize, pAllocationCallbacks);\n    if (pBufferList == NULL) {\n        return NULL;\n    }\n\n    audioBufferSizeInBytes = (UInt32)(sizeInFrames * ma_get_bytes_per_sample(format));\n\n    if (layout == ma_stream_layout_interleaved) {\n        pBufferList->mNumberBuffers = 1;\n        pBufferList->mBuffers[0].mNumberChannels = channels;\n        pBufferList->mBuffers[0].mDataByteSize   = audioBufferSizeInBytes * channels;\n        pBufferList->mBuffers[0].mData           = (ma_uint8*)pBufferList + sizeof(AudioBufferList);\n    } else {\n        ma_uint32 iBuffer;\n        pBufferList->mNumberBuffers = channels;\n        for (iBuffer = 0; iBuffer < pBufferList->mNumberBuffers; ++iBuffer) {\n            pBufferList->mBuffers[iBuffer].mNumberChannels = 1;\n            pBufferList->mBuffers[iBuffer].mDataByteSize   = audioBufferSizeInBytes;\n            pBufferList->mBuffers[iBuffer].mData           = (ma_uint8*)pBufferList + ((sizeof(AudioBufferList) - sizeof(AudioBuffer)) + (sizeof(AudioBuffer) * channels)) + (audioBufferSizeInBytes * iBuffer);\n        }\n    }\n\n    return pBufferList;\n}\n\nstatic ma_result ma_device_realloc_AudioBufferList__coreaudio(ma_device* pDevice, ma_uint32 sizeInFrames, ma_format format, ma_uint32 channels, ma_stream_layout layout)\n{\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(format != ma_format_unknown);\n    MA_ASSERT(channels > 0);\n\n    /* Only resize the buffer if necessary. */\n    if (pDevice->coreaudio.audioBufferCapInFrames < sizeInFrames) {\n        AudioBufferList* pNewAudioBufferList;\n\n        pNewAudioBufferList = ma_allocate_AudioBufferList__coreaudio(sizeInFrames, format, channels, layout, &pDevice->pContext->allocationCallbacks);\n        if (pNewAudioBufferList == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n\n        /* At this point we'll have a new AudioBufferList and we can free the old one. */\n        ma_free(pDevice->coreaudio.pAudioBufferList, &pDevice->pContext->allocationCallbacks);\n        pDevice->coreaudio.pAudioBufferList = pNewAudioBufferList;\n        pDevice->coreaudio.audioBufferCapInFrames = sizeInFrames;\n    }\n\n    /* Getting here means the capacity of the audio is fine. */\n    return MA_SUCCESS;\n}\n\n\nstatic OSStatus ma_on_output__coreaudio(void* pUserData, AudioUnitRenderActionFlags* pActionFlags, const AudioTimeStamp* pTimeStamp, UInt32 busNumber, UInt32 frameCount, AudioBufferList* pBufferList)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_stream_layout layout;\n\n    MA_ASSERT(pDevice != NULL);\n\n    /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"INFO: Output Callback: busNumber=%d, frameCount=%d, mNumberBuffers=%d\\n\", (int)busNumber, (int)frameCount, (int)pBufferList->mNumberBuffers);*/\n\n    /* We need to check whether or not we are outputting interleaved or non-interleaved samples. The way we do this is slightly different for each type. */\n    layout = ma_stream_layout_interleaved;\n    if (pBufferList->mBuffers[0].mNumberChannels != pDevice->playback.internalChannels) {\n        layout = ma_stream_layout_deinterleaved;\n    }\n\n    if (layout == ma_stream_layout_interleaved) {\n        /* For now we can assume everything is interleaved. */\n        UInt32 iBuffer;\n        for (iBuffer = 0; iBuffer < pBufferList->mNumberBuffers; ++iBuffer) {\n            if (pBufferList->mBuffers[iBuffer].mNumberChannels == pDevice->playback.internalChannels) {\n                ma_uint32 frameCountForThisBuffer = pBufferList->mBuffers[iBuffer].mDataByteSize / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n                if (frameCountForThisBuffer > 0) {\n                    ma_device_handle_backend_data_callback(pDevice, pBufferList->mBuffers[iBuffer].mData, NULL, frameCountForThisBuffer);\n                }\n\n                /*a_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"  frameCount=%d, mNumberChannels=%d, mDataByteSize=%d\\n\", (int)frameCount, (int)pBufferList->mBuffers[iBuffer].mNumberChannels, (int)pBufferList->mBuffers[iBuffer].mDataByteSize);*/\n            } else {\n                /*\n                This case is where the number of channels in the output buffer do not match our internal channels. It could mean that it's\n                not interleaved, in which case we can't handle right now since miniaudio does not yet support non-interleaved streams. We just\n                output silence here.\n                */\n                MA_ZERO_MEMORY(pBufferList->mBuffers[iBuffer].mData, pBufferList->mBuffers[iBuffer].mDataByteSize);\n                /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"  WARNING: Outputting silence. frameCount=%d, mNumberChannels=%d, mDataByteSize=%d\\n\", (int)frameCount, (int)pBufferList->mBuffers[iBuffer].mNumberChannels, (int)pBufferList->mBuffers[iBuffer].mDataByteSize);*/\n            }\n        }\n    } else {\n        /* This is the deinterleaved case. We need to update each buffer in groups of internalChannels. This assumes each buffer is the same size. */\n        MA_ASSERT(pDevice->playback.internalChannels <= MA_MAX_CHANNELS);   /* This should heve been validated at initialization time. */\n\n        /*\n        For safety we'll check that the internal channels is a multiple of the buffer count. If it's not it means something\n        very strange has happened and we're not going to support it.\n        */\n        if ((pBufferList->mNumberBuffers % pDevice->playback.internalChannels) == 0) {\n            ma_uint8 tempBuffer[4096];\n            UInt32 iBuffer;\n\n            for (iBuffer = 0; iBuffer < pBufferList->mNumberBuffers; iBuffer += pDevice->playback.internalChannels) {\n                ma_uint32 frameCountPerBuffer = pBufferList->mBuffers[iBuffer].mDataByteSize / ma_get_bytes_per_sample(pDevice->playback.internalFormat);\n                ma_uint32 framesRemaining = frameCountPerBuffer;\n\n                while (framesRemaining > 0) {\n                    void* ppDeinterleavedBuffers[MA_MAX_CHANNELS];\n                    ma_uint32 iChannel;\n                    ma_uint32 framesToRead = sizeof(tempBuffer) / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n                    if (framesToRead > framesRemaining) {\n                        framesToRead = framesRemaining;\n                    }\n\n                    ma_device_handle_backend_data_callback(pDevice, tempBuffer, NULL, framesToRead);\n\n                    for (iChannel = 0; iChannel < pDevice->playback.internalChannels; ++iChannel) {\n                        ppDeinterleavedBuffers[iChannel] = (void*)ma_offset_ptr(pBufferList->mBuffers[iBuffer+iChannel].mData, (frameCountPerBuffer - framesRemaining) * ma_get_bytes_per_sample(pDevice->playback.internalFormat));\n                    }\n\n                    ma_deinterleave_pcm_frames(pDevice->playback.internalFormat, pDevice->playback.internalChannels, framesToRead, tempBuffer, ppDeinterleavedBuffers);\n\n                    framesRemaining -= framesToRead;\n                }\n            }\n        }\n    }\n\n    (void)pActionFlags;\n    (void)pTimeStamp;\n    (void)busNumber;\n    (void)frameCount;\n\n    return noErr;\n}\n\nstatic OSStatus ma_on_input__coreaudio(void* pUserData, AudioUnitRenderActionFlags* pActionFlags, const AudioTimeStamp* pTimeStamp, UInt32 busNumber, UInt32 frameCount, AudioBufferList* pUnusedBufferList)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    AudioBufferList* pRenderedBufferList;\n    ma_result result;\n    ma_stream_layout layout;\n    ma_uint32 iBuffer;\n    OSStatus status;\n\n    MA_ASSERT(pDevice != NULL);\n\n    pRenderedBufferList = (AudioBufferList*)pDevice->coreaudio.pAudioBufferList;\n    MA_ASSERT(pRenderedBufferList);\n\n    /* We need to check whether or not we are outputting interleaved or non-interleaved samples. The way we do this is slightly different for each type. */\n    layout = ma_stream_layout_interleaved;\n    if (pRenderedBufferList->mBuffers[0].mNumberChannels != pDevice->capture.internalChannels) {\n        layout = ma_stream_layout_deinterleaved;\n    }\n\n    /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"INFO: Input Callback: busNumber=%d, frameCount=%d, mNumberBuffers=%d\\n\", (int)busNumber, (int)frameCount, (int)pRenderedBufferList->mNumberBuffers);*/\n\n    /*\n    There has been a situation reported where frame count passed into this function is greater than the capacity of\n    our capture buffer. There doesn't seem to be a reliable way to determine what the maximum frame count will be,\n    so we need to instead resort to dynamically reallocating our buffer to ensure it's large enough to capture the\n    number of frames requested by this callback.\n    */\n    result = ma_device_realloc_AudioBufferList__coreaudio(pDevice, frameCount, pDevice->capture.internalFormat, pDevice->capture.internalChannels, layout);\n    if (result != MA_SUCCESS) {\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"Failed to allocate AudioBufferList for capture.\\n\");\n        return noErr;\n    }\n\n    pRenderedBufferList = (AudioBufferList*)pDevice->coreaudio.pAudioBufferList;\n    MA_ASSERT(pRenderedBufferList);\n\n    /*\n    When you call AudioUnitRender(), Core Audio tries to be helpful by setting the mDataByteSize to the number of bytes\n    that were actually rendered. The problem with this is that the next call can fail with -50 due to the size no longer\n    being set to the capacity of the buffer, but instead the size in bytes of the previous render. This will cause a\n    problem when a future call to this callback specifies a larger number of frames.\n\n    To work around this we need to explicitly set the size of each buffer to their respective size in bytes.\n    */\n    for (iBuffer = 0; iBuffer < pRenderedBufferList->mNumberBuffers; ++iBuffer) {\n        pRenderedBufferList->mBuffers[iBuffer].mDataByteSize = pDevice->coreaudio.audioBufferCapInFrames * ma_get_bytes_per_sample(pDevice->capture.internalFormat) * pRenderedBufferList->mBuffers[iBuffer].mNumberChannels;\n    }\n\n    status = ((ma_AudioUnitRender_proc)pDevice->pContext->coreaudio.AudioUnitRender)((AudioUnit)pDevice->coreaudio.audioUnitCapture, pActionFlags, pTimeStamp, busNumber, frameCount, pRenderedBufferList);\n    if (status != noErr) {\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"  ERROR: AudioUnitRender() failed with %d.\\n\", (int)status);\n        return status;\n    }\n\n    if (layout == ma_stream_layout_interleaved) {\n        for (iBuffer = 0; iBuffer < pRenderedBufferList->mNumberBuffers; ++iBuffer) {\n            if (pRenderedBufferList->mBuffers[iBuffer].mNumberChannels == pDevice->capture.internalChannels) {\n                ma_device_handle_backend_data_callback(pDevice, NULL, pRenderedBufferList->mBuffers[iBuffer].mData, frameCount);\n                /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"  mDataByteSize=%d.\\n\", (int)pRenderedBufferList->mBuffers[iBuffer].mDataByteSize);*/\n            } else {\n                /*\n                This case is where the number of channels in the output buffer do not match our internal channels. It could mean that it's\n                not interleaved, in which case we can't handle right now since miniaudio does not yet support non-interleaved streams.\n                */\n                ma_uint8 silentBuffer[4096];\n                ma_uint32 framesRemaining;\n\n                MA_ZERO_MEMORY(silentBuffer, sizeof(silentBuffer));\n\n                framesRemaining = frameCount;\n                while (framesRemaining > 0) {\n                    ma_uint32 framesToSend = sizeof(silentBuffer) / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n                    if (framesToSend > framesRemaining) {\n                        framesToSend = framesRemaining;\n                    }\n\n                    ma_device_handle_backend_data_callback(pDevice, NULL, silentBuffer, framesToSend);\n\n                    framesRemaining -= framesToSend;\n                }\n\n                /*ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_DEBUG, \"  WARNING: Outputting silence. frameCount=%d, mNumberChannels=%d, mDataByteSize=%d\\n\", (int)frameCount, (int)pRenderedBufferList->mBuffers[iBuffer].mNumberChannels, (int)pRenderedBufferList->mBuffers[iBuffer].mDataByteSize);*/\n            }\n        }\n    } else {\n        /* This is the deinterleaved case. We need to interleave the audio data before sending it to the client. This assumes each buffer is the same size. */\n        MA_ASSERT(pDevice->capture.internalChannels <= MA_MAX_CHANNELS);    /* This should have been validated at initialization time. */\n\n        /*\n        For safety we'll check that the internal channels is a multiple of the buffer count. If it's not it means something\n        very strange has happened and we're not going to support it.\n        */\n        if ((pRenderedBufferList->mNumberBuffers % pDevice->capture.internalChannels) == 0) {\n            ma_uint8 tempBuffer[4096];\n            for (iBuffer = 0; iBuffer < pRenderedBufferList->mNumberBuffers; iBuffer += pDevice->capture.internalChannels) {\n                ma_uint32 framesRemaining = frameCount;\n                while (framesRemaining > 0) {\n                    void* ppDeinterleavedBuffers[MA_MAX_CHANNELS];\n                    ma_uint32 iChannel;\n                    ma_uint32 framesToSend = sizeof(tempBuffer) / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n                    if (framesToSend > framesRemaining) {\n                        framesToSend = framesRemaining;\n                    }\n\n                    for (iChannel = 0; iChannel < pDevice->capture.internalChannels; ++iChannel) {\n                        ppDeinterleavedBuffers[iChannel] = (void*)ma_offset_ptr(pRenderedBufferList->mBuffers[iBuffer+iChannel].mData, (frameCount - framesRemaining) * ma_get_bytes_per_sample(pDevice->capture.internalFormat));\n                    }\n\n                    ma_interleave_pcm_frames(pDevice->capture.internalFormat, pDevice->capture.internalChannels, framesToSend, (const void**)ppDeinterleavedBuffers, tempBuffer);\n                    ma_device_handle_backend_data_callback(pDevice, NULL, tempBuffer, framesToSend);\n\n                    framesRemaining -= framesToSend;\n                }\n            }\n        }\n    }\n\n    (void)pActionFlags;\n    (void)pTimeStamp;\n    (void)busNumber;\n    (void)frameCount;\n    (void)pUnusedBufferList;\n\n    return noErr;\n}\n\nstatic void on_start_stop__coreaudio(void* pUserData, AudioUnit audioUnit, AudioUnitPropertyID propertyID, AudioUnitScope scope, AudioUnitElement element)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    MA_ASSERT(pDevice != NULL);\n\n    /* Don't do anything if it looks like we're just reinitializing due to a device switch. */\n    if (((audioUnit == pDevice->coreaudio.audioUnitPlayback) && pDevice->coreaudio.isSwitchingPlaybackDevice) ||\n        ((audioUnit == pDevice->coreaudio.audioUnitCapture)  && pDevice->coreaudio.isSwitchingCaptureDevice)) {\n        return;\n    }\n\n    /*\n    There's been a report of a deadlock here when triggered by ma_device_uninit(). It looks like\n    AudioUnitGetProprty (called below) and AudioComponentInstanceDispose (called in ma_device_uninit)\n    can try waiting on the same lock. I'm going to try working around this by not calling any Core\n    Audio APIs in the callback when the device has been stopped or uninitialized.\n    */\n    if (ma_device_get_state(pDevice) == ma_device_state_uninitialized || ma_device_get_state(pDevice) == ma_device_state_stopping || ma_device_get_state(pDevice) == ma_device_state_stopped) {\n        ma_device__on_notification_stopped(pDevice);\n    } else {\n        UInt32 isRunning;\n        UInt32 isRunningSize = sizeof(isRunning);\n        OSStatus status = ((ma_AudioUnitGetProperty_proc)pDevice->pContext->coreaudio.AudioUnitGetProperty)(audioUnit, kAudioOutputUnitProperty_IsRunning, scope, element, &isRunning, &isRunningSize);\n        if (status != noErr) {\n            goto done; /* Don't really know what to do in this case... just ignore it, I suppose... */\n        }\n\n        if (!isRunning) {\n            /*\n            The stop event is a bit annoying in Core Audio because it will be called when we automatically switch the default device. Some scenarios to consider:\n\n            1) When the device is unplugged, this will be called _before_ the default device change notification.\n            2) When the device is changed via the default device change notification, this will be called _after_ the switch.\n\n            For case #1, we just check if there's a new default device available. If so, we just ignore the stop event. For case #2 we check a flag.\n            */\n            if (((audioUnit == pDevice->coreaudio.audioUnitPlayback) && pDevice->coreaudio.isDefaultPlaybackDevice) ||\n                ((audioUnit == pDevice->coreaudio.audioUnitCapture)  && pDevice->coreaudio.isDefaultCaptureDevice)) {\n                /*\n                It looks like the device is switching through an external event, such as the user unplugging the device or changing the default device\n                via the operating system's sound settings. If we're re-initializing the device, we just terminate because we want the stopping of the\n                device to be seamless to the client (we don't want them receiving the stopped event and thinking that the device has stopped when it\n                hasn't!).\n                */\n                if (((audioUnit == pDevice->coreaudio.audioUnitPlayback) && pDevice->coreaudio.isSwitchingPlaybackDevice) ||\n                    ((audioUnit == pDevice->coreaudio.audioUnitCapture)  && pDevice->coreaudio.isSwitchingCaptureDevice)) {\n                    goto done;\n                }\n\n                /*\n                Getting here means the device is not reinitializing which means it may have been unplugged. From what I can see, it looks like Core Audio\n                will try switching to the new default device seamlessly. We need to somehow find a way to determine whether or not Core Audio will most\n                likely be successful in switching to the new device.\n\n                TODO: Try to predict if Core Audio will switch devices. If not, the stopped callback needs to be posted.\n                */\n                goto done;\n            }\n\n            /* Getting here means we need to stop the device. */\n            ma_device__on_notification_stopped(pDevice);\n        }\n    }\n\n    (void)propertyID; /* Unused. */\n\ndone:\n    /* Always signal the stop event. It's possible for the \"else\" case to get hit which can happen during an interruption. */\n    ma_event_signal(&pDevice->coreaudio.stopEvent);\n}\n\n#if defined(MA_APPLE_DESKTOP)\nstatic ma_spinlock g_DeviceTrackingInitLock_CoreAudio = 0;  /* A spinlock for mutal exclusion of the init/uninit of the global tracking data. Initialization to 0 is what we need. */\nstatic ma_uint32   g_DeviceTrackingInitCounter_CoreAudio = 0;\nstatic ma_mutex    g_DeviceTrackingMutex_CoreAudio;\nstatic ma_device** g_ppTrackedDevices_CoreAudio = NULL;\nstatic ma_uint32   g_TrackedDeviceCap_CoreAudio = 0;\nstatic ma_uint32   g_TrackedDeviceCount_CoreAudio = 0;\n\nstatic OSStatus ma_default_device_changed__coreaudio(AudioObjectID objectID, UInt32 addressCount, const AudioObjectPropertyAddress* pAddresses, void* pUserData)\n{\n    ma_device_type deviceType;\n\n    /* Not sure if I really need to check this, but it makes me feel better. */\n    if (addressCount == 0) {\n        return noErr;\n    }\n\n    if (pAddresses[0].mSelector == kAudioHardwarePropertyDefaultOutputDevice) {\n        deviceType = ma_device_type_playback;\n    } else if (pAddresses[0].mSelector == kAudioHardwarePropertyDefaultInputDevice) {\n        deviceType = ma_device_type_capture;\n    } else {\n        return noErr;   /* Should never hit this. */\n    }\n\n    ma_mutex_lock(&g_DeviceTrackingMutex_CoreAudio);\n    {\n        ma_uint32 iDevice;\n        for (iDevice = 0; iDevice < g_TrackedDeviceCount_CoreAudio; iDevice += 1) {\n            ma_result reinitResult;\n            ma_device* pDevice;\n\n            pDevice = g_ppTrackedDevices_CoreAudio[iDevice];\n            if (pDevice->type == deviceType || pDevice->type == ma_device_type_duplex) {\n                if (deviceType == ma_device_type_playback) {\n                    pDevice->coreaudio.isSwitchingPlaybackDevice = MA_TRUE;\n                    reinitResult = ma_device_reinit_internal__coreaudio(pDevice, deviceType, MA_TRUE);\n                    pDevice->coreaudio.isSwitchingPlaybackDevice = MA_FALSE;\n                } else {\n                    pDevice->coreaudio.isSwitchingCaptureDevice = MA_TRUE;\n                    reinitResult = ma_device_reinit_internal__coreaudio(pDevice, deviceType, MA_TRUE);\n                    pDevice->coreaudio.isSwitchingCaptureDevice = MA_FALSE;\n                }\n\n                if (reinitResult == MA_SUCCESS) {\n                    ma_device__post_init_setup(pDevice, deviceType);\n\n                    /* Restart the device if required. If this fails we need to stop the device entirely. */\n                    if (ma_device_get_state(pDevice) == ma_device_state_started) {\n                        OSStatus status;\n                        if (deviceType == ma_device_type_playback) {\n                            status = ((ma_AudioOutputUnitStart_proc)pDevice->pContext->coreaudio.AudioOutputUnitStart)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n                            if (status != noErr) {\n                                if (pDevice->type == ma_device_type_duplex) {\n                                    ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n                                }\n                                ma_device__set_state(pDevice, ma_device_state_stopped);\n                            }\n                        } else if (deviceType == ma_device_type_capture) {\n                            status = ((ma_AudioOutputUnitStart_proc)pDevice->pContext->coreaudio.AudioOutputUnitStart)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n                            if (status != noErr) {\n                                if (pDevice->type == ma_device_type_duplex) {\n                                    ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n                                }\n                                ma_device__set_state(pDevice, ma_device_state_stopped);\n                            }\n                        }\n                    }\n\n                    ma_device__on_notification_rerouted(pDevice);\n                }\n            }\n        }\n    }\n    ma_mutex_unlock(&g_DeviceTrackingMutex_CoreAudio);\n\n    /* Unused parameters. */\n    (void)objectID;\n    (void)pUserData;\n\n    return noErr;\n}\n\nstatic ma_result ma_context__init_device_tracking__coreaudio(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n\n    ma_spinlock_lock(&g_DeviceTrackingInitLock_CoreAudio);\n    {\n        /* Don't do anything if we've already initializd device tracking. */\n        if (g_DeviceTrackingInitCounter_CoreAudio == 0) {\n            AudioObjectPropertyAddress propAddress;\n            propAddress.mScope    = kAudioObjectPropertyScopeGlobal;\n            propAddress.mElement  = AUDIO_OBJECT_PROPERTY_ELEMENT;\n\n            ma_mutex_init(&g_DeviceTrackingMutex_CoreAudio);\n\n            propAddress.mSelector = kAudioHardwarePropertyDefaultInputDevice;\n            ((ma_AudioObjectAddPropertyListener_proc)pContext->coreaudio.AudioObjectAddPropertyListener)(kAudioObjectSystemObject, &propAddress, &ma_default_device_changed__coreaudio, NULL);\n\n            propAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice;\n            ((ma_AudioObjectAddPropertyListener_proc)pContext->coreaudio.AudioObjectAddPropertyListener)(kAudioObjectSystemObject, &propAddress, &ma_default_device_changed__coreaudio, NULL);\n\n        }\n        g_DeviceTrackingInitCounter_CoreAudio += 1;\n    }\n    ma_spinlock_unlock(&g_DeviceTrackingInitLock_CoreAudio);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context__uninit_device_tracking__coreaudio(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n\n    ma_spinlock_lock(&g_DeviceTrackingInitLock_CoreAudio);\n    {\n        if (g_DeviceTrackingInitCounter_CoreAudio > 0)\n            g_DeviceTrackingInitCounter_CoreAudio -= 1;\n\n        if (g_DeviceTrackingInitCounter_CoreAudio == 0) {\n            AudioObjectPropertyAddress propAddress;\n            propAddress.mScope    = kAudioObjectPropertyScopeGlobal;\n            propAddress.mElement  = AUDIO_OBJECT_PROPERTY_ELEMENT;\n\n            propAddress.mSelector = kAudioHardwarePropertyDefaultInputDevice;\n            ((ma_AudioObjectRemovePropertyListener_proc)pContext->coreaudio.AudioObjectRemovePropertyListener)(kAudioObjectSystemObject, &propAddress, &ma_default_device_changed__coreaudio, NULL);\n\n            propAddress.mSelector = kAudioHardwarePropertyDefaultOutputDevice;\n            ((ma_AudioObjectRemovePropertyListener_proc)pContext->coreaudio.AudioObjectRemovePropertyListener)(kAudioObjectSystemObject, &propAddress, &ma_default_device_changed__coreaudio, NULL);\n\n            /* At this point there should be no tracked devices. If not there's an error somewhere. */\n            if (g_ppTrackedDevices_CoreAudio != NULL) {\n                ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, \"You have uninitialized all contexts while an associated device is still active.\");\n                ma_spinlock_unlock(&g_DeviceTrackingInitLock_CoreAudio);\n                return MA_INVALID_OPERATION;\n            }\n\n            ma_mutex_uninit(&g_DeviceTrackingMutex_CoreAudio);\n        }\n    }\n    ma_spinlock_unlock(&g_DeviceTrackingInitLock_CoreAudio);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device__track__coreaudio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    ma_mutex_lock(&g_DeviceTrackingMutex_CoreAudio);\n    {\n        /* Allocate memory if required. */\n        if (g_TrackedDeviceCap_CoreAudio <= g_TrackedDeviceCount_CoreAudio) {\n            ma_uint32 newCap;\n            ma_device** ppNewDevices;\n\n            newCap = g_TrackedDeviceCap_CoreAudio * 2;\n            if (newCap == 0) {\n                newCap = 1;\n            }\n\n            ppNewDevices = (ma_device**)ma_realloc(g_ppTrackedDevices_CoreAudio, sizeof(*g_ppTrackedDevices_CoreAudio)*newCap, &pDevice->pContext->allocationCallbacks);\n            if (ppNewDevices == NULL) {\n                ma_mutex_unlock(&g_DeviceTrackingMutex_CoreAudio);\n                return MA_OUT_OF_MEMORY;\n            }\n\n            g_ppTrackedDevices_CoreAudio = ppNewDevices;\n            g_TrackedDeviceCap_CoreAudio = newCap;\n        }\n\n        g_ppTrackedDevices_CoreAudio[g_TrackedDeviceCount_CoreAudio] = pDevice;\n        g_TrackedDeviceCount_CoreAudio += 1;\n    }\n    ma_mutex_unlock(&g_DeviceTrackingMutex_CoreAudio);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device__untrack__coreaudio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    ma_mutex_lock(&g_DeviceTrackingMutex_CoreAudio);\n    {\n        ma_uint32 iDevice;\n        for (iDevice = 0; iDevice < g_TrackedDeviceCount_CoreAudio; iDevice += 1) {\n            if (g_ppTrackedDevices_CoreAudio[iDevice] == pDevice) {\n                /* We've found the device. We now need to remove it from the list. */\n                ma_uint32 jDevice;\n                for (jDevice = iDevice; jDevice < g_TrackedDeviceCount_CoreAudio-1; jDevice += 1) {\n                    g_ppTrackedDevices_CoreAudio[jDevice] = g_ppTrackedDevices_CoreAudio[jDevice+1];\n                }\n\n                g_TrackedDeviceCount_CoreAudio -= 1;\n\n                /* If there's nothing else in the list we need to free memory. */\n                if (g_TrackedDeviceCount_CoreAudio == 0) {\n                    ma_free(g_ppTrackedDevices_CoreAudio, &pDevice->pContext->allocationCallbacks);\n                    g_ppTrackedDevices_CoreAudio = NULL;\n                    g_TrackedDeviceCap_CoreAudio = 0;\n                }\n\n                break;\n            }\n        }\n    }\n    ma_mutex_unlock(&g_DeviceTrackingMutex_CoreAudio);\n\n    return MA_SUCCESS;\n}\n#endif\n\n#if defined(MA_APPLE_MOBILE)\n@interface ma_ios_notification_handler:NSObject {\n    ma_device* m_pDevice;\n}\n@end\n\n@implementation ma_ios_notification_handler\n-(id)init:(ma_device*)pDevice\n{\n    self = [super init];\n    m_pDevice = pDevice;\n\n    /* For route changes. */\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handle_route_change:) name:AVAudioSessionRouteChangeNotification object:[AVAudioSession sharedInstance]];\n\n    /* For interruptions. */\n    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handle_interruption:) name:AVAudioSessionInterruptionNotification object:[AVAudioSession sharedInstance]];\n\n    return self;\n}\n\n-(void)dealloc\n{\n    [self remove_handler];\n\n    #if defined(__has_feature)\n        #if !__has_feature(objc_arc)\n            [super dealloc];\n        #endif\n    #endif\n}\n\n-(void)remove_handler\n{\n    [[NSNotificationCenter defaultCenter] removeObserver:self name:AVAudioSessionRouteChangeNotification object:nil];\n    [[NSNotificationCenter defaultCenter] removeObserver:self name:AVAudioSessionInterruptionNotification object:nil];\n}\n\n-(void)handle_interruption:(NSNotification*)pNotification\n{\n    NSInteger type = [[[pNotification userInfo] objectForKey:AVAudioSessionInterruptionTypeKey] integerValue];\n    switch (type)\n    {\n        case AVAudioSessionInterruptionTypeBegan:\n        {\n            ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, \"[Core Audio] Interruption: AVAudioSessionInterruptionTypeBegan\\n\");\n\n            /*\n            Core Audio will have stopped the internal device automatically, but we need explicitly\n            stop it at a higher level to ensure miniaudio-specific state is updated for consistency.\n            */\n            ma_device_stop(m_pDevice);\n\n            /*\n            Fire the notification after the device has been stopped to ensure it's in the correct\n            state when the notification handler is invoked.\n            */\n            ma_device__on_notification_interruption_began(m_pDevice);\n        } break;\n\n        case AVAudioSessionInterruptionTypeEnded:\n        {\n            ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, \"[Core Audio] Interruption: AVAudioSessionInterruptionTypeEnded\\n\");\n            ma_device__on_notification_interruption_ended(m_pDevice);\n        } break;\n    }\n}\n\n-(void)handle_route_change:(NSNotification*)pNotification\n{\n    AVAudioSession* pSession = [AVAudioSession sharedInstance];\n\n    NSInteger reason = [[[pNotification userInfo] objectForKey:AVAudioSessionRouteChangeReasonKey] integerValue];\n    switch (reason)\n    {\n        case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:\n        {\n            ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, \"[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonOldDeviceUnavailable\\n\");\n        } break;\n\n        case AVAudioSessionRouteChangeReasonNewDeviceAvailable:\n        {\n            ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, \"[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonNewDeviceAvailable\\n\");\n        } break;\n\n        case AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory:\n        {\n            ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, \"[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory\\n\");\n        } break;\n\n        case AVAudioSessionRouteChangeReasonWakeFromSleep:\n        {\n            ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, \"[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonWakeFromSleep\\n\");\n        } break;\n\n        case AVAudioSessionRouteChangeReasonOverride:\n        {\n            ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, \"[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonOverride\\n\");\n        } break;\n\n        case AVAudioSessionRouteChangeReasonCategoryChange:\n        {\n            ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, \"[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonCategoryChange\\n\");\n        } break;\n\n        case AVAudioSessionRouteChangeReasonUnknown:\n        default:\n        {\n            ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_INFO, \"[Core Audio] Route Changed: AVAudioSessionRouteChangeReasonUnknown\\n\");\n        } break;\n    }\n\n    ma_log_postf(ma_device_get_log(m_pDevice), MA_LOG_LEVEL_DEBUG, \"[Core Audio] Changing Route. inputNumberChannels=%d; outputNumberOfChannels=%d\\n\", (int)pSession.inputNumberOfChannels, (int)pSession.outputNumberOfChannels);\n\n    /* Let the application know about the route change. */\n    ma_device__on_notification_rerouted(m_pDevice);\n}\n@end\n#endif\n\nstatic ma_result ma_device_uninit__coreaudio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_uninitialized);\n\n#if defined(MA_APPLE_DESKTOP)\n    /*\n    Make sure we're no longer tracking the device. It doesn't matter if we call this for a non-default device because it'll\n    just gracefully ignore it.\n    */\n    ma_device__untrack__coreaudio(pDevice);\n#endif\n#if defined(MA_APPLE_MOBILE)\n    if (pDevice->coreaudio.pNotificationHandler != NULL) {\n        ma_ios_notification_handler* pNotificationHandler = (MA_BRIDGE_TRANSFER ma_ios_notification_handler*)pDevice->coreaudio.pNotificationHandler;\n        [pNotificationHandler remove_handler];\n    }\n#endif\n\n    if (pDevice->coreaudio.audioUnitCapture != NULL) {\n        ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n    }\n    if (pDevice->coreaudio.audioUnitPlayback != NULL) {\n        ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n    }\n\n    if (pDevice->coreaudio.pAudioBufferList) {\n        ma_free(pDevice->coreaudio.pAudioBufferList, &pDevice->pContext->allocationCallbacks);\n    }\n\n    return MA_SUCCESS;\n}\n\ntypedef struct\n{\n    ma_bool32 allowNominalSampleRateChange;\n\n    /* Input. */\n    ma_format formatIn;\n    ma_uint32 channelsIn;\n    ma_uint32 sampleRateIn;\n    ma_channel channelMapIn[MA_MAX_CHANNELS];\n    ma_uint32 periodSizeInFramesIn;\n    ma_uint32 periodSizeInMillisecondsIn;\n    ma_uint32 periodsIn;\n    ma_share_mode shareMode;\n    ma_performance_profile performanceProfile;\n    ma_bool32 registerStopEvent;\n\n    /* Output. */\n#if defined(MA_APPLE_DESKTOP)\n    AudioObjectID deviceObjectID;\n#endif\n    AudioComponent component;\n    AudioUnit audioUnit;\n    AudioBufferList* pAudioBufferList;  /* Only used for input devices. */\n    ma_format formatOut;\n    ma_uint32 channelsOut;\n    ma_uint32 sampleRateOut;\n    ma_channel channelMapOut[MA_MAX_CHANNELS];\n    ma_uint32 periodSizeInFramesOut;\n    ma_uint32 periodsOut;\n    char deviceName[256];\n} ma_device_init_internal_data__coreaudio;\n\nstatic ma_result ma_device_init_internal__coreaudio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_init_internal_data__coreaudio* pData, void* pDevice_DoNotReference)   /* <-- pDevice is typed as void* intentionally so as to avoid accidentally referencing it. */\n{\n    ma_result result;\n    OSStatus status;\n    UInt32 enableIOFlag;\n    AudioStreamBasicDescription bestFormat;\n    UInt32 actualPeriodSizeInFrames;\n    AURenderCallbackStruct callbackInfo;\n#if defined(MA_APPLE_DESKTOP)\n    AudioObjectID deviceObjectID;\n#endif\n\n    /* This API should only be used for a single device type: playback or capture. No full-duplex mode. */\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(deviceType == ma_device_type_playback || deviceType == ma_device_type_capture);\n\n#if defined(MA_APPLE_DESKTOP)\n    pData->deviceObjectID = 0;\n#endif\n    pData->component = NULL;\n    pData->audioUnit = NULL;\n    pData->pAudioBufferList = NULL;\n\n#if defined(MA_APPLE_DESKTOP)\n    result = ma_find_AudioObjectID(pContext, deviceType, pDeviceID, &deviceObjectID);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pData->deviceObjectID = deviceObjectID;\n#endif\n\n    /* Core audio doesn't really use the notion of a period so we can leave this unmodified, but not too over the top. */\n    pData->periodsOut = pData->periodsIn;\n    if (pData->periodsOut == 0) {\n        pData->periodsOut = MA_DEFAULT_PERIODS;\n    }\n    if (pData->periodsOut > 16) {\n        pData->periodsOut = 16;\n    }\n\n\n    /* Audio unit. */\n    status = ((ma_AudioComponentInstanceNew_proc)pContext->coreaudio.AudioComponentInstanceNew)((AudioComponent)pContext->coreaudio.component, (AudioUnit*)&pData->audioUnit);\n    if (status != noErr) {\n        return ma_result_from_OSStatus(status);\n    }\n\n\n    /* The input/output buses need to be explicitly enabled and disabled. We set the flag based on the output unit first, then we just swap it for input. */\n    enableIOFlag = 1;\n    if (deviceType == ma_device_type_capture) {\n        enableIOFlag = 0;\n    }\n\n    status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, MA_COREAUDIO_OUTPUT_BUS, &enableIOFlag, sizeof(enableIOFlag));\n    if (status != noErr) {\n        ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n        return ma_result_from_OSStatus(status);\n    }\n\n    enableIOFlag = (enableIOFlag == 0) ? 1 : 0;\n    status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, MA_COREAUDIO_INPUT_BUS, &enableIOFlag, sizeof(enableIOFlag));\n    if (status != noErr) {\n        ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n        return ma_result_from_OSStatus(status);\n    }\n\n\n    /* Set the device to use with this audio unit. This is only used on desktop since we are using defaults on mobile. */\n#if defined(MA_APPLE_DESKTOP)\n    status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &deviceObjectID, sizeof(deviceObjectID));\n    if (status != noErr) {\n        ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n        return ma_result_from_OSStatus(result);\n    }\n#else\n    /*\n    For some reason it looks like Apple is only allowing selection of the input device. There does not appear to be any way to change\n    the default output route. I have no idea why this is like this, but for now we'll only be able to configure capture devices.\n    */\n    if (pDeviceID != NULL) {\n        if (deviceType == ma_device_type_capture) {\n            ma_bool32 found = MA_FALSE;\n            NSArray *pInputs = [[[AVAudioSession sharedInstance] currentRoute] inputs];\n            for (AVAudioSessionPortDescription* pPortDesc in pInputs) {\n                if (strcmp(pDeviceID->coreaudio, [pPortDesc.UID UTF8String]) == 0) {\n                    [[AVAudioSession sharedInstance] setPreferredInput:pPortDesc error:nil];\n                    found = MA_TRUE;\n                    break;\n                }\n            }\n\n            if (found == MA_FALSE) {\n                return MA_DOES_NOT_EXIST;\n            }\n        }\n    }\n#endif\n\n    /*\n    Format. This is the hardest part of initialization because there's a few variables to take into account.\n      1) The format must be supported by the device.\n      2) The format must be supported miniaudio.\n      3) There's a priority that miniaudio prefers.\n\n    Ideally we would like to use a format that's as close to the hardware as possible so we can get as close to a passthrough as possible. The\n    most important property is the sample rate. miniaudio can do format conversion for any sample rate and channel count, but cannot do the same\n    for the sample data format. If the sample data format is not supported by miniaudio it must be ignored completely.\n\n    On mobile platforms this is a bit different. We just force the use of whatever the audio unit's current format is set to.\n    */\n    {\n        AudioStreamBasicDescription origFormat;\n        UInt32 origFormatSize = sizeof(origFormat);\n        AudioUnitScope   formatScope   = (deviceType == ma_device_type_playback) ? kAudioUnitScope_Input : kAudioUnitScope_Output;\n        AudioUnitElement formatElement = (deviceType == ma_device_type_playback) ? MA_COREAUDIO_OUTPUT_BUS : MA_COREAUDIO_INPUT_BUS;\n\n        if (deviceType == ma_device_type_playback) {\n            status = ((ma_AudioUnitGetProperty_proc)pContext->coreaudio.AudioUnitGetProperty)(pData->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, MA_COREAUDIO_OUTPUT_BUS, &origFormat, &origFormatSize);\n        } else {\n            status = ((ma_AudioUnitGetProperty_proc)pContext->coreaudio.AudioUnitGetProperty)(pData->audioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, MA_COREAUDIO_INPUT_BUS, &origFormat, &origFormatSize);\n        }\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return ma_result_from_OSStatus(status);\n        }\n\n    #if defined(MA_APPLE_DESKTOP)\n        result = ma_find_best_format__coreaudio(pContext, deviceObjectID, deviceType, pData->formatIn, pData->channelsIn, pData->sampleRateIn, &origFormat, &bestFormat);\n        if (result != MA_SUCCESS) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return result;\n        }\n\n        /*\n        Technical Note TN2091: Device input using the HAL Output Audio Unit\n            https://developer.apple.com/library/archive/technotes/tn2091/_index.html\n\n        This documentation says the following:\n\n            The internal AudioConverter can handle any *simple* conversion. Typically, this means that a client can specify ANY\n            variant of the PCM formats. Consequently, the device's sample rate should match the desired sample rate. If sample rate\n            conversion is needed, it can be accomplished by buffering the input and converting the data on a separate thread with\n            another AudioConverter.\n\n        The important part here is the mention that it can handle *simple* conversions, which does *not* include sample rate. We\n        therefore want to ensure the sample rate stays consistent. This document is specifically for input, but I'm going to play it\n        safe and apply the same rule to output as well.\n\n        I have tried going against the documentation by setting the sample rate anyway, but this just results in AudioUnitRender()\n        returning a result code of -10863. I have also tried changing the format directly on the input scope on the input bus, but\n        this just results in `ca_require: IsStreamFormatWritable(inScope, inElement) NotWritable` when trying to set the format.\n\n        Something that does seem to work, however, has been setting the nominal sample rate on the deivce object. The problem with\n        this, however, is that it actually changes the sample rate at the operating system level and not just the application. This\n        could be intrusive to the user, however, so I don't think it's wise to make this the default. Instead I'm making this a\n        configuration option. When the `coreaudio.allowNominalSampleRateChange` config option is set to true, changing the sample\n        rate will be allowed. Otherwise it'll be fixed to the current sample rate. To check the system-defined sample rate, run\n        the Audio MIDI Setup program that comes installed on macOS and observe how the sample rate changes as the sample rate is\n        changed by miniaudio.\n        */\n        if (pData->allowNominalSampleRateChange) {\n            AudioValueRange sampleRateRange;\n            AudioObjectPropertyAddress propAddress;\n\n            sampleRateRange.mMinimum = bestFormat.mSampleRate;\n            sampleRateRange.mMaximum = bestFormat.mSampleRate;\n\n            propAddress.mSelector = kAudioDevicePropertyNominalSampleRate;\n            propAddress.mScope    = (deviceType == ma_device_type_playback) ? kAudioObjectPropertyScopeOutput : kAudioObjectPropertyScopeInput;\n            propAddress.mElement  = AUDIO_OBJECT_PROPERTY_ELEMENT;\n\n            status = ((ma_AudioObjectSetPropertyData_proc)pContext->coreaudio.AudioObjectSetPropertyData)(deviceObjectID, &propAddress, 0, NULL, sizeof(sampleRateRange), &sampleRateRange);\n            if (status != noErr) {\n                bestFormat.mSampleRate = origFormat.mSampleRate;\n            }\n        } else {\n            bestFormat.mSampleRate = origFormat.mSampleRate;\n        }\n\n        status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioUnitProperty_StreamFormat, formatScope, formatElement, &bestFormat, sizeof(bestFormat));\n        if (status != noErr) {\n            /* We failed to set the format, so fall back to the current format of the audio unit. */\n            bestFormat = origFormat;\n        }\n    #else\n        bestFormat = origFormat;\n\n        /*\n        Sample rate is a little different here because for some reason kAudioUnitProperty_StreamFormat returns 0... Oh well. We need to instead try\n        setting the sample rate to what the user has requested and then just see the results of it. Need to use some Objective-C here for this since\n        it depends on Apple's AVAudioSession API. To do this we just get the shared AVAudioSession instance and then set it. Note that from what I\n        can tell, it looks like the sample rate is shared between playback and capture for everything.\n        */\n        @autoreleasepool {\n            AVAudioSession* pAudioSession = [AVAudioSession sharedInstance];\n            MA_ASSERT(pAudioSession != NULL);\n\n            [pAudioSession setPreferredSampleRate:(double)pData->sampleRateIn error:nil];\n            bestFormat.mSampleRate = pAudioSession.sampleRate;\n\n            /*\n            I've had a report that the channel count returned by AudioUnitGetProperty above is inconsistent with\n            AVAudioSession outputNumberOfChannels. I'm going to try using the AVAudioSession values instead.\n            */\n            if (deviceType == ma_device_type_playback) {\n                bestFormat.mChannelsPerFrame = (UInt32)pAudioSession.outputNumberOfChannels;\n            }\n            if (deviceType == ma_device_type_capture) {\n                bestFormat.mChannelsPerFrame = (UInt32)pAudioSession.inputNumberOfChannels;\n            }\n        }\n\n        status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioUnitProperty_StreamFormat, formatScope, formatElement, &bestFormat, sizeof(bestFormat));\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return ma_result_from_OSStatus(status);\n        }\n    #endif\n\n        result = ma_format_from_AudioStreamBasicDescription(&bestFormat, &pData->formatOut);\n        if (result != MA_SUCCESS) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return result;\n        }\n\n        if (pData->formatOut == ma_format_unknown) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return MA_FORMAT_NOT_SUPPORTED;\n        }\n\n        pData->channelsOut   = bestFormat.mChannelsPerFrame;\n        pData->sampleRateOut = bestFormat.mSampleRate;\n    }\n\n    /* Clamp the channel count for safety. */\n    if (pData->channelsOut > MA_MAX_CHANNELS) {\n        pData->channelsOut = MA_MAX_CHANNELS;\n    }\n\n    /*\n    Internal channel map. This is weird in my testing. If I use the AudioObject to get the\n    channel map, the channel descriptions are set to \"Unknown\" for some reason. To work around\n    this it looks like retrieving it from the AudioUnit will work. However, and this is where\n    it gets weird, it doesn't seem to work with capture devices, nor at all on iOS... Therefore\n    I'm going to fall back to a default assumption in these cases.\n    */\n#if defined(MA_APPLE_DESKTOP)\n    result = ma_get_AudioUnit_channel_map(pContext, pData->audioUnit, deviceType, pData->channelMapOut, pData->channelsOut);\n    if (result != MA_SUCCESS) {\n    #if 0\n        /* Try falling back to the channel map from the AudioObject. */\n        result = ma_get_AudioObject_channel_map(pContext, deviceObjectID, deviceType, pData->channelMapOut, pData->channelsOut);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    #else\n        /* Fall back to default assumptions. */\n        ma_channel_map_init_standard(ma_standard_channel_map_default, pData->channelMapOut, ma_countof(pData->channelMapOut), pData->channelsOut);\n    #endif\n    }\n#else\n    /* TODO: Figure out how to get the channel map using AVAudioSession. */\n    ma_channel_map_init_standard(ma_standard_channel_map_default, pData->channelMapOut, ma_countof(pData->channelMapOut), pData->channelsOut);\n#endif\n\n\n    /* Buffer size. Not allowing this to be configurable on iOS. */\n    if (pData->periodSizeInFramesIn == 0) {\n        if (pData->periodSizeInMillisecondsIn == 0) {\n            if (pData->performanceProfile == ma_performance_profile_low_latency) {\n                actualPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_LOW_LATENCY, pData->sampleRateOut);\n            } else {\n                actualPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE, pData->sampleRateOut);\n            }\n        } else {\n            actualPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pData->periodSizeInMillisecondsIn, pData->sampleRateOut);\n        }\n    } else {\n        actualPeriodSizeInFrames = pData->periodSizeInFramesIn;\n    }\n\n#if defined(MA_APPLE_DESKTOP)\n    result = ma_set_AudioObject_buffer_size_in_frames(pContext, deviceObjectID, deviceType, &actualPeriodSizeInFrames);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n#else\n    /*\n    On iOS, the size of the IO buffer needs to be specified in seconds and is a floating point\n    number. I don't trust any potential truncation errors due to converting from float to integer\n    so I'm going to explicitly set the actual period size to the next power of 2.\n    */\n    @autoreleasepool {\n        AVAudioSession* pAudioSession = [AVAudioSession sharedInstance];\n        MA_ASSERT(pAudioSession != NULL);\n\n        [pAudioSession setPreferredIOBufferDuration:((float)actualPeriodSizeInFrames / pAudioSession.sampleRate) error:nil];\n        actualPeriodSizeInFrames = ma_next_power_of_2((ma_uint32)(pAudioSession.IOBufferDuration * pAudioSession.sampleRate));\n    }\n#endif\n\n\n    /*\n    During testing I discovered that the buffer size can be too big. You'll get an error like this:\n\n      kAudioUnitErr_TooManyFramesToProcess : inFramesToProcess=4096, mMaxFramesPerSlice=512\n\n    Note how inFramesToProcess is smaller than mMaxFramesPerSlice. To fix, we need to set kAudioUnitProperty_MaximumFramesPerSlice to that\n    of the size of our buffer, or do it the other way around and set our buffer size to the kAudioUnitProperty_MaximumFramesPerSlice.\n    */\n    status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioUnitProperty_MaximumFramesPerSlice, kAudioUnitScope_Global, 0, &actualPeriodSizeInFrames, sizeof(actualPeriodSizeInFrames));\n    if (status != noErr) {\n        ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n        return ma_result_from_OSStatus(status);\n    }\n\n    pData->periodSizeInFramesOut = (ma_uint32)actualPeriodSizeInFrames;\n\n    /* We need a buffer list if this is an input device. We render into this in the input callback. */\n    if (deviceType == ma_device_type_capture) {\n        ma_bool32 isInterleaved = (bestFormat.mFormatFlags & kAudioFormatFlagIsNonInterleaved) == 0;\n        AudioBufferList* pBufferList;\n\n        pBufferList = ma_allocate_AudioBufferList__coreaudio(pData->periodSizeInFramesOut, pData->formatOut, pData->channelsOut, (isInterleaved) ? ma_stream_layout_interleaved : ma_stream_layout_deinterleaved, &pContext->allocationCallbacks);\n        if (pBufferList == NULL) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return MA_OUT_OF_MEMORY;\n        }\n\n        pData->pAudioBufferList = pBufferList;\n    }\n\n    /* Callbacks. */\n    callbackInfo.inputProcRefCon = pDevice_DoNotReference;\n    if (deviceType == ma_device_type_playback) {\n        callbackInfo.inputProc = ma_on_output__coreaudio;\n        status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &callbackInfo, sizeof(callbackInfo));\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return ma_result_from_OSStatus(status);\n        }\n    } else {\n        callbackInfo.inputProc = ma_on_input__coreaudio;\n        status = ((ma_AudioUnitSetProperty_proc)pContext->coreaudio.AudioUnitSetProperty)(pData->audioUnit, kAudioOutputUnitProperty_SetInputCallback, kAudioUnitScope_Global, 0, &callbackInfo, sizeof(callbackInfo));\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return ma_result_from_OSStatus(status);\n        }\n    }\n\n    /* We need to listen for stop events. */\n    if (pData->registerStopEvent) {\n        status = ((ma_AudioUnitAddPropertyListener_proc)pContext->coreaudio.AudioUnitAddPropertyListener)(pData->audioUnit, kAudioOutputUnitProperty_IsRunning, on_start_stop__coreaudio, pDevice_DoNotReference);\n        if (status != noErr) {\n            ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n            return ma_result_from_OSStatus(status);\n        }\n    }\n\n    /* Initialize the audio unit. */\n    status = ((ma_AudioUnitInitialize_proc)pContext->coreaudio.AudioUnitInitialize)(pData->audioUnit);\n    if (status != noErr) {\n        ma_free(pData->pAudioBufferList, &pContext->allocationCallbacks);\n        pData->pAudioBufferList = NULL;\n        ((ma_AudioComponentInstanceDispose_proc)pContext->coreaudio.AudioComponentInstanceDispose)(pData->audioUnit);\n        return ma_result_from_OSStatus(status);\n    }\n\n    /* Grab the name. */\n#if defined(MA_APPLE_DESKTOP)\n    ma_get_AudioObject_name(pContext, deviceObjectID, sizeof(pData->deviceName), pData->deviceName);\n#else\n    if (deviceType == ma_device_type_playback) {\n        ma_strcpy_s(pData->deviceName, sizeof(pData->deviceName), MA_DEFAULT_PLAYBACK_DEVICE_NAME);\n    } else {\n        ma_strcpy_s(pData->deviceName, sizeof(pData->deviceName), MA_DEFAULT_CAPTURE_DEVICE_NAME);\n    }\n#endif\n\n    return result;\n}\n\n#if defined(MA_APPLE_DESKTOP)\nstatic ma_result ma_device_reinit_internal__coreaudio(ma_device* pDevice, ma_device_type deviceType, ma_bool32 disposePreviousAudioUnit)\n{\n    ma_device_init_internal_data__coreaudio data;\n    ma_result result;\n\n    /* This should only be called for playback or capture, not duplex. */\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n    data.allowNominalSampleRateChange = MA_FALSE;   /* Don't change the nominal sample rate when switching devices. */\n\n    if (deviceType == ma_device_type_capture) {\n        data.formatIn               = pDevice->capture.format;\n        data.channelsIn             = pDevice->capture.channels;\n        data.sampleRateIn           = pDevice->sampleRate;\n        MA_COPY_MEMORY(data.channelMapIn, pDevice->capture.channelMap, sizeof(pDevice->capture.channelMap));\n        data.shareMode              = pDevice->capture.shareMode;\n        data.performanceProfile     = pDevice->coreaudio.originalPerformanceProfile;\n        data.registerStopEvent      = MA_TRUE;\n\n        if (disposePreviousAudioUnit) {\n            ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n            ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n        }\n        if (pDevice->coreaudio.pAudioBufferList) {\n            ma_free(pDevice->coreaudio.pAudioBufferList, &pDevice->pContext->allocationCallbacks);\n        }\n    } else if (deviceType == ma_device_type_playback) {\n        data.formatIn               = pDevice->playback.format;\n        data.channelsIn             = pDevice->playback.channels;\n        data.sampleRateIn           = pDevice->sampleRate;\n        MA_COPY_MEMORY(data.channelMapIn, pDevice->playback.channelMap, sizeof(pDevice->playback.channelMap));\n        data.shareMode              = pDevice->playback.shareMode;\n        data.performanceProfile     = pDevice->coreaudio.originalPerformanceProfile;\n        data.registerStopEvent      = (pDevice->type != ma_device_type_duplex);\n\n        if (disposePreviousAudioUnit) {\n            ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n            ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n        }\n    }\n    data.periodSizeInFramesIn       = pDevice->coreaudio.originalPeriodSizeInFrames;\n    data.periodSizeInMillisecondsIn = pDevice->coreaudio.originalPeriodSizeInMilliseconds;\n    data.periodsIn                  = pDevice->coreaudio.originalPeriods;\n\n    /* Need at least 3 periods for duplex. */\n    if (data.periodsIn < 3 && pDevice->type == ma_device_type_duplex) {\n        data.periodsIn = 3;\n    }\n\n    result = ma_device_init_internal__coreaudio(pDevice->pContext, deviceType, NULL, &data, (void*)pDevice);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (deviceType == ma_device_type_capture) {\n    #if defined(MA_APPLE_DESKTOP)\n        pDevice->coreaudio.deviceObjectIDCapture     = (ma_uint32)data.deviceObjectID;\n        ma_get_AudioObject_uid(pDevice->pContext, pDevice->coreaudio.deviceObjectIDCapture, sizeof(pDevice->capture.id.coreaudio), pDevice->capture.id.coreaudio);\n    #endif\n        pDevice->coreaudio.audioUnitCapture          = (ma_ptr)data.audioUnit;\n        pDevice->coreaudio.pAudioBufferList          = (ma_ptr)data.pAudioBufferList;\n        pDevice->coreaudio.audioBufferCapInFrames    = data.periodSizeInFramesOut;\n\n        pDevice->capture.internalFormat              = data.formatOut;\n        pDevice->capture.internalChannels            = data.channelsOut;\n        pDevice->capture.internalSampleRate          = data.sampleRateOut;\n        MA_COPY_MEMORY(pDevice->capture.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDevice->capture.internalPeriodSizeInFrames  = data.periodSizeInFramesOut;\n        pDevice->capture.internalPeriods             = data.periodsOut;\n    } else if (deviceType == ma_device_type_playback) {\n    #if defined(MA_APPLE_DESKTOP)\n        pDevice->coreaudio.deviceObjectIDPlayback    = (ma_uint32)data.deviceObjectID;\n        ma_get_AudioObject_uid(pDevice->pContext, pDevice->coreaudio.deviceObjectIDPlayback, sizeof(pDevice->playback.id.coreaudio), pDevice->playback.id.coreaudio);\n    #endif\n        pDevice->coreaudio.audioUnitPlayback         = (ma_ptr)data.audioUnit;\n\n        pDevice->playback.internalFormat             = data.formatOut;\n        pDevice->playback.internalChannels           = data.channelsOut;\n        pDevice->playback.internalSampleRate         = data.sampleRateOut;\n        MA_COPY_MEMORY(pDevice->playback.internalChannelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDevice->playback.internalPeriodSizeInFrames = data.periodSizeInFramesOut;\n        pDevice->playback.internalPeriods            = data.periodsOut;\n    }\n\n    return MA_SUCCESS;\n}\n#endif /* MA_APPLE_DESKTOP */\n\nstatic ma_result ma_device_init__coreaudio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n    ma_result result;\n\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(pConfig != NULL);\n\n    if (pConfig->deviceType == ma_device_type_loopback) {\n        return MA_DEVICE_TYPE_NOT_SUPPORTED;\n    }\n\n    /* No exclusive mode with the Core Audio backend for now. */\n    if (((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->shareMode  == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->shareMode == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    /* Capture needs to be initialized first. */\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_device_init_internal_data__coreaudio data;\n        data.allowNominalSampleRateChange = pConfig->coreaudio.allowNominalSampleRateChange;\n        data.formatIn                     = pDescriptorCapture->format;\n        data.channelsIn                   = pDescriptorCapture->channels;\n        data.sampleRateIn                 = pDescriptorCapture->sampleRate;\n        MA_COPY_MEMORY(data.channelMapIn, pDescriptorCapture->channelMap, sizeof(pDescriptorCapture->channelMap));\n        data.periodSizeInFramesIn         = pDescriptorCapture->periodSizeInFrames;\n        data.periodSizeInMillisecondsIn   = pDescriptorCapture->periodSizeInMilliseconds;\n        data.periodsIn                    = pDescriptorCapture->periodCount;\n        data.shareMode                    = pDescriptorCapture->shareMode;\n        data.performanceProfile           = pConfig->performanceProfile;\n        data.registerStopEvent            = MA_TRUE;\n\n        /* Need at least 3 periods for duplex. */\n        if (data.periodsIn < 3 && pConfig->deviceType == ma_device_type_duplex) {\n            data.periodsIn = 3;\n        }\n\n        result = ma_device_init_internal__coreaudio(pDevice->pContext, ma_device_type_capture, pDescriptorCapture->pDeviceID, &data, (void*)pDevice);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pDevice->coreaudio.isDefaultCaptureDevice           = (pConfig->capture.pDeviceID == NULL);\n    #if defined(MA_APPLE_DESKTOP)\n        pDevice->coreaudio.deviceObjectIDCapture            = (ma_uint32)data.deviceObjectID;\n    #endif\n        pDevice->coreaudio.audioUnitCapture                 = (ma_ptr)data.audioUnit;\n        pDevice->coreaudio.pAudioBufferList                 = (ma_ptr)data.pAudioBufferList;\n        pDevice->coreaudio.audioBufferCapInFrames           = data.periodSizeInFramesOut;\n        pDevice->coreaudio.originalPeriodSizeInFrames       = pDescriptorCapture->periodSizeInFrames;\n        pDevice->coreaudio.originalPeriodSizeInMilliseconds = pDescriptorCapture->periodSizeInMilliseconds;\n        pDevice->coreaudio.originalPeriods                  = pDescriptorCapture->periodCount;\n        pDevice->coreaudio.originalPerformanceProfile       = pConfig->performanceProfile;\n\n        pDescriptorCapture->format                          = data.formatOut;\n        pDescriptorCapture->channels                        = data.channelsOut;\n        pDescriptorCapture->sampleRate                      = data.sampleRateOut;\n        MA_COPY_MEMORY(pDescriptorCapture->channelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDescriptorCapture->periodSizeInFrames              = data.periodSizeInFramesOut;\n        pDescriptorCapture->periodCount                     = data.periodsOut;\n\n    #if defined(MA_APPLE_DESKTOP)\n        ma_get_AudioObject_uid(pDevice->pContext, pDevice->coreaudio.deviceObjectIDCapture, sizeof(pDevice->capture.id.coreaudio), pDevice->capture.id.coreaudio);\n\n        /*\n        If we are using the default device we'll need to listen for changes to the system's default device so we can seemlessly\n        switch the device in the background.\n        */\n        if (pConfig->capture.pDeviceID == NULL) {\n            ma_device__track__coreaudio(pDevice);\n        }\n    #endif\n    }\n\n    /* Playback. */\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_device_init_internal_data__coreaudio data;\n        data.allowNominalSampleRateChange   = pConfig->coreaudio.allowNominalSampleRateChange;\n        data.formatIn                       = pDescriptorPlayback->format;\n        data.channelsIn                     = pDescriptorPlayback->channels;\n        data.sampleRateIn                   = pDescriptorPlayback->sampleRate;\n        MA_COPY_MEMORY(data.channelMapIn, pDescriptorPlayback->channelMap, sizeof(pDescriptorPlayback->channelMap));\n        data.shareMode                      = pDescriptorPlayback->shareMode;\n        data.performanceProfile             = pConfig->performanceProfile;\n\n        /* In full-duplex mode we want the playback buffer to be the same size as the capture buffer. */\n        if (pConfig->deviceType == ma_device_type_duplex) {\n            data.periodSizeInFramesIn       = pDescriptorCapture->periodSizeInFrames;\n            data.periodsIn                  = pDescriptorCapture->periodCount;\n            data.registerStopEvent          = MA_FALSE;\n        } else {\n            data.periodSizeInFramesIn       = pDescriptorPlayback->periodSizeInFrames;\n            data.periodSizeInMillisecondsIn = pDescriptorPlayback->periodSizeInMilliseconds;\n            data.periodsIn                  = pDescriptorPlayback->periodCount;\n            data.registerStopEvent          = MA_TRUE;\n        }\n\n        result = ma_device_init_internal__coreaudio(pDevice->pContext, ma_device_type_playback, pDescriptorPlayback->pDeviceID, &data, (void*)pDevice);\n        if (result != MA_SUCCESS) {\n            if (pConfig->deviceType == ma_device_type_duplex) {\n                ((ma_AudioComponentInstanceDispose_proc)pDevice->pContext->coreaudio.AudioComponentInstanceDispose)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n                if (pDevice->coreaudio.pAudioBufferList) {\n                    ma_free(pDevice->coreaudio.pAudioBufferList, &pDevice->pContext->allocationCallbacks);\n                }\n            }\n            return result;\n        }\n\n        pDevice->coreaudio.isDefaultPlaybackDevice          = (pConfig->playback.pDeviceID == NULL);\n    #if defined(MA_APPLE_DESKTOP)\n        pDevice->coreaudio.deviceObjectIDPlayback           = (ma_uint32)data.deviceObjectID;\n    #endif\n        pDevice->coreaudio.audioUnitPlayback                = (ma_ptr)data.audioUnit;\n        pDevice->coreaudio.originalPeriodSizeInFrames       = pDescriptorPlayback->periodSizeInFrames;\n        pDevice->coreaudio.originalPeriodSizeInMilliseconds = pDescriptorPlayback->periodSizeInMilliseconds;\n        pDevice->coreaudio.originalPeriods                  = pDescriptorPlayback->periodCount;\n        pDevice->coreaudio.originalPerformanceProfile       = pConfig->performanceProfile;\n\n        pDescriptorPlayback->format                         = data.formatOut;\n        pDescriptorPlayback->channels                       = data.channelsOut;\n        pDescriptorPlayback->sampleRate                     = data.sampleRateOut;\n        MA_COPY_MEMORY(pDescriptorPlayback->channelMap, data.channelMapOut, sizeof(data.channelMapOut));\n        pDescriptorPlayback->periodSizeInFrames             = data.periodSizeInFramesOut;\n        pDescriptorPlayback->periodCount                    = data.periodsOut;\n\n    #if defined(MA_APPLE_DESKTOP)\n        ma_get_AudioObject_uid(pDevice->pContext, pDevice->coreaudio.deviceObjectIDPlayback, sizeof(pDevice->playback.id.coreaudio), pDevice->playback.id.coreaudio);\n\n        /*\n        If we are using the default device we'll need to listen for changes to the system's default device so we can seemlessly\n        switch the device in the background.\n        */\n        if (pDescriptorPlayback->pDeviceID == NULL && (pConfig->deviceType != ma_device_type_duplex || pDescriptorCapture->pDeviceID != NULL)) {\n            ma_device__track__coreaudio(pDevice);\n        }\n    #endif\n    }\n\n\n\n    /*\n    When stopping the device, a callback is called on another thread. We need to wait for this callback\n    before returning from ma_device_stop(). This event is used for this.\n    */\n    ma_event_init(&pDevice->coreaudio.stopEvent);\n\n    /*\n    We need to detect when a route has changed so we can update the data conversion pipeline accordingly. This is done\n    differently on non-Desktop Apple platforms.\n    */\n#if defined(MA_APPLE_MOBILE)\n    pDevice->coreaudio.pNotificationHandler = (MA_BRIDGE_RETAINED void*)[[ma_ios_notification_handler alloc] init:pDevice];\n#endif\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_device_start__coreaudio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        OSStatus status = ((ma_AudioOutputUnitStart_proc)pDevice->pContext->coreaudio.AudioOutputUnitStart)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n        if (status != noErr) {\n            return ma_result_from_OSStatus(status);\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        OSStatus status = ((ma_AudioOutputUnitStart_proc)pDevice->pContext->coreaudio.AudioOutputUnitStart)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n        if (status != noErr) {\n            if (pDevice->type == ma_device_type_duplex) {\n                ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n            }\n            return ma_result_from_OSStatus(status);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop__coreaudio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    /* It's not clear from the documentation whether or not AudioOutputUnitStop() actually drains the device or not. */\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        OSStatus status = ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitCapture);\n        if (status != noErr) {\n            return ma_result_from_OSStatus(status);\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        OSStatus status = ((ma_AudioOutputUnitStop_proc)pDevice->pContext->coreaudio.AudioOutputUnitStop)((AudioUnit)pDevice->coreaudio.audioUnitPlayback);\n        if (status != noErr) {\n            return ma_result_from_OSStatus(status);\n        }\n    }\n\n    /* We need to wait for the callback to finish before returning. */\n    ma_event_wait(&pDevice->coreaudio.stopEvent);\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_context_uninit__coreaudio(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_coreaudio);\n\n#if defined(MA_APPLE_MOBILE)\n    if (!pContext->coreaudio.noAudioSessionDeactivate) {\n        if (![[AVAudioSession sharedInstance] setActive:false error:nil]) {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"Failed to deactivate audio session.\");\n            return MA_FAILED_TO_INIT_BACKEND;\n        }\n    }\n#endif\n\n#if !defined(MA_NO_RUNTIME_LINKING) && !defined(MA_APPLE_MOBILE)\n    ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit);\n    ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hCoreAudio);\n    ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hCoreFoundation);\n#endif\n\n#if !defined(MA_APPLE_MOBILE)\n    ma_context__uninit_device_tracking__coreaudio(pContext);\n#endif\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\n#if defined(MA_APPLE_MOBILE) && defined(__IPHONE_12_0)\nstatic AVAudioSessionCategory ma_to_AVAudioSessionCategory(ma_ios_session_category category)\n{\n    /* The \"default\" and \"none\" categories are treated different and should not be used as an input into this function. */\n    MA_ASSERT(category != ma_ios_session_category_default);\n    MA_ASSERT(category != ma_ios_session_category_none);\n\n    switch (category) {\n        case ma_ios_session_category_ambient:         return AVAudioSessionCategoryAmbient;\n        case ma_ios_session_category_solo_ambient:    return AVAudioSessionCategorySoloAmbient;\n        case ma_ios_session_category_playback:        return AVAudioSessionCategoryPlayback;\n        case ma_ios_session_category_record:          return AVAudioSessionCategoryRecord;\n        case ma_ios_session_category_play_and_record: return AVAudioSessionCategoryPlayAndRecord;\n        case ma_ios_session_category_multi_route:     return AVAudioSessionCategoryMultiRoute;\n        case ma_ios_session_category_none:            return AVAudioSessionCategoryAmbient;\n        case ma_ios_session_category_default:         return AVAudioSessionCategoryAmbient;\n        default:                                      return AVAudioSessionCategoryAmbient;\n    }\n}\n#endif\n\nstatic ma_result ma_context_init__coreaudio(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n#if !defined(MA_APPLE_MOBILE)\n    ma_result result;\n#endif\n\n    MA_ASSERT(pConfig != NULL);\n    MA_ASSERT(pContext != NULL);\n\n#if defined(MA_APPLE_MOBILE)\n    @autoreleasepool {\n        AVAudioSession* pAudioSession = [AVAudioSession sharedInstance];\n        AVAudioSessionCategoryOptions options = pConfig->coreaudio.sessionCategoryOptions;\n\n        MA_ASSERT(pAudioSession != NULL);\n\n        if (pConfig->coreaudio.sessionCategory == ma_ios_session_category_default) {\n            /*\n            I'm going to use trial and error to determine our default session category. First we'll try PlayAndRecord. If that fails\n            we'll try Playback and if that fails we'll try record. If all of these fail we'll just not set the category.\n            */\n        #if !defined(MA_APPLE_TV) && !defined(MA_APPLE_WATCH)\n            options |= AVAudioSessionCategoryOptionDefaultToSpeaker;\n        #endif\n\n            if ([pAudioSession setCategory: AVAudioSessionCategoryPlayAndRecord withOptions:options error:nil]) {\n                /* Using PlayAndRecord */\n            } else if ([pAudioSession setCategory: AVAudioSessionCategoryPlayback withOptions:options error:nil]) {\n                /* Using Playback */\n            } else if ([pAudioSession setCategory: AVAudioSessionCategoryRecord withOptions:options error:nil]) {\n                /* Using Record */\n            } else {\n                /* Leave as default? */\n            }\n        } else {\n            if (pConfig->coreaudio.sessionCategory != ma_ios_session_category_none) {\n            #if defined(__IPHONE_12_0)\n                if (![pAudioSession setCategory: ma_to_AVAudioSessionCategory(pConfig->coreaudio.sessionCategory) withOptions:options error:nil]) {\n                    return MA_INVALID_OPERATION;    /* Failed to set session category. */\n                }\n            #else\n                /* Ignore the session category on version 11 and older, but post a warning. */\n                ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, \"Session category only supported in iOS 12 and newer.\");\n            #endif\n            }\n        }\n\n        if (!pConfig->coreaudio.noAudioSessionActivate) {\n            if (![pAudioSession setActive:true error:nil]) {\n                ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"Failed to activate audio session.\");\n                return MA_FAILED_TO_INIT_BACKEND;\n            }\n        }\n    }\n#endif\n\n#if !defined(MA_NO_RUNTIME_LINKING) && !defined(MA_APPLE_MOBILE)\n    pContext->coreaudio.hCoreFoundation = ma_dlopen(ma_context_get_log(pContext), \"/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation\");\n    if (pContext->coreaudio.hCoreFoundation == NULL) {\n        return MA_API_NOT_FOUND;\n    }\n\n    pContext->coreaudio.CFStringGetCString = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hCoreFoundation, \"CFStringGetCString\");\n    pContext->coreaudio.CFRelease          = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hCoreFoundation, \"CFRelease\");\n\n\n    pContext->coreaudio.hCoreAudio = ma_dlopen(ma_context_get_log(pContext), \"/System/Library/Frameworks/CoreAudio.framework/CoreAudio\");\n    if (pContext->coreaudio.hCoreAudio == NULL) {\n        ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hCoreFoundation);\n        return MA_API_NOT_FOUND;\n    }\n\n    pContext->coreaudio.AudioObjectGetPropertyData        = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hCoreAudio, \"AudioObjectGetPropertyData\");\n    pContext->coreaudio.AudioObjectGetPropertyDataSize    = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hCoreAudio, \"AudioObjectGetPropertyDataSize\");\n    pContext->coreaudio.AudioObjectSetPropertyData        = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hCoreAudio, \"AudioObjectSetPropertyData\");\n    pContext->coreaudio.AudioObjectAddPropertyListener    = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hCoreAudio, \"AudioObjectAddPropertyListener\");\n    pContext->coreaudio.AudioObjectRemovePropertyListener = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hCoreAudio, \"AudioObjectRemovePropertyListener\");\n\n    /*\n    It looks like Apple has moved some APIs from AudioUnit into AudioToolbox on more recent versions of macOS. They are still\n    defined in AudioUnit, but just in case they decide to remove them from there entirely I'm going to implement a fallback.\n    The way it'll work is that it'll first try AudioUnit, and if the required symbols are not present there we'll fall back to\n    AudioToolbox.\n    */\n    pContext->coreaudio.hAudioUnit = ma_dlopen(ma_context_get_log(pContext), \"/System/Library/Frameworks/AudioUnit.framework/AudioUnit\");\n    if (pContext->coreaudio.hAudioUnit == NULL) {\n        ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hCoreAudio);\n        ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hCoreFoundation);\n        return MA_API_NOT_FOUND;\n    }\n\n    if (ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit, \"AudioComponentFindNext\") == NULL) {\n        /* Couldn't find the required symbols in AudioUnit, so fall back to AudioToolbox. */\n        ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit);\n        pContext->coreaudio.hAudioUnit = ma_dlopen(ma_context_get_log(pContext), \"/System/Library/Frameworks/AudioToolbox.framework/AudioToolbox\");\n        if (pContext->coreaudio.hAudioUnit == NULL) {\n            ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hCoreAudio);\n            ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hCoreFoundation);\n            return MA_API_NOT_FOUND;\n        }\n    }\n\n    pContext->coreaudio.AudioComponentFindNext            = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit, \"AudioComponentFindNext\");\n    pContext->coreaudio.AudioComponentInstanceDispose     = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit, \"AudioComponentInstanceDispose\");\n    pContext->coreaudio.AudioComponentInstanceNew         = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit, \"AudioComponentInstanceNew\");\n    pContext->coreaudio.AudioOutputUnitStart              = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit, \"AudioOutputUnitStart\");\n    pContext->coreaudio.AudioOutputUnitStop               = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit, \"AudioOutputUnitStop\");\n    pContext->coreaudio.AudioUnitAddPropertyListener      = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit, \"AudioUnitAddPropertyListener\");\n    pContext->coreaudio.AudioUnitGetPropertyInfo          = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit, \"AudioUnitGetPropertyInfo\");\n    pContext->coreaudio.AudioUnitGetProperty              = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit, \"AudioUnitGetProperty\");\n    pContext->coreaudio.AudioUnitSetProperty              = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit, \"AudioUnitSetProperty\");\n    pContext->coreaudio.AudioUnitInitialize               = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit, \"AudioUnitInitialize\");\n    pContext->coreaudio.AudioUnitRender                   = ma_dlsym(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit, \"AudioUnitRender\");\n#else\n    pContext->coreaudio.CFStringGetCString                = (ma_proc)CFStringGetCString;\n    pContext->coreaudio.CFRelease                         = (ma_proc)CFRelease;\n\n    #if defined(MA_APPLE_DESKTOP)\n    pContext->coreaudio.AudioObjectGetPropertyData        = (ma_proc)AudioObjectGetPropertyData;\n    pContext->coreaudio.AudioObjectGetPropertyDataSize    = (ma_proc)AudioObjectGetPropertyDataSize;\n    pContext->coreaudio.AudioObjectSetPropertyData        = (ma_proc)AudioObjectSetPropertyData;\n    pContext->coreaudio.AudioObjectAddPropertyListener    = (ma_proc)AudioObjectAddPropertyListener;\n    pContext->coreaudio.AudioObjectRemovePropertyListener = (ma_proc)AudioObjectRemovePropertyListener;\n    #endif\n\n    pContext->coreaudio.AudioComponentFindNext            = (ma_proc)AudioComponentFindNext;\n    pContext->coreaudio.AudioComponentInstanceDispose     = (ma_proc)AudioComponentInstanceDispose;\n    pContext->coreaudio.AudioComponentInstanceNew         = (ma_proc)AudioComponentInstanceNew;\n    pContext->coreaudio.AudioOutputUnitStart              = (ma_proc)AudioOutputUnitStart;\n    pContext->coreaudio.AudioOutputUnitStop               = (ma_proc)AudioOutputUnitStop;\n    pContext->coreaudio.AudioUnitAddPropertyListener      = (ma_proc)AudioUnitAddPropertyListener;\n    pContext->coreaudio.AudioUnitGetPropertyInfo          = (ma_proc)AudioUnitGetPropertyInfo;\n    pContext->coreaudio.AudioUnitGetProperty              = (ma_proc)AudioUnitGetProperty;\n    pContext->coreaudio.AudioUnitSetProperty              = (ma_proc)AudioUnitSetProperty;\n    pContext->coreaudio.AudioUnitInitialize               = (ma_proc)AudioUnitInitialize;\n    pContext->coreaudio.AudioUnitRender                   = (ma_proc)AudioUnitRender;\n#endif\n\n    /* Audio component. */\n    {\n        AudioComponentDescription desc;\n        desc.componentType         = kAudioUnitType_Output;\n    #if defined(MA_APPLE_DESKTOP)\n        desc.componentSubType      = kAudioUnitSubType_HALOutput;\n    #else\n        desc.componentSubType      = kAudioUnitSubType_RemoteIO;\n    #endif\n        desc.componentManufacturer = kAudioUnitManufacturer_Apple;\n        desc.componentFlags        = 0;\n        desc.componentFlagsMask    = 0;\n\n        pContext->coreaudio.component = ((ma_AudioComponentFindNext_proc)pContext->coreaudio.AudioComponentFindNext)(NULL, &desc);\n        if (pContext->coreaudio.component == NULL) {\n        #if !defined(MA_NO_RUNTIME_LINKING) && !defined(MA_APPLE_MOBILE)\n            ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit);\n            ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hCoreAudio);\n            ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hCoreFoundation);\n        #endif\n            return MA_FAILED_TO_INIT_BACKEND;\n        }\n    }\n\n#if !defined(MA_APPLE_MOBILE)\n    result = ma_context__init_device_tracking__coreaudio(pContext);\n    if (result != MA_SUCCESS) {\n    #if !defined(MA_NO_RUNTIME_LINKING) && !defined(MA_APPLE_MOBILE)\n        ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hAudioUnit);\n        ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hCoreAudio);\n        ma_dlclose(ma_context_get_log(pContext), pContext->coreaudio.hCoreFoundation);\n    #endif\n        return result;\n    }\n#endif\n\n    pContext->coreaudio.noAudioSessionDeactivate = pConfig->coreaudio.noAudioSessionDeactivate;\n\n    pCallbacks->onContextInit             = ma_context_init__coreaudio;\n    pCallbacks->onContextUninit           = ma_context_uninit__coreaudio;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__coreaudio;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__coreaudio;\n    pCallbacks->onDeviceInit              = ma_device_init__coreaudio;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__coreaudio;\n    pCallbacks->onDeviceStart             = ma_device_start__coreaudio;\n    pCallbacks->onDeviceStop              = ma_device_stop__coreaudio;\n    pCallbacks->onDeviceRead              = NULL;\n    pCallbacks->onDeviceWrite             = NULL;\n    pCallbacks->onDeviceDataLoop          = NULL;\n\n    return MA_SUCCESS;\n}\n#endif  /* Core Audio */\n\n\n\n/******************************************************************************\n\nsndio Backend\n\n******************************************************************************/\n#ifdef MA_HAS_SNDIO\n#include <fcntl.h>\n\n/*\nOnly supporting OpenBSD. This did not work very well at all on FreeBSD when I tried it. Not sure if this is due\nto miniaudio's implementation or if it's some kind of system configuration issue, but basically the default device\njust doesn't emit any sound, or at times you'll hear tiny pieces. I will consider enabling this when there's\ndemand for it or if I can get it tested and debugged more thoroughly.\n*/\n#if 0\n#if defined(__NetBSD__) || defined(__OpenBSD__)\n#include <sys/audioio.h>\n#endif\n#if defined(__FreeBSD__) || defined(__DragonFly__)\n#include <sys/soundcard.h>\n#endif\n#endif\n\n#define MA_SIO_DEVANY   \"default\"\n#define MA_SIO_PLAY     1\n#define MA_SIO_REC      2\n#define MA_SIO_NENC     8\n#define MA_SIO_NCHAN    8\n#define MA_SIO_NRATE    16\n#define MA_SIO_NCONF    4\n\nstruct ma_sio_hdl; /* <-- Opaque */\n\nstruct ma_sio_par\n{\n    unsigned int bits;\n    unsigned int bps;\n    unsigned int sig;\n    unsigned int le;\n    unsigned int msb;\n    unsigned int rchan;\n    unsigned int pchan;\n    unsigned int rate;\n    unsigned int bufsz;\n    unsigned int xrun;\n    unsigned int round;\n    unsigned int appbufsz;\n    int __pad[3];\n    unsigned int __magic;\n};\n\nstruct ma_sio_enc\n{\n    unsigned int bits;\n    unsigned int bps;\n    unsigned int sig;\n    unsigned int le;\n    unsigned int msb;\n};\n\nstruct ma_sio_conf\n{\n    unsigned int enc;\n    unsigned int rchan;\n    unsigned int pchan;\n    unsigned int rate;\n};\n\nstruct ma_sio_cap\n{\n    struct ma_sio_enc enc[MA_SIO_NENC];\n    unsigned int rchan[MA_SIO_NCHAN];\n    unsigned int pchan[MA_SIO_NCHAN];\n    unsigned int rate[MA_SIO_NRATE];\n    int __pad[7];\n    unsigned int nconf;\n    struct ma_sio_conf confs[MA_SIO_NCONF];\n};\n\ntypedef struct ma_sio_hdl* (* ma_sio_open_proc)   (const char*, unsigned int, int);\ntypedef void               (* ma_sio_close_proc)  (struct ma_sio_hdl*);\ntypedef int                (* ma_sio_setpar_proc) (struct ma_sio_hdl*, struct ma_sio_par*);\ntypedef int                (* ma_sio_getpar_proc) (struct ma_sio_hdl*, struct ma_sio_par*);\ntypedef int                (* ma_sio_getcap_proc) (struct ma_sio_hdl*, struct ma_sio_cap*);\ntypedef size_t             (* ma_sio_write_proc)  (struct ma_sio_hdl*, const void*, size_t);\ntypedef size_t             (* ma_sio_read_proc)   (struct ma_sio_hdl*, void*, size_t);\ntypedef int                (* ma_sio_start_proc)  (struct ma_sio_hdl*);\ntypedef int                (* ma_sio_stop_proc)   (struct ma_sio_hdl*);\ntypedef int                (* ma_sio_initpar_proc)(struct ma_sio_par*);\n\nstatic ma_uint32 ma_get_standard_sample_rate_priority_index__sndio(ma_uint32 sampleRate)   /* Lower = higher priority */\n{\n    ma_uint32 i;\n    for (i = 0; i < ma_countof(g_maStandardSampleRatePriorities); ++i) {\n        if (g_maStandardSampleRatePriorities[i] == sampleRate) {\n            return i;\n        }\n    }\n\n    return (ma_uint32)-1;\n}\n\nstatic ma_format ma_format_from_sio_enc__sndio(unsigned int bits, unsigned int bps, unsigned int sig, unsigned int le, unsigned int msb)\n{\n    /* We only support native-endian right now. */\n    if ((ma_is_little_endian() && le == 0) || (ma_is_big_endian() && le == 1)) {\n        return ma_format_unknown;\n    }\n\n    if (bits ==  8 && bps == 1 && sig == 0) {\n        return ma_format_u8;\n    }\n    if (bits == 16 && bps == 2 && sig == 1) {\n        return ma_format_s16;\n    }\n    if (bits == 24 && bps == 3 && sig == 1) {\n        return ma_format_s24;\n    }\n    if (bits == 24 && bps == 4 && sig == 1 && msb == 0) {\n        /*return ma_format_s24_32;*/\n    }\n    if (bits == 32 && bps == 4 && sig == 1) {\n        return ma_format_s32;\n    }\n\n    return ma_format_unknown;\n}\n\nstatic ma_format ma_find_best_format_from_sio_cap__sndio(struct ma_sio_cap* caps)\n{\n    ma_format bestFormat;\n    unsigned int iConfig;\n\n    MA_ASSERT(caps != NULL);\n\n    bestFormat = ma_format_unknown;\n    for (iConfig = 0; iConfig < caps->nconf; iConfig += 1) {\n        unsigned int iEncoding;\n        for (iEncoding = 0; iEncoding < MA_SIO_NENC; iEncoding += 1) {\n            unsigned int bits;\n            unsigned int bps;\n            unsigned int sig;\n            unsigned int le;\n            unsigned int msb;\n            ma_format format;\n\n            if ((caps->confs[iConfig].enc & (1UL << iEncoding)) == 0) {\n                continue;\n            }\n\n            bits = caps->enc[iEncoding].bits;\n            bps  = caps->enc[iEncoding].bps;\n            sig  = caps->enc[iEncoding].sig;\n            le   = caps->enc[iEncoding].le;\n            msb  = caps->enc[iEncoding].msb;\n            format = ma_format_from_sio_enc__sndio(bits, bps, sig, le, msb);\n            if (format == ma_format_unknown) {\n                continue;   /* Format not supported. */\n            }\n\n            if (bestFormat == ma_format_unknown) {\n                bestFormat = format;\n            } else {\n                if (ma_get_format_priority_index(bestFormat) > ma_get_format_priority_index(format)) {    /* <-- Lower = better. */\n                    bestFormat = format;\n                }\n            }\n        }\n    }\n\n    return bestFormat;\n}\n\nstatic ma_uint32 ma_find_best_channels_from_sio_cap__sndio(struct ma_sio_cap* caps, ma_device_type deviceType, ma_format requiredFormat)\n{\n    ma_uint32 maxChannels;\n    unsigned int iConfig;\n\n    MA_ASSERT(caps != NULL);\n    MA_ASSERT(requiredFormat != ma_format_unknown);\n\n    /* Just pick whatever configuration has the most channels. */\n    maxChannels = 0;\n    for (iConfig = 0; iConfig < caps->nconf; iConfig += 1) {\n        /* The encoding should be of requiredFormat. */\n        unsigned int iEncoding;\n        for (iEncoding = 0; iEncoding < MA_SIO_NENC; iEncoding += 1) {\n            unsigned int iChannel;\n            unsigned int bits;\n            unsigned int bps;\n            unsigned int sig;\n            unsigned int le;\n            unsigned int msb;\n            ma_format format;\n\n            if ((caps->confs[iConfig].enc & (1UL << iEncoding)) == 0) {\n                continue;\n            }\n\n            bits = caps->enc[iEncoding].bits;\n            bps  = caps->enc[iEncoding].bps;\n            sig  = caps->enc[iEncoding].sig;\n            le   = caps->enc[iEncoding].le;\n            msb  = caps->enc[iEncoding].msb;\n            format = ma_format_from_sio_enc__sndio(bits, bps, sig, le, msb);\n            if (format != requiredFormat) {\n                continue;\n            }\n\n            /* Getting here means the format is supported. Iterate over each channel count and grab the biggest one. */\n            for (iChannel = 0; iChannel < MA_SIO_NCHAN; iChannel += 1) {\n                unsigned int chan = 0;\n                unsigned int channels;\n\n                if (deviceType == ma_device_type_playback) {\n                    chan = caps->confs[iConfig].pchan;\n                } else {\n                    chan = caps->confs[iConfig].rchan;\n                }\n\n                if ((chan & (1UL << iChannel)) == 0) {\n                    continue;\n                }\n\n                if (deviceType == ma_device_type_playback) {\n                    channels = caps->pchan[iChannel];\n                } else {\n                    channels = caps->rchan[iChannel];\n                }\n\n                if (maxChannels < channels) {\n                    maxChannels = channels;\n                }\n            }\n        }\n    }\n\n    return maxChannels;\n}\n\nstatic ma_uint32 ma_find_best_sample_rate_from_sio_cap__sndio(struct ma_sio_cap* caps, ma_device_type deviceType, ma_format requiredFormat, ma_uint32 requiredChannels)\n{\n    ma_uint32 firstSampleRate;\n    ma_uint32 bestSampleRate;\n    unsigned int iConfig;\n\n    MA_ASSERT(caps != NULL);\n    MA_ASSERT(requiredFormat != ma_format_unknown);\n    MA_ASSERT(requiredChannels > 0);\n    MA_ASSERT(requiredChannels <= MA_MAX_CHANNELS);\n\n    firstSampleRate = 0; /* <-- If the device does not support a standard rate we'll fall back to the first one that's found. */\n    bestSampleRate  = 0;\n\n    for (iConfig = 0; iConfig < caps->nconf; iConfig += 1) {\n        /* The encoding should be of requiredFormat. */\n        unsigned int iEncoding;\n        for (iEncoding = 0; iEncoding < MA_SIO_NENC; iEncoding += 1) {\n            unsigned int iChannel;\n            unsigned int bits;\n            unsigned int bps;\n            unsigned int sig;\n            unsigned int le;\n            unsigned int msb;\n            ma_format format;\n\n            if ((caps->confs[iConfig].enc & (1UL << iEncoding)) == 0) {\n                continue;\n            }\n\n            bits = caps->enc[iEncoding].bits;\n            bps  = caps->enc[iEncoding].bps;\n            sig  = caps->enc[iEncoding].sig;\n            le   = caps->enc[iEncoding].le;\n            msb  = caps->enc[iEncoding].msb;\n            format = ma_format_from_sio_enc__sndio(bits, bps, sig, le, msb);\n            if (format != requiredFormat) {\n                continue;\n            }\n\n            /* Getting here means the format is supported. Iterate over each channel count and grab the biggest one. */\n            for (iChannel = 0; iChannel < MA_SIO_NCHAN; iChannel += 1) {\n                unsigned int chan = 0;\n                unsigned int channels;\n                unsigned int iRate;\n\n                if (deviceType == ma_device_type_playback) {\n                    chan = caps->confs[iConfig].pchan;\n                } else {\n                    chan = caps->confs[iConfig].rchan;\n                }\n\n                if ((chan & (1UL << iChannel)) == 0) {\n                    continue;\n                }\n\n                if (deviceType == ma_device_type_playback) {\n                    channels = caps->pchan[iChannel];\n                } else {\n                    channels = caps->rchan[iChannel];\n                }\n\n                if (channels != requiredChannels) {\n                    continue;\n                }\n\n                /* Getting here means we have found a compatible encoding/channel pair. */\n                for (iRate = 0; iRate < MA_SIO_NRATE; iRate += 1) {\n                    ma_uint32 rate = (ma_uint32)caps->rate[iRate];\n                    ma_uint32 ratePriority;\n\n                    if (firstSampleRate == 0) {\n                        firstSampleRate = rate;\n                    }\n\n                    /* Disregard this rate if it's not a standard one. */\n                    ratePriority = ma_get_standard_sample_rate_priority_index__sndio(rate);\n                    if (ratePriority == (ma_uint32)-1) {\n                        continue;\n                    }\n\n                    if (ma_get_standard_sample_rate_priority_index__sndio(bestSampleRate) > ratePriority) {   /* Lower = better. */\n                        bestSampleRate = rate;\n                    }\n                }\n            }\n        }\n    }\n\n    /* If a standard sample rate was not found just fall back to the first one that was iterated. */\n    if (bestSampleRate == 0) {\n        bestSampleRate = firstSampleRate;\n    }\n\n    return bestSampleRate;\n}\n\n\nstatic ma_result ma_context_enumerate_devices__sndio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_bool32 isTerminating = MA_FALSE;\n    struct ma_sio_hdl* handle;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(callback != NULL);\n\n    /* sndio doesn't seem to have a good device enumeration API, so I'm therefore only enumerating over default devices for now. */\n\n    /* Playback. */\n    if (!isTerminating) {\n        handle = ((ma_sio_open_proc)pContext->sndio.sio_open)(MA_SIO_DEVANY, MA_SIO_PLAY, 0);\n        if (handle != NULL) {\n            /* Supports playback. */\n            ma_device_info deviceInfo;\n            MA_ZERO_OBJECT(&deviceInfo);\n            ma_strcpy_s(deviceInfo.id.sndio, sizeof(deviceInfo.id.sndio), MA_SIO_DEVANY);\n            ma_strcpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME);\n\n            isTerminating = !callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n\n            ((ma_sio_close_proc)pContext->sndio.sio_close)(handle);\n        }\n    }\n\n    /* Capture. */\n    if (!isTerminating) {\n        handle = ((ma_sio_open_proc)pContext->sndio.sio_open)(MA_SIO_DEVANY, MA_SIO_REC, 0);\n        if (handle != NULL) {\n            /* Supports capture. */\n            ma_device_info deviceInfo;\n            MA_ZERO_OBJECT(&deviceInfo);\n            ma_strcpy_s(deviceInfo.id.sndio, sizeof(deviceInfo.id.sndio), \"default\");\n            ma_strcpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME);\n\n            isTerminating = !callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n\n            ((ma_sio_close_proc)pContext->sndio.sio_close)(handle);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_get_device_info__sndio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    char devid[256];\n    struct ma_sio_hdl* handle;\n    struct ma_sio_cap caps;\n    unsigned int iConfig;\n\n    MA_ASSERT(pContext != NULL);\n\n    /* We need to open the device before we can get information about it. */\n    if (pDeviceID == NULL) {\n        ma_strcpy_s(devid, sizeof(devid), MA_SIO_DEVANY);\n        ma_strcpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), (deviceType == ma_device_type_playback) ? MA_DEFAULT_PLAYBACK_DEVICE_NAME : MA_DEFAULT_CAPTURE_DEVICE_NAME);\n    } else {\n        ma_strcpy_s(devid, sizeof(devid), pDeviceID->sndio);\n        ma_strcpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), devid);\n    }\n\n    handle = ((ma_sio_open_proc)pContext->sndio.sio_open)(devid, (deviceType == ma_device_type_playback) ? MA_SIO_PLAY : MA_SIO_REC, 0);\n    if (handle == NULL) {\n        return MA_NO_DEVICE;\n    }\n\n    if (((ma_sio_getcap_proc)pContext->sndio.sio_getcap)(handle, &caps) == 0) {\n        return MA_ERROR;\n    }\n\n    pDeviceInfo->nativeDataFormatCount = 0;\n\n    for (iConfig = 0; iConfig < caps.nconf; iConfig += 1) {\n        /*\n        The main thing we care about is that the encoding is supported by miniaudio. If it is, we want to give\n        preference to some formats over others.\n        */\n        unsigned int iEncoding;\n        unsigned int iChannel;\n        unsigned int iRate;\n\n        for (iEncoding = 0; iEncoding < MA_SIO_NENC; iEncoding += 1) {\n            unsigned int bits;\n            unsigned int bps;\n            unsigned int sig;\n            unsigned int le;\n            unsigned int msb;\n            ma_format format;\n\n            if ((caps.confs[iConfig].enc & (1UL << iEncoding)) == 0) {\n                continue;\n            }\n\n            bits = caps.enc[iEncoding].bits;\n            bps  = caps.enc[iEncoding].bps;\n            sig  = caps.enc[iEncoding].sig;\n            le   = caps.enc[iEncoding].le;\n            msb  = caps.enc[iEncoding].msb;\n            format = ma_format_from_sio_enc__sndio(bits, bps, sig, le, msb);\n            if (format == ma_format_unknown) {\n                continue;   /* Format not supported. */\n            }\n\n\n            /* Channels. */\n            for (iChannel = 0; iChannel < MA_SIO_NCHAN; iChannel += 1) {\n                unsigned int chan = 0;\n                unsigned int channels;\n\n                if (deviceType == ma_device_type_playback) {\n                    chan = caps.confs[iConfig].pchan;\n                } else {\n                    chan = caps.confs[iConfig].rchan;\n                }\n\n                if ((chan & (1UL << iChannel)) == 0) {\n                    continue;\n                }\n\n                if (deviceType == ma_device_type_playback) {\n                    channels = caps.pchan[iChannel];\n                } else {\n                    channels = caps.rchan[iChannel];\n                }\n\n\n                /* Sample Rates. */\n                for (iRate = 0; iRate < MA_SIO_NRATE; iRate += 1) {\n                    if ((caps.confs[iConfig].rate & (1UL << iRate)) != 0) {\n                        ma_device_info_add_native_data_format(pDeviceInfo, format, channels, caps.rate[iRate], 0);\n                    }\n                }\n            }\n        }\n    }\n\n    ((ma_sio_close_proc)pContext->sndio.sio_close)(handle);\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_uninit__sndio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ((ma_sio_close_proc)pDevice->pContext->sndio.sio_close)((struct ma_sio_hdl*)pDevice->sndio.handleCapture);\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ((ma_sio_close_proc)pDevice->pContext->sndio.sio_close)((struct ma_sio_hdl*)pDevice->sndio.handlePlayback);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_init_handle__sndio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptor, ma_device_type deviceType)\n{\n    const char* pDeviceName;\n    ma_ptr handle;\n    int openFlags = 0;\n    struct ma_sio_cap caps;\n    struct ma_sio_par par;\n    const ma_device_id* pDeviceID;\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_format internalFormat;\n    ma_uint32 internalChannels;\n    ma_uint32 internalSampleRate;\n    ma_uint32 internalPeriodSizeInFrames;\n    ma_uint32 internalPeriods;\n\n    MA_ASSERT(pConfig    != NULL);\n    MA_ASSERT(deviceType != ma_device_type_duplex);\n    MA_ASSERT(pDevice    != NULL);\n\n    if (deviceType == ma_device_type_capture) {\n        openFlags = MA_SIO_REC;\n    } else {\n        openFlags = MA_SIO_PLAY;\n    }\n\n    pDeviceID  = pDescriptor->pDeviceID;\n    format     = pDescriptor->format;\n    channels   = pDescriptor->channels;\n    sampleRate = pDescriptor->sampleRate;\n\n    pDeviceName = MA_SIO_DEVANY;\n    if (pDeviceID != NULL) {\n        pDeviceName = pDeviceID->sndio;\n    }\n\n    handle = (ma_ptr)((ma_sio_open_proc)pDevice->pContext->sndio.sio_open)(pDeviceName, openFlags, 0);\n    if (handle == NULL) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[sndio] Failed to open device.\");\n        return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n    }\n\n    /* We need to retrieve the device caps to determine the most appropriate format to use. */\n    if (((ma_sio_getcap_proc)pDevice->pContext->sndio.sio_getcap)((struct ma_sio_hdl*)handle, &caps) == 0) {\n        ((ma_sio_close_proc)pDevice->pContext->sndio.sio_close)((struct ma_sio_hdl*)handle);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[sndio] Failed to retrieve device caps.\");\n        return MA_ERROR;\n    }\n\n    /*\n    Note: sndio reports a huge range of available channels. This is inconvenient for us because there's no real\n    way, as far as I can tell, to get the _actual_ channel count of the device. I'm therefore restricting this\n    to the requested channels, regardless of whether or not the default channel count is requested.\n\n    For hardware devices, I'm suspecting only a single channel count will be reported and we can safely use the\n    value returned by ma_find_best_channels_from_sio_cap__sndio().\n    */\n    if (deviceType == ma_device_type_capture) {\n        if (format == ma_format_unknown) {\n            format = ma_find_best_format_from_sio_cap__sndio(&caps);\n        }\n\n        if (channels == 0) {\n            if (strlen(pDeviceName) > strlen(\"rsnd/\") && strncmp(pDeviceName, \"rsnd/\", strlen(\"rsnd/\")) == 0) {\n                channels = ma_find_best_channels_from_sio_cap__sndio(&caps, deviceType, format);\n            } else {\n                channels = MA_DEFAULT_CHANNELS;\n            }\n        }\n    } else {\n        if (format == ma_format_unknown) {\n            format = ma_find_best_format_from_sio_cap__sndio(&caps);\n        }\n\n        if (channels == 0) {\n            if (strlen(pDeviceName) > strlen(\"rsnd/\") && strncmp(pDeviceName, \"rsnd/\", strlen(\"rsnd/\")) == 0) {\n                channels = ma_find_best_channels_from_sio_cap__sndio(&caps, deviceType, format);\n            } else {\n                channels = MA_DEFAULT_CHANNELS;\n            }\n        }\n    }\n\n    if (sampleRate == 0) {\n        sampleRate = ma_find_best_sample_rate_from_sio_cap__sndio(&caps, pConfig->deviceType, format, channels);\n    }\n\n\n    ((ma_sio_initpar_proc)pDevice->pContext->sndio.sio_initpar)(&par);\n    par.msb = 0;\n    par.le  = ma_is_little_endian();\n\n    switch (format) {\n        case ma_format_u8:\n        {\n            par.bits = 8;\n            par.bps  = 1;\n            par.sig  = 0;\n        } break;\n\n        case ma_format_s24:\n        {\n            par.bits = 24;\n            par.bps  = 3;\n            par.sig  = 1;\n        } break;\n\n        case ma_format_s32:\n        {\n            par.bits = 32;\n            par.bps  = 4;\n            par.sig  = 1;\n        } break;\n\n        case ma_format_s16:\n        case ma_format_f32:\n        case ma_format_unknown:\n        default:\n        {\n            par.bits = 16;\n            par.bps  = 2;\n            par.sig  = 1;\n        } break;\n    }\n\n    if (deviceType == ma_device_type_capture) {\n        par.rchan = channels;\n    } else {\n        par.pchan = channels;\n    }\n\n    par.rate = sampleRate;\n\n    internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, par.rate, pConfig->performanceProfile);\n\n    par.round    = internalPeriodSizeInFrames;\n    par.appbufsz = par.round * pDescriptor->periodCount;\n\n    if (((ma_sio_setpar_proc)pDevice->pContext->sndio.sio_setpar)((struct ma_sio_hdl*)handle, &par) == 0) {\n        ((ma_sio_close_proc)pDevice->pContext->sndio.sio_close)((struct ma_sio_hdl*)handle);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[sndio] Failed to set buffer size.\");\n        return MA_ERROR;\n    }\n\n    if (((ma_sio_getpar_proc)pDevice->pContext->sndio.sio_getpar)((struct ma_sio_hdl*)handle, &par) == 0) {\n        ((ma_sio_close_proc)pDevice->pContext->sndio.sio_close)((struct ma_sio_hdl*)handle);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[sndio] Failed to retrieve buffer size.\");\n        return MA_ERROR;\n    }\n\n    internalFormat             = ma_format_from_sio_enc__sndio(par.bits, par.bps, par.sig, par.le, par.msb);\n    internalChannels           = (deviceType == ma_device_type_capture) ? par.rchan : par.pchan;\n    internalSampleRate         = par.rate;\n    internalPeriods            = par.appbufsz / par.round;\n    internalPeriodSizeInFrames = par.round;\n\n    if (deviceType == ma_device_type_capture) {\n        pDevice->sndio.handleCapture  = handle;\n    } else {\n        pDevice->sndio.handlePlayback = handle;\n    }\n\n    pDescriptor->format             = internalFormat;\n    pDescriptor->channels           = internalChannels;\n    pDescriptor->sampleRate         = internalSampleRate;\n    ma_channel_map_init_standard(ma_standard_channel_map_sndio, pDescriptor->channelMap, ma_countof(pDescriptor->channelMap), internalChannels);\n    pDescriptor->periodSizeInFrames = internalPeriodSizeInFrames;\n    pDescriptor->periodCount        = internalPeriods;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_init__sndio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    MA_ZERO_OBJECT(&pDevice->sndio);\n\n    if (pConfig->deviceType == ma_device_type_loopback) {\n        return MA_DEVICE_TYPE_NOT_SUPPORTED;\n    }\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_handle__sndio(pDevice, pConfig, pDescriptorCapture, ma_device_type_capture);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_handle__sndio(pDevice, pConfig, pDescriptorPlayback, ma_device_type_playback);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_start__sndio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ((ma_sio_start_proc)pDevice->pContext->sndio.sio_start)((struct ma_sio_hdl*)pDevice->sndio.handleCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ((ma_sio_start_proc)pDevice->pContext->sndio.sio_start)((struct ma_sio_hdl*)pDevice->sndio.handlePlayback);   /* <-- Doesn't actually playback until data is written. */\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop__sndio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    /*\n    From the documentation:\n\n        The sio_stop() function puts the audio subsystem in the same state as before sio_start() is called. It stops recording, drains the play buffer and then\n        stops playback. If samples to play are queued but playback hasn't started yet then playback is forced immediately; playback will actually stop once the\n        buffer is drained. In no case are samples in the play buffer discarded.\n\n    Therefore, sio_stop() performs all of the necessary draining for us.\n    */\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ((ma_sio_stop_proc)pDevice->pContext->sndio.sio_stop)((struct ma_sio_hdl*)pDevice->sndio.handleCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ((ma_sio_stop_proc)pDevice->pContext->sndio.sio_stop)((struct ma_sio_hdl*)pDevice->sndio.handlePlayback);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_write__sndio(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten)\n{\n    int result;\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = 0;\n    }\n\n    result = ((ma_sio_write_proc)pDevice->pContext->sndio.sio_write)((struct ma_sio_hdl*)pDevice->sndio.handlePlayback, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n    if (result == 0) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[sndio] Failed to send data from the client to the device.\");\n        return MA_IO_ERROR;\n    }\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = frameCount;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_read__sndio(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesRead)\n{\n    int result;\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    result = ((ma_sio_read_proc)pDevice->pContext->sndio.sio_read)((struct ma_sio_hdl*)pDevice->sndio.handleCapture, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels));\n    if (result == 0) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[sndio] Failed to read data from the device to be sent to the device.\");\n        return MA_IO_ERROR;\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = frameCount;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_uninit__sndio(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_sndio);\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init__sndio(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n#ifndef MA_NO_RUNTIME_LINKING\n    const char* libsndioNames[] = {\n        \"libsndio.so\"\n    };\n    size_t i;\n\n    for (i = 0; i < ma_countof(libsndioNames); ++i) {\n        pContext->sndio.sndioSO = ma_dlopen(ma_context_get_log(pContext), libsndioNames[i]);\n        if (pContext->sndio.sndioSO != NULL) {\n            break;\n        }\n    }\n\n    if (pContext->sndio.sndioSO == NULL) {\n        return MA_NO_BACKEND;\n    }\n\n    pContext->sndio.sio_open    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->sndio.sndioSO, \"sio_open\");\n    pContext->sndio.sio_close   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->sndio.sndioSO, \"sio_close\");\n    pContext->sndio.sio_setpar  = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->sndio.sndioSO, \"sio_setpar\");\n    pContext->sndio.sio_getpar  = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->sndio.sndioSO, \"sio_getpar\");\n    pContext->sndio.sio_getcap  = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->sndio.sndioSO, \"sio_getcap\");\n    pContext->sndio.sio_write   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->sndio.sndioSO, \"sio_write\");\n    pContext->sndio.sio_read    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->sndio.sndioSO, \"sio_read\");\n    pContext->sndio.sio_start   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->sndio.sndioSO, \"sio_start\");\n    pContext->sndio.sio_stop    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->sndio.sndioSO, \"sio_stop\");\n    pContext->sndio.sio_initpar = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->sndio.sndioSO, \"sio_initpar\");\n#else\n    pContext->sndio.sio_open    = sio_open;\n    pContext->sndio.sio_close   = sio_close;\n    pContext->sndio.sio_setpar  = sio_setpar;\n    pContext->sndio.sio_getpar  = sio_getpar;\n    pContext->sndio.sio_getcap  = sio_getcap;\n    pContext->sndio.sio_write   = sio_write;\n    pContext->sndio.sio_read    = sio_read;\n    pContext->sndio.sio_start   = sio_start;\n    pContext->sndio.sio_stop    = sio_stop;\n    pContext->sndio.sio_initpar = sio_initpar;\n#endif\n\n    pCallbacks->onContextInit             = ma_context_init__sndio;\n    pCallbacks->onContextUninit           = ma_context_uninit__sndio;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__sndio;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__sndio;\n    pCallbacks->onDeviceInit              = ma_device_init__sndio;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__sndio;\n    pCallbacks->onDeviceStart             = ma_device_start__sndio;\n    pCallbacks->onDeviceStop              = ma_device_stop__sndio;\n    pCallbacks->onDeviceRead              = ma_device_read__sndio;\n    pCallbacks->onDeviceWrite             = ma_device_write__sndio;\n    pCallbacks->onDeviceDataLoop          = NULL;\n\n    (void)pConfig;\n    return MA_SUCCESS;\n}\n#endif  /* sndio */\n\n\n\n/******************************************************************************\n\naudio(4) Backend\n\n******************************************************************************/\n#ifdef MA_HAS_AUDIO4\n#include <fcntl.h>\n#include <poll.h>\n#include <errno.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <sys/ioctl.h>\n#include <sys/audioio.h>\n\n#if defined(__OpenBSD__)\n    #include <sys/param.h>\n    #if defined(OpenBSD) && OpenBSD >= 201709\n        #define MA_AUDIO4_USE_NEW_API\n    #endif\n#endif\n\nstatic void ma_construct_device_id__audio4(char* id, size_t idSize, const char* base, int deviceIndex)\n{\n    size_t baseLen;\n\n    MA_ASSERT(id != NULL);\n    MA_ASSERT(idSize > 0);\n    MA_ASSERT(deviceIndex >= 0);\n\n    baseLen = strlen(base);\n    MA_ASSERT(idSize > baseLen);\n\n    ma_strcpy_s(id, idSize, base);\n    ma_itoa_s(deviceIndex, id+baseLen, idSize-baseLen, 10);\n}\n\nstatic ma_result ma_extract_device_index_from_id__audio4(const char* id, const char* base, int* pIndexOut)\n{\n    size_t idLen;\n    size_t baseLen;\n    const char* deviceIndexStr;\n\n    MA_ASSERT(id != NULL);\n    MA_ASSERT(base != NULL);\n    MA_ASSERT(pIndexOut != NULL);\n\n    idLen = strlen(id);\n    baseLen = strlen(base);\n    if (idLen <= baseLen) {\n        return MA_ERROR;   /* Doesn't look like the id starts with the base. */\n    }\n\n    if (strncmp(id, base, baseLen) != 0) {\n        return MA_ERROR;   /* ID does not begin with base. */\n    }\n\n    deviceIndexStr = id + baseLen;\n    if (deviceIndexStr[0] == '\\0') {\n        return MA_ERROR;   /* No index specified in the ID. */\n    }\n\n    if (pIndexOut) {\n        *pIndexOut = atoi(deviceIndexStr);\n    }\n\n    return MA_SUCCESS;\n}\n\n\n#if !defined(MA_AUDIO4_USE_NEW_API)    /* Old API */\nstatic ma_format ma_format_from_encoding__audio4(unsigned int encoding, unsigned int precision)\n{\n    if (precision == 8 && (encoding == AUDIO_ENCODING_ULINEAR || encoding == AUDIO_ENCODING_ULINEAR || encoding == AUDIO_ENCODING_ULINEAR_LE || encoding == AUDIO_ENCODING_ULINEAR_BE)) {\n        return ma_format_u8;\n    } else {\n        if (ma_is_little_endian() && encoding == AUDIO_ENCODING_SLINEAR_LE) {\n            if (precision == 16) {\n                return ma_format_s16;\n            } else if (precision == 24) {\n                return ma_format_s24;\n            } else if (precision == 32) {\n                return ma_format_s32;\n            }\n        } else if (ma_is_big_endian() && encoding == AUDIO_ENCODING_SLINEAR_BE) {\n            if (precision == 16) {\n                return ma_format_s16;\n            } else if (precision == 24) {\n                return ma_format_s24;\n            } else if (precision == 32) {\n                return ma_format_s32;\n            }\n        }\n    }\n\n    return ma_format_unknown;  /* Encoding not supported. */\n}\n\nstatic void ma_encoding_from_format__audio4(ma_format format, unsigned int* pEncoding, unsigned int* pPrecision)\n{\n    MA_ASSERT(pEncoding  != NULL);\n    MA_ASSERT(pPrecision != NULL);\n\n    switch (format)\n    {\n        case ma_format_u8:\n        {\n            *pEncoding = AUDIO_ENCODING_ULINEAR;\n            *pPrecision = 8;\n        } break;\n\n        case ma_format_s24:\n        {\n            *pEncoding = (ma_is_little_endian()) ? AUDIO_ENCODING_SLINEAR_LE : AUDIO_ENCODING_SLINEAR_BE;\n            *pPrecision = 24;\n        } break;\n\n        case ma_format_s32:\n        {\n            *pEncoding = (ma_is_little_endian()) ? AUDIO_ENCODING_SLINEAR_LE : AUDIO_ENCODING_SLINEAR_BE;\n            *pPrecision = 32;\n        } break;\n\n        case ma_format_s16:\n        case ma_format_f32:\n        case ma_format_unknown:\n        default:\n        {\n            *pEncoding = (ma_is_little_endian()) ? AUDIO_ENCODING_SLINEAR_LE : AUDIO_ENCODING_SLINEAR_BE;\n            *pPrecision = 16;\n        } break;\n    }\n}\n\nstatic ma_format ma_format_from_prinfo__audio4(struct audio_prinfo* prinfo)\n{\n    return ma_format_from_encoding__audio4(prinfo->encoding, prinfo->precision);\n}\n\nstatic ma_format ma_best_format_from_fd__audio4(int fd, ma_format preferredFormat)\n{\n    audio_encoding_t encoding;\n    ma_uint32 iFormat;\n    int counter = 0;\n\n    /* First check to see if the preferred format is supported. */\n    if (preferredFormat != ma_format_unknown) {\n        counter = 0;\n        for (;;) {\n            MA_ZERO_OBJECT(&encoding);\n            encoding.index = counter;\n            if (ioctl(fd, AUDIO_GETENC, &encoding) < 0) {\n                break;\n            }\n\n            if (preferredFormat == ma_format_from_encoding__audio4(encoding.encoding, encoding.precision)) {\n                return preferredFormat;  /* Found the preferred format. */\n            }\n\n            /* Getting here means this encoding does not match our preferred format so we need to more on to the next encoding. */\n            counter += 1;\n        }\n    }\n\n    /* Getting here means our preferred format is not supported, so fall back to our standard priorities. */\n    for (iFormat = 0; iFormat < ma_countof(g_maFormatPriorities); iFormat += 1) {\n        ma_format format = g_maFormatPriorities[iFormat];\n\n        counter = 0;\n        for (;;) {\n            MA_ZERO_OBJECT(&encoding);\n            encoding.index = counter;\n            if (ioctl(fd, AUDIO_GETENC, &encoding) < 0) {\n                break;\n            }\n\n            if (format == ma_format_from_encoding__audio4(encoding.encoding, encoding.precision)) {\n                return format;  /* Found a workable format. */\n            }\n\n            /* Getting here means this encoding does not match our preferred format so we need to more on to the next encoding. */\n            counter += 1;\n        }\n    }\n\n    /* Getting here means not appropriate format was found. */\n    return ma_format_unknown;\n}\n#else\nstatic ma_format ma_format_from_swpar__audio4(struct audio_swpar* par)\n{\n    if (par->bits == 8 && par->bps == 1 && par->sig == 0) {\n        return ma_format_u8;\n    }\n    if (par->bits == 16 && par->bps == 2 && par->sig == 1 && par->le == ma_is_little_endian()) {\n        return ma_format_s16;\n    }\n    if (par->bits == 24 && par->bps == 3 && par->sig == 1 && par->le == ma_is_little_endian()) {\n        return ma_format_s24;\n    }\n    if (par->bits == 32 && par->bps == 4 && par->sig == 1 && par->le == ma_is_little_endian()) {\n        return ma_format_f32;\n    }\n\n    /* Format not supported. */\n    return ma_format_unknown;\n}\n#endif\n\nstatic ma_result ma_context_get_device_info_from_fd__audio4(ma_context* pContext, ma_device_type deviceType, int fd, ma_device_info* pDeviceInfo)\n{\n    audio_device_t fdDevice;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(fd >= 0);\n    MA_ASSERT(pDeviceInfo != NULL);\n\n    (void)pContext;\n    (void)deviceType;\n\n    if (ioctl(fd, AUDIO_GETDEV, &fdDevice) < 0) {\n        return MA_ERROR;   /* Failed to retrieve device info. */\n    }\n\n    /* Name. */\n    ma_strcpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), fdDevice.name);\n\n    #if !defined(MA_AUDIO4_USE_NEW_API)\n    {\n        audio_info_t fdInfo;\n        int counter = 0;\n        ma_uint32 channels;\n        ma_uint32 sampleRate;\n\n        if (ioctl(fd, AUDIO_GETINFO, &fdInfo) < 0) {\n            return MA_ERROR;\n        }\n\n        if (deviceType == ma_device_type_playback) {\n            channels   = fdInfo.play.channels;\n            sampleRate = fdInfo.play.sample_rate;\n        } else {\n            channels   = fdInfo.record.channels;\n            sampleRate = fdInfo.record.sample_rate;\n        }\n\n        /* Supported formats. We get this by looking at the encodings. */\n        pDeviceInfo->nativeDataFormatCount = 0;\n        for (;;) {\n            audio_encoding_t encoding;\n            ma_format format;\n\n            MA_ZERO_OBJECT(&encoding);\n            encoding.index = counter;\n            if (ioctl(fd, AUDIO_GETENC, &encoding) < 0) {\n                break;\n            }\n\n            format = ma_format_from_encoding__audio4(encoding.encoding, encoding.precision);\n            if (format != ma_format_unknown) {\n                ma_device_info_add_native_data_format(pDeviceInfo, format, channels, sampleRate, 0);\n            }\n\n            counter += 1;\n        }\n    }\n    #else\n    {\n        struct audio_swpar fdPar;\n        ma_format format;\n        ma_uint32 channels;\n        ma_uint32 sampleRate;\n\n        if (ioctl(fd, AUDIO_GETPAR, &fdPar) < 0) {\n            return MA_ERROR;\n        }\n\n        format = ma_format_from_swpar__audio4(&fdPar);\n        if (format == ma_format_unknown) {\n            return MA_FORMAT_NOT_SUPPORTED;\n        }\n\n        if (deviceType == ma_device_type_playback) {\n            channels = fdPar.pchan;\n        } else {\n            channels = fdPar.rchan;\n        }\n\n        sampleRate = fdPar.rate;\n\n        pDeviceInfo->nativeDataFormatCount = 0;\n        ma_device_info_add_native_data_format(pDeviceInfo, format, channels, sampleRate, 0);\n    }\n    #endif\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_enumerate_devices__audio4(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    const int maxDevices = 64;\n    char devpath[256];\n    int iDevice;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(callback != NULL);\n\n    /*\n    Every device will be named \"/dev/audioN\", with a \"/dev/audioctlN\" equivalent. We use the \"/dev/audioctlN\"\n    version here since we can open it even when another process has control of the \"/dev/audioN\" device.\n    */\n    for (iDevice = 0; iDevice < maxDevices; ++iDevice) {\n        struct stat st;\n        int fd;\n        ma_bool32 isTerminating = MA_FALSE;\n\n        ma_strcpy_s(devpath, sizeof(devpath), \"/dev/audioctl\");\n        ma_itoa_s(iDevice, devpath+strlen(devpath), sizeof(devpath)-strlen(devpath), 10);\n\n        if (stat(devpath, &st) < 0) {\n            break;\n        }\n\n        /* The device exists, but we need to check if it's usable as playback and/or capture. */\n\n        /* Playback. */\n        if (!isTerminating) {\n            fd = open(devpath, O_RDONLY, 0);\n            if (fd >= 0) {\n                /* Supports playback. */\n                ma_device_info deviceInfo;\n                MA_ZERO_OBJECT(&deviceInfo);\n                ma_construct_device_id__audio4(deviceInfo.id.audio4, sizeof(deviceInfo.id.audio4), \"/dev/audio\", iDevice);\n                if (ma_context_get_device_info_from_fd__audio4(pContext, ma_device_type_playback, fd, &deviceInfo) == MA_SUCCESS) {\n                    isTerminating = !callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n                }\n\n                close(fd);\n            }\n        }\n\n        /* Capture. */\n        if (!isTerminating) {\n            fd = open(devpath, O_WRONLY, 0);\n            if (fd >= 0) {\n                /* Supports capture. */\n                ma_device_info deviceInfo;\n                MA_ZERO_OBJECT(&deviceInfo);\n                ma_construct_device_id__audio4(deviceInfo.id.audio4, sizeof(deviceInfo.id.audio4), \"/dev/audio\", iDevice);\n                if (ma_context_get_device_info_from_fd__audio4(pContext, ma_device_type_capture, fd, &deviceInfo) == MA_SUCCESS) {\n                    isTerminating = !callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n                }\n\n                close(fd);\n            }\n        }\n\n        if (isTerminating) {\n            break;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_get_device_info__audio4(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    int fd = -1;\n    int deviceIndex = -1;\n    char ctlid[256];\n    ma_result result;\n\n    MA_ASSERT(pContext != NULL);\n\n    /*\n    We need to open the \"/dev/audioctlN\" device to get the info. To do this we need to extract the number\n    from the device ID which will be in \"/dev/audioN\" format.\n    */\n    if (pDeviceID == NULL) {\n        /* Default device. */\n        ma_strcpy_s(ctlid, sizeof(ctlid), \"/dev/audioctl\");\n    } else {\n        /* Specific device. We need to convert from \"/dev/audioN\" to \"/dev/audioctlN\". */\n        result = ma_extract_device_index_from_id__audio4(pDeviceID->audio4, \"/dev/audio\", &deviceIndex);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        ma_construct_device_id__audio4(ctlid, sizeof(ctlid), \"/dev/audioctl\", deviceIndex);\n    }\n\n    fd = open(ctlid, (deviceType == ma_device_type_playback) ? O_WRONLY : O_RDONLY, 0);\n    if (fd == -1) {\n        return MA_NO_DEVICE;\n    }\n\n    if (deviceIndex == -1) {\n        ma_strcpy_s(pDeviceInfo->id.audio4, sizeof(pDeviceInfo->id.audio4), \"/dev/audio\");\n    } else {\n        ma_construct_device_id__audio4(pDeviceInfo->id.audio4, sizeof(pDeviceInfo->id.audio4), \"/dev/audio\", deviceIndex);\n    }\n\n    result = ma_context_get_device_info_from_fd__audio4(pContext, deviceType, fd, pDeviceInfo);\n\n    close(fd);\n    return result;\n}\n\nstatic ma_result ma_device_uninit__audio4(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        close(pDevice->audio4.fdCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        close(pDevice->audio4.fdPlayback);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_init_fd__audio4(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptor, ma_device_type deviceType)\n{\n    const char* pDefaultDeviceNames[] = {\n        \"/dev/audio\",\n        \"/dev/audio0\"\n    };\n    const char* pDefaultDeviceCtlNames[] = {\n        \"/dev/audioctl\",\n        \"/dev/audioctl0\"\n    };\n    int fd;\n    int fdFlags = 0;\n    size_t iDefaultDevice = (size_t)-1;\n    ma_format internalFormat;\n    ma_uint32 internalChannels;\n    ma_uint32 internalSampleRate;\n    ma_uint32 internalPeriodSizeInFrames;\n    ma_uint32 internalPeriods;\n\n    MA_ASSERT(pConfig    != NULL);\n    MA_ASSERT(deviceType != ma_device_type_duplex);\n    MA_ASSERT(pDevice    != NULL);\n\n    /* The first thing to do is open the file. */\n    if (deviceType == ma_device_type_capture) {\n        fdFlags = O_RDONLY;\n    } else {\n        fdFlags = O_WRONLY;\n    }\n    /*fdFlags |= O_NONBLOCK;*/\n\n    /* Find the index of the default device as a start. We'll use this index later. Set it to (size_t)-1 otherwise. */\n    if (pDescriptor->pDeviceID == NULL) {\n        /* Default device. */\n        for (iDefaultDevice = 0; iDefaultDevice < ma_countof(pDefaultDeviceNames); ++iDefaultDevice) {\n            fd = open(pDefaultDeviceNames[iDefaultDevice], fdFlags, 0);\n            if (fd != -1) {\n                break;\n            }\n        }\n    } else {\n        /* Specific device. */\n        fd = open(pDescriptor->pDeviceID->audio4, fdFlags, 0);\n\n        for (iDefaultDevice = 0; iDefaultDevice < ma_countof(pDefaultDeviceNames); iDefaultDevice += 1) {\n            if (ma_strcmp(pDefaultDeviceNames[iDefaultDevice], pDescriptor->pDeviceID->audio4) == 0) {\n                break;\n            }\n        }\n\n        if (iDefaultDevice == ma_countof(pDefaultDeviceNames)) {\n            iDefaultDevice = (size_t)-1;\n        }\n    }\n\n    if (fd == -1) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] Failed to open device.\");\n        return ma_result_from_errno(errno);\n    }\n\n    #if !defined(MA_AUDIO4_USE_NEW_API)    /* Old API */\n    {\n        audio_info_t fdInfo;\n        int fdInfoResult = -1;\n\n        /*\n        The documentation is a little bit unclear to me as to how it handles formats. It says the\n        following:\n\n            Regardless of formats supported by underlying driver, the audio driver accepts the\n            following formats.\n\n        By then the next sentence says this:\n\n            `encoding` and `precision` are one of the values obtained by AUDIO_GETENC.\n\n        It sounds like a direct contradiction to me. I'm going to play this safe any only use the\n        best sample format returned by AUDIO_GETENC. If the requested format is supported we'll\n        use that, but otherwise we'll just use our standard format priorities to pick an\n        appropriate one.\n        */\n        AUDIO_INITINFO(&fdInfo);\n\n        /*\n        Get the default format from the audioctl file if we're asking for a default device. If we\n        retrieve it from /dev/audio it'll default to mono 8000Hz.\n        */\n        if (iDefaultDevice != (size_t)-1) {\n            /* We're using a default device. Get the info from the /dev/audioctl file instead of /dev/audio. */\n            int fdctl = open(pDefaultDeviceCtlNames[iDefaultDevice], fdFlags, 0);\n            if (fdctl != -1) {\n                fdInfoResult = ioctl(fdctl, AUDIO_GETINFO, &fdInfo);\n                close(fdctl);\n            }\n        }\n\n        if (fdInfoResult == -1) {\n            /* We still don't have the default device info so just retrieve it from the main audio device. */\n            if (ioctl(fd, AUDIO_GETINFO, &fdInfo) < 0) {\n                close(fd);\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] AUDIO_GETINFO failed.\");\n                return ma_result_from_errno(errno);\n            }\n        }\n\n        /* We get the driver to do as much of the data conversion as possible. */\n        if (deviceType == ma_device_type_capture) {\n            fdInfo.mode = AUMODE_RECORD;\n            ma_encoding_from_format__audio4(ma_best_format_from_fd__audio4(fd, pDescriptor->format), &fdInfo.record.encoding, &fdInfo.record.precision);\n\n            if (pDescriptor->channels != 0) {\n                fdInfo.record.channels = ma_clamp(pDescriptor->channels, 1, 12);    /* From the documentation: `channels` ranges from 1 to 12. */\n            }\n\n            if (pDescriptor->sampleRate != 0) {\n                fdInfo.record.sample_rate = ma_clamp(pDescriptor->sampleRate, 1000, 192000);    /* From the documentation: `frequency` ranges from 1000Hz to 192000Hz. (They mean `sample_rate` instead of `frequency`.) */\n            }\n        } else {\n            fdInfo.mode = AUMODE_PLAY;\n            ma_encoding_from_format__audio4(ma_best_format_from_fd__audio4(fd, pDescriptor->format), &fdInfo.play.encoding, &fdInfo.play.precision);\n\n            if (pDescriptor->channels != 0) {\n                fdInfo.play.channels = ma_clamp(pDescriptor->channels, 1, 12);    /* From the documentation: `channels` ranges from 1 to 12. */\n            }\n\n            if (pDescriptor->sampleRate != 0) {\n                fdInfo.play.sample_rate = ma_clamp(pDescriptor->sampleRate, 1000, 192000);    /* From the documentation: `frequency` ranges from 1000Hz to 192000Hz. (They mean `sample_rate` instead of `frequency`.) */\n            }\n        }\n\n        if (ioctl(fd, AUDIO_SETINFO, &fdInfo) < 0) {\n            close(fd);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] Failed to set device format. AUDIO_SETINFO failed.\");\n            return ma_result_from_errno(errno);\n        }\n\n        if (ioctl(fd, AUDIO_GETINFO, &fdInfo) < 0) {\n            close(fd);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] AUDIO_GETINFO failed.\");\n            return ma_result_from_errno(errno);\n        }\n\n        if (deviceType == ma_device_type_capture) {\n            internalFormat     = ma_format_from_prinfo__audio4(&fdInfo.record);\n            internalChannels   = fdInfo.record.channels;\n            internalSampleRate = fdInfo.record.sample_rate;\n        } else {\n            internalFormat     = ma_format_from_prinfo__audio4(&fdInfo.play);\n            internalChannels   = fdInfo.play.channels;\n            internalSampleRate = fdInfo.play.sample_rate;\n        }\n\n        if (internalFormat == ma_format_unknown) {\n            close(fd);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] The device's internal device format is not supported by miniaudio. The device is unusable.\");\n            return MA_FORMAT_NOT_SUPPORTED;\n        }\n\n        /* Buffer. */\n        {\n            ma_uint32 internalPeriodSizeInBytes;\n\n            internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, internalSampleRate, pConfig->performanceProfile);\n\n            internalPeriodSizeInBytes = internalPeriodSizeInFrames * ma_get_bytes_per_frame(internalFormat, internalChannels);\n            if (internalPeriodSizeInBytes < 16) {\n                internalPeriodSizeInBytes = 16;\n            }\n\n            internalPeriods = pDescriptor->periodCount;\n            if (internalPeriods < 2) {\n                internalPeriods = 2;\n            }\n\n            /* What miniaudio calls a period, audio4 calls a block. */\n            AUDIO_INITINFO(&fdInfo);\n            fdInfo.hiwat     = internalPeriods;\n            fdInfo.lowat     = internalPeriods-1;\n            fdInfo.blocksize = internalPeriodSizeInBytes;\n            if (ioctl(fd, AUDIO_SETINFO, &fdInfo) < 0) {\n                close(fd);\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] Failed to set internal buffer size. AUDIO_SETINFO failed.\");\n                return ma_result_from_errno(errno);\n            }\n\n            internalPeriods            = fdInfo.hiwat;\n            internalPeriodSizeInFrames = fdInfo.blocksize / ma_get_bytes_per_frame(internalFormat, internalChannels);\n        }\n    }\n    #else\n    {\n        struct audio_swpar fdPar;\n\n        /* We need to retrieve the format of the device so we can know the channel count and sample rate. Then we can calculate the buffer size. */\n        if (ioctl(fd, AUDIO_GETPAR, &fdPar) < 0) {\n            close(fd);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] Failed to retrieve initial device parameters.\");\n            return ma_result_from_errno(errno);\n        }\n\n        internalFormat     = ma_format_from_swpar__audio4(&fdPar);\n        internalChannels   = (deviceType == ma_device_type_capture) ? fdPar.rchan : fdPar.pchan;\n        internalSampleRate = fdPar.rate;\n\n        if (internalFormat == ma_format_unknown) {\n            close(fd);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] The device's internal device format is not supported by miniaudio. The device is unusable.\");\n            return MA_FORMAT_NOT_SUPPORTED;\n        }\n\n        /* Buffer. */\n        {\n            ma_uint32 internalPeriodSizeInBytes;\n\n            internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, internalSampleRate, pConfig->performanceProfile);\n\n            /* What miniaudio calls a period, audio4 calls a block. */\n            internalPeriodSizeInBytes = internalPeriodSizeInFrames * ma_get_bytes_per_frame(internalFormat, internalChannels);\n            if (internalPeriodSizeInBytes < 16) {\n                internalPeriodSizeInBytes = 16;\n            }\n\n            fdPar.nblks = pDescriptor->periodCount;\n            fdPar.round = internalPeriodSizeInBytes;\n\n            if (ioctl(fd, AUDIO_SETPAR, &fdPar) < 0) {\n                close(fd);\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] Failed to set device parameters.\");\n                return ma_result_from_errno(errno);\n            }\n\n            if (ioctl(fd, AUDIO_GETPAR, &fdPar) < 0) {\n                close(fd);\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] Failed to retrieve actual device parameters.\");\n                return ma_result_from_errno(errno);\n            }\n        }\n\n        internalFormat             = ma_format_from_swpar__audio4(&fdPar);\n        internalChannels           = (deviceType == ma_device_type_capture) ? fdPar.rchan : fdPar.pchan;\n        internalSampleRate         = fdPar.rate;\n        internalPeriods            = fdPar.nblks;\n        internalPeriodSizeInFrames = fdPar.round / ma_get_bytes_per_frame(internalFormat, internalChannels);\n    }\n    #endif\n\n    if (internalFormat == ma_format_unknown) {\n        close(fd);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] The device's internal device format is not supported by miniaudio. The device is unusable.\");\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n\n    if (deviceType == ma_device_type_capture) {\n        pDevice->audio4.fdCapture  = fd;\n    } else {\n        pDevice->audio4.fdPlayback = fd;\n    }\n\n    pDescriptor->format             = internalFormat;\n    pDescriptor->channels           = internalChannels;\n    pDescriptor->sampleRate         = internalSampleRate;\n    ma_channel_map_init_standard(ma_standard_channel_map_sound4, pDescriptor->channelMap, ma_countof(pDescriptor->channelMap), internalChannels);\n    pDescriptor->periodSizeInFrames = internalPeriodSizeInFrames;\n    pDescriptor->periodCount        = internalPeriods;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_init__audio4(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    MA_ZERO_OBJECT(&pDevice->audio4);\n\n    if (pConfig->deviceType == ma_device_type_loopback) {\n        return MA_DEVICE_TYPE_NOT_SUPPORTED;\n    }\n\n    pDevice->audio4.fdCapture  = -1;\n    pDevice->audio4.fdPlayback = -1;\n\n    /*\n    The version of the operating system dictates whether or not the device is exclusive or shared. NetBSD\n    introduced in-kernel mixing which means it's shared. All other BSD flavours are exclusive as far as\n    I'm aware.\n    */\n#if defined(__NetBSD_Version__) && __NetBSD_Version__ >= 800000000\n    /* NetBSD 8.0+ */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->shareMode == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->shareMode  == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n#else\n    /* All other flavors. */\n#endif\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_fd__audio4(pDevice, pConfig, pDescriptorCapture, ma_device_type_capture);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_fd__audio4(pDevice, pConfig, pDescriptorPlayback, ma_device_type_playback);\n        if (result != MA_SUCCESS) {\n            if (pConfig->deviceType == ma_device_type_duplex) {\n                close(pDevice->audio4.fdCapture);\n            }\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_start__audio4(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->audio4.fdCapture == -1) {\n            return MA_INVALID_ARGS;\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->audio4.fdPlayback == -1) {\n            return MA_INVALID_ARGS;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop_fd__audio4(ma_device* pDevice, int fd)\n{\n    if (fd == -1) {\n        return MA_INVALID_ARGS;\n    }\n\n#if !defined(MA_AUDIO4_USE_NEW_API)\n    if (ioctl(fd, AUDIO_FLUSH, 0) < 0) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] Failed to stop device. AUDIO_FLUSH failed.\");\n        return ma_result_from_errno(errno);\n    }\n#else\n    if (ioctl(fd, AUDIO_STOP, 0) < 0) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] Failed to stop device. AUDIO_STOP failed.\");\n        return ma_result_from_errno(errno);\n    }\n#endif\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop__audio4(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ma_result result;\n\n        result = ma_device_stop_fd__audio4(pDevice, pDevice->audio4.fdCapture);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_result result;\n\n        /* Drain the device first. If this fails we'll just need to flush without draining. Unfortunately draining isn't available on newer version of OpenBSD. */\n    #if !defined(MA_AUDIO4_USE_NEW_API)\n        ioctl(pDevice->audio4.fdPlayback, AUDIO_DRAIN, 0);\n    #endif\n\n        /* Here is where the device is stopped immediately. */\n        result = ma_device_stop_fd__audio4(pDevice, pDevice->audio4.fdPlayback);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_write__audio4(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten)\n{\n    int result;\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = 0;\n    }\n\n    result = write(pDevice->audio4.fdPlayback, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n    if (result < 0) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] Failed to write data to the device.\");\n        return ma_result_from_errno(errno);\n    }\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = (ma_uint32)result / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_read__audio4(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesRead)\n{\n    int result;\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    result = read(pDevice->audio4.fdCapture, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels));\n    if (result < 0) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[audio4] Failed to read data from the device.\");\n        return ma_result_from_errno(errno);\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = (ma_uint32)result / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_uninit__audio4(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_audio4);\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init__audio4(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n    MA_ASSERT(pContext != NULL);\n\n    (void)pConfig;\n\n    pCallbacks->onContextInit             = ma_context_init__audio4;\n    pCallbacks->onContextUninit           = ma_context_uninit__audio4;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__audio4;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__audio4;\n    pCallbacks->onDeviceInit              = ma_device_init__audio4;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__audio4;\n    pCallbacks->onDeviceStart             = ma_device_start__audio4;\n    pCallbacks->onDeviceStop              = ma_device_stop__audio4;\n    pCallbacks->onDeviceRead              = ma_device_read__audio4;\n    pCallbacks->onDeviceWrite             = ma_device_write__audio4;\n    pCallbacks->onDeviceDataLoop          = NULL;\n\n    return MA_SUCCESS;\n}\n#endif  /* audio4 */\n\n\n/******************************************************************************\n\nOSS Backend\n\n******************************************************************************/\n#ifdef MA_HAS_OSS\n#include <sys/ioctl.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <sys/soundcard.h>\n\n#ifndef SNDCTL_DSP_HALT\n#define SNDCTL_DSP_HALT SNDCTL_DSP_RESET\n#endif\n\n#define MA_OSS_DEFAULT_DEVICE_NAME  \"/dev/dsp\"\n\nstatic int ma_open_temp_device__oss()\n{\n    /* The OSS sample code uses \"/dev/mixer\" as the device for getting system properties so I'm going to do the same. */\n    int fd = open(\"/dev/mixer\", O_RDONLY, 0);\n    if (fd >= 0) {\n        return fd;\n    }\n\n    return -1;\n}\n\nstatic ma_result ma_context_open_device__oss(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_share_mode shareMode, int* pfd)\n{\n    const char* deviceName;\n    int flags;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pfd != NULL);\n    (void)pContext;\n\n    *pfd = -1;\n\n    /* This function should only be called for playback or capture, not duplex. */\n    if (deviceType == ma_device_type_duplex) {\n        return MA_INVALID_ARGS;\n    }\n\n    deviceName = MA_OSS_DEFAULT_DEVICE_NAME;\n    if (pDeviceID != NULL) {\n        deviceName = pDeviceID->oss;\n    }\n\n    flags = (deviceType == ma_device_type_playback) ? O_WRONLY : O_RDONLY;\n    if (shareMode == ma_share_mode_exclusive) {\n        flags |= O_EXCL;\n    }\n\n    *pfd = open(deviceName, flags, 0);\n    if (*pfd == -1) {\n        return ma_result_from_errno(errno);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_enumerate_devices__oss(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    int fd;\n    oss_sysinfo si;\n    int result;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(callback != NULL);\n\n    fd = ma_open_temp_device__oss();\n    if (fd == -1) {\n        ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to open a temporary device for retrieving system information used for device enumeration.\");\n        return MA_NO_BACKEND;\n    }\n\n    result = ioctl(fd, SNDCTL_SYSINFO, &si);\n    if (result != -1) {\n        int iAudioDevice;\n        for (iAudioDevice = 0; iAudioDevice < si.numaudios; ++iAudioDevice) {\n            oss_audioinfo ai;\n            ai.dev = iAudioDevice;\n            result = ioctl(fd, SNDCTL_AUDIOINFO, &ai);\n            if (result != -1) {\n                if (ai.devnode[0] != '\\0') {    /* <-- Can be blank, according to documentation. */\n                    ma_device_info deviceInfo;\n                    ma_bool32 isTerminating = MA_FALSE;\n\n                    MA_ZERO_OBJECT(&deviceInfo);\n\n                    /* ID */\n                    ma_strncpy_s(deviceInfo.id.oss, sizeof(deviceInfo.id.oss), ai.devnode, (size_t)-1);\n\n                    /*\n                    The human readable device name should be in the \"ai.handle\" variable, but it can\n                    sometimes be empty in which case we just fall back to \"ai.name\" which is less user\n                    friendly, but usually has a value.\n                    */\n                    if (ai.handle[0] != '\\0') {\n                        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), ai.handle, (size_t)-1);\n                    } else {\n                        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), ai.name, (size_t)-1);\n                    }\n\n                    /* The device can be both playback and capture. */\n                    if (!isTerminating && (ai.caps & PCM_CAP_OUTPUT) != 0) {\n                        isTerminating = !callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n                    }\n                    if (!isTerminating && (ai.caps & PCM_CAP_INPUT) != 0) {\n                        isTerminating = !callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n                    }\n\n                    if (isTerminating) {\n                        break;\n                    }\n                }\n            }\n        }\n    } else {\n        close(fd);\n        ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to retrieve system information for device enumeration.\");\n        return MA_NO_BACKEND;\n    }\n\n    close(fd);\n    return MA_SUCCESS;\n}\n\nstatic void ma_context_add_native_data_format__oss(ma_context* pContext, oss_audioinfo* pAudioInfo, ma_format format, ma_device_info* pDeviceInfo)\n{\n    unsigned int minChannels;\n    unsigned int maxChannels;\n    unsigned int iRate;\n\n    MA_ASSERT(pContext    != NULL);\n    MA_ASSERT(pAudioInfo  != NULL);\n    MA_ASSERT(pDeviceInfo != NULL);\n\n    /* If we support all channels we just report 0. */\n    minChannels = ma_clamp(pAudioInfo->min_channels, MA_MIN_CHANNELS, MA_MAX_CHANNELS);\n    maxChannels = ma_clamp(pAudioInfo->max_channels, MA_MIN_CHANNELS, MA_MAX_CHANNELS);\n\n    /*\n    OSS has this annoying thing where sample rates can be reported in two ways. We prefer explicitness,\n    which OSS has in the form of nrates/rates, however there are times where nrates can be 0, in which\n    case we'll need to use min_rate and max_rate and report only standard rates.\n    */\n    if (pAudioInfo->nrates > 0) {\n        for (iRate = 0; iRate < pAudioInfo->nrates; iRate += 1) {\n            unsigned int rate = pAudioInfo->rates[iRate];\n\n            if (minChannels == MA_MIN_CHANNELS && maxChannels == MA_MAX_CHANNELS) {\n                ma_device_info_add_native_data_format(pDeviceInfo, format, 0, rate, 0);   /* Set the channel count to 0 to indicate that all channel counts are supported. */\n            } else {\n                unsigned int iChannel;\n                for (iChannel = minChannels; iChannel <= maxChannels; iChannel += 1) {\n                     ma_device_info_add_native_data_format(pDeviceInfo, format, iChannel, rate, 0);\n                }\n            }\n        }\n    } else {\n        for (iRate = 0; iRate < ma_countof(g_maStandardSampleRatePriorities); iRate += 1) {\n            ma_uint32 standardRate = g_maStandardSampleRatePriorities[iRate];\n\n            if (standardRate >= (ma_uint32)pAudioInfo->min_rate && standardRate <= (ma_uint32)pAudioInfo->max_rate) {\n                if (minChannels == MA_MIN_CHANNELS && maxChannels == MA_MAX_CHANNELS) {\n                    ma_device_info_add_native_data_format(pDeviceInfo, format, 0, standardRate, 0);   /* Set the channel count to 0 to indicate that all channel counts are supported. */\n                } else {\n                    unsigned int iChannel;\n                    for (iChannel = minChannels; iChannel <= maxChannels; iChannel += 1) {\n                         ma_device_info_add_native_data_format(pDeviceInfo, format, iChannel, standardRate, 0);\n                    }\n                }\n            }\n        }\n    }\n}\n\nstatic ma_result ma_context_get_device_info__oss(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    ma_bool32 foundDevice;\n    int fdTemp;\n    oss_sysinfo si;\n    int result;\n\n    MA_ASSERT(pContext != NULL);\n\n    /* Handle the default device a little differently. */\n    if (pDeviceID == NULL) {\n        if (deviceType == ma_device_type_playback) {\n            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n        } else {\n            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n        }\n\n        return MA_SUCCESS;\n    }\n\n\n    /* If we get here it means we are _not_ using the default device. */\n    foundDevice = MA_FALSE;\n\n    fdTemp = ma_open_temp_device__oss();\n    if (fdTemp == -1) {\n        ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to open a temporary device for retrieving system information used for device enumeration.\");\n        return MA_NO_BACKEND;\n    }\n\n    result = ioctl(fdTemp, SNDCTL_SYSINFO, &si);\n    if (result != -1) {\n        int iAudioDevice;\n        for (iAudioDevice = 0; iAudioDevice < si.numaudios; ++iAudioDevice) {\n            oss_audioinfo ai;\n            ai.dev = iAudioDevice;\n            result = ioctl(fdTemp, SNDCTL_AUDIOINFO, &ai);\n            if (result != -1) {\n                if (ma_strcmp(ai.devnode, pDeviceID->oss) == 0) {\n                    /* It has the same name, so now just confirm the type. */\n                    if ((deviceType == ma_device_type_playback && ((ai.caps & PCM_CAP_OUTPUT) != 0)) ||\n                        (deviceType == ma_device_type_capture  && ((ai.caps & PCM_CAP_INPUT)  != 0))) {\n                        unsigned int formatMask;\n\n                        /* ID */\n                        ma_strncpy_s(pDeviceInfo->id.oss, sizeof(pDeviceInfo->id.oss), ai.devnode, (size_t)-1);\n\n                        /*\n                        The human readable device name should be in the \"ai.handle\" variable, but it can\n                        sometimes be empty in which case we just fall back to \"ai.name\" which is less user\n                        friendly, but usually has a value.\n                        */\n                        if (ai.handle[0] != '\\0') {\n                            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), ai.handle, (size_t)-1);\n                        } else {\n                            ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), ai.name, (size_t)-1);\n                        }\n\n\n                        pDeviceInfo->nativeDataFormatCount = 0;\n\n                        if (deviceType == ma_device_type_playback) {\n                            formatMask = ai.oformats;\n                        } else {\n                            formatMask = ai.iformats;\n                        }\n\n                        if (((formatMask & AFMT_S16_LE) != 0 && ma_is_little_endian()) || (AFMT_S16_BE && ma_is_big_endian())) {\n                            ma_context_add_native_data_format__oss(pContext, &ai, ma_format_s16, pDeviceInfo);\n                        }\n                        if (((formatMask & AFMT_S32_LE) != 0 && ma_is_little_endian()) || (AFMT_S32_BE && ma_is_big_endian())) {\n                            ma_context_add_native_data_format__oss(pContext, &ai, ma_format_s32, pDeviceInfo);\n                        }\n                        if ((formatMask & AFMT_U8) != 0) {\n                            ma_context_add_native_data_format__oss(pContext, &ai, ma_format_u8, pDeviceInfo);\n                        }\n\n                        foundDevice = MA_TRUE;\n                        break;\n                    }\n                }\n            }\n        }\n    } else {\n        close(fdTemp);\n        ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to retrieve system information for device enumeration.\");\n        return MA_NO_BACKEND;\n    }\n\n\n    close(fdTemp);\n\n    if (!foundDevice) {\n        return MA_NO_DEVICE;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_uninit__oss(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        close(pDevice->oss.fdCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        close(pDevice->oss.fdPlayback);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic int ma_format_to_oss(ma_format format)\n{\n    int ossFormat = AFMT_U8;\n    switch (format) {\n        case ma_format_s16: ossFormat = (ma_is_little_endian()) ? AFMT_S16_LE : AFMT_S16_BE; break;\n        case ma_format_s24: ossFormat = (ma_is_little_endian()) ? AFMT_S32_LE : AFMT_S32_BE; break;\n        case ma_format_s32: ossFormat = (ma_is_little_endian()) ? AFMT_S32_LE : AFMT_S32_BE; break;\n        case ma_format_f32: ossFormat = (ma_is_little_endian()) ? AFMT_S16_LE : AFMT_S16_BE; break;\n        case ma_format_u8:\n        default: ossFormat = AFMT_U8; break;\n    }\n\n    return ossFormat;\n}\n\nstatic ma_format ma_format_from_oss(int ossFormat)\n{\n    if (ossFormat == AFMT_U8) {\n        return ma_format_u8;\n    } else {\n        if (ma_is_little_endian()) {\n            switch (ossFormat) {\n                case AFMT_S16_LE: return ma_format_s16;\n                case AFMT_S32_LE: return ma_format_s32;\n                default: return ma_format_unknown;\n            }\n        } else {\n            switch (ossFormat) {\n                case AFMT_S16_BE: return ma_format_s16;\n                case AFMT_S32_BE: return ma_format_s32;\n                default: return ma_format_unknown;\n            }\n        }\n    }\n\n    return ma_format_unknown;\n}\n\nstatic ma_result ma_device_init_fd__oss(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptor, ma_device_type deviceType)\n{\n    ma_result result;\n    int ossResult;\n    int fd;\n    const ma_device_id* pDeviceID = NULL;\n    ma_share_mode shareMode;\n    int ossFormat;\n    int ossChannels;\n    int ossSampleRate;\n    int ossFragment;\n\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(pConfig != NULL);\n    MA_ASSERT(deviceType != ma_device_type_duplex);\n\n    pDeviceID     = pDescriptor->pDeviceID;\n    shareMode     = pDescriptor->shareMode;\n    ossFormat     = ma_format_to_oss((pDescriptor->format != ma_format_unknown) ? pDescriptor->format : ma_format_s16); /* Use s16 by default because OSS doesn't like floating point. */\n    ossChannels   = (int)(pDescriptor->channels   > 0) ? pDescriptor->channels   : MA_DEFAULT_CHANNELS;\n    ossSampleRate = (int)(pDescriptor->sampleRate > 0) ? pDescriptor->sampleRate : MA_DEFAULT_SAMPLE_RATE;\n\n    result = ma_context_open_device__oss(pDevice->pContext, deviceType, pDeviceID, shareMode, &fd);\n    if (result != MA_SUCCESS) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to open device.\");\n        return result;\n    }\n\n    /*\n    The OSS documantation is very clear about the order we should be initializing the device's properties:\n      1) Format\n      2) Channels\n      3) Sample rate.\n    */\n\n    /* Format. */\n    ossResult = ioctl(fd, SNDCTL_DSP_SETFMT, &ossFormat);\n    if (ossResult == -1) {\n        close(fd);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to set format.\");\n        return ma_result_from_errno(errno);\n    }\n\n    /* Channels. */\n    ossResult = ioctl(fd, SNDCTL_DSP_CHANNELS, &ossChannels);\n    if (ossResult == -1) {\n        close(fd);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to set channel count.\");\n        return ma_result_from_errno(errno);\n    }\n\n    /* Sample Rate. */\n    ossResult = ioctl(fd, SNDCTL_DSP_SPEED, &ossSampleRate);\n    if (ossResult == -1) {\n        close(fd);\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to set sample rate.\");\n        return ma_result_from_errno(errno);\n    }\n\n    /*\n    Buffer.\n\n    The documentation says that the fragment settings should be set as soon as possible, but I'm not sure if\n    it should be done before or after format/channels/rate.\n\n    OSS wants the fragment size in bytes and a power of 2. When setting, we specify the power, not the actual\n    value.\n    */\n    {\n        ma_uint32 periodSizeInFrames;\n        ma_uint32 periodSizeInBytes;\n        ma_uint32 ossFragmentSizePower;\n\n        periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, (ma_uint32)ossSampleRate, pConfig->performanceProfile);\n\n        periodSizeInBytes = ma_round_to_power_of_2(periodSizeInFrames * ma_get_bytes_per_frame(ma_format_from_oss(ossFormat), ossChannels));\n        if (periodSizeInBytes < 16) {\n            periodSizeInBytes = 16;\n        }\n\n        ossFragmentSizePower = 4;\n        periodSizeInBytes >>= 4;\n        while (periodSizeInBytes >>= 1) {\n            ossFragmentSizePower += 1;\n        }\n\n        ossFragment = (int)((pConfig->periods << 16) | ossFragmentSizePower);\n        ossResult = ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &ossFragment);\n        if (ossResult == -1) {\n            close(fd);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to set fragment size and period count.\");\n            return ma_result_from_errno(errno);\n        }\n    }\n\n    /* Internal settings. */\n    if (deviceType == ma_device_type_capture) {\n        pDevice->oss.fdCapture  = fd;\n    } else {\n        pDevice->oss.fdPlayback = fd;\n    }\n\n    pDescriptor->format             = ma_format_from_oss(ossFormat);\n    pDescriptor->channels           = ossChannels;\n    pDescriptor->sampleRate         = ossSampleRate;\n    ma_channel_map_init_standard(ma_standard_channel_map_sound4, pDescriptor->channelMap, ma_countof(pDescriptor->channelMap), pDescriptor->channels);\n    pDescriptor->periodCount        = (ma_uint32)(ossFragment >> 16);\n    pDescriptor->periodSizeInFrames = (ma_uint32)(1 << (ossFragment & 0xFFFF)) / ma_get_bytes_per_frame(pDescriptor->format, pDescriptor->channels);\n\n    if (pDescriptor->format == ma_format_unknown) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OSS] The device's internal format is not supported by miniaudio.\");\n        return MA_FORMAT_NOT_SUPPORTED;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_init__oss(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n    MA_ASSERT(pDevice  != NULL);\n    MA_ASSERT(pConfig  != NULL);\n\n    MA_ZERO_OBJECT(&pDevice->oss);\n\n    if (pConfig->deviceType == ma_device_type_loopback) {\n        return MA_DEVICE_TYPE_NOT_SUPPORTED;\n    }\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_fd__oss(pDevice, pConfig, pDescriptorCapture, ma_device_type_capture);\n        if (result != MA_SUCCESS) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to open device.\");\n            return result;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_result result = ma_device_init_fd__oss(pDevice, pConfig, pDescriptorPlayback, ma_device_type_playback);\n        if (result != MA_SUCCESS) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to open device.\");\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n/*\nNote on Starting and Stopping\n=============================\nIn the past I was using SNDCTL_DSP_HALT to stop the device, however this results in issues when\ntrying to resume the device again. If we use SNDCTL_DSP_HALT, the next write() or read() will\nfail. Instead what we need to do is just not write or read to and from the device when the\ndevice is not running.\n\nAs a result, both the start and stop functions for OSS are just empty stubs. The starting and\nstopping logic is handled by ma_device_write__oss() and ma_device_read__oss(). These will check\nthe device state, and if the device is stopped they will simply not do any kind of processing.\n\nThe downside to this technique is that I've noticed a fairly lengthy delay in stopping the\ndevice, up to a second. This is on a virtual machine, and as such might just be due to the\nvirtual drivers, but I'm not fully sure. I am not sure how to work around this problem so for\nthe moment that's just how it's going to have to be.\n\nWhen starting the device, OSS will automatically start it when write() or read() is called.\n*/\nstatic ma_result ma_device_start__oss(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    /* The device is automatically started with reading and writing. */\n    (void)pDevice;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop__oss(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    /* See note above on why this is empty. */\n    (void)pDevice;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_write__oss(ma_device* pDevice, const void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesWritten)\n{\n    int resultOSS;\n    ma_uint32 deviceState;\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = 0;\n    }\n\n    /* Don't do any processing if the device is stopped. */\n    deviceState = ma_device_get_state(pDevice);\n    if (deviceState != ma_device_state_started && deviceState != ma_device_state_starting) {\n        return MA_SUCCESS;\n    }\n\n    resultOSS = write(pDevice->oss.fdPlayback, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n    if (resultOSS < 0) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to send data from the client to the device.\");\n        return ma_result_from_errno(errno);\n    }\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = (ma_uint32)resultOSS / ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_read__oss(ma_device* pDevice, void* pPCMFrames, ma_uint32 frameCount, ma_uint32* pFramesRead)\n{\n    int resultOSS;\n    ma_uint32 deviceState;\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    /* Don't do any processing if the device is stopped. */\n    deviceState = ma_device_get_state(pDevice);\n    if (deviceState != ma_device_state_started && deviceState != ma_device_state_starting) {\n        return MA_SUCCESS;\n    }\n\n    resultOSS = read(pDevice->oss.fdCapture, pPCMFrames, frameCount * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels));\n    if (resultOSS < 0) {\n        ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to read data from the device to be sent to the client.\");\n        return ma_result_from_errno(errno);\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = (ma_uint32)resultOSS / ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_uninit__oss(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_oss);\n\n    (void)pContext;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init__oss(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n    int fd;\n    int ossVersion;\n    int result;\n\n    MA_ASSERT(pContext != NULL);\n\n    (void)pConfig;\n\n    /* Try opening a temporary device first so we can get version information. This is closed at the end. */\n    fd = ma_open_temp_device__oss();\n    if (fd == -1) {\n        ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to open temporary device for retrieving system properties.\");   /* Looks liks OSS isn't installed, or there are no available devices. */\n        return MA_NO_BACKEND;\n    }\n\n    /* Grab the OSS version. */\n    ossVersion = 0;\n    result = ioctl(fd, OSS_GETVERSION, &ossVersion);\n    if (result == -1) {\n        close(fd);\n        ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_ERROR, \"[OSS] Failed to retrieve OSS version.\");\n        return MA_NO_BACKEND;\n    }\n\n    /* The file handle to temp device is no longer needed. Close ASAP. */\n    close(fd);\n\n    pContext->oss.versionMajor = ((ossVersion & 0xFF0000) >> 16);\n    pContext->oss.versionMinor = ((ossVersion & 0x00FF00) >> 8);\n\n    pCallbacks->onContextInit             = ma_context_init__oss;\n    pCallbacks->onContextUninit           = ma_context_uninit__oss;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__oss;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__oss;\n    pCallbacks->onDeviceInit              = ma_device_init__oss;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__oss;\n    pCallbacks->onDeviceStart             = ma_device_start__oss;\n    pCallbacks->onDeviceStop              = ma_device_stop__oss;\n    pCallbacks->onDeviceRead              = ma_device_read__oss;\n    pCallbacks->onDeviceWrite             = ma_device_write__oss;\n    pCallbacks->onDeviceDataLoop          = NULL;\n\n    return MA_SUCCESS;\n}\n#endif  /* OSS */\n\n\n\n\n\n/******************************************************************************\n\nAAudio Backend\n\n******************************************************************************/\n#ifdef MA_HAS_AAUDIO\n\n/*#include <AAudio/AAudio.h>*/\n\ntypedef int32_t                                         ma_aaudio_result_t;\ntypedef int32_t                                         ma_aaudio_direction_t;\ntypedef int32_t                                         ma_aaudio_sharing_mode_t;\ntypedef int32_t                                         ma_aaudio_format_t;\ntypedef int32_t                                         ma_aaudio_stream_state_t;\ntypedef int32_t                                         ma_aaudio_performance_mode_t;\ntypedef int32_t                                         ma_aaudio_usage_t;\ntypedef int32_t                                         ma_aaudio_content_type_t;\ntypedef int32_t                                         ma_aaudio_input_preset_t;\ntypedef int32_t                                         ma_aaudio_allowed_capture_policy_t;\ntypedef int32_t                                         ma_aaudio_data_callback_result_t;\ntypedef struct ma_AAudioStreamBuilder_t*                ma_AAudioStreamBuilder;\ntypedef struct ma_AAudioStream_t*                       ma_AAudioStream;\n\n#define MA_AAUDIO_UNSPECIFIED                           0\n\n/* Result codes. miniaudio only cares about the success code. */\n#define MA_AAUDIO_OK                                    0\n\n/* Directions. */\n#define MA_AAUDIO_DIRECTION_OUTPUT                      0\n#define MA_AAUDIO_DIRECTION_INPUT                       1\n\n/* Sharing modes. */\n#define MA_AAUDIO_SHARING_MODE_EXCLUSIVE                0\n#define MA_AAUDIO_SHARING_MODE_SHARED                   1\n\n/* Formats. */\n#define MA_AAUDIO_FORMAT_PCM_I16                        1\n#define MA_AAUDIO_FORMAT_PCM_FLOAT                      2\n\n/* Stream states. */\n#define MA_AAUDIO_STREAM_STATE_UNINITIALIZED            0\n#define MA_AAUDIO_STREAM_STATE_UNKNOWN                  1\n#define MA_AAUDIO_STREAM_STATE_OPEN                     2\n#define MA_AAUDIO_STREAM_STATE_STARTING                 3\n#define MA_AAUDIO_STREAM_STATE_STARTED                  4\n#define MA_AAUDIO_STREAM_STATE_PAUSING                  5\n#define MA_AAUDIO_STREAM_STATE_PAUSED                   6\n#define MA_AAUDIO_STREAM_STATE_FLUSHING                 7\n#define MA_AAUDIO_STREAM_STATE_FLUSHED                  8\n#define MA_AAUDIO_STREAM_STATE_STOPPING                 9\n#define MA_AAUDIO_STREAM_STATE_STOPPED                  10\n#define MA_AAUDIO_STREAM_STATE_CLOSING                  11\n#define MA_AAUDIO_STREAM_STATE_CLOSED                   12\n#define MA_AAUDIO_STREAM_STATE_DISCONNECTED             13\n\n/* Performance modes. */\n#define MA_AAUDIO_PERFORMANCE_MODE_NONE                 10\n#define MA_AAUDIO_PERFORMANCE_MODE_POWER_SAVING         11\n#define MA_AAUDIO_PERFORMANCE_MODE_LOW_LATENCY          12\n\n/* Usage types. */\n#define MA_AAUDIO_USAGE_MEDIA                           1\n#define MA_AAUDIO_USAGE_VOICE_COMMUNICATION             2\n#define MA_AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING  3\n#define MA_AAUDIO_USAGE_ALARM                           4\n#define MA_AAUDIO_USAGE_NOTIFICATION                    5\n#define MA_AAUDIO_USAGE_NOTIFICATION_RINGTONE           6\n#define MA_AAUDIO_USAGE_NOTIFICATION_EVENT              10\n#define MA_AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY        11\n#define MA_AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE  12\n#define MA_AAUDIO_USAGE_ASSISTANCE_SONIFICATION         13\n#define MA_AAUDIO_USAGE_GAME                            14\n#define MA_AAUDIO_USAGE_ASSISTANT                       16\n#define MA_AAUDIO_SYSTEM_USAGE_EMERGENCY                1000\n#define MA_AAUDIO_SYSTEM_USAGE_SAFETY                   1001\n#define MA_AAUDIO_SYSTEM_USAGE_VEHICLE_STATUS           1002\n#define MA_AAUDIO_SYSTEM_USAGE_ANNOUNCEMENT             1003\n\n/* Content types. */\n#define MA_AAUDIO_CONTENT_TYPE_SPEECH                   1\n#define MA_AAUDIO_CONTENT_TYPE_MUSIC                    2\n#define MA_AAUDIO_CONTENT_TYPE_MOVIE                    3\n#define MA_AAUDIO_CONTENT_TYPE_SONIFICATION             4\n\n/* Input presets. */\n#define MA_AAUDIO_INPUT_PRESET_GENERIC                  1\n#define MA_AAUDIO_INPUT_PRESET_CAMCORDER                5\n#define MA_AAUDIO_INPUT_PRESET_VOICE_RECOGNITION        6\n#define MA_AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION      7\n#define MA_AAUDIO_INPUT_PRESET_UNPROCESSED              9\n#define MA_AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE        10\n\n/* Allowed Capture Policies */\n#define MA_AAUDIO_ALLOW_CAPTURE_BY_ALL                  1\n#define MA_AAUDIO_ALLOW_CAPTURE_BY_SYSTEM               2\n#define MA_AAUDIO_ALLOW_CAPTURE_BY_NONE                 3\n\n/* Callback results. */\n#define MA_AAUDIO_CALLBACK_RESULT_CONTINUE              0\n#define MA_AAUDIO_CALLBACK_RESULT_STOP                  1\n\n\ntypedef ma_aaudio_data_callback_result_t (* ma_AAudioStream_dataCallback) (ma_AAudioStream* pStream, void* pUserData, void* pAudioData, int32_t numFrames);\ntypedef void                             (* ma_AAudioStream_errorCallback)(ma_AAudioStream *pStream, void *pUserData, ma_aaudio_result_t error);\n\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudio_createStreamBuilder)                   (ma_AAudioStreamBuilder** ppBuilder);\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudioStreamBuilder_delete)                   (ma_AAudioStreamBuilder* pBuilder);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setDeviceId)              (ma_AAudioStreamBuilder* pBuilder, int32_t deviceId);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setDirection)             (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_direction_t direction);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setSharingMode)           (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_sharing_mode_t sharingMode);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setFormat)                (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_format_t format);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setChannelCount)          (ma_AAudioStreamBuilder* pBuilder, int32_t channelCount);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setSampleRate)            (ma_AAudioStreamBuilder* pBuilder, int32_t sampleRate);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setBufferCapacityInFrames)(ma_AAudioStreamBuilder* pBuilder, int32_t numFrames);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setFramesPerDataCallback) (ma_AAudioStreamBuilder* pBuilder, int32_t numFrames);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setDataCallback)          (ma_AAudioStreamBuilder* pBuilder, ma_AAudioStream_dataCallback callback, void* pUserData);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setErrorCallback)         (ma_AAudioStreamBuilder* pBuilder, ma_AAudioStream_errorCallback callback, void* pUserData);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setPerformanceMode)       (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_performance_mode_t mode);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setUsage)                 (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_usage_t contentType);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setContentType)           (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_content_type_t contentType);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setInputPreset)           (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_input_preset_t inputPreset);\ntypedef void                     (* MA_PFN_AAudioStreamBuilder_setAllowedCapturePolicy)  (ma_AAudioStreamBuilder* pBuilder, ma_aaudio_allowed_capture_policy_t policy);\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudioStreamBuilder_openStream)               (ma_AAudioStreamBuilder* pBuilder, ma_AAudioStream** ppStream);\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudioStream_close)                           (ma_AAudioStream* pStream);\ntypedef ma_aaudio_stream_state_t (* MA_PFN_AAudioStream_getState)                        (ma_AAudioStream* pStream);\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudioStream_waitForStateChange)              (ma_AAudioStream* pStream, ma_aaudio_stream_state_t inputState, ma_aaudio_stream_state_t* pNextState, int64_t timeoutInNanoseconds);\ntypedef ma_aaudio_format_t       (* MA_PFN_AAudioStream_getFormat)                       (ma_AAudioStream* pStream);\ntypedef int32_t                  (* MA_PFN_AAudioStream_getChannelCount)                 (ma_AAudioStream* pStream);\ntypedef int32_t                  (* MA_PFN_AAudioStream_getSampleRate)                   (ma_AAudioStream* pStream);\ntypedef int32_t                  (* MA_PFN_AAudioStream_getBufferCapacityInFrames)       (ma_AAudioStream* pStream);\ntypedef int32_t                  (* MA_PFN_AAudioStream_getFramesPerDataCallback)        (ma_AAudioStream* pStream);\ntypedef int32_t                  (* MA_PFN_AAudioStream_getFramesPerBurst)               (ma_AAudioStream* pStream);\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudioStream_requestStart)                    (ma_AAudioStream* pStream);\ntypedef ma_aaudio_result_t       (* MA_PFN_AAudioStream_requestStop)                     (ma_AAudioStream* pStream);\n\nstatic ma_result ma_result_from_aaudio(ma_aaudio_result_t resultAA)\n{\n    switch (resultAA)\n    {\n        case MA_AAUDIO_OK: return MA_SUCCESS;\n        default: break;\n    }\n\n    return MA_ERROR;\n}\n\nstatic ma_aaudio_usage_t ma_to_usage__aaudio(ma_aaudio_usage usage)\n{\n    switch (usage) {\n        case ma_aaudio_usage_media:                          return MA_AAUDIO_USAGE_MEDIA;\n        case ma_aaudio_usage_voice_communication:            return MA_AAUDIO_USAGE_VOICE_COMMUNICATION;\n        case ma_aaudio_usage_voice_communication_signalling: return MA_AAUDIO_USAGE_VOICE_COMMUNICATION_SIGNALLING;\n        case ma_aaudio_usage_alarm:                          return MA_AAUDIO_USAGE_ALARM;\n        case ma_aaudio_usage_notification:                   return MA_AAUDIO_USAGE_NOTIFICATION;\n        case ma_aaudio_usage_notification_ringtone:          return MA_AAUDIO_USAGE_NOTIFICATION_RINGTONE;\n        case ma_aaudio_usage_notification_event:             return MA_AAUDIO_USAGE_NOTIFICATION_EVENT;\n        case ma_aaudio_usage_assistance_accessibility:       return MA_AAUDIO_USAGE_ASSISTANCE_ACCESSIBILITY;\n        case ma_aaudio_usage_assistance_navigation_guidance: return MA_AAUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE;\n        case ma_aaudio_usage_assistance_sonification:        return MA_AAUDIO_USAGE_ASSISTANCE_SONIFICATION;\n        case ma_aaudio_usage_game:                           return MA_AAUDIO_USAGE_GAME;\n        case ma_aaudio_usage_assitant:                       return MA_AAUDIO_USAGE_ASSISTANT;\n        case ma_aaudio_usage_emergency:                      return MA_AAUDIO_SYSTEM_USAGE_EMERGENCY;\n        case ma_aaudio_usage_safety:                         return MA_AAUDIO_SYSTEM_USAGE_SAFETY;\n        case ma_aaudio_usage_vehicle_status:                 return MA_AAUDIO_SYSTEM_USAGE_VEHICLE_STATUS;\n        case ma_aaudio_usage_announcement:                   return MA_AAUDIO_SYSTEM_USAGE_ANNOUNCEMENT;\n        default: break;\n    }\n\n    return MA_AAUDIO_USAGE_MEDIA;\n}\n\nstatic ma_aaudio_content_type_t ma_to_content_type__aaudio(ma_aaudio_content_type contentType)\n{\n    switch (contentType) {\n        case ma_aaudio_content_type_speech:       return MA_AAUDIO_CONTENT_TYPE_SPEECH;\n        case ma_aaudio_content_type_music:        return MA_AAUDIO_CONTENT_TYPE_MUSIC;\n        case ma_aaudio_content_type_movie:        return MA_AAUDIO_CONTENT_TYPE_MOVIE;\n        case ma_aaudio_content_type_sonification: return MA_AAUDIO_CONTENT_TYPE_SONIFICATION;\n        default: break;\n    }\n\n    return MA_AAUDIO_CONTENT_TYPE_SPEECH;\n}\n\nstatic ma_aaudio_input_preset_t ma_to_input_preset__aaudio(ma_aaudio_input_preset inputPreset)\n{\n    switch (inputPreset) {\n        case ma_aaudio_input_preset_generic:             return MA_AAUDIO_INPUT_PRESET_GENERIC;\n        case ma_aaudio_input_preset_camcorder:           return MA_AAUDIO_INPUT_PRESET_CAMCORDER;\n        case ma_aaudio_input_preset_voice_recognition:   return MA_AAUDIO_INPUT_PRESET_VOICE_RECOGNITION;\n        case ma_aaudio_input_preset_voice_communication: return MA_AAUDIO_INPUT_PRESET_VOICE_COMMUNICATION;\n        case ma_aaudio_input_preset_unprocessed:         return MA_AAUDIO_INPUT_PRESET_UNPROCESSED;\n        case ma_aaudio_input_preset_voice_performance:   return MA_AAUDIO_INPUT_PRESET_VOICE_PERFORMANCE;\n        default: break;\n    }\n\n    return MA_AAUDIO_INPUT_PRESET_GENERIC;\n}\n\nstatic ma_aaudio_allowed_capture_policy_t ma_to_allowed_capture_policy__aaudio(ma_aaudio_allowed_capture_policy allowedCapturePolicy)\n{\n    switch (allowedCapturePolicy) {\n        case ma_aaudio_allow_capture_by_all:    return MA_AAUDIO_ALLOW_CAPTURE_BY_ALL;\n        case ma_aaudio_allow_capture_by_system: return MA_AAUDIO_ALLOW_CAPTURE_BY_SYSTEM;\n        case ma_aaudio_allow_capture_by_none:   return MA_AAUDIO_ALLOW_CAPTURE_BY_NONE;\n        default: break;\n    }\n\n    return MA_AAUDIO_ALLOW_CAPTURE_BY_ALL;\n}\n\nstatic void ma_stream_error_callback__aaudio(ma_AAudioStream* pStream, void* pUserData, ma_aaudio_result_t error)\n{\n    ma_result result;\n    ma_job job;\n    ma_device* pDevice = (ma_device*)pUserData;\n    MA_ASSERT(pDevice != NULL);\n\n    (void)error;\n\n    ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[AAudio] ERROR CALLBACK: error=%d, AAudioStream_getState()=%d\\n\", error, ((MA_PFN_AAudioStream_getState)pDevice->pContext->aaudio.AAudioStream_getState)(pStream));\n\n    /*\n    When we get an error, we'll assume that the stream is in an erroneous state and needs to be restarted. From the documentation,\n    we cannot do this from the error callback. Therefore we are going to use an event thread for the AAudio backend to do this\n    cleanly and safely.\n    */\n    job = ma_job_init(MA_JOB_TYPE_DEVICE_AAUDIO_REROUTE);\n    job.data.device.aaudio.reroute.pDevice = pDevice;\n\n    if (pStream == pDevice->aaudio.pStreamCapture) {\n        job.data.device.aaudio.reroute.deviceType = ma_device_type_capture;\n    }\n    else {\n        job.data.device.aaudio.reroute.deviceType = ma_device_type_playback;\n    }\n\n    result = ma_device_job_thread_post(&pDevice->pContext->aaudio.jobThread, &job);\n    if (result != MA_SUCCESS) {\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[AAudio] Device Disconnected. Failed to post job for rerouting.\\n\");\n        return;\n    }\n}\n\nstatic ma_aaudio_data_callback_result_t ma_stream_data_callback_capture__aaudio(ma_AAudioStream* pStream, void* pUserData, void* pAudioData, int32_t frameCount)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    MA_ASSERT(pDevice != NULL);\n\n    ma_device_handle_backend_data_callback(pDevice, NULL, pAudioData, frameCount);\n\n    (void)pStream;\n    return MA_AAUDIO_CALLBACK_RESULT_CONTINUE;\n}\n\nstatic ma_aaudio_data_callback_result_t ma_stream_data_callback_playback__aaudio(ma_AAudioStream* pStream, void* pUserData, void* pAudioData, int32_t frameCount)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    MA_ASSERT(pDevice != NULL);\n\n    ma_device_handle_backend_data_callback(pDevice, pAudioData, NULL, frameCount);\n\n    (void)pStream;\n    return MA_AAUDIO_CALLBACK_RESULT_CONTINUE;\n}\n\nstatic ma_result ma_create_and_configure_AAudioStreamBuilder__aaudio(ma_context* pContext, const ma_device_id* pDeviceID, ma_device_type deviceType, ma_share_mode shareMode, const ma_device_descriptor* pDescriptor, const ma_device_config* pConfig, ma_device* pDevice, ma_AAudioStreamBuilder** ppBuilder)\n{\n    ma_AAudioStreamBuilder* pBuilder;\n    ma_aaudio_result_t resultAA;\n\n    /* Safety. */\n    *ppBuilder = NULL;\n\n    resultAA = ((MA_PFN_AAudio_createStreamBuilder)pContext->aaudio.AAudio_createStreamBuilder)(&pBuilder);\n    if (resultAA != MA_AAUDIO_OK) {\n        return ma_result_from_aaudio(resultAA);\n    }\n\n    if (pDeviceID != NULL) {\n        ((MA_PFN_AAudioStreamBuilder_setDeviceId)pContext->aaudio.AAudioStreamBuilder_setDeviceId)(pBuilder, pDeviceID->aaudio);\n    }\n\n    ((MA_PFN_AAudioStreamBuilder_setDirection)pContext->aaudio.AAudioStreamBuilder_setDirection)(pBuilder, (deviceType == ma_device_type_playback) ? MA_AAUDIO_DIRECTION_OUTPUT : MA_AAUDIO_DIRECTION_INPUT);\n    ((MA_PFN_AAudioStreamBuilder_setSharingMode)pContext->aaudio.AAudioStreamBuilder_setSharingMode)(pBuilder, (shareMode == ma_share_mode_shared) ? MA_AAUDIO_SHARING_MODE_SHARED : MA_AAUDIO_SHARING_MODE_EXCLUSIVE);\n\n\n    /* If we have a device descriptor make sure we configure the stream builder to take our requested parameters. */\n    if (pDescriptor != NULL) {\n        MA_ASSERT(pConfig != NULL); /* We must have a device config if we also have a descriptor. The config is required for AAudio specific configuration options. */\n\n        if (pDescriptor->sampleRate != 0) {\n            ((MA_PFN_AAudioStreamBuilder_setSampleRate)pContext->aaudio.AAudioStreamBuilder_setSampleRate)(pBuilder, pDescriptor->sampleRate);\n        }\n\n        if (deviceType == ma_device_type_capture) {\n            if (pDescriptor->channels != 0) {\n                ((MA_PFN_AAudioStreamBuilder_setChannelCount)pContext->aaudio.AAudioStreamBuilder_setChannelCount)(pBuilder, pDescriptor->channels);\n            }\n            if (pDescriptor->format != ma_format_unknown) {\n                ((MA_PFN_AAudioStreamBuilder_setFormat)pContext->aaudio.AAudioStreamBuilder_setFormat)(pBuilder, (pDescriptor->format == ma_format_s16) ? MA_AAUDIO_FORMAT_PCM_I16 : MA_AAUDIO_FORMAT_PCM_FLOAT);\n            }\n        } else {\n            if (pDescriptor->channels != 0) {\n                ((MA_PFN_AAudioStreamBuilder_setChannelCount)pContext->aaudio.AAudioStreamBuilder_setChannelCount)(pBuilder, pDescriptor->channels);\n            }\n            if (pDescriptor->format != ma_format_unknown) {\n                ((MA_PFN_AAudioStreamBuilder_setFormat)pContext->aaudio.AAudioStreamBuilder_setFormat)(pBuilder, (pDescriptor->format == ma_format_s16) ? MA_AAUDIO_FORMAT_PCM_I16 : MA_AAUDIO_FORMAT_PCM_FLOAT);\n            }\n        }\n\n\n        /*\n        There have been reports where setting the frames per data callback results in an error\n        later on from Android. To address this, I'm experimenting with simply not setting it on\n        anything from Android 11 and earlier. Suggestions welcome on how we might be able to make\n        this more targetted.\n        */\n        if (!pConfig->aaudio.enableCompatibilityWorkarounds || ma_android_sdk_version() > 30) {\n            /*\n            AAudio is annoying when it comes to it's buffer calculation stuff because it doesn't let you\n            retrieve the actual sample rate until after you've opened the stream. But you need to configure\n            the buffer capacity before you open the stream... :/\n\n            To solve, we're just going to assume MA_DEFAULT_SAMPLE_RATE (48000) and move on.\n            */\n            ma_uint32 bufferCapacityInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptor, pDescriptor->sampleRate, pConfig->performanceProfile) * pDescriptor->periodCount;\n\n            ((MA_PFN_AAudioStreamBuilder_setBufferCapacityInFrames)pContext->aaudio.AAudioStreamBuilder_setBufferCapacityInFrames)(pBuilder, bufferCapacityInFrames);\n            ((MA_PFN_AAudioStreamBuilder_setFramesPerDataCallback)pContext->aaudio.AAudioStreamBuilder_setFramesPerDataCallback)(pBuilder, bufferCapacityInFrames / pDescriptor->periodCount);\n        }\n\n        if (deviceType == ma_device_type_capture) {\n            if (pConfig->aaudio.inputPreset != ma_aaudio_input_preset_default && pContext->aaudio.AAudioStreamBuilder_setInputPreset != NULL) {\n                ((MA_PFN_AAudioStreamBuilder_setInputPreset)pContext->aaudio.AAudioStreamBuilder_setInputPreset)(pBuilder, ma_to_input_preset__aaudio(pConfig->aaudio.inputPreset));\n            }\n\n            ((MA_PFN_AAudioStreamBuilder_setDataCallback)pContext->aaudio.AAudioStreamBuilder_setDataCallback)(pBuilder, ma_stream_data_callback_capture__aaudio, (void*)pDevice);\n        } else {\n            if (pConfig->aaudio.usage != ma_aaudio_usage_default && pContext->aaudio.AAudioStreamBuilder_setUsage != NULL) {\n                ((MA_PFN_AAudioStreamBuilder_setUsage)pContext->aaudio.AAudioStreamBuilder_setUsage)(pBuilder, ma_to_usage__aaudio(pConfig->aaudio.usage));\n            }\n\n            if (pConfig->aaudio.contentType != ma_aaudio_content_type_default && pContext->aaudio.AAudioStreamBuilder_setContentType != NULL) {\n                ((MA_PFN_AAudioStreamBuilder_setContentType)pContext->aaudio.AAudioStreamBuilder_setContentType)(pBuilder, ma_to_content_type__aaudio(pConfig->aaudio.contentType));\n            }\n\n            if (pConfig->aaudio.allowedCapturePolicy != ma_aaudio_allow_capture_default && pContext->aaudio.AAudioStreamBuilder_setAllowedCapturePolicy != NULL) {\n                ((MA_PFN_AAudioStreamBuilder_setAllowedCapturePolicy)pContext->aaudio.AAudioStreamBuilder_setAllowedCapturePolicy)(pBuilder, ma_to_allowed_capture_policy__aaudio(pConfig->aaudio.allowedCapturePolicy));\n            }\n\n            ((MA_PFN_AAudioStreamBuilder_setDataCallback)pContext->aaudio.AAudioStreamBuilder_setDataCallback)(pBuilder, ma_stream_data_callback_playback__aaudio, (void*)pDevice);\n        }\n\n        /* Not sure how this affects things, but since there's a mapping between miniaudio's performance profiles and AAudio's performance modes, let go ahead and set it. */\n        ((MA_PFN_AAudioStreamBuilder_setPerformanceMode)pContext->aaudio.AAudioStreamBuilder_setPerformanceMode)(pBuilder, (pConfig->performanceProfile == ma_performance_profile_low_latency) ? MA_AAUDIO_PERFORMANCE_MODE_LOW_LATENCY : MA_AAUDIO_PERFORMANCE_MODE_NONE);\n\n        /* We need to set an error callback to detect device changes. */\n        if (pDevice != NULL) {  /* <-- pDevice should never be null if pDescriptor is not null, which is always the case if we hit this branch. Check anyway for safety. */\n            ((MA_PFN_AAudioStreamBuilder_setErrorCallback)pContext->aaudio.AAudioStreamBuilder_setErrorCallback)(pBuilder, ma_stream_error_callback__aaudio, (void*)pDevice);\n        }\n    }\n\n    *ppBuilder = pBuilder;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_open_stream_and_close_builder__aaudio(ma_context* pContext, ma_AAudioStreamBuilder* pBuilder, ma_AAudioStream** ppStream)\n{\n    ma_result result;\n\n    result = ma_result_from_aaudio(((MA_PFN_AAudioStreamBuilder_openStream)pContext->aaudio.AAudioStreamBuilder_openStream)(pBuilder, ppStream));\n    ((MA_PFN_AAudioStreamBuilder_delete)pContext->aaudio.AAudioStreamBuilder_delete)(pBuilder);\n\n    return result;\n}\n\nstatic ma_result ma_open_stream_basic__aaudio(ma_context* pContext, const ma_device_id* pDeviceID, ma_device_type deviceType, ma_share_mode shareMode, ma_AAudioStream** ppStream)\n{\n    ma_result result;\n    ma_AAudioStreamBuilder* pBuilder;\n\n    *ppStream = NULL;\n\n    result = ma_create_and_configure_AAudioStreamBuilder__aaudio(pContext, pDeviceID, deviceType, shareMode, NULL, NULL, NULL, &pBuilder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_open_stream_and_close_builder__aaudio(pContext, pBuilder, ppStream);\n}\n\nstatic ma_result ma_open_stream__aaudio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_type deviceType, const ma_device_descriptor* pDescriptor, ma_AAudioStream** ppStream)\n{\n    ma_result result;\n    ma_AAudioStreamBuilder* pBuilder;\n\n    MA_ASSERT(pDevice != NULL);\n    MA_ASSERT(pDescriptor != NULL);\n    MA_ASSERT(deviceType != ma_device_type_duplex);   /* This function should not be called for a full-duplex device type. */\n\n    *ppStream = NULL;\n\n    result = ma_create_and_configure_AAudioStreamBuilder__aaudio(pDevice->pContext, pDescriptor->pDeviceID, deviceType, pDescriptor->shareMode, pDescriptor, pConfig, pDevice, &pBuilder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_open_stream_and_close_builder__aaudio(pDevice->pContext, pBuilder, ppStream);\n}\n\nstatic ma_result ma_close_stream__aaudio(ma_context* pContext, ma_AAudioStream* pStream)\n{\n    return ma_result_from_aaudio(((MA_PFN_AAudioStream_close)pContext->aaudio.AAudioStream_close)(pStream));\n}\n\nstatic ma_bool32 ma_has_default_device__aaudio(ma_context* pContext, ma_device_type deviceType)\n{\n    /* The only way to know this is to try creating a stream. */\n    ma_AAudioStream* pStream;\n    ma_result result = ma_open_stream_basic__aaudio(pContext, NULL, deviceType, ma_share_mode_shared, &pStream);\n    if (result != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n\n    ma_close_stream__aaudio(pContext, pStream);\n    return MA_TRUE;\n}\n\nstatic ma_result ma_wait_for_simple_state_transition__aaudio(ma_context* pContext, ma_AAudioStream* pStream, ma_aaudio_stream_state_t oldState, ma_aaudio_stream_state_t newState)\n{\n    ma_aaudio_stream_state_t actualNewState;\n    ma_aaudio_result_t resultAA = ((MA_PFN_AAudioStream_waitForStateChange)pContext->aaudio.AAudioStream_waitForStateChange)(pStream, oldState, &actualNewState, 5000000000); /* 5 second timeout. */\n    if (resultAA != MA_AAUDIO_OK) {\n        return ma_result_from_aaudio(resultAA);\n    }\n\n    if (newState != actualNewState) {\n        return MA_ERROR;   /* Failed to transition into the expected state. */\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_context_enumerate_devices__aaudio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_bool32 cbResult = MA_TRUE;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(callback != NULL);\n\n    /* Unfortunately AAudio does not have an enumeration API. Therefore I'm only going to report default devices, but only if it can instantiate a stream. */\n\n    /* Playback. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        MA_ZERO_OBJECT(&deviceInfo);\n        deviceInfo.id.aaudio = MA_AAUDIO_UNSPECIFIED;\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n\n        if (ma_has_default_device__aaudio(pContext, ma_device_type_playback)) {\n            cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n        }\n    }\n\n    /* Capture. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        MA_ZERO_OBJECT(&deviceInfo);\n        deviceInfo.id.aaudio = MA_AAUDIO_UNSPECIFIED;\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n\n        if (ma_has_default_device__aaudio(pContext, ma_device_type_capture)) {\n            cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_context_add_native_data_format_from_AAudioStream_ex__aaudio(ma_context* pContext, ma_AAudioStream* pStream, ma_format format, ma_uint32 flags, ma_device_info* pDeviceInfo)\n{\n    MA_ASSERT(pContext    != NULL);\n    MA_ASSERT(pStream     != NULL);\n    MA_ASSERT(pDeviceInfo != NULL);\n\n    pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format     = format;\n    pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels   = ((MA_PFN_AAudioStream_getChannelCount)pContext->aaudio.AAudioStream_getChannelCount)(pStream);\n    pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = ((MA_PFN_AAudioStream_getSampleRate)pContext->aaudio.AAudioStream_getSampleRate)(pStream);\n    pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags      = flags;\n    pDeviceInfo->nativeDataFormatCount += 1;\n}\n\nstatic void ma_context_add_native_data_format_from_AAudioStream__aaudio(ma_context* pContext, ma_AAudioStream* pStream, ma_uint32 flags, ma_device_info* pDeviceInfo)\n{\n    /* AAudio supports s16 and f32. */\n    ma_context_add_native_data_format_from_AAudioStream_ex__aaudio(pContext, pStream, ma_format_f32, flags, pDeviceInfo);\n    ma_context_add_native_data_format_from_AAudioStream_ex__aaudio(pContext, pStream, ma_format_s16, flags, pDeviceInfo);\n}\n\nstatic ma_result ma_context_get_device_info__aaudio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    ma_AAudioStream* pStream;\n    ma_result result;\n\n    MA_ASSERT(pContext != NULL);\n\n    /* ID */\n    if (pDeviceID != NULL) {\n        pDeviceInfo->id.aaudio = pDeviceID->aaudio;\n    } else {\n        pDeviceInfo->id.aaudio = MA_AAUDIO_UNSPECIFIED;\n    }\n\n    /* Name */\n    if (deviceType == ma_device_type_playback) {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n    } else {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n    }\n\n\n    pDeviceInfo->nativeDataFormatCount = 0;\n\n    /* We'll need to open the device to get accurate sample rate and channel count information. */\n    result = ma_open_stream_basic__aaudio(pContext, pDeviceID, deviceType, ma_share_mode_shared, &pStream);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    ma_context_add_native_data_format_from_AAudioStream__aaudio(pContext, pStream, 0, pDeviceInfo);\n\n    ma_close_stream__aaudio(pContext, pStream);\n    pStream = NULL;\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_device_uninit__aaudio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ma_close_stream__aaudio(pDevice->pContext, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n        pDevice->aaudio.pStreamCapture = NULL;\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_close_stream__aaudio(pDevice->pContext, (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback);\n        pDevice->aaudio.pStreamPlayback = NULL;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_init_by_type__aaudio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_type deviceType, ma_device_descriptor* pDescriptor, ma_AAudioStream** ppStream)\n{\n    ma_result result;\n    int32_t bufferCapacityInFrames;\n    int32_t framesPerDataCallback;\n    ma_AAudioStream* pStream;\n\n    MA_ASSERT(pDevice     != NULL);\n    MA_ASSERT(pConfig     != NULL);\n    MA_ASSERT(pDescriptor != NULL);\n\n    *ppStream = NULL;   /* Safety. */\n\n    /* First step is to open the stream. From there we'll be able to extract the internal configuration. */\n    result = ma_open_stream__aaudio(pDevice, pConfig, deviceType, pDescriptor, &pStream);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to open the AAudio stream. */\n    }\n\n    /* Now extract the internal configuration. */\n    pDescriptor->format     = (((MA_PFN_AAudioStream_getFormat)pDevice->pContext->aaudio.AAudioStream_getFormat)(pStream) == MA_AAUDIO_FORMAT_PCM_I16) ? ma_format_s16 : ma_format_f32;\n    pDescriptor->channels   = ((MA_PFN_AAudioStream_getChannelCount)pDevice->pContext->aaudio.AAudioStream_getChannelCount)(pStream);\n    pDescriptor->sampleRate = ((MA_PFN_AAudioStream_getSampleRate)pDevice->pContext->aaudio.AAudioStream_getSampleRate)(pStream);\n\n    /* For the channel map we need to be sure we don't overflow any buffers. */\n    if (pDescriptor->channels <= MA_MAX_CHANNELS) {\n        ma_channel_map_init_standard(ma_standard_channel_map_default, pDescriptor->channelMap, ma_countof(pDescriptor->channelMap), pDescriptor->channels); /* <-- Cannot find info on channel order, so assuming a default. */\n    } else {\n        ma_channel_map_init_blank(pDescriptor->channelMap, MA_MAX_CHANNELS); /* Too many channels. Use a blank channel map. */\n    }\n\n    bufferCapacityInFrames = ((MA_PFN_AAudioStream_getBufferCapacityInFrames)pDevice->pContext->aaudio.AAudioStream_getBufferCapacityInFrames)(pStream);\n    framesPerDataCallback = ((MA_PFN_AAudioStream_getFramesPerDataCallback)pDevice->pContext->aaudio.AAudioStream_getFramesPerDataCallback)(pStream);\n\n    if (framesPerDataCallback > 0) {\n        pDescriptor->periodSizeInFrames = framesPerDataCallback;\n        pDescriptor->periodCount        = bufferCapacityInFrames / framesPerDataCallback;\n    } else {\n        pDescriptor->periodSizeInFrames = bufferCapacityInFrames;\n        pDescriptor->periodCount        = 1;\n    }\n\n    *ppStream = pStream;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_init__aaudio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n    ma_result result;\n\n    MA_ASSERT(pDevice != NULL);\n\n    if (pConfig->deviceType == ma_device_type_loopback) {\n        return MA_DEVICE_TYPE_NOT_SUPPORTED;\n    }\n\n    pDevice->aaudio.usage                   = pConfig->aaudio.usage;\n    pDevice->aaudio.contentType             = pConfig->aaudio.contentType;\n    pDevice->aaudio.inputPreset             = pConfig->aaudio.inputPreset;\n    pDevice->aaudio.allowedCapturePolicy    = pConfig->aaudio.allowedCapturePolicy;\n    pDevice->aaudio.noAutoStartAfterReroute = pConfig->aaudio.noAutoStartAfterReroute;\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        result = ma_device_init_by_type__aaudio(pDevice, pConfig, ma_device_type_capture, pDescriptorCapture, (ma_AAudioStream**)&pDevice->aaudio.pStreamCapture);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        result = ma_device_init_by_type__aaudio(pDevice, pConfig, ma_device_type_playback, pDescriptorPlayback, (ma_AAudioStream**)&pDevice->aaudio.pStreamPlayback);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_start_stream__aaudio(ma_device* pDevice, ma_AAudioStream* pStream)\n{\n    ma_aaudio_result_t resultAA;\n    ma_aaudio_stream_state_t currentState;\n\n    MA_ASSERT(pDevice != NULL);\n\n    resultAA = ((MA_PFN_AAudioStream_requestStart)pDevice->pContext->aaudio.AAudioStream_requestStart)(pStream);\n    if (resultAA != MA_AAUDIO_OK) {\n        return ma_result_from_aaudio(resultAA);\n    }\n\n    /* Do we actually need to wait for the device to transition into it's started state? */\n\n    /* The device should be in either a starting or started state. If it's not set to started we need to wait for it to transition. It should go from starting to started. */\n    currentState = ((MA_PFN_AAudioStream_getState)pDevice->pContext->aaudio.AAudioStream_getState)(pStream);\n    if (currentState != MA_AAUDIO_STREAM_STATE_STARTED) {\n        ma_result result;\n\n        if (currentState != MA_AAUDIO_STREAM_STATE_STARTING) {\n            return MA_ERROR;   /* Expecting the stream to be a starting or started state. */\n        }\n\n        result = ma_wait_for_simple_state_transition__aaudio(pDevice->pContext, pStream, currentState, MA_AAUDIO_STREAM_STATE_STARTED);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop_stream__aaudio(ma_device* pDevice, ma_AAudioStream* pStream)\n{\n    ma_aaudio_result_t resultAA;\n    ma_aaudio_stream_state_t currentState;\n\n    MA_ASSERT(pDevice != NULL);\n\n    /*\n    From the AAudio documentation:\n\n        The stream will stop after all of the data currently buffered has been played.\n\n    This maps with miniaudio's requirement that device's be drained which means we don't need to implement any draining logic.\n    */\n    currentState = ((MA_PFN_AAudioStream_getState)pDevice->pContext->aaudio.AAudioStream_getState)(pStream);\n    if (currentState == MA_AAUDIO_STREAM_STATE_DISCONNECTED) {\n        return MA_SUCCESS;  /* The device is disconnected. Don't try stopping it. */\n    }\n\n    resultAA = ((MA_PFN_AAudioStream_requestStop)pDevice->pContext->aaudio.AAudioStream_requestStop)(pStream);\n    if (resultAA != MA_AAUDIO_OK) {\n        return ma_result_from_aaudio(resultAA);\n    }\n\n    /* The device should be in either a stopping or stopped state. If it's not set to started we need to wait for it to transition. It should go from stopping to stopped. */\n    currentState = ((MA_PFN_AAudioStream_getState)pDevice->pContext->aaudio.AAudioStream_getState)(pStream);\n    if (currentState != MA_AAUDIO_STREAM_STATE_STOPPED) {\n        ma_result result;\n\n        if (currentState != MA_AAUDIO_STREAM_STATE_STOPPING) {\n            return MA_ERROR;   /* Expecting the stream to be a stopping or stopped state. */\n        }\n\n        result = ma_wait_for_simple_state_transition__aaudio(pDevice->pContext, pStream, currentState, MA_AAUDIO_STREAM_STATE_STOPPED);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_start__aaudio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ma_result result = ma_device_start_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_result result = ma_device_start_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback);\n        if (result != MA_SUCCESS) {\n            if (pDevice->type == ma_device_type_duplex) {\n                ma_device_stop_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n            }\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop__aaudio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ma_result result = ma_device_stop_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_result result = ma_device_stop_stream__aaudio(pDevice, (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    ma_device__on_notification_stopped(pDevice);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_reinit__aaudio(ma_device* pDevice, ma_device_type deviceType)\n{\n    ma_result result;\n\n    MA_ASSERT(pDevice != NULL);\n\n    /* The first thing to do is close the streams. */\n    if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex) {\n        ma_close_stream__aaudio(pDevice->pContext, (ma_AAudioStream*)pDevice->aaudio.pStreamCapture);\n        pDevice->aaudio.pStreamCapture = NULL;\n    }\n\n    if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) {\n        ma_close_stream__aaudio(pDevice->pContext, (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback);\n        pDevice->aaudio.pStreamPlayback = NULL;\n    }\n\n    /* Now we need to reinitialize each streams. The hardest part with this is just filling output the config and descriptors. */\n    {\n        ma_device_config deviceConfig;\n        ma_device_descriptor descriptorPlayback;\n        ma_device_descriptor descriptorCapture;\n\n        deviceConfig = ma_device_config_init(deviceType);\n        deviceConfig.playback.pDeviceID             = NULL; /* Only doing rerouting with default devices. */\n        deviceConfig.playback.shareMode             = pDevice->playback.shareMode;\n        deviceConfig.playback.format                = pDevice->playback.format;\n        deviceConfig.playback.channels              = pDevice->playback.channels;\n        deviceConfig.capture.pDeviceID              = NULL; /* Only doing rerouting with default devices. */\n        deviceConfig.capture.shareMode              = pDevice->capture.shareMode;\n        deviceConfig.capture.format                 = pDevice->capture.format;\n        deviceConfig.capture.channels               = pDevice->capture.channels;\n        deviceConfig.sampleRate                     = pDevice->sampleRate;\n        deviceConfig.aaudio.usage                   = pDevice->aaudio.usage;\n        deviceConfig.aaudio.contentType             = pDevice->aaudio.contentType;\n        deviceConfig.aaudio.inputPreset             = pDevice->aaudio.inputPreset;\n        deviceConfig.aaudio.allowedCapturePolicy    = pDevice->aaudio.allowedCapturePolicy;\n        deviceConfig.aaudio.noAutoStartAfterReroute = pDevice->aaudio.noAutoStartAfterReroute;\n        deviceConfig.periods                        = 1;\n\n        /* Try to get an accurate period size. */\n        if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) {\n            deviceConfig.periodSizeInFrames = pDevice->playback.internalPeriodSizeInFrames;\n        } else {\n            deviceConfig.periodSizeInFrames = pDevice->capture.internalPeriodSizeInFrames;\n        }\n\n        if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) {\n            descriptorCapture.pDeviceID           = deviceConfig.capture.pDeviceID;\n            descriptorCapture.shareMode           = deviceConfig.capture.shareMode;\n            descriptorCapture.format              = deviceConfig.capture.format;\n            descriptorCapture.channels            = deviceConfig.capture.channels;\n            descriptorCapture.sampleRate          = deviceConfig.sampleRate;\n            descriptorCapture.periodSizeInFrames  = deviceConfig.periodSizeInFrames;\n            descriptorCapture.periodCount         = deviceConfig.periods;\n        }\n\n        if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) {\n            descriptorPlayback.pDeviceID          = deviceConfig.playback.pDeviceID;\n            descriptorPlayback.shareMode          = deviceConfig.playback.shareMode;\n            descriptorPlayback.format             = deviceConfig.playback.format;\n            descriptorPlayback.channels           = deviceConfig.playback.channels;\n            descriptorPlayback.sampleRate         = deviceConfig.sampleRate;\n            descriptorPlayback.periodSizeInFrames = deviceConfig.periodSizeInFrames;\n            descriptorPlayback.periodCount        = deviceConfig.periods;\n        }\n\n        result = ma_device_init__aaudio(pDevice, &deviceConfig, &descriptorPlayback, &descriptorCapture);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        result = ma_device_post_init(pDevice, deviceType, &descriptorPlayback, &descriptorCapture);\n        if (result != MA_SUCCESS) {\n            ma_device_uninit__aaudio(pDevice);\n            return result;\n        }\n\n        /* We'll only ever do this in response to a reroute. */\n        ma_device__on_notification_rerouted(pDevice);\n\n        /* If the device is started, start the streams. Maybe make this configurable? */\n        if (ma_device_get_state(pDevice) == ma_device_state_started) {\n            if (pDevice->aaudio.noAutoStartAfterReroute == MA_FALSE) {\n                ma_device_start__aaudio(pDevice);\n            } else {\n                ma_device_stop(pDevice);    /* Do a full device stop so we set internal state correctly. */\n            }\n        }\n\n        return MA_SUCCESS;\n    }\n}\n\nstatic ma_result ma_device_get_info__aaudio(ma_device* pDevice, ma_device_type type, ma_device_info* pDeviceInfo)\n{\n    ma_AAudioStream* pStream = NULL;\n\n    MA_ASSERT(pDevice     != NULL);\n    MA_ASSERT(type        != ma_device_type_duplex);\n    MA_ASSERT(pDeviceInfo != NULL);\n\n    if (type == ma_device_type_playback) {\n        pStream = (ma_AAudioStream*)pDevice->aaudio.pStreamCapture;\n        pDeviceInfo->id.aaudio = pDevice->capture.id.aaudio;\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);     /* Only supporting default devices. */\n    }\n    if (type == ma_device_type_capture) {\n        pStream = (ma_AAudioStream*)pDevice->aaudio.pStreamPlayback;\n        pDeviceInfo->id.aaudio = pDevice->playback.id.aaudio;\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);    /* Only supporting default devices. */\n    }\n\n    /* Safety. Should never happen. */\n    if (pStream == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    pDeviceInfo->nativeDataFormatCount = 0;\n    ma_context_add_native_data_format_from_AAudioStream__aaudio(pDevice->pContext, pStream, 0, pDeviceInfo);\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_context_uninit__aaudio(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_aaudio);\n\n    ma_device_job_thread_uninit(&pContext->aaudio.jobThread, &pContext->allocationCallbacks);\n\n    ma_dlclose(ma_context_get_log(pContext), pContext->aaudio.hAAudio);\n    pContext->aaudio.hAAudio = NULL;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init__aaudio(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n    size_t i;\n    const char* libNames[] = {\n        \"libaaudio.so\"\n    };\n\n    for (i = 0; i < ma_countof(libNames); ++i) {\n        pContext->aaudio.hAAudio = ma_dlopen(ma_context_get_log(pContext), libNames[i]);\n        if (pContext->aaudio.hAAudio != NULL) {\n            break;\n        }\n    }\n\n    if (pContext->aaudio.hAAudio == NULL) {\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    pContext->aaudio.AAudio_createStreamBuilder                    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudio_createStreamBuilder\");\n    pContext->aaudio.AAudioStreamBuilder_delete                    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_delete\");\n    pContext->aaudio.AAudioStreamBuilder_setDeviceId               = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setDeviceId\");\n    pContext->aaudio.AAudioStreamBuilder_setDirection              = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setDirection\");\n    pContext->aaudio.AAudioStreamBuilder_setSharingMode            = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setSharingMode\");\n    pContext->aaudio.AAudioStreamBuilder_setFormat                 = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setFormat\");\n    pContext->aaudio.AAudioStreamBuilder_setChannelCount           = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setChannelCount\");\n    pContext->aaudio.AAudioStreamBuilder_setSampleRate             = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setSampleRate\");\n    pContext->aaudio.AAudioStreamBuilder_setBufferCapacityInFrames = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setBufferCapacityInFrames\");\n    pContext->aaudio.AAudioStreamBuilder_setFramesPerDataCallback  = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setFramesPerDataCallback\");\n    pContext->aaudio.AAudioStreamBuilder_setDataCallback           = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setDataCallback\");\n    pContext->aaudio.AAudioStreamBuilder_setErrorCallback          = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setErrorCallback\");\n    pContext->aaudio.AAudioStreamBuilder_setPerformanceMode        = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setPerformanceMode\");\n    pContext->aaudio.AAudioStreamBuilder_setUsage                  = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setUsage\");\n    pContext->aaudio.AAudioStreamBuilder_setContentType            = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setContentType\");\n    pContext->aaudio.AAudioStreamBuilder_setInputPreset            = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setInputPreset\");\n    pContext->aaudio.AAudioStreamBuilder_setAllowedCapturePolicy   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_setAllowedCapturePolicy\");\n    pContext->aaudio.AAudioStreamBuilder_openStream                = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStreamBuilder_openStream\");\n    pContext->aaudio.AAudioStream_close                            = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStream_close\");\n    pContext->aaudio.AAudioStream_getState                         = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStream_getState\");\n    pContext->aaudio.AAudioStream_waitForStateChange               = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStream_waitForStateChange\");\n    pContext->aaudio.AAudioStream_getFormat                        = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStream_getFormat\");\n    pContext->aaudio.AAudioStream_getChannelCount                  = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStream_getChannelCount\");\n    pContext->aaudio.AAudioStream_getSampleRate                    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStream_getSampleRate\");\n    pContext->aaudio.AAudioStream_getBufferCapacityInFrames        = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStream_getBufferCapacityInFrames\");\n    pContext->aaudio.AAudioStream_getFramesPerDataCallback         = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStream_getFramesPerDataCallback\");\n    pContext->aaudio.AAudioStream_getFramesPerBurst                = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStream_getFramesPerBurst\");\n    pContext->aaudio.AAudioStream_requestStart                     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStream_requestStart\");\n    pContext->aaudio.AAudioStream_requestStop                      = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->aaudio.hAAudio, \"AAudioStream_requestStop\");\n\n\n    pCallbacks->onContextInit             = ma_context_init__aaudio;\n    pCallbacks->onContextUninit           = ma_context_uninit__aaudio;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__aaudio;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__aaudio;\n    pCallbacks->onDeviceInit              = ma_device_init__aaudio;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__aaudio;\n    pCallbacks->onDeviceStart             = ma_device_start__aaudio;\n    pCallbacks->onDeviceStop              = ma_device_stop__aaudio;\n    pCallbacks->onDeviceRead              = NULL;   /* Not used because AAudio is asynchronous. */\n    pCallbacks->onDeviceWrite             = NULL;   /* Not used because AAudio is asynchronous. */\n    pCallbacks->onDeviceDataLoop          = NULL;   /* Not used because AAudio is asynchronous. */\n    pCallbacks->onDeviceGetInfo           = ma_device_get_info__aaudio;\n\n\n    /* We need a job thread so we can deal with rerouting. */\n    {\n        ma_result result;\n        ma_device_job_thread_config jobThreadConfig;\n\n        jobThreadConfig = ma_device_job_thread_config_init();\n\n        result = ma_device_job_thread_init(&jobThreadConfig, &pContext->allocationCallbacks, &pContext->aaudio.jobThread);\n        if (result != MA_SUCCESS) {\n            ma_dlclose(ma_context_get_log(pContext), pContext->aaudio.hAAudio);\n            pContext->aaudio.hAAudio = NULL;\n            return result;\n        }\n    }\n\n\n    (void)pConfig;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_job_process__device__aaudio_reroute(ma_job* pJob)\n{\n    ma_device* pDevice;\n\n    MA_ASSERT(pJob != NULL);\n\n    pDevice = (ma_device*)pJob->data.device.aaudio.reroute.pDevice;\n    MA_ASSERT(pDevice != NULL);\n\n    /* Here is where we need to reroute the device. To do this we need to uninitialize the stream and reinitialize it. */\n    return ma_device_reinit__aaudio(pDevice, (ma_device_type)pJob->data.device.aaudio.reroute.deviceType);\n}\n#else\n/* Getting here means there is no AAudio backend so we need a no-op job implementation. */\nstatic ma_result ma_job_process__device__aaudio_reroute(ma_job* pJob)\n{\n    return ma_job_process__noop(pJob);\n}\n#endif  /* AAudio */\n\n\n/******************************************************************************\n\nOpenSL|ES Backend\n\n******************************************************************************/\n#ifdef MA_HAS_OPENSL\n#include <SLES/OpenSLES.h>\n#ifdef MA_ANDROID\n#include <SLES/OpenSLES_Android.h>\n#endif\n\ntypedef SLresult (SLAPIENTRY * ma_slCreateEngine_proc)(SLObjectItf* pEngine, SLuint32 numOptions, SLEngineOption* pEngineOptions, SLuint32 numInterfaces, SLInterfaceID* pInterfaceIds, SLboolean* pInterfaceRequired);\n\n/* OpenSL|ES has one-per-application objects :( */\nstatic SLObjectItf g_maEngineObjectSL    = NULL;\nstatic SLEngineItf g_maEngineSL          = NULL;\nstatic ma_uint32   g_maOpenSLInitCounter = 0;\nstatic ma_spinlock g_maOpenSLSpinlock    = 0;   /* For init/uninit. */\n\n#define MA_OPENSL_OBJ(p)         (*((SLObjectItf)(p)))\n#define MA_OPENSL_OUTPUTMIX(p)   (*((SLOutputMixItf)(p)))\n#define MA_OPENSL_PLAY(p)        (*((SLPlayItf)(p)))\n#define MA_OPENSL_RECORD(p)      (*((SLRecordItf)(p)))\n\n#ifdef MA_ANDROID\n#define MA_OPENSL_BUFFERQUEUE(p) (*((SLAndroidSimpleBufferQueueItf)(p)))\n#else\n#define MA_OPENSL_BUFFERQUEUE(p) (*((SLBufferQueueItf)(p)))\n#endif\n\nstatic ma_result ma_result_from_OpenSL(SLuint32 result)\n{\n    switch (result)\n    {\n        case SL_RESULT_SUCCESS:                 return MA_SUCCESS;\n        case SL_RESULT_PRECONDITIONS_VIOLATED:  return MA_ERROR;\n        case SL_RESULT_PARAMETER_INVALID:       return MA_INVALID_ARGS;\n        case SL_RESULT_MEMORY_FAILURE:          return MA_OUT_OF_MEMORY;\n        case SL_RESULT_RESOURCE_ERROR:          return MA_INVALID_DATA;\n        case SL_RESULT_RESOURCE_LOST:           return MA_ERROR;\n        case SL_RESULT_IO_ERROR:                return MA_IO_ERROR;\n        case SL_RESULT_BUFFER_INSUFFICIENT:     return MA_NO_SPACE;\n        case SL_RESULT_CONTENT_CORRUPTED:       return MA_INVALID_DATA;\n        case SL_RESULT_CONTENT_UNSUPPORTED:     return MA_FORMAT_NOT_SUPPORTED;\n        case SL_RESULT_CONTENT_NOT_FOUND:       return MA_ERROR;\n        case SL_RESULT_PERMISSION_DENIED:       return MA_ACCESS_DENIED;\n        case SL_RESULT_FEATURE_UNSUPPORTED:     return MA_NOT_IMPLEMENTED;\n        case SL_RESULT_INTERNAL_ERROR:          return MA_ERROR;\n        case SL_RESULT_UNKNOWN_ERROR:           return MA_ERROR;\n        case SL_RESULT_OPERATION_ABORTED:       return MA_ERROR;\n        case SL_RESULT_CONTROL_LOST:            return MA_ERROR;\n        default:                                return MA_ERROR;\n    }\n}\n\n/* Converts an individual OpenSL-style channel identifier (SL_SPEAKER_FRONT_LEFT, etc.) to miniaudio. */\nstatic ma_uint8 ma_channel_id_to_ma__opensl(SLuint32 id)\n{\n    switch (id)\n    {\n        case SL_SPEAKER_FRONT_LEFT:            return MA_CHANNEL_FRONT_LEFT;\n        case SL_SPEAKER_FRONT_RIGHT:           return MA_CHANNEL_FRONT_RIGHT;\n        case SL_SPEAKER_FRONT_CENTER:          return MA_CHANNEL_FRONT_CENTER;\n        case SL_SPEAKER_LOW_FREQUENCY:         return MA_CHANNEL_LFE;\n        case SL_SPEAKER_BACK_LEFT:             return MA_CHANNEL_BACK_LEFT;\n        case SL_SPEAKER_BACK_RIGHT:            return MA_CHANNEL_BACK_RIGHT;\n        case SL_SPEAKER_FRONT_LEFT_OF_CENTER:  return MA_CHANNEL_FRONT_LEFT_CENTER;\n        case SL_SPEAKER_FRONT_RIGHT_OF_CENTER: return MA_CHANNEL_FRONT_RIGHT_CENTER;\n        case SL_SPEAKER_BACK_CENTER:           return MA_CHANNEL_BACK_CENTER;\n        case SL_SPEAKER_SIDE_LEFT:             return MA_CHANNEL_SIDE_LEFT;\n        case SL_SPEAKER_SIDE_RIGHT:            return MA_CHANNEL_SIDE_RIGHT;\n        case SL_SPEAKER_TOP_CENTER:            return MA_CHANNEL_TOP_CENTER;\n        case SL_SPEAKER_TOP_FRONT_LEFT:        return MA_CHANNEL_TOP_FRONT_LEFT;\n        case SL_SPEAKER_TOP_FRONT_CENTER:      return MA_CHANNEL_TOP_FRONT_CENTER;\n        case SL_SPEAKER_TOP_FRONT_RIGHT:       return MA_CHANNEL_TOP_FRONT_RIGHT;\n        case SL_SPEAKER_TOP_BACK_LEFT:         return MA_CHANNEL_TOP_BACK_LEFT;\n        case SL_SPEAKER_TOP_BACK_CENTER:       return MA_CHANNEL_TOP_BACK_CENTER;\n        case SL_SPEAKER_TOP_BACK_RIGHT:        return MA_CHANNEL_TOP_BACK_RIGHT;\n        default: return 0;\n    }\n}\n\n/* Converts an individual miniaudio channel identifier (MA_CHANNEL_FRONT_LEFT, etc.) to OpenSL-style. */\nstatic SLuint32 ma_channel_id_to_opensl(ma_uint8 id)\n{\n    switch (id)\n    {\n        case MA_CHANNEL_MONO:               return SL_SPEAKER_FRONT_CENTER;\n        case MA_CHANNEL_FRONT_LEFT:         return SL_SPEAKER_FRONT_LEFT;\n        case MA_CHANNEL_FRONT_RIGHT:        return SL_SPEAKER_FRONT_RIGHT;\n        case MA_CHANNEL_FRONT_CENTER:       return SL_SPEAKER_FRONT_CENTER;\n        case MA_CHANNEL_LFE:                return SL_SPEAKER_LOW_FREQUENCY;\n        case MA_CHANNEL_BACK_LEFT:          return SL_SPEAKER_BACK_LEFT;\n        case MA_CHANNEL_BACK_RIGHT:         return SL_SPEAKER_BACK_RIGHT;\n        case MA_CHANNEL_FRONT_LEFT_CENTER:  return SL_SPEAKER_FRONT_LEFT_OF_CENTER;\n        case MA_CHANNEL_FRONT_RIGHT_CENTER: return SL_SPEAKER_FRONT_RIGHT_OF_CENTER;\n        case MA_CHANNEL_BACK_CENTER:        return SL_SPEAKER_BACK_CENTER;\n        case MA_CHANNEL_SIDE_LEFT:          return SL_SPEAKER_SIDE_LEFT;\n        case MA_CHANNEL_SIDE_RIGHT:         return SL_SPEAKER_SIDE_RIGHT;\n        case MA_CHANNEL_TOP_CENTER:         return SL_SPEAKER_TOP_CENTER;\n        case MA_CHANNEL_TOP_FRONT_LEFT:     return SL_SPEAKER_TOP_FRONT_LEFT;\n        case MA_CHANNEL_TOP_FRONT_CENTER:   return SL_SPEAKER_TOP_FRONT_CENTER;\n        case MA_CHANNEL_TOP_FRONT_RIGHT:    return SL_SPEAKER_TOP_FRONT_RIGHT;\n        case MA_CHANNEL_TOP_BACK_LEFT:      return SL_SPEAKER_TOP_BACK_LEFT;\n        case MA_CHANNEL_TOP_BACK_CENTER:    return SL_SPEAKER_TOP_BACK_CENTER;\n        case MA_CHANNEL_TOP_BACK_RIGHT:     return SL_SPEAKER_TOP_BACK_RIGHT;\n        default: return 0;\n    }\n}\n\n/* Converts a channel mapping to an OpenSL-style channel mask. */\nstatic SLuint32 ma_channel_map_to_channel_mask__opensl(const ma_channel* pChannelMap, ma_uint32 channels)\n{\n    SLuint32 channelMask = 0;\n    ma_uint32 iChannel;\n    for (iChannel = 0; iChannel < channels; ++iChannel) {\n        channelMask |= ma_channel_id_to_opensl(pChannelMap[iChannel]);\n    }\n\n    return channelMask;\n}\n\n/* Converts an OpenSL-style channel mask to a miniaudio channel map. */\nstatic void ma_channel_mask_to_channel_map__opensl(SLuint32 channelMask, ma_uint32 channels, ma_channel* pChannelMap)\n{\n    if (channels == 1 && channelMask == 0) {\n        pChannelMap[0] = MA_CHANNEL_MONO;\n    } else if (channels == 2 && channelMask == 0) {\n        pChannelMap[0] = MA_CHANNEL_FRONT_LEFT;\n        pChannelMap[1] = MA_CHANNEL_FRONT_RIGHT;\n    } else {\n        if (channels == 1 && (channelMask & SL_SPEAKER_FRONT_CENTER) != 0) {\n            pChannelMap[0] = MA_CHANNEL_MONO;\n        } else {\n            /* Just iterate over each bit. */\n            ma_uint32 iChannel = 0;\n            ma_uint32 iBit;\n            for (iBit = 0; iBit < 32 && iChannel < channels; ++iBit) {\n                SLuint32 bitValue = (channelMask & (1UL << iBit));\n                if (bitValue != 0) {\n                    /* The bit is set. */\n                    pChannelMap[iChannel] = ma_channel_id_to_ma__opensl(bitValue);\n                    iChannel += 1;\n                }\n            }\n        }\n    }\n}\n\nstatic SLuint32 ma_round_to_standard_sample_rate__opensl(SLuint32 samplesPerSec)\n{\n    if (samplesPerSec <= SL_SAMPLINGRATE_8) {\n        return SL_SAMPLINGRATE_8;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_11_025) {\n        return SL_SAMPLINGRATE_11_025;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_12) {\n        return SL_SAMPLINGRATE_12;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_16) {\n        return SL_SAMPLINGRATE_16;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_22_05) {\n        return SL_SAMPLINGRATE_22_05;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_24) {\n        return SL_SAMPLINGRATE_24;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_32) {\n        return SL_SAMPLINGRATE_32;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_44_1) {\n        return SL_SAMPLINGRATE_44_1;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_48) {\n        return SL_SAMPLINGRATE_48;\n    }\n\n    /* Android doesn't support more than 48000. */\n#ifndef MA_ANDROID\n    if (samplesPerSec <= SL_SAMPLINGRATE_64) {\n        return SL_SAMPLINGRATE_64;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_88_2) {\n        return SL_SAMPLINGRATE_88_2;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_96) {\n        return SL_SAMPLINGRATE_96;\n    }\n    if (samplesPerSec <= SL_SAMPLINGRATE_192) {\n        return SL_SAMPLINGRATE_192;\n    }\n#endif\n\n    return SL_SAMPLINGRATE_16;\n}\n\n\nstatic SLint32 ma_to_stream_type__opensl(ma_opensl_stream_type streamType)\n{\n    switch (streamType) {\n        case ma_opensl_stream_type_voice:        return SL_ANDROID_STREAM_VOICE;\n        case ma_opensl_stream_type_system:       return SL_ANDROID_STREAM_SYSTEM;\n        case ma_opensl_stream_type_ring:         return SL_ANDROID_STREAM_RING;\n        case ma_opensl_stream_type_media:        return SL_ANDROID_STREAM_MEDIA;\n        case ma_opensl_stream_type_alarm:        return SL_ANDROID_STREAM_ALARM;\n        case ma_opensl_stream_type_notification: return SL_ANDROID_STREAM_NOTIFICATION;\n        default: break;\n    }\n\n    return SL_ANDROID_STREAM_VOICE;\n}\n\nstatic SLint32 ma_to_recording_preset__opensl(ma_opensl_recording_preset recordingPreset)\n{\n    switch (recordingPreset) {\n        case ma_opensl_recording_preset_generic:             return SL_ANDROID_RECORDING_PRESET_GENERIC;\n        case ma_opensl_recording_preset_camcorder:           return SL_ANDROID_RECORDING_PRESET_CAMCORDER;\n        case ma_opensl_recording_preset_voice_recognition:   return SL_ANDROID_RECORDING_PRESET_VOICE_RECOGNITION;\n        case ma_opensl_recording_preset_voice_communication: return SL_ANDROID_RECORDING_PRESET_VOICE_COMMUNICATION;\n        case ma_opensl_recording_preset_voice_unprocessed:   return SL_ANDROID_RECORDING_PRESET_UNPROCESSED;\n        default: break;\n    }\n\n    return SL_ANDROID_RECORDING_PRESET_NONE;\n}\n\n\nstatic ma_result ma_context_enumerate_devices__opensl(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_bool32 cbResult;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(callback != NULL);\n\n    MA_ASSERT(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it and then attempted to enumerate devices. */\n    if (g_maOpenSLInitCounter == 0) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /*\n    TODO: Test Me.\n\n    This is currently untested, so for now we are just returning default devices.\n    */\n#if 0 && !defined(MA_ANDROID)\n    ma_bool32 isTerminated = MA_FALSE;\n\n    SLuint32 pDeviceIDs[128];\n    SLint32 deviceCount = sizeof(pDeviceIDs) / sizeof(pDeviceIDs[0]);\n\n    SLAudioIODeviceCapabilitiesItf deviceCaps;\n    SLresult resultSL = (*g_maEngineObjectSL)->GetInterface(g_maEngineObjectSL, (SLInterfaceID)pContext->opensl.SL_IID_AUDIOIODEVICECAPABILITIES, &deviceCaps);\n    if (resultSL != SL_RESULT_SUCCESS) {\n        /* The interface may not be supported so just report a default device. */\n        goto return_default_device;\n    }\n\n    /* Playback */\n    if (!isTerminated) {\n        resultSL = (*deviceCaps)->GetAvailableAudioOutputs(deviceCaps, &deviceCount, pDeviceIDs);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        for (SLint32 iDevice = 0; iDevice < deviceCount; ++iDevice) {\n            ma_device_info deviceInfo;\n            MA_ZERO_OBJECT(&deviceInfo);\n            deviceInfo.id.opensl = pDeviceIDs[iDevice];\n\n            SLAudioOutputDescriptor desc;\n            resultSL = (*deviceCaps)->QueryAudioOutputCapabilities(deviceCaps, deviceInfo.id.opensl, &desc);\n            if (resultSL == SL_RESULT_SUCCESS) {\n                ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), (const char*)desc.pDeviceName, (size_t)-1);\n\n                ma_bool32 cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n                if (cbResult == MA_FALSE) {\n                    isTerminated = MA_TRUE;\n                    break;\n                }\n            }\n        }\n    }\n\n    /* Capture */\n    if (!isTerminated) {\n        resultSL = (*deviceCaps)->GetAvailableAudioInputs(deviceCaps, &deviceCount, pDeviceIDs);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        for (SLint32 iDevice = 0; iDevice < deviceCount; ++iDevice) {\n            ma_device_info deviceInfo;\n            MA_ZERO_OBJECT(&deviceInfo);\n            deviceInfo.id.opensl = pDeviceIDs[iDevice];\n\n            SLAudioInputDescriptor desc;\n            resultSL = (*deviceCaps)->QueryAudioInputCapabilities(deviceCaps, deviceInfo.id.opensl, &desc);\n            if (resultSL == SL_RESULT_SUCCESS) {\n                ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), (const char*)desc.deviceName, (size_t)-1);\n\n                ma_bool32 cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n                if (cbResult == MA_FALSE) {\n                    isTerminated = MA_TRUE;\n                    break;\n                }\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n#else\n    goto return_default_device;\n#endif\n\nreturn_default_device:;\n    cbResult = MA_TRUE;\n\n    /* Playback. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        MA_ZERO_OBJECT(&deviceInfo);\n        deviceInfo.id.opensl = SL_DEFAULTDEVICEID_AUDIOOUTPUT;\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n        cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n    }\n\n    /* Capture. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        MA_ZERO_OBJECT(&deviceInfo);\n        deviceInfo.id.opensl = SL_DEFAULTDEVICEID_AUDIOINPUT;\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n        cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_context_add_data_format_ex__opensl(ma_context* pContext, ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_device_info* pDeviceInfo)\n{\n    MA_ASSERT(pContext    != NULL);\n    MA_ASSERT(pDeviceInfo != NULL);\n\n    pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].format     = format;\n    pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].channels   = channels;\n    pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].sampleRate = sampleRate;\n    pDeviceInfo->nativeDataFormats[pDeviceInfo->nativeDataFormatCount].flags      = 0;\n    pDeviceInfo->nativeDataFormatCount += 1;\n}\n\nstatic void ma_context_add_data_format__opensl(ma_context* pContext, ma_format format, ma_device_info* pDeviceInfo)\n{\n    ma_uint32 minChannels   = 1;\n    ma_uint32 maxChannels   = 2;\n    ma_uint32 minSampleRate = (ma_uint32)ma_standard_sample_rate_8000;\n    ma_uint32 maxSampleRate = (ma_uint32)ma_standard_sample_rate_48000;\n    ma_uint32 iChannel;\n    ma_uint32 iSampleRate;\n\n    MA_ASSERT(pContext    != NULL);\n    MA_ASSERT(pDeviceInfo != NULL);\n\n    /*\n    Each sample format can support mono and stereo, and we'll support a small subset of standard\n    rates (up to 48000). A better solution would be to somehow find a native sample rate.\n    */\n    for (iChannel = minChannels; iChannel < maxChannels; iChannel += 1) {\n        for (iSampleRate = 0; iSampleRate < ma_countof(g_maStandardSampleRatePriorities); iSampleRate += 1) {\n            ma_uint32 standardSampleRate = g_maStandardSampleRatePriorities[iSampleRate];\n            if (standardSampleRate >= minSampleRate && standardSampleRate <= maxSampleRate) {\n                ma_context_add_data_format_ex__opensl(pContext, format, iChannel, standardSampleRate, pDeviceInfo);\n            }\n        }\n    }\n}\n\nstatic ma_result ma_context_get_device_info__opensl(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    MA_ASSERT(pContext != NULL);\n\n    MA_ASSERT(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it and then attempted to get device info. */\n    if (g_maOpenSLInitCounter == 0) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /*\n    TODO: Test Me.\n\n    This is currently untested, so for now we are just returning default devices.\n    */\n#if 0 && !defined(MA_ANDROID)\n    SLAudioIODeviceCapabilitiesItf deviceCaps;\n    SLresult resultSL = (*g_maEngineObjectSL)->GetInterface(g_maEngineObjectSL, (SLInterfaceID)pContext->opensl.SL_IID_AUDIOIODEVICECAPABILITIES, &deviceCaps);\n    if (resultSL != SL_RESULT_SUCCESS) {\n        /* The interface may not be supported so just report a default device. */\n        goto return_default_device;\n    }\n\n    if (deviceType == ma_device_type_playback) {\n        SLAudioOutputDescriptor desc;\n        resultSL = (*deviceCaps)->QueryAudioOutputCapabilities(deviceCaps, pDeviceID->opensl, &desc);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), (const char*)desc.pDeviceName, (size_t)-1);\n    } else {\n        SLAudioInputDescriptor desc;\n        resultSL = (*deviceCaps)->QueryAudioInputCapabilities(deviceCaps, pDeviceID->opensl, &desc);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), (const char*)desc.deviceName, (size_t)-1);\n    }\n\n    goto return_detailed_info;\n#else\n    goto return_default_device;\n#endif\n\nreturn_default_device:\n    if (pDeviceID != NULL) {\n        if ((deviceType == ma_device_type_playback && pDeviceID->opensl != SL_DEFAULTDEVICEID_AUDIOOUTPUT) ||\n            (deviceType == ma_device_type_capture  && pDeviceID->opensl != SL_DEFAULTDEVICEID_AUDIOINPUT)) {\n            return MA_NO_DEVICE;   /* Don't know the device. */\n        }\n    }\n\n    /* ID and Name / Description */\n    if (deviceType == ma_device_type_playback) {\n        pDeviceInfo->id.opensl = SL_DEFAULTDEVICEID_AUDIOOUTPUT;\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n    } else {\n        pDeviceInfo->id.opensl = SL_DEFAULTDEVICEID_AUDIOINPUT;\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n    }\n\n    pDeviceInfo->isDefault = MA_TRUE;\n\n    goto return_detailed_info;\n\n\nreturn_detailed_info:\n\n    /*\n    For now we're just outputting a set of values that are supported by the API but not necessarily supported\n    by the device natively. Later on we should work on this so that it more closely reflects the device's\n    actual native format.\n    */\n    pDeviceInfo->nativeDataFormatCount = 0;\n#if defined(MA_ANDROID) && __ANDROID_API__ >= 21\n    ma_context_add_data_format__opensl(pContext, ma_format_f32, pDeviceInfo);\n#endif\n    ma_context_add_data_format__opensl(pContext, ma_format_s16, pDeviceInfo);\n    ma_context_add_data_format__opensl(pContext, ma_format_u8,  pDeviceInfo);\n\n    return MA_SUCCESS;\n}\n\n\n#ifdef MA_ANDROID\n/*void ma_buffer_queue_callback_capture__opensl_android(SLAndroidSimpleBufferQueueItf pBufferQueue, SLuint32 eventFlags, const void* pBuffer, SLuint32 bufferSize, SLuint32 dataUsed, void* pContext)*/\nstatic void ma_buffer_queue_callback_capture__opensl_android(SLAndroidSimpleBufferQueueItf pBufferQueue, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    size_t periodSizeInBytes;\n    ma_uint8* pBuffer;\n    SLresult resultSL;\n\n    MA_ASSERT(pDevice != NULL);\n\n    (void)pBufferQueue;\n\n    /*\n    For now, don't do anything unless the buffer was fully processed. From what I can tell, it looks like\n    OpenSL|ES 1.1 improves on buffer queues to the point that we could much more intelligently handle this,\n    but unfortunately it looks like Android is only supporting OpenSL|ES 1.0.1 for now :(\n    */\n\n    /* Don't do anything if the device is not started. */\n    if (ma_device_get_state(pDevice) != ma_device_state_started) {\n        return;\n    }\n\n    /* Don't do anything if the device is being drained. */\n    if (pDevice->opensl.isDrainingCapture) {\n        return;\n    }\n\n    periodSizeInBytes = pDevice->capture.internalPeriodSizeInFrames * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n    pBuffer = pDevice->opensl.pBufferCapture + (pDevice->opensl.currentBufferIndexCapture * periodSizeInBytes);\n\n    ma_device_handle_backend_data_callback(pDevice, NULL, pBuffer, pDevice->capture.internalPeriodSizeInFrames);\n\n    resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueueCapture)->Enqueue((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture, pBuffer, periodSizeInBytes);\n    if (resultSL != SL_RESULT_SUCCESS) {\n        return;\n    }\n\n    pDevice->opensl.currentBufferIndexCapture = (pDevice->opensl.currentBufferIndexCapture + 1) % pDevice->capture.internalPeriods;\n}\n\nstatic void ma_buffer_queue_callback_playback__opensl_android(SLAndroidSimpleBufferQueueItf pBufferQueue, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    size_t periodSizeInBytes;\n    ma_uint8* pBuffer;\n    SLresult resultSL;\n\n    MA_ASSERT(pDevice != NULL);\n\n    (void)pBufferQueue;\n\n    /* Don't do anything if the device is not started. */\n    if (ma_device_get_state(pDevice) != ma_device_state_started) {\n        return;\n    }\n\n    /* Don't do anything if the device is being drained. */\n    if (pDevice->opensl.isDrainingPlayback) {\n        return;\n    }\n\n    periodSizeInBytes = pDevice->playback.internalPeriodSizeInFrames * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n    pBuffer = pDevice->opensl.pBufferPlayback + (pDevice->opensl.currentBufferIndexPlayback * periodSizeInBytes);\n\n    ma_device_handle_backend_data_callback(pDevice, pBuffer, NULL, pDevice->playback.internalPeriodSizeInFrames);\n\n    resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueuePlayback)->Enqueue((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback, pBuffer, periodSizeInBytes);\n    if (resultSL != SL_RESULT_SUCCESS) {\n        return;\n    }\n\n    pDevice->opensl.currentBufferIndexPlayback = (pDevice->opensl.currentBufferIndexPlayback + 1) % pDevice->playback.internalPeriods;\n}\n#endif\n\nstatic ma_result ma_device_uninit__opensl(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    MA_ASSERT(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it before uninitializing the device. */\n    if (g_maOpenSLInitCounter == 0) {\n        return MA_INVALID_OPERATION;\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->opensl.pAudioRecorderObj) {\n            MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->Destroy((SLObjectItf)pDevice->opensl.pAudioRecorderObj);\n        }\n\n        ma_free(pDevice->opensl.pBufferCapture, &pDevice->pContext->allocationCallbacks);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        if (pDevice->opensl.pAudioPlayerObj) {\n            MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->Destroy((SLObjectItf)pDevice->opensl.pAudioPlayerObj);\n        }\n        if (pDevice->opensl.pOutputMixObj) {\n            MA_OPENSL_OBJ(pDevice->opensl.pOutputMixObj)->Destroy((SLObjectItf)pDevice->opensl.pOutputMixObj);\n        }\n\n        ma_free(pDevice->opensl.pBufferPlayback, &pDevice->pContext->allocationCallbacks);\n    }\n\n    return MA_SUCCESS;\n}\n\n#if defined(MA_ANDROID) && __ANDROID_API__ >= 21\ntypedef SLAndroidDataFormat_PCM_EX  ma_SLDataFormat_PCM;\n#else\ntypedef SLDataFormat_PCM            ma_SLDataFormat_PCM;\n#endif\n\nstatic ma_result ma_SLDataFormat_PCM_init__opensl(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, const ma_channel* channelMap, ma_SLDataFormat_PCM* pDataFormat)\n{\n    /* We need to convert our format/channels/rate so that they aren't set to default. */\n    if (format == ma_format_unknown) {\n        format = MA_DEFAULT_FORMAT;\n    }\n    if (channels == 0) {\n        channels = MA_DEFAULT_CHANNELS;\n    }\n    if (sampleRate == 0) {\n        sampleRate = MA_DEFAULT_SAMPLE_RATE;\n    }\n\n#if defined(MA_ANDROID) && __ANDROID_API__ >= 21\n    if (format == ma_format_f32) {\n        pDataFormat->formatType     = SL_ANDROID_DATAFORMAT_PCM_EX;\n        pDataFormat->representation = SL_ANDROID_PCM_REPRESENTATION_FLOAT;\n    } else {\n        pDataFormat->formatType = SL_DATAFORMAT_PCM;\n    }\n#else\n    pDataFormat->formatType = SL_DATAFORMAT_PCM;\n#endif\n\n    pDataFormat->numChannels   = channels;\n    ((SLDataFormat_PCM*)pDataFormat)->samplesPerSec = ma_round_to_standard_sample_rate__opensl(sampleRate * 1000);  /* In millihertz. Annoyingly, the sample rate variable is named differently between SLAndroidDataFormat_PCM_EX and SLDataFormat_PCM */\n    pDataFormat->bitsPerSample = ma_get_bytes_per_sample(format) * 8;\n    pDataFormat->channelMask   = ma_channel_map_to_channel_mask__opensl(channelMap, channels);\n    pDataFormat->endianness    = (ma_is_little_endian()) ? SL_BYTEORDER_LITTLEENDIAN : SL_BYTEORDER_BIGENDIAN;\n\n    /*\n    Android has a few restrictions on the format as documented here: https://developer.android.com/ndk/guides/audio/opensl-for-android.html\n     - Only mono and stereo is supported.\n     - Only u8 and s16 formats are supported.\n     - Maximum sample rate of 48000.\n    */\n#ifdef MA_ANDROID\n    if (pDataFormat->numChannels > 2) {\n        pDataFormat->numChannels = 2;\n    }\n#if __ANDROID_API__ >= 21\n    if (pDataFormat->formatType == SL_ANDROID_DATAFORMAT_PCM_EX) {\n        /* It's floating point. */\n        MA_ASSERT(pDataFormat->representation == SL_ANDROID_PCM_REPRESENTATION_FLOAT);\n        if (pDataFormat->bitsPerSample > 32) {\n            pDataFormat->bitsPerSample = 32;\n        }\n    } else {\n        if (pDataFormat->bitsPerSample > 16) {\n            pDataFormat->bitsPerSample = 16;\n        }\n    }\n#else\n    if (pDataFormat->bitsPerSample > 16) {\n        pDataFormat->bitsPerSample = 16;\n    }\n#endif\n    if (((SLDataFormat_PCM*)pDataFormat)->samplesPerSec > SL_SAMPLINGRATE_48) {\n        ((SLDataFormat_PCM*)pDataFormat)->samplesPerSec = SL_SAMPLINGRATE_48;\n    }\n#endif\n\n    pDataFormat->containerSize = pDataFormat->bitsPerSample;  /* Always tightly packed for now. */\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_deconstruct_SLDataFormat_PCM__opensl(ma_SLDataFormat_PCM* pDataFormat, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    ma_bool32 isFloatingPoint = MA_FALSE;\n#if defined(MA_ANDROID) && __ANDROID_API__ >= 21\n    if (pDataFormat->formatType == SL_ANDROID_DATAFORMAT_PCM_EX) {\n        MA_ASSERT(pDataFormat->representation == SL_ANDROID_PCM_REPRESENTATION_FLOAT);\n        isFloatingPoint = MA_TRUE;\n    }\n#endif\n    if (isFloatingPoint) {\n        if (pDataFormat->bitsPerSample == 32) {\n            *pFormat = ma_format_f32;\n        }\n    } else {\n        if (pDataFormat->bitsPerSample == 8) {\n            *pFormat = ma_format_u8;\n        } else if (pDataFormat->bitsPerSample == 16) {\n            *pFormat = ma_format_s16;\n        } else if (pDataFormat->bitsPerSample == 24) {\n            *pFormat = ma_format_s24;\n        } else if (pDataFormat->bitsPerSample == 32) {\n            *pFormat = ma_format_s32;\n        }\n    }\n\n    *pChannels   = pDataFormat->numChannels;\n    *pSampleRate = ((SLDataFormat_PCM*)pDataFormat)->samplesPerSec / 1000;\n    ma_channel_mask_to_channel_map__opensl(pDataFormat->channelMask, ma_min(pDataFormat->numChannels, channelMapCap), pChannelMap);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_init__opensl(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n#ifdef MA_ANDROID\n    SLDataLocator_AndroidSimpleBufferQueue queue;\n    SLresult resultSL;\n    size_t bufferSizeInBytes;\n    SLInterfaceID itfIDs[2];\n    const SLboolean itfIDsRequired[] = {\n        SL_BOOLEAN_TRUE,    /* SL_IID_ANDROIDSIMPLEBUFFERQUEUE */\n        SL_BOOLEAN_FALSE    /* SL_IID_ANDROIDCONFIGURATION */\n    };\n#endif\n\n    MA_ASSERT(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it and then attempted to initialize a new device. */\n    if (g_maOpenSLInitCounter == 0) {\n        return MA_INVALID_OPERATION;\n    }\n\n    if (pConfig->deviceType == ma_device_type_loopback) {\n        return MA_DEVICE_TYPE_NOT_SUPPORTED;\n    }\n\n    /*\n    For now, only supporting Android implementations of OpenSL|ES since that's the only one I've\n    been able to test with and I currently depend on Android-specific extensions (simple buffer\n    queues).\n    */\n#ifdef MA_ANDROID\n    itfIDs[0] = (SLInterfaceID)pDevice->pContext->opensl.SL_IID_ANDROIDSIMPLEBUFFERQUEUE;\n    itfIDs[1] = (SLInterfaceID)pDevice->pContext->opensl.SL_IID_ANDROIDCONFIGURATION;\n\n    /* No exclusive mode with OpenSL|ES. */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->shareMode == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->shareMode  == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    /* Now we can start initializing the device properly. */\n    MA_ASSERT(pDevice != NULL);\n    MA_ZERO_OBJECT(&pDevice->opensl);\n\n    queue.locatorType = SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE;\n\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        ma_SLDataFormat_PCM pcm;\n        SLDataLocator_IODevice locatorDevice;\n        SLDataSource source;\n        SLDataSink sink;\n        SLAndroidConfigurationItf pRecorderConfig;\n\n        ma_SLDataFormat_PCM_init__opensl(pDescriptorCapture->format, pDescriptorCapture->channels, pDescriptorCapture->sampleRate, pDescriptorCapture->channelMap, &pcm);\n\n        locatorDevice.locatorType = SL_DATALOCATOR_IODEVICE;\n        locatorDevice.deviceType  = SL_IODEVICE_AUDIOINPUT;\n        locatorDevice.deviceID    = SL_DEFAULTDEVICEID_AUDIOINPUT;  /* Must always use the default device with Android. */\n        locatorDevice.device      = NULL;\n\n        source.pLocator = &locatorDevice;\n        source.pFormat  = NULL;\n\n        queue.numBuffers = pDescriptorCapture->periodCount;\n\n        sink.pLocator = &queue;\n        sink.pFormat  = (SLDataFormat_PCM*)&pcm;\n\n        resultSL = (*g_maEngineSL)->CreateAudioRecorder(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pAudioRecorderObj, &source, &sink, ma_countof(itfIDs), itfIDs, itfIDsRequired);\n        if (resultSL == SL_RESULT_CONTENT_UNSUPPORTED || resultSL == SL_RESULT_PARAMETER_INVALID) {\n            /* Unsupported format. Fall back to something safer and try again. If this fails, just abort. */\n            pcm.formatType    = SL_DATAFORMAT_PCM;\n            pcm.numChannels   = 1;\n            ((SLDataFormat_PCM*)&pcm)->samplesPerSec = SL_SAMPLINGRATE_16;  /* The name of the sample rate variable is different between SLAndroidDataFormat_PCM_EX and SLDataFormat_PCM. */\n            pcm.bitsPerSample = 16;\n            pcm.containerSize = pcm.bitsPerSample;  /* Always tightly packed for now. */\n            pcm.channelMask   = 0;\n            resultSL = (*g_maEngineSL)->CreateAudioRecorder(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pAudioRecorderObj, &source, &sink, ma_countof(itfIDs), itfIDs, itfIDsRequired);\n        }\n\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to create audio recorder.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n\n        /* Set the recording preset before realizing the player. */\n        if (pConfig->opensl.recordingPreset != ma_opensl_recording_preset_default) {\n            resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioRecorderObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_ANDROIDCONFIGURATION, &pRecorderConfig);\n            if (resultSL == SL_RESULT_SUCCESS) {\n                SLint32 recordingPreset = ma_to_recording_preset__opensl(pConfig->opensl.recordingPreset);\n                resultSL = (*pRecorderConfig)->SetConfiguration(pRecorderConfig, SL_ANDROID_KEY_RECORDING_PRESET, &recordingPreset, sizeof(SLint32));\n                if (resultSL != SL_RESULT_SUCCESS) {\n                    /* Failed to set the configuration. Just keep going. */\n                }\n            }\n        }\n\n        resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->Realize((SLObjectItf)pDevice->opensl.pAudioRecorderObj, SL_BOOLEAN_FALSE);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to realize audio recorder.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioRecorderObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_RECORD, &pDevice->opensl.pAudioRecorder);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to retrieve SL_IID_RECORD interface.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioRecorderObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioRecorderObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &pDevice->opensl.pBufferQueueCapture);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to retrieve SL_IID_ANDROIDSIMPLEBUFFERQUEUE interface.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueueCapture)->RegisterCallback((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture, ma_buffer_queue_callback_capture__opensl_android, pDevice);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to register buffer queue callback.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        /* The internal format is determined by the \"pcm\" object. */\n        ma_deconstruct_SLDataFormat_PCM__opensl(&pcm, &pDescriptorCapture->format, &pDescriptorCapture->channels, &pDescriptorCapture->sampleRate, pDescriptorCapture->channelMap, ma_countof(pDescriptorCapture->channelMap));\n\n        /* Buffer. */\n        pDescriptorCapture->periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptorCapture, pDescriptorCapture->sampleRate, pConfig->performanceProfile);\n        pDevice->opensl.currentBufferIndexCapture = 0;\n\n        bufferSizeInBytes = pDescriptorCapture->periodSizeInFrames * ma_get_bytes_per_frame(pDescriptorCapture->format, pDescriptorCapture->channels) * pDescriptorCapture->periodCount;\n        pDevice->opensl.pBufferCapture = (ma_uint8*)ma_calloc(bufferSizeInBytes, &pDevice->pContext->allocationCallbacks);\n        if (pDevice->opensl.pBufferCapture == NULL) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to allocate memory for data buffer.\");\n            return MA_OUT_OF_MEMORY;\n        }\n        MA_ZERO_MEMORY(pDevice->opensl.pBufferCapture, bufferSizeInBytes);\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        ma_SLDataFormat_PCM pcm;\n        SLDataSource source;\n        SLDataLocator_OutputMix outmixLocator;\n        SLDataSink sink;\n        SLAndroidConfigurationItf pPlayerConfig;\n\n        ma_SLDataFormat_PCM_init__opensl(pDescriptorPlayback->format, pDescriptorPlayback->channels, pDescriptorPlayback->sampleRate, pDescriptorPlayback->channelMap, &pcm);\n\n        resultSL = (*g_maEngineSL)->CreateOutputMix(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pOutputMixObj, 0, NULL, NULL);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to create output mix.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        resultSL = MA_OPENSL_OBJ(pDevice->opensl.pOutputMixObj)->Realize((SLObjectItf)pDevice->opensl.pOutputMixObj, SL_BOOLEAN_FALSE);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to realize output mix object.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        resultSL = MA_OPENSL_OBJ(pDevice->opensl.pOutputMixObj)->GetInterface((SLObjectItf)pDevice->opensl.pOutputMixObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_OUTPUTMIX, &pDevice->opensl.pOutputMix);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to retrieve SL_IID_OUTPUTMIX interface.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        /* Set the output device. */\n        if (pDescriptorPlayback->pDeviceID != NULL) {\n            SLuint32 deviceID_OpenSL = pDescriptorPlayback->pDeviceID->opensl;\n            MA_OPENSL_OUTPUTMIX(pDevice->opensl.pOutputMix)->ReRoute((SLOutputMixItf)pDevice->opensl.pOutputMix, 1, &deviceID_OpenSL);\n        }\n\n        queue.numBuffers = pDescriptorPlayback->periodCount;\n\n        source.pLocator = &queue;\n        source.pFormat  = (SLDataFormat_PCM*)&pcm;\n\n        outmixLocator.locatorType = SL_DATALOCATOR_OUTPUTMIX;\n        outmixLocator.outputMix   = (SLObjectItf)pDevice->opensl.pOutputMixObj;\n\n        sink.pLocator = &outmixLocator;\n        sink.pFormat  = NULL;\n\n        resultSL = (*g_maEngineSL)->CreateAudioPlayer(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pAudioPlayerObj, &source, &sink, ma_countof(itfIDs), itfIDs, itfIDsRequired);\n        if (resultSL == SL_RESULT_CONTENT_UNSUPPORTED || resultSL == SL_RESULT_PARAMETER_INVALID) {\n            /* Unsupported format. Fall back to something safer and try again. If this fails, just abort. */\n            pcm.formatType = SL_DATAFORMAT_PCM;\n            pcm.numChannels = 2;\n            ((SLDataFormat_PCM*)&pcm)->samplesPerSec = SL_SAMPLINGRATE_16;\n            pcm.bitsPerSample = 16;\n            pcm.containerSize = pcm.bitsPerSample;  /* Always tightly packed for now. */\n            pcm.channelMask = SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT;\n            resultSL = (*g_maEngineSL)->CreateAudioPlayer(g_maEngineSL, (SLObjectItf*)&pDevice->opensl.pAudioPlayerObj, &source, &sink, ma_countof(itfIDs), itfIDs, itfIDsRequired);\n        }\n\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to create audio player.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n\n        /* Set the stream type before realizing the player. */\n        if (pConfig->opensl.streamType != ma_opensl_stream_type_default) {\n            resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioPlayerObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_ANDROIDCONFIGURATION, &pPlayerConfig);\n            if (resultSL == SL_RESULT_SUCCESS) {\n                SLint32 streamType = ma_to_stream_type__opensl(pConfig->opensl.streamType);\n                resultSL = (*pPlayerConfig)->SetConfiguration(pPlayerConfig, SL_ANDROID_KEY_STREAM_TYPE, &streamType, sizeof(SLint32));\n                if (resultSL != SL_RESULT_SUCCESS) {\n                    /* Failed to set the configuration. Just keep going. */\n                }\n            }\n        }\n\n        resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->Realize((SLObjectItf)pDevice->opensl.pAudioPlayerObj, SL_BOOLEAN_FALSE);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to realize audio player.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioPlayerObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_PLAY, &pDevice->opensl.pAudioPlayer);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to retrieve SL_IID_PLAY interface.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        resultSL = MA_OPENSL_OBJ(pDevice->opensl.pAudioPlayerObj)->GetInterface((SLObjectItf)pDevice->opensl.pAudioPlayerObj, (SLInterfaceID)pDevice->pContext->opensl.SL_IID_ANDROIDSIMPLEBUFFERQUEUE, &pDevice->opensl.pBufferQueuePlayback);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to retrieve SL_IID_ANDROIDSIMPLEBUFFERQUEUE interface.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueuePlayback)->RegisterCallback((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback, ma_buffer_queue_callback_playback__opensl_android, pDevice);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to register buffer queue callback.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        /* The internal format is determined by the \"pcm\" object. */\n        ma_deconstruct_SLDataFormat_PCM__opensl(&pcm, &pDescriptorPlayback->format, &pDescriptorPlayback->channels, &pDescriptorPlayback->sampleRate, pDescriptorPlayback->channelMap, ma_countof(pDescriptorPlayback->channelMap));\n\n        /* Buffer. */\n        pDescriptorPlayback->periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_descriptor(pDescriptorPlayback, pDescriptorPlayback->sampleRate, pConfig->performanceProfile);\n        pDevice->opensl.currentBufferIndexPlayback   = 0;\n\n        bufferSizeInBytes = pDescriptorPlayback->periodSizeInFrames * ma_get_bytes_per_frame(pDescriptorPlayback->format, pDescriptorPlayback->channels) * pDescriptorPlayback->periodCount;\n        pDevice->opensl.pBufferPlayback = (ma_uint8*)ma_calloc(bufferSizeInBytes, &pDevice->pContext->allocationCallbacks);\n        if (pDevice->opensl.pBufferPlayback == NULL) {\n            ma_device_uninit__opensl(pDevice);\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to allocate memory for data buffer.\");\n            return MA_OUT_OF_MEMORY;\n        }\n        MA_ZERO_MEMORY(pDevice->opensl.pBufferPlayback, bufferSizeInBytes);\n    }\n\n    return MA_SUCCESS;\n#else\n    return MA_NO_BACKEND;   /* Non-Android implementations are not supported. */\n#endif\n}\n\nstatic ma_result ma_device_start__opensl(ma_device* pDevice)\n{\n    SLresult resultSL;\n    size_t periodSizeInBytes;\n    ma_uint32 iPeriod;\n\n    MA_ASSERT(pDevice != NULL);\n\n    MA_ASSERT(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it and then attempted to start the device. */\n    if (g_maOpenSLInitCounter == 0) {\n        return MA_INVALID_OPERATION;\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        resultSL = MA_OPENSL_RECORD(pDevice->opensl.pAudioRecorder)->SetRecordState((SLRecordItf)pDevice->opensl.pAudioRecorder, SL_RECORDSTATE_RECORDING);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to start internal capture device.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        periodSizeInBytes = pDevice->capture.internalPeriodSizeInFrames * ma_get_bytes_per_frame(pDevice->capture.internalFormat, pDevice->capture.internalChannels);\n        for (iPeriod = 0; iPeriod < pDevice->capture.internalPeriods; ++iPeriod) {\n            resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueueCapture)->Enqueue((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture, pDevice->opensl.pBufferCapture + (periodSizeInBytes * iPeriod), periodSizeInBytes);\n            if (resultSL != SL_RESULT_SUCCESS) {\n                MA_OPENSL_RECORD(pDevice->opensl.pAudioRecorder)->SetRecordState((SLRecordItf)pDevice->opensl.pAudioRecorder, SL_RECORDSTATE_STOPPED);\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to enqueue buffer for capture device.\");\n                return ma_result_from_OpenSL(resultSL);\n            }\n        }\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        resultSL = MA_OPENSL_PLAY(pDevice->opensl.pAudioPlayer)->SetPlayState((SLPlayItf)pDevice->opensl.pAudioPlayer, SL_PLAYSTATE_PLAYING);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to start internal playback device.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        /* In playback mode (no duplex) we need to load some initial buffers. In duplex mode we need to enqueue silent buffers. */\n        if (pDevice->type == ma_device_type_duplex) {\n            MA_ZERO_MEMORY(pDevice->opensl.pBufferPlayback, pDevice->playback.internalPeriodSizeInFrames * pDevice->playback.internalPeriods * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels));\n        } else {\n            ma_device__read_frames_from_client(pDevice, pDevice->playback.internalPeriodSizeInFrames * pDevice->playback.internalPeriods, pDevice->opensl.pBufferPlayback);\n        }\n\n        periodSizeInBytes = pDevice->playback.internalPeriodSizeInFrames * ma_get_bytes_per_frame(pDevice->playback.internalFormat, pDevice->playback.internalChannels);\n        for (iPeriod = 0; iPeriod < pDevice->playback.internalPeriods; ++iPeriod) {\n            resultSL = MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueuePlayback)->Enqueue((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback, pDevice->opensl.pBufferPlayback + (periodSizeInBytes * iPeriod), periodSizeInBytes);\n            if (resultSL != SL_RESULT_SUCCESS) {\n                MA_OPENSL_PLAY(pDevice->opensl.pAudioPlayer)->SetPlayState((SLPlayItf)pDevice->opensl.pAudioPlayer, SL_PLAYSTATE_STOPPED);\n                ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to enqueue buffer for playback device.\");\n                return ma_result_from_OpenSL(resultSL);\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_drain__opensl(ma_device* pDevice, ma_device_type deviceType)\n{\n    SLAndroidSimpleBufferQueueItf pBufferQueue;\n\n    MA_ASSERT(deviceType == ma_device_type_capture || deviceType == ma_device_type_playback);\n\n    if (pDevice->type == ma_device_type_capture) {\n        pBufferQueue = (SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture;\n        pDevice->opensl.isDrainingCapture  = MA_TRUE;\n    } else {\n        pBufferQueue = (SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback;\n        pDevice->opensl.isDrainingPlayback = MA_TRUE;\n    }\n\n    for (;;) {\n        SLAndroidSimpleBufferQueueState state;\n\n        MA_OPENSL_BUFFERQUEUE(pBufferQueue)->GetState(pBufferQueue, &state);\n        if (state.count == 0) {\n            break;\n        }\n\n        ma_sleep(10);\n    }\n\n    if (pDevice->type == ma_device_type_capture) {\n        pDevice->opensl.isDrainingCapture  = MA_FALSE;\n    } else {\n        pDevice->opensl.isDrainingPlayback = MA_FALSE;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop__opensl(ma_device* pDevice)\n{\n    SLresult resultSL;\n\n    MA_ASSERT(pDevice != NULL);\n\n    MA_ASSERT(g_maOpenSLInitCounter > 0); /* <-- If you trigger this it means you've either not initialized the context, or you've uninitialized it before stopping/uninitializing the device. */\n    if (g_maOpenSLInitCounter == 0) {\n        return MA_INVALID_OPERATION;\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex) {\n        ma_device_drain__opensl(pDevice, ma_device_type_capture);\n\n        resultSL = MA_OPENSL_RECORD(pDevice->opensl.pAudioRecorder)->SetRecordState((SLRecordItf)pDevice->opensl.pAudioRecorder, SL_RECORDSTATE_STOPPED);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to stop internal capture device.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueueCapture)->Clear((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueueCapture);\n    }\n\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_device_drain__opensl(pDevice, ma_device_type_playback);\n\n        resultSL = MA_OPENSL_PLAY(pDevice->opensl.pAudioPlayer)->SetPlayState((SLPlayItf)pDevice->opensl.pAudioPlayer, SL_PLAYSTATE_STOPPED);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            ma_log_post(ma_device_get_log(pDevice), MA_LOG_LEVEL_ERROR, \"[OpenSL] Failed to stop internal playback device.\");\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        MA_OPENSL_BUFFERQUEUE(pDevice->opensl.pBufferQueuePlayback)->Clear((SLAndroidSimpleBufferQueueItf)pDevice->opensl.pBufferQueuePlayback);\n    }\n\n    /* Make sure the client is aware that the device has stopped. There may be an OpenSL|ES callback for this, but I haven't found it. */\n    ma_device__on_notification_stopped(pDevice);\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_context_uninit__opensl(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_opensl);\n    (void)pContext;\n\n    /* Uninit global data. */\n    ma_spinlock_lock(&g_maOpenSLSpinlock);\n    {\n        MA_ASSERT(g_maOpenSLInitCounter > 0);   /* If you've triggered this, it means you have ma_context_init/uninit mismatch. Each successful call to ma_context_init() must be matched up with a call to ma_context_uninit(). */\n\n        g_maOpenSLInitCounter -= 1;\n        if (g_maOpenSLInitCounter == 0) {\n            (*g_maEngineObjectSL)->Destroy(g_maEngineObjectSL);\n        }\n    }\n    ma_spinlock_unlock(&g_maOpenSLSpinlock);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_dlsym_SLInterfaceID__opensl(ma_context* pContext, const char* pName, ma_handle* pHandle)\n{\n    /* We need to return an error if the symbol cannot be found. This is important because there have been reports that some symbols do not exist. */\n    ma_handle* p = (ma_handle*)ma_dlsym(ma_context_get_log(pContext), pContext->opensl.libOpenSLES, pName);\n    if (p == NULL) {\n        ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_INFO, \"[OpenSL] Cannot find symbol %s\", pName);\n        return MA_NO_BACKEND;\n    }\n\n    *pHandle = *p;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init_engine_nolock__opensl(ma_context* pContext)\n{\n    g_maOpenSLInitCounter += 1;\n    if (g_maOpenSLInitCounter == 1) {\n        SLresult resultSL;\n\n        resultSL = ((ma_slCreateEngine_proc)pContext->opensl.slCreateEngine)(&g_maEngineObjectSL, 0, NULL, 0, NULL, NULL);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            g_maOpenSLInitCounter -= 1;\n            return ma_result_from_OpenSL(resultSL);\n        }\n\n        (*g_maEngineObjectSL)->Realize(g_maEngineObjectSL, SL_BOOLEAN_FALSE);\n\n        resultSL = (*g_maEngineObjectSL)->GetInterface(g_maEngineObjectSL, (SLInterfaceID)pContext->opensl.SL_IID_ENGINE, &g_maEngineSL);\n        if (resultSL != SL_RESULT_SUCCESS) {\n            (*g_maEngineObjectSL)->Destroy(g_maEngineObjectSL);\n            g_maOpenSLInitCounter -= 1;\n            return ma_result_from_OpenSL(resultSL);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init__opensl(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n    ma_result result;\n\n#if !defined(MA_NO_RUNTIME_LINKING)\n    size_t i;\n    const char* libOpenSLESNames[] = {\n        \"libOpenSLES.so\"\n    };\n#endif\n\n    MA_ASSERT(pContext != NULL);\n\n    (void)pConfig;\n\n#if !defined(MA_NO_RUNTIME_LINKING)\n    /*\n    Dynamically link against libOpenSLES.so. I have now had multiple reports that SL_IID_ANDROIDSIMPLEBUFFERQUEUE cannot be found. One\n    report was happening at compile time and another at runtime. To try working around this, I'm going to link to libOpenSLES at runtime\n    and extract the symbols rather than reference them directly. This should, hopefully, fix these issues as the compiler won't see any\n    references to the symbols and will hopefully skip the checks.\n    */\n    for (i = 0; i < ma_countof(libOpenSLESNames); i += 1) {\n        pContext->opensl.libOpenSLES = ma_dlopen(ma_context_get_log(pContext), libOpenSLESNames[i]);\n        if (pContext->opensl.libOpenSLES != NULL) {\n            break;\n        }\n    }\n\n    if (pContext->opensl.libOpenSLES == NULL) {\n        ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_INFO, \"[OpenSL] Could not find libOpenSLES.so\");\n        return MA_NO_BACKEND;\n    }\n\n    result = ma_dlsym_SLInterfaceID__opensl(pContext, \"SL_IID_ENGINE\", &pContext->opensl.SL_IID_ENGINE);\n    if (result != MA_SUCCESS) {\n        ma_dlclose(ma_context_get_log(pContext), pContext->opensl.libOpenSLES);\n        return result;\n    }\n\n    result = ma_dlsym_SLInterfaceID__opensl(pContext, \"SL_IID_AUDIOIODEVICECAPABILITIES\", &pContext->opensl.SL_IID_AUDIOIODEVICECAPABILITIES);\n    if (result != MA_SUCCESS) {\n        ma_dlclose(ma_context_get_log(pContext), pContext->opensl.libOpenSLES);\n        return result;\n    }\n\n    result = ma_dlsym_SLInterfaceID__opensl(pContext, \"SL_IID_ANDROIDSIMPLEBUFFERQUEUE\", &pContext->opensl.SL_IID_ANDROIDSIMPLEBUFFERQUEUE);\n    if (result != MA_SUCCESS) {\n        ma_dlclose(ma_context_get_log(pContext), pContext->opensl.libOpenSLES);\n        return result;\n    }\n\n    result = ma_dlsym_SLInterfaceID__opensl(pContext, \"SL_IID_RECORD\", &pContext->opensl.SL_IID_RECORD);\n    if (result != MA_SUCCESS) {\n        ma_dlclose(ma_context_get_log(pContext), pContext->opensl.libOpenSLES);\n        return result;\n    }\n\n    result = ma_dlsym_SLInterfaceID__opensl(pContext, \"SL_IID_PLAY\", &pContext->opensl.SL_IID_PLAY);\n    if (result != MA_SUCCESS) {\n        ma_dlclose(ma_context_get_log(pContext), pContext->opensl.libOpenSLES);\n        return result;\n    }\n\n    result = ma_dlsym_SLInterfaceID__opensl(pContext, \"SL_IID_OUTPUTMIX\", &pContext->opensl.SL_IID_OUTPUTMIX);\n    if (result != MA_SUCCESS) {\n        ma_dlclose(ma_context_get_log(pContext), pContext->opensl.libOpenSLES);\n        return result;\n    }\n\n    result = ma_dlsym_SLInterfaceID__opensl(pContext, \"SL_IID_ANDROIDCONFIGURATION\", &pContext->opensl.SL_IID_ANDROIDCONFIGURATION);\n    if (result != MA_SUCCESS) {\n        ma_dlclose(ma_context_get_log(pContext), pContext->opensl.libOpenSLES);\n        return result;\n    }\n\n    pContext->opensl.slCreateEngine = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->opensl.libOpenSLES, \"slCreateEngine\");\n    if (pContext->opensl.slCreateEngine == NULL) {\n        ma_dlclose(ma_context_get_log(pContext), pContext->opensl.libOpenSLES);\n        ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_INFO, \"[OpenSL] Cannot find symbol slCreateEngine.\");\n        return MA_NO_BACKEND;\n    }\n#else\n    pContext->opensl.SL_IID_ENGINE                    = (ma_handle)SL_IID_ENGINE;\n    pContext->opensl.SL_IID_AUDIOIODEVICECAPABILITIES = (ma_handle)SL_IID_AUDIOIODEVICECAPABILITIES;\n    pContext->opensl.SL_IID_ANDROIDSIMPLEBUFFERQUEUE  = (ma_handle)SL_IID_ANDROIDSIMPLEBUFFERQUEUE;\n    pContext->opensl.SL_IID_RECORD                    = (ma_handle)SL_IID_RECORD;\n    pContext->opensl.SL_IID_PLAY                      = (ma_handle)SL_IID_PLAY;\n    pContext->opensl.SL_IID_OUTPUTMIX                 = (ma_handle)SL_IID_OUTPUTMIX;\n    pContext->opensl.SL_IID_ANDROIDCONFIGURATION      = (ma_handle)SL_IID_ANDROIDCONFIGURATION;\n    pContext->opensl.slCreateEngine                   = (ma_proc)slCreateEngine;\n#endif\n\n\n    /* Initialize global data first if applicable. */\n    ma_spinlock_lock(&g_maOpenSLSpinlock);\n    {\n        result = ma_context_init_engine_nolock__opensl(pContext);\n    }\n    ma_spinlock_unlock(&g_maOpenSLSpinlock);\n\n    if (result != MA_SUCCESS) {\n        ma_dlclose(ma_context_get_log(pContext), pContext->opensl.libOpenSLES);\n        ma_log_post(ma_context_get_log(pContext), MA_LOG_LEVEL_INFO, \"[OpenSL] Failed to initialize OpenSL engine.\");\n        return result;\n    }\n\n    pCallbacks->onContextInit             = ma_context_init__opensl;\n    pCallbacks->onContextUninit           = ma_context_uninit__opensl;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__opensl;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__opensl;\n    pCallbacks->onDeviceInit              = ma_device_init__opensl;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__opensl;\n    pCallbacks->onDeviceStart             = ma_device_start__opensl;\n    pCallbacks->onDeviceStop              = ma_device_stop__opensl;\n    pCallbacks->onDeviceRead              = NULL;   /* Not needed because OpenSL|ES is asynchronous. */\n    pCallbacks->onDeviceWrite             = NULL;   /* Not needed because OpenSL|ES is asynchronous. */\n    pCallbacks->onDeviceDataLoop          = NULL;   /* Not needed because OpenSL|ES is asynchronous. */\n\n    return MA_SUCCESS;\n}\n#endif  /* OpenSL|ES */\n\n\n/******************************************************************************\n\nWeb Audio Backend\n\n******************************************************************************/\n#ifdef MA_HAS_WEBAUDIO\n#include <emscripten/emscripten.h>\n\n#if (__EMSCRIPTEN_major__ > 3) || (__EMSCRIPTEN_major__ == 3 && (__EMSCRIPTEN_minor__ > 1 || (__EMSCRIPTEN_minor__ == 1 && __EMSCRIPTEN_tiny__ >= 32)))\n    #include <emscripten/webaudio.h>\n    #define MA_SUPPORT_AUDIO_WORKLETS\n#endif\n\n/*\nTODO: Version 0.12: Swap this logic around so that AudioWorklets are used by default. Add MA_NO_AUDIO_WORKLETS.\n*/\n#if defined(MA_ENABLE_AUDIO_WORKLETS) && defined(MA_SUPPORT_AUDIO_WORKLETS)\n    #define MA_USE_AUDIO_WORKLETS\n#endif\n\n/* The thread stack size must be a multiple of 16. */\n#ifndef MA_AUDIO_WORKLETS_THREAD_STACK_SIZE\n#define MA_AUDIO_WORKLETS_THREAD_STACK_SIZE 16384\n#endif\n\n#if defined(MA_USE_AUDIO_WORKLETS)\n#define MA_WEBAUDIO_LATENCY_HINT_BALANCED       \"balanced\"\n#define MA_WEBAUDIO_LATENCY_HINT_INTERACTIVE    \"interactive\"\n#define MA_WEBAUDIO_LATENCY_HINT_PLAYBACK       \"playback\"\n#endif\n\nstatic ma_bool32 ma_is_capture_supported__webaudio()\n{\n    return EM_ASM_INT({\n        return (navigator.mediaDevices !== undefined && navigator.mediaDevices.getUserMedia !== undefined);\n    }, 0) != 0; /* Must pass in a dummy argument for C99 compatibility. */\n}\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nvoid* EMSCRIPTEN_KEEPALIVE ma_malloc_emscripten(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_malloc(sz, pAllocationCallbacks);\n}\n\nvoid EMSCRIPTEN_KEEPALIVE ma_free_emscripten(void* p, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_free(p, pAllocationCallbacks);\n}\n\nvoid EMSCRIPTEN_KEEPALIVE ma_device_process_pcm_frames_capture__webaudio(ma_device* pDevice, int frameCount, float* pFrames)\n{\n    ma_device_handle_backend_data_callback(pDevice, NULL, pFrames, (ma_uint32)frameCount);\n}\n\nvoid EMSCRIPTEN_KEEPALIVE ma_device_process_pcm_frames_playback__webaudio(ma_device* pDevice, int frameCount, float* pFrames)\n{\n    ma_device_handle_backend_data_callback(pDevice, pFrames, NULL, (ma_uint32)frameCount);\n}\n#ifdef __cplusplus\n}\n#endif\n\nstatic ma_result ma_context_enumerate_devices__webaudio(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_bool32 cbResult = MA_TRUE;\n\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(callback != NULL);\n\n    /* Only supporting default devices for now. */\n\n    /* Playback. */\n    if (cbResult) {\n        ma_device_info deviceInfo;\n        MA_ZERO_OBJECT(&deviceInfo);\n        ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n        deviceInfo.isDefault = MA_TRUE;    /* Only supporting default devices. */\n        cbResult = callback(pContext, ma_device_type_playback, &deviceInfo, pUserData);\n    }\n\n    /* Capture. */\n    if (cbResult) {\n        if (ma_is_capture_supported__webaudio()) {\n            ma_device_info deviceInfo;\n            MA_ZERO_OBJECT(&deviceInfo);\n            ma_strncpy_s(deviceInfo.name, sizeof(deviceInfo.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n            deviceInfo.isDefault = MA_TRUE;    /* Only supporting default devices. */\n            cbResult = callback(pContext, ma_device_type_capture, &deviceInfo, pUserData);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_get_device_info__webaudio(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    MA_ASSERT(pContext != NULL);\n\n    if (deviceType == ma_device_type_capture && !ma_is_capture_supported__webaudio()) {\n        return MA_NO_DEVICE;\n    }\n\n    MA_ZERO_MEMORY(pDeviceInfo->id.webaudio, sizeof(pDeviceInfo->id.webaudio));\n\n    /* Only supporting default devices for now. */\n    (void)pDeviceID;\n    if (deviceType == ma_device_type_playback) {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n    } else {\n        ma_strncpy_s(pDeviceInfo->name, sizeof(pDeviceInfo->name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n    }\n\n    /* Only supporting default devices. */\n    pDeviceInfo->isDefault = MA_TRUE;\n\n    /* Web Audio can support any number of channels and sample rates. It only supports f32 formats, however. */\n    pDeviceInfo->nativeDataFormats[0].flags      = 0;\n    pDeviceInfo->nativeDataFormats[0].format     = ma_format_unknown;\n    pDeviceInfo->nativeDataFormats[0].channels   = 0; /* All channels are supported. */\n    pDeviceInfo->nativeDataFormats[0].sampleRate = EM_ASM_INT({\n        try {\n            var temp = new (window.AudioContext || window.webkitAudioContext)();\n            var sampleRate = temp.sampleRate;\n            temp.close();\n            return sampleRate;\n        } catch(e) {\n            return 0;\n        }\n    }, 0);  /* Must pass in a dummy argument for C99 compatibility. */\n\n    if (pDeviceInfo->nativeDataFormats[0].sampleRate == 0) {\n        return MA_NO_DEVICE;\n    }\n\n    pDeviceInfo->nativeDataFormatCount = 1;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_uninit__webaudio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    #if defined(MA_USE_AUDIO_WORKLETS)\n    {\n        EM_ASM({\n            var device = miniaudio.get_device_by_index($0);\n\n            if (device.streamNode !== undefined) {\n                device.streamNode.disconnect();\n                device.streamNode = undefined;\n            }\n        }, pDevice->webaudio.deviceIndex);\n\n        emscripten_destroy_web_audio_node(pDevice->webaudio.audioWorklet);\n        emscripten_destroy_audio_context(pDevice->webaudio.audioContext);\n        ma_free(pDevice->webaudio.pStackBuffer, &pDevice->pContext->allocationCallbacks);\n    }\n    #else\n    {\n        EM_ASM({\n            var device = miniaudio.get_device_by_index($0);\n\n            /* Make sure all nodes are disconnected and marked for collection. */\n            if (device.scriptNode !== undefined) {\n                device.scriptNode.onaudioprocess = function(e) {};  /* We want to reset the callback to ensure it doesn't get called after AudioContext.close() has returned. Shouldn't happen since we're disconnecting, but just to be safe... */\n                device.scriptNode.disconnect();\n                device.scriptNode = undefined;\n            }\n\n            if (device.streamNode !== undefined) {\n                device.streamNode.disconnect();\n                device.streamNode = undefined;\n            }\n\n            /*\n            Stop the device. I think there is a chance the callback could get fired after calling this, hence why we want\n            to clear the callback before closing.\n            */\n            device.webaudio.close();\n            device.webaudio = undefined;\n            device.pDevice = undefined;\n        }, pDevice->webaudio.deviceIndex);\n    }\n    #endif\n\n    /* Clean up the device on the JS side. */\n    EM_ASM({\n        miniaudio.untrack_device_by_index($0);\n    }, pDevice->webaudio.deviceIndex);\n\n    ma_free(pDevice->webaudio.pIntermediaryBuffer, &pDevice->pContext->allocationCallbacks);\n\n    return MA_SUCCESS;\n}\n\n#if !defined(MA_USE_AUDIO_WORKLETS)\nstatic ma_uint32 ma_calculate_period_size_in_frames_from_descriptor__webaudio(const ma_device_descriptor* pDescriptor, ma_uint32 nativeSampleRate, ma_performance_profile performanceProfile)\n{\n    /*\n    There have been reports of the default buffer size being too small on some browsers. If we're using\n    the default buffer size, we'll make sure the period size is bigger than our standard defaults.\n    */\n    ma_uint32 periodSizeInFrames;\n\n    if (nativeSampleRate == 0) {\n        nativeSampleRate = MA_DEFAULT_SAMPLE_RATE;\n    }\n\n    if (pDescriptor->periodSizeInFrames == 0) {\n        if (pDescriptor->periodSizeInMilliseconds == 0) {\n            if (performanceProfile == ma_performance_profile_low_latency) {\n                periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(33, nativeSampleRate);  /* 1 frame @ 30 FPS */\n            } else {\n                periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(333, nativeSampleRate);\n            }\n        } else {\n            periodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pDescriptor->periodSizeInMilliseconds, nativeSampleRate);\n        }\n    } else {\n        periodSizeInFrames = pDescriptor->periodSizeInFrames;\n    }\n\n    /* The size of the buffer must be a power of 2 and between 256 and 16384. */\n    if (periodSizeInFrames < 256) {\n        periodSizeInFrames = 256;\n    } else if (periodSizeInFrames > 16384) {\n        periodSizeInFrames = 16384;\n    } else {\n        periodSizeInFrames = ma_next_power_of_2(periodSizeInFrames);\n    }\n\n    return periodSizeInFrames;\n}\n#endif\n\n\n#if defined(MA_USE_AUDIO_WORKLETS)\ntypedef struct\n{\n    ma_device* pDevice;\n    const ma_device_config* pConfig;\n    ma_device_descriptor* pDescriptorPlayback;\n    ma_device_descriptor* pDescriptorCapture;\n} ma_audio_worklet_thread_initialized_data;\n\nstatic EM_BOOL ma_audio_worklet_process_callback__webaudio(int inputCount, const AudioSampleFrame* pInputs, int outputCount, AudioSampleFrame* pOutputs, int paramCount, const AudioParamFrame* pParams, void* pUserData)\n{\n    ma_device* pDevice = (ma_device*)pUserData;\n    ma_uint32 frameCount;\n\n    (void)paramCount;\n    (void)pParams;\n\n    if (ma_device_get_state(pDevice) != ma_device_state_started) {\n        return EM_TRUE;\n    }\n\n    /*\n    The Emscripten documentation says that it'll always be 128 frames being passed in. Hard coding it like that feels\n    like a very bad idea to me. Even if it's hard coded in the backend, the API and documentation should always refer\n    to variables instead of a hard coded number. In any case, will follow along for the time being.\n\n    Unfortunately the audio data is not interleaved so we'll need to convert it before we give the data to miniaudio\n    for further processing.\n    */\n    frameCount = 128;\n\n    if (inputCount > 0) {\n        /* Input data needs to be interleaved before we hand it to the client. */\n        for (ma_uint32 iChannel = 0; iChannel < pDevice->capture.internalChannels; iChannel += 1) {\n            for (ma_uint32 iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                pDevice->webaudio.pIntermediaryBuffer[iFrame*pDevice->capture.internalChannels + iChannel] = pInputs[0].data[frameCount*iChannel + iFrame];\n            }\n        }\n\n        ma_device_process_pcm_frames_capture__webaudio(pDevice, frameCount, pDevice->webaudio.pIntermediaryBuffer);\n    }\n\n    if (outputCount > 0) {\n        /* If it's a capture-only device, we'll need to output silence. */\n        if (pDevice->type == ma_device_type_capture) {\n            MA_ZERO_MEMORY(pOutputs[0].data, frameCount * pDevice->playback.internalChannels * sizeof(float));\n        } else {\n            ma_device_process_pcm_frames_playback__webaudio(pDevice, frameCount, pDevice->webaudio.pIntermediaryBuffer);\n\n            /* We've read the data from the client. Now we need to deinterleave the buffer and output to the output buffer. */\n            for (ma_uint32 iChannel = 0; iChannel < pDevice->playback.internalChannels; iChannel += 1) {\n                for (ma_uint32 iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                    pOutputs[0].data[frameCount*iChannel + iFrame] = pDevice->webaudio.pIntermediaryBuffer[iFrame*pDevice->playback.internalChannels + iChannel];\n                }\n            }\n        }\n    }\n\n    return EM_TRUE;\n}\n\n\nstatic void ma_audio_worklet_processor_created__webaudio(EMSCRIPTEN_WEBAUDIO_T audioContext, EM_BOOL success, void* pUserData)\n{\n    ma_audio_worklet_thread_initialized_data* pParameters = (ma_audio_worklet_thread_initialized_data*)pUserData;\n    EmscriptenAudioWorkletNodeCreateOptions audioWorkletOptions;\n    int channels = 0;\n    size_t intermediaryBufferSizeInFrames;\n    int sampleRate;\n\n    if (success == EM_FALSE) {\n        pParameters->pDevice->webaudio.initResult = MA_ERROR;\n        ma_free(pParameters, &pParameters->pDevice->pContext->allocationCallbacks);\n        return;\n    }\n\n    /* The next step is to initialize the audio worklet node. */\n    MA_ZERO_OBJECT(&audioWorkletOptions);\n\n    /*\n    The way channel counts work with Web Audio is confusing. As far as I can tell, there's no way to know the channel\n    count from MediaStreamAudioSourceNode (what we use for capture)? The only way to have control is to configure an\n    output channel count on the capture side. This is slightly confusing for capture mode because intuitively you\n    wouldn't actually connect an output to an input-only node, but this is what we'll have to do in order to have\n    proper control over the channel count. In the capture case, we'll have to output silence to it's output node.\n    */\n    if (pParameters->pConfig->deviceType == ma_device_type_capture) {\n        channels = (int)((pParameters->pDescriptorCapture->channels > 0) ? pParameters->pDescriptorCapture->channels : MA_DEFAULT_CHANNELS);\n        audioWorkletOptions.numberOfInputs = 1;\n    } else {\n        channels = (int)((pParameters->pDescriptorPlayback->channels > 0) ? pParameters->pDescriptorPlayback->channels : MA_DEFAULT_CHANNELS);\n\n        if (pParameters->pConfig->deviceType == ma_device_type_duplex) {\n            audioWorkletOptions.numberOfInputs = 1;\n        } else {\n            audioWorkletOptions.numberOfInputs = 0;\n        }\n    }\n\n    audioWorkletOptions.numberOfOutputs = 1;\n    audioWorkletOptions.outputChannelCounts = &channels;\n\n\n    /*\n    Now that we know the channel count to use we can allocate the intermediary buffer. The\n    intermediary buffer is used for interleaving and deinterleaving.\n    */\n    intermediaryBufferSizeInFrames = 128;\n\n    pParameters->pDevice->webaudio.pIntermediaryBuffer = (float*)ma_malloc(intermediaryBufferSizeInFrames * (ma_uint32)channels * sizeof(float), &pParameters->pDevice->pContext->allocationCallbacks);\n    if (pParameters->pDevice->webaudio.pIntermediaryBuffer == NULL) {\n        pParameters->pDevice->webaudio.initResult = MA_OUT_OF_MEMORY;\n        ma_free(pParameters, &pParameters->pDevice->pContext->allocationCallbacks);\n        return;\n    }\n\n\n    pParameters->pDevice->webaudio.audioWorklet = emscripten_create_wasm_audio_worklet_node(audioContext, \"miniaudio\", &audioWorkletOptions, &ma_audio_worklet_process_callback__webaudio, pParameters->pDevice);\n\n    /* With the audio worklet initialized we can now attach it to the graph. */\n    if (pParameters->pConfig->deviceType == ma_device_type_capture || pParameters->pConfig->deviceType == ma_device_type_duplex) {\n        ma_result attachmentResult = (ma_result)EM_ASM_INT({\n            var getUserMediaResult = 0;\n            var audioWorklet = emscriptenGetAudioObject($0);\n            var audioContext = emscriptenGetAudioObject($1);\n\n            navigator.mediaDevices.getUserMedia({audio:true, video:false})\n                .then(function(stream) {\n                    audioContext.streamNode = audioContext.createMediaStreamSource(stream);\n                    audioContext.streamNode.connect(audioWorklet);\n                    audioWorklet.connect(audioContext.destination);\n                    getUserMediaResult = 0;   /* 0 = MA_SUCCESS */\n                })\n                .catch(function(error) {\n                    console.log(\"navigator.mediaDevices.getUserMedia Failed: \" + error);\n                    getUserMediaResult = -1;  /* -1 = MA_ERROR */\n                });\n\n            return getUserMediaResult;\n        }, pParameters->pDevice->webaudio.audioWorklet, audioContext);\n\n        if (attachmentResult != MA_SUCCESS) {\n            ma_log_postf(ma_device_get_log(pParameters->pDevice), MA_LOG_LEVEL_ERROR, \"Web Audio: Failed to connect capture node.\");\n            emscripten_destroy_web_audio_node(pParameters->pDevice->webaudio.audioWorklet);\n            pParameters->pDevice->webaudio.initResult = attachmentResult;\n            ma_free(pParameters, &pParameters->pDevice->pContext->allocationCallbacks);\n            return;\n        }\n    }\n\n    /* If it's playback only we can now attach the worklet node to the graph. This has already been done for the duplex case. */\n    if (pParameters->pConfig->deviceType == ma_device_type_playback) {\n        ma_result attachmentResult = (ma_result)EM_ASM_INT({\n            var audioWorklet = emscriptenGetAudioObject($0);\n            var audioContext = emscriptenGetAudioObject($1);\n            audioWorklet.connect(audioContext.destination);\n            return 0;   /* 0 = MA_SUCCESS */\n        }, pParameters->pDevice->webaudio.audioWorklet, audioContext);\n\n        if (attachmentResult != MA_SUCCESS) {\n            ma_log_postf(ma_device_get_log(pParameters->pDevice), MA_LOG_LEVEL_ERROR, \"Web Audio: Failed to connect playback node.\");\n            pParameters->pDevice->webaudio.initResult = attachmentResult;\n            ma_free(pParameters, &pParameters->pDevice->pContext->allocationCallbacks);\n            return;\n        }\n    }\n\n    /* We need to update the descriptors so that they reflect the internal data format. Both capture and playback should be the same. */\n    sampleRate = EM_ASM_INT({ return emscriptenGetAudioObject($0).sampleRate; }, audioContext);\n\n    if (pParameters->pDescriptorCapture != NULL) {\n        pParameters->pDescriptorCapture->format              = ma_format_f32;\n        pParameters->pDescriptorCapture->channels            = (ma_uint32)channels;\n        pParameters->pDescriptorCapture->sampleRate          = (ma_uint32)sampleRate;\n        ma_channel_map_init_standard(ma_standard_channel_map_webaudio, pParameters->pDescriptorCapture->channelMap, ma_countof(pParameters->pDescriptorCapture->channelMap), pParameters->pDescriptorCapture->channels);\n        pParameters->pDescriptorCapture->periodSizeInFrames  = intermediaryBufferSizeInFrames;\n        pParameters->pDescriptorCapture->periodCount         = 1;\n    }\n\n    if (pParameters->pDescriptorPlayback != NULL) {\n        pParameters->pDescriptorPlayback->format             = ma_format_f32;\n        pParameters->pDescriptorPlayback->channels           = (ma_uint32)channels;\n        pParameters->pDescriptorPlayback->sampleRate         = (ma_uint32)sampleRate;\n        ma_channel_map_init_standard(ma_standard_channel_map_webaudio, pParameters->pDescriptorPlayback->channelMap, ma_countof(pParameters->pDescriptorPlayback->channelMap), pParameters->pDescriptorPlayback->channels);\n        pParameters->pDescriptorPlayback->periodSizeInFrames = intermediaryBufferSizeInFrames;\n        pParameters->pDescriptorPlayback->periodCount        = 1;\n    }\n\n    /* At this point we're done and we can return. */\n    ma_log_postf(ma_device_get_log(pParameters->pDevice), MA_LOG_LEVEL_DEBUG, \"AudioWorklets: Created worklet node: %d\\n\", pParameters->pDevice->webaudio.audioWorklet);\n    pParameters->pDevice->webaudio.initResult = MA_SUCCESS;\n    ma_free(pParameters, &pParameters->pDevice->pContext->allocationCallbacks);\n}\n\nstatic void ma_audio_worklet_thread_initialized__webaudio(EMSCRIPTEN_WEBAUDIO_T audioContext, EM_BOOL success, void* pUserData)\n{\n    ma_audio_worklet_thread_initialized_data* pParameters = (ma_audio_worklet_thread_initialized_data*)pUserData;\n    WebAudioWorkletProcessorCreateOptions workletProcessorOptions;\n\n    MA_ASSERT(pParameters != NULL);\n\n    if (success == EM_FALSE) {\n        pParameters->pDevice->webaudio.initResult = MA_ERROR;\n        return;\n    }\n\n    MA_ZERO_OBJECT(&workletProcessorOptions);\n    workletProcessorOptions.name = \"miniaudio\"; /* I'm not entirely sure what to call this. Does this need to be globally unique, or does it need only be unique for a given AudioContext? */\n\n    emscripten_create_wasm_audio_worklet_processor_async(audioContext, &workletProcessorOptions, ma_audio_worklet_processor_created__webaudio, pParameters);\n}\n#endif\n\nstatic ma_result ma_device_init__webaudio(ma_device* pDevice, const ma_device_config* pConfig, ma_device_descriptor* pDescriptorPlayback, ma_device_descriptor* pDescriptorCapture)\n{\n    if (pConfig->deviceType == ma_device_type_loopback) {\n        return MA_DEVICE_TYPE_NOT_SUPPORTED;\n    }\n\n    /* No exclusive mode with Web Audio. */\n    if (((pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) && pDescriptorPlayback->shareMode == ma_share_mode_exclusive) ||\n        ((pConfig->deviceType == ma_device_type_capture  || pConfig->deviceType == ma_device_type_duplex) && pDescriptorCapture->shareMode  == ma_share_mode_exclusive)) {\n        return MA_SHARE_MODE_NOT_SUPPORTED;\n    }\n\n    /*\n    With AudioWorklets we'll have just a single AudioContext. I'm not sure why I'm not doing this for ScriptProcessorNode so\n    it might be worthwhile to look into that as well.\n    */\n    #if defined(MA_USE_AUDIO_WORKLETS)\n    {\n        EmscriptenWebAudioCreateAttributes audioContextAttributes;\n        ma_audio_worklet_thread_initialized_data* pInitParameters;\n        void* pStackBuffer;\n\n        if (pConfig->performanceProfile == ma_performance_profile_conservative) {\n            audioContextAttributes.latencyHint = MA_WEBAUDIO_LATENCY_HINT_PLAYBACK;\n        } else {\n            audioContextAttributes.latencyHint = MA_WEBAUDIO_LATENCY_HINT_INTERACTIVE;\n        }\n\n        /*\n        In my testing, Firefox does not seem to capture audio data properly if the sample rate is set\n        to anything other than 48K. This does not seem to be the case for other browsers. For this reason,\n        if the device type is anything other than playback, we'll leave the sample rate as-is and let the\n        browser pick the appropriate rate for us.\n        */\n        if (pConfig->deviceType == ma_device_type_playback) {\n            audioContextAttributes.sampleRate = pDescriptorPlayback->sampleRate;\n        } else {\n            audioContextAttributes.sampleRate = 0;\n        }\n\n        /* It's not clear if this can return an error. None of the tests in the Emscripten repository check for this, so neither am I for now. */\n        pDevice->webaudio.audioContext = emscripten_create_audio_context(&audioContextAttributes);\n\n\n        /*\n        With the context created we can now create the worklet. We can only have a single worklet per audio\n        context which means we'll need to craft this appropriately to handle duplex devices correctly.\n        */\n\n        /*\n        We now need to create a worker thread. This is a bit weird because we need to allocate our\n        own buffer for the thread's stack. The stack needs to be aligned to 16 bytes. I'm going to\n        allocate this on the heap to keep it simple.\n        */\n        pStackBuffer = ma_aligned_malloc(MA_AUDIO_WORKLETS_THREAD_STACK_SIZE, 16, &pDevice->pContext->allocationCallbacks);\n        if (pStackBuffer == NULL) {\n            emscripten_destroy_audio_context(pDevice->webaudio.audioContext);\n            return MA_OUT_OF_MEMORY;\n        }\n\n        /* Our thread initialization parameters need to be allocated on the heap so they don't go out of scope. */\n        pInitParameters = (ma_audio_worklet_thread_initialized_data*)ma_malloc(sizeof(*pInitParameters), &pDevice->pContext->allocationCallbacks);\n        if (pInitParameters == NULL) {\n            ma_free(pStackBuffer, &pDevice->pContext->allocationCallbacks);\n            emscripten_destroy_audio_context(pDevice->webaudio.audioContext);\n            return MA_OUT_OF_MEMORY;\n        }\n\n        pInitParameters->pDevice = pDevice;\n        pInitParameters->pConfig = pConfig;\n        pInitParameters->pDescriptorPlayback = pDescriptorPlayback;\n        pInitParameters->pDescriptorCapture  = pDescriptorCapture;\n\n        /*\n        We need to flag the device as not yet initialized so we can wait on it later. Unfortunately all of\n        the Emscripten WebAudio stuff is asynchronous.\n        */\n        pDevice->webaudio.initResult = MA_BUSY;\n        {\n            emscripten_start_wasm_audio_worklet_thread_async(pDevice->webaudio.audioContext, pStackBuffer, MA_AUDIO_WORKLETS_THREAD_STACK_SIZE, ma_audio_worklet_thread_initialized__webaudio, pInitParameters);\n        }\n        while (pDevice->webaudio.initResult == MA_BUSY) { emscripten_sleep(1); }    /* We must wait for initialization to complete. We're just spinning here. The emscripten_sleep() call is why we need to build with `-sASYNCIFY`. */\n\n        /* Initialization is now complete. Descriptors were updated when the worklet was initialized. */\n        if (pDevice->webaudio.initResult != MA_SUCCESS) {\n            ma_free(pStackBuffer, &pDevice->pContext->allocationCallbacks);\n            emscripten_destroy_audio_context(pDevice->webaudio.audioContext);\n            return pDevice->webaudio.initResult;\n        }\n\n        /* We need to add an entry to the miniaudio.devices list on the JS side so we can do some JS/C interop. */\n        pDevice->webaudio.deviceIndex = EM_ASM_INT({\n            return miniaudio.track_device({\n                webaudio: emscriptenGetAudioObject($0),\n                state:    1 /* 1 = ma_device_state_stopped */\n            });\n        }, pDevice->webaudio.audioContext);\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* ScriptProcessorNode. This path requires us to do almost everything in JS, but we'll do as much as we can in C. */\n        ma_uint32 deviceIndex;\n        ma_uint32 channels;\n        ma_uint32 sampleRate;\n        ma_uint32 periodSizeInFrames;\n\n        /* The channel count will depend on the device type. If it's a capture, use it's, otherwise use the playback side. */\n        if (pConfig->deviceType == ma_device_type_capture) {\n            channels = (pDescriptorCapture->channels  > 0) ? pDescriptorCapture->channels  : MA_DEFAULT_CHANNELS;\n        } else {\n            channels = (pDescriptorPlayback->channels > 0) ? pDescriptorPlayback->channels : MA_DEFAULT_CHANNELS;\n        }\n\n        /*\n        When testing in Firefox, I've seen it where capture mode fails if the sample rate is changed to anything other than it's\n        native rate. For this reason we're leaving the sample rate untouched for capture devices.\n        */\n        if (pConfig->deviceType == ma_device_type_playback) {\n            sampleRate = pDescriptorPlayback->sampleRate;\n        } else {\n            sampleRate = 0; /* Let the browser decide when capturing. */\n        }\n\n        /* The period size needs to be a power of 2. */\n        if (pConfig->deviceType == ma_device_type_capture) {\n            periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__webaudio(pDescriptorCapture, sampleRate, pConfig->performanceProfile);\n        } else {\n            periodSizeInFrames = ma_calculate_period_size_in_frames_from_descriptor__webaudio(pDescriptorPlayback, sampleRate, pConfig->performanceProfile);\n        }\n\n        /* We need an intermediary buffer for doing interleaving and deinterleaving. */\n        pDevice->webaudio.pIntermediaryBuffer = (float*)ma_malloc(periodSizeInFrames * channels * sizeof(float), &pDevice->pContext->allocationCallbacks);\n        if (pDevice->webaudio.pIntermediaryBuffer == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n\n        deviceIndex = EM_ASM_INT({\n            var deviceType = $0;\n            var channels   = $1;\n            var sampleRate = $2;\n            var bufferSize = $3;\n            var pIntermediaryBuffer = $4;\n            var pDevice    = $5;\n\n            if (typeof(window.miniaudio) === 'undefined') {\n                return -1;  /* Context not initialized. */\n            }\n\n            var device = {};\n\n            /* First thing we need is an AudioContext. */\n            var audioContextOptions = {};\n            if (deviceType == window.miniaudio.device_type.playback && sampleRate != 0) {\n                audioContextOptions.sampleRate = sampleRate;\n            }\n\n            device.webaudio = new (window.AudioContext || window.webkitAudioContext)(audioContextOptions);\n            device.webaudio.suspend();  /* The AudioContext must be created in a suspended state. */\n            device.state = window.miniaudio.device_state.stopped;\n\n            /*\n            We need to create a ScriptProcessorNode. The channel situation is the same as the AudioWorklet path in that we\n            need to specify an output and configure the channel count there.\n            */\n            var channelCountIn  = 0;\n            var channelCountOut = channels;\n            if (deviceType != window.miniaudio.device_type.playback) {\n                channelCountIn  = channels;\n            }\n\n            device.scriptNode = device.webaudio.createScriptProcessor(bufferSize, channelCountIn, channelCountOut);\n\n            /* The node processing callback. */\n            device.scriptNode.onaudioprocess = function(e) {\n                if (device.intermediaryBufferView == null || device.intermediaryBufferView.length == 0) {\n                    device.intermediaryBufferView = new Float32Array(Module.HEAPF32.buffer, pIntermediaryBuffer, bufferSize * channels);\n                }\n\n                /* Do the capture side first. */\n                if (deviceType == miniaudio.device_type.capture || deviceType == miniaudio.device_type.duplex) {\n                    /* The data must be interleaved before being processed miniaudio. */\n                    for (var iChannel = 0; iChannel < channels; iChannel += 1) {\n                        var inputBuffer = e.inputBuffer.getChannelData(iChannel);\n                        var intermediaryBuffer = device.intermediaryBufferView;\n\n                        for (var iFrame = 0; iFrame < bufferSize; iFrame += 1) {\n                            intermediaryBuffer[iFrame*channels + iChannel] = inputBuffer[iFrame];\n                        }\n                    }\n\n                    _ma_device_process_pcm_frames_capture__webaudio(pDevice, bufferSize, pIntermediaryBuffer);\n                }\n\n                if (deviceType == miniaudio.device_type.playback || deviceType == miniaudio.device_type.duplex) {\n                    _ma_device_process_pcm_frames_playback__webaudio(pDevice, bufferSize, pIntermediaryBuffer);\n\n                    for (var iChannel = 0; iChannel < e.outputBuffer.numberOfChannels; ++iChannel) {\n                        var outputBuffer = e.outputBuffer.getChannelData(iChannel);\n                        var intermediaryBuffer = device.intermediaryBufferView;\n\n                        for (var iFrame = 0; iFrame < bufferSize; iFrame += 1) {\n                            outputBuffer[iFrame] = intermediaryBuffer[iFrame*channels + iChannel];\n                        }\n                    }\n                } else {\n                    /* It's a capture-only device. Make sure the output is silenced. */\n                    for (var iChannel = 0; iChannel < e.outputBuffer.numberOfChannels; ++iChannel) {\n                        e.outputBuffer.getChannelData(iChannel).fill(0.0);\n                    }\n                }\n            };\n\n            /* Now we need to connect our node to the graph. */\n            if (deviceType == miniaudio.device_type.capture || deviceType == miniaudio.device_type.duplex) {\n                navigator.mediaDevices.getUserMedia({audio:true, video:false})\n                    .then(function(stream) {\n                        device.streamNode = device.webaudio.createMediaStreamSource(stream);\n                        device.streamNode.connect(device.scriptNode);\n                        device.scriptNode.connect(device.webaudio.destination);\n                    })\n                    .catch(function(error) {\n                        console.log(\"Failed to get user media: \" + error);\n                    });\n            }\n\n            if (deviceType == miniaudio.device_type.playback) {\n                device.scriptNode.connect(device.webaudio.destination);\n            }\n\n            device.pDevice = pDevice;\n\n            return miniaudio.track_device(device);\n        }, pConfig->deviceType, channels, sampleRate, periodSizeInFrames, pDevice->webaudio.pIntermediaryBuffer, pDevice);\n\n        if (deviceIndex < 0) {\n            return MA_FAILED_TO_OPEN_BACKEND_DEVICE;\n        }\n\n        pDevice->webaudio.deviceIndex = deviceIndex;\n\n        /* Grab the sample rate from the audio context directly. */\n        sampleRate = (ma_uint32)EM_ASM_INT({ return miniaudio.get_device_by_index($0).webaudio.sampleRate; }, deviceIndex);\n\n        if (pDescriptorCapture != NULL) {\n            pDescriptorCapture->format              = ma_format_f32;\n            pDescriptorCapture->channels            = channels;\n            pDescriptorCapture->sampleRate          = sampleRate;\n            ma_channel_map_init_standard(ma_standard_channel_map_webaudio, pDescriptorCapture->channelMap, ma_countof(pDescriptorCapture->channelMap), pDescriptorCapture->channels);\n            pDescriptorCapture->periodSizeInFrames  = periodSizeInFrames;\n            pDescriptorCapture->periodCount         = 1;\n        }\n\n        if (pDescriptorPlayback != NULL) {\n            pDescriptorPlayback->format             = ma_format_f32;\n            pDescriptorPlayback->channels           = channels;\n            pDescriptorPlayback->sampleRate         = sampleRate;\n            ma_channel_map_init_standard(ma_standard_channel_map_webaudio, pDescriptorPlayback->channelMap, ma_countof(pDescriptorPlayback->channelMap), pDescriptorPlayback->channels);\n            pDescriptorPlayback->periodSizeInFrames = periodSizeInFrames;\n            pDescriptorPlayback->periodCount        = 1;\n        }\n\n        return MA_SUCCESS;\n    }\n    #endif\n}\n\nstatic ma_result ma_device_start__webaudio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    EM_ASM({\n        var device = miniaudio.get_device_by_index($0);\n        device.webaudio.resume();\n        device.state = miniaudio.device_state.started;\n    }, pDevice->webaudio.deviceIndex);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_device_stop__webaudio(ma_device* pDevice)\n{\n    MA_ASSERT(pDevice != NULL);\n\n    /*\n    From the WebAudio API documentation for AudioContext.suspend():\n\n        Suspends the progression of AudioContext's currentTime, allows any current context processing blocks that are already processed to be played to the\n        destination, and then allows the system to release its claim on audio hardware.\n\n    I read this to mean that \"any current context processing blocks\" are processed by suspend() - i.e. They they are drained. We therefore shouldn't need to\n    do any kind of explicit draining.\n    */\n    EM_ASM({\n        var device = miniaudio.get_device_by_index($0);\n        device.webaudio.suspend();\n        device.state = miniaudio.device_state.stopped;\n    }, pDevice->webaudio.deviceIndex);\n\n    ma_device__on_notification_stopped(pDevice);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_uninit__webaudio(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n    MA_ASSERT(pContext->backend == ma_backend_webaudio);\n\n    (void)pContext; /* Unused. */\n\n    /* Remove the global miniaudio object from window if there are no more references to it. */\n    EM_ASM({\n        if (typeof(window.miniaudio) !== 'undefined') {\n            window.miniaudio.referenceCount -= 1;\n            if (window.miniaudio.referenceCount === 0) {\n                delete window.miniaudio;\n            }\n        }\n    });\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init__webaudio(ma_context* pContext, const ma_context_config* pConfig, ma_backend_callbacks* pCallbacks)\n{\n    int resultFromJS;\n\n    MA_ASSERT(pContext != NULL);\n\n    (void)pConfig; /* Unused. */\n\n    /* Here is where our global JavaScript object is initialized. */\n    resultFromJS = EM_ASM_INT({\n        if (typeof window === 'undefined' || (window.AudioContext || window.webkitAudioContext) === undefined) {\n            return 0;   /* Web Audio not supported. */\n        }\n\n        if (typeof(window.miniaudio) === 'undefined') {\n            window.miniaudio = {\n                referenceCount: 0\n            };\n\n            /* Device types. */\n            window.miniaudio.device_type = {};\n            window.miniaudio.device_type.playback = $0;\n            window.miniaudio.device_type.capture  = $1;\n            window.miniaudio.device_type.duplex   = $2;\n\n            /* Device states. */\n            window.miniaudio.device_state = {};\n            window.miniaudio.device_state.stopped = $3;\n            window.miniaudio.device_state.started = $4;\n\n            /* Device cache for mapping devices to indexes for JavaScript/C interop. */\n            miniaudio.devices = [];\n\n            miniaudio.track_device = function(device) {\n                /* Try inserting into a free slot first. */\n                for (var iDevice = 0; iDevice < miniaudio.devices.length; ++iDevice) {\n                    if (miniaudio.devices[iDevice] == null) {\n                        miniaudio.devices[iDevice] = device;\n                        return iDevice;\n                    }\n                }\n\n                /* Getting here means there is no empty slots in the array so we just push to the end. */\n                miniaudio.devices.push(device);\n                return miniaudio.devices.length - 1;\n            };\n\n            miniaudio.untrack_device_by_index = function(deviceIndex) {\n                /* We just set the device's slot to null. The slot will get reused in the next call to ma_track_device. */\n                miniaudio.devices[deviceIndex] = null;\n\n                /* Trim the array if possible. */\n                while (miniaudio.devices.length > 0) {\n                    if (miniaudio.devices[miniaudio.devices.length-1] == null) {\n                        miniaudio.devices.pop();\n                    } else {\n                        break;\n                    }\n                }\n            };\n\n            miniaudio.untrack_device = function(device) {\n                for (var iDevice = 0; iDevice < miniaudio.devices.length; ++iDevice) {\n                    if (miniaudio.devices[iDevice] == device) {\n                        return miniaudio.untrack_device_by_index(iDevice);\n                    }\n                }\n            };\n\n            miniaudio.get_device_by_index = function(deviceIndex) {\n                return miniaudio.devices[deviceIndex];\n            };\n\n            miniaudio.unlock_event_types = (function(){\n                return ['touchend', 'click'];\n            })();\n\n            miniaudio.unlock = function() {\n                for(var i = 0; i < miniaudio.devices.length; ++i) {\n                    var device = miniaudio.devices[i];\n                    if (device != null &&\n                        device.webaudio != null &&\n                        device.state === window.miniaudio.device_state.started) {\n\n                        device.webaudio.resume().then(() => {\n                                Module._ma_device__on_notification_unlocked(device.pDevice);\n                            },\n                            (error) => {console.error(\"Failed to resume audiocontext\", error);\n                            });\n                    }\n                }\n                miniaudio.unlock_event_types.map(function(event_type) {\n                    document.removeEventListener(event_type, miniaudio.unlock, true);\n                });\n            };\n\n            miniaudio.unlock_event_types.map(function(event_type) {\n                document.addEventListener(event_type, miniaudio.unlock, true);\n            });\n        }\n\n        window.miniaudio.referenceCount += 1;\n\n        return 1;\n    }, ma_device_type_playback, ma_device_type_capture, ma_device_type_duplex, ma_device_state_stopped, ma_device_state_started);\n\n    if (resultFromJS != 1) {\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    pCallbacks->onContextInit             = ma_context_init__webaudio;\n    pCallbacks->onContextUninit           = ma_context_uninit__webaudio;\n    pCallbacks->onContextEnumerateDevices = ma_context_enumerate_devices__webaudio;\n    pCallbacks->onContextGetDeviceInfo    = ma_context_get_device_info__webaudio;\n    pCallbacks->onDeviceInit              = ma_device_init__webaudio;\n    pCallbacks->onDeviceUninit            = ma_device_uninit__webaudio;\n    pCallbacks->onDeviceStart             = ma_device_start__webaudio;\n    pCallbacks->onDeviceStop              = ma_device_stop__webaudio;\n    pCallbacks->onDeviceRead              = NULL;   /* Not needed because WebAudio is asynchronous. */\n    pCallbacks->onDeviceWrite             = NULL;   /* Not needed because WebAudio is asynchronous. */\n    pCallbacks->onDeviceDataLoop          = NULL;   /* Not needed because WebAudio is asynchronous. */\n\n    return MA_SUCCESS;\n}\n#endif  /* Web Audio */\n\n\n\nstatic ma_bool32 ma__is_channel_map_valid(const ma_channel* pChannelMap, ma_uint32 channels)\n{\n    /* A blank channel map should be allowed, in which case it should use an appropriate default which will depend on context. */\n    if (pChannelMap != NULL && pChannelMap[0] != MA_CHANNEL_NONE) {\n        ma_uint32 iChannel;\n\n        if (channels == 0 || channels > MA_MAX_CHANNELS) {\n            return MA_FALSE;   /* Channel count out of range. */\n        }\n\n        /* A channel cannot be present in the channel map more than once. */\n        for (iChannel = 0; iChannel < channels; ++iChannel) {\n            ma_uint32 jChannel;\n            for (jChannel = iChannel + 1; jChannel < channels; ++jChannel) {\n                if (pChannelMap[iChannel] == pChannelMap[jChannel]) {\n                    return MA_FALSE;\n                }\n            }\n        }\n    }\n\n    return MA_TRUE;\n}\n\n\nstatic ma_bool32 ma_context_is_backend_asynchronous(ma_context* pContext)\n{\n    MA_ASSERT(pContext != NULL);\n\n    if (pContext->callbacks.onDeviceRead == NULL && pContext->callbacks.onDeviceWrite == NULL) {\n        if (pContext->callbacks.onDeviceDataLoop == NULL) {\n            return MA_TRUE;\n        } else {\n            return MA_FALSE;\n        }\n    } else {\n        return MA_FALSE;\n    }\n}\n\n\nstatic ma_result ma_device__post_init_setup(ma_device* pDevice, ma_device_type deviceType)\n{\n    ma_result result;\n\n    MA_ASSERT(pDevice != NULL);\n\n    if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) {\n        if (pDevice->capture.format == ma_format_unknown) {\n            pDevice->capture.format = pDevice->capture.internalFormat;\n        }\n        if (pDevice->capture.channels == 0) {\n            pDevice->capture.channels = pDevice->capture.internalChannels;\n        }\n        if (pDevice->capture.channelMap[0] == MA_CHANNEL_NONE) {\n            MA_ASSERT(pDevice->capture.channels <= MA_MAX_CHANNELS);\n            if (pDevice->capture.internalChannels == pDevice->capture.channels) {\n                ma_channel_map_copy(pDevice->capture.channelMap, pDevice->capture.internalChannelMap, pDevice->capture.channels);\n            } else {\n                if (pDevice->capture.channelMixMode == ma_channel_mix_mode_simple) {\n                    ma_channel_map_init_blank(pDevice->capture.channelMap, pDevice->capture.channels);\n                } else {\n                    ma_channel_map_init_standard(ma_standard_channel_map_default, pDevice->capture.channelMap, ma_countof(pDevice->capture.channelMap), pDevice->capture.channels);\n                }\n            }\n        }\n    }\n\n    if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) {\n        if (pDevice->playback.format == ma_format_unknown) {\n            pDevice->playback.format = pDevice->playback.internalFormat;\n        }\n        if (pDevice->playback.channels == 0) {\n            pDevice->playback.channels = pDevice->playback.internalChannels;\n        }\n        if (pDevice->playback.channelMap[0] == MA_CHANNEL_NONE) {\n            MA_ASSERT(pDevice->playback.channels <= MA_MAX_CHANNELS);\n            if (pDevice->playback.internalChannels == pDevice->playback.channels) {\n                ma_channel_map_copy(pDevice->playback.channelMap, pDevice->playback.internalChannelMap, pDevice->playback.channels);\n            } else {\n                if (pDevice->playback.channelMixMode == ma_channel_mix_mode_simple) {\n                    ma_channel_map_init_blank(pDevice->playback.channelMap, pDevice->playback.channels);\n                } else {\n                    ma_channel_map_init_standard(ma_standard_channel_map_default, pDevice->playback.channelMap, ma_countof(pDevice->playback.channelMap), pDevice->playback.channels);\n                }\n            }\n        }\n    }\n\n    if (pDevice->sampleRate == 0) {\n        if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) {\n            pDevice->sampleRate = pDevice->capture.internalSampleRate;\n        } else {\n            pDevice->sampleRate = pDevice->playback.internalSampleRate;\n        }\n    }\n\n    /* Data converters. */\n    if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) {\n        /* Converting from internal device format to client format. */\n        ma_data_converter_config converterConfig = ma_data_converter_config_init_default();\n        converterConfig.formatIn                        = pDevice->capture.internalFormat;\n        converterConfig.channelsIn                      = pDevice->capture.internalChannels;\n        converterConfig.sampleRateIn                    = pDevice->capture.internalSampleRate;\n        converterConfig.pChannelMapIn                   = pDevice->capture.internalChannelMap;\n        converterConfig.formatOut                       = pDevice->capture.format;\n        converterConfig.channelsOut                     = pDevice->capture.channels;\n        converterConfig.sampleRateOut                   = pDevice->sampleRate;\n        converterConfig.pChannelMapOut                  = pDevice->capture.channelMap;\n        converterConfig.channelMixMode                  = pDevice->capture.channelMixMode;\n        converterConfig.calculateLFEFromSpatialChannels = pDevice->capture.calculateLFEFromSpatialChannels;\n        converterConfig.allowDynamicSampleRate          = MA_FALSE;\n        converterConfig.resampling.algorithm            = pDevice->resampling.algorithm;\n        converterConfig.resampling.linear.lpfOrder      = pDevice->resampling.linear.lpfOrder;\n        converterConfig.resampling.pBackendVTable       = pDevice->resampling.pBackendVTable;\n        converterConfig.resampling.pBackendUserData     = pDevice->resampling.pBackendUserData;\n\n        /* Make sure the old converter is uninitialized first. */\n        if (ma_device_get_state(pDevice) != ma_device_state_uninitialized) {\n            ma_data_converter_uninit(&pDevice->capture.converter, &pDevice->pContext->allocationCallbacks);\n        }\n\n        result = ma_data_converter_init(&converterConfig, &pDevice->pContext->allocationCallbacks, &pDevice->capture.converter);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) {\n        /* Converting from client format to device format. */\n        ma_data_converter_config converterConfig = ma_data_converter_config_init_default();\n        converterConfig.formatIn                        = pDevice->playback.format;\n        converterConfig.channelsIn                      = pDevice->playback.channels;\n        converterConfig.sampleRateIn                    = pDevice->sampleRate;\n        converterConfig.pChannelMapIn                   = pDevice->playback.channelMap;\n        converterConfig.formatOut                       = pDevice->playback.internalFormat;\n        converterConfig.channelsOut                     = pDevice->playback.internalChannels;\n        converterConfig.sampleRateOut                   = pDevice->playback.internalSampleRate;\n        converterConfig.pChannelMapOut                  = pDevice->playback.internalChannelMap;\n        converterConfig.channelMixMode                  = pDevice->playback.channelMixMode;\n        converterConfig.calculateLFEFromSpatialChannels = pDevice->playback.calculateLFEFromSpatialChannels;\n        converterConfig.allowDynamicSampleRate          = MA_FALSE;\n        converterConfig.resampling.algorithm            = pDevice->resampling.algorithm;\n        converterConfig.resampling.linear.lpfOrder      = pDevice->resampling.linear.lpfOrder;\n        converterConfig.resampling.pBackendVTable       = pDevice->resampling.pBackendVTable;\n        converterConfig.resampling.pBackendUserData     = pDevice->resampling.pBackendUserData;\n\n        /* Make sure the old converter is uninitialized first. */\n        if (ma_device_get_state(pDevice) != ma_device_state_uninitialized) {\n            ma_data_converter_uninit(&pDevice->playback.converter, &pDevice->pContext->allocationCallbacks);\n        }\n\n        result = ma_data_converter_init(&converterConfig, &pDevice->pContext->allocationCallbacks, &pDevice->playback.converter);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n\n    /*\n    If the device is doing playback (ma_device_type_playback or ma_device_type_duplex), there's\n    a couple of situations where we'll need a heap allocated cache.\n\n    The first is a duplex device for backends that use a callback for data delivery. The reason\n    this is needed is that the input stage needs to have a buffer to place the input data while it\n    waits for the playback stage, after which the miniaudio data callback will get fired. This is\n    not needed for backends that use a blocking API because miniaudio manages temporary buffers on\n    the stack to achieve this.\n\n    The other situation is when the data converter does not have the ability to query the number\n    of input frames that are required in order to process a given number of output frames. When\n    performing data conversion, it's useful if miniaudio know exactly how many frames it needs\n    from the client in order to generate a given number of output frames. This way, only exactly\n    the number of frames are needed to be read from the client which means no cache is necessary.\n    On the other hand, if miniaudio doesn't know how many frames to read, it is forced to read\n    in fixed sized chunks and then cache any residual unused input frames, those of which will be\n    processed at a later stage.\n    */\n    if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) {\n        ma_uint64 unused;\n\n        pDevice->playback.inputCacheConsumed  = 0;\n        pDevice->playback.inputCacheRemaining = 0;\n\n        if (pDevice->type == ma_device_type_duplex ||                                                                       /* Duplex. backend may decide to use ma_device_handle_backend_data_callback() which will require this cache. */\n            ma_data_converter_get_required_input_frame_count(&pDevice->playback.converter, 1, &unused) != MA_SUCCESS)       /* Data conversion required input frame calculation not supported. */\n        {\n            /* We need a heap allocated cache. We want to size this based on the period size. */\n            void* pNewInputCache;\n            ma_uint64 newInputCacheCap;\n            ma_uint64 newInputCacheSizeInBytes;\n\n            newInputCacheCap = ma_calculate_frame_count_after_resampling(pDevice->playback.internalSampleRate, pDevice->sampleRate, pDevice->playback.internalPeriodSizeInFrames);\n\n            newInputCacheSizeInBytes = newInputCacheCap * ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels);\n            if (newInputCacheSizeInBytes > MA_SIZE_MAX) {\n                ma_free(pDevice->playback.pInputCache, &pDevice->pContext->allocationCallbacks);\n                pDevice->playback.pInputCache   = NULL;\n                pDevice->playback.inputCacheCap = 0;\n                return MA_OUT_OF_MEMORY;    /* Allocation too big. Should never hit this, but makes the cast below safer for 32-bit builds. */\n            }\n\n            pNewInputCache = ma_realloc(pDevice->playback.pInputCache, (size_t)newInputCacheSizeInBytes, &pDevice->pContext->allocationCallbacks);\n            if (pNewInputCache == NULL) {\n                ma_free(pDevice->playback.pInputCache, &pDevice->pContext->allocationCallbacks);\n                pDevice->playback.pInputCache   = NULL;\n                pDevice->playback.inputCacheCap = 0;\n                return MA_OUT_OF_MEMORY;\n            }\n\n            pDevice->playback.pInputCache   = pNewInputCache;\n            pDevice->playback.inputCacheCap = newInputCacheCap;\n        } else {\n            /* Heap allocation not required. Make sure we clear out the old cache just in case this function was called in response to a route change. */\n            ma_free(pDevice->playback.pInputCache, &pDevice->pContext->allocationCallbacks);\n            pDevice->playback.pInputCache   = NULL;\n            pDevice->playback.inputCacheCap = 0;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_device_post_init(ma_device* pDevice, ma_device_type deviceType, const ma_device_descriptor* pDescriptorPlayback, const ma_device_descriptor* pDescriptorCapture)\n{\n    ma_result result;\n\n    if (pDevice == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Capture. */\n    if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) {\n        if (ma_device_descriptor_is_valid(pDescriptorCapture) == MA_FALSE) {\n            return MA_INVALID_ARGS;\n        }\n\n        pDevice->capture.internalFormat             = pDescriptorCapture->format;\n        pDevice->capture.internalChannels           = pDescriptorCapture->channels;\n        pDevice->capture.internalSampleRate         = pDescriptorCapture->sampleRate;\n        MA_COPY_MEMORY(pDevice->capture.internalChannelMap, pDescriptorCapture->channelMap, sizeof(pDescriptorCapture->channelMap));\n        pDevice->capture.internalPeriodSizeInFrames = pDescriptorCapture->periodSizeInFrames;\n        pDevice->capture.internalPeriods            = pDescriptorCapture->periodCount;\n\n        if (pDevice->capture.internalPeriodSizeInFrames == 0) {\n            pDevice->capture.internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pDescriptorCapture->periodSizeInMilliseconds, pDescriptorCapture->sampleRate);\n        }\n    }\n\n    /* Playback. */\n    if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) {\n        if (ma_device_descriptor_is_valid(pDescriptorPlayback) == MA_FALSE) {\n            return MA_INVALID_ARGS;\n        }\n\n        pDevice->playback.internalFormat             = pDescriptorPlayback->format;\n        pDevice->playback.internalChannels           = pDescriptorPlayback->channels;\n        pDevice->playback.internalSampleRate         = pDescriptorPlayback->sampleRate;\n        MA_COPY_MEMORY(pDevice->playback.internalChannelMap, pDescriptorPlayback->channelMap, sizeof(pDescriptorPlayback->channelMap));\n        pDevice->playback.internalPeriodSizeInFrames = pDescriptorPlayback->periodSizeInFrames;\n        pDevice->playback.internalPeriods            = pDescriptorPlayback->periodCount;\n\n        if (pDevice->playback.internalPeriodSizeInFrames == 0) {\n            pDevice->playback.internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(pDescriptorPlayback->periodSizeInMilliseconds, pDescriptorPlayback->sampleRate);\n        }\n    }\n\n    /*\n    The name of the device can be retrieved from device info. This may be temporary and replaced with a `ma_device_get_info(pDevice, deviceType)` instead.\n    For loopback devices, we need to retrieve the name of the playback device.\n    */\n    {\n        ma_device_info deviceInfo;\n\n        if (deviceType == ma_device_type_capture || deviceType == ma_device_type_duplex || deviceType == ma_device_type_loopback) {\n            result = ma_device_get_info(pDevice, (deviceType == ma_device_type_loopback) ? ma_device_type_playback : ma_device_type_capture, &deviceInfo);\n            if (result == MA_SUCCESS) {\n                ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), deviceInfo.name, (size_t)-1);\n            } else {\n                /* We failed to retrieve the device info. Fall back to a default name. */\n                if (pDescriptorCapture->pDeviceID == NULL) {\n                    ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n                } else {\n                    ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), \"Capture Device\", (size_t)-1);\n                }\n            }\n        }\n\n        if (deviceType == ma_device_type_playback || deviceType == ma_device_type_duplex) {\n            result = ma_device_get_info(pDevice, ma_device_type_playback, &deviceInfo);\n            if (result == MA_SUCCESS) {\n                ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), deviceInfo.name, (size_t)-1);\n            } else {\n                /* We failed to retrieve the device info. Fall back to a default name. */\n                if (pDescriptorPlayback->pDeviceID == NULL) {\n                    ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n                } else {\n                    ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), \"Playback Device\", (size_t)-1);\n                }\n            }\n        }\n    }\n\n    /* Update data conversion. */\n    return ma_device__post_init_setup(pDevice, deviceType); /* TODO: Should probably rename ma_device__post_init_setup() to something better. */\n}\n\n\nstatic ma_thread_result MA_THREADCALL ma_worker_thread(void* pData)\n{\n    ma_device* pDevice = (ma_device*)pData;\n#ifdef MA_WIN32\n    HRESULT CoInitializeResult;\n#endif\n\n    MA_ASSERT(pDevice != NULL);\n\n#ifdef MA_WIN32\n    CoInitializeResult = ma_CoInitializeEx(pDevice->pContext, NULL, MA_COINIT_VALUE);\n#endif\n\n    /*\n    When the device is being initialized it's initial state is set to ma_device_state_uninitialized. Before returning from\n    ma_device_init(), the state needs to be set to something valid. In miniaudio the device's default state immediately\n    after initialization is stopped, so therefore we need to mark the device as such. miniaudio will wait on the worker\n    thread to signal an event to know when the worker thread is ready for action.\n    */\n    ma_device__set_state(pDevice, ma_device_state_stopped);\n    ma_event_signal(&pDevice->stopEvent);\n\n    for (;;) {  /* <-- This loop just keeps the thread alive. The main audio loop is inside. */\n        ma_result startResult;\n        ma_result stopResult;   /* <-- This will store the result from onDeviceStop(). If it returns an error, we don't fire the stopped notification callback. */\n\n        /* We wait on an event to know when something has requested that the device be started and the main loop entered. */\n        ma_event_wait(&pDevice->wakeupEvent);\n\n        /* Default result code. */\n        pDevice->workResult = MA_SUCCESS;\n\n        /* If the reason for the wake up is that we are terminating, just break from the loop. */\n        if (ma_device_get_state(pDevice) == ma_device_state_uninitialized) {\n            break;\n        }\n\n        /*\n        Getting to this point means the device is wanting to get started. The function that has requested that the device\n        be started will be waiting on an event (pDevice->startEvent) which means we need to make sure we signal the event\n        in both the success and error case. It's important that the state of the device is set _before_ signaling the event.\n        */\n        MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_starting);\n\n        /* If the device has a start callback, start it now. */\n        if (pDevice->pContext->callbacks.onDeviceStart != NULL) {\n            startResult = pDevice->pContext->callbacks.onDeviceStart(pDevice);\n        } else {\n            startResult = MA_SUCCESS;\n        }\n\n        /*\n        If starting was not successful we'll need to loop back to the start and wait for something\n        to happen (pDevice->wakeupEvent).\n        */\n        if (startResult != MA_SUCCESS) {\n            pDevice->workResult = startResult;\n            ma_event_signal(&pDevice->startEvent);  /* <-- Always signal the start event so ma_device_start() can return as it'll be waiting on it. */\n            continue;\n        }\n\n        /* Make sure the state is set appropriately. */\n        ma_device__set_state(pDevice, ma_device_state_started); /* <-- Set this before signaling the event so that the state is always guaranteed to be good after ma_device_start() has returned. */\n        ma_event_signal(&pDevice->startEvent);\n\n        ma_device__on_notification_started(pDevice);\n\n        if (pDevice->pContext->callbacks.onDeviceDataLoop != NULL) {\n            pDevice->pContext->callbacks.onDeviceDataLoop(pDevice);\n        } else {\n            /* The backend is not using a custom main loop implementation, so now fall back to the blocking read-write implementation. */\n            ma_device_audio_thread__default_read_write(pDevice);\n        }\n\n        /* Getting here means we have broken from the main loop which happens the application has requested that device be stopped. */\n        if (pDevice->pContext->callbacks.onDeviceStop != NULL) {\n            stopResult = pDevice->pContext->callbacks.onDeviceStop(pDevice);\n        } else {\n            stopResult = MA_SUCCESS;    /* No stop callback with the backend. Just assume successful. */\n        }\n\n        /*\n        After the device has stopped, make sure an event is posted. Don't post a stopped event if\n        stopping failed. This can happen on some backends when the underlying stream has been\n        stopped due to the device being physically unplugged or disabled via an OS setting.\n        */\n        if (stopResult == MA_SUCCESS) {\n            ma_device__on_notification_stopped(pDevice);\n        }\n\n        /* If we stopped because the device has been uninitialized, abort now. */\n        if (ma_device_get_state(pDevice) == ma_device_state_uninitialized) {\n            break;\n        }\n\n        /* A function somewhere is waiting for the device to have stopped for real so we need to signal an event to allow it to continue. */\n        ma_device__set_state(pDevice, ma_device_state_stopped);\n        ma_event_signal(&pDevice->stopEvent);\n    }\n\n#ifdef MA_WIN32\n    if (CoInitializeResult == S_OK) {\n        ma_CoUninitialize(pDevice->pContext);\n    }\n#endif\n\n    return (ma_thread_result)0;\n}\n\n\n/* Helper for determining whether or not the given device is initialized. */\nstatic ma_bool32 ma_device__is_initialized(ma_device* pDevice)\n{\n    if (pDevice == NULL) {\n        return MA_FALSE;\n    }\n\n    return ma_device_get_state(pDevice) != ma_device_state_uninitialized;\n}\n\n\n#ifdef MA_WIN32\nstatic ma_result ma_context_uninit_backend_apis__win32(ma_context* pContext)\n{\n    /* For some reason UWP complains when CoUninitialize() is called. I'm just not going to call it on UWP. */\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    if (pContext->win32.CoInitializeResult == S_OK) {\n        ma_CoUninitialize(pContext);\n    }\n\n    #if defined(MA_WIN32_DESKTOP)\n        ma_dlclose(ma_context_get_log(pContext), pContext->win32.hUser32DLL);\n        ma_dlclose(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL);\n    #endif\n\n    ma_dlclose(ma_context_get_log(pContext), pContext->win32.hOle32DLL);\n#else\n    (void)pContext;\n#endif\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init_backend_apis__win32(ma_context* pContext)\n{\n#if defined(MA_WIN32_DESKTOP) || defined(MA_WIN32_GDK)\n    #if defined(MA_WIN32_DESKTOP)\n        /* User32.dll */\n        pContext->win32.hUser32DLL = ma_dlopen(ma_context_get_log(pContext), \"user32.dll\");\n        if (pContext->win32.hUser32DLL == NULL) {\n            return MA_FAILED_TO_INIT_BACKEND;\n        }\n\n        pContext->win32.GetForegroundWindow = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hUser32DLL, \"GetForegroundWindow\");\n        pContext->win32.GetDesktopWindow    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hUser32DLL, \"GetDesktopWindow\");\n\n\n        /* Advapi32.dll */\n        pContext->win32.hAdvapi32DLL = ma_dlopen(ma_context_get_log(pContext), \"advapi32.dll\");\n        if (pContext->win32.hAdvapi32DLL == NULL) {\n            return MA_FAILED_TO_INIT_BACKEND;\n        }\n\n        pContext->win32.RegOpenKeyExA    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, \"RegOpenKeyExA\");\n        pContext->win32.RegCloseKey      = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, \"RegCloseKey\");\n        pContext->win32.RegQueryValueExA = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hAdvapi32DLL, \"RegQueryValueExA\");\n    #endif\n\n    /* Ole32.dll */\n    pContext->win32.hOle32DLL = ma_dlopen(ma_context_get_log(pContext), \"ole32.dll\");\n    if (pContext->win32.hOle32DLL == NULL) {\n        return MA_FAILED_TO_INIT_BACKEND;\n    }\n\n    pContext->win32.CoInitialize     = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, \"CoInitialize\");\n    pContext->win32.CoInitializeEx   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, \"CoInitializeEx\");\n    pContext->win32.CoUninitialize   = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, \"CoUninitialize\");\n    pContext->win32.CoCreateInstance = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, \"CoCreateInstance\");\n    pContext->win32.CoTaskMemFree    = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, \"CoTaskMemFree\");\n    pContext->win32.PropVariantClear = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, \"PropVariantClear\");\n    pContext->win32.StringFromGUID2  = (ma_proc)ma_dlsym(ma_context_get_log(pContext), pContext->win32.hOle32DLL, \"StringFromGUID2\");\n#else\n    (void)pContext; /* Unused. */\n#endif\n\n    pContext->win32.CoInitializeResult = ma_CoInitializeEx(pContext, NULL, MA_COINIT_VALUE);\n    return MA_SUCCESS;\n}\n#else\nstatic ma_result ma_context_uninit_backend_apis__nix(ma_context* pContext)\n{\n    (void)pContext;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_context_init_backend_apis__nix(ma_context* pContext)\n{\n    (void)pContext;\n\n    return MA_SUCCESS;\n}\n#endif\n\nstatic ma_result ma_context_init_backend_apis(ma_context* pContext)\n{\n    ma_result result;\n#ifdef MA_WIN32\n    result = ma_context_init_backend_apis__win32(pContext);\n#else\n    result = ma_context_init_backend_apis__nix(pContext);\n#endif\n\n    return result;\n}\n\nstatic ma_result ma_context_uninit_backend_apis(ma_context* pContext)\n{\n    ma_result result;\n#ifdef MA_WIN32\n    result = ma_context_uninit_backend_apis__win32(pContext);\n#else\n    result = ma_context_uninit_backend_apis__nix(pContext);\n#endif\n\n    return result;\n}\n\n\n/* The default capacity doesn't need to be too big. */\n#ifndef MA_DEFAULT_DEVICE_JOB_QUEUE_CAPACITY\n#define MA_DEFAULT_DEVICE_JOB_QUEUE_CAPACITY    32\n#endif\n\nMA_API ma_device_job_thread_config ma_device_job_thread_config_init(void)\n{\n    ma_device_job_thread_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.noThread         = MA_FALSE;\n    config.jobQueueCapacity = MA_DEFAULT_DEVICE_JOB_QUEUE_CAPACITY;\n    config.jobQueueFlags    = 0;\n\n    return config;\n}\n\n\nstatic ma_thread_result MA_THREADCALL ma_device_job_thread_entry(void* pUserData)\n{\n    ma_device_job_thread* pJobThread = (ma_device_job_thread*)pUserData;\n    MA_ASSERT(pJobThread != NULL);\n\n    for (;;) {\n        ma_result result;\n        ma_job job;\n\n        result = ma_device_job_thread_next(pJobThread, &job);\n        if (result != MA_SUCCESS) {\n            break;\n        }\n\n        if (job.toc.breakup.code == MA_JOB_TYPE_QUIT) {\n            break;\n        }\n\n        ma_job_process(&job);\n    }\n\n    return (ma_thread_result)0;\n}\n\nMA_API ma_result ma_device_job_thread_init(const ma_device_job_thread_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_device_job_thread* pJobThread)\n{\n    ma_result result;\n    ma_job_queue_config jobQueueConfig;\n\n    if (pJobThread == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pJobThread);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n\n    /* Initialize the job queue before the thread to ensure it's in a valid state. */\n    jobQueueConfig = ma_job_queue_config_init(pConfig->jobQueueFlags, pConfig->jobQueueCapacity);\n\n    result = ma_job_queue_init(&jobQueueConfig, pAllocationCallbacks, &pJobThread->jobQueue);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to initialize job queue. */\n    }\n\n\n    /* The thread needs to be initialized after the job queue to ensure the thread doesn't try to access it prematurely. */\n    if (pConfig->noThread == MA_FALSE) {\n        result = ma_thread_create(&pJobThread->thread, ma_thread_priority_normal, 0, ma_device_job_thread_entry, pJobThread, pAllocationCallbacks);\n        if (result != MA_SUCCESS) {\n            ma_job_queue_uninit(&pJobThread->jobQueue, pAllocationCallbacks);\n            return result;  /* Failed to create the job thread. */\n        }\n\n        pJobThread->_hasThread = MA_TRUE;\n    } else {\n        pJobThread->_hasThread = MA_FALSE;\n    }\n\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_device_job_thread_uninit(ma_device_job_thread* pJobThread, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pJobThread == NULL) {\n        return;\n    }\n\n    /* The first thing to do is post a quit message to the job queue. If we're using a thread we'll need to wait for it. */\n    {\n        ma_job job = ma_job_init(MA_JOB_TYPE_QUIT);\n        ma_device_job_thread_post(pJobThread, &job);\n    }\n\n    /* Wait for the thread to terminate naturally. */\n    if (pJobThread->_hasThread) {\n        ma_thread_wait(&pJobThread->thread);\n    }\n\n    /* At this point the thread should be terminated so we can safely uninitialize the job queue. */\n    ma_job_queue_uninit(&pJobThread->jobQueue, pAllocationCallbacks);\n}\n\nMA_API ma_result ma_device_job_thread_post(ma_device_job_thread* pJobThread, const ma_job* pJob)\n{\n    if (pJobThread == NULL || pJob == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_job_queue_post(&pJobThread->jobQueue, pJob);\n}\n\nMA_API ma_result ma_device_job_thread_next(ma_device_job_thread* pJobThread, ma_job* pJob)\n{\n    if (pJob == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pJob);\n\n    if (pJobThread == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_job_queue_next(&pJobThread->jobQueue, pJob);\n}\n\n\n\nMA_API ma_context_config ma_context_config_init(void)\n{\n    ma_context_config config;\n    MA_ZERO_OBJECT(&config);\n\n    return config;\n}\n\nMA_API ma_result ma_context_init(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config* pConfig, ma_context* pContext)\n{\n    ma_result result;\n    ma_context_config defaultConfig;\n    ma_backend defaultBackends[ma_backend_null+1];\n    ma_uint32 iBackend;\n    ma_backend* pBackendsToIterate;\n    ma_uint32 backendsToIterateCount;\n\n    if (pContext == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pContext);\n\n    /* Always make sure the config is set first to ensure properties are available as soon as possible. */\n    if (pConfig == NULL) {\n        defaultConfig = ma_context_config_init();\n        pConfig = &defaultConfig;\n    }\n\n    /* Allocation callbacks need to come first because they'll be passed around to other areas. */\n    result = ma_allocation_callbacks_init_copy(&pContext->allocationCallbacks, &pConfig->allocationCallbacks);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* Get a lot set up first so we can start logging ASAP. */\n    if (pConfig->pLog != NULL) {\n        pContext->pLog = pConfig->pLog;\n    } else {\n        result = ma_log_init(&pContext->allocationCallbacks, &pContext->log);\n        if (result == MA_SUCCESS) {\n            pContext->pLog = &pContext->log;\n        } else {\n            pContext->pLog = NULL;  /* Logging is not available. */\n        }\n    }\n\n    pContext->threadPriority  = pConfig->threadPriority;\n    pContext->threadStackSize = pConfig->threadStackSize;\n    pContext->pUserData       = pConfig->pUserData;\n\n    /* Backend APIs need to be initialized first. This is where external libraries will be loaded and linked. */\n    result = ma_context_init_backend_apis(pContext);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    for (iBackend = 0; iBackend <= ma_backend_null; ++iBackend) {\n        defaultBackends[iBackend] = (ma_backend)iBackend;\n    }\n\n    pBackendsToIterate = (ma_backend*)backends;\n    backendsToIterateCount = backendCount;\n    if (pBackendsToIterate == NULL) {\n        pBackendsToIterate = (ma_backend*)defaultBackends;\n        backendsToIterateCount = ma_countof(defaultBackends);\n    }\n\n    MA_ASSERT(pBackendsToIterate != NULL);\n\n    for (iBackend = 0; iBackend < backendsToIterateCount; iBackend += 1) {\n        ma_backend backend = pBackendsToIterate[iBackend];\n\n        /* Make sure all callbacks are reset so we don't accidentally drag in any from previously failed initialization attempts. */\n        MA_ZERO_OBJECT(&pContext->callbacks);\n\n        /* These backends are using the new callback system. */\n        switch (backend) {\n        #ifdef MA_HAS_WASAPI\n            case ma_backend_wasapi:\n            {\n                pContext->callbacks.onContextInit = ma_context_init__wasapi;\n            } break;\n        #endif\n        #ifdef MA_HAS_DSOUND\n            case ma_backend_dsound:\n            {\n                pContext->callbacks.onContextInit = ma_context_init__dsound;\n            } break;\n        #endif\n        #ifdef MA_HAS_WINMM\n            case ma_backend_winmm:\n            {\n                pContext->callbacks.onContextInit = ma_context_init__winmm;\n            } break;\n        #endif\n        #ifdef MA_HAS_COREAUDIO\n            case ma_backend_coreaudio:\n            {\n                pContext->callbacks.onContextInit = ma_context_init__coreaudio;\n            } break;\n        #endif\n        #ifdef MA_HAS_SNDIO\n            case ma_backend_sndio:\n            {\n                pContext->callbacks.onContextInit = ma_context_init__sndio;\n            } break;\n        #endif\n        #ifdef MA_HAS_AUDIO4\n            case ma_backend_audio4:\n            {\n                pContext->callbacks.onContextInit = ma_context_init__audio4;\n            } break;\n        #endif\n        #ifdef MA_HAS_OSS\n            case ma_backend_oss:\n            {\n                pContext->callbacks.onContextInit = ma_context_init__oss;\n            } break;\n        #endif\n        #ifdef MA_HAS_PULSEAUDIO\n            case ma_backend_pulseaudio:\n            {\n                pContext->callbacks.onContextInit = ma_context_init__pulse;\n            } break;\n        #endif\n        #ifdef MA_HAS_ALSA\n            case ma_backend_alsa:\n            {\n                pContext->callbacks.onContextInit = ma_context_init__alsa;\n            } break;\n        #endif\n        #ifdef MA_HAS_JACK\n            case ma_backend_jack:\n            {\n                pContext->callbacks.onContextInit = ma_context_init__jack;\n            } break;\n        #endif\n        #ifdef MA_HAS_AAUDIO\n            case ma_backend_aaudio:\n            {\n                if (ma_is_backend_enabled(backend)) {\n                    pContext->callbacks.onContextInit = ma_context_init__aaudio;\n                }\n            } break;\n        #endif\n        #ifdef MA_HAS_OPENSL\n            case ma_backend_opensl:\n            {\n                if (ma_is_backend_enabled(backend)) {\n                    pContext->callbacks.onContextInit = ma_context_init__opensl;\n                }\n            } break;\n        #endif\n        #ifdef MA_HAS_WEBAUDIO\n            case ma_backend_webaudio:\n            {\n                pContext->callbacks.onContextInit = ma_context_init__webaudio;\n            } break;\n        #endif\n        #ifdef MA_HAS_CUSTOM\n            case ma_backend_custom:\n            {\n                /* Slightly different logic for custom backends. Custom backends can optionally set all of their callbacks in the config. */\n                pContext->callbacks = pConfig->custom;\n            } break;\n        #endif\n        #ifdef MA_HAS_NULL\n            case ma_backend_null:\n            {\n                pContext->callbacks.onContextInit = ma_context_init__null;\n            } break;\n        #endif\n\n            default: break;\n        }\n\n        if (pContext->callbacks.onContextInit != NULL) {\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"Attempting to initialize %s backend...\\n\", ma_get_backend_name(backend));\n            result = pContext->callbacks.onContextInit(pContext, pConfig, &pContext->callbacks);\n        } else {\n            /* Getting here means the onContextInit callback is not set which means the backend is not enabled. Special case for the custom backend. */\n            if (backend != ma_backend_custom) {\n                result = MA_BACKEND_NOT_ENABLED;\n            } else {\n            #if !defined(MA_HAS_CUSTOM)\n                result = MA_BACKEND_NOT_ENABLED;\n            #else\n                result = MA_NO_BACKEND;\n            #endif\n            }\n        }\n\n        /* If this iteration was successful, return. */\n        if (result == MA_SUCCESS) {\n            result = ma_mutex_init(&pContext->deviceEnumLock);\n            if (result != MA_SUCCESS) {\n                ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, \"Failed to initialize mutex for device enumeration. ma_context_get_devices() is not thread safe.\\n\");\n            }\n\n            result = ma_mutex_init(&pContext->deviceInfoLock);\n            if (result != MA_SUCCESS) {\n                ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_WARNING, \"Failed to initialize mutex for device info retrieval. ma_context_get_device_info() is not thread safe.\\n\");\n            }\n\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"System Architecture:\\n\");\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"  Endian: %s\\n\", ma_is_little_endian() ? \"LE\"  : \"BE\");\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"  SSE2:   %s\\n\", ma_has_sse2()         ? \"YES\" : \"NO\");\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"  AVX2:   %s\\n\", ma_has_avx2()         ? \"YES\" : \"NO\");\n            ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"  NEON:   %s\\n\", ma_has_neon()         ? \"YES\" : \"NO\");\n\n            pContext->backend = backend;\n            return result;\n        } else {\n            if (result == MA_BACKEND_NOT_ENABLED) {\n                ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"%s backend is disabled.\\n\", ma_get_backend_name(backend));\n            } else {\n                ma_log_postf(ma_context_get_log(pContext), MA_LOG_LEVEL_DEBUG, \"Failed to initialize %s backend.\\n\", ma_get_backend_name(backend));\n            }\n        }\n    }\n\n    /* If we get here it means an error occurred. */\n    MA_ZERO_OBJECT(pContext);  /* Safety. */\n    return MA_NO_BACKEND;\n}\n\nMA_API ma_result ma_context_uninit(ma_context* pContext)\n{\n    if (pContext == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pContext->callbacks.onContextUninit != NULL) {\n        pContext->callbacks.onContextUninit(pContext);\n    }\n\n    ma_mutex_uninit(&pContext->deviceEnumLock);\n    ma_mutex_uninit(&pContext->deviceInfoLock);\n    ma_free(pContext->pDeviceInfos, &pContext->allocationCallbacks);\n    ma_context_uninit_backend_apis(pContext);\n\n    if (pContext->pLog == &pContext->log) {\n        ma_log_uninit(&pContext->log);\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API size_t ma_context_sizeof(void)\n{\n    return sizeof(ma_context);\n}\n\n\nMA_API ma_log* ma_context_get_log(ma_context* pContext)\n{\n    if (pContext == NULL) {\n        return NULL;\n    }\n\n    return pContext->pLog;\n}\n\n\nMA_API ma_result ma_context_enumerate_devices(ma_context* pContext, ma_enum_devices_callback_proc callback, void* pUserData)\n{\n    ma_result result;\n\n    if (pContext == NULL || callback == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pContext->callbacks.onContextEnumerateDevices == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    ma_mutex_lock(&pContext->deviceEnumLock);\n    {\n        result = pContext->callbacks.onContextEnumerateDevices(pContext, callback, pUserData);\n    }\n    ma_mutex_unlock(&pContext->deviceEnumLock);\n\n    return result;\n}\n\n\nstatic ma_bool32 ma_context_get_devices__enum_callback(ma_context* pContext, ma_device_type deviceType, const ma_device_info* pInfo, void* pUserData)\n{\n    /*\n    We need to insert the device info into our main internal buffer. Where it goes depends on the device type. If it's a capture device\n    it's just appended to the end. If it's a playback device it's inserted just before the first capture device.\n    */\n\n    /*\n    First make sure we have room. Since the number of devices we add to the list is usually relatively small I've decided to use a\n    simple fixed size increment for buffer expansion.\n    */\n    const ma_uint32 bufferExpansionCount = 2;\n    const ma_uint32 totalDeviceInfoCount = pContext->playbackDeviceInfoCount + pContext->captureDeviceInfoCount;\n\n    if (totalDeviceInfoCount >= pContext->deviceInfoCapacity) {\n        ma_uint32 newCapacity = pContext->deviceInfoCapacity + bufferExpansionCount;\n        ma_device_info* pNewInfos = (ma_device_info*)ma_realloc(pContext->pDeviceInfos, sizeof(*pContext->pDeviceInfos)*newCapacity, &pContext->allocationCallbacks);\n        if (pNewInfos == NULL) {\n            return MA_FALSE;   /* Out of memory. */\n        }\n\n        pContext->pDeviceInfos = pNewInfos;\n        pContext->deviceInfoCapacity = newCapacity;\n    }\n\n    if (deviceType == ma_device_type_playback) {\n        /* Playback. Insert just before the first capture device. */\n\n        /* The first thing to do is move all of the capture devices down a slot. */\n        ma_uint32 iFirstCaptureDevice = pContext->playbackDeviceInfoCount;\n        size_t iCaptureDevice;\n        for (iCaptureDevice = totalDeviceInfoCount; iCaptureDevice > iFirstCaptureDevice; --iCaptureDevice) {\n            pContext->pDeviceInfos[iCaptureDevice] = pContext->pDeviceInfos[iCaptureDevice-1];\n        }\n\n        /* Now just insert where the first capture device was before moving it down a slot. */\n        pContext->pDeviceInfos[iFirstCaptureDevice] = *pInfo;\n        pContext->playbackDeviceInfoCount += 1;\n    } else {\n        /* Capture. Insert at the end. */\n        pContext->pDeviceInfos[totalDeviceInfoCount] = *pInfo;\n        pContext->captureDeviceInfoCount += 1;\n    }\n\n    (void)pUserData;\n    return MA_TRUE;\n}\n\nMA_API ma_result ma_context_get_devices(ma_context* pContext, ma_device_info** ppPlaybackDeviceInfos, ma_uint32* pPlaybackDeviceCount, ma_device_info** ppCaptureDeviceInfos, ma_uint32* pCaptureDeviceCount)\n{\n    ma_result result;\n\n    /* Safety. */\n    if (ppPlaybackDeviceInfos != NULL) *ppPlaybackDeviceInfos = NULL;\n    if (pPlaybackDeviceCount  != NULL) *pPlaybackDeviceCount  = 0;\n    if (ppCaptureDeviceInfos  != NULL) *ppCaptureDeviceInfos  = NULL;\n    if (pCaptureDeviceCount   != NULL) *pCaptureDeviceCount   = 0;\n\n    if (pContext == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pContext->callbacks.onContextEnumerateDevices == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* Note that we don't use ma_context_enumerate_devices() here because we want to do locking at a higher level. */\n    ma_mutex_lock(&pContext->deviceEnumLock);\n    {\n        /* Reset everything first. */\n        pContext->playbackDeviceInfoCount = 0;\n        pContext->captureDeviceInfoCount = 0;\n\n        /* Now enumerate over available devices. */\n        result = pContext->callbacks.onContextEnumerateDevices(pContext, ma_context_get_devices__enum_callback, NULL);\n        if (result == MA_SUCCESS) {\n            /* Playback devices. */\n            if (ppPlaybackDeviceInfos != NULL) {\n                *ppPlaybackDeviceInfos = pContext->pDeviceInfos;\n            }\n            if (pPlaybackDeviceCount != NULL) {\n                *pPlaybackDeviceCount = pContext->playbackDeviceInfoCount;\n            }\n\n            /* Capture devices. */\n            if (ppCaptureDeviceInfos != NULL) {\n                *ppCaptureDeviceInfos = pContext->pDeviceInfos;\n                /* Capture devices come after playback devices. */\n                if (pContext->playbackDeviceInfoCount > 0) {\n                    /* Conditional, because NULL+0 is undefined behavior. */\n                    *ppCaptureDeviceInfos += pContext->playbackDeviceInfoCount;\n                }\n            }\n            if (pCaptureDeviceCount != NULL) {\n                *pCaptureDeviceCount = pContext->captureDeviceInfoCount;\n            }\n        }\n    }\n    ma_mutex_unlock(&pContext->deviceEnumLock);\n\n    return result;\n}\n\nMA_API ma_result ma_context_get_device_info(ma_context* pContext, ma_device_type deviceType, const ma_device_id* pDeviceID, ma_device_info* pDeviceInfo)\n{\n    ma_result result;\n    ma_device_info deviceInfo;\n\n    /* NOTE: Do not clear pDeviceInfo on entry. The reason is the pDeviceID may actually point to pDeviceInfo->id which will break things. */\n    if (pContext == NULL || pDeviceInfo == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(&deviceInfo);\n\n    /* Help the backend out by copying over the device ID if we have one. */\n    if (pDeviceID != NULL) {\n        MA_COPY_MEMORY(&deviceInfo.id, pDeviceID, sizeof(*pDeviceID));\n    }\n\n    if (pContext->callbacks.onContextGetDeviceInfo == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    ma_mutex_lock(&pContext->deviceInfoLock);\n    {\n        result = pContext->callbacks.onContextGetDeviceInfo(pContext, deviceType, pDeviceID, &deviceInfo);\n    }\n    ma_mutex_unlock(&pContext->deviceInfoLock);\n\n    *pDeviceInfo = deviceInfo;\n    return result;\n}\n\nMA_API ma_bool32 ma_context_is_loopback_supported(ma_context* pContext)\n{\n    if (pContext == NULL) {\n        return MA_FALSE;\n    }\n\n    return ma_is_loopback_supported(pContext->backend);\n}\n\n\nMA_API ma_device_config ma_device_config_init(ma_device_type deviceType)\n{\n    ma_device_config config;\n    MA_ZERO_OBJECT(&config);\n    config.deviceType = deviceType;\n    config.resampling = ma_resampler_config_init(ma_format_unknown, 0, 0, 0, ma_resample_algorithm_linear); /* Format/channels/rate don't matter here. */\n\n    return config;\n}\n\nMA_API ma_result ma_device_init(ma_context* pContext, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_result result;\n    ma_device_descriptor descriptorPlayback;\n    ma_device_descriptor descriptorCapture;\n\n    /* The context can be null, in which case we self-manage it. */\n    if (pContext == NULL) {\n        return ma_device_init_ex(NULL, 0, NULL, pConfig, pDevice);\n    }\n\n    if (pDevice == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pDevice);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Check that we have our callbacks defined. */\n    if (pContext->callbacks.onDeviceInit == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* Basic config validation. */\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex) {\n        if (pConfig->capture.channels > MA_MAX_CHANNELS) {\n            return MA_INVALID_ARGS;\n        }\n\n        if (!ma__is_channel_map_valid(pConfig->capture.pChannelMap, pConfig->capture.channels)) {\n            return MA_INVALID_ARGS;\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex || pConfig->deviceType == ma_device_type_loopback) {\n        if (pConfig->playback.channels > MA_MAX_CHANNELS) {\n            return MA_INVALID_ARGS;\n        }\n\n        if (!ma__is_channel_map_valid(pConfig->playback.pChannelMap, pConfig->playback.channels)) {\n            return MA_INVALID_ARGS;\n        }\n    }\n\n    pDevice->pContext = pContext;\n\n    /* Set the user data and log callback ASAP to ensure it is available for the entire initialization process. */\n    pDevice->pUserData      = pConfig->pUserData;\n    pDevice->onData         = pConfig->dataCallback;\n    pDevice->onNotification = pConfig->notificationCallback;\n    pDevice->onStop         = pConfig->stopCallback;\n\n    if (pConfig->playback.pDeviceID != NULL) {\n        MA_COPY_MEMORY(&pDevice->playback.id, pConfig->playback.pDeviceID, sizeof(pDevice->playback.id));\n        pDevice->playback.pID = &pDevice->playback.id;\n    } else {\n        pDevice->playback.pID = NULL;\n    }\n\n    if (pConfig->capture.pDeviceID != NULL) {\n        MA_COPY_MEMORY(&pDevice->capture.id, pConfig->capture.pDeviceID, sizeof(pDevice->capture.id));\n        pDevice->capture.pID = &pDevice->capture.id;\n    } else {\n        pDevice->capture.pID = NULL;\n    }\n\n    pDevice->noPreSilencedOutputBuffer   = pConfig->noPreSilencedOutputBuffer;\n    pDevice->noClip                      = pConfig->noClip;\n    pDevice->noDisableDenormals          = pConfig->noDisableDenormals;\n    pDevice->noFixedSizedCallback        = pConfig->noFixedSizedCallback;\n    ma_atomic_float_set(&pDevice->masterVolumeFactor, 1);\n\n    pDevice->type                        = pConfig->deviceType;\n    pDevice->sampleRate                  = pConfig->sampleRate;\n    pDevice->resampling.algorithm        = pConfig->resampling.algorithm;\n    pDevice->resampling.linear.lpfOrder  = pConfig->resampling.linear.lpfOrder;\n    pDevice->resampling.pBackendVTable   = pConfig->resampling.pBackendVTable;\n    pDevice->resampling.pBackendUserData = pConfig->resampling.pBackendUserData;\n\n    pDevice->capture.shareMode           = pConfig->capture.shareMode;\n    pDevice->capture.format              = pConfig->capture.format;\n    pDevice->capture.channels            = pConfig->capture.channels;\n    ma_channel_map_copy_or_default(pDevice->capture.channelMap, ma_countof(pDevice->capture.channelMap), pConfig->capture.pChannelMap, pConfig->capture.channels);\n    pDevice->capture.channelMixMode      = pConfig->capture.channelMixMode;\n    pDevice->capture.calculateLFEFromSpatialChannels = pConfig->capture.calculateLFEFromSpatialChannels;\n\n    pDevice->playback.shareMode          = pConfig->playback.shareMode;\n    pDevice->playback.format             = pConfig->playback.format;\n    pDevice->playback.channels           = pConfig->playback.channels;\n    ma_channel_map_copy_or_default(pDevice->playback.channelMap, ma_countof(pDevice->playback.channelMap), pConfig->playback.pChannelMap, pConfig->playback.channels);\n    pDevice->playback.channelMixMode     = pConfig->playback.channelMixMode;\n    pDevice->playback.calculateLFEFromSpatialChannels = pConfig->playback.calculateLFEFromSpatialChannels;\n\n    result = ma_mutex_init(&pDevice->startStopLock);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /*\n    When the device is started, the worker thread is the one that does the actual startup of the backend device. We\n    use a semaphore to wait for the background thread to finish the work. The same applies for stopping the device.\n\n    Each of these semaphores is released internally by the worker thread when the work is completed. The start\n    semaphore is also used to wake up the worker thread.\n    */\n    result = ma_event_init(&pDevice->wakeupEvent);\n    if (result != MA_SUCCESS) {\n        ma_mutex_uninit(&pDevice->startStopLock);\n        return result;\n    }\n\n    result = ma_event_init(&pDevice->startEvent);\n    if (result != MA_SUCCESS) {\n        ma_event_uninit(&pDevice->wakeupEvent);\n        ma_mutex_uninit(&pDevice->startStopLock);\n        return result;\n    }\n\n    result = ma_event_init(&pDevice->stopEvent);\n    if (result != MA_SUCCESS) {\n        ma_event_uninit(&pDevice->startEvent);\n        ma_event_uninit(&pDevice->wakeupEvent);\n        ma_mutex_uninit(&pDevice->startStopLock);\n        return result;\n    }\n\n\n    MA_ZERO_OBJECT(&descriptorPlayback);\n    descriptorPlayback.pDeviceID                = pConfig->playback.pDeviceID;\n    descriptorPlayback.shareMode                = pConfig->playback.shareMode;\n    descriptorPlayback.format                   = pConfig->playback.format;\n    descriptorPlayback.channels                 = pConfig->playback.channels;\n    descriptorPlayback.sampleRate               = pConfig->sampleRate;\n    ma_channel_map_copy_or_default(descriptorPlayback.channelMap, ma_countof(descriptorPlayback.channelMap), pConfig->playback.pChannelMap, pConfig->playback.channels);\n    descriptorPlayback.periodSizeInFrames       = pConfig->periodSizeInFrames;\n    descriptorPlayback.periodSizeInMilliseconds = pConfig->periodSizeInMilliseconds;\n    descriptorPlayback.periodCount              = pConfig->periods;\n\n    if (descriptorPlayback.periodCount == 0) {\n        descriptorPlayback.periodCount = MA_DEFAULT_PERIODS;\n    }\n\n\n    MA_ZERO_OBJECT(&descriptorCapture);\n    descriptorCapture.pDeviceID                 = pConfig->capture.pDeviceID;\n    descriptorCapture.shareMode                 = pConfig->capture.shareMode;\n    descriptorCapture.format                    = pConfig->capture.format;\n    descriptorCapture.channels                  = pConfig->capture.channels;\n    descriptorCapture.sampleRate                = pConfig->sampleRate;\n    ma_channel_map_copy_or_default(descriptorCapture.channelMap, ma_countof(descriptorCapture.channelMap), pConfig->capture.pChannelMap, pConfig->capture.channels);\n    descriptorCapture.periodSizeInFrames        = pConfig->periodSizeInFrames;\n    descriptorCapture.periodSizeInMilliseconds  = pConfig->periodSizeInMilliseconds;\n    descriptorCapture.periodCount               = pConfig->periods;\n\n    if (descriptorCapture.periodCount == 0) {\n        descriptorCapture.periodCount = MA_DEFAULT_PERIODS;\n    }\n\n\n    result = pContext->callbacks.onDeviceInit(pDevice, pConfig, &descriptorPlayback, &descriptorCapture);\n    if (result != MA_SUCCESS) {\n        ma_event_uninit(&pDevice->startEvent);\n        ma_event_uninit(&pDevice->wakeupEvent);\n        ma_mutex_uninit(&pDevice->startStopLock);\n        return result;\n    }\n\n#if 0\n    /*\n    On output the descriptors will contain the *actual* data format of the device. We need this to know how to convert the data between\n    the requested format and the internal format.\n    */\n    if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex || pConfig->deviceType == ma_device_type_loopback) {\n        if (!ma_device_descriptor_is_valid(&descriptorCapture)) {\n            ma_device_uninit(pDevice);\n            return MA_INVALID_ARGS;\n        }\n\n        pDevice->capture.internalFormat             = descriptorCapture.format;\n        pDevice->capture.internalChannels           = descriptorCapture.channels;\n        pDevice->capture.internalSampleRate         = descriptorCapture.sampleRate;\n        ma_channel_map_copy(pDevice->capture.internalChannelMap, descriptorCapture.channelMap, descriptorCapture.channels);\n        pDevice->capture.internalPeriodSizeInFrames = descriptorCapture.periodSizeInFrames;\n        pDevice->capture.internalPeriods            = descriptorCapture.periodCount;\n\n        if (pDevice->capture.internalPeriodSizeInFrames == 0) {\n            pDevice->capture.internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(descriptorCapture.periodSizeInMilliseconds, descriptorCapture.sampleRate);\n        }\n    }\n\n    if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n        if (!ma_device_descriptor_is_valid(&descriptorPlayback)) {\n            ma_device_uninit(pDevice);\n            return MA_INVALID_ARGS;\n        }\n\n        pDevice->playback.internalFormat             = descriptorPlayback.format;\n        pDevice->playback.internalChannels           = descriptorPlayback.channels;\n        pDevice->playback.internalSampleRate         = descriptorPlayback.sampleRate;\n        ma_channel_map_copy(pDevice->playback.internalChannelMap, descriptorPlayback.channelMap, descriptorPlayback.channels);\n        pDevice->playback.internalPeriodSizeInFrames = descriptorPlayback.periodSizeInFrames;\n        pDevice->playback.internalPeriods            = descriptorPlayback.periodCount;\n\n        if (pDevice->playback.internalPeriodSizeInFrames == 0) {\n            pDevice->playback.internalPeriodSizeInFrames = ma_calculate_buffer_size_in_frames_from_milliseconds(descriptorPlayback.periodSizeInMilliseconds, descriptorPlayback.sampleRate);\n        }\n    }\n\n\n    /*\n    The name of the device can be retrieved from device info. This may be temporary and replaced with a `ma_device_get_info(pDevice, deviceType)` instead.\n    For loopback devices, we need to retrieve the name of the playback device.\n    */\n    {\n        ma_device_info deviceInfo;\n\n        if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex || pConfig->deviceType == ma_device_type_loopback) {\n            result = ma_device_get_info(pDevice, (pConfig->deviceType == ma_device_type_loopback) ? ma_device_type_playback : ma_device_type_capture, &deviceInfo);\n            if (result == MA_SUCCESS) {\n                ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), deviceInfo.name, (size_t)-1);\n            } else {\n                /* We failed to retrieve the device info. Fall back to a default name. */\n                if (descriptorCapture.pDeviceID == NULL) {\n                    ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), MA_DEFAULT_CAPTURE_DEVICE_NAME, (size_t)-1);\n                } else {\n                    ma_strncpy_s(pDevice->capture.name, sizeof(pDevice->capture.name), \"Capture Device\", (size_t)-1);\n                }\n            }\n        }\n\n        if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n            result = ma_device_get_info(pDevice, ma_device_type_playback, &deviceInfo);\n            if (result == MA_SUCCESS) {\n                ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), deviceInfo.name, (size_t)-1);\n            } else {\n                /* We failed to retrieve the device info. Fall back to a default name. */\n                if (descriptorPlayback.pDeviceID == NULL) {\n                    ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), MA_DEFAULT_PLAYBACK_DEVICE_NAME, (size_t)-1);\n                } else {\n                    ma_strncpy_s(pDevice->playback.name, sizeof(pDevice->playback.name), \"Playback Device\", (size_t)-1);\n                }\n            }\n        }\n    }\n\n\n    ma_device__post_init_setup(pDevice, pConfig->deviceType);\n#endif\n\n    result = ma_device_post_init(pDevice, pConfig->deviceType, &descriptorPlayback, &descriptorCapture);\n    if (result != MA_SUCCESS) {\n        ma_device_uninit(pDevice);\n        return result;\n    }\n\n\n    /*\n    If we're using fixed sized callbacks we'll need to make use of an intermediary buffer. Needs to\n    be done after post_init_setup() because we'll need access to the sample rate.\n    */\n    if (pConfig->noFixedSizedCallback == MA_FALSE) {\n        /* We're using a fixed sized data callback so we'll need an intermediary buffer. */\n        ma_uint32 intermediaryBufferCap = pConfig->periodSizeInFrames;\n        if (intermediaryBufferCap == 0) {\n            intermediaryBufferCap = ma_calculate_buffer_size_in_frames_from_milliseconds(pConfig->periodSizeInMilliseconds, pDevice->sampleRate);\n        }\n\n        if (pConfig->deviceType == ma_device_type_capture || pConfig->deviceType == ma_device_type_duplex || pConfig->deviceType == ma_device_type_loopback) {\n            ma_uint32 intermediaryBufferSizeInBytes;\n\n            pDevice->capture.intermediaryBufferLen = 0;\n            pDevice->capture.intermediaryBufferCap = intermediaryBufferCap;\n            if (pDevice->capture.intermediaryBufferCap == 0) {\n                pDevice->capture.intermediaryBufferCap = pDevice->capture.internalPeriodSizeInFrames;\n            }\n\n            intermediaryBufferSizeInBytes = pDevice->capture.intermediaryBufferCap * ma_get_bytes_per_frame(pDevice->capture.format, pDevice->capture.channels);\n\n            pDevice->capture.pIntermediaryBuffer = ma_malloc((size_t)intermediaryBufferSizeInBytes, &pContext->allocationCallbacks);\n            if (pDevice->capture.pIntermediaryBuffer == NULL) {\n                ma_device_uninit(pDevice);\n                return MA_OUT_OF_MEMORY;\n            }\n\n            /* Silence the buffer for safety. */\n            ma_silence_pcm_frames(pDevice->capture.pIntermediaryBuffer, pDevice->capture.intermediaryBufferCap, pDevice->capture.format, pDevice->capture.channels);\n            pDevice->capture.intermediaryBufferLen = pDevice->capture.intermediaryBufferCap;\n        }\n\n        if (pConfig->deviceType == ma_device_type_playback || pConfig->deviceType == ma_device_type_duplex) {\n            ma_uint64 intermediaryBufferSizeInBytes;\n\n            pDevice->playback.intermediaryBufferLen = 0;\n            if (pConfig->deviceType == ma_device_type_duplex) {\n                pDevice->playback.intermediaryBufferCap = pDevice->capture.intermediaryBufferCap;   /* In duplex mode, make sure the intermediary buffer is always the same size as the capture side. */\n            } else {\n                pDevice->playback.intermediaryBufferCap = intermediaryBufferCap;\n                if (pDevice->playback.intermediaryBufferCap == 0) {\n                    pDevice->playback.intermediaryBufferCap = pDevice->playback.internalPeriodSizeInFrames;\n                }\n            }\n\n            intermediaryBufferSizeInBytes = pDevice->playback.intermediaryBufferCap * ma_get_bytes_per_frame(pDevice->playback.format, pDevice->playback.channels);\n\n            pDevice->playback.pIntermediaryBuffer = ma_malloc((size_t)intermediaryBufferSizeInBytes, &pContext->allocationCallbacks);\n            if (pDevice->playback.pIntermediaryBuffer == NULL) {\n                ma_device_uninit(pDevice);\n                return MA_OUT_OF_MEMORY;\n            }\n\n            /* Silence the buffer for safety. */\n            ma_silence_pcm_frames(pDevice->playback.pIntermediaryBuffer, pDevice->playback.intermediaryBufferCap, pDevice->playback.format, pDevice->playback.channels);\n            pDevice->playback.intermediaryBufferLen = 0;\n        }\n    } else {\n        /* Not using a fixed sized data callback so no need for an intermediary buffer. */\n    }\n\n\n    /* Some backends don't require the worker thread. */\n    if (!ma_context_is_backend_asynchronous(pContext)) {\n        /* The worker thread. */\n        result = ma_thread_create(&pDevice->thread, pContext->threadPriority, pContext->threadStackSize, ma_worker_thread, pDevice, &pContext->allocationCallbacks);\n        if (result != MA_SUCCESS) {\n            ma_device_uninit(pDevice);\n            return result;\n        }\n\n        /* Wait for the worker thread to put the device into it's stopped state for real. */\n        ma_event_wait(&pDevice->stopEvent);\n        MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_stopped);\n    } else {\n        /*\n        If the backend is asynchronous and the device is duplex, we'll need an intermediary ring buffer. Note that this needs to be done\n        after ma_device__post_init_setup().\n        */\n        if (ma_context_is_backend_asynchronous(pContext)) {\n            if (pConfig->deviceType == ma_device_type_duplex) {\n                result = ma_duplex_rb_init(pDevice->capture.format, pDevice->capture.channels, pDevice->sampleRate, pDevice->capture.internalSampleRate, pDevice->capture.internalPeriodSizeInFrames, &pDevice->pContext->allocationCallbacks, &pDevice->duplexRB);\n                if (result != MA_SUCCESS) {\n                    ma_device_uninit(pDevice);\n                    return result;\n                }\n            }\n        }\n\n        ma_device__set_state(pDevice, ma_device_state_stopped);\n    }\n\n    /* Log device information. */\n    {\n        ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"[%s]\\n\", ma_get_backend_name(pDevice->pContext->backend));\n        if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex || pDevice->type == ma_device_type_loopback) {\n            char name[MA_MAX_DEVICE_NAME_LENGTH + 1];\n            ma_device_get_name(pDevice, (pDevice->type == ma_device_type_loopback) ? ma_device_type_playback : ma_device_type_capture, name, sizeof(name), NULL);\n\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"  %s (%s)\\n\", name, \"Capture\");\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"    Format:      %s -> %s\\n\", ma_get_format_name(pDevice->capture.internalFormat), ma_get_format_name(pDevice->capture.format));\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"    Channels:    %d -> %d\\n\", pDevice->capture.internalChannels, pDevice->capture.channels);\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"    Sample Rate: %d -> %d\\n\", pDevice->capture.internalSampleRate, pDevice->sampleRate);\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"    Buffer Size: %d*%d (%d)\\n\", pDevice->capture.internalPeriodSizeInFrames, pDevice->capture.internalPeriods, (pDevice->capture.internalPeriodSizeInFrames * pDevice->capture.internalPeriods));\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"    Conversion:\\n\");\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Pre Format Conversion:  %s\\n\", pDevice->capture.converter.hasPreFormatConversion  ? \"YES\" : \"NO\");\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Post Format Conversion: %s\\n\", pDevice->capture.converter.hasPostFormatConversion ? \"YES\" : \"NO\");\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Channel Routing:        %s\\n\", pDevice->capture.converter.hasChannelConverter     ? \"YES\" : \"NO\");\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Resampling:             %s\\n\", pDevice->capture.converter.hasResampler            ? \"YES\" : \"NO\");\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Passthrough:            %s\\n\", pDevice->capture.converter.isPassthrough           ? \"YES\" : \"NO\");\n            {\n                char channelMapStr[1024];\n                ma_channel_map_to_string(pDevice->capture.internalChannelMap, pDevice->capture.internalChannels, channelMapStr, sizeof(channelMapStr));\n                ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Channel Map In:         {%s}\\n\", channelMapStr);\n\n                ma_channel_map_to_string(pDevice->capture.channelMap, pDevice->capture.channels, channelMapStr, sizeof(channelMapStr));\n                ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Channel Map Out:        {%s}\\n\", channelMapStr);\n            }\n        }\n        if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n            char name[MA_MAX_DEVICE_NAME_LENGTH + 1];\n            ma_device_get_name(pDevice, ma_device_type_playback, name, sizeof(name), NULL);\n\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"  %s (%s)\\n\", name, \"Playback\");\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"    Format:      %s -> %s\\n\", ma_get_format_name(pDevice->playback.format), ma_get_format_name(pDevice->playback.internalFormat));\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"    Channels:    %d -> %d\\n\", pDevice->playback.channels, pDevice->playback.internalChannels);\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"    Sample Rate: %d -> %d\\n\", pDevice->sampleRate, pDevice->playback.internalSampleRate);\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"    Buffer Size: %d*%d (%d)\\n\", pDevice->playback.internalPeriodSizeInFrames, pDevice->playback.internalPeriods, (pDevice->playback.internalPeriodSizeInFrames * pDevice->playback.internalPeriods));\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"    Conversion:\\n\");\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Pre Format Conversion:  %s\\n\", pDevice->playback.converter.hasPreFormatConversion  ? \"YES\" : \"NO\");\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Post Format Conversion: %s\\n\", pDevice->playback.converter.hasPostFormatConversion ? \"YES\" : \"NO\");\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Channel Routing:        %s\\n\", pDevice->playback.converter.hasChannelConverter     ? \"YES\" : \"NO\");\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Resampling:             %s\\n\", pDevice->playback.converter.hasResampler            ? \"YES\" : \"NO\");\n            ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Passthrough:            %s\\n\", pDevice->playback.converter.isPassthrough           ? \"YES\" : \"NO\");\n            {\n                char channelMapStr[1024];\n                ma_channel_map_to_string(pDevice->playback.channelMap, pDevice->playback.channels, channelMapStr, sizeof(channelMapStr));\n                ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Channel Map In:         {%s}\\n\", channelMapStr);\n\n                ma_channel_map_to_string(pDevice->playback.internalChannelMap, pDevice->playback.internalChannels, channelMapStr, sizeof(channelMapStr));\n                ma_log_postf(ma_device_get_log(pDevice), MA_LOG_LEVEL_INFO, \"      Channel Map Out:        {%s}\\n\", channelMapStr);\n            }\n        }\n    }\n\n    MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_stopped);\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_device_init_ex(const ma_backend backends[], ma_uint32 backendCount, const ma_context_config* pContextConfig, const ma_device_config* pConfig, ma_device* pDevice)\n{\n    ma_result result;\n    ma_context* pContext;\n    ma_backend defaultBackends[ma_backend_null+1];\n    ma_uint32 iBackend;\n    ma_backend* pBackendsToIterate;\n    ma_uint32 backendsToIterateCount;\n    ma_allocation_callbacks allocationCallbacks;\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pContextConfig != NULL) {\n        result = ma_allocation_callbacks_init_copy(&allocationCallbacks, &pContextConfig->allocationCallbacks);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    } else {\n        allocationCallbacks = ma_allocation_callbacks_init_default();\n    }\n\n    pContext = (ma_context*)ma_malloc(sizeof(*pContext), &allocationCallbacks);\n    if (pContext == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    for (iBackend = 0; iBackend <= ma_backend_null; ++iBackend) {\n        defaultBackends[iBackend] = (ma_backend)iBackend;\n    }\n\n    pBackendsToIterate = (ma_backend*)backends;\n    backendsToIterateCount = backendCount;\n    if (pBackendsToIterate == NULL) {\n        pBackendsToIterate = (ma_backend*)defaultBackends;\n        backendsToIterateCount = ma_countof(defaultBackends);\n    }\n\n    result = MA_NO_BACKEND;\n\n    for (iBackend = 0; iBackend < backendsToIterateCount; ++iBackend) {\n        /*\n        This is a hack for iOS. If the context config is null, there's a good chance the\n        `ma_device_init(NULL, &deviceConfig, pDevice);` pattern is being used. In this\n        case, set the session category based on the device type.\n        */\n    #if defined(MA_APPLE_MOBILE)\n        ma_context_config contextConfig;\n\n        if (pContextConfig == NULL) {\n            contextConfig = ma_context_config_init();\n            switch (pConfig->deviceType) {\n                case ma_device_type_duplex: {\n                    contextConfig.coreaudio.sessionCategory = ma_ios_session_category_play_and_record;\n                } break;\n                case ma_device_type_capture: {\n                    contextConfig.coreaudio.sessionCategory = ma_ios_session_category_record;\n                } break;\n                case ma_device_type_playback:\n                default: {\n                    contextConfig.coreaudio.sessionCategory = ma_ios_session_category_playback;\n                } break;\n            }\n\n            pContextConfig = &contextConfig;\n        }\n    #endif\n\n        result = ma_context_init(&pBackendsToIterate[iBackend], 1, pContextConfig, pContext);\n        if (result == MA_SUCCESS) {\n            result = ma_device_init(pContext, pConfig, pDevice);\n            if (result == MA_SUCCESS) {\n                break;  /* Success. */\n            } else {\n                ma_context_uninit(pContext);   /* Failure. */\n            }\n        }\n    }\n\n    if (result != MA_SUCCESS) {\n        ma_free(pContext, &allocationCallbacks);\n        return result;\n    }\n\n    pDevice->isOwnerOfContext = MA_TRUE;\n    return result;\n}\n\nMA_API void ma_device_uninit(ma_device* pDevice)\n{\n    if (!ma_device__is_initialized(pDevice)) {\n        return;\n    }\n\n    /*\n    It's possible for the miniaudio side of the device and the backend to not be in sync due to\n    system-level situations such as the computer being put into sleep mode and the backend not\n    notifying miniaudio of the fact the device has stopped. It's possible for this to result in a\n    deadlock due to miniaudio thinking the device is in a running state, when in fact it's not\n    running at all. For this reason I am no longer explicitly stopping the device. I don't think\n    this should affect anyone in practice since uninitializing the backend will naturally stop the\n    device anyway.\n    */\n    #if 0\n    {\n        /* Make sure the device is stopped first. The backends will probably handle this naturally, but I like to do it explicitly for my own sanity. */\n        if (ma_device_is_started(pDevice)) {\n            ma_device_stop(pDevice);\n        }\n    }\n    #endif\n\n    /* Putting the device into an uninitialized state will make the worker thread return. */\n    ma_device__set_state(pDevice, ma_device_state_uninitialized);\n\n    /* Wake up the worker thread and wait for it to properly terminate. */\n    if (!ma_context_is_backend_asynchronous(pDevice->pContext)) {\n        ma_event_signal(&pDevice->wakeupEvent);\n        ma_thread_wait(&pDevice->thread);\n    }\n\n    if (pDevice->pContext->callbacks.onDeviceUninit != NULL) {\n        pDevice->pContext->callbacks.onDeviceUninit(pDevice);\n    }\n\n\n    ma_event_uninit(&pDevice->stopEvent);\n    ma_event_uninit(&pDevice->startEvent);\n    ma_event_uninit(&pDevice->wakeupEvent);\n    ma_mutex_uninit(&pDevice->startStopLock);\n\n    if (ma_context_is_backend_asynchronous(pDevice->pContext)) {\n        if (pDevice->type == ma_device_type_duplex) {\n            ma_duplex_rb_uninit(&pDevice->duplexRB);\n        }\n    }\n\n    if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_duplex || pDevice->type == ma_device_type_loopback) {\n        ma_data_converter_uninit(&pDevice->capture.converter, &pDevice->pContext->allocationCallbacks);\n    }\n    if (pDevice->type == ma_device_type_playback || pDevice->type == ma_device_type_duplex) {\n        ma_data_converter_uninit(&pDevice->playback.converter, &pDevice->pContext->allocationCallbacks);\n    }\n\n    if (pDevice->playback.pInputCache != NULL) {\n        ma_free(pDevice->playback.pInputCache, &pDevice->pContext->allocationCallbacks);\n    }\n\n    if (pDevice->capture.pIntermediaryBuffer != NULL) {\n        ma_free(pDevice->capture.pIntermediaryBuffer, &pDevice->pContext->allocationCallbacks);\n    }\n    if (pDevice->playback.pIntermediaryBuffer != NULL) {\n        ma_free(pDevice->playback.pIntermediaryBuffer, &pDevice->pContext->allocationCallbacks);\n    }\n\n    if (pDevice->isOwnerOfContext) {\n        ma_allocation_callbacks allocationCallbacks = pDevice->pContext->allocationCallbacks;\n\n        ma_context_uninit(pDevice->pContext);\n        ma_free(pDevice->pContext, &allocationCallbacks);\n    }\n\n    MA_ZERO_OBJECT(pDevice);\n}\n\nMA_API ma_context* ma_device_get_context(ma_device* pDevice)\n{\n    if (pDevice == NULL) {\n        return NULL;\n    }\n\n    return pDevice->pContext;\n}\n\nMA_API ma_log* ma_device_get_log(ma_device* pDevice)\n{\n    return ma_context_get_log(ma_device_get_context(pDevice));\n}\n\nMA_API ma_result ma_device_get_info(ma_device* pDevice, ma_device_type type, ma_device_info* pDeviceInfo)\n{\n    if (pDeviceInfo == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pDeviceInfo);\n\n    if (pDevice == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* If the onDeviceGetInfo() callback is set, use that. Otherwise we'll fall back to ma_context_get_device_info(). */\n    if (pDevice->pContext->callbacks.onDeviceGetInfo != NULL) {\n        return pDevice->pContext->callbacks.onDeviceGetInfo(pDevice, type, pDeviceInfo);\n    }\n\n    /* Getting here means onDeviceGetInfo is not implemented so we need to fall back to an alternative. */\n    if (type == ma_device_type_playback) {\n        return ma_context_get_device_info(pDevice->pContext, type, pDevice->playback.pID, pDeviceInfo);\n    } else {\n        return ma_context_get_device_info(pDevice->pContext, type, pDevice->capture.pID, pDeviceInfo);\n    }\n}\n\nMA_API ma_result ma_device_get_name(ma_device* pDevice, ma_device_type type, char* pName, size_t nameCap, size_t* pLengthNotIncludingNullTerminator)\n{\n    ma_result result;\n    ma_device_info deviceInfo;\n\n    if (pLengthNotIncludingNullTerminator != NULL) {\n        *pLengthNotIncludingNullTerminator = 0;\n    }\n\n    if (pName != NULL && nameCap > 0) {\n        pName[0] = '\\0';\n    }\n\n    result = ma_device_get_info(pDevice, type, &deviceInfo);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pName != NULL) {\n        ma_strncpy_s(pName, nameCap, deviceInfo.name, (size_t)-1);\n\n        /*\n        For safety, make sure the length is based on the truncated output string rather than the\n        source. Otherwise the caller might assume the output buffer contains more content than it\n        actually does.\n        */\n        if (pLengthNotIncludingNullTerminator != NULL) {\n            *pLengthNotIncludingNullTerminator = strlen(pName);\n        }\n    } else {\n        /* Name not specified. Just report the length of the source string. */\n        if (pLengthNotIncludingNullTerminator != NULL) {\n            *pLengthNotIncludingNullTerminator = strlen(deviceInfo.name);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_device_start(ma_device* pDevice)\n{\n    ma_result result;\n\n    if (pDevice == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (ma_device_get_state(pDevice) == ma_device_state_uninitialized) {\n        return MA_INVALID_OPERATION;    /* Not initialized. */\n    }\n\n    if (ma_device_get_state(pDevice) == ma_device_state_started) {\n        return MA_SUCCESS;  /* Already started. */\n    }\n\n    ma_mutex_lock(&pDevice->startStopLock);\n    {\n        /* Starting and stopping are wrapped in a mutex which means we can assert that the device is in a stopped or paused state. */\n        MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_stopped);\n\n        ma_device__set_state(pDevice, ma_device_state_starting);\n\n        /* Asynchronous backends need to be handled differently. */\n        if (ma_context_is_backend_asynchronous(pDevice->pContext)) {\n            if (pDevice->pContext->callbacks.onDeviceStart != NULL) {\n                result = pDevice->pContext->callbacks.onDeviceStart(pDevice);\n            } else {\n                result = MA_INVALID_OPERATION;\n            }\n\n            if (result == MA_SUCCESS) {\n                ma_device__set_state(pDevice, ma_device_state_started);\n                ma_device__on_notification_started(pDevice);\n            }\n        } else {\n            /*\n            Synchronous backends are started by signaling an event that's being waited on in the worker thread. We first wake up the\n            thread and then wait for the start event.\n            */\n            ma_event_signal(&pDevice->wakeupEvent);\n\n            /*\n            Wait for the worker thread to finish starting the device. Note that the worker thread will be the one who puts the device\n            into the started state. Don't call ma_device__set_state() here.\n            */\n            ma_event_wait(&pDevice->startEvent);\n            result = pDevice->workResult;\n        }\n\n        /* We changed the state from stopped to started, so if we failed, make sure we put the state back to stopped. */\n        if (result != MA_SUCCESS) {\n            ma_device__set_state(pDevice, ma_device_state_stopped);\n        }\n    }\n    ma_mutex_unlock(&pDevice->startStopLock);\n\n    return result;\n}\n\nMA_API ma_result ma_device_stop(ma_device* pDevice)\n{\n    ma_result result;\n\n    if (pDevice == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (ma_device_get_state(pDevice) == ma_device_state_uninitialized) {\n        return MA_INVALID_OPERATION;    /* Not initialized. */\n    }\n\n    if (ma_device_get_state(pDevice) == ma_device_state_stopped) {\n        return MA_SUCCESS;  /* Already stopped. */\n    }\n\n    ma_mutex_lock(&pDevice->startStopLock);\n    {\n        /* Starting and stopping are wrapped in a mutex which means we can assert that the device is in a started or paused state. */\n        MA_ASSERT(ma_device_get_state(pDevice) == ma_device_state_started);\n\n        ma_device__set_state(pDevice, ma_device_state_stopping);\n\n        /* Asynchronous backends need to be handled differently. */\n        if (ma_context_is_backend_asynchronous(pDevice->pContext)) {\n            /* Asynchronous backends must have a stop operation. */\n            if (pDevice->pContext->callbacks.onDeviceStop != NULL) {\n                result = pDevice->pContext->callbacks.onDeviceStop(pDevice);\n            } else {\n                result = MA_INVALID_OPERATION;\n            }\n\n            ma_device__set_state(pDevice, ma_device_state_stopped);\n        } else {\n            /*\n            Synchronous backends. The stop callback is always called from the worker thread. Do not call the stop callback here. If\n            the backend is implementing it's own audio thread loop we'll need to wake it up if required. Note that we need to make\n            sure the state of the device is *not* playing right now, which it shouldn't be since we set it above. This is super\n            important though, so I'm asserting it here as well for extra safety in case we accidentally change something later.\n            */\n            MA_ASSERT(ma_device_get_state(pDevice) != ma_device_state_started);\n\n            if (pDevice->pContext->callbacks.onDeviceDataLoopWakeup != NULL) {\n                pDevice->pContext->callbacks.onDeviceDataLoopWakeup(pDevice);\n            }\n\n            /*\n            We need to wait for the worker thread to become available for work before returning. Note that the worker thread will be\n            the one who puts the device into the stopped state. Don't call ma_device__set_state() here.\n            */\n            ma_event_wait(&pDevice->stopEvent);\n            result = MA_SUCCESS;\n        }\n\n        /*\n        This is a safety measure to ensure the internal buffer has been cleared so any leftover\n        does not get played the next time the device starts. Ideally this should be drained by\n        the backend first.\n        */\n        pDevice->playback.intermediaryBufferLen = 0;\n        pDevice->playback.inputCacheConsumed    = 0;\n        pDevice->playback.inputCacheRemaining   = 0;\n    }\n    ma_mutex_unlock(&pDevice->startStopLock);\n\n    return result;\n}\n\nMA_API ma_bool32 ma_device_is_started(const ma_device* pDevice)\n{\n    return ma_device_get_state(pDevice) == ma_device_state_started;\n}\n\nMA_API ma_device_state ma_device_get_state(const ma_device* pDevice)\n{\n    if (pDevice == NULL) {\n        return ma_device_state_uninitialized;\n    }\n\n    return ma_atomic_device_state_get((ma_atomic_device_state*)&pDevice->state);   /* Naughty cast to get rid of a const warning. */\n}\n\nMA_API ma_result ma_device_set_master_volume(ma_device* pDevice, float volume)\n{\n    if (pDevice == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (volume < 0.0f) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_atomic_float_set(&pDevice->masterVolumeFactor, volume);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_device_get_master_volume(ma_device* pDevice, float* pVolume)\n{\n    if (pVolume == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pDevice == NULL) {\n        *pVolume = 0;\n        return MA_INVALID_ARGS;\n    }\n\n    *pVolume = ma_atomic_float_get(&pDevice->masterVolumeFactor);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_device_set_master_volume_db(ma_device* pDevice, float gainDB)\n{\n    if (gainDB > 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_device_set_master_volume(pDevice, ma_volume_db_to_linear(gainDB));\n}\n\nMA_API ma_result ma_device_get_master_volume_db(ma_device* pDevice, float* pGainDB)\n{\n    float factor;\n    ma_result result;\n\n    if (pGainDB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_device_get_master_volume(pDevice, &factor);\n    if (result != MA_SUCCESS) {\n        *pGainDB = 0;\n        return result;\n    }\n\n    *pGainDB = ma_volume_linear_to_db(factor);\n\n    return MA_SUCCESS;\n}\n\n\nMA_API ma_result ma_device_handle_backend_data_callback(ma_device* pDevice, void* pOutput, const void* pInput, ma_uint32 frameCount)\n{\n    if (pDevice == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pOutput == NULL && pInput == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pDevice->type == ma_device_type_duplex) {\n        if (pInput != NULL) {\n            ma_device__handle_duplex_callback_capture(pDevice, frameCount, pInput, &pDevice->duplexRB.rb);\n        }\n\n        if (pOutput != NULL) {\n            ma_device__handle_duplex_callback_playback(pDevice, frameCount, pOutput, &pDevice->duplexRB.rb);\n        }\n    } else {\n        if (pDevice->type == ma_device_type_capture || pDevice->type == ma_device_type_loopback) {\n            if (pInput == NULL) {\n                return MA_INVALID_ARGS;\n            }\n\n            ma_device__send_frames_to_client(pDevice, frameCount, pInput);\n        }\n\n        if (pDevice->type == ma_device_type_playback) {\n            if (pOutput == NULL) {\n                return MA_INVALID_ARGS;\n            }\n\n            ma_device__read_frames_from_client(pDevice, frameCount, pOutput);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_uint32 ma_calculate_buffer_size_in_frames_from_descriptor(const ma_device_descriptor* pDescriptor, ma_uint32 nativeSampleRate, ma_performance_profile performanceProfile)\n{\n    if (pDescriptor == NULL) {\n        return 0;\n    }\n\n    /*\n    We must have a non-0 native sample rate, but some backends don't allow retrieval of this at the\n    time when the size of the buffer needs to be determined. In this case we need to just take a best\n    guess and move on. We'll try using the sample rate in pDescriptor first. If that's not set we'll\n    just fall back to MA_DEFAULT_SAMPLE_RATE.\n    */\n    if (nativeSampleRate == 0) {\n        nativeSampleRate = pDescriptor->sampleRate;\n    }\n    if (nativeSampleRate == 0) {\n        nativeSampleRate = MA_DEFAULT_SAMPLE_RATE;\n    }\n\n    MA_ASSERT(nativeSampleRate != 0);\n\n    if (pDescriptor->periodSizeInFrames == 0) {\n        if (pDescriptor->periodSizeInMilliseconds == 0) {\n            if (performanceProfile == ma_performance_profile_low_latency) {\n                return ma_calculate_buffer_size_in_frames_from_milliseconds(MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_LOW_LATENCY, nativeSampleRate);\n            } else {\n                return ma_calculate_buffer_size_in_frames_from_milliseconds(MA_DEFAULT_PERIOD_SIZE_IN_MILLISECONDS_CONSERVATIVE, nativeSampleRate);\n            }\n        } else {\n            return ma_calculate_buffer_size_in_frames_from_milliseconds(pDescriptor->periodSizeInMilliseconds, nativeSampleRate);\n        }\n    } else {\n        return pDescriptor->periodSizeInFrames;\n    }\n}\n#endif  /* MA_NO_DEVICE_IO */\n\n\nMA_API ma_uint32 ma_calculate_buffer_size_in_milliseconds_from_frames(ma_uint32 bufferSizeInFrames, ma_uint32 sampleRate)\n{\n    /* Prevent a division by zero. */\n    if (sampleRate == 0) {\n        return 0;\n    }\n\n    return bufferSizeInFrames*1000 / sampleRate;\n}\n\nMA_API ma_uint32 ma_calculate_buffer_size_in_frames_from_milliseconds(ma_uint32 bufferSizeInMilliseconds, ma_uint32 sampleRate)\n{\n    /* Prevent a division by zero. */\n    if (sampleRate == 0) {\n        return 0;\n    }\n\n    return bufferSizeInMilliseconds*sampleRate / 1000;\n}\n\nMA_API void ma_copy_pcm_frames(void* dst, const void* src, ma_uint64 frameCount, ma_format format, ma_uint32 channels)\n{\n    if (dst == src) {\n        return; /* No-op. */\n    }\n\n    ma_copy_memory_64(dst, src, frameCount * ma_get_bytes_per_frame(format, channels));\n}\n\nMA_API void ma_silence_pcm_frames(void* p, ma_uint64 frameCount, ma_format format, ma_uint32 channels)\n{\n    if (format == ma_format_u8) {\n        ma_uint64 sampleCount = frameCount * channels;\n        ma_uint64 iSample;\n        for (iSample = 0; iSample < sampleCount; iSample += 1) {\n            ((ma_uint8*)p)[iSample] = 128;\n        }\n    } else {\n        ma_zero_memory_64(p, frameCount * ma_get_bytes_per_frame(format, channels));\n    }\n}\n\nMA_API void* ma_offset_pcm_frames_ptr(void* p, ma_uint64 offsetInFrames, ma_format format, ma_uint32 channels)\n{\n    return ma_offset_ptr(p, offsetInFrames * ma_get_bytes_per_frame(format, channels));\n}\n\nMA_API const void* ma_offset_pcm_frames_const_ptr(const void* p, ma_uint64 offsetInFrames, ma_format format, ma_uint32 channels)\n{\n    return ma_offset_ptr(p, offsetInFrames * ma_get_bytes_per_frame(format, channels));\n}\n\n\nMA_API void ma_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count)\n{\n    ma_uint64 iSample;\n\n    MA_ASSERT(pDst != NULL);\n    MA_ASSERT(pSrc != NULL);\n\n    for (iSample = 0; iSample < count; iSample += 1) {\n        pDst[iSample] = ma_clip_u8(pSrc[iSample]);\n    }\n}\n\nMA_API void ma_clip_samples_s16(ma_int16* pDst, const ma_int32* pSrc, ma_uint64 count)\n{\n    ma_uint64 iSample;\n\n    MA_ASSERT(pDst != NULL);\n    MA_ASSERT(pSrc != NULL);\n\n    for (iSample = 0; iSample < count; iSample += 1) {\n        pDst[iSample] = ma_clip_s16(pSrc[iSample]);\n    }\n}\n\nMA_API void ma_clip_samples_s24(ma_uint8* pDst, const ma_int64* pSrc, ma_uint64 count)\n{\n    ma_uint64 iSample;\n\n    MA_ASSERT(pDst != NULL);\n    MA_ASSERT(pSrc != NULL);\n\n    for (iSample = 0; iSample < count; iSample += 1) {\n        ma_int64 s = ma_clip_s24(pSrc[iSample]);\n        pDst[iSample*3 + 0] = (ma_uint8)((s & 0x000000FF) >>  0);\n        pDst[iSample*3 + 1] = (ma_uint8)((s & 0x0000FF00) >>  8);\n        pDst[iSample*3 + 2] = (ma_uint8)((s & 0x00FF0000) >> 16);\n    }\n}\n\nMA_API void ma_clip_samples_s32(ma_int32* pDst, const ma_int64* pSrc, ma_uint64 count)\n{\n    ma_uint64 iSample;\n\n    MA_ASSERT(pDst != NULL);\n    MA_ASSERT(pSrc != NULL);\n\n    for (iSample = 0; iSample < count; iSample += 1) {\n        pDst[iSample] = ma_clip_s32(pSrc[iSample]);\n    }\n}\n\nMA_API void ma_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count)\n{\n    ma_uint64 iSample;\n\n    MA_ASSERT(pDst != NULL);\n    MA_ASSERT(pSrc != NULL);\n\n    for (iSample = 0; iSample < count; iSample += 1) {\n        pDst[iSample] = ma_clip_f32(pSrc[iSample]);\n    }\n}\n\nMA_API void ma_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels)\n{\n    ma_uint64 sampleCount;\n\n    MA_ASSERT(pDst != NULL);\n    MA_ASSERT(pSrc != NULL);\n\n    sampleCount = frameCount * channels;\n\n    switch (format) {\n        case ma_format_u8:  ma_clip_samples_u8( (ma_uint8*)pDst, (const ma_int16*)pSrc, sampleCount); break;\n        case ma_format_s16: ma_clip_samples_s16((ma_int16*)pDst, (const ma_int32*)pSrc, sampleCount); break;\n        case ma_format_s24: ma_clip_samples_s24((ma_uint8*)pDst, (const ma_int64*)pSrc, sampleCount); break;\n        case ma_format_s32: ma_clip_samples_s32((ma_int32*)pDst, (const ma_int64*)pSrc, sampleCount); break;\n        case ma_format_f32: ma_clip_samples_f32((   float*)pDst, (const    float*)pSrc, sampleCount); break;\n\n        /* Do nothing if we don't know the format. We're including these here to silence a compiler warning about enums not being handled by the switch. */\n        case ma_format_unknown:\n        case ma_format_count:\n            break;\n    }\n}\n\n\nMA_API void ma_copy_and_apply_volume_factor_u8(ma_uint8* pSamplesOut, const ma_uint8* pSamplesIn, ma_uint64 sampleCount, float factor)\n{\n    ma_uint64 iSample;\n\n    if (pSamplesOut == NULL || pSamplesIn == NULL) {\n        return;\n    }\n\n    for (iSample = 0; iSample < sampleCount; iSample += 1) {\n        pSamplesOut[iSample] = (ma_uint8)(pSamplesIn[iSample] * factor);\n    }\n}\n\nMA_API void ma_copy_and_apply_volume_factor_s16(ma_int16* pSamplesOut, const ma_int16* pSamplesIn, ma_uint64 sampleCount, float factor)\n{\n    ma_uint64 iSample;\n\n    if (pSamplesOut == NULL || pSamplesIn == NULL) {\n        return;\n    }\n\n    for (iSample = 0; iSample < sampleCount; iSample += 1) {\n        pSamplesOut[iSample] = (ma_int16)(pSamplesIn[iSample] * factor);\n    }\n}\n\nMA_API void ma_copy_and_apply_volume_factor_s24(void* pSamplesOut, const void* pSamplesIn, ma_uint64 sampleCount, float factor)\n{\n    ma_uint64 iSample;\n    ma_uint8* pSamplesOut8;\n    ma_uint8* pSamplesIn8;\n\n    if (pSamplesOut == NULL || pSamplesIn == NULL) {\n        return;\n    }\n\n    pSamplesOut8 = (ma_uint8*)pSamplesOut;\n    pSamplesIn8  = (ma_uint8*)pSamplesIn;\n\n    for (iSample = 0; iSample < sampleCount; iSample += 1) {\n        ma_int32 sampleS32;\n\n        sampleS32 = (ma_int32)(((ma_uint32)(pSamplesIn8[iSample*3+0]) << 8) | ((ma_uint32)(pSamplesIn8[iSample*3+1]) << 16) | ((ma_uint32)(pSamplesIn8[iSample*3+2])) << 24);\n        sampleS32 = (ma_int32)(sampleS32 * factor);\n\n        pSamplesOut8[iSample*3+0] = (ma_uint8)(((ma_uint32)sampleS32 & 0x0000FF00) >>  8);\n        pSamplesOut8[iSample*3+1] = (ma_uint8)(((ma_uint32)sampleS32 & 0x00FF0000) >> 16);\n        pSamplesOut8[iSample*3+2] = (ma_uint8)(((ma_uint32)sampleS32 & 0xFF000000) >> 24);\n    }\n}\n\nMA_API void ma_copy_and_apply_volume_factor_s32(ma_int32* pSamplesOut, const ma_int32* pSamplesIn, ma_uint64 sampleCount, float factor)\n{\n    ma_uint64 iSample;\n\n    if (pSamplesOut == NULL || pSamplesIn == NULL) {\n        return;\n    }\n\n    for (iSample = 0; iSample < sampleCount; iSample += 1) {\n        pSamplesOut[iSample] = (ma_int32)(pSamplesIn[iSample] * factor);\n    }\n}\n\nMA_API void ma_copy_and_apply_volume_factor_f32(float* pSamplesOut, const float* pSamplesIn, ma_uint64 sampleCount, float factor)\n{\n    ma_uint64 iSample;\n\n    if (pSamplesOut == NULL || pSamplesIn == NULL) {\n        return;\n    }\n\n    if (factor == 1) {\n        if (pSamplesOut == pSamplesIn) {\n            /* In place. No-op. */\n        } else {\n            /* Just a copy. */\n            for (iSample = 0; iSample < sampleCount; iSample += 1) {\n                pSamplesOut[iSample] = pSamplesIn[iSample];\n            }\n        }\n    } else {\n        for (iSample = 0; iSample < sampleCount; iSample += 1) {\n            pSamplesOut[iSample] = pSamplesIn[iSample] * factor;\n        }\n    }\n}\n\nMA_API void ma_apply_volume_factor_u8(ma_uint8* pSamples, ma_uint64 sampleCount, float factor)\n{\n    ma_copy_and_apply_volume_factor_u8(pSamples, pSamples, sampleCount, factor);\n}\n\nMA_API void ma_apply_volume_factor_s16(ma_int16* pSamples, ma_uint64 sampleCount, float factor)\n{\n    ma_copy_and_apply_volume_factor_s16(pSamples, pSamples, sampleCount, factor);\n}\n\nMA_API void ma_apply_volume_factor_s24(void* pSamples, ma_uint64 sampleCount, float factor)\n{\n    ma_copy_and_apply_volume_factor_s24(pSamples, pSamples, sampleCount, factor);\n}\n\nMA_API void ma_apply_volume_factor_s32(ma_int32* pSamples, ma_uint64 sampleCount, float factor)\n{\n    ma_copy_and_apply_volume_factor_s32(pSamples, pSamples, sampleCount, factor);\n}\n\nMA_API void ma_apply_volume_factor_f32(float* pSamples, ma_uint64 sampleCount, float factor)\n{\n    ma_copy_and_apply_volume_factor_f32(pSamples, pSamples, sampleCount, factor);\n}\n\nMA_API void ma_copy_and_apply_volume_factor_pcm_frames_u8(ma_uint8* pFramesOut, const ma_uint8* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor)\n{\n    ma_copy_and_apply_volume_factor_u8(pFramesOut, pFramesIn, frameCount*channels, factor);\n}\n\nMA_API void ma_copy_and_apply_volume_factor_pcm_frames_s16(ma_int16* pFramesOut, const ma_int16* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor)\n{\n    ma_copy_and_apply_volume_factor_s16(pFramesOut, pFramesIn, frameCount*channels, factor);\n}\n\nMA_API void ma_copy_and_apply_volume_factor_pcm_frames_s24(void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor)\n{\n    ma_copy_and_apply_volume_factor_s24(pFramesOut, pFramesIn, frameCount*channels, factor);\n}\n\nMA_API void ma_copy_and_apply_volume_factor_pcm_frames_s32(ma_int32* pFramesOut, const ma_int32* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor)\n{\n    ma_copy_and_apply_volume_factor_s32(pFramesOut, pFramesIn, frameCount*channels, factor);\n}\n\nMA_API void ma_copy_and_apply_volume_factor_pcm_frames_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float factor)\n{\n    ma_copy_and_apply_volume_factor_f32(pFramesOut, pFramesIn, frameCount*channels, factor);\n}\n\nMA_API void ma_copy_and_apply_volume_factor_pcm_frames(void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float factor)\n{\n    switch (format)\n    {\n    case ma_format_u8:  ma_copy_and_apply_volume_factor_pcm_frames_u8 ((ma_uint8*)pFramesOut, (const ma_uint8*)pFramesIn, frameCount, channels, factor); return;\n    case ma_format_s16: ma_copy_and_apply_volume_factor_pcm_frames_s16((ma_int16*)pFramesOut, (const ma_int16*)pFramesIn, frameCount, channels, factor); return;\n    case ma_format_s24: ma_copy_and_apply_volume_factor_pcm_frames_s24(           pFramesOut,                  pFramesIn, frameCount, channels, factor); return;\n    case ma_format_s32: ma_copy_and_apply_volume_factor_pcm_frames_s32((ma_int32*)pFramesOut, (const ma_int32*)pFramesIn, frameCount, channels, factor); return;\n    case ma_format_f32: ma_copy_and_apply_volume_factor_pcm_frames_f32(   (float*)pFramesOut,    (const float*)pFramesIn, frameCount, channels, factor); return;\n    default: return;    /* Do nothing. */\n    }\n}\n\nMA_API void ma_apply_volume_factor_pcm_frames_u8(ma_uint8* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor)\n{\n    ma_copy_and_apply_volume_factor_pcm_frames_u8(pFrames, pFrames, frameCount, channels, factor);\n}\n\nMA_API void ma_apply_volume_factor_pcm_frames_s16(ma_int16* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor)\n{\n    ma_copy_and_apply_volume_factor_pcm_frames_s16(pFrames, pFrames, frameCount, channels, factor);\n}\n\nMA_API void ma_apply_volume_factor_pcm_frames_s24(void* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor)\n{\n    ma_copy_and_apply_volume_factor_pcm_frames_s24(pFrames, pFrames, frameCount, channels, factor);\n}\n\nMA_API void ma_apply_volume_factor_pcm_frames_s32(ma_int32* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor)\n{\n    ma_copy_and_apply_volume_factor_pcm_frames_s32(pFrames, pFrames, frameCount, channels, factor);\n}\n\nMA_API void ma_apply_volume_factor_pcm_frames_f32(float* pFrames, ma_uint64 frameCount, ma_uint32 channels, float factor)\n{\n    ma_copy_and_apply_volume_factor_pcm_frames_f32(pFrames, pFrames, frameCount, channels, factor);\n}\n\nMA_API void ma_apply_volume_factor_pcm_frames(void* pFramesOut, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float factor)\n{\n    ma_copy_and_apply_volume_factor_pcm_frames(pFramesOut, pFramesOut, frameCount, format, channels, factor);\n}\n\n\nMA_API void ma_copy_and_apply_volume_factor_per_channel_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, ma_uint32 channels, float* pChannelGains)\n{\n    ma_uint64 iFrame;\n\n    if (channels == 2) {\n        /* TODO: Do an optimized implementation for stereo and mono. Can do a SIMD optimized implementation as well. */\n    }\n\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            pFramesOut[iFrame * channels + iChannel] = pFramesIn[iFrame * channels + iChannel] * pChannelGains[iChannel];\n        }\n    }\n}\n\n\n\nstatic MA_INLINE ma_int16 ma_apply_volume_unclipped_u8(ma_int16 x, ma_int16 volume)\n{\n    return (ma_int16)(((ma_int32)x * (ma_int32)volume) >> 8);\n}\n\nstatic MA_INLINE ma_int32 ma_apply_volume_unclipped_s16(ma_int32 x, ma_int16 volume)\n{\n    return (ma_int32)((x * volume) >> 8);\n}\n\nstatic MA_INLINE ma_int64 ma_apply_volume_unclipped_s24(ma_int64 x, ma_int16 volume)\n{\n    return (ma_int64)((x * volume) >> 8);\n}\n\nstatic MA_INLINE ma_int64 ma_apply_volume_unclipped_s32(ma_int64 x, ma_int16 volume)\n{\n    return (ma_int64)((x * volume) >> 8);\n}\n\nstatic MA_INLINE float ma_apply_volume_unclipped_f32(float x, float volume)\n{\n    return x * volume;\n}\n\n\nMA_API void ma_copy_and_apply_volume_and_clip_samples_u8(ma_uint8* pDst, const ma_int16* pSrc, ma_uint64 count, float volume)\n{\n    ma_uint64 iSample;\n    ma_int16  volumeFixed;\n\n    MA_ASSERT(pDst != NULL);\n    MA_ASSERT(pSrc != NULL);\n\n    volumeFixed = ma_float_to_fixed_16(volume);\n\n    for (iSample = 0; iSample < count; iSample += 1) {\n        pDst[iSample] = ma_clip_u8(ma_apply_volume_unclipped_u8(pSrc[iSample], volumeFixed));\n    }\n}\n\nMA_API void ma_copy_and_apply_volume_and_clip_samples_s16(ma_int16* pDst, const ma_int32* pSrc, ma_uint64 count, float volume)\n{\n    ma_uint64 iSample;\n    ma_int16  volumeFixed;\n\n    MA_ASSERT(pDst != NULL);\n    MA_ASSERT(pSrc != NULL);\n\n    volumeFixed = ma_float_to_fixed_16(volume);\n\n    for (iSample = 0; iSample < count; iSample += 1) {\n        pDst[iSample] = ma_clip_s16(ma_apply_volume_unclipped_s16(pSrc[iSample], volumeFixed));\n    }\n}\n\nMA_API void ma_copy_and_apply_volume_and_clip_samples_s24(ma_uint8* pDst, const ma_int64* pSrc, ma_uint64 count, float volume)\n{\n    ma_uint64 iSample;\n    ma_int16  volumeFixed;\n\n    MA_ASSERT(pDst != NULL);\n    MA_ASSERT(pSrc != NULL);\n\n    volumeFixed = ma_float_to_fixed_16(volume);\n\n    for (iSample = 0; iSample < count; iSample += 1) {\n        ma_int64 s = ma_clip_s24(ma_apply_volume_unclipped_s24(pSrc[iSample], volumeFixed));\n        pDst[iSample*3 + 0] = (ma_uint8)((s & 0x000000FF) >>  0);\n        pDst[iSample*3 + 1] = (ma_uint8)((s & 0x0000FF00) >>  8);\n        pDst[iSample*3 + 2] = (ma_uint8)((s & 0x00FF0000) >> 16);\n    }\n}\n\nMA_API void ma_copy_and_apply_volume_and_clip_samples_s32(ma_int32* pDst, const ma_int64* pSrc, ma_uint64 count, float volume)\n{\n    ma_uint64 iSample;\n    ma_int16  volumeFixed;\n\n    MA_ASSERT(pDst != NULL);\n    MA_ASSERT(pSrc != NULL);\n\n    volumeFixed = ma_float_to_fixed_16(volume);\n\n    for (iSample = 0; iSample < count; iSample += 1) {\n        pDst[iSample] = ma_clip_s32(ma_apply_volume_unclipped_s32(pSrc[iSample], volumeFixed));\n    }\n}\n\nMA_API void ma_copy_and_apply_volume_and_clip_samples_f32(float* pDst, const float* pSrc, ma_uint64 count, float volume)\n{\n    ma_uint64 iSample;\n\n    MA_ASSERT(pDst != NULL);\n    MA_ASSERT(pSrc != NULL);\n\n    /* For the f32 case we need to make sure this supports in-place processing where the input and output buffers are the same. */\n\n    for (iSample = 0; iSample < count; iSample += 1) {\n        pDst[iSample] = ma_clip_f32(ma_apply_volume_unclipped_f32(pSrc[iSample], volume));\n    }\n}\n\nMA_API void ma_copy_and_apply_volume_and_clip_pcm_frames(void* pDst, const void* pSrc, ma_uint64 frameCount, ma_format format, ma_uint32 channels, float volume)\n{\n    MA_ASSERT(pDst != NULL);\n    MA_ASSERT(pSrc != NULL);\n\n    if (volume == 1) {\n        ma_clip_pcm_frames(pDst, pSrc, frameCount, format, channels);   /* Optimized case for volume = 1. */\n    } else if (volume == 0) {\n        ma_silence_pcm_frames(pDst, frameCount, format, channels);      /* Optimized case for volume = 0. */\n    } else {\n        ma_uint64 sampleCount = frameCount * channels;\n\n        switch (format) {\n            case ma_format_u8:  ma_copy_and_apply_volume_and_clip_samples_u8( (ma_uint8*)pDst, (const ma_int16*)pSrc, sampleCount, volume); break;\n            case ma_format_s16: ma_copy_and_apply_volume_and_clip_samples_s16((ma_int16*)pDst, (const ma_int32*)pSrc, sampleCount, volume); break;\n            case ma_format_s24: ma_copy_and_apply_volume_and_clip_samples_s24((ma_uint8*)pDst, (const ma_int64*)pSrc, sampleCount, volume); break;\n            case ma_format_s32: ma_copy_and_apply_volume_and_clip_samples_s32((ma_int32*)pDst, (const ma_int64*)pSrc, sampleCount, volume); break;\n            case ma_format_f32: ma_copy_and_apply_volume_and_clip_samples_f32((   float*)pDst, (const    float*)pSrc, sampleCount, volume); break;\n\n            /* Do nothing if we don't know the format. We're including these here to silence a compiler warning about enums not being handled by the switch. */\n            case ma_format_unknown:\n            case ma_format_count:\n                break;\n        }\n    }\n}\n\n\n\nMA_API float ma_volume_linear_to_db(float factor)\n{\n    return 20*ma_log10f(factor);\n}\n\nMA_API float ma_volume_db_to_linear(float gain)\n{\n    return ma_powf(10, gain/20.0f);\n}\n\n\nMA_API ma_result ma_mix_pcm_frames_f32(float* pDst, const float* pSrc, ma_uint64 frameCount, ma_uint32 channels, float volume)\n{\n    ma_uint64 iSample;\n    ma_uint64 sampleCount;\n\n    if (pDst == NULL || pSrc == NULL || channels == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (volume == 0) {\n        return MA_SUCCESS;  /* No changes if the volume is 0. */\n    }\n\n    sampleCount = frameCount * channels;\n\n    if (volume == 1) {\n        for (iSample = 0; iSample < sampleCount; iSample += 1) {\n            pDst[iSample] += pSrc[iSample];\n        }\n    } else {\n        for (iSample = 0; iSample < sampleCount; iSample += 1) {\n            pDst[iSample] += ma_apply_volume_unclipped_f32(pSrc[iSample], volume);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n\n\n/**************************************************************************************************************************************************************\n\nFormat Conversion\n\n**************************************************************************************************************************************************************/\n\nstatic MA_INLINE ma_int16 ma_pcm_sample_f32_to_s16(float x)\n{\n    return (ma_int16)(x * 32767.0f);\n}\n\nstatic MA_INLINE ma_int16 ma_pcm_sample_u8_to_s16_no_scale(ma_uint8 x)\n{\n    return (ma_int16)((ma_int16)x - 128);\n}\n\nstatic MA_INLINE ma_int64 ma_pcm_sample_s24_to_s32_no_scale(const ma_uint8* x)\n{\n    return (ma_int64)(((ma_uint64)x[0] << 40) | ((ma_uint64)x[1] << 48) | ((ma_uint64)x[2] << 56)) >> 40;  /* Make sure the sign bits are maintained. */\n}\n\nstatic MA_INLINE void ma_pcm_sample_s32_to_s24_no_scale(ma_int64 x, ma_uint8* s24)\n{\n    s24[0] = (ma_uint8)((x & 0x000000FF) >>  0);\n    s24[1] = (ma_uint8)((x & 0x0000FF00) >>  8);\n    s24[2] = (ma_uint8)((x & 0x00FF0000) >> 16);\n}\n\n\n/* u8 */\nMA_API void ma_pcm_u8_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    (void)ditherMode;\n    ma_copy_memory_64(dst, src, count * sizeof(ma_uint8));\n}\n\n\nstatic MA_INLINE void ma_pcm_u8_to_s16__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int16* dst_s16 = (ma_int16*)dst;\n    const ma_uint8* src_u8 = (const ma_uint8*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        ma_int16 x = src_u8[i];\n        x = (ma_int16)(x - 128);\n        x = (ma_int16)(x << 8);\n        dst_s16[i] = x;\n    }\n\n    (void)ditherMode;\n}\n\nstatic MA_INLINE void ma_pcm_u8_to_s16__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s16__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_u8_to_s16__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_u8_to_s16__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_u8_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_u8_to_s16__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_u8_to_s16__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_u8_to_s16__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_u8_to_s16__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_u8_to_s24__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_s24 = (ma_uint8*)dst;\n    const ma_uint8* src_u8 = (const ma_uint8*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        ma_int16 x = src_u8[i];\n        x = (ma_int16)(x - 128);\n\n        dst_s24[i*3+0] = 0;\n        dst_s24[i*3+1] = 0;\n        dst_s24[i*3+2] = (ma_uint8)((ma_int8)x);\n    }\n\n    (void)ditherMode;\n}\n\nstatic MA_INLINE void ma_pcm_u8_to_s24__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s24__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_u8_to_s24__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_u8_to_s24__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_u8_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_u8_to_s24__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_u8_to_s24__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_u8_to_s24__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_u8_to_s24__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_u8_to_s32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int32* dst_s32 = (ma_int32*)dst;\n    const ma_uint8* src_u8 = (const ma_uint8*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        ma_int32 x = src_u8[i];\n        x = x - 128;\n        x = x << 24;\n        dst_s32[i] = x;\n    }\n\n    (void)ditherMode;\n}\n\nstatic MA_INLINE void ma_pcm_u8_to_s32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_u8_to_s32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_u8_to_s32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_u8_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_u8_to_s32__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_u8_to_s32__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_u8_to_s32__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_u8_to_s32__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_u8_to_f32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    float* dst_f32 = (float*)dst;\n    const ma_uint8* src_u8 = (const ma_uint8*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        float x = (float)src_u8[i];\n        x = x * 0.00784313725490196078f;    /* 0..255 to 0..2 */\n        x = x - 1;                          /* 0..2 to -1..1 */\n\n        dst_f32[i] = x;\n    }\n\n    (void)ditherMode;\n}\n\nstatic MA_INLINE void ma_pcm_u8_to_f32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_f32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_u8_to_f32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_u8_to_f32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_u8_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_u8_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_u8_to_f32__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_u8_to_f32__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_u8_to_f32__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_u8_to_f32__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\nstatic MA_INLINE void ma_pcm_interleave_u8__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_uint8* dst_u8 = (ma_uint8*)dst;\n    const ma_uint8** src_u8 = (const ma_uint8**)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_u8[iFrame*channels + iChannel] = src_u8[iChannel][iFrame];\n        }\n    }\n}\n#else\nstatic MA_INLINE void ma_pcm_interleave_u8__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_uint8* dst_u8 = (ma_uint8*)dst;\n    const ma_uint8** src_u8 = (const ma_uint8**)src;\n\n    if (channels == 1) {\n        ma_copy_memory_64(dst, src[0], frameCount * sizeof(ma_uint8));\n    } else if (channels == 2) {\n        ma_uint64 iFrame;\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            dst_u8[iFrame*2 + 0] = src_u8[0][iFrame];\n            dst_u8[iFrame*2 + 1] = src_u8[1][iFrame];\n        }\n    } else {\n        ma_uint64 iFrame;\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            ma_uint32 iChannel;\n            for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                dst_u8[iFrame*channels + iChannel] = src_u8[iChannel][iFrame];\n            }\n        }\n    }\n}\n#endif\n\nMA_API void ma_pcm_interleave_u8(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_interleave_u8__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_interleave_u8__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_deinterleave_u8__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_uint8** dst_u8 = (ma_uint8**)dst;\n    const ma_uint8* src_u8 = (const ma_uint8*)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_u8[iChannel][iFrame] = src_u8[iFrame*channels + iChannel];\n        }\n    }\n}\n\nstatic MA_INLINE void ma_pcm_deinterleave_u8__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_deinterleave_u8__reference(dst, src, frameCount, channels);\n}\n\nMA_API void ma_pcm_deinterleave_u8(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_deinterleave_u8__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_deinterleave_u8__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\n/* s16 */\nstatic MA_INLINE void ma_pcm_s16_to_u8__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_u8 = (ma_uint8*)dst;\n    const ma_int16* src_s16 = (const ma_int16*)src;\n\n    if (ditherMode == ma_dither_mode_none) {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int16 x = src_s16[i];\n            x = (ma_int16)(x >> 8);\n            x = (ma_int16)(x + 128);\n            dst_u8[i] = (ma_uint8)x;\n        }\n    } else {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int16 x = src_s16[i];\n\n            /* Dither. Don't overflow. */\n            ma_int32 dither = ma_dither_s32(ditherMode, -0x80, 0x7F);\n            if ((x + dither) <= 0x7FFF) {\n                x = (ma_int16)(x + dither);\n            } else {\n                x = 0x7FFF;\n            }\n\n            x = (ma_int16)(x >> 8);\n            x = (ma_int16)(x + 128);\n            dst_u8[i] = (ma_uint8)x;\n        }\n    }\n}\n\nstatic MA_INLINE void ma_pcm_s16_to_u8__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_u8__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_s16_to_u8__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_s16_to_u8__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_s16_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s16_to_u8__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_s16_to_u8__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_s16_to_u8__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_s16_to_u8__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nMA_API void ma_pcm_s16_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    (void)ditherMode;\n    ma_copy_memory_64(dst, src, count * sizeof(ma_int16));\n}\n\n\nstatic MA_INLINE void ma_pcm_s16_to_s24__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_s24 = (ma_uint8*)dst;\n    const ma_int16* src_s16 = (const ma_int16*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        dst_s24[i*3+0] = 0;\n        dst_s24[i*3+1] = (ma_uint8)(src_s16[i] & 0xFF);\n        dst_s24[i*3+2] = (ma_uint8)(src_s16[i] >> 8);\n    }\n\n    (void)ditherMode;\n}\n\nstatic MA_INLINE void ma_pcm_s16_to_s24__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s24__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_s16_to_s24__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_s16_to_s24__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_s16_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s16_to_s24__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_s16_to_s24__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_s16_to_s24__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_s16_to_s24__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_s16_to_s32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int32* dst_s32 = (ma_int32*)dst;\n    const ma_int16* src_s16 = (const ma_int16*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        dst_s32[i] = src_s16[i] << 16;\n    }\n\n    (void)ditherMode;\n}\n\nstatic MA_INLINE void ma_pcm_s16_to_s32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_s16_to_s32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_s16_to_s32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_s16_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s16_to_s32__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_s16_to_s32__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_s16_to_s32__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_s16_to_s32__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_s16_to_f32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    float* dst_f32 = (float*)dst;\n    const ma_int16* src_s16 = (const ma_int16*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        float x = (float)src_s16[i];\n\n#if 0\n        /* The accurate way. */\n        x = x + 32768.0f;                   /* -32768..32767 to 0..65535 */\n        x = x * 0.00003051804379339284f;    /* 0..65535 to 0..2 */\n        x = x - 1;                          /* 0..2 to -1..1 */\n#else\n        /* The fast way. */\n        x = x * 0.000030517578125f;         /* -32768..32767 to -1..0.999969482421875 */\n#endif\n\n        dst_f32[i] = x;\n    }\n\n    (void)ditherMode;\n}\n\nstatic MA_INLINE void ma_pcm_s16_to_f32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_f32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_s16_to_f32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_s16_to_f32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s16_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_s16_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s16_to_f32__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_s16_to_f32__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_s16_to_f32__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_s16_to_f32__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_interleave_s16__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_int16* dst_s16 = (ma_int16*)dst;\n    const ma_int16** src_s16 = (const ma_int16**)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_s16[iFrame*channels + iChannel] = src_s16[iChannel][iFrame];\n        }\n    }\n}\n\nstatic MA_INLINE void ma_pcm_interleave_s16__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_interleave_s16__reference(dst, src, frameCount, channels);\n}\n\nMA_API void ma_pcm_interleave_s16(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_interleave_s16__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_interleave_s16__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_deinterleave_s16__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_int16** dst_s16 = (ma_int16**)dst;\n    const ma_int16* src_s16 = (const ma_int16*)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_s16[iChannel][iFrame] = src_s16[iFrame*channels + iChannel];\n        }\n    }\n}\n\nstatic MA_INLINE void ma_pcm_deinterleave_s16__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_deinterleave_s16__reference(dst, src, frameCount, channels);\n}\n\nMA_API void ma_pcm_deinterleave_s16(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_deinterleave_s16__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_deinterleave_s16__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\n/* s24 */\nstatic MA_INLINE void ma_pcm_s24_to_u8__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_u8 = (ma_uint8*)dst;\n    const ma_uint8* src_s24 = (const ma_uint8*)src;\n\n    if (ditherMode == ma_dither_mode_none) {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            dst_u8[i] = (ma_uint8)((ma_int8)src_s24[i*3 + 2] + 128);\n        }\n    } else {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int32 x = (ma_int32)(((ma_uint32)(src_s24[i*3+0]) << 8) | ((ma_uint32)(src_s24[i*3+1]) << 16) | ((ma_uint32)(src_s24[i*3+2])) << 24);\n\n            /* Dither. Don't overflow. */\n            ma_int32 dither = ma_dither_s32(ditherMode, -0x800000, 0x7FFFFF);\n            if ((ma_int64)x + dither <= 0x7FFFFFFF) {\n                x = x + dither;\n            } else {\n                x = 0x7FFFFFFF;\n            }\n\n            x = x >> 24;\n            x = x + 128;\n            dst_u8[i] = (ma_uint8)x;\n        }\n    }\n}\n\nstatic MA_INLINE void ma_pcm_s24_to_u8__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_u8__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_s24_to_u8__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_s24_to_u8__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_s24_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s24_to_u8__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_s24_to_u8__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_s24_to_u8__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_s24_to_u8__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_s24_to_s16__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int16* dst_s16 = (ma_int16*)dst;\n    const ma_uint8* src_s24 = (const ma_uint8*)src;\n\n    if (ditherMode == ma_dither_mode_none) {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_uint16 dst_lo =            ((ma_uint16)src_s24[i*3 + 1]);\n            ma_uint16 dst_hi = (ma_uint16)((ma_uint16)src_s24[i*3 + 2] << 8);\n            dst_s16[i] = (ma_int16)(dst_lo | dst_hi);\n        }\n    } else {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int32 x = (ma_int32)(((ma_uint32)(src_s24[i*3+0]) << 8) | ((ma_uint32)(src_s24[i*3+1]) << 16) | ((ma_uint32)(src_s24[i*3+2])) << 24);\n\n            /* Dither. Don't overflow. */\n            ma_int32 dither = ma_dither_s32(ditherMode, -0x8000, 0x7FFF);\n            if ((ma_int64)x + dither <= 0x7FFFFFFF) {\n                x = x + dither;\n            } else {\n                x = 0x7FFFFFFF;\n            }\n\n            x = x >> 16;\n            dst_s16[i] = (ma_int16)x;\n        }\n    }\n}\n\nstatic MA_INLINE void ma_pcm_s24_to_s16__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s16__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_s24_to_s16__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_s24_to_s16__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_s24_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s24_to_s16__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_s24_to_s16__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_s24_to_s16__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_s24_to_s16__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nMA_API void ma_pcm_s24_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    (void)ditherMode;\n\n    ma_copy_memory_64(dst, src, count * 3);\n}\n\n\nstatic MA_INLINE void ma_pcm_s24_to_s32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int32* dst_s32 = (ma_int32*)dst;\n    const ma_uint8* src_s24 = (const ma_uint8*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        dst_s32[i] = (ma_int32)(((ma_uint32)(src_s24[i*3+0]) << 8) | ((ma_uint32)(src_s24[i*3+1]) << 16) | ((ma_uint32)(src_s24[i*3+2])) << 24);\n    }\n\n    (void)ditherMode;\n}\n\nstatic MA_INLINE void ma_pcm_s24_to_s32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_s24_to_s32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_s24_to_s32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_s24_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s24_to_s32__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_s24_to_s32__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_s24_to_s32__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_s24_to_s32__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_s24_to_f32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    float* dst_f32 = (float*)dst;\n    const ma_uint8* src_s24 = (const ma_uint8*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        float x = (float)(((ma_int32)(((ma_uint32)(src_s24[i*3+0]) << 8) | ((ma_uint32)(src_s24[i*3+1]) << 16) | ((ma_uint32)(src_s24[i*3+2])) << 24)) >> 8);\n\n#if 0\n        /* The accurate way. */\n        x = x + 8388608.0f;                 /* -8388608..8388607 to 0..16777215 */\n        x = x * 0.00000011920929665621f;    /* 0..16777215 to 0..2 */\n        x = x - 1;                          /* 0..2 to -1..1 */\n#else\n        /* The fast way. */\n        x = x * 0.00000011920928955078125f; /* -8388608..8388607 to -1..0.999969482421875 */\n#endif\n\n        dst_f32[i] = x;\n    }\n\n    (void)ditherMode;\n}\n\nstatic MA_INLINE void ma_pcm_s24_to_f32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_f32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_s24_to_f32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_s24_to_f32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s24_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_s24_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s24_to_f32__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_s24_to_f32__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_s24_to_f32__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_s24_to_f32__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_interleave_s24__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_uint8* dst8 = (ma_uint8*)dst;\n    const ma_uint8** src8 = (const ma_uint8**)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst8[iFrame*3*channels + iChannel*3 + 0] = src8[iChannel][iFrame*3 + 0];\n            dst8[iFrame*3*channels + iChannel*3 + 1] = src8[iChannel][iFrame*3 + 1];\n            dst8[iFrame*3*channels + iChannel*3 + 2] = src8[iChannel][iFrame*3 + 2];\n        }\n    }\n}\n\nstatic MA_INLINE void ma_pcm_interleave_s24__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_interleave_s24__reference(dst, src, frameCount, channels);\n}\n\nMA_API void ma_pcm_interleave_s24(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_interleave_s24__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_interleave_s24__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_deinterleave_s24__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_uint8** dst8 = (ma_uint8**)dst;\n    const ma_uint8* src8 = (const ma_uint8*)src;\n\n    ma_uint32 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst8[iChannel][iFrame*3 + 0] = src8[iFrame*3*channels + iChannel*3 + 0];\n            dst8[iChannel][iFrame*3 + 1] = src8[iFrame*3*channels + iChannel*3 + 1];\n            dst8[iChannel][iFrame*3 + 2] = src8[iFrame*3*channels + iChannel*3 + 2];\n        }\n    }\n}\n\nstatic MA_INLINE void ma_pcm_deinterleave_s24__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_deinterleave_s24__reference(dst, src, frameCount, channels);\n}\n\nMA_API void ma_pcm_deinterleave_s24(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_deinterleave_s24__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_deinterleave_s24__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\n\n/* s32 */\nstatic MA_INLINE void ma_pcm_s32_to_u8__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_u8 = (ma_uint8*)dst;\n    const ma_int32* src_s32 = (const ma_int32*)src;\n\n    if (ditherMode == ma_dither_mode_none) {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int32 x = src_s32[i];\n            x = x >> 24;\n            x = x + 128;\n            dst_u8[i] = (ma_uint8)x;\n        }\n    } else {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int32 x = src_s32[i];\n\n            /* Dither. Don't overflow. */\n            ma_int32 dither = ma_dither_s32(ditherMode, -0x800000, 0x7FFFFF);\n            if ((ma_int64)x + dither <= 0x7FFFFFFF) {\n                x = x + dither;\n            } else {\n                x = 0x7FFFFFFF;\n            }\n\n            x = x >> 24;\n            x = x + 128;\n            dst_u8[i] = (ma_uint8)x;\n        }\n    }\n}\n\nstatic MA_INLINE void ma_pcm_s32_to_u8__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_u8__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_s32_to_u8__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_s32_to_u8__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_s32_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s32_to_u8__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_s32_to_u8__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_s32_to_u8__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_s32_to_u8__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_s32_to_s16__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int16* dst_s16 = (ma_int16*)dst;\n    const ma_int32* src_s32 = (const ma_int32*)src;\n\n    if (ditherMode == ma_dither_mode_none) {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int32 x = src_s32[i];\n            x = x >> 16;\n            dst_s16[i] = (ma_int16)x;\n        }\n    } else {\n        ma_uint64 i;\n        for (i = 0; i < count; i += 1) {\n            ma_int32 x = src_s32[i];\n\n            /* Dither. Don't overflow. */\n            ma_int32 dither = ma_dither_s32(ditherMode, -0x8000, 0x7FFF);\n            if ((ma_int64)x + dither <= 0x7FFFFFFF) {\n                x = x + dither;\n            } else {\n                x = 0x7FFFFFFF;\n            }\n\n            x = x >> 16;\n            dst_s16[i] = (ma_int16)x;\n        }\n    }\n}\n\nstatic MA_INLINE void ma_pcm_s32_to_s16__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s16__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_s32_to_s16__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_s32_to_s16__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s16__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_s32_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s32_to_s16__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_s32_to_s16__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_s32_to_s16__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_s32_to_s16__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_s32_to_s24__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_s24 = (ma_uint8*)dst;\n    const ma_int32* src_s32 = (const ma_int32*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        ma_uint32 x = (ma_uint32)src_s32[i];\n        dst_s24[i*3+0] = (ma_uint8)((x & 0x0000FF00) >>  8);\n        dst_s24[i*3+1] = (ma_uint8)((x & 0x00FF0000) >> 16);\n        dst_s24[i*3+2] = (ma_uint8)((x & 0xFF000000) >> 24);\n    }\n\n    (void)ditherMode;   /* No dithering for s32 -> s24. */\n}\n\nstatic MA_INLINE void ma_pcm_s32_to_s24__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s24__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_s32_to_s24__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_s32_to_s24__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_s32_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s32_to_s24__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_s32_to_s24__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_s32_to_s24__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_s32_to_s24__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nMA_API void ma_pcm_s32_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    (void)ditherMode;\n\n    ma_copy_memory_64(dst, src, count * sizeof(ma_int32));\n}\n\n\nstatic MA_INLINE void ma_pcm_s32_to_f32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    float* dst_f32 = (float*)dst;\n    const ma_int32* src_s32 = (const ma_int32*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        double x = src_s32[i];\n\n#if 0\n        x = x + 2147483648.0;\n        x = x * 0.0000000004656612873077392578125;\n        x = x - 1;\n#else\n        x = x / 2147483648.0;\n#endif\n\n        dst_f32[i] = (float)x;\n    }\n\n    (void)ditherMode;   /* No dithering for s32 -> f32. */\n}\n\nstatic MA_INLINE void ma_pcm_s32_to_f32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_f32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_s32_to_f32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_s32_to_f32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_s32_to_f32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_s32_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_s32_to_f32__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_s32_to_f32__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_s32_to_f32__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_s32_to_f32__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_interleave_s32__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_int32* dst_s32 = (ma_int32*)dst;\n    const ma_int32** src_s32 = (const ma_int32**)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_s32[iFrame*channels + iChannel] = src_s32[iChannel][iFrame];\n        }\n    }\n}\n\nstatic MA_INLINE void ma_pcm_interleave_s32__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_interleave_s32__reference(dst, src, frameCount, channels);\n}\n\nMA_API void ma_pcm_interleave_s32(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_interleave_s32__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_interleave_s32__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_deinterleave_s32__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_int32** dst_s32 = (ma_int32**)dst;\n    const ma_int32* src_s32 = (const ma_int32*)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_s32[iChannel][iFrame] = src_s32[iFrame*channels + iChannel];\n        }\n    }\n}\n\nstatic MA_INLINE void ma_pcm_deinterleave_s32__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_deinterleave_s32__reference(dst, src, frameCount, channels);\n}\n\nMA_API void ma_pcm_deinterleave_s32(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_deinterleave_s32__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_deinterleave_s32__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\n/* f32 */\nstatic MA_INLINE void ma_pcm_f32_to_u8__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint64 i;\n\n    ma_uint8* dst_u8 = (ma_uint8*)dst;\n    const float* src_f32 = (const float*)src;\n\n    float ditherMin = 0;\n    float ditherMax = 0;\n    if (ditherMode != ma_dither_mode_none) {\n        ditherMin = 1.0f / -128;\n        ditherMax = 1.0f /  127;\n    }\n\n    for (i = 0; i < count; i += 1) {\n        float x = src_f32[i];\n        x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n        x = x + 1;                                  /* -1..1 to 0..2 */\n        x = x * 127.5f;                             /* 0..2 to 0..255 */\n\n        dst_u8[i] = (ma_uint8)x;\n    }\n}\n\nstatic MA_INLINE void ma_pcm_f32_to_u8__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_u8__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_f32_to_u8__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_f32_to_u8__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_u8__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_f32_to_u8(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_f32_to_u8__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_f32_to_u8__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_f32_to_u8__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_f32_to_u8__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\nstatic MA_INLINE void ma_pcm_f32_to_s16__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint64 i;\n\n    ma_int16* dst_s16 = (ma_int16*)dst;\n    const float* src_f32 = (const float*)src;\n\n    float ditherMin = 0;\n    float ditherMax = 0;\n    if (ditherMode != ma_dither_mode_none) {\n        ditherMin = 1.0f / -32768;\n        ditherMax = 1.0f /  32767;\n    }\n\n    for (i = 0; i < count; i += 1) {\n        float x = src_f32[i];\n        x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n\n#if 0\n        /* The accurate way. */\n        x = x + 1;                                  /* -1..1 to 0..2 */\n        x = x * 32767.5f;                           /* 0..2 to 0..65535 */\n        x = x - 32768.0f;                           /* 0...65535 to -32768..32767 */\n#else\n        /* The fast way. */\n        x = x * 32767.0f;                           /* -1..1 to -32767..32767 */\n#endif\n\n        dst_s16[i] = (ma_int16)x;\n    }\n}\n#else\nstatic MA_INLINE void ma_pcm_f32_to_s16__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint64 i;\n    ma_uint64 i4;\n    ma_uint64 count4;\n\n    ma_int16* dst_s16 = (ma_int16*)dst;\n    const float* src_f32 = (const float*)src;\n\n    float ditherMin = 0;\n    float ditherMax = 0;\n    if (ditherMode != ma_dither_mode_none) {\n        ditherMin = 1.0f / -32768;\n        ditherMax = 1.0f /  32767;\n    }\n\n    /* Unrolled. */\n    i = 0;\n    count4 = count >> 2;\n    for (i4 = 0; i4 < count4; i4 += 1) {\n        float d0 = ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        float d1 = ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        float d2 = ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        float d3 = ma_dither_f32(ditherMode, ditherMin, ditherMax);\n\n        float x0 = src_f32[i+0];\n        float x1 = src_f32[i+1];\n        float x2 = src_f32[i+2];\n        float x3 = src_f32[i+3];\n\n        x0 = x0 + d0;\n        x1 = x1 + d1;\n        x2 = x2 + d2;\n        x3 = x3 + d3;\n\n        x0 = ((x0 < -1) ? -1 : ((x0 > 1) ? 1 : x0));\n        x1 = ((x1 < -1) ? -1 : ((x1 > 1) ? 1 : x1));\n        x2 = ((x2 < -1) ? -1 : ((x2 > 1) ? 1 : x2));\n        x3 = ((x3 < -1) ? -1 : ((x3 > 1) ? 1 : x3));\n\n        x0 = x0 * 32767.0f;\n        x1 = x1 * 32767.0f;\n        x2 = x2 * 32767.0f;\n        x3 = x3 * 32767.0f;\n\n        dst_s16[i+0] = (ma_int16)x0;\n        dst_s16[i+1] = (ma_int16)x1;\n        dst_s16[i+2] = (ma_int16)x2;\n        dst_s16[i+3] = (ma_int16)x3;\n\n        i += 4;\n    }\n\n    /* Leftover. */\n    for (; i < count; i += 1) {\n        float x = src_f32[i];\n        x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n        x = x * 32767.0f;                           /* -1..1 to -32767..32767 */\n\n        dst_s16[i] = (ma_int16)x;\n    }\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_f32_to_s16__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint64 i;\n    ma_uint64 i8;\n    ma_uint64 count8;\n    ma_int16* dst_s16;\n    const float* src_f32;\n    float ditherMin;\n    float ditherMax;\n\n    /* Both the input and output buffers need to be aligned to 16 bytes. */\n    if ((((ma_uintptr)dst & 15) != 0) || (((ma_uintptr)src & 15) != 0)) {\n        ma_pcm_f32_to_s16__optimized(dst, src, count, ditherMode);\n        return;\n    }\n\n    dst_s16 = (ma_int16*)dst;\n    src_f32 = (const float*)src;\n\n    ditherMin = 0;\n    ditherMax = 0;\n    if (ditherMode != ma_dither_mode_none) {\n        ditherMin = 1.0f / -32768;\n        ditherMax = 1.0f /  32767;\n    }\n\n    i = 0;\n\n    /* SSE2. SSE allows us to output 8 s16's at a time which means our loop is unrolled 8 times. */\n    count8 = count >> 3;\n    for (i8 = 0; i8 < count8; i8 += 1) {\n        __m128 d0;\n        __m128 d1;\n        __m128 x0;\n        __m128 x1;\n\n        if (ditherMode == ma_dither_mode_none) {\n            d0 = _mm_set1_ps(0);\n            d1 = _mm_set1_ps(0);\n        } else if (ditherMode == ma_dither_mode_rectangle) {\n            d0 = _mm_set_ps(\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax)\n            );\n            d1 = _mm_set_ps(\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax),\n                ma_dither_f32_rectangle(ditherMin, ditherMax)\n            );\n        } else {\n            d0 = _mm_set_ps(\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax)\n            );\n            d1 = _mm_set_ps(\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax),\n                ma_dither_f32_triangle(ditherMin, ditherMax)\n            );\n        }\n\n        x0 = *((__m128*)(src_f32 + i) + 0);\n        x1 = *((__m128*)(src_f32 + i) + 1);\n\n        x0 = _mm_add_ps(x0, d0);\n        x1 = _mm_add_ps(x1, d1);\n\n        x0 = _mm_mul_ps(x0, _mm_set1_ps(32767.0f));\n        x1 = _mm_mul_ps(x1, _mm_set1_ps(32767.0f));\n\n        _mm_stream_si128(((__m128i*)(dst_s16 + i)), _mm_packs_epi32(_mm_cvttps_epi32(x0), _mm_cvttps_epi32(x1)));\n\n        i += 8;\n    }\n\n\n    /* Leftover. */\n    for (; i < count; i += 1) {\n        float x = src_f32[i];\n        x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n        x = x * 32767.0f;                           /* -1..1 to -32767..32767 */\n\n        dst_s16[i] = (ma_int16)x;\n    }\n}\n#endif  /* SSE2 */\n\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_f32_to_s16__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint64 i;\n    ma_uint64 i8;\n    ma_uint64 count8;\n    ma_int16* dst_s16;\n    const float* src_f32;\n    float ditherMin;\n    float ditherMax;\n\n    if (!ma_has_neon()) {\n        ma_pcm_f32_to_s16__optimized(dst, src, count, ditherMode);\n        return;\n    }\n\n    /* Both the input and output buffers need to be aligned to 16 bytes. */\n    if ((((ma_uintptr)dst & 15) != 0) || (((ma_uintptr)src & 15) != 0)) {\n        ma_pcm_f32_to_s16__optimized(dst, src, count, ditherMode);\n        return;\n    }\n\n    dst_s16 = (ma_int16*)dst;\n    src_f32 = (const float*)src;\n\n    ditherMin = 0;\n    ditherMax = 0;\n    if (ditherMode != ma_dither_mode_none) {\n        ditherMin = 1.0f / -32768;\n        ditherMax = 1.0f /  32767;\n    }\n\n    i = 0;\n\n    /* NEON. NEON allows us to output 8 s16's at a time which means our loop is unrolled 8 times. */\n    count8 = count >> 3;\n    for (i8 = 0; i8 < count8; i8 += 1) {\n        float32x4_t d0;\n        float32x4_t d1;\n        float32x4_t x0;\n        float32x4_t x1;\n        int32x4_t i0;\n        int32x4_t i1;\n\n        if (ditherMode == ma_dither_mode_none) {\n            d0 = vmovq_n_f32(0);\n            d1 = vmovq_n_f32(0);\n        } else if (ditherMode == ma_dither_mode_rectangle) {\n            float d0v[4];\n            float d1v[4];\n\n            d0v[0] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d0v[1] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d0v[2] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d0v[3] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d0 = vld1q_f32(d0v);\n\n            d1v[0] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d1v[1] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d1v[2] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d1v[3] = ma_dither_f32_rectangle(ditherMin, ditherMax);\n            d1 = vld1q_f32(d1v);\n        } else {\n            float d0v[4];\n            float d1v[4];\n\n            d0v[0] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d0v[1] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d0v[2] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d0v[3] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d0 = vld1q_f32(d0v);\n\n            d1v[0] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d1v[1] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d1v[2] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d1v[3] = ma_dither_f32_triangle(ditherMin, ditherMax);\n            d1 = vld1q_f32(d1v);\n        }\n\n        x0 = *((float32x4_t*)(src_f32 + i) + 0);\n        x1 = *((float32x4_t*)(src_f32 + i) + 1);\n\n        x0 = vaddq_f32(x0, d0);\n        x1 = vaddq_f32(x1, d1);\n\n        x0 = vmulq_n_f32(x0, 32767.0f);\n        x1 = vmulq_n_f32(x1, 32767.0f);\n\n        i0 = vcvtq_s32_f32(x0);\n        i1 = vcvtq_s32_f32(x1);\n        *((int16x8_t*)(dst_s16 + i)) = vcombine_s16(vqmovn_s32(i0), vqmovn_s32(i1));\n\n        i += 8;\n    }\n\n\n    /* Leftover. */\n    for (; i < count; i += 1) {\n        float x = src_f32[i];\n        x = x + ma_dither_f32(ditherMode, ditherMin, ditherMax);\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n        x = x * 32767.0f;                           /* -1..1 to -32767..32767 */\n\n        dst_s16[i] = (ma_int16)x;\n    }\n}\n#endif  /* Neon */\n#endif  /* MA_USE_REFERENCE_CONVERSION_APIS */\n\nMA_API void ma_pcm_f32_to_s16(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_f32_to_s16__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_f32_to_s16__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_f32_to_s16__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_f32_to_s16__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_f32_to_s24__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_uint8* dst_s24 = (ma_uint8*)dst;\n    const float* src_f32 = (const float*)src;\n\n    ma_uint64 i;\n    for (i = 0; i < count; i += 1) {\n        ma_int32 r;\n        float x = src_f32[i];\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n\n#if 0\n        /* The accurate way. */\n        x = x + 1;                                  /* -1..1 to 0..2 */\n        x = x * 8388607.5f;                         /* 0..2 to 0..16777215 */\n        x = x - 8388608.0f;                         /* 0..16777215 to -8388608..8388607 */\n#else\n        /* The fast way. */\n        x = x * 8388607.0f;                         /* -1..1 to -8388607..8388607 */\n#endif\n\n        r = (ma_int32)x;\n        dst_s24[(i*3)+0] = (ma_uint8)((r & 0x0000FF) >>  0);\n        dst_s24[(i*3)+1] = (ma_uint8)((r & 0x00FF00) >>  8);\n        dst_s24[(i*3)+2] = (ma_uint8)((r & 0xFF0000) >> 16);\n    }\n\n    (void)ditherMode;   /* No dithering for f32 -> s24. */\n}\n\nstatic MA_INLINE void ma_pcm_f32_to_s24__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s24__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_f32_to_s24__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_f32_to_s24__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s24__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_f32_to_s24(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_f32_to_s24__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_f32_to_s24__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_f32_to_s24__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_f32_to_s24__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nstatic MA_INLINE void ma_pcm_f32_to_s32__reference(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_int32* dst_s32 = (ma_int32*)dst;\n    const float* src_f32 = (const float*)src;\n\n    ma_uint32 i;\n    for (i = 0; i < count; i += 1) {\n        double x = src_f32[i];\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));    /* clip */\n\n#if 0\n        /* The accurate way. */\n        x = x + 1;                                  /* -1..1 to 0..2 */\n        x = x * 2147483647.5;                       /* 0..2 to 0..4294967295 */\n        x = x - 2147483648.0;                       /* 0...4294967295 to -2147483648..2147483647 */\n#else\n        /* The fast way. */\n        x = x * 2147483647.0;                       /* -1..1 to -2147483647..2147483647 */\n#endif\n\n        dst_s32[i] = (ma_int32)x;\n    }\n\n    (void)ditherMode;   /* No dithering for f32 -> s32. */\n}\n\nstatic MA_INLINE void ma_pcm_f32_to_s32__optimized(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s32__reference(dst, src, count, ditherMode);\n}\n\n#if defined(MA_SUPPORT_SSE2)\nstatic MA_INLINE void ma_pcm_f32_to_s32__sse2(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n#if defined(MA_SUPPORT_NEON)\nstatic MA_INLINE void ma_pcm_f32_to_s32__neon(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    ma_pcm_f32_to_s32__optimized(dst, src, count, ditherMode);\n}\n#endif\n\nMA_API void ma_pcm_f32_to_s32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_f32_to_s32__reference(dst, src, count, ditherMode);\n#else\n    #  if defined(MA_SUPPORT_SSE2)\n        if (ma_has_sse2()) {\n            ma_pcm_f32_to_s32__sse2(dst, src, count, ditherMode);\n        } else\n    #elif defined(MA_SUPPORT_NEON)\n        if (ma_has_neon()) {\n            ma_pcm_f32_to_s32__neon(dst, src, count, ditherMode);\n        } else\n    #endif\n        {\n            ma_pcm_f32_to_s32__optimized(dst, src, count, ditherMode);\n        }\n#endif\n}\n\n\nMA_API void ma_pcm_f32_to_f32(void* dst, const void* src, ma_uint64 count, ma_dither_mode ditherMode)\n{\n    (void)ditherMode;\n\n    ma_copy_memory_64(dst, src, count * sizeof(float));\n}\n\n\nstatic void ma_pcm_interleave_f32__reference(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    float* dst_f32 = (float*)dst;\n    const float** src_f32 = (const float**)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_f32[iFrame*channels + iChannel] = src_f32[iChannel][iFrame];\n        }\n    }\n}\n\nstatic void ma_pcm_interleave_f32__optimized(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_interleave_f32__reference(dst, src, frameCount, channels);\n}\n\nMA_API void ma_pcm_interleave_f32(void* dst, const void** src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_interleave_f32__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_interleave_f32__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\nstatic void ma_pcm_deinterleave_f32__reference(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    float** dst_f32 = (float**)dst;\n    const float* src_f32 = (const float*)src;\n\n    ma_uint64 iFrame;\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; iChannel += 1) {\n            dst_f32[iChannel][iFrame] = src_f32[iFrame*channels + iChannel];\n        }\n    }\n}\n\nstatic void ma_pcm_deinterleave_f32__optimized(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n    ma_pcm_deinterleave_f32__reference(dst, src, frameCount, channels);\n}\n\nMA_API void ma_pcm_deinterleave_f32(void** dst, const void* src, ma_uint64 frameCount, ma_uint32 channels)\n{\n#ifdef MA_USE_REFERENCE_CONVERSION_APIS\n    ma_pcm_deinterleave_f32__reference(dst, src, frameCount, channels);\n#else\n    ma_pcm_deinterleave_f32__optimized(dst, src, frameCount, channels);\n#endif\n}\n\n\nMA_API void ma_pcm_convert(void* pOut, ma_format formatOut, const void* pIn, ma_format formatIn, ma_uint64 sampleCount, ma_dither_mode ditherMode)\n{\n    if (formatOut == formatIn) {\n        ma_copy_memory_64(pOut, pIn, sampleCount * ma_get_bytes_per_sample(formatOut));\n        return;\n    }\n\n    switch (formatIn)\n    {\n        case ma_format_u8:\n        {\n            switch (formatOut)\n            {\n                case ma_format_s16: ma_pcm_u8_to_s16(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s24: ma_pcm_u8_to_s24(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s32: ma_pcm_u8_to_s32(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_f32: ma_pcm_u8_to_f32(pOut, pIn, sampleCount, ditherMode); return;\n                default: break;\n            }\n        } break;\n\n        case ma_format_s16:\n        {\n            switch (formatOut)\n            {\n                case ma_format_u8:  ma_pcm_s16_to_u8( pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s24: ma_pcm_s16_to_s24(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s32: ma_pcm_s16_to_s32(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_f32: ma_pcm_s16_to_f32(pOut, pIn, sampleCount, ditherMode); return;\n                default: break;\n            }\n        } break;\n\n        case ma_format_s24:\n        {\n            switch (formatOut)\n            {\n                case ma_format_u8:  ma_pcm_s24_to_u8( pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s16: ma_pcm_s24_to_s16(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s32: ma_pcm_s24_to_s32(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_f32: ma_pcm_s24_to_f32(pOut, pIn, sampleCount, ditherMode); return;\n                default: break;\n            }\n        } break;\n\n        case ma_format_s32:\n        {\n            switch (formatOut)\n            {\n                case ma_format_u8:  ma_pcm_s32_to_u8( pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s16: ma_pcm_s32_to_s16(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s24: ma_pcm_s32_to_s24(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_f32: ma_pcm_s32_to_f32(pOut, pIn, sampleCount, ditherMode); return;\n                default: break;\n            }\n        } break;\n\n        case ma_format_f32:\n        {\n            switch (formatOut)\n            {\n                case ma_format_u8:  ma_pcm_f32_to_u8( pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s16: ma_pcm_f32_to_s16(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s24: ma_pcm_f32_to_s24(pOut, pIn, sampleCount, ditherMode); return;\n                case ma_format_s32: ma_pcm_f32_to_s32(pOut, pIn, sampleCount, ditherMode); return;\n                default: break;\n            }\n        } break;\n\n        default: break;\n    }\n}\n\nMA_API void ma_convert_pcm_frames_format(void* pOut, ma_format formatOut, const void* pIn, ma_format formatIn, ma_uint64 frameCount, ma_uint32 channels, ma_dither_mode ditherMode)\n{\n    ma_pcm_convert(pOut, formatOut, pIn, formatIn, frameCount * channels, ditherMode);\n}\n\nMA_API void ma_deinterleave_pcm_frames(ma_format format, ma_uint32 channels, ma_uint64 frameCount, const void* pInterleavedPCMFrames, void** ppDeinterleavedPCMFrames)\n{\n    if (pInterleavedPCMFrames == NULL || ppDeinterleavedPCMFrames == NULL) {\n        return; /* Invalid args. */\n    }\n\n    /* For efficiency we do this per format. */\n    switch (format) {\n        case ma_format_s16:\n        {\n            const ma_int16* pSrcS16 = (const ma_int16*)pInterleavedPCMFrames;\n            ma_uint64 iPCMFrame;\n            for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < channels; ++iChannel) {\n                    ma_int16* pDstS16 = (ma_int16*)ppDeinterleavedPCMFrames[iChannel];\n                    pDstS16[iPCMFrame] = pSrcS16[iPCMFrame*channels+iChannel];\n                }\n            }\n        } break;\n\n        case ma_format_f32:\n        {\n            const float* pSrcF32 = (const float*)pInterleavedPCMFrames;\n            ma_uint64 iPCMFrame;\n            for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < channels; ++iChannel) {\n                    float* pDstF32 = (float*)ppDeinterleavedPCMFrames[iChannel];\n                    pDstF32[iPCMFrame] = pSrcF32[iPCMFrame*channels+iChannel];\n                }\n            }\n        } break;\n\n        default:\n        {\n            ma_uint32 sampleSizeInBytes = ma_get_bytes_per_sample(format);\n            ma_uint64 iPCMFrame;\n            for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < channels; ++iChannel) {\n                          void* pDst = ma_offset_ptr(ppDeinterleavedPCMFrames[iChannel], iPCMFrame*sampleSizeInBytes);\n                    const void* pSrc = ma_offset_ptr(pInterleavedPCMFrames, (iPCMFrame*channels+iChannel)*sampleSizeInBytes);\n                    memcpy(pDst, pSrc, sampleSizeInBytes);\n                }\n            }\n        } break;\n    }\n}\n\nMA_API void ma_interleave_pcm_frames(ma_format format, ma_uint32 channels, ma_uint64 frameCount, const void** ppDeinterleavedPCMFrames, void* pInterleavedPCMFrames)\n{\n    switch (format)\n    {\n        case ma_format_s16:\n        {\n            ma_int16* pDstS16 = (ma_int16*)pInterleavedPCMFrames;\n            ma_uint64 iPCMFrame;\n            for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < channels; ++iChannel) {\n                    const ma_int16* pSrcS16 = (const ma_int16*)ppDeinterleavedPCMFrames[iChannel];\n                    pDstS16[iPCMFrame*channels+iChannel] = pSrcS16[iPCMFrame];\n                }\n            }\n        } break;\n\n        case ma_format_f32:\n        {\n            float* pDstF32 = (float*)pInterleavedPCMFrames;\n            ma_uint64 iPCMFrame;\n            for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < channels; ++iChannel) {\n                    const float* pSrcF32 = (const float*)ppDeinterleavedPCMFrames[iChannel];\n                    pDstF32[iPCMFrame*channels+iChannel] = pSrcF32[iPCMFrame];\n                }\n            }\n        } break;\n\n        default:\n        {\n            ma_uint32 sampleSizeInBytes = ma_get_bytes_per_sample(format);\n            ma_uint64 iPCMFrame;\n            for (iPCMFrame = 0; iPCMFrame < frameCount; ++iPCMFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < channels; ++iChannel) {\n                          void* pDst = ma_offset_ptr(pInterleavedPCMFrames, (iPCMFrame*channels+iChannel)*sampleSizeInBytes);\n                    const void* pSrc = ma_offset_ptr(ppDeinterleavedPCMFrames[iChannel], iPCMFrame*sampleSizeInBytes);\n                    memcpy(pDst, pSrc, sampleSizeInBytes);\n                }\n            }\n        } break;\n    }\n}\n\n\n/**************************************************************************************************************************************************************\n\nBiquad Filter\n\n**************************************************************************************************************************************************************/\n#ifndef MA_BIQUAD_FIXED_POINT_SHIFT\n#define MA_BIQUAD_FIXED_POINT_SHIFT 14\n#endif\n\nstatic ma_int32 ma_biquad_float_to_fp(double x)\n{\n    return (ma_int32)(x * (1 << MA_BIQUAD_FIXED_POINT_SHIFT));\n}\n\nMA_API ma_biquad_config ma_biquad_config_init(ma_format format, ma_uint32 channels, double b0, double b1, double b2, double a0, double a1, double a2)\n{\n    ma_biquad_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format = format;\n    config.channels = channels;\n    config.b0 = b0;\n    config.b1 = b1;\n    config.b2 = b2;\n    config.a0 = a0;\n    config.a1 = a1;\n    config.a2 = a2;\n\n    return config;\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t r1Offset;\n    size_t r2Offset;\n} ma_biquad_heap_layout;\n\nstatic ma_result ma_biquad_get_heap_layout(const ma_biquad_config* pConfig, ma_biquad_heap_layout* pHeapLayout)\n{\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->channels == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* R0 */\n    pHeapLayout->r1Offset = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += sizeof(ma_biquad_coefficient) * pConfig->channels;\n\n    /* R1 */\n    pHeapLayout->r2Offset = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += sizeof(ma_biquad_coefficient) * pConfig->channels;\n\n    /* Make sure allocation size is aligned. */\n    pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_biquad_get_heap_size(const ma_biquad_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_biquad_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_biquad_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_biquad_init_preallocated(const ma_biquad_config* pConfig, void* pHeap, ma_biquad* pBQ)\n{\n    ma_result result;\n    ma_biquad_heap_layout heapLayout;\n\n    if (pBQ == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pBQ);\n\n    result = ma_biquad_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pBQ->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n    pBQ->pR1 = (ma_biquad_coefficient*)ma_offset_ptr(pHeap, heapLayout.r1Offset);\n    pBQ->pR2 = (ma_biquad_coefficient*)ma_offset_ptr(pHeap, heapLayout.r2Offset);\n\n    return ma_biquad_reinit(pConfig, pBQ);\n}\n\nMA_API ma_result ma_biquad_init(const ma_biquad_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_biquad* pBQ)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_biquad_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_biquad_init_preallocated(pConfig, pHeap, pBQ);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pBQ->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_biquad_uninit(ma_biquad* pBQ, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pBQ == NULL) {\n        return;\n    }\n\n    if (pBQ->_ownsHeap) {\n        ma_free(pBQ->_pHeap, pAllocationCallbacks);\n    }\n}\n\nMA_API ma_result ma_biquad_reinit(const ma_biquad_config* pConfig, ma_biquad* pBQ)\n{\n    if (pBQ == NULL || pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->a0 == 0) {\n        return MA_INVALID_ARGS; /* Division by zero. */\n    }\n\n    /* Only supporting f32 and s16. */\n    if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The format cannot be changed after initialization. */\n    if (pBQ->format != ma_format_unknown && pBQ->format != pConfig->format) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* The channel count cannot be changed after initialization. */\n    if (pBQ->channels != 0 && pBQ->channels != pConfig->channels) {\n        return MA_INVALID_OPERATION;\n    }\n\n\n    pBQ->format   = pConfig->format;\n    pBQ->channels = pConfig->channels;\n\n    /* Normalize. */\n    if (pConfig->format == ma_format_f32) {\n        pBQ->b0.f32 = (float)(pConfig->b0 / pConfig->a0);\n        pBQ->b1.f32 = (float)(pConfig->b1 / pConfig->a0);\n        pBQ->b2.f32 = (float)(pConfig->b2 / pConfig->a0);\n        pBQ->a1.f32 = (float)(pConfig->a1 / pConfig->a0);\n        pBQ->a2.f32 = (float)(pConfig->a2 / pConfig->a0);\n    } else {\n        pBQ->b0.s32 = ma_biquad_float_to_fp(pConfig->b0 / pConfig->a0);\n        pBQ->b1.s32 = ma_biquad_float_to_fp(pConfig->b1 / pConfig->a0);\n        pBQ->b2.s32 = ma_biquad_float_to_fp(pConfig->b2 / pConfig->a0);\n        pBQ->a1.s32 = ma_biquad_float_to_fp(pConfig->a1 / pConfig->a0);\n        pBQ->a2.s32 = ma_biquad_float_to_fp(pConfig->a2 / pConfig->a0);\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_biquad_clear_cache(ma_biquad* pBQ)\n{\n    if (pBQ == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pBQ->format == ma_format_f32) {\n        pBQ->pR1->f32 = 0;\n        pBQ->pR2->f32 = 0;\n    } else {\n        pBQ->pR1->s32 = 0;\n        pBQ->pR2->s32 = 0;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic MA_INLINE void ma_biquad_process_pcm_frame_f32__direct_form_2_transposed(ma_biquad* pBQ, float* pY, const float* pX)\n{\n    ma_uint32 c;\n    const ma_uint32 channels = pBQ->channels;\n    const float b0 = pBQ->b0.f32;\n    const float b1 = pBQ->b1.f32;\n    const float b2 = pBQ->b2.f32;\n    const float a1 = pBQ->a1.f32;\n    const float a2 = pBQ->a2.f32;\n\n    MA_ASSUME(channels > 0);\n    for (c = 0; c < channels; c += 1) {\n        float r1 = pBQ->pR1[c].f32;\n        float r2 = pBQ->pR2[c].f32;\n        float x  = pX[c];\n        float y;\n\n        y  = b0*x        + r1;\n        r1 = b1*x - a1*y + r2;\n        r2 = b2*x - a2*y;\n\n        pY[c]           = y;\n        pBQ->pR1[c].f32 = r1;\n        pBQ->pR2[c].f32 = r2;\n    }\n}\n\nstatic MA_INLINE void ma_biquad_process_pcm_frame_f32(ma_biquad* pBQ, float* pY, const float* pX)\n{\n    ma_biquad_process_pcm_frame_f32__direct_form_2_transposed(pBQ, pY, pX);\n}\n\nstatic MA_INLINE void ma_biquad_process_pcm_frame_s16__direct_form_2_transposed(ma_biquad* pBQ, ma_int16* pY, const ma_int16* pX)\n{\n    ma_uint32 c;\n    const ma_uint32 channels = pBQ->channels;\n    const ma_int32 b0 = pBQ->b0.s32;\n    const ma_int32 b1 = pBQ->b1.s32;\n    const ma_int32 b2 = pBQ->b2.s32;\n    const ma_int32 a1 = pBQ->a1.s32;\n    const ma_int32 a2 = pBQ->a2.s32;\n\n    MA_ASSUME(channels > 0);\n    for (c = 0; c < channels; c += 1) {\n        ma_int32 r1 = pBQ->pR1[c].s32;\n        ma_int32 r2 = pBQ->pR2[c].s32;\n        ma_int32 x  = pX[c];\n        ma_int32 y;\n\n        y  = (b0*x        + r1) >> MA_BIQUAD_FIXED_POINT_SHIFT;\n        r1 = (b1*x - a1*y + r2);\n        r2 = (b2*x - a2*y);\n\n        pY[c]           = (ma_int16)ma_clamp(y, -32768, 32767);\n        pBQ->pR1[c].s32 = r1;\n        pBQ->pR2[c].s32 = r2;\n    }\n}\n\nstatic MA_INLINE void ma_biquad_process_pcm_frame_s16(ma_biquad* pBQ, ma_int16* pY, const ma_int16* pX)\n{\n    ma_biquad_process_pcm_frame_s16__direct_form_2_transposed(pBQ, pY, pX);\n}\n\nMA_API ma_result ma_biquad_process_pcm_frames(ma_biquad* pBQ, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    ma_uint32 n;\n\n    if (pBQ == NULL || pFramesOut == NULL || pFramesIn == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Note that the logic below needs to support in-place filtering. That is, it must support the case where pFramesOut and pFramesIn are the same. */\n\n    if (pBQ->format == ma_format_f32) {\n        /* */ float* pY = (      float*)pFramesOut;\n        const float* pX = (const float*)pFramesIn;\n\n        for (n = 0; n < frameCount; n += 1) {\n            ma_biquad_process_pcm_frame_f32__direct_form_2_transposed(pBQ, pY, pX);\n            pY += pBQ->channels;\n            pX += pBQ->channels;\n        }\n    } else if (pBQ->format == ma_format_s16) {\n        /* */ ma_int16* pY = (      ma_int16*)pFramesOut;\n        const ma_int16* pX = (const ma_int16*)pFramesIn;\n\n        for (n = 0; n < frameCount; n += 1) {\n            ma_biquad_process_pcm_frame_s16__direct_form_2_transposed(pBQ, pY, pX);\n            pY += pBQ->channels;\n            pX += pBQ->channels;\n        }\n    } else {\n        MA_ASSERT(MA_FALSE);\n        return MA_INVALID_ARGS; /* Format not supported. Should never hit this because it's checked in ma_biquad_init() and ma_biquad_reinit(). */\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_uint32 ma_biquad_get_latency(const ma_biquad* pBQ)\n{\n    if (pBQ == NULL) {\n        return 0;\n    }\n\n    return 2;\n}\n\n\n/**************************************************************************************************************************************************************\n\nLow-Pass Filter\n\n**************************************************************************************************************************************************************/\nMA_API ma_lpf1_config ma_lpf1_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency)\n{\n    ma_lpf1_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format = format;\n    config.channels = channels;\n    config.sampleRate = sampleRate;\n    config.cutoffFrequency = cutoffFrequency;\n    config.q = 0.5;\n\n    return config;\n}\n\nMA_API ma_lpf2_config ma_lpf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, double q)\n{\n    ma_lpf2_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format = format;\n    config.channels = channels;\n    config.sampleRate = sampleRate;\n    config.cutoffFrequency = cutoffFrequency;\n    config.q = q;\n\n    /* Q cannot be 0 or else it'll result in a division by 0. In this case just default to 0.707107. */\n    if (config.q == 0) {\n        config.q = 0.707107;\n    }\n\n    return config;\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t r1Offset;\n} ma_lpf1_heap_layout;\n\nstatic ma_result ma_lpf1_get_heap_layout(const ma_lpf1_config* pConfig, ma_lpf1_heap_layout* pHeapLayout)\n{\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->channels == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* R1 */\n    pHeapLayout->r1Offset = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += sizeof(ma_biquad_coefficient) * pConfig->channels;\n\n    /* Make sure allocation size is aligned. */\n    pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_lpf1_get_heap_size(const ma_lpf1_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_lpf1_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_lpf1_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_lpf1_init_preallocated(const ma_lpf1_config* pConfig, void* pHeap, ma_lpf1* pLPF)\n{\n    ma_result result;\n    ma_lpf1_heap_layout heapLayout;\n\n    if (pLPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pLPF);\n\n    result = ma_lpf1_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pLPF->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n    pLPF->pR1 = (ma_biquad_coefficient*)ma_offset_ptr(pHeap, heapLayout.r1Offset);\n\n    return ma_lpf1_reinit(pConfig, pLPF);\n}\n\nMA_API ma_result ma_lpf1_init(const ma_lpf1_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf1* pLPF)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_lpf1_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_lpf1_init_preallocated(pConfig, pHeap, pLPF);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pLPF->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_lpf1_uninit(ma_lpf1* pLPF, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pLPF == NULL) {\n        return;\n    }\n\n    if (pLPF->_ownsHeap) {\n        ma_free(pLPF->_pHeap, pAllocationCallbacks);\n    }\n}\n\nMA_API ma_result ma_lpf1_reinit(const ma_lpf1_config* pConfig, ma_lpf1* pLPF)\n{\n    double a;\n\n    if (pLPF == NULL || pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Only supporting f32 and s16. */\n    if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The format cannot be changed after initialization. */\n    if (pLPF->format != ma_format_unknown && pLPF->format != pConfig->format) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* The channel count cannot be changed after initialization. */\n    if (pLPF->channels != 0 && pLPF->channels != pConfig->channels) {\n        return MA_INVALID_OPERATION;\n    }\n\n    pLPF->format   = pConfig->format;\n    pLPF->channels = pConfig->channels;\n\n    a = ma_expd(-2 * MA_PI_D * pConfig->cutoffFrequency / pConfig->sampleRate);\n    if (pConfig->format == ma_format_f32) {\n        pLPF->a.f32 = (float)a;\n    } else {\n        pLPF->a.s32 = ma_biquad_float_to_fp(a);\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_lpf1_clear_cache(ma_lpf1* pLPF)\n{\n    if (pLPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pLPF->format == ma_format_f32) {\n        pLPF->a.f32 = 0;\n    } else {\n        pLPF->a.s32 = 0;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic MA_INLINE void ma_lpf1_process_pcm_frame_f32(ma_lpf1* pLPF, float* pY, const float* pX)\n{\n    ma_uint32 c;\n    const ma_uint32 channels = pLPF->channels;\n    const float a = pLPF->a.f32;\n    const float b = 1 - a;\n\n    MA_ASSUME(channels > 0);\n    for (c = 0; c < channels; c += 1) {\n        float r1 = pLPF->pR1[c].f32;\n        float x  = pX[c];\n        float y;\n\n        y = b*x + a*r1;\n\n        pY[c]           = y;\n        pLPF->pR1[c].f32 = y;\n    }\n}\n\nstatic MA_INLINE void ma_lpf1_process_pcm_frame_s16(ma_lpf1* pLPF, ma_int16* pY, const ma_int16* pX)\n{\n    ma_uint32 c;\n    const ma_uint32 channels = pLPF->channels;\n    const ma_int32 a = pLPF->a.s32;\n    const ma_int32 b = ((1 << MA_BIQUAD_FIXED_POINT_SHIFT) - a);\n\n    MA_ASSUME(channels > 0);\n    for (c = 0; c < channels; c += 1) {\n        ma_int32 r1 = pLPF->pR1[c].s32;\n        ma_int32 x  = pX[c];\n        ma_int32 y;\n\n        y = (b*x + a*r1) >> MA_BIQUAD_FIXED_POINT_SHIFT;\n\n        pY[c]            = (ma_int16)y;\n        pLPF->pR1[c].s32 = (ma_int32)y;\n    }\n}\n\nMA_API ma_result ma_lpf1_process_pcm_frames(ma_lpf1* pLPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    ma_uint32 n;\n\n    if (pLPF == NULL || pFramesOut == NULL || pFramesIn == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Note that the logic below needs to support in-place filtering. That is, it must support the case where pFramesOut and pFramesIn are the same. */\n\n    if (pLPF->format == ma_format_f32) {\n        /* */ float* pY = (      float*)pFramesOut;\n        const float* pX = (const float*)pFramesIn;\n\n        for (n = 0; n < frameCount; n += 1) {\n            ma_lpf1_process_pcm_frame_f32(pLPF, pY, pX);\n            pY += pLPF->channels;\n            pX += pLPF->channels;\n        }\n    } else if (pLPF->format == ma_format_s16) {\n        /* */ ma_int16* pY = (      ma_int16*)pFramesOut;\n        const ma_int16* pX = (const ma_int16*)pFramesIn;\n\n        for (n = 0; n < frameCount; n += 1) {\n            ma_lpf1_process_pcm_frame_s16(pLPF, pY, pX);\n            pY += pLPF->channels;\n            pX += pLPF->channels;\n        }\n    } else {\n        MA_ASSERT(MA_FALSE);\n        return MA_INVALID_ARGS; /* Format not supported. Should never hit this because it's checked in ma_biquad_init() and ma_biquad_reinit(). */\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_uint32 ma_lpf1_get_latency(const ma_lpf1* pLPF)\n{\n    if (pLPF == NULL) {\n        return 0;\n    }\n\n    return 1;\n}\n\n\nstatic MA_INLINE ma_biquad_config ma_lpf2__get_biquad_config(const ma_lpf2_config* pConfig)\n{\n    ma_biquad_config bqConfig;\n    double q;\n    double w;\n    double s;\n    double c;\n    double a;\n\n    MA_ASSERT(pConfig != NULL);\n\n    q = pConfig->q;\n    w = 2 * MA_PI_D * pConfig->cutoffFrequency / pConfig->sampleRate;\n    s = ma_sind(w);\n    c = ma_cosd(w);\n    a = s / (2*q);\n\n    bqConfig.b0 = (1 - c) / 2;\n    bqConfig.b1 =  1 - c;\n    bqConfig.b2 = (1 - c) / 2;\n    bqConfig.a0 =  1 + a;\n    bqConfig.a1 = -2 * c;\n    bqConfig.a2 =  1 - a;\n\n    bqConfig.format   = pConfig->format;\n    bqConfig.channels = pConfig->channels;\n\n    return bqConfig;\n}\n\nMA_API ma_result ma_lpf2_get_heap_size(const ma_lpf2_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_biquad_config bqConfig;\n    bqConfig = ma_lpf2__get_biquad_config(pConfig);\n\n    return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes);\n}\n\nMA_API ma_result ma_lpf2_init_preallocated(const ma_lpf2_config* pConfig, void* pHeap, ma_lpf2* pLPF)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pLPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pLPF);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_lpf2__get_biquad_config(pConfig);\n    result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pLPF->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_lpf2_init(const ma_lpf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf2* pLPF)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_lpf2_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_lpf2_init_preallocated(pConfig, pHeap, pLPF);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pLPF->bq._ownsHeap = MA_TRUE;    /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */\n    return MA_SUCCESS;\n}\n\nMA_API void ma_lpf2_uninit(ma_lpf2* pLPF, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pLPF == NULL) {\n        return;\n    }\n\n    ma_biquad_uninit(&pLPF->bq, pAllocationCallbacks);   /* <-- This will free the heap allocation. */\n}\n\nMA_API ma_result ma_lpf2_reinit(const ma_lpf2_config* pConfig, ma_lpf2* pLPF)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pLPF == NULL || pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_lpf2__get_biquad_config(pConfig);\n    result = ma_biquad_reinit(&bqConfig, &pLPF->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_lpf2_clear_cache(ma_lpf2* pLPF)\n{\n    if (pLPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_biquad_clear_cache(&pLPF->bq);\n\n    return MA_SUCCESS;\n}\n\nstatic MA_INLINE void ma_lpf2_process_pcm_frame_s16(ma_lpf2* pLPF, ma_int16* pFrameOut, const ma_int16* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_s16(&pLPF->bq, pFrameOut, pFrameIn);\n}\n\nstatic MA_INLINE void ma_lpf2_process_pcm_frame_f32(ma_lpf2* pLPF, float* pFrameOut, const float* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_f32(&pLPF->bq, pFrameOut, pFrameIn);\n}\n\nMA_API ma_result ma_lpf2_process_pcm_frames(ma_lpf2* pLPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    if (pLPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_biquad_process_pcm_frames(&pLPF->bq, pFramesOut, pFramesIn, frameCount);\n}\n\nMA_API ma_uint32 ma_lpf2_get_latency(const ma_lpf2* pLPF)\n{\n    if (pLPF == NULL) {\n        return 0;\n    }\n\n    return ma_biquad_get_latency(&pLPF->bq);\n}\n\n\nMA_API ma_lpf_config ma_lpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order)\n{\n    ma_lpf_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format          = format;\n    config.channels        = channels;\n    config.sampleRate      = sampleRate;\n    config.cutoffFrequency = cutoffFrequency;\n    config.order           = ma_min(order, MA_MAX_FILTER_ORDER);\n\n    return config;\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t lpf1Offset;\n    size_t lpf2Offset;  /* Offset of the first second order filter. Subsequent filters will come straight after, and will each have the same heap size. */\n} ma_lpf_heap_layout;\n\nstatic void ma_lpf_calculate_sub_lpf_counts(ma_uint32 order, ma_uint32* pLPF1Count, ma_uint32* pLPF2Count)\n{\n    MA_ASSERT(pLPF1Count != NULL);\n    MA_ASSERT(pLPF2Count != NULL);\n\n    *pLPF1Count = order % 2;\n    *pLPF2Count = order / 2;\n}\n\nstatic ma_result ma_lpf_get_heap_layout(const ma_lpf_config* pConfig, ma_lpf_heap_layout* pHeapLayout)\n{\n    ma_result result;\n    ma_uint32 lpf1Count;\n    ma_uint32 lpf2Count;\n    ma_uint32 ilpf1;\n    ma_uint32 ilpf2;\n\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->channels == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->order > MA_MAX_FILTER_ORDER) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_lpf_calculate_sub_lpf_counts(pConfig->order, &lpf1Count, &lpf2Count);\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* LPF 1 */\n    pHeapLayout->lpf1Offset = pHeapLayout->sizeInBytes;\n    for (ilpf1 = 0; ilpf1 < lpf1Count; ilpf1 += 1) {\n        size_t lpf1HeapSizeInBytes;\n        ma_lpf1_config lpf1Config = ma_lpf1_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency);\n\n        result = ma_lpf1_get_heap_size(&lpf1Config, &lpf1HeapSizeInBytes);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pHeapLayout->sizeInBytes += sizeof(ma_lpf1) + lpf1HeapSizeInBytes;\n    }\n\n    /* LPF 2*/\n    pHeapLayout->lpf2Offset = pHeapLayout->sizeInBytes;\n    for (ilpf2 = 0; ilpf2 < lpf2Count; ilpf2 += 1) {\n        size_t lpf2HeapSizeInBytes;\n        ma_lpf2_config lpf2Config = ma_lpf2_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency, 0.707107);   /* <-- The \"q\" parameter does not matter for the purpose of calculating the heap size. */\n\n        result = ma_lpf2_get_heap_size(&lpf2Config, &lpf2HeapSizeInBytes);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pHeapLayout->sizeInBytes += sizeof(ma_lpf2) + lpf2HeapSizeInBytes;\n    }\n\n    /* Make sure allocation size is aligned. */\n    pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_lpf_reinit__internal(const ma_lpf_config* pConfig, void* pHeap, ma_lpf* pLPF, ma_bool32 isNew)\n{\n    ma_result result;\n    ma_uint32 lpf1Count;\n    ma_uint32 lpf2Count;\n    ma_uint32 ilpf1;\n    ma_uint32 ilpf2;\n    ma_lpf_heap_layout heapLayout;  /* Only used if isNew is true. */\n\n    if (pLPF == NULL || pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Only supporting f32 and s16. */\n    if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The format cannot be changed after initialization. */\n    if (pLPF->format != ma_format_unknown && pLPF->format != pConfig->format) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* The channel count cannot be changed after initialization. */\n    if (pLPF->channels != 0 && pLPF->channels != pConfig->channels) {\n        return MA_INVALID_OPERATION;\n    }\n\n    if (pConfig->order > MA_MAX_FILTER_ORDER) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_lpf_calculate_sub_lpf_counts(pConfig->order, &lpf1Count, &lpf2Count);\n\n    /* The filter order can't change between reinits. */\n    if (!isNew) {\n        if (pLPF->lpf1Count != lpf1Count || pLPF->lpf2Count != lpf2Count) {\n            return MA_INVALID_OPERATION;\n        }\n    }\n\n    if (isNew) {\n        result = ma_lpf_get_heap_layout(pConfig, &heapLayout);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pLPF->_pHeap = pHeap;\n        MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n        pLPF->pLPF1 = (ma_lpf1*)ma_offset_ptr(pHeap, heapLayout.lpf1Offset);\n        pLPF->pLPF2 = (ma_lpf2*)ma_offset_ptr(pHeap, heapLayout.lpf2Offset);\n    } else {\n        MA_ZERO_OBJECT(&heapLayout);    /* To silence a compiler warning. */\n    }\n\n    for (ilpf1 = 0; ilpf1 < lpf1Count; ilpf1 += 1) {\n        ma_lpf1_config lpf1Config = ma_lpf1_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency);\n\n        if (isNew) {\n            size_t lpf1HeapSizeInBytes;\n\n            result = ma_lpf1_get_heap_size(&lpf1Config, &lpf1HeapSizeInBytes);\n            if (result == MA_SUCCESS) {\n                result = ma_lpf1_init_preallocated(&lpf1Config, ma_offset_ptr(pHeap, heapLayout.lpf1Offset + (sizeof(ma_lpf1) * lpf1Count) + (ilpf1 * lpf1HeapSizeInBytes)), &pLPF->pLPF1[ilpf1]);\n            }\n        } else {\n            result = ma_lpf1_reinit(&lpf1Config, &pLPF->pLPF1[ilpf1]);\n        }\n\n        if (result != MA_SUCCESS) {\n            ma_uint32 jlpf1;\n\n            for (jlpf1 = 0; jlpf1 < ilpf1; jlpf1 += 1) {\n                ma_lpf1_uninit(&pLPF->pLPF1[jlpf1], NULL);  /* No need for allocation callbacks here since we used a preallocated heap allocation. */\n            }\n\n            return result;\n        }\n    }\n\n    for (ilpf2 = 0; ilpf2 < lpf2Count; ilpf2 += 1) {\n        ma_lpf2_config lpf2Config;\n        double q;\n        double a;\n\n        /* Tempting to use 0.707107, but won't result in a Butterworth filter if the order is > 2. */\n        if (lpf1Count == 1) {\n            a = (1 + ilpf2*1) * (MA_PI_D/(pConfig->order*1));   /* Odd order. */\n        } else {\n            a = (1 + ilpf2*2) * (MA_PI_D/(pConfig->order*2));   /* Even order. */\n        }\n        q = 1 / (2*ma_cosd(a));\n\n        lpf2Config = ma_lpf2_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency, q);\n\n        if (isNew) {\n            size_t lpf2HeapSizeInBytes;\n\n            result = ma_lpf2_get_heap_size(&lpf2Config, &lpf2HeapSizeInBytes);\n            if (result == MA_SUCCESS) {\n                result = ma_lpf2_init_preallocated(&lpf2Config, ma_offset_ptr(pHeap, heapLayout.lpf2Offset + (sizeof(ma_lpf2) * lpf2Count) + (ilpf2 * lpf2HeapSizeInBytes)), &pLPF->pLPF2[ilpf2]);\n            }\n        } else {\n            result = ma_lpf2_reinit(&lpf2Config, &pLPF->pLPF2[ilpf2]);\n        }\n\n        if (result != MA_SUCCESS) {\n            ma_uint32 jlpf1;\n            ma_uint32 jlpf2;\n\n            for (jlpf1 = 0; jlpf1 < lpf1Count; jlpf1 += 1) {\n                ma_lpf1_uninit(&pLPF->pLPF1[jlpf1], NULL);  /* No need for allocation callbacks here since we used a preallocated heap allocation. */\n            }\n\n            for (jlpf2 = 0; jlpf2 < ilpf2; jlpf2 += 1) {\n                ma_lpf2_uninit(&pLPF->pLPF2[jlpf2], NULL);  /* No need for allocation callbacks here since we used a preallocated heap allocation. */\n            }\n\n            return result;\n        }\n    }\n\n    pLPF->lpf1Count  = lpf1Count;\n    pLPF->lpf2Count  = lpf2Count;\n    pLPF->format     = pConfig->format;\n    pLPF->channels   = pConfig->channels;\n    pLPF->sampleRate = pConfig->sampleRate;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_lpf_get_heap_size(const ma_lpf_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_lpf_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_lpf_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return result;\n}\n\nMA_API ma_result ma_lpf_init_preallocated(const ma_lpf_config* pConfig, void* pHeap, ma_lpf* pLPF)\n{\n    if (pLPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pLPF);\n\n    return ma_lpf_reinit__internal(pConfig, pHeap, pLPF, /*isNew*/MA_TRUE);\n}\n\nMA_API ma_result ma_lpf_init(const ma_lpf_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf* pLPF)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_lpf_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_lpf_init_preallocated(pConfig, pHeap, pLPF);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pLPF->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_lpf_uninit(ma_lpf* pLPF, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_uint32 ilpf1;\n    ma_uint32 ilpf2;\n\n    if (pLPF == NULL) {\n        return;\n    }\n\n    for (ilpf1 = 0; ilpf1 < pLPF->lpf1Count; ilpf1 += 1) {\n        ma_lpf1_uninit(&pLPF->pLPF1[ilpf1], pAllocationCallbacks);\n    }\n\n    for (ilpf2 = 0; ilpf2 < pLPF->lpf2Count; ilpf2 += 1) {\n        ma_lpf2_uninit(&pLPF->pLPF2[ilpf2], pAllocationCallbacks);\n    }\n\n    if (pLPF->_ownsHeap) {\n        ma_free(pLPF->_pHeap, pAllocationCallbacks);\n    }\n}\n\nMA_API ma_result ma_lpf_reinit(const ma_lpf_config* pConfig, ma_lpf* pLPF)\n{\n    return ma_lpf_reinit__internal(pConfig, NULL, pLPF, /*isNew*/MA_FALSE);\n}\n\nMA_API ma_result ma_lpf_clear_cache(ma_lpf* pLPF)\n{\n    ma_uint32 ilpf1;\n    ma_uint32 ilpf2;\n\n    if (pLPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    for (ilpf1 = 0; ilpf1 < pLPF->lpf1Count; ilpf1 += 1) {\n        ma_lpf1_clear_cache(&pLPF->pLPF1[ilpf1]);\n    }\n\n    for (ilpf2 = 0; ilpf2 < pLPF->lpf2Count; ilpf2 += 1) {\n        ma_lpf2_clear_cache(&pLPF->pLPF2[ilpf2]);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic MA_INLINE void ma_lpf_process_pcm_frame_f32(ma_lpf* pLPF, float* pY, const void* pX)\n{\n    ma_uint32 ilpf1;\n    ma_uint32 ilpf2;\n\n    MA_ASSERT(pLPF->format == ma_format_f32);\n\n    MA_MOVE_MEMORY(pY, pX, ma_get_bytes_per_frame(pLPF->format, pLPF->channels));\n\n    for (ilpf1 = 0; ilpf1 < pLPF->lpf1Count; ilpf1 += 1) {\n        ma_lpf1_process_pcm_frame_f32(&pLPF->pLPF1[ilpf1], pY, pY);\n    }\n\n    for (ilpf2 = 0; ilpf2 < pLPF->lpf2Count; ilpf2 += 1) {\n        ma_lpf2_process_pcm_frame_f32(&pLPF->pLPF2[ilpf2], pY, pY);\n    }\n}\n\nstatic MA_INLINE void ma_lpf_process_pcm_frame_s16(ma_lpf* pLPF, ma_int16* pY, const ma_int16* pX)\n{\n    ma_uint32 ilpf1;\n    ma_uint32 ilpf2;\n\n    MA_ASSERT(pLPF->format == ma_format_s16);\n\n    MA_MOVE_MEMORY(pY, pX, ma_get_bytes_per_frame(pLPF->format, pLPF->channels));\n\n    for (ilpf1 = 0; ilpf1 < pLPF->lpf1Count; ilpf1 += 1) {\n        ma_lpf1_process_pcm_frame_s16(&pLPF->pLPF1[ilpf1], pY, pY);\n    }\n\n    for (ilpf2 = 0; ilpf2 < pLPF->lpf2Count; ilpf2 += 1) {\n        ma_lpf2_process_pcm_frame_s16(&pLPF->pLPF2[ilpf2], pY, pY);\n    }\n}\n\nMA_API ma_result ma_lpf_process_pcm_frames(ma_lpf* pLPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    ma_result result;\n    ma_uint32 ilpf1;\n    ma_uint32 ilpf2;\n\n    if (pLPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Faster path for in-place. */\n    if (pFramesOut == pFramesIn) {\n        for (ilpf1 = 0; ilpf1 < pLPF->lpf1Count; ilpf1 += 1) {\n            result = ma_lpf1_process_pcm_frames(&pLPF->pLPF1[ilpf1], pFramesOut, pFramesOut, frameCount);\n            if (result != MA_SUCCESS) {\n                return result;\n            }\n        }\n\n        for (ilpf2 = 0; ilpf2 < pLPF->lpf2Count; ilpf2 += 1) {\n            result = ma_lpf2_process_pcm_frames(&pLPF->pLPF2[ilpf2], pFramesOut, pFramesOut, frameCount);\n            if (result != MA_SUCCESS) {\n                return result;\n            }\n        }\n    }\n\n    /* Slightly slower path for copying. */\n    if (pFramesOut != pFramesIn) {\n        ma_uint32 iFrame;\n\n        /*  */ if (pLPF->format == ma_format_f32) {\n            /* */ float* pFramesOutF32 = (      float*)pFramesOut;\n            const float* pFramesInF32  = (const float*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                ma_lpf_process_pcm_frame_f32(pLPF, pFramesOutF32, pFramesInF32);\n                pFramesOutF32 += pLPF->channels;\n                pFramesInF32  += pLPF->channels;\n            }\n        } else if (pLPF->format == ma_format_s16) {\n            /* */ ma_int16* pFramesOutS16 = (      ma_int16*)pFramesOut;\n            const ma_int16* pFramesInS16  = (const ma_int16*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                ma_lpf_process_pcm_frame_s16(pLPF, pFramesOutS16, pFramesInS16);\n                pFramesOutS16 += pLPF->channels;\n                pFramesInS16  += pLPF->channels;\n            }\n        } else {\n            MA_ASSERT(MA_FALSE);\n            return MA_INVALID_OPERATION;    /* Should never hit this. */\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_uint32 ma_lpf_get_latency(const ma_lpf* pLPF)\n{\n    if (pLPF == NULL) {\n        return 0;\n    }\n\n    return pLPF->lpf2Count*2 + pLPF->lpf1Count;\n}\n\n\n/**************************************************************************************************************************************************************\n\nHigh-Pass Filtering\n\n**************************************************************************************************************************************************************/\nMA_API ma_hpf1_config ma_hpf1_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency)\n{\n    ma_hpf1_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format = format;\n    config.channels = channels;\n    config.sampleRate = sampleRate;\n    config.cutoffFrequency = cutoffFrequency;\n\n    return config;\n}\n\nMA_API ma_hpf2_config ma_hpf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, double q)\n{\n    ma_hpf2_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format = format;\n    config.channels = channels;\n    config.sampleRate = sampleRate;\n    config.cutoffFrequency = cutoffFrequency;\n    config.q = q;\n\n    /* Q cannot be 0 or else it'll result in a division by 0. In this case just default to 0.707107. */\n    if (config.q == 0) {\n        config.q = 0.707107;\n    }\n\n    return config;\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t r1Offset;\n} ma_hpf1_heap_layout;\n\nstatic ma_result ma_hpf1_get_heap_layout(const ma_hpf1_config* pConfig, ma_hpf1_heap_layout* pHeapLayout)\n{\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->channels == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* R1 */\n    pHeapLayout->r1Offset = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += sizeof(ma_biquad_coefficient) * pConfig->channels;\n\n    /* Make sure allocation size is aligned. */\n    pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_hpf1_get_heap_size(const ma_hpf1_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_hpf1_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_hpf1_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_hpf1_init_preallocated(const ma_hpf1_config* pConfig, void* pHeap, ma_hpf1* pLPF)\n{\n    ma_result result;\n    ma_hpf1_heap_layout heapLayout;\n\n    if (pLPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pLPF);\n\n    result = ma_hpf1_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pLPF->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n    pLPF->pR1 = (ma_biquad_coefficient*)ma_offset_ptr(pHeap, heapLayout.r1Offset);\n\n    return ma_hpf1_reinit(pConfig, pLPF);\n}\n\nMA_API ma_result ma_hpf1_init(const ma_hpf1_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf1* pLPF)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_hpf1_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_hpf1_init_preallocated(pConfig, pHeap, pLPF);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pLPF->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_hpf1_uninit(ma_hpf1* pHPF, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pHPF == NULL) {\n        return;\n    }\n\n    if (pHPF->_ownsHeap) {\n        ma_free(pHPF->_pHeap, pAllocationCallbacks);\n    }\n}\n\nMA_API ma_result ma_hpf1_reinit(const ma_hpf1_config* pConfig, ma_hpf1* pHPF)\n{\n    double a;\n\n    if (pHPF == NULL || pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Only supporting f32 and s16. */\n    if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The format cannot be changed after initialization. */\n    if (pHPF->format != ma_format_unknown && pHPF->format != pConfig->format) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* The channel count cannot be changed after initialization. */\n    if (pHPF->channels != 0 && pHPF->channels != pConfig->channels) {\n        return MA_INVALID_OPERATION;\n    }\n\n    pHPF->format   = pConfig->format;\n    pHPF->channels = pConfig->channels;\n\n    a = ma_expd(-2 * MA_PI_D * pConfig->cutoffFrequency / pConfig->sampleRate);\n    if (pConfig->format == ma_format_f32) {\n        pHPF->a.f32 = (float)a;\n    } else {\n        pHPF->a.s32 = ma_biquad_float_to_fp(a);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic MA_INLINE void ma_hpf1_process_pcm_frame_f32(ma_hpf1* pHPF, float* pY, const float* pX)\n{\n    ma_uint32 c;\n    const ma_uint32 channels = pHPF->channels;\n    const float a = 1 - pHPF->a.f32;\n    const float b = 1 - a;\n\n    MA_ASSUME(channels > 0);\n    for (c = 0; c < channels; c += 1) {\n        float r1 = pHPF->pR1[c].f32;\n        float x  = pX[c];\n        float y;\n\n        y = b*x - a*r1;\n\n        pY[c]            = y;\n        pHPF->pR1[c].f32 = y;\n    }\n}\n\nstatic MA_INLINE void ma_hpf1_process_pcm_frame_s16(ma_hpf1* pHPF, ma_int16* pY, const ma_int16* pX)\n{\n    ma_uint32 c;\n    const ma_uint32 channels = pHPF->channels;\n    const ma_int32 a = ((1 << MA_BIQUAD_FIXED_POINT_SHIFT) - pHPF->a.s32);\n    const ma_int32 b = ((1 << MA_BIQUAD_FIXED_POINT_SHIFT) - a);\n\n    MA_ASSUME(channels > 0);\n    for (c = 0; c < channels; c += 1) {\n        ma_int32 r1 = pHPF->pR1[c].s32;\n        ma_int32 x  = pX[c];\n        ma_int32 y;\n\n        y = (b*x - a*r1) >> MA_BIQUAD_FIXED_POINT_SHIFT;\n\n        pY[c]            = (ma_int16)y;\n        pHPF->pR1[c].s32 = (ma_int32)y;\n    }\n}\n\nMA_API ma_result ma_hpf1_process_pcm_frames(ma_hpf1* pHPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    ma_uint32 n;\n\n    if (pHPF == NULL || pFramesOut == NULL || pFramesIn == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Note that the logic below needs to support in-place filtering. That is, it must support the case where pFramesOut and pFramesIn are the same. */\n\n    if (pHPF->format == ma_format_f32) {\n        /* */ float* pY = (      float*)pFramesOut;\n        const float* pX = (const float*)pFramesIn;\n\n        for (n = 0; n < frameCount; n += 1) {\n            ma_hpf1_process_pcm_frame_f32(pHPF, pY, pX);\n            pY += pHPF->channels;\n            pX += pHPF->channels;\n        }\n    } else if (pHPF->format == ma_format_s16) {\n        /* */ ma_int16* pY = (      ma_int16*)pFramesOut;\n        const ma_int16* pX = (const ma_int16*)pFramesIn;\n\n        for (n = 0; n < frameCount; n += 1) {\n            ma_hpf1_process_pcm_frame_s16(pHPF, pY, pX);\n            pY += pHPF->channels;\n            pX += pHPF->channels;\n        }\n    } else {\n        MA_ASSERT(MA_FALSE);\n        return MA_INVALID_ARGS; /* Format not supported. Should never hit this because it's checked in ma_biquad_init() and ma_biquad_reinit(). */\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_uint32 ma_hpf1_get_latency(const ma_hpf1* pHPF)\n{\n    if (pHPF == NULL) {\n        return 0;\n    }\n\n    return 1;\n}\n\n\nstatic MA_INLINE ma_biquad_config ma_hpf2__get_biquad_config(const ma_hpf2_config* pConfig)\n{\n    ma_biquad_config bqConfig;\n    double q;\n    double w;\n    double s;\n    double c;\n    double a;\n\n    MA_ASSERT(pConfig != NULL);\n\n    q = pConfig->q;\n    w = 2 * MA_PI_D * pConfig->cutoffFrequency / pConfig->sampleRate;\n    s = ma_sind(w);\n    c = ma_cosd(w);\n    a = s / (2*q);\n\n    bqConfig.b0 =  (1 + c) / 2;\n    bqConfig.b1 = -(1 + c);\n    bqConfig.b2 =  (1 + c) / 2;\n    bqConfig.a0 =   1 + a;\n    bqConfig.a1 =  -2 * c;\n    bqConfig.a2 =   1 - a;\n\n    bqConfig.format   = pConfig->format;\n    bqConfig.channels = pConfig->channels;\n\n    return bqConfig;\n}\n\nMA_API ma_result ma_hpf2_get_heap_size(const ma_hpf2_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_biquad_config bqConfig;\n    bqConfig = ma_hpf2__get_biquad_config(pConfig);\n\n    return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes);\n}\n\nMA_API ma_result ma_hpf2_init_preallocated(const ma_hpf2_config* pConfig, void* pHeap, ma_hpf2* pHPF)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pHPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pHPF);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_hpf2__get_biquad_config(pConfig);\n    result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pHPF->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_hpf2_init(const ma_hpf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf2* pHPF)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_hpf2_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_hpf2_init_preallocated(pConfig, pHeap, pHPF);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pHPF->bq._ownsHeap = MA_TRUE;    /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */\n    return MA_SUCCESS;\n}\n\nMA_API void ma_hpf2_uninit(ma_hpf2* pHPF, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pHPF == NULL) {\n        return;\n    }\n\n    ma_biquad_uninit(&pHPF->bq, pAllocationCallbacks);   /* <-- This will free the heap allocation. */\n}\n\nMA_API ma_result ma_hpf2_reinit(const ma_hpf2_config* pConfig, ma_hpf2* pHPF)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pHPF == NULL || pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_hpf2__get_biquad_config(pConfig);\n    result = ma_biquad_reinit(&bqConfig, &pHPF->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic MA_INLINE void ma_hpf2_process_pcm_frame_s16(ma_hpf2* pHPF, ma_int16* pFrameOut, const ma_int16* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_s16(&pHPF->bq, pFrameOut, pFrameIn);\n}\n\nstatic MA_INLINE void ma_hpf2_process_pcm_frame_f32(ma_hpf2* pHPF, float* pFrameOut, const float* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_f32(&pHPF->bq, pFrameOut, pFrameIn);\n}\n\nMA_API ma_result ma_hpf2_process_pcm_frames(ma_hpf2* pHPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    if (pHPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_biquad_process_pcm_frames(&pHPF->bq, pFramesOut, pFramesIn, frameCount);\n}\n\nMA_API ma_uint32 ma_hpf2_get_latency(const ma_hpf2* pHPF)\n{\n    if (pHPF == NULL) {\n        return 0;\n    }\n\n    return ma_biquad_get_latency(&pHPF->bq);\n}\n\n\nMA_API ma_hpf_config ma_hpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order)\n{\n    ma_hpf_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format          = format;\n    config.channels        = channels;\n    config.sampleRate      = sampleRate;\n    config.cutoffFrequency = cutoffFrequency;\n    config.order           = ma_min(order, MA_MAX_FILTER_ORDER);\n\n    return config;\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t hpf1Offset;\n    size_t hpf2Offset;  /* Offset of the first second order filter. Subsequent filters will come straight after, and will each have the same heap size. */\n} ma_hpf_heap_layout;\n\nstatic void ma_hpf_calculate_sub_hpf_counts(ma_uint32 order, ma_uint32* pHPF1Count, ma_uint32* pHPF2Count)\n{\n    MA_ASSERT(pHPF1Count != NULL);\n    MA_ASSERT(pHPF2Count != NULL);\n\n    *pHPF1Count = order % 2;\n    *pHPF2Count = order / 2;\n}\n\nstatic ma_result ma_hpf_get_heap_layout(const ma_hpf_config* pConfig, ma_hpf_heap_layout* pHeapLayout)\n{\n    ma_result result;\n    ma_uint32 hpf1Count;\n    ma_uint32 hpf2Count;\n    ma_uint32 ihpf1;\n    ma_uint32 ihpf2;\n\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->channels == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->order > MA_MAX_FILTER_ORDER) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_hpf_calculate_sub_hpf_counts(pConfig->order, &hpf1Count, &hpf2Count);\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* HPF 1 */\n    pHeapLayout->hpf1Offset = pHeapLayout->sizeInBytes;\n    for (ihpf1 = 0; ihpf1 < hpf1Count; ihpf1 += 1) {\n        size_t hpf1HeapSizeInBytes;\n        ma_hpf1_config hpf1Config = ma_hpf1_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency);\n\n        result = ma_hpf1_get_heap_size(&hpf1Config, &hpf1HeapSizeInBytes);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pHeapLayout->sizeInBytes += sizeof(ma_hpf1) + hpf1HeapSizeInBytes;\n    }\n\n    /* HPF 2*/\n    pHeapLayout->hpf2Offset = pHeapLayout->sizeInBytes;\n    for (ihpf2 = 0; ihpf2 < hpf2Count; ihpf2 += 1) {\n        size_t hpf2HeapSizeInBytes;\n        ma_hpf2_config hpf2Config = ma_hpf2_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency, 0.707107);   /* <-- The \"q\" parameter does not matter for the purpose of calculating the heap size. */\n\n        result = ma_hpf2_get_heap_size(&hpf2Config, &hpf2HeapSizeInBytes);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pHeapLayout->sizeInBytes += sizeof(ma_hpf2) + hpf2HeapSizeInBytes;\n    }\n\n    /* Make sure allocation size is aligned. */\n    pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_hpf_reinit__internal(const ma_hpf_config* pConfig, void* pHeap, ma_hpf* pHPF, ma_bool32 isNew)\n{\n    ma_result result;\n    ma_uint32 hpf1Count;\n    ma_uint32 hpf2Count;\n    ma_uint32 ihpf1;\n    ma_uint32 ihpf2;\n    ma_hpf_heap_layout heapLayout;  /* Only used if isNew is true. */\n\n    if (pHPF == NULL || pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Only supporting f32 and s16. */\n    if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The format cannot be changed after initialization. */\n    if (pHPF->format != ma_format_unknown && pHPF->format != pConfig->format) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* The channel count cannot be changed after initialization. */\n    if (pHPF->channels != 0 && pHPF->channels != pConfig->channels) {\n        return MA_INVALID_OPERATION;\n    }\n\n    if (pConfig->order > MA_MAX_FILTER_ORDER) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_hpf_calculate_sub_hpf_counts(pConfig->order, &hpf1Count, &hpf2Count);\n\n    /* The filter order can't change between reinits. */\n    if (!isNew) {\n        if (pHPF->hpf1Count != hpf1Count || pHPF->hpf2Count != hpf2Count) {\n            return MA_INVALID_OPERATION;\n        }\n    }\n\n    if (isNew) {\n        result = ma_hpf_get_heap_layout(pConfig, &heapLayout);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pHPF->_pHeap = pHeap;\n        MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n        pHPF->pHPF1 = (ma_hpf1*)ma_offset_ptr(pHeap, heapLayout.hpf1Offset);\n        pHPF->pHPF2 = (ma_hpf2*)ma_offset_ptr(pHeap, heapLayout.hpf2Offset);\n    } else {\n        MA_ZERO_OBJECT(&heapLayout);    /* To silence a compiler warning. */\n    }\n\n    for (ihpf1 = 0; ihpf1 < hpf1Count; ihpf1 += 1) {\n        ma_hpf1_config hpf1Config = ma_hpf1_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency);\n\n        if (isNew) {\n            size_t hpf1HeapSizeInBytes;\n\n            result = ma_hpf1_get_heap_size(&hpf1Config, &hpf1HeapSizeInBytes);\n            if (result == MA_SUCCESS) {\n                result = ma_hpf1_init_preallocated(&hpf1Config, ma_offset_ptr(pHeap, heapLayout.hpf1Offset + (sizeof(ma_hpf1) * hpf1Count) + (ihpf1 * hpf1HeapSizeInBytes)), &pHPF->pHPF1[ihpf1]);\n            }\n        } else {\n            result = ma_hpf1_reinit(&hpf1Config, &pHPF->pHPF1[ihpf1]);\n        }\n\n        if (result != MA_SUCCESS) {\n            ma_uint32 jhpf1;\n\n            for (jhpf1 = 0; jhpf1 < ihpf1; jhpf1 += 1) {\n                ma_hpf1_uninit(&pHPF->pHPF1[jhpf1], NULL);  /* No need for allocation callbacks here since we used a preallocated heap allocation. */\n            }\n\n            return result;\n        }\n    }\n\n    for (ihpf2 = 0; ihpf2 < hpf2Count; ihpf2 += 1) {\n        ma_hpf2_config hpf2Config;\n        double q;\n        double a;\n\n        /* Tempting to use 0.707107, but won't result in a Butterworth filter if the order is > 2. */\n        if (hpf1Count == 1) {\n            a = (1 + ihpf2*1) * (MA_PI_D/(pConfig->order*1));   /* Odd order. */\n        } else {\n            a = (1 + ihpf2*2) * (MA_PI_D/(pConfig->order*2));   /* Even order. */\n        }\n        q = 1 / (2*ma_cosd(a));\n\n        hpf2Config = ma_hpf2_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency, q);\n\n        if (isNew) {\n            size_t hpf2HeapSizeInBytes;\n\n            result = ma_hpf2_get_heap_size(&hpf2Config, &hpf2HeapSizeInBytes);\n            if (result == MA_SUCCESS) {\n                result = ma_hpf2_init_preallocated(&hpf2Config, ma_offset_ptr(pHeap, heapLayout.hpf2Offset + (sizeof(ma_hpf2) * hpf2Count) + (ihpf2 * hpf2HeapSizeInBytes)), &pHPF->pHPF2[ihpf2]);\n            }\n        } else {\n            result = ma_hpf2_reinit(&hpf2Config, &pHPF->pHPF2[ihpf2]);\n        }\n\n        if (result != MA_SUCCESS) {\n            ma_uint32 jhpf1;\n            ma_uint32 jhpf2;\n\n            for (jhpf1 = 0; jhpf1 < hpf1Count; jhpf1 += 1) {\n                ma_hpf1_uninit(&pHPF->pHPF1[jhpf1], NULL);  /* No need for allocation callbacks here since we used a preallocated heap allocation. */\n            }\n\n            for (jhpf2 = 0; jhpf2 < ihpf2; jhpf2 += 1) {\n                ma_hpf2_uninit(&pHPF->pHPF2[jhpf2], NULL);  /* No need for allocation callbacks here since we used a preallocated heap allocation. */\n            }\n\n            return result;\n        }\n    }\n\n    pHPF->hpf1Count  = hpf1Count;\n    pHPF->hpf2Count  = hpf2Count;\n    pHPF->format     = pConfig->format;\n    pHPF->channels   = pConfig->channels;\n    pHPF->sampleRate = pConfig->sampleRate;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_hpf_get_heap_size(const ma_hpf_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_hpf_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_hpf_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return result;\n}\n\nMA_API ma_result ma_hpf_init_preallocated(const ma_hpf_config* pConfig, void* pHeap, ma_hpf* pLPF)\n{\n    if (pLPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pLPF);\n\n    return ma_hpf_reinit__internal(pConfig, pHeap, pLPF, /*isNew*/MA_TRUE);\n}\n\nMA_API ma_result ma_hpf_init(const ma_hpf_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf* pHPF)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_hpf_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_hpf_init_preallocated(pConfig, pHeap, pHPF);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pHPF->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_hpf_uninit(ma_hpf* pHPF, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_uint32 ihpf1;\n    ma_uint32 ihpf2;\n\n    if (pHPF == NULL) {\n        return;\n    }\n\n    for (ihpf1 = 0; ihpf1 < pHPF->hpf1Count; ihpf1 += 1) {\n        ma_hpf1_uninit(&pHPF->pHPF1[ihpf1], pAllocationCallbacks);\n    }\n\n    for (ihpf2 = 0; ihpf2 < pHPF->hpf2Count; ihpf2 += 1) {\n        ma_hpf2_uninit(&pHPF->pHPF2[ihpf2], pAllocationCallbacks);\n    }\n\n    if (pHPF->_ownsHeap) {\n        ma_free(pHPF->_pHeap, pAllocationCallbacks);\n    }\n}\n\nMA_API ma_result ma_hpf_reinit(const ma_hpf_config* pConfig, ma_hpf* pHPF)\n{\n    return ma_hpf_reinit__internal(pConfig, NULL, pHPF, /*isNew*/MA_FALSE);\n}\n\nMA_API ma_result ma_hpf_process_pcm_frames(ma_hpf* pHPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    ma_result result;\n    ma_uint32 ihpf1;\n    ma_uint32 ihpf2;\n\n    if (pHPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Faster path for in-place. */\n    if (pFramesOut == pFramesIn) {\n        for (ihpf1 = 0; ihpf1 < pHPF->hpf1Count; ihpf1 += 1) {\n            result = ma_hpf1_process_pcm_frames(&pHPF->pHPF1[ihpf1], pFramesOut, pFramesOut, frameCount);\n            if (result != MA_SUCCESS) {\n                return result;\n            }\n        }\n\n        for (ihpf2 = 0; ihpf2 < pHPF->hpf2Count; ihpf2 += 1) {\n            result = ma_hpf2_process_pcm_frames(&pHPF->pHPF2[ihpf2], pFramesOut, pFramesOut, frameCount);\n            if (result != MA_SUCCESS) {\n                return result;\n            }\n        }\n    }\n\n    /* Slightly slower path for copying. */\n    if (pFramesOut != pFramesIn) {\n        ma_uint32 iFrame;\n\n        /*  */ if (pHPF->format == ma_format_f32) {\n            /* */ float* pFramesOutF32 = (      float*)pFramesOut;\n            const float* pFramesInF32  = (const float*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                MA_COPY_MEMORY(pFramesOutF32, pFramesInF32, ma_get_bytes_per_frame(pHPF->format, pHPF->channels));\n\n                for (ihpf1 = 0; ihpf1 < pHPF->hpf1Count; ihpf1 += 1) {\n                    ma_hpf1_process_pcm_frame_f32(&pHPF->pHPF1[ihpf1], pFramesOutF32, pFramesOutF32);\n                }\n\n                for (ihpf2 = 0; ihpf2 < pHPF->hpf2Count; ihpf2 += 1) {\n                    ma_hpf2_process_pcm_frame_f32(&pHPF->pHPF2[ihpf2], pFramesOutF32, pFramesOutF32);\n                }\n\n                pFramesOutF32 += pHPF->channels;\n                pFramesInF32  += pHPF->channels;\n            }\n        } else if (pHPF->format == ma_format_s16) {\n            /* */ ma_int16* pFramesOutS16 = (      ma_int16*)pFramesOut;\n            const ma_int16* pFramesInS16  = (const ma_int16*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                MA_COPY_MEMORY(pFramesOutS16, pFramesInS16, ma_get_bytes_per_frame(pHPF->format, pHPF->channels));\n\n                for (ihpf1 = 0; ihpf1 < pHPF->hpf1Count; ihpf1 += 1) {\n                    ma_hpf1_process_pcm_frame_s16(&pHPF->pHPF1[ihpf1], pFramesOutS16, pFramesOutS16);\n                }\n\n                for (ihpf2 = 0; ihpf2 < pHPF->hpf2Count; ihpf2 += 1) {\n                    ma_hpf2_process_pcm_frame_s16(&pHPF->pHPF2[ihpf2], pFramesOutS16, pFramesOutS16);\n                }\n\n                pFramesOutS16 += pHPF->channels;\n                pFramesInS16  += pHPF->channels;\n            }\n        } else {\n            MA_ASSERT(MA_FALSE);\n            return MA_INVALID_OPERATION;    /* Should never hit this. */\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_uint32 ma_hpf_get_latency(const ma_hpf* pHPF)\n{\n    if (pHPF == NULL) {\n        return 0;\n    }\n\n    return pHPF->hpf2Count*2 + pHPF->hpf1Count;\n}\n\n\n/**************************************************************************************************************************************************************\n\nBand-Pass Filtering\n\n**************************************************************************************************************************************************************/\nMA_API ma_bpf2_config ma_bpf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, double q)\n{\n    ma_bpf2_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format = format;\n    config.channels = channels;\n    config.sampleRate = sampleRate;\n    config.cutoffFrequency = cutoffFrequency;\n    config.q = q;\n\n    /* Q cannot be 0 or else it'll result in a division by 0. In this case just default to 0.707107. */\n    if (config.q == 0) {\n        config.q = 0.707107;\n    }\n\n    return config;\n}\n\n\nstatic MA_INLINE ma_biquad_config ma_bpf2__get_biquad_config(const ma_bpf2_config* pConfig)\n{\n    ma_biquad_config bqConfig;\n    double q;\n    double w;\n    double s;\n    double c;\n    double a;\n\n    MA_ASSERT(pConfig != NULL);\n\n    q = pConfig->q;\n    w = 2 * MA_PI_D * pConfig->cutoffFrequency / pConfig->sampleRate;\n    s = ma_sind(w);\n    c = ma_cosd(w);\n    a = s / (2*q);\n\n    bqConfig.b0 =  q * a;\n    bqConfig.b1 =  0;\n    bqConfig.b2 = -q * a;\n    bqConfig.a0 =  1 + a;\n    bqConfig.a1 = -2 * c;\n    bqConfig.a2 =  1 - a;\n\n    bqConfig.format   = pConfig->format;\n    bqConfig.channels = pConfig->channels;\n\n    return bqConfig;\n}\n\nMA_API ma_result ma_bpf2_get_heap_size(const ma_bpf2_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_biquad_config bqConfig;\n    bqConfig = ma_bpf2__get_biquad_config(pConfig);\n\n    return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes);\n}\n\nMA_API ma_result ma_bpf2_init_preallocated(const ma_bpf2_config* pConfig, void* pHeap, ma_bpf2* pBPF)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pBPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pBPF);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_bpf2__get_biquad_config(pConfig);\n    result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pBPF->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_bpf2_init(const ma_bpf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_bpf2* pBPF)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_bpf2_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_bpf2_init_preallocated(pConfig, pHeap, pBPF);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pBPF->bq._ownsHeap = MA_TRUE;    /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */\n    return MA_SUCCESS;\n}\n\nMA_API void ma_bpf2_uninit(ma_bpf2* pBPF, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pBPF == NULL) {\n        return;\n    }\n\n    ma_biquad_uninit(&pBPF->bq, pAllocationCallbacks);   /* <-- This will free the heap allocation. */\n}\n\nMA_API ma_result ma_bpf2_reinit(const ma_bpf2_config* pConfig, ma_bpf2* pBPF)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pBPF == NULL || pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_bpf2__get_biquad_config(pConfig);\n    result = ma_biquad_reinit(&bqConfig, &pBPF->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic MA_INLINE void ma_bpf2_process_pcm_frame_s16(ma_bpf2* pBPF, ma_int16* pFrameOut, const ma_int16* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_s16(&pBPF->bq, pFrameOut, pFrameIn);\n}\n\nstatic MA_INLINE void ma_bpf2_process_pcm_frame_f32(ma_bpf2* pBPF, float* pFrameOut, const float* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_f32(&pBPF->bq, pFrameOut, pFrameIn);\n}\n\nMA_API ma_result ma_bpf2_process_pcm_frames(ma_bpf2* pBPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    if (pBPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_biquad_process_pcm_frames(&pBPF->bq, pFramesOut, pFramesIn, frameCount);\n}\n\nMA_API ma_uint32 ma_bpf2_get_latency(const ma_bpf2* pBPF)\n{\n    if (pBPF == NULL) {\n        return 0;\n    }\n\n    return ma_biquad_get_latency(&pBPF->bq);\n}\n\n\nMA_API ma_bpf_config ma_bpf_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order)\n{\n    ma_bpf_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format          = format;\n    config.channels        = channels;\n    config.sampleRate      = sampleRate;\n    config.cutoffFrequency = cutoffFrequency;\n    config.order           = ma_min(order, MA_MAX_FILTER_ORDER);\n\n    return config;\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t bpf2Offset;\n} ma_bpf_heap_layout;\n\nstatic ma_result ma_bpf_get_heap_layout(const ma_bpf_config* pConfig, ma_bpf_heap_layout* pHeapLayout)\n{\n    ma_result result;\n    ma_uint32 bpf2Count;\n    ma_uint32 ibpf2;\n\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->order > MA_MAX_FILTER_ORDER) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* We must have an even number of order. */\n    if ((pConfig->order & 0x1) != 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    bpf2Count = pConfig->channels / 2;\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* BPF 2 */\n    pHeapLayout->bpf2Offset = pHeapLayout->sizeInBytes;\n    for (ibpf2 = 0; ibpf2 < bpf2Count; ibpf2 += 1) {\n        size_t bpf2HeapSizeInBytes;\n        ma_bpf2_config bpf2Config = ma_bpf2_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency, 0.707107);   /* <-- The \"q\" parameter does not matter for the purpose of calculating the heap size. */\n\n        result = ma_bpf2_get_heap_size(&bpf2Config, &bpf2HeapSizeInBytes);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pHeapLayout->sizeInBytes += sizeof(ma_bpf2) + bpf2HeapSizeInBytes;\n    }\n\n    /* Make sure allocation size is aligned. */\n    pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_bpf_reinit__internal(const ma_bpf_config* pConfig, void* pHeap, ma_bpf* pBPF, ma_bool32 isNew)\n{\n    ma_result result;\n    ma_uint32 bpf2Count;\n    ma_uint32 ibpf2;\n    ma_bpf_heap_layout heapLayout;  /* Only used if isNew is true. */\n\n    if (pBPF == NULL || pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Only supporting f32 and s16. */\n    if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The format cannot be changed after initialization. */\n    if (pBPF->format != ma_format_unknown && pBPF->format != pConfig->format) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* The channel count cannot be changed after initialization. */\n    if (pBPF->channels != 0 && pBPF->channels != pConfig->channels) {\n        return MA_INVALID_OPERATION;\n    }\n\n    if (pConfig->order > MA_MAX_FILTER_ORDER) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* We must have an even number of order. */\n    if ((pConfig->order & 0x1) != 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    bpf2Count = pConfig->order / 2;\n\n    /* The filter order can't change between reinits. */\n    if (!isNew) {\n        if (pBPF->bpf2Count != bpf2Count) {\n            return MA_INVALID_OPERATION;\n        }\n    }\n\n    if (isNew) {\n        result = ma_bpf_get_heap_layout(pConfig, &heapLayout);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pBPF->_pHeap = pHeap;\n        MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n        pBPF->pBPF2 = (ma_bpf2*)ma_offset_ptr(pHeap, heapLayout.bpf2Offset);\n    } else {\n        MA_ZERO_OBJECT(&heapLayout);\n    }\n\n    for (ibpf2 = 0; ibpf2 < bpf2Count; ibpf2 += 1) {\n        ma_bpf2_config bpf2Config;\n        double q;\n\n        /* TODO: Calculate Q to make this a proper Butterworth filter. */\n        q = 0.707107;\n\n        bpf2Config = ma_bpf2_config_init(pConfig->format, pConfig->channels, pConfig->sampleRate, pConfig->cutoffFrequency, q);\n\n        if (isNew) {\n            size_t bpf2HeapSizeInBytes;\n\n            result = ma_bpf2_get_heap_size(&bpf2Config, &bpf2HeapSizeInBytes);\n            if (result == MA_SUCCESS) {\n                result = ma_bpf2_init_preallocated(&bpf2Config, ma_offset_ptr(pHeap, heapLayout.bpf2Offset + (sizeof(ma_bpf2) * bpf2Count) + (ibpf2 * bpf2HeapSizeInBytes)), &pBPF->pBPF2[ibpf2]);\n            }\n        } else {\n            result = ma_bpf2_reinit(&bpf2Config, &pBPF->pBPF2[ibpf2]);\n        }\n\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    pBPF->bpf2Count = bpf2Count;\n    pBPF->format    = pConfig->format;\n    pBPF->channels  = pConfig->channels;\n\n    return MA_SUCCESS;\n}\n\n\nMA_API ma_result ma_bpf_get_heap_size(const ma_bpf_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_bpf_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_bpf_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_bpf_init_preallocated(const ma_bpf_config* pConfig, void* pHeap, ma_bpf* pBPF)\n{\n    if (pBPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pBPF);\n\n    return ma_bpf_reinit__internal(pConfig, pHeap, pBPF, /*isNew*/MA_TRUE);\n}\n\nMA_API ma_result ma_bpf_init(const ma_bpf_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_bpf* pBPF)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_bpf_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_bpf_init_preallocated(pConfig, pHeap, pBPF);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pBPF->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_bpf_uninit(ma_bpf* pBPF, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_uint32 ibpf2;\n\n    if (pBPF == NULL) {\n        return;\n    }\n\n    for (ibpf2 = 0; ibpf2 < pBPF->bpf2Count; ibpf2 += 1) {\n        ma_bpf2_uninit(&pBPF->pBPF2[ibpf2], pAllocationCallbacks);\n    }\n\n    if (pBPF->_ownsHeap) {\n        ma_free(pBPF->_pHeap, pAllocationCallbacks);\n    }\n}\n\nMA_API ma_result ma_bpf_reinit(const ma_bpf_config* pConfig, ma_bpf* pBPF)\n{\n    return ma_bpf_reinit__internal(pConfig, NULL, pBPF, /*isNew*/MA_FALSE);\n}\n\nMA_API ma_result ma_bpf_process_pcm_frames(ma_bpf* pBPF, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    ma_result result;\n    ma_uint32 ibpf2;\n\n    if (pBPF == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Faster path for in-place. */\n    if (pFramesOut == pFramesIn) {\n        for (ibpf2 = 0; ibpf2 < pBPF->bpf2Count; ibpf2 += 1) {\n            result = ma_bpf2_process_pcm_frames(&pBPF->pBPF2[ibpf2], pFramesOut, pFramesOut, frameCount);\n            if (result != MA_SUCCESS) {\n                return result;\n            }\n        }\n    }\n\n    /* Slightly slower path for copying. */\n    if (pFramesOut != pFramesIn) {\n        ma_uint32 iFrame;\n\n        /*  */ if (pBPF->format == ma_format_f32) {\n            /* */ float* pFramesOutF32 = (      float*)pFramesOut;\n            const float* pFramesInF32  = (const float*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                MA_COPY_MEMORY(pFramesOutF32, pFramesInF32, ma_get_bytes_per_frame(pBPF->format, pBPF->channels));\n\n                for (ibpf2 = 0; ibpf2 < pBPF->bpf2Count; ibpf2 += 1) {\n                    ma_bpf2_process_pcm_frame_f32(&pBPF->pBPF2[ibpf2], pFramesOutF32, pFramesOutF32);\n                }\n\n                pFramesOutF32 += pBPF->channels;\n                pFramesInF32  += pBPF->channels;\n            }\n        } else if (pBPF->format == ma_format_s16) {\n            /* */ ma_int16* pFramesOutS16 = (      ma_int16*)pFramesOut;\n            const ma_int16* pFramesInS16  = (const ma_int16*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                MA_COPY_MEMORY(pFramesOutS16, pFramesInS16, ma_get_bytes_per_frame(pBPF->format, pBPF->channels));\n\n                for (ibpf2 = 0; ibpf2 < pBPF->bpf2Count; ibpf2 += 1) {\n                    ma_bpf2_process_pcm_frame_s16(&pBPF->pBPF2[ibpf2], pFramesOutS16, pFramesOutS16);\n                }\n\n                pFramesOutS16 += pBPF->channels;\n                pFramesInS16  += pBPF->channels;\n            }\n        } else {\n            MA_ASSERT(MA_FALSE);\n            return MA_INVALID_OPERATION;    /* Should never hit this. */\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_uint32 ma_bpf_get_latency(const ma_bpf* pBPF)\n{\n    if (pBPF == NULL) {\n        return 0;\n    }\n\n    return pBPF->bpf2Count*2;\n}\n\n\n/**************************************************************************************************************************************************************\n\nNotching Filter\n\n**************************************************************************************************************************************************************/\nMA_API ma_notch2_config ma_notch2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double q, double frequency)\n{\n    ma_notch2_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format     = format;\n    config.channels   = channels;\n    config.sampleRate = sampleRate;\n    config.q          = q;\n    config.frequency  = frequency;\n\n    if (config.q == 0) {\n        config.q = 0.707107;\n    }\n\n    return config;\n}\n\n\nstatic MA_INLINE ma_biquad_config ma_notch2__get_biquad_config(const ma_notch2_config* pConfig)\n{\n    ma_biquad_config bqConfig;\n    double q;\n    double w;\n    double s;\n    double c;\n    double a;\n\n    MA_ASSERT(pConfig != NULL);\n\n    q = pConfig->q;\n    w = 2 * MA_PI_D * pConfig->frequency / pConfig->sampleRate;\n    s = ma_sind(w);\n    c = ma_cosd(w);\n    a = s / (2*q);\n\n    bqConfig.b0 =  1;\n    bqConfig.b1 = -2 * c;\n    bqConfig.b2 =  1;\n    bqConfig.a0 =  1 + a;\n    bqConfig.a1 = -2 * c;\n    bqConfig.a2 =  1 - a;\n\n    bqConfig.format   = pConfig->format;\n    bqConfig.channels = pConfig->channels;\n\n    return bqConfig;\n}\n\nMA_API ma_result ma_notch2_get_heap_size(const ma_notch2_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_biquad_config bqConfig;\n    bqConfig = ma_notch2__get_biquad_config(pConfig);\n\n    return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes);\n}\n\nMA_API ma_result ma_notch2_init_preallocated(const ma_notch2_config* pConfig, void* pHeap, ma_notch2* pFilter)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pFilter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pFilter);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_notch2__get_biquad_config(pConfig);\n    result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pFilter->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_notch2_init(const ma_notch2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_notch2* pFilter)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_notch2_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_notch2_init_preallocated(pConfig, pHeap, pFilter);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pFilter->bq._ownsHeap = MA_TRUE;    /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */\n    return MA_SUCCESS;\n}\n\nMA_API void ma_notch2_uninit(ma_notch2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pFilter == NULL) {\n        return;\n    }\n\n    ma_biquad_uninit(&pFilter->bq, pAllocationCallbacks);   /* <-- This will free the heap allocation. */\n}\n\nMA_API ma_result ma_notch2_reinit(const ma_notch2_config* pConfig, ma_notch2* pFilter)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pFilter == NULL || pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_notch2__get_biquad_config(pConfig);\n    result = ma_biquad_reinit(&bqConfig, &pFilter->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic MA_INLINE void ma_notch2_process_pcm_frame_s16(ma_notch2* pFilter, ma_int16* pFrameOut, const ma_int16* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_s16(&pFilter->bq, pFrameOut, pFrameIn);\n}\n\nstatic MA_INLINE void ma_notch2_process_pcm_frame_f32(ma_notch2* pFilter, float* pFrameOut, const float* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_f32(&pFilter->bq, pFrameOut, pFrameIn);\n}\n\nMA_API ma_result ma_notch2_process_pcm_frames(ma_notch2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    if (pFilter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_biquad_process_pcm_frames(&pFilter->bq, pFramesOut, pFramesIn, frameCount);\n}\n\nMA_API ma_uint32 ma_notch2_get_latency(const ma_notch2* pFilter)\n{\n    if (pFilter == NULL) {\n        return 0;\n    }\n\n    return ma_biquad_get_latency(&pFilter->bq);\n}\n\n\n\n/**************************************************************************************************************************************************************\n\nPeaking EQ Filter\n\n**************************************************************************************************************************************************************/\nMA_API ma_peak2_config ma_peak2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency)\n{\n    ma_peak2_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format     = format;\n    config.channels   = channels;\n    config.sampleRate = sampleRate;\n    config.gainDB     = gainDB;\n    config.q          = q;\n    config.frequency  = frequency;\n\n    if (config.q == 0) {\n        config.q = 0.707107;\n    }\n\n    return config;\n}\n\n\nstatic MA_INLINE ma_biquad_config ma_peak2__get_biquad_config(const ma_peak2_config* pConfig)\n{\n    ma_biquad_config bqConfig;\n    double q;\n    double w;\n    double s;\n    double c;\n    double a;\n    double A;\n\n    MA_ASSERT(pConfig != NULL);\n\n    q = pConfig->q;\n    w = 2 * MA_PI_D * pConfig->frequency / pConfig->sampleRate;\n    s = ma_sind(w);\n    c = ma_cosd(w);\n    a = s / (2*q);\n    A = ma_powd(10, (pConfig->gainDB / 40));\n\n    bqConfig.b0 =  1 + (a * A);\n    bqConfig.b1 = -2 * c;\n    bqConfig.b2 =  1 - (a * A);\n    bqConfig.a0 =  1 + (a / A);\n    bqConfig.a1 = -2 * c;\n    bqConfig.a2 =  1 - (a / A);\n\n    bqConfig.format   = pConfig->format;\n    bqConfig.channels = pConfig->channels;\n\n    return bqConfig;\n}\n\nMA_API ma_result ma_peak2_get_heap_size(const ma_peak2_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_biquad_config bqConfig;\n    bqConfig = ma_peak2__get_biquad_config(pConfig);\n\n    return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes);\n}\n\nMA_API ma_result ma_peak2_init_preallocated(const ma_peak2_config* pConfig, void* pHeap, ma_peak2* pFilter)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pFilter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pFilter);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_peak2__get_biquad_config(pConfig);\n    result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pFilter->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_peak2_init(const ma_peak2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_peak2* pFilter)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_peak2_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_peak2_init_preallocated(pConfig, pHeap, pFilter);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pFilter->bq._ownsHeap = MA_TRUE;    /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */\n    return MA_SUCCESS;\n}\n\nMA_API void ma_peak2_uninit(ma_peak2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pFilter == NULL) {\n        return;\n    }\n\n    ma_biquad_uninit(&pFilter->bq, pAllocationCallbacks);   /* <-- This will free the heap allocation. */\n}\n\nMA_API ma_result ma_peak2_reinit(const ma_peak2_config* pConfig, ma_peak2* pFilter)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pFilter == NULL || pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_peak2__get_biquad_config(pConfig);\n    result = ma_biquad_reinit(&bqConfig, &pFilter->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic MA_INLINE void ma_peak2_process_pcm_frame_s16(ma_peak2* pFilter, ma_int16* pFrameOut, const ma_int16* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_s16(&pFilter->bq, pFrameOut, pFrameIn);\n}\n\nstatic MA_INLINE void ma_peak2_process_pcm_frame_f32(ma_peak2* pFilter, float* pFrameOut, const float* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_f32(&pFilter->bq, pFrameOut, pFrameIn);\n}\n\nMA_API ma_result ma_peak2_process_pcm_frames(ma_peak2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    if (pFilter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_biquad_process_pcm_frames(&pFilter->bq, pFramesOut, pFramesIn, frameCount);\n}\n\nMA_API ma_uint32 ma_peak2_get_latency(const ma_peak2* pFilter)\n{\n    if (pFilter == NULL) {\n        return 0;\n    }\n\n    return ma_biquad_get_latency(&pFilter->bq);\n}\n\n\n/**************************************************************************************************************************************************************\n\nLow Shelf Filter\n\n**************************************************************************************************************************************************************/\nMA_API ma_loshelf2_config ma_loshelf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double shelfSlope, double frequency)\n{\n    ma_loshelf2_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format     = format;\n    config.channels   = channels;\n    config.sampleRate = sampleRate;\n    config.gainDB     = gainDB;\n    config.shelfSlope = shelfSlope;\n    config.frequency  = frequency;\n\n    return config;\n}\n\n\nstatic MA_INLINE ma_biquad_config ma_loshelf2__get_biquad_config(const ma_loshelf2_config* pConfig)\n{\n    ma_biquad_config bqConfig;\n    double w;\n    double s;\n    double c;\n    double A;\n    double S;\n    double a;\n    double sqrtA;\n\n    MA_ASSERT(pConfig != NULL);\n\n    w = 2 * MA_PI_D * pConfig->frequency / pConfig->sampleRate;\n    s = ma_sind(w);\n    c = ma_cosd(w);\n    A = ma_powd(10, (pConfig->gainDB / 40));\n    S = pConfig->shelfSlope;\n    a = s/2 * ma_sqrtd((A + 1/A) * (1/S - 1) + 2);\n    sqrtA = 2*ma_sqrtd(A)*a;\n\n    bqConfig.b0 =  A * ((A + 1) - (A - 1)*c + sqrtA);\n    bqConfig.b1 =  2 * A * ((A - 1) - (A + 1)*c);\n    bqConfig.b2 =  A * ((A + 1) - (A - 1)*c - sqrtA);\n    bqConfig.a0 =  (A + 1) + (A - 1)*c + sqrtA;\n    bqConfig.a1 = -2 * ((A - 1) + (A + 1)*c);\n    bqConfig.a2 =  (A + 1) + (A - 1)*c - sqrtA;\n\n    bqConfig.format   = pConfig->format;\n    bqConfig.channels = pConfig->channels;\n\n    return bqConfig;\n}\n\nMA_API ma_result ma_loshelf2_get_heap_size(const ma_loshelf2_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_biquad_config bqConfig;\n    bqConfig = ma_loshelf2__get_biquad_config(pConfig);\n\n    return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes);\n}\n\nMA_API ma_result ma_loshelf2_init_preallocated(const ma_loshelf2_config* pConfig, void* pHeap, ma_loshelf2* pFilter)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pFilter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pFilter);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_loshelf2__get_biquad_config(pConfig);\n    result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pFilter->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_loshelf2_init(const ma_loshelf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_loshelf2* pFilter)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_loshelf2_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_loshelf2_init_preallocated(pConfig, pHeap, pFilter);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pFilter->bq._ownsHeap = MA_TRUE;    /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */\n    return MA_SUCCESS;\n}\n\nMA_API void ma_loshelf2_uninit(ma_loshelf2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pFilter == NULL) {\n        return;\n    }\n\n    ma_biquad_uninit(&pFilter->bq, pAllocationCallbacks);   /* <-- This will free the heap allocation. */\n}\n\nMA_API ma_result ma_loshelf2_reinit(const ma_loshelf2_config* pConfig, ma_loshelf2* pFilter)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pFilter == NULL || pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_loshelf2__get_biquad_config(pConfig);\n    result = ma_biquad_reinit(&bqConfig, &pFilter->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic MA_INLINE void ma_loshelf2_process_pcm_frame_s16(ma_loshelf2* pFilter, ma_int16* pFrameOut, const ma_int16* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_s16(&pFilter->bq, pFrameOut, pFrameIn);\n}\n\nstatic MA_INLINE void ma_loshelf2_process_pcm_frame_f32(ma_loshelf2* pFilter, float* pFrameOut, const float* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_f32(&pFilter->bq, pFrameOut, pFrameIn);\n}\n\nMA_API ma_result ma_loshelf2_process_pcm_frames(ma_loshelf2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    if (pFilter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_biquad_process_pcm_frames(&pFilter->bq, pFramesOut, pFramesIn, frameCount);\n}\n\nMA_API ma_uint32 ma_loshelf2_get_latency(const ma_loshelf2* pFilter)\n{\n    if (pFilter == NULL) {\n        return 0;\n    }\n\n    return ma_biquad_get_latency(&pFilter->bq);\n}\n\n\n/**************************************************************************************************************************************************************\n\nHigh Shelf Filter\n\n**************************************************************************************************************************************************************/\nMA_API ma_hishelf2_config ma_hishelf2_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double shelfSlope, double frequency)\n{\n    ma_hishelf2_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format     = format;\n    config.channels   = channels;\n    config.sampleRate = sampleRate;\n    config.gainDB     = gainDB;\n    config.shelfSlope = shelfSlope;\n    config.frequency  = frequency;\n\n    return config;\n}\n\n\nstatic MA_INLINE ma_biquad_config ma_hishelf2__get_biquad_config(const ma_hishelf2_config* pConfig)\n{\n    ma_biquad_config bqConfig;\n    double w;\n    double s;\n    double c;\n    double A;\n    double S;\n    double a;\n    double sqrtA;\n\n    MA_ASSERT(pConfig != NULL);\n\n    w = 2 * MA_PI_D * pConfig->frequency / pConfig->sampleRate;\n    s = ma_sind(w);\n    c = ma_cosd(w);\n    A = ma_powd(10, (pConfig->gainDB / 40));\n    S = pConfig->shelfSlope;\n    a = s/2 * ma_sqrtd((A + 1/A) * (1/S - 1) + 2);\n    sqrtA = 2*ma_sqrtd(A)*a;\n\n    bqConfig.b0 =  A * ((A + 1) + (A - 1)*c + sqrtA);\n    bqConfig.b1 = -2 * A * ((A - 1) + (A + 1)*c);\n    bqConfig.b2 =  A * ((A + 1) + (A - 1)*c - sqrtA);\n    bqConfig.a0 =  (A + 1) - (A - 1)*c + sqrtA;\n    bqConfig.a1 =  2 * ((A - 1) - (A + 1)*c);\n    bqConfig.a2 =  (A + 1) - (A - 1)*c - sqrtA;\n\n    bqConfig.format   = pConfig->format;\n    bqConfig.channels = pConfig->channels;\n\n    return bqConfig;\n}\n\nMA_API ma_result ma_hishelf2_get_heap_size(const ma_hishelf2_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_biquad_config bqConfig;\n    bqConfig = ma_hishelf2__get_biquad_config(pConfig);\n\n    return ma_biquad_get_heap_size(&bqConfig, pHeapSizeInBytes);\n}\n\nMA_API ma_result ma_hishelf2_init_preallocated(const ma_hishelf2_config* pConfig, void* pHeap, ma_hishelf2* pFilter)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pFilter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pFilter);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_hishelf2__get_biquad_config(pConfig);\n    result = ma_biquad_init_preallocated(&bqConfig, pHeap, &pFilter->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_hishelf2_init(const ma_hishelf2_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hishelf2* pFilter)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_hishelf2_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_hishelf2_init_preallocated(pConfig, pHeap, pFilter);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pFilter->bq._ownsHeap = MA_TRUE;    /* <-- This will cause the biquad to take ownership of the heap and free it when it's uninitialized. */\n    return MA_SUCCESS;\n}\n\nMA_API void ma_hishelf2_uninit(ma_hishelf2* pFilter, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pFilter == NULL) {\n        return;\n    }\n\n    ma_biquad_uninit(&pFilter->bq, pAllocationCallbacks);   /* <-- This will free the heap allocation. */\n}\n\nMA_API ma_result ma_hishelf2_reinit(const ma_hishelf2_config* pConfig, ma_hishelf2* pFilter)\n{\n    ma_result result;\n    ma_biquad_config bqConfig;\n\n    if (pFilter == NULL || pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    bqConfig = ma_hishelf2__get_biquad_config(pConfig);\n    result = ma_biquad_reinit(&bqConfig, &pFilter->bq);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic MA_INLINE void ma_hishelf2_process_pcm_frame_s16(ma_hishelf2* pFilter, ma_int16* pFrameOut, const ma_int16* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_s16(&pFilter->bq, pFrameOut, pFrameIn);\n}\n\nstatic MA_INLINE void ma_hishelf2_process_pcm_frame_f32(ma_hishelf2* pFilter, float* pFrameOut, const float* pFrameIn)\n{\n    ma_biquad_process_pcm_frame_f32(&pFilter->bq, pFrameOut, pFrameIn);\n}\n\nMA_API ma_result ma_hishelf2_process_pcm_frames(ma_hishelf2* pFilter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    if (pFilter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_biquad_process_pcm_frames(&pFilter->bq, pFramesOut, pFramesIn, frameCount);\n}\n\nMA_API ma_uint32 ma_hishelf2_get_latency(const ma_hishelf2* pFilter)\n{\n    if (pFilter == NULL) {\n        return 0;\n    }\n\n    return ma_biquad_get_latency(&pFilter->bq);\n}\n\n\n\n/*\nDelay\n*/\nMA_API ma_delay_config ma_delay_config_init(ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 delayInFrames, float decay)\n{\n    ma_delay_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.channels      = channels;\n    config.sampleRate    = sampleRate;\n    config.delayInFrames = delayInFrames;\n    config.delayStart    = (decay == 0) ? MA_TRUE : MA_FALSE;   /* Delay the start if it looks like we're not configuring an echo. */\n    config.wet           = 1;\n    config.dry           = 1;\n    config.decay         = decay;\n\n    return config;\n}\n\n\nMA_API ma_result ma_delay_init(const ma_delay_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_delay* pDelay)\n{\n    if (pDelay == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pDelay);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->decay < 0 || pConfig->decay > 1) {\n        return MA_INVALID_ARGS;\n    }\n\n    pDelay->config             = *pConfig;\n    pDelay->bufferSizeInFrames = pConfig->delayInFrames;\n    pDelay->cursor             = 0;\n\n    pDelay->pBuffer = (float*)ma_malloc((size_t)(pDelay->bufferSizeInFrames * ma_get_bytes_per_frame(ma_format_f32, pConfig->channels)), pAllocationCallbacks);\n    if (pDelay->pBuffer == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    ma_silence_pcm_frames(pDelay->pBuffer, pDelay->bufferSizeInFrames, ma_format_f32, pConfig->channels);\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_delay_uninit(ma_delay* pDelay, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pDelay == NULL) {\n        return;\n    }\n\n    ma_free(pDelay->pBuffer, pAllocationCallbacks);\n}\n\nMA_API ma_result ma_delay_process_pcm_frames(ma_delay* pDelay, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount)\n{\n    ma_uint32 iFrame;\n    ma_uint32 iChannel;\n    float* pFramesOutF32 = (float*)pFramesOut;\n    const float* pFramesInF32 = (const float*)pFramesIn;\n\n    if (pDelay == NULL || pFramesOut == NULL || pFramesIn == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        for (iChannel = 0; iChannel < pDelay->config.channels; iChannel += 1) {\n            ma_uint32 iBuffer = (pDelay->cursor * pDelay->config.channels) + iChannel;\n\n            if (pDelay->config.delayStart) {\n                /* Delayed start. */\n\n                /* Read */\n                pFramesOutF32[iChannel] = pDelay->pBuffer[iBuffer] * pDelay->config.wet;\n\n                /* Feedback */\n                pDelay->pBuffer[iBuffer] = (pDelay->pBuffer[iBuffer] * pDelay->config.decay) + (pFramesInF32[iChannel] * pDelay->config.dry);\n            } else {\n                /* Immediate start */\n\n                /* Feedback */\n                pDelay->pBuffer[iBuffer] = (pDelay->pBuffer[iBuffer] * pDelay->config.decay) + (pFramesInF32[iChannel] * pDelay->config.dry);\n\n                /* Read */\n                pFramesOutF32[iChannel] = pDelay->pBuffer[iBuffer] * pDelay->config.wet;\n            }\n        }\n\n        pDelay->cursor = (pDelay->cursor + 1) % pDelay->bufferSizeInFrames;\n\n        pFramesOutF32 += pDelay->config.channels;\n        pFramesInF32  += pDelay->config.channels;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_delay_set_wet(ma_delay* pDelay, float value)\n{\n    if (pDelay == NULL) {\n        return;\n    }\n\n    pDelay->config.wet = value;\n}\n\nMA_API float ma_delay_get_wet(const ma_delay* pDelay)\n{\n    if (pDelay == NULL) {\n        return 0;\n    }\n\n    return pDelay->config.wet;\n}\n\nMA_API void ma_delay_set_dry(ma_delay* pDelay, float value)\n{\n    if (pDelay == NULL) {\n        return;\n    }\n\n    pDelay->config.dry = value;\n}\n\nMA_API float ma_delay_get_dry(const ma_delay* pDelay)\n{\n    if (pDelay == NULL) {\n        return 0;\n    }\n\n    return pDelay->config.dry;\n}\n\nMA_API void ma_delay_set_decay(ma_delay* pDelay, float value)\n{\n    if (pDelay == NULL) {\n        return;\n    }\n\n    pDelay->config.decay = value;\n}\n\nMA_API float ma_delay_get_decay(const ma_delay* pDelay)\n{\n    if (pDelay == NULL) {\n        return 0;\n    }\n\n    return pDelay->config.decay;\n}\n\n\nMA_API ma_gainer_config ma_gainer_config_init(ma_uint32 channels, ma_uint32 smoothTimeInFrames)\n{\n    ma_gainer_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.channels           = channels;\n    config.smoothTimeInFrames = smoothTimeInFrames;\n\n    return config;\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t oldGainsOffset;\n    size_t newGainsOffset;\n} ma_gainer_heap_layout;\n\nstatic ma_result ma_gainer_get_heap_layout(const ma_gainer_config* pConfig, ma_gainer_heap_layout* pHeapLayout)\n{\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->channels == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* Old gains. */\n    pHeapLayout->oldGainsOffset = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += sizeof(float) * pConfig->channels;\n\n    /* New gains. */\n    pHeapLayout->newGainsOffset = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += sizeof(float) * pConfig->channels;\n\n    /* Alignment. */\n    pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes);\n\n    return MA_SUCCESS;\n}\n\n\nMA_API ma_result ma_gainer_get_heap_size(const ma_gainer_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_gainer_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_gainer_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\n\nMA_API ma_result ma_gainer_init_preallocated(const ma_gainer_config* pConfig, void* pHeap, ma_gainer* pGainer)\n{\n    ma_result result;\n    ma_gainer_heap_layout heapLayout;\n    ma_uint32 iChannel;\n\n    if (pGainer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pGainer);\n\n    if (pConfig == NULL || pHeap == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_gainer_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pGainer->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n    pGainer->pOldGains = (float*)ma_offset_ptr(pHeap, heapLayout.oldGainsOffset);\n    pGainer->pNewGains = (float*)ma_offset_ptr(pHeap, heapLayout.newGainsOffset);\n    pGainer->masterVolume = 1;\n\n    pGainer->config = *pConfig;\n    pGainer->t      = (ma_uint32)-1;  /* No interpolation by default. */\n\n    for (iChannel = 0; iChannel < pConfig->channels; iChannel += 1) {\n        pGainer->pOldGains[iChannel] = 1;\n        pGainer->pNewGains[iChannel] = 1;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_gainer_init(const ma_gainer_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_gainer* pGainer)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_gainer_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to retrieve the size of the heap allocation. */\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_gainer_init_preallocated(pConfig, pHeap, pGainer);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pGainer->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_gainer_uninit(ma_gainer* pGainer, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pGainer == NULL) {\n        return;\n    }\n\n    if (pGainer->_ownsHeap) {\n        ma_free(pGainer->_pHeap, pAllocationCallbacks);\n    }\n}\n\nstatic float ma_gainer_calculate_current_gain(const ma_gainer* pGainer, ma_uint32 channel)\n{\n    float a = (float)pGainer->t / pGainer->config.smoothTimeInFrames;\n    return ma_mix_f32_fast(pGainer->pOldGains[channel], pGainer->pNewGains[channel], a);\n}\n\nstatic /*__attribute__((noinline))*/ ma_result ma_gainer_process_pcm_frames_internal(ma_gainer * pGainer, void* MA_RESTRICT pFramesOut, const void* MA_RESTRICT pFramesIn, ma_uint64 frameCount)\n{\n    ma_uint64 iFrame;\n    ma_uint32 iChannel;\n    ma_uint64 interpolatedFrameCount;\n\n    MA_ASSERT(pGainer != NULL);\n\n    /*\n    We don't necessarily need to apply a linear interpolation for the entire frameCount frames. When\n    linear interpolation is not needed we can do a simple volume adjustment which will be more\n    efficient than a lerp with an alpha value of 1.\n\n    To do this, all we need to do is determine how many frames need to have a lerp applied. Then we\n    just process that number of frames with linear interpolation. After that we run on an optimized\n    path which just applies the new gains without a lerp.\n    */\n    if (pGainer->t >= pGainer->config.smoothTimeInFrames) {\n        interpolatedFrameCount = 0;\n    } else {\n        interpolatedFrameCount = pGainer->t - pGainer->config.smoothTimeInFrames;\n        if (interpolatedFrameCount > frameCount) {\n            interpolatedFrameCount = frameCount;\n        }\n    }\n\n    /*\n    Start off with our interpolated frames. When we do this, we'll adjust frameCount and our pointers\n    so that the fast path can work naturally without consideration of the interpolated path.\n    */\n    if (interpolatedFrameCount > 0) {\n        /* We can allow the input and output buffers to be null in which case we'll just update the internal timer. */\n        if (pFramesOut != NULL && pFramesIn != NULL) {\n            /*\n            All we're really doing here is moving the old gains towards the new gains. We don't want to\n            be modifying the gains inside the ma_gainer object because that will break things. Instead\n            we can make a copy here on the stack. For extreme channel counts we can fall back to a slower\n            implementation which just uses a standard lerp.\n            */\n            float* pFramesOutF32 = (float*)pFramesOut;\n            const float* pFramesInF32 = (const float*)pFramesIn;\n            float a = (float)pGainer->t / pGainer->config.smoothTimeInFrames;\n            float d = 1.0f / pGainer->config.smoothTimeInFrames;\n\n            if (pGainer->config.channels <= 32) {\n                float pRunningGain[32];\n                float pRunningGainDelta[32];    /* Could this be heap-allocated as part of the ma_gainer object? */\n\n                /* Initialize the running gain. */\n                for (iChannel = 0; iChannel < pGainer->config.channels; iChannel += 1) {\n                    float t = (pGainer->pNewGains[iChannel] - pGainer->pOldGains[iChannel]) * pGainer->masterVolume;\n                    pRunningGainDelta[iChannel] = t * d;\n                    pRunningGain[iChannel] = (pGainer->pOldGains[iChannel] * pGainer->masterVolume) + (t * a);\n                }\n\n                iFrame = 0;\n\n                /* Optimized paths for common channel counts. This is mostly just experimenting with some SIMD ideas. It's not necessarily final. */\n                if (pGainer->config.channels == 2) {\n                #if defined(MA_SUPPORT_SSE2)\n                    if (ma_has_sse2()) {\n                        ma_uint64 unrolledLoopCount = interpolatedFrameCount >> 1;\n\n                        /* Expand some arrays so we can have a clean SIMD loop below. */\n                        __m128 runningGainDelta0 = _mm_set_ps(pRunningGainDelta[1], pRunningGainDelta[0], pRunningGainDelta[1], pRunningGainDelta[0]);\n                        __m128 runningGain0      = _mm_set_ps(pRunningGain[1] + pRunningGainDelta[1], pRunningGain[0] + pRunningGainDelta[0], pRunningGain[1], pRunningGain[0]);\n\n                        for (; iFrame < unrolledLoopCount; iFrame += 1) {\n                            _mm_storeu_ps(&pFramesOutF32[iFrame*4 + 0], _mm_mul_ps(_mm_loadu_ps(&pFramesInF32[iFrame*4 + 0]), runningGain0));\n                            runningGain0 = _mm_add_ps(runningGain0, runningGainDelta0);\n                        }\n\n                        iFrame = unrolledLoopCount << 1;\n                    } else\n                #endif\n                    {\n                        /*\n                        Two different scalar implementations here. Clang (and I assume GCC) will vectorize\n                        both of these, but the bottom version results in a nicer vectorization with less\n                        instructions emitted. The problem, however, is that the bottom version runs slower\n                        when compiled with MSVC. The top version will be partially vectorized by MSVC.\n                        */\n                    #if defined(_MSC_VER) && !defined(__clang__)\n                        ma_uint64 unrolledLoopCount = interpolatedFrameCount >> 1;\n\n                        /* Expand some arrays so we can have a clean 4x SIMD operation in the loop. */\n                        pRunningGainDelta[2] = pRunningGainDelta[0];\n                        pRunningGainDelta[3] = pRunningGainDelta[1];\n                        pRunningGain[2] = pRunningGain[0] + pRunningGainDelta[0];\n                        pRunningGain[3] = pRunningGain[1] + pRunningGainDelta[1];\n\n                        for (; iFrame < unrolledLoopCount; iFrame += 1) {\n                            pFramesOutF32[iFrame*4 + 0] = pFramesInF32[iFrame*4 + 0] * pRunningGain[0];\n                            pFramesOutF32[iFrame*4 + 1] = pFramesInF32[iFrame*4 + 1] * pRunningGain[1];\n                            pFramesOutF32[iFrame*4 + 2] = pFramesInF32[iFrame*4 + 2] * pRunningGain[2];\n                            pFramesOutF32[iFrame*4 + 3] = pFramesInF32[iFrame*4 + 3] * pRunningGain[3];\n\n                            /* Move the running gain forward towards the new gain. */\n                            pRunningGain[0] += pRunningGainDelta[0];\n                            pRunningGain[1] += pRunningGainDelta[1];\n                            pRunningGain[2] += pRunningGainDelta[2];\n                            pRunningGain[3] += pRunningGainDelta[3];\n                        }\n\n                        iFrame = unrolledLoopCount << 1;\n                    #else\n                        for (; iFrame < interpolatedFrameCount; iFrame += 1) {\n                            for (iChannel = 0; iChannel < 2; iChannel += 1) {\n                                pFramesOutF32[iFrame*2 + iChannel] = pFramesInF32[iFrame*2 + iChannel] * pRunningGain[iChannel];\n                            }\n\n                            for (iChannel = 0; iChannel < 2; iChannel += 1) {\n                                pRunningGain[iChannel] += pRunningGainDelta[iChannel];\n                            }\n                        }\n                    #endif\n                    }\n                } else if (pGainer->config.channels == 6) {\n                #if defined(MA_SUPPORT_SSE2)\n                    if (ma_has_sse2()) {\n                        /*\n                        For 6 channels things are a bit more complicated because 6 isn't cleanly divisible by 4. We need to do 2 frames\n                        at a time, meaning we'll be doing 12 samples in a group. Like the stereo case we'll need to expand some arrays\n                        so we can do clean 4x SIMD operations.\n                        */\n                        ma_uint64 unrolledLoopCount = interpolatedFrameCount >> 1;\n\n                        /* Expand some arrays so we can have a clean SIMD loop below. */\n                        __m128 runningGainDelta0 = _mm_set_ps(pRunningGainDelta[3], pRunningGainDelta[2], pRunningGainDelta[1], pRunningGainDelta[0]);\n                        __m128 runningGainDelta1 = _mm_set_ps(pRunningGainDelta[1], pRunningGainDelta[0], pRunningGainDelta[5], pRunningGainDelta[4]);\n                        __m128 runningGainDelta2 = _mm_set_ps(pRunningGainDelta[5], pRunningGainDelta[4], pRunningGainDelta[3], pRunningGainDelta[2]);\n\n                        __m128 runningGain0      = _mm_set_ps(pRunningGain[3],                        pRunningGain[2],                        pRunningGain[1],                        pRunningGain[0]);\n                        __m128 runningGain1      = _mm_set_ps(pRunningGain[1] + pRunningGainDelta[1], pRunningGain[0] + pRunningGainDelta[0], pRunningGain[5],                        pRunningGain[4]);\n                        __m128 runningGain2      = _mm_set_ps(pRunningGain[5] + pRunningGainDelta[5], pRunningGain[4] + pRunningGainDelta[4], pRunningGain[3] + pRunningGainDelta[3], pRunningGain[2] + pRunningGainDelta[2]);\n\n                        for (; iFrame < unrolledLoopCount; iFrame += 1) {\n                            _mm_storeu_ps(&pFramesOutF32[iFrame*12 + 0], _mm_mul_ps(_mm_loadu_ps(&pFramesInF32[iFrame*12 + 0]), runningGain0));\n                            _mm_storeu_ps(&pFramesOutF32[iFrame*12 + 4], _mm_mul_ps(_mm_loadu_ps(&pFramesInF32[iFrame*12 + 4]), runningGain1));\n                            _mm_storeu_ps(&pFramesOutF32[iFrame*12 + 8], _mm_mul_ps(_mm_loadu_ps(&pFramesInF32[iFrame*12 + 8]), runningGain2));\n\n                            runningGain0 = _mm_add_ps(runningGain0, runningGainDelta0);\n                            runningGain1 = _mm_add_ps(runningGain1, runningGainDelta1);\n                            runningGain2 = _mm_add_ps(runningGain2, runningGainDelta2);\n                        }\n\n                        iFrame = unrolledLoopCount << 1;\n                    } else\n                #endif\n                    {\n                        for (; iFrame < interpolatedFrameCount; iFrame += 1) {\n                            for (iChannel = 0; iChannel < 6; iChannel += 1) {\n                                pFramesOutF32[iFrame*6 + iChannel] = pFramesInF32[iFrame*6 + iChannel] * pRunningGain[iChannel];\n                            }\n\n                            /* Move the running gain forward towards the new gain. */\n                            for (iChannel = 0; iChannel < 6; iChannel += 1) {\n                                pRunningGain[iChannel] += pRunningGainDelta[iChannel];\n                            }\n                        }\n                    }\n                } else if (pGainer->config.channels == 8) {\n                    /* For 8 channels we can just go over frame by frame and do all eight channels as 2 separate 4x SIMD operations. */\n                #if defined(MA_SUPPORT_SSE2)\n                    if (ma_has_sse2()) {\n                        __m128 runningGainDelta0 = _mm_loadu_ps(&pRunningGainDelta[0]);\n                        __m128 runningGainDelta1 = _mm_loadu_ps(&pRunningGainDelta[4]);\n                        __m128 runningGain0      = _mm_loadu_ps(&pRunningGain[0]);\n                        __m128 runningGain1      = _mm_loadu_ps(&pRunningGain[4]);\n\n                        for (; iFrame < interpolatedFrameCount; iFrame += 1) {\n                            _mm_storeu_ps(&pFramesOutF32[iFrame*8 + 0], _mm_mul_ps(_mm_loadu_ps(&pFramesInF32[iFrame*8 + 0]), runningGain0));\n                            _mm_storeu_ps(&pFramesOutF32[iFrame*8 + 4], _mm_mul_ps(_mm_loadu_ps(&pFramesInF32[iFrame*8 + 4]), runningGain1));\n\n                            runningGain0 = _mm_add_ps(runningGain0, runningGainDelta0);\n                            runningGain1 = _mm_add_ps(runningGain1, runningGainDelta1);\n                        }\n                    } else\n                #endif\n                    {\n                        /* This is crafted so that it auto-vectorizes when compiled with Clang. */\n                        for (; iFrame < interpolatedFrameCount; iFrame += 1) {\n                            for (iChannel = 0; iChannel < 8; iChannel += 1) {\n                                pFramesOutF32[iFrame*8 + iChannel] = pFramesInF32[iFrame*8 + iChannel] * pRunningGain[iChannel];\n                            }\n\n                            /* Move the running gain forward towards the new gain. */\n                            for (iChannel = 0; iChannel < 8; iChannel += 1) {\n                                pRunningGain[iChannel] += pRunningGainDelta[iChannel];\n                            }\n                        }\n                    }\n                }\n\n                for (; iFrame < interpolatedFrameCount; iFrame += 1) {\n                    for (iChannel = 0; iChannel < pGainer->config.channels; iChannel += 1) {\n                        pFramesOutF32[iFrame*pGainer->config.channels + iChannel] = pFramesInF32[iFrame*pGainer->config.channels + iChannel] * pRunningGain[iChannel];\n                        pRunningGain[iChannel] += pRunningGainDelta[iChannel];\n                    }\n                }\n            } else {\n                /* Slower path for extreme channel counts where we can't fit enough on the stack. We could also move this to the heap as part of the ma_gainer object which might even be better since it'll only be updated when the gains actually change. */\n                for (iFrame = 0; iFrame < interpolatedFrameCount; iFrame += 1) {\n                    for (iChannel = 0; iChannel < pGainer->config.channels; iChannel += 1) {\n                        pFramesOutF32[iFrame*pGainer->config.channels + iChannel] = pFramesInF32[iFrame*pGainer->config.channels + iChannel] * ma_mix_f32_fast(pGainer->pOldGains[iChannel], pGainer->pNewGains[iChannel], a) * pGainer->masterVolume;\n                    }\n\n                    a += d;\n                }\n            }\n        }\n\n        /* Make sure the timer is updated. */\n        pGainer->t = (ma_uint32)ma_min(pGainer->t + interpolatedFrameCount, pGainer->config.smoothTimeInFrames);\n\n        /* Adjust our arguments so the next part can work normally. */\n        frameCount -= interpolatedFrameCount;\n        pFramesOut  = ma_offset_ptr(pFramesOut, interpolatedFrameCount * sizeof(float));\n        pFramesIn   = ma_offset_ptr(pFramesIn,  interpolatedFrameCount * sizeof(float));\n    }\n\n    /* All we need to do here is apply the new gains using an optimized path. */\n    if (pFramesOut != NULL && pFramesIn != NULL) {\n        if (pGainer->config.channels <= 32) {\n            float gains[32];\n            for (iChannel = 0; iChannel < pGainer->config.channels; iChannel += 1) {\n                gains[iChannel] = pGainer->pNewGains[iChannel] * pGainer->masterVolume;\n            }\n\n            ma_copy_and_apply_volume_factor_per_channel_f32((float*)pFramesOut, (const float*)pFramesIn, frameCount, pGainer->config.channels, gains);\n        } else {\n            /* Slow path. Too many channels to fit on the stack. Need to apply a master volume as a separate path. */\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannel = 0; iChannel < pGainer->config.channels; iChannel += 1) {\n                    ((float*)pFramesOut)[iFrame*pGainer->config.channels + iChannel] = ((const float*)pFramesIn)[iFrame*pGainer->config.channels + iChannel] * pGainer->pNewGains[iChannel] * pGainer->masterVolume;\n                }\n            }\n        }\n    }\n\n    /* Now that some frames have been processed we need to make sure future changes to the gain are interpolated. */\n    if (pGainer->t == (ma_uint32)-1) {\n        pGainer->t  = (ma_uint32)ma_min(pGainer->config.smoothTimeInFrames, frameCount);\n    }\n\n#if 0\n    if (pGainer->t >= pGainer->config.smoothTimeInFrames) {\n        /* Fast path. No gain calculation required. */\n        ma_copy_and_apply_volume_factor_per_channel_f32(pFramesOutF32, pFramesInF32, frameCount, pGainer->config.channels, pGainer->pNewGains);\n        ma_apply_volume_factor_f32(pFramesOutF32, frameCount * pGainer->config.channels, pGainer->masterVolume);\n\n        /* Now that some frames have been processed we need to make sure future changes to the gain are interpolated. */\n        if (pGainer->t == (ma_uint32)-1) {\n            pGainer->t = pGainer->config.smoothTimeInFrames;\n        }\n    } else {\n        /* Slow path. Need to interpolate the gain for each channel individually. */\n\n        /* We can allow the input and output buffers to be null in which case we'll just update the internal timer. */\n        if (pFramesOut != NULL && pFramesIn != NULL) {\n            float a = (float)pGainer->t / pGainer->config.smoothTimeInFrames;\n            float d = 1.0f / pGainer->config.smoothTimeInFrames;\n            ma_uint32 channelCount = pGainer->config.channels;\n\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannel = 0; iChannel < channelCount; iChannel += 1) {\n                    pFramesOutF32[iChannel] = pFramesInF32[iChannel] * ma_mix_f32_fast(pGainer->pOldGains[iChannel], pGainer->pNewGains[iChannel], a) * pGainer->masterVolume;\n                }\n\n                pFramesOutF32 += channelCount;\n                pFramesInF32  += channelCount;\n\n                a += d;\n                if (a > 1) {\n                    a = 1;\n                }\n            }\n        }\n\n        pGainer->t = (ma_uint32)ma_min(pGainer->t + frameCount, pGainer->config.smoothTimeInFrames);\n\n    #if 0   /* Reference implementation. */\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            /* We can allow the input and output buffers to be null in which case we'll just update the internal timer. */\n            if (pFramesOut != NULL && pFramesIn != NULL) {\n                for (iChannel = 0; iChannel < pGainer->config.channels; iChannel += 1) {\n                    pFramesOutF32[iFrame * pGainer->config.channels + iChannel] = pFramesInF32[iFrame * pGainer->config.channels + iChannel] * ma_gainer_calculate_current_gain(pGainer, iChannel) * pGainer->masterVolume;\n                }\n            }\n\n            /* Move interpolation time forward, but don't go beyond our smoothing time. */\n            pGainer->t = ma_min(pGainer->t + 1, pGainer->config.smoothTimeInFrames);\n        }\n    #endif\n    }\n#endif\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_gainer_process_pcm_frames(ma_gainer* pGainer, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    if (pGainer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /*\n    ma_gainer_process_pcm_frames_internal() marks pFramesOut and pFramesIn with MA_RESTRICT which\n    helps with auto-vectorization.\n    */\n    return ma_gainer_process_pcm_frames_internal(pGainer, pFramesOut, pFramesIn, frameCount);\n}\n\nstatic void ma_gainer_set_gain_by_index(ma_gainer* pGainer, float newGain, ma_uint32 iChannel)\n{\n    pGainer->pOldGains[iChannel] = ma_gainer_calculate_current_gain(pGainer, iChannel);\n    pGainer->pNewGains[iChannel] = newGain;\n}\n\nstatic void ma_gainer_reset_smoothing_time(ma_gainer* pGainer)\n{\n    if (pGainer->t == (ma_uint32)-1) {\n        pGainer->t = pGainer->config.smoothTimeInFrames;    /* No smoothing required for initial gains setting. */\n    } else {\n        pGainer->t = 0;\n    }\n}\n\nMA_API ma_result ma_gainer_set_gain(ma_gainer* pGainer, float newGain)\n{\n    ma_uint32 iChannel;\n\n    if (pGainer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    for (iChannel = 0; iChannel < pGainer->config.channels; iChannel += 1) {\n        ma_gainer_set_gain_by_index(pGainer, newGain, iChannel);\n    }\n\n    /* The smoothing time needs to be reset to ensure we always interpolate by the configured smoothing time, but only if it's not the first setting. */\n    ma_gainer_reset_smoothing_time(pGainer);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_gainer_set_gains(ma_gainer* pGainer, float* pNewGains)\n{\n    ma_uint32 iChannel;\n\n    if (pGainer == NULL || pNewGains == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    for (iChannel = 0; iChannel < pGainer->config.channels; iChannel += 1) {\n        ma_gainer_set_gain_by_index(pGainer, pNewGains[iChannel], iChannel);\n    }\n\n    /* The smoothing time needs to be reset to ensure we always interpolate by the configured smoothing time, but only if it's not the first setting. */\n    ma_gainer_reset_smoothing_time(pGainer);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_gainer_set_master_volume(ma_gainer* pGainer, float volume)\n{\n    if (pGainer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pGainer->masterVolume = volume;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_gainer_get_master_volume(const ma_gainer* pGainer, float* pVolume)\n{\n    if (pGainer == NULL || pVolume == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pVolume = pGainer->masterVolume;\n\n    return MA_SUCCESS;\n}\n\n\nMA_API ma_panner_config ma_panner_config_init(ma_format format, ma_uint32 channels)\n{\n    ma_panner_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format   = format;\n    config.channels = channels;\n    config.mode     = ma_pan_mode_balance;  /* Set to balancing mode by default because it's consistent with other audio engines and most likely what the caller is expecting. */\n    config.pan      = 0;\n\n    return config;\n}\n\n\nMA_API ma_result ma_panner_init(const ma_panner_config* pConfig, ma_panner* pPanner)\n{\n    if (pPanner == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pPanner);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pPanner->format   = pConfig->format;\n    pPanner->channels = pConfig->channels;\n    pPanner->mode     = pConfig->mode;\n    pPanner->pan      = pConfig->pan;\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_stereo_balance_pcm_frames_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, float pan)\n{\n    ma_uint64 iFrame;\n\n    if (pan > 0) {\n        float factor = 1.0f - pan;\n        if (pFramesOut == pFramesIn) {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                pFramesOut[iFrame*2 + 0] = pFramesIn[iFrame*2 + 0] * factor;\n            }\n        } else {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                pFramesOut[iFrame*2 + 0] = pFramesIn[iFrame*2 + 0] * factor;\n                pFramesOut[iFrame*2 + 1] = pFramesIn[iFrame*2 + 1];\n            }\n        }\n    } else {\n        float factor = 1.0f + pan;\n        if (pFramesOut == pFramesIn) {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                pFramesOut[iFrame*2 + 1] = pFramesIn[iFrame*2 + 1] * factor;\n            }\n        } else {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                pFramesOut[iFrame*2 + 0] = pFramesIn[iFrame*2 + 0];\n                pFramesOut[iFrame*2 + 1] = pFramesIn[iFrame*2 + 1] * factor;\n            }\n        }\n    }\n}\n\nstatic void ma_stereo_balance_pcm_frames(void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount, ma_format format, float pan)\n{\n    if (pan == 0) {\n        /* Fast path. No panning required. */\n        if (pFramesOut == pFramesIn) {\n            /* No-op */\n        } else {\n            ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, format, 2);\n        }\n\n        return;\n    }\n\n    switch (format) {\n        case ma_format_f32: ma_stereo_balance_pcm_frames_f32((float*)pFramesOut, (float*)pFramesIn, frameCount, pan); break;\n\n        /* Unknown format. Just copy. */\n        default:\n        {\n            ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, format, 2);\n        } break;\n    }\n}\n\n\nstatic void ma_stereo_pan_pcm_frames_f32(float* pFramesOut, const float* pFramesIn, ma_uint64 frameCount, float pan)\n{\n    ma_uint64 iFrame;\n\n    if (pan > 0) {\n        float factorL0 = 1.0f - pan;\n        float factorL1 = 0.0f + pan;\n\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            float sample0 = (pFramesIn[iFrame*2 + 0] * factorL0);\n            float sample1 = (pFramesIn[iFrame*2 + 0] * factorL1) + pFramesIn[iFrame*2 + 1];\n\n            pFramesOut[iFrame*2 + 0] = sample0;\n            pFramesOut[iFrame*2 + 1] = sample1;\n        }\n    } else {\n        float factorR0 = 0.0f - pan;\n        float factorR1 = 1.0f + pan;\n\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            float sample0 = pFramesIn[iFrame*2 + 0] + (pFramesIn[iFrame*2 + 1] * factorR0);\n            float sample1 =                           (pFramesIn[iFrame*2 + 1] * factorR1);\n\n            pFramesOut[iFrame*2 + 0] = sample0;\n            pFramesOut[iFrame*2 + 1] = sample1;\n        }\n    }\n}\n\nstatic void ma_stereo_pan_pcm_frames(void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount, ma_format format, float pan)\n{\n    if (pan == 0) {\n        /* Fast path. No panning required. */\n        if (pFramesOut == pFramesIn) {\n            /* No-op */\n        } else {\n            ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, format, 2);\n        }\n\n        return;\n    }\n\n    switch (format) {\n        case ma_format_f32: ma_stereo_pan_pcm_frames_f32((float*)pFramesOut, (float*)pFramesIn, frameCount, pan); break;\n\n        /* Unknown format. Just copy. */\n        default:\n        {\n            ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, format, 2);\n        } break;\n    }\n}\n\nMA_API ma_result ma_panner_process_pcm_frames(ma_panner* pPanner, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    if (pPanner == NULL || pFramesOut == NULL || pFramesIn == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pPanner->channels == 2) {\n        /* Stereo case. For now assume channel 0 is left and channel right is 1, but should probably add support for a channel map. */\n        if (pPanner->mode == ma_pan_mode_balance) {\n            ma_stereo_balance_pcm_frames(pFramesOut, pFramesIn, frameCount, pPanner->format, pPanner->pan);\n        } else {\n            ma_stereo_pan_pcm_frames(pFramesOut, pFramesIn, frameCount, pPanner->format, pPanner->pan);\n        }\n    } else {\n        if (pPanner->channels == 1) {\n            /* Panning has no effect on mono streams. */\n            ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, pPanner->format, pPanner->channels);\n        } else {\n            /* For now we're not going to support non-stereo set ups. Not sure how I want to handle this case just yet. */\n            ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, pPanner->format, pPanner->channels);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_panner_set_mode(ma_panner* pPanner, ma_pan_mode mode)\n{\n    if (pPanner == NULL) {\n        return;\n    }\n\n    pPanner->mode = mode;\n}\n\nMA_API ma_pan_mode ma_panner_get_mode(const ma_panner* pPanner)\n{\n    if (pPanner == NULL) {\n        return ma_pan_mode_balance;\n    }\n\n    return pPanner->mode;\n}\n\nMA_API void ma_panner_set_pan(ma_panner* pPanner, float pan)\n{\n    if (pPanner == NULL) {\n        return;\n    }\n\n    pPanner->pan = ma_clamp(pan, -1.0f, 1.0f);\n}\n\nMA_API float ma_panner_get_pan(const ma_panner* pPanner)\n{\n    if (pPanner == NULL) {\n        return 0;\n    }\n\n    return pPanner->pan;\n}\n\n\n\n\nMA_API ma_fader_config ma_fader_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate)\n{\n    ma_fader_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format     = format;\n    config.channels   = channels;\n    config.sampleRate = sampleRate;\n\n    return config;\n}\n\n\nMA_API ma_result ma_fader_init(const ma_fader_config* pConfig, ma_fader* pFader)\n{\n    if (pFader == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pFader);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Only f32 is supported for now. */\n    if (pConfig->format != ma_format_f32) {\n        return MA_INVALID_ARGS;\n    }\n\n    pFader->config         = *pConfig;\n    pFader->volumeBeg      = 1;\n    pFader->volumeEnd      = 1;\n    pFader->lengthInFrames = 0;\n    pFader->cursorInFrames = 0;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_fader_process_pcm_frames(ma_fader* pFader, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    if (pFader == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* If the cursor is still negative we need to just copy the absolute number of those frames, but no more than frameCount. */\n    if (pFader->cursorInFrames < 0) {\n        ma_uint64 absCursorInFrames = (ma_uint64)0 - pFader->cursorInFrames;\n        if (absCursorInFrames > frameCount) {\n            absCursorInFrames = frameCount;\n        }\n\n        ma_copy_pcm_frames(pFramesOut, pFramesIn, absCursorInFrames, pFader->config.format, pFader->config.channels);\n\n        pFader->cursorInFrames += absCursorInFrames;\n        frameCount -= absCursorInFrames;\n        pFramesOut  = ma_offset_ptr(pFramesOut, ma_get_bytes_per_frame(pFader->config.format, pFader->config.channels)*absCursorInFrames);\n        pFramesIn   = ma_offset_ptr(pFramesIn,  ma_get_bytes_per_frame(pFader->config.format, pFader->config.channels)*absCursorInFrames);\n    }\n\n    if (pFader->cursorInFrames >= 0) {\n        /*\n        For now we need to clamp frameCount so that the cursor never overflows 32-bits. This is required for\n        the conversion to a float which we use for the linear interpolation. This might be changed later.\n        */\n        if (frameCount + pFader->cursorInFrames > UINT_MAX) {\n            frameCount = UINT_MAX - pFader->cursorInFrames;\n        }\n\n        /* Optimized path if volumeBeg and volumeEnd are equal. */\n        if (pFader->volumeBeg == pFader->volumeEnd) {\n            if (pFader->volumeBeg == 1) {\n                /* Straight copy. */\n                ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, pFader->config.format, pFader->config.channels);\n            } else {\n                /* Copy with volume. */\n                ma_copy_and_apply_volume_and_clip_pcm_frames(pFramesOut, pFramesIn, frameCount, pFader->config.format, pFader->config.channels, pFader->volumeBeg);\n            }\n        } else {\n            /* Slower path. Volumes are different, so may need to do an interpolation. */\n            if ((ma_uint64)pFader->cursorInFrames >= pFader->lengthInFrames) {\n                /* Fast path. We've gone past the end of the fade period so just apply the end volume to all samples. */\n                ma_copy_and_apply_volume_and_clip_pcm_frames(pFramesOut, pFramesIn, frameCount, pFader->config.format, pFader->config.channels, pFader->volumeEnd);\n            } else {\n                /* Slow path. This is where we do the actual fading. */\n                ma_uint64 iFrame;\n                ma_uint32 iChannel;\n\n                /* For now we only support f32. Support for other formats might be added later. */\n                if (pFader->config.format == ma_format_f32) {\n                    const float* pFramesInF32  = (const float*)pFramesIn;\n                    /* */ float* pFramesOutF32 = (      float*)pFramesOut;\n\n                    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                        float a = (ma_uint32)ma_min(pFader->cursorInFrames + iFrame, pFader->lengthInFrames) / (float)((ma_uint32)pFader->lengthInFrames);   /* Safe cast due to the frameCount clamp at the top of this function. */\n                        float volume = ma_mix_f32_fast(pFader->volumeBeg, pFader->volumeEnd, a);\n\n                        for (iChannel = 0; iChannel < pFader->config.channels; iChannel += 1) {\n                            pFramesOutF32[iFrame*pFader->config.channels + iChannel] = pFramesInF32[iFrame*pFader->config.channels + iChannel] * volume;\n                        }\n                    }\n                } else {\n                    return MA_NOT_IMPLEMENTED;\n                }\n            }\n        }\n    }\n\n    pFader->cursorInFrames += frameCount;\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_fader_get_data_format(const ma_fader* pFader, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate)\n{\n    if (pFader == NULL) {\n        return;\n    }\n\n    if (pFormat != NULL) {\n        *pFormat = pFader->config.format;\n    }\n\n    if (pChannels != NULL) {\n        *pChannels = pFader->config.channels;\n    }\n\n    if (pSampleRate != NULL) {\n        *pSampleRate = pFader->config.sampleRate;\n    }\n}\n\nMA_API void ma_fader_set_fade(ma_fader* pFader, float volumeBeg, float volumeEnd, ma_uint64 lengthInFrames)\n{\n    ma_fader_set_fade_ex(pFader, volumeBeg, volumeEnd, lengthInFrames, 0);\n}\n\nMA_API void ma_fader_set_fade_ex(ma_fader* pFader, float volumeBeg, float volumeEnd, ma_uint64 lengthInFrames, ma_int64 startOffsetInFrames)\n{\n    if (pFader == NULL) {\n        return;\n    }\n\n    /* If the volume is negative, use current volume. */\n    if (volumeBeg < 0) {\n        volumeBeg = ma_fader_get_current_volume(pFader);\n    }\n\n    /*\n    The length needs to be clamped to 32-bits due to how we convert it to a float for linear\n    interpolation reasons. I might change this requirement later, but for now it's not important.\n    */\n    if (lengthInFrames > UINT_MAX) {\n        lengthInFrames = UINT_MAX;\n    }\n\n    /* The start offset needs to be clamped to ensure it doesn't overflow a signed number. */\n    if (startOffsetInFrames > INT_MAX) {\n        startOffsetInFrames = INT_MAX;\n    }\n\n    pFader->volumeBeg      = volumeBeg;\n    pFader->volumeEnd      = volumeEnd;\n    pFader->lengthInFrames = lengthInFrames;\n    pFader->cursorInFrames = -startOffsetInFrames;\n}\n\nMA_API float ma_fader_get_current_volume(const ma_fader* pFader)\n{\n    if (pFader == NULL) {\n        return 0.0f;\n    }\n\n    /* Any frames prior to the start of the fade period will be at unfaded volume. */\n    if (pFader->cursorInFrames < 0) {\n        return 1.0f;\n    }\n\n    /* The current volume depends on the position of the cursor. */\n    if (pFader->cursorInFrames == 0) {\n        return pFader->volumeBeg;\n    } else if ((ma_uint64)pFader->cursorInFrames >= pFader->lengthInFrames) {   /* Safe case because the < 0 case was checked above. */\n        return pFader->volumeEnd;\n    } else {\n        /* The cursor is somewhere inside the fading period. We can figure this out with a simple linear interpoluation between volumeBeg and volumeEnd based on our cursor position. */\n        return ma_mix_f32_fast(pFader->volumeBeg, pFader->volumeEnd, (ma_uint32)pFader->cursorInFrames / (float)((ma_uint32)pFader->lengthInFrames));    /* Safe cast to uint32 because we clamp it in ma_fader_process_pcm_frames(). */\n    }\n}\n\n\n\n\n\nMA_API ma_vec3f ma_vec3f_init_3f(float x, float y, float z)\n{\n    ma_vec3f v;\n\n    v.x = x;\n    v.y = y;\n    v.z = z;\n\n    return v;\n}\n\nMA_API ma_vec3f ma_vec3f_sub(ma_vec3f a, ma_vec3f b)\n{\n    return ma_vec3f_init_3f(\n        a.x - b.x,\n        a.y - b.y,\n        a.z - b.z\n    );\n}\n\nMA_API ma_vec3f ma_vec3f_neg(ma_vec3f a)\n{\n    return ma_vec3f_init_3f(\n        -a.x,\n        -a.y,\n        -a.z\n    );\n}\n\nMA_API float ma_vec3f_dot(ma_vec3f a, ma_vec3f b)\n{\n    return a.x*b.x + a.y*b.y + a.z*b.z;\n}\n\nMA_API float ma_vec3f_len2(ma_vec3f v)\n{\n    return ma_vec3f_dot(v, v);\n}\n\nMA_API float ma_vec3f_len(ma_vec3f v)\n{\n    return (float)ma_sqrtd(ma_vec3f_len2(v));\n}\n\n\n\nMA_API float ma_vec3f_dist(ma_vec3f a, ma_vec3f b)\n{\n    return ma_vec3f_len(ma_vec3f_sub(a, b));\n}\n\nMA_API ma_vec3f ma_vec3f_normalize(ma_vec3f v)\n{\n    float invLen;\n    float len2 = ma_vec3f_len2(v);\n    if (len2 == 0) {\n        return ma_vec3f_init_3f(0, 0, 0);\n    }\n\n    invLen = ma_rsqrtf(len2);\n    v.x *= invLen;\n    v.y *= invLen;\n    v.z *= invLen;\n\n    return v;\n}\n\nMA_API ma_vec3f ma_vec3f_cross(ma_vec3f a, ma_vec3f b)\n{\n    return ma_vec3f_init_3f(\n        a.y*b.z - a.z*b.y,\n        a.z*b.x - a.x*b.z,\n        a.x*b.y - a.y*b.x\n    );\n}\n\n\nMA_API void ma_atomic_vec3f_init(ma_atomic_vec3f* v, ma_vec3f value)\n{\n    v->v = value;\n    v->lock = 0;    /* Important this is initialized to 0. */\n}\n\nMA_API void ma_atomic_vec3f_set(ma_atomic_vec3f* v, ma_vec3f value)\n{\n    ma_spinlock_lock(&v->lock);\n    {\n        v->v = value;\n    }\n    ma_spinlock_unlock(&v->lock);\n}\n\nMA_API ma_vec3f ma_atomic_vec3f_get(ma_atomic_vec3f* v)\n{\n    ma_vec3f r;\n\n    ma_spinlock_lock(&v->lock);\n    {\n        r = v->v;\n    }\n    ma_spinlock_unlock(&v->lock);\n\n    return r;\n}\n\n\n\nstatic void ma_channel_map_apply_f32(float* pFramesOut, const ma_channel* pChannelMapOut, ma_uint32 channelsOut, const float* pFramesIn, const ma_channel* pChannelMapIn, ma_uint32 channelsIn, ma_uint64 frameCount, ma_channel_mix_mode mode, ma_mono_expansion_mode monoExpansionMode);\nstatic ma_bool32 ma_is_spatial_channel_position(ma_channel channelPosition);\n\n\n#ifndef MA_DEFAULT_SPEED_OF_SOUND\n#define MA_DEFAULT_SPEED_OF_SOUND   343.3f\n#endif\n\n/*\nThese vectors represent the direction that speakers are facing from the center point. They're used\nfor panning in the spatializer. Must be normalized.\n*/\nstatic ma_vec3f g_maChannelDirections[MA_CHANNEL_POSITION_COUNT] = {\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_NONE */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_MONO */\n    {-0.7071f,  0.0f,    -0.7071f },  /* MA_CHANNEL_FRONT_LEFT */\n    {+0.7071f,  0.0f,    -0.7071f },  /* MA_CHANNEL_FRONT_RIGHT */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_FRONT_CENTER */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_LFE */\n    {-0.7071f,  0.0f,    +0.7071f },  /* MA_CHANNEL_BACK_LEFT */\n    {+0.7071f,  0.0f,    +0.7071f },  /* MA_CHANNEL_BACK_RIGHT */\n    {-0.3162f,  0.0f,    -0.9487f },  /* MA_CHANNEL_FRONT_LEFT_CENTER */\n    {+0.3162f,  0.0f,    -0.9487f },  /* MA_CHANNEL_FRONT_RIGHT_CENTER */\n    { 0.0f,     0.0f,    +1.0f    },  /* MA_CHANNEL_BACK_CENTER */\n    {-1.0f,     0.0f,     0.0f    },  /* MA_CHANNEL_SIDE_LEFT */\n    {+1.0f,     0.0f,     0.0f    },  /* MA_CHANNEL_SIDE_RIGHT */\n    { 0.0f,    +1.0f,     0.0f    },  /* MA_CHANNEL_TOP_CENTER */\n    {-0.5774f, +0.5774f, -0.5774f },  /* MA_CHANNEL_TOP_FRONT_LEFT */\n    { 0.0f,    +0.7071f, -0.7071f },  /* MA_CHANNEL_TOP_FRONT_CENTER */\n    {+0.5774f, +0.5774f, -0.5774f },  /* MA_CHANNEL_TOP_FRONT_RIGHT */\n    {-0.5774f, +0.5774f, +0.5774f },  /* MA_CHANNEL_TOP_BACK_LEFT */\n    { 0.0f,    +0.7071f, +0.7071f },  /* MA_CHANNEL_TOP_BACK_CENTER */\n    {+0.5774f, +0.5774f, +0.5774f },  /* MA_CHANNEL_TOP_BACK_RIGHT */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_0 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_1 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_2 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_3 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_4 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_5 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_6 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_7 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_8 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_9 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_10 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_11 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_12 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_13 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_14 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_15 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_16 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_17 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_18 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_19 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_20 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_21 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_22 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_23 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_24 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_25 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_26 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_27 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_28 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_29 */\n    { 0.0f,     0.0f,    -1.0f    },  /* MA_CHANNEL_AUX_30 */\n    { 0.0f,     0.0f,    -1.0f    }   /* MA_CHANNEL_AUX_31 */\n};\n\nstatic ma_vec3f ma_get_channel_direction(ma_channel channel)\n{\n    if (channel >= MA_CHANNEL_POSITION_COUNT) {\n        return ma_vec3f_init_3f(0, 0, -1);\n    } else {\n        return g_maChannelDirections[channel];\n    }\n}\n\n\n\nstatic float ma_attenuation_inverse(float distance, float minDistance, float maxDistance, float rolloff)\n{\n    if (minDistance >= maxDistance) {\n        return 1;   /* To avoid division by zero. Do not attenuate. */\n    }\n\n    return minDistance / (minDistance + rolloff * (ma_clamp(distance, minDistance, maxDistance) - minDistance));\n}\n\nstatic float ma_attenuation_linear(float distance, float minDistance, float maxDistance, float rolloff)\n{\n    if (minDistance >= maxDistance) {\n        return 1;   /* To avoid division by zero. Do not attenuate. */\n    }\n\n    return 1 - rolloff * (ma_clamp(distance, minDistance, maxDistance) - minDistance) / (maxDistance - minDistance);\n}\n\nstatic float ma_attenuation_exponential(float distance, float minDistance, float maxDistance, float rolloff)\n{\n    if (minDistance >= maxDistance) {\n        return 1;   /* To avoid division by zero. Do not attenuate. */\n    }\n\n    return (float)ma_powd(ma_clamp(distance, minDistance, maxDistance) / minDistance, -rolloff);\n}\n\n\n/*\nDopper Effect calculation taken from the OpenAL spec, with two main differences:\n\n  1) The source to listener vector will have already been calcualted at an earlier step so we can\n     just use that directly. We need only the position of the source relative to the origin.\n\n  2) We don't scale by a frequency because we actually just want the ratio which we'll plug straight\n     into the resampler directly.\n*/\nstatic float ma_doppler_pitch(ma_vec3f relativePosition, ma_vec3f sourceVelocity, ma_vec3f listenVelocity, float speedOfSound, float dopplerFactor)\n{\n    float len;\n    float vls;\n    float vss;\n\n    len = ma_vec3f_len(relativePosition);\n\n    /*\n    There's a case where the position of the source will be right on top of the listener in which\n    case the length will be 0 and we'll end up with a division by zero. We can just return a ratio\n    of 1.0 in this case. This is not considered in the OpenAL spec, but is necessary.\n    */\n    if (len == 0) {\n        return 1.0;\n    }\n\n    vls = ma_vec3f_dot(relativePosition, listenVelocity) / len;\n    vss = ma_vec3f_dot(relativePosition, sourceVelocity) / len;\n\n    vls = ma_min(vls, speedOfSound / dopplerFactor);\n    vss = ma_min(vss, speedOfSound / dopplerFactor);\n\n    return (speedOfSound - dopplerFactor*vls) / (speedOfSound - dopplerFactor*vss);\n}\n\n\nstatic void ma_get_default_channel_map_for_spatializer(ma_channel* pChannelMap, size_t channelMapCap, ma_uint32 channelCount)\n{\n    /*\n    Special case for stereo. Want to default the left and right speakers to side left and side\n    right so that they're facing directly down the X axis rather than slightly forward. Not\n    doing this will result in sounds being quieter when behind the listener. This might\n    actually be good for some scenerios, but I don't think it's an appropriate default because\n    it can be a bit unexpected.\n    */\n    if (channelCount == 2) {\n        pChannelMap[0] = MA_CHANNEL_SIDE_LEFT;\n        pChannelMap[1] = MA_CHANNEL_SIDE_RIGHT;\n    } else {\n        ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, channelCount);\n    }\n}\n\n\nMA_API ma_spatializer_listener_config ma_spatializer_listener_config_init(ma_uint32 channelsOut)\n{\n    ma_spatializer_listener_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.channelsOut             = channelsOut;\n    config.pChannelMapOut          = NULL;\n    config.handedness              = ma_handedness_right;\n    config.worldUp                 = ma_vec3f_init_3f(0, 1,  0);\n    config.coneInnerAngleInRadians = 6.283185f; /* 360 degrees. */\n    config.coneOuterAngleInRadians = 6.283185f; /* 360 degrees. */\n    config.coneOuterGain           = 0;\n    config.speedOfSound            = 343.3f;    /* Same as OpenAL. Used for doppler effect. */\n\n    return config;\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t channelMapOutOffset;\n} ma_spatializer_listener_heap_layout;\n\nstatic ma_result ma_spatializer_listener_get_heap_layout(const ma_spatializer_listener_config* pConfig, ma_spatializer_listener_heap_layout* pHeapLayout)\n{\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->channelsOut == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* Channel map. We always need this, even for passthroughs. */\n    pHeapLayout->channelMapOutOffset = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += ma_align_64(sizeof(*pConfig->pChannelMapOut) * pConfig->channelsOut);\n\n    return MA_SUCCESS;\n}\n\n\nMA_API ma_result ma_spatializer_listener_get_heap_size(const ma_spatializer_listener_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_spatializer_listener_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_spatializer_listener_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_spatializer_listener_init_preallocated(const ma_spatializer_listener_config* pConfig, void* pHeap, ma_spatializer_listener* pListener)\n{\n    ma_result result;\n    ma_spatializer_listener_heap_layout heapLayout;\n\n    if (pListener == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pListener);\n\n    result = ma_spatializer_listener_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pListener->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n    pListener->config    = *pConfig;\n    ma_atomic_vec3f_init(&pListener->position,  ma_vec3f_init_3f(0, 0, 0));\n    ma_atomic_vec3f_init(&pListener->direction, ma_vec3f_init_3f(0, 0, -1));\n    ma_atomic_vec3f_init(&pListener->velocity,  ma_vec3f_init_3f(0, 0,  0));\n    pListener->isEnabled = MA_TRUE;\n\n    /* Swap the forward direction if we're left handed (it was initialized based on right handed). */\n    if (pListener->config.handedness == ma_handedness_left) {\n        ma_vec3f negDir = ma_vec3f_neg(ma_spatializer_listener_get_direction(pListener));\n        ma_spatializer_listener_set_direction(pListener, negDir.x, negDir.y, negDir.z);\n    }\n\n\n    /* We must always have a valid channel map. */\n    pListener->config.pChannelMapOut = (ma_channel*)ma_offset_ptr(pHeap, heapLayout.channelMapOutOffset);\n\n    /* Use a slightly different default channel map for stereo. */\n    if (pConfig->pChannelMapOut == NULL) {\n        ma_get_default_channel_map_for_spatializer(pListener->config.pChannelMapOut, pConfig->channelsOut, pConfig->channelsOut);\n    } else {\n        ma_channel_map_copy_or_default(pListener->config.pChannelMapOut, pConfig->channelsOut, pConfig->pChannelMapOut, pConfig->channelsOut);\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_spatializer_listener_init(const ma_spatializer_listener_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_spatializer_listener* pListener)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_spatializer_listener_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_spatializer_listener_init_preallocated(pConfig, pHeap, pListener);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pListener->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_spatializer_listener_uninit(ma_spatializer_listener* pListener, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pListener == NULL) {\n        return;\n    }\n\n    if (pListener->_ownsHeap) {\n        ma_free(pListener->_pHeap, pAllocationCallbacks);\n    }\n}\n\nMA_API ma_channel* ma_spatializer_listener_get_channel_map(ma_spatializer_listener* pListener)\n{\n    if (pListener == NULL) {\n        return NULL;\n    }\n\n    return pListener->config.pChannelMapOut;\n}\n\nMA_API void ma_spatializer_listener_set_cone(ma_spatializer_listener* pListener, float innerAngleInRadians, float outerAngleInRadians, float outerGain)\n{\n    if (pListener == NULL) {\n        return;\n    }\n\n    pListener->config.coneInnerAngleInRadians = innerAngleInRadians;\n    pListener->config.coneOuterAngleInRadians = outerAngleInRadians;\n    pListener->config.coneOuterGain           = outerGain;\n}\n\nMA_API void ma_spatializer_listener_get_cone(const ma_spatializer_listener* pListener, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain)\n{\n    if (pListener == NULL) {\n        return;\n    }\n\n    if (pInnerAngleInRadians != NULL) {\n        *pInnerAngleInRadians = pListener->config.coneInnerAngleInRadians;\n    }\n\n    if (pOuterAngleInRadians != NULL) {\n        *pOuterAngleInRadians = pListener->config.coneOuterAngleInRadians;\n    }\n\n    if (pOuterGain != NULL) {\n        *pOuterGain = pListener->config.coneOuterGain;\n    }\n}\n\nMA_API void ma_spatializer_listener_set_position(ma_spatializer_listener* pListener, float x, float y, float z)\n{\n    if (pListener == NULL) {\n        return;\n    }\n\n    ma_atomic_vec3f_set(&pListener->position, ma_vec3f_init_3f(x, y, z));\n}\n\nMA_API ma_vec3f ma_spatializer_listener_get_position(const ma_spatializer_listener* pListener)\n{\n    if (pListener == NULL) {\n        return ma_vec3f_init_3f(0, 0, 0);\n    }\n\n    return ma_atomic_vec3f_get((ma_atomic_vec3f*)&pListener->position); /* Naughty const-cast. It's just for atomically loading the vec3 which should be safe. */\n}\n\nMA_API void ma_spatializer_listener_set_direction(ma_spatializer_listener* pListener, float x, float y, float z)\n{\n    if (pListener == NULL) {\n        return;\n    }\n\n    ma_atomic_vec3f_set(&pListener->direction, ma_vec3f_init_3f(x, y, z));\n}\n\nMA_API ma_vec3f ma_spatializer_listener_get_direction(const ma_spatializer_listener* pListener)\n{\n    if (pListener == NULL) {\n        return ma_vec3f_init_3f(0, 0, -1);\n    }\n\n    return ma_atomic_vec3f_get((ma_atomic_vec3f*)&pListener->direction);    /* Naughty const-cast. It's just for atomically loading the vec3 which should be safe. */\n}\n\nMA_API void ma_spatializer_listener_set_velocity(ma_spatializer_listener* pListener, float x, float y, float z)\n{\n    if (pListener == NULL) {\n        return;\n    }\n\n    ma_atomic_vec3f_set(&pListener->velocity, ma_vec3f_init_3f(x, y, z));\n}\n\nMA_API ma_vec3f ma_spatializer_listener_get_velocity(const ma_spatializer_listener* pListener)\n{\n    if (pListener == NULL) {\n        return ma_vec3f_init_3f(0, 0, 0);\n    }\n\n    return ma_atomic_vec3f_get((ma_atomic_vec3f*)&pListener->velocity); /* Naughty const-cast. It's just for atomically loading the vec3 which should be safe. */\n}\n\nMA_API void ma_spatializer_listener_set_speed_of_sound(ma_spatializer_listener* pListener, float speedOfSound)\n{\n    if (pListener == NULL) {\n        return;\n    }\n\n    pListener->config.speedOfSound = speedOfSound;\n}\n\nMA_API float ma_spatializer_listener_get_speed_of_sound(const ma_spatializer_listener* pListener)\n{\n    if (pListener == NULL) {\n        return 0;\n    }\n\n    return pListener->config.speedOfSound;\n}\n\nMA_API void ma_spatializer_listener_set_world_up(ma_spatializer_listener* pListener, float x, float y, float z)\n{\n    if (pListener == NULL) {\n        return;\n    }\n\n    pListener->config.worldUp = ma_vec3f_init_3f(x, y, z);\n}\n\nMA_API ma_vec3f ma_spatializer_listener_get_world_up(const ma_spatializer_listener* pListener)\n{\n    if (pListener == NULL) {\n        return ma_vec3f_init_3f(0, 1, 0);\n    }\n\n    return pListener->config.worldUp;\n}\n\nMA_API void ma_spatializer_listener_set_enabled(ma_spatializer_listener* pListener, ma_bool32 isEnabled)\n{\n    if (pListener == NULL) {\n        return;\n    }\n\n    pListener->isEnabled = isEnabled;\n}\n\nMA_API ma_bool32 ma_spatializer_listener_is_enabled(const ma_spatializer_listener* pListener)\n{\n    if (pListener == NULL) {\n        return MA_FALSE;\n    }\n\n    return pListener->isEnabled;\n}\n\n\n\n\nMA_API ma_spatializer_config ma_spatializer_config_init(ma_uint32 channelsIn, ma_uint32 channelsOut)\n{\n    ma_spatializer_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.channelsIn                   = channelsIn;\n    config.channelsOut                  = channelsOut;\n    config.pChannelMapIn                = NULL;\n    config.attenuationModel             = ma_attenuation_model_inverse;\n    config.positioning                  = ma_positioning_absolute;\n    config.handedness                   = ma_handedness_right;\n    config.minGain                      = 0;\n    config.maxGain                      = 1;\n    config.minDistance                  = 1;\n    config.maxDistance                  = MA_FLT_MAX;\n    config.rolloff                      = 1;\n    config.coneInnerAngleInRadians      = 6.283185f; /* 360 degrees. */\n    config.coneOuterAngleInRadians      = 6.283185f; /* 360 degress. */\n    config.coneOuterGain                = 0.0f;\n    config.dopplerFactor                = 1;\n    config.directionalAttenuationFactor = 1;\n    config.minSpatializationChannelGain = 0.2f;\n    config.gainSmoothTimeInFrames       = 360;       /* 7.5ms @ 48K. */\n\n    return config;\n}\n\n\nstatic ma_gainer_config ma_spatializer_gainer_config_init(const ma_spatializer_config* pConfig)\n{\n    MA_ASSERT(pConfig != NULL);\n    return ma_gainer_config_init(pConfig->channelsOut, pConfig->gainSmoothTimeInFrames);\n}\n\nstatic ma_result ma_spatializer_validate_config(const ma_spatializer_config* pConfig)\n{\n    MA_ASSERT(pConfig != NULL);\n\n    if (pConfig->channelsIn == 0 || pConfig->channelsOut == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    return MA_SUCCESS;\n}\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t channelMapInOffset;\n    size_t newChannelGainsOffset;\n    size_t gainerOffset;\n} ma_spatializer_heap_layout;\n\nstatic ma_result ma_spatializer_get_heap_layout(const ma_spatializer_config* pConfig, ma_spatializer_heap_layout* pHeapLayout)\n{\n    ma_result result;\n\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_spatializer_validate_config(pConfig);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* Channel map. */\n    pHeapLayout->channelMapInOffset = MA_SIZE_MAX;  /* <-- MA_SIZE_MAX indicates no allocation necessary. */\n    if (pConfig->pChannelMapIn != NULL) {\n        pHeapLayout->channelMapInOffset = pHeapLayout->sizeInBytes;\n        pHeapLayout->sizeInBytes += ma_align_64(sizeof(*pConfig->pChannelMapIn) * pConfig->channelsIn);\n    }\n\n    /* New channel gains for output. */\n    pHeapLayout->newChannelGainsOffset = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += ma_align_64(sizeof(float) * pConfig->channelsOut);\n\n    /* Gainer. */\n    {\n        size_t gainerHeapSizeInBytes;\n        ma_gainer_config gainerConfig;\n\n        gainerConfig = ma_spatializer_gainer_config_init(pConfig);\n\n        result = ma_gainer_get_heap_size(&gainerConfig, &gainerHeapSizeInBytes);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pHeapLayout->gainerOffset = pHeapLayout->sizeInBytes;\n        pHeapLayout->sizeInBytes += ma_align_64(gainerHeapSizeInBytes);\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_spatializer_get_heap_size(const ma_spatializer_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_spatializer_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;  /* Safety. */\n\n    result = ma_spatializer_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\n\nMA_API ma_result ma_spatializer_init_preallocated(const ma_spatializer_config* pConfig, void* pHeap, ma_spatializer* pSpatializer)\n{\n    ma_result result;\n    ma_spatializer_heap_layout heapLayout;\n    ma_gainer_config gainerConfig;\n\n    if (pSpatializer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pSpatializer);\n\n    if (pConfig == NULL || pHeap == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_spatializer_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pSpatializer->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n    pSpatializer->channelsIn                   = pConfig->channelsIn;\n    pSpatializer->channelsOut                  = pConfig->channelsOut;\n    pSpatializer->attenuationModel             = pConfig->attenuationModel;\n    pSpatializer->positioning                  = pConfig->positioning;\n    pSpatializer->handedness                   = pConfig->handedness;\n    pSpatializer->minGain                      = pConfig->minGain;\n    pSpatializer->maxGain                      = pConfig->maxGain;\n    pSpatializer->minDistance                  = pConfig->minDistance;\n    pSpatializer->maxDistance                  = pConfig->maxDistance;\n    pSpatializer->rolloff                      = pConfig->rolloff;\n    pSpatializer->coneInnerAngleInRadians      = pConfig->coneInnerAngleInRadians;\n    pSpatializer->coneOuterAngleInRadians      = pConfig->coneOuterAngleInRadians;\n    pSpatializer->coneOuterGain                = pConfig->coneOuterGain;\n    pSpatializer->dopplerFactor                = pConfig->dopplerFactor;\n    pSpatializer->minSpatializationChannelGain = pConfig->minSpatializationChannelGain;\n    pSpatializer->directionalAttenuationFactor = pConfig->directionalAttenuationFactor;\n    pSpatializer->gainSmoothTimeInFrames       = pConfig->gainSmoothTimeInFrames;\n    ma_atomic_vec3f_init(&pSpatializer->position,  ma_vec3f_init_3f(0, 0,  0));\n    ma_atomic_vec3f_init(&pSpatializer->direction, ma_vec3f_init_3f(0, 0, -1));\n    ma_atomic_vec3f_init(&pSpatializer->velocity,  ma_vec3f_init_3f(0, 0,  0));\n    pSpatializer->dopplerPitch                 = 1;\n\n    /* Swap the forward direction if we're left handed (it was initialized based on right handed). */\n    if (pSpatializer->handedness == ma_handedness_left) {\n        ma_vec3f negDir = ma_vec3f_neg(ma_spatializer_get_direction(pSpatializer));\n        ma_spatializer_set_direction(pSpatializer, negDir.x, negDir.y, negDir.z);\n    }\n\n    /* Channel map. This will be on the heap. */\n    if (pConfig->pChannelMapIn != NULL) {\n        pSpatializer->pChannelMapIn = (ma_channel*)ma_offset_ptr(pHeap, heapLayout.channelMapInOffset);\n        ma_channel_map_copy_or_default(pSpatializer->pChannelMapIn, pSpatializer->channelsIn, pConfig->pChannelMapIn, pSpatializer->channelsIn);\n    }\n\n    /* New channel gains for output channels. */\n    pSpatializer->pNewChannelGainsOut = (float*)ma_offset_ptr(pHeap, heapLayout.newChannelGainsOffset);\n\n    /* Gainer. */\n    gainerConfig = ma_spatializer_gainer_config_init(pConfig);\n\n    result = ma_gainer_init_preallocated(&gainerConfig, ma_offset_ptr(pHeap, heapLayout.gainerOffset), &pSpatializer->gainer);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to initialize the gainer. */\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_spatializer_init(const ma_spatializer_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_spatializer* pSpatializer)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    /* We'll need a heap allocation to retrieve the size. */\n    result = ma_spatializer_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_spatializer_init_preallocated(pConfig, pHeap, pSpatializer);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pSpatializer->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_spatializer_uninit(ma_spatializer* pSpatializer, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_gainer_uninit(&pSpatializer->gainer, pAllocationCallbacks);\n\n    if (pSpatializer->_ownsHeap) {\n        ma_free(pSpatializer->_pHeap, pAllocationCallbacks);\n    }\n}\n\nstatic float ma_calculate_angular_gain(ma_vec3f dirA, ma_vec3f dirB, float coneInnerAngleInRadians, float coneOuterAngleInRadians, float coneOuterGain)\n{\n    /*\n    Angular attenuation.\n\n    Unlike distance gain, the math for this is not specified by the OpenAL spec so we'll just go ahead and figure\n    this out for ourselves at the expense of possibly being inconsistent with other implementations.\n\n    To do cone attenuation, I'm just using the same math that we'd use to implement a basic spotlight in OpenGL. We\n    just need to get the direction from the source to the listener and then do a dot product against that and the\n    direction of the spotlight. Then we just compare that dot product against the cosine of the inner and outer\n    angles. If the dot product is greater than the the outer angle, we just use coneOuterGain. If it's less than\n    the inner angle, we just use a gain of 1. Otherwise we linearly interpolate between 1 and coneOuterGain.\n    */\n    if (coneInnerAngleInRadians < 6.283185f) {\n        float angularGain = 1;\n        float cutoffInner = (float)ma_cosd(coneInnerAngleInRadians*0.5f);\n        float cutoffOuter = (float)ma_cosd(coneOuterAngleInRadians*0.5f);\n        float d;\n\n        d = ma_vec3f_dot(dirA, dirB);\n\n        if (d > cutoffInner) {\n            /* It's inside the inner angle. */\n            angularGain = 1;\n        } else {\n            /* It's outside the inner angle. */\n            if (d > cutoffOuter) {\n                /* It's between the inner and outer angle. We need to linearly interpolate between 1 and coneOuterGain. */\n                angularGain = ma_mix_f32(coneOuterGain, 1, (d - cutoffOuter) / (cutoffInner - cutoffOuter));\n            } else {\n                /* It's outside the outer angle. */\n                angularGain = coneOuterGain;\n            }\n        }\n\n        /*printf(\"d = %f; cutoffInner = %f; cutoffOuter = %f; angularGain = %f\\n\", d, cutoffInner, cutoffOuter, angularGain);*/\n        return angularGain;\n    } else {\n        /* Inner angle is 360 degrees so no need to do any attenuation. */\n        return 1;\n    }\n}\n\nMA_API ma_result ma_spatializer_process_pcm_frames(ma_spatializer* pSpatializer, ma_spatializer_listener* pListener, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    ma_channel* pChannelMapIn  = pSpatializer->pChannelMapIn;\n    ma_channel* pChannelMapOut = pListener->config.pChannelMapOut;\n\n    if (pSpatializer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* If we're not spatializing we need to run an optimized path. */\n    if (ma_atomic_load_i32(&pSpatializer->attenuationModel) == ma_attenuation_model_none) {\n        if (ma_spatializer_listener_is_enabled(pListener)) {\n            /* No attenuation is required, but we'll need to do some channel conversion. */\n            if (pSpatializer->channelsIn == pSpatializer->channelsOut) {\n                ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, ma_format_f32, pSpatializer->channelsIn);\n            } else {\n                ma_channel_map_apply_f32((float*)pFramesOut, pChannelMapOut, pSpatializer->channelsOut, (const float*)pFramesIn, pChannelMapIn, pSpatializer->channelsIn, frameCount, ma_channel_mix_mode_rectangular, ma_mono_expansion_mode_default);   /* Safe casts to float* because f32 is the only supported format. */\n            }\n        } else {\n            /* The listener is disabled. Output silence. */\n            ma_silence_pcm_frames(pFramesOut, frameCount, ma_format_f32, pSpatializer->channelsOut);\n        }\n\n        /*\n        We're not doing attenuation so don't bother with doppler for now. I'm not sure if this is\n        the correct thinking so might need to review this later.\n        */\n        pSpatializer->dopplerPitch = 1;\n    } else {\n        /*\n        Let's first determine which listener the sound is closest to. Need to keep in mind that we\n        might not have a world or any listeners, in which case we just spatializer based on the\n        listener being positioned at the origin (0, 0, 0).\n        */\n        ma_vec3f relativePosNormalized;\n        ma_vec3f relativePos;   /* The position relative to the listener. */\n        ma_vec3f relativeDir;   /* The direction of the sound, relative to the listener. */\n        ma_vec3f listenerVel;   /* The volocity of the listener. For doppler pitch calculation. */\n        float speedOfSound;\n        float distance = 0;\n        float gain = 1;\n        ma_uint32 iChannel;\n        const ma_uint32 channelsOut = pSpatializer->channelsOut;\n        const ma_uint32 channelsIn  = pSpatializer->channelsIn;\n        float minDistance = ma_spatializer_get_min_distance(pSpatializer);\n        float maxDistance = ma_spatializer_get_max_distance(pSpatializer);\n        float rolloff = ma_spatializer_get_rolloff(pSpatializer);\n        float dopplerFactor = ma_spatializer_get_doppler_factor(pSpatializer);\n\n        /*\n        We'll need the listener velocity for doppler pitch calculations. The speed of sound is\n        defined by the listener, so we'll grab that here too.\n        */\n        if (pListener != NULL) {\n            listenerVel  = ma_spatializer_listener_get_velocity(pListener);\n            speedOfSound = pListener->config.speedOfSound;\n        } else {\n            listenerVel  = ma_vec3f_init_3f(0, 0, 0);\n            speedOfSound = MA_DEFAULT_SPEED_OF_SOUND;\n        }\n\n        if (pListener == NULL || ma_spatializer_get_positioning(pSpatializer) == ma_positioning_relative) {\n            /* There's no listener or we're using relative positioning. */\n            relativePos = ma_spatializer_get_position(pSpatializer);\n            relativeDir = ma_spatializer_get_direction(pSpatializer);\n        } else {\n            /*\n            We've found a listener and we're using absolute positioning. We need to transform the\n            sound's position and direction so that it's relative to listener. Later on we'll use\n            this for determining the factors to apply to each channel to apply the panning effect.\n            */\n            ma_spatializer_get_relative_position_and_direction(pSpatializer, pListener, &relativePos, &relativeDir);\n        }\n\n        distance = ma_vec3f_len(relativePos);\n\n        /* We've gathered the data, so now we can apply some spatialization. */\n        switch (ma_spatializer_get_attenuation_model(pSpatializer)) {\n            case ma_attenuation_model_inverse:\n            {\n                gain = ma_attenuation_inverse(distance, minDistance, maxDistance, rolloff);\n            } break;\n            case ma_attenuation_model_linear:\n            {\n                gain = ma_attenuation_linear(distance, minDistance, maxDistance, rolloff);\n            } break;\n            case ma_attenuation_model_exponential:\n            {\n                gain = ma_attenuation_exponential(distance, minDistance, maxDistance, rolloff);\n            } break;\n            case ma_attenuation_model_none:\n            default:\n            {\n                gain = 1;\n            } break;\n        }\n\n        /* Normalize the position. */\n        if (distance > 0.001f) {\n            float distanceInv = 1/distance;\n            relativePosNormalized    = relativePos;\n            relativePosNormalized.x *= distanceInv;\n            relativePosNormalized.y *= distanceInv;\n            relativePosNormalized.z *= distanceInv;\n        } else {\n            distance = 0;\n            relativePosNormalized = ma_vec3f_init_3f(0, 0, 0);\n        }\n\n        /*\n        Angular attenuation.\n\n        Unlike distance gain, the math for this is not specified by the OpenAL spec so we'll just go ahead and figure\n        this out for ourselves at the expense of possibly being inconsistent with other implementations.\n\n        To do cone attenuation, I'm just using the same math that we'd use to implement a basic spotlight in OpenGL. We\n        just need to get the direction from the source to the listener and then do a dot product against that and the\n        direction of the spotlight. Then we just compare that dot product against the cosine of the inner and outer\n        angles. If the dot product is greater than the the outer angle, we just use coneOuterGain. If it's less than\n        the inner angle, we just use a gain of 1. Otherwise we linearly interpolate between 1 and coneOuterGain.\n        */\n        if (distance > 0) {\n            /* Source anglular gain. */\n            float spatializerConeInnerAngle;\n            float spatializerConeOuterAngle;\n            float spatializerConeOuterGain;\n            ma_spatializer_get_cone(pSpatializer, &spatializerConeInnerAngle, &spatializerConeOuterAngle, &spatializerConeOuterGain);\n\n            gain *= ma_calculate_angular_gain(relativeDir, ma_vec3f_neg(relativePosNormalized), spatializerConeInnerAngle, spatializerConeOuterAngle, spatializerConeOuterGain);\n\n            /*\n            We're supporting angular gain on the listener as well for those who want to reduce the volume of sounds that\n            are positioned behind the listener. On default settings, this will have no effect.\n            */\n            if (pListener != NULL && pListener->config.coneInnerAngleInRadians < 6.283185f) {\n                ma_vec3f listenerDirection;\n                float listenerInnerAngle;\n                float listenerOuterAngle;\n                float listenerOuterGain;\n\n                if (pListener->config.handedness == ma_handedness_right) {\n                    listenerDirection = ma_vec3f_init_3f(0, 0, -1);\n                } else {\n                    listenerDirection = ma_vec3f_init_3f(0, 0, +1);\n                }\n\n                listenerInnerAngle = pListener->config.coneInnerAngleInRadians;\n                listenerOuterAngle = pListener->config.coneOuterAngleInRadians;\n                listenerOuterGain  = pListener->config.coneOuterGain;\n\n                gain *= ma_calculate_angular_gain(listenerDirection, relativePosNormalized, listenerInnerAngle, listenerOuterAngle, listenerOuterGain);\n            }\n        } else {\n            /* The sound is right on top of the listener. Don't do any angular attenuation. */\n        }\n\n\n        /* Clamp the gain. */\n        gain = ma_clamp(gain, ma_spatializer_get_min_gain(pSpatializer), ma_spatializer_get_max_gain(pSpatializer));\n\n        /*\n        The gain needs to be applied per-channel here. The spatialization code below will be changing the per-channel\n        gains which will then eventually be passed into the gainer which will deal with smoothing the gain transitions\n        to avoid harsh changes in gain.\n        */\n        for (iChannel = 0; iChannel < channelsOut; iChannel += 1) {\n            pSpatializer->pNewChannelGainsOut[iChannel] = gain;\n        }\n\n        /*\n        Convert to our output channel count. If the listener is disabled we just output silence here. We cannot ignore\n        the whole section of code here because we need to update some internal spatialization state.\n        */\n        if (ma_spatializer_listener_is_enabled(pListener)) {\n            ma_channel_map_apply_f32((float*)pFramesOut, pChannelMapOut, channelsOut, (const float*)pFramesIn, pChannelMapIn, channelsIn, frameCount, ma_channel_mix_mode_rectangular, ma_mono_expansion_mode_default);\n        } else {\n            ma_silence_pcm_frames(pFramesOut, frameCount, ma_format_f32, pSpatializer->channelsOut);\n        }\n\n\n        /*\n        Panning. This is where we'll apply the gain and convert to the output channel count. We have an optimized path for\n        when we're converting to a mono stream. In that case we don't really need to do any panning - we just apply the\n        gain to the final output.\n        */\n        /*printf(\"distance=%f; gain=%f\\n\", distance, gain);*/\n\n        /* We must have a valid channel map here to ensure we spatialize properly. */\n        MA_ASSERT(pChannelMapOut != NULL);\n\n        /*\n        We're not converting to mono so we'll want to apply some panning. This is where the feeling of something being\n        to the left, right, infront or behind the listener is calculated. I'm just using a basic model here. Note that\n        the code below is not based on any specific algorithm. I'm just implementing this off the top of my head and\n        seeing how it goes. There might be better ways to do this.\n\n        To determine the direction of the sound relative to a speaker I'm using dot products. Each speaker is given a\n        direction. For example, the left channel in a stereo system will be -1 on the X axis and the right channel will\n        be +1 on the X axis. A dot product is performed against the direction vector of the channel and the normalized\n        position of the sound.\n        */\n\n        /*\n        Calculate our per-channel gains. We do this based on the normalized relative position of the sound and it's\n        relation to the direction of the channel.\n        */\n        if (distance > 0) {\n            ma_vec3f unitPos = relativePos;\n            float distanceInv = 1/distance;\n            unitPos.x *= distanceInv;\n            unitPos.y *= distanceInv;\n            unitPos.z *= distanceInv;\n\n            for (iChannel = 0; iChannel < channelsOut; iChannel += 1) {\n                ma_channel channelOut;\n                float d;\n                float dMin;\n\n                channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannel);\n                if (ma_is_spatial_channel_position(channelOut)) {\n                    d = ma_mix_f32_fast(1, ma_vec3f_dot(unitPos, ma_get_channel_direction(channelOut)), ma_spatializer_get_directional_attenuation_factor(pSpatializer));\n                } else {\n                    d = 1;  /* It's not a spatial channel so there's no real notion of direction. */\n                }\n\n                /*\n                In my testing, if the panning effect is too aggressive it makes spatialization feel uncomfortable.\n                The \"dMin\" variable below is used to control the aggressiveness of the panning effect. When set to\n                0, panning will be most extreme and any sounds that are positioned on the opposite side of the\n                speaker will be completely silent from that speaker. Not only does this feel uncomfortable, it\n                doesn't even remotely represent the real world at all because sounds that come from your right side\n                are still clearly audible from your left side. Setting \"dMin\" to 1 will result in no panning at\n                all, which is also not ideal. By setting it to something greater than 0, the spatialization effect\n                becomes much less dramatic and a lot more bearable.\n\n                Summary: 0 = more extreme panning; 1 = no panning.\n                */\n                dMin = pSpatializer->minSpatializationChannelGain;\n\n                /*\n                At this point, \"d\" will be positive if the sound is on the same side as the channel and negative if\n                it's on the opposite side. It will be in the range of -1..1. There's two ways I can think of to\n                calculate a panning value. The first is to simply convert it to 0..1, however this has a problem\n                which I'm not entirely happy with. Considering a stereo system, when a sound is positioned right\n                in front of the listener it'll result in each speaker getting a gain of 0.5. I don't know if I like\n                the idea of having a scaling factor of 0.5 being applied to a sound when it's sitting right in front\n                of the listener. I would intuitively expect that to be played at full volume, or close to it.\n\n                The second idea I think of is to only apply a reduction in gain when the sound is on the opposite\n                side of the speaker. That is, reduce the gain only when the dot product is negative. The problem\n                with this is that there will not be any attenuation as the sound sweeps around the 180 degrees\n                where the dot product is positive. The idea with this option is that you leave the gain at 1 when\n                the sound is being played on the same side as the speaker and then you just reduce the volume when\n                the sound is on the other side.\n\n                The summarize, I think the first option should give a better sense of spatialization, but the second\n                option is better for preserving the sound's power.\n\n                UPDATE: In my testing, I find the first option to sound better. You can feel the sense of space a\n                bit better, but you can also hear the reduction in volume when it's right in front.\n                */\n                #if 1\n                {\n                    /*\n                    Scale the dot product from -1..1 to 0..1. Will result in a sound directly in front losing power\n                    by being played at 0.5 gain.\n                    */\n                    d = (d + 1) * 0.5f;  /* -1..1 to 0..1 */\n                    d = ma_max(d, dMin);\n                    pSpatializer->pNewChannelGainsOut[iChannel] *= d;\n                }\n                #else\n                {\n                    /*\n                    Only reduce the volume of the sound if it's on the opposite side. This path keeps the volume more\n                    consistent, but comes at the expense of a worse sense of space and positioning.\n                    */\n                    if (d < 0) {\n                        d += 1; /* Move into the positive range. */\n                        d = ma_max(d, dMin);\n                        channelGainsOut[iChannel] *= d;\n                    }\n                }\n                #endif\n            }\n        } else {\n            /* Assume the sound is right on top of us. Don't do any panning. */\n        }\n\n        /* Now we need to apply the volume to each channel. This needs to run through the gainer to ensure we get a smooth volume transition. */\n        ma_gainer_set_gains(&pSpatializer->gainer, pSpatializer->pNewChannelGainsOut);\n        ma_gainer_process_pcm_frames(&pSpatializer->gainer, pFramesOut, pFramesOut, frameCount);\n\n        /*\n        Before leaving we'll want to update our doppler pitch so that the caller can apply some\n        pitch shifting if they desire. Note that we need to negate the relative position here\n        because the doppler calculation needs to be source-to-listener, but ours is listener-to-\n        source.\n        */\n        if (dopplerFactor > 0) {\n            pSpatializer->dopplerPitch = ma_doppler_pitch(ma_vec3f_sub(ma_spatializer_listener_get_position(pListener), ma_spatializer_get_position(pSpatializer)), ma_spatializer_get_velocity(pSpatializer), listenerVel, speedOfSound, dopplerFactor);\n        } else {\n            pSpatializer->dopplerPitch = 1;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_spatializer_set_master_volume(ma_spatializer* pSpatializer, float volume)\n{\n    if (pSpatializer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_gainer_set_master_volume(&pSpatializer->gainer, volume);\n}\n\nMA_API ma_result ma_spatializer_get_master_volume(const ma_spatializer* pSpatializer, float* pVolume)\n{\n    if (pSpatializer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_gainer_get_master_volume(&pSpatializer->gainer, pVolume);\n}\n\nMA_API ma_uint32 ma_spatializer_get_input_channels(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return 0;\n    }\n\n    return pSpatializer->channelsIn;\n}\n\nMA_API ma_uint32 ma_spatializer_get_output_channels(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return 0;\n    }\n\n    return pSpatializer->channelsOut;\n}\n\nMA_API void ma_spatializer_set_attenuation_model(ma_spatializer* pSpatializer, ma_attenuation_model attenuationModel)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_atomic_exchange_i32(&pSpatializer->attenuationModel, attenuationModel);\n}\n\nMA_API ma_attenuation_model ma_spatializer_get_attenuation_model(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return ma_attenuation_model_none;\n    }\n\n    return (ma_attenuation_model)ma_atomic_load_i32(&pSpatializer->attenuationModel);\n}\n\nMA_API void ma_spatializer_set_positioning(ma_spatializer* pSpatializer, ma_positioning positioning)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_atomic_exchange_i32(&pSpatializer->positioning, positioning);\n}\n\nMA_API ma_positioning ma_spatializer_get_positioning(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return ma_positioning_absolute;\n    }\n\n    return (ma_positioning)ma_atomic_load_i32(&pSpatializer->positioning);\n}\n\nMA_API void ma_spatializer_set_rolloff(ma_spatializer* pSpatializer, float rolloff)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_atomic_exchange_f32(&pSpatializer->rolloff, rolloff);\n}\n\nMA_API float ma_spatializer_get_rolloff(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return 0;\n    }\n\n    return ma_atomic_load_f32(&pSpatializer->rolloff);\n}\n\nMA_API void ma_spatializer_set_min_gain(ma_spatializer* pSpatializer, float minGain)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_atomic_exchange_f32(&pSpatializer->minGain, minGain);\n}\n\nMA_API float ma_spatializer_get_min_gain(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return 0;\n    }\n\n    return ma_atomic_load_f32(&pSpatializer->minGain);\n}\n\nMA_API void ma_spatializer_set_max_gain(ma_spatializer* pSpatializer, float maxGain)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_atomic_exchange_f32(&pSpatializer->maxGain, maxGain);\n}\n\nMA_API float ma_spatializer_get_max_gain(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return 0;\n    }\n\n    return ma_atomic_load_f32(&pSpatializer->maxGain);\n}\n\nMA_API void ma_spatializer_set_min_distance(ma_spatializer* pSpatializer, float minDistance)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_atomic_exchange_f32(&pSpatializer->minDistance, minDistance);\n}\n\nMA_API float ma_spatializer_get_min_distance(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return 0;\n    }\n\n    return ma_atomic_load_f32(&pSpatializer->minDistance);\n}\n\nMA_API void ma_spatializer_set_max_distance(ma_spatializer* pSpatializer, float maxDistance)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_atomic_exchange_f32(&pSpatializer->maxDistance, maxDistance);\n}\n\nMA_API float ma_spatializer_get_max_distance(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return 0;\n    }\n\n    return ma_atomic_load_f32(&pSpatializer->maxDistance);\n}\n\nMA_API void ma_spatializer_set_cone(ma_spatializer* pSpatializer, float innerAngleInRadians, float outerAngleInRadians, float outerGain)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_atomic_exchange_f32(&pSpatializer->coneInnerAngleInRadians, innerAngleInRadians);\n    ma_atomic_exchange_f32(&pSpatializer->coneOuterAngleInRadians, outerAngleInRadians);\n    ma_atomic_exchange_f32(&pSpatializer->coneOuterGain,           outerGain);\n}\n\nMA_API void ma_spatializer_get_cone(const ma_spatializer* pSpatializer, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    if (pInnerAngleInRadians != NULL) {\n        *pInnerAngleInRadians = ma_atomic_load_f32(&pSpatializer->coneInnerAngleInRadians);\n    }\n\n    if (pOuterAngleInRadians != NULL) {\n        *pOuterAngleInRadians = ma_atomic_load_f32(&pSpatializer->coneOuterAngleInRadians);\n    }\n\n    if (pOuterGain != NULL) {\n        *pOuterGain = ma_atomic_load_f32(&pSpatializer->coneOuterGain);\n    }\n}\n\nMA_API void ma_spatializer_set_doppler_factor(ma_spatializer* pSpatializer, float dopplerFactor)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_atomic_exchange_f32(&pSpatializer->dopplerFactor, dopplerFactor);\n}\n\nMA_API float ma_spatializer_get_doppler_factor(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return 1;\n    }\n\n    return ma_atomic_load_f32(&pSpatializer->dopplerFactor);\n}\n\nMA_API void ma_spatializer_set_directional_attenuation_factor(ma_spatializer* pSpatializer, float directionalAttenuationFactor)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_atomic_exchange_f32(&pSpatializer->directionalAttenuationFactor, directionalAttenuationFactor);\n}\n\nMA_API float ma_spatializer_get_directional_attenuation_factor(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return 1;\n    }\n\n    return ma_atomic_load_f32(&pSpatializer->directionalAttenuationFactor);\n}\n\nMA_API void ma_spatializer_set_position(ma_spatializer* pSpatializer, float x, float y, float z)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_atomic_vec3f_set(&pSpatializer->position, ma_vec3f_init_3f(x, y, z));\n}\n\nMA_API ma_vec3f ma_spatializer_get_position(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return ma_vec3f_init_3f(0, 0, 0);\n    }\n\n    return ma_atomic_vec3f_get((ma_atomic_vec3f*)&pSpatializer->position);  /* Naughty const-cast. It's just for atomically loading the vec3 which should be safe. */\n}\n\nMA_API void ma_spatializer_set_direction(ma_spatializer* pSpatializer, float x, float y, float z)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_atomic_vec3f_set(&pSpatializer->direction, ma_vec3f_init_3f(x, y, z));\n}\n\nMA_API ma_vec3f ma_spatializer_get_direction(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return ma_vec3f_init_3f(0, 0, -1);\n    }\n\n    return ma_atomic_vec3f_get((ma_atomic_vec3f*)&pSpatializer->direction); /* Naughty const-cast. It's just for atomically loading the vec3 which should be safe. */\n}\n\nMA_API void ma_spatializer_set_velocity(ma_spatializer* pSpatializer, float x, float y, float z)\n{\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    ma_atomic_vec3f_set(&pSpatializer->velocity, ma_vec3f_init_3f(x, y, z));\n}\n\nMA_API ma_vec3f ma_spatializer_get_velocity(const ma_spatializer* pSpatializer)\n{\n    if (pSpatializer == NULL) {\n        return ma_vec3f_init_3f(0, 0, 0);\n    }\n\n    return ma_atomic_vec3f_get((ma_atomic_vec3f*)&pSpatializer->velocity);  /* Naughty const-cast. It's just for atomically loading the vec3 which should be safe. */\n}\n\nMA_API void ma_spatializer_get_relative_position_and_direction(const ma_spatializer* pSpatializer, const ma_spatializer_listener* pListener, ma_vec3f* pRelativePos, ma_vec3f* pRelativeDir)\n{\n    if (pRelativePos != NULL) {\n        pRelativePos->x = 0;\n        pRelativePos->y = 0;\n        pRelativePos->z = 0;\n    }\n\n    if (pRelativeDir != NULL) {\n        pRelativeDir->x = 0;\n        pRelativeDir->y = 0;\n        pRelativeDir->z = -1;\n    }\n\n    if (pSpatializer == NULL) {\n        return;\n    }\n\n    if (pListener == NULL || ma_spatializer_get_positioning(pSpatializer) == ma_positioning_relative) {\n        /* There's no listener or we're using relative positioning. */\n        if (pRelativePos != NULL) {\n            *pRelativePos = ma_spatializer_get_position(pSpatializer);\n        }\n        if (pRelativeDir != NULL) {\n            *pRelativeDir = ma_spatializer_get_direction(pSpatializer);\n        }\n    } else {\n        ma_vec3f spatializerPosition;\n        ma_vec3f spatializerDirection;\n        ma_vec3f listenerPosition;\n        ma_vec3f listenerDirection;\n        ma_vec3f v;\n        ma_vec3f axisX;\n        ma_vec3f axisY;\n        ma_vec3f axisZ;\n        float m[4][4];\n\n        spatializerPosition  = ma_spatializer_get_position(pSpatializer);\n        spatializerDirection = ma_spatializer_get_direction(pSpatializer);\n        listenerPosition     = ma_spatializer_listener_get_position(pListener);\n        listenerDirection    = ma_spatializer_listener_get_direction(pListener);\n\n        /*\n        We need to calcualte the right vector from our forward and up vectors. This is done with\n        a cross product.\n        */\n        axisZ = ma_vec3f_normalize(listenerDirection);                                  /* Normalization required here because we can't trust the caller. */\n        axisX = ma_vec3f_normalize(ma_vec3f_cross(axisZ, pListener->config.worldUp));   /* Normalization required here because the world up vector may not be perpendicular with the forward vector. */\n\n        /*\n        The calculation of axisX above can result in a zero-length vector if the listener is\n        looking straight up on the Y axis. We'll need to fall back to a +X in this case so that\n        the calculations below don't fall apart. This is where a quaternion based listener and\n        sound orientation would come in handy.\n        */\n        if (ma_vec3f_len2(axisX) == 0) {\n            axisX = ma_vec3f_init_3f(1, 0, 0);\n        }\n\n        axisY = ma_vec3f_cross(axisX, axisZ);                                           /* No normalization is required here because axisX and axisZ are unit length and perpendicular. */\n\n        /*\n        We need to swap the X axis if we're left handed because otherwise the cross product above\n        will have resulted in it pointing in the wrong direction (right handed was assumed in the\n        cross products above).\n        */\n        if (pListener->config.handedness == ma_handedness_left) {\n            axisX = ma_vec3f_neg(axisX);\n        }\n\n        /* Lookat. */\n        m[0][0] =  axisX.x; m[1][0] =  axisX.y; m[2][0] =  axisX.z; m[3][0] = -ma_vec3f_dot(axisX,               listenerPosition);\n        m[0][1] =  axisY.x; m[1][1] =  axisY.y; m[2][1] =  axisY.z; m[3][1] = -ma_vec3f_dot(axisY,               listenerPosition);\n        m[0][2] = -axisZ.x; m[1][2] = -axisZ.y; m[2][2] = -axisZ.z; m[3][2] = -ma_vec3f_dot(ma_vec3f_neg(axisZ), listenerPosition);\n        m[0][3] = 0;        m[1][3] = 0;        m[2][3] = 0;        m[3][3] = 1;\n\n        /*\n        Multiply the lookat matrix by the spatializer position to transform it to listener\n        space. This allows calculations to work based on the sound being relative to the\n        origin which makes things simpler.\n        */\n        if (pRelativePos != NULL) {\n            v = spatializerPosition;\n            pRelativePos->x = m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * 1;\n            pRelativePos->y = m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * 1;\n            pRelativePos->z = m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z + m[3][2] * 1;\n        }\n\n        /*\n        The direction of the sound needs to also be transformed so that it's relative to the\n        rotation of the listener.\n        */\n        if (pRelativeDir != NULL) {\n            v = spatializerDirection;\n            pRelativeDir->x = m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z;\n            pRelativeDir->y = m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z;\n            pRelativeDir->z = m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z;\n        }\n    }\n}\n\n\n\n\n/**************************************************************************************************************************************************************\n\nResampling\n\n**************************************************************************************************************************************************************/\nMA_API ma_linear_resampler_config ma_linear_resampler_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut)\n{\n    ma_linear_resampler_config config;\n    MA_ZERO_OBJECT(&config);\n    config.format           = format;\n    config.channels         = channels;\n    config.sampleRateIn     = sampleRateIn;\n    config.sampleRateOut    = sampleRateOut;\n    config.lpfOrder         = ma_min(MA_DEFAULT_RESAMPLER_LPF_ORDER, MA_MAX_FILTER_ORDER);\n    config.lpfNyquistFactor = 1;\n\n    return config;\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t x0Offset;\n    size_t x1Offset;\n    size_t lpfOffset;\n} ma_linear_resampler_heap_layout;\n\n\nstatic void ma_linear_resampler_adjust_timer_for_new_rate(ma_linear_resampler* pResampler, ma_uint32 oldSampleRateOut, ma_uint32 newSampleRateOut)\n{\n    /*\n    So what's happening here? Basically we need to adjust the fractional component of the time advance based on the new rate. The old time advance will\n    be based on the old sample rate, but we are needing to adjust it to that it's based on the new sample rate.\n    */\n    ma_uint32 oldRateTimeWhole = pResampler->inTimeFrac / oldSampleRateOut;  /* <-- This should almost never be anything other than 0, but leaving it here to make this more general and robust just in case. */\n    ma_uint32 oldRateTimeFract = pResampler->inTimeFrac % oldSampleRateOut;\n\n    pResampler->inTimeFrac =\n         (oldRateTimeWhole * newSampleRateOut) +\n        ((oldRateTimeFract * newSampleRateOut) / oldSampleRateOut);\n\n    /* Make sure the fractional part is less than the output sample rate. */\n    pResampler->inTimeInt += pResampler->inTimeFrac / pResampler->config.sampleRateOut;\n    pResampler->inTimeFrac = pResampler->inTimeFrac % pResampler->config.sampleRateOut;\n}\n\nstatic ma_result ma_linear_resampler_set_rate_internal(ma_linear_resampler* pResampler, void* pHeap, ma_linear_resampler_heap_layout* pHeapLayout, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut, ma_bool32 isResamplerAlreadyInitialized)\n{\n    ma_result result;\n    ma_uint32 gcf;\n    ma_uint32 lpfSampleRate;\n    double lpfCutoffFrequency;\n    ma_lpf_config lpfConfig;\n    ma_uint32 oldSampleRateOut; /* Required for adjusting time advance down the bottom. */\n\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (sampleRateIn == 0 || sampleRateOut == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    oldSampleRateOut = pResampler->config.sampleRateOut;\n\n    pResampler->config.sampleRateIn  = sampleRateIn;\n    pResampler->config.sampleRateOut = sampleRateOut;\n\n    /* Simplify the sample rate. */\n    gcf = ma_gcf_u32(pResampler->config.sampleRateIn, pResampler->config.sampleRateOut);\n    pResampler->config.sampleRateIn  /= gcf;\n    pResampler->config.sampleRateOut /= gcf;\n\n    /* Always initialize the low-pass filter, even when the order is 0. */\n    if (pResampler->config.lpfOrder > MA_MAX_FILTER_ORDER) {\n        return MA_INVALID_ARGS;\n    }\n\n    lpfSampleRate      = (ma_uint32)(ma_max(pResampler->config.sampleRateIn, pResampler->config.sampleRateOut));\n    lpfCutoffFrequency = (   double)(ma_min(pResampler->config.sampleRateIn, pResampler->config.sampleRateOut) * 0.5 * pResampler->config.lpfNyquistFactor);\n\n    lpfConfig = ma_lpf_config_init(pResampler->config.format, pResampler->config.channels, lpfSampleRate, lpfCutoffFrequency, pResampler->config.lpfOrder);\n\n    /*\n    If the resampler is alreay initialized we don't want to do a fresh initialization of the low-pass filter because it will result in the cached frames\n    getting cleared. Instead we re-initialize the filter which will maintain any cached frames.\n    */\n    if (isResamplerAlreadyInitialized) {\n        result = ma_lpf_reinit(&lpfConfig, &pResampler->lpf);\n    } else {\n        result = ma_lpf_init_preallocated(&lpfConfig, ma_offset_ptr(pHeap, pHeapLayout->lpfOffset), &pResampler->lpf);\n    }\n\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n\n    pResampler->inAdvanceInt  = pResampler->config.sampleRateIn / pResampler->config.sampleRateOut;\n    pResampler->inAdvanceFrac = pResampler->config.sampleRateIn % pResampler->config.sampleRateOut;\n\n    /* Our timer was based on the old rate. We need to adjust it so that it's based on the new rate. */\n    ma_linear_resampler_adjust_timer_for_new_rate(pResampler, oldSampleRateOut, pResampler->config.sampleRateOut);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_linear_resampler_get_heap_layout(const ma_linear_resampler_config* pConfig, ma_linear_resampler_heap_layout* pHeapLayout)\n{\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->format != ma_format_f32 && pConfig->format != ma_format_s16) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->channels == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* x0 */\n    pHeapLayout->x0Offset = pHeapLayout->sizeInBytes;\n    if (pConfig->format == ma_format_f32) {\n        pHeapLayout->sizeInBytes += sizeof(float) * pConfig->channels;\n    } else {\n        pHeapLayout->sizeInBytes += sizeof(ma_int16) * pConfig->channels;\n    }\n\n    /* x1 */\n    pHeapLayout->x1Offset = pHeapLayout->sizeInBytes;\n    if (pConfig->format == ma_format_f32) {\n        pHeapLayout->sizeInBytes += sizeof(float) * pConfig->channels;\n    } else {\n        pHeapLayout->sizeInBytes += sizeof(ma_int16) * pConfig->channels;\n    }\n\n    /* LPF */\n    pHeapLayout->lpfOffset = ma_align_64(pHeapLayout->sizeInBytes);\n    {\n        ma_result result;\n        size_t lpfHeapSizeInBytes;\n        ma_lpf_config lpfConfig = ma_lpf_config_init(pConfig->format, pConfig->channels, 1, 1, pConfig->lpfOrder);  /* Sample rate and cutoff frequency do not matter. */\n\n        result = ma_lpf_get_heap_size(&lpfConfig, &lpfHeapSizeInBytes);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pHeapLayout->sizeInBytes += lpfHeapSizeInBytes;\n    }\n\n    /* Make sure allocation size is aligned. */\n    pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_linear_resampler_get_heap_size(const ma_linear_resampler_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_linear_resampler_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_linear_resampler_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_linear_resampler_init_preallocated(const ma_linear_resampler_config* pConfig, void* pHeap, ma_linear_resampler* pResampler)\n{\n    ma_result result;\n    ma_linear_resampler_heap_layout heapLayout;\n\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pResampler);\n\n    result = ma_linear_resampler_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pResampler->config = *pConfig;\n\n    pResampler->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n    if (pConfig->format == ma_format_f32) {\n        pResampler->x0.f32 = (float*)ma_offset_ptr(pHeap, heapLayout.x0Offset);\n        pResampler->x1.f32 = (float*)ma_offset_ptr(pHeap, heapLayout.x1Offset);\n    } else {\n        pResampler->x0.s16 = (ma_int16*)ma_offset_ptr(pHeap, heapLayout.x0Offset);\n        pResampler->x1.s16 = (ma_int16*)ma_offset_ptr(pHeap, heapLayout.x1Offset);\n    }\n\n    /* Setting the rate will set up the filter and time advances for us. */\n    result = ma_linear_resampler_set_rate_internal(pResampler, pHeap, &heapLayout, pConfig->sampleRateIn, pConfig->sampleRateOut, /* isResamplerAlreadyInitialized = */ MA_FALSE);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pResampler->inTimeInt  = 1;  /* Set this to one to force an input sample to always be loaded for the first output frame. */\n    pResampler->inTimeFrac = 0;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_linear_resampler_init(const ma_linear_resampler_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_linear_resampler* pResampler)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_linear_resampler_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_linear_resampler_init_preallocated(pConfig, pHeap, pResampler);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pResampler->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_linear_resampler_uninit(ma_linear_resampler* pResampler, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pResampler == NULL) {\n        return;\n    }\n\n    ma_lpf_uninit(&pResampler->lpf, pAllocationCallbacks);\n\n    if (pResampler->_ownsHeap) {\n        ma_free(pResampler->_pHeap, pAllocationCallbacks);\n    }\n}\n\nstatic MA_INLINE ma_int16 ma_linear_resampler_mix_s16(ma_int16 x, ma_int16 y, ma_int32 a, const ma_int32 shift)\n{\n    ma_int32 b;\n    ma_int32 c;\n    ma_int32 r;\n\n    MA_ASSERT(a <= (1<<shift));\n\n    b = x * ((1<<shift) - a);\n    c = y * a;\n    r = b + c;\n\n    return (ma_int16)(r >> shift);\n}\n\nstatic void ma_linear_resampler_interpolate_frame_s16(ma_linear_resampler* pResampler, ma_int16* MA_RESTRICT pFrameOut)\n{\n    ma_uint32 c;\n    ma_uint32 a;\n    const ma_uint32 channels = pResampler->config.channels;\n    const ma_uint32 shift = 12;\n\n    MA_ASSERT(pResampler != NULL);\n    MA_ASSERT(pFrameOut  != NULL);\n\n    a = (pResampler->inTimeFrac << shift) / pResampler->config.sampleRateOut;\n\n    MA_ASSUME(channels > 0);\n    for (c = 0; c < channels; c += 1) {\n        ma_int16 s = ma_linear_resampler_mix_s16(pResampler->x0.s16[c], pResampler->x1.s16[c], a, shift);\n        pFrameOut[c] = s;\n    }\n}\n\n\nstatic void ma_linear_resampler_interpolate_frame_f32(ma_linear_resampler* pResampler, float* MA_RESTRICT pFrameOut)\n{\n    ma_uint32 c;\n    float a;\n    const ma_uint32 channels = pResampler->config.channels;\n\n    MA_ASSERT(pResampler != NULL);\n    MA_ASSERT(pFrameOut  != NULL);\n\n    a = (float)pResampler->inTimeFrac / pResampler->config.sampleRateOut;\n\n    MA_ASSUME(channels > 0);\n    for (c = 0; c < channels; c += 1) {\n        float s = ma_mix_f32_fast(pResampler->x0.f32[c], pResampler->x1.f32[c], a);\n        pFrameOut[c] = s;\n    }\n}\n\nstatic ma_result ma_linear_resampler_process_pcm_frames_s16_downsample(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    const ma_int16* pFramesInS16;\n    /* */ ma_int16* pFramesOutS16;\n    ma_uint64 frameCountIn;\n    ma_uint64 frameCountOut;\n    ma_uint64 framesProcessedIn;\n    ma_uint64 framesProcessedOut;\n\n    MA_ASSERT(pResampler     != NULL);\n    MA_ASSERT(pFrameCountIn  != NULL);\n    MA_ASSERT(pFrameCountOut != NULL);\n\n    pFramesInS16       = (const ma_int16*)pFramesIn;\n    pFramesOutS16      = (      ma_int16*)pFramesOut;\n    frameCountIn       = *pFrameCountIn;\n    frameCountOut      = *pFrameCountOut;\n    framesProcessedIn  = 0;\n    framesProcessedOut = 0;\n\n    while (framesProcessedOut < frameCountOut) {\n        /* Before interpolating we need to load the buffers. When doing this we need to ensure we run every input sample through the filter. */\n        while (pResampler->inTimeInt > 0 && frameCountIn > framesProcessedIn) {\n            ma_uint32 iChannel;\n\n            if (pFramesInS16 != NULL) {\n                for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) {\n                    pResampler->x0.s16[iChannel] = pResampler->x1.s16[iChannel];\n                    pResampler->x1.s16[iChannel] = pFramesInS16[iChannel];\n                }\n                pFramesInS16 += pResampler->config.channels;\n            } else {\n                for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) {\n                    pResampler->x0.s16[iChannel] = pResampler->x1.s16[iChannel];\n                    pResampler->x1.s16[iChannel] = 0;\n                }\n            }\n\n            /* Filter. Do not apply filtering if sample rates are the same or else you'll get dangerous glitching. */\n            if (pResampler->config.sampleRateIn != pResampler->config.sampleRateOut) {\n                ma_lpf_process_pcm_frame_s16(&pResampler->lpf, pResampler->x1.s16, pResampler->x1.s16);\n            }\n\n            framesProcessedIn     += 1;\n            pResampler->inTimeInt -= 1;\n        }\n\n        if (pResampler->inTimeInt > 0) {\n            break;  /* Ran out of input data. */\n        }\n\n        /* Getting here means the frames have been loaded and filtered and we can generate the next output frame. */\n        if (pFramesOutS16 != NULL) {\n            MA_ASSERT(pResampler->inTimeInt == 0);\n            ma_linear_resampler_interpolate_frame_s16(pResampler, pFramesOutS16);\n\n            pFramesOutS16 += pResampler->config.channels;\n        }\n\n        framesProcessedOut += 1;\n\n        /* Advance time forward. */\n        pResampler->inTimeInt  += pResampler->inAdvanceInt;\n        pResampler->inTimeFrac += pResampler->inAdvanceFrac;\n        if (pResampler->inTimeFrac >= pResampler->config.sampleRateOut) {\n            pResampler->inTimeFrac -= pResampler->config.sampleRateOut;\n            pResampler->inTimeInt  += 1;\n        }\n    }\n\n    *pFrameCountIn  = framesProcessedIn;\n    *pFrameCountOut = framesProcessedOut;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_linear_resampler_process_pcm_frames_s16_upsample(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    const ma_int16* pFramesInS16;\n    /* */ ma_int16* pFramesOutS16;\n    ma_uint64 frameCountIn;\n    ma_uint64 frameCountOut;\n    ma_uint64 framesProcessedIn;\n    ma_uint64 framesProcessedOut;\n\n    MA_ASSERT(pResampler     != NULL);\n    MA_ASSERT(pFrameCountIn  != NULL);\n    MA_ASSERT(pFrameCountOut != NULL);\n\n    pFramesInS16       = (const ma_int16*)pFramesIn;\n    pFramesOutS16      = (      ma_int16*)pFramesOut;\n    frameCountIn       = *pFrameCountIn;\n    frameCountOut      = *pFrameCountOut;\n    framesProcessedIn  = 0;\n    framesProcessedOut = 0;\n\n    while (framesProcessedOut < frameCountOut) {\n        /* Before interpolating we need to load the buffers. */\n        while (pResampler->inTimeInt > 0 && frameCountIn > framesProcessedIn) {\n            ma_uint32 iChannel;\n\n            if (pFramesInS16 != NULL) {\n                for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) {\n                    pResampler->x0.s16[iChannel] = pResampler->x1.s16[iChannel];\n                    pResampler->x1.s16[iChannel] = pFramesInS16[iChannel];\n                }\n                pFramesInS16 += pResampler->config.channels;\n            } else {\n                for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) {\n                    pResampler->x0.s16[iChannel] = pResampler->x1.s16[iChannel];\n                    pResampler->x1.s16[iChannel] = 0;\n                }\n            }\n\n            framesProcessedIn     += 1;\n            pResampler->inTimeInt -= 1;\n        }\n\n        if (pResampler->inTimeInt > 0) {\n            break;  /* Ran out of input data. */\n        }\n\n        /* Getting here means the frames have been loaded and we can generate the next output frame. */\n        if (pFramesOutS16 != NULL) {\n            MA_ASSERT(pResampler->inTimeInt == 0);\n            ma_linear_resampler_interpolate_frame_s16(pResampler, pFramesOutS16);\n\n            /* Filter. Do not apply filtering if sample rates are the same or else you'll get dangerous glitching. */\n            if (pResampler->config.sampleRateIn != pResampler->config.sampleRateOut) {\n                ma_lpf_process_pcm_frame_s16(&pResampler->lpf, pFramesOutS16, pFramesOutS16);\n            }\n\n            pFramesOutS16 += pResampler->config.channels;\n        }\n\n        framesProcessedOut += 1;\n\n        /* Advance time forward. */\n        pResampler->inTimeInt  += pResampler->inAdvanceInt;\n        pResampler->inTimeFrac += pResampler->inAdvanceFrac;\n        if (pResampler->inTimeFrac >= pResampler->config.sampleRateOut) {\n            pResampler->inTimeFrac -= pResampler->config.sampleRateOut;\n            pResampler->inTimeInt  += 1;\n        }\n    }\n\n    *pFrameCountIn  = framesProcessedIn;\n    *pFrameCountOut = framesProcessedOut;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_linear_resampler_process_pcm_frames_s16(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    MA_ASSERT(pResampler != NULL);\n\n    if (pResampler->config.sampleRateIn > pResampler->config.sampleRateOut) {\n        return ma_linear_resampler_process_pcm_frames_s16_downsample(pResampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n    } else {\n        return ma_linear_resampler_process_pcm_frames_s16_upsample(pResampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n    }\n}\n\n\nstatic ma_result ma_linear_resampler_process_pcm_frames_f32_downsample(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    const float* pFramesInF32;\n    /* */ float* pFramesOutF32;\n    ma_uint64 frameCountIn;\n    ma_uint64 frameCountOut;\n    ma_uint64 framesProcessedIn;\n    ma_uint64 framesProcessedOut;\n\n    MA_ASSERT(pResampler     != NULL);\n    MA_ASSERT(pFrameCountIn  != NULL);\n    MA_ASSERT(pFrameCountOut != NULL);\n\n    pFramesInF32       = (const float*)pFramesIn;\n    pFramesOutF32      = (      float*)pFramesOut;\n    frameCountIn       = *pFrameCountIn;\n    frameCountOut      = *pFrameCountOut;\n    framesProcessedIn  = 0;\n    framesProcessedOut = 0;\n\n    while (framesProcessedOut < frameCountOut) {\n        /* Before interpolating we need to load the buffers. When doing this we need to ensure we run every input sample through the filter. */\n        while (pResampler->inTimeInt > 0 && frameCountIn > framesProcessedIn) {\n            ma_uint32 iChannel;\n\n            if (pFramesInF32 != NULL) {\n                for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) {\n                    pResampler->x0.f32[iChannel] = pResampler->x1.f32[iChannel];\n                    pResampler->x1.f32[iChannel] = pFramesInF32[iChannel];\n                }\n                pFramesInF32 += pResampler->config.channels;\n            } else {\n                for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) {\n                    pResampler->x0.f32[iChannel] = pResampler->x1.f32[iChannel];\n                    pResampler->x1.f32[iChannel] = 0;\n                }\n            }\n\n            /* Filter. Do not apply filtering if sample rates are the same or else you'll get dangerous glitching. */\n            if (pResampler->config.sampleRateIn != pResampler->config.sampleRateOut) {\n                ma_lpf_process_pcm_frame_f32(&pResampler->lpf, pResampler->x1.f32, pResampler->x1.f32);\n            }\n\n            framesProcessedIn     += 1;\n            pResampler->inTimeInt -= 1;\n        }\n\n        if (pResampler->inTimeInt > 0) {\n            break;  /* Ran out of input data. */\n        }\n\n        /* Getting here means the frames have been loaded and filtered and we can generate the next output frame. */\n        if (pFramesOutF32 != NULL) {\n            MA_ASSERT(pResampler->inTimeInt == 0);\n            ma_linear_resampler_interpolate_frame_f32(pResampler, pFramesOutF32);\n\n            pFramesOutF32 += pResampler->config.channels;\n        }\n\n        framesProcessedOut += 1;\n\n        /* Advance time forward. */\n        pResampler->inTimeInt  += pResampler->inAdvanceInt;\n        pResampler->inTimeFrac += pResampler->inAdvanceFrac;\n        if (pResampler->inTimeFrac >= pResampler->config.sampleRateOut) {\n            pResampler->inTimeFrac -= pResampler->config.sampleRateOut;\n            pResampler->inTimeInt  += 1;\n        }\n    }\n\n    *pFrameCountIn  = framesProcessedIn;\n    *pFrameCountOut = framesProcessedOut;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_linear_resampler_process_pcm_frames_f32_upsample(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    const float* pFramesInF32;\n    /* */ float* pFramesOutF32;\n    ma_uint64 frameCountIn;\n    ma_uint64 frameCountOut;\n    ma_uint64 framesProcessedIn;\n    ma_uint64 framesProcessedOut;\n\n    MA_ASSERT(pResampler     != NULL);\n    MA_ASSERT(pFrameCountIn  != NULL);\n    MA_ASSERT(pFrameCountOut != NULL);\n\n    pFramesInF32       = (const float*)pFramesIn;\n    pFramesOutF32      = (      float*)pFramesOut;\n    frameCountIn       = *pFrameCountIn;\n    frameCountOut      = *pFrameCountOut;\n    framesProcessedIn  = 0;\n    framesProcessedOut = 0;\n\n    while (framesProcessedOut < frameCountOut) {\n        /* Before interpolating we need to load the buffers. */\n        while (pResampler->inTimeInt > 0 && frameCountIn > framesProcessedIn) {\n            ma_uint32 iChannel;\n\n            if (pFramesInF32 != NULL) {\n                for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) {\n                    pResampler->x0.f32[iChannel] = pResampler->x1.f32[iChannel];\n                    pResampler->x1.f32[iChannel] = pFramesInF32[iChannel];\n                }\n                pFramesInF32 += pResampler->config.channels;\n            } else {\n                for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) {\n                    pResampler->x0.f32[iChannel] = pResampler->x1.f32[iChannel];\n                    pResampler->x1.f32[iChannel] = 0;\n                }\n            }\n\n            framesProcessedIn     += 1;\n            pResampler->inTimeInt -= 1;\n        }\n\n        if (pResampler->inTimeInt > 0) {\n            break;  /* Ran out of input data. */\n        }\n\n        /* Getting here means the frames have been loaded and we can generate the next output frame. */\n        if (pFramesOutF32 != NULL) {\n            MA_ASSERT(pResampler->inTimeInt == 0);\n            ma_linear_resampler_interpolate_frame_f32(pResampler, pFramesOutF32);\n\n            /* Filter. Do not apply filtering if sample rates are the same or else you'll get dangerous glitching. */\n            if (pResampler->config.sampleRateIn != pResampler->config.sampleRateOut) {\n                ma_lpf_process_pcm_frame_f32(&pResampler->lpf, pFramesOutF32, pFramesOutF32);\n            }\n\n            pFramesOutF32 += pResampler->config.channels;\n        }\n\n        framesProcessedOut += 1;\n\n        /* Advance time forward. */\n        pResampler->inTimeInt  += pResampler->inAdvanceInt;\n        pResampler->inTimeFrac += pResampler->inAdvanceFrac;\n        if (pResampler->inTimeFrac >= pResampler->config.sampleRateOut) {\n            pResampler->inTimeFrac -= pResampler->config.sampleRateOut;\n            pResampler->inTimeInt  += 1;\n        }\n    }\n\n    *pFrameCountIn  = framesProcessedIn;\n    *pFrameCountOut = framesProcessedOut;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_linear_resampler_process_pcm_frames_f32(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    MA_ASSERT(pResampler != NULL);\n\n    if (pResampler->config.sampleRateIn > pResampler->config.sampleRateOut) {\n        return ma_linear_resampler_process_pcm_frames_f32_downsample(pResampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n    } else {\n        return ma_linear_resampler_process_pcm_frames_f32_upsample(pResampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n    }\n}\n\n\nMA_API ma_result ma_linear_resampler_process_pcm_frames(ma_linear_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /*  */ if (pResampler->config.format == ma_format_s16) {\n        return ma_linear_resampler_process_pcm_frames_s16(pResampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n    } else if (pResampler->config.format == ma_format_f32) {\n        return ma_linear_resampler_process_pcm_frames_f32(pResampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n    } else {\n        /* Should never get here. Getting here means the format is not supported and you didn't check the return value of ma_linear_resampler_init(). */\n        MA_ASSERT(MA_FALSE);\n        return MA_INVALID_ARGS;\n    }\n}\n\n\nMA_API ma_result ma_linear_resampler_set_rate(ma_linear_resampler* pResampler, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut)\n{\n    return ma_linear_resampler_set_rate_internal(pResampler, NULL, NULL, sampleRateIn, sampleRateOut, /* isResamplerAlreadyInitialized = */ MA_TRUE);\n}\n\nMA_API ma_result ma_linear_resampler_set_rate_ratio(ma_linear_resampler* pResampler, float ratioInOut)\n{\n    ma_uint32 n;\n    ma_uint32 d;\n\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (ratioInOut <= 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    d = 1000000;\n    n = (ma_uint32)(ratioInOut * d);\n\n    if (n == 0) {\n        return MA_INVALID_ARGS; /* Ratio too small. */\n    }\n\n    MA_ASSERT(n != 0);\n\n    return ma_linear_resampler_set_rate(pResampler, n, d);\n}\n\nMA_API ma_uint64 ma_linear_resampler_get_input_latency(const ma_linear_resampler* pResampler)\n{\n    if (pResampler == NULL) {\n        return 0;\n    }\n\n    return 1 + ma_lpf_get_latency(&pResampler->lpf);\n}\n\nMA_API ma_uint64 ma_linear_resampler_get_output_latency(const ma_linear_resampler* pResampler)\n{\n    if (pResampler == NULL) {\n        return 0;\n    }\n\n    return ma_linear_resampler_get_input_latency(pResampler) * pResampler->config.sampleRateOut / pResampler->config.sampleRateIn;\n}\n\nMA_API ma_result ma_linear_resampler_get_required_input_frame_count(const ma_linear_resampler* pResampler, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount)\n{\n    ma_uint64 inputFrameCount;\n\n    if (pInputFrameCount == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pInputFrameCount = 0;\n\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (outputFrameCount == 0) {\n        return MA_SUCCESS;\n    }\n\n    /* Any whole input frames are consumed before the first output frame is generated. */\n    inputFrameCount = pResampler->inTimeInt;\n    outputFrameCount -= 1;\n\n    /* The rest of the output frames can be calculated in constant time. */\n    inputFrameCount += outputFrameCount * pResampler->inAdvanceInt;\n    inputFrameCount += (pResampler->inTimeFrac + (outputFrameCount * pResampler->inAdvanceFrac)) / pResampler->config.sampleRateOut;\n\n    *pInputFrameCount = inputFrameCount;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_linear_resampler_get_expected_output_frame_count(const ma_linear_resampler* pResampler, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount)\n{\n    ma_uint64 outputFrameCount;\n    ma_uint64 preliminaryInputFrameCountFromFrac;\n    ma_uint64 preliminaryInputFrameCount;\n\n    if (pOutputFrameCount == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pOutputFrameCount = 0;\n\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /*\n    The first step is to get a preliminary output frame count. This will either be exactly equal to what we need, or less by 1. We need to\n    determine how many input frames will be consumed by this value. If it's greater than our original input frame count it means we won't\n    be able to generate an extra frame because we will have run out of input data. Otherwise we will have enough input for the generation\n    of an extra output frame. This add-by-one logic is necessary due to how the data loading logic works when processing frames.\n    */\n    outputFrameCount = (inputFrameCount * pResampler->config.sampleRateOut) / pResampler->config.sampleRateIn;\n\n    /*\n    We need to determine how many *whole* input frames will have been processed to generate our preliminary output frame count. This is\n    used in the logic below to determine whether or not we need to add an extra output frame.\n    */\n    preliminaryInputFrameCountFromFrac = (pResampler->inTimeFrac + outputFrameCount*pResampler->inAdvanceFrac) / pResampler->config.sampleRateOut;\n    preliminaryInputFrameCount         = (pResampler->inTimeInt  + outputFrameCount*pResampler->inAdvanceInt ) + preliminaryInputFrameCountFromFrac;\n\n    /*\n    If the total number of *whole* input frames that would be required to generate our preliminary output frame count is greather than\n    the amount of whole input frames we have available as input we need to *not* add an extra output frame as there won't be enough data\n    to actually process. Otherwise we need to add the extra output frame.\n    */\n    if (preliminaryInputFrameCount <= inputFrameCount) {\n        outputFrameCount += 1;\n    }\n\n    *pOutputFrameCount = outputFrameCount;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_linear_resampler_reset(ma_linear_resampler* pResampler)\n{\n    ma_uint32 iChannel;\n\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Timers need to be cleared back to zero. */\n    pResampler->inTimeInt  = 1;  /* Set this to one to force an input sample to always be loaded for the first output frame. */\n    pResampler->inTimeFrac = 0;\n\n    /* Cached samples need to be cleared. */\n    if (pResampler->config.format == ma_format_f32) {\n        for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) {\n            pResampler->x0.f32[iChannel] = 0;\n            pResampler->x1.f32[iChannel] = 0;\n        }\n    } else {\n        for (iChannel = 0; iChannel < pResampler->config.channels; iChannel += 1) {\n            pResampler->x0.s16[iChannel] = 0;\n            pResampler->x1.s16[iChannel] = 0;\n        }\n    }\n\n    /* The low pass filter needs to have it's cache reset. */\n    ma_lpf_clear_cache(&pResampler->lpf);\n\n    return MA_SUCCESS;\n}\n\n\n\n/* Linear resampler backend vtable. */\nstatic ma_linear_resampler_config ma_resampling_backend_get_config__linear(const ma_resampler_config* pConfig)\n{\n    ma_linear_resampler_config linearConfig;\n\n    linearConfig = ma_linear_resampler_config_init(pConfig->format, pConfig->channels, pConfig->sampleRateIn, pConfig->sampleRateOut);\n    linearConfig.lpfOrder = pConfig->linear.lpfOrder;\n\n    return linearConfig;\n}\n\nstatic ma_result ma_resampling_backend_get_heap_size__linear(void* pUserData, const ma_resampler_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_linear_resampler_config linearConfig;\n\n    (void)pUserData;\n\n    linearConfig = ma_resampling_backend_get_config__linear(pConfig);\n\n    return ma_linear_resampler_get_heap_size(&linearConfig, pHeapSizeInBytes);\n}\n\nstatic ma_result ma_resampling_backend_init__linear(void* pUserData, const ma_resampler_config* pConfig, void* pHeap, ma_resampling_backend** ppBackend)\n{\n    ma_resampler* pResampler = (ma_resampler*)pUserData;\n    ma_result result;\n    ma_linear_resampler_config linearConfig;\n\n    (void)pUserData;\n\n    linearConfig = ma_resampling_backend_get_config__linear(pConfig);\n\n    result = ma_linear_resampler_init_preallocated(&linearConfig, pHeap, &pResampler->state.linear);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *ppBackend = &pResampler->state.linear;\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_resampling_backend_uninit__linear(void* pUserData, ma_resampling_backend* pBackend, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    (void)pUserData;\n\n    ma_linear_resampler_uninit((ma_linear_resampler*)pBackend, pAllocationCallbacks);\n}\n\nstatic ma_result ma_resampling_backend_process__linear(void* pUserData, ma_resampling_backend* pBackend, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    (void)pUserData;\n\n    return ma_linear_resampler_process_pcm_frames((ma_linear_resampler*)pBackend, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n}\n\nstatic ma_result ma_resampling_backend_set_rate__linear(void* pUserData, ma_resampling_backend* pBackend, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut)\n{\n    (void)pUserData;\n\n    return ma_linear_resampler_set_rate((ma_linear_resampler*)pBackend, sampleRateIn, sampleRateOut);\n}\n\nstatic ma_uint64 ma_resampling_backend_get_input_latency__linear(void* pUserData, const ma_resampling_backend* pBackend)\n{\n    (void)pUserData;\n\n    return ma_linear_resampler_get_input_latency((const ma_linear_resampler*)pBackend);\n}\n\nstatic ma_uint64 ma_resampling_backend_get_output_latency__linear(void* pUserData, const ma_resampling_backend* pBackend)\n{\n    (void)pUserData;\n\n    return ma_linear_resampler_get_output_latency((const ma_linear_resampler*)pBackend);\n}\n\nstatic ma_result ma_resampling_backend_get_required_input_frame_count__linear(void* pUserData, const ma_resampling_backend* pBackend, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount)\n{\n    (void)pUserData;\n\n    return ma_linear_resampler_get_required_input_frame_count((const ma_linear_resampler*)pBackend, outputFrameCount, pInputFrameCount);\n}\n\nstatic ma_result ma_resampling_backend_get_expected_output_frame_count__linear(void* pUserData, const ma_resampling_backend* pBackend, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount)\n{\n    (void)pUserData;\n\n    return ma_linear_resampler_get_expected_output_frame_count((const ma_linear_resampler*)pBackend, inputFrameCount, pOutputFrameCount);\n}\n\nstatic ma_result ma_resampling_backend_reset__linear(void* pUserData, ma_resampling_backend* pBackend)\n{\n    (void)pUserData;\n\n    return ma_linear_resampler_reset((ma_linear_resampler*)pBackend);\n}\n\nstatic ma_resampling_backend_vtable g_ma_linear_resampler_vtable =\n{\n    ma_resampling_backend_get_heap_size__linear,\n    ma_resampling_backend_init__linear,\n    ma_resampling_backend_uninit__linear,\n    ma_resampling_backend_process__linear,\n    ma_resampling_backend_set_rate__linear,\n    ma_resampling_backend_get_input_latency__linear,\n    ma_resampling_backend_get_output_latency__linear,\n    ma_resampling_backend_get_required_input_frame_count__linear,\n    ma_resampling_backend_get_expected_output_frame_count__linear,\n    ma_resampling_backend_reset__linear\n};\n\n\n\nMA_API ma_resampler_config ma_resampler_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut, ma_resample_algorithm algorithm)\n{\n    ma_resampler_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format = format;\n    config.channels = channels;\n    config.sampleRateIn = sampleRateIn;\n    config.sampleRateOut = sampleRateOut;\n    config.algorithm = algorithm;\n\n    /* Linear. */\n    config.linear.lpfOrder = ma_min(MA_DEFAULT_RESAMPLER_LPF_ORDER, MA_MAX_FILTER_ORDER);\n\n    return config;\n}\n\nstatic ma_result ma_resampler_get_vtable(const ma_resampler_config* pConfig, ma_resampler* pResampler, ma_resampling_backend_vtable** ppVTable, void** ppUserData)\n{\n    MA_ASSERT(pConfig    != NULL);\n    MA_ASSERT(ppVTable   != NULL);\n    MA_ASSERT(ppUserData != NULL);\n\n    /* Safety. */\n    *ppVTable   = NULL;\n    *ppUserData = NULL;\n\n    switch (pConfig->algorithm)\n    {\n        case ma_resample_algorithm_linear:\n        {\n            *ppVTable   = &g_ma_linear_resampler_vtable;\n            *ppUserData = pResampler;\n        } break;\n\n        case ma_resample_algorithm_custom:\n        {\n            *ppVTable   = pConfig->pBackendVTable;\n            *ppUserData = pConfig->pBackendUserData;\n        } break;\n\n        default: return MA_INVALID_ARGS;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_resampler_get_heap_size(const ma_resampler_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_resampling_backend_vtable* pVTable;\n    void* pVTableUserData;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_resampler_get_vtable(pConfig, NULL, &pVTable, &pVTableUserData);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pVTable == NULL || pVTable->onGetHeapSize == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    result = pVTable->onGetHeapSize(pVTableUserData, pConfig, pHeapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_resampler_init_preallocated(const ma_resampler_config* pConfig, void* pHeap, ma_resampler* pResampler)\n{\n    ma_result result;\n\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pResampler);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pResampler->_pHeap        = pHeap;\n    pResampler->format        = pConfig->format;\n    pResampler->channels      = pConfig->channels;\n    pResampler->sampleRateIn  = pConfig->sampleRateIn;\n    pResampler->sampleRateOut = pConfig->sampleRateOut;\n\n    result = ma_resampler_get_vtable(pConfig, pResampler, &pResampler->pBackendVTable, &pResampler->pBackendUserData);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onInit == NULL) {\n        return MA_NOT_IMPLEMENTED;  /* onInit not implemented. */\n    }\n\n    result = pResampler->pBackendVTable->onInit(pResampler->pBackendUserData, pConfig, pHeap, &pResampler->pBackend);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_resampler_init(const ma_resampler_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_resampler* pResampler)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_resampler_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_resampler_init_preallocated(pConfig, pHeap, pResampler);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pResampler->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_resampler_uninit(ma_resampler* pResampler, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pResampler == NULL) {\n        return;\n    }\n\n    if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onUninit == NULL) {\n        return;\n    }\n\n    pResampler->pBackendVTable->onUninit(pResampler->pBackendUserData, pResampler->pBackend, pAllocationCallbacks);\n\n    if (pResampler->_ownsHeap) {\n        ma_free(pResampler->_pHeap, pAllocationCallbacks);\n    }\n}\n\nMA_API ma_result ma_resampler_process_pcm_frames(ma_resampler* pResampler, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pFrameCountOut == NULL && pFrameCountIn == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onProcess == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    return pResampler->pBackendVTable->onProcess(pResampler->pBackendUserData, pResampler->pBackend, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n}\n\nMA_API ma_result ma_resampler_set_rate(ma_resampler* pResampler, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut)\n{\n    ma_result result;\n\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (sampleRateIn == 0 || sampleRateOut == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onSetRate == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    result = pResampler->pBackendVTable->onSetRate(pResampler->pBackendUserData, pResampler->pBackend, sampleRateIn, sampleRateOut);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pResampler->sampleRateIn  = sampleRateIn;\n    pResampler->sampleRateOut = sampleRateOut;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_resampler_set_rate_ratio(ma_resampler* pResampler, float ratio)\n{\n    ma_uint32 n;\n    ma_uint32 d;\n\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (ratio <= 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    d = 1000;\n    n = (ma_uint32)(ratio * d);\n\n    if (n == 0) {\n        return MA_INVALID_ARGS; /* Ratio too small. */\n    }\n\n    MA_ASSERT(n != 0);\n\n    return ma_resampler_set_rate(pResampler, n, d);\n}\n\nMA_API ma_uint64 ma_resampler_get_input_latency(const ma_resampler* pResampler)\n{\n    if (pResampler == NULL) {\n        return 0;\n    }\n\n    if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onGetInputLatency == NULL) {\n        return 0;\n    }\n\n    return pResampler->pBackendVTable->onGetInputLatency(pResampler->pBackendUserData, pResampler->pBackend);\n}\n\nMA_API ma_uint64 ma_resampler_get_output_latency(const ma_resampler* pResampler)\n{\n    if (pResampler == NULL) {\n        return 0;\n    }\n\n    if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onGetOutputLatency == NULL) {\n        return 0;\n    }\n\n    return pResampler->pBackendVTable->onGetOutputLatency(pResampler->pBackendUserData, pResampler->pBackend);\n}\n\nMA_API ma_result ma_resampler_get_required_input_frame_count(const ma_resampler* pResampler, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount)\n{\n    if (pInputFrameCount == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pInputFrameCount = 0;\n\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onGetRequiredInputFrameCount == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    return pResampler->pBackendVTable->onGetRequiredInputFrameCount(pResampler->pBackendUserData, pResampler->pBackend, outputFrameCount, pInputFrameCount);\n}\n\nMA_API ma_result ma_resampler_get_expected_output_frame_count(const ma_resampler* pResampler, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount)\n{\n    if (pOutputFrameCount == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pOutputFrameCount = 0;\n\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onGetExpectedOutputFrameCount == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    return pResampler->pBackendVTable->onGetExpectedOutputFrameCount(pResampler->pBackendUserData, pResampler->pBackend, inputFrameCount, pOutputFrameCount);\n}\n\nMA_API ma_result ma_resampler_reset(ma_resampler* pResampler)\n{\n    if (pResampler == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pResampler->pBackendVTable == NULL || pResampler->pBackendVTable->onReset == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    return pResampler->pBackendVTable->onReset(pResampler->pBackendUserData, pResampler->pBackend);\n}\n\n/**************************************************************************************************************************************************************\n\nChannel Conversion\n\n**************************************************************************************************************************************************************/\n#ifndef MA_CHANNEL_CONVERTER_FIXED_POINT_SHIFT\n#define MA_CHANNEL_CONVERTER_FIXED_POINT_SHIFT  12\n#endif\n\n#define MA_PLANE_LEFT      0\n#define MA_PLANE_RIGHT     1\n#define MA_PLANE_FRONT     2\n#define MA_PLANE_BACK      3\n#define MA_PLANE_BOTTOM    4\n#define MA_PLANE_TOP       5\n\nstatic float g_maChannelPlaneRatios[MA_CHANNEL_POSITION_COUNT][6] = {\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_NONE */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_MONO */\n    { 0.5f,  0.0f,  0.5f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_FRONT_LEFT */\n    { 0.0f,  0.5f,  0.5f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_FRONT_RIGHT */\n    { 0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_FRONT_CENTER */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_LFE */\n    { 0.5f,  0.0f,  0.0f,  0.5f,  0.0f,  0.0f},  /* MA_CHANNEL_BACK_LEFT */\n    { 0.0f,  0.5f,  0.0f,  0.5f,  0.0f,  0.0f},  /* MA_CHANNEL_BACK_RIGHT */\n    { 0.25f, 0.0f,  0.75f, 0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_FRONT_LEFT_CENTER */\n    { 0.0f,  0.25f, 0.75f, 0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_FRONT_RIGHT_CENTER */\n    { 0.0f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f},  /* MA_CHANNEL_BACK_CENTER */\n    { 1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_SIDE_LEFT */\n    { 0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_SIDE_RIGHT */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  1.0f},  /* MA_CHANNEL_TOP_CENTER */\n    { 0.33f, 0.0f,  0.33f, 0.0f,  0.0f,  0.34f}, /* MA_CHANNEL_TOP_FRONT_LEFT */\n    { 0.0f,  0.0f,  0.5f,  0.0f,  0.0f,  0.5f},  /* MA_CHANNEL_TOP_FRONT_CENTER */\n    { 0.0f,  0.33f, 0.33f, 0.0f,  0.0f,  0.34f}, /* MA_CHANNEL_TOP_FRONT_RIGHT */\n    { 0.33f, 0.0f,  0.0f,  0.33f, 0.0f,  0.34f}, /* MA_CHANNEL_TOP_BACK_LEFT */\n    { 0.0f,  0.0f,  0.0f,  0.5f,  0.0f,  0.5f},  /* MA_CHANNEL_TOP_BACK_CENTER */\n    { 0.0f,  0.33f, 0.0f,  0.33f, 0.0f,  0.34f}, /* MA_CHANNEL_TOP_BACK_RIGHT */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_0 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_1 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_2 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_3 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_4 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_5 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_6 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_7 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_8 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_9 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_10 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_11 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_12 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_13 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_14 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_15 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_16 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_17 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_18 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_19 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_20 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_21 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_22 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_23 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_24 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_25 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_26 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_27 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_28 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_29 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_30 */\n    { 0.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.0f},  /* MA_CHANNEL_AUX_31 */\n};\n\nstatic float ma_calculate_channel_position_rectangular_weight(ma_channel channelPositionA, ma_channel channelPositionB)\n{\n    /*\n    Imagine the following simplified example: You have a single input speaker which is the front/left speaker which you want to convert to\n    the following output configuration:\n\n     - front/left\n     - side/left\n     - back/left\n\n    The front/left output is easy - it the same speaker position so it receives the full contribution of the front/left input. The amount\n    of contribution to apply to the side/left and back/left speakers, however, is a bit more complicated.\n\n    Imagine the front/left speaker as emitting audio from two planes - the front plane and the left plane. You can think of the front/left\n    speaker emitting half of it's total volume from the front, and the other half from the left. Since part of it's volume is being emitted\n    from the left side, and the side/left and back/left channels also emit audio from the left plane, one would expect that they would\n    receive some amount of contribution from front/left speaker. The amount of contribution depends on how many planes are shared between\n    the two speakers. Note that in the examples below I've added a top/front/left speaker as an example just to show how the math works\n    across 3 spatial dimensions.\n\n    The first thing to do is figure out how each speaker's volume is spread over each of plane:\n     - front/left:     2 planes (front and left)      = 1/2 = half it's total volume on each plane\n     - side/left:      1 plane (left only)            = 1/1 = entire volume from left plane\n     - back/left:      2 planes (back and left)       = 1/2 = half it's total volume on each plane\n     - top/front/left: 3 planes (top, front and left) = 1/3 = one third it's total volume on each plane\n\n    The amount of volume each channel contributes to each of it's planes is what controls how much it is willing to given and take to other\n    channels on the same plane. The volume that is willing to the given by one channel is multiplied by the volume that is willing to be\n    taken by the other to produce the final contribution.\n    */\n\n    /* Contribution = Sum(Volume to Give * Volume to Take) */\n    float contribution =\n        g_maChannelPlaneRatios[channelPositionA][0] * g_maChannelPlaneRatios[channelPositionB][0] +\n        g_maChannelPlaneRatios[channelPositionA][1] * g_maChannelPlaneRatios[channelPositionB][1] +\n        g_maChannelPlaneRatios[channelPositionA][2] * g_maChannelPlaneRatios[channelPositionB][2] +\n        g_maChannelPlaneRatios[channelPositionA][3] * g_maChannelPlaneRatios[channelPositionB][3] +\n        g_maChannelPlaneRatios[channelPositionA][4] * g_maChannelPlaneRatios[channelPositionB][4] +\n        g_maChannelPlaneRatios[channelPositionA][5] * g_maChannelPlaneRatios[channelPositionB][5];\n\n    return contribution;\n}\n\nMA_API ma_channel_converter_config ma_channel_converter_config_init(ma_format format, ma_uint32 channelsIn, const ma_channel* pChannelMapIn, ma_uint32 channelsOut, const ma_channel* pChannelMapOut, ma_channel_mix_mode mixingMode)\n{\n    ma_channel_converter_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format         = format;\n    config.channelsIn     = channelsIn;\n    config.channelsOut    = channelsOut;\n    config.pChannelMapIn  = pChannelMapIn;\n    config.pChannelMapOut = pChannelMapOut;\n    config.mixingMode     = mixingMode;\n\n    return config;\n}\n\nstatic ma_int32 ma_channel_converter_float_to_fixed(float x)\n{\n    return (ma_int32)(x * (1<<MA_CHANNEL_CONVERTER_FIXED_POINT_SHIFT));\n}\n\nstatic ma_uint32 ma_channel_map_get_spatial_channel_count(const ma_channel* pChannelMap, ma_uint32 channels)\n{\n    ma_uint32 spatialChannelCount = 0;\n    ma_uint32 iChannel;\n\n    MA_ASSERT(pChannelMap != NULL);\n    MA_ASSERT(channels > 0);\n\n    for (iChannel = 0; iChannel < channels; ++iChannel) {\n        if (ma_is_spatial_channel_position(ma_channel_map_get_channel(pChannelMap, channels, iChannel))) {\n            spatialChannelCount++;\n        }\n    }\n\n    return spatialChannelCount;\n}\n\nstatic ma_bool32 ma_is_spatial_channel_position(ma_channel channelPosition)\n{\n    int i;\n\n    if (channelPosition == MA_CHANNEL_NONE || channelPosition == MA_CHANNEL_MONO || channelPosition == MA_CHANNEL_LFE) {\n        return MA_FALSE;\n    }\n\n    if (channelPosition >= MA_CHANNEL_AUX_0 && channelPosition <= MA_CHANNEL_AUX_31) {\n        return MA_FALSE;\n    }\n\n    for (i = 0; i < 6; ++i) {   /* Each side of a cube. */\n        if (g_maChannelPlaneRatios[channelPosition][i] != 0) {\n            return MA_TRUE;\n        }\n    }\n\n    return MA_FALSE;\n}\n\n\nstatic ma_bool32 ma_channel_map_is_passthrough(const ma_channel* pChannelMapIn, ma_uint32 channelsIn, const ma_channel* pChannelMapOut, ma_uint32 channelsOut)\n{\n    if (channelsOut == channelsIn) {\n        return ma_channel_map_is_equal(pChannelMapOut, pChannelMapIn, channelsOut);\n    } else {\n        return MA_FALSE;    /* Channel counts differ, so cannot be a passthrough. */\n    }\n}\n\nstatic ma_channel_conversion_path ma_channel_map_get_conversion_path(const ma_channel* pChannelMapIn, ma_uint32 channelsIn, const ma_channel* pChannelMapOut, ma_uint32 channelsOut, ma_channel_mix_mode mode)\n{\n    if (ma_channel_map_is_passthrough(pChannelMapIn, channelsIn, pChannelMapOut, channelsOut)) {\n        return ma_channel_conversion_path_passthrough;\n    }\n\n    if (channelsOut == 1 && (pChannelMapOut == NULL || pChannelMapOut[0] == MA_CHANNEL_MONO)) {\n        return ma_channel_conversion_path_mono_out;\n    }\n\n    if (channelsIn == 1 && (pChannelMapIn == NULL || pChannelMapIn[0] == MA_CHANNEL_MONO)) {\n        return ma_channel_conversion_path_mono_in;\n    }\n\n    if (mode == ma_channel_mix_mode_custom_weights) {\n        return ma_channel_conversion_path_weights;\n    }\n\n    /*\n    We can use a simple shuffle if both channel maps have the same channel count and all channel\n    positions are present in both.\n    */\n    if (channelsIn == channelsOut) {\n        ma_uint32 iChannelIn;\n        ma_bool32 areAllChannelPositionsPresent = MA_TRUE;\n        for (iChannelIn = 0; iChannelIn < channelsIn; ++iChannelIn) {\n            ma_bool32 isInputChannelPositionInOutput = MA_FALSE;\n            if (ma_channel_map_contains_channel_position(channelsOut, pChannelMapOut, ma_channel_map_get_channel(pChannelMapIn, channelsIn, iChannelIn))) {\n                isInputChannelPositionInOutput = MA_TRUE;\n                break;\n            }\n\n            if (!isInputChannelPositionInOutput) {\n                areAllChannelPositionsPresent = MA_FALSE;\n                break;\n            }\n        }\n\n        if (areAllChannelPositionsPresent) {\n            return ma_channel_conversion_path_shuffle;\n        }\n    }\n\n    /* Getting here means we'll need to use weights. */\n    return ma_channel_conversion_path_weights;\n}\n\n\nstatic ma_result ma_channel_map_build_shuffle_table(const ma_channel* pChannelMapIn, ma_uint32 channelCountIn, const ma_channel* pChannelMapOut, ma_uint32 channelCountOut, ma_uint8* pShuffleTable)\n{\n    ma_uint32 iChannelIn;\n    ma_uint32 iChannelOut;\n\n    if (pShuffleTable == NULL || channelCountIn == 0 || channelCountOut == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    /*\n    When building the shuffle table we just do a 1:1 mapping based on the first occurance of a channel. If the\n    input channel has more than one occurance of a channel position, the second one will be ignored.\n    */\n    for (iChannelOut = 0; iChannelOut < channelCountOut; iChannelOut += 1) {\n        ma_channel channelOut;\n\n        /* Default to MA_CHANNEL_INDEX_NULL so that if a mapping is not found it'll be set appropriately. */\n        pShuffleTable[iChannelOut] = MA_CHANNEL_INDEX_NULL;\n\n        channelOut = ma_channel_map_get_channel(pChannelMapOut, channelCountOut, iChannelOut);\n        for (iChannelIn = 0; iChannelIn < channelCountIn; iChannelIn += 1) {\n            ma_channel channelIn;\n\n            channelIn = ma_channel_map_get_channel(pChannelMapIn, channelCountIn, iChannelIn);\n            if (channelOut == channelIn) {\n                pShuffleTable[iChannelOut] = (ma_uint8)iChannelIn;\n                break;\n            }\n\n            /*\n            Getting here means the channels don't exactly match, but we are going to support some\n            relaxed matching for practicality. If, for example, there are two stereo channel maps,\n            but one uses front left/right and the other uses side left/right, it makes logical\n            sense to just map these. The way we'll do it is we'll check if there is a logical\n            corresponding mapping, and if so, apply it, but we will *not* break from the loop,\n            thereby giving the loop a chance to find an exact match later which will take priority.\n            */\n            switch (channelOut)\n            {\n                /* Left channels. */\n                case MA_CHANNEL_FRONT_LEFT:\n                case MA_CHANNEL_SIDE_LEFT:\n                {\n                    switch (channelIn) {\n                        case MA_CHANNEL_FRONT_LEFT:\n                        case MA_CHANNEL_SIDE_LEFT:\n                        {\n                            pShuffleTable[iChannelOut] = (ma_uint8)iChannelIn;\n                        } break;\n                    }\n                } break;\n\n                /* Right channels. */\n                case MA_CHANNEL_FRONT_RIGHT:\n                case MA_CHANNEL_SIDE_RIGHT:\n                {\n                    switch (channelIn) {\n                        case MA_CHANNEL_FRONT_RIGHT:\n                        case MA_CHANNEL_SIDE_RIGHT:\n                        {\n                            pShuffleTable[iChannelOut] = (ma_uint8)iChannelIn;\n                        } break;\n                    }\n                } break;\n\n                default: break;\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic void ma_channel_map_apply_shuffle_table_u8(ma_uint8* pFramesOut, ma_uint32 channelsOut, const ma_uint8* pFramesIn, ma_uint32 channelsIn, ma_uint64 frameCount, const ma_uint8* pShuffleTable)\n{\n    ma_uint64 iFrame;\n    ma_uint32 iChannelOut;\n\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n            ma_uint8 iChannelIn = pShuffleTable[iChannelOut];\n            if (iChannelIn < channelsIn) {  /* For safety, and to deal with MA_CHANNEL_INDEX_NULL. */\n                pFramesOut[iChannelOut] = pFramesIn[iChannelIn];\n            } else {\n                pFramesOut[iChannelOut] = 0;\n            }\n        }\n\n        pFramesOut += channelsOut;\n        pFramesIn  += channelsIn;\n    }\n}\n\nstatic void ma_channel_map_apply_shuffle_table_s16(ma_int16* pFramesOut, ma_uint32 channelsOut, const ma_int16* pFramesIn, ma_uint32 channelsIn, ma_uint64 frameCount, const ma_uint8* pShuffleTable)\n{\n    ma_uint64 iFrame;\n    ma_uint32 iChannelOut;\n\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n            ma_uint8 iChannelIn = pShuffleTable[iChannelOut];\n            if (iChannelIn < channelsIn) {  /* For safety, and to deal with MA_CHANNEL_INDEX_NULL. */\n                pFramesOut[iChannelOut] = pFramesIn[iChannelIn];\n            } else {\n                pFramesOut[iChannelOut] = 0;\n            }\n        }\n\n        pFramesOut += channelsOut;\n        pFramesIn  += channelsIn;\n    }\n}\n\nstatic void ma_channel_map_apply_shuffle_table_s24(ma_uint8* pFramesOut, ma_uint32 channelsOut, const ma_uint8* pFramesIn, ma_uint32 channelsIn, ma_uint64 frameCount, const ma_uint8* pShuffleTable)\n{\n    ma_uint64 iFrame;\n    ma_uint32 iChannelOut;\n\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n            ma_uint8 iChannelIn = pShuffleTable[iChannelOut];\n            if (iChannelIn < channelsIn) {  /* For safety, and to deal with MA_CHANNEL_INDEX_NULL. */\n                pFramesOut[iChannelOut*3 + 0] = pFramesIn[iChannelIn*3 + 0];\n                pFramesOut[iChannelOut*3 + 1] = pFramesIn[iChannelIn*3 + 1];\n                pFramesOut[iChannelOut*3 + 2] = pFramesIn[iChannelIn*3 + 2];\n            } else {\n                pFramesOut[iChannelOut*3 + 0] = 0;\n            }   pFramesOut[iChannelOut*3 + 1] = 0;\n        }       pFramesOut[iChannelOut*3 + 2] = 0;\n\n        pFramesOut += channelsOut*3;\n        pFramesIn  += channelsIn*3;\n    }\n}\n\nstatic void ma_channel_map_apply_shuffle_table_s32(ma_int32* pFramesOut, ma_uint32 channelsOut, const ma_int32* pFramesIn, ma_uint32 channelsIn, ma_uint64 frameCount, const ma_uint8* pShuffleTable)\n{\n    ma_uint64 iFrame;\n    ma_uint32 iChannelOut;\n\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n            ma_uint8 iChannelIn = pShuffleTable[iChannelOut];\n            if (iChannelIn < channelsIn) {  /* For safety, and to deal with MA_CHANNEL_INDEX_NULL. */\n                pFramesOut[iChannelOut] = pFramesIn[iChannelIn];\n            } else {\n                pFramesOut[iChannelOut] = 0;\n            }\n        }\n\n        pFramesOut += channelsOut;\n        pFramesIn  += channelsIn;\n    }\n}\n\nstatic void ma_channel_map_apply_shuffle_table_f32(float* pFramesOut, ma_uint32 channelsOut, const float* pFramesIn, ma_uint32 channelsIn, ma_uint64 frameCount, const ma_uint8* pShuffleTable)\n{\n    ma_uint64 iFrame;\n    ma_uint32 iChannelOut;\n\n    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n        for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n            ma_uint8 iChannelIn = pShuffleTable[iChannelOut];\n            if (iChannelIn < channelsIn) {  /* For safety, and to deal with MA_CHANNEL_INDEX_NULL. */\n                pFramesOut[iChannelOut] = pFramesIn[iChannelIn];\n            } else {\n                pFramesOut[iChannelOut] = 0;\n            }\n        }\n\n        pFramesOut += channelsOut;\n        pFramesIn  += channelsIn;\n    }\n}\n\nstatic ma_result ma_channel_map_apply_shuffle_table(void* pFramesOut, ma_uint32 channelsOut, const void* pFramesIn, ma_uint32 channelsIn, ma_uint64 frameCount, const ma_uint8* pShuffleTable, ma_format format)\n{\n    if (pFramesOut == NULL || pFramesIn == NULL || channelsOut == 0 || pShuffleTable == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    switch (format)\n    {\n        case ma_format_u8:\n        {\n            ma_channel_map_apply_shuffle_table_u8((ma_uint8*)pFramesOut, channelsOut, (const ma_uint8*)pFramesIn, channelsIn, frameCount, pShuffleTable);\n        } break;\n\n        case ma_format_s16:\n        {\n            ma_channel_map_apply_shuffle_table_s16((ma_int16*)pFramesOut, channelsOut, (const ma_int16*)pFramesIn, channelsIn, frameCount, pShuffleTable);\n        } break;\n\n        case ma_format_s24:\n        {\n            ma_channel_map_apply_shuffle_table_s24((ma_uint8*)pFramesOut, channelsOut, (const ma_uint8*)pFramesIn, channelsIn, frameCount, pShuffleTable);\n        } break;\n\n        case ma_format_s32:\n        {\n            ma_channel_map_apply_shuffle_table_s32((ma_int32*)pFramesOut, channelsOut, (const ma_int32*)pFramesIn, channelsIn, frameCount, pShuffleTable);\n        } break;\n\n        case ma_format_f32:\n        {\n            ma_channel_map_apply_shuffle_table_f32((float*)pFramesOut, channelsOut, (const float*)pFramesIn, channelsIn, frameCount, pShuffleTable);\n        } break;\n\n        default: return MA_INVALID_ARGS;    /* Unknown format. */\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_channel_map_apply_mono_out_f32(float* pFramesOut, const float* pFramesIn, const ma_channel* pChannelMapIn, ma_uint32 channelsIn, ma_uint64 frameCount)\n{\n    ma_uint64 iFrame;\n    ma_uint32 iChannelIn;\n    ma_uint32 accumulationCount;\n\n    if (pFramesOut == NULL || pFramesIn == NULL || channelsIn == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* In this case the output stream needs to be the average of all channels, ignoring NONE. */\n\n    /* A quick pre-processing step to get the accumulation counter since we're ignoring NONE channels. */\n    accumulationCount = 0;\n    for (iChannelIn = 0; iChannelIn < channelsIn; iChannelIn += 1) {\n        if (ma_channel_map_get_channel(pChannelMapIn, channelsIn, iChannelIn) != MA_CHANNEL_NONE) {\n            accumulationCount += 1;\n        }\n    }\n\n    if (accumulationCount > 0) {    /* <-- Prevent a division by zero. */\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            float accumulation = 0;\n\n            for (iChannelIn = 0; iChannelIn < channelsIn; iChannelIn += 1) {\n                ma_channel channelIn = ma_channel_map_get_channel(pChannelMapIn, channelsIn, iChannelIn);\n                if (channelIn != MA_CHANNEL_NONE) {\n                    accumulation += pFramesIn[iChannelIn];\n                }\n            }\n\n            pFramesOut[0] = accumulation / accumulationCount;\n            pFramesOut += 1;\n            pFramesIn  += channelsIn;\n        }\n    } else {\n        ma_silence_pcm_frames(pFramesOut, frameCount, ma_format_f32, 1);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_channel_map_apply_mono_in_f32(float* MA_RESTRICT pFramesOut, const ma_channel* pChannelMapOut, ma_uint32 channelsOut, const float* MA_RESTRICT pFramesIn, ma_uint64 frameCount, ma_mono_expansion_mode monoExpansionMode)\n{\n    ma_uint64 iFrame;\n    ma_uint32 iChannelOut;\n\n    if (pFramesOut == NULL || channelsOut == 0 || pFramesIn == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Note that the MA_CHANNEL_NONE channel must be ignored in all cases. */\n    switch (monoExpansionMode)\n    {\n        case ma_mono_expansion_mode_average:\n        {\n            float weight;\n            ma_uint32 validChannelCount = 0;\n\n            for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n                ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut);\n                if (channelOut != MA_CHANNEL_NONE) {\n                    validChannelCount += 1;\n                }\n            }\n\n            weight = 1.0f / validChannelCount;\n\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n                    ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut);\n                    if (channelOut != MA_CHANNEL_NONE) {\n                        pFramesOut[iChannelOut] = pFramesIn[0] * weight;\n                    }\n                }\n\n                pFramesOut += channelsOut;\n                pFramesIn  += 1;\n            }\n        } break;\n\n        case ma_mono_expansion_mode_stereo_only:\n        {\n            if (channelsOut >= 2) {\n                ma_uint32 iChannelLeft  = (ma_uint32)-1;\n                ma_uint32 iChannelRight = (ma_uint32)-1;\n\n                /*\n                We first need to find our stereo channels. We prefer front-left and front-right, but\n                if they're not available, we'll also try side-left and side-right. If neither are\n                available we'll fall through to the default case below.\n                */\n                for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n                    ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut);\n                    if (channelOut == MA_CHANNEL_SIDE_LEFT) {\n                        iChannelLeft  = iChannelOut;\n                    }\n                    if (channelOut == MA_CHANNEL_SIDE_RIGHT) {\n                        iChannelRight = iChannelOut;\n                    }\n                }\n\n                for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n                    ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut);\n                    if (channelOut == MA_CHANNEL_FRONT_LEFT) {\n                        iChannelLeft  = iChannelOut;\n                    }\n                    if (channelOut == MA_CHANNEL_FRONT_RIGHT) {\n                        iChannelRight = iChannelOut;\n                    }\n                }\n\n\n                if (iChannelLeft != (ma_uint32)-1 && iChannelRight != (ma_uint32)-1) {\n                    /* We found our stereo channels so we can duplicate the signal across those channels. */\n                    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                        for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n                            ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut);\n                            if (channelOut != MA_CHANNEL_NONE) {\n                                if (iChannelOut == iChannelLeft || iChannelOut == iChannelRight) {\n                                    pFramesOut[iChannelOut] = pFramesIn[0];\n                                } else {\n                                    pFramesOut[iChannelOut] = 0.0f;\n                                }\n                            }\n                        }\n\n                        pFramesOut += channelsOut;\n                        pFramesIn  += 1;\n                    }\n\n                    break;  /* Get out of the switch. */\n                } else {\n                    /* Fallthrough. Does not have left and right channels. */\n                    goto default_handler;\n                }\n            } else {\n                /* Fallthrough. Does not have stereo channels. */\n                goto default_handler;\n            }\n        };  /* Fallthrough. See comments above. */\n\n        case ma_mono_expansion_mode_duplicate:\n        default:\n        {\n            default_handler:\n            {\n                if (channelsOut <= MA_MAX_CHANNELS) {\n                    ma_bool32 hasEmptyChannel = MA_FALSE;\n                    ma_channel channelPositions[MA_MAX_CHANNELS];\n                    for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n                        channelPositions[iChannelOut] = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut);\n                        if (channelPositions[iChannelOut] == MA_CHANNEL_NONE) {\n                            hasEmptyChannel = MA_TRUE;\n                        }\n                    }\n\n                    if (hasEmptyChannel == MA_FALSE) {\n                        /*\n                        Faster path when there's no MA_CHANNEL_NONE channel positions. This should hopefully\n                        help the compiler with auto-vectorization.m\n                        */\n                        if (channelsOut == 2) {\n                        #if defined(MA_SUPPORT_SSE2)\n                            if (ma_has_sse2()) {\n                                /* We want to do two frames in each iteration. */\n                                ma_uint64 unrolledFrameCount = frameCount >> 1;\n\n                                for (iFrame = 0; iFrame < unrolledFrameCount; iFrame += 1) {\n                                    __m128 in0 = _mm_set1_ps(pFramesIn[iFrame*2 + 0]);\n                                    __m128 in1 = _mm_set1_ps(pFramesIn[iFrame*2 + 1]);\n                                    _mm_storeu_ps(&pFramesOut[iFrame*4 + 0], _mm_shuffle_ps(in0, in1, _MM_SHUFFLE(0, 0, 0, 0)));\n                                }\n\n                                /* Tail. */\n                                iFrame = unrolledFrameCount << 1;\n                                goto generic_on_fastpath;\n                            } else\n                        #endif\n                            {\n                                for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                                    for (iChannelOut = 0; iChannelOut < 2; iChannelOut += 1) {\n                                        pFramesOut[iFrame*2 + iChannelOut] = pFramesIn[iFrame];\n                                    }\n                                }\n                            }\n                        } else if (channelsOut == 6) {\n                        #if defined(MA_SUPPORT_SSE2)\n                            if (ma_has_sse2()) {\n                                /* We want to do two frames in each iteration so we can have a multiple of 4 samples. */\n                                ma_uint64 unrolledFrameCount = frameCount >> 1;\n\n                                for (iFrame = 0; iFrame < unrolledFrameCount; iFrame += 1) {\n                                    __m128 in0 = _mm_set1_ps(pFramesIn[iFrame*2 + 0]);\n                                    __m128 in1 = _mm_set1_ps(pFramesIn[iFrame*2 + 1]);\n\n                                    _mm_storeu_ps(&pFramesOut[iFrame*12 + 0], in0);\n                                    _mm_storeu_ps(&pFramesOut[iFrame*12 + 4], _mm_shuffle_ps(in0, in1, _MM_SHUFFLE(0, 0, 0, 0)));\n                                    _mm_storeu_ps(&pFramesOut[iFrame*12 + 8], in1);\n                                }\n\n                                /* Tail. */\n                                iFrame = unrolledFrameCount << 1;\n                                goto generic_on_fastpath;\n                            } else\n                        #endif\n                            {\n                                for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                                    for (iChannelOut = 0; iChannelOut < 6; iChannelOut += 1) {\n                                        pFramesOut[iFrame*6 + iChannelOut] = pFramesIn[iFrame];\n                                    }\n                                }\n                            }\n                        } else if (channelsOut == 8) {\n                        #if defined(MA_SUPPORT_SSE2)\n                            if (ma_has_sse2()) {\n                                for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                                    __m128 in = _mm_set1_ps(pFramesIn[iFrame]);\n                                    _mm_storeu_ps(&pFramesOut[iFrame*8 + 0], in);\n                                    _mm_storeu_ps(&pFramesOut[iFrame*8 + 4], in);\n                                }\n                            } else\n                        #endif\n                            {\n                                for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                                    for (iChannelOut = 0; iChannelOut < 8; iChannelOut += 1) {\n                                        pFramesOut[iFrame*8 + iChannelOut] = pFramesIn[iFrame];\n                                    }\n                                }\n                            }\n                        } else {\n                            iFrame = 0;\n\n                            #if defined(MA_SUPPORT_SSE2)    /* For silencing a warning with non-x86 builds. */\n                            generic_on_fastpath:\n                            #endif\n                            {\n                                for (; iFrame < frameCount; iFrame += 1) {\n                                    for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n                                        pFramesOut[iFrame*channelsOut + iChannelOut] = pFramesIn[iFrame];\n                                    }\n                                }\n                            }\n                        }\n                    } else {\n                        /* Slow path. Need to handle MA_CHANNEL_NONE. */\n                        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                            for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n                                if (channelPositions[iChannelOut] != MA_CHANNEL_NONE) {\n                                    pFramesOut[iFrame*channelsOut + iChannelOut] = pFramesIn[iFrame];\n                                }\n                            }\n                        }\n                    }\n                } else {\n                    /* Slow path. Too many channels to store on the stack. */\n                    for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                        for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n                            ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut);\n                            if (channelOut != MA_CHANNEL_NONE) {\n                                pFramesOut[iFrame*channelsOut + iChannelOut] = pFramesIn[iFrame];\n                            }\n                        }\n                    }\n                }\n            }\n        } break;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_channel_map_apply_f32(float* pFramesOut, const ma_channel* pChannelMapOut, ma_uint32 channelsOut, const float* pFramesIn, const ma_channel* pChannelMapIn, ma_uint32 channelsIn, ma_uint64 frameCount, ma_channel_mix_mode mode, ma_mono_expansion_mode monoExpansionMode)\n{\n    ma_channel_conversion_path conversionPath = ma_channel_map_get_conversion_path(pChannelMapIn, channelsIn, pChannelMapOut, channelsOut, mode);\n\n    /* Optimized Path: Passthrough */\n    if (conversionPath == ma_channel_conversion_path_passthrough) {\n        ma_copy_pcm_frames(pFramesOut, pFramesIn, frameCount, ma_format_f32, channelsOut);\n        return;\n    }\n\n    /* Special Path: Mono Output. */\n    if (conversionPath == ma_channel_conversion_path_mono_out) {\n        ma_channel_map_apply_mono_out_f32(pFramesOut, pFramesIn, pChannelMapIn, channelsIn, frameCount);\n        return;\n    }\n\n    /* Special Path: Mono Input. */\n    if (conversionPath == ma_channel_conversion_path_mono_in) {\n        ma_channel_map_apply_mono_in_f32(pFramesOut, pChannelMapOut, channelsOut, pFramesIn, frameCount, monoExpansionMode);\n        return;\n    }\n\n    /* Getting here means we aren't running on an optimized conversion path. */\n    if (channelsOut <= MA_MAX_CHANNELS) {\n        ma_result result;\n\n        if (mode == ma_channel_mix_mode_simple) {\n            ma_channel shuffleTable[MA_MAX_CHANNELS];\n\n            result = ma_channel_map_build_shuffle_table(pChannelMapIn, channelsIn, pChannelMapOut, channelsOut, shuffleTable);\n            if (result != MA_SUCCESS) {\n                return;\n            }\n\n            result = ma_channel_map_apply_shuffle_table(pFramesOut, channelsOut, pFramesIn, channelsIn, frameCount, shuffleTable, ma_format_f32);\n            if (result != MA_SUCCESS) {\n                return;\n            }\n        } else {\n            ma_uint32 iFrame;\n            ma_uint32 iChannelOut;\n            ma_uint32 iChannelIn;\n            float weights[32][32];  /* Do not use MA_MAX_CHANNELS here! */\n\n            /*\n            If we have a small enough number of channels, pre-compute the weights. Otherwise we'll just need to\n            fall back to a slower path because otherwise we'll run out of stack space.\n            */\n            if (channelsIn <= ma_countof(weights) && channelsOut <= ma_countof(weights)) {\n                /* Pre-compute weights. */\n                for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n                    ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut);\n                    for (iChannelIn = 0; iChannelIn < channelsIn; iChannelIn += 1) {\n                        ma_channel channelIn = ma_channel_map_get_channel(pChannelMapIn, channelsIn, iChannelIn);\n                        weights[iChannelOut][iChannelIn] = ma_calculate_channel_position_rectangular_weight(channelOut, channelIn);\n                    }\n                }\n\n                iFrame = 0;\n\n                /* Experiment: Try an optimized unroll for some specific cases to see how it improves performance. RESULT: Good gains. */\n                if (channelsOut == 8) {\n                    /* Experiment 2: Expand the inner loop to see what kind of different it makes. RESULT: Small, but worthwhile gain. */\n                    if (channelsIn == 2) {\n                        for (; iFrame < frameCount; iFrame += 1) {\n                            float accumulation[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };\n\n                            accumulation[0] += pFramesIn[iFrame*2 + 0] * weights[0][0];\n                            accumulation[1] += pFramesIn[iFrame*2 + 0] * weights[1][0];\n                            accumulation[2] += pFramesIn[iFrame*2 + 0] * weights[2][0];\n                            accumulation[3] += pFramesIn[iFrame*2 + 0] * weights[3][0];\n                            accumulation[4] += pFramesIn[iFrame*2 + 0] * weights[4][0];\n                            accumulation[5] += pFramesIn[iFrame*2 + 0] * weights[5][0];\n                            accumulation[6] += pFramesIn[iFrame*2 + 0] * weights[6][0];\n                            accumulation[7] += pFramesIn[iFrame*2 + 0] * weights[7][0];\n\n                            accumulation[0] += pFramesIn[iFrame*2 + 1] * weights[0][1];\n                            accumulation[1] += pFramesIn[iFrame*2 + 1] * weights[1][1];\n                            accumulation[2] += pFramesIn[iFrame*2 + 1] * weights[2][1];\n                            accumulation[3] += pFramesIn[iFrame*2 + 1] * weights[3][1];\n                            accumulation[4] += pFramesIn[iFrame*2 + 1] * weights[4][1];\n                            accumulation[5] += pFramesIn[iFrame*2 + 1] * weights[5][1];\n                            accumulation[6] += pFramesIn[iFrame*2 + 1] * weights[6][1];\n                            accumulation[7] += pFramesIn[iFrame*2 + 1] * weights[7][1];\n\n                            pFramesOut[iFrame*8 + 0] = accumulation[0];\n                            pFramesOut[iFrame*8 + 1] = accumulation[1];\n                            pFramesOut[iFrame*8 + 2] = accumulation[2];\n                            pFramesOut[iFrame*8 + 3] = accumulation[3];\n                            pFramesOut[iFrame*8 + 4] = accumulation[4];\n                            pFramesOut[iFrame*8 + 5] = accumulation[5];\n                            pFramesOut[iFrame*8 + 6] = accumulation[6];\n                            pFramesOut[iFrame*8 + 7] = accumulation[7];\n                        }\n                    } else {\n                        /* When outputting to 8 channels, we can do everything in groups of two 4x SIMD operations. */\n                        for (; iFrame < frameCount; iFrame += 1) {\n                            float accumulation[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };\n\n                            for (iChannelIn = 0; iChannelIn < channelsIn; iChannelIn += 1) {\n                                accumulation[0] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[0][iChannelIn];\n                                accumulation[1] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[1][iChannelIn];\n                                accumulation[2] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[2][iChannelIn];\n                                accumulation[3] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[3][iChannelIn];\n                                accumulation[4] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[4][iChannelIn];\n                                accumulation[5] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[5][iChannelIn];\n                                accumulation[6] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[6][iChannelIn];\n                                accumulation[7] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[7][iChannelIn];\n                            }\n\n                            pFramesOut[iFrame*8 + 0] = accumulation[0];\n                            pFramesOut[iFrame*8 + 1] = accumulation[1];\n                            pFramesOut[iFrame*8 + 2] = accumulation[2];\n                            pFramesOut[iFrame*8 + 3] = accumulation[3];\n                            pFramesOut[iFrame*8 + 4] = accumulation[4];\n                            pFramesOut[iFrame*8 + 5] = accumulation[5];\n                            pFramesOut[iFrame*8 + 6] = accumulation[6];\n                            pFramesOut[iFrame*8 + 7] = accumulation[7];\n                        }\n                    }\n                } else if (channelsOut == 6) {\n                    /*\n                    When outputting to 6 channels we unfortunately don't have a nice multiple of 4 to do 4x SIMD operations. Instead we'll\n                    expand our weights and do two frames at a time.\n                    */\n                    for (; iFrame < frameCount; iFrame += 1) {\n                        float accumulation[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };\n\n                        for (iChannelIn = 0; iChannelIn < channelsIn; iChannelIn += 1) {\n                            accumulation[0] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[0][iChannelIn];\n                            accumulation[1] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[1][iChannelIn];\n                            accumulation[2] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[2][iChannelIn];\n                            accumulation[3] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[3][iChannelIn];\n                            accumulation[4] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[4][iChannelIn];\n                            accumulation[5] += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[5][iChannelIn];\n                        }\n\n                        pFramesOut[iFrame*6 + 0] = accumulation[0];\n                        pFramesOut[iFrame*6 + 1] = accumulation[1];\n                        pFramesOut[iFrame*6 + 2] = accumulation[2];\n                        pFramesOut[iFrame*6 + 3] = accumulation[3];\n                        pFramesOut[iFrame*6 + 4] = accumulation[4];\n                        pFramesOut[iFrame*6 + 5] = accumulation[5];\n                    }\n                }\n\n                /* Leftover frames. */\n                for (; iFrame < frameCount; iFrame += 1) {\n                    for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n                        float accumulation = 0;\n\n                        for (iChannelIn = 0; iChannelIn < channelsIn; iChannelIn += 1) {\n                            accumulation += pFramesIn[iFrame*channelsIn + iChannelIn] * weights[iChannelOut][iChannelIn];\n                        }\n\n                        pFramesOut[iFrame*channelsOut + iChannelOut] = accumulation;\n                    }\n                }\n            } else {\n                /* Cannot pre-compute weights because not enough room in stack-allocated buffer. */\n                for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                    for (iChannelOut = 0; iChannelOut < channelsOut; iChannelOut += 1) {\n                        float accumulation = 0;\n                        ma_channel channelOut = ma_channel_map_get_channel(pChannelMapOut, channelsOut, iChannelOut);\n\n                        for (iChannelIn = 0; iChannelIn < channelsIn; iChannelIn += 1) {\n                            ma_channel channelIn = ma_channel_map_get_channel(pChannelMapIn, channelsIn, iChannelIn);\n                            accumulation += pFramesIn[iFrame*channelsIn + iChannelIn] * ma_calculate_channel_position_rectangular_weight(channelOut, channelIn);\n                        }\n\n                        pFramesOut[iFrame*channelsOut + iChannelOut] = accumulation;\n                    }\n                }\n            }\n        }\n    } else {\n        /* Fall back to silence. If you hit this, what are you doing with so many channels?! */\n        ma_silence_pcm_frames(pFramesOut, frameCount, ma_format_f32, channelsOut);\n    }\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t channelMapInOffset;\n    size_t channelMapOutOffset;\n    size_t shuffleTableOffset;\n    size_t weightsOffset;\n} ma_channel_converter_heap_layout;\n\nstatic ma_channel_conversion_path ma_channel_converter_config_get_conversion_path(const ma_channel_converter_config* pConfig)\n{\n    return ma_channel_map_get_conversion_path(pConfig->pChannelMapIn, pConfig->channelsIn, pConfig->pChannelMapOut, pConfig->channelsOut, pConfig->mixingMode);\n}\n\nstatic ma_result ma_channel_converter_get_heap_layout(const ma_channel_converter_config* pConfig, ma_channel_converter_heap_layout* pHeapLayout)\n{\n    ma_channel_conversion_path conversionPath;\n\n    MA_ASSERT(pHeapLayout != NULL);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->channelsIn == 0 || pConfig->channelsOut == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (!ma_channel_map_is_valid(pConfig->pChannelMapIn, pConfig->channelsIn)) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (!ma_channel_map_is_valid(pConfig->pChannelMapOut, pConfig->channelsOut)) {\n        return MA_INVALID_ARGS;\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* Input channel map. Only need to allocate this if we have an input channel map (otherwise default channel map is assumed). */\n    pHeapLayout->channelMapInOffset = pHeapLayout->sizeInBytes;\n    if (pConfig->pChannelMapIn != NULL) {\n        pHeapLayout->sizeInBytes += sizeof(ma_channel) * pConfig->channelsIn;\n    }\n\n    /* Output channel map. Only need to allocate this if we have an output channel map (otherwise default channel map is assumed). */\n    pHeapLayout->channelMapOutOffset = pHeapLayout->sizeInBytes;\n    if (pConfig->pChannelMapOut != NULL) {\n        pHeapLayout->sizeInBytes += sizeof(ma_channel) * pConfig->channelsOut;\n    }\n\n    /* Alignment for the next section. */\n    pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes);\n\n    /* Whether or not we use weights of a shuffle table depends on the channel map themselves and the algorithm we've chosen. */\n    conversionPath = ma_channel_converter_config_get_conversion_path(pConfig);\n\n    /* Shuffle table */\n    pHeapLayout->shuffleTableOffset = pHeapLayout->sizeInBytes;\n    if (conversionPath == ma_channel_conversion_path_shuffle) {\n        pHeapLayout->sizeInBytes += sizeof(ma_uint8) * pConfig->channelsOut;\n    }\n\n    /* Weights */\n    pHeapLayout->weightsOffset = pHeapLayout->sizeInBytes;\n    if (conversionPath == ma_channel_conversion_path_weights) {\n        pHeapLayout->sizeInBytes += sizeof(float*) * pConfig->channelsIn;\n        pHeapLayout->sizeInBytes += sizeof(float ) * pConfig->channelsIn * pConfig->channelsOut;\n    }\n\n    /* Make sure allocation size is aligned. */\n    pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_channel_converter_get_heap_size(const ma_channel_converter_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_channel_converter_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_channel_converter_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_channel_converter_init_preallocated(const ma_channel_converter_config* pConfig, void* pHeap, ma_channel_converter* pConverter)\n{\n    ma_result result;\n    ma_channel_converter_heap_layout heapLayout;\n\n    if (pConverter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pConverter);\n\n    result = ma_channel_converter_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pConverter->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pConverter->_pHeap, heapLayout.sizeInBytes);\n\n    pConverter->format      = pConfig->format;\n    pConverter->channelsIn  = pConfig->channelsIn;\n    pConverter->channelsOut = pConfig->channelsOut;\n    pConverter->mixingMode  = pConfig->mixingMode;\n\n    if (pConfig->pChannelMapIn != NULL) {\n        pConverter->pChannelMapIn = (ma_channel*)ma_offset_ptr(pHeap, heapLayout.channelMapInOffset);\n        ma_channel_map_copy_or_default(pConverter->pChannelMapIn, pConfig->channelsIn, pConfig->pChannelMapIn, pConfig->channelsIn);\n    } else {\n        pConverter->pChannelMapIn = NULL;   /* Use default channel map. */\n    }\n\n    if (pConfig->pChannelMapOut != NULL) {\n        pConverter->pChannelMapOut = (ma_channel*)ma_offset_ptr(pHeap, heapLayout.channelMapOutOffset);\n        ma_channel_map_copy_or_default(pConverter->pChannelMapOut, pConfig->channelsOut, pConfig->pChannelMapOut, pConfig->channelsOut);\n    } else {\n        pConverter->pChannelMapOut = NULL;  /* Use default channel map. */\n    }\n\n    pConverter->conversionPath = ma_channel_converter_config_get_conversion_path(pConfig);\n\n    if (pConverter->conversionPath == ma_channel_conversion_path_shuffle) {\n        pConverter->pShuffleTable = (ma_uint8*)ma_offset_ptr(pHeap, heapLayout.shuffleTableOffset);\n        ma_channel_map_build_shuffle_table(pConverter->pChannelMapIn, pConverter->channelsIn, pConverter->pChannelMapOut, pConverter->channelsOut, pConverter->pShuffleTable);\n    }\n\n    if (pConverter->conversionPath == ma_channel_conversion_path_weights) {\n        ma_uint32 iChannelIn;\n        ma_uint32 iChannelOut;\n\n        if (pConverter->format == ma_format_f32) {\n            pConverter->weights.f32 = (float**   )ma_offset_ptr(pHeap, heapLayout.weightsOffset);\n            for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; iChannelIn += 1) {\n                pConverter->weights.f32[iChannelIn] = (float*)ma_offset_ptr(pHeap, heapLayout.weightsOffset + ((sizeof(float*) * pConverter->channelsIn) + (sizeof(float) * pConverter->channelsOut * iChannelIn)));\n            }\n        } else {\n            pConverter->weights.s16 = (ma_int32**)ma_offset_ptr(pHeap, heapLayout.weightsOffset);\n            for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; iChannelIn += 1) {\n                pConverter->weights.s16[iChannelIn] = (ma_int32*)ma_offset_ptr(pHeap, heapLayout.weightsOffset + ((sizeof(ma_int32*) * pConverter->channelsIn) + (sizeof(ma_int32) * pConverter->channelsOut * iChannelIn)));\n            }\n        }\n\n        /* Silence our weights by default. */\n        for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; iChannelIn += 1) {\n            for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; iChannelOut += 1) {\n                if (pConverter->format == ma_format_f32) {\n                    pConverter->weights.f32[iChannelIn][iChannelOut] = 0.0f;\n                } else {\n                    pConverter->weights.s16[iChannelIn][iChannelOut] = 0;\n                }\n            }\n        }\n\n        /*\n        We now need to fill out our weights table. This is determined by the mixing mode.\n        */\n\n        /* In all cases we need to make sure all channels that are present in both channel maps have a 1:1 mapping. */\n        for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) {\n            ma_channel channelPosIn = ma_channel_map_get_channel(pConverter->pChannelMapIn, pConverter->channelsIn, iChannelIn);\n\n            for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) {\n                ma_channel channelPosOut = ma_channel_map_get_channel(pConverter->pChannelMapOut, pConverter->channelsOut, iChannelOut);\n\n                if (channelPosIn == channelPosOut) {\n                    float weight = 1;\n\n                    if (pConverter->format == ma_format_f32) {\n                        pConverter->weights.f32[iChannelIn][iChannelOut] = weight;\n                    } else {\n                        pConverter->weights.s16[iChannelIn][iChannelOut] = ma_channel_converter_float_to_fixed(weight);\n                    }\n                }\n            }\n        }\n\n        switch (pConverter->mixingMode)\n        {\n            case ma_channel_mix_mode_custom_weights:\n            {\n                if (pConfig->ppWeights == NULL) {\n                    return MA_INVALID_ARGS; /* Config specified a custom weights mixing mode, but no custom weights have been specified. */\n                }\n\n                for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; iChannelIn += 1) {\n                    for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; iChannelOut += 1) {\n                        float weight = pConfig->ppWeights[iChannelIn][iChannelOut];\n\n                        if (pConverter->format == ma_format_f32) {\n                            pConverter->weights.f32[iChannelIn][iChannelOut] = weight;\n                        } else {\n                            pConverter->weights.s16[iChannelIn][iChannelOut] = ma_channel_converter_float_to_fixed(weight);\n                        }\n                    }\n                }\n            } break;\n\n            case ma_channel_mix_mode_simple:\n            {\n                /*\n                In simple mode, only set weights for channels that have exactly matching types, leave the rest at\n                zero. The 1:1 mappings have already been covered before this switch statement.\n                */\n            } break;\n\n            case ma_channel_mix_mode_rectangular:\n            default:\n            {\n                /* Unmapped input channels. */\n                for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) {\n                    ma_channel channelPosIn = ma_channel_map_get_channel(pConverter->pChannelMapIn, pConverter->channelsIn, iChannelIn);\n\n                    if (ma_is_spatial_channel_position(channelPosIn)) {\n                        if (!ma_channel_map_contains_channel_position(pConverter->channelsOut, pConverter->pChannelMapOut, channelPosIn)) {\n                            for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) {\n                                ma_channel channelPosOut = ma_channel_map_get_channel(pConverter->pChannelMapOut, pConverter->channelsOut, iChannelOut);\n\n                                if (ma_is_spatial_channel_position(channelPosOut)) {\n                                    float weight = 0;\n                                    if (pConverter->mixingMode == ma_channel_mix_mode_rectangular) {\n                                        weight = ma_calculate_channel_position_rectangular_weight(channelPosIn, channelPosOut);\n                                    }\n\n                                    /* Only apply the weight if we haven't already got some contribution from the respective channels. */\n                                    if (pConverter->format == ma_format_f32) {\n                                        if (pConverter->weights.f32[iChannelIn][iChannelOut] == 0) {\n                                            pConverter->weights.f32[iChannelIn][iChannelOut] = weight;\n                                        }\n                                    } else {\n                                        if (pConverter->weights.s16[iChannelIn][iChannelOut] == 0) {\n                                            pConverter->weights.s16[iChannelIn][iChannelOut] = ma_channel_converter_float_to_fixed(weight);\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n\n                /* Unmapped output channels. */\n                for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) {\n                    ma_channel channelPosOut = ma_channel_map_get_channel(pConverter->pChannelMapOut, pConverter->channelsOut, iChannelOut);\n\n                    if (ma_is_spatial_channel_position(channelPosOut)) {\n                        if (!ma_channel_map_contains_channel_position(pConverter->channelsIn, pConverter->pChannelMapIn, channelPosOut)) {\n                            for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) {\n                                ma_channel channelPosIn = ma_channel_map_get_channel(pConverter->pChannelMapIn, pConverter->channelsIn, iChannelIn);\n\n                                if (ma_is_spatial_channel_position(channelPosIn)) {\n                                    float weight = 0;\n                                    if (pConverter->mixingMode == ma_channel_mix_mode_rectangular) {\n                                        weight = ma_calculate_channel_position_rectangular_weight(channelPosIn, channelPosOut);\n                                    }\n\n                                    /* Only apply the weight if we haven't already got some contribution from the respective channels. */\n                                    if (pConverter->format == ma_format_f32) {\n                                        if (pConverter->weights.f32[iChannelIn][iChannelOut] == 0) {\n                                            pConverter->weights.f32[iChannelIn][iChannelOut] = weight;\n                                        }\n                                    } else {\n                                        if (pConverter->weights.s16[iChannelIn][iChannelOut] == 0) {\n                                            pConverter->weights.s16[iChannelIn][iChannelOut] = ma_channel_converter_float_to_fixed(weight);\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n\n                /* If LFE is in the output channel map but was not present in the input channel map, configure its weight now */\n                if (pConfig->calculateLFEFromSpatialChannels) {\n                    if (!ma_channel_map_contains_channel_position(pConverter->channelsIn, pConverter->pChannelMapIn, MA_CHANNEL_LFE)) {\n                        ma_uint32 spatialChannelCount = ma_channel_map_get_spatial_channel_count(pConverter->pChannelMapIn, pConverter->channelsIn);\n                        ma_uint32 iChannelOutLFE;\n\n                        if (spatialChannelCount > 0 && ma_channel_map_find_channel_position(pConverter->channelsOut, pConverter->pChannelMapOut, MA_CHANNEL_LFE, &iChannelOutLFE)) {\n                            const float weightForLFE = 1.0f / spatialChannelCount;\n                            for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) {\n                                const ma_channel channelPosIn = ma_channel_map_get_channel(pConverter->pChannelMapIn, pConverter->channelsIn, iChannelIn);\n                                if (ma_is_spatial_channel_position(channelPosIn)) {\n                                    if (pConverter->format == ma_format_f32) {\n                                        if (pConverter->weights.f32[iChannelIn][iChannelOutLFE] == 0) {\n                                            pConverter->weights.f32[iChannelIn][iChannelOutLFE] = weightForLFE;\n                                        }\n                                    } else {\n                                        if (pConverter->weights.s16[iChannelIn][iChannelOutLFE] == 0) {\n                                            pConverter->weights.s16[iChannelIn][iChannelOutLFE] = ma_channel_converter_float_to_fixed(weightForLFE);\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                    }\n                }\n            } break;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_channel_converter_init(const ma_channel_converter_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_channel_converter* pConverter)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_channel_converter_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_channel_converter_init_preallocated(pConfig, pHeap, pConverter);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pConverter->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_channel_converter_uninit(ma_channel_converter* pConverter, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pConverter == NULL) {\n        return;\n    }\n\n    if (pConverter->_ownsHeap) {\n        ma_free(pConverter->_pHeap, pAllocationCallbacks);\n    }\n}\n\nstatic ma_result ma_channel_converter_process_pcm_frames__passthrough(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    MA_ASSERT(pConverter != NULL);\n    MA_ASSERT(pFramesOut != NULL);\n    MA_ASSERT(pFramesIn  != NULL);\n\n    ma_copy_memory_64(pFramesOut, pFramesIn, frameCount * ma_get_bytes_per_frame(pConverter->format, pConverter->channelsOut));\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_channel_converter_process_pcm_frames__shuffle(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    MA_ASSERT(pConverter != NULL);\n    MA_ASSERT(pFramesOut != NULL);\n    MA_ASSERT(pFramesIn  != NULL);\n    MA_ASSERT(pConverter->channelsIn == pConverter->channelsOut);\n\n    return ma_channel_map_apply_shuffle_table(pFramesOut, pConverter->channelsOut, pFramesIn, pConverter->channelsIn, frameCount, pConverter->pShuffleTable, pConverter->format);\n}\n\nstatic ma_result ma_channel_converter_process_pcm_frames__mono_in(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    ma_uint64 iFrame;\n\n    MA_ASSERT(pConverter != NULL);\n    MA_ASSERT(pFramesOut != NULL);\n    MA_ASSERT(pFramesIn  != NULL);\n    MA_ASSERT(pConverter->channelsIn == 1);\n\n    switch (pConverter->format)\n    {\n        case ma_format_u8:\n        {\n            /* */ ma_uint8* pFramesOutU8 = (      ma_uint8*)pFramesOut;\n            const ma_uint8* pFramesInU8  = (const ma_uint8*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < pConverter->channelsOut; iChannel += 1) {\n                    pFramesOutU8[iFrame*pConverter->channelsOut + iChannel] = pFramesInU8[iFrame];\n                }\n            }\n        } break;\n\n        case ma_format_s16:\n        {\n            /* */ ma_int16* pFramesOutS16 = (      ma_int16*)pFramesOut;\n            const ma_int16* pFramesInS16  = (const ma_int16*)pFramesIn;\n\n            if (pConverter->channelsOut == 2) {\n                for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                    pFramesOutS16[iFrame*2 + 0] = pFramesInS16[iFrame];\n                    pFramesOutS16[iFrame*2 + 1] = pFramesInS16[iFrame];\n                }\n            } else {\n                for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                    ma_uint32 iChannel;\n                    for (iChannel = 0; iChannel < pConverter->channelsOut; iChannel += 1) {\n                        pFramesOutS16[iFrame*pConverter->channelsOut + iChannel] = pFramesInS16[iFrame];\n                    }\n                }\n            }\n        } break;\n\n        case ma_format_s24:\n        {\n            /* */ ma_uint8* pFramesOutS24 = (      ma_uint8*)pFramesOut;\n            const ma_uint8* pFramesInS24  = (const ma_uint8*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < pConverter->channelsOut; iChannel += 1) {\n                    ma_uint64 iSampleOut = iFrame*pConverter->channelsOut + iChannel;\n                    ma_uint64 iSampleIn  = iFrame;\n                    pFramesOutS24[iSampleOut*3 + 0] = pFramesInS24[iSampleIn*3 + 0];\n                    pFramesOutS24[iSampleOut*3 + 1] = pFramesInS24[iSampleIn*3 + 1];\n                    pFramesOutS24[iSampleOut*3 + 2] = pFramesInS24[iSampleIn*3 + 2];\n                }\n            }\n        } break;\n\n        case ma_format_s32:\n        {\n            /* */ ma_int32* pFramesOutS32 = (      ma_int32*)pFramesOut;\n            const ma_int32* pFramesInS32  = (const ma_int32*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                ma_uint32 iChannel;\n                for (iChannel = 0; iChannel < pConverter->channelsOut; iChannel += 1) {\n                    pFramesOutS32[iFrame*pConverter->channelsOut + iChannel] = pFramesInS32[iFrame];\n                }\n            }\n        } break;\n\n        case ma_format_f32:\n        {\n            /* */ float* pFramesOutF32 = (      float*)pFramesOut;\n            const float* pFramesInF32  = (const float*)pFramesIn;\n\n            if (pConverter->channelsOut == 2) {\n                for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                    pFramesOutF32[iFrame*2 + 0] = pFramesInF32[iFrame];\n                    pFramesOutF32[iFrame*2 + 1] = pFramesInF32[iFrame];\n                }\n            } else {\n                for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                    ma_uint32 iChannel;\n                    for (iChannel = 0; iChannel < pConverter->channelsOut; iChannel += 1) {\n                        pFramesOutF32[iFrame*pConverter->channelsOut + iChannel] = pFramesInF32[iFrame];\n                    }\n                }\n            }\n        } break;\n\n        default: return MA_INVALID_OPERATION;   /* Unknown format. */\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_channel_converter_process_pcm_frames__mono_out(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    ma_uint64 iFrame;\n    ma_uint32 iChannel;\n\n    MA_ASSERT(pConverter != NULL);\n    MA_ASSERT(pFramesOut != NULL);\n    MA_ASSERT(pFramesIn  != NULL);\n    MA_ASSERT(pConverter->channelsOut == 1);\n\n    switch (pConverter->format)\n    {\n        case ma_format_u8:\n        {\n            /* */ ma_uint8* pFramesOutU8 = (      ma_uint8*)pFramesOut;\n            const ma_uint8* pFramesInU8  = (const ma_uint8*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                ma_int32 t = 0;\n                for (iChannel = 0; iChannel < pConverter->channelsIn; iChannel += 1) {\n                    t += ma_pcm_sample_u8_to_s16_no_scale(pFramesInU8[iFrame*pConverter->channelsIn + iChannel]);\n                }\n\n                pFramesOutU8[iFrame] = ma_clip_u8(t / pConverter->channelsOut);\n            }\n        } break;\n\n        case ma_format_s16:\n        {\n            /* */ ma_int16* pFramesOutS16 = (      ma_int16*)pFramesOut;\n            const ma_int16* pFramesInS16  = (const ma_int16*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                ma_int32 t = 0;\n                for (iChannel = 0; iChannel < pConverter->channelsIn; iChannel += 1) {\n                    t += pFramesInS16[iFrame*pConverter->channelsIn + iChannel];\n                }\n\n                pFramesOutS16[iFrame] = (ma_int16)(t / pConverter->channelsIn);\n            }\n        } break;\n\n        case ma_format_s24:\n        {\n            /* */ ma_uint8* pFramesOutS24 = (      ma_uint8*)pFramesOut;\n            const ma_uint8* pFramesInS24  = (const ma_uint8*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                ma_int64 t = 0;\n                for (iChannel = 0; iChannel < pConverter->channelsIn; iChannel += 1) {\n                    t += ma_pcm_sample_s24_to_s32_no_scale(&pFramesInS24[(iFrame*pConverter->channelsIn + iChannel)*3]);\n                }\n\n                ma_pcm_sample_s32_to_s24_no_scale(t / pConverter->channelsIn, &pFramesOutS24[iFrame*3]);\n            }\n        } break;\n\n        case ma_format_s32:\n        {\n            /* */ ma_int32* pFramesOutS32 = (      ma_int32*)pFramesOut;\n            const ma_int32* pFramesInS32  = (const ma_int32*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                ma_int64 t = 0;\n                for (iChannel = 0; iChannel < pConverter->channelsIn; iChannel += 1) {\n                    t += pFramesInS32[iFrame*pConverter->channelsIn + iChannel];\n                }\n\n                pFramesOutS32[iFrame] = (ma_int32)(t / pConverter->channelsIn);\n            }\n        } break;\n\n        case ma_format_f32:\n        {\n            /* */ float* pFramesOutF32 = (      float*)pFramesOut;\n            const float* pFramesInF32  = (const float*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; ++iFrame) {\n                float t = 0;\n                for (iChannel = 0; iChannel < pConverter->channelsIn; iChannel += 1) {\n                    t += pFramesInF32[iFrame*pConverter->channelsIn + iChannel];\n                }\n\n                pFramesOutF32[iFrame] = t / pConverter->channelsIn;\n            }\n        } break;\n\n        default: return MA_INVALID_OPERATION;   /* Unknown format. */\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_channel_converter_process_pcm_frames__weights(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    ma_uint32 iFrame;\n    ma_uint32 iChannelIn;\n    ma_uint32 iChannelOut;\n\n    MA_ASSERT(pConverter != NULL);\n    MA_ASSERT(pFramesOut != NULL);\n    MA_ASSERT(pFramesIn  != NULL);\n\n    /* This is the more complicated case. Each of the output channels is accumulated with 0 or more input channels. */\n\n    /* Clear. */\n    ma_zero_memory_64(pFramesOut, frameCount * ma_get_bytes_per_frame(pConverter->format, pConverter->channelsOut));\n\n    /* Accumulate. */\n    switch (pConverter->format)\n    {\n        case ma_format_u8:\n        {\n            /* */ ma_uint8* pFramesOutU8 = (      ma_uint8*)pFramesOut;\n            const ma_uint8* pFramesInU8  = (const ma_uint8*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) {\n                    for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) {\n                        ma_int16 u8_O = ma_pcm_sample_u8_to_s16_no_scale(pFramesOutU8[iFrame*pConverter->channelsOut + iChannelOut]);\n                        ma_int16 u8_I = ma_pcm_sample_u8_to_s16_no_scale(pFramesInU8 [iFrame*pConverter->channelsIn  + iChannelIn ]);\n                        ma_int32 s    = (ma_int32)ma_clamp(u8_O + ((u8_I * pConverter->weights.s16[iChannelIn][iChannelOut]) >> MA_CHANNEL_CONVERTER_FIXED_POINT_SHIFT), -128, 127);\n                        pFramesOutU8[iFrame*pConverter->channelsOut + iChannelOut] = ma_clip_u8((ma_int16)s);\n                    }\n                }\n            }\n        } break;\n\n        case ma_format_s16:\n        {\n            /* */ ma_int16* pFramesOutS16 = (      ma_int16*)pFramesOut;\n            const ma_int16* pFramesInS16  = (const ma_int16*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) {\n                    for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) {\n                        ma_int32 s = pFramesOutS16[iFrame*pConverter->channelsOut + iChannelOut];\n                        s += (pFramesInS16[iFrame*pConverter->channelsIn + iChannelIn] * pConverter->weights.s16[iChannelIn][iChannelOut]) >> MA_CHANNEL_CONVERTER_FIXED_POINT_SHIFT;\n\n                        pFramesOutS16[iFrame*pConverter->channelsOut + iChannelOut] = (ma_int16)ma_clamp(s, -32768, 32767);\n                    }\n                }\n            }\n        } break;\n\n        case ma_format_s24:\n        {\n            /* */ ma_uint8* pFramesOutS24 = (      ma_uint8*)pFramesOut;\n            const ma_uint8* pFramesInS24  = (const ma_uint8*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) {\n                    for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) {\n                        ma_int64 s24_O = ma_pcm_sample_s24_to_s32_no_scale(&pFramesOutS24[(iFrame*pConverter->channelsOut + iChannelOut)*3]);\n                        ma_int64 s24_I = ma_pcm_sample_s24_to_s32_no_scale(&pFramesInS24 [(iFrame*pConverter->channelsIn  + iChannelIn )*3]);\n                        ma_int64 s24   = (ma_int32)ma_clamp(s24_O + ((s24_I * pConverter->weights.s16[iChannelIn][iChannelOut]) >> MA_CHANNEL_CONVERTER_FIXED_POINT_SHIFT), -8388608, 8388607);\n                        ma_pcm_sample_s32_to_s24_no_scale(s24, &pFramesOutS24[(iFrame*pConverter->channelsOut + iChannelOut)*3]);\n                    }\n                }\n            }\n        } break;\n\n        case ma_format_s32:\n        {\n            /* */ ma_int32* pFramesOutS32 = (      ma_int32*)pFramesOut;\n            const ma_int32* pFramesInS32  = (const ma_int32*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) {\n                    for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) {\n                        ma_int64 s = pFramesOutS32[iFrame*pConverter->channelsOut + iChannelOut];\n                        s += ((ma_int64)pFramesInS32[iFrame*pConverter->channelsIn + iChannelIn] * pConverter->weights.s16[iChannelIn][iChannelOut]) >> MA_CHANNEL_CONVERTER_FIXED_POINT_SHIFT;\n\n                        pFramesOutS32[iFrame*pConverter->channelsOut + iChannelOut] = ma_clip_s32(s);\n                    }\n                }\n            }\n        } break;\n\n        case ma_format_f32:\n        {\n            /* */ float* pFramesOutF32 = (      float*)pFramesOut;\n            const float* pFramesInF32  = (const float*)pFramesIn;\n\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannelIn = 0; iChannelIn < pConverter->channelsIn; ++iChannelIn) {\n                    for (iChannelOut = 0; iChannelOut < pConverter->channelsOut; ++iChannelOut) {\n                        pFramesOutF32[iFrame*pConverter->channelsOut + iChannelOut] += pFramesInF32[iFrame*pConverter->channelsIn + iChannelIn] * pConverter->weights.f32[iChannelIn][iChannelOut];\n                    }\n                }\n            }\n        } break;\n\n        default: return MA_INVALID_OPERATION;   /* Unknown format. */\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_channel_converter_process_pcm_frames(ma_channel_converter* pConverter, void* pFramesOut, const void* pFramesIn, ma_uint64 frameCount)\n{\n    if (pConverter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pFramesOut == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pFramesIn == NULL) {\n        ma_zero_memory_64(pFramesOut, frameCount * ma_get_bytes_per_frame(pConverter->format, pConverter->channelsOut));\n        return MA_SUCCESS;\n    }\n\n    switch (pConverter->conversionPath)\n    {\n        case ma_channel_conversion_path_passthrough: return ma_channel_converter_process_pcm_frames__passthrough(pConverter, pFramesOut, pFramesIn, frameCount);\n        case ma_channel_conversion_path_mono_out:    return ma_channel_converter_process_pcm_frames__mono_out(pConverter, pFramesOut, pFramesIn, frameCount);\n        case ma_channel_conversion_path_mono_in:     return ma_channel_converter_process_pcm_frames__mono_in(pConverter, pFramesOut, pFramesIn, frameCount);\n        case ma_channel_conversion_path_shuffle:     return ma_channel_converter_process_pcm_frames__shuffle(pConverter, pFramesOut, pFramesIn, frameCount);\n        case ma_channel_conversion_path_weights:\n        default:\n        {\n            return ma_channel_converter_process_pcm_frames__weights(pConverter, pFramesOut, pFramesIn, frameCount);\n        }\n    }\n}\n\nMA_API ma_result ma_channel_converter_get_input_channel_map(const ma_channel_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    if (pConverter == NULL || pChannelMap == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_channel_map_copy_or_default(pChannelMap, channelMapCap, pConverter->pChannelMapIn, pConverter->channelsIn);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_channel_converter_get_output_channel_map(const ma_channel_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    if (pConverter == NULL || pChannelMap == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_channel_map_copy_or_default(pChannelMap, channelMapCap, pConverter->pChannelMapOut, pConverter->channelsOut);\n\n    return MA_SUCCESS;\n}\n\n\n/**************************************************************************************************************************************************************\n\nData Conversion\n\n**************************************************************************************************************************************************************/\nMA_API ma_data_converter_config ma_data_converter_config_init_default(void)\n{\n    ma_data_converter_config config;\n    MA_ZERO_OBJECT(&config);\n\n    config.ditherMode = ma_dither_mode_none;\n    config.resampling.algorithm = ma_resample_algorithm_linear;\n    config.allowDynamicSampleRate = MA_FALSE; /* Disable dynamic sample rates by default because dynamic rate adjustments should be quite rare and it allows an optimization for cases when the in and out sample rates are the same. */\n\n    /* Linear resampling defaults. */\n    config.resampling.linear.lpfOrder = 1;\n\n    return config;\n}\n\nMA_API ma_data_converter_config ma_data_converter_config_init(ma_format formatIn, ma_format formatOut, ma_uint32 channelsIn, ma_uint32 channelsOut, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut)\n{\n    ma_data_converter_config config = ma_data_converter_config_init_default();\n    config.formatIn      = formatIn;\n    config.formatOut     = formatOut;\n    config.channelsIn    = channelsIn;\n    config.channelsOut   = channelsOut;\n    config.sampleRateIn  = sampleRateIn;\n    config.sampleRateOut = sampleRateOut;\n\n    return config;\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t channelConverterOffset;\n    size_t resamplerOffset;\n} ma_data_converter_heap_layout;\n\nstatic ma_bool32 ma_data_converter_config_is_resampler_required(const ma_data_converter_config* pConfig)\n{\n    MA_ASSERT(pConfig != NULL);\n\n    return pConfig->allowDynamicSampleRate || pConfig->sampleRateIn != pConfig->sampleRateOut;\n}\n\nstatic ma_format ma_data_converter_config_get_mid_format(const ma_data_converter_config* pConfig)\n{\n    MA_ASSERT(pConfig != NULL);\n\n    /*\n    We want to avoid as much data conversion as possible. The channel converter and linear\n    resampler both support s16 and f32 natively. We need to decide on the format to use for this\n    stage. We call this the mid format because it's used in the middle stage of the conversion\n    pipeline. If the output format is either s16 or f32 we use that one. If that is not the case it\n    will do the same thing for the input format. If it's neither we just use f32. If we are using a\n    custom resampling backend, we can only guarantee that f32 will be supported so we'll be forced\n    to use that if resampling is required.\n    */\n    if (ma_data_converter_config_is_resampler_required(pConfig) && pConfig->resampling.algorithm != ma_resample_algorithm_linear) {\n        return ma_format_f32;  /* <-- Force f32 since that is the only one we can guarantee will be supported by the resampler. */\n    } else {\n        /*  */ if (pConfig->formatOut == ma_format_s16 || pConfig->formatOut == ma_format_f32) {\n            return pConfig->formatOut;\n        } else if (pConfig->formatIn  == ma_format_s16 || pConfig->formatIn  == ma_format_f32) {\n            return pConfig->formatIn;\n        } else {\n            return ma_format_f32;\n        }\n    }\n}\n\nstatic ma_channel_converter_config ma_channel_converter_config_init_from_data_converter_config(const ma_data_converter_config* pConfig)\n{\n    ma_channel_converter_config channelConverterConfig;\n\n    MA_ASSERT(pConfig != NULL);\n\n    channelConverterConfig = ma_channel_converter_config_init(ma_data_converter_config_get_mid_format(pConfig), pConfig->channelsIn, pConfig->pChannelMapIn, pConfig->channelsOut, pConfig->pChannelMapOut, pConfig->channelMixMode);\n    channelConverterConfig.ppWeights = pConfig->ppChannelWeights;\n    channelConverterConfig.calculateLFEFromSpatialChannels = pConfig->calculateLFEFromSpatialChannels;\n\n    return channelConverterConfig;\n}\n\nstatic ma_resampler_config ma_resampler_config_init_from_data_converter_config(const ma_data_converter_config* pConfig)\n{\n    ma_resampler_config resamplerConfig;\n    ma_uint32 resamplerChannels;\n\n    MA_ASSERT(pConfig != NULL);\n\n    /* The resampler is the most expensive part of the conversion process, so we need to do it at the stage where the channel count is at it's lowest. */\n    if (pConfig->channelsIn < pConfig->channelsOut) {\n        resamplerChannels = pConfig->channelsIn;\n    } else {\n        resamplerChannels = pConfig->channelsOut;\n    }\n\n    resamplerConfig = ma_resampler_config_init(ma_data_converter_config_get_mid_format(pConfig), resamplerChannels, pConfig->sampleRateIn, pConfig->sampleRateOut, pConfig->resampling.algorithm);\n    resamplerConfig.linear           = pConfig->resampling.linear;\n    resamplerConfig.pBackendVTable   = pConfig->resampling.pBackendVTable;\n    resamplerConfig.pBackendUserData = pConfig->resampling.pBackendUserData;\n\n    return resamplerConfig;\n}\n\nstatic ma_result ma_data_converter_get_heap_layout(const ma_data_converter_config* pConfig, ma_data_converter_heap_layout* pHeapLayout)\n{\n    ma_result result;\n\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->channelsIn == 0 || pConfig->channelsOut == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* Channel converter. */\n    pHeapLayout->channelConverterOffset = pHeapLayout->sizeInBytes;\n    {\n        size_t heapSizeInBytes;\n        ma_channel_converter_config channelConverterConfig = ma_channel_converter_config_init_from_data_converter_config(pConfig);\n\n        result = ma_channel_converter_get_heap_size(&channelConverterConfig, &heapSizeInBytes);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pHeapLayout->sizeInBytes += heapSizeInBytes;\n    }\n\n    /* Resampler. */\n    pHeapLayout->resamplerOffset = pHeapLayout->sizeInBytes;\n    if (ma_data_converter_config_is_resampler_required(pConfig)) {\n        size_t heapSizeInBytes;\n        ma_resampler_config resamplerConfig = ma_resampler_config_init_from_data_converter_config(pConfig);\n\n        result = ma_resampler_get_heap_size(&resamplerConfig, &heapSizeInBytes);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pHeapLayout->sizeInBytes += heapSizeInBytes;\n    }\n\n    /* Make sure allocation size is aligned. */\n    pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_data_converter_get_heap_size(const ma_data_converter_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_data_converter_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_data_converter_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_data_converter_init_preallocated(const ma_data_converter_config* pConfig, void* pHeap, ma_data_converter* pConverter)\n{\n    ma_result result;\n    ma_data_converter_heap_layout heapLayout;\n    ma_format midFormat;\n    ma_bool32 isResamplingRequired;\n\n    if (pConverter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pConverter);\n\n    result = ma_data_converter_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pConverter->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n    pConverter->formatIn      = pConfig->formatIn;\n    pConverter->formatOut     = pConfig->formatOut;\n    pConverter->channelsIn    = pConfig->channelsIn;\n    pConverter->channelsOut   = pConfig->channelsOut;\n    pConverter->sampleRateIn  = pConfig->sampleRateIn;\n    pConverter->sampleRateOut = pConfig->sampleRateOut;\n    pConverter->ditherMode    = pConfig->ditherMode;\n\n    /*\n    Determine if resampling is required. We need to do this so we can determine an appropriate\n    mid format to use. If resampling is required, the mid format must be ma_format_f32 since\n    that is the only one that is guaranteed to supported by custom resampling backends.\n    */\n    isResamplingRequired = ma_data_converter_config_is_resampler_required(pConfig);\n    midFormat = ma_data_converter_config_get_mid_format(pConfig);\n\n\n    /* Channel converter. We always initialize this, but we check if it configures itself as a passthrough to determine whether or not it's needed. */\n    {\n        ma_channel_converter_config channelConverterConfig = ma_channel_converter_config_init_from_data_converter_config(pConfig);\n\n        result = ma_channel_converter_init_preallocated(&channelConverterConfig, ma_offset_ptr(pHeap, heapLayout.channelConverterOffset), &pConverter->channelConverter);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        /* If the channel converter is not a passthrough we need to enable it. Otherwise we can skip it. */\n        if (pConverter->channelConverter.conversionPath != ma_channel_conversion_path_passthrough) {\n            pConverter->hasChannelConverter = MA_TRUE;\n        }\n    }\n\n\n    /* Resampler. */\n    if (isResamplingRequired) {\n        ma_resampler_config resamplerConfig = ma_resampler_config_init_from_data_converter_config(pConfig);\n\n        result = ma_resampler_init_preallocated(&resamplerConfig, ma_offset_ptr(pHeap, heapLayout.resamplerOffset), &pConverter->resampler);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pConverter->hasResampler = MA_TRUE;\n    }\n\n\n    /* We can simplify pre- and post-format conversion if we have neither channel conversion nor resampling. */\n    if (pConverter->hasChannelConverter == MA_FALSE && pConverter->hasResampler == MA_FALSE) {\n        /* We have neither channel conversion nor resampling so we'll only need one of pre- or post-format conversion, or none if the input and output formats are the same. */\n        if (pConverter->formatIn == pConverter->formatOut) {\n            /* The formats are the same so we can just pass through. */\n            pConverter->hasPreFormatConversion  = MA_FALSE;\n            pConverter->hasPostFormatConversion = MA_FALSE;\n        } else {\n            /* The formats are different so we need to do either pre- or post-format conversion. It doesn't matter which. */\n            pConverter->hasPreFormatConversion  = MA_FALSE;\n            pConverter->hasPostFormatConversion = MA_TRUE;\n        }\n    } else {\n        /* We have a channel converter and/or resampler so we'll need channel conversion based on the mid format. */\n        if (pConverter->formatIn != midFormat) {\n            pConverter->hasPreFormatConversion  = MA_TRUE;\n        }\n        if (pConverter->formatOut != midFormat) {\n            pConverter->hasPostFormatConversion = MA_TRUE;\n        }\n    }\n\n    /* We can enable passthrough optimizations if applicable. Note that we'll only be able to do this if the sample rate is static. */\n    if (pConverter->hasPreFormatConversion  == MA_FALSE &&\n        pConverter->hasPostFormatConversion == MA_FALSE &&\n        pConverter->hasChannelConverter     == MA_FALSE &&\n        pConverter->hasResampler            == MA_FALSE) {\n        pConverter->isPassthrough = MA_TRUE;\n    }\n\n\n    /* We now need to determine our execution path. */\n    if (pConverter->isPassthrough) {\n        pConverter->executionPath = ma_data_converter_execution_path_passthrough;\n    } else {\n        if (pConverter->channelsIn < pConverter->channelsOut) {\n            /* Do resampling first, if necessary. */\n            MA_ASSERT(pConverter->hasChannelConverter == MA_TRUE);\n\n            if (pConverter->hasResampler) {\n                pConverter->executionPath = ma_data_converter_execution_path_resample_first;\n            } else {\n                pConverter->executionPath = ma_data_converter_execution_path_channels_only;\n            }\n        } else {\n            /* Do channel conversion first, if necessary. */\n            if (pConverter->hasChannelConverter) {\n                if (pConverter->hasResampler) {\n                    pConverter->executionPath = ma_data_converter_execution_path_channels_first;\n                } else {\n                    pConverter->executionPath = ma_data_converter_execution_path_channels_only;\n                }\n            } else {\n                /* Channel routing not required. */\n                if (pConverter->hasResampler) {\n                    pConverter->executionPath = ma_data_converter_execution_path_resample_only;\n                } else {\n                    pConverter->executionPath = ma_data_converter_execution_path_format_only;\n                }\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_data_converter_init(const ma_data_converter_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_converter* pConverter)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_data_converter_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_data_converter_init_preallocated(pConfig, pHeap, pConverter);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pConverter->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_data_converter_uninit(ma_data_converter* pConverter, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pConverter == NULL) {\n        return;\n    }\n\n    if (pConverter->hasResampler) {\n        ma_resampler_uninit(&pConverter->resampler, pAllocationCallbacks);\n    }\n\n    ma_channel_converter_uninit(&pConverter->channelConverter, pAllocationCallbacks);\n\n    if (pConverter->_ownsHeap) {\n        ma_free(pConverter->_pHeap, pAllocationCallbacks);\n    }\n}\n\nstatic ma_result ma_data_converter_process_pcm_frames__passthrough(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    ma_uint64 frameCountIn;\n    ma_uint64 frameCountOut;\n    ma_uint64 frameCount;\n\n    MA_ASSERT(pConverter != NULL);\n\n    frameCountIn = 0;\n    if (pFrameCountIn != NULL) {\n        frameCountIn = *pFrameCountIn;\n    }\n\n    frameCountOut = 0;\n    if (pFrameCountOut != NULL) {\n        frameCountOut = *pFrameCountOut;\n    }\n\n    frameCount = ma_min(frameCountIn, frameCountOut);\n\n    if (pFramesOut != NULL) {\n        if (pFramesIn != NULL) {\n            ma_copy_memory_64(pFramesOut, pFramesIn, frameCount * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut));\n        } else {\n            ma_zero_memory_64(pFramesOut,            frameCount * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut));\n        }\n    }\n\n    if (pFrameCountIn != NULL) {\n        *pFrameCountIn = frameCount;\n    }\n    if (pFrameCountOut != NULL) {\n        *pFrameCountOut = frameCount;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_data_converter_process_pcm_frames__format_only(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    ma_uint64 frameCountIn;\n    ma_uint64 frameCountOut;\n    ma_uint64 frameCount;\n\n    MA_ASSERT(pConverter != NULL);\n\n    frameCountIn = 0;\n    if (pFrameCountIn != NULL) {\n        frameCountIn = *pFrameCountIn;\n    }\n\n    frameCountOut = 0;\n    if (pFrameCountOut != NULL) {\n        frameCountOut = *pFrameCountOut;\n    }\n\n    frameCount = ma_min(frameCountIn, frameCountOut);\n\n    if (pFramesOut != NULL) {\n        if (pFramesIn != NULL) {\n            ma_convert_pcm_frames_format(pFramesOut, pConverter->formatOut, pFramesIn, pConverter->formatIn, frameCount, pConverter->channelsIn, pConverter->ditherMode);\n        } else {\n            ma_zero_memory_64(pFramesOut, frameCount * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut));\n        }\n    }\n\n    if (pFrameCountIn != NULL) {\n        *pFrameCountIn = frameCount;\n    }\n    if (pFrameCountOut != NULL) {\n        *pFrameCountOut = frameCount;\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_data_converter_process_pcm_frames__resample_with_format_conversion(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint64 frameCountIn;\n    ma_uint64 frameCountOut;\n    ma_uint64 framesProcessedIn;\n    ma_uint64 framesProcessedOut;\n\n    MA_ASSERT(pConverter != NULL);\n\n    frameCountIn = 0;\n    if (pFrameCountIn != NULL) {\n        frameCountIn = *pFrameCountIn;\n    }\n\n    frameCountOut = 0;\n    if (pFrameCountOut != NULL) {\n        frameCountOut = *pFrameCountOut;\n    }\n\n    framesProcessedIn  = 0;\n    framesProcessedOut = 0;\n\n    while (framesProcessedOut < frameCountOut) {\n        ma_uint8 pTempBufferOut[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n        const ma_uint32 tempBufferOutCap = sizeof(pTempBufferOut) / ma_get_bytes_per_frame(pConverter->resampler.format, pConverter->resampler.channels);\n        const void* pFramesInThisIteration;\n        /* */ void* pFramesOutThisIteration;\n        ma_uint64 frameCountInThisIteration;\n        ma_uint64 frameCountOutThisIteration;\n\n        if (pFramesIn != NULL) {\n            pFramesInThisIteration = ma_offset_ptr(pFramesIn, framesProcessedIn * ma_get_bytes_per_frame(pConverter->formatIn, pConverter->channelsIn));\n        } else {\n            pFramesInThisIteration = NULL;\n        }\n\n        if (pFramesOut != NULL) {\n            pFramesOutThisIteration = ma_offset_ptr(pFramesOut, framesProcessedOut * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut));\n        } else {\n            pFramesOutThisIteration = NULL;\n        }\n\n        /* Do a pre format conversion if necessary. */\n        if (pConverter->hasPreFormatConversion) {\n            ma_uint8 pTempBufferIn[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n            const ma_uint32 tempBufferInCap = sizeof(pTempBufferIn) / ma_get_bytes_per_frame(pConverter->resampler.format, pConverter->resampler.channels);\n\n            frameCountInThisIteration  = (frameCountIn - framesProcessedIn);\n            if (frameCountInThisIteration > tempBufferInCap) {\n                frameCountInThisIteration = tempBufferInCap;\n            }\n\n            if (pConverter->hasPostFormatConversion) {\n               if (frameCountInThisIteration > tempBufferOutCap) {\n                   frameCountInThisIteration = tempBufferOutCap;\n               }\n            }\n\n            if (pFramesInThisIteration != NULL) {\n                ma_convert_pcm_frames_format(pTempBufferIn, pConverter->resampler.format, pFramesInThisIteration, pConverter->formatIn, frameCountInThisIteration, pConverter->channelsIn, pConverter->ditherMode);\n            } else {\n                MA_ZERO_MEMORY(pTempBufferIn, sizeof(pTempBufferIn));\n            }\n\n            frameCountOutThisIteration = (frameCountOut - framesProcessedOut);\n\n            if (pConverter->hasPostFormatConversion) {\n                /* Both input and output conversion required. Output to the temp buffer. */\n                if (frameCountOutThisIteration > tempBufferOutCap) {\n                    frameCountOutThisIteration = tempBufferOutCap;\n                }\n\n                result = ma_resampler_process_pcm_frames(&pConverter->resampler, pTempBufferIn, &frameCountInThisIteration, pTempBufferOut, &frameCountOutThisIteration);\n            } else {\n                /* Only pre-format required. Output straight to the output buffer. */\n                result = ma_resampler_process_pcm_frames(&pConverter->resampler, pTempBufferIn, &frameCountInThisIteration, pFramesOutThisIteration, &frameCountOutThisIteration);\n            }\n\n            if (result != MA_SUCCESS) {\n                break;\n            }\n        } else {\n            /* No pre-format required. Just read straight from the input buffer. */\n            MA_ASSERT(pConverter->hasPostFormatConversion == MA_TRUE);\n\n            frameCountInThisIteration  = (frameCountIn  - framesProcessedIn);\n            frameCountOutThisIteration = (frameCountOut - framesProcessedOut);\n            if (frameCountOutThisIteration > tempBufferOutCap) {\n                frameCountOutThisIteration = tempBufferOutCap;\n            }\n\n            result = ma_resampler_process_pcm_frames(&pConverter->resampler, pFramesInThisIteration, &frameCountInThisIteration, pTempBufferOut, &frameCountOutThisIteration);\n            if (result != MA_SUCCESS) {\n                break;\n            }\n        }\n\n        /* If we are doing a post format conversion we need to do that now. */\n        if (pConverter->hasPostFormatConversion) {\n            if (pFramesOutThisIteration != NULL) {\n                ma_convert_pcm_frames_format(pFramesOutThisIteration, pConverter->formatOut, pTempBufferOut, pConverter->resampler.format, frameCountOutThisIteration, pConverter->resampler.channels, pConverter->ditherMode);\n            }\n        }\n\n        framesProcessedIn  += frameCountInThisIteration;\n        framesProcessedOut += frameCountOutThisIteration;\n\n        MA_ASSERT(framesProcessedIn  <= frameCountIn);\n        MA_ASSERT(framesProcessedOut <= frameCountOut);\n\n        if (frameCountOutThisIteration == 0) {\n            break;  /* Consumed all of our input data. */\n        }\n    }\n\n    if (pFrameCountIn != NULL) {\n        *pFrameCountIn = framesProcessedIn;\n    }\n    if (pFrameCountOut != NULL) {\n        *pFrameCountOut = framesProcessedOut;\n    }\n\n    return result;\n}\n\nstatic ma_result ma_data_converter_process_pcm_frames__resample_only(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    MA_ASSERT(pConverter != NULL);\n\n    if (pConverter->hasPreFormatConversion == MA_FALSE && pConverter->hasPostFormatConversion == MA_FALSE) {\n        /* Neither pre- nor post-format required. This is simple case where only resampling is required. */\n        return ma_resampler_process_pcm_frames(&pConverter->resampler, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n    } else {\n        /* Format conversion required. */\n        return ma_data_converter_process_pcm_frames__resample_with_format_conversion(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n    }\n}\n\nstatic ma_result ma_data_converter_process_pcm_frames__channels_only(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    ma_result result;\n    ma_uint64 frameCountIn;\n    ma_uint64 frameCountOut;\n    ma_uint64 frameCount;\n\n    MA_ASSERT(pConverter != NULL);\n\n    frameCountIn = 0;\n    if (pFrameCountIn != NULL) {\n        frameCountIn = *pFrameCountIn;\n    }\n\n    frameCountOut = 0;\n    if (pFrameCountOut != NULL) {\n        frameCountOut = *pFrameCountOut;\n    }\n\n    frameCount = ma_min(frameCountIn, frameCountOut);\n\n    if (pConverter->hasPreFormatConversion == MA_FALSE && pConverter->hasPostFormatConversion == MA_FALSE) {\n        /* No format conversion required. */\n        result = ma_channel_converter_process_pcm_frames(&pConverter->channelConverter, pFramesOut, pFramesIn, frameCount);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    } else {\n        /* Format conversion required. */\n        ma_uint64 framesProcessed = 0;\n\n        while (framesProcessed < frameCount) {\n            ma_uint8 pTempBufferOut[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n            const ma_uint32 tempBufferOutCap = sizeof(pTempBufferOut) / ma_get_bytes_per_frame(pConverter->channelConverter.format, pConverter->channelConverter.channelsOut);\n            const void* pFramesInThisIteration;\n            /* */ void* pFramesOutThisIteration;\n            ma_uint64 frameCountThisIteration;\n\n            if (pFramesIn != NULL) {\n                pFramesInThisIteration = ma_offset_ptr(pFramesIn, framesProcessed * ma_get_bytes_per_frame(pConverter->formatIn, pConverter->channelsIn));\n            } else {\n                pFramesInThisIteration = NULL;\n            }\n\n            if (pFramesOut != NULL) {\n                pFramesOutThisIteration = ma_offset_ptr(pFramesOut, framesProcessed * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut));\n            } else {\n                pFramesOutThisIteration = NULL;\n            }\n\n            /* Do a pre format conversion if necessary. */\n            if (pConverter->hasPreFormatConversion) {\n                ma_uint8 pTempBufferIn[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n                const ma_uint32 tempBufferInCap = sizeof(pTempBufferIn) / ma_get_bytes_per_frame(pConverter->channelConverter.format, pConverter->channelConverter.channelsIn);\n\n                frameCountThisIteration = (frameCount - framesProcessed);\n                if (frameCountThisIteration > tempBufferInCap) {\n                    frameCountThisIteration = tempBufferInCap;\n                }\n\n                if (pConverter->hasPostFormatConversion) {\n                    if (frameCountThisIteration > tempBufferOutCap) {\n                        frameCountThisIteration = tempBufferOutCap;\n                    }\n                }\n\n                if (pFramesInThisIteration != NULL) {\n                    ma_convert_pcm_frames_format(pTempBufferIn, pConverter->channelConverter.format, pFramesInThisIteration, pConverter->formatIn, frameCountThisIteration, pConverter->channelsIn, pConverter->ditherMode);\n                } else {\n                    MA_ZERO_MEMORY(pTempBufferIn, sizeof(pTempBufferIn));\n                }\n\n                if (pConverter->hasPostFormatConversion) {\n                    /* Both input and output conversion required. Output to the temp buffer. */\n                    result = ma_channel_converter_process_pcm_frames(&pConverter->channelConverter, pTempBufferOut, pTempBufferIn, frameCountThisIteration);\n                } else {\n                    /* Only pre-format required. Output straight to the output buffer. */\n                    result = ma_channel_converter_process_pcm_frames(&pConverter->channelConverter, pFramesOutThisIteration, pTempBufferIn, frameCountThisIteration);\n                }\n\n                if (result != MA_SUCCESS) {\n                    break;\n                }\n            } else {\n                /* No pre-format required. Just read straight from the input buffer. */\n                MA_ASSERT(pConverter->hasPostFormatConversion == MA_TRUE);\n\n                frameCountThisIteration = (frameCount - framesProcessed);\n                if (frameCountThisIteration > tempBufferOutCap) {\n                    frameCountThisIteration = tempBufferOutCap;\n                }\n\n                result = ma_channel_converter_process_pcm_frames(&pConverter->channelConverter, pTempBufferOut, pFramesInThisIteration, frameCountThisIteration);\n                if (result != MA_SUCCESS) {\n                    break;\n                }\n            }\n\n            /* If we are doing a post format conversion we need to do that now. */\n            if (pConverter->hasPostFormatConversion) {\n                if (pFramesOutThisIteration != NULL) {\n                    ma_convert_pcm_frames_format(pFramesOutThisIteration, pConverter->formatOut, pTempBufferOut, pConverter->channelConverter.format, frameCountThisIteration, pConverter->channelConverter.channelsOut, pConverter->ditherMode);\n                }\n            }\n\n            framesProcessed += frameCountThisIteration;\n        }\n    }\n\n    if (pFrameCountIn != NULL) {\n        *pFrameCountIn = frameCount;\n    }\n    if (pFrameCountOut != NULL) {\n        *pFrameCountOut = frameCount;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_data_converter_process_pcm_frames__resample_first(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    ma_result result;\n    ma_uint64 frameCountIn;\n    ma_uint64 frameCountOut;\n    ma_uint64 framesProcessedIn;\n    ma_uint64 framesProcessedOut;\n    ma_uint8  pTempBufferIn[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];   /* In resampler format. */\n    ma_uint64 tempBufferInCap;\n    ma_uint8  pTempBufferMid[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];  /* In resampler format, channel converter input format. */\n    ma_uint64 tempBufferMidCap;\n    ma_uint8  pTempBufferOut[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];  /* In channel converter output format. */\n    ma_uint64 tempBufferOutCap;\n\n    MA_ASSERT(pConverter != NULL);\n    MA_ASSERT(pConverter->resampler.format   == pConverter->channelConverter.format);\n    MA_ASSERT(pConverter->resampler.channels == pConverter->channelConverter.channelsIn);\n    MA_ASSERT(pConverter->resampler.channels <  pConverter->channelConverter.channelsOut);\n\n    frameCountIn = 0;\n    if (pFrameCountIn != NULL) {\n        frameCountIn = *pFrameCountIn;\n    }\n\n    frameCountOut = 0;\n    if (pFrameCountOut != NULL) {\n        frameCountOut = *pFrameCountOut;\n    }\n\n    framesProcessedIn  = 0;\n    framesProcessedOut = 0;\n\n    tempBufferInCap  = sizeof(pTempBufferIn)  / ma_get_bytes_per_frame(pConverter->resampler.format, pConverter->resampler.channels);\n    tempBufferMidCap = sizeof(pTempBufferIn)  / ma_get_bytes_per_frame(pConverter->resampler.format, pConverter->resampler.channels);\n    tempBufferOutCap = sizeof(pTempBufferOut) / ma_get_bytes_per_frame(pConverter->channelConverter.format, pConverter->channelConverter.channelsOut);\n\n    while (framesProcessedOut < frameCountOut) {\n        ma_uint64 frameCountInThisIteration;\n        ma_uint64 frameCountOutThisIteration;\n        const void* pRunningFramesIn = NULL;\n        void* pRunningFramesOut = NULL;\n        const void* pResampleBufferIn;\n        void* pChannelsBufferOut;\n\n        if (pFramesIn != NULL) {\n            pRunningFramesIn  = ma_offset_ptr(pFramesIn,  framesProcessedIn  * ma_get_bytes_per_frame(pConverter->formatIn, pConverter->channelsIn));\n        }\n        if (pFramesOut != NULL) {\n            pRunningFramesOut = ma_offset_ptr(pFramesOut, framesProcessedOut * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut));\n        }\n\n        /* Run input data through the resampler and output it to the temporary buffer. */\n        frameCountInThisIteration = (frameCountIn - framesProcessedIn);\n\n        if (pConverter->hasPreFormatConversion) {\n            if (frameCountInThisIteration > tempBufferInCap) {\n                frameCountInThisIteration = tempBufferInCap;\n            }\n        }\n\n        frameCountOutThisIteration = (frameCountOut - framesProcessedOut);\n        if (frameCountOutThisIteration > tempBufferMidCap) {\n            frameCountOutThisIteration = tempBufferMidCap;\n        }\n\n        /* We can't read more frames than can fit in the output buffer. */\n        if (pConverter->hasPostFormatConversion) {\n            if (frameCountOutThisIteration > tempBufferOutCap) {\n                frameCountOutThisIteration = tempBufferOutCap;\n            }\n        }\n\n        /* We need to ensure we don't try to process too many input frames that we run out of room in the output buffer. If this happens we'll end up glitching. */\n\n        /*\n        We need to try to predict how many input frames will be required for the resampler. If the\n        resampler can tell us, we'll use that. Otherwise we'll need to make a best guess. The further\n        off we are from this, the more wasted format conversions we'll end up doing.\n        */\n        #if 1\n        {\n            ma_uint64 requiredInputFrameCount;\n\n            result = ma_resampler_get_required_input_frame_count(&pConverter->resampler, frameCountOutThisIteration, &requiredInputFrameCount);\n            if (result != MA_SUCCESS) {\n                /* Fall back to a best guess. */\n                requiredInputFrameCount = (frameCountOutThisIteration * pConverter->resampler.sampleRateIn) / pConverter->resampler.sampleRateOut;\n            }\n\n            if (frameCountInThisIteration > requiredInputFrameCount) {\n                frameCountInThisIteration = requiredInputFrameCount;\n            }\n        }\n        #endif\n\n        if (pConverter->hasPreFormatConversion) {\n            if (pFramesIn != NULL) {\n                ma_convert_pcm_frames_format(pTempBufferIn, pConverter->resampler.format, pRunningFramesIn, pConverter->formatIn, frameCountInThisIteration, pConverter->channelsIn, pConverter->ditherMode);\n                pResampleBufferIn = pTempBufferIn;\n            } else {\n                pResampleBufferIn = NULL;\n            }\n        } else {\n            pResampleBufferIn = pRunningFramesIn;\n        }\n\n        result = ma_resampler_process_pcm_frames(&pConverter->resampler, pResampleBufferIn, &frameCountInThisIteration, pTempBufferMid, &frameCountOutThisIteration);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n\n        /*\n        The input data has been resampled so now we need to run it through the channel converter. The input data is always contained in pTempBufferMid. We only need to do\n        this part if we have an output buffer.\n        */\n        if (pFramesOut != NULL) {\n            if (pConverter->hasPostFormatConversion) {\n                pChannelsBufferOut = pTempBufferOut;\n            } else {\n                pChannelsBufferOut = pRunningFramesOut;\n            }\n\n            result = ma_channel_converter_process_pcm_frames(&pConverter->channelConverter, pChannelsBufferOut, pTempBufferMid, frameCountOutThisIteration);\n            if (result != MA_SUCCESS) {\n                return result;\n            }\n\n            /* Finally we do post format conversion. */\n            if (pConverter->hasPostFormatConversion) {\n                ma_convert_pcm_frames_format(pRunningFramesOut, pConverter->formatOut, pChannelsBufferOut, pConverter->channelConverter.format, frameCountOutThisIteration, pConverter->channelConverter.channelsOut, pConverter->ditherMode);\n            }\n        }\n\n\n        framesProcessedIn  += frameCountInThisIteration;\n        framesProcessedOut += frameCountOutThisIteration;\n\n        MA_ASSERT(framesProcessedIn  <= frameCountIn);\n        MA_ASSERT(framesProcessedOut <= frameCountOut);\n\n        if (frameCountOutThisIteration == 0) {\n            break;  /* Consumed all of our input data. */\n        }\n    }\n\n    if (pFrameCountIn != NULL) {\n        *pFrameCountIn = framesProcessedIn;\n    }\n    if (pFrameCountOut != NULL) {\n        *pFrameCountOut = framesProcessedOut;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_data_converter_process_pcm_frames__channels_first(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    ma_result result;\n    ma_uint64 frameCountIn;\n    ma_uint64 frameCountOut;\n    ma_uint64 framesProcessedIn;\n    ma_uint64 framesProcessedOut;\n    ma_uint8  pTempBufferIn[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];   /* In resampler format. */\n    ma_uint64 tempBufferInCap;\n    ma_uint8  pTempBufferMid[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];  /* In resampler format, channel converter input format. */\n    ma_uint64 tempBufferMidCap;\n    ma_uint8  pTempBufferOut[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];  /* In channel converter output format. */\n    ma_uint64 tempBufferOutCap;\n\n    MA_ASSERT(pConverter != NULL);\n    MA_ASSERT(pConverter->resampler.format   == pConverter->channelConverter.format);\n    MA_ASSERT(pConverter->resampler.channels == pConverter->channelConverter.channelsOut);\n    MA_ASSERT(pConverter->resampler.channels <= pConverter->channelConverter.channelsIn);\n\n    frameCountIn = 0;\n    if (pFrameCountIn != NULL) {\n        frameCountIn = *pFrameCountIn;\n    }\n\n    frameCountOut = 0;\n    if (pFrameCountOut != NULL) {\n        frameCountOut = *pFrameCountOut;\n    }\n\n    framesProcessedIn  = 0;\n    framesProcessedOut = 0;\n\n    tempBufferInCap  = sizeof(pTempBufferIn)  / ma_get_bytes_per_frame(pConverter->channelConverter.format, pConverter->channelConverter.channelsIn);\n    tempBufferMidCap = sizeof(pTempBufferIn)  / ma_get_bytes_per_frame(pConverter->channelConverter.format, pConverter->channelConverter.channelsOut);\n    tempBufferOutCap = sizeof(pTempBufferOut) / ma_get_bytes_per_frame(pConverter->resampler.format, pConverter->resampler.channels);\n\n    while (framesProcessedOut < frameCountOut) {\n        ma_uint64 frameCountInThisIteration;\n        ma_uint64 frameCountOutThisIteration;\n        const void* pRunningFramesIn = NULL;\n        void* pRunningFramesOut = NULL;\n        const void* pChannelsBufferIn;\n        void* pResampleBufferOut;\n\n        if (pFramesIn != NULL) {\n            pRunningFramesIn  = ma_offset_ptr(pFramesIn,  framesProcessedIn  * ma_get_bytes_per_frame(pConverter->formatIn, pConverter->channelsIn));\n        }\n        if (pFramesOut != NULL) {\n            pRunningFramesOut = ma_offset_ptr(pFramesOut, framesProcessedOut * ma_get_bytes_per_frame(pConverter->formatOut, pConverter->channelsOut));\n        }\n\n        /*\n        Before doing any processing we need to determine how many frames we should try processing\n        this iteration, for both input and output. The resampler requires us to perform format and\n        channel conversion before passing any data into it. If we get our input count wrong, we'll\n        end up peforming redundant pre-processing. This isn't the end of the world, but it does\n        result in some inefficiencies proportionate to how far our estimates are off.\n\n        If the resampler has a means to calculate exactly how much we'll need, we'll use that.\n        Otherwise we'll make a best guess. In order to do this, we'll need to calculate the output\n        frame count first.\n        */\n        frameCountOutThisIteration = (frameCountOut - framesProcessedOut);\n        if (frameCountOutThisIteration > tempBufferMidCap) {\n            frameCountOutThisIteration = tempBufferMidCap;\n        }\n\n        if (pConverter->hasPostFormatConversion) {\n            if (frameCountOutThisIteration > tempBufferOutCap) {\n                frameCountOutThisIteration = tempBufferOutCap;\n            }\n        }\n\n        /* Now that we have the output frame count we can determine the input frame count. */\n        frameCountInThisIteration = (frameCountIn - framesProcessedIn);\n        if (pConverter->hasPreFormatConversion) {\n            if (frameCountInThisIteration > tempBufferInCap) {\n                frameCountInThisIteration = tempBufferInCap;\n            }\n        }\n\n        if (frameCountInThisIteration > tempBufferMidCap) {\n            frameCountInThisIteration = tempBufferMidCap;\n        }\n\n        #if 1\n        {\n            ma_uint64 requiredInputFrameCount;\n\n            result = ma_resampler_get_required_input_frame_count(&pConverter->resampler, frameCountOutThisIteration, &requiredInputFrameCount);\n            if (result != MA_SUCCESS) {\n                /* Fall back to a best guess. */\n                requiredInputFrameCount = (frameCountOutThisIteration * pConverter->resampler.sampleRateIn) / pConverter->resampler.sampleRateOut;\n            }\n\n            if (frameCountInThisIteration > requiredInputFrameCount) {\n                frameCountInThisIteration = requiredInputFrameCount;\n            }\n        }\n        #endif\n\n\n        /* Pre format conversion. */\n        if (pConverter->hasPreFormatConversion) {\n            if (pRunningFramesIn != NULL) {\n                ma_convert_pcm_frames_format(pTempBufferIn, pConverter->channelConverter.format, pRunningFramesIn, pConverter->formatIn, frameCountInThisIteration, pConverter->channelsIn, pConverter->ditherMode);\n                pChannelsBufferIn = pTempBufferIn;\n            } else {\n                pChannelsBufferIn = NULL;\n            }\n        } else {\n            pChannelsBufferIn = pRunningFramesIn;\n        }\n\n\n        /* Channel conversion. */\n        result = ma_channel_converter_process_pcm_frames(&pConverter->channelConverter, pTempBufferMid, pChannelsBufferIn, frameCountInThisIteration);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n\n        /* Resampling. */\n        if (pConverter->hasPostFormatConversion) {\n            pResampleBufferOut = pTempBufferOut;\n        } else {\n            pResampleBufferOut = pRunningFramesOut;\n        }\n\n        result = ma_resampler_process_pcm_frames(&pConverter->resampler, pTempBufferMid, &frameCountInThisIteration, pResampleBufferOut, &frameCountOutThisIteration);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n\n        /* Post format conversion. */\n        if (pConverter->hasPostFormatConversion) {\n            if (pRunningFramesOut != NULL) {\n                ma_convert_pcm_frames_format(pRunningFramesOut, pConverter->formatOut, pResampleBufferOut, pConverter->resampler.format, frameCountOutThisIteration, pConverter->channelsOut, pConverter->ditherMode);\n            }\n        }\n\n\n        framesProcessedIn  += frameCountInThisIteration;\n        framesProcessedOut += frameCountOutThisIteration;\n\n        MA_ASSERT(framesProcessedIn  <= frameCountIn);\n        MA_ASSERT(framesProcessedOut <= frameCountOut);\n\n        if (frameCountOutThisIteration == 0) {\n            break;  /* Consumed all of our input data. */\n        }\n    }\n\n    if (pFrameCountIn != NULL) {\n        *pFrameCountIn = framesProcessedIn;\n    }\n    if (pFrameCountOut != NULL) {\n        *pFrameCountOut = framesProcessedOut;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_data_converter_process_pcm_frames(ma_data_converter* pConverter, const void* pFramesIn, ma_uint64* pFrameCountIn, void* pFramesOut, ma_uint64* pFrameCountOut)\n{\n    if (pConverter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    switch (pConverter->executionPath)\n    {\n        case ma_data_converter_execution_path_passthrough:    return ma_data_converter_process_pcm_frames__passthrough(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n        case ma_data_converter_execution_path_format_only:    return ma_data_converter_process_pcm_frames__format_only(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n        case ma_data_converter_execution_path_channels_only:  return ma_data_converter_process_pcm_frames__channels_only(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n        case ma_data_converter_execution_path_resample_only:  return ma_data_converter_process_pcm_frames__resample_only(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n        case ma_data_converter_execution_path_resample_first: return ma_data_converter_process_pcm_frames__resample_first(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n        case ma_data_converter_execution_path_channels_first: return ma_data_converter_process_pcm_frames__channels_first(pConverter, pFramesIn, pFrameCountIn, pFramesOut, pFrameCountOut);\n        default: return MA_INVALID_OPERATION;   /* Should never hit this. */\n    }\n}\n\nMA_API ma_result ma_data_converter_set_rate(ma_data_converter* pConverter, ma_uint32 sampleRateIn, ma_uint32 sampleRateOut)\n{\n    if (pConverter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConverter->hasResampler == MA_FALSE) {\n        return MA_INVALID_OPERATION;    /* Dynamic resampling not enabled. */\n    }\n\n    return ma_resampler_set_rate(&pConverter->resampler, sampleRateIn, sampleRateOut);\n}\n\nMA_API ma_result ma_data_converter_set_rate_ratio(ma_data_converter* pConverter, float ratioInOut)\n{\n    if (pConverter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConverter->hasResampler == MA_FALSE) {\n        return MA_INVALID_OPERATION;    /* Dynamic resampling not enabled. */\n    }\n\n    return ma_resampler_set_rate_ratio(&pConverter->resampler, ratioInOut);\n}\n\nMA_API ma_uint64 ma_data_converter_get_input_latency(const ma_data_converter* pConverter)\n{\n    if (pConverter == NULL) {\n        return 0;\n    }\n\n    if (pConverter->hasResampler) {\n        return ma_resampler_get_input_latency(&pConverter->resampler);\n    }\n\n    return 0;   /* No latency without a resampler. */\n}\n\nMA_API ma_uint64 ma_data_converter_get_output_latency(const ma_data_converter* pConverter)\n{\n    if (pConverter == NULL) {\n        return 0;\n    }\n\n    if (pConverter->hasResampler) {\n        return ma_resampler_get_output_latency(&pConverter->resampler);\n    }\n\n    return 0;   /* No latency without a resampler. */\n}\n\nMA_API ma_result ma_data_converter_get_required_input_frame_count(const ma_data_converter* pConverter, ma_uint64 outputFrameCount, ma_uint64* pInputFrameCount)\n{\n    if (pInputFrameCount == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pInputFrameCount = 0;\n\n    if (pConverter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConverter->hasResampler) {\n        return ma_resampler_get_required_input_frame_count(&pConverter->resampler, outputFrameCount, pInputFrameCount);\n    } else {\n        *pInputFrameCount = outputFrameCount;   /* 1:1 */\n        return MA_SUCCESS;\n    }\n}\n\nMA_API ma_result ma_data_converter_get_expected_output_frame_count(const ma_data_converter* pConverter, ma_uint64 inputFrameCount, ma_uint64* pOutputFrameCount)\n{\n    if (pOutputFrameCount == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pOutputFrameCount = 0;\n\n    if (pConverter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConverter->hasResampler) {\n        return ma_resampler_get_expected_output_frame_count(&pConverter->resampler, inputFrameCount, pOutputFrameCount);\n    } else {\n        *pOutputFrameCount = inputFrameCount;   /* 1:1 */\n        return MA_SUCCESS;\n    }\n}\n\nMA_API ma_result ma_data_converter_get_input_channel_map(const ma_data_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    if (pConverter == NULL || pChannelMap == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConverter->hasChannelConverter) {\n        ma_channel_converter_get_output_channel_map(&pConverter->channelConverter, pChannelMap, channelMapCap);\n    } else {\n        ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pConverter->channelsOut);\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_data_converter_get_output_channel_map(const ma_data_converter* pConverter, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    if (pConverter == NULL || pChannelMap == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConverter->hasChannelConverter) {\n        ma_channel_converter_get_input_channel_map(&pConverter->channelConverter, pChannelMap, channelMapCap);\n    } else {\n        ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pConverter->channelsIn);\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_data_converter_reset(ma_data_converter* pConverter)\n{\n    if (pConverter == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* There's nothing to do if we're not resampling. */\n    if (pConverter->hasResampler == MA_FALSE) {\n        return MA_SUCCESS;\n    }\n\n    return ma_resampler_reset(&pConverter->resampler);\n}\n\n\n\n/**************************************************************************************************************************************************************\n\nChannel Maps\n\n**************************************************************************************************************************************************************/\nstatic ma_channel ma_channel_map_init_standard_channel(ma_standard_channel_map standardChannelMap, ma_uint32 channelCount, ma_uint32 channelIndex);\n\nMA_API ma_channel ma_channel_map_get_channel(const ma_channel* pChannelMap, ma_uint32 channelCount, ma_uint32 channelIndex)\n{\n    if (pChannelMap == NULL) {\n        return ma_channel_map_init_standard_channel(ma_standard_channel_map_default, channelCount, channelIndex);\n    } else {\n        if (channelIndex >= channelCount) {\n            return MA_CHANNEL_NONE;\n        }\n\n        return pChannelMap[channelIndex];\n    }\n}\n\nMA_API void ma_channel_map_init_blank(ma_channel* pChannelMap, ma_uint32 channels)\n{\n    if (pChannelMap == NULL) {\n        return;\n    }\n\n    MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channels);\n}\n\n\nstatic ma_channel ma_channel_map_init_standard_channel_microsoft(ma_uint32 channelCount, ma_uint32 channelIndex)\n{\n    if (channelCount == 0 || channelIndex >= channelCount) {\n        return MA_CHANNEL_NONE;\n    }\n\n    /* This is the Microsoft channel map. Based off the speaker configurations mentioned here: https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ksmedia/ns-ksmedia-ksaudio_channel_config */\n    switch (channelCount)\n    {\n        case 0: return MA_CHANNEL_NONE;\n\n        case 1:\n        {\n            return MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n            }\n        } break;\n\n        case 3: /* No defined, but best guess. */\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n            }\n        } break;\n\n        case 4:\n        {\n            switch (channelIndex) {\n            #ifndef MA_USE_QUAD_MICROSOFT_CHANNEL_MAP\n                /* Surround. Using the Surround profile has the advantage of the 3rd channel (MA_CHANNEL_FRONT_CENTER) mapping nicely with higher channel counts. */\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n                case 3: return MA_CHANNEL_BACK_CENTER;\n            #else\n                /* Quad. */\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_BACK_LEFT;\n                case 3: return MA_CHANNEL_BACK_RIGHT;\n            #endif\n            }\n        } break;\n\n        case 5: /* Not defined, but best guess. */\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n                case 3: return MA_CHANNEL_BACK_LEFT;\n                case 4: return MA_CHANNEL_BACK_RIGHT;\n            }\n        } break;\n\n        case 6:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n                case 3: return MA_CHANNEL_LFE;\n                case 4: return MA_CHANNEL_SIDE_LEFT;\n                case 5: return MA_CHANNEL_SIDE_RIGHT;\n            }\n        } break;\n\n        case 7: /* Not defined, but best guess. */\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n                case 3: return MA_CHANNEL_LFE;\n                case 4: return MA_CHANNEL_BACK_CENTER;\n                case 5: return MA_CHANNEL_SIDE_LEFT;\n                case 6: return MA_CHANNEL_SIDE_RIGHT;\n            }\n        } break;\n\n        case 8:\n        default:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n                case 3: return MA_CHANNEL_LFE;\n                case 4: return MA_CHANNEL_BACK_LEFT;\n                case 5: return MA_CHANNEL_BACK_RIGHT;\n                case 6: return MA_CHANNEL_SIDE_LEFT;\n                case 7: return MA_CHANNEL_SIDE_RIGHT;\n            }\n        } break;\n    }\n\n    if (channelCount > 8) {\n        if (channelIndex < 32) {    /* We have 32 AUX channels. */\n            return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 8));\n        }\n    }\n\n    /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */\n    return MA_CHANNEL_NONE;\n}\n\nstatic ma_channel ma_channel_map_init_standard_channel_alsa(ma_uint32 channelCount, ma_uint32 channelIndex)\n{\n    switch (channelCount)\n    {\n        case 0: return MA_CHANNEL_NONE;\n\n        case 1:\n        {\n            return MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n            }\n        } break;\n\n        case 3:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n            }\n        } break;\n\n        case 4:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_BACK_LEFT;\n                case 3: return MA_CHANNEL_BACK_RIGHT;\n            }\n        } break;\n\n        case 5:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_BACK_LEFT;\n                case 3: return MA_CHANNEL_BACK_RIGHT;\n                case 4: return MA_CHANNEL_FRONT_CENTER;\n            }\n        } break;\n\n        case 6:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_BACK_LEFT;\n                case 3: return MA_CHANNEL_BACK_RIGHT;\n                case 4: return MA_CHANNEL_FRONT_CENTER;\n                case 5: return MA_CHANNEL_LFE;\n            }\n        } break;\n\n        case 7:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_BACK_LEFT;\n                case 3: return MA_CHANNEL_BACK_RIGHT;\n                case 4: return MA_CHANNEL_FRONT_CENTER;\n                case 5: return MA_CHANNEL_LFE;\n                case 6: return MA_CHANNEL_BACK_CENTER;\n            }\n        } break;\n\n        case 8:\n        default:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_BACK_LEFT;\n                case 3: return MA_CHANNEL_BACK_RIGHT;\n                case 4: return MA_CHANNEL_FRONT_CENTER;\n                case 5: return MA_CHANNEL_LFE;\n                case 6: return MA_CHANNEL_SIDE_LEFT;\n                case 7: return MA_CHANNEL_SIDE_RIGHT;\n            }\n        } break;\n    }\n\n    if (channelCount > 8) {\n        if (channelIndex < 32) {    /* We have 32 AUX channels. */\n            return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 8));\n        }\n    }\n\n    /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */\n    return MA_CHANNEL_NONE;\n}\n\nstatic ma_channel ma_channel_map_init_standard_channel_rfc3551(ma_uint32 channelCount, ma_uint32 channelIndex)\n{\n    switch (channelCount)\n    {\n        case 0: return MA_CHANNEL_NONE;\n\n        case 1:\n        {\n            return MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n            }\n        } break;\n\n        case 3:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n            }\n        } break;\n\n        case 4:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 3: return MA_CHANNEL_BACK_CENTER;\n            }\n        } break;\n\n        case 5:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n                case 3: return MA_CHANNEL_BACK_LEFT;\n                case 4: return MA_CHANNEL_BACK_RIGHT;\n            }\n        } break;\n\n        case 6:\n        default:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_SIDE_LEFT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n                case 3: return MA_CHANNEL_FRONT_RIGHT;\n                case 4: return MA_CHANNEL_SIDE_RIGHT;\n                case 5: return MA_CHANNEL_BACK_CENTER;\n            }\n        } break;\n    }\n\n    if (channelCount > 6) {\n        if (channelIndex < 32) {    /* We have 32 AUX channels. */\n            return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 6));\n        }\n    }\n\n    /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */\n    return MA_CHANNEL_NONE;\n}\n\nstatic ma_channel ma_channel_map_init_standard_channel_flac(ma_uint32 channelCount, ma_uint32 channelIndex)\n{\n    switch (channelCount)\n    {\n        case 0: return MA_CHANNEL_NONE;\n\n        case 1:\n        {\n            return MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n            }\n        } break;\n\n        case 3:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n            }\n        } break;\n\n        case 4:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_BACK_LEFT;\n                case 3: return MA_CHANNEL_BACK_RIGHT;\n            }\n        } break;\n\n        case 5:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n                case 3: return MA_CHANNEL_BACK_LEFT;\n                case 4: return MA_CHANNEL_BACK_RIGHT;\n            }\n        } break;\n\n        case 6:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n                case 3: return MA_CHANNEL_LFE;\n                case 4: return MA_CHANNEL_BACK_LEFT;\n                case 5: return MA_CHANNEL_BACK_RIGHT;\n            }\n        } break;\n\n        case 7:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n                case 3: return MA_CHANNEL_LFE;\n                case 4: return MA_CHANNEL_BACK_CENTER;\n                case 5: return MA_CHANNEL_SIDE_LEFT;\n                case 6: return MA_CHANNEL_SIDE_RIGHT;\n            }\n        } break;\n\n        case 8:\n        default:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n                case 3: return MA_CHANNEL_LFE;\n                case 4: return MA_CHANNEL_BACK_LEFT;\n                case 5: return MA_CHANNEL_BACK_RIGHT;\n                case 6: return MA_CHANNEL_SIDE_LEFT;\n                case 7: return MA_CHANNEL_SIDE_RIGHT;\n            }\n        } break;\n    }\n\n    if (channelCount > 8) {\n        if (channelIndex < 32) {    /* We have 32 AUX channels. */\n            return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 8));\n        }\n    }\n\n    /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */\n    return MA_CHANNEL_NONE;\n}\n\nstatic ma_channel ma_channel_map_init_standard_channel_vorbis(ma_uint32 channelCount, ma_uint32 channelIndex)\n{\n    switch (channelCount)\n    {\n        case 0: return MA_CHANNEL_NONE;\n\n        case 1:\n        {\n            return MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n            }\n        } break;\n\n        case 3:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_CENTER;\n                case 2: return MA_CHANNEL_FRONT_RIGHT;\n            }\n        } break;\n\n        case 4:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_BACK_LEFT;\n                case 3: return MA_CHANNEL_BACK_RIGHT;\n            }\n        } break;\n\n        case 5:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_CENTER;\n                case 2: return MA_CHANNEL_FRONT_RIGHT;\n                case 3: return MA_CHANNEL_BACK_LEFT;\n                case 4: return MA_CHANNEL_BACK_RIGHT;\n            }\n        } break;\n\n        case 6:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_CENTER;\n                case 2: return MA_CHANNEL_FRONT_RIGHT;\n                case 3: return MA_CHANNEL_BACK_LEFT;\n                case 4: return MA_CHANNEL_BACK_RIGHT;\n                case 5: return MA_CHANNEL_LFE;\n            }\n        } break;\n\n        case 7:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_CENTER;\n                case 2: return MA_CHANNEL_FRONT_RIGHT;\n                case 3: return MA_CHANNEL_SIDE_LEFT;\n                case 4: return MA_CHANNEL_SIDE_RIGHT;\n                case 5: return MA_CHANNEL_BACK_CENTER;\n                case 6: return MA_CHANNEL_LFE;\n            }\n        } break;\n\n        case 8:\n        default:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_CENTER;\n                case 2: return MA_CHANNEL_FRONT_RIGHT;\n                case 3: return MA_CHANNEL_SIDE_LEFT;\n                case 4: return MA_CHANNEL_SIDE_RIGHT;\n                case 5: return MA_CHANNEL_BACK_LEFT;\n                case 6: return MA_CHANNEL_BACK_RIGHT;\n                case 7: return MA_CHANNEL_LFE;\n            }\n        } break;\n    }\n\n    if (channelCount > 8) {\n        if (channelIndex < 32) {    /* We have 32 AUX channels. */\n            return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 8));\n        }\n    }\n\n    /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */\n    return MA_CHANNEL_NONE;\n}\n\nstatic ma_channel ma_channel_map_init_standard_channel_sound4(ma_uint32 channelCount, ma_uint32 channelIndex)\n{\n    switch (channelCount)\n    {\n        case 0: return MA_CHANNEL_NONE;\n\n        case 1:\n        {\n            return MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n            }\n        } break;\n\n        case 3:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n            }\n        } break;\n\n        case 4:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_BACK_LEFT;\n                case 3: return MA_CHANNEL_BACK_RIGHT;\n            }\n        } break;\n\n        case 5:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n                case 3: return MA_CHANNEL_BACK_LEFT;\n                case 4: return MA_CHANNEL_BACK_RIGHT;\n            }\n        } break;\n\n        case 6:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_CENTER;\n                case 2: return MA_CHANNEL_FRONT_RIGHT;\n                case 3: return MA_CHANNEL_BACK_LEFT;\n                case 4: return MA_CHANNEL_BACK_RIGHT;\n                case 5: return MA_CHANNEL_LFE;\n            }\n        } break;\n\n        case 7:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_CENTER;\n                case 2: return MA_CHANNEL_FRONT_RIGHT;\n                case 3: return MA_CHANNEL_SIDE_LEFT;\n                case 4: return MA_CHANNEL_SIDE_RIGHT;\n                case 5: return MA_CHANNEL_BACK_CENTER;\n                case 6: return MA_CHANNEL_LFE;\n            }\n        } break;\n\n        case 8:\n        default:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_CENTER;\n                case 2: return MA_CHANNEL_FRONT_RIGHT;\n                case 3: return MA_CHANNEL_SIDE_LEFT;\n                case 4: return MA_CHANNEL_SIDE_RIGHT;\n                case 5: return MA_CHANNEL_BACK_LEFT;\n                case 6: return MA_CHANNEL_BACK_RIGHT;\n                case 7: return MA_CHANNEL_LFE;\n            }\n        } break;\n    }\n\n    if (channelCount > 8) {\n        if (channelIndex < 32) {    /* We have 32 AUX channels. */\n            return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 8));\n        }\n    }\n\n    /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */\n    return MA_CHANNEL_NONE;\n}\n\nstatic ma_channel ma_channel_map_init_standard_channel_sndio(ma_uint32 channelCount, ma_uint32 channelIndex)\n{\n    switch (channelCount)\n    {\n        case 0: return MA_CHANNEL_NONE;\n\n        case 1:\n        {\n            return MA_CHANNEL_MONO;\n        } break;\n\n        case 2:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n            }\n        } break;\n\n        case 3: /* No defined, but best guess. */\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_FRONT_CENTER;\n            }\n        } break;\n\n        case 4:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_BACK_LEFT;\n                case 3: return MA_CHANNEL_BACK_RIGHT;\n            }\n        } break;\n\n        case 5: /* Not defined, but best guess. */\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_BACK_LEFT;\n                case 3: return MA_CHANNEL_BACK_RIGHT;\n                case 4: return MA_CHANNEL_FRONT_CENTER;\n            }\n        } break;\n\n        case 6:\n        default:\n        {\n            switch (channelIndex) {\n                case 0: return MA_CHANNEL_FRONT_LEFT;\n                case 1: return MA_CHANNEL_FRONT_RIGHT;\n                case 2: return MA_CHANNEL_BACK_LEFT;\n                case 3: return MA_CHANNEL_BACK_RIGHT;\n                case 4: return MA_CHANNEL_FRONT_CENTER;\n                case 5: return MA_CHANNEL_LFE;\n            }\n        } break;\n    }\n\n    if (channelCount > 6) {\n        if (channelIndex < 32) {    /* We have 32 AUX channels. */\n            return (ma_channel)(MA_CHANNEL_AUX_0 + (channelIndex - 6));\n        }\n    }\n\n    /* Getting here means we don't know how to map the channel position so just return MA_CHANNEL_NONE. */\n    return MA_CHANNEL_NONE;\n}\n\n\nstatic ma_channel ma_channel_map_init_standard_channel(ma_standard_channel_map standardChannelMap, ma_uint32 channelCount, ma_uint32 channelIndex)\n{\n    if (channelCount == 0 || channelIndex >= channelCount) {\n        return MA_CHANNEL_NONE;\n    }\n\n    switch (standardChannelMap)\n    {\n        case ma_standard_channel_map_alsa:\n        {\n            return ma_channel_map_init_standard_channel_alsa(channelCount, channelIndex);\n        } break;\n\n        case ma_standard_channel_map_rfc3551:\n        {\n            return ma_channel_map_init_standard_channel_rfc3551(channelCount, channelIndex);\n        } break;\n\n        case ma_standard_channel_map_flac:\n        {\n            return ma_channel_map_init_standard_channel_flac(channelCount, channelIndex);\n        } break;\n\n        case ma_standard_channel_map_vorbis:\n        {\n            return ma_channel_map_init_standard_channel_vorbis(channelCount, channelIndex);\n        } break;\n\n        case ma_standard_channel_map_sound4:\n        {\n            return ma_channel_map_init_standard_channel_sound4(channelCount, channelIndex);\n        } break;\n\n        case ma_standard_channel_map_sndio:\n        {\n            return ma_channel_map_init_standard_channel_sndio(channelCount, channelIndex);\n        } break;\n\n        case ma_standard_channel_map_microsoft: /* Also default. */\n        /*case ma_standard_channel_map_default;*/\n        default:\n        {\n            return ma_channel_map_init_standard_channel_microsoft(channelCount, channelIndex);\n        } break;\n    }\n}\n\nMA_API void ma_channel_map_init_standard(ma_standard_channel_map standardChannelMap, ma_channel* pChannelMap, size_t channelMapCap, ma_uint32 channels)\n{\n    ma_uint32 iChannel;\n\n    if (pChannelMap == NULL || channelMapCap == 0 || channels == 0) {\n        return;\n    }\n\n    for (iChannel = 0; iChannel < channels; iChannel += 1) {\n        if (channelMapCap == 0) {\n            break;  /* Ran out of room. */\n        }\n\n        pChannelMap[0] = ma_channel_map_init_standard_channel(standardChannelMap, channels, iChannel);\n        pChannelMap   += 1;\n        channelMapCap -= 1;\n    }\n}\n\nMA_API void ma_channel_map_copy(ma_channel* pOut, const ma_channel* pIn, ma_uint32 channels)\n{\n    if (pOut != NULL && pIn != NULL && channels > 0) {\n        MA_COPY_MEMORY(pOut, pIn, sizeof(*pOut) * channels);\n    }\n}\n\nMA_API void ma_channel_map_copy_or_default(ma_channel* pOut, size_t channelMapCapOut, const ma_channel* pIn, ma_uint32 channels)\n{\n    if (pOut == NULL || channels == 0) {\n        return;\n    }\n\n    if (pIn != NULL) {\n        ma_channel_map_copy(pOut, pIn, channels);\n    } else {\n        ma_channel_map_init_standard(ma_standard_channel_map_default, pOut, channelMapCapOut, channels);\n    }\n}\n\nMA_API ma_bool32 ma_channel_map_is_valid(const ma_channel* pChannelMap, ma_uint32 channels)\n{\n    /* A channel count of 0 is invalid. */\n    if (channels == 0) {\n        return MA_FALSE;\n    }\n\n    /* It does not make sense to have a mono channel when there is more than 1 channel. */\n    if (channels > 1) {\n        ma_uint32 iChannel;\n        for (iChannel = 0; iChannel < channels; ++iChannel) {\n            if (ma_channel_map_get_channel(pChannelMap, channels, iChannel) == MA_CHANNEL_MONO) {\n                return MA_FALSE;\n            }\n        }\n    }\n\n    return MA_TRUE;\n}\n\nMA_API ma_bool32 ma_channel_map_is_equal(const ma_channel* pChannelMapA, const ma_channel* pChannelMapB, ma_uint32 channels)\n{\n    ma_uint32 iChannel;\n\n    if (pChannelMapA == pChannelMapB) {\n        return MA_TRUE;\n    }\n\n    for (iChannel = 0; iChannel < channels; ++iChannel) {\n        if (ma_channel_map_get_channel(pChannelMapA, channels, iChannel) != ma_channel_map_get_channel(pChannelMapB, channels, iChannel)) {\n            return MA_FALSE;\n        }\n    }\n\n    return MA_TRUE;\n}\n\nMA_API ma_bool32 ma_channel_map_is_blank(const ma_channel* pChannelMap, ma_uint32 channels)\n{\n    ma_uint32 iChannel;\n\n    /* A null channel map is equivalent to the default channel map. */\n    if (pChannelMap == NULL) {\n        return MA_FALSE;\n    }\n\n    for (iChannel = 0; iChannel < channels; ++iChannel) {\n        if (pChannelMap[iChannel] != MA_CHANNEL_NONE) {\n            return MA_FALSE;\n        }\n    }\n\n    return MA_TRUE;\n}\n\nMA_API ma_bool32 ma_channel_map_contains_channel_position(ma_uint32 channels, const ma_channel* pChannelMap, ma_channel channelPosition)\n{\n    return ma_channel_map_find_channel_position(channels, pChannelMap, channelPosition, NULL);\n}\n\nMA_API ma_bool32 ma_channel_map_find_channel_position(ma_uint32 channels, const ma_channel* pChannelMap, ma_channel channelPosition, ma_uint32* pChannelIndex)\n{\n    ma_uint32 iChannel;\n\n    if (pChannelIndex != NULL) {\n        *pChannelIndex = (ma_uint32)-1;\n    }\n\n    for (iChannel = 0; iChannel < channels; ++iChannel) {\n        if (ma_channel_map_get_channel(pChannelMap, channels, iChannel) == channelPosition) {\n            if (pChannelIndex != NULL) {\n                *pChannelIndex = iChannel;\n            }\n\n            return MA_TRUE;\n        }\n    }\n\n    /* Getting here means the channel position was not found. */\n    return MA_FALSE;\n}\n\nMA_API size_t ma_channel_map_to_string(const ma_channel* pChannelMap, ma_uint32 channels, char* pBufferOut, size_t bufferCap)\n{\n    size_t len;\n    ma_uint32 iChannel;\n\n    len = 0;\n\n    for (iChannel = 0; iChannel < channels; iChannel += 1) {\n        const char* pChannelStr = ma_channel_position_to_string(ma_channel_map_get_channel(pChannelMap, channels, iChannel));\n        size_t channelStrLen = strlen(pChannelStr);\n\n        /* Append the string if necessary. */\n        if (pBufferOut != NULL && bufferCap > len + channelStrLen) {\n            MA_COPY_MEMORY(pBufferOut + len, pChannelStr, channelStrLen);\n        }\n        len += channelStrLen;\n\n        /* Append a space if it's not the last item. */\n        if (iChannel+1 < channels) {\n            if (pBufferOut != NULL && bufferCap > len + 1) {\n                pBufferOut[len] = ' ';\n            }\n            len += 1;\n        }\n    }\n\n    /* Null terminate. Don't increment the length here. */\n    if (pBufferOut != NULL && bufferCap > len + 1) {\n        pBufferOut[len] = '\\0';\n    }\n\n    return len;\n}\n\nMA_API const char* ma_channel_position_to_string(ma_channel channel)\n{\n    switch (channel)\n    {\n        case MA_CHANNEL_NONE              : return \"CHANNEL_NONE\";\n        case MA_CHANNEL_MONO              : return \"CHANNEL_MONO\";\n        case MA_CHANNEL_FRONT_LEFT        : return \"CHANNEL_FRONT_LEFT\";\n        case MA_CHANNEL_FRONT_RIGHT       : return \"CHANNEL_FRONT_RIGHT\";\n        case MA_CHANNEL_FRONT_CENTER      : return \"CHANNEL_FRONT_CENTER\";\n        case MA_CHANNEL_LFE               : return \"CHANNEL_LFE\";\n        case MA_CHANNEL_BACK_LEFT         : return \"CHANNEL_BACK_LEFT\";\n        case MA_CHANNEL_BACK_RIGHT        : return \"CHANNEL_BACK_RIGHT\";\n        case MA_CHANNEL_FRONT_LEFT_CENTER : return \"CHANNEL_FRONT_LEFT_CENTER \";\n        case MA_CHANNEL_FRONT_RIGHT_CENTER: return \"CHANNEL_FRONT_RIGHT_CENTER\";\n        case MA_CHANNEL_BACK_CENTER       : return \"CHANNEL_BACK_CENTER\";\n        case MA_CHANNEL_SIDE_LEFT         : return \"CHANNEL_SIDE_LEFT\";\n        case MA_CHANNEL_SIDE_RIGHT        : return \"CHANNEL_SIDE_RIGHT\";\n        case MA_CHANNEL_TOP_CENTER        : return \"CHANNEL_TOP_CENTER\";\n        case MA_CHANNEL_TOP_FRONT_LEFT    : return \"CHANNEL_TOP_FRONT_LEFT\";\n        case MA_CHANNEL_TOP_FRONT_CENTER  : return \"CHANNEL_TOP_FRONT_CENTER\";\n        case MA_CHANNEL_TOP_FRONT_RIGHT   : return \"CHANNEL_TOP_FRONT_RIGHT\";\n        case MA_CHANNEL_TOP_BACK_LEFT     : return \"CHANNEL_TOP_BACK_LEFT\";\n        case MA_CHANNEL_TOP_BACK_CENTER   : return \"CHANNEL_TOP_BACK_CENTER\";\n        case MA_CHANNEL_TOP_BACK_RIGHT    : return \"CHANNEL_TOP_BACK_RIGHT\";\n        case MA_CHANNEL_AUX_0             : return \"CHANNEL_AUX_0\";\n        case MA_CHANNEL_AUX_1             : return \"CHANNEL_AUX_1\";\n        case MA_CHANNEL_AUX_2             : return \"CHANNEL_AUX_2\";\n        case MA_CHANNEL_AUX_3             : return \"CHANNEL_AUX_3\";\n        case MA_CHANNEL_AUX_4             : return \"CHANNEL_AUX_4\";\n        case MA_CHANNEL_AUX_5             : return \"CHANNEL_AUX_5\";\n        case MA_CHANNEL_AUX_6             : return \"CHANNEL_AUX_6\";\n        case MA_CHANNEL_AUX_7             : return \"CHANNEL_AUX_7\";\n        case MA_CHANNEL_AUX_8             : return \"CHANNEL_AUX_8\";\n        case MA_CHANNEL_AUX_9             : return \"CHANNEL_AUX_9\";\n        case MA_CHANNEL_AUX_10            : return \"CHANNEL_AUX_10\";\n        case MA_CHANNEL_AUX_11            : return \"CHANNEL_AUX_11\";\n        case MA_CHANNEL_AUX_12            : return \"CHANNEL_AUX_12\";\n        case MA_CHANNEL_AUX_13            : return \"CHANNEL_AUX_13\";\n        case MA_CHANNEL_AUX_14            : return \"CHANNEL_AUX_14\";\n        case MA_CHANNEL_AUX_15            : return \"CHANNEL_AUX_15\";\n        case MA_CHANNEL_AUX_16            : return \"CHANNEL_AUX_16\";\n        case MA_CHANNEL_AUX_17            : return \"CHANNEL_AUX_17\";\n        case MA_CHANNEL_AUX_18            : return \"CHANNEL_AUX_18\";\n        case MA_CHANNEL_AUX_19            : return \"CHANNEL_AUX_19\";\n        case MA_CHANNEL_AUX_20            : return \"CHANNEL_AUX_20\";\n        case MA_CHANNEL_AUX_21            : return \"CHANNEL_AUX_21\";\n        case MA_CHANNEL_AUX_22            : return \"CHANNEL_AUX_22\";\n        case MA_CHANNEL_AUX_23            : return \"CHANNEL_AUX_23\";\n        case MA_CHANNEL_AUX_24            : return \"CHANNEL_AUX_24\";\n        case MA_CHANNEL_AUX_25            : return \"CHANNEL_AUX_25\";\n        case MA_CHANNEL_AUX_26            : return \"CHANNEL_AUX_26\";\n        case MA_CHANNEL_AUX_27            : return \"CHANNEL_AUX_27\";\n        case MA_CHANNEL_AUX_28            : return \"CHANNEL_AUX_28\";\n        case MA_CHANNEL_AUX_29            : return \"CHANNEL_AUX_29\";\n        case MA_CHANNEL_AUX_30            : return \"CHANNEL_AUX_30\";\n        case MA_CHANNEL_AUX_31            : return \"CHANNEL_AUX_31\";\n        default: break;\n    }\n\n    return \"UNKNOWN\";\n}\n\n\n\n/**************************************************************************************************************************************************************\n\nConversion Helpers\n\n**************************************************************************************************************************************************************/\nMA_API ma_uint64 ma_convert_frames(void* pOut, ma_uint64 frameCountOut, ma_format formatOut, ma_uint32 channelsOut, ma_uint32 sampleRateOut, const void* pIn, ma_uint64 frameCountIn, ma_format formatIn, ma_uint32 channelsIn, ma_uint32 sampleRateIn)\n{\n    ma_data_converter_config config;\n\n    config = ma_data_converter_config_init(formatIn, formatOut, channelsIn, channelsOut, sampleRateIn, sampleRateOut);\n    config.resampling.linear.lpfOrder = ma_min(MA_DEFAULT_RESAMPLER_LPF_ORDER, MA_MAX_FILTER_ORDER);\n\n    return ma_convert_frames_ex(pOut, frameCountOut, pIn, frameCountIn, &config);\n}\n\nMA_API ma_uint64 ma_convert_frames_ex(void* pOut, ma_uint64 frameCountOut, const void* pIn, ma_uint64 frameCountIn, const ma_data_converter_config* pConfig)\n{\n    ma_result result;\n    ma_data_converter converter;\n\n    if (frameCountIn == 0 || pConfig == NULL) {\n        return 0;\n    }\n\n    result = ma_data_converter_init(pConfig, NULL, &converter);\n    if (result != MA_SUCCESS) {\n        return 0;   /* Failed to initialize the data converter. */\n    }\n\n    if (pOut == NULL) {\n        result = ma_data_converter_get_expected_output_frame_count(&converter, frameCountIn, &frameCountOut);\n        if (result != MA_SUCCESS) {\n            if (result == MA_NOT_IMPLEMENTED) {\n                /* No way to calculate the number of frames, so we'll need to brute force it and loop. */\n                frameCountOut = 0;\n\n                while (frameCountIn > 0) {\n                    ma_uint64 framesProcessedIn  = frameCountIn;\n                    ma_uint64 framesProcessedOut = 0xFFFFFFFF;\n\n                    result = ma_data_converter_process_pcm_frames(&converter, pIn, &framesProcessedIn, NULL, &framesProcessedOut);\n                    if (result != MA_SUCCESS) {\n                        break;\n                    }\n\n                    frameCountIn  -= framesProcessedIn;\n                }\n            }\n        }\n    } else {\n        result = ma_data_converter_process_pcm_frames(&converter, pIn, &frameCountIn, pOut, &frameCountOut);\n        if (result != MA_SUCCESS) {\n            frameCountOut = 0;\n        }\n    }\n\n    ma_data_converter_uninit(&converter, NULL);\n    return frameCountOut;\n}\n\n\n/**************************************************************************************************************************************************************\n\nRing Buffer\n\n**************************************************************************************************************************************************************/\nstatic MA_INLINE ma_uint32 ma_rb__extract_offset_in_bytes(ma_uint32 encodedOffset)\n{\n    return encodedOffset & 0x7FFFFFFF;\n}\n\nstatic MA_INLINE ma_uint32 ma_rb__extract_offset_loop_flag(ma_uint32 encodedOffset)\n{\n    return encodedOffset & 0x80000000;\n}\n\nstatic MA_INLINE void* ma_rb__get_read_ptr(ma_rb* pRB)\n{\n    MA_ASSERT(pRB != NULL);\n    return ma_offset_ptr(pRB->pBuffer, ma_rb__extract_offset_in_bytes(ma_atomic_load_32(&pRB->encodedReadOffset)));\n}\n\nstatic MA_INLINE void* ma_rb__get_write_ptr(ma_rb* pRB)\n{\n    MA_ASSERT(pRB != NULL);\n    return ma_offset_ptr(pRB->pBuffer, ma_rb__extract_offset_in_bytes(ma_atomic_load_32(&pRB->encodedWriteOffset)));\n}\n\nstatic MA_INLINE ma_uint32 ma_rb__construct_offset(ma_uint32 offsetInBytes, ma_uint32 offsetLoopFlag)\n{\n    return offsetLoopFlag | offsetInBytes;\n}\n\nstatic MA_INLINE void ma_rb__deconstruct_offset(ma_uint32 encodedOffset, ma_uint32* pOffsetInBytes, ma_uint32* pOffsetLoopFlag)\n{\n    MA_ASSERT(pOffsetInBytes != NULL);\n    MA_ASSERT(pOffsetLoopFlag != NULL);\n\n    *pOffsetInBytes  = ma_rb__extract_offset_in_bytes(encodedOffset);\n    *pOffsetLoopFlag = ma_rb__extract_offset_loop_flag(encodedOffset);\n}\n\n\nMA_API ma_result ma_rb_init_ex(size_t subbufferSizeInBytes, size_t subbufferCount, size_t subbufferStrideInBytes, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_rb* pRB)\n{\n    ma_result result;\n    const ma_uint32 maxSubBufferSize = 0x7FFFFFFF - (MA_SIMD_ALIGNMENT-1);\n\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (subbufferSizeInBytes == 0 || subbufferCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (subbufferSizeInBytes > maxSubBufferSize) {\n        return MA_INVALID_ARGS;    /* Maximum buffer size is ~2GB. The most significant bit is a flag for use internally. */\n    }\n\n\n    MA_ZERO_OBJECT(pRB);\n\n    result = ma_allocation_callbacks_init_copy(&pRB->allocationCallbacks, pAllocationCallbacks);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pRB->subbufferSizeInBytes = (ma_uint32)subbufferSizeInBytes;\n    pRB->subbufferCount = (ma_uint32)subbufferCount;\n\n    if (pOptionalPreallocatedBuffer != NULL) {\n        pRB->subbufferStrideInBytes = (ma_uint32)subbufferStrideInBytes;\n        pRB->pBuffer = pOptionalPreallocatedBuffer;\n    } else {\n        size_t bufferSizeInBytes;\n\n        /*\n        Here is where we allocate our own buffer. We always want to align this to MA_SIMD_ALIGNMENT for future SIMD optimization opportunity. To do this\n        we need to make sure the stride is a multiple of MA_SIMD_ALIGNMENT.\n        */\n        pRB->subbufferStrideInBytes = (pRB->subbufferSizeInBytes + (MA_SIMD_ALIGNMENT-1)) & ~MA_SIMD_ALIGNMENT;\n\n        bufferSizeInBytes = (size_t)pRB->subbufferCount*pRB->subbufferStrideInBytes;\n        pRB->pBuffer = ma_aligned_malloc(bufferSizeInBytes, MA_SIMD_ALIGNMENT, &pRB->allocationCallbacks);\n        if (pRB->pBuffer == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n\n        MA_ZERO_MEMORY(pRB->pBuffer, bufferSizeInBytes);\n        pRB->ownsBuffer = MA_TRUE;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_rb_init(size_t bufferSizeInBytes, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_rb* pRB)\n{\n    return ma_rb_init_ex(bufferSizeInBytes, 1, 0, pOptionalPreallocatedBuffer, pAllocationCallbacks, pRB);\n}\n\nMA_API void ma_rb_uninit(ma_rb* pRB)\n{\n    if (pRB == NULL) {\n        return;\n    }\n\n    if (pRB->ownsBuffer) {\n        ma_aligned_free(pRB->pBuffer, &pRB->allocationCallbacks);\n    }\n}\n\nMA_API void ma_rb_reset(ma_rb* pRB)\n{\n    if (pRB == NULL) {\n        return;\n    }\n\n    ma_atomic_exchange_32(&pRB->encodedReadOffset, 0);\n    ma_atomic_exchange_32(&pRB->encodedWriteOffset, 0);\n}\n\nMA_API ma_result ma_rb_acquire_read(ma_rb* pRB, size_t* pSizeInBytes, void** ppBufferOut)\n{\n    ma_uint32 writeOffset;\n    ma_uint32 writeOffsetInBytes;\n    ma_uint32 writeOffsetLoopFlag;\n    ma_uint32 readOffset;\n    ma_uint32 readOffsetInBytes;\n    ma_uint32 readOffsetLoopFlag;\n    size_t bytesAvailable;\n    size_t bytesRequested;\n\n    if (pRB == NULL || pSizeInBytes == NULL || ppBufferOut == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The returned buffer should never move ahead of the write pointer. */\n    writeOffset = ma_atomic_load_32(&pRB->encodedWriteOffset);\n    ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);\n\n    readOffset = ma_atomic_load_32(&pRB->encodedReadOffset);\n    ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);\n\n    /*\n    The number of bytes available depends on whether or not the read and write pointers are on the same loop iteration. If so, we\n    can only read up to the write pointer. If not, we can only read up to the end of the buffer.\n    */\n    if (readOffsetLoopFlag == writeOffsetLoopFlag) {\n        bytesAvailable = writeOffsetInBytes - readOffsetInBytes;\n    } else {\n        bytesAvailable = pRB->subbufferSizeInBytes - readOffsetInBytes;\n    }\n\n    bytesRequested = *pSizeInBytes;\n    if (bytesRequested > bytesAvailable) {\n        bytesRequested = bytesAvailable;\n    }\n\n    *pSizeInBytes = bytesRequested;\n    (*ppBufferOut) = ma_rb__get_read_ptr(pRB);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_rb_commit_read(ma_rb* pRB, size_t sizeInBytes)\n{\n    ma_uint32 readOffset;\n    ma_uint32 readOffsetInBytes;\n    ma_uint32 readOffsetLoopFlag;\n    ma_uint32 newReadOffsetInBytes;\n    ma_uint32 newReadOffsetLoopFlag;\n\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    readOffset = ma_atomic_load_32(&pRB->encodedReadOffset);\n    ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);\n\n    /* Check that sizeInBytes is correct. It should never go beyond the end of the buffer. */\n    newReadOffsetInBytes = (ma_uint32)(readOffsetInBytes + sizeInBytes);\n    if (newReadOffsetInBytes > pRB->subbufferSizeInBytes) {\n        return MA_INVALID_ARGS;    /* <-- sizeInBytes will cause the read offset to overflow. */\n    }\n\n    /* Move the read pointer back to the start if necessary. */\n    newReadOffsetLoopFlag = readOffsetLoopFlag;\n    if (newReadOffsetInBytes == pRB->subbufferSizeInBytes) {\n        newReadOffsetInBytes = 0;\n        newReadOffsetLoopFlag ^= 0x80000000;\n    }\n\n    ma_atomic_exchange_32(&pRB->encodedReadOffset, ma_rb__construct_offset(newReadOffsetLoopFlag, newReadOffsetInBytes));\n\n    if (ma_rb_pointer_distance(pRB) == 0) {\n        return MA_AT_END;\n    } else {\n        return MA_SUCCESS;\n    }\n}\n\nMA_API ma_result ma_rb_acquire_write(ma_rb* pRB, size_t* pSizeInBytes, void** ppBufferOut)\n{\n    ma_uint32 readOffset;\n    ma_uint32 readOffsetInBytes;\n    ma_uint32 readOffsetLoopFlag;\n    ma_uint32 writeOffset;\n    ma_uint32 writeOffsetInBytes;\n    ma_uint32 writeOffsetLoopFlag;\n    size_t bytesAvailable;\n    size_t bytesRequested;\n\n    if (pRB == NULL || pSizeInBytes == NULL || ppBufferOut == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The returned buffer should never overtake the read buffer. */\n    readOffset = ma_atomic_load_32(&pRB->encodedReadOffset);\n    ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);\n\n    writeOffset = ma_atomic_load_32(&pRB->encodedWriteOffset);\n    ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);\n\n    /*\n    In the case of writing, if the write pointer and the read pointer are on the same loop iteration we can only\n    write up to the end of the buffer. Otherwise we can only write up to the read pointer. The write pointer should\n    never overtake the read pointer.\n    */\n    if (writeOffsetLoopFlag == readOffsetLoopFlag) {\n        bytesAvailable = pRB->subbufferSizeInBytes - writeOffsetInBytes;\n    } else {\n        bytesAvailable = readOffsetInBytes - writeOffsetInBytes;\n    }\n\n    bytesRequested = *pSizeInBytes;\n    if (bytesRequested > bytesAvailable) {\n        bytesRequested = bytesAvailable;\n    }\n\n    *pSizeInBytes = bytesRequested;\n    *ppBufferOut  = ma_rb__get_write_ptr(pRB);\n\n    /* Clear the buffer if desired. */\n    if (pRB->clearOnWriteAcquire) {\n        MA_ZERO_MEMORY(*ppBufferOut, *pSizeInBytes);\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_rb_commit_write(ma_rb* pRB, size_t sizeInBytes)\n{\n    ma_uint32 writeOffset;\n    ma_uint32 writeOffsetInBytes;\n    ma_uint32 writeOffsetLoopFlag;\n    ma_uint32 newWriteOffsetInBytes;\n    ma_uint32 newWriteOffsetLoopFlag;\n\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    writeOffset = ma_atomic_load_32(&pRB->encodedWriteOffset);\n    ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);\n\n    /* Check that sizeInBytes is correct. It should never go beyond the end of the buffer. */\n    newWriteOffsetInBytes = (ma_uint32)(writeOffsetInBytes + sizeInBytes);\n    if (newWriteOffsetInBytes > pRB->subbufferSizeInBytes) {\n        return MA_INVALID_ARGS;    /* <-- sizeInBytes will cause the read offset to overflow. */\n    }\n\n    /* Move the read pointer back to the start if necessary. */\n    newWriteOffsetLoopFlag = writeOffsetLoopFlag;\n    if (newWriteOffsetInBytes == pRB->subbufferSizeInBytes) {\n        newWriteOffsetInBytes = 0;\n        newWriteOffsetLoopFlag ^= 0x80000000;\n    }\n\n    ma_atomic_exchange_32(&pRB->encodedWriteOffset, ma_rb__construct_offset(newWriteOffsetLoopFlag, newWriteOffsetInBytes));\n\n    if (ma_rb_pointer_distance(pRB) == 0) {\n        return MA_AT_END;\n    } else {\n        return MA_SUCCESS;\n    }\n}\n\nMA_API ma_result ma_rb_seek_read(ma_rb* pRB, size_t offsetInBytes)\n{\n    ma_uint32 readOffset;\n    ma_uint32 readOffsetInBytes;\n    ma_uint32 readOffsetLoopFlag;\n    ma_uint32 writeOffset;\n    ma_uint32 writeOffsetInBytes;\n    ma_uint32 writeOffsetLoopFlag;\n    ma_uint32 newReadOffsetInBytes;\n    ma_uint32 newReadOffsetLoopFlag;\n\n    if (pRB == NULL || offsetInBytes > pRB->subbufferSizeInBytes) {\n        return MA_INVALID_ARGS;\n    }\n\n    readOffset = ma_atomic_load_32(&pRB->encodedReadOffset);\n    ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);\n\n    writeOffset = ma_atomic_load_32(&pRB->encodedWriteOffset);\n    ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);\n\n    newReadOffsetLoopFlag = readOffsetLoopFlag;\n\n    /* We cannot go past the write buffer. */\n    if (readOffsetLoopFlag == writeOffsetLoopFlag) {\n        if ((readOffsetInBytes + offsetInBytes) > writeOffsetInBytes) {\n            newReadOffsetInBytes = writeOffsetInBytes;\n        } else {\n            newReadOffsetInBytes = (ma_uint32)(readOffsetInBytes + offsetInBytes);\n        }\n    } else {\n        /* May end up looping. */\n        if ((readOffsetInBytes + offsetInBytes) >= pRB->subbufferSizeInBytes) {\n            newReadOffsetInBytes = (ma_uint32)(readOffsetInBytes + offsetInBytes) - pRB->subbufferSizeInBytes;\n            newReadOffsetLoopFlag ^= 0x80000000;    /* <-- Looped. */\n        } else {\n            newReadOffsetInBytes = (ma_uint32)(readOffsetInBytes + offsetInBytes);\n        }\n    }\n\n    ma_atomic_exchange_32(&pRB->encodedReadOffset, ma_rb__construct_offset(newReadOffsetInBytes, newReadOffsetLoopFlag));\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_rb_seek_write(ma_rb* pRB, size_t offsetInBytes)\n{\n    ma_uint32 readOffset;\n    ma_uint32 readOffsetInBytes;\n    ma_uint32 readOffsetLoopFlag;\n    ma_uint32 writeOffset;\n    ma_uint32 writeOffsetInBytes;\n    ma_uint32 writeOffsetLoopFlag;\n    ma_uint32 newWriteOffsetInBytes;\n    ma_uint32 newWriteOffsetLoopFlag;\n\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    readOffset = ma_atomic_load_32(&pRB->encodedReadOffset);\n    ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);\n\n    writeOffset = ma_atomic_load_32(&pRB->encodedWriteOffset);\n    ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);\n\n    newWriteOffsetLoopFlag = writeOffsetLoopFlag;\n\n    /* We cannot go past the write buffer. */\n    if (readOffsetLoopFlag == writeOffsetLoopFlag) {\n        /* May end up looping. */\n        if ((writeOffsetInBytes + offsetInBytes) >= pRB->subbufferSizeInBytes) {\n            newWriteOffsetInBytes = (ma_uint32)(writeOffsetInBytes + offsetInBytes) - pRB->subbufferSizeInBytes;\n            newWriteOffsetLoopFlag ^= 0x80000000;    /* <-- Looped. */\n        } else {\n            newWriteOffsetInBytes = (ma_uint32)(writeOffsetInBytes + offsetInBytes);\n        }\n    } else {\n        if ((writeOffsetInBytes + offsetInBytes) > readOffsetInBytes) {\n            newWriteOffsetInBytes = readOffsetInBytes;\n        } else {\n            newWriteOffsetInBytes = (ma_uint32)(writeOffsetInBytes + offsetInBytes);\n        }\n    }\n\n    ma_atomic_exchange_32(&pRB->encodedWriteOffset, ma_rb__construct_offset(newWriteOffsetInBytes, newWriteOffsetLoopFlag));\n    return MA_SUCCESS;\n}\n\nMA_API ma_int32 ma_rb_pointer_distance(ma_rb* pRB)\n{\n    ma_uint32 readOffset;\n    ma_uint32 readOffsetInBytes;\n    ma_uint32 readOffsetLoopFlag;\n    ma_uint32 writeOffset;\n    ma_uint32 writeOffsetInBytes;\n    ma_uint32 writeOffsetLoopFlag;\n\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    readOffset = ma_atomic_load_32(&pRB->encodedReadOffset);\n    ma_rb__deconstruct_offset(readOffset, &readOffsetInBytes, &readOffsetLoopFlag);\n\n    writeOffset = ma_atomic_load_32(&pRB->encodedWriteOffset);\n    ma_rb__deconstruct_offset(writeOffset, &writeOffsetInBytes, &writeOffsetLoopFlag);\n\n    if (readOffsetLoopFlag == writeOffsetLoopFlag) {\n        return writeOffsetInBytes - readOffsetInBytes;\n    } else {\n        return writeOffsetInBytes + (pRB->subbufferSizeInBytes - readOffsetInBytes);\n    }\n}\n\nMA_API ma_uint32 ma_rb_available_read(ma_rb* pRB)\n{\n    ma_int32 dist;\n\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    dist = ma_rb_pointer_distance(pRB);\n    if (dist < 0) {\n        return 0;\n    }\n\n    return dist;\n}\n\nMA_API ma_uint32 ma_rb_available_write(ma_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return (ma_uint32)(ma_rb_get_subbuffer_size(pRB) - ma_rb_pointer_distance(pRB));\n}\n\nMA_API size_t ma_rb_get_subbuffer_size(ma_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return pRB->subbufferSizeInBytes;\n}\n\nMA_API size_t ma_rb_get_subbuffer_stride(ma_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    if (pRB->subbufferStrideInBytes == 0) {\n        return (size_t)pRB->subbufferSizeInBytes;\n    }\n\n    return (size_t)pRB->subbufferStrideInBytes;\n}\n\nMA_API size_t ma_rb_get_subbuffer_offset(ma_rb* pRB, size_t subbufferIndex)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return subbufferIndex * ma_rb_get_subbuffer_stride(pRB);\n}\n\nMA_API void* ma_rb_get_subbuffer_ptr(ma_rb* pRB, size_t subbufferIndex, void* pBuffer)\n{\n    if (pRB == NULL) {\n        return NULL;\n    }\n\n    return ma_offset_ptr(pBuffer, ma_rb_get_subbuffer_offset(pRB, subbufferIndex));\n}\n\n\n\nstatic ma_result ma_pcm_rb_data_source__on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    /* Since there's no notion of an end, we don't ever want to return MA_AT_END here. But it is possible to return 0. */\n    ma_pcm_rb* pRB = (ma_pcm_rb*)pDataSource;\n    ma_result result;\n    ma_uint64 totalFramesRead;\n\n    MA_ASSERT(pRB != NULL);\n\n    /* We need to run this in a loop since the ring buffer itself may loop. */\n    totalFramesRead = 0;\n    while (totalFramesRead < frameCount) {\n        void* pMappedBuffer;\n        ma_uint32 mappedFrameCount;\n        ma_uint64 framesToRead = frameCount - totalFramesRead;\n        if (framesToRead > 0xFFFFFFFF) {\n            framesToRead = 0xFFFFFFFF;\n        }\n\n        mappedFrameCount = (ma_uint32)framesToRead;\n        result = ma_pcm_rb_acquire_read(pRB, &mappedFrameCount, &pMappedBuffer);\n        if (result != MA_SUCCESS) {\n            break;\n        }\n\n        if (mappedFrameCount == 0) {\n            break;  /* <-- End of ring buffer. */\n        }\n\n        ma_copy_pcm_frames(ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, pRB->format, pRB->channels), pMappedBuffer, mappedFrameCount, pRB->format, pRB->channels);\n\n        result = ma_pcm_rb_commit_read(pRB, mappedFrameCount);\n        if (result != MA_SUCCESS) {\n            break;\n        }\n\n        totalFramesRead += mappedFrameCount;\n    }\n\n    *pFramesRead = totalFramesRead;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_pcm_rb_data_source__on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    ma_pcm_rb* pRB = (ma_pcm_rb*)pDataSource;\n    MA_ASSERT(pRB != NULL);\n\n    if (pFormat != NULL) {\n        *pFormat = pRB->format;\n    }\n\n    if (pChannels != NULL) {\n        *pChannels = pRB->channels;\n    }\n\n    if (pSampleRate != NULL) {\n        *pSampleRate = pRB->sampleRate;\n    }\n\n    /* Just assume the default channel map. */\n    if (pChannelMap != NULL) {\n        ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pRB->channels);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_data_source_vtable ma_gRBDataSourceVTable =\n{\n    ma_pcm_rb_data_source__on_read,\n    NULL,   /* onSeek */\n    ma_pcm_rb_data_source__on_get_data_format,\n    NULL,   /* onGetCursor */\n    NULL,   /* onGetLength */\n    NULL,   /* onSetLooping */\n    0\n};\n\nstatic MA_INLINE ma_uint32 ma_pcm_rb_get_bpf(ma_pcm_rb* pRB)\n{\n    MA_ASSERT(pRB != NULL);\n\n    return ma_get_bytes_per_frame(pRB->format, pRB->channels);\n}\n\nMA_API ma_result ma_pcm_rb_init_ex(ma_format format, ma_uint32 channels, ma_uint32 subbufferSizeInFrames, ma_uint32 subbufferCount, ma_uint32 subbufferStrideInFrames, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_pcm_rb* pRB)\n{\n    ma_uint32 bpf;\n    ma_result result;\n\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pRB);\n\n    bpf = ma_get_bytes_per_frame(format, channels);\n    if (bpf == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_rb_init_ex(subbufferSizeInFrames*bpf, subbufferCount, subbufferStrideInFrames*bpf, pOptionalPreallocatedBuffer, pAllocationCallbacks, &pRB->rb);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pRB->format     = format;\n    pRB->channels   = channels;\n    pRB->sampleRate = 0;    /* The sample rate is not passed in as a parameter. */\n\n    /* The PCM ring buffer is a data source. We need to get that set up as well. */\n    {\n        ma_data_source_config dataSourceConfig = ma_data_source_config_init();\n        dataSourceConfig.vtable = &ma_gRBDataSourceVTable;\n\n        result = ma_data_source_init(&dataSourceConfig, &pRB->ds);\n        if (result != MA_SUCCESS) {\n            ma_rb_uninit(&pRB->rb);\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_pcm_rb_init(ma_format format, ma_uint32 channels, ma_uint32 bufferSizeInFrames, void* pOptionalPreallocatedBuffer, const ma_allocation_callbacks* pAllocationCallbacks, ma_pcm_rb* pRB)\n{\n    return ma_pcm_rb_init_ex(format, channels, bufferSizeInFrames, 1, 0, pOptionalPreallocatedBuffer, pAllocationCallbacks, pRB);\n}\n\nMA_API void ma_pcm_rb_uninit(ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return;\n    }\n\n    ma_data_source_uninit(&pRB->ds);\n    ma_rb_uninit(&pRB->rb);\n}\n\nMA_API void ma_pcm_rb_reset(ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return;\n    }\n\n    ma_rb_reset(&pRB->rb);\n}\n\nMA_API ma_result ma_pcm_rb_acquire_read(ma_pcm_rb* pRB, ma_uint32* pSizeInFrames, void** ppBufferOut)\n{\n    size_t sizeInBytes;\n    ma_result result;\n\n    if (pRB == NULL || pSizeInFrames == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    sizeInBytes = *pSizeInFrames * ma_pcm_rb_get_bpf(pRB);\n\n    result = ma_rb_acquire_read(&pRB->rb, &sizeInBytes, ppBufferOut);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pSizeInFrames = (ma_uint32)(sizeInBytes / (size_t)ma_pcm_rb_get_bpf(pRB));\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_pcm_rb_commit_read(ma_pcm_rb* pRB, ma_uint32 sizeInFrames)\n{\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_rb_commit_read(&pRB->rb, sizeInFrames * ma_pcm_rb_get_bpf(pRB));\n}\n\nMA_API ma_result ma_pcm_rb_acquire_write(ma_pcm_rb* pRB, ma_uint32* pSizeInFrames, void** ppBufferOut)\n{\n    size_t sizeInBytes;\n    ma_result result;\n\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    sizeInBytes = *pSizeInFrames * ma_pcm_rb_get_bpf(pRB);\n\n    result = ma_rb_acquire_write(&pRB->rb, &sizeInBytes, ppBufferOut);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pSizeInFrames = (ma_uint32)(sizeInBytes / ma_pcm_rb_get_bpf(pRB));\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_pcm_rb_commit_write(ma_pcm_rb* pRB, ma_uint32 sizeInFrames)\n{\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_rb_commit_write(&pRB->rb, sizeInFrames * ma_pcm_rb_get_bpf(pRB));\n}\n\nMA_API ma_result ma_pcm_rb_seek_read(ma_pcm_rb* pRB, ma_uint32 offsetInFrames)\n{\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_rb_seek_read(&pRB->rb, offsetInFrames * ma_pcm_rb_get_bpf(pRB));\n}\n\nMA_API ma_result ma_pcm_rb_seek_write(ma_pcm_rb* pRB, ma_uint32 offsetInFrames)\n{\n    if (pRB == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_rb_seek_write(&pRB->rb, offsetInFrames * ma_pcm_rb_get_bpf(pRB));\n}\n\nMA_API ma_int32 ma_pcm_rb_pointer_distance(ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return ma_rb_pointer_distance(&pRB->rb) / ma_pcm_rb_get_bpf(pRB);\n}\n\nMA_API ma_uint32 ma_pcm_rb_available_read(ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return ma_rb_available_read(&pRB->rb) / ma_pcm_rb_get_bpf(pRB);\n}\n\nMA_API ma_uint32 ma_pcm_rb_available_write(ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return ma_rb_available_write(&pRB->rb) / ma_pcm_rb_get_bpf(pRB);\n}\n\nMA_API ma_uint32 ma_pcm_rb_get_subbuffer_size(ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return (ma_uint32)(ma_rb_get_subbuffer_size(&pRB->rb) / ma_pcm_rb_get_bpf(pRB));\n}\n\nMA_API ma_uint32 ma_pcm_rb_get_subbuffer_stride(ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return (ma_uint32)(ma_rb_get_subbuffer_stride(&pRB->rb) / ma_pcm_rb_get_bpf(pRB));\n}\n\nMA_API ma_uint32 ma_pcm_rb_get_subbuffer_offset(ma_pcm_rb* pRB, ma_uint32 subbufferIndex)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return (ma_uint32)(ma_rb_get_subbuffer_offset(&pRB->rb, subbufferIndex) / ma_pcm_rb_get_bpf(pRB));\n}\n\nMA_API void* ma_pcm_rb_get_subbuffer_ptr(ma_pcm_rb* pRB, ma_uint32 subbufferIndex, void* pBuffer)\n{\n    if (pRB == NULL) {\n        return NULL;\n    }\n\n    return ma_rb_get_subbuffer_ptr(&pRB->rb, subbufferIndex, pBuffer);\n}\n\nMA_API ma_format ma_pcm_rb_get_format(const ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return ma_format_unknown;\n    }\n\n    return pRB->format;\n}\n\nMA_API ma_uint32 ma_pcm_rb_get_channels(const ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return pRB->channels;\n}\n\nMA_API ma_uint32 ma_pcm_rb_get_sample_rate(const ma_pcm_rb* pRB)\n{\n    if (pRB == NULL) {\n        return 0;\n    }\n\n    return pRB->sampleRate;\n}\n\nMA_API void ma_pcm_rb_set_sample_rate(ma_pcm_rb* pRB, ma_uint32 sampleRate)\n{\n    if (pRB == NULL) {\n        return;\n    }\n\n    pRB->sampleRate = sampleRate;\n}\n\n\n\nMA_API ma_result ma_duplex_rb_init(ma_format captureFormat, ma_uint32 captureChannels, ma_uint32 sampleRate, ma_uint32 captureInternalSampleRate, ma_uint32 captureInternalPeriodSizeInFrames, const ma_allocation_callbacks* pAllocationCallbacks, ma_duplex_rb* pRB)\n{\n    ma_result result;\n    ma_uint32 sizeInFrames;\n\n    sizeInFrames = (ma_uint32)ma_calculate_frame_count_after_resampling(sampleRate, captureInternalSampleRate, captureInternalPeriodSizeInFrames * 5);\n    if (sizeInFrames == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_pcm_rb_init(captureFormat, captureChannels, sizeInFrames, NULL, pAllocationCallbacks, &pRB->rb);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* Seek forward a bit so we have a bit of a buffer in case of desyncs. */\n    ma_pcm_rb_seek_write((ma_pcm_rb*)pRB, captureInternalPeriodSizeInFrames * 2);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_duplex_rb_uninit(ma_duplex_rb* pRB)\n{\n    ma_pcm_rb_uninit((ma_pcm_rb*)pRB);\n    return MA_SUCCESS;\n}\n\n\n\n/**************************************************************************************************************************************************************\n\nMiscellaneous Helpers\n\n**************************************************************************************************************************************************************/\nMA_API const char* ma_result_description(ma_result result)\n{\n    switch (result)\n    {\n        case MA_SUCCESS:                       return \"No error\";\n        case MA_ERROR:                         return \"Unknown error\";\n        case MA_INVALID_ARGS:                  return \"Invalid argument\";\n        case MA_INVALID_OPERATION:             return \"Invalid operation\";\n        case MA_OUT_OF_MEMORY:                 return \"Out of memory\";\n        case MA_OUT_OF_RANGE:                  return \"Out of range\";\n        case MA_ACCESS_DENIED:                 return \"Permission denied\";\n        case MA_DOES_NOT_EXIST:                return \"Resource does not exist\";\n        case MA_ALREADY_EXISTS:                return \"Resource already exists\";\n        case MA_TOO_MANY_OPEN_FILES:           return \"Too many open files\";\n        case MA_INVALID_FILE:                  return \"Invalid file\";\n        case MA_TOO_BIG:                       return \"Too large\";\n        case MA_PATH_TOO_LONG:                 return \"Path too long\";\n        case MA_NAME_TOO_LONG:                 return \"Name too long\";\n        case MA_NOT_DIRECTORY:                 return \"Not a directory\";\n        case MA_IS_DIRECTORY:                  return \"Is a directory\";\n        case MA_DIRECTORY_NOT_EMPTY:           return \"Directory not empty\";\n        case MA_AT_END:                        return \"At end\";\n        case MA_NO_SPACE:                      return \"No space available\";\n        case MA_BUSY:                          return \"Device or resource busy\";\n        case MA_IO_ERROR:                      return \"Input/output error\";\n        case MA_INTERRUPT:                     return \"Interrupted\";\n        case MA_UNAVAILABLE:                   return \"Resource unavailable\";\n        case MA_ALREADY_IN_USE:                return \"Resource already in use\";\n        case MA_BAD_ADDRESS:                   return \"Bad address\";\n        case MA_BAD_SEEK:                      return \"Illegal seek\";\n        case MA_BAD_PIPE:                      return \"Broken pipe\";\n        case MA_DEADLOCK:                      return \"Deadlock\";\n        case MA_TOO_MANY_LINKS:                return \"Too many links\";\n        case MA_NOT_IMPLEMENTED:               return \"Not implemented\";\n        case MA_NO_MESSAGE:                    return \"No message of desired type\";\n        case MA_BAD_MESSAGE:                   return \"Invalid message\";\n        case MA_NO_DATA_AVAILABLE:             return \"No data available\";\n        case MA_INVALID_DATA:                  return \"Invalid data\";\n        case MA_TIMEOUT:                       return \"Timeout\";\n        case MA_NO_NETWORK:                    return \"Network unavailable\";\n        case MA_NOT_UNIQUE:                    return \"Not unique\";\n        case MA_NOT_SOCKET:                    return \"Socket operation on non-socket\";\n        case MA_NO_ADDRESS:                    return \"Destination address required\";\n        case MA_BAD_PROTOCOL:                  return \"Protocol wrong type for socket\";\n        case MA_PROTOCOL_UNAVAILABLE:          return \"Protocol not available\";\n        case MA_PROTOCOL_NOT_SUPPORTED:        return \"Protocol not supported\";\n        case MA_PROTOCOL_FAMILY_NOT_SUPPORTED: return \"Protocol family not supported\";\n        case MA_ADDRESS_FAMILY_NOT_SUPPORTED:  return \"Address family not supported\";\n        case MA_SOCKET_NOT_SUPPORTED:          return \"Socket type not supported\";\n        case MA_CONNECTION_RESET:              return \"Connection reset\";\n        case MA_ALREADY_CONNECTED:             return \"Already connected\";\n        case MA_NOT_CONNECTED:                 return \"Not connected\";\n        case MA_CONNECTION_REFUSED:            return \"Connection refused\";\n        case MA_NO_HOST:                       return \"No host\";\n        case MA_IN_PROGRESS:                   return \"Operation in progress\";\n        case MA_CANCELLED:                     return \"Operation cancelled\";\n        case MA_MEMORY_ALREADY_MAPPED:         return \"Memory already mapped\";\n\n        case MA_FORMAT_NOT_SUPPORTED:          return \"Format not supported\";\n        case MA_DEVICE_TYPE_NOT_SUPPORTED:     return \"Device type not supported\";\n        case MA_SHARE_MODE_NOT_SUPPORTED:      return \"Share mode not supported\";\n        case MA_NO_BACKEND:                    return \"No backend\";\n        case MA_NO_DEVICE:                     return \"No device\";\n        case MA_API_NOT_FOUND:                 return \"API not found\";\n        case MA_INVALID_DEVICE_CONFIG:         return \"Invalid device config\";\n\n        case MA_DEVICE_NOT_INITIALIZED:        return \"Device not initialized\";\n        case MA_DEVICE_NOT_STARTED:            return \"Device not started\";\n\n        case MA_FAILED_TO_INIT_BACKEND:        return \"Failed to initialize backend\";\n        case MA_FAILED_TO_OPEN_BACKEND_DEVICE: return \"Failed to open backend device\";\n        case MA_FAILED_TO_START_BACKEND_DEVICE: return \"Failed to start backend device\";\n        case MA_FAILED_TO_STOP_BACKEND_DEVICE: return \"Failed to stop backend device\";\n\n        default:                               return \"Unknown error\";\n    }\n}\n\nMA_API void* ma_malloc(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks != NULL) {\n        if (pAllocationCallbacks->onMalloc != NULL) {\n            return pAllocationCallbacks->onMalloc(sz, pAllocationCallbacks->pUserData);\n        } else {\n            return NULL;    /* Do not fall back to the default implementation. */\n        }\n    } else {\n        return ma__malloc_default(sz, NULL);\n    }\n}\n\nMA_API void* ma_calloc(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    void* p = ma_malloc(sz, pAllocationCallbacks);\n    if (p != NULL) {\n        MA_ZERO_MEMORY(p, sz);\n    }\n\n    return p;\n}\n\nMA_API void* ma_realloc(void* p, size_t sz, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks != NULL) {\n        if (pAllocationCallbacks->onRealloc != NULL) {\n            return pAllocationCallbacks->onRealloc(p, sz, pAllocationCallbacks->pUserData);\n        } else {\n            return NULL;    /* Do not fall back to the default implementation. */\n        }\n    } else {\n        return ma__realloc_default(p, sz, NULL);\n    }\n}\n\nMA_API void ma_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (p == NULL) {\n        return;\n    }\n\n    if (pAllocationCallbacks != NULL) {\n        if (pAllocationCallbacks->onFree != NULL) {\n            pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);\n        } else {\n            return; /* Do no fall back to the default implementation. */\n        }\n    } else {\n        ma__free_default(p, NULL);\n    }\n}\n\nMA_API void* ma_aligned_malloc(size_t sz, size_t alignment, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    size_t extraBytes;\n    void* pUnaligned;\n    void* pAligned;\n\n    if (alignment == 0) {\n        return 0;\n    }\n\n    extraBytes = alignment-1 + sizeof(void*);\n\n    pUnaligned = ma_malloc(sz + extraBytes, pAllocationCallbacks);\n    if (pUnaligned == NULL) {\n        return NULL;\n    }\n\n    pAligned = (void*)(((ma_uintptr)pUnaligned + extraBytes) & ~((ma_uintptr)(alignment-1)));\n    ((void**)pAligned)[-1] = pUnaligned;\n\n    return pAligned;\n}\n\nMA_API void ma_aligned_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_free(((void**)p)[-1], pAllocationCallbacks);\n}\n\nMA_API const char* ma_get_format_name(ma_format format)\n{\n    switch (format)\n    {\n        case ma_format_unknown: return \"Unknown\";\n        case ma_format_u8:      return \"8-bit Unsigned Integer\";\n        case ma_format_s16:     return \"16-bit Signed Integer\";\n        case ma_format_s24:     return \"24-bit Signed Integer (Tightly Packed)\";\n        case ma_format_s32:     return \"32-bit Signed Integer\";\n        case ma_format_f32:     return \"32-bit IEEE Floating Point\";\n        default:                return \"Invalid\";\n    }\n}\n\nMA_API void ma_blend_f32(float* pOut, float* pInA, float* pInB, float factor, ma_uint32 channels)\n{\n    ma_uint32 i;\n    for (i = 0; i < channels; ++i) {\n        pOut[i] = ma_mix_f32(pInA[i], pInB[i], factor);\n    }\n}\n\n\nMA_API ma_uint32 ma_get_bytes_per_sample(ma_format format)\n{\n    ma_uint32 sizes[] = {\n        0,  /* unknown */\n        1,  /* u8 */\n        2,  /* s16 */\n        3,  /* s24 */\n        4,  /* s32 */\n        4,  /* f32 */\n    };\n    return sizes[format];\n}\n\n\n\n#define MA_DATA_SOURCE_DEFAULT_RANGE_BEG        0\n#define MA_DATA_SOURCE_DEFAULT_RANGE_END        ~((ma_uint64)0)\n#define MA_DATA_SOURCE_DEFAULT_LOOP_POINT_BEG   0\n#define MA_DATA_SOURCE_DEFAULT_LOOP_POINT_END   ~((ma_uint64)0)\n\nMA_API ma_data_source_config ma_data_source_config_init(void)\n{\n    ma_data_source_config config;\n\n    MA_ZERO_OBJECT(&config);\n\n    return config;\n}\n\n\nMA_API ma_result ma_data_source_init(const ma_data_source_config* pConfig, ma_data_source* pDataSource)\n{\n    ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource;\n\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pDataSourceBase);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pDataSourceBase->vtable           = pConfig->vtable;\n    pDataSourceBase->rangeBegInFrames = MA_DATA_SOURCE_DEFAULT_RANGE_BEG;\n    pDataSourceBase->rangeEndInFrames = MA_DATA_SOURCE_DEFAULT_RANGE_END;\n    pDataSourceBase->loopBegInFrames  = MA_DATA_SOURCE_DEFAULT_LOOP_POINT_BEG;\n    pDataSourceBase->loopEndInFrames  = MA_DATA_SOURCE_DEFAULT_LOOP_POINT_END;\n    pDataSourceBase->pCurrent         = pDataSource;    /* Always read from ourself by default. */\n    pDataSourceBase->pNext            = NULL;\n    pDataSourceBase->onGetNext        = NULL;\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_data_source_uninit(ma_data_source* pDataSource)\n{\n    if (pDataSource == NULL) {\n        return;\n    }\n\n    /*\n    This is placeholder in case we need this later. Data sources need to call this in their\n    uninitialization routine to ensure things work later on if something is added here.\n    */\n}\n\nstatic ma_result ma_data_source_resolve_current(ma_data_source* pDataSource, ma_data_source** ppCurrentDataSource)\n{\n    ma_data_source_base* pCurrentDataSource = (ma_data_source_base*)pDataSource;\n\n    MA_ASSERT(pDataSource         != NULL);\n    MA_ASSERT(ppCurrentDataSource != NULL);\n\n    if (pCurrentDataSource->pCurrent == NULL) {\n        /*\n        The current data source is NULL. If we're using this in the context of a chain we need to return NULL\n        here so that we don't end up looping. Otherwise we just return the data source itself.\n        */\n        if (pCurrentDataSource->pNext != NULL || pCurrentDataSource->onGetNext != NULL) {\n            pCurrentDataSource = NULL;\n        } else {\n            pCurrentDataSource = (ma_data_source_base*)pDataSource; /* Not being used in a chain. Make sure we just always read from the data source itself at all times. */\n        }\n    } else {\n        pCurrentDataSource = (ma_data_source_base*)pCurrentDataSource->pCurrent;\n    }\n\n    *ppCurrentDataSource = pCurrentDataSource;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_data_source_read_pcm_frames_within_range(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource;\n    ma_result result;\n    ma_uint64 framesRead = 0;\n    ma_bool32 loop = ma_data_source_is_looping(pDataSource);\n\n    if (pDataSourceBase == NULL) {\n        return MA_AT_END;\n    }\n\n    if (frameCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if ((pDataSourceBase->vtable->flags & MA_DATA_SOURCE_SELF_MANAGED_RANGE_AND_LOOP_POINT) != 0 || (pDataSourceBase->rangeEndInFrames == ~((ma_uint64)0) && (pDataSourceBase->loopEndInFrames == ~((ma_uint64)0) || loop == MA_FALSE))) {\n        /* Either the data source is self-managing the range, or no range is set - just read like normal. The data source itself will tell us when the end is reached. */\n        result = pDataSourceBase->vtable->onRead(pDataSourceBase, pFramesOut, frameCount, &framesRead);\n    } else {\n        /* Need to clamp to within the range. */\n        ma_uint64 relativeCursor;\n        ma_uint64 absoluteCursor;\n\n        result = ma_data_source_get_cursor_in_pcm_frames(pDataSourceBase, &relativeCursor);\n        if (result != MA_SUCCESS) {\n            /* Failed to retrieve the cursor. Cannot read within a range or loop points. Just read like normal - this may happen for things like noise data sources where it doesn't really matter. */\n            result = pDataSourceBase->vtable->onRead(pDataSourceBase, pFramesOut, frameCount, &framesRead);\n        } else {\n            ma_uint64 rangeBeg;\n            ma_uint64 rangeEnd;\n\n            /* We have the cursor. We need to make sure we don't read beyond our range. */\n            rangeBeg = pDataSourceBase->rangeBegInFrames;\n            rangeEnd = pDataSourceBase->rangeEndInFrames;\n\n            absoluteCursor = rangeBeg + relativeCursor;\n\n            /* If looping, make sure we're within range. */\n            if (loop) {\n                if (pDataSourceBase->loopEndInFrames != ~((ma_uint64)0)) {\n                    rangeEnd = ma_min(rangeEnd, pDataSourceBase->rangeBegInFrames + pDataSourceBase->loopEndInFrames);\n                }\n            }\n\n            if (frameCount > (rangeEnd - absoluteCursor) && rangeEnd != ~((ma_uint64)0)) {\n                frameCount = (rangeEnd - absoluteCursor);\n            }\n\n            /*\n            If the cursor is sitting on the end of the range the frame count will be set to 0 which can\n            result in MA_INVALID_ARGS. In this case, we don't want to try reading, but instead return\n            MA_AT_END so the higher level function can know about it.\n            */\n            if (frameCount > 0) {\n                result = pDataSourceBase->vtable->onRead(pDataSourceBase, pFramesOut, frameCount, &framesRead);\n            } else {\n                result = MA_AT_END; /* The cursor is sitting on the end of the range which means we're at the end. */\n            }\n        }\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = framesRead;\n    }\n\n    /* We need to make sure MA_AT_END is returned if we hit the end of the range. */\n    if (result == MA_SUCCESS && framesRead == 0) {\n        result  = MA_AT_END;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_data_source_read_pcm_frames(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    ma_result result = MA_SUCCESS;\n    ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource;\n    ma_data_source_base* pCurrentDataSource;\n    void* pRunningFramesOut = pFramesOut;\n    ma_uint64 totalFramesProcessed = 0;\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 emptyLoopCounter = 0; /* Keeps track of how many times 0 frames have been read. For infinite loop detection of sounds with no audio data. */\n    ma_bool32 loop;\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    if (frameCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pDataSourceBase == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    loop = ma_data_source_is_looping(pDataSource);\n\n    /*\n    We need to know the data format so we can advance the output buffer as we read frames. If this\n    fails, chaining will not work and we'll just read as much as we can from the current source.\n    */\n    if (ma_data_source_get_data_format(pDataSource, &format, &channels, NULL, NULL, 0) != MA_SUCCESS) {\n        result = ma_data_source_resolve_current(pDataSource, (ma_data_source**)&pCurrentDataSource);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        return ma_data_source_read_pcm_frames_within_range(pCurrentDataSource, pFramesOut, frameCount, pFramesRead);\n    }\n\n    /*\n    Looping is a bit of a special case. When the `loop` argument is true, chaining will not work and\n    only the current data source will be read from.\n    */\n\n    /* Keep reading until we've read as many frames as possible. */\n    while (totalFramesProcessed < frameCount) {\n        ma_uint64 framesProcessed;\n        ma_uint64 framesRemaining = frameCount - totalFramesProcessed;\n\n        /* We need to resolve the data source that we'll actually be reading from. */\n        result = ma_data_source_resolve_current(pDataSource, (ma_data_source**)&pCurrentDataSource);\n        if (result != MA_SUCCESS) {\n            break;\n        }\n\n        if (pCurrentDataSource == NULL) {\n            break;\n        }\n\n        result = ma_data_source_read_pcm_frames_within_range(pCurrentDataSource, pRunningFramesOut, framesRemaining, &framesProcessed);\n        totalFramesProcessed += framesProcessed;\n\n        /*\n        If we encounted an error from the read callback, make sure it's propagated to the caller. The caller may need to know whether or not MA_BUSY is returned which is\n        not necessarily considered an error.\n        */\n        if (result != MA_SUCCESS && result != MA_AT_END) {\n            break;\n        }\n\n        /*\n        We can determine if we've reached the end by checking if ma_data_source_read_pcm_frames_within_range() returned\n        MA_AT_END. To loop back to the start, all we need to do is seek back to the first frame.\n        */\n        if (result == MA_AT_END) {\n            /*\n            The result needs to be reset back to MA_SUCCESS (from MA_AT_END) so that we don't\n            accidentally return MA_AT_END when data has been read in prior loop iterations. at the\n            end of this function, the result will be checked for MA_SUCCESS, and if the total\n            number of frames processed is 0, will be explicitly set to MA_AT_END.\n            */\n            result = MA_SUCCESS;\n\n            /*\n            We reached the end. If we're looping, we just loop back to the start of the current\n            data source. If we're not looping we need to check if we have another in the chain, and\n            if so, switch to it.\n            */\n            if (loop) {\n                if (framesProcessed == 0) {\n                    emptyLoopCounter += 1;\n                    if (emptyLoopCounter > 1) {\n                        break;  /* Infinite loop detected. Get out. */\n                    }\n                } else {\n                    emptyLoopCounter = 0;\n                }\n\n                result = ma_data_source_seek_to_pcm_frame(pCurrentDataSource, pCurrentDataSource->loopBegInFrames);\n                if (result != MA_SUCCESS) {\n                    break;  /* Failed to loop. Abort. */\n                }\n\n                /* Don't return MA_AT_END for looping sounds. */\n                result = MA_SUCCESS;\n            } else {\n                if (pCurrentDataSource->pNext != NULL) {\n                    pDataSourceBase->pCurrent = pCurrentDataSource->pNext;\n                } else if (pCurrentDataSource->onGetNext != NULL) {\n                    pDataSourceBase->pCurrent = pCurrentDataSource->onGetNext(pCurrentDataSource);\n                    if (pDataSourceBase->pCurrent == NULL) {\n                        break;  /* Our callback did not return a next data source. We're done. */\n                    }\n                } else {\n                    /* Reached the end of the chain. We're done. */\n                    break;\n                }\n\n                /* The next data source needs to be rewound to ensure data is read in looping scenarios. */\n                result = ma_data_source_seek_to_pcm_frame(pDataSourceBase->pCurrent, 0);\n                if (result != MA_SUCCESS) {\n                    break;\n                }\n            }\n        }\n\n        if (pRunningFramesOut != NULL) {\n            pRunningFramesOut = ma_offset_ptr(pRunningFramesOut, framesProcessed * ma_get_bytes_per_frame(format, channels));\n        }\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = totalFramesProcessed;\n    }\n\n    MA_ASSERT(!(result == MA_AT_END && totalFramesProcessed > 0));  /* We should never be returning MA_AT_END if we read some data. */\n\n    if (result == MA_SUCCESS && totalFramesProcessed == 0) {\n        result  = MA_AT_END;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_data_source_seek_pcm_frames(ma_data_source* pDataSource, ma_uint64 frameCount, ma_uint64* pFramesSeeked)\n{\n    return ma_data_source_read_pcm_frames(pDataSource, NULL, frameCount, pFramesSeeked);\n}\n\nMA_API ma_result ma_data_source_seek_to_pcm_frame(ma_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource;\n\n    if (pDataSourceBase == NULL) {\n        return MA_SUCCESS;\n    }\n\n    if (pDataSourceBase->vtable->onSeek == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    if (frameIndex > pDataSourceBase->rangeEndInFrames) {\n        return MA_INVALID_OPERATION;    /* Trying to seek to far forward. */\n    }\n\n    return pDataSourceBase->vtable->onSeek(pDataSource, pDataSourceBase->rangeBegInFrames + frameIndex);\n}\n\nMA_API ma_result ma_data_source_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource;\n    ma_result result;\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n\n    /* Initialize to defaults for safety just in case the data source does not implement this callback. */\n    if (pFormat != NULL) {\n        *pFormat = ma_format_unknown;\n    }\n    if (pChannels != NULL) {\n        *pChannels = 0;\n    }\n    if (pSampleRate != NULL) {\n        *pSampleRate = 0;\n    }\n    if (pChannelMap != NULL) {\n        MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap);\n    }\n\n    if (pDataSourceBase == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pDataSourceBase->vtable->onGetDataFormat == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    result = pDataSourceBase->vtable->onGetDataFormat(pDataSource, &format, &channels, &sampleRate, pChannelMap, channelMapCap);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pFormat != NULL) {\n        *pFormat = format;\n    }\n    if (pChannels != NULL) {\n        *pChannels = channels;\n    }\n    if (pSampleRate != NULL) {\n        *pSampleRate = sampleRate;\n    }\n\n    /* Channel map was passed in directly to the callback. This is safe due to the channelMapCap parameter. */\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_data_source_get_cursor_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pCursor)\n{\n    ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource;\n    ma_result result;\n    ma_uint64 cursor;\n\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;\n\n    if (pDataSourceBase == NULL) {\n        return MA_SUCCESS;\n    }\n\n    if (pDataSourceBase->vtable->onGetCursor == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    result = pDataSourceBase->vtable->onGetCursor(pDataSourceBase, &cursor);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* The cursor needs to be made relative to the start of the range. */\n    if (cursor < pDataSourceBase->rangeBegInFrames) {   /* Safety check so we don't return some huge number. */\n        *pCursor = 0;\n    } else {\n        *pCursor = cursor - pDataSourceBase->rangeBegInFrames;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_data_source_get_length_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pLength)\n{\n    ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource;\n\n    if (pLength == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pLength = 0;\n\n    if (pDataSourceBase == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /*\n    If we have a range defined we'll use that to determine the length. This is one of rare times\n    where we'll actually trust the caller. If they've set the range, I think it's mostly safe to\n    assume they've set it based on some higher level knowledge of the structure of the sound bank.\n    */\n    if (pDataSourceBase->rangeEndInFrames != ~((ma_uint64)0)) {\n        *pLength = pDataSourceBase->rangeEndInFrames - pDataSourceBase->rangeBegInFrames;\n        return MA_SUCCESS;\n    }\n\n    /*\n    Getting here means a range is not defined so we'll need to get the data source itself to tell\n    us the length.\n    */\n    if (pDataSourceBase->vtable->onGetLength == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    return pDataSourceBase->vtable->onGetLength(pDataSource, pLength);\n}\n\nMA_API ma_result ma_data_source_get_cursor_in_seconds(ma_data_source* pDataSource, float* pCursor)\n{\n    ma_result result;\n    ma_uint64 cursorInPCMFrames;\n    ma_uint32 sampleRate;\n\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;\n\n    result = ma_data_source_get_cursor_in_pcm_frames(pDataSource, &cursorInPCMFrames);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = ma_data_source_get_data_format(pDataSource, NULL, NULL, &sampleRate, NULL, 0);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* VC6 does not support division of unsigned 64-bit integers with floating point numbers. Need to use a signed number. This shouldn't effect anything in practice. */\n    *pCursor = (ma_int64)cursorInPCMFrames / (float)sampleRate;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_data_source_get_length_in_seconds(ma_data_source* pDataSource, float* pLength)\n{\n    ma_result result;\n    ma_uint64 lengthInPCMFrames;\n    ma_uint32 sampleRate;\n\n    if (pLength == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pLength = 0;\n\n    result = ma_data_source_get_length_in_pcm_frames(pDataSource, &lengthInPCMFrames);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = ma_data_source_get_data_format(pDataSource, NULL, NULL, &sampleRate, NULL, 0);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* VC6 does not support division of unsigned 64-bit integers with floating point numbers. Need to use a signed number. This shouldn't effect anything in practice. */\n    *pLength = (ma_int64)lengthInPCMFrames / (float)sampleRate;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_data_source_set_looping(ma_data_source* pDataSource, ma_bool32 isLooping)\n{\n    ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource;\n\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_atomic_exchange_32(&pDataSourceBase->isLooping, isLooping);\n\n    /* If there's no callback for this just treat it as a successful no-op. */\n    if (pDataSourceBase->vtable->onSetLooping == NULL) {\n        return MA_SUCCESS;\n    }\n\n    return pDataSourceBase->vtable->onSetLooping(pDataSource, isLooping);\n}\n\nMA_API ma_bool32 ma_data_source_is_looping(const ma_data_source* pDataSource)\n{\n    const ma_data_source_base* pDataSourceBase = (const ma_data_source_base*)pDataSource;\n\n    if (pDataSource == NULL) {\n        return MA_FALSE;\n    }\n\n    return ma_atomic_load_32(&pDataSourceBase->isLooping);\n}\n\nMA_API ma_result ma_data_source_set_range_in_pcm_frames(ma_data_source* pDataSource, ma_uint64 rangeBegInFrames, ma_uint64 rangeEndInFrames)\n{\n    ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource;\n    ma_result result;\n    ma_uint64 relativeCursor;\n    ma_uint64 absoluteCursor;\n    ma_bool32 doSeekAdjustment = MA_FALSE;\n\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (rangeEndInFrames < rangeBegInFrames) {\n        return MA_INVALID_ARGS; /* The end of the range must come after the beginning. */\n    }\n\n    /*\n    We may need to adjust the position of the cursor to ensure it's clamped to the range. Grab it now\n    so we can calculate it's absolute position before we change the range.\n    */\n    result = ma_data_source_get_cursor_in_pcm_frames(pDataSource, &relativeCursor);\n    if (result == MA_SUCCESS) {\n        doSeekAdjustment = MA_TRUE;\n        absoluteCursor = relativeCursor + pDataSourceBase->rangeBegInFrames;\n    } else {\n        /*\n        We couldn't get the position of the cursor. It probably means the data source has no notion\n        of a cursor. We'll just leave it at position 0. Don't treat this as an error.\n        */\n        doSeekAdjustment = MA_FALSE;\n        relativeCursor = 0;\n        absoluteCursor = 0;\n    }\n\n    pDataSourceBase->rangeBegInFrames = rangeBegInFrames;\n    pDataSourceBase->rangeEndInFrames = rangeEndInFrames;\n\n    /*\n    The commented out logic below was intended to maintain loop points in response to a change in the\n    range. However, this is not useful because it results in the sound breaking when you move the range\n    outside of the old loop points. I'm simplifying this by simply resetting the loop points. The\n    caller is expected to update their loop points if they change the range.\n\n    In practice this should be mostly a non-issue because the majority of the time the range will be\n    set once right after initialization.\n    */\n    pDataSourceBase->loopBegInFrames = 0;\n    pDataSourceBase->loopEndInFrames = ~((ma_uint64)0);\n\n\n    /*\n    Seek to within range. Note that our seek positions here are relative to the new range. We don't want\n    do do this if we failed to retrieve the cursor earlier on because it probably means the data source\n    has no notion of a cursor. In practice the seek would probably fail (which we silently ignore), but\n    I'm just not even going to attempt it.\n    */\n    if (doSeekAdjustment) {\n        if (absoluteCursor < rangeBegInFrames) {\n            ma_data_source_seek_to_pcm_frame(pDataSource, 0);\n        } else if (absoluteCursor > rangeEndInFrames) {\n            ma_data_source_seek_to_pcm_frame(pDataSource, rangeEndInFrames - rangeBegInFrames);\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_data_source_get_range_in_pcm_frames(const ma_data_source* pDataSource, ma_uint64* pRangeBegInFrames, ma_uint64* pRangeEndInFrames)\n{\n    const ma_data_source_base* pDataSourceBase = (const ma_data_source_base*)pDataSource;\n\n    if (pDataSource == NULL) {\n        return;\n    }\n\n    if (pRangeBegInFrames != NULL) {\n        *pRangeBegInFrames = pDataSourceBase->rangeBegInFrames;\n    }\n\n    if (pRangeEndInFrames != NULL) {\n        *pRangeEndInFrames = pDataSourceBase->rangeEndInFrames;\n    }\n}\n\nMA_API ma_result ma_data_source_set_loop_point_in_pcm_frames(ma_data_source* pDataSource, ma_uint64 loopBegInFrames, ma_uint64 loopEndInFrames)\n{\n    ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource;\n\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (loopEndInFrames < loopBegInFrames) {\n        return MA_INVALID_ARGS; /* The end of the loop point must come after the beginning. */\n    }\n\n    if (loopEndInFrames > pDataSourceBase->rangeEndInFrames && loopEndInFrames != ~((ma_uint64)0)) {\n        return MA_INVALID_ARGS; /* The end of the loop point must not go beyond the range. */\n    }\n\n    pDataSourceBase->loopBegInFrames = loopBegInFrames;\n    pDataSourceBase->loopEndInFrames = loopEndInFrames;\n\n    /* The end cannot exceed the range. */\n    if (pDataSourceBase->loopEndInFrames > (pDataSourceBase->rangeEndInFrames - pDataSourceBase->rangeBegInFrames) && pDataSourceBase->loopEndInFrames != ~((ma_uint64)0)) {\n        pDataSourceBase->loopEndInFrames = (pDataSourceBase->rangeEndInFrames - pDataSourceBase->rangeBegInFrames);\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_data_source_get_loop_point_in_pcm_frames(const ma_data_source* pDataSource, ma_uint64* pLoopBegInFrames, ma_uint64* pLoopEndInFrames)\n{\n    const ma_data_source_base* pDataSourceBase = (const ma_data_source_base*)pDataSource;\n\n    if (pDataSource == NULL) {\n        return;\n    }\n\n    if (pLoopBegInFrames != NULL) {\n        *pLoopBegInFrames = pDataSourceBase->loopBegInFrames;\n    }\n\n    if (pLoopEndInFrames != NULL) {\n        *pLoopEndInFrames = pDataSourceBase->loopEndInFrames;\n    }\n}\n\nMA_API ma_result ma_data_source_set_current(ma_data_source* pDataSource, ma_data_source* pCurrentDataSource)\n{\n    ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource;\n\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pDataSourceBase->pCurrent = pCurrentDataSource;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_data_source* ma_data_source_get_current(const ma_data_source* pDataSource)\n{\n    const ma_data_source_base* pDataSourceBase = (const ma_data_source_base*)pDataSource;\n\n    if (pDataSource == NULL) {\n        return NULL;\n    }\n\n    return pDataSourceBase->pCurrent;\n}\n\nMA_API ma_result ma_data_source_set_next(ma_data_source* pDataSource, ma_data_source* pNextDataSource)\n{\n    ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource;\n\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pDataSourceBase->pNext = pNextDataSource;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_data_source* ma_data_source_get_next(const ma_data_source* pDataSource)\n{\n    const ma_data_source_base* pDataSourceBase = (const ma_data_source_base*)pDataSource;\n\n    if (pDataSource == NULL) {\n        return NULL;\n    }\n\n    return pDataSourceBase->pNext;\n}\n\nMA_API ma_result ma_data_source_set_next_callback(ma_data_source* pDataSource, ma_data_source_get_next_proc onGetNext)\n{\n    ma_data_source_base* pDataSourceBase = (ma_data_source_base*)pDataSource;\n\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pDataSourceBase->onGetNext = onGetNext;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_data_source_get_next_proc ma_data_source_get_next_callback(const ma_data_source* pDataSource)\n{\n    const ma_data_source_base* pDataSourceBase = (const ma_data_source_base*)pDataSource;\n\n    if (pDataSource == NULL) {\n        return NULL;\n    }\n\n    return pDataSourceBase->onGetNext;\n}\n\n\nstatic ma_result ma_audio_buffer_ref__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    ma_audio_buffer_ref* pAudioBufferRef = (ma_audio_buffer_ref*)pDataSource;\n    ma_uint64 framesRead = ma_audio_buffer_ref_read_pcm_frames(pAudioBufferRef, pFramesOut, frameCount, MA_FALSE);\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = framesRead;\n    }\n\n    if (framesRead < frameCount || framesRead == 0) {\n        return MA_AT_END;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_audio_buffer_ref__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    return ma_audio_buffer_ref_seek_to_pcm_frame((ma_audio_buffer_ref*)pDataSource, frameIndex);\n}\n\nstatic ma_result ma_audio_buffer_ref__data_source_on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    ma_audio_buffer_ref* pAudioBufferRef = (ma_audio_buffer_ref*)pDataSource;\n\n    *pFormat     = pAudioBufferRef->format;\n    *pChannels   = pAudioBufferRef->channels;\n    *pSampleRate = pAudioBufferRef->sampleRate;\n    ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pAudioBufferRef->channels);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_audio_buffer_ref__data_source_on_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)\n{\n    ma_audio_buffer_ref* pAudioBufferRef = (ma_audio_buffer_ref*)pDataSource;\n\n    *pCursor = pAudioBufferRef->cursor;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_audio_buffer_ref__data_source_on_get_length(ma_data_source* pDataSource, ma_uint64* pLength)\n{\n    ma_audio_buffer_ref* pAudioBufferRef = (ma_audio_buffer_ref*)pDataSource;\n\n    *pLength = pAudioBufferRef->sizeInFrames;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_data_source_vtable g_ma_audio_buffer_ref_data_source_vtable =\n{\n    ma_audio_buffer_ref__data_source_on_read,\n    ma_audio_buffer_ref__data_source_on_seek,\n    ma_audio_buffer_ref__data_source_on_get_data_format,\n    ma_audio_buffer_ref__data_source_on_get_cursor,\n    ma_audio_buffer_ref__data_source_on_get_length,\n    NULL,   /* onSetLooping */\n    0\n};\n\nMA_API ma_result ma_audio_buffer_ref_init(ma_format format, ma_uint32 channels, const void* pData, ma_uint64 sizeInFrames, ma_audio_buffer_ref* pAudioBufferRef)\n{\n    ma_result result;\n    ma_data_source_config dataSourceConfig;\n\n    if (pAudioBufferRef == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pAudioBufferRef);\n\n    dataSourceConfig = ma_data_source_config_init();\n    dataSourceConfig.vtable = &g_ma_audio_buffer_ref_data_source_vtable;\n\n    result = ma_data_source_init(&dataSourceConfig, &pAudioBufferRef->ds);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pAudioBufferRef->format       = format;\n    pAudioBufferRef->channels     = channels;\n    pAudioBufferRef->sampleRate   = 0;  /* TODO: Version 0.12. Set this to sampleRate. */\n    pAudioBufferRef->cursor       = 0;\n    pAudioBufferRef->sizeInFrames = sizeInFrames;\n    pAudioBufferRef->pData        = pData;\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_audio_buffer_ref_uninit(ma_audio_buffer_ref* pAudioBufferRef)\n{\n    if (pAudioBufferRef == NULL) {\n        return;\n    }\n\n    ma_data_source_uninit(&pAudioBufferRef->ds);\n}\n\nMA_API ma_result ma_audio_buffer_ref_set_data(ma_audio_buffer_ref* pAudioBufferRef, const void* pData, ma_uint64 sizeInFrames)\n{\n    if (pAudioBufferRef == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pAudioBufferRef->cursor       = 0;\n    pAudioBufferRef->sizeInFrames = sizeInFrames;\n    pAudioBufferRef->pData        = pData;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_uint64 ma_audio_buffer_ref_read_pcm_frames(ma_audio_buffer_ref* pAudioBufferRef, void* pFramesOut, ma_uint64 frameCount, ma_bool32 loop)\n{\n    ma_uint64 totalFramesRead = 0;\n\n    if (pAudioBufferRef == NULL) {\n        return 0;\n    }\n\n    if (frameCount == 0) {\n        return 0;\n    }\n\n    while (totalFramesRead < frameCount) {\n        ma_uint64 framesAvailable = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor;\n        ma_uint64 framesRemaining = frameCount - totalFramesRead;\n        ma_uint64 framesToRead;\n\n        framesToRead = framesRemaining;\n        if (framesToRead > framesAvailable) {\n            framesToRead = framesAvailable;\n        }\n\n        if (pFramesOut != NULL) {\n            ma_copy_pcm_frames(ma_offset_ptr(pFramesOut, totalFramesRead * ma_get_bytes_per_frame(pAudioBufferRef->format, pAudioBufferRef->channels)), ma_offset_ptr(pAudioBufferRef->pData, pAudioBufferRef->cursor * ma_get_bytes_per_frame(pAudioBufferRef->format, pAudioBufferRef->channels)), framesToRead, pAudioBufferRef->format, pAudioBufferRef->channels);\n        }\n\n        totalFramesRead += framesToRead;\n\n        pAudioBufferRef->cursor += framesToRead;\n        if (pAudioBufferRef->cursor == pAudioBufferRef->sizeInFrames) {\n            if (loop) {\n                pAudioBufferRef->cursor = 0;\n            } else {\n                break;  /* We've reached the end and we're not looping. Done. */\n            }\n        }\n\n        MA_ASSERT(pAudioBufferRef->cursor < pAudioBufferRef->sizeInFrames);\n    }\n\n    return totalFramesRead;\n}\n\nMA_API ma_result ma_audio_buffer_ref_seek_to_pcm_frame(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameIndex)\n{\n    if (pAudioBufferRef == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (frameIndex > pAudioBufferRef->sizeInFrames) {\n        return MA_INVALID_ARGS;\n    }\n\n    pAudioBufferRef->cursor = (size_t)frameIndex;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_audio_buffer_ref_map(ma_audio_buffer_ref* pAudioBufferRef, void** ppFramesOut, ma_uint64* pFrameCount)\n{\n    ma_uint64 framesAvailable;\n    ma_uint64 frameCount = 0;\n\n    if (ppFramesOut != NULL) {\n        *ppFramesOut = NULL;    /* Safety. */\n    }\n\n    if (pFrameCount != NULL) {\n        frameCount = *pFrameCount;\n        *pFrameCount = 0;       /* Safety. */\n    }\n\n    if (pAudioBufferRef == NULL || ppFramesOut == NULL || pFrameCount == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    framesAvailable = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor;\n    if (frameCount > framesAvailable) {\n        frameCount = framesAvailable;\n    }\n\n    *ppFramesOut = ma_offset_ptr(pAudioBufferRef->pData, pAudioBufferRef->cursor * ma_get_bytes_per_frame(pAudioBufferRef->format, pAudioBufferRef->channels));\n    *pFrameCount = frameCount;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_audio_buffer_ref_unmap(ma_audio_buffer_ref* pAudioBufferRef, ma_uint64 frameCount)\n{\n    ma_uint64 framesAvailable;\n\n    if (pAudioBufferRef == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    framesAvailable = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor;\n    if (frameCount > framesAvailable) {\n        return MA_INVALID_ARGS;   /* The frame count was too big. This should never happen in an unmapping. Need to make sure the caller is aware of this. */\n    }\n\n    pAudioBufferRef->cursor += frameCount;\n\n    if (pAudioBufferRef->cursor == pAudioBufferRef->sizeInFrames) {\n        return MA_AT_END;   /* Successful. Need to tell the caller that the end has been reached so that it can loop if desired. */\n    } else {\n        return MA_SUCCESS;\n    }\n}\n\nMA_API ma_bool32 ma_audio_buffer_ref_at_end(const ma_audio_buffer_ref* pAudioBufferRef)\n{\n    if (pAudioBufferRef == NULL) {\n        return MA_FALSE;\n    }\n\n    return pAudioBufferRef->cursor == pAudioBufferRef->sizeInFrames;\n}\n\nMA_API ma_result ma_audio_buffer_ref_get_cursor_in_pcm_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pCursor)\n{\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;\n\n    if (pAudioBufferRef == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = pAudioBufferRef->cursor;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_audio_buffer_ref_get_length_in_pcm_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pLength)\n{\n    if (pLength == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pLength = 0;\n\n    if (pAudioBufferRef == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pLength = pAudioBufferRef->sizeInFrames;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_audio_buffer_ref_get_available_frames(const ma_audio_buffer_ref* pAudioBufferRef, ma_uint64* pAvailableFrames)\n{\n    if (pAvailableFrames == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pAvailableFrames = 0;\n\n    if (pAudioBufferRef == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pAudioBufferRef->sizeInFrames <= pAudioBufferRef->cursor) {\n        *pAvailableFrames = 0;\n    } else {\n        *pAvailableFrames = pAudioBufferRef->sizeInFrames - pAudioBufferRef->cursor;\n    }\n\n    return MA_SUCCESS;\n}\n\n\n\n\nMA_API ma_audio_buffer_config ma_audio_buffer_config_init(ma_format format, ma_uint32 channels, ma_uint64 sizeInFrames, const void* pData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_audio_buffer_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format       = format;\n    config.channels     = channels;\n    config.sampleRate   = 0;    /* TODO: Version 0.12. Set this to sampleRate. */\n    config.sizeInFrames = sizeInFrames;\n    config.pData        = pData;\n    ma_allocation_callbacks_init_copy(&config.allocationCallbacks, pAllocationCallbacks);\n\n    return config;\n}\n\nstatic ma_result ma_audio_buffer_init_ex(const ma_audio_buffer_config* pConfig, ma_bool32 doCopy, ma_audio_buffer* pAudioBuffer)\n{\n    ma_result result;\n\n    if (pAudioBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_MEMORY(pAudioBuffer, sizeof(*pAudioBuffer) - sizeof(pAudioBuffer->_pExtraData));   /* Safety. Don't overwrite the extra data. */\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->sizeInFrames == 0) {\n        return MA_INVALID_ARGS; /* Not allowing buffer sizes of 0 frames. */\n    }\n\n    result = ma_audio_buffer_ref_init(pConfig->format, pConfig->channels, NULL, 0, &pAudioBuffer->ref);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* TODO: Version 0.12. Set this in ma_audio_buffer_ref_init() instead of here. */\n    pAudioBuffer->ref.sampleRate = pConfig->sampleRate;\n\n    ma_allocation_callbacks_init_copy(&pAudioBuffer->allocationCallbacks, &pConfig->allocationCallbacks);\n\n    if (doCopy) {\n        ma_uint64 allocationSizeInBytes;\n        void* pData;\n\n        allocationSizeInBytes = pConfig->sizeInFrames * ma_get_bytes_per_frame(pConfig->format, pConfig->channels);\n        if (allocationSizeInBytes > MA_SIZE_MAX) {\n            return MA_OUT_OF_MEMORY;    /* Too big. */\n        }\n\n        pData = ma_malloc((size_t)allocationSizeInBytes, &pAudioBuffer->allocationCallbacks);   /* Safe cast to size_t. */\n        if (pData == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n\n        if (pConfig->pData != NULL) {\n            ma_copy_pcm_frames(pData, pConfig->pData, pConfig->sizeInFrames, pConfig->format, pConfig->channels);\n        } else {\n            ma_silence_pcm_frames(pData, pConfig->sizeInFrames, pConfig->format, pConfig->channels);\n        }\n\n        ma_audio_buffer_ref_set_data(&pAudioBuffer->ref, pData, pConfig->sizeInFrames);\n        pAudioBuffer->ownsData = MA_TRUE;\n    } else {\n        ma_audio_buffer_ref_set_data(&pAudioBuffer->ref, pConfig->pData, pConfig->sizeInFrames);\n        pAudioBuffer->ownsData = MA_FALSE;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_audio_buffer_uninit_ex(ma_audio_buffer* pAudioBuffer, ma_bool32 doFree)\n{\n    if (pAudioBuffer == NULL) {\n        return;\n    }\n\n    if (pAudioBuffer->ownsData && pAudioBuffer->ref.pData != &pAudioBuffer->_pExtraData[0]) {\n        ma_free((void*)pAudioBuffer->ref.pData, &pAudioBuffer->allocationCallbacks);    /* Naugty const cast, but OK in this case since we've guarded it with the ownsData check. */\n    }\n\n    if (doFree) {\n        ma_free(pAudioBuffer, &pAudioBuffer->allocationCallbacks);\n    }\n\n    ma_audio_buffer_ref_uninit(&pAudioBuffer->ref);\n}\n\nMA_API ma_result ma_audio_buffer_init(const ma_audio_buffer_config* pConfig, ma_audio_buffer* pAudioBuffer)\n{\n    return ma_audio_buffer_init_ex(pConfig, MA_FALSE, pAudioBuffer);\n}\n\nMA_API ma_result ma_audio_buffer_init_copy(const ma_audio_buffer_config* pConfig, ma_audio_buffer* pAudioBuffer)\n{\n    return ma_audio_buffer_init_ex(pConfig, MA_TRUE, pAudioBuffer);\n}\n\nMA_API ma_result ma_audio_buffer_alloc_and_init(const ma_audio_buffer_config* pConfig, ma_audio_buffer** ppAudioBuffer)\n{\n    ma_result result;\n    ma_audio_buffer* pAudioBuffer;\n    ma_audio_buffer_config innerConfig; /* We'll be making some changes to the config, so need to make a copy. */\n    ma_uint64 allocationSizeInBytes;\n\n    if (ppAudioBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *ppAudioBuffer = NULL;  /* Safety. */\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    innerConfig = *pConfig;\n    ma_allocation_callbacks_init_copy(&innerConfig.allocationCallbacks, &pConfig->allocationCallbacks);\n\n    allocationSizeInBytes = sizeof(*pAudioBuffer) - sizeof(pAudioBuffer->_pExtraData) + (pConfig->sizeInFrames * ma_get_bytes_per_frame(pConfig->format, pConfig->channels));\n    if (allocationSizeInBytes > MA_SIZE_MAX) {\n        return MA_OUT_OF_MEMORY;    /* Too big. */\n    }\n\n    pAudioBuffer = (ma_audio_buffer*)ma_malloc((size_t)allocationSizeInBytes, &innerConfig.allocationCallbacks);  /* Safe cast to size_t. */\n    if (pAudioBuffer == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    if (pConfig->pData != NULL) {\n        ma_copy_pcm_frames(&pAudioBuffer->_pExtraData[0], pConfig->pData, pConfig->sizeInFrames, pConfig->format, pConfig->channels);\n    } else {\n        ma_silence_pcm_frames(&pAudioBuffer->_pExtraData[0], pConfig->sizeInFrames, pConfig->format, pConfig->channels);\n    }\n\n    innerConfig.pData = &pAudioBuffer->_pExtraData[0];\n\n    result = ma_audio_buffer_init_ex(&innerConfig, MA_FALSE, pAudioBuffer);\n    if (result != MA_SUCCESS) {\n        ma_free(pAudioBuffer, &innerConfig.allocationCallbacks);\n        return result;\n    }\n\n    *ppAudioBuffer = pAudioBuffer;\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_audio_buffer_uninit(ma_audio_buffer* pAudioBuffer)\n{\n    ma_audio_buffer_uninit_ex(pAudioBuffer, MA_FALSE);\n}\n\nMA_API void ma_audio_buffer_uninit_and_free(ma_audio_buffer* pAudioBuffer)\n{\n    ma_audio_buffer_uninit_ex(pAudioBuffer, MA_TRUE);\n}\n\nMA_API ma_uint64 ma_audio_buffer_read_pcm_frames(ma_audio_buffer* pAudioBuffer, void* pFramesOut, ma_uint64 frameCount, ma_bool32 loop)\n{\n    if (pAudioBuffer == NULL) {\n        return 0;\n    }\n\n    return ma_audio_buffer_ref_read_pcm_frames(&pAudioBuffer->ref, pFramesOut, frameCount, loop);\n}\n\nMA_API ma_result ma_audio_buffer_seek_to_pcm_frame(ma_audio_buffer* pAudioBuffer, ma_uint64 frameIndex)\n{\n    if (pAudioBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_audio_buffer_ref_seek_to_pcm_frame(&pAudioBuffer->ref, frameIndex);\n}\n\nMA_API ma_result ma_audio_buffer_map(ma_audio_buffer* pAudioBuffer, void** ppFramesOut, ma_uint64* pFrameCount)\n{\n    if (ppFramesOut != NULL) {\n        *ppFramesOut = NULL;    /* Safety. */\n    }\n\n    if (pAudioBuffer == NULL) {\n        if (pFrameCount != NULL) {\n            *pFrameCount = 0;\n        }\n\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_audio_buffer_ref_map(&pAudioBuffer->ref, ppFramesOut, pFrameCount);\n}\n\nMA_API ma_result ma_audio_buffer_unmap(ma_audio_buffer* pAudioBuffer, ma_uint64 frameCount)\n{\n    if (pAudioBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_audio_buffer_ref_unmap(&pAudioBuffer->ref, frameCount);\n}\n\nMA_API ma_bool32 ma_audio_buffer_at_end(const ma_audio_buffer* pAudioBuffer)\n{\n    if (pAudioBuffer == NULL) {\n        return MA_FALSE;\n    }\n\n    return ma_audio_buffer_ref_at_end(&pAudioBuffer->ref);\n}\n\nMA_API ma_result ma_audio_buffer_get_cursor_in_pcm_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pCursor)\n{\n    if (pAudioBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_audio_buffer_ref_get_cursor_in_pcm_frames(&pAudioBuffer->ref, pCursor);\n}\n\nMA_API ma_result ma_audio_buffer_get_length_in_pcm_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pLength)\n{\n    if (pAudioBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_audio_buffer_ref_get_length_in_pcm_frames(&pAudioBuffer->ref, pLength);\n}\n\nMA_API ma_result ma_audio_buffer_get_available_frames(const ma_audio_buffer* pAudioBuffer, ma_uint64* pAvailableFrames)\n{\n    if (pAvailableFrames == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pAvailableFrames = 0;\n\n    if (pAudioBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_audio_buffer_ref_get_available_frames(&pAudioBuffer->ref, pAvailableFrames);\n}\n\n\n\n\n\nMA_API ma_result ma_paged_audio_buffer_data_init(ma_format format, ma_uint32 channels, ma_paged_audio_buffer_data* pData)\n{\n    if (pData == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pData);\n\n    pData->format   = format;\n    pData->channels = channels;\n    pData->pTail    = &pData->head;\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_paged_audio_buffer_data_uninit(ma_paged_audio_buffer_data* pData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_paged_audio_buffer_page* pPage;\n\n    if (pData == NULL) {\n        return;\n    }\n\n    /* All pages need to be freed. */\n    pPage = (ma_paged_audio_buffer_page*)ma_atomic_load_ptr(&pData->head.pNext);\n    while (pPage != NULL) {\n        ma_paged_audio_buffer_page* pNext = (ma_paged_audio_buffer_page*)ma_atomic_load_ptr(&pPage->pNext);\n\n        ma_free(pPage, pAllocationCallbacks);\n        pPage = pNext;\n    }\n}\n\nMA_API ma_paged_audio_buffer_page* ma_paged_audio_buffer_data_get_head(ma_paged_audio_buffer_data* pData)\n{\n    if (pData == NULL) {\n        return NULL;\n    }\n\n    return &pData->head;\n}\n\nMA_API ma_paged_audio_buffer_page* ma_paged_audio_buffer_data_get_tail(ma_paged_audio_buffer_data* pData)\n{\n    if (pData == NULL) {\n        return NULL;\n    }\n\n    return pData->pTail;\n}\n\nMA_API ma_result ma_paged_audio_buffer_data_get_length_in_pcm_frames(ma_paged_audio_buffer_data* pData, ma_uint64* pLength)\n{\n    ma_paged_audio_buffer_page* pPage;\n\n    if (pLength == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pLength = 0;\n\n    if (pData == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Calculate the length from the linked list. */\n    for (pPage = (ma_paged_audio_buffer_page*)ma_atomic_load_ptr(&pData->head.pNext); pPage != NULL; pPage = (ma_paged_audio_buffer_page*)ma_atomic_load_ptr(&pPage->pNext)) {\n        *pLength += pPage->sizeInFrames;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_paged_audio_buffer_data_allocate_page(ma_paged_audio_buffer_data* pData, ma_uint64 pageSizeInFrames, const void* pInitialData, const ma_allocation_callbacks* pAllocationCallbacks, ma_paged_audio_buffer_page** ppPage)\n{\n    ma_paged_audio_buffer_page* pPage;\n    ma_uint64 allocationSize;\n\n    if (ppPage == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *ppPage = NULL;\n\n    if (pData == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    allocationSize = sizeof(*pPage) + (pageSizeInFrames * ma_get_bytes_per_frame(pData->format, pData->channels));\n    if (allocationSize > MA_SIZE_MAX) {\n        return MA_OUT_OF_MEMORY;    /* Too big. */\n    }\n\n    pPage = (ma_paged_audio_buffer_page*)ma_malloc((size_t)allocationSize, pAllocationCallbacks);   /* Safe cast to size_t. */\n    if (pPage == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    pPage->pNext = NULL;\n    pPage->sizeInFrames = pageSizeInFrames;\n\n    if (pInitialData != NULL) {\n        ma_copy_pcm_frames(pPage->pAudioData, pInitialData, pageSizeInFrames, pData->format, pData->channels);\n    }\n\n    *ppPage = pPage;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_paged_audio_buffer_data_free_page(ma_paged_audio_buffer_data* pData, ma_paged_audio_buffer_page* pPage, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pData == NULL || pPage == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* It's assumed the page is not attached to the list. */\n    ma_free(pPage, pAllocationCallbacks);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_paged_audio_buffer_data_append_page(ma_paged_audio_buffer_data* pData, ma_paged_audio_buffer_page* pPage)\n{\n    if (pData == NULL || pPage == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* This function assumes the page has been filled with audio data by this point. As soon as we append, the page will be available for reading. */\n\n    /* First thing to do is update the tail. */\n    for (;;) {\n        ma_paged_audio_buffer_page* pOldTail = (ma_paged_audio_buffer_page*)ma_atomic_load_ptr(&pData->pTail);\n        ma_paged_audio_buffer_page* pNewTail = pPage;\n\n        if (ma_atomic_compare_exchange_weak_ptr((volatile void**)&pData->pTail, (void**)&pOldTail, pNewTail)) {\n            /* Here is where we append the page to the list. After this, the page is attached to the list and ready to be read from. */\n            ma_atomic_exchange_ptr(&pOldTail->pNext, pPage);\n            break;  /* Done. */\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_paged_audio_buffer_data_allocate_and_append_page(ma_paged_audio_buffer_data* pData, ma_uint32 pageSizeInFrames, const void* pInitialData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_result result;\n    ma_paged_audio_buffer_page* pPage;\n\n    result = ma_paged_audio_buffer_data_allocate_page(pData, pageSizeInFrames, pInitialData, pAllocationCallbacks, &pPage);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_paged_audio_buffer_data_append_page(pData, pPage);    /* <-- Should never fail. */\n}\n\n\nMA_API ma_paged_audio_buffer_config ma_paged_audio_buffer_config_init(ma_paged_audio_buffer_data* pData)\n{\n    ma_paged_audio_buffer_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.pData = pData;\n\n    return config;\n}\n\n\nstatic ma_result ma_paged_audio_buffer__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    return ma_paged_audio_buffer_read_pcm_frames((ma_paged_audio_buffer*)pDataSource, pFramesOut, frameCount, pFramesRead);\n}\n\nstatic ma_result ma_paged_audio_buffer__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    return ma_paged_audio_buffer_seek_to_pcm_frame((ma_paged_audio_buffer*)pDataSource, frameIndex);\n}\n\nstatic ma_result ma_paged_audio_buffer__data_source_on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    ma_paged_audio_buffer* pPagedAudioBuffer = (ma_paged_audio_buffer*)pDataSource;\n\n    *pFormat     = pPagedAudioBuffer->pData->format;\n    *pChannels   = pPagedAudioBuffer->pData->channels;\n    *pSampleRate = 0;   /* There is no notion of a sample rate with audio buffers. */\n    ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pPagedAudioBuffer->pData->channels);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_paged_audio_buffer__data_source_on_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)\n{\n    return ma_paged_audio_buffer_get_cursor_in_pcm_frames((ma_paged_audio_buffer*)pDataSource, pCursor);\n}\n\nstatic ma_result ma_paged_audio_buffer__data_source_on_get_length(ma_data_source* pDataSource, ma_uint64* pLength)\n{\n    return ma_paged_audio_buffer_get_length_in_pcm_frames((ma_paged_audio_buffer*)pDataSource, pLength);\n}\n\nstatic ma_data_source_vtable g_ma_paged_audio_buffer_data_source_vtable =\n{\n    ma_paged_audio_buffer__data_source_on_read,\n    ma_paged_audio_buffer__data_source_on_seek,\n    ma_paged_audio_buffer__data_source_on_get_data_format,\n    ma_paged_audio_buffer__data_source_on_get_cursor,\n    ma_paged_audio_buffer__data_source_on_get_length,\n    NULL,   /* onSetLooping */\n    0\n};\n\nMA_API ma_result ma_paged_audio_buffer_init(const ma_paged_audio_buffer_config* pConfig, ma_paged_audio_buffer* pPagedAudioBuffer)\n{\n    ma_result result;\n    ma_data_source_config dataSourceConfig;\n\n    if (pPagedAudioBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pPagedAudioBuffer);\n\n    /* A config is required for the format and channel count. */\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->pData == NULL) {\n        return MA_INVALID_ARGS; /* No underlying data specified. */\n    }\n\n    dataSourceConfig = ma_data_source_config_init();\n    dataSourceConfig.vtable = &g_ma_paged_audio_buffer_data_source_vtable;\n\n    result = ma_data_source_init(&dataSourceConfig, &pPagedAudioBuffer->ds);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pPagedAudioBuffer->pData          = pConfig->pData;\n    pPagedAudioBuffer->pCurrent       = ma_paged_audio_buffer_data_get_head(pConfig->pData);\n    pPagedAudioBuffer->relativeCursor = 0;\n    pPagedAudioBuffer->absoluteCursor = 0;\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_paged_audio_buffer_uninit(ma_paged_audio_buffer* pPagedAudioBuffer)\n{\n    if (pPagedAudioBuffer == NULL) {\n        return;\n    }\n\n    /* Nothing to do. The data needs to be deleted separately. */\n}\n\nMA_API ma_result ma_paged_audio_buffer_read_pcm_frames(ma_paged_audio_buffer* pPagedAudioBuffer, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint64 totalFramesRead = 0;\n    ma_format format;\n    ma_uint32 channels;\n\n    if (pPagedAudioBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    format   = pPagedAudioBuffer->pData->format;\n    channels = pPagedAudioBuffer->pData->channels;\n\n    while (totalFramesRead < frameCount) {\n        /* Read from the current page. The buffer should never be in a state where this is NULL. */\n        ma_uint64 framesRemainingInCurrentPage;\n        ma_uint64 framesRemainingToRead = frameCount - totalFramesRead;\n        ma_uint64 framesToReadThisIteration;\n\n        MA_ASSERT(pPagedAudioBuffer->pCurrent != NULL);\n\n        framesRemainingInCurrentPage = pPagedAudioBuffer->pCurrent->sizeInFrames - pPagedAudioBuffer->relativeCursor;\n\n        framesToReadThisIteration = ma_min(framesRemainingInCurrentPage, framesRemainingToRead);\n        ma_copy_pcm_frames(ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, format, channels), ma_offset_pcm_frames_ptr(pPagedAudioBuffer->pCurrent->pAudioData, pPagedAudioBuffer->relativeCursor, format, channels), framesToReadThisIteration, format, channels);\n        totalFramesRead += framesToReadThisIteration;\n\n        pPagedAudioBuffer->absoluteCursor += framesToReadThisIteration;\n        pPagedAudioBuffer->relativeCursor += framesToReadThisIteration;\n\n        /* Move to the next page if necessary. If there's no more pages, we need to return MA_AT_END. */\n        MA_ASSERT(pPagedAudioBuffer->relativeCursor <= pPagedAudioBuffer->pCurrent->sizeInFrames);\n\n        if (pPagedAudioBuffer->relativeCursor == pPagedAudioBuffer->pCurrent->sizeInFrames) {\n            /* We reached the end of the page. Need to move to the next. If there's no more pages, we're done. */\n            ma_paged_audio_buffer_page* pNext = (ma_paged_audio_buffer_page*)ma_atomic_load_ptr(&pPagedAudioBuffer->pCurrent->pNext);\n            if (pNext == NULL) {\n                result = MA_AT_END;\n                break;  /* We've reached the end. */\n            } else {\n                pPagedAudioBuffer->pCurrent       = pNext;\n                pPagedAudioBuffer->relativeCursor = 0;\n            }\n        }\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = totalFramesRead;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_paged_audio_buffer_seek_to_pcm_frame(ma_paged_audio_buffer* pPagedAudioBuffer, ma_uint64 frameIndex)\n{\n    if (pPagedAudioBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (frameIndex == pPagedAudioBuffer->absoluteCursor) {\n        return MA_SUCCESS;  /* Nothing to do. */\n    }\n\n    if (frameIndex < pPagedAudioBuffer->absoluteCursor) {\n        /* Moving backwards. Need to move the cursor back to the start, and then move forward. */\n        pPagedAudioBuffer->pCurrent       = ma_paged_audio_buffer_data_get_head(pPagedAudioBuffer->pData);\n        pPagedAudioBuffer->absoluteCursor = 0;\n        pPagedAudioBuffer->relativeCursor = 0;\n\n        /* Fall through to the forward seeking section below. */\n    }\n\n    if (frameIndex > pPagedAudioBuffer->absoluteCursor) {\n        /* Moving forward. */\n        ma_paged_audio_buffer_page* pPage;\n        ma_uint64 runningCursor = 0;\n\n        for (pPage = (ma_paged_audio_buffer_page*)ma_atomic_load_ptr(&ma_paged_audio_buffer_data_get_head(pPagedAudioBuffer->pData)->pNext); pPage != NULL; pPage = (ma_paged_audio_buffer_page*)ma_atomic_load_ptr(&pPage->pNext)) {\n            ma_uint64 pageRangeBeg = runningCursor;\n            ma_uint64 pageRangeEnd = pageRangeBeg + pPage->sizeInFrames;\n\n            if (frameIndex >= pageRangeBeg) {\n                if (frameIndex < pageRangeEnd || (frameIndex == pageRangeEnd && pPage == (ma_paged_audio_buffer_page*)ma_atomic_load_ptr(ma_paged_audio_buffer_data_get_tail(pPagedAudioBuffer->pData)))) {  /* A small edge case - allow seeking to the very end of the buffer. */\n                    /* We found the page. */\n                    pPagedAudioBuffer->pCurrent       = pPage;\n                    pPagedAudioBuffer->absoluteCursor = frameIndex;\n                    pPagedAudioBuffer->relativeCursor = frameIndex - pageRangeBeg;\n                    return MA_SUCCESS;\n                }\n            }\n\n            runningCursor = pageRangeEnd;\n        }\n\n        /* Getting here means we tried seeking too far forward. Don't change any state. */\n        return MA_BAD_SEEK;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_paged_audio_buffer_get_cursor_in_pcm_frames(ma_paged_audio_buffer* pPagedAudioBuffer, ma_uint64* pCursor)\n{\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;   /* Safety. */\n\n    if (pPagedAudioBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = pPagedAudioBuffer->absoluteCursor;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_paged_audio_buffer_get_length_in_pcm_frames(ma_paged_audio_buffer* pPagedAudioBuffer, ma_uint64* pLength)\n{\n    return ma_paged_audio_buffer_data_get_length_in_pcm_frames(pPagedAudioBuffer->pData, pLength);\n}\n\n\n\n/**************************************************************************************************************************************************************\n\nVFS\n\n**************************************************************************************************************************************************************/\nMA_API ma_result ma_vfs_open(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile)\n{\n    ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS;\n\n    if (pFile == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pFile = NULL;\n\n    if (pVFS == NULL || pFilePath == NULL || openMode == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pCallbacks->onOpen == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    return pCallbacks->onOpen(pVFS, pFilePath, openMode, pFile);\n}\n\nMA_API ma_result ma_vfs_open_w(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile)\n{\n    ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS;\n\n    if (pFile == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pFile = NULL;\n\n    if (pVFS == NULL || pFilePath == NULL || openMode == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pCallbacks->onOpenW == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    return pCallbacks->onOpenW(pVFS, pFilePath, openMode, pFile);\n}\n\nMA_API ma_result ma_vfs_close(ma_vfs* pVFS, ma_vfs_file file)\n{\n    ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS;\n\n    if (pVFS == NULL || file == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pCallbacks->onClose == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    return pCallbacks->onClose(pVFS, file);\n}\n\nMA_API ma_result ma_vfs_read(ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead)\n{\n    ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS;\n    ma_result result;\n    size_t bytesRead = 0;\n\n    if (pBytesRead != NULL) {\n        *pBytesRead = 0;\n    }\n\n    if (pVFS == NULL || file == NULL || pDst == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pCallbacks->onRead == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    result = pCallbacks->onRead(pVFS, file, pDst, sizeInBytes, &bytesRead);\n\n    if (pBytesRead != NULL) {\n        *pBytesRead = bytesRead;\n    }\n\n    if (result == MA_SUCCESS && bytesRead == 0 && sizeInBytes > 0) {\n        result  = MA_AT_END;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_vfs_write(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten)\n{\n    ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS;\n\n    if (pBytesWritten != NULL) {\n        *pBytesWritten = 0;\n    }\n\n    if (pVFS == NULL || file == NULL || pSrc == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pCallbacks->onWrite == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    return pCallbacks->onWrite(pVFS, file, pSrc, sizeInBytes, pBytesWritten);\n}\n\nMA_API ma_result ma_vfs_seek(ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin)\n{\n    ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS;\n\n    if (pVFS == NULL || file == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pCallbacks->onSeek == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    return pCallbacks->onSeek(pVFS, file, offset, origin);\n}\n\nMA_API ma_result ma_vfs_tell(ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor)\n{\n    ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS;\n\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;\n\n    if (pVFS == NULL || file == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pCallbacks->onTell == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    return pCallbacks->onTell(pVFS, file, pCursor);\n}\n\nMA_API ma_result ma_vfs_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo)\n{\n    ma_vfs_callbacks* pCallbacks = (ma_vfs_callbacks*)pVFS;\n\n    if (pInfo == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pInfo);\n\n    if (pVFS == NULL || file == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pCallbacks->onInfo == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    return pCallbacks->onInfo(pVFS, file, pInfo);\n}\n\n\n#if !defined(MA_USE_WIN32_FILEIO) && (defined(MA_WIN32) && defined(MA_WIN32_DESKTOP) && !defined(MA_NO_WIN32_FILEIO) && !defined(MA_POSIX))\n    #define MA_USE_WIN32_FILEIO\n#endif\n\n#if defined(MA_USE_WIN32_FILEIO)\n/*\nWe need to dynamically load SetFilePointer or SetFilePointerEx because older versions of Windows do\nnot have the Ex version. We therefore need to do some dynamic branching depending on what's available.\n\nWe load these when we load our first file from the default VFS. It's left open for the life of the\nprogram and is left to the OS to uninitialize when the program terminates.\n*/\ntypedef DWORD (__stdcall * ma_SetFilePointer_proc)(HANDLE hFile, LONG lDistanceToMove, LONG* lpDistanceToMoveHigh, DWORD dwMoveMethod);\ntypedef BOOL  (__stdcall * ma_SetFilePointerEx_proc)(HANDLE hFile, LARGE_INTEGER liDistanceToMove, LARGE_INTEGER* lpNewFilePointer, DWORD dwMoveMethod);\n\nstatic ma_handle hKernel32DLL = NULL;\nstatic ma_SetFilePointer_proc   ma_SetFilePointer   = NULL;\nstatic ma_SetFilePointerEx_proc ma_SetFilePointerEx = NULL;\n\nstatic void ma_win32_fileio_init(void)\n{\n    if (hKernel32DLL == NULL) {\n        hKernel32DLL = ma_dlopen(NULL, \"kernel32.dll\");\n        if (hKernel32DLL != NULL) {\n            ma_SetFilePointer   = (ma_SetFilePointer_proc)  ma_dlsym(NULL, hKernel32DLL, \"SetFilePointer\");\n            ma_SetFilePointerEx = (ma_SetFilePointerEx_proc)ma_dlsym(NULL, hKernel32DLL, \"SetFilePointerEx\");\n        }\n    }\n}\n\nstatic void ma_default_vfs__get_open_settings_win32(ma_uint32 openMode, DWORD* pDesiredAccess, DWORD* pShareMode, DWORD* pCreationDisposition)\n{\n    *pDesiredAccess = 0;\n    if ((openMode & MA_OPEN_MODE_READ) != 0) {\n        *pDesiredAccess |= GENERIC_READ;\n    }\n    if ((openMode & MA_OPEN_MODE_WRITE) != 0) {\n        *pDesiredAccess |= GENERIC_WRITE;\n    }\n\n    *pShareMode = 0;\n    if ((openMode & MA_OPEN_MODE_READ) != 0) {\n        *pShareMode |= FILE_SHARE_READ;\n    }\n\n    if ((openMode & MA_OPEN_MODE_WRITE) != 0) {\n        *pCreationDisposition = CREATE_ALWAYS;  /* Opening in write mode. Truncate. */\n    } else {\n        *pCreationDisposition = OPEN_EXISTING;  /* Opening in read mode. File must exist. */\n    }\n}\n\nstatic ma_result ma_default_vfs_open__win32(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile)\n{\n    HANDLE hFile;\n    DWORD dwDesiredAccess;\n    DWORD dwShareMode;\n    DWORD dwCreationDisposition;\n\n    (void)pVFS;\n\n    /* Load some Win32 symbols dynamically so we can dynamically check for the existence of SetFilePointerEx. */\n    ma_win32_fileio_init();\n\n    ma_default_vfs__get_open_settings_win32(openMode, &dwDesiredAccess, &dwShareMode, &dwCreationDisposition);\n\n    hFile = CreateFileA(pFilePath, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, NULL);\n    if (hFile == INVALID_HANDLE_VALUE) {\n        return ma_result_from_GetLastError(GetLastError());\n    }\n\n    *pFile = hFile;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_default_vfs_open_w__win32(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile)\n{\n    HANDLE hFile;\n    DWORD dwDesiredAccess;\n    DWORD dwShareMode;\n    DWORD dwCreationDisposition;\n\n    (void)pVFS;\n\n    /* Load some Win32 symbols dynamically so we can dynamically check for the existence of SetFilePointerEx. */\n    ma_win32_fileio_init();\n\n    ma_default_vfs__get_open_settings_win32(openMode, &dwDesiredAccess, &dwShareMode, &dwCreationDisposition);\n\n    hFile = CreateFileW(pFilePath, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, FILE_ATTRIBUTE_NORMAL, NULL);\n    if (hFile == INVALID_HANDLE_VALUE) {\n        return ma_result_from_GetLastError(GetLastError());\n    }\n\n    *pFile = hFile;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_default_vfs_close__win32(ma_vfs* pVFS, ma_vfs_file file)\n{\n    (void)pVFS;\n\n    if (CloseHandle((HANDLE)file) == 0) {\n        return ma_result_from_GetLastError(GetLastError());\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_default_vfs_read__win32(ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead)\n{\n    ma_result result = MA_SUCCESS;\n    size_t totalBytesRead;\n\n    (void)pVFS;\n\n    totalBytesRead = 0;\n    while (totalBytesRead < sizeInBytes) {\n        size_t bytesRemaining;\n        DWORD bytesToRead;\n        DWORD bytesRead;\n        BOOL readResult;\n\n        bytesRemaining = sizeInBytes - totalBytesRead;\n        if (bytesRemaining >= 0xFFFFFFFF) {\n            bytesToRead = 0xFFFFFFFF;\n        } else {\n            bytesToRead = (DWORD)bytesRemaining;\n        }\n\n        readResult = ReadFile((HANDLE)file, ma_offset_ptr(pDst, totalBytesRead), bytesToRead, &bytesRead, NULL);\n        if (readResult == 1 && bytesRead == 0) {\n            result = MA_AT_END;\n            break;  /* EOF */\n        }\n\n        totalBytesRead += bytesRead;\n\n        if (bytesRead < bytesToRead) {\n            break;  /* EOF */\n        }\n\n        if (readResult == 0) {\n            result = ma_result_from_GetLastError(GetLastError());\n            break;\n        }\n    }\n\n    if (pBytesRead != NULL) {\n        *pBytesRead = totalBytesRead;\n    }\n\n    return result;\n}\n\nstatic ma_result ma_default_vfs_write__win32(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten)\n{\n    ma_result result = MA_SUCCESS;\n    size_t totalBytesWritten;\n\n    (void)pVFS;\n\n    totalBytesWritten = 0;\n    while (totalBytesWritten < sizeInBytes) {\n        size_t bytesRemaining;\n        DWORD bytesToWrite;\n        DWORD bytesWritten;\n        BOOL writeResult;\n\n        bytesRemaining = sizeInBytes - totalBytesWritten;\n        if (bytesRemaining >= 0xFFFFFFFF) {\n            bytesToWrite = 0xFFFFFFFF;\n        } else {\n            bytesToWrite = (DWORD)bytesRemaining;\n        }\n\n        writeResult = WriteFile((HANDLE)file, ma_offset_ptr(pSrc, totalBytesWritten), bytesToWrite, &bytesWritten, NULL);\n        totalBytesWritten += bytesWritten;\n\n        if (writeResult == 0) {\n            result = ma_result_from_GetLastError(GetLastError());\n            break;\n        }\n    }\n\n    if (pBytesWritten != NULL) {\n        *pBytesWritten = totalBytesWritten;\n    }\n\n    return result;\n}\n\n\nstatic ma_result ma_default_vfs_seek__win32(ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin)\n{\n    LARGE_INTEGER liDistanceToMove;\n    DWORD dwMoveMethod;\n    BOOL result;\n\n    (void)pVFS;\n\n    liDistanceToMove.QuadPart = offset;\n\n    /*  */ if (origin == ma_seek_origin_current) {\n        dwMoveMethod = FILE_CURRENT;\n    } else if (origin == ma_seek_origin_end) {\n        dwMoveMethod = FILE_END;\n    } else {\n        dwMoveMethod = FILE_BEGIN;\n    }\n\n    if (ma_SetFilePointerEx != NULL) {\n        result = ma_SetFilePointerEx((HANDLE)file, liDistanceToMove, NULL, dwMoveMethod);\n    } else if (ma_SetFilePointer != NULL) {\n        /* No SetFilePointerEx() so restrict to 31 bits. */\n        if (origin > 0x7FFFFFFF) {\n            return MA_OUT_OF_RANGE;\n        }\n\n        result = ma_SetFilePointer((HANDLE)file, (LONG)liDistanceToMove.QuadPart, NULL, dwMoveMethod);\n    } else {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    if (result == 0) {\n        return ma_result_from_GetLastError(GetLastError());\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_default_vfs_tell__win32(ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor)\n{\n    LARGE_INTEGER liZero;\n    LARGE_INTEGER liTell;\n    BOOL result;\n\n    (void)pVFS;\n\n    liZero.QuadPart = 0;\n\n    if (ma_SetFilePointerEx != NULL) {\n        result = ma_SetFilePointerEx((HANDLE)file, liZero, &liTell, FILE_CURRENT);\n    } else if (ma_SetFilePointer != NULL) {\n        LONG tell;\n\n        result = ma_SetFilePointer((HANDLE)file, (LONG)liZero.QuadPart, &tell, FILE_CURRENT);\n        liTell.QuadPart = tell;\n    } else {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    if (result == 0) {\n        return ma_result_from_GetLastError(GetLastError());\n    }\n\n    if (pCursor != NULL) {\n        *pCursor = liTell.QuadPart;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_default_vfs_info__win32(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo)\n{\n    BY_HANDLE_FILE_INFORMATION fi;\n    BOOL result;\n\n    (void)pVFS;\n\n    result = GetFileInformationByHandle((HANDLE)file, &fi);\n    if (result == 0) {\n        return ma_result_from_GetLastError(GetLastError());\n    }\n\n    pInfo->sizeInBytes = ((ma_uint64)fi.nFileSizeHigh << 32) | ((ma_uint64)fi.nFileSizeLow);\n\n    return MA_SUCCESS;\n}\n#else\nstatic ma_result ma_default_vfs_open__stdio(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile)\n{\n    ma_result result;\n    FILE* pFileStd;\n    const char* pOpenModeStr;\n\n    MA_ASSERT(pFilePath != NULL);\n    MA_ASSERT(openMode  != 0);\n    MA_ASSERT(pFile     != NULL);\n\n    (void)pVFS;\n\n    if ((openMode & MA_OPEN_MODE_READ) != 0) {\n        if ((openMode & MA_OPEN_MODE_WRITE) != 0) {\n            pOpenModeStr = \"r+\";\n        } else {\n            pOpenModeStr = \"rb\";\n        }\n    } else {\n        pOpenModeStr = \"wb\";\n    }\n\n    result = ma_fopen(&pFileStd, pFilePath, pOpenModeStr);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pFile = pFileStd;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_default_vfs_open_w__stdio(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile)\n{\n    ma_result result;\n    FILE* pFileStd;\n    const wchar_t* pOpenModeStr;\n\n    MA_ASSERT(pFilePath != NULL);\n    MA_ASSERT(openMode  != 0);\n    MA_ASSERT(pFile     != NULL);\n\n    (void)pVFS;\n\n    if ((openMode & MA_OPEN_MODE_READ) != 0) {\n        if ((openMode & MA_OPEN_MODE_WRITE) != 0) {\n            pOpenModeStr = L\"r+\";\n        } else {\n            pOpenModeStr = L\"rb\";\n        }\n    } else {\n        pOpenModeStr = L\"wb\";\n    }\n\n    result = ma_wfopen(&pFileStd, pFilePath, pOpenModeStr, (pVFS != NULL) ? &((ma_default_vfs*)pVFS)->allocationCallbacks : NULL);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pFile = pFileStd;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_default_vfs_close__stdio(ma_vfs* pVFS, ma_vfs_file file)\n{\n    MA_ASSERT(file != NULL);\n\n    (void)pVFS;\n\n    fclose((FILE*)file);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_default_vfs_read__stdio(ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead)\n{\n    size_t result;\n\n    MA_ASSERT(file != NULL);\n    MA_ASSERT(pDst != NULL);\n\n    (void)pVFS;\n\n    result = fread(pDst, 1, sizeInBytes, (FILE*)file);\n\n    if (pBytesRead != NULL) {\n        *pBytesRead = result;\n    }\n\n    if (result != sizeInBytes) {\n        if (result == 0 && feof((FILE*)file)) {\n            return MA_AT_END;\n        } else {\n            return ma_result_from_errno(ferror((FILE*)file));\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_default_vfs_write__stdio(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten)\n{\n    size_t result;\n\n    MA_ASSERT(file != NULL);\n    MA_ASSERT(pSrc != NULL);\n\n    (void)pVFS;\n\n    result = fwrite(pSrc, 1, sizeInBytes, (FILE*)file);\n\n    if (pBytesWritten != NULL) {\n        *pBytesWritten = result;\n    }\n\n    if (result != sizeInBytes) {\n        return ma_result_from_errno(ferror((FILE*)file));\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_default_vfs_seek__stdio(ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin)\n{\n    int result;\n    int whence;\n\n    MA_ASSERT(file != NULL);\n\n    (void)pVFS;\n\n    if (origin == ma_seek_origin_start) {\n        whence = SEEK_SET;\n    } else if (origin == ma_seek_origin_end) {\n        whence = SEEK_END;\n    } else {\n        whence = SEEK_CUR;\n    }\n\n#if defined(_WIN32)\n    #if defined(_MSC_VER) && _MSC_VER > 1200\n        result = _fseeki64((FILE*)file, offset, whence);\n    #else\n        /* No _fseeki64() so restrict to 31 bits. */\n        if (origin > 0x7FFFFFFF) {\n            return MA_OUT_OF_RANGE;\n        }\n\n        result = fseek((FILE*)file, (int)offset, whence);\n    #endif\n#else\n    result = fseek((FILE*)file, (long int)offset, whence);\n#endif\n    if (result != 0) {\n        return MA_ERROR;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_default_vfs_tell__stdio(ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor)\n{\n    ma_int64 result;\n\n    MA_ASSERT(file    != NULL);\n    MA_ASSERT(pCursor != NULL);\n\n    (void)pVFS;\n\n#if defined(_WIN32)\n    #if defined(_MSC_VER) && _MSC_VER > 1200\n        result = _ftelli64((FILE*)file);\n    #else\n        result = ftell((FILE*)file);\n    #endif\n#else\n    result = ftell((FILE*)file);\n#endif\n\n    *pCursor = result;\n\n    return MA_SUCCESS;\n}\n\n#if !defined(_MSC_VER) && !((defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 1) || defined(_XOPEN_SOURCE) || defined(_POSIX_SOURCE)) && !defined(MA_BSD)\nint fileno(FILE *stream);\n#endif\n\nstatic ma_result ma_default_vfs_info__stdio(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo)\n{\n    int fd;\n    struct stat info;\n\n    MA_ASSERT(file  != NULL);\n    MA_ASSERT(pInfo != NULL);\n\n    (void)pVFS;\n\n#if defined(_MSC_VER)\n    fd = _fileno((FILE*)file);\n#else\n    fd =  fileno((FILE*)file);\n#endif\n\n    if (fstat(fd, &info) != 0) {\n        return ma_result_from_errno(errno);\n    }\n\n    pInfo->sizeInBytes = info.st_size;\n\n    return MA_SUCCESS;\n}\n#endif\n\n\nstatic ma_result ma_default_vfs_open(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile)\n{\n    if (pFile == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pFile = NULL;\n\n    if (pFilePath == NULL || openMode == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_USE_WIN32_FILEIO)\n    return ma_default_vfs_open__win32(pVFS, pFilePath, openMode, pFile);\n#else\n    return ma_default_vfs_open__stdio(pVFS, pFilePath, openMode, pFile);\n#endif\n}\n\nstatic ma_result ma_default_vfs_open_w(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile)\n{\n    if (pFile == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pFile = NULL;\n\n    if (pFilePath == NULL || openMode == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_USE_WIN32_FILEIO)\n    return ma_default_vfs_open_w__win32(pVFS, pFilePath, openMode, pFile);\n#else\n    return ma_default_vfs_open_w__stdio(pVFS, pFilePath, openMode, pFile);\n#endif\n}\n\nstatic ma_result ma_default_vfs_close(ma_vfs* pVFS, ma_vfs_file file)\n{\n    if (file == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_USE_WIN32_FILEIO)\n    return ma_default_vfs_close__win32(pVFS, file);\n#else\n    return ma_default_vfs_close__stdio(pVFS, file);\n#endif\n}\n\nstatic ma_result ma_default_vfs_read(ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead)\n{\n    if (pBytesRead != NULL) {\n        *pBytesRead = 0;\n    }\n\n    if (file == NULL || pDst == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_USE_WIN32_FILEIO)\n    return ma_default_vfs_read__win32(pVFS, file, pDst, sizeInBytes, pBytesRead);\n#else\n    return ma_default_vfs_read__stdio(pVFS, file, pDst, sizeInBytes, pBytesRead);\n#endif\n}\n\nstatic ma_result ma_default_vfs_write(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten)\n{\n    if (pBytesWritten != NULL) {\n        *pBytesWritten = 0;\n    }\n\n    if (file == NULL || pSrc == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_USE_WIN32_FILEIO)\n    return ma_default_vfs_write__win32(pVFS, file, pSrc, sizeInBytes, pBytesWritten);\n#else\n    return ma_default_vfs_write__stdio(pVFS, file, pSrc, sizeInBytes, pBytesWritten);\n#endif\n}\n\nstatic ma_result ma_default_vfs_seek(ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin)\n{\n    if (file == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_USE_WIN32_FILEIO)\n    return ma_default_vfs_seek__win32(pVFS, file, offset, origin);\n#else\n    return ma_default_vfs_seek__stdio(pVFS, file, offset, origin);\n#endif\n}\n\nstatic ma_result ma_default_vfs_tell(ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor)\n{\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;\n\n    if (file == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_USE_WIN32_FILEIO)\n    return ma_default_vfs_tell__win32(pVFS, file, pCursor);\n#else\n    return ma_default_vfs_tell__stdio(pVFS, file, pCursor);\n#endif\n}\n\nstatic ma_result ma_default_vfs_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo)\n{\n    if (pInfo == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pInfo);\n\n    if (file == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n#if defined(MA_USE_WIN32_FILEIO)\n    return ma_default_vfs_info__win32(pVFS, file, pInfo);\n#else\n    return ma_default_vfs_info__stdio(pVFS, file, pInfo);\n#endif\n}\n\n\nMA_API ma_result ma_default_vfs_init(ma_default_vfs* pVFS, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pVFS == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pVFS->cb.onOpen  = ma_default_vfs_open;\n    pVFS->cb.onOpenW = ma_default_vfs_open_w;\n    pVFS->cb.onClose = ma_default_vfs_close;\n    pVFS->cb.onRead  = ma_default_vfs_read;\n    pVFS->cb.onWrite = ma_default_vfs_write;\n    pVFS->cb.onSeek  = ma_default_vfs_seek;\n    pVFS->cb.onTell  = ma_default_vfs_tell;\n    pVFS->cb.onInfo  = ma_default_vfs_info;\n    ma_allocation_callbacks_init_copy(&pVFS->allocationCallbacks, pAllocationCallbacks);\n\n    return MA_SUCCESS;\n}\n\n\nMA_API ma_result ma_vfs_or_default_open(ma_vfs* pVFS, const char* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile)\n{\n    if (pVFS != NULL) {\n        return ma_vfs_open(pVFS, pFilePath, openMode, pFile);\n    } else {\n        return ma_default_vfs_open(pVFS, pFilePath, openMode, pFile);\n    }\n}\n\nMA_API ma_result ma_vfs_or_default_open_w(ma_vfs* pVFS, const wchar_t* pFilePath, ma_uint32 openMode, ma_vfs_file* pFile)\n{\n    if (pVFS != NULL) {\n        return ma_vfs_open_w(pVFS, pFilePath, openMode, pFile);\n    } else {\n        return ma_default_vfs_open_w(pVFS, pFilePath, openMode, pFile);\n    }\n}\n\nMA_API ma_result ma_vfs_or_default_close(ma_vfs* pVFS, ma_vfs_file file)\n{\n    if (pVFS != NULL) {\n        return ma_vfs_close(pVFS, file);\n    } else {\n        return ma_default_vfs_close(pVFS, file);\n    }\n}\n\nMA_API ma_result ma_vfs_or_default_read(ma_vfs* pVFS, ma_vfs_file file, void* pDst, size_t sizeInBytes, size_t* pBytesRead)\n{\n    if (pVFS != NULL) {\n        return ma_vfs_read(pVFS, file, pDst, sizeInBytes, pBytesRead);\n    } else {\n        return ma_default_vfs_read(pVFS, file, pDst, sizeInBytes, pBytesRead);\n    }\n}\n\nMA_API ma_result ma_vfs_or_default_write(ma_vfs* pVFS, ma_vfs_file file, const void* pSrc, size_t sizeInBytes, size_t* pBytesWritten)\n{\n    if (pVFS != NULL) {\n        return ma_vfs_write(pVFS, file, pSrc, sizeInBytes, pBytesWritten);\n    } else {\n        return ma_default_vfs_write(pVFS, file, pSrc, sizeInBytes, pBytesWritten);\n    }\n}\n\nMA_API ma_result ma_vfs_or_default_seek(ma_vfs* pVFS, ma_vfs_file file, ma_int64 offset, ma_seek_origin origin)\n{\n    if (pVFS != NULL) {\n        return ma_vfs_seek(pVFS, file, offset, origin);\n    } else {\n        return ma_default_vfs_seek(pVFS, file, offset, origin);\n    }\n}\n\nMA_API ma_result ma_vfs_or_default_tell(ma_vfs* pVFS, ma_vfs_file file, ma_int64* pCursor)\n{\n    if (pVFS != NULL) {\n        return ma_vfs_tell(pVFS, file, pCursor);\n    } else {\n        return ma_default_vfs_tell(pVFS, file, pCursor);\n    }\n}\n\nMA_API ma_result ma_vfs_or_default_info(ma_vfs* pVFS, ma_vfs_file file, ma_file_info* pInfo)\n{\n    if (pVFS != NULL) {\n        return ma_vfs_info(pVFS, file, pInfo);\n    } else {\n        return ma_default_vfs_info(pVFS, file, pInfo);\n    }\n}\n\n\n\nstatic ma_result ma_vfs_open_and_read_file_ex(ma_vfs* pVFS, const char* pFilePath, const wchar_t* pFilePathW, void** ppData, size_t* pSize, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_result result;\n    ma_vfs_file file;\n    ma_file_info info;\n    void* pData;\n    size_t bytesRead;\n\n    if (ppData != NULL) {\n        *ppData = NULL;\n    }\n    if (pSize != NULL) {\n        *pSize = 0;\n    }\n\n    if (ppData == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pFilePath != NULL) {\n        result = ma_vfs_or_default_open(pVFS, pFilePath, MA_OPEN_MODE_READ, &file);\n    } else {\n        result = ma_vfs_or_default_open_w(pVFS, pFilePathW, MA_OPEN_MODE_READ, &file);\n    }\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = ma_vfs_or_default_info(pVFS, file, &info);\n    if (result != MA_SUCCESS) {\n        ma_vfs_or_default_close(pVFS, file);\n        return result;\n    }\n\n    if (info.sizeInBytes > MA_SIZE_MAX) {\n        ma_vfs_or_default_close(pVFS, file);\n        return MA_TOO_BIG;\n    }\n\n    pData = ma_malloc((size_t)info.sizeInBytes, pAllocationCallbacks);  /* Safe cast. */\n    if (pData == NULL) {\n        ma_vfs_or_default_close(pVFS, file);\n        return result;\n    }\n\n    result = ma_vfs_or_default_read(pVFS, file, pData, (size_t)info.sizeInBytes, &bytesRead);  /* Safe cast. */\n    ma_vfs_or_default_close(pVFS, file);\n\n    if (result != MA_SUCCESS) {\n        ma_free(pData, pAllocationCallbacks);\n        return result;\n    }\n\n    if (pSize != NULL) {\n        *pSize = bytesRead;\n    }\n\n    MA_ASSERT(ppData != NULL);\n    *ppData = pData;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_vfs_open_and_read_file(ma_vfs* pVFS, const char* pFilePath, void** ppData, size_t* pSize, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_vfs_open_and_read_file_ex(pVFS, pFilePath, NULL, ppData, pSize, pAllocationCallbacks);\n}\n\nMA_API ma_result ma_vfs_open_and_read_file_w(ma_vfs* pVFS, const wchar_t* pFilePath, void** ppData, size_t* pSize, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_vfs_open_and_read_file_ex(pVFS, NULL, pFilePath, ppData, pSize, pAllocationCallbacks);\n}\n\n\n\n/**************************************************************************************************************************************************************\n\nDecoding and Encoding Headers. These are auto-generated from a tool.\n\n**************************************************************************************************************************************************************/\n#if !defined(MA_NO_WAV) && (!defined(MA_NO_DECODING) || !defined(MA_NO_ENCODING))\n/* dr_wav_h begin */\n#ifndef ma_dr_wav_h\n#define ma_dr_wav_h\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#define MA_DR_WAV_STRINGIFY(x)      #x\n#define MA_DR_WAV_XSTRINGIFY(x)     MA_DR_WAV_STRINGIFY(x)\n#define MA_DR_WAV_VERSION_MAJOR     0\n#define MA_DR_WAV_VERSION_MINOR     13\n#define MA_DR_WAV_VERSION_REVISION  13\n#define MA_DR_WAV_VERSION_STRING    MA_DR_WAV_XSTRINGIFY(MA_DR_WAV_VERSION_MAJOR) \".\" MA_DR_WAV_XSTRINGIFY(MA_DR_WAV_VERSION_MINOR) \".\" MA_DR_WAV_XSTRINGIFY(MA_DR_WAV_VERSION_REVISION)\n#include <stddef.h>\n#define MA_DR_WAVE_FORMAT_PCM          0x1\n#define MA_DR_WAVE_FORMAT_ADPCM        0x2\n#define MA_DR_WAVE_FORMAT_IEEE_FLOAT   0x3\n#define MA_DR_WAVE_FORMAT_ALAW         0x6\n#define MA_DR_WAVE_FORMAT_MULAW        0x7\n#define MA_DR_WAVE_FORMAT_DVI_ADPCM    0x11\n#define MA_DR_WAVE_FORMAT_EXTENSIBLE   0xFFFE\n#define MA_DR_WAV_SEQUENTIAL            0x00000001\n#define MA_DR_WAV_WITH_METADATA         0x00000002\nMA_API void ma_dr_wav_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* pRevision);\nMA_API const char* ma_dr_wav_version_string(void);\ntypedef enum\n{\n    ma_dr_wav_seek_origin_start,\n    ma_dr_wav_seek_origin_current\n} ma_dr_wav_seek_origin;\ntypedef enum\n{\n    ma_dr_wav_container_riff,\n    ma_dr_wav_container_rifx,\n    ma_dr_wav_container_w64,\n    ma_dr_wav_container_rf64,\n    ma_dr_wav_container_aiff\n} ma_dr_wav_container;\ntypedef struct\n{\n    union\n    {\n        ma_uint8 fourcc[4];\n        ma_uint8 guid[16];\n    } id;\n    ma_uint64 sizeInBytes;\n    unsigned int paddingSize;\n} ma_dr_wav_chunk_header;\ntypedef struct\n{\n    ma_uint16 formatTag;\n    ma_uint16 channels;\n    ma_uint32 sampleRate;\n    ma_uint32 avgBytesPerSec;\n    ma_uint16 blockAlign;\n    ma_uint16 bitsPerSample;\n    ma_uint16 extendedSize;\n    ma_uint16 validBitsPerSample;\n    ma_uint32 channelMask;\n    ma_uint8 subFormat[16];\n} ma_dr_wav_fmt;\nMA_API ma_uint16 ma_dr_wav_fmt_get_format(const ma_dr_wav_fmt* pFMT);\ntypedef size_t (* ma_dr_wav_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead);\ntypedef size_t (* ma_dr_wav_write_proc)(void* pUserData, const void* pData, size_t bytesToWrite);\ntypedef ma_bool32 (* ma_dr_wav_seek_proc)(void* pUserData, int offset, ma_dr_wav_seek_origin origin);\ntypedef ma_uint64 (* ma_dr_wav_chunk_proc)(void* pChunkUserData, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pReadSeekUserData, const ma_dr_wav_chunk_header* pChunkHeader, ma_dr_wav_container container, const ma_dr_wav_fmt* pFMT);\ntypedef struct\n{\n    const ma_uint8* data;\n    size_t dataSize;\n    size_t currentReadPos;\n} ma_dr_wav__memory_stream;\ntypedef struct\n{\n    void** ppData;\n    size_t* pDataSize;\n    size_t dataSize;\n    size_t dataCapacity;\n    size_t currentWritePos;\n} ma_dr_wav__memory_stream_write;\ntypedef struct\n{\n    ma_dr_wav_container container;\n    ma_uint32 format;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_uint32 bitsPerSample;\n} ma_dr_wav_data_format;\ntypedef enum\n{\n    ma_dr_wav_metadata_type_none                        = 0,\n    ma_dr_wav_metadata_type_unknown                     = 1 << 0,\n    ma_dr_wav_metadata_type_smpl                        = 1 << 1,\n    ma_dr_wav_metadata_type_inst                        = 1 << 2,\n    ma_dr_wav_metadata_type_cue                         = 1 << 3,\n    ma_dr_wav_metadata_type_acid                        = 1 << 4,\n    ma_dr_wav_metadata_type_bext                        = 1 << 5,\n    ma_dr_wav_metadata_type_list_label                  = 1 << 6,\n    ma_dr_wav_metadata_type_list_note                   = 1 << 7,\n    ma_dr_wav_metadata_type_list_labelled_cue_region    = 1 << 8,\n    ma_dr_wav_metadata_type_list_info_software          = 1 << 9,\n    ma_dr_wav_metadata_type_list_info_copyright         = 1 << 10,\n    ma_dr_wav_metadata_type_list_info_title             = 1 << 11,\n    ma_dr_wav_metadata_type_list_info_artist            = 1 << 12,\n    ma_dr_wav_metadata_type_list_info_comment           = 1 << 13,\n    ma_dr_wav_metadata_type_list_info_date              = 1 << 14,\n    ma_dr_wav_metadata_type_list_info_genre             = 1 << 15,\n    ma_dr_wav_metadata_type_list_info_album             = 1 << 16,\n    ma_dr_wav_metadata_type_list_info_tracknumber       = 1 << 17,\n    ma_dr_wav_metadata_type_list_all_info_strings       = ma_dr_wav_metadata_type_list_info_software\n                                                    | ma_dr_wav_metadata_type_list_info_copyright\n                                                    | ma_dr_wav_metadata_type_list_info_title\n                                                    | ma_dr_wav_metadata_type_list_info_artist\n                                                    | ma_dr_wav_metadata_type_list_info_comment\n                                                    | ma_dr_wav_metadata_type_list_info_date\n                                                    | ma_dr_wav_metadata_type_list_info_genre\n                                                    | ma_dr_wav_metadata_type_list_info_album\n                                                    | ma_dr_wav_metadata_type_list_info_tracknumber,\n    ma_dr_wav_metadata_type_list_all_adtl               = ma_dr_wav_metadata_type_list_label\n                                                    | ma_dr_wav_metadata_type_list_note\n                                                    | ma_dr_wav_metadata_type_list_labelled_cue_region,\n    ma_dr_wav_metadata_type_all                         = -2,\n    ma_dr_wav_metadata_type_all_including_unknown       = -1\n} ma_dr_wav_metadata_type;\ntypedef enum\n{\n    ma_dr_wav_smpl_loop_type_forward  = 0,\n    ma_dr_wav_smpl_loop_type_pingpong = 1,\n    ma_dr_wav_smpl_loop_type_backward = 2\n} ma_dr_wav_smpl_loop_type;\ntypedef struct\n{\n    ma_uint32 cuePointId;\n    ma_uint32 type;\n    ma_uint32 firstSampleByteOffset;\n    ma_uint32 lastSampleByteOffset;\n    ma_uint32 sampleFraction;\n    ma_uint32 playCount;\n} ma_dr_wav_smpl_loop;\ntypedef struct\n{\n    ma_uint32 manufacturerId;\n    ma_uint32 productId;\n    ma_uint32 samplePeriodNanoseconds;\n    ma_uint32 midiUnityNote;\n    ma_uint32 midiPitchFraction;\n    ma_uint32 smpteFormat;\n    ma_uint32 smpteOffset;\n    ma_uint32 sampleLoopCount;\n    ma_uint32 samplerSpecificDataSizeInBytes;\n    ma_dr_wav_smpl_loop* pLoops;\n    ma_uint8* pSamplerSpecificData;\n} ma_dr_wav_smpl;\ntypedef struct\n{\n    ma_int8 midiUnityNote;\n    ma_int8 fineTuneCents;\n    ma_int8 gainDecibels;\n    ma_int8 lowNote;\n    ma_int8 highNote;\n    ma_int8 lowVelocity;\n    ma_int8 highVelocity;\n} ma_dr_wav_inst;\ntypedef struct\n{\n    ma_uint32 id;\n    ma_uint32 playOrderPosition;\n    ma_uint8 dataChunkId[4];\n    ma_uint32 chunkStart;\n    ma_uint32 blockStart;\n    ma_uint32 sampleByteOffset;\n} ma_dr_wav_cue_point;\ntypedef struct\n{\n    ma_uint32 cuePointCount;\n    ma_dr_wav_cue_point *pCuePoints;\n} ma_dr_wav_cue;\ntypedef enum\n{\n    ma_dr_wav_acid_flag_one_shot      = 1,\n    ma_dr_wav_acid_flag_root_note_set = 2,\n    ma_dr_wav_acid_flag_stretch       = 4,\n    ma_dr_wav_acid_flag_disk_based    = 8,\n    ma_dr_wav_acid_flag_acidizer      = 16\n} ma_dr_wav_acid_flag;\ntypedef struct\n{\n    ma_uint32 flags;\n    ma_uint16 midiUnityNote;\n    ma_uint16 reserved1;\n    float reserved2;\n    ma_uint32 numBeats;\n    ma_uint16 meterDenominator;\n    ma_uint16 meterNumerator;\n    float tempo;\n} ma_dr_wav_acid;\ntypedef struct\n{\n    ma_uint32 cuePointId;\n    ma_uint32 stringLength;\n    char* pString;\n} ma_dr_wav_list_label_or_note;\ntypedef struct\n{\n    char* pDescription;\n    char* pOriginatorName;\n    char* pOriginatorReference;\n    char  pOriginationDate[10];\n    char  pOriginationTime[8];\n    ma_uint64 timeReference;\n    ma_uint16 version;\n    char* pCodingHistory;\n    ma_uint32 codingHistorySize;\n    ma_uint8* pUMID;\n    ma_uint16 loudnessValue;\n    ma_uint16 loudnessRange;\n    ma_uint16 maxTruePeakLevel;\n    ma_uint16 maxMomentaryLoudness;\n    ma_uint16 maxShortTermLoudness;\n} ma_dr_wav_bext;\ntypedef struct\n{\n    ma_uint32 stringLength;\n    char* pString;\n} ma_dr_wav_list_info_text;\ntypedef struct\n{\n    ma_uint32 cuePointId;\n    ma_uint32 sampleLength;\n    ma_uint8 purposeId[4];\n    ma_uint16 country;\n    ma_uint16 language;\n    ma_uint16 dialect;\n    ma_uint16 codePage;\n    ma_uint32 stringLength;\n    char* pString;\n} ma_dr_wav_list_labelled_cue_region;\ntypedef enum\n{\n    ma_dr_wav_metadata_location_invalid,\n    ma_dr_wav_metadata_location_top_level,\n    ma_dr_wav_metadata_location_inside_info_list,\n    ma_dr_wav_metadata_location_inside_adtl_list\n} ma_dr_wav_metadata_location;\ntypedef struct\n{\n    ma_uint8 id[4];\n    ma_dr_wav_metadata_location chunkLocation;\n    ma_uint32 dataSizeInBytes;\n    ma_uint8* pData;\n} ma_dr_wav_unknown_metadata;\ntypedef struct\n{\n    ma_dr_wav_metadata_type type;\n    union\n    {\n        ma_dr_wav_cue cue;\n        ma_dr_wav_smpl smpl;\n        ma_dr_wav_acid acid;\n        ma_dr_wav_inst inst;\n        ma_dr_wav_bext bext;\n        ma_dr_wav_list_label_or_note labelOrNote;\n        ma_dr_wav_list_labelled_cue_region labelledCueRegion;\n        ma_dr_wav_list_info_text infoText;\n        ma_dr_wav_unknown_metadata unknown;\n    } data;\n} ma_dr_wav_metadata;\ntypedef struct\n{\n    ma_dr_wav_read_proc onRead;\n    ma_dr_wav_write_proc onWrite;\n    ma_dr_wav_seek_proc onSeek;\n    void* pUserData;\n    ma_allocation_callbacks allocationCallbacks;\n    ma_dr_wav_container container;\n    ma_dr_wav_fmt fmt;\n    ma_uint32 sampleRate;\n    ma_uint16 channels;\n    ma_uint16 bitsPerSample;\n    ma_uint16 translatedFormatTag;\n    ma_uint64 totalPCMFrameCount;\n    ma_uint64 dataChunkDataSize;\n    ma_uint64 dataChunkDataPos;\n    ma_uint64 bytesRemaining;\n    ma_uint64 readCursorInPCMFrames;\n    ma_uint64 dataChunkDataSizeTargetWrite;\n    ma_bool32 isSequentialWrite;\n    ma_dr_wav_metadata* pMetadata;\n    ma_uint32 metadataCount;\n    ma_dr_wav__memory_stream memoryStream;\n    ma_dr_wav__memory_stream_write memoryStreamWrite;\n    struct\n    {\n        ma_uint32 bytesRemainingInBlock;\n        ma_uint16 predictor[2];\n        ma_int32  delta[2];\n        ma_int32  cachedFrames[4];\n        ma_uint32 cachedFrameCount;\n        ma_int32  prevFrames[2][2];\n    } msadpcm;\n    struct\n    {\n        ma_uint32 bytesRemainingInBlock;\n        ma_int32  predictor[2];\n        ma_int32  stepIndex[2];\n        ma_int32  cachedFrames[16];\n        ma_uint32 cachedFrameCount;\n    } ima;\n    struct\n    {\n        ma_bool8 isLE;\n        ma_bool8 isUnsigned;\n    } aiff;\n} ma_dr_wav;\nMA_API ma_bool32 ma_dr_wav_init(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_ex(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_chunk_proc onChunk, void* pReadSeekUserData, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_with_metadata(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_write(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_dr_wav_write_proc onWrite, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_write_sequential(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, ma_dr_wav_write_proc onWrite, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_write_sequential_pcm_frames(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, ma_dr_wav_write_proc onWrite, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_write_with_metadata(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_dr_wav_write_proc onWrite, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks, ma_dr_wav_metadata* pMetadata, ma_uint32 metadataCount);\nMA_API ma_uint64 ma_dr_wav_target_write_size_bytes(const ma_dr_wav_data_format* pFormat, ma_uint64 totalFrameCount, ma_dr_wav_metadata* pMetadata, ma_uint32 metadataCount);\nMA_API ma_dr_wav_metadata* ma_dr_wav_take_ownership_of_metadata(ma_dr_wav* pWav);\nMA_API ma_result ma_dr_wav_uninit(ma_dr_wav* pWav);\nMA_API size_t ma_dr_wav_read_raw(ma_dr_wav* pWav, size_t bytesToRead, void* pBufferOut);\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames(ma_dr_wav* pWav, ma_uint64 framesToRead, void* pBufferOut);\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_le(ma_dr_wav* pWav, ma_uint64 framesToRead, void* pBufferOut);\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_be(ma_dr_wav* pWav, ma_uint64 framesToRead, void* pBufferOut);\nMA_API ma_bool32 ma_dr_wav_seek_to_pcm_frame(ma_dr_wav* pWav, ma_uint64 targetFrameIndex);\nMA_API ma_result ma_dr_wav_get_cursor_in_pcm_frames(ma_dr_wav* pWav, ma_uint64* pCursor);\nMA_API ma_result ma_dr_wav_get_length_in_pcm_frames(ma_dr_wav* pWav, ma_uint64* pLength);\nMA_API size_t ma_dr_wav_write_raw(ma_dr_wav* pWav, size_t bytesToWrite, const void* pData);\nMA_API ma_uint64 ma_dr_wav_write_pcm_frames(ma_dr_wav* pWav, ma_uint64 framesToWrite, const void* pData);\nMA_API ma_uint64 ma_dr_wav_write_pcm_frames_le(ma_dr_wav* pWav, ma_uint64 framesToWrite, const void* pData);\nMA_API ma_uint64 ma_dr_wav_write_pcm_frames_be(ma_dr_wav* pWav, ma_uint64 framesToWrite, const void* pData);\n#ifndef MA_DR_WAV_NO_CONVERSION_API\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_s16(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int16* pBufferOut);\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_s16le(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int16* pBufferOut);\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_s16be(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int16* pBufferOut);\nMA_API void ma_dr_wav_u8_to_s16(ma_int16* pOut, const ma_uint8* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_s24_to_s16(ma_int16* pOut, const ma_uint8* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_s32_to_s16(ma_int16* pOut, const ma_int32* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_f32_to_s16(ma_int16* pOut, const float* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_f64_to_s16(ma_int16* pOut, const double* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_alaw_to_s16(ma_int16* pOut, const ma_uint8* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_mulaw_to_s16(ma_int16* pOut, const ma_uint8* pIn, size_t sampleCount);\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_f32(ma_dr_wav* pWav, ma_uint64 framesToRead, float* pBufferOut);\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_f32le(ma_dr_wav* pWav, ma_uint64 framesToRead, float* pBufferOut);\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_f32be(ma_dr_wav* pWav, ma_uint64 framesToRead, float* pBufferOut);\nMA_API void ma_dr_wav_u8_to_f32(float* pOut, const ma_uint8* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_s16_to_f32(float* pOut, const ma_int16* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_s24_to_f32(float* pOut, const ma_uint8* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_s32_to_f32(float* pOut, const ma_int32* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_f64_to_f32(float* pOut, const double* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_alaw_to_f32(float* pOut, const ma_uint8* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_mulaw_to_f32(float* pOut, const ma_uint8* pIn, size_t sampleCount);\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_s32(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int32* pBufferOut);\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_s32le(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int32* pBufferOut);\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_s32be(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int32* pBufferOut);\nMA_API void ma_dr_wav_u8_to_s32(ma_int32* pOut, const ma_uint8* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_s16_to_s32(ma_int32* pOut, const ma_int16* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_s24_to_s32(ma_int32* pOut, const ma_uint8* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_f32_to_s32(ma_int32* pOut, const float* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_f64_to_s32(ma_int32* pOut, const double* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_alaw_to_s32(ma_int32* pOut, const ma_uint8* pIn, size_t sampleCount);\nMA_API void ma_dr_wav_mulaw_to_s32(ma_int32* pOut, const ma_uint8* pIn, size_t sampleCount);\n#endif\n#ifndef MA_DR_WAV_NO_STDIO\nMA_API ma_bool32 ma_dr_wav_init_file(ma_dr_wav* pWav, const char* filename, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_file_ex(ma_dr_wav* pWav, const char* filename, ma_dr_wav_chunk_proc onChunk, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_file_w(ma_dr_wav* pWav, const wchar_t* filename, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_file_ex_w(ma_dr_wav* pWav, const wchar_t* filename, ma_dr_wav_chunk_proc onChunk, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_file_with_metadata(ma_dr_wav* pWav, const char* filename, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_file_with_metadata_w(ma_dr_wav* pWav, const wchar_t* filename, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_file_write(ma_dr_wav* pWav, const char* filename, const ma_dr_wav_data_format* pFormat, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_file_write_sequential(ma_dr_wav* pWav, const char* filename, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_file_write_sequential_pcm_frames(ma_dr_wav* pWav, const char* filename, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_file_write_w(ma_dr_wav* pWav, const wchar_t* filename, const ma_dr_wav_data_format* pFormat, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_file_write_sequential_w(ma_dr_wav* pWav, const wchar_t* filename, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_file_write_sequential_pcm_frames_w(ma_dr_wav* pWav, const wchar_t* filename, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\n#endif\nMA_API ma_bool32 ma_dr_wav_init_memory(ma_dr_wav* pWav, const void* data, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_memory_ex(ma_dr_wav* pWav, const void* data, size_t dataSize, ma_dr_wav_chunk_proc onChunk, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_memory_with_metadata(ma_dr_wav* pWav, const void* data, size_t dataSize, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_memory_write(ma_dr_wav* pWav, void** ppData, size_t* pDataSize, const ma_dr_wav_data_format* pFormat, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_memory_write_sequential(ma_dr_wav* pWav, void** ppData, size_t* pDataSize, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_wav_init_memory_write_sequential_pcm_frames(ma_dr_wav* pWav, void** ppData, size_t* pDataSize, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\n#ifndef MA_DR_WAV_NO_CONVERSION_API\nMA_API ma_int16* ma_dr_wav_open_and_read_pcm_frames_s16(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_int32* ma_dr_wav_open_and_read_pcm_frames_s32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);\n#ifndef MA_DR_WAV_NO_STDIO\nMA_API ma_int16* ma_dr_wav_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API float* ma_dr_wav_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_int32* ma_dr_wav_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_int16* ma_dr_wav_open_file_and_read_pcm_frames_s16_w(const wchar_t* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API float* ma_dr_wav_open_file_and_read_pcm_frames_f32_w(const wchar_t* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_int32* ma_dr_wav_open_file_and_read_pcm_frames_s32_w(const wchar_t* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);\n#endif\nMA_API ma_int16* ma_dr_wav_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API float* ma_dr_wav_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_int32* ma_dr_wav_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks);\n#endif\nMA_API void ma_dr_wav_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_uint16 ma_dr_wav_bytes_to_u16(const ma_uint8* data);\nMA_API ma_int16 ma_dr_wav_bytes_to_s16(const ma_uint8* data);\nMA_API ma_uint32 ma_dr_wav_bytes_to_u32(const ma_uint8* data);\nMA_API ma_int32 ma_dr_wav_bytes_to_s32(const ma_uint8* data);\nMA_API ma_uint64 ma_dr_wav_bytes_to_u64(const ma_uint8* data);\nMA_API ma_int64 ma_dr_wav_bytes_to_s64(const ma_uint8* data);\nMA_API float ma_dr_wav_bytes_to_f32(const ma_uint8* data);\nMA_API ma_bool32 ma_dr_wav_guid_equal(const ma_uint8 a[16], const ma_uint8 b[16]);\nMA_API ma_bool32 ma_dr_wav_fourcc_equal(const ma_uint8* a, const char* b);\n#ifdef __cplusplus\n}\n#endif\n#endif\n/* dr_wav_h end */\n#endif  /* MA_NO_WAV */\n\n#if !defined(MA_NO_FLAC) && !defined(MA_NO_DECODING)\n/* dr_flac_h begin */\n#ifndef ma_dr_flac_h\n#define ma_dr_flac_h\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#define MA_DR_FLAC_STRINGIFY(x)      #x\n#define MA_DR_FLAC_XSTRINGIFY(x)     MA_DR_FLAC_STRINGIFY(x)\n#define MA_DR_FLAC_VERSION_MAJOR     0\n#define MA_DR_FLAC_VERSION_MINOR     12\n#define MA_DR_FLAC_VERSION_REVISION  42\n#define MA_DR_FLAC_VERSION_STRING    MA_DR_FLAC_XSTRINGIFY(MA_DR_FLAC_VERSION_MAJOR) \".\" MA_DR_FLAC_XSTRINGIFY(MA_DR_FLAC_VERSION_MINOR) \".\" MA_DR_FLAC_XSTRINGIFY(MA_DR_FLAC_VERSION_REVISION)\n#include <stddef.h>\n#if defined(_MSC_VER) && _MSC_VER >= 1700\n    #define MA_DR_FLAC_DEPRECATED       __declspec(deprecated)\n#elif (defined(__GNUC__) && __GNUC__ >= 4)\n    #define MA_DR_FLAC_DEPRECATED       __attribute__((deprecated))\n#elif defined(__has_feature)\n    #if __has_feature(attribute_deprecated)\n        #define MA_DR_FLAC_DEPRECATED   __attribute__((deprecated))\n    #else\n        #define MA_DR_FLAC_DEPRECATED\n    #endif\n#else\n    #define MA_DR_FLAC_DEPRECATED\n#endif\nMA_API void ma_dr_flac_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* pRevision);\nMA_API const char* ma_dr_flac_version_string(void);\n#ifndef MA_DR_FLAC_BUFFER_SIZE\n#define MA_DR_FLAC_BUFFER_SIZE   4096\n#endif\n#ifdef MA_64BIT\ntypedef ma_uint64 ma_dr_flac_cache_t;\n#else\ntypedef ma_uint32 ma_dr_flac_cache_t;\n#endif\n#define MA_DR_FLAC_METADATA_BLOCK_TYPE_STREAMINFO       0\n#define MA_DR_FLAC_METADATA_BLOCK_TYPE_PADDING          1\n#define MA_DR_FLAC_METADATA_BLOCK_TYPE_APPLICATION      2\n#define MA_DR_FLAC_METADATA_BLOCK_TYPE_SEEKTABLE        3\n#define MA_DR_FLAC_METADATA_BLOCK_TYPE_VORBIS_COMMENT   4\n#define MA_DR_FLAC_METADATA_BLOCK_TYPE_CUESHEET         5\n#define MA_DR_FLAC_METADATA_BLOCK_TYPE_PICTURE          6\n#define MA_DR_FLAC_METADATA_BLOCK_TYPE_INVALID          127\n#define MA_DR_FLAC_PICTURE_TYPE_OTHER                   0\n#define MA_DR_FLAC_PICTURE_TYPE_FILE_ICON               1\n#define MA_DR_FLAC_PICTURE_TYPE_OTHER_FILE_ICON         2\n#define MA_DR_FLAC_PICTURE_TYPE_COVER_FRONT             3\n#define MA_DR_FLAC_PICTURE_TYPE_COVER_BACK              4\n#define MA_DR_FLAC_PICTURE_TYPE_LEAFLET_PAGE            5\n#define MA_DR_FLAC_PICTURE_TYPE_MEDIA                   6\n#define MA_DR_FLAC_PICTURE_TYPE_LEAD_ARTIST             7\n#define MA_DR_FLAC_PICTURE_TYPE_ARTIST                  8\n#define MA_DR_FLAC_PICTURE_TYPE_CONDUCTOR               9\n#define MA_DR_FLAC_PICTURE_TYPE_BAND                    10\n#define MA_DR_FLAC_PICTURE_TYPE_COMPOSER                11\n#define MA_DR_FLAC_PICTURE_TYPE_LYRICIST                12\n#define MA_DR_FLAC_PICTURE_TYPE_RECORDING_LOCATION      13\n#define MA_DR_FLAC_PICTURE_TYPE_DURING_RECORDING        14\n#define MA_DR_FLAC_PICTURE_TYPE_DURING_PERFORMANCE      15\n#define MA_DR_FLAC_PICTURE_TYPE_SCREEN_CAPTURE          16\n#define MA_DR_FLAC_PICTURE_TYPE_BRIGHT_COLORED_FISH     17\n#define MA_DR_FLAC_PICTURE_TYPE_ILLUSTRATION            18\n#define MA_DR_FLAC_PICTURE_TYPE_BAND_LOGOTYPE           19\n#define MA_DR_FLAC_PICTURE_TYPE_PUBLISHER_LOGOTYPE      20\ntypedef enum\n{\n    ma_dr_flac_container_native,\n    ma_dr_flac_container_ogg,\n    ma_dr_flac_container_unknown\n} ma_dr_flac_container;\ntypedef enum\n{\n    ma_dr_flac_seek_origin_start,\n    ma_dr_flac_seek_origin_current\n} ma_dr_flac_seek_origin;\ntypedef struct\n{\n    ma_uint64 firstPCMFrame;\n    ma_uint64 flacFrameOffset;\n    ma_uint16 pcmFrameCount;\n} ma_dr_flac_seekpoint;\ntypedef struct\n{\n    ma_uint16 minBlockSizeInPCMFrames;\n    ma_uint16 maxBlockSizeInPCMFrames;\n    ma_uint32 minFrameSizeInPCMFrames;\n    ma_uint32 maxFrameSizeInPCMFrames;\n    ma_uint32 sampleRate;\n    ma_uint8  channels;\n    ma_uint8  bitsPerSample;\n    ma_uint64 totalPCMFrameCount;\n    ma_uint8  md5[16];\n} ma_dr_flac_streaminfo;\ntypedef struct\n{\n    ma_uint32 type;\n    const void* pRawData;\n    ma_uint32 rawDataSize;\n    union\n    {\n        ma_dr_flac_streaminfo streaminfo;\n        struct\n        {\n            int unused;\n        } padding;\n        struct\n        {\n            ma_uint32 id;\n            const void* pData;\n            ma_uint32 dataSize;\n        } application;\n        struct\n        {\n            ma_uint32 seekpointCount;\n            const ma_dr_flac_seekpoint* pSeekpoints;\n        } seektable;\n        struct\n        {\n            ma_uint32 vendorLength;\n            const char* vendor;\n            ma_uint32 commentCount;\n            const void* pComments;\n        } vorbis_comment;\n        struct\n        {\n            char catalog[128];\n            ma_uint64 leadInSampleCount;\n            ma_bool32 isCD;\n            ma_uint8 trackCount;\n            const void* pTrackData;\n        } cuesheet;\n        struct\n        {\n            ma_uint32 type;\n            ma_uint32 mimeLength;\n            const char* mime;\n            ma_uint32 descriptionLength;\n            const char* description;\n            ma_uint32 width;\n            ma_uint32 height;\n            ma_uint32 colorDepth;\n            ma_uint32 indexColorCount;\n            ma_uint32 pictureDataSize;\n            const ma_uint8* pPictureData;\n        } picture;\n    } data;\n} ma_dr_flac_metadata;\ntypedef size_t (* ma_dr_flac_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead);\ntypedef ma_bool32 (* ma_dr_flac_seek_proc)(void* pUserData, int offset, ma_dr_flac_seek_origin origin);\ntypedef void (* ma_dr_flac_meta_proc)(void* pUserData, ma_dr_flac_metadata* pMetadata);\ntypedef struct\n{\n    const ma_uint8* data;\n    size_t dataSize;\n    size_t currentReadPos;\n} ma_dr_flac__memory_stream;\ntypedef struct\n{\n    ma_dr_flac_read_proc onRead;\n    ma_dr_flac_seek_proc onSeek;\n    void* pUserData;\n    size_t unalignedByteCount;\n    ma_dr_flac_cache_t unalignedCache;\n    ma_uint32 nextL2Line;\n    ma_uint32 consumedBits;\n    ma_dr_flac_cache_t cacheL2[MA_DR_FLAC_BUFFER_SIZE/sizeof(ma_dr_flac_cache_t)];\n    ma_dr_flac_cache_t cache;\n    ma_uint16 crc16;\n    ma_dr_flac_cache_t crc16Cache;\n    ma_uint32 crc16CacheIgnoredBytes;\n} ma_dr_flac_bs;\ntypedef struct\n{\n    ma_uint8 subframeType;\n    ma_uint8 wastedBitsPerSample;\n    ma_uint8 lpcOrder;\n    ma_int32* pSamplesS32;\n} ma_dr_flac_subframe;\ntypedef struct\n{\n    ma_uint64 pcmFrameNumber;\n    ma_uint32 flacFrameNumber;\n    ma_uint32 sampleRate;\n    ma_uint16 blockSizeInPCMFrames;\n    ma_uint8 channelAssignment;\n    ma_uint8 bitsPerSample;\n    ma_uint8 crc8;\n} ma_dr_flac_frame_header;\ntypedef struct\n{\n    ma_dr_flac_frame_header header;\n    ma_uint32 pcmFramesRemaining;\n    ma_dr_flac_subframe subframes[8];\n} ma_dr_flac_frame;\ntypedef struct\n{\n    ma_dr_flac_meta_proc onMeta;\n    void* pUserDataMD;\n    ma_allocation_callbacks allocationCallbacks;\n    ma_uint32 sampleRate;\n    ma_uint8 channels;\n    ma_uint8 bitsPerSample;\n    ma_uint16 maxBlockSizeInPCMFrames;\n    ma_uint64 totalPCMFrameCount;\n    ma_dr_flac_container container;\n    ma_uint32 seekpointCount;\n    ma_dr_flac_frame currentFLACFrame;\n    ma_uint64 currentPCMFrame;\n    ma_uint64 firstFLACFramePosInBytes;\n    ma_dr_flac__memory_stream memoryStream;\n    ma_int32* pDecodedSamples;\n    ma_dr_flac_seekpoint* pSeekpoints;\n    void* _oggbs;\n    ma_bool32 _noSeekTableSeek    : 1;\n    ma_bool32 _noBinarySearchSeek : 1;\n    ma_bool32 _noBruteForceSeek   : 1;\n    ma_dr_flac_bs bs;\n    ma_uint8 pExtraData[1];\n} ma_dr_flac;\nMA_API ma_dr_flac* ma_dr_flac_open(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_dr_flac* ma_dr_flac_open_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_dr_flac* ma_dr_flac_open_with_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_dr_flac* ma_dr_flac_open_with_metadata_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API void ma_dr_flac_close(ma_dr_flac* pFlac);\nMA_API ma_uint64 ma_dr_flac_read_pcm_frames_s32(ma_dr_flac* pFlac, ma_uint64 framesToRead, ma_int32* pBufferOut);\nMA_API ma_uint64 ma_dr_flac_read_pcm_frames_s16(ma_dr_flac* pFlac, ma_uint64 framesToRead, ma_int16* pBufferOut);\nMA_API ma_uint64 ma_dr_flac_read_pcm_frames_f32(ma_dr_flac* pFlac, ma_uint64 framesToRead, float* pBufferOut);\nMA_API ma_bool32 ma_dr_flac_seek_to_pcm_frame(ma_dr_flac* pFlac, ma_uint64 pcmFrameIndex);\n#ifndef MA_DR_FLAC_NO_STDIO\nMA_API ma_dr_flac* ma_dr_flac_open_file(const char* pFileName, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_dr_flac* ma_dr_flac_open_file_w(const wchar_t* pFileName, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata(const char* pFileName, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata_w(const wchar_t* pFileName, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);\n#endif\nMA_API ma_dr_flac* ma_dr_flac_open_memory(const void* pData, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_dr_flac* ma_dr_flac_open_memory_with_metadata(const void* pData, size_t dataSize, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_int32* ma_dr_flac_open_and_read_pcm_frames_s32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_int16* ma_dr_flac_open_and_read_pcm_frames_s16(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\n#ifndef MA_DR_FLAC_NO_STDIO\nMA_API ma_int32* ma_dr_flac_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_int16* ma_dr_flac_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API float* ma_dr_flac_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\n#endif\nMA_API ma_int32* ma_dr_flac_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_int16* ma_dr_flac_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API float* ma_dr_flac_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API void ma_dr_flac_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks);\ntypedef struct\n{\n    ma_uint32 countRemaining;\n    const char* pRunningData;\n} ma_dr_flac_vorbis_comment_iterator;\nMA_API void ma_dr_flac_init_vorbis_comment_iterator(ma_dr_flac_vorbis_comment_iterator* pIter, ma_uint32 commentCount, const void* pComments);\nMA_API const char* ma_dr_flac_next_vorbis_comment(ma_dr_flac_vorbis_comment_iterator* pIter, ma_uint32* pCommentLengthOut);\ntypedef struct\n{\n    ma_uint32 countRemaining;\n    const char* pRunningData;\n} ma_dr_flac_cuesheet_track_iterator;\ntypedef struct\n{\n    ma_uint64 offset;\n    ma_uint8 index;\n    ma_uint8 reserved[3];\n} ma_dr_flac_cuesheet_track_index;\ntypedef struct\n{\n    ma_uint64 offset;\n    ma_uint8 trackNumber;\n    char ISRC[12];\n    ma_bool8 isAudio;\n    ma_bool8 preEmphasis;\n    ma_uint8 indexCount;\n    const ma_dr_flac_cuesheet_track_index* pIndexPoints;\n} ma_dr_flac_cuesheet_track;\nMA_API void ma_dr_flac_init_cuesheet_track_iterator(ma_dr_flac_cuesheet_track_iterator* pIter, ma_uint32 trackCount, const void* pTrackData);\nMA_API ma_bool32 ma_dr_flac_next_cuesheet_track(ma_dr_flac_cuesheet_track_iterator* pIter, ma_dr_flac_cuesheet_track* pCuesheetTrack);\n#ifdef __cplusplus\n}\n#endif\n#endif\n/* dr_flac_h end */\n#endif  /* MA_NO_FLAC */\n\n#if !defined(MA_NO_MP3) && !defined(MA_NO_DECODING)\n/* dr_mp3_h begin */\n#ifndef ma_dr_mp3_h\n#define ma_dr_mp3_h\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n#define MA_DR_MP3_STRINGIFY(x)      #x\n#define MA_DR_MP3_XSTRINGIFY(x)     MA_DR_MP3_STRINGIFY(x)\n#define MA_DR_MP3_VERSION_MAJOR     0\n#define MA_DR_MP3_VERSION_MINOR     6\n#define MA_DR_MP3_VERSION_REVISION  38\n#define MA_DR_MP3_VERSION_STRING    MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_MAJOR) \".\" MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_MINOR) \".\" MA_DR_MP3_XSTRINGIFY(MA_DR_MP3_VERSION_REVISION)\n#include <stddef.h>\n#define MA_DR_MP3_MAX_PCM_FRAMES_PER_MP3_FRAME  1152\n#define MA_DR_MP3_MAX_SAMPLES_PER_FRAME         (MA_DR_MP3_MAX_PCM_FRAMES_PER_MP3_FRAME*2)\nMA_API void ma_dr_mp3_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* pRevision);\nMA_API const char* ma_dr_mp3_version_string(void);\ntypedef struct\n{\n    int frame_bytes, channels, hz, layer, bitrate_kbps;\n} ma_dr_mp3dec_frame_info;\ntypedef struct\n{\n    float mdct_overlap[2][9*32], qmf_state[15*2*32];\n    int reserv, free_format_bytes;\n    ma_uint8 header[4], reserv_buf[511];\n} ma_dr_mp3dec;\nMA_API void ma_dr_mp3dec_init(ma_dr_mp3dec *dec);\nMA_API int ma_dr_mp3dec_decode_frame(ma_dr_mp3dec *dec, const ma_uint8 *mp3, int mp3_bytes, void *pcm, ma_dr_mp3dec_frame_info *info);\nMA_API void ma_dr_mp3dec_f32_to_s16(const float *in, ma_int16 *out, size_t num_samples);\ntypedef enum\n{\n    ma_dr_mp3_seek_origin_start,\n    ma_dr_mp3_seek_origin_current\n} ma_dr_mp3_seek_origin;\ntypedef struct\n{\n    ma_uint64 seekPosInBytes;\n    ma_uint64 pcmFrameIndex;\n    ma_uint16 mp3FramesToDiscard;\n    ma_uint16 pcmFramesToDiscard;\n} ma_dr_mp3_seek_point;\ntypedef size_t (* ma_dr_mp3_read_proc)(void* pUserData, void* pBufferOut, size_t bytesToRead);\ntypedef ma_bool32 (* ma_dr_mp3_seek_proc)(void* pUserData, int offset, ma_dr_mp3_seek_origin origin);\ntypedef struct\n{\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n} ma_dr_mp3_config;\ntypedef struct\n{\n    ma_dr_mp3dec decoder;\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_dr_mp3_read_proc onRead;\n    ma_dr_mp3_seek_proc onSeek;\n    void* pUserData;\n    ma_allocation_callbacks allocationCallbacks;\n    ma_uint32 mp3FrameChannels;\n    ma_uint32 mp3FrameSampleRate;\n    ma_uint32 pcmFramesConsumedInMP3Frame;\n    ma_uint32 pcmFramesRemainingInMP3Frame;\n    ma_uint8 pcmFrames[sizeof(float)*MA_DR_MP3_MAX_SAMPLES_PER_FRAME];\n    ma_uint64 currentPCMFrame;\n    ma_uint64 streamCursor;\n    ma_dr_mp3_seek_point* pSeekPoints;\n    ma_uint32 seekPointCount;\n    size_t dataSize;\n    size_t dataCapacity;\n    size_t dataConsumed;\n    ma_uint8* pData;\n    ma_bool32 atEnd : 1;\n    struct\n    {\n        const ma_uint8* pData;\n        size_t dataSize;\n        size_t currentReadPos;\n    } memory;\n} ma_dr_mp3;\nMA_API ma_bool32 ma_dr_mp3_init(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_mp3_init_memory(ma_dr_mp3* pMP3, const void* pData, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks);\n#ifndef MA_DR_MP3_NO_STDIO\nMA_API ma_bool32 ma_dr_mp3_init_file(ma_dr_mp3* pMP3, const char* pFilePath, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_bool32 ma_dr_mp3_init_file_w(ma_dr_mp3* pMP3, const wchar_t* pFilePath, const ma_allocation_callbacks* pAllocationCallbacks);\n#endif\nMA_API void ma_dr_mp3_uninit(ma_dr_mp3* pMP3);\nMA_API ma_uint64 ma_dr_mp3_read_pcm_frames_f32(ma_dr_mp3* pMP3, ma_uint64 framesToRead, float* pBufferOut);\nMA_API ma_uint64 ma_dr_mp3_read_pcm_frames_s16(ma_dr_mp3* pMP3, ma_uint64 framesToRead, ma_int16* pBufferOut);\nMA_API ma_bool32 ma_dr_mp3_seek_to_pcm_frame(ma_dr_mp3* pMP3, ma_uint64 frameIndex);\nMA_API ma_uint64 ma_dr_mp3_get_pcm_frame_count(ma_dr_mp3* pMP3);\nMA_API ma_uint64 ma_dr_mp3_get_mp3_frame_count(ma_dr_mp3* pMP3);\nMA_API ma_bool32 ma_dr_mp3_get_mp3_and_pcm_frame_count(ma_dr_mp3* pMP3, ma_uint64* pMP3FrameCount, ma_uint64* pPCMFrameCount);\nMA_API ma_bool32 ma_dr_mp3_calculate_seek_points(ma_dr_mp3* pMP3, ma_uint32* pSeekPointCount, ma_dr_mp3_seek_point* pSeekPoints);\nMA_API ma_bool32 ma_dr_mp3_bind_seek_table(ma_dr_mp3* pMP3, ma_uint32 seekPointCount, ma_dr_mp3_seek_point* pSeekPoints);\nMA_API float* ma_dr_mp3_open_and_read_pcm_frames_f32(ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_int16* ma_dr_mp3_open_and_read_pcm_frames_s16(ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API float* ma_dr_mp3_open_memory_and_read_pcm_frames_f32(const void* pData, size_t dataSize, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_int16* ma_dr_mp3_open_memory_and_read_pcm_frames_s16(const void* pData, size_t dataSize, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\n#ifndef MA_DR_MP3_NO_STDIO\nMA_API float* ma_dr_mp3_open_file_and_read_pcm_frames_f32(const char* filePath, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_int16* ma_dr_mp3_open_file_and_read_pcm_frames_s16(const char* filePath, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks);\n#endif\nMA_API void* ma_dr_mp3_malloc(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API void ma_dr_mp3_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks);\n#ifdef __cplusplus\n}\n#endif\n#endif\n/* dr_mp3_h end */\n#endif  /* MA_NO_MP3 */\n\n\n/**************************************************************************************************************************************************************\n\nDecoding\n\n**************************************************************************************************************************************************************/\n#ifndef MA_NO_DECODING\n\nstatic ma_result ma_decoder_read_bytes(ma_decoder* pDecoder, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead)\n{\n    MA_ASSERT(pDecoder != NULL);\n\n    return pDecoder->onRead(pDecoder, pBufferOut, bytesToRead, pBytesRead);\n}\n\nstatic ma_result ma_decoder_seek_bytes(ma_decoder* pDecoder, ma_int64 byteOffset, ma_seek_origin origin)\n{\n    MA_ASSERT(pDecoder != NULL);\n\n    return pDecoder->onSeek(pDecoder, byteOffset, origin);\n}\n\nstatic ma_result ma_decoder_tell_bytes(ma_decoder* pDecoder, ma_int64* pCursor)\n{\n    MA_ASSERT(pDecoder != NULL);\n\n    if (pDecoder->onTell == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    return pDecoder->onTell(pDecoder, pCursor);\n}\n\n\nMA_API ma_decoding_backend_config ma_decoding_backend_config_init(ma_format preferredFormat, ma_uint32 seekPointCount)\n{\n    ma_decoding_backend_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.preferredFormat = preferredFormat;\n    config.seekPointCount  = seekPointCount;\n\n    return config;\n}\n\n\nMA_API ma_decoder_config ma_decoder_config_init(ma_format outputFormat, ma_uint32 outputChannels, ma_uint32 outputSampleRate)\n{\n    ma_decoder_config config;\n    MA_ZERO_OBJECT(&config);\n    config.format         = outputFormat;\n    config.channels       = outputChannels;\n    config.sampleRate     = outputSampleRate;\n    config.resampling     = ma_resampler_config_init(ma_format_unknown, 0, 0, 0, ma_resample_algorithm_linear); /* Format/channels/rate doesn't matter here. */\n    config.encodingFormat = ma_encoding_format_unknown;\n\n    /* Note that we are intentionally leaving the channel map empty here which will cause the default channel map to be used. */\n\n    return config;\n}\n\nMA_API ma_decoder_config ma_decoder_config_init_default()\n{\n    return ma_decoder_config_init(ma_format_unknown, 0, 0);\n}\n\nMA_API ma_decoder_config ma_decoder_config_init_copy(const ma_decoder_config* pConfig)\n{\n    ma_decoder_config config;\n    if (pConfig != NULL) {\n        config = *pConfig;\n    } else {\n        MA_ZERO_OBJECT(&config);\n    }\n\n    return config;\n}\n\nstatic ma_result ma_decoder__init_data_converter(ma_decoder* pDecoder, const ma_decoder_config* pConfig)\n{\n    ma_result result;\n    ma_data_converter_config converterConfig;\n    ma_format internalFormat;\n    ma_uint32 internalChannels;\n    ma_uint32 internalSampleRate;\n    ma_channel internalChannelMap[MA_MAX_CHANNELS];\n\n    MA_ASSERT(pDecoder != NULL);\n    MA_ASSERT(pConfig  != NULL);\n\n    result = ma_data_source_get_data_format(pDecoder->pBackend, &internalFormat, &internalChannels, &internalSampleRate, internalChannelMap, ma_countof(internalChannelMap));\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to retrieve the internal data format. */\n    }\n\n\n    /* Make sure we're not asking for too many channels. */\n    if (pConfig->channels > MA_MAX_CHANNELS) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The internal channels should have already been validated at a higher level, but we'll do it again explicitly here for safety. */\n    if (internalChannels > MA_MAX_CHANNELS) {\n        return MA_INVALID_ARGS;\n    }\n\n\n    /* Output format. */\n    if (pConfig->format == ma_format_unknown) {\n        pDecoder->outputFormat = internalFormat;\n    } else {\n        pDecoder->outputFormat = pConfig->format;\n    }\n\n    if (pConfig->channels == 0) {\n        pDecoder->outputChannels = internalChannels;\n    } else {\n        pDecoder->outputChannels = pConfig->channels;\n    }\n\n    if (pConfig->sampleRate == 0) {\n        pDecoder->outputSampleRate = internalSampleRate;\n    } else {\n        pDecoder->outputSampleRate = pConfig->sampleRate;\n    }\n\n    converterConfig = ma_data_converter_config_init(\n        internalFormat,     pDecoder->outputFormat,\n        internalChannels,   pDecoder->outputChannels,\n        internalSampleRate, pDecoder->outputSampleRate\n    );\n    converterConfig.pChannelMapIn          = internalChannelMap;\n    converterConfig.pChannelMapOut         = pConfig->pChannelMap;\n    converterConfig.channelMixMode         = pConfig->channelMixMode;\n    converterConfig.ditherMode             = pConfig->ditherMode;\n    converterConfig.allowDynamicSampleRate = MA_FALSE;   /* Never allow dynamic sample rate conversion. Setting this to true will disable passthrough optimizations. */\n    converterConfig.resampling             = pConfig->resampling;\n\n    result = ma_data_converter_init(&converterConfig, &pDecoder->allocationCallbacks, &pDecoder->converter);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /*\n    Now that we have the decoder we need to determine whether or not we need a heap-allocated cache. We'll\n    need this if the data converter does not support calculation of the required input frame count. To\n    determine support for this we'll just run a test.\n    */\n    {\n        ma_uint64 unused;\n\n        result = ma_data_converter_get_required_input_frame_count(&pDecoder->converter, 1, &unused);\n        if (result != MA_SUCCESS) {\n            /*\n            We were unable to calculate the required input frame count which means we'll need to use\n            a heap-allocated cache.\n            */\n            ma_uint64 inputCacheCapSizeInBytes;\n\n            pDecoder->inputCacheCap = MA_DATA_CONVERTER_STACK_BUFFER_SIZE / ma_get_bytes_per_frame(internalFormat, internalChannels);\n\n            /* Not strictly necessary, but keeping here for safety in case we change the default value of pDecoder->inputCacheCap. */\n            inputCacheCapSizeInBytes = pDecoder->inputCacheCap * ma_get_bytes_per_frame(internalFormat, internalChannels);\n            if (inputCacheCapSizeInBytes > MA_SIZE_MAX) {\n                ma_data_converter_uninit(&pDecoder->converter, &pDecoder->allocationCallbacks);\n                return MA_OUT_OF_MEMORY;\n            }\n\n            pDecoder->pInputCache = ma_malloc((size_t)inputCacheCapSizeInBytes, &pDecoder->allocationCallbacks);    /* Safe cast to size_t. */\n            if (pDecoder->pInputCache == NULL) {\n                ma_data_converter_uninit(&pDecoder->converter, &pDecoder->allocationCallbacks);\n                return MA_OUT_OF_MEMORY;\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n\n\nstatic ma_result ma_decoder_internal_on_read__custom(void* pUserData, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead)\n{\n    ma_decoder* pDecoder = (ma_decoder*)pUserData;\n    MA_ASSERT(pDecoder != NULL);\n\n    return ma_decoder_read_bytes(pDecoder, pBufferOut, bytesToRead, pBytesRead);\n}\n\nstatic ma_result ma_decoder_internal_on_seek__custom(void* pUserData, ma_int64 offset, ma_seek_origin origin)\n{\n    ma_decoder* pDecoder = (ma_decoder*)pUserData;\n    MA_ASSERT(pDecoder != NULL);\n\n    return ma_decoder_seek_bytes(pDecoder, offset, origin);\n}\n\nstatic ma_result ma_decoder_internal_on_tell__custom(void* pUserData, ma_int64* pCursor)\n{\n    ma_decoder* pDecoder = (ma_decoder*)pUserData;\n    MA_ASSERT(pDecoder != NULL);\n\n    return ma_decoder_tell_bytes(pDecoder, pCursor);\n}\n\n\nstatic ma_result ma_decoder_init_from_vtable__internal(const ma_decoding_backend_vtable* pVTable, void* pVTableUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n    ma_decoding_backend_config backendConfig;\n    ma_data_source* pBackend;\n\n    MA_ASSERT(pVTable  != NULL);\n    MA_ASSERT(pConfig  != NULL);\n    MA_ASSERT(pDecoder != NULL);\n\n    if (pVTable->onInit == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    backendConfig = ma_decoding_backend_config_init(pConfig->format, pConfig->seekPointCount);\n\n    result = pVTable->onInit(pVTableUserData, ma_decoder_internal_on_read__custom, ma_decoder_internal_on_seek__custom, ma_decoder_internal_on_tell__custom, pDecoder, &backendConfig, &pDecoder->allocationCallbacks, &pBackend);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to initialize the backend from this vtable. */\n    }\n\n    /* Getting here means we were able to initialize the backend so we can now initialize the decoder. */\n    pDecoder->pBackend         = pBackend;\n    pDecoder->pBackendVTable   = pVTable;\n    pDecoder->pBackendUserData = pConfig->pCustomBackendUserData;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoder_init_from_file__internal(const ma_decoding_backend_vtable* pVTable, void* pVTableUserData, const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n    ma_decoding_backend_config backendConfig;\n    ma_data_source* pBackend;\n\n    MA_ASSERT(pVTable  != NULL);\n    MA_ASSERT(pConfig  != NULL);\n    MA_ASSERT(pDecoder != NULL);\n\n    if (pVTable->onInitFile == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    backendConfig = ma_decoding_backend_config_init(pConfig->format, pConfig->seekPointCount);\n\n    result = pVTable->onInitFile(pVTableUserData, pFilePath, &backendConfig, &pDecoder->allocationCallbacks, &pBackend);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to initialize the backend from this vtable. */\n    }\n\n    /* Getting here means we were able to initialize the backend so we can now initialize the decoder. */\n    pDecoder->pBackend         = pBackend;\n    pDecoder->pBackendVTable   = pVTable;\n    pDecoder->pBackendUserData = pConfig->pCustomBackendUserData;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoder_init_from_file_w__internal(const ma_decoding_backend_vtable* pVTable, void* pVTableUserData, const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n    ma_decoding_backend_config backendConfig;\n    ma_data_source* pBackend;\n\n    MA_ASSERT(pVTable  != NULL);\n    MA_ASSERT(pConfig  != NULL);\n    MA_ASSERT(pDecoder != NULL);\n\n    if (pVTable->onInitFileW == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    backendConfig = ma_decoding_backend_config_init(pConfig->format, pConfig->seekPointCount);\n\n    result = pVTable->onInitFileW(pVTableUserData, pFilePath, &backendConfig, &pDecoder->allocationCallbacks, &pBackend);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to initialize the backend from this vtable. */\n    }\n\n    /* Getting here means we were able to initialize the backend so we can now initialize the decoder. */\n    pDecoder->pBackend         = pBackend;\n    pDecoder->pBackendVTable   = pVTable;\n    pDecoder->pBackendUserData = pConfig->pCustomBackendUserData;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoder_init_from_memory__internal(const ma_decoding_backend_vtable* pVTable, void* pVTableUserData, const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n    ma_decoding_backend_config backendConfig;\n    ma_data_source* pBackend;\n\n    MA_ASSERT(pVTable  != NULL);\n    MA_ASSERT(pConfig  != NULL);\n    MA_ASSERT(pDecoder != NULL);\n\n    if (pVTable->onInitMemory == NULL) {\n        return MA_NOT_IMPLEMENTED;\n    }\n\n    backendConfig = ma_decoding_backend_config_init(pConfig->format, pConfig->seekPointCount);\n\n    result = pVTable->onInitMemory(pVTableUserData, pData, dataSize, &backendConfig, &pDecoder->allocationCallbacks, &pBackend);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to initialize the backend from this vtable. */\n    }\n\n    /* Getting here means we were able to initialize the backend so we can now initialize the decoder. */\n    pDecoder->pBackend         = pBackend;\n    pDecoder->pBackendVTable   = pVTable;\n    pDecoder->pBackendUserData = pConfig->pCustomBackendUserData;\n\n    return MA_SUCCESS;\n}\n\n\n\nstatic ma_result ma_decoder_init_custom__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result = MA_NO_BACKEND;\n    size_t ivtable;\n\n    MA_ASSERT(pConfig != NULL);\n    MA_ASSERT(pDecoder != NULL);\n\n    if (pConfig->ppCustomBackendVTables == NULL) {\n        return MA_NO_BACKEND;\n    }\n\n    /* The order each backend is listed is what defines the priority. */\n    for (ivtable = 0; ivtable < pConfig->customBackendCount; ivtable += 1) {\n        const ma_decoding_backend_vtable* pVTable = pConfig->ppCustomBackendVTables[ivtable];\n        if (pVTable != NULL) {\n            result = ma_decoder_init_from_vtable__internal(pVTable, pConfig->pCustomBackendUserData, pConfig, pDecoder);\n            if (result == MA_SUCCESS) {\n                return MA_SUCCESS;\n            } else {\n                /* Initialization failed. Move on to the next one, but seek back to the start first so the next vtable starts from the first byte of the file. */\n                result = ma_decoder_seek_bytes(pDecoder, 0, ma_seek_origin_start);\n                if (result != MA_SUCCESS) {\n                    return result;  /* Failed to seek back to the start. */\n                }\n            }\n        } else {\n            /* No vtable. */\n        }\n    }\n\n    /* Getting here means we couldn't find a backend. */\n    return MA_NO_BACKEND;\n}\n\nstatic ma_result ma_decoder_init_custom_from_file__internal(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result = MA_NO_BACKEND;\n    size_t ivtable;\n\n    MA_ASSERT(pConfig != NULL);\n    MA_ASSERT(pDecoder != NULL);\n\n    if (pConfig->ppCustomBackendVTables == NULL) {\n        return MA_NO_BACKEND;\n    }\n\n    /* The order each backend is listed is what defines the priority. */\n    for (ivtable = 0; ivtable < pConfig->customBackendCount; ivtable += 1) {\n        const ma_decoding_backend_vtable* pVTable = pConfig->ppCustomBackendVTables[ivtable];\n        if (pVTable != NULL) {\n            result = ma_decoder_init_from_file__internal(pVTable, pConfig->pCustomBackendUserData, pFilePath, pConfig, pDecoder);\n            if (result == MA_SUCCESS) {\n                return MA_SUCCESS;\n            }\n        } else {\n            /* No vtable. */\n        }\n    }\n\n    /* Getting here means we couldn't find a backend. */\n    return MA_NO_BACKEND;\n}\n\nstatic ma_result ma_decoder_init_custom_from_file_w__internal(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result = MA_NO_BACKEND;\n    size_t ivtable;\n\n    MA_ASSERT(pConfig != NULL);\n    MA_ASSERT(pDecoder != NULL);\n\n    if (pConfig->ppCustomBackendVTables == NULL) {\n        return MA_NO_BACKEND;\n    }\n\n    /* The order each backend is listed is what defines the priority. */\n    for (ivtable = 0; ivtable < pConfig->customBackendCount; ivtable += 1) {\n        const ma_decoding_backend_vtable* pVTable = pConfig->ppCustomBackendVTables[ivtable];\n        if (pVTable != NULL) {\n            result = ma_decoder_init_from_file_w__internal(pVTable, pConfig->pCustomBackendUserData, pFilePath, pConfig, pDecoder);\n            if (result == MA_SUCCESS) {\n                return MA_SUCCESS;\n            }\n        } else {\n            /* No vtable. */\n        }\n    }\n\n    /* Getting here means we couldn't find a backend. */\n    return MA_NO_BACKEND;\n}\n\nstatic ma_result ma_decoder_init_custom_from_memory__internal(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result = MA_NO_BACKEND;\n    size_t ivtable;\n\n    MA_ASSERT(pConfig != NULL);\n    MA_ASSERT(pDecoder != NULL);\n\n    if (pConfig->ppCustomBackendVTables == NULL) {\n        return MA_NO_BACKEND;\n    }\n\n    /* The order each backend is listed is what defines the priority. */\n    for (ivtable = 0; ivtable < pConfig->customBackendCount; ivtable += 1) {\n        const ma_decoding_backend_vtable* pVTable = pConfig->ppCustomBackendVTables[ivtable];\n        if (pVTable != NULL) {\n            result = ma_decoder_init_from_memory__internal(pVTable, pConfig->pCustomBackendUserData, pData, dataSize, pConfig, pDecoder);\n            if (result == MA_SUCCESS) {\n                return MA_SUCCESS;\n            }\n        } else {\n            /* No vtable. */\n        }\n    }\n\n    /* Getting here means we couldn't find a backend. */\n    return MA_NO_BACKEND;\n}\n\n\n/* WAV */\n#ifdef ma_dr_wav_h\n#define MA_HAS_WAV\n\ntypedef struct\n{\n    ma_data_source_base ds;\n    ma_read_proc onRead;\n    ma_seek_proc onSeek;\n    ma_tell_proc onTell;\n    void* pReadSeekTellUserData;\n    ma_format format;           /* Can be f32, s16 or s32. */\n#if !defined(MA_NO_WAV)\n    ma_dr_wav dr;\n#endif\n} ma_wav;\n\nMA_API ma_result ma_wav_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav);\nMA_API ma_result ma_wav_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav);\nMA_API ma_result ma_wav_init_file_w(const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav);\nMA_API ma_result ma_wav_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav);\nMA_API void ma_wav_uninit(ma_wav* pWav, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_wav_read_pcm_frames(ma_wav* pWav, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\nMA_API ma_result ma_wav_seek_to_pcm_frame(ma_wav* pWav, ma_uint64 frameIndex);\nMA_API ma_result ma_wav_get_data_format(ma_wav* pWav, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);\nMA_API ma_result ma_wav_get_cursor_in_pcm_frames(ma_wav* pWav, ma_uint64* pCursor);\nMA_API ma_result ma_wav_get_length_in_pcm_frames(ma_wav* pWav, ma_uint64* pLength);\n\n\nstatic ma_result ma_wav_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    return ma_wav_read_pcm_frames((ma_wav*)pDataSource, pFramesOut, frameCount, pFramesRead);\n}\n\nstatic ma_result ma_wav_ds_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    return ma_wav_seek_to_pcm_frame((ma_wav*)pDataSource, frameIndex);\n}\n\nstatic ma_result ma_wav_ds_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    return ma_wav_get_data_format((ma_wav*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap);\n}\n\nstatic ma_result ma_wav_ds_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)\n{\n    return ma_wav_get_cursor_in_pcm_frames((ma_wav*)pDataSource, pCursor);\n}\n\nstatic ma_result ma_wav_ds_get_length(ma_data_source* pDataSource, ma_uint64* pLength)\n{\n    return ma_wav_get_length_in_pcm_frames((ma_wav*)pDataSource, pLength);\n}\n\nstatic ma_data_source_vtable g_ma_wav_ds_vtable =\n{\n    ma_wav_ds_read,\n    ma_wav_ds_seek,\n    ma_wav_ds_get_data_format,\n    ma_wav_ds_get_cursor,\n    ma_wav_ds_get_length,\n    NULL,   /* onSetLooping */\n    0\n};\n\n\n#if !defined(MA_NO_WAV)\nstatic size_t ma_wav_dr_callback__read(void* pUserData, void* pBufferOut, size_t bytesToRead)\n{\n    ma_wav* pWav = (ma_wav*)pUserData;\n    ma_result result;\n    size_t bytesRead;\n\n    MA_ASSERT(pWav != NULL);\n\n    result = pWav->onRead(pWav->pReadSeekTellUserData, pBufferOut, bytesToRead, &bytesRead);\n    (void)result;\n\n    return bytesRead;\n}\n\nstatic ma_bool32 ma_wav_dr_callback__seek(void* pUserData, int offset, ma_dr_wav_seek_origin origin)\n{\n    ma_wav* pWav = (ma_wav*)pUserData;\n    ma_result result;\n    ma_seek_origin maSeekOrigin;\n\n    MA_ASSERT(pWav != NULL);\n\n    maSeekOrigin = ma_seek_origin_start;\n    if (origin == ma_dr_wav_seek_origin_current) {\n        maSeekOrigin =  ma_seek_origin_current;\n    }\n\n    result = pWav->onSeek(pWav->pReadSeekTellUserData, offset, maSeekOrigin);\n    if (result != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n\n    return MA_TRUE;\n}\n#endif\n\nstatic ma_result ma_wav_init_internal(const ma_decoding_backend_config* pConfig, ma_wav* pWav)\n{\n    ma_result result;\n    ma_data_source_config dataSourceConfig;\n\n    if (pWav == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pWav);\n    pWav->format = ma_format_unknown;   /* Use closest match to source file by default. */\n\n    if (pConfig != NULL && (pConfig->preferredFormat == ma_format_f32 || pConfig->preferredFormat == ma_format_s16 || pConfig->preferredFormat == ma_format_s32)) {\n        pWav->format = pConfig->preferredFormat;\n    } else {\n        /* Getting here means something other than f32 and s16 was specified. Just leave this unset to use the default format. */\n    }\n\n    dataSourceConfig = ma_data_source_config_init();\n    dataSourceConfig.vtable = &g_ma_wav_ds_vtable;\n\n    result = ma_data_source_init(&dataSourceConfig, &pWav->ds);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to initialize the base data source. */\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_wav_post_init(ma_wav* pWav)\n{\n    /*\n    If an explicit format was not specified, try picking the closest match based on the internal\n    format. The format needs to be supported by miniaudio.\n    */\n    if (pWav->format == ma_format_unknown) {\n        switch (pWav->dr.translatedFormatTag)\n        {\n            case MA_DR_WAVE_FORMAT_PCM:\n            {\n                if (pWav->dr.bitsPerSample == 8) {\n                    pWav->format = ma_format_u8;\n                } else if (pWav->dr.bitsPerSample == 16) {\n                    pWav->format = ma_format_s16;\n                } else if (pWav->dr.bitsPerSample == 24) {\n                    pWav->format = ma_format_s24;\n                } else if (pWav->dr.bitsPerSample == 32) {\n                    pWav->format = ma_format_s32;\n                }\n            } break;\n\n            case MA_DR_WAVE_FORMAT_IEEE_FLOAT:\n            {\n                if (pWav->dr.bitsPerSample == 32) {\n                    pWav->format = ma_format_f32;\n                }\n            } break;\n\n            default: break;\n        }\n\n        /* Fall back to f32 if we couldn't find anything. */\n        if (pWav->format == ma_format_unknown) {\n            pWav->format =  ma_format_f32;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_wav_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav)\n{\n    ma_result result;\n\n    result = ma_wav_init_internal(pConfig, pWav);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (onRead == NULL || onSeek == NULL) {\n        return MA_INVALID_ARGS; /* onRead and onSeek are mandatory. */\n    }\n\n    pWav->onRead = onRead;\n    pWav->onSeek = onSeek;\n    pWav->onTell = onTell;\n    pWav->pReadSeekTellUserData = pReadSeekTellUserData;\n\n    #if !defined(MA_NO_WAV)\n    {\n        ma_bool32 wavResult;\n\n        wavResult = ma_dr_wav_init(&pWav->dr, ma_wav_dr_callback__read, ma_wav_dr_callback__seek, pWav, pAllocationCallbacks);\n        if (wavResult != MA_TRUE) {\n            return MA_INVALID_FILE;\n        }\n\n        ma_wav_post_init(pWav);\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* wav is disabled. */\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_wav_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav)\n{\n    ma_result result;\n\n    result = ma_wav_init_internal(pConfig, pWav);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    #if !defined(MA_NO_WAV)\n    {\n        ma_bool32 wavResult;\n\n        wavResult = ma_dr_wav_init_file(&pWav->dr, pFilePath, pAllocationCallbacks);\n        if (wavResult != MA_TRUE) {\n            return MA_INVALID_FILE;\n        }\n\n        ma_wav_post_init(pWav);\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* wav is disabled. */\n        (void)pFilePath;\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_wav_init_file_w(const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav)\n{\n    ma_result result;\n\n    result = ma_wav_init_internal(pConfig, pWav);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    #if !defined(MA_NO_WAV)\n    {\n        ma_bool32 wavResult;\n\n        wavResult = ma_dr_wav_init_file_w(&pWav->dr, pFilePath, pAllocationCallbacks);\n        if (wavResult != MA_TRUE) {\n            return MA_INVALID_FILE;\n        }\n\n        ma_wav_post_init(pWav);\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* wav is disabled. */\n        (void)pFilePath;\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_wav_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_wav* pWav)\n{\n    ma_result result;\n\n    result = ma_wav_init_internal(pConfig, pWav);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    #if !defined(MA_NO_WAV)\n    {\n        ma_bool32 wavResult;\n\n        wavResult = ma_dr_wav_init_memory(&pWav->dr, pData, dataSize, pAllocationCallbacks);\n        if (wavResult != MA_TRUE) {\n            return MA_INVALID_FILE;\n        }\n\n        ma_wav_post_init(pWav);\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* wav is disabled. */\n        (void)pData;\n        (void)dataSize;\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API void ma_wav_uninit(ma_wav* pWav, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pWav == NULL) {\n        return;\n    }\n\n    (void)pAllocationCallbacks;\n\n    #if !defined(MA_NO_WAV)\n    {\n        ma_dr_wav_uninit(&pWav->dr);\n    }\n    #else\n    {\n        /* wav is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n    }\n    #endif\n\n    ma_data_source_uninit(&pWav->ds);\n}\n\nMA_API ma_result ma_wav_read_pcm_frames(ma_wav* pWav, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    if (frameCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pWav == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_WAV)\n    {\n        /* We always use floating point format. */\n        ma_result result = MA_SUCCESS;  /* Must be initialized to MA_SUCCESS. */\n        ma_uint64 totalFramesRead = 0;\n        ma_format format;\n\n        ma_wav_get_data_format(pWav, &format, NULL, NULL, NULL, 0);\n\n        switch (format)\n        {\n            case ma_format_f32:\n            {\n                totalFramesRead = ma_dr_wav_read_pcm_frames_f32(&pWav->dr, frameCount, (float*)pFramesOut);\n            } break;\n\n            case ma_format_s16:\n            {\n                totalFramesRead = ma_dr_wav_read_pcm_frames_s16(&pWav->dr, frameCount, (ma_int16*)pFramesOut);\n            } break;\n\n            case ma_format_s32:\n            {\n                totalFramesRead = ma_dr_wav_read_pcm_frames_s32(&pWav->dr, frameCount, (ma_int32*)pFramesOut);\n            } break;\n\n            /* Fallback to a raw read. */\n            case ma_format_unknown: return MA_INVALID_OPERATION; /* <-- this should never be hit because initialization would just fall back to a supported format. */\n            default:\n            {\n                totalFramesRead = ma_dr_wav_read_pcm_frames(&pWav->dr, frameCount, pFramesOut);\n            } break;\n        }\n\n        /* In the future we'll update ma_dr_wav to return MA_AT_END for us. */\n        if (totalFramesRead == 0) {\n            result = MA_AT_END;\n        }\n\n        if (pFramesRead != NULL) {\n            *pFramesRead = totalFramesRead;\n        }\n\n        if (result == MA_SUCCESS && totalFramesRead == 0) {\n            result  = MA_AT_END;\n        }\n\n        return result;\n    }\n    #else\n    {\n        /* wav is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n\n        (void)pFramesOut;\n        (void)frameCount;\n        (void)pFramesRead;\n\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_wav_seek_to_pcm_frame(ma_wav* pWav, ma_uint64 frameIndex)\n{\n    if (pWav == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_WAV)\n    {\n        ma_bool32 wavResult;\n\n        wavResult = ma_dr_wav_seek_to_pcm_frame(&pWav->dr, frameIndex);\n        if (wavResult != MA_TRUE) {\n            return MA_ERROR;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* wav is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n\n        (void)frameIndex;\n\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_wav_get_data_format(ma_wav* pWav, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    /* Defaults for safety. */\n    if (pFormat != NULL) {\n        *pFormat = ma_format_unknown;\n    }\n    if (pChannels != NULL) {\n        *pChannels = 0;\n    }\n    if (pSampleRate != NULL) {\n        *pSampleRate = 0;\n    }\n    if (pChannelMap != NULL) {\n        MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap);\n    }\n\n    if (pWav == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    if (pFormat != NULL) {\n        *pFormat = pWav->format;\n    }\n\n    #if !defined(MA_NO_WAV)\n    {\n        if (pChannels != NULL) {\n            *pChannels = pWav->dr.channels;\n        }\n\n        if (pSampleRate != NULL) {\n            *pSampleRate = pWav->dr.sampleRate;\n        }\n\n        if (pChannelMap != NULL) {\n            ma_channel_map_init_standard(ma_standard_channel_map_microsoft, pChannelMap, channelMapCap, pWav->dr.channels);\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* wav is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_wav_get_cursor_in_pcm_frames(ma_wav* pWav, ma_uint64* pCursor)\n{\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;   /* Safety. */\n\n    if (pWav == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_WAV)\n    {\n        ma_result wavResult = ma_dr_wav_get_cursor_in_pcm_frames(&pWav->dr, pCursor);\n        if (wavResult != MA_SUCCESS) {\n            return (ma_result)wavResult;    /* ma_dr_wav result codes map to miniaudio's. */\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* wav is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_wav_get_length_in_pcm_frames(ma_wav* pWav, ma_uint64* pLength)\n{\n    if (pLength == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pLength = 0;   /* Safety. */\n\n    if (pWav == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_WAV)\n    {\n        ma_result wavResult = ma_dr_wav_get_length_in_pcm_frames(&pWav->dr, pLength);\n        if (wavResult != MA_SUCCESS) {\n            return (ma_result)wavResult;    /* ma_dr_wav result codes map to miniaudio's. */\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* wav is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\n\nstatic ma_result ma_decoding_backend_init__wav(void* pUserData, ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_wav* pWav;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pWav = (ma_wav*)ma_malloc(sizeof(*pWav), pAllocationCallbacks);\n    if (pWav == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_wav_init(onRead, onSeek, onTell, pReadSeekTellUserData, pConfig, pAllocationCallbacks, pWav);\n    if (result != MA_SUCCESS) {\n        ma_free(pWav, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pWav;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoding_backend_init_file__wav(void* pUserData, const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_wav* pWav;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pWav = (ma_wav*)ma_malloc(sizeof(*pWav), pAllocationCallbacks);\n    if (pWav == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_wav_init_file(pFilePath, pConfig, pAllocationCallbacks, pWav);\n    if (result != MA_SUCCESS) {\n        ma_free(pWav, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pWav;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoding_backend_init_file_w__wav(void* pUserData, const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_wav* pWav;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pWav = (ma_wav*)ma_malloc(sizeof(*pWav), pAllocationCallbacks);\n    if (pWav == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_wav_init_file_w(pFilePath, pConfig, pAllocationCallbacks, pWav);\n    if (result != MA_SUCCESS) {\n        ma_free(pWav, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pWav;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoding_backend_init_memory__wav(void* pUserData, const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_wav* pWav;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pWav = (ma_wav*)ma_malloc(sizeof(*pWav), pAllocationCallbacks);\n    if (pWav == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_wav_init_memory(pData, dataSize, pConfig, pAllocationCallbacks, pWav);\n    if (result != MA_SUCCESS) {\n        ma_free(pWav, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pWav;\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_decoding_backend_uninit__wav(void* pUserData, ma_data_source* pBackend, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_wav* pWav = (ma_wav*)pBackend;\n\n    (void)pUserData;\n\n    ma_wav_uninit(pWav, pAllocationCallbacks);\n    ma_free(pWav, pAllocationCallbacks);\n}\n\nstatic ma_decoding_backend_vtable g_ma_decoding_backend_vtable_wav =\n{\n    ma_decoding_backend_init__wav,\n    ma_decoding_backend_init_file__wav,\n    ma_decoding_backend_init_file_w__wav,\n    ma_decoding_backend_init_memory__wav,\n    ma_decoding_backend_uninit__wav\n};\n\nstatic ma_result ma_decoder_init_wav__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_vtable__internal(&g_ma_decoding_backend_vtable_wav, NULL, pConfig, pDecoder);\n}\n\nstatic ma_result ma_decoder_init_wav_from_file__internal(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_file__internal(&g_ma_decoding_backend_vtable_wav, NULL, pFilePath, pConfig, pDecoder);\n}\n\nstatic ma_result ma_decoder_init_wav_from_file_w__internal(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_file_w__internal(&g_ma_decoding_backend_vtable_wav, NULL, pFilePath, pConfig, pDecoder);\n}\n\nstatic ma_result ma_decoder_init_wav_from_memory__internal(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_memory__internal(&g_ma_decoding_backend_vtable_wav, NULL, pData, dataSize, pConfig, pDecoder);\n}\n#endif  /* ma_dr_wav_h */\n\n/* FLAC */\n#ifdef ma_dr_flac_h\n#define MA_HAS_FLAC\n\ntypedef struct\n{\n    ma_data_source_base ds;\n    ma_read_proc onRead;\n    ma_seek_proc onSeek;\n    ma_tell_proc onTell;\n    void* pReadSeekTellUserData;\n    ma_format format;           /* Can be f32, s16 or s32. */\n#if !defined(MA_NO_FLAC)\n    ma_dr_flac* dr;\n#endif\n} ma_flac;\n\nMA_API ma_result ma_flac_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac);\nMA_API ma_result ma_flac_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac);\nMA_API ma_result ma_flac_init_file_w(const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac);\nMA_API ma_result ma_flac_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac);\nMA_API void ma_flac_uninit(ma_flac* pFlac, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_flac_read_pcm_frames(ma_flac* pFlac, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\nMA_API ma_result ma_flac_seek_to_pcm_frame(ma_flac* pFlac, ma_uint64 frameIndex);\nMA_API ma_result ma_flac_get_data_format(ma_flac* pFlac, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);\nMA_API ma_result ma_flac_get_cursor_in_pcm_frames(ma_flac* pFlac, ma_uint64* pCursor);\nMA_API ma_result ma_flac_get_length_in_pcm_frames(ma_flac* pFlac, ma_uint64* pLength);\n\n\nstatic ma_result ma_flac_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    return ma_flac_read_pcm_frames((ma_flac*)pDataSource, pFramesOut, frameCount, pFramesRead);\n}\n\nstatic ma_result ma_flac_ds_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    return ma_flac_seek_to_pcm_frame((ma_flac*)pDataSource, frameIndex);\n}\n\nstatic ma_result ma_flac_ds_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    return ma_flac_get_data_format((ma_flac*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap);\n}\n\nstatic ma_result ma_flac_ds_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)\n{\n    return ma_flac_get_cursor_in_pcm_frames((ma_flac*)pDataSource, pCursor);\n}\n\nstatic ma_result ma_flac_ds_get_length(ma_data_source* pDataSource, ma_uint64* pLength)\n{\n    return ma_flac_get_length_in_pcm_frames((ma_flac*)pDataSource, pLength);\n}\n\nstatic ma_data_source_vtable g_ma_flac_ds_vtable =\n{\n    ma_flac_ds_read,\n    ma_flac_ds_seek,\n    ma_flac_ds_get_data_format,\n    ma_flac_ds_get_cursor,\n    ma_flac_ds_get_length,\n    NULL,   /* onSetLooping */\n    0\n};\n\n\n#if !defined(MA_NO_FLAC)\nstatic size_t ma_flac_dr_callback__read(void* pUserData, void* pBufferOut, size_t bytesToRead)\n{\n    ma_flac* pFlac = (ma_flac*)pUserData;\n    ma_result result;\n    size_t bytesRead;\n\n    MA_ASSERT(pFlac != NULL);\n\n    result = pFlac->onRead(pFlac->pReadSeekTellUserData, pBufferOut, bytesToRead, &bytesRead);\n    (void)result;\n\n    return bytesRead;\n}\n\nstatic ma_bool32 ma_flac_dr_callback__seek(void* pUserData, int offset, ma_dr_flac_seek_origin origin)\n{\n    ma_flac* pFlac = (ma_flac*)pUserData;\n    ma_result result;\n    ma_seek_origin maSeekOrigin;\n\n    MA_ASSERT(pFlac != NULL);\n\n    maSeekOrigin = ma_seek_origin_start;\n    if (origin == ma_dr_flac_seek_origin_current) {\n        maSeekOrigin =  ma_seek_origin_current;\n    }\n\n    result = pFlac->onSeek(pFlac->pReadSeekTellUserData, offset, maSeekOrigin);\n    if (result != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n\n    return MA_TRUE;\n}\n#endif\n\nstatic ma_result ma_flac_init_internal(const ma_decoding_backend_config* pConfig, ma_flac* pFlac)\n{\n    ma_result result;\n    ma_data_source_config dataSourceConfig;\n\n    if (pFlac == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pFlac);\n    pFlac->format = ma_format_f32;    /* f32 by default. */\n\n    if (pConfig != NULL && (pConfig->preferredFormat == ma_format_f32 || pConfig->preferredFormat == ma_format_s16 || pConfig->preferredFormat == ma_format_s32)) {\n        pFlac->format = pConfig->preferredFormat;\n    } else {\n        /* Getting here means something other than f32 and s16 was specified. Just leave this unset to use the default format. */\n    }\n\n    dataSourceConfig = ma_data_source_config_init();\n    dataSourceConfig.vtable = &g_ma_flac_ds_vtable;\n\n    result = ma_data_source_init(&dataSourceConfig, &pFlac->ds);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to initialize the base data source. */\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_flac_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac)\n{\n    ma_result result;\n\n    result = ma_flac_init_internal(pConfig, pFlac);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (onRead == NULL || onSeek == NULL) {\n        return MA_INVALID_ARGS; /* onRead and onSeek are mandatory. */\n    }\n\n    pFlac->onRead = onRead;\n    pFlac->onSeek = onSeek;\n    pFlac->onTell = onTell;\n    pFlac->pReadSeekTellUserData = pReadSeekTellUserData;\n\n    #if !defined(MA_NO_FLAC)\n    {\n        pFlac->dr = ma_dr_flac_open(ma_flac_dr_callback__read, ma_flac_dr_callback__seek, pFlac, pAllocationCallbacks);\n        if (pFlac->dr == NULL) {\n            return MA_INVALID_FILE;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* flac is disabled. */\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_flac_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac)\n{\n    ma_result result;\n\n    result = ma_flac_init_internal(pConfig, pFlac);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    #if !defined(MA_NO_FLAC)\n    {\n        pFlac->dr = ma_dr_flac_open_file(pFilePath, pAllocationCallbacks);\n        if (pFlac->dr == NULL) {\n            return MA_INVALID_FILE;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* flac is disabled. */\n        (void)pFilePath;\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_flac_init_file_w(const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac)\n{\n    ma_result result;\n\n    result = ma_flac_init_internal(pConfig, pFlac);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    #if !defined(MA_NO_FLAC)\n    {\n        pFlac->dr = ma_dr_flac_open_file_w(pFilePath, pAllocationCallbacks);\n        if (pFlac->dr == NULL) {\n            return MA_INVALID_FILE;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* flac is disabled. */\n        (void)pFilePath;\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_flac_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_flac* pFlac)\n{\n    ma_result result;\n\n    result = ma_flac_init_internal(pConfig, pFlac);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    #if !defined(MA_NO_FLAC)\n    {\n        pFlac->dr = ma_dr_flac_open_memory(pData, dataSize, pAllocationCallbacks);\n        if (pFlac->dr == NULL) {\n            return MA_INVALID_FILE;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* flac is disabled. */\n        (void)pData;\n        (void)dataSize;\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API void ma_flac_uninit(ma_flac* pFlac, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pFlac == NULL) {\n        return;\n    }\n\n    (void)pAllocationCallbacks;\n\n    #if !defined(MA_NO_FLAC)\n    {\n        ma_dr_flac_close(pFlac->dr);\n    }\n    #else\n    {\n        /* flac is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n    }\n    #endif\n\n    ma_data_source_uninit(&pFlac->ds);\n}\n\nMA_API ma_result ma_flac_read_pcm_frames(ma_flac* pFlac, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    if (frameCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pFlac == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_FLAC)\n    {\n        /* We always use floating point format. */\n        ma_result result = MA_SUCCESS;  /* Must be initialized to MA_SUCCESS. */\n        ma_uint64 totalFramesRead = 0;\n        ma_format format;\n\n        ma_flac_get_data_format(pFlac, &format, NULL, NULL, NULL, 0);\n\n        switch (format)\n        {\n            case ma_format_f32:\n            {\n                totalFramesRead = ma_dr_flac_read_pcm_frames_f32(pFlac->dr, frameCount, (float*)pFramesOut);\n            } break;\n\n            case ma_format_s16:\n            {\n                totalFramesRead = ma_dr_flac_read_pcm_frames_s16(pFlac->dr, frameCount, (ma_int16*)pFramesOut);\n            } break;\n\n            case ma_format_s32:\n            {\n                totalFramesRead = ma_dr_flac_read_pcm_frames_s32(pFlac->dr, frameCount, (ma_int32*)pFramesOut);\n            } break;\n\n            case ma_format_u8:\n            case ma_format_s24:\n            case ma_format_unknown:\n            default:\n            {\n                return MA_INVALID_OPERATION;\n            };\n        }\n\n        /* In the future we'll update ma_dr_flac to return MA_AT_END for us. */\n        if (totalFramesRead == 0) {\n            result = MA_AT_END;\n        }\n\n        if (pFramesRead != NULL) {\n            *pFramesRead = totalFramesRead;\n        }\n\n        if (result == MA_SUCCESS && totalFramesRead == 0) {\n            result  = MA_AT_END;\n        }\n\n        return result;\n    }\n    #else\n    {\n        /* flac is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n\n        (void)pFramesOut;\n        (void)frameCount;\n        (void)pFramesRead;\n\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_flac_seek_to_pcm_frame(ma_flac* pFlac, ma_uint64 frameIndex)\n{\n    if (pFlac == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_FLAC)\n    {\n        ma_bool32 flacResult;\n\n        flacResult = ma_dr_flac_seek_to_pcm_frame(pFlac->dr, frameIndex);\n        if (flacResult != MA_TRUE) {\n            return MA_ERROR;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* flac is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n\n        (void)frameIndex;\n\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_flac_get_data_format(ma_flac* pFlac, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    /* Defaults for safety. */\n    if (pFormat != NULL) {\n        *pFormat = ma_format_unknown;\n    }\n    if (pChannels != NULL) {\n        *pChannels = 0;\n    }\n    if (pSampleRate != NULL) {\n        *pSampleRate = 0;\n    }\n    if (pChannelMap != NULL) {\n        MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap);\n    }\n\n    if (pFlac == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    if (pFormat != NULL) {\n        *pFormat = pFlac->format;\n    }\n\n    #if !defined(MA_NO_FLAC)\n    {\n        if (pChannels != NULL) {\n            *pChannels = pFlac->dr->channels;\n        }\n\n        if (pSampleRate != NULL) {\n            *pSampleRate = pFlac->dr->sampleRate;\n        }\n\n        if (pChannelMap != NULL) {\n            ma_channel_map_init_standard(ma_standard_channel_map_microsoft, pChannelMap, channelMapCap, pFlac->dr->channels);\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* flac is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_flac_get_cursor_in_pcm_frames(ma_flac* pFlac, ma_uint64* pCursor)\n{\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;   /* Safety. */\n\n    if (pFlac == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_FLAC)\n    {\n        *pCursor = pFlac->dr->currentPCMFrame;\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* flac is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_flac_get_length_in_pcm_frames(ma_flac* pFlac, ma_uint64* pLength)\n{\n    if (pLength == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pLength = 0;   /* Safety. */\n\n    if (pFlac == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_FLAC)\n    {\n        *pLength = pFlac->dr->totalPCMFrameCount;\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* flac is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\n\nstatic ma_result ma_decoding_backend_init__flac(void* pUserData, ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_flac* pFlac;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pFlac = (ma_flac*)ma_malloc(sizeof(*pFlac), pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_flac_init(onRead, onSeek, onTell, pReadSeekTellUserData, pConfig, pAllocationCallbacks, pFlac);\n    if (result != MA_SUCCESS) {\n        ma_free(pFlac, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pFlac;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoding_backend_init_file__flac(void* pUserData, const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_flac* pFlac;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pFlac = (ma_flac*)ma_malloc(sizeof(*pFlac), pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_flac_init_file(pFilePath, pConfig, pAllocationCallbacks, pFlac);\n    if (result != MA_SUCCESS) {\n        ma_free(pFlac, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pFlac;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoding_backend_init_file_w__flac(void* pUserData, const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_flac* pFlac;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pFlac = (ma_flac*)ma_malloc(sizeof(*pFlac), pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_flac_init_file_w(pFilePath, pConfig, pAllocationCallbacks, pFlac);\n    if (result != MA_SUCCESS) {\n        ma_free(pFlac, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pFlac;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoding_backend_init_memory__flac(void* pUserData, const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_flac* pFlac;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pFlac = (ma_flac*)ma_malloc(sizeof(*pFlac), pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_flac_init_memory(pData, dataSize, pConfig, pAllocationCallbacks, pFlac);\n    if (result != MA_SUCCESS) {\n        ma_free(pFlac, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pFlac;\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_decoding_backend_uninit__flac(void* pUserData, ma_data_source* pBackend, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_flac* pFlac = (ma_flac*)pBackend;\n\n    (void)pUserData;\n\n    ma_flac_uninit(pFlac, pAllocationCallbacks);\n    ma_free(pFlac, pAllocationCallbacks);\n}\n\nstatic ma_decoding_backend_vtable g_ma_decoding_backend_vtable_flac =\n{\n    ma_decoding_backend_init__flac,\n    ma_decoding_backend_init_file__flac,\n    ma_decoding_backend_init_file_w__flac,\n    ma_decoding_backend_init_memory__flac,\n    ma_decoding_backend_uninit__flac\n};\n\nstatic ma_result ma_decoder_init_flac__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_vtable__internal(&g_ma_decoding_backend_vtable_flac, NULL, pConfig, pDecoder);\n}\n\nstatic ma_result ma_decoder_init_flac_from_file__internal(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_file__internal(&g_ma_decoding_backend_vtable_flac, NULL, pFilePath, pConfig, pDecoder);\n}\n\nstatic ma_result ma_decoder_init_flac_from_file_w__internal(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_file_w__internal(&g_ma_decoding_backend_vtable_flac, NULL, pFilePath, pConfig, pDecoder);\n}\n\nstatic ma_result ma_decoder_init_flac_from_memory__internal(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_memory__internal(&g_ma_decoding_backend_vtable_flac, NULL, pData, dataSize, pConfig, pDecoder);\n}\n#endif  /* ma_dr_flac_h */\n\n/* MP3 */\n#ifdef ma_dr_mp3_h\n#define MA_HAS_MP3\n\ntypedef struct\n{\n    ma_data_source_base ds;\n    ma_read_proc onRead;\n    ma_seek_proc onSeek;\n    ma_tell_proc onTell;\n    void* pReadSeekTellUserData;\n    ma_format format;           /* Can be f32 or s16. */\n#if !defined(MA_NO_MP3)\n    ma_dr_mp3 dr;\n    ma_uint32 seekPointCount;\n    ma_dr_mp3_seek_point* pSeekPoints;  /* Only used if seek table generation is used. */\n#endif\n} ma_mp3;\n\nMA_API ma_result ma_mp3_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3);\nMA_API ma_result ma_mp3_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3);\nMA_API ma_result ma_mp3_init_file_w(const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3);\nMA_API ma_result ma_mp3_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3);\nMA_API void ma_mp3_uninit(ma_mp3* pMP3, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_mp3_read_pcm_frames(ma_mp3* pMP3, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\nMA_API ma_result ma_mp3_seek_to_pcm_frame(ma_mp3* pMP3, ma_uint64 frameIndex);\nMA_API ma_result ma_mp3_get_data_format(ma_mp3* pMP3, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);\nMA_API ma_result ma_mp3_get_cursor_in_pcm_frames(ma_mp3* pMP3, ma_uint64* pCursor);\nMA_API ma_result ma_mp3_get_length_in_pcm_frames(ma_mp3* pMP3, ma_uint64* pLength);\n\n\nstatic ma_result ma_mp3_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    return ma_mp3_read_pcm_frames((ma_mp3*)pDataSource, pFramesOut, frameCount, pFramesRead);\n}\n\nstatic ma_result ma_mp3_ds_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    return ma_mp3_seek_to_pcm_frame((ma_mp3*)pDataSource, frameIndex);\n}\n\nstatic ma_result ma_mp3_ds_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    return ma_mp3_get_data_format((ma_mp3*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap);\n}\n\nstatic ma_result ma_mp3_ds_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)\n{\n    return ma_mp3_get_cursor_in_pcm_frames((ma_mp3*)pDataSource, pCursor);\n}\n\nstatic ma_result ma_mp3_ds_get_length(ma_data_source* pDataSource, ma_uint64* pLength)\n{\n    return ma_mp3_get_length_in_pcm_frames((ma_mp3*)pDataSource, pLength);\n}\n\nstatic ma_data_source_vtable g_ma_mp3_ds_vtable =\n{\n    ma_mp3_ds_read,\n    ma_mp3_ds_seek,\n    ma_mp3_ds_get_data_format,\n    ma_mp3_ds_get_cursor,\n    ma_mp3_ds_get_length,\n    NULL,   /* onSetLooping */\n    0\n};\n\n\n#if !defined(MA_NO_MP3)\nstatic size_t ma_mp3_dr_callback__read(void* pUserData, void* pBufferOut, size_t bytesToRead)\n{\n    ma_mp3* pMP3 = (ma_mp3*)pUserData;\n    ma_result result;\n    size_t bytesRead;\n\n    MA_ASSERT(pMP3 != NULL);\n\n    result = pMP3->onRead(pMP3->pReadSeekTellUserData, pBufferOut, bytesToRead, &bytesRead);\n    (void)result;\n\n    return bytesRead;\n}\n\nstatic ma_bool32 ma_mp3_dr_callback__seek(void* pUserData, int offset, ma_dr_mp3_seek_origin origin)\n{\n    ma_mp3* pMP3 = (ma_mp3*)pUserData;\n    ma_result result;\n    ma_seek_origin maSeekOrigin;\n\n    MA_ASSERT(pMP3 != NULL);\n\n    maSeekOrigin = ma_seek_origin_start;\n    if (origin == ma_dr_mp3_seek_origin_current) {\n        maSeekOrigin =  ma_seek_origin_current;\n    }\n\n    result = pMP3->onSeek(pMP3->pReadSeekTellUserData, offset, maSeekOrigin);\n    if (result != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n\n    return MA_TRUE;\n}\n#endif\n\nstatic ma_result ma_mp3_init_internal(const ma_decoding_backend_config* pConfig, ma_mp3* pMP3)\n{\n    ma_result result;\n    ma_data_source_config dataSourceConfig;\n\n    if (pMP3 == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pMP3);\n    pMP3->format = ma_format_f32;    /* f32 by default. */\n\n    if (pConfig != NULL && (pConfig->preferredFormat == ma_format_f32 || pConfig->preferredFormat == ma_format_s16)) {\n        pMP3->format = pConfig->preferredFormat;\n    } else {\n        /* Getting here means something other than f32 and s16 was specified. Just leave this unset to use the default format. */\n    }\n\n    dataSourceConfig = ma_data_source_config_init();\n    dataSourceConfig.vtable = &g_ma_mp3_ds_vtable;\n\n    result = ma_data_source_init(&dataSourceConfig, &pMP3->ds);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to initialize the base data source. */\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_mp3_generate_seek_table(ma_mp3* pMP3, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_bool32 mp3Result;\n    ma_uint32 seekPointCount = 0;\n    ma_dr_mp3_seek_point* pSeekPoints = NULL;\n\n    MA_ASSERT(pMP3    != NULL);\n    MA_ASSERT(pConfig != NULL);\n\n    seekPointCount = pConfig->seekPointCount;\n    if (seekPointCount > 0) {\n        pSeekPoints = (ma_dr_mp3_seek_point*)ma_malloc(sizeof(*pMP3->pSeekPoints) * seekPointCount, pAllocationCallbacks);\n        if (pSeekPoints == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    }\n\n    mp3Result = ma_dr_mp3_calculate_seek_points(&pMP3->dr, &seekPointCount, pSeekPoints);\n    if (mp3Result != MA_TRUE) {\n        ma_free(pSeekPoints, pAllocationCallbacks);\n        return MA_ERROR;\n    }\n\n    mp3Result = ma_dr_mp3_bind_seek_table(&pMP3->dr, seekPointCount, pSeekPoints);\n    if (mp3Result != MA_TRUE) {\n        ma_free(pSeekPoints, pAllocationCallbacks);\n        return MA_ERROR;\n    }\n\n    pMP3->seekPointCount = seekPointCount;\n    pMP3->pSeekPoints    = pSeekPoints;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_mp3_post_init(ma_mp3* pMP3, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_result result;\n\n    result = ma_mp3_generate_seek_table(pMP3, pConfig, pAllocationCallbacks);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_mp3_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3)\n{\n    ma_result result;\n\n    result = ma_mp3_init_internal(pConfig, pMP3);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (onRead == NULL || onSeek == NULL) {\n        return MA_INVALID_ARGS; /* onRead and onSeek are mandatory. */\n    }\n\n    pMP3->onRead = onRead;\n    pMP3->onSeek = onSeek;\n    pMP3->onTell = onTell;\n    pMP3->pReadSeekTellUserData = pReadSeekTellUserData;\n\n    #if !defined(MA_NO_MP3)\n    {\n        ma_bool32 mp3Result;\n\n        mp3Result = ma_dr_mp3_init(&pMP3->dr, ma_mp3_dr_callback__read, ma_mp3_dr_callback__seek, pMP3, pAllocationCallbacks);\n        if (mp3Result != MA_TRUE) {\n            return MA_INVALID_FILE;\n        }\n\n        ma_mp3_post_init(pMP3, pConfig, pAllocationCallbacks);\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* mp3 is disabled. */\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_mp3_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3)\n{\n    ma_result result;\n\n    result = ma_mp3_init_internal(pConfig, pMP3);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    #if !defined(MA_NO_MP3)\n    {\n        ma_bool32 mp3Result;\n\n        mp3Result = ma_dr_mp3_init_file(&pMP3->dr, pFilePath, pAllocationCallbacks);\n        if (mp3Result != MA_TRUE) {\n            return MA_INVALID_FILE;\n        }\n\n        ma_mp3_post_init(pMP3, pConfig, pAllocationCallbacks);\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* mp3 is disabled. */\n        (void)pFilePath;\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_mp3_init_file_w(const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3)\n{\n    ma_result result;\n\n    result = ma_mp3_init_internal(pConfig, pMP3);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    #if !defined(MA_NO_MP3)\n    {\n        ma_bool32 mp3Result;\n\n        mp3Result = ma_dr_mp3_init_file_w(&pMP3->dr, pFilePath, pAllocationCallbacks);\n        if (mp3Result != MA_TRUE) {\n            return MA_INVALID_FILE;\n        }\n\n        ma_mp3_post_init(pMP3, pConfig, pAllocationCallbacks);\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* mp3 is disabled. */\n        (void)pFilePath;\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_mp3_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_mp3* pMP3)\n{\n    ma_result result;\n\n    result = ma_mp3_init_internal(pConfig, pMP3);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    #if !defined(MA_NO_MP3)\n    {\n        ma_bool32 mp3Result;\n\n        mp3Result = ma_dr_mp3_init_memory(&pMP3->dr, pData, dataSize, pAllocationCallbacks);\n        if (mp3Result != MA_TRUE) {\n            return MA_INVALID_FILE;\n        }\n\n        ma_mp3_post_init(pMP3, pConfig, pAllocationCallbacks);\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* mp3 is disabled. */\n        (void)pData;\n        (void)dataSize;\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API void ma_mp3_uninit(ma_mp3* pMP3, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pMP3 == NULL) {\n        return;\n    }\n\n    #if !defined(MA_NO_MP3)\n    {\n        ma_dr_mp3_uninit(&pMP3->dr);\n    }\n    #else\n    {\n        /* mp3 is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n    }\n    #endif\n\n    /* Seek points need to be freed after the MP3 decoder has been uninitialized to ensure they're no longer being referenced. */\n    ma_free(pMP3->pSeekPoints, pAllocationCallbacks);\n\n    ma_data_source_uninit(&pMP3->ds);\n}\n\nMA_API ma_result ma_mp3_read_pcm_frames(ma_mp3* pMP3, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    if (frameCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pMP3 == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_MP3)\n    {\n        /* We always use floating point format. */\n        ma_result result = MA_SUCCESS;  /* Must be initialized to MA_SUCCESS. */\n        ma_uint64 totalFramesRead = 0;\n        ma_format format;\n\n        ma_mp3_get_data_format(pMP3, &format, NULL, NULL, NULL, 0);\n\n        switch (format)\n        {\n            case ma_format_f32:\n            {\n                totalFramesRead = ma_dr_mp3_read_pcm_frames_f32(&pMP3->dr, frameCount, (float*)pFramesOut);\n            } break;\n\n            case ma_format_s16:\n            {\n                totalFramesRead = ma_dr_mp3_read_pcm_frames_s16(&pMP3->dr, frameCount, (ma_int16*)pFramesOut);\n            } break;\n\n            case ma_format_u8:\n            case ma_format_s24:\n            case ma_format_s32:\n            case ma_format_unknown:\n            default:\n            {\n                return MA_INVALID_OPERATION;\n            };\n        }\n\n        /* In the future we'll update ma_dr_mp3 to return MA_AT_END for us. */\n        if (totalFramesRead == 0) {\n            result = MA_AT_END;\n        }\n\n        if (pFramesRead != NULL) {\n            *pFramesRead = totalFramesRead;\n        }\n\n        return result;\n    }\n    #else\n    {\n        /* mp3 is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n\n        (void)pFramesOut;\n        (void)frameCount;\n        (void)pFramesRead;\n\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_mp3_seek_to_pcm_frame(ma_mp3* pMP3, ma_uint64 frameIndex)\n{\n    if (pMP3 == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_MP3)\n    {\n        ma_bool32 mp3Result;\n\n        mp3Result = ma_dr_mp3_seek_to_pcm_frame(&pMP3->dr, frameIndex);\n        if (mp3Result != MA_TRUE) {\n            return MA_ERROR;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* mp3 is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n\n        (void)frameIndex;\n\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_mp3_get_data_format(ma_mp3* pMP3, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    /* Defaults for safety. */\n    if (pFormat != NULL) {\n        *pFormat = ma_format_unknown;\n    }\n    if (pChannels != NULL) {\n        *pChannels = 0;\n    }\n    if (pSampleRate != NULL) {\n        *pSampleRate = 0;\n    }\n    if (pChannelMap != NULL) {\n        MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap);\n    }\n\n    if (pMP3 == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    if (pFormat != NULL) {\n        *pFormat = pMP3->format;\n    }\n\n    #if !defined(MA_NO_MP3)\n    {\n        if (pChannels != NULL) {\n            *pChannels = pMP3->dr.channels;\n        }\n\n        if (pSampleRate != NULL) {\n            *pSampleRate = pMP3->dr.sampleRate;\n        }\n\n        if (pChannelMap != NULL) {\n            ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pMP3->dr.channels);\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* mp3 is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_mp3_get_cursor_in_pcm_frames(ma_mp3* pMP3, ma_uint64* pCursor)\n{\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;   /* Safety. */\n\n    if (pMP3 == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_MP3)\n    {\n        *pCursor = pMP3->dr.currentPCMFrame;\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* mp3 is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_mp3_get_length_in_pcm_frames(ma_mp3* pMP3, ma_uint64* pLength)\n{\n    if (pLength == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pLength = 0;   /* Safety. */\n\n    if (pMP3 == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_MP3)\n    {\n        *pLength = ma_dr_mp3_get_pcm_frame_count(&pMP3->dr);\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* mp3 is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\n\nstatic ma_result ma_decoding_backend_init__mp3(void* pUserData, ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_mp3* pMP3;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pMP3 = (ma_mp3*)ma_malloc(sizeof(*pMP3), pAllocationCallbacks);\n    if (pMP3 == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_mp3_init(onRead, onSeek, onTell, pReadSeekTellUserData, pConfig, pAllocationCallbacks, pMP3);\n    if (result != MA_SUCCESS) {\n        ma_free(pMP3, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pMP3;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoding_backend_init_file__mp3(void* pUserData, const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_mp3* pMP3;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pMP3 = (ma_mp3*)ma_malloc(sizeof(*pMP3), pAllocationCallbacks);\n    if (pMP3 == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_mp3_init_file(pFilePath, pConfig, pAllocationCallbacks, pMP3);\n    if (result != MA_SUCCESS) {\n        ma_free(pMP3, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pMP3;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoding_backend_init_file_w__mp3(void* pUserData, const wchar_t* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_mp3* pMP3;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pMP3 = (ma_mp3*)ma_malloc(sizeof(*pMP3), pAllocationCallbacks);\n    if (pMP3 == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_mp3_init_file_w(pFilePath, pConfig, pAllocationCallbacks, pMP3);\n    if (result != MA_SUCCESS) {\n        ma_free(pMP3, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pMP3;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoding_backend_init_memory__mp3(void* pUserData, const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_mp3* pMP3;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pMP3 = (ma_mp3*)ma_malloc(sizeof(*pMP3), pAllocationCallbacks);\n    if (pMP3 == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_mp3_init_memory(pData, dataSize, pConfig, pAllocationCallbacks, pMP3);\n    if (result != MA_SUCCESS) {\n        ma_free(pMP3, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pMP3;\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_decoding_backend_uninit__mp3(void* pUserData, ma_data_source* pBackend, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_mp3* pMP3 = (ma_mp3*)pBackend;\n\n    (void)pUserData;\n\n    ma_mp3_uninit(pMP3, pAllocationCallbacks);\n    ma_free(pMP3, pAllocationCallbacks);\n}\n\nstatic ma_decoding_backend_vtable g_ma_decoding_backend_vtable_mp3 =\n{\n    ma_decoding_backend_init__mp3,\n    ma_decoding_backend_init_file__mp3,\n    ma_decoding_backend_init_file_w__mp3,\n    ma_decoding_backend_init_memory__mp3,\n    ma_decoding_backend_uninit__mp3\n};\n\nstatic ma_result ma_decoder_init_mp3__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_vtable__internal(&g_ma_decoding_backend_vtable_mp3, NULL, pConfig, pDecoder);\n}\n\nstatic ma_result ma_decoder_init_mp3_from_file__internal(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_file__internal(&g_ma_decoding_backend_vtable_mp3, NULL, pFilePath, pConfig, pDecoder);\n}\n\nstatic ma_result ma_decoder_init_mp3_from_file_w__internal(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_file_w__internal(&g_ma_decoding_backend_vtable_mp3, NULL, pFilePath, pConfig, pDecoder);\n}\n\nstatic ma_result ma_decoder_init_mp3_from_memory__internal(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_memory__internal(&g_ma_decoding_backend_vtable_mp3, NULL, pData, dataSize, pConfig, pDecoder);\n}\n#endif  /* ma_dr_mp3_h */\n\n/* Vorbis */\n#ifdef STB_VORBIS_INCLUDE_STB_VORBIS_H\n#define MA_HAS_VORBIS\n\n/* The size in bytes of each chunk of data to read from the Vorbis stream. */\n#define MA_VORBIS_DATA_CHUNK_SIZE  4096\n\ntypedef struct\n{\n    ma_data_source_base ds;\n    ma_read_proc onRead;\n    ma_seek_proc onSeek;\n    ma_tell_proc onTell;\n    void* pReadSeekTellUserData;\n    ma_allocation_callbacks allocationCallbacks;    /* Store the allocation callbacks within the structure because we may need to dynamically expand a buffer in ma_stbvorbis_read_pcm_frames() when using push mode. */\n    ma_format format;               /* Only f32 is allowed with stb_vorbis. */\n    ma_uint32 channels;\n    ma_uint32 sampleRate;\n    ma_uint64 cursor;\n#if !defined(MA_NO_VORBIS)\n    stb_vorbis* stb;\n    ma_bool32 usingPushMode;\n    struct\n    {\n        ma_uint8* pData;\n        size_t dataSize;\n        size_t dataCapacity;\n        size_t audioStartOffsetInBytes;\n        ma_uint32 framesConsumed;   /* The number of frames consumed in ppPacketData. */\n        ma_uint32 framesRemaining;  /* The number of frames remaining in ppPacketData. */\n        float** ppPacketData;\n    } push;\n#endif\n} ma_stbvorbis;\n\nMA_API ma_result ma_stbvorbis_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_stbvorbis* pVorbis);\nMA_API ma_result ma_stbvorbis_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_stbvorbis* pVorbis);\nMA_API ma_result ma_stbvorbis_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_stbvorbis* pVorbis);\nMA_API void ma_stbvorbis_uninit(ma_stbvorbis* pVorbis, const ma_allocation_callbacks* pAllocationCallbacks);\nMA_API ma_result ma_stbvorbis_read_pcm_frames(ma_stbvorbis* pVorbis, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead);\nMA_API ma_result ma_stbvorbis_seek_to_pcm_frame(ma_stbvorbis* pVorbis, ma_uint64 frameIndex);\nMA_API ma_result ma_stbvorbis_get_data_format(ma_stbvorbis* pVorbis, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap);\nMA_API ma_result ma_stbvorbis_get_cursor_in_pcm_frames(ma_stbvorbis* pVorbis, ma_uint64* pCursor);\nMA_API ma_result ma_stbvorbis_get_length_in_pcm_frames(ma_stbvorbis* pVorbis, ma_uint64* pLength);\n\n\nstatic ma_result ma_stbvorbis_ds_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    return ma_stbvorbis_read_pcm_frames((ma_stbvorbis*)pDataSource, pFramesOut, frameCount, pFramesRead);\n}\n\nstatic ma_result ma_stbvorbis_ds_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    return ma_stbvorbis_seek_to_pcm_frame((ma_stbvorbis*)pDataSource, frameIndex);\n}\n\nstatic ma_result ma_stbvorbis_ds_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    return ma_stbvorbis_get_data_format((ma_stbvorbis*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap);\n}\n\nstatic ma_result ma_stbvorbis_ds_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)\n{\n    return ma_stbvorbis_get_cursor_in_pcm_frames((ma_stbvorbis*)pDataSource, pCursor);\n}\n\nstatic ma_result ma_stbvorbis_ds_get_length(ma_data_source* pDataSource, ma_uint64* pLength)\n{\n    return ma_stbvorbis_get_length_in_pcm_frames((ma_stbvorbis*)pDataSource, pLength);\n}\n\nstatic ma_data_source_vtable g_ma_stbvorbis_ds_vtable =\n{\n    ma_stbvorbis_ds_read,\n    ma_stbvorbis_ds_seek,\n    ma_stbvorbis_ds_get_data_format,\n    ma_stbvorbis_ds_get_cursor,\n    ma_stbvorbis_ds_get_length,\n    NULL,   /* onSetLooping */\n    0\n};\n\n\nstatic ma_result ma_stbvorbis_init_internal(const ma_decoding_backend_config* pConfig, ma_stbvorbis* pVorbis)\n{\n    ma_result result;\n    ma_data_source_config dataSourceConfig;\n\n    (void)pConfig;\n\n    if (pVorbis == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pVorbis);\n    pVorbis->format = ma_format_f32;    /* Only supporting f32. */\n\n    dataSourceConfig = ma_data_source_config_init();\n    dataSourceConfig.vtable = &g_ma_stbvorbis_ds_vtable;\n\n    result = ma_data_source_init(&dataSourceConfig, &pVorbis->ds);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to initialize the base data source. */\n    }\n\n    return MA_SUCCESS;\n}\n\n#if !defined(MA_NO_VORBIS)\nstatic ma_result ma_stbvorbis_post_init(ma_stbvorbis* pVorbis)\n{\n    stb_vorbis_info info;\n\n    MA_ASSERT(pVorbis != NULL);\n\n    info = stb_vorbis_get_info(pVorbis->stb);\n\n    pVorbis->channels   = info.channels;\n    pVorbis->sampleRate = info.sample_rate;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_stbvorbis_init_internal_decoder_push(ma_stbvorbis* pVorbis)\n{\n    ma_result result;\n    stb_vorbis* stb;\n    size_t dataSize = 0;\n    size_t dataCapacity = 0;\n    ma_uint8* pData = NULL; /* <-- Must be initialized to NULL. */\n\n    for (;;) {\n        int vorbisError;\n        int consumedDataSize;   /* <-- Fill by stb_vorbis_open_pushdata(). */\n        size_t bytesRead;\n        ma_uint8* pNewData;\n\n        /* Allocate memory for the new chunk. */\n        dataCapacity += MA_VORBIS_DATA_CHUNK_SIZE;\n        pNewData = (ma_uint8*)ma_realloc(pData, dataCapacity, &pVorbis->allocationCallbacks);\n        if (pNewData == NULL) {\n            ma_free(pData, &pVorbis->allocationCallbacks);\n            return MA_OUT_OF_MEMORY;\n        }\n\n        pData = pNewData;\n\n        /* Read in the next chunk. */\n        result = pVorbis->onRead(pVorbis->pReadSeekTellUserData, ma_offset_ptr(pData, dataSize), (dataCapacity - dataSize), &bytesRead);\n        dataSize += bytesRead;\n\n        if (result != MA_SUCCESS) {\n            ma_free(pData, &pVorbis->allocationCallbacks);\n            return result;\n        }\n\n        /* We have a maximum of 31 bits with stb_vorbis. */\n        if (dataSize > INT_MAX) {\n            ma_free(pData, &pVorbis->allocationCallbacks);\n            return MA_TOO_BIG;\n        }\n\n        stb = stb_vorbis_open_pushdata(pData, (int)dataSize, &consumedDataSize, &vorbisError, NULL);\n        if (stb != NULL) {\n            /*\n            Successfully opened the Vorbis decoder. We might have some leftover unprocessed\n            data so we'll need to move that down to the front.\n            */\n            dataSize -= (size_t)consumedDataSize;   /* Consume the data. */\n            MA_MOVE_MEMORY(pData, ma_offset_ptr(pData, consumedDataSize), dataSize);\n\n            /*\n            We need to track the start point so we can seek back to the start of the audio\n            data when seeking.\n            */\n            pVorbis->push.audioStartOffsetInBytes = consumedDataSize;\n\n            break;\n        } else {\n            /* Failed to open the decoder. */\n            if (vorbisError == VORBIS_need_more_data) {\n                continue;\n            } else {\n                ma_free(pData, &pVorbis->allocationCallbacks);\n                return MA_ERROR;   /* Failed to open the stb_vorbis decoder. */\n            }\n        }\n    }\n\n    MA_ASSERT(stb != NULL);\n    pVorbis->stb = stb;\n    pVorbis->push.pData = pData;\n    pVorbis->push.dataSize = dataSize;\n    pVorbis->push.dataCapacity = dataCapacity;\n\n    return MA_SUCCESS;\n}\n#endif\n\nMA_API ma_result ma_stbvorbis_init(ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_stbvorbis* pVorbis)\n{\n    ma_result result;\n\n    result = ma_stbvorbis_init_internal(pConfig, pVorbis);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (onRead == NULL || onSeek == NULL) {\n        return MA_INVALID_ARGS; /* onRead and onSeek are mandatory. */\n    }\n\n    pVorbis->onRead = onRead;\n    pVorbis->onSeek = onSeek;\n    pVorbis->onTell = onTell;\n    pVorbis->pReadSeekTellUserData = pReadSeekTellUserData;\n    ma_allocation_callbacks_init_copy(&pVorbis->allocationCallbacks, pAllocationCallbacks);\n\n    #if !defined(MA_NO_VORBIS)\n    {\n        /*\n        stb_vorbis lacks a callback based API for it's pulling API which means we're stuck with the\n        pushing API. In order for us to be able to successfully initialize the decoder we need to\n        supply it with enough data. We need to keep loading data until we have enough.\n        */\n        result = ma_stbvorbis_init_internal_decoder_push(pVorbis);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pVorbis->usingPushMode = MA_TRUE;\n\n        result = ma_stbvorbis_post_init(pVorbis);\n        if (result != MA_SUCCESS) {\n            stb_vorbis_close(pVorbis->stb);\n            ma_free(pVorbis->push.pData, pAllocationCallbacks);\n            return result;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* vorbis is disabled. */\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_stbvorbis_init_file(const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_stbvorbis* pVorbis)\n{\n    ma_result result;\n\n    result = ma_stbvorbis_init_internal(pConfig, pVorbis);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    #if !defined(MA_NO_VORBIS)\n    {\n        (void)pAllocationCallbacks; /* Don't know how to make use of this with stb_vorbis. */\n\n        /* We can use stb_vorbis' pull mode for file based streams. */\n        pVorbis->stb = stb_vorbis_open_filename(pFilePath, NULL, NULL);\n        if (pVorbis->stb == NULL) {\n            return MA_INVALID_FILE;\n        }\n\n        pVorbis->usingPushMode = MA_FALSE;\n\n        result = ma_stbvorbis_post_init(pVorbis);\n        if (result != MA_SUCCESS) {\n            stb_vorbis_close(pVorbis->stb);\n            return result;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* vorbis is disabled. */\n        (void)pFilePath;\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_stbvorbis_init_memory(const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_stbvorbis* pVorbis)\n{\n    ma_result result;\n\n    result = ma_stbvorbis_init_internal(pConfig, pVorbis);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    #if !defined(MA_NO_VORBIS)\n    {\n        (void)pAllocationCallbacks;\n\n        /* stb_vorbis uses an int as it's size specifier, restricting it to 32-bit even on 64-bit systems. *sigh*. */\n        if (dataSize > INT_MAX) {\n            return MA_TOO_BIG;\n        }\n\n        pVorbis->stb = stb_vorbis_open_memory((const unsigned char*)pData, (int)dataSize, NULL, NULL);\n        if (pVorbis->stb == NULL) {\n            return MA_INVALID_FILE;\n        }\n\n        pVorbis->usingPushMode = MA_FALSE;\n\n        result = ma_stbvorbis_post_init(pVorbis);\n        if (result != MA_SUCCESS) {\n            stb_vorbis_close(pVorbis->stb);\n            return result;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* vorbis is disabled. */\n        (void)pData;\n        (void)dataSize;\n        (void)pAllocationCallbacks;\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API void ma_stbvorbis_uninit(ma_stbvorbis* pVorbis, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pVorbis == NULL) {\n        return;\n    }\n\n    #if !defined(MA_NO_VORBIS)\n    {\n        stb_vorbis_close(pVorbis->stb);\n\n        /* We'll have to clear some memory if we're using push mode. */\n        if (pVorbis->usingPushMode) {\n            ma_free(pVorbis->push.pData, pAllocationCallbacks);\n        }\n    }\n    #else\n    {\n        /* vorbis is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n    }\n    #endif\n\n    ma_data_source_uninit(&pVorbis->ds);\n}\n\nMA_API ma_result ma_stbvorbis_read_pcm_frames(ma_stbvorbis* pVorbis, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    if (frameCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pVorbis == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_VORBIS)\n    {\n        /* We always use floating point format. */\n        ma_result result = MA_SUCCESS;  /* Must be initialized to MA_SUCCESS. */\n        ma_uint64 totalFramesRead = 0;\n        ma_format format;\n        ma_uint32 channels;\n\n        ma_stbvorbis_get_data_format(pVorbis, &format, &channels, NULL, NULL, 0);\n\n        if (format == ma_format_f32) {\n            /* We read differently depending on whether or not we're using push mode. */\n            if (pVorbis->usingPushMode) {\n                /* Push mode. This is the complex case. */\n                float* pFramesOutF32 = (float*)pFramesOut;\n\n                while (totalFramesRead < frameCount) {\n                    /* The first thing to do is read from any already-cached frames. */\n                    ma_uint32 framesToReadFromCache = (ma_uint32)ma_min(pVorbis->push.framesRemaining, (frameCount - totalFramesRead));  /* Safe cast because pVorbis->framesRemaining is 32-bit. */\n\n                    /* The output pointer can be null in which case we just treate it as a seek. */\n                    if (pFramesOut != NULL) {\n                        ma_uint64 iFrame;\n                        for (iFrame = 0; iFrame < framesToReadFromCache; iFrame += 1) {\n                            ma_uint32 iChannel;\n                            for (iChannel = 0; iChannel < pVorbis->channels; iChannel += 1) {\n                                pFramesOutF32[iChannel] = pVorbis->push.ppPacketData[iChannel][pVorbis->push.framesConsumed + iFrame];\n                            }\n\n                            pFramesOutF32 += pVorbis->channels;\n                        }\n                    }\n\n                    /* Update pointers and counters. */\n                    pVorbis->push.framesConsumed  += framesToReadFromCache;\n                    pVorbis->push.framesRemaining -= framesToReadFromCache;\n                    totalFramesRead               += framesToReadFromCache;\n\n                    /* Don't bother reading any more frames right now if we've just finished loading. */\n                    if (totalFramesRead == frameCount) {\n                        break;\n                    }\n\n                    MA_ASSERT(pVorbis->push.framesRemaining == 0);\n\n                    /* Getting here means we've run out of cached frames. We'll need to load some more. */\n                    for (;;) {\n                        int samplesRead = 0;\n                        int consumedDataSize;\n\n                        /* We need to case dataSize to an int, so make sure we can do it safely. */\n                        if (pVorbis->push.dataSize > INT_MAX) {\n                            break;  /* Too big. */\n                        }\n\n                        consumedDataSize = stb_vorbis_decode_frame_pushdata(pVorbis->stb, pVorbis->push.pData, (int)pVorbis->push.dataSize, NULL, &pVorbis->push.ppPacketData, &samplesRead);\n                        if (consumedDataSize != 0) {\n                            /* Successfully decoded a Vorbis frame. Consume the data. */\n                            pVorbis->push.dataSize -= (size_t)consumedDataSize;\n                            MA_MOVE_MEMORY(pVorbis->push.pData, ma_offset_ptr(pVorbis->push.pData, consumedDataSize), pVorbis->push.dataSize);\n\n                            pVorbis->push.framesConsumed  = 0;\n                            pVorbis->push.framesRemaining = samplesRead;\n\n                            break;\n                        } else {\n                            /* Not enough data. Read more. */\n                            size_t bytesRead;\n\n                            /* Expand the data buffer if necessary. */\n                            if (pVorbis->push.dataCapacity == pVorbis->push.dataSize) {\n                                size_t newCap = pVorbis->push.dataCapacity + MA_VORBIS_DATA_CHUNK_SIZE;\n                                ma_uint8* pNewData;\n\n                                pNewData = (ma_uint8*)ma_realloc(pVorbis->push.pData, newCap, &pVorbis->allocationCallbacks);\n                                if (pNewData == NULL) {\n                                    result = MA_OUT_OF_MEMORY;\n                                    break;\n                                }\n\n                                pVorbis->push.pData = pNewData;\n                                pVorbis->push.dataCapacity = newCap;\n                            }\n\n                            /* We should have enough room to load some data. */\n                            result = pVorbis->onRead(pVorbis->pReadSeekTellUserData, ma_offset_ptr(pVorbis->push.pData, pVorbis->push.dataSize), (pVorbis->push.dataCapacity - pVorbis->push.dataSize), &bytesRead);\n                            pVorbis->push.dataSize += bytesRead;\n\n                            if (result != MA_SUCCESS) {\n                                break;  /* Failed to read any data. Get out. */\n                            }\n                        }\n                    }\n\n                    /* If we don't have a success code at this point it means we've encounted an error or the end of the file has been reached (probably the latter). */\n                    if (result != MA_SUCCESS) {\n                        break;\n                    }\n                }\n            } else {\n                /* Pull mode. This is the simple case, but we still need to run in a loop because stb_vorbis loves using 32-bit instead of 64-bit. */\n                while (totalFramesRead < frameCount) {\n                    ma_uint64 framesRemaining = (frameCount - totalFramesRead);\n                    int framesRead;\n\n                    if (framesRemaining > INT_MAX) {\n                        framesRemaining = INT_MAX;\n                    }\n\n                    framesRead = stb_vorbis_get_samples_float_interleaved(pVorbis->stb, channels, (float*)ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, format, channels), (int)framesRemaining * channels);   /* Safe cast. */\n                    totalFramesRead += framesRead;\n\n                    if (framesRead < (int)framesRemaining) {\n                        break;  /* Nothing left to read. Get out. */\n                    }\n                }\n            }\n        } else {\n            result = MA_INVALID_ARGS;\n        }\n\n        pVorbis->cursor += totalFramesRead;\n\n        if (totalFramesRead == 0) {\n            result = MA_AT_END;\n        }\n\n        if (pFramesRead != NULL) {\n            *pFramesRead = totalFramesRead;\n        }\n\n        if (result == MA_SUCCESS && totalFramesRead == 0) {\n            result  = MA_AT_END;\n        }\n\n        return result;\n    }\n    #else\n    {\n        /* vorbis is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n\n        (void)pFramesOut;\n        (void)frameCount;\n        (void)pFramesRead;\n\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_stbvorbis_seek_to_pcm_frame(ma_stbvorbis* pVorbis, ma_uint64 frameIndex)\n{\n    if (pVorbis == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_VORBIS)\n    {\n        /* Different seeking methods depending on whether or not we're using push mode. */\n        if (pVorbis->usingPushMode) {\n            /* Push mode. This is the complex case. */\n            ma_result result;\n            float buffer[4096];\n\n            /* If we're seeking backwards, we need to seek back to the start and then brute-force forward. */\n            if (frameIndex < pVorbis->cursor) {\n                if (frameIndex > 0x7FFFFFFF) {\n                    return MA_INVALID_ARGS; /* Trying to seek beyond the 32-bit maximum of stb_vorbis. */\n                }\n\n                /*\n                This is wildly inefficient due to me having trouble getting sample exact seeking working\n                robustly with stb_vorbis_flush_pushdata(). The only way I can think to make this work\n                perfectly is to reinitialize the decoder. Note that we only enter this path when seeking\n                backwards. This will hopefully be removed once we get our own Vorbis decoder implemented.\n                */\n                stb_vorbis_close(pVorbis->stb);\n                ma_free(pVorbis->push.pData, &pVorbis->allocationCallbacks);\n\n                MA_ZERO_OBJECT(&pVorbis->push);\n\n                /* Seek to the start of the file. */\n                result = pVorbis->onSeek(pVorbis->pReadSeekTellUserData, 0, ma_seek_origin_start);\n                if (result != MA_SUCCESS) {\n                    return result;\n                }\n\n                result = ma_stbvorbis_init_internal_decoder_push(pVorbis);\n                if (result != MA_SUCCESS) {\n                    return result;\n                }\n\n                /* At this point we should be sitting on the first frame. */\n                pVorbis->cursor = 0;\n            }\n\n            /* We're just brute-forcing this for now. */\n            while (pVorbis->cursor < frameIndex) {\n                ma_uint64 framesRead;\n                ma_uint64 framesToRead = ma_countof(buffer)/pVorbis->channels;\n                if (framesToRead > (frameIndex - pVorbis->cursor)) {\n                    framesToRead = (frameIndex - pVorbis->cursor);\n                }\n\n                result = ma_stbvorbis_read_pcm_frames(pVorbis, buffer, framesToRead, &framesRead);\n                if (result != MA_SUCCESS) {\n                    return result;\n                }\n            }\n        } else {\n            /* Pull mode. This is the simple case. */\n            int vorbisResult;\n\n            if (frameIndex > UINT_MAX) {\n                return MA_INVALID_ARGS; /* Trying to seek beyond the 32-bit maximum of stb_vorbis. */\n            }\n\n            vorbisResult = stb_vorbis_seek(pVorbis->stb, (unsigned int)frameIndex);  /* Safe cast. */\n            if (vorbisResult == 0) {\n                return MA_ERROR;    /* See failed. */\n            }\n\n            pVorbis->cursor = frameIndex;\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* vorbis is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n\n        (void)frameIndex;\n\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_stbvorbis_get_data_format(ma_stbvorbis* pVorbis, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    /* Defaults for safety. */\n    if (pFormat != NULL) {\n        *pFormat = ma_format_unknown;\n    }\n    if (pChannels != NULL) {\n        *pChannels = 0;\n    }\n    if (pSampleRate != NULL) {\n        *pSampleRate = 0;\n    }\n    if (pChannelMap != NULL) {\n        MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap);\n    }\n\n    if (pVorbis == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    if (pFormat != NULL) {\n        *pFormat = pVorbis->format;\n    }\n\n    #if !defined(MA_NO_VORBIS)\n    {\n        if (pChannels != NULL) {\n            *pChannels = pVorbis->channels;\n        }\n\n        if (pSampleRate != NULL) {\n            *pSampleRate = pVorbis->sampleRate;\n        }\n\n        if (pChannelMap != NULL) {\n            ma_channel_map_init_standard(ma_standard_channel_map_vorbis, pChannelMap, channelMapCap, pVorbis->channels);\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* vorbis is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_stbvorbis_get_cursor_in_pcm_frames(ma_stbvorbis* pVorbis, ma_uint64* pCursor)\n{\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;   /* Safety. */\n\n    if (pVorbis == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_VORBIS)\n    {\n        *pCursor = pVorbis->cursor;\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* vorbis is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\nMA_API ma_result ma_stbvorbis_get_length_in_pcm_frames(ma_stbvorbis* pVorbis, ma_uint64* pLength)\n{\n    if (pLength == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pLength = 0;   /* Safety. */\n\n    if (pVorbis == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_VORBIS)\n    {\n        if (pVorbis->usingPushMode) {\n            *pLength = 0;   /* I don't know of a good way to determine this reliably with stb_vorbis and push mode. */\n        } else {\n            *pLength = stb_vorbis_stream_length_in_samples(pVorbis->stb);\n        }\n\n        return MA_SUCCESS;\n    }\n    #else\n    {\n        /* vorbis is disabled. Should never hit this since initialization would have failed. */\n        MA_ASSERT(MA_FALSE);\n        return MA_NOT_IMPLEMENTED;\n    }\n    #endif\n}\n\n\nstatic ma_result ma_decoding_backend_init__stbvorbis(void* pUserData, ma_read_proc onRead, ma_seek_proc onSeek, ma_tell_proc onTell, void* pReadSeekTellUserData, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_stbvorbis* pVorbis;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pVorbis = (ma_stbvorbis*)ma_malloc(sizeof(*pVorbis), pAllocationCallbacks);\n    if (pVorbis == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_stbvorbis_init(onRead, onSeek, onTell, pReadSeekTellUserData, pConfig, pAllocationCallbacks, pVorbis);\n    if (result != MA_SUCCESS) {\n        ma_free(pVorbis, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pVorbis;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoding_backend_init_file__stbvorbis(void* pUserData, const char* pFilePath, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_stbvorbis* pVorbis;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pVorbis = (ma_stbvorbis*)ma_malloc(sizeof(*pVorbis), pAllocationCallbacks);\n    if (pVorbis == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_stbvorbis_init_file(pFilePath, pConfig, pAllocationCallbacks, pVorbis);\n    if (result != MA_SUCCESS) {\n        ma_free(pVorbis, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pVorbis;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoding_backend_init_memory__stbvorbis(void* pUserData, const void* pData, size_t dataSize, const ma_decoding_backend_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source** ppBackend)\n{\n    ma_result result;\n    ma_stbvorbis* pVorbis;\n\n    (void)pUserData;    /* For now not using pUserData, but once we start storing the vorbis decoder state within the ma_decoder structure this will be set to the decoder so we can avoid a malloc. */\n\n    /* For now we're just allocating the decoder backend on the heap. */\n    pVorbis = (ma_stbvorbis*)ma_malloc(sizeof(*pVorbis), pAllocationCallbacks);\n    if (pVorbis == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_stbvorbis_init_memory(pData, dataSize, pConfig, pAllocationCallbacks, pVorbis);\n    if (result != MA_SUCCESS) {\n        ma_free(pVorbis, pAllocationCallbacks);\n        return result;\n    }\n\n    *ppBackend = pVorbis;\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_decoding_backend_uninit__stbvorbis(void* pUserData, ma_data_source* pBackend, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_stbvorbis* pVorbis = (ma_stbvorbis*)pBackend;\n\n    (void)pUserData;\n\n    ma_stbvorbis_uninit(pVorbis, pAllocationCallbacks);\n    ma_free(pVorbis, pAllocationCallbacks);\n}\n\nstatic ma_decoding_backend_vtable g_ma_decoding_backend_vtable_stbvorbis =\n{\n    ma_decoding_backend_init__stbvorbis,\n    ma_decoding_backend_init_file__stbvorbis,\n    NULL, /* onInitFileW() */\n    ma_decoding_backend_init_memory__stbvorbis,\n    ma_decoding_backend_uninit__stbvorbis\n};\n\nstatic ma_result ma_decoder_init_vorbis__internal(const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_vtable__internal(&g_ma_decoding_backend_vtable_stbvorbis, NULL, pConfig, pDecoder);\n}\n\nstatic ma_result ma_decoder_init_vorbis_from_file__internal(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_file__internal(&g_ma_decoding_backend_vtable_stbvorbis, NULL, pFilePath, pConfig, pDecoder);\n}\n\nstatic ma_result ma_decoder_init_vorbis_from_file_w__internal(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_file_w__internal(&g_ma_decoding_backend_vtable_stbvorbis, NULL, pFilePath, pConfig, pDecoder);\n}\n\nstatic ma_result ma_decoder_init_vorbis_from_memory__internal(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    return ma_decoder_init_from_memory__internal(&g_ma_decoding_backend_vtable_stbvorbis, NULL, pData, dataSize, pConfig, pDecoder);\n}\n#endif  /* STB_VORBIS_INCLUDE_STB_VORBIS_H */\n\n\n\nstatic ma_result ma_decoder__init_allocation_callbacks(const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    MA_ASSERT(pDecoder != NULL);\n\n    if (pConfig != NULL) {\n        return ma_allocation_callbacks_init_copy(&pDecoder->allocationCallbacks, &pConfig->allocationCallbacks);\n    } else {\n        pDecoder->allocationCallbacks = ma_allocation_callbacks_init_default();\n        return MA_SUCCESS;\n    }\n}\n\nstatic ma_result ma_decoder__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    return ma_decoder_read_pcm_frames((ma_decoder*)pDataSource, pFramesOut, frameCount, pFramesRead);\n}\n\nstatic ma_result ma_decoder__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    return ma_decoder_seek_to_pcm_frame((ma_decoder*)pDataSource, frameIndex);\n}\n\nstatic ma_result ma_decoder__data_source_on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    return ma_decoder_get_data_format((ma_decoder*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap);\n}\n\nstatic ma_result ma_decoder__data_source_on_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)\n{\n    return ma_decoder_get_cursor_in_pcm_frames((ma_decoder*)pDataSource, pCursor);\n}\n\nstatic ma_result ma_decoder__data_source_on_get_length(ma_data_source* pDataSource, ma_uint64* pLength)\n{\n    return ma_decoder_get_length_in_pcm_frames((ma_decoder*)pDataSource, pLength);\n}\n\nstatic ma_data_source_vtable g_ma_decoder_data_source_vtable =\n{\n    ma_decoder__data_source_on_read,\n    ma_decoder__data_source_on_seek,\n    ma_decoder__data_source_on_get_data_format,\n    ma_decoder__data_source_on_get_cursor,\n    ma_decoder__data_source_on_get_length,\n    NULL,   /* onSetLooping */\n    0\n};\n\nstatic ma_result ma_decoder__preinit(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, ma_decoder_tell_proc onTell, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n    ma_data_source_config dataSourceConfig;\n\n    MA_ASSERT(pConfig != NULL);\n\n    if (pDecoder == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pDecoder);\n\n    dataSourceConfig = ma_data_source_config_init();\n    dataSourceConfig.vtable = &g_ma_decoder_data_source_vtable;\n\n    result = ma_data_source_init(&dataSourceConfig, &pDecoder->ds);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pDecoder->onRead    = onRead;\n    pDecoder->onSeek    = onSeek;\n    pDecoder->onTell    = onTell;\n    pDecoder->pUserData = pUserData;\n\n    result = ma_decoder__init_allocation_callbacks(pConfig, pDecoder);\n    if (result != MA_SUCCESS) {\n        ma_data_source_uninit(&pDecoder->ds);\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoder__postinit(const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n\n    result = ma_decoder__init_data_converter(pDecoder, pConfig);\n\n    /* If we failed post initialization we need to uninitialize the decoder before returning to prevent a memory leak. */\n    if (result != MA_SUCCESS) {\n        ma_decoder_uninit(pDecoder);\n        return result;\n    }\n\n    return result;\n}\n\n\nstatic ma_result ma_decoder_init__internal(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result = MA_NO_BACKEND;\n\n    MA_ASSERT(pConfig != NULL);\n    MA_ASSERT(pDecoder != NULL);\n\n    /* Silence some warnings in the case that we don't have any decoder backends enabled. */\n    (void)onRead;\n    (void)onSeek;\n    (void)pUserData;\n\n\n    /* If we've specified a specific encoding type, try that first. */\n    if (pConfig->encodingFormat != ma_encoding_format_unknown) {\n    #ifdef MA_HAS_WAV\n        if (pConfig->encodingFormat == ma_encoding_format_wav) {\n            result = ma_decoder_init_wav__internal(pConfig, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_FLAC\n        if (pConfig->encodingFormat == ma_encoding_format_flac) {\n            result = ma_decoder_init_flac__internal(pConfig, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_MP3\n        if (pConfig->encodingFormat == ma_encoding_format_mp3) {\n            result = ma_decoder_init_mp3__internal(pConfig, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_VORBIS\n        if (pConfig->encodingFormat == ma_encoding_format_vorbis) {\n            result = ma_decoder_init_vorbis__internal(pConfig, pDecoder);\n        }\n    #endif\n\n        /* If we weren't able to initialize the decoder, seek back to the start to give the next attempts a clean start. */\n        if (result != MA_SUCCESS) {\n            onSeek(pDecoder, 0, ma_seek_origin_start);\n        }\n    }\n\n    if (result != MA_SUCCESS) {\n        /* Getting here means we couldn't load a specific decoding backend based on the encoding format. */\n\n        /*\n        We use trial and error to open a decoder. We prioritize custom decoders so that if they\n        implement the same encoding format they take priority over the built-in decoders.\n        */\n        if (result != MA_SUCCESS) {\n            result = ma_decoder_init_custom__internal(pConfig, pDecoder);\n            if (result != MA_SUCCESS) {\n                onSeek(pDecoder, 0, ma_seek_origin_start);\n            }\n        }\n\n        /*\n        If we get to this point and we still haven't found a decoder, and the caller has requested a\n        specific encoding format, there's no hope for it. Abort.\n        */\n        if (pConfig->encodingFormat != ma_encoding_format_unknown) {\n            return MA_NO_BACKEND;\n        }\n\n    #ifdef MA_HAS_WAV\n        if (result != MA_SUCCESS) {\n            result = ma_decoder_init_wav__internal(pConfig, pDecoder);\n            if (result != MA_SUCCESS) {\n                onSeek(pDecoder, 0, ma_seek_origin_start);\n            }\n        }\n    #endif\n    #ifdef MA_HAS_FLAC\n        if (result != MA_SUCCESS) {\n            result = ma_decoder_init_flac__internal(pConfig, pDecoder);\n            if (result != MA_SUCCESS) {\n                onSeek(pDecoder, 0, ma_seek_origin_start);\n            }\n        }\n    #endif\n    #ifdef MA_HAS_MP3\n        if (result != MA_SUCCESS) {\n            result = ma_decoder_init_mp3__internal(pConfig, pDecoder);\n            if (result != MA_SUCCESS) {\n                onSeek(pDecoder, 0, ma_seek_origin_start);\n            }\n        }\n    #endif\n    #ifdef MA_HAS_VORBIS\n        if (result != MA_SUCCESS) {\n            result = ma_decoder_init_vorbis__internal(pConfig, pDecoder);\n            if (result != MA_SUCCESS) {\n                onSeek(pDecoder, 0, ma_seek_origin_start);\n            }\n        }\n    #endif\n    }\n\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_decoder__postinit(pConfig, pDecoder);\n}\n\nMA_API ma_result ma_decoder_init(ma_decoder_read_proc onRead, ma_decoder_seek_proc onSeek, void* pUserData, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_decoder_config config;\n    ma_result result;\n\n    config = ma_decoder_config_init_copy(pConfig);\n\n    result = ma_decoder__preinit(onRead, onSeek, NULL, pUserData, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_decoder_init__internal(onRead, onSeek, pUserData, &config, pDecoder);\n}\n\n\nstatic ma_result ma_decoder__on_read_memory(ma_decoder* pDecoder, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead)\n{\n    size_t bytesRemaining;\n\n    MA_ASSERT(pDecoder->data.memory.dataSize >= pDecoder->data.memory.currentReadPos);\n\n    if (pBytesRead != NULL) {\n        *pBytesRead = 0;\n    }\n\n    bytesRemaining = pDecoder->data.memory.dataSize - pDecoder->data.memory.currentReadPos;\n    if (bytesToRead > bytesRemaining) {\n        bytesToRead = bytesRemaining;\n    }\n\n    if (bytesRemaining == 0) {\n        return MA_AT_END;\n    }\n\n    if (bytesToRead > 0) {\n        MA_COPY_MEMORY(pBufferOut, pDecoder->data.memory.pData + pDecoder->data.memory.currentReadPos, bytesToRead);\n        pDecoder->data.memory.currentReadPos += bytesToRead;\n    }\n\n    if (pBytesRead != NULL) {\n        *pBytesRead = bytesToRead;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoder__on_seek_memory(ma_decoder* pDecoder, ma_int64 byteOffset, ma_seek_origin origin)\n{\n    if (byteOffset > 0 && (ma_uint64)byteOffset > MA_SIZE_MAX) {\n        return MA_BAD_SEEK;\n    }\n\n    if (origin == ma_seek_origin_current) {\n        if (byteOffset > 0) {\n            if (pDecoder->data.memory.currentReadPos + byteOffset > pDecoder->data.memory.dataSize) {\n                byteOffset = (ma_int64)(pDecoder->data.memory.dataSize - pDecoder->data.memory.currentReadPos);  /* Trying to seek too far forward. */\n            }\n\n            pDecoder->data.memory.currentReadPos += (size_t)byteOffset;\n        } else {\n            if (pDecoder->data.memory.currentReadPos < (size_t)-byteOffset) {\n                byteOffset = -(ma_int64)pDecoder->data.memory.currentReadPos;  /* Trying to seek too far backwards. */\n            }\n\n            pDecoder->data.memory.currentReadPos -= (size_t)-byteOffset;\n        }\n    } else {\n        if (origin == ma_seek_origin_end) {\n            if (byteOffset < 0) {\n                byteOffset = -byteOffset;\n            }\n\n            if (byteOffset > (ma_int64)pDecoder->data.memory.dataSize) {\n                pDecoder->data.memory.currentReadPos = 0;   /* Trying to seek too far back. */\n            } else {\n                pDecoder->data.memory.currentReadPos = pDecoder->data.memory.dataSize - (size_t)byteOffset;\n            }\n        } else {\n            if ((size_t)byteOffset <= pDecoder->data.memory.dataSize) {\n                pDecoder->data.memory.currentReadPos = (size_t)byteOffset;\n            } else {\n                pDecoder->data.memory.currentReadPos = pDecoder->data.memory.dataSize;  /* Trying to seek too far forward. */\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoder__on_tell_memory(ma_decoder* pDecoder, ma_int64* pCursor)\n{\n    MA_ASSERT(pDecoder != NULL);\n    MA_ASSERT(pCursor  != NULL);\n\n    *pCursor = (ma_int64)pDecoder->data.memory.currentReadPos;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoder__preinit_memory_wrapper(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result = ma_decoder__preinit(ma_decoder__on_read_memory, ma_decoder__on_seek_memory, ma_decoder__on_tell_memory, NULL, pConfig, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pData == NULL || dataSize == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pDecoder->data.memory.pData = (const ma_uint8*)pData;\n    pDecoder->data.memory.dataSize = dataSize;\n    pDecoder->data.memory.currentReadPos = 0;\n\n    (void)pConfig;\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_decoder_init_memory(const void* pData, size_t dataSize, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n    ma_decoder_config config;\n\n    config = ma_decoder_config_init_copy(pConfig);\n\n    result = ma_decoder__preinit(NULL, NULL, NULL, NULL, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pData == NULL || dataSize == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* If the backend has support for loading from a file path we'll want to use that. If that all fails we'll fall back to the VFS path. */\n    result = MA_NO_BACKEND;\n\n    if (config.encodingFormat != ma_encoding_format_unknown) {\n    #ifdef MA_HAS_WAV\n        if (config.encodingFormat == ma_encoding_format_wav) {\n            result = ma_decoder_init_wav_from_memory__internal(pData, dataSize, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_FLAC\n        if (config.encodingFormat == ma_encoding_format_flac) {\n            result = ma_decoder_init_flac_from_memory__internal(pData, dataSize, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_MP3\n        if (config.encodingFormat == ma_encoding_format_mp3) {\n            result = ma_decoder_init_mp3_from_memory__internal(pData, dataSize, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_VORBIS\n        if (config.encodingFormat == ma_encoding_format_vorbis) {\n            result = ma_decoder_init_vorbis_from_memory__internal(pData, dataSize, &config, pDecoder);\n        }\n    #endif\n    }\n\n    if (result != MA_SUCCESS) {\n        /* Getting here means we weren't able to initialize a decoder of a specific encoding format. */\n\n        /*\n        We use trial and error to open a decoder. We prioritize custom decoders so that if they\n        implement the same encoding format they take priority over the built-in decoders.\n        */\n        result = ma_decoder_init_custom_from_memory__internal(pData, dataSize, &config, pDecoder);\n\n        /*\n        If we get to this point and we still haven't found a decoder, and the caller has requested a\n        specific encoding format, there's no hope for it. Abort.\n        */\n        if (result != MA_SUCCESS && config.encodingFormat != ma_encoding_format_unknown) {\n            return MA_NO_BACKEND;\n        }\n\n        /* Use trial and error for stock decoders. */\n        if (result != MA_SUCCESS) {\n        #ifdef MA_HAS_WAV\n            if (result != MA_SUCCESS) {\n                result = ma_decoder_init_wav_from_memory__internal(pData, dataSize, &config, pDecoder);\n            }\n        #endif\n        #ifdef MA_HAS_FLAC\n            if (result != MA_SUCCESS) {\n                result = ma_decoder_init_flac_from_memory__internal(pData, dataSize, &config, pDecoder);\n            }\n        #endif\n        #ifdef MA_HAS_MP3\n            if (result != MA_SUCCESS) {\n                result = ma_decoder_init_mp3_from_memory__internal(pData, dataSize, &config, pDecoder);\n            }\n        #endif\n        #ifdef MA_HAS_VORBIS\n            if (result != MA_SUCCESS) {\n                result = ma_decoder_init_vorbis_from_memory__internal(pData, dataSize, &config, pDecoder);\n            }\n        #endif\n        }\n    }\n\n    /*\n    If at this point we still haven't successfully initialized the decoder it most likely means\n    the backend doesn't have an implementation for loading from a file path. We'll try using\n    miniaudio's built-in file IO for loading file.\n    */\n    if (result == MA_SUCCESS) {\n        /* Initialization was successful. Finish up. */\n        result = ma_decoder__postinit(&config, pDecoder);\n        if (result != MA_SUCCESS) {\n            /*\n            The backend was initialized successfully, but for some reason post-initialization failed. This is most likely\n            due to an out of memory error. We're going to abort with an error here and not try to recover.\n            */\n            if (pDecoder->pBackendVTable != NULL && pDecoder->pBackendVTable->onUninit != NULL) {\n                pDecoder->pBackendVTable->onUninit(pDecoder->pBackendUserData, &pDecoder->pBackend, &pDecoder->allocationCallbacks);\n            }\n\n            return result;\n        }\n    } else {\n        /* Probably no implementation for loading from a block of memory. Use miniaudio's abstraction instead. */\n        result = ma_decoder__preinit_memory_wrapper(pData, dataSize, &config, pDecoder);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        result = ma_decoder_init__internal(ma_decoder__on_read_memory, ma_decoder__on_seek_memory, NULL, &config, pDecoder);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n\n#if defined(MA_HAS_WAV)    || \\\n    defined(MA_HAS_MP3)    || \\\n    defined(MA_HAS_FLAC)   || \\\n    defined(MA_HAS_VORBIS) || \\\n    defined(MA_HAS_OPUS)\n#define MA_HAS_PATH_API\n#endif\n\n#if defined(MA_HAS_PATH_API)\nstatic const char* ma_path_file_name(const char* path)\n{\n    const char* fileName;\n\n    if (path == NULL) {\n        return NULL;\n    }\n\n    fileName = path;\n\n    /* We just loop through the path until we find the last slash. */\n    while (path[0] != '\\0') {\n        if (path[0] == '/' || path[0] == '\\\\') {\n            fileName = path;\n        }\n\n        path += 1;\n    }\n\n    /* At this point the file name is sitting on a slash, so just move forward. */\n    while (fileName[0] != '\\0' && (fileName[0] == '/' || fileName[0] == '\\\\')) {\n        fileName += 1;\n    }\n\n    return fileName;\n}\n\nstatic const wchar_t* ma_path_file_name_w(const wchar_t* path)\n{\n    const wchar_t* fileName;\n\n    if (path == NULL) {\n        return NULL;\n    }\n\n    fileName = path;\n\n    /* We just loop through the path until we find the last slash. */\n    while (path[0] != '\\0') {\n        if (path[0] == '/' || path[0] == '\\\\') {\n            fileName = path;\n        }\n\n        path += 1;\n    }\n\n    /* At this point the file name is sitting on a slash, so just move forward. */\n    while (fileName[0] != '\\0' && (fileName[0] == '/' || fileName[0] == '\\\\')) {\n        fileName += 1;\n    }\n\n    return fileName;\n}\n\n\nstatic const char* ma_path_extension(const char* path)\n{\n    const char* extension;\n    const char* lastOccurance;\n\n    if (path == NULL) {\n        path = \"\";\n    }\n\n    extension = ma_path_file_name(path);\n    lastOccurance = NULL;\n\n    /* Just find the last '.' and return. */\n    while (extension[0] != '\\0') {\n        if (extension[0] == '.') {\n            extension += 1;\n            lastOccurance = extension;\n        }\n\n        extension += 1;\n    }\n\n    return (lastOccurance != NULL) ? lastOccurance : extension;\n}\n\nstatic const wchar_t* ma_path_extension_w(const wchar_t* path)\n{\n    const wchar_t* extension;\n    const wchar_t* lastOccurance;\n\n    if (path == NULL) {\n        path = L\"\";\n    }\n\n    extension = ma_path_file_name_w(path);\n    lastOccurance = NULL;\n\n    /* Just find the last '.' and return. */\n    while (extension[0] != '\\0') {\n        if (extension[0] == '.') {\n            extension += 1;\n            lastOccurance = extension;\n        }\n\n        extension += 1;\n    }\n\n    return (lastOccurance != NULL) ? lastOccurance : extension;\n}\n\n\nstatic ma_bool32 ma_path_extension_equal(const char* path, const char* extension)\n{\n    const char* ext1;\n    const char* ext2;\n\n    if (path == NULL || extension == NULL) {\n        return MA_FALSE;\n    }\n\n    ext1 = extension;\n    ext2 = ma_path_extension(path);\n\n#if defined(_MSC_VER) || defined(__DMC__)\n    return _stricmp(ext1, ext2) == 0;\n#else\n    return strcasecmp(ext1, ext2) == 0;\n#endif\n}\n\nstatic ma_bool32 ma_path_extension_equal_w(const wchar_t* path, const wchar_t* extension)\n{\n    const wchar_t* ext1;\n    const wchar_t* ext2;\n\n    if (path == NULL || extension == NULL) {\n        return MA_FALSE;\n    }\n\n    ext1 = extension;\n    ext2 = ma_path_extension_w(path);\n\n#if defined(_MSC_VER) || defined(__WATCOMC__) || defined(__DMC__)\n    return _wcsicmp(ext1, ext2) == 0;\n#else\n    /*\n    I'm not aware of a wide character version of strcasecmp(). I'm therefore converting the extensions to multibyte strings and comparing those. This\n    isn't the most efficient way to do it, but it should work OK.\n    */\n    {\n        char ext1MB[4096];\n        char ext2MB[4096];\n        const wchar_t* pext1 = ext1;\n        const wchar_t* pext2 = ext2;\n        mbstate_t mbs1;\n        mbstate_t mbs2;\n\n        MA_ZERO_OBJECT(&mbs1);\n        MA_ZERO_OBJECT(&mbs2);\n\n        if (wcsrtombs(ext1MB, &pext1, sizeof(ext1MB), &mbs1) == (size_t)-1) {\n            return MA_FALSE;\n        }\n        if (wcsrtombs(ext2MB, &pext2, sizeof(ext2MB), &mbs2) == (size_t)-1) {\n            return MA_FALSE;\n        }\n\n        return strcasecmp(ext1MB, ext2MB) == 0;\n    }\n#endif\n}\n#endif  /* MA_HAS_PATH_API */\n\n\n\nstatic ma_result ma_decoder__on_read_vfs(ma_decoder* pDecoder, void* pBufferOut, size_t bytesToRead, size_t* pBytesRead)\n{\n    MA_ASSERT(pDecoder   != NULL);\n    MA_ASSERT(pBufferOut != NULL);\n\n    return ma_vfs_or_default_read(pDecoder->data.vfs.pVFS, pDecoder->data.vfs.file, pBufferOut, bytesToRead, pBytesRead);\n}\n\nstatic ma_result ma_decoder__on_seek_vfs(ma_decoder* pDecoder, ma_int64 offset, ma_seek_origin origin)\n{\n    MA_ASSERT(pDecoder != NULL);\n\n    return ma_vfs_or_default_seek(pDecoder->data.vfs.pVFS, pDecoder->data.vfs.file, offset, origin);\n}\n\nstatic ma_result ma_decoder__on_tell_vfs(ma_decoder* pDecoder, ma_int64* pCursor)\n{\n    MA_ASSERT(pDecoder != NULL);\n\n    return ma_vfs_or_default_tell(pDecoder->data.vfs.pVFS, pDecoder->data.vfs.file, pCursor);\n}\n\nstatic ma_result ma_decoder__preinit_vfs(ma_vfs* pVFS, const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n    ma_vfs_file file;\n\n    result = ma_decoder__preinit(ma_decoder__on_read_vfs, ma_decoder__on_seek_vfs, ma_decoder__on_tell_vfs, NULL, pConfig, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pFilePath == NULL || pFilePath[0] == '\\0') {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_vfs_or_default_open(pVFS, pFilePath, MA_OPEN_MODE_READ, &file);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pDecoder->data.vfs.pVFS = pVFS;\n    pDecoder->data.vfs.file = file;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_decoder_init_vfs(ma_vfs* pVFS, const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n    ma_decoder_config config;\n\n    config = ma_decoder_config_init_copy(pConfig);\n    result = ma_decoder__preinit_vfs(pVFS, pFilePath, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = MA_NO_BACKEND;\n\n    if (config.encodingFormat != ma_encoding_format_unknown) {\n    #ifdef MA_HAS_WAV\n        if (config.encodingFormat == ma_encoding_format_wav) {\n            result = ma_decoder_init_wav__internal(&config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_FLAC\n        if (config.encodingFormat == ma_encoding_format_flac) {\n            result = ma_decoder_init_flac__internal(&config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_MP3\n        if (config.encodingFormat == ma_encoding_format_mp3) {\n            result = ma_decoder_init_mp3__internal(&config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_VORBIS\n        if (config.encodingFormat == ma_encoding_format_vorbis) {\n            result = ma_decoder_init_vorbis__internal(&config, pDecoder);\n        }\n    #endif\n\n        /* Make sure we seek back to the start if we didn't initialize a decoder successfully so the next attempts have a fresh start. */\n        if (result != MA_SUCCESS) {\n            ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start);\n        }\n    }\n\n    if (result != MA_SUCCESS) {\n        /* Getting here means we weren't able to initialize a decoder of a specific encoding format. */\n\n        /*\n        We use trial and error to open a decoder. We prioritize custom decoders so that if they\n        implement the same encoding format they take priority over the built-in decoders.\n        */\n        if (result != MA_SUCCESS) {\n            result = ma_decoder_init_custom__internal(&config, pDecoder);\n            if (result != MA_SUCCESS) {\n                ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start);\n            }\n        }\n\n        /*\n        If we get to this point and we still haven't found a decoder, and the caller has requested a\n        specific encoding format, there's no hope for it. Abort.\n        */\n        if (config.encodingFormat != ma_encoding_format_unknown) {\n            return MA_NO_BACKEND;\n        }\n\n    #ifdef MA_HAS_WAV\n        if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, \"wav\")) {\n            result = ma_decoder_init_wav__internal(&config, pDecoder);\n            if (result != MA_SUCCESS) {\n                ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start);\n            }\n        }\n    #endif\n    #ifdef MA_HAS_FLAC\n        if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, \"flac\")) {\n            result = ma_decoder_init_flac__internal(&config, pDecoder);\n            if (result != MA_SUCCESS) {\n                ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start);\n            }\n        }\n    #endif\n    #ifdef MA_HAS_MP3\n        if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, \"mp3\")) {\n            result = ma_decoder_init_mp3__internal(&config, pDecoder);\n            if (result != MA_SUCCESS) {\n                ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start);\n            }\n        }\n    #endif\n    }\n\n    /* If we still haven't got a result just use trial and error. Otherwise we can finish up. */\n    if (result != MA_SUCCESS) {\n        result = ma_decoder_init__internal(ma_decoder__on_read_vfs, ma_decoder__on_seek_vfs, NULL, &config, pDecoder);\n    } else {\n        result = ma_decoder__postinit(&config, pDecoder);\n    }\n\n    if (result != MA_SUCCESS) {\n        if (pDecoder->data.vfs.file != NULL) {   /* <-- Will be reset to NULL if ma_decoder_uninit() is called in one of the steps above which allows us to avoid a double close of the file. */\n            ma_vfs_or_default_close(pVFS, pDecoder->data.vfs.file);\n        }\n\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_decoder__preinit_vfs_w(ma_vfs* pVFS, const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n    ma_vfs_file file;\n\n    result = ma_decoder__preinit(ma_decoder__on_read_vfs, ma_decoder__on_seek_vfs, ma_decoder__on_tell_vfs, NULL, pConfig, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pFilePath == NULL || pFilePath[0] == '\\0') {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_vfs_or_default_open_w(pVFS, pFilePath, MA_OPEN_MODE_READ, &file);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pDecoder->data.vfs.pVFS = pVFS;\n    pDecoder->data.vfs.file = file;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_decoder_init_vfs_w(ma_vfs* pVFS, const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n    ma_decoder_config config;\n\n    config = ma_decoder_config_init_copy(pConfig);\n    result = ma_decoder__preinit_vfs_w(pVFS, pFilePath, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = MA_NO_BACKEND;\n\n    if (config.encodingFormat != ma_encoding_format_unknown) {\n    #ifdef MA_HAS_WAV\n        if (config.encodingFormat == ma_encoding_format_wav) {\n            result = ma_decoder_init_wav__internal(&config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_FLAC\n        if (config.encodingFormat == ma_encoding_format_flac) {\n            result = ma_decoder_init_flac__internal(&config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_MP3\n        if (config.encodingFormat == ma_encoding_format_mp3) {\n            result = ma_decoder_init_mp3__internal(&config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_VORBIS\n        if (config.encodingFormat == ma_encoding_format_vorbis) {\n            result = ma_decoder_init_vorbis__internal(&config, pDecoder);\n        }\n    #endif\n\n        /* Make sure we seek back to the start if we didn't initialize a decoder successfully so the next attempts have a fresh start. */\n        if (result != MA_SUCCESS) {\n            ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start);\n        }\n    }\n\n    if (result != MA_SUCCESS) {\n        /* Getting here means we weren't able to initialize a decoder of a specific encoding format. */\n\n        /*\n        We use trial and error to open a decoder. We prioritize custom decoders so that if they\n        implement the same encoding format they take priority over the built-in decoders.\n        */\n        if (result != MA_SUCCESS) {\n            result = ma_decoder_init_custom__internal(&config, pDecoder);\n            if (result != MA_SUCCESS) {\n                ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start);\n            }\n        }\n\n        /*\n        If we get to this point and we still haven't found a decoder, and the caller has requested a\n        specific encoding format, there's no hope for it. Abort.\n        */\n        if (config.encodingFormat != ma_encoding_format_unknown) {\n            return MA_NO_BACKEND;\n        }\n\n    #ifdef MA_HAS_WAV\n        if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L\"wav\")) {\n            result = ma_decoder_init_wav__internal(&config, pDecoder);\n            if (result != MA_SUCCESS) {\n                ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start);\n            }\n        }\n    #endif\n    #ifdef MA_HAS_FLAC\n        if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L\"flac\")) {\n            result = ma_decoder_init_flac__internal(&config, pDecoder);\n            if (result != MA_SUCCESS) {\n                ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start);\n            }\n        }\n    #endif\n    #ifdef MA_HAS_MP3\n        if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L\"mp3\")) {\n            result = ma_decoder_init_mp3__internal(&config, pDecoder);\n            if (result != MA_SUCCESS) {\n                ma_decoder__on_seek_vfs(pDecoder, 0, ma_seek_origin_start);\n            }\n        }\n    #endif\n    }\n\n    /* If we still haven't got a result just use trial and error. Otherwise we can finish up. */\n    if (result != MA_SUCCESS) {\n        result = ma_decoder_init__internal(ma_decoder__on_read_vfs, ma_decoder__on_seek_vfs, NULL, &config, pDecoder);\n    } else {\n        result = ma_decoder__postinit(&config, pDecoder);\n    }\n\n    if (result != MA_SUCCESS) {\n        ma_vfs_or_default_close(pVFS, pDecoder->data.vfs.file);\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_decoder__preinit_file(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n\n    result = ma_decoder__preinit(NULL, NULL, NULL, NULL, pConfig, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pFilePath == NULL || pFilePath[0] == '\\0') {\n        return MA_INVALID_ARGS;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_decoder_init_file(const char* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n    ma_decoder_config config;\n\n    config = ma_decoder_config_init_copy(pConfig);\n    result = ma_decoder__preinit_file(pFilePath, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* If the backend has support for loading from a file path we'll want to use that. If that all fails we'll fall back to the VFS path. */\n    result = MA_NO_BACKEND;\n\n    if (config.encodingFormat != ma_encoding_format_unknown) {\n    #ifdef MA_HAS_WAV\n        if (config.encodingFormat == ma_encoding_format_wav) {\n            result = ma_decoder_init_wav_from_file__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_FLAC\n        if (config.encodingFormat == ma_encoding_format_flac) {\n            result = ma_decoder_init_flac_from_file__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_MP3\n        if (config.encodingFormat == ma_encoding_format_mp3) {\n            result = ma_decoder_init_mp3_from_file__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_VORBIS\n        if (config.encodingFormat == ma_encoding_format_vorbis) {\n            result = ma_decoder_init_vorbis_from_file__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    }\n\n    if (result != MA_SUCCESS) {\n        /* Getting here means we weren't able to initialize a decoder of a specific encoding format. */\n\n        /*\n        We use trial and error to open a decoder. We prioritize custom decoders so that if they\n        implement the same encoding format they take priority over the built-in decoders.\n        */\n        result = ma_decoder_init_custom_from_file__internal(pFilePath, &config, pDecoder);\n\n        /*\n        If we get to this point and we still haven't found a decoder, and the caller has requested a\n        specific encoding format, there's no hope for it. Abort.\n        */\n        if (result != MA_SUCCESS && config.encodingFormat != ma_encoding_format_unknown) {\n            return MA_NO_BACKEND;\n        }\n\n        /* First try loading based on the file extension so we don't waste time opening and closing files. */\n    #ifdef MA_HAS_WAV\n        if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, \"wav\")) {\n            result = ma_decoder_init_wav_from_file__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_FLAC\n        if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, \"flac\")) {\n            result = ma_decoder_init_flac_from_file__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_MP3\n        if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, \"mp3\")) {\n            result = ma_decoder_init_mp3_from_file__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_VORBIS\n        if (result != MA_SUCCESS && ma_path_extension_equal(pFilePath, \"ogg\")) {\n            result = ma_decoder_init_vorbis_from_file__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n\n        /*\n        If we still haven't got a result just use trial and error. Custom decoders have already been attempted, so here we\n        need only iterate over our stock decoders.\n        */\n        if (result != MA_SUCCESS) {\n        #ifdef MA_HAS_WAV\n            if (result != MA_SUCCESS) {\n                result = ma_decoder_init_wav_from_file__internal(pFilePath, &config, pDecoder);\n            }\n        #endif\n        #ifdef MA_HAS_FLAC\n            if (result != MA_SUCCESS) {\n                result = ma_decoder_init_flac_from_file__internal(pFilePath, &config, pDecoder);\n            }\n        #endif\n        #ifdef MA_HAS_MP3\n            if (result != MA_SUCCESS) {\n                result = ma_decoder_init_mp3_from_file__internal(pFilePath, &config, pDecoder);\n            }\n        #endif\n        #ifdef MA_HAS_VORBIS\n            if (result != MA_SUCCESS) {\n                result = ma_decoder_init_vorbis_from_file__internal(pFilePath, &config, pDecoder);\n            }\n        #endif\n        }\n    }\n\n    /*\n    If at this point we still haven't successfully initialized the decoder it most likely means\n    the backend doesn't have an implementation for loading from a file path. We'll try using\n    miniaudio's built-in file IO for loading file.\n    */\n    if (result == MA_SUCCESS) {\n        /* Initialization was successful. Finish up. */\n        result = ma_decoder__postinit(&config, pDecoder);\n        if (result != MA_SUCCESS) {\n            /*\n            The backend was initialized successfully, but for some reason post-initialization failed. This is most likely\n            due to an out of memory error. We're going to abort with an error here and not try to recover.\n            */\n            if (pDecoder->pBackendVTable != NULL && pDecoder->pBackendVTable->onUninit != NULL) {\n                pDecoder->pBackendVTable->onUninit(pDecoder->pBackendUserData, &pDecoder->pBackend, &pDecoder->allocationCallbacks);\n            }\n\n            return result;\n        }\n    } else {\n        /* Probably no implementation for loading from a file path. Use miniaudio's file IO instead. */\n        result = ma_decoder_init_vfs(NULL, pFilePath, pConfig, pDecoder);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_decoder__preinit_file_w(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n\n    result = ma_decoder__preinit(NULL, NULL, NULL, NULL, pConfig, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pFilePath == NULL || pFilePath[0] == '\\0') {\n        return MA_INVALID_ARGS;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_decoder_init_file_w(const wchar_t* pFilePath, const ma_decoder_config* pConfig, ma_decoder* pDecoder)\n{\n    ma_result result;\n    ma_decoder_config config;\n\n    config = ma_decoder_config_init_copy(pConfig);\n    result = ma_decoder__preinit_file_w(pFilePath, &config, pDecoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* If the backend has support for loading from a file path we'll want to use that. If that all fails we'll fall back to the VFS path. */\n    result = MA_NO_BACKEND;\n\n    if (config.encodingFormat != ma_encoding_format_unknown) {\n    #ifdef MA_HAS_WAV\n        if (config.encodingFormat == ma_encoding_format_wav) {\n            result = ma_decoder_init_wav_from_file_w__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_FLAC\n        if (config.encodingFormat == ma_encoding_format_flac) {\n            result = ma_decoder_init_flac_from_file_w__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_MP3\n        if (config.encodingFormat == ma_encoding_format_mp3) {\n            result = ma_decoder_init_mp3_from_file_w__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_VORBIS\n        if (config.encodingFormat == ma_encoding_format_vorbis) {\n            result = ma_decoder_init_vorbis_from_file_w__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    }\n\n    if (result != MA_SUCCESS) {\n        /* Getting here means we weren't able to initialize a decoder of a specific encoding format. */\n\n        /*\n        We use trial and error to open a decoder. We prioritize custom decoders so that if they\n        implement the same encoding format they take priority over the built-in decoders.\n        */\n        result = ma_decoder_init_custom_from_file_w__internal(pFilePath, &config, pDecoder);\n\n        /*\n        If we get to this point and we still haven't found a decoder, and the caller has requested a\n        specific encoding format, there's no hope for it. Abort.\n        */\n        if (result != MA_SUCCESS && config.encodingFormat != ma_encoding_format_unknown) {\n            return MA_NO_BACKEND;\n        }\n\n        /* First try loading based on the file extension so we don't waste time opening and closing files. */\n    #ifdef MA_HAS_WAV\n        if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L\"wav\")) {\n            result = ma_decoder_init_wav_from_file_w__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_FLAC\n        if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L\"flac\")) {\n            result = ma_decoder_init_flac_from_file_w__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_MP3\n        if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L\"mp3\")) {\n            result = ma_decoder_init_mp3_from_file_w__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n    #ifdef MA_HAS_VORBIS\n        if (result != MA_SUCCESS && ma_path_extension_equal_w(pFilePath, L\"ogg\")) {\n            result = ma_decoder_init_vorbis_from_file_w__internal(pFilePath, &config, pDecoder);\n        }\n    #endif\n\n        /*\n        If we still haven't got a result just use trial and error. Custom decoders have already been attempted, so here we\n        need only iterate over our stock decoders.\n        */\n        if (result != MA_SUCCESS) {\n        #ifdef MA_HAS_WAV\n            if (result != MA_SUCCESS) {\n                result = ma_decoder_init_wav_from_file_w__internal(pFilePath, &config, pDecoder);\n            }\n        #endif\n        #ifdef MA_HAS_FLAC\n            if (result != MA_SUCCESS) {\n                result = ma_decoder_init_flac_from_file_w__internal(pFilePath, &config, pDecoder);\n            }\n        #endif\n        #ifdef MA_HAS_MP3\n            if (result != MA_SUCCESS) {\n                result = ma_decoder_init_mp3_from_file_w__internal(pFilePath, &config, pDecoder);\n            }\n        #endif\n        #ifdef MA_HAS_VORBIS\n            if (result != MA_SUCCESS) {\n                result = ma_decoder_init_vorbis_from_file_w__internal(pFilePath, &config, pDecoder);\n            }\n        #endif\n        }\n    }\n\n    /*\n    If at this point we still haven't successfully initialized the decoder it most likely means\n    the backend doesn't have an implementation for loading from a file path. We'll try using\n    miniaudio's built-in file IO for loading file.\n    */\n    if (result == MA_SUCCESS) {\n        /* Initialization was successful. Finish up. */\n        result = ma_decoder__postinit(&config, pDecoder);\n        if (result != MA_SUCCESS) {\n            /*\n            The backend was initialized successfully, but for some reason post-initialization failed. This is most likely\n            due to an out of memory error. We're going to abort with an error here and not try to recover.\n            */\n            if (pDecoder->pBackendVTable != NULL && pDecoder->pBackendVTable->onUninit != NULL) {\n                pDecoder->pBackendVTable->onUninit(pDecoder->pBackendUserData, &pDecoder->pBackend, &pDecoder->allocationCallbacks);\n            }\n\n            return result;\n        }\n    } else {\n        /* Probably no implementation for loading from a file path. Use miniaudio's file IO instead. */\n        result = ma_decoder_init_vfs_w(NULL, pFilePath, pConfig, pDecoder);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_decoder_uninit(ma_decoder* pDecoder)\n{\n    if (pDecoder == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pDecoder->pBackend != NULL) {\n        if (pDecoder->pBackendVTable != NULL && pDecoder->pBackendVTable->onUninit != NULL) {\n            pDecoder->pBackendVTable->onUninit(pDecoder->pBackendUserData, pDecoder->pBackend, &pDecoder->allocationCallbacks);\n        }\n    }\n\n    if (pDecoder->onRead == ma_decoder__on_read_vfs) {\n        ma_vfs_or_default_close(pDecoder->data.vfs.pVFS, pDecoder->data.vfs.file);\n        pDecoder->data.vfs.file = NULL;\n    }\n\n    ma_data_converter_uninit(&pDecoder->converter, &pDecoder->allocationCallbacks);\n    ma_data_source_uninit(&pDecoder->ds);\n\n    if (pDecoder->pInputCache != NULL) {\n        ma_free(pDecoder->pInputCache, &pDecoder->allocationCallbacks);\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_decoder_read_pcm_frames(ma_decoder* pDecoder, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint64 totalFramesReadOut;\n    void* pRunningFramesOut;\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;   /* Safety. */\n    }\n\n    if (frameCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pDecoder == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pDecoder->pBackend == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* Fast path. */\n    if (pDecoder->converter.isPassthrough) {\n        result = ma_data_source_read_pcm_frames(pDecoder->pBackend, pFramesOut, frameCount, &totalFramesReadOut);\n    } else {\n        /*\n        Getting here means we need to do data conversion. If we're seeking forward and are _not_ doing resampling we can run this in a fast path. If we're doing resampling we\n        need to run through each sample because we need to ensure it's internal cache is updated.\n        */\n        if (pFramesOut == NULL && pDecoder->converter.hasResampler == MA_FALSE) {\n            result = ma_data_source_read_pcm_frames(pDecoder->pBackend, NULL, frameCount, &totalFramesReadOut);\n        } else {\n            /* Slow path. Need to run everything through the data converter. */\n            ma_format internalFormat;\n            ma_uint32 internalChannels;\n\n            totalFramesReadOut = 0;\n            pRunningFramesOut  = pFramesOut;\n\n            result = ma_data_source_get_data_format(pDecoder->pBackend, &internalFormat, &internalChannels, NULL, NULL, 0);\n            if (result != MA_SUCCESS) {\n                return result;   /* Failed to retrieve the internal format and channel count. */\n            }\n\n            /*\n            We run a different path depending on whether or not we are using a heap-allocated\n            intermediary buffer or not. If the data converter does not support the calculation of\n            the required number of input frames, we'll use the heap-allocated path. Otherwise we'll\n            use the stack-allocated path.\n            */\n            if (pDecoder->pInputCache != NULL) {\n                /* We don't have a way of determining the required number of input frames, so need to persistently store input data in a cache. */\n                while (totalFramesReadOut < frameCount) {\n                    ma_uint64 framesToReadThisIterationIn;\n                    ma_uint64 framesToReadThisIterationOut;\n\n                    /* If there's any data available in the cache, that needs to get processed first. */\n                    if (pDecoder->inputCacheRemaining > 0) {\n                        framesToReadThisIterationOut = (frameCount - totalFramesReadOut);\n                        framesToReadThisIterationIn  = framesToReadThisIterationOut;\n                        if (framesToReadThisIterationIn > pDecoder->inputCacheRemaining) {\n                            framesToReadThisIterationIn = pDecoder->inputCacheRemaining;\n                        }\n\n                        result = ma_data_converter_process_pcm_frames(&pDecoder->converter, ma_offset_pcm_frames_ptr(pDecoder->pInputCache, pDecoder->inputCacheConsumed, internalFormat, internalChannels), &framesToReadThisIterationIn, pRunningFramesOut, &framesToReadThisIterationOut);\n                        if (result != MA_SUCCESS) {\n                            break;\n                        }\n\n                        pDecoder->inputCacheConsumed  += framesToReadThisIterationIn;\n                        pDecoder->inputCacheRemaining -= framesToReadThisIterationIn;\n\n                        totalFramesReadOut += framesToReadThisIterationOut;\n\n                        if (pRunningFramesOut != NULL) {\n                            pRunningFramesOut = ma_offset_ptr(pRunningFramesOut, framesToReadThisIterationOut * ma_get_bytes_per_frame(pDecoder->outputFormat, pDecoder->outputChannels));\n                        }\n\n                        if (framesToReadThisIterationIn == 0 && framesToReadThisIterationOut == 0) {\n                            break;  /* We're done. */\n                        }\n                    }\n\n                    /* Getting here means there's no data in the cache and we need to fill it up from the data source. */\n                    if (pDecoder->inputCacheRemaining == 0) {\n                        pDecoder->inputCacheConsumed = 0;\n\n                        result = ma_data_source_read_pcm_frames(pDecoder->pBackend, pDecoder->pInputCache, pDecoder->inputCacheCap, &pDecoder->inputCacheRemaining);\n                        if (result != MA_SUCCESS) {\n                            break;\n                        }\n                    }\n                }\n            } else {\n                /* We have a way of determining the required number of input frames so just use the stack. */\n                while (totalFramesReadOut < frameCount) {\n                    ma_uint8 pIntermediaryBuffer[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];  /* In internal format. */\n                    ma_uint64 intermediaryBufferCap = sizeof(pIntermediaryBuffer) / ma_get_bytes_per_frame(internalFormat, internalChannels);\n                    ma_uint64 framesToReadThisIterationIn;\n                    ma_uint64 framesReadThisIterationIn;\n                    ma_uint64 framesToReadThisIterationOut;\n                    ma_uint64 framesReadThisIterationOut;\n                    ma_uint64 requiredInputFrameCount;\n\n                    framesToReadThisIterationOut = (frameCount - totalFramesReadOut);\n                    framesToReadThisIterationIn = framesToReadThisIterationOut;\n                    if (framesToReadThisIterationIn > intermediaryBufferCap) {\n                        framesToReadThisIterationIn = intermediaryBufferCap;\n                    }\n\n                    ma_data_converter_get_required_input_frame_count(&pDecoder->converter, framesToReadThisIterationOut, &requiredInputFrameCount);\n                    if (framesToReadThisIterationIn > requiredInputFrameCount) {\n                        framesToReadThisIterationIn = requiredInputFrameCount;\n                    }\n\n                    if (requiredInputFrameCount > 0) {\n                        result = ma_data_source_read_pcm_frames(pDecoder->pBackend, pIntermediaryBuffer, framesToReadThisIterationIn, &framesReadThisIterationIn);\n                    } else {\n                        framesReadThisIterationIn = 0;\n                    }\n\n                    /*\n                    At this point we have our decoded data in input format and now we need to convert to output format. Note that even if we didn't read any\n                    input frames, we still want to try processing frames because there may some output frames generated from cached input data.\n                    */\n                    framesReadThisIterationOut = framesToReadThisIterationOut;\n                    result = ma_data_converter_process_pcm_frames(&pDecoder->converter, pIntermediaryBuffer, &framesReadThisIterationIn, pRunningFramesOut, &framesReadThisIterationOut);\n                    if (result != MA_SUCCESS) {\n                        break;\n                    }\n\n                    totalFramesReadOut += framesReadThisIterationOut;\n\n                    if (pRunningFramesOut != NULL) {\n                        pRunningFramesOut = ma_offset_ptr(pRunningFramesOut, framesReadThisIterationOut * ma_get_bytes_per_frame(pDecoder->outputFormat, pDecoder->outputChannels));\n                    }\n\n                    if (framesReadThisIterationIn == 0 && framesReadThisIterationOut == 0) {\n                        break;  /* We're done. */\n                    }\n                }\n            }\n        }\n    }\n\n    pDecoder->readPointerInPCMFrames += totalFramesReadOut;\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = totalFramesReadOut;\n    }\n\n    if (result == MA_SUCCESS && totalFramesReadOut == 0) {\n        result =  MA_AT_END;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_decoder_seek_to_pcm_frame(ma_decoder* pDecoder, ma_uint64 frameIndex)\n{\n    if (pDecoder == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pDecoder->pBackend != NULL) {\n        ma_result result;\n        ma_uint64 internalFrameIndex;\n        ma_uint32 internalSampleRate;\n        ma_uint64 currentFrameIndex;\n\n        result = ma_data_source_get_data_format(pDecoder->pBackend, NULL, NULL, &internalSampleRate, NULL, 0);\n        if (result != MA_SUCCESS) {\n            return result;  /* Failed to retrieve the internal sample rate. */\n        }\n\n        if (internalSampleRate == pDecoder->outputSampleRate) {\n            internalFrameIndex = frameIndex;\n        } else {\n            internalFrameIndex = ma_calculate_frame_count_after_resampling(internalSampleRate, pDecoder->outputSampleRate, frameIndex);\n        }\n\n        /* Only seek if we're requesting a different frame to what we're currently sitting on. */\n        ma_data_source_get_cursor_in_pcm_frames(pDecoder->pBackend, &currentFrameIndex);\n        if (currentFrameIndex != internalFrameIndex) {\n            result = ma_data_source_seek_to_pcm_frame(pDecoder->pBackend, internalFrameIndex);\n            if (result == MA_SUCCESS) {\n                pDecoder->readPointerInPCMFrames = frameIndex;\n            }\n\n            /* Reset the data converter so that any cached data in the resampler is cleared. */\n            ma_data_converter_reset(&pDecoder->converter);\n        }\n\n        return result;\n    }\n\n    /* Should never get here, but if we do it means onSeekToPCMFrame was not set by the backend. */\n    return MA_INVALID_ARGS;\n}\n\nMA_API ma_result ma_decoder_get_data_format(ma_decoder* pDecoder, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    if (pDecoder == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pFormat != NULL) {\n        *pFormat = pDecoder->outputFormat;\n    }\n\n    if (pChannels != NULL) {\n        *pChannels = pDecoder->outputChannels;\n    }\n\n    if (pSampleRate != NULL) {\n        *pSampleRate = pDecoder->outputSampleRate;\n    }\n\n    if (pChannelMap != NULL) {\n        ma_data_converter_get_output_channel_map(&pDecoder->converter, pChannelMap, channelMapCap);\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_decoder_get_cursor_in_pcm_frames(ma_decoder* pDecoder, ma_uint64* pCursor)\n{\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;\n\n    if (pDecoder == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = pDecoder->readPointerInPCMFrames;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_decoder_get_length_in_pcm_frames(ma_decoder* pDecoder, ma_uint64* pLength)\n{\n    if (pLength == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pLength = 0;\n\n    if (pDecoder == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pDecoder->pBackend != NULL) {\n        ma_result result;\n        ma_uint64 internalLengthInPCMFrames;\n        ma_uint32 internalSampleRate;\n\n        result = ma_data_source_get_length_in_pcm_frames(pDecoder->pBackend, &internalLengthInPCMFrames);\n        if (result != MA_SUCCESS) {\n            return result;  /* Failed to retrieve the internal length. */\n        }\n\n        result = ma_data_source_get_data_format(pDecoder->pBackend, NULL, NULL, &internalSampleRate, NULL, 0);\n        if (result != MA_SUCCESS) {\n            return result;   /* Failed to retrieve the internal sample rate. */\n        }\n\n        if (internalSampleRate == pDecoder->outputSampleRate) {\n            *pLength = internalLengthInPCMFrames;\n        } else {\n            *pLength = ma_calculate_frame_count_after_resampling(pDecoder->outputSampleRate, internalSampleRate, internalLengthInPCMFrames);\n        }\n\n        return MA_SUCCESS;\n    } else {\n        return MA_NO_BACKEND;\n    }\n}\n\nMA_API ma_result ma_decoder_get_available_frames(ma_decoder* pDecoder, ma_uint64* pAvailableFrames)\n{\n    ma_result result;\n    ma_uint64 totalFrameCount;\n\n    if (pAvailableFrames == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pAvailableFrames = 0;\n\n    if (pDecoder == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_decoder_get_length_in_pcm_frames(pDecoder, &totalFrameCount);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (totalFrameCount <= pDecoder->readPointerInPCMFrames) {\n        *pAvailableFrames = 0;\n    } else {\n        *pAvailableFrames = totalFrameCount - pDecoder->readPointerInPCMFrames;\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_decoder__full_decode_and_uninit(ma_decoder* pDecoder, ma_decoder_config* pConfigOut, ma_uint64* pFrameCountOut, void** ppPCMFramesOut)\n{\n    ma_result result;\n    ma_uint64 totalFrameCount;\n    ma_uint64 bpf;\n    ma_uint64 dataCapInFrames;\n    void* pPCMFramesOut;\n\n    MA_ASSERT(pDecoder != NULL);\n\n    totalFrameCount = 0;\n    bpf = ma_get_bytes_per_frame(pDecoder->outputFormat, pDecoder->outputChannels);\n\n    /* The frame count is unknown until we try reading. Thus, we just run in a loop. */\n    dataCapInFrames = 0;\n    pPCMFramesOut = NULL;\n    for (;;) {\n        ma_uint64 frameCountToTryReading;\n        ma_uint64 framesJustRead;\n\n        /* Make room if there's not enough. */\n        if (totalFrameCount == dataCapInFrames) {\n            void* pNewPCMFramesOut;\n            ma_uint64 newDataCapInFrames = dataCapInFrames*2;\n            if (newDataCapInFrames == 0) {\n                newDataCapInFrames = 4096;\n            }\n\n            if ((newDataCapInFrames * bpf) > MA_SIZE_MAX) {\n                ma_free(pPCMFramesOut, &pDecoder->allocationCallbacks);\n                return MA_TOO_BIG;\n            }\n\n            pNewPCMFramesOut = (void*)ma_realloc(pPCMFramesOut, (size_t)(newDataCapInFrames * bpf), &pDecoder->allocationCallbacks);\n            if (pNewPCMFramesOut == NULL) {\n                ma_free(pPCMFramesOut, &pDecoder->allocationCallbacks);\n                return MA_OUT_OF_MEMORY;\n            }\n\n            dataCapInFrames = newDataCapInFrames;\n            pPCMFramesOut = pNewPCMFramesOut;\n        }\n\n        frameCountToTryReading = dataCapInFrames - totalFrameCount;\n        MA_ASSERT(frameCountToTryReading > 0);\n\n        result = ma_decoder_read_pcm_frames(pDecoder, (ma_uint8*)pPCMFramesOut + (totalFrameCount * bpf), frameCountToTryReading, &framesJustRead);\n        totalFrameCount += framesJustRead;\n\n        if (result != MA_SUCCESS) {\n            break;\n        }\n\n        if (framesJustRead < frameCountToTryReading) {\n            break;\n        }\n    }\n\n\n    if (pConfigOut != NULL) {\n        pConfigOut->format     = pDecoder->outputFormat;\n        pConfigOut->channels   = pDecoder->outputChannels;\n        pConfigOut->sampleRate = pDecoder->outputSampleRate;\n    }\n\n    if (ppPCMFramesOut != NULL) {\n        *ppPCMFramesOut = pPCMFramesOut;\n    } else {\n        ma_free(pPCMFramesOut, &pDecoder->allocationCallbacks);\n    }\n\n    if (pFrameCountOut != NULL) {\n        *pFrameCountOut = totalFrameCount;\n    }\n\n    ma_decoder_uninit(pDecoder);\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_decode_from_vfs(ma_vfs* pVFS, const char* pFilePath, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut)\n{\n    ma_result result;\n    ma_decoder_config config;\n    ma_decoder decoder;\n\n    if (pFrameCountOut != NULL) {\n        *pFrameCountOut = 0;\n    }\n    if (ppPCMFramesOut != NULL) {\n        *ppPCMFramesOut = NULL;\n    }\n\n    config = ma_decoder_config_init_copy(pConfig);\n\n    result = ma_decoder_init_vfs(pVFS, pFilePath, &config, &decoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = ma_decoder__full_decode_and_uninit(&decoder, pConfig, pFrameCountOut, ppPCMFramesOut);\n\n    return result;\n}\n\nMA_API ma_result ma_decode_file(const char* pFilePath, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut)\n{\n    return ma_decode_from_vfs(NULL, pFilePath, pConfig, pFrameCountOut, ppPCMFramesOut);\n}\n\nMA_API ma_result ma_decode_memory(const void* pData, size_t dataSize, ma_decoder_config* pConfig, ma_uint64* pFrameCountOut, void** ppPCMFramesOut)\n{\n    ma_decoder_config config;\n    ma_decoder decoder;\n    ma_result result;\n\n    if (pFrameCountOut != NULL) {\n        *pFrameCountOut = 0;\n    }\n    if (ppPCMFramesOut != NULL) {\n        *ppPCMFramesOut = NULL;\n    }\n\n    if (pData == NULL || dataSize == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    config = ma_decoder_config_init_copy(pConfig);\n\n    result = ma_decoder_init_memory(pData, dataSize, &config, &decoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_decoder__full_decode_and_uninit(&decoder, pConfig, pFrameCountOut, ppPCMFramesOut);\n}\n#endif  /* MA_NO_DECODING */\n\n\n#ifndef MA_NO_ENCODING\n\n#if defined(MA_HAS_WAV)\nstatic size_t ma_encoder__internal_on_write_wav(void* pUserData, const void* pData, size_t bytesToWrite)\n{\n    ma_encoder* pEncoder = (ma_encoder*)pUserData;\n    size_t bytesWritten = 0;\n\n    MA_ASSERT(pEncoder != NULL);\n\n    pEncoder->onWrite(pEncoder, pData, bytesToWrite, &bytesWritten);\n    return bytesWritten;\n}\n\nstatic ma_bool32 ma_encoder__internal_on_seek_wav(void* pUserData, int offset, ma_dr_wav_seek_origin origin)\n{\n    ma_encoder* pEncoder = (ma_encoder*)pUserData;\n    ma_result result;\n\n    MA_ASSERT(pEncoder != NULL);\n\n    result = pEncoder->onSeek(pEncoder, offset, (origin == ma_dr_wav_seek_origin_start) ? ma_seek_origin_start : ma_seek_origin_current);\n    if (result != MA_SUCCESS) {\n        return MA_FALSE;\n    } else {\n        return MA_TRUE;\n    }\n}\n\nstatic ma_result ma_encoder__on_init_wav(ma_encoder* pEncoder)\n{\n    ma_dr_wav_data_format wavFormat;\n    ma_allocation_callbacks allocationCallbacks;\n    ma_dr_wav* pWav;\n\n    MA_ASSERT(pEncoder != NULL);\n\n    pWav = (ma_dr_wav*)ma_malloc(sizeof(*pWav), &pEncoder->config.allocationCallbacks);\n    if (pWav == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    wavFormat.container     = ma_dr_wav_container_riff;\n    wavFormat.channels      = pEncoder->config.channels;\n    wavFormat.sampleRate    = pEncoder->config.sampleRate;\n    wavFormat.bitsPerSample = ma_get_bytes_per_sample(pEncoder->config.format) * 8;\n    if (pEncoder->config.format == ma_format_f32) {\n        wavFormat.format    = MA_DR_WAVE_FORMAT_IEEE_FLOAT;\n    } else {\n        wavFormat.format    = MA_DR_WAVE_FORMAT_PCM;\n    }\n\n    allocationCallbacks.pUserData = pEncoder->config.allocationCallbacks.pUserData;\n    allocationCallbacks.onMalloc  = pEncoder->config.allocationCallbacks.onMalloc;\n    allocationCallbacks.onRealloc = pEncoder->config.allocationCallbacks.onRealloc;\n    allocationCallbacks.onFree    = pEncoder->config.allocationCallbacks.onFree;\n\n    if (!ma_dr_wav_init_write(pWav, &wavFormat, ma_encoder__internal_on_write_wav, ma_encoder__internal_on_seek_wav, pEncoder, &allocationCallbacks)) {\n        return MA_ERROR;\n    }\n\n    pEncoder->pInternalEncoder = pWav;\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_encoder__on_uninit_wav(ma_encoder* pEncoder)\n{\n    ma_dr_wav* pWav;\n\n    MA_ASSERT(pEncoder != NULL);\n\n    pWav = (ma_dr_wav*)pEncoder->pInternalEncoder;\n    MA_ASSERT(pWav != NULL);\n\n    ma_dr_wav_uninit(pWav);\n    ma_free(pWav, &pEncoder->config.allocationCallbacks);\n}\n\nstatic ma_result ma_encoder__on_write_pcm_frames_wav(ma_encoder* pEncoder, const void* pFramesIn, ma_uint64 frameCount, ma_uint64* pFramesWritten)\n{\n    ma_dr_wav* pWav;\n    ma_uint64 framesWritten;\n\n    MA_ASSERT(pEncoder != NULL);\n\n    pWav = (ma_dr_wav*)pEncoder->pInternalEncoder;\n    MA_ASSERT(pWav != NULL);\n\n    framesWritten = ma_dr_wav_write_pcm_frames(pWav, frameCount, pFramesIn);\n\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = framesWritten;\n    }\n\n    return MA_SUCCESS;\n}\n#endif\n\nMA_API ma_encoder_config ma_encoder_config_init(ma_encoding_format encodingFormat, ma_format format, ma_uint32 channels, ma_uint32 sampleRate)\n{\n    ma_encoder_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.encodingFormat = encodingFormat;\n    config.format = format;\n    config.channels = channels;\n    config.sampleRate = sampleRate;\n\n    return config;\n}\n\nMA_API ma_result ma_encoder_preinit(const ma_encoder_config* pConfig, ma_encoder* pEncoder)\n{\n    ma_result result;\n\n    if (pEncoder == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pEncoder);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->format == ma_format_unknown || pConfig->channels == 0 || pConfig->sampleRate == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pEncoder->config = *pConfig;\n\n    result = ma_allocation_callbacks_init_copy(&pEncoder->config.allocationCallbacks, &pConfig->allocationCallbacks);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_encoder_init__internal(ma_encoder_write_proc onWrite, ma_encoder_seek_proc onSeek, void* pUserData, ma_encoder* pEncoder)\n{\n    ma_result result = MA_SUCCESS;\n\n    /* This assumes ma_encoder_preinit() has been called prior. */\n    MA_ASSERT(pEncoder != NULL);\n\n    if (onWrite == NULL || onSeek == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pEncoder->onWrite   = onWrite;\n    pEncoder->onSeek    = onSeek;\n    pEncoder->pUserData = pUserData;\n\n    switch (pEncoder->config.encodingFormat)\n    {\n        case ma_encoding_format_wav:\n        {\n        #if defined(MA_HAS_WAV)\n            pEncoder->onInit           = ma_encoder__on_init_wav;\n            pEncoder->onUninit         = ma_encoder__on_uninit_wav;\n            pEncoder->onWritePCMFrames = ma_encoder__on_write_pcm_frames_wav;\n        #else\n            result = MA_NO_BACKEND;\n        #endif\n        } break;\n\n        default:\n        {\n            result = MA_INVALID_ARGS;\n        } break;\n    }\n\n    /* Getting here means we should have our backend callbacks set up. */\n    if (result == MA_SUCCESS) {\n        result = pEncoder->onInit(pEncoder);\n    }\n\n    return result;\n}\n\nstatic ma_result ma_encoder__on_write_vfs(ma_encoder* pEncoder, const void* pBufferIn, size_t bytesToWrite, size_t* pBytesWritten)\n{\n    return ma_vfs_or_default_write(pEncoder->data.vfs.pVFS, pEncoder->data.vfs.file, pBufferIn, bytesToWrite, pBytesWritten);\n}\n\nstatic ma_result ma_encoder__on_seek_vfs(ma_encoder* pEncoder, ma_int64 offset, ma_seek_origin origin)\n{\n    return ma_vfs_or_default_seek(pEncoder->data.vfs.pVFS, pEncoder->data.vfs.file, offset, origin);\n}\n\nMA_API ma_result ma_encoder_init_vfs(ma_vfs* pVFS, const char* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder)\n{\n    ma_result result;\n    ma_vfs_file file;\n\n    result = ma_encoder_preinit(pConfig, pEncoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* Now open the file. If this fails we don't need to uninitialize the encoder. */\n    result = ma_vfs_or_default_open(pVFS, pFilePath, MA_OPEN_MODE_WRITE, &file);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pEncoder->data.vfs.pVFS = pVFS;\n    pEncoder->data.vfs.file = file;\n\n    result = ma_encoder_init__internal(ma_encoder__on_write_vfs, ma_encoder__on_seek_vfs, NULL, pEncoder);\n    if (result != MA_SUCCESS) {\n        ma_vfs_or_default_close(pVFS, file);\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_encoder_init_vfs_w(ma_vfs* pVFS, const wchar_t* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder)\n{\n    ma_result result;\n    ma_vfs_file file;\n\n    result = ma_encoder_preinit(pConfig, pEncoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* Now open the file. If this fails we don't need to uninitialize the encoder. */\n    result = ma_vfs_or_default_open_w(pVFS, pFilePath, MA_OPEN_MODE_WRITE, &file);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pEncoder->data.vfs.pVFS = pVFS;\n    pEncoder->data.vfs.file = file;\n\n    result = ma_encoder_init__internal(ma_encoder__on_write_vfs, ma_encoder__on_seek_vfs, NULL, pEncoder);\n    if (result != MA_SUCCESS) {\n        ma_vfs_or_default_close(pVFS, file);\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_encoder_init_file(const char* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder)\n{\n    return ma_encoder_init_vfs(NULL, pFilePath, pConfig, pEncoder);\n}\n\nMA_API ma_result ma_encoder_init_file_w(const wchar_t* pFilePath, const ma_encoder_config* pConfig, ma_encoder* pEncoder)\n{\n    return ma_encoder_init_vfs_w(NULL, pFilePath, pConfig, pEncoder);\n}\n\nMA_API ma_result ma_encoder_init(ma_encoder_write_proc onWrite, ma_encoder_seek_proc onSeek, void* pUserData, const ma_encoder_config* pConfig, ma_encoder* pEncoder)\n{\n    ma_result result;\n\n    result = ma_encoder_preinit(pConfig, pEncoder);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_encoder_init__internal(onWrite, onSeek, pUserData, pEncoder);\n}\n\n\nMA_API void ma_encoder_uninit(ma_encoder* pEncoder)\n{\n    if (pEncoder == NULL) {\n        return;\n    }\n\n    if (pEncoder->onUninit) {\n        pEncoder->onUninit(pEncoder);\n    }\n\n    /* If we have a file handle, close it. */\n    if (pEncoder->onWrite == ma_encoder__on_write_vfs) {\n        ma_vfs_or_default_close(pEncoder->data.vfs.pVFS, pEncoder->data.vfs.file);\n        pEncoder->data.vfs.file = NULL;\n    }\n}\n\n\nMA_API ma_result ma_encoder_write_pcm_frames(ma_encoder* pEncoder, const void* pFramesIn, ma_uint64 frameCount, ma_uint64* pFramesWritten)\n{\n    if (pFramesWritten != NULL) {\n        *pFramesWritten = 0;\n    }\n\n    if (pEncoder == NULL || pFramesIn == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return pEncoder->onWritePCMFrames(pEncoder, pFramesIn, frameCount, pFramesWritten);\n}\n#endif  /* MA_NO_ENCODING */\n\n\n\n/**************************************************************************************************************************************************************\n\nGeneration\n\n**************************************************************************************************************************************************************/\n#ifndef MA_NO_GENERATION\nMA_API ma_waveform_config ma_waveform_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, ma_waveform_type type, double amplitude, double frequency)\n{\n    ma_waveform_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format     = format;\n    config.channels   = channels;\n    config.sampleRate = sampleRate;\n    config.type       = type;\n    config.amplitude  = amplitude;\n    config.frequency  = frequency;\n\n    return config;\n}\n\nstatic ma_result ma_waveform__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    return ma_waveform_read_pcm_frames((ma_waveform*)pDataSource, pFramesOut, frameCount, pFramesRead);\n}\n\nstatic ma_result ma_waveform__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    return ma_waveform_seek_to_pcm_frame((ma_waveform*)pDataSource, frameIndex);\n}\n\nstatic ma_result ma_waveform__data_source_on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    ma_waveform* pWaveform = (ma_waveform*)pDataSource;\n\n    *pFormat     = pWaveform->config.format;\n    *pChannels   = pWaveform->config.channels;\n    *pSampleRate = pWaveform->config.sampleRate;\n    ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pWaveform->config.channels);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_waveform__data_source_on_get_cursor(ma_data_source* pDataSource, ma_uint64* pCursor)\n{\n    ma_waveform* pWaveform = (ma_waveform*)pDataSource;\n\n    *pCursor = (ma_uint64)(pWaveform->time / pWaveform->advance);\n\n    return MA_SUCCESS;\n}\n\nstatic double ma_waveform__calculate_advance(ma_uint32 sampleRate, double frequency)\n{\n    return (1.0 / (sampleRate / frequency));\n}\n\nstatic void ma_waveform__update_advance(ma_waveform* pWaveform)\n{\n    pWaveform->advance = ma_waveform__calculate_advance(pWaveform->config.sampleRate, pWaveform->config.frequency);\n}\n\nstatic ma_data_source_vtable g_ma_waveform_data_source_vtable =\n{\n    ma_waveform__data_source_on_read,\n    ma_waveform__data_source_on_seek,\n    ma_waveform__data_source_on_get_data_format,\n    ma_waveform__data_source_on_get_cursor,\n    NULL,   /* onGetLength. There's no notion of a length in waveforms. */\n    NULL,   /* onSetLooping */\n    0\n};\n\nMA_API ma_result ma_waveform_init(const ma_waveform_config* pConfig, ma_waveform* pWaveform)\n{\n    ma_result result;\n    ma_data_source_config dataSourceConfig;\n\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pWaveform);\n\n    dataSourceConfig = ma_data_source_config_init();\n    dataSourceConfig.vtable = &g_ma_waveform_data_source_vtable;\n\n    result = ma_data_source_init(&dataSourceConfig, &pWaveform->ds);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pWaveform->config  = *pConfig;\n    pWaveform->advance = ma_waveform__calculate_advance(pWaveform->config.sampleRate, pWaveform->config.frequency);\n    pWaveform->time    = 0;\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_waveform_uninit(ma_waveform* pWaveform)\n{\n    if (pWaveform == NULL) {\n        return;\n    }\n\n    ma_data_source_uninit(&pWaveform->ds);\n}\n\nMA_API ma_result ma_waveform_set_amplitude(ma_waveform* pWaveform, double amplitude)\n{\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pWaveform->config.amplitude = amplitude;\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_waveform_set_frequency(ma_waveform* pWaveform, double frequency)\n{\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pWaveform->config.frequency = frequency;\n    ma_waveform__update_advance(pWaveform);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_waveform_set_type(ma_waveform* pWaveform, ma_waveform_type type)\n{\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pWaveform->config.type = type;\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_waveform_set_sample_rate(ma_waveform* pWaveform, ma_uint32 sampleRate)\n{\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pWaveform->config.sampleRate = sampleRate;\n    ma_waveform__update_advance(pWaveform);\n\n    return MA_SUCCESS;\n}\n\nstatic float ma_waveform_sine_f32(double time, double amplitude)\n{\n    return (float)(ma_sind(MA_TAU_D * time) * amplitude);\n}\n\nstatic ma_int16 ma_waveform_sine_s16(double time, double amplitude)\n{\n    return ma_pcm_sample_f32_to_s16(ma_waveform_sine_f32(time, amplitude));\n}\n\nstatic float ma_waveform_square_f32(double time, double dutyCycle, double amplitude)\n{\n    double f = time - (ma_int64)time;\n    double r;\n\n    if (f < dutyCycle) {\n        r =  amplitude;\n    } else {\n        r = -amplitude;\n    }\n\n    return (float)r;\n}\n\nstatic ma_int16 ma_waveform_square_s16(double time, double dutyCycle, double amplitude)\n{\n    return ma_pcm_sample_f32_to_s16(ma_waveform_square_f32(time, dutyCycle, amplitude));\n}\n\nstatic float ma_waveform_triangle_f32(double time, double amplitude)\n{\n    double f = time - (ma_int64)time;\n    double r;\n\n    r = 2 * ma_abs(2 * (f - 0.5)) - 1;\n\n    return (float)(r * amplitude);\n}\n\nstatic ma_int16 ma_waveform_triangle_s16(double time, double amplitude)\n{\n    return ma_pcm_sample_f32_to_s16(ma_waveform_triangle_f32(time, amplitude));\n}\n\nstatic float ma_waveform_sawtooth_f32(double time, double amplitude)\n{\n    double f = time - (ma_int64)time;\n    double r;\n\n    r = 2 * (f - 0.5);\n\n    return (float)(r * amplitude);\n}\n\nstatic ma_int16 ma_waveform_sawtooth_s16(double time, double amplitude)\n{\n    return ma_pcm_sample_f32_to_s16(ma_waveform_sawtooth_f32(time, amplitude));\n}\n\nstatic void ma_waveform_read_pcm_frames__sine(ma_waveform* pWaveform, void* pFramesOut, ma_uint64 frameCount)\n{\n    ma_uint64 iFrame;\n    ma_uint64 iChannel;\n    ma_uint32 bps = ma_get_bytes_per_sample(pWaveform->config.format);\n    ma_uint32 bpf = bps * pWaveform->config.channels;\n\n    MA_ASSERT(pWaveform  != NULL);\n    MA_ASSERT(pFramesOut != NULL);\n\n    if (pWaveform->config.format == ma_format_f32) {\n        float* pFramesOutF32 = (float*)pFramesOut;\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            float s = ma_waveform_sine_f32(pWaveform->time, pWaveform->config.amplitude);\n            pWaveform->time += pWaveform->advance;\n\n            for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) {\n                pFramesOutF32[iFrame*pWaveform->config.channels + iChannel] = s;\n            }\n        }\n    } else if (pWaveform->config.format == ma_format_s16) {\n        ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut;\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            ma_int16 s = ma_waveform_sine_s16(pWaveform->time, pWaveform->config.amplitude);\n            pWaveform->time += pWaveform->advance;\n\n            for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) {\n                pFramesOutS16[iFrame*pWaveform->config.channels + iChannel] = s;\n            }\n        }\n    } else {\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            float s = ma_waveform_sine_f32(pWaveform->time, pWaveform->config.amplitude);\n            pWaveform->time += pWaveform->advance;\n\n            for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) {\n                ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pWaveform->config.format, &s, ma_format_f32, 1, ma_dither_mode_none);\n            }\n        }\n    }\n}\n\nstatic void ma_waveform_read_pcm_frames__square(ma_waveform* pWaveform, double dutyCycle, void* pFramesOut, ma_uint64 frameCount)\n{\n    ma_uint64 iFrame;\n    ma_uint64 iChannel;\n    ma_uint32 bps = ma_get_bytes_per_sample(pWaveform->config.format);\n    ma_uint32 bpf = bps * pWaveform->config.channels;\n\n    MA_ASSERT(pWaveform  != NULL);\n    MA_ASSERT(pFramesOut != NULL);\n\n    if (pWaveform->config.format == ma_format_f32) {\n        float* pFramesOutF32 = (float*)pFramesOut;\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            float s = ma_waveform_square_f32(pWaveform->time, dutyCycle, pWaveform->config.amplitude);\n            pWaveform->time += pWaveform->advance;\n\n            for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) {\n                pFramesOutF32[iFrame*pWaveform->config.channels + iChannel] = s;\n            }\n        }\n    } else if (pWaveform->config.format == ma_format_s16) {\n        ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut;\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            ma_int16 s = ma_waveform_square_s16(pWaveform->time, dutyCycle, pWaveform->config.amplitude);\n            pWaveform->time += pWaveform->advance;\n\n            for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) {\n                pFramesOutS16[iFrame*pWaveform->config.channels + iChannel] = s;\n            }\n        }\n    } else {\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            float s = ma_waveform_square_f32(pWaveform->time, dutyCycle, pWaveform->config.amplitude);\n            pWaveform->time += pWaveform->advance;\n\n            for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) {\n                ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pWaveform->config.format, &s, ma_format_f32, 1, ma_dither_mode_none);\n            }\n        }\n    }\n}\n\nstatic void ma_waveform_read_pcm_frames__triangle(ma_waveform* pWaveform, void* pFramesOut, ma_uint64 frameCount)\n{\n    ma_uint64 iFrame;\n    ma_uint64 iChannel;\n    ma_uint32 bps = ma_get_bytes_per_sample(pWaveform->config.format);\n    ma_uint32 bpf = bps * pWaveform->config.channels;\n\n    MA_ASSERT(pWaveform  != NULL);\n    MA_ASSERT(pFramesOut != NULL);\n\n    if (pWaveform->config.format == ma_format_f32) {\n        float* pFramesOutF32 = (float*)pFramesOut;\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            float s = ma_waveform_triangle_f32(pWaveform->time, pWaveform->config.amplitude);\n            pWaveform->time += pWaveform->advance;\n\n            for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) {\n                pFramesOutF32[iFrame*pWaveform->config.channels + iChannel] = s;\n            }\n        }\n    } else if (pWaveform->config.format == ma_format_s16) {\n        ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut;\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            ma_int16 s = ma_waveform_triangle_s16(pWaveform->time, pWaveform->config.amplitude);\n            pWaveform->time += pWaveform->advance;\n\n            for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) {\n                pFramesOutS16[iFrame*pWaveform->config.channels + iChannel] = s;\n            }\n        }\n    } else {\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            float s = ma_waveform_triangle_f32(pWaveform->time, pWaveform->config.amplitude);\n            pWaveform->time += pWaveform->advance;\n\n            for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) {\n                ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pWaveform->config.format, &s, ma_format_f32, 1, ma_dither_mode_none);\n            }\n        }\n    }\n}\n\nstatic void ma_waveform_read_pcm_frames__sawtooth(ma_waveform* pWaveform, void* pFramesOut, ma_uint64 frameCount)\n{\n    ma_uint64 iFrame;\n    ma_uint64 iChannel;\n    ma_uint32 bps = ma_get_bytes_per_sample(pWaveform->config.format);\n    ma_uint32 bpf = bps * pWaveform->config.channels;\n\n    MA_ASSERT(pWaveform  != NULL);\n    MA_ASSERT(pFramesOut != NULL);\n\n    if (pWaveform->config.format == ma_format_f32) {\n        float* pFramesOutF32 = (float*)pFramesOut;\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            float s = ma_waveform_sawtooth_f32(pWaveform->time, pWaveform->config.amplitude);\n            pWaveform->time += pWaveform->advance;\n\n            for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) {\n                pFramesOutF32[iFrame*pWaveform->config.channels + iChannel] = s;\n            }\n        }\n    } else if (pWaveform->config.format == ma_format_s16) {\n        ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut;\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            ma_int16 s = ma_waveform_sawtooth_s16(pWaveform->time, pWaveform->config.amplitude);\n            pWaveform->time += pWaveform->advance;\n\n            for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) {\n                pFramesOutS16[iFrame*pWaveform->config.channels + iChannel] = s;\n            }\n        }\n    } else {\n        for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n            float s = ma_waveform_sawtooth_f32(pWaveform->time, pWaveform->config.amplitude);\n            pWaveform->time += pWaveform->advance;\n\n            for (iChannel = 0; iChannel < pWaveform->config.channels; iChannel += 1) {\n                ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pWaveform->config.format, &s, ma_format_f32, 1, ma_dither_mode_none);\n            }\n        }\n    }\n}\n\nMA_API ma_result ma_waveform_read_pcm_frames(ma_waveform* pWaveform, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    if (frameCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pFramesOut != NULL) {\n        switch (pWaveform->config.type)\n        {\n            case ma_waveform_type_sine:\n            {\n                ma_waveform_read_pcm_frames__sine(pWaveform, pFramesOut, frameCount);\n            } break;\n\n            case ma_waveform_type_square:\n            {\n                ma_waveform_read_pcm_frames__square(pWaveform, 0.5, pFramesOut, frameCount);\n            } break;\n\n            case ma_waveform_type_triangle:\n            {\n                ma_waveform_read_pcm_frames__triangle(pWaveform, pFramesOut, frameCount);\n            } break;\n\n            case ma_waveform_type_sawtooth:\n            {\n                ma_waveform_read_pcm_frames__sawtooth(pWaveform, pFramesOut, frameCount);\n            } break;\n\n            default: return MA_INVALID_OPERATION;   /* Unknown waveform type. */\n        }\n    } else {\n        pWaveform->time += pWaveform->advance * (ma_int64)frameCount; /* Cast to int64 required for VC6. Won't affect anything in practice. */\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = frameCount;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_waveform_seek_to_pcm_frame(ma_waveform* pWaveform, ma_uint64 frameIndex)\n{\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pWaveform->time = pWaveform->advance * (ma_int64)frameIndex;    /* Casting for VC6. Won't be an issue in practice. */\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_pulsewave_config ma_pulsewave_config_init(ma_format format, ma_uint32 channels, ma_uint32 sampleRate, double dutyCycle, double amplitude, double frequency)\n{\n    ma_pulsewave_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.format     = format;\n    config.channels   = channels;\n    config.sampleRate = sampleRate;\n    config.dutyCycle  = dutyCycle;\n    config.amplitude  = amplitude;\n    config.frequency  = frequency;\n\n    return config;\n}\n\nMA_API ma_result ma_pulsewave_init(const ma_pulsewave_config* pConfig, ma_pulsewave* pWaveform)\n{\n    ma_result result;\n    ma_waveform_config config;\n\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pWaveform);\n\n    config = ma_waveform_config_init(\n        pConfig->format,\n        pConfig->channels,\n        pConfig->sampleRate,\n        ma_waveform_type_square,\n        pConfig->amplitude,\n        pConfig->frequency\n    );\n\n    result = ma_waveform_init(&config, &pWaveform->waveform);\n    ma_pulsewave_set_duty_cycle(pWaveform, pConfig->dutyCycle);\n\n    return result;\n}\n\nMA_API void ma_pulsewave_uninit(ma_pulsewave* pWaveform)\n{\n    if (pWaveform == NULL) {\n        return;\n    }\n\n    ma_waveform_uninit(&pWaveform->waveform);\n}\n\nMA_API ma_result ma_pulsewave_read_pcm_frames(ma_pulsewave* pWaveform, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    if (frameCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pFramesOut != NULL) {\n        ma_waveform_read_pcm_frames__square(&pWaveform->waveform, pWaveform->config.dutyCycle, pFramesOut, frameCount);\n    } else {\n        pWaveform->waveform.time += pWaveform->waveform.advance * (ma_int64)frameCount; /* Cast to int64 required for VC6. Won't affect anything in practice. */\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = frameCount;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_pulsewave_seek_to_pcm_frame(ma_pulsewave* pWaveform, ma_uint64 frameIndex)\n{\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_waveform_seek_to_pcm_frame(&pWaveform->waveform, frameIndex);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_pulsewave_set_amplitude(ma_pulsewave* pWaveform, double amplitude)\n{\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pWaveform->config.amplitude = amplitude;\n    ma_waveform_set_amplitude(&pWaveform->waveform, amplitude);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_pulsewave_set_frequency(ma_pulsewave* pWaveform, double frequency)\n{\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pWaveform->config.frequency = frequency;\n    ma_waveform_set_frequency(&pWaveform->waveform, frequency);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_pulsewave_set_sample_rate(ma_pulsewave* pWaveform, ma_uint32 sampleRate)\n{\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pWaveform->config.sampleRate = sampleRate;\n    ma_waveform_set_sample_rate(&pWaveform->waveform, sampleRate);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_pulsewave_set_duty_cycle(ma_pulsewave* pWaveform, double dutyCycle)\n{\n    if (pWaveform == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pWaveform->config.dutyCycle = dutyCycle;\n\n    return MA_SUCCESS;\n}\n\n\n\nMA_API ma_noise_config ma_noise_config_init(ma_format format, ma_uint32 channels, ma_noise_type type, ma_int32 seed, double amplitude)\n{\n    ma_noise_config config;\n    MA_ZERO_OBJECT(&config);\n\n    config.format    = format;\n    config.channels  = channels;\n    config.type      = type;\n    config.seed      = seed;\n    config.amplitude = amplitude;\n\n    if (config.seed == 0) {\n        config.seed = MA_DEFAULT_LCG_SEED;\n    }\n\n    return config;\n}\n\n\nstatic ma_result ma_noise__data_source_on_read(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    return ma_noise_read_pcm_frames((ma_noise*)pDataSource, pFramesOut, frameCount, pFramesRead);\n}\n\nstatic ma_result ma_noise__data_source_on_seek(ma_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    /* No-op. Just pretend to be successful. */\n    (void)pDataSource;\n    (void)frameIndex;\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_noise__data_source_on_get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    ma_noise* pNoise = (ma_noise*)pDataSource;\n\n    *pFormat     = pNoise->config.format;\n    *pChannels   = pNoise->config.channels;\n    *pSampleRate = 0;   /* There is no notion of sample rate with noise generation. */\n    ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pNoise->config.channels);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_data_source_vtable g_ma_noise_data_source_vtable =\n{\n    ma_noise__data_source_on_read,\n    ma_noise__data_source_on_seek,  /* No-op for noise. */\n    ma_noise__data_source_on_get_data_format,\n    NULL,   /* onGetCursor. No notion of a cursor for noise. */\n    NULL,   /* onGetLength. No notion of a length for noise. */\n    NULL,   /* onSetLooping */\n    0\n};\n\n\n#ifndef MA_PINK_NOISE_BIN_SIZE\n#define MA_PINK_NOISE_BIN_SIZE 16\n#endif\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    struct\n    {\n        size_t binOffset;\n        size_t accumulationOffset;\n        size_t counterOffset;\n    } pink;\n    struct\n    {\n        size_t accumulationOffset;\n    } brownian;\n} ma_noise_heap_layout;\n\nstatic ma_result ma_noise_get_heap_layout(const ma_noise_config* pConfig, ma_noise_heap_layout* pHeapLayout)\n{\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->channels == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* Pink. */\n    if (pConfig->type == ma_noise_type_pink) {\n        /* bin */\n        pHeapLayout->pink.binOffset = pHeapLayout->sizeInBytes;\n        pHeapLayout->sizeInBytes += sizeof(double*) * pConfig->channels;\n        pHeapLayout->sizeInBytes += sizeof(double ) * pConfig->channels * MA_PINK_NOISE_BIN_SIZE;\n\n        /* accumulation */\n        pHeapLayout->pink.accumulationOffset = pHeapLayout->sizeInBytes;\n        pHeapLayout->sizeInBytes += sizeof(double) * pConfig->channels;\n\n        /* counter */\n        pHeapLayout->pink.counterOffset = pHeapLayout->sizeInBytes;\n        pHeapLayout->sizeInBytes += sizeof(ma_uint32) * pConfig->channels;\n    }\n\n    /* Brownian. */\n    if (pConfig->type == ma_noise_type_brownian) {\n        /* accumulation */\n        pHeapLayout->brownian.accumulationOffset = pHeapLayout->sizeInBytes;\n        pHeapLayout->sizeInBytes += sizeof(double) * pConfig->channels;\n    }\n\n    /* Make sure allocation size is aligned. */\n    pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_noise_get_heap_size(const ma_noise_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_noise_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_noise_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_noise_init_preallocated(const ma_noise_config* pConfig, void* pHeap, ma_noise* pNoise)\n{\n    ma_result result;\n    ma_noise_heap_layout heapLayout;\n    ma_data_source_config dataSourceConfig;\n    ma_uint32 iChannel;\n\n    if (pNoise == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pNoise);\n\n    result = ma_noise_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pNoise->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pNoise->_pHeap, heapLayout.sizeInBytes);\n\n    dataSourceConfig = ma_data_source_config_init();\n    dataSourceConfig.vtable = &g_ma_noise_data_source_vtable;\n\n    result = ma_data_source_init(&dataSourceConfig, &pNoise->ds);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pNoise->config = *pConfig;\n    ma_lcg_seed(&pNoise->lcg, pConfig->seed);\n\n    if (pNoise->config.type == ma_noise_type_pink) {\n        pNoise->state.pink.bin          = (double**  )ma_offset_ptr(pHeap, heapLayout.pink.binOffset);\n        pNoise->state.pink.accumulation = (double*   )ma_offset_ptr(pHeap, heapLayout.pink.accumulationOffset);\n        pNoise->state.pink.counter      = (ma_uint32*)ma_offset_ptr(pHeap, heapLayout.pink.counterOffset);\n\n        for (iChannel = 0; iChannel < pConfig->channels; iChannel += 1) {\n            pNoise->state.pink.bin[iChannel]          = (double*)ma_offset_ptr(pHeap, heapLayout.pink.binOffset + (sizeof(double*) * pConfig->channels) + (sizeof(double) * MA_PINK_NOISE_BIN_SIZE * iChannel));\n            pNoise->state.pink.accumulation[iChannel] = 0;\n            pNoise->state.pink.counter[iChannel]      = 1;\n        }\n    }\n\n    if (pNoise->config.type == ma_noise_type_brownian) {\n        pNoise->state.brownian.accumulation = (double*)ma_offset_ptr(pHeap, heapLayout.brownian.accumulationOffset);\n\n        for (iChannel = 0; iChannel < pConfig->channels; iChannel += 1) {\n            pNoise->state.brownian.accumulation[iChannel] = 0;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_noise_init(const ma_noise_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_noise* pNoise)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_noise_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_noise_init_preallocated(pConfig, pHeap, pNoise);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pNoise->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_noise_uninit(ma_noise* pNoise, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pNoise == NULL) {\n        return;\n    }\n\n    ma_data_source_uninit(&pNoise->ds);\n\n    if (pNoise->_ownsHeap) {\n        ma_free(pNoise->_pHeap, pAllocationCallbacks);\n    }\n}\n\nMA_API ma_result ma_noise_set_amplitude(ma_noise* pNoise, double amplitude)\n{\n    if (pNoise == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pNoise->config.amplitude = amplitude;\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_noise_set_seed(ma_noise* pNoise, ma_int32 seed)\n{\n    if (pNoise == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pNoise->lcg.state = seed;\n    return MA_SUCCESS;\n}\n\n\nMA_API ma_result ma_noise_set_type(ma_noise* pNoise, ma_noise_type type)\n{\n    if (pNoise == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /*\n    This function should never have been implemented in the first place. Changing the type dynamically is not\n    supported. Instead you need to uninitialize and reinitiailize a fresh `ma_noise` object. This function\n    will be removed in version 0.12.\n    */\n    MA_ASSERT(MA_FALSE);\n    (void)type;\n\n    return MA_INVALID_OPERATION;\n}\n\nstatic MA_INLINE float ma_noise_f32_white(ma_noise* pNoise)\n{\n    return (float)(ma_lcg_rand_f64(&pNoise->lcg) * pNoise->config.amplitude);\n}\n\nstatic MA_INLINE ma_int16 ma_noise_s16_white(ma_noise* pNoise)\n{\n    return ma_pcm_sample_f32_to_s16(ma_noise_f32_white(pNoise));\n}\n\nstatic MA_INLINE ma_uint64 ma_noise_read_pcm_frames__white(ma_noise* pNoise, void* pFramesOut, ma_uint64 frameCount)\n{\n    ma_uint64 iFrame;\n    ma_uint32 iChannel;\n    const ma_uint32 channels = pNoise->config.channels;\n    MA_ASSUME(channels > 0);\n\n    if (pNoise->config.format == ma_format_f32) {\n        float* pFramesOutF32 = (float*)pFramesOut;\n        if (pNoise->config.duplicateChannels) {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                float s = ma_noise_f32_white(pNoise);\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    pFramesOutF32[iFrame*channels + iChannel] = s;\n                }\n            }\n        } else {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    pFramesOutF32[iFrame*channels + iChannel] = ma_noise_f32_white(pNoise);\n                }\n            }\n        }\n    } else if (pNoise->config.format == ma_format_s16) {\n        ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut;\n        if (pNoise->config.duplicateChannels) {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                ma_int16 s = ma_noise_s16_white(pNoise);\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    pFramesOutS16[iFrame*channels + iChannel] = s;\n                }\n            }\n        } else {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    pFramesOutS16[iFrame*channels + iChannel] = ma_noise_s16_white(pNoise);\n                }\n            }\n        }\n    } else {\n        const ma_uint32 bps = ma_get_bytes_per_sample(pNoise->config.format);\n        const ma_uint32 bpf = bps * channels;\n\n        if (pNoise->config.duplicateChannels) {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                float s = ma_noise_f32_white(pNoise);\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pNoise->config.format, &s, ma_format_f32, 1, ma_dither_mode_none);\n                }\n            }\n        } else {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    float s = ma_noise_f32_white(pNoise);\n                    ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pNoise->config.format, &s, ma_format_f32, 1, ma_dither_mode_none);\n                }\n            }\n        }\n    }\n\n    return frameCount;\n}\n\n\nstatic MA_INLINE unsigned int ma_tzcnt32(unsigned int x)\n{\n    unsigned int n;\n\n    /* Special case for odd numbers since they should happen about half the time. */\n    if (x & 0x1)  {\n        return 0;\n    }\n\n    if (x == 0) {\n        return sizeof(x) << 3;\n    }\n\n    n = 1;\n    if ((x & 0x0000FFFF) == 0) { x >>= 16; n += 16; }\n    if ((x & 0x000000FF) == 0) { x >>=  8; n +=  8; }\n    if ((x & 0x0000000F) == 0) { x >>=  4; n +=  4; }\n    if ((x & 0x00000003) == 0) { x >>=  2; n +=  2; }\n    n -= x & 0x00000001;\n\n    return n;\n}\n\n/*\nPink noise generation based on Tonic (public domain) with modifications. https://github.com/TonicAudio/Tonic/blob/master/src/Tonic/Noise.h\n\nThis is basically _the_ reference for pink noise from what I've found: http://www.firstpr.com.au/dsp/pink-noise/\n*/\nstatic MA_INLINE float ma_noise_f32_pink(ma_noise* pNoise, ma_uint32 iChannel)\n{\n    double result;\n    double binPrev;\n    double binNext;\n    unsigned int ibin;\n\n    ibin = ma_tzcnt32(pNoise->state.pink.counter[iChannel]) & (MA_PINK_NOISE_BIN_SIZE - 1);\n\n    binPrev = pNoise->state.pink.bin[iChannel][ibin];\n    binNext = ma_lcg_rand_f64(&pNoise->lcg);\n    pNoise->state.pink.bin[iChannel][ibin] = binNext;\n\n    pNoise->state.pink.accumulation[iChannel] += (binNext - binPrev);\n    pNoise->state.pink.counter[iChannel]      += 1;\n\n    result = (ma_lcg_rand_f64(&pNoise->lcg) + pNoise->state.pink.accumulation[iChannel]);\n    result /= 10;\n\n    return (float)(result * pNoise->config.amplitude);\n}\n\nstatic MA_INLINE ma_int16 ma_noise_s16_pink(ma_noise* pNoise, ma_uint32 iChannel)\n{\n    return ma_pcm_sample_f32_to_s16(ma_noise_f32_pink(pNoise, iChannel));\n}\n\nstatic MA_INLINE ma_uint64 ma_noise_read_pcm_frames__pink(ma_noise* pNoise, void* pFramesOut, ma_uint64 frameCount)\n{\n    ma_uint64 iFrame;\n    ma_uint32 iChannel;\n    const ma_uint32 channels = pNoise->config.channels;\n    MA_ASSUME(channels > 0);\n\n    if (pNoise->config.format == ma_format_f32) {\n        float* pFramesOutF32 = (float*)pFramesOut;\n        if (pNoise->config.duplicateChannels) {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                float s = ma_noise_f32_pink(pNoise, 0);\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    pFramesOutF32[iFrame*channels + iChannel] = s;\n                }\n            }\n        } else {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    pFramesOutF32[iFrame*channels + iChannel] = ma_noise_f32_pink(pNoise, iChannel);\n                }\n            }\n        }\n    } else if (pNoise->config.format == ma_format_s16) {\n        ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut;\n        if (pNoise->config.duplicateChannels) {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                ma_int16 s = ma_noise_s16_pink(pNoise, 0);\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    pFramesOutS16[iFrame*channels + iChannel] = s;\n                }\n            }\n        } else {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    pFramesOutS16[iFrame*channels + iChannel] = ma_noise_s16_pink(pNoise, iChannel);\n                }\n            }\n        }\n    } else {\n        const ma_uint32 bps = ma_get_bytes_per_sample(pNoise->config.format);\n        const ma_uint32 bpf = bps * channels;\n\n        if (pNoise->config.duplicateChannels) {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                float s = ma_noise_f32_pink(pNoise, 0);\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pNoise->config.format, &s, ma_format_f32, 1, ma_dither_mode_none);\n                }\n            }\n        } else {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    float s = ma_noise_f32_pink(pNoise, iChannel);\n                    ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pNoise->config.format, &s, ma_format_f32, 1, ma_dither_mode_none);\n                }\n            }\n        }\n    }\n\n    return frameCount;\n}\n\n\nstatic MA_INLINE float ma_noise_f32_brownian(ma_noise* pNoise, ma_uint32 iChannel)\n{\n    double result;\n\n    result = (ma_lcg_rand_f64(&pNoise->lcg) + pNoise->state.brownian.accumulation[iChannel]);\n    result /= 1.005; /* Don't escape the -1..1 range on average. */\n\n    pNoise->state.brownian.accumulation[iChannel] = result;\n    result /= 20;\n\n    return (float)(result * pNoise->config.amplitude);\n}\n\nstatic MA_INLINE ma_int16 ma_noise_s16_brownian(ma_noise* pNoise, ma_uint32 iChannel)\n{\n    return ma_pcm_sample_f32_to_s16(ma_noise_f32_brownian(pNoise, iChannel));\n}\n\nstatic MA_INLINE ma_uint64 ma_noise_read_pcm_frames__brownian(ma_noise* pNoise, void* pFramesOut, ma_uint64 frameCount)\n{\n    ma_uint64 iFrame;\n    ma_uint32 iChannel;\n    const ma_uint32 channels = pNoise->config.channels;\n    MA_ASSUME(channels > 0);\n\n    if (pNoise->config.format == ma_format_f32) {\n        float* pFramesOutF32 = (float*)pFramesOut;\n        if (pNoise->config.duplicateChannels) {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                float s = ma_noise_f32_brownian(pNoise, 0);\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    pFramesOutF32[iFrame*channels + iChannel] = s;\n                }\n            }\n        } else {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    pFramesOutF32[iFrame*channels + iChannel] = ma_noise_f32_brownian(pNoise, iChannel);\n                }\n            }\n        }\n    } else if (pNoise->config.format == ma_format_s16) {\n        ma_int16* pFramesOutS16 = (ma_int16*)pFramesOut;\n        if (pNoise->config.duplicateChannels) {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                ma_int16 s = ma_noise_s16_brownian(pNoise, 0);\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    pFramesOutS16[iFrame*channels + iChannel] = s;\n                }\n            }\n        } else {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    pFramesOutS16[iFrame*channels + iChannel] = ma_noise_s16_brownian(pNoise, iChannel);\n                }\n            }\n        }\n    } else {\n        const ma_uint32 bps = ma_get_bytes_per_sample(pNoise->config.format);\n        const ma_uint32 bpf = bps * channels;\n\n        if (pNoise->config.duplicateChannels) {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                float s = ma_noise_f32_brownian(pNoise, 0);\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pNoise->config.format, &s, ma_format_f32, 1, ma_dither_mode_none);\n                }\n            }\n        } else {\n            for (iFrame = 0; iFrame < frameCount; iFrame += 1) {\n                for (iChannel = 0; iChannel < channels; iChannel += 1) {\n                    float s = ma_noise_f32_brownian(pNoise, iChannel);\n                    ma_pcm_convert(ma_offset_ptr(pFramesOut, iFrame*bpf + iChannel*bps), pNoise->config.format, &s, ma_format_f32, 1, ma_dither_mode_none);\n                }\n            }\n        }\n    }\n\n    return frameCount;\n}\n\nMA_API ma_result ma_noise_read_pcm_frames(ma_noise* pNoise, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    ma_uint64 framesRead = 0;\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    if (frameCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pNoise == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The output buffer is allowed to be NULL. Since we aren't tracking cursors or anything we can just do nothing and pretend to be successful. */\n    if (pFramesOut == NULL) {\n        framesRead = frameCount;\n    } else {\n        switch (pNoise->config.type) {\n            case ma_noise_type_white:    framesRead = ma_noise_read_pcm_frames__white   (pNoise, pFramesOut, frameCount); break;\n            case ma_noise_type_pink:     framesRead = ma_noise_read_pcm_frames__pink    (pNoise, pFramesOut, frameCount); break;\n            case ma_noise_type_brownian: framesRead = ma_noise_read_pcm_frames__brownian(pNoise, pFramesOut, frameCount); break;\n            default: return MA_INVALID_OPERATION;   /* Unknown noise type. */\n        }\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = framesRead;\n    }\n\n    return MA_SUCCESS;\n}\n#endif /* MA_NO_GENERATION */\n\n\n\n#ifndef MA_NO_RESOURCE_MANAGER\n#ifndef MA_RESOURCE_MANAGER_PAGE_SIZE_IN_MILLISECONDS\n#define MA_RESOURCE_MANAGER_PAGE_SIZE_IN_MILLISECONDS   1000\n#endif\n\n#ifndef MA_JOB_TYPE_RESOURCE_MANAGER_QUEUE_CAPACITY\n#define MA_JOB_TYPE_RESOURCE_MANAGER_QUEUE_CAPACITY          1024\n#endif\n\nMA_API ma_resource_manager_pipeline_notifications ma_resource_manager_pipeline_notifications_init(void)\n{\n    ma_resource_manager_pipeline_notifications notifications;\n\n    MA_ZERO_OBJECT(&notifications);\n\n    return notifications;\n}\n\nstatic void ma_resource_manager_pipeline_notifications_signal_all_notifications(const ma_resource_manager_pipeline_notifications* pPipelineNotifications)\n{\n    if (pPipelineNotifications == NULL) {\n        return;\n    }\n\n    if (pPipelineNotifications->init.pNotification) { ma_async_notification_signal(pPipelineNotifications->init.pNotification); }\n    if (pPipelineNotifications->done.pNotification) { ma_async_notification_signal(pPipelineNotifications->done.pNotification); }\n}\n\nstatic void ma_resource_manager_pipeline_notifications_acquire_all_fences(const ma_resource_manager_pipeline_notifications* pPipelineNotifications)\n{\n    if (pPipelineNotifications == NULL) {\n        return;\n    }\n\n    if (pPipelineNotifications->init.pFence != NULL) { ma_fence_acquire(pPipelineNotifications->init.pFence); }\n    if (pPipelineNotifications->done.pFence != NULL) { ma_fence_acquire(pPipelineNotifications->done.pFence); }\n}\n\nstatic void ma_resource_manager_pipeline_notifications_release_all_fences(const ma_resource_manager_pipeline_notifications* pPipelineNotifications)\n{\n    if (pPipelineNotifications == NULL) {\n        return;\n    }\n\n    if (pPipelineNotifications->init.pFence != NULL) { ma_fence_release(pPipelineNotifications->init.pFence); }\n    if (pPipelineNotifications->done.pFence != NULL) { ma_fence_release(pPipelineNotifications->done.pFence); }\n}\n\n\n\n#ifndef MA_DEFAULT_HASH_SEED\n#define MA_DEFAULT_HASH_SEED    42\n#endif\n\n/* MurmurHash3. Based on code from https://github.com/PeterScott/murmur3/blob/master/murmur3.c (public domain). */\n#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n    #pragma GCC diagnostic push\n    #if __GNUC__ >= 7\n    #pragma GCC diagnostic ignored \"-Wimplicit-fallthrough\"\n    #endif\n#endif\n\nstatic MA_INLINE ma_uint32 ma_rotl32(ma_uint32 x, ma_int8 r)\n{\n    return (x << r) | (x >> (32 - r));\n}\n\nstatic MA_INLINE ma_uint32 ma_hash_getblock(const ma_uint32* blocks, int i)\n{\n    ma_uint32 block;\n\n    /* Try silencing a sanitization warning about unaligned access by doing a memcpy() instead of assignment. */\n    MA_COPY_MEMORY(&block, ma_offset_ptr(blocks, i * sizeof(block)), sizeof(block));\n\n    if (ma_is_little_endian()) {\n        return block;\n    } else {\n        return ma_swap_endian_uint32(block);\n    }\n}\n\nstatic MA_INLINE ma_uint32 ma_hash_fmix32(ma_uint32 h)\n{\n    h ^= h >> 16;\n    h *= 0x85ebca6b;\n    h ^= h >> 13;\n    h *= 0xc2b2ae35;\n    h ^= h >> 16;\n\n    return h;\n}\n\nstatic ma_uint32 ma_hash_32(const void* key, int len, ma_uint32 seed)\n{\n    const ma_uint8* data = (const ma_uint8*)key;\n    const ma_uint32* blocks;\n    const ma_uint8* tail;\n    const int nblocks = len / 4;\n    ma_uint32 h1 = seed;\n    ma_uint32 c1 = 0xcc9e2d51;\n    ma_uint32 c2 = 0x1b873593;\n    ma_uint32 k1;\n    int i;\n\n    blocks = (const ma_uint32 *)(data + nblocks*4);\n\n    for(i = -nblocks; i; i++) {\n        k1 = ma_hash_getblock(blocks,i);\n\n        k1 *= c1;\n        k1 = ma_rotl32(k1, 15);\n        k1 *= c2;\n\n        h1 ^= k1;\n        h1 = ma_rotl32(h1, 13);\n        h1 = h1*5 + 0xe6546b64;\n    }\n\n\n    tail = (const ma_uint8*)(data + nblocks*4);\n\n    k1 = 0;\n    switch(len & 3) {\n        case 3: k1 ^= tail[2] << 16;\n        case 2: k1 ^= tail[1] << 8;\n        case 1: k1 ^= tail[0];\n                k1 *= c1; k1 = ma_rotl32(k1, 15); k1 *= c2; h1 ^= k1;\n    };\n\n\n    h1 ^= len;\n    h1  = ma_hash_fmix32(h1);\n\n    return h1;\n}\n\n#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n    #pragma GCC diagnostic push\n#endif\n/* End MurmurHash3 */\n\nstatic ma_uint32 ma_hash_string_32(const char* str)\n{\n    return ma_hash_32(str, (int)strlen(str), MA_DEFAULT_HASH_SEED);\n}\n\nstatic ma_uint32 ma_hash_string_w_32(const wchar_t* str)\n{\n    return ma_hash_32(str, (int)wcslen(str) * sizeof(*str), MA_DEFAULT_HASH_SEED);\n}\n\n\n\n\n/*\nBasic BST Functions\n*/\nstatic ma_result ma_resource_manager_data_buffer_node_search(ma_resource_manager* pResourceManager, ma_uint32 hashedName32, ma_resource_manager_data_buffer_node** ppDataBufferNode)\n{\n    ma_resource_manager_data_buffer_node* pCurrentNode;\n\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(ppDataBufferNode != NULL);\n\n    pCurrentNode = pResourceManager->pRootDataBufferNode;\n    while (pCurrentNode != NULL) {\n        if (hashedName32 == pCurrentNode->hashedName32) {\n            break;  /* Found. */\n        } else if (hashedName32 < pCurrentNode->hashedName32) {\n            pCurrentNode = pCurrentNode->pChildLo;\n        } else {\n            pCurrentNode = pCurrentNode->pChildHi;\n        }\n    }\n\n    *ppDataBufferNode = pCurrentNode;\n\n    if (pCurrentNode == NULL) {\n        return MA_DOES_NOT_EXIST;\n    } else {\n        return MA_SUCCESS;\n    }\n}\n\nstatic ma_result ma_resource_manager_data_buffer_node_insert_point(ma_resource_manager* pResourceManager, ma_uint32 hashedName32, ma_resource_manager_data_buffer_node** ppInsertPoint)\n{\n    ma_result result = MA_SUCCESS;\n    ma_resource_manager_data_buffer_node* pCurrentNode;\n\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(ppInsertPoint    != NULL);\n\n    *ppInsertPoint = NULL;\n\n    if (pResourceManager->pRootDataBufferNode == NULL) {\n        return MA_SUCCESS;  /* No items. */\n    }\n\n    /* We need to find the node that will become the parent of the new node. If a node is found that already has the same hashed name we need to return MA_ALREADY_EXISTS. */\n    pCurrentNode = pResourceManager->pRootDataBufferNode;\n    while (pCurrentNode != NULL) {\n        if (hashedName32 == pCurrentNode->hashedName32) {\n            result = MA_ALREADY_EXISTS;\n            break;\n        } else {\n            if (hashedName32 < pCurrentNode->hashedName32) {\n                if (pCurrentNode->pChildLo == NULL) {\n                    result = MA_SUCCESS;\n                    break;\n                } else {\n                    pCurrentNode = pCurrentNode->pChildLo;\n                }\n            } else {\n                if (pCurrentNode->pChildHi == NULL) {\n                    result = MA_SUCCESS;\n                    break;\n                } else {\n                    pCurrentNode = pCurrentNode->pChildHi;\n                }\n            }\n        }\n    }\n\n    *ppInsertPoint = pCurrentNode;\n    return result;\n}\n\nstatic ma_result ma_resource_manager_data_buffer_node_insert_at(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, ma_resource_manager_data_buffer_node* pInsertPoint)\n{\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(pDataBufferNode  != NULL);\n\n    /* The key must have been set before calling this function. */\n    MA_ASSERT(pDataBufferNode->hashedName32 != 0);\n\n    if (pInsertPoint == NULL) {\n        /* It's the first node. */\n        pResourceManager->pRootDataBufferNode = pDataBufferNode;\n    } else {\n        /* It's not the first node. It needs to be inserted. */\n        if (pDataBufferNode->hashedName32 < pInsertPoint->hashedName32) {\n            MA_ASSERT(pInsertPoint->pChildLo == NULL);\n            pInsertPoint->pChildLo = pDataBufferNode;\n        } else {\n            MA_ASSERT(pInsertPoint->pChildHi == NULL);\n            pInsertPoint->pChildHi = pDataBufferNode;\n        }\n    }\n\n    pDataBufferNode->pParent = pInsertPoint;\n\n    return MA_SUCCESS;\n}\n\n#if 0   /* Unused for now. */\nstatic ma_result ma_resource_manager_data_buffer_node_insert(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode)\n{\n    ma_result result;\n    ma_resource_manager_data_buffer_node* pInsertPoint;\n\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(pDataBufferNode  != NULL);\n\n    result = ma_resource_manager_data_buffer_node_insert_point(pResourceManager, pDataBufferNode->hashedName32, &pInsertPoint);\n    if (result != MA_SUCCESS) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_resource_manager_data_buffer_node_insert_at(pResourceManager, pDataBufferNode, pInsertPoint);\n}\n#endif\n\nstatic MA_INLINE ma_resource_manager_data_buffer_node* ma_resource_manager_data_buffer_node_find_min(ma_resource_manager_data_buffer_node* pDataBufferNode)\n{\n    ma_resource_manager_data_buffer_node* pCurrentNode;\n\n    MA_ASSERT(pDataBufferNode != NULL);\n\n    pCurrentNode = pDataBufferNode;\n    while (pCurrentNode->pChildLo != NULL) {\n        pCurrentNode = pCurrentNode->pChildLo;\n    }\n\n    return pCurrentNode;\n}\n\nstatic MA_INLINE ma_resource_manager_data_buffer_node* ma_resource_manager_data_buffer_node_find_max(ma_resource_manager_data_buffer_node* pDataBufferNode)\n{\n    ma_resource_manager_data_buffer_node* pCurrentNode;\n\n    MA_ASSERT(pDataBufferNode != NULL);\n\n    pCurrentNode = pDataBufferNode;\n    while (pCurrentNode->pChildHi != NULL) {\n        pCurrentNode = pCurrentNode->pChildHi;\n    }\n\n    return pCurrentNode;\n}\n\nstatic MA_INLINE ma_resource_manager_data_buffer_node* ma_resource_manager_data_buffer_node_find_inorder_successor(ma_resource_manager_data_buffer_node* pDataBufferNode)\n{\n    MA_ASSERT(pDataBufferNode           != NULL);\n    MA_ASSERT(pDataBufferNode->pChildHi != NULL);\n\n    return ma_resource_manager_data_buffer_node_find_min(pDataBufferNode->pChildHi);\n}\n\nstatic MA_INLINE ma_resource_manager_data_buffer_node* ma_resource_manager_data_buffer_node_find_inorder_predecessor(ma_resource_manager_data_buffer_node* pDataBufferNode)\n{\n    MA_ASSERT(pDataBufferNode           != NULL);\n    MA_ASSERT(pDataBufferNode->pChildLo != NULL);\n\n    return ma_resource_manager_data_buffer_node_find_max(pDataBufferNode->pChildLo);\n}\n\nstatic ma_result ma_resource_manager_data_buffer_node_remove(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode)\n{\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(pDataBufferNode  != NULL);\n\n    if (pDataBufferNode->pChildLo == NULL) {\n        if (pDataBufferNode->pChildHi == NULL) {\n            /* Simple case - deleting a buffer with no children. */\n            if (pDataBufferNode->pParent == NULL) {\n                MA_ASSERT(pResourceManager->pRootDataBufferNode == pDataBufferNode);    /* There is only a single buffer in the tree which should be equal to the root node. */\n                pResourceManager->pRootDataBufferNode = NULL;\n            } else {\n                if (pDataBufferNode->pParent->pChildLo == pDataBufferNode) {\n                    pDataBufferNode->pParent->pChildLo = NULL;\n                } else {\n                    pDataBufferNode->pParent->pChildHi = NULL;\n                }\n            }\n        } else {\n            /* Node has one child - pChildHi != NULL. */\n            pDataBufferNode->pChildHi->pParent = pDataBufferNode->pParent;\n\n            if (pDataBufferNode->pParent == NULL) {\n                MA_ASSERT(pResourceManager->pRootDataBufferNode == pDataBufferNode);\n                pResourceManager->pRootDataBufferNode = pDataBufferNode->pChildHi;\n            } else {\n                if (pDataBufferNode->pParent->pChildLo == pDataBufferNode) {\n                    pDataBufferNode->pParent->pChildLo = pDataBufferNode->pChildHi;\n                } else {\n                    pDataBufferNode->pParent->pChildHi = pDataBufferNode->pChildHi;\n                }\n            }\n        }\n    } else {\n        if (pDataBufferNode->pChildHi == NULL) {\n            /* Node has one child - pChildLo != NULL. */\n            pDataBufferNode->pChildLo->pParent = pDataBufferNode->pParent;\n\n            if (pDataBufferNode->pParent == NULL) {\n                MA_ASSERT(pResourceManager->pRootDataBufferNode == pDataBufferNode);\n                pResourceManager->pRootDataBufferNode = pDataBufferNode->pChildLo;\n            } else {\n                if (pDataBufferNode->pParent->pChildLo == pDataBufferNode) {\n                    pDataBufferNode->pParent->pChildLo = pDataBufferNode->pChildLo;\n                } else {\n                    pDataBufferNode->pParent->pChildHi = pDataBufferNode->pChildLo;\n                }\n            }\n        } else {\n            /* Complex case - deleting a node with two children. */\n            ma_resource_manager_data_buffer_node* pReplacementDataBufferNode;\n\n            /* For now we are just going to use the in-order successor as the replacement, but we may want to try to keep this balanced by switching between the two. */\n            pReplacementDataBufferNode = ma_resource_manager_data_buffer_node_find_inorder_successor(pDataBufferNode);\n            MA_ASSERT(pReplacementDataBufferNode != NULL);\n\n            /*\n            Now that we have our replacement node we can make the change. The simple way to do this would be to just exchange the values, and then remove the replacement\n            node, however we track specific nodes via pointers which means we can't just swap out the values. We need to instead just change the pointers around. The\n            replacement node should have at most 1 child. Therefore, we can detach it in terms of our simpler cases above. What we're essentially doing is detaching the\n            replacement node and reinserting it into the same position as the deleted node.\n            */\n            MA_ASSERT(pReplacementDataBufferNode->pParent  != NULL);  /* The replacement node should never be the root which means it should always have a parent. */\n            MA_ASSERT(pReplacementDataBufferNode->pChildLo == NULL);  /* Because we used in-order successor. This would be pChildHi == NULL if we used in-order predecessor. */\n\n            if (pReplacementDataBufferNode->pChildHi == NULL) {\n                if (pReplacementDataBufferNode->pParent->pChildLo == pReplacementDataBufferNode) {\n                    pReplacementDataBufferNode->pParent->pChildLo = NULL;\n                } else {\n                    pReplacementDataBufferNode->pParent->pChildHi = NULL;\n                }\n            } else {\n                pReplacementDataBufferNode->pChildHi->pParent = pReplacementDataBufferNode->pParent;\n                if (pReplacementDataBufferNode->pParent->pChildLo == pReplacementDataBufferNode) {\n                    pReplacementDataBufferNode->pParent->pChildLo = pReplacementDataBufferNode->pChildHi;\n                } else {\n                    pReplacementDataBufferNode->pParent->pChildHi = pReplacementDataBufferNode->pChildHi;\n                }\n            }\n\n\n            /* The replacement node has essentially been detached from the binary tree, so now we need to replace the old data buffer with it. The first thing to update is the parent */\n            if (pDataBufferNode->pParent != NULL) {\n                if (pDataBufferNode->pParent->pChildLo == pDataBufferNode) {\n                    pDataBufferNode->pParent->pChildLo = pReplacementDataBufferNode;\n                } else {\n                    pDataBufferNode->pParent->pChildHi = pReplacementDataBufferNode;\n                }\n            }\n\n            /* Now need to update the replacement node's pointers. */\n            pReplacementDataBufferNode->pParent  = pDataBufferNode->pParent;\n            pReplacementDataBufferNode->pChildLo = pDataBufferNode->pChildLo;\n            pReplacementDataBufferNode->pChildHi = pDataBufferNode->pChildHi;\n\n            /* Now the children of the replacement node need to have their parent pointers updated. */\n            if (pReplacementDataBufferNode->pChildLo != NULL) {\n                pReplacementDataBufferNode->pChildLo->pParent = pReplacementDataBufferNode;\n            }\n            if (pReplacementDataBufferNode->pChildHi != NULL) {\n                pReplacementDataBufferNode->pChildHi->pParent = pReplacementDataBufferNode;\n            }\n\n            /* Now the root node needs to be updated. */\n            if (pResourceManager->pRootDataBufferNode == pDataBufferNode) {\n                pResourceManager->pRootDataBufferNode = pReplacementDataBufferNode;\n            }\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\n#if 0   /* Unused for now. */\nstatic ma_result ma_resource_manager_data_buffer_node_remove_by_key(ma_resource_manager* pResourceManager, ma_uint32 hashedName32)\n{\n    ma_result result;\n    ma_resource_manager_data_buffer_node* pDataBufferNode;\n\n    result = ma_resource_manager_data_buffer_search(pResourceManager, hashedName32, &pDataBufferNode);\n    if (result != MA_SUCCESS) {\n        return result;  /* Could not find the data buffer. */\n    }\n\n    return ma_resource_manager_data_buffer_remove(pResourceManager, pDataBufferNode);\n}\n#endif\n\nstatic ma_resource_manager_data_supply_type ma_resource_manager_data_buffer_node_get_data_supply_type(ma_resource_manager_data_buffer_node* pDataBufferNode)\n{\n    return (ma_resource_manager_data_supply_type)ma_atomic_load_i32(&pDataBufferNode->data.type);\n}\n\nstatic void ma_resource_manager_data_buffer_node_set_data_supply_type(ma_resource_manager_data_buffer_node* pDataBufferNode, ma_resource_manager_data_supply_type supplyType)\n{\n    ma_atomic_exchange_i32(&pDataBufferNode->data.type, supplyType);\n}\n\nstatic ma_result ma_resource_manager_data_buffer_node_increment_ref(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, ma_uint32* pNewRefCount)\n{\n    ma_uint32 refCount;\n\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(pDataBufferNode  != NULL);\n\n    (void)pResourceManager;\n\n    refCount = ma_atomic_fetch_add_32(&pDataBufferNode->refCount, 1) + 1;\n\n    if (pNewRefCount != NULL) {\n        *pNewRefCount = refCount;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_resource_manager_data_buffer_node_decrement_ref(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, ma_uint32* pNewRefCount)\n{\n    ma_uint32 refCount;\n\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(pDataBufferNode  != NULL);\n\n    (void)pResourceManager;\n\n    refCount = ma_atomic_fetch_sub_32(&pDataBufferNode->refCount, 1) - 1;\n\n    if (pNewRefCount != NULL) {\n        *pNewRefCount = refCount;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_resource_manager_data_buffer_node_free(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode)\n{\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(pDataBufferNode  != NULL);\n\n    if (pDataBufferNode->isDataOwnedByResourceManager) {\n        if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBufferNode) == ma_resource_manager_data_supply_type_encoded) {\n            ma_free((void*)pDataBufferNode->data.backend.encoded.pData, &pResourceManager->config.allocationCallbacks);\n            pDataBufferNode->data.backend.encoded.pData       = NULL;\n            pDataBufferNode->data.backend.encoded.sizeInBytes = 0;\n        } else if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBufferNode) == ma_resource_manager_data_supply_type_decoded) {\n            ma_free((void*)pDataBufferNode->data.backend.decoded.pData, &pResourceManager->config.allocationCallbacks);\n            pDataBufferNode->data.backend.decoded.pData           = NULL;\n            pDataBufferNode->data.backend.decoded.totalFrameCount = 0;\n        } else if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBufferNode) == ma_resource_manager_data_supply_type_decoded_paged) {\n            ma_paged_audio_buffer_data_uninit(&pDataBufferNode->data.backend.decodedPaged.data, &pResourceManager->config.allocationCallbacks);\n        } else {\n            /* Should never hit this if the node was successfully initialized. */\n            MA_ASSERT(pDataBufferNode->result != MA_SUCCESS);\n        }\n    }\n\n    /* The data buffer itself needs to be freed. */\n    ma_free(pDataBufferNode, &pResourceManager->config.allocationCallbacks);\n}\n\nstatic ma_result ma_resource_manager_data_buffer_node_result(const ma_resource_manager_data_buffer_node* pDataBufferNode)\n{\n    MA_ASSERT(pDataBufferNode != NULL);\n\n    return (ma_result)ma_atomic_load_i32((ma_result*)&pDataBufferNode->result);    /* Need a naughty const-cast here. */\n}\n\n\nstatic ma_bool32 ma_resource_manager_is_threading_enabled(const ma_resource_manager* pResourceManager)\n{\n    MA_ASSERT(pResourceManager != NULL);\n\n    return (pResourceManager->config.flags & MA_RESOURCE_MANAGER_FLAG_NO_THREADING) == 0;\n}\n\n\ntypedef struct\n{\n    union\n    {\n        ma_async_notification_event e;\n        ma_async_notification_poll p;\n    } backend;  /* Must be the first member. */\n    ma_resource_manager* pResourceManager;\n} ma_resource_manager_inline_notification;\n\nstatic ma_result ma_resource_manager_inline_notification_init(ma_resource_manager* pResourceManager, ma_resource_manager_inline_notification* pNotification)\n{\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(pNotification    != NULL);\n\n    pNotification->pResourceManager = pResourceManager;\n\n    if (ma_resource_manager_is_threading_enabled(pResourceManager)) {\n        return ma_async_notification_event_init(&pNotification->backend.e);\n    } else {\n        return ma_async_notification_poll_init(&pNotification->backend.p);\n    }\n}\n\nstatic void ma_resource_manager_inline_notification_uninit(ma_resource_manager_inline_notification* pNotification)\n{\n    MA_ASSERT(pNotification != NULL);\n\n    if (ma_resource_manager_is_threading_enabled(pNotification->pResourceManager)) {\n        ma_async_notification_event_uninit(&pNotification->backend.e);\n    } else {\n        /* No need to uninitialize a polling notification. */\n    }\n}\n\nstatic void ma_resource_manager_inline_notification_wait(ma_resource_manager_inline_notification* pNotification)\n{\n    MA_ASSERT(pNotification != NULL);\n\n    if (ma_resource_manager_is_threading_enabled(pNotification->pResourceManager)) {\n        ma_async_notification_event_wait(&pNotification->backend.e);\n    } else {\n        while (ma_async_notification_poll_is_signalled(&pNotification->backend.p) == MA_FALSE) {\n            ma_result result = ma_resource_manager_process_next_job(pNotification->pResourceManager);\n            if (result == MA_NO_DATA_AVAILABLE || result == MA_CANCELLED) {\n                break;\n            }\n        }\n    }\n}\n\nstatic void ma_resource_manager_inline_notification_wait_and_uninit(ma_resource_manager_inline_notification* pNotification)\n{\n    ma_resource_manager_inline_notification_wait(pNotification);\n    ma_resource_manager_inline_notification_uninit(pNotification);\n}\n\n\nstatic void ma_resource_manager_data_buffer_bst_lock(ma_resource_manager* pResourceManager)\n{\n    MA_ASSERT(pResourceManager != NULL);\n\n    if (ma_resource_manager_is_threading_enabled(pResourceManager)) {\n        #ifndef MA_NO_THREADING\n        {\n            ma_mutex_lock(&pResourceManager->dataBufferBSTLock);\n        }\n        #else\n        {\n            MA_ASSERT(MA_FALSE);    /* Should never hit this. */\n        }\n        #endif\n    } else {\n        /* Threading not enabled. Do nothing. */\n    }\n}\n\nstatic void ma_resource_manager_data_buffer_bst_unlock(ma_resource_manager* pResourceManager)\n{\n    MA_ASSERT(pResourceManager != NULL);\n\n    if (ma_resource_manager_is_threading_enabled(pResourceManager)) {\n        #ifndef MA_NO_THREADING\n        {\n            ma_mutex_unlock(&pResourceManager->dataBufferBSTLock);\n        }\n        #else\n        {\n            MA_ASSERT(MA_FALSE);    /* Should never hit this. */\n        }\n        #endif\n    } else {\n        /* Threading not enabled. Do nothing. */\n    }\n}\n\n#ifndef MA_NO_THREADING\nstatic ma_thread_result MA_THREADCALL ma_resource_manager_job_thread(void* pUserData)\n{\n    ma_resource_manager* pResourceManager = (ma_resource_manager*)pUserData;\n    MA_ASSERT(pResourceManager != NULL);\n\n    for (;;) {\n        ma_result result;\n        ma_job job;\n\n        result = ma_resource_manager_next_job(pResourceManager, &job);\n        if (result != MA_SUCCESS) {\n            break;\n        }\n\n        /* Terminate if we got a quit message. */\n        if (job.toc.breakup.code == MA_JOB_TYPE_QUIT) {\n            break;\n        }\n\n        ma_job_process(&job);\n    }\n\n    return (ma_thread_result)0;\n}\n#endif\n\nMA_API ma_resource_manager_config ma_resource_manager_config_init(void)\n{\n    ma_resource_manager_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.decodedFormat     = ma_format_unknown;\n    config.decodedChannels   = 0;\n    config.decodedSampleRate = 0;\n    config.jobThreadCount    = 1;   /* A single miniaudio-managed job thread by default. */\n    config.jobQueueCapacity  = MA_JOB_TYPE_RESOURCE_MANAGER_QUEUE_CAPACITY;\n\n    /* Flags. */\n    config.flags = 0;\n    #ifdef MA_NO_THREADING\n    {\n        /* Threading is disabled at compile time so disable threading at runtime as well by default. */\n        config.flags |= MA_RESOURCE_MANAGER_FLAG_NO_THREADING;\n        config.jobThreadCount = 0;\n    }\n    #endif\n\n    return config;\n}\n\n\nMA_API ma_result ma_resource_manager_init(const ma_resource_manager_config* pConfig, ma_resource_manager* pResourceManager)\n{\n    ma_result result;\n    ma_job_queue_config jobQueueConfig;\n\n    if (pResourceManager == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pResourceManager);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #ifndef MA_NO_THREADING\n    {\n        if (pConfig->jobThreadCount > ma_countof(pResourceManager->jobThreads)) {\n            return MA_INVALID_ARGS; /* Requesting too many job threads. */\n        }\n    }\n    #endif\n\n    pResourceManager->config = *pConfig;\n    ma_allocation_callbacks_init_copy(&pResourceManager->config.allocationCallbacks, &pConfig->allocationCallbacks);\n\n    /* Get the log set up early so we can start using it as soon as possible. */\n    if (pResourceManager->config.pLog == NULL) {\n        result = ma_log_init(&pResourceManager->config.allocationCallbacks, &pResourceManager->log);\n        if (result == MA_SUCCESS) {\n            pResourceManager->config.pLog = &pResourceManager->log;\n        } else {\n            pResourceManager->config.pLog = NULL;   /* Logging is unavailable. */\n        }\n    }\n\n    if (pResourceManager->config.pVFS == NULL) {\n        result = ma_default_vfs_init(&pResourceManager->defaultVFS, &pResourceManager->config.allocationCallbacks);\n        if (result != MA_SUCCESS) {\n            return result;  /* Failed to initialize the default file system. */\n        }\n\n        pResourceManager->config.pVFS = &pResourceManager->defaultVFS;\n    }\n\n    /* If threading has been disabled at compile time, enfore it at run time as well. */\n    #ifdef MA_NO_THREADING\n    {\n        pResourceManager->config.flags |= MA_RESOURCE_MANAGER_FLAG_NO_THREADING;\n    }\n    #endif\n\n    /* We need to force MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING if MA_RESOURCE_MANAGER_FLAG_NO_THREADING is set. */\n    if ((pResourceManager->config.flags & MA_RESOURCE_MANAGER_FLAG_NO_THREADING) != 0) {\n        pResourceManager->config.flags |= MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING;\n\n        /* We cannot allow job threads when MA_RESOURCE_MANAGER_FLAG_NO_THREADING has been set. This is an invalid use case. */\n        if (pResourceManager->config.jobThreadCount > 0) {\n            return MA_INVALID_ARGS;\n        }\n    }\n\n    /* Job queue. */\n    jobQueueConfig.capacity = pResourceManager->config.jobQueueCapacity;\n    jobQueueConfig.flags    = 0;\n    if ((pResourceManager->config.flags & MA_RESOURCE_MANAGER_FLAG_NON_BLOCKING) != 0) {\n        if (pResourceManager->config.jobThreadCount > 0) {\n            return MA_INVALID_ARGS; /* Non-blocking mode is only valid for self-managed job threads. */\n        }\n\n        jobQueueConfig.flags |= MA_JOB_QUEUE_FLAG_NON_BLOCKING;\n    }\n\n    result = ma_job_queue_init(&jobQueueConfig, &pResourceManager->config.allocationCallbacks, &pResourceManager->jobQueue);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n\n    /* Custom decoding backends. */\n    if (pConfig->ppCustomDecodingBackendVTables != NULL && pConfig->customDecodingBackendCount > 0) {\n        size_t sizeInBytes = sizeof(*pResourceManager->config.ppCustomDecodingBackendVTables) * pConfig->customDecodingBackendCount;\n\n        pResourceManager->config.ppCustomDecodingBackendVTables = (ma_decoding_backend_vtable**)ma_malloc(sizeInBytes, &pResourceManager->config.allocationCallbacks);\n        if (pResourceManager->config.ppCustomDecodingBackendVTables == NULL) {\n            ma_job_queue_uninit(&pResourceManager->jobQueue, &pResourceManager->config.allocationCallbacks);\n            return MA_OUT_OF_MEMORY;\n        }\n\n        MA_COPY_MEMORY(pResourceManager->config.ppCustomDecodingBackendVTables, pConfig->ppCustomDecodingBackendVTables, sizeInBytes);\n\n        pResourceManager->config.customDecodingBackendCount     = pConfig->customDecodingBackendCount;\n        pResourceManager->config.pCustomDecodingBackendUserData = pConfig->pCustomDecodingBackendUserData;\n    }\n\n\n\n    /* Here is where we initialize our threading stuff. We don't do this if we don't support threading. */\n    if (ma_resource_manager_is_threading_enabled(pResourceManager)) {\n        #ifndef MA_NO_THREADING\n        {\n            ma_uint32 iJobThread;\n\n            /* Data buffer lock. */\n            result = ma_mutex_init(&pResourceManager->dataBufferBSTLock);\n            if (result != MA_SUCCESS) {\n                ma_job_queue_uninit(&pResourceManager->jobQueue, &pResourceManager->config.allocationCallbacks);\n                return result;\n            }\n\n            /* Create the job threads last to ensure the threads has access to valid data. */\n            for (iJobThread = 0; iJobThread < pResourceManager->config.jobThreadCount; iJobThread += 1) {\n                result = ma_thread_create(&pResourceManager->jobThreads[iJobThread], ma_thread_priority_normal, pResourceManager->config.jobThreadStackSize, ma_resource_manager_job_thread, pResourceManager, &pResourceManager->config.allocationCallbacks);\n                if (result != MA_SUCCESS) {\n                    ma_mutex_uninit(&pResourceManager->dataBufferBSTLock);\n                    ma_job_queue_uninit(&pResourceManager->jobQueue, &pResourceManager->config.allocationCallbacks);\n                    return result;\n                }\n            }\n        }\n        #else\n        {\n            /* Threading is disabled at compile time. We should never get here because validation checks should have already been performed. */\n            MA_ASSERT(MA_FALSE);\n        }\n        #endif\n    }\n\n    return MA_SUCCESS;\n}\n\n\nstatic void ma_resource_manager_delete_all_data_buffer_nodes(ma_resource_manager* pResourceManager)\n{\n    MA_ASSERT(pResourceManager);\n\n    /* If everything was done properly, there shouldn't be any active data buffers. */\n    while (pResourceManager->pRootDataBufferNode != NULL) {\n        ma_resource_manager_data_buffer_node* pDataBufferNode = pResourceManager->pRootDataBufferNode;\n        ma_resource_manager_data_buffer_node_remove(pResourceManager, pDataBufferNode);\n\n        /* The data buffer has been removed from the BST, so now we need to free it's data. */\n        ma_resource_manager_data_buffer_node_free(pResourceManager, pDataBufferNode);\n    }\n}\n\nMA_API void ma_resource_manager_uninit(ma_resource_manager* pResourceManager)\n{\n    if (pResourceManager == NULL) {\n        return;\n    }\n\n    /*\n    Job threads need to be killed first. To do this we need to post a quit message to the message queue and then wait for the thread. The quit message will never be removed from the\n    queue which means it will never not be returned after being encounted for the first time which means all threads will eventually receive it.\n    */\n    ma_resource_manager_post_job_quit(pResourceManager);\n\n    /* Wait for every job to finish before continuing to ensure nothing is sill trying to access any of our objects below. */\n    if (ma_resource_manager_is_threading_enabled(pResourceManager)) {\n        #ifndef MA_NO_THREADING\n        {\n            ma_uint32 iJobThread;\n\n            for (iJobThread = 0; iJobThread < pResourceManager->config.jobThreadCount; iJobThread += 1) {\n                ma_thread_wait(&pResourceManager->jobThreads[iJobThread]);\n            }\n        }\n        #else\n        {\n            MA_ASSERT(MA_FALSE);    /* Should never hit this. */\n        }\n        #endif\n    }\n\n    /* At this point the thread should have returned and no other thread should be accessing our data. We can now delete all data buffers. */\n    ma_resource_manager_delete_all_data_buffer_nodes(pResourceManager);\n\n    /* The job queue is no longer needed. */\n    ma_job_queue_uninit(&pResourceManager->jobQueue, &pResourceManager->config.allocationCallbacks);\n\n    /* We're no longer doing anything with data buffers so the lock can now be uninitialized. */\n    if (ma_resource_manager_is_threading_enabled(pResourceManager)) {\n        #ifndef MA_NO_THREADING\n        {\n            ma_mutex_uninit(&pResourceManager->dataBufferBSTLock);\n        }\n        #else\n        {\n            MA_ASSERT(MA_FALSE);    /* Should never hit this. */\n        }\n        #endif\n    }\n\n    ma_free(pResourceManager->config.ppCustomDecodingBackendVTables, &pResourceManager->config.allocationCallbacks);\n\n    if (pResourceManager->config.pLog == &pResourceManager->log) {\n        ma_log_uninit(&pResourceManager->log);\n    }\n}\n\nMA_API ma_log* ma_resource_manager_get_log(ma_resource_manager* pResourceManager)\n{\n    if (pResourceManager == NULL) {\n        return NULL;\n    }\n\n    return pResourceManager->config.pLog;\n}\n\n\n\nMA_API ma_resource_manager_data_source_config ma_resource_manager_data_source_config_init(void)\n{\n    ma_resource_manager_data_source_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.rangeBegInPCMFrames     = MA_DATA_SOURCE_DEFAULT_RANGE_BEG;\n    config.rangeEndInPCMFrames     = MA_DATA_SOURCE_DEFAULT_RANGE_END;\n    config.loopPointBegInPCMFrames = MA_DATA_SOURCE_DEFAULT_LOOP_POINT_BEG;\n    config.loopPointEndInPCMFrames = MA_DATA_SOURCE_DEFAULT_LOOP_POINT_END;\n    config.isLooping               = MA_FALSE;\n\n    return config;\n}\n\n\nstatic ma_decoder_config ma_resource_manager__init_decoder_config(ma_resource_manager* pResourceManager)\n{\n    ma_decoder_config config;\n\n    config = ma_decoder_config_init(pResourceManager->config.decodedFormat, pResourceManager->config.decodedChannels, pResourceManager->config.decodedSampleRate);\n    config.allocationCallbacks    = pResourceManager->config.allocationCallbacks;\n    config.ppCustomBackendVTables = pResourceManager->config.ppCustomDecodingBackendVTables;\n    config.customBackendCount     = pResourceManager->config.customDecodingBackendCount;\n    config.pCustomBackendUserData = pResourceManager->config.pCustomDecodingBackendUserData;\n\n    return config;\n}\n\nstatic ma_result ma_resource_manager__init_decoder(ma_resource_manager* pResourceManager, const char* pFilePath, const wchar_t* pFilePathW, ma_decoder* pDecoder)\n{\n    ma_result result;\n    ma_decoder_config config;\n\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(pFilePath        != NULL || pFilePathW != NULL);\n    MA_ASSERT(pDecoder         != NULL);\n\n    config = ma_resource_manager__init_decoder_config(pResourceManager);\n\n    if (pFilePath != NULL) {\n        result = ma_decoder_init_vfs(pResourceManager->config.pVFS, pFilePath, &config, pDecoder);\n        if (result != MA_SUCCESS) {\n            ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, \"Failed to load file \\\"%s\\\". %s.\\n\", pFilePath, ma_result_description(result));\n            return result;\n        }\n    } else {\n        result = ma_decoder_init_vfs_w(pResourceManager->config.pVFS, pFilePathW, &config, pDecoder);\n        if (result != MA_SUCCESS) {\n            #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(_MSC_VER)\n                ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, \"Failed to load file \\\"%ls\\\". %s.\\n\", pFilePathW, ma_result_description(result));\n            #endif\n            return result;\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_bool32 ma_resource_manager_data_buffer_has_connector(ma_resource_manager_data_buffer* pDataBuffer)\n{\n    return ma_atomic_bool32_get(&pDataBuffer->isConnectorInitialized);\n}\n\nstatic ma_data_source* ma_resource_manager_data_buffer_get_connector(ma_resource_manager_data_buffer* pDataBuffer)\n{\n    if (ma_resource_manager_data_buffer_has_connector(pDataBuffer) == MA_FALSE) {\n        return NULL;    /* Connector not yet initialized. */\n    }\n\n    switch (pDataBuffer->pNode->data.type)\n    {\n        case ma_resource_manager_data_supply_type_encoded:       return &pDataBuffer->connector.decoder;\n        case ma_resource_manager_data_supply_type_decoded:       return &pDataBuffer->connector.buffer;\n        case ma_resource_manager_data_supply_type_decoded_paged: return &pDataBuffer->connector.pagedBuffer;\n\n        case ma_resource_manager_data_supply_type_unknown:\n        default:\n        {\n            ma_log_postf(ma_resource_manager_get_log(pDataBuffer->pResourceManager), MA_LOG_LEVEL_ERROR, \"Failed to retrieve data buffer connector. Unknown data supply type.\\n\");\n            return NULL;\n        };\n    };\n}\n\nstatic ma_result ma_resource_manager_data_buffer_init_connector(ma_resource_manager_data_buffer* pDataBuffer, const ma_resource_manager_data_source_config* pConfig, ma_async_notification* pInitNotification, ma_fence* pInitFence)\n{\n    ma_result result;\n\n    MA_ASSERT(pDataBuffer != NULL);\n    MA_ASSERT(pConfig     != NULL);\n    MA_ASSERT(ma_resource_manager_data_buffer_has_connector(pDataBuffer) == MA_FALSE);\n\n    /* The underlying data buffer must be initialized before we'll be able to know how to initialize the backend. */\n    result = ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode);\n    if (result != MA_SUCCESS && result != MA_BUSY) {\n        return result;  /* The data buffer is in an erroneous state. */\n    }\n\n    /*\n    We need to initialize either a ma_decoder or an ma_audio_buffer depending on whether or not the backing data is encoded or decoded. These act as the\n    \"instance\" to the data and are used to form the connection between underlying data buffer and the data source. If the data buffer is decoded, we can use\n    an ma_audio_buffer. This enables us to use memory mapping when mixing which saves us a bit of data movement overhead.\n    */\n    switch (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode))\n    {\n        case ma_resource_manager_data_supply_type_encoded:          /* Connector is a decoder. */\n        {\n            ma_decoder_config config;\n            config = ma_resource_manager__init_decoder_config(pDataBuffer->pResourceManager);\n            result = ma_decoder_init_memory(pDataBuffer->pNode->data.backend.encoded.pData, pDataBuffer->pNode->data.backend.encoded.sizeInBytes, &config, &pDataBuffer->connector.decoder);\n        } break;\n\n        case ma_resource_manager_data_supply_type_decoded:          /* Connector is an audio buffer. */\n        {\n            ma_audio_buffer_config config;\n            config = ma_audio_buffer_config_init(pDataBuffer->pNode->data.backend.decoded.format, pDataBuffer->pNode->data.backend.decoded.channels, pDataBuffer->pNode->data.backend.decoded.totalFrameCount, pDataBuffer->pNode->data.backend.decoded.pData, NULL);\n            result = ma_audio_buffer_init(&config, &pDataBuffer->connector.buffer);\n        } break;\n\n        case ma_resource_manager_data_supply_type_decoded_paged:    /* Connector is a paged audio buffer. */\n        {\n            ma_paged_audio_buffer_config config;\n            config = ma_paged_audio_buffer_config_init(&pDataBuffer->pNode->data.backend.decodedPaged.data);\n            result = ma_paged_audio_buffer_init(&config, &pDataBuffer->connector.pagedBuffer);\n        } break;\n\n        case ma_resource_manager_data_supply_type_unknown:\n        default:\n        {\n            /* Unknown data supply type. Should never happen. Need to post an error here. */\n            return MA_INVALID_ARGS;\n        };\n    }\n\n    /*\n    Initialization of the connector is when we can fire the init notification. This will give the application access to\n    the format/channels/rate of the data source.\n    */\n    if (result == MA_SUCCESS) {\n        /*\n        The resource manager supports the ability to set the range and loop settings via a config at\n        initialization time. This results in an case where the ranges could be set explicitly via\n        ma_data_source_set_*() before we get to this point here. If this happens, we'll end up\n        hitting a case where we just override those settings which results in what feels like a bug.\n\n        To address this we only change the relevant properties if they're not equal to defaults. If\n        they're equal to defaults there's no need to change them anyway. If they're *not* set to the\n        default values, we can assume the user has set the range and loop settings via the config. If\n        they're doing their own calls to ma_data_source_set_*() in addition to setting them via the\n        config, that's entirely on the caller and any synchronization issue becomes their problem.\n        */\n        if (pConfig->rangeBegInPCMFrames != MA_DATA_SOURCE_DEFAULT_RANGE_BEG || pConfig->rangeEndInPCMFrames != MA_DATA_SOURCE_DEFAULT_RANGE_END) {\n            ma_data_source_set_range_in_pcm_frames(pDataBuffer, pConfig->rangeBegInPCMFrames, pConfig->rangeEndInPCMFrames);\n        }\n\n        if (pConfig->loopPointBegInPCMFrames != MA_DATA_SOURCE_DEFAULT_LOOP_POINT_BEG || pConfig->loopPointEndInPCMFrames != MA_DATA_SOURCE_DEFAULT_LOOP_POINT_END) {\n            ma_data_source_set_loop_point_in_pcm_frames(pDataBuffer, pConfig->loopPointBegInPCMFrames, pConfig->loopPointEndInPCMFrames);\n        }\n\n        if (pConfig->isLooping != MA_FALSE) {\n            ma_data_source_set_looping(pDataBuffer, pConfig->isLooping);\n        }\n\n        ma_atomic_bool32_set(&pDataBuffer->isConnectorInitialized, MA_TRUE);\n\n        if (pInitNotification != NULL) {\n            ma_async_notification_signal(pInitNotification);\n        }\n\n        if (pInitFence != NULL) {\n            ma_fence_release(pInitFence);\n        }\n    }\n\n    /* At this point the backend should be initialized. We do *not* want to set pDataSource->result here - that needs to be done at a higher level to ensure it's done as the last step. */\n    return result;\n}\n\nstatic ma_result ma_resource_manager_data_buffer_uninit_connector(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer* pDataBuffer)\n{\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(pDataBuffer      != NULL);\n\n    (void)pResourceManager;\n\n    switch (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode))\n    {\n        case ma_resource_manager_data_supply_type_encoded:          /* Connector is a decoder. */\n        {\n            ma_decoder_uninit(&pDataBuffer->connector.decoder);\n        } break;\n\n        case ma_resource_manager_data_supply_type_decoded:          /* Connector is an audio buffer. */\n        {\n            ma_audio_buffer_uninit(&pDataBuffer->connector.buffer);\n        } break;\n\n        case ma_resource_manager_data_supply_type_decoded_paged:    /* Connector is a paged audio buffer. */\n        {\n            ma_paged_audio_buffer_uninit(&pDataBuffer->connector.pagedBuffer);\n        } break;\n\n        case ma_resource_manager_data_supply_type_unknown:\n        default:\n        {\n            /* Unknown data supply type. Should never happen. Need to post an error here. */\n            return MA_INVALID_ARGS;\n        };\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_uint32 ma_resource_manager_data_buffer_node_next_execution_order(ma_resource_manager_data_buffer_node* pDataBufferNode)\n{\n    MA_ASSERT(pDataBufferNode != NULL);\n    return ma_atomic_fetch_add_32(&pDataBufferNode->executionCounter, 1);\n}\n\nstatic ma_result ma_resource_manager_data_buffer_node_init_supply_encoded(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, const char* pFilePath, const wchar_t* pFilePathW)\n{\n    ma_result result;\n    size_t dataSizeInBytes;\n    void* pData;\n\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(pDataBufferNode  != NULL);\n    MA_ASSERT(pFilePath != NULL || pFilePathW != NULL);\n\n    result = ma_vfs_open_and_read_file_ex(pResourceManager->config.pVFS, pFilePath, pFilePathW, &pData, &dataSizeInBytes, &pResourceManager->config.allocationCallbacks);\n    if (result != MA_SUCCESS) {\n        if (pFilePath != NULL) {\n            ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, \"Failed to load file \\\"%s\\\". %s.\\n\", pFilePath, ma_result_description(result));\n        } else {\n            #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(_MSC_VER)\n                ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, \"Failed to load file \\\"%ls\\\". %s.\\n\", pFilePathW, ma_result_description(result));\n            #endif\n        }\n\n        return result;\n    }\n\n    pDataBufferNode->data.backend.encoded.pData       = pData;\n    pDataBufferNode->data.backend.encoded.sizeInBytes = dataSizeInBytes;\n    ma_resource_manager_data_buffer_node_set_data_supply_type(pDataBufferNode, ma_resource_manager_data_supply_type_encoded);  /* <-- Must be set last. */\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_resource_manager_data_buffer_node_init_supply_decoded(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, const char* pFilePath, const wchar_t* pFilePathW, ma_uint32 flags, ma_decoder** ppDecoder)\n{\n    ma_result result = MA_SUCCESS;\n    ma_decoder* pDecoder;\n    ma_uint64 totalFrameCount;\n\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(pDataBufferNode  != NULL);\n    MA_ASSERT(ppDecoder         != NULL);\n    MA_ASSERT(pFilePath != NULL || pFilePathW != NULL);\n\n    *ppDecoder = NULL;  /* For safety. */\n\n    pDecoder = (ma_decoder*)ma_malloc(sizeof(*pDecoder), &pResourceManager->config.allocationCallbacks);\n    if (pDecoder == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_resource_manager__init_decoder(pResourceManager, pFilePath, pFilePathW, pDecoder);\n    if (result != MA_SUCCESS) {\n        ma_free(pDecoder, &pResourceManager->config.allocationCallbacks);\n        return result;\n    }\n\n    /*\n    At this point we have the decoder and we now need to initialize the data supply. This will\n    be either a decoded buffer, or a decoded paged buffer. A regular buffer is just one big heap\n    allocated buffer, whereas a paged buffer is a linked list of paged-sized buffers. The latter\n    is used when the length of a sound is unknown until a full decode has been performed.\n    */\n    if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_UNKNOWN_LENGTH) == 0) {\n        result = ma_decoder_get_length_in_pcm_frames(pDecoder, &totalFrameCount);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    } else {\n        totalFrameCount = 0;\n    }\n\n    if (totalFrameCount > 0) {\n        /* It's a known length. The data supply is a regular decoded buffer. */\n        ma_uint64 dataSizeInBytes;\n        void* pData;\n\n        dataSizeInBytes = totalFrameCount * ma_get_bytes_per_frame(pDecoder->outputFormat, pDecoder->outputChannels);\n        if (dataSizeInBytes > MA_SIZE_MAX) {\n            ma_decoder_uninit(pDecoder);\n            ma_free(pDecoder, &pResourceManager->config.allocationCallbacks);\n            return MA_TOO_BIG;\n        }\n\n        pData = ma_malloc((size_t)dataSizeInBytes, &pResourceManager->config.allocationCallbacks);\n        if (pData == NULL) {\n            ma_decoder_uninit(pDecoder);\n            ma_free(pDecoder, &pResourceManager->config.allocationCallbacks);\n            return MA_OUT_OF_MEMORY;\n        }\n\n        /* The buffer needs to be initialized to silence in case the caller reads from it. */\n        ma_silence_pcm_frames(pData, totalFrameCount, pDecoder->outputFormat, pDecoder->outputChannels);\n\n        /* Data has been allocated and the data supply can now be initialized. */\n        pDataBufferNode->data.backend.decoded.pData             = pData;\n        pDataBufferNode->data.backend.decoded.totalFrameCount   = totalFrameCount;\n        pDataBufferNode->data.backend.decoded.format            = pDecoder->outputFormat;\n        pDataBufferNode->data.backend.decoded.channels          = pDecoder->outputChannels;\n        pDataBufferNode->data.backend.decoded.sampleRate        = pDecoder->outputSampleRate;\n        pDataBufferNode->data.backend.decoded.decodedFrameCount = 0;\n        ma_resource_manager_data_buffer_node_set_data_supply_type(pDataBufferNode, ma_resource_manager_data_supply_type_decoded);  /* <-- Must be set last. */\n    } else {\n        /*\n        It's an unknown length. The data supply is a paged decoded buffer. Setting this up is\n        actually easier than the non-paged decoded buffer because we just need to initialize\n        a ma_paged_audio_buffer object.\n        */\n        result = ma_paged_audio_buffer_data_init(pDecoder->outputFormat, pDecoder->outputChannels, &pDataBufferNode->data.backend.decodedPaged.data);\n        if (result != MA_SUCCESS) {\n            ma_decoder_uninit(pDecoder);\n            ma_free(pDecoder, &pResourceManager->config.allocationCallbacks);\n            return result;\n        }\n\n        pDataBufferNode->data.backend.decodedPaged.sampleRate        = pDecoder->outputSampleRate;\n        pDataBufferNode->data.backend.decodedPaged.decodedFrameCount = 0;\n        ma_resource_manager_data_buffer_node_set_data_supply_type(pDataBufferNode, ma_resource_manager_data_supply_type_decoded_paged);  /* <-- Must be set last. */\n    }\n\n    *ppDecoder = pDecoder;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_resource_manager_data_buffer_node_decode_next_page(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, ma_decoder* pDecoder)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint64 pageSizeInFrames;\n    ma_uint64 framesToTryReading;\n    ma_uint64 framesRead;\n\n    MA_ASSERT(pResourceManager != NULL);\n    MA_ASSERT(pDataBufferNode  != NULL);\n    MA_ASSERT(pDecoder         != NULL);\n\n    /* We need to know the size of a page in frames to know how many frames to decode. */\n    pageSizeInFrames = MA_RESOURCE_MANAGER_PAGE_SIZE_IN_MILLISECONDS * (pDecoder->outputSampleRate/1000);\n    framesToTryReading = pageSizeInFrames;\n\n    /*\n    Here is where we do the decoding of the next page. We'll run a slightly different path depending\n    on whether or not we're using a flat or paged buffer because the allocation of the page differs\n    between the two. For a flat buffer it's an offset to an already-allocated buffer. For a paged\n    buffer, we need to allocate a new page and attach it to the linked list.\n    */\n    switch (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBufferNode))\n    {\n        case ma_resource_manager_data_supply_type_decoded:\n        {\n            /* The destination buffer is an offset to the existing buffer. Don't read more than we originally retrieved when we first initialized the decoder. */\n            void* pDst;\n            ma_uint64 framesRemaining = pDataBufferNode->data.backend.decoded.totalFrameCount - pDataBufferNode->data.backend.decoded.decodedFrameCount;\n            if (framesToTryReading > framesRemaining) {\n                framesToTryReading = framesRemaining;\n            }\n\n            if (framesToTryReading > 0) {\n                pDst = ma_offset_ptr(\n                    pDataBufferNode->data.backend.decoded.pData,\n                    pDataBufferNode->data.backend.decoded.decodedFrameCount * ma_get_bytes_per_frame(pDataBufferNode->data.backend.decoded.format, pDataBufferNode->data.backend.decoded.channels)\n                );\n                MA_ASSERT(pDst != NULL);\n\n                result = ma_decoder_read_pcm_frames(pDecoder, pDst, framesToTryReading, &framesRead);\n                if (framesRead > 0) {\n                    pDataBufferNode->data.backend.decoded.decodedFrameCount += framesRead;\n                }\n            } else {\n                framesRead = 0;\n            }\n        } break;\n\n        case ma_resource_manager_data_supply_type_decoded_paged:\n        {\n            /* The destination buffer is a freshly allocated page. */\n            ma_paged_audio_buffer_page* pPage;\n\n            result = ma_paged_audio_buffer_data_allocate_page(&pDataBufferNode->data.backend.decodedPaged.data, framesToTryReading, NULL, &pResourceManager->config.allocationCallbacks, &pPage);\n            if (result != MA_SUCCESS) {\n                return result;\n            }\n\n            result = ma_decoder_read_pcm_frames(pDecoder, pPage->pAudioData, framesToTryReading, &framesRead);\n            if (framesRead > 0) {\n                pPage->sizeInFrames = framesRead;\n\n                result = ma_paged_audio_buffer_data_append_page(&pDataBufferNode->data.backend.decodedPaged.data, pPage);\n                if (result == MA_SUCCESS) {\n                    pDataBufferNode->data.backend.decodedPaged.decodedFrameCount += framesRead;\n                } else {\n                    /* Failed to append the page. Just abort and set the status to MA_AT_END. */\n                    ma_paged_audio_buffer_data_free_page(&pDataBufferNode->data.backend.decodedPaged.data, pPage, &pResourceManager->config.allocationCallbacks);\n                    result = MA_AT_END;\n                }\n            } else {\n                /* No frames were read. Free the page and just set the status to MA_AT_END. */\n                ma_paged_audio_buffer_data_free_page(&pDataBufferNode->data.backend.decodedPaged.data, pPage, &pResourceManager->config.allocationCallbacks);\n                result = MA_AT_END;\n            }\n        } break;\n\n        case ma_resource_manager_data_supply_type_encoded:\n        case ma_resource_manager_data_supply_type_unknown:\n        default:\n        {\n            /* Unexpected data supply type. */\n            ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_ERROR, \"Unexpected data supply type (%d) when decoding page.\", ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBufferNode));\n            return MA_ERROR;\n        };\n    }\n\n    if (result == MA_SUCCESS && framesRead == 0) {\n        result = MA_AT_END;\n    }\n\n    return result;\n}\n\nstatic ma_result ma_resource_manager_data_buffer_node_acquire_critical_section(ma_resource_manager* pResourceManager, const char* pFilePath, const wchar_t* pFilePathW, ma_uint32 hashedName32, ma_uint32 flags, const ma_resource_manager_data_supply* pExistingData, ma_fence* pInitFence, ma_fence* pDoneFence, ma_resource_manager_inline_notification* pInitNotification, ma_resource_manager_data_buffer_node** ppDataBufferNode)\n{\n    ma_result result = MA_SUCCESS;\n    ma_resource_manager_data_buffer_node* pDataBufferNode = NULL;\n    ma_resource_manager_data_buffer_node* pInsertPoint;\n\n    if (ppDataBufferNode != NULL) {\n        *ppDataBufferNode = NULL;\n    }\n\n    result = ma_resource_manager_data_buffer_node_insert_point(pResourceManager, hashedName32, &pInsertPoint);\n    if (result == MA_ALREADY_EXISTS) {\n        /* The node already exists. We just need to increment the reference count. */\n        pDataBufferNode = pInsertPoint;\n\n        result = ma_resource_manager_data_buffer_node_increment_ref(pResourceManager, pDataBufferNode, NULL);\n        if (result != MA_SUCCESS) {\n            return result;  /* Should never happen. Failed to increment the reference count. */\n        }\n\n        result = MA_ALREADY_EXISTS;\n        goto done;\n    } else {\n        /*\n        The node does not already exist. We need to post a LOAD_DATA_BUFFER_NODE job here. This\n        needs to be done inside the critical section to ensure an uninitialization of the node\n        does not occur before initialization on another thread.\n        */\n        pDataBufferNode = (ma_resource_manager_data_buffer_node*)ma_malloc(sizeof(*pDataBufferNode), &pResourceManager->config.allocationCallbacks);\n        if (pDataBufferNode == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n\n        MA_ZERO_OBJECT(pDataBufferNode);\n        pDataBufferNode->hashedName32 = hashedName32;\n        pDataBufferNode->refCount     = 1;        /* Always set to 1 by default (this is our first reference). */\n\n        if (pExistingData == NULL) {\n            pDataBufferNode->data.type    = ma_resource_manager_data_supply_type_unknown;    /* <-- We won't know this until we start decoding. */\n            pDataBufferNode->result       = MA_BUSY;  /* Must be set to MA_BUSY before we leave the critical section, so might as well do it now. */\n            pDataBufferNode->isDataOwnedByResourceManager = MA_TRUE;\n        } else {\n            pDataBufferNode->data         = *pExistingData;\n            pDataBufferNode->result       = MA_SUCCESS;   /* Not loading asynchronously, so just set the status */\n            pDataBufferNode->isDataOwnedByResourceManager = MA_FALSE;\n        }\n\n        result = ma_resource_manager_data_buffer_node_insert_at(pResourceManager, pDataBufferNode, pInsertPoint);\n        if (result != MA_SUCCESS) {\n            ma_free(pDataBufferNode, &pResourceManager->config.allocationCallbacks);\n            return result;  /* Should never happen. Failed to insert the data buffer into the BST. */\n        }\n\n        /*\n        Here is where we'll post the job, but only if we're loading asynchronously. If we're\n        loading synchronously we'll defer loading to a later stage, outside of the critical\n        section.\n        */\n        if (pDataBufferNode->isDataOwnedByResourceManager && (flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC) != 0) {\n            /* Loading asynchronously. Post the job. */\n            ma_job job;\n            char* pFilePathCopy = NULL;\n            wchar_t* pFilePathWCopy = NULL;\n\n            /* We need a copy of the file path. We should probably make this more efficient, but for now we'll do a transient memory allocation. */\n            if (pFilePath != NULL) {\n                pFilePathCopy = ma_copy_string(pFilePath, &pResourceManager->config.allocationCallbacks);\n            } else {\n                pFilePathWCopy = ma_copy_string_w(pFilePathW, &pResourceManager->config.allocationCallbacks);\n            }\n\n            if (pFilePathCopy == NULL && pFilePathWCopy == NULL) {\n                ma_resource_manager_data_buffer_node_remove(pResourceManager, pDataBufferNode);\n                ma_free(pDataBufferNode, &pResourceManager->config.allocationCallbacks);\n                return MA_OUT_OF_MEMORY;\n            }\n\n            if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) {\n                ma_resource_manager_inline_notification_init(pResourceManager, pInitNotification);\n            }\n\n            /* Acquire init and done fences before posting the job. These will be unacquired by the job thread. */\n            if (pInitFence != NULL) { ma_fence_acquire(pInitFence); }\n            if (pDoneFence != NULL) { ma_fence_acquire(pDoneFence); }\n\n            /* We now have everything we need to post the job to the job thread. */\n            job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE);\n            job.order = ma_resource_manager_data_buffer_node_next_execution_order(pDataBufferNode);\n            job.data.resourceManager.loadDataBufferNode.pResourceManager  = pResourceManager;\n            job.data.resourceManager.loadDataBufferNode.pDataBufferNode   = pDataBufferNode;\n            job.data.resourceManager.loadDataBufferNode.pFilePath         = pFilePathCopy;\n            job.data.resourceManager.loadDataBufferNode.pFilePathW        = pFilePathWCopy;\n            job.data.resourceManager.loadDataBufferNode.flags             = flags;\n            job.data.resourceManager.loadDataBufferNode.pInitNotification = ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) ? pInitNotification : NULL;\n            job.data.resourceManager.loadDataBufferNode.pDoneNotification = NULL;\n            job.data.resourceManager.loadDataBufferNode.pInitFence        = pInitFence;\n            job.data.resourceManager.loadDataBufferNode.pDoneFence        = pDoneFence;\n\n            if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) {\n                result = ma_job_process(&job);\n            } else {\n                result = ma_resource_manager_post_job(pResourceManager, &job);\n            }\n\n            if (result != MA_SUCCESS) {\n                /* Failed to post job. Probably ran out of memory. */\n                ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_ERROR, \"Failed to post MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER_NODE job. %s.\\n\", ma_result_description(result));\n\n                /*\n                Fences were acquired before posting the job, but since the job was not able to\n                be posted, we need to make sure we release them so nothing gets stuck waiting.\n                */\n                if (pInitFence != NULL) { ma_fence_release(pInitFence); }\n                if (pDoneFence != NULL) { ma_fence_release(pDoneFence); }\n\n                if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) {\n                    ma_resource_manager_inline_notification_uninit(pInitNotification);\n                } else {\n                    /* These will have been freed by the job thread, but with WAIT_INIT they will already have happend sinced the job has already been handled. */\n                    ma_free(pFilePathCopy,  &pResourceManager->config.allocationCallbacks);\n                    ma_free(pFilePathWCopy, &pResourceManager->config.allocationCallbacks);\n                }\n\n                ma_resource_manager_data_buffer_node_remove(pResourceManager, pDataBufferNode);\n                ma_free(pDataBufferNode, &pResourceManager->config.allocationCallbacks);\n\n                return result;\n            }\n        }\n    }\n\ndone:\n    if (ppDataBufferNode != NULL) {\n        *ppDataBufferNode = pDataBufferNode;\n    }\n\n    return result;\n}\n\nstatic ma_result ma_resource_manager_data_buffer_node_acquire(ma_resource_manager* pResourceManager, const char* pFilePath, const wchar_t* pFilePathW, ma_uint32 hashedName32, ma_uint32 flags, const ma_resource_manager_data_supply* pExistingData, ma_fence* pInitFence, ma_fence* pDoneFence, ma_resource_manager_data_buffer_node** ppDataBufferNode)\n{\n    ma_result result = MA_SUCCESS;\n    ma_bool32 nodeAlreadyExists = MA_FALSE;\n    ma_resource_manager_data_buffer_node* pDataBufferNode = NULL;\n    ma_resource_manager_inline_notification initNotification;   /* Used when the WAIT_INIT flag is set. */\n\n    if (ppDataBufferNode != NULL) {\n        *ppDataBufferNode = NULL;   /* Safety. */\n    }\n\n    if (pResourceManager == NULL || (pFilePath == NULL && pFilePathW == NULL && hashedName32 == 0)) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* If we're specifying existing data, it must be valid. */\n    if (pExistingData != NULL && pExistingData->type == ma_resource_manager_data_supply_type_unknown) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* If we don't support threading, remove the ASYNC flag to make the rest of this a bit simpler. */\n    if (ma_resource_manager_is_threading_enabled(pResourceManager) == MA_FALSE) {\n        flags &= ~MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC;\n    }\n\n    if (hashedName32 == 0) {\n        if (pFilePath != NULL) {\n            hashedName32 = ma_hash_string_32(pFilePath);\n        } else {\n            hashedName32 = ma_hash_string_w_32(pFilePathW);\n        }\n    }\n\n    /*\n    Here is where we either increment the node's reference count or allocate a new one and add it\n    to the BST. When allocating a new node, we need to make sure the LOAD_DATA_BUFFER_NODE job is\n    posted inside the critical section just in case the caller immediately uninitializes the node\n    as this will ensure the FREE_DATA_BUFFER_NODE job is given an execution order such that the\n    node is not uninitialized before initialization.\n    */\n    ma_resource_manager_data_buffer_bst_lock(pResourceManager);\n    {\n        result = ma_resource_manager_data_buffer_node_acquire_critical_section(pResourceManager, pFilePath, pFilePathW, hashedName32, flags, pExistingData, pInitFence, pDoneFence, &initNotification, &pDataBufferNode);\n    }\n    ma_resource_manager_data_buffer_bst_unlock(pResourceManager);\n\n    if (result == MA_ALREADY_EXISTS) {\n        nodeAlreadyExists = MA_TRUE;\n        result = MA_SUCCESS;\n    } else {\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    /*\n    If we're loading synchronously, we'll need to load everything now. When loading asynchronously,\n    a job will have been posted inside the BST critical section so that an uninitialization can be\n    allocated an appropriate execution order thereby preventing it from being uninitialized before\n    the node is initialized by the decoding thread(s).\n    */\n    if (nodeAlreadyExists == MA_FALSE) {    /* Don't need to try loading anything if the node already exists. */\n        if (pFilePath == NULL && pFilePathW == NULL) {\n            /*\n            If this path is hit, it means a buffer is being copied (i.e. initialized from only the\n            hashed name), but that node has been freed in the meantime, probably from some other\n            thread. This is an invalid operation.\n            */\n            ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, \"Cloning data buffer node failed because the source node was released. The source node must remain valid until the cloning has completed.\\n\");\n            result = MA_INVALID_OPERATION;\n            goto done;\n        }\n\n        if (pDataBufferNode->isDataOwnedByResourceManager) {\n            if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC) == 0) {\n                /* Loading synchronously. Load the sound in it's entirety here. */\n                if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE) == 0) {\n                    /* No decoding. This is the simple case - just store the file contents in memory. */\n                    result = ma_resource_manager_data_buffer_node_init_supply_encoded(pResourceManager, pDataBufferNode, pFilePath, pFilePathW);\n                    if (result != MA_SUCCESS) {\n                        goto done;\n                    }\n                } else {\n                    /* Decoding. We do this the same way as we do when loading asynchronously. */\n                    ma_decoder* pDecoder;\n                    result = ma_resource_manager_data_buffer_node_init_supply_decoded(pResourceManager, pDataBufferNode, pFilePath, pFilePathW, flags, &pDecoder);\n                    if (result != MA_SUCCESS) {\n                        goto done;\n                    }\n\n                    /* We have the decoder, now decode page by page just like we do when loading asynchronously. */\n                    for (;;) {\n                        /* Decode next page. */\n                        result = ma_resource_manager_data_buffer_node_decode_next_page(pResourceManager, pDataBufferNode, pDecoder);\n                        if (result != MA_SUCCESS) {\n                            break;  /* Will return MA_AT_END when the last page has been decoded. */\n                        }\n                    }\n\n                    /* Reaching the end needs to be considered successful. */\n                    if (result == MA_AT_END) {\n                        result  = MA_SUCCESS;\n                    }\n\n                    /*\n                    At this point the data buffer is either fully decoded or some error occurred. Either\n                    way, the decoder is no longer necessary.\n                    */\n                    ma_decoder_uninit(pDecoder);\n                    ma_free(pDecoder, &pResourceManager->config.allocationCallbacks);\n                }\n\n                /* Getting here means we were successful. Make sure the status of the node is updated accordingly. */\n                ma_atomic_exchange_i32(&pDataBufferNode->result, result);\n            } else {\n                /* Loading asynchronously. We may need to wait for initialization. */\n                if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) {\n                    ma_resource_manager_inline_notification_wait(&initNotification);\n                }\n            }\n        } else {\n            /* The data is not managed by the resource manager so there's nothing else to do. */\n            MA_ASSERT(pExistingData != NULL);\n        }\n    }\n\ndone:\n    /* If we failed to initialize the data buffer we need to free it. */\n    if (result != MA_SUCCESS) {\n        if (nodeAlreadyExists == MA_FALSE) {\n            ma_resource_manager_data_buffer_node_remove(pResourceManager, pDataBufferNode);\n            ma_free(pDataBufferNode, &pResourceManager->config.allocationCallbacks);\n        }\n    }\n\n    /*\n    The init notification needs to be uninitialized. This will be used if the node does not already\n    exist, and we've specified ASYNC | WAIT_INIT.\n    */\n    if (nodeAlreadyExists == MA_FALSE && pDataBufferNode->isDataOwnedByResourceManager && (flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC) != 0) {\n        if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) {\n            ma_resource_manager_inline_notification_uninit(&initNotification);\n        }\n    }\n\n    if (ppDataBufferNode != NULL) {\n        *ppDataBufferNode = pDataBufferNode;\n    }\n\n    return result;\n}\n\nstatic ma_result ma_resource_manager_data_buffer_node_unacquire(ma_resource_manager* pResourceManager, ma_resource_manager_data_buffer_node* pDataBufferNode, const char* pName, const wchar_t* pNameW)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint32 refCount = 0xFFFFFFFF; /* The new reference count of the node after decrementing. Initialize to non-0 to be safe we don't fall into the freeing path. */\n    ma_uint32 hashedName32 = 0;\n\n    if (pResourceManager == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pDataBufferNode == NULL) {\n        if (pName == NULL && pNameW == NULL) {\n            return MA_INVALID_ARGS;\n        }\n\n        if (pName != NULL) {\n            hashedName32 = ma_hash_string_32(pName);\n        } else {\n            hashedName32 = ma_hash_string_w_32(pNameW);\n        }\n    }\n\n    /*\n    The first thing to do is decrement the reference counter of the node. Then, if the reference\n    count is zero, we need to free the node. If the node is still in the process of loading, we'll\n    need to post a job to the job queue to free the node. Otherwise we'll just do it here.\n    */\n    ma_resource_manager_data_buffer_bst_lock(pResourceManager);\n    {\n        /* Might need to find the node. Must be done inside the critical section. */\n        if (pDataBufferNode == NULL) {\n            result = ma_resource_manager_data_buffer_node_search(pResourceManager, hashedName32, &pDataBufferNode);\n            if (result != MA_SUCCESS) {\n                goto stage2;    /* Couldn't find the node. */\n            }\n        }\n\n        result = ma_resource_manager_data_buffer_node_decrement_ref(pResourceManager, pDataBufferNode, &refCount);\n        if (result != MA_SUCCESS) {\n            goto stage2;    /* Should never happen. */\n        }\n\n        if (refCount == 0) {\n            result = ma_resource_manager_data_buffer_node_remove(pResourceManager, pDataBufferNode);\n            if (result != MA_SUCCESS) {\n                goto stage2;  /* An error occurred when trying to remove the data buffer. This should never happen. */\n            }\n        }\n    }\n    ma_resource_manager_data_buffer_bst_unlock(pResourceManager);\n\nstage2:\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /*\n    Here is where we need to free the node. We don't want to do this inside the critical section\n    above because we want to keep that as small as possible for multi-threaded efficiency.\n    */\n    if (refCount == 0) {\n        if (ma_resource_manager_data_buffer_node_result(pDataBufferNode) == MA_BUSY) {\n            /* The sound is still loading. We need to delay the freeing of the node to a safe time. */\n            ma_job job;\n\n            /* We need to mark the node as unavailable for the sake of the resource manager worker threads. */\n            ma_atomic_exchange_i32(&pDataBufferNode->result, MA_UNAVAILABLE);\n\n            job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER_NODE);\n            job.order = ma_resource_manager_data_buffer_node_next_execution_order(pDataBufferNode);\n            job.data.resourceManager.freeDataBufferNode.pResourceManager = pResourceManager;\n            job.data.resourceManager.freeDataBufferNode.pDataBufferNode  = pDataBufferNode;\n\n            result = ma_resource_manager_post_job(pResourceManager, &job);\n            if (result != MA_SUCCESS) {\n                ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_ERROR, \"Failed to post MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER_NODE job. %s.\\n\", ma_result_description(result));\n                return result;\n            }\n\n            /* If we don't support threading, process the job queue here. */\n            if (ma_resource_manager_is_threading_enabled(pResourceManager) == MA_FALSE) {\n                while (ma_resource_manager_data_buffer_node_result(pDataBufferNode) == MA_BUSY) {\n                    result = ma_resource_manager_process_next_job(pResourceManager);\n                    if (result == MA_NO_DATA_AVAILABLE || result == MA_CANCELLED) {\n                        result = MA_SUCCESS;\n                        break;\n                    }\n                }\n            } else {\n                /* Threading is enabled. The job queue will deal with the rest of the cleanup from here. */\n            }\n        } else {\n            /* The sound isn't loading so we can just free the node here. */\n            ma_resource_manager_data_buffer_node_free(pResourceManager, pDataBufferNode);\n        }\n    }\n\n    return result;\n}\n\n\n\nstatic ma_uint32 ma_resource_manager_data_buffer_next_execution_order(ma_resource_manager_data_buffer* pDataBuffer)\n{\n    MA_ASSERT(pDataBuffer != NULL);\n    return ma_atomic_fetch_add_32(&pDataBuffer->executionCounter, 1);\n}\n\nstatic ma_result ma_resource_manager_data_buffer_cb__read_pcm_frames(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    return ma_resource_manager_data_buffer_read_pcm_frames((ma_resource_manager_data_buffer*)pDataSource, pFramesOut, frameCount, pFramesRead);\n}\n\nstatic ma_result ma_resource_manager_data_buffer_cb__seek_to_pcm_frame(ma_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    return ma_resource_manager_data_buffer_seek_to_pcm_frame((ma_resource_manager_data_buffer*)pDataSource, frameIndex);\n}\n\nstatic ma_result ma_resource_manager_data_buffer_cb__get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    return ma_resource_manager_data_buffer_get_data_format((ma_resource_manager_data_buffer*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap);\n}\n\nstatic ma_result ma_resource_manager_data_buffer_cb__get_cursor_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pCursor)\n{\n    return ma_resource_manager_data_buffer_get_cursor_in_pcm_frames((ma_resource_manager_data_buffer*)pDataSource, pCursor);\n}\n\nstatic ma_result ma_resource_manager_data_buffer_cb__get_length_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pLength)\n{\n    return ma_resource_manager_data_buffer_get_length_in_pcm_frames((ma_resource_manager_data_buffer*)pDataSource, pLength);\n}\n\nstatic ma_result ma_resource_manager_data_buffer_cb__set_looping(ma_data_source* pDataSource, ma_bool32 isLooping)\n{\n    ma_resource_manager_data_buffer* pDataBuffer = (ma_resource_manager_data_buffer*)pDataSource;\n    MA_ASSERT(pDataBuffer != NULL);\n\n    ma_atomic_exchange_32(&pDataBuffer->isLooping, isLooping);\n\n    /* The looping state needs to be set on the connector as well or else looping won't work when we read audio data. */\n    ma_data_source_set_looping(ma_resource_manager_data_buffer_get_connector(pDataBuffer), isLooping);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_data_source_vtable g_ma_resource_manager_data_buffer_vtable =\n{\n    ma_resource_manager_data_buffer_cb__read_pcm_frames,\n    ma_resource_manager_data_buffer_cb__seek_to_pcm_frame,\n    ma_resource_manager_data_buffer_cb__get_data_format,\n    ma_resource_manager_data_buffer_cb__get_cursor_in_pcm_frames,\n    ma_resource_manager_data_buffer_cb__get_length_in_pcm_frames,\n    ma_resource_manager_data_buffer_cb__set_looping,\n    0\n};\n\nstatic ma_result ma_resource_manager_data_buffer_init_ex_internal(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_uint32 hashedName32, ma_resource_manager_data_buffer* pDataBuffer)\n{\n    ma_result result = MA_SUCCESS;\n    ma_resource_manager_data_buffer_node* pDataBufferNode;\n    ma_data_source_config dataSourceConfig;\n    ma_bool32 async;\n    ma_uint32 flags;\n    ma_resource_manager_pipeline_notifications notifications;\n\n    if (pDataBuffer == NULL) {\n        if (pConfig != NULL && pConfig->pNotifications != NULL) {\n            ma_resource_manager_pipeline_notifications_signal_all_notifications(pConfig->pNotifications);\n        }\n\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pDataBuffer);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->pNotifications != NULL) {\n        notifications = *pConfig->pNotifications;   /* From here on out we should be referencing `notifications` instead of `pNotifications`. Set this to NULL to catch errors at testing time. */\n    } else {\n        MA_ZERO_OBJECT(&notifications);\n    }\n\n    /* For safety, always remove the ASYNC flag if threading is disabled on the resource manager. */\n    flags = pConfig->flags;\n    if (ma_resource_manager_is_threading_enabled(pResourceManager) == MA_FALSE) {\n        flags &= ~MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC;\n    }\n\n    async = (flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC) != 0;\n\n    /*\n    Fences need to be acquired before doing anything. These must be acquired and released outside of\n    the node to ensure there's no holes where ma_fence_wait() could prematurely return before the\n    data buffer has completed initialization.\n\n    When loading asynchronously, the node acquisition routine below will acquire the fences on this\n    thread and then release them on the async thread when the operation is complete.\n\n    These fences are always released at the \"done\" tag at the end of this function. They'll be\n    acquired a second if loading asynchronously. This double acquisition system is just done to\n    simplify code maintanence.\n    */\n    ma_resource_manager_pipeline_notifications_acquire_all_fences(&notifications);\n    {\n        /* We first need to acquire a node. If ASYNC is not set, this will not return until the entire sound has been loaded. */\n        result = ma_resource_manager_data_buffer_node_acquire(pResourceManager, pConfig->pFilePath, pConfig->pFilePathW, hashedName32, flags, NULL, notifications.init.pFence, notifications.done.pFence, &pDataBufferNode);\n        if (result != MA_SUCCESS) {\n            ma_resource_manager_pipeline_notifications_signal_all_notifications(&notifications);\n            goto done;\n        }\n\n        dataSourceConfig = ma_data_source_config_init();\n        dataSourceConfig.vtable = &g_ma_resource_manager_data_buffer_vtable;\n\n        result = ma_data_source_init(&dataSourceConfig, &pDataBuffer->ds);\n        if (result != MA_SUCCESS) {\n            ma_resource_manager_data_buffer_node_unacquire(pResourceManager, pDataBufferNode, NULL, NULL);\n            ma_resource_manager_pipeline_notifications_signal_all_notifications(&notifications);\n            goto done;\n        }\n\n        pDataBuffer->pResourceManager = pResourceManager;\n        pDataBuffer->pNode  = pDataBufferNode;\n        pDataBuffer->flags  = flags;\n        pDataBuffer->result = MA_BUSY;  /* Always default to MA_BUSY for safety. It'll be overwritten when loading completes or an error occurs. */\n\n        /* If we're loading asynchronously we need to post a job to the job queue to initialize the connector. */\n        if (async == MA_FALSE || ma_resource_manager_data_buffer_node_result(pDataBufferNode) == MA_SUCCESS) {\n            /* Loading synchronously or the data has already been fully loaded. We can just initialize the connector from here without a job. */\n            result = ma_resource_manager_data_buffer_init_connector(pDataBuffer, pConfig, NULL, NULL);\n            ma_atomic_exchange_i32(&pDataBuffer->result, result);\n\n            ma_resource_manager_pipeline_notifications_signal_all_notifications(&notifications);\n            goto done;\n        } else {\n            /* The node's data supply isn't initialized yet. The caller has requested that we load asynchronously so we need to post a job to do this. */\n            ma_job job;\n            ma_resource_manager_inline_notification initNotification;   /* Used when the WAIT_INIT flag is set. */\n\n            if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) {\n                ma_resource_manager_inline_notification_init(pResourceManager, &initNotification);\n            }\n\n            /*\n            The status of the data buffer needs to be set to MA_BUSY before posting the job so that the\n            worker thread is aware of it's busy state. If the LOAD_DATA_BUFFER job sees a status other\n            than MA_BUSY, it'll assume an error and fall through to an early exit.\n            */\n            ma_atomic_exchange_i32(&pDataBuffer->result, MA_BUSY);\n\n            /* Acquire fences a second time. These will be released by the async thread. */\n            ma_resource_manager_pipeline_notifications_acquire_all_fences(&notifications);\n\n            job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER);\n            job.order = ma_resource_manager_data_buffer_next_execution_order(pDataBuffer);\n            job.data.resourceManager.loadDataBuffer.pDataBuffer             = pDataBuffer;\n            job.data.resourceManager.loadDataBuffer.pInitNotification       = ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) ? &initNotification : notifications.init.pNotification;\n            job.data.resourceManager.loadDataBuffer.pDoneNotification       = notifications.done.pNotification;\n            job.data.resourceManager.loadDataBuffer.pInitFence              = notifications.init.pFence;\n            job.data.resourceManager.loadDataBuffer.pDoneFence              = notifications.done.pFence;\n            job.data.resourceManager.loadDataBuffer.rangeBegInPCMFrames     = pConfig->rangeBegInPCMFrames;\n            job.data.resourceManager.loadDataBuffer.rangeEndInPCMFrames     = pConfig->rangeEndInPCMFrames;\n            job.data.resourceManager.loadDataBuffer.loopPointBegInPCMFrames = pConfig->loopPointBegInPCMFrames;\n            job.data.resourceManager.loadDataBuffer.loopPointEndInPCMFrames = pConfig->loopPointEndInPCMFrames;\n            job.data.resourceManager.loadDataBuffer.isLooping               = pConfig->isLooping;\n\n            /* If we need to wait for initialization to complete we can just process the job in place. */\n            if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) {\n                result = ma_job_process(&job);\n            } else {\n                result = ma_resource_manager_post_job(pResourceManager, &job);\n            }\n\n            if (result != MA_SUCCESS) {\n                /* We failed to post the job. Most likely there isn't enough room in the queue's buffer. */\n                ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_ERROR, \"Failed to post MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_BUFFER job. %s.\\n\", ma_result_description(result));\n                ma_atomic_exchange_i32(&pDataBuffer->result, result);\n\n                /* Release the fences after the result has been set on the data buffer. */\n                ma_resource_manager_pipeline_notifications_release_all_fences(&notifications);\n            } else {\n                if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) {\n                    ma_resource_manager_inline_notification_wait(&initNotification);\n\n                    if (notifications.init.pNotification != NULL) {\n                        ma_async_notification_signal(notifications.init.pNotification);\n                    }\n\n                    /* NOTE: Do not release the init fence here. It will have been done by the job. */\n\n                    /* Make sure we return an error if initialization failed on the async thread. */\n                    result = ma_resource_manager_data_buffer_result(pDataBuffer);\n                    if (result == MA_BUSY) {\n                        result  = MA_SUCCESS;\n                    }\n                }\n            }\n\n            if ((flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) {\n                ma_resource_manager_inline_notification_uninit(&initNotification);\n            }\n        }\n\n        if (result != MA_SUCCESS) {\n            ma_resource_manager_data_buffer_node_unacquire(pResourceManager, pDataBufferNode, NULL, NULL);\n            goto done;\n        }\n    }\ndone:\n    if (result == MA_SUCCESS) {\n        if (pConfig->initialSeekPointInPCMFrames > 0) {\n            ma_resource_manager_data_buffer_seek_to_pcm_frame(pDataBuffer, pConfig->initialSeekPointInPCMFrames);\n        }\n    }\n\n    ma_resource_manager_pipeline_notifications_release_all_fences(&notifications);\n\n    return result;\n}\n\nMA_API ma_result ma_resource_manager_data_buffer_init_ex(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_buffer* pDataBuffer)\n{\n    return ma_resource_manager_data_buffer_init_ex_internal(pResourceManager, pConfig, 0, pDataBuffer);\n}\n\nMA_API ma_result ma_resource_manager_data_buffer_init(ma_resource_manager* pResourceManager, const char* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_buffer* pDataBuffer)\n{\n    ma_resource_manager_data_source_config config;\n\n    config = ma_resource_manager_data_source_config_init();\n    config.pFilePath      = pFilePath;\n    config.flags          = flags;\n    config.pNotifications = pNotifications;\n\n    return ma_resource_manager_data_buffer_init_ex(pResourceManager, &config, pDataBuffer);\n}\n\nMA_API ma_result ma_resource_manager_data_buffer_init_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_buffer* pDataBuffer)\n{\n    ma_resource_manager_data_source_config config;\n\n    config = ma_resource_manager_data_source_config_init();\n    config.pFilePathW     = pFilePath;\n    config.flags          = flags;\n    config.pNotifications = pNotifications;\n\n    return ma_resource_manager_data_buffer_init_ex(pResourceManager, &config, pDataBuffer);\n}\n\nMA_API ma_result ma_resource_manager_data_buffer_init_copy(ma_resource_manager* pResourceManager, const ma_resource_manager_data_buffer* pExistingDataBuffer, ma_resource_manager_data_buffer* pDataBuffer)\n{\n    ma_resource_manager_data_source_config config;\n\n    if (pExistingDataBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ASSERT(pExistingDataBuffer->pNode != NULL);  /* <-- If you've triggered this, you've passed in an invalid existing data buffer. */\n\n    config = ma_resource_manager_data_source_config_init();\n    config.flags = pExistingDataBuffer->flags;\n\n    return ma_resource_manager_data_buffer_init_ex_internal(pResourceManager, &config, pExistingDataBuffer->pNode->hashedName32, pDataBuffer);\n}\n\nstatic ma_result ma_resource_manager_data_buffer_uninit_internal(ma_resource_manager_data_buffer* pDataBuffer)\n{\n    MA_ASSERT(pDataBuffer != NULL);\n\n    /* The connector should be uninitialized first. */\n    ma_resource_manager_data_buffer_uninit_connector(pDataBuffer->pResourceManager, pDataBuffer);\n\n    /* With the connector uninitialized we can unacquire the node. */\n    ma_resource_manager_data_buffer_node_unacquire(pDataBuffer->pResourceManager, pDataBuffer->pNode, NULL, NULL);\n\n    /* The base data source needs to be uninitialized as well. */\n    ma_data_source_uninit(&pDataBuffer->ds);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_resource_manager_data_buffer_uninit(ma_resource_manager_data_buffer* pDataBuffer)\n{\n    ma_result result;\n\n    if (pDataBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (ma_resource_manager_data_buffer_result(pDataBuffer) == MA_SUCCESS) {\n        /* The data buffer can be deleted synchronously. */\n        return ma_resource_manager_data_buffer_uninit_internal(pDataBuffer);\n    } else {\n        /*\n        The data buffer needs to be deleted asynchronously because it's still loading. With the status set to MA_UNAVAILABLE, no more pages will\n        be loaded and the uninitialization should happen fairly quickly. Since the caller owns the data buffer, we need to wait for this event\n        to get processed before returning.\n        */\n        ma_resource_manager_inline_notification notification;\n        ma_job job;\n\n        /*\n        We need to mark the node as unavailable so we don't try reading from it anymore, but also to\n        let the loading thread know that it needs to abort it's loading procedure.\n        */\n        ma_atomic_exchange_i32(&pDataBuffer->result, MA_UNAVAILABLE);\n\n        result = ma_resource_manager_inline_notification_init(pDataBuffer->pResourceManager, &notification);\n        if (result != MA_SUCCESS) {\n            return result;  /* Failed to create the notification. This should rarely, if ever, happen. */\n        }\n\n        job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER);\n        job.order = ma_resource_manager_data_buffer_next_execution_order(pDataBuffer);\n        job.data.resourceManager.freeDataBuffer.pDataBuffer       = pDataBuffer;\n        job.data.resourceManager.freeDataBuffer.pDoneNotification = &notification;\n        job.data.resourceManager.freeDataBuffer.pDoneFence        = NULL;\n\n        result = ma_resource_manager_post_job(pDataBuffer->pResourceManager, &job);\n        if (result != MA_SUCCESS) {\n            ma_resource_manager_inline_notification_uninit(&notification);\n            return result;\n        }\n\n        ma_resource_manager_inline_notification_wait_and_uninit(&notification);\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_resource_manager_data_buffer_read_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint64 framesRead = 0;\n    ma_bool32 isDecodedBufferBusy = MA_FALSE;\n\n    /* Safety. */\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    if (frameCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    /*\n    We cannot be using the data buffer after it's been uninitialized. If you trigger this assert it means you're trying to read from the data buffer after\n    it's been uninitialized or is in the process of uninitializing.\n    */\n    MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE);\n\n    /* If the node is not initialized we need to abort with a busy code. */\n    if (ma_resource_manager_data_buffer_has_connector(pDataBuffer) == MA_FALSE) {\n        return MA_BUSY; /* Still loading. */\n    }\n\n    /*\n    If we've got a seek scheduled we'll want to do that before reading. However, for paged buffers, there's\n    a chance that the sound hasn't yet been decoded up to the seek point will result in the seek failing. If\n    this happens, we need to keep the seek scheduled and return MA_BUSY.\n    */\n    if (pDataBuffer->seekToCursorOnNextRead) {\n        pDataBuffer->seekToCursorOnNextRead = MA_FALSE;\n\n        result = ma_data_source_seek_to_pcm_frame(ma_resource_manager_data_buffer_get_connector(pDataBuffer), pDataBuffer->seekTargetInPCMFrames);\n        if (result != MA_SUCCESS) {\n            if (result == MA_BAD_SEEK && ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode) == ma_resource_manager_data_supply_type_decoded_paged) {\n                pDataBuffer->seekToCursorOnNextRead = MA_TRUE;  /* Keep the seek scheduled. We just haven't loaded enough data yet to do the seek properly. */\n                return MA_BUSY;\n            }\n\n            return result;\n        }\n    }\n\n    /*\n    For decoded buffers (not paged) we need to check beforehand how many frames we have available. We cannot\n    exceed this amount. We'll read as much as we can, and then return MA_BUSY.\n    */\n    if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode) == ma_resource_manager_data_supply_type_decoded) {\n        ma_uint64 availableFrames;\n\n        isDecodedBufferBusy = (ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) == MA_BUSY);\n\n        if (ma_resource_manager_data_buffer_get_available_frames(pDataBuffer, &availableFrames) == MA_SUCCESS) {\n            /* Don't try reading more than the available frame count. */\n            if (frameCount > availableFrames) {\n                frameCount = availableFrames;\n\n                /*\n                If there's no frames available we want to set the status to MA_AT_END. The logic below\n                will check if the node is busy, and if so, change it to MA_BUSY. The reason we do this\n                is because we don't want to call `ma_data_source_read_pcm_frames()` if the frame count\n                is 0 because that'll result in a situation where it's possible MA_AT_END won't get\n                returned.\n                */\n                if (frameCount == 0) {\n                    result = MA_AT_END;\n                }\n            } else {\n                isDecodedBufferBusy = MA_FALSE; /* We have enough frames available in the buffer to avoid a MA_BUSY status. */\n            }\n        }\n    }\n\n    /* Don't attempt to read anything if we've got no frames available. */\n    if (frameCount > 0) {\n        result = ma_data_source_read_pcm_frames(ma_resource_manager_data_buffer_get_connector(pDataBuffer), pFramesOut, frameCount, &framesRead);\n    }\n\n    /*\n    If we returned MA_AT_END, but the node is still loading, we don't want to return that code or else the caller will interpret the sound\n    as at the end and terminate decoding.\n    */\n    if (result == MA_AT_END) {\n        if (ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) == MA_BUSY) {\n            result = MA_BUSY;\n        }\n    }\n\n    if (isDecodedBufferBusy) {\n        result = MA_BUSY;\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = framesRead;\n    }\n\n    if (result == MA_SUCCESS && framesRead == 0) {\n        result  = MA_AT_END;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_resource_manager_data_buffer_seek_to_pcm_frame(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64 frameIndex)\n{\n    ma_result result;\n\n    /* We cannot be using the data source after it's been uninitialized. */\n    MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE);\n\n    /* If we haven't yet got a connector we need to abort. */\n    if (ma_resource_manager_data_buffer_has_connector(pDataBuffer) == MA_FALSE) {\n        pDataBuffer->seekTargetInPCMFrames = frameIndex;\n        pDataBuffer->seekToCursorOnNextRead = MA_TRUE;\n        return MA_BUSY; /* Still loading. */\n    }\n\n    result = ma_data_source_seek_to_pcm_frame(ma_resource_manager_data_buffer_get_connector(pDataBuffer), frameIndex);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pDataBuffer->seekTargetInPCMFrames = ~(ma_uint64)0; /* <-- For identification purposes. */\n    pDataBuffer->seekToCursorOnNextRead = MA_FALSE;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_resource_manager_data_buffer_get_data_format(ma_resource_manager_data_buffer* pDataBuffer, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    /* We cannot be using the data source after it's been uninitialized. */\n    MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE);\n\n    switch (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode))\n    {\n        case ma_resource_manager_data_supply_type_encoded:\n        {\n            return ma_data_source_get_data_format(&pDataBuffer->connector.decoder, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap);\n        };\n\n        case ma_resource_manager_data_supply_type_decoded:\n        {\n            *pFormat     = pDataBuffer->pNode->data.backend.decoded.format;\n            *pChannels   = pDataBuffer->pNode->data.backend.decoded.channels;\n            *pSampleRate = pDataBuffer->pNode->data.backend.decoded.sampleRate;\n            ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pDataBuffer->pNode->data.backend.decoded.channels);\n            return MA_SUCCESS;\n        };\n\n        case ma_resource_manager_data_supply_type_decoded_paged:\n        {\n            *pFormat     = pDataBuffer->pNode->data.backend.decodedPaged.data.format;\n            *pChannels   = pDataBuffer->pNode->data.backend.decodedPaged.data.channels;\n            *pSampleRate = pDataBuffer->pNode->data.backend.decodedPaged.sampleRate;\n            ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, pDataBuffer->pNode->data.backend.decoded.channels);\n            return MA_SUCCESS;\n        };\n\n        case ma_resource_manager_data_supply_type_unknown:\n        {\n            return MA_BUSY; /* Still loading. */\n        };\n\n        default:\n        {\n            /* Unknown supply type. Should never hit this. */\n            return MA_INVALID_ARGS;\n        }\n    }\n}\n\nMA_API ma_result ma_resource_manager_data_buffer_get_cursor_in_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pCursor)\n{\n    /* We cannot be using the data source after it's been uninitialized. */\n    MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE);\n\n    if (pDataBuffer == NULL || pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;\n\n    switch (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode))\n    {\n        case ma_resource_manager_data_supply_type_encoded:\n        {\n            return ma_decoder_get_cursor_in_pcm_frames(&pDataBuffer->connector.decoder, pCursor);\n        };\n\n        case ma_resource_manager_data_supply_type_decoded:\n        {\n            return ma_audio_buffer_get_cursor_in_pcm_frames(&pDataBuffer->connector.buffer, pCursor);\n        };\n\n        case ma_resource_manager_data_supply_type_decoded_paged:\n        {\n            return ma_paged_audio_buffer_get_cursor_in_pcm_frames(&pDataBuffer->connector.pagedBuffer, pCursor);\n        };\n\n        case ma_resource_manager_data_supply_type_unknown:\n        {\n            return MA_BUSY;\n        };\n\n        default:\n        {\n            return MA_INVALID_ARGS;\n        }\n    }\n}\n\nMA_API ma_result ma_resource_manager_data_buffer_get_length_in_pcm_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pLength)\n{\n    /* We cannot be using the data source after it's been uninitialized. */\n    MA_ASSERT(ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) != MA_UNAVAILABLE);\n\n    if (pDataBuffer == NULL || pLength == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode) == ma_resource_manager_data_supply_type_unknown) {\n        return MA_BUSY; /* Still loading. */\n    }\n\n    return ma_data_source_get_length_in_pcm_frames(ma_resource_manager_data_buffer_get_connector(pDataBuffer), pLength);\n}\n\nMA_API ma_result ma_resource_manager_data_buffer_result(const ma_resource_manager_data_buffer* pDataBuffer)\n{\n    if (pDataBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return (ma_result)ma_atomic_load_i32((ma_result*)&pDataBuffer->result);    /* Need a naughty const-cast here. */\n}\n\nMA_API ma_result ma_resource_manager_data_buffer_set_looping(ma_resource_manager_data_buffer* pDataBuffer, ma_bool32 isLooping)\n{\n    return ma_data_source_set_looping(pDataBuffer, isLooping);\n}\n\nMA_API ma_bool32 ma_resource_manager_data_buffer_is_looping(const ma_resource_manager_data_buffer* pDataBuffer)\n{\n    return ma_data_source_is_looping(pDataBuffer);\n}\n\nMA_API ma_result ma_resource_manager_data_buffer_get_available_frames(ma_resource_manager_data_buffer* pDataBuffer, ma_uint64* pAvailableFrames)\n{\n    if (pAvailableFrames == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pAvailableFrames = 0;\n\n    if (pDataBuffer == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode) == ma_resource_manager_data_supply_type_unknown) {\n        if (ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode) == MA_BUSY) {\n            return MA_BUSY;\n        } else {\n            return MA_INVALID_OPERATION;    /* No connector. */\n        }\n    }\n\n    switch (ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode))\n    {\n        case ma_resource_manager_data_supply_type_encoded:\n        {\n            return ma_decoder_get_available_frames(&pDataBuffer->connector.decoder, pAvailableFrames);\n        };\n\n        case ma_resource_manager_data_supply_type_decoded:\n        {\n            return ma_audio_buffer_get_available_frames(&pDataBuffer->connector.buffer, pAvailableFrames);\n        };\n\n        case ma_resource_manager_data_supply_type_decoded_paged:\n        {\n            ma_uint64 cursor;\n            ma_paged_audio_buffer_get_cursor_in_pcm_frames(&pDataBuffer->connector.pagedBuffer, &cursor);\n\n            if (pDataBuffer->pNode->data.backend.decodedPaged.decodedFrameCount > cursor) {\n                *pAvailableFrames = pDataBuffer->pNode->data.backend.decodedPaged.decodedFrameCount - cursor;\n            } else {\n                *pAvailableFrames = 0;\n            }\n\n            return MA_SUCCESS;\n        };\n\n        case ma_resource_manager_data_supply_type_unknown:\n        default:\n        {\n            /* Unknown supply type. Should never hit this. */\n            return MA_INVALID_ARGS;\n        }\n    }\n}\n\nMA_API ma_result ma_resource_manager_register_file(ma_resource_manager* pResourceManager, const char* pFilePath, ma_uint32 flags)\n{\n    return ma_resource_manager_data_buffer_node_acquire(pResourceManager, pFilePath, NULL, 0, flags, NULL, NULL, NULL, NULL);\n}\n\nMA_API ma_result ma_resource_manager_register_file_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath, ma_uint32 flags)\n{\n    return ma_resource_manager_data_buffer_node_acquire(pResourceManager, NULL, pFilePath, 0, flags, NULL, NULL, NULL, NULL);\n}\n\n\nstatic ma_result ma_resource_manager_register_data(ma_resource_manager* pResourceManager, const char* pName, const wchar_t* pNameW, ma_resource_manager_data_supply* pExistingData)\n{\n    return ma_resource_manager_data_buffer_node_acquire(pResourceManager, pName, pNameW, 0, 0, pExistingData, NULL, NULL, NULL);\n}\n\nstatic ma_result ma_resource_manager_register_decoded_data_internal(ma_resource_manager* pResourceManager, const char* pName, const wchar_t* pNameW, const void* pData, ma_uint64 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate)\n{\n    ma_resource_manager_data_supply data;\n    data.type                            = ma_resource_manager_data_supply_type_decoded;\n    data.backend.decoded.pData           = pData;\n    data.backend.decoded.totalFrameCount = frameCount;\n    data.backend.decoded.format          = format;\n    data.backend.decoded.channels        = channels;\n    data.backend.decoded.sampleRate      = sampleRate;\n\n    return ma_resource_manager_register_data(pResourceManager, pName, pNameW, &data);\n}\n\nMA_API ma_result ma_resource_manager_register_decoded_data(ma_resource_manager* pResourceManager, const char* pName, const void* pData, ma_uint64 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate)\n{\n    return ma_resource_manager_register_decoded_data_internal(pResourceManager, pName, NULL, pData, frameCount, format, channels, sampleRate);\n}\n\nMA_API ma_result ma_resource_manager_register_decoded_data_w(ma_resource_manager* pResourceManager, const wchar_t* pName, const void* pData, ma_uint64 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate)\n{\n    return ma_resource_manager_register_decoded_data_internal(pResourceManager, NULL, pName, pData, frameCount, format, channels, sampleRate);\n}\n\n\nstatic ma_result ma_resource_manager_register_encoded_data_internal(ma_resource_manager* pResourceManager, const char* pName, const wchar_t* pNameW, const void* pData, size_t sizeInBytes)\n{\n    ma_resource_manager_data_supply data;\n    data.type                        = ma_resource_manager_data_supply_type_encoded;\n    data.backend.encoded.pData       = pData;\n    data.backend.encoded.sizeInBytes = sizeInBytes;\n\n    return ma_resource_manager_register_data(pResourceManager, pName, pNameW, &data);\n}\n\nMA_API ma_result ma_resource_manager_register_encoded_data(ma_resource_manager* pResourceManager, const char* pName, const void* pData, size_t sizeInBytes)\n{\n    return ma_resource_manager_register_encoded_data_internal(pResourceManager, pName, NULL, pData, sizeInBytes);\n}\n\nMA_API ma_result ma_resource_manager_register_encoded_data_w(ma_resource_manager* pResourceManager, const wchar_t* pName, const void* pData, size_t sizeInBytes)\n{\n    return ma_resource_manager_register_encoded_data_internal(pResourceManager, NULL, pName, pData, sizeInBytes);\n}\n\n\nMA_API ma_result ma_resource_manager_unregister_file(ma_resource_manager* pResourceManager, const char* pFilePath)\n{\n    return ma_resource_manager_unregister_data(pResourceManager, pFilePath);\n}\n\nMA_API ma_result ma_resource_manager_unregister_file_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath)\n{\n    return ma_resource_manager_unregister_data_w(pResourceManager, pFilePath);\n}\n\nMA_API ma_result ma_resource_manager_unregister_data(ma_resource_manager* pResourceManager, const char* pName)\n{\n    return ma_resource_manager_data_buffer_node_unacquire(pResourceManager, NULL, pName, NULL);\n}\n\nMA_API ma_result ma_resource_manager_unregister_data_w(ma_resource_manager* pResourceManager, const wchar_t* pName)\n{\n    return ma_resource_manager_data_buffer_node_unacquire(pResourceManager, NULL, NULL, pName);\n}\n\n\nstatic ma_uint32 ma_resource_manager_data_stream_next_execution_order(ma_resource_manager_data_stream* pDataStream)\n{\n    MA_ASSERT(pDataStream != NULL);\n    return ma_atomic_fetch_add_32(&pDataStream->executionCounter, 1);\n}\n\nstatic ma_bool32 ma_resource_manager_data_stream_is_decoder_at_end(const ma_resource_manager_data_stream* pDataStream)\n{\n    MA_ASSERT(pDataStream != NULL);\n    return ma_atomic_load_32((ma_bool32*)&pDataStream->isDecoderAtEnd);\n}\n\nstatic ma_uint32 ma_resource_manager_data_stream_seek_counter(const ma_resource_manager_data_stream* pDataStream)\n{\n    MA_ASSERT(pDataStream != NULL);\n    return ma_atomic_load_32((ma_uint32*)&pDataStream->seekCounter);\n}\n\n\nstatic ma_result ma_resource_manager_data_stream_cb__read_pcm_frames(ma_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    return ma_resource_manager_data_stream_read_pcm_frames((ma_resource_manager_data_stream*)pDataSource, pFramesOut, frameCount, pFramesRead);\n}\n\nstatic ma_result ma_resource_manager_data_stream_cb__seek_to_pcm_frame(ma_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    return ma_resource_manager_data_stream_seek_to_pcm_frame((ma_resource_manager_data_stream*)pDataSource, frameIndex);\n}\n\nstatic ma_result ma_resource_manager_data_stream_cb__get_data_format(ma_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    return ma_resource_manager_data_stream_get_data_format((ma_resource_manager_data_stream*)pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap);\n}\n\nstatic ma_result ma_resource_manager_data_stream_cb__get_cursor_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pCursor)\n{\n    return ma_resource_manager_data_stream_get_cursor_in_pcm_frames((ma_resource_manager_data_stream*)pDataSource, pCursor);\n}\n\nstatic ma_result ma_resource_manager_data_stream_cb__get_length_in_pcm_frames(ma_data_source* pDataSource, ma_uint64* pLength)\n{\n    return ma_resource_manager_data_stream_get_length_in_pcm_frames((ma_resource_manager_data_stream*)pDataSource, pLength);\n}\n\nstatic ma_result ma_resource_manager_data_stream_cb__set_looping(ma_data_source* pDataSource, ma_bool32 isLooping)\n{\n    ma_resource_manager_data_stream* pDataStream = (ma_resource_manager_data_stream*)pDataSource;\n    MA_ASSERT(pDataStream != NULL);\n\n    ma_atomic_exchange_32(&pDataStream->isLooping, isLooping);\n\n    return MA_SUCCESS;\n}\n\nstatic ma_data_source_vtable g_ma_resource_manager_data_stream_vtable =\n{\n    ma_resource_manager_data_stream_cb__read_pcm_frames,\n    ma_resource_manager_data_stream_cb__seek_to_pcm_frame,\n    ma_resource_manager_data_stream_cb__get_data_format,\n    ma_resource_manager_data_stream_cb__get_cursor_in_pcm_frames,\n    ma_resource_manager_data_stream_cb__get_length_in_pcm_frames,\n    ma_resource_manager_data_stream_cb__set_looping,\n    0 /*MA_DATA_SOURCE_SELF_MANAGED_RANGE_AND_LOOP_POINT*/\n};\n\nstatic void ma_resource_manager_data_stream_set_absolute_cursor(ma_resource_manager_data_stream* pDataStream, ma_uint64 absoluteCursor)\n{\n    /* Loop if possible. */\n    if (absoluteCursor > pDataStream->totalLengthInPCMFrames && pDataStream->totalLengthInPCMFrames > 0) {\n        absoluteCursor = absoluteCursor % pDataStream->totalLengthInPCMFrames;\n    }\n\n    ma_atomic_exchange_64(&pDataStream->absoluteCursor, absoluteCursor);\n}\n\nMA_API ma_result ma_resource_manager_data_stream_init_ex(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_stream* pDataStream)\n{\n    ma_result result;\n    ma_data_source_config dataSourceConfig;\n    char* pFilePathCopy = NULL;\n    wchar_t* pFilePathWCopy = NULL;\n    ma_job job;\n    ma_bool32 waitBeforeReturning = MA_FALSE;\n    ma_resource_manager_inline_notification waitNotification;\n    ma_resource_manager_pipeline_notifications notifications;\n\n    if (pDataStream == NULL) {\n        if (pConfig != NULL && pConfig->pNotifications != NULL) {\n            ma_resource_manager_pipeline_notifications_signal_all_notifications(pConfig->pNotifications);\n        }\n\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pDataStream);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->pNotifications != NULL) {\n        notifications = *pConfig->pNotifications;    /* From here on out, `notifications` should be used instead of `pNotifications`. Setting this to NULL to catch any errors at testing time. */\n    } else {\n        MA_ZERO_OBJECT(&notifications);\n    }\n\n    dataSourceConfig = ma_data_source_config_init();\n    dataSourceConfig.vtable = &g_ma_resource_manager_data_stream_vtable;\n\n    result = ma_data_source_init(&dataSourceConfig, &pDataStream->ds);\n    if (result != MA_SUCCESS) {\n        ma_resource_manager_pipeline_notifications_signal_all_notifications(&notifications);\n        return result;\n    }\n\n    pDataStream->pResourceManager = pResourceManager;\n    pDataStream->flags            = pConfig->flags;\n    pDataStream->result           = MA_BUSY;\n\n    ma_data_source_set_range_in_pcm_frames(pDataStream, pConfig->rangeBegInPCMFrames, pConfig->rangeEndInPCMFrames);\n    ma_data_source_set_loop_point_in_pcm_frames(pDataStream, pConfig->loopPointBegInPCMFrames, pConfig->loopPointEndInPCMFrames);\n    ma_data_source_set_looping(pDataStream, pConfig->isLooping);\n\n    if (pResourceManager == NULL || (pConfig->pFilePath == NULL && pConfig->pFilePathW == NULL)) {\n        ma_resource_manager_pipeline_notifications_signal_all_notifications(&notifications);\n        return MA_INVALID_ARGS;\n    }\n\n    /* We want all access to the VFS and the internal decoder to happen on the job thread just to keep things easier to manage for the VFS.  */\n\n    /* We need a copy of the file path. We should probably make this more efficient, but for now we'll do a transient memory allocation. */\n    if (pConfig->pFilePath != NULL) {\n        pFilePathCopy  = ma_copy_string(pConfig->pFilePath, &pResourceManager->config.allocationCallbacks);\n    } else {\n        pFilePathWCopy = ma_copy_string_w(pConfig->pFilePathW, &pResourceManager->config.allocationCallbacks);\n    }\n\n    if (pFilePathCopy == NULL && pFilePathWCopy == NULL) {\n        ma_resource_manager_pipeline_notifications_signal_all_notifications(&notifications);\n        return MA_OUT_OF_MEMORY;\n    }\n\n    /*\n    We need to check for the presence of MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC. If it's not set, we need to wait before returning. Otherwise we\n    can return immediately. Likewise, we'll also check for MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT and do the same.\n    */\n    if ((pConfig->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_ASYNC) == 0 || (pConfig->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT) != 0) {\n        waitBeforeReturning = MA_TRUE;\n        ma_resource_manager_inline_notification_init(pResourceManager, &waitNotification);\n    }\n\n    ma_resource_manager_pipeline_notifications_acquire_all_fences(&notifications);\n\n    /* Set the absolute cursor to our initial seek position so retrieval of the cursor returns a good value. */\n    ma_resource_manager_data_stream_set_absolute_cursor(pDataStream, pConfig->initialSeekPointInPCMFrames);\n\n    /* We now have everything we need to post the job. This is the last thing we need to do from here. The rest will be done by the job thread. */\n    job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_LOAD_DATA_STREAM);\n    job.order = ma_resource_manager_data_stream_next_execution_order(pDataStream);\n    job.data.resourceManager.loadDataStream.pDataStream       = pDataStream;\n    job.data.resourceManager.loadDataStream.pFilePath         = pFilePathCopy;\n    job.data.resourceManager.loadDataStream.pFilePathW        = pFilePathWCopy;\n    job.data.resourceManager.loadDataStream.initialSeekPoint  = pConfig->initialSeekPointInPCMFrames;\n    job.data.resourceManager.loadDataStream.pInitNotification = (waitBeforeReturning == MA_TRUE) ? &waitNotification : notifications.init.pNotification;\n    job.data.resourceManager.loadDataStream.pInitFence        = notifications.init.pFence;\n    result = ma_resource_manager_post_job(pResourceManager, &job);\n    if (result != MA_SUCCESS) {\n        ma_resource_manager_pipeline_notifications_signal_all_notifications(&notifications);\n        ma_resource_manager_pipeline_notifications_release_all_fences(&notifications);\n\n        if (waitBeforeReturning) {\n            ma_resource_manager_inline_notification_uninit(&waitNotification);\n        }\n\n        ma_free(pFilePathCopy,  &pResourceManager->config.allocationCallbacks);\n        ma_free(pFilePathWCopy, &pResourceManager->config.allocationCallbacks);\n        return result;\n    }\n\n    /* Wait if needed. */\n    if (waitBeforeReturning) {\n        ma_resource_manager_inline_notification_wait_and_uninit(&waitNotification);\n\n        if (notifications.init.pNotification != NULL) {\n            ma_async_notification_signal(notifications.init.pNotification);\n        }\n\n        /*\n        If there was an error during initialization make sure we return that result here. We don't want to do this\n        if we're not waiting because it will most likely be in a busy state.\n        */\n        if (pDataStream->result != MA_SUCCESS) {\n            return pDataStream->result;\n        }\n\n        /* NOTE: Do not release pInitFence here. That will be done by the job. */\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_resource_manager_data_stream_init(ma_resource_manager* pResourceManager, const char* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_stream* pDataStream)\n{\n    ma_resource_manager_data_source_config config;\n\n    config = ma_resource_manager_data_source_config_init();\n    config.pFilePath      = pFilePath;\n    config.flags          = flags;\n    config.pNotifications = pNotifications;\n\n    return ma_resource_manager_data_stream_init_ex(pResourceManager, &config, pDataStream);\n}\n\nMA_API ma_result ma_resource_manager_data_stream_init_w(ma_resource_manager* pResourceManager, const wchar_t* pFilePath, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_stream* pDataStream)\n{\n    ma_resource_manager_data_source_config config;\n\n    config = ma_resource_manager_data_source_config_init();\n    config.pFilePathW     = pFilePath;\n    config.flags          = flags;\n    config.pNotifications = pNotifications;\n\n    return ma_resource_manager_data_stream_init_ex(pResourceManager, &config, pDataStream);\n}\n\nMA_API ma_result ma_resource_manager_data_stream_uninit(ma_resource_manager_data_stream* pDataStream)\n{\n    ma_resource_manager_inline_notification freeEvent;\n    ma_job job;\n\n    if (pDataStream == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The first thing to do is set the result to unavailable. This will prevent future page decoding. */\n    ma_atomic_exchange_i32(&pDataStream->result, MA_UNAVAILABLE);\n\n    /*\n    We need to post a job to ensure we're not in the middle or decoding or anything. Because the object is owned by the caller, we'll need\n    to wait for it to complete before returning which means we need an event.\n    */\n    ma_resource_manager_inline_notification_init(pDataStream->pResourceManager, &freeEvent);\n\n    job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_STREAM);\n    job.order = ma_resource_manager_data_stream_next_execution_order(pDataStream);\n    job.data.resourceManager.freeDataStream.pDataStream       = pDataStream;\n    job.data.resourceManager.freeDataStream.pDoneNotification = &freeEvent;\n    job.data.resourceManager.freeDataStream.pDoneFence        = NULL;\n    ma_resource_manager_post_job(pDataStream->pResourceManager, &job);\n\n    /* We need to wait for the job to finish processing before we return. */\n    ma_resource_manager_inline_notification_wait_and_uninit(&freeEvent);\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_uint32 ma_resource_manager_data_stream_get_page_size_in_frames(ma_resource_manager_data_stream* pDataStream)\n{\n    MA_ASSERT(pDataStream != NULL);\n    MA_ASSERT(pDataStream->isDecoderInitialized == MA_TRUE);\n\n    return MA_RESOURCE_MANAGER_PAGE_SIZE_IN_MILLISECONDS * (pDataStream->decoder.outputSampleRate/1000);\n}\n\nstatic void* ma_resource_manager_data_stream_get_page_data_pointer(ma_resource_manager_data_stream* pDataStream, ma_uint32 pageIndex, ma_uint32 relativeCursor)\n{\n    MA_ASSERT(pDataStream != NULL);\n    MA_ASSERT(pDataStream->isDecoderInitialized == MA_TRUE);\n    MA_ASSERT(pageIndex == 0 || pageIndex == 1);\n\n    return ma_offset_ptr(pDataStream->pPageData, ((ma_resource_manager_data_stream_get_page_size_in_frames(pDataStream) * pageIndex) + relativeCursor) * ma_get_bytes_per_frame(pDataStream->decoder.outputFormat, pDataStream->decoder.outputChannels));\n}\n\nstatic void ma_resource_manager_data_stream_fill_page(ma_resource_manager_data_stream* pDataStream, ma_uint32 pageIndex)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint64 pageSizeInFrames;\n    ma_uint64 totalFramesReadForThisPage = 0;\n    void* pPageData = ma_resource_manager_data_stream_get_page_data_pointer(pDataStream, pageIndex, 0);\n\n    pageSizeInFrames = ma_resource_manager_data_stream_get_page_size_in_frames(pDataStream);\n\n    /* The decoder needs to inherit the stream's looping and range state. */\n    {\n        ma_uint64 rangeBeg;\n        ma_uint64 rangeEnd;\n        ma_uint64 loopPointBeg;\n        ma_uint64 loopPointEnd;\n\n        ma_data_source_set_looping(&pDataStream->decoder, ma_resource_manager_data_stream_is_looping(pDataStream));\n\n        ma_data_source_get_range_in_pcm_frames(pDataStream, &rangeBeg, &rangeEnd);\n        ma_data_source_set_range_in_pcm_frames(&pDataStream->decoder, rangeBeg, rangeEnd);\n\n        ma_data_source_get_loop_point_in_pcm_frames(pDataStream, &loopPointBeg, &loopPointEnd);\n        ma_data_source_set_loop_point_in_pcm_frames(&pDataStream->decoder, loopPointBeg, loopPointEnd);\n    }\n\n    /* Just read straight from the decoder. It will deal with ranges and looping for us. */\n    result = ma_data_source_read_pcm_frames(&pDataStream->decoder, pPageData, pageSizeInFrames, &totalFramesReadForThisPage);\n    if (result == MA_AT_END || totalFramesReadForThisPage < pageSizeInFrames) {\n        ma_atomic_exchange_32(&pDataStream->isDecoderAtEnd, MA_TRUE);\n    }\n\n    ma_atomic_exchange_32(&pDataStream->pageFrameCount[pageIndex], (ma_uint32)totalFramesReadForThisPage);\n    ma_atomic_exchange_32(&pDataStream->isPageValid[pageIndex], MA_TRUE);\n}\n\nstatic void ma_resource_manager_data_stream_fill_pages(ma_resource_manager_data_stream* pDataStream)\n{\n    ma_uint32 iPage;\n\n    MA_ASSERT(pDataStream != NULL);\n\n    for (iPage = 0; iPage < 2; iPage += 1) {\n        ma_resource_manager_data_stream_fill_page(pDataStream, iPage);\n    }\n}\n\n\nstatic ma_result ma_resource_manager_data_stream_map(ma_resource_manager_data_stream* pDataStream, void** ppFramesOut, ma_uint64* pFrameCount)\n{\n    ma_uint64 framesAvailable;\n    ma_uint64 frameCount = 0;\n\n    /* We cannot be using the data source after it's been uninitialized. */\n    MA_ASSERT(ma_resource_manager_data_stream_result(pDataStream) != MA_UNAVAILABLE);\n\n    if (pFrameCount != NULL) {\n        frameCount = *pFrameCount;\n        *pFrameCount = 0;\n    }\n    if (ppFramesOut != NULL) {\n        *ppFramesOut = NULL;\n    }\n\n    if (pDataStream == NULL || ppFramesOut == NULL || pFrameCount == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (ma_resource_manager_data_stream_result(pDataStream) != MA_SUCCESS) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* Don't attempt to read while we're in the middle of seeking. Tell the caller that we're busy. */\n    if (ma_resource_manager_data_stream_seek_counter(pDataStream) > 0) {\n        return MA_BUSY;\n    }\n\n    /* If the page we're on is invalid it means we've caught up to the job thread. */\n    if (ma_atomic_load_32(&pDataStream->isPageValid[pDataStream->currentPageIndex]) == MA_FALSE) {\n        framesAvailable = 0;\n    } else {\n        /*\n        The page we're on is valid so we must have some frames available. We need to make sure that we don't overflow into the next page, even if it's valid. The reason is\n        that the unmap process will only post an update for one page at a time. Keeping mapping tied to page boundaries makes this simpler.\n        */\n        ma_uint32 currentPageFrameCount = ma_atomic_load_32(&pDataStream->pageFrameCount[pDataStream->currentPageIndex]);\n        MA_ASSERT(currentPageFrameCount >= pDataStream->relativeCursor);\n\n        framesAvailable = currentPageFrameCount - pDataStream->relativeCursor;\n    }\n\n    /* If there's no frames available and the result is set to MA_AT_END we need to return MA_AT_END. */\n    if (framesAvailable == 0) {\n        if (ma_resource_manager_data_stream_is_decoder_at_end(pDataStream)) {\n            return MA_AT_END;\n        } else {\n            return MA_BUSY; /* There are no frames available, but we're not marked as EOF so we might have caught up to the job thread. Need to return MA_BUSY and wait for more data. */\n        }\n    }\n\n    MA_ASSERT(framesAvailable > 0);\n\n    if (frameCount > framesAvailable) {\n        frameCount = framesAvailable;\n    }\n\n    *ppFramesOut = ma_resource_manager_data_stream_get_page_data_pointer(pDataStream, pDataStream->currentPageIndex, pDataStream->relativeCursor);\n    *pFrameCount = frameCount;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_resource_manager_data_stream_unmap(ma_resource_manager_data_stream* pDataStream, ma_uint64 frameCount)\n{\n    ma_uint32 newRelativeCursor;\n    ma_uint32 pageSizeInFrames;\n    ma_job job;\n\n    /* We cannot be using the data source after it's been uninitialized. */\n    MA_ASSERT(ma_resource_manager_data_stream_result(pDataStream) != MA_UNAVAILABLE);\n\n    if (pDataStream == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (ma_resource_manager_data_stream_result(pDataStream) != MA_SUCCESS) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* The frame count should always fit inside a 32-bit integer. */\n    if (frameCount > 0xFFFFFFFF) {\n        return MA_INVALID_ARGS;\n    }\n\n    pageSizeInFrames = ma_resource_manager_data_stream_get_page_size_in_frames(pDataStream);\n\n    /* The absolute cursor needs to be updated for ma_resource_manager_data_stream_get_cursor_in_pcm_frames(). */\n    ma_resource_manager_data_stream_set_absolute_cursor(pDataStream, ma_atomic_load_64(&pDataStream->absoluteCursor) + frameCount);\n\n    /* Here is where we need to check if we need to load a new page, and if so, post a job to load it. */\n    newRelativeCursor = pDataStream->relativeCursor + (ma_uint32)frameCount;\n\n    /* If the new cursor has flowed over to the next page we need to mark the old one as invalid and post an event for it. */\n    if (newRelativeCursor >= pageSizeInFrames) {\n        newRelativeCursor -= pageSizeInFrames;\n\n        /* Here is where we post the job start decoding. */\n        job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_STREAM);\n        job.order = ma_resource_manager_data_stream_next_execution_order(pDataStream);\n        job.data.resourceManager.pageDataStream.pDataStream = pDataStream;\n        job.data.resourceManager.pageDataStream.pageIndex   = pDataStream->currentPageIndex;\n\n        /* The page needs to be marked as invalid so that the public API doesn't try reading from it. */\n        ma_atomic_exchange_32(&pDataStream->isPageValid[pDataStream->currentPageIndex], MA_FALSE);\n\n        /* Before posting the job we need to make sure we set some state. */\n        pDataStream->relativeCursor   = newRelativeCursor;\n        pDataStream->currentPageIndex = (pDataStream->currentPageIndex + 1) & 0x01;\n        return ma_resource_manager_post_job(pDataStream->pResourceManager, &job);\n    } else {\n        /* We haven't moved into a new page so we can just move the cursor forward. */\n        pDataStream->relativeCursor = newRelativeCursor;\n        return MA_SUCCESS;\n    }\n}\n\n\nMA_API ma_result ma_resource_manager_data_stream_read_pcm_frames(ma_resource_manager_data_stream* pDataStream, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint64 totalFramesProcessed;\n    ma_format format;\n    ma_uint32 channels;\n\n    /* Safety. */\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    if (frameCount == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* We cannot be using the data source after it's been uninitialized. */\n    MA_ASSERT(ma_resource_manager_data_stream_result(pDataStream) != MA_UNAVAILABLE);\n\n    if (pDataStream == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (ma_resource_manager_data_stream_result(pDataStream) != MA_SUCCESS) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* Don't attempt to read while we're in the middle of seeking. Tell the caller that we're busy. */\n    if (ma_resource_manager_data_stream_seek_counter(pDataStream) > 0) {\n        return MA_BUSY;\n    }\n\n    ma_resource_manager_data_stream_get_data_format(pDataStream, &format, &channels, NULL, NULL, 0);\n\n    /* Reading is implemented in terms of map/unmap. We need to run this in a loop because mapping is clamped against page boundaries. */\n    totalFramesProcessed = 0;\n    while (totalFramesProcessed < frameCount) {\n        void* pMappedFrames;\n        ma_uint64 mappedFrameCount;\n\n        mappedFrameCount = frameCount - totalFramesProcessed;\n        result = ma_resource_manager_data_stream_map(pDataStream, &pMappedFrames, &mappedFrameCount);\n        if (result != MA_SUCCESS) {\n            break;\n        }\n\n        /* Copy the mapped data to the output buffer if we have one. It's allowed for pFramesOut to be NULL in which case a relative forward seek is performed. */\n        if (pFramesOut != NULL) {\n            ma_copy_pcm_frames(ma_offset_pcm_frames_ptr(pFramesOut, totalFramesProcessed, format, channels), pMappedFrames, mappedFrameCount, format, channels);\n        }\n\n        totalFramesProcessed += mappedFrameCount;\n\n        result = ma_resource_manager_data_stream_unmap(pDataStream, mappedFrameCount);\n        if (result != MA_SUCCESS) {\n            break;  /* This is really bad - will only get an error here if we failed to post a job to the queue for loading the next page. */\n        }\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = totalFramesProcessed;\n    }\n\n    if (result == MA_SUCCESS && totalFramesProcessed == 0) {\n        result  = MA_AT_END;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_resource_manager_data_stream_seek_to_pcm_frame(ma_resource_manager_data_stream* pDataStream, ma_uint64 frameIndex)\n{\n    ma_job job;\n    ma_result streamResult;\n\n    streamResult = ma_resource_manager_data_stream_result(pDataStream);\n\n    /* We cannot be using the data source after it's been uninitialized. */\n    MA_ASSERT(streamResult != MA_UNAVAILABLE);\n\n    if (pDataStream == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (streamResult != MA_SUCCESS && streamResult != MA_BUSY) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* If we're not already seeking and we're sitting on the same frame, just make this a no-op. */\n    if (ma_atomic_load_32(&pDataStream->seekCounter) == 0) {\n        if (ma_atomic_load_64(&pDataStream->absoluteCursor) == frameIndex) {\n            return MA_SUCCESS;\n        }\n    }\n\n\n    /* Increment the seek counter first to indicate to read_paged_pcm_frames() and map_paged_pcm_frames() that we are in the middle of a seek and MA_BUSY should be returned. */\n    ma_atomic_fetch_add_32(&pDataStream->seekCounter, 1);\n\n    /* Update the absolute cursor so that ma_resource_manager_data_stream_get_cursor_in_pcm_frames() returns the new position. */\n    ma_resource_manager_data_stream_set_absolute_cursor(pDataStream, frameIndex);\n\n    /*\n    We need to clear our currently loaded pages so that the stream starts playback from the new seek point as soon as possible. These are for the purpose of the public\n    API and will be ignored by the seek job. The seek job will operate on the assumption that both pages have been marked as invalid and the cursor is at the start of\n    the first page.\n    */\n    pDataStream->relativeCursor   = 0;\n    pDataStream->currentPageIndex = 0;\n    ma_atomic_exchange_32(&pDataStream->isPageValid[0], MA_FALSE);\n    ma_atomic_exchange_32(&pDataStream->isPageValid[1], MA_FALSE);\n\n    /* Make sure the data stream is not marked as at the end or else if we seek in response to hitting the end, we won't be able to read any more data. */\n    ma_atomic_exchange_32(&pDataStream->isDecoderAtEnd, MA_FALSE);\n\n    /*\n    The public API is not allowed to touch the internal decoder so we need to use a job to perform the seek. When seeking, the job thread will assume both pages\n    are invalid and any content contained within them will be discarded and replaced with newly decoded data.\n    */\n    job = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_SEEK_DATA_STREAM);\n    job.order = ma_resource_manager_data_stream_next_execution_order(pDataStream);\n    job.data.resourceManager.seekDataStream.pDataStream = pDataStream;\n    job.data.resourceManager.seekDataStream.frameIndex  = frameIndex;\n    return ma_resource_manager_post_job(pDataStream->pResourceManager, &job);\n}\n\nMA_API ma_result ma_resource_manager_data_stream_get_data_format(ma_resource_manager_data_stream* pDataStream, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    /* We cannot be using the data source after it's been uninitialized. */\n    MA_ASSERT(ma_resource_manager_data_stream_result(pDataStream) != MA_UNAVAILABLE);\n\n    if (pFormat != NULL) {\n        *pFormat = ma_format_unknown;\n    }\n\n    if (pChannels != NULL) {\n        *pChannels = 0;\n    }\n\n    if (pSampleRate != NULL) {\n        *pSampleRate = 0;\n    }\n\n    if (pChannelMap != NULL) {\n        MA_ZERO_MEMORY(pChannelMap, sizeof(*pChannelMap) * channelMapCap);\n    }\n\n    if (pDataStream == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (ma_resource_manager_data_stream_result(pDataStream) != MA_SUCCESS) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /*\n    We're being a little bit naughty here and accessing the internal decoder from the public API. The output data format is constant, and we've defined this function\n    such that the application is responsible for ensuring it's not called while uninitializing so it should be safe.\n    */\n    return ma_data_source_get_data_format(&pDataStream->decoder, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap);\n}\n\nMA_API ma_result ma_resource_manager_data_stream_get_cursor_in_pcm_frames(ma_resource_manager_data_stream* pDataStream, ma_uint64* pCursor)\n{\n    ma_result result;\n\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pCursor = 0;\n\n    /* We cannot be using the data source after it's been uninitialized. */\n    MA_ASSERT(ma_resource_manager_data_stream_result(pDataStream) != MA_UNAVAILABLE);\n\n    if (pDataStream == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /*\n    If the stream is in an erroneous state we need to return an invalid operation. We can allow\n    this to be called when the data stream is in a busy state because the caller may have asked\n    for an initial seek position and it's convenient to return that as the cursor position.\n    */\n    result = ma_resource_manager_data_stream_result(pDataStream);\n    if (result != MA_SUCCESS && result != MA_BUSY) {\n        return MA_INVALID_OPERATION;\n    }\n\n    *pCursor = ma_atomic_load_64(&pDataStream->absoluteCursor);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_resource_manager_data_stream_get_length_in_pcm_frames(ma_resource_manager_data_stream* pDataStream, ma_uint64* pLength)\n{\n    ma_result streamResult;\n\n    if (pLength == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pLength = 0;\n\n    streamResult = ma_resource_manager_data_stream_result(pDataStream);\n\n    /* We cannot be using the data source after it's been uninitialized. */\n    MA_ASSERT(streamResult != MA_UNAVAILABLE);\n\n    if (pDataStream == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (streamResult != MA_SUCCESS) {\n        return streamResult;\n    }\n\n    /*\n    We most definitely do not want to be calling ma_decoder_get_length_in_pcm_frames() directly. Instead we want to use a cached value that we\n    calculated when we initialized it on the job thread.\n    */\n    *pLength = pDataStream->totalLengthInPCMFrames;\n    if (*pLength == 0) {\n        return MA_NOT_IMPLEMENTED;  /* Some decoders may not have a known length. */\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_resource_manager_data_stream_result(const ma_resource_manager_data_stream* pDataStream)\n{\n    if (pDataStream == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return (ma_result)ma_atomic_load_i32(&pDataStream->result);\n}\n\nMA_API ma_result ma_resource_manager_data_stream_set_looping(ma_resource_manager_data_stream* pDataStream, ma_bool32 isLooping)\n{\n    return ma_data_source_set_looping(pDataStream, isLooping);\n}\n\nMA_API ma_bool32 ma_resource_manager_data_stream_is_looping(const ma_resource_manager_data_stream* pDataStream)\n{\n    if (pDataStream == NULL) {\n        return MA_FALSE;\n    }\n\n    return ma_atomic_load_32((ma_bool32*)&pDataStream->isLooping);   /* Naughty const-cast. Value won't change from here in practice (maybe from another thread). */\n}\n\nMA_API ma_result ma_resource_manager_data_stream_get_available_frames(ma_resource_manager_data_stream* pDataStream, ma_uint64* pAvailableFrames)\n{\n    ma_uint32 pageIndex0;\n    ma_uint32 pageIndex1;\n    ma_uint32 relativeCursor;\n    ma_uint64 availableFrames;\n\n    if (pAvailableFrames == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pAvailableFrames = 0;\n\n    if (pDataStream == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pageIndex0     =  pDataStream->currentPageIndex;\n    pageIndex1     = (pDataStream->currentPageIndex + 1) & 0x01;\n    relativeCursor =  pDataStream->relativeCursor;\n\n    availableFrames = 0;\n    if (ma_atomic_load_32(&pDataStream->isPageValid[pageIndex0])) {\n        availableFrames += ma_atomic_load_32(&pDataStream->pageFrameCount[pageIndex0]) - relativeCursor;\n        if (ma_atomic_load_32(&pDataStream->isPageValid[pageIndex1])) {\n            availableFrames += ma_atomic_load_32(&pDataStream->pageFrameCount[pageIndex1]);\n        }\n    }\n\n    *pAvailableFrames = availableFrames;\n    return MA_SUCCESS;\n}\n\n\nstatic ma_result ma_resource_manager_data_source_preinit(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_source* pDataSource)\n{\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pDataSource);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pResourceManager == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pDataSource->flags = pConfig->flags;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_resource_manager_data_source_init_ex(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source_config* pConfig, ma_resource_manager_data_source* pDataSource)\n{\n    ma_result result;\n\n    result = ma_resource_manager_data_source_preinit(pResourceManager, pConfig, pDataSource);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* The data source itself is just a data stream or a data buffer. */\n    if ((pConfig->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return ma_resource_manager_data_stream_init_ex(pResourceManager, pConfig, &pDataSource->backend.stream);\n    } else {\n        return ma_resource_manager_data_buffer_init_ex(pResourceManager, pConfig, &pDataSource->backend.buffer);\n    }\n}\n\nMA_API ma_result ma_resource_manager_data_source_init(ma_resource_manager* pResourceManager, const char* pName, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_source* pDataSource)\n{\n    ma_resource_manager_data_source_config config;\n\n    config = ma_resource_manager_data_source_config_init();\n    config.pFilePath      = pName;\n    config.flags          = flags;\n    config.pNotifications = pNotifications;\n\n    return ma_resource_manager_data_source_init_ex(pResourceManager, &config, pDataSource);\n}\n\nMA_API ma_result ma_resource_manager_data_source_init_w(ma_resource_manager* pResourceManager, const wchar_t* pName, ma_uint32 flags, const ma_resource_manager_pipeline_notifications* pNotifications, ma_resource_manager_data_source* pDataSource)\n{\n    ma_resource_manager_data_source_config config;\n\n    config = ma_resource_manager_data_source_config_init();\n    config.pFilePathW     = pName;\n    config.flags          = flags;\n    config.pNotifications = pNotifications;\n\n    return ma_resource_manager_data_source_init_ex(pResourceManager, &config, pDataSource);\n}\n\nMA_API ma_result ma_resource_manager_data_source_init_copy(ma_resource_manager* pResourceManager, const ma_resource_manager_data_source* pExistingDataSource, ma_resource_manager_data_source* pDataSource)\n{\n    ma_result result;\n    ma_resource_manager_data_source_config config;\n\n    if (pExistingDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    config = ma_resource_manager_data_source_config_init();\n    config.flags = pExistingDataSource->flags;\n\n    result = ma_resource_manager_data_source_preinit(pResourceManager, &config, pDataSource);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* Copying can only be done from data buffers. Streams cannot be copied. */\n    if ((pExistingDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return MA_INVALID_OPERATION;\n    }\n\n    return ma_resource_manager_data_buffer_init_copy(pResourceManager, &pExistingDataSource->backend.buffer, &pDataSource->backend.buffer);\n}\n\nMA_API ma_result ma_resource_manager_data_source_uninit(ma_resource_manager_data_source* pDataSource)\n{\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* All we need to is uninitialize the underlying data buffer or data stream. */\n    if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return ma_resource_manager_data_stream_uninit(&pDataSource->backend.stream);\n    } else {\n        return ma_resource_manager_data_buffer_uninit(&pDataSource->backend.buffer);\n    }\n}\n\nMA_API ma_result ma_resource_manager_data_source_read_pcm_frames(ma_resource_manager_data_source* pDataSource, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    /* Safety. */\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return ma_resource_manager_data_stream_read_pcm_frames(&pDataSource->backend.stream, pFramesOut, frameCount, pFramesRead);\n    } else {\n        return ma_resource_manager_data_buffer_read_pcm_frames(&pDataSource->backend.buffer, pFramesOut, frameCount, pFramesRead);\n    }\n}\n\nMA_API ma_result ma_resource_manager_data_source_seek_to_pcm_frame(ma_resource_manager_data_source* pDataSource, ma_uint64 frameIndex)\n{\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return ma_resource_manager_data_stream_seek_to_pcm_frame(&pDataSource->backend.stream, frameIndex);\n    } else {\n        return ma_resource_manager_data_buffer_seek_to_pcm_frame(&pDataSource->backend.buffer, frameIndex);\n    }\n}\n\nMA_API ma_result ma_resource_manager_data_source_map(ma_resource_manager_data_source* pDataSource, void** ppFramesOut, ma_uint64* pFrameCount)\n{\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return ma_resource_manager_data_stream_map(&pDataSource->backend.stream, ppFramesOut, pFrameCount);\n    } else {\n        return MA_NOT_IMPLEMENTED;  /* Mapping not supported with data buffers. */\n    }\n}\n\nMA_API ma_result ma_resource_manager_data_source_unmap(ma_resource_manager_data_source* pDataSource, ma_uint64 frameCount)\n{\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return ma_resource_manager_data_stream_unmap(&pDataSource->backend.stream, frameCount);\n    } else {\n        return MA_NOT_IMPLEMENTED;  /* Mapping not supported with data buffers. */\n    }\n}\n\nMA_API ma_result ma_resource_manager_data_source_get_data_format(ma_resource_manager_data_source* pDataSource, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return ma_resource_manager_data_stream_get_data_format(&pDataSource->backend.stream, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap);\n    } else {\n        return ma_resource_manager_data_buffer_get_data_format(&pDataSource->backend.buffer, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap);\n    }\n}\n\nMA_API ma_result ma_resource_manager_data_source_get_cursor_in_pcm_frames(ma_resource_manager_data_source* pDataSource, ma_uint64* pCursor)\n{\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return ma_resource_manager_data_stream_get_cursor_in_pcm_frames(&pDataSource->backend.stream, pCursor);\n    } else {\n        return ma_resource_manager_data_buffer_get_cursor_in_pcm_frames(&pDataSource->backend.buffer, pCursor);\n    }\n}\n\nMA_API ma_result ma_resource_manager_data_source_get_length_in_pcm_frames(ma_resource_manager_data_source* pDataSource, ma_uint64* pLength)\n{\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return ma_resource_manager_data_stream_get_length_in_pcm_frames(&pDataSource->backend.stream, pLength);\n    } else {\n        return ma_resource_manager_data_buffer_get_length_in_pcm_frames(&pDataSource->backend.buffer, pLength);\n    }\n}\n\nMA_API ma_result ma_resource_manager_data_source_result(const ma_resource_manager_data_source* pDataSource)\n{\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return ma_resource_manager_data_stream_result(&pDataSource->backend.stream);\n    } else {\n        return ma_resource_manager_data_buffer_result(&pDataSource->backend.buffer);\n    }\n}\n\nMA_API ma_result ma_resource_manager_data_source_set_looping(ma_resource_manager_data_source* pDataSource, ma_bool32 isLooping)\n{\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return ma_resource_manager_data_stream_set_looping(&pDataSource->backend.stream, isLooping);\n    } else {\n        return ma_resource_manager_data_buffer_set_looping(&pDataSource->backend.buffer, isLooping);\n    }\n}\n\nMA_API ma_bool32 ma_resource_manager_data_source_is_looping(const ma_resource_manager_data_source* pDataSource)\n{\n    if (pDataSource == NULL) {\n        return MA_FALSE;\n    }\n\n    if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return ma_resource_manager_data_stream_is_looping(&pDataSource->backend.stream);\n    } else {\n        return ma_resource_manager_data_buffer_is_looping(&pDataSource->backend.buffer);\n    }\n}\n\nMA_API ma_result ma_resource_manager_data_source_get_available_frames(ma_resource_manager_data_source* pDataSource, ma_uint64* pAvailableFrames)\n{\n    if (pAvailableFrames == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pAvailableFrames = 0;\n\n    if (pDataSource == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if ((pDataSource->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_STREAM) != 0) {\n        return ma_resource_manager_data_stream_get_available_frames(&pDataSource->backend.stream, pAvailableFrames);\n    } else {\n        return ma_resource_manager_data_buffer_get_available_frames(&pDataSource->backend.buffer, pAvailableFrames);\n    }\n}\n\n\nMA_API ma_result ma_resource_manager_post_job(ma_resource_manager* pResourceManager, const ma_job* pJob)\n{\n    if (pResourceManager == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_job_queue_post(&pResourceManager->jobQueue, pJob);\n}\n\nMA_API ma_result ma_resource_manager_post_job_quit(ma_resource_manager* pResourceManager)\n{\n    ma_job job = ma_job_init(MA_JOB_TYPE_QUIT);\n    return ma_resource_manager_post_job(pResourceManager, &job);\n}\n\nMA_API ma_result ma_resource_manager_next_job(ma_resource_manager* pResourceManager, ma_job* pJob)\n{\n    if (pResourceManager == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_job_queue_next(&pResourceManager->jobQueue, pJob);\n}\n\n\nstatic ma_result ma_job_process__resource_manager__load_data_buffer_node(ma_job* pJob)\n{\n    ma_result result = MA_SUCCESS;\n    ma_resource_manager* pResourceManager;\n    ma_resource_manager_data_buffer_node* pDataBufferNode;\n\n    MA_ASSERT(pJob != NULL);\n\n    pResourceManager = (ma_resource_manager*)pJob->data.resourceManager.loadDataBufferNode.pResourceManager;\n    MA_ASSERT(pResourceManager != NULL);\n\n    pDataBufferNode = (ma_resource_manager_data_buffer_node*)pJob->data.resourceManager.loadDataBufferNode.pDataBufferNode;\n    MA_ASSERT(pDataBufferNode != NULL);\n    MA_ASSERT(pDataBufferNode->isDataOwnedByResourceManager == MA_TRUE);  /* The data should always be owned by the resource manager. */\n\n    /* The data buffer is not getting deleted, but we may be getting executed out of order. If so, we need to push the job back onto the queue and return. */\n    if (pJob->order != ma_atomic_load_32(&pDataBufferNode->executionPointer)) {\n        return ma_resource_manager_post_job(pResourceManager, pJob);    /* Attempting to execute out of order. Probably interleaved with a MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER job. */\n    }\n\n    /* First thing we need to do is check whether or not the data buffer is getting deleted. If so we just abort. */\n    if (ma_resource_manager_data_buffer_node_result(pDataBufferNode) != MA_BUSY) {\n        result = ma_resource_manager_data_buffer_node_result(pDataBufferNode);    /* The data buffer may be getting deleted before it's even been loaded. */\n        goto done;\n    }\n\n    /*\n    We're ready to start loading. Essentially what we're doing here is initializing the data supply\n    of the node. Once this is complete, data buffers can have their connectors initialized which\n    will allow then to have audio data read from them.\n\n    Note that when the data supply type has been moved away from \"unknown\", that is when other threads\n    will determine that the node is available for data delivery and the data buffer connectors can be\n    initialized. Therefore, it's important that it is set after the data supply has been initialized.\n    */\n    if ((pJob->data.resourceManager.loadDataBufferNode.flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_DECODE) != 0) {\n        /*\n        Decoding. This is the complex case because we're not going to be doing the entire decoding\n        process here. Instead it's going to be split of multiple jobs and loaded in pages. The\n        reason for this is to evenly distribute decoding time across multiple sounds, rather than\n        having one huge sound hog all the available processing resources.\n\n        The first thing we do is initialize a decoder. This is allocated on the heap and is passed\n        around to the paging jobs. When the last paging job has completed it's processing, it'll\n        free the decoder for us.\n\n        This job does not do any actual decoding. It instead just posts a PAGE_DATA_BUFFER_NODE job\n        which is where the actual decoding work will be done. However, once this job is complete,\n        the node will be in a state where data buffer connectors can be initialized.\n        */\n        ma_decoder* pDecoder;   /* <-- Free'd on the last page decode. */\n        ma_job pageDataBufferNodeJob;\n\n        /* Allocate the decoder by initializing a decoded data supply. */\n        result = ma_resource_manager_data_buffer_node_init_supply_decoded(pResourceManager, pDataBufferNode, pJob->data.resourceManager.loadDataBufferNode.pFilePath, pJob->data.resourceManager.loadDataBufferNode.pFilePathW, pJob->data.resourceManager.loadDataBufferNode.flags, &pDecoder);\n\n        /*\n        Don't ever propagate an MA_BUSY result code or else the resource manager will think the\n        node is just busy decoding rather than in an error state. This should never happen, but\n        including this logic for safety just in case.\n        */\n        if (result == MA_BUSY) {\n            result  = MA_ERROR;\n        }\n\n        if (result != MA_SUCCESS) {\n            if (pJob->data.resourceManager.loadDataBufferNode.pFilePath != NULL) {\n                ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, \"Failed to initialize data supply for \\\"%s\\\". %s.\\n\", pJob->data.resourceManager.loadDataBufferNode.pFilePath, ma_result_description(result));\n            } else {\n                #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(_MSC_VER)\n                    ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_WARNING, \"Failed to initialize data supply for \\\"%ls\\\", %s.\\n\", pJob->data.resourceManager.loadDataBufferNode.pFilePathW, ma_result_description(result));\n                #endif\n            }\n\n            goto done;\n        }\n\n        /*\n        At this point the node's data supply is initialized and other threads can start initializing\n        their data buffer connectors. However, no data will actually be available until we start to\n        actually decode it. To do this, we need to post a paging job which is where the decoding\n        work is done.\n\n        Note that if an error occurred at an earlier point, this section will have been skipped.\n        */\n        pageDataBufferNodeJob = ma_job_init(MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE);\n        pageDataBufferNodeJob.order = ma_resource_manager_data_buffer_node_next_execution_order(pDataBufferNode);\n        pageDataBufferNodeJob.data.resourceManager.pageDataBufferNode.pResourceManager  = pResourceManager;\n        pageDataBufferNodeJob.data.resourceManager.pageDataBufferNode.pDataBufferNode   = pDataBufferNode;\n        pageDataBufferNodeJob.data.resourceManager.pageDataBufferNode.pDecoder          = pDecoder;\n        pageDataBufferNodeJob.data.resourceManager.pageDataBufferNode.pDoneNotification = pJob->data.resourceManager.loadDataBufferNode.pDoneNotification;\n        pageDataBufferNodeJob.data.resourceManager.pageDataBufferNode.pDoneFence        = pJob->data.resourceManager.loadDataBufferNode.pDoneFence;\n\n        /* The job has been set up so it can now be posted. */\n        result = ma_resource_manager_post_job(pResourceManager, &pageDataBufferNodeJob);\n\n        /*\n        When we get here, we want to make sure the result code is set to MA_BUSY. The reason for\n        this is that the result will be copied over to the node's internal result variable. In\n        this case, since the decoding is still in-progress, we need to make sure the result code\n        is set to MA_BUSY.\n        */\n        if (result != MA_SUCCESS) {\n            ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_ERROR, \"Failed to post MA_JOB_TYPE_RESOURCE_MANAGER_PAGE_DATA_BUFFER_NODE job. %s\\n\", ma_result_description(result));\n            ma_decoder_uninit(pDecoder);\n            ma_free(pDecoder, &pResourceManager->config.allocationCallbacks);\n        } else {\n            result = MA_BUSY;\n        }\n    } else {\n        /* No decoding. This is the simple case. We need only read the file content into memory and we're done. */\n        result = ma_resource_manager_data_buffer_node_init_supply_encoded(pResourceManager, pDataBufferNode, pJob->data.resourceManager.loadDataBufferNode.pFilePath, pJob->data.resourceManager.loadDataBufferNode.pFilePathW);\n    }\n\n\ndone:\n    /* File paths are no longer needed. */\n    ma_free(pJob->data.resourceManager.loadDataBufferNode.pFilePath,  &pResourceManager->config.allocationCallbacks);\n    ma_free(pJob->data.resourceManager.loadDataBufferNode.pFilePathW, &pResourceManager->config.allocationCallbacks);\n\n    /*\n    We need to set the result to at the very end to ensure no other threads try reading the data before we've fully initialized the object. Other threads\n    are going to be inspecting this variable to determine whether or not they're ready to read data. We can only change the result if it's set to MA_BUSY\n    because otherwise we may be changing away from an error code which would be bad. An example is if the application creates a data buffer, but then\n    immediately deletes it before we've got to this point. In this case, pDataBuffer->result will be MA_UNAVAILABLE, and setting it to MA_SUCCESS or any\n    other error code would cause the buffer to look like it's in a state that it's not.\n    */\n    ma_atomic_compare_and_swap_i32(&pDataBufferNode->result, MA_BUSY, result);\n\n    /* At this point initialization is complete and we can signal the notification if any. */\n    if (pJob->data.resourceManager.loadDataBufferNode.pInitNotification != NULL) {\n        ma_async_notification_signal(pJob->data.resourceManager.loadDataBufferNode.pInitNotification);\n    }\n    if (pJob->data.resourceManager.loadDataBufferNode.pInitFence != NULL) {\n        ma_fence_release(pJob->data.resourceManager.loadDataBufferNode.pInitFence);\n    }\n\n    /* If we have a success result it means we've fully loaded the buffer. This will happen in the non-decoding case. */\n    if (result != MA_BUSY) {\n        if (pJob->data.resourceManager.loadDataBufferNode.pDoneNotification != NULL) {\n            ma_async_notification_signal(pJob->data.resourceManager.loadDataBufferNode.pDoneNotification);\n        }\n        if (pJob->data.resourceManager.loadDataBufferNode.pDoneFence != NULL) {\n            ma_fence_release(pJob->data.resourceManager.loadDataBufferNode.pDoneFence);\n        }\n    }\n\n    /* Increment the node's execution pointer so that the next jobs can be processed. This is how we keep decoding of pages in-order. */\n    ma_atomic_fetch_add_32(&pDataBufferNode->executionPointer, 1);\n\n    /* A busy result should be considered successful from the point of view of the job system. */\n    if (result == MA_BUSY) {\n        result  = MA_SUCCESS;\n    }\n\n    return result;\n}\n\nstatic ma_result ma_job_process__resource_manager__free_data_buffer_node(ma_job* pJob)\n{\n    ma_resource_manager* pResourceManager;\n    ma_resource_manager_data_buffer_node* pDataBufferNode;\n\n    MA_ASSERT(pJob != NULL);\n\n    pResourceManager = (ma_resource_manager*)pJob->data.resourceManager.freeDataBufferNode.pResourceManager;\n    MA_ASSERT(pResourceManager != NULL);\n\n    pDataBufferNode = (ma_resource_manager_data_buffer_node*)pJob->data.resourceManager.freeDataBufferNode.pDataBufferNode;\n    MA_ASSERT(pDataBufferNode != NULL);\n\n    if (pJob->order != ma_atomic_load_32(&pDataBufferNode->executionPointer)) {\n        return ma_resource_manager_post_job(pResourceManager, pJob);    /* Out of order. */\n    }\n\n    ma_resource_manager_data_buffer_node_free(pResourceManager, pDataBufferNode);\n\n    /* The event needs to be signalled last. */\n    if (pJob->data.resourceManager.freeDataBufferNode.pDoneNotification != NULL) {\n        ma_async_notification_signal(pJob->data.resourceManager.freeDataBufferNode.pDoneNotification);\n    }\n\n    if (pJob->data.resourceManager.freeDataBufferNode.pDoneFence != NULL) {\n        ma_fence_release(pJob->data.resourceManager.freeDataBufferNode.pDoneFence);\n    }\n\n    ma_atomic_fetch_add_32(&pDataBufferNode->executionPointer, 1);\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_job_process__resource_manager__page_data_buffer_node(ma_job* pJob)\n{\n    ma_result result = MA_SUCCESS;\n    ma_resource_manager* pResourceManager;\n    ma_resource_manager_data_buffer_node* pDataBufferNode;\n\n    MA_ASSERT(pJob != NULL);\n\n    pResourceManager = (ma_resource_manager*)pJob->data.resourceManager.pageDataBufferNode.pResourceManager;\n    MA_ASSERT(pResourceManager != NULL);\n\n    pDataBufferNode = (ma_resource_manager_data_buffer_node*)pJob->data.resourceManager.pageDataBufferNode.pDataBufferNode;\n    MA_ASSERT(pDataBufferNode != NULL);\n\n    if (pJob->order != ma_atomic_load_32(&pDataBufferNode->executionPointer)) {\n        return ma_resource_manager_post_job(pResourceManager, pJob);    /* Out of order. */\n    }\n\n    /* Don't do any more decoding if the data buffer has started the uninitialization process. */\n    result = ma_resource_manager_data_buffer_node_result(pDataBufferNode);\n    if (result != MA_BUSY) {\n        goto done;\n    }\n\n    /* We're ready to decode the next page. */\n    result = ma_resource_manager_data_buffer_node_decode_next_page(pResourceManager, pDataBufferNode, (ma_decoder*)pJob->data.resourceManager.pageDataBufferNode.pDecoder);\n\n    /*\n    If we have a success code by this point, we want to post another job. We're going to set the\n    result back to MA_BUSY to make it clear that there's still more to load.\n    */\n    if (result == MA_SUCCESS) {\n        ma_job newJob;\n        newJob = *pJob; /* Everything is the same as the input job, except the execution order. */\n        newJob.order = ma_resource_manager_data_buffer_node_next_execution_order(pDataBufferNode);   /* We need a fresh execution order. */\n\n        result = ma_resource_manager_post_job(pResourceManager, &newJob);\n\n        /* Since the sound isn't yet fully decoded we want the status to be set to busy. */\n        if (result == MA_SUCCESS) {\n            result  = MA_BUSY;\n        }\n    }\n\ndone:\n    /* If there's still more to decode the result will be set to MA_BUSY. Otherwise we can free the decoder. */\n    if (result != MA_BUSY) {\n        ma_decoder_uninit((ma_decoder*)pJob->data.resourceManager.pageDataBufferNode.pDecoder);\n        ma_free(pJob->data.resourceManager.pageDataBufferNode.pDecoder, &pResourceManager->config.allocationCallbacks);\n    }\n\n    /* If we reached the end we need to treat it as successful. */\n    if (result == MA_AT_END) {\n        result  = MA_SUCCESS;\n    }\n\n    /* Make sure we set the result of node in case some error occurred. */\n    ma_atomic_compare_and_swap_i32(&pDataBufferNode->result, MA_BUSY, result);\n\n    /* Signal the notification after setting the result in case the notification callback wants to inspect the result code. */\n    if (result != MA_BUSY) {\n        if (pJob->data.resourceManager.pageDataBufferNode.pDoneNotification != NULL) {\n            ma_async_notification_signal(pJob->data.resourceManager.pageDataBufferNode.pDoneNotification);\n        }\n\n        if (pJob->data.resourceManager.pageDataBufferNode.pDoneFence != NULL) {\n            ma_fence_release(pJob->data.resourceManager.pageDataBufferNode.pDoneFence);\n        }\n    }\n\n    ma_atomic_fetch_add_32(&pDataBufferNode->executionPointer, 1);\n    return result;\n}\n\n\nstatic ma_result ma_job_process__resource_manager__load_data_buffer(ma_job* pJob)\n{\n    ma_result result = MA_SUCCESS;\n    ma_resource_manager* pResourceManager;\n    ma_resource_manager_data_buffer* pDataBuffer;\n    ma_resource_manager_data_supply_type dataSupplyType = ma_resource_manager_data_supply_type_unknown;\n    ma_bool32 isConnectorInitialized = MA_FALSE;\n\n    /*\n    All we're doing here is checking if the node has finished loading. If not, we just re-post the job\n    and keep waiting. Otherwise we increment the execution counter and set the buffer's result code.\n    */\n    MA_ASSERT(pJob != NULL);\n\n    pDataBuffer = (ma_resource_manager_data_buffer*)pJob->data.resourceManager.loadDataBuffer.pDataBuffer;\n    MA_ASSERT(pDataBuffer != NULL);\n\n    pResourceManager = pDataBuffer->pResourceManager;\n\n    if (pJob->order != ma_atomic_load_32(&pDataBuffer->executionPointer)) {\n        return ma_resource_manager_post_job(pResourceManager, pJob);    /* Attempting to execute out of order. Probably interleaved with a MA_JOB_TYPE_RESOURCE_MANAGER_FREE_DATA_BUFFER job. */\n    }\n\n    /*\n    First thing we need to do is check whether or not the data buffer is getting deleted. If so we\n    just abort, but making sure we increment the execution pointer.\n    */\n    result = ma_resource_manager_data_buffer_result(pDataBuffer);\n    if (result != MA_BUSY) {\n        goto done;  /* <-- This will ensure the exucution pointer is incremented. */\n    } else {\n        result = MA_SUCCESS;    /* <-- Make sure this is reset. */\n    }\n\n    /* Try initializing the connector if we haven't already. */\n    isConnectorInitialized = ma_resource_manager_data_buffer_has_connector(pDataBuffer);\n    if (isConnectorInitialized == MA_FALSE) {\n        dataSupplyType = ma_resource_manager_data_buffer_node_get_data_supply_type(pDataBuffer->pNode);\n\n        if (dataSupplyType != ma_resource_manager_data_supply_type_unknown) {\n            /* We can now initialize the connector. If this fails, we need to abort. It's very rare for this to fail. */\n            ma_resource_manager_data_source_config dataSourceConfig;    /* For setting initial looping state and range. */\n            dataSourceConfig = ma_resource_manager_data_source_config_init();\n            dataSourceConfig.rangeBegInPCMFrames     = pJob->data.resourceManager.loadDataBuffer.rangeBegInPCMFrames;\n            dataSourceConfig.rangeEndInPCMFrames     = pJob->data.resourceManager.loadDataBuffer.rangeEndInPCMFrames;\n            dataSourceConfig.loopPointBegInPCMFrames = pJob->data.resourceManager.loadDataBuffer.loopPointBegInPCMFrames;\n            dataSourceConfig.loopPointEndInPCMFrames = pJob->data.resourceManager.loadDataBuffer.loopPointEndInPCMFrames;\n            dataSourceConfig.isLooping               = pJob->data.resourceManager.loadDataBuffer.isLooping;\n\n            result = ma_resource_manager_data_buffer_init_connector(pDataBuffer, &dataSourceConfig, pJob->data.resourceManager.loadDataBuffer.pInitNotification, pJob->data.resourceManager.loadDataBuffer.pInitFence);\n            if (result != MA_SUCCESS) {\n                ma_log_postf(ma_resource_manager_get_log(pResourceManager), MA_LOG_LEVEL_ERROR, \"Failed to initialize connector for data buffer. %s.\\n\", ma_result_description(result));\n                goto done;\n            }\n        } else {\n            /* Don't have a known data supply type. Most likely the data buffer node is still loading, but it could be that an error occurred. */\n        }\n    } else {\n        /* The connector is already initialized. Nothing to do here. */\n    }\n\n    /*\n    If the data node is still loading, we need to repost the job and *not* increment the execution\n    pointer (i.e. we need to not fall through to the \"done\" label).\n\n    There is a hole between here and the where the data connector is initialized where the data\n    buffer node may have finished initializing. We need to check for this by checking the result of\n    the data buffer node and whether or not we had an unknown data supply type at the time of\n    trying to initialize the data connector.\n    */\n    result = ma_resource_manager_data_buffer_node_result(pDataBuffer->pNode);\n    if (result == MA_BUSY || (result == MA_SUCCESS && isConnectorInitialized == MA_FALSE && dataSupplyType == ma_resource_manager_data_supply_type_unknown)) {\n        return ma_resource_manager_post_job(pResourceManager, pJob);\n    }\n\ndone:\n    /* Only move away from a busy code so that we don't trash any existing error codes. */\n    ma_atomic_compare_and_swap_i32(&pDataBuffer->result, MA_BUSY, result);\n\n    /* Only signal the other threads after the result has been set just for cleanliness sake. */\n    if (pJob->data.resourceManager.loadDataBuffer.pDoneNotification != NULL) {\n        ma_async_notification_signal(pJob->data.resourceManager.loadDataBuffer.pDoneNotification);\n    }\n    if (pJob->data.resourceManager.loadDataBuffer.pDoneFence != NULL) {\n        ma_fence_release(pJob->data.resourceManager.loadDataBuffer.pDoneFence);\n    }\n\n    /*\n    If at this point the data buffer has not had it's connector initialized, it means the\n    notification event was never signalled which means we need to signal it here.\n    */\n    if (ma_resource_manager_data_buffer_has_connector(pDataBuffer) == MA_FALSE && result != MA_SUCCESS) {\n        if (pJob->data.resourceManager.loadDataBuffer.pInitNotification != NULL) {\n            ma_async_notification_signal(pJob->data.resourceManager.loadDataBuffer.pInitNotification);\n        }\n        if (pJob->data.resourceManager.loadDataBuffer.pInitFence != NULL) {\n            ma_fence_release(pJob->data.resourceManager.loadDataBuffer.pInitFence);\n        }\n    }\n\n    ma_atomic_fetch_add_32(&pDataBuffer->executionPointer, 1);\n    return result;\n}\n\nstatic ma_result ma_job_process__resource_manager__free_data_buffer(ma_job* pJob)\n{\n    ma_resource_manager* pResourceManager;\n    ma_resource_manager_data_buffer* pDataBuffer;\n\n    MA_ASSERT(pJob != NULL);\n\n    pDataBuffer = (ma_resource_manager_data_buffer*)pJob->data.resourceManager.freeDataBuffer.pDataBuffer;\n    MA_ASSERT(pDataBuffer != NULL);\n\n    pResourceManager = pDataBuffer->pResourceManager;\n\n    if (pJob->order != ma_atomic_load_32(&pDataBuffer->executionPointer)) {\n        return ma_resource_manager_post_job(pResourceManager, pJob);    /* Out of order. */\n    }\n\n    ma_resource_manager_data_buffer_uninit_internal(pDataBuffer);\n\n    /* The event needs to be signalled last. */\n    if (pJob->data.resourceManager.freeDataBuffer.pDoneNotification != NULL) {\n        ma_async_notification_signal(pJob->data.resourceManager.freeDataBuffer.pDoneNotification);\n    }\n\n    if (pJob->data.resourceManager.freeDataBuffer.pDoneFence != NULL) {\n        ma_fence_release(pJob->data.resourceManager.freeDataBuffer.pDoneFence);\n    }\n\n    ma_atomic_fetch_add_32(&pDataBuffer->executionPointer, 1);\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_job_process__resource_manager__load_data_stream(ma_job* pJob)\n{\n    ma_result result = MA_SUCCESS;\n    ma_decoder_config decoderConfig;\n    ma_uint32 pageBufferSizeInBytes;\n    ma_resource_manager* pResourceManager;\n    ma_resource_manager_data_stream* pDataStream;\n\n    MA_ASSERT(pJob != NULL);\n\n    pDataStream = (ma_resource_manager_data_stream*)pJob->data.resourceManager.loadDataStream.pDataStream;\n    MA_ASSERT(pDataStream != NULL);\n\n    pResourceManager = pDataStream->pResourceManager;\n\n    if (pJob->order != ma_atomic_load_32(&pDataStream->executionPointer)) {\n        return ma_resource_manager_post_job(pResourceManager, pJob);    /* Out of order. */\n    }\n\n    if (ma_resource_manager_data_stream_result(pDataStream) != MA_BUSY) {\n        result = MA_INVALID_OPERATION;  /* Most likely the data stream is being uninitialized. */\n        goto done;\n    }\n\n    /* We need to initialize the decoder first so we can determine the size of the pages. */\n    decoderConfig = ma_resource_manager__init_decoder_config(pResourceManager);\n\n    if (pJob->data.resourceManager.loadDataStream.pFilePath != NULL) {\n        result = ma_decoder_init_vfs(pResourceManager->config.pVFS, pJob->data.resourceManager.loadDataStream.pFilePath, &decoderConfig, &pDataStream->decoder);\n    } else {\n        result = ma_decoder_init_vfs_w(pResourceManager->config.pVFS, pJob->data.resourceManager.loadDataStream.pFilePathW, &decoderConfig, &pDataStream->decoder);\n    }\n    if (result != MA_SUCCESS) {\n        goto done;\n    }\n\n    /* Retrieve the total length of the file before marking the decoder as loaded. */\n    if ((pDataStream->flags & MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_UNKNOWN_LENGTH) == 0) {\n        result = ma_decoder_get_length_in_pcm_frames(&pDataStream->decoder, &pDataStream->totalLengthInPCMFrames);\n        if (result != MA_SUCCESS) {\n            goto done;  /* Failed to retrieve the length. */\n        }\n    } else {\n        pDataStream->totalLengthInPCMFrames = 0;\n    }\n\n    /*\n    Only mark the decoder as initialized when the length of the decoder has been retrieved because that can possibly require a scan over the whole file\n    and we don't want to have another thread trying to access the decoder while it's scanning.\n    */\n    pDataStream->isDecoderInitialized = MA_TRUE;\n\n    /* We have the decoder so we can now initialize our page buffer. */\n    pageBufferSizeInBytes = ma_resource_manager_data_stream_get_page_size_in_frames(pDataStream) * 2 * ma_get_bytes_per_frame(pDataStream->decoder.outputFormat, pDataStream->decoder.outputChannels);\n\n    pDataStream->pPageData = ma_malloc(pageBufferSizeInBytes, &pResourceManager->config.allocationCallbacks);\n    if (pDataStream->pPageData == NULL) {\n        ma_decoder_uninit(&pDataStream->decoder);\n        result = MA_OUT_OF_MEMORY;\n        goto done;\n    }\n\n    /* Seek to our initial seek point before filling the initial pages. */\n    ma_decoder_seek_to_pcm_frame(&pDataStream->decoder, pJob->data.resourceManager.loadDataStream.initialSeekPoint);\n\n    /* We have our decoder and our page buffer, so now we need to fill our pages. */\n    ma_resource_manager_data_stream_fill_pages(pDataStream);\n\n    /* And now we're done. We want to make sure the result is MA_SUCCESS. */\n    result = MA_SUCCESS;\n\ndone:\n    ma_free(pJob->data.resourceManager.loadDataStream.pFilePath,  &pResourceManager->config.allocationCallbacks);\n    ma_free(pJob->data.resourceManager.loadDataStream.pFilePathW, &pResourceManager->config.allocationCallbacks);\n\n    /* We can only change the status away from MA_BUSY. If it's set to anything else it means an error has occurred somewhere or the uninitialization process has started (most likely). */\n    ma_atomic_compare_and_swap_i32(&pDataStream->result, MA_BUSY, result);\n\n    /* Only signal the other threads after the result has been set just for cleanliness sake. */\n    if (pJob->data.resourceManager.loadDataStream.pInitNotification != NULL) {\n        ma_async_notification_signal(pJob->data.resourceManager.loadDataStream.pInitNotification);\n    }\n    if (pJob->data.resourceManager.loadDataStream.pInitFence != NULL) {\n        ma_fence_release(pJob->data.resourceManager.loadDataStream.pInitFence);\n    }\n\n    ma_atomic_fetch_add_32(&pDataStream->executionPointer, 1);\n    return result;\n}\n\nstatic ma_result ma_job_process__resource_manager__free_data_stream(ma_job* pJob)\n{\n    ma_resource_manager* pResourceManager;\n    ma_resource_manager_data_stream* pDataStream;\n\n    MA_ASSERT(pJob != NULL);\n\n    pDataStream = (ma_resource_manager_data_stream*)pJob->data.resourceManager.freeDataStream.pDataStream;\n    MA_ASSERT(pDataStream != NULL);\n\n    pResourceManager = pDataStream->pResourceManager;\n\n    if (pJob->order != ma_atomic_load_32(&pDataStream->executionPointer)) {\n        return ma_resource_manager_post_job(pResourceManager, pJob);    /* Out of order. */\n    }\n\n    /* If our status is not MA_UNAVAILABLE we have a bug somewhere. */\n    MA_ASSERT(ma_resource_manager_data_stream_result(pDataStream) == MA_UNAVAILABLE);\n\n    if (pDataStream->isDecoderInitialized) {\n        ma_decoder_uninit(&pDataStream->decoder);\n    }\n\n    if (pDataStream->pPageData != NULL) {\n        ma_free(pDataStream->pPageData, &pResourceManager->config.allocationCallbacks);\n        pDataStream->pPageData = NULL;  /* Just in case... */\n    }\n\n    ma_data_source_uninit(&pDataStream->ds);\n\n    /* The event needs to be signalled last. */\n    if (pJob->data.resourceManager.freeDataStream.pDoneNotification != NULL) {\n        ma_async_notification_signal(pJob->data.resourceManager.freeDataStream.pDoneNotification);\n    }\n    if (pJob->data.resourceManager.freeDataStream.pDoneFence != NULL) {\n        ma_fence_release(pJob->data.resourceManager.freeDataStream.pDoneFence);\n    }\n\n    /*ma_atomic_fetch_add_32(&pDataStream->executionPointer, 1);*/\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_job_process__resource_manager__page_data_stream(ma_job* pJob)\n{\n    ma_result result = MA_SUCCESS;\n    ma_resource_manager* pResourceManager;\n    ma_resource_manager_data_stream* pDataStream;\n\n    MA_ASSERT(pJob != NULL);\n\n    pDataStream = (ma_resource_manager_data_stream*)pJob->data.resourceManager.pageDataStream.pDataStream;\n    MA_ASSERT(pDataStream != NULL);\n\n    pResourceManager = pDataStream->pResourceManager;\n\n    if (pJob->order != ma_atomic_load_32(&pDataStream->executionPointer)) {\n        return ma_resource_manager_post_job(pResourceManager, pJob);    /* Out of order. */\n    }\n\n    /* For streams, the status should be MA_SUCCESS. */\n    if (ma_resource_manager_data_stream_result(pDataStream) != MA_SUCCESS) {\n        result = MA_INVALID_OPERATION;\n        goto done;\n    }\n\n    ma_resource_manager_data_stream_fill_page(pDataStream, pJob->data.resourceManager.pageDataStream.pageIndex);\n\ndone:\n    ma_atomic_fetch_add_32(&pDataStream->executionPointer, 1);\n    return result;\n}\n\nstatic ma_result ma_job_process__resource_manager__seek_data_stream(ma_job* pJob)\n{\n    ma_result result = MA_SUCCESS;\n    ma_resource_manager* pResourceManager;\n    ma_resource_manager_data_stream* pDataStream;\n\n    MA_ASSERT(pJob != NULL);\n\n    pDataStream = (ma_resource_manager_data_stream*)pJob->data.resourceManager.seekDataStream.pDataStream;\n    MA_ASSERT(pDataStream != NULL);\n\n    pResourceManager = pDataStream->pResourceManager;\n\n    if (pJob->order != ma_atomic_load_32(&pDataStream->executionPointer)) {\n        return ma_resource_manager_post_job(pResourceManager, pJob);    /* Out of order. */\n    }\n\n    /* For streams the status should be MA_SUCCESS for this to do anything. */\n    if (ma_resource_manager_data_stream_result(pDataStream) != MA_SUCCESS || pDataStream->isDecoderInitialized == MA_FALSE) {\n        result = MA_INVALID_OPERATION;\n        goto done;\n    }\n\n    /*\n    With seeking we just assume both pages are invalid and the relative frame cursor at position 0. This is basically exactly the same as loading, except\n    instead of initializing the decoder, we seek to a frame.\n    */\n    ma_decoder_seek_to_pcm_frame(&pDataStream->decoder, pJob->data.resourceManager.seekDataStream.frameIndex);\n\n    /* After seeking we'll need to reload the pages. */\n    ma_resource_manager_data_stream_fill_pages(pDataStream);\n\n    /* We need to let the public API know that we're done seeking. */\n    ma_atomic_fetch_sub_32(&pDataStream->seekCounter, 1);\n\ndone:\n    ma_atomic_fetch_add_32(&pDataStream->executionPointer, 1);\n    return result;\n}\n\nMA_API ma_result ma_resource_manager_process_job(ma_resource_manager* pResourceManager, ma_job* pJob)\n{\n    if (pResourceManager == NULL || pJob == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_job_process(pJob);\n}\n\nMA_API ma_result ma_resource_manager_process_next_job(ma_resource_manager* pResourceManager)\n{\n    ma_result result;\n    ma_job job;\n\n    if (pResourceManager == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* This will return MA_CANCELLED if the next job is a quit job. */\n    result = ma_resource_manager_next_job(pResourceManager, &job);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return ma_job_process(&job);\n}\n#else\n/* We'll get here if the resource manager is being excluded from the build. We need to define the job processing callbacks as no-ops. */\nstatic ma_result ma_job_process__resource_manager__load_data_buffer_node(ma_job* pJob) { return ma_job_process__noop(pJob); }\nstatic ma_result ma_job_process__resource_manager__free_data_buffer_node(ma_job* pJob) { return ma_job_process__noop(pJob); }\nstatic ma_result ma_job_process__resource_manager__page_data_buffer_node(ma_job* pJob) { return ma_job_process__noop(pJob); }\nstatic ma_result ma_job_process__resource_manager__load_data_buffer(ma_job* pJob)      { return ma_job_process__noop(pJob); }\nstatic ma_result ma_job_process__resource_manager__free_data_buffer(ma_job* pJob)      { return ma_job_process__noop(pJob); }\nstatic ma_result ma_job_process__resource_manager__load_data_stream(ma_job* pJob)      { return ma_job_process__noop(pJob); }\nstatic ma_result ma_job_process__resource_manager__free_data_stream(ma_job* pJob)      { return ma_job_process__noop(pJob); }\nstatic ma_result ma_job_process__resource_manager__page_data_stream(ma_job* pJob)      { return ma_job_process__noop(pJob); }\nstatic ma_result ma_job_process__resource_manager__seek_data_stream(ma_job* pJob)      { return ma_job_process__noop(pJob); }\n#endif  /* MA_NO_RESOURCE_MANAGER */\n\n\n#ifndef MA_NO_NODE_GRAPH\n/* 10ms @ 48K = 480. Must never exceed 65535. */\n#ifndef MA_DEFAULT_NODE_CACHE_CAP_IN_FRAMES_PER_BUS\n#define MA_DEFAULT_NODE_CACHE_CAP_IN_FRAMES_PER_BUS 480\n#endif\n\n\nstatic ma_result ma_node_read_pcm_frames(ma_node* pNode, ma_uint32 outputBusIndex, float* pFramesOut, ma_uint32 frameCount, ma_uint32* pFramesRead, ma_uint64 globalTime);\n\nMA_API void ma_debug_fill_pcm_frames_with_sine_wave(float* pFramesOut, ma_uint32 frameCount, ma_format format, ma_uint32 channels, ma_uint32 sampleRate)\n{\n    #ifndef MA_NO_GENERATION\n    {\n        ma_waveform_config waveformConfig;\n        ma_waveform waveform;\n\n        waveformConfig = ma_waveform_config_init(format, channels, sampleRate, ma_waveform_type_sine, 1.0, 400);\n        ma_waveform_init(&waveformConfig, &waveform);\n        ma_waveform_read_pcm_frames(&waveform, pFramesOut, frameCount, NULL);\n    }\n    #else\n    {\n        (void)pFramesOut;\n        (void)frameCount;\n        (void)format;\n        (void)channels;\n        (void)sampleRate;\n        #if defined(MA_DEBUG_OUTPUT)\n        {\n            #if _MSC_VER\n                #pragma message (\"ma_debug_fill_pcm_frames_with_sine_wave() will do nothing because MA_NO_GENERATION is enabled.\")\n            #endif\n        }\n        #endif\n    }\n    #endif\n}\n\n\n\nMA_API ma_node_graph_config ma_node_graph_config_init(ma_uint32 channels)\n{\n    ma_node_graph_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.channels             = channels;\n    config.nodeCacheCapInFrames = MA_DEFAULT_NODE_CACHE_CAP_IN_FRAMES_PER_BUS;\n\n    return config;\n}\n\n\nstatic void ma_node_graph_set_is_reading(ma_node_graph* pNodeGraph, ma_bool32 isReading)\n{\n    MA_ASSERT(pNodeGraph != NULL);\n    ma_atomic_exchange_32(&pNodeGraph->isReading, isReading);\n}\n\n#if 0\nstatic ma_bool32 ma_node_graph_is_reading(ma_node_graph* pNodeGraph)\n{\n    MA_ASSERT(pNodeGraph != NULL);\n    return ma_atomic_load_32(&pNodeGraph->isReading);\n}\n#endif\n\n\nstatic void ma_node_graph_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_node_graph* pNodeGraph = (ma_node_graph*)pNode;\n    ma_uint64 framesRead;\n\n    ma_node_graph_read_pcm_frames(pNodeGraph, ppFramesOut[0], *pFrameCountOut, &framesRead);\n\n    *pFrameCountOut = (ma_uint32)framesRead;    /* Safe cast. */\n\n    (void)ppFramesIn;\n    (void)pFrameCountIn;\n}\n\nstatic ma_node_vtable g_node_graph_node_vtable =\n{\n    ma_node_graph_node_process_pcm_frames,\n    NULL,   /* onGetRequiredInputFrameCount */\n    0,      /* 0 input buses. */\n    1,      /* 1 output bus. */\n    0       /* Flags. */\n};\n\nstatic void ma_node_graph_endpoint_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    MA_ASSERT(pNode != NULL);\n    MA_ASSERT(ma_node_get_input_bus_count(pNode)  == 1);\n    MA_ASSERT(ma_node_get_output_bus_count(pNode) == 1);\n\n    /* Input channel count needs to be the same as the output channel count. */\n    MA_ASSERT(ma_node_get_input_channels(pNode, 0) == ma_node_get_output_channels(pNode, 0));\n\n    /* We don't need to do anything here because it's a passthrough. */\n    (void)pNode;\n    (void)ppFramesIn;\n    (void)pFrameCountIn;\n    (void)ppFramesOut;\n    (void)pFrameCountOut;\n\n#if 0\n    /* The data has already been mixed. We just need to move it to the output buffer. */\n    if (ppFramesIn != NULL) {\n        ma_copy_pcm_frames(ppFramesOut[0], ppFramesIn[0], *pFrameCountOut, ma_format_f32, ma_node_get_output_channels(pNode, 0));\n    }\n#endif\n}\n\nstatic ma_node_vtable g_node_graph_endpoint_vtable =\n{\n    ma_node_graph_endpoint_process_pcm_frames,\n    NULL,   /* onGetRequiredInputFrameCount */\n    1,      /* 1 input bus. */\n    1,      /* 1 output bus. */\n    MA_NODE_FLAG_PASSTHROUGH    /* Flags. The endpoint is a passthrough. */\n};\n\nMA_API ma_result ma_node_graph_init(const ma_node_graph_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_node_graph* pNodeGraph)\n{\n    ma_result result;\n    ma_node_config baseConfig;\n    ma_node_config endpointConfig;\n\n    if (pNodeGraph == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pNodeGraph);\n    pNodeGraph->nodeCacheCapInFrames = pConfig->nodeCacheCapInFrames;\n    if (pNodeGraph->nodeCacheCapInFrames == 0) {\n        pNodeGraph->nodeCacheCapInFrames = MA_DEFAULT_NODE_CACHE_CAP_IN_FRAMES_PER_BUS;\n    }\n\n\n    /* Base node so we can use the node graph as a node into another graph. */\n    baseConfig = ma_node_config_init();\n    baseConfig.vtable = &g_node_graph_node_vtable;\n    baseConfig.pOutputChannels = &pConfig->channels;\n\n    result = ma_node_init(pNodeGraph, &baseConfig, pAllocationCallbacks, &pNodeGraph->base);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n\n    /* Endpoint. */\n    endpointConfig = ma_node_config_init();\n    endpointConfig.vtable          = &g_node_graph_endpoint_vtable;\n    endpointConfig.pInputChannels  = &pConfig->channels;\n    endpointConfig.pOutputChannels = &pConfig->channels;\n\n    result = ma_node_init(pNodeGraph, &endpointConfig, pAllocationCallbacks, &pNodeGraph->endpoint);\n    if (result != MA_SUCCESS) {\n        ma_node_uninit(&pNodeGraph->base, pAllocationCallbacks);\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_node_graph_uninit(ma_node_graph* pNodeGraph, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pNodeGraph == NULL) {\n        return;\n    }\n\n    ma_node_uninit(&pNodeGraph->endpoint, pAllocationCallbacks);\n}\n\nMA_API ma_node* ma_node_graph_get_endpoint(ma_node_graph* pNodeGraph)\n{\n    if (pNodeGraph == NULL) {\n        return NULL;\n    }\n\n    return &pNodeGraph->endpoint;\n}\n\nMA_API ma_result ma_node_graph_read_pcm_frames(ma_node_graph* pNodeGraph, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint64 totalFramesRead;\n    ma_uint32 channels;\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;   /* Safety. */\n    }\n\n    if (pNodeGraph == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    channels = ma_node_get_output_channels(&pNodeGraph->endpoint, 0);\n\n\n    /* We'll be nice and try to do a full read of all frameCount frames. */\n    totalFramesRead = 0;\n    while (totalFramesRead < frameCount) {\n        ma_uint32 framesJustRead;\n        ma_uint64 framesToRead = frameCount - totalFramesRead;\n\n        if (framesToRead > 0xFFFFFFFF) {\n            framesToRead = 0xFFFFFFFF;\n        }\n\n        ma_node_graph_set_is_reading(pNodeGraph, MA_TRUE);\n        {\n            result = ma_node_read_pcm_frames(&pNodeGraph->endpoint, 0, (float*)ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, ma_format_f32, channels), (ma_uint32)framesToRead, &framesJustRead, ma_node_get_time(&pNodeGraph->endpoint));\n        }\n        ma_node_graph_set_is_reading(pNodeGraph, MA_FALSE);\n\n        totalFramesRead += framesJustRead;\n\n        if (result != MA_SUCCESS) {\n            break;\n        }\n\n        /* Abort if we weren't able to read any frames or else we risk getting stuck in a loop. */\n        if (framesJustRead == 0) {\n            break;\n        }\n    }\n\n    /* Let's go ahead and silence any leftover frames just for some added safety to ensure the caller doesn't try emitting garbage out of the speakers. */\n    if (totalFramesRead < frameCount) {\n        ma_silence_pcm_frames(ma_offset_pcm_frames_ptr(pFramesOut, totalFramesRead, ma_format_f32, channels), (frameCount - totalFramesRead), ma_format_f32, channels);\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = totalFramesRead;\n    }\n\n    return result;\n}\n\nMA_API ma_uint32 ma_node_graph_get_channels(const ma_node_graph* pNodeGraph)\n{\n    if (pNodeGraph == NULL) {\n        return 0;\n    }\n\n    return ma_node_get_output_channels(&pNodeGraph->endpoint, 0);\n}\n\nMA_API ma_uint64 ma_node_graph_get_time(const ma_node_graph* pNodeGraph)\n{\n    if (pNodeGraph == NULL) {\n        return 0;\n    }\n\n    return ma_node_get_time(&pNodeGraph->endpoint); /* Global time is just the local time of the endpoint. */\n}\n\nMA_API ma_result ma_node_graph_set_time(ma_node_graph* pNodeGraph, ma_uint64 globalTime)\n{\n    if (pNodeGraph == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_node_set_time(&pNodeGraph->endpoint, globalTime); /* Global time is just the local time of the endpoint. */\n}\n\n\n#define MA_NODE_OUTPUT_BUS_FLAG_HAS_READ    0x01    /* Whether or not this bus ready to read more data. Only used on nodes with multiple output buses. */\n\nstatic ma_result ma_node_output_bus_init(ma_node* pNode, ma_uint32 outputBusIndex, ma_uint32 channels, ma_node_output_bus* pOutputBus)\n{\n    MA_ASSERT(pOutputBus != NULL);\n    MA_ASSERT(outputBusIndex < MA_MAX_NODE_BUS_COUNT);\n    MA_ASSERT(outputBusIndex < ma_node_get_output_bus_count(pNode));\n    MA_ASSERT(channels < 256);\n\n    MA_ZERO_OBJECT(pOutputBus);\n\n    if (channels == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pOutputBus->pNode          = pNode;\n    pOutputBus->outputBusIndex = (ma_uint8)outputBusIndex;\n    pOutputBus->channels       = (ma_uint8)channels;\n    pOutputBus->flags          = MA_NODE_OUTPUT_BUS_FLAG_HAS_READ; /* <-- Important that this flag is set by default. */\n    pOutputBus->volume         = 1;\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_node_output_bus_lock(ma_node_output_bus* pOutputBus)\n{\n    ma_spinlock_lock(&pOutputBus->lock);\n}\n\nstatic void ma_node_output_bus_unlock(ma_node_output_bus* pOutputBus)\n{\n    ma_spinlock_unlock(&pOutputBus->lock);\n}\n\n\nstatic ma_uint32 ma_node_output_bus_get_channels(const ma_node_output_bus* pOutputBus)\n{\n    return pOutputBus->channels;\n}\n\n\nstatic void ma_node_output_bus_set_has_read(ma_node_output_bus* pOutputBus, ma_bool32 hasRead)\n{\n    if (hasRead) {\n        ma_atomic_fetch_or_32(&pOutputBus->flags, MA_NODE_OUTPUT_BUS_FLAG_HAS_READ);\n    } else {\n        ma_atomic_fetch_and_32(&pOutputBus->flags, (ma_uint32)~MA_NODE_OUTPUT_BUS_FLAG_HAS_READ);\n    }\n}\n\nstatic ma_bool32 ma_node_output_bus_has_read(ma_node_output_bus* pOutputBus)\n{\n    return (ma_atomic_load_32(&pOutputBus->flags) & MA_NODE_OUTPUT_BUS_FLAG_HAS_READ) != 0;\n}\n\n\nstatic void ma_node_output_bus_set_is_attached(ma_node_output_bus* pOutputBus, ma_bool32 isAttached)\n{\n    ma_atomic_exchange_32(&pOutputBus->isAttached, isAttached);\n}\n\nstatic ma_bool32 ma_node_output_bus_is_attached(ma_node_output_bus* pOutputBus)\n{\n    return ma_atomic_load_32(&pOutputBus->isAttached);\n}\n\n\nstatic ma_result ma_node_output_bus_set_volume(ma_node_output_bus* pOutputBus, float volume)\n{\n    MA_ASSERT(pOutputBus != NULL);\n\n    if (volume < 0.0f) {\n        volume = 0.0f;\n    }\n\n    ma_atomic_exchange_f32(&pOutputBus->volume, volume);\n\n    return MA_SUCCESS;\n}\n\nstatic float ma_node_output_bus_get_volume(const ma_node_output_bus* pOutputBus)\n{\n    return ma_atomic_load_f32((float*)&pOutputBus->volume);\n}\n\n\nstatic ma_result ma_node_input_bus_init(ma_uint32 channels, ma_node_input_bus* pInputBus)\n{\n    MA_ASSERT(pInputBus != NULL);\n    MA_ASSERT(channels < 256);\n\n    MA_ZERO_OBJECT(pInputBus);\n\n    if (channels == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pInputBus->channels = (ma_uint8)channels;\n\n    return MA_SUCCESS;\n}\n\nstatic void ma_node_input_bus_lock(ma_node_input_bus* pInputBus)\n{\n    MA_ASSERT(pInputBus != NULL);\n\n    ma_spinlock_lock(&pInputBus->lock);\n}\n\nstatic void ma_node_input_bus_unlock(ma_node_input_bus* pInputBus)\n{\n    MA_ASSERT(pInputBus != NULL);\n\n    ma_spinlock_unlock(&pInputBus->lock);\n}\n\n\nstatic void ma_node_input_bus_next_begin(ma_node_input_bus* pInputBus)\n{\n    ma_atomic_fetch_add_32(&pInputBus->nextCounter, 1);\n}\n\nstatic void ma_node_input_bus_next_end(ma_node_input_bus* pInputBus)\n{\n    ma_atomic_fetch_sub_32(&pInputBus->nextCounter, 1);\n}\n\nstatic ma_uint32 ma_node_input_bus_get_next_counter(ma_node_input_bus* pInputBus)\n{\n    return ma_atomic_load_32(&pInputBus->nextCounter);\n}\n\n\nstatic ma_uint32 ma_node_input_bus_get_channels(const ma_node_input_bus* pInputBus)\n{\n    return pInputBus->channels;\n}\n\n\nstatic void ma_node_input_bus_detach__no_output_bus_lock(ma_node_input_bus* pInputBus, ma_node_output_bus* pOutputBus)\n{\n    MA_ASSERT(pInputBus  != NULL);\n    MA_ASSERT(pOutputBus != NULL);\n\n    /*\n    Mark the output bus as detached first. This will prevent future iterations on the audio thread\n    from iterating this output bus.\n    */\n    ma_node_output_bus_set_is_attached(pOutputBus, MA_FALSE);\n\n    /*\n    We cannot use the output bus lock here since it'll be getting used at a higher level, but we do\n    still need to use the input bus lock since we'll be updating pointers on two different output\n    buses. The same rules apply here as the attaching case. Although we're using a lock here, we're\n    *not* using a lock when iterating over the list in the audio thread. We therefore need to craft\n    this in a way such that the iteration on the audio thread doesn't break.\n\n    The the first thing to do is swap out the \"next\" pointer of the previous output bus with the\n    new \"next\" output bus. This is the operation that matters for iteration on the audio thread.\n    After that, the previous pointer on the new \"next\" pointer needs to be updated, after which\n    point the linked list will be in a good state.\n    */\n    ma_node_input_bus_lock(pInputBus);\n    {\n        ma_node_output_bus* pOldPrev = (ma_node_output_bus*)ma_atomic_load_ptr(&pOutputBus->pPrev);\n        ma_node_output_bus* pOldNext = (ma_node_output_bus*)ma_atomic_load_ptr(&pOutputBus->pNext);\n\n        if (pOldPrev != NULL) {\n            ma_atomic_exchange_ptr(&pOldPrev->pNext, pOldNext); /* <-- This is where the output bus is detached from the list. */\n        }\n        if (pOldNext != NULL) {\n            ma_atomic_exchange_ptr(&pOldNext->pPrev, pOldPrev); /* <-- This is required for detachment. */\n        }\n    }\n    ma_node_input_bus_unlock(pInputBus);\n\n    /* At this point the output bus is detached and the linked list is completely unaware of it. Reset some data for safety. */\n    ma_atomic_exchange_ptr(&pOutputBus->pNext, NULL);   /* Using atomic exchanges here, mainly for the benefit of analysis tools which don't always recognize spinlocks. */\n    ma_atomic_exchange_ptr(&pOutputBus->pPrev, NULL);   /* As above. */\n    pOutputBus->pInputNode             = NULL;\n    pOutputBus->inputNodeInputBusIndex = 0;\n\n\n    /*\n    For thread-safety reasons, we don't want to be returning from this straight away. We need to\n    wait for the audio thread to finish with the output bus. There's two things we need to wait\n    for. The first is the part that selects the next output bus in the list, and the other is the\n    part that reads from the output bus. Basically all we're doing is waiting for the input bus\n    to stop referencing the output bus.\n\n    We're doing this part last because we want the section above to run while the audio thread\n    is finishing up with the output bus, just for efficiency reasons. We marked the output bus as\n    detached right at the top of this function which is going to prevent the audio thread from\n    iterating the output bus again.\n    */\n\n    /* Part 1: Wait for the current iteration to complete. */\n    while (ma_node_input_bus_get_next_counter(pInputBus) > 0) {\n        ma_yield();\n    }\n\n    /* Part 2: Wait for any reads to complete. */\n    while (ma_atomic_load_32(&pOutputBus->refCount) > 0) {\n        ma_yield();\n    }\n\n    /*\n    At this point we're done detaching and we can be guaranteed that the audio thread is not going\n    to attempt to reference this output bus again (until attached again).\n    */\n}\n\n#if 0   /* Not used at the moment, but leaving here in case I need it later. */\nstatic void ma_node_input_bus_detach(ma_node_input_bus* pInputBus, ma_node_output_bus* pOutputBus)\n{\n    MA_ASSERT(pInputBus  != NULL);\n    MA_ASSERT(pOutputBus != NULL);\n\n    ma_node_output_bus_lock(pOutputBus);\n    {\n        ma_node_input_bus_detach__no_output_bus_lock(pInputBus, pOutputBus);\n    }\n    ma_node_output_bus_unlock(pOutputBus);\n}\n#endif\n\nstatic void ma_node_input_bus_attach(ma_node_input_bus* pInputBus, ma_node_output_bus* pOutputBus, ma_node* pNewInputNode, ma_uint32 inputNodeInputBusIndex)\n{\n    MA_ASSERT(pInputBus  != NULL);\n    MA_ASSERT(pOutputBus != NULL);\n\n    ma_node_output_bus_lock(pOutputBus);\n    {\n        ma_node_output_bus* pOldInputNode = (ma_node_output_bus*)ma_atomic_load_ptr(&pOutputBus->pInputNode);\n\n        /* Detach from any existing attachment first if necessary. */\n        if (pOldInputNode != NULL) {\n            ma_node_input_bus_detach__no_output_bus_lock(pInputBus, pOutputBus);\n        }\n\n        /*\n        At this point we can be sure the output bus is not attached to anything. The linked list in the\n        old input bus has been updated so that pOutputBus will not get iterated again.\n        */\n        pOutputBus->pInputNode             = pNewInputNode;                     /* No need for an atomic assignment here because modification of this variable always happens within a lock. */\n        pOutputBus->inputNodeInputBusIndex = (ma_uint8)inputNodeInputBusIndex;\n\n        /*\n        Now we need to attach the output bus to the linked list. This involves updating two pointers on\n        two different output buses so I'm going to go ahead and keep this simple and just use a lock.\n        There are ways to do this without a lock, but it's just too hard to maintain for it's value.\n\n        Although we're locking here, it's important to remember that we're *not* locking when iterating\n        and reading audio data since that'll be running on the audio thread. As a result we need to be\n        careful how we craft this so that we don't break iteration. What we're going to do is always\n        attach the new item so that it becomes the first item in the list. That way, as we're iterating\n        we won't break any links in the list and iteration will continue safely. The detaching case will\n        also be crafted in a way as to not break list iteration. It's important to remember to use\n        atomic exchanges here since no locking is happening on the audio thread during iteration.\n        */\n        ma_node_input_bus_lock(pInputBus);\n        {\n            ma_node_output_bus* pNewPrev = &pInputBus->head;\n            ma_node_output_bus* pNewNext = (ma_node_output_bus*)ma_atomic_load_ptr(&pInputBus->head.pNext);\n\n            /* Update the local output bus. */\n            ma_atomic_exchange_ptr(&pOutputBus->pPrev, pNewPrev);\n            ma_atomic_exchange_ptr(&pOutputBus->pNext, pNewNext);\n\n            /* Update the other output buses to point back to the local output bus. */\n            ma_atomic_exchange_ptr(&pInputBus->head.pNext, pOutputBus); /* <-- This is where the output bus is actually attached to the input bus. */\n\n            /* Do the previous pointer last. This is only used for detachment. */\n            if (pNewNext != NULL) {\n                ma_atomic_exchange_ptr(&pNewNext->pPrev,  pOutputBus);\n            }\n        }\n        ma_node_input_bus_unlock(pInputBus);\n\n        /*\n        Mark the node as attached last. This is used to controlling whether or the output bus will be\n        iterated on the audio thread. Mainly required for detachment purposes.\n        */\n        ma_node_output_bus_set_is_attached(pOutputBus, MA_TRUE);\n    }\n    ma_node_output_bus_unlock(pOutputBus);\n}\n\nstatic ma_node_output_bus* ma_node_input_bus_next(ma_node_input_bus* pInputBus, ma_node_output_bus* pOutputBus)\n{\n    ma_node_output_bus* pNext;\n\n    MA_ASSERT(pInputBus != NULL);\n\n    if (pOutputBus == NULL) {\n        return NULL;\n    }\n\n    ma_node_input_bus_next_begin(pInputBus);\n    {\n        pNext = pOutputBus;\n        for (;;) {\n            pNext = (ma_node_output_bus*)ma_atomic_load_ptr(&pNext->pNext);\n            if (pNext == NULL) {\n                break;      /* Reached the end. */\n            }\n\n            if (ma_node_output_bus_is_attached(pNext) == MA_FALSE) {\n                continue;   /* The node is not attached. Keep checking. */\n            }\n\n            /* The next node has been selected. */\n            break;\n        }\n\n        /* We need to increment the reference count of the selected node. */\n        if (pNext != NULL) {\n            ma_atomic_fetch_add_32(&pNext->refCount, 1);\n        }\n\n        /* The previous node is no longer being referenced. */\n        ma_atomic_fetch_sub_32(&pOutputBus->refCount, 1);\n    }\n    ma_node_input_bus_next_end(pInputBus);\n\n    return pNext;\n}\n\nstatic ma_node_output_bus* ma_node_input_bus_first(ma_node_input_bus* pInputBus)\n{\n    return ma_node_input_bus_next(pInputBus, &pInputBus->head);\n}\n\n\n\nstatic ma_result ma_node_input_bus_read_pcm_frames(ma_node* pInputNode, ma_node_input_bus* pInputBus, float* pFramesOut, ma_uint32 frameCount, ma_uint32* pFramesRead, ma_uint64 globalTime)\n{\n    ma_result result = MA_SUCCESS;\n    ma_node_output_bus* pOutputBus;\n    ma_node_output_bus* pFirst;\n    ma_uint32 inputChannels;\n    ma_bool32 doesOutputBufferHaveContent = MA_FALSE;\n\n    (void)pInputNode;   /* Not currently used. */\n\n    /*\n    This will be called from the audio thread which means we can't be doing any locking. Basically,\n    this function will not perfom any locking, whereas attaching and detaching will, but crafted in\n    such a way that we don't need to perform any locking here. The important thing to remember is\n    to always iterate in a forward direction.\n\n    In order to process any data we need to first read from all input buses. That's where this\n    function comes in. This iterates over each of the attachments and accumulates/mixes them. We\n    also convert the channels to the nodes output channel count before mixing. We want to do this\n    channel conversion so that the caller of this function can invoke the processing callback\n    without having to do it themselves.\n\n    When we iterate over each of the attachments on the input bus, we need to read as much data as\n    we can from each of them so that we don't end up with holes between each of the attachments. To\n    do this, we need to read from each attachment in a loop and read as many frames as we can, up\n    to `frameCount`.\n    */\n    MA_ASSERT(pInputNode  != NULL);\n    MA_ASSERT(pFramesRead != NULL); /* pFramesRead is critical and must always be specified. On input it's undefined and on output it'll be set to the number of frames actually read. */\n\n    *pFramesRead = 0;   /* Safety. */\n\n    inputChannels = ma_node_input_bus_get_channels(pInputBus);\n\n    /*\n    We need to be careful with how we call ma_node_input_bus_first() and ma_node_input_bus_next(). They\n    are both critical to our lock-free thread-safety system. We can only call ma_node_input_bus_first()\n    once per iteration, however we have an optimization to checks whether or not it's the first item in\n    the list. We therefore need to store a pointer to the first item rather than repeatedly calling\n    ma_node_input_bus_first(). It's safe to keep hold of this pointer, so long as we don't dereference it\n    after calling ma_node_input_bus_next(), which we won't be.\n    */\n    pFirst = ma_node_input_bus_first(pInputBus);\n    if (pFirst == NULL) {\n        return MA_SUCCESS;  /* No attachments. Read nothing. */\n    }\n\n    for (pOutputBus = pFirst; pOutputBus != NULL; pOutputBus = ma_node_input_bus_next(pInputBus, pOutputBus)) {\n        ma_uint32 framesProcessed = 0;\n        ma_bool32 isSilentOutput = MA_FALSE;\n\n        MA_ASSERT(pOutputBus->pNode != NULL);\n        MA_ASSERT(((ma_node_base*)pOutputBus->pNode)->vtable != NULL);\n\n        isSilentOutput = (((ma_node_base*)pOutputBus->pNode)->vtable->flags & MA_NODE_FLAG_SILENT_OUTPUT) != 0;\n\n        if (pFramesOut != NULL) {\n            /* Read. */\n            float temp[MA_DATA_CONVERTER_STACK_BUFFER_SIZE / sizeof(float)];\n            ma_uint32 tempCapInFrames = ma_countof(temp) / inputChannels;\n\n            while (framesProcessed < frameCount) {\n                float* pRunningFramesOut;\n                ma_uint32 framesToRead;\n                ma_uint32 framesJustRead;\n\n                framesToRead = frameCount - framesProcessed;\n                if (framesToRead > tempCapInFrames) {\n                    framesToRead = tempCapInFrames;\n                }\n\n                pRunningFramesOut = ma_offset_pcm_frames_ptr_f32(pFramesOut, framesProcessed, inputChannels);\n\n                if (doesOutputBufferHaveContent == MA_FALSE) {\n                    /* Fast path. First attachment. We just read straight into the output buffer (no mixing required). */\n                    result = ma_node_read_pcm_frames(pOutputBus->pNode, pOutputBus->outputBusIndex, pRunningFramesOut, framesToRead, &framesJustRead, globalTime + framesProcessed);\n                } else {\n                    /* Slow path. Not the first attachment. Mixing required. */\n                    result = ma_node_read_pcm_frames(pOutputBus->pNode, pOutputBus->outputBusIndex, temp, framesToRead, &framesJustRead, globalTime + framesProcessed);\n                    if (result == MA_SUCCESS || result == MA_AT_END) {\n                        if (isSilentOutput == MA_FALSE) {   /* Don't mix if the node outputs silence. */\n                            ma_mix_pcm_frames_f32(pRunningFramesOut, temp, framesJustRead, inputChannels, /*volume*/1);\n                        }\n                    }\n                }\n\n                framesProcessed += framesJustRead;\n\n                /* If we reached the end or otherwise failed to read any data we need to finish up with this output node. */\n                if (result != MA_SUCCESS) {\n                    break;\n                }\n\n                /* If we didn't read anything, abort so we don't get stuck in a loop. */\n                if (framesJustRead == 0) {\n                    break;\n                }\n            }\n\n            /* If it's the first attachment we didn't do any mixing. Any leftover samples need to be silenced. */\n            if (pOutputBus == pFirst && framesProcessed < frameCount) {\n                ma_silence_pcm_frames(ma_offset_pcm_frames_ptr(pFramesOut, framesProcessed, ma_format_f32, inputChannels), (frameCount - framesProcessed), ma_format_f32, inputChannels);\n            }\n\n            if (isSilentOutput == MA_FALSE) {\n                doesOutputBufferHaveContent = MA_TRUE;\n            }\n        } else {\n            /* Seek. */\n            ma_node_read_pcm_frames(pOutputBus->pNode, pOutputBus->outputBusIndex, NULL, frameCount, &framesProcessed, globalTime);\n        }\n    }\n\n    /* If we didn't output anything, output silence. */\n    if (doesOutputBufferHaveContent == MA_FALSE && pFramesOut != NULL) {\n        ma_silence_pcm_frames(pFramesOut, frameCount, ma_format_f32, inputChannels);\n    }\n\n    /* In this path we always \"process\" the entire amount. */\n    *pFramesRead = frameCount;\n\n    return result;\n}\n\n\nMA_API ma_node_config ma_node_config_init(void)\n{\n    ma_node_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.initialState   = ma_node_state_started;    /* Nodes are started by default. */\n    config.inputBusCount  = MA_NODE_BUS_COUNT_UNKNOWN;\n    config.outputBusCount = MA_NODE_BUS_COUNT_UNKNOWN;\n\n    return config;\n}\n\n\n\nstatic ma_result ma_node_detach_full(ma_node* pNode);\n\nstatic float* ma_node_get_cached_input_ptr(ma_node* pNode, ma_uint32 inputBusIndex)\n{\n    ma_node_base* pNodeBase = (ma_node_base*)pNode;\n    ma_uint32 iInputBus;\n    float* pBasePtr;\n\n    MA_ASSERT(pNodeBase != NULL);\n\n    /* Input data is stored at the front of the buffer. */\n    pBasePtr = pNodeBase->pCachedData;\n    for (iInputBus = 0; iInputBus < inputBusIndex; iInputBus += 1) {\n        pBasePtr += pNodeBase->cachedDataCapInFramesPerBus * ma_node_input_bus_get_channels(&pNodeBase->pInputBuses[iInputBus]);\n    }\n\n    return pBasePtr;\n}\n\nstatic float* ma_node_get_cached_output_ptr(ma_node* pNode, ma_uint32 outputBusIndex)\n{\n    ma_node_base* pNodeBase = (ma_node_base*)pNode;\n    ma_uint32 iInputBus;\n    ma_uint32 iOutputBus;\n    float* pBasePtr;\n\n    MA_ASSERT(pNodeBase != NULL);\n\n    /* Cached output data starts after the input data. */\n    pBasePtr = pNodeBase->pCachedData;\n    for (iInputBus = 0; iInputBus < ma_node_get_input_bus_count(pNodeBase); iInputBus += 1) {\n        pBasePtr += pNodeBase->cachedDataCapInFramesPerBus * ma_node_input_bus_get_channels(&pNodeBase->pInputBuses[iInputBus]);\n    }\n\n    for (iOutputBus = 0; iOutputBus < outputBusIndex; iOutputBus += 1) {\n        pBasePtr += pNodeBase->cachedDataCapInFramesPerBus * ma_node_output_bus_get_channels(&pNodeBase->pOutputBuses[iOutputBus]);\n    }\n\n    return pBasePtr;\n}\n\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t inputBusOffset;\n    size_t outputBusOffset;\n    size_t cachedDataOffset;\n    ma_uint32 inputBusCount;    /* So it doesn't have to be calculated twice. */\n    ma_uint32 outputBusCount;   /* So it doesn't have to be calculated twice. */\n} ma_node_heap_layout;\n\nstatic ma_result ma_node_translate_bus_counts(const ma_node_config* pConfig, ma_uint32* pInputBusCount, ma_uint32* pOutputBusCount)\n{\n    ma_uint32 inputBusCount;\n    ma_uint32 outputBusCount;\n\n    MA_ASSERT(pConfig != NULL);\n    MA_ASSERT(pInputBusCount  != NULL);\n    MA_ASSERT(pOutputBusCount != NULL);\n\n    /* Bus counts are determined by the vtable, unless they're set to `MA_NODE_BUS_COUNT_UNKNWON`, in which case they're taken from the config. */\n    if (pConfig->vtable->inputBusCount == MA_NODE_BUS_COUNT_UNKNOWN) {\n        inputBusCount = pConfig->inputBusCount;\n    } else {\n        inputBusCount = pConfig->vtable->inputBusCount;\n\n        if (pConfig->inputBusCount != MA_NODE_BUS_COUNT_UNKNOWN && pConfig->inputBusCount != pConfig->vtable->inputBusCount) {\n            return MA_INVALID_ARGS; /* Invalid configuration. You must not specify a conflicting bus count between the node's config and the vtable. */\n        }\n    }\n\n    if (pConfig->vtable->outputBusCount == MA_NODE_BUS_COUNT_UNKNOWN) {\n        outputBusCount = pConfig->outputBusCount;\n    } else {\n        outputBusCount = pConfig->vtable->outputBusCount;\n\n        if (pConfig->outputBusCount != MA_NODE_BUS_COUNT_UNKNOWN && pConfig->outputBusCount != pConfig->vtable->outputBusCount) {\n            return MA_INVALID_ARGS; /* Invalid configuration. You must not specify a conflicting bus count between the node's config and the vtable. */\n        }\n    }\n\n    /* Bus counts must be within limits. */\n    if (inputBusCount > MA_MAX_NODE_BUS_COUNT || outputBusCount > MA_MAX_NODE_BUS_COUNT) {\n        return MA_INVALID_ARGS;\n    }\n\n\n    /* We must have channel counts for each bus. */\n    if ((inputBusCount > 0 && pConfig->pInputChannels == NULL) || (outputBusCount > 0 && pConfig->pOutputChannels == NULL)) {\n        return MA_INVALID_ARGS; /* You must specify channel counts for each input and output bus. */\n    }\n\n\n    /* Some special rules for passthrough nodes. */\n    if ((pConfig->vtable->flags & MA_NODE_FLAG_PASSTHROUGH) != 0) {\n        if ((pConfig->vtable->inputBusCount != 0 && pConfig->vtable->inputBusCount != 1) || pConfig->vtable->outputBusCount != 1) {\n            return MA_INVALID_ARGS; /* Passthrough nodes must have exactly 1 output bus and either 0 or 1 input bus. */\n        }\n\n        if (pConfig->pInputChannels[0] != pConfig->pOutputChannels[0]) {\n            return MA_INVALID_ARGS; /* Passthrough nodes must have the same number of channels between input and output nodes. */\n        }\n    }\n\n\n    *pInputBusCount  = inputBusCount;\n    *pOutputBusCount = outputBusCount;\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_node_get_heap_layout(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, ma_node_heap_layout* pHeapLayout)\n{\n    ma_result result;\n    ma_uint32 inputBusCount;\n    ma_uint32 outputBusCount;\n\n    MA_ASSERT(pHeapLayout != NULL);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL || pConfig->vtable == NULL || pConfig->vtable->onProcess == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_node_translate_bus_counts(pConfig, &inputBusCount, &outputBusCount);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    /* Input buses. */\n    if (inputBusCount > MA_MAX_NODE_LOCAL_BUS_COUNT) {\n        pHeapLayout->inputBusOffset = pHeapLayout->sizeInBytes;\n        pHeapLayout->sizeInBytes += ma_align_64(sizeof(ma_node_input_bus) * inputBusCount);\n    } else {\n        pHeapLayout->inputBusOffset = MA_SIZE_MAX;  /* MA_SIZE_MAX indicates that no heap allocation is required for the input bus. */\n    }\n\n    /* Output buses. */\n    if (outputBusCount > MA_MAX_NODE_LOCAL_BUS_COUNT) {\n        pHeapLayout->outputBusOffset = pHeapLayout->sizeInBytes;\n        pHeapLayout->sizeInBytes += ma_align_64(sizeof(ma_node_output_bus) * outputBusCount);\n    } else {\n        pHeapLayout->outputBusOffset = MA_SIZE_MAX;\n    }\n\n    /*\n    Cached audio data.\n\n    We need to allocate memory for a caching both input and output data. We have an optimization\n    where no caching is necessary for specific conditions:\n\n        - The node has 0 inputs and 1 output.\n\n    When a node meets the above conditions, no cache is allocated.\n\n    The size choice for this buffer is a little bit finicky. We don't want to be too wasteful by\n    allocating too much, but at the same time we want it be large enough so that enough frames can\n    be processed for each call to ma_node_read_pcm_frames() so that it keeps things efficient. For\n    now I'm going with 10ms @ 48K which is 480 frames per bus. This is configurable at compile\n    time. It might also be worth investigating whether or not this can be configured at run time.\n    */\n    if (inputBusCount == 0 && outputBusCount == 1) {\n        /* Fast path. No cache needed. */\n        pHeapLayout->cachedDataOffset = MA_SIZE_MAX;\n    } else {\n        /* Slow path. Cache needed. */\n        size_t cachedDataSizeInBytes = 0;\n        ma_uint32 iBus;\n\n        for (iBus = 0; iBus < inputBusCount; iBus += 1) {\n            cachedDataSizeInBytes += pNodeGraph->nodeCacheCapInFrames * ma_get_bytes_per_frame(ma_format_f32, pConfig->pInputChannels[iBus]);\n        }\n\n        for (iBus = 0; iBus < outputBusCount; iBus += 1) {\n            cachedDataSizeInBytes += pNodeGraph->nodeCacheCapInFrames * ma_get_bytes_per_frame(ma_format_f32, pConfig->pOutputChannels[iBus]);\n        }\n\n        pHeapLayout->cachedDataOffset = pHeapLayout->sizeInBytes;\n        pHeapLayout->sizeInBytes += ma_align_64(cachedDataSizeInBytes);\n    }\n\n\n    /*\n    Not technically part of the heap, but we can output the input and output bus counts so we can\n    avoid a redundant call to ma_node_translate_bus_counts().\n    */\n    pHeapLayout->inputBusCount  = inputBusCount;\n    pHeapLayout->outputBusCount = outputBusCount;\n\n    /* Make sure allocation size is aligned. */\n    pHeapLayout->sizeInBytes = ma_align_64(pHeapLayout->sizeInBytes);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_node_get_heap_size(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_node_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_node_get_heap_layout(pNodeGraph, pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_node_init_preallocated(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, void* pHeap, ma_node* pNode)\n{\n    ma_node_base* pNodeBase = (ma_node_base*)pNode;\n    ma_result result;\n    ma_node_heap_layout heapLayout;\n    ma_uint32 iInputBus;\n    ma_uint32 iOutputBus;\n\n    if (pNodeBase == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pNodeBase);\n\n    result = ma_node_get_heap_layout(pNodeGraph, pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pNodeBase->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n    pNodeBase->pNodeGraph     = pNodeGraph;\n    pNodeBase->vtable         = pConfig->vtable;\n    pNodeBase->state          = pConfig->initialState;\n    pNodeBase->stateTimes[ma_node_state_started] = 0;\n    pNodeBase->stateTimes[ma_node_state_stopped] = (ma_uint64)(ma_int64)-1; /* Weird casting for VC6 compatibility. */\n    pNodeBase->inputBusCount  = heapLayout.inputBusCount;\n    pNodeBase->outputBusCount = heapLayout.outputBusCount;\n\n    if (heapLayout.inputBusOffset != MA_SIZE_MAX) {\n        pNodeBase->pInputBuses = (ma_node_input_bus*)ma_offset_ptr(pHeap, heapLayout.inputBusOffset);\n    } else {\n        pNodeBase->pInputBuses = pNodeBase->_inputBuses;\n    }\n\n    if (heapLayout.outputBusOffset != MA_SIZE_MAX) {\n        pNodeBase->pOutputBuses = (ma_node_output_bus*)ma_offset_ptr(pHeap, heapLayout.outputBusOffset);\n    } else {\n        pNodeBase->pOutputBuses = pNodeBase->_outputBuses;\n    }\n\n    if (heapLayout.cachedDataOffset != MA_SIZE_MAX) {\n        pNodeBase->pCachedData = (float*)ma_offset_ptr(pHeap, heapLayout.cachedDataOffset);\n        pNodeBase->cachedDataCapInFramesPerBus = pNodeGraph->nodeCacheCapInFrames;\n    } else {\n        pNodeBase->pCachedData = NULL;\n    }\n\n\n\n    /* We need to run an initialization step for each input and output bus. */\n    for (iInputBus = 0; iInputBus < ma_node_get_input_bus_count(pNodeBase); iInputBus += 1) {\n        result = ma_node_input_bus_init(pConfig->pInputChannels[iInputBus], &pNodeBase->pInputBuses[iInputBus]);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n    for (iOutputBus = 0; iOutputBus < ma_node_get_output_bus_count(pNodeBase); iOutputBus += 1) {\n        result = ma_node_output_bus_init(pNodeBase, iOutputBus, pConfig->pOutputChannels[iOutputBus], &pNodeBase->pOutputBuses[iOutputBus]);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n    }\n\n\n    /* The cached data needs to be initialized to silence (or a sine wave tone if we're debugging). */\n    if (pNodeBase->pCachedData != NULL) {\n        ma_uint32 iBus;\n\n    #if 1   /* Toggle this between 0 and 1 to turn debugging on or off. 1 = fill with a sine wave for debugging; 0 = fill with silence. */\n        /* For safety we'll go ahead and default the buffer to silence. */\n        for (iBus = 0; iBus < ma_node_get_input_bus_count(pNodeBase); iBus += 1) {\n            ma_silence_pcm_frames(ma_node_get_cached_input_ptr(pNode, iBus), pNodeBase->cachedDataCapInFramesPerBus, ma_format_f32, ma_node_input_bus_get_channels(&pNodeBase->pInputBuses[iBus]));\n        }\n        for (iBus = 0; iBus < ma_node_get_output_bus_count(pNodeBase); iBus += 1) {\n            ma_silence_pcm_frames(ma_node_get_cached_output_ptr(pNode, iBus), pNodeBase->cachedDataCapInFramesPerBus, ma_format_f32, ma_node_output_bus_get_channels(&pNodeBase->pOutputBuses[iBus]));\n        }\n    #else\n        /* For debugging. Default to a sine wave. */\n        for (iBus = 0; iBus < ma_node_get_input_bus_count(pNodeBase); iBus += 1) {\n            ma_debug_fill_pcm_frames_with_sine_wave(ma_node_get_cached_input_ptr(pNode, iBus), pNodeBase->cachedDataCapInFramesPerBus, ma_format_f32, ma_node_input_bus_get_channels(&pNodeBase->pInputBuses[iBus]), 48000);\n        }\n        for (iBus = 0; iBus < ma_node_get_output_bus_count(pNodeBase); iBus += 1) {\n            ma_debug_fill_pcm_frames_with_sine_wave(ma_node_get_cached_output_ptr(pNode, iBus), pNodeBase->cachedDataCapInFramesPerBus, ma_format_f32, ma_node_output_bus_get_channels(&pNodeBase->pOutputBuses[iBus]), 48000);\n        }\n    #endif\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_node_init(ma_node_graph* pNodeGraph, const ma_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_node* pNode)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_node_get_heap_size(pNodeGraph, pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_node_init_preallocated(pNodeGraph, pConfig, pHeap, pNode);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    ((ma_node_base*)pNode)->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_node_uninit(ma_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_node_base* pNodeBase = (ma_node_base*)pNode;\n\n    if (pNodeBase == NULL) {\n        return;\n    }\n\n    /*\n    The first thing we need to do is fully detach the node. This will detach all inputs and\n    outputs. We need to do this first because it will sever the connection with the node graph and\n    allow us to complete uninitialization without needing to worry about thread-safety with the\n    audio thread. The detachment process will wait for any local processing of the node to finish.\n    */\n    ma_node_detach_full(pNode);\n\n    /*\n    At this point the node should be completely unreferenced by the node graph and we can finish up\n    the uninitialization process without needing to worry about thread-safety.\n    */\n    if (pNodeBase->_ownsHeap) {\n        ma_free(pNodeBase->_pHeap, pAllocationCallbacks);\n    }\n}\n\nMA_API ma_node_graph* ma_node_get_node_graph(const ma_node* pNode)\n{\n    if (pNode == NULL) {\n        return NULL;\n    }\n\n    return ((const ma_node_base*)pNode)->pNodeGraph;\n}\n\nMA_API ma_uint32 ma_node_get_input_bus_count(const ma_node* pNode)\n{\n    if (pNode == NULL) {\n        return 0;\n    }\n\n    return ((ma_node_base*)pNode)->inputBusCount;\n}\n\nMA_API ma_uint32 ma_node_get_output_bus_count(const ma_node* pNode)\n{\n    if (pNode == NULL) {\n        return 0;\n    }\n\n    return ((ma_node_base*)pNode)->outputBusCount;\n}\n\n\nMA_API ma_uint32 ma_node_get_input_channels(const ma_node* pNode, ma_uint32 inputBusIndex)\n{\n    const ma_node_base* pNodeBase = (const ma_node_base*)pNode;\n\n    if (pNode == NULL) {\n        return 0;\n    }\n\n    if (inputBusIndex >= ma_node_get_input_bus_count(pNode)) {\n        return 0;   /* Invalid bus index. */\n    }\n\n    return ma_node_input_bus_get_channels(&pNodeBase->pInputBuses[inputBusIndex]);\n}\n\nMA_API ma_uint32 ma_node_get_output_channels(const ma_node* pNode, ma_uint32 outputBusIndex)\n{\n    const ma_node_base* pNodeBase = (const ma_node_base*)pNode;\n\n    if (pNode == NULL) {\n        return 0;\n    }\n\n    if (outputBusIndex >= ma_node_get_output_bus_count(pNode)) {\n        return 0;   /* Invalid bus index. */\n    }\n\n    return ma_node_output_bus_get_channels(&pNodeBase->pOutputBuses[outputBusIndex]);\n}\n\n\nstatic ma_result ma_node_detach_full(ma_node* pNode)\n{\n    ma_node_base* pNodeBase = (ma_node_base*)pNode;\n    ma_uint32 iInputBus;\n\n    if (pNodeBase == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /*\n    Make sure the node is completely detached first. This will not return until the output bus is\n    guaranteed to no longer be referenced by the audio thread.\n    */\n    ma_node_detach_all_output_buses(pNode);\n\n    /*\n    At this point all output buses will have been detached from the graph and we can be guaranteed\n    that none of it's input nodes will be getting processed by the graph. We can detach these\n    without needing to worry about the audio thread touching them.\n    */\n    for (iInputBus = 0; iInputBus < ma_node_get_input_bus_count(pNode); iInputBus += 1) {\n        ma_node_input_bus* pInputBus;\n        ma_node_output_bus* pOutputBus;\n\n        pInputBus = &pNodeBase->pInputBuses[iInputBus];\n\n        /*\n        This is important. We cannot be using ma_node_input_bus_first() or ma_node_input_bus_next(). Those\n        functions are specifically for the audio thread. We'll instead just manually iterate using standard\n        linked list logic. We don't need to worry about the audio thread referencing these because the step\n        above severed the connection to the graph.\n        */\n        for (pOutputBus = (ma_node_output_bus*)ma_atomic_load_ptr(&pInputBus->head.pNext); pOutputBus != NULL; pOutputBus = (ma_node_output_bus*)ma_atomic_load_ptr(&pOutputBus->pNext)) {\n            ma_node_detach_output_bus(pOutputBus->pNode, pOutputBus->outputBusIndex);   /* This won't do any waiting in practice and should be efficient. */\n        }\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_node_detach_output_bus(ma_node* pNode, ma_uint32 outputBusIndex)\n{\n    ma_result result = MA_SUCCESS;\n    ma_node_base* pNodeBase = (ma_node_base*)pNode;\n    ma_node_base* pInputNodeBase;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (outputBusIndex >= ma_node_get_output_bus_count(pNode)) {\n        return MA_INVALID_ARGS; /* Invalid output bus index. */\n    }\n\n    /* We need to lock the output bus because we need to inspect the input node and grab it's input bus. */\n    ma_node_output_bus_lock(&pNodeBase->pOutputBuses[outputBusIndex]);\n    {\n        pInputNodeBase = (ma_node_base*)pNodeBase->pOutputBuses[outputBusIndex].pInputNode;\n        if (pInputNodeBase != NULL) {\n            ma_node_input_bus_detach__no_output_bus_lock(&pInputNodeBase->pInputBuses[pNodeBase->pOutputBuses[outputBusIndex].inputNodeInputBusIndex], &pNodeBase->pOutputBuses[outputBusIndex]);\n        }\n    }\n    ma_node_output_bus_unlock(&pNodeBase->pOutputBuses[outputBusIndex]);\n\n    return result;\n}\n\nMA_API ma_result ma_node_detach_all_output_buses(ma_node* pNode)\n{\n    ma_uint32 iOutputBus;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    for (iOutputBus = 0; iOutputBus < ma_node_get_output_bus_count(pNode); iOutputBus += 1) {\n        ma_node_detach_output_bus(pNode, iOutputBus);\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_node_attach_output_bus(ma_node* pNode, ma_uint32 outputBusIndex, ma_node* pOtherNode, ma_uint32 otherNodeInputBusIndex)\n{\n    ma_node_base* pNodeBase  = (ma_node_base*)pNode;\n    ma_node_base* pOtherNodeBase = (ma_node_base*)pOtherNode;\n\n    if (pNodeBase == NULL || pOtherNodeBase == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pNodeBase == pOtherNodeBase) {\n        return MA_INVALID_OPERATION;    /* Cannot attach a node to itself. */\n    }\n\n    if (outputBusIndex >= ma_node_get_output_bus_count(pNode) || otherNodeInputBusIndex >= ma_node_get_input_bus_count(pOtherNode)) {\n        return MA_INVALID_OPERATION;    /* Invalid bus index. */\n    }\n\n    /* The output channel count of the output node must be the same as the input channel count of the input node. */\n    if (ma_node_get_output_channels(pNode, outputBusIndex) != ma_node_get_input_channels(pOtherNode, otherNodeInputBusIndex)) {\n        return MA_INVALID_OPERATION;    /* Channel count is incompatible. */\n    }\n\n    /* This will deal with detaching if the output bus is already attached to something. */\n    ma_node_input_bus_attach(&pOtherNodeBase->pInputBuses[otherNodeInputBusIndex], &pNodeBase->pOutputBuses[outputBusIndex], pOtherNode, otherNodeInputBusIndex);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_node_set_output_bus_volume(ma_node* pNode, ma_uint32 outputBusIndex, float volume)\n{\n    ma_node_base* pNodeBase = (ma_node_base*)pNode;\n\n    if (pNodeBase == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (outputBusIndex >= ma_node_get_output_bus_count(pNode)) {\n        return MA_INVALID_ARGS; /* Invalid bus index. */\n    }\n\n    return ma_node_output_bus_set_volume(&pNodeBase->pOutputBuses[outputBusIndex], volume);\n}\n\nMA_API float ma_node_get_output_bus_volume(const ma_node* pNode, ma_uint32 outputBusIndex)\n{\n    const ma_node_base* pNodeBase = (const ma_node_base*)pNode;\n\n    if (pNodeBase == NULL) {\n        return 0;\n    }\n\n    if (outputBusIndex >= ma_node_get_output_bus_count(pNode)) {\n        return 0;   /* Invalid bus index. */\n    }\n\n    return ma_node_output_bus_get_volume(&pNodeBase->pOutputBuses[outputBusIndex]);\n}\n\nMA_API ma_result ma_node_set_state(ma_node* pNode, ma_node_state state)\n{\n    ma_node_base* pNodeBase = (ma_node_base*)pNode;\n\n    if (pNodeBase == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_atomic_exchange_i32(&pNodeBase->state, state);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_node_state ma_node_get_state(const ma_node* pNode)\n{\n    const ma_node_base* pNodeBase = (const ma_node_base*)pNode;\n\n    if (pNodeBase == NULL) {\n        return ma_node_state_stopped;\n    }\n\n    return (ma_node_state)ma_atomic_load_i32(&pNodeBase->state);\n}\n\nMA_API ma_result ma_node_set_state_time(ma_node* pNode, ma_node_state state, ma_uint64 globalTime)\n{\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Validation check for safety since we'll be using this as an index into stateTimes[]. */\n    if (state != ma_node_state_started && state != ma_node_state_stopped) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_atomic_exchange_64(&((ma_node_base*)pNode)->stateTimes[state], globalTime);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_uint64 ma_node_get_state_time(const ma_node* pNode, ma_node_state state)\n{\n    if (pNode == NULL) {\n        return 0;\n    }\n\n    /* Validation check for safety since we'll be using this as an index into stateTimes[]. */\n    if (state != ma_node_state_started && state != ma_node_state_stopped) {\n        return 0;\n    }\n\n    return ma_atomic_load_64(&((ma_node_base*)pNode)->stateTimes[state]);\n}\n\nMA_API ma_node_state ma_node_get_state_by_time(const ma_node* pNode, ma_uint64 globalTime)\n{\n    if (pNode == NULL) {\n        return ma_node_state_stopped;\n    }\n\n    return ma_node_get_state_by_time_range(pNode, globalTime, globalTime);\n}\n\nMA_API ma_node_state ma_node_get_state_by_time_range(const ma_node* pNode, ma_uint64 globalTimeBeg, ma_uint64 globalTimeEnd)\n{\n    ma_node_state state;\n\n    if (pNode == NULL) {\n        return ma_node_state_stopped;\n    }\n\n    state = ma_node_get_state(pNode);\n\n    /* An explicitly stopped node is always stopped. */\n    if (state == ma_node_state_stopped) {\n        return ma_node_state_stopped;\n    }\n\n    /*\n    Getting here means the node is marked as started, but it may still not be truly started due to\n    it's start time not having been reached yet. Also, the stop time may have also been reached in\n    which case it'll be considered stopped.\n    */\n    if (ma_node_get_state_time(pNode, ma_node_state_started) > globalTimeBeg) {\n        return ma_node_state_stopped;   /* Start time has not yet been reached. */\n    }\n\n    if (ma_node_get_state_time(pNode, ma_node_state_stopped) <= globalTimeEnd) {\n        return ma_node_state_stopped;   /* Stop time has been reached. */\n    }\n\n    /* Getting here means the node is marked as started and is within it's start/stop times. */\n    return ma_node_state_started;\n}\n\nMA_API ma_uint64 ma_node_get_time(const ma_node* pNode)\n{\n    if (pNode == NULL) {\n        return 0;\n    }\n\n    return ma_atomic_load_64(&((ma_node_base*)pNode)->localTime);\n}\n\nMA_API ma_result ma_node_set_time(ma_node* pNode, ma_uint64 localTime)\n{\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_atomic_exchange_64(&((ma_node_base*)pNode)->localTime, localTime);\n\n    return MA_SUCCESS;\n}\n\n\n\nstatic void ma_node_process_pcm_frames_internal(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_node_base* pNodeBase = (ma_node_base*)pNode;\n\n    MA_ASSERT(pNode != NULL);\n\n    if (pNodeBase->vtable->onProcess) {\n        pNodeBase->vtable->onProcess(pNode, ppFramesIn, pFrameCountIn, ppFramesOut, pFrameCountOut);\n    }\n}\n\nstatic ma_result ma_node_read_pcm_frames(ma_node* pNode, ma_uint32 outputBusIndex, float* pFramesOut, ma_uint32 frameCount, ma_uint32* pFramesRead, ma_uint64 globalTime)\n{\n    ma_node_base* pNodeBase = (ma_node_base*)pNode;\n    ma_result result = MA_SUCCESS;\n    ma_uint32 iInputBus;\n    ma_uint32 iOutputBus;\n    ma_uint32 inputBusCount;\n    ma_uint32 outputBusCount;\n    ma_uint32 totalFramesRead = 0;\n    float* ppFramesIn[MA_MAX_NODE_BUS_COUNT];\n    float* ppFramesOut[MA_MAX_NODE_BUS_COUNT];\n    ma_uint64 globalTimeBeg;\n    ma_uint64 globalTimeEnd;\n    ma_uint64 startTime;\n    ma_uint64 stopTime;\n    ma_uint32 timeOffsetBeg;\n    ma_uint32 timeOffsetEnd;\n    ma_uint32 frameCountIn;\n    ma_uint32 frameCountOut;\n\n    /*\n    pFramesRead is mandatory. It must be used to determine how many frames were read. It's normal and\n    expected that the number of frames read may be different to that requested. Therefore, the caller\n    must look at this value to correctly determine how many frames were read.\n    */\n    MA_ASSERT(pFramesRead != NULL); /* <-- If you've triggered this assert, you're using this function wrong. You *must* use this variable and inspect it after the call returns. */\n    if (pFramesRead == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pFramesRead = 0;   /* Safety. */\n\n    if (pNodeBase == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (outputBusIndex >= ma_node_get_output_bus_count(pNodeBase)) {\n        return MA_INVALID_ARGS; /* Invalid output bus index. */\n    }\n\n    /* Don't do anything if we're in a stopped state. */\n    if (ma_node_get_state_by_time_range(pNode, globalTime, globalTime + frameCount) != ma_node_state_started) {\n        return MA_SUCCESS;  /* We're in a stopped state. This is not an error - we just need to not read anything. */\n    }\n\n\n    globalTimeBeg = globalTime;\n    globalTimeEnd = globalTime + frameCount;\n    startTime = ma_node_get_state_time(pNode, ma_node_state_started);\n    stopTime  = ma_node_get_state_time(pNode, ma_node_state_stopped);\n\n    /*\n    At this point we know that we are inside our start/stop times. However, we may need to adjust\n    our frame count and output pointer to accommodate since we could be straddling the time period\n    that this function is getting called for.\n\n    It's possible (and likely) that the start time does not line up with the output buffer. We\n    therefore need to offset it by a number of frames to accommodate. The same thing applies for\n    the stop time.\n    */\n    timeOffsetBeg = (globalTimeBeg < startTime) ? (ma_uint32)(globalTimeEnd - startTime) : 0;\n    timeOffsetEnd = (globalTimeEnd > stopTime)  ? (ma_uint32)(globalTimeEnd - stopTime)  : 0;\n\n    /* Trim based on the start offset. We need to silence the start of the buffer. */\n    if (timeOffsetBeg > 0) {\n        ma_silence_pcm_frames(pFramesOut, timeOffsetBeg, ma_format_f32, ma_node_get_output_channels(pNode, outputBusIndex));\n        pFramesOut += timeOffsetBeg * ma_node_get_output_channels(pNode, outputBusIndex);\n        frameCount -= timeOffsetBeg;\n    }\n\n    /* Trim based on the end offset. We don't need to silence the tail section because we'll just have a reduced value written to pFramesRead. */\n    if (timeOffsetEnd > 0) {\n        frameCount -= timeOffsetEnd;\n    }\n\n\n    /* We run on different paths depending on the bus counts. */\n    inputBusCount  = ma_node_get_input_bus_count(pNode);\n    outputBusCount = ma_node_get_output_bus_count(pNode);\n\n    /*\n    Run a simplified path when there are no inputs and one output. In this case there's nothing to\n    actually read and we can go straight to output. This is a very common scenario because the vast\n    majority of data source nodes will use this setup so this optimization I think is worthwhile.\n    */\n    if (inputBusCount == 0 && outputBusCount == 1) {\n        /* Fast path. No need to read from input and no need for any caching. */\n        frameCountIn  = 0;\n        frameCountOut = frameCount;    /* Just read as much as we can. The callback will return what was actually read. */\n\n        ppFramesOut[0] = pFramesOut;\n\n        /*\n        If it's a passthrough we won't be expecting the callback to output anything, so we'll\n        need to pre-silence the output buffer.\n        */\n        if ((pNodeBase->vtable->flags & MA_NODE_FLAG_PASSTHROUGH) != 0) {\n            ma_silence_pcm_frames(pFramesOut, frameCount, ma_format_f32, ma_node_get_output_channels(pNode, outputBusIndex));\n        }\n\n        ma_node_process_pcm_frames_internal(pNode, NULL, &frameCountIn, ppFramesOut, &frameCountOut);\n        totalFramesRead = frameCountOut;\n    } else {\n        /* Slow path. Need to read input data. */\n        if ((pNodeBase->vtable->flags & MA_NODE_FLAG_PASSTHROUGH) != 0) {\n            /*\n            Fast path. We're running a passthrough. We need to read directly into the output buffer, but\n            still fire the callback so that event handling and trigger nodes can do their thing. Since\n            it's a passthrough there's no need for any kind of caching logic.\n            */\n            MA_ASSERT(outputBusCount == inputBusCount);\n            MA_ASSERT(outputBusCount == 1);\n            MA_ASSERT(outputBusIndex == 0);\n\n            /* We just read directly from input bus to output buffer, and then afterwards fire the callback. */\n            ppFramesOut[0] = pFramesOut;\n            ppFramesIn[0] = ppFramesOut[0];\n\n            result = ma_node_input_bus_read_pcm_frames(pNodeBase, &pNodeBase->pInputBuses[0], ppFramesIn[0], frameCount, &totalFramesRead, globalTime);\n            if (result == MA_SUCCESS) {\n                /* Even though it's a passthrough, we still need to fire the callback. */\n                frameCountIn  = totalFramesRead;\n                frameCountOut = totalFramesRead;\n\n                if (totalFramesRead > 0) {\n                    ma_node_process_pcm_frames_internal(pNode, (const float**)ppFramesIn, &frameCountIn, ppFramesOut, &frameCountOut);  /* From GCC: expected 'const float **' but argument is of type 'float **'. Shouldn't this be implicit? Excplicit cast to silence the warning. */\n                }\n\n                /*\n                A passthrough should never have modified the input and output frame counts. If you're\n                triggering these assers you need to fix your processing callback.\n                */\n                MA_ASSERT(frameCountIn  == totalFramesRead);\n                MA_ASSERT(frameCountOut == totalFramesRead);\n            }\n        } else {\n            /* Slow path. Need to do caching. */\n            ma_uint32 framesToProcessIn;\n            ma_uint32 framesToProcessOut;\n            ma_bool32 consumeNullInput = MA_FALSE;\n\n            /*\n            We use frameCount as a basis for the number of frames to read since that's what's being\n            requested, however we still need to clamp it to whatever can fit in the cache.\n\n            This will also be used as the basis for determining how many input frames to read. This is\n            not ideal because it can result in too many input frames being read which introduces latency.\n            To solve this, nodes can implement an optional callback called onGetRequiredInputFrameCount\n            which is used as hint to miniaudio as to how many input frames it needs to read at a time. This\n            callback is completely optional, and if it's not set, miniaudio will assume `frameCount`.\n\n            This function will be called multiple times for each period of time, once for each output node.\n            We cannot read from each input node each time this function is called. Instead we need to check\n            whether or not this is first output bus to be read from for this time period, and if so, read\n            from our input data.\n\n            To determine whether or not we're ready to read data, we check a flag. There will be one flag\n            for each output. When the flag is set, it means data has been read previously and that we're\n            ready to advance time forward for our input nodes by reading fresh data.\n            */\n            framesToProcessOut = frameCount;\n            if (framesToProcessOut > pNodeBase->cachedDataCapInFramesPerBus) {\n                framesToProcessOut = pNodeBase->cachedDataCapInFramesPerBus;\n            }\n\n            framesToProcessIn  = frameCount;\n            if (pNodeBase->vtable->onGetRequiredInputFrameCount) {\n                pNodeBase->vtable->onGetRequiredInputFrameCount(pNode, framesToProcessOut, &framesToProcessIn); /* <-- It does not matter if this fails. */\n            }\n            if (framesToProcessIn > pNodeBase->cachedDataCapInFramesPerBus) {\n                framesToProcessIn = pNodeBase->cachedDataCapInFramesPerBus;\n            }\n\n\n            MA_ASSERT(framesToProcessIn  <= 0xFFFF);\n            MA_ASSERT(framesToProcessOut <= 0xFFFF);\n\n            if (ma_node_output_bus_has_read(&pNodeBase->pOutputBuses[outputBusIndex])) {\n                /* Getting here means we need to do another round of processing. */\n                pNodeBase->cachedFrameCountOut = 0;\n\n                for (;;) {\n                    frameCountOut = 0;\n\n                    /*\n                    We need to prepare our output frame pointers for processing. In the same iteration we need\n                    to mark every output bus as unread so that future calls to this function for different buses\n                    for the current time period don't pull in data when they should instead be reading from cache.\n                    */\n                    for (iOutputBus = 0; iOutputBus < outputBusCount; iOutputBus += 1) {\n                        ma_node_output_bus_set_has_read(&pNodeBase->pOutputBuses[iOutputBus], MA_FALSE); /* <-- This is what tells the next calls to this function for other output buses for this time period to read from cache instead of pulling in more data. */\n                        ppFramesOut[iOutputBus] = ma_node_get_cached_output_ptr(pNode, iOutputBus);\n                    }\n\n                    /* We only need to read from input buses if there isn't already some data in the cache. */\n                    if (pNodeBase->cachedFrameCountIn == 0) {\n                        ma_uint32 maxFramesReadIn = 0;\n\n                        /* Here is where we pull in data from the input buses. This is what will trigger an advance in time. */\n                        for (iInputBus = 0; iInputBus < inputBusCount; iInputBus += 1) {\n                            ma_uint32 framesRead;\n\n                            /* The first thing to do is get the offset within our bulk allocation to store this input data. */\n                            ppFramesIn[iInputBus] = ma_node_get_cached_input_ptr(pNode, iInputBus);\n\n                            /* Once we've determined our destination pointer we can read. Note that we must inspect the number of frames read and fill any leftovers with silence for safety. */\n                            result = ma_node_input_bus_read_pcm_frames(pNodeBase, &pNodeBase->pInputBuses[iInputBus], ppFramesIn[iInputBus], framesToProcessIn, &framesRead, globalTime);\n                            if (result != MA_SUCCESS) {\n                                /* It doesn't really matter if we fail because we'll just fill with silence. */\n                                framesRead = 0; /* Just for safety, but I don't think it's really needed. */\n                            }\n\n                            /* TODO: Minor optimization opportunity here. If no frames were read and the buffer is already filled with silence, no need to re-silence it. */\n                            /* Any leftover frames need to silenced for safety. */\n                            if (framesRead < framesToProcessIn) {\n                                ma_silence_pcm_frames(ppFramesIn[iInputBus] + (framesRead * ma_node_get_input_channels(pNodeBase, iInputBus)), (framesToProcessIn - framesRead), ma_format_f32, ma_node_get_input_channels(pNodeBase, iInputBus));\n                            }\n\n                            maxFramesReadIn = ma_max(maxFramesReadIn, framesRead);\n                        }\n\n                        /* This was a fresh load of input data so reset our consumption counter. */\n                        pNodeBase->consumedFrameCountIn = 0;\n\n                        /*\n                        We don't want to keep processing if there's nothing to process, so set the number of cached\n                        input frames to the maximum number we read from each attachment (the lesser will be padded\n                        with silence). If we didn't read anything, this will be set to 0 and the entire buffer will\n                        have been assigned to silence. This being equal to 0 is an important property for us because\n                        it allows us to detect when NULL can be passed into the processing callback for the input\n                        buffer for the purpose of continuous processing.\n                        */\n                        pNodeBase->cachedFrameCountIn = (ma_uint16)maxFramesReadIn;\n                    } else {\n                        /* We don't need to read anything, but we do need to prepare our input frame pointers. */\n                        for (iInputBus = 0; iInputBus < inputBusCount; iInputBus += 1) {\n                            ppFramesIn[iInputBus] = ma_node_get_cached_input_ptr(pNode, iInputBus) + (pNodeBase->consumedFrameCountIn * ma_node_get_input_channels(pNodeBase, iInputBus));\n                        }\n                    }\n\n                    /*\n                    At this point we have our input data so now we need to do some processing. Sneaky little\n                    optimization here - we can set the pointer to the output buffer for this output bus so\n                    that the final copy into the output buffer is done directly by onProcess().\n                    */\n                    if (pFramesOut != NULL) {\n                        ppFramesOut[outputBusIndex] = ma_offset_pcm_frames_ptr_f32(pFramesOut, pNodeBase->cachedFrameCountOut, ma_node_get_output_channels(pNode, outputBusIndex));\n                    }\n\n\n                    /* Give the processing function the entire capacity of the output buffer. */\n                    frameCountOut = (framesToProcessOut - pNodeBase->cachedFrameCountOut);\n\n                    /*\n                    We need to treat nodes with continuous processing a little differently. For these ones,\n                    we always want to fire the callback with the requested number of frames, regardless of\n                    pNodeBase->cachedFrameCountIn, which could be 0. Also, we want to check if we can pass\n                    in NULL for the input buffer to the callback.\n                    */\n                    if ((pNodeBase->vtable->flags & MA_NODE_FLAG_CONTINUOUS_PROCESSING) != 0) {\n                        /* We're using continuous processing. Make sure we specify the whole frame count at all times. */\n                        frameCountIn = framesToProcessIn;    /* Give the processing function as much input data as we've got in the buffer, including any silenced padding from short reads. */\n\n                        if ((pNodeBase->vtable->flags & MA_NODE_FLAG_ALLOW_NULL_INPUT) != 0 && pNodeBase->consumedFrameCountIn == 0 && pNodeBase->cachedFrameCountIn == 0) {\n                            consumeNullInput = MA_TRUE;\n                        } else {\n                            consumeNullInput = MA_FALSE;\n                        }\n\n                        /*\n                        Since we're using continuous processing we're always passing in a full frame count\n                        regardless of how much input data was read. If this is greater than what we read as\n                        input, we'll end up with an underflow. We instead need to make sure our cached frame\n                        count is set to the number of frames we'll be passing to the data callback. Not\n                        doing this will result in an underflow when we \"consume\" the cached data later on.\n\n                        Note that this check needs to be done after the \"consumeNullInput\" check above because\n                        we use the property of cachedFrameCountIn being 0 to determine whether or not we\n                        should be passing in a null pointer to the processing callback for when the node is\n                        configured with MA_NODE_FLAG_ALLOW_NULL_INPUT.\n                        */\n                        if (pNodeBase->cachedFrameCountIn < (ma_uint16)frameCountIn) {\n                            pNodeBase->cachedFrameCountIn = (ma_uint16)frameCountIn;\n                        }\n                    } else {\n                        frameCountIn = pNodeBase->cachedFrameCountIn;  /* Give the processing function as much valid input data as we've got. */\n                        consumeNullInput = MA_FALSE;\n                    }\n\n                    /*\n                    Process data slightly differently depending on whether or not we're consuming NULL\n                    input (checked just above).\n                    */\n                    if (consumeNullInput) {\n                        ma_node_process_pcm_frames_internal(pNode, NULL, &frameCountIn, ppFramesOut, &frameCountOut);\n                    } else {\n                        /*\n                        We want to skip processing if there's no input data, but we can only do that safely if\n                        we know that there is no chance of any output frames being produced. If continuous\n                        processing is being used, this won't be a problem because the input frame count will\n                        always be non-0. However, if continuous processing is *not* enabled and input and output\n                        data is processed at different rates, we still need to process that last input frame\n                        because there could be a few excess output frames needing to be produced from cached\n                        data. The `MA_NODE_FLAG_DIFFERENT_PROCESSING_RATES` flag is used as the indicator for\n                        determining whether or not we need to process the node even when there are no input\n                        frames available right now.\n                        */\n                        if (frameCountIn > 0 || (pNodeBase->vtable->flags & MA_NODE_FLAG_DIFFERENT_PROCESSING_RATES) != 0) {\n                            ma_node_process_pcm_frames_internal(pNode, (const float**)ppFramesIn, &frameCountIn, ppFramesOut, &frameCountOut);    /* From GCC: expected 'const float **' but argument is of type 'float **'. Shouldn't this be implicit? Excplicit cast to silence the warning. */\n                        } else {\n                            frameCountOut = 0;  /* No data was processed. */\n                        }\n                    }\n\n                    /*\n                    Thanks to our sneaky optimization above we don't need to do any data copying directly into\n                    the output buffer - the onProcess() callback just did that for us. We do, however, need to\n                    apply the number of input and output frames that were processed. Note that due to continuous\n                    processing above, we need to do explicit checks here. If we just consumed a NULL input\n                    buffer it means that no actual input data was processed from the internal buffers and we\n                    don't want to be modifying any counters.\n                    */\n                    if (consumeNullInput == MA_FALSE) {\n                        pNodeBase->consumedFrameCountIn += (ma_uint16)frameCountIn;\n                        pNodeBase->cachedFrameCountIn   -= (ma_uint16)frameCountIn;\n                    }\n\n                    /* The cached output frame count is always equal to what we just read. */\n                    pNodeBase->cachedFrameCountOut += (ma_uint16)frameCountOut;\n\n                    /* If we couldn't process any data, we're done. The loop needs to be terminated here or else we'll get stuck in a loop. */\n                    if (pNodeBase->cachedFrameCountOut == framesToProcessOut || (frameCountOut == 0 && frameCountIn == 0)) {\n                        break;\n                    }\n                }\n            } else {\n                /*\n                We're not needing to read anything from the input buffer so just read directly from our\n                already-processed data.\n                */\n                if (pFramesOut != NULL) {\n                    ma_copy_pcm_frames(pFramesOut, ma_node_get_cached_output_ptr(pNodeBase, outputBusIndex), pNodeBase->cachedFrameCountOut, ma_format_f32, ma_node_get_output_channels(pNodeBase, outputBusIndex));\n                }\n            }\n\n            /* The number of frames read is always equal to the number of cached output frames. */\n            totalFramesRead = pNodeBase->cachedFrameCountOut;\n\n            /* Now that we've read the data, make sure our read flag is set. */\n            ma_node_output_bus_set_has_read(&pNodeBase->pOutputBuses[outputBusIndex], MA_TRUE);\n        }\n    }\n\n    /* Apply volume, if necessary. */\n    ma_apply_volume_factor_f32(pFramesOut, totalFramesRead * ma_node_get_output_channels(pNodeBase, outputBusIndex), ma_node_output_bus_get_volume(&pNodeBase->pOutputBuses[outputBusIndex]));\n\n    /* Advance our local time forward. */\n    ma_atomic_fetch_add_64(&pNodeBase->localTime, (ma_uint64)totalFramesRead);\n\n    *pFramesRead = totalFramesRead + timeOffsetBeg; /* Must include the silenced section at the start of the buffer. */\n    return result;\n}\n\n\n\n\n/* Data source node. */\nMA_API ma_data_source_node_config ma_data_source_node_config_init(ma_data_source* pDataSource)\n{\n    ma_data_source_node_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.nodeConfig  = ma_node_config_init();\n    config.pDataSource = pDataSource;\n\n    return config;\n}\n\n\nstatic void ma_data_source_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_data_source_node* pDataSourceNode = (ma_data_source_node*)pNode;\n    ma_format format;\n    ma_uint32 channels;\n    ma_uint32 frameCount;\n    ma_uint64 framesRead = 0;\n\n    MA_ASSERT(pDataSourceNode != NULL);\n    MA_ASSERT(pDataSourceNode->pDataSource != NULL);\n    MA_ASSERT(ma_node_get_input_bus_count(pDataSourceNode)  == 0);\n    MA_ASSERT(ma_node_get_output_bus_count(pDataSourceNode) == 1);\n\n    /* We don't want to read from ppFramesIn at all. Instead we read from the data source. */\n    (void)ppFramesIn;\n    (void)pFrameCountIn;\n\n    frameCount = *pFrameCountOut;\n\n    /* miniaudio should never be calling this with a frame count of zero. */\n    MA_ASSERT(frameCount > 0);\n\n    if (ma_data_source_get_data_format(pDataSourceNode->pDataSource, &format, &channels, NULL, NULL, 0) == MA_SUCCESS) { /* <-- Don't care about sample rate here. */\n        /* The node graph system requires samples be in floating point format. This is checked in ma_data_source_node_init(). */\n        MA_ASSERT(format == ma_format_f32);\n        (void)format;   /* Just to silence some static analysis tools. */\n\n        ma_data_source_read_pcm_frames(pDataSourceNode->pDataSource, ppFramesOut[0], frameCount, &framesRead);\n    }\n\n    *pFrameCountOut = (ma_uint32)framesRead;\n}\n\nstatic ma_node_vtable g_ma_data_source_node_vtable =\n{\n    ma_data_source_node_process_pcm_frames,\n    NULL,   /* onGetRequiredInputFrameCount */\n    0,      /* 0 input buses. */\n    1,      /* 1 output bus. */\n    0\n};\n\nMA_API ma_result ma_data_source_node_init(ma_node_graph* pNodeGraph, const ma_data_source_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_data_source_node* pDataSourceNode)\n{\n    ma_result result;\n    ma_format format;   /* For validating the format, which must be ma_format_f32. */\n    ma_uint32 channels; /* For specifying the channel count of the output bus. */\n    ma_node_config baseConfig;\n\n    if (pDataSourceNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pDataSourceNode);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    result = ma_data_source_get_data_format(pConfig->pDataSource, &format, &channels, NULL, NULL, 0);    /* Don't care about sample rate. This will check pDataSource for NULL. */\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    MA_ASSERT(format == ma_format_f32); /* <-- If you've triggered this it means your data source is not outputting floating-point samples. You must configure your data source to use ma_format_f32. */\n    if (format != ma_format_f32) {\n        return MA_INVALID_ARGS; /* Invalid format. */\n    }\n\n    /* The channel count is defined by the data source. If the caller has manually changed the channels we just ignore it. */\n    baseConfig = pConfig->nodeConfig;\n    baseConfig.vtable = &g_ma_data_source_node_vtable;  /* Explicitly set the vtable here to prevent callers from setting it incorrectly. */\n\n    /*\n    The channel count is defined by the data source. It is invalid for the caller to manually set\n    the channel counts in the config. `ma_data_source_node_config_init()` will have defaulted the\n    channel count pointer to NULL which is how it must remain. If you trigger any of these asserts\n    it means you're explicitly setting the channel count. Instead, configure the output channel\n    count of your data source to be the necessary channel count.\n    */\n    if (baseConfig.pOutputChannels != NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    baseConfig.pOutputChannels = &channels;\n\n    result = ma_node_init(pNodeGraph, &baseConfig, pAllocationCallbacks, &pDataSourceNode->base);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    pDataSourceNode->pDataSource = pConfig->pDataSource;\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_data_source_node_uninit(ma_data_source_node* pDataSourceNode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_node_uninit(&pDataSourceNode->base, pAllocationCallbacks);\n}\n\nMA_API ma_result ma_data_source_node_set_looping(ma_data_source_node* pDataSourceNode, ma_bool32 isLooping)\n{\n    if (pDataSourceNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_data_source_set_looping(pDataSourceNode->pDataSource, isLooping);\n}\n\nMA_API ma_bool32 ma_data_source_node_is_looping(ma_data_source_node* pDataSourceNode)\n{\n    if (pDataSourceNode == NULL) {\n        return MA_FALSE;\n    }\n\n    return ma_data_source_is_looping(pDataSourceNode->pDataSource);\n}\n\n\n\n/* Splitter Node. */\nMA_API ma_splitter_node_config ma_splitter_node_config_init(ma_uint32 channels)\n{\n    ma_splitter_node_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.nodeConfig     = ma_node_config_init();\n    config.channels       = channels;\n    config.outputBusCount = 2;\n\n    return config;\n}\n\n\nstatic void ma_splitter_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_node_base* pNodeBase = (ma_node_base*)pNode;\n    ma_uint32 iOutputBus;\n    ma_uint32 channels;\n\n    MA_ASSERT(pNodeBase != NULL);\n    MA_ASSERT(ma_node_get_input_bus_count(pNodeBase) == 1);\n\n    /* We don't need to consider the input frame count - it'll be the same as the output frame count and we process everything. */\n    (void)pFrameCountIn;\n\n    /* NOTE: This assumes the same number of channels for all inputs and outputs. This was checked in ma_splitter_node_init(). */\n    channels = ma_node_get_input_channels(pNodeBase, 0);\n\n    /* Splitting is just copying the first input bus and copying it over to each output bus. */\n    for (iOutputBus = 0; iOutputBus < ma_node_get_output_bus_count(pNodeBase); iOutputBus += 1) {\n        ma_copy_pcm_frames(ppFramesOut[iOutputBus], ppFramesIn[0], *pFrameCountOut, ma_format_f32, channels);\n    }\n}\n\nstatic ma_node_vtable g_ma_splitter_node_vtable =\n{\n    ma_splitter_node_process_pcm_frames,\n    NULL,                       /* onGetRequiredInputFrameCount */\n    1,                          /* 1 input bus. */\n    MA_NODE_BUS_COUNT_UNKNOWN,  /* The output bus count is specified on a per-node basis. */\n    0\n};\n\nMA_API ma_result ma_splitter_node_init(ma_node_graph* pNodeGraph, const ma_splitter_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_splitter_node* pSplitterNode)\n{\n    ma_result result;\n    ma_node_config baseConfig;\n    ma_uint32 pInputChannels[1];\n    ma_uint32 pOutputChannels[MA_MAX_NODE_BUS_COUNT];\n    ma_uint32 iOutputBus;\n\n    if (pSplitterNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pSplitterNode);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->outputBusCount > MA_MAX_NODE_BUS_COUNT) {\n        return MA_INVALID_ARGS; /* Too many output buses. */\n    }\n\n    /* Splitters require the same number of channels between inputs and outputs. */\n    pInputChannels[0]  = pConfig->channels;\n    for (iOutputBus = 0; iOutputBus < pConfig->outputBusCount; iOutputBus += 1) {\n        pOutputChannels[iOutputBus] = pConfig->channels;\n    }\n\n    baseConfig = pConfig->nodeConfig;\n    baseConfig.vtable = &g_ma_splitter_node_vtable;\n    baseConfig.pInputChannels  = pInputChannels;\n    baseConfig.pOutputChannels = pOutputChannels;\n    baseConfig.outputBusCount  = pConfig->outputBusCount;\n\n    result = ma_node_init(pNodeGraph, &baseConfig, pAllocationCallbacks, &pSplitterNode->base);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to initialize the base node. */\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API void ma_splitter_node_uninit(ma_splitter_node* pSplitterNode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_node_uninit(pSplitterNode, pAllocationCallbacks);\n}\n\n\n/*\nBiquad Node\n*/\nMA_API ma_biquad_node_config ma_biquad_node_config_init(ma_uint32 channels, float b0, float b1, float b2, float a0, float a1, float a2)\n{\n    ma_biquad_node_config config;\n\n    config.nodeConfig = ma_node_config_init();\n    config.biquad = ma_biquad_config_init(ma_format_f32, channels, b0, b1, b2, a0, a1, a2);\n\n    return config;\n}\n\nstatic void ma_biquad_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_biquad_node* pLPFNode = (ma_biquad_node*)pNode;\n\n    MA_ASSERT(pNode != NULL);\n    (void)pFrameCountIn;\n\n    ma_biquad_process_pcm_frames(&pLPFNode->biquad, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut);\n}\n\nstatic ma_node_vtable g_ma_biquad_node_vtable =\n{\n    ma_biquad_node_process_pcm_frames,\n    NULL,   /* onGetRequiredInputFrameCount */\n    1,      /* One input. */\n    1,      /* One output. */\n    0       /* Default flags. */\n};\n\nMA_API ma_result ma_biquad_node_init(ma_node_graph* pNodeGraph, const ma_biquad_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_biquad_node* pNode)\n{\n    ma_result result;\n    ma_node_config baseNodeConfig;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pNode);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->biquad.format != ma_format_f32) {\n        return MA_INVALID_ARGS; /* The format must be f32. */\n    }\n\n    result = ma_biquad_init(&pConfig->biquad, pAllocationCallbacks, &pNode->biquad);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    baseNodeConfig = ma_node_config_init();\n    baseNodeConfig.vtable          = &g_ma_biquad_node_vtable;\n    baseNodeConfig.pInputChannels  = &pConfig->biquad.channels;\n    baseNodeConfig.pOutputChannels = &pConfig->biquad.channels;\n\n    result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_biquad_node_reinit(const ma_biquad_config* pConfig, ma_biquad_node* pNode)\n{\n    ma_biquad_node* pLPFNode = (ma_biquad_node*)pNode;\n\n    MA_ASSERT(pNode != NULL);\n\n    return ma_biquad_reinit(pConfig, &pLPFNode->biquad);\n}\n\nMA_API void ma_biquad_node_uninit(ma_biquad_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_biquad_node* pLPFNode = (ma_biquad_node*)pNode;\n\n    if (pNode == NULL) {\n        return;\n    }\n\n    ma_node_uninit(pNode, pAllocationCallbacks);\n    ma_biquad_uninit(&pLPFNode->biquad, pAllocationCallbacks);\n}\n\n\n\n/*\nLow Pass Filter Node\n*/\nMA_API ma_lpf_node_config ma_lpf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order)\n{\n    ma_lpf_node_config config;\n\n    config.nodeConfig = ma_node_config_init();\n    config.lpf = ma_lpf_config_init(ma_format_f32, channels, sampleRate, cutoffFrequency, order);\n\n    return config;\n}\n\nstatic void ma_lpf_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_lpf_node* pLPFNode = (ma_lpf_node*)pNode;\n\n    MA_ASSERT(pNode != NULL);\n    (void)pFrameCountIn;\n\n    ma_lpf_process_pcm_frames(&pLPFNode->lpf, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut);\n}\n\nstatic ma_node_vtable g_ma_lpf_node_vtable =\n{\n    ma_lpf_node_process_pcm_frames,\n    NULL,   /* onGetRequiredInputFrameCount */\n    1,      /* One input. */\n    1,      /* One output. */\n    0       /* Default flags. */\n};\n\nMA_API ma_result ma_lpf_node_init(ma_node_graph* pNodeGraph, const ma_lpf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_lpf_node* pNode)\n{\n    ma_result result;\n    ma_node_config baseNodeConfig;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pNode);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->lpf.format != ma_format_f32) {\n        return MA_INVALID_ARGS; /* The format must be f32. */\n    }\n\n    result = ma_lpf_init(&pConfig->lpf, pAllocationCallbacks, &pNode->lpf);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    baseNodeConfig = ma_node_config_init();\n    baseNodeConfig.vtable          = &g_ma_lpf_node_vtable;\n    baseNodeConfig.pInputChannels  = &pConfig->lpf.channels;\n    baseNodeConfig.pOutputChannels = &pConfig->lpf.channels;\n\n    result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_lpf_node_reinit(const ma_lpf_config* pConfig, ma_lpf_node* pNode)\n{\n    ma_lpf_node* pLPFNode = (ma_lpf_node*)pNode;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_lpf_reinit(pConfig, &pLPFNode->lpf);\n}\n\nMA_API void ma_lpf_node_uninit(ma_lpf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_lpf_node* pLPFNode = (ma_lpf_node*)pNode;\n\n    if (pNode == NULL) {\n        return;\n    }\n\n    ma_node_uninit(pNode, pAllocationCallbacks);\n    ma_lpf_uninit(&pLPFNode->lpf, pAllocationCallbacks);\n}\n\n\n\n/*\nHigh Pass Filter Node\n*/\nMA_API ma_hpf_node_config ma_hpf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order)\n{\n    ma_hpf_node_config config;\n\n    config.nodeConfig = ma_node_config_init();\n    config.hpf = ma_hpf_config_init(ma_format_f32, channels, sampleRate, cutoffFrequency, order);\n\n    return config;\n}\n\nstatic void ma_hpf_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_hpf_node* pHPFNode = (ma_hpf_node*)pNode;\n\n    MA_ASSERT(pNode != NULL);\n    (void)pFrameCountIn;\n\n    ma_hpf_process_pcm_frames(&pHPFNode->hpf, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut);\n}\n\nstatic ma_node_vtable g_ma_hpf_node_vtable =\n{\n    ma_hpf_node_process_pcm_frames,\n    NULL,   /* onGetRequiredInputFrameCount */\n    1,      /* One input. */\n    1,      /* One output. */\n    0       /* Default flags. */\n};\n\nMA_API ma_result ma_hpf_node_init(ma_node_graph* pNodeGraph, const ma_hpf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hpf_node* pNode)\n{\n    ma_result result;\n    ma_node_config baseNodeConfig;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pNode);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->hpf.format != ma_format_f32) {\n        return MA_INVALID_ARGS; /* The format must be f32. */\n    }\n\n    result = ma_hpf_init(&pConfig->hpf, pAllocationCallbacks, &pNode->hpf);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    baseNodeConfig = ma_node_config_init();\n    baseNodeConfig.vtable          = &g_ma_hpf_node_vtable;\n    baseNodeConfig.pInputChannels  = &pConfig->hpf.channels;\n    baseNodeConfig.pOutputChannels = &pConfig->hpf.channels;\n\n    result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_hpf_node_reinit(const ma_hpf_config* pConfig, ma_hpf_node* pNode)\n{\n    ma_hpf_node* pHPFNode = (ma_hpf_node*)pNode;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_hpf_reinit(pConfig, &pHPFNode->hpf);\n}\n\nMA_API void ma_hpf_node_uninit(ma_hpf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_hpf_node* pHPFNode = (ma_hpf_node*)pNode;\n\n    if (pNode == NULL) {\n        return;\n    }\n\n    ma_node_uninit(pNode, pAllocationCallbacks);\n    ma_hpf_uninit(&pHPFNode->hpf, pAllocationCallbacks);\n}\n\n\n\n\n/*\nBand Pass Filter Node\n*/\nMA_API ma_bpf_node_config ma_bpf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double cutoffFrequency, ma_uint32 order)\n{\n    ma_bpf_node_config config;\n\n    config.nodeConfig = ma_node_config_init();\n    config.bpf = ma_bpf_config_init(ma_format_f32, channels, sampleRate, cutoffFrequency, order);\n\n    return config;\n}\n\nstatic void ma_bpf_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_bpf_node* pBPFNode = (ma_bpf_node*)pNode;\n\n    MA_ASSERT(pNode != NULL);\n    (void)pFrameCountIn;\n\n    ma_bpf_process_pcm_frames(&pBPFNode->bpf, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut);\n}\n\nstatic ma_node_vtable g_ma_bpf_node_vtable =\n{\n    ma_bpf_node_process_pcm_frames,\n    NULL,   /* onGetRequiredInputFrameCount */\n    1,      /* One input. */\n    1,      /* One output. */\n    0       /* Default flags. */\n};\n\nMA_API ma_result ma_bpf_node_init(ma_node_graph* pNodeGraph, const ma_bpf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_bpf_node* pNode)\n{\n    ma_result result;\n    ma_node_config baseNodeConfig;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pNode);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->bpf.format != ma_format_f32) {\n        return MA_INVALID_ARGS; /* The format must be f32. */\n    }\n\n    result = ma_bpf_init(&pConfig->bpf, pAllocationCallbacks, &pNode->bpf);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    baseNodeConfig = ma_node_config_init();\n    baseNodeConfig.vtable          = &g_ma_bpf_node_vtable;\n    baseNodeConfig.pInputChannels  = &pConfig->bpf.channels;\n    baseNodeConfig.pOutputChannels = &pConfig->bpf.channels;\n\n    result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_bpf_node_reinit(const ma_bpf_config* pConfig, ma_bpf_node* pNode)\n{\n    ma_bpf_node* pBPFNode = (ma_bpf_node*)pNode;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_bpf_reinit(pConfig, &pBPFNode->bpf);\n}\n\nMA_API void ma_bpf_node_uninit(ma_bpf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_bpf_node* pBPFNode = (ma_bpf_node*)pNode;\n\n    if (pNode == NULL) {\n        return;\n    }\n\n    ma_node_uninit(pNode, pAllocationCallbacks);\n    ma_bpf_uninit(&pBPFNode->bpf, pAllocationCallbacks);\n}\n\n\n\n/*\nNotching Filter Node\n*/\nMA_API ma_notch_node_config ma_notch_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double q, double frequency)\n{\n    ma_notch_node_config config;\n\n    config.nodeConfig = ma_node_config_init();\n    config.notch = ma_notch2_config_init(ma_format_f32, channels, sampleRate, q, frequency);\n\n    return config;\n}\n\nstatic void ma_notch_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_notch_node* pBPFNode = (ma_notch_node*)pNode;\n\n    MA_ASSERT(pNode != NULL);\n    (void)pFrameCountIn;\n\n    ma_notch2_process_pcm_frames(&pBPFNode->notch, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut);\n}\n\nstatic ma_node_vtable g_ma_notch_node_vtable =\n{\n    ma_notch_node_process_pcm_frames,\n    NULL,   /* onGetRequiredInputFrameCount */\n    1,      /* One input. */\n    1,      /* One output. */\n    0       /* Default flags. */\n};\n\nMA_API ma_result ma_notch_node_init(ma_node_graph* pNodeGraph, const ma_notch_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_notch_node* pNode)\n{\n    ma_result result;\n    ma_node_config baseNodeConfig;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pNode);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->notch.format != ma_format_f32) {\n        return MA_INVALID_ARGS; /* The format must be f32. */\n    }\n\n    result = ma_notch2_init(&pConfig->notch, pAllocationCallbacks, &pNode->notch);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    baseNodeConfig = ma_node_config_init();\n    baseNodeConfig.vtable          = &g_ma_notch_node_vtable;\n    baseNodeConfig.pInputChannels  = &pConfig->notch.channels;\n    baseNodeConfig.pOutputChannels = &pConfig->notch.channels;\n\n    result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_notch_node_reinit(const ma_notch_config* pConfig, ma_notch_node* pNode)\n{\n    ma_notch_node* pNotchNode = (ma_notch_node*)pNode;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_notch2_reinit(pConfig, &pNotchNode->notch);\n}\n\nMA_API void ma_notch_node_uninit(ma_notch_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_notch_node* pNotchNode = (ma_notch_node*)pNode;\n\n    if (pNode == NULL) {\n        return;\n    }\n\n    ma_node_uninit(pNode, pAllocationCallbacks);\n    ma_notch2_uninit(&pNotchNode->notch, pAllocationCallbacks);\n}\n\n\n\n/*\nPeaking Filter Node\n*/\nMA_API ma_peak_node_config ma_peak_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency)\n{\n    ma_peak_node_config config;\n\n    config.nodeConfig = ma_node_config_init();\n    config.peak = ma_peak2_config_init(ma_format_f32, channels, sampleRate, gainDB, q, frequency);\n\n    return config;\n}\n\nstatic void ma_peak_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_peak_node* pBPFNode = (ma_peak_node*)pNode;\n\n    MA_ASSERT(pNode != NULL);\n    (void)pFrameCountIn;\n\n    ma_peak2_process_pcm_frames(&pBPFNode->peak, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut);\n}\n\nstatic ma_node_vtable g_ma_peak_node_vtable =\n{\n    ma_peak_node_process_pcm_frames,\n    NULL,   /* onGetRequiredInputFrameCount */\n    1,      /* One input. */\n    1,      /* One output. */\n    0       /* Default flags. */\n};\n\nMA_API ma_result ma_peak_node_init(ma_node_graph* pNodeGraph, const ma_peak_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_peak_node* pNode)\n{\n    ma_result result;\n    ma_node_config baseNodeConfig;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pNode);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->peak.format != ma_format_f32) {\n        return MA_INVALID_ARGS; /* The format must be f32. */\n    }\n\n    result = ma_peak2_init(&pConfig->peak, pAllocationCallbacks, &pNode->peak);\n    if (result != MA_SUCCESS) {\n        ma_node_uninit(pNode, pAllocationCallbacks);\n        return result;\n    }\n\n    baseNodeConfig = ma_node_config_init();\n    baseNodeConfig.vtable          = &g_ma_peak_node_vtable;\n    baseNodeConfig.pInputChannels  = &pConfig->peak.channels;\n    baseNodeConfig.pOutputChannels = &pConfig->peak.channels;\n\n    result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_peak_node_reinit(const ma_peak_config* pConfig, ma_peak_node* pNode)\n{\n    ma_peak_node* pPeakNode = (ma_peak_node*)pNode;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_peak2_reinit(pConfig, &pPeakNode->peak);\n}\n\nMA_API void ma_peak_node_uninit(ma_peak_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_peak_node* pPeakNode = (ma_peak_node*)pNode;\n\n    if (pNode == NULL) {\n        return;\n    }\n\n    ma_node_uninit(pNode, pAllocationCallbacks);\n    ma_peak2_uninit(&pPeakNode->peak, pAllocationCallbacks);\n}\n\n\n\n/*\nLow Shelf Filter Node\n*/\nMA_API ma_loshelf_node_config ma_loshelf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency)\n{\n    ma_loshelf_node_config config;\n\n    config.nodeConfig = ma_node_config_init();\n    config.loshelf = ma_loshelf2_config_init(ma_format_f32, channels, sampleRate, gainDB, q, frequency);\n\n    return config;\n}\n\nstatic void ma_loshelf_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_loshelf_node* pBPFNode = (ma_loshelf_node*)pNode;\n\n    MA_ASSERT(pNode != NULL);\n    (void)pFrameCountIn;\n\n    ma_loshelf2_process_pcm_frames(&pBPFNode->loshelf, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut);\n}\n\nstatic ma_node_vtable g_ma_loshelf_node_vtable =\n{\n    ma_loshelf_node_process_pcm_frames,\n    NULL,   /* onGetRequiredInputFrameCount */\n    1,      /* One input. */\n    1,      /* One output. */\n    0       /* Default flags. */\n};\n\nMA_API ma_result ma_loshelf_node_init(ma_node_graph* pNodeGraph, const ma_loshelf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_loshelf_node* pNode)\n{\n    ma_result result;\n    ma_node_config baseNodeConfig;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pNode);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->loshelf.format != ma_format_f32) {\n        return MA_INVALID_ARGS; /* The format must be f32. */\n    }\n\n    result = ma_loshelf2_init(&pConfig->loshelf, pAllocationCallbacks, &pNode->loshelf);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    baseNodeConfig = ma_node_config_init();\n    baseNodeConfig.vtable          = &g_ma_loshelf_node_vtable;\n    baseNodeConfig.pInputChannels  = &pConfig->loshelf.channels;\n    baseNodeConfig.pOutputChannels = &pConfig->loshelf.channels;\n\n    result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_loshelf_node_reinit(const ma_loshelf_config* pConfig, ma_loshelf_node* pNode)\n{\n    ma_loshelf_node* pLoshelfNode = (ma_loshelf_node*)pNode;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_loshelf2_reinit(pConfig, &pLoshelfNode->loshelf);\n}\n\nMA_API void ma_loshelf_node_uninit(ma_loshelf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_loshelf_node* pLoshelfNode = (ma_loshelf_node*)pNode;\n\n    if (pNode == NULL) {\n        return;\n    }\n\n    ma_node_uninit(pNode, pAllocationCallbacks);\n    ma_loshelf2_uninit(&pLoshelfNode->loshelf, pAllocationCallbacks);\n}\n\n\n\n/*\nHigh Shelf Filter Node\n*/\nMA_API ma_hishelf_node_config ma_hishelf_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, double gainDB, double q, double frequency)\n{\n    ma_hishelf_node_config config;\n\n    config.nodeConfig = ma_node_config_init();\n    config.hishelf = ma_hishelf2_config_init(ma_format_f32, channels, sampleRate, gainDB, q, frequency);\n\n    return config;\n}\n\nstatic void ma_hishelf_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_hishelf_node* pBPFNode = (ma_hishelf_node*)pNode;\n\n    MA_ASSERT(pNode != NULL);\n    (void)pFrameCountIn;\n\n    ma_hishelf2_process_pcm_frames(&pBPFNode->hishelf, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut);\n}\n\nstatic ma_node_vtable g_ma_hishelf_node_vtable =\n{\n    ma_hishelf_node_process_pcm_frames,\n    NULL,   /* onGetRequiredInputFrameCount */\n    1,      /* One input. */\n    1,      /* One output. */\n    0       /* Default flags. */\n};\n\nMA_API ma_result ma_hishelf_node_init(ma_node_graph* pNodeGraph, const ma_hishelf_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_hishelf_node* pNode)\n{\n    ma_result result;\n    ma_node_config baseNodeConfig;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pNode);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->hishelf.format != ma_format_f32) {\n        return MA_INVALID_ARGS; /* The format must be f32. */\n    }\n\n    result = ma_hishelf2_init(&pConfig->hishelf, pAllocationCallbacks, &pNode->hishelf);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    baseNodeConfig = ma_node_config_init();\n    baseNodeConfig.vtable          = &g_ma_hishelf_node_vtable;\n    baseNodeConfig.pInputChannels  = &pConfig->hishelf.channels;\n    baseNodeConfig.pOutputChannels = &pConfig->hishelf.channels;\n\n    result = ma_node_init(pNodeGraph, &baseNodeConfig, pAllocationCallbacks, pNode);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return result;\n}\n\nMA_API ma_result ma_hishelf_node_reinit(const ma_hishelf_config* pConfig, ma_hishelf_node* pNode)\n{\n    ma_hishelf_node* pHishelfNode = (ma_hishelf_node*)pNode;\n\n    if (pNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_hishelf2_reinit(pConfig, &pHishelfNode->hishelf);\n}\n\nMA_API void ma_hishelf_node_uninit(ma_hishelf_node* pNode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_hishelf_node* pHishelfNode = (ma_hishelf_node*)pNode;\n\n    if (pNode == NULL) {\n        return;\n    }\n\n    ma_node_uninit(pNode, pAllocationCallbacks);\n    ma_hishelf2_uninit(&pHishelfNode->hishelf, pAllocationCallbacks);\n}\n\n\n\n\nMA_API ma_delay_node_config ma_delay_node_config_init(ma_uint32 channels, ma_uint32 sampleRate, ma_uint32 delayInFrames, float decay)\n{\n    ma_delay_node_config config;\n\n    config.nodeConfig = ma_node_config_init();\n    config.delay = ma_delay_config_init(channels, sampleRate, delayInFrames, decay);\n\n    return config;\n}\n\n\nstatic void ma_delay_node_process_pcm_frames(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_delay_node* pDelayNode = (ma_delay_node*)pNode;\n\n    (void)pFrameCountIn;\n\n    ma_delay_process_pcm_frames(&pDelayNode->delay, ppFramesOut[0], ppFramesIn[0], *pFrameCountOut);\n}\n\nstatic ma_node_vtable g_ma_delay_node_vtable =\n{\n    ma_delay_node_process_pcm_frames,\n    NULL,\n    1,  /* 1 input channels. */\n    1,  /* 1 output channel. */\n    MA_NODE_FLAG_CONTINUOUS_PROCESSING  /* Delay requires continuous processing to ensure the tail get's processed. */\n};\n\nMA_API ma_result ma_delay_node_init(ma_node_graph* pNodeGraph, const ma_delay_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_delay_node* pDelayNode)\n{\n    ma_result result;\n    ma_node_config baseConfig;\n\n    if (pDelayNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pDelayNode);\n\n    result = ma_delay_init(&pConfig->delay, pAllocationCallbacks, &pDelayNode->delay);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    baseConfig = pConfig->nodeConfig;\n    baseConfig.vtable          = &g_ma_delay_node_vtable;\n    baseConfig.pInputChannels  = &pConfig->delay.channels;\n    baseConfig.pOutputChannels = &pConfig->delay.channels;\n\n    result = ma_node_init(pNodeGraph, &baseConfig, pAllocationCallbacks, &pDelayNode->baseNode);\n    if (result != MA_SUCCESS) {\n        ma_delay_uninit(&pDelayNode->delay, pAllocationCallbacks);\n        return result;\n    }\n\n    return result;\n}\n\nMA_API void ma_delay_node_uninit(ma_delay_node* pDelayNode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pDelayNode == NULL) {\n        return;\n    }\n\n    /* The base node is always uninitialized first. */\n    ma_node_uninit(pDelayNode, pAllocationCallbacks);\n    ma_delay_uninit(&pDelayNode->delay, pAllocationCallbacks);\n}\n\nMA_API void ma_delay_node_set_wet(ma_delay_node* pDelayNode, float value)\n{\n    if (pDelayNode == NULL) {\n        return;\n    }\n\n    ma_delay_set_wet(&pDelayNode->delay, value);\n}\n\nMA_API float ma_delay_node_get_wet(const ma_delay_node* pDelayNode)\n{\n    if (pDelayNode == NULL) {\n        return 0;\n    }\n\n    return ma_delay_get_wet(&pDelayNode->delay);\n}\n\nMA_API void ma_delay_node_set_dry(ma_delay_node* pDelayNode, float value)\n{\n    if (pDelayNode == NULL) {\n        return;\n    }\n\n    ma_delay_set_dry(&pDelayNode->delay, value);\n}\n\nMA_API float ma_delay_node_get_dry(const ma_delay_node* pDelayNode)\n{\n    if (pDelayNode == NULL) {\n        return 0;\n    }\n\n    return ma_delay_get_dry(&pDelayNode->delay);\n}\n\nMA_API void ma_delay_node_set_decay(ma_delay_node* pDelayNode, float value)\n{\n    if (pDelayNode == NULL) {\n        return;\n    }\n\n    ma_delay_set_decay(&pDelayNode->delay, value);\n}\n\nMA_API float ma_delay_node_get_decay(const ma_delay_node* pDelayNode)\n{\n    if (pDelayNode == NULL) {\n        return 0;\n    }\n\n    return ma_delay_get_decay(&pDelayNode->delay);\n}\n#endif  /* MA_NO_NODE_GRAPH */\n\n\n/* SECTION: miniaudio_engine.c */\n#if !defined(MA_NO_ENGINE) && !defined(MA_NO_NODE_GRAPH)\n/**************************************************************************************************************************************************************\n\nEngine\n\n**************************************************************************************************************************************************************/\n#define MA_SEEK_TARGET_NONE         (~(ma_uint64)0)\n\n\nstatic void ma_sound_set_at_end(ma_sound* pSound, ma_bool32 atEnd)\n{\n    MA_ASSERT(pSound != NULL);\n    ma_atomic_exchange_32(&pSound->atEnd, atEnd);\n\n    /* Fire any callbacks or events. */\n    if (atEnd) {\n        if (pSound->endCallback != NULL) {\n            pSound->endCallback(pSound->pEndCallbackUserData, pSound);\n        }\n    }\n}\n\nstatic ma_bool32 ma_sound_get_at_end(const ma_sound* pSound)\n{\n    MA_ASSERT(pSound != NULL);\n    return ma_atomic_load_32(&pSound->atEnd);\n}\n\n\nMA_API ma_engine_node_config ma_engine_node_config_init(ma_engine* pEngine, ma_engine_node_type type, ma_uint32 flags)\n{\n    ma_engine_node_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.pEngine                  = pEngine;\n    config.type                     = type;\n    config.isPitchDisabled          = (flags & MA_SOUND_FLAG_NO_PITCH) != 0;\n    config.isSpatializationDisabled = (flags & MA_SOUND_FLAG_NO_SPATIALIZATION) != 0;\n    config.monoExpansionMode        = pEngine->monoExpansionMode;\n\n    return config;\n}\n\n\nstatic void ma_engine_node_update_pitch_if_required(ma_engine_node* pEngineNode)\n{\n    ma_bool32 isUpdateRequired = MA_FALSE;\n    float newPitch;\n\n    MA_ASSERT(pEngineNode != NULL);\n\n    newPitch = ma_atomic_load_explicit_f32(&pEngineNode->pitch, ma_atomic_memory_order_acquire);\n\n    if (pEngineNode->oldPitch != newPitch) {\n        pEngineNode->oldPitch  = newPitch;\n        isUpdateRequired = MA_TRUE;\n    }\n\n    if (pEngineNode->oldDopplerPitch != pEngineNode->spatializer.dopplerPitch) {\n        pEngineNode->oldDopplerPitch  = pEngineNode->spatializer.dopplerPitch;\n        isUpdateRequired = MA_TRUE;\n    }\n\n    if (isUpdateRequired) {\n        float basePitch = (float)pEngineNode->sampleRate / ma_engine_get_sample_rate(pEngineNode->pEngine);\n        ma_linear_resampler_set_rate_ratio(&pEngineNode->resampler, basePitch * pEngineNode->oldPitch * pEngineNode->oldDopplerPitch);\n    }\n}\n\nstatic ma_bool32 ma_engine_node_is_pitching_enabled(const ma_engine_node* pEngineNode)\n{\n    MA_ASSERT(pEngineNode != NULL);\n\n    /* Don't try to be clever by skiping resampling in the pitch=1 case or else you'll glitch when moving away from 1. */\n    return !ma_atomic_load_explicit_32(&pEngineNode->isPitchDisabled, ma_atomic_memory_order_acquire);\n}\n\nstatic ma_bool32 ma_engine_node_is_spatialization_enabled(const ma_engine_node* pEngineNode)\n{\n    MA_ASSERT(pEngineNode != NULL);\n\n    return !ma_atomic_load_explicit_32(&pEngineNode->isSpatializationDisabled, ma_atomic_memory_order_acquire);\n}\n\nstatic ma_uint64 ma_engine_node_get_required_input_frame_count(const ma_engine_node* pEngineNode, ma_uint64 outputFrameCount)\n{\n    ma_uint64 inputFrameCount = 0;\n\n    if (ma_engine_node_is_pitching_enabled(pEngineNode)) {\n        ma_result result = ma_linear_resampler_get_required_input_frame_count(&pEngineNode->resampler, outputFrameCount, &inputFrameCount);\n        if (result != MA_SUCCESS) {\n            inputFrameCount = 0;\n        }\n    } else {\n        inputFrameCount = outputFrameCount;    /* No resampling, so 1:1. */\n    }\n\n    return inputFrameCount;\n}\n\nstatic ma_result ma_engine_node_set_volume(ma_engine_node* pEngineNode, float volume)\n{\n    if (pEngineNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    ma_atomic_float_set(&pEngineNode->volume, volume);\n\n    /* If we're not smoothing we should bypass the volume gainer entirely. */\n    if (pEngineNode->volumeSmoothTimeInPCMFrames == 0) {\n        /* We should always have an active spatializer because it can be enabled and disabled dynamically. We can just use that for hodling our volume. */\n        ma_spatializer_set_master_volume(&pEngineNode->spatializer, volume);\n    } else {\n        /* We're using volume smoothing, so apply the master volume to the gainer. */\n        ma_gainer_set_gain(&pEngineNode->volumeGainer, volume);\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_engine_node_get_volume(const ma_engine_node* pEngineNode, float* pVolume)\n{\n    if (pVolume == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pVolume = 0.0f;\n\n    if (pEngineNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pVolume = ma_atomic_float_get((ma_atomic_float*)&pEngineNode->volume);\n\n    return MA_SUCCESS;\n}\n\n\nstatic void ma_engine_node_process_pcm_frames__general(ma_engine_node* pEngineNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    ma_uint32 frameCountIn;\n    ma_uint32 frameCountOut;\n    ma_uint32 totalFramesProcessedIn;\n    ma_uint32 totalFramesProcessedOut;\n    ma_uint32 channelsIn;\n    ma_uint32 channelsOut;\n    ma_bool32 isPitchingEnabled;\n    ma_bool32 isFadingEnabled;\n    ma_bool32 isSpatializationEnabled;\n    ma_bool32 isPanningEnabled;\n    ma_bool32 isVolumeSmoothingEnabled;\n\n    frameCountIn  = *pFrameCountIn;\n    frameCountOut = *pFrameCountOut;\n\n    channelsIn  = ma_spatializer_get_input_channels(&pEngineNode->spatializer);\n    channelsOut = ma_spatializer_get_output_channels(&pEngineNode->spatializer);\n\n    totalFramesProcessedIn  = 0;\n    totalFramesProcessedOut = 0;\n\n    /* Update the fader if applicable. */\n    {\n        ma_uint64 fadeLengthInFrames = ma_atomic_uint64_get(&pEngineNode->fadeSettings.fadeLengthInFrames);\n        if (fadeLengthInFrames != ~(ma_uint64)0) {\n            float fadeVolumeBeg = ma_atomic_float_get(&pEngineNode->fadeSettings.volumeBeg);\n            float fadeVolumeEnd = ma_atomic_float_get(&pEngineNode->fadeSettings.volumeEnd);\n            ma_int64 fadeStartOffsetInFrames = (ma_int64)ma_atomic_uint64_get(&pEngineNode->fadeSettings.absoluteGlobalTimeInFrames);\n            if (fadeStartOffsetInFrames == (ma_int64)(~(ma_uint64)0)) {\n                fadeStartOffsetInFrames = 0;\n            } else {\n                fadeStartOffsetInFrames -= ma_engine_get_time_in_pcm_frames(pEngineNode->pEngine);\n            }\n\n            ma_fader_set_fade_ex(&pEngineNode->fader, fadeVolumeBeg, fadeVolumeEnd, fadeLengthInFrames, fadeStartOffsetInFrames);\n\n            /* Reset the fade length so we don't erroneously apply it again. */\n            ma_atomic_uint64_set(&pEngineNode->fadeSettings.fadeLengthInFrames, ~(ma_uint64)0);\n        }\n    }\n\n    isPitchingEnabled        = ma_engine_node_is_pitching_enabled(pEngineNode);\n    isFadingEnabled          = pEngineNode->fader.volumeBeg != 1 || pEngineNode->fader.volumeEnd != 1;\n    isSpatializationEnabled  = ma_engine_node_is_spatialization_enabled(pEngineNode);\n    isPanningEnabled         = pEngineNode->panner.pan != 0 && channelsOut != 1;\n    isVolumeSmoothingEnabled = pEngineNode->volumeSmoothTimeInPCMFrames > 0;\n\n    /* Keep going while we've still got data available for processing. */\n    while (totalFramesProcessedOut < frameCountOut) {\n        /*\n        We need to process in a specific order. We always do resampling first because it's likely\n        we're going to be increasing the channel count after spatialization. Also, I want to do\n        fading based on the output sample rate.\n\n        We'll first read into a buffer from the resampler. Then we'll do all processing that\n        operates on the on the input channel count. We'll then get the spatializer to output to\n        the output buffer and then do all effects from that point directly in the output buffer\n        in-place.\n\n        Note that we're always running the resampler if pitching is enabled, even when the pitch\n        is 1. If we try to be clever and skip resampling when the pitch is 1, we'll get a glitch\n        when we move away from 1, back to 1, and then away from 1 again. We'll want to implement\n        any pitch=1 optimizations in the resampler itself.\n\n        There's a small optimization here that we'll utilize since it might be a fairly common\n        case. When the input and output channel counts are the same, we'll read straight into the\n        output buffer from the resampler and do everything in-place.\n        */\n        const float* pRunningFramesIn;\n        float* pRunningFramesOut;\n        float* pWorkingBuffer;   /* This is the buffer that we'll be processing frames in. This is in input channels. */\n        float temp[MA_DATA_CONVERTER_STACK_BUFFER_SIZE / sizeof(float)];\n        ma_uint32 tempCapInFrames = ma_countof(temp) / channelsIn;\n        ma_uint32 framesAvailableIn;\n        ma_uint32 framesAvailableOut;\n        ma_uint32 framesJustProcessedIn;\n        ma_uint32 framesJustProcessedOut;\n        ma_bool32 isWorkingBufferValid = MA_FALSE;\n\n        framesAvailableIn  = frameCountIn  - totalFramesProcessedIn;\n        framesAvailableOut = frameCountOut - totalFramesProcessedOut;\n\n        pRunningFramesIn  = ma_offset_pcm_frames_const_ptr_f32(ppFramesIn[0], totalFramesProcessedIn, channelsIn);\n        pRunningFramesOut = ma_offset_pcm_frames_ptr_f32(ppFramesOut[0], totalFramesProcessedOut, channelsOut);\n\n        if (channelsIn == channelsOut) {\n            /* Fast path. Channel counts are the same. No need for an intermediary input buffer. */\n            pWorkingBuffer = pRunningFramesOut;\n        } else {\n            /* Slow path. Channel counts are different. Need to use an intermediary input buffer. */\n            pWorkingBuffer = temp;\n            if (framesAvailableOut > tempCapInFrames) {\n                framesAvailableOut = tempCapInFrames;\n            }\n        }\n\n        /* First is resampler. */\n        if (isPitchingEnabled) {\n            ma_uint64 resampleFrameCountIn  = framesAvailableIn;\n            ma_uint64 resampleFrameCountOut = framesAvailableOut;\n\n            ma_linear_resampler_process_pcm_frames(&pEngineNode->resampler, pRunningFramesIn, &resampleFrameCountIn, pWorkingBuffer, &resampleFrameCountOut);\n            isWorkingBufferValid = MA_TRUE;\n\n            framesJustProcessedIn  = (ma_uint32)resampleFrameCountIn;\n            framesJustProcessedOut = (ma_uint32)resampleFrameCountOut;\n        } else {\n            framesJustProcessedIn  = ma_min(framesAvailableIn, framesAvailableOut);\n            framesJustProcessedOut = framesJustProcessedIn; /* When no resampling is being performed, the number of output frames is the same as input frames. */\n        }\n\n        /* Fading. */\n        if (isFadingEnabled) {\n            if (isWorkingBufferValid) {\n                ma_fader_process_pcm_frames(&pEngineNode->fader, pWorkingBuffer, pWorkingBuffer, framesJustProcessedOut);   /* In-place processing. */\n            } else {\n                ma_fader_process_pcm_frames(&pEngineNode->fader, pWorkingBuffer, pRunningFramesIn, framesJustProcessedOut);\n                isWorkingBufferValid = MA_TRUE;\n            }\n        }\n\n        /*\n        If we're using smoothing, we won't be applying volume via the spatializer, but instead from a ma_gainer. In this case\n        we'll want to apply our volume now.\n        */\n        if (isVolumeSmoothingEnabled) {\n            if (isWorkingBufferValid) {\n                ma_gainer_process_pcm_frames(&pEngineNode->volumeGainer, pWorkingBuffer, pWorkingBuffer, framesJustProcessedOut);\n            } else {\n                ma_gainer_process_pcm_frames(&pEngineNode->volumeGainer, pWorkingBuffer, pRunningFramesIn, framesJustProcessedOut);\n                isWorkingBufferValid = MA_TRUE;\n            }\n        }\n\n        /*\n        If at this point we still haven't actually done anything with the working buffer we need\n        to just read straight from the input buffer.\n        */\n        if (isWorkingBufferValid == MA_FALSE) {\n            pWorkingBuffer = (float*)pRunningFramesIn;  /* Naughty const cast, but it's safe at this point because we won't ever be writing to it from this point out. */\n        }\n\n        /* Spatialization. */\n        if (isSpatializationEnabled) {\n            ma_uint32 iListener;\n\n            /*\n            When determining the listener to use, we first check to see if the sound is pinned to a\n            specific listener. If so, we use that. Otherwise we just use the closest listener.\n            */\n            if (pEngineNode->pinnedListenerIndex != MA_LISTENER_INDEX_CLOSEST && pEngineNode->pinnedListenerIndex < ma_engine_get_listener_count(pEngineNode->pEngine)) {\n                iListener = pEngineNode->pinnedListenerIndex;\n            } else {\n                ma_vec3f spatializerPosition = ma_spatializer_get_position(&pEngineNode->spatializer);\n                iListener = ma_engine_find_closest_listener(pEngineNode->pEngine, spatializerPosition.x, spatializerPosition.y, spatializerPosition.z);\n            }\n\n            ma_spatializer_process_pcm_frames(&pEngineNode->spatializer, &pEngineNode->pEngine->listeners[iListener], pRunningFramesOut, pWorkingBuffer, framesJustProcessedOut);\n        } else {\n            /* No spatialization, but we still need to do channel conversion and master volume. */\n            float volume;\n            ma_engine_node_get_volume(pEngineNode, &volume);    /* Should never fail. */\n\n            if (channelsIn == channelsOut) {\n                /* No channel conversion required. Just copy straight to the output buffer. */\n                if (isVolumeSmoothingEnabled) {\n                    /* Volume has already been applied. Just copy straight to the output buffer. */\n                    ma_copy_pcm_frames(pRunningFramesOut, pWorkingBuffer, framesJustProcessedOut * channelsOut, ma_format_f32, channelsOut);\n                } else {\n                    /* Volume has not been applied yet. Copy and apply volume in the same pass. */\n                    ma_copy_and_apply_volume_factor_f32(pRunningFramesOut, pWorkingBuffer, framesJustProcessedOut * channelsOut, volume);\n                }\n            } else {\n                /* Channel conversion required. TODO: Add support for channel maps here. */\n                ma_channel_map_apply_f32(pRunningFramesOut, NULL, channelsOut, pWorkingBuffer, NULL, channelsIn, framesJustProcessedOut, ma_channel_mix_mode_simple, pEngineNode->monoExpansionMode);\n\n                /* If we're using smoothing, the volume will have already been applied. */\n                if (!isVolumeSmoothingEnabled) {\n                    ma_apply_volume_factor_f32(pRunningFramesOut, framesJustProcessedOut * channelsOut, volume);\n                }\n            }\n        }\n\n        /* At this point we can guarantee that the output buffer contains valid data. We can process everything in place now. */\n\n        /* Panning. */\n        if (isPanningEnabled) {\n            ma_panner_process_pcm_frames(&pEngineNode->panner, pRunningFramesOut, pRunningFramesOut, framesJustProcessedOut);   /* In-place processing. */\n        }\n\n        /* We're done for this chunk. */\n        totalFramesProcessedIn  += framesJustProcessedIn;\n        totalFramesProcessedOut += framesJustProcessedOut;\n\n        /* If we didn't process any output frames this iteration it means we've either run out of input data, or run out of room in the output buffer. */\n        if (framesJustProcessedOut == 0) {\n            break;\n        }\n    }\n\n    /* At this point we're done processing. */\n    *pFrameCountIn  = totalFramesProcessedIn;\n    *pFrameCountOut = totalFramesProcessedOut;\n}\n\nstatic void ma_engine_node_process_pcm_frames__sound(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    /* For sounds, we need to first read from the data source. Then we need to apply the engine effects (pan, pitch, fades, etc.). */\n    ma_result result = MA_SUCCESS;\n    ma_sound* pSound = (ma_sound*)pNode;\n    ma_uint32 frameCount = *pFrameCountOut;\n    ma_uint32 totalFramesRead = 0;\n    ma_format dataSourceFormat;\n    ma_uint32 dataSourceChannels;\n    ma_uint8 temp[MA_DATA_CONVERTER_STACK_BUFFER_SIZE];\n    ma_uint32 tempCapInFrames;\n    ma_uint64 seekTarget;\n\n    /* This is a data source node which means no input buses. */\n    (void)ppFramesIn;\n    (void)pFrameCountIn;\n\n    /* If we're marked at the end we need to stop the sound and do nothing. */\n    if (ma_sound_at_end(pSound)) {\n        ma_sound_stop(pSound);\n        *pFrameCountOut = 0;\n        return;\n    }\n\n    /* If we're seeking, do so now before reading. */\n    seekTarget = ma_atomic_load_64(&pSound->seekTarget);\n    if (seekTarget != MA_SEEK_TARGET_NONE) {\n        ma_data_source_seek_to_pcm_frame(pSound->pDataSource, seekTarget);\n\n        /* Any time-dependant effects need to have their times updated. */\n        ma_node_set_time(pSound, seekTarget);\n\n        ma_atomic_exchange_64(&pSound->seekTarget, MA_SEEK_TARGET_NONE);\n    }\n\n    /*\n    We want to update the pitch once. For sounds, this can be either at the start or at the end. If\n    we don't force this to only ever be updating once, we could end up in a situation where\n    retrieving the required input frame count ends up being different to what we actually retrieve.\n    What could happen is that the required input frame count is calculated, the pitch is update,\n    and then this processing function is called resulting in a different number of input frames\n    being processed. Do not call this in ma_engine_node_process_pcm_frames__general() or else\n    you'll hit the aforementioned bug.\n    */\n    ma_engine_node_update_pitch_if_required(&pSound->engineNode);\n\n    /*\n    For the convenience of the caller, we're doing to allow data sources to use non-floating-point formats and channel counts that differ\n    from the main engine.\n    */\n    result = ma_data_source_get_data_format(pSound->pDataSource, &dataSourceFormat, &dataSourceChannels, NULL, NULL, 0);\n    if (result == MA_SUCCESS) {\n        tempCapInFrames = sizeof(temp) / ma_get_bytes_per_frame(dataSourceFormat, dataSourceChannels);\n\n        /* Keep reading until we've read as much as was requested or we reach the end of the data source. */\n        while (totalFramesRead < frameCount) {\n            ma_uint32 framesRemaining = frameCount - totalFramesRead;\n            ma_uint32 framesToRead;\n            ma_uint64 framesJustRead;\n            ma_uint32 frameCountIn;\n            ma_uint32 frameCountOut;\n            const float* pRunningFramesIn;\n            float* pRunningFramesOut;\n\n            /*\n            The first thing we need to do is read into the temporary buffer. We can calculate exactly\n            how many input frames we'll need after resampling.\n            */\n            framesToRead = (ma_uint32)ma_engine_node_get_required_input_frame_count(&pSound->engineNode, framesRemaining);\n            if (framesToRead > tempCapInFrames) {\n                framesToRead = tempCapInFrames;\n            }\n\n            result = ma_data_source_read_pcm_frames(pSound->pDataSource, temp, framesToRead, &framesJustRead);\n\n            /* If we reached the end of the sound we'll want to mark it as at the end and stop it. This should never be returned for looping sounds. */\n            if (result == MA_AT_END) {\n                ma_sound_set_at_end(pSound, MA_TRUE);   /* This will be set to false in ma_sound_start(). */\n            }\n\n            pRunningFramesOut = ma_offset_pcm_frames_ptr_f32(ppFramesOut[0], totalFramesRead, ma_engine_get_channels(ma_sound_get_engine(pSound)));\n\n            frameCountIn = (ma_uint32)framesJustRead;\n            frameCountOut = framesRemaining;\n\n            /* Convert if necessary. */\n            if (dataSourceFormat == ma_format_f32) {\n                /* Fast path. No data conversion necessary. */\n                pRunningFramesIn = (float*)temp;\n                ma_engine_node_process_pcm_frames__general(&pSound->engineNode, &pRunningFramesIn, &frameCountIn, &pRunningFramesOut, &frameCountOut);\n            } else {\n                /* Slow path. Need to do sample format conversion to f32. If we give the f32 buffer the same count as the first temp buffer, we're guaranteed it'll be large enough. */\n                float tempf32[MA_DATA_CONVERTER_STACK_BUFFER_SIZE]; /* Do not do `MA_DATA_CONVERTER_STACK_BUFFER_SIZE/sizeof(float)` here like we've done in other places. */\n                ma_convert_pcm_frames_format(tempf32, ma_format_f32, temp, dataSourceFormat, framesJustRead, dataSourceChannels, ma_dither_mode_none);\n\n                /* Now that we have our samples in f32 format we can process like normal. */\n                pRunningFramesIn = tempf32;\n                ma_engine_node_process_pcm_frames__general(&pSound->engineNode, &pRunningFramesIn, &frameCountIn, &pRunningFramesOut, &frameCountOut);\n            }\n\n            /* We should have processed all of our input frames since we calculated the required number of input frames at the top. */\n            MA_ASSERT(frameCountIn == framesJustRead);\n            totalFramesRead += (ma_uint32)frameCountOut;   /* Safe cast. */\n\n            if (result != MA_SUCCESS || ma_sound_at_end(pSound)) {\n                break;  /* Might have reached the end. */\n            }\n        }\n    }\n\n    *pFrameCountOut = totalFramesRead;\n}\n\nstatic void ma_engine_node_process_pcm_frames__group(ma_node* pNode, const float** ppFramesIn, ma_uint32* pFrameCountIn, float** ppFramesOut, ma_uint32* pFrameCountOut)\n{\n    /*\n    Make sure the pitch is updated before trying to read anything. It's important that this is done\n    only once and not in ma_engine_node_process_pcm_frames__general(). The reason for this is that\n    ma_engine_node_process_pcm_frames__general() will call ma_engine_node_get_required_input_frame_count(),\n    and if another thread modifies the pitch just after that call it can result in a glitch due to\n    the input rate changing.\n    */\n    ma_engine_node_update_pitch_if_required((ma_engine_node*)pNode);\n\n    /* For groups, the input data has already been read and we just need to apply the effect. */\n    ma_engine_node_process_pcm_frames__general((ma_engine_node*)pNode, ppFramesIn, pFrameCountIn, ppFramesOut, pFrameCountOut);\n}\n\nstatic ma_result ma_engine_node_get_required_input_frame_count__group(ma_node* pNode, ma_uint32 outputFrameCount, ma_uint32* pInputFrameCount)\n{\n    ma_uint64 inputFrameCount;\n\n    MA_ASSERT(pInputFrameCount != NULL);\n\n    /* Our pitch will affect this calculation. We need to update it. */\n    ma_engine_node_update_pitch_if_required((ma_engine_node*)pNode);\n\n    inputFrameCount = ma_engine_node_get_required_input_frame_count((ma_engine_node*)pNode, outputFrameCount);\n    if (inputFrameCount > 0xFFFFFFFF) {\n        inputFrameCount = 0xFFFFFFFF;    /* Will never happen because miniaudio will only ever process in relatively small chunks. */\n    }\n\n    *pInputFrameCount = (ma_uint32)inputFrameCount;\n\n    return MA_SUCCESS;\n}\n\n\nstatic ma_node_vtable g_ma_engine_node_vtable__sound =\n{\n    ma_engine_node_process_pcm_frames__sound,\n    NULL,   /* onGetRequiredInputFrameCount */\n    0,      /* Sounds are data source nodes which means they have zero inputs (their input is drawn from the data source itself). */\n    1,      /* Sounds have one output bus. */\n    0       /* Default flags. */\n};\n\nstatic ma_node_vtable g_ma_engine_node_vtable__group =\n{\n    ma_engine_node_process_pcm_frames__group,\n    ma_engine_node_get_required_input_frame_count__group,\n    1,      /* Groups have one input bus. */\n    1,      /* Groups have one output bus. */\n    MA_NODE_FLAG_DIFFERENT_PROCESSING_RATES /* The engine node does resampling so should let miniaudio know about it. */\n};\n\n\n\nstatic ma_node_config ma_engine_node_base_node_config_init(const ma_engine_node_config* pConfig)\n{\n    ma_node_config baseNodeConfig;\n\n    if (pConfig->type == ma_engine_node_type_sound) {\n        /* Sound. */\n        baseNodeConfig = ma_node_config_init();\n        baseNodeConfig.vtable       = &g_ma_engine_node_vtable__sound;\n        baseNodeConfig.initialState = ma_node_state_stopped;    /* Sounds are stopped by default. */\n    } else {\n        /* Group. */\n        baseNodeConfig = ma_node_config_init();\n        baseNodeConfig.vtable       = &g_ma_engine_node_vtable__group;\n        baseNodeConfig.initialState = ma_node_state_started;    /* Groups are started by default. */\n    }\n\n    return baseNodeConfig;\n}\n\nstatic ma_spatializer_config ma_engine_node_spatializer_config_init(const ma_node_config* pBaseNodeConfig)\n{\n    return ma_spatializer_config_init(pBaseNodeConfig->pInputChannels[0], pBaseNodeConfig->pOutputChannels[0]);\n}\n\ntypedef struct\n{\n    size_t sizeInBytes;\n    size_t baseNodeOffset;\n    size_t resamplerOffset;\n    size_t spatializerOffset;\n    size_t gainerOffset;\n} ma_engine_node_heap_layout;\n\nstatic ma_result ma_engine_node_get_heap_layout(const ma_engine_node_config* pConfig, ma_engine_node_heap_layout* pHeapLayout)\n{\n    ma_result result;\n    size_t tempHeapSize;\n    ma_node_config baseNodeConfig;\n    ma_linear_resampler_config resamplerConfig;\n    ma_spatializer_config spatializerConfig;\n    ma_gainer_config gainerConfig;\n    ma_uint32 channelsIn;\n    ma_uint32 channelsOut;\n    ma_channel defaultStereoChannelMap[2] = {MA_CHANNEL_SIDE_LEFT, MA_CHANNEL_SIDE_RIGHT};  /* <-- Consistent with the default channel map of a stereo listener. Means channel conversion can run on a fast path. */\n\n    MA_ASSERT(pHeapLayout);\n\n    MA_ZERO_OBJECT(pHeapLayout);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    if (pConfig->pEngine == NULL) {\n        return MA_INVALID_ARGS; /* An engine must be specified. */\n    }\n\n    pHeapLayout->sizeInBytes = 0;\n\n    channelsIn  = (pConfig->channelsIn  != 0) ? pConfig->channelsIn  : ma_engine_get_channels(pConfig->pEngine);\n    channelsOut = (pConfig->channelsOut != 0) ? pConfig->channelsOut : ma_engine_get_channels(pConfig->pEngine);\n\n\n    /* Base node. */\n    baseNodeConfig = ma_engine_node_base_node_config_init(pConfig);\n    baseNodeConfig.pInputChannels  = &channelsIn;\n    baseNodeConfig.pOutputChannels = &channelsOut;\n\n    result = ma_node_get_heap_size(ma_engine_get_node_graph(pConfig->pEngine), &baseNodeConfig, &tempHeapSize);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to retrieve the size of the heap for the base node. */\n    }\n\n    pHeapLayout->baseNodeOffset = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += ma_align_64(tempHeapSize);\n\n\n    /* Resmapler. */\n    resamplerConfig = ma_linear_resampler_config_init(ma_format_f32, channelsIn, 1, 1); /* Input and output sample rates don't affect the calculation of the heap size. */\n    resamplerConfig.lpfOrder = 0;\n\n    result = ma_linear_resampler_get_heap_size(&resamplerConfig, &tempHeapSize);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to retrieve the size of the heap for the resampler. */\n    }\n\n    pHeapLayout->resamplerOffset = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += ma_align_64(tempHeapSize);\n\n\n    /* Spatializer. */\n    spatializerConfig = ma_engine_node_spatializer_config_init(&baseNodeConfig);\n\n    if (spatializerConfig.channelsIn == 2) {\n        spatializerConfig.pChannelMapIn = defaultStereoChannelMap;\n    }\n\n    result = ma_spatializer_get_heap_size(&spatializerConfig, &tempHeapSize);\n    if (result != MA_SUCCESS) {\n        return result;  /* Failed to retrieve the size of the heap for the spatializer. */\n    }\n\n    pHeapLayout->spatializerOffset = pHeapLayout->sizeInBytes;\n    pHeapLayout->sizeInBytes += ma_align_64(tempHeapSize);\n\n\n    /* Gainer. Will not be used if we are not using smoothing. */\n    if (pConfig->volumeSmoothTimeInPCMFrames > 0) {\n        gainerConfig = ma_gainer_config_init(channelsIn, pConfig->volumeSmoothTimeInPCMFrames);\n\n        result = ma_gainer_get_heap_size(&gainerConfig, &tempHeapSize);\n        if (result != MA_SUCCESS) {\n            return result;\n        }\n\n        pHeapLayout->gainerOffset = pHeapLayout->sizeInBytes;\n        pHeapLayout->sizeInBytes += ma_align_64(tempHeapSize);\n    }\n\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_engine_node_get_heap_size(const ma_engine_node_config* pConfig, size_t* pHeapSizeInBytes)\n{\n    ma_result result;\n    ma_engine_node_heap_layout heapLayout;\n\n    if (pHeapSizeInBytes == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    *pHeapSizeInBytes = 0;\n\n    result = ma_engine_node_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    *pHeapSizeInBytes = heapLayout.sizeInBytes;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_engine_node_init_preallocated(const ma_engine_node_config* pConfig, void* pHeap, ma_engine_node* pEngineNode)\n{\n    ma_result result;\n    ma_engine_node_heap_layout heapLayout;\n    ma_node_config baseNodeConfig;\n    ma_linear_resampler_config resamplerConfig;\n    ma_fader_config faderConfig;\n    ma_spatializer_config spatializerConfig;\n    ma_panner_config pannerConfig;\n    ma_gainer_config gainerConfig;\n    ma_uint32 channelsIn;\n    ma_uint32 channelsOut;\n    ma_channel defaultStereoChannelMap[2] = {MA_CHANNEL_SIDE_LEFT, MA_CHANNEL_SIDE_RIGHT};  /* <-- Consistent with the default channel map of a stereo listener. Means channel conversion can run on a fast path. */\n\n    if (pEngineNode == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pEngineNode);\n\n    result = ma_engine_node_get_heap_layout(pConfig, &heapLayout);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pConfig->pinnedListenerIndex != MA_LISTENER_INDEX_CLOSEST && pConfig->pinnedListenerIndex >= ma_engine_get_listener_count(pConfig->pEngine)) {\n        return MA_INVALID_ARGS; /* Invalid listener. */\n    }\n\n    pEngineNode->_pHeap = pHeap;\n    MA_ZERO_MEMORY(pHeap, heapLayout.sizeInBytes);\n\n    pEngineNode->pEngine                     = pConfig->pEngine;\n    pEngineNode->sampleRate                  = (pConfig->sampleRate > 0) ? pConfig->sampleRate : ma_engine_get_sample_rate(pEngineNode->pEngine);\n    pEngineNode->volumeSmoothTimeInPCMFrames = pConfig->volumeSmoothTimeInPCMFrames;\n    pEngineNode->monoExpansionMode           = pConfig->monoExpansionMode;\n    ma_atomic_float_set(&pEngineNode->volume, 1);\n    pEngineNode->pitch                       = 1;\n    pEngineNode->oldPitch                    = 1;\n    pEngineNode->oldDopplerPitch             = 1;\n    pEngineNode->isPitchDisabled             = pConfig->isPitchDisabled;\n    pEngineNode->isSpatializationDisabled    = pConfig->isSpatializationDisabled;\n    pEngineNode->pinnedListenerIndex         = pConfig->pinnedListenerIndex;\n    ma_atomic_float_set(&pEngineNode->fadeSettings.volumeBeg, 1);\n    ma_atomic_float_set(&pEngineNode->fadeSettings.volumeEnd, 1);\n    ma_atomic_uint64_set(&pEngineNode->fadeSettings.fadeLengthInFrames, (~(ma_uint64)0));\n    ma_atomic_uint64_set(&pEngineNode->fadeSettings.absoluteGlobalTimeInFrames, (~(ma_uint64)0));   /* <-- Indicates that the fade should start immediately. */\n\n    channelsIn  = (pConfig->channelsIn  != 0) ? pConfig->channelsIn  : ma_engine_get_channels(pConfig->pEngine);\n    channelsOut = (pConfig->channelsOut != 0) ? pConfig->channelsOut : ma_engine_get_channels(pConfig->pEngine);\n\n    /*\n    If the sample rate of the sound is different to the engine, make sure pitching is enabled so that the resampler\n    is activated. Not doing this will result in the sound not being resampled if MA_SOUND_FLAG_NO_PITCH is used.\n    */\n    if (pEngineNode->sampleRate != ma_engine_get_sample_rate(pEngineNode->pEngine)) {\n        pEngineNode->isPitchDisabled = MA_FALSE;\n    }\n\n\n    /* Base node. */\n    baseNodeConfig = ma_engine_node_base_node_config_init(pConfig);\n    baseNodeConfig.pInputChannels  = &channelsIn;\n    baseNodeConfig.pOutputChannels = &channelsOut;\n\n    result = ma_node_init_preallocated(&pConfig->pEngine->nodeGraph, &baseNodeConfig, ma_offset_ptr(pHeap, heapLayout.baseNodeOffset), &pEngineNode->baseNode);\n    if (result != MA_SUCCESS) {\n        goto error0;\n    }\n\n\n    /*\n    We can now initialize the effects we need in order to implement the engine node. There's a\n    defined order of operations here, mainly centered around when we convert our channels from the\n    data source's native channel count to the engine's channel count. As a rule, we want to do as\n    much computation as possible before spatialization because there's a chance that will increase\n    the channel count, thereby increasing the amount of work needing to be done to process.\n    */\n\n    /* We'll always do resampling first. */\n    resamplerConfig = ma_linear_resampler_config_init(ma_format_f32, baseNodeConfig.pInputChannels[0], pEngineNode->sampleRate, ma_engine_get_sample_rate(pEngineNode->pEngine));\n    resamplerConfig.lpfOrder = 0;    /* <-- Need to disable low-pass filtering for pitch shifting for now because there's cases where the biquads are becoming unstable. Need to figure out a better fix for this. */\n\n    result = ma_linear_resampler_init_preallocated(&resamplerConfig, ma_offset_ptr(pHeap, heapLayout.resamplerOffset), &pEngineNode->resampler);\n    if (result != MA_SUCCESS) {\n        goto error1;\n    }\n\n\n    /* After resampling will come the fader. */\n    faderConfig = ma_fader_config_init(ma_format_f32, baseNodeConfig.pInputChannels[0], ma_engine_get_sample_rate(pEngineNode->pEngine));\n\n    result = ma_fader_init(&faderConfig, &pEngineNode->fader);\n    if (result != MA_SUCCESS) {\n        goto error2;\n    }\n\n\n    /*\n    Spatialization comes next. We spatialize based ont he node's output channel count. It's up the caller to\n    ensure channels counts link up correctly in the node graph.\n    */\n    spatializerConfig = ma_engine_node_spatializer_config_init(&baseNodeConfig);\n    spatializerConfig.gainSmoothTimeInFrames = pEngineNode->pEngine->gainSmoothTimeInFrames;\n\n    if (spatializerConfig.channelsIn == 2) {\n        spatializerConfig.pChannelMapIn = defaultStereoChannelMap;\n    }\n\n    result = ma_spatializer_init_preallocated(&spatializerConfig, ma_offset_ptr(pHeap, heapLayout.spatializerOffset), &pEngineNode->spatializer);\n    if (result != MA_SUCCESS) {\n        goto error2;\n    }\n\n\n    /*\n    After spatialization comes panning. We need to do this after spatialization because otherwise we wouldn't\n    be able to pan mono sounds.\n    */\n    pannerConfig = ma_panner_config_init(ma_format_f32, baseNodeConfig.pOutputChannels[0]);\n\n    result = ma_panner_init(&pannerConfig, &pEngineNode->panner);\n    if (result != MA_SUCCESS) {\n        goto error3;\n    }\n\n\n    /* We'll need a gainer for smoothing out volume changes if we have a non-zero smooth time. We apply this before converting to the output channel count. */\n    if (pConfig->volumeSmoothTimeInPCMFrames > 0) {\n        gainerConfig = ma_gainer_config_init(channelsIn, pConfig->volumeSmoothTimeInPCMFrames);\n\n        result = ma_gainer_init_preallocated(&gainerConfig, ma_offset_ptr(pHeap, heapLayout.gainerOffset), &pEngineNode->volumeGainer);\n        if (result != MA_SUCCESS) {\n            goto error3;\n        }\n    }\n\n\n    return MA_SUCCESS;\n\n    /* No need for allocation callbacks here because we use a preallocated heap. */\nerror3: ma_spatializer_uninit(&pEngineNode->spatializer, NULL);\nerror2: ma_linear_resampler_uninit(&pEngineNode->resampler, NULL);\nerror1: ma_node_uninit(&pEngineNode->baseNode, NULL);\nerror0: return result;\n}\n\nMA_API ma_result ma_engine_node_init(const ma_engine_node_config* pConfig, const ma_allocation_callbacks* pAllocationCallbacks, ma_engine_node* pEngineNode)\n{\n    ma_result result;\n    size_t heapSizeInBytes;\n    void* pHeap;\n\n    result = ma_engine_node_get_heap_size(pConfig, &heapSizeInBytes);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (heapSizeInBytes > 0) {\n        pHeap = ma_malloc(heapSizeInBytes, pAllocationCallbacks);\n        if (pHeap == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n    } else {\n        pHeap = NULL;\n    }\n\n    result = ma_engine_node_init_preallocated(pConfig, pHeap, pEngineNode);\n    if (result != MA_SUCCESS) {\n        ma_free(pHeap, pAllocationCallbacks);\n        return result;\n    }\n\n    pEngineNode->_ownsHeap = MA_TRUE;\n    return MA_SUCCESS;\n}\n\nMA_API void ma_engine_node_uninit(ma_engine_node* pEngineNode, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    /*\n    The base node always needs to be uninitialized first to ensure it's detached from the graph completely before we\n    destroy anything that might be in the middle of being used by the processing function.\n    */\n    ma_node_uninit(&pEngineNode->baseNode, pAllocationCallbacks);\n\n    /* Now that the node has been uninitialized we can safely uninitialize the rest. */\n    if (pEngineNode->volumeSmoothTimeInPCMFrames > 0) {\n        ma_gainer_uninit(&pEngineNode->volumeGainer, pAllocationCallbacks);\n    }\n\n    ma_spatializer_uninit(&pEngineNode->spatializer, pAllocationCallbacks);\n    ma_linear_resampler_uninit(&pEngineNode->resampler, pAllocationCallbacks);\n\n    /* Free the heap last. */\n    if (pEngineNode->_ownsHeap) {\n        ma_free(pEngineNode->_pHeap, pAllocationCallbacks);\n    }\n}\n\n\nMA_API ma_sound_config ma_sound_config_init(void)\n{\n    return ma_sound_config_init_2(NULL);\n}\n\nMA_API ma_sound_config ma_sound_config_init_2(ma_engine* pEngine)\n{\n    ma_sound_config config;\n\n    MA_ZERO_OBJECT(&config);\n\n    if (pEngine != NULL) {\n        config.monoExpansionMode = pEngine->monoExpansionMode;\n    } else {\n        config.monoExpansionMode = ma_mono_expansion_mode_default;\n    }\n\n    config.rangeEndInPCMFrames     = ~((ma_uint64)0);\n    config.loopPointEndInPCMFrames = ~((ma_uint64)0);\n\n    return config;\n}\n\nMA_API ma_sound_group_config ma_sound_group_config_init(void)\n{\n    return ma_sound_group_config_init_2(NULL);\n}\n\nMA_API ma_sound_group_config ma_sound_group_config_init_2(ma_engine* pEngine)\n{\n    ma_sound_group_config config;\n\n    MA_ZERO_OBJECT(&config);\n\n    if (pEngine != NULL) {\n        config.monoExpansionMode = pEngine->monoExpansionMode;\n    } else {\n        config.monoExpansionMode = ma_mono_expansion_mode_default;\n    }\n\n    return config;\n}\n\n\nMA_API ma_engine_config ma_engine_config_init(void)\n{\n    ma_engine_config config;\n\n    MA_ZERO_OBJECT(&config);\n    config.listenerCount     = 1;   /* Always want at least one listener. */\n    config.monoExpansionMode = ma_mono_expansion_mode_default;\n\n    return config;\n}\n\n\n#if !defined(MA_NO_DEVICE_IO)\nstatic void ma_engine_data_callback_internal(ma_device* pDevice, void* pFramesOut, const void* pFramesIn, ma_uint32 frameCount)\n{\n    ma_engine* pEngine = (ma_engine*)pDevice->pUserData;\n\n    (void)pFramesIn;\n\n    /*\n    Experiment: Try processing a resource manager job if we're on the Emscripten build.\n\n    This serves two purposes:\n\n        1) It ensures jobs are actually processed at some point since we cannot guarantee that the\n           caller is doing the right thing and calling ma_resource_manager_process_next_job(); and\n\n        2) It's an attempt at working around an issue where processing jobs on the Emscripten main\n           loop doesn't work as well as it should. When trying to load sounds without the `DECODE`\n           flag or with the `ASYNC` flag, the sound data is just not able to be loaded in time\n           before the callback is processed. I think it's got something to do with the single-\n           threaded nature of Web, but I'm not entirely sure.\n    */\n    #if !defined(MA_NO_RESOURCE_MANAGER) && defined(MA_EMSCRIPTEN)\n    {\n        if (pEngine->pResourceManager != NULL) {\n            if ((pEngine->pResourceManager->config.flags & MA_RESOURCE_MANAGER_FLAG_NO_THREADING) != 0) {\n                ma_resource_manager_process_next_job(pEngine->pResourceManager);\n            }\n        }\n    }\n    #endif\n\n    ma_engine_read_pcm_frames(pEngine, pFramesOut, frameCount, NULL);\n}\n#endif\n\nMA_API ma_result ma_engine_init(const ma_engine_config* pConfig, ma_engine* pEngine)\n{\n    ma_result result;\n    ma_node_graph_config nodeGraphConfig;\n    ma_engine_config engineConfig;\n    ma_spatializer_listener_config listenerConfig;\n    ma_uint32 iListener;\n\n    if (pEngine == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pEngine);\n\n    /* The config is allowed to be NULL in which case we use defaults for everything. */\n    if (pConfig != NULL) {\n        engineConfig = *pConfig;\n    } else {\n        engineConfig = ma_engine_config_init();\n    }\n\n    pEngine->monoExpansionMode = engineConfig.monoExpansionMode;\n    pEngine->defaultVolumeSmoothTimeInPCMFrames = engineConfig.defaultVolumeSmoothTimeInPCMFrames;\n    pEngine->onProcess = engineConfig.onProcess;\n    pEngine->pProcessUserData = engineConfig.pProcessUserData;\n    ma_allocation_callbacks_init_copy(&pEngine->allocationCallbacks, &engineConfig.allocationCallbacks);\n\n    #if !defined(MA_NO_RESOURCE_MANAGER)\n    {\n        pEngine->pResourceManager = engineConfig.pResourceManager;\n    }\n    #endif\n\n    #if !defined(MA_NO_DEVICE_IO)\n    {\n        pEngine->pDevice = engineConfig.pDevice;\n\n        /* If we don't have a device, we need one. */\n        if (pEngine->pDevice == NULL && engineConfig.noDevice == MA_FALSE) {\n            ma_device_config deviceConfig;\n\n            pEngine->pDevice = (ma_device*)ma_malloc(sizeof(*pEngine->pDevice), &pEngine->allocationCallbacks);\n            if (pEngine->pDevice == NULL) {\n                return MA_OUT_OF_MEMORY;\n            }\n\n            deviceConfig = ma_device_config_init(ma_device_type_playback);\n            deviceConfig.playback.pDeviceID        = engineConfig.pPlaybackDeviceID;\n            deviceConfig.playback.format           = ma_format_f32;\n            deviceConfig.playback.channels         = engineConfig.channels;\n            deviceConfig.sampleRate                = engineConfig.sampleRate;\n            deviceConfig.dataCallback              = (engineConfig.dataCallback != NULL) ? engineConfig.dataCallback : ma_engine_data_callback_internal;\n            deviceConfig.pUserData                 = pEngine;\n            deviceConfig.notificationCallback      = engineConfig.notificationCallback;\n            deviceConfig.periodSizeInFrames        = engineConfig.periodSizeInFrames;\n            deviceConfig.periodSizeInMilliseconds  = engineConfig.periodSizeInMilliseconds;\n            deviceConfig.noPreSilencedOutputBuffer = MA_TRUE;    /* We'll always be outputting to every frame in the callback so there's no need for a pre-silenced buffer. */\n            deviceConfig.noClip                    = MA_TRUE;    /* The engine will do clipping itself. */\n\n            if (engineConfig.pContext == NULL) {\n                ma_context_config contextConfig = ma_context_config_init();\n                contextConfig.allocationCallbacks = pEngine->allocationCallbacks;\n                contextConfig.pLog = engineConfig.pLog;\n\n                /* If the engine config does not specify a log, use the resource manager's if we have one. */\n                #ifndef MA_NO_RESOURCE_MANAGER\n                {\n                    if (contextConfig.pLog == NULL && engineConfig.pResourceManager != NULL) {\n                        contextConfig.pLog = ma_resource_manager_get_log(engineConfig.pResourceManager);\n                    }\n                }\n                #endif\n\n                result = ma_device_init_ex(NULL, 0, &contextConfig, &deviceConfig, pEngine->pDevice);\n            } else {\n                result = ma_device_init(engineConfig.pContext, &deviceConfig, pEngine->pDevice);\n            }\n\n            if (result != MA_SUCCESS) {\n                ma_free(pEngine->pDevice, &pEngine->allocationCallbacks);\n                pEngine->pDevice = NULL;\n                return result;\n            }\n\n            pEngine->ownsDevice = MA_TRUE;\n        }\n\n        /* Update the channel count and sample rate of the engine config so we can reference it below. */\n        if (pEngine->pDevice != NULL) {\n            engineConfig.channels   = pEngine->pDevice->playback.channels;\n            engineConfig.sampleRate = pEngine->pDevice->sampleRate;\n        }\n    }\n    #endif\n\n    if (engineConfig.channels == 0 || engineConfig.sampleRate == 0) {\n        return MA_INVALID_ARGS;\n    }\n\n    pEngine->sampleRate = engineConfig.sampleRate;\n\n    /* The engine always uses either the log that was passed into the config, or the context's log is available. */\n    if (engineConfig.pLog != NULL) {\n        pEngine->pLog = engineConfig.pLog;\n    } else {\n        #if !defined(MA_NO_DEVICE_IO)\n        {\n            pEngine->pLog = ma_device_get_log(pEngine->pDevice);\n        }\n        #else\n        {\n            pEngine->pLog = NULL;\n        }\n        #endif\n    }\n\n\n    /* The engine is a node graph. This needs to be initialized after we have the device so we can can determine the channel count. */\n    nodeGraphConfig = ma_node_graph_config_init(engineConfig.channels);\n    nodeGraphConfig.nodeCacheCapInFrames = (engineConfig.periodSizeInFrames > 0xFFFF) ? 0xFFFF : (ma_uint16)engineConfig.periodSizeInFrames;\n\n    result = ma_node_graph_init(&nodeGraphConfig, &pEngine->allocationCallbacks, &pEngine->nodeGraph);\n    if (result != MA_SUCCESS) {\n        goto on_error_1;\n    }\n\n\n    /* We need at least one listener. */\n    if (engineConfig.listenerCount == 0) {\n        engineConfig.listenerCount = 1;\n    }\n\n    if (engineConfig.listenerCount > MA_ENGINE_MAX_LISTENERS) {\n        result = MA_INVALID_ARGS;   /* Too many listeners. */\n        goto on_error_1;\n    }\n\n    for (iListener = 0; iListener < engineConfig.listenerCount; iListener += 1) {\n        listenerConfig = ma_spatializer_listener_config_init(ma_node_graph_get_channels(&pEngine->nodeGraph));\n\n        /*\n        If we're using a device, use the device's channel map for the listener. Otherwise just use\n        miniaudio's default channel map.\n        */\n        #if !defined(MA_NO_DEVICE_IO)\n        {\n            if (pEngine->pDevice != NULL) {\n                /*\n                Temporarily disabled. There is a subtle bug here where front-left and front-right\n                will be used by the device's channel map, but this is not what we want to use for\n                spatialization. Instead we want to use side-left and side-right. I need to figure\n                out a better solution for this. For now, disabling the use of device channel maps.\n                */\n                /*listenerConfig.pChannelMapOut = pEngine->pDevice->playback.channelMap;*/\n            }\n        }\n        #endif\n\n        result = ma_spatializer_listener_init(&listenerConfig, &pEngine->allocationCallbacks, &pEngine->listeners[iListener]);  /* TODO: Change this to a pre-allocated heap. */\n        if (result != MA_SUCCESS) {\n            goto on_error_2;\n        }\n\n        pEngine->listenerCount += 1;\n    }\n\n\n    /* Gain smoothing for spatialized sounds. */\n    pEngine->gainSmoothTimeInFrames = engineConfig.gainSmoothTimeInFrames;\n    if (pEngine->gainSmoothTimeInFrames == 0) {\n        ma_uint32 gainSmoothTimeInMilliseconds = engineConfig.gainSmoothTimeInMilliseconds;\n        if (gainSmoothTimeInMilliseconds == 0) {\n            gainSmoothTimeInMilliseconds = 8;\n        }\n\n        pEngine->gainSmoothTimeInFrames = (gainSmoothTimeInMilliseconds * ma_engine_get_sample_rate(pEngine)) / 1000;  /* 8ms by default. */\n    }\n\n\n    /* We need a resource manager. */\n    #ifndef MA_NO_RESOURCE_MANAGER\n    {\n        if (pEngine->pResourceManager == NULL) {\n            ma_resource_manager_config resourceManagerConfig;\n\n            pEngine->pResourceManager = (ma_resource_manager*)ma_malloc(sizeof(*pEngine->pResourceManager), &pEngine->allocationCallbacks);\n            if (pEngine->pResourceManager == NULL) {\n                result = MA_OUT_OF_MEMORY;\n                goto on_error_2;\n            }\n\n            resourceManagerConfig = ma_resource_manager_config_init();\n            resourceManagerConfig.pLog              = pEngine->pLog;    /* Always use the engine's log for internally-managed resource managers. */\n            resourceManagerConfig.decodedFormat     = ma_format_f32;\n            resourceManagerConfig.decodedChannels   = 0;  /* Leave the decoded channel count as 0 so we can get good spatialization. */\n            resourceManagerConfig.decodedSampleRate = ma_engine_get_sample_rate(pEngine);\n            ma_allocation_callbacks_init_copy(&resourceManagerConfig.allocationCallbacks, &pEngine->allocationCallbacks);\n            resourceManagerConfig.pVFS              = engineConfig.pResourceManagerVFS;\n\n            /* The Emscripten build cannot use threads. */\n            #if defined(MA_EMSCRIPTEN)\n            {\n                resourceManagerConfig.jobThreadCount = 0;\n                resourceManagerConfig.flags |= MA_RESOURCE_MANAGER_FLAG_NO_THREADING;\n            }\n            #endif\n\n            result = ma_resource_manager_init(&resourceManagerConfig, pEngine->pResourceManager);\n            if (result != MA_SUCCESS) {\n                goto on_error_3;\n            }\n\n            pEngine->ownsResourceManager = MA_TRUE;\n        }\n    }\n    #endif\n\n    /* Setup some stuff for inlined sounds. That is sounds played with ma_engine_play_sound(). */\n    pEngine->inlinedSoundLock  = 0;\n    pEngine->pInlinedSoundHead = NULL;\n\n    /* Start the engine if required. This should always be the last step. */\n    #if !defined(MA_NO_DEVICE_IO)\n    {\n        if (engineConfig.noAutoStart == MA_FALSE && pEngine->pDevice != NULL) {\n            result = ma_engine_start(pEngine);\n            if (result != MA_SUCCESS) {\n                goto on_error_4;    /* Failed to start the engine. */\n            }\n        }\n    }\n    #endif\n\n    return MA_SUCCESS;\n\n#if !defined(MA_NO_DEVICE_IO)\non_error_4:\n#endif\n#if !defined(MA_NO_RESOURCE_MANAGER)\non_error_3:\n    if (pEngine->ownsResourceManager) {\n        ma_free(pEngine->pResourceManager, &pEngine->allocationCallbacks);\n    }\n#endif  /* MA_NO_RESOURCE_MANAGER */\non_error_2:\n    for (iListener = 0; iListener < pEngine->listenerCount; iListener += 1) {\n        ma_spatializer_listener_uninit(&pEngine->listeners[iListener], &pEngine->allocationCallbacks);\n    }\n\n    ma_node_graph_uninit(&pEngine->nodeGraph, &pEngine->allocationCallbacks);\non_error_1:\n    #if !defined(MA_NO_DEVICE_IO)\n    {\n        if (pEngine->ownsDevice) {\n            ma_device_uninit(pEngine->pDevice);\n            ma_free(pEngine->pDevice, &pEngine->allocationCallbacks);\n        }\n    }\n    #endif\n\n    return result;\n}\n\nMA_API void ma_engine_uninit(ma_engine* pEngine)\n{\n    ma_uint32 iListener;\n\n    if (pEngine == NULL) {\n        return;\n    }\n\n    /* The device must be uninitialized before the node graph to ensure the audio thread doesn't try accessing it. */\n    #if !defined(MA_NO_DEVICE_IO)\n    {\n        if (pEngine->ownsDevice) {\n            ma_device_uninit(pEngine->pDevice);\n            ma_free(pEngine->pDevice, &pEngine->allocationCallbacks);\n        } else {\n            if (pEngine->pDevice != NULL) {\n                ma_device_stop(pEngine->pDevice);\n            }\n        }\n    }\n    #endif\n\n    /*\n    All inlined sounds need to be deleted. I'm going to use a lock here just to future proof in case\n    I want to do some kind of garbage collection later on.\n    */\n    ma_spinlock_lock(&pEngine->inlinedSoundLock);\n    {\n        for (;;) {\n            ma_sound_inlined* pSoundToDelete = pEngine->pInlinedSoundHead;\n            if (pSoundToDelete == NULL) {\n                break;  /* Done. */\n            }\n\n            pEngine->pInlinedSoundHead = pSoundToDelete->pNext;\n\n            ma_sound_uninit(&pSoundToDelete->sound);\n            ma_free(pSoundToDelete, &pEngine->allocationCallbacks);\n        }\n    }\n    ma_spinlock_unlock(&pEngine->inlinedSoundLock);\n\n    for (iListener = 0; iListener < pEngine->listenerCount; iListener += 1) {\n        ma_spatializer_listener_uninit(&pEngine->listeners[iListener], &pEngine->allocationCallbacks);\n    }\n\n    /* Make sure the node graph is uninitialized after the audio thread has been shutdown to prevent accessing of the node graph after being uninitialized. */\n    ma_node_graph_uninit(&pEngine->nodeGraph, &pEngine->allocationCallbacks);\n\n    /* Uninitialize the resource manager last to ensure we don't have a thread still trying to access it. */\n#ifndef MA_NO_RESOURCE_MANAGER\n    if (pEngine->ownsResourceManager) {\n        ma_resource_manager_uninit(pEngine->pResourceManager);\n        ma_free(pEngine->pResourceManager, &pEngine->allocationCallbacks);\n    }\n#endif\n}\n\nMA_API ma_result ma_engine_read_pcm_frames(ma_engine* pEngine, void* pFramesOut, ma_uint64 frameCount, ma_uint64* pFramesRead)\n{\n    ma_result result;\n    ma_uint64 framesRead = 0;\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = 0;\n    }\n\n    result = ma_node_graph_read_pcm_frames(&pEngine->nodeGraph, pFramesOut, frameCount, &framesRead);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pFramesRead != NULL) {\n        *pFramesRead = framesRead;\n    }\n\n    if (pEngine->onProcess) {\n        pEngine->onProcess(pEngine->pProcessUserData, (float*)pFramesOut, framesRead);  /* Safe cast to float* because the engine always works on floating point samples. */\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_node_graph* ma_engine_get_node_graph(ma_engine* pEngine)\n{\n    if (pEngine == NULL) {\n        return NULL;\n    }\n\n    return &pEngine->nodeGraph;\n}\n\n#if !defined(MA_NO_RESOURCE_MANAGER)\nMA_API ma_resource_manager* ma_engine_get_resource_manager(ma_engine* pEngine)\n{\n    if (pEngine == NULL) {\n        return NULL;\n    }\n\n    #if !defined(MA_NO_RESOURCE_MANAGER)\n    {\n        return pEngine->pResourceManager;\n    }\n    #else\n    {\n        return NULL;\n    }\n    #endif\n}\n#endif\n\nMA_API ma_device* ma_engine_get_device(ma_engine* pEngine)\n{\n    if (pEngine == NULL) {\n        return NULL;\n    }\n\n    #if !defined(MA_NO_DEVICE_IO)\n    {\n        return pEngine->pDevice;\n    }\n    #else\n    {\n        return NULL;\n    }\n    #endif\n}\n\nMA_API ma_log* ma_engine_get_log(ma_engine* pEngine)\n{\n    if (pEngine == NULL) {\n        return NULL;\n    }\n\n    if (pEngine->pLog != NULL) {\n        return pEngine->pLog;\n    } else {\n        #if !defined(MA_NO_DEVICE_IO)\n        {\n            return ma_device_get_log(ma_engine_get_device(pEngine));\n        }\n        #else\n        {\n            return NULL;\n        }\n        #endif\n    }\n}\n\nMA_API ma_node* ma_engine_get_endpoint(ma_engine* pEngine)\n{\n    return ma_node_graph_get_endpoint(&pEngine->nodeGraph);\n}\n\nMA_API ma_uint64 ma_engine_get_time_in_pcm_frames(const ma_engine* pEngine)\n{\n    return ma_node_graph_get_time(&pEngine->nodeGraph);\n}\n\nMA_API ma_uint64 ma_engine_get_time_in_milliseconds(const ma_engine* pEngine)\n{\n    return ma_engine_get_time_in_pcm_frames(pEngine) * 1000 / ma_engine_get_sample_rate(pEngine);\n}\n\nMA_API ma_result ma_engine_set_time_in_pcm_frames(ma_engine* pEngine, ma_uint64 globalTime)\n{\n    return ma_node_graph_set_time(&pEngine->nodeGraph, globalTime);\n}\n\nMA_API ma_result ma_engine_set_time_in_milliseconds(ma_engine* pEngine, ma_uint64 globalTime)\n{\n    return ma_engine_set_time_in_pcm_frames(pEngine, globalTime * ma_engine_get_sample_rate(pEngine) / 1000);\n}\n\nMA_API ma_uint64 ma_engine_get_time(const ma_engine* pEngine)\n{\n    return ma_engine_get_time_in_pcm_frames(pEngine);\n}\n\nMA_API ma_result ma_engine_set_time(ma_engine* pEngine, ma_uint64 globalTime)\n{\n    return ma_engine_set_time_in_pcm_frames(pEngine, globalTime);\n}\n\nMA_API ma_uint32 ma_engine_get_channels(const ma_engine* pEngine)\n{\n    return ma_node_graph_get_channels(&pEngine->nodeGraph);\n}\n\nMA_API ma_uint32 ma_engine_get_sample_rate(const ma_engine* pEngine)\n{\n    if (pEngine == NULL) {\n        return 0;\n    }\n\n    return pEngine->sampleRate;\n}\n\n\nMA_API ma_result ma_engine_start(ma_engine* pEngine)\n{\n    ma_result result;\n\n    if (pEngine == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_DEVICE_IO)\n    {\n        if (pEngine->pDevice != NULL) {\n            result = ma_device_start(pEngine->pDevice);\n        } else {\n            result = MA_INVALID_OPERATION;  /* The engine is running without a device which means there's no real notion of \"starting\" the engine. */\n        }\n    }\n    #else\n    {\n        result = MA_INVALID_OPERATION;  /* Device IO is disabled, so there's no real notion of \"starting\" the engine. */\n    }\n    #endif\n\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_engine_stop(ma_engine* pEngine)\n{\n    ma_result result;\n\n    if (pEngine == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    #if !defined(MA_NO_DEVICE_IO)\n    {\n        if (pEngine->pDevice != NULL) {\n            result = ma_device_stop(pEngine->pDevice);\n        } else {\n            result = MA_INVALID_OPERATION;  /* The engine is running without a device which means there's no real notion of \"stopping\" the engine. */\n        }\n    }\n    #else\n    {\n        result = MA_INVALID_OPERATION;  /* Device IO is disabled, so there's no real notion of \"stopping\" the engine. */\n    }\n    #endif\n\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_engine_set_volume(ma_engine* pEngine, float volume)\n{\n    if (pEngine == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_node_set_output_bus_volume(ma_node_graph_get_endpoint(&pEngine->nodeGraph), 0, volume);\n}\n\nMA_API float ma_engine_get_volume(ma_engine* pEngine)\n{\n    if (pEngine == NULL) {\n        return 0;\n    }\n\n    return ma_node_get_output_bus_volume(ma_node_graph_get_endpoint(&pEngine->nodeGraph), 0);\n}\n\nMA_API ma_result ma_engine_set_gain_db(ma_engine* pEngine, float gainDB)\n{\n    return ma_engine_set_volume(pEngine, ma_volume_db_to_linear(gainDB));\n}\n\nMA_API float ma_engine_get_gain_db(ma_engine* pEngine)\n{\n    return ma_volume_linear_to_db(ma_engine_get_volume(pEngine));\n}\n\n\nMA_API ma_uint32 ma_engine_get_listener_count(const ma_engine* pEngine)\n{\n    if (pEngine == NULL) {\n        return 0;\n    }\n\n    return pEngine->listenerCount;\n}\n\nMA_API ma_uint32 ma_engine_find_closest_listener(const ma_engine* pEngine, float absolutePosX, float absolutePosY, float absolutePosZ)\n{\n    ma_uint32 iListener;\n    ma_uint32 iListenerClosest;\n    float closestLen2 = MA_FLT_MAX;\n\n    if (pEngine == NULL || pEngine->listenerCount == 1) {\n        return 0;\n    }\n\n    iListenerClosest = 0;\n    for (iListener = 0; iListener < pEngine->listenerCount; iListener += 1) {\n        if (ma_engine_listener_is_enabled(pEngine, iListener)) {\n            float len2 = ma_vec3f_len2(ma_vec3f_sub(ma_spatializer_listener_get_position(&pEngine->listeners[iListener]), ma_vec3f_init_3f(absolutePosX, absolutePosY, absolutePosZ)));\n            if (closestLen2 > len2) {\n                closestLen2 = len2;\n                iListenerClosest = iListener;\n            }\n        }\n    }\n\n    MA_ASSERT(iListenerClosest < 255);\n    return iListenerClosest;\n}\n\nMA_API void ma_engine_listener_set_position(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z)\n{\n    if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) {\n        return;\n    }\n\n    ma_spatializer_listener_set_position(&pEngine->listeners[listenerIndex], x, y, z);\n}\n\nMA_API ma_vec3f ma_engine_listener_get_position(const ma_engine* pEngine, ma_uint32 listenerIndex)\n{\n    if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) {\n        return ma_vec3f_init_3f(0, 0, 0);\n    }\n\n    return ma_spatializer_listener_get_position(&pEngine->listeners[listenerIndex]);\n}\n\nMA_API void ma_engine_listener_set_direction(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z)\n{\n    if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) {\n        return;\n    }\n\n    ma_spatializer_listener_set_direction(&pEngine->listeners[listenerIndex], x, y, z);\n}\n\nMA_API ma_vec3f ma_engine_listener_get_direction(const ma_engine* pEngine, ma_uint32 listenerIndex)\n{\n    if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) {\n        return ma_vec3f_init_3f(0, 0, -1);\n    }\n\n    return ma_spatializer_listener_get_direction(&pEngine->listeners[listenerIndex]);\n}\n\nMA_API void ma_engine_listener_set_velocity(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z)\n{\n    if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) {\n        return;\n    }\n\n    ma_spatializer_listener_set_velocity(&pEngine->listeners[listenerIndex], x, y, z);\n}\n\nMA_API ma_vec3f ma_engine_listener_get_velocity(const ma_engine* pEngine, ma_uint32 listenerIndex)\n{\n    if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) {\n        return ma_vec3f_init_3f(0, 0, 0);\n    }\n\n    return ma_spatializer_listener_get_velocity(&pEngine->listeners[listenerIndex]);\n}\n\nMA_API void ma_engine_listener_set_cone(ma_engine* pEngine, ma_uint32 listenerIndex, float innerAngleInRadians, float outerAngleInRadians, float outerGain)\n{\n    if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) {\n        return;\n    }\n\n    ma_spatializer_listener_set_cone(&pEngine->listeners[listenerIndex], innerAngleInRadians, outerAngleInRadians, outerGain);\n}\n\nMA_API void ma_engine_listener_get_cone(const ma_engine* pEngine, ma_uint32 listenerIndex, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain)\n{\n    if (pInnerAngleInRadians != NULL) {\n        *pInnerAngleInRadians = 0;\n    }\n\n    if (pOuterAngleInRadians != NULL) {\n        *pOuterAngleInRadians = 0;\n    }\n\n    if (pOuterGain != NULL) {\n        *pOuterGain = 0;\n    }\n\n    if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) {\n        return;\n    }\n\n    ma_spatializer_listener_get_cone(&pEngine->listeners[listenerIndex], pInnerAngleInRadians, pOuterAngleInRadians, pOuterGain);\n}\n\nMA_API void ma_engine_listener_set_world_up(ma_engine* pEngine, ma_uint32 listenerIndex, float x, float y, float z)\n{\n    if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) {\n        return;\n    }\n\n    ma_spatializer_listener_set_world_up(&pEngine->listeners[listenerIndex], x, y, z);\n}\n\nMA_API ma_vec3f ma_engine_listener_get_world_up(const ma_engine* pEngine, ma_uint32 listenerIndex)\n{\n    if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) {\n        return ma_vec3f_init_3f(0, 1, 0);\n    }\n\n    return ma_spatializer_listener_get_world_up(&pEngine->listeners[listenerIndex]);\n}\n\nMA_API void ma_engine_listener_set_enabled(ma_engine* pEngine, ma_uint32 listenerIndex, ma_bool32 isEnabled)\n{\n    if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) {\n        return;\n    }\n\n    ma_spatializer_listener_set_enabled(&pEngine->listeners[listenerIndex], isEnabled);\n}\n\nMA_API ma_bool32 ma_engine_listener_is_enabled(const ma_engine* pEngine, ma_uint32 listenerIndex)\n{\n    if (pEngine == NULL || listenerIndex >= pEngine->listenerCount) {\n        return MA_FALSE;\n    }\n\n    return ma_spatializer_listener_is_enabled(&pEngine->listeners[listenerIndex]);\n}\n\n\n#ifndef MA_NO_RESOURCE_MANAGER\nMA_API ma_result ma_engine_play_sound_ex(ma_engine* pEngine, const char* pFilePath, ma_node* pNode, ma_uint32 nodeInputBusIndex)\n{\n    ma_result result = MA_SUCCESS;\n    ma_sound_inlined* pSound = NULL;\n    ma_sound_inlined* pNextSound = NULL;\n\n    if (pEngine == NULL || pFilePath == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Attach to the endpoint node if nothing is specicied. */\n    if (pNode == NULL) {\n        pNode = ma_node_graph_get_endpoint(&pEngine->nodeGraph);\n        nodeInputBusIndex = 0;\n    }\n\n    /*\n    We want to check if we can recycle an already-allocated inlined sound. Since this is just a\n    helper I'm not *too* concerned about performance here and I'm happy to use a lock to keep\n    the implementation simple. Maybe this can be optimized later if there's enough demand, but\n    if this function is being used it probably means the caller doesn't really care too much.\n\n    What we do is check the atEnd flag. When this is true, we can recycle the sound. Otherwise\n    we just keep iterating. If we reach the end without finding a sound to recycle we just\n    allocate a new one. This doesn't scale well for a massive number of sounds being played\n    simultaneously as we don't ever actually free the sound objects. Some kind of garbage\n    collection routine might be valuable for this which I'll think about.\n    */\n    ma_spinlock_lock(&pEngine->inlinedSoundLock);\n    {\n        ma_uint32 soundFlags = 0;\n\n        for (pNextSound = pEngine->pInlinedSoundHead; pNextSound != NULL; pNextSound = pNextSound->pNext) {\n            if (ma_sound_at_end(&pNextSound->sound)) {\n                /*\n                The sound is at the end which means it's available for recycling. All we need to do\n                is uninitialize it and reinitialize it. All we're doing is recycling memory.\n                */\n                pSound = pNextSound;\n                ma_atomic_fetch_sub_32(&pEngine->inlinedSoundCount, 1);\n                break;\n            }\n        }\n\n        if (pSound != NULL) {\n            /*\n            We actually want to detach the sound from the list here. The reason is because we want the sound\n            to be in a consistent state at the non-recycled case to simplify the logic below.\n            */\n            if (pEngine->pInlinedSoundHead == pSound) {\n                pEngine->pInlinedSoundHead =  pSound->pNext;\n            }\n\n            if (pSound->pPrev != NULL) {\n                pSound->pPrev->pNext = pSound->pNext;\n            }\n            if (pSound->pNext != NULL) {\n                pSound->pNext->pPrev = pSound->pPrev;\n            }\n\n            /* Now the previous sound needs to be uninitialized. */\n            ma_sound_uninit(&pNextSound->sound);\n        } else {\n            /* No sound available for recycling. Allocate one now. */\n            pSound = (ma_sound_inlined*)ma_malloc(sizeof(*pSound), &pEngine->allocationCallbacks);\n        }\n\n        if (pSound != NULL) {   /* Safety check for the allocation above. */\n            /*\n            At this point we should have memory allocated for the inlined sound. We just need\n            to initialize it like a normal sound now.\n            */\n            soundFlags |= MA_SOUND_FLAG_ASYNC;                 /* For inlined sounds we don't want to be sitting around waiting for stuff to load so force an async load. */\n            soundFlags |= MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT; /* We want specific control over where the sound is attached in the graph. We'll attach it manually just before playing the sound. */\n            soundFlags |= MA_SOUND_FLAG_NO_PITCH;              /* Pitching isn't usable with inlined sounds, so disable it to save on speed. */\n            soundFlags |= MA_SOUND_FLAG_NO_SPATIALIZATION;     /* Not currently doing spatialization with inlined sounds, but this might actually change later. For now disable spatialization. Will be removed if we ever add support for spatialization here. */\n\n            result = ma_sound_init_from_file(pEngine, pFilePath, soundFlags, NULL, NULL, &pSound->sound);\n            if (result == MA_SUCCESS) {\n                /* Now attach the sound to the graph. */\n                result = ma_node_attach_output_bus(pSound, 0, pNode, nodeInputBusIndex);\n                if (result == MA_SUCCESS) {\n                    /* At this point the sound should be loaded and we can go ahead and add it to the list. The new item becomes the new head. */\n                    pSound->pNext = pEngine->pInlinedSoundHead;\n                    pSound->pPrev = NULL;\n\n                    pEngine->pInlinedSoundHead = pSound;    /* <-- This is what attaches the sound to the list. */\n                    if (pSound->pNext != NULL) {\n                        pSound->pNext->pPrev = pSound;\n                    }\n                } else {\n                    ma_free(pSound, &pEngine->allocationCallbacks);\n                }\n            } else {\n                ma_free(pSound, &pEngine->allocationCallbacks);\n            }\n        } else {\n            result = MA_OUT_OF_MEMORY;\n        }\n    }\n    ma_spinlock_unlock(&pEngine->inlinedSoundLock);\n\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* Finally we can start playing the sound. */\n    result = ma_sound_start(&pSound->sound);\n    if (result != MA_SUCCESS) {\n        /* Failed to start the sound. We need to mark it for recycling and return an error. */\n        ma_atomic_exchange_32(&pSound->sound.atEnd, MA_TRUE);\n        return result;\n    }\n\n    ma_atomic_fetch_add_32(&pEngine->inlinedSoundCount, 1);\n    return result;\n}\n\nMA_API ma_result ma_engine_play_sound(ma_engine* pEngine, const char* pFilePath, ma_sound_group* pGroup)\n{\n    return ma_engine_play_sound_ex(pEngine, pFilePath, pGroup, 0);\n}\n#endif\n\n\nstatic ma_result ma_sound_preinit(ma_engine* pEngine, ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pSound);\n    pSound->seekTarget = MA_SEEK_TARGET_NONE;\n\n    if (pEngine == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return MA_SUCCESS;\n}\n\nstatic ma_result ma_sound_init_from_data_source_internal(ma_engine* pEngine, const ma_sound_config* pConfig, ma_sound* pSound)\n{\n    ma_result result;\n    ma_engine_node_config engineNodeConfig;\n    ma_engine_node_type type;   /* Will be set to ma_engine_node_type_group if no data source is specified. */\n\n    /* Do not clear pSound to zero here - that's done at a higher level with ma_sound_preinit(). */\n    MA_ASSERT(pEngine != NULL);\n    MA_ASSERT(pSound  != NULL);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pSound->pDataSource = pConfig->pDataSource;\n\n    if (pConfig->pDataSource != NULL) {\n        type = ma_engine_node_type_sound;\n    } else {\n        type = ma_engine_node_type_group;\n    }\n\n    /*\n    Sounds are engine nodes. Before we can initialize this we need to determine the channel count.\n    If we can't do this we need to abort. It's up to the caller to ensure they're using a data\n    source that provides this information upfront.\n    */\n    engineNodeConfig = ma_engine_node_config_init(pEngine, type, pConfig->flags);\n    engineNodeConfig.channelsIn                  = pConfig->channelsIn;\n    engineNodeConfig.channelsOut                 = pConfig->channelsOut;\n    engineNodeConfig.volumeSmoothTimeInPCMFrames = pConfig->volumeSmoothTimeInPCMFrames;\n    engineNodeConfig.monoExpansionMode           = pConfig->monoExpansionMode;\n\n    if (engineNodeConfig.volumeSmoothTimeInPCMFrames == 0) {\n        engineNodeConfig.volumeSmoothTimeInPCMFrames = pEngine->defaultVolumeSmoothTimeInPCMFrames;\n    }\n\n    /* If we're loading from a data source the input channel count needs to be the data source's native channel count. */\n    if (pConfig->pDataSource != NULL) {\n        result = ma_data_source_get_data_format(pConfig->pDataSource, NULL, &engineNodeConfig.channelsIn, &engineNodeConfig.sampleRate, NULL, 0);\n        if (result != MA_SUCCESS) {\n            return result;  /* Failed to retrieve the channel count. */\n        }\n\n        if (engineNodeConfig.channelsIn == 0) {\n            return MA_INVALID_OPERATION;    /* Invalid channel count. */\n        }\n\n        if (engineNodeConfig.channelsOut == MA_SOUND_SOURCE_CHANNEL_COUNT) {\n            engineNodeConfig.channelsOut = engineNodeConfig.channelsIn;\n        }\n    }\n\n\n    /* Getting here means we should have a valid channel count and we can initialize the engine node. */\n    result = ma_engine_node_init(&engineNodeConfig, &pEngine->allocationCallbacks, &pSound->engineNode);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* If no attachment is specified, attach the sound straight to the endpoint. */\n    if (pConfig->pInitialAttachment == NULL) {\n        /* No group. Attach straight to the endpoint by default, unless the caller has requested that it not. */\n        if ((pConfig->flags & MA_SOUND_FLAG_NO_DEFAULT_ATTACHMENT) == 0) {\n            result = ma_node_attach_output_bus(pSound, 0, ma_node_graph_get_endpoint(&pEngine->nodeGraph), 0);\n        }\n    } else {\n        /* An attachment is specified. Attach to it by default. The sound has only a single output bus, and the config will specify which input bus to attach to. */\n        result = ma_node_attach_output_bus(pSound, 0, pConfig->pInitialAttachment, pConfig->initialAttachmentInputBusIndex);\n    }\n\n    if (result != MA_SUCCESS) {\n        ma_engine_node_uninit(&pSound->engineNode, &pEngine->allocationCallbacks);\n        return result;\n    }\n\n\n    /* Apply initial range and looping state to the data source if applicable. */\n    if (pConfig->rangeBegInPCMFrames != 0 || pConfig->rangeEndInPCMFrames != ~((ma_uint64)0)) {\n        ma_data_source_set_range_in_pcm_frames(ma_sound_get_data_source(pSound), pConfig->rangeBegInPCMFrames, pConfig->rangeEndInPCMFrames);\n    }\n\n    if (pConfig->loopPointBegInPCMFrames != 0 || pConfig->loopPointEndInPCMFrames != ~((ma_uint64)0)) {\n        ma_data_source_set_range_in_pcm_frames(ma_sound_get_data_source(pSound), pConfig->loopPointBegInPCMFrames, pConfig->loopPointEndInPCMFrames);\n    }\n\n    ma_sound_set_looping(pSound, pConfig->isLooping);\n\n    return MA_SUCCESS;\n}\n\n#ifndef MA_NO_RESOURCE_MANAGER\nMA_API ma_result ma_sound_init_from_file_internal(ma_engine* pEngine, const ma_sound_config* pConfig, ma_sound* pSound)\n{\n    ma_result result = MA_SUCCESS;\n    ma_uint32 flags;\n    ma_sound_config config;\n    ma_resource_manager_pipeline_notifications notifications;\n\n    /*\n    The engine requires knowledge of the channel count of the underlying data source before it can\n    initialize the sound. Therefore, we need to make the resource manager wait until initialization\n    of the underlying data source to be initialized so we can get access to the channel count. To\n    do this, the MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT is forced.\n\n    Because we're initializing the data source before the sound, there's a chance the notification\n    will get triggered before this function returns. This is OK, so long as the caller is aware of\n    it and can avoid accessing the sound from within the notification.\n    */\n    flags = pConfig->flags | MA_RESOURCE_MANAGER_DATA_SOURCE_FLAG_WAIT_INIT;\n\n    pSound->pResourceManagerDataSource = (ma_resource_manager_data_source*)ma_malloc(sizeof(*pSound->pResourceManagerDataSource), &pEngine->allocationCallbacks);\n    if (pSound->pResourceManagerDataSource == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    /* Removed in 0.12. Set pDoneFence on the notifications. */\n    notifications = pConfig->initNotifications;\n    if (pConfig->pDoneFence != NULL && notifications.done.pFence == NULL) {\n        notifications.done.pFence = pConfig->pDoneFence;\n    }\n\n    /*\n    We must wrap everything around the fence if one was specified. This ensures ma_fence_wait() does\n    not return prematurely before the sound has finished initializing.\n    */\n    if (notifications.done.pFence) { ma_fence_acquire(notifications.done.pFence); }\n    {\n        ma_resource_manager_data_source_config resourceManagerDataSourceConfig = ma_resource_manager_data_source_config_init();\n        resourceManagerDataSourceConfig.pFilePath                   = pConfig->pFilePath;\n        resourceManagerDataSourceConfig.pFilePathW                  = pConfig->pFilePathW;\n        resourceManagerDataSourceConfig.flags                       = flags;\n        resourceManagerDataSourceConfig.pNotifications              = &notifications;\n        resourceManagerDataSourceConfig.initialSeekPointInPCMFrames = pConfig->initialSeekPointInPCMFrames;\n        resourceManagerDataSourceConfig.rangeBegInPCMFrames         = pConfig->rangeBegInPCMFrames;\n        resourceManagerDataSourceConfig.rangeEndInPCMFrames         = pConfig->rangeEndInPCMFrames;\n        resourceManagerDataSourceConfig.loopPointBegInPCMFrames     = pConfig->loopPointBegInPCMFrames;\n        resourceManagerDataSourceConfig.loopPointEndInPCMFrames     = pConfig->loopPointEndInPCMFrames;\n        resourceManagerDataSourceConfig.isLooping                   = pConfig->isLooping;\n\n        result = ma_resource_manager_data_source_init_ex(pEngine->pResourceManager, &resourceManagerDataSourceConfig, pSound->pResourceManagerDataSource);\n        if (result != MA_SUCCESS) {\n            goto done;\n        }\n\n        pSound->ownsDataSource = MA_TRUE;   /* <-- Important. Not setting this will result in the resource manager data source never getting uninitialized. */\n\n        /* We need to use a slightly customized version of the config so we'll need to make a copy. */\n        config = *pConfig;\n        config.pFilePath   = NULL;\n        config.pFilePathW  = NULL;\n        config.pDataSource = pSound->pResourceManagerDataSource;\n\n        result = ma_sound_init_from_data_source_internal(pEngine, &config, pSound);\n        if (result != MA_SUCCESS) {\n            ma_resource_manager_data_source_uninit(pSound->pResourceManagerDataSource);\n            ma_free(pSound->pResourceManagerDataSource, &pEngine->allocationCallbacks);\n            MA_ZERO_OBJECT(pSound);\n            goto done;\n        }\n    }\ndone:\n    if (notifications.done.pFence) { ma_fence_release(notifications.done.pFence); }\n    return result;\n}\n\nMA_API ma_result ma_sound_init_from_file(ma_engine* pEngine, const char* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, ma_fence* pDoneFence, ma_sound* pSound)\n{\n    ma_sound_config config;\n\n    if (pFilePath == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    config = ma_sound_config_init_2(pEngine);\n    config.pFilePath          = pFilePath;\n    config.flags              = flags;\n    config.pInitialAttachment = pGroup;\n    config.pDoneFence         = pDoneFence;\n\n    return ma_sound_init_ex(pEngine, &config, pSound);\n}\n\nMA_API ma_result ma_sound_init_from_file_w(ma_engine* pEngine, const wchar_t* pFilePath, ma_uint32 flags, ma_sound_group* pGroup, ma_fence* pDoneFence, ma_sound* pSound)\n{\n    ma_sound_config config;\n\n    if (pFilePath == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    config = ma_sound_config_init_2(pEngine);\n    config.pFilePathW         = pFilePath;\n    config.flags              = flags;\n    config.pInitialAttachment = pGroup;\n    config.pDoneFence         = pDoneFence;\n\n    return ma_sound_init_ex(pEngine, &config, pSound);\n}\n\nMA_API ma_result ma_sound_init_copy(ma_engine* pEngine, const ma_sound* pExistingSound, ma_uint32 flags, ma_sound_group* pGroup, ma_sound* pSound)\n{\n    ma_result result;\n    ma_sound_config config;\n\n    result = ma_sound_preinit(pEngine, pSound);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pExistingSound == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Cloning only works for data buffers (not streams) that are loaded from the resource manager. */\n    if (pExistingSound->pResourceManagerDataSource == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /*\n    We need to make a clone of the data source. If the data source is not a data buffer (i.e. a stream)\n    this will fail.\n    */\n    pSound->pResourceManagerDataSource = (ma_resource_manager_data_source*)ma_malloc(sizeof(*pSound->pResourceManagerDataSource), &pEngine->allocationCallbacks);\n    if (pSound->pResourceManagerDataSource == NULL) {\n        return MA_OUT_OF_MEMORY;\n    }\n\n    result = ma_resource_manager_data_source_init_copy(pEngine->pResourceManager, pExistingSound->pResourceManagerDataSource, pSound->pResourceManagerDataSource);\n    if (result != MA_SUCCESS) {\n        ma_free(pSound->pResourceManagerDataSource, &pEngine->allocationCallbacks);\n        return result;\n    }\n\n    config = ma_sound_config_init_2(pEngine);\n    config.pDataSource                 = pSound->pResourceManagerDataSource;\n    config.flags                       = flags;\n    config.pInitialAttachment          = pGroup;\n    config.monoExpansionMode           = pExistingSound->engineNode.monoExpansionMode;\n    config.volumeSmoothTimeInPCMFrames = pExistingSound->engineNode.volumeSmoothTimeInPCMFrames;\n\n    result = ma_sound_init_from_data_source_internal(pEngine, &config, pSound);\n    if (result != MA_SUCCESS) {\n        ma_resource_manager_data_source_uninit(pSound->pResourceManagerDataSource);\n        ma_free(pSound->pResourceManagerDataSource, &pEngine->allocationCallbacks);\n        MA_ZERO_OBJECT(pSound);\n        return result;\n    }\n\n    /* Make sure the sound is marked as the owner of the data source or else it will never get uninitialized. */\n    pSound->ownsDataSource = MA_TRUE;\n\n    return MA_SUCCESS;\n}\n#endif\n\nMA_API ma_result ma_sound_init_from_data_source(ma_engine* pEngine, ma_data_source* pDataSource, ma_uint32 flags, ma_sound_group* pGroup, ma_sound* pSound)\n{\n    ma_sound_config config = ma_sound_config_init_2(pEngine);\n    config.pDataSource        = pDataSource;\n    config.flags              = flags;\n    config.pInitialAttachment = pGroup;\n    return ma_sound_init_ex(pEngine, &config, pSound);\n}\n\nMA_API ma_result ma_sound_init_ex(ma_engine* pEngine, const ma_sound_config* pConfig, ma_sound* pSound)\n{\n    ma_result result;\n\n    result = ma_sound_preinit(pEngine, pSound);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    pSound->endCallback          = pConfig->endCallback;\n    pSound->pEndCallbackUserData = pConfig->pEndCallbackUserData;\n\n    /* We need to load the sound differently depending on whether or not we're loading from a file. */\n#ifndef MA_NO_RESOURCE_MANAGER\n    if (pConfig->pFilePath != NULL || pConfig->pFilePathW != NULL) {\n        return ma_sound_init_from_file_internal(pEngine, pConfig, pSound);\n    } else\n#endif\n    {\n        /*\n        Getting here means we're not loading from a file. We may be loading from an already-initialized\n        data source, or none at all. If we aren't specifying any data source, we'll be initializing the\n        the equivalent to a group. ma_data_source_init_from_data_source_internal() will deal with this\n        for us, so no special treatment required here.\n        */\n        return ma_sound_init_from_data_source_internal(pEngine, pConfig, pSound);\n    }\n}\n\nMA_API void ma_sound_uninit(ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    /*\n    Always uninitialize the node first. This ensures it's detached from the graph and does not return until it has done\n    so which makes thread safety beyond this point trivial.\n    */\n    ma_engine_node_uninit(&pSound->engineNode, &pSound->engineNode.pEngine->allocationCallbacks);\n\n    /* Once the sound is detached from the group we can guarantee that it won't be referenced by the mixer thread which means it's safe for us to destroy the data source. */\n#ifndef MA_NO_RESOURCE_MANAGER\n    if (pSound->ownsDataSource) {\n        ma_resource_manager_data_source_uninit(pSound->pResourceManagerDataSource);\n        ma_free(pSound->pResourceManagerDataSource, &pSound->engineNode.pEngine->allocationCallbacks);\n        pSound->pDataSource = NULL;\n    }\n#else\n    MA_ASSERT(pSound->ownsDataSource == MA_FALSE);\n#endif\n}\n\nMA_API ma_engine* ma_sound_get_engine(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return NULL;\n    }\n\n    return pSound->engineNode.pEngine;\n}\n\nMA_API ma_data_source* ma_sound_get_data_source(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return NULL;\n    }\n\n    return pSound->pDataSource;\n}\n\nMA_API ma_result ma_sound_start(ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* If the sound is already playing, do nothing. */\n    if (ma_sound_is_playing(pSound)) {\n        return MA_SUCCESS;\n    }\n\n    /* If the sound is at the end it means we want to start from the start again. */\n    if (ma_sound_at_end(pSound)) {\n        ma_result result = ma_data_source_seek_to_pcm_frame(pSound->pDataSource, 0);\n        if (result != MA_SUCCESS && result != MA_NOT_IMPLEMENTED) {\n            return result;  /* Failed to seek back to the start. */\n        }\n\n        /* Make sure we clear the end indicator. */\n        ma_atomic_exchange_32(&pSound->atEnd, MA_FALSE);\n    }\n\n    /* Make sure the sound is started. If there's a start delay, the sound won't actually start until the start time is reached. */\n    ma_node_set_state(pSound, ma_node_state_started);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_sound_stop(ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* This will stop the sound immediately. Use ma_sound_set_stop_time() to stop the sound at a specific time. */\n    ma_node_set_state(pSound, ma_node_state_stopped);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_sound_stop_with_fade_in_pcm_frames(ma_sound* pSound, ma_uint64 fadeLengthInFrames)\n{\n    if (pSound == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Stopping with a fade out requires us to schedule the stop into the future by the fade length. */\n    ma_sound_set_stop_time_with_fade_in_pcm_frames(pSound, ma_engine_get_time_in_pcm_frames(ma_sound_get_engine(pSound)) + fadeLengthInFrames, fadeLengthInFrames);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_sound_stop_with_fade_in_milliseconds(ma_sound* pSound, ma_uint64 fadeLengthInMilliseconds)\n{\n    ma_uint64 sampleRate;\n\n    if (pSound == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    sampleRate = ma_engine_get_sample_rate(ma_sound_get_engine(pSound));\n\n    return ma_sound_stop_with_fade_in_pcm_frames(pSound, (fadeLengthInMilliseconds * sampleRate) / 1000);\n}\n\nMA_API void ma_sound_set_volume(ma_sound* pSound, float volume)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_engine_node_set_volume(&pSound->engineNode, volume);\n}\n\nMA_API float ma_sound_get_volume(const ma_sound* pSound)\n{\n    float volume = 0;\n\n    if (pSound == NULL) {\n        return 0;\n    }\n\n    ma_engine_node_get_volume(&pSound->engineNode, &volume);\n\n    return volume;\n}\n\nMA_API void ma_sound_set_pan(ma_sound* pSound, float pan)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_panner_set_pan(&pSound->engineNode.panner, pan);\n}\n\nMA_API float ma_sound_get_pan(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return 0;\n    }\n\n    return ma_panner_get_pan(&pSound->engineNode.panner);\n}\n\nMA_API void ma_sound_set_pan_mode(ma_sound* pSound, ma_pan_mode panMode)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_panner_set_mode(&pSound->engineNode.panner, panMode);\n}\n\nMA_API ma_pan_mode ma_sound_get_pan_mode(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return ma_pan_mode_balance;\n    }\n\n    return ma_panner_get_mode(&pSound->engineNode.panner);\n}\n\nMA_API void ma_sound_set_pitch(ma_sound* pSound, float pitch)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    if (pitch <= 0) {\n        return;\n    }\n\n    ma_atomic_exchange_explicit_f32(&pSound->engineNode.pitch, pitch, ma_atomic_memory_order_release);\n}\n\nMA_API float ma_sound_get_pitch(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return 0;\n    }\n\n    return ma_atomic_load_f32(&pSound->engineNode.pitch);    /* Naughty const-cast for this. */\n}\n\nMA_API void ma_sound_set_spatialization_enabled(ma_sound* pSound, ma_bool32 enabled)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_atomic_exchange_explicit_32(&pSound->engineNode.isSpatializationDisabled, !enabled, ma_atomic_memory_order_release);\n}\n\nMA_API ma_bool32 ma_sound_is_spatialization_enabled(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return MA_FALSE;\n    }\n\n    return ma_engine_node_is_spatialization_enabled(&pSound->engineNode);\n}\n\nMA_API void ma_sound_set_pinned_listener_index(ma_sound* pSound, ma_uint32 listenerIndex)\n{\n    if (pSound == NULL || listenerIndex >= ma_engine_get_listener_count(ma_sound_get_engine(pSound))) {\n        return;\n    }\n\n    ma_atomic_exchange_explicit_32(&pSound->engineNode.pinnedListenerIndex, listenerIndex, ma_atomic_memory_order_release);\n}\n\nMA_API ma_uint32 ma_sound_get_pinned_listener_index(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return MA_LISTENER_INDEX_CLOSEST;\n    }\n\n    return ma_atomic_load_explicit_32(&pSound->engineNode.pinnedListenerIndex, ma_atomic_memory_order_acquire);\n}\n\nMA_API ma_uint32 ma_sound_get_listener_index(const ma_sound* pSound)\n{\n    ma_uint32 listenerIndex;\n\n    if (pSound == NULL) {\n        return 0;\n    }\n\n    listenerIndex = ma_sound_get_pinned_listener_index(pSound);\n    if (listenerIndex == MA_LISTENER_INDEX_CLOSEST) {\n        ma_vec3f position = ma_sound_get_position(pSound);\n        return ma_engine_find_closest_listener(ma_sound_get_engine(pSound), position.x, position.y, position.z);\n    }\n\n    return listenerIndex;\n}\n\nMA_API ma_vec3f ma_sound_get_direction_to_listener(const ma_sound* pSound)\n{\n    ma_vec3f relativePos;\n    ma_engine* pEngine;\n\n    if (pSound == NULL) {\n        return ma_vec3f_init_3f(0, 0, -1);\n    }\n\n    pEngine = ma_sound_get_engine(pSound);\n    if (pEngine == NULL) {\n        return ma_vec3f_init_3f(0, 0, -1);\n    }\n\n    ma_spatializer_get_relative_position_and_direction(&pSound->engineNode.spatializer, &pEngine->listeners[ma_sound_get_listener_index(pSound)], &relativePos, NULL);\n\n    return ma_vec3f_normalize(ma_vec3f_neg(relativePos));\n}\n\nMA_API void ma_sound_set_position(ma_sound* pSound, float x, float y, float z)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_set_position(&pSound->engineNode.spatializer, x, y, z);\n}\n\nMA_API ma_vec3f ma_sound_get_position(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return ma_vec3f_init_3f(0, 0, 0);\n    }\n\n    return ma_spatializer_get_position(&pSound->engineNode.spatializer);\n}\n\nMA_API void ma_sound_set_direction(ma_sound* pSound, float x, float y, float z)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_set_direction(&pSound->engineNode.spatializer, x, y, z);\n}\n\nMA_API ma_vec3f ma_sound_get_direction(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return ma_vec3f_init_3f(0, 0, 0);\n    }\n\n    return ma_spatializer_get_direction(&pSound->engineNode.spatializer);\n}\n\nMA_API void ma_sound_set_velocity(ma_sound* pSound, float x, float y, float z)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_set_velocity(&pSound->engineNode.spatializer, x, y, z);\n}\n\nMA_API ma_vec3f ma_sound_get_velocity(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return ma_vec3f_init_3f(0, 0, 0);\n    }\n\n    return ma_spatializer_get_velocity(&pSound->engineNode.spatializer);\n}\n\nMA_API void ma_sound_set_attenuation_model(ma_sound* pSound, ma_attenuation_model attenuationModel)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_set_attenuation_model(&pSound->engineNode.spatializer, attenuationModel);\n}\n\nMA_API ma_attenuation_model ma_sound_get_attenuation_model(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return ma_attenuation_model_none;\n    }\n\n    return ma_spatializer_get_attenuation_model(&pSound->engineNode.spatializer);\n}\n\nMA_API void ma_sound_set_positioning(ma_sound* pSound, ma_positioning positioning)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_set_positioning(&pSound->engineNode.spatializer, positioning);\n}\n\nMA_API ma_positioning ma_sound_get_positioning(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return ma_positioning_absolute;\n    }\n\n    return ma_spatializer_get_positioning(&pSound->engineNode.spatializer);\n}\n\nMA_API void ma_sound_set_rolloff(ma_sound* pSound, float rolloff)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_set_rolloff(&pSound->engineNode.spatializer, rolloff);\n}\n\nMA_API float ma_sound_get_rolloff(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return 0;\n    }\n\n    return ma_spatializer_get_rolloff(&pSound->engineNode.spatializer);\n}\n\nMA_API void ma_sound_set_min_gain(ma_sound* pSound, float minGain)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_set_min_gain(&pSound->engineNode.spatializer, minGain);\n}\n\nMA_API float ma_sound_get_min_gain(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return 0;\n    }\n\n    return ma_spatializer_get_min_gain(&pSound->engineNode.spatializer);\n}\n\nMA_API void ma_sound_set_max_gain(ma_sound* pSound, float maxGain)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_set_max_gain(&pSound->engineNode.spatializer, maxGain);\n}\n\nMA_API float ma_sound_get_max_gain(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return 0;\n    }\n\n    return ma_spatializer_get_max_gain(&pSound->engineNode.spatializer);\n}\n\nMA_API void ma_sound_set_min_distance(ma_sound* pSound, float minDistance)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_set_min_distance(&pSound->engineNode.spatializer, minDistance);\n}\n\nMA_API float ma_sound_get_min_distance(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return 0;\n    }\n\n    return ma_spatializer_get_min_distance(&pSound->engineNode.spatializer);\n}\n\nMA_API void ma_sound_set_max_distance(ma_sound* pSound, float maxDistance)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_set_max_distance(&pSound->engineNode.spatializer, maxDistance);\n}\n\nMA_API float ma_sound_get_max_distance(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return 0;\n    }\n\n    return ma_spatializer_get_max_distance(&pSound->engineNode.spatializer);\n}\n\nMA_API void ma_sound_set_cone(ma_sound* pSound, float innerAngleInRadians, float outerAngleInRadians, float outerGain)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_set_cone(&pSound->engineNode.spatializer, innerAngleInRadians, outerAngleInRadians, outerGain);\n}\n\nMA_API void ma_sound_get_cone(const ma_sound* pSound, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain)\n{\n    if (pInnerAngleInRadians != NULL) {\n        *pInnerAngleInRadians = 0;\n    }\n\n    if (pOuterAngleInRadians != NULL) {\n        *pOuterAngleInRadians = 0;\n    }\n\n    if (pOuterGain != NULL) {\n        *pOuterGain = 0;\n    }\n\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_get_cone(&pSound->engineNode.spatializer, pInnerAngleInRadians, pOuterAngleInRadians, pOuterGain);\n}\n\nMA_API void ma_sound_set_doppler_factor(ma_sound* pSound, float dopplerFactor)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_set_doppler_factor(&pSound->engineNode.spatializer, dopplerFactor);\n}\n\nMA_API float ma_sound_get_doppler_factor(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return 0;\n    }\n\n    return ma_spatializer_get_doppler_factor(&pSound->engineNode.spatializer);\n}\n\nMA_API void ma_sound_set_directional_attenuation_factor(ma_sound* pSound, float directionalAttenuationFactor)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_spatializer_set_directional_attenuation_factor(&pSound->engineNode.spatializer, directionalAttenuationFactor);\n}\n\nMA_API float ma_sound_get_directional_attenuation_factor(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return 1;\n    }\n\n    return ma_spatializer_get_directional_attenuation_factor(&pSound->engineNode.spatializer);\n}\n\n\nMA_API void ma_sound_set_fade_in_pcm_frames(ma_sound* pSound, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInFrames)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_sound_set_fade_start_in_pcm_frames(pSound, volumeBeg, volumeEnd, fadeLengthInFrames, (~(ma_uint64)0));\n}\n\nMA_API void ma_sound_set_fade_in_milliseconds(ma_sound* pSound, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInMilliseconds)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_sound_set_fade_in_pcm_frames(pSound, volumeBeg, volumeEnd, (fadeLengthInMilliseconds * pSound->engineNode.fader.config.sampleRate) / 1000);\n}\n\nMA_API void ma_sound_set_fade_start_in_pcm_frames(ma_sound* pSound, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInFrames, ma_uint64 absoluteGlobalTimeInFrames)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    /*\n    We don't want to update the fader at this point because we need to use the engine's current time\n    to derive the fader's start offset. The timer is being updated on the audio thread so in order to\n    do this as accurately as possible we'll need to defer this to the audio thread.\n    */\n    ma_atomic_float_set(&pSound->engineNode.fadeSettings.volumeBeg, volumeBeg);\n    ma_atomic_float_set(&pSound->engineNode.fadeSettings.volumeEnd, volumeEnd);\n    ma_atomic_uint64_set(&pSound->engineNode.fadeSettings.fadeLengthInFrames, fadeLengthInFrames);\n    ma_atomic_uint64_set(&pSound->engineNode.fadeSettings.absoluteGlobalTimeInFrames, absoluteGlobalTimeInFrames);\n}\n\nMA_API void ma_sound_set_fade_start_in_milliseconds(ma_sound* pSound, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInMilliseconds, ma_uint64 absoluteGlobalTimeInMilliseconds)\n{\n    ma_uint32 sampleRate;\n\n    if (pSound == NULL) {\n        return;\n    }\n\n    sampleRate = ma_engine_get_sample_rate(ma_sound_get_engine(pSound));\n\n    ma_sound_set_fade_start_in_pcm_frames(pSound, volumeBeg, volumeEnd, (fadeLengthInMilliseconds * sampleRate) / 1000, (absoluteGlobalTimeInMilliseconds * sampleRate) / 1000);\n}\n\nMA_API float ma_sound_get_current_fade_volume(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    return ma_fader_get_current_volume(&pSound->engineNode.fader);\n}\n\nMA_API void ma_sound_set_start_time_in_pcm_frames(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInFrames)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_node_set_state_time(pSound, ma_node_state_started, absoluteGlobalTimeInFrames);\n}\n\nMA_API void ma_sound_set_start_time_in_milliseconds(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInMilliseconds)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_sound_set_start_time_in_pcm_frames(pSound, absoluteGlobalTimeInMilliseconds * ma_engine_get_sample_rate(ma_sound_get_engine(pSound)) / 1000);\n}\n\nMA_API void ma_sound_set_stop_time_in_pcm_frames(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInFrames)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_sound_set_stop_time_with_fade_in_pcm_frames(pSound, absoluteGlobalTimeInFrames, 0);\n}\n\nMA_API void ma_sound_set_stop_time_in_milliseconds(ma_sound* pSound, ma_uint64 absoluteGlobalTimeInMilliseconds)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    ma_sound_set_stop_time_in_pcm_frames(pSound, absoluteGlobalTimeInMilliseconds * ma_engine_get_sample_rate(ma_sound_get_engine(pSound)) / 1000);\n}\n\nMA_API void ma_sound_set_stop_time_with_fade_in_pcm_frames(ma_sound* pSound, ma_uint64 stopAbsoluteGlobalTimeInFrames, ma_uint64 fadeLengthInFrames)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    if (fadeLengthInFrames > 0) {\n        if (fadeLengthInFrames > stopAbsoluteGlobalTimeInFrames) {\n            fadeLengthInFrames = stopAbsoluteGlobalTimeInFrames;\n        }\n\n        ma_sound_set_fade_start_in_pcm_frames(pSound, -1, 0, fadeLengthInFrames, stopAbsoluteGlobalTimeInFrames - fadeLengthInFrames);\n    }\n\n    ma_node_set_state_time(pSound, ma_node_state_stopped, stopAbsoluteGlobalTimeInFrames);\n}\n\nMA_API void ma_sound_set_stop_time_with_fade_in_milliseconds(ma_sound* pSound, ma_uint64 stopAbsoluteGlobalTimeInMilliseconds, ma_uint64 fadeLengthInMilliseconds)\n{\n    ma_uint32 sampleRate;\n\n    if (pSound == NULL) {\n        return;\n    }\n\n    sampleRate = ma_engine_get_sample_rate(ma_sound_get_engine(pSound));\n\n    ma_sound_set_stop_time_with_fade_in_pcm_frames(pSound, (stopAbsoluteGlobalTimeInMilliseconds * sampleRate) / 1000, (fadeLengthInMilliseconds * sampleRate) / 1000);\n}\n\nMA_API ma_bool32 ma_sound_is_playing(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return MA_FALSE;\n    }\n\n    return ma_node_get_state_by_time(pSound, ma_engine_get_time_in_pcm_frames(ma_sound_get_engine(pSound))) == ma_node_state_started;\n}\n\nMA_API ma_uint64 ma_sound_get_time_in_pcm_frames(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return 0;\n    }\n\n    return ma_node_get_time(pSound);\n}\n\nMA_API ma_uint64 ma_sound_get_time_in_milliseconds(const ma_sound* pSound)\n{\n    return ma_sound_get_time_in_pcm_frames(pSound) * 1000 / ma_engine_get_sample_rate(ma_sound_get_engine(pSound));\n}\n\nMA_API void ma_sound_set_looping(ma_sound* pSound, ma_bool32 isLooping)\n{\n    if (pSound == NULL) {\n        return;\n    }\n\n    /* Looping is only a valid concept if the sound is backed by a data source. */\n    if (pSound->pDataSource == NULL) {\n        return;\n    }\n\n    /* The looping state needs to be applied to the data source in order for any looping to actually happen. */\n    ma_data_source_set_looping(pSound->pDataSource, isLooping);\n}\n\nMA_API ma_bool32 ma_sound_is_looping(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return MA_FALSE;\n    }\n\n    /* There is no notion of looping for sounds that are not backed by a data source. */\n    if (pSound->pDataSource == NULL) {\n        return MA_FALSE;\n    }\n\n    return ma_data_source_is_looping(pSound->pDataSource);\n}\n\nMA_API ma_bool32 ma_sound_at_end(const ma_sound* pSound)\n{\n    if (pSound == NULL) {\n        return MA_FALSE;\n    }\n\n    /* There is no notion of an end of a sound if it's not backed by a data source. */\n    if (pSound->pDataSource == NULL) {\n        return MA_FALSE;\n    }\n\n    return ma_sound_get_at_end(pSound);\n}\n\nMA_API ma_result ma_sound_seek_to_pcm_frame(ma_sound* pSound, ma_uint64 frameIndex)\n{\n    if (pSound == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* Seeking is only valid for sounds that are backed by a data source. */\n    if (pSound->pDataSource == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    /* We can't be seeking while reading at the same time. We just set the seek target and get the mixing thread to do the actual seek. */\n    ma_atomic_exchange_64(&pSound->seekTarget, frameIndex);\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_sound_get_data_format(ma_sound* pSound, ma_format* pFormat, ma_uint32* pChannels, ma_uint32* pSampleRate, ma_channel* pChannelMap, size_t channelMapCap)\n{\n    if (pSound == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The data format is retrieved directly from the data source if the sound is backed by one. Otherwise we pull it from the node. */\n    if (pSound->pDataSource == NULL) {\n        ma_uint32 channels;\n\n        if (pFormat != NULL) {\n            *pFormat = ma_format_f32;\n        }\n\n        channels = ma_node_get_input_channels(&pSound->engineNode, 0);\n        if (pChannels != NULL) {\n            *pChannels = channels;\n        }\n\n        if (pSampleRate != NULL) {\n            *pSampleRate = pSound->engineNode.resampler.config.sampleRateIn;\n        }\n\n        if (pChannelMap != NULL) {\n            ma_channel_map_init_standard(ma_standard_channel_map_default, pChannelMap, channelMapCap, channels);\n        }\n\n        return MA_SUCCESS;\n    } else {\n        return ma_data_source_get_data_format(pSound->pDataSource, pFormat, pChannels, pSampleRate, pChannelMap, channelMapCap);\n    }\n}\n\nMA_API ma_result ma_sound_get_cursor_in_pcm_frames(ma_sound* pSound, ma_uint64* pCursor)\n{\n    ma_uint64 seekTarget;\n\n    if (pSound == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The notion of a cursor is only valid for sounds that are backed by a data source. */\n    if (pSound->pDataSource == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    seekTarget = ma_atomic_load_64(&pSound->seekTarget);\n    if (seekTarget != MA_SEEK_TARGET_NONE) {\n        *pCursor = seekTarget;\n        return MA_SUCCESS;\n    } else {\n        return ma_data_source_get_cursor_in_pcm_frames(pSound->pDataSource, pCursor);\n    }\n}\n\nMA_API ma_result ma_sound_get_length_in_pcm_frames(ma_sound* pSound, ma_uint64* pLength)\n{\n    if (pSound == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The notion of a sound length is only valid for sounds that are backed by a data source. */\n    if (pSound->pDataSource == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    return ma_data_source_get_length_in_pcm_frames(pSound->pDataSource, pLength);\n}\n\nMA_API ma_result ma_sound_get_cursor_in_seconds(ma_sound* pSound, float* pCursor)\n{\n    ma_result result;\n    ma_uint64 cursorInPCMFrames;\n    ma_uint32 sampleRate;\n\n    if (pCursor != NULL) {\n        *pCursor = 0;\n    }\n\n    result = ma_sound_get_cursor_in_pcm_frames(pSound, &cursorInPCMFrames);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    result = ma_sound_get_data_format(pSound, NULL, NULL, &sampleRate, NULL, 0);\n    if (result != MA_SUCCESS) {\n        return result;\n    }\n\n    /* VC6 does not support division of unsigned 64-bit integers with floating point numbers. Need to use a signed number. This shouldn't effect anything in practice. */\n    *pCursor = (ma_int64)cursorInPCMFrames / (float)sampleRate;\n\n    return MA_SUCCESS;\n}\n\nMA_API ma_result ma_sound_get_length_in_seconds(ma_sound* pSound, float* pLength)\n{\n    if (pSound == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The notion of a sound length is only valid for sounds that are backed by a data source. */\n    if (pSound->pDataSource == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    return ma_data_source_get_length_in_seconds(pSound->pDataSource, pLength);\n}\n\nMA_API ma_result ma_sound_set_end_callback(ma_sound* pSound, ma_sound_end_proc callback, void* pUserData)\n{\n    if (pSound == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* The notion of an end is only valid for sounds that are backed by a data source. */\n    if (pSound->pDataSource == NULL) {\n        return MA_INVALID_OPERATION;\n    }\n\n    pSound->endCallback          = callback;\n    pSound->pEndCallbackUserData = pUserData;\n\n    return MA_SUCCESS;\n}\n\n\nMA_API ma_result ma_sound_group_init(ma_engine* pEngine, ma_uint32 flags, ma_sound_group* pParentGroup, ma_sound_group* pGroup)\n{\n    ma_sound_group_config config = ma_sound_group_config_init_2(pEngine);\n    config.flags              = flags;\n    config.pInitialAttachment = pParentGroup;\n    return ma_sound_group_init_ex(pEngine, &config, pGroup);\n}\n\nMA_API ma_result ma_sound_group_init_ex(ma_engine* pEngine, const ma_sound_group_config* pConfig, ma_sound_group* pGroup)\n{\n    ma_sound_config soundConfig;\n\n    if (pGroup == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    MA_ZERO_OBJECT(pGroup);\n\n    if (pConfig == NULL) {\n        return MA_INVALID_ARGS;\n    }\n\n    /* A sound group is just a sound without a data source. */\n    soundConfig = *pConfig;\n    soundConfig.pFilePath   = NULL;\n    soundConfig.pFilePathW  = NULL;\n    soundConfig.pDataSource = NULL;\n\n    /*\n    Groups need to have spatialization disabled by default because I think it'll be pretty rare\n    that programs will want to spatialize groups (but not unheard of). Certainly it feels like\n    disabling this by default feels like the right option. Spatialization can be enabled with a\n    call to ma_sound_group_set_spatialization_enabled().\n    */\n    soundConfig.flags |= MA_SOUND_FLAG_NO_SPATIALIZATION;\n\n    return ma_sound_init_ex(pEngine, &soundConfig, pGroup);\n}\n\nMA_API void ma_sound_group_uninit(ma_sound_group* pGroup)\n{\n    ma_sound_uninit(pGroup);\n}\n\nMA_API ma_engine* ma_sound_group_get_engine(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_engine(pGroup);\n}\n\nMA_API ma_result ma_sound_group_start(ma_sound_group* pGroup)\n{\n    return ma_sound_start(pGroup);\n}\n\nMA_API ma_result ma_sound_group_stop(ma_sound_group* pGroup)\n{\n    return ma_sound_stop(pGroup);\n}\n\nMA_API void ma_sound_group_set_volume(ma_sound_group* pGroup, float volume)\n{\n    ma_sound_set_volume(pGroup, volume);\n}\n\nMA_API float ma_sound_group_get_volume(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_volume(pGroup);\n}\n\nMA_API void ma_sound_group_set_pan(ma_sound_group* pGroup, float pan)\n{\n    ma_sound_set_pan(pGroup, pan);\n}\n\nMA_API float ma_sound_group_get_pan(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_pan(pGroup);\n}\n\nMA_API void ma_sound_group_set_pan_mode(ma_sound_group* pGroup, ma_pan_mode panMode)\n{\n    ma_sound_set_pan_mode(pGroup, panMode);\n}\n\nMA_API ma_pan_mode ma_sound_group_get_pan_mode(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_pan_mode(pGroup);\n}\n\nMA_API void ma_sound_group_set_pitch(ma_sound_group* pGroup, float pitch)\n{\n    ma_sound_set_pitch(pGroup, pitch);\n}\n\nMA_API float ma_sound_group_get_pitch(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_pitch(pGroup);\n}\n\nMA_API void ma_sound_group_set_spatialization_enabled(ma_sound_group* pGroup, ma_bool32 enabled)\n{\n    ma_sound_set_spatialization_enabled(pGroup, enabled);\n}\n\nMA_API ma_bool32 ma_sound_group_is_spatialization_enabled(const ma_sound_group* pGroup)\n{\n    return ma_sound_is_spatialization_enabled(pGroup);\n}\n\nMA_API void ma_sound_group_set_pinned_listener_index(ma_sound_group* pGroup, ma_uint32 listenerIndex)\n{\n    ma_sound_set_pinned_listener_index(pGroup, listenerIndex);\n}\n\nMA_API ma_uint32 ma_sound_group_get_pinned_listener_index(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_pinned_listener_index(pGroup);\n}\n\nMA_API ma_uint32 ma_sound_group_get_listener_index(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_listener_index(pGroup);\n}\n\nMA_API ma_vec3f ma_sound_group_get_direction_to_listener(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_direction_to_listener(pGroup);\n}\n\nMA_API void ma_sound_group_set_position(ma_sound_group* pGroup, float x, float y, float z)\n{\n    ma_sound_set_position(pGroup, x, y, z);\n}\n\nMA_API ma_vec3f ma_sound_group_get_position(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_position(pGroup);\n}\n\nMA_API void ma_sound_group_set_direction(ma_sound_group* pGroup, float x, float y, float z)\n{\n    ma_sound_set_direction(pGroup, x, y, z);\n}\n\nMA_API ma_vec3f ma_sound_group_get_direction(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_direction(pGroup);\n}\n\nMA_API void ma_sound_group_set_velocity(ma_sound_group* pGroup, float x, float y, float z)\n{\n    ma_sound_set_velocity(pGroup, x, y, z);\n}\n\nMA_API ma_vec3f ma_sound_group_get_velocity(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_velocity(pGroup);\n}\n\nMA_API void ma_sound_group_set_attenuation_model(ma_sound_group* pGroup, ma_attenuation_model attenuationModel)\n{\n    ma_sound_set_attenuation_model(pGroup, attenuationModel);\n}\n\nMA_API ma_attenuation_model ma_sound_group_get_attenuation_model(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_attenuation_model(pGroup);\n}\n\nMA_API void ma_sound_group_set_positioning(ma_sound_group* pGroup, ma_positioning positioning)\n{\n    ma_sound_set_positioning(pGroup, positioning);\n}\n\nMA_API ma_positioning ma_sound_group_get_positioning(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_positioning(pGroup);\n}\n\nMA_API void ma_sound_group_set_rolloff(ma_sound_group* pGroup, float rolloff)\n{\n    ma_sound_set_rolloff(pGroup, rolloff);\n}\n\nMA_API float ma_sound_group_get_rolloff(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_rolloff(pGroup);\n}\n\nMA_API void ma_sound_group_set_min_gain(ma_sound_group* pGroup, float minGain)\n{\n    ma_sound_set_min_gain(pGroup, minGain);\n}\n\nMA_API float ma_sound_group_get_min_gain(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_min_gain(pGroup);\n}\n\nMA_API void ma_sound_group_set_max_gain(ma_sound_group* pGroup, float maxGain)\n{\n    ma_sound_set_max_gain(pGroup, maxGain);\n}\n\nMA_API float ma_sound_group_get_max_gain(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_max_gain(pGroup);\n}\n\nMA_API void ma_sound_group_set_min_distance(ma_sound_group* pGroup, float minDistance)\n{\n    ma_sound_set_min_distance(pGroup, minDistance);\n}\n\nMA_API float ma_sound_group_get_min_distance(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_min_distance(pGroup);\n}\n\nMA_API void ma_sound_group_set_max_distance(ma_sound_group* pGroup, float maxDistance)\n{\n    ma_sound_set_max_distance(pGroup, maxDistance);\n}\n\nMA_API float ma_sound_group_get_max_distance(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_max_distance(pGroup);\n}\n\nMA_API void ma_sound_group_set_cone(ma_sound_group* pGroup, float innerAngleInRadians, float outerAngleInRadians, float outerGain)\n{\n    ma_sound_set_cone(pGroup, innerAngleInRadians, outerAngleInRadians, outerGain);\n}\n\nMA_API void ma_sound_group_get_cone(const ma_sound_group* pGroup, float* pInnerAngleInRadians, float* pOuterAngleInRadians, float* pOuterGain)\n{\n    ma_sound_get_cone(pGroup, pInnerAngleInRadians, pOuterAngleInRadians, pOuterGain);\n}\n\nMA_API void ma_sound_group_set_doppler_factor(ma_sound_group* pGroup, float dopplerFactor)\n{\n    ma_sound_set_doppler_factor(pGroup, dopplerFactor);\n}\n\nMA_API float ma_sound_group_get_doppler_factor(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_doppler_factor(pGroup);\n}\n\nMA_API void ma_sound_group_set_directional_attenuation_factor(ma_sound_group* pGroup, float directionalAttenuationFactor)\n{\n    ma_sound_set_directional_attenuation_factor(pGroup, directionalAttenuationFactor);\n}\n\nMA_API float ma_sound_group_get_directional_attenuation_factor(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_directional_attenuation_factor(pGroup);\n}\n\nMA_API void ma_sound_group_set_fade_in_pcm_frames(ma_sound_group* pGroup, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInFrames)\n{\n    ma_sound_set_fade_in_pcm_frames(pGroup, volumeBeg, volumeEnd, fadeLengthInFrames);\n}\n\nMA_API void ma_sound_group_set_fade_in_milliseconds(ma_sound_group* pGroup, float volumeBeg, float volumeEnd, ma_uint64 fadeLengthInMilliseconds)\n{\n    ma_sound_set_fade_in_milliseconds(pGroup, volumeBeg, volumeEnd, fadeLengthInMilliseconds);\n}\n\nMA_API float ma_sound_group_get_current_fade_volume(ma_sound_group* pGroup)\n{\n    return ma_sound_get_current_fade_volume(pGroup);\n}\n\nMA_API void ma_sound_group_set_start_time_in_pcm_frames(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInFrames)\n{\n    ma_sound_set_start_time_in_pcm_frames(pGroup, absoluteGlobalTimeInFrames);\n}\n\nMA_API void ma_sound_group_set_start_time_in_milliseconds(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInMilliseconds)\n{\n    ma_sound_set_start_time_in_milliseconds(pGroup, absoluteGlobalTimeInMilliseconds);\n}\n\nMA_API void ma_sound_group_set_stop_time_in_pcm_frames(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInFrames)\n{\n    ma_sound_set_stop_time_in_pcm_frames(pGroup, absoluteGlobalTimeInFrames);\n}\n\nMA_API void ma_sound_group_set_stop_time_in_milliseconds(ma_sound_group* pGroup, ma_uint64 absoluteGlobalTimeInMilliseconds)\n{\n    ma_sound_set_stop_time_in_milliseconds(pGroup, absoluteGlobalTimeInMilliseconds);\n}\n\nMA_API ma_bool32 ma_sound_group_is_playing(const ma_sound_group* pGroup)\n{\n    return ma_sound_is_playing(pGroup);\n}\n\nMA_API ma_uint64 ma_sound_group_get_time_in_pcm_frames(const ma_sound_group* pGroup)\n{\n    return ma_sound_get_time_in_pcm_frames(pGroup);\n}\n#endif  /* MA_NO_ENGINE */\n/* END SECTION: miniaudio_engine.c */\n\n\n\n/**************************************************************************************************************************************************************\n***************************************************************************************************************************************************************\n\nAuto Generated\n==============\nAll code below is auto-generated from a tool. This mostly consists of decoding backend implementations such as ma_dr_wav, ma_dr_flac, etc. If you find a bug in the\ncode below please report the bug to the respective repository for the relevant project (probably dr_libs).\n\n***************************************************************************************************************************************************************\n**************************************************************************************************************************************************************/\n#if !defined(MA_NO_WAV) && (!defined(MA_NO_DECODING) || !defined(MA_NO_ENCODING))\n#if !defined(MA_DR_WAV_IMPLEMENTATION) && !defined(MA_DR_WAV_IMPLEMENTATION) /* For backwards compatibility. Will be removed in version 0.11 for cleanliness. */\n/* dr_wav_c begin */\n#ifndef ma_dr_wav_c\n#define ma_dr_wav_c\n#ifdef __MRC__\n#pragma options opt off\n#endif\n#include <stdlib.h>\n#include <string.h>\n#include <limits.h>\n#ifndef MA_DR_WAV_NO_STDIO\n#include <stdio.h>\n#ifndef MA_DR_WAV_NO_WCHAR\n#include <wchar.h>\n#endif\n#endif\n#ifndef MA_DR_WAV_ASSERT\n#include <assert.h>\n#define MA_DR_WAV_ASSERT(expression)           assert(expression)\n#endif\n#ifndef MA_DR_WAV_MALLOC\n#define MA_DR_WAV_MALLOC(sz)                   malloc((sz))\n#endif\n#ifndef MA_DR_WAV_REALLOC\n#define MA_DR_WAV_REALLOC(p, sz)               realloc((p), (sz))\n#endif\n#ifndef MA_DR_WAV_FREE\n#define MA_DR_WAV_FREE(p)                      free((p))\n#endif\n#ifndef MA_DR_WAV_COPY_MEMORY\n#define MA_DR_WAV_COPY_MEMORY(dst, src, sz)    memcpy((dst), (src), (sz))\n#endif\n#ifndef MA_DR_WAV_ZERO_MEMORY\n#define MA_DR_WAV_ZERO_MEMORY(p, sz)           memset((p), 0, (sz))\n#endif\n#ifndef MA_DR_WAV_ZERO_OBJECT\n#define MA_DR_WAV_ZERO_OBJECT(p)               MA_DR_WAV_ZERO_MEMORY((p), sizeof(*p))\n#endif\n#define ma_dr_wav_countof(x)                   (sizeof(x) / sizeof(x[0]))\n#define ma_dr_wav_align(x, a)                  ((((x) + (a) - 1) / (a)) * (a))\n#define ma_dr_wav_min(a, b)                    (((a) < (b)) ? (a) : (b))\n#define ma_dr_wav_max(a, b)                    (((a) > (b)) ? (a) : (b))\n#define ma_dr_wav_clamp(x, lo, hi)             (ma_dr_wav_max((lo), ma_dr_wav_min((hi), (x))))\n#define ma_dr_wav_offset_ptr(p, offset)        (((ma_uint8*)(p)) + (offset))\n#define MA_DR_WAV_MAX_SIMD_VECTOR_SIZE         32\n#define MA_DR_WAV_INT64_MIN ((ma_int64) ((ma_uint64)0x80000000 << 32))\n#define MA_DR_WAV_INT64_MAX ((ma_int64)(((ma_uint64)0x7FFFFFFF << 32) | 0xFFFFFFFF))\n#if defined(_MSC_VER) && _MSC_VER >= 1400\n    #define MA_DR_WAV_HAS_BYTESWAP16_INTRINSIC\n    #define MA_DR_WAV_HAS_BYTESWAP32_INTRINSIC\n    #define MA_DR_WAV_HAS_BYTESWAP64_INTRINSIC\n#elif defined(__clang__)\n    #if defined(__has_builtin)\n        #if __has_builtin(__builtin_bswap16)\n            #define MA_DR_WAV_HAS_BYTESWAP16_INTRINSIC\n        #endif\n        #if __has_builtin(__builtin_bswap32)\n            #define MA_DR_WAV_HAS_BYTESWAP32_INTRINSIC\n        #endif\n        #if __has_builtin(__builtin_bswap64)\n            #define MA_DR_WAV_HAS_BYTESWAP64_INTRINSIC\n        #endif\n    #endif\n#elif defined(__GNUC__)\n    #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))\n        #define MA_DR_WAV_HAS_BYTESWAP32_INTRINSIC\n        #define MA_DR_WAV_HAS_BYTESWAP64_INTRINSIC\n    #endif\n    #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))\n        #define MA_DR_WAV_HAS_BYTESWAP16_INTRINSIC\n    #endif\n#endif\nMA_API void ma_dr_wav_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* pRevision)\n{\n    if (pMajor) {\n        *pMajor = MA_DR_WAV_VERSION_MAJOR;\n    }\n    if (pMinor) {\n        *pMinor = MA_DR_WAV_VERSION_MINOR;\n    }\n    if (pRevision) {\n        *pRevision = MA_DR_WAV_VERSION_REVISION;\n    }\n}\nMA_API const char* ma_dr_wav_version_string(void)\n{\n    return MA_DR_WAV_VERSION_STRING;\n}\n#ifndef MA_DR_WAV_MAX_SAMPLE_RATE\n#define MA_DR_WAV_MAX_SAMPLE_RATE       384000\n#endif\n#ifndef MA_DR_WAV_MAX_CHANNELS\n#define MA_DR_WAV_MAX_CHANNELS          256\n#endif\n#ifndef MA_DR_WAV_MAX_BITS_PER_SAMPLE\n#define MA_DR_WAV_MAX_BITS_PER_SAMPLE   64\n#endif\nstatic const ma_uint8 ma_dr_wavGUID_W64_RIFF[16] = {0x72,0x69,0x66,0x66, 0x2E,0x91, 0xCF,0x11, 0xA5,0xD6, 0x28,0xDB,0x04,0xC1,0x00,0x00};\nstatic const ma_uint8 ma_dr_wavGUID_W64_WAVE[16] = {0x77,0x61,0x76,0x65, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A};\nstatic const ma_uint8 ma_dr_wavGUID_W64_FMT [16] = {0x66,0x6D,0x74,0x20, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A};\nstatic const ma_uint8 ma_dr_wavGUID_W64_FACT[16] = {0x66,0x61,0x63,0x74, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A};\nstatic const ma_uint8 ma_dr_wavGUID_W64_DATA[16] = {0x64,0x61,0x74,0x61, 0xF3,0xAC, 0xD3,0x11, 0x8C,0xD1, 0x00,0xC0,0x4F,0x8E,0xDB,0x8A};\nstatic MA_INLINE int ma_dr_wav__is_little_endian(void)\n{\n#if defined(MA_X86) || defined(MA_X64)\n    return MA_TRUE;\n#elif defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN\n    return MA_TRUE;\n#else\n    int n = 1;\n    return (*(char*)&n) == 1;\n#endif\n}\nstatic MA_INLINE void ma_dr_wav_bytes_to_guid(const ma_uint8* data, ma_uint8* guid)\n{\n    int i;\n    for (i = 0; i < 16; ++i) {\n        guid[i] = data[i];\n    }\n}\nstatic MA_INLINE ma_uint16 ma_dr_wav__bswap16(ma_uint16 n)\n{\n#ifdef MA_DR_WAV_HAS_BYTESWAP16_INTRINSIC\n    #if defined(_MSC_VER)\n        return _byteswap_ushort(n);\n    #elif defined(__GNUC__) || defined(__clang__)\n        return __builtin_bswap16(n);\n    #else\n        #error \"This compiler does not support the byte swap intrinsic.\"\n    #endif\n#else\n    return ((n & 0xFF00) >> 8) |\n           ((n & 0x00FF) << 8);\n#endif\n}\nstatic MA_INLINE ma_uint32 ma_dr_wav__bswap32(ma_uint32 n)\n{\n#ifdef MA_DR_WAV_HAS_BYTESWAP32_INTRINSIC\n    #if defined(_MSC_VER)\n        return _byteswap_ulong(n);\n    #elif defined(__GNUC__) || defined(__clang__)\n        #if defined(MA_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 6) && !defined(MA_64BIT)\n            ma_uint32 r;\n            __asm__ __volatile__ (\n            #if defined(MA_64BIT)\n                \"rev %w[out], %w[in]\" : [out]\"=r\"(r) : [in]\"r\"(n)\n            #else\n                \"rev %[out], %[in]\" : [out]\"=r\"(r) : [in]\"r\"(n)\n            #endif\n            );\n            return r;\n        #else\n            return __builtin_bswap32(n);\n        #endif\n    #else\n        #error \"This compiler does not support the byte swap intrinsic.\"\n    #endif\n#else\n    return ((n & 0xFF000000) >> 24) |\n           ((n & 0x00FF0000) >>  8) |\n           ((n & 0x0000FF00) <<  8) |\n           ((n & 0x000000FF) << 24);\n#endif\n}\nstatic MA_INLINE ma_uint64 ma_dr_wav__bswap64(ma_uint64 n)\n{\n#ifdef MA_DR_WAV_HAS_BYTESWAP64_INTRINSIC\n    #if defined(_MSC_VER)\n        return _byteswap_uint64(n);\n    #elif defined(__GNUC__) || defined(__clang__)\n        return __builtin_bswap64(n);\n    #else\n        #error \"This compiler does not support the byte swap intrinsic.\"\n    #endif\n#else\n    return ((n & ((ma_uint64)0xFF000000 << 32)) >> 56) |\n           ((n & ((ma_uint64)0x00FF0000 << 32)) >> 40) |\n           ((n & ((ma_uint64)0x0000FF00 << 32)) >> 24) |\n           ((n & ((ma_uint64)0x000000FF << 32)) >>  8) |\n           ((n & ((ma_uint64)0xFF000000      )) <<  8) |\n           ((n & ((ma_uint64)0x00FF0000      )) << 24) |\n           ((n & ((ma_uint64)0x0000FF00      )) << 40) |\n           ((n & ((ma_uint64)0x000000FF      )) << 56);\n#endif\n}\nstatic MA_INLINE ma_int16 ma_dr_wav__bswap_s16(ma_int16 n)\n{\n    return (ma_int16)ma_dr_wav__bswap16((ma_uint16)n);\n}\nstatic MA_INLINE void ma_dr_wav__bswap_samples_s16(ma_int16* pSamples, ma_uint64 sampleCount)\n{\n    ma_uint64 iSample;\n    for (iSample = 0; iSample < sampleCount; iSample += 1) {\n        pSamples[iSample] = ma_dr_wav__bswap_s16(pSamples[iSample]);\n    }\n}\nstatic MA_INLINE void ma_dr_wav__bswap_s24(ma_uint8* p)\n{\n    ma_uint8 t;\n    t = p[0];\n    p[0] = p[2];\n    p[2] = t;\n}\nstatic MA_INLINE void ma_dr_wav__bswap_samples_s24(ma_uint8* pSamples, ma_uint64 sampleCount)\n{\n    ma_uint64 iSample;\n    for (iSample = 0; iSample < sampleCount; iSample += 1) {\n        ma_uint8* pSample = pSamples + (iSample*3);\n        ma_dr_wav__bswap_s24(pSample);\n    }\n}\nstatic MA_INLINE ma_int32 ma_dr_wav__bswap_s32(ma_int32 n)\n{\n    return (ma_int32)ma_dr_wav__bswap32((ma_uint32)n);\n}\nstatic MA_INLINE void ma_dr_wav__bswap_samples_s32(ma_int32* pSamples, ma_uint64 sampleCount)\n{\n    ma_uint64 iSample;\n    for (iSample = 0; iSample < sampleCount; iSample += 1) {\n        pSamples[iSample] = ma_dr_wav__bswap_s32(pSamples[iSample]);\n    }\n}\nstatic MA_INLINE ma_int64 ma_dr_wav__bswap_s64(ma_int64 n)\n{\n    return (ma_int64)ma_dr_wav__bswap64((ma_uint64)n);\n}\nstatic MA_INLINE void ma_dr_wav__bswap_samples_s64(ma_int64* pSamples, ma_uint64 sampleCount)\n{\n    ma_uint64 iSample;\n    for (iSample = 0; iSample < sampleCount; iSample += 1) {\n        pSamples[iSample] = ma_dr_wav__bswap_s64(pSamples[iSample]);\n    }\n}\nstatic MA_INLINE float ma_dr_wav__bswap_f32(float n)\n{\n    union {\n        ma_uint32 i;\n        float f;\n    } x;\n    x.f = n;\n    x.i = ma_dr_wav__bswap32(x.i);\n    return x.f;\n}\nstatic MA_INLINE void ma_dr_wav__bswap_samples_f32(float* pSamples, ma_uint64 sampleCount)\n{\n    ma_uint64 iSample;\n    for (iSample = 0; iSample < sampleCount; iSample += 1) {\n        pSamples[iSample] = ma_dr_wav__bswap_f32(pSamples[iSample]);\n    }\n}\nstatic MA_INLINE void ma_dr_wav__bswap_samples(void* pSamples, ma_uint64 sampleCount, ma_uint32 bytesPerSample)\n{\n    switch (bytesPerSample)\n    {\n        case 1:\n        {\n        } break;\n        case 2:\n        {\n            ma_dr_wav__bswap_samples_s16((ma_int16*)pSamples, sampleCount);\n        } break;\n        case 3:\n        {\n            ma_dr_wav__bswap_samples_s24((ma_uint8*)pSamples, sampleCount);\n        } break;\n        case 4:\n        {\n            ma_dr_wav__bswap_samples_s32((ma_int32*)pSamples, sampleCount);\n        } break;\n        case 8:\n        {\n            ma_dr_wav__bswap_samples_s64((ma_int64*)pSamples, sampleCount);\n        } break;\n        default:\n        {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n        } break;\n    }\n}\nMA_PRIVATE MA_INLINE ma_bool32 ma_dr_wav_is_container_be(ma_dr_wav_container container)\n{\n    if (container == ma_dr_wav_container_rifx || container == ma_dr_wav_container_aiff) {\n        return MA_TRUE;\n    } else {\n        return MA_FALSE;\n    }\n}\nMA_PRIVATE MA_INLINE ma_uint16 ma_dr_wav_bytes_to_u16_le(const ma_uint8* data)\n{\n    return ((ma_uint16)data[0] << 0) | ((ma_uint16)data[1] << 8);\n}\nMA_PRIVATE MA_INLINE ma_uint16 ma_dr_wav_bytes_to_u16_be(const ma_uint8* data)\n{\n    return ((ma_uint16)data[1] << 0) | ((ma_uint16)data[0] << 8);\n}\nMA_PRIVATE MA_INLINE ma_uint16 ma_dr_wav_bytes_to_u16_ex(const ma_uint8* data, ma_dr_wav_container container)\n{\n    if (ma_dr_wav_is_container_be(container)) {\n        return ma_dr_wav_bytes_to_u16_be(data);\n    } else {\n        return ma_dr_wav_bytes_to_u16_le(data);\n    }\n}\nMA_PRIVATE MA_INLINE ma_uint32 ma_dr_wav_bytes_to_u32_le(const ma_uint8* data)\n{\n    return ((ma_uint32)data[0] << 0) | ((ma_uint32)data[1] << 8) | ((ma_uint32)data[2] << 16) | ((ma_uint32)data[3] << 24);\n}\nMA_PRIVATE MA_INLINE ma_uint32 ma_dr_wav_bytes_to_u32_be(const ma_uint8* data)\n{\n    return ((ma_uint32)data[3] << 0) | ((ma_uint32)data[2] << 8) | ((ma_uint32)data[1] << 16) | ((ma_uint32)data[0] << 24);\n}\nMA_PRIVATE MA_INLINE ma_uint32 ma_dr_wav_bytes_to_u32_ex(const ma_uint8* data, ma_dr_wav_container container)\n{\n    if (ma_dr_wav_is_container_be(container)) {\n        return ma_dr_wav_bytes_to_u32_be(data);\n    } else {\n        return ma_dr_wav_bytes_to_u32_le(data);\n    }\n}\nMA_PRIVATE ma_int64 ma_dr_wav_aiff_extented_to_s64(const ma_uint8* data)\n{\n    ma_uint32 exponent = ((ma_uint32)data[0] << 8) | data[1];\n    ma_uint64 hi = ((ma_uint64)data[2] << 24) | ((ma_uint64)data[3] << 16) | ((ma_uint64)data[4] <<  8) | ((ma_uint64)data[5] <<  0);\n    ma_uint64 lo = ((ma_uint64)data[6] << 24) | ((ma_uint64)data[7] << 16) | ((ma_uint64)data[8] <<  8) | ((ma_uint64)data[9] <<  0);\n    ma_uint64 significand = (hi << 32) | lo;\n    int sign = exponent >> 15;\n    exponent &= 0x7FFF;\n    if (exponent == 0 && significand == 0) {\n        return 0;\n    } else if (exponent == 0x7FFF) {\n        return sign ? MA_DR_WAV_INT64_MIN : MA_DR_WAV_INT64_MAX;\n    }\n    exponent -= 16383;\n    if (exponent > 63) {\n        return sign ? MA_DR_WAV_INT64_MIN : MA_DR_WAV_INT64_MAX;\n    } else if (exponent < 1) {\n        return 0;\n    }\n    significand >>= (63 - exponent);\n    if (sign) {\n        return -(ma_int64)significand;\n    } else {\n        return  (ma_int64)significand;\n    }\n}\nMA_PRIVATE void* ma_dr_wav__malloc_default(size_t sz, void* pUserData)\n{\n    (void)pUserData;\n    return MA_DR_WAV_MALLOC(sz);\n}\nMA_PRIVATE void* ma_dr_wav__realloc_default(void* p, size_t sz, void* pUserData)\n{\n    (void)pUserData;\n    return MA_DR_WAV_REALLOC(p, sz);\n}\nMA_PRIVATE void ma_dr_wav__free_default(void* p, void* pUserData)\n{\n    (void)pUserData;\n    MA_DR_WAV_FREE(p);\n}\nMA_PRIVATE void* ma_dr_wav__malloc_from_callbacks(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks == NULL) {\n        return NULL;\n    }\n    if (pAllocationCallbacks->onMalloc != NULL) {\n        return pAllocationCallbacks->onMalloc(sz, pAllocationCallbacks->pUserData);\n    }\n    if (pAllocationCallbacks->onRealloc != NULL) {\n        return pAllocationCallbacks->onRealloc(NULL, sz, pAllocationCallbacks->pUserData);\n    }\n    return NULL;\n}\nMA_PRIVATE void* ma_dr_wav__realloc_from_callbacks(void* p, size_t szNew, size_t szOld, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks == NULL) {\n        return NULL;\n    }\n    if (pAllocationCallbacks->onRealloc != NULL) {\n        return pAllocationCallbacks->onRealloc(p, szNew, pAllocationCallbacks->pUserData);\n    }\n    if (pAllocationCallbacks->onMalloc != NULL && pAllocationCallbacks->onFree != NULL) {\n        void* p2;\n        p2 = pAllocationCallbacks->onMalloc(szNew, pAllocationCallbacks->pUserData);\n        if (p2 == NULL) {\n            return NULL;\n        }\n        if (p != NULL) {\n            MA_DR_WAV_COPY_MEMORY(p2, p, szOld);\n            pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);\n        }\n        return p2;\n    }\n    return NULL;\n}\nMA_PRIVATE void ma_dr_wav__free_from_callbacks(void* p, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (p == NULL || pAllocationCallbacks == NULL) {\n        return;\n    }\n    if (pAllocationCallbacks->onFree != NULL) {\n        pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);\n    }\n}\nMA_PRIVATE ma_allocation_callbacks ma_dr_wav_copy_allocation_callbacks_or_defaults(const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks != NULL) {\n        return *pAllocationCallbacks;\n    } else {\n        ma_allocation_callbacks allocationCallbacks;\n        allocationCallbacks.pUserData = NULL;\n        allocationCallbacks.onMalloc  = ma_dr_wav__malloc_default;\n        allocationCallbacks.onRealloc = ma_dr_wav__realloc_default;\n        allocationCallbacks.onFree    = ma_dr_wav__free_default;\n        return allocationCallbacks;\n    }\n}\nstatic MA_INLINE ma_bool32 ma_dr_wav__is_compressed_format_tag(ma_uint16 formatTag)\n{\n    return\n        formatTag == MA_DR_WAVE_FORMAT_ADPCM ||\n        formatTag == MA_DR_WAVE_FORMAT_DVI_ADPCM;\n}\nMA_PRIVATE unsigned int ma_dr_wav__chunk_padding_size_riff(ma_uint64 chunkSize)\n{\n    return (unsigned int)(chunkSize % 2);\n}\nMA_PRIVATE unsigned int ma_dr_wav__chunk_padding_size_w64(ma_uint64 chunkSize)\n{\n    return (unsigned int)(chunkSize % 8);\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__msadpcm(ma_dr_wav* pWav, ma_uint64 samplesToRead, ma_int16* pBufferOut);\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__ima(ma_dr_wav* pWav, ma_uint64 samplesToRead, ma_int16* pBufferOut);\nMA_PRIVATE ma_bool32 ma_dr_wav_init_write__internal(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount);\nMA_PRIVATE ma_result ma_dr_wav__read_chunk_header(ma_dr_wav_read_proc onRead, void* pUserData, ma_dr_wav_container container, ma_uint64* pRunningBytesReadOut, ma_dr_wav_chunk_header* pHeaderOut)\n{\n    if (container == ma_dr_wav_container_riff || container == ma_dr_wav_container_rifx || container == ma_dr_wav_container_rf64 || container == ma_dr_wav_container_aiff) {\n        ma_uint8 sizeInBytes[4];\n        if (onRead(pUserData, pHeaderOut->id.fourcc, 4) != 4) {\n            return MA_AT_END;\n        }\n        if (onRead(pUserData, sizeInBytes, 4) != 4) {\n            return MA_INVALID_FILE;\n        }\n        pHeaderOut->sizeInBytes = ma_dr_wav_bytes_to_u32_ex(sizeInBytes, container);\n        pHeaderOut->paddingSize = ma_dr_wav__chunk_padding_size_riff(pHeaderOut->sizeInBytes);\n        *pRunningBytesReadOut += 8;\n    } else if (container == ma_dr_wav_container_w64) {\n        ma_uint8 sizeInBytes[8];\n        if (onRead(pUserData, pHeaderOut->id.guid, 16) != 16) {\n            return MA_AT_END;\n        }\n        if (onRead(pUserData, sizeInBytes, 8) != 8) {\n            return MA_INVALID_FILE;\n        }\n        pHeaderOut->sizeInBytes = ma_dr_wav_bytes_to_u64(sizeInBytes) - 24;\n        pHeaderOut->paddingSize = ma_dr_wav__chunk_padding_size_w64(pHeaderOut->sizeInBytes);\n        *pRunningBytesReadOut += 24;\n    } else {\n        return MA_INVALID_FILE;\n    }\n    return MA_SUCCESS;\n}\nMA_PRIVATE ma_bool32 ma_dr_wav__seek_forward(ma_dr_wav_seek_proc onSeek, ma_uint64 offset, void* pUserData)\n{\n    ma_uint64 bytesRemainingToSeek = offset;\n    while (bytesRemainingToSeek > 0) {\n        if (bytesRemainingToSeek > 0x7FFFFFFF) {\n            if (!onSeek(pUserData, 0x7FFFFFFF, ma_dr_wav_seek_origin_current)) {\n                return MA_FALSE;\n            }\n            bytesRemainingToSeek -= 0x7FFFFFFF;\n        } else {\n            if (!onSeek(pUserData, (int)bytesRemainingToSeek, ma_dr_wav_seek_origin_current)) {\n                return MA_FALSE;\n            }\n            bytesRemainingToSeek = 0;\n        }\n    }\n    return MA_TRUE;\n}\nMA_PRIVATE ma_bool32 ma_dr_wav__seek_from_start(ma_dr_wav_seek_proc onSeek, ma_uint64 offset, void* pUserData)\n{\n    if (offset <= 0x7FFFFFFF) {\n        return onSeek(pUserData, (int)offset, ma_dr_wav_seek_origin_start);\n    }\n    if (!onSeek(pUserData, 0x7FFFFFFF, ma_dr_wav_seek_origin_start)) {\n        return MA_FALSE;\n    }\n    offset -= 0x7FFFFFFF;\n    for (;;) {\n        if (offset <= 0x7FFFFFFF) {\n            return onSeek(pUserData, (int)offset, ma_dr_wav_seek_origin_current);\n        }\n        if (!onSeek(pUserData, 0x7FFFFFFF, ma_dr_wav_seek_origin_current)) {\n            return MA_FALSE;\n        }\n        offset -= 0x7FFFFFFF;\n    }\n}\nMA_PRIVATE size_t ma_dr_wav__on_read(ma_dr_wav_read_proc onRead, void* pUserData, void* pBufferOut, size_t bytesToRead, ma_uint64* pCursor)\n{\n    size_t bytesRead;\n    MA_DR_WAV_ASSERT(onRead != NULL);\n    MA_DR_WAV_ASSERT(pCursor != NULL);\n    bytesRead = onRead(pUserData, pBufferOut, bytesToRead);\n    *pCursor += bytesRead;\n    return bytesRead;\n}\n#if 0\nMA_PRIVATE ma_bool32 ma_dr_wav__on_seek(ma_dr_wav_seek_proc onSeek, void* pUserData, int offset, ma_dr_wav_seek_origin origin, ma_uint64* pCursor)\n{\n    MA_DR_WAV_ASSERT(onSeek != NULL);\n    MA_DR_WAV_ASSERT(pCursor != NULL);\n    if (!onSeek(pUserData, offset, origin)) {\n        return MA_FALSE;\n    }\n    if (origin == ma_dr_wav_seek_origin_start) {\n        *pCursor = offset;\n    } else {\n        *pCursor += offset;\n    }\n    return MA_TRUE;\n}\n#endif\n#define MA_DR_WAV_SMPL_BYTES                    36\n#define MA_DR_WAV_SMPL_LOOP_BYTES               24\n#define MA_DR_WAV_INST_BYTES                    7\n#define MA_DR_WAV_ACID_BYTES                    24\n#define MA_DR_WAV_CUE_BYTES                     4\n#define MA_DR_WAV_BEXT_BYTES                    602\n#define MA_DR_WAV_BEXT_DESCRIPTION_BYTES        256\n#define MA_DR_WAV_BEXT_ORIGINATOR_NAME_BYTES    32\n#define MA_DR_WAV_BEXT_ORIGINATOR_REF_BYTES     32\n#define MA_DR_WAV_BEXT_RESERVED_BYTES           180\n#define MA_DR_WAV_BEXT_UMID_BYTES               64\n#define MA_DR_WAV_CUE_POINT_BYTES               24\n#define MA_DR_WAV_LIST_LABEL_OR_NOTE_BYTES      4\n#define MA_DR_WAV_LIST_LABELLED_TEXT_BYTES      20\n#define MA_DR_WAV_METADATA_ALIGNMENT            8\ntypedef enum\n{\n    ma_dr_wav__metadata_parser_stage_count,\n    ma_dr_wav__metadata_parser_stage_read\n} ma_dr_wav__metadata_parser_stage;\ntypedef struct\n{\n    ma_dr_wav_read_proc onRead;\n    ma_dr_wav_seek_proc onSeek;\n    void *pReadSeekUserData;\n    ma_dr_wav__metadata_parser_stage stage;\n    ma_dr_wav_metadata *pMetadata;\n    ma_uint32 metadataCount;\n    ma_uint8 *pData;\n    ma_uint8 *pDataCursor;\n    ma_uint64 metadataCursor;\n    ma_uint64 extraCapacity;\n} ma_dr_wav__metadata_parser;\nMA_PRIVATE size_t ma_dr_wav__metadata_memory_capacity(ma_dr_wav__metadata_parser* pParser)\n{\n    ma_uint64 cap = sizeof(ma_dr_wav_metadata) * (ma_uint64)pParser->metadataCount + pParser->extraCapacity;\n    if (cap > MA_SIZE_MAX) {\n        return 0;\n    }\n    return (size_t)cap;\n}\nMA_PRIVATE ma_uint8* ma_dr_wav__metadata_get_memory(ma_dr_wav__metadata_parser* pParser, size_t size, size_t align)\n{\n    ma_uint8* pResult;\n    if (align) {\n        ma_uintptr modulo = (ma_uintptr)pParser->pDataCursor % align;\n        if (modulo != 0) {\n            pParser->pDataCursor += align - modulo;\n        }\n    }\n    pResult = pParser->pDataCursor;\n    MA_DR_WAV_ASSERT((pResult + size) <= (pParser->pData + ma_dr_wav__metadata_memory_capacity(pParser)));\n    pParser->pDataCursor += size;\n    return pResult;\n}\nMA_PRIVATE void ma_dr_wav__metadata_request_extra_memory_for_stage_2(ma_dr_wav__metadata_parser* pParser, size_t bytes, size_t align)\n{\n    size_t extra = bytes + (align ? (align - 1) : 0);\n    pParser->extraCapacity += extra;\n}\nMA_PRIVATE ma_result ma_dr_wav__metadata_alloc(ma_dr_wav__metadata_parser* pParser, ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pParser->extraCapacity != 0 || pParser->metadataCount != 0) {\n        pAllocationCallbacks->onFree(pParser->pData, pAllocationCallbacks->pUserData);\n        pParser->pData = (ma_uint8*)pAllocationCallbacks->onMalloc(ma_dr_wav__metadata_memory_capacity(pParser), pAllocationCallbacks->pUserData);\n        pParser->pDataCursor = pParser->pData;\n        if (pParser->pData == NULL) {\n            return MA_OUT_OF_MEMORY;\n        }\n        pParser->pMetadata = (ma_dr_wav_metadata*)ma_dr_wav__metadata_get_memory(pParser, sizeof(ma_dr_wav_metadata) * pParser->metadataCount, 1);\n        pParser->metadataCursor = 0;\n    }\n    return MA_SUCCESS;\n}\nMA_PRIVATE size_t ma_dr_wav__metadata_parser_read(ma_dr_wav__metadata_parser* pParser, void* pBufferOut, size_t bytesToRead, ma_uint64* pCursor)\n{\n    if (pCursor != NULL) {\n        return ma_dr_wav__on_read(pParser->onRead, pParser->pReadSeekUserData, pBufferOut, bytesToRead, pCursor);\n    } else {\n        return pParser->onRead(pParser->pReadSeekUserData, pBufferOut, bytesToRead);\n    }\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__read_smpl_to_metadata_obj(ma_dr_wav__metadata_parser* pParser, const ma_dr_wav_chunk_header* pChunkHeader, ma_dr_wav_metadata* pMetadata)\n{\n    ma_uint8 smplHeaderData[MA_DR_WAV_SMPL_BYTES];\n    ma_uint64 totalBytesRead = 0;\n    size_t bytesJustRead;\n    if (pMetadata == NULL) {\n        return 0;\n    }\n    bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, smplHeaderData, sizeof(smplHeaderData), &totalBytesRead);\n    MA_DR_WAV_ASSERT(pParser->stage == ma_dr_wav__metadata_parser_stage_read);\n    MA_DR_WAV_ASSERT(pChunkHeader != NULL);\n    if (pMetadata != NULL && bytesJustRead == sizeof(smplHeaderData)) {\n        ma_uint32 iSampleLoop;\n        pMetadata->type                                     = ma_dr_wav_metadata_type_smpl;\n        pMetadata->data.smpl.manufacturerId                 = ma_dr_wav_bytes_to_u32(smplHeaderData + 0);\n        pMetadata->data.smpl.productId                      = ma_dr_wav_bytes_to_u32(smplHeaderData + 4);\n        pMetadata->data.smpl.samplePeriodNanoseconds        = ma_dr_wav_bytes_to_u32(smplHeaderData + 8);\n        pMetadata->data.smpl.midiUnityNote                  = ma_dr_wav_bytes_to_u32(smplHeaderData + 12);\n        pMetadata->data.smpl.midiPitchFraction              = ma_dr_wav_bytes_to_u32(smplHeaderData + 16);\n        pMetadata->data.smpl.smpteFormat                    = ma_dr_wav_bytes_to_u32(smplHeaderData + 20);\n        pMetadata->data.smpl.smpteOffset                    = ma_dr_wav_bytes_to_u32(smplHeaderData + 24);\n        pMetadata->data.smpl.sampleLoopCount                = ma_dr_wav_bytes_to_u32(smplHeaderData + 28);\n        pMetadata->data.smpl.samplerSpecificDataSizeInBytes = ma_dr_wav_bytes_to_u32(smplHeaderData + 32);\n        if (pMetadata->data.smpl.sampleLoopCount == (pChunkHeader->sizeInBytes - MA_DR_WAV_SMPL_BYTES) / MA_DR_WAV_SMPL_LOOP_BYTES) {\n            pMetadata->data.smpl.pLoops = (ma_dr_wav_smpl_loop*)ma_dr_wav__metadata_get_memory(pParser, sizeof(ma_dr_wav_smpl_loop) * pMetadata->data.smpl.sampleLoopCount, MA_DR_WAV_METADATA_ALIGNMENT);\n            for (iSampleLoop = 0; iSampleLoop < pMetadata->data.smpl.sampleLoopCount; ++iSampleLoop) {\n                ma_uint8 smplLoopData[MA_DR_WAV_SMPL_LOOP_BYTES];\n                bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, smplLoopData, sizeof(smplLoopData), &totalBytesRead);\n                if (bytesJustRead == sizeof(smplLoopData)) {\n                    pMetadata->data.smpl.pLoops[iSampleLoop].cuePointId            = ma_dr_wav_bytes_to_u32(smplLoopData + 0);\n                    pMetadata->data.smpl.pLoops[iSampleLoop].type                  = ma_dr_wav_bytes_to_u32(smplLoopData + 4);\n                    pMetadata->data.smpl.pLoops[iSampleLoop].firstSampleByteOffset = ma_dr_wav_bytes_to_u32(smplLoopData + 8);\n                    pMetadata->data.smpl.pLoops[iSampleLoop].lastSampleByteOffset  = ma_dr_wav_bytes_to_u32(smplLoopData + 12);\n                    pMetadata->data.smpl.pLoops[iSampleLoop].sampleFraction        = ma_dr_wav_bytes_to_u32(smplLoopData + 16);\n                    pMetadata->data.smpl.pLoops[iSampleLoop].playCount             = ma_dr_wav_bytes_to_u32(smplLoopData + 20);\n                } else {\n                    break;\n                }\n            }\n            if (pMetadata->data.smpl.samplerSpecificDataSizeInBytes > 0) {\n                pMetadata->data.smpl.pSamplerSpecificData = ma_dr_wav__metadata_get_memory(pParser, pMetadata->data.smpl.samplerSpecificDataSizeInBytes, 1);\n                MA_DR_WAV_ASSERT(pMetadata->data.smpl.pSamplerSpecificData != NULL);\n                ma_dr_wav__metadata_parser_read(pParser, pMetadata->data.smpl.pSamplerSpecificData, pMetadata->data.smpl.samplerSpecificDataSizeInBytes, &totalBytesRead);\n            }\n        }\n    }\n    return totalBytesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__read_cue_to_metadata_obj(ma_dr_wav__metadata_parser* pParser, const ma_dr_wav_chunk_header* pChunkHeader, ma_dr_wav_metadata* pMetadata)\n{\n    ma_uint8 cueHeaderSectionData[MA_DR_WAV_CUE_BYTES];\n    ma_uint64 totalBytesRead = 0;\n    size_t bytesJustRead;\n    if (pMetadata == NULL) {\n        return 0;\n    }\n    bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, cueHeaderSectionData, sizeof(cueHeaderSectionData), &totalBytesRead);\n    MA_DR_WAV_ASSERT(pParser->stage == ma_dr_wav__metadata_parser_stage_read);\n    if (bytesJustRead == sizeof(cueHeaderSectionData)) {\n        pMetadata->type                   = ma_dr_wav_metadata_type_cue;\n        pMetadata->data.cue.cuePointCount = ma_dr_wav_bytes_to_u32(cueHeaderSectionData);\n        if (pMetadata->data.cue.cuePointCount == (pChunkHeader->sizeInBytes - MA_DR_WAV_CUE_BYTES) / MA_DR_WAV_CUE_POINT_BYTES) {\n            pMetadata->data.cue.pCuePoints    = (ma_dr_wav_cue_point*)ma_dr_wav__metadata_get_memory(pParser, sizeof(ma_dr_wav_cue_point) * pMetadata->data.cue.cuePointCount, MA_DR_WAV_METADATA_ALIGNMENT);\n            MA_DR_WAV_ASSERT(pMetadata->data.cue.pCuePoints != NULL);\n            if (pMetadata->data.cue.cuePointCount > 0) {\n                ma_uint32 iCuePoint;\n                for (iCuePoint = 0; iCuePoint < pMetadata->data.cue.cuePointCount; ++iCuePoint) {\n                    ma_uint8 cuePointData[MA_DR_WAV_CUE_POINT_BYTES];\n                    bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, cuePointData, sizeof(cuePointData), &totalBytesRead);\n                    if (bytesJustRead == sizeof(cuePointData)) {\n                        pMetadata->data.cue.pCuePoints[iCuePoint].id                = ma_dr_wav_bytes_to_u32(cuePointData + 0);\n                        pMetadata->data.cue.pCuePoints[iCuePoint].playOrderPosition = ma_dr_wav_bytes_to_u32(cuePointData + 4);\n                        pMetadata->data.cue.pCuePoints[iCuePoint].dataChunkId[0]    = cuePointData[8];\n                        pMetadata->data.cue.pCuePoints[iCuePoint].dataChunkId[1]    = cuePointData[9];\n                        pMetadata->data.cue.pCuePoints[iCuePoint].dataChunkId[2]    = cuePointData[10];\n                        pMetadata->data.cue.pCuePoints[iCuePoint].dataChunkId[3]    = cuePointData[11];\n                        pMetadata->data.cue.pCuePoints[iCuePoint].chunkStart        = ma_dr_wav_bytes_to_u32(cuePointData + 12);\n                        pMetadata->data.cue.pCuePoints[iCuePoint].blockStart        = ma_dr_wav_bytes_to_u32(cuePointData + 16);\n                        pMetadata->data.cue.pCuePoints[iCuePoint].sampleByteOffset  = ma_dr_wav_bytes_to_u32(cuePointData + 20);\n                    } else {\n                        break;\n                    }\n                }\n            }\n        }\n    }\n    return totalBytesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__read_inst_to_metadata_obj(ma_dr_wav__metadata_parser* pParser, ma_dr_wav_metadata* pMetadata)\n{\n    ma_uint8 instData[MA_DR_WAV_INST_BYTES];\n    ma_uint64 bytesRead;\n    if (pMetadata == NULL) {\n        return 0;\n    }\n    bytesRead = ma_dr_wav__metadata_parser_read(pParser, instData, sizeof(instData), NULL);\n    MA_DR_WAV_ASSERT(pParser->stage == ma_dr_wav__metadata_parser_stage_read);\n    if (bytesRead == sizeof(instData)) {\n        pMetadata->type                    = ma_dr_wav_metadata_type_inst;\n        pMetadata->data.inst.midiUnityNote = (ma_int8)instData[0];\n        pMetadata->data.inst.fineTuneCents = (ma_int8)instData[1];\n        pMetadata->data.inst.gainDecibels  = (ma_int8)instData[2];\n        pMetadata->data.inst.lowNote       = (ma_int8)instData[3];\n        pMetadata->data.inst.highNote      = (ma_int8)instData[4];\n        pMetadata->data.inst.lowVelocity   = (ma_int8)instData[5];\n        pMetadata->data.inst.highVelocity  = (ma_int8)instData[6];\n    }\n    return bytesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__read_acid_to_metadata_obj(ma_dr_wav__metadata_parser* pParser, ma_dr_wav_metadata* pMetadata)\n{\n    ma_uint8 acidData[MA_DR_WAV_ACID_BYTES];\n    ma_uint64 bytesRead;\n    if (pMetadata == NULL) {\n        return 0;\n    }\n    bytesRead = ma_dr_wav__metadata_parser_read(pParser, acidData, sizeof(acidData), NULL);\n    MA_DR_WAV_ASSERT(pParser->stage == ma_dr_wav__metadata_parser_stage_read);\n    if (bytesRead == sizeof(acidData)) {\n        pMetadata->type                       = ma_dr_wav_metadata_type_acid;\n        pMetadata->data.acid.flags            = ma_dr_wav_bytes_to_u32(acidData + 0);\n        pMetadata->data.acid.midiUnityNote    = ma_dr_wav_bytes_to_u16(acidData + 4);\n        pMetadata->data.acid.reserved1        = ma_dr_wav_bytes_to_u16(acidData + 6);\n        pMetadata->data.acid.reserved2        = ma_dr_wav_bytes_to_f32(acidData + 8);\n        pMetadata->data.acid.numBeats         = ma_dr_wav_bytes_to_u32(acidData + 12);\n        pMetadata->data.acid.meterDenominator = ma_dr_wav_bytes_to_u16(acidData + 16);\n        pMetadata->data.acid.meterNumerator   = ma_dr_wav_bytes_to_u16(acidData + 18);\n        pMetadata->data.acid.tempo            = ma_dr_wav_bytes_to_f32(acidData + 20);\n    }\n    return bytesRead;\n}\nMA_PRIVATE size_t ma_dr_wav__strlen(const char* str)\n{\n    size_t result = 0;\n    while (*str++) {\n        result += 1;\n    }\n    return result;\n}\nMA_PRIVATE size_t ma_dr_wav__strlen_clamped(const char* str, size_t maxToRead)\n{\n    size_t result = 0;\n    while (*str++ && result < maxToRead) {\n        result += 1;\n    }\n    return result;\n}\nMA_PRIVATE char* ma_dr_wav__metadata_copy_string(ma_dr_wav__metadata_parser* pParser, const char* str, size_t maxToRead)\n{\n    size_t len = ma_dr_wav__strlen_clamped(str, maxToRead);\n    if (len) {\n        char* result = (char*)ma_dr_wav__metadata_get_memory(pParser, len + 1, 1);\n        MA_DR_WAV_ASSERT(result != NULL);\n        MA_DR_WAV_COPY_MEMORY(result, str, len);\n        result[len] = '\\0';\n        return result;\n    } else {\n        return NULL;\n    }\n}\ntypedef struct\n{\n    const void* pBuffer;\n    size_t sizeInBytes;\n    size_t cursor;\n} ma_dr_wav_buffer_reader;\nMA_PRIVATE ma_result ma_dr_wav_buffer_reader_init(const void* pBuffer, size_t sizeInBytes, ma_dr_wav_buffer_reader* pReader)\n{\n    MA_DR_WAV_ASSERT(pBuffer != NULL);\n    MA_DR_WAV_ASSERT(pReader != NULL);\n    MA_DR_WAV_ZERO_OBJECT(pReader);\n    pReader->pBuffer     = pBuffer;\n    pReader->sizeInBytes = sizeInBytes;\n    pReader->cursor      = 0;\n    return MA_SUCCESS;\n}\nMA_PRIVATE const void* ma_dr_wav_buffer_reader_ptr(const ma_dr_wav_buffer_reader* pReader)\n{\n    MA_DR_WAV_ASSERT(pReader != NULL);\n    return ma_dr_wav_offset_ptr(pReader->pBuffer, pReader->cursor);\n}\nMA_PRIVATE ma_result ma_dr_wav_buffer_reader_seek(ma_dr_wav_buffer_reader* pReader, size_t bytesToSeek)\n{\n    MA_DR_WAV_ASSERT(pReader != NULL);\n    if (pReader->cursor + bytesToSeek > pReader->sizeInBytes) {\n        return MA_BAD_SEEK;\n    }\n    pReader->cursor += bytesToSeek;\n    return MA_SUCCESS;\n}\nMA_PRIVATE ma_result ma_dr_wav_buffer_reader_read(ma_dr_wav_buffer_reader* pReader, void* pDst, size_t bytesToRead, size_t* pBytesRead)\n{\n    ma_result result = MA_SUCCESS;\n    size_t bytesRemaining;\n    MA_DR_WAV_ASSERT(pReader != NULL);\n    if (pBytesRead != NULL) {\n        *pBytesRead = 0;\n    }\n    bytesRemaining = (pReader->sizeInBytes - pReader->cursor);\n    if (bytesToRead > bytesRemaining) {\n        bytesToRead = bytesRemaining;\n    }\n    if (pDst == NULL) {\n        result = ma_dr_wav_buffer_reader_seek(pReader, bytesToRead);\n    } else {\n        MA_DR_WAV_COPY_MEMORY(pDst, ma_dr_wav_buffer_reader_ptr(pReader), bytesToRead);\n        pReader->cursor += bytesToRead;\n    }\n    MA_DR_WAV_ASSERT(pReader->cursor <= pReader->sizeInBytes);\n    if (result == MA_SUCCESS) {\n        if (pBytesRead != NULL) {\n            *pBytesRead = bytesToRead;\n        }\n    }\n    return MA_SUCCESS;\n}\nMA_PRIVATE ma_result ma_dr_wav_buffer_reader_read_u16(ma_dr_wav_buffer_reader* pReader, ma_uint16* pDst)\n{\n    ma_result result;\n    size_t bytesRead;\n    ma_uint8 data[2];\n    MA_DR_WAV_ASSERT(pReader != NULL);\n    MA_DR_WAV_ASSERT(pDst != NULL);\n    *pDst = 0;\n    result = ma_dr_wav_buffer_reader_read(pReader, data, sizeof(*pDst), &bytesRead);\n    if (result != MA_SUCCESS || bytesRead != sizeof(*pDst)) {\n        return result;\n    }\n    *pDst = ma_dr_wav_bytes_to_u16(data);\n    return MA_SUCCESS;\n}\nMA_PRIVATE ma_result ma_dr_wav_buffer_reader_read_u32(ma_dr_wav_buffer_reader* pReader, ma_uint32* pDst)\n{\n    ma_result result;\n    size_t bytesRead;\n    ma_uint8 data[4];\n    MA_DR_WAV_ASSERT(pReader != NULL);\n    MA_DR_WAV_ASSERT(pDst != NULL);\n    *pDst = 0;\n    result = ma_dr_wav_buffer_reader_read(pReader, data, sizeof(*pDst), &bytesRead);\n    if (result != MA_SUCCESS || bytesRead != sizeof(*pDst)) {\n        return result;\n    }\n    *pDst = ma_dr_wav_bytes_to_u32(data);\n    return MA_SUCCESS;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__read_bext_to_metadata_obj(ma_dr_wav__metadata_parser* pParser, ma_dr_wav_metadata* pMetadata, ma_uint64 chunkSize)\n{\n    ma_uint8 bextData[MA_DR_WAV_BEXT_BYTES];\n    size_t bytesRead = ma_dr_wav__metadata_parser_read(pParser, bextData, sizeof(bextData), NULL);\n    MA_DR_WAV_ASSERT(pParser->stage == ma_dr_wav__metadata_parser_stage_read);\n    if (bytesRead == sizeof(bextData)) {\n        ma_dr_wav_buffer_reader reader;\n        ma_uint32 timeReferenceLow;\n        ma_uint32 timeReferenceHigh;\n        size_t extraBytes;\n        pMetadata->type = ma_dr_wav_metadata_type_bext;\n        if (ma_dr_wav_buffer_reader_init(bextData, bytesRead, &reader) == MA_SUCCESS) {\n            pMetadata->data.bext.pDescription = ma_dr_wav__metadata_copy_string(pParser, (const char*)ma_dr_wav_buffer_reader_ptr(&reader), MA_DR_WAV_BEXT_DESCRIPTION_BYTES);\n            ma_dr_wav_buffer_reader_seek(&reader, MA_DR_WAV_BEXT_DESCRIPTION_BYTES);\n            pMetadata->data.bext.pOriginatorName = ma_dr_wav__metadata_copy_string(pParser, (const char*)ma_dr_wav_buffer_reader_ptr(&reader), MA_DR_WAV_BEXT_ORIGINATOR_NAME_BYTES);\n            ma_dr_wav_buffer_reader_seek(&reader, MA_DR_WAV_BEXT_ORIGINATOR_NAME_BYTES);\n            pMetadata->data.bext.pOriginatorReference = ma_dr_wav__metadata_copy_string(pParser, (const char*)ma_dr_wav_buffer_reader_ptr(&reader), MA_DR_WAV_BEXT_ORIGINATOR_REF_BYTES);\n            ma_dr_wav_buffer_reader_seek(&reader, MA_DR_WAV_BEXT_ORIGINATOR_REF_BYTES);\n            ma_dr_wav_buffer_reader_read(&reader, pMetadata->data.bext.pOriginationDate, sizeof(pMetadata->data.bext.pOriginationDate), NULL);\n            ma_dr_wav_buffer_reader_read(&reader, pMetadata->data.bext.pOriginationTime, sizeof(pMetadata->data.bext.pOriginationTime), NULL);\n            ma_dr_wav_buffer_reader_read_u32(&reader, &timeReferenceLow);\n            ma_dr_wav_buffer_reader_read_u32(&reader, &timeReferenceHigh);\n            pMetadata->data.bext.timeReference = ((ma_uint64)timeReferenceHigh << 32) + timeReferenceLow;\n            ma_dr_wav_buffer_reader_read_u16(&reader, &pMetadata->data.bext.version);\n            pMetadata->data.bext.pUMID = ma_dr_wav__metadata_get_memory(pParser, MA_DR_WAV_BEXT_UMID_BYTES, 1);\n            ma_dr_wav_buffer_reader_read(&reader, pMetadata->data.bext.pUMID, MA_DR_WAV_BEXT_UMID_BYTES, NULL);\n            ma_dr_wav_buffer_reader_read_u16(&reader, &pMetadata->data.bext.loudnessValue);\n            ma_dr_wav_buffer_reader_read_u16(&reader, &pMetadata->data.bext.loudnessRange);\n            ma_dr_wav_buffer_reader_read_u16(&reader, &pMetadata->data.bext.maxTruePeakLevel);\n            ma_dr_wav_buffer_reader_read_u16(&reader, &pMetadata->data.bext.maxMomentaryLoudness);\n            ma_dr_wav_buffer_reader_read_u16(&reader, &pMetadata->data.bext.maxShortTermLoudness);\n            MA_DR_WAV_ASSERT((ma_dr_wav_offset_ptr(ma_dr_wav_buffer_reader_ptr(&reader), MA_DR_WAV_BEXT_RESERVED_BYTES)) == (bextData + MA_DR_WAV_BEXT_BYTES));\n            extraBytes = (size_t)(chunkSize - MA_DR_WAV_BEXT_BYTES);\n            if (extraBytes > 0) {\n                pMetadata->data.bext.pCodingHistory = (char*)ma_dr_wav__metadata_get_memory(pParser, extraBytes + 1, 1);\n                MA_DR_WAV_ASSERT(pMetadata->data.bext.pCodingHistory != NULL);\n                bytesRead += ma_dr_wav__metadata_parser_read(pParser, pMetadata->data.bext.pCodingHistory, extraBytes, NULL);\n                pMetadata->data.bext.codingHistorySize = (ma_uint32)ma_dr_wav__strlen(pMetadata->data.bext.pCodingHistory);\n            } else {\n                pMetadata->data.bext.pCodingHistory    = NULL;\n                pMetadata->data.bext.codingHistorySize = 0;\n            }\n        }\n    }\n    return bytesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__read_list_label_or_note_to_metadata_obj(ma_dr_wav__metadata_parser* pParser, ma_dr_wav_metadata* pMetadata, ma_uint64 chunkSize, ma_dr_wav_metadata_type type)\n{\n    ma_uint8 cueIDBuffer[MA_DR_WAV_LIST_LABEL_OR_NOTE_BYTES];\n    ma_uint64 totalBytesRead = 0;\n    size_t bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, cueIDBuffer, sizeof(cueIDBuffer), &totalBytesRead);\n    MA_DR_WAV_ASSERT(pParser->stage == ma_dr_wav__metadata_parser_stage_read);\n    if (bytesJustRead == sizeof(cueIDBuffer)) {\n        ma_uint32 sizeIncludingNullTerminator;\n        pMetadata->type = type;\n        pMetadata->data.labelOrNote.cuePointId = ma_dr_wav_bytes_to_u32(cueIDBuffer);\n        sizeIncludingNullTerminator = (ma_uint32)chunkSize - MA_DR_WAV_LIST_LABEL_OR_NOTE_BYTES;\n        if (sizeIncludingNullTerminator > 0) {\n            pMetadata->data.labelOrNote.stringLength = sizeIncludingNullTerminator - 1;\n            pMetadata->data.labelOrNote.pString      = (char*)ma_dr_wav__metadata_get_memory(pParser, sizeIncludingNullTerminator, 1);\n            MA_DR_WAV_ASSERT(pMetadata->data.labelOrNote.pString != NULL);\n            ma_dr_wav__metadata_parser_read(pParser, pMetadata->data.labelOrNote.pString, sizeIncludingNullTerminator, &totalBytesRead);\n        } else {\n            pMetadata->data.labelOrNote.stringLength = 0;\n            pMetadata->data.labelOrNote.pString      = NULL;\n        }\n    }\n    return totalBytesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__read_list_labelled_cue_region_to_metadata_obj(ma_dr_wav__metadata_parser* pParser, ma_dr_wav_metadata* pMetadata, ma_uint64 chunkSize)\n{\n    ma_uint8 buffer[MA_DR_WAV_LIST_LABELLED_TEXT_BYTES];\n    ma_uint64 totalBytesRead = 0;\n    size_t bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, buffer, sizeof(buffer), &totalBytesRead);\n    MA_DR_WAV_ASSERT(pParser->stage == ma_dr_wav__metadata_parser_stage_read);\n    if (bytesJustRead == sizeof(buffer)) {\n        ma_uint32 sizeIncludingNullTerminator;\n        pMetadata->type                                = ma_dr_wav_metadata_type_list_labelled_cue_region;\n        pMetadata->data.labelledCueRegion.cuePointId   = ma_dr_wav_bytes_to_u32(buffer + 0);\n        pMetadata->data.labelledCueRegion.sampleLength = ma_dr_wav_bytes_to_u32(buffer + 4);\n        pMetadata->data.labelledCueRegion.purposeId[0] = buffer[8];\n        pMetadata->data.labelledCueRegion.purposeId[1] = buffer[9];\n        pMetadata->data.labelledCueRegion.purposeId[2] = buffer[10];\n        pMetadata->data.labelledCueRegion.purposeId[3] = buffer[11];\n        pMetadata->data.labelledCueRegion.country      = ma_dr_wav_bytes_to_u16(buffer + 12);\n        pMetadata->data.labelledCueRegion.language     = ma_dr_wav_bytes_to_u16(buffer + 14);\n        pMetadata->data.labelledCueRegion.dialect      = ma_dr_wav_bytes_to_u16(buffer + 16);\n        pMetadata->data.labelledCueRegion.codePage     = ma_dr_wav_bytes_to_u16(buffer + 18);\n        sizeIncludingNullTerminator = (ma_uint32)chunkSize - MA_DR_WAV_LIST_LABELLED_TEXT_BYTES;\n        if (sizeIncludingNullTerminator > 0) {\n            pMetadata->data.labelledCueRegion.stringLength = sizeIncludingNullTerminator - 1;\n            pMetadata->data.labelledCueRegion.pString      = (char*)ma_dr_wav__metadata_get_memory(pParser, sizeIncludingNullTerminator, 1);\n            MA_DR_WAV_ASSERT(pMetadata->data.labelledCueRegion.pString != NULL);\n            ma_dr_wav__metadata_parser_read(pParser, pMetadata->data.labelledCueRegion.pString, sizeIncludingNullTerminator, &totalBytesRead);\n        } else {\n            pMetadata->data.labelledCueRegion.stringLength = 0;\n            pMetadata->data.labelledCueRegion.pString      = NULL;\n        }\n    }\n    return totalBytesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_info_text_chunk(ma_dr_wav__metadata_parser* pParser, ma_uint64 chunkSize, ma_dr_wav_metadata_type type)\n{\n    ma_uint64 bytesRead = 0;\n    ma_uint32 stringSizeWithNullTerminator = (ma_uint32)chunkSize;\n    if (pParser->stage == ma_dr_wav__metadata_parser_stage_count) {\n        pParser->metadataCount += 1;\n        ma_dr_wav__metadata_request_extra_memory_for_stage_2(pParser, stringSizeWithNullTerminator, 1);\n    } else {\n        ma_dr_wav_metadata* pMetadata = &pParser->pMetadata[pParser->metadataCursor];\n        pMetadata->type = type;\n        if (stringSizeWithNullTerminator > 0) {\n            pMetadata->data.infoText.stringLength = stringSizeWithNullTerminator - 1;\n            pMetadata->data.infoText.pString = (char*)ma_dr_wav__metadata_get_memory(pParser, stringSizeWithNullTerminator, 1);\n            MA_DR_WAV_ASSERT(pMetadata->data.infoText.pString != NULL);\n            bytesRead = ma_dr_wav__metadata_parser_read(pParser, pMetadata->data.infoText.pString, (size_t)stringSizeWithNullTerminator, NULL);\n            if (bytesRead == chunkSize) {\n                pParser->metadataCursor += 1;\n            } else {\n            }\n        } else {\n            pMetadata->data.infoText.stringLength = 0;\n            pMetadata->data.infoText.pString      = NULL;\n            pParser->metadataCursor += 1;\n        }\n    }\n    return bytesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_unknown_chunk(ma_dr_wav__metadata_parser* pParser, const ma_uint8* pChunkId, ma_uint64 chunkSize, ma_dr_wav_metadata_location location)\n{\n    ma_uint64 bytesRead = 0;\n    if (location == ma_dr_wav_metadata_location_invalid) {\n        return 0;\n    }\n    if (ma_dr_wav_fourcc_equal(pChunkId, \"data\") || ma_dr_wav_fourcc_equal(pChunkId, \"fmt \") || ma_dr_wav_fourcc_equal(pChunkId, \"fact\")) {\n        return 0;\n    }\n    if (pParser->stage == ma_dr_wav__metadata_parser_stage_count) {\n        pParser->metadataCount += 1;\n        ma_dr_wav__metadata_request_extra_memory_for_stage_2(pParser, (size_t)chunkSize, 1);\n    } else {\n        ma_dr_wav_metadata* pMetadata = &pParser->pMetadata[pParser->metadataCursor];\n        pMetadata->type                         = ma_dr_wav_metadata_type_unknown;\n        pMetadata->data.unknown.chunkLocation   = location;\n        pMetadata->data.unknown.id[0]           = pChunkId[0];\n        pMetadata->data.unknown.id[1]           = pChunkId[1];\n        pMetadata->data.unknown.id[2]           = pChunkId[2];\n        pMetadata->data.unknown.id[3]           = pChunkId[3];\n        pMetadata->data.unknown.dataSizeInBytes = (ma_uint32)chunkSize;\n        pMetadata->data.unknown.pData           = (ma_uint8 *)ma_dr_wav__metadata_get_memory(pParser, (size_t)chunkSize, 1);\n        MA_DR_WAV_ASSERT(pMetadata->data.unknown.pData != NULL);\n        bytesRead = ma_dr_wav__metadata_parser_read(pParser, pMetadata->data.unknown.pData, pMetadata->data.unknown.dataSizeInBytes, NULL);\n        if (bytesRead == pMetadata->data.unknown.dataSizeInBytes) {\n            pParser->metadataCursor += 1;\n        } else {\n        }\n    }\n    return bytesRead;\n}\nMA_PRIVATE ma_bool32 ma_dr_wav__chunk_matches(ma_dr_wav_metadata_type allowedMetadataTypes, const ma_uint8* pChunkID, ma_dr_wav_metadata_type type, const char* pID)\n{\n    return (allowedMetadataTypes & type) && ma_dr_wav_fourcc_equal(pChunkID, pID);\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__metadata_process_chunk(ma_dr_wav__metadata_parser* pParser, const ma_dr_wav_chunk_header* pChunkHeader, ma_dr_wav_metadata_type allowedMetadataTypes)\n{\n    const ma_uint8 *pChunkID = pChunkHeader->id.fourcc;\n    ma_uint64 bytesRead = 0;\n    if (ma_dr_wav__chunk_matches(allowedMetadataTypes, pChunkID, ma_dr_wav_metadata_type_smpl, \"smpl\")) {\n        if (pChunkHeader->sizeInBytes >= MA_DR_WAV_SMPL_BYTES) {\n            if (pParser->stage == ma_dr_wav__metadata_parser_stage_count) {\n                ma_uint8 buffer[4];\n                size_t bytesJustRead;\n                if (!pParser->onSeek(pParser->pReadSeekUserData, 28, ma_dr_wav_seek_origin_current)) {\n                    return bytesRead;\n                }\n                bytesRead += 28;\n                bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, buffer, sizeof(buffer), &bytesRead);\n                if (bytesJustRead == sizeof(buffer)) {\n                    ma_uint32 loopCount = ma_dr_wav_bytes_to_u32(buffer);\n                    ma_uint64 calculatedLoopCount;\n                    calculatedLoopCount = (pChunkHeader->sizeInBytes - MA_DR_WAV_SMPL_BYTES) / MA_DR_WAV_SMPL_LOOP_BYTES;\n                    if (calculatedLoopCount == loopCount) {\n                        bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, buffer, sizeof(buffer), &bytesRead);\n                        if (bytesJustRead == sizeof(buffer)) {\n                            ma_uint32 samplerSpecificDataSizeInBytes = ma_dr_wav_bytes_to_u32(buffer);\n                            pParser->metadataCount += 1;\n                            ma_dr_wav__metadata_request_extra_memory_for_stage_2(pParser, sizeof(ma_dr_wav_smpl_loop) * loopCount, MA_DR_WAV_METADATA_ALIGNMENT);\n                            ma_dr_wav__metadata_request_extra_memory_for_stage_2(pParser, samplerSpecificDataSizeInBytes, 1);\n                        }\n                    } else {\n                    }\n                }\n            } else {\n                bytesRead = ma_dr_wav__read_smpl_to_metadata_obj(pParser, pChunkHeader, &pParser->pMetadata[pParser->metadataCursor]);\n                if (bytesRead == pChunkHeader->sizeInBytes) {\n                    pParser->metadataCursor += 1;\n                } else {\n                }\n            }\n        } else {\n        }\n    } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, pChunkID, ma_dr_wav_metadata_type_inst, \"inst\")) {\n        if (pChunkHeader->sizeInBytes == MA_DR_WAV_INST_BYTES) {\n            if (pParser->stage == ma_dr_wav__metadata_parser_stage_count) {\n                pParser->metadataCount += 1;\n            } else {\n                bytesRead = ma_dr_wav__read_inst_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor]);\n                if (bytesRead == pChunkHeader->sizeInBytes) {\n                    pParser->metadataCursor += 1;\n                } else {\n                }\n            }\n        } else {\n        }\n    } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, pChunkID, ma_dr_wav_metadata_type_acid, \"acid\")) {\n        if (pChunkHeader->sizeInBytes == MA_DR_WAV_ACID_BYTES) {\n            if (pParser->stage == ma_dr_wav__metadata_parser_stage_count) {\n                pParser->metadataCount += 1;\n            } else {\n                bytesRead = ma_dr_wav__read_acid_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor]);\n                if (bytesRead == pChunkHeader->sizeInBytes) {\n                    pParser->metadataCursor += 1;\n                } else {\n                }\n            }\n        } else {\n        }\n    } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, pChunkID, ma_dr_wav_metadata_type_cue, \"cue \")) {\n        if (pChunkHeader->sizeInBytes >= MA_DR_WAV_CUE_BYTES) {\n            if (pParser->stage == ma_dr_wav__metadata_parser_stage_count) {\n                size_t cueCount;\n                pParser->metadataCount += 1;\n                cueCount = (size_t)(pChunkHeader->sizeInBytes - MA_DR_WAV_CUE_BYTES) / MA_DR_WAV_CUE_POINT_BYTES;\n                ma_dr_wav__metadata_request_extra_memory_for_stage_2(pParser, sizeof(ma_dr_wav_cue_point) * cueCount, MA_DR_WAV_METADATA_ALIGNMENT);\n            } else {\n                bytesRead = ma_dr_wav__read_cue_to_metadata_obj(pParser, pChunkHeader, &pParser->pMetadata[pParser->metadataCursor]);\n                if (bytesRead == pChunkHeader->sizeInBytes) {\n                    pParser->metadataCursor += 1;\n                } else {\n                }\n            }\n        } else {\n        }\n    } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, pChunkID, ma_dr_wav_metadata_type_bext, \"bext\")) {\n        if (pChunkHeader->sizeInBytes >= MA_DR_WAV_BEXT_BYTES) {\n            if (pParser->stage == ma_dr_wav__metadata_parser_stage_count) {\n                char buffer[MA_DR_WAV_BEXT_DESCRIPTION_BYTES + 1];\n                size_t allocSizeNeeded = MA_DR_WAV_BEXT_UMID_BYTES;\n                size_t bytesJustRead;\n                buffer[MA_DR_WAV_BEXT_DESCRIPTION_BYTES] = '\\0';\n                bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, buffer, MA_DR_WAV_BEXT_DESCRIPTION_BYTES, &bytesRead);\n                if (bytesJustRead != MA_DR_WAV_BEXT_DESCRIPTION_BYTES) {\n                    return bytesRead;\n                }\n                allocSizeNeeded += ma_dr_wav__strlen(buffer) + 1;\n                buffer[MA_DR_WAV_BEXT_ORIGINATOR_NAME_BYTES] = '\\0';\n                bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, buffer, MA_DR_WAV_BEXT_ORIGINATOR_NAME_BYTES, &bytesRead);\n                if (bytesJustRead != MA_DR_WAV_BEXT_ORIGINATOR_NAME_BYTES) {\n                    return bytesRead;\n                }\n                allocSizeNeeded += ma_dr_wav__strlen(buffer) + 1;\n                buffer[MA_DR_WAV_BEXT_ORIGINATOR_REF_BYTES] = '\\0';\n                bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, buffer, MA_DR_WAV_BEXT_ORIGINATOR_REF_BYTES, &bytesRead);\n                if (bytesJustRead != MA_DR_WAV_BEXT_ORIGINATOR_REF_BYTES) {\n                    return bytesRead;\n                }\n                allocSizeNeeded += ma_dr_wav__strlen(buffer) + 1;\n                allocSizeNeeded += (size_t)pChunkHeader->sizeInBytes - MA_DR_WAV_BEXT_BYTES;\n                ma_dr_wav__metadata_request_extra_memory_for_stage_2(pParser, allocSizeNeeded, 1);\n                pParser->metadataCount += 1;\n            } else {\n                bytesRead = ma_dr_wav__read_bext_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor], pChunkHeader->sizeInBytes);\n                if (bytesRead == pChunkHeader->sizeInBytes) {\n                    pParser->metadataCursor += 1;\n                } else {\n                }\n            }\n        } else {\n        }\n    } else if (ma_dr_wav_fourcc_equal(pChunkID, \"LIST\") || ma_dr_wav_fourcc_equal(pChunkID, \"list\")) {\n        ma_dr_wav_metadata_location listType = ma_dr_wav_metadata_location_invalid;\n        while (bytesRead < pChunkHeader->sizeInBytes) {\n            ma_uint8 subchunkId[4];\n            ma_uint8 subchunkSizeBuffer[4];\n            ma_uint64 subchunkDataSize;\n            ma_uint64 subchunkBytesRead = 0;\n            ma_uint64 bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, subchunkId, sizeof(subchunkId), &bytesRead);\n            if (bytesJustRead != sizeof(subchunkId)) {\n                break;\n            }\n            if (ma_dr_wav_fourcc_equal(subchunkId, \"adtl\")) {\n                listType = ma_dr_wav_metadata_location_inside_adtl_list;\n                continue;\n            } else if (ma_dr_wav_fourcc_equal(subchunkId, \"INFO\")) {\n                listType = ma_dr_wav_metadata_location_inside_info_list;\n                continue;\n            }\n            bytesJustRead = ma_dr_wav__metadata_parser_read(pParser, subchunkSizeBuffer, sizeof(subchunkSizeBuffer), &bytesRead);\n            if (bytesJustRead != sizeof(subchunkSizeBuffer)) {\n                break;\n            }\n            subchunkDataSize = ma_dr_wav_bytes_to_u32(subchunkSizeBuffer);\n            if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_label, \"labl\") || ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_note, \"note\")) {\n                if (subchunkDataSize >= MA_DR_WAV_LIST_LABEL_OR_NOTE_BYTES) {\n                    ma_uint64 stringSizeWithNullTerm = subchunkDataSize - MA_DR_WAV_LIST_LABEL_OR_NOTE_BYTES;\n                    if (pParser->stage == ma_dr_wav__metadata_parser_stage_count) {\n                        pParser->metadataCount += 1;\n                        ma_dr_wav__metadata_request_extra_memory_for_stage_2(pParser, (size_t)stringSizeWithNullTerm, 1);\n                    } else {\n                        subchunkBytesRead = ma_dr_wav__read_list_label_or_note_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor], subchunkDataSize, ma_dr_wav_fourcc_equal(subchunkId, \"labl\") ? ma_dr_wav_metadata_type_list_label : ma_dr_wav_metadata_type_list_note);\n                        if (subchunkBytesRead == subchunkDataSize) {\n                            pParser->metadataCursor += 1;\n                        } else {\n                        }\n                    }\n                } else {\n                }\n            } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_labelled_cue_region, \"ltxt\")) {\n                if (subchunkDataSize >= MA_DR_WAV_LIST_LABELLED_TEXT_BYTES) {\n                    ma_uint64 stringSizeWithNullTerminator = subchunkDataSize - MA_DR_WAV_LIST_LABELLED_TEXT_BYTES;\n                    if (pParser->stage == ma_dr_wav__metadata_parser_stage_count) {\n                        pParser->metadataCount += 1;\n                        ma_dr_wav__metadata_request_extra_memory_for_stage_2(pParser, (size_t)stringSizeWithNullTerminator, 1);\n                    } else {\n                        subchunkBytesRead = ma_dr_wav__read_list_labelled_cue_region_to_metadata_obj(pParser, &pParser->pMetadata[pParser->metadataCursor], subchunkDataSize);\n                        if (subchunkBytesRead == subchunkDataSize) {\n                            pParser->metadataCursor += 1;\n                        } else {\n                        }\n                    }\n                } else {\n                }\n            } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_software, \"ISFT\")) {\n                subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize,  ma_dr_wav_metadata_type_list_info_software);\n            } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_copyright, \"ICOP\")) {\n                subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize,  ma_dr_wav_metadata_type_list_info_copyright);\n            } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_title, \"INAM\")) {\n                subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize,  ma_dr_wav_metadata_type_list_info_title);\n            } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_artist, \"IART\")) {\n                subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize,  ma_dr_wav_metadata_type_list_info_artist);\n            } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_comment, \"ICMT\")) {\n                subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize,  ma_dr_wav_metadata_type_list_info_comment);\n            } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_date, \"ICRD\")) {\n                subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize,  ma_dr_wav_metadata_type_list_info_date);\n            } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_genre, \"IGNR\")) {\n                subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize,  ma_dr_wav_metadata_type_list_info_genre);\n            } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_album, \"IPRD\")) {\n                subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize,  ma_dr_wav_metadata_type_list_info_album);\n            } else if (ma_dr_wav__chunk_matches(allowedMetadataTypes, subchunkId, ma_dr_wav_metadata_type_list_info_tracknumber, \"ITRK\")) {\n                subchunkBytesRead = ma_dr_wav__metadata_process_info_text_chunk(pParser, subchunkDataSize,  ma_dr_wav_metadata_type_list_info_tracknumber);\n            } else if ((allowedMetadataTypes & ma_dr_wav_metadata_type_unknown) != 0) {\n                subchunkBytesRead = ma_dr_wav__metadata_process_unknown_chunk(pParser, subchunkId, subchunkDataSize, listType);\n            }\n            bytesRead += subchunkBytesRead;\n            MA_DR_WAV_ASSERT(subchunkBytesRead <= subchunkDataSize);\n            if (subchunkBytesRead < subchunkDataSize) {\n                ma_uint64 bytesToSeek = subchunkDataSize - subchunkBytesRead;\n                if (!pParser->onSeek(pParser->pReadSeekUserData, (int)bytesToSeek, ma_dr_wav_seek_origin_current)) {\n                    break;\n                }\n                bytesRead += bytesToSeek;\n            }\n            if ((subchunkDataSize % 2) == 1) {\n                if (!pParser->onSeek(pParser->pReadSeekUserData, 1, ma_dr_wav_seek_origin_current)) {\n                    break;\n                }\n                bytesRead += 1;\n            }\n        }\n    } else if ((allowedMetadataTypes & ma_dr_wav_metadata_type_unknown) != 0) {\n        bytesRead = ma_dr_wav__metadata_process_unknown_chunk(pParser, pChunkID, pChunkHeader->sizeInBytes, ma_dr_wav_metadata_location_top_level);\n    }\n    return bytesRead;\n}\nMA_PRIVATE ma_uint32 ma_dr_wav_get_bytes_per_pcm_frame(ma_dr_wav* pWav)\n{\n    ma_uint32 bytesPerFrame;\n    if ((pWav->bitsPerSample & 0x7) == 0) {\n        bytesPerFrame = (pWav->bitsPerSample * pWav->fmt.channels) >> 3;\n    } else {\n        bytesPerFrame = pWav->fmt.blockAlign;\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_ALAW || pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_MULAW) {\n        if (bytesPerFrame != pWav->fmt.channels) {\n            return 0;\n        }\n    }\n    return bytesPerFrame;\n}\nMA_API ma_uint16 ma_dr_wav_fmt_get_format(const ma_dr_wav_fmt* pFMT)\n{\n    if (pFMT == NULL) {\n        return 0;\n    }\n    if (pFMT->formatTag != MA_DR_WAVE_FORMAT_EXTENSIBLE) {\n        return pFMT->formatTag;\n    } else {\n        return ma_dr_wav_bytes_to_u16(pFMT->subFormat);\n    }\n}\nMA_PRIVATE ma_bool32 ma_dr_wav_preinit(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pReadSeekUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pWav == NULL || onRead == NULL || onSeek == NULL) {\n        return MA_FALSE;\n    }\n    MA_DR_WAV_ZERO_MEMORY(pWav, sizeof(*pWav));\n    pWav->onRead    = onRead;\n    pWav->onSeek    = onSeek;\n    pWav->pUserData = pReadSeekUserData;\n    pWav->allocationCallbacks = ma_dr_wav_copy_allocation_callbacks_or_defaults(pAllocationCallbacks);\n    if (pWav->allocationCallbacks.onFree == NULL || (pWav->allocationCallbacks.onMalloc == NULL && pWav->allocationCallbacks.onRealloc == NULL)) {\n        return MA_FALSE;\n    }\n    return MA_TRUE;\n}\nMA_PRIVATE ma_bool32 ma_dr_wav_init__internal(ma_dr_wav* pWav, ma_dr_wav_chunk_proc onChunk, void* pChunkUserData, ma_uint32 flags)\n{\n    ma_result result;\n    ma_uint64 cursor;\n    ma_bool32 sequential;\n    ma_uint8 riff[4];\n    ma_dr_wav_fmt fmt;\n    unsigned short translatedFormatTag;\n    ma_uint64 dataChunkSize = 0;\n    ma_uint64 sampleCountFromFactChunk = 0;\n    ma_uint64 metadataStartPos;\n    ma_dr_wav__metadata_parser metadataParser;\n    ma_bool8 isProcessingMetadata = MA_FALSE;\n    ma_bool8 foundChunk_fmt  = MA_FALSE;\n    ma_bool8 foundChunk_data = MA_FALSE;\n    ma_bool8 isAIFCFormType = MA_FALSE;\n    ma_uint64 aiffFrameCount = 0;\n    cursor = 0;\n    sequential = (flags & MA_DR_WAV_SEQUENTIAL) != 0;\n    MA_DR_WAV_ZERO_OBJECT(&fmt);\n    if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, riff, sizeof(riff), &cursor) != sizeof(riff)) {\n        return MA_FALSE;\n    }\n    if (ma_dr_wav_fourcc_equal(riff, \"RIFF\")) {\n        pWav->container = ma_dr_wav_container_riff;\n    } else if (ma_dr_wav_fourcc_equal(riff, \"RIFX\")) {\n        pWav->container = ma_dr_wav_container_rifx;\n    } else if (ma_dr_wav_fourcc_equal(riff, \"riff\")) {\n        int i;\n        ma_uint8 riff2[12];\n        pWav->container = ma_dr_wav_container_w64;\n        if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, riff2, sizeof(riff2), &cursor) != sizeof(riff2)) {\n            return MA_FALSE;\n        }\n        for (i = 0; i < 12; ++i) {\n            if (riff2[i] != ma_dr_wavGUID_W64_RIFF[i+4]) {\n                return MA_FALSE;\n            }\n        }\n    } else if (ma_dr_wav_fourcc_equal(riff, \"RF64\")) {\n        pWav->container = ma_dr_wav_container_rf64;\n    } else if (ma_dr_wav_fourcc_equal(riff, \"FORM\")) {\n        pWav->container = ma_dr_wav_container_aiff;\n    } else {\n        return MA_FALSE;\n    }\n    if (pWav->container == ma_dr_wav_container_riff || pWav->container == ma_dr_wav_container_rifx || pWav->container == ma_dr_wav_container_rf64) {\n        ma_uint8 chunkSizeBytes[4];\n        ma_uint8 wave[4];\n        if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, chunkSizeBytes, sizeof(chunkSizeBytes), &cursor) != sizeof(chunkSizeBytes)) {\n            return MA_FALSE;\n        }\n        if (pWav->container == ma_dr_wav_container_riff || pWav->container == ma_dr_wav_container_rifx) {\n            if (ma_dr_wav_bytes_to_u32_ex(chunkSizeBytes, pWav->container) < 36) {\n                return MA_FALSE;\n            }\n        } else if (pWav->container == ma_dr_wav_container_rf64) {\n            if (ma_dr_wav_bytes_to_u32_le(chunkSizeBytes) != 0xFFFFFFFF) {\n                return MA_FALSE;\n            }\n        } else {\n            return MA_FALSE;\n        }\n        if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, wave, sizeof(wave), &cursor) != sizeof(wave)) {\n            return MA_FALSE;\n        }\n        if (!ma_dr_wav_fourcc_equal(wave, \"WAVE\")) {\n            return MA_FALSE;\n        }\n    } else if (pWav->container == ma_dr_wav_container_w64) {\n        ma_uint8 chunkSizeBytes[8];\n        ma_uint8 wave[16];\n        if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, chunkSizeBytes, sizeof(chunkSizeBytes), &cursor) != sizeof(chunkSizeBytes)) {\n            return MA_FALSE;\n        }\n        if (ma_dr_wav_bytes_to_u64(chunkSizeBytes) < 80) {\n            return MA_FALSE;\n        }\n        if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, wave, sizeof(wave), &cursor) != sizeof(wave)) {\n            return MA_FALSE;\n        }\n        if (!ma_dr_wav_guid_equal(wave, ma_dr_wavGUID_W64_WAVE)) {\n            return MA_FALSE;\n        }\n    } else if (pWav->container == ma_dr_wav_container_aiff) {\n        ma_uint8 chunkSizeBytes[4];\n        ma_uint8 aiff[4];\n        if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, chunkSizeBytes, sizeof(chunkSizeBytes), &cursor) != sizeof(chunkSizeBytes)) {\n            return MA_FALSE;\n        }\n        if (ma_dr_wav_bytes_to_u32_be(chunkSizeBytes) < 18) {\n            return MA_FALSE;\n        }\n        if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, aiff, sizeof(aiff), &cursor) != sizeof(aiff)) {\n            return MA_FALSE;\n        }\n        if (ma_dr_wav_fourcc_equal(aiff, \"AIFF\")) {\n            isAIFCFormType = MA_FALSE;\n        } else if (ma_dr_wav_fourcc_equal(aiff, \"AIFC\")) {\n            isAIFCFormType = MA_TRUE;\n        } else {\n            return MA_FALSE;\n        }\n    } else {\n        return MA_FALSE;\n    }\n    if (pWav->container == ma_dr_wav_container_rf64) {\n        ma_uint8 sizeBytes[8];\n        ma_uint64 bytesRemainingInChunk;\n        ma_dr_wav_chunk_header header;\n        result = ma_dr_wav__read_chunk_header(pWav->onRead, pWav->pUserData, pWav->container, &cursor, &header);\n        if (result != MA_SUCCESS) {\n            return MA_FALSE;\n        }\n        if (!ma_dr_wav_fourcc_equal(header.id.fourcc, \"ds64\")) {\n            return MA_FALSE;\n        }\n        bytesRemainingInChunk = header.sizeInBytes + header.paddingSize;\n        if (!ma_dr_wav__seek_forward(pWav->onSeek, 8, pWav->pUserData)) {\n            return MA_FALSE;\n        }\n        bytesRemainingInChunk -= 8;\n        cursor += 8;\n        if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, sizeBytes, sizeof(sizeBytes), &cursor) != sizeof(sizeBytes)) {\n            return MA_FALSE;\n        }\n        bytesRemainingInChunk -= 8;\n        dataChunkSize = ma_dr_wav_bytes_to_u64(sizeBytes);\n        if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, sizeBytes, sizeof(sizeBytes), &cursor) != sizeof(sizeBytes)) {\n            return MA_FALSE;\n        }\n        bytesRemainingInChunk -= 8;\n        sampleCountFromFactChunk = ma_dr_wav_bytes_to_u64(sizeBytes);\n        if (!ma_dr_wav__seek_forward(pWav->onSeek, bytesRemainingInChunk, pWav->pUserData)) {\n            return MA_FALSE;\n        }\n        cursor += bytesRemainingInChunk;\n    }\n    metadataStartPos = cursor;\n    isProcessingMetadata = !sequential && ((flags & MA_DR_WAV_WITH_METADATA) != 0);\n    if (pWav->container != ma_dr_wav_container_riff && pWav->container != ma_dr_wav_container_rf64) {\n        isProcessingMetadata = MA_FALSE;\n    }\n    MA_DR_WAV_ZERO_MEMORY(&metadataParser, sizeof(metadataParser));\n    if (isProcessingMetadata) {\n        metadataParser.onRead = pWav->onRead;\n        metadataParser.onSeek = pWav->onSeek;\n        metadataParser.pReadSeekUserData = pWav->pUserData;\n        metadataParser.stage  = ma_dr_wav__metadata_parser_stage_count;\n    }\n    for (;;) {\n        ma_dr_wav_chunk_header header;\n        ma_uint64 chunkSize;\n        result = ma_dr_wav__read_chunk_header(pWav->onRead, pWav->pUserData, pWav->container, &cursor, &header);\n        if (result != MA_SUCCESS) {\n            break;\n        }\n        chunkSize = header.sizeInBytes;\n        if (!sequential && onChunk != NULL) {\n            ma_uint64 callbackBytesRead = onChunk(pChunkUserData, pWav->onRead, pWav->onSeek, pWav->pUserData, &header, pWav->container, &fmt);\n            if (callbackBytesRead > 0) {\n                if (ma_dr_wav__seek_from_start(pWav->onSeek, cursor, pWav->pUserData) == MA_FALSE) {\n                    return MA_FALSE;\n                }\n            }\n        }\n        if (((pWav->container == ma_dr_wav_container_riff || pWav->container == ma_dr_wav_container_rifx || pWav->container == ma_dr_wav_container_rf64) && ma_dr_wav_fourcc_equal(header.id.fourcc, \"fmt \")) ||\n            ((pWav->container == ma_dr_wav_container_w64) && ma_dr_wav_guid_equal(header.id.guid, ma_dr_wavGUID_W64_FMT))) {\n            ma_uint8 fmtData[16];\n            foundChunk_fmt = MA_TRUE;\n            if (pWav->onRead(pWav->pUserData, fmtData, sizeof(fmtData)) != sizeof(fmtData)) {\n                return MA_FALSE;\n            }\n            cursor += sizeof(fmtData);\n            fmt.formatTag      = ma_dr_wav_bytes_to_u16_ex(fmtData + 0,  pWav->container);\n            fmt.channels       = ma_dr_wav_bytes_to_u16_ex(fmtData + 2,  pWav->container);\n            fmt.sampleRate     = ma_dr_wav_bytes_to_u32_ex(fmtData + 4,  pWav->container);\n            fmt.avgBytesPerSec = ma_dr_wav_bytes_to_u32_ex(fmtData + 8,  pWav->container);\n            fmt.blockAlign     = ma_dr_wav_bytes_to_u16_ex(fmtData + 12, pWav->container);\n            fmt.bitsPerSample  = ma_dr_wav_bytes_to_u16_ex(fmtData + 14, pWav->container);\n            fmt.extendedSize       = 0;\n            fmt.validBitsPerSample = 0;\n            fmt.channelMask        = 0;\n            MA_DR_WAV_ZERO_MEMORY(fmt.subFormat, sizeof(fmt.subFormat));\n            if (header.sizeInBytes > 16) {\n                ma_uint8 fmt_cbSize[2];\n                int bytesReadSoFar = 0;\n                if (pWav->onRead(pWav->pUserData, fmt_cbSize, sizeof(fmt_cbSize)) != sizeof(fmt_cbSize)) {\n                    return MA_FALSE;\n                }\n                cursor += sizeof(fmt_cbSize);\n                bytesReadSoFar = 18;\n                fmt.extendedSize = ma_dr_wav_bytes_to_u16_ex(fmt_cbSize, pWav->container);\n                if (fmt.extendedSize > 0) {\n                    if (fmt.formatTag == MA_DR_WAVE_FORMAT_EXTENSIBLE) {\n                        if (fmt.extendedSize != 22) {\n                            return MA_FALSE;\n                        }\n                    }\n                    if (fmt.formatTag == MA_DR_WAVE_FORMAT_EXTENSIBLE) {\n                        ma_uint8 fmtext[22];\n                        if (pWav->onRead(pWav->pUserData, fmtext, fmt.extendedSize) != fmt.extendedSize) {\n                            return MA_FALSE;\n                        }\n                        fmt.validBitsPerSample = ma_dr_wav_bytes_to_u16_ex(fmtext + 0, pWav->container);\n                        fmt.channelMask        = ma_dr_wav_bytes_to_u32_ex(fmtext + 2, pWav->container);\n                        ma_dr_wav_bytes_to_guid(fmtext + 6, fmt.subFormat);\n                    } else {\n                        if (pWav->onSeek(pWav->pUserData, fmt.extendedSize, ma_dr_wav_seek_origin_current) == MA_FALSE) {\n                            return MA_FALSE;\n                        }\n                    }\n                    cursor += fmt.extendedSize;\n                    bytesReadSoFar += fmt.extendedSize;\n                }\n                if (pWav->onSeek(pWav->pUserData, (int)(header.sizeInBytes - bytesReadSoFar), ma_dr_wav_seek_origin_current) == MA_FALSE) {\n                    return MA_FALSE;\n                }\n                cursor += (header.sizeInBytes - bytesReadSoFar);\n            }\n            if (header.paddingSize > 0) {\n                if (ma_dr_wav__seek_forward(pWav->onSeek, header.paddingSize, pWav->pUserData) == MA_FALSE) {\n                    break;\n                }\n                cursor += header.paddingSize;\n            }\n            continue;\n        }\n        if (((pWav->container == ma_dr_wav_container_riff || pWav->container == ma_dr_wav_container_rifx || pWav->container == ma_dr_wav_container_rf64) && ma_dr_wav_fourcc_equal(header.id.fourcc, \"data\")) ||\n            ((pWav->container == ma_dr_wav_container_w64) && ma_dr_wav_guid_equal(header.id.guid, ma_dr_wavGUID_W64_DATA))) {\n            foundChunk_data = MA_TRUE;\n            pWav->dataChunkDataPos  = cursor;\n            if (pWav->container != ma_dr_wav_container_rf64) {\n                dataChunkSize = chunkSize;\n            }\n            if (sequential || !isProcessingMetadata) {\n                break;\n            } else {\n                chunkSize += header.paddingSize;\n                if (ma_dr_wav__seek_forward(pWav->onSeek, chunkSize, pWav->pUserData) == MA_FALSE) {\n                    break;\n                }\n                cursor += chunkSize;\n                continue;\n            }\n        }\n        if (((pWav->container == ma_dr_wav_container_riff || pWav->container == ma_dr_wav_container_rifx || pWav->container == ma_dr_wav_container_rf64) && ma_dr_wav_fourcc_equal(header.id.fourcc, \"fact\")) ||\n            ((pWav->container == ma_dr_wav_container_w64) && ma_dr_wav_guid_equal(header.id.guid, ma_dr_wavGUID_W64_FACT))) {\n            if (pWav->container == ma_dr_wav_container_riff || pWav->container == ma_dr_wav_container_rifx) {\n                ma_uint8 sampleCount[4];\n                if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, &sampleCount, 4, &cursor) != 4) {\n                    return MA_FALSE;\n                }\n                chunkSize -= 4;\n                if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_ADPCM) {\n                    sampleCountFromFactChunk = ma_dr_wav_bytes_to_u32_ex(sampleCount, pWav->container);\n                } else {\n                    sampleCountFromFactChunk = 0;\n                }\n            } else if (pWav->container == ma_dr_wav_container_w64) {\n                if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, &sampleCountFromFactChunk, 8, &cursor) != 8) {\n                    return MA_FALSE;\n                }\n                chunkSize -= 8;\n            } else if (pWav->container == ma_dr_wav_container_rf64) {\n            }\n            chunkSize += header.paddingSize;\n            if (ma_dr_wav__seek_forward(pWav->onSeek, chunkSize, pWav->pUserData) == MA_FALSE) {\n                break;\n            }\n            cursor += chunkSize;\n            continue;\n        }\n        if (pWav->container == ma_dr_wav_container_aiff && ma_dr_wav_fourcc_equal(header.id.fourcc, \"COMM\")) {\n            ma_uint8 commData[24];\n            ma_uint32 commDataBytesToRead;\n            ma_uint16 channels;\n            ma_uint32 frameCount;\n            ma_uint16 sampleSizeInBits;\n            ma_int64  sampleRate;\n            ma_uint16 compressionFormat;\n            foundChunk_fmt = MA_TRUE;\n            if (isAIFCFormType) {\n                commDataBytesToRead = 24;\n                if (header.sizeInBytes < commDataBytesToRead) {\n                    return MA_FALSE;\n                }\n            } else {\n                commDataBytesToRead = 18;\n                if (header.sizeInBytes != commDataBytesToRead) {\n                    return MA_FALSE;\n                }\n            }\n            if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, commData, commDataBytesToRead, &cursor) != commDataBytesToRead) {\n                return MA_FALSE;\n            }\n            channels         = ma_dr_wav_bytes_to_u16_ex     (commData + 0, pWav->container);\n            frameCount       = ma_dr_wav_bytes_to_u32_ex     (commData + 2, pWav->container);\n            sampleSizeInBits = ma_dr_wav_bytes_to_u16_ex     (commData + 6, pWav->container);\n            sampleRate       = ma_dr_wav_aiff_extented_to_s64(commData + 8);\n            if (sampleRate < 0 || sampleRate > 0xFFFFFFFF) {\n                return MA_FALSE;\n            }\n            if (isAIFCFormType) {\n                const ma_uint8* type = commData + 18;\n                if (ma_dr_wav_fourcc_equal(type, \"NONE\")) {\n                    compressionFormat = MA_DR_WAVE_FORMAT_PCM;\n                } else if (ma_dr_wav_fourcc_equal(type, \"raw \")) {\n                    compressionFormat = MA_DR_WAVE_FORMAT_PCM;\n                    if (sampleSizeInBits == 8) {\n                        pWav->aiff.isUnsigned = MA_TRUE;\n                    }\n                } else if (ma_dr_wav_fourcc_equal(type, \"sowt\")) {\n                    compressionFormat = MA_DR_WAVE_FORMAT_PCM;\n                    pWav->aiff.isLE = MA_TRUE;\n                } else if (ma_dr_wav_fourcc_equal(type, \"fl32\") || ma_dr_wav_fourcc_equal(type, \"fl64\") || ma_dr_wav_fourcc_equal(type, \"FL32\") || ma_dr_wav_fourcc_equal(type, \"FL64\")) {\n                    compressionFormat = MA_DR_WAVE_FORMAT_IEEE_FLOAT;\n                } else if (ma_dr_wav_fourcc_equal(type, \"alaw\") || ma_dr_wav_fourcc_equal(type, \"ALAW\")) {\n                    compressionFormat = MA_DR_WAVE_FORMAT_ALAW;\n                } else if (ma_dr_wav_fourcc_equal(type, \"ulaw\") || ma_dr_wav_fourcc_equal(type, \"ULAW\")) {\n                    compressionFormat = MA_DR_WAVE_FORMAT_MULAW;\n                } else if (ma_dr_wav_fourcc_equal(type, \"ima4\")) {\n                    compressionFormat = MA_DR_WAVE_FORMAT_DVI_ADPCM;\n                    sampleSizeInBits = 4;\n                    return MA_FALSE;\n                } else {\n                    return MA_FALSE;\n                }\n            } else {\n                compressionFormat = MA_DR_WAVE_FORMAT_PCM;\n            }\n            aiffFrameCount = frameCount;\n            fmt.formatTag      = compressionFormat;\n            fmt.channels       = channels;\n            fmt.sampleRate     = (ma_uint32)sampleRate;\n            fmt.bitsPerSample  = sampleSizeInBits;\n            fmt.blockAlign     = (ma_uint16)(fmt.channels * fmt.bitsPerSample / 8);\n            fmt.avgBytesPerSec = fmt.blockAlign * fmt.sampleRate;\n            if (fmt.blockAlign == 0 && compressionFormat == MA_DR_WAVE_FORMAT_DVI_ADPCM) {\n                fmt.blockAlign = 34 * fmt.channels;\n            }\n            if (compressionFormat == MA_DR_WAVE_FORMAT_ALAW || compressionFormat == MA_DR_WAVE_FORMAT_MULAW) {\n                if (fmt.bitsPerSample > 8) {\n                    fmt.bitsPerSample = 8;\n                    fmt.blockAlign = fmt.channels;\n                }\n            }\n            fmt.bitsPerSample += (fmt.bitsPerSample & 7);\n            if (isAIFCFormType) {\n                if (ma_dr_wav__seek_forward(pWav->onSeek, (chunkSize - commDataBytesToRead), pWav->pUserData) == MA_FALSE) {\n                    return MA_FALSE;\n                }\n                cursor += (chunkSize - commDataBytesToRead);\n            }\n            continue;\n        }\n        if (pWav->container == ma_dr_wav_container_aiff && ma_dr_wav_fourcc_equal(header.id.fourcc, \"SSND\")) {\n            ma_uint8 offsetAndBlockSizeData[8];\n            ma_uint32 offset;\n            foundChunk_data = MA_TRUE;\n            if (ma_dr_wav__on_read(pWav->onRead, pWav->pUserData, offsetAndBlockSizeData, sizeof(offsetAndBlockSizeData), &cursor) != sizeof(offsetAndBlockSizeData)) {\n                return MA_FALSE;\n            }\n            offset = ma_dr_wav_bytes_to_u32_ex(offsetAndBlockSizeData + 0, pWav->container);\n            if (ma_dr_wav__seek_forward(pWav->onSeek, offset, pWav->pUserData) == MA_FALSE) {\n                return MA_FALSE;\n            }\n            cursor += offset;\n            pWav->dataChunkDataPos = cursor;\n            dataChunkSize = chunkSize;\n            if (sequential || !isProcessingMetadata) {\n                break;\n            } else {\n                if (ma_dr_wav__seek_forward(pWav->onSeek, chunkSize, pWav->pUserData) == MA_FALSE) {\n                    break;\n                }\n                cursor += chunkSize;\n                continue;\n            }\n        }\n        if (isProcessingMetadata) {\n            ma_uint64 metadataBytesRead;\n            metadataBytesRead = ma_dr_wav__metadata_process_chunk(&metadataParser, &header, ma_dr_wav_metadata_type_all_including_unknown);\n            MA_DR_WAV_ASSERT(metadataBytesRead <= header.sizeInBytes);\n            if (ma_dr_wav__seek_from_start(pWav->onSeek, cursor, pWav->pUserData) == MA_FALSE) {\n                break;\n            }\n        }\n        chunkSize += header.paddingSize;\n        if (ma_dr_wav__seek_forward(pWav->onSeek, chunkSize, pWav->pUserData) == MA_FALSE) {\n            break;\n        }\n        cursor += chunkSize;\n    }\n    if (!foundChunk_fmt || !foundChunk_data) {\n        return MA_FALSE;\n    }\n    if ((fmt.sampleRate    == 0 || fmt.sampleRate    > MA_DR_WAV_MAX_SAMPLE_RATE    ) ||\n        (fmt.channels      == 0 || fmt.channels      > MA_DR_WAV_MAX_CHANNELS       ) ||\n        (fmt.bitsPerSample == 0 || fmt.bitsPerSample > MA_DR_WAV_MAX_BITS_PER_SAMPLE) ||\n        fmt.blockAlign == 0) {\n        return MA_FALSE;\n    }\n    translatedFormatTag = fmt.formatTag;\n    if (translatedFormatTag == MA_DR_WAVE_FORMAT_EXTENSIBLE) {\n        translatedFormatTag = ma_dr_wav_bytes_to_u16_ex(fmt.subFormat + 0, pWav->container);\n    }\n    if (!sequential) {\n        if (!ma_dr_wav__seek_from_start(pWav->onSeek, pWav->dataChunkDataPos, pWav->pUserData)) {\n            return MA_FALSE;\n        }\n        cursor = pWav->dataChunkDataPos;\n    }\n    if (isProcessingMetadata && metadataParser.metadataCount > 0) {\n        if (ma_dr_wav__seek_from_start(pWav->onSeek, metadataStartPos, pWav->pUserData) == MA_FALSE) {\n            return MA_FALSE;\n        }\n        result = ma_dr_wav__metadata_alloc(&metadataParser, &pWav->allocationCallbacks);\n        if (result != MA_SUCCESS) {\n            return MA_FALSE;\n        }\n        metadataParser.stage = ma_dr_wav__metadata_parser_stage_read;\n        for (;;) {\n            ma_dr_wav_chunk_header header;\n            ma_uint64 metadataBytesRead;\n            result = ma_dr_wav__read_chunk_header(pWav->onRead, pWav->pUserData, pWav->container, &cursor, &header);\n            if (result != MA_SUCCESS) {\n                break;\n            }\n            metadataBytesRead = ma_dr_wav__metadata_process_chunk(&metadataParser, &header, ma_dr_wav_metadata_type_all_including_unknown);\n            if (ma_dr_wav__seek_forward(pWav->onSeek, (header.sizeInBytes + header.paddingSize) - metadataBytesRead, pWav->pUserData) == MA_FALSE) {\n                ma_dr_wav_free(metadataParser.pMetadata, &pWav->allocationCallbacks);\n                return MA_FALSE;\n            }\n        }\n        pWav->pMetadata     = metadataParser.pMetadata;\n        pWav->metadataCount = metadataParser.metadataCount;\n    }\n    if (dataChunkSize == 0xFFFFFFFF && (pWav->container == ma_dr_wav_container_riff || pWav->container == ma_dr_wav_container_rifx) && pWav->isSequentialWrite == MA_FALSE) {\n        dataChunkSize = 0;\n        for (;;) {\n            ma_uint8 temp[4096];\n            size_t bytesRead = pWav->onRead(pWav->pUserData, temp, sizeof(temp));\n            dataChunkSize += bytesRead;\n            if (bytesRead < sizeof(temp)) {\n                break;\n            }\n        }\n    }\n    if (ma_dr_wav__seek_from_start(pWav->onSeek, pWav->dataChunkDataPos, pWav->pUserData) == MA_FALSE) {\n        ma_dr_wav_free(pWav->pMetadata, &pWav->allocationCallbacks);\n        return MA_FALSE;\n    }\n    pWav->fmt                 = fmt;\n    pWav->sampleRate          = fmt.sampleRate;\n    pWav->channels            = fmt.channels;\n    pWav->bitsPerSample       = fmt.bitsPerSample;\n    pWav->bytesRemaining      = dataChunkSize;\n    pWav->translatedFormatTag = translatedFormatTag;\n    pWav->dataChunkDataSize   = dataChunkSize;\n    if (sampleCountFromFactChunk != 0) {\n        pWav->totalPCMFrameCount = sampleCountFromFactChunk;\n    } else if (aiffFrameCount != 0) {\n        pWav->totalPCMFrameCount = aiffFrameCount;\n    } else {\n        ma_uint32 bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n        if (bytesPerFrame == 0) {\n            ma_dr_wav_free(pWav->pMetadata, &pWav->allocationCallbacks);\n            return MA_FALSE;\n        }\n        pWav->totalPCMFrameCount = dataChunkSize / bytesPerFrame;\n        if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_ADPCM) {\n            ma_uint64 totalBlockHeaderSizeInBytes;\n            ma_uint64 blockCount = dataChunkSize / fmt.blockAlign;\n            if ((blockCount * fmt.blockAlign) < dataChunkSize) {\n                blockCount += 1;\n            }\n            totalBlockHeaderSizeInBytes = blockCount * (6*fmt.channels);\n            pWav->totalPCMFrameCount = ((dataChunkSize - totalBlockHeaderSizeInBytes) * 2) / fmt.channels;\n        }\n        if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_DVI_ADPCM) {\n            ma_uint64 totalBlockHeaderSizeInBytes;\n            ma_uint64 blockCount = dataChunkSize / fmt.blockAlign;\n            if ((blockCount * fmt.blockAlign) < dataChunkSize) {\n                blockCount += 1;\n            }\n            totalBlockHeaderSizeInBytes = blockCount * (4*fmt.channels);\n            pWav->totalPCMFrameCount = ((dataChunkSize - totalBlockHeaderSizeInBytes) * 2) / fmt.channels;\n            pWav->totalPCMFrameCount += blockCount;\n        }\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_ADPCM || pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_DVI_ADPCM) {\n        if (pWav->channels > 2) {\n            ma_dr_wav_free(pWav->pMetadata, &pWav->allocationCallbacks);\n            return MA_FALSE;\n        }\n    }\n    if (ma_dr_wav_get_bytes_per_pcm_frame(pWav) == 0) {\n        ma_dr_wav_free(pWav->pMetadata, &pWav->allocationCallbacks);\n        return MA_FALSE;\n    }\n#ifdef MA_DR_WAV_LIBSNDFILE_COMPAT\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_ADPCM) {\n        ma_uint64 blockCount = dataChunkSize / fmt.blockAlign;\n        pWav->totalPCMFrameCount = (((blockCount * (fmt.blockAlign - (6*pWav->channels))) * 2)) / fmt.channels;\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_DVI_ADPCM) {\n        ma_uint64 blockCount = dataChunkSize / fmt.blockAlign;\n        pWav->totalPCMFrameCount = (((blockCount * (fmt.blockAlign - (4*pWav->channels))) * 2) + (blockCount * pWav->channels)) / fmt.channels;\n    }\n#endif\n    return MA_TRUE;\n}\nMA_API ma_bool32 ma_dr_wav_init(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_wav_init_ex(pWav, onRead, onSeek, NULL, pUserData, NULL, 0, pAllocationCallbacks);\n}\nMA_API ma_bool32 ma_dr_wav_init_ex(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, ma_dr_wav_chunk_proc onChunk, void* pReadSeekUserData, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (!ma_dr_wav_preinit(pWav, onRead, onSeek, pReadSeekUserData, pAllocationCallbacks)) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init__internal(pWav, onChunk, pChunkUserData, flags);\n}\nMA_API ma_bool32 ma_dr_wav_init_with_metadata(ma_dr_wav* pWav, ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (!ma_dr_wav_preinit(pWav, onRead, onSeek, pUserData, pAllocationCallbacks)) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init__internal(pWav, NULL, NULL, flags | MA_DR_WAV_WITH_METADATA);\n}\nMA_API ma_dr_wav_metadata* ma_dr_wav_take_ownership_of_metadata(ma_dr_wav* pWav)\n{\n    ma_dr_wav_metadata *result = pWav->pMetadata;\n    pWav->pMetadata     = NULL;\n    pWav->metadataCount = 0;\n    return result;\n}\nMA_PRIVATE size_t ma_dr_wav__write(ma_dr_wav* pWav, const void* pData, size_t dataSize)\n{\n    MA_DR_WAV_ASSERT(pWav          != NULL);\n    MA_DR_WAV_ASSERT(pWav->onWrite != NULL);\n    return pWav->onWrite(pWav->pUserData, pData, dataSize);\n}\nMA_PRIVATE size_t ma_dr_wav__write_byte(ma_dr_wav* pWav, ma_uint8 byte)\n{\n    MA_DR_WAV_ASSERT(pWav          != NULL);\n    MA_DR_WAV_ASSERT(pWav->onWrite != NULL);\n    return pWav->onWrite(pWav->pUserData, &byte, 1);\n}\nMA_PRIVATE size_t ma_dr_wav__write_u16ne_to_le(ma_dr_wav* pWav, ma_uint16 value)\n{\n    MA_DR_WAV_ASSERT(pWav          != NULL);\n    MA_DR_WAV_ASSERT(pWav->onWrite != NULL);\n    if (!ma_dr_wav__is_little_endian()) {\n        value = ma_dr_wav__bswap16(value);\n    }\n    return ma_dr_wav__write(pWav, &value, 2);\n}\nMA_PRIVATE size_t ma_dr_wav__write_u32ne_to_le(ma_dr_wav* pWav, ma_uint32 value)\n{\n    MA_DR_WAV_ASSERT(pWav          != NULL);\n    MA_DR_WAV_ASSERT(pWav->onWrite != NULL);\n    if (!ma_dr_wav__is_little_endian()) {\n        value = ma_dr_wav__bswap32(value);\n    }\n    return ma_dr_wav__write(pWav, &value, 4);\n}\nMA_PRIVATE size_t ma_dr_wav__write_u64ne_to_le(ma_dr_wav* pWav, ma_uint64 value)\n{\n    MA_DR_WAV_ASSERT(pWav          != NULL);\n    MA_DR_WAV_ASSERT(pWav->onWrite != NULL);\n    if (!ma_dr_wav__is_little_endian()) {\n        value = ma_dr_wav__bswap64(value);\n    }\n    return ma_dr_wav__write(pWav, &value, 8);\n}\nMA_PRIVATE size_t ma_dr_wav__write_f32ne_to_le(ma_dr_wav* pWav, float value)\n{\n    union {\n       ma_uint32 u32;\n       float f32;\n    } u;\n    MA_DR_WAV_ASSERT(pWav          != NULL);\n    MA_DR_WAV_ASSERT(pWav->onWrite != NULL);\n    u.f32 = value;\n    if (!ma_dr_wav__is_little_endian()) {\n        u.u32 = ma_dr_wav__bswap32(u.u32);\n    }\n    return ma_dr_wav__write(pWav, &u.u32, 4);\n}\nMA_PRIVATE size_t ma_dr_wav__write_or_count(ma_dr_wav* pWav, const void* pData, size_t dataSize)\n{\n    if (pWav == NULL) {\n        return dataSize;\n    }\n    return ma_dr_wav__write(pWav, pData, dataSize);\n}\nMA_PRIVATE size_t ma_dr_wav__write_or_count_byte(ma_dr_wav* pWav, ma_uint8 byte)\n{\n    if (pWav == NULL) {\n        return 1;\n    }\n    return ma_dr_wav__write_byte(pWav, byte);\n}\nMA_PRIVATE size_t ma_dr_wav__write_or_count_u16ne_to_le(ma_dr_wav* pWav, ma_uint16 value)\n{\n    if (pWav == NULL) {\n        return 2;\n    }\n    return ma_dr_wav__write_u16ne_to_le(pWav, value);\n}\nMA_PRIVATE size_t ma_dr_wav__write_or_count_u32ne_to_le(ma_dr_wav* pWav, ma_uint32 value)\n{\n    if (pWav == NULL) {\n        return 4;\n    }\n    return ma_dr_wav__write_u32ne_to_le(pWav, value);\n}\n#if 0\nMA_PRIVATE size_t ma_dr_wav__write_or_count_u64ne_to_le(ma_dr_wav* pWav, ma_uint64 value)\n{\n    if (pWav == NULL) {\n        return 8;\n    }\n    return ma_dr_wav__write_u64ne_to_le(pWav, value);\n}\n#endif\nMA_PRIVATE size_t ma_dr_wav__write_or_count_f32ne_to_le(ma_dr_wav* pWav, float value)\n{\n    if (pWav == NULL) {\n        return 4;\n    }\n    return ma_dr_wav__write_f32ne_to_le(pWav, value);\n}\nMA_PRIVATE size_t ma_dr_wav__write_or_count_string_to_fixed_size_buf(ma_dr_wav* pWav, char* str, size_t bufFixedSize)\n{\n    size_t len;\n    if (pWav == NULL) {\n        return bufFixedSize;\n    }\n    len = ma_dr_wav__strlen_clamped(str, bufFixedSize);\n    ma_dr_wav__write_or_count(pWav, str, len);\n    if (len < bufFixedSize) {\n        size_t i;\n        for (i = 0; i < bufFixedSize - len; ++i) {\n            ma_dr_wav__write_byte(pWav, 0);\n        }\n    }\n    return bufFixedSize;\n}\nMA_PRIVATE size_t ma_dr_wav__write_or_count_metadata(ma_dr_wav* pWav, ma_dr_wav_metadata* pMetadatas, ma_uint32 metadataCount)\n{\n    size_t bytesWritten = 0;\n    ma_bool32 hasListAdtl = MA_FALSE;\n    ma_bool32 hasListInfo = MA_FALSE;\n    ma_uint32 iMetadata;\n    if (pMetadatas == NULL || metadataCount == 0) {\n        return 0;\n    }\n    for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) {\n        ma_dr_wav_metadata* pMetadata = &pMetadatas[iMetadata];\n        ma_uint32 chunkSize = 0;\n        if ((pMetadata->type & ma_dr_wav_metadata_type_list_all_info_strings) || (pMetadata->type == ma_dr_wav_metadata_type_unknown && pMetadata->data.unknown.chunkLocation == ma_dr_wav_metadata_location_inside_info_list)) {\n            hasListInfo = MA_TRUE;\n        }\n        if ((pMetadata->type & ma_dr_wav_metadata_type_list_all_adtl) || (pMetadata->type == ma_dr_wav_metadata_type_unknown && pMetadata->data.unknown.chunkLocation == ma_dr_wav_metadata_location_inside_adtl_list)) {\n            hasListAdtl = MA_TRUE;\n        }\n        switch (pMetadata->type) {\n            case ma_dr_wav_metadata_type_smpl:\n            {\n                ma_uint32 iLoop;\n                chunkSize = MA_DR_WAV_SMPL_BYTES + MA_DR_WAV_SMPL_LOOP_BYTES * pMetadata->data.smpl.sampleLoopCount + pMetadata->data.smpl.samplerSpecificDataSizeInBytes;\n                bytesWritten += ma_dr_wav__write_or_count(pWav, \"smpl\", 4);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, chunkSize);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.manufacturerId);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.productId);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.samplePeriodNanoseconds);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.midiUnityNote);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.midiPitchFraction);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.smpteFormat);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.smpteOffset);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.sampleLoopCount);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.samplerSpecificDataSizeInBytes);\n                for (iLoop = 0; iLoop < pMetadata->data.smpl.sampleLoopCount; ++iLoop) {\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].cuePointId);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].type);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].firstSampleByteOffset);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].lastSampleByteOffset);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].sampleFraction);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.smpl.pLoops[iLoop].playCount);\n                }\n                if (pMetadata->data.smpl.samplerSpecificDataSizeInBytes > 0) {\n                    bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.smpl.pSamplerSpecificData, pMetadata->data.smpl.samplerSpecificDataSizeInBytes);\n                }\n            } break;\n            case ma_dr_wav_metadata_type_inst:\n            {\n                chunkSize = MA_DR_WAV_INST_BYTES;\n                bytesWritten += ma_dr_wav__write_or_count(pWav, \"inst\", 4);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, chunkSize);\n                bytesWritten += ma_dr_wav__write_or_count(pWav, &pMetadata->data.inst.midiUnityNote, 1);\n                bytesWritten += ma_dr_wav__write_or_count(pWav, &pMetadata->data.inst.fineTuneCents, 1);\n                bytesWritten += ma_dr_wav__write_or_count(pWav, &pMetadata->data.inst.gainDecibels, 1);\n                bytesWritten += ma_dr_wav__write_or_count(pWav, &pMetadata->data.inst.lowNote, 1);\n                bytesWritten += ma_dr_wav__write_or_count(pWav, &pMetadata->data.inst.highNote, 1);\n                bytesWritten += ma_dr_wav__write_or_count(pWav, &pMetadata->data.inst.lowVelocity, 1);\n                bytesWritten += ma_dr_wav__write_or_count(pWav, &pMetadata->data.inst.highVelocity, 1);\n            } break;\n            case ma_dr_wav_metadata_type_cue:\n            {\n                ma_uint32 iCuePoint;\n                chunkSize = MA_DR_WAV_CUE_BYTES + MA_DR_WAV_CUE_POINT_BYTES * pMetadata->data.cue.cuePointCount;\n                bytesWritten += ma_dr_wav__write_or_count(pWav, \"cue \", 4);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, chunkSize);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.cuePointCount);\n                for (iCuePoint = 0; iCuePoint < pMetadata->data.cue.cuePointCount; ++iCuePoint) {\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].id);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].playOrderPosition);\n                    bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].dataChunkId, 4);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].chunkStart);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].blockStart);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.cue.pCuePoints[iCuePoint].sampleByteOffset);\n                }\n            } break;\n            case ma_dr_wav_metadata_type_acid:\n            {\n                chunkSize = MA_DR_WAV_ACID_BYTES;\n                bytesWritten += ma_dr_wav__write_or_count(pWav, \"acid\", 4);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, chunkSize);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.acid.flags);\n                bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.acid.midiUnityNote);\n                bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.acid.reserved1);\n                bytesWritten += ma_dr_wav__write_or_count_f32ne_to_le(pWav, pMetadata->data.acid.reserved2);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.acid.numBeats);\n                bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.acid.meterDenominator);\n                bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.acid.meterNumerator);\n                bytesWritten += ma_dr_wav__write_or_count_f32ne_to_le(pWav, pMetadata->data.acid.tempo);\n            } break;\n            case ma_dr_wav_metadata_type_bext:\n            {\n                char reservedBuf[MA_DR_WAV_BEXT_RESERVED_BYTES];\n                ma_uint32 timeReferenceLow;\n                ma_uint32 timeReferenceHigh;\n                chunkSize = MA_DR_WAV_BEXT_BYTES + pMetadata->data.bext.codingHistorySize;\n                bytesWritten += ma_dr_wav__write_or_count(pWav, \"bext\", 4);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, chunkSize);\n                bytesWritten += ma_dr_wav__write_or_count_string_to_fixed_size_buf(pWav, pMetadata->data.bext.pDescription, MA_DR_WAV_BEXT_DESCRIPTION_BYTES);\n                bytesWritten += ma_dr_wav__write_or_count_string_to_fixed_size_buf(pWav, pMetadata->data.bext.pOriginatorName, MA_DR_WAV_BEXT_ORIGINATOR_NAME_BYTES);\n                bytesWritten += ma_dr_wav__write_or_count_string_to_fixed_size_buf(pWav, pMetadata->data.bext.pOriginatorReference, MA_DR_WAV_BEXT_ORIGINATOR_REF_BYTES);\n                bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.bext.pOriginationDate, sizeof(pMetadata->data.bext.pOriginationDate));\n                bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.bext.pOriginationTime, sizeof(pMetadata->data.bext.pOriginationTime));\n                timeReferenceLow  = (ma_uint32)(pMetadata->data.bext.timeReference & 0xFFFFFFFF);\n                timeReferenceHigh = (ma_uint32)(pMetadata->data.bext.timeReference >> 32);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, timeReferenceLow);\n                bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, timeReferenceHigh);\n                bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.version);\n                bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.bext.pUMID, MA_DR_WAV_BEXT_UMID_BYTES);\n                bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.loudnessValue);\n                bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.loudnessRange);\n                bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.maxTruePeakLevel);\n                bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.maxMomentaryLoudness);\n                bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.bext.maxShortTermLoudness);\n                MA_DR_WAV_ZERO_MEMORY(reservedBuf, sizeof(reservedBuf));\n                bytesWritten += ma_dr_wav__write_or_count(pWav, reservedBuf, sizeof(reservedBuf));\n                if (pMetadata->data.bext.codingHistorySize > 0) {\n                    bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.bext.pCodingHistory, pMetadata->data.bext.codingHistorySize);\n                }\n            } break;\n            case ma_dr_wav_metadata_type_unknown:\n            {\n                if (pMetadata->data.unknown.chunkLocation == ma_dr_wav_metadata_location_top_level) {\n                    chunkSize = pMetadata->data.unknown.dataSizeInBytes;\n                    bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.unknown.id, 4);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, chunkSize);\n                    bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.unknown.pData, pMetadata->data.unknown.dataSizeInBytes);\n                }\n            } break;\n            default: break;\n        }\n        if ((chunkSize % 2) != 0) {\n            bytesWritten += ma_dr_wav__write_or_count_byte(pWav, 0);\n        }\n    }\n    if (hasListInfo) {\n        ma_uint32 chunkSize = 4;\n        for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) {\n            ma_dr_wav_metadata* pMetadata = &pMetadatas[iMetadata];\n            if ((pMetadata->type & ma_dr_wav_metadata_type_list_all_info_strings)) {\n                chunkSize += 8;\n                chunkSize += pMetadata->data.infoText.stringLength + 1;\n            } else if (pMetadata->type == ma_dr_wav_metadata_type_unknown && pMetadata->data.unknown.chunkLocation == ma_dr_wav_metadata_location_inside_info_list) {\n                chunkSize += 8;\n                chunkSize += pMetadata->data.unknown.dataSizeInBytes;\n            }\n            if ((chunkSize % 2) != 0) {\n                chunkSize += 1;\n            }\n        }\n        bytesWritten += ma_dr_wav__write_or_count(pWav, \"LIST\", 4);\n        bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, chunkSize);\n        bytesWritten += ma_dr_wav__write_or_count(pWav, \"INFO\", 4);\n        for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) {\n            ma_dr_wav_metadata* pMetadata = &pMetadatas[iMetadata];\n            ma_uint32 subchunkSize = 0;\n            if (pMetadata->type & ma_dr_wav_metadata_type_list_all_info_strings) {\n                const char* pID = NULL;\n                switch (pMetadata->type) {\n                    case ma_dr_wav_metadata_type_list_info_software:    pID = \"ISFT\"; break;\n                    case ma_dr_wav_metadata_type_list_info_copyright:   pID = \"ICOP\"; break;\n                    case ma_dr_wav_metadata_type_list_info_title:       pID = \"INAM\"; break;\n                    case ma_dr_wav_metadata_type_list_info_artist:      pID = \"IART\"; break;\n                    case ma_dr_wav_metadata_type_list_info_comment:     pID = \"ICMT\"; break;\n                    case ma_dr_wav_metadata_type_list_info_date:        pID = \"ICRD\"; break;\n                    case ma_dr_wav_metadata_type_list_info_genre:       pID = \"IGNR\"; break;\n                    case ma_dr_wav_metadata_type_list_info_album:       pID = \"IPRD\"; break;\n                    case ma_dr_wav_metadata_type_list_info_tracknumber: pID = \"ITRK\"; break;\n                    default: break;\n                }\n                MA_DR_WAV_ASSERT(pID != NULL);\n                if (pMetadata->data.infoText.stringLength) {\n                    subchunkSize = pMetadata->data.infoText.stringLength + 1;\n                    bytesWritten += ma_dr_wav__write_or_count(pWav, pID, 4);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, subchunkSize);\n                    bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.infoText.pString, pMetadata->data.infoText.stringLength);\n                    bytesWritten += ma_dr_wav__write_or_count_byte(pWav, '\\0');\n                }\n            } else if (pMetadata->type == ma_dr_wav_metadata_type_unknown && pMetadata->data.unknown.chunkLocation == ma_dr_wav_metadata_location_inside_info_list) {\n                if (pMetadata->data.unknown.dataSizeInBytes) {\n                    subchunkSize = pMetadata->data.unknown.dataSizeInBytes;\n                    bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.unknown.id, 4);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.unknown.dataSizeInBytes);\n                    bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.unknown.pData, subchunkSize);\n                }\n            }\n            if ((subchunkSize % 2) != 0) {\n                bytesWritten += ma_dr_wav__write_or_count_byte(pWav, 0);\n            }\n        }\n    }\n    if (hasListAdtl) {\n        ma_uint32 chunkSize = 4;\n        for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) {\n            ma_dr_wav_metadata* pMetadata = &pMetadatas[iMetadata];\n            switch (pMetadata->type)\n            {\n                case ma_dr_wav_metadata_type_list_label:\n                case ma_dr_wav_metadata_type_list_note:\n                {\n                    chunkSize += 8;\n                    chunkSize += MA_DR_WAV_LIST_LABEL_OR_NOTE_BYTES;\n                    if (pMetadata->data.labelOrNote.stringLength > 0) {\n                        chunkSize += pMetadata->data.labelOrNote.stringLength + 1;\n                    }\n                } break;\n                case ma_dr_wav_metadata_type_list_labelled_cue_region:\n                {\n                    chunkSize += 8;\n                    chunkSize += MA_DR_WAV_LIST_LABELLED_TEXT_BYTES;\n                    if (pMetadata->data.labelledCueRegion.stringLength > 0) {\n                        chunkSize += pMetadata->data.labelledCueRegion.stringLength + 1;\n                    }\n                } break;\n                case ma_dr_wav_metadata_type_unknown:\n                {\n                    if (pMetadata->data.unknown.chunkLocation == ma_dr_wav_metadata_location_inside_adtl_list) {\n                        chunkSize += 8;\n                        chunkSize += pMetadata->data.unknown.dataSizeInBytes;\n                    }\n                } break;\n                default: break;\n            }\n            if ((chunkSize % 2) != 0) {\n                chunkSize += 1;\n            }\n        }\n        bytesWritten += ma_dr_wav__write_or_count(pWav, \"LIST\", 4);\n        bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, chunkSize);\n        bytesWritten += ma_dr_wav__write_or_count(pWav, \"adtl\", 4);\n        for (iMetadata = 0; iMetadata < metadataCount; ++iMetadata) {\n            ma_dr_wav_metadata* pMetadata = &pMetadatas[iMetadata];\n            ma_uint32 subchunkSize = 0;\n            switch (pMetadata->type)\n            {\n                case ma_dr_wav_metadata_type_list_label:\n                case ma_dr_wav_metadata_type_list_note:\n                {\n                    if (pMetadata->data.labelOrNote.stringLength > 0) {\n                        const char *pID = NULL;\n                        if (pMetadata->type == ma_dr_wav_metadata_type_list_label) {\n                            pID = \"labl\";\n                        }\n                        else if (pMetadata->type == ma_dr_wav_metadata_type_list_note) {\n                            pID = \"note\";\n                        }\n                        MA_DR_WAV_ASSERT(pID != NULL);\n                        MA_DR_WAV_ASSERT(pMetadata->data.labelOrNote.pString != NULL);\n                        subchunkSize = MA_DR_WAV_LIST_LABEL_OR_NOTE_BYTES;\n                        bytesWritten += ma_dr_wav__write_or_count(pWav, pID, 4);\n                        subchunkSize += pMetadata->data.labelOrNote.stringLength + 1;\n                        bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, subchunkSize);\n                        bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.labelOrNote.cuePointId);\n                        bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.labelOrNote.pString, pMetadata->data.labelOrNote.stringLength);\n                        bytesWritten += ma_dr_wav__write_or_count_byte(pWav, '\\0');\n                    }\n                } break;\n                case ma_dr_wav_metadata_type_list_labelled_cue_region:\n                {\n                    subchunkSize = MA_DR_WAV_LIST_LABELLED_TEXT_BYTES;\n                    bytesWritten += ma_dr_wav__write_or_count(pWav, \"ltxt\", 4);\n                    if (pMetadata->data.labelledCueRegion.stringLength > 0) {\n                        subchunkSize += pMetadata->data.labelledCueRegion.stringLength + 1;\n                    }\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, subchunkSize);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.labelledCueRegion.cuePointId);\n                    bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, pMetadata->data.labelledCueRegion.sampleLength);\n                    bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.labelledCueRegion.purposeId, 4);\n                    bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.labelledCueRegion.country);\n                    bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.labelledCueRegion.language);\n                    bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.labelledCueRegion.dialect);\n                    bytesWritten += ma_dr_wav__write_or_count_u16ne_to_le(pWav, pMetadata->data.labelledCueRegion.codePage);\n                    if (pMetadata->data.labelledCueRegion.stringLength > 0) {\n                        MA_DR_WAV_ASSERT(pMetadata->data.labelledCueRegion.pString != NULL);\n                        bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.labelledCueRegion.pString, pMetadata->data.labelledCueRegion.stringLength);\n                        bytesWritten += ma_dr_wav__write_or_count_byte(pWav, '\\0');\n                    }\n                } break;\n                case ma_dr_wav_metadata_type_unknown:\n                {\n                    if (pMetadata->data.unknown.chunkLocation == ma_dr_wav_metadata_location_inside_adtl_list) {\n                        subchunkSize = pMetadata->data.unknown.dataSizeInBytes;\n                        MA_DR_WAV_ASSERT(pMetadata->data.unknown.pData != NULL);\n                        bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.unknown.id, 4);\n                        bytesWritten += ma_dr_wav__write_or_count_u32ne_to_le(pWav, subchunkSize);\n                        bytesWritten += ma_dr_wav__write_or_count(pWav, pMetadata->data.unknown.pData, subchunkSize);\n                    }\n                } break;\n                default: break;\n            }\n            if ((subchunkSize % 2) != 0) {\n                bytesWritten += ma_dr_wav__write_or_count_byte(pWav, 0);\n            }\n        }\n    }\n    MA_DR_WAV_ASSERT((bytesWritten % 2) == 0);\n    return bytesWritten;\n}\nMA_PRIVATE ma_uint32 ma_dr_wav__riff_chunk_size_riff(ma_uint64 dataChunkSize, ma_dr_wav_metadata* pMetadata, ma_uint32 metadataCount)\n{\n    ma_uint64 chunkSize = 4 + 24 + (ma_uint64)ma_dr_wav__write_or_count_metadata(NULL, pMetadata, metadataCount) + 8 + dataChunkSize + ma_dr_wav__chunk_padding_size_riff(dataChunkSize);\n    if (chunkSize > 0xFFFFFFFFUL) {\n        chunkSize = 0xFFFFFFFFUL;\n    }\n    return (ma_uint32)chunkSize;\n}\nMA_PRIVATE ma_uint32 ma_dr_wav__data_chunk_size_riff(ma_uint64 dataChunkSize)\n{\n    if (dataChunkSize <= 0xFFFFFFFFUL) {\n        return (ma_uint32)dataChunkSize;\n    } else {\n        return 0xFFFFFFFFUL;\n    }\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__riff_chunk_size_w64(ma_uint64 dataChunkSize)\n{\n    ma_uint64 dataSubchunkPaddingSize = ma_dr_wav__chunk_padding_size_w64(dataChunkSize);\n    return 80 + 24 + dataChunkSize + dataSubchunkPaddingSize;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__data_chunk_size_w64(ma_uint64 dataChunkSize)\n{\n    return 24 + dataChunkSize;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__riff_chunk_size_rf64(ma_uint64 dataChunkSize, ma_dr_wav_metadata *metadata, ma_uint32 numMetadata)\n{\n    ma_uint64 chunkSize = 4 + 36 + 24 + (ma_uint64)ma_dr_wav__write_or_count_metadata(NULL, metadata, numMetadata) + 8 + dataChunkSize + ma_dr_wav__chunk_padding_size_riff(dataChunkSize);\n    if (chunkSize > 0xFFFFFFFFUL) {\n        chunkSize = 0xFFFFFFFFUL;\n    }\n    return chunkSize;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav__data_chunk_size_rf64(ma_uint64 dataChunkSize)\n{\n    return dataChunkSize;\n}\nMA_PRIVATE ma_bool32 ma_dr_wav_preinit_write(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_bool32 isSequential, ma_dr_wav_write_proc onWrite, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pWav == NULL || onWrite == NULL) {\n        return MA_FALSE;\n    }\n    if (!isSequential && onSeek == NULL) {\n        return MA_FALSE;\n    }\n    if (pFormat->format == MA_DR_WAVE_FORMAT_EXTENSIBLE) {\n        return MA_FALSE;\n    }\n    if (pFormat->format == MA_DR_WAVE_FORMAT_ADPCM || pFormat->format == MA_DR_WAVE_FORMAT_DVI_ADPCM) {\n        return MA_FALSE;\n    }\n    MA_DR_WAV_ZERO_MEMORY(pWav, sizeof(*pWav));\n    pWav->onWrite   = onWrite;\n    pWav->onSeek    = onSeek;\n    pWav->pUserData = pUserData;\n    pWav->allocationCallbacks = ma_dr_wav_copy_allocation_callbacks_or_defaults(pAllocationCallbacks);\n    if (pWav->allocationCallbacks.onFree == NULL || (pWav->allocationCallbacks.onMalloc == NULL && pWav->allocationCallbacks.onRealloc == NULL)) {\n        return MA_FALSE;\n    }\n    pWav->fmt.formatTag = (ma_uint16)pFormat->format;\n    pWav->fmt.channels = (ma_uint16)pFormat->channels;\n    pWav->fmt.sampleRate = pFormat->sampleRate;\n    pWav->fmt.avgBytesPerSec = (ma_uint32)((pFormat->bitsPerSample * pFormat->sampleRate * pFormat->channels) / 8);\n    pWav->fmt.blockAlign = (ma_uint16)((pFormat->channels * pFormat->bitsPerSample) / 8);\n    pWav->fmt.bitsPerSample = (ma_uint16)pFormat->bitsPerSample;\n    pWav->fmt.extendedSize = 0;\n    pWav->isSequentialWrite = isSequential;\n    return MA_TRUE;\n}\nMA_PRIVATE ma_bool32 ma_dr_wav_init_write__internal(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount)\n{\n    size_t runningPos = 0;\n    ma_uint64 initialDataChunkSize = 0;\n    ma_uint64 chunkSizeFMT;\n    if (pWav->isSequentialWrite) {\n        initialDataChunkSize = (totalSampleCount * pWav->fmt.bitsPerSample) / 8;\n        if (pFormat->container == ma_dr_wav_container_riff) {\n            if (initialDataChunkSize > (0xFFFFFFFFUL - 36)) {\n                return MA_FALSE;\n            }\n        }\n    }\n    pWav->dataChunkDataSizeTargetWrite = initialDataChunkSize;\n    if (pFormat->container == ma_dr_wav_container_riff) {\n        ma_uint32 chunkSizeRIFF = 28 + (ma_uint32)initialDataChunkSize;\n        runningPos += ma_dr_wav__write(pWav, \"RIFF\", 4);\n        runningPos += ma_dr_wav__write_u32ne_to_le(pWav, chunkSizeRIFF);\n        runningPos += ma_dr_wav__write(pWav, \"WAVE\", 4);\n    } else if (pFormat->container == ma_dr_wav_container_w64) {\n        ma_uint64 chunkSizeRIFF = 80 + 24 + initialDataChunkSize;\n        runningPos += ma_dr_wav__write(pWav, ma_dr_wavGUID_W64_RIFF, 16);\n        runningPos += ma_dr_wav__write_u64ne_to_le(pWav, chunkSizeRIFF);\n        runningPos += ma_dr_wav__write(pWav, ma_dr_wavGUID_W64_WAVE, 16);\n    } else if (pFormat->container == ma_dr_wav_container_rf64) {\n        runningPos += ma_dr_wav__write(pWav, \"RF64\", 4);\n        runningPos += ma_dr_wav__write_u32ne_to_le(pWav, 0xFFFFFFFF);\n        runningPos += ma_dr_wav__write(pWav, \"WAVE\", 4);\n    } else {\n        return MA_FALSE;\n    }\n    if (pFormat->container == ma_dr_wav_container_rf64) {\n        ma_uint32 initialds64ChunkSize = 28;\n        ma_uint64 initialRiffChunkSize = 8 + initialds64ChunkSize + initialDataChunkSize;\n        runningPos += ma_dr_wav__write(pWav, \"ds64\", 4);\n        runningPos += ma_dr_wav__write_u32ne_to_le(pWav, initialds64ChunkSize);\n        runningPos += ma_dr_wav__write_u64ne_to_le(pWav, initialRiffChunkSize);\n        runningPos += ma_dr_wav__write_u64ne_to_le(pWav, initialDataChunkSize);\n        runningPos += ma_dr_wav__write_u64ne_to_le(pWav, totalSampleCount);\n        runningPos += ma_dr_wav__write_u32ne_to_le(pWav, 0);\n    }\n    if (pFormat->container == ma_dr_wav_container_riff || pFormat->container == ma_dr_wav_container_rf64) {\n        chunkSizeFMT = 16;\n        runningPos += ma_dr_wav__write(pWav, \"fmt \", 4);\n        runningPos += ma_dr_wav__write_u32ne_to_le(pWav, (ma_uint32)chunkSizeFMT);\n    } else if (pFormat->container == ma_dr_wav_container_w64) {\n        chunkSizeFMT = 40;\n        runningPos += ma_dr_wav__write(pWav, ma_dr_wavGUID_W64_FMT, 16);\n        runningPos += ma_dr_wav__write_u64ne_to_le(pWav, chunkSizeFMT);\n    }\n    runningPos += ma_dr_wav__write_u16ne_to_le(pWav, pWav->fmt.formatTag);\n    runningPos += ma_dr_wav__write_u16ne_to_le(pWav, pWav->fmt.channels);\n    runningPos += ma_dr_wav__write_u32ne_to_le(pWav, pWav->fmt.sampleRate);\n    runningPos += ma_dr_wav__write_u32ne_to_le(pWav, pWav->fmt.avgBytesPerSec);\n    runningPos += ma_dr_wav__write_u16ne_to_le(pWav, pWav->fmt.blockAlign);\n    runningPos += ma_dr_wav__write_u16ne_to_le(pWav, pWav->fmt.bitsPerSample);\n    if (!pWav->isSequentialWrite && pWav->pMetadata != NULL && pWav->metadataCount > 0 && (pFormat->container == ma_dr_wav_container_riff || pFormat->container == ma_dr_wav_container_rf64)) {\n        runningPos += ma_dr_wav__write_or_count_metadata(pWav, pWav->pMetadata, pWav->metadataCount);\n    }\n    pWav->dataChunkDataPos = runningPos;\n    if (pFormat->container == ma_dr_wav_container_riff) {\n        ma_uint32 chunkSizeDATA = (ma_uint32)initialDataChunkSize;\n        runningPos += ma_dr_wav__write(pWav, \"data\", 4);\n        runningPos += ma_dr_wav__write_u32ne_to_le(pWav, chunkSizeDATA);\n    } else if (pFormat->container == ma_dr_wav_container_w64) {\n        ma_uint64 chunkSizeDATA = 24 + initialDataChunkSize;\n        runningPos += ma_dr_wav__write(pWav, ma_dr_wavGUID_W64_DATA, 16);\n        runningPos += ma_dr_wav__write_u64ne_to_le(pWav, chunkSizeDATA);\n    } else if (pFormat->container == ma_dr_wav_container_rf64) {\n        runningPos += ma_dr_wav__write(pWav, \"data\", 4);\n        runningPos += ma_dr_wav__write_u32ne_to_le(pWav, 0xFFFFFFFF);\n    }\n    pWav->container = pFormat->container;\n    pWav->channels = (ma_uint16)pFormat->channels;\n    pWav->sampleRate = pFormat->sampleRate;\n    pWav->bitsPerSample = (ma_uint16)pFormat->bitsPerSample;\n    pWav->translatedFormatTag = (ma_uint16)pFormat->format;\n    pWav->dataChunkDataPos = runningPos;\n    return MA_TRUE;\n}\nMA_API ma_bool32 ma_dr_wav_init_write(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_dr_wav_write_proc onWrite, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (!ma_dr_wav_preinit_write(pWav, pFormat, MA_FALSE, onWrite, onSeek, pUserData, pAllocationCallbacks)) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init_write__internal(pWav, pFormat, 0);\n}\nMA_API ma_bool32 ma_dr_wav_init_write_sequential(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, ma_dr_wav_write_proc onWrite, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (!ma_dr_wav_preinit_write(pWav, pFormat, MA_TRUE, onWrite, NULL, pUserData, pAllocationCallbacks)) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init_write__internal(pWav, pFormat, totalSampleCount);\n}\nMA_API ma_bool32 ma_dr_wav_init_write_sequential_pcm_frames(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, ma_dr_wav_write_proc onWrite, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pFormat == NULL) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init_write_sequential(pWav, pFormat, totalPCMFrameCount*pFormat->channels, onWrite, pUserData, pAllocationCallbacks);\n}\nMA_API ma_bool32 ma_dr_wav_init_write_with_metadata(ma_dr_wav* pWav, const ma_dr_wav_data_format* pFormat, ma_dr_wav_write_proc onWrite, ma_dr_wav_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks, ma_dr_wav_metadata* pMetadata, ma_uint32 metadataCount)\n{\n    if (!ma_dr_wav_preinit_write(pWav, pFormat, MA_FALSE, onWrite, onSeek, pUserData, pAllocationCallbacks)) {\n        return MA_FALSE;\n    }\n    pWav->pMetadata     = pMetadata;\n    pWav->metadataCount = metadataCount;\n    return ma_dr_wav_init_write__internal(pWav, pFormat, 0);\n}\nMA_API ma_uint64 ma_dr_wav_target_write_size_bytes(const ma_dr_wav_data_format* pFormat, ma_uint64 totalFrameCount, ma_dr_wav_metadata* pMetadata, ma_uint32 metadataCount)\n{\n    ma_uint64 targetDataSizeBytes = (ma_uint64)((ma_int64)totalFrameCount * pFormat->channels * pFormat->bitsPerSample/8.0);\n    ma_uint64 riffChunkSizeBytes;\n    ma_uint64 fileSizeBytes = 0;\n    if (pFormat->container == ma_dr_wav_container_riff) {\n        riffChunkSizeBytes = ma_dr_wav__riff_chunk_size_riff(targetDataSizeBytes, pMetadata, metadataCount);\n        fileSizeBytes = (8 + riffChunkSizeBytes);\n    } else if (pFormat->container == ma_dr_wav_container_w64) {\n        riffChunkSizeBytes = ma_dr_wav__riff_chunk_size_w64(targetDataSizeBytes);\n        fileSizeBytes = riffChunkSizeBytes;\n    } else if (pFormat->container == ma_dr_wav_container_rf64) {\n        riffChunkSizeBytes = ma_dr_wav__riff_chunk_size_rf64(targetDataSizeBytes, pMetadata, metadataCount);\n        fileSizeBytes = (8 + riffChunkSizeBytes);\n    }\n    return fileSizeBytes;\n}\n#ifndef MA_DR_WAV_NO_STDIO\nMA_PRIVATE size_t ma_dr_wav__on_read_stdio(void* pUserData, void* pBufferOut, size_t bytesToRead)\n{\n    return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData);\n}\nMA_PRIVATE size_t ma_dr_wav__on_write_stdio(void* pUserData, const void* pData, size_t bytesToWrite)\n{\n    return fwrite(pData, 1, bytesToWrite, (FILE*)pUserData);\n}\nMA_PRIVATE ma_bool32 ma_dr_wav__on_seek_stdio(void* pUserData, int offset, ma_dr_wav_seek_origin origin)\n{\n    return fseek((FILE*)pUserData, offset, (origin == ma_dr_wav_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0;\n}\nMA_API ma_bool32 ma_dr_wav_init_file(ma_dr_wav* pWav, const char* filename, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_wav_init_file_ex(pWav, filename, NULL, NULL, 0, pAllocationCallbacks);\n}\nMA_PRIVATE ma_bool32 ma_dr_wav_init_file__internal_FILE(ma_dr_wav* pWav, FILE* pFile, ma_dr_wav_chunk_proc onChunk, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_bool32 result;\n    result = ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_stdio, ma_dr_wav__on_seek_stdio, (void*)pFile, pAllocationCallbacks);\n    if (result != MA_TRUE) {\n        fclose(pFile);\n        return result;\n    }\n    result = ma_dr_wav_init__internal(pWav, onChunk, pChunkUserData, flags);\n    if (result != MA_TRUE) {\n        fclose(pFile);\n        return result;\n    }\n    return MA_TRUE;\n}\nMA_API ma_bool32 ma_dr_wav_init_file_ex(ma_dr_wav* pWav, const char* filename, ma_dr_wav_chunk_proc onChunk, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    FILE* pFile;\n    if (ma_fopen(&pFile, filename, \"rb\") != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init_file__internal_FILE(pWav, pFile, onChunk, pChunkUserData, flags, pAllocationCallbacks);\n}\n#ifndef MA_DR_WAV_NO_WCHAR\nMA_API ma_bool32 ma_dr_wav_init_file_w(ma_dr_wav* pWav, const wchar_t* filename, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_wav_init_file_ex_w(pWav, filename, NULL, NULL, 0, pAllocationCallbacks);\n}\nMA_API ma_bool32 ma_dr_wav_init_file_ex_w(ma_dr_wav* pWav, const wchar_t* filename, ma_dr_wav_chunk_proc onChunk, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    FILE* pFile;\n    if (ma_wfopen(&pFile, filename, L\"rb\", pAllocationCallbacks) != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init_file__internal_FILE(pWav, pFile, onChunk, pChunkUserData, flags, pAllocationCallbacks);\n}\n#endif\nMA_API ma_bool32 ma_dr_wav_init_file_with_metadata(ma_dr_wav* pWav, const char* filename, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    FILE* pFile;\n    if (ma_fopen(&pFile, filename, \"rb\") != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init_file__internal_FILE(pWav, pFile, NULL, NULL, flags | MA_DR_WAV_WITH_METADATA, pAllocationCallbacks);\n}\n#ifndef MA_DR_WAV_NO_WCHAR\nMA_API ma_bool32 ma_dr_wav_init_file_with_metadata_w(ma_dr_wav* pWav, const wchar_t* filename, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    FILE* pFile;\n    if (ma_wfopen(&pFile, filename, L\"rb\", pAllocationCallbacks) != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init_file__internal_FILE(pWav, pFile, NULL, NULL, flags | MA_DR_WAV_WITH_METADATA, pAllocationCallbacks);\n}\n#endif\nMA_PRIVATE ma_bool32 ma_dr_wav_init_file_write__internal_FILE(ma_dr_wav* pWav, FILE* pFile, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, ma_bool32 isSequential, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_bool32 result;\n    result = ma_dr_wav_preinit_write(pWav, pFormat, isSequential, ma_dr_wav__on_write_stdio, ma_dr_wav__on_seek_stdio, (void*)pFile, pAllocationCallbacks);\n    if (result != MA_TRUE) {\n        fclose(pFile);\n        return result;\n    }\n    result = ma_dr_wav_init_write__internal(pWav, pFormat, totalSampleCount);\n    if (result != MA_TRUE) {\n        fclose(pFile);\n        return result;\n    }\n    return MA_TRUE;\n}\nMA_PRIVATE ma_bool32 ma_dr_wav_init_file_write__internal(ma_dr_wav* pWav, const char* filename, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, ma_bool32 isSequential, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    FILE* pFile;\n    if (ma_fopen(&pFile, filename, \"wb\") != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init_file_write__internal_FILE(pWav, pFile, pFormat, totalSampleCount, isSequential, pAllocationCallbacks);\n}\n#ifndef MA_DR_WAV_NO_WCHAR\nMA_PRIVATE ma_bool32 ma_dr_wav_init_file_write_w__internal(ma_dr_wav* pWav, const wchar_t* filename, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, ma_bool32 isSequential, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    FILE* pFile;\n    if (ma_wfopen(&pFile, filename, L\"wb\", pAllocationCallbacks) != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init_file_write__internal_FILE(pWav, pFile, pFormat, totalSampleCount, isSequential, pAllocationCallbacks);\n}\n#endif\nMA_API ma_bool32 ma_dr_wav_init_file_write(ma_dr_wav* pWav, const char* filename, const ma_dr_wav_data_format* pFormat, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_wav_init_file_write__internal(pWav, filename, pFormat, 0, MA_FALSE, pAllocationCallbacks);\n}\nMA_API ma_bool32 ma_dr_wav_init_file_write_sequential(ma_dr_wav* pWav, const char* filename, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_wav_init_file_write__internal(pWav, filename, pFormat, totalSampleCount, MA_TRUE, pAllocationCallbacks);\n}\nMA_API ma_bool32 ma_dr_wav_init_file_write_sequential_pcm_frames(ma_dr_wav* pWav, const char* filename, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pFormat == NULL) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init_file_write_sequential(pWav, filename, pFormat, totalPCMFrameCount*pFormat->channels, pAllocationCallbacks);\n}\n#ifndef MA_DR_WAV_NO_WCHAR\nMA_API ma_bool32 ma_dr_wav_init_file_write_w(ma_dr_wav* pWav, const wchar_t* filename, const ma_dr_wav_data_format* pFormat, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_wav_init_file_write_w__internal(pWav, filename, pFormat, 0, MA_FALSE, pAllocationCallbacks);\n}\nMA_API ma_bool32 ma_dr_wav_init_file_write_sequential_w(ma_dr_wav* pWav, const wchar_t* filename, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_wav_init_file_write_w__internal(pWav, filename, pFormat, totalSampleCount, MA_TRUE, pAllocationCallbacks);\n}\nMA_API ma_bool32 ma_dr_wav_init_file_write_sequential_pcm_frames_w(ma_dr_wav* pWav, const wchar_t* filename, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pFormat == NULL) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init_file_write_sequential_w(pWav, filename, pFormat, totalPCMFrameCount*pFormat->channels, pAllocationCallbacks);\n}\n#endif\n#endif\nMA_PRIVATE size_t ma_dr_wav__on_read_memory(void* pUserData, void* pBufferOut, size_t bytesToRead)\n{\n    ma_dr_wav* pWav = (ma_dr_wav*)pUserData;\n    size_t bytesRemaining;\n    MA_DR_WAV_ASSERT(pWav != NULL);\n    MA_DR_WAV_ASSERT(pWav->memoryStream.dataSize >= pWav->memoryStream.currentReadPos);\n    bytesRemaining = pWav->memoryStream.dataSize - pWav->memoryStream.currentReadPos;\n    if (bytesToRead > bytesRemaining) {\n        bytesToRead = bytesRemaining;\n    }\n    if (bytesToRead > 0) {\n        MA_DR_WAV_COPY_MEMORY(pBufferOut, pWav->memoryStream.data + pWav->memoryStream.currentReadPos, bytesToRead);\n        pWav->memoryStream.currentReadPos += bytesToRead;\n    }\n    return bytesToRead;\n}\nMA_PRIVATE ma_bool32 ma_dr_wav__on_seek_memory(void* pUserData, int offset, ma_dr_wav_seek_origin origin)\n{\n    ma_dr_wav* pWav = (ma_dr_wav*)pUserData;\n    MA_DR_WAV_ASSERT(pWav != NULL);\n    if (origin == ma_dr_wav_seek_origin_current) {\n        if (offset > 0) {\n            if (pWav->memoryStream.currentReadPos + offset > pWav->memoryStream.dataSize) {\n                return MA_FALSE;\n            }\n        } else {\n            if (pWav->memoryStream.currentReadPos < (size_t)-offset) {\n                return MA_FALSE;\n            }\n        }\n        pWav->memoryStream.currentReadPos += offset;\n    } else {\n        if ((ma_uint32)offset <= pWav->memoryStream.dataSize) {\n            pWav->memoryStream.currentReadPos = offset;\n        } else {\n            return MA_FALSE;\n        }\n    }\n    return MA_TRUE;\n}\nMA_PRIVATE size_t ma_dr_wav__on_write_memory(void* pUserData, const void* pDataIn, size_t bytesToWrite)\n{\n    ma_dr_wav* pWav = (ma_dr_wav*)pUserData;\n    size_t bytesRemaining;\n    MA_DR_WAV_ASSERT(pWav != NULL);\n    MA_DR_WAV_ASSERT(pWav->memoryStreamWrite.dataCapacity >= pWav->memoryStreamWrite.currentWritePos);\n    bytesRemaining = pWav->memoryStreamWrite.dataCapacity - pWav->memoryStreamWrite.currentWritePos;\n    if (bytesRemaining < bytesToWrite) {\n        void* pNewData;\n        size_t newDataCapacity = (pWav->memoryStreamWrite.dataCapacity == 0) ? 256 : pWav->memoryStreamWrite.dataCapacity * 2;\n        if ((newDataCapacity - pWav->memoryStreamWrite.currentWritePos) < bytesToWrite) {\n            newDataCapacity = pWav->memoryStreamWrite.currentWritePos + bytesToWrite;\n        }\n        pNewData = ma_dr_wav__realloc_from_callbacks(*pWav->memoryStreamWrite.ppData, newDataCapacity, pWav->memoryStreamWrite.dataCapacity, &pWav->allocationCallbacks);\n        if (pNewData == NULL) {\n            return 0;\n        }\n        *pWav->memoryStreamWrite.ppData = pNewData;\n        pWav->memoryStreamWrite.dataCapacity = newDataCapacity;\n    }\n    MA_DR_WAV_COPY_MEMORY(((ma_uint8*)(*pWav->memoryStreamWrite.ppData)) + pWav->memoryStreamWrite.currentWritePos, pDataIn, bytesToWrite);\n    pWav->memoryStreamWrite.currentWritePos += bytesToWrite;\n    if (pWav->memoryStreamWrite.dataSize < pWav->memoryStreamWrite.currentWritePos) {\n        pWav->memoryStreamWrite.dataSize = pWav->memoryStreamWrite.currentWritePos;\n    }\n    *pWav->memoryStreamWrite.pDataSize = pWav->memoryStreamWrite.dataSize;\n    return bytesToWrite;\n}\nMA_PRIVATE ma_bool32 ma_dr_wav__on_seek_memory_write(void* pUserData, int offset, ma_dr_wav_seek_origin origin)\n{\n    ma_dr_wav* pWav = (ma_dr_wav*)pUserData;\n    MA_DR_WAV_ASSERT(pWav != NULL);\n    if (origin == ma_dr_wav_seek_origin_current) {\n        if (offset > 0) {\n            if (pWav->memoryStreamWrite.currentWritePos + offset > pWav->memoryStreamWrite.dataSize) {\n                offset = (int)(pWav->memoryStreamWrite.dataSize - pWav->memoryStreamWrite.currentWritePos);\n            }\n        } else {\n            if (pWav->memoryStreamWrite.currentWritePos < (size_t)-offset) {\n                offset = -(int)pWav->memoryStreamWrite.currentWritePos;\n            }\n        }\n        pWav->memoryStreamWrite.currentWritePos += offset;\n    } else {\n        if ((ma_uint32)offset <= pWav->memoryStreamWrite.dataSize) {\n            pWav->memoryStreamWrite.currentWritePos = offset;\n        } else {\n            pWav->memoryStreamWrite.currentWritePos = pWav->memoryStreamWrite.dataSize;\n        }\n    }\n    return MA_TRUE;\n}\nMA_API ma_bool32 ma_dr_wav_init_memory(ma_dr_wav* pWav, const void* data, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_wav_init_memory_ex(pWav, data, dataSize, NULL, NULL, 0, pAllocationCallbacks);\n}\nMA_API ma_bool32 ma_dr_wav_init_memory_ex(ma_dr_wav* pWav, const void* data, size_t dataSize, ma_dr_wav_chunk_proc onChunk, void* pChunkUserData, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (data == NULL || dataSize == 0) {\n        return MA_FALSE;\n    }\n    if (!ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_memory, ma_dr_wav__on_seek_memory, pWav, pAllocationCallbacks)) {\n        return MA_FALSE;\n    }\n    pWav->memoryStream.data = (const ma_uint8*)data;\n    pWav->memoryStream.dataSize = dataSize;\n    pWav->memoryStream.currentReadPos = 0;\n    return ma_dr_wav_init__internal(pWav, onChunk, pChunkUserData, flags);\n}\nMA_API ma_bool32 ma_dr_wav_init_memory_with_metadata(ma_dr_wav* pWav, const void* data, size_t dataSize, ma_uint32 flags, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (data == NULL || dataSize == 0) {\n        return MA_FALSE;\n    }\n    if (!ma_dr_wav_preinit(pWav, ma_dr_wav__on_read_memory, ma_dr_wav__on_seek_memory, pWav, pAllocationCallbacks)) {\n        return MA_FALSE;\n    }\n    pWav->memoryStream.data = (const ma_uint8*)data;\n    pWav->memoryStream.dataSize = dataSize;\n    pWav->memoryStream.currentReadPos = 0;\n    return ma_dr_wav_init__internal(pWav, NULL, NULL, flags | MA_DR_WAV_WITH_METADATA);\n}\nMA_PRIVATE ma_bool32 ma_dr_wav_init_memory_write__internal(ma_dr_wav* pWav, void** ppData, size_t* pDataSize, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, ma_bool32 isSequential, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (ppData == NULL || pDataSize == NULL) {\n        return MA_FALSE;\n    }\n    *ppData = NULL;\n    *pDataSize = 0;\n    if (!ma_dr_wav_preinit_write(pWav, pFormat, isSequential, ma_dr_wav__on_write_memory, ma_dr_wav__on_seek_memory_write, pWav, pAllocationCallbacks)) {\n        return MA_FALSE;\n    }\n    pWav->memoryStreamWrite.ppData = ppData;\n    pWav->memoryStreamWrite.pDataSize = pDataSize;\n    pWav->memoryStreamWrite.dataSize = 0;\n    pWav->memoryStreamWrite.dataCapacity = 0;\n    pWav->memoryStreamWrite.currentWritePos = 0;\n    return ma_dr_wav_init_write__internal(pWav, pFormat, totalSampleCount);\n}\nMA_API ma_bool32 ma_dr_wav_init_memory_write(ma_dr_wav* pWav, void** ppData, size_t* pDataSize, const ma_dr_wav_data_format* pFormat, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_wav_init_memory_write__internal(pWav, ppData, pDataSize, pFormat, 0, MA_FALSE, pAllocationCallbacks);\n}\nMA_API ma_bool32 ma_dr_wav_init_memory_write_sequential(ma_dr_wav* pWav, void** ppData, size_t* pDataSize, const ma_dr_wav_data_format* pFormat, ma_uint64 totalSampleCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_wav_init_memory_write__internal(pWav, ppData, pDataSize, pFormat, totalSampleCount, MA_TRUE, pAllocationCallbacks);\n}\nMA_API ma_bool32 ma_dr_wav_init_memory_write_sequential_pcm_frames(ma_dr_wav* pWav, void** ppData, size_t* pDataSize, const ma_dr_wav_data_format* pFormat, ma_uint64 totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pFormat == NULL) {\n        return MA_FALSE;\n    }\n    return ma_dr_wav_init_memory_write_sequential(pWav, ppData, pDataSize, pFormat, totalPCMFrameCount*pFormat->channels, pAllocationCallbacks);\n}\nMA_API ma_result ma_dr_wav_uninit(ma_dr_wav* pWav)\n{\n    ma_result result = MA_SUCCESS;\n    if (pWav == NULL) {\n        return MA_INVALID_ARGS;\n    }\n    if (pWav->onWrite != NULL) {\n        ma_uint32 paddingSize = 0;\n        if (pWav->container == ma_dr_wav_container_riff || pWav->container == ma_dr_wav_container_rf64) {\n            paddingSize = ma_dr_wav__chunk_padding_size_riff(pWav->dataChunkDataSize);\n        } else {\n            paddingSize = ma_dr_wav__chunk_padding_size_w64(pWav->dataChunkDataSize);\n        }\n        if (paddingSize > 0) {\n            ma_uint64 paddingData = 0;\n            ma_dr_wav__write(pWav, &paddingData, paddingSize);\n        }\n        if (pWav->onSeek && !pWav->isSequentialWrite) {\n            if (pWav->container == ma_dr_wav_container_riff) {\n                if (pWav->onSeek(pWav->pUserData, 4, ma_dr_wav_seek_origin_start)) {\n                    ma_uint32 riffChunkSize = ma_dr_wav__riff_chunk_size_riff(pWav->dataChunkDataSize, pWav->pMetadata, pWav->metadataCount);\n                    ma_dr_wav__write_u32ne_to_le(pWav, riffChunkSize);\n                }\n                if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos - 4, ma_dr_wav_seek_origin_start)) {\n                    ma_uint32 dataChunkSize = ma_dr_wav__data_chunk_size_riff(pWav->dataChunkDataSize);\n                    ma_dr_wav__write_u32ne_to_le(pWav, dataChunkSize);\n                }\n            } else if (pWav->container == ma_dr_wav_container_w64) {\n                if (pWav->onSeek(pWav->pUserData, 16, ma_dr_wav_seek_origin_start)) {\n                    ma_uint64 riffChunkSize = ma_dr_wav__riff_chunk_size_w64(pWav->dataChunkDataSize);\n                    ma_dr_wav__write_u64ne_to_le(pWav, riffChunkSize);\n                }\n                if (pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos - 8, ma_dr_wav_seek_origin_start)) {\n                    ma_uint64 dataChunkSize = ma_dr_wav__data_chunk_size_w64(pWav->dataChunkDataSize);\n                    ma_dr_wav__write_u64ne_to_le(pWav, dataChunkSize);\n                }\n            } else if (pWav->container == ma_dr_wav_container_rf64) {\n                int ds64BodyPos = 12 + 8;\n                if (pWav->onSeek(pWav->pUserData, ds64BodyPos + 0, ma_dr_wav_seek_origin_start)) {\n                    ma_uint64 riffChunkSize = ma_dr_wav__riff_chunk_size_rf64(pWav->dataChunkDataSize, pWav->pMetadata, pWav->metadataCount);\n                    ma_dr_wav__write_u64ne_to_le(pWav, riffChunkSize);\n                }\n                if (pWav->onSeek(pWav->pUserData, ds64BodyPos + 8, ma_dr_wav_seek_origin_start)) {\n                    ma_uint64 dataChunkSize = ma_dr_wav__data_chunk_size_rf64(pWav->dataChunkDataSize);\n                    ma_dr_wav__write_u64ne_to_le(pWav, dataChunkSize);\n                }\n            }\n        }\n        if (pWav->isSequentialWrite) {\n            if (pWav->dataChunkDataSize != pWav->dataChunkDataSizeTargetWrite) {\n                result = MA_INVALID_FILE;\n            }\n        }\n    } else {\n        ma_dr_wav_free(pWav->pMetadata, &pWav->allocationCallbacks);\n    }\n#ifndef MA_DR_WAV_NO_STDIO\n    if (pWav->onRead == ma_dr_wav__on_read_stdio || pWav->onWrite == ma_dr_wav__on_write_stdio) {\n        fclose((FILE*)pWav->pUserData);\n    }\n#endif\n    return result;\n}\nMA_API size_t ma_dr_wav_read_raw(ma_dr_wav* pWav, size_t bytesToRead, void* pBufferOut)\n{\n    size_t bytesRead;\n    ma_uint32 bytesPerFrame;\n    if (pWav == NULL || bytesToRead == 0) {\n        return 0;\n    }\n    if (bytesToRead > pWav->bytesRemaining) {\n        bytesToRead = (size_t)pWav->bytesRemaining;\n    }\n    if (bytesToRead == 0) {\n        return 0;\n    }\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    if (pBufferOut != NULL) {\n        bytesRead = pWav->onRead(pWav->pUserData, pBufferOut, bytesToRead);\n    } else {\n        bytesRead = 0;\n        while (bytesRead < bytesToRead) {\n            size_t bytesToSeek = (bytesToRead - bytesRead);\n            if (bytesToSeek > 0x7FFFFFFF) {\n                bytesToSeek = 0x7FFFFFFF;\n            }\n            if (pWav->onSeek(pWav->pUserData, (int)bytesToSeek, ma_dr_wav_seek_origin_current) == MA_FALSE) {\n                break;\n            }\n            bytesRead += bytesToSeek;\n        }\n        while (bytesRead < bytesToRead) {\n            ma_uint8 buffer[4096];\n            size_t bytesSeeked;\n            size_t bytesToSeek = (bytesToRead - bytesRead);\n            if (bytesToSeek > sizeof(buffer)) {\n                bytesToSeek = sizeof(buffer);\n            }\n            bytesSeeked = pWav->onRead(pWav->pUserData, buffer, bytesToSeek);\n            bytesRead += bytesSeeked;\n            if (bytesSeeked < bytesToSeek) {\n                break;\n            }\n        }\n    }\n    pWav->readCursorInPCMFrames += bytesRead / bytesPerFrame;\n    pWav->bytesRemaining -= bytesRead;\n    return bytesRead;\n}\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_le(ma_dr_wav* pWav, ma_uint64 framesToRead, void* pBufferOut)\n{\n    ma_uint32 bytesPerFrame;\n    ma_uint64 bytesToRead;\n    ma_uint64 framesRemainingInFile;\n    if (pWav == NULL || framesToRead == 0) {\n        return 0;\n    }\n    if (ma_dr_wav__is_compressed_format_tag(pWav->translatedFormatTag)) {\n        return 0;\n    }\n    framesRemainingInFile = pWav->totalPCMFrameCount - pWav->readCursorInPCMFrames;\n    if (framesToRead > framesRemainingInFile) {\n        framesToRead = framesRemainingInFile;\n    }\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    bytesToRead = framesToRead * bytesPerFrame;\n    if (bytesToRead > MA_SIZE_MAX) {\n        bytesToRead = (MA_SIZE_MAX / bytesPerFrame) * bytesPerFrame;\n    }\n    if (bytesToRead == 0) {\n        return 0;\n    }\n    return ma_dr_wav_read_raw(pWav, (size_t)bytesToRead, pBufferOut) / bytesPerFrame;\n}\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_be(ma_dr_wav* pWav, ma_uint64 framesToRead, void* pBufferOut)\n{\n    ma_uint64 framesRead = ma_dr_wav_read_pcm_frames_le(pWav, framesToRead, pBufferOut);\n    if (pBufferOut != NULL) {\n        ma_uint32 bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n        if (bytesPerFrame == 0) {\n            return 0;\n        }\n        ma_dr_wav__bswap_samples(pBufferOut, framesRead*pWav->channels, bytesPerFrame/pWav->channels);\n    }\n    return framesRead;\n}\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames(ma_dr_wav* pWav, ma_uint64 framesToRead, void* pBufferOut)\n{\n    ma_uint64 framesRead = 0;\n    if (ma_dr_wav_is_container_be(pWav->container)) {\n        if (pWav->container != ma_dr_wav_container_aiff || pWav->aiff.isLE == MA_FALSE) {\n            if (ma_dr_wav__is_little_endian()) {\n                framesRead = ma_dr_wav_read_pcm_frames_be(pWav, framesToRead, pBufferOut);\n            } else {\n                framesRead = ma_dr_wav_read_pcm_frames_le(pWav, framesToRead, pBufferOut);\n            }\n            goto post_process;\n        }\n    }\n    if (ma_dr_wav__is_little_endian()) {\n        framesRead = ma_dr_wav_read_pcm_frames_le(pWav, framesToRead, pBufferOut);\n    } else {\n        framesRead = ma_dr_wav_read_pcm_frames_be(pWav, framesToRead, pBufferOut);\n    }\n    post_process:\n    {\n        if (pWav->container == ma_dr_wav_container_aiff && pWav->bitsPerSample == 8 && pWav->aiff.isUnsigned == MA_FALSE) {\n            if (pBufferOut != NULL) {\n                ma_uint64 iSample;\n                for (iSample = 0; iSample < framesRead * pWav->channels; iSample += 1) {\n                    ((ma_uint8*)pBufferOut)[iSample] += 128;\n                }\n            }\n        }\n    }\n    return framesRead;\n}\nMA_PRIVATE ma_bool32 ma_dr_wav_seek_to_first_pcm_frame(ma_dr_wav* pWav)\n{\n    if (pWav->onWrite != NULL) {\n        return MA_FALSE;\n    }\n    if (!pWav->onSeek(pWav->pUserData, (int)pWav->dataChunkDataPos, ma_dr_wav_seek_origin_start)) {\n        return MA_FALSE;\n    }\n    if (ma_dr_wav__is_compressed_format_tag(pWav->translatedFormatTag)) {\n        if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_ADPCM) {\n            MA_DR_WAV_ZERO_OBJECT(&pWav->msadpcm);\n        } else if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_DVI_ADPCM) {\n            MA_DR_WAV_ZERO_OBJECT(&pWav->ima);\n        } else {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n        }\n    }\n    pWav->readCursorInPCMFrames = 0;\n    pWav->bytesRemaining = pWav->dataChunkDataSize;\n    return MA_TRUE;\n}\nMA_API ma_bool32 ma_dr_wav_seek_to_pcm_frame(ma_dr_wav* pWav, ma_uint64 targetFrameIndex)\n{\n    if (pWav == NULL || pWav->onSeek == NULL) {\n        return MA_FALSE;\n    }\n    if (pWav->onWrite != NULL) {\n        return MA_FALSE;\n    }\n    if (pWav->totalPCMFrameCount == 0) {\n        return MA_TRUE;\n    }\n    if (targetFrameIndex > pWav->totalPCMFrameCount) {\n        targetFrameIndex = pWav->totalPCMFrameCount;\n    }\n    if (ma_dr_wav__is_compressed_format_tag(pWav->translatedFormatTag)) {\n        if (targetFrameIndex < pWav->readCursorInPCMFrames) {\n            if (!ma_dr_wav_seek_to_first_pcm_frame(pWav)) {\n                return MA_FALSE;\n            }\n        }\n        if (targetFrameIndex > pWav->readCursorInPCMFrames) {\n            ma_uint64 offsetInFrames = targetFrameIndex - pWav->readCursorInPCMFrames;\n            ma_int16 devnull[2048];\n            while (offsetInFrames > 0) {\n                ma_uint64 framesRead = 0;\n                ma_uint64 framesToRead = offsetInFrames;\n                if (framesToRead > ma_dr_wav_countof(devnull)/pWav->channels) {\n                    framesToRead = ma_dr_wav_countof(devnull)/pWav->channels;\n                }\n                if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_ADPCM) {\n                    framesRead = ma_dr_wav_read_pcm_frames_s16__msadpcm(pWav, framesToRead, devnull);\n                } else if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_DVI_ADPCM) {\n                    framesRead = ma_dr_wav_read_pcm_frames_s16__ima(pWav, framesToRead, devnull);\n                } else {\n                    MA_DR_WAV_ASSERT(MA_FALSE);\n                }\n                if (framesRead != framesToRead) {\n                    return MA_FALSE;\n                }\n                offsetInFrames -= framesRead;\n            }\n        }\n    } else {\n        ma_uint64 totalSizeInBytes;\n        ma_uint64 currentBytePos;\n        ma_uint64 targetBytePos;\n        ma_uint64 offset;\n        ma_uint32 bytesPerFrame;\n        bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n        if (bytesPerFrame == 0) {\n            return MA_FALSE;\n        }\n        totalSizeInBytes = pWav->totalPCMFrameCount * bytesPerFrame;\n        currentBytePos = totalSizeInBytes - pWav->bytesRemaining;\n        targetBytePos  = targetFrameIndex * bytesPerFrame;\n        if (currentBytePos < targetBytePos) {\n            offset = (targetBytePos - currentBytePos);\n        } else {\n            if (!ma_dr_wav_seek_to_first_pcm_frame(pWav)) {\n                return MA_FALSE;\n            }\n            offset = targetBytePos;\n        }\n        while (offset > 0) {\n            int offset32 = ((offset > INT_MAX) ? INT_MAX : (int)offset);\n            if (!pWav->onSeek(pWav->pUserData, offset32, ma_dr_wav_seek_origin_current)) {\n                return MA_FALSE;\n            }\n            pWav->readCursorInPCMFrames += offset32 / bytesPerFrame;\n            pWav->bytesRemaining        -= offset32;\n            offset                      -= offset32;\n        }\n    }\n    return MA_TRUE;\n}\nMA_API ma_result ma_dr_wav_get_cursor_in_pcm_frames(ma_dr_wav* pWav, ma_uint64* pCursor)\n{\n    if (pCursor == NULL) {\n        return MA_INVALID_ARGS;\n    }\n    *pCursor = 0;\n    if (pWav == NULL) {\n        return MA_INVALID_ARGS;\n    }\n    *pCursor = pWav->readCursorInPCMFrames;\n    return MA_SUCCESS;\n}\nMA_API ma_result ma_dr_wav_get_length_in_pcm_frames(ma_dr_wav* pWav, ma_uint64* pLength)\n{\n    if (pLength == NULL) {\n        return MA_INVALID_ARGS;\n    }\n    *pLength = 0;\n    if (pWav == NULL) {\n        return MA_INVALID_ARGS;\n    }\n    *pLength = pWav->totalPCMFrameCount;\n    return MA_SUCCESS;\n}\nMA_API size_t ma_dr_wav_write_raw(ma_dr_wav* pWav, size_t bytesToWrite, const void* pData)\n{\n    size_t bytesWritten;\n    if (pWav == NULL || bytesToWrite == 0 || pData == NULL) {\n        return 0;\n    }\n    bytesWritten = pWav->onWrite(pWav->pUserData, pData, bytesToWrite);\n    pWav->dataChunkDataSize += bytesWritten;\n    return bytesWritten;\n}\nMA_API ma_uint64 ma_dr_wav_write_pcm_frames_le(ma_dr_wav* pWav, ma_uint64 framesToWrite, const void* pData)\n{\n    ma_uint64 bytesToWrite;\n    ma_uint64 bytesWritten;\n    const ma_uint8* pRunningData;\n    if (pWav == NULL || framesToWrite == 0 || pData == NULL) {\n        return 0;\n    }\n    bytesToWrite = ((framesToWrite * pWav->channels * pWav->bitsPerSample) / 8);\n    if (bytesToWrite > MA_SIZE_MAX) {\n        return 0;\n    }\n    bytesWritten = 0;\n    pRunningData = (const ma_uint8*)pData;\n    while (bytesToWrite > 0) {\n        size_t bytesJustWritten;\n        ma_uint64 bytesToWriteThisIteration;\n        bytesToWriteThisIteration = bytesToWrite;\n        MA_DR_WAV_ASSERT(bytesToWriteThisIteration <= MA_SIZE_MAX);\n        bytesJustWritten = ma_dr_wav_write_raw(pWav, (size_t)bytesToWriteThisIteration, pRunningData);\n        if (bytesJustWritten == 0) {\n            break;\n        }\n        bytesToWrite -= bytesJustWritten;\n        bytesWritten += bytesJustWritten;\n        pRunningData += bytesJustWritten;\n    }\n    return (bytesWritten * 8) / pWav->bitsPerSample / pWav->channels;\n}\nMA_API ma_uint64 ma_dr_wav_write_pcm_frames_be(ma_dr_wav* pWav, ma_uint64 framesToWrite, const void* pData)\n{\n    ma_uint64 bytesToWrite;\n    ma_uint64 bytesWritten;\n    ma_uint32 bytesPerSample;\n    const ma_uint8* pRunningData;\n    if (pWav == NULL || framesToWrite == 0 || pData == NULL) {\n        return 0;\n    }\n    bytesToWrite = ((framesToWrite * pWav->channels * pWav->bitsPerSample) / 8);\n    if (bytesToWrite > MA_SIZE_MAX) {\n        return 0;\n    }\n    bytesWritten = 0;\n    pRunningData = (const ma_uint8*)pData;\n    bytesPerSample = ma_dr_wav_get_bytes_per_pcm_frame(pWav) / pWav->channels;\n    if (bytesPerSample == 0) {\n        return 0;\n    }\n    while (bytesToWrite > 0) {\n        ma_uint8 temp[4096];\n        ma_uint32 sampleCount;\n        size_t bytesJustWritten;\n        ma_uint64 bytesToWriteThisIteration;\n        bytesToWriteThisIteration = bytesToWrite;\n        MA_DR_WAV_ASSERT(bytesToWriteThisIteration <= MA_SIZE_MAX);\n        sampleCount = sizeof(temp)/bytesPerSample;\n        if (bytesToWriteThisIteration > ((ma_uint64)sampleCount)*bytesPerSample) {\n            bytesToWriteThisIteration = ((ma_uint64)sampleCount)*bytesPerSample;\n        }\n        MA_DR_WAV_COPY_MEMORY(temp, pRunningData, (size_t)bytesToWriteThisIteration);\n        ma_dr_wav__bswap_samples(temp, sampleCount, bytesPerSample);\n        bytesJustWritten = ma_dr_wav_write_raw(pWav, (size_t)bytesToWriteThisIteration, temp);\n        if (bytesJustWritten == 0) {\n            break;\n        }\n        bytesToWrite -= bytesJustWritten;\n        bytesWritten += bytesJustWritten;\n        pRunningData += bytesJustWritten;\n    }\n    return (bytesWritten * 8) / pWav->bitsPerSample / pWav->channels;\n}\nMA_API ma_uint64 ma_dr_wav_write_pcm_frames(ma_dr_wav* pWav, ma_uint64 framesToWrite, const void* pData)\n{\n    if (ma_dr_wav__is_little_endian()) {\n        return ma_dr_wav_write_pcm_frames_le(pWav, framesToWrite, pData);\n    } else {\n        return ma_dr_wav_write_pcm_frames_be(pWav, framesToWrite, pData);\n    }\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__msadpcm(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int16* pBufferOut)\n{\n    ma_uint64 totalFramesRead = 0;\n    MA_DR_WAV_ASSERT(pWav != NULL);\n    MA_DR_WAV_ASSERT(framesToRead > 0);\n    while (pWav->readCursorInPCMFrames < pWav->totalPCMFrameCount) {\n        MA_DR_WAV_ASSERT(framesToRead > 0);\n        if (pWav->msadpcm.cachedFrameCount == 0 && pWav->msadpcm.bytesRemainingInBlock == 0) {\n            if (pWav->channels == 1) {\n                ma_uint8 header[7];\n                if (pWav->onRead(pWav->pUserData, header, sizeof(header)) != sizeof(header)) {\n                    return totalFramesRead;\n                }\n                pWav->msadpcm.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header);\n                pWav->msadpcm.predictor[0]     = header[0];\n                pWav->msadpcm.delta[0]         = ma_dr_wav_bytes_to_s16(header + 1);\n                pWav->msadpcm.prevFrames[0][1] = (ma_int32)ma_dr_wav_bytes_to_s16(header + 3);\n                pWav->msadpcm.prevFrames[0][0] = (ma_int32)ma_dr_wav_bytes_to_s16(header + 5);\n                pWav->msadpcm.cachedFrames[2]  = pWav->msadpcm.prevFrames[0][0];\n                pWav->msadpcm.cachedFrames[3]  = pWav->msadpcm.prevFrames[0][1];\n                pWav->msadpcm.cachedFrameCount = 2;\n            } else {\n                ma_uint8 header[14];\n                if (pWav->onRead(pWav->pUserData, header, sizeof(header)) != sizeof(header)) {\n                    return totalFramesRead;\n                }\n                pWav->msadpcm.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header);\n                pWav->msadpcm.predictor[0] = header[0];\n                pWav->msadpcm.predictor[1] = header[1];\n                pWav->msadpcm.delta[0] = ma_dr_wav_bytes_to_s16(header + 2);\n                pWav->msadpcm.delta[1] = ma_dr_wav_bytes_to_s16(header + 4);\n                pWav->msadpcm.prevFrames[0][1] = (ma_int32)ma_dr_wav_bytes_to_s16(header + 6);\n                pWav->msadpcm.prevFrames[1][1] = (ma_int32)ma_dr_wav_bytes_to_s16(header + 8);\n                pWav->msadpcm.prevFrames[0][0] = (ma_int32)ma_dr_wav_bytes_to_s16(header + 10);\n                pWav->msadpcm.prevFrames[1][0] = (ma_int32)ma_dr_wav_bytes_to_s16(header + 12);\n                pWav->msadpcm.cachedFrames[0] = pWav->msadpcm.prevFrames[0][0];\n                pWav->msadpcm.cachedFrames[1] = pWav->msadpcm.prevFrames[1][0];\n                pWav->msadpcm.cachedFrames[2] = pWav->msadpcm.prevFrames[0][1];\n                pWav->msadpcm.cachedFrames[3] = pWav->msadpcm.prevFrames[1][1];\n                pWav->msadpcm.cachedFrameCount = 2;\n            }\n        }\n        while (framesToRead > 0 && pWav->msadpcm.cachedFrameCount > 0 && pWav->readCursorInPCMFrames < pWav->totalPCMFrameCount) {\n            if (pBufferOut != NULL) {\n                ma_uint32 iSample = 0;\n                for (iSample = 0; iSample < pWav->channels; iSample += 1) {\n                    pBufferOut[iSample] = (ma_int16)pWav->msadpcm.cachedFrames[(ma_dr_wav_countof(pWav->msadpcm.cachedFrames) - (pWav->msadpcm.cachedFrameCount*pWav->channels)) + iSample];\n                }\n                pBufferOut += pWav->channels;\n            }\n            framesToRead    -= 1;\n            totalFramesRead += 1;\n            pWav->readCursorInPCMFrames += 1;\n            pWav->msadpcm.cachedFrameCount -= 1;\n        }\n        if (framesToRead == 0) {\n            break;\n        }\n        if (pWav->msadpcm.cachedFrameCount == 0) {\n            if (pWav->msadpcm.bytesRemainingInBlock == 0) {\n                continue;\n            } else {\n                static ma_int32 adaptationTable[] = {\n                    230, 230, 230, 230, 307, 409, 512, 614,\n                    768, 614, 512, 409, 307, 230, 230, 230\n                };\n                static ma_int32 coeff1Table[] = { 256, 512, 0, 192, 240, 460,  392 };\n                static ma_int32 coeff2Table[] = { 0,  -256, 0, 64,  0,  -208, -232 };\n                ma_uint8 nibbles;\n                ma_int32 nibble0;\n                ma_int32 nibble1;\n                if (pWav->onRead(pWav->pUserData, &nibbles, 1) != 1) {\n                    return totalFramesRead;\n                }\n                pWav->msadpcm.bytesRemainingInBlock -= 1;\n                nibble0 = ((nibbles & 0xF0) >> 4); if ((nibbles & 0x80)) { nibble0 |= 0xFFFFFFF0UL; }\n                nibble1 = ((nibbles & 0x0F) >> 0); if ((nibbles & 0x08)) { nibble1 |= 0xFFFFFFF0UL; }\n                if (pWav->channels == 1) {\n                    ma_int32 newSample0;\n                    ma_int32 newSample1;\n                    newSample0  = ((pWav->msadpcm.prevFrames[0][1] * coeff1Table[pWav->msadpcm.predictor[0]]) + (pWav->msadpcm.prevFrames[0][0] * coeff2Table[pWav->msadpcm.predictor[0]])) >> 8;\n                    newSample0 += nibble0 * pWav->msadpcm.delta[0];\n                    newSample0  = ma_dr_wav_clamp(newSample0, -32768, 32767);\n                    pWav->msadpcm.delta[0] = (adaptationTable[((nibbles & 0xF0) >> 4)] * pWav->msadpcm.delta[0]) >> 8;\n                    if (pWav->msadpcm.delta[0] < 16) {\n                        pWav->msadpcm.delta[0] = 16;\n                    }\n                    pWav->msadpcm.prevFrames[0][0] = pWav->msadpcm.prevFrames[0][1];\n                    pWav->msadpcm.prevFrames[0][1] = newSample0;\n                    newSample1  = ((pWav->msadpcm.prevFrames[0][1] * coeff1Table[pWav->msadpcm.predictor[0]]) + (pWav->msadpcm.prevFrames[0][0] * coeff2Table[pWav->msadpcm.predictor[0]])) >> 8;\n                    newSample1 += nibble1 * pWav->msadpcm.delta[0];\n                    newSample1  = ma_dr_wav_clamp(newSample1, -32768, 32767);\n                    pWav->msadpcm.delta[0] = (adaptationTable[((nibbles & 0x0F) >> 0)] * pWav->msadpcm.delta[0]) >> 8;\n                    if (pWav->msadpcm.delta[0] < 16) {\n                        pWav->msadpcm.delta[0] = 16;\n                    }\n                    pWav->msadpcm.prevFrames[0][0] = pWav->msadpcm.prevFrames[0][1];\n                    pWav->msadpcm.prevFrames[0][1] = newSample1;\n                    pWav->msadpcm.cachedFrames[2] = newSample0;\n                    pWav->msadpcm.cachedFrames[3] = newSample1;\n                    pWav->msadpcm.cachedFrameCount = 2;\n                } else {\n                    ma_int32 newSample0;\n                    ma_int32 newSample1;\n                    newSample0  = ((pWav->msadpcm.prevFrames[0][1] * coeff1Table[pWav->msadpcm.predictor[0]]) + (pWav->msadpcm.prevFrames[0][0] * coeff2Table[pWav->msadpcm.predictor[0]])) >> 8;\n                    newSample0 += nibble0 * pWav->msadpcm.delta[0];\n                    newSample0  = ma_dr_wav_clamp(newSample0, -32768, 32767);\n                    pWav->msadpcm.delta[0] = (adaptationTable[((nibbles & 0xF0) >> 4)] * pWav->msadpcm.delta[0]) >> 8;\n                    if (pWav->msadpcm.delta[0] < 16) {\n                        pWav->msadpcm.delta[0] = 16;\n                    }\n                    pWav->msadpcm.prevFrames[0][0] = pWav->msadpcm.prevFrames[0][1];\n                    pWav->msadpcm.prevFrames[0][1] = newSample0;\n                    newSample1  = ((pWav->msadpcm.prevFrames[1][1] * coeff1Table[pWav->msadpcm.predictor[1]]) + (pWav->msadpcm.prevFrames[1][0] * coeff2Table[pWav->msadpcm.predictor[1]])) >> 8;\n                    newSample1 += nibble1 * pWav->msadpcm.delta[1];\n                    newSample1  = ma_dr_wav_clamp(newSample1, -32768, 32767);\n                    pWav->msadpcm.delta[1] = (adaptationTable[((nibbles & 0x0F) >> 0)] * pWav->msadpcm.delta[1]) >> 8;\n                    if (pWav->msadpcm.delta[1] < 16) {\n                        pWav->msadpcm.delta[1] = 16;\n                    }\n                    pWav->msadpcm.prevFrames[1][0] = pWav->msadpcm.prevFrames[1][1];\n                    pWav->msadpcm.prevFrames[1][1] = newSample1;\n                    pWav->msadpcm.cachedFrames[2] = newSample0;\n                    pWav->msadpcm.cachedFrames[3] = newSample1;\n                    pWav->msadpcm.cachedFrameCount = 1;\n                }\n            }\n        }\n    }\n    return totalFramesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__ima(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int16* pBufferOut)\n{\n    ma_uint64 totalFramesRead = 0;\n    ma_uint32 iChannel;\n    static ma_int32 indexTable[16] = {\n        -1, -1, -1, -1, 2, 4, 6, 8,\n        -1, -1, -1, -1, 2, 4, 6, 8\n    };\n    static ma_int32 stepTable[89] = {\n        7,     8,     9,     10,    11,    12,    13,    14,    16,    17,\n        19,    21,    23,    25,    28,    31,    34,    37,    41,    45,\n        50,    55,    60,    66,    73,    80,    88,    97,    107,   118,\n        130,   143,   157,   173,   190,   209,   230,   253,   279,   307,\n        337,   371,   408,   449,   494,   544,   598,   658,   724,   796,\n        876,   963,   1060,  1166,  1282,  1411,  1552,  1707,  1878,  2066,\n        2272,  2499,  2749,  3024,  3327,  3660,  4026,  4428,  4871,  5358,\n        5894,  6484,  7132,  7845,  8630,  9493,  10442, 11487, 12635, 13899,\n        15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767\n    };\n    MA_DR_WAV_ASSERT(pWav != NULL);\n    MA_DR_WAV_ASSERT(framesToRead > 0);\n    while (pWav->readCursorInPCMFrames < pWav->totalPCMFrameCount) {\n        MA_DR_WAV_ASSERT(framesToRead > 0);\n        if (pWav->ima.cachedFrameCount == 0 && pWav->ima.bytesRemainingInBlock == 0) {\n            if (pWav->channels == 1) {\n                ma_uint8 header[4];\n                if (pWav->onRead(pWav->pUserData, header, sizeof(header)) != sizeof(header)) {\n                    return totalFramesRead;\n                }\n                pWav->ima.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header);\n                if (header[2] >= ma_dr_wav_countof(stepTable)) {\n                    pWav->onSeek(pWav->pUserData, pWav->ima.bytesRemainingInBlock, ma_dr_wav_seek_origin_current);\n                    pWav->ima.bytesRemainingInBlock = 0;\n                    return totalFramesRead;\n                }\n                pWav->ima.predictor[0] = (ma_int16)ma_dr_wav_bytes_to_u16(header + 0);\n                pWav->ima.stepIndex[0] = ma_dr_wav_clamp(header[2], 0, (ma_int32)ma_dr_wav_countof(stepTable)-1);\n                pWav->ima.cachedFrames[ma_dr_wav_countof(pWav->ima.cachedFrames) - 1] = pWav->ima.predictor[0];\n                pWav->ima.cachedFrameCount = 1;\n            } else {\n                ma_uint8 header[8];\n                if (pWav->onRead(pWav->pUserData, header, sizeof(header)) != sizeof(header)) {\n                    return totalFramesRead;\n                }\n                pWav->ima.bytesRemainingInBlock = pWav->fmt.blockAlign - sizeof(header);\n                if (header[2] >= ma_dr_wav_countof(stepTable) || header[6] >= ma_dr_wav_countof(stepTable)) {\n                    pWav->onSeek(pWav->pUserData, pWav->ima.bytesRemainingInBlock, ma_dr_wav_seek_origin_current);\n                    pWav->ima.bytesRemainingInBlock = 0;\n                    return totalFramesRead;\n                }\n                pWav->ima.predictor[0] = ma_dr_wav_bytes_to_s16(header + 0);\n                pWav->ima.stepIndex[0] = ma_dr_wav_clamp(header[2], 0, (ma_int32)ma_dr_wav_countof(stepTable)-1);\n                pWav->ima.predictor[1] = ma_dr_wav_bytes_to_s16(header + 4);\n                pWav->ima.stepIndex[1] = ma_dr_wav_clamp(header[6], 0, (ma_int32)ma_dr_wav_countof(stepTable)-1);\n                pWav->ima.cachedFrames[ma_dr_wav_countof(pWav->ima.cachedFrames) - 2] = pWav->ima.predictor[0];\n                pWav->ima.cachedFrames[ma_dr_wav_countof(pWav->ima.cachedFrames) - 1] = pWav->ima.predictor[1];\n                pWav->ima.cachedFrameCount = 1;\n            }\n        }\n        while (framesToRead > 0 && pWav->ima.cachedFrameCount > 0 && pWav->readCursorInPCMFrames < pWav->totalPCMFrameCount) {\n            if (pBufferOut != NULL) {\n                ma_uint32 iSample;\n                for (iSample = 0; iSample < pWav->channels; iSample += 1) {\n                    pBufferOut[iSample] = (ma_int16)pWav->ima.cachedFrames[(ma_dr_wav_countof(pWav->ima.cachedFrames) - (pWav->ima.cachedFrameCount*pWav->channels)) + iSample];\n                }\n                pBufferOut += pWav->channels;\n            }\n            framesToRead    -= 1;\n            totalFramesRead += 1;\n            pWav->readCursorInPCMFrames += 1;\n            pWav->ima.cachedFrameCount -= 1;\n        }\n        if (framesToRead == 0) {\n            break;\n        }\n        if (pWav->ima.cachedFrameCount == 0) {\n            if (pWav->ima.bytesRemainingInBlock == 0) {\n                continue;\n            } else {\n                pWav->ima.cachedFrameCount = 8;\n                for (iChannel = 0; iChannel < pWav->channels; ++iChannel) {\n                    ma_uint32 iByte;\n                    ma_uint8 nibbles[4];\n                    if (pWav->onRead(pWav->pUserData, &nibbles, 4) != 4) {\n                        pWav->ima.cachedFrameCount = 0;\n                        return totalFramesRead;\n                    }\n                    pWav->ima.bytesRemainingInBlock -= 4;\n                    for (iByte = 0; iByte < 4; ++iByte) {\n                        ma_uint8 nibble0 = ((nibbles[iByte] & 0x0F) >> 0);\n                        ma_uint8 nibble1 = ((nibbles[iByte] & 0xF0) >> 4);\n                        ma_int32 step      = stepTable[pWav->ima.stepIndex[iChannel]];\n                        ma_int32 predictor = pWav->ima.predictor[iChannel];\n                        ma_int32      diff  = step >> 3;\n                        if (nibble0 & 1) diff += step >> 2;\n                        if (nibble0 & 2) diff += step >> 1;\n                        if (nibble0 & 4) diff += step;\n                        if (nibble0 & 8) diff  = -diff;\n                        predictor = ma_dr_wav_clamp(predictor + diff, -32768, 32767);\n                        pWav->ima.predictor[iChannel] = predictor;\n                        pWav->ima.stepIndex[iChannel] = ma_dr_wav_clamp(pWav->ima.stepIndex[iChannel] + indexTable[nibble0], 0, (ma_int32)ma_dr_wav_countof(stepTable)-1);\n                        pWav->ima.cachedFrames[(ma_dr_wav_countof(pWav->ima.cachedFrames) - (pWav->ima.cachedFrameCount*pWav->channels)) + (iByte*2+0)*pWav->channels + iChannel] = predictor;\n                        step      = stepTable[pWav->ima.stepIndex[iChannel]];\n                        predictor = pWav->ima.predictor[iChannel];\n                                         diff  = step >> 3;\n                        if (nibble1 & 1) diff += step >> 2;\n                        if (nibble1 & 2) diff += step >> 1;\n                        if (nibble1 & 4) diff += step;\n                        if (nibble1 & 8) diff  = -diff;\n                        predictor = ma_dr_wav_clamp(predictor + diff, -32768, 32767);\n                        pWav->ima.predictor[iChannel] = predictor;\n                        pWav->ima.stepIndex[iChannel] = ma_dr_wav_clamp(pWav->ima.stepIndex[iChannel] + indexTable[nibble1], 0, (ma_int32)ma_dr_wav_countof(stepTable)-1);\n                        pWav->ima.cachedFrames[(ma_dr_wav_countof(pWav->ima.cachedFrames) - (pWav->ima.cachedFrameCount*pWav->channels)) + (iByte*2+1)*pWav->channels + iChannel] = predictor;\n                    }\n                }\n            }\n        }\n    }\n    return totalFramesRead;\n}\n#ifndef MA_DR_WAV_NO_CONVERSION_API\nstatic unsigned short g_ma_dr_wavAlawTable[256] = {\n    0xEA80, 0xEB80, 0xE880, 0xE980, 0xEE80, 0xEF80, 0xEC80, 0xED80, 0xE280, 0xE380, 0xE080, 0xE180, 0xE680, 0xE780, 0xE480, 0xE580,\n    0xF540, 0xF5C0, 0xF440, 0xF4C0, 0xF740, 0xF7C0, 0xF640, 0xF6C0, 0xF140, 0xF1C0, 0xF040, 0xF0C0, 0xF340, 0xF3C0, 0xF240, 0xF2C0,\n    0xAA00, 0xAE00, 0xA200, 0xA600, 0xBA00, 0xBE00, 0xB200, 0xB600, 0x8A00, 0x8E00, 0x8200, 0x8600, 0x9A00, 0x9E00, 0x9200, 0x9600,\n    0xD500, 0xD700, 0xD100, 0xD300, 0xDD00, 0xDF00, 0xD900, 0xDB00, 0xC500, 0xC700, 0xC100, 0xC300, 0xCD00, 0xCF00, 0xC900, 0xCB00,\n    0xFEA8, 0xFEB8, 0xFE88, 0xFE98, 0xFEE8, 0xFEF8, 0xFEC8, 0xFED8, 0xFE28, 0xFE38, 0xFE08, 0xFE18, 0xFE68, 0xFE78, 0xFE48, 0xFE58,\n    0xFFA8, 0xFFB8, 0xFF88, 0xFF98, 0xFFE8, 0xFFF8, 0xFFC8, 0xFFD8, 0xFF28, 0xFF38, 0xFF08, 0xFF18, 0xFF68, 0xFF78, 0xFF48, 0xFF58,\n    0xFAA0, 0xFAE0, 0xFA20, 0xFA60, 0xFBA0, 0xFBE0, 0xFB20, 0xFB60, 0xF8A0, 0xF8E0, 0xF820, 0xF860, 0xF9A0, 0xF9E0, 0xF920, 0xF960,\n    0xFD50, 0xFD70, 0xFD10, 0xFD30, 0xFDD0, 0xFDF0, 0xFD90, 0xFDB0, 0xFC50, 0xFC70, 0xFC10, 0xFC30, 0xFCD0, 0xFCF0, 0xFC90, 0xFCB0,\n    0x1580, 0x1480, 0x1780, 0x1680, 0x1180, 0x1080, 0x1380, 0x1280, 0x1D80, 0x1C80, 0x1F80, 0x1E80, 0x1980, 0x1880, 0x1B80, 0x1A80,\n    0x0AC0, 0x0A40, 0x0BC0, 0x0B40, 0x08C0, 0x0840, 0x09C0, 0x0940, 0x0EC0, 0x0E40, 0x0FC0, 0x0F40, 0x0CC0, 0x0C40, 0x0DC0, 0x0D40,\n    0x5600, 0x5200, 0x5E00, 0x5A00, 0x4600, 0x4200, 0x4E00, 0x4A00, 0x7600, 0x7200, 0x7E00, 0x7A00, 0x6600, 0x6200, 0x6E00, 0x6A00,\n    0x2B00, 0x2900, 0x2F00, 0x2D00, 0x2300, 0x2100, 0x2700, 0x2500, 0x3B00, 0x3900, 0x3F00, 0x3D00, 0x3300, 0x3100, 0x3700, 0x3500,\n    0x0158, 0x0148, 0x0178, 0x0168, 0x0118, 0x0108, 0x0138, 0x0128, 0x01D8, 0x01C8, 0x01F8, 0x01E8, 0x0198, 0x0188, 0x01B8, 0x01A8,\n    0x0058, 0x0048, 0x0078, 0x0068, 0x0018, 0x0008, 0x0038, 0x0028, 0x00D8, 0x00C8, 0x00F8, 0x00E8, 0x0098, 0x0088, 0x00B8, 0x00A8,\n    0x0560, 0x0520, 0x05E0, 0x05A0, 0x0460, 0x0420, 0x04E0, 0x04A0, 0x0760, 0x0720, 0x07E0, 0x07A0, 0x0660, 0x0620, 0x06E0, 0x06A0,\n    0x02B0, 0x0290, 0x02F0, 0x02D0, 0x0230, 0x0210, 0x0270, 0x0250, 0x03B0, 0x0390, 0x03F0, 0x03D0, 0x0330, 0x0310, 0x0370, 0x0350\n};\nstatic unsigned short g_ma_dr_wavMulawTable[256] = {\n    0x8284, 0x8684, 0x8A84, 0x8E84, 0x9284, 0x9684, 0x9A84, 0x9E84, 0xA284, 0xA684, 0xAA84, 0xAE84, 0xB284, 0xB684, 0xBA84, 0xBE84,\n    0xC184, 0xC384, 0xC584, 0xC784, 0xC984, 0xCB84, 0xCD84, 0xCF84, 0xD184, 0xD384, 0xD584, 0xD784, 0xD984, 0xDB84, 0xDD84, 0xDF84,\n    0xE104, 0xE204, 0xE304, 0xE404, 0xE504, 0xE604, 0xE704, 0xE804, 0xE904, 0xEA04, 0xEB04, 0xEC04, 0xED04, 0xEE04, 0xEF04, 0xF004,\n    0xF0C4, 0xF144, 0xF1C4, 0xF244, 0xF2C4, 0xF344, 0xF3C4, 0xF444, 0xF4C4, 0xF544, 0xF5C4, 0xF644, 0xF6C4, 0xF744, 0xF7C4, 0xF844,\n    0xF8A4, 0xF8E4, 0xF924, 0xF964, 0xF9A4, 0xF9E4, 0xFA24, 0xFA64, 0xFAA4, 0xFAE4, 0xFB24, 0xFB64, 0xFBA4, 0xFBE4, 0xFC24, 0xFC64,\n    0xFC94, 0xFCB4, 0xFCD4, 0xFCF4, 0xFD14, 0xFD34, 0xFD54, 0xFD74, 0xFD94, 0xFDB4, 0xFDD4, 0xFDF4, 0xFE14, 0xFE34, 0xFE54, 0xFE74,\n    0xFE8C, 0xFE9C, 0xFEAC, 0xFEBC, 0xFECC, 0xFEDC, 0xFEEC, 0xFEFC, 0xFF0C, 0xFF1C, 0xFF2C, 0xFF3C, 0xFF4C, 0xFF5C, 0xFF6C, 0xFF7C,\n    0xFF88, 0xFF90, 0xFF98, 0xFFA0, 0xFFA8, 0xFFB0, 0xFFB8, 0xFFC0, 0xFFC8, 0xFFD0, 0xFFD8, 0xFFE0, 0xFFE8, 0xFFF0, 0xFFF8, 0x0000,\n    0x7D7C, 0x797C, 0x757C, 0x717C, 0x6D7C, 0x697C, 0x657C, 0x617C, 0x5D7C, 0x597C, 0x557C, 0x517C, 0x4D7C, 0x497C, 0x457C, 0x417C,\n    0x3E7C, 0x3C7C, 0x3A7C, 0x387C, 0x367C, 0x347C, 0x327C, 0x307C, 0x2E7C, 0x2C7C, 0x2A7C, 0x287C, 0x267C, 0x247C, 0x227C, 0x207C,\n    0x1EFC, 0x1DFC, 0x1CFC, 0x1BFC, 0x1AFC, 0x19FC, 0x18FC, 0x17FC, 0x16FC, 0x15FC, 0x14FC, 0x13FC, 0x12FC, 0x11FC, 0x10FC, 0x0FFC,\n    0x0F3C, 0x0EBC, 0x0E3C, 0x0DBC, 0x0D3C, 0x0CBC, 0x0C3C, 0x0BBC, 0x0B3C, 0x0ABC, 0x0A3C, 0x09BC, 0x093C, 0x08BC, 0x083C, 0x07BC,\n    0x075C, 0x071C, 0x06DC, 0x069C, 0x065C, 0x061C, 0x05DC, 0x059C, 0x055C, 0x051C, 0x04DC, 0x049C, 0x045C, 0x041C, 0x03DC, 0x039C,\n    0x036C, 0x034C, 0x032C, 0x030C, 0x02EC, 0x02CC, 0x02AC, 0x028C, 0x026C, 0x024C, 0x022C, 0x020C, 0x01EC, 0x01CC, 0x01AC, 0x018C,\n    0x0174, 0x0164, 0x0154, 0x0144, 0x0134, 0x0124, 0x0114, 0x0104, 0x00F4, 0x00E4, 0x00D4, 0x00C4, 0x00B4, 0x00A4, 0x0094, 0x0084,\n    0x0078, 0x0070, 0x0068, 0x0060, 0x0058, 0x0050, 0x0048, 0x0040, 0x0038, 0x0030, 0x0028, 0x0020, 0x0018, 0x0010, 0x0008, 0x0000\n};\nstatic MA_INLINE ma_int16 ma_dr_wav__alaw_to_s16(ma_uint8 sampleIn)\n{\n    return (short)g_ma_dr_wavAlawTable[sampleIn];\n}\nstatic MA_INLINE ma_int16 ma_dr_wav__mulaw_to_s16(ma_uint8 sampleIn)\n{\n    return (short)g_ma_dr_wavMulawTable[sampleIn];\n}\nMA_PRIVATE void ma_dr_wav__pcm_to_s16(ma_int16* pOut, const ma_uint8* pIn, size_t totalSampleCount, unsigned int bytesPerSample)\n{\n    size_t i;\n    if (bytesPerSample == 1) {\n        ma_dr_wav_u8_to_s16(pOut, pIn, totalSampleCount);\n        return;\n    }\n    if (bytesPerSample == 2) {\n        for (i = 0; i < totalSampleCount; ++i) {\n           *pOut++ = ((const ma_int16*)pIn)[i];\n        }\n        return;\n    }\n    if (bytesPerSample == 3) {\n        ma_dr_wav_s24_to_s16(pOut, pIn, totalSampleCount);\n        return;\n    }\n    if (bytesPerSample == 4) {\n        ma_dr_wav_s32_to_s16(pOut, (const ma_int32*)pIn, totalSampleCount);\n        return;\n    }\n    if (bytesPerSample > 8) {\n        MA_DR_WAV_ZERO_MEMORY(pOut, totalSampleCount * sizeof(*pOut));\n        return;\n    }\n    for (i = 0; i < totalSampleCount; ++i) {\n        ma_uint64 sample = 0;\n        unsigned int shift  = (8 - bytesPerSample) * 8;\n        unsigned int j;\n        for (j = 0; j < bytesPerSample; j += 1) {\n            MA_DR_WAV_ASSERT(j < 8);\n            sample |= (ma_uint64)(pIn[j]) << shift;\n            shift  += 8;\n        }\n        pIn += j;\n        *pOut++ = (ma_int16)((ma_int64)sample >> 48);\n    }\n}\nMA_PRIVATE void ma_dr_wav__ieee_to_s16(ma_int16* pOut, const ma_uint8* pIn, size_t totalSampleCount, unsigned int bytesPerSample)\n{\n    if (bytesPerSample == 4) {\n        ma_dr_wav_f32_to_s16(pOut, (const float*)pIn, totalSampleCount);\n        return;\n    } else if (bytesPerSample == 8) {\n        ma_dr_wav_f64_to_s16(pOut, (const double*)pIn, totalSampleCount);\n        return;\n    } else {\n        MA_DR_WAV_ZERO_MEMORY(pOut, totalSampleCount * sizeof(*pOut));\n        return;\n    }\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__pcm(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int16* pBufferOut)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint8 sampleData[4096] = {0};\n    ma_uint32 bytesPerFrame;\n    ma_uint32 bytesPerSample;\n    ma_uint64 samplesRead;\n    if ((pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_PCM && pWav->bitsPerSample == 16) || pBufferOut == NULL) {\n        return ma_dr_wav_read_pcm_frames(pWav, framesToRead, pBufferOut);\n    }\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    bytesPerSample = bytesPerFrame / pWav->channels;\n    if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) {\n        return 0;\n    }\n    totalFramesRead = 0;\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, sizeof(sampleData)/bytesPerFrame);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        samplesRead = framesRead * pWav->channels;\n        if ((samplesRead * bytesPerSample) > sizeof(sampleData)) {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n            break;\n        }\n        ma_dr_wav__pcm_to_s16(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample);\n        pBufferOut      += samplesRead;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__ieee(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int16* pBufferOut)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint8 sampleData[4096] = {0};\n    ma_uint32 bytesPerFrame;\n    ma_uint32 bytesPerSample;\n    ma_uint64 samplesRead;\n    if (pBufferOut == NULL) {\n        return ma_dr_wav_read_pcm_frames(pWav, framesToRead, NULL);\n    }\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    bytesPerSample = bytesPerFrame / pWav->channels;\n    if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) {\n        return 0;\n    }\n    totalFramesRead = 0;\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, sizeof(sampleData)/bytesPerFrame);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        samplesRead = framesRead * pWav->channels;\n        if ((samplesRead * bytesPerSample) > sizeof(sampleData)) {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n            break;\n        }\n        ma_dr_wav__ieee_to_s16(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample);\n        pBufferOut      += samplesRead;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__alaw(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int16* pBufferOut)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint8 sampleData[4096] = {0};\n    ma_uint32 bytesPerFrame;\n    ma_uint32 bytesPerSample;\n    ma_uint64 samplesRead;\n    if (pBufferOut == NULL) {\n        return ma_dr_wav_read_pcm_frames(pWav, framesToRead, NULL);\n    }\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    bytesPerSample = bytesPerFrame / pWav->channels;\n    if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) {\n        return 0;\n    }\n    totalFramesRead = 0;\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, sizeof(sampleData)/bytesPerFrame);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        samplesRead = framesRead * pWav->channels;\n        if ((samplesRead * bytesPerSample) > sizeof(sampleData)) {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n            break;\n        }\n        ma_dr_wav_alaw_to_s16(pBufferOut, sampleData, (size_t)samplesRead);\n        #ifdef MA_DR_WAV_LIBSNDFILE_COMPAT\n        {\n            if (pWav->container == ma_dr_wav_container_aiff) {\n                ma_uint64 iSample;\n                for (iSample = 0; iSample < samplesRead; iSample += 1) {\n                    pBufferOut[iSample] = -pBufferOut[iSample];\n                }\n            }\n        }\n        #endif\n        pBufferOut      += samplesRead;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s16__mulaw(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int16* pBufferOut)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint8 sampleData[4096] = {0};\n    ma_uint32 bytesPerFrame;\n    ma_uint32 bytesPerSample;\n    ma_uint64 samplesRead;\n    if (pBufferOut == NULL) {\n        return ma_dr_wav_read_pcm_frames(pWav, framesToRead, NULL);\n    }\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    bytesPerSample = bytesPerFrame / pWav->channels;\n    if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) {\n        return 0;\n    }\n    totalFramesRead = 0;\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, sizeof(sampleData)/bytesPerFrame);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        samplesRead = framesRead * pWav->channels;\n        if ((samplesRead * bytesPerSample) > sizeof(sampleData)) {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n            break;\n        }\n        ma_dr_wav_mulaw_to_s16(pBufferOut, sampleData, (size_t)samplesRead);\n        #ifdef MA_DR_WAV_LIBSNDFILE_COMPAT\n        {\n            if (pWav->container == ma_dr_wav_container_aiff) {\n                ma_uint64 iSample;\n                for (iSample = 0; iSample < samplesRead; iSample += 1) {\n                    pBufferOut[iSample] = -pBufferOut[iSample];\n                }\n            }\n        }\n        #endif\n        pBufferOut      += samplesRead;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_s16(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int16* pBufferOut)\n{\n    if (pWav == NULL || framesToRead == 0) {\n        return 0;\n    }\n    if (pBufferOut == NULL) {\n        return ma_dr_wav_read_pcm_frames(pWav, framesToRead, NULL);\n    }\n    if (framesToRead * pWav->channels * sizeof(ma_int16) > MA_SIZE_MAX) {\n        framesToRead = MA_SIZE_MAX / sizeof(ma_int16) / pWav->channels;\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_PCM) {\n        return ma_dr_wav_read_pcm_frames_s16__pcm(pWav, framesToRead, pBufferOut);\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_IEEE_FLOAT) {\n        return ma_dr_wav_read_pcm_frames_s16__ieee(pWav, framesToRead, pBufferOut);\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_ALAW) {\n        return ma_dr_wav_read_pcm_frames_s16__alaw(pWav, framesToRead, pBufferOut);\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_MULAW) {\n        return ma_dr_wav_read_pcm_frames_s16__mulaw(pWav, framesToRead, pBufferOut);\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_ADPCM) {\n        return ma_dr_wav_read_pcm_frames_s16__msadpcm(pWav, framesToRead, pBufferOut);\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_DVI_ADPCM) {\n        return ma_dr_wav_read_pcm_frames_s16__ima(pWav, framesToRead, pBufferOut);\n    }\n    return 0;\n}\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_s16le(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int16* pBufferOut)\n{\n    ma_uint64 framesRead = ma_dr_wav_read_pcm_frames_s16(pWav, framesToRead, pBufferOut);\n    if (pBufferOut != NULL && ma_dr_wav__is_little_endian() == MA_FALSE) {\n        ma_dr_wav__bswap_samples_s16(pBufferOut, framesRead*pWav->channels);\n    }\n    return framesRead;\n}\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_s16be(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int16* pBufferOut)\n{\n    ma_uint64 framesRead = ma_dr_wav_read_pcm_frames_s16(pWav, framesToRead, pBufferOut);\n    if (pBufferOut != NULL && ma_dr_wav__is_little_endian() == MA_TRUE) {\n        ma_dr_wav__bswap_samples_s16(pBufferOut, framesRead*pWav->channels);\n    }\n    return framesRead;\n}\nMA_API void ma_dr_wav_u8_to_s16(ma_int16* pOut, const ma_uint8* pIn, size_t sampleCount)\n{\n    int r;\n    size_t i;\n    for (i = 0; i < sampleCount; ++i) {\n        int x = pIn[i];\n        r = x << 8;\n        r = r - 32768;\n        pOut[i] = (short)r;\n    }\n}\nMA_API void ma_dr_wav_s24_to_s16(ma_int16* pOut, const ma_uint8* pIn, size_t sampleCount)\n{\n    int r;\n    size_t i;\n    for (i = 0; i < sampleCount; ++i) {\n        int x = ((int)(((unsigned int)(((const ma_uint8*)pIn)[i*3+0]) << 8) | ((unsigned int)(((const ma_uint8*)pIn)[i*3+1]) << 16) | ((unsigned int)(((const ma_uint8*)pIn)[i*3+2])) << 24)) >> 8;\n        r = x >> 8;\n        pOut[i] = (short)r;\n    }\n}\nMA_API void ma_dr_wav_s32_to_s16(ma_int16* pOut, const ma_int32* pIn, size_t sampleCount)\n{\n    int r;\n    size_t i;\n    for (i = 0; i < sampleCount; ++i) {\n        int x = pIn[i];\n        r = x >> 16;\n        pOut[i] = (short)r;\n    }\n}\nMA_API void ma_dr_wav_f32_to_s16(ma_int16* pOut, const float* pIn, size_t sampleCount)\n{\n    int r;\n    size_t i;\n    for (i = 0; i < sampleCount; ++i) {\n        float x = pIn[i];\n        float c;\n        c = ((x < -1) ? -1 : ((x > 1) ? 1 : x));\n        c = c + 1;\n        r = (int)(c * 32767.5f);\n        r = r - 32768;\n        pOut[i] = (short)r;\n    }\n}\nMA_API void ma_dr_wav_f64_to_s16(ma_int16* pOut, const double* pIn, size_t sampleCount)\n{\n    int r;\n    size_t i;\n    for (i = 0; i < sampleCount; ++i) {\n        double x = pIn[i];\n        double c;\n        c = ((x < -1) ? -1 : ((x > 1) ? 1 : x));\n        c = c + 1;\n        r = (int)(c * 32767.5);\n        r = r - 32768;\n        pOut[i] = (short)r;\n    }\n}\nMA_API void ma_dr_wav_alaw_to_s16(ma_int16* pOut, const ma_uint8* pIn, size_t sampleCount)\n{\n    size_t i;\n    for (i = 0; i < sampleCount; ++i) {\n        pOut[i] = ma_dr_wav__alaw_to_s16(pIn[i]);\n    }\n}\nMA_API void ma_dr_wav_mulaw_to_s16(ma_int16* pOut, const ma_uint8* pIn, size_t sampleCount)\n{\n    size_t i;\n    for (i = 0; i < sampleCount; ++i) {\n        pOut[i] = ma_dr_wav__mulaw_to_s16(pIn[i]);\n    }\n}\nMA_PRIVATE void ma_dr_wav__pcm_to_f32(float* pOut, const ma_uint8* pIn, size_t sampleCount, unsigned int bytesPerSample)\n{\n    unsigned int i;\n    if (bytesPerSample == 1) {\n        ma_dr_wav_u8_to_f32(pOut, pIn, sampleCount);\n        return;\n    }\n    if (bytesPerSample == 2) {\n        ma_dr_wav_s16_to_f32(pOut, (const ma_int16*)pIn, sampleCount);\n        return;\n    }\n    if (bytesPerSample == 3) {\n        ma_dr_wav_s24_to_f32(pOut, pIn, sampleCount);\n        return;\n    }\n    if (bytesPerSample == 4) {\n        ma_dr_wav_s32_to_f32(pOut, (const ma_int32*)pIn, sampleCount);\n        return;\n    }\n    if (bytesPerSample > 8) {\n        MA_DR_WAV_ZERO_MEMORY(pOut, sampleCount * sizeof(*pOut));\n        return;\n    }\n    for (i = 0; i < sampleCount; ++i) {\n        ma_uint64 sample = 0;\n        unsigned int shift  = (8 - bytesPerSample) * 8;\n        unsigned int j;\n        for (j = 0; j < bytesPerSample; j += 1) {\n            MA_DR_WAV_ASSERT(j < 8);\n            sample |= (ma_uint64)(pIn[j]) << shift;\n            shift  += 8;\n        }\n        pIn += j;\n        *pOut++ = (float)((ma_int64)sample / 9223372036854775807.0);\n    }\n}\nMA_PRIVATE void ma_dr_wav__ieee_to_f32(float* pOut, const ma_uint8* pIn, size_t sampleCount, unsigned int bytesPerSample)\n{\n    if (bytesPerSample == 4) {\n        unsigned int i;\n        for (i = 0; i < sampleCount; ++i) {\n            *pOut++ = ((const float*)pIn)[i];\n        }\n        return;\n    } else if (bytesPerSample == 8) {\n        ma_dr_wav_f64_to_f32(pOut, (const double*)pIn, sampleCount);\n        return;\n    } else {\n        MA_DR_WAV_ZERO_MEMORY(pOut, sampleCount * sizeof(*pOut));\n        return;\n    }\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_f32__pcm(ma_dr_wav* pWav, ma_uint64 framesToRead, float* pBufferOut)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint8 sampleData[4096] = {0};\n    ma_uint32 bytesPerFrame;\n    ma_uint32 bytesPerSample;\n    ma_uint64 samplesRead;\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    bytesPerSample = bytesPerFrame / pWav->channels;\n    if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) {\n        return 0;\n    }\n    totalFramesRead = 0;\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, sizeof(sampleData)/bytesPerFrame);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        samplesRead = framesRead * pWav->channels;\n        if ((samplesRead * bytesPerSample) > sizeof(sampleData)) {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n            break;\n        }\n        ma_dr_wav__pcm_to_f32(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample);\n        pBufferOut      += samplesRead;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_f32__msadpcm_ima(ma_dr_wav* pWav, ma_uint64 framesToRead, float* pBufferOut)\n{\n    ma_uint64 totalFramesRead;\n    ma_int16 samples16[2048];\n    totalFramesRead = 0;\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, ma_dr_wav_countof(samples16)/pWav->channels);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames_s16(pWav, framesToReadThisIteration, samples16);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        ma_dr_wav_s16_to_f32(pBufferOut, samples16, (size_t)(framesRead*pWav->channels));\n        pBufferOut      += framesRead*pWav->channels;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_f32__ieee(ma_dr_wav* pWav, ma_uint64 framesToRead, float* pBufferOut)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint8 sampleData[4096] = {0};\n    ma_uint32 bytesPerFrame;\n    ma_uint32 bytesPerSample;\n    ma_uint64 samplesRead;\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_IEEE_FLOAT && pWav->bitsPerSample == 32) {\n        return ma_dr_wav_read_pcm_frames(pWav, framesToRead, pBufferOut);\n    }\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    bytesPerSample = bytesPerFrame / pWav->channels;\n    if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) {\n        return 0;\n    }\n    totalFramesRead = 0;\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, sizeof(sampleData)/bytesPerFrame);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        samplesRead = framesRead * pWav->channels;\n        if ((samplesRead * bytesPerSample) > sizeof(sampleData)) {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n            break;\n        }\n        ma_dr_wav__ieee_to_f32(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample);\n        pBufferOut      += samplesRead;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_f32__alaw(ma_dr_wav* pWav, ma_uint64 framesToRead, float* pBufferOut)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint8 sampleData[4096] = {0};\n    ma_uint32 bytesPerFrame;\n    ma_uint32 bytesPerSample;\n    ma_uint64 samplesRead;\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    bytesPerSample = bytesPerFrame / pWav->channels;\n    if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) {\n        return 0;\n    }\n    totalFramesRead = 0;\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, sizeof(sampleData)/bytesPerFrame);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        samplesRead = framesRead * pWav->channels;\n        if ((samplesRead * bytesPerSample) > sizeof(sampleData)) {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n            break;\n        }\n        ma_dr_wav_alaw_to_f32(pBufferOut, sampleData, (size_t)samplesRead);\n        #ifdef MA_DR_WAV_LIBSNDFILE_COMPAT\n        {\n            if (pWav->container == ma_dr_wav_container_aiff) {\n                ma_uint64 iSample;\n                for (iSample = 0; iSample < samplesRead; iSample += 1) {\n                    pBufferOut[iSample] = -pBufferOut[iSample];\n                }\n            }\n        }\n        #endif\n        pBufferOut      += samplesRead;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_f32__mulaw(ma_dr_wav* pWav, ma_uint64 framesToRead, float* pBufferOut)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint8 sampleData[4096] = {0};\n    ma_uint32 bytesPerFrame;\n    ma_uint32 bytesPerSample;\n    ma_uint64 samplesRead;\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    bytesPerSample = bytesPerFrame / pWav->channels;\n    if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) {\n        return 0;\n    }\n    totalFramesRead = 0;\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, sizeof(sampleData)/bytesPerFrame);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        samplesRead = framesRead * pWav->channels;\n        if ((samplesRead * bytesPerSample) > sizeof(sampleData)) {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n            break;\n        }\n        ma_dr_wav_mulaw_to_f32(pBufferOut, sampleData, (size_t)samplesRead);\n        #ifdef MA_DR_WAV_LIBSNDFILE_COMPAT\n        {\n            if (pWav->container == ma_dr_wav_container_aiff) {\n                ma_uint64 iSample;\n                for (iSample = 0; iSample < samplesRead; iSample += 1) {\n                    pBufferOut[iSample] = -pBufferOut[iSample];\n                }\n            }\n        }\n        #endif\n        pBufferOut      += samplesRead;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_f32(ma_dr_wav* pWav, ma_uint64 framesToRead, float* pBufferOut)\n{\n    if (pWav == NULL || framesToRead == 0) {\n        return 0;\n    }\n    if (pBufferOut == NULL) {\n        return ma_dr_wav_read_pcm_frames(pWav, framesToRead, NULL);\n    }\n    if (framesToRead * pWav->channels * sizeof(float) > MA_SIZE_MAX) {\n        framesToRead = MA_SIZE_MAX / sizeof(float) / pWav->channels;\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_PCM) {\n        return ma_dr_wav_read_pcm_frames_f32__pcm(pWav, framesToRead, pBufferOut);\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_ADPCM || pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_DVI_ADPCM) {\n        return ma_dr_wav_read_pcm_frames_f32__msadpcm_ima(pWav, framesToRead, pBufferOut);\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_IEEE_FLOAT) {\n        return ma_dr_wav_read_pcm_frames_f32__ieee(pWav, framesToRead, pBufferOut);\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_ALAW) {\n        return ma_dr_wav_read_pcm_frames_f32__alaw(pWav, framesToRead, pBufferOut);\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_MULAW) {\n        return ma_dr_wav_read_pcm_frames_f32__mulaw(pWav, framesToRead, pBufferOut);\n    }\n    return 0;\n}\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_f32le(ma_dr_wav* pWav, ma_uint64 framesToRead, float* pBufferOut)\n{\n    ma_uint64 framesRead = ma_dr_wav_read_pcm_frames_f32(pWav, framesToRead, pBufferOut);\n    if (pBufferOut != NULL && ma_dr_wav__is_little_endian() == MA_FALSE) {\n        ma_dr_wav__bswap_samples_f32(pBufferOut, framesRead*pWav->channels);\n    }\n    return framesRead;\n}\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_f32be(ma_dr_wav* pWav, ma_uint64 framesToRead, float* pBufferOut)\n{\n    ma_uint64 framesRead = ma_dr_wav_read_pcm_frames_f32(pWav, framesToRead, pBufferOut);\n    if (pBufferOut != NULL && ma_dr_wav__is_little_endian() == MA_TRUE) {\n        ma_dr_wav__bswap_samples_f32(pBufferOut, framesRead*pWav->channels);\n    }\n    return framesRead;\n}\nMA_API void ma_dr_wav_u8_to_f32(float* pOut, const ma_uint8* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n#ifdef MA_DR_WAV_LIBSNDFILE_COMPAT\n    for (i = 0; i < sampleCount; ++i) {\n        *pOut++ = (pIn[i] / 256.0f) * 2 - 1;\n    }\n#else\n    for (i = 0; i < sampleCount; ++i) {\n        float x = pIn[i];\n        x = x * 0.00784313725490196078f;\n        x = x - 1;\n        *pOut++ = x;\n    }\n#endif\n}\nMA_API void ma_dr_wav_s16_to_f32(float* pOut, const ma_int16* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n    for (i = 0; i < sampleCount; ++i) {\n        *pOut++ = pIn[i] * 0.000030517578125f;\n    }\n}\nMA_API void ma_dr_wav_s24_to_f32(float* pOut, const ma_uint8* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n    for (i = 0; i < sampleCount; ++i) {\n        double x;\n        ma_uint32 a = ((ma_uint32)(pIn[i*3+0]) <<  8);\n        ma_uint32 b = ((ma_uint32)(pIn[i*3+1]) << 16);\n        ma_uint32 c = ((ma_uint32)(pIn[i*3+2]) << 24);\n        x = (double)((ma_int32)(a | b | c) >> 8);\n        *pOut++ = (float)(x * 0.00000011920928955078125);\n    }\n}\nMA_API void ma_dr_wav_s32_to_f32(float* pOut, const ma_int32* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n    for (i = 0; i < sampleCount; ++i) {\n        *pOut++ = (float)(pIn[i] / 2147483648.0);\n    }\n}\nMA_API void ma_dr_wav_f64_to_f32(float* pOut, const double* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n    for (i = 0; i < sampleCount; ++i) {\n        *pOut++ = (float)pIn[i];\n    }\n}\nMA_API void ma_dr_wav_alaw_to_f32(float* pOut, const ma_uint8* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n    for (i = 0; i < sampleCount; ++i) {\n        *pOut++ = ma_dr_wav__alaw_to_s16(pIn[i]) / 32768.0f;\n    }\n}\nMA_API void ma_dr_wav_mulaw_to_f32(float* pOut, const ma_uint8* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n    for (i = 0; i < sampleCount; ++i) {\n        *pOut++ = ma_dr_wav__mulaw_to_s16(pIn[i]) / 32768.0f;\n    }\n}\nMA_PRIVATE void ma_dr_wav__pcm_to_s32(ma_int32* pOut, const ma_uint8* pIn, size_t totalSampleCount, unsigned int bytesPerSample)\n{\n    unsigned int i;\n    if (bytesPerSample == 1) {\n        ma_dr_wav_u8_to_s32(pOut, pIn, totalSampleCount);\n        return;\n    }\n    if (bytesPerSample == 2) {\n        ma_dr_wav_s16_to_s32(pOut, (const ma_int16*)pIn, totalSampleCount);\n        return;\n    }\n    if (bytesPerSample == 3) {\n        ma_dr_wav_s24_to_s32(pOut, pIn, totalSampleCount);\n        return;\n    }\n    if (bytesPerSample == 4) {\n        for (i = 0; i < totalSampleCount; ++i) {\n           *pOut++ = ((const ma_int32*)pIn)[i];\n        }\n        return;\n    }\n    if (bytesPerSample > 8) {\n        MA_DR_WAV_ZERO_MEMORY(pOut, totalSampleCount * sizeof(*pOut));\n        return;\n    }\n    for (i = 0; i < totalSampleCount; ++i) {\n        ma_uint64 sample = 0;\n        unsigned int shift  = (8 - bytesPerSample) * 8;\n        unsigned int j;\n        for (j = 0; j < bytesPerSample; j += 1) {\n            MA_DR_WAV_ASSERT(j < 8);\n            sample |= (ma_uint64)(pIn[j]) << shift;\n            shift  += 8;\n        }\n        pIn += j;\n        *pOut++ = (ma_int32)((ma_int64)sample >> 32);\n    }\n}\nMA_PRIVATE void ma_dr_wav__ieee_to_s32(ma_int32* pOut, const ma_uint8* pIn, size_t totalSampleCount, unsigned int bytesPerSample)\n{\n    if (bytesPerSample == 4) {\n        ma_dr_wav_f32_to_s32(pOut, (const float*)pIn, totalSampleCount);\n        return;\n    } else if (bytesPerSample == 8) {\n        ma_dr_wav_f64_to_s32(pOut, (const double*)pIn, totalSampleCount);\n        return;\n    } else {\n        MA_DR_WAV_ZERO_MEMORY(pOut, totalSampleCount * sizeof(*pOut));\n        return;\n    }\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s32__pcm(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int32* pBufferOut)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint8 sampleData[4096] = {0};\n    ma_uint32 bytesPerFrame;\n    ma_uint32 bytesPerSample;\n    ma_uint64 samplesRead;\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_PCM && pWav->bitsPerSample == 32) {\n        return ma_dr_wav_read_pcm_frames(pWav, framesToRead, pBufferOut);\n    }\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    bytesPerSample = bytesPerFrame / pWav->channels;\n    if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) {\n        return 0;\n    }\n    totalFramesRead = 0;\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, sizeof(sampleData)/bytesPerFrame);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        samplesRead = framesRead * pWav->channels;\n        if ((samplesRead * bytesPerSample) > sizeof(sampleData)) {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n            break;\n        }\n        ma_dr_wav__pcm_to_s32(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample);\n        pBufferOut      += samplesRead;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s32__msadpcm_ima(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int32* pBufferOut)\n{\n    ma_uint64 totalFramesRead = 0;\n    ma_int16 samples16[2048];\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, ma_dr_wav_countof(samples16)/pWav->channels);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames_s16(pWav, framesToReadThisIteration, samples16);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        ma_dr_wav_s16_to_s32(pBufferOut, samples16, (size_t)(framesRead*pWav->channels));\n        pBufferOut      += framesRead*pWav->channels;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s32__ieee(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int32* pBufferOut)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint8 sampleData[4096] = {0};\n    ma_uint32 bytesPerFrame;\n    ma_uint32 bytesPerSample;\n    ma_uint64 samplesRead;\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    bytesPerSample = bytesPerFrame / pWav->channels;\n    if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) {\n        return 0;\n    }\n    totalFramesRead = 0;\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, sizeof(sampleData)/bytesPerFrame);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        samplesRead = framesRead * pWav->channels;\n        if ((samplesRead * bytesPerSample) > sizeof(sampleData)) {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n            break;\n        }\n        ma_dr_wav__ieee_to_s32(pBufferOut, sampleData, (size_t)samplesRead, bytesPerSample);\n        pBufferOut      += samplesRead;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s32__alaw(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int32* pBufferOut)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint8 sampleData[4096] = {0};\n    ma_uint32 bytesPerFrame;\n    ma_uint32 bytesPerSample;\n    ma_uint64 samplesRead;\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    bytesPerSample = bytesPerFrame / pWav->channels;\n    if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) {\n        return 0;\n    }\n    totalFramesRead = 0;\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, sizeof(sampleData)/bytesPerFrame);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        samplesRead = framesRead * pWav->channels;\n        if ((samplesRead * bytesPerSample) > sizeof(sampleData)) {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n            break;\n        }\n        ma_dr_wav_alaw_to_s32(pBufferOut, sampleData, (size_t)samplesRead);\n        #ifdef MA_DR_WAV_LIBSNDFILE_COMPAT\n        {\n            if (pWav->container == ma_dr_wav_container_aiff) {\n                ma_uint64 iSample;\n                for (iSample = 0; iSample < samplesRead; iSample += 1) {\n                    pBufferOut[iSample] = -pBufferOut[iSample];\n                }\n            }\n        }\n        #endif\n        pBufferOut      += samplesRead;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_PRIVATE ma_uint64 ma_dr_wav_read_pcm_frames_s32__mulaw(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int32* pBufferOut)\n{\n    ma_uint64 totalFramesRead;\n    ma_uint8 sampleData[4096] = {0};\n    ma_uint32 bytesPerFrame;\n    ma_uint32 bytesPerSample;\n    ma_uint64 samplesRead;\n    bytesPerFrame = ma_dr_wav_get_bytes_per_pcm_frame(pWav);\n    if (bytesPerFrame == 0) {\n        return 0;\n    }\n    bytesPerSample = bytesPerFrame / pWav->channels;\n    if (bytesPerSample == 0 || (bytesPerFrame % pWav->channels) != 0) {\n        return 0;\n    }\n    totalFramesRead = 0;\n    while (framesToRead > 0) {\n        ma_uint64 framesToReadThisIteration = ma_dr_wav_min(framesToRead, sizeof(sampleData)/bytesPerFrame);\n        ma_uint64 framesRead = ma_dr_wav_read_pcm_frames(pWav, framesToReadThisIteration, sampleData);\n        if (framesRead == 0) {\n            break;\n        }\n        MA_DR_WAV_ASSERT(framesRead <= framesToReadThisIteration);\n        samplesRead = framesRead * pWav->channels;\n        if ((samplesRead * bytesPerSample) > sizeof(sampleData)) {\n            MA_DR_WAV_ASSERT(MA_FALSE);\n            break;\n        }\n        ma_dr_wav_mulaw_to_s32(pBufferOut, sampleData, (size_t)samplesRead);\n        #ifdef MA_DR_WAV_LIBSNDFILE_COMPAT\n        {\n            if (pWav->container == ma_dr_wav_container_aiff) {\n                ma_uint64 iSample;\n                for (iSample = 0; iSample < samplesRead; iSample += 1) {\n                    pBufferOut[iSample] = -pBufferOut[iSample];\n                }\n            }\n        }\n        #endif\n        pBufferOut      += samplesRead;\n        framesToRead    -= framesRead;\n        totalFramesRead += framesRead;\n    }\n    return totalFramesRead;\n}\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_s32(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int32* pBufferOut)\n{\n    if (pWav == NULL || framesToRead == 0) {\n        return 0;\n    }\n    if (pBufferOut == NULL) {\n        return ma_dr_wav_read_pcm_frames(pWav, framesToRead, NULL);\n    }\n    if (framesToRead * pWav->channels * sizeof(ma_int32) > MA_SIZE_MAX) {\n        framesToRead = MA_SIZE_MAX / sizeof(ma_int32) / pWav->channels;\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_PCM) {\n        return ma_dr_wav_read_pcm_frames_s32__pcm(pWav, framesToRead, pBufferOut);\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_ADPCM || pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_DVI_ADPCM) {\n        return ma_dr_wav_read_pcm_frames_s32__msadpcm_ima(pWav, framesToRead, pBufferOut);\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_IEEE_FLOAT) {\n        return ma_dr_wav_read_pcm_frames_s32__ieee(pWav, framesToRead, pBufferOut);\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_ALAW) {\n        return ma_dr_wav_read_pcm_frames_s32__alaw(pWav, framesToRead, pBufferOut);\n    }\n    if (pWav->translatedFormatTag == MA_DR_WAVE_FORMAT_MULAW) {\n        return ma_dr_wav_read_pcm_frames_s32__mulaw(pWav, framesToRead, pBufferOut);\n    }\n    return 0;\n}\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_s32le(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int32* pBufferOut)\n{\n    ma_uint64 framesRead = ma_dr_wav_read_pcm_frames_s32(pWav, framesToRead, pBufferOut);\n    if (pBufferOut != NULL && ma_dr_wav__is_little_endian() == MA_FALSE) {\n        ma_dr_wav__bswap_samples_s32(pBufferOut, framesRead*pWav->channels);\n    }\n    return framesRead;\n}\nMA_API ma_uint64 ma_dr_wav_read_pcm_frames_s32be(ma_dr_wav* pWav, ma_uint64 framesToRead, ma_int32* pBufferOut)\n{\n    ma_uint64 framesRead = ma_dr_wav_read_pcm_frames_s32(pWav, framesToRead, pBufferOut);\n    if (pBufferOut != NULL && ma_dr_wav__is_little_endian() == MA_TRUE) {\n        ma_dr_wav__bswap_samples_s32(pBufferOut, framesRead*pWav->channels);\n    }\n    return framesRead;\n}\nMA_API void ma_dr_wav_u8_to_s32(ma_int32* pOut, const ma_uint8* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n    for (i = 0; i < sampleCount; ++i) {\n        *pOut++ = ((int)pIn[i] - 128) << 24;\n    }\n}\nMA_API void ma_dr_wav_s16_to_s32(ma_int32* pOut, const ma_int16* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n    for (i = 0; i < sampleCount; ++i) {\n        *pOut++ = pIn[i] << 16;\n    }\n}\nMA_API void ma_dr_wav_s24_to_s32(ma_int32* pOut, const ma_uint8* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n    for (i = 0; i < sampleCount; ++i) {\n        unsigned int s0 = pIn[i*3 + 0];\n        unsigned int s1 = pIn[i*3 + 1];\n        unsigned int s2 = pIn[i*3 + 2];\n        ma_int32 sample32 = (ma_int32)((s0 << 8) | (s1 << 16) | (s2 << 24));\n        *pOut++ = sample32;\n    }\n}\nMA_API void ma_dr_wav_f32_to_s32(ma_int32* pOut, const float* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n    for (i = 0; i < sampleCount; ++i) {\n        *pOut++ = (ma_int32)(2147483648.0 * pIn[i]);\n    }\n}\nMA_API void ma_dr_wav_f64_to_s32(ma_int32* pOut, const double* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n    for (i = 0; i < sampleCount; ++i) {\n        *pOut++ = (ma_int32)(2147483648.0 * pIn[i]);\n    }\n}\nMA_API void ma_dr_wav_alaw_to_s32(ma_int32* pOut, const ma_uint8* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n    for (i = 0; i < sampleCount; ++i) {\n        *pOut++ = ((ma_int32)ma_dr_wav__alaw_to_s16(pIn[i])) << 16;\n    }\n}\nMA_API void ma_dr_wav_mulaw_to_s32(ma_int32* pOut, const ma_uint8* pIn, size_t sampleCount)\n{\n    size_t i;\n    if (pOut == NULL || pIn == NULL) {\n        return;\n    }\n    for (i= 0; i < sampleCount; ++i) {\n        *pOut++ = ((ma_int32)ma_dr_wav__mulaw_to_s16(pIn[i])) << 16;\n    }\n}\nMA_PRIVATE ma_int16* ma_dr_wav__read_pcm_frames_and_close_s16(ma_dr_wav* pWav, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalFrameCount)\n{\n    ma_uint64 sampleDataSize;\n    ma_int16* pSampleData;\n    ma_uint64 framesRead;\n    MA_DR_WAV_ASSERT(pWav != NULL);\n    sampleDataSize = pWav->totalPCMFrameCount * pWav->channels * sizeof(ma_int16);\n    if (sampleDataSize > MA_SIZE_MAX) {\n        ma_dr_wav_uninit(pWav);\n        return NULL;\n    }\n    pSampleData = (ma_int16*)ma_dr_wav__malloc_from_callbacks((size_t)sampleDataSize, &pWav->allocationCallbacks);\n    if (pSampleData == NULL) {\n        ma_dr_wav_uninit(pWav);\n        return NULL;\n    }\n    framesRead = ma_dr_wav_read_pcm_frames_s16(pWav, (size_t)pWav->totalPCMFrameCount, pSampleData);\n    if (framesRead != pWav->totalPCMFrameCount) {\n        ma_dr_wav__free_from_callbacks(pSampleData, &pWav->allocationCallbacks);\n        ma_dr_wav_uninit(pWav);\n        return NULL;\n    }\n    ma_dr_wav_uninit(pWav);\n    if (sampleRate) {\n        *sampleRate = pWav->sampleRate;\n    }\n    if (channels) {\n        *channels = pWav->channels;\n    }\n    if (totalFrameCount) {\n        *totalFrameCount = pWav->totalPCMFrameCount;\n    }\n    return pSampleData;\n}\nMA_PRIVATE float* ma_dr_wav__read_pcm_frames_and_close_f32(ma_dr_wav* pWav, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalFrameCount)\n{\n    ma_uint64 sampleDataSize;\n    float* pSampleData;\n    ma_uint64 framesRead;\n    MA_DR_WAV_ASSERT(pWav != NULL);\n    sampleDataSize = pWav->totalPCMFrameCount * pWav->channels * sizeof(float);\n    if (sampleDataSize > MA_SIZE_MAX) {\n        ma_dr_wav_uninit(pWav);\n        return NULL;\n    }\n    pSampleData = (float*)ma_dr_wav__malloc_from_callbacks((size_t)sampleDataSize, &pWav->allocationCallbacks);\n    if (pSampleData == NULL) {\n        ma_dr_wav_uninit(pWav);\n        return NULL;\n    }\n    framesRead = ma_dr_wav_read_pcm_frames_f32(pWav, (size_t)pWav->totalPCMFrameCount, pSampleData);\n    if (framesRead != pWav->totalPCMFrameCount) {\n        ma_dr_wav__free_from_callbacks(pSampleData, &pWav->allocationCallbacks);\n        ma_dr_wav_uninit(pWav);\n        return NULL;\n    }\n    ma_dr_wav_uninit(pWav);\n    if (sampleRate) {\n        *sampleRate = pWav->sampleRate;\n    }\n    if (channels) {\n        *channels = pWav->channels;\n    }\n    if (totalFrameCount) {\n        *totalFrameCount = pWav->totalPCMFrameCount;\n    }\n    return pSampleData;\n}\nMA_PRIVATE ma_int32* ma_dr_wav__read_pcm_frames_and_close_s32(ma_dr_wav* pWav, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalFrameCount)\n{\n    ma_uint64 sampleDataSize;\n    ma_int32* pSampleData;\n    ma_uint64 framesRead;\n    MA_DR_WAV_ASSERT(pWav != NULL);\n    sampleDataSize = pWav->totalPCMFrameCount * pWav->channels * sizeof(ma_int32);\n    if (sampleDataSize > MA_SIZE_MAX) {\n        ma_dr_wav_uninit(pWav);\n        return NULL;\n    }\n    pSampleData = (ma_int32*)ma_dr_wav__malloc_from_callbacks((size_t)sampleDataSize, &pWav->allocationCallbacks);\n    if (pSampleData == NULL) {\n        ma_dr_wav_uninit(pWav);\n        return NULL;\n    }\n    framesRead = ma_dr_wav_read_pcm_frames_s32(pWav, (size_t)pWav->totalPCMFrameCount, pSampleData);\n    if (framesRead != pWav->totalPCMFrameCount) {\n        ma_dr_wav__free_from_callbacks(pSampleData, &pWav->allocationCallbacks);\n        ma_dr_wav_uninit(pWav);\n        return NULL;\n    }\n    ma_dr_wav_uninit(pWav);\n    if (sampleRate) {\n        *sampleRate = pWav->sampleRate;\n    }\n    if (channels) {\n        *channels = pWav->channels;\n    }\n    if (totalFrameCount) {\n        *totalFrameCount = pWav->totalPCMFrameCount;\n    }\n    return pSampleData;\n}\nMA_API ma_int16* ma_dr_wav_open_and_read_pcm_frames_s16(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_wav wav;\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalFrameCountOut) {\n        *totalFrameCountOut = 0;\n    }\n    if (!ma_dr_wav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_wav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut);\n}\nMA_API float* ma_dr_wav_open_and_read_pcm_frames_f32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_wav wav;\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalFrameCountOut) {\n        *totalFrameCountOut = 0;\n    }\n    if (!ma_dr_wav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_wav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);\n}\nMA_API ma_int32* ma_dr_wav_open_and_read_pcm_frames_s32(ma_dr_wav_read_proc onRead, ma_dr_wav_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_wav wav;\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalFrameCountOut) {\n        *totalFrameCountOut = 0;\n    }\n    if (!ma_dr_wav_init(&wav, onRead, onSeek, pUserData, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_wav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);\n}\n#ifndef MA_DR_WAV_NO_STDIO\nMA_API ma_int16* ma_dr_wav_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_wav wav;\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalFrameCountOut) {\n        *totalFrameCountOut = 0;\n    }\n    if (!ma_dr_wav_init_file(&wav, filename, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_wav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut);\n}\nMA_API float* ma_dr_wav_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_wav wav;\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalFrameCountOut) {\n        *totalFrameCountOut = 0;\n    }\n    if (!ma_dr_wav_init_file(&wav, filename, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_wav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);\n}\nMA_API ma_int32* ma_dr_wav_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_wav wav;\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalFrameCountOut) {\n        *totalFrameCountOut = 0;\n    }\n    if (!ma_dr_wav_init_file(&wav, filename, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_wav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);\n}\n#ifndef MA_DR_WAV_NO_WCHAR\nMA_API ma_int16* ma_dr_wav_open_file_and_read_pcm_frames_s16_w(const wchar_t* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_wav wav;\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (totalFrameCountOut) {\n        *totalFrameCountOut = 0;\n    }\n    if (!ma_dr_wav_init_file_w(&wav, filename, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_wav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut);\n}\nMA_API float* ma_dr_wav_open_file_and_read_pcm_frames_f32_w(const wchar_t* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_wav wav;\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (totalFrameCountOut) {\n        *totalFrameCountOut = 0;\n    }\n    if (!ma_dr_wav_init_file_w(&wav, filename, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_wav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);\n}\nMA_API ma_int32* ma_dr_wav_open_file_and_read_pcm_frames_s32_w(const wchar_t* filename, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_wav wav;\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (totalFrameCountOut) {\n        *totalFrameCountOut = 0;\n    }\n    if (!ma_dr_wav_init_file_w(&wav, filename, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_wav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);\n}\n#endif\n#endif\nMA_API ma_int16* ma_dr_wav_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_wav wav;\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalFrameCountOut) {\n        *totalFrameCountOut = 0;\n    }\n    if (!ma_dr_wav_init_memory(&wav, data, dataSize, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_wav__read_pcm_frames_and_close_s16(&wav, channelsOut, sampleRateOut, totalFrameCountOut);\n}\nMA_API float* ma_dr_wav_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_wav wav;\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalFrameCountOut) {\n        *totalFrameCountOut = 0;\n    }\n    if (!ma_dr_wav_init_memory(&wav, data, dataSize, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_wav__read_pcm_frames_and_close_f32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);\n}\nMA_API ma_int32* ma_dr_wav_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_wav wav;\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalFrameCountOut) {\n        *totalFrameCountOut = 0;\n    }\n    if (!ma_dr_wav_init_memory(&wav, data, dataSize, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_wav__read_pcm_frames_and_close_s32(&wav, channelsOut, sampleRateOut, totalFrameCountOut);\n}\n#endif\nMA_API void ma_dr_wav_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks != NULL) {\n        ma_dr_wav__free_from_callbacks(p, pAllocationCallbacks);\n    } else {\n        ma_dr_wav__free_default(p, NULL);\n    }\n}\nMA_API ma_uint16 ma_dr_wav_bytes_to_u16(const ma_uint8* data)\n{\n    return ((ma_uint16)data[0] << 0) | ((ma_uint16)data[1] << 8);\n}\nMA_API ma_int16 ma_dr_wav_bytes_to_s16(const ma_uint8* data)\n{\n    return (ma_int16)ma_dr_wav_bytes_to_u16(data);\n}\nMA_API ma_uint32 ma_dr_wav_bytes_to_u32(const ma_uint8* data)\n{\n    return ma_dr_wav_bytes_to_u32_le(data);\n}\nMA_API float ma_dr_wav_bytes_to_f32(const ma_uint8* data)\n{\n    union {\n        ma_uint32 u32;\n        float f32;\n    } value;\n    value.u32 = ma_dr_wav_bytes_to_u32(data);\n    return value.f32;\n}\nMA_API ma_int32 ma_dr_wav_bytes_to_s32(const ma_uint8* data)\n{\n    return (ma_int32)ma_dr_wav_bytes_to_u32(data);\n}\nMA_API ma_uint64 ma_dr_wav_bytes_to_u64(const ma_uint8* data)\n{\n    return\n        ((ma_uint64)data[0] <<  0) | ((ma_uint64)data[1] <<  8) | ((ma_uint64)data[2] << 16) | ((ma_uint64)data[3] << 24) |\n        ((ma_uint64)data[4] << 32) | ((ma_uint64)data[5] << 40) | ((ma_uint64)data[6] << 48) | ((ma_uint64)data[7] << 56);\n}\nMA_API ma_int64 ma_dr_wav_bytes_to_s64(const ma_uint8* data)\n{\n    return (ma_int64)ma_dr_wav_bytes_to_u64(data);\n}\nMA_API ma_bool32 ma_dr_wav_guid_equal(const ma_uint8 a[16], const ma_uint8 b[16])\n{\n    int i;\n    for (i = 0; i < 16; i += 1) {\n        if (a[i] != b[i]) {\n            return MA_FALSE;\n        }\n    }\n    return MA_TRUE;\n}\nMA_API ma_bool32 ma_dr_wav_fourcc_equal(const ma_uint8* a, const char* b)\n{\n    return\n        a[0] == b[0] &&\n        a[1] == b[1] &&\n        a[2] == b[2] &&\n        a[3] == b[3];\n}\n#ifdef __MRC__\n#pragma options opt reset\n#endif\n#endif\n/* dr_wav_c end */\n#endif  /* MA_DR_WAV_IMPLEMENTATION */\n#endif  /* MA_NO_WAV */\n\n#if !defined(MA_NO_FLAC) && !defined(MA_NO_DECODING)\n#if !defined(MA_DR_FLAC_IMPLEMENTATION) && !defined(MA_DR_FLAC_IMPLEMENTATION) /* For backwards compatibility. Will be removed in version 0.11 for cleanliness. */\n/* dr_flac_c begin */\n#ifndef ma_dr_flac_c\n#define ma_dr_flac_c\n#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n    #pragma GCC diagnostic push\n    #if __GNUC__ >= 7\n    #pragma GCC diagnostic ignored \"-Wimplicit-fallthrough\"\n    #endif\n#endif\n#ifdef __linux__\n    #ifndef _BSD_SOURCE\n        #define _BSD_SOURCE\n    #endif\n    #ifndef _DEFAULT_SOURCE\n        #define _DEFAULT_SOURCE\n    #endif\n    #ifndef __USE_BSD\n        #define __USE_BSD\n    #endif\n    #include <endian.h>\n#endif\n#include <stdlib.h>\n#include <string.h>\n#if !defined(MA_DR_FLAC_NO_SIMD)\n    #if defined(MA_X64) || defined(MA_X86)\n        #if defined(_MSC_VER) && !defined(__clang__)\n            #if _MSC_VER >= 1400 && !defined(MA_DR_FLAC_NO_SSE2)\n                #define MA_DR_FLAC_SUPPORT_SSE2\n            #endif\n            #if _MSC_VER >= 1600 && !defined(MA_DR_FLAC_NO_SSE41)\n                #define MA_DR_FLAC_SUPPORT_SSE41\n            #endif\n        #elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)))\n            #if defined(__SSE2__) && !defined(MA_DR_FLAC_NO_SSE2)\n                #define MA_DR_FLAC_SUPPORT_SSE2\n            #endif\n            #if defined(__SSE4_1__) && !defined(MA_DR_FLAC_NO_SSE41)\n                #define MA_DR_FLAC_SUPPORT_SSE41\n            #endif\n        #endif\n        #if !defined(__GNUC__) && !defined(__clang__) && defined(__has_include)\n            #if !defined(MA_DR_FLAC_SUPPORT_SSE2) && !defined(MA_DR_FLAC_NO_SSE2) && __has_include(<emmintrin.h>)\n                #define MA_DR_FLAC_SUPPORT_SSE2\n            #endif\n            #if !defined(MA_DR_FLAC_SUPPORT_SSE41) && !defined(MA_DR_FLAC_NO_SSE41) && __has_include(<smmintrin.h>)\n                #define MA_DR_FLAC_SUPPORT_SSE41\n            #endif\n        #endif\n        #if defined(MA_DR_FLAC_SUPPORT_SSE41)\n            #include <smmintrin.h>\n        #elif defined(MA_DR_FLAC_SUPPORT_SSE2)\n            #include <emmintrin.h>\n        #endif\n    #endif\n    #if defined(MA_ARM)\n        #if !defined(MA_DR_FLAC_NO_NEON) && (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64))\n            #define MA_DR_FLAC_SUPPORT_NEON\n            #include <arm_neon.h>\n        #endif\n    #endif\n#endif\n#if !defined(MA_DR_FLAC_NO_SIMD) && (defined(MA_X86) || defined(MA_X64))\n    #if defined(_MSC_VER) && !defined(__clang__)\n        #if _MSC_VER >= 1400\n            #include <intrin.h>\n            static void ma_dr_flac__cpuid(int info[4], int fid)\n            {\n                __cpuid(info, fid);\n            }\n        #else\n            #define MA_DR_FLAC_NO_CPUID\n        #endif\n    #else\n        #if defined(__GNUC__) || defined(__clang__)\n            static void ma_dr_flac__cpuid(int info[4], int fid)\n            {\n                #if defined(MA_X86) && defined(__PIC__)\n                    __asm__ __volatile__ (\n                        \"xchg{l} {%%}ebx, %k1;\"\n                        \"cpuid;\"\n                        \"xchg{l} {%%}ebx, %k1;\"\n                        : \"=a\"(info[0]), \"=&r\"(info[1]), \"=c\"(info[2]), \"=d\"(info[3]) : \"a\"(fid), \"c\"(0)\n                    );\n                #else\n                    __asm__ __volatile__ (\n                        \"cpuid\" : \"=a\"(info[0]), \"=b\"(info[1]), \"=c\"(info[2]), \"=d\"(info[3]) : \"a\"(fid), \"c\"(0)\n                    );\n                #endif\n            }\n        #else\n            #define MA_DR_FLAC_NO_CPUID\n        #endif\n    #endif\n#else\n    #define MA_DR_FLAC_NO_CPUID\n#endif\nstatic MA_INLINE ma_bool32 ma_dr_flac_has_sse2(void)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\n    #if (defined(MA_X64) || defined(MA_X86)) && !defined(MA_DR_FLAC_NO_SSE2)\n        #if defined(MA_X64)\n            return MA_TRUE;\n        #elif (defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE2__)\n            return MA_TRUE;\n        #else\n            #if defined(MA_DR_FLAC_NO_CPUID)\n                return MA_FALSE;\n            #else\n                int info[4];\n                ma_dr_flac__cpuid(info, 1);\n                return (info[3] & (1 << 26)) != 0;\n            #endif\n        #endif\n    #else\n        return MA_FALSE;\n    #endif\n#else\n    return MA_FALSE;\n#endif\n}\nstatic MA_INLINE ma_bool32 ma_dr_flac_has_sse41(void)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE41)\n    #if (defined(MA_X64) || defined(MA_X86)) && !defined(MA_DR_FLAC_NO_SSE41)\n        #if defined(__SSE4_1__) || defined(__AVX__)\n            return MA_TRUE;\n        #else\n            #if defined(MA_DR_FLAC_NO_CPUID)\n                return MA_FALSE;\n            #else\n                int info[4];\n                ma_dr_flac__cpuid(info, 1);\n                return (info[2] & (1 << 19)) != 0;\n            #endif\n        #endif\n    #else\n        return MA_FALSE;\n    #endif\n#else\n    return MA_FALSE;\n#endif\n}\n#if defined(_MSC_VER) && _MSC_VER >= 1500 && (defined(MA_X86) || defined(MA_X64)) && !defined(__clang__)\n    #define MA_DR_FLAC_HAS_LZCNT_INTRINSIC\n#elif (defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)))\n    #define MA_DR_FLAC_HAS_LZCNT_INTRINSIC\n#elif defined(__clang__)\n    #if defined(__has_builtin)\n        #if __has_builtin(__builtin_clzll) || __has_builtin(__builtin_clzl)\n            #define MA_DR_FLAC_HAS_LZCNT_INTRINSIC\n        #endif\n    #endif\n#endif\n#if defined(_MSC_VER) && _MSC_VER >= 1400 && !defined(__clang__)\n    #define MA_DR_FLAC_HAS_BYTESWAP16_INTRINSIC\n    #define MA_DR_FLAC_HAS_BYTESWAP32_INTRINSIC\n    #define MA_DR_FLAC_HAS_BYTESWAP64_INTRINSIC\n#elif defined(__clang__)\n    #if defined(__has_builtin)\n        #if __has_builtin(__builtin_bswap16)\n            #define MA_DR_FLAC_HAS_BYTESWAP16_INTRINSIC\n        #endif\n        #if __has_builtin(__builtin_bswap32)\n            #define MA_DR_FLAC_HAS_BYTESWAP32_INTRINSIC\n        #endif\n        #if __has_builtin(__builtin_bswap64)\n            #define MA_DR_FLAC_HAS_BYTESWAP64_INTRINSIC\n        #endif\n    #endif\n#elif defined(__GNUC__)\n    #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))\n        #define MA_DR_FLAC_HAS_BYTESWAP32_INTRINSIC\n        #define MA_DR_FLAC_HAS_BYTESWAP64_INTRINSIC\n    #endif\n    #if ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))\n        #define MA_DR_FLAC_HAS_BYTESWAP16_INTRINSIC\n    #endif\n#elif defined(__WATCOMC__) && defined(__386__)\n    #define MA_DR_FLAC_HAS_BYTESWAP16_INTRINSIC\n    #define MA_DR_FLAC_HAS_BYTESWAP32_INTRINSIC\n    #define MA_DR_FLAC_HAS_BYTESWAP64_INTRINSIC\n    extern __inline ma_uint16 _watcom_bswap16(ma_uint16);\n    extern __inline ma_uint32 _watcom_bswap32(ma_uint32);\n    extern __inline ma_uint64 _watcom_bswap64(ma_uint64);\n#pragma aux _watcom_bswap16 = \\\n    \"xchg al, ah\" \\\n    parm  [ax]    \\\n    value [ax]    \\\n    modify nomemory;\n#pragma aux _watcom_bswap32 = \\\n    \"bswap eax\" \\\n    parm  [eax] \\\n    value [eax] \\\n    modify nomemory;\n#pragma aux _watcom_bswap64 = \\\n    \"bswap eax\"     \\\n    \"bswap edx\"     \\\n    \"xchg eax,edx\"  \\\n    parm [eax edx]  \\\n    value [eax edx] \\\n    modify nomemory;\n#endif\n#ifndef MA_DR_FLAC_ASSERT\n#include <assert.h>\n#define MA_DR_FLAC_ASSERT(expression)           assert(expression)\n#endif\n#ifndef MA_DR_FLAC_MALLOC\n#define MA_DR_FLAC_MALLOC(sz)                   malloc((sz))\n#endif\n#ifndef MA_DR_FLAC_REALLOC\n#define MA_DR_FLAC_REALLOC(p, sz)               realloc((p), (sz))\n#endif\n#ifndef MA_DR_FLAC_FREE\n#define MA_DR_FLAC_FREE(p)                      free((p))\n#endif\n#ifndef MA_DR_FLAC_COPY_MEMORY\n#define MA_DR_FLAC_COPY_MEMORY(dst, src, sz)    memcpy((dst), (src), (sz))\n#endif\n#ifndef MA_DR_FLAC_ZERO_MEMORY\n#define MA_DR_FLAC_ZERO_MEMORY(p, sz)           memset((p), 0, (sz))\n#endif\n#ifndef MA_DR_FLAC_ZERO_OBJECT\n#define MA_DR_FLAC_ZERO_OBJECT(p)               MA_DR_FLAC_ZERO_MEMORY((p), sizeof(*(p)))\n#endif\n#define MA_DR_FLAC_MAX_SIMD_VECTOR_SIZE                     64\n#define MA_DR_FLAC_SUBFRAME_CONSTANT                        0\n#define MA_DR_FLAC_SUBFRAME_VERBATIM                        1\n#define MA_DR_FLAC_SUBFRAME_FIXED                           8\n#define MA_DR_FLAC_SUBFRAME_LPC                             32\n#define MA_DR_FLAC_SUBFRAME_RESERVED                        255\n#define MA_DR_FLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE  0\n#define MA_DR_FLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2 1\n#define MA_DR_FLAC_CHANNEL_ASSIGNMENT_INDEPENDENT           0\n#define MA_DR_FLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE             8\n#define MA_DR_FLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE            9\n#define MA_DR_FLAC_CHANNEL_ASSIGNMENT_MID_SIDE              10\n#define MA_DR_FLAC_SEEKPOINT_SIZE_IN_BYTES                  18\n#define MA_DR_FLAC_CUESHEET_TRACK_SIZE_IN_BYTES             36\n#define MA_DR_FLAC_CUESHEET_TRACK_INDEX_SIZE_IN_BYTES       12\n#define ma_dr_flac_align(x, a)                              ((((x) + (a) - 1) / (a)) * (a))\nMA_API void ma_dr_flac_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* pRevision)\n{\n    if (pMajor) {\n        *pMajor = MA_DR_FLAC_VERSION_MAJOR;\n    }\n    if (pMinor) {\n        *pMinor = MA_DR_FLAC_VERSION_MINOR;\n    }\n    if (pRevision) {\n        *pRevision = MA_DR_FLAC_VERSION_REVISION;\n    }\n}\nMA_API const char* ma_dr_flac_version_string(void)\n{\n    return MA_DR_FLAC_VERSION_STRING;\n}\n#if defined(__has_feature)\n    #if __has_feature(thread_sanitizer)\n        #define MA_DR_FLAC_NO_THREAD_SANITIZE __attribute__((no_sanitize(\"thread\")))\n    #else\n        #define MA_DR_FLAC_NO_THREAD_SANITIZE\n    #endif\n#else\n    #define MA_DR_FLAC_NO_THREAD_SANITIZE\n#endif\n#if defined(MA_DR_FLAC_HAS_LZCNT_INTRINSIC)\nstatic ma_bool32 ma_dr_flac__gIsLZCNTSupported = MA_FALSE;\n#endif\n#ifndef MA_DR_FLAC_NO_CPUID\nstatic ma_bool32 ma_dr_flac__gIsSSE2Supported  = MA_FALSE;\nstatic ma_bool32 ma_dr_flac__gIsSSE41Supported = MA_FALSE;\nMA_DR_FLAC_NO_THREAD_SANITIZE static void ma_dr_flac__init_cpu_caps(void)\n{\n    static ma_bool32 isCPUCapsInitialized = MA_FALSE;\n    if (!isCPUCapsInitialized) {\n#if defined(MA_DR_FLAC_HAS_LZCNT_INTRINSIC)\n        int info[4] = {0};\n        ma_dr_flac__cpuid(info, 0x80000001);\n        ma_dr_flac__gIsLZCNTSupported = (info[2] & (1 << 5)) != 0;\n#endif\n        ma_dr_flac__gIsSSE2Supported = ma_dr_flac_has_sse2();\n        ma_dr_flac__gIsSSE41Supported = ma_dr_flac_has_sse41();\n        isCPUCapsInitialized = MA_TRUE;\n    }\n}\n#else\nstatic ma_bool32 ma_dr_flac__gIsNEONSupported  = MA_FALSE;\nstatic MA_INLINE ma_bool32 ma_dr_flac__has_neon(void)\n{\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\n    #if defined(MA_ARM) && !defined(MA_DR_FLAC_NO_NEON)\n        #if (defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64))\n            return MA_TRUE;\n        #else\n            return MA_FALSE;\n        #endif\n    #else\n        return MA_FALSE;\n    #endif\n#else\n    return MA_FALSE;\n#endif\n}\nMA_DR_FLAC_NO_THREAD_SANITIZE static void ma_dr_flac__init_cpu_caps(void)\n{\n    ma_dr_flac__gIsNEONSupported = ma_dr_flac__has_neon();\n#if defined(MA_DR_FLAC_HAS_LZCNT_INTRINSIC) && defined(MA_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5)\n    ma_dr_flac__gIsLZCNTSupported = MA_TRUE;\n#endif\n}\n#endif\nstatic MA_INLINE ma_bool32 ma_dr_flac__is_little_endian(void)\n{\n#if defined(MA_X86) || defined(MA_X64)\n    return MA_TRUE;\n#elif defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && __BYTE_ORDER == __LITTLE_ENDIAN\n    return MA_TRUE;\n#else\n    int n = 1;\n    return (*(char*)&n) == 1;\n#endif\n}\nstatic MA_INLINE ma_uint16 ma_dr_flac__swap_endian_uint16(ma_uint16 n)\n{\n#ifdef MA_DR_FLAC_HAS_BYTESWAP16_INTRINSIC\n    #if defined(_MSC_VER) && !defined(__clang__)\n        return _byteswap_ushort(n);\n    #elif defined(__GNUC__) || defined(__clang__)\n        return __builtin_bswap16(n);\n    #elif defined(__WATCOMC__) && defined(__386__)\n        return _watcom_bswap16(n);\n    #else\n        #error \"This compiler does not support the byte swap intrinsic.\"\n    #endif\n#else\n    return ((n & 0xFF00) >> 8) |\n           ((n & 0x00FF) << 8);\n#endif\n}\nstatic MA_INLINE ma_uint32 ma_dr_flac__swap_endian_uint32(ma_uint32 n)\n{\n#ifdef MA_DR_FLAC_HAS_BYTESWAP32_INTRINSIC\n    #if defined(_MSC_VER) && !defined(__clang__)\n        return _byteswap_ulong(n);\n    #elif defined(__GNUC__) || defined(__clang__)\n        #if defined(MA_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 6) && !defined(__ARM_ARCH_6M__) && !defined(MA_64BIT)\n            ma_uint32 r;\n            __asm__ __volatile__ (\n            #if defined(MA_64BIT)\n                \"rev %w[out], %w[in]\" : [out]\"=r\"(r) : [in]\"r\"(n)\n            #else\n                \"rev %[out], %[in]\" : [out]\"=r\"(r) : [in]\"r\"(n)\n            #endif\n            );\n            return r;\n        #else\n            return __builtin_bswap32(n);\n        #endif\n    #elif defined(__WATCOMC__) && defined(__386__)\n        return _watcom_bswap32(n);\n    #else\n        #error \"This compiler does not support the byte swap intrinsic.\"\n    #endif\n#else\n    return ((n & 0xFF000000) >> 24) |\n           ((n & 0x00FF0000) >>  8) |\n           ((n & 0x0000FF00) <<  8) |\n           ((n & 0x000000FF) << 24);\n#endif\n}\nstatic MA_INLINE ma_uint64 ma_dr_flac__swap_endian_uint64(ma_uint64 n)\n{\n#ifdef MA_DR_FLAC_HAS_BYTESWAP64_INTRINSIC\n    #if defined(_MSC_VER) && !defined(__clang__)\n        return _byteswap_uint64(n);\n    #elif defined(__GNUC__) || defined(__clang__)\n        return __builtin_bswap64(n);\n    #elif defined(__WATCOMC__) && defined(__386__)\n        return _watcom_bswap64(n);\n    #else\n        #error \"This compiler does not support the byte swap intrinsic.\"\n    #endif\n#else\n    return ((n & ((ma_uint64)0xFF000000 << 32)) >> 56) |\n           ((n & ((ma_uint64)0x00FF0000 << 32)) >> 40) |\n           ((n & ((ma_uint64)0x0000FF00 << 32)) >> 24) |\n           ((n & ((ma_uint64)0x000000FF << 32)) >>  8) |\n           ((n & ((ma_uint64)0xFF000000      )) <<  8) |\n           ((n & ((ma_uint64)0x00FF0000      )) << 24) |\n           ((n & ((ma_uint64)0x0000FF00      )) << 40) |\n           ((n & ((ma_uint64)0x000000FF      )) << 56);\n#endif\n}\nstatic MA_INLINE ma_uint16 ma_dr_flac__be2host_16(ma_uint16 n)\n{\n    if (ma_dr_flac__is_little_endian()) {\n        return ma_dr_flac__swap_endian_uint16(n);\n    }\n    return n;\n}\nstatic MA_INLINE ma_uint32 ma_dr_flac__be2host_32(ma_uint32 n)\n{\n    if (ma_dr_flac__is_little_endian()) {\n        return ma_dr_flac__swap_endian_uint32(n);\n    }\n    return n;\n}\nstatic MA_INLINE ma_uint32 ma_dr_flac__be2host_32_ptr_unaligned(const void* pData)\n{\n    const ma_uint8* pNum = (ma_uint8*)pData;\n    return *(pNum) << 24 | *(pNum+1) << 16 | *(pNum+2) << 8 | *(pNum+3);\n}\nstatic MA_INLINE ma_uint64 ma_dr_flac__be2host_64(ma_uint64 n)\n{\n    if (ma_dr_flac__is_little_endian()) {\n        return ma_dr_flac__swap_endian_uint64(n);\n    }\n    return n;\n}\nstatic MA_INLINE ma_uint32 ma_dr_flac__le2host_32(ma_uint32 n)\n{\n    if (!ma_dr_flac__is_little_endian()) {\n        return ma_dr_flac__swap_endian_uint32(n);\n    }\n    return n;\n}\nstatic MA_INLINE ma_uint32 ma_dr_flac__le2host_32_ptr_unaligned(const void* pData)\n{\n    const ma_uint8* pNum = (ma_uint8*)pData;\n    return *pNum | *(pNum+1) << 8 |  *(pNum+2) << 16 | *(pNum+3) << 24;\n}\nstatic MA_INLINE ma_uint32 ma_dr_flac__unsynchsafe_32(ma_uint32 n)\n{\n    ma_uint32 result = 0;\n    result |= (n & 0x7F000000) >> 3;\n    result |= (n & 0x007F0000) >> 2;\n    result |= (n & 0x00007F00) >> 1;\n    result |= (n & 0x0000007F) >> 0;\n    return result;\n}\nstatic ma_uint8 ma_dr_flac__crc8_table[] = {\n    0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,\n    0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,\n    0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,\n    0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,\n    0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,\n    0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,\n    0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,\n    0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,\n    0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,\n    0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,\n    0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,\n    0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,\n    0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,\n    0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,\n    0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,\n    0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3\n};\nstatic ma_uint16 ma_dr_flac__crc16_table[] = {\n    0x0000, 0x8005, 0x800F, 0x000A, 0x801B, 0x001E, 0x0014, 0x8011,\n    0x8033, 0x0036, 0x003C, 0x8039, 0x0028, 0x802D, 0x8027, 0x0022,\n    0x8063, 0x0066, 0x006C, 0x8069, 0x0078, 0x807D, 0x8077, 0x0072,\n    0x0050, 0x8055, 0x805F, 0x005A, 0x804B, 0x004E, 0x0044, 0x8041,\n    0x80C3, 0x00C6, 0x00CC, 0x80C9, 0x00D8, 0x80DD, 0x80D7, 0x00D2,\n    0x00F0, 0x80F5, 0x80FF, 0x00FA, 0x80EB, 0x00EE, 0x00E4, 0x80E1,\n    0x00A0, 0x80A5, 0x80AF, 0x00AA, 0x80BB, 0x00BE, 0x00B4, 0x80B1,\n    0x8093, 0x0096, 0x009C, 0x8099, 0x0088, 0x808D, 0x8087, 0x0082,\n    0x8183, 0x0186, 0x018C, 0x8189, 0x0198, 0x819D, 0x8197, 0x0192,\n    0x01B0, 0x81B5, 0x81BF, 0x01BA, 0x81AB, 0x01AE, 0x01A4, 0x81A1,\n    0x01E0, 0x81E5, 0x81EF, 0x01EA, 0x81FB, 0x01FE, 0x01F4, 0x81F1,\n    0x81D3, 0x01D6, 0x01DC, 0x81D9, 0x01C8, 0x81CD, 0x81C7, 0x01C2,\n    0x0140, 0x8145, 0x814F, 0x014A, 0x815B, 0x015E, 0x0154, 0x8151,\n    0x8173, 0x0176, 0x017C, 0x8179, 0x0168, 0x816D, 0x8167, 0x0162,\n    0x8123, 0x0126, 0x012C, 0x8129, 0x0138, 0x813D, 0x8137, 0x0132,\n    0x0110, 0x8115, 0x811F, 0x011A, 0x810B, 0x010E, 0x0104, 0x8101,\n    0x8303, 0x0306, 0x030C, 0x8309, 0x0318, 0x831D, 0x8317, 0x0312,\n    0x0330, 0x8335, 0x833F, 0x033A, 0x832B, 0x032E, 0x0324, 0x8321,\n    0x0360, 0x8365, 0x836F, 0x036A, 0x837B, 0x037E, 0x0374, 0x8371,\n    0x8353, 0x0356, 0x035C, 0x8359, 0x0348, 0x834D, 0x8347, 0x0342,\n    0x03C0, 0x83C5, 0x83CF, 0x03CA, 0x83DB, 0x03DE, 0x03D4, 0x83D1,\n    0x83F3, 0x03F6, 0x03FC, 0x83F9, 0x03E8, 0x83ED, 0x83E7, 0x03E2,\n    0x83A3, 0x03A6, 0x03AC, 0x83A9, 0x03B8, 0x83BD, 0x83B7, 0x03B2,\n    0x0390, 0x8395, 0x839F, 0x039A, 0x838B, 0x038E, 0x0384, 0x8381,\n    0x0280, 0x8285, 0x828F, 0x028A, 0x829B, 0x029E, 0x0294, 0x8291,\n    0x82B3, 0x02B6, 0x02BC, 0x82B9, 0x02A8, 0x82AD, 0x82A7, 0x02A2,\n    0x82E3, 0x02E6, 0x02EC, 0x82E9, 0x02F8, 0x82FD, 0x82F7, 0x02F2,\n    0x02D0, 0x82D5, 0x82DF, 0x02DA, 0x82CB, 0x02CE, 0x02C4, 0x82C1,\n    0x8243, 0x0246, 0x024C, 0x8249, 0x0258, 0x825D, 0x8257, 0x0252,\n    0x0270, 0x8275, 0x827F, 0x027A, 0x826B, 0x026E, 0x0264, 0x8261,\n    0x0220, 0x8225, 0x822F, 0x022A, 0x823B, 0x023E, 0x0234, 0x8231,\n    0x8213, 0x0216, 0x021C, 0x8219, 0x0208, 0x820D, 0x8207, 0x0202\n};\nstatic MA_INLINE ma_uint8 ma_dr_flac_crc8_byte(ma_uint8 crc, ma_uint8 data)\n{\n    return ma_dr_flac__crc8_table[crc ^ data];\n}\nstatic MA_INLINE ma_uint8 ma_dr_flac_crc8(ma_uint8 crc, ma_uint32 data, ma_uint32 count)\n{\n#ifdef MA_DR_FLAC_NO_CRC\n    (void)crc;\n    (void)data;\n    (void)count;\n    return 0;\n#else\n#if 0\n    ma_uint8 p = 0x07;\n    for (int i = count-1; i >= 0; --i) {\n        ma_uint8 bit = (data & (1 << i)) >> i;\n        if (crc & 0x80) {\n            crc = ((crc << 1) | bit) ^ p;\n        } else {\n            crc = ((crc << 1) | bit);\n        }\n    }\n    return crc;\n#else\n    ma_uint32 wholeBytes;\n    ma_uint32 leftoverBits;\n    ma_uint64 leftoverDataMask;\n    static ma_uint64 leftoverDataMaskTable[8] = {\n        0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F\n    };\n    MA_DR_FLAC_ASSERT(count <= 32);\n    wholeBytes = count >> 3;\n    leftoverBits = count - (wholeBytes*8);\n    leftoverDataMask = leftoverDataMaskTable[leftoverBits];\n    switch (wholeBytes) {\n        case 4: crc = ma_dr_flac_crc8_byte(crc, (ma_uint8)((data & (0xFF000000UL << leftoverBits)) >> (24 + leftoverBits)));\n        case 3: crc = ma_dr_flac_crc8_byte(crc, (ma_uint8)((data & (0x00FF0000UL << leftoverBits)) >> (16 + leftoverBits)));\n        case 2: crc = ma_dr_flac_crc8_byte(crc, (ma_uint8)((data & (0x0000FF00UL << leftoverBits)) >> ( 8 + leftoverBits)));\n        case 1: crc = ma_dr_flac_crc8_byte(crc, (ma_uint8)((data & (0x000000FFUL << leftoverBits)) >> ( 0 + leftoverBits)));\n        case 0: if (leftoverBits > 0) crc = (ma_uint8)((crc << leftoverBits) ^ ma_dr_flac__crc8_table[(crc >> (8 - leftoverBits)) ^ (data & leftoverDataMask)]);\n    }\n    return crc;\n#endif\n#endif\n}\nstatic MA_INLINE ma_uint16 ma_dr_flac_crc16_byte(ma_uint16 crc, ma_uint8 data)\n{\n    return (crc << 8) ^ ma_dr_flac__crc16_table[(ma_uint8)(crc >> 8) ^ data];\n}\nstatic MA_INLINE ma_uint16 ma_dr_flac_crc16_cache(ma_uint16 crc, ma_dr_flac_cache_t data)\n{\n#ifdef MA_64BIT\n    crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >> 56) & 0xFF));\n    crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >> 48) & 0xFF));\n    crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >> 40) & 0xFF));\n    crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >> 32) & 0xFF));\n#endif\n    crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >> 24) & 0xFF));\n    crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >> 16) & 0xFF));\n    crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >>  8) & 0xFF));\n    crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >>  0) & 0xFF));\n    return crc;\n}\nstatic MA_INLINE ma_uint16 ma_dr_flac_crc16_bytes(ma_uint16 crc, ma_dr_flac_cache_t data, ma_uint32 byteCount)\n{\n    switch (byteCount)\n    {\n#ifdef MA_64BIT\n    case 8: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >> 56) & 0xFF));\n    case 7: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >> 48) & 0xFF));\n    case 6: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >> 40) & 0xFF));\n    case 5: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >> 32) & 0xFF));\n#endif\n    case 4: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >> 24) & 0xFF));\n    case 3: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >> 16) & 0xFF));\n    case 2: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >>  8) & 0xFF));\n    case 1: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data >>  0) & 0xFF));\n    }\n    return crc;\n}\n#if 0\nstatic MA_INLINE ma_uint16 ma_dr_flac_crc16__32bit(ma_uint16 crc, ma_uint32 data, ma_uint32 count)\n{\n#ifdef MA_DR_FLAC_NO_CRC\n    (void)crc;\n    (void)data;\n    (void)count;\n    return 0;\n#else\n#if 0\n    ma_uint16 p = 0x8005;\n    for (int i = count-1; i >= 0; --i) {\n        ma_uint16 bit = (data & (1ULL << i)) >> i;\n        if (r & 0x8000) {\n            r = ((r << 1) | bit) ^ p;\n        } else {\n            r = ((r << 1) | bit);\n        }\n    }\n    return crc;\n#else\n    ma_uint32 wholeBytes;\n    ma_uint32 leftoverBits;\n    ma_uint64 leftoverDataMask;\n    static ma_uint64 leftoverDataMaskTable[8] = {\n        0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F\n    };\n    MA_DR_FLAC_ASSERT(count <= 64);\n    wholeBytes = count >> 3;\n    leftoverBits = count & 7;\n    leftoverDataMask = leftoverDataMaskTable[leftoverBits];\n    switch (wholeBytes) {\n        default:\n        case 4: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data & (0xFF000000UL << leftoverBits)) >> (24 + leftoverBits)));\n        case 3: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data & (0x00FF0000UL << leftoverBits)) >> (16 + leftoverBits)));\n        case 2: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data & (0x0000FF00UL << leftoverBits)) >> ( 8 + leftoverBits)));\n        case 1: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data & (0x000000FFUL << leftoverBits)) >> ( 0 + leftoverBits)));\n        case 0: if (leftoverBits > 0) crc = (crc << leftoverBits) ^ ma_dr_flac__crc16_table[(crc >> (16 - leftoverBits)) ^ (data & leftoverDataMask)];\n    }\n    return crc;\n#endif\n#endif\n}\nstatic MA_INLINE ma_uint16 ma_dr_flac_crc16__64bit(ma_uint16 crc, ma_uint64 data, ma_uint32 count)\n{\n#ifdef MA_DR_FLAC_NO_CRC\n    (void)crc;\n    (void)data;\n    (void)count;\n    return 0;\n#else\n    ma_uint32 wholeBytes;\n    ma_uint32 leftoverBits;\n    ma_uint64 leftoverDataMask;\n    static ma_uint64 leftoverDataMaskTable[8] = {\n        0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F\n    };\n    MA_DR_FLAC_ASSERT(count <= 64);\n    wholeBytes = count >> 3;\n    leftoverBits = count & 7;\n    leftoverDataMask = leftoverDataMaskTable[leftoverBits];\n    switch (wholeBytes) {\n        default:\n        case 8: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data & (((ma_uint64)0xFF000000 << 32) << leftoverBits)) >> (56 + leftoverBits)));\n        case 7: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data & (((ma_uint64)0x00FF0000 << 32) << leftoverBits)) >> (48 + leftoverBits)));\n        case 6: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data & (((ma_uint64)0x0000FF00 << 32) << leftoverBits)) >> (40 + leftoverBits)));\n        case 5: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data & (((ma_uint64)0x000000FF << 32) << leftoverBits)) >> (32 + leftoverBits)));\n        case 4: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data & (((ma_uint64)0xFF000000      ) << leftoverBits)) >> (24 + leftoverBits)));\n        case 3: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data & (((ma_uint64)0x00FF0000      ) << leftoverBits)) >> (16 + leftoverBits)));\n        case 2: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data & (((ma_uint64)0x0000FF00      ) << leftoverBits)) >> ( 8 + leftoverBits)));\n        case 1: crc = ma_dr_flac_crc16_byte(crc, (ma_uint8)((data & (((ma_uint64)0x000000FF      ) << leftoverBits)) >> ( 0 + leftoverBits)));\n        case 0: if (leftoverBits > 0) crc = (crc << leftoverBits) ^ ma_dr_flac__crc16_table[(crc >> (16 - leftoverBits)) ^ (data & leftoverDataMask)];\n    }\n    return crc;\n#endif\n}\nstatic MA_INLINE ma_uint16 ma_dr_flac_crc16(ma_uint16 crc, ma_dr_flac_cache_t data, ma_uint32 count)\n{\n#ifdef MA_64BIT\n    return ma_dr_flac_crc16__64bit(crc, data, count);\n#else\n    return ma_dr_flac_crc16__32bit(crc, data, count);\n#endif\n}\n#endif\n#ifdef MA_64BIT\n#define ma_dr_flac__be2host__cache_line ma_dr_flac__be2host_64\n#else\n#define ma_dr_flac__be2host__cache_line ma_dr_flac__be2host_32\n#endif\n#define MA_DR_FLAC_CACHE_L1_SIZE_BYTES(bs)                      (sizeof((bs)->cache))\n#define MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs)                       (sizeof((bs)->cache)*8)\n#define MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs)                  (MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs) - (bs)->consumedBits)\n#define MA_DR_FLAC_CACHE_L1_SELECTION_MASK(_bitCount)           (~((~(ma_dr_flac_cache_t)0) >> (_bitCount)))\n#define MA_DR_FLAC_CACHE_L1_SELECTION_SHIFT(bs, _bitCount)      (MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs) - (_bitCount))\n#define MA_DR_FLAC_CACHE_L1_SELECT(bs, _bitCount)               (((bs)->cache) & MA_DR_FLAC_CACHE_L1_SELECTION_MASK(_bitCount))\n#define MA_DR_FLAC_CACHE_L1_SELECT_AND_SHIFT(bs, _bitCount)     (MA_DR_FLAC_CACHE_L1_SELECT((bs), (_bitCount)) >>  MA_DR_FLAC_CACHE_L1_SELECTION_SHIFT((bs), (_bitCount)))\n#define MA_DR_FLAC_CACHE_L1_SELECT_AND_SHIFT_SAFE(bs, _bitCount)(MA_DR_FLAC_CACHE_L1_SELECT((bs), (_bitCount)) >> (MA_DR_FLAC_CACHE_L1_SELECTION_SHIFT((bs), (_bitCount)) & (MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs)-1)))\n#define MA_DR_FLAC_CACHE_L2_SIZE_BYTES(bs)                      (sizeof((bs)->cacheL2))\n#define MA_DR_FLAC_CACHE_L2_LINE_COUNT(bs)                      (MA_DR_FLAC_CACHE_L2_SIZE_BYTES(bs) / sizeof((bs)->cacheL2[0]))\n#define MA_DR_FLAC_CACHE_L2_LINES_REMAINING(bs)                 (MA_DR_FLAC_CACHE_L2_LINE_COUNT(bs) - (bs)->nextL2Line)\n#ifndef MA_DR_FLAC_NO_CRC\nstatic MA_INLINE void ma_dr_flac__reset_crc16(ma_dr_flac_bs* bs)\n{\n    bs->crc16 = 0;\n    bs->crc16CacheIgnoredBytes = bs->consumedBits >> 3;\n}\nstatic MA_INLINE void ma_dr_flac__update_crc16(ma_dr_flac_bs* bs)\n{\n    if (bs->crc16CacheIgnoredBytes == 0) {\n        bs->crc16 = ma_dr_flac_crc16_cache(bs->crc16, bs->crc16Cache);\n    } else {\n        bs->crc16 = ma_dr_flac_crc16_bytes(bs->crc16, bs->crc16Cache, MA_DR_FLAC_CACHE_L1_SIZE_BYTES(bs) - bs->crc16CacheIgnoredBytes);\n        bs->crc16CacheIgnoredBytes = 0;\n    }\n}\nstatic MA_INLINE ma_uint16 ma_dr_flac__flush_crc16(ma_dr_flac_bs* bs)\n{\n    MA_DR_FLAC_ASSERT((MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs) & 7) == 0);\n    if (MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs) == 0) {\n        ma_dr_flac__update_crc16(bs);\n    } else {\n        bs->crc16 = ma_dr_flac_crc16_bytes(bs->crc16, bs->crc16Cache >> MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs), (bs->consumedBits >> 3) - bs->crc16CacheIgnoredBytes);\n        bs->crc16CacheIgnoredBytes = bs->consumedBits >> 3;\n    }\n    return bs->crc16;\n}\n#endif\nstatic MA_INLINE ma_bool32 ma_dr_flac__reload_l1_cache_from_l2(ma_dr_flac_bs* bs)\n{\n    size_t bytesRead;\n    size_t alignedL1LineCount;\n    if (bs->nextL2Line < MA_DR_FLAC_CACHE_L2_LINE_COUNT(bs)) {\n        bs->cache = bs->cacheL2[bs->nextL2Line++];\n        return MA_TRUE;\n    }\n    if (bs->unalignedByteCount > 0) {\n        return MA_FALSE;\n    }\n    bytesRead = bs->onRead(bs->pUserData, bs->cacheL2, MA_DR_FLAC_CACHE_L2_SIZE_BYTES(bs));\n    bs->nextL2Line = 0;\n    if (bytesRead == MA_DR_FLAC_CACHE_L2_SIZE_BYTES(bs)) {\n        bs->cache = bs->cacheL2[bs->nextL2Line++];\n        return MA_TRUE;\n    }\n    alignedL1LineCount = bytesRead / MA_DR_FLAC_CACHE_L1_SIZE_BYTES(bs);\n    bs->unalignedByteCount = bytesRead - (alignedL1LineCount * MA_DR_FLAC_CACHE_L1_SIZE_BYTES(bs));\n    if (bs->unalignedByteCount > 0) {\n        bs->unalignedCache = bs->cacheL2[alignedL1LineCount];\n    }\n    if (alignedL1LineCount > 0) {\n        size_t offset = MA_DR_FLAC_CACHE_L2_LINE_COUNT(bs) - alignedL1LineCount;\n        size_t i;\n        for (i = alignedL1LineCount; i > 0; --i) {\n            bs->cacheL2[i-1 + offset] = bs->cacheL2[i-1];\n        }\n        bs->nextL2Line = (ma_uint32)offset;\n        bs->cache = bs->cacheL2[bs->nextL2Line++];\n        return MA_TRUE;\n    } else {\n        bs->nextL2Line = MA_DR_FLAC_CACHE_L2_LINE_COUNT(bs);\n        return MA_FALSE;\n    }\n}\nstatic ma_bool32 ma_dr_flac__reload_cache(ma_dr_flac_bs* bs)\n{\n    size_t bytesRead;\n#ifndef MA_DR_FLAC_NO_CRC\n    ma_dr_flac__update_crc16(bs);\n#endif\n    if (ma_dr_flac__reload_l1_cache_from_l2(bs)) {\n        bs->cache = ma_dr_flac__be2host__cache_line(bs->cache);\n        bs->consumedBits = 0;\n#ifndef MA_DR_FLAC_NO_CRC\n        bs->crc16Cache = bs->cache;\n#endif\n        return MA_TRUE;\n    }\n    bytesRead = bs->unalignedByteCount;\n    if (bytesRead == 0) {\n        bs->consumedBits = MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs);\n        return MA_FALSE;\n    }\n    MA_DR_FLAC_ASSERT(bytesRead < MA_DR_FLAC_CACHE_L1_SIZE_BYTES(bs));\n    bs->consumedBits = (ma_uint32)(MA_DR_FLAC_CACHE_L1_SIZE_BYTES(bs) - bytesRead) * 8;\n    bs->cache = ma_dr_flac__be2host__cache_line(bs->unalignedCache);\n    bs->cache &= MA_DR_FLAC_CACHE_L1_SELECTION_MASK(MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs));\n    bs->unalignedByteCount = 0;\n#ifndef MA_DR_FLAC_NO_CRC\n    bs->crc16Cache = bs->cache >> bs->consumedBits;\n    bs->crc16CacheIgnoredBytes = bs->consumedBits >> 3;\n#endif\n    return MA_TRUE;\n}\nstatic void ma_dr_flac__reset_cache(ma_dr_flac_bs* bs)\n{\n    bs->nextL2Line   = MA_DR_FLAC_CACHE_L2_LINE_COUNT(bs);\n    bs->consumedBits = MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs);\n    bs->cache = 0;\n    bs->unalignedByteCount = 0;\n    bs->unalignedCache = 0;\n#ifndef MA_DR_FLAC_NO_CRC\n    bs->crc16Cache = 0;\n    bs->crc16CacheIgnoredBytes = 0;\n#endif\n}\nstatic MA_INLINE ma_bool32 ma_dr_flac__read_uint32(ma_dr_flac_bs* bs, unsigned int bitCount, ma_uint32* pResultOut)\n{\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(pResultOut != NULL);\n    MA_DR_FLAC_ASSERT(bitCount > 0);\n    MA_DR_FLAC_ASSERT(bitCount <= 32);\n    if (bs->consumedBits == MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs)) {\n        if (!ma_dr_flac__reload_cache(bs)) {\n            return MA_FALSE;\n        }\n    }\n    if (bitCount <= MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs)) {\n#ifdef MA_64BIT\n        *pResultOut = (ma_uint32)MA_DR_FLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCount);\n        bs->consumedBits += bitCount;\n        bs->cache <<= bitCount;\n#else\n        if (bitCount < MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs)) {\n            *pResultOut = (ma_uint32)MA_DR_FLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCount);\n            bs->consumedBits += bitCount;\n            bs->cache <<= bitCount;\n        } else {\n            *pResultOut = (ma_uint32)bs->cache;\n            bs->consumedBits = MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs);\n            bs->cache = 0;\n        }\n#endif\n        return MA_TRUE;\n    } else {\n        ma_uint32 bitCountHi = MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs);\n        ma_uint32 bitCountLo = bitCount - bitCountHi;\n        ma_uint32 resultHi;\n        MA_DR_FLAC_ASSERT(bitCountHi > 0);\n        MA_DR_FLAC_ASSERT(bitCountHi < 32);\n        resultHi = (ma_uint32)MA_DR_FLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCountHi);\n        if (!ma_dr_flac__reload_cache(bs)) {\n            return MA_FALSE;\n        }\n        if (bitCountLo > MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs)) {\n            return MA_FALSE;\n        }\n        *pResultOut = (resultHi << bitCountLo) | (ma_uint32)MA_DR_FLAC_CACHE_L1_SELECT_AND_SHIFT(bs, bitCountLo);\n        bs->consumedBits += bitCountLo;\n        bs->cache <<= bitCountLo;\n        return MA_TRUE;\n    }\n}\nstatic ma_bool32 ma_dr_flac__read_int32(ma_dr_flac_bs* bs, unsigned int bitCount, ma_int32* pResult)\n{\n    ma_uint32 result;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(pResult != NULL);\n    MA_DR_FLAC_ASSERT(bitCount > 0);\n    MA_DR_FLAC_ASSERT(bitCount <= 32);\n    if (!ma_dr_flac__read_uint32(bs, bitCount, &result)) {\n        return MA_FALSE;\n    }\n    if (bitCount < 32) {\n        ma_uint32 signbit;\n        signbit = ((result >> (bitCount-1)) & 0x01);\n        result |= (~signbit + 1) << bitCount;\n    }\n    *pResult = (ma_int32)result;\n    return MA_TRUE;\n}\n#ifdef MA_64BIT\nstatic ma_bool32 ma_dr_flac__read_uint64(ma_dr_flac_bs* bs, unsigned int bitCount, ma_uint64* pResultOut)\n{\n    ma_uint32 resultHi;\n    ma_uint32 resultLo;\n    MA_DR_FLAC_ASSERT(bitCount <= 64);\n    MA_DR_FLAC_ASSERT(bitCount >  32);\n    if (!ma_dr_flac__read_uint32(bs, bitCount - 32, &resultHi)) {\n        return MA_FALSE;\n    }\n    if (!ma_dr_flac__read_uint32(bs, 32, &resultLo)) {\n        return MA_FALSE;\n    }\n    *pResultOut = (((ma_uint64)resultHi) << 32) | ((ma_uint64)resultLo);\n    return MA_TRUE;\n}\n#endif\n#if 0\nstatic ma_bool32 ma_dr_flac__read_int64(ma_dr_flac_bs* bs, unsigned int bitCount, ma_int64* pResultOut)\n{\n    ma_uint64 result;\n    ma_uint64 signbit;\n    MA_DR_FLAC_ASSERT(bitCount <= 64);\n    if (!ma_dr_flac__read_uint64(bs, bitCount, &result)) {\n        return MA_FALSE;\n    }\n    signbit = ((result >> (bitCount-1)) & 0x01);\n    result |= (~signbit + 1) << bitCount;\n    *pResultOut = (ma_int64)result;\n    return MA_TRUE;\n}\n#endif\nstatic ma_bool32 ma_dr_flac__read_uint16(ma_dr_flac_bs* bs, unsigned int bitCount, ma_uint16* pResult)\n{\n    ma_uint32 result;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(pResult != NULL);\n    MA_DR_FLAC_ASSERT(bitCount > 0);\n    MA_DR_FLAC_ASSERT(bitCount <= 16);\n    if (!ma_dr_flac__read_uint32(bs, bitCount, &result)) {\n        return MA_FALSE;\n    }\n    *pResult = (ma_uint16)result;\n    return MA_TRUE;\n}\n#if 0\nstatic ma_bool32 ma_dr_flac__read_int16(ma_dr_flac_bs* bs, unsigned int bitCount, ma_int16* pResult)\n{\n    ma_int32 result;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(pResult != NULL);\n    MA_DR_FLAC_ASSERT(bitCount > 0);\n    MA_DR_FLAC_ASSERT(bitCount <= 16);\n    if (!ma_dr_flac__read_int32(bs, bitCount, &result)) {\n        return MA_FALSE;\n    }\n    *pResult = (ma_int16)result;\n    return MA_TRUE;\n}\n#endif\nstatic ma_bool32 ma_dr_flac__read_uint8(ma_dr_flac_bs* bs, unsigned int bitCount, ma_uint8* pResult)\n{\n    ma_uint32 result;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(pResult != NULL);\n    MA_DR_FLAC_ASSERT(bitCount > 0);\n    MA_DR_FLAC_ASSERT(bitCount <= 8);\n    if (!ma_dr_flac__read_uint32(bs, bitCount, &result)) {\n        return MA_FALSE;\n    }\n    *pResult = (ma_uint8)result;\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__read_int8(ma_dr_flac_bs* bs, unsigned int bitCount, ma_int8* pResult)\n{\n    ma_int32 result;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(pResult != NULL);\n    MA_DR_FLAC_ASSERT(bitCount > 0);\n    MA_DR_FLAC_ASSERT(bitCount <= 8);\n    if (!ma_dr_flac__read_int32(bs, bitCount, &result)) {\n        return MA_FALSE;\n    }\n    *pResult = (ma_int8)result;\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__seek_bits(ma_dr_flac_bs* bs, size_t bitsToSeek)\n{\n    if (bitsToSeek <= MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs)) {\n        bs->consumedBits += (ma_uint32)bitsToSeek;\n        bs->cache <<= bitsToSeek;\n        return MA_TRUE;\n    } else {\n        bitsToSeek       -= MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs);\n        bs->consumedBits += MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs);\n        bs->cache         = 0;\n#ifdef MA_64BIT\n        while (bitsToSeek >= MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs)) {\n            ma_uint64 bin;\n            if (!ma_dr_flac__read_uint64(bs, MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs), &bin)) {\n                return MA_FALSE;\n            }\n            bitsToSeek -= MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs);\n        }\n#else\n        while (bitsToSeek >= MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs)) {\n            ma_uint32 bin;\n            if (!ma_dr_flac__read_uint32(bs, MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs), &bin)) {\n                return MA_FALSE;\n            }\n            bitsToSeek -= MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs);\n        }\n#endif\n        while (bitsToSeek >= 8) {\n            ma_uint8 bin;\n            if (!ma_dr_flac__read_uint8(bs, 8, &bin)) {\n                return MA_FALSE;\n            }\n            bitsToSeek -= 8;\n        }\n        if (bitsToSeek > 0) {\n            ma_uint8 bin;\n            if (!ma_dr_flac__read_uint8(bs, (ma_uint32)bitsToSeek, &bin)) {\n                return MA_FALSE;\n            }\n            bitsToSeek = 0;\n        }\n        MA_DR_FLAC_ASSERT(bitsToSeek == 0);\n        return MA_TRUE;\n    }\n}\nstatic ma_bool32 ma_dr_flac__find_and_seek_to_next_sync_code(ma_dr_flac_bs* bs)\n{\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    if (!ma_dr_flac__seek_bits(bs, MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs) & 7)) {\n        return MA_FALSE;\n    }\n    for (;;) {\n        ma_uint8 hi;\n#ifndef MA_DR_FLAC_NO_CRC\n        ma_dr_flac__reset_crc16(bs);\n#endif\n        if (!ma_dr_flac__read_uint8(bs, 8, &hi)) {\n            return MA_FALSE;\n        }\n        if (hi == 0xFF) {\n            ma_uint8 lo;\n            if (!ma_dr_flac__read_uint8(bs, 6, &lo)) {\n                return MA_FALSE;\n            }\n            if (lo == 0x3E) {\n                return MA_TRUE;\n            } else {\n                if (!ma_dr_flac__seek_bits(bs, MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs) & 7)) {\n                    return MA_FALSE;\n                }\n            }\n        }\n    }\n}\n#if defined(MA_DR_FLAC_HAS_LZCNT_INTRINSIC)\n#define MA_DR_FLAC_IMPLEMENT_CLZ_LZCNT\n#endif\n#if  defined(_MSC_VER) && _MSC_VER >= 1400 && (defined(MA_X64) || defined(MA_X86)) && !defined(__clang__)\n#define MA_DR_FLAC_IMPLEMENT_CLZ_MSVC\n#endif\n#if  defined(__WATCOMC__) && defined(__386__)\n#define MA_DR_FLAC_IMPLEMENT_CLZ_WATCOM\n#endif\n#ifdef __MRC__\n#include <intrinsics.h>\n#define MA_DR_FLAC_IMPLEMENT_CLZ_MRC\n#endif\nstatic MA_INLINE ma_uint32 ma_dr_flac__clz_software(ma_dr_flac_cache_t x)\n{\n    ma_uint32 n;\n    static ma_uint32 clz_table_4[] = {\n        0,\n        4,\n        3, 3,\n        2, 2, 2, 2,\n        1, 1, 1, 1, 1, 1, 1, 1\n    };\n    if (x == 0) {\n        return sizeof(x)*8;\n    }\n    n = clz_table_4[x >> (sizeof(x)*8 - 4)];\n    if (n == 0) {\n#ifdef MA_64BIT\n        if ((x & ((ma_uint64)0xFFFFFFFF << 32)) == 0) { n  = 32; x <<= 32; }\n        if ((x & ((ma_uint64)0xFFFF0000 << 32)) == 0) { n += 16; x <<= 16; }\n        if ((x & ((ma_uint64)0xFF000000 << 32)) == 0) { n += 8;  x <<= 8;  }\n        if ((x & ((ma_uint64)0xF0000000 << 32)) == 0) { n += 4;  x <<= 4;  }\n#else\n        if ((x & 0xFFFF0000) == 0) { n  = 16; x <<= 16; }\n        if ((x & 0xFF000000) == 0) { n += 8;  x <<= 8;  }\n        if ((x & 0xF0000000) == 0) { n += 4;  x <<= 4;  }\n#endif\n        n += clz_table_4[x >> (sizeof(x)*8 - 4)];\n    }\n    return n - 1;\n}\n#ifdef MA_DR_FLAC_IMPLEMENT_CLZ_LZCNT\nstatic MA_INLINE ma_bool32 ma_dr_flac__is_lzcnt_supported(void)\n{\n#if defined(MA_DR_FLAC_HAS_LZCNT_INTRINSIC) && defined(MA_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5)\n    return MA_TRUE;\n#elif defined(__MRC__)\n    return MA_TRUE;\n#else\n    #ifdef MA_DR_FLAC_HAS_LZCNT_INTRINSIC\n        return ma_dr_flac__gIsLZCNTSupported;\n    #else\n        return MA_FALSE;\n    #endif\n#endif\n}\nstatic MA_INLINE ma_uint32 ma_dr_flac__clz_lzcnt(ma_dr_flac_cache_t x)\n{\n#if defined(_MSC_VER)\n    #ifdef MA_64BIT\n        return (ma_uint32)__lzcnt64(x);\n    #else\n        return (ma_uint32)__lzcnt(x);\n    #endif\n#else\n    #if defined(__GNUC__) || defined(__clang__)\n        #if defined(MA_X64)\n            {\n                ma_uint64 r;\n                __asm__ __volatile__ (\n                    \"lzcnt{ %1, %0| %0, %1}\" : \"=r\"(r) : \"r\"(x) : \"cc\"\n                );\n                return (ma_uint32)r;\n            }\n        #elif defined(MA_X86)\n            {\n                ma_uint32 r;\n                __asm__ __volatile__ (\n                    \"lzcnt{l %1, %0| %0, %1}\" : \"=r\"(r) : \"r\"(x) : \"cc\"\n                );\n                return r;\n            }\n        #elif defined(MA_ARM) && (defined(__ARM_ARCH) && __ARM_ARCH >= 5) && !defined(__ARM_ARCH_6M__) && !defined(MA_64BIT)\n            {\n                unsigned int r;\n                __asm__ __volatile__ (\n                #if defined(MA_64BIT)\n                    \"clz %w[out], %w[in]\" : [out]\"=r\"(r) : [in]\"r\"(x)\n                #else\n                    \"clz %[out], %[in]\" : [out]\"=r\"(r) : [in]\"r\"(x)\n                #endif\n                );\n                return r;\n            }\n        #else\n            if (x == 0) {\n                return sizeof(x)*8;\n            }\n            #ifdef MA_64BIT\n                return (ma_uint32)__builtin_clzll((ma_uint64)x);\n            #else\n                return (ma_uint32)__builtin_clzl((ma_uint32)x);\n            #endif\n        #endif\n    #else\n        #error \"This compiler does not support the lzcnt intrinsic.\"\n    #endif\n#endif\n}\n#endif\n#ifdef MA_DR_FLAC_IMPLEMENT_CLZ_MSVC\n#include <intrin.h>\nstatic MA_INLINE ma_uint32 ma_dr_flac__clz_msvc(ma_dr_flac_cache_t x)\n{\n    ma_uint32 n;\n    if (x == 0) {\n        return sizeof(x)*8;\n    }\n#ifdef MA_64BIT\n    _BitScanReverse64((unsigned long*)&n, x);\n#else\n    _BitScanReverse((unsigned long*)&n, x);\n#endif\n    return sizeof(x)*8 - n - 1;\n}\n#endif\n#ifdef MA_DR_FLAC_IMPLEMENT_CLZ_WATCOM\nstatic __inline ma_uint32 ma_dr_flac__clz_watcom (ma_uint32);\n#ifdef MA_DR_FLAC_IMPLEMENT_CLZ_WATCOM_LZCNT\n#pragma aux ma_dr_flac__clz_watcom_lzcnt = \\\n    \"db 0F3h, 0Fh, 0BDh, 0C0h\"  \\\n    parm [eax] \\\n    value [eax] \\\n    modify nomemory;\n#else\n#pragma aux ma_dr_flac__clz_watcom = \\\n    \"bsr eax, eax\" \\\n    \"xor eax, 31\" \\\n    parm [eax] nomemory \\\n    value [eax] \\\n    modify exact [eax] nomemory;\n#endif\n#endif\nstatic MA_INLINE ma_uint32 ma_dr_flac__clz(ma_dr_flac_cache_t x)\n{\n#ifdef MA_DR_FLAC_IMPLEMENT_CLZ_LZCNT\n    if (ma_dr_flac__is_lzcnt_supported()) {\n        return ma_dr_flac__clz_lzcnt(x);\n    } else\n#endif\n    {\n#ifdef MA_DR_FLAC_IMPLEMENT_CLZ_MSVC\n        return ma_dr_flac__clz_msvc(x);\n#elif defined(MA_DR_FLAC_IMPLEMENT_CLZ_WATCOM_LZCNT)\n        return ma_dr_flac__clz_watcom_lzcnt(x);\n#elif defined(MA_DR_FLAC_IMPLEMENT_CLZ_WATCOM)\n        return (x == 0) ? sizeof(x)*8 : ma_dr_flac__clz_watcom(x);\n#elif defined(__MRC__)\n        return __cntlzw(x);\n#else\n        return ma_dr_flac__clz_software(x);\n#endif\n    }\n}\nstatic MA_INLINE ma_bool32 ma_dr_flac__seek_past_next_set_bit(ma_dr_flac_bs* bs, unsigned int* pOffsetOut)\n{\n    ma_uint32 zeroCounter = 0;\n    ma_uint32 setBitOffsetPlus1;\n    while (bs->cache == 0) {\n        zeroCounter += (ma_uint32)MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs);\n        if (!ma_dr_flac__reload_cache(bs)) {\n            return MA_FALSE;\n        }\n    }\n    if (bs->cache == 1) {\n        *pOffsetOut = zeroCounter + (ma_uint32)MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs) - 1;\n        if (!ma_dr_flac__reload_cache(bs)) {\n            return MA_FALSE;\n        }\n        return MA_TRUE;\n    }\n    setBitOffsetPlus1 = ma_dr_flac__clz(bs->cache);\n    setBitOffsetPlus1 += 1;\n    if (setBitOffsetPlus1 > MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs)) {\n        return MA_FALSE;\n    }\n    bs->consumedBits += setBitOffsetPlus1;\n    bs->cache <<= setBitOffsetPlus1;\n    *pOffsetOut = zeroCounter + setBitOffsetPlus1 - 1;\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__seek_to_byte(ma_dr_flac_bs* bs, ma_uint64 offsetFromStart)\n{\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(offsetFromStart > 0);\n    if (offsetFromStart > 0x7FFFFFFF) {\n        ma_uint64 bytesRemaining = offsetFromStart;\n        if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, ma_dr_flac_seek_origin_start)) {\n            return MA_FALSE;\n        }\n        bytesRemaining -= 0x7FFFFFFF;\n        while (bytesRemaining > 0x7FFFFFFF) {\n            if (!bs->onSeek(bs->pUserData, 0x7FFFFFFF, ma_dr_flac_seek_origin_current)) {\n                return MA_FALSE;\n            }\n            bytesRemaining -= 0x7FFFFFFF;\n        }\n        if (bytesRemaining > 0) {\n            if (!bs->onSeek(bs->pUserData, (int)bytesRemaining, ma_dr_flac_seek_origin_current)) {\n                return MA_FALSE;\n            }\n        }\n    } else {\n        if (!bs->onSeek(bs->pUserData, (int)offsetFromStart, ma_dr_flac_seek_origin_start)) {\n            return MA_FALSE;\n        }\n    }\n    ma_dr_flac__reset_cache(bs);\n    return MA_TRUE;\n}\nstatic ma_result ma_dr_flac__read_utf8_coded_number(ma_dr_flac_bs* bs, ma_uint64* pNumberOut, ma_uint8* pCRCOut)\n{\n    ma_uint8 crc;\n    ma_uint64 result;\n    ma_uint8 utf8[7] = {0};\n    int byteCount;\n    int i;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(pNumberOut != NULL);\n    MA_DR_FLAC_ASSERT(pCRCOut != NULL);\n    crc = *pCRCOut;\n    if (!ma_dr_flac__read_uint8(bs, 8, utf8)) {\n        *pNumberOut = 0;\n        return MA_AT_END;\n    }\n    crc = ma_dr_flac_crc8(crc, utf8[0], 8);\n    if ((utf8[0] & 0x80) == 0) {\n        *pNumberOut = utf8[0];\n        *pCRCOut = crc;\n        return MA_SUCCESS;\n    }\n    if ((utf8[0] & 0xE0) == 0xC0) {\n        byteCount = 2;\n    } else if ((utf8[0] & 0xF0) == 0xE0) {\n        byteCount = 3;\n    } else if ((utf8[0] & 0xF8) == 0xF0) {\n        byteCount = 4;\n    } else if ((utf8[0] & 0xFC) == 0xF8) {\n        byteCount = 5;\n    } else if ((utf8[0] & 0xFE) == 0xFC) {\n        byteCount = 6;\n    } else if ((utf8[0] & 0xFF) == 0xFE) {\n        byteCount = 7;\n    } else {\n        *pNumberOut = 0;\n        return MA_CRC_MISMATCH;\n    }\n    MA_DR_FLAC_ASSERT(byteCount > 1);\n    result = (ma_uint64)(utf8[0] & (0xFF >> (byteCount + 1)));\n    for (i = 1; i < byteCount; ++i) {\n        if (!ma_dr_flac__read_uint8(bs, 8, utf8 + i)) {\n            *pNumberOut = 0;\n            return MA_AT_END;\n        }\n        crc = ma_dr_flac_crc8(crc, utf8[i], 8);\n        result = (result << 6) | (utf8[i] & 0x3F);\n    }\n    *pNumberOut = result;\n    *pCRCOut = crc;\n    return MA_SUCCESS;\n}\nstatic MA_INLINE ma_uint32 ma_dr_flac__ilog2_u32(ma_uint32 x)\n{\n#if 1\n    ma_uint32 result = 0;\n    while (x > 0) {\n        result += 1;\n        x >>= 1;\n    }\n    return result;\n#endif\n}\nstatic MA_INLINE ma_bool32 ma_dr_flac__use_64_bit_prediction(ma_uint32 bitsPerSample, ma_uint32 order, ma_uint32 precision)\n{\n    return bitsPerSample + precision + ma_dr_flac__ilog2_u32(order) > 32;\n}\n#if defined(__clang__)\n__attribute__((no_sanitize(\"signed-integer-overflow\")))\n#endif\nstatic MA_INLINE ma_int32 ma_dr_flac__calculate_prediction_32(ma_uint32 order, ma_int32 shift, const ma_int32* coefficients, ma_int32* pDecodedSamples)\n{\n    ma_int32 prediction = 0;\n    MA_DR_FLAC_ASSERT(order <= 32);\n    switch (order)\n    {\n    case 32: prediction += coefficients[31] * pDecodedSamples[-32];\n    case 31: prediction += coefficients[30] * pDecodedSamples[-31];\n    case 30: prediction += coefficients[29] * pDecodedSamples[-30];\n    case 29: prediction += coefficients[28] * pDecodedSamples[-29];\n    case 28: prediction += coefficients[27] * pDecodedSamples[-28];\n    case 27: prediction += coefficients[26] * pDecodedSamples[-27];\n    case 26: prediction += coefficients[25] * pDecodedSamples[-26];\n    case 25: prediction += coefficients[24] * pDecodedSamples[-25];\n    case 24: prediction += coefficients[23] * pDecodedSamples[-24];\n    case 23: prediction += coefficients[22] * pDecodedSamples[-23];\n    case 22: prediction += coefficients[21] * pDecodedSamples[-22];\n    case 21: prediction += coefficients[20] * pDecodedSamples[-21];\n    case 20: prediction += coefficients[19] * pDecodedSamples[-20];\n    case 19: prediction += coefficients[18] * pDecodedSamples[-19];\n    case 18: prediction += coefficients[17] * pDecodedSamples[-18];\n    case 17: prediction += coefficients[16] * pDecodedSamples[-17];\n    case 16: prediction += coefficients[15] * pDecodedSamples[-16];\n    case 15: prediction += coefficients[14] * pDecodedSamples[-15];\n    case 14: prediction += coefficients[13] * pDecodedSamples[-14];\n    case 13: prediction += coefficients[12] * pDecodedSamples[-13];\n    case 12: prediction += coefficients[11] * pDecodedSamples[-12];\n    case 11: prediction += coefficients[10] * pDecodedSamples[-11];\n    case 10: prediction += coefficients[ 9] * pDecodedSamples[-10];\n    case  9: prediction += coefficients[ 8] * pDecodedSamples[- 9];\n    case  8: prediction += coefficients[ 7] * pDecodedSamples[- 8];\n    case  7: prediction += coefficients[ 6] * pDecodedSamples[- 7];\n    case  6: prediction += coefficients[ 5] * pDecodedSamples[- 6];\n    case  5: prediction += coefficients[ 4] * pDecodedSamples[- 5];\n    case  4: prediction += coefficients[ 3] * pDecodedSamples[- 4];\n    case  3: prediction += coefficients[ 2] * pDecodedSamples[- 3];\n    case  2: prediction += coefficients[ 1] * pDecodedSamples[- 2];\n    case  1: prediction += coefficients[ 0] * pDecodedSamples[- 1];\n    }\n    return (ma_int32)(prediction >> shift);\n}\nstatic MA_INLINE ma_int32 ma_dr_flac__calculate_prediction_64(ma_uint32 order, ma_int32 shift, const ma_int32* coefficients, ma_int32* pDecodedSamples)\n{\n    ma_int64 prediction;\n    MA_DR_FLAC_ASSERT(order <= 32);\n#ifndef MA_64BIT\n    if (order == 8)\n    {\n        prediction  = coefficients[0] * (ma_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (ma_int64)pDecodedSamples[-2];\n        prediction += coefficients[2] * (ma_int64)pDecodedSamples[-3];\n        prediction += coefficients[3] * (ma_int64)pDecodedSamples[-4];\n        prediction += coefficients[4] * (ma_int64)pDecodedSamples[-5];\n        prediction += coefficients[5] * (ma_int64)pDecodedSamples[-6];\n        prediction += coefficients[6] * (ma_int64)pDecodedSamples[-7];\n        prediction += coefficients[7] * (ma_int64)pDecodedSamples[-8];\n    }\n    else if (order == 7)\n    {\n        prediction  = coefficients[0] * (ma_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (ma_int64)pDecodedSamples[-2];\n        prediction += coefficients[2] * (ma_int64)pDecodedSamples[-3];\n        prediction += coefficients[3] * (ma_int64)pDecodedSamples[-4];\n        prediction += coefficients[4] * (ma_int64)pDecodedSamples[-5];\n        prediction += coefficients[5] * (ma_int64)pDecodedSamples[-6];\n        prediction += coefficients[6] * (ma_int64)pDecodedSamples[-7];\n    }\n    else if (order == 3)\n    {\n        prediction  = coefficients[0] * (ma_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (ma_int64)pDecodedSamples[-2];\n        prediction += coefficients[2] * (ma_int64)pDecodedSamples[-3];\n    }\n    else if (order == 6)\n    {\n        prediction  = coefficients[0] * (ma_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (ma_int64)pDecodedSamples[-2];\n        prediction += coefficients[2] * (ma_int64)pDecodedSamples[-3];\n        prediction += coefficients[3] * (ma_int64)pDecodedSamples[-4];\n        prediction += coefficients[4] * (ma_int64)pDecodedSamples[-5];\n        prediction += coefficients[5] * (ma_int64)pDecodedSamples[-6];\n    }\n    else if (order == 5)\n    {\n        prediction  = coefficients[0] * (ma_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (ma_int64)pDecodedSamples[-2];\n        prediction += coefficients[2] * (ma_int64)pDecodedSamples[-3];\n        prediction += coefficients[3] * (ma_int64)pDecodedSamples[-4];\n        prediction += coefficients[4] * (ma_int64)pDecodedSamples[-5];\n    }\n    else if (order == 4)\n    {\n        prediction  = coefficients[0] * (ma_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (ma_int64)pDecodedSamples[-2];\n        prediction += coefficients[2] * (ma_int64)pDecodedSamples[-3];\n        prediction += coefficients[3] * (ma_int64)pDecodedSamples[-4];\n    }\n    else if (order == 12)\n    {\n        prediction  = coefficients[0]  * (ma_int64)pDecodedSamples[-1];\n        prediction += coefficients[1]  * (ma_int64)pDecodedSamples[-2];\n        prediction += coefficients[2]  * (ma_int64)pDecodedSamples[-3];\n        prediction += coefficients[3]  * (ma_int64)pDecodedSamples[-4];\n        prediction += coefficients[4]  * (ma_int64)pDecodedSamples[-5];\n        prediction += coefficients[5]  * (ma_int64)pDecodedSamples[-6];\n        prediction += coefficients[6]  * (ma_int64)pDecodedSamples[-7];\n        prediction += coefficients[7]  * (ma_int64)pDecodedSamples[-8];\n        prediction += coefficients[8]  * (ma_int64)pDecodedSamples[-9];\n        prediction += coefficients[9]  * (ma_int64)pDecodedSamples[-10];\n        prediction += coefficients[10] * (ma_int64)pDecodedSamples[-11];\n        prediction += coefficients[11] * (ma_int64)pDecodedSamples[-12];\n    }\n    else if (order == 2)\n    {\n        prediction  = coefficients[0] * (ma_int64)pDecodedSamples[-1];\n        prediction += coefficients[1] * (ma_int64)pDecodedSamples[-2];\n    }\n    else if (order == 1)\n    {\n        prediction = coefficients[0] * (ma_int64)pDecodedSamples[-1];\n    }\n    else if (order == 10)\n    {\n        prediction  = coefficients[0]  * (ma_int64)pDecodedSamples[-1];\n        prediction += coefficients[1]  * (ma_int64)pDecodedSamples[-2];\n        prediction += coefficients[2]  * (ma_int64)pDecodedSamples[-3];\n        prediction += coefficients[3]  * (ma_int64)pDecodedSamples[-4];\n        prediction += coefficients[4]  * (ma_int64)pDecodedSamples[-5];\n        prediction += coefficients[5]  * (ma_int64)pDecodedSamples[-6];\n        prediction += coefficients[6]  * (ma_int64)pDecodedSamples[-7];\n        prediction += coefficients[7]  * (ma_int64)pDecodedSamples[-8];\n        prediction += coefficients[8]  * (ma_int64)pDecodedSamples[-9];\n        prediction += coefficients[9]  * (ma_int64)pDecodedSamples[-10];\n    }\n    else if (order == 9)\n    {\n        prediction  = coefficients[0]  * (ma_int64)pDecodedSamples[-1];\n        prediction += coefficients[1]  * (ma_int64)pDecodedSamples[-2];\n        prediction += coefficients[2]  * (ma_int64)pDecodedSamples[-3];\n        prediction += coefficients[3]  * (ma_int64)pDecodedSamples[-4];\n        prediction += coefficients[4]  * (ma_int64)pDecodedSamples[-5];\n        prediction += coefficients[5]  * (ma_int64)pDecodedSamples[-6];\n        prediction += coefficients[6]  * (ma_int64)pDecodedSamples[-7];\n        prediction += coefficients[7]  * (ma_int64)pDecodedSamples[-8];\n        prediction += coefficients[8]  * (ma_int64)pDecodedSamples[-9];\n    }\n    else if (order == 11)\n    {\n        prediction  = coefficients[0]  * (ma_int64)pDecodedSamples[-1];\n        prediction += coefficients[1]  * (ma_int64)pDecodedSamples[-2];\n        prediction += coefficients[2]  * (ma_int64)pDecodedSamples[-3];\n        prediction += coefficients[3]  * (ma_int64)pDecodedSamples[-4];\n        prediction += coefficients[4]  * (ma_int64)pDecodedSamples[-5];\n        prediction += coefficients[5]  * (ma_int64)pDecodedSamples[-6];\n        prediction += coefficients[6]  * (ma_int64)pDecodedSamples[-7];\n        prediction += coefficients[7]  * (ma_int64)pDecodedSamples[-8];\n        prediction += coefficients[8]  * (ma_int64)pDecodedSamples[-9];\n        prediction += coefficients[9]  * (ma_int64)pDecodedSamples[-10];\n        prediction += coefficients[10] * (ma_int64)pDecodedSamples[-11];\n    }\n    else\n    {\n        int j;\n        prediction = 0;\n        for (j = 0; j < (int)order; ++j) {\n            prediction += coefficients[j] * (ma_int64)pDecodedSamples[-j-1];\n        }\n    }\n#endif\n#ifdef MA_64BIT\n    prediction = 0;\n    switch (order)\n    {\n    case 32: prediction += coefficients[31] * (ma_int64)pDecodedSamples[-32];\n    case 31: prediction += coefficients[30] * (ma_int64)pDecodedSamples[-31];\n    case 30: prediction += coefficients[29] * (ma_int64)pDecodedSamples[-30];\n    case 29: prediction += coefficients[28] * (ma_int64)pDecodedSamples[-29];\n    case 28: prediction += coefficients[27] * (ma_int64)pDecodedSamples[-28];\n    case 27: prediction += coefficients[26] * (ma_int64)pDecodedSamples[-27];\n    case 26: prediction += coefficients[25] * (ma_int64)pDecodedSamples[-26];\n    case 25: prediction += coefficients[24] * (ma_int64)pDecodedSamples[-25];\n    case 24: prediction += coefficients[23] * (ma_int64)pDecodedSamples[-24];\n    case 23: prediction += coefficients[22] * (ma_int64)pDecodedSamples[-23];\n    case 22: prediction += coefficients[21] * (ma_int64)pDecodedSamples[-22];\n    case 21: prediction += coefficients[20] * (ma_int64)pDecodedSamples[-21];\n    case 20: prediction += coefficients[19] * (ma_int64)pDecodedSamples[-20];\n    case 19: prediction += coefficients[18] * (ma_int64)pDecodedSamples[-19];\n    case 18: prediction += coefficients[17] * (ma_int64)pDecodedSamples[-18];\n    case 17: prediction += coefficients[16] * (ma_int64)pDecodedSamples[-17];\n    case 16: prediction += coefficients[15] * (ma_int64)pDecodedSamples[-16];\n    case 15: prediction += coefficients[14] * (ma_int64)pDecodedSamples[-15];\n    case 14: prediction += coefficients[13] * (ma_int64)pDecodedSamples[-14];\n    case 13: prediction += coefficients[12] * (ma_int64)pDecodedSamples[-13];\n    case 12: prediction += coefficients[11] * (ma_int64)pDecodedSamples[-12];\n    case 11: prediction += coefficients[10] * (ma_int64)pDecodedSamples[-11];\n    case 10: prediction += coefficients[ 9] * (ma_int64)pDecodedSamples[-10];\n    case  9: prediction += coefficients[ 8] * (ma_int64)pDecodedSamples[- 9];\n    case  8: prediction += coefficients[ 7] * (ma_int64)pDecodedSamples[- 8];\n    case  7: prediction += coefficients[ 6] * (ma_int64)pDecodedSamples[- 7];\n    case  6: prediction += coefficients[ 5] * (ma_int64)pDecodedSamples[- 6];\n    case  5: prediction += coefficients[ 4] * (ma_int64)pDecodedSamples[- 5];\n    case  4: prediction += coefficients[ 3] * (ma_int64)pDecodedSamples[- 4];\n    case  3: prediction += coefficients[ 2] * (ma_int64)pDecodedSamples[- 3];\n    case  2: prediction += coefficients[ 1] * (ma_int64)pDecodedSamples[- 2];\n    case  1: prediction += coefficients[ 0] * (ma_int64)pDecodedSamples[- 1];\n    }\n#endif\n    return (ma_int32)(prediction >> shift);\n}\n#if 0\nstatic ma_bool32 ma_dr_flac__decode_samples_with_residual__rice__reference(ma_dr_flac_bs* bs, ma_uint32 bitsPerSample, ma_uint32 count, ma_uint8 riceParam, ma_uint32 lpcOrder, ma_int32 lpcShift, ma_uint32 lpcPrecision, const ma_int32* coefficients, ma_int32* pSamplesOut)\n{\n    ma_uint32 i;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(pSamplesOut != NULL);\n    for (i = 0; i < count; ++i) {\n        ma_uint32 zeroCounter = 0;\n        for (;;) {\n            ma_uint8 bit;\n            if (!ma_dr_flac__read_uint8(bs, 1, &bit)) {\n                return MA_FALSE;\n            }\n            if (bit == 0) {\n                zeroCounter += 1;\n            } else {\n                break;\n            }\n        }\n        ma_uint32 decodedRice;\n        if (riceParam > 0) {\n            if (!ma_dr_flac__read_uint32(bs, riceParam, &decodedRice)) {\n                return MA_FALSE;\n            }\n        } else {\n            decodedRice = 0;\n        }\n        decodedRice |= (zeroCounter << riceParam);\n        if ((decodedRice & 0x01)) {\n            decodedRice = ~(decodedRice >> 1);\n        } else {\n            decodedRice =  (decodedRice >> 1);\n        }\n        if (ma_dr_flac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) {\n            pSamplesOut[i] = decodedRice + ma_dr_flac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + i);\n        } else {\n            pSamplesOut[i] = decodedRice + ma_dr_flac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + i);\n        }\n    }\n    return MA_TRUE;\n}\n#endif\n#if 0\nstatic ma_bool32 ma_dr_flac__read_rice_parts__reference(ma_dr_flac_bs* bs, ma_uint8 riceParam, ma_uint32* pZeroCounterOut, ma_uint32* pRiceParamPartOut)\n{\n    ma_uint32 zeroCounter = 0;\n    ma_uint32 decodedRice;\n    for (;;) {\n        ma_uint8 bit;\n        if (!ma_dr_flac__read_uint8(bs, 1, &bit)) {\n            return MA_FALSE;\n        }\n        if (bit == 0) {\n            zeroCounter += 1;\n        } else {\n            break;\n        }\n    }\n    if (riceParam > 0) {\n        if (!ma_dr_flac__read_uint32(bs, riceParam, &decodedRice)) {\n            return MA_FALSE;\n        }\n    } else {\n        decodedRice = 0;\n    }\n    *pZeroCounterOut = zeroCounter;\n    *pRiceParamPartOut = decodedRice;\n    return MA_TRUE;\n}\n#endif\n#if 0\nstatic MA_INLINE ma_bool32 ma_dr_flac__read_rice_parts(ma_dr_flac_bs* bs, ma_uint8 riceParam, ma_uint32* pZeroCounterOut, ma_uint32* pRiceParamPartOut)\n{\n    ma_dr_flac_cache_t riceParamMask;\n    ma_uint32 zeroCounter;\n    ma_uint32 setBitOffsetPlus1;\n    ma_uint32 riceParamPart;\n    ma_uint32 riceLength;\n    MA_DR_FLAC_ASSERT(riceParam > 0);\n    riceParamMask = MA_DR_FLAC_CACHE_L1_SELECTION_MASK(riceParam);\n    zeroCounter = 0;\n    while (bs->cache == 0) {\n        zeroCounter += (ma_uint32)MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs);\n        if (!ma_dr_flac__reload_cache(bs)) {\n            return MA_FALSE;\n        }\n    }\n    setBitOffsetPlus1 = ma_dr_flac__clz(bs->cache);\n    zeroCounter += setBitOffsetPlus1;\n    setBitOffsetPlus1 += 1;\n    riceLength = setBitOffsetPlus1 + riceParam;\n    if (riceLength < MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs)) {\n        riceParamPart = (ma_uint32)((bs->cache & (riceParamMask >> setBitOffsetPlus1)) >> MA_DR_FLAC_CACHE_L1_SELECTION_SHIFT(bs, riceLength));\n        bs->consumedBits += riceLength;\n        bs->cache <<= riceLength;\n    } else {\n        ma_uint32 bitCountLo;\n        ma_dr_flac_cache_t resultHi;\n        bs->consumedBits += riceLength;\n        bs->cache <<= setBitOffsetPlus1 & (MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs)-1);\n        bitCountLo = bs->consumedBits - MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs);\n        resultHi = MA_DR_FLAC_CACHE_L1_SELECT_AND_SHIFT(bs, riceParam);\n        if (bs->nextL2Line < MA_DR_FLAC_CACHE_L2_LINE_COUNT(bs)) {\n#ifndef MA_DR_FLAC_NO_CRC\n            ma_dr_flac__update_crc16(bs);\n#endif\n            bs->cache = ma_dr_flac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]);\n            bs->consumedBits = 0;\n#ifndef MA_DR_FLAC_NO_CRC\n            bs->crc16Cache = bs->cache;\n#endif\n        } else {\n            if (!ma_dr_flac__reload_cache(bs)) {\n                return MA_FALSE;\n            }\n            if (bitCountLo > MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs)) {\n                return MA_FALSE;\n            }\n        }\n        riceParamPart = (ma_uint32)(resultHi | MA_DR_FLAC_CACHE_L1_SELECT_AND_SHIFT_SAFE(bs, bitCountLo));\n        bs->consumedBits += bitCountLo;\n        bs->cache <<= bitCountLo;\n    }\n    pZeroCounterOut[0] = zeroCounter;\n    pRiceParamPartOut[0] = riceParamPart;\n    return MA_TRUE;\n}\n#endif\nstatic MA_INLINE ma_bool32 ma_dr_flac__read_rice_parts_x1(ma_dr_flac_bs* bs, ma_uint8 riceParam, ma_uint32* pZeroCounterOut, ma_uint32* pRiceParamPartOut)\n{\n    ma_uint32  riceParamPlus1 = riceParam + 1;\n    ma_uint32  riceParamPlus1Shift = MA_DR_FLAC_CACHE_L1_SELECTION_SHIFT(bs, riceParamPlus1);\n    ma_uint32  riceParamPlus1MaxConsumedBits = MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs) - riceParamPlus1;\n    ma_dr_flac_cache_t bs_cache = bs->cache;\n    ma_uint32  bs_consumedBits = bs->consumedBits;\n    ma_uint32  lzcount = ma_dr_flac__clz(bs_cache);\n    if (lzcount < sizeof(bs_cache)*8) {\n        pZeroCounterOut[0] = lzcount;\n    extract_rice_param_part:\n        bs_cache       <<= lzcount;\n        bs_consumedBits += lzcount;\n        if (bs_consumedBits <= riceParamPlus1MaxConsumedBits) {\n            pRiceParamPartOut[0] = (ma_uint32)(bs_cache >> riceParamPlus1Shift);\n            bs_cache       <<= riceParamPlus1;\n            bs_consumedBits += riceParamPlus1;\n        } else {\n            ma_uint32 riceParamPartHi;\n            ma_uint32 riceParamPartLo;\n            ma_uint32 riceParamPartLoBitCount;\n            riceParamPartHi = (ma_uint32)(bs_cache >> riceParamPlus1Shift);\n            riceParamPartLoBitCount = bs_consumedBits - riceParamPlus1MaxConsumedBits;\n            MA_DR_FLAC_ASSERT(riceParamPartLoBitCount > 0 && riceParamPartLoBitCount < 32);\n            if (bs->nextL2Line < MA_DR_FLAC_CACHE_L2_LINE_COUNT(bs)) {\n            #ifndef MA_DR_FLAC_NO_CRC\n                ma_dr_flac__update_crc16(bs);\n            #endif\n                bs_cache = ma_dr_flac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]);\n                bs_consumedBits = riceParamPartLoBitCount;\n            #ifndef MA_DR_FLAC_NO_CRC\n                bs->crc16Cache = bs_cache;\n            #endif\n            } else {\n                if (!ma_dr_flac__reload_cache(bs)) {\n                    return MA_FALSE;\n                }\n                if (riceParamPartLoBitCount > MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs)) {\n                    return MA_FALSE;\n                }\n                bs_cache = bs->cache;\n                bs_consumedBits = bs->consumedBits + riceParamPartLoBitCount;\n            }\n            riceParamPartLo = (ma_uint32)(bs_cache >> (MA_DR_FLAC_CACHE_L1_SELECTION_SHIFT(bs, riceParamPartLoBitCount)));\n            pRiceParamPartOut[0] = riceParamPartHi | riceParamPartLo;\n            bs_cache <<= riceParamPartLoBitCount;\n        }\n    } else {\n        ma_uint32 zeroCounter = (ma_uint32)(MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs) - bs_consumedBits);\n        for (;;) {\n            if (bs->nextL2Line < MA_DR_FLAC_CACHE_L2_LINE_COUNT(bs)) {\n            #ifndef MA_DR_FLAC_NO_CRC\n                ma_dr_flac__update_crc16(bs);\n            #endif\n                bs_cache = ma_dr_flac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]);\n                bs_consumedBits = 0;\n            #ifndef MA_DR_FLAC_NO_CRC\n                bs->crc16Cache = bs_cache;\n            #endif\n            } else {\n                if (!ma_dr_flac__reload_cache(bs)) {\n                    return MA_FALSE;\n                }\n                bs_cache = bs->cache;\n                bs_consumedBits = bs->consumedBits;\n            }\n            lzcount = ma_dr_flac__clz(bs_cache);\n            zeroCounter += lzcount;\n            if (lzcount < sizeof(bs_cache)*8) {\n                break;\n            }\n        }\n        pZeroCounterOut[0] = zeroCounter;\n        goto extract_rice_param_part;\n    }\n    bs->cache = bs_cache;\n    bs->consumedBits = bs_consumedBits;\n    return MA_TRUE;\n}\nstatic MA_INLINE ma_bool32 ma_dr_flac__seek_rice_parts(ma_dr_flac_bs* bs, ma_uint8 riceParam)\n{\n    ma_uint32  riceParamPlus1 = riceParam + 1;\n    ma_uint32  riceParamPlus1MaxConsumedBits = MA_DR_FLAC_CACHE_L1_SIZE_BITS(bs) - riceParamPlus1;\n    ma_dr_flac_cache_t bs_cache = bs->cache;\n    ma_uint32  bs_consumedBits = bs->consumedBits;\n    ma_uint32  lzcount = ma_dr_flac__clz(bs_cache);\n    if (lzcount < sizeof(bs_cache)*8) {\n    extract_rice_param_part:\n        bs_cache       <<= lzcount;\n        bs_consumedBits += lzcount;\n        if (bs_consumedBits <= riceParamPlus1MaxConsumedBits) {\n            bs_cache       <<= riceParamPlus1;\n            bs_consumedBits += riceParamPlus1;\n        } else {\n            ma_uint32 riceParamPartLoBitCount = bs_consumedBits - riceParamPlus1MaxConsumedBits;\n            MA_DR_FLAC_ASSERT(riceParamPartLoBitCount > 0 && riceParamPartLoBitCount < 32);\n            if (bs->nextL2Line < MA_DR_FLAC_CACHE_L2_LINE_COUNT(bs)) {\n            #ifndef MA_DR_FLAC_NO_CRC\n                ma_dr_flac__update_crc16(bs);\n            #endif\n                bs_cache = ma_dr_flac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]);\n                bs_consumedBits = riceParamPartLoBitCount;\n            #ifndef MA_DR_FLAC_NO_CRC\n                bs->crc16Cache = bs_cache;\n            #endif\n            } else {\n                if (!ma_dr_flac__reload_cache(bs)) {\n                    return MA_FALSE;\n                }\n                if (riceParamPartLoBitCount > MA_DR_FLAC_CACHE_L1_BITS_REMAINING(bs)) {\n                    return MA_FALSE;\n                }\n                bs_cache = bs->cache;\n                bs_consumedBits = bs->consumedBits + riceParamPartLoBitCount;\n            }\n            bs_cache <<= riceParamPartLoBitCount;\n        }\n    } else {\n        for (;;) {\n            if (bs->nextL2Line < MA_DR_FLAC_CACHE_L2_LINE_COUNT(bs)) {\n            #ifndef MA_DR_FLAC_NO_CRC\n                ma_dr_flac__update_crc16(bs);\n            #endif\n                bs_cache = ma_dr_flac__be2host__cache_line(bs->cacheL2[bs->nextL2Line++]);\n                bs_consumedBits = 0;\n            #ifndef MA_DR_FLAC_NO_CRC\n                bs->crc16Cache = bs_cache;\n            #endif\n            } else {\n                if (!ma_dr_flac__reload_cache(bs)) {\n                    return MA_FALSE;\n                }\n                bs_cache = bs->cache;\n                bs_consumedBits = bs->consumedBits;\n            }\n            lzcount = ma_dr_flac__clz(bs_cache);\n            if (lzcount < sizeof(bs_cache)*8) {\n                break;\n            }\n        }\n        goto extract_rice_param_part;\n    }\n    bs->cache = bs_cache;\n    bs->consumedBits = bs_consumedBits;\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__decode_samples_with_residual__rice__scalar_zeroorder(ma_dr_flac_bs* bs, ma_uint32 bitsPerSample, ma_uint32 count, ma_uint8 riceParam, ma_uint32 order, ma_int32 shift, const ma_int32* coefficients, ma_int32* pSamplesOut)\n{\n    ma_uint32 t[2] = {0x00000000, 0xFFFFFFFF};\n    ma_uint32 zeroCountPart0;\n    ma_uint32 riceParamPart0;\n    ma_uint32 riceParamMask;\n    ma_uint32 i;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(pSamplesOut != NULL);\n    (void)bitsPerSample;\n    (void)order;\n    (void)shift;\n    (void)coefficients;\n    riceParamMask  = (ma_uint32)~((~0UL) << riceParam);\n    i = 0;\n    while (i < count) {\n        if (!ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0)) {\n            return MA_FALSE;\n        }\n        riceParamPart0 &= riceParamMask;\n        riceParamPart0 |= (zeroCountPart0 << riceParam);\n        riceParamPart0  = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01];\n        pSamplesOut[i] = riceParamPart0;\n        i += 1;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__decode_samples_with_residual__rice__scalar(ma_dr_flac_bs* bs, ma_uint32 bitsPerSample, ma_uint32 count, ma_uint8 riceParam, ma_uint32 lpcOrder, ma_int32 lpcShift, ma_uint32 lpcPrecision, const ma_int32* coefficients, ma_int32* pSamplesOut)\n{\n    ma_uint32 t[2] = {0x00000000, 0xFFFFFFFF};\n    ma_uint32 zeroCountPart0 = 0;\n    ma_uint32 zeroCountPart1 = 0;\n    ma_uint32 zeroCountPart2 = 0;\n    ma_uint32 zeroCountPart3 = 0;\n    ma_uint32 riceParamPart0 = 0;\n    ma_uint32 riceParamPart1 = 0;\n    ma_uint32 riceParamPart2 = 0;\n    ma_uint32 riceParamPart3 = 0;\n    ma_uint32 riceParamMask;\n    const ma_int32* pSamplesOutEnd;\n    ma_uint32 i;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(pSamplesOut != NULL);\n    if (lpcOrder == 0) {\n        return ma_dr_flac__decode_samples_with_residual__rice__scalar_zeroorder(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut);\n    }\n    riceParamMask  = (ma_uint32)~((~0UL) << riceParam);\n    pSamplesOutEnd = pSamplesOut + (count & ~3);\n    if (ma_dr_flac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) {\n        while (pSamplesOut < pSamplesOutEnd) {\n            if (!ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0) ||\n                !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountPart1, &riceParamPart1) ||\n                !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountPart2, &riceParamPart2) ||\n                !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountPart3, &riceParamPart3)) {\n                return MA_FALSE;\n            }\n            riceParamPart0 &= riceParamMask;\n            riceParamPart1 &= riceParamMask;\n            riceParamPart2 &= riceParamMask;\n            riceParamPart3 &= riceParamMask;\n            riceParamPart0 |= (zeroCountPart0 << riceParam);\n            riceParamPart1 |= (zeroCountPart1 << riceParam);\n            riceParamPart2 |= (zeroCountPart2 << riceParam);\n            riceParamPart3 |= (zeroCountPart3 << riceParam);\n            riceParamPart0  = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01];\n            riceParamPart1  = (riceParamPart1 >> 1) ^ t[riceParamPart1 & 0x01];\n            riceParamPart2  = (riceParamPart2 >> 1) ^ t[riceParamPart2 & 0x01];\n            riceParamPart3  = (riceParamPart3 >> 1) ^ t[riceParamPart3 & 0x01];\n            pSamplesOut[0] = riceParamPart0 + ma_dr_flac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 0);\n            pSamplesOut[1] = riceParamPart1 + ma_dr_flac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 1);\n            pSamplesOut[2] = riceParamPart2 + ma_dr_flac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 2);\n            pSamplesOut[3] = riceParamPart3 + ma_dr_flac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 3);\n            pSamplesOut += 4;\n        }\n    } else {\n        while (pSamplesOut < pSamplesOutEnd) {\n            if (!ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0) ||\n                !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountPart1, &riceParamPart1) ||\n                !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountPart2, &riceParamPart2) ||\n                !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountPart3, &riceParamPart3)) {\n                return MA_FALSE;\n            }\n            riceParamPart0 &= riceParamMask;\n            riceParamPart1 &= riceParamMask;\n            riceParamPart2 &= riceParamMask;\n            riceParamPart3 &= riceParamMask;\n            riceParamPart0 |= (zeroCountPart0 << riceParam);\n            riceParamPart1 |= (zeroCountPart1 << riceParam);\n            riceParamPart2 |= (zeroCountPart2 << riceParam);\n            riceParamPart3 |= (zeroCountPart3 << riceParam);\n            riceParamPart0  = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01];\n            riceParamPart1  = (riceParamPart1 >> 1) ^ t[riceParamPart1 & 0x01];\n            riceParamPart2  = (riceParamPart2 >> 1) ^ t[riceParamPart2 & 0x01];\n            riceParamPart3  = (riceParamPart3 >> 1) ^ t[riceParamPart3 & 0x01];\n            pSamplesOut[0] = riceParamPart0 + ma_dr_flac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 0);\n            pSamplesOut[1] = riceParamPart1 + ma_dr_flac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 1);\n            pSamplesOut[2] = riceParamPart2 + ma_dr_flac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 2);\n            pSamplesOut[3] = riceParamPart3 + ma_dr_flac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 3);\n            pSamplesOut += 4;\n        }\n    }\n    i = (count & ~3);\n    while (i < count) {\n        if (!ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountPart0, &riceParamPart0)) {\n            return MA_FALSE;\n        }\n        riceParamPart0 &= riceParamMask;\n        riceParamPart0 |= (zeroCountPart0 << riceParam);\n        riceParamPart0  = (riceParamPart0 >> 1) ^ t[riceParamPart0 & 0x01];\n        if (ma_dr_flac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) {\n            pSamplesOut[0] = riceParamPart0 + ma_dr_flac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + 0);\n        } else {\n            pSamplesOut[0] = riceParamPart0 + ma_dr_flac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + 0);\n        }\n        i += 1;\n        pSamplesOut += 1;\n    }\n    return MA_TRUE;\n}\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\nstatic MA_INLINE __m128i ma_dr_flac__mm_packs_interleaved_epi32(__m128i a, __m128i b)\n{\n    __m128i r;\n    r = _mm_packs_epi32(a, b);\n    r = _mm_shuffle_epi32(r, _MM_SHUFFLE(3, 1, 2, 0));\n    r = _mm_shufflehi_epi16(r, _MM_SHUFFLE(3, 1, 2, 0));\n    r = _mm_shufflelo_epi16(r, _MM_SHUFFLE(3, 1, 2, 0));\n    return r;\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_SSE41)\nstatic MA_INLINE __m128i ma_dr_flac__mm_not_si128(__m128i a)\n{\n    return _mm_xor_si128(a, _mm_cmpeq_epi32(_mm_setzero_si128(), _mm_setzero_si128()));\n}\nstatic MA_INLINE __m128i ma_dr_flac__mm_hadd_epi32(__m128i x)\n{\n    __m128i x64 = _mm_add_epi32(x, _mm_shuffle_epi32(x, _MM_SHUFFLE(1, 0, 3, 2)));\n    __m128i x32 = _mm_shufflelo_epi16(x64, _MM_SHUFFLE(1, 0, 3, 2));\n    return _mm_add_epi32(x64, x32);\n}\nstatic MA_INLINE __m128i ma_dr_flac__mm_hadd_epi64(__m128i x)\n{\n    return _mm_add_epi64(x, _mm_shuffle_epi32(x, _MM_SHUFFLE(1, 0, 3, 2)));\n}\nstatic MA_INLINE __m128i ma_dr_flac__mm_srai_epi64(__m128i x, int count)\n{\n    __m128i lo = _mm_srli_epi64(x, count);\n    __m128i hi = _mm_srai_epi32(x, count);\n    hi = _mm_and_si128(hi, _mm_set_epi32(0xFFFFFFFF, 0, 0xFFFFFFFF, 0));\n    return _mm_or_si128(lo, hi);\n}\nstatic ma_bool32 ma_dr_flac__decode_samples_with_residual__rice__sse41_32(ma_dr_flac_bs* bs, ma_uint32 count, ma_uint8 riceParam, ma_uint32 order, ma_int32 shift, const ma_int32* coefficients, ma_int32* pSamplesOut)\n{\n    int i;\n    ma_uint32 riceParamMask;\n    ma_int32* pDecodedSamples    = pSamplesOut;\n    ma_int32* pDecodedSamplesEnd = pSamplesOut + (count & ~3);\n    ma_uint32 zeroCountParts0 = 0;\n    ma_uint32 zeroCountParts1 = 0;\n    ma_uint32 zeroCountParts2 = 0;\n    ma_uint32 zeroCountParts3 = 0;\n    ma_uint32 riceParamParts0 = 0;\n    ma_uint32 riceParamParts1 = 0;\n    ma_uint32 riceParamParts2 = 0;\n    ma_uint32 riceParamParts3 = 0;\n    __m128i coefficients128_0;\n    __m128i coefficients128_4;\n    __m128i coefficients128_8;\n    __m128i samples128_0;\n    __m128i samples128_4;\n    __m128i samples128_8;\n    __m128i riceParamMask128;\n    const ma_uint32 t[2] = {0x00000000, 0xFFFFFFFF};\n    riceParamMask    = (ma_uint32)~((~0UL) << riceParam);\n    riceParamMask128 = _mm_set1_epi32(riceParamMask);\n    coefficients128_0 = _mm_setzero_si128();\n    coefficients128_4 = _mm_setzero_si128();\n    coefficients128_8 = _mm_setzero_si128();\n    samples128_0 = _mm_setzero_si128();\n    samples128_4 = _mm_setzero_si128();\n    samples128_8 = _mm_setzero_si128();\n#if 1\n    {\n        int runningOrder = order;\n        if (runningOrder >= 4) {\n            coefficients128_0 = _mm_loadu_si128((const __m128i*)(coefficients + 0));\n            samples128_0      = _mm_loadu_si128((const __m128i*)(pSamplesOut  - 4));\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: coefficients128_0 = _mm_set_epi32(0, coefficients[2], coefficients[1], coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], pSamplesOut[-2], pSamplesOut[-3], 0); break;\n                case 2: coefficients128_0 = _mm_set_epi32(0, 0,               coefficients[1], coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], pSamplesOut[-2], 0,               0); break;\n                case 1: coefficients128_0 = _mm_set_epi32(0, 0,               0,               coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], 0,               0,               0); break;\n            }\n            runningOrder = 0;\n        }\n        if (runningOrder >= 4) {\n            coefficients128_4 = _mm_loadu_si128((const __m128i*)(coefficients + 4));\n            samples128_4      = _mm_loadu_si128((const __m128i*)(pSamplesOut  - 8));\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: coefficients128_4 = _mm_set_epi32(0, coefficients[6], coefficients[5], coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], pSamplesOut[-6], pSamplesOut[-7], 0); break;\n                case 2: coefficients128_4 = _mm_set_epi32(0, 0,               coefficients[5], coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], pSamplesOut[-6], 0,               0); break;\n                case 1: coefficients128_4 = _mm_set_epi32(0, 0,               0,               coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], 0,               0,               0); break;\n            }\n            runningOrder = 0;\n        }\n        if (runningOrder == 4) {\n            coefficients128_8 = _mm_loadu_si128((const __m128i*)(coefficients + 8));\n            samples128_8      = _mm_loadu_si128((const __m128i*)(pSamplesOut  - 12));\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: coefficients128_8 = _mm_set_epi32(0, coefficients[10], coefficients[9], coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], pSamplesOut[-10], pSamplesOut[-11], 0); break;\n                case 2: coefficients128_8 = _mm_set_epi32(0, 0,                coefficients[9], coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], pSamplesOut[-10], 0,                0); break;\n                case 1: coefficients128_8 = _mm_set_epi32(0, 0,                0,               coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], 0,                0,                0); break;\n            }\n            runningOrder = 0;\n        }\n        coefficients128_0 = _mm_shuffle_epi32(coefficients128_0, _MM_SHUFFLE(0, 1, 2, 3));\n        coefficients128_4 = _mm_shuffle_epi32(coefficients128_4, _MM_SHUFFLE(0, 1, 2, 3));\n        coefficients128_8 = _mm_shuffle_epi32(coefficients128_8, _MM_SHUFFLE(0, 1, 2, 3));\n    }\n#else\n    switch (order)\n    {\n    case 12: ((ma_int32*)&coefficients128_8)[0] = coefficients[11]; ((ma_int32*)&samples128_8)[0] = pDecodedSamples[-12];\n    case 11: ((ma_int32*)&coefficients128_8)[1] = coefficients[10]; ((ma_int32*)&samples128_8)[1] = pDecodedSamples[-11];\n    case 10: ((ma_int32*)&coefficients128_8)[2] = coefficients[ 9]; ((ma_int32*)&samples128_8)[2] = pDecodedSamples[-10];\n    case 9:  ((ma_int32*)&coefficients128_8)[3] = coefficients[ 8]; ((ma_int32*)&samples128_8)[3] = pDecodedSamples[- 9];\n    case 8:  ((ma_int32*)&coefficients128_4)[0] = coefficients[ 7]; ((ma_int32*)&samples128_4)[0] = pDecodedSamples[- 8];\n    case 7:  ((ma_int32*)&coefficients128_4)[1] = coefficients[ 6]; ((ma_int32*)&samples128_4)[1] = pDecodedSamples[- 7];\n    case 6:  ((ma_int32*)&coefficients128_4)[2] = coefficients[ 5]; ((ma_int32*)&samples128_4)[2] = pDecodedSamples[- 6];\n    case 5:  ((ma_int32*)&coefficients128_4)[3] = coefficients[ 4]; ((ma_int32*)&samples128_4)[3] = pDecodedSamples[- 5];\n    case 4:  ((ma_int32*)&coefficients128_0)[0] = coefficients[ 3]; ((ma_int32*)&samples128_0)[0] = pDecodedSamples[- 4];\n    case 3:  ((ma_int32*)&coefficients128_0)[1] = coefficients[ 2]; ((ma_int32*)&samples128_0)[1] = pDecodedSamples[- 3];\n    case 2:  ((ma_int32*)&coefficients128_0)[2] = coefficients[ 1]; ((ma_int32*)&samples128_0)[2] = pDecodedSamples[- 2];\n    case 1:  ((ma_int32*)&coefficients128_0)[3] = coefficients[ 0]; ((ma_int32*)&samples128_0)[3] = pDecodedSamples[- 1];\n    }\n#endif\n    while (pDecodedSamples < pDecodedSamplesEnd) {\n        __m128i prediction128;\n        __m128i zeroCountPart128;\n        __m128i riceParamPart128;\n        if (!ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0) ||\n            !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts1, &riceParamParts1) ||\n            !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts2, &riceParamParts2) ||\n            !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts3, &riceParamParts3)) {\n            return MA_FALSE;\n        }\n        zeroCountPart128 = _mm_set_epi32(zeroCountParts3, zeroCountParts2, zeroCountParts1, zeroCountParts0);\n        riceParamPart128 = _mm_set_epi32(riceParamParts3, riceParamParts2, riceParamParts1, riceParamParts0);\n        riceParamPart128 = _mm_and_si128(riceParamPart128, riceParamMask128);\n        riceParamPart128 = _mm_or_si128(riceParamPart128, _mm_slli_epi32(zeroCountPart128, riceParam));\n        riceParamPart128 = _mm_xor_si128(_mm_srli_epi32(riceParamPart128, 1), _mm_add_epi32(ma_dr_flac__mm_not_si128(_mm_and_si128(riceParamPart128, _mm_set1_epi32(0x01))), _mm_set1_epi32(0x01)));\n        if (order <= 4) {\n            for (i = 0; i < 4; i += 1) {\n                prediction128 = _mm_mullo_epi32(coefficients128_0, samples128_0);\n                prediction128 = ma_dr_flac__mm_hadd_epi32(prediction128);\n                prediction128 = _mm_srai_epi32(prediction128, shift);\n                prediction128 = _mm_add_epi32(riceParamPart128, prediction128);\n                samples128_0 = _mm_alignr_epi8(prediction128, samples128_0, 4);\n                riceParamPart128 = _mm_alignr_epi8(_mm_setzero_si128(), riceParamPart128, 4);\n            }\n        } else if (order <= 8) {\n            for (i = 0; i < 4; i += 1) {\n                prediction128 =                              _mm_mullo_epi32(coefficients128_4, samples128_4);\n                prediction128 = _mm_add_epi32(prediction128, _mm_mullo_epi32(coefficients128_0, samples128_0));\n                prediction128 = ma_dr_flac__mm_hadd_epi32(prediction128);\n                prediction128 = _mm_srai_epi32(prediction128, shift);\n                prediction128 = _mm_add_epi32(riceParamPart128, prediction128);\n                samples128_4 = _mm_alignr_epi8(samples128_0,  samples128_4, 4);\n                samples128_0 = _mm_alignr_epi8(prediction128, samples128_0, 4);\n                riceParamPart128 = _mm_alignr_epi8(_mm_setzero_si128(), riceParamPart128, 4);\n            }\n        } else {\n            for (i = 0; i < 4; i += 1) {\n                prediction128 =                              _mm_mullo_epi32(coefficients128_8, samples128_8);\n                prediction128 = _mm_add_epi32(prediction128, _mm_mullo_epi32(coefficients128_4, samples128_4));\n                prediction128 = _mm_add_epi32(prediction128, _mm_mullo_epi32(coefficients128_0, samples128_0));\n                prediction128 = ma_dr_flac__mm_hadd_epi32(prediction128);\n                prediction128 = _mm_srai_epi32(prediction128, shift);\n                prediction128 = _mm_add_epi32(riceParamPart128, prediction128);\n                samples128_8 = _mm_alignr_epi8(samples128_4,  samples128_8, 4);\n                samples128_4 = _mm_alignr_epi8(samples128_0,  samples128_4, 4);\n                samples128_0 = _mm_alignr_epi8(prediction128, samples128_0, 4);\n                riceParamPart128 = _mm_alignr_epi8(_mm_setzero_si128(), riceParamPart128, 4);\n            }\n        }\n        _mm_storeu_si128((__m128i*)pDecodedSamples, samples128_0);\n        pDecodedSamples += 4;\n    }\n    i = (count & ~3);\n    while (i < (int)count) {\n        if (!ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0)) {\n            return MA_FALSE;\n        }\n        riceParamParts0 &= riceParamMask;\n        riceParamParts0 |= (zeroCountParts0 << riceParam);\n        riceParamParts0  = (riceParamParts0 >> 1) ^ t[riceParamParts0 & 0x01];\n        pDecodedSamples[0] = riceParamParts0 + ma_dr_flac__calculate_prediction_32(order, shift, coefficients, pDecodedSamples);\n        i += 1;\n        pDecodedSamples += 1;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__decode_samples_with_residual__rice__sse41_64(ma_dr_flac_bs* bs, ma_uint32 count, ma_uint8 riceParam, ma_uint32 order, ma_int32 shift, const ma_int32* coefficients, ma_int32* pSamplesOut)\n{\n    int i;\n    ma_uint32 riceParamMask;\n    ma_int32* pDecodedSamples    = pSamplesOut;\n    ma_int32* pDecodedSamplesEnd = pSamplesOut + (count & ~3);\n    ma_uint32 zeroCountParts0 = 0;\n    ma_uint32 zeroCountParts1 = 0;\n    ma_uint32 zeroCountParts2 = 0;\n    ma_uint32 zeroCountParts3 = 0;\n    ma_uint32 riceParamParts0 = 0;\n    ma_uint32 riceParamParts1 = 0;\n    ma_uint32 riceParamParts2 = 0;\n    ma_uint32 riceParamParts3 = 0;\n    __m128i coefficients128_0;\n    __m128i coefficients128_4;\n    __m128i coefficients128_8;\n    __m128i samples128_0;\n    __m128i samples128_4;\n    __m128i samples128_8;\n    __m128i prediction128;\n    __m128i riceParamMask128;\n    const ma_uint32 t[2] = {0x00000000, 0xFFFFFFFF};\n    MA_DR_FLAC_ASSERT(order <= 12);\n    riceParamMask    = (ma_uint32)~((~0UL) << riceParam);\n    riceParamMask128 = _mm_set1_epi32(riceParamMask);\n    prediction128 = _mm_setzero_si128();\n    coefficients128_0  = _mm_setzero_si128();\n    coefficients128_4  = _mm_setzero_si128();\n    coefficients128_8  = _mm_setzero_si128();\n    samples128_0  = _mm_setzero_si128();\n    samples128_4  = _mm_setzero_si128();\n    samples128_8  = _mm_setzero_si128();\n#if 1\n    {\n        int runningOrder = order;\n        if (runningOrder >= 4) {\n            coefficients128_0 = _mm_loadu_si128((const __m128i*)(coefficients + 0));\n            samples128_0      = _mm_loadu_si128((const __m128i*)(pSamplesOut  - 4));\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: coefficients128_0 = _mm_set_epi32(0, coefficients[2], coefficients[1], coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], pSamplesOut[-2], pSamplesOut[-3], 0); break;\n                case 2: coefficients128_0 = _mm_set_epi32(0, 0,               coefficients[1], coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], pSamplesOut[-2], 0,               0); break;\n                case 1: coefficients128_0 = _mm_set_epi32(0, 0,               0,               coefficients[0]); samples128_0 = _mm_set_epi32(pSamplesOut[-1], 0,               0,               0); break;\n            }\n            runningOrder = 0;\n        }\n        if (runningOrder >= 4) {\n            coefficients128_4 = _mm_loadu_si128((const __m128i*)(coefficients + 4));\n            samples128_4      = _mm_loadu_si128((const __m128i*)(pSamplesOut  - 8));\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: coefficients128_4 = _mm_set_epi32(0, coefficients[6], coefficients[5], coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], pSamplesOut[-6], pSamplesOut[-7], 0); break;\n                case 2: coefficients128_4 = _mm_set_epi32(0, 0,               coefficients[5], coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], pSamplesOut[-6], 0,               0); break;\n                case 1: coefficients128_4 = _mm_set_epi32(0, 0,               0,               coefficients[4]); samples128_4 = _mm_set_epi32(pSamplesOut[-5], 0,               0,               0); break;\n            }\n            runningOrder = 0;\n        }\n        if (runningOrder == 4) {\n            coefficients128_8 = _mm_loadu_si128((const __m128i*)(coefficients + 8));\n            samples128_8      = _mm_loadu_si128((const __m128i*)(pSamplesOut  - 12));\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: coefficients128_8 = _mm_set_epi32(0, coefficients[10], coefficients[9], coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], pSamplesOut[-10], pSamplesOut[-11], 0); break;\n                case 2: coefficients128_8 = _mm_set_epi32(0, 0,                coefficients[9], coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], pSamplesOut[-10], 0,                0); break;\n                case 1: coefficients128_8 = _mm_set_epi32(0, 0,                0,               coefficients[8]); samples128_8 = _mm_set_epi32(pSamplesOut[-9], 0,                0,                0); break;\n            }\n            runningOrder = 0;\n        }\n        coefficients128_0 = _mm_shuffle_epi32(coefficients128_0, _MM_SHUFFLE(0, 1, 2, 3));\n        coefficients128_4 = _mm_shuffle_epi32(coefficients128_4, _MM_SHUFFLE(0, 1, 2, 3));\n        coefficients128_8 = _mm_shuffle_epi32(coefficients128_8, _MM_SHUFFLE(0, 1, 2, 3));\n    }\n#else\n    switch (order)\n    {\n    case 12: ((ma_int32*)&coefficients128_8)[0] = coefficients[11]; ((ma_int32*)&samples128_8)[0] = pDecodedSamples[-12];\n    case 11: ((ma_int32*)&coefficients128_8)[1] = coefficients[10]; ((ma_int32*)&samples128_8)[1] = pDecodedSamples[-11];\n    case 10: ((ma_int32*)&coefficients128_8)[2] = coefficients[ 9]; ((ma_int32*)&samples128_8)[2] = pDecodedSamples[-10];\n    case 9:  ((ma_int32*)&coefficients128_8)[3] = coefficients[ 8]; ((ma_int32*)&samples128_8)[3] = pDecodedSamples[- 9];\n    case 8:  ((ma_int32*)&coefficients128_4)[0] = coefficients[ 7]; ((ma_int32*)&samples128_4)[0] = pDecodedSamples[- 8];\n    case 7:  ((ma_int32*)&coefficients128_4)[1] = coefficients[ 6]; ((ma_int32*)&samples128_4)[1] = pDecodedSamples[- 7];\n    case 6:  ((ma_int32*)&coefficients128_4)[2] = coefficients[ 5]; ((ma_int32*)&samples128_4)[2] = pDecodedSamples[- 6];\n    case 5:  ((ma_int32*)&coefficients128_4)[3] = coefficients[ 4]; ((ma_int32*)&samples128_4)[3] = pDecodedSamples[- 5];\n    case 4:  ((ma_int32*)&coefficients128_0)[0] = coefficients[ 3]; ((ma_int32*)&samples128_0)[0] = pDecodedSamples[- 4];\n    case 3:  ((ma_int32*)&coefficients128_0)[1] = coefficients[ 2]; ((ma_int32*)&samples128_0)[1] = pDecodedSamples[- 3];\n    case 2:  ((ma_int32*)&coefficients128_0)[2] = coefficients[ 1]; ((ma_int32*)&samples128_0)[2] = pDecodedSamples[- 2];\n    case 1:  ((ma_int32*)&coefficients128_0)[3] = coefficients[ 0]; ((ma_int32*)&samples128_0)[3] = pDecodedSamples[- 1];\n    }\n#endif\n    while (pDecodedSamples < pDecodedSamplesEnd) {\n        __m128i zeroCountPart128;\n        __m128i riceParamPart128;\n        if (!ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0) ||\n            !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts1, &riceParamParts1) ||\n            !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts2, &riceParamParts2) ||\n            !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts3, &riceParamParts3)) {\n            return MA_FALSE;\n        }\n        zeroCountPart128 = _mm_set_epi32(zeroCountParts3, zeroCountParts2, zeroCountParts1, zeroCountParts0);\n        riceParamPart128 = _mm_set_epi32(riceParamParts3, riceParamParts2, riceParamParts1, riceParamParts0);\n        riceParamPart128 = _mm_and_si128(riceParamPart128, riceParamMask128);\n        riceParamPart128 = _mm_or_si128(riceParamPart128, _mm_slli_epi32(zeroCountPart128, riceParam));\n        riceParamPart128 = _mm_xor_si128(_mm_srli_epi32(riceParamPart128, 1), _mm_add_epi32(ma_dr_flac__mm_not_si128(_mm_and_si128(riceParamPart128, _mm_set1_epi32(1))), _mm_set1_epi32(1)));\n        for (i = 0; i < 4; i += 1) {\n            prediction128 = _mm_xor_si128(prediction128, prediction128);\n            switch (order)\n            {\n            case 12:\n            case 11: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_8, _MM_SHUFFLE(1, 1, 0, 0)), _mm_shuffle_epi32(samples128_8, _MM_SHUFFLE(1, 1, 0, 0))));\n            case 10:\n            case  9: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_8, _MM_SHUFFLE(3, 3, 2, 2)), _mm_shuffle_epi32(samples128_8, _MM_SHUFFLE(3, 3, 2, 2))));\n            case  8:\n            case  7: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_4, _MM_SHUFFLE(1, 1, 0, 0)), _mm_shuffle_epi32(samples128_4, _MM_SHUFFLE(1, 1, 0, 0))));\n            case  6:\n            case  5: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_4, _MM_SHUFFLE(3, 3, 2, 2)), _mm_shuffle_epi32(samples128_4, _MM_SHUFFLE(3, 3, 2, 2))));\n            case  4:\n            case  3: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_0, _MM_SHUFFLE(1, 1, 0, 0)), _mm_shuffle_epi32(samples128_0, _MM_SHUFFLE(1, 1, 0, 0))));\n            case  2:\n            case  1: prediction128 = _mm_add_epi64(prediction128, _mm_mul_epi32(_mm_shuffle_epi32(coefficients128_0, _MM_SHUFFLE(3, 3, 2, 2)), _mm_shuffle_epi32(samples128_0, _MM_SHUFFLE(3, 3, 2, 2))));\n            }\n            prediction128 = ma_dr_flac__mm_hadd_epi64(prediction128);\n            prediction128 = ma_dr_flac__mm_srai_epi64(prediction128, shift);\n            prediction128 = _mm_add_epi32(riceParamPart128, prediction128);\n            samples128_8 = _mm_alignr_epi8(samples128_4,  samples128_8, 4);\n            samples128_4 = _mm_alignr_epi8(samples128_0,  samples128_4, 4);\n            samples128_0 = _mm_alignr_epi8(prediction128, samples128_0, 4);\n            riceParamPart128 = _mm_alignr_epi8(_mm_setzero_si128(), riceParamPart128, 4);\n        }\n        _mm_storeu_si128((__m128i*)pDecodedSamples, samples128_0);\n        pDecodedSamples += 4;\n    }\n    i = (count & ~3);\n    while (i < (int)count) {\n        if (!ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts0, &riceParamParts0)) {\n            return MA_FALSE;\n        }\n        riceParamParts0 &= riceParamMask;\n        riceParamParts0 |= (zeroCountParts0 << riceParam);\n        riceParamParts0  = (riceParamParts0 >> 1) ^ t[riceParamParts0 & 0x01];\n        pDecodedSamples[0] = riceParamParts0 + ma_dr_flac__calculate_prediction_64(order, shift, coefficients, pDecodedSamples);\n        i += 1;\n        pDecodedSamples += 1;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__decode_samples_with_residual__rice__sse41(ma_dr_flac_bs* bs, ma_uint32 bitsPerSample, ma_uint32 count, ma_uint8 riceParam, ma_uint32 lpcOrder, ma_int32 lpcShift, ma_uint32 lpcPrecision, const ma_int32* coefficients, ma_int32* pSamplesOut)\n{\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(pSamplesOut != NULL);\n    if (lpcOrder > 0 && lpcOrder <= 12) {\n        if (ma_dr_flac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) {\n            return ma_dr_flac__decode_samples_with_residual__rice__sse41_64(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut);\n        } else {\n            return ma_dr_flac__decode_samples_with_residual__rice__sse41_32(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut);\n        }\n    } else {\n        return ma_dr_flac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut);\n    }\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\nstatic MA_INLINE void ma_dr_flac__vst2q_s32(ma_int32* p, int32x4x2_t x)\n{\n    vst1q_s32(p+0, x.val[0]);\n    vst1q_s32(p+4, x.val[1]);\n}\nstatic MA_INLINE void ma_dr_flac__vst2q_u32(ma_uint32* p, uint32x4x2_t x)\n{\n    vst1q_u32(p+0, x.val[0]);\n    vst1q_u32(p+4, x.val[1]);\n}\nstatic MA_INLINE void ma_dr_flac__vst2q_f32(float* p, float32x4x2_t x)\n{\n    vst1q_f32(p+0, x.val[0]);\n    vst1q_f32(p+4, x.val[1]);\n}\nstatic MA_INLINE void ma_dr_flac__vst2q_s16(ma_int16* p, int16x4x2_t x)\n{\n    vst1q_s16(p, vcombine_s16(x.val[0], x.val[1]));\n}\nstatic MA_INLINE void ma_dr_flac__vst2q_u16(ma_uint16* p, uint16x4x2_t x)\n{\n    vst1q_u16(p, vcombine_u16(x.val[0], x.val[1]));\n}\nstatic MA_INLINE int32x4_t ma_dr_flac__vdupq_n_s32x4(ma_int32 x3, ma_int32 x2, ma_int32 x1, ma_int32 x0)\n{\n    ma_int32 x[4];\n    x[3] = x3;\n    x[2] = x2;\n    x[1] = x1;\n    x[0] = x0;\n    return vld1q_s32(x);\n}\nstatic MA_INLINE int32x4_t ma_dr_flac__valignrq_s32_1(int32x4_t a, int32x4_t b)\n{\n    return vextq_s32(b, a, 1);\n}\nstatic MA_INLINE uint32x4_t ma_dr_flac__valignrq_u32_1(uint32x4_t a, uint32x4_t b)\n{\n    return vextq_u32(b, a, 1);\n}\nstatic MA_INLINE int32x2_t ma_dr_flac__vhaddq_s32(int32x4_t x)\n{\n    int32x2_t r = vadd_s32(vget_high_s32(x), vget_low_s32(x));\n    return vpadd_s32(r, r);\n}\nstatic MA_INLINE int64x1_t ma_dr_flac__vhaddq_s64(int64x2_t x)\n{\n    return vadd_s64(vget_high_s64(x), vget_low_s64(x));\n}\nstatic MA_INLINE int32x4_t ma_dr_flac__vrevq_s32(int32x4_t x)\n{\n    return vrev64q_s32(vcombine_s32(vget_high_s32(x), vget_low_s32(x)));\n}\nstatic MA_INLINE int32x4_t ma_dr_flac__vnotq_s32(int32x4_t x)\n{\n    return veorq_s32(x, vdupq_n_s32(0xFFFFFFFF));\n}\nstatic MA_INLINE uint32x4_t ma_dr_flac__vnotq_u32(uint32x4_t x)\n{\n    return veorq_u32(x, vdupq_n_u32(0xFFFFFFFF));\n}\nstatic ma_bool32 ma_dr_flac__decode_samples_with_residual__rice__neon_32(ma_dr_flac_bs* bs, ma_uint32 count, ma_uint8 riceParam, ma_uint32 order, ma_int32 shift, const ma_int32* coefficients, ma_int32* pSamplesOut)\n{\n    int i;\n    ma_uint32 riceParamMask;\n    ma_int32* pDecodedSamples    = pSamplesOut;\n    ma_int32* pDecodedSamplesEnd = pSamplesOut + (count & ~3);\n    ma_uint32 zeroCountParts[4];\n    ma_uint32 riceParamParts[4];\n    int32x4_t coefficients128_0;\n    int32x4_t coefficients128_4;\n    int32x4_t coefficients128_8;\n    int32x4_t samples128_0;\n    int32x4_t samples128_4;\n    int32x4_t samples128_8;\n    uint32x4_t riceParamMask128;\n    int32x4_t riceParam128;\n    int32x2_t shift64;\n    uint32x4_t one128;\n    const ma_uint32 t[2] = {0x00000000, 0xFFFFFFFF};\n    riceParamMask    = (ma_uint32)~((~0UL) << riceParam);\n    riceParamMask128 = vdupq_n_u32(riceParamMask);\n    riceParam128 = vdupq_n_s32(riceParam);\n    shift64 = vdup_n_s32(-shift);\n    one128 = vdupq_n_u32(1);\n    {\n        int runningOrder = order;\n        ma_int32 tempC[4] = {0, 0, 0, 0};\n        ma_int32 tempS[4] = {0, 0, 0, 0};\n        if (runningOrder >= 4) {\n            coefficients128_0 = vld1q_s32(coefficients + 0);\n            samples128_0      = vld1q_s32(pSamplesOut  - 4);\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: tempC[2] = coefficients[2]; tempS[1] = pSamplesOut[-3];\n                case 2: tempC[1] = coefficients[1]; tempS[2] = pSamplesOut[-2];\n                case 1: tempC[0] = coefficients[0]; tempS[3] = pSamplesOut[-1];\n            }\n            coefficients128_0 = vld1q_s32(tempC);\n            samples128_0      = vld1q_s32(tempS);\n            runningOrder = 0;\n        }\n        if (runningOrder >= 4) {\n            coefficients128_4 = vld1q_s32(coefficients + 4);\n            samples128_4      = vld1q_s32(pSamplesOut  - 8);\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: tempC[2] = coefficients[6]; tempS[1] = pSamplesOut[-7];\n                case 2: tempC[1] = coefficients[5]; tempS[2] = pSamplesOut[-6];\n                case 1: tempC[0] = coefficients[4]; tempS[3] = pSamplesOut[-5];\n            }\n            coefficients128_4 = vld1q_s32(tempC);\n            samples128_4      = vld1q_s32(tempS);\n            runningOrder = 0;\n        }\n        if (runningOrder == 4) {\n            coefficients128_8 = vld1q_s32(coefficients + 8);\n            samples128_8      = vld1q_s32(pSamplesOut  - 12);\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: tempC[2] = coefficients[10]; tempS[1] = pSamplesOut[-11];\n                case 2: tempC[1] = coefficients[ 9]; tempS[2] = pSamplesOut[-10];\n                case 1: tempC[0] = coefficients[ 8]; tempS[3] = pSamplesOut[- 9];\n            }\n            coefficients128_8 = vld1q_s32(tempC);\n            samples128_8      = vld1q_s32(tempS);\n            runningOrder = 0;\n        }\n        coefficients128_0 = ma_dr_flac__vrevq_s32(coefficients128_0);\n        coefficients128_4 = ma_dr_flac__vrevq_s32(coefficients128_4);\n        coefficients128_8 = ma_dr_flac__vrevq_s32(coefficients128_8);\n    }\n    while (pDecodedSamples < pDecodedSamplesEnd) {\n        int32x4_t prediction128;\n        int32x2_t prediction64;\n        uint32x4_t zeroCountPart128;\n        uint32x4_t riceParamPart128;\n        if (!ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0]) ||\n            !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[1], &riceParamParts[1]) ||\n            !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[2], &riceParamParts[2]) ||\n            !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[3], &riceParamParts[3])) {\n            return MA_FALSE;\n        }\n        zeroCountPart128 = vld1q_u32(zeroCountParts);\n        riceParamPart128 = vld1q_u32(riceParamParts);\n        riceParamPart128 = vandq_u32(riceParamPart128, riceParamMask128);\n        riceParamPart128 = vorrq_u32(riceParamPart128, vshlq_u32(zeroCountPart128, riceParam128));\n        riceParamPart128 = veorq_u32(vshrq_n_u32(riceParamPart128, 1), vaddq_u32(ma_dr_flac__vnotq_u32(vandq_u32(riceParamPart128, one128)), one128));\n        if (order <= 4) {\n            for (i = 0; i < 4; i += 1) {\n                prediction128 = vmulq_s32(coefficients128_0, samples128_0);\n                prediction64 = ma_dr_flac__vhaddq_s32(prediction128);\n                prediction64 = vshl_s32(prediction64, shift64);\n                prediction64 = vadd_s32(prediction64, vget_low_s32(vreinterpretq_s32_u32(riceParamPart128)));\n                samples128_0 = ma_dr_flac__valignrq_s32_1(vcombine_s32(prediction64, vdup_n_s32(0)), samples128_0);\n                riceParamPart128 = ma_dr_flac__valignrq_u32_1(vdupq_n_u32(0), riceParamPart128);\n            }\n        } else if (order <= 8) {\n            for (i = 0; i < 4; i += 1) {\n                prediction128 =                vmulq_s32(coefficients128_4, samples128_4);\n                prediction128 = vmlaq_s32(prediction128, coefficients128_0, samples128_0);\n                prediction64 = ma_dr_flac__vhaddq_s32(prediction128);\n                prediction64 = vshl_s32(prediction64, shift64);\n                prediction64 = vadd_s32(prediction64, vget_low_s32(vreinterpretq_s32_u32(riceParamPart128)));\n                samples128_4 = ma_dr_flac__valignrq_s32_1(samples128_0, samples128_4);\n                samples128_0 = ma_dr_flac__valignrq_s32_1(vcombine_s32(prediction64, vdup_n_s32(0)), samples128_0);\n                riceParamPart128 = ma_dr_flac__valignrq_u32_1(vdupq_n_u32(0), riceParamPart128);\n            }\n        } else {\n            for (i = 0; i < 4; i += 1) {\n                prediction128 =                vmulq_s32(coefficients128_8, samples128_8);\n                prediction128 = vmlaq_s32(prediction128, coefficients128_4, samples128_4);\n                prediction128 = vmlaq_s32(prediction128, coefficients128_0, samples128_0);\n                prediction64 = ma_dr_flac__vhaddq_s32(prediction128);\n                prediction64 = vshl_s32(prediction64, shift64);\n                prediction64 = vadd_s32(prediction64, vget_low_s32(vreinterpretq_s32_u32(riceParamPart128)));\n                samples128_8 = ma_dr_flac__valignrq_s32_1(samples128_4, samples128_8);\n                samples128_4 = ma_dr_flac__valignrq_s32_1(samples128_0, samples128_4);\n                samples128_0 = ma_dr_flac__valignrq_s32_1(vcombine_s32(prediction64, vdup_n_s32(0)), samples128_0);\n                riceParamPart128 = ma_dr_flac__valignrq_u32_1(vdupq_n_u32(0), riceParamPart128);\n            }\n        }\n        vst1q_s32(pDecodedSamples, samples128_0);\n        pDecodedSamples += 4;\n    }\n    i = (count & ~3);\n    while (i < (int)count) {\n        if (!ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0])) {\n            return MA_FALSE;\n        }\n        riceParamParts[0] &= riceParamMask;\n        riceParamParts[0] |= (zeroCountParts[0] << riceParam);\n        riceParamParts[0]  = (riceParamParts[0] >> 1) ^ t[riceParamParts[0] & 0x01];\n        pDecodedSamples[0] = riceParamParts[0] + ma_dr_flac__calculate_prediction_32(order, shift, coefficients, pDecodedSamples);\n        i += 1;\n        pDecodedSamples += 1;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__decode_samples_with_residual__rice__neon_64(ma_dr_flac_bs* bs, ma_uint32 count, ma_uint8 riceParam, ma_uint32 order, ma_int32 shift, const ma_int32* coefficients, ma_int32* pSamplesOut)\n{\n    int i;\n    ma_uint32 riceParamMask;\n    ma_int32* pDecodedSamples    = pSamplesOut;\n    ma_int32* pDecodedSamplesEnd = pSamplesOut + (count & ~3);\n    ma_uint32 zeroCountParts[4];\n    ma_uint32 riceParamParts[4];\n    int32x4_t coefficients128_0;\n    int32x4_t coefficients128_4;\n    int32x4_t coefficients128_8;\n    int32x4_t samples128_0;\n    int32x4_t samples128_4;\n    int32x4_t samples128_8;\n    uint32x4_t riceParamMask128;\n    int32x4_t riceParam128;\n    int64x1_t shift64;\n    uint32x4_t one128;\n    int64x2_t prediction128 = { 0 };\n    uint32x4_t zeroCountPart128;\n    uint32x4_t riceParamPart128;\n    const ma_uint32 t[2] = {0x00000000, 0xFFFFFFFF};\n    riceParamMask    = (ma_uint32)~((~0UL) << riceParam);\n    riceParamMask128 = vdupq_n_u32(riceParamMask);\n    riceParam128 = vdupq_n_s32(riceParam);\n    shift64 = vdup_n_s64(-shift);\n    one128 = vdupq_n_u32(1);\n    {\n        int runningOrder = order;\n        ma_int32 tempC[4] = {0, 0, 0, 0};\n        ma_int32 tempS[4] = {0, 0, 0, 0};\n        if (runningOrder >= 4) {\n            coefficients128_0 = vld1q_s32(coefficients + 0);\n            samples128_0      = vld1q_s32(pSamplesOut  - 4);\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: tempC[2] = coefficients[2]; tempS[1] = pSamplesOut[-3];\n                case 2: tempC[1] = coefficients[1]; tempS[2] = pSamplesOut[-2];\n                case 1: tempC[0] = coefficients[0]; tempS[3] = pSamplesOut[-1];\n            }\n            coefficients128_0 = vld1q_s32(tempC);\n            samples128_0      = vld1q_s32(tempS);\n            runningOrder = 0;\n        }\n        if (runningOrder >= 4) {\n            coefficients128_4 = vld1q_s32(coefficients + 4);\n            samples128_4      = vld1q_s32(pSamplesOut  - 8);\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: tempC[2] = coefficients[6]; tempS[1] = pSamplesOut[-7];\n                case 2: tempC[1] = coefficients[5]; tempS[2] = pSamplesOut[-6];\n                case 1: tempC[0] = coefficients[4]; tempS[3] = pSamplesOut[-5];\n            }\n            coefficients128_4 = vld1q_s32(tempC);\n            samples128_4      = vld1q_s32(tempS);\n            runningOrder = 0;\n        }\n        if (runningOrder == 4) {\n            coefficients128_8 = vld1q_s32(coefficients + 8);\n            samples128_8      = vld1q_s32(pSamplesOut  - 12);\n            runningOrder -= 4;\n        } else {\n            switch (runningOrder) {\n                case 3: tempC[2] = coefficients[10]; tempS[1] = pSamplesOut[-11];\n                case 2: tempC[1] = coefficients[ 9]; tempS[2] = pSamplesOut[-10];\n                case 1: tempC[0] = coefficients[ 8]; tempS[3] = pSamplesOut[- 9];\n            }\n            coefficients128_8 = vld1q_s32(tempC);\n            samples128_8      = vld1q_s32(tempS);\n            runningOrder = 0;\n        }\n        coefficients128_0 = ma_dr_flac__vrevq_s32(coefficients128_0);\n        coefficients128_4 = ma_dr_flac__vrevq_s32(coefficients128_4);\n        coefficients128_8 = ma_dr_flac__vrevq_s32(coefficients128_8);\n    }\n    while (pDecodedSamples < pDecodedSamplesEnd) {\n        if (!ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0]) ||\n            !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[1], &riceParamParts[1]) ||\n            !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[2], &riceParamParts[2]) ||\n            !ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[3], &riceParamParts[3])) {\n            return MA_FALSE;\n        }\n        zeroCountPart128 = vld1q_u32(zeroCountParts);\n        riceParamPart128 = vld1q_u32(riceParamParts);\n        riceParamPart128 = vandq_u32(riceParamPart128, riceParamMask128);\n        riceParamPart128 = vorrq_u32(riceParamPart128, vshlq_u32(zeroCountPart128, riceParam128));\n        riceParamPart128 = veorq_u32(vshrq_n_u32(riceParamPart128, 1), vaddq_u32(ma_dr_flac__vnotq_u32(vandq_u32(riceParamPart128, one128)), one128));\n        for (i = 0; i < 4; i += 1) {\n            int64x1_t prediction64;\n            prediction128 = veorq_s64(prediction128, prediction128);\n            switch (order)\n            {\n            case 12:\n            case 11: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_low_s32(coefficients128_8), vget_low_s32(samples128_8)));\n            case 10:\n            case  9: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_high_s32(coefficients128_8), vget_high_s32(samples128_8)));\n            case  8:\n            case  7: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_low_s32(coefficients128_4), vget_low_s32(samples128_4)));\n            case  6:\n            case  5: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_high_s32(coefficients128_4), vget_high_s32(samples128_4)));\n            case  4:\n            case  3: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_low_s32(coefficients128_0), vget_low_s32(samples128_0)));\n            case  2:\n            case  1: prediction128 = vaddq_s64(prediction128, vmull_s32(vget_high_s32(coefficients128_0), vget_high_s32(samples128_0)));\n            }\n            prediction64 = ma_dr_flac__vhaddq_s64(prediction128);\n            prediction64 = vshl_s64(prediction64, shift64);\n            prediction64 = vadd_s64(prediction64, vdup_n_s64(vgetq_lane_u32(riceParamPart128, 0)));\n            samples128_8 = ma_dr_flac__valignrq_s32_1(samples128_4, samples128_8);\n            samples128_4 = ma_dr_flac__valignrq_s32_1(samples128_0, samples128_4);\n            samples128_0 = ma_dr_flac__valignrq_s32_1(vcombine_s32(vreinterpret_s32_s64(prediction64), vdup_n_s32(0)), samples128_0);\n            riceParamPart128 = ma_dr_flac__valignrq_u32_1(vdupq_n_u32(0), riceParamPart128);\n        }\n        vst1q_s32(pDecodedSamples, samples128_0);\n        pDecodedSamples += 4;\n    }\n    i = (count & ~3);\n    while (i < (int)count) {\n        if (!ma_dr_flac__read_rice_parts_x1(bs, riceParam, &zeroCountParts[0], &riceParamParts[0])) {\n            return MA_FALSE;\n        }\n        riceParamParts[0] &= riceParamMask;\n        riceParamParts[0] |= (zeroCountParts[0] << riceParam);\n        riceParamParts[0]  = (riceParamParts[0] >> 1) ^ t[riceParamParts[0] & 0x01];\n        pDecodedSamples[0] = riceParamParts[0] + ma_dr_flac__calculate_prediction_64(order, shift, coefficients, pDecodedSamples);\n        i += 1;\n        pDecodedSamples += 1;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__decode_samples_with_residual__rice__neon(ma_dr_flac_bs* bs, ma_uint32 bitsPerSample, ma_uint32 count, ma_uint8 riceParam, ma_uint32 lpcOrder, ma_int32 lpcShift, ma_uint32 lpcPrecision, const ma_int32* coefficients, ma_int32* pSamplesOut)\n{\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(pSamplesOut != NULL);\n    if (lpcOrder > 0 && lpcOrder <= 12) {\n        if (ma_dr_flac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) {\n            return ma_dr_flac__decode_samples_with_residual__rice__neon_64(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut);\n        } else {\n            return ma_dr_flac__decode_samples_with_residual__rice__neon_32(bs, count, riceParam, lpcOrder, lpcShift, coefficients, pSamplesOut);\n        }\n    } else {\n        return ma_dr_flac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut);\n    }\n}\n#endif\nstatic ma_bool32 ma_dr_flac__decode_samples_with_residual__rice(ma_dr_flac_bs* bs, ma_uint32 bitsPerSample, ma_uint32 count, ma_uint8 riceParam, ma_uint32 lpcOrder, ma_int32 lpcShift, ma_uint32 lpcPrecision, const ma_int32* coefficients, ma_int32* pSamplesOut)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE41)\n    if (ma_dr_flac__gIsSSE41Supported) {\n        return ma_dr_flac__decode_samples_with_residual__rice__sse41(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut);\n    } else\n#elif defined(MA_DR_FLAC_SUPPORT_NEON)\n    if (ma_dr_flac__gIsNEONSupported) {\n        return ma_dr_flac__decode_samples_with_residual__rice__neon(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut);\n    } else\n#endif\n    {\n    #if 0\n        return ma_dr_flac__decode_samples_with_residual__rice__reference(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut);\n    #else\n        return ma_dr_flac__decode_samples_with_residual__rice__scalar(bs, bitsPerSample, count, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pSamplesOut);\n    #endif\n    }\n}\nstatic ma_bool32 ma_dr_flac__read_and_seek_residual__rice(ma_dr_flac_bs* bs, ma_uint32 count, ma_uint8 riceParam)\n{\n    ma_uint32 i;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    for (i = 0; i < count; ++i) {\n        if (!ma_dr_flac__seek_rice_parts(bs, riceParam)) {\n            return MA_FALSE;\n        }\n    }\n    return MA_TRUE;\n}\n#if defined(__clang__)\n__attribute__((no_sanitize(\"signed-integer-overflow\")))\n#endif\nstatic ma_bool32 ma_dr_flac__decode_samples_with_residual__unencoded(ma_dr_flac_bs* bs, ma_uint32 bitsPerSample, ma_uint32 count, ma_uint8 unencodedBitsPerSample, ma_uint32 lpcOrder, ma_int32 lpcShift, ma_uint32 lpcPrecision, const ma_int32* coefficients, ma_int32* pSamplesOut)\n{\n    ma_uint32 i;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(unencodedBitsPerSample <= 31);\n    MA_DR_FLAC_ASSERT(pSamplesOut != NULL);\n    for (i = 0; i < count; ++i) {\n        if (unencodedBitsPerSample > 0) {\n            if (!ma_dr_flac__read_int32(bs, unencodedBitsPerSample, pSamplesOut + i)) {\n                return MA_FALSE;\n            }\n        } else {\n            pSamplesOut[i] = 0;\n        }\n        if (ma_dr_flac__use_64_bit_prediction(bitsPerSample, lpcOrder, lpcPrecision)) {\n            pSamplesOut[i] += ma_dr_flac__calculate_prediction_64(lpcOrder, lpcShift, coefficients, pSamplesOut + i);\n        } else {\n            pSamplesOut[i] += ma_dr_flac__calculate_prediction_32(lpcOrder, lpcShift, coefficients, pSamplesOut + i);\n        }\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__decode_samples_with_residual(ma_dr_flac_bs* bs, ma_uint32 bitsPerSample, ma_uint32 blockSize, ma_uint32 lpcOrder, ma_int32 lpcShift, ma_uint32 lpcPrecision, const ma_int32* coefficients, ma_int32* pDecodedSamples)\n{\n    ma_uint8 residualMethod;\n    ma_uint8 partitionOrder;\n    ma_uint32 samplesInPartition;\n    ma_uint32 partitionsRemaining;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(blockSize != 0);\n    MA_DR_FLAC_ASSERT(pDecodedSamples != NULL);\n    if (!ma_dr_flac__read_uint8(bs, 2, &residualMethod)) {\n        return MA_FALSE;\n    }\n    if (residualMethod != MA_DR_FLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE && residualMethod != MA_DR_FLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) {\n        return MA_FALSE;\n    }\n    pDecodedSamples += lpcOrder;\n    if (!ma_dr_flac__read_uint8(bs, 4, &partitionOrder)) {\n        return MA_FALSE;\n    }\n    if (partitionOrder > 8) {\n        return MA_FALSE;\n    }\n    if ((blockSize / (1 << partitionOrder)) < lpcOrder) {\n        return MA_FALSE;\n    }\n    samplesInPartition = (blockSize / (1 << partitionOrder)) - lpcOrder;\n    partitionsRemaining = (1 << partitionOrder);\n    for (;;) {\n        ma_uint8 riceParam = 0;\n        if (residualMethod == MA_DR_FLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE) {\n            if (!ma_dr_flac__read_uint8(bs, 4, &riceParam)) {\n                return MA_FALSE;\n            }\n            if (riceParam == 15) {\n                riceParam = 0xFF;\n            }\n        } else if (residualMethod == MA_DR_FLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) {\n            if (!ma_dr_flac__read_uint8(bs, 5, &riceParam)) {\n                return MA_FALSE;\n            }\n            if (riceParam == 31) {\n                riceParam = 0xFF;\n            }\n        }\n        if (riceParam != 0xFF) {\n            if (!ma_dr_flac__decode_samples_with_residual__rice(bs, bitsPerSample, samplesInPartition, riceParam, lpcOrder, lpcShift, lpcPrecision, coefficients, pDecodedSamples)) {\n                return MA_FALSE;\n            }\n        } else {\n            ma_uint8 unencodedBitsPerSample = 0;\n            if (!ma_dr_flac__read_uint8(bs, 5, &unencodedBitsPerSample)) {\n                return MA_FALSE;\n            }\n            if (!ma_dr_flac__decode_samples_with_residual__unencoded(bs, bitsPerSample, samplesInPartition, unencodedBitsPerSample, lpcOrder, lpcShift, lpcPrecision, coefficients, pDecodedSamples)) {\n                return MA_FALSE;\n            }\n        }\n        pDecodedSamples += samplesInPartition;\n        if (partitionsRemaining == 1) {\n            break;\n        }\n        partitionsRemaining -= 1;\n        if (partitionOrder != 0) {\n            samplesInPartition = blockSize / (1 << partitionOrder);\n        }\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__read_and_seek_residual(ma_dr_flac_bs* bs, ma_uint32 blockSize, ma_uint32 order)\n{\n    ma_uint8 residualMethod;\n    ma_uint8 partitionOrder;\n    ma_uint32 samplesInPartition;\n    ma_uint32 partitionsRemaining;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(blockSize != 0);\n    if (!ma_dr_flac__read_uint8(bs, 2, &residualMethod)) {\n        return MA_FALSE;\n    }\n    if (residualMethod != MA_DR_FLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE && residualMethod != MA_DR_FLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) {\n        return MA_FALSE;\n    }\n    if (!ma_dr_flac__read_uint8(bs, 4, &partitionOrder)) {\n        return MA_FALSE;\n    }\n    if (partitionOrder > 8) {\n        return MA_FALSE;\n    }\n    if ((blockSize / (1 << partitionOrder)) <= order) {\n        return MA_FALSE;\n    }\n    samplesInPartition = (blockSize / (1 << partitionOrder)) - order;\n    partitionsRemaining = (1 << partitionOrder);\n    for (;;)\n    {\n        ma_uint8 riceParam = 0;\n        if (residualMethod == MA_DR_FLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE) {\n            if (!ma_dr_flac__read_uint8(bs, 4, &riceParam)) {\n                return MA_FALSE;\n            }\n            if (riceParam == 15) {\n                riceParam = 0xFF;\n            }\n        } else if (residualMethod == MA_DR_FLAC_RESIDUAL_CODING_METHOD_PARTITIONED_RICE2) {\n            if (!ma_dr_flac__read_uint8(bs, 5, &riceParam)) {\n                return MA_FALSE;\n            }\n            if (riceParam == 31) {\n                riceParam = 0xFF;\n            }\n        }\n        if (riceParam != 0xFF) {\n            if (!ma_dr_flac__read_and_seek_residual__rice(bs, samplesInPartition, riceParam)) {\n                return MA_FALSE;\n            }\n        } else {\n            ma_uint8 unencodedBitsPerSample = 0;\n            if (!ma_dr_flac__read_uint8(bs, 5, &unencodedBitsPerSample)) {\n                return MA_FALSE;\n            }\n            if (!ma_dr_flac__seek_bits(bs, unencodedBitsPerSample * samplesInPartition)) {\n                return MA_FALSE;\n            }\n        }\n        if (partitionsRemaining == 1) {\n            break;\n        }\n        partitionsRemaining -= 1;\n        samplesInPartition = blockSize / (1 << partitionOrder);\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__decode_samples__constant(ma_dr_flac_bs* bs, ma_uint32 blockSize, ma_uint32 subframeBitsPerSample, ma_int32* pDecodedSamples)\n{\n    ma_uint32 i;\n    ma_int32 sample;\n    if (!ma_dr_flac__read_int32(bs, subframeBitsPerSample, &sample)) {\n        return MA_FALSE;\n    }\n    for (i = 0; i < blockSize; ++i) {\n        pDecodedSamples[i] = sample;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__decode_samples__verbatim(ma_dr_flac_bs* bs, ma_uint32 blockSize, ma_uint32 subframeBitsPerSample, ma_int32* pDecodedSamples)\n{\n    ma_uint32 i;\n    for (i = 0; i < blockSize; ++i) {\n        ma_int32 sample;\n        if (!ma_dr_flac__read_int32(bs, subframeBitsPerSample, &sample)) {\n            return MA_FALSE;\n        }\n        pDecodedSamples[i] = sample;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__decode_samples__fixed(ma_dr_flac_bs* bs, ma_uint32 blockSize, ma_uint32 subframeBitsPerSample, ma_uint8 lpcOrder, ma_int32* pDecodedSamples)\n{\n    ma_uint32 i;\n    static ma_int32 lpcCoefficientsTable[5][4] = {\n        {0,  0, 0,  0},\n        {1,  0, 0,  0},\n        {2, -1, 0,  0},\n        {3, -3, 1,  0},\n        {4, -6, 4, -1}\n    };\n    for (i = 0; i < lpcOrder; ++i) {\n        ma_int32 sample;\n        if (!ma_dr_flac__read_int32(bs, subframeBitsPerSample, &sample)) {\n            return MA_FALSE;\n        }\n        pDecodedSamples[i] = sample;\n    }\n    if (!ma_dr_flac__decode_samples_with_residual(bs, subframeBitsPerSample, blockSize, lpcOrder, 0, 4, lpcCoefficientsTable[lpcOrder], pDecodedSamples)) {\n        return MA_FALSE;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__decode_samples__lpc(ma_dr_flac_bs* bs, ma_uint32 blockSize, ma_uint32 bitsPerSample, ma_uint8 lpcOrder, ma_int32* pDecodedSamples)\n{\n    ma_uint8 i;\n    ma_uint8 lpcPrecision;\n    ma_int8 lpcShift;\n    ma_int32 coefficients[32];\n    for (i = 0; i < lpcOrder; ++i) {\n        ma_int32 sample;\n        if (!ma_dr_flac__read_int32(bs, bitsPerSample, &sample)) {\n            return MA_FALSE;\n        }\n        pDecodedSamples[i] = sample;\n    }\n    if (!ma_dr_flac__read_uint8(bs, 4, &lpcPrecision)) {\n        return MA_FALSE;\n    }\n    if (lpcPrecision == 15) {\n        return MA_FALSE;\n    }\n    lpcPrecision += 1;\n    if (!ma_dr_flac__read_int8(bs, 5, &lpcShift)) {\n        return MA_FALSE;\n    }\n    if (lpcShift < 0) {\n        return MA_FALSE;\n    }\n    MA_DR_FLAC_ZERO_MEMORY(coefficients, sizeof(coefficients));\n    for (i = 0; i < lpcOrder; ++i) {\n        if (!ma_dr_flac__read_int32(bs, lpcPrecision, coefficients + i)) {\n            return MA_FALSE;\n        }\n    }\n    if (!ma_dr_flac__decode_samples_with_residual(bs, bitsPerSample, blockSize, lpcOrder, lpcShift, lpcPrecision, coefficients, pDecodedSamples)) {\n        return MA_FALSE;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__read_next_flac_frame_header(ma_dr_flac_bs* bs, ma_uint8 streaminfoBitsPerSample, ma_dr_flac_frame_header* header)\n{\n    const ma_uint32 sampleRateTable[12]  = {0, 88200, 176400, 192000, 8000, 16000, 22050, 24000, 32000, 44100, 48000, 96000};\n    const ma_uint8 bitsPerSampleTable[8] = {0, 8, 12, (ma_uint8)-1, 16, 20, 24, (ma_uint8)-1};\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(header != NULL);\n    for (;;) {\n        ma_uint8 crc8 = 0xCE;\n        ma_uint8 reserved = 0;\n        ma_uint8 blockingStrategy = 0;\n        ma_uint8 blockSize = 0;\n        ma_uint8 sampleRate = 0;\n        ma_uint8 channelAssignment = 0;\n        ma_uint8 bitsPerSample = 0;\n        ma_bool32 isVariableBlockSize;\n        if (!ma_dr_flac__find_and_seek_to_next_sync_code(bs)) {\n            return MA_FALSE;\n        }\n        if (!ma_dr_flac__read_uint8(bs, 1, &reserved)) {\n            return MA_FALSE;\n        }\n        if (reserved == 1) {\n            continue;\n        }\n        crc8 = ma_dr_flac_crc8(crc8, reserved, 1);\n        if (!ma_dr_flac__read_uint8(bs, 1, &blockingStrategy)) {\n            return MA_FALSE;\n        }\n        crc8 = ma_dr_flac_crc8(crc8, blockingStrategy, 1);\n        if (!ma_dr_flac__read_uint8(bs, 4, &blockSize)) {\n            return MA_FALSE;\n        }\n        if (blockSize == 0) {\n            continue;\n        }\n        crc8 = ma_dr_flac_crc8(crc8, blockSize, 4);\n        if (!ma_dr_flac__read_uint8(bs, 4, &sampleRate)) {\n            return MA_FALSE;\n        }\n        crc8 = ma_dr_flac_crc8(crc8, sampleRate, 4);\n        if (!ma_dr_flac__read_uint8(bs, 4, &channelAssignment)) {\n            return MA_FALSE;\n        }\n        if (channelAssignment > 10) {\n            continue;\n        }\n        crc8 = ma_dr_flac_crc8(crc8, channelAssignment, 4);\n        if (!ma_dr_flac__read_uint8(bs, 3, &bitsPerSample)) {\n            return MA_FALSE;\n        }\n        if (bitsPerSample == 3 || bitsPerSample == 7) {\n            continue;\n        }\n        crc8 = ma_dr_flac_crc8(crc8, bitsPerSample, 3);\n        if (!ma_dr_flac__read_uint8(bs, 1, &reserved)) {\n            return MA_FALSE;\n        }\n        if (reserved == 1) {\n            continue;\n        }\n        crc8 = ma_dr_flac_crc8(crc8, reserved, 1);\n        isVariableBlockSize = blockingStrategy == 1;\n        if (isVariableBlockSize) {\n            ma_uint64 pcmFrameNumber;\n            ma_result result = ma_dr_flac__read_utf8_coded_number(bs, &pcmFrameNumber, &crc8);\n            if (result != MA_SUCCESS) {\n                if (result == MA_AT_END) {\n                    return MA_FALSE;\n                } else {\n                    continue;\n                }\n            }\n            header->flacFrameNumber  = 0;\n            header->pcmFrameNumber = pcmFrameNumber;\n        } else {\n            ma_uint64 flacFrameNumber = 0;\n            ma_result result = ma_dr_flac__read_utf8_coded_number(bs, &flacFrameNumber, &crc8);\n            if (result != MA_SUCCESS) {\n                if (result == MA_AT_END) {\n                    return MA_FALSE;\n                } else {\n                    continue;\n                }\n            }\n            header->flacFrameNumber  = (ma_uint32)flacFrameNumber;\n            header->pcmFrameNumber = 0;\n        }\n        MA_DR_FLAC_ASSERT(blockSize > 0);\n        if (blockSize == 1) {\n            header->blockSizeInPCMFrames = 192;\n        } else if (blockSize <= 5) {\n            MA_DR_FLAC_ASSERT(blockSize >= 2);\n            header->blockSizeInPCMFrames = 576 * (1 << (blockSize - 2));\n        } else if (blockSize == 6) {\n            if (!ma_dr_flac__read_uint16(bs, 8, &header->blockSizeInPCMFrames)) {\n                return MA_FALSE;\n            }\n            crc8 = ma_dr_flac_crc8(crc8, header->blockSizeInPCMFrames, 8);\n            header->blockSizeInPCMFrames += 1;\n        } else if (blockSize == 7) {\n            if (!ma_dr_flac__read_uint16(bs, 16, &header->blockSizeInPCMFrames)) {\n                return MA_FALSE;\n            }\n            crc8 = ma_dr_flac_crc8(crc8, header->blockSizeInPCMFrames, 16);\n            if (header->blockSizeInPCMFrames == 0xFFFF) {\n                return MA_FALSE;\n            }\n            header->blockSizeInPCMFrames += 1;\n        } else {\n            MA_DR_FLAC_ASSERT(blockSize >= 8);\n            header->blockSizeInPCMFrames = 256 * (1 << (blockSize - 8));\n        }\n        if (sampleRate <= 11) {\n            header->sampleRate = sampleRateTable[sampleRate];\n        } else if (sampleRate == 12) {\n            if (!ma_dr_flac__read_uint32(bs, 8, &header->sampleRate)) {\n                return MA_FALSE;\n            }\n            crc8 = ma_dr_flac_crc8(crc8, header->sampleRate, 8);\n            header->sampleRate *= 1000;\n        } else if (sampleRate == 13) {\n            if (!ma_dr_flac__read_uint32(bs, 16, &header->sampleRate)) {\n                return MA_FALSE;\n            }\n            crc8 = ma_dr_flac_crc8(crc8, header->sampleRate, 16);\n        } else if (sampleRate == 14) {\n            if (!ma_dr_flac__read_uint32(bs, 16, &header->sampleRate)) {\n                return MA_FALSE;\n            }\n            crc8 = ma_dr_flac_crc8(crc8, header->sampleRate, 16);\n            header->sampleRate *= 10;\n        } else {\n            continue;\n        }\n        header->channelAssignment = channelAssignment;\n        header->bitsPerSample = bitsPerSampleTable[bitsPerSample];\n        if (header->bitsPerSample == 0) {\n            header->bitsPerSample = streaminfoBitsPerSample;\n        }\n        if (header->bitsPerSample != streaminfoBitsPerSample) {\n            return MA_FALSE;\n        }\n        if (!ma_dr_flac__read_uint8(bs, 8, &header->crc8)) {\n            return MA_FALSE;\n        }\n#ifndef MA_DR_FLAC_NO_CRC\n        if (header->crc8 != crc8) {\n            continue;\n        }\n#endif\n        return MA_TRUE;\n    }\n}\nstatic ma_bool32 ma_dr_flac__read_subframe_header(ma_dr_flac_bs* bs, ma_dr_flac_subframe* pSubframe)\n{\n    ma_uint8 header;\n    int type;\n    if (!ma_dr_flac__read_uint8(bs, 8, &header)) {\n        return MA_FALSE;\n    }\n    if ((header & 0x80) != 0) {\n        return MA_FALSE;\n    }\n    type = (header & 0x7E) >> 1;\n    if (type == 0) {\n        pSubframe->subframeType = MA_DR_FLAC_SUBFRAME_CONSTANT;\n    } else if (type == 1) {\n        pSubframe->subframeType = MA_DR_FLAC_SUBFRAME_VERBATIM;\n    } else {\n        if ((type & 0x20) != 0) {\n            pSubframe->subframeType = MA_DR_FLAC_SUBFRAME_LPC;\n            pSubframe->lpcOrder = (ma_uint8)(type & 0x1F) + 1;\n        } else if ((type & 0x08) != 0) {\n            pSubframe->subframeType = MA_DR_FLAC_SUBFRAME_FIXED;\n            pSubframe->lpcOrder = (ma_uint8)(type & 0x07);\n            if (pSubframe->lpcOrder > 4) {\n                pSubframe->subframeType = MA_DR_FLAC_SUBFRAME_RESERVED;\n                pSubframe->lpcOrder = 0;\n            }\n        } else {\n            pSubframe->subframeType = MA_DR_FLAC_SUBFRAME_RESERVED;\n        }\n    }\n    if (pSubframe->subframeType == MA_DR_FLAC_SUBFRAME_RESERVED) {\n        return MA_FALSE;\n    }\n    pSubframe->wastedBitsPerSample = 0;\n    if ((header & 0x01) == 1) {\n        unsigned int wastedBitsPerSample;\n        if (!ma_dr_flac__seek_past_next_set_bit(bs, &wastedBitsPerSample)) {\n            return MA_FALSE;\n        }\n        pSubframe->wastedBitsPerSample = (ma_uint8)wastedBitsPerSample + 1;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__decode_subframe(ma_dr_flac_bs* bs, ma_dr_flac_frame* frame, int subframeIndex, ma_int32* pDecodedSamplesOut)\n{\n    ma_dr_flac_subframe* pSubframe;\n    ma_uint32 subframeBitsPerSample;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(frame != NULL);\n    pSubframe = frame->subframes + subframeIndex;\n    if (!ma_dr_flac__read_subframe_header(bs, pSubframe)) {\n        return MA_FALSE;\n    }\n    subframeBitsPerSample = frame->header.bitsPerSample;\n    if ((frame->header.channelAssignment == MA_DR_FLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE || frame->header.channelAssignment == MA_DR_FLAC_CHANNEL_ASSIGNMENT_MID_SIDE) && subframeIndex == 1) {\n        subframeBitsPerSample += 1;\n    } else if (frame->header.channelAssignment == MA_DR_FLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE && subframeIndex == 0) {\n        subframeBitsPerSample += 1;\n    }\n    if (subframeBitsPerSample > 32) {\n        return MA_FALSE;\n    }\n    if (pSubframe->wastedBitsPerSample >= subframeBitsPerSample) {\n        return MA_FALSE;\n    }\n    subframeBitsPerSample -= pSubframe->wastedBitsPerSample;\n    pSubframe->pSamplesS32 = pDecodedSamplesOut;\n    switch (pSubframe->subframeType)\n    {\n        case MA_DR_FLAC_SUBFRAME_CONSTANT:\n        {\n            ma_dr_flac__decode_samples__constant(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->pSamplesS32);\n        } break;\n        case MA_DR_FLAC_SUBFRAME_VERBATIM:\n        {\n            ma_dr_flac__decode_samples__verbatim(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->pSamplesS32);\n        } break;\n        case MA_DR_FLAC_SUBFRAME_FIXED:\n        {\n            ma_dr_flac__decode_samples__fixed(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->lpcOrder, pSubframe->pSamplesS32);\n        } break;\n        case MA_DR_FLAC_SUBFRAME_LPC:\n        {\n            ma_dr_flac__decode_samples__lpc(bs, frame->header.blockSizeInPCMFrames, subframeBitsPerSample, pSubframe->lpcOrder, pSubframe->pSamplesS32);\n        } break;\n        default: return MA_FALSE;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__seek_subframe(ma_dr_flac_bs* bs, ma_dr_flac_frame* frame, int subframeIndex)\n{\n    ma_dr_flac_subframe* pSubframe;\n    ma_uint32 subframeBitsPerSample;\n    MA_DR_FLAC_ASSERT(bs != NULL);\n    MA_DR_FLAC_ASSERT(frame != NULL);\n    pSubframe = frame->subframes + subframeIndex;\n    if (!ma_dr_flac__read_subframe_header(bs, pSubframe)) {\n        return MA_FALSE;\n    }\n    subframeBitsPerSample = frame->header.bitsPerSample;\n    if ((frame->header.channelAssignment == MA_DR_FLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE || frame->header.channelAssignment == MA_DR_FLAC_CHANNEL_ASSIGNMENT_MID_SIDE) && subframeIndex == 1) {\n        subframeBitsPerSample += 1;\n    } else if (frame->header.channelAssignment == MA_DR_FLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE && subframeIndex == 0) {\n        subframeBitsPerSample += 1;\n    }\n    if (pSubframe->wastedBitsPerSample >= subframeBitsPerSample) {\n        return MA_FALSE;\n    }\n    subframeBitsPerSample -= pSubframe->wastedBitsPerSample;\n    pSubframe->pSamplesS32 = NULL;\n    switch (pSubframe->subframeType)\n    {\n        case MA_DR_FLAC_SUBFRAME_CONSTANT:\n        {\n            if (!ma_dr_flac__seek_bits(bs, subframeBitsPerSample)) {\n                return MA_FALSE;\n            }\n        } break;\n        case MA_DR_FLAC_SUBFRAME_VERBATIM:\n        {\n            unsigned int bitsToSeek = frame->header.blockSizeInPCMFrames * subframeBitsPerSample;\n            if (!ma_dr_flac__seek_bits(bs, bitsToSeek)) {\n                return MA_FALSE;\n            }\n        } break;\n        case MA_DR_FLAC_SUBFRAME_FIXED:\n        {\n            unsigned int bitsToSeek = pSubframe->lpcOrder * subframeBitsPerSample;\n            if (!ma_dr_flac__seek_bits(bs, bitsToSeek)) {\n                return MA_FALSE;\n            }\n            if (!ma_dr_flac__read_and_seek_residual(bs, frame->header.blockSizeInPCMFrames, pSubframe->lpcOrder)) {\n                return MA_FALSE;\n            }\n        } break;\n        case MA_DR_FLAC_SUBFRAME_LPC:\n        {\n            ma_uint8 lpcPrecision;\n            unsigned int bitsToSeek = pSubframe->lpcOrder * subframeBitsPerSample;\n            if (!ma_dr_flac__seek_bits(bs, bitsToSeek)) {\n                return MA_FALSE;\n            }\n            if (!ma_dr_flac__read_uint8(bs, 4, &lpcPrecision)) {\n                return MA_FALSE;\n            }\n            if (lpcPrecision == 15) {\n                return MA_FALSE;\n            }\n            lpcPrecision += 1;\n            bitsToSeek = (pSubframe->lpcOrder * lpcPrecision) + 5;\n            if (!ma_dr_flac__seek_bits(bs, bitsToSeek)) {\n                return MA_FALSE;\n            }\n            if (!ma_dr_flac__read_and_seek_residual(bs, frame->header.blockSizeInPCMFrames, pSubframe->lpcOrder)) {\n                return MA_FALSE;\n            }\n        } break;\n        default: return MA_FALSE;\n    }\n    return MA_TRUE;\n}\nstatic MA_INLINE ma_uint8 ma_dr_flac__get_channel_count_from_channel_assignment(ma_int8 channelAssignment)\n{\n    ma_uint8 lookup[] = {1, 2, 3, 4, 5, 6, 7, 8, 2, 2, 2};\n    MA_DR_FLAC_ASSERT(channelAssignment <= 10);\n    return lookup[channelAssignment];\n}\nstatic ma_result ma_dr_flac__decode_flac_frame(ma_dr_flac* pFlac)\n{\n    int channelCount;\n    int i;\n    ma_uint8 paddingSizeInBits;\n    ma_uint16 desiredCRC16;\n#ifndef MA_DR_FLAC_NO_CRC\n    ma_uint16 actualCRC16;\n#endif\n    MA_DR_FLAC_ZERO_MEMORY(pFlac->currentFLACFrame.subframes, sizeof(pFlac->currentFLACFrame.subframes));\n    if (pFlac->currentFLACFrame.header.blockSizeInPCMFrames > pFlac->maxBlockSizeInPCMFrames) {\n        return MA_ERROR;\n    }\n    channelCount = ma_dr_flac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment);\n    if (channelCount != (int)pFlac->channels) {\n        return MA_ERROR;\n    }\n    for (i = 0; i < channelCount; ++i) {\n        if (!ma_dr_flac__decode_subframe(&pFlac->bs, &pFlac->currentFLACFrame, i, pFlac->pDecodedSamples + (pFlac->currentFLACFrame.header.blockSizeInPCMFrames * i))) {\n            return MA_ERROR;\n        }\n    }\n    paddingSizeInBits = (ma_uint8)(MA_DR_FLAC_CACHE_L1_BITS_REMAINING(&pFlac->bs) & 7);\n    if (paddingSizeInBits > 0) {\n        ma_uint8 padding = 0;\n        if (!ma_dr_flac__read_uint8(&pFlac->bs, paddingSizeInBits, &padding)) {\n            return MA_AT_END;\n        }\n    }\n#ifndef MA_DR_FLAC_NO_CRC\n    actualCRC16 = ma_dr_flac__flush_crc16(&pFlac->bs);\n#endif\n    if (!ma_dr_flac__read_uint16(&pFlac->bs, 16, &desiredCRC16)) {\n        return MA_AT_END;\n    }\n#ifndef MA_DR_FLAC_NO_CRC\n    if (actualCRC16 != desiredCRC16) {\n        return MA_CRC_MISMATCH;\n    }\n#endif\n    pFlac->currentFLACFrame.pcmFramesRemaining = pFlac->currentFLACFrame.header.blockSizeInPCMFrames;\n    return MA_SUCCESS;\n}\nstatic ma_result ma_dr_flac__seek_flac_frame(ma_dr_flac* pFlac)\n{\n    int channelCount;\n    int i;\n    ma_uint16 desiredCRC16;\n#ifndef MA_DR_FLAC_NO_CRC\n    ma_uint16 actualCRC16;\n#endif\n    channelCount = ma_dr_flac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment);\n    for (i = 0; i < channelCount; ++i) {\n        if (!ma_dr_flac__seek_subframe(&pFlac->bs, &pFlac->currentFLACFrame, i)) {\n            return MA_ERROR;\n        }\n    }\n    if (!ma_dr_flac__seek_bits(&pFlac->bs, MA_DR_FLAC_CACHE_L1_BITS_REMAINING(&pFlac->bs) & 7)) {\n        return MA_ERROR;\n    }\n#ifndef MA_DR_FLAC_NO_CRC\n    actualCRC16 = ma_dr_flac__flush_crc16(&pFlac->bs);\n#endif\n    if (!ma_dr_flac__read_uint16(&pFlac->bs, 16, &desiredCRC16)) {\n        return MA_AT_END;\n    }\n#ifndef MA_DR_FLAC_NO_CRC\n    if (actualCRC16 != desiredCRC16) {\n        return MA_CRC_MISMATCH;\n    }\n#endif\n    return MA_SUCCESS;\n}\nstatic ma_bool32 ma_dr_flac__read_and_decode_next_flac_frame(ma_dr_flac* pFlac)\n{\n    MA_DR_FLAC_ASSERT(pFlac != NULL);\n    for (;;) {\n        ma_result result;\n        if (!ma_dr_flac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n            return MA_FALSE;\n        }\n        result = ma_dr_flac__decode_flac_frame(pFlac);\n        if (result != MA_SUCCESS) {\n            if (result == MA_CRC_MISMATCH) {\n                continue;\n            } else {\n                return MA_FALSE;\n            }\n        }\n        return MA_TRUE;\n    }\n}\nstatic void ma_dr_flac__get_pcm_frame_range_of_current_flac_frame(ma_dr_flac* pFlac, ma_uint64* pFirstPCMFrame, ma_uint64* pLastPCMFrame)\n{\n    ma_uint64 firstPCMFrame;\n    ma_uint64 lastPCMFrame;\n    MA_DR_FLAC_ASSERT(pFlac != NULL);\n    firstPCMFrame = pFlac->currentFLACFrame.header.pcmFrameNumber;\n    if (firstPCMFrame == 0) {\n        firstPCMFrame = ((ma_uint64)pFlac->currentFLACFrame.header.flacFrameNumber) * pFlac->maxBlockSizeInPCMFrames;\n    }\n    lastPCMFrame = firstPCMFrame + pFlac->currentFLACFrame.header.blockSizeInPCMFrames;\n    if (lastPCMFrame > 0) {\n        lastPCMFrame -= 1;\n    }\n    if (pFirstPCMFrame) {\n        *pFirstPCMFrame = firstPCMFrame;\n    }\n    if (pLastPCMFrame) {\n        *pLastPCMFrame = lastPCMFrame;\n    }\n}\nstatic ma_bool32 ma_dr_flac__seek_to_first_frame(ma_dr_flac* pFlac)\n{\n    ma_bool32 result;\n    MA_DR_FLAC_ASSERT(pFlac != NULL);\n    result = ma_dr_flac__seek_to_byte(&pFlac->bs, pFlac->firstFLACFramePosInBytes);\n    MA_DR_FLAC_ZERO_MEMORY(&pFlac->currentFLACFrame, sizeof(pFlac->currentFLACFrame));\n    pFlac->currentPCMFrame = 0;\n    return result;\n}\nstatic MA_INLINE ma_result ma_dr_flac__seek_to_next_flac_frame(ma_dr_flac* pFlac)\n{\n    MA_DR_FLAC_ASSERT(pFlac != NULL);\n    return ma_dr_flac__seek_flac_frame(pFlac);\n}\nstatic ma_uint64 ma_dr_flac__seek_forward_by_pcm_frames(ma_dr_flac* pFlac, ma_uint64 pcmFramesToSeek)\n{\n    ma_uint64 pcmFramesRead = 0;\n    while (pcmFramesToSeek > 0) {\n        if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) {\n            if (!ma_dr_flac__read_and_decode_next_flac_frame(pFlac)) {\n                break;\n            }\n        } else {\n            if (pFlac->currentFLACFrame.pcmFramesRemaining > pcmFramesToSeek) {\n                pcmFramesRead   += pcmFramesToSeek;\n                pFlac->currentFLACFrame.pcmFramesRemaining -= (ma_uint32)pcmFramesToSeek;\n                pcmFramesToSeek  = 0;\n            } else {\n                pcmFramesRead   += pFlac->currentFLACFrame.pcmFramesRemaining;\n                pcmFramesToSeek -= pFlac->currentFLACFrame.pcmFramesRemaining;\n                pFlac->currentFLACFrame.pcmFramesRemaining = 0;\n            }\n        }\n    }\n    pFlac->currentPCMFrame += pcmFramesRead;\n    return pcmFramesRead;\n}\nstatic ma_bool32 ma_dr_flac__seek_to_pcm_frame__brute_force(ma_dr_flac* pFlac, ma_uint64 pcmFrameIndex)\n{\n    ma_bool32 isMidFrame = MA_FALSE;\n    ma_uint64 runningPCMFrameCount;\n    MA_DR_FLAC_ASSERT(pFlac != NULL);\n    if (pcmFrameIndex >= pFlac->currentPCMFrame) {\n        runningPCMFrameCount = pFlac->currentPCMFrame;\n        if (pFlac->currentPCMFrame == 0 && pFlac->currentFLACFrame.pcmFramesRemaining == 0) {\n            if (!ma_dr_flac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n                return MA_FALSE;\n            }\n        } else {\n            isMidFrame = MA_TRUE;\n        }\n    } else {\n        runningPCMFrameCount = 0;\n        if (!ma_dr_flac__seek_to_first_frame(pFlac)) {\n            return MA_FALSE;\n        }\n        if (!ma_dr_flac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n            return MA_FALSE;\n        }\n    }\n    for (;;) {\n        ma_uint64 pcmFrameCountInThisFLACFrame;\n        ma_uint64 firstPCMFrameInFLACFrame = 0;\n        ma_uint64 lastPCMFrameInFLACFrame = 0;\n        ma_dr_flac__get_pcm_frame_range_of_current_flac_frame(pFlac, &firstPCMFrameInFLACFrame, &lastPCMFrameInFLACFrame);\n        pcmFrameCountInThisFLACFrame = (lastPCMFrameInFLACFrame - firstPCMFrameInFLACFrame) + 1;\n        if (pcmFrameIndex < (runningPCMFrameCount + pcmFrameCountInThisFLACFrame)) {\n            ma_uint64 pcmFramesToDecode = pcmFrameIndex - runningPCMFrameCount;\n            if (!isMidFrame) {\n                ma_result result = ma_dr_flac__decode_flac_frame(pFlac);\n                if (result == MA_SUCCESS) {\n                    return ma_dr_flac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode;\n                } else {\n                    if (result == MA_CRC_MISMATCH) {\n                        goto next_iteration;\n                    } else {\n                        return MA_FALSE;\n                    }\n                }\n            } else {\n                return ma_dr_flac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode;\n            }\n        } else {\n            if (!isMidFrame) {\n                ma_result result = ma_dr_flac__seek_to_next_flac_frame(pFlac);\n                if (result == MA_SUCCESS) {\n                    runningPCMFrameCount += pcmFrameCountInThisFLACFrame;\n                } else {\n                    if (result == MA_CRC_MISMATCH) {\n                        goto next_iteration;\n                    } else {\n                        return MA_FALSE;\n                    }\n                }\n            } else {\n                runningPCMFrameCount += pFlac->currentFLACFrame.pcmFramesRemaining;\n                pFlac->currentFLACFrame.pcmFramesRemaining = 0;\n                isMidFrame = MA_FALSE;\n            }\n            if (pcmFrameIndex == pFlac->totalPCMFrameCount && runningPCMFrameCount == pFlac->totalPCMFrameCount) {\n                return MA_TRUE;\n            }\n        }\n    next_iteration:\n        if (!ma_dr_flac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n            return MA_FALSE;\n        }\n    }\n}\n#if !defined(MA_DR_FLAC_NO_CRC)\n#define MA_DR_FLAC_BINARY_SEARCH_APPROX_COMPRESSION_RATIO 0.6f\nstatic ma_bool32 ma_dr_flac__seek_to_approximate_flac_frame_to_byte(ma_dr_flac* pFlac, ma_uint64 targetByte, ma_uint64 rangeLo, ma_uint64 rangeHi, ma_uint64* pLastSuccessfulSeekOffset)\n{\n    MA_DR_FLAC_ASSERT(pFlac != NULL);\n    MA_DR_FLAC_ASSERT(pLastSuccessfulSeekOffset != NULL);\n    MA_DR_FLAC_ASSERT(targetByte >= rangeLo);\n    MA_DR_FLAC_ASSERT(targetByte <= rangeHi);\n    *pLastSuccessfulSeekOffset = pFlac->firstFLACFramePosInBytes;\n    for (;;) {\n        ma_uint64 lastTargetByte = targetByte;\n        if (!ma_dr_flac__seek_to_byte(&pFlac->bs, targetByte)) {\n            if (targetByte == 0) {\n                ma_dr_flac__seek_to_first_frame(pFlac);\n                return MA_FALSE;\n            }\n            targetByte = rangeLo + ((rangeHi - rangeLo)/2);\n            rangeHi = targetByte;\n        } else {\n            MA_DR_FLAC_ZERO_MEMORY(&pFlac->currentFLACFrame, sizeof(pFlac->currentFLACFrame));\n#if 1\n            if (!ma_dr_flac__read_and_decode_next_flac_frame(pFlac)) {\n                targetByte = rangeLo + ((rangeHi - rangeLo)/2);\n                rangeHi = targetByte;\n            } else {\n                break;\n            }\n#else\n            if (!ma_dr_flac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n                targetByte = rangeLo + ((rangeHi - rangeLo)/2);\n                rangeHi = targetByte;\n            } else {\n                break;\n            }\n#endif\n        }\n        if(targetByte == lastTargetByte) {\n            return MA_FALSE;\n        }\n    }\n    ma_dr_flac__get_pcm_frame_range_of_current_flac_frame(pFlac, &pFlac->currentPCMFrame, NULL);\n    MA_DR_FLAC_ASSERT(targetByte <= rangeHi);\n    *pLastSuccessfulSeekOffset = targetByte;\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__decode_flac_frame_and_seek_forward_by_pcm_frames(ma_dr_flac* pFlac, ma_uint64 offset)\n{\n#if 0\n    if (ma_dr_flac__decode_flac_frame(pFlac) != MA_SUCCESS) {\n        if (ma_dr_flac__read_and_decode_next_flac_frame(pFlac) == MA_FALSE) {\n            return MA_FALSE;\n        }\n    }\n#endif\n    return ma_dr_flac__seek_forward_by_pcm_frames(pFlac, offset) == offset;\n}\nstatic ma_bool32 ma_dr_flac__seek_to_pcm_frame__binary_search_internal(ma_dr_flac* pFlac, ma_uint64 pcmFrameIndex, ma_uint64 byteRangeLo, ma_uint64 byteRangeHi)\n{\n    ma_uint64 targetByte;\n    ma_uint64 pcmRangeLo = pFlac->totalPCMFrameCount;\n    ma_uint64 pcmRangeHi = 0;\n    ma_uint64 lastSuccessfulSeekOffset = (ma_uint64)-1;\n    ma_uint64 closestSeekOffsetBeforeTargetPCMFrame = byteRangeLo;\n    ma_uint32 seekForwardThreshold = (pFlac->maxBlockSizeInPCMFrames != 0) ? pFlac->maxBlockSizeInPCMFrames*2 : 4096;\n    targetByte = byteRangeLo + (ma_uint64)(((ma_int64)((pcmFrameIndex - pFlac->currentPCMFrame) * pFlac->channels * pFlac->bitsPerSample)/8.0f) * MA_DR_FLAC_BINARY_SEARCH_APPROX_COMPRESSION_RATIO);\n    if (targetByte > byteRangeHi) {\n        targetByte = byteRangeHi;\n    }\n    for (;;) {\n        if (ma_dr_flac__seek_to_approximate_flac_frame_to_byte(pFlac, targetByte, byteRangeLo, byteRangeHi, &lastSuccessfulSeekOffset)) {\n            ma_uint64 newPCMRangeLo;\n            ma_uint64 newPCMRangeHi;\n            ma_dr_flac__get_pcm_frame_range_of_current_flac_frame(pFlac, &newPCMRangeLo, &newPCMRangeHi);\n            if (pcmRangeLo == newPCMRangeLo) {\n                if (!ma_dr_flac__seek_to_approximate_flac_frame_to_byte(pFlac, closestSeekOffsetBeforeTargetPCMFrame, closestSeekOffsetBeforeTargetPCMFrame, byteRangeHi, &lastSuccessfulSeekOffset)) {\n                    break;\n                }\n                if (ma_dr_flac__decode_flac_frame_and_seek_forward_by_pcm_frames(pFlac, pcmFrameIndex - pFlac->currentPCMFrame)) {\n                    return MA_TRUE;\n                } else {\n                    break;\n                }\n            }\n            pcmRangeLo = newPCMRangeLo;\n            pcmRangeHi = newPCMRangeHi;\n            if (pcmRangeLo <= pcmFrameIndex && pcmRangeHi >= pcmFrameIndex) {\n                if (ma_dr_flac__decode_flac_frame_and_seek_forward_by_pcm_frames(pFlac, pcmFrameIndex - pFlac->currentPCMFrame) ) {\n                    return MA_TRUE;\n                } else {\n                    break;\n                }\n            } else {\n                const float approxCompressionRatio = (ma_int64)(lastSuccessfulSeekOffset - pFlac->firstFLACFramePosInBytes) / ((ma_int64)(pcmRangeLo * pFlac->channels * pFlac->bitsPerSample)/8.0f);\n                if (pcmRangeLo > pcmFrameIndex) {\n                    byteRangeHi = lastSuccessfulSeekOffset;\n                    if (byteRangeLo > byteRangeHi) {\n                        byteRangeLo = byteRangeHi;\n                    }\n                    targetByte = byteRangeLo + ((byteRangeHi - byteRangeLo) / 2);\n                    if (targetByte < byteRangeLo) {\n                        targetByte = byteRangeLo;\n                    }\n                } else  {\n                    if ((pcmFrameIndex - pcmRangeLo) < seekForwardThreshold) {\n                        if (ma_dr_flac__decode_flac_frame_and_seek_forward_by_pcm_frames(pFlac, pcmFrameIndex - pFlac->currentPCMFrame)) {\n                            return MA_TRUE;\n                        } else {\n                            break;\n                        }\n                    } else {\n                        byteRangeLo = lastSuccessfulSeekOffset;\n                        if (byteRangeHi < byteRangeLo) {\n                            byteRangeHi = byteRangeLo;\n                        }\n                        targetByte = lastSuccessfulSeekOffset + (ma_uint64)(((ma_int64)((pcmFrameIndex-pcmRangeLo) * pFlac->channels * pFlac->bitsPerSample)/8.0f) * approxCompressionRatio);\n                        if (targetByte > byteRangeHi) {\n                            targetByte = byteRangeHi;\n                        }\n                        if (closestSeekOffsetBeforeTargetPCMFrame < lastSuccessfulSeekOffset) {\n                            closestSeekOffsetBeforeTargetPCMFrame = lastSuccessfulSeekOffset;\n                        }\n                    }\n                }\n            }\n        } else {\n            break;\n        }\n    }\n    ma_dr_flac__seek_to_first_frame(pFlac);\n    return MA_FALSE;\n}\nstatic ma_bool32 ma_dr_flac__seek_to_pcm_frame__binary_search(ma_dr_flac* pFlac, ma_uint64 pcmFrameIndex)\n{\n    ma_uint64 byteRangeLo;\n    ma_uint64 byteRangeHi;\n    ma_uint32 seekForwardThreshold = (pFlac->maxBlockSizeInPCMFrames != 0) ? pFlac->maxBlockSizeInPCMFrames*2 : 4096;\n    if (ma_dr_flac__seek_to_first_frame(pFlac) == MA_FALSE) {\n        return MA_FALSE;\n    }\n    if (pcmFrameIndex < seekForwardThreshold) {\n        return ma_dr_flac__seek_forward_by_pcm_frames(pFlac, pcmFrameIndex) == pcmFrameIndex;\n    }\n    byteRangeLo = pFlac->firstFLACFramePosInBytes;\n    byteRangeHi = pFlac->firstFLACFramePosInBytes + (ma_uint64)((ma_int64)(pFlac->totalPCMFrameCount * pFlac->channels * pFlac->bitsPerSample)/8.0f);\n    return ma_dr_flac__seek_to_pcm_frame__binary_search_internal(pFlac, pcmFrameIndex, byteRangeLo, byteRangeHi);\n}\n#endif\nstatic ma_bool32 ma_dr_flac__seek_to_pcm_frame__seek_table(ma_dr_flac* pFlac, ma_uint64 pcmFrameIndex)\n{\n    ma_uint32 iClosestSeekpoint = 0;\n    ma_bool32 isMidFrame = MA_FALSE;\n    ma_uint64 runningPCMFrameCount;\n    ma_uint32 iSeekpoint;\n    MA_DR_FLAC_ASSERT(pFlac != NULL);\n    if (pFlac->pSeekpoints == NULL || pFlac->seekpointCount == 0) {\n        return MA_FALSE;\n    }\n    if (pFlac->pSeekpoints[0].firstPCMFrame > pcmFrameIndex) {\n        return MA_FALSE;\n    }\n    for (iSeekpoint = 0; iSeekpoint < pFlac->seekpointCount; ++iSeekpoint) {\n        if (pFlac->pSeekpoints[iSeekpoint].firstPCMFrame >= pcmFrameIndex) {\n            break;\n        }\n        iClosestSeekpoint = iSeekpoint;\n    }\n    if (pFlac->pSeekpoints[iClosestSeekpoint].pcmFrameCount == 0 || pFlac->pSeekpoints[iClosestSeekpoint].pcmFrameCount > pFlac->maxBlockSizeInPCMFrames) {\n        return MA_FALSE;\n    }\n    if (pFlac->pSeekpoints[iClosestSeekpoint].firstPCMFrame > pFlac->totalPCMFrameCount && pFlac->totalPCMFrameCount > 0) {\n        return MA_FALSE;\n    }\n#if !defined(MA_DR_FLAC_NO_CRC)\n    if (pFlac->totalPCMFrameCount > 0) {\n        ma_uint64 byteRangeLo;\n        ma_uint64 byteRangeHi;\n        byteRangeHi = pFlac->firstFLACFramePosInBytes + (ma_uint64)((ma_int64)(pFlac->totalPCMFrameCount * pFlac->channels * pFlac->bitsPerSample)/8.0f);\n        byteRangeLo = pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset;\n        if (iClosestSeekpoint < pFlac->seekpointCount-1) {\n            ma_uint32 iNextSeekpoint = iClosestSeekpoint + 1;\n            if (pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset >= pFlac->pSeekpoints[iNextSeekpoint].flacFrameOffset || pFlac->pSeekpoints[iNextSeekpoint].pcmFrameCount == 0) {\n                return MA_FALSE;\n            }\n            if (pFlac->pSeekpoints[iNextSeekpoint].firstPCMFrame != (((ma_uint64)0xFFFFFFFF << 32) | 0xFFFFFFFF)) {\n                byteRangeHi = pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iNextSeekpoint].flacFrameOffset - 1;\n            }\n        }\n        if (ma_dr_flac__seek_to_byte(&pFlac->bs, pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset)) {\n            if (ma_dr_flac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n                ma_dr_flac__get_pcm_frame_range_of_current_flac_frame(pFlac, &pFlac->currentPCMFrame, NULL);\n                if (ma_dr_flac__seek_to_pcm_frame__binary_search_internal(pFlac, pcmFrameIndex, byteRangeLo, byteRangeHi)) {\n                    return MA_TRUE;\n                }\n            }\n        }\n    }\n#endif\n    if (pcmFrameIndex >= pFlac->currentPCMFrame && pFlac->pSeekpoints[iClosestSeekpoint].firstPCMFrame <= pFlac->currentPCMFrame) {\n        runningPCMFrameCount = pFlac->currentPCMFrame;\n        if (pFlac->currentPCMFrame == 0 && pFlac->currentFLACFrame.pcmFramesRemaining == 0) {\n            if (!ma_dr_flac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n                return MA_FALSE;\n            }\n        } else {\n            isMidFrame = MA_TRUE;\n        }\n    } else {\n        runningPCMFrameCount = pFlac->pSeekpoints[iClosestSeekpoint].firstPCMFrame;\n        if (!ma_dr_flac__seek_to_byte(&pFlac->bs, pFlac->firstFLACFramePosInBytes + pFlac->pSeekpoints[iClosestSeekpoint].flacFrameOffset)) {\n            return MA_FALSE;\n        }\n        if (!ma_dr_flac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n            return MA_FALSE;\n        }\n    }\n    for (;;) {\n        ma_uint64 pcmFrameCountInThisFLACFrame;\n        ma_uint64 firstPCMFrameInFLACFrame = 0;\n        ma_uint64 lastPCMFrameInFLACFrame = 0;\n        ma_dr_flac__get_pcm_frame_range_of_current_flac_frame(pFlac, &firstPCMFrameInFLACFrame, &lastPCMFrameInFLACFrame);\n        pcmFrameCountInThisFLACFrame = (lastPCMFrameInFLACFrame - firstPCMFrameInFLACFrame) + 1;\n        if (pcmFrameIndex < (runningPCMFrameCount + pcmFrameCountInThisFLACFrame)) {\n            ma_uint64 pcmFramesToDecode = pcmFrameIndex - runningPCMFrameCount;\n            if (!isMidFrame) {\n                ma_result result = ma_dr_flac__decode_flac_frame(pFlac);\n                if (result == MA_SUCCESS) {\n                    return ma_dr_flac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode;\n                } else {\n                    if (result == MA_CRC_MISMATCH) {\n                        goto next_iteration;\n                    } else {\n                        return MA_FALSE;\n                    }\n                }\n            } else {\n                return ma_dr_flac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode;\n            }\n        } else {\n            if (!isMidFrame) {\n                ma_result result = ma_dr_flac__seek_to_next_flac_frame(pFlac);\n                if (result == MA_SUCCESS) {\n                    runningPCMFrameCount += pcmFrameCountInThisFLACFrame;\n                } else {\n                    if (result == MA_CRC_MISMATCH) {\n                        goto next_iteration;\n                    } else {\n                        return MA_FALSE;\n                    }\n                }\n            } else {\n                runningPCMFrameCount += pFlac->currentFLACFrame.pcmFramesRemaining;\n                pFlac->currentFLACFrame.pcmFramesRemaining = 0;\n                isMidFrame = MA_FALSE;\n            }\n            if (pcmFrameIndex == pFlac->totalPCMFrameCount && runningPCMFrameCount == pFlac->totalPCMFrameCount) {\n                return MA_TRUE;\n            }\n        }\n    next_iteration:\n        if (!ma_dr_flac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n            return MA_FALSE;\n        }\n    }\n}\n#ifndef MA_DR_FLAC_NO_OGG\ntypedef struct\n{\n    ma_uint8 capturePattern[4];\n    ma_uint8 structureVersion;\n    ma_uint8 headerType;\n    ma_uint64 granulePosition;\n    ma_uint32 serialNumber;\n    ma_uint32 sequenceNumber;\n    ma_uint32 checksum;\n    ma_uint8 segmentCount;\n    ma_uint8 segmentTable[255];\n} ma_dr_flac_ogg_page_header;\n#endif\ntypedef struct\n{\n    ma_dr_flac_read_proc onRead;\n    ma_dr_flac_seek_proc onSeek;\n    ma_dr_flac_meta_proc onMeta;\n    ma_dr_flac_container container;\n    void* pUserData;\n    void* pUserDataMD;\n    ma_uint32 sampleRate;\n    ma_uint8  channels;\n    ma_uint8  bitsPerSample;\n    ma_uint64 totalPCMFrameCount;\n    ma_uint16 maxBlockSizeInPCMFrames;\n    ma_uint64 runningFilePos;\n    ma_bool32 hasStreamInfoBlock;\n    ma_bool32 hasMetadataBlocks;\n    ma_dr_flac_bs bs;\n    ma_dr_flac_frame_header firstFrameHeader;\n#ifndef MA_DR_FLAC_NO_OGG\n    ma_uint32 oggSerial;\n    ma_uint64 oggFirstBytePos;\n    ma_dr_flac_ogg_page_header oggBosHeader;\n#endif\n} ma_dr_flac_init_info;\nstatic MA_INLINE void ma_dr_flac__decode_block_header(ma_uint32 blockHeader, ma_uint8* isLastBlock, ma_uint8* blockType, ma_uint32* blockSize)\n{\n    blockHeader = ma_dr_flac__be2host_32(blockHeader);\n    *isLastBlock = (ma_uint8)((blockHeader & 0x80000000UL) >> 31);\n    *blockType   = (ma_uint8)((blockHeader & 0x7F000000UL) >> 24);\n    *blockSize   =                (blockHeader & 0x00FFFFFFUL);\n}\nstatic MA_INLINE ma_bool32 ma_dr_flac__read_and_decode_block_header(ma_dr_flac_read_proc onRead, void* pUserData, ma_uint8* isLastBlock, ma_uint8* blockType, ma_uint32* blockSize)\n{\n    ma_uint32 blockHeader;\n    *blockSize = 0;\n    if (onRead(pUserData, &blockHeader, 4) != 4) {\n        return MA_FALSE;\n    }\n    ma_dr_flac__decode_block_header(blockHeader, isLastBlock, blockType, blockSize);\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__read_streaminfo(ma_dr_flac_read_proc onRead, void* pUserData, ma_dr_flac_streaminfo* pStreamInfo)\n{\n    ma_uint32 blockSizes;\n    ma_uint64 frameSizes = 0;\n    ma_uint64 importantProps;\n    ma_uint8 md5[16];\n    if (onRead(pUserData, &blockSizes, 4) != 4) {\n        return MA_FALSE;\n    }\n    if (onRead(pUserData, &frameSizes, 6) != 6) {\n        return MA_FALSE;\n    }\n    if (onRead(pUserData, &importantProps, 8) != 8) {\n        return MA_FALSE;\n    }\n    if (onRead(pUserData, md5, sizeof(md5)) != sizeof(md5)) {\n        return MA_FALSE;\n    }\n    blockSizes     = ma_dr_flac__be2host_32(blockSizes);\n    frameSizes     = ma_dr_flac__be2host_64(frameSizes);\n    importantProps = ma_dr_flac__be2host_64(importantProps);\n    pStreamInfo->minBlockSizeInPCMFrames = (ma_uint16)((blockSizes & 0xFFFF0000) >> 16);\n    pStreamInfo->maxBlockSizeInPCMFrames = (ma_uint16) (blockSizes & 0x0000FFFF);\n    pStreamInfo->minFrameSizeInPCMFrames = (ma_uint32)((frameSizes     &  (((ma_uint64)0x00FFFFFF << 16) << 24)) >> 40);\n    pStreamInfo->maxFrameSizeInPCMFrames = (ma_uint32)((frameSizes     &  (((ma_uint64)0x00FFFFFF << 16) <<  0)) >> 16);\n    pStreamInfo->sampleRate              = (ma_uint32)((importantProps &  (((ma_uint64)0x000FFFFF << 16) << 28)) >> 44);\n    pStreamInfo->channels                = (ma_uint8 )((importantProps &  (((ma_uint64)0x0000000E << 16) << 24)) >> 41) + 1;\n    pStreamInfo->bitsPerSample           = (ma_uint8 )((importantProps &  (((ma_uint64)0x0000001F << 16) << 20)) >> 36) + 1;\n    pStreamInfo->totalPCMFrameCount      =                ((importantProps & ((((ma_uint64)0x0000000F << 16) << 16) | 0xFFFFFFFF)));\n    MA_DR_FLAC_COPY_MEMORY(pStreamInfo->md5, md5, sizeof(md5));\n    return MA_TRUE;\n}\nstatic void* ma_dr_flac__malloc_default(size_t sz, void* pUserData)\n{\n    (void)pUserData;\n    return MA_DR_FLAC_MALLOC(sz);\n}\nstatic void* ma_dr_flac__realloc_default(void* p, size_t sz, void* pUserData)\n{\n    (void)pUserData;\n    return MA_DR_FLAC_REALLOC(p, sz);\n}\nstatic void ma_dr_flac__free_default(void* p, void* pUserData)\n{\n    (void)pUserData;\n    MA_DR_FLAC_FREE(p);\n}\nstatic void* ma_dr_flac__malloc_from_callbacks(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks == NULL) {\n        return NULL;\n    }\n    if (pAllocationCallbacks->onMalloc != NULL) {\n        return pAllocationCallbacks->onMalloc(sz, pAllocationCallbacks->pUserData);\n    }\n    if (pAllocationCallbacks->onRealloc != NULL) {\n        return pAllocationCallbacks->onRealloc(NULL, sz, pAllocationCallbacks->pUserData);\n    }\n    return NULL;\n}\nstatic void* ma_dr_flac__realloc_from_callbacks(void* p, size_t szNew, size_t szOld, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks == NULL) {\n        return NULL;\n    }\n    if (pAllocationCallbacks->onRealloc != NULL) {\n        return pAllocationCallbacks->onRealloc(p, szNew, pAllocationCallbacks->pUserData);\n    }\n    if (pAllocationCallbacks->onMalloc != NULL && pAllocationCallbacks->onFree != NULL) {\n        void* p2;\n        p2 = pAllocationCallbacks->onMalloc(szNew, pAllocationCallbacks->pUserData);\n        if (p2 == NULL) {\n            return NULL;\n        }\n        if (p != NULL) {\n            MA_DR_FLAC_COPY_MEMORY(p2, p, szOld);\n            pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);\n        }\n        return p2;\n    }\n    return NULL;\n}\nstatic void ma_dr_flac__free_from_callbacks(void* p, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (p == NULL || pAllocationCallbacks == NULL) {\n        return;\n    }\n    if (pAllocationCallbacks->onFree != NULL) {\n        pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);\n    }\n}\nstatic ma_bool32 ma_dr_flac__read_and_decode_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, void* pUserData, void* pUserDataMD, ma_uint64* pFirstFramePos, ma_uint64* pSeektablePos, ma_uint32* pSeekpointCount, ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_uint64 runningFilePos = 42;\n    ma_uint64 seektablePos   = 0;\n    ma_uint32 seektableSize  = 0;\n    for (;;) {\n        ma_dr_flac_metadata metadata;\n        ma_uint8 isLastBlock = 0;\n        ma_uint8 blockType = 0;\n        ma_uint32 blockSize;\n        if (ma_dr_flac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize) == MA_FALSE) {\n            return MA_FALSE;\n        }\n        runningFilePos += 4;\n        metadata.type = blockType;\n        metadata.pRawData = NULL;\n        metadata.rawDataSize = 0;\n        switch (blockType)\n        {\n            case MA_DR_FLAC_METADATA_BLOCK_TYPE_APPLICATION:\n            {\n                if (blockSize < 4) {\n                    return MA_FALSE;\n                }\n                if (onMeta) {\n                    void* pRawData = ma_dr_flac__malloc_from_callbacks(blockSize, pAllocationCallbacks);\n                    if (pRawData == NULL) {\n                        return MA_FALSE;\n                    }\n                    if (onRead(pUserData, pRawData, blockSize) != blockSize) {\n                        ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return MA_FALSE;\n                    }\n                    metadata.pRawData = pRawData;\n                    metadata.rawDataSize = blockSize;\n                    metadata.data.application.id       = ma_dr_flac__be2host_32(*(ma_uint32*)pRawData);\n                    metadata.data.application.pData    = (const void*)((ma_uint8*)pRawData + sizeof(ma_uint32));\n                    metadata.data.application.dataSize = blockSize - sizeof(ma_uint32);\n                    onMeta(pUserDataMD, &metadata);\n                    ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                }\n            } break;\n            case MA_DR_FLAC_METADATA_BLOCK_TYPE_SEEKTABLE:\n            {\n                seektablePos  = runningFilePos;\n                seektableSize = blockSize;\n                if (onMeta) {\n                    ma_uint32 seekpointCount;\n                    ma_uint32 iSeekpoint;\n                    void* pRawData;\n                    seekpointCount = blockSize/MA_DR_FLAC_SEEKPOINT_SIZE_IN_BYTES;\n                    pRawData = ma_dr_flac__malloc_from_callbacks(seekpointCount * sizeof(ma_dr_flac_seekpoint), pAllocationCallbacks);\n                    if (pRawData == NULL) {\n                        return MA_FALSE;\n                    }\n                    for (iSeekpoint = 0; iSeekpoint < seekpointCount; ++iSeekpoint) {\n                        ma_dr_flac_seekpoint* pSeekpoint = (ma_dr_flac_seekpoint*)pRawData + iSeekpoint;\n                        if (onRead(pUserData, pSeekpoint, MA_DR_FLAC_SEEKPOINT_SIZE_IN_BYTES) != MA_DR_FLAC_SEEKPOINT_SIZE_IN_BYTES) {\n                            ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                            return MA_FALSE;\n                        }\n                        pSeekpoint->firstPCMFrame   = ma_dr_flac__be2host_64(pSeekpoint->firstPCMFrame);\n                        pSeekpoint->flacFrameOffset = ma_dr_flac__be2host_64(pSeekpoint->flacFrameOffset);\n                        pSeekpoint->pcmFrameCount   = ma_dr_flac__be2host_16(pSeekpoint->pcmFrameCount);\n                    }\n                    metadata.pRawData = pRawData;\n                    metadata.rawDataSize = blockSize;\n                    metadata.data.seektable.seekpointCount = seekpointCount;\n                    metadata.data.seektable.pSeekpoints = (const ma_dr_flac_seekpoint*)pRawData;\n                    onMeta(pUserDataMD, &metadata);\n                    ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                }\n            } break;\n            case MA_DR_FLAC_METADATA_BLOCK_TYPE_VORBIS_COMMENT:\n            {\n                if (blockSize < 8) {\n                    return MA_FALSE;\n                }\n                if (onMeta) {\n                    void* pRawData;\n                    const char* pRunningData;\n                    const char* pRunningDataEnd;\n                    ma_uint32 i;\n                    pRawData = ma_dr_flac__malloc_from_callbacks(blockSize, pAllocationCallbacks);\n                    if (pRawData == NULL) {\n                        return MA_FALSE;\n                    }\n                    if (onRead(pUserData, pRawData, blockSize) != blockSize) {\n                        ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return MA_FALSE;\n                    }\n                    metadata.pRawData = pRawData;\n                    metadata.rawDataSize = blockSize;\n                    pRunningData    = (const char*)pRawData;\n                    pRunningDataEnd = (const char*)pRawData + blockSize;\n                    metadata.data.vorbis_comment.vendorLength = ma_dr_flac__le2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    if ((pRunningDataEnd - pRunningData) - 4 < (ma_int64)metadata.data.vorbis_comment.vendorLength) {\n                        ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return MA_FALSE;\n                    }\n                    metadata.data.vorbis_comment.vendor       = pRunningData;                                            pRunningData += metadata.data.vorbis_comment.vendorLength;\n                    metadata.data.vorbis_comment.commentCount = ma_dr_flac__le2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    if ((pRunningDataEnd - pRunningData) / sizeof(ma_uint32) < metadata.data.vorbis_comment.commentCount) {\n                        ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return MA_FALSE;\n                    }\n                    metadata.data.vorbis_comment.pComments    = pRunningData;\n                    for (i = 0; i < metadata.data.vorbis_comment.commentCount; ++i) {\n                        ma_uint32 commentLength;\n                        if (pRunningDataEnd - pRunningData < 4) {\n                            ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                            return MA_FALSE;\n                        }\n                        commentLength = ma_dr_flac__le2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                        if (pRunningDataEnd - pRunningData < (ma_int64)commentLength) {\n                            ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                            return MA_FALSE;\n                        }\n                        pRunningData += commentLength;\n                    }\n                    onMeta(pUserDataMD, &metadata);\n                    ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                }\n            } break;\n            case MA_DR_FLAC_METADATA_BLOCK_TYPE_CUESHEET:\n            {\n                if (blockSize < 396) {\n                    return MA_FALSE;\n                }\n                if (onMeta) {\n                    void* pRawData;\n                    const char* pRunningData;\n                    const char* pRunningDataEnd;\n                    size_t bufferSize;\n                    ma_uint8 iTrack;\n                    ma_uint8 iIndex;\n                    void* pTrackData;\n                    pRawData = ma_dr_flac__malloc_from_callbacks(blockSize, pAllocationCallbacks);\n                    if (pRawData == NULL) {\n                        return MA_FALSE;\n                    }\n                    if (onRead(pUserData, pRawData, blockSize) != blockSize) {\n                        ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return MA_FALSE;\n                    }\n                    metadata.pRawData = pRawData;\n                    metadata.rawDataSize = blockSize;\n                    pRunningData    = (const char*)pRawData;\n                    pRunningDataEnd = (const char*)pRawData + blockSize;\n                    MA_DR_FLAC_COPY_MEMORY(metadata.data.cuesheet.catalog, pRunningData, 128);                              pRunningData += 128;\n                    metadata.data.cuesheet.leadInSampleCount = ma_dr_flac__be2host_64(*(const ma_uint64*)pRunningData); pRunningData += 8;\n                    metadata.data.cuesheet.isCD              = (pRunningData[0] & 0x80) != 0;                           pRunningData += 259;\n                    metadata.data.cuesheet.trackCount        = pRunningData[0];                                         pRunningData += 1;\n                    metadata.data.cuesheet.pTrackData        = NULL;\n                    {\n                        const char* pRunningDataSaved = pRunningData;\n                        bufferSize = metadata.data.cuesheet.trackCount * MA_DR_FLAC_CUESHEET_TRACK_SIZE_IN_BYTES;\n                        for (iTrack = 0; iTrack < metadata.data.cuesheet.trackCount; ++iTrack) {\n                            ma_uint8 indexCount;\n                            ma_uint32 indexPointSize;\n                            if (pRunningDataEnd - pRunningData < MA_DR_FLAC_CUESHEET_TRACK_SIZE_IN_BYTES) {\n                                ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                                return MA_FALSE;\n                            }\n                            pRunningData += 35;\n                            indexCount = pRunningData[0];\n                            pRunningData += 1;\n                            bufferSize += indexCount * sizeof(ma_dr_flac_cuesheet_track_index);\n                            indexPointSize = indexCount * MA_DR_FLAC_CUESHEET_TRACK_INDEX_SIZE_IN_BYTES;\n                            if (pRunningDataEnd - pRunningData < (ma_int64)indexPointSize) {\n                                ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                                return MA_FALSE;\n                            }\n                            pRunningData += indexPointSize;\n                        }\n                        pRunningData = pRunningDataSaved;\n                    }\n                    {\n                        char* pRunningTrackData;\n                        pTrackData = ma_dr_flac__malloc_from_callbacks(bufferSize, pAllocationCallbacks);\n                        if (pTrackData == NULL) {\n                            ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                            return MA_FALSE;\n                        }\n                        pRunningTrackData = (char*)pTrackData;\n                        for (iTrack = 0; iTrack < metadata.data.cuesheet.trackCount; ++iTrack) {\n                            ma_uint8 indexCount;\n                            MA_DR_FLAC_COPY_MEMORY(pRunningTrackData, pRunningData, MA_DR_FLAC_CUESHEET_TRACK_SIZE_IN_BYTES);\n                            pRunningData      += MA_DR_FLAC_CUESHEET_TRACK_SIZE_IN_BYTES-1;\n                            pRunningTrackData += MA_DR_FLAC_CUESHEET_TRACK_SIZE_IN_BYTES-1;\n                            indexCount = pRunningData[0];\n                            pRunningData      += 1;\n                            pRunningTrackData += 1;\n                            for (iIndex = 0; iIndex < indexCount; ++iIndex) {\n                                ma_dr_flac_cuesheet_track_index* pTrackIndex = (ma_dr_flac_cuesheet_track_index*)pRunningTrackData;\n                                MA_DR_FLAC_COPY_MEMORY(pRunningTrackData, pRunningData, MA_DR_FLAC_CUESHEET_TRACK_INDEX_SIZE_IN_BYTES);\n                                pRunningData      += MA_DR_FLAC_CUESHEET_TRACK_INDEX_SIZE_IN_BYTES;\n                                pRunningTrackData += sizeof(ma_dr_flac_cuesheet_track_index);\n                                pTrackIndex->offset = ma_dr_flac__be2host_64(pTrackIndex->offset);\n                            }\n                        }\n                        metadata.data.cuesheet.pTrackData = pTrackData;\n                    }\n                    ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                    pRawData = NULL;\n                    onMeta(pUserDataMD, &metadata);\n                    ma_dr_flac__free_from_callbacks(pTrackData, pAllocationCallbacks);\n                    pTrackData = NULL;\n                }\n            } break;\n            case MA_DR_FLAC_METADATA_BLOCK_TYPE_PICTURE:\n            {\n                if (blockSize < 32) {\n                    return MA_FALSE;\n                }\n                if (onMeta) {\n                    void* pRawData;\n                    const char* pRunningData;\n                    const char* pRunningDataEnd;\n                    pRawData = ma_dr_flac__malloc_from_callbacks(blockSize, pAllocationCallbacks);\n                    if (pRawData == NULL) {\n                        return MA_FALSE;\n                    }\n                    if (onRead(pUserData, pRawData, blockSize) != blockSize) {\n                        ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return MA_FALSE;\n                    }\n                    metadata.pRawData = pRawData;\n                    metadata.rawDataSize = blockSize;\n                    pRunningData    = (const char*)pRawData;\n                    pRunningDataEnd = (const char*)pRawData + blockSize;\n                    metadata.data.picture.type       = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    metadata.data.picture.mimeLength = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    if ((pRunningDataEnd - pRunningData) - 24 < (ma_int64)metadata.data.picture.mimeLength) {\n                        ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return MA_FALSE;\n                    }\n                    metadata.data.picture.mime              = pRunningData;                                   pRunningData += metadata.data.picture.mimeLength;\n                    metadata.data.picture.descriptionLength = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    if ((pRunningDataEnd - pRunningData) - 20 < (ma_int64)metadata.data.picture.descriptionLength) {\n                        ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return MA_FALSE;\n                    }\n                    metadata.data.picture.description     = pRunningData;                                   pRunningData += metadata.data.picture.descriptionLength;\n                    metadata.data.picture.width           = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    metadata.data.picture.height          = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    metadata.data.picture.colorDepth      = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    metadata.data.picture.indexColorCount = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    metadata.data.picture.pictureDataSize = ma_dr_flac__be2host_32_ptr_unaligned(pRunningData); pRunningData += 4;\n                    metadata.data.picture.pPictureData    = (const ma_uint8*)pRunningData;\n                    if (pRunningDataEnd - pRunningData < (ma_int64)metadata.data.picture.pictureDataSize) {\n                        ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return MA_FALSE;\n                    }\n                    onMeta(pUserDataMD, &metadata);\n                    ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                }\n            } break;\n            case MA_DR_FLAC_METADATA_BLOCK_TYPE_PADDING:\n            {\n                if (onMeta) {\n                    metadata.data.padding.unused = 0;\n                    if (!onSeek(pUserData, blockSize, ma_dr_flac_seek_origin_current)) {\n                        isLastBlock = MA_TRUE;\n                    } else {\n                        onMeta(pUserDataMD, &metadata);\n                    }\n                }\n            } break;\n            case MA_DR_FLAC_METADATA_BLOCK_TYPE_INVALID:\n            {\n                if (onMeta) {\n                    if (!onSeek(pUserData, blockSize, ma_dr_flac_seek_origin_current)) {\n                        isLastBlock = MA_TRUE;\n                    }\n                }\n            } break;\n            default:\n            {\n                if (onMeta) {\n                    void* pRawData = ma_dr_flac__malloc_from_callbacks(blockSize, pAllocationCallbacks);\n                    if (pRawData == NULL) {\n                        return MA_FALSE;\n                    }\n                    if (onRead(pUserData, pRawData, blockSize) != blockSize) {\n                        ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                        return MA_FALSE;\n                    }\n                    metadata.pRawData = pRawData;\n                    metadata.rawDataSize = blockSize;\n                    onMeta(pUserDataMD, &metadata);\n                    ma_dr_flac__free_from_callbacks(pRawData, pAllocationCallbacks);\n                }\n            } break;\n        }\n        if (onMeta == NULL && blockSize > 0) {\n            if (!onSeek(pUserData, blockSize, ma_dr_flac_seek_origin_current)) {\n                isLastBlock = MA_TRUE;\n            }\n        }\n        runningFilePos += blockSize;\n        if (isLastBlock) {\n            break;\n        }\n    }\n    *pSeektablePos   = seektablePos;\n    *pSeekpointCount = seektableSize / MA_DR_FLAC_SEEKPOINT_SIZE_IN_BYTES;\n    *pFirstFramePos  = runningFilePos;\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac__init_private__native(ma_dr_flac_init_info* pInit, ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, void* pUserData, void* pUserDataMD, ma_bool32 relaxed)\n{\n    ma_uint8 isLastBlock;\n    ma_uint8 blockType;\n    ma_uint32 blockSize;\n    (void)onSeek;\n    pInit->container = ma_dr_flac_container_native;\n    if (!ma_dr_flac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize)) {\n        return MA_FALSE;\n    }\n    if (blockType != MA_DR_FLAC_METADATA_BLOCK_TYPE_STREAMINFO || blockSize != 34) {\n        if (!relaxed) {\n            return MA_FALSE;\n        } else {\n            pInit->hasStreamInfoBlock = MA_FALSE;\n            pInit->hasMetadataBlocks  = MA_FALSE;\n            if (!ma_dr_flac__read_next_flac_frame_header(&pInit->bs, 0, &pInit->firstFrameHeader)) {\n                return MA_FALSE;\n            }\n            if (pInit->firstFrameHeader.bitsPerSample == 0) {\n                return MA_FALSE;\n            }\n            pInit->sampleRate              = pInit->firstFrameHeader.sampleRate;\n            pInit->channels                = ma_dr_flac__get_channel_count_from_channel_assignment(pInit->firstFrameHeader.channelAssignment);\n            pInit->bitsPerSample           = pInit->firstFrameHeader.bitsPerSample;\n            pInit->maxBlockSizeInPCMFrames = 65535;\n            return MA_TRUE;\n        }\n    } else {\n        ma_dr_flac_streaminfo streaminfo;\n        if (!ma_dr_flac__read_streaminfo(onRead, pUserData, &streaminfo)) {\n            return MA_FALSE;\n        }\n        pInit->hasStreamInfoBlock      = MA_TRUE;\n        pInit->sampleRate              = streaminfo.sampleRate;\n        pInit->channels                = streaminfo.channels;\n        pInit->bitsPerSample           = streaminfo.bitsPerSample;\n        pInit->totalPCMFrameCount      = streaminfo.totalPCMFrameCount;\n        pInit->maxBlockSizeInPCMFrames = streaminfo.maxBlockSizeInPCMFrames;\n        pInit->hasMetadataBlocks       = !isLastBlock;\n        if (onMeta) {\n            ma_dr_flac_metadata metadata;\n            metadata.type = MA_DR_FLAC_METADATA_BLOCK_TYPE_STREAMINFO;\n            metadata.pRawData = NULL;\n            metadata.rawDataSize = 0;\n            metadata.data.streaminfo = streaminfo;\n            onMeta(pUserDataMD, &metadata);\n        }\n        return MA_TRUE;\n    }\n}\n#ifndef MA_DR_FLAC_NO_OGG\n#define MA_DR_FLAC_OGG_MAX_PAGE_SIZE            65307\n#define MA_DR_FLAC_OGG_CAPTURE_PATTERN_CRC32    1605413199\ntypedef enum\n{\n    ma_dr_flac_ogg_recover_on_crc_mismatch,\n    ma_dr_flac_ogg_fail_on_crc_mismatch\n} ma_dr_flac_ogg_crc_mismatch_recovery;\n#ifndef MA_DR_FLAC_NO_CRC\nstatic ma_uint32 ma_dr_flac__crc32_table[] = {\n    0x00000000L, 0x04C11DB7L, 0x09823B6EL, 0x0D4326D9L,\n    0x130476DCL, 0x17C56B6BL, 0x1A864DB2L, 0x1E475005L,\n    0x2608EDB8L, 0x22C9F00FL, 0x2F8AD6D6L, 0x2B4BCB61L,\n    0x350C9B64L, 0x31CD86D3L, 0x3C8EA00AL, 0x384FBDBDL,\n    0x4C11DB70L, 0x48D0C6C7L, 0x4593E01EL, 0x4152FDA9L,\n    0x5F15ADACL, 0x5BD4B01BL, 0x569796C2L, 0x52568B75L,\n    0x6A1936C8L, 0x6ED82B7FL, 0x639B0DA6L, 0x675A1011L,\n    0x791D4014L, 0x7DDC5DA3L, 0x709F7B7AL, 0x745E66CDL,\n    0x9823B6E0L, 0x9CE2AB57L, 0x91A18D8EL, 0x95609039L,\n    0x8B27C03CL, 0x8FE6DD8BL, 0x82A5FB52L, 0x8664E6E5L,\n    0xBE2B5B58L, 0xBAEA46EFL, 0xB7A96036L, 0xB3687D81L,\n    0xAD2F2D84L, 0xA9EE3033L, 0xA4AD16EAL, 0xA06C0B5DL,\n    0xD4326D90L, 0xD0F37027L, 0xDDB056FEL, 0xD9714B49L,\n    0xC7361B4CL, 0xC3F706FBL, 0xCEB42022L, 0xCA753D95L,\n    0xF23A8028L, 0xF6FB9D9FL, 0xFBB8BB46L, 0xFF79A6F1L,\n    0xE13EF6F4L, 0xE5FFEB43L, 0xE8BCCD9AL, 0xEC7DD02DL,\n    0x34867077L, 0x30476DC0L, 0x3D044B19L, 0x39C556AEL,\n    0x278206ABL, 0x23431B1CL, 0x2E003DC5L, 0x2AC12072L,\n    0x128E9DCFL, 0x164F8078L, 0x1B0CA6A1L, 0x1FCDBB16L,\n    0x018AEB13L, 0x054BF6A4L, 0x0808D07DL, 0x0CC9CDCAL,\n    0x7897AB07L, 0x7C56B6B0L, 0x71159069L, 0x75D48DDEL,\n    0x6B93DDDBL, 0x6F52C06CL, 0x6211E6B5L, 0x66D0FB02L,\n    0x5E9F46BFL, 0x5A5E5B08L, 0x571D7DD1L, 0x53DC6066L,\n    0x4D9B3063L, 0x495A2DD4L, 0x44190B0DL, 0x40D816BAL,\n    0xACA5C697L, 0xA864DB20L, 0xA527FDF9L, 0xA1E6E04EL,\n    0xBFA1B04BL, 0xBB60ADFCL, 0xB6238B25L, 0xB2E29692L,\n    0x8AAD2B2FL, 0x8E6C3698L, 0x832F1041L, 0x87EE0DF6L,\n    0x99A95DF3L, 0x9D684044L, 0x902B669DL, 0x94EA7B2AL,\n    0xE0B41DE7L, 0xE4750050L, 0xE9362689L, 0xEDF73B3EL,\n    0xF3B06B3BL, 0xF771768CL, 0xFA325055L, 0xFEF34DE2L,\n    0xC6BCF05FL, 0xC27DEDE8L, 0xCF3ECB31L, 0xCBFFD686L,\n    0xD5B88683L, 0xD1799B34L, 0xDC3ABDEDL, 0xD8FBA05AL,\n    0x690CE0EEL, 0x6DCDFD59L, 0x608EDB80L, 0x644FC637L,\n    0x7A089632L, 0x7EC98B85L, 0x738AAD5CL, 0x774BB0EBL,\n    0x4F040D56L, 0x4BC510E1L, 0x46863638L, 0x42472B8FL,\n    0x5C007B8AL, 0x58C1663DL, 0x558240E4L, 0x51435D53L,\n    0x251D3B9EL, 0x21DC2629L, 0x2C9F00F0L, 0x285E1D47L,\n    0x36194D42L, 0x32D850F5L, 0x3F9B762CL, 0x3B5A6B9BL,\n    0x0315D626L, 0x07D4CB91L, 0x0A97ED48L, 0x0E56F0FFL,\n    0x1011A0FAL, 0x14D0BD4DL, 0x19939B94L, 0x1D528623L,\n    0xF12F560EL, 0xF5EE4BB9L, 0xF8AD6D60L, 0xFC6C70D7L,\n    0xE22B20D2L, 0xE6EA3D65L, 0xEBA91BBCL, 0xEF68060BL,\n    0xD727BBB6L, 0xD3E6A601L, 0xDEA580D8L, 0xDA649D6FL,\n    0xC423CD6AL, 0xC0E2D0DDL, 0xCDA1F604L, 0xC960EBB3L,\n    0xBD3E8D7EL, 0xB9FF90C9L, 0xB4BCB610L, 0xB07DABA7L,\n    0xAE3AFBA2L, 0xAAFBE615L, 0xA7B8C0CCL, 0xA379DD7BL,\n    0x9B3660C6L, 0x9FF77D71L, 0x92B45BA8L, 0x9675461FL,\n    0x8832161AL, 0x8CF30BADL, 0x81B02D74L, 0x857130C3L,\n    0x5D8A9099L, 0x594B8D2EL, 0x5408ABF7L, 0x50C9B640L,\n    0x4E8EE645L, 0x4A4FFBF2L, 0x470CDD2BL, 0x43CDC09CL,\n    0x7B827D21L, 0x7F436096L, 0x7200464FL, 0x76C15BF8L,\n    0x68860BFDL, 0x6C47164AL, 0x61043093L, 0x65C52D24L,\n    0x119B4BE9L, 0x155A565EL, 0x18197087L, 0x1CD86D30L,\n    0x029F3D35L, 0x065E2082L, 0x0B1D065BL, 0x0FDC1BECL,\n    0x3793A651L, 0x3352BBE6L, 0x3E119D3FL, 0x3AD08088L,\n    0x2497D08DL, 0x2056CD3AL, 0x2D15EBE3L, 0x29D4F654L,\n    0xC5A92679L, 0xC1683BCEL, 0xCC2B1D17L, 0xC8EA00A0L,\n    0xD6AD50A5L, 0xD26C4D12L, 0xDF2F6BCBL, 0xDBEE767CL,\n    0xE3A1CBC1L, 0xE760D676L, 0xEA23F0AFL, 0xEEE2ED18L,\n    0xF0A5BD1DL, 0xF464A0AAL, 0xF9278673L, 0xFDE69BC4L,\n    0x89B8FD09L, 0x8D79E0BEL, 0x803AC667L, 0x84FBDBD0L,\n    0x9ABC8BD5L, 0x9E7D9662L, 0x933EB0BBL, 0x97FFAD0CL,\n    0xAFB010B1L, 0xAB710D06L, 0xA6322BDFL, 0xA2F33668L,\n    0xBCB4666DL, 0xB8757BDAL, 0xB5365D03L, 0xB1F740B4L\n};\n#endif\nstatic MA_INLINE ma_uint32 ma_dr_flac_crc32_byte(ma_uint32 crc32, ma_uint8 data)\n{\n#ifndef MA_DR_FLAC_NO_CRC\n    return (crc32 << 8) ^ ma_dr_flac__crc32_table[(ma_uint8)((crc32 >> 24) & 0xFF) ^ data];\n#else\n    (void)data;\n    return crc32;\n#endif\n}\n#if 0\nstatic MA_INLINE ma_uint32 ma_dr_flac_crc32_uint32(ma_uint32 crc32, ma_uint32 data)\n{\n    crc32 = ma_dr_flac_crc32_byte(crc32, (ma_uint8)((data >> 24) & 0xFF));\n    crc32 = ma_dr_flac_crc32_byte(crc32, (ma_uint8)((data >> 16) & 0xFF));\n    crc32 = ma_dr_flac_crc32_byte(crc32, (ma_uint8)((data >>  8) & 0xFF));\n    crc32 = ma_dr_flac_crc32_byte(crc32, (ma_uint8)((data >>  0) & 0xFF));\n    return crc32;\n}\nstatic MA_INLINE ma_uint32 ma_dr_flac_crc32_uint64(ma_uint32 crc32, ma_uint64 data)\n{\n    crc32 = ma_dr_flac_crc32_uint32(crc32, (ma_uint32)((data >> 32) & 0xFFFFFFFF));\n    crc32 = ma_dr_flac_crc32_uint32(crc32, (ma_uint32)((data >>  0) & 0xFFFFFFFF));\n    return crc32;\n}\n#endif\nstatic MA_INLINE ma_uint32 ma_dr_flac_crc32_buffer(ma_uint32 crc32, ma_uint8* pData, ma_uint32 dataSize)\n{\n    ma_uint32 i;\n    for (i = 0; i < dataSize; ++i) {\n        crc32 = ma_dr_flac_crc32_byte(crc32, pData[i]);\n    }\n    return crc32;\n}\nstatic MA_INLINE ma_bool32 ma_dr_flac_ogg__is_capture_pattern(ma_uint8 pattern[4])\n{\n    return pattern[0] == 'O' && pattern[1] == 'g' && pattern[2] == 'g' && pattern[3] == 'S';\n}\nstatic MA_INLINE ma_uint32 ma_dr_flac_ogg__get_page_header_size(ma_dr_flac_ogg_page_header* pHeader)\n{\n    return 27 + pHeader->segmentCount;\n}\nstatic MA_INLINE ma_uint32 ma_dr_flac_ogg__get_page_body_size(ma_dr_flac_ogg_page_header* pHeader)\n{\n    ma_uint32 pageBodySize = 0;\n    int i;\n    for (i = 0; i < pHeader->segmentCount; ++i) {\n        pageBodySize += pHeader->segmentTable[i];\n    }\n    return pageBodySize;\n}\nstatic ma_result ma_dr_flac_ogg__read_page_header_after_capture_pattern(ma_dr_flac_read_proc onRead, void* pUserData, ma_dr_flac_ogg_page_header* pHeader, ma_uint32* pBytesRead, ma_uint32* pCRC32)\n{\n    ma_uint8 data[23];\n    ma_uint32 i;\n    MA_DR_FLAC_ASSERT(*pCRC32 == MA_DR_FLAC_OGG_CAPTURE_PATTERN_CRC32);\n    if (onRead(pUserData, data, 23) != 23) {\n        return MA_AT_END;\n    }\n    *pBytesRead += 23;\n    pHeader->capturePattern[0] = 'O';\n    pHeader->capturePattern[1] = 'g';\n    pHeader->capturePattern[2] = 'g';\n    pHeader->capturePattern[3] = 'S';\n    pHeader->structureVersion = data[0];\n    pHeader->headerType       = data[1];\n    MA_DR_FLAC_COPY_MEMORY(&pHeader->granulePosition, &data[ 2], 8);\n    MA_DR_FLAC_COPY_MEMORY(&pHeader->serialNumber,    &data[10], 4);\n    MA_DR_FLAC_COPY_MEMORY(&pHeader->sequenceNumber,  &data[14], 4);\n    MA_DR_FLAC_COPY_MEMORY(&pHeader->checksum,        &data[18], 4);\n    pHeader->segmentCount     = data[22];\n    data[18] = 0;\n    data[19] = 0;\n    data[20] = 0;\n    data[21] = 0;\n    for (i = 0; i < 23; ++i) {\n        *pCRC32 = ma_dr_flac_crc32_byte(*pCRC32, data[i]);\n    }\n    if (onRead(pUserData, pHeader->segmentTable, pHeader->segmentCount) != pHeader->segmentCount) {\n        return MA_AT_END;\n    }\n    *pBytesRead += pHeader->segmentCount;\n    for (i = 0; i < pHeader->segmentCount; ++i) {\n        *pCRC32 = ma_dr_flac_crc32_byte(*pCRC32, pHeader->segmentTable[i]);\n    }\n    return MA_SUCCESS;\n}\nstatic ma_result ma_dr_flac_ogg__read_page_header(ma_dr_flac_read_proc onRead, void* pUserData, ma_dr_flac_ogg_page_header* pHeader, ma_uint32* pBytesRead, ma_uint32* pCRC32)\n{\n    ma_uint8 id[4];\n    *pBytesRead = 0;\n    if (onRead(pUserData, id, 4) != 4) {\n        return MA_AT_END;\n    }\n    *pBytesRead += 4;\n    for (;;) {\n        if (ma_dr_flac_ogg__is_capture_pattern(id)) {\n            ma_result result;\n            *pCRC32 = MA_DR_FLAC_OGG_CAPTURE_PATTERN_CRC32;\n            result = ma_dr_flac_ogg__read_page_header_after_capture_pattern(onRead, pUserData, pHeader, pBytesRead, pCRC32);\n            if (result == MA_SUCCESS) {\n                return MA_SUCCESS;\n            } else {\n                if (result == MA_CRC_MISMATCH) {\n                    continue;\n                } else {\n                    return result;\n                }\n            }\n        } else {\n            id[0] = id[1];\n            id[1] = id[2];\n            id[2] = id[3];\n            if (onRead(pUserData, &id[3], 1) != 1) {\n                return MA_AT_END;\n            }\n            *pBytesRead += 1;\n        }\n    }\n}\ntypedef struct\n{\n    ma_dr_flac_read_proc onRead;\n    ma_dr_flac_seek_proc onSeek;\n    void* pUserData;\n    ma_uint64 currentBytePos;\n    ma_uint64 firstBytePos;\n    ma_uint32 serialNumber;\n    ma_dr_flac_ogg_page_header bosPageHeader;\n    ma_dr_flac_ogg_page_header currentPageHeader;\n    ma_uint32 bytesRemainingInPage;\n    ma_uint32 pageDataSize;\n    ma_uint8 pageData[MA_DR_FLAC_OGG_MAX_PAGE_SIZE];\n} ma_dr_flac_oggbs;\nstatic size_t ma_dr_flac_oggbs__read_physical(ma_dr_flac_oggbs* oggbs, void* bufferOut, size_t bytesToRead)\n{\n    size_t bytesActuallyRead = oggbs->onRead(oggbs->pUserData, bufferOut, bytesToRead);\n    oggbs->currentBytePos += bytesActuallyRead;\n    return bytesActuallyRead;\n}\nstatic ma_bool32 ma_dr_flac_oggbs__seek_physical(ma_dr_flac_oggbs* oggbs, ma_uint64 offset, ma_dr_flac_seek_origin origin)\n{\n    if (origin == ma_dr_flac_seek_origin_start) {\n        if (offset <= 0x7FFFFFFF) {\n            if (!oggbs->onSeek(oggbs->pUserData, (int)offset, ma_dr_flac_seek_origin_start)) {\n                return MA_FALSE;\n            }\n            oggbs->currentBytePos = offset;\n            return MA_TRUE;\n        } else {\n            if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, ma_dr_flac_seek_origin_start)) {\n                return MA_FALSE;\n            }\n            oggbs->currentBytePos = offset;\n            return ma_dr_flac_oggbs__seek_physical(oggbs, offset - 0x7FFFFFFF, ma_dr_flac_seek_origin_current);\n        }\n    } else {\n        while (offset > 0x7FFFFFFF) {\n            if (!oggbs->onSeek(oggbs->pUserData, 0x7FFFFFFF, ma_dr_flac_seek_origin_current)) {\n                return MA_FALSE;\n            }\n            oggbs->currentBytePos += 0x7FFFFFFF;\n            offset -= 0x7FFFFFFF;\n        }\n        if (!oggbs->onSeek(oggbs->pUserData, (int)offset, ma_dr_flac_seek_origin_current)) {\n            return MA_FALSE;\n        }\n        oggbs->currentBytePos += offset;\n        return MA_TRUE;\n    }\n}\nstatic ma_bool32 ma_dr_flac_oggbs__goto_next_page(ma_dr_flac_oggbs* oggbs, ma_dr_flac_ogg_crc_mismatch_recovery recoveryMethod)\n{\n    ma_dr_flac_ogg_page_header header;\n    for (;;) {\n        ma_uint32 crc32 = 0;\n        ma_uint32 bytesRead;\n        ma_uint32 pageBodySize;\n#ifndef MA_DR_FLAC_NO_CRC\n        ma_uint32 actualCRC32;\n#endif\n        if (ma_dr_flac_ogg__read_page_header(oggbs->onRead, oggbs->pUserData, &header, &bytesRead, &crc32) != MA_SUCCESS) {\n            return MA_FALSE;\n        }\n        oggbs->currentBytePos += bytesRead;\n        pageBodySize = ma_dr_flac_ogg__get_page_body_size(&header);\n        if (pageBodySize > MA_DR_FLAC_OGG_MAX_PAGE_SIZE) {\n            continue;\n        }\n        if (header.serialNumber != oggbs->serialNumber) {\n            if (pageBodySize > 0 && !ma_dr_flac_oggbs__seek_physical(oggbs, pageBodySize, ma_dr_flac_seek_origin_current)) {\n                return MA_FALSE;\n            }\n            continue;\n        }\n        if (ma_dr_flac_oggbs__read_physical(oggbs, oggbs->pageData, pageBodySize) != pageBodySize) {\n            return MA_FALSE;\n        }\n        oggbs->pageDataSize = pageBodySize;\n#ifndef MA_DR_FLAC_NO_CRC\n        actualCRC32 = ma_dr_flac_crc32_buffer(crc32, oggbs->pageData, oggbs->pageDataSize);\n        if (actualCRC32 != header.checksum) {\n            if (recoveryMethod == ma_dr_flac_ogg_recover_on_crc_mismatch) {\n                continue;\n            } else {\n                ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_recover_on_crc_mismatch);\n                return MA_FALSE;\n            }\n        }\n#else\n        (void)recoveryMethod;\n#endif\n        oggbs->currentPageHeader = header;\n        oggbs->bytesRemainingInPage = pageBodySize;\n        return MA_TRUE;\n    }\n}\n#if 0\nstatic ma_uint8 ma_dr_flac_oggbs__get_current_segment_index(ma_dr_flac_oggbs* oggbs, ma_uint8* pBytesRemainingInSeg)\n{\n    ma_uint32 bytesConsumedInPage = ma_dr_flac_ogg__get_page_body_size(&oggbs->currentPageHeader) - oggbs->bytesRemainingInPage;\n    ma_uint8 iSeg = 0;\n    ma_uint32 iByte = 0;\n    while (iByte < bytesConsumedInPage) {\n        ma_uint8 segmentSize = oggbs->currentPageHeader.segmentTable[iSeg];\n        if (iByte + segmentSize > bytesConsumedInPage) {\n            break;\n        } else {\n            iSeg += 1;\n            iByte += segmentSize;\n        }\n    }\n    *pBytesRemainingInSeg = oggbs->currentPageHeader.segmentTable[iSeg] - (ma_uint8)(bytesConsumedInPage - iByte);\n    return iSeg;\n}\nstatic ma_bool32 ma_dr_flac_oggbs__seek_to_next_packet(ma_dr_flac_oggbs* oggbs)\n{\n    for (;;) {\n        ma_bool32 atEndOfPage = MA_FALSE;\n        ma_uint8 bytesRemainingInSeg;\n        ma_uint8 iFirstSeg = ma_dr_flac_oggbs__get_current_segment_index(oggbs, &bytesRemainingInSeg);\n        ma_uint32 bytesToEndOfPacketOrPage = bytesRemainingInSeg;\n        for (ma_uint8 iSeg = iFirstSeg; iSeg < oggbs->currentPageHeader.segmentCount; ++iSeg) {\n            ma_uint8 segmentSize = oggbs->currentPageHeader.segmentTable[iSeg];\n            if (segmentSize < 255) {\n                if (iSeg == oggbs->currentPageHeader.segmentCount-1) {\n                    atEndOfPage = MA_TRUE;\n                }\n                break;\n            }\n            bytesToEndOfPacketOrPage += segmentSize;\n        }\n        ma_dr_flac_oggbs__seek_physical(oggbs, bytesToEndOfPacketOrPage, ma_dr_flac_seek_origin_current);\n        oggbs->bytesRemainingInPage -= bytesToEndOfPacketOrPage;\n        if (atEndOfPage) {\n            if (!ma_dr_flac_oggbs__goto_next_page(oggbs)) {\n                return MA_FALSE;\n            }\n            if ((oggbs->currentPageHeader.headerType & 0x01) == 0) {\n                return MA_TRUE;\n            }\n        } else {\n            return MA_TRUE;\n        }\n    }\n}\nstatic ma_bool32 ma_dr_flac_oggbs__seek_to_next_frame(ma_dr_flac_oggbs* oggbs)\n{\n    return ma_dr_flac_oggbs__seek_to_next_packet(oggbs);\n}\n#endif\nstatic size_t ma_dr_flac__on_read_ogg(void* pUserData, void* bufferOut, size_t bytesToRead)\n{\n    ma_dr_flac_oggbs* oggbs = (ma_dr_flac_oggbs*)pUserData;\n    ma_uint8* pRunningBufferOut = (ma_uint8*)bufferOut;\n    size_t bytesRead = 0;\n    MA_DR_FLAC_ASSERT(oggbs != NULL);\n    MA_DR_FLAC_ASSERT(pRunningBufferOut != NULL);\n    while (bytesRead < bytesToRead) {\n        size_t bytesRemainingToRead = bytesToRead - bytesRead;\n        if (oggbs->bytesRemainingInPage >= bytesRemainingToRead) {\n            MA_DR_FLAC_COPY_MEMORY(pRunningBufferOut, oggbs->pageData + (oggbs->pageDataSize - oggbs->bytesRemainingInPage), bytesRemainingToRead);\n            bytesRead += bytesRemainingToRead;\n            oggbs->bytesRemainingInPage -= (ma_uint32)bytesRemainingToRead;\n            break;\n        }\n        if (oggbs->bytesRemainingInPage > 0) {\n            MA_DR_FLAC_COPY_MEMORY(pRunningBufferOut, oggbs->pageData + (oggbs->pageDataSize - oggbs->bytesRemainingInPage), oggbs->bytesRemainingInPage);\n            bytesRead += oggbs->bytesRemainingInPage;\n            pRunningBufferOut += oggbs->bytesRemainingInPage;\n            oggbs->bytesRemainingInPage = 0;\n        }\n        MA_DR_FLAC_ASSERT(bytesRemainingToRead > 0);\n        if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_recover_on_crc_mismatch)) {\n            break;\n        }\n    }\n    return bytesRead;\n}\nstatic ma_bool32 ma_dr_flac__on_seek_ogg(void* pUserData, int offset, ma_dr_flac_seek_origin origin)\n{\n    ma_dr_flac_oggbs* oggbs = (ma_dr_flac_oggbs*)pUserData;\n    int bytesSeeked = 0;\n    MA_DR_FLAC_ASSERT(oggbs != NULL);\n    MA_DR_FLAC_ASSERT(offset >= 0);\n    if (origin == ma_dr_flac_seek_origin_start) {\n        if (!ma_dr_flac_oggbs__seek_physical(oggbs, (int)oggbs->firstBytePos, ma_dr_flac_seek_origin_start)) {\n            return MA_FALSE;\n        }\n        if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_fail_on_crc_mismatch)) {\n            return MA_FALSE;\n        }\n        return ma_dr_flac__on_seek_ogg(pUserData, offset, ma_dr_flac_seek_origin_current);\n    }\n    MA_DR_FLAC_ASSERT(origin == ma_dr_flac_seek_origin_current);\n    while (bytesSeeked < offset) {\n        int bytesRemainingToSeek = offset - bytesSeeked;\n        MA_DR_FLAC_ASSERT(bytesRemainingToSeek >= 0);\n        if (oggbs->bytesRemainingInPage >= (size_t)bytesRemainingToSeek) {\n            bytesSeeked += bytesRemainingToSeek;\n            (void)bytesSeeked;\n            oggbs->bytesRemainingInPage -= bytesRemainingToSeek;\n            break;\n        }\n        if (oggbs->bytesRemainingInPage > 0) {\n            bytesSeeked += (int)oggbs->bytesRemainingInPage;\n            oggbs->bytesRemainingInPage = 0;\n        }\n        MA_DR_FLAC_ASSERT(bytesRemainingToSeek > 0);\n        if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_fail_on_crc_mismatch)) {\n            return MA_FALSE;\n        }\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_flac_ogg__seek_to_pcm_frame(ma_dr_flac* pFlac, ma_uint64 pcmFrameIndex)\n{\n    ma_dr_flac_oggbs* oggbs = (ma_dr_flac_oggbs*)pFlac->_oggbs;\n    ma_uint64 originalBytePos;\n    ma_uint64 runningGranulePosition;\n    ma_uint64 runningFrameBytePos;\n    ma_uint64 runningPCMFrameCount;\n    MA_DR_FLAC_ASSERT(oggbs != NULL);\n    originalBytePos = oggbs->currentBytePos;\n    if (!ma_dr_flac__seek_to_byte(&pFlac->bs, pFlac->firstFLACFramePosInBytes)) {\n        return MA_FALSE;\n    }\n    oggbs->bytesRemainingInPage = 0;\n    runningGranulePosition = 0;\n    for (;;) {\n        if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_recover_on_crc_mismatch)) {\n            ma_dr_flac_oggbs__seek_physical(oggbs, originalBytePos, ma_dr_flac_seek_origin_start);\n            return MA_FALSE;\n        }\n        runningFrameBytePos = oggbs->currentBytePos - ma_dr_flac_ogg__get_page_header_size(&oggbs->currentPageHeader) - oggbs->pageDataSize;\n        if (oggbs->currentPageHeader.granulePosition >= pcmFrameIndex) {\n            break;\n        }\n        if ((oggbs->currentPageHeader.headerType & 0x01) == 0) {\n            if (oggbs->currentPageHeader.segmentTable[0] >= 2) {\n                ma_uint8 firstBytesInPage[2];\n                firstBytesInPage[0] = oggbs->pageData[0];\n                firstBytesInPage[1] = oggbs->pageData[1];\n                if ((firstBytesInPage[0] == 0xFF) && (firstBytesInPage[1] & 0xFC) == 0xF8) {\n                    runningGranulePosition = oggbs->currentPageHeader.granulePosition;\n                }\n                continue;\n            }\n        }\n    }\n    if (!ma_dr_flac_oggbs__seek_physical(oggbs, runningFrameBytePos, ma_dr_flac_seek_origin_start)) {\n        return MA_FALSE;\n    }\n    if (!ma_dr_flac_oggbs__goto_next_page(oggbs, ma_dr_flac_ogg_recover_on_crc_mismatch)) {\n        return MA_FALSE;\n    }\n    runningPCMFrameCount = runningGranulePosition;\n    for (;;) {\n        ma_uint64 firstPCMFrameInFLACFrame = 0;\n        ma_uint64 lastPCMFrameInFLACFrame = 0;\n        ma_uint64 pcmFrameCountInThisFrame;\n        if (!ma_dr_flac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n            return MA_FALSE;\n        }\n        ma_dr_flac__get_pcm_frame_range_of_current_flac_frame(pFlac, &firstPCMFrameInFLACFrame, &lastPCMFrameInFLACFrame);\n        pcmFrameCountInThisFrame = (lastPCMFrameInFLACFrame - firstPCMFrameInFLACFrame) + 1;\n        if (pcmFrameIndex == pFlac->totalPCMFrameCount && (runningPCMFrameCount + pcmFrameCountInThisFrame) == pFlac->totalPCMFrameCount) {\n            ma_result result = ma_dr_flac__decode_flac_frame(pFlac);\n            if (result == MA_SUCCESS) {\n                pFlac->currentPCMFrame = pcmFrameIndex;\n                pFlac->currentFLACFrame.pcmFramesRemaining = 0;\n                return MA_TRUE;\n            } else {\n                return MA_FALSE;\n            }\n        }\n        if (pcmFrameIndex < (runningPCMFrameCount + pcmFrameCountInThisFrame)) {\n            ma_result result = ma_dr_flac__decode_flac_frame(pFlac);\n            if (result == MA_SUCCESS) {\n                ma_uint64 pcmFramesToDecode = (size_t)(pcmFrameIndex - runningPCMFrameCount);\n                if (pcmFramesToDecode == 0) {\n                    return MA_TRUE;\n                }\n                pFlac->currentPCMFrame = runningPCMFrameCount;\n                return ma_dr_flac__seek_forward_by_pcm_frames(pFlac, pcmFramesToDecode) == pcmFramesToDecode;\n            } else {\n                if (result == MA_CRC_MISMATCH) {\n                    continue;\n                } else {\n                    return MA_FALSE;\n                }\n            }\n        } else {\n            ma_result result = ma_dr_flac__seek_to_next_flac_frame(pFlac);\n            if (result == MA_SUCCESS) {\n                runningPCMFrameCount += pcmFrameCountInThisFrame;\n            } else {\n                if (result == MA_CRC_MISMATCH) {\n                    continue;\n                } else {\n                    return MA_FALSE;\n                }\n            }\n        }\n    }\n}\nstatic ma_bool32 ma_dr_flac__init_private__ogg(ma_dr_flac_init_info* pInit, ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, void* pUserData, void* pUserDataMD, ma_bool32 relaxed)\n{\n    ma_dr_flac_ogg_page_header header;\n    ma_uint32 crc32 = MA_DR_FLAC_OGG_CAPTURE_PATTERN_CRC32;\n    ma_uint32 bytesRead = 0;\n    (void)relaxed;\n    pInit->container = ma_dr_flac_container_ogg;\n    pInit->oggFirstBytePos = 0;\n    if (ma_dr_flac_ogg__read_page_header_after_capture_pattern(onRead, pUserData, &header, &bytesRead, &crc32) != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n    pInit->runningFilePos += bytesRead;\n    for (;;) {\n        int pageBodySize;\n        if ((header.headerType & 0x02) == 0) {\n            return MA_FALSE;\n        }\n        pageBodySize = ma_dr_flac_ogg__get_page_body_size(&header);\n        if (pageBodySize == 51) {\n            ma_uint32 bytesRemainingInPage = pageBodySize;\n            ma_uint8 packetType;\n            if (onRead(pUserData, &packetType, 1) != 1) {\n                return MA_FALSE;\n            }\n            bytesRemainingInPage -= 1;\n            if (packetType == 0x7F) {\n                ma_uint8 sig[4];\n                if (onRead(pUserData, sig, 4) != 4) {\n                    return MA_FALSE;\n                }\n                bytesRemainingInPage -= 4;\n                if (sig[0] == 'F' && sig[1] == 'L' && sig[2] == 'A' && sig[3] == 'C') {\n                    ma_uint8 mappingVersion[2];\n                    if (onRead(pUserData, mappingVersion, 2) != 2) {\n                        return MA_FALSE;\n                    }\n                    if (mappingVersion[0] != 1) {\n                        return MA_FALSE;\n                    }\n                    if (!onSeek(pUserData, 2, ma_dr_flac_seek_origin_current)) {\n                        return MA_FALSE;\n                    }\n                    if (onRead(pUserData, sig, 4) != 4) {\n                        return MA_FALSE;\n                    }\n                    if (sig[0] == 'f' && sig[1] == 'L' && sig[2] == 'a' && sig[3] == 'C') {\n                        ma_dr_flac_streaminfo streaminfo;\n                        ma_uint8 isLastBlock;\n                        ma_uint8 blockType;\n                        ma_uint32 blockSize;\n                        if (!ma_dr_flac__read_and_decode_block_header(onRead, pUserData, &isLastBlock, &blockType, &blockSize)) {\n                            return MA_FALSE;\n                        }\n                        if (blockType != MA_DR_FLAC_METADATA_BLOCK_TYPE_STREAMINFO || blockSize != 34) {\n                            return MA_FALSE;\n                        }\n                        if (ma_dr_flac__read_streaminfo(onRead, pUserData, &streaminfo)) {\n                            pInit->hasStreamInfoBlock      = MA_TRUE;\n                            pInit->sampleRate              = streaminfo.sampleRate;\n                            pInit->channels                = streaminfo.channels;\n                            pInit->bitsPerSample           = streaminfo.bitsPerSample;\n                            pInit->totalPCMFrameCount      = streaminfo.totalPCMFrameCount;\n                            pInit->maxBlockSizeInPCMFrames = streaminfo.maxBlockSizeInPCMFrames;\n                            pInit->hasMetadataBlocks       = !isLastBlock;\n                            if (onMeta) {\n                                ma_dr_flac_metadata metadata;\n                                metadata.type = MA_DR_FLAC_METADATA_BLOCK_TYPE_STREAMINFO;\n                                metadata.pRawData = NULL;\n                                metadata.rawDataSize = 0;\n                                metadata.data.streaminfo = streaminfo;\n                                onMeta(pUserDataMD, &metadata);\n                            }\n                            pInit->runningFilePos  += pageBodySize;\n                            pInit->oggFirstBytePos  = pInit->runningFilePos - 79;\n                            pInit->oggSerial        = header.serialNumber;\n                            pInit->oggBosHeader     = header;\n                            break;\n                        } else {\n                            return MA_FALSE;\n                        }\n                    } else {\n                        return MA_FALSE;\n                    }\n                } else {\n                    if (!onSeek(pUserData, bytesRemainingInPage, ma_dr_flac_seek_origin_current)) {\n                        return MA_FALSE;\n                    }\n                }\n            } else {\n                if (!onSeek(pUserData, bytesRemainingInPage, ma_dr_flac_seek_origin_current)) {\n                    return MA_FALSE;\n                }\n            }\n        } else {\n            if (!onSeek(pUserData, pageBodySize, ma_dr_flac_seek_origin_current)) {\n                return MA_FALSE;\n            }\n        }\n        pInit->runningFilePos += pageBodySize;\n        if (ma_dr_flac_ogg__read_page_header(onRead, pUserData, &header, &bytesRead, &crc32) != MA_SUCCESS) {\n            return MA_FALSE;\n        }\n        pInit->runningFilePos += bytesRead;\n    }\n    pInit->hasMetadataBlocks = MA_TRUE;\n    return MA_TRUE;\n}\n#endif\nstatic ma_bool32 ma_dr_flac__init_private(ma_dr_flac_init_info* pInit, ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, void* pUserDataMD)\n{\n    ma_bool32 relaxed;\n    ma_uint8 id[4];\n    if (pInit == NULL || onRead == NULL || onSeek == NULL) {\n        return MA_FALSE;\n    }\n    MA_DR_FLAC_ZERO_MEMORY(pInit, sizeof(*pInit));\n    pInit->onRead       = onRead;\n    pInit->onSeek       = onSeek;\n    pInit->onMeta       = onMeta;\n    pInit->container    = container;\n    pInit->pUserData    = pUserData;\n    pInit->pUserDataMD  = pUserDataMD;\n    pInit->bs.onRead    = onRead;\n    pInit->bs.onSeek    = onSeek;\n    pInit->bs.pUserData = pUserData;\n    ma_dr_flac__reset_cache(&pInit->bs);\n    relaxed = container != ma_dr_flac_container_unknown;\n    for (;;) {\n        if (onRead(pUserData, id, 4) != 4) {\n            return MA_FALSE;\n        }\n        pInit->runningFilePos += 4;\n        if (id[0] == 'I' && id[1] == 'D' && id[2] == '3') {\n            ma_uint8 header[6];\n            ma_uint8 flags;\n            ma_uint32 headerSize;\n            if (onRead(pUserData, header, 6) != 6) {\n                return MA_FALSE;\n            }\n            pInit->runningFilePos += 6;\n            flags = header[1];\n            MA_DR_FLAC_COPY_MEMORY(&headerSize, header+2, 4);\n            headerSize = ma_dr_flac__unsynchsafe_32(ma_dr_flac__be2host_32(headerSize));\n            if (flags & 0x10) {\n                headerSize += 10;\n            }\n            if (!onSeek(pUserData, headerSize, ma_dr_flac_seek_origin_current)) {\n                return MA_FALSE;\n            }\n            pInit->runningFilePos += headerSize;\n        } else {\n            break;\n        }\n    }\n    if (id[0] == 'f' && id[1] == 'L' && id[2] == 'a' && id[3] == 'C') {\n        return ma_dr_flac__init_private__native(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed);\n    }\n#ifndef MA_DR_FLAC_NO_OGG\n    if (id[0] == 'O' && id[1] == 'g' && id[2] == 'g' && id[3] == 'S') {\n        return ma_dr_flac__init_private__ogg(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed);\n    }\n#endif\n    if (relaxed) {\n        if (container == ma_dr_flac_container_native) {\n            return ma_dr_flac__init_private__native(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed);\n        }\n#ifndef MA_DR_FLAC_NO_OGG\n        if (container == ma_dr_flac_container_ogg) {\n            return ma_dr_flac__init_private__ogg(pInit, onRead, onSeek, onMeta, pUserData, pUserDataMD, relaxed);\n        }\n#endif\n    }\n    return MA_FALSE;\n}\nstatic void ma_dr_flac__init_from_info(ma_dr_flac* pFlac, const ma_dr_flac_init_info* pInit)\n{\n    MA_DR_FLAC_ASSERT(pFlac != NULL);\n    MA_DR_FLAC_ASSERT(pInit != NULL);\n    MA_DR_FLAC_ZERO_MEMORY(pFlac, sizeof(*pFlac));\n    pFlac->bs                      = pInit->bs;\n    pFlac->onMeta                  = pInit->onMeta;\n    pFlac->pUserDataMD             = pInit->pUserDataMD;\n    pFlac->maxBlockSizeInPCMFrames = pInit->maxBlockSizeInPCMFrames;\n    pFlac->sampleRate              = pInit->sampleRate;\n    pFlac->channels                = (ma_uint8)pInit->channels;\n    pFlac->bitsPerSample           = (ma_uint8)pInit->bitsPerSample;\n    pFlac->totalPCMFrameCount      = pInit->totalPCMFrameCount;\n    pFlac->container               = pInit->container;\n}\nstatic ma_dr_flac* ma_dr_flac_open_with_metadata_private(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, void* pUserDataMD, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac_init_info init;\n    ma_uint32 allocationSize;\n    ma_uint32 wholeSIMDVectorCountPerChannel;\n    ma_uint32 decodedSamplesAllocationSize;\n#ifndef MA_DR_FLAC_NO_OGG\n    ma_dr_flac_oggbs* pOggbs = NULL;\n#endif\n    ma_uint64 firstFramePos;\n    ma_uint64 seektablePos;\n    ma_uint32 seekpointCount;\n    ma_allocation_callbacks allocationCallbacks;\n    ma_dr_flac* pFlac;\n    ma_dr_flac__init_cpu_caps();\n    if (!ma_dr_flac__init_private(&init, onRead, onSeek, onMeta, container, pUserData, pUserDataMD)) {\n        return NULL;\n    }\n    if (pAllocationCallbacks != NULL) {\n        allocationCallbacks = *pAllocationCallbacks;\n        if (allocationCallbacks.onFree == NULL || (allocationCallbacks.onMalloc == NULL && allocationCallbacks.onRealloc == NULL)) {\n            return NULL;\n        }\n    } else {\n        allocationCallbacks.pUserData = NULL;\n        allocationCallbacks.onMalloc  = ma_dr_flac__malloc_default;\n        allocationCallbacks.onRealloc = ma_dr_flac__realloc_default;\n        allocationCallbacks.onFree    = ma_dr_flac__free_default;\n    }\n    allocationSize = sizeof(ma_dr_flac);\n    if ((init.maxBlockSizeInPCMFrames % (MA_DR_FLAC_MAX_SIMD_VECTOR_SIZE / sizeof(ma_int32))) == 0) {\n        wholeSIMDVectorCountPerChannel = (init.maxBlockSizeInPCMFrames / (MA_DR_FLAC_MAX_SIMD_VECTOR_SIZE / sizeof(ma_int32)));\n    } else {\n        wholeSIMDVectorCountPerChannel = (init.maxBlockSizeInPCMFrames / (MA_DR_FLAC_MAX_SIMD_VECTOR_SIZE / sizeof(ma_int32))) + 1;\n    }\n    decodedSamplesAllocationSize = wholeSIMDVectorCountPerChannel * MA_DR_FLAC_MAX_SIMD_VECTOR_SIZE * init.channels;\n    allocationSize += decodedSamplesAllocationSize;\n    allocationSize += MA_DR_FLAC_MAX_SIMD_VECTOR_SIZE;\n#ifndef MA_DR_FLAC_NO_OGG\n    if (init.container == ma_dr_flac_container_ogg) {\n        allocationSize += sizeof(ma_dr_flac_oggbs);\n        pOggbs = (ma_dr_flac_oggbs*)ma_dr_flac__malloc_from_callbacks(sizeof(*pOggbs), &allocationCallbacks);\n        if (pOggbs == NULL) {\n            return NULL;\n        }\n        MA_DR_FLAC_ZERO_MEMORY(pOggbs, sizeof(*pOggbs));\n        pOggbs->onRead = onRead;\n        pOggbs->onSeek = onSeek;\n        pOggbs->pUserData = pUserData;\n        pOggbs->currentBytePos = init.oggFirstBytePos;\n        pOggbs->firstBytePos = init.oggFirstBytePos;\n        pOggbs->serialNumber = init.oggSerial;\n        pOggbs->bosPageHeader = init.oggBosHeader;\n        pOggbs->bytesRemainingInPage = 0;\n    }\n#endif\n    firstFramePos  = 42;\n    seektablePos   = 0;\n    seekpointCount = 0;\n    if (init.hasMetadataBlocks) {\n        ma_dr_flac_read_proc onReadOverride = onRead;\n        ma_dr_flac_seek_proc onSeekOverride = onSeek;\n        void* pUserDataOverride = pUserData;\n#ifndef MA_DR_FLAC_NO_OGG\n        if (init.container == ma_dr_flac_container_ogg) {\n            onReadOverride = ma_dr_flac__on_read_ogg;\n            onSeekOverride = ma_dr_flac__on_seek_ogg;\n            pUserDataOverride = (void*)pOggbs;\n        }\n#endif\n        if (!ma_dr_flac__read_and_decode_metadata(onReadOverride, onSeekOverride, onMeta, pUserDataOverride, pUserDataMD, &firstFramePos, &seektablePos, &seekpointCount, &allocationCallbacks)) {\n        #ifndef MA_DR_FLAC_NO_OGG\n            ma_dr_flac__free_from_callbacks(pOggbs, &allocationCallbacks);\n        #endif\n            return NULL;\n        }\n        allocationSize += seekpointCount * sizeof(ma_dr_flac_seekpoint);\n    }\n    pFlac = (ma_dr_flac*)ma_dr_flac__malloc_from_callbacks(allocationSize, &allocationCallbacks);\n    if (pFlac == NULL) {\n    #ifndef MA_DR_FLAC_NO_OGG\n        ma_dr_flac__free_from_callbacks(pOggbs, &allocationCallbacks);\n    #endif\n        return NULL;\n    }\n    ma_dr_flac__init_from_info(pFlac, &init);\n    pFlac->allocationCallbacks = allocationCallbacks;\n    pFlac->pDecodedSamples = (ma_int32*)ma_dr_flac_align((size_t)pFlac->pExtraData, MA_DR_FLAC_MAX_SIMD_VECTOR_SIZE);\n#ifndef MA_DR_FLAC_NO_OGG\n    if (init.container == ma_dr_flac_container_ogg) {\n        ma_dr_flac_oggbs* pInternalOggbs = (ma_dr_flac_oggbs*)((ma_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize + (seekpointCount * sizeof(ma_dr_flac_seekpoint)));\n        MA_DR_FLAC_COPY_MEMORY(pInternalOggbs, pOggbs, sizeof(*pOggbs));\n        ma_dr_flac__free_from_callbacks(pOggbs, &allocationCallbacks);\n        pOggbs = NULL;\n        pFlac->bs.onRead = ma_dr_flac__on_read_ogg;\n        pFlac->bs.onSeek = ma_dr_flac__on_seek_ogg;\n        pFlac->bs.pUserData = (void*)pInternalOggbs;\n        pFlac->_oggbs = (void*)pInternalOggbs;\n    }\n#endif\n    pFlac->firstFLACFramePosInBytes = firstFramePos;\n#ifndef MA_DR_FLAC_NO_OGG\n    if (init.container == ma_dr_flac_container_ogg)\n    {\n        pFlac->pSeekpoints = NULL;\n        pFlac->seekpointCount = 0;\n    }\n    else\n#endif\n    {\n        if (seektablePos != 0) {\n            pFlac->seekpointCount = seekpointCount;\n            pFlac->pSeekpoints = (ma_dr_flac_seekpoint*)((ma_uint8*)pFlac->pDecodedSamples + decodedSamplesAllocationSize);\n            MA_DR_FLAC_ASSERT(pFlac->bs.onSeek != NULL);\n            MA_DR_FLAC_ASSERT(pFlac->bs.onRead != NULL);\n            if (pFlac->bs.onSeek(pFlac->bs.pUserData, (int)seektablePos, ma_dr_flac_seek_origin_start)) {\n                ma_uint32 iSeekpoint;\n                for (iSeekpoint = 0; iSeekpoint < seekpointCount; iSeekpoint += 1) {\n                    if (pFlac->bs.onRead(pFlac->bs.pUserData, pFlac->pSeekpoints + iSeekpoint, MA_DR_FLAC_SEEKPOINT_SIZE_IN_BYTES) == MA_DR_FLAC_SEEKPOINT_SIZE_IN_BYTES) {\n                        pFlac->pSeekpoints[iSeekpoint].firstPCMFrame   = ma_dr_flac__be2host_64(pFlac->pSeekpoints[iSeekpoint].firstPCMFrame);\n                        pFlac->pSeekpoints[iSeekpoint].flacFrameOffset = ma_dr_flac__be2host_64(pFlac->pSeekpoints[iSeekpoint].flacFrameOffset);\n                        pFlac->pSeekpoints[iSeekpoint].pcmFrameCount   = ma_dr_flac__be2host_16(pFlac->pSeekpoints[iSeekpoint].pcmFrameCount);\n                    } else {\n                        pFlac->pSeekpoints = NULL;\n                        pFlac->seekpointCount = 0;\n                        break;\n                    }\n                }\n                if (!pFlac->bs.onSeek(pFlac->bs.pUserData, (int)pFlac->firstFLACFramePosInBytes, ma_dr_flac_seek_origin_start)) {\n                    ma_dr_flac__free_from_callbacks(pFlac, &allocationCallbacks);\n                    return NULL;\n                }\n            } else {\n                pFlac->pSeekpoints = NULL;\n                pFlac->seekpointCount = 0;\n            }\n        }\n    }\n    if (!init.hasStreamInfoBlock) {\n        pFlac->currentFLACFrame.header = init.firstFrameHeader;\n        for (;;) {\n            ma_result result = ma_dr_flac__decode_flac_frame(pFlac);\n            if (result == MA_SUCCESS) {\n                break;\n            } else {\n                if (result == MA_CRC_MISMATCH) {\n                    if (!ma_dr_flac__read_next_flac_frame_header(&pFlac->bs, pFlac->bitsPerSample, &pFlac->currentFLACFrame.header)) {\n                        ma_dr_flac__free_from_callbacks(pFlac, &allocationCallbacks);\n                        return NULL;\n                    }\n                    continue;\n                } else {\n                    ma_dr_flac__free_from_callbacks(pFlac, &allocationCallbacks);\n                    return NULL;\n                }\n            }\n        }\n    }\n    return pFlac;\n}\n#ifndef MA_DR_FLAC_NO_STDIO\n#include <stdio.h>\n#ifndef MA_DR_FLAC_NO_WCHAR\n#include <wchar.h>\n#endif\nstatic size_t ma_dr_flac__on_read_stdio(void* pUserData, void* bufferOut, size_t bytesToRead)\n{\n    return fread(bufferOut, 1, bytesToRead, (FILE*)pUserData);\n}\nstatic ma_bool32 ma_dr_flac__on_seek_stdio(void* pUserData, int offset, ma_dr_flac_seek_origin origin)\n{\n    MA_DR_FLAC_ASSERT(offset >= 0);\n    return fseek((FILE*)pUserData, offset, (origin == ma_dr_flac_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0;\n}\nMA_API ma_dr_flac* ma_dr_flac_open_file(const char* pFileName, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac* pFlac;\n    FILE* pFile;\n    if (ma_fopen(&pFile, pFileName, \"rb\") != MA_SUCCESS) {\n        return NULL;\n    }\n    pFlac = ma_dr_flac_open(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, (void*)pFile, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        fclose(pFile);\n        return NULL;\n    }\n    return pFlac;\n}\n#ifndef MA_DR_FLAC_NO_WCHAR\nMA_API ma_dr_flac* ma_dr_flac_open_file_w(const wchar_t* pFileName, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac* pFlac;\n    FILE* pFile;\n    if (ma_wfopen(&pFile, pFileName, L\"rb\", pAllocationCallbacks) != MA_SUCCESS) {\n        return NULL;\n    }\n    pFlac = ma_dr_flac_open(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, (void*)pFile, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        fclose(pFile);\n        return NULL;\n    }\n    return pFlac;\n}\n#endif\nMA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata(const char* pFileName, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac* pFlac;\n    FILE* pFile;\n    if (ma_fopen(&pFile, pFileName, \"rb\") != MA_SUCCESS) {\n        return NULL;\n    }\n    pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, onMeta, ma_dr_flac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        fclose(pFile);\n        return pFlac;\n    }\n    return pFlac;\n}\n#ifndef MA_DR_FLAC_NO_WCHAR\nMA_API ma_dr_flac* ma_dr_flac_open_file_with_metadata_w(const wchar_t* pFileName, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac* pFlac;\n    FILE* pFile;\n    if (ma_wfopen(&pFile, pFileName, L\"rb\", pAllocationCallbacks) != MA_SUCCESS) {\n        return NULL;\n    }\n    pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_stdio, ma_dr_flac__on_seek_stdio, onMeta, ma_dr_flac_container_unknown, (void*)pFile, pUserData, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        fclose(pFile);\n        return pFlac;\n    }\n    return pFlac;\n}\n#endif\n#endif\nstatic size_t ma_dr_flac__on_read_memory(void* pUserData, void* bufferOut, size_t bytesToRead)\n{\n    ma_dr_flac__memory_stream* memoryStream = (ma_dr_flac__memory_stream*)pUserData;\n    size_t bytesRemaining;\n    MA_DR_FLAC_ASSERT(memoryStream != NULL);\n    MA_DR_FLAC_ASSERT(memoryStream->dataSize >= memoryStream->currentReadPos);\n    bytesRemaining = memoryStream->dataSize - memoryStream->currentReadPos;\n    if (bytesToRead > bytesRemaining) {\n        bytesToRead = bytesRemaining;\n    }\n    if (bytesToRead > 0) {\n        MA_DR_FLAC_COPY_MEMORY(bufferOut, memoryStream->data + memoryStream->currentReadPos, bytesToRead);\n        memoryStream->currentReadPos += bytesToRead;\n    }\n    return bytesToRead;\n}\nstatic ma_bool32 ma_dr_flac__on_seek_memory(void* pUserData, int offset, ma_dr_flac_seek_origin origin)\n{\n    ma_dr_flac__memory_stream* memoryStream = (ma_dr_flac__memory_stream*)pUserData;\n    MA_DR_FLAC_ASSERT(memoryStream != NULL);\n    MA_DR_FLAC_ASSERT(offset >= 0);\n    if (offset > (ma_int64)memoryStream->dataSize) {\n        return MA_FALSE;\n    }\n    if (origin == ma_dr_flac_seek_origin_current) {\n        if (memoryStream->currentReadPos + offset <= memoryStream->dataSize) {\n            memoryStream->currentReadPos += offset;\n        } else {\n            return MA_FALSE;\n        }\n    } else {\n        if ((ma_uint32)offset <= memoryStream->dataSize) {\n            memoryStream->currentReadPos = offset;\n        } else {\n            return MA_FALSE;\n        }\n    }\n    return MA_TRUE;\n}\nMA_API ma_dr_flac* ma_dr_flac_open_memory(const void* pData, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac__memory_stream memoryStream;\n    ma_dr_flac* pFlac;\n    memoryStream.data = (const ma_uint8*)pData;\n    memoryStream.dataSize = dataSize;\n    memoryStream.currentReadPos = 0;\n    pFlac = ma_dr_flac_open(ma_dr_flac__on_read_memory, ma_dr_flac__on_seek_memory, &memoryStream, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n    pFlac->memoryStream = memoryStream;\n#ifndef MA_DR_FLAC_NO_OGG\n    if (pFlac->container == ma_dr_flac_container_ogg)\n    {\n        ma_dr_flac_oggbs* oggbs = (ma_dr_flac_oggbs*)pFlac->_oggbs;\n        oggbs->pUserData = &pFlac->memoryStream;\n    }\n    else\n#endif\n    {\n        pFlac->bs.pUserData = &pFlac->memoryStream;\n    }\n    return pFlac;\n}\nMA_API ma_dr_flac* ma_dr_flac_open_memory_with_metadata(const void* pData, size_t dataSize, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac__memory_stream memoryStream;\n    ma_dr_flac* pFlac;\n    memoryStream.data = (const ma_uint8*)pData;\n    memoryStream.dataSize = dataSize;\n    memoryStream.currentReadPos = 0;\n    pFlac = ma_dr_flac_open_with_metadata_private(ma_dr_flac__on_read_memory, ma_dr_flac__on_seek_memory, onMeta, ma_dr_flac_container_unknown, &memoryStream, pUserData, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n    pFlac->memoryStream = memoryStream;\n#ifndef MA_DR_FLAC_NO_OGG\n    if (pFlac->container == ma_dr_flac_container_ogg)\n    {\n        ma_dr_flac_oggbs* oggbs = (ma_dr_flac_oggbs*)pFlac->_oggbs;\n        oggbs->pUserData = &pFlac->memoryStream;\n    }\n    else\n#endif\n    {\n        pFlac->bs.pUserData = &pFlac->memoryStream;\n    }\n    return pFlac;\n}\nMA_API ma_dr_flac* ma_dr_flac_open(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_flac_open_with_metadata_private(onRead, onSeek, NULL, ma_dr_flac_container_unknown, pUserData, pUserData, pAllocationCallbacks);\n}\nMA_API ma_dr_flac* ma_dr_flac_open_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_flac_open_with_metadata_private(onRead, onSeek, NULL, container, pUserData, pUserData, pAllocationCallbacks);\n}\nMA_API ma_dr_flac* ma_dr_flac_open_with_metadata(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onMeta, ma_dr_flac_container_unknown, pUserData, pUserData, pAllocationCallbacks);\n}\nMA_API ma_dr_flac* ma_dr_flac_open_with_metadata_relaxed(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, ma_dr_flac_meta_proc onMeta, ma_dr_flac_container container, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    return ma_dr_flac_open_with_metadata_private(onRead, onSeek, onMeta, container, pUserData, pUserData, pAllocationCallbacks);\n}\nMA_API void ma_dr_flac_close(ma_dr_flac* pFlac)\n{\n    if (pFlac == NULL) {\n        return;\n    }\n#ifndef MA_DR_FLAC_NO_STDIO\n    if (pFlac->bs.onRead == ma_dr_flac__on_read_stdio) {\n        fclose((FILE*)pFlac->bs.pUserData);\n    }\n#ifndef MA_DR_FLAC_NO_OGG\n    if (pFlac->container == ma_dr_flac_container_ogg) {\n        ma_dr_flac_oggbs* oggbs = (ma_dr_flac_oggbs*)pFlac->_oggbs;\n        MA_DR_FLAC_ASSERT(pFlac->bs.onRead == ma_dr_flac__on_read_ogg);\n        if (oggbs->onRead == ma_dr_flac__on_read_stdio) {\n            fclose((FILE*)oggbs->pUserData);\n        }\n    }\n#endif\n#endif\n    ma_dr_flac__free_from_callbacks(pFlac, &pFlac->allocationCallbacks);\n}\n#if 0\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_left_side__reference(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    for (i = 0; i < frameCount; ++i) {\n        ma_uint32 left  = (ma_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n        ma_uint32 side  = (ma_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n        ma_uint32 right = left - side;\n        pOutputSamples[i*2+0] = (ma_int32)left;\n        pOutputSamples[i*2+1] = (ma_int32)right;\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_left_side__scalar(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    for (i = 0; i < frameCount4; ++i) {\n        ma_uint32 left0 = pInputSamples0U32[i*4+0] << shift0;\n        ma_uint32 left1 = pInputSamples0U32[i*4+1] << shift0;\n        ma_uint32 left2 = pInputSamples0U32[i*4+2] << shift0;\n        ma_uint32 left3 = pInputSamples0U32[i*4+3] << shift0;\n        ma_uint32 side0 = pInputSamples1U32[i*4+0] << shift1;\n        ma_uint32 side1 = pInputSamples1U32[i*4+1] << shift1;\n        ma_uint32 side2 = pInputSamples1U32[i*4+2] << shift1;\n        ma_uint32 side3 = pInputSamples1U32[i*4+3] << shift1;\n        ma_uint32 right0 = left0 - side0;\n        ma_uint32 right1 = left1 - side1;\n        ma_uint32 right2 = left2 - side2;\n        ma_uint32 right3 = left3 - side3;\n        pOutputSamples[i*8+0] = (ma_int32)left0;\n        pOutputSamples[i*8+1] = (ma_int32)right0;\n        pOutputSamples[i*8+2] = (ma_int32)left1;\n        pOutputSamples[i*8+3] = (ma_int32)right1;\n        pOutputSamples[i*8+4] = (ma_int32)left2;\n        pOutputSamples[i*8+5] = (ma_int32)right2;\n        pOutputSamples[i*8+6] = (ma_int32)left3;\n        pOutputSamples[i*8+7] = (ma_int32)right3;\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 left  = pInputSamples0U32[i] << shift0;\n        ma_uint32 side  = pInputSamples1U32[i] << shift1;\n        ma_uint32 right = left - side;\n        pOutputSamples[i*2+0] = (ma_int32)left;\n        pOutputSamples[i*2+1] = (ma_int32)right;\n    }\n}\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_left_side__sse2(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i left  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        __m128i right = _mm_sub_epi32(left, side);\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right));\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 left  = pInputSamples0U32[i] << shift0;\n        ma_uint32 side  = pInputSamples1U32[i] << shift1;\n        ma_uint32 right = left - side;\n        pOutputSamples[i*2+0] = (ma_int32)left;\n        pOutputSamples[i*2+1] = (ma_int32)right;\n    }\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_left_side__neon(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    int32x4_t shift0_4;\n    int32x4_t shift1_4;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    shift0_4 = vdupq_n_s32(shift0);\n    shift1_4 = vdupq_n_s32(shift1);\n    for (i = 0; i < frameCount4; ++i) {\n        uint32x4_t left;\n        uint32x4_t side;\n        uint32x4_t right;\n        left  = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4);\n        side  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4);\n        right = vsubq_u32(left, side);\n        ma_dr_flac__vst2q_u32((ma_uint32*)pOutputSamples + i*8, vzipq_u32(left, right));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 left  = pInputSamples0U32[i] << shift0;\n        ma_uint32 side  = pInputSamples1U32[i] << shift1;\n        ma_uint32 right = left - side;\n        pOutputSamples[i*2+0] = (ma_int32)left;\n        pOutputSamples[i*2+1] = (ma_int32)right;\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_left_side(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\n    if (ma_dr_flac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s32__decode_left_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(MA_DR_FLAC_SUPPORT_NEON)\n    if (ma_dr_flac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s32__decode_left_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n#if 0\n        ma_dr_flac_read_pcm_frames_s32__decode_left_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        ma_dr_flac_read_pcm_frames_s32__decode_left_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n#if 0\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_right_side__reference(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    for (i = 0; i < frameCount; ++i) {\n        ma_uint32 side  = (ma_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n        ma_uint32 right = (ma_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n        ma_uint32 left  = right + side;\n        pOutputSamples[i*2+0] = (ma_int32)left;\n        pOutputSamples[i*2+1] = (ma_int32)right;\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_right_side__scalar(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    for (i = 0; i < frameCount4; ++i) {\n        ma_uint32 side0  = pInputSamples0U32[i*4+0] << shift0;\n        ma_uint32 side1  = pInputSamples0U32[i*4+1] << shift0;\n        ma_uint32 side2  = pInputSamples0U32[i*4+2] << shift0;\n        ma_uint32 side3  = pInputSamples0U32[i*4+3] << shift0;\n        ma_uint32 right0 = pInputSamples1U32[i*4+0] << shift1;\n        ma_uint32 right1 = pInputSamples1U32[i*4+1] << shift1;\n        ma_uint32 right2 = pInputSamples1U32[i*4+2] << shift1;\n        ma_uint32 right3 = pInputSamples1U32[i*4+3] << shift1;\n        ma_uint32 left0 = right0 + side0;\n        ma_uint32 left1 = right1 + side1;\n        ma_uint32 left2 = right2 + side2;\n        ma_uint32 left3 = right3 + side3;\n        pOutputSamples[i*8+0] = (ma_int32)left0;\n        pOutputSamples[i*8+1] = (ma_int32)right0;\n        pOutputSamples[i*8+2] = (ma_int32)left1;\n        pOutputSamples[i*8+3] = (ma_int32)right1;\n        pOutputSamples[i*8+4] = (ma_int32)left2;\n        pOutputSamples[i*8+5] = (ma_int32)right2;\n        pOutputSamples[i*8+6] = (ma_int32)left3;\n        pOutputSamples[i*8+7] = (ma_int32)right3;\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 side  = pInputSamples0U32[i] << shift0;\n        ma_uint32 right = pInputSamples1U32[i] << shift1;\n        ma_uint32 left  = right + side;\n        pOutputSamples[i*2+0] = (ma_int32)left;\n        pOutputSamples[i*2+1] = (ma_int32)right;\n    }\n}\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_right_side__sse2(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        __m128i left  = _mm_add_epi32(right, side);\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right));\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 side  = pInputSamples0U32[i] << shift0;\n        ma_uint32 right = pInputSamples1U32[i] << shift1;\n        ma_uint32 left  = right + side;\n        pOutputSamples[i*2+0] = (ma_int32)left;\n        pOutputSamples[i*2+1] = (ma_int32)right;\n    }\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_right_side__neon(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    int32x4_t shift0_4;\n    int32x4_t shift1_4;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    shift0_4 = vdupq_n_s32(shift0);\n    shift1_4 = vdupq_n_s32(shift1);\n    for (i = 0; i < frameCount4; ++i) {\n        uint32x4_t side;\n        uint32x4_t right;\n        uint32x4_t left;\n        side  = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4);\n        right = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4);\n        left  = vaddq_u32(right, side);\n        ma_dr_flac__vst2q_u32((ma_uint32*)pOutputSamples + i*8, vzipq_u32(left, right));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 side  = pInputSamples0U32[i] << shift0;\n        ma_uint32 right = pInputSamples1U32[i] << shift1;\n        ma_uint32 left  = right + side;\n        pOutputSamples[i*2+0] = (ma_int32)left;\n        pOutputSamples[i*2+1] = (ma_int32)right;\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_right_side(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\n    if (ma_dr_flac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s32__decode_right_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(MA_DR_FLAC_SUPPORT_NEON)\n    if (ma_dr_flac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s32__decode_right_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n#if 0\n        ma_dr_flac_read_pcm_frames_s32__decode_right_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        ma_dr_flac_read_pcm_frames_s32__decode_right_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n#if 0\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_mid_side__reference(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    for (ma_uint64 i = 0; i < frameCount; ++i) {\n        ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n        ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n        mid = (mid << 1) | (side & 0x01);\n        pOutputSamples[i*2+0] = (ma_int32)((ma_uint32)((ma_int32)(mid + side) >> 1) << unusedBitsPerSample);\n        pOutputSamples[i*2+1] = (ma_int32)((ma_uint32)((ma_int32)(mid - side) >> 1) << unusedBitsPerSample);\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_mid_side__scalar(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_int32 shift = unusedBitsPerSample;\n    if (shift > 0) {\n        shift -= 1;\n        for (i = 0; i < frameCount4; ++i) {\n            ma_uint32 temp0L;\n            ma_uint32 temp1L;\n            ma_uint32 temp2L;\n            ma_uint32 temp3L;\n            ma_uint32 temp0R;\n            ma_uint32 temp1R;\n            ma_uint32 temp2R;\n            ma_uint32 temp3R;\n            ma_uint32 mid0  = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid1  = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid2  = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid3  = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid0 = (mid0 << 1) | (side0 & 0x01);\n            mid1 = (mid1 << 1) | (side1 & 0x01);\n            mid2 = (mid2 << 1) | (side2 & 0x01);\n            mid3 = (mid3 << 1) | (side3 & 0x01);\n            temp0L = (mid0 + side0) << shift;\n            temp1L = (mid1 + side1) << shift;\n            temp2L = (mid2 + side2) << shift;\n            temp3L = (mid3 + side3) << shift;\n            temp0R = (mid0 - side0) << shift;\n            temp1R = (mid1 - side1) << shift;\n            temp2R = (mid2 - side2) << shift;\n            temp3R = (mid3 - side3) << shift;\n            pOutputSamples[i*8+0] = (ma_int32)temp0L;\n            pOutputSamples[i*8+1] = (ma_int32)temp0R;\n            pOutputSamples[i*8+2] = (ma_int32)temp1L;\n            pOutputSamples[i*8+3] = (ma_int32)temp1R;\n            pOutputSamples[i*8+4] = (ma_int32)temp2L;\n            pOutputSamples[i*8+5] = (ma_int32)temp2R;\n            pOutputSamples[i*8+6] = (ma_int32)temp3L;\n            pOutputSamples[i*8+7] = (ma_int32)temp3R;\n        }\n    } else {\n        for (i = 0; i < frameCount4; ++i) {\n            ma_uint32 temp0L;\n            ma_uint32 temp1L;\n            ma_uint32 temp2L;\n            ma_uint32 temp3L;\n            ma_uint32 temp0R;\n            ma_uint32 temp1R;\n            ma_uint32 temp2R;\n            ma_uint32 temp3R;\n            ma_uint32 mid0  = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid1  = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid2  = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid3  = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid0 = (mid0 << 1) | (side0 & 0x01);\n            mid1 = (mid1 << 1) | (side1 & 0x01);\n            mid2 = (mid2 << 1) | (side2 & 0x01);\n            mid3 = (mid3 << 1) | (side3 & 0x01);\n            temp0L = (ma_uint32)((ma_int32)(mid0 + side0) >> 1);\n            temp1L = (ma_uint32)((ma_int32)(mid1 + side1) >> 1);\n            temp2L = (ma_uint32)((ma_int32)(mid2 + side2) >> 1);\n            temp3L = (ma_uint32)((ma_int32)(mid3 + side3) >> 1);\n            temp0R = (ma_uint32)((ma_int32)(mid0 - side0) >> 1);\n            temp1R = (ma_uint32)((ma_int32)(mid1 - side1) >> 1);\n            temp2R = (ma_uint32)((ma_int32)(mid2 - side2) >> 1);\n            temp3R = (ma_uint32)((ma_int32)(mid3 - side3) >> 1);\n            pOutputSamples[i*8+0] = (ma_int32)temp0L;\n            pOutputSamples[i*8+1] = (ma_int32)temp0R;\n            pOutputSamples[i*8+2] = (ma_int32)temp1L;\n            pOutputSamples[i*8+3] = (ma_int32)temp1R;\n            pOutputSamples[i*8+4] = (ma_int32)temp2L;\n            pOutputSamples[i*8+5] = (ma_int32)temp2R;\n            pOutputSamples[i*8+6] = (ma_int32)temp3L;\n            pOutputSamples[i*8+7] = (ma_int32)temp3R;\n        }\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n        ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n        mid = (mid << 1) | (side & 0x01);\n        pOutputSamples[i*2+0] = (ma_int32)((ma_uint32)((ma_int32)(mid + side) >> 1) << unusedBitsPerSample);\n        pOutputSamples[i*2+1] = (ma_int32)((ma_uint32)((ma_int32)(mid - side) >> 1) << unusedBitsPerSample);\n    }\n}\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_mid_side__sse2(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_int32 shift = unusedBitsPerSample;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    if (shift == 0) {\n        for (i = 0; i < frameCount4; ++i) {\n            __m128i mid;\n            __m128i side;\n            __m128i left;\n            __m128i right;\n            mid   = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n            side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n            mid   = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01)));\n            left  = _mm_srai_epi32(_mm_add_epi32(mid, side), 1);\n            right = _mm_srai_epi32(_mm_sub_epi32(mid, side), 1);\n            _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right));\n            _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right));\n        }\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid = (mid << 1) | (side & 0x01);\n            pOutputSamples[i*2+0] = (ma_int32)(mid + side) >> 1;\n            pOutputSamples[i*2+1] = (ma_int32)(mid - side) >> 1;\n        }\n    } else {\n        shift -= 1;\n        for (i = 0; i < frameCount4; ++i) {\n            __m128i mid;\n            __m128i side;\n            __m128i left;\n            __m128i right;\n            mid   = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n            side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n            mid   = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01)));\n            left  = _mm_slli_epi32(_mm_add_epi32(mid, side), shift);\n            right = _mm_slli_epi32(_mm_sub_epi32(mid, side), shift);\n            _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right));\n            _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right));\n        }\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid = (mid << 1) | (side & 0x01);\n            pOutputSamples[i*2+0] = (ma_int32)((mid + side) << shift);\n            pOutputSamples[i*2+1] = (ma_int32)((mid - side) << shift);\n        }\n    }\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_mid_side__neon(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_int32 shift = unusedBitsPerSample;\n    int32x4_t  wbpsShift0_4;\n    int32x4_t  wbpsShift1_4;\n    uint32x4_t one4;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    wbpsShift0_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n    wbpsShift1_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n    one4         = vdupq_n_u32(1);\n    if (shift == 0) {\n        for (i = 0; i < frameCount4; ++i) {\n            uint32x4_t mid;\n            uint32x4_t side;\n            int32x4_t left;\n            int32x4_t right;\n            mid   = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbpsShift0_4);\n            side  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbpsShift1_4);\n            mid   = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, one4));\n            left  = vshrq_n_s32(vreinterpretq_s32_u32(vaddq_u32(mid, side)), 1);\n            right = vshrq_n_s32(vreinterpretq_s32_u32(vsubq_u32(mid, side)), 1);\n            ma_dr_flac__vst2q_s32(pOutputSamples + i*8, vzipq_s32(left, right));\n        }\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid = (mid << 1) | (side & 0x01);\n            pOutputSamples[i*2+0] = (ma_int32)(mid + side) >> 1;\n            pOutputSamples[i*2+1] = (ma_int32)(mid - side) >> 1;\n        }\n    } else {\n        int32x4_t shift4;\n        shift -= 1;\n        shift4 = vdupq_n_s32(shift);\n        for (i = 0; i < frameCount4; ++i) {\n            uint32x4_t mid;\n            uint32x4_t side;\n            int32x4_t left;\n            int32x4_t right;\n            mid   = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbpsShift0_4);\n            side  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbpsShift1_4);\n            mid   = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, one4));\n            left  = vreinterpretq_s32_u32(vshlq_u32(vaddq_u32(mid, side), shift4));\n            right = vreinterpretq_s32_u32(vshlq_u32(vsubq_u32(mid, side), shift4));\n            ma_dr_flac__vst2q_s32(pOutputSamples + i*8, vzipq_s32(left, right));\n        }\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid = (mid << 1) | (side & 0x01);\n            pOutputSamples[i*2+0] = (ma_int32)((mid + side) << shift);\n            pOutputSamples[i*2+1] = (ma_int32)((mid - side) << shift);\n        }\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_mid_side(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\n    if (ma_dr_flac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s32__decode_mid_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(MA_DR_FLAC_SUPPORT_NEON)\n    if (ma_dr_flac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s32__decode_mid_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n#if 0\n        ma_dr_flac_read_pcm_frames_s32__decode_mid_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        ma_dr_flac_read_pcm_frames_s32__decode_mid_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n#if 0\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_independent_stereo__reference(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    for (ma_uint64 i = 0; i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (ma_int32)((ma_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample));\n        pOutputSamples[i*2+1] = (ma_int32)((ma_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample));\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_independent_stereo__scalar(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    for (i = 0; i < frameCount4; ++i) {\n        ma_uint32 tempL0 = pInputSamples0U32[i*4+0] << shift0;\n        ma_uint32 tempL1 = pInputSamples0U32[i*4+1] << shift0;\n        ma_uint32 tempL2 = pInputSamples0U32[i*4+2] << shift0;\n        ma_uint32 tempL3 = pInputSamples0U32[i*4+3] << shift0;\n        ma_uint32 tempR0 = pInputSamples1U32[i*4+0] << shift1;\n        ma_uint32 tempR1 = pInputSamples1U32[i*4+1] << shift1;\n        ma_uint32 tempR2 = pInputSamples1U32[i*4+2] << shift1;\n        ma_uint32 tempR3 = pInputSamples1U32[i*4+3] << shift1;\n        pOutputSamples[i*8+0] = (ma_int32)tempL0;\n        pOutputSamples[i*8+1] = (ma_int32)tempR0;\n        pOutputSamples[i*8+2] = (ma_int32)tempL1;\n        pOutputSamples[i*8+3] = (ma_int32)tempR1;\n        pOutputSamples[i*8+4] = (ma_int32)tempL2;\n        pOutputSamples[i*8+5] = (ma_int32)tempR2;\n        pOutputSamples[i*8+6] = (ma_int32)tempL3;\n        pOutputSamples[i*8+7] = (ma_int32)tempR3;\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (ma_int32)(pInputSamples0U32[i] << shift0);\n        pOutputSamples[i*2+1] = (ma_int32)(pInputSamples1U32[i] << shift1);\n    }\n}\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_independent_stereo__sse2(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i left  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 0), _mm_unpacklo_epi32(left, right));\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8 + 4), _mm_unpackhi_epi32(left, right));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (ma_int32)(pInputSamples0U32[i] << shift0);\n        pOutputSamples[i*2+1] = (ma_int32)(pInputSamples1U32[i] << shift1);\n    }\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_independent_stereo__neon(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    int32x4_t shift4_0 = vdupq_n_s32(shift0);\n    int32x4_t shift4_1 = vdupq_n_s32(shift1);\n    for (i = 0; i < frameCount4; ++i) {\n        int32x4_t left;\n        int32x4_t right;\n        left  = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift4_0));\n        right = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift4_1));\n        ma_dr_flac__vst2q_s32(pOutputSamples + i*8, vzipq_s32(left, right));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (ma_int32)(pInputSamples0U32[i] << shift0);\n        pOutputSamples[i*2+1] = (ma_int32)(pInputSamples1U32[i] << shift1);\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s32__decode_independent_stereo(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int32* pOutputSamples)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\n    if (ma_dr_flac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s32__decode_independent_stereo__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(MA_DR_FLAC_SUPPORT_NEON)\n    if (ma_dr_flac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s32__decode_independent_stereo__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n#if 0\n        ma_dr_flac_read_pcm_frames_s32__decode_independent_stereo__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        ma_dr_flac_read_pcm_frames_s32__decode_independent_stereo__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\nMA_API ma_uint64 ma_dr_flac_read_pcm_frames_s32(ma_dr_flac* pFlac, ma_uint64 framesToRead, ma_int32* pBufferOut)\n{\n    ma_uint64 framesRead;\n    ma_uint32 unusedBitsPerSample;\n    if (pFlac == NULL || framesToRead == 0) {\n        return 0;\n    }\n    if (pBufferOut == NULL) {\n        return ma_dr_flac__seek_forward_by_pcm_frames(pFlac, framesToRead);\n    }\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 32);\n    unusedBitsPerSample = 32 - pFlac->bitsPerSample;\n    framesRead = 0;\n    while (framesToRead > 0) {\n        if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) {\n            if (!ma_dr_flac__read_and_decode_next_flac_frame(pFlac)) {\n                break;\n            }\n        } else {\n            unsigned int channelCount = ma_dr_flac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment);\n            ma_uint64 iFirstPCMFrame = pFlac->currentFLACFrame.header.blockSizeInPCMFrames - pFlac->currentFLACFrame.pcmFramesRemaining;\n            ma_uint64 frameCountThisIteration = framesToRead;\n            if (frameCountThisIteration > pFlac->currentFLACFrame.pcmFramesRemaining) {\n                frameCountThisIteration = pFlac->currentFLACFrame.pcmFramesRemaining;\n            }\n            if (channelCount == 2) {\n                const ma_int32* pDecodedSamples0 = pFlac->currentFLACFrame.subframes[0].pSamplesS32 + iFirstPCMFrame;\n                const ma_int32* pDecodedSamples1 = pFlac->currentFLACFrame.subframes[1].pSamplesS32 + iFirstPCMFrame;\n                switch (pFlac->currentFLACFrame.header.channelAssignment)\n                {\n                    case MA_DR_FLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE:\n                    {\n                        ma_dr_flac_read_pcm_frames_s32__decode_left_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                    case MA_DR_FLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE:\n                    {\n                        ma_dr_flac_read_pcm_frames_s32__decode_right_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                    case MA_DR_FLAC_CHANNEL_ASSIGNMENT_MID_SIDE:\n                    {\n                        ma_dr_flac_read_pcm_frames_s32__decode_mid_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                    case MA_DR_FLAC_CHANNEL_ASSIGNMENT_INDEPENDENT:\n                    default:\n                    {\n                        ma_dr_flac_read_pcm_frames_s32__decode_independent_stereo(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                }\n            } else {\n                ma_uint64 i;\n                for (i = 0; i < frameCountThisIteration; ++i) {\n                    unsigned int j;\n                    for (j = 0; j < channelCount; ++j) {\n                        pBufferOut[(i*channelCount)+j] = (ma_int32)((ma_uint32)(pFlac->currentFLACFrame.subframes[j].pSamplesS32[iFirstPCMFrame + i]) << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[j].wastedBitsPerSample));\n                    }\n                }\n            }\n            framesRead                += frameCountThisIteration;\n            pBufferOut                += frameCountThisIteration * channelCount;\n            framesToRead              -= frameCountThisIteration;\n            pFlac->currentPCMFrame    += frameCountThisIteration;\n            pFlac->currentFLACFrame.pcmFramesRemaining -= (ma_uint32)frameCountThisIteration;\n        }\n    }\n    return framesRead;\n}\n#if 0\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_left_side__reference(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    for (i = 0; i < frameCount; ++i) {\n        ma_uint32 left  = (ma_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n        ma_uint32 side  = (ma_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n        ma_uint32 right = left - side;\n        left  >>= 16;\n        right >>= 16;\n        pOutputSamples[i*2+0] = (ma_int16)left;\n        pOutputSamples[i*2+1] = (ma_int16)right;\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_left_side__scalar(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    for (i = 0; i < frameCount4; ++i) {\n        ma_uint32 left0 = pInputSamples0U32[i*4+0] << shift0;\n        ma_uint32 left1 = pInputSamples0U32[i*4+1] << shift0;\n        ma_uint32 left2 = pInputSamples0U32[i*4+2] << shift0;\n        ma_uint32 left3 = pInputSamples0U32[i*4+3] << shift0;\n        ma_uint32 side0 = pInputSamples1U32[i*4+0] << shift1;\n        ma_uint32 side1 = pInputSamples1U32[i*4+1] << shift1;\n        ma_uint32 side2 = pInputSamples1U32[i*4+2] << shift1;\n        ma_uint32 side3 = pInputSamples1U32[i*4+3] << shift1;\n        ma_uint32 right0 = left0 - side0;\n        ma_uint32 right1 = left1 - side1;\n        ma_uint32 right2 = left2 - side2;\n        ma_uint32 right3 = left3 - side3;\n        left0  >>= 16;\n        left1  >>= 16;\n        left2  >>= 16;\n        left3  >>= 16;\n        right0 >>= 16;\n        right1 >>= 16;\n        right2 >>= 16;\n        right3 >>= 16;\n        pOutputSamples[i*8+0] = (ma_int16)left0;\n        pOutputSamples[i*8+1] = (ma_int16)right0;\n        pOutputSamples[i*8+2] = (ma_int16)left1;\n        pOutputSamples[i*8+3] = (ma_int16)right1;\n        pOutputSamples[i*8+4] = (ma_int16)left2;\n        pOutputSamples[i*8+5] = (ma_int16)right2;\n        pOutputSamples[i*8+6] = (ma_int16)left3;\n        pOutputSamples[i*8+7] = (ma_int16)right3;\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 left  = pInputSamples0U32[i] << shift0;\n        ma_uint32 side  = pInputSamples1U32[i] << shift1;\n        ma_uint32 right = left - side;\n        left  >>= 16;\n        right >>= 16;\n        pOutputSamples[i*2+0] = (ma_int16)left;\n        pOutputSamples[i*2+1] = (ma_int16)right;\n    }\n}\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_left_side__sse2(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i left  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        __m128i right = _mm_sub_epi32(left, side);\n        left  = _mm_srai_epi32(left,  16);\n        right = _mm_srai_epi32(right, 16);\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), ma_dr_flac__mm_packs_interleaved_epi32(left, right));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 left  = pInputSamples0U32[i] << shift0;\n        ma_uint32 side  = pInputSamples1U32[i] << shift1;\n        ma_uint32 right = left - side;\n        left  >>= 16;\n        right >>= 16;\n        pOutputSamples[i*2+0] = (ma_int16)left;\n        pOutputSamples[i*2+1] = (ma_int16)right;\n    }\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_left_side__neon(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    int32x4_t shift0_4;\n    int32x4_t shift1_4;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    shift0_4 = vdupq_n_s32(shift0);\n    shift1_4 = vdupq_n_s32(shift1);\n    for (i = 0; i < frameCount4; ++i) {\n        uint32x4_t left;\n        uint32x4_t side;\n        uint32x4_t right;\n        left  = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4);\n        side  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4);\n        right = vsubq_u32(left, side);\n        left  = vshrq_n_u32(left,  16);\n        right = vshrq_n_u32(right, 16);\n        ma_dr_flac__vst2q_u16((ma_uint16*)pOutputSamples + i*8, vzip_u16(vmovn_u32(left), vmovn_u32(right)));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 left  = pInputSamples0U32[i] << shift0;\n        ma_uint32 side  = pInputSamples1U32[i] << shift1;\n        ma_uint32 right = left - side;\n        left  >>= 16;\n        right >>= 16;\n        pOutputSamples[i*2+0] = (ma_int16)left;\n        pOutputSamples[i*2+1] = (ma_int16)right;\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_left_side(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\n    if (ma_dr_flac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s16__decode_left_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(MA_DR_FLAC_SUPPORT_NEON)\n    if (ma_dr_flac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s16__decode_left_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n#if 0\n        ma_dr_flac_read_pcm_frames_s16__decode_left_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        ma_dr_flac_read_pcm_frames_s16__decode_left_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n#if 0\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_right_side__reference(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    for (i = 0; i < frameCount; ++i) {\n        ma_uint32 side  = (ma_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n        ma_uint32 right = (ma_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n        ma_uint32 left  = right + side;\n        left  >>= 16;\n        right >>= 16;\n        pOutputSamples[i*2+0] = (ma_int16)left;\n        pOutputSamples[i*2+1] = (ma_int16)right;\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_right_side__scalar(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    for (i = 0; i < frameCount4; ++i) {\n        ma_uint32 side0  = pInputSamples0U32[i*4+0] << shift0;\n        ma_uint32 side1  = pInputSamples0U32[i*4+1] << shift0;\n        ma_uint32 side2  = pInputSamples0U32[i*4+2] << shift0;\n        ma_uint32 side3  = pInputSamples0U32[i*4+3] << shift0;\n        ma_uint32 right0 = pInputSamples1U32[i*4+0] << shift1;\n        ma_uint32 right1 = pInputSamples1U32[i*4+1] << shift1;\n        ma_uint32 right2 = pInputSamples1U32[i*4+2] << shift1;\n        ma_uint32 right3 = pInputSamples1U32[i*4+3] << shift1;\n        ma_uint32 left0 = right0 + side0;\n        ma_uint32 left1 = right1 + side1;\n        ma_uint32 left2 = right2 + side2;\n        ma_uint32 left3 = right3 + side3;\n        left0  >>= 16;\n        left1  >>= 16;\n        left2  >>= 16;\n        left3  >>= 16;\n        right0 >>= 16;\n        right1 >>= 16;\n        right2 >>= 16;\n        right3 >>= 16;\n        pOutputSamples[i*8+0] = (ma_int16)left0;\n        pOutputSamples[i*8+1] = (ma_int16)right0;\n        pOutputSamples[i*8+2] = (ma_int16)left1;\n        pOutputSamples[i*8+3] = (ma_int16)right1;\n        pOutputSamples[i*8+4] = (ma_int16)left2;\n        pOutputSamples[i*8+5] = (ma_int16)right2;\n        pOutputSamples[i*8+6] = (ma_int16)left3;\n        pOutputSamples[i*8+7] = (ma_int16)right3;\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 side  = pInputSamples0U32[i] << shift0;\n        ma_uint32 right = pInputSamples1U32[i] << shift1;\n        ma_uint32 left  = right + side;\n        left  >>= 16;\n        right >>= 16;\n        pOutputSamples[i*2+0] = (ma_int16)left;\n        pOutputSamples[i*2+1] = (ma_int16)right;\n    }\n}\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_right_side__sse2(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        __m128i left  = _mm_add_epi32(right, side);\n        left  = _mm_srai_epi32(left,  16);\n        right = _mm_srai_epi32(right, 16);\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), ma_dr_flac__mm_packs_interleaved_epi32(left, right));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 side  = pInputSamples0U32[i] << shift0;\n        ma_uint32 right = pInputSamples1U32[i] << shift1;\n        ma_uint32 left  = right + side;\n        left  >>= 16;\n        right >>= 16;\n        pOutputSamples[i*2+0] = (ma_int16)left;\n        pOutputSamples[i*2+1] = (ma_int16)right;\n    }\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_right_side__neon(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    int32x4_t shift0_4;\n    int32x4_t shift1_4;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    shift0_4 = vdupq_n_s32(shift0);\n    shift1_4 = vdupq_n_s32(shift1);\n    for (i = 0; i < frameCount4; ++i) {\n        uint32x4_t side;\n        uint32x4_t right;\n        uint32x4_t left;\n        side  = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4);\n        right = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4);\n        left  = vaddq_u32(right, side);\n        left  = vshrq_n_u32(left,  16);\n        right = vshrq_n_u32(right, 16);\n        ma_dr_flac__vst2q_u16((ma_uint16*)pOutputSamples + i*8, vzip_u16(vmovn_u32(left), vmovn_u32(right)));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 side  = pInputSamples0U32[i] << shift0;\n        ma_uint32 right = pInputSamples1U32[i] << shift1;\n        ma_uint32 left  = right + side;\n        left  >>= 16;\n        right >>= 16;\n        pOutputSamples[i*2+0] = (ma_int16)left;\n        pOutputSamples[i*2+1] = (ma_int16)right;\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_right_side(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\n    if (ma_dr_flac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s16__decode_right_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(MA_DR_FLAC_SUPPORT_NEON)\n    if (ma_dr_flac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s16__decode_right_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n#if 0\n        ma_dr_flac_read_pcm_frames_s16__decode_right_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        ma_dr_flac_read_pcm_frames_s16__decode_right_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n#if 0\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_mid_side__reference(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    for (ma_uint64 i = 0; i < frameCount; ++i) {\n        ma_uint32 mid  = (ma_uint32)pInputSamples0[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n        ma_uint32 side = (ma_uint32)pInputSamples1[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n        mid = (mid << 1) | (side & 0x01);\n        pOutputSamples[i*2+0] = (ma_int16)(((ma_uint32)((ma_int32)(mid + side) >> 1) << unusedBitsPerSample) >> 16);\n        pOutputSamples[i*2+1] = (ma_int16)(((ma_uint32)((ma_int32)(mid - side) >> 1) << unusedBitsPerSample) >> 16);\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_mid_side__scalar(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift = unusedBitsPerSample;\n    if (shift > 0) {\n        shift -= 1;\n        for (i = 0; i < frameCount4; ++i) {\n            ma_uint32 temp0L;\n            ma_uint32 temp1L;\n            ma_uint32 temp2L;\n            ma_uint32 temp3L;\n            ma_uint32 temp0R;\n            ma_uint32 temp1R;\n            ma_uint32 temp2R;\n            ma_uint32 temp3R;\n            ma_uint32 mid0  = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid1  = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid2  = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid3  = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid0 = (mid0 << 1) | (side0 & 0x01);\n            mid1 = (mid1 << 1) | (side1 & 0x01);\n            mid2 = (mid2 << 1) | (side2 & 0x01);\n            mid3 = (mid3 << 1) | (side3 & 0x01);\n            temp0L = (mid0 + side0) << shift;\n            temp1L = (mid1 + side1) << shift;\n            temp2L = (mid2 + side2) << shift;\n            temp3L = (mid3 + side3) << shift;\n            temp0R = (mid0 - side0) << shift;\n            temp1R = (mid1 - side1) << shift;\n            temp2R = (mid2 - side2) << shift;\n            temp3R = (mid3 - side3) << shift;\n            temp0L >>= 16;\n            temp1L >>= 16;\n            temp2L >>= 16;\n            temp3L >>= 16;\n            temp0R >>= 16;\n            temp1R >>= 16;\n            temp2R >>= 16;\n            temp3R >>= 16;\n            pOutputSamples[i*8+0] = (ma_int16)temp0L;\n            pOutputSamples[i*8+1] = (ma_int16)temp0R;\n            pOutputSamples[i*8+2] = (ma_int16)temp1L;\n            pOutputSamples[i*8+3] = (ma_int16)temp1R;\n            pOutputSamples[i*8+4] = (ma_int16)temp2L;\n            pOutputSamples[i*8+5] = (ma_int16)temp2R;\n            pOutputSamples[i*8+6] = (ma_int16)temp3L;\n            pOutputSamples[i*8+7] = (ma_int16)temp3R;\n        }\n    } else {\n        for (i = 0; i < frameCount4; ++i) {\n            ma_uint32 temp0L;\n            ma_uint32 temp1L;\n            ma_uint32 temp2L;\n            ma_uint32 temp3L;\n            ma_uint32 temp0R;\n            ma_uint32 temp1R;\n            ma_uint32 temp2R;\n            ma_uint32 temp3R;\n            ma_uint32 mid0  = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid1  = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid2  = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid3  = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid0 = (mid0 << 1) | (side0 & 0x01);\n            mid1 = (mid1 << 1) | (side1 & 0x01);\n            mid2 = (mid2 << 1) | (side2 & 0x01);\n            mid3 = (mid3 << 1) | (side3 & 0x01);\n            temp0L = ((ma_int32)(mid0 + side0) >> 1);\n            temp1L = ((ma_int32)(mid1 + side1) >> 1);\n            temp2L = ((ma_int32)(mid2 + side2) >> 1);\n            temp3L = ((ma_int32)(mid3 + side3) >> 1);\n            temp0R = ((ma_int32)(mid0 - side0) >> 1);\n            temp1R = ((ma_int32)(mid1 - side1) >> 1);\n            temp2R = ((ma_int32)(mid2 - side2) >> 1);\n            temp3R = ((ma_int32)(mid3 - side3) >> 1);\n            temp0L >>= 16;\n            temp1L >>= 16;\n            temp2L >>= 16;\n            temp3L >>= 16;\n            temp0R >>= 16;\n            temp1R >>= 16;\n            temp2R >>= 16;\n            temp3R >>= 16;\n            pOutputSamples[i*8+0] = (ma_int16)temp0L;\n            pOutputSamples[i*8+1] = (ma_int16)temp0R;\n            pOutputSamples[i*8+2] = (ma_int16)temp1L;\n            pOutputSamples[i*8+3] = (ma_int16)temp1R;\n            pOutputSamples[i*8+4] = (ma_int16)temp2L;\n            pOutputSamples[i*8+5] = (ma_int16)temp2R;\n            pOutputSamples[i*8+6] = (ma_int16)temp3L;\n            pOutputSamples[i*8+7] = (ma_int16)temp3R;\n        }\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n        ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n        mid = (mid << 1) | (side & 0x01);\n        pOutputSamples[i*2+0] = (ma_int16)(((ma_uint32)((ma_int32)(mid + side) >> 1) << unusedBitsPerSample) >> 16);\n        pOutputSamples[i*2+1] = (ma_int16)(((ma_uint32)((ma_int32)(mid - side) >> 1) << unusedBitsPerSample) >> 16);\n    }\n}\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_mid_side__sse2(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift = unusedBitsPerSample;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    if (shift == 0) {\n        for (i = 0; i < frameCount4; ++i) {\n            __m128i mid;\n            __m128i side;\n            __m128i left;\n            __m128i right;\n            mid   = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n            side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n            mid   = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01)));\n            left  = _mm_srai_epi32(_mm_add_epi32(mid, side), 1);\n            right = _mm_srai_epi32(_mm_sub_epi32(mid, side), 1);\n            left  = _mm_srai_epi32(left,  16);\n            right = _mm_srai_epi32(right, 16);\n            _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), ma_dr_flac__mm_packs_interleaved_epi32(left, right));\n        }\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid = (mid << 1) | (side & 0x01);\n            pOutputSamples[i*2+0] = (ma_int16)(((ma_int32)(mid + side) >> 1) >> 16);\n            pOutputSamples[i*2+1] = (ma_int16)(((ma_int32)(mid - side) >> 1) >> 16);\n        }\n    } else {\n        shift -= 1;\n        for (i = 0; i < frameCount4; ++i) {\n            __m128i mid;\n            __m128i side;\n            __m128i left;\n            __m128i right;\n            mid   = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n            side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n            mid   = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01)));\n            left  = _mm_slli_epi32(_mm_add_epi32(mid, side), shift);\n            right = _mm_slli_epi32(_mm_sub_epi32(mid, side), shift);\n            left  = _mm_srai_epi32(left,  16);\n            right = _mm_srai_epi32(right, 16);\n            _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), ma_dr_flac__mm_packs_interleaved_epi32(left, right));\n        }\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid = (mid << 1) | (side & 0x01);\n            pOutputSamples[i*2+0] = (ma_int16)(((mid + side) << shift) >> 16);\n            pOutputSamples[i*2+1] = (ma_int16)(((mid - side) << shift) >> 16);\n        }\n    }\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_mid_side__neon(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift = unusedBitsPerSample;\n    int32x4_t wbpsShift0_4;\n    int32x4_t wbpsShift1_4;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    wbpsShift0_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n    wbpsShift1_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n    if (shift == 0) {\n        for (i = 0; i < frameCount4; ++i) {\n            uint32x4_t mid;\n            uint32x4_t side;\n            int32x4_t left;\n            int32x4_t right;\n            mid   = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbpsShift0_4);\n            side  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbpsShift1_4);\n            mid   = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, vdupq_n_u32(1)));\n            left  = vshrq_n_s32(vreinterpretq_s32_u32(vaddq_u32(mid, side)), 1);\n            right = vshrq_n_s32(vreinterpretq_s32_u32(vsubq_u32(mid, side)), 1);\n            left  = vshrq_n_s32(left,  16);\n            right = vshrq_n_s32(right, 16);\n            ma_dr_flac__vst2q_s16(pOutputSamples + i*8, vzip_s16(vmovn_s32(left), vmovn_s32(right)));\n        }\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid = (mid << 1) | (side & 0x01);\n            pOutputSamples[i*2+0] = (ma_int16)(((ma_int32)(mid + side) >> 1) >> 16);\n            pOutputSamples[i*2+1] = (ma_int16)(((ma_int32)(mid - side) >> 1) >> 16);\n        }\n    } else {\n        int32x4_t shift4;\n        shift -= 1;\n        shift4 = vdupq_n_s32(shift);\n        for (i = 0; i < frameCount4; ++i) {\n            uint32x4_t mid;\n            uint32x4_t side;\n            int32x4_t left;\n            int32x4_t right;\n            mid   = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbpsShift0_4);\n            side  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbpsShift1_4);\n            mid   = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, vdupq_n_u32(1)));\n            left  = vreinterpretq_s32_u32(vshlq_u32(vaddq_u32(mid, side), shift4));\n            right = vreinterpretq_s32_u32(vshlq_u32(vsubq_u32(mid, side), shift4));\n            left  = vshrq_n_s32(left,  16);\n            right = vshrq_n_s32(right, 16);\n            ma_dr_flac__vst2q_s16(pOutputSamples + i*8, vzip_s16(vmovn_s32(left), vmovn_s32(right)));\n        }\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid = (mid << 1) | (side & 0x01);\n            pOutputSamples[i*2+0] = (ma_int16)(((mid + side) << shift) >> 16);\n            pOutputSamples[i*2+1] = (ma_int16)(((mid - side) << shift) >> 16);\n        }\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_mid_side(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\n    if (ma_dr_flac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s16__decode_mid_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(MA_DR_FLAC_SUPPORT_NEON)\n    if (ma_dr_flac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s16__decode_mid_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n#if 0\n        ma_dr_flac_read_pcm_frames_s16__decode_mid_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        ma_dr_flac_read_pcm_frames_s16__decode_mid_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n#if 0\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_independent_stereo__reference(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    for (ma_uint64 i = 0; i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (ma_int16)((ma_int32)((ma_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample)) >> 16);\n        pOutputSamples[i*2+1] = (ma_int16)((ma_int32)((ma_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample)) >> 16);\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_independent_stereo__scalar(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    for (i = 0; i < frameCount4; ++i) {\n        ma_uint32 tempL0 = pInputSamples0U32[i*4+0] << shift0;\n        ma_uint32 tempL1 = pInputSamples0U32[i*4+1] << shift0;\n        ma_uint32 tempL2 = pInputSamples0U32[i*4+2] << shift0;\n        ma_uint32 tempL3 = pInputSamples0U32[i*4+3] << shift0;\n        ma_uint32 tempR0 = pInputSamples1U32[i*4+0] << shift1;\n        ma_uint32 tempR1 = pInputSamples1U32[i*4+1] << shift1;\n        ma_uint32 tempR2 = pInputSamples1U32[i*4+2] << shift1;\n        ma_uint32 tempR3 = pInputSamples1U32[i*4+3] << shift1;\n        tempL0 >>= 16;\n        tempL1 >>= 16;\n        tempL2 >>= 16;\n        tempL3 >>= 16;\n        tempR0 >>= 16;\n        tempR1 >>= 16;\n        tempR2 >>= 16;\n        tempR3 >>= 16;\n        pOutputSamples[i*8+0] = (ma_int16)tempL0;\n        pOutputSamples[i*8+1] = (ma_int16)tempR0;\n        pOutputSamples[i*8+2] = (ma_int16)tempL1;\n        pOutputSamples[i*8+3] = (ma_int16)tempR1;\n        pOutputSamples[i*8+4] = (ma_int16)tempL2;\n        pOutputSamples[i*8+5] = (ma_int16)tempR2;\n        pOutputSamples[i*8+6] = (ma_int16)tempL3;\n        pOutputSamples[i*8+7] = (ma_int16)tempR3;\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (ma_int16)((pInputSamples0U32[i] << shift0) >> 16);\n        pOutputSamples[i*2+1] = (ma_int16)((pInputSamples1U32[i] << shift1) >> 16);\n    }\n}\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_independent_stereo__sse2(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i left  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        left  = _mm_srai_epi32(left,  16);\n        right = _mm_srai_epi32(right, 16);\n        _mm_storeu_si128((__m128i*)(pOutputSamples + i*8), ma_dr_flac__mm_packs_interleaved_epi32(left, right));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (ma_int16)((pInputSamples0U32[i] << shift0) >> 16);\n        pOutputSamples[i*2+1] = (ma_int16)((pInputSamples1U32[i] << shift1) >> 16);\n    }\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_independent_stereo__neon(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    int32x4_t shift0_4 = vdupq_n_s32(shift0);\n    int32x4_t shift1_4 = vdupq_n_s32(shift1);\n    for (i = 0; i < frameCount4; ++i) {\n        int32x4_t left;\n        int32x4_t right;\n        left  = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4));\n        right = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4));\n        left  = vshrq_n_s32(left,  16);\n        right = vshrq_n_s32(right, 16);\n        ma_dr_flac__vst2q_s16(pOutputSamples + i*8, vzip_s16(vmovn_s32(left), vmovn_s32(right)));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (ma_int16)((pInputSamples0U32[i] << shift0) >> 16);\n        pOutputSamples[i*2+1] = (ma_int16)((pInputSamples1U32[i] << shift1) >> 16);\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_s16__decode_independent_stereo(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, ma_int16* pOutputSamples)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\n    if (ma_dr_flac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s16__decode_independent_stereo__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(MA_DR_FLAC_SUPPORT_NEON)\n    if (ma_dr_flac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_s16__decode_independent_stereo__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n#if 0\n        ma_dr_flac_read_pcm_frames_s16__decode_independent_stereo__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        ma_dr_flac_read_pcm_frames_s16__decode_independent_stereo__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\nMA_API ma_uint64 ma_dr_flac_read_pcm_frames_s16(ma_dr_flac* pFlac, ma_uint64 framesToRead, ma_int16* pBufferOut)\n{\n    ma_uint64 framesRead;\n    ma_uint32 unusedBitsPerSample;\n    if (pFlac == NULL || framesToRead == 0) {\n        return 0;\n    }\n    if (pBufferOut == NULL) {\n        return ma_dr_flac__seek_forward_by_pcm_frames(pFlac, framesToRead);\n    }\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 32);\n    unusedBitsPerSample = 32 - pFlac->bitsPerSample;\n    framesRead = 0;\n    while (framesToRead > 0) {\n        if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) {\n            if (!ma_dr_flac__read_and_decode_next_flac_frame(pFlac)) {\n                break;\n            }\n        } else {\n            unsigned int channelCount = ma_dr_flac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment);\n            ma_uint64 iFirstPCMFrame = pFlac->currentFLACFrame.header.blockSizeInPCMFrames - pFlac->currentFLACFrame.pcmFramesRemaining;\n            ma_uint64 frameCountThisIteration = framesToRead;\n            if (frameCountThisIteration > pFlac->currentFLACFrame.pcmFramesRemaining) {\n                frameCountThisIteration = pFlac->currentFLACFrame.pcmFramesRemaining;\n            }\n            if (channelCount == 2) {\n                const ma_int32* pDecodedSamples0 = pFlac->currentFLACFrame.subframes[0].pSamplesS32 + iFirstPCMFrame;\n                const ma_int32* pDecodedSamples1 = pFlac->currentFLACFrame.subframes[1].pSamplesS32 + iFirstPCMFrame;\n                switch (pFlac->currentFLACFrame.header.channelAssignment)\n                {\n                    case MA_DR_FLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE:\n                    {\n                        ma_dr_flac_read_pcm_frames_s16__decode_left_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                    case MA_DR_FLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE:\n                    {\n                        ma_dr_flac_read_pcm_frames_s16__decode_right_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                    case MA_DR_FLAC_CHANNEL_ASSIGNMENT_MID_SIDE:\n                    {\n                        ma_dr_flac_read_pcm_frames_s16__decode_mid_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                    case MA_DR_FLAC_CHANNEL_ASSIGNMENT_INDEPENDENT:\n                    default:\n                    {\n                        ma_dr_flac_read_pcm_frames_s16__decode_independent_stereo(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                }\n            } else {\n                ma_uint64 i;\n                for (i = 0; i < frameCountThisIteration; ++i) {\n                    unsigned int j;\n                    for (j = 0; j < channelCount; ++j) {\n                        ma_int32 sampleS32 = (ma_int32)((ma_uint32)(pFlac->currentFLACFrame.subframes[j].pSamplesS32[iFirstPCMFrame + i]) << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[j].wastedBitsPerSample));\n                        pBufferOut[(i*channelCount)+j] = (ma_int16)(sampleS32 >> 16);\n                    }\n                }\n            }\n            framesRead                += frameCountThisIteration;\n            pBufferOut                += frameCountThisIteration * channelCount;\n            framesToRead              -= frameCountThisIteration;\n            pFlac->currentPCMFrame    += frameCountThisIteration;\n            pFlac->currentFLACFrame.pcmFramesRemaining -= (ma_uint32)frameCountThisIteration;\n        }\n    }\n    return framesRead;\n}\n#if 0\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_left_side__reference(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    for (i = 0; i < frameCount; ++i) {\n        ma_uint32 left  = (ma_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n        ma_uint32 side  = (ma_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n        ma_uint32 right = left - side;\n        pOutputSamples[i*2+0] = (float)((ma_int32)left  / 2147483648.0);\n        pOutputSamples[i*2+1] = (float)((ma_int32)right / 2147483648.0);\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_left_side__scalar(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    float factor = 1 / 2147483648.0;\n    for (i = 0; i < frameCount4; ++i) {\n        ma_uint32 left0 = pInputSamples0U32[i*4+0] << shift0;\n        ma_uint32 left1 = pInputSamples0U32[i*4+1] << shift0;\n        ma_uint32 left2 = pInputSamples0U32[i*4+2] << shift0;\n        ma_uint32 left3 = pInputSamples0U32[i*4+3] << shift0;\n        ma_uint32 side0 = pInputSamples1U32[i*4+0] << shift1;\n        ma_uint32 side1 = pInputSamples1U32[i*4+1] << shift1;\n        ma_uint32 side2 = pInputSamples1U32[i*4+2] << shift1;\n        ma_uint32 side3 = pInputSamples1U32[i*4+3] << shift1;\n        ma_uint32 right0 = left0 - side0;\n        ma_uint32 right1 = left1 - side1;\n        ma_uint32 right2 = left2 - side2;\n        ma_uint32 right3 = left3 - side3;\n        pOutputSamples[i*8+0] = (ma_int32)left0  * factor;\n        pOutputSamples[i*8+1] = (ma_int32)right0 * factor;\n        pOutputSamples[i*8+2] = (ma_int32)left1  * factor;\n        pOutputSamples[i*8+3] = (ma_int32)right1 * factor;\n        pOutputSamples[i*8+4] = (ma_int32)left2  * factor;\n        pOutputSamples[i*8+5] = (ma_int32)right2 * factor;\n        pOutputSamples[i*8+6] = (ma_int32)left3  * factor;\n        pOutputSamples[i*8+7] = (ma_int32)right3 * factor;\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 left  = pInputSamples0U32[i] << shift0;\n        ma_uint32 side  = pInputSamples1U32[i] << shift1;\n        ma_uint32 right = left - side;\n        pOutputSamples[i*2+0] = (ma_int32)left  * factor;\n        pOutputSamples[i*2+1] = (ma_int32)right * factor;\n    }\n}\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_left_side__sse2(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8;\n    ma_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8;\n    __m128 factor;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    factor = _mm_set1_ps(1.0f / 8388608.0f);\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i left  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        __m128i right = _mm_sub_epi32(left, side);\n        __m128 leftf  = _mm_mul_ps(_mm_cvtepi32_ps(left),  factor);\n        __m128 rightf = _mm_mul_ps(_mm_cvtepi32_ps(right), factor);\n        _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf));\n        _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 left  = pInputSamples0U32[i] << shift0;\n        ma_uint32 side  = pInputSamples1U32[i] << shift1;\n        ma_uint32 right = left - side;\n        pOutputSamples[i*2+0] = (ma_int32)left  / 8388608.0f;\n        pOutputSamples[i*2+1] = (ma_int32)right / 8388608.0f;\n    }\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_left_side__neon(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8;\n    ma_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8;\n    float32x4_t factor4;\n    int32x4_t shift0_4;\n    int32x4_t shift1_4;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    factor4  = vdupq_n_f32(1.0f / 8388608.0f);\n    shift0_4 = vdupq_n_s32(shift0);\n    shift1_4 = vdupq_n_s32(shift1);\n    for (i = 0; i < frameCount4; ++i) {\n        uint32x4_t left;\n        uint32x4_t side;\n        uint32x4_t right;\n        float32x4_t leftf;\n        float32x4_t rightf;\n        left   = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4);\n        side   = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4);\n        right  = vsubq_u32(left, side);\n        leftf  = vmulq_f32(vcvtq_f32_s32(vreinterpretq_s32_u32(left)),  factor4);\n        rightf = vmulq_f32(vcvtq_f32_s32(vreinterpretq_s32_u32(right)), factor4);\n        ma_dr_flac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 left  = pInputSamples0U32[i] << shift0;\n        ma_uint32 side  = pInputSamples1U32[i] << shift1;\n        ma_uint32 right = left - side;\n        pOutputSamples[i*2+0] = (ma_int32)left  / 8388608.0f;\n        pOutputSamples[i*2+1] = (ma_int32)right / 8388608.0f;\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_left_side(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\n    if (ma_dr_flac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_f32__decode_left_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(MA_DR_FLAC_SUPPORT_NEON)\n    if (ma_dr_flac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_f32__decode_left_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n#if 0\n        ma_dr_flac_read_pcm_frames_f32__decode_left_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        ma_dr_flac_read_pcm_frames_f32__decode_left_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n#if 0\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_right_side__reference(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    for (i = 0; i < frameCount; ++i) {\n        ma_uint32 side  = (ma_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n        ma_uint32 right = (ma_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n        ma_uint32 left  = right + side;\n        pOutputSamples[i*2+0] = (float)((ma_int32)left  / 2147483648.0);\n        pOutputSamples[i*2+1] = (float)((ma_int32)right / 2147483648.0);\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_right_side__scalar(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    float factor = 1 / 2147483648.0;\n    for (i = 0; i < frameCount4; ++i) {\n        ma_uint32 side0  = pInputSamples0U32[i*4+0] << shift0;\n        ma_uint32 side1  = pInputSamples0U32[i*4+1] << shift0;\n        ma_uint32 side2  = pInputSamples0U32[i*4+2] << shift0;\n        ma_uint32 side3  = pInputSamples0U32[i*4+3] << shift0;\n        ma_uint32 right0 = pInputSamples1U32[i*4+0] << shift1;\n        ma_uint32 right1 = pInputSamples1U32[i*4+1] << shift1;\n        ma_uint32 right2 = pInputSamples1U32[i*4+2] << shift1;\n        ma_uint32 right3 = pInputSamples1U32[i*4+3] << shift1;\n        ma_uint32 left0 = right0 + side0;\n        ma_uint32 left1 = right1 + side1;\n        ma_uint32 left2 = right2 + side2;\n        ma_uint32 left3 = right3 + side3;\n        pOutputSamples[i*8+0] = (ma_int32)left0  * factor;\n        pOutputSamples[i*8+1] = (ma_int32)right0 * factor;\n        pOutputSamples[i*8+2] = (ma_int32)left1  * factor;\n        pOutputSamples[i*8+3] = (ma_int32)right1 * factor;\n        pOutputSamples[i*8+4] = (ma_int32)left2  * factor;\n        pOutputSamples[i*8+5] = (ma_int32)right2 * factor;\n        pOutputSamples[i*8+6] = (ma_int32)left3  * factor;\n        pOutputSamples[i*8+7] = (ma_int32)right3 * factor;\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 side  = pInputSamples0U32[i] << shift0;\n        ma_uint32 right = pInputSamples1U32[i] << shift1;\n        ma_uint32 left  = right + side;\n        pOutputSamples[i*2+0] = (ma_int32)left  * factor;\n        pOutputSamples[i*2+1] = (ma_int32)right * factor;\n    }\n}\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_right_side__sse2(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8;\n    ma_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8;\n    __m128 factor;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    factor = _mm_set1_ps(1.0f / 8388608.0f);\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i side  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        __m128i right = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        __m128i left  = _mm_add_epi32(right, side);\n        __m128 leftf  = _mm_mul_ps(_mm_cvtepi32_ps(left),  factor);\n        __m128 rightf = _mm_mul_ps(_mm_cvtepi32_ps(right), factor);\n        _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf));\n        _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 side  = pInputSamples0U32[i] << shift0;\n        ma_uint32 right = pInputSamples1U32[i] << shift1;\n        ma_uint32 left  = right + side;\n        pOutputSamples[i*2+0] = (ma_int32)left  / 8388608.0f;\n        pOutputSamples[i*2+1] = (ma_int32)right / 8388608.0f;\n    }\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_right_side__neon(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8;\n    ma_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8;\n    float32x4_t factor4;\n    int32x4_t shift0_4;\n    int32x4_t shift1_4;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    factor4  = vdupq_n_f32(1.0f / 8388608.0f);\n    shift0_4 = vdupq_n_s32(shift0);\n    shift1_4 = vdupq_n_s32(shift1);\n    for (i = 0; i < frameCount4; ++i) {\n        uint32x4_t side;\n        uint32x4_t right;\n        uint32x4_t left;\n        float32x4_t leftf;\n        float32x4_t rightf;\n        side   = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4);\n        right  = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4);\n        left   = vaddq_u32(right, side);\n        leftf  = vmulq_f32(vcvtq_f32_s32(vreinterpretq_s32_u32(left)),  factor4);\n        rightf = vmulq_f32(vcvtq_f32_s32(vreinterpretq_s32_u32(right)), factor4);\n        ma_dr_flac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 side  = pInputSamples0U32[i] << shift0;\n        ma_uint32 right = pInputSamples1U32[i] << shift1;\n        ma_uint32 left  = right + side;\n        pOutputSamples[i*2+0] = (ma_int32)left  / 8388608.0f;\n        pOutputSamples[i*2+1] = (ma_int32)right / 8388608.0f;\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_right_side(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\n    if (ma_dr_flac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_f32__decode_right_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(MA_DR_FLAC_SUPPORT_NEON)\n    if (ma_dr_flac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_f32__decode_right_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n#if 0\n        ma_dr_flac_read_pcm_frames_f32__decode_right_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        ma_dr_flac_read_pcm_frames_f32__decode_right_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n#if 0\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_mid_side__reference(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    for (ma_uint64 i = 0; i < frameCount; ++i) {\n        ma_uint32 mid  = (ma_uint32)pInputSamples0[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n        ma_uint32 side = (ma_uint32)pInputSamples1[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n        mid = (mid << 1) | (side & 0x01);\n        pOutputSamples[i*2+0] = (float)((((ma_int32)(mid + side) >> 1) << (unusedBitsPerSample)) / 2147483648.0);\n        pOutputSamples[i*2+1] = (float)((((ma_int32)(mid - side) >> 1) << (unusedBitsPerSample)) / 2147483648.0);\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_mid_side__scalar(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift = unusedBitsPerSample;\n    float factor = 1 / 2147483648.0;\n    if (shift > 0) {\n        shift -= 1;\n        for (i = 0; i < frameCount4; ++i) {\n            ma_uint32 temp0L;\n            ma_uint32 temp1L;\n            ma_uint32 temp2L;\n            ma_uint32 temp3L;\n            ma_uint32 temp0R;\n            ma_uint32 temp1R;\n            ma_uint32 temp2R;\n            ma_uint32 temp3R;\n            ma_uint32 mid0  = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid1  = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid2  = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid3  = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid0 = (mid0 << 1) | (side0 & 0x01);\n            mid1 = (mid1 << 1) | (side1 & 0x01);\n            mid2 = (mid2 << 1) | (side2 & 0x01);\n            mid3 = (mid3 << 1) | (side3 & 0x01);\n            temp0L = (mid0 + side0) << shift;\n            temp1L = (mid1 + side1) << shift;\n            temp2L = (mid2 + side2) << shift;\n            temp3L = (mid3 + side3) << shift;\n            temp0R = (mid0 - side0) << shift;\n            temp1R = (mid1 - side1) << shift;\n            temp2R = (mid2 - side2) << shift;\n            temp3R = (mid3 - side3) << shift;\n            pOutputSamples[i*8+0] = (ma_int32)temp0L * factor;\n            pOutputSamples[i*8+1] = (ma_int32)temp0R * factor;\n            pOutputSamples[i*8+2] = (ma_int32)temp1L * factor;\n            pOutputSamples[i*8+3] = (ma_int32)temp1R * factor;\n            pOutputSamples[i*8+4] = (ma_int32)temp2L * factor;\n            pOutputSamples[i*8+5] = (ma_int32)temp2R * factor;\n            pOutputSamples[i*8+6] = (ma_int32)temp3L * factor;\n            pOutputSamples[i*8+7] = (ma_int32)temp3R * factor;\n        }\n    } else {\n        for (i = 0; i < frameCount4; ++i) {\n            ma_uint32 temp0L;\n            ma_uint32 temp1L;\n            ma_uint32 temp2L;\n            ma_uint32 temp3L;\n            ma_uint32 temp0R;\n            ma_uint32 temp1R;\n            ma_uint32 temp2R;\n            ma_uint32 temp3R;\n            ma_uint32 mid0  = pInputSamples0U32[i*4+0] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid1  = pInputSamples0U32[i*4+1] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid2  = pInputSamples0U32[i*4+2] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 mid3  = pInputSamples0U32[i*4+3] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side0 = pInputSamples1U32[i*4+0] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side1 = pInputSamples1U32[i*4+1] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side2 = pInputSamples1U32[i*4+2] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            ma_uint32 side3 = pInputSamples1U32[i*4+3] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid0 = (mid0 << 1) | (side0 & 0x01);\n            mid1 = (mid1 << 1) | (side1 & 0x01);\n            mid2 = (mid2 << 1) | (side2 & 0x01);\n            mid3 = (mid3 << 1) | (side3 & 0x01);\n            temp0L = (ma_uint32)((ma_int32)(mid0 + side0) >> 1);\n            temp1L = (ma_uint32)((ma_int32)(mid1 + side1) >> 1);\n            temp2L = (ma_uint32)((ma_int32)(mid2 + side2) >> 1);\n            temp3L = (ma_uint32)((ma_int32)(mid3 + side3) >> 1);\n            temp0R = (ma_uint32)((ma_int32)(mid0 - side0) >> 1);\n            temp1R = (ma_uint32)((ma_int32)(mid1 - side1) >> 1);\n            temp2R = (ma_uint32)((ma_int32)(mid2 - side2) >> 1);\n            temp3R = (ma_uint32)((ma_int32)(mid3 - side3) >> 1);\n            pOutputSamples[i*8+0] = (ma_int32)temp0L * factor;\n            pOutputSamples[i*8+1] = (ma_int32)temp0R * factor;\n            pOutputSamples[i*8+2] = (ma_int32)temp1L * factor;\n            pOutputSamples[i*8+3] = (ma_int32)temp1R * factor;\n            pOutputSamples[i*8+4] = (ma_int32)temp2L * factor;\n            pOutputSamples[i*8+5] = (ma_int32)temp2R * factor;\n            pOutputSamples[i*8+6] = (ma_int32)temp3L * factor;\n            pOutputSamples[i*8+7] = (ma_int32)temp3R * factor;\n        }\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n        ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n        mid = (mid << 1) | (side & 0x01);\n        pOutputSamples[i*2+0] = (ma_int32)((ma_uint32)((ma_int32)(mid + side) >> 1) << unusedBitsPerSample) * factor;\n        pOutputSamples[i*2+1] = (ma_int32)((ma_uint32)((ma_int32)(mid - side) >> 1) << unusedBitsPerSample) * factor;\n    }\n}\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_mid_side__sse2(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift = unusedBitsPerSample - 8;\n    float factor;\n    __m128 factor128;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    factor = 1.0f / 8388608.0f;\n    factor128 = _mm_set1_ps(factor);\n    if (shift == 0) {\n        for (i = 0; i < frameCount4; ++i) {\n            __m128i mid;\n            __m128i side;\n            __m128i tempL;\n            __m128i tempR;\n            __m128  leftf;\n            __m128  rightf;\n            mid    = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n            side   = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n            mid    = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01)));\n            tempL  = _mm_srai_epi32(_mm_add_epi32(mid, side), 1);\n            tempR  = _mm_srai_epi32(_mm_sub_epi32(mid, side), 1);\n            leftf  = _mm_mul_ps(_mm_cvtepi32_ps(tempL), factor128);\n            rightf = _mm_mul_ps(_mm_cvtepi32_ps(tempR), factor128);\n            _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf));\n            _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf));\n        }\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid = (mid << 1) | (side & 0x01);\n            pOutputSamples[i*2+0] = ((ma_int32)(mid + side) >> 1) * factor;\n            pOutputSamples[i*2+1] = ((ma_int32)(mid - side) >> 1) * factor;\n        }\n    } else {\n        shift -= 1;\n        for (i = 0; i < frameCount4; ++i) {\n            __m128i mid;\n            __m128i side;\n            __m128i tempL;\n            __m128i tempR;\n            __m128 leftf;\n            __m128 rightf;\n            mid    = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n            side   = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n            mid    = _mm_or_si128(_mm_slli_epi32(mid, 1), _mm_and_si128(side, _mm_set1_epi32(0x01)));\n            tempL  = _mm_slli_epi32(_mm_add_epi32(mid, side), shift);\n            tempR  = _mm_slli_epi32(_mm_sub_epi32(mid, side), shift);\n            leftf  = _mm_mul_ps(_mm_cvtepi32_ps(tempL), factor128);\n            rightf = _mm_mul_ps(_mm_cvtepi32_ps(tempR), factor128);\n            _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf));\n            _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf));\n        }\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid = (mid << 1) | (side & 0x01);\n            pOutputSamples[i*2+0] = (ma_int32)((mid + side) << shift) * factor;\n            pOutputSamples[i*2+1] = (ma_int32)((mid - side) << shift) * factor;\n        }\n    }\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_mid_side__neon(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift = unusedBitsPerSample - 8;\n    float factor;\n    float32x4_t factor4;\n    int32x4_t shift4;\n    int32x4_t wbps0_4;\n    int32x4_t wbps1_4;\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 24);\n    factor  = 1.0f / 8388608.0f;\n    factor4 = vdupq_n_f32(factor);\n    wbps0_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample);\n    wbps1_4 = vdupq_n_s32(pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample);\n    if (shift == 0) {\n        for (i = 0; i < frameCount4; ++i) {\n            int32x4_t lefti;\n            int32x4_t righti;\n            float32x4_t leftf;\n            float32x4_t rightf;\n            uint32x4_t mid  = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbps0_4);\n            uint32x4_t side = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbps1_4);\n            mid    = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, vdupq_n_u32(1)));\n            lefti  = vshrq_n_s32(vreinterpretq_s32_u32(vaddq_u32(mid, side)), 1);\n            righti = vshrq_n_s32(vreinterpretq_s32_u32(vsubq_u32(mid, side)), 1);\n            leftf  = vmulq_f32(vcvtq_f32_s32(lefti),  factor4);\n            rightf = vmulq_f32(vcvtq_f32_s32(righti), factor4);\n            ma_dr_flac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf));\n        }\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid = (mid << 1) | (side & 0x01);\n            pOutputSamples[i*2+0] = ((ma_int32)(mid + side) >> 1) * factor;\n            pOutputSamples[i*2+1] = ((ma_int32)(mid - side) >> 1) * factor;\n        }\n    } else {\n        shift -= 1;\n        shift4 = vdupq_n_s32(shift);\n        for (i = 0; i < frameCount4; ++i) {\n            uint32x4_t mid;\n            uint32x4_t side;\n            int32x4_t lefti;\n            int32x4_t righti;\n            float32x4_t leftf;\n            float32x4_t rightf;\n            mid    = vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), wbps0_4);\n            side   = vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), wbps1_4);\n            mid    = vorrq_u32(vshlq_n_u32(mid, 1), vandq_u32(side, vdupq_n_u32(1)));\n            lefti  = vreinterpretq_s32_u32(vshlq_u32(vaddq_u32(mid, side), shift4));\n            righti = vreinterpretq_s32_u32(vshlq_u32(vsubq_u32(mid, side), shift4));\n            leftf  = vmulq_f32(vcvtq_f32_s32(lefti),  factor4);\n            rightf = vmulq_f32(vcvtq_f32_s32(righti), factor4);\n            ma_dr_flac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf));\n        }\n        for (i = (frameCount4 << 2); i < frameCount; ++i) {\n            ma_uint32 mid  = pInputSamples0U32[i] << pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n            ma_uint32 side = pInputSamples1U32[i] << pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n            mid = (mid << 1) | (side & 0x01);\n            pOutputSamples[i*2+0] = (ma_int32)((mid + side) << shift) * factor;\n            pOutputSamples[i*2+1] = (ma_int32)((mid - side) << shift) * factor;\n        }\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_mid_side(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\n    if (ma_dr_flac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_f32__decode_mid_side__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(MA_DR_FLAC_SUPPORT_NEON)\n    if (ma_dr_flac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_f32__decode_mid_side__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n#if 0\n        ma_dr_flac_read_pcm_frames_f32__decode_mid_side__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        ma_dr_flac_read_pcm_frames_f32__decode_mid_side__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\n#if 0\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_independent_stereo__reference(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    for (ma_uint64 i = 0; i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (float)((ma_int32)((ma_uint32)pInputSamples0[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample)) / 2147483648.0);\n        pOutputSamples[i*2+1] = (float)((ma_int32)((ma_uint32)pInputSamples1[i] << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample)) / 2147483648.0);\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_independent_stereo__scalar(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample;\n    ma_uint32 shift1 = unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample;\n    float factor = 1 / 2147483648.0;\n    for (i = 0; i < frameCount4; ++i) {\n        ma_uint32 tempL0 = pInputSamples0U32[i*4+0] << shift0;\n        ma_uint32 tempL1 = pInputSamples0U32[i*4+1] << shift0;\n        ma_uint32 tempL2 = pInputSamples0U32[i*4+2] << shift0;\n        ma_uint32 tempL3 = pInputSamples0U32[i*4+3] << shift0;\n        ma_uint32 tempR0 = pInputSamples1U32[i*4+0] << shift1;\n        ma_uint32 tempR1 = pInputSamples1U32[i*4+1] << shift1;\n        ma_uint32 tempR2 = pInputSamples1U32[i*4+2] << shift1;\n        ma_uint32 tempR3 = pInputSamples1U32[i*4+3] << shift1;\n        pOutputSamples[i*8+0] = (ma_int32)tempL0 * factor;\n        pOutputSamples[i*8+1] = (ma_int32)tempR0 * factor;\n        pOutputSamples[i*8+2] = (ma_int32)tempL1 * factor;\n        pOutputSamples[i*8+3] = (ma_int32)tempR1 * factor;\n        pOutputSamples[i*8+4] = (ma_int32)tempL2 * factor;\n        pOutputSamples[i*8+5] = (ma_int32)tempR2 * factor;\n        pOutputSamples[i*8+6] = (ma_int32)tempL3 * factor;\n        pOutputSamples[i*8+7] = (ma_int32)tempR3 * factor;\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (ma_int32)(pInputSamples0U32[i] << shift0) * factor;\n        pOutputSamples[i*2+1] = (ma_int32)(pInputSamples1U32[i] << shift1) * factor;\n    }\n}\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_independent_stereo__sse2(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8;\n    ma_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8;\n    float factor = 1.0f / 8388608.0f;\n    __m128 factor128 = _mm_set1_ps(factor);\n    for (i = 0; i < frameCount4; ++i) {\n        __m128i lefti;\n        __m128i righti;\n        __m128 leftf;\n        __m128 rightf;\n        lefti  = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples0 + i), shift0);\n        righti = _mm_slli_epi32(_mm_loadu_si128((const __m128i*)pInputSamples1 + i), shift1);\n        leftf  = _mm_mul_ps(_mm_cvtepi32_ps(lefti),  factor128);\n        rightf = _mm_mul_ps(_mm_cvtepi32_ps(righti), factor128);\n        _mm_storeu_ps(pOutputSamples + i*8 + 0, _mm_unpacklo_ps(leftf, rightf));\n        _mm_storeu_ps(pOutputSamples + i*8 + 4, _mm_unpackhi_ps(leftf, rightf));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (ma_int32)(pInputSamples0U32[i] << shift0) * factor;\n        pOutputSamples[i*2+1] = (ma_int32)(pInputSamples1U32[i] << shift1) * factor;\n    }\n}\n#endif\n#if defined(MA_DR_FLAC_SUPPORT_NEON)\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_independent_stereo__neon(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n    ma_uint64 i;\n    ma_uint64 frameCount4 = frameCount >> 2;\n    const ma_uint32* pInputSamples0U32 = (const ma_uint32*)pInputSamples0;\n    const ma_uint32* pInputSamples1U32 = (const ma_uint32*)pInputSamples1;\n    ma_uint32 shift0 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[0].wastedBitsPerSample) - 8;\n    ma_uint32 shift1 = (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[1].wastedBitsPerSample) - 8;\n    float factor = 1.0f / 8388608.0f;\n    float32x4_t factor4 = vdupq_n_f32(factor);\n    int32x4_t shift0_4  = vdupq_n_s32(shift0);\n    int32x4_t shift1_4  = vdupq_n_s32(shift1);\n    for (i = 0; i < frameCount4; ++i) {\n        int32x4_t lefti;\n        int32x4_t righti;\n        float32x4_t leftf;\n        float32x4_t rightf;\n        lefti  = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples0U32 + i*4), shift0_4));\n        righti = vreinterpretq_s32_u32(vshlq_u32(vld1q_u32(pInputSamples1U32 + i*4), shift1_4));\n        leftf  = vmulq_f32(vcvtq_f32_s32(lefti),  factor4);\n        rightf = vmulq_f32(vcvtq_f32_s32(righti), factor4);\n        ma_dr_flac__vst2q_f32(pOutputSamples + i*8, vzipq_f32(leftf, rightf));\n    }\n    for (i = (frameCount4 << 2); i < frameCount; ++i) {\n        pOutputSamples[i*2+0] = (ma_int32)(pInputSamples0U32[i] << shift0) * factor;\n        pOutputSamples[i*2+1] = (ma_int32)(pInputSamples1U32[i] << shift1) * factor;\n    }\n}\n#endif\nstatic MA_INLINE void ma_dr_flac_read_pcm_frames_f32__decode_independent_stereo(ma_dr_flac* pFlac, ma_uint64 frameCount, ma_uint32 unusedBitsPerSample, const ma_int32* pInputSamples0, const ma_int32* pInputSamples1, float* pOutputSamples)\n{\n#if defined(MA_DR_FLAC_SUPPORT_SSE2)\n    if (ma_dr_flac__gIsSSE2Supported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_f32__decode_independent_stereo__sse2(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#elif defined(MA_DR_FLAC_SUPPORT_NEON)\n    if (ma_dr_flac__gIsNEONSupported && pFlac->bitsPerSample <= 24) {\n        ma_dr_flac_read_pcm_frames_f32__decode_independent_stereo__neon(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n    } else\n#endif\n    {\n#if 0\n        ma_dr_flac_read_pcm_frames_f32__decode_independent_stereo__reference(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#else\n        ma_dr_flac_read_pcm_frames_f32__decode_independent_stereo__scalar(pFlac, frameCount, unusedBitsPerSample, pInputSamples0, pInputSamples1, pOutputSamples);\n#endif\n    }\n}\nMA_API ma_uint64 ma_dr_flac_read_pcm_frames_f32(ma_dr_flac* pFlac, ma_uint64 framesToRead, float* pBufferOut)\n{\n    ma_uint64 framesRead;\n    ma_uint32 unusedBitsPerSample;\n    if (pFlac == NULL || framesToRead == 0) {\n        return 0;\n    }\n    if (pBufferOut == NULL) {\n        return ma_dr_flac__seek_forward_by_pcm_frames(pFlac, framesToRead);\n    }\n    MA_DR_FLAC_ASSERT(pFlac->bitsPerSample <= 32);\n    unusedBitsPerSample = 32 - pFlac->bitsPerSample;\n    framesRead = 0;\n    while (framesToRead > 0) {\n        if (pFlac->currentFLACFrame.pcmFramesRemaining == 0) {\n            if (!ma_dr_flac__read_and_decode_next_flac_frame(pFlac)) {\n                break;\n            }\n        } else {\n            unsigned int channelCount = ma_dr_flac__get_channel_count_from_channel_assignment(pFlac->currentFLACFrame.header.channelAssignment);\n            ma_uint64 iFirstPCMFrame = pFlac->currentFLACFrame.header.blockSizeInPCMFrames - pFlac->currentFLACFrame.pcmFramesRemaining;\n            ma_uint64 frameCountThisIteration = framesToRead;\n            if (frameCountThisIteration > pFlac->currentFLACFrame.pcmFramesRemaining) {\n                frameCountThisIteration = pFlac->currentFLACFrame.pcmFramesRemaining;\n            }\n            if (channelCount == 2) {\n                const ma_int32* pDecodedSamples0 = pFlac->currentFLACFrame.subframes[0].pSamplesS32 + iFirstPCMFrame;\n                const ma_int32* pDecodedSamples1 = pFlac->currentFLACFrame.subframes[1].pSamplesS32 + iFirstPCMFrame;\n                switch (pFlac->currentFLACFrame.header.channelAssignment)\n                {\n                    case MA_DR_FLAC_CHANNEL_ASSIGNMENT_LEFT_SIDE:\n                    {\n                        ma_dr_flac_read_pcm_frames_f32__decode_left_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                    case MA_DR_FLAC_CHANNEL_ASSIGNMENT_RIGHT_SIDE:\n                    {\n                        ma_dr_flac_read_pcm_frames_f32__decode_right_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                    case MA_DR_FLAC_CHANNEL_ASSIGNMENT_MID_SIDE:\n                    {\n                        ma_dr_flac_read_pcm_frames_f32__decode_mid_side(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                    case MA_DR_FLAC_CHANNEL_ASSIGNMENT_INDEPENDENT:\n                    default:\n                    {\n                        ma_dr_flac_read_pcm_frames_f32__decode_independent_stereo(pFlac, frameCountThisIteration, unusedBitsPerSample, pDecodedSamples0, pDecodedSamples1, pBufferOut);\n                    } break;\n                }\n            } else {\n                ma_uint64 i;\n                for (i = 0; i < frameCountThisIteration; ++i) {\n                    unsigned int j;\n                    for (j = 0; j < channelCount; ++j) {\n                        ma_int32 sampleS32 = (ma_int32)((ma_uint32)(pFlac->currentFLACFrame.subframes[j].pSamplesS32[iFirstPCMFrame + i]) << (unusedBitsPerSample + pFlac->currentFLACFrame.subframes[j].wastedBitsPerSample));\n                        pBufferOut[(i*channelCount)+j] = (float)(sampleS32 / 2147483648.0);\n                    }\n                }\n            }\n            framesRead                += frameCountThisIteration;\n            pBufferOut                += frameCountThisIteration * channelCount;\n            framesToRead              -= frameCountThisIteration;\n            pFlac->currentPCMFrame    += frameCountThisIteration;\n            pFlac->currentFLACFrame.pcmFramesRemaining -= (unsigned int)frameCountThisIteration;\n        }\n    }\n    return framesRead;\n}\nMA_API ma_bool32 ma_dr_flac_seek_to_pcm_frame(ma_dr_flac* pFlac, ma_uint64 pcmFrameIndex)\n{\n    if (pFlac == NULL) {\n        return MA_FALSE;\n    }\n    if (pFlac->currentPCMFrame == pcmFrameIndex) {\n        return MA_TRUE;\n    }\n    if (pFlac->firstFLACFramePosInBytes == 0) {\n        return MA_FALSE;\n    }\n    if (pcmFrameIndex == 0) {\n        pFlac->currentPCMFrame = 0;\n        return ma_dr_flac__seek_to_first_frame(pFlac);\n    } else {\n        ma_bool32 wasSuccessful = MA_FALSE;\n        ma_uint64 originalPCMFrame = pFlac->currentPCMFrame;\n        if (pcmFrameIndex > pFlac->totalPCMFrameCount) {\n            pcmFrameIndex = pFlac->totalPCMFrameCount;\n        }\n        if (pcmFrameIndex > pFlac->currentPCMFrame) {\n            ma_uint32 offset = (ma_uint32)(pcmFrameIndex - pFlac->currentPCMFrame);\n            if (pFlac->currentFLACFrame.pcmFramesRemaining >  offset) {\n                pFlac->currentFLACFrame.pcmFramesRemaining -= offset;\n                pFlac->currentPCMFrame = pcmFrameIndex;\n                return MA_TRUE;\n            }\n        } else {\n            ma_uint32 offsetAbs = (ma_uint32)(pFlac->currentPCMFrame - pcmFrameIndex);\n            ma_uint32 currentFLACFramePCMFrameCount = pFlac->currentFLACFrame.header.blockSizeInPCMFrames;\n            ma_uint32 currentFLACFramePCMFramesConsumed = currentFLACFramePCMFrameCount - pFlac->currentFLACFrame.pcmFramesRemaining;\n            if (currentFLACFramePCMFramesConsumed > offsetAbs) {\n                pFlac->currentFLACFrame.pcmFramesRemaining += offsetAbs;\n                pFlac->currentPCMFrame = pcmFrameIndex;\n                return MA_TRUE;\n            }\n        }\n#ifndef MA_DR_FLAC_NO_OGG\n        if (pFlac->container == ma_dr_flac_container_ogg)\n        {\n            wasSuccessful = ma_dr_flac_ogg__seek_to_pcm_frame(pFlac, pcmFrameIndex);\n        }\n        else\n#endif\n        {\n            if (!pFlac->_noSeekTableSeek) {\n                wasSuccessful = ma_dr_flac__seek_to_pcm_frame__seek_table(pFlac, pcmFrameIndex);\n            }\n#if !defined(MA_DR_FLAC_NO_CRC)\n            if (!wasSuccessful && !pFlac->_noBinarySearchSeek && pFlac->totalPCMFrameCount > 0) {\n                wasSuccessful = ma_dr_flac__seek_to_pcm_frame__binary_search(pFlac, pcmFrameIndex);\n            }\n#endif\n            if (!wasSuccessful && !pFlac->_noBruteForceSeek) {\n                wasSuccessful = ma_dr_flac__seek_to_pcm_frame__brute_force(pFlac, pcmFrameIndex);\n            }\n        }\n        if (wasSuccessful) {\n            pFlac->currentPCMFrame = pcmFrameIndex;\n        } else {\n            if (ma_dr_flac_seek_to_pcm_frame(pFlac, originalPCMFrame) == MA_FALSE) {\n                ma_dr_flac_seek_to_pcm_frame(pFlac, 0);\n            }\n        }\n        return wasSuccessful;\n    }\n}\n#define MA_DR_FLAC_DEFINE_FULL_READ_AND_CLOSE(extension, type) \\\nstatic type* ma_dr_flac__full_read_and_close_ ## extension (ma_dr_flac* pFlac, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut)\\\n{                                                                                                                                                                   \\\n    type* pSampleData = NULL;                                                                                                                                       \\\n    ma_uint64 totalPCMFrameCount;                                                                                                                               \\\n                                                                                                                                                                    \\\n    MA_DR_FLAC_ASSERT(pFlac != NULL);                                                                                                                                   \\\n                                                                                                                                                                    \\\n    totalPCMFrameCount = pFlac->totalPCMFrameCount;                                                                                                                 \\\n                                                                                                                                                                    \\\n    if (totalPCMFrameCount == 0) {                                                                                                                                  \\\n        type buffer[4096];                                                                                                                                          \\\n        ma_uint64 pcmFramesRead;                                                                                                                                \\\n        size_t sampleDataBufferSize = sizeof(buffer);                                                                                                               \\\n                                                                                                                                                                    \\\n        pSampleData = (type*)ma_dr_flac__malloc_from_callbacks(sampleDataBufferSize, &pFlac->allocationCallbacks);                                                      \\\n        if (pSampleData == NULL) {                                                                                                                                  \\\n            goto on_error;                                                                                                                                          \\\n        }                                                                                                                                                           \\\n                                                                                                                                                                    \\\n        while ((pcmFramesRead = (ma_uint64)ma_dr_flac_read_pcm_frames_##extension(pFlac, sizeof(buffer)/sizeof(buffer[0])/pFlac->channels, buffer)) > 0) {          \\\n            if (((totalPCMFrameCount + pcmFramesRead) * pFlac->channels * sizeof(type)) > sampleDataBufferSize) {                                                   \\\n                type* pNewSampleData;                                                                                                                               \\\n                size_t newSampleDataBufferSize;                                                                                                                     \\\n                                                                                                                                                                    \\\n                newSampleDataBufferSize = sampleDataBufferSize * 2;                                                                                                 \\\n                pNewSampleData = (type*)ma_dr_flac__realloc_from_callbacks(pSampleData, newSampleDataBufferSize, sampleDataBufferSize, &pFlac->allocationCallbacks);    \\\n                if (pNewSampleData == NULL) {                                                                                                                       \\\n                    ma_dr_flac__free_from_callbacks(pSampleData, &pFlac->allocationCallbacks);                                                                          \\\n                    goto on_error;                                                                                                                                  \\\n                }                                                                                                                                                   \\\n                                                                                                                                                                    \\\n                sampleDataBufferSize = newSampleDataBufferSize;                                                                                                     \\\n                pSampleData = pNewSampleData;                                                                                                                       \\\n            }                                                                                                                                                       \\\n                                                                                                                                                                    \\\n            MA_DR_FLAC_COPY_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), buffer, (size_t)(pcmFramesRead*pFlac->channels*sizeof(type)));                   \\\n            totalPCMFrameCount += pcmFramesRead;                                                                                                                    \\\n        }                                                                                                                                                           \\\n                                                                                                                                                                    \\\n                                                                                                                         \\\n        MA_DR_FLAC_ZERO_MEMORY(pSampleData + (totalPCMFrameCount*pFlac->channels), (size_t)(sampleDataBufferSize - totalPCMFrameCount*pFlac->channels*sizeof(type)));   \\\n    } else {                                                                                                                                                        \\\n        ma_uint64 dataSize = totalPCMFrameCount*pFlac->channels*sizeof(type);                                                                                   \\\n        if (dataSize > (ma_uint64)MA_SIZE_MAX) {                                                                                                            \\\n            goto on_error;                                                                                                        \\\n        }                                                                                                                                                           \\\n                                                                                                                                                                    \\\n        pSampleData = (type*)ma_dr_flac__malloc_from_callbacks((size_t)dataSize, &pFlac->allocationCallbacks);               \\\n        if (pSampleData == NULL) {                                                                                                                                  \\\n            goto on_error;                                                                                                                                          \\\n        }                                                                                                                                                           \\\n                                                                                                                                                                    \\\n        totalPCMFrameCount = ma_dr_flac_read_pcm_frames_##extension(pFlac, pFlac->totalPCMFrameCount, pSampleData);                                                     \\\n    }                                                                                                                                                               \\\n                                                                                                                                                                    \\\n    if (sampleRateOut) *sampleRateOut = pFlac->sampleRate;                                                                                                          \\\n    if (channelsOut) *channelsOut = pFlac->channels;                                                                                                                \\\n    if (totalPCMFrameCountOut) *totalPCMFrameCountOut = totalPCMFrameCount;                                                                                         \\\n                                                                                                                                                                    \\\n    ma_dr_flac_close(pFlac);                                                                                                                                            \\\n    return pSampleData;                                                                                                                                             \\\n                                                                                                                                                                    \\\non_error:                                                                                                                                                           \\\n    ma_dr_flac_close(pFlac);                                                                                                                                            \\\n    return NULL;                                                                                                                                                    \\\n}\nMA_DR_FLAC_DEFINE_FULL_READ_AND_CLOSE(s32, ma_int32)\nMA_DR_FLAC_DEFINE_FULL_READ_AND_CLOSE(s16, ma_int16)\nMA_DR_FLAC_DEFINE_FULL_READ_AND_CLOSE(f32, float)\nMA_API ma_int32* ma_dr_flac_open_and_read_pcm_frames_s32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac* pFlac;\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalPCMFrameCountOut) {\n        *totalPCMFrameCountOut = 0;\n    }\n    pFlac = ma_dr_flac_open(onRead, onSeek, pUserData, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n    return ma_dr_flac__full_read_and_close_s32(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut);\n}\nMA_API ma_int16* ma_dr_flac_open_and_read_pcm_frames_s16(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac* pFlac;\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalPCMFrameCountOut) {\n        *totalPCMFrameCountOut = 0;\n    }\n    pFlac = ma_dr_flac_open(onRead, onSeek, pUserData, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n    return ma_dr_flac__full_read_and_close_s16(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut);\n}\nMA_API float* ma_dr_flac_open_and_read_pcm_frames_f32(ma_dr_flac_read_proc onRead, ma_dr_flac_seek_proc onSeek, void* pUserData, unsigned int* channelsOut, unsigned int* sampleRateOut, ma_uint64* totalPCMFrameCountOut, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac* pFlac;\n    if (channelsOut) {\n        *channelsOut = 0;\n    }\n    if (sampleRateOut) {\n        *sampleRateOut = 0;\n    }\n    if (totalPCMFrameCountOut) {\n        *totalPCMFrameCountOut = 0;\n    }\n    pFlac = ma_dr_flac_open(onRead, onSeek, pUserData, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n    return ma_dr_flac__full_read_and_close_f32(pFlac, channelsOut, sampleRateOut, totalPCMFrameCountOut);\n}\n#ifndef MA_DR_FLAC_NO_STDIO\nMA_API ma_int32* ma_dr_flac_open_file_and_read_pcm_frames_s32(const char* filename, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac* pFlac;\n    if (sampleRate) {\n        *sampleRate = 0;\n    }\n    if (channels) {\n        *channels = 0;\n    }\n    if (totalPCMFrameCount) {\n        *totalPCMFrameCount = 0;\n    }\n    pFlac = ma_dr_flac_open_file(filename, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n    return ma_dr_flac__full_read_and_close_s32(pFlac, channels, sampleRate, totalPCMFrameCount);\n}\nMA_API ma_int16* ma_dr_flac_open_file_and_read_pcm_frames_s16(const char* filename, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac* pFlac;\n    if (sampleRate) {\n        *sampleRate = 0;\n    }\n    if (channels) {\n        *channels = 0;\n    }\n    if (totalPCMFrameCount) {\n        *totalPCMFrameCount = 0;\n    }\n    pFlac = ma_dr_flac_open_file(filename, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n    return ma_dr_flac__full_read_and_close_s16(pFlac, channels, sampleRate, totalPCMFrameCount);\n}\nMA_API float* ma_dr_flac_open_file_and_read_pcm_frames_f32(const char* filename, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac* pFlac;\n    if (sampleRate) {\n        *sampleRate = 0;\n    }\n    if (channels) {\n        *channels = 0;\n    }\n    if (totalPCMFrameCount) {\n        *totalPCMFrameCount = 0;\n    }\n    pFlac = ma_dr_flac_open_file(filename, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n    return ma_dr_flac__full_read_and_close_f32(pFlac, channels, sampleRate, totalPCMFrameCount);\n}\n#endif\nMA_API ma_int32* ma_dr_flac_open_memory_and_read_pcm_frames_s32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac* pFlac;\n    if (sampleRate) {\n        *sampleRate = 0;\n    }\n    if (channels) {\n        *channels = 0;\n    }\n    if (totalPCMFrameCount) {\n        *totalPCMFrameCount = 0;\n    }\n    pFlac = ma_dr_flac_open_memory(data, dataSize, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n    return ma_dr_flac__full_read_and_close_s32(pFlac, channels, sampleRate, totalPCMFrameCount);\n}\nMA_API ma_int16* ma_dr_flac_open_memory_and_read_pcm_frames_s16(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac* pFlac;\n    if (sampleRate) {\n        *sampleRate = 0;\n    }\n    if (channels) {\n        *channels = 0;\n    }\n    if (totalPCMFrameCount) {\n        *totalPCMFrameCount = 0;\n    }\n    pFlac = ma_dr_flac_open_memory(data, dataSize, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n    return ma_dr_flac__full_read_and_close_s16(pFlac, channels, sampleRate, totalPCMFrameCount);\n}\nMA_API float* ma_dr_flac_open_memory_and_read_pcm_frames_f32(const void* data, size_t dataSize, unsigned int* channels, unsigned int* sampleRate, ma_uint64* totalPCMFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_flac* pFlac;\n    if (sampleRate) {\n        *sampleRate = 0;\n    }\n    if (channels) {\n        *channels = 0;\n    }\n    if (totalPCMFrameCount) {\n        *totalPCMFrameCount = 0;\n    }\n    pFlac = ma_dr_flac_open_memory(data, dataSize, pAllocationCallbacks);\n    if (pFlac == NULL) {\n        return NULL;\n    }\n    return ma_dr_flac__full_read_and_close_f32(pFlac, channels, sampleRate, totalPCMFrameCount);\n}\nMA_API void ma_dr_flac_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks != NULL) {\n        ma_dr_flac__free_from_callbacks(p, pAllocationCallbacks);\n    } else {\n        ma_dr_flac__free_default(p, NULL);\n    }\n}\nMA_API void ma_dr_flac_init_vorbis_comment_iterator(ma_dr_flac_vorbis_comment_iterator* pIter, ma_uint32 commentCount, const void* pComments)\n{\n    if (pIter == NULL) {\n        return;\n    }\n    pIter->countRemaining = commentCount;\n    pIter->pRunningData   = (const char*)pComments;\n}\nMA_API const char* ma_dr_flac_next_vorbis_comment(ma_dr_flac_vorbis_comment_iterator* pIter, ma_uint32* pCommentLengthOut)\n{\n    ma_int32 length;\n    const char* pComment;\n    if (pCommentLengthOut) {\n        *pCommentLengthOut = 0;\n    }\n    if (pIter == NULL || pIter->countRemaining == 0 || pIter->pRunningData == NULL) {\n        return NULL;\n    }\n    length = ma_dr_flac__le2host_32_ptr_unaligned(pIter->pRunningData);\n    pIter->pRunningData += 4;\n    pComment = pIter->pRunningData;\n    pIter->pRunningData += length;\n    pIter->countRemaining -= 1;\n    if (pCommentLengthOut) {\n        *pCommentLengthOut = length;\n    }\n    return pComment;\n}\nMA_API void ma_dr_flac_init_cuesheet_track_iterator(ma_dr_flac_cuesheet_track_iterator* pIter, ma_uint32 trackCount, const void* pTrackData)\n{\n    if (pIter == NULL) {\n        return;\n    }\n    pIter->countRemaining = trackCount;\n    pIter->pRunningData   = (const char*)pTrackData;\n}\nMA_API ma_bool32 ma_dr_flac_next_cuesheet_track(ma_dr_flac_cuesheet_track_iterator* pIter, ma_dr_flac_cuesheet_track* pCuesheetTrack)\n{\n    ma_dr_flac_cuesheet_track cuesheetTrack;\n    const char* pRunningData;\n    ma_uint64 offsetHi;\n    ma_uint64 offsetLo;\n    if (pIter == NULL || pIter->countRemaining == 0 || pIter->pRunningData == NULL) {\n        return MA_FALSE;\n    }\n    pRunningData = pIter->pRunningData;\n    offsetHi                   = ma_dr_flac__be2host_32(*(const ma_uint32*)pRunningData); pRunningData += 4;\n    offsetLo                   = ma_dr_flac__be2host_32(*(const ma_uint32*)pRunningData); pRunningData += 4;\n    cuesheetTrack.offset       = offsetLo | (offsetHi << 32);\n    cuesheetTrack.trackNumber  = pRunningData[0];                                         pRunningData += 1;\n    MA_DR_FLAC_COPY_MEMORY(cuesheetTrack.ISRC, pRunningData, sizeof(cuesheetTrack.ISRC));     pRunningData += 12;\n    cuesheetTrack.isAudio      = (pRunningData[0] & 0x80) != 0;\n    cuesheetTrack.preEmphasis  = (pRunningData[0] & 0x40) != 0;                           pRunningData += 14;\n    cuesheetTrack.indexCount   = pRunningData[0];                                         pRunningData += 1;\n    cuesheetTrack.pIndexPoints = (const ma_dr_flac_cuesheet_track_index*)pRunningData;        pRunningData += cuesheetTrack.indexCount * sizeof(ma_dr_flac_cuesheet_track_index);\n    pIter->pRunningData = pRunningData;\n    pIter->countRemaining -= 1;\n    if (pCuesheetTrack) {\n        *pCuesheetTrack = cuesheetTrack;\n    }\n    return MA_TRUE;\n}\n#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)))\n    #pragma GCC diagnostic pop\n#endif\n#endif\n/* dr_flac_c end */\n#endif  /* MA_DR_FLAC_IMPLEMENTATION */\n#endif  /* MA_NO_FLAC */\n\n#if !defined(MA_NO_MP3) && !defined(MA_NO_DECODING)\n#if !defined(MA_DR_MP3_IMPLEMENTATION) && !defined(MA_DR_MP3_IMPLEMENTATION) /* For backwards compatibility. Will be removed in version 0.11 for cleanliness. */\n/* dr_mp3_c begin */\n#ifndef ma_dr_mp3_c\n#define ma_dr_mp3_c\n#include <stdlib.h>\n#include <string.h>\n#include <limits.h>\nMA_API void ma_dr_mp3_version(ma_uint32* pMajor, ma_uint32* pMinor, ma_uint32* pRevision)\n{\n    if (pMajor) {\n        *pMajor = MA_DR_MP3_VERSION_MAJOR;\n    }\n    if (pMinor) {\n        *pMinor = MA_DR_MP3_VERSION_MINOR;\n    }\n    if (pRevision) {\n        *pRevision = MA_DR_MP3_VERSION_REVISION;\n    }\n}\nMA_API const char* ma_dr_mp3_version_string(void)\n{\n    return MA_DR_MP3_VERSION_STRING;\n}\n#if defined(__TINYC__)\n#define MA_DR_MP3_NO_SIMD\n#endif\n#define MA_DR_MP3_OFFSET_PTR(p, offset) ((void*)((ma_uint8*)(p) + (offset)))\n#define MA_DR_MP3_MAX_FREE_FORMAT_FRAME_SIZE  2304\n#ifndef MA_DR_MP3_MAX_FRAME_SYNC_MATCHES\n#define MA_DR_MP3_MAX_FRAME_SYNC_MATCHES      10\n#endif\n#define MA_DR_MP3_MAX_L3_FRAME_PAYLOAD_BYTES  MA_DR_MP3_MAX_FREE_FORMAT_FRAME_SIZE\n#define MA_DR_MP3_MAX_BITRESERVOIR_BYTES      511\n#define MA_DR_MP3_SHORT_BLOCK_TYPE            2\n#define MA_DR_MP3_STOP_BLOCK_TYPE             3\n#define MA_DR_MP3_MODE_MONO                   3\n#define MA_DR_MP3_MODE_JOINT_STEREO           1\n#define MA_DR_MP3_HDR_SIZE                    4\n#define MA_DR_MP3_HDR_IS_MONO(h)              (((h[3]) & 0xC0) == 0xC0)\n#define MA_DR_MP3_HDR_IS_MS_STEREO(h)         (((h[3]) & 0xE0) == 0x60)\n#define MA_DR_MP3_HDR_IS_FREE_FORMAT(h)       (((h[2]) & 0xF0) == 0)\n#define MA_DR_MP3_HDR_IS_CRC(h)               (!((h[1]) & 1))\n#define MA_DR_MP3_HDR_TEST_PADDING(h)         ((h[2]) & 0x2)\n#define MA_DR_MP3_HDR_TEST_MPEG1(h)           ((h[1]) & 0x8)\n#define MA_DR_MP3_HDR_TEST_NOT_MPEG25(h)      ((h[1]) & 0x10)\n#define MA_DR_MP3_HDR_TEST_I_STEREO(h)        ((h[3]) & 0x10)\n#define MA_DR_MP3_HDR_TEST_MS_STEREO(h)       ((h[3]) & 0x20)\n#define MA_DR_MP3_HDR_GET_STEREO_MODE(h)      (((h[3]) >> 6) & 3)\n#define MA_DR_MP3_HDR_GET_STEREO_MODE_EXT(h)  (((h[3]) >> 4) & 3)\n#define MA_DR_MP3_HDR_GET_LAYER(h)            (((h[1]) >> 1) & 3)\n#define MA_DR_MP3_HDR_GET_BITRATE(h)          ((h[2]) >> 4)\n#define MA_DR_MP3_HDR_GET_SAMPLE_RATE(h)      (((h[2]) >> 2) & 3)\n#define MA_DR_MP3_HDR_GET_MY_SAMPLE_RATE(h)   (MA_DR_MP3_HDR_GET_SAMPLE_RATE(h) + (((h[1] >> 3) & 1) + ((h[1] >> 4) & 1))*3)\n#define MA_DR_MP3_HDR_IS_FRAME_576(h)         ((h[1] & 14) == 2)\n#define MA_DR_MP3_HDR_IS_LAYER_1(h)           ((h[1] & 6) == 6)\n#define MA_DR_MP3_BITS_DEQUANTIZER_OUT        -1\n#define MA_DR_MP3_MAX_SCF                     (255 + MA_DR_MP3_BITS_DEQUANTIZER_OUT*4 - 210)\n#define MA_DR_MP3_MAX_SCFI                    ((MA_DR_MP3_MAX_SCF + 3) & ~3)\n#define MA_DR_MP3_MIN(a, b)           ((a) > (b) ? (b) : (a))\n#define MA_DR_MP3_MAX(a, b)           ((a) < (b) ? (b) : (a))\n#if !defined(MA_DR_MP3_NO_SIMD)\n#if !defined(MA_DR_MP3_ONLY_SIMD) && (defined(_M_X64) || defined(__x86_64__) || defined(__aarch64__) || defined(_M_ARM64))\n#define MA_DR_MP3_ONLY_SIMD\n#endif\n#if ((defined(_MSC_VER) && _MSC_VER >= 1400) && defined(_M_X64)) || ((defined(__i386) || defined(_M_IX86) || defined(__i386__) || defined(__x86_64__)) && ((defined(_M_IX86_FP) && _M_IX86_FP == 2) || defined(__SSE2__)))\n#if defined(_MSC_VER)\n#include <intrin.h>\n#endif\n#include <emmintrin.h>\n#define MA_DR_MP3_HAVE_SSE 1\n#define MA_DR_MP3_HAVE_SIMD 1\n#define MA_DR_MP3_VSTORE _mm_storeu_ps\n#define MA_DR_MP3_VLD _mm_loadu_ps\n#define MA_DR_MP3_VSET _mm_set1_ps\n#define MA_DR_MP3_VADD _mm_add_ps\n#define MA_DR_MP3_VSUB _mm_sub_ps\n#define MA_DR_MP3_VMUL _mm_mul_ps\n#define MA_DR_MP3_VMAC(a, x, y) _mm_add_ps(a, _mm_mul_ps(x, y))\n#define MA_DR_MP3_VMSB(a, x, y) _mm_sub_ps(a, _mm_mul_ps(x, y))\n#define MA_DR_MP3_VMUL_S(x, s)  _mm_mul_ps(x, _mm_set1_ps(s))\n#define MA_DR_MP3_VREV(x) _mm_shuffle_ps(x, x, _MM_SHUFFLE(0, 1, 2, 3))\ntypedef __m128 ma_dr_mp3_f4;\n#if defined(_MSC_VER) || defined(MA_DR_MP3_ONLY_SIMD)\n#define ma_dr_mp3_cpuid __cpuid\n#else\nstatic __inline__ __attribute__((always_inline)) void ma_dr_mp3_cpuid(int CPUInfo[], const int InfoType)\n{\n#if defined(__PIC__)\n    __asm__ __volatile__(\n#if defined(__x86_64__)\n        \"push %%rbx\\n\"\n        \"cpuid\\n\"\n        \"xchgl %%ebx, %1\\n\"\n        \"pop  %%rbx\\n\"\n#else\n        \"xchgl %%ebx, %1\\n\"\n        \"cpuid\\n\"\n        \"xchgl %%ebx, %1\\n\"\n#endif\n        : \"=a\" (CPUInfo[0]), \"=r\" (CPUInfo[1]), \"=c\" (CPUInfo[2]), \"=d\" (CPUInfo[3])\n        : \"a\" (InfoType));\n#else\n    __asm__ __volatile__(\n        \"cpuid\"\n        : \"=a\" (CPUInfo[0]), \"=b\" (CPUInfo[1]), \"=c\" (CPUInfo[2]), \"=d\" (CPUInfo[3])\n        : \"a\" (InfoType));\n#endif\n}\n#endif\nstatic int ma_dr_mp3_have_simd(void)\n{\n#ifdef MA_DR_MP3_ONLY_SIMD\n    return 1;\n#else\n    static int g_have_simd;\n    int CPUInfo[4];\n#ifdef MINIMP3_TEST\n    static int g_counter;\n    if (g_counter++ > 100)\n        return 0;\n#endif\n    if (g_have_simd)\n        goto end;\n    ma_dr_mp3_cpuid(CPUInfo, 0);\n    if (CPUInfo[0] > 0)\n    {\n        ma_dr_mp3_cpuid(CPUInfo, 1);\n        g_have_simd = (CPUInfo[3] & (1 << 26)) + 1;\n        return g_have_simd - 1;\n    }\nend:\n    return g_have_simd - 1;\n#endif\n}\n#elif defined(__ARM_NEON) || defined(__aarch64__) || defined(_M_ARM64)\n#include <arm_neon.h>\n#define MA_DR_MP3_HAVE_SSE 0\n#define MA_DR_MP3_HAVE_SIMD 1\n#define MA_DR_MP3_VSTORE vst1q_f32\n#define MA_DR_MP3_VLD vld1q_f32\n#define MA_DR_MP3_VSET vmovq_n_f32\n#define MA_DR_MP3_VADD vaddq_f32\n#define MA_DR_MP3_VSUB vsubq_f32\n#define MA_DR_MP3_VMUL vmulq_f32\n#define MA_DR_MP3_VMAC(a, x, y) vmlaq_f32(a, x, y)\n#define MA_DR_MP3_VMSB(a, x, y) vmlsq_f32(a, x, y)\n#define MA_DR_MP3_VMUL_S(x, s)  vmulq_f32(x, vmovq_n_f32(s))\n#define MA_DR_MP3_VREV(x) vcombine_f32(vget_high_f32(vrev64q_f32(x)), vget_low_f32(vrev64q_f32(x)))\ntypedef float32x4_t ma_dr_mp3_f4;\nstatic int ma_dr_mp3_have_simd(void)\n{\n    return 1;\n}\n#else\n#define MA_DR_MP3_HAVE_SSE 0\n#define MA_DR_MP3_HAVE_SIMD 0\n#ifdef MA_DR_MP3_ONLY_SIMD\n#error MA_DR_MP3_ONLY_SIMD used, but SSE/NEON not enabled\n#endif\n#endif\n#else\n#define MA_DR_MP3_HAVE_SIMD 0\n#endif\n#if defined(__ARM_ARCH) && (__ARM_ARCH >= 6) && !defined(__aarch64__) && !defined(_M_ARM64) && !defined(__ARM_ARCH_6M__)\n#define MA_DR_MP3_HAVE_ARMV6 1\nstatic __inline__ __attribute__((always_inline)) ma_int32 ma_dr_mp3_clip_int16_arm(ma_int32 a)\n{\n    ma_int32 x = 0;\n    __asm__ (\"ssat %0, #16, %1\" : \"=r\"(x) : \"r\"(a));\n    return x;\n}\n#else\n#define MA_DR_MP3_HAVE_ARMV6 0\n#endif\n#ifndef MA_DR_MP3_ASSERT\n#include <assert.h>\n#define MA_DR_MP3_ASSERT(expression) assert(expression)\n#endif\n#ifndef MA_DR_MP3_COPY_MEMORY\n#define MA_DR_MP3_COPY_MEMORY(dst, src, sz) memcpy((dst), (src), (sz))\n#endif\n#ifndef MA_DR_MP3_MOVE_MEMORY\n#define MA_DR_MP3_MOVE_MEMORY(dst, src, sz) memmove((dst), (src), (sz))\n#endif\n#ifndef MA_DR_MP3_ZERO_MEMORY\n#define MA_DR_MP3_ZERO_MEMORY(p, sz) memset((p), 0, (sz))\n#endif\n#define MA_DR_MP3_ZERO_OBJECT(p) MA_DR_MP3_ZERO_MEMORY((p), sizeof(*(p)))\n#ifndef MA_DR_MP3_MALLOC\n#define MA_DR_MP3_MALLOC(sz) malloc((sz))\n#endif\n#ifndef MA_DR_MP3_REALLOC\n#define MA_DR_MP3_REALLOC(p, sz) realloc((p), (sz))\n#endif\n#ifndef MA_DR_MP3_FREE\n#define MA_DR_MP3_FREE(p) free((p))\n#endif\ntypedef struct\n{\n    const ma_uint8 *buf;\n    int pos, limit;\n} ma_dr_mp3_bs;\ntypedef struct\n{\n    float scf[3*64];\n    ma_uint8 total_bands, stereo_bands, bitalloc[64], scfcod[64];\n} ma_dr_mp3_L12_scale_info;\ntypedef struct\n{\n    ma_uint8 tab_offset, code_tab_width, band_count;\n} ma_dr_mp3_L12_subband_alloc;\ntypedef struct\n{\n    const ma_uint8 *sfbtab;\n    ma_uint16 part_23_length, big_values, scalefac_compress;\n    ma_uint8 global_gain, block_type, mixed_block_flag, n_long_sfb, n_short_sfb;\n    ma_uint8 table_select[3], region_count[3], subblock_gain[3];\n    ma_uint8 preflag, scalefac_scale, count1_table, scfsi;\n} ma_dr_mp3_L3_gr_info;\ntypedef struct\n{\n    ma_dr_mp3_bs bs;\n    ma_uint8 maindata[MA_DR_MP3_MAX_BITRESERVOIR_BYTES + MA_DR_MP3_MAX_L3_FRAME_PAYLOAD_BYTES];\n    ma_dr_mp3_L3_gr_info gr_info[4];\n    float grbuf[2][576], scf[40], syn[18 + 15][2*32];\n    ma_uint8 ist_pos[2][39];\n} ma_dr_mp3dec_scratch;\nstatic void ma_dr_mp3_bs_init(ma_dr_mp3_bs *bs, const ma_uint8 *data, int bytes)\n{\n    bs->buf   = data;\n    bs->pos   = 0;\n    bs->limit = bytes*8;\n}\nstatic ma_uint32 ma_dr_mp3_bs_get_bits(ma_dr_mp3_bs *bs, int n)\n{\n    ma_uint32 next, cache = 0, s = bs->pos & 7;\n    int shl = n + s;\n    const ma_uint8 *p = bs->buf + (bs->pos >> 3);\n    if ((bs->pos += n) > bs->limit)\n        return 0;\n    next = *p++ & (255 >> s);\n    while ((shl -= 8) > 0)\n    {\n        cache |= next << shl;\n        next = *p++;\n    }\n    return cache | (next >> -shl);\n}\nstatic int ma_dr_mp3_hdr_valid(const ma_uint8 *h)\n{\n    return h[0] == 0xff &&\n        ((h[1] & 0xF0) == 0xf0 || (h[1] & 0xFE) == 0xe2) &&\n        (MA_DR_MP3_HDR_GET_LAYER(h) != 0) &&\n        (MA_DR_MP3_HDR_GET_BITRATE(h) != 15) &&\n        (MA_DR_MP3_HDR_GET_SAMPLE_RATE(h) != 3);\n}\nstatic int ma_dr_mp3_hdr_compare(const ma_uint8 *h1, const ma_uint8 *h2)\n{\n    return ma_dr_mp3_hdr_valid(h2) &&\n        ((h1[1] ^ h2[1]) & 0xFE) == 0 &&\n        ((h1[2] ^ h2[2]) & 0x0C) == 0 &&\n        !(MA_DR_MP3_HDR_IS_FREE_FORMAT(h1) ^ MA_DR_MP3_HDR_IS_FREE_FORMAT(h2));\n}\nstatic unsigned ma_dr_mp3_hdr_bitrate_kbps(const ma_uint8 *h)\n{\n    static const ma_uint8 halfrate[2][3][15] = {\n        { { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,4,8,12,16,20,24,28,32,40,48,56,64,72,80 }, { 0,16,24,28,32,40,48,56,64,72,80,88,96,112,128 } },\n        { { 0,16,20,24,28,32,40,48,56,64,80,96,112,128,160 }, { 0,16,24,28,32,40,48,56,64,80,96,112,128,160,192 }, { 0,16,32,48,64,80,96,112,128,144,160,176,192,208,224 } },\n    };\n    return 2*halfrate[!!MA_DR_MP3_HDR_TEST_MPEG1(h)][MA_DR_MP3_HDR_GET_LAYER(h) - 1][MA_DR_MP3_HDR_GET_BITRATE(h)];\n}\nstatic unsigned ma_dr_mp3_hdr_sample_rate_hz(const ma_uint8 *h)\n{\n    static const unsigned g_hz[3] = { 44100, 48000, 32000 };\n    return g_hz[MA_DR_MP3_HDR_GET_SAMPLE_RATE(h)] >> (int)!MA_DR_MP3_HDR_TEST_MPEG1(h) >> (int)!MA_DR_MP3_HDR_TEST_NOT_MPEG25(h);\n}\nstatic unsigned ma_dr_mp3_hdr_frame_samples(const ma_uint8 *h)\n{\n    return MA_DR_MP3_HDR_IS_LAYER_1(h) ? 384 : (1152 >> (int)MA_DR_MP3_HDR_IS_FRAME_576(h));\n}\nstatic int ma_dr_mp3_hdr_frame_bytes(const ma_uint8 *h, int free_format_size)\n{\n    int frame_bytes = ma_dr_mp3_hdr_frame_samples(h)*ma_dr_mp3_hdr_bitrate_kbps(h)*125/ma_dr_mp3_hdr_sample_rate_hz(h);\n    if (MA_DR_MP3_HDR_IS_LAYER_1(h))\n    {\n        frame_bytes &= ~3;\n    }\n    return frame_bytes ? frame_bytes : free_format_size;\n}\nstatic int ma_dr_mp3_hdr_padding(const ma_uint8 *h)\n{\n    return MA_DR_MP3_HDR_TEST_PADDING(h) ? (MA_DR_MP3_HDR_IS_LAYER_1(h) ? 4 : 1) : 0;\n}\n#ifndef MA_DR_MP3_ONLY_MP3\nstatic const ma_dr_mp3_L12_subband_alloc *ma_dr_mp3_L12_subband_alloc_table(const ma_uint8 *hdr, ma_dr_mp3_L12_scale_info *sci)\n{\n    const ma_dr_mp3_L12_subband_alloc *alloc;\n    int mode = MA_DR_MP3_HDR_GET_STEREO_MODE(hdr);\n    int nbands, stereo_bands = (mode == MA_DR_MP3_MODE_MONO) ? 0 : (mode == MA_DR_MP3_MODE_JOINT_STEREO) ? (MA_DR_MP3_HDR_GET_STEREO_MODE_EXT(hdr) << 2) + 4 : 32;\n    if (MA_DR_MP3_HDR_IS_LAYER_1(hdr))\n    {\n        static const ma_dr_mp3_L12_subband_alloc g_alloc_L1[] = { { 76, 4, 32 } };\n        alloc = g_alloc_L1;\n        nbands = 32;\n    } else if (!MA_DR_MP3_HDR_TEST_MPEG1(hdr))\n    {\n        static const ma_dr_mp3_L12_subband_alloc g_alloc_L2M2[] = { { 60, 4, 4 }, { 44, 3, 7 }, { 44, 2, 19 } };\n        alloc = g_alloc_L2M2;\n        nbands = 30;\n    } else\n    {\n        static const ma_dr_mp3_L12_subband_alloc g_alloc_L2M1[] = { { 0, 4, 3 }, { 16, 4, 8 }, { 32, 3, 12 }, { 40, 2, 7 } };\n        int sample_rate_idx = MA_DR_MP3_HDR_GET_SAMPLE_RATE(hdr);\n        unsigned kbps = ma_dr_mp3_hdr_bitrate_kbps(hdr) >> (int)(mode != MA_DR_MP3_MODE_MONO);\n        if (!kbps)\n        {\n            kbps = 192;\n        }\n        alloc = g_alloc_L2M1;\n        nbands = 27;\n        if (kbps < 56)\n        {\n            static const ma_dr_mp3_L12_subband_alloc g_alloc_L2M1_lowrate[] = { { 44, 4, 2 }, { 44, 3, 10 } };\n            alloc = g_alloc_L2M1_lowrate;\n            nbands = sample_rate_idx == 2 ? 12 : 8;\n        } else if (kbps >= 96 && sample_rate_idx != 1)\n        {\n            nbands = 30;\n        }\n    }\n    sci->total_bands = (ma_uint8)nbands;\n    sci->stereo_bands = (ma_uint8)MA_DR_MP3_MIN(stereo_bands, nbands);\n    return alloc;\n}\nstatic void ma_dr_mp3_L12_read_scalefactors(ma_dr_mp3_bs *bs, ma_uint8 *pba, ma_uint8 *scfcod, int bands, float *scf)\n{\n    static const float g_deq_L12[18*3] = {\n#define MA_DR_MP3_DQ(x) 9.53674316e-07f/x, 7.56931807e-07f/x, 6.00777173e-07f/x\n        MA_DR_MP3_DQ(3),MA_DR_MP3_DQ(7),MA_DR_MP3_DQ(15),MA_DR_MP3_DQ(31),MA_DR_MP3_DQ(63),MA_DR_MP3_DQ(127),MA_DR_MP3_DQ(255),MA_DR_MP3_DQ(511),MA_DR_MP3_DQ(1023),MA_DR_MP3_DQ(2047),MA_DR_MP3_DQ(4095),MA_DR_MP3_DQ(8191),MA_DR_MP3_DQ(16383),MA_DR_MP3_DQ(32767),MA_DR_MP3_DQ(65535),MA_DR_MP3_DQ(3),MA_DR_MP3_DQ(5),MA_DR_MP3_DQ(9)\n    };\n    int i, m;\n    for (i = 0; i < bands; i++)\n    {\n        float s = 0;\n        int ba = *pba++;\n        int mask = ba ? 4 + ((19 >> scfcod[i]) & 3) : 0;\n        for (m = 4; m; m >>= 1)\n        {\n            if (mask & m)\n            {\n                int b = ma_dr_mp3_bs_get_bits(bs, 6);\n                s = g_deq_L12[ba*3 - 6 + b % 3]*(int)(1 << 21 >> b/3);\n            }\n            *scf++ = s;\n        }\n    }\n}\nstatic void ma_dr_mp3_L12_read_scale_info(const ma_uint8 *hdr, ma_dr_mp3_bs *bs, ma_dr_mp3_L12_scale_info *sci)\n{\n    static const ma_uint8 g_bitalloc_code_tab[] = {\n        0,17, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16,\n        0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,16,\n        0,17,18, 3,19,4,5,16,\n        0,17,18,16,\n        0,17,18,19, 4,5,6, 7,8, 9,10,11,12,13,14,15,\n        0,17,18, 3,19,4,5, 6,7, 8, 9,10,11,12,13,14,\n        0, 2, 3, 4, 5,6,7, 8,9,10,11,12,13,14,15,16\n    };\n    const ma_dr_mp3_L12_subband_alloc *subband_alloc = ma_dr_mp3_L12_subband_alloc_table(hdr, sci);\n    int i, k = 0, ba_bits = 0;\n    const ma_uint8 *ba_code_tab = g_bitalloc_code_tab;\n    for (i = 0; i < sci->total_bands; i++)\n    {\n        ma_uint8 ba;\n        if (i == k)\n        {\n            k += subband_alloc->band_count;\n            ba_bits = subband_alloc->code_tab_width;\n            ba_code_tab = g_bitalloc_code_tab + subband_alloc->tab_offset;\n            subband_alloc++;\n        }\n        ba = ba_code_tab[ma_dr_mp3_bs_get_bits(bs, ba_bits)];\n        sci->bitalloc[2*i] = ba;\n        if (i < sci->stereo_bands)\n        {\n            ba = ba_code_tab[ma_dr_mp3_bs_get_bits(bs, ba_bits)];\n        }\n        sci->bitalloc[2*i + 1] = sci->stereo_bands ? ba : 0;\n    }\n    for (i = 0; i < 2*sci->total_bands; i++)\n    {\n        sci->scfcod[i] = (ma_uint8)(sci->bitalloc[i] ? MA_DR_MP3_HDR_IS_LAYER_1(hdr) ? 2 : ma_dr_mp3_bs_get_bits(bs, 2) : 6);\n    }\n    ma_dr_mp3_L12_read_scalefactors(bs, sci->bitalloc, sci->scfcod, sci->total_bands*2, sci->scf);\n    for (i = sci->stereo_bands; i < sci->total_bands; i++)\n    {\n        sci->bitalloc[2*i + 1] = 0;\n    }\n}\nstatic int ma_dr_mp3_L12_dequantize_granule(float *grbuf, ma_dr_mp3_bs *bs, ma_dr_mp3_L12_scale_info *sci, int group_size)\n{\n    int i, j, k, choff = 576;\n    for (j = 0; j < 4; j++)\n    {\n        float *dst = grbuf + group_size*j;\n        for (i = 0; i < 2*sci->total_bands; i++)\n        {\n            int ba = sci->bitalloc[i];\n            if (ba != 0)\n            {\n                if (ba < 17)\n                {\n                    int half = (1 << (ba - 1)) - 1;\n                    for (k = 0; k < group_size; k++)\n                    {\n                        dst[k] = (float)((int)ma_dr_mp3_bs_get_bits(bs, ba) - half);\n                    }\n                } else\n                {\n                    unsigned mod = (2 << (ba - 17)) + 1;\n                    unsigned code = ma_dr_mp3_bs_get_bits(bs, mod + 2 - (mod >> 3));\n                    for (k = 0; k < group_size; k++, code /= mod)\n                    {\n                        dst[k] = (float)((int)(code % mod - mod/2));\n                    }\n                }\n            }\n            dst += choff;\n            choff = 18 - choff;\n        }\n    }\n    return group_size*4;\n}\nstatic void ma_dr_mp3_L12_apply_scf_384(ma_dr_mp3_L12_scale_info *sci, const float *scf, float *dst)\n{\n    int i, k;\n    MA_DR_MP3_COPY_MEMORY(dst + 576 + sci->stereo_bands*18, dst + sci->stereo_bands*18, (sci->total_bands - sci->stereo_bands)*18*sizeof(float));\n    for (i = 0; i < sci->total_bands; i++, dst += 18, scf += 6)\n    {\n        for (k = 0; k < 12; k++)\n        {\n            dst[k + 0]   *= scf[0];\n            dst[k + 576] *= scf[3];\n        }\n    }\n}\n#endif\nstatic int ma_dr_mp3_L3_read_side_info(ma_dr_mp3_bs *bs, ma_dr_mp3_L3_gr_info *gr, const ma_uint8 *hdr)\n{\n    static const ma_uint8 g_scf_long[8][23] = {\n        { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },\n        { 12,12,12,12,12,12,16,20,24,28,32,40,48,56,64,76,90,2,2,2,2,2,0 },\n        { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },\n        { 6,6,6,6,6,6,8,10,12,14,16,18,22,26,32,38,46,54,62,70,76,36,0 },\n        { 6,6,6,6,6,6,8,10,12,14,16,20,24,28,32,38,46,52,60,68,58,54,0 },\n        { 4,4,4,4,4,4,6,6,8,8,10,12,16,20,24,28,34,42,50,54,76,158,0 },\n        { 4,4,4,4,4,4,6,6,6,8,10,12,16,18,22,28,34,40,46,54,54,192,0 },\n        { 4,4,4,4,4,4,6,6,8,10,12,16,20,24,30,38,46,56,68,84,102,26,0 }\n    };\n    static const ma_uint8 g_scf_short[8][40] = {\n        { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },\n        { 8,8,8,8,8,8,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 },\n        { 4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 },\n        { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 },\n        { 4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },\n        { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 },\n        { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 },\n        { 4,4,4,4,4,4,4,4,4,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 }\n    };\n    static const ma_uint8 g_scf_mixed[8][40] = {\n        { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },\n        { 12,12,12,4,4,4,8,8,8,12,12,12,16,16,16,20,20,20,24,24,24,28,28,28,36,36,36,2,2,2,2,2,2,2,2,2,26,26,26,0 },\n        { 6,6,6,6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,14,14,14,18,18,18,26,26,26,32,32,32,42,42,42,18,18,18,0 },\n        { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,32,32,32,44,44,44,12,12,12,0 },\n        { 6,6,6,6,6,6,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,24,24,24,30,30,30,40,40,40,18,18,18,0 },\n        { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,10,10,10,12,12,12,14,14,14,18,18,18,22,22,22,30,30,30,56,56,56,0 },\n        { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,6,6,6,10,10,10,12,12,12,14,14,14,16,16,16,20,20,20,26,26,26,66,66,66,0 },\n        { 4,4,4,4,4,4,6,6,4,4,4,6,6,6,8,8,8,12,12,12,16,16,16,20,20,20,26,26,26,34,34,34,42,42,42,12,12,12,0 }\n    };\n    unsigned tables, scfsi = 0;\n    int main_data_begin, part_23_sum = 0;\n    int gr_count = MA_DR_MP3_HDR_IS_MONO(hdr) ? 1 : 2;\n    int sr_idx = MA_DR_MP3_HDR_GET_MY_SAMPLE_RATE(hdr); sr_idx -= (sr_idx != 0);\n    if (MA_DR_MP3_HDR_TEST_MPEG1(hdr))\n    {\n        gr_count *= 2;\n        main_data_begin = ma_dr_mp3_bs_get_bits(bs, 9);\n        scfsi = ma_dr_mp3_bs_get_bits(bs, 7 + gr_count);\n    } else\n    {\n        main_data_begin = ma_dr_mp3_bs_get_bits(bs, 8 + gr_count) >> gr_count;\n    }\n    do\n    {\n        if (MA_DR_MP3_HDR_IS_MONO(hdr))\n        {\n            scfsi <<= 4;\n        }\n        gr->part_23_length = (ma_uint16)ma_dr_mp3_bs_get_bits(bs, 12);\n        part_23_sum += gr->part_23_length;\n        gr->big_values = (ma_uint16)ma_dr_mp3_bs_get_bits(bs,  9);\n        if (gr->big_values > 288)\n        {\n            return -1;\n        }\n        gr->global_gain = (ma_uint8)ma_dr_mp3_bs_get_bits(bs, 8);\n        gr->scalefac_compress = (ma_uint16)ma_dr_mp3_bs_get_bits(bs, MA_DR_MP3_HDR_TEST_MPEG1(hdr) ? 4 : 9);\n        gr->sfbtab = g_scf_long[sr_idx];\n        gr->n_long_sfb  = 22;\n        gr->n_short_sfb = 0;\n        if (ma_dr_mp3_bs_get_bits(bs, 1))\n        {\n            gr->block_type = (ma_uint8)ma_dr_mp3_bs_get_bits(bs, 2);\n            if (!gr->block_type)\n            {\n                return -1;\n            }\n            gr->mixed_block_flag = (ma_uint8)ma_dr_mp3_bs_get_bits(bs, 1);\n            gr->region_count[0] = 7;\n            gr->region_count[1] = 255;\n            if (gr->block_type == MA_DR_MP3_SHORT_BLOCK_TYPE)\n            {\n                scfsi &= 0x0F0F;\n                if (!gr->mixed_block_flag)\n                {\n                    gr->region_count[0] = 8;\n                    gr->sfbtab = g_scf_short[sr_idx];\n                    gr->n_long_sfb = 0;\n                    gr->n_short_sfb = 39;\n                } else\n                {\n                    gr->sfbtab = g_scf_mixed[sr_idx];\n                    gr->n_long_sfb = MA_DR_MP3_HDR_TEST_MPEG1(hdr) ? 8 : 6;\n                    gr->n_short_sfb = 30;\n                }\n            }\n            tables = ma_dr_mp3_bs_get_bits(bs, 10);\n            tables <<= 5;\n            gr->subblock_gain[0] = (ma_uint8)ma_dr_mp3_bs_get_bits(bs, 3);\n            gr->subblock_gain[1] = (ma_uint8)ma_dr_mp3_bs_get_bits(bs, 3);\n            gr->subblock_gain[2] = (ma_uint8)ma_dr_mp3_bs_get_bits(bs, 3);\n        } else\n        {\n            gr->block_type = 0;\n            gr->mixed_block_flag = 0;\n            tables = ma_dr_mp3_bs_get_bits(bs, 15);\n            gr->region_count[0] = (ma_uint8)ma_dr_mp3_bs_get_bits(bs, 4);\n            gr->region_count[1] = (ma_uint8)ma_dr_mp3_bs_get_bits(bs, 3);\n            gr->region_count[2] = 255;\n        }\n        gr->table_select[0] = (ma_uint8)(tables >> 10);\n        gr->table_select[1] = (ma_uint8)((tables >> 5) & 31);\n        gr->table_select[2] = (ma_uint8)((tables) & 31);\n        gr->preflag = (ma_uint8)(MA_DR_MP3_HDR_TEST_MPEG1(hdr) ? ma_dr_mp3_bs_get_bits(bs, 1) : (gr->scalefac_compress >= 500));\n        gr->scalefac_scale = (ma_uint8)ma_dr_mp3_bs_get_bits(bs, 1);\n        gr->count1_table = (ma_uint8)ma_dr_mp3_bs_get_bits(bs, 1);\n        gr->scfsi = (ma_uint8)((scfsi >> 12) & 15);\n        scfsi <<= 4;\n        gr++;\n    } while(--gr_count);\n    if (part_23_sum + bs->pos > bs->limit + main_data_begin*8)\n    {\n        return -1;\n    }\n    return main_data_begin;\n}\nstatic void ma_dr_mp3_L3_read_scalefactors(ma_uint8 *scf, ma_uint8 *ist_pos, const ma_uint8 *scf_size, const ma_uint8 *scf_count, ma_dr_mp3_bs *bitbuf, int scfsi)\n{\n    int i, k;\n    for (i = 0; i < 4 && scf_count[i]; i++, scfsi *= 2)\n    {\n        int cnt = scf_count[i];\n        if (scfsi & 8)\n        {\n            MA_DR_MP3_COPY_MEMORY(scf, ist_pos, cnt);\n        } else\n        {\n            int bits = scf_size[i];\n            if (!bits)\n            {\n                MA_DR_MP3_ZERO_MEMORY(scf, cnt);\n                MA_DR_MP3_ZERO_MEMORY(ist_pos, cnt);\n            } else\n            {\n                int max_scf = (scfsi < 0) ? (1 << bits) - 1 : -1;\n                for (k = 0; k < cnt; k++)\n                {\n                    int s = ma_dr_mp3_bs_get_bits(bitbuf, bits);\n                    ist_pos[k] = (ma_uint8)(s == max_scf ? -1 : s);\n                    scf[k] = (ma_uint8)s;\n                }\n            }\n        }\n        ist_pos += cnt;\n        scf += cnt;\n    }\n    scf[0] = scf[1] = scf[2] = 0;\n}\nstatic float ma_dr_mp3_L3_ldexp_q2(float y, int exp_q2)\n{\n    static const float g_expfrac[4] = { 9.31322575e-10f,7.83145814e-10f,6.58544508e-10f,5.53767716e-10f };\n    int e;\n    do\n    {\n        e = MA_DR_MP3_MIN(30*4, exp_q2);\n        y *= g_expfrac[e & 3]*(1 << 30 >> (e >> 2));\n    } while ((exp_q2 -= e) > 0);\n    return y;\n}\nstatic void ma_dr_mp3_L3_decode_scalefactors(const ma_uint8 *hdr, ma_uint8 *ist_pos, ma_dr_mp3_bs *bs, const ma_dr_mp3_L3_gr_info *gr, float *scf, int ch)\n{\n    static const ma_uint8 g_scf_partitions[3][28] = {\n        { 6,5,5, 5,6,5,5,5,6,5, 7,3,11,10,0,0, 7, 7, 7,0, 6, 6,6,3, 8, 8,5,0 },\n        { 8,9,6,12,6,9,9,9,6,9,12,6,15,18,0,0, 6,15,12,0, 6,12,9,6, 6,18,9,0 },\n        { 9,9,6,12,9,9,9,9,9,9,12,6,18,18,0,0,12,12,12,0,12, 9,9,6,15,12,9,0 }\n    };\n    const ma_uint8 *scf_partition = g_scf_partitions[!!gr->n_short_sfb + !gr->n_long_sfb];\n    ma_uint8 scf_size[4], iscf[40];\n    int i, scf_shift = gr->scalefac_scale + 1, gain_exp, scfsi = gr->scfsi;\n    float gain;\n    if (MA_DR_MP3_HDR_TEST_MPEG1(hdr))\n    {\n        static const ma_uint8 g_scfc_decode[16] = { 0,1,2,3, 12,5,6,7, 9,10,11,13, 14,15,18,19 };\n        int part = g_scfc_decode[gr->scalefac_compress];\n        scf_size[1] = scf_size[0] = (ma_uint8)(part >> 2);\n        scf_size[3] = scf_size[2] = (ma_uint8)(part & 3);\n    } else\n    {\n        static const ma_uint8 g_mod[6*4] = { 5,5,4,4,5,5,4,1,4,3,1,1,5,6,6,1,4,4,4,1,4,3,1,1 };\n        int k, modprod, sfc, ist = MA_DR_MP3_HDR_TEST_I_STEREO(hdr) && ch;\n        sfc = gr->scalefac_compress >> ist;\n        for (k = ist*3*4; sfc >= 0; sfc -= modprod, k += 4)\n        {\n            for (modprod = 1, i = 3; i >= 0; i--)\n            {\n                scf_size[i] = (ma_uint8)(sfc / modprod % g_mod[k + i]);\n                modprod *= g_mod[k + i];\n            }\n        }\n        scf_partition += k;\n        scfsi = -16;\n    }\n    ma_dr_mp3_L3_read_scalefactors(iscf, ist_pos, scf_size, scf_partition, bs, scfsi);\n    if (gr->n_short_sfb)\n    {\n        int sh = 3 - scf_shift;\n        for (i = 0; i < gr->n_short_sfb; i += 3)\n        {\n            iscf[gr->n_long_sfb + i + 0] = (ma_uint8)(iscf[gr->n_long_sfb + i + 0] + (gr->subblock_gain[0] << sh));\n            iscf[gr->n_long_sfb + i + 1] = (ma_uint8)(iscf[gr->n_long_sfb + i + 1] + (gr->subblock_gain[1] << sh));\n            iscf[gr->n_long_sfb + i + 2] = (ma_uint8)(iscf[gr->n_long_sfb + i + 2] + (gr->subblock_gain[2] << sh));\n        }\n    } else if (gr->preflag)\n    {\n        static const ma_uint8 g_preamp[10] = { 1,1,1,1,2,2,3,3,3,2 };\n        for (i = 0; i < 10; i++)\n        {\n            iscf[11 + i] = (ma_uint8)(iscf[11 + i] + g_preamp[i]);\n        }\n    }\n    gain_exp = gr->global_gain + MA_DR_MP3_BITS_DEQUANTIZER_OUT*4 - 210 - (MA_DR_MP3_HDR_IS_MS_STEREO(hdr) ? 2 : 0);\n    gain = ma_dr_mp3_L3_ldexp_q2(1 << (MA_DR_MP3_MAX_SCFI/4),  MA_DR_MP3_MAX_SCFI - gain_exp);\n    for (i = 0; i < (int)(gr->n_long_sfb + gr->n_short_sfb); i++)\n    {\n        scf[i] = ma_dr_mp3_L3_ldexp_q2(gain, iscf[i] << scf_shift);\n    }\n}\nstatic const float g_ma_dr_mp3_pow43[129 + 16] = {\n    0,-1,-2.519842f,-4.326749f,-6.349604f,-8.549880f,-10.902724f,-13.390518f,-16.000000f,-18.720754f,-21.544347f,-24.463781f,-27.473142f,-30.567351f,-33.741992f,-36.993181f,\n    0,1,2.519842f,4.326749f,6.349604f,8.549880f,10.902724f,13.390518f,16.000000f,18.720754f,21.544347f,24.463781f,27.473142f,30.567351f,33.741992f,36.993181f,40.317474f,43.711787f,47.173345f,50.699631f,54.288352f,57.937408f,61.644865f,65.408941f,69.227979f,73.100443f,77.024898f,81.000000f,85.024491f,89.097188f,93.216975f,97.382800f,101.593667f,105.848633f,110.146801f,114.487321f,118.869381f,123.292209f,127.755065f,132.257246f,136.798076f,141.376907f,145.993119f,150.646117f,155.335327f,160.060199f,164.820202f,169.614826f,174.443577f,179.305980f,184.201575f,189.129918f,194.090580f,199.083145f,204.107210f,209.162385f,214.248292f,219.364564f,224.510845f,229.686789f,234.892058f,240.126328f,245.389280f,250.680604f,256.000000f,261.347174f,266.721841f,272.123723f,277.552547f,283.008049f,288.489971f,293.998060f,299.532071f,305.091761f,310.676898f,316.287249f,321.922592f,327.582707f,333.267377f,338.976394f,344.709550f,350.466646f,356.247482f,362.051866f,367.879608f,373.730522f,379.604427f,385.501143f,391.420496f,397.362314f,403.326427f,409.312672f,415.320884f,421.350905f,427.402579f,433.475750f,439.570269f,445.685987f,451.822757f,457.980436f,464.158883f,470.357960f,476.577530f,482.817459f,489.077615f,495.357868f,501.658090f,507.978156f,514.317941f,520.677324f,527.056184f,533.454404f,539.871867f,546.308458f,552.764065f,559.238575f,565.731879f,572.243870f,578.774440f,585.323483f,591.890898f,598.476581f,605.080431f,611.702349f,618.342238f,625.000000f,631.675540f,638.368763f,645.079578f\n};\nstatic float ma_dr_mp3_L3_pow_43(int x)\n{\n    float frac;\n    int sign, mult = 256;\n    if (x < 129)\n    {\n        return g_ma_dr_mp3_pow43[16 + x];\n    }\n    if (x < 1024)\n    {\n        mult = 16;\n        x <<= 3;\n    }\n    sign = 2*x & 64;\n    frac = (float)((x & 63) - sign) / ((x & ~63) + sign);\n    return g_ma_dr_mp3_pow43[16 + ((x + sign) >> 6)]*(1.f + frac*((4.f/3) + frac*(2.f/9)))*mult;\n}\nstatic void ma_dr_mp3_L3_huffman(float *dst, ma_dr_mp3_bs *bs, const ma_dr_mp3_L3_gr_info *gr_info, const float *scf, int layer3gr_limit)\n{\n    static const ma_int16 tabs[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n        785,785,785,785,784,784,784,784,513,513,513,513,513,513,513,513,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,\n        -255,1313,1298,1282,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,290,288,\n        -255,1313,1298,1282,769,769,769,769,529,529,529,529,529,529,529,529,528,528,528,528,528,528,528,528,512,512,512,512,512,512,512,512,290,288,\n        -253,-318,-351,-367,785,785,785,785,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,819,818,547,547,275,275,275,275,561,560,515,546,289,274,288,258,\n        -254,-287,1329,1299,1314,1312,1057,1057,1042,1042,1026,1026,784,784,784,784,529,529,529,529,529,529,529,529,769,769,769,769,768,768,768,768,563,560,306,306,291,259,\n        -252,-413,-477,-542,1298,-575,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-383,-399,1107,1092,1106,1061,849,849,789,789,1104,1091,773,773,1076,1075,341,340,325,309,834,804,577,577,532,532,516,516,832,818,803,816,561,561,531,531,515,546,289,289,288,258,\n        -252,-429,-493,-559,1057,1057,1042,1042,529,529,529,529,529,529,529,529,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,-382,1077,-415,1106,1061,1104,849,849,789,789,1091,1076,1029,1075,834,834,597,581,340,340,339,324,804,833,532,532,832,772,818,803,817,787,816,771,290,290,290,290,288,258,\n        -253,-349,-414,-447,-463,1329,1299,-479,1314,1312,1057,1057,1042,1042,1026,1026,785,785,785,785,784,784,784,784,769,769,769,769,768,768,768,768,-319,851,821,-335,836,850,805,849,341,340,325,336,533,533,579,579,564,564,773,832,578,548,563,516,321,276,306,291,304,259,\n        -251,-572,-733,-830,-863,-879,1041,1041,784,784,784,784,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,1396,1351,1381,1366,1395,1335,1380,-559,1334,1138,1138,1063,1063,1350,1392,1031,1031,1062,1062,1364,1363,1120,1120,1333,1348,881,881,881,881,375,374,359,373,343,358,341,325,791,791,1123,1122,-703,1105,1045,-719,865,865,790,790,774,774,1104,1029,338,293,323,308,-799,-815,833,788,772,818,803,816,322,292,307,320,561,531,515,546,289,274,288,258,\n        -251,-525,-605,-685,-765,-831,-846,1298,1057,1057,1312,1282,785,785,785,785,784,784,784,784,769,769,769,769,512,512,512,512,512,512,512,512,1399,1398,1383,1367,1382,1396,1351,-511,1381,1366,1139,1139,1079,1079,1124,1124,1364,1349,1363,1333,882,882,882,882,807,807,807,807,1094,1094,1136,1136,373,341,535,535,881,775,867,822,774,-591,324,338,-671,849,550,550,866,864,609,609,293,336,534,534,789,835,773,-751,834,804,308,307,833,788,832,772,562,562,547,547,305,275,560,515,290,290,\n        -252,-397,-477,-557,-622,-653,-719,-735,-750,1329,1299,1314,1057,1057,1042,1042,1312,1282,1024,1024,785,785,785,785,784,784,784,784,769,769,769,769,-383,1127,1141,1111,1126,1140,1095,1110,869,869,883,883,1079,1109,882,882,375,374,807,868,838,881,791,-463,867,822,368,263,852,837,836,-543,610,610,550,550,352,336,534,534,865,774,851,821,850,805,593,533,579,564,773,832,578,578,548,548,577,577,307,276,306,291,516,560,259,259,\n        -250,-2107,-2507,-2764,-2909,-2974,-3007,-3023,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-767,-1052,-1213,-1277,-1358,-1405,-1469,-1535,-1550,-1582,-1614,-1647,-1662,-1694,-1726,-1759,-1774,-1807,-1822,-1854,-1886,1565,-1919,-1935,-1951,-1967,1731,1730,1580,1717,-1983,1729,1564,-1999,1548,-2015,-2031,1715,1595,-2047,1714,-2063,1610,-2079,1609,-2095,1323,1323,1457,1457,1307,1307,1712,1547,1641,1700,1699,1594,1685,1625,1442,1442,1322,1322,-780,-973,-910,1279,1278,1277,1262,1276,1261,1275,1215,1260,1229,-959,974,974,989,989,-943,735,478,478,495,463,506,414,-1039,1003,958,1017,927,942,987,957,431,476,1272,1167,1228,-1183,1256,-1199,895,895,941,941,1242,1227,1212,1135,1014,1014,490,489,503,487,910,1013,985,925,863,894,970,955,1012,847,-1343,831,755,755,984,909,428,366,754,559,-1391,752,486,457,924,997,698,698,983,893,740,740,908,877,739,739,667,667,953,938,497,287,271,271,683,606,590,712,726,574,302,302,738,736,481,286,526,725,605,711,636,724,696,651,589,681,666,710,364,467,573,695,466,466,301,465,379,379,709,604,665,679,316,316,634,633,436,436,464,269,424,394,452,332,438,363,347,408,393,448,331,422,362,407,392,421,346,406,391,376,375,359,1441,1306,-2367,1290,-2383,1337,-2399,-2415,1426,1321,-2431,1411,1336,-2447,-2463,-2479,1169,1169,1049,1049,1424,1289,1412,1352,1319,-2495,1154,1154,1064,1064,1153,1153,416,390,360,404,403,389,344,374,373,343,358,372,327,357,342,311,356,326,1395,1394,1137,1137,1047,1047,1365,1392,1287,1379,1334,1364,1349,1378,1318,1363,792,792,792,792,1152,1152,1032,1032,1121,1121,1046,1046,1120,1120,1030,1030,-2895,1106,1061,1104,849,849,789,789,1091,1076,1029,1090,1060,1075,833,833,309,324,532,532,832,772,818,803,561,561,531,560,515,546,289,274,288,258,\n        -250,-1179,-1579,-1836,-1996,-2124,-2253,-2333,-2413,-2477,-2542,-2574,-2607,-2622,-2655,1314,1313,1298,1312,1282,785,785,785,785,1040,1040,1025,1025,768,768,768,768,-766,-798,-830,-862,-895,-911,-927,-943,-959,-975,-991,-1007,-1023,-1039,-1055,-1070,1724,1647,-1103,-1119,1631,1767,1662,1738,1708,1723,-1135,1780,1615,1779,1599,1677,1646,1778,1583,-1151,1777,1567,1737,1692,1765,1722,1707,1630,1751,1661,1764,1614,1736,1676,1763,1750,1645,1598,1721,1691,1762,1706,1582,1761,1566,-1167,1749,1629,767,766,751,765,494,494,735,764,719,749,734,763,447,447,748,718,477,506,431,491,446,476,461,505,415,430,475,445,504,399,460,489,414,503,383,474,429,459,502,502,746,752,488,398,501,473,413,472,486,271,480,270,-1439,-1455,1357,-1471,-1487,-1503,1341,1325,-1519,1489,1463,1403,1309,-1535,1372,1448,1418,1476,1356,1462,1387,-1551,1475,1340,1447,1402,1386,-1567,1068,1068,1474,1461,455,380,468,440,395,425,410,454,364,467,466,464,453,269,409,448,268,432,1371,1473,1432,1417,1308,1460,1355,1446,1459,1431,1083,1083,1401,1416,1458,1445,1067,1067,1370,1457,1051,1051,1291,1430,1385,1444,1354,1415,1400,1443,1082,1082,1173,1113,1186,1066,1185,1050,-1967,1158,1128,1172,1097,1171,1081,-1983,1157,1112,416,266,375,400,1170,1142,1127,1065,793,793,1169,1033,1156,1096,1141,1111,1155,1080,1126,1140,898,898,808,808,897,897,792,792,1095,1152,1032,1125,1110,1139,1079,1124,882,807,838,881,853,791,-2319,867,368,263,822,852,837,866,806,865,-2399,851,352,262,534,534,821,836,594,594,549,549,593,593,533,533,848,773,579,579,564,578,548,563,276,276,577,576,306,291,516,560,305,305,275,259,\n        -251,-892,-2058,-2620,-2828,-2957,-3023,-3039,1041,1041,1040,1040,769,769,769,769,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,256,-511,-527,-543,-559,1530,-575,-591,1528,1527,1407,1526,1391,1023,1023,1023,1023,1525,1375,1268,1268,1103,1103,1087,1087,1039,1039,1523,-604,815,815,815,815,510,495,509,479,508,463,507,447,431,505,415,399,-734,-782,1262,-815,1259,1244,-831,1258,1228,-847,-863,1196,-879,1253,987,987,748,-767,493,493,462,477,414,414,686,669,478,446,461,445,474,429,487,458,412,471,1266,1264,1009,1009,799,799,-1019,-1276,-1452,-1581,-1677,-1757,-1821,-1886,-1933,-1997,1257,1257,1483,1468,1512,1422,1497,1406,1467,1496,1421,1510,1134,1134,1225,1225,1466,1451,1374,1405,1252,1252,1358,1480,1164,1164,1251,1251,1238,1238,1389,1465,-1407,1054,1101,-1423,1207,-1439,830,830,1248,1038,1237,1117,1223,1148,1236,1208,411,426,395,410,379,269,1193,1222,1132,1235,1221,1116,976,976,1192,1162,1177,1220,1131,1191,963,963,-1647,961,780,-1663,558,558,994,993,437,408,393,407,829,978,813,797,947,-1743,721,721,377,392,844,950,828,890,706,706,812,859,796,960,948,843,934,874,571,571,-1919,690,555,689,421,346,539,539,944,779,918,873,932,842,903,888,570,570,931,917,674,674,-2575,1562,-2591,1609,-2607,1654,1322,1322,1441,1441,1696,1546,1683,1593,1669,1624,1426,1426,1321,1321,1639,1680,1425,1425,1305,1305,1545,1668,1608,1623,1667,1592,1638,1666,1320,1320,1652,1607,1409,1409,1304,1304,1288,1288,1664,1637,1395,1395,1335,1335,1622,1636,1394,1394,1319,1319,1606,1621,1392,1392,1137,1137,1137,1137,345,390,360,375,404,373,1047,-2751,-2767,-2783,1062,1121,1046,-2799,1077,-2815,1106,1061,789,789,1105,1104,263,355,310,340,325,354,352,262,339,324,1091,1076,1029,1090,1060,1075,833,833,788,788,1088,1028,818,818,803,803,561,561,531,531,816,771,546,546,289,274,288,258,\n        -253,-317,-381,-446,-478,-509,1279,1279,-811,-1179,-1451,-1756,-1900,-2028,-2189,-2253,-2333,-2414,-2445,-2511,-2526,1313,1298,-2559,1041,1041,1040,1040,1025,1025,1024,1024,1022,1007,1021,991,1020,975,1019,959,687,687,1018,1017,671,671,655,655,1016,1015,639,639,758,758,623,623,757,607,756,591,755,575,754,559,543,543,1009,783,-575,-621,-685,-749,496,-590,750,749,734,748,974,989,1003,958,988,973,1002,942,987,957,972,1001,926,986,941,971,956,1000,910,985,925,999,894,970,-1071,-1087,-1102,1390,-1135,1436,1509,1451,1374,-1151,1405,1358,1480,1420,-1167,1507,1494,1389,1342,1465,1435,1450,1326,1505,1310,1493,1373,1479,1404,1492,1464,1419,428,443,472,397,736,526,464,464,486,457,442,471,484,482,1357,1449,1434,1478,1388,1491,1341,1490,1325,1489,1463,1403,1309,1477,1372,1448,1418,1433,1476,1356,1462,1387,-1439,1475,1340,1447,1402,1474,1324,1461,1371,1473,269,448,1432,1417,1308,1460,-1711,1459,-1727,1441,1099,1099,1446,1386,1431,1401,-1743,1289,1083,1083,1160,1160,1458,1445,1067,1067,1370,1457,1307,1430,1129,1129,1098,1098,268,432,267,416,266,400,-1887,1144,1187,1082,1173,1113,1186,1066,1050,1158,1128,1143,1172,1097,1171,1081,420,391,1157,1112,1170,1142,1127,1065,1169,1049,1156,1096,1141,1111,1155,1080,1126,1154,1064,1153,1140,1095,1048,-2159,1125,1110,1137,-2175,823,823,1139,1138,807,807,384,264,368,263,868,838,853,791,867,822,852,837,866,806,865,790,-2319,851,821,836,352,262,850,805,849,-2399,533,533,835,820,336,261,578,548,563,577,532,532,832,772,562,562,547,547,305,275,560,515,290,290,288,258 };\n    static const ma_uint8 tab32[] = { 130,162,193,209,44,28,76,140,9,9,9,9,9,9,9,9,190,254,222,238,126,94,157,157,109,61,173,205};\n    static const ma_uint8 tab33[] = { 252,236,220,204,188,172,156,140,124,108,92,76,60,44,28,12 };\n    static const ma_int16 tabindex[2*16] = { 0,32,64,98,0,132,180,218,292,364,426,538,648,746,0,1126,1460,1460,1460,1460,1460,1460,1460,1460,1842,1842,1842,1842,1842,1842,1842,1842 };\n    static const ma_uint8 g_linbits[] =  { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,6,8,10,13,4,5,6,7,8,9,11,13 };\n#define MA_DR_MP3_PEEK_BITS(n)    (bs_cache >> (32 - (n)))\n#define MA_DR_MP3_FLUSH_BITS(n)   { bs_cache <<= (n); bs_sh += (n); }\n#define MA_DR_MP3_CHECK_BITS      while (bs_sh >= 0) { bs_cache |= (ma_uint32)*bs_next_ptr++ << bs_sh; bs_sh -= 8; }\n#define MA_DR_MP3_BSPOS           ((bs_next_ptr - bs->buf)*8 - 24 + bs_sh)\n    float one = 0.0f;\n    int ireg = 0, big_val_cnt = gr_info->big_values;\n    const ma_uint8 *sfb = gr_info->sfbtab;\n    const ma_uint8 *bs_next_ptr = bs->buf + bs->pos/8;\n    ma_uint32 bs_cache = (((bs_next_ptr[0]*256u + bs_next_ptr[1])*256u + bs_next_ptr[2])*256u + bs_next_ptr[3]) << (bs->pos & 7);\n    int pairs_to_decode, np, bs_sh = (bs->pos & 7) - 8;\n    bs_next_ptr += 4;\n    while (big_val_cnt > 0)\n    {\n        int tab_num = gr_info->table_select[ireg];\n        int sfb_cnt = gr_info->region_count[ireg++];\n        const ma_int16 *codebook = tabs + tabindex[tab_num];\n        int linbits = g_linbits[tab_num];\n        if (linbits)\n        {\n            do\n            {\n                np = *sfb++ / 2;\n                pairs_to_decode = MA_DR_MP3_MIN(big_val_cnt, np);\n                one = *scf++;\n                do\n                {\n                    int j, w = 5;\n                    int leaf = codebook[MA_DR_MP3_PEEK_BITS(w)];\n                    while (leaf < 0)\n                    {\n                        MA_DR_MP3_FLUSH_BITS(w);\n                        w = leaf & 7;\n                        leaf = codebook[MA_DR_MP3_PEEK_BITS(w) - (leaf >> 3)];\n                    }\n                    MA_DR_MP3_FLUSH_BITS(leaf >> 8);\n                    for (j = 0; j < 2; j++, dst++, leaf >>= 4)\n                    {\n                        int lsb = leaf & 0x0F;\n                        if (lsb == 15)\n                        {\n                            lsb += MA_DR_MP3_PEEK_BITS(linbits);\n                            MA_DR_MP3_FLUSH_BITS(linbits);\n                            MA_DR_MP3_CHECK_BITS;\n                            *dst = one*ma_dr_mp3_L3_pow_43(lsb)*((ma_int32)bs_cache < 0 ? -1: 1);\n                        } else\n                        {\n                            *dst = g_ma_dr_mp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;\n                        }\n                        MA_DR_MP3_FLUSH_BITS(lsb ? 1 : 0);\n                    }\n                    MA_DR_MP3_CHECK_BITS;\n                } while (--pairs_to_decode);\n            } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);\n        } else\n        {\n            do\n            {\n                np = *sfb++ / 2;\n                pairs_to_decode = MA_DR_MP3_MIN(big_val_cnt, np);\n                one = *scf++;\n                do\n                {\n                    int j, w = 5;\n                    int leaf = codebook[MA_DR_MP3_PEEK_BITS(w)];\n                    while (leaf < 0)\n                    {\n                        MA_DR_MP3_FLUSH_BITS(w);\n                        w = leaf & 7;\n                        leaf = codebook[MA_DR_MP3_PEEK_BITS(w) - (leaf >> 3)];\n                    }\n                    MA_DR_MP3_FLUSH_BITS(leaf >> 8);\n                    for (j = 0; j < 2; j++, dst++, leaf >>= 4)\n                    {\n                        int lsb = leaf & 0x0F;\n                        *dst = g_ma_dr_mp3_pow43[16 + lsb - 16*(bs_cache >> 31)]*one;\n                        MA_DR_MP3_FLUSH_BITS(lsb ? 1 : 0);\n                    }\n                    MA_DR_MP3_CHECK_BITS;\n                } while (--pairs_to_decode);\n            } while ((big_val_cnt -= np) > 0 && --sfb_cnt >= 0);\n        }\n    }\n    for (np = 1 - big_val_cnt;; dst += 4)\n    {\n        const ma_uint8 *codebook_count1 = (gr_info->count1_table) ? tab33 : tab32;\n        int leaf = codebook_count1[MA_DR_MP3_PEEK_BITS(4)];\n        if (!(leaf & 8))\n        {\n            leaf = codebook_count1[(leaf >> 3) + (bs_cache << 4 >> (32 - (leaf & 3)))];\n        }\n        MA_DR_MP3_FLUSH_BITS(leaf & 7);\n        if (MA_DR_MP3_BSPOS > layer3gr_limit)\n        {\n            break;\n        }\n#define MA_DR_MP3_RELOAD_SCALEFACTOR  if (!--np) { np = *sfb++/2; if (!np) break; one = *scf++; }\n#define MA_DR_MP3_DEQ_COUNT1(s) if (leaf & (128 >> s)) { dst[s] = ((ma_int32)bs_cache < 0) ? -one : one; MA_DR_MP3_FLUSH_BITS(1) }\n        MA_DR_MP3_RELOAD_SCALEFACTOR;\n        MA_DR_MP3_DEQ_COUNT1(0);\n        MA_DR_MP3_DEQ_COUNT1(1);\n        MA_DR_MP3_RELOAD_SCALEFACTOR;\n        MA_DR_MP3_DEQ_COUNT1(2);\n        MA_DR_MP3_DEQ_COUNT1(3);\n        MA_DR_MP3_CHECK_BITS;\n    }\n    bs->pos = layer3gr_limit;\n}\nstatic void ma_dr_mp3_L3_midside_stereo(float *left, int n)\n{\n    int i = 0;\n    float *right = left + 576;\n#if MA_DR_MP3_HAVE_SIMD\n    if (ma_dr_mp3_have_simd())\n    {\n        for (; i < n - 3; i += 4)\n        {\n            ma_dr_mp3_f4 vl = MA_DR_MP3_VLD(left + i);\n            ma_dr_mp3_f4 vr = MA_DR_MP3_VLD(right + i);\n            MA_DR_MP3_VSTORE(left + i, MA_DR_MP3_VADD(vl, vr));\n            MA_DR_MP3_VSTORE(right + i, MA_DR_MP3_VSUB(vl, vr));\n        }\n#ifdef __GNUC__\n        if (__builtin_constant_p(n % 4 == 0) && n % 4 == 0)\n            return;\n#endif\n    }\n#endif\n    for (; i < n; i++)\n    {\n        float a = left[i];\n        float b = right[i];\n        left[i] = a + b;\n        right[i] = a - b;\n    }\n}\nstatic void ma_dr_mp3_L3_intensity_stereo_band(float *left, int n, float kl, float kr)\n{\n    int i;\n    for (i = 0; i < n; i++)\n    {\n        left[i + 576] = left[i]*kr;\n        left[i] = left[i]*kl;\n    }\n}\nstatic void ma_dr_mp3_L3_stereo_top_band(const float *right, const ma_uint8 *sfb, int nbands, int max_band[3])\n{\n    int i, k;\n    max_band[0] = max_band[1] = max_band[2] = -1;\n    for (i = 0; i < nbands; i++)\n    {\n        for (k = 0; k < sfb[i]; k += 2)\n        {\n            if (right[k] != 0 || right[k + 1] != 0)\n            {\n                max_band[i % 3] = i;\n                break;\n            }\n        }\n        right += sfb[i];\n    }\n}\nstatic void ma_dr_mp3_L3_stereo_process(float *left, const ma_uint8 *ist_pos, const ma_uint8 *sfb, const ma_uint8 *hdr, int max_band[3], int mpeg2_sh)\n{\n    static const float g_pan[7*2] = { 0,1,0.21132487f,0.78867513f,0.36602540f,0.63397460f,0.5f,0.5f,0.63397460f,0.36602540f,0.78867513f,0.21132487f,1,0 };\n    unsigned i, max_pos = MA_DR_MP3_HDR_TEST_MPEG1(hdr) ? 7 : 64;\n    for (i = 0; sfb[i]; i++)\n    {\n        unsigned ipos = ist_pos[i];\n        if ((int)i > max_band[i % 3] && ipos < max_pos)\n        {\n            float kl, kr, s = MA_DR_MP3_HDR_TEST_MS_STEREO(hdr) ? 1.41421356f : 1;\n            if (MA_DR_MP3_HDR_TEST_MPEG1(hdr))\n            {\n                kl = g_pan[2*ipos];\n                kr = g_pan[2*ipos + 1];\n            } else\n            {\n                kl = 1;\n                kr = ma_dr_mp3_L3_ldexp_q2(1, (ipos + 1) >> 1 << mpeg2_sh);\n                if (ipos & 1)\n                {\n                    kl = kr;\n                    kr = 1;\n                }\n            }\n            ma_dr_mp3_L3_intensity_stereo_band(left, sfb[i], kl*s, kr*s);\n        } else if (MA_DR_MP3_HDR_TEST_MS_STEREO(hdr))\n        {\n            ma_dr_mp3_L3_midside_stereo(left, sfb[i]);\n        }\n        left += sfb[i];\n    }\n}\nstatic void ma_dr_mp3_L3_intensity_stereo(float *left, ma_uint8 *ist_pos, const ma_dr_mp3_L3_gr_info *gr, const ma_uint8 *hdr)\n{\n    int max_band[3], n_sfb = gr->n_long_sfb + gr->n_short_sfb;\n    int i, max_blocks = gr->n_short_sfb ? 3 : 1;\n    ma_dr_mp3_L3_stereo_top_band(left + 576, gr->sfbtab, n_sfb, max_band);\n    if (gr->n_long_sfb)\n    {\n        max_band[0] = max_band[1] = max_band[2] = MA_DR_MP3_MAX(MA_DR_MP3_MAX(max_band[0], max_band[1]), max_band[2]);\n    }\n    for (i = 0; i < max_blocks; i++)\n    {\n        int default_pos = MA_DR_MP3_HDR_TEST_MPEG1(hdr) ? 3 : 0;\n        int itop = n_sfb - max_blocks + i;\n        int prev = itop - max_blocks;\n        ist_pos[itop] = (ma_uint8)(max_band[i] >= prev ? default_pos : ist_pos[prev]);\n    }\n    ma_dr_mp3_L3_stereo_process(left, ist_pos, gr->sfbtab, hdr, max_band, gr[1].scalefac_compress & 1);\n}\nstatic void ma_dr_mp3_L3_reorder(float *grbuf, float *scratch, const ma_uint8 *sfb)\n{\n    int i, len;\n    float *src = grbuf, *dst = scratch;\n    for (;0 != (len = *sfb); sfb += 3, src += 2*len)\n    {\n        for (i = 0; i < len; i++, src++)\n        {\n            *dst++ = src[0*len];\n            *dst++ = src[1*len];\n            *dst++ = src[2*len];\n        }\n    }\n    MA_DR_MP3_COPY_MEMORY(grbuf, scratch, (dst - scratch)*sizeof(float));\n}\nstatic void ma_dr_mp3_L3_antialias(float *grbuf, int nbands)\n{\n    static const float g_aa[2][8] = {\n        {0.85749293f,0.88174200f,0.94962865f,0.98331459f,0.99551782f,0.99916056f,0.99989920f,0.99999316f},\n        {0.51449576f,0.47173197f,0.31337745f,0.18191320f,0.09457419f,0.04096558f,0.01419856f,0.00369997f}\n    };\n    for (; nbands > 0; nbands--, grbuf += 18)\n    {\n        int i = 0;\n#if MA_DR_MP3_HAVE_SIMD\n        if (ma_dr_mp3_have_simd()) for (; i < 8; i += 4)\n        {\n            ma_dr_mp3_f4 vu = MA_DR_MP3_VLD(grbuf + 18 + i);\n            ma_dr_mp3_f4 vd = MA_DR_MP3_VLD(grbuf + 14 - i);\n            ma_dr_mp3_f4 vc0 = MA_DR_MP3_VLD(g_aa[0] + i);\n            ma_dr_mp3_f4 vc1 = MA_DR_MP3_VLD(g_aa[1] + i);\n            vd = MA_DR_MP3_VREV(vd);\n            MA_DR_MP3_VSTORE(grbuf + 18 + i, MA_DR_MP3_VSUB(MA_DR_MP3_VMUL(vu, vc0), MA_DR_MP3_VMUL(vd, vc1)));\n            vd = MA_DR_MP3_VADD(MA_DR_MP3_VMUL(vu, vc1), MA_DR_MP3_VMUL(vd, vc0));\n            MA_DR_MP3_VSTORE(grbuf + 14 - i, MA_DR_MP3_VREV(vd));\n        }\n#endif\n#ifndef MA_DR_MP3_ONLY_SIMD\n        for(; i < 8; i++)\n        {\n            float u = grbuf[18 + i];\n            float d = grbuf[17 - i];\n            grbuf[18 + i] = u*g_aa[0][i] - d*g_aa[1][i];\n            grbuf[17 - i] = u*g_aa[1][i] + d*g_aa[0][i];\n        }\n#endif\n    }\n}\nstatic void ma_dr_mp3_L3_dct3_9(float *y)\n{\n    float s0, s1, s2, s3, s4, s5, s6, s7, s8, t0, t2, t4;\n    s0 = y[0]; s2 = y[2]; s4 = y[4]; s6 = y[6]; s8 = y[8];\n    t0 = s0 + s6*0.5f;\n    s0 -= s6;\n    t4 = (s4 + s2)*0.93969262f;\n    t2 = (s8 + s2)*0.76604444f;\n    s6 = (s4 - s8)*0.17364818f;\n    s4 += s8 - s2;\n    s2 = s0 - s4*0.5f;\n    y[4] = s4 + s0;\n    s8 = t0 - t2 + s6;\n    s0 = t0 - t4 + t2;\n    s4 = t0 + t4 - s6;\n    s1 = y[1]; s3 = y[3]; s5 = y[5]; s7 = y[7];\n    s3 *= 0.86602540f;\n    t0 = (s5 + s1)*0.98480775f;\n    t4 = (s5 - s7)*0.34202014f;\n    t2 = (s1 + s7)*0.64278761f;\n    s1 = (s1 - s5 - s7)*0.86602540f;\n    s5 = t0 - s3 - t2;\n    s7 = t4 - s3 - t0;\n    s3 = t4 + s3 - t2;\n    y[0] = s4 - s7;\n    y[1] = s2 + s1;\n    y[2] = s0 - s3;\n    y[3] = s8 + s5;\n    y[5] = s8 - s5;\n    y[6] = s0 + s3;\n    y[7] = s2 - s1;\n    y[8] = s4 + s7;\n}\nstatic void ma_dr_mp3_L3_imdct36(float *grbuf, float *overlap, const float *window, int nbands)\n{\n    int i, j;\n    static const float g_twid9[18] = {\n        0.73727734f,0.79335334f,0.84339145f,0.88701083f,0.92387953f,0.95371695f,0.97629601f,0.99144486f,0.99904822f,0.67559021f,0.60876143f,0.53729961f,0.46174861f,0.38268343f,0.30070580f,0.21643961f,0.13052619f,0.04361938f\n    };\n    for (j = 0; j < nbands; j++, grbuf += 18, overlap += 9)\n    {\n        float co[9], si[9];\n        co[0] = -grbuf[0];\n        si[0] = grbuf[17];\n        for (i = 0; i < 4; i++)\n        {\n            si[8 - 2*i] =   grbuf[4*i + 1] - grbuf[4*i + 2];\n            co[1 + 2*i] =   grbuf[4*i + 1] + grbuf[4*i + 2];\n            si[7 - 2*i] =   grbuf[4*i + 4] - grbuf[4*i + 3];\n            co[2 + 2*i] = -(grbuf[4*i + 3] + grbuf[4*i + 4]);\n        }\n        ma_dr_mp3_L3_dct3_9(co);\n        ma_dr_mp3_L3_dct3_9(si);\n        si[1] = -si[1];\n        si[3] = -si[3];\n        si[5] = -si[5];\n        si[7] = -si[7];\n        i = 0;\n#if MA_DR_MP3_HAVE_SIMD\n        if (ma_dr_mp3_have_simd()) for (; i < 8; i += 4)\n        {\n            ma_dr_mp3_f4 vovl = MA_DR_MP3_VLD(overlap + i);\n            ma_dr_mp3_f4 vc = MA_DR_MP3_VLD(co + i);\n            ma_dr_mp3_f4 vs = MA_DR_MP3_VLD(si + i);\n            ma_dr_mp3_f4 vr0 = MA_DR_MP3_VLD(g_twid9 + i);\n            ma_dr_mp3_f4 vr1 = MA_DR_MP3_VLD(g_twid9 + 9 + i);\n            ma_dr_mp3_f4 vw0 = MA_DR_MP3_VLD(window + i);\n            ma_dr_mp3_f4 vw1 = MA_DR_MP3_VLD(window + 9 + i);\n            ma_dr_mp3_f4 vsum = MA_DR_MP3_VADD(MA_DR_MP3_VMUL(vc, vr1), MA_DR_MP3_VMUL(vs, vr0));\n            MA_DR_MP3_VSTORE(overlap + i, MA_DR_MP3_VSUB(MA_DR_MP3_VMUL(vc, vr0), MA_DR_MP3_VMUL(vs, vr1)));\n            MA_DR_MP3_VSTORE(grbuf + i, MA_DR_MP3_VSUB(MA_DR_MP3_VMUL(vovl, vw0), MA_DR_MP3_VMUL(vsum, vw1)));\n            vsum = MA_DR_MP3_VADD(MA_DR_MP3_VMUL(vovl, vw1), MA_DR_MP3_VMUL(vsum, vw0));\n            MA_DR_MP3_VSTORE(grbuf + 14 - i, MA_DR_MP3_VREV(vsum));\n        }\n#endif\n        for (; i < 9; i++)\n        {\n            float ovl  = overlap[i];\n            float sum  = co[i]*g_twid9[9 + i] + si[i]*g_twid9[0 + i];\n            overlap[i] = co[i]*g_twid9[0 + i] - si[i]*g_twid9[9 + i];\n            grbuf[i]      = ovl*window[0 + i] - sum*window[9 + i];\n            grbuf[17 - i] = ovl*window[9 + i] + sum*window[0 + i];\n        }\n    }\n}\nstatic void ma_dr_mp3_L3_idct3(float x0, float x1, float x2, float *dst)\n{\n    float m1 = x1*0.86602540f;\n    float a1 = x0 - x2*0.5f;\n    dst[1] = x0 + x2;\n    dst[0] = a1 + m1;\n    dst[2] = a1 - m1;\n}\nstatic void ma_dr_mp3_L3_imdct12(float *x, float *dst, float *overlap)\n{\n    static const float g_twid3[6] = { 0.79335334f,0.92387953f,0.99144486f, 0.60876143f,0.38268343f,0.13052619f };\n    float co[3], si[3];\n    int i;\n    ma_dr_mp3_L3_idct3(-x[0], x[6] + x[3], x[12] + x[9], co);\n    ma_dr_mp3_L3_idct3(x[15], x[12] - x[9], x[6] - x[3], si);\n    si[1] = -si[1];\n    for (i = 0; i < 3; i++)\n    {\n        float ovl  = overlap[i];\n        float sum  = co[i]*g_twid3[3 + i] + si[i]*g_twid3[0 + i];\n        overlap[i] = co[i]*g_twid3[0 + i] - si[i]*g_twid3[3 + i];\n        dst[i]     = ovl*g_twid3[2 - i] - sum*g_twid3[5 - i];\n        dst[5 - i] = ovl*g_twid3[5 - i] + sum*g_twid3[2 - i];\n    }\n}\nstatic void ma_dr_mp3_L3_imdct_short(float *grbuf, float *overlap, int nbands)\n{\n    for (;nbands > 0; nbands--, overlap += 9, grbuf += 18)\n    {\n        float tmp[18];\n        MA_DR_MP3_COPY_MEMORY(tmp, grbuf, sizeof(tmp));\n        MA_DR_MP3_COPY_MEMORY(grbuf, overlap, 6*sizeof(float));\n        ma_dr_mp3_L3_imdct12(tmp, grbuf + 6, overlap + 6);\n        ma_dr_mp3_L3_imdct12(tmp + 1, grbuf + 12, overlap + 6);\n        ma_dr_mp3_L3_imdct12(tmp + 2, overlap, overlap + 6);\n    }\n}\nstatic void ma_dr_mp3_L3_change_sign(float *grbuf)\n{\n    int b, i;\n    for (b = 0, grbuf += 18; b < 32; b += 2, grbuf += 36)\n        for (i = 1; i < 18; i += 2)\n            grbuf[i] = -grbuf[i];\n}\nstatic void ma_dr_mp3_L3_imdct_gr(float *grbuf, float *overlap, unsigned block_type, unsigned n_long_bands)\n{\n    static const float g_mdct_window[2][18] = {\n        { 0.99904822f,0.99144486f,0.97629601f,0.95371695f,0.92387953f,0.88701083f,0.84339145f,0.79335334f,0.73727734f,0.04361938f,0.13052619f,0.21643961f,0.30070580f,0.38268343f,0.46174861f,0.53729961f,0.60876143f,0.67559021f },\n        { 1,1,1,1,1,1,0.99144486f,0.92387953f,0.79335334f,0,0,0,0,0,0,0.13052619f,0.38268343f,0.60876143f }\n    };\n    if (n_long_bands)\n    {\n        ma_dr_mp3_L3_imdct36(grbuf, overlap, g_mdct_window[0], n_long_bands);\n        grbuf += 18*n_long_bands;\n        overlap += 9*n_long_bands;\n    }\n    if (block_type == MA_DR_MP3_SHORT_BLOCK_TYPE)\n        ma_dr_mp3_L3_imdct_short(grbuf, overlap, 32 - n_long_bands);\n    else\n        ma_dr_mp3_L3_imdct36(grbuf, overlap, g_mdct_window[block_type == MA_DR_MP3_STOP_BLOCK_TYPE], 32 - n_long_bands);\n}\nstatic void ma_dr_mp3_L3_save_reservoir(ma_dr_mp3dec *h, ma_dr_mp3dec_scratch *s)\n{\n    int pos = (s->bs.pos + 7)/8u;\n    int remains = s->bs.limit/8u - pos;\n    if (remains > MA_DR_MP3_MAX_BITRESERVOIR_BYTES)\n    {\n        pos += remains - MA_DR_MP3_MAX_BITRESERVOIR_BYTES;\n        remains = MA_DR_MP3_MAX_BITRESERVOIR_BYTES;\n    }\n    if (remains > 0)\n    {\n        MA_DR_MP3_MOVE_MEMORY(h->reserv_buf, s->maindata + pos, remains);\n    }\n    h->reserv = remains;\n}\nstatic int ma_dr_mp3_L3_restore_reservoir(ma_dr_mp3dec *h, ma_dr_mp3_bs *bs, ma_dr_mp3dec_scratch *s, int main_data_begin)\n{\n    int frame_bytes = (bs->limit - bs->pos)/8;\n    int bytes_have = MA_DR_MP3_MIN(h->reserv, main_data_begin);\n    MA_DR_MP3_COPY_MEMORY(s->maindata, h->reserv_buf + MA_DR_MP3_MAX(0, h->reserv - main_data_begin), MA_DR_MP3_MIN(h->reserv, main_data_begin));\n    MA_DR_MP3_COPY_MEMORY(s->maindata + bytes_have, bs->buf + bs->pos/8, frame_bytes);\n    ma_dr_mp3_bs_init(&s->bs, s->maindata, bytes_have + frame_bytes);\n    return h->reserv >= main_data_begin;\n}\nstatic void ma_dr_mp3_L3_decode(ma_dr_mp3dec *h, ma_dr_mp3dec_scratch *s, ma_dr_mp3_L3_gr_info *gr_info, int nch)\n{\n    int ch;\n    for (ch = 0; ch < nch; ch++)\n    {\n        int layer3gr_limit = s->bs.pos + gr_info[ch].part_23_length;\n        ma_dr_mp3_L3_decode_scalefactors(h->header, s->ist_pos[ch], &s->bs, gr_info + ch, s->scf, ch);\n        ma_dr_mp3_L3_huffman(s->grbuf[ch], &s->bs, gr_info + ch, s->scf, layer3gr_limit);\n    }\n    if (MA_DR_MP3_HDR_TEST_I_STEREO(h->header))\n    {\n        ma_dr_mp3_L3_intensity_stereo(s->grbuf[0], s->ist_pos[1], gr_info, h->header);\n    } else if (MA_DR_MP3_HDR_IS_MS_STEREO(h->header))\n    {\n        ma_dr_mp3_L3_midside_stereo(s->grbuf[0], 576);\n    }\n    for (ch = 0; ch < nch; ch++, gr_info++)\n    {\n        int aa_bands = 31;\n        int n_long_bands = (gr_info->mixed_block_flag ? 2 : 0) << (int)(MA_DR_MP3_HDR_GET_MY_SAMPLE_RATE(h->header) == 2);\n        if (gr_info->n_short_sfb)\n        {\n            aa_bands = n_long_bands - 1;\n            ma_dr_mp3_L3_reorder(s->grbuf[ch] + n_long_bands*18, s->syn[0], gr_info->sfbtab + gr_info->n_long_sfb);\n        }\n        ma_dr_mp3_L3_antialias(s->grbuf[ch], aa_bands);\n        ma_dr_mp3_L3_imdct_gr(s->grbuf[ch], h->mdct_overlap[ch], gr_info->block_type, n_long_bands);\n        ma_dr_mp3_L3_change_sign(s->grbuf[ch]);\n    }\n}\nstatic void ma_dr_mp3d_DCT_II(float *grbuf, int n)\n{\n    static const float g_sec[24] = {\n        10.19000816f,0.50060302f,0.50241929f,3.40760851f,0.50547093f,0.52249861f,2.05778098f,0.51544732f,0.56694406f,1.48416460f,0.53104258f,0.64682180f,1.16943991f,0.55310392f,0.78815460f,0.97256821f,0.58293498f,1.06067765f,0.83934963f,0.62250412f,1.72244716f,0.74453628f,0.67480832f,5.10114861f\n    };\n    int i, k = 0;\n#if MA_DR_MP3_HAVE_SIMD\n    if (ma_dr_mp3_have_simd()) for (; k < n; k += 4)\n    {\n        ma_dr_mp3_f4 t[4][8], *x;\n        float *y = grbuf + k;\n        for (x = t[0], i = 0; i < 8; i++, x++)\n        {\n            ma_dr_mp3_f4 x0 = MA_DR_MP3_VLD(&y[i*18]);\n            ma_dr_mp3_f4 x1 = MA_DR_MP3_VLD(&y[(15 - i)*18]);\n            ma_dr_mp3_f4 x2 = MA_DR_MP3_VLD(&y[(16 + i)*18]);\n            ma_dr_mp3_f4 x3 = MA_DR_MP3_VLD(&y[(31 - i)*18]);\n            ma_dr_mp3_f4 t0 = MA_DR_MP3_VADD(x0, x3);\n            ma_dr_mp3_f4 t1 = MA_DR_MP3_VADD(x1, x2);\n            ma_dr_mp3_f4 t2 = MA_DR_MP3_VMUL_S(MA_DR_MP3_VSUB(x1, x2), g_sec[3*i + 0]);\n            ma_dr_mp3_f4 t3 = MA_DR_MP3_VMUL_S(MA_DR_MP3_VSUB(x0, x3), g_sec[3*i + 1]);\n            x[0] = MA_DR_MP3_VADD(t0, t1);\n            x[8] = MA_DR_MP3_VMUL_S(MA_DR_MP3_VSUB(t0, t1), g_sec[3*i + 2]);\n            x[16] = MA_DR_MP3_VADD(t3, t2);\n            x[24] = MA_DR_MP3_VMUL_S(MA_DR_MP3_VSUB(t3, t2), g_sec[3*i + 2]);\n        }\n        for (x = t[0], i = 0; i < 4; i++, x += 8)\n        {\n            ma_dr_mp3_f4 x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt;\n            xt = MA_DR_MP3_VSUB(x0, x7); x0 = MA_DR_MP3_VADD(x0, x7);\n            x7 = MA_DR_MP3_VSUB(x1, x6); x1 = MA_DR_MP3_VADD(x1, x6);\n            x6 = MA_DR_MP3_VSUB(x2, x5); x2 = MA_DR_MP3_VADD(x2, x5);\n            x5 = MA_DR_MP3_VSUB(x3, x4); x3 = MA_DR_MP3_VADD(x3, x4);\n            x4 = MA_DR_MP3_VSUB(x0, x3); x0 = MA_DR_MP3_VADD(x0, x3);\n            x3 = MA_DR_MP3_VSUB(x1, x2); x1 = MA_DR_MP3_VADD(x1, x2);\n            x[0] = MA_DR_MP3_VADD(x0, x1);\n            x[4] = MA_DR_MP3_VMUL_S(MA_DR_MP3_VSUB(x0, x1), 0.70710677f);\n            x5 = MA_DR_MP3_VADD(x5, x6);\n            x6 = MA_DR_MP3_VMUL_S(MA_DR_MP3_VADD(x6, x7), 0.70710677f);\n            x7 = MA_DR_MP3_VADD(x7, xt);\n            x3 = MA_DR_MP3_VMUL_S(MA_DR_MP3_VADD(x3, x4), 0.70710677f);\n            x5 = MA_DR_MP3_VSUB(x5, MA_DR_MP3_VMUL_S(x7, 0.198912367f));\n            x7 = MA_DR_MP3_VADD(x7, MA_DR_MP3_VMUL_S(x5, 0.382683432f));\n            x5 = MA_DR_MP3_VSUB(x5, MA_DR_MP3_VMUL_S(x7, 0.198912367f));\n            x0 = MA_DR_MP3_VSUB(xt, x6); xt = MA_DR_MP3_VADD(xt, x6);\n            x[1] = MA_DR_MP3_VMUL_S(MA_DR_MP3_VADD(xt, x7), 0.50979561f);\n            x[2] = MA_DR_MP3_VMUL_S(MA_DR_MP3_VADD(x4, x3), 0.54119611f);\n            x[3] = MA_DR_MP3_VMUL_S(MA_DR_MP3_VSUB(x0, x5), 0.60134488f);\n            x[5] = MA_DR_MP3_VMUL_S(MA_DR_MP3_VADD(x0, x5), 0.89997619f);\n            x[6] = MA_DR_MP3_VMUL_S(MA_DR_MP3_VSUB(x4, x3), 1.30656302f);\n            x[7] = MA_DR_MP3_VMUL_S(MA_DR_MP3_VSUB(xt, x7), 2.56291556f);\n        }\n        if (k > n - 3)\n        {\n#if MA_DR_MP3_HAVE_SSE\n#define MA_DR_MP3_VSAVE2(i, v) _mm_storel_pi((__m64 *)(void*)&y[i*18], v)\n#else\n#define MA_DR_MP3_VSAVE2(i, v) vst1_f32((float32_t *)&y[(i)*18],  vget_low_f32(v))\n#endif\n            for (i = 0; i < 7; i++, y += 4*18)\n            {\n                ma_dr_mp3_f4 s = MA_DR_MP3_VADD(t[3][i], t[3][i + 1]);\n                MA_DR_MP3_VSAVE2(0, t[0][i]);\n                MA_DR_MP3_VSAVE2(1, MA_DR_MP3_VADD(t[2][i], s));\n                MA_DR_MP3_VSAVE2(2, MA_DR_MP3_VADD(t[1][i], t[1][i + 1]));\n                MA_DR_MP3_VSAVE2(3, MA_DR_MP3_VADD(t[2][1 + i], s));\n            }\n            MA_DR_MP3_VSAVE2(0, t[0][7]);\n            MA_DR_MP3_VSAVE2(1, MA_DR_MP3_VADD(t[2][7], t[3][7]));\n            MA_DR_MP3_VSAVE2(2, t[1][7]);\n            MA_DR_MP3_VSAVE2(3, t[3][7]);\n        } else\n        {\n#define MA_DR_MP3_VSAVE4(i, v) MA_DR_MP3_VSTORE(&y[(i)*18], v)\n            for (i = 0; i < 7; i++, y += 4*18)\n            {\n                ma_dr_mp3_f4 s = MA_DR_MP3_VADD(t[3][i], t[3][i + 1]);\n                MA_DR_MP3_VSAVE4(0, t[0][i]);\n                MA_DR_MP3_VSAVE4(1, MA_DR_MP3_VADD(t[2][i], s));\n                MA_DR_MP3_VSAVE4(2, MA_DR_MP3_VADD(t[1][i], t[1][i + 1]));\n                MA_DR_MP3_VSAVE4(3, MA_DR_MP3_VADD(t[2][1 + i], s));\n            }\n            MA_DR_MP3_VSAVE4(0, t[0][7]);\n            MA_DR_MP3_VSAVE4(1, MA_DR_MP3_VADD(t[2][7], t[3][7]));\n            MA_DR_MP3_VSAVE4(2, t[1][7]);\n            MA_DR_MP3_VSAVE4(3, t[3][7]);\n        }\n    } else\n#endif\n#ifdef MA_DR_MP3_ONLY_SIMD\n    {}\n#else\n    for (; k < n; k++)\n    {\n        float t[4][8], *x, *y = grbuf + k;\n        for (x = t[0], i = 0; i < 8; i++, x++)\n        {\n            float x0 = y[i*18];\n            float x1 = y[(15 - i)*18];\n            float x2 = y[(16 + i)*18];\n            float x3 = y[(31 - i)*18];\n            float t0 = x0 + x3;\n            float t1 = x1 + x2;\n            float t2 = (x1 - x2)*g_sec[3*i + 0];\n            float t3 = (x0 - x3)*g_sec[3*i + 1];\n            x[0] = t0 + t1;\n            x[8] = (t0 - t1)*g_sec[3*i + 2];\n            x[16] = t3 + t2;\n            x[24] = (t3 - t2)*g_sec[3*i + 2];\n        }\n        for (x = t[0], i = 0; i < 4; i++, x += 8)\n        {\n            float x0 = x[0], x1 = x[1], x2 = x[2], x3 = x[3], x4 = x[4], x5 = x[5], x6 = x[6], x7 = x[7], xt;\n            xt = x0 - x7; x0 += x7;\n            x7 = x1 - x6; x1 += x6;\n            x6 = x2 - x5; x2 += x5;\n            x5 = x3 - x4; x3 += x4;\n            x4 = x0 - x3; x0 += x3;\n            x3 = x1 - x2; x1 += x2;\n            x[0] = x0 + x1;\n            x[4] = (x0 - x1)*0.70710677f;\n            x5 =  x5 + x6;\n            x6 = (x6 + x7)*0.70710677f;\n            x7 =  x7 + xt;\n            x3 = (x3 + x4)*0.70710677f;\n            x5 -= x7*0.198912367f;\n            x7 += x5*0.382683432f;\n            x5 -= x7*0.198912367f;\n            x0 = xt - x6; xt += x6;\n            x[1] = (xt + x7)*0.50979561f;\n            x[2] = (x4 + x3)*0.54119611f;\n            x[3] = (x0 - x5)*0.60134488f;\n            x[5] = (x0 + x5)*0.89997619f;\n            x[6] = (x4 - x3)*1.30656302f;\n            x[7] = (xt - x7)*2.56291556f;\n        }\n        for (i = 0; i < 7; i++, y += 4*18)\n        {\n            y[0*18] = t[0][i];\n            y[1*18] = t[2][i] + t[3][i] + t[3][i + 1];\n            y[2*18] = t[1][i] + t[1][i + 1];\n            y[3*18] = t[2][i + 1] + t[3][i] + t[3][i + 1];\n        }\n        y[0*18] = t[0][7];\n        y[1*18] = t[2][7] + t[3][7];\n        y[2*18] = t[1][7];\n        y[3*18] = t[3][7];\n    }\n#endif\n}\n#ifndef MA_DR_MP3_FLOAT_OUTPUT\ntypedef ma_int16 ma_dr_mp3d_sample_t;\nstatic ma_int16 ma_dr_mp3d_scale_pcm(float sample)\n{\n    ma_int16 s;\n#if MA_DR_MP3_HAVE_ARMV6\n    ma_int32 s32 = (ma_int32)(sample + .5f);\n    s32 -= (s32 < 0);\n    s = (ma_int16)ma_dr_mp3_clip_int16_arm(s32);\n#else\n    if (sample >=  32766.5) return (ma_int16) 32767;\n    if (sample <= -32767.5) return (ma_int16)-32768;\n    s = (ma_int16)(sample + .5f);\n    s -= (s < 0);\n#endif\n    return s;\n}\n#else\ntypedef float ma_dr_mp3d_sample_t;\nstatic float ma_dr_mp3d_scale_pcm(float sample)\n{\n    return sample*(1.f/32768.f);\n}\n#endif\nstatic void ma_dr_mp3d_synth_pair(ma_dr_mp3d_sample_t *pcm, int nch, const float *z)\n{\n    float a;\n    a  = (z[14*64] - z[    0]) * 29;\n    a += (z[ 1*64] + z[13*64]) * 213;\n    a += (z[12*64] - z[ 2*64]) * 459;\n    a += (z[ 3*64] + z[11*64]) * 2037;\n    a += (z[10*64] - z[ 4*64]) * 5153;\n    a += (z[ 5*64] + z[ 9*64]) * 6574;\n    a += (z[ 8*64] - z[ 6*64]) * 37489;\n    a +=  z[ 7*64]             * 75038;\n    pcm[0] = ma_dr_mp3d_scale_pcm(a);\n    z += 2;\n    a  = z[14*64] * 104;\n    a += z[12*64] * 1567;\n    a += z[10*64] * 9727;\n    a += z[ 8*64] * 64019;\n    a += z[ 6*64] * -9975;\n    a += z[ 4*64] * -45;\n    a += z[ 2*64] * 146;\n    a += z[ 0*64] * -5;\n    pcm[16*nch] = ma_dr_mp3d_scale_pcm(a);\n}\nstatic void ma_dr_mp3d_synth(float *xl, ma_dr_mp3d_sample_t *dstl, int nch, float *lins)\n{\n    int i;\n    float *xr = xl + 576*(nch - 1);\n    ma_dr_mp3d_sample_t *dstr = dstl + (nch - 1);\n    static const float g_win[] = {\n        -1,26,-31,208,218,401,-519,2063,2000,4788,-5517,7134,5959,35640,-39336,74992,\n        -1,24,-35,202,222,347,-581,2080,1952,4425,-5879,7640,5288,33791,-41176,74856,\n        -1,21,-38,196,225,294,-645,2087,1893,4063,-6237,8092,4561,31947,-43006,74630,\n        -1,19,-41,190,227,244,-711,2085,1822,3705,-6589,8492,3776,30112,-44821,74313,\n        -1,17,-45,183,228,197,-779,2075,1739,3351,-6935,8840,2935,28289,-46617,73908,\n        -1,16,-49,176,228,153,-848,2057,1644,3004,-7271,9139,2037,26482,-48390,73415,\n        -2,14,-53,169,227,111,-919,2032,1535,2663,-7597,9389,1082,24694,-50137,72835,\n        -2,13,-58,161,224,72,-991,2001,1414,2330,-7910,9592,70,22929,-51853,72169,\n        -2,11,-63,154,221,36,-1064,1962,1280,2006,-8209,9750,-998,21189,-53534,71420,\n        -2,10,-68,147,215,2,-1137,1919,1131,1692,-8491,9863,-2122,19478,-55178,70590,\n        -3,9,-73,139,208,-29,-1210,1870,970,1388,-8755,9935,-3300,17799,-56778,69679,\n        -3,8,-79,132,200,-57,-1283,1817,794,1095,-8998,9966,-4533,16155,-58333,68692,\n        -4,7,-85,125,189,-83,-1356,1759,605,814,-9219,9959,-5818,14548,-59838,67629,\n        -4,7,-91,117,177,-106,-1428,1698,402,545,-9416,9916,-7154,12980,-61289,66494,\n        -5,6,-97,111,163,-127,-1498,1634,185,288,-9585,9838,-8540,11455,-62684,65290\n    };\n    float *zlin = lins + 15*64;\n    const float *w = g_win;\n    zlin[4*15]     = xl[18*16];\n    zlin[4*15 + 1] = xr[18*16];\n    zlin[4*15 + 2] = xl[0];\n    zlin[4*15 + 3] = xr[0];\n    zlin[4*31]     = xl[1 + 18*16];\n    zlin[4*31 + 1] = xr[1 + 18*16];\n    zlin[4*31 + 2] = xl[1];\n    zlin[4*31 + 3] = xr[1];\n    ma_dr_mp3d_synth_pair(dstr, nch, lins + 4*15 + 1);\n    ma_dr_mp3d_synth_pair(dstr + 32*nch, nch, lins + 4*15 + 64 + 1);\n    ma_dr_mp3d_synth_pair(dstl, nch, lins + 4*15);\n    ma_dr_mp3d_synth_pair(dstl + 32*nch, nch, lins + 4*15 + 64);\n#if MA_DR_MP3_HAVE_SIMD\n    if (ma_dr_mp3_have_simd()) for (i = 14; i >= 0; i--)\n    {\n#define MA_DR_MP3_VLOAD(k) ma_dr_mp3_f4 w0 = MA_DR_MP3_VSET(*w++); ma_dr_mp3_f4 w1 = MA_DR_MP3_VSET(*w++); ma_dr_mp3_f4 vz = MA_DR_MP3_VLD(&zlin[4*i - 64*k]); ma_dr_mp3_f4 vy = MA_DR_MP3_VLD(&zlin[4*i - 64*(15 - k)]);\n#define MA_DR_MP3_V0(k) { MA_DR_MP3_VLOAD(k) b =               MA_DR_MP3_VADD(MA_DR_MP3_VMUL(vz, w1), MA_DR_MP3_VMUL(vy, w0)) ; a =               MA_DR_MP3_VSUB(MA_DR_MP3_VMUL(vz, w0), MA_DR_MP3_VMUL(vy, w1));  }\n#define MA_DR_MP3_V1(k) { MA_DR_MP3_VLOAD(k) b = MA_DR_MP3_VADD(b, MA_DR_MP3_VADD(MA_DR_MP3_VMUL(vz, w1), MA_DR_MP3_VMUL(vy, w0))); a = MA_DR_MP3_VADD(a, MA_DR_MP3_VSUB(MA_DR_MP3_VMUL(vz, w0), MA_DR_MP3_VMUL(vy, w1))); }\n#define MA_DR_MP3_V2(k) { MA_DR_MP3_VLOAD(k) b = MA_DR_MP3_VADD(b, MA_DR_MP3_VADD(MA_DR_MP3_VMUL(vz, w1), MA_DR_MP3_VMUL(vy, w0))); a = MA_DR_MP3_VADD(a, MA_DR_MP3_VSUB(MA_DR_MP3_VMUL(vy, w1), MA_DR_MP3_VMUL(vz, w0))); }\n        ma_dr_mp3_f4 a, b;\n        zlin[4*i]     = xl[18*(31 - i)];\n        zlin[4*i + 1] = xr[18*(31 - i)];\n        zlin[4*i + 2] = xl[1 + 18*(31 - i)];\n        zlin[4*i + 3] = xr[1 + 18*(31 - i)];\n        zlin[4*i + 64] = xl[1 + 18*(1 + i)];\n        zlin[4*i + 64 + 1] = xr[1 + 18*(1 + i)];\n        zlin[4*i - 64 + 2] = xl[18*(1 + i)];\n        zlin[4*i - 64 + 3] = xr[18*(1 + i)];\n        MA_DR_MP3_V0(0) MA_DR_MP3_V2(1) MA_DR_MP3_V1(2) MA_DR_MP3_V2(3) MA_DR_MP3_V1(4) MA_DR_MP3_V2(5) MA_DR_MP3_V1(6) MA_DR_MP3_V2(7)\n        {\n#ifndef MA_DR_MP3_FLOAT_OUTPUT\n#if MA_DR_MP3_HAVE_SSE\n            static const ma_dr_mp3_f4 g_max = { 32767.0f, 32767.0f, 32767.0f, 32767.0f };\n            static const ma_dr_mp3_f4 g_min = { -32768.0f, -32768.0f, -32768.0f, -32768.0f };\n            __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, g_max), g_min)),\n                                           _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, g_max), g_min)));\n            dstr[(15 - i)*nch] = (ma_int16)_mm_extract_epi16(pcm8, 1);\n            dstr[(17 + i)*nch] = (ma_int16)_mm_extract_epi16(pcm8, 5);\n            dstl[(15 - i)*nch] = (ma_int16)_mm_extract_epi16(pcm8, 0);\n            dstl[(17 + i)*nch] = (ma_int16)_mm_extract_epi16(pcm8, 4);\n            dstr[(47 - i)*nch] = (ma_int16)_mm_extract_epi16(pcm8, 3);\n            dstr[(49 + i)*nch] = (ma_int16)_mm_extract_epi16(pcm8, 7);\n            dstl[(47 - i)*nch] = (ma_int16)_mm_extract_epi16(pcm8, 2);\n            dstl[(49 + i)*nch] = (ma_int16)_mm_extract_epi16(pcm8, 6);\n#else\n            int16x4_t pcma, pcmb;\n            a = MA_DR_MP3_VADD(a, MA_DR_MP3_VSET(0.5f));\n            b = MA_DR_MP3_VADD(b, MA_DR_MP3_VSET(0.5f));\n            pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, MA_DR_MP3_VSET(0)))));\n            pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, MA_DR_MP3_VSET(0)))));\n            vst1_lane_s16(dstr + (15 - i)*nch, pcma, 1);\n            vst1_lane_s16(dstr + (17 + i)*nch, pcmb, 1);\n            vst1_lane_s16(dstl + (15 - i)*nch, pcma, 0);\n            vst1_lane_s16(dstl + (17 + i)*nch, pcmb, 0);\n            vst1_lane_s16(dstr + (47 - i)*nch, pcma, 3);\n            vst1_lane_s16(dstr + (49 + i)*nch, pcmb, 3);\n            vst1_lane_s16(dstl + (47 - i)*nch, pcma, 2);\n            vst1_lane_s16(dstl + (49 + i)*nch, pcmb, 2);\n#endif\n#else\n        #if MA_DR_MP3_HAVE_SSE\n            static const ma_dr_mp3_f4 g_scale = { 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f, 1.0f/32768.0f };\n        #else\n            const ma_dr_mp3_f4 g_scale = vdupq_n_f32(1.0f/32768.0f);\n        #endif\n            a = MA_DR_MP3_VMUL(a, g_scale);\n            b = MA_DR_MP3_VMUL(b, g_scale);\n#if MA_DR_MP3_HAVE_SSE\n            _mm_store_ss(dstr + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 1, 1)));\n            _mm_store_ss(dstr + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(1, 1, 1, 1)));\n            _mm_store_ss(dstl + (15 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(0, 0, 0, 0)));\n            _mm_store_ss(dstl + (17 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(0, 0, 0, 0)));\n            _mm_store_ss(dstr + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(3, 3, 3, 3)));\n            _mm_store_ss(dstr + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(3, 3, 3, 3)));\n            _mm_store_ss(dstl + (47 - i)*nch, _mm_shuffle_ps(a, a, _MM_SHUFFLE(2, 2, 2, 2)));\n            _mm_store_ss(dstl + (49 + i)*nch, _mm_shuffle_ps(b, b, _MM_SHUFFLE(2, 2, 2, 2)));\n#else\n            vst1q_lane_f32(dstr + (15 - i)*nch, a, 1);\n            vst1q_lane_f32(dstr + (17 + i)*nch, b, 1);\n            vst1q_lane_f32(dstl + (15 - i)*nch, a, 0);\n            vst1q_lane_f32(dstl + (17 + i)*nch, b, 0);\n            vst1q_lane_f32(dstr + (47 - i)*nch, a, 3);\n            vst1q_lane_f32(dstr + (49 + i)*nch, b, 3);\n            vst1q_lane_f32(dstl + (47 - i)*nch, a, 2);\n            vst1q_lane_f32(dstl + (49 + i)*nch, b, 2);\n#endif\n#endif\n        }\n    } else\n#endif\n#ifdef MA_DR_MP3_ONLY_SIMD\n    {}\n#else\n    for (i = 14; i >= 0; i--)\n    {\n#define MA_DR_MP3_LOAD(k) float w0 = *w++; float w1 = *w++; float *vz = &zlin[4*i - k*64]; float *vy = &zlin[4*i - (15 - k)*64];\n#define MA_DR_MP3_S0(k) { int j; MA_DR_MP3_LOAD(k); for (j = 0; j < 4; j++) b[j]  = vz[j]*w1 + vy[j]*w0, a[j]  = vz[j]*w0 - vy[j]*w1; }\n#define MA_DR_MP3_S1(k) { int j; MA_DR_MP3_LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vz[j]*w0 - vy[j]*w1; }\n#define MA_DR_MP3_S2(k) { int j; MA_DR_MP3_LOAD(k); for (j = 0; j < 4; j++) b[j] += vz[j]*w1 + vy[j]*w0, a[j] += vy[j]*w1 - vz[j]*w0; }\n        float a[4], b[4];\n        zlin[4*i]     = xl[18*(31 - i)];\n        zlin[4*i + 1] = xr[18*(31 - i)];\n        zlin[4*i + 2] = xl[1 + 18*(31 - i)];\n        zlin[4*i + 3] = xr[1 + 18*(31 - i)];\n        zlin[4*(i + 16)]   = xl[1 + 18*(1 + i)];\n        zlin[4*(i + 16) + 1] = xr[1 + 18*(1 + i)];\n        zlin[4*(i - 16) + 2] = xl[18*(1 + i)];\n        zlin[4*(i - 16) + 3] = xr[18*(1 + i)];\n        MA_DR_MP3_S0(0) MA_DR_MP3_S2(1) MA_DR_MP3_S1(2) MA_DR_MP3_S2(3) MA_DR_MP3_S1(4) MA_DR_MP3_S2(5) MA_DR_MP3_S1(6) MA_DR_MP3_S2(7)\n        dstr[(15 - i)*nch] = ma_dr_mp3d_scale_pcm(a[1]);\n        dstr[(17 + i)*nch] = ma_dr_mp3d_scale_pcm(b[1]);\n        dstl[(15 - i)*nch] = ma_dr_mp3d_scale_pcm(a[0]);\n        dstl[(17 + i)*nch] = ma_dr_mp3d_scale_pcm(b[0]);\n        dstr[(47 - i)*nch] = ma_dr_mp3d_scale_pcm(a[3]);\n        dstr[(49 + i)*nch] = ma_dr_mp3d_scale_pcm(b[3]);\n        dstl[(47 - i)*nch] = ma_dr_mp3d_scale_pcm(a[2]);\n        dstl[(49 + i)*nch] = ma_dr_mp3d_scale_pcm(b[2]);\n    }\n#endif\n}\nstatic void ma_dr_mp3d_synth_granule(float *qmf_state, float *grbuf, int nbands, int nch, ma_dr_mp3d_sample_t *pcm, float *lins)\n{\n    int i;\n    for (i = 0; i < nch; i++)\n    {\n        ma_dr_mp3d_DCT_II(grbuf + 576*i, nbands);\n    }\n    MA_DR_MP3_COPY_MEMORY(lins, qmf_state, sizeof(float)*15*64);\n    for (i = 0; i < nbands; i += 2)\n    {\n        ma_dr_mp3d_synth(grbuf + i, pcm + 32*nch*i, nch, lins + i*64);\n    }\n#ifndef MA_DR_MP3_NONSTANDARD_BUT_LOGICAL\n    if (nch == 1)\n    {\n        for (i = 0; i < 15*64; i += 2)\n        {\n            qmf_state[i] = lins[nbands*64 + i];\n        }\n    } else\n#endif\n    {\n        MA_DR_MP3_COPY_MEMORY(qmf_state, lins + nbands*64, sizeof(float)*15*64);\n    }\n}\nstatic int ma_dr_mp3d_match_frame(const ma_uint8 *hdr, int mp3_bytes, int frame_bytes)\n{\n    int i, nmatch;\n    for (i = 0, nmatch = 0; nmatch < MA_DR_MP3_MAX_FRAME_SYNC_MATCHES; nmatch++)\n    {\n        i += ma_dr_mp3_hdr_frame_bytes(hdr + i, frame_bytes) + ma_dr_mp3_hdr_padding(hdr + i);\n        if (i + MA_DR_MP3_HDR_SIZE > mp3_bytes)\n            return nmatch > 0;\n        if (!ma_dr_mp3_hdr_compare(hdr, hdr + i))\n            return 0;\n    }\n    return 1;\n}\nstatic int ma_dr_mp3d_find_frame(const ma_uint8 *mp3, int mp3_bytes, int *free_format_bytes, int *ptr_frame_bytes)\n{\n    int i, k;\n    for (i = 0; i < mp3_bytes - MA_DR_MP3_HDR_SIZE; i++, mp3++)\n    {\n        if (ma_dr_mp3_hdr_valid(mp3))\n        {\n            int frame_bytes = ma_dr_mp3_hdr_frame_bytes(mp3, *free_format_bytes);\n            int frame_and_padding = frame_bytes + ma_dr_mp3_hdr_padding(mp3);\n            for (k = MA_DR_MP3_HDR_SIZE; !frame_bytes && k < MA_DR_MP3_MAX_FREE_FORMAT_FRAME_SIZE && i + 2*k < mp3_bytes - MA_DR_MP3_HDR_SIZE; k++)\n            {\n                if (ma_dr_mp3_hdr_compare(mp3, mp3 + k))\n                {\n                    int fb = k - ma_dr_mp3_hdr_padding(mp3);\n                    int nextfb = fb + ma_dr_mp3_hdr_padding(mp3 + k);\n                    if (i + k + nextfb + MA_DR_MP3_HDR_SIZE > mp3_bytes || !ma_dr_mp3_hdr_compare(mp3, mp3 + k + nextfb))\n                        continue;\n                    frame_and_padding = k;\n                    frame_bytes = fb;\n                    *free_format_bytes = fb;\n                }\n            }\n            if ((frame_bytes && i + frame_and_padding <= mp3_bytes &&\n                ma_dr_mp3d_match_frame(mp3, mp3_bytes - i, frame_bytes)) ||\n                (!i && frame_and_padding == mp3_bytes))\n            {\n                *ptr_frame_bytes = frame_and_padding;\n                return i;\n            }\n            *free_format_bytes = 0;\n        }\n    }\n    *ptr_frame_bytes = 0;\n    return mp3_bytes;\n}\nMA_API void ma_dr_mp3dec_init(ma_dr_mp3dec *dec)\n{\n    dec->header[0] = 0;\n}\nMA_API int ma_dr_mp3dec_decode_frame(ma_dr_mp3dec *dec, const ma_uint8 *mp3, int mp3_bytes, void *pcm, ma_dr_mp3dec_frame_info *info)\n{\n    int i = 0, igr, frame_size = 0, success = 1;\n    const ma_uint8 *hdr;\n    ma_dr_mp3_bs bs_frame[1];\n    ma_dr_mp3dec_scratch scratch;\n    if (mp3_bytes > 4 && dec->header[0] == 0xff && ma_dr_mp3_hdr_compare(dec->header, mp3))\n    {\n        frame_size = ma_dr_mp3_hdr_frame_bytes(mp3, dec->free_format_bytes) + ma_dr_mp3_hdr_padding(mp3);\n        if (frame_size != mp3_bytes && (frame_size + MA_DR_MP3_HDR_SIZE > mp3_bytes || !ma_dr_mp3_hdr_compare(mp3, mp3 + frame_size)))\n        {\n            frame_size = 0;\n        }\n    }\n    if (!frame_size)\n    {\n        MA_DR_MP3_ZERO_MEMORY(dec, sizeof(ma_dr_mp3dec));\n        i = ma_dr_mp3d_find_frame(mp3, mp3_bytes, &dec->free_format_bytes, &frame_size);\n        if (!frame_size || i + frame_size > mp3_bytes)\n        {\n            info->frame_bytes = i;\n            return 0;\n        }\n    }\n    hdr = mp3 + i;\n    MA_DR_MP3_COPY_MEMORY(dec->header, hdr, MA_DR_MP3_HDR_SIZE);\n    info->frame_bytes = i + frame_size;\n    info->channels = MA_DR_MP3_HDR_IS_MONO(hdr) ? 1 : 2;\n    info->hz = ma_dr_mp3_hdr_sample_rate_hz(hdr);\n    info->layer = 4 - MA_DR_MP3_HDR_GET_LAYER(hdr);\n    info->bitrate_kbps = ma_dr_mp3_hdr_bitrate_kbps(hdr);\n    ma_dr_mp3_bs_init(bs_frame, hdr + MA_DR_MP3_HDR_SIZE, frame_size - MA_DR_MP3_HDR_SIZE);\n    if (MA_DR_MP3_HDR_IS_CRC(hdr))\n    {\n        ma_dr_mp3_bs_get_bits(bs_frame, 16);\n    }\n    if (info->layer == 3)\n    {\n        int main_data_begin = ma_dr_mp3_L3_read_side_info(bs_frame, scratch.gr_info, hdr);\n        if (main_data_begin < 0 || bs_frame->pos > bs_frame->limit)\n        {\n            ma_dr_mp3dec_init(dec);\n            return 0;\n        }\n        success = ma_dr_mp3_L3_restore_reservoir(dec, bs_frame, &scratch, main_data_begin);\n        if (success && pcm != NULL)\n        {\n            for (igr = 0; igr < (MA_DR_MP3_HDR_TEST_MPEG1(hdr) ? 2 : 1); igr++, pcm = MA_DR_MP3_OFFSET_PTR(pcm, sizeof(ma_dr_mp3d_sample_t)*576*info->channels))\n            {\n                MA_DR_MP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float));\n                ma_dr_mp3_L3_decode(dec, &scratch, scratch.gr_info + igr*info->channels, info->channels);\n                ma_dr_mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 18, info->channels, (ma_dr_mp3d_sample_t*)pcm, scratch.syn[0]);\n            }\n        }\n        ma_dr_mp3_L3_save_reservoir(dec, &scratch);\n    } else\n    {\n#ifdef MA_DR_MP3_ONLY_MP3\n        return 0;\n#else\n        ma_dr_mp3_L12_scale_info sci[1];\n        if (pcm == NULL) {\n            return ma_dr_mp3_hdr_frame_samples(hdr);\n        }\n        ma_dr_mp3_L12_read_scale_info(hdr, bs_frame, sci);\n        MA_DR_MP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float));\n        for (i = 0, igr = 0; igr < 3; igr++)\n        {\n            if (12 == (i += ma_dr_mp3_L12_dequantize_granule(scratch.grbuf[0] + i, bs_frame, sci, info->layer | 1)))\n            {\n                i = 0;\n                ma_dr_mp3_L12_apply_scf_384(sci, sci->scf + igr, scratch.grbuf[0]);\n                ma_dr_mp3d_synth_granule(dec->qmf_state, scratch.grbuf[0], 12, info->channels, (ma_dr_mp3d_sample_t*)pcm, scratch.syn[0]);\n                MA_DR_MP3_ZERO_MEMORY(scratch.grbuf[0], 576*2*sizeof(float));\n                pcm = MA_DR_MP3_OFFSET_PTR(pcm, sizeof(ma_dr_mp3d_sample_t)*384*info->channels);\n            }\n            if (bs_frame->pos > bs_frame->limit)\n            {\n                ma_dr_mp3dec_init(dec);\n                return 0;\n            }\n        }\n#endif\n    }\n    return success*ma_dr_mp3_hdr_frame_samples(dec->header);\n}\nMA_API void ma_dr_mp3dec_f32_to_s16(const float *in, ma_int16 *out, size_t num_samples)\n{\n    size_t i = 0;\n#if MA_DR_MP3_HAVE_SIMD\n    size_t aligned_count = num_samples & ~7;\n    for(; i < aligned_count; i+=8)\n    {\n        ma_dr_mp3_f4 scale = MA_DR_MP3_VSET(32768.0f);\n        ma_dr_mp3_f4 a = MA_DR_MP3_VMUL(MA_DR_MP3_VLD(&in[i  ]), scale);\n        ma_dr_mp3_f4 b = MA_DR_MP3_VMUL(MA_DR_MP3_VLD(&in[i+4]), scale);\n#if MA_DR_MP3_HAVE_SSE\n        ma_dr_mp3_f4 s16max = MA_DR_MP3_VSET( 32767.0f);\n        ma_dr_mp3_f4 s16min = MA_DR_MP3_VSET(-32768.0f);\n        __m128i pcm8 = _mm_packs_epi32(_mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(a, s16max), s16min)),\n                                        _mm_cvtps_epi32(_mm_max_ps(_mm_min_ps(b, s16max), s16min)));\n        out[i  ] = (ma_int16)_mm_extract_epi16(pcm8, 0);\n        out[i+1] = (ma_int16)_mm_extract_epi16(pcm8, 1);\n        out[i+2] = (ma_int16)_mm_extract_epi16(pcm8, 2);\n        out[i+3] = (ma_int16)_mm_extract_epi16(pcm8, 3);\n        out[i+4] = (ma_int16)_mm_extract_epi16(pcm8, 4);\n        out[i+5] = (ma_int16)_mm_extract_epi16(pcm8, 5);\n        out[i+6] = (ma_int16)_mm_extract_epi16(pcm8, 6);\n        out[i+7] = (ma_int16)_mm_extract_epi16(pcm8, 7);\n#else\n        int16x4_t pcma, pcmb;\n        a = MA_DR_MP3_VADD(a, MA_DR_MP3_VSET(0.5f));\n        b = MA_DR_MP3_VADD(b, MA_DR_MP3_VSET(0.5f));\n        pcma = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(a), vreinterpretq_s32_u32(vcltq_f32(a, MA_DR_MP3_VSET(0)))));\n        pcmb = vqmovn_s32(vqaddq_s32(vcvtq_s32_f32(b), vreinterpretq_s32_u32(vcltq_f32(b, MA_DR_MP3_VSET(0)))));\n        vst1_lane_s16(out+i  , pcma, 0);\n        vst1_lane_s16(out+i+1, pcma, 1);\n        vst1_lane_s16(out+i+2, pcma, 2);\n        vst1_lane_s16(out+i+3, pcma, 3);\n        vst1_lane_s16(out+i+4, pcmb, 0);\n        vst1_lane_s16(out+i+5, pcmb, 1);\n        vst1_lane_s16(out+i+6, pcmb, 2);\n        vst1_lane_s16(out+i+7, pcmb, 3);\n#endif\n    }\n#endif\n    for(; i < num_samples; i++)\n    {\n        float sample = in[i] * 32768.0f;\n        if (sample >=  32766.5)\n            out[i] = (ma_int16) 32767;\n        else if (sample <= -32767.5)\n            out[i] = (ma_int16)-32768;\n        else\n        {\n            short s = (ma_int16)(sample + .5f);\n            s -= (s < 0);\n            out[i] = s;\n        }\n    }\n}\n#ifndef MA_DR_MP3_SEEK_LEADING_MP3_FRAMES\n#define MA_DR_MP3_SEEK_LEADING_MP3_FRAMES   2\n#endif\n#define MA_DR_MP3_MIN_DATA_CHUNK_SIZE   16384\n#ifndef MA_DR_MP3_DATA_CHUNK_SIZE\n#define MA_DR_MP3_DATA_CHUNK_SIZE  (MA_DR_MP3_MIN_DATA_CHUNK_SIZE*4)\n#endif\n#define MA_DR_MP3_COUNTOF(x)        (sizeof(x) / sizeof(x[0]))\n#define MA_DR_MP3_CLAMP(x, lo, hi)  (MA_DR_MP3_MAX(lo, MA_DR_MP3_MIN(x, hi)))\n#ifndef MA_DR_MP3_PI_D\n#define MA_DR_MP3_PI_D    3.14159265358979323846264\n#endif\n#define MA_DR_MP3_DEFAULT_RESAMPLER_LPF_ORDER   2\nstatic MA_INLINE float ma_dr_mp3_mix_f32(float x, float y, float a)\n{\n    return x*(1-a) + y*a;\n}\nstatic MA_INLINE float ma_dr_mp3_mix_f32_fast(float x, float y, float a)\n{\n    float r0 = (y - x);\n    float r1 = r0*a;\n    return x + r1;\n}\nstatic MA_INLINE ma_uint32 ma_dr_mp3_gcf_u32(ma_uint32 a, ma_uint32 b)\n{\n    for (;;) {\n        if (b == 0) {\n            break;\n        } else {\n            ma_uint32 t = a;\n            a = b;\n            b = t % a;\n        }\n    }\n    return a;\n}\nstatic void* ma_dr_mp3__malloc_default(size_t sz, void* pUserData)\n{\n    (void)pUserData;\n    return MA_DR_MP3_MALLOC(sz);\n}\nstatic void* ma_dr_mp3__realloc_default(void* p, size_t sz, void* pUserData)\n{\n    (void)pUserData;\n    return MA_DR_MP3_REALLOC(p, sz);\n}\nstatic void ma_dr_mp3__free_default(void* p, void* pUserData)\n{\n    (void)pUserData;\n    MA_DR_MP3_FREE(p);\n}\nstatic void* ma_dr_mp3__malloc_from_callbacks(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks == NULL) {\n        return NULL;\n    }\n    if (pAllocationCallbacks->onMalloc != NULL) {\n        return pAllocationCallbacks->onMalloc(sz, pAllocationCallbacks->pUserData);\n    }\n    if (pAllocationCallbacks->onRealloc != NULL) {\n        return pAllocationCallbacks->onRealloc(NULL, sz, pAllocationCallbacks->pUserData);\n    }\n    return NULL;\n}\nstatic void* ma_dr_mp3__realloc_from_callbacks(void* p, size_t szNew, size_t szOld, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks == NULL) {\n        return NULL;\n    }\n    if (pAllocationCallbacks->onRealloc != NULL) {\n        return pAllocationCallbacks->onRealloc(p, szNew, pAllocationCallbacks->pUserData);\n    }\n    if (pAllocationCallbacks->onMalloc != NULL && pAllocationCallbacks->onFree != NULL) {\n        void* p2;\n        p2 = pAllocationCallbacks->onMalloc(szNew, pAllocationCallbacks->pUserData);\n        if (p2 == NULL) {\n            return NULL;\n        }\n        if (p != NULL) {\n            MA_DR_MP3_COPY_MEMORY(p2, p, szOld);\n            pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);\n        }\n        return p2;\n    }\n    return NULL;\n}\nstatic void ma_dr_mp3__free_from_callbacks(void* p, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (p == NULL || pAllocationCallbacks == NULL) {\n        return;\n    }\n    if (pAllocationCallbacks->onFree != NULL) {\n        pAllocationCallbacks->onFree(p, pAllocationCallbacks->pUserData);\n    }\n}\nstatic ma_allocation_callbacks ma_dr_mp3_copy_allocation_callbacks_or_defaults(const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks != NULL) {\n        return *pAllocationCallbacks;\n    } else {\n        ma_allocation_callbacks allocationCallbacks;\n        allocationCallbacks.pUserData = NULL;\n        allocationCallbacks.onMalloc  = ma_dr_mp3__malloc_default;\n        allocationCallbacks.onRealloc = ma_dr_mp3__realloc_default;\n        allocationCallbacks.onFree    = ma_dr_mp3__free_default;\n        return allocationCallbacks;\n    }\n}\nstatic size_t ma_dr_mp3__on_read(ma_dr_mp3* pMP3, void* pBufferOut, size_t bytesToRead)\n{\n    size_t bytesRead = pMP3->onRead(pMP3->pUserData, pBufferOut, bytesToRead);\n    pMP3->streamCursor += bytesRead;\n    return bytesRead;\n}\nstatic ma_bool32 ma_dr_mp3__on_seek(ma_dr_mp3* pMP3, int offset, ma_dr_mp3_seek_origin origin)\n{\n    MA_DR_MP3_ASSERT(offset >= 0);\n    if (!pMP3->onSeek(pMP3->pUserData, offset, origin)) {\n        return MA_FALSE;\n    }\n    if (origin == ma_dr_mp3_seek_origin_start) {\n        pMP3->streamCursor = (ma_uint64)offset;\n    } else {\n        pMP3->streamCursor += offset;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_mp3__on_seek_64(ma_dr_mp3* pMP3, ma_uint64 offset, ma_dr_mp3_seek_origin origin)\n{\n    if (offset <= 0x7FFFFFFF) {\n        return ma_dr_mp3__on_seek(pMP3, (int)offset, origin);\n    }\n    if (!ma_dr_mp3__on_seek(pMP3, 0x7FFFFFFF, ma_dr_mp3_seek_origin_start)) {\n        return MA_FALSE;\n    }\n    offset -= 0x7FFFFFFF;\n    while (offset > 0) {\n        if (offset <= 0x7FFFFFFF) {\n            if (!ma_dr_mp3__on_seek(pMP3, (int)offset, ma_dr_mp3_seek_origin_current)) {\n                return MA_FALSE;\n            }\n            offset = 0;\n        } else {\n            if (!ma_dr_mp3__on_seek(pMP3, 0x7FFFFFFF, ma_dr_mp3_seek_origin_current)) {\n                return MA_FALSE;\n            }\n            offset -= 0x7FFFFFFF;\n        }\n    }\n    return MA_TRUE;\n}\nstatic ma_uint32 ma_dr_mp3_decode_next_frame_ex__callbacks(ma_dr_mp3* pMP3, ma_dr_mp3d_sample_t* pPCMFrames)\n{\n    ma_uint32 pcmFramesRead = 0;\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    MA_DR_MP3_ASSERT(pMP3->onRead != NULL);\n    if (pMP3->atEnd) {\n        return 0;\n    }\n    for (;;) {\n        ma_dr_mp3dec_frame_info info;\n        if (pMP3->dataSize < MA_DR_MP3_MIN_DATA_CHUNK_SIZE) {\n            size_t bytesRead;\n            if (pMP3->pData != NULL) {\n                MA_DR_MP3_MOVE_MEMORY(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize);\n            }\n            pMP3->dataConsumed = 0;\n            if (pMP3->dataCapacity < MA_DR_MP3_DATA_CHUNK_SIZE) {\n                ma_uint8* pNewData;\n                size_t newDataCap;\n                newDataCap = MA_DR_MP3_DATA_CHUNK_SIZE;\n                pNewData = (ma_uint8*)ma_dr_mp3__realloc_from_callbacks(pMP3->pData, newDataCap, pMP3->dataCapacity, &pMP3->allocationCallbacks);\n                if (pNewData == NULL) {\n                    return 0;\n                }\n                pMP3->pData = pNewData;\n                pMP3->dataCapacity = newDataCap;\n            }\n            bytesRead = ma_dr_mp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize));\n            if (bytesRead == 0) {\n                if (pMP3->dataSize == 0) {\n                    pMP3->atEnd = MA_TRUE;\n                    return 0;\n                }\n            }\n            pMP3->dataSize += bytesRead;\n        }\n        if (pMP3->dataSize > INT_MAX) {\n            pMP3->atEnd = MA_TRUE;\n            return 0;\n        }\n        MA_DR_MP3_ASSERT(pMP3->pData != NULL);\n        MA_DR_MP3_ASSERT(pMP3->dataCapacity > 0);\n        if (pMP3->pData == NULL) {\n            return 0;\n        }\n        pcmFramesRead = ma_dr_mp3dec_decode_frame(&pMP3->decoder, pMP3->pData + pMP3->dataConsumed, (int)pMP3->dataSize, pPCMFrames, &info);\n        if (info.frame_bytes > 0) {\n            pMP3->dataConsumed += (size_t)info.frame_bytes;\n            pMP3->dataSize     -= (size_t)info.frame_bytes;\n        }\n        if (pcmFramesRead > 0) {\n            pcmFramesRead = ma_dr_mp3_hdr_frame_samples(pMP3->decoder.header);\n            pMP3->pcmFramesConsumedInMP3Frame = 0;\n            pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead;\n            pMP3->mp3FrameChannels = info.channels;\n            pMP3->mp3FrameSampleRate = info.hz;\n            break;\n        } else if (info.frame_bytes == 0) {\n            size_t bytesRead;\n            MA_DR_MP3_MOVE_MEMORY(pMP3->pData, pMP3->pData + pMP3->dataConsumed, pMP3->dataSize);\n            pMP3->dataConsumed = 0;\n            if (pMP3->dataCapacity == pMP3->dataSize) {\n                ma_uint8* pNewData;\n                size_t newDataCap;\n                newDataCap = pMP3->dataCapacity + MA_DR_MP3_DATA_CHUNK_SIZE;\n                pNewData = (ma_uint8*)ma_dr_mp3__realloc_from_callbacks(pMP3->pData, newDataCap, pMP3->dataCapacity, &pMP3->allocationCallbacks);\n                if (pNewData == NULL) {\n                    return 0;\n                }\n                pMP3->pData = pNewData;\n                pMP3->dataCapacity = newDataCap;\n            }\n            bytesRead = ma_dr_mp3__on_read(pMP3, pMP3->pData + pMP3->dataSize, (pMP3->dataCapacity - pMP3->dataSize));\n            if (bytesRead == 0) {\n                pMP3->atEnd = MA_TRUE;\n                return 0;\n            }\n            pMP3->dataSize += bytesRead;\n        }\n    };\n    return pcmFramesRead;\n}\nstatic ma_uint32 ma_dr_mp3_decode_next_frame_ex__memory(ma_dr_mp3* pMP3, ma_dr_mp3d_sample_t* pPCMFrames)\n{\n    ma_uint32 pcmFramesRead = 0;\n    ma_dr_mp3dec_frame_info info;\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    MA_DR_MP3_ASSERT(pMP3->memory.pData != NULL);\n    if (pMP3->atEnd) {\n        return 0;\n    }\n    for (;;) {\n        pcmFramesRead = ma_dr_mp3dec_decode_frame(&pMP3->decoder, pMP3->memory.pData + pMP3->memory.currentReadPos, (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos), pPCMFrames, &info);\n        if (pcmFramesRead > 0) {\n            pcmFramesRead = ma_dr_mp3_hdr_frame_samples(pMP3->decoder.header);\n            pMP3->pcmFramesConsumedInMP3Frame  = 0;\n            pMP3->pcmFramesRemainingInMP3Frame = pcmFramesRead;\n            pMP3->mp3FrameChannels             = info.channels;\n            pMP3->mp3FrameSampleRate           = info.hz;\n            break;\n        } else if (info.frame_bytes > 0) {\n            pMP3->memory.currentReadPos += (size_t)info.frame_bytes;\n        } else {\n            break;\n        }\n    }\n    pMP3->memory.currentReadPos += (size_t)info.frame_bytes;\n    return pcmFramesRead;\n}\nstatic ma_uint32 ma_dr_mp3_decode_next_frame_ex(ma_dr_mp3* pMP3, ma_dr_mp3d_sample_t* pPCMFrames)\n{\n    if (pMP3->memory.pData != NULL && pMP3->memory.dataSize > 0) {\n        return ma_dr_mp3_decode_next_frame_ex__memory(pMP3, pPCMFrames);\n    } else {\n        return ma_dr_mp3_decode_next_frame_ex__callbacks(pMP3, pPCMFrames);\n    }\n}\nstatic ma_uint32 ma_dr_mp3_decode_next_frame(ma_dr_mp3* pMP3)\n{\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    return ma_dr_mp3_decode_next_frame_ex(pMP3, (ma_dr_mp3d_sample_t*)pMP3->pcmFrames);\n}\n#if 0\nstatic ma_uint32 ma_dr_mp3_seek_next_frame(ma_dr_mp3* pMP3)\n{\n    ma_uint32 pcmFrameCount;\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    pcmFrameCount = ma_dr_mp3_decode_next_frame_ex(pMP3, NULL);\n    if (pcmFrameCount == 0) {\n        return 0;\n    }\n    pMP3->currentPCMFrame             += pcmFrameCount;\n    pMP3->pcmFramesConsumedInMP3Frame  = pcmFrameCount;\n    pMP3->pcmFramesRemainingInMP3Frame = 0;\n    return pcmFrameCount;\n}\n#endif\nstatic ma_bool32 ma_dr_mp3_init_internal(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    MA_DR_MP3_ASSERT(onRead != NULL);\n    ma_dr_mp3dec_init(&pMP3->decoder);\n    pMP3->onRead = onRead;\n    pMP3->onSeek = onSeek;\n    pMP3->pUserData = pUserData;\n    pMP3->allocationCallbacks = ma_dr_mp3_copy_allocation_callbacks_or_defaults(pAllocationCallbacks);\n    if (pMP3->allocationCallbacks.onFree == NULL || (pMP3->allocationCallbacks.onMalloc == NULL && pMP3->allocationCallbacks.onRealloc == NULL)) {\n        return MA_FALSE;\n    }\n    if (ma_dr_mp3_decode_next_frame(pMP3) == 0) {\n        ma_dr_mp3__free_from_callbacks(pMP3->pData, &pMP3->allocationCallbacks);\n        return MA_FALSE;\n    }\n    pMP3->channels   = pMP3->mp3FrameChannels;\n    pMP3->sampleRate = pMP3->mp3FrameSampleRate;\n    return MA_TRUE;\n}\nMA_API ma_bool32 ma_dr_mp3_init(ma_dr_mp3* pMP3, ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pMP3 == NULL || onRead == NULL) {\n        return MA_FALSE;\n    }\n    MA_DR_MP3_ZERO_OBJECT(pMP3);\n    return ma_dr_mp3_init_internal(pMP3, onRead, onSeek, pUserData, pAllocationCallbacks);\n}\nstatic size_t ma_dr_mp3__on_read_memory(void* pUserData, void* pBufferOut, size_t bytesToRead)\n{\n    ma_dr_mp3* pMP3 = (ma_dr_mp3*)pUserData;\n    size_t bytesRemaining;\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    MA_DR_MP3_ASSERT(pMP3->memory.dataSize >= pMP3->memory.currentReadPos);\n    bytesRemaining = pMP3->memory.dataSize - pMP3->memory.currentReadPos;\n    if (bytesToRead > bytesRemaining) {\n        bytesToRead = bytesRemaining;\n    }\n    if (bytesToRead > 0) {\n        MA_DR_MP3_COPY_MEMORY(pBufferOut, pMP3->memory.pData + pMP3->memory.currentReadPos, bytesToRead);\n        pMP3->memory.currentReadPos += bytesToRead;\n    }\n    return bytesToRead;\n}\nstatic ma_bool32 ma_dr_mp3__on_seek_memory(void* pUserData, int byteOffset, ma_dr_mp3_seek_origin origin)\n{\n    ma_dr_mp3* pMP3 = (ma_dr_mp3*)pUserData;\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    if (origin == ma_dr_mp3_seek_origin_current) {\n        if (byteOffset > 0) {\n            if (pMP3->memory.currentReadPos + byteOffset > pMP3->memory.dataSize) {\n                byteOffset = (int)(pMP3->memory.dataSize - pMP3->memory.currentReadPos);\n            }\n        } else {\n            if (pMP3->memory.currentReadPos < (size_t)-byteOffset) {\n                byteOffset = -(int)pMP3->memory.currentReadPos;\n            }\n        }\n        pMP3->memory.currentReadPos += byteOffset;\n    } else {\n        if ((ma_uint32)byteOffset <= pMP3->memory.dataSize) {\n            pMP3->memory.currentReadPos = byteOffset;\n        } else {\n            pMP3->memory.currentReadPos = pMP3->memory.dataSize;\n        }\n    }\n    return MA_TRUE;\n}\nMA_API ma_bool32 ma_dr_mp3_init_memory(ma_dr_mp3* pMP3, const void* pData, size_t dataSize, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pMP3 == NULL) {\n        return MA_FALSE;\n    }\n    MA_DR_MP3_ZERO_OBJECT(pMP3);\n    if (pData == NULL || dataSize == 0) {\n        return MA_FALSE;\n    }\n    pMP3->memory.pData = (const ma_uint8*)pData;\n    pMP3->memory.dataSize = dataSize;\n    pMP3->memory.currentReadPos = 0;\n    return ma_dr_mp3_init_internal(pMP3, ma_dr_mp3__on_read_memory, ma_dr_mp3__on_seek_memory, pMP3, pAllocationCallbacks);\n}\n#ifndef MA_DR_MP3_NO_STDIO\n#include <stdio.h>\n#include <wchar.h>\nstatic size_t ma_dr_mp3__on_read_stdio(void* pUserData, void* pBufferOut, size_t bytesToRead)\n{\n    return fread(pBufferOut, 1, bytesToRead, (FILE*)pUserData);\n}\nstatic ma_bool32 ma_dr_mp3__on_seek_stdio(void* pUserData, int offset, ma_dr_mp3_seek_origin origin)\n{\n    return fseek((FILE*)pUserData, offset, (origin == ma_dr_mp3_seek_origin_current) ? SEEK_CUR : SEEK_SET) == 0;\n}\nMA_API ma_bool32 ma_dr_mp3_init_file(ma_dr_mp3* pMP3, const char* pFilePath, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_bool32 result;\n    FILE* pFile;\n    if (ma_fopen(&pFile, pFilePath, \"rb\") != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n    result = ma_dr_mp3_init(pMP3, ma_dr_mp3__on_read_stdio, ma_dr_mp3__on_seek_stdio, (void*)pFile, pAllocationCallbacks);\n    if (result != MA_TRUE) {\n        fclose(pFile);\n        return result;\n    }\n    return MA_TRUE;\n}\nMA_API ma_bool32 ma_dr_mp3_init_file_w(ma_dr_mp3* pMP3, const wchar_t* pFilePath, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_bool32 result;\n    FILE* pFile;\n    if (ma_wfopen(&pFile, pFilePath, L\"rb\", pAllocationCallbacks) != MA_SUCCESS) {\n        return MA_FALSE;\n    }\n    result = ma_dr_mp3_init(pMP3, ma_dr_mp3__on_read_stdio, ma_dr_mp3__on_seek_stdio, (void*)pFile, pAllocationCallbacks);\n    if (result != MA_TRUE) {\n        fclose(pFile);\n        return result;\n    }\n    return MA_TRUE;\n}\n#endif\nMA_API void ma_dr_mp3_uninit(ma_dr_mp3* pMP3)\n{\n    if (pMP3 == NULL) {\n        return;\n    }\n#ifndef MA_DR_MP3_NO_STDIO\n    if (pMP3->onRead == ma_dr_mp3__on_read_stdio) {\n        FILE* pFile = (FILE*)pMP3->pUserData;\n        if (pFile != NULL) {\n            fclose(pFile);\n            pMP3->pUserData = NULL;\n        }\n    }\n#endif\n    ma_dr_mp3__free_from_callbacks(pMP3->pData, &pMP3->allocationCallbacks);\n}\n#if defined(MA_DR_MP3_FLOAT_OUTPUT)\nstatic void ma_dr_mp3_f32_to_s16(ma_int16* dst, const float* src, ma_uint64 sampleCount)\n{\n    ma_uint64 i;\n    ma_uint64 i4;\n    ma_uint64 sampleCount4;\n    i = 0;\n    sampleCount4 = sampleCount >> 2;\n    for (i4 = 0; i4 < sampleCount4; i4 += 1) {\n        float x0 = src[i+0];\n        float x1 = src[i+1];\n        float x2 = src[i+2];\n        float x3 = src[i+3];\n        x0 = ((x0 < -1) ? -1 : ((x0 > 1) ? 1 : x0));\n        x1 = ((x1 < -1) ? -1 : ((x1 > 1) ? 1 : x1));\n        x2 = ((x2 < -1) ? -1 : ((x2 > 1) ? 1 : x2));\n        x3 = ((x3 < -1) ? -1 : ((x3 > 1) ? 1 : x3));\n        x0 = x0 * 32767.0f;\n        x1 = x1 * 32767.0f;\n        x2 = x2 * 32767.0f;\n        x3 = x3 * 32767.0f;\n        dst[i+0] = (ma_int16)x0;\n        dst[i+1] = (ma_int16)x1;\n        dst[i+2] = (ma_int16)x2;\n        dst[i+3] = (ma_int16)x3;\n        i += 4;\n    }\n    for (; i < sampleCount; i += 1) {\n        float x = src[i];\n        x = ((x < -1) ? -1 : ((x > 1) ? 1 : x));\n        x = x * 32767.0f;\n        dst[i] = (ma_int16)x;\n    }\n}\n#endif\n#if !defined(MA_DR_MP3_FLOAT_OUTPUT)\nstatic void ma_dr_mp3_s16_to_f32(float* dst, const ma_int16* src, ma_uint64 sampleCount)\n{\n    ma_uint64 i;\n    for (i = 0; i < sampleCount; i += 1) {\n        float x = (float)src[i];\n        x = x * 0.000030517578125f;\n        dst[i] = x;\n    }\n}\n#endif\nstatic ma_uint64 ma_dr_mp3_read_pcm_frames_raw(ma_dr_mp3* pMP3, ma_uint64 framesToRead, void* pBufferOut)\n{\n    ma_uint64 totalFramesRead = 0;\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    MA_DR_MP3_ASSERT(pMP3->onRead != NULL);\n    while (framesToRead > 0) {\n        ma_uint32 framesToConsume = (ma_uint32)MA_DR_MP3_MIN(pMP3->pcmFramesRemainingInMP3Frame, framesToRead);\n        if (pBufferOut != NULL) {\n        #if defined(MA_DR_MP3_FLOAT_OUTPUT)\n            float* pFramesOutF32 = (float*)MA_DR_MP3_OFFSET_PTR(pBufferOut,          sizeof(float) * totalFramesRead                   * pMP3->channels);\n            float* pFramesInF32  = (float*)MA_DR_MP3_OFFSET_PTR(&pMP3->pcmFrames[0], sizeof(float) * pMP3->pcmFramesConsumedInMP3Frame * pMP3->mp3FrameChannels);\n            MA_DR_MP3_COPY_MEMORY(pFramesOutF32, pFramesInF32, sizeof(float) * framesToConsume * pMP3->channels);\n        #else\n            ma_int16* pFramesOutS16 = (ma_int16*)MA_DR_MP3_OFFSET_PTR(pBufferOut,          sizeof(ma_int16) * totalFramesRead                   * pMP3->channels);\n            ma_int16* pFramesInS16  = (ma_int16*)MA_DR_MP3_OFFSET_PTR(&pMP3->pcmFrames[0], sizeof(ma_int16) * pMP3->pcmFramesConsumedInMP3Frame * pMP3->mp3FrameChannels);\n            MA_DR_MP3_COPY_MEMORY(pFramesOutS16, pFramesInS16, sizeof(ma_int16) * framesToConsume * pMP3->channels);\n        #endif\n        }\n        pMP3->currentPCMFrame              += framesToConsume;\n        pMP3->pcmFramesConsumedInMP3Frame  += framesToConsume;\n        pMP3->pcmFramesRemainingInMP3Frame -= framesToConsume;\n        totalFramesRead                    += framesToConsume;\n        framesToRead                       -= framesToConsume;\n        if (framesToRead == 0) {\n            break;\n        }\n        MA_DR_MP3_ASSERT(pMP3->pcmFramesRemainingInMP3Frame == 0);\n        if (ma_dr_mp3_decode_next_frame(pMP3) == 0) {\n            break;\n        }\n    }\n    return totalFramesRead;\n}\nMA_API ma_uint64 ma_dr_mp3_read_pcm_frames_f32(ma_dr_mp3* pMP3, ma_uint64 framesToRead, float* pBufferOut)\n{\n    if (pMP3 == NULL || pMP3->onRead == NULL) {\n        return 0;\n    }\n#if defined(MA_DR_MP3_FLOAT_OUTPUT)\n    return ma_dr_mp3_read_pcm_frames_raw(pMP3, framesToRead, pBufferOut);\n#else\n    {\n        ma_int16 pTempS16[8192];\n        ma_uint64 totalPCMFramesRead = 0;\n        while (totalPCMFramesRead < framesToRead) {\n            ma_uint64 framesJustRead;\n            ma_uint64 framesRemaining = framesToRead - totalPCMFramesRead;\n            ma_uint64 framesToReadNow = MA_DR_MP3_COUNTOF(pTempS16) / pMP3->channels;\n            if (framesToReadNow > framesRemaining) {\n                framesToReadNow = framesRemaining;\n            }\n            framesJustRead = ma_dr_mp3_read_pcm_frames_raw(pMP3, framesToReadNow, pTempS16);\n            if (framesJustRead == 0) {\n                break;\n            }\n            ma_dr_mp3_s16_to_f32((float*)MA_DR_MP3_OFFSET_PTR(pBufferOut, sizeof(float) * totalPCMFramesRead * pMP3->channels), pTempS16, framesJustRead * pMP3->channels);\n            totalPCMFramesRead += framesJustRead;\n        }\n        return totalPCMFramesRead;\n    }\n#endif\n}\nMA_API ma_uint64 ma_dr_mp3_read_pcm_frames_s16(ma_dr_mp3* pMP3, ma_uint64 framesToRead, ma_int16* pBufferOut)\n{\n    if (pMP3 == NULL || pMP3->onRead == NULL) {\n        return 0;\n    }\n#if !defined(MA_DR_MP3_FLOAT_OUTPUT)\n    return ma_dr_mp3_read_pcm_frames_raw(pMP3, framesToRead, pBufferOut);\n#else\n    {\n        float pTempF32[4096];\n        ma_uint64 totalPCMFramesRead = 0;\n        while (totalPCMFramesRead < framesToRead) {\n            ma_uint64 framesJustRead;\n            ma_uint64 framesRemaining = framesToRead - totalPCMFramesRead;\n            ma_uint64 framesToReadNow = MA_DR_MP3_COUNTOF(pTempF32) / pMP3->channels;\n            if (framesToReadNow > framesRemaining) {\n                framesToReadNow = framesRemaining;\n            }\n            framesJustRead = ma_dr_mp3_read_pcm_frames_raw(pMP3, framesToReadNow, pTempF32);\n            if (framesJustRead == 0) {\n                break;\n            }\n            ma_dr_mp3_f32_to_s16((ma_int16*)MA_DR_MP3_OFFSET_PTR(pBufferOut, sizeof(ma_int16) * totalPCMFramesRead * pMP3->channels), pTempF32, framesJustRead * pMP3->channels);\n            totalPCMFramesRead += framesJustRead;\n        }\n        return totalPCMFramesRead;\n    }\n#endif\n}\nstatic void ma_dr_mp3_reset(ma_dr_mp3* pMP3)\n{\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    pMP3->pcmFramesConsumedInMP3Frame = 0;\n    pMP3->pcmFramesRemainingInMP3Frame = 0;\n    pMP3->currentPCMFrame = 0;\n    pMP3->dataSize = 0;\n    pMP3->atEnd = MA_FALSE;\n    ma_dr_mp3dec_init(&pMP3->decoder);\n}\nstatic ma_bool32 ma_dr_mp3_seek_to_start_of_stream(ma_dr_mp3* pMP3)\n{\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    MA_DR_MP3_ASSERT(pMP3->onSeek != NULL);\n    if (!ma_dr_mp3__on_seek(pMP3, 0, ma_dr_mp3_seek_origin_start)) {\n        return MA_FALSE;\n    }\n    ma_dr_mp3_reset(pMP3);\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_mp3_seek_forward_by_pcm_frames__brute_force(ma_dr_mp3* pMP3, ma_uint64 frameOffset)\n{\n    ma_uint64 framesRead;\n#if defined(MA_DR_MP3_FLOAT_OUTPUT)\n    framesRead = ma_dr_mp3_read_pcm_frames_f32(pMP3, frameOffset, NULL);\n#else\n    framesRead = ma_dr_mp3_read_pcm_frames_s16(pMP3, frameOffset, NULL);\n#endif\n    if (framesRead != frameOffset) {\n        return MA_FALSE;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_mp3_seek_to_pcm_frame__brute_force(ma_dr_mp3* pMP3, ma_uint64 frameIndex)\n{\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    if (frameIndex == pMP3->currentPCMFrame) {\n        return MA_TRUE;\n    }\n    if (frameIndex < pMP3->currentPCMFrame) {\n        if (!ma_dr_mp3_seek_to_start_of_stream(pMP3)) {\n            return MA_FALSE;\n        }\n    }\n    MA_DR_MP3_ASSERT(frameIndex >= pMP3->currentPCMFrame);\n    return ma_dr_mp3_seek_forward_by_pcm_frames__brute_force(pMP3, (frameIndex - pMP3->currentPCMFrame));\n}\nstatic ma_bool32 ma_dr_mp3_find_closest_seek_point(ma_dr_mp3* pMP3, ma_uint64 frameIndex, ma_uint32* pSeekPointIndex)\n{\n    ma_uint32 iSeekPoint;\n    MA_DR_MP3_ASSERT(pSeekPointIndex != NULL);\n    *pSeekPointIndex = 0;\n    if (frameIndex < pMP3->pSeekPoints[0].pcmFrameIndex) {\n        return MA_FALSE;\n    }\n    for (iSeekPoint = 0; iSeekPoint < pMP3->seekPointCount; ++iSeekPoint) {\n        if (pMP3->pSeekPoints[iSeekPoint].pcmFrameIndex > frameIndex) {\n            break;\n        }\n        *pSeekPointIndex = iSeekPoint;\n    }\n    return MA_TRUE;\n}\nstatic ma_bool32 ma_dr_mp3_seek_to_pcm_frame__seek_table(ma_dr_mp3* pMP3, ma_uint64 frameIndex)\n{\n    ma_dr_mp3_seek_point seekPoint;\n    ma_uint32 priorSeekPointIndex;\n    ma_uint16 iMP3Frame;\n    ma_uint64 leftoverFrames;\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    MA_DR_MP3_ASSERT(pMP3->pSeekPoints != NULL);\n    MA_DR_MP3_ASSERT(pMP3->seekPointCount > 0);\n    if (ma_dr_mp3_find_closest_seek_point(pMP3, frameIndex, &priorSeekPointIndex)) {\n        seekPoint = pMP3->pSeekPoints[priorSeekPointIndex];\n    } else {\n        seekPoint.seekPosInBytes     = 0;\n        seekPoint.pcmFrameIndex      = 0;\n        seekPoint.mp3FramesToDiscard = 0;\n        seekPoint.pcmFramesToDiscard = 0;\n    }\n    if (!ma_dr_mp3__on_seek_64(pMP3, seekPoint.seekPosInBytes, ma_dr_mp3_seek_origin_start)) {\n        return MA_FALSE;\n    }\n    ma_dr_mp3_reset(pMP3);\n    for (iMP3Frame = 0; iMP3Frame < seekPoint.mp3FramesToDiscard; ++iMP3Frame) {\n        ma_uint32 pcmFramesRead;\n        ma_dr_mp3d_sample_t* pPCMFrames;\n        pPCMFrames = NULL;\n        if (iMP3Frame == seekPoint.mp3FramesToDiscard-1) {\n            pPCMFrames = (ma_dr_mp3d_sample_t*)pMP3->pcmFrames;\n        }\n        pcmFramesRead = ma_dr_mp3_decode_next_frame_ex(pMP3, pPCMFrames);\n        if (pcmFramesRead == 0) {\n            return MA_FALSE;\n        }\n    }\n    pMP3->currentPCMFrame = seekPoint.pcmFrameIndex - seekPoint.pcmFramesToDiscard;\n    leftoverFrames = frameIndex - pMP3->currentPCMFrame;\n    return ma_dr_mp3_seek_forward_by_pcm_frames__brute_force(pMP3, leftoverFrames);\n}\nMA_API ma_bool32 ma_dr_mp3_seek_to_pcm_frame(ma_dr_mp3* pMP3, ma_uint64 frameIndex)\n{\n    if (pMP3 == NULL || pMP3->onSeek == NULL) {\n        return MA_FALSE;\n    }\n    if (frameIndex == 0) {\n        return ma_dr_mp3_seek_to_start_of_stream(pMP3);\n    }\n    if (pMP3->pSeekPoints != NULL && pMP3->seekPointCount > 0) {\n        return ma_dr_mp3_seek_to_pcm_frame__seek_table(pMP3, frameIndex);\n    } else {\n        return ma_dr_mp3_seek_to_pcm_frame__brute_force(pMP3, frameIndex);\n    }\n}\nMA_API ma_bool32 ma_dr_mp3_get_mp3_and_pcm_frame_count(ma_dr_mp3* pMP3, ma_uint64* pMP3FrameCount, ma_uint64* pPCMFrameCount)\n{\n    ma_uint64 currentPCMFrame;\n    ma_uint64 totalPCMFrameCount;\n    ma_uint64 totalMP3FrameCount;\n    if (pMP3 == NULL) {\n        return MA_FALSE;\n    }\n    if (pMP3->onSeek == NULL) {\n        return MA_FALSE;\n    }\n    currentPCMFrame = pMP3->currentPCMFrame;\n    if (!ma_dr_mp3_seek_to_start_of_stream(pMP3)) {\n        return MA_FALSE;\n    }\n    totalPCMFrameCount = 0;\n    totalMP3FrameCount = 0;\n    for (;;) {\n        ma_uint32 pcmFramesInCurrentMP3Frame;\n        pcmFramesInCurrentMP3Frame = ma_dr_mp3_decode_next_frame_ex(pMP3, NULL);\n        if (pcmFramesInCurrentMP3Frame == 0) {\n            break;\n        }\n        totalPCMFrameCount += pcmFramesInCurrentMP3Frame;\n        totalMP3FrameCount += 1;\n    }\n    if (!ma_dr_mp3_seek_to_start_of_stream(pMP3)) {\n        return MA_FALSE;\n    }\n    if (!ma_dr_mp3_seek_to_pcm_frame(pMP3, currentPCMFrame)) {\n        return MA_FALSE;\n    }\n    if (pMP3FrameCount != NULL) {\n        *pMP3FrameCount = totalMP3FrameCount;\n    }\n    if (pPCMFrameCount != NULL) {\n        *pPCMFrameCount = totalPCMFrameCount;\n    }\n    return MA_TRUE;\n}\nMA_API ma_uint64 ma_dr_mp3_get_pcm_frame_count(ma_dr_mp3* pMP3)\n{\n    ma_uint64 totalPCMFrameCount;\n    if (!ma_dr_mp3_get_mp3_and_pcm_frame_count(pMP3, NULL, &totalPCMFrameCount)) {\n        return 0;\n    }\n    return totalPCMFrameCount;\n}\nMA_API ma_uint64 ma_dr_mp3_get_mp3_frame_count(ma_dr_mp3* pMP3)\n{\n    ma_uint64 totalMP3FrameCount;\n    if (!ma_dr_mp3_get_mp3_and_pcm_frame_count(pMP3, &totalMP3FrameCount, NULL)) {\n        return 0;\n    }\n    return totalMP3FrameCount;\n}\nstatic void ma_dr_mp3__accumulate_running_pcm_frame_count(ma_dr_mp3* pMP3, ma_uint32 pcmFrameCountIn, ma_uint64* pRunningPCMFrameCount, float* pRunningPCMFrameCountFractionalPart)\n{\n    float srcRatio;\n    float pcmFrameCountOutF;\n    ma_uint32 pcmFrameCountOut;\n    srcRatio = (float)pMP3->mp3FrameSampleRate / (float)pMP3->sampleRate;\n    MA_DR_MP3_ASSERT(srcRatio > 0);\n    pcmFrameCountOutF = *pRunningPCMFrameCountFractionalPart + (pcmFrameCountIn / srcRatio);\n    pcmFrameCountOut  = (ma_uint32)pcmFrameCountOutF;\n    *pRunningPCMFrameCountFractionalPart = pcmFrameCountOutF - pcmFrameCountOut;\n    *pRunningPCMFrameCount += pcmFrameCountOut;\n}\ntypedef struct\n{\n    ma_uint64 bytePos;\n    ma_uint64 pcmFrameIndex;\n} ma_dr_mp3__seeking_mp3_frame_info;\nMA_API ma_bool32 ma_dr_mp3_calculate_seek_points(ma_dr_mp3* pMP3, ma_uint32* pSeekPointCount, ma_dr_mp3_seek_point* pSeekPoints)\n{\n    ma_uint32 seekPointCount;\n    ma_uint64 currentPCMFrame;\n    ma_uint64 totalMP3FrameCount;\n    ma_uint64 totalPCMFrameCount;\n    if (pMP3 == NULL || pSeekPointCount == NULL || pSeekPoints == NULL) {\n        return MA_FALSE;\n    }\n    seekPointCount = *pSeekPointCount;\n    if (seekPointCount == 0) {\n        return MA_FALSE;\n    }\n    currentPCMFrame = pMP3->currentPCMFrame;\n    if (!ma_dr_mp3_get_mp3_and_pcm_frame_count(pMP3, &totalMP3FrameCount, &totalPCMFrameCount)) {\n        return MA_FALSE;\n    }\n    if (totalMP3FrameCount < MA_DR_MP3_SEEK_LEADING_MP3_FRAMES+1) {\n        seekPointCount = 1;\n        pSeekPoints[0].seekPosInBytes     = 0;\n        pSeekPoints[0].pcmFrameIndex      = 0;\n        pSeekPoints[0].mp3FramesToDiscard = 0;\n        pSeekPoints[0].pcmFramesToDiscard = 0;\n    } else {\n        ma_uint64 pcmFramesBetweenSeekPoints;\n        ma_dr_mp3__seeking_mp3_frame_info mp3FrameInfo[MA_DR_MP3_SEEK_LEADING_MP3_FRAMES+1];\n        ma_uint64 runningPCMFrameCount = 0;\n        float runningPCMFrameCountFractionalPart = 0;\n        ma_uint64 nextTargetPCMFrame;\n        ma_uint32 iMP3Frame;\n        ma_uint32 iSeekPoint;\n        if (seekPointCount > totalMP3FrameCount-1) {\n            seekPointCount = (ma_uint32)totalMP3FrameCount-1;\n        }\n        pcmFramesBetweenSeekPoints = totalPCMFrameCount / (seekPointCount+1);\n        if (!ma_dr_mp3_seek_to_start_of_stream(pMP3)) {\n            return MA_FALSE;\n        }\n        for (iMP3Frame = 0; iMP3Frame < MA_DR_MP3_SEEK_LEADING_MP3_FRAMES+1; ++iMP3Frame) {\n            ma_uint32 pcmFramesInCurrentMP3FrameIn;\n            MA_DR_MP3_ASSERT(pMP3->streamCursor >= pMP3->dataSize);\n            mp3FrameInfo[iMP3Frame].bytePos       = pMP3->streamCursor - pMP3->dataSize;\n            mp3FrameInfo[iMP3Frame].pcmFrameIndex = runningPCMFrameCount;\n            pcmFramesInCurrentMP3FrameIn = ma_dr_mp3_decode_next_frame_ex(pMP3, NULL);\n            if (pcmFramesInCurrentMP3FrameIn == 0) {\n                return MA_FALSE;\n            }\n            ma_dr_mp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);\n        }\n        nextTargetPCMFrame = 0;\n        for (iSeekPoint = 0; iSeekPoint < seekPointCount; ++iSeekPoint) {\n            nextTargetPCMFrame += pcmFramesBetweenSeekPoints;\n            for (;;) {\n                if (nextTargetPCMFrame < runningPCMFrameCount) {\n                    pSeekPoints[iSeekPoint].seekPosInBytes     = mp3FrameInfo[0].bytePos;\n                    pSeekPoints[iSeekPoint].pcmFrameIndex      = nextTargetPCMFrame;\n                    pSeekPoints[iSeekPoint].mp3FramesToDiscard = MA_DR_MP3_SEEK_LEADING_MP3_FRAMES;\n                    pSeekPoints[iSeekPoint].pcmFramesToDiscard = (ma_uint16)(nextTargetPCMFrame - mp3FrameInfo[MA_DR_MP3_SEEK_LEADING_MP3_FRAMES-1].pcmFrameIndex);\n                    break;\n                } else {\n                    size_t i;\n                    ma_uint32 pcmFramesInCurrentMP3FrameIn;\n                    for (i = 0; i < MA_DR_MP3_COUNTOF(mp3FrameInfo)-1; ++i) {\n                        mp3FrameInfo[i] = mp3FrameInfo[i+1];\n                    }\n                    mp3FrameInfo[MA_DR_MP3_COUNTOF(mp3FrameInfo)-1].bytePos       = pMP3->streamCursor - pMP3->dataSize;\n                    mp3FrameInfo[MA_DR_MP3_COUNTOF(mp3FrameInfo)-1].pcmFrameIndex = runningPCMFrameCount;\n                    pcmFramesInCurrentMP3FrameIn = ma_dr_mp3_decode_next_frame_ex(pMP3, NULL);\n                    if (pcmFramesInCurrentMP3FrameIn == 0) {\n                        pSeekPoints[iSeekPoint].seekPosInBytes     = mp3FrameInfo[0].bytePos;\n                        pSeekPoints[iSeekPoint].pcmFrameIndex      = nextTargetPCMFrame;\n                        pSeekPoints[iSeekPoint].mp3FramesToDiscard = MA_DR_MP3_SEEK_LEADING_MP3_FRAMES;\n                        pSeekPoints[iSeekPoint].pcmFramesToDiscard = (ma_uint16)(nextTargetPCMFrame - mp3FrameInfo[MA_DR_MP3_SEEK_LEADING_MP3_FRAMES-1].pcmFrameIndex);\n                        break;\n                    }\n                    ma_dr_mp3__accumulate_running_pcm_frame_count(pMP3, pcmFramesInCurrentMP3FrameIn, &runningPCMFrameCount, &runningPCMFrameCountFractionalPart);\n                }\n            }\n        }\n        if (!ma_dr_mp3_seek_to_start_of_stream(pMP3)) {\n            return MA_FALSE;\n        }\n        if (!ma_dr_mp3_seek_to_pcm_frame(pMP3, currentPCMFrame)) {\n            return MA_FALSE;\n        }\n    }\n    *pSeekPointCount = seekPointCount;\n    return MA_TRUE;\n}\nMA_API ma_bool32 ma_dr_mp3_bind_seek_table(ma_dr_mp3* pMP3, ma_uint32 seekPointCount, ma_dr_mp3_seek_point* pSeekPoints)\n{\n    if (pMP3 == NULL) {\n        return MA_FALSE;\n    }\n    if (seekPointCount == 0 || pSeekPoints == NULL) {\n        pMP3->seekPointCount = 0;\n        pMP3->pSeekPoints = NULL;\n    } else {\n        pMP3->seekPointCount = seekPointCount;\n        pMP3->pSeekPoints = pSeekPoints;\n    }\n    return MA_TRUE;\n}\nstatic float* ma_dr_mp3__full_read_and_close_f32(ma_dr_mp3* pMP3, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount)\n{\n    ma_uint64 totalFramesRead = 0;\n    ma_uint64 framesCapacity = 0;\n    float* pFrames = NULL;\n    float temp[4096];\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    for (;;) {\n        ma_uint64 framesToReadRightNow = MA_DR_MP3_COUNTOF(temp) / pMP3->channels;\n        ma_uint64 framesJustRead = ma_dr_mp3_read_pcm_frames_f32(pMP3, framesToReadRightNow, temp);\n        if (framesJustRead == 0) {\n            break;\n        }\n        if (framesCapacity < totalFramesRead + framesJustRead) {\n            ma_uint64 oldFramesBufferSize;\n            ma_uint64 newFramesBufferSize;\n            ma_uint64 newFramesCap;\n            float* pNewFrames;\n            newFramesCap = framesCapacity * 2;\n            if (newFramesCap < totalFramesRead + framesJustRead) {\n                newFramesCap = totalFramesRead + framesJustRead;\n            }\n            oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(float);\n            newFramesBufferSize = newFramesCap   * pMP3->channels * sizeof(float);\n            if (newFramesBufferSize > (ma_uint64)MA_SIZE_MAX) {\n                break;\n            }\n            pNewFrames = (float*)ma_dr_mp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks);\n            if (pNewFrames == NULL) {\n                ma_dr_mp3__free_from_callbacks(pFrames, &pMP3->allocationCallbacks);\n                break;\n            }\n            pFrames = pNewFrames;\n            framesCapacity = newFramesCap;\n        }\n        MA_DR_MP3_COPY_MEMORY(pFrames + totalFramesRead*pMP3->channels, temp, (size_t)(framesJustRead*pMP3->channels*sizeof(float)));\n        totalFramesRead += framesJustRead;\n        if (framesJustRead != framesToReadRightNow) {\n            break;\n        }\n    }\n    if (pConfig != NULL) {\n        pConfig->channels   = pMP3->channels;\n        pConfig->sampleRate = pMP3->sampleRate;\n    }\n    ma_dr_mp3_uninit(pMP3);\n    if (pTotalFrameCount) {\n        *pTotalFrameCount = totalFramesRead;\n    }\n    return pFrames;\n}\nstatic ma_int16* ma_dr_mp3__full_read_and_close_s16(ma_dr_mp3* pMP3, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount)\n{\n    ma_uint64 totalFramesRead = 0;\n    ma_uint64 framesCapacity = 0;\n    ma_int16* pFrames = NULL;\n    ma_int16 temp[4096];\n    MA_DR_MP3_ASSERT(pMP3 != NULL);\n    for (;;) {\n        ma_uint64 framesToReadRightNow = MA_DR_MP3_COUNTOF(temp) / pMP3->channels;\n        ma_uint64 framesJustRead = ma_dr_mp3_read_pcm_frames_s16(pMP3, framesToReadRightNow, temp);\n        if (framesJustRead == 0) {\n            break;\n        }\n        if (framesCapacity < totalFramesRead + framesJustRead) {\n            ma_uint64 newFramesBufferSize;\n            ma_uint64 oldFramesBufferSize;\n            ma_uint64 newFramesCap;\n            ma_int16* pNewFrames;\n            newFramesCap = framesCapacity * 2;\n            if (newFramesCap < totalFramesRead + framesJustRead) {\n                newFramesCap = totalFramesRead + framesJustRead;\n            }\n            oldFramesBufferSize = framesCapacity * pMP3->channels * sizeof(ma_int16);\n            newFramesBufferSize = newFramesCap   * pMP3->channels * sizeof(ma_int16);\n            if (newFramesBufferSize > (ma_uint64)MA_SIZE_MAX) {\n                break;\n            }\n            pNewFrames = (ma_int16*)ma_dr_mp3__realloc_from_callbacks(pFrames, (size_t)newFramesBufferSize, (size_t)oldFramesBufferSize, &pMP3->allocationCallbacks);\n            if (pNewFrames == NULL) {\n                ma_dr_mp3__free_from_callbacks(pFrames, &pMP3->allocationCallbacks);\n                break;\n            }\n            pFrames = pNewFrames;\n            framesCapacity = newFramesCap;\n        }\n        MA_DR_MP3_COPY_MEMORY(pFrames + totalFramesRead*pMP3->channels, temp, (size_t)(framesJustRead*pMP3->channels*sizeof(ma_int16)));\n        totalFramesRead += framesJustRead;\n        if (framesJustRead != framesToReadRightNow) {\n            break;\n        }\n    }\n    if (pConfig != NULL) {\n        pConfig->channels   = pMP3->channels;\n        pConfig->sampleRate = pMP3->sampleRate;\n    }\n    ma_dr_mp3_uninit(pMP3);\n    if (pTotalFrameCount) {\n        *pTotalFrameCount = totalFramesRead;\n    }\n    return pFrames;\n}\nMA_API float* ma_dr_mp3_open_and_read_pcm_frames_f32(ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_mp3 mp3;\n    if (!ma_dr_mp3_init(&mp3, onRead, onSeek, pUserData, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_mp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);\n}\nMA_API ma_int16* ma_dr_mp3_open_and_read_pcm_frames_s16(ma_dr_mp3_read_proc onRead, ma_dr_mp3_seek_proc onSeek, void* pUserData, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_mp3 mp3;\n    if (!ma_dr_mp3_init(&mp3, onRead, onSeek, pUserData, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_mp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);\n}\nMA_API float* ma_dr_mp3_open_memory_and_read_pcm_frames_f32(const void* pData, size_t dataSize, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_mp3 mp3;\n    if (!ma_dr_mp3_init_memory(&mp3, pData, dataSize, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_mp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);\n}\nMA_API ma_int16* ma_dr_mp3_open_memory_and_read_pcm_frames_s16(const void* pData, size_t dataSize, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_mp3 mp3;\n    if (!ma_dr_mp3_init_memory(&mp3, pData, dataSize, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_mp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);\n}\n#ifndef MA_DR_MP3_NO_STDIO\nMA_API float* ma_dr_mp3_open_file_and_read_pcm_frames_f32(const char* filePath, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_mp3 mp3;\n    if (!ma_dr_mp3_init_file(&mp3, filePath, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_mp3__full_read_and_close_f32(&mp3, pConfig, pTotalFrameCount);\n}\nMA_API ma_int16* ma_dr_mp3_open_file_and_read_pcm_frames_s16(const char* filePath, ma_dr_mp3_config* pConfig, ma_uint64* pTotalFrameCount, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    ma_dr_mp3 mp3;\n    if (!ma_dr_mp3_init_file(&mp3, filePath, pAllocationCallbacks)) {\n        return NULL;\n    }\n    return ma_dr_mp3__full_read_and_close_s16(&mp3, pConfig, pTotalFrameCount);\n}\n#endif\nMA_API void* ma_dr_mp3_malloc(size_t sz, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks != NULL) {\n        return ma_dr_mp3__malloc_from_callbacks(sz, pAllocationCallbacks);\n    } else {\n        return ma_dr_mp3__malloc_default(sz, NULL);\n    }\n}\nMA_API void ma_dr_mp3_free(void* p, const ma_allocation_callbacks* pAllocationCallbacks)\n{\n    if (pAllocationCallbacks != NULL) {\n        ma_dr_mp3__free_from_callbacks(p, pAllocationCallbacks);\n    } else {\n        ma_dr_mp3__free_default(p, NULL);\n    }\n}\n#endif\n/* dr_mp3_c end */\n#endif  /* MA_DR_MP3_IMPLEMENTATION */\n#endif  /* MA_NO_MP3 */\n\n\n/* End globally disabled warnings. */\n#if defined(_MSC_VER)\n    #pragma warning(pop)\n#endif\n\n#endif  /* miniaudio_c */\n#endif  /* MINIAUDIO_IMPLEMENTATION */\n\n\n/*\nThis software is available as a choice of the following licenses. Choose\nwhichever you prefer.\n\n===============================================================================\nALTERNATIVE 1 - Public Domain (www.unlicense.org)\n===============================================================================\nThis is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, compile, sell, or distribute this\nsoftware, either in source code form or as a compiled binary, for any purpose,\ncommercial or non-commercial, and by any means.\n\nIn jurisdictions that recognize copyright laws, the author or authors of this\nsoftware dedicate any and all copyright interest in the software to the public\ndomain. We make this dedication for the benefit of the public at large and to\nthe detriment of our heirs and successors. We intend this dedication to be an\novert act of relinquishment in perpetuity of all present and future rights to\nthis software under copyright law.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nFor more information, please refer to <http://unlicense.org/>\n\n===============================================================================\nALTERNATIVE 2 - MIT No Attribution\n===============================================================================\nCopyright 2023 David Reid\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/pffft/pffft.c",
    "content": "/* Copyright (c) 2013  Julien Pommier ( pommier@modartt.com )\n\n   Based on original fortran 77 code from FFTPACKv4 from NETLIB\n   (http://www.netlib.org/fftpack), authored by Dr Paul Swarztrauber\n   of NCAR, in 1985.\n\n   As confirmed by the NCAR fftpack software curators, the following\n   FFTPACKv5 license applies to FFTPACKv4 sources. My changes are\n   released under the same terms.\n\n   FFTPACK license:\n\n   http://www.cisl.ucar.edu/css/software/fftpack5/ftpk.html\n\n   Copyright (c) 2004 the University Corporation for Atmospheric\n   Research (\"UCAR\"). All rights reserved. Developed by NCAR's\n   Computational and Information Systems Laboratory, UCAR,\n   www.cisl.ucar.edu.\n\n   Redistribution and use of the Software in source and binary forms,\n   with or without modification, is permitted provided that the\n   following conditions are met:\n\n   - Neither the names of NCAR's Computational and Information Systems\n   Laboratory, the University Corporation for Atmospheric Research,\n   nor the names of its sponsors or contributors may be used to\n   endorse or promote products derived from this Software without\n   specific prior written permission.\n\n   - Redistributions of source code must retain the above copyright\n   notices, this list of conditions, and the disclaimer below.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions, and the disclaimer below in the\n   documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n   EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF\n   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n   NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT\n   HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\n   SOFTWARE.\n\n\n   PFFFT : a Pretty Fast FFT.\n\n   This file is largerly based on the original FFTPACK implementation, modified in\n   order to take advantage of SIMD instructions of modern CPUs.\n*/\n\n/*\n  ChangeLog:\n  - 2011/10/02, version 1: This is the very first release of this file.\n*/\n\n#ifndef _USE_MATH_DEFINES\n#  define _USE_MATH_DEFINES // ask gently MSVC to define M_PI, M_SQRT2 etc.\n#endif\n\n#include <audioapi/libs/pffft/pffft.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <math.h>\n#include <assert.h>\n\n/* detect compiler flavour */\n#if defined(_MSC_VER)\n#  define COMPILER_MSVC\n#elif defined(__GNUC__)\n#  define COMPILER_GCC\n#endif\n\n#if defined(COMPILER_GCC)\n#  define ALWAYS_INLINE(return_type) inline return_type __attribute__ ((always_inline))\n#  define NEVER_INLINE(return_type) return_type __attribute__ ((noinline))\n#  define RESTRICT __restrict\n#  define VLA_ARRAY_ON_STACK(type__, varname__, size__) type__ varname__[size__];\n#elif defined(COMPILER_MSVC)\n#  define ALWAYS_INLINE(return_type) __forceinline return_type\n#  define NEVER_INLINE(return_type) __declspec(noinline) return_type\n#  define RESTRICT __restrict\n#  define VLA_ARRAY_ON_STACK(type__, varname__, size__) type__ *varname__ = (type__*)_alloca(size__ * sizeof(type__))\n#endif\n\n\n/*\n  vector support macros: the rest of the code is independant of\n  SSE/Altivec/NEON -- adding support for other platforms with 4-element\n  vectors should be limited to these macros\n*/\n\n\n// define PFFFT_SIMD_DISABLE if you want to use scalar code instead of simd code\n//#define PFFFT_SIMD_DISABLE\n\n/* select which SIMD intrinsics will be used */\n#if !defined(PFFFT_SIMD_DISABLE)\n#  if (defined(__ppc__) || defined(__ppc64__) || defined(__powerpc__) || defined(__powerpc64__)) \\\n   && (defined(__VEC__) || defined(__ALTIVEC__))\n#    define PFFFT_SIMD_ALTIVEC\n#  elif defined(__ARM_NEON) || defined(__aarch64__) || defined(__arm64)  \\\n   || defined(_M_ARM64) || defined(_M_ARM64EC) || defined(__wasm_simd128__)\n     // we test _M_ARM64EC before _M_X64 because when _M_ARM64EC is defined, the microsoft compiler also defines _M_X64\n#    define PFFFT_SIMD_NEON\n#  elif defined(__x86_64__) || defined(__SSE__) || defined(_M_X64) || (defined(_M_IX86_FP) && _M_IX86_FP >= 1)\n#    define PFFFT_SIMD_SSE\n#   endif\n#endif // PFFFT_SIMD_DISABLE\n\n/*\n  Altivec support macros\n*/\n#ifdef PFFFT_SIMD_ALTIVEC\n#include <altivec.h>\ntypedef vector float v4sf;\n#  define SIMD_SZ 4\n#  define VZERO() ((vector float) vec_splat_u8(0))\n#  define VMUL(a,b) vec_madd(a,b, VZERO())\n#  define VADD(a,b) vec_add(a,b)\n#  define VMADD(a,b,c) vec_madd(a,b,c)\n#  define VSUB(a,b) vec_sub(a,b)\ninline v4sf ld_ps1(const float *p) { v4sf v=vec_lde(0,p); return vec_splat(vec_perm(v, v, vec_lvsl(0, p)), 0); }\n#  define LD_PS1(p) ld_ps1(&p)\n#  define INTERLEAVE2(in1, in2, out1, out2) { v4sf tmp__ = vec_mergeh(in1, in2); out2 = vec_mergel(in1, in2); out1 = tmp__; }\n#  define UNINTERLEAVE2(in1, in2, out1, out2) {                           \\\n    vector unsigned char vperm1 =  (vector unsigned char){0,1,2,3,8,9,10,11,16,17,18,19,24,25,26,27}; \\\n    vector unsigned char vperm2 =  (vector unsigned char){4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31}; \\\n    v4sf tmp__ = vec_perm(in1, in2, vperm1); out2 = vec_perm(in1, in2, vperm2); out1 = tmp__; \\\n  }\n#  define VTRANSPOSE4(x0,x1,x2,x3) {            \\\n    v4sf y0 = vec_mergeh(x0, x2);               \\\n    v4sf y1 = vec_mergel(x0, x2);               \\\n    v4sf y2 = vec_mergeh(x1, x3);               \\\n    v4sf y3 = vec_mergel(x1, x3);               \\\n    x0 = vec_mergeh(y0, y2);                    \\\n    x1 = vec_mergel(y0, y2);                    \\\n    x2 = vec_mergeh(y1, y3);                    \\\n    x3 = vec_mergel(y1, y3);                    \\\n  }\n#  define VSWAPHL(a,b) vec_perm(a,b, (vector unsigned char){16,17,18,19,20,21,22,23,8,9,10,11,12,13,14,15})\n#  define VALIGNED(ptr) ((((size_t)(ptr)) & 0xF) == 0)\n\n/*\n  SSE1 support macros\n*/\n#elif defined(PFFFT_SIMD_SSE)\n\n#include <xmmintrin.h>\ntypedef __m128 v4sf;\n#  define SIMD_SZ 4 // 4 floats by simd vector -- this is pretty much hardcoded in the preprocess/finalize functions anyway so you will have to work if you want to enable AVX with its 256-bit vectors.\n#  define VZERO() _mm_setzero_ps()\n#  define VMUL(a,b) _mm_mul_ps(a,b)\n#  define VADD(a,b) _mm_add_ps(a,b)\n#  define VMADD(a,b,c) _mm_add_ps(_mm_mul_ps(a,b), c)\n#  define VSUB(a,b) _mm_sub_ps(a,b)\n#  define LD_PS1(p) _mm_set1_ps(p)\n#  define INTERLEAVE2(in1, in2, out1, out2) { v4sf tmp__ = _mm_unpacklo_ps(in1, in2); out2 = _mm_unpackhi_ps(in1, in2); out1 = tmp__; }\n#  define UNINTERLEAVE2(in1, in2, out1, out2) { v4sf tmp__ = _mm_shuffle_ps(in1, in2, _MM_SHUFFLE(2,0,2,0)); out2 = _mm_shuffle_ps(in1, in2, _MM_SHUFFLE(3,1,3,1)); out1 = tmp__; }\n#  define VTRANSPOSE4(x0,x1,x2,x3) _MM_TRANSPOSE4_PS(x0,x1,x2,x3)\n#  define VSWAPHL(a,b) _mm_shuffle_ps(b, a, _MM_SHUFFLE(3,2,1,0))\n#  define VALIGNED(ptr) ((((size_t)(ptr)) & 0xF) == 0)\n\n/*\n  ARM NEON support macros\n*/\n#elif defined(PFFFT_SIMD_NEON)\n#  include <arm_neon.h>\ntypedef float32x4_t v4sf;\n#  define SIMD_SZ 4\n#  define VZERO() vdupq_n_f32(0)\n#  define VMUL(a,b) vmulq_f32(a,b)\n#  define VADD(a,b) vaddq_f32(a,b)\n#  define VMADD(a,b,c) vmlaq_f32(c,a,b)\n#  define VSUB(a,b) vsubq_f32(a,b)\n#  define LD_PS1(p) vld1q_dup_f32(&(p))\n#  define INTERLEAVE2(in1, in2, out1, out2) { float32x4x2_t tmp__ = vzipq_f32(in1,in2); out1=tmp__.val[0]; out2=tmp__.val[1]; }\n#  define UNINTERLEAVE2(in1, in2, out1, out2) { float32x4x2_t tmp__ = vuzpq_f32(in1,in2); out1=tmp__.val[0]; out2=tmp__.val[1]; }\n#  define VTRANSPOSE4(x0,x1,x2,x3) {                                    \\\n    float32x4x2_t t0_ = vzipq_f32(x0, x2);                              \\\n    float32x4x2_t t1_ = vzipq_f32(x1, x3);                              \\\n    float32x4x2_t u0_ = vzipq_f32(t0_.val[0], t1_.val[0]);              \\\n    float32x4x2_t u1_ = vzipq_f32(t0_.val[1], t1_.val[1]);              \\\n    x0 = u0_.val[0]; x1 = u0_.val[1]; x2 = u1_.val[0]; x3 = u1_.val[1]; \\\n  }\n// marginally faster version\n//#  define VTRANSPOSE4(x0,x1,x2,x3) { asm(\"vtrn.32 %q0, %q1;\\n vtrn.32 %q2,%q3\\n vswp %f0,%e2\\n vswp %f1,%e3\" : \"+w\"(x0), \"+w\"(x1), \"+w\"(x2), \"+w\"(x3)::); }\n#  define VSWAPHL(a,b) vcombine_f32(vget_low_f32(b), vget_high_f32(a))\n#  define VALIGNED(ptr) ((((size_t)(ptr)) & 0x3) == 0)\n#else\n#  if !defined(PFFFT_SIMD_DISABLE)\n#    warning \"building with simd disabled !\\n\";\n#    define PFFFT_SIMD_DISABLE // fallback to scalar code\n#  endif\n#endif\n\n// fallback mode for situations where SSE/Altivec are not available, use scalar mode instead\n#ifdef PFFFT_SIMD_DISABLE\ntypedef float v4sf;\n#  define SIMD_SZ 1\n#  define VZERO() 0.f\n#  define VMUL(a,b) ((a)*(b))\n#  define VADD(a,b) ((a)+(b))\n#  define VMADD(a,b,c) ((a)*(b)+(c))\n#  define VSUB(a,b) ((a)-(b))\n#  define LD_PS1(p) (p)\n#  define VALIGNED(ptr) ((((size_t)(ptr)) & 0x3) == 0)\n#endif\n\n// shortcuts for complex multiplcations\n#define VCPLXMUL(ar,ai,br,bi) { v4sf tmp; tmp=VMUL(ar,bi); ar=VMUL(ar,br); ar=VSUB(ar,VMUL(ai,bi)); ai=VMUL(ai,br); ai=VADD(ai,tmp); }\n#define VCPLXMULCONJ(ar,ai,br,bi) { v4sf tmp; tmp=VMUL(ar,bi); ar=VMUL(ar,br); ar=VADD(ar,VMUL(ai,bi)); ai=VMUL(ai,br); ai=VSUB(ai,tmp); }\n#ifndef SVMUL\n// multiply a scalar with a vector\n#define SVMUL(f,v) VMUL(LD_PS1(f),v)\n#endif\n\n#if !defined(PFFFT_SIMD_DISABLE)\ntypedef union v4sf_union {\n  v4sf  v;\n  float f[4];\n} v4sf_union;\n\n#include <string.h>\n\n#define assertv4(v,f0,f1,f2,f3) assert(v.f[0] == (f0) && v.f[1] == (f1) && v.f[2] == (f2) && v.f[3] == (f3))\n\n/* detect bugs with the vector support macros */\nvoid validate_pffft_simd(void) {\n  float f[16] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };\n  v4sf_union a0, a1, a2, a3, t, u;\n  memcpy(a0.f, f, 4*sizeof(float));\n  memcpy(a1.f, f+4, 4*sizeof(float));\n  memcpy(a2.f, f+8, 4*sizeof(float));\n  memcpy(a3.f, f+12, 4*sizeof(float));\n\n  t = a0; u = a1; t.v = VZERO();\n  printf(\"VZERO=[%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3]); assertv4(t, 0, 0, 0, 0);\n  t.v = VADD(a1.v, a2.v);\n  printf(\"VADD(4:7,8:11)=[%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3]); assertv4(t, 12, 14, 16, 18);\n  t.v = VMUL(a1.v, a2.v);\n  printf(\"VMUL(4:7,8:11)=[%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3]); assertv4(t, 32, 45, 60, 77);\n  t.v = VMADD(a1.v, a2.v,a0.v);\n  printf(\"VMADD(4:7,8:11,0:3)=[%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3]); assertv4(t, 32, 46, 62, 80);\n\n  INTERLEAVE2(a1.v,a2.v,t.v,u.v);\n  printf(\"INTERLEAVE2(4:7,8:11)=[%2g %2g %2g %2g] [%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3], u.f[0], u.f[1], u.f[2], u.f[3]);\n  assertv4(t, 4, 8, 5, 9); assertv4(u, 6, 10, 7, 11);\n  UNINTERLEAVE2(a1.v,a2.v,t.v,u.v);\n  printf(\"UNINTERLEAVE2(4:7,8:11)=[%2g %2g %2g %2g] [%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3], u.f[0], u.f[1], u.f[2], u.f[3]);\n  assertv4(t, 4, 6, 8, 10); assertv4(u, 5, 7, 9, 11);\n\n  t.v=LD_PS1(f[15]);\n  printf(\"LD_PS1(15)=[%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3]);\n  assertv4(t, 15, 15, 15, 15);\n  t.v = VSWAPHL(a1.v, a2.v);\n  printf(\"VSWAPHL(4:7,8:11)=[%2g %2g %2g %2g]\\n\", t.f[0], t.f[1], t.f[2], t.f[3]);\n  assertv4(t, 8, 9, 6, 7);\n  VTRANSPOSE4(a0.v, a1.v, a2.v, a3.v);\n  printf(\"VTRANSPOSE4(0:3,4:7,8:11,12:15)=[%2g %2g %2g %2g] [%2g %2g %2g %2g] [%2g %2g %2g %2g] [%2g %2g %2g %2g]\\n\",\n         a0.f[0], a0.f[1], a0.f[2], a0.f[3], a1.f[0], a1.f[1], a1.f[2], a1.f[3],\n         a2.f[0], a2.f[1], a2.f[2], a2.f[3], a3.f[0], a3.f[1], a3.f[2], a3.f[3]);\n  assertv4(a0, 0, 4, 8, 12); assertv4(a1, 1, 5, 9, 13); assertv4(a2, 2, 6, 10, 14); assertv4(a3, 3, 7, 11, 15);\n}\n#else\nvoid validate_pffft_simd() {} // allow test_pffft.c to call this function even when simd is not available..\n#endif //!PFFFT_SIMD_DISABLE\n\n/* SSE and co like 16-bytes aligned pointers */\n#define MALLOC_V4SF_ALIGNMENT 64 // with a 64-byte alignment, we are even aligned on L2 cache lines...\nvoid *pffft_aligned_malloc(size_t nb_bytes) {\n  void *p, *p0 = malloc(nb_bytes + MALLOC_V4SF_ALIGNMENT);\n  if (!p0) return (void *) 0;\n  p = (void *) (((size_t) p0 + MALLOC_V4SF_ALIGNMENT) & (~((size_t) (MALLOC_V4SF_ALIGNMENT-1))));\n  *((void **) p - 1) = p0;\n  return p;\n}\n\nvoid pffft_aligned_free(void *p) {\n  if (p) free(*((void **) p - 1));\n}\n\nint pffft_simd_size(void) { return SIMD_SZ; }\n\n/*\n  passf2 and passb2 has been merged here, fsign = -1 for passf2, +1 for passb2\n*/\nstatic NEVER_INLINE(void) passf2_ps(int ido, int l1, const v4sf *cc, v4sf *ch, const float *wa1, float fsign) {\n  int k, i;\n  int l1ido = l1*ido;\n  if (ido <= 2) {\n    for (k=0; k < l1ido; k += ido, ch += ido, cc+= 2*ido) {\n      ch[0]         = VADD(cc[0], cc[ido+0]);\n      ch[l1ido]     = VSUB(cc[0], cc[ido+0]);\n      ch[1]         = VADD(cc[1], cc[ido+1]);\n      ch[l1ido + 1] = VSUB(cc[1], cc[ido+1]);\n    }\n  } else {\n    for (k=0; k < l1ido; k += ido, ch += ido, cc += 2*ido) {\n      for (i=0; i<ido-1; i+=2) {\n        v4sf tr2 = VSUB(cc[i+0], cc[i+ido+0]);\n        v4sf ti2 = VSUB(cc[i+1], cc[i+ido+1]);\n        v4sf wr = LD_PS1(wa1[i]), wi = VMUL(LD_PS1(fsign), LD_PS1(wa1[i+1]));\n        ch[i]   = VADD(cc[i+0], cc[i+ido+0]);\n        ch[i+1] = VADD(cc[i+1], cc[i+ido+1]);\n        VCPLXMUL(tr2, ti2, wr, wi);\n        ch[i+l1ido]   = tr2;\n        ch[i+l1ido+1] = ti2;\n      }\n    }\n  }\n}\n\n/*\n  passf3 and passb3 has been merged here, fsign = -1 for passf3, +1 for passb3\n*/\nstatic NEVER_INLINE(void) passf3_ps(int ido, int l1, const v4sf *cc, v4sf *ch,\n                                    const float *wa1, const float *wa2, float fsign) {\n  static const float taur = -0.5f;\n  float taui = 0.866025403784439f*fsign;\n  int i, k;\n  v4sf tr2, ti2, cr2, ci2, cr3, ci3, dr2, di2, dr3, di3;\n  int l1ido = l1*ido;\n  float wr1, wi1, wr2, wi2;\n  assert(ido > 2);\n  for (k=0; k< l1ido; k += ido, cc+= 3*ido, ch +=ido) {\n    for (i=0; i<ido-1; i+=2) {\n      tr2 = VADD(cc[i+ido], cc[i+2*ido]);\n      cr2 = VADD(cc[i], SVMUL(taur,tr2));\n      ch[i]    = VADD(cc[i], tr2);\n      ti2 = VADD(cc[i+ido+1], cc[i+2*ido+1]);\n      ci2 = VADD(cc[i    +1], SVMUL(taur,ti2));\n      ch[i+1]  = VADD(cc[i+1], ti2);\n      cr3 = SVMUL(taui, VSUB(cc[i+ido], cc[i+2*ido]));\n      ci3 = SVMUL(taui, VSUB(cc[i+ido+1], cc[i+2*ido+1]));\n      dr2 = VSUB(cr2, ci3);\n      dr3 = VADD(cr2, ci3);\n      di2 = VADD(ci2, cr3);\n      di3 = VSUB(ci2, cr3);\n      wr1=wa1[i]; wi1=fsign*wa1[i+1]; wr2=wa2[i]; wi2=fsign*wa2[i+1];\n      VCPLXMUL(dr2, di2, LD_PS1(wr1), LD_PS1(wi1));\n      ch[i+l1ido] = dr2;\n      ch[i+l1ido + 1] = di2;\n      VCPLXMUL(dr3, di3, LD_PS1(wr2), LD_PS1(wi2));\n      ch[i+2*l1ido] = dr3;\n      ch[i+2*l1ido+1] = di3;\n    }\n  }\n} /* passf3 */\n\nstatic NEVER_INLINE(void) passf4_ps(int ido, int l1, const v4sf *cc, v4sf *ch,\n                                    const float *wa1, const float *wa2, const float *wa3, float fsign) {\n  /* isign == -1 for forward transform and +1 for backward transform */\n\n  int i, k;\n  v4sf ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;\n  int l1ido = l1*ido;\n  if (ido == 2) {\n    for (k=0; k < l1ido; k += ido, ch += ido, cc += 4*ido) {\n      tr1 = VSUB(cc[0], cc[2*ido + 0]);\n      tr2 = VADD(cc[0], cc[2*ido + 0]);\n      ti1 = VSUB(cc[1], cc[2*ido + 1]);\n      ti2 = VADD(cc[1], cc[2*ido + 1]);\n      ti4 = VMUL(VSUB(cc[1*ido + 0], cc[3*ido + 0]), LD_PS1(fsign));\n      tr4 = VMUL(VSUB(cc[3*ido + 1], cc[1*ido + 1]), LD_PS1(fsign));\n      tr3 = VADD(cc[ido + 0], cc[3*ido + 0]);\n      ti3 = VADD(cc[ido + 1], cc[3*ido + 1]);\n\n      ch[0*l1ido + 0] = VADD(tr2, tr3);\n      ch[0*l1ido + 1] = VADD(ti2, ti3);\n      ch[1*l1ido + 0] = VADD(tr1, tr4);\n      ch[1*l1ido + 1] = VADD(ti1, ti4);\n      ch[2*l1ido + 0] = VSUB(tr2, tr3);\n      ch[2*l1ido + 1] = VSUB(ti2, ti3);\n      ch[3*l1ido + 0] = VSUB(tr1, tr4);\n      ch[3*l1ido + 1] = VSUB(ti1, ti4);\n    }\n  } else {\n    for (k=0; k < l1ido; k += ido, ch+=ido, cc += 4*ido) {\n      for (i=0; i<ido-1; i+=2) {\n        float wr1, wi1, wr2, wi2, wr3, wi3;\n        tr1 = VSUB(cc[i + 0], cc[i + 2*ido + 0]);\n        tr2 = VADD(cc[i + 0], cc[i + 2*ido + 0]);\n        ti1 = VSUB(cc[i + 1], cc[i + 2*ido + 1]);\n        ti2 = VADD(cc[i + 1], cc[i + 2*ido + 1]);\n        tr4 = VMUL(VSUB(cc[i + 3*ido + 1], cc[i + 1*ido + 1]), LD_PS1(fsign));\n        ti4 = VMUL(VSUB(cc[i + 1*ido + 0], cc[i + 3*ido + 0]), LD_PS1(fsign));\n        tr3 = VADD(cc[i + ido + 0], cc[i + 3*ido + 0]);\n        ti3 = VADD(cc[i + ido + 1], cc[i + 3*ido + 1]);\n\n        ch[i] = VADD(tr2, tr3);\n        cr3    = VSUB(tr2, tr3);\n        ch[i + 1] = VADD(ti2, ti3);\n        ci3 = VSUB(ti2, ti3);\n\n        cr2 = VADD(tr1, tr4);\n        cr4 = VSUB(tr1, tr4);\n        ci2 = VADD(ti1, ti4);\n        ci4 = VSUB(ti1, ti4);\n        wr1=wa1[i]; wi1=fsign*wa1[i+1];\n        VCPLXMUL(cr2, ci2, LD_PS1(wr1), LD_PS1(wi1));\n        wr2=wa2[i]; wi2=fsign*wa2[i+1];\n        ch[i + l1ido] = cr2;\n        ch[i + l1ido + 1] = ci2;\n\n        VCPLXMUL(cr3, ci3, LD_PS1(wr2), LD_PS1(wi2));\n        wr3=wa3[i]; wi3=fsign*wa3[i+1];\n        ch[i + 2*l1ido] = cr3;\n        ch[i + 2*l1ido + 1] = ci3;\n\n        VCPLXMUL(cr4, ci4, LD_PS1(wr3), LD_PS1(wi3));\n        ch[i + 3*l1ido] = cr4;\n        ch[i + 3*l1ido + 1] = ci4;\n      }\n    }\n  }\n} /* passf4 */\n\n/*\n  passf5 and passb5 has been merged here, fsign = -1 for passf5, +1 for passb5\n*/\nstatic NEVER_INLINE(void) passf5_ps(int ido, int l1, const v4sf *cc, v4sf *ch,\n                                    const float *wa1, const float *wa2,\n                                    const float *wa3, const float *wa4, float fsign) {\n  static const float tr11 = .309016994374947f;\n  const float ti11 = .951056516295154f*fsign;\n  static const float tr12 = -.809016994374947f;\n  const float ti12 = .587785252292473f*fsign;\n\n  /* Local variables */\n  int i, k;\n  v4sf ci2, ci3, ci4, ci5, di3, di4, di5, di2, cr2, cr3, cr5, cr4, ti2, ti3,\n    ti4, ti5, dr3, dr4, dr5, dr2, tr2, tr3, tr4, tr5;\n\n  float wr1, wi1, wr2, wi2, wr3, wi3, wr4, wi4;\n\n#define cc_ref(a_1,a_2) cc[(a_2-1)*ido + a_1 + 1]\n#define ch_ref(a_1,a_3) ch[(a_3-1)*l1*ido + a_1 + 1]\n\n  assert(ido > 2);\n  for (k = 0; k < l1; ++k, cc += 5*ido, ch += ido) {\n    for (i = 0; i < ido-1; i += 2) {\n      ti5 = VSUB(cc_ref(i  , 2), cc_ref(i  , 5));\n      ti2 = VADD(cc_ref(i  , 2), cc_ref(i  , 5));\n      ti4 = VSUB(cc_ref(i  , 3), cc_ref(i  , 4));\n      ti3 = VADD(cc_ref(i  , 3), cc_ref(i  , 4));\n      tr5 = VSUB(cc_ref(i-1, 2), cc_ref(i-1, 5));\n      tr2 = VADD(cc_ref(i-1, 2), cc_ref(i-1, 5));\n      tr4 = VSUB(cc_ref(i-1, 3), cc_ref(i-1, 4));\n      tr3 = VADD(cc_ref(i-1, 3), cc_ref(i-1, 4));\n      ch_ref(i-1, 1) = VADD(cc_ref(i-1, 1), VADD(tr2, tr3));\n      ch_ref(i  , 1) = VADD(cc_ref(i  , 1), VADD(ti2, ti3));\n      cr2 = VADD(cc_ref(i-1, 1), VADD(SVMUL(tr11, tr2),SVMUL(tr12, tr3)));\n      ci2 = VADD(cc_ref(i  , 1), VADD(SVMUL(tr11, ti2),SVMUL(tr12, ti3)));\n      cr3 = VADD(cc_ref(i-1, 1), VADD(SVMUL(tr12, tr2),SVMUL(tr11, tr3)));\n      ci3 = VADD(cc_ref(i  , 1), VADD(SVMUL(tr12, ti2),SVMUL(tr11, ti3)));\n      cr5 = VADD(SVMUL(ti11, tr5), SVMUL(ti12, tr4));\n      ci5 = VADD(SVMUL(ti11, ti5), SVMUL(ti12, ti4));\n      cr4 = VSUB(SVMUL(ti12, tr5), SVMUL(ti11, tr4));\n      ci4 = VSUB(SVMUL(ti12, ti5), SVMUL(ti11, ti4));\n      dr3 = VSUB(cr3, ci4);\n      dr4 = VADD(cr3, ci4);\n      di3 = VADD(ci3, cr4);\n      di4 = VSUB(ci3, cr4);\n      dr5 = VADD(cr2, ci5);\n      dr2 = VSUB(cr2, ci5);\n      di5 = VSUB(ci2, cr5);\n      di2 = VADD(ci2, cr5);\n      wr1=wa1[i]; wi1=fsign*wa1[i+1]; wr2=wa2[i]; wi2=fsign*wa2[i+1];\n      wr3=wa3[i]; wi3=fsign*wa3[i+1]; wr4=wa4[i]; wi4=fsign*wa4[i+1];\n      VCPLXMUL(dr2, di2, LD_PS1(wr1), LD_PS1(wi1));\n      ch_ref(i - 1, 2) = dr2;\n      ch_ref(i, 2)     = di2;\n      VCPLXMUL(dr3, di3, LD_PS1(wr2), LD_PS1(wi2));\n      ch_ref(i - 1, 3) = dr3;\n      ch_ref(i, 3)     = di3;\n      VCPLXMUL(dr4, di4, LD_PS1(wr3), LD_PS1(wi3));\n      ch_ref(i - 1, 4) = dr4;\n      ch_ref(i, 4)     = di4;\n      VCPLXMUL(dr5, di5, LD_PS1(wr4), LD_PS1(wi4));\n      ch_ref(i - 1, 5) = dr5;\n      ch_ref(i, 5)     = di5;\n    }\n  }\n#undef ch_ref\n#undef cc_ref\n}\n\nstatic NEVER_INLINE(void) radf2_ps(int ido, int l1, const v4sf * RESTRICT cc, v4sf * RESTRICT ch, const float *wa1) {\n  static const float minus_one = -1.f;\n  int i, k, l1ido = l1*ido;\n  for (k=0; k < l1ido; k += ido) {\n    v4sf a = cc[k], b = cc[k + l1ido];\n    ch[2*k] = VADD(a, b);\n    ch[2*(k+ido)-1] = VSUB(a, b);\n  }\n  if (ido < 2) return;\n  if (ido != 2) {\n    for (k=0; k < l1ido; k += ido) {\n      for (i=2; i<ido; i+=2) {\n        v4sf tr2 = cc[i - 1 + k + l1ido], ti2 = cc[i + k + l1ido];\n        v4sf br = cc[i - 1 + k], bi = cc[i + k];\n        VCPLXMULCONJ(tr2, ti2, LD_PS1(wa1[i - 2]), LD_PS1(wa1[i - 1]));\n        ch[i + 2*k] = VADD(bi, ti2);\n        ch[2*(k+ido) - i] = VSUB(ti2, bi);\n        ch[i - 1 + 2*k] = VADD(br, tr2);\n        ch[2*(k+ido) - i -1] = VSUB(br, tr2);\n      }\n    }\n    if (ido % 2 == 1) return;\n  }\n  for (k=0; k < l1ido; k += ido) {\n    ch[2*k + ido] = SVMUL(minus_one, cc[ido-1 + k + l1ido]);\n    ch[2*k + ido-1] = cc[k + ido-1];\n  }\n} /* radf2 */\n\n\nstatic NEVER_INLINE(void) radb2_ps(int ido, int l1, const v4sf *cc, v4sf *ch, const float *wa1) {\n  static const float minus_two=-2;\n  int i, k, l1ido = l1*ido;\n  v4sf a,b,c,d, tr2, ti2;\n  for (k=0; k < l1ido; k += ido) {\n    a = cc[2*k]; b = cc[2*(k+ido) - 1];\n    ch[k] = VADD(a, b);\n    ch[k + l1ido] =VSUB(a, b);\n  }\n  if (ido < 2) return;\n  if (ido != 2) {\n    for (k = 0; k < l1ido; k += ido) {\n      for (i = 2; i < ido; i += 2) {\n        a = cc[i-1 + 2*k]; b = cc[2*(k + ido) - i - 1];\n        c = cc[i+0 + 2*k]; d = cc[2*(k + ido) - i + 0];\n        ch[i-1 + k] = VADD(a, b);\n        tr2 = VSUB(a, b);\n        ch[i+0 + k] = VSUB(c, d);\n        ti2 = VADD(c, d);\n        VCPLXMUL(tr2, ti2, LD_PS1(wa1[i - 2]), LD_PS1(wa1[i - 1]));\n        ch[i-1 + k + l1ido] = tr2;\n        ch[i+0 + k + l1ido] = ti2;\n      }\n    }\n    if (ido % 2 == 1) return;\n  }\n  for (k = 0; k < l1ido; k += ido) {\n    a = cc[2*k + ido-1]; b = cc[2*k + ido];\n    ch[k + ido-1] = VADD(a,a);\n    ch[k + ido-1 + l1ido] = SVMUL(minus_two, b);\n  }\n} /* radb2 */\n\nstatic void radf3_ps(int ido, int l1, const v4sf * RESTRICT cc, v4sf * RESTRICT ch,\n                     const float *wa1, const float *wa2) {\n  static const float taur = -0.5f;\n  static const float taui = 0.866025403784439f;\n  int i, k, ic;\n  v4sf ci2, di2, di3, cr2, dr2, dr3, ti2, ti3, tr2, tr3, wr1, wi1, wr2, wi2;\n  for (k=0; k<l1; k++) {\n    cr2 = VADD(cc[(k + l1)*ido], cc[(k + 2*l1)*ido]);\n    ch[3*k*ido] = VADD(cc[k*ido], cr2);\n    ch[(3*k+2)*ido] = SVMUL(taui, VSUB(cc[(k + l1*2)*ido], cc[(k + l1)*ido]));\n    ch[ido-1 + (3*k + 1)*ido] = VADD(cc[k*ido], SVMUL(taur, cr2));\n  }\n  if (ido == 1) return;\n  for (k=0; k<l1; k++) {\n    for (i=2; i<ido; i+=2) {\n      ic = ido - i;\n      wr1 = LD_PS1(wa1[i - 2]); wi1 = LD_PS1(wa1[i - 1]);\n      dr2 = cc[i - 1 + (k + l1)*ido]; di2 = cc[i + (k + l1)*ido];\n      VCPLXMULCONJ(dr2, di2, wr1, wi1);\n\n      wr2 = LD_PS1(wa2[i - 2]); wi2 = LD_PS1(wa2[i - 1]);\n      dr3 = cc[i - 1 + (k + l1*2)*ido]; di3 = cc[i + (k + l1*2)*ido];\n      VCPLXMULCONJ(dr3, di3, wr2, wi2);\n\n      cr2 = VADD(dr2, dr3);\n      ci2 = VADD(di2, di3);\n      ch[i - 1 + 3*k*ido] = VADD(cc[i - 1 + k*ido], cr2);\n      ch[i + 3*k*ido] = VADD(cc[i + k*ido], ci2);\n      tr2 = VADD(cc[i - 1 + k*ido], SVMUL(taur, cr2));\n      ti2 = VADD(cc[i + k*ido], SVMUL(taur, ci2));\n      tr3 = SVMUL(taui, VSUB(di2, di3));\n      ti3 = SVMUL(taui, VSUB(dr3, dr2));\n      ch[i - 1 + (3*k + 2)*ido] = VADD(tr2, tr3);\n      ch[ic - 1 + (3*k + 1)*ido] = VSUB(tr2, tr3);\n      ch[i + (3*k + 2)*ido] = VADD(ti2, ti3);\n      ch[ic + (3*k + 1)*ido] = VSUB(ti3, ti2);\n    }\n  }\n} /* radf3 */\n\n\nstatic void radb3_ps(int ido, int l1, const v4sf *RESTRICT cc, v4sf *RESTRICT ch,\n                     const float *wa1, const float *wa2)\n{\n  static const float taur = -0.5f;\n  static const float taui = 0.866025403784439f;\n  static const float taui_2 = 0.866025403784439f*2;\n  int i, k, ic;\n  v4sf ci2, ci3, di2, di3, cr2, cr3, dr2, dr3, ti2, tr2;\n  for (k=0; k<l1; k++) {\n    tr2 = cc[ido-1 + (3*k + 1)*ido]; tr2 = VADD(tr2,tr2);\n    cr2 = VMADD(LD_PS1(taur), tr2, cc[3*k*ido]);\n    ch[k*ido] = VADD(cc[3*k*ido], tr2);\n    ci3 = SVMUL(taui_2, cc[(3*k + 2)*ido]);\n    ch[(k + l1)*ido] = VSUB(cr2, ci3);\n    ch[(k + 2*l1)*ido] = VADD(cr2, ci3);\n  }\n  if (ido == 1) return;\n  for (k=0; k<l1; k++) {\n    for (i=2; i<ido; i+=2) {\n      ic = ido - i;\n      tr2 = VADD(cc[i - 1 + (3*k + 2)*ido], cc[ic - 1 + (3*k + 1)*ido]);\n      cr2 = VMADD(LD_PS1(taur), tr2, cc[i - 1 + 3*k*ido]);\n      ch[i - 1 + k*ido] = VADD(cc[i - 1 + 3*k*ido], tr2);\n      ti2 = VSUB(cc[i + (3*k + 2)*ido], cc[ic + (3*k + 1)*ido]);\n      ci2 = VMADD(LD_PS1(taur), ti2, cc[i + 3*k*ido]);\n      ch[i + k*ido] = VADD(cc[i + 3*k*ido], ti2);\n      cr3 = SVMUL(taui, VSUB(cc[i - 1 + (3*k + 2)*ido], cc[ic - 1 + (3*k + 1)*ido]));\n      ci3 = SVMUL(taui, VADD(cc[i + (3*k + 2)*ido], cc[ic + (3*k + 1)*ido]));\n      dr2 = VSUB(cr2, ci3);\n      dr3 = VADD(cr2, ci3);\n      di2 = VADD(ci2, cr3);\n      di3 = VSUB(ci2, cr3);\n      VCPLXMUL(dr2, di2, LD_PS1(wa1[i-2]), LD_PS1(wa1[i-1]));\n      ch[i - 1 + (k + l1)*ido] = dr2;\n      ch[i + (k + l1)*ido] = di2;\n      VCPLXMUL(dr3, di3, LD_PS1(wa2[i-2]), LD_PS1(wa2[i-1]));\n      ch[i - 1 + (k + 2*l1)*ido] = dr3;\n      ch[i + (k + 2*l1)*ido] = di3;\n    }\n  }\n} /* radb3 */\n\nstatic NEVER_INLINE(void) radf4_ps(int ido, int l1, const v4sf *RESTRICT cc, v4sf * RESTRICT ch,\n                                   const float * RESTRICT wa1, const float * RESTRICT wa2, const float * RESTRICT wa3)\n{\n  static const float minus_hsqt2 = (float)-0.7071067811865475;\n  int i, k, l1ido = l1*ido;\n  {\n    const v4sf *RESTRICT cc_ = cc, * RESTRICT cc_end = cc + l1ido;\n    v4sf * RESTRICT ch_ = ch;\n    while (cc < cc_end) {\n      // this loop represents between 25% and 40% of total radf4_ps cost !\n      v4sf a0 = cc[0], a1 = cc[l1ido];\n      v4sf a2 = cc[2*l1ido], a3 = cc[3*l1ido];\n      v4sf tr1 = VADD(a1, a3);\n      v4sf tr2 = VADD(a0, a2);\n      ch[2*ido-1] = VSUB(a0, a2);\n      ch[2*ido  ] = VSUB(a3, a1);\n      ch[0      ] = VADD(tr1, tr2);\n      ch[4*ido-1] = VSUB(tr2, tr1);\n      cc += ido; ch += 4*ido;\n    }\n    cc = cc_; ch = ch_;\n  }\n  if (ido < 2) return;\n  if (ido != 2) {\n    for (k = 0; k < l1ido; k += ido) {\n      const v4sf * RESTRICT pc = (v4sf*)(cc + 1 + k);\n      for (i=2; i<ido; i += 2, pc += 2) {\n        int ic = ido - i;\n        v4sf wr, wi, cr2, ci2, cr3, ci3, cr4, ci4;\n        v4sf tr1, ti1, tr2, ti2, tr3, ti3, tr4, ti4;\n\n        cr2 = pc[1*l1ido+0];\n        ci2 = pc[1*l1ido+1];\n        wr=LD_PS1(wa1[i - 2]);\n        wi=LD_PS1(wa1[i - 1]);\n        VCPLXMULCONJ(cr2,ci2,wr,wi);\n\n        cr3 = pc[2*l1ido+0];\n        ci3 = pc[2*l1ido+1];\n        wr = LD_PS1(wa2[i-2]);\n        wi = LD_PS1(wa2[i-1]);\n        VCPLXMULCONJ(cr3, ci3, wr, wi);\n\n        cr4 = pc[3*l1ido];\n        ci4 = pc[3*l1ido+1];\n        wr = LD_PS1(wa3[i-2]);\n        wi = LD_PS1(wa3[i-1]);\n        VCPLXMULCONJ(cr4, ci4, wr, wi);\n\n        /* at this point, on SSE, five of \"cr2 cr3 cr4 ci2 ci3 ci4\" should be loaded in registers */\n\n        tr1 = VADD(cr2,cr4);\n        tr4 = VSUB(cr4,cr2);\n        tr2 = VADD(pc[0],cr3);\n        tr3 = VSUB(pc[0],cr3);\n        ch[i - 1 + 4*k] = VADD(tr1,tr2);\n        ch[ic - 1 + 4*k + 3*ido] = VSUB(tr2,tr1); // at this point tr1 and tr2 can be disposed\n        ti1 = VADD(ci2,ci4);\n        ti4 = VSUB(ci2,ci4);\n        ch[i - 1 + 4*k + 2*ido] = VADD(ti4,tr3);\n        ch[ic - 1 + 4*k + 1*ido] = VSUB(tr3,ti4); // dispose tr3, ti4\n        ti2 = VADD(pc[1],ci3);\n        ti3 = VSUB(pc[1],ci3);\n        ch[i + 4*k] = VADD(ti1, ti2);\n        ch[ic + 4*k + 3*ido] = VSUB(ti1, ti2);\n        ch[i + 4*k + 2*ido] = VADD(tr4, ti3);\n        ch[ic + 4*k + 1*ido] = VSUB(tr4, ti3);\n      }\n    }\n    if (ido % 2 == 1) return;\n  }\n  for (k=0; k<l1ido; k += ido) {\n    v4sf a = cc[ido-1 + k + l1ido], b = cc[ido-1 + k + 3*l1ido];\n    v4sf c = cc[ido-1 + k], d = cc[ido-1 + k + 2*l1ido];\n    v4sf ti1 = SVMUL(minus_hsqt2, VADD(a, b));\n    v4sf tr1 = SVMUL(minus_hsqt2, VSUB(b, a));\n    ch[ido-1 + 4*k] = VADD(tr1, c);\n    ch[ido-1 + 4*k + 2*ido] = VSUB(c, tr1);\n    ch[4*k + 1*ido] = VSUB(ti1, d);\n    ch[4*k + 3*ido] = VADD(ti1, d);\n  }\n} /* radf4 */\n\n\nstatic NEVER_INLINE(void) radb4_ps(int ido, int l1, const v4sf * RESTRICT cc, v4sf * RESTRICT ch,\n                                   const float * RESTRICT wa1, const float * RESTRICT wa2, const float *RESTRICT wa3)\n{\n  static const float minus_sqrt2 = (float)-1.414213562373095;\n  static const float two = 2.f;\n  int i, k, l1ido = l1*ido;\n  v4sf ci2, ci3, ci4, cr2, cr3, cr4, ti1, ti2, ti3, ti4, tr1, tr2, tr3, tr4;\n  {\n    const v4sf *RESTRICT cc_ = cc, * RESTRICT ch_end = ch + l1ido;\n    v4sf *ch_ = ch;\n    while (ch < ch_end) {\n      v4sf a = cc[0], b = cc[4*ido-1];\n      v4sf c = cc[2*ido], d = cc[2*ido-1];\n      tr3 = SVMUL(two,d);\n      tr2 = VADD(a,b);\n      tr1 = VSUB(a,b);\n      tr4 = SVMUL(two,c);\n      ch[0*l1ido] = VADD(tr2, tr3);\n      ch[2*l1ido] = VSUB(tr2, tr3);\n      ch[1*l1ido] = VSUB(tr1, tr4);\n      ch[3*l1ido] = VADD(tr1, tr4);\n\n      cc += 4*ido; ch += ido;\n    }\n    cc = cc_; ch = ch_;\n  }\n  if (ido < 2) return;\n  if (ido != 2) {\n    for (k = 0; k < l1ido; k += ido) {\n      const v4sf * RESTRICT pc = (v4sf*)(cc - 1 + 4*k);\n      v4sf * RESTRICT ph = (v4sf*)(ch + k + 1);\n      for (i = 2; i < ido; i += 2) {\n\n        tr1 = VSUB(pc[i], pc[4*ido - i]);\n        tr2 = VADD(pc[i], pc[4*ido - i]);\n        ti4 = VSUB(pc[2*ido + i], pc[2*ido - i]);\n        tr3 = VADD(pc[2*ido + i], pc[2*ido - i]);\n        ph[0] = VADD(tr2, tr3);\n        cr3 = VSUB(tr2, tr3);\n\n        ti3 = VSUB(pc[2*ido + i + 1], pc[2*ido - i + 1]);\n        tr4 = VADD(pc[2*ido + i + 1], pc[2*ido - i + 1]);\n        cr2 = VSUB(tr1, tr4);\n        cr4 = VADD(tr1, tr4);\n\n        ti1 = VADD(pc[i + 1], pc[4*ido - i + 1]);\n        ti2 = VSUB(pc[i + 1], pc[4*ido - i + 1]);\n\n        ph[1] = VADD(ti2, ti3); ph += l1ido;\n        ci3 = VSUB(ti2, ti3);\n        ci2 = VADD(ti1, ti4);\n        ci4 = VSUB(ti1, ti4);\n        VCPLXMUL(cr2, ci2, LD_PS1(wa1[i-2]), LD_PS1(wa1[i-1]));\n        ph[0] = cr2;\n        ph[1] = ci2; ph += l1ido;\n        VCPLXMUL(cr3, ci3, LD_PS1(wa2[i-2]), LD_PS1(wa2[i-1]));\n        ph[0] = cr3;\n        ph[1] = ci3; ph += l1ido;\n        VCPLXMUL(cr4, ci4, LD_PS1(wa3[i-2]), LD_PS1(wa3[i-1]));\n        ph[0] = cr4;\n        ph[1] = ci4; ph = ph - 3*l1ido + 2;\n      }\n    }\n    if (ido % 2 == 1) return;\n  }\n  for (k=0; k < l1ido; k+=ido) {\n    int i0 = 4*k + ido;\n    v4sf c = cc[i0-1], d = cc[i0 + 2*ido-1];\n    v4sf a = cc[i0+0], b = cc[i0 + 2*ido+0];\n    tr1 = VSUB(c,d);\n    tr2 = VADD(c,d);\n    ti1 = VADD(b,a);\n    ti2 = VSUB(b,a);\n    ch[ido-1 + k + 0*l1ido] = VADD(tr2,tr2);\n    ch[ido-1 + k + 1*l1ido] = SVMUL(minus_sqrt2, VSUB(ti1, tr1));\n    ch[ido-1 + k + 2*l1ido] = VADD(ti2, ti2);\n    ch[ido-1 + k + 3*l1ido] = SVMUL(minus_sqrt2, VADD(ti1, tr1));\n  }\n} /* radb4 */\n\nstatic void radf5_ps(int ido, int l1, const v4sf * RESTRICT cc, v4sf * RESTRICT ch,\n                     const float *wa1, const float *wa2, const float *wa3, const float *wa4)\n{\n  static const float tr11 = .309016994374947f;\n  static const float ti11 = .951056516295154f;\n  static const float tr12 = -.809016994374947f;\n  static const float ti12 = .587785252292473f;\n\n  /* System generated locals */\n  int cc_offset, ch_offset;\n\n  /* Local variables */\n  int i, k, ic;\n  v4sf ci2, di2, ci4, ci5, di3, di4, di5, ci3, cr2, cr3, dr2, dr3, dr4, dr5,\n    cr5, cr4, ti2, ti3, ti5, ti4, tr2, tr3, tr4, tr5;\n  int idp2;\n\n\n#define cc_ref(a_1,a_2,a_3) cc[((a_3)*l1 + (a_2))*ido + a_1]\n#define ch_ref(a_1,a_2,a_3) ch[((a_3)*5 + (a_2))*ido + a_1]\n\n  /* Parameter adjustments */\n  ch_offset = 1 + ido * 6;\n  ch -= ch_offset;\n  cc_offset = 1 + ido * (1 + l1);\n  cc -= cc_offset;\n\n  /* Function Body */\n  for (k = 1; k <= l1; ++k) {\n    cr2 = VADD(cc_ref(1, k, 5), cc_ref(1, k, 2));\n    ci5 = VSUB(cc_ref(1, k, 5), cc_ref(1, k, 2));\n    cr3 = VADD(cc_ref(1, k, 4), cc_ref(1, k, 3));\n    ci4 = VSUB(cc_ref(1, k, 4), cc_ref(1, k, 3));\n    ch_ref(1, 1, k) = VADD(cc_ref(1, k, 1), VADD(cr2, cr3));\n    ch_ref(ido, 2, k) = VADD(cc_ref(1, k, 1), VADD(SVMUL(tr11, cr2), SVMUL(tr12, cr3)));\n    ch_ref(1, 3, k) = VADD(SVMUL(ti11, ci5), SVMUL(ti12, ci4));\n    ch_ref(ido, 4, k) = VADD(cc_ref(1, k, 1), VADD(SVMUL(tr12, cr2), SVMUL(tr11, cr3)));\n    ch_ref(1, 5, k) = VSUB(SVMUL(ti12, ci5), SVMUL(ti11, ci4));\n    //printf(\"pffft: radf5, k=%d ch_ref=%f, ci4=%f\\n\", k, ch_ref(1, 5, k), ci4);\n  }\n  if (ido == 1) {\n    return;\n  }\n  idp2 = ido + 2;\n  for (k = 1; k <= l1; ++k) {\n    for (i = 3; i <= ido; i += 2) {\n      ic = idp2 - i;\n      dr2 = LD_PS1(wa1[i-3]); di2 = LD_PS1(wa1[i-2]);\n      dr3 = LD_PS1(wa2[i-3]); di3 = LD_PS1(wa2[i-2]);\n      dr4 = LD_PS1(wa3[i-3]); di4 = LD_PS1(wa3[i-2]);\n      dr5 = LD_PS1(wa4[i-3]); di5 = LD_PS1(wa4[i-2]);\n      VCPLXMULCONJ(dr2, di2, cc_ref(i-1, k, 2), cc_ref(i, k, 2));\n      VCPLXMULCONJ(dr3, di3, cc_ref(i-1, k, 3), cc_ref(i, k, 3));\n      VCPLXMULCONJ(dr4, di4, cc_ref(i-1, k, 4), cc_ref(i, k, 4));\n      VCPLXMULCONJ(dr5, di5, cc_ref(i-1, k, 5), cc_ref(i, k, 5));\n      cr2 = VADD(dr2, dr5);\n      ci5 = VSUB(dr5, dr2);\n      cr5 = VSUB(di2, di5);\n      ci2 = VADD(di2, di5);\n      cr3 = VADD(dr3, dr4);\n      ci4 = VSUB(dr4, dr3);\n      cr4 = VSUB(di3, di4);\n      ci3 = VADD(di3, di4);\n      ch_ref(i - 1, 1, k) = VADD(cc_ref(i - 1, k, 1), VADD(cr2, cr3));\n      ch_ref(i, 1, k) = VSUB(cc_ref(i, k, 1), VADD(ci2, ci3));//\n      tr2 = VADD(cc_ref(i - 1, k, 1), VADD(SVMUL(tr11, cr2), SVMUL(tr12, cr3)));\n      ti2 = VSUB(cc_ref(i, k, 1), VADD(SVMUL(tr11, ci2), SVMUL(tr12, ci3)));//\n      tr3 = VADD(cc_ref(i - 1, k, 1), VADD(SVMUL(tr12, cr2), SVMUL(tr11, cr3)));\n      ti3 = VSUB(cc_ref(i, k, 1), VADD(SVMUL(tr12, ci2), SVMUL(tr11, ci3)));//\n      tr5 = VADD(SVMUL(ti11, cr5), SVMUL(ti12, cr4));\n      ti5 = VADD(SVMUL(ti11, ci5), SVMUL(ti12, ci4));\n      tr4 = VSUB(SVMUL(ti12, cr5), SVMUL(ti11, cr4));\n      ti4 = VSUB(SVMUL(ti12, ci5), SVMUL(ti11, ci4));\n      ch_ref(i - 1, 3, k) = VSUB(tr2, tr5);\n      ch_ref(ic - 1, 2, k) = VADD(tr2, tr5);\n      ch_ref(i, 3, k) = VADD(ti2, ti5);\n      ch_ref(ic, 2, k) = VSUB(ti5, ti2);\n      ch_ref(i - 1, 5, k) = VSUB(tr3, tr4);\n      ch_ref(ic - 1, 4, k) = VADD(tr3, tr4);\n      ch_ref(i, 5, k) = VADD(ti3, ti4);\n      ch_ref(ic, 4, k) = VSUB(ti4, ti3);\n    }\n  }\n#undef cc_ref\n#undef ch_ref\n} /* radf5 */\n\nstatic void radb5_ps(int ido, int l1, const v4sf *RESTRICT cc, v4sf *RESTRICT ch,\n                     const float *wa1, const float *wa2, const float *wa3, const float *wa4)\n{\n  static const float tr11 = .309016994374947f;\n  static const float ti11 = .951056516295154f;\n  static const float tr12 = -.809016994374947f;\n  static const float ti12 = .587785252292473f;\n\n  int cc_offset, ch_offset;\n\n  /* Local variables */\n  int i, k, ic;\n  v4sf ci2, ci3, ci4, ci5, di3, di4, di5, di2, cr2, cr3, cr5, cr4, ti2, ti3,\n    ti4, ti5, dr3, dr4, dr5, dr2, tr2, tr3, tr4, tr5;\n  int idp2;\n\n#define cc_ref(a_1,a_2,a_3) cc[((a_3)*5 + (a_2))*ido + a_1]\n#define ch_ref(a_1,a_2,a_3) ch[((a_3)*l1 + (a_2))*ido + a_1]\n\n  /* Parameter adjustments */\n  ch_offset = 1 + ido * (1 + l1);\n  ch -= ch_offset;\n  cc_offset = 1 + ido * 6;\n  cc -= cc_offset;\n\n  /* Function Body */\n  for (k = 1; k <= l1; ++k) {\n    ti5 = VADD(cc_ref(1, 3, k), cc_ref(1, 3, k));\n    ti4 = VADD(cc_ref(1, 5, k), cc_ref(1, 5, k));\n    tr2 = VADD(cc_ref(ido, 2, k), cc_ref(ido, 2, k));\n    tr3 = VADD(cc_ref(ido, 4, k), cc_ref(ido, 4, k));\n    ch_ref(1, k, 1) = VADD(cc_ref(1, 1, k), VADD(tr2, tr3));\n    cr2 = VADD(cc_ref(1, 1, k), VADD(SVMUL(tr11, tr2), SVMUL(tr12, tr3)));\n    cr3 = VADD(cc_ref(1, 1, k), VADD(SVMUL(tr12, tr2), SVMUL(tr11, tr3)));\n    ci5 = VADD(SVMUL(ti11, ti5), SVMUL(ti12, ti4));\n    ci4 = VSUB(SVMUL(ti12, ti5), SVMUL(ti11, ti4));\n    ch_ref(1, k, 2) = VSUB(cr2, ci5);\n    ch_ref(1, k, 3) = VSUB(cr3, ci4);\n    ch_ref(1, k, 4) = VADD(cr3, ci4);\n    ch_ref(1, k, 5) = VADD(cr2, ci5);\n  }\n  if (ido == 1) {\n    return;\n  }\n  idp2 = ido + 2;\n  for (k = 1; k <= l1; ++k) {\n    for (i = 3; i <= ido; i += 2) {\n      ic = idp2 - i;\n      ti5 = VADD(cc_ref(i  , 3, k), cc_ref(ic  , 2, k));\n      ti2 = VSUB(cc_ref(i  , 3, k), cc_ref(ic  , 2, k));\n      ti4 = VADD(cc_ref(i  , 5, k), cc_ref(ic  , 4, k));\n      ti3 = VSUB(cc_ref(i  , 5, k), cc_ref(ic  , 4, k));\n      tr5 = VSUB(cc_ref(i-1, 3, k), cc_ref(ic-1, 2, k));\n      tr2 = VADD(cc_ref(i-1, 3, k), cc_ref(ic-1, 2, k));\n      tr4 = VSUB(cc_ref(i-1, 5, k), cc_ref(ic-1, 4, k));\n      tr3 = VADD(cc_ref(i-1, 5, k), cc_ref(ic-1, 4, k));\n      ch_ref(i - 1, k, 1) = VADD(cc_ref(i-1, 1, k), VADD(tr2, tr3));\n      ch_ref(i, k, 1) = VADD(cc_ref(i, 1, k), VADD(ti2, ti3));\n      cr2 = VADD(cc_ref(i-1, 1, k), VADD(SVMUL(tr11, tr2), SVMUL(tr12, tr3)));\n      ci2 = VADD(cc_ref(i  , 1, k), VADD(SVMUL(tr11, ti2), SVMUL(tr12, ti3)));\n      cr3 = VADD(cc_ref(i-1, 1, k), VADD(SVMUL(tr12, tr2), SVMUL(tr11, tr3)));\n      ci3 = VADD(cc_ref(i  , 1, k), VADD(SVMUL(tr12, ti2), SVMUL(tr11, ti3)));\n      cr5 = VADD(SVMUL(ti11, tr5), SVMUL(ti12, tr4));\n      ci5 = VADD(SVMUL(ti11, ti5), SVMUL(ti12, ti4));\n      cr4 = VSUB(SVMUL(ti12, tr5), SVMUL(ti11, tr4));\n      ci4 = VSUB(SVMUL(ti12, ti5), SVMUL(ti11, ti4));\n      dr3 = VSUB(cr3, ci4);\n      dr4 = VADD(cr3, ci4);\n      di3 = VADD(ci3, cr4);\n      di4 = VSUB(ci3, cr4);\n      dr5 = VADD(cr2, ci5);\n      dr2 = VSUB(cr2, ci5);\n      di5 = VSUB(ci2, cr5);\n      di2 = VADD(ci2, cr5);\n      VCPLXMUL(dr2, di2, LD_PS1(wa1[i-3]), LD_PS1(wa1[i-2]));\n      VCPLXMUL(dr3, di3, LD_PS1(wa2[i-3]), LD_PS1(wa2[i-2]));\n      VCPLXMUL(dr4, di4, LD_PS1(wa3[i-3]), LD_PS1(wa3[i-2]));\n      VCPLXMUL(dr5, di5, LD_PS1(wa4[i-3]), LD_PS1(wa4[i-2]));\n\n      ch_ref(i-1, k, 2) = dr2; ch_ref(i, k, 2) = di2;\n      ch_ref(i-1, k, 3) = dr3; ch_ref(i, k, 3) = di3;\n      ch_ref(i-1, k, 4) = dr4; ch_ref(i, k, 4) = di4;\n      ch_ref(i-1, k, 5) = dr5; ch_ref(i, k, 5) = di5;\n    }\n  }\n#undef cc_ref\n#undef ch_ref\n} /* radb5 */\n\nstatic NEVER_INLINE(v4sf *) rfftf1_ps(int n, const v4sf *input_readonly, v4sf *work1, v4sf *work2,\n                                      const float *wa, const int *ifac) {\n  v4sf *in  = (v4sf*)input_readonly;\n  v4sf *out = (in == work2 ? work1 : work2);\n  int nf = ifac[1], k1;\n  int l2 = n;\n  int iw = n-1;\n  assert(in != out && work1 != work2);\n  for (k1 = 1; k1 <= nf; ++k1) {\n    int kh = nf - k1;\n    int ip = ifac[kh + 2];\n    int l1 = l2 / ip;\n    int ido = n / l2;\n    iw -= (ip - 1)*ido;\n    switch (ip) {\n      case 5: {\n        int ix2 = iw + ido;\n        int ix3 = ix2 + ido;\n        int ix4 = ix3 + ido;\n        radf5_ps(ido, l1, in, out, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4]);\n      } break;\n      case 4: {\n        int ix2 = iw + ido;\n        int ix3 = ix2 + ido;\n        radf4_ps(ido, l1, in, out, &wa[iw], &wa[ix2], &wa[ix3]);\n      } break;\n      case 3: {\n        int ix2 = iw + ido;\n        radf3_ps(ido, l1, in, out, &wa[iw], &wa[ix2]);\n      } break;\n      case 2:\n        radf2_ps(ido, l1, in, out, &wa[iw]);\n        break;\n      default:\n        assert(0);\n        break;\n    }\n    l2 = l1;\n    if (out == work2) {\n      out = work1; in = work2;\n    } else {\n      out = work2; in = work1;\n    }\n  }\n  return in; /* this is in fact the output .. */\n} /* rfftf1 */\n\nstatic NEVER_INLINE(v4sf *) rfftb1_ps(int n, const v4sf *input_readonly, v4sf *work1, v4sf *work2,\n                                      const float *wa, const int *ifac) {\n  v4sf *in  = (v4sf*)input_readonly;\n  v4sf *out = (in == work2 ? work1 : work2);\n  int nf = ifac[1], k1;\n  int l1 = 1;\n  int iw = 0;\n  assert(in != out);\n  for (k1=1; k1<=nf; k1++) {\n    int ip = ifac[k1 + 1];\n    int l2 = ip*l1;\n    int ido = n / l2;\n    switch (ip) {\n      case 5: {\n        int ix2 = iw + ido;\n        int ix3 = ix2 + ido;\n        int ix4 = ix3 + ido;\n        radb5_ps(ido, l1, in, out, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4]);\n      } break;\n      case 4: {\n        int ix2 = iw + ido;\n        int ix3 = ix2 + ido;\n        radb4_ps(ido, l1, in, out, &wa[iw], &wa[ix2], &wa[ix3]);\n      } break;\n      case 3: {\n        int ix2 = iw + ido;\n        radb3_ps(ido, l1, in, out, &wa[iw], &wa[ix2]);\n      } break;\n      case 2:\n        radb2_ps(ido, l1, in, out, &wa[iw]);\n        break;\n      default:\n        assert(0);\n        break;\n    }\n    l1 = l2;\n    iw += (ip - 1)*ido;\n\n    if (out == work2) {\n      out = work1; in = work2;\n    } else {\n      out = work2; in = work1;\n    }\n  }\n  return in; /* this is in fact the output .. */\n}\n\n#define IFAC_MAX_SIZE 25 /* max number of integer factors for the decomposition, +2 */\nstatic int decompose(int n, int *ifac, const int *ntryh) {\n  int nl = n, nf = 0, i, j = 0;\n  for (j=0; ntryh[j]; ++j) {\n    int ntry = ntryh[j];\n    while (nl != 1) {\n      int nq = nl / ntry;\n      int nr = nl - ntry * nq;\n      if (nr == 0) {\n        assert(2 + nf < IFAC_MAX_SIZE);\n        ifac[2+nf++] = ntry;\n        nl = nq;\n        if (ntry == 2 && nf != 1) {\n          for (i = 2; i <= nf; ++i) {\n            int ib = nf - i + 2;\n            ifac[ib + 1] = ifac[ib];\n          }\n          ifac[2] = 2;\n        }\n      } else break;\n    }\n  }\n  ifac[0] = n;\n  ifac[1] = nf;\n  return nf;\n}\n\n\n\nstatic void rffti1_ps(int n, float *wa, int *ifac)\n{\n  static const int ntryh[] = { 4,2,3,5,0 };\n  int k1, j, ii;\n\n  int nf = decompose(n,ifac,ntryh);\n  float argh = (2*M_PI) / n;\n  int is = 0;\n  int nfm1 = nf - 1;\n  int l1 = 1;\n  for (k1 = 1; k1 <= nfm1; k1++) {\n    int ip = ifac[k1 + 1];\n    int ld = 0;\n    int l2 = l1*ip;\n    int ido = n / l2;\n    int ipm = ip - 1;\n    for (j = 1; j <= ipm; ++j) {\n      float argld;\n      int i = is, fi=0;\n      ld += l1;\n      argld = ld*argh;\n      for (ii = 3; ii <= ido; ii += 2) {\n        i += 2;\n        fi += 1;\n        wa[i - 2] = cos(fi*argld);\n        wa[i - 1] = sin(fi*argld);\n      }\n      is += ido;\n    }\n    l1 = l2;\n  }\n} /* rffti1 */\n\nvoid cffti1_ps(int n, float *wa, int *ifac)\n{\n  static const int ntryh[] = { 5,3,4,2,0 };\n  int k1, j, ii;\n\n  int nf = decompose(n,ifac,ntryh);\n  float argh = (2*M_PI)/(float)n;\n  int i = 1;\n  int l1 = 1;\n  for (k1=1; k1<=nf; k1++) {\n    int ip = ifac[k1+1];\n    int ld = 0;\n    int l2 = l1*ip;\n    int ido = n / l2;\n    int idot = ido + ido + 2;\n    int ipm = ip - 1;\n    for (j=1; j<=ipm; j++) {\n      float argld;\n      int i1 = i, fi = 0;\n      wa[i-1] = 1;\n      wa[i] = 0;\n      ld += l1;\n      argld = ld*argh;\n      for (ii = 4; ii <= idot; ii += 2) {\n        i += 2;\n        fi += 1;\n        wa[i-1] = cos(fi*argld);\n        wa[i] = sin(fi*argld);\n      }\n      if (ip > 5) {\n        wa[i1-1] = wa[i-1];\n        wa[i1] = wa[i];\n      }\n    }\n    l1 = l2;\n  }\n} /* cffti1 */\n\n\nv4sf *cfftf1_ps(int n, const v4sf *input_readonly, v4sf *work1, v4sf *work2, const float *wa, const int *ifac, int isign) {\n  v4sf *in  = (v4sf*)input_readonly;\n  v4sf *out = (in == work2 ? work1 : work2);\n  int nf = ifac[1], k1;\n  int l1 = 1;\n  int iw = 0;\n  assert(in != out && work1 != work2);\n  for (k1=2; k1<=nf+1; k1++) {\n    int ip = ifac[k1];\n    int l2 = ip*l1;\n    int ido = n / l2;\n    int idot = ido + ido;\n    switch (ip) {\n      case 5: {\n        int ix2 = iw + idot;\n        int ix3 = ix2 + idot;\n        int ix4 = ix3 + idot;\n        passf5_ps(idot, l1, in, out, &wa[iw], &wa[ix2], &wa[ix3], &wa[ix4], isign);\n      } break;\n      case 4: {\n        int ix2 = iw + idot;\n        int ix3 = ix2 + idot;\n        passf4_ps(idot, l1, in, out, &wa[iw], &wa[ix2], &wa[ix3], isign);\n      } break;\n      case 2: {\n        passf2_ps(idot, l1, in, out, &wa[iw], isign);\n      } break;\n      case 3: {\n        int ix2 = iw + idot;\n        passf3_ps(idot, l1, in, out, &wa[iw], &wa[ix2], isign);\n      } break;\n      default:\n        assert(0);\n    }\n    l1 = l2;\n    iw += (ip - 1)*idot;\n    if (out == work2) {\n      out = work1; in = work2;\n    } else {\n      out = work2; in = work1;\n    }\n  }\n\n  return in; /* this is in fact the output .. */\n}\n\n\nstruct PFFFT_Setup {\n  int     N;\n  int     Ncvec; // nb of complex simd vectors (N/4 if PFFFT_COMPLEX, N/8 if PFFFT_REAL)\n  // hold the decomposition into small integers of N\n  int ifac[IFAC_MAX_SIZE]; // N , number of factors, factors (admitted values: 2, 3, 4 ou 5)\n  pffft_transform_t transform;\n  v4sf *data; // allocated room for twiddle coefs\n  float *e;    // points into 'data' , N/4*3 elements\n  float *twiddle; // points into 'data', N/4 elements\n};\n\nPFFFT_Setup *pffft_new_setup(int N, pffft_transform_t transform) {\n  // validate N for negative values or potential int overflow\n  if (N < 0) {\n    return 0;\n  }\n  if (N > (1<<26)) {\n    // higher values of N will make you enter in the integer overflow world...\n    assert(0);\n    return 0;\n  }\n  PFFFT_Setup *s = (PFFFT_Setup*)malloc(sizeof(PFFFT_Setup));\n  int k, m;\n  /* unfortunately, the fft size must be a multiple of 16 for complex FFTs\n     and 32 for real FFTs -- a lot of stuff would need to be rewritten to\n     handle other cases (or maybe just switch to a scalar fft, I don't know..) */\n  if (transform == PFFFT_REAL) { assert((N%(2*SIMD_SZ*SIMD_SZ))==0 && N>0); }\n  if (transform == PFFFT_COMPLEX) { assert((N%(SIMD_SZ*SIMD_SZ))==0 && N>0); }\n  //assert((N % 32) == 0);\n  s->N = N;\n  s->transform = transform;\n  /* nb of complex simd vectors */\n  s->Ncvec = (transform == PFFFT_REAL ? N/2 : N)/SIMD_SZ;\n  s->data = (v4sf*)pffft_aligned_malloc(2*s->Ncvec * sizeof(v4sf));\n  s->e = (float*)s->data;\n  s->twiddle = (float*)(s->data + (2*s->Ncvec*(SIMD_SZ-1))/SIMD_SZ);\n\n  for (k=0; k < s->Ncvec; ++k) {\n    int i = k/SIMD_SZ;\n    int j = k%SIMD_SZ;\n    for (m=0; m < SIMD_SZ-1; ++m) {\n      float A = -2*M_PI*(m+1)*k / N;\n      s->e[(2*(i*3 + m) + 0) * SIMD_SZ + j] = cos(A);\n      s->e[(2*(i*3 + m) + 1) * SIMD_SZ + j] = sin(A);\n    }\n  }\n\n  if (transform == PFFFT_REAL) {\n    rffti1_ps(N/SIMD_SZ, s->twiddle, s->ifac);\n  } else {\n    cffti1_ps(N/SIMD_SZ, s->twiddle, s->ifac);\n  }\n\n  /* check that N is decomposable with allowed prime factors */\n  for (k=0, m=1; k < s->ifac[1]; ++k) { m *= s->ifac[2+k]; }\n  if (m != N/SIMD_SZ) {\n    pffft_destroy_setup(s); s = 0;\n  }\n\n  return s;\n}\n\n\nvoid pffft_destroy_setup(PFFFT_Setup *s) {\n  pffft_aligned_free(s->data);\n  free(s);\n}\n\n#if !defined(PFFFT_SIMD_DISABLE)\n\n/* [0 0 1 2 3 4 5 6 7 8] -> [0 8 7 6 5 4 3 2 1] */\nstatic void reversed_copy(int N, const v4sf *in, int in_stride, v4sf *out) {\n  v4sf g0, g1;\n  int k;\n  INTERLEAVE2(in[0], in[1], g0, g1); in += in_stride;\n\n  *--out = VSWAPHL(g0, g1); // [g0l, g0h], [g1l g1h] -> [g1l, g0h]\n  for (k=1; k < N; ++k) {\n    v4sf h0, h1;\n    INTERLEAVE2(in[0], in[1], h0, h1); in += in_stride;\n    *--out = VSWAPHL(g1, h0);\n    *--out = VSWAPHL(h0, h1);\n    g1 = h1;\n  }\n  *--out = VSWAPHL(g1, g0);\n}\n\nstatic void unreversed_copy(int N, const v4sf *in, v4sf *out, int out_stride) {\n  v4sf g0, g1, h0, h1;\n  int k;\n  g0 = g1 = in[0]; ++in;\n  for (k=1; k < N; ++k) {\n    h0 = *in++; h1 = *in++;\n    g1 = VSWAPHL(g1, h0);\n    h0 = VSWAPHL(h0, h1);\n    UNINTERLEAVE2(h0, g1, out[0], out[1]); out += out_stride;\n    g1 = h1;\n  }\n  h0 = *in++; h1 = g0;\n  g1 = VSWAPHL(g1, h0);\n  h0 = VSWAPHL(h0, h1);\n  UNINTERLEAVE2(h0, g1, out[0], out[1]);\n}\n\nvoid pffft_zreorder(PFFFT_Setup *setup, const float *in, float *out, pffft_direction_t direction) {\n  int k, N = setup->N, Ncvec = setup->Ncvec;\n  const v4sf *vin = (const v4sf*)in;\n  v4sf *vout = (v4sf*)out;\n  assert(in != out);\n  if (setup->transform == PFFFT_REAL) {\n    int k, dk = N/32;\n    if (direction == PFFFT_FORWARD) {\n      for (k=0; k < dk; ++k) {\n        INTERLEAVE2(vin[k*8 + 0], vin[k*8 + 1], vout[2*(0*dk + k) + 0], vout[2*(0*dk + k) + 1]);\n        INTERLEAVE2(vin[k*8 + 4], vin[k*8 + 5], vout[2*(2*dk + k) + 0], vout[2*(2*dk + k) + 1]);\n      }\n      reversed_copy(dk, vin+2, 8, (v4sf*)(out + N/2));\n      reversed_copy(dk, vin+6, 8, (v4sf*)(out + N));\n    } else {\n      for (k=0; k < dk; ++k) {\n        UNINTERLEAVE2(vin[2*(0*dk + k) + 0], vin[2*(0*dk + k) + 1], vout[k*8 + 0], vout[k*8 + 1]);\n        UNINTERLEAVE2(vin[2*(2*dk + k) + 0], vin[2*(2*dk + k) + 1], vout[k*8 + 4], vout[k*8 + 5]);\n      }\n      unreversed_copy(dk, (v4sf*)(in + N/4), (v4sf*)(out + N - 6*SIMD_SZ), -8);\n      unreversed_copy(dk, (v4sf*)(in + 3*N/4), (v4sf*)(out + N - 2*SIMD_SZ), -8);\n    }\n  } else {\n    if (direction == PFFFT_FORWARD) {\n      for (k=0; k < Ncvec; ++k) {\n        int kk = (k/4) + (k%4)*(Ncvec/4);\n        INTERLEAVE2(vin[k*2], vin[k*2+1], vout[kk*2], vout[kk*2+1]);\n      }\n    } else {\n      for (k=0; k < Ncvec; ++k) {\n        int kk = (k/4) + (k%4)*(Ncvec/4);\n        UNINTERLEAVE2(vin[kk*2], vin[kk*2+1], vout[k*2], vout[k*2+1]);\n      }\n    }\n  }\n}\n\nvoid pffft_cplx_finalize(int Ncvec, const v4sf *in, v4sf *out, const v4sf *e) {\n  int k, dk = Ncvec/SIMD_SZ; // number of 4x4 matrix blocks\n  v4sf r0, i0, r1, i1, r2, i2, r3, i3;\n  v4sf sr0, dr0, sr1, dr1, si0, di0, si1, di1;\n  assert(in != out);\n  for (k=0; k < dk; ++k) {\n    r0 = in[8*k+0]; i0 = in[8*k+1];\n    r1 = in[8*k+2]; i1 = in[8*k+3];\n    r2 = in[8*k+4]; i2 = in[8*k+5];\n    r3 = in[8*k+6]; i3 = in[8*k+7];\n    VTRANSPOSE4(r0,r1,r2,r3);\n    VTRANSPOSE4(i0,i1,i2,i3);\n    VCPLXMUL(r1,i1,e[k*6+0],e[k*6+1]);\n    VCPLXMUL(r2,i2,e[k*6+2],e[k*6+3]);\n    VCPLXMUL(r3,i3,e[k*6+4],e[k*6+5]);\n\n    sr0 = VADD(r0,r2); dr0 = VSUB(r0, r2);\n    sr1 = VADD(r1,r3); dr1 = VSUB(r1, r3);\n    si0 = VADD(i0,i2); di0 = VSUB(i0, i2);\n    si1 = VADD(i1,i3); di1 = VSUB(i1, i3);\n\n    /*\n      transformation for each column is:\n\n      [1   1   1   1   0   0   0   0]   [r0]\n      [1   0  -1   0   0  -1   0   1]   [r1]\n      [1  -1   1  -1   0   0   0   0]   [r2]\n      [1   0  -1   0   0   1   0  -1]   [r3]\n      [0   0   0   0   1   1   1   1] * [i0]\n      [0   1   0  -1   1   0  -1   0]   [i1]\n      [0   0   0   0   1  -1   1  -1]   [i2]\n      [0  -1   0   1   1   0  -1   0]   [i3]\n    */\n\n    r0 = VADD(sr0, sr1); i0 = VADD(si0, si1);\n    r1 = VADD(dr0, di1); i1 = VSUB(di0, dr1);\n    r2 = VSUB(sr0, sr1); i2 = VSUB(si0, si1);\n    r3 = VSUB(dr0, di1); i3 = VADD(di0, dr1);\n\n    *out++ = r0; *out++ = i0; *out++ = r1; *out++ = i1;\n    *out++ = r2; *out++ = i2; *out++ = r3; *out++ = i3;\n  }\n}\n\nvoid pffft_cplx_preprocess(int Ncvec, const v4sf *in, v4sf *out, const v4sf *e) {\n  int k, dk = Ncvec/SIMD_SZ; // number of 4x4 matrix blocks\n  v4sf r0, i0, r1, i1, r2, i2, r3, i3;\n  v4sf sr0, dr0, sr1, dr1, si0, di0, si1, di1;\n  assert(in != out);\n  for (k=0; k < dk; ++k) {\n    r0 = in[8*k+0]; i0 = in[8*k+1];\n    r1 = in[8*k+2]; i1 = in[8*k+3];\n    r2 = in[8*k+4]; i2 = in[8*k+5];\n    r3 = in[8*k+6]; i3 = in[8*k+7];\n\n    sr0 = VADD(r0,r2); dr0 = VSUB(r0, r2);\n    sr1 = VADD(r1,r3); dr1 = VSUB(r1, r3);\n    si0 = VADD(i0,i2); di0 = VSUB(i0, i2);\n    si1 = VADD(i1,i3); di1 = VSUB(i1, i3);\n\n    r0 = VADD(sr0, sr1); i0 = VADD(si0, si1);\n    r1 = VSUB(dr0, di1); i1 = VADD(di0, dr1);\n    r2 = VSUB(sr0, sr1); i2 = VSUB(si0, si1);\n    r3 = VADD(dr0, di1); i3 = VSUB(di0, dr1);\n\n    VCPLXMULCONJ(r1,i1,e[k*6+0],e[k*6+1]);\n    VCPLXMULCONJ(r2,i2,e[k*6+2],e[k*6+3]);\n    VCPLXMULCONJ(r3,i3,e[k*6+4],e[k*6+5]);\n\n    VTRANSPOSE4(r0,r1,r2,r3);\n    VTRANSPOSE4(i0,i1,i2,i3);\n\n    *out++ = r0; *out++ = i0; *out++ = r1; *out++ = i1;\n    *out++ = r2; *out++ = i2; *out++ = r3; *out++ = i3;\n  }\n}\n\n\nstatic ALWAYS_INLINE(void) pffft_real_finalize_4x4(const v4sf *in0, const v4sf *in1, const v4sf *in,\n                                                   const v4sf *e, v4sf *out) {\n  v4sf r0, i0, r1, i1, r2, i2, r3, i3;\n  v4sf sr0, dr0, sr1, dr1, si0, di0, si1, di1;\n  r0 = *in0; i0 = *in1;\n  r1 = *in++; i1 = *in++; r2 = *in++; i2 = *in++; r3 = *in++; i3 = *in++;\n  VTRANSPOSE4(r0,r1,r2,r3);\n  VTRANSPOSE4(i0,i1,i2,i3);\n\n  /*\n    transformation for each column is:\n\n    [1   1   1   1   0   0   0   0]   [r0]\n    [1   0  -1   0   0  -1   0   1]   [r1]\n    [1   0  -1   0   0   1   0  -1]   [r2]\n    [1  -1   1  -1   0   0   0   0]   [r3]\n    [0   0   0   0   1   1   1   1] * [i0]\n    [0  -1   0   1  -1   0   1   0]   [i1]\n    [0  -1   0   1   1   0  -1   0]   [i2]\n    [0   0   0   0  -1   1  -1   1]   [i3]\n  */\n\n  //cerr << \"matrix initial, before e , REAL:\\n 1: \" << r0 << \"\\n 1: \" << r1 << \"\\n 1: \" << r2 << \"\\n 1: \" << r3 << \"\\n\";\n  //cerr << \"matrix initial, before e, IMAG :\\n 1: \" << i0 << \"\\n 1: \" << i1 << \"\\n 1: \" << i2 << \"\\n 1: \" << i3 << \"\\n\";\n\n  VCPLXMUL(r1,i1,e[0],e[1]);\n  VCPLXMUL(r2,i2,e[2],e[3]);\n  VCPLXMUL(r3,i3,e[4],e[5]);\n\n  //cerr << \"matrix initial, real part:\\n 1: \" << r0 << \"\\n 1: \" << r1 << \"\\n 1: \" << r2 << \"\\n 1: \" << r3 << \"\\n\";\n  //cerr << \"matrix initial, imag part:\\n 1: \" << i0 << \"\\n 1: \" << i1 << \"\\n 1: \" << i2 << \"\\n 1: \" << i3 << \"\\n\";\n\n  sr0 = VADD(r0,r2); dr0 = VSUB(r0,r2);\n  sr1 = VADD(r1,r3); dr1 = VSUB(r3,r1);\n  si0 = VADD(i0,i2); di0 = VSUB(i0,i2);\n  si1 = VADD(i1,i3); di1 = VSUB(i3,i1);\n\n  r0 = VADD(sr0, sr1);\n  r3 = VSUB(sr0, sr1);\n  i0 = VADD(si0, si1);\n  i3 = VSUB(si1, si0);\n  r1 = VADD(dr0, di1);\n  r2 = VSUB(dr0, di1);\n  i1 = VSUB(dr1, di0);\n  i2 = VADD(dr1, di0);\n\n  *out++ = r0;\n  *out++ = i0;\n  *out++ = r1;\n  *out++ = i1;\n  *out++ = r2;\n  *out++ = i2;\n  *out++ = r3;\n  *out++ = i3;\n\n}\n\nstatic NEVER_INLINE(void) pffft_real_finalize(int Ncvec, const v4sf *in, v4sf *out, const v4sf *e) {\n  int k, dk = Ncvec/SIMD_SZ; // number of 4x4 matrix blocks\n  /* fftpack order is f0r f1r f1i f2r f2i ... f(n-1)r f(n-1)i f(n)r */\n\n  v4sf_union cr, ci, *uout = (v4sf_union*)out;\n  v4sf save = in[7], zero=VZERO();\n  float xr0, xi0, xr1, xi1, xr2, xi2, xr3, xi3;\n  static const float s = (float)(M_SQRT2/2);\n\n  cr.v = in[0]; ci.v = in[Ncvec*2-1];\n  assert(in != out);\n  pffft_real_finalize_4x4(&zero, &zero, in+1, e, out);\n\n  /*\n    [cr0 cr1 cr2 cr3 ci0 ci1 ci2 ci3]\n\n    [Xr(1)]  ] [1   1   1   1   0   0   0   0]\n    [Xr(N/4) ] [0   0   0   0   1   s   0  -s]\n    [Xr(N/2) ] [1   0  -1   0   0   0   0   0]\n    [Xr(3N/4)] [0   0   0   0   1  -s   0   s]\n    [Xi(1)   ] [1  -1   1  -1   0   0   0   0]\n    [Xi(N/4) ] [0   0   0   0   0  -s  -1  -s]\n    [Xi(N/2) ] [0  -1   0   1   0   0   0   0]\n    [Xi(3N/4)] [0   0   0   0   0  -s   1  -s]\n  */\n\n  xr0=(cr.f[0]+cr.f[2]) + (cr.f[1]+cr.f[3]); uout[0].f[0] = xr0;\n  xi0=(cr.f[0]+cr.f[2]) - (cr.f[1]+cr.f[3]); uout[1].f[0] = xi0;\n  xr2=(cr.f[0]-cr.f[2]);                     uout[4].f[0] = xr2;\n  xi2=(cr.f[3]-cr.f[1]);                     uout[5].f[0] = xi2;\n  xr1= ci.f[0] + s*(ci.f[1]-ci.f[3]);        uout[2].f[0] = xr1;\n  xi1=-ci.f[2] - s*(ci.f[1]+ci.f[3]);        uout[3].f[0] = xi1;\n  xr3= ci.f[0] - s*(ci.f[1]-ci.f[3]);        uout[6].f[0] = xr3;\n  xi3= ci.f[2] - s*(ci.f[1]+ci.f[3]);        uout[7].f[0] = xi3;\n\n  for (k=1; k < dk; ++k) {\n    v4sf save_next = in[8*k+7];\n    pffft_real_finalize_4x4(&save, &in[8*k+0], in + 8*k+1,\n                            e + k*6, out + k*8);\n    save = save_next;\n  }\n\n}\n\nstatic ALWAYS_INLINE(void) pffft_real_preprocess_4x4(const v4sf *in,\n                                                     const v4sf *e, v4sf *out, int first) {\n  v4sf r0=in[0], i0=in[1], r1=in[2], i1=in[3], r2=in[4], i2=in[5], r3=in[6], i3=in[7];\n  /*\n    transformation for each column is:\n\n    [1   1   1   1   0   0   0   0]   [r0]\n    [1   0   0  -1   0  -1  -1   0]   [r1]\n    [1  -1  -1   1   0   0   0   0]   [r2]\n    [1   0   0  -1   0   1   1   0]   [r3]\n    [0   0   0   0   1  -1   1  -1] * [i0]\n    [0  -1   1   0   1   0   0   1]   [i1]\n    [0   0   0   0   1   1  -1  -1]   [i2]\n    [0   1  -1   0   1   0   0   1]   [i3]\n  */\n\n  v4sf sr0 = VADD(r0,r3), dr0 = VSUB(r0,r3);\n  v4sf sr1 = VADD(r1,r2), dr1 = VSUB(r1,r2);\n  v4sf si0 = VADD(i0,i3), di0 = VSUB(i0,i3);\n  v4sf si1 = VADD(i1,i2), di1 = VSUB(i1,i2);\n\n  r0 = VADD(sr0, sr1);\n  r2 = VSUB(sr0, sr1);\n  r1 = VSUB(dr0, si1);\n  r3 = VADD(dr0, si1);\n  i0 = VSUB(di0, di1);\n  i2 = VADD(di0, di1);\n  i1 = VSUB(si0, dr1);\n  i3 = VADD(si0, dr1);\n\n  VCPLXMULCONJ(r1,i1,e[0],e[1]);\n  VCPLXMULCONJ(r2,i2,e[2],e[3]);\n  VCPLXMULCONJ(r3,i3,e[4],e[5]);\n\n  VTRANSPOSE4(r0,r1,r2,r3);\n  VTRANSPOSE4(i0,i1,i2,i3);\n\n  if (!first) {\n    *out++ = r0;\n    *out++ = i0;\n  }\n  *out++ = r1;\n  *out++ = i1;\n  *out++ = r2;\n  *out++ = i2;\n  *out++ = r3;\n  *out++ = i3;\n}\n\nstatic NEVER_INLINE(void) pffft_real_preprocess(int Ncvec, const v4sf *in, v4sf *out, const v4sf *e) {\n  int k, dk = Ncvec/SIMD_SZ; // number of 4x4 matrix blocks\n  /* fftpack order is f0r f1r f1i f2r f2i ... f(n-1)r f(n-1)i f(n)r */\n\n  v4sf_union Xr, Xi, *uout = (v4sf_union*)out;\n  float cr0, ci0, cr1, ci1, cr2, ci2, cr3, ci3;\n  static const float s = (float)M_SQRT2;\n  assert(in != out);\n  for (k=0; k < 4; ++k) {\n    Xr.f[k] = ((float*)in)[8*k];\n    Xi.f[k] = ((float*)in)[8*k+4];\n  }\n\n  pffft_real_preprocess_4x4(in, e, out+1, 1); // will write only 6 values\n\n  /*\n    [Xr0 Xr1 Xr2 Xr3 Xi0 Xi1 Xi2 Xi3]\n\n    [cr0] [1   0   2   0   1   0   0   0]\n    [cr1] [1   0   0   0  -1   0  -2   0]\n    [cr2] [1   0  -2   0   1   0   0   0]\n    [cr3] [1   0   0   0  -1   0   2   0]\n    [ci0] [0   2   0   2   0   0   0   0]\n    [ci1] [0   s   0  -s   0  -s   0  -s]\n    [ci2] [0   0   0   0   0  -2   0   2]\n    [ci3] [0  -s   0   s   0  -s   0  -s]\n  */\n  for (k=1; k < dk; ++k) {\n    pffft_real_preprocess_4x4(in+8*k, e + k*6, out-1+k*8, 0);\n  }\n\n  cr0=(Xr.f[0]+Xi.f[0]) + 2*Xr.f[2]; uout[0].f[0] = cr0;\n  cr1=(Xr.f[0]-Xi.f[0]) - 2*Xi.f[2]; uout[0].f[1] = cr1;\n  cr2=(Xr.f[0]+Xi.f[0]) - 2*Xr.f[2]; uout[0].f[2] = cr2;\n  cr3=(Xr.f[0]-Xi.f[0]) + 2*Xi.f[2]; uout[0].f[3] = cr3;\n  ci0= 2*(Xr.f[1]+Xr.f[3]);                       uout[2*Ncvec-1].f[0] = ci0;\n  ci1= s*(Xr.f[1]-Xr.f[3]) - s*(Xi.f[1]+Xi.f[3]); uout[2*Ncvec-1].f[1] = ci1;\n  ci2= 2*(Xi.f[3]-Xi.f[1]);                       uout[2*Ncvec-1].f[2] = ci2;\n  ci3=-s*(Xr.f[1]-Xr.f[3]) - s*(Xi.f[1]+Xi.f[3]); uout[2*Ncvec-1].f[3] = ci3;\n}\n\n\nvoid pffft_transform_internal(PFFFT_Setup *setup, const float *finput, float *foutput, v4sf *scratch,\n                              pffft_direction_t direction, int ordered) {\n  int k, Ncvec   = setup->Ncvec;\n  int nf_odd = (setup->ifac[1] & 1);\n\n  // temporary buffer is allocated on the stack if the scratch pointer is NULL\n  int stack_allocate = (scratch == 0 ? Ncvec*2 : 1);\n  VLA_ARRAY_ON_STACK(v4sf, scratch_on_stack, stack_allocate);\n\n  const v4sf *vinput = (const v4sf*)finput;\n  v4sf *voutput      = (v4sf*)foutput;\n  v4sf *buff[2]      = { voutput, scratch ? scratch : scratch_on_stack };\n  int ib = (nf_odd ^ ordered ? 1 : 0);\n\n  assert(VALIGNED(finput) && VALIGNED(foutput));\n\n  //assert(finput != foutput);\n  if (direction == PFFFT_FORWARD) {\n    ib = !ib;\n    if (setup->transform == PFFFT_REAL) {\n      ib = (rfftf1_ps(Ncvec*2, vinput, buff[ib], buff[!ib],\n                      setup->twiddle, &setup->ifac[0]) == buff[0] ? 0 : 1);\n      pffft_real_finalize(Ncvec, buff[ib], buff[!ib], (v4sf*)setup->e);\n    } else {\n      v4sf *tmp = buff[ib];\n      for (k=0; k < Ncvec; ++k) {\n        UNINTERLEAVE2(vinput[k*2], vinput[k*2+1], tmp[k*2], tmp[k*2+1]);\n      }\n      ib = (cfftf1_ps(Ncvec, buff[ib], buff[!ib], buff[ib],\n                      setup->twiddle, &setup->ifac[0], -1) == buff[0] ? 0 : 1);\n      pffft_cplx_finalize(Ncvec, buff[ib], buff[!ib], (v4sf*)setup->e);\n    }\n    if (ordered) {\n      pffft_zreorder(setup, (float*)buff[!ib], (float*)buff[ib], PFFFT_FORWARD);\n    } else ib = !ib;\n  } else {\n    if (vinput == buff[ib]) {\n      ib = !ib; // may happen when finput == foutput\n    }\n    if (ordered) {\n      pffft_zreorder(setup, (float*)vinput, (float*)buff[ib], PFFFT_BACKWARD);\n      vinput = buff[ib]; ib = !ib;\n    }\n    if (setup->transform == PFFFT_REAL) {\n      pffft_real_preprocess(Ncvec, vinput, buff[ib], (v4sf*)setup->e);\n      ib = (rfftb1_ps(Ncvec*2, buff[ib], buff[0], buff[1],\n                      setup->twiddle, &setup->ifac[0]) == buff[0] ? 0 : 1);\n    } else {\n      pffft_cplx_preprocess(Ncvec, vinput, buff[ib], (v4sf*)setup->e);\n      ib = (cfftf1_ps(Ncvec, buff[ib], buff[0], buff[1],\n                      setup->twiddle, &setup->ifac[0], +1) == buff[0] ? 0 : 1);\n      for (k=0; k < Ncvec; ++k) {\n        INTERLEAVE2(buff[ib][k*2], buff[ib][k*2+1], buff[ib][k*2], buff[ib][k*2+1]);\n      }\n    }\n  }\n\n  if (buff[ib] != voutput) {\n    /* extra copy required -- this situation should only happen when finput == foutput */\n    assert(finput==foutput);\n    for (k=0; k < Ncvec; ++k) {\n      v4sf a = buff[ib][2*k], b = buff[ib][2*k+1];\n      voutput[2*k] = a; voutput[2*k+1] = b;\n    }\n    ib = !ib;\n  }\n  assert(buff[ib] == voutput);\n}\n\nvoid pffft_zconvolve_accumulate(PFFFT_Setup *s, const float *a, const float *b, float *ab, float scaling) {\n  int Ncvec = s->Ncvec;\n  const v4sf * RESTRICT va = (const v4sf*)a;\n  const v4sf * RESTRICT vb = (const v4sf*)b;\n  v4sf * RESTRICT vab = (v4sf*)ab;\n\n#ifdef __arm__\n  __builtin_prefetch(va);\n  __builtin_prefetch(vb);\n  __builtin_prefetch(vab);\n  __builtin_prefetch(va+2);\n  __builtin_prefetch(vb+2);\n  __builtin_prefetch(vab+2);\n  __builtin_prefetch(va+4);\n  __builtin_prefetch(vb+4);\n  __builtin_prefetch(vab+4);\n  __builtin_prefetch(va+6);\n  __builtin_prefetch(vb+6);\n  __builtin_prefetch(vab+6);\n# ifndef __clang__\n#   define ZCONVOLVE_USING_INLINE_NEON_ASM\n# endif\n#endif\n\n  float ar0, ai0, br0, bi0, abr0, abi0;\n#ifndef ZCONVOLVE_USING_INLINE_ASM\n  v4sf vscal = LD_PS1(scaling);\n  int i;\n#endif\n\n  assert(VALIGNED(a) && VALIGNED(b) && VALIGNED(ab));\n  ar0 = ((v4sf_union*)va)[0].f[0];\n  ai0 = ((v4sf_union*)va)[1].f[0];\n  br0 = ((v4sf_union*)vb)[0].f[0];\n  bi0 = ((v4sf_union*)vb)[1].f[0];\n  abr0 = ((v4sf_union*)vab)[0].f[0];\n  abi0 = ((v4sf_union*)vab)[1].f[0];\n\n#ifdef ZCONVOLVE_USING_INLINE_ASM // inline asm version, unfortunately miscompiled by clang 3.2, at least on ubuntu.. so this will be restricted to gcc\n  const float *a_ = a, *b_ = b; float *ab_ = ab;\n  int N = Ncvec;\n  asm volatile(\"mov         r8, %2                  \\n\"\n               \"vdup.f32    q15, %4                 \\n\"\n               \"1:                                  \\n\"\n               \"pld         [%0,#64]                \\n\"\n               \"pld         [%1,#64]                \\n\"\n               \"pld         [%2,#64]                \\n\"\n               \"pld         [%0,#96]                \\n\"\n               \"pld         [%1,#96]                \\n\"\n               \"pld         [%2,#96]                \\n\"\n               \"vld1.f32    {q0,q1},   [%0,:128]!         \\n\"\n               \"vld1.f32    {q4,q5},   [%1,:128]!         \\n\"\n               \"vld1.f32    {q2,q3},   [%0,:128]!         \\n\"\n               \"vld1.f32    {q6,q7},   [%1,:128]!         \\n\"\n               \"vld1.f32    {q8,q9},   [r8,:128]!          \\n\"\n\n               \"vmul.f32    q10, q0, q4             \\n\"\n               \"vmul.f32    q11, q0, q5             \\n\"\n               \"vmul.f32    q12, q2, q6             \\n\"\n               \"vmul.f32    q13, q2, q7             \\n\"\n               \"vmls.f32    q10, q1, q5             \\n\"\n               \"vmla.f32    q11, q1, q4             \\n\"\n               \"vld1.f32    {q0,q1}, [r8,:128]!     \\n\"\n               \"vmls.f32    q12, q3, q7             \\n\"\n               \"vmla.f32    q13, q3, q6             \\n\"\n               \"vmla.f32    q8, q10, q15            \\n\"\n               \"vmla.f32    q9, q11, q15            \\n\"\n               \"vmla.f32    q0, q12, q15            \\n\"\n               \"vmla.f32    q1, q13, q15            \\n\"\n               \"vst1.f32    {q8,q9},[%2,:128]!    \\n\"\n               \"vst1.f32    {q0,q1},[%2,:128]!    \\n\"\n               \"subs        %3, #2                  \\n\"\n               \"bne         1b                      \\n\"\n               : \"+r\"(a_), \"+r\"(b_), \"+r\"(ab_), \"+r\"(N) : \"r\"(scaling) : \"r8\", \"q0\",\"q1\",\"q2\",\"q3\",\"q4\",\"q5\",\"q6\",\"q7\",\"q8\",\"q9\", \"q10\",\"q11\",\"q12\",\"q13\",\"q15\",\"memory\");\n#else // default routine, works fine for non-arm cpus with current compilers\n  for (i=0; i < Ncvec; i += 2) {\n    v4sf ar, ai, br, bi;\n    ar = va[2*i+0]; ai = va[2*i+1];\n    br = vb[2*i+0]; bi = vb[2*i+1];\n    VCPLXMUL(ar, ai, br, bi);\n    vab[2*i+0] = VMADD(ar, vscal, vab[2*i+0]);\n    vab[2*i+1] = VMADD(ai, vscal, vab[2*i+1]);\n    ar = va[2*i+2]; ai = va[2*i+3];\n    br = vb[2*i+2]; bi = vb[2*i+3];\n    VCPLXMUL(ar, ai, br, bi);\n    vab[2*i+2] = VMADD(ar, vscal, vab[2*i+2]);\n    vab[2*i+3] = VMADD(ai, vscal, vab[2*i+3]);\n  }\n#endif\n  if (s->transform == PFFFT_REAL) {\n    ((v4sf_union*)vab)[0].f[0] = abr0 + ar0*br0*scaling;\n    ((v4sf_union*)vab)[1].f[0] = abi0 + ai0*bi0*scaling;\n  }\n}\n\n\n#else // defined(PFFFT_SIMD_DISABLE)\n\n// standard routine using scalar floats, without SIMD stuff.\n\n#define pffft_zreorder_nosimd pffft_zreorder\nvoid pffft_zreorder_nosimd(PFFFT_Setup *setup, const float *in, float *out, pffft_direction_t direction) {\n  int k, N = setup->N;\n  if (setup->transform == PFFFT_COMPLEX) {\n    for (k=0; k < 2*N; ++k) out[k] = in[k];\n    return;\n  }\n  else if (direction == PFFFT_FORWARD) {\n    float x_N = in[N-1];\n    for (k=N-1; k > 1; --k) out[k] = in[k-1];\n    out[0] = in[0];\n    out[1] = x_N;\n  } else {\n    float x_N = in[1];\n    for (k=1; k < N-1; ++k) out[k] = in[k+1];\n    out[0] = in[0];\n    out[N-1] = x_N;\n  }\n}\n\n#define pffft_transform_internal_nosimd pffft_transform_internal\nvoid pffft_transform_internal_nosimd(PFFFT_Setup *setup, const float *input, float *output, float *scratch,\n                                     pffft_direction_t direction, int ordered) {\n  int Ncvec   = setup->Ncvec;\n  int nf_odd = (setup->ifac[1] & 1);\n\n  // temporary buffer is allocated on the stack if the scratch pointer is NULL\n  int stack_allocate = (scratch == 0 ? Ncvec*2 : 1);\n  VLA_ARRAY_ON_STACK(v4sf, scratch_on_stack, stack_allocate);\n  float *buff[2];\n  int ib;\n  if (scratch == 0) scratch = scratch_on_stack;\n  buff[0] = output; buff[1] = scratch;\n\n  if (setup->transform == PFFFT_COMPLEX) ordered = 0; // it is always ordered.\n  ib = (nf_odd ^ ordered ? 1 : 0);\n\n  if (direction == PFFFT_FORWARD) {\n    if (setup->transform == PFFFT_REAL) {\n      ib = (rfftf1_ps(Ncvec*2, input, buff[ib], buff[!ib],\n                      setup->twiddle, &setup->ifac[0]) == buff[0] ? 0 : 1);\n    } else {\n      ib = (cfftf1_ps(Ncvec, input, buff[ib], buff[!ib],\n                      setup->twiddle, &setup->ifac[0], -1) == buff[0] ? 0 : 1);\n    }\n    if (ordered) {\n      pffft_zreorder(setup, buff[ib], buff[!ib], PFFFT_FORWARD); ib = !ib;\n    }\n  } else {\n    if (input == buff[ib]) {\n      ib = !ib; // may happen when finput == foutput\n    }\n    if (ordered) {\n      pffft_zreorder(setup, input, buff[!ib], PFFFT_BACKWARD);\n      input = buff[!ib];\n    }\n    if (setup->transform == PFFFT_REAL) {\n      ib = (rfftb1_ps(Ncvec*2, input, buff[ib], buff[!ib],\n                      setup->twiddle, &setup->ifac[0]) == buff[0] ? 0 : 1);\n    } else {\n      ib = (cfftf1_ps(Ncvec, input, buff[ib], buff[!ib],\n                      setup->twiddle, &setup->ifac[0], +1) == buff[0] ? 0 : 1);\n    }\n  }\n  if (buff[ib] != output) {\n    int k;\n    // extra copy required -- this situation should happens only when finput == foutput\n    assert(input==output);\n    for (k=0; k < Ncvec; ++k) {\n      float a = buff[ib][2*k], b = buff[ib][2*k+1];\n      output[2*k] = a; output[2*k+1] = b;\n    }\n    ib = !ib;\n  }\n  assert(buff[ib] == output);\n}\n\n#define pffft_zconvolve_accumulate_nosimd pffft_zconvolve_accumulate\nvoid pffft_zconvolve_accumulate_nosimd(PFFFT_Setup *s, const float *a, const float *b,\n                                       float *ab, float scaling) {\n  int i, Ncvec = s->Ncvec;\n\n  if (s->transform == PFFFT_REAL) {\n    // take care of the fftpack ordering\n    ab[0] += a[0]*b[0]*scaling;\n    ab[2*Ncvec-1] += a[2*Ncvec-1]*b[2*Ncvec-1]*scaling;\n    ++ab; ++a; ++b; --Ncvec;\n  }\n  for (i=0; i < Ncvec; ++i) {\n    float ar, ai, br, bi;\n    ar = a[2*i+0]; ai = a[2*i+1];\n    br = b[2*i+0]; bi = b[2*i+1];\n    VCPLXMUL(ar, ai, br, bi);\n    ab[2*i+0] += ar*scaling;\n    ab[2*i+1] += ai*scaling;\n  }\n}\n\n#endif // defined(PFFFT_SIMD_DISABLE)\n\nvoid pffft_transform(PFFFT_Setup *setup, const float *input, float *output, float *work, pffft_direction_t direction) {\n  pffft_transform_internal(setup, input, output, (v4sf*)work, direction, 0);\n}\n\nvoid pffft_transform_ordered(PFFFT_Setup *setup, const float *input, float *output, float *work, pffft_direction_t direction) {\n  pffft_transform_internal(setup, input, output, (v4sf*)work, direction, 1);\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/pffft/pffft.h",
    "content": "/* Copyright (c) 2013  Julien Pommier ( pommier@modartt.com )\n\n   Based on original fortran 77 code from FFTPACKv4 from NETLIB,\n   authored by Dr Paul Swarztrauber of NCAR, in 1985.\n\n   As confirmed by the NCAR fftpack software curators, the following\n   FFTPACKv5 license applies to FFTPACKv4 sources. My changes are\n   released under the same terms.\n\n   FFTPACK license:\n\n   http://www.cisl.ucar.edu/css/software/fftpack5/ftpk.html\n\n   Copyright (c) 2004 the University Corporation for Atmospheric\n   Research (\"UCAR\"). All rights reserved. Developed by NCAR's\n   Computational and Information Systems Laboratory, UCAR,\n   www.cisl.ucar.edu.\n\n   Redistribution and use of the Software in source and binary forms,\n   with or without modification, is permitted provided that the\n   following conditions are met:\n\n   - Neither the names of NCAR's Computational and Information Systems\n   Laboratory, the University Corporation for Atmospheric Research,\n   nor the names of its sponsors or contributors may be used to\n   endorse or promote products derived from this Software without\n   specific prior written permission.\n\n   - Redistributions of source code must retain the above copyright\n   notices, this list of conditions, and the disclaimer below.\n\n   - Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions, and the disclaimer below in the\n   documentation and/or other materials provided with the\n   distribution.\n\n   THIS SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n   EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF\n   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n   NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT\n   HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,\n   EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE\n   SOFTWARE.\n*/\n\n/*\n  PFFFT : a Pretty Fast FFT.\n\n  This is basically an adaptation of the single precision fftpack\n  (v4) as found on netlib taking advantage of SIMD instruction found\n  on cpus such as intel x86 (SSE1), powerpc (Altivec), and arm (NEON).\n\n  For architectures where no SIMD instruction is available, the code\n  falls back to a scalar version.\n\n  Restrictions:\n\n  - 1D transforms only, with 32-bit single precision.\n\n  - supports only transforms for inputs of length N of the form\n  N=(2^a)*(3^b)*(5^c), a >= 5, b >=0, c >= 0 (32, 48, 64, 96, 128,\n  144, 160, etc are all acceptable lengths). Performance is best for\n  128<=N<=8192.\n\n  - all (float*) pointers in the functions below are expected to\n  have an \"simd-compatible\" alignment, that is 16 bytes on x86 and\n  powerpc CPUs.\n\n  You can allocate such buffers with the functions\n  pffft_aligned_malloc / pffft_aligned_free (or with stuff like\n  posix_memalign..)\n\n*/\n\n#pragma once\n\n#include <stddef.h> // for size_t\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n   Opaque struct holding internal stuff (precomputed twiddle factors)\n   this struct can be shared by many threads as it contains only\n   read-only data.\n*/\ntypedef struct PFFFT_Setup PFFFT_Setup;\n\n/** Direction of the transform */\ntypedef enum { PFFFT_FORWARD, PFFFT_BACKWARD } pffft_direction_t;\n\n/** Type of transform */\ntypedef enum { PFFFT_REAL, PFFFT_COMPLEX } pffft_transform_t;\n\n/**\n  Prepare for performing transforms of size N -- the returned\n  PFFFT_Setup structure is read-only so it can safely be shared by\n  multiple concurrent threads.\n\n  Will return NULL if N is not suitable (too large / no decomposable with simple\n  integer factors..)\n*/\nPFFFT_Setup *pffft_new_setup(int N, pffft_transform_t transform);\nvoid pffft_destroy_setup(PFFFT_Setup *);\n/**\n  Perform a Fourier transform , The z-domain data is stored in the\n  most efficient order for transforming it back, or using it for\n  convolution. If you need to have its content sorted in the\n  \"usual\" way, that is as an array of interleaved complex numbers,\n  either use pffft_transform_ordered , or call pffft_zreorder after\n  the forward fft, and before the backward fft.\n\n  Transforms are not scaled: PFFFT_BACKWARD(PFFFT_FORWARD(x)) = N*x.\n  Typically you will want to scale the backward transform by 1/N.\n\n  The 'work' pointer should point to an area of N (2*N for complex\n  fft) floats, properly aligned. If 'work' is NULL, then stack will\n  be used instead (this is probably the best strategy for small\n  FFTs, say for N < 16384).\n\n  input and output may alias.\n*/\nvoid pffft_transform(\n    PFFFT_Setup *setup,\n    const float *input,\n    float *output,\n    float *work,\n    pffft_direction_t direction);\n\n/**\n  Similar to pffft_transform, but makes sure that the output is\n  ordered as expected (interleaved complex numbers).  This is\n  similar to calling pffft_transform and then pffft_zreorder.\n\n  input and output may alias.\n*/\nvoid pffft_transform_ordered(\n    PFFFT_Setup *setup,\n    const float *input,\n    float *output,\n    float *work,\n    pffft_direction_t direction);\n\n/**\n  call pffft_zreorder(.., PFFFT_FORWARD) after pffft_transform(...,\n  PFFFT_FORWARD) if you want to have the frequency components in\n  the correct \"canonical\" order, as interleaved complex numbers.\n\n  (for real transforms, both 0-frequency and half frequency\n  components, which are real, are assembled in the first entry as\n  F(0)+i*F(n/2+1). Note that the original fftpack did place\n  F(n/2+1) at the end of the arrays).\n\n  input and output should not alias.\n*/\nvoid pffft_zreorder(\n    PFFFT_Setup *setup,\n    const float *input,\n    float *output,\n    pffft_direction_t direction);\n\n/**\n  Perform a multiplication of the frequency components of dft_a and\n  dft_b and accumulate them into dft_ab. The arrays should have\n  been obtained with pffft_transform(.., PFFFT_FORWARD) and should\n  *not* have been reordered with pffft_zreorder (otherwise just\n  perform the operation yourself as the dft coefs are stored as\n  interleaved complex numbers).\n\n  the operation performed is: dft_ab += (dft_a * fdt_b)*scaling\n\n  The dft_a, dft_b and dft_ab pointers may alias.\n*/\nvoid pffft_zconvolve_accumulate(\n    PFFFT_Setup *setup,\n    const float *dft_a,\n    const float *dft_b,\n    float *dft_ab,\n    float scaling);\n\n/**\n  the float buffers must have the correct alignment (16-byte boundary\n  on intel and powerpc). This function may be used to obtain such\n  correctly aligned buffers.\n*/\nvoid *pffft_aligned_malloc(size_t nb_bytes);\nvoid pffft_aligned_free(void *);\n\n/** return 4 or 1 wether support SSE/Altivec instructions was enable when\n * building pffft.c */\nint pffft_simd_size(void);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/signalsmith-stretch/fft-pffft.h",
    "content": "#pragma once\n\n#include <audioapi/libs/signalsmith-stretch/fft.h>\n\n#if defined(__has_include) && !__has_include(\"pffft/pffft.h\")\n#\tinclude <audioapi/libs/pffft/pffft.h>\n#else\n#\tinclude \"pffft/pffft.h\"\n#endif\n\n#include <memory>\n#include <complex>\n#include <cassert>\n#include <cstring>\n\nnamespace signalsmith { namespace linear {\n\ntemplate<>\nstruct Pow2FFT<float> {\n\tstatic constexpr bool prefersSplit = false;\n\n\tusing Complex = std::complex<float>;\n\n\tPow2FFT(size_t size=0) {\n\t\tresize(size);\n\t}\n\t~Pow2FFT() {\n\t\tresize(0); // frees everything\n\t}\n\t// Allow move, but not copy\n\tPow2FFT(const Pow2FFT &other) = delete;\n\tPow2FFT(Pow2FFT &&other) : _size(other._size), hasSetup(other.hasSetup), fftSetup(other.fftSetup), fallback(std::move(other.fallback)), work(other.work), tmpAligned(other.tmpAligned) {\n\t\t// Avoid double-free\n\t\tother.hasSetup = false;\n\t\tother.work = nullptr;\n\t\tother.tmpAligned = nullptr;\n\t}\n\n\tvoid resize(size_t size) {\n\t\t_size = size;\n\t\tfallback = nullptr;\n\t\tif (hasSetup) pffft_destroy_setup(fftSetup);\n\t\tif (work) pffft_aligned_free(work);\n\t\twork = nullptr;\n\t\tif (tmpAligned) pffft_aligned_free(tmpAligned);\n\t\ttmpAligned = nullptr;\n\n\t\t// We use this for split-real, even if there's no PFFFT setup\n\t\ttmpAligned = (float *)pffft_aligned_malloc(sizeof(float)*size*2);\n\n\t\tif (size < 16) {\n\t\t\t// PFFFT doesn't support smaller sizes\n\t\t\thasSetup = false;\n\t\t\tfallback = std::unique_ptr<SimpleFFT<float>>{\n\t\t\t\tnew SimpleFFT<float>(size)\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\twork = (float *)pffft_aligned_malloc(sizeof(float)*size*2);\n\t\tfftSetup = pffft_new_setup(int(size), PFFFT_COMPLEX);\n\t\thasSetup = fftSetup;\n\t}\n\n\tvoid fft(const Complex* input, Complex* output) {\n\t\tif (fallback) return fallback->fft(input, output);\n\t\tfftInner(input, output, PFFFT_FORWARD);\n\t}\n\tvoid fft(const float *inR, const float *inI, float *outR, float *outI) {\n\t\tif (fallback) return fallback->fft(inR, inI, outR, outI);\n\t\tfftInner(inR, inI, outR, outI, PFFFT_FORWARD);\n\t}\n\n\tvoid ifft(const Complex* input, Complex* output) {\n\t\tif (fallback) return fallback->ifft(input, output);\n\t\tfftInner(input, output, PFFFT_BACKWARD);\n\t}\n\tvoid ifft(const float *inR, const float *inI, float *outR, float *outI) {\n\t\tif (fallback) return fallback->ifft(inR, inI, outR, outI);\n\t\tfftInner(inR, inI, outR, outI, PFFFT_BACKWARD);\n\t}\n\nprivate:\n\tvoid fftInner(const Complex *input, Complex *output, pffft_direction_t direction) {\n\t\t// 16-byte alignment\n\t\tif (size_t(input)&0x0F) {\n\t\t\t// `tmpAligned` is always aligned, so copy into that\n\t\t\tstd::memcpy(tmpAligned, input, sizeof(Complex)*_size);\n\t\t\tinput = (const Complex *)tmpAligned;\n\t\t}\n\t\tif (size_t(output)&0x0F) {\n\t\t\t// Output to `tmpAligned` - might be in-place if input is unaligned, but that's fine\n\t\t\tpffft_transform_ordered(fftSetup, (const float *)input, tmpAligned, work, direction);\n\t\t\tstd::memcpy(output, tmpAligned, sizeof(Complex)*_size);\n\t\t} else {\n\t\t\tpffft_transform_ordered(fftSetup, (const float *)input, (float *)output, work, direction);\n\t\t}\n\t}\n\tvoid fftInner(const float *inR, const float *inI, float *outR, float *outI, pffft_direction_t direction) {\n\t\tfor (size_t i = 0; i < _size; ++i) {\n\t\t\ttmpAligned[2*i] = inR[i];\n\t\t\ttmpAligned[2*i + 1] = inI[i];\n\t\t}\n\t\t// PFFFT supports in-place transforms\n\t\tfftInner((const Complex *)tmpAligned, (Complex *)tmpAligned, direction);\n\t\t// Un-interleave\n\t\tfor (size_t i = 0; i < _size; ++i) {\n\t\t\toutR[i] = tmpAligned[2*i];\n\t\t\toutI[i] = tmpAligned[2*i + 1];\n\t\t}\n\t}\n\n\tsize_t _size = 0;\n\tbool hasSetup = false;\n\tPFFFT_Setup *fftSetup = nullptr;\n\tstd::unique_ptr<SimpleFFT<float>> fallback;\n\tfloat *work = nullptr, *tmpAligned = nullptr;\n};\n\ntemplate<>\nstruct Pow2RealFFT<float> {\nprivate:\n\tusing FallbackFFT = SimpleRealFFT<float>; // this wraps the complex one\npublic:\n\tstatic constexpr bool prefersSplit = false;\n\n\tusing Complex = std::complex<float>;\n\n\tPow2RealFFT(size_t size=0) {\n\t\tresize(size);\n\t}\n\t~Pow2RealFFT() {\n\t\tresize(0);\n\t}\n\t// Allow move, but not copy\n\tPow2RealFFT(const Pow2RealFFT &other) = delete;\n\tPow2RealFFT(Pow2RealFFT &&other) : _size(other._size), hasSetup(other.hasSetup), fftSetup(other.fftSetup), fallback(std::move(other.fallback)), work(other.work), tmpAligned(other.tmpAligned) {\n\t\t// Avoid double-free\n\t\tother.hasSetup = false;\n\t\tother.work = nullptr;\n\t\tother.tmpAligned = nullptr;\n\t}\n\n\tvoid resize(size_t size) {\n\t\t_size = size;\n\t\tfallback = nullptr;\n\t\tif (hasSetup) pffft_destroy_setup(fftSetup);\n\t\tif (work) pffft_aligned_free(work);\n\t\twork = nullptr;\n\t\tif (tmpAligned) pffft_aligned_free(tmpAligned);\n\t\ttmpAligned = nullptr;\n\n\t\t// We use this for split-real, even if there's no PFFFT setup\n\t\ttmpAligned = (float *)pffft_aligned_malloc(sizeof(float)*size*2);\n\n\t\t// TODO: just go for it, and check for success before allocating `work`\n\t\tif (size < 32) {\n\t\t\t// PFFFT doesn't support smaller sizes\n\t\t\thasSetup = false;\n\t\t\tfallback = std::unique_ptr<FallbackFFT>{\n\t\t\t\tnew FallbackFFT(size)\n\t\t\t};\n\t\t\treturn;\n\t\t}\n\n\t\twork = (float *)pffft_aligned_malloc(sizeof(float)*size);\n\t\tfftSetup = pffft_new_setup(int(size), PFFFT_REAL);\n\t\thasSetup = fftSetup;\n\t}\n\n\tvoid fft(const float *input, Complex *output) {\n\t\tif (fallback) return fallback->fft(input, output);\n\t\tfftInner(input, (float *)output, PFFFT_FORWARD);\n\t}\n\tvoid fft(const float *inR, float *outR, float *outI) {\n\t\tif (fallback) return fallback->fft(inR, outR, outI);\n\t\tfftInner(inR, tmpAligned, PFFFT_FORWARD);\n\t\tfor (size_t i = 0; i < _size/2; ++i) {\n\t\t\toutR[i] = tmpAligned[2*i];\n\t\t\toutI[i] = tmpAligned[2*i + 1];\n\t\t}\n\t}\n\n\tvoid ifft(const Complex *input, float *output) {\n\t\tif (fallback) return fallback->ifft(input, output);\n\t\tfftInner((const float *)input, output, PFFFT_BACKWARD);\n\t}\n\tvoid ifft(const float *inR, const float *inI, float *outR) {\n\t\tif (fallback) return fallback->ifft(inR, inI, outR);\n\t\tfor (size_t i = 0; i < _size/2; ++i) {\n\t\t\ttmpAligned[2*i] = inR[i];\n\t\t\ttmpAligned[2*i + 1] = inI[i];\n\t\t}\n\t\tfftInner(tmpAligned, outR, PFFFT_BACKWARD);\n\t}\n\nprivate:\n\tvoid fftInner(const float *input, float *output, pffft_direction_t direction) {\n\t\t// 16-byte alignment\n\t\tif (size_t(input)&0x0F) {\n\t\t\t// `tmpAligned` is always aligned, so copy into that\n\t\t\tstd::memcpy(tmpAligned, input, sizeof(float)*_size);\n\t\t\tinput = tmpAligned;\n\t\t}\n\t\tif (size_t(output)&0x0F) {\n\t\t\t// Output to `tmpAligned` - might be in-place if input is unaligned, but that's fine\n\t\t\tpffft_transform_ordered(fftSetup, input, tmpAligned, work, direction);\n\t\t\tstd::memcpy(output, tmpAligned, sizeof(float)*_size);\n\t\t} else {\n\t\t\tpffft_transform_ordered(fftSetup, input, output, work, direction);\n\t\t}\n\t}\n\n\tsize_t _size = 0;\n\tbool hasSetup = false;\n\tPFFFT_Setup *fftSetup = nullptr;\n\tstd::unique_ptr<FallbackFFT> fallback;\n\tfloat *work = nullptr, *tmpAligned = nullptr;\n};\n\n}} // namespace\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/signalsmith-stretch/fft.h",
    "content": "#pragma once\n\n#include <complex>\n#include <vector>\n#include <cmath>\n#include <cstring>\n\n#if defined(__FAST_MATH__) && (__apple_build_version__ >= 16000000) && (__apple_build_version__ <= 16000099) && !defined(SIGNALSMITH_IGNORE_BROKEN_APPLECLANG)\n#\terror Apple Clang 16.0.0 generates incorrect SIMD for ARM. If you HAVE to use this version of Clang, turn off -ffast-math.\n#endif\n\n#ifndef M_PI\n#\tdefine M_PI 3.14159265358979323846\n#endif\n\nnamespace signalsmith { namespace linear {\n\nnamespace _impl {\n\t// Helpers for complex arithmetic, ignoring the NaN/Inf edge-cases you get without `-ffast-math`\n\ttemplate<class V>\n\tvoid complexMul(std::complex<V> *a, const std::complex<V> *b, const std::complex<V> *c, size_t size) {\n\t\tfor (size_t i = 0; i < size; ++i) {\n\t\t\tauto bi = b[i], ci = c[i];\n\t\t\ta[i] = {bi.real()*ci.real() - bi.imag()*ci.imag(), bi.imag()*ci.real() + bi.real()*ci.imag()};\n\t\t}\n\t}\n\ttemplate<class V>\n\tvoid complexMulConj(std::complex<V> *a, const std::complex<V> *b, const std::complex<V> *c, size_t size) {\n\t\tfor (size_t i = 0; i < size; ++i) {\n\t\t\tauto bi = b[i], ci = c[i];\n\t\t\ta[i] = {bi.real()*ci.real() + bi.imag()*ci.imag(), bi.imag()*ci.real() - bi.real()*ci.imag()};\n\t\t}\n\t}\n\ttemplate<class V>\n\tvoid complexMul(V *ar, V *ai, const V *br, const V *bi, const V *cr, const V *ci, size_t size) {\n\t\tfor (size_t i = 0; i < size; ++i) {\n\t\t\tV rr = br[i]*cr[i] - bi[i]*ci[i];\n\t\t\tV ri = br[i]*ci[i] + bi[i]*cr[i];\n\t\t\tar[i] = rr;\n\t\t\tai[i] = ri;\n\t\t}\n\t}\n\ttemplate<class V>\n\tvoid complexMulConj(V *ar, V *ai, const V *br, const V *bi, const V *cr, const V *ci, size_t size) {\n\t\tfor (size_t i = 0; i < size; ++i) {\n\t\t\tV rr = cr[i]*br[i] + ci[i]*bi[i];\n\t\t\tV ri = cr[i]*bi[i] - ci[i]*br[i];\n\t\t\tar[i] = rr;\n\t\t\tai[i] = ri;\n\t\t}\n\t}\n\n\t// Input: aStride elements next to each other -> output with bStride\n\ttemplate<size_t aStride, class V>\n\tvoid interleaveCopy(const V *a, V *b, size_t bStride) {\n\t\tfor (size_t bi = 0; bi < bStride; ++bi) {\n\t\t\tconst V *offsetA = a + bi*aStride;\n\t\t\tV *offsetB = b + bi;\n\t\t\tfor (size_t ai = 0; ai < aStride; ++ai) {\n\t\t\t\toffsetB[ai*bStride] = offsetA[ai];\n\t\t\t}\n\t\t}\n\t}\n\ttemplate<class V>\n\tvoid interleaveCopy(const V *a, V *b, size_t aStride, size_t bStride) {\n\t\tfor (size_t bi = 0; bi < bStride; ++bi) {\n\t\t\tconst V *offsetA = a + bi*aStride;\n\t\t\tV *offsetB = b + bi;\n\t\t\tfor (size_t ai = 0; ai < aStride; ++ai) {\n\t\t\t\toffsetB[ai*bStride] = offsetA[ai];\n\t\t\t}\n\t\t}\n\t}\n\ttemplate<size_t aStride, class V>\n\tvoid interleaveCopy(const V *aReal, const V *aImag, V *bReal, V *bImag, size_t bStride) {\n\t\tfor (size_t bi = 0; bi < bStride; ++bi) {\n\t\t\tconst V *offsetAr = aReal + bi*aStride;\n\t\t\tconst V *offsetAi = aImag + bi*aStride;\n\t\t\tV *offsetBr = bReal + bi;\n\t\t\tV *offsetBi = bImag + bi;\n\t\t\tfor (size_t ai = 0; ai < aStride; ++ai) {\n\t\t\t\toffsetBr[ai*bStride] = offsetAr[ai];\n\t\t\t\toffsetBi[ai*bStride] = offsetAi[ai];\n\t\t\t}\n\t\t}\n\t}\n\ttemplate<class V>\n\tvoid interleaveCopy(const V *aReal, const V *aImag, V *bReal, V *bImag, size_t aStride, size_t bStride) {\n\t\tfor (size_t bi = 0; bi < bStride; ++bi) {\n\t\t\tconst V *offsetAr = aReal + bi*aStride;\n\t\t\tconst V *offsetAi = aImag + bi*aStride;\n\t\t\tV *offsetBr = bReal + bi;\n\t\t\tV *offsetBi = bImag + bi;\n\t\t\tfor (size_t ai = 0; ai < aStride; ++ai) {\n\t\t\t\toffsetBr[ai*bStride] = offsetAr[ai];\n\t\t\t\toffsetBi[ai*bStride] = offsetAi[ai];\n\t\t\t}\n\t\t}\n\t}\n}\n\n/// Fairly simple and very portable power-of-2 FFT\ntemplate<typename Sample>\nstruct SimpleFFT {\n\tusing Complex = std::complex<Sample>;\n\n\tSimpleFFT(size_t size=0) {\n\t\tresize(size);\n\t}\n\n\tvoid resize(size_t size) {\n\t\ttwiddles.resize(size*3/4);\n\t\tfor (size_t i = 0; i < size*3/4; ++i) {\n\t\t\tSample twiddlePhase = -2*M_PI*i/size;\n\t\t\ttwiddles[i] = std::polar(Sample(1), twiddlePhase);\n\t\t}\n\t\tworking.resize(size);\n\t}\n\n\tvoid fft(const Complex *time, Complex *freq) {\n\t\tsize_t size = working.size();\n\t\tif (size <= 1) {\n\t\t\t*freq = *time;\n\t\t\treturn;\n\t\t}\n\t\tfftPass<false>(size, 1, time, freq, working.data());\n\t}\n\n\tvoid ifft(const Complex *freq, Complex *time) {\n\t\tsize_t size = working.size();\n\t\tif (size <= 1) {\n\t\t\t*time = *freq;\n\t\t\treturn;\n\t\t}\n\t\tfftPass<true>(size, 1, freq, time, working.data());\n\t}\n\n\tvoid fft(const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {\n\t\tsize_t size = working.size();\n\t\tif (size <= 1) {\n\t\t\t*outR = *inR;\n\t\t\t*outI = *inI;\n\t\t\treturn;\n\t\t}\n\t\tSample *workingR = (Sample *)working.data(), *workingI = workingR + size;\n\t\tfftPass<false>(size, 1, inR, inI, outR, outI, workingR, workingI);\n\t}\n\tvoid ifft(const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {\n\t\tsize_t size = working.size();\n\t\tif (size <= 1) {\n\t\t\t*outR = *inR;\n\t\t\t*outI = *inI;\n\t\t\treturn;\n\t\t}\n\t\tSample *workingR = (Sample *)working.data(), *workingI = workingR + size;\n\t\tfftPass<true>(size, 1, inR, inI, outR, outI, workingR, workingI);\n\t}\nprivate:\n\tstd::vector<Complex> twiddles;\n\tstd::vector<Complex> working;\n\n\ttemplate<bool conjB>\n\tstatic Complex mul(const Complex &a, const Complex &b) {\n\t\treturn conjB ? Complex{\n\t\t\ta.real()*b.real() + a.imag()*b.imag(),\n\t\t\ta.imag()*b.real() - a.real()*b.imag()\n\t\t} : Complex{\n\t\t\ta.real()*b.real() - a.imag()*b.imag(),\n\t\t\ta.imag()*b.real() + a.real()*b.imag()\n\t\t};\n\t}\n\n\t// Calculate a [size]-point FFT, where each element is a block of [stride] values\n\ttemplate<bool inverse>\n\tvoid fftPass(size_t size, size_t stride, const Complex *input, Complex *output, Complex *working) {\n\t\tif (size/4 > 1) {\n\t\t\t// Calculate four quarter-size FFTs\n\t\t\tfftPass<inverse>(size/4, stride*4, input, working, output);\n\t\t\tcombine4<inverse>(size, stride, working, output);\n\t\t} else if (size == 4) {\n\t\t\tcombine4<inverse>(4, stride, input, output);\n\t\t} else {\n\t\t\t// 2-point FFT\n\t\t\tfor (size_t s = 0; s < stride; ++s) {\n\t\t\t\tComplex a = input[s];\n\t\t\t\tComplex b = input[s + stride];\n\t\t\t\toutput[s] = a + b;\n\t\t\t\toutput[s + stride] = a - b;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Combine interleaved results into a single spectrum\n\ttemplate<bool inverse>\n\tvoid combine4(size_t size, size_t stride, const Complex *input, Complex *output) const {\n\t\tauto twiddleStep = working.size()/size;\n\t\tfor (size_t i = 0; i < size/4; ++i) {\n\t\t\tComplex twiddleB = twiddles[i*twiddleStep];\n\t\t\tComplex twiddleC = twiddles[i*2*twiddleStep];\n\t\t\tComplex twiddleD = twiddles[i*3*twiddleStep];\n\n\t\t\tconst Complex *inputA = input + 4*i*stride;\n\t\t\tconst Complex *inputB = input + (4*i + 1)*stride;\n\t\t\tconst Complex *inputC = input + (4*i + 2)*stride;\n\t\t\tconst Complex *inputD = input + (4*i + 3)*stride;\n\t\t\tComplex *outputA = output + i*stride;\n\t\t\tComplex *outputB = output + (i + size/4)*stride;\n\t\t\tComplex *outputC = output + (i + size/4*2)*stride;\n\t\t\tComplex *outputD = output + (i + size/4*3)*stride;\n\t\t\tfor (size_t s = 0; s < stride; ++s) {\n\t\t\t\tComplex a = inputA[s];\n\t\t\t\tComplex b = mul<inverse>(inputB[s], twiddleB);\n\t\t\t\tComplex c = mul<inverse>(inputC[s], twiddleC);\n\t\t\t\tComplex d = mul<inverse>(inputD[s], twiddleD);\n\t\t\t\tComplex ac0 = a + c, ac1 = a - c;\n\t\t\t\tComplex bd0 = b + d, bd1 = inverse ? (b - d) : (d - b);\n\t\t\t\tComplex bd1i = {-bd1.imag(), bd1.real()};\n\t\t\t\toutputA[s] = ac0 + bd0;\n\t\t\t\toutputB[s] = ac1 + bd1i;\n\t\t\t\toutputC[s] = ac0 - bd0;\n\t\t\t\toutputD[s] = ac1 - bd1i;\n\t\t\t}\n\t\t}\n\t}\n\n\t// The same thing, but translated for split-complex input/output\n\ttemplate<bool inverse>\n\tvoid fftPass(size_t size, size_t stride, const Sample *inputR, const Sample *inputI, Sample *outputR, Sample *outputI, Sample *workingR, Sample *workingI) const {\n\t\tif (size/4 > 1) {\n\t\t\t// Calculate four quarter-size FFTs\n\t\t\tfftPass<inverse>(size/4, stride*4, inputR, inputI, workingR, workingI, outputR, outputI);\n\t\t\tcombine4<inverse>(size, stride, workingR, workingI, outputR, outputI);\n\t\t} else if (size == 4) {\n\t\t\tcombine4<inverse>(4, stride, inputR, inputI, outputR, outputI);\n\t\t} else {\n\t\t\t// 2-point FFT\n\t\t\tfor (size_t s = 0; s < stride; ++s) {\n\t\t\t\tSample ar = inputR[s], ai = inputI[s];\n\t\t\t\tSample br = inputR[s + stride], bi = inputI[s + stride];\n\t\t\t\toutputR[s] = ar + br;\n\t\t\t\toutputI[s] = ai + bi;\n\t\t\t\toutputR[s + stride] = ar - br;\n\t\t\t\toutputI[s + stride] = ai - bi;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Combine interleaved results into a single spectrum\n\ttemplate<bool inverse>\n\tvoid combine4(size_t size, size_t stride, const Sample *inputR, const Sample *inputI, Sample *outputR, Sample *outputI) const {\n\t\tauto twiddleStep = working.size()/size;\n\t\tfor (size_t i = 0; i < size/4; ++i) {\n\t\t\tComplex twiddleB = twiddles[i*twiddleStep];\n\t\t\tComplex twiddleC = twiddles[i*2*twiddleStep];\n\t\t\tComplex twiddleD = twiddles[i*3*twiddleStep];\n\n\t\t\tconst Sample *inputAr = inputR + 4*i*stride, *inputAi = inputI + 4*i*stride;\n\t\t\tconst Sample *inputBr = inputR + (4*i + 1)*stride, *inputBi = inputI + (4*i + 1)*stride;\n\t\t\tconst Sample *inputCr = inputR + (4*i + 2)*stride, *inputCi = inputI + (4*i + 2)*stride;\n\t\t\tconst Sample *inputDr = inputR + (4*i + 3)*stride, *inputDi = inputI + (4*i + 3)*stride;\n\t\t\tSample *outputAr = outputR + i*stride, *outputAi = outputI + i*stride;\n\t\t\tSample *outputBr = outputR + (i + size/4)*stride, *outputBi = outputI + (i + size/4)*stride;\n\t\t\tSample *outputCr = outputR + (i + size/4*2)*stride, *outputCi = outputI + (i + size/4*2)*stride;\n\t\t\tSample *outputDr = outputR + (i + size/4*3)*stride, *outputDi = outputI + (i + size/4*3)*stride;\n\t\t\tfor (size_t s = 0; s < stride; ++s) {\n\t\t\t\tComplex a = {inputAr[s], inputAi[s]};\n\t\t\t\tComplex b = mul<inverse>({inputBr[s], inputBi[s]}, twiddleB);\n\t\t\t\tComplex c = mul<inverse>({inputCr[s], inputCi[s]}, twiddleC);\n\t\t\t\tComplex d = mul<inverse>({inputDr[s], inputDi[s]}, twiddleD);\n\t\t\t\tComplex ac0 = a + c, ac1 = a - c;\n\t\t\t\tComplex bd0 = b + d, bd1 = inverse ? (b - d) : (d - b);\n\t\t\t\tComplex bd1i = {-bd1.imag(), bd1.real()};\n\t\t\t\toutputAr[s] = ac0.real() + bd0.real();\n\t\t\t\toutputAi[s] = ac0.imag() + bd0.imag();\n\t\t\t\toutputBr[s] = ac1.real() + bd1i.real();\n\t\t\t\toutputBi[s] = ac1.imag() + bd1i.imag();\n\t\t\t\toutputCr[s] = ac0.real() - bd0.real();\n\t\t\t\toutputCi[s] = ac0.imag() - bd0.imag();\n\t\t\t\toutputDr[s] = ac1.real() - bd1i.real();\n\t\t\t\toutputDi[s] = ac1.imag() - bd1i.imag();\n\t\t\t}\n\t\t}\n\t}\n};\n\n/// A power-of-2 only FFT, specialised with platform-specific fast implementations where available\ntemplate<typename Sample>\nstruct Pow2FFT {\n\tstatic constexpr bool prefersSplit = true; // whether this FFT implementation is faster when given split-complex inputs\n\tusing Complex = std::complex<Sample>;\n\n\tPow2FFT(size_t size=0) {\n\t\tresize(size);\n\t}\n\t// Allow move, but not copy\n\tPow2FFT(const Pow2FFT &other) = delete;\n\tPow2FFT(Pow2FFT &&other) : tmp(std::move(other.tmp)), simpleFFT(std::move(other.simpleFFT)) {}\n\n\tvoid resize(size_t size) {\n\t\tsimpleFFT.resize(size);\n\t\ttmp.resize(size);\n\t}\n\n\tvoid fft(const Complex *time, Complex *freq) {\n\t\tsimpleFFT.fft(time, freq);\n\t}\n\tvoid fft(const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {\n\t\tsimpleFFT.fft(inR, inI, outR, outI);\n\t}\n\n\tvoid ifft(const Complex *freq, Complex *time) {\n\t\tsimpleFFT.ifft(freq, time);\n\t}\n\tvoid ifft(const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {\n\t\tsimpleFFT.ifft(inR, inI, outR, outI);\n\t}\n\nprivate:\n\tstd::vector<Complex> tmp;\n\tSimpleFFT<Sample> simpleFFT;\n};\n\n/// An FFT which can handle multiples of 3 and 5, and can be computed in chunks\ntemplate<typename Sample, bool splitComputation=false>\nstruct SplitFFT {\n\tusing Complex = std::complex<Sample>;\n\tstatic constexpr bool prefersSplit = Pow2FFT<Sample>::prefersSplit;\n\n\tstatic constexpr size_t maxSplit = splitComputation ? 4 : 1;\n\tstatic constexpr size_t minInnerSize = 32;\n\n\tstatic size_t fastSizeAbove(size_t size) {\n\t\tsize_t pow2 = 1;\n\t\twhile (pow2 < 16 && pow2 < size) pow2 *= 2;\n\t\twhile (pow2*8 < size) pow2 *= 2;\n\t\tsize_t multiple = (size + pow2 - 1)/pow2; // will be 1-8\n\t\tif (multiple == 7) ++multiple;\n\t\treturn multiple*pow2;\n\t}\n\n\tSplitFFT(size_t size=0) {\n\t\tresize(size);\n\t}\n\n\tvoid resize(size_t size) {\n\t\tinnerSize = 1;\n\t\touterSize = size;\n\n\t\tdftTmp.resize(0);\n\t\tdftTwists.resize(0);\n\t\tplan.resize(0);\n\t\tif (!size) return;\n\n\t\t// Inner size = largest power of 2 such that either the inner size >= minInnerSize, or we have the target number of splits\n\t\twhile (!(outerSize&1) && (outerSize > maxSplit || innerSize < minInnerSize)) {\n\t\t\tinnerSize *= 2;\n\t\t\touterSize /= 2;\n\t\t}\n\t\ttmpFreq.resize(size);\n\t\tinnerFFT.resize(innerSize);\n\n\t\touterTwiddles.resize(innerSize*(outerSize - 1));\n\t\touterTwiddlesR.resize(innerSize*(outerSize - 1));\n\t\touterTwiddlesI.resize(innerSize*(outerSize - 1));\n\t\tfor (size_t i = 0; i < innerSize; ++i) {\n\t\t\tfor (size_t s = 1; s < outerSize; ++s) {\n\t\t\t\tSample twiddlePhase = Sample(-2*M_PI*i/innerSize*s/outerSize);\n\t\t\t\touterTwiddles[i + (s - 1)*innerSize] = std::polar(Sample(1), twiddlePhase);\n\t\t\t}\n\t\t}\n\t\tfor (size_t i = 0; i < outerTwiddles.size(); ++i) {\n\t\t\touterTwiddlesR[i] = outerTwiddles[i].real();\n\t\t\touterTwiddlesI[i] = outerTwiddles[i].imag();\n\t\t}\n\n\t\tStepType interleaveStep = StepType::interleaveOrderN;\n\t\tStepType finalStep = StepType::finalOrderN;\n\t\tif (outerSize == 2) {\n\t\t\tinterleaveStep = StepType::interleaveOrder2;\n\t\t\tfinalStep = StepType::finalOrder2;\n\t\t}\n\t\tif (outerSize == 3) {\n\t\t\tinterleaveStep = StepType::interleaveOrder3;\n\t\t\tfinalStep = StepType::finalOrder3;\n\t\t}\n\t\tif (outerSize == 4) {\n\t\t\tinterleaveStep = StepType::interleaveOrder4;\n\t\t\tfinalStep = StepType::finalOrder4;\n\t\t}\n\t\tif (outerSize == 5) {\n\t\t\tinterleaveStep = StepType::interleaveOrder5;\n\t\t\tfinalStep = StepType::finalOrder5;\n\t\t}\n\n\t\tif (outerSize <= 1) {\n\t\t\tif (size > 0) plan.push_back(Step{StepType::passthrough, 0});\n\t\t} else {\n\t\t\tplan.push_back({interleaveStep, 0});\n\t\t\tplan.push_back({StepType::firstFFT, 0});\n\t\t\tfor (size_t s = 1; s < outerSize; ++s) {\n\t\t\t\tplan.push_back({StepType::middleFFT, s*innerSize});\n\t\t\t}\n\t\t\tplan.push_back({StepType::twiddles, 0});\n\t\t\tplan.push_back({finalStep, 0});\n\n\t\t\tif (finalStep == StepType::finalOrderN) {\n\t\t\t\tdftTmp.resize(outerSize);\n\t\t\t\tdftTwists.resize(outerSize);\n\t\t\t\tfor (size_t s = 0; s < outerSize; ++s) {\n\t\t\t\t\tSample dftPhase = Sample(-2*M_PI*s/outerSize);\n\t\t\t\t\tdftTwists[s] = std::polar(Sample(1), dftPhase);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsize_t size() const {\n\t\treturn innerSize*outerSize;\n\t}\n\tsize_t steps() const {\n\t\treturn plan.size();\n\t}\n\n\tvoid fft(const Complex *time, Complex *freq) {\n\t\tfor (auto &step : plan) {\n\t\t\tfftStep<false>(step, time, freq);\n\t\t}\n\t}\n\tvoid fft(size_t step, const Complex *time, Complex *freq) {\n\t\tfftStep<false>(plan[step], time, freq);\n\t}\n\tvoid fft(const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {\n\t\tfor (auto &step : plan) {\n\t\t\tfftStep<false>(step, inR, inI, outR, outI);\n\t\t}\n\t}\n\tvoid fft(size_t step, const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {\n\t\tfftStep<false>(plan[step], inR, inI, outR, outI);\n\t}\n\n\tvoid ifft(const Complex *freq, Complex *time) {\n\t\tfor (auto &step : plan) {\n\t\t\tfftStep<true>(step, freq, time);\n\t\t}\n\t}\n\tvoid ifft(size_t step, const Complex *freq, Complex *time) {\n\t\tfftStep<true>(plan[step], freq, time);\n\t}\n\tvoid ifft(const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {\n\t\tfor (auto &step : plan) {\n\t\t\tfftStep<true>(step, inR, inI, outR, outI);\n\t\t}\n\t}\n\tvoid ifft(size_t step, const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {\n\t\tfftStep<true>(plan[step], inR, inI, outR, outI);\n\t}\nprivate:\n\tusing InnerFFT = Pow2FFT<Sample>;\n\tInnerFFT innerFFT;\n\n\tsize_t innerSize, outerSize;\n\tstd::vector<Complex> tmpFreq;\n\tstd::vector<Complex> outerTwiddles;\n\tstd::vector<Sample> outerTwiddlesR, outerTwiddlesI;\n\tstd::vector<Complex> dftTwists, dftTmp;\n\n\tenum class StepType {\n\t\tpassthrough,\n\t\tinterleaveOrder2, interleaveOrder3, interleaveOrder4, interleaveOrder5, interleaveOrderN,\n\t\tfirstFFT, middleFFT,\n\t\ttwiddles,\n\t\tfinalOrder2, finalOrder3, finalOrder4, finalOrder5, finalOrderN\n\t};\n\tstruct Step {\n\t\tStepType type;\n\t\tsize_t offset;\n\t};\n\tstd::vector<Step> plan;\n\n\ttemplate<bool inverse>\n\tvoid fftStep(Step step, const Complex *time, Complex *freq) {\n\t\tswitch (step.type) {\n\t\t\tcase (StepType::passthrough): {\n\t\t\t\tif (inverse) {\n\t\t\t\t\tinnerFFT.ifft(time, freq);\n\t\t\t\t} else {\n\t\t\t\t\tinnerFFT.fft(time, freq);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::interleaveOrder2): {\n\t\t\t\t_impl::interleaveCopy<2>(time, tmpFreq.data(), innerSize);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::interleaveOrder3): {\n\t\t\t\t_impl::interleaveCopy<3>(time, tmpFreq.data(), innerSize);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::interleaveOrder4): {\n\t\t\t\t_impl::interleaveCopy<4>(time, tmpFreq.data(), innerSize);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::interleaveOrder5): {\n\t\t\t\t_impl::interleaveCopy<5>(time, tmpFreq.data(), innerSize);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::interleaveOrderN): {\n\t\t\t\t_impl::interleaveCopy(time, tmpFreq.data(), outerSize, innerSize);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::firstFFT): {\n\t\t\t\tif (inverse) {\n\t\t\t\t\tinnerFFT.ifft(tmpFreq.data(), freq);\n\t\t\t\t} else {\n\t\t\t\t\tinnerFFT.fft(tmpFreq.data(), freq);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::middleFFT): {\n\t\t\t\tComplex *offsetOut = freq + step.offset;\n\t\t\t\tif (inverse) {\n\t\t\t\t\tinnerFFT.ifft(tmpFreq.data() + step.offset, offsetOut);\n\t\t\t\t} else {\n\t\t\t\t\tinnerFFT.fft(tmpFreq.data() + step.offset, offsetOut);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::twiddles): {\n\t\t\t\tif (inverse) {\n\t\t\t\t\t_impl::complexMulConj(freq + innerSize, freq + innerSize, outerTwiddles.data(), innerSize*(outerSize - 1));\n\t\t\t\t} else {\n\t\t\t\t\t_impl::complexMul(freq + innerSize, freq + innerSize, outerTwiddles.data(), innerSize*(outerSize - 1));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase StepType::finalOrder2:\n\t\t\t\tfinalPass2(freq);\n\t\t\t\tbreak;\n\t\t\tcase StepType::finalOrder3:\n\t\t\t\tfinalPass3<inverse>(freq);\n\t\t\t\tbreak;\n\t\t\tcase StepType::finalOrder4:\n\t\t\t\tfinalPass4<inverse>(freq);\n\t\t\t\tbreak;\n\t\t\tcase StepType::finalOrder5:\n\t\t\t\tfinalPass5<inverse>(freq);\n\t\t\t\tbreak;\n\t\t\tcase StepType::finalOrderN:\n\t\t\t\tfinalPassN<inverse>(freq);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\ttemplate<bool inverse>\n\tvoid fftStep(Step step, const Sample *inR, const Sample *inI, Sample *outR, Sample *outI) {\n\t\tSample *tmpR = (Sample *)tmpFreq.data(), *tmpI = tmpR + tmpFreq.size();\n\t\tswitch (step.type) {\n\t\t\tcase (StepType::passthrough): {\n\t\t\t\tif (inverse) {\n\t\t\t\t\tinnerFFT.ifft(inR, inI, outR, outI);\n\t\t\t\t} else {\n\t\t\t\t\tinnerFFT.fft(inR, inI, outR, outI);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::interleaveOrder2): {\n\t\t\t\t_impl::interleaveCopy<2>(inR, tmpR, innerSize);\n\t\t\t\t_impl::interleaveCopy<2>(inI, tmpI, innerSize);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::interleaveOrder3): {\n\t\t\t\t_impl::interleaveCopy<3>(inR, tmpR, innerSize);\n\t\t\t\t_impl::interleaveCopy<3>(inI, tmpI, innerSize);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::interleaveOrder4): {\n\t\t\t\t_impl::interleaveCopy<4>(inR, tmpR, innerSize);\n\t\t\t\t_impl::interleaveCopy<4>(inI, tmpI, innerSize);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::interleaveOrder5): {\n\t\t\t\t_impl::interleaveCopy<5>(inR, tmpR, innerSize);\n\t\t\t\t_impl::interleaveCopy<5>(inI, tmpI, innerSize);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::interleaveOrderN): {\n\t\t\t\t_impl::interleaveCopy(inR, inI, tmpR, tmpI, outerSize, innerSize);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::firstFFT): {\n\t\t\t\tif (inverse) {\n\t\t\t\t\tinnerFFT.ifft(tmpR, tmpI, outR, outI);\n\t\t\t\t} else {\n\t\t\t\t\tinnerFFT.fft(tmpR, tmpI, outR, outI);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase (StepType::middleFFT): {\n\t\t\t\tsize_t offset = step.offset;\n\t\t\t\tSample *offsetOutR = outR + offset;\n\t\t\t\tSample *offsetOutI = outI + offset;\n\t\t\t\tif (inverse) {\n\t\t\t\t\tinnerFFT.ifft(tmpR + offset, tmpI + offset, offsetOutR, offsetOutI);\n\t\t\t\t} else {\n\t\t\t\t\tinnerFFT.fft(tmpR + offset, tmpI + offset, offsetOutR, offsetOutI);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase(StepType::twiddles): {\n\t\t\t\tauto *twiddlesR = outerTwiddlesR.data();\n\t\t\t\tauto *twiddlesI = outerTwiddlesI.data();\n\t\t\t\tif (inverse) {\n\t\t\t\t\t_impl::complexMulConj(outR + innerSize, outI + innerSize, outR + innerSize, outI + innerSize, twiddlesR, twiddlesI, innerSize*(outerSize - 1));\n\t\t\t\t} else {\n\t\t\t\t\t_impl::complexMul(outR + innerSize, outI + innerSize, outR + innerSize, outI + innerSize, twiddlesR, twiddlesI, innerSize*(outerSize - 1));\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase StepType::finalOrder2:\n\t\t\t\tfinalPass2(outR, outI);\n\t\t\t\tbreak;\n\t\t\tcase StepType::finalOrder3:\n\t\t\t\tfinalPass3<inverse>(outR, outI);\n\t\t\t\tbreak;\n\t\t\tcase StepType::finalOrder4:\n\t\t\t\tfinalPass4<inverse>(outR, outI);\n\t\t\t\tbreak;\n\t\t\tcase StepType::finalOrder5:\n\t\t\t\tfinalPass5<inverse>(outR, outI);\n\t\t\t\tbreak;\n\t\t\tcase StepType::finalOrderN:\n\t\t\t\tfinalPassN<inverse>(outR, outI);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tvoid finalPass2(Complex *f0) {\n\t\tauto *f1 = f0 + innerSize;\n\t\tfor (size_t i = 0; i < innerSize; ++i) {\n\t\t\tComplex a = f0[i], b = f1[i];\n\t\t\tf0[i] = a + b;\n\t\t\tf1[i] = a - b;\n\t\t}\n\t}\n\tvoid finalPass2(Sample *f0r, Sample *f0i) {\n\t\tauto *f1r = f0r + innerSize;\n\t\tauto *f1i = f0i + innerSize;\n\t\tfor (size_t i = 0; i < innerSize; ++i) {\n\t\t\tSample ar = f0r[i], ai = f0i[i];\n\t\t\tSample br = f1r[i], bi = f1i[i];\n\t\t\tf0r[i] = ar + br;\n\t\t\tf0i[i] = ai + bi;\n\t\t\tf1r[i] = ar - br;\n\t\t\tf1i[i] = ai - bi;\n\t\t}\n\t}\n\ttemplate<bool inverse>\n\tvoid finalPass3(Complex *f0) {\n\t\tauto *f1 = f0 + innerSize;\n\t\tauto *f2 = f0 + innerSize*2;\n\t\tconst Complex tw1{Sample(-0.5), Sample(-std::sqrt(0.75)*(inverse ? -1 : 1))};\n\t\tfor (size_t i = 0; i < innerSize; ++i) {\n\t\t\tComplex a = f0[i], b = f1[i], c = f2[i];\n\t\t\tComplex bc0 = b + c, bc1 = b - c;\n\t\t\tf0[i] = a + bc0;\n\t\t\tf1[i] = {\n\t\t\t\ta.real() + bc0.real()*tw1.real() - bc1.imag()*tw1.imag(),\n\t\t\t\ta.imag() + bc0.imag()*tw1.real() + bc1.real()*tw1.imag()\n\t\t\t};\n\t\t\tf2[i] = {\n\t\t\t\ta.real() + bc0.real()*tw1.real() + bc1.imag()*tw1.imag(),\n\t\t\t\ta.imag() + bc0.imag()*tw1.real() - bc1.real()*tw1.imag()\n\t\t\t};\n\t\t}\n\t}\n\ttemplate<bool inverse>\n\tvoid finalPass3(Sample *f0r, Sample *f0i) {\n\t\tauto *f1r = f0r + innerSize;\n\t\tauto *f1i = f0i + innerSize;\n\t\tauto *f2r = f0r + innerSize*2;\n\t\tauto *f2i = f0i + innerSize*2;\n\t\tconst Sample tw1r = -0.5, tw1i = -std::sqrt(0.75)*(inverse ? -1 : 1);\n\n\t\tfor (size_t i = 0; i < innerSize; ++i) {\n\t\t\tSample ar = f0r[i], ai = f0i[i], br = f1r[i], bi = f1i[i], cr = f2r[i], ci = f2i[i];\n\n\t\t\tf0r[i] = ar + br + cr;\n\t\t\tf0i[i] = ai + bi + ci;\n\t\t\tf1r[i] = ar + br*tw1r - bi*tw1i + cr*tw1r + ci*tw1i;\n\t\t\tf1i[i] = ai + bi*tw1r + br*tw1i - cr*tw1i + ci*tw1r;\n\t\t\tf2r[i] = ar + br*tw1r + bi*tw1i + cr*tw1r - ci*tw1i;\n\t\t\tf2i[i] = ai + bi*tw1r - br*tw1i + cr*tw1i + ci*tw1r;\n\t\t}\n\t}\n\ttemplate<bool inverse>\n\tvoid finalPass4(Complex *f0) {\n\t\tauto *f1 = f0 + innerSize;\n\t\tauto *f2 = f0 + innerSize*2;\n\t\tauto *f3 = f0 + innerSize*3;\n\t\tfor (size_t i = 0; i < innerSize; ++i) {\n\t\t\tComplex a = f0[i], b = f1[i], c = f2[i], d = f3[i];\n\n\t\t\tComplex ac0 = a + c, ac1 = a - c;\n\t\t\tComplex bd0 = b + d, bd1 = inverse ? (b - d) : (d - b);\n\t\t\tComplex bd1i = {-bd1.imag(), bd1.real()};\n\t\t\tf0[i] = ac0 + bd0;\n\t\t\tf1[i] = ac1 + bd1i;\n\t\t\tf2[i] = ac0 - bd0;\n\t\t\tf3[i] = ac1 - bd1i;\n\t\t}\n\t}\n\ttemplate<bool inverse>\n\tvoid finalPass4(Sample *f0r, Sample *f0i) {\n\t\tauto *f1r = f0r + innerSize;\n\t\tauto *f1i = f0i + innerSize;\n\t\tauto *f2r = f0r + innerSize*2;\n\t\tauto *f2i = f0i + innerSize*2;\n\t\tauto *f3r = f0r + innerSize*3;\n\t\tauto *f3i = f0i + innerSize*3;\n\t\tfor (size_t i = 0; i < innerSize; ++i) {\n\t\t\tSample ar = f0r[i], ai = f0i[i], br = f1r[i], bi = f1i[i], cr = f2r[i], ci = f2i[i], dr = f3r[i], di = f3i[i];\n\n\t\t\tSample ac0r = ar + cr, ac0i = ai + ci;\n\t\t\tSample ac1r = ar - cr, ac1i = ai - ci;\n\t\t\tSample bd0r = br + dr, bd0i = bi + di;\n\t\t\tSample bd1r = br - dr, bd1i = bi - di;\n\n\t\t\tf0r[i] = ac0r + bd0r;\n\t\t\tf0i[i] = ac0i + bd0i;\n\t\t\tf1r[i] = inverse ? (ac1r - bd1i) : (ac1r + bd1i);\n\t\t\tf1i[i] = inverse ? (ac1i + bd1r) : (ac1i - bd1r);\n\t\t\tf2r[i] = ac0r - bd0r;\n\t\t\tf2i[i] = ac0i - bd0i;\n\t\t\tf3r[i] = inverse ? (ac1r + bd1i) : (ac1r - bd1i);\n\t\t\tf3i[i] = inverse ? (ac1i - bd1r) : (ac1i + bd1r);\n\t\t}\n\t}\n\ttemplate<bool inverse>\n\tvoid finalPass5(Complex *f0) {\n\t\tauto *f1 = f0 + innerSize;\n\t\tauto *f2 = f0 + innerSize*2;\n\t\tauto *f3 = f0 + innerSize*3;\n\t\tauto *f4 = f0 + innerSize*4;\n\t\tconst Sample tw1r = 0.30901699437494745;\n\t\tconst Sample tw1i = -0.9510565162951535*(inverse ? -1 : 1);\n\t\tconst Sample tw2r = -0.8090169943749473;\n\t\tconst Sample tw2i = -0.5877852522924732*(inverse ? -1 : 1);\n\t\tfor (size_t i = 0; i < innerSize; ++i) {\n\t\t\tComplex a = f0[i], b = f1[i], c = f2[i], d = f3[i], e = f4[i];\n\n\t\t\tComplex be0 = b + e, be1 = {e.imag() - b.imag(), b.real() - e.real()}; // (b - e)*i\n\t\t\tComplex cd0 = c + d, cd1 = {d.imag() - c.imag(), c.real() - d.real()};\n\n\t\t\tComplex bcde01 = be0*tw1r + cd0*tw2r;\n\t\t\tComplex bcde02 = be0*tw2r + cd0*tw1r;\n\t\t\tComplex bcde11 = be1*tw1i + cd1*tw2i;\n\t\t\tComplex bcde12 = be1*tw2i - cd1*tw1i;\n\n\t\t\tf0[i] = a + be0 + cd0;\n\t\t\tf1[i] = a + bcde01 + bcde11;\n\t\t\tf2[i] = a + bcde02 + bcde12;\n\t\t\tf3[i] = a + bcde02 - bcde12;\n\t\t\tf4[i] = a + bcde01 - bcde11;\n\t\t}\n\t}\n\ttemplate<bool inverse>\n\tvoid finalPass5(Sample *f0r, Sample *f0i) {\n\t\tauto *f1r = f0r + innerSize;\n\t\tauto *f1i = f0i + innerSize;\n\t\tauto *f2r = f0r + innerSize*2;\n\t\tauto *f2i = f0i + innerSize*2;\n\t\tauto *f3r = f0r + innerSize*3;\n\t\tauto *f3i = f0i + innerSize*3;\n\t\tauto *f4r = f0r + innerSize*4;\n\t\tauto *f4i = f0i + innerSize*4;\n\n\t\tconst Sample tw1r = 0.30901699437494745;\n\t\tconst Sample tw1i = -0.9510565162951535*(inverse ? -1 : 1);\n\t\tconst Sample tw2r = -0.8090169943749473;\n\t\tconst Sample tw2i = -0.5877852522924732*(inverse ? -1 : 1);\n\t\tfor (size_t i = 0; i < innerSize; ++i) {\n\t\t\tSample ar = f0r[i], ai = f0i[i], br = f1r[i], bi = f1i[i], cr = f2r[i], ci = f2i[i], dr = f3r[i], di = f3i[i], er = f4r[i], ei = f4i[i];\n\n\t\t\tSample be0r = br + er, be0i = bi + ei;\n\t\t\tSample be1r = ei - bi, be1i = br - er;\n\t\t\tSample cd0r = cr + dr, cd0i = ci + di;\n\t\t\tSample cd1r = di - ci, cd1i = cr - dr;\n\n\t\t\tSample bcde01r = be0r*tw1r + cd0r*tw2r, bcde01i = be0i*tw1r + cd0i*tw2r;\n\t\t\tSample bcde02r = be0r*tw2r + cd0r*tw1r, bcde02i = be0i*tw2r + cd0i*tw1r;\n\t\t\tSample bcde11r = be1r*tw1i + cd1r*tw2i, bcde11i = be1i*tw1i + cd1i*tw2i;\n\t\t\tSample bcde12r = be1r*tw2i - cd1r*tw1i, bcde12i = be1i*tw2i - cd1i*tw1i;\n\n\t\t\tf0r[i] = ar + be0r + cd0r;\n\t\t\tf0i[i] = ai + be0i + cd0i;\n\t\t\tf1r[i] = ar + bcde01r + bcde11r;\n\t\t\tf1i[i] = ai + bcde01i + bcde11i;\n\t\t\tf2r[i] = ar + bcde02r + bcde12r;\n\t\t\tf2i[i] = ai + bcde02i + bcde12i;\n\t\t\tf3r[i] = ar + bcde02r - bcde12r;\n\t\t\tf3i[i] = ai + bcde02i - bcde12i;\n\t\t\tf4r[i] = ar + bcde01r - bcde11r;\n\t\t\tf4i[i] = ai + bcde01i - bcde11i;\n\t\t}\n\t}\n\n\ttemplate<bool inverse>\n\tvoid finalPassN(Complex *f0) {\n\t\tfor (size_t i = 0; i < innerSize; ++i) {\n\t\t\tComplex *offsetFreq = f0 + i;\n\t\t\tComplex sum = 0;\n\t\t\tfor (size_t i2 = 0; i2 < outerSize; ++i2) {\n\t\t\t\tsum += (dftTmp[i2] = offsetFreq[i2*innerSize]);\n\t\t\t}\n\t\t\toffsetFreq[0] = sum;\n\n\t\t\tfor (size_t f = 1; f < outerSize; ++f) {\n\t\t\t\tComplex sum = dftTmp[0];\n\n\t\t\t\tfor (size_t i2 = 1; i2 < outerSize; ++i2) {\n\t\t\t\t\tsize_t twistIndex = (i2*f)%outerSize;\n\t\t\t\t\tComplex twist = inverse ? std::conj(dftTwists[twistIndex]) : dftTwists[twistIndex];\n\t\t\t\t\tsum += Complex{\n\t\t\t\t\t\tdftTmp[i2].real()*twist.real() - dftTmp[i2].imag()*twist.imag(),\n\t\t\t\t\t\tdftTmp[i2].imag()*twist.real() + dftTmp[i2].real()*twist.imag()\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\toffsetFreq[f*innerSize] = sum;\n\t\t\t}\n\t\t}\n\t}\n\ttemplate<bool inverse>\n\tvoid finalPassN(Sample *f0r, Sample *f0i) {\n\t\tSample *tmpR = (Sample *)dftTmp.data(), *tmpI = tmpR + outerSize;\n\n\t\tfor (size_t i = 0; i < innerSize; ++i) {\n\t\t\tSample *offsetR = f0r + i;\n\t\t\tSample *offsetI = f0i + i;\n\t\t\tSample sumR = 0, sumI = 0;\n\t\t\tfor (size_t i2 = 0; i2 < outerSize; ++i2) {\n\t\t\t\tsumR += (tmpR[i2] = offsetR[i2*innerSize]);\n\t\t\t\tsumI += (tmpI[i2] = offsetI[i2*innerSize]);\n\t\t\t}\n\t\t\toffsetR[0] = sumR;\n\t\t\toffsetI[0] = sumI;\n\n\t\t\tfor (size_t f = 1; f < outerSize; ++f) {\n\t\t\t\tSample sumR = *tmpR, sumI = *tmpI;\n\n\t\t\t\tfor (size_t i2 = 1; i2 < outerSize; ++i2) {\n\t\t\t\t\tsize_t twistIndex = (i2*f)%outerSize;\n\t\t\t\t\tComplex twist = inverse ? std::conj(dftTwists[twistIndex]) : dftTwists[twistIndex];\n\t\t\t\t\tsumR += tmpR[i2]*twist.real() - tmpI[i2]*twist.imag();\n\t\t\t\t\tsumI += tmpI[i2]*twist.real() + tmpR[i2]*twist.imag();\n\t\t\t\t}\n\n\t\t\t\toffsetR[f*innerSize] = sumR;\n\t\t\t\toffsetI[f*innerSize] = sumI;\n\t\t\t}\n\t\t}\n\t}\n};\n\ntemplate<typename Sample, bool splitComputation=false>\nusing FFT = SplitFFT<Sample, splitComputation>;\n\n// Wraps a complex FFT into a real one\ntemplate<typename Sample, class ComplexFFT=Pow2FFT<Sample>>\nstruct SimpleRealFFT {\n\tusing Complex = std::complex<Sample>;\n\n\tstatic constexpr bool prefersSplit = ComplexFFT::prefersSplit;\n\n\tSimpleRealFFT(size_t size=0) {\n\t\tresize(size);\n\t}\n\n\tvoid resize(size_t size) {\n\t\tcomplexFft.resize(size);\n\t\ttmpTime.resize(size);\n\t\ttmpFreq.resize(size);\n\t}\n\n\tvoid fft(const Sample *time, Complex *freq) {\n\t\tfor (size_t i = 0; i < tmpTime.size(); ++i) {\n\t\t\ttmpTime[i] = time[i];\n\t\t}\n\t\tcomplexFft.fft(tmpTime.data(), tmpFreq.data());\n\t\tfor (size_t i = 0; i < tmpFreq.size()/2; ++i) {\n\t\t\tfreq[i] = tmpFreq[i];\n\t\t}\n\t\tfreq[0] = {\n\t\t\ttmpFreq[0].real(),\n\t\t\ttmpFreq[tmpFreq.size()/2].real()\n\t\t};\n\t}\n\tvoid fft(const Sample *inR, Sample *outR, Sample *outI) {\n\t\tSample *tmpFreqR = (Sample *)tmpFreq.data(), *tmpFreqI = tmpFreqR + tmpFreq.size();\n\t\tfor (size_t i = 0; i < tmpTime.size()/2; ++i) {\n\t\t\ttmpTime[i] = 0;\n\t\t}\n\t\tcomplexFft.fft(inR, (const Sample *)tmpTime.data(), tmpFreqR, tmpFreqI);\n\t\tfor (size_t i = 0; i < tmpTime.size()/2; ++i) {\n\t\t\toutR[i] = tmpFreqR[i];\n\t\t\toutI[i] = tmpFreqI[i];\n\t\t}\n\t\toutI[0] = tmpFreqR[tmpFreq.size()/2];\n\t}\n\n\tvoid ifft(const Complex *freq, Sample *time) {\n\t\ttmpFreq[0] = freq[0].real();\n\t\ttmpFreq[tmpFreq.size()/2] = freq[0].imag();\n\t\tfor (size_t i = 1; i < tmpFreq.size()/2; ++i) {\n\t\t\ttmpFreq[i] = freq[i];\n\t\t\ttmpFreq[tmpFreq.size() - i] = std::conj(freq[i]);\n\t\t}\n\t\tcomplexFft.ifft(tmpFreq.data(), tmpTime.data());\n\t\tfor (size_t i = 0; i < tmpTime.size(); ++i) {\n\t\t\ttime[i] = tmpTime[i].real();\n\t\t}\n\t}\n\tvoid ifft(const Sample *inR, const Sample *inI, Sample *outR) {\n\t\tSample *tmpFreqR = (Sample *)tmpFreq.data(), *tmpFreqI = tmpFreqR + tmpFreq.size();\n\t\ttmpFreqR[0] = inR[0];\n\t\ttmpFreqR[tmpFreq.size()/2] = inI[0];\n\t\ttmpFreqI[0] = 0;\n\t\ttmpFreqI[tmpFreq.size()/2] = 0;\n\t\tfor (size_t i = 1; i < tmpFreq.size()/2; ++i) {\n\t\t\ttmpFreqR[i] = inR[i];\n\t\t\ttmpFreqI[i] = inI[i];\n\t\t\ttmpFreqR[tmpFreq.size() - i] = inR[i];\n\t\t\ttmpFreqI[tmpFreq.size() - i] = -inI[i];\n\t\t}\n\t\tcomplexFft.ifft(tmpFreqR, tmpFreqI, outR, (Sample *)tmpTime.data());\n\t}\n\nprivate:\n\tComplexFFT complexFft;\n\tstd::vector<Complex> tmpTime, tmpFreq;\n};\n\n/// A default power-of-2 FFT, specialised with platform-specific fast implementations where available\ntemplate<typename Sample>\nstruct Pow2RealFFT : public SimpleRealFFT<Sample> {\n\tstatic constexpr bool prefersSplit = SimpleRealFFT<Sample>::prefersSplit;\n\n\tusing SimpleRealFFT<Sample>::SimpleRealFFT;\n\n\t// Prevent copying, since it might be a problem for specialisations\n\tPow2RealFFT(const Pow2RealFFT &other) = delete;\n\t// Pass move-constructor through, just to be explicit about it\n\tPow2RealFFT(Pow2RealFFT &&other) : SimpleRealFFT<Sample>(std::move(other)) {}\n};\n\n/// A Real FFT which can handle multiples of 3 and 5, and can be computed in chunks\ntemplate<typename Sample, bool splitComputation=false, bool halfBinShift=false>\nstruct RealFFT {\n\tusing Complex = std::complex<Sample>;\n\tstatic constexpr bool prefersSplit = SplitFFT<Sample, splitComputation>::prefersSplit;\n\n\tstatic size_t fastSizeAbove(size_t size) {\n\t\treturn ComplexFFT::fastSizeAbove((size + 1)/2)*2;\n\t}\n\n\tRealFFT(size_t size=0) {\n\t\tresize(size);\n\t}\n\n\tvoid resize(size_t size) {\n\t\tsize_t hSize = size/2;\n\t\tcomplexFft.resize(hSize);\n\t\ttmpFreq.resize(hSize);\n\t\ttmpTime.resize(hSize);\n\n\t\ttwiddles.resize(hSize/2 + 1);\n\n\t\tif (!halfBinShift) {\n\t\t\tfor (size_t i = 0; i < twiddles.size(); ++i) {\n\t\t\t\tSample rotPhase = i*(-2*M_PI/size) - M_PI/2; // bake rotation by (-i) into twiddles\n\t\t\t\ttwiddles[i] = std::polar(Sample(1), rotPhase);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (size_t i = 0; i < twiddles.size(); ++i) {\n\t\t\t\tSample rotPhase = (i + 0.5)*(-2*M_PI/size) - M_PI/2;\n\t\t\t\ttwiddles[i] = std::polar(Sample(1), rotPhase);\n\t\t\t}\n\n\t\t\thalfBinTwists.resize(hSize);\n\t\t\tfor (size_t i = 0; i < hSize; ++i) {\n\t\t\t\tSample twistPhase = -2*M_PI*i/size;\n\t\t\t\thalfBinTwists[i] = std::polar(Sample(1), twistPhase);\n\t\t\t}\n\t\t}\n\t}\n\n\tsize_t size() const {\n\t\treturn complexFft.size()*2;\n\t}\n\tsize_t steps() const {\n\t\treturn complexFft.steps() + (splitComputation ? 3 : 2);\n\t}\n\n\tvoid fft(const Sample *time, Complex *freq) {\n\t\tfor (size_t s = 0; s < steps(); ++s) {\n\t\t\tfft(s, time, freq);\n\t\t}\n\t}\n\tvoid fft(size_t step, const Sample *time, Complex *freq) {\n\t\tif (complexPrefersSplit) {\n\t\t\tsize_t hSize = complexFft.size();\n\t\t\tSample *tmpTimeR = (Sample *)tmpTime.data(), *tmpTimeI = tmpTimeR + hSize;\n\t\t\tSample *tmpFreqR = (Sample *)tmpFreq.data(), *tmpFreqI = tmpFreqR + hSize;\n\t\t\tif (step-- == 0) {\n\t\t\t\tsize_t hSize = complexFft.size();\n\t\t\t\tif (halfBinShift) {\n\t\t\t\t\tfor (size_t i = 0; i < hSize; ++i) {\n\t\t\t\t\t\tSample tr = time[2*i], ti = time[2*i + 1];\n\t\t\t\t\t\tComplex twist = halfBinTwists[i];\n\t\t\t\t\t\ttmpTimeR[i] = tr*twist.real() - ti*twist.imag();\n\t\t\t\t\t\ttmpTimeI[i] = ti*twist.real() + tr*twist.imag();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (size_t i = 0; i < hSize; ++i) {\n\t\t\t\t\t\ttmpTimeR[i] = time[2*i];\n\t\t\t\t\t\ttmpTimeI[i] = time[2*i + 1];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (step < complexFft.steps()) {\n\t\t\t\tcomplexFft.fft(step, tmpTimeR, tmpTimeI, tmpFreqR, tmpFreqI);\n\t\t\t} else {\n\t\t\t\tif (!halfBinShift) {\n\t\t\t\t\tSample bin0r = tmpFreqR[0], bin0i = tmpFreqI[0];\n\t\t\t\t\tfreq[0] = {bin0r + bin0i, bin0r - bin0i};\n\t\t\t\t}\n\n\t\t\t\tsize_t startI = halfBinShift ? 0 : 1;\n\t\t\t\tsize_t endI = hSize/2 + 1;\n\t\t\t\tif (splitComputation) { // Do this last twiddle in two halves\n\t\t\t\t\tif (step == complexFft.steps()) {\n\t\t\t\t\t\tendI = (startI + endI)/2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstartI = (startI + endI)/2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (size_t i = startI; i < endI; ++i) {\n\t\t\t\t\tsize_t conjI = halfBinShift ? (hSize - 1 - i) : (hSize - i);\n\t\t\t\t\tComplex twiddle = twiddles[i];\n\n\t\t\t\t\tSample oddR = (tmpFreqR[i] + tmpFreqR[conjI])*Sample(0.5);\n\t\t\t\t\tSample oddI = (tmpFreqI[i] - tmpFreqI[conjI])*Sample(0.5);\n\t\t\t\t\tSample evenIR = (tmpFreqR[i] - tmpFreqR[conjI])*Sample(0.5);\n\t\t\t\t\tSample evenII = (tmpFreqI[i] + tmpFreqI[conjI])*Sample(0.5);\n\t\t\t\t\tSample evenRotMinusIR = evenIR*twiddle.real() - evenII*twiddle.imag();\n\t\t\t\t\tSample evenRotMinusII = evenII*twiddle.real() + evenIR*twiddle.imag();\n\n\t\t\t\t\tfreq[i] = {oddR + evenRotMinusIR, oddI + evenRotMinusII};\n\t\t\t\t\tfreq[conjI] = {oddR - evenRotMinusIR, evenRotMinusII - oddI};\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tbool canUseTime = !halfBinShift && !(size_t(time)%alignof(Complex));\n\t\t\tif (step-- == 0) {\n\t\t\t\tsize_t hSize = complexFft.size();\n\t\t\t\tif (halfBinShift) {\n\t\t\t\t\tfor (size_t i = 0; i < hSize; ++i) {\n\t\t\t\t\t\tSample tr = time[2*i], ti = time[2*i + 1];\n\t\t\t\t\t\tComplex twist = halfBinTwists[i];\n\t\t\t\t\t\ttmpTime[i] = {\n\t\t\t\t\t\t\ttr*twist.real() - ti*twist.imag(),\n\t\t\t\t\t\t\tti*twist.real() + tr*twist.imag()\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t} else if (!canUseTime) {\n\t\t\t\t\tstd::memcpy(tmpTime.data(), time, sizeof(Complex)*hSize);\n\t\t\t\t}\n\t\t\t} else if (step < complexFft.steps()) {\n\t\t\t\tcomplexFft.fft(step, canUseTime ? (const Complex *)time : tmpTime.data(), tmpFreq.data());\n\t\t\t} else {\n\t\t\t\tif (!halfBinShift) {\n\t\t\t\t\tComplex bin0 = tmpFreq[0];\n\t\t\t\t\tfreq[0] = { // pack DC & Nyquist together\n\t\t\t\t\t\tbin0.real() + bin0.imag(),\n\t\t\t\t\t\tbin0.real() - bin0.imag()\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tsize_t hSize = complexFft.size();\n\t\t\t\tsize_t startI = halfBinShift ? 0 : 1;\n\t\t\t\tsize_t endI = hSize/2 + 1;\n\t\t\t\tif (splitComputation) { // Do this last twiddle in two halves\n\t\t\t\t\tif (step == complexFft.steps()) {\n\t\t\t\t\t\tendI = (startI + endI)/2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstartI = (startI + endI)/2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (size_t i = startI; i < endI; ++i) {\n\t\t\t\t\tsize_t conjI = halfBinShift ? (hSize - 1 - i) : (hSize - i);\n\t\t\t\t\tComplex twiddle = twiddles[i];\n\n\t\t\t\t\tComplex odd = (tmpFreq[i] + std::conj(tmpFreq[conjI]))*Sample(0.5);\n\t\t\t\t\tComplex evenI = (tmpFreq[i] - std::conj(tmpFreq[conjI]))*Sample(0.5);\n\t\t\t\t\tComplex evenRotMinusI = { // twiddle includes a factor of -i\n\t\t\t\t\t\tevenI.real()*twiddle.real() - evenI.imag()*twiddle.imag(),\n\t\t\t\t\t\tevenI.imag()*twiddle.real() + evenI.real()*twiddle.imag()\n\t\t\t\t\t};\n\n\t\t\t\t\tfreq[i] = odd + evenRotMinusI;\n\t\t\t\t\tfreq[conjI] = {odd.real() - evenRotMinusI.real(), evenRotMinusI.imag() - odd.imag()};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvoid fft(const Sample *inR, Sample *outR, Sample *outI) {\n\t\tfor (size_t s = 0; s < steps(); ++s) {\n\t\t\tfft(s, inR, outR, outI);\n\t\t}\n\t}\n\tvoid fft(size_t step, const Sample *inR, Sample *outR, Sample *outI) {\n\t\tsize_t hSize = complexFft.size();\n\t\tSample *tmpTimeR = (Sample *)tmpTime.data(), *tmpTimeI = tmpTimeR + hSize;\n\t\tSample *tmpFreqR = (Sample *)tmpFreq.data(), *tmpFreqI = tmpFreqR + hSize;\n\t\tif (step-- == 0) {\n\t\t\tsize_t hSize = complexFft.size();\n\t\t\tif (halfBinShift) {\n\t\t\t\tfor (size_t i = 0; i < hSize; ++i) {\n\t\t\t\t\tSample tr = inR[2*i], ti = inR[2*i + 1];\n\t\t\t\t\tComplex twist = halfBinTwists[i];\n\t\t\t\t\ttmpTimeR[i] = tr*twist.real() - ti*twist.imag();\n\t\t\t\t\ttmpTimeI[i] = ti*twist.real() + tr*twist.imag();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (size_t i = 0; i < hSize; ++i) {\n\t\t\t\t\ttmpTimeR[i] = inR[2*i];\n\t\t\t\t\ttmpTimeI[i] = inR[2*i + 1];\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (step < complexFft.steps()) {\n\t\t\tcomplexFft.fft(step, tmpTimeR, tmpTimeI, tmpFreqR, tmpFreqI);\n\t\t} else {\n\t\t\tif (!halfBinShift) {\n\t\t\t\tSample bin0r = tmpFreqR[0], bin0i = tmpFreqI[0];\n\t\t\t\toutR[0] = bin0r + bin0i;\n\t\t\t\toutI[0] = bin0r - bin0i;\n\t\t\t}\n\n\t\t\tsize_t startI = halfBinShift ? 0 : 1;\n\t\t\tsize_t endI = hSize/2 + 1;\n\t\t\tif (splitComputation) { // Do this last twiddle in two halves\n\t\t\t\tif (step == complexFft.steps()) {\n\t\t\t\t\tendI = (startI + endI)/2;\n\t\t\t\t} else {\n\t\t\t\t\tstartI = (startI + endI)/2;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (size_t i = startI; i < endI; ++i) {\n\t\t\t\tsize_t conjI = halfBinShift ? (hSize - 1 - i) : (hSize - i);\n\t\t\t\tComplex twiddle = twiddles[i];\n\n\t\t\t\tSample oddR = (tmpFreqR[i] + tmpFreqR[conjI])*Sample(0.5);\n\t\t\t\tSample oddI = (tmpFreqI[i] - tmpFreqI[conjI])*Sample(0.5);\n\t\t\t\tSample evenIR = (tmpFreqR[i] - tmpFreqR[conjI])*Sample(0.5);\n\t\t\t\tSample evenII = (tmpFreqI[i] + tmpFreqI[conjI])*Sample(0.5);\n\t\t\t\tSample evenRotMinusIR = evenIR*twiddle.real() - evenII*twiddle.imag();\n\t\t\t\tSample evenRotMinusII = evenII*twiddle.real() + evenIR*twiddle.imag();\n\n\t\t\t\toutR[i] = oddR + evenRotMinusIR;\n\t\t\t\toutI[i] = oddI + evenRotMinusII;\n\t\t\t\toutR[conjI] = oddR - evenRotMinusIR;\n\t\t\t\toutI[conjI] = evenRotMinusII - oddI;\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid ifft(const Complex *freq, Sample *time) {\n\t\tfor (size_t s = 0; s < steps(); ++s) {\n\t\t\tifft(s, freq, time);\n\t\t}\n\t}\n\tvoid ifft(size_t step, const Complex *freq, Sample *time) {\n\t\tif (complexPrefersSplit) {\n\t\t\tsize_t hSize = complexFft.size();\n\t\t\tSample *tmpTimeR = (Sample *)tmpTime.data(), *tmpTimeI = tmpTimeR + hSize;\n\t\t\tSample *tmpFreqR = (Sample *)tmpFreq.data(), *tmpFreqI = tmpFreqR + hSize;\n\n\t\t\tbool splitFirst = splitComputation && (step-- == 0);\n\t\t\tif (splitFirst || step-- == 0) {\n\t\t\t\tComplex bin0 = freq[0];\n\t\t\t\tif (!halfBinShift) {\n\t\t\t\t\ttmpFreqR[0] = bin0.real() + bin0.imag();\n\t\t\t\t\ttmpFreqI[0] = bin0.real() - bin0.imag();\n\t\t\t\t}\n\t\t\t\tsize_t startI = halfBinShift ? 0 : 1;\n\t\t\t\tsize_t endI = hSize/2 + 1;\n\t\t\t\tif (splitComputation) { // Do this first twiddle in two halves\n\t\t\t\t\tif (splitFirst) {\n\t\t\t\t\t\tendI = (startI + endI)/2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstartI = (startI + endI)/2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (size_t i = startI; i < endI; ++i) {\n\t\t\t\t\tsize_t conjI = halfBinShift ? (hSize - 1 - i) : (hSize - i);\n\t\t\t\t\tComplex twiddle = twiddles[i];\n\n\t\t\t\t\tComplex odd = freq[i] + std::conj(freq[conjI]);\n\t\t\t\t\tComplex evenRotMinusI = freq[i] - std::conj(freq[conjI]);\n\t\t\t\t\tComplex evenI = { // Conjugate twiddle\n\t\t\t\t\t\tevenRotMinusI.real()*twiddle.real() + evenRotMinusI.imag()*twiddle.imag(),\n\t\t\t\t\t\tevenRotMinusI.imag()*twiddle.real() - evenRotMinusI.real()*twiddle.imag()\n\t\t\t\t\t};\n\n\t\t\t\t\ttmpFreqR[i] = odd.real() + evenI.real();\n\t\t\t\t\ttmpFreqI[i] = odd.imag() + evenI.imag();\n\t\t\t\t\ttmpFreqR[conjI] = odd.real() - evenI.real();\n\t\t\t\t\ttmpFreqI[conjI] = evenI.imag() - odd.imag();\n\t\t\t\t}\n\t\t\t} else if (step < complexFft.steps()) {\n\t\t\t\tcomplexFft.ifft(step, tmpFreqR, tmpFreqI, tmpTimeR, tmpTimeI);\n\t\t\t} else {\n\t\t\t\tsize_t hSize = complexFft.size();\n\t\t\t\tif (halfBinShift) {\n\t\t\t\t\tfor (size_t i = 0; i < hSize; ++i) {\n\t\t\t\t\t\tSample tr = tmpTimeR[i], ti = tmpTimeI[i];\n\t\t\t\t\t\tComplex twist = halfBinTwists[i];\n\t\t\t\t\t\ttime[2*i] = \ttr*twist.real() + ti*twist.imag();\n\t\t\t\t\t\ttime[2*i + 1] = ti*twist.real() - tr*twist.imag();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (size_t i = 0; i < hSize; ++i) {\n\t\t\t\t\t\ttime[2*i] = tmpTimeR[i];\n\t\t\t\t\t\ttime[2*i + 1] = tmpTimeI[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tbool canUseTime = !halfBinShift && !(size_t(time)%alignof(Complex));\n\t\t\tbool splitFirst = splitComputation && (step-- == 0);\n\t\t\tif (splitFirst || step-- == 0) {\n\t\t\t\tComplex bin0 = freq[0];\n\t\t\t\tif (!halfBinShift) {\n\t\t\t\t\ttmpFreq[0] = {\n\t\t\t\t\t\tbin0.real() + bin0.imag(),\n\t\t\t\t\t\tbin0.real() - bin0.imag()\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tsize_t hSize = complexFft.size();\n\t\t\t\tsize_t startI = halfBinShift ? 0 : 1;\n\t\t\t\tsize_t endI = hSize/2 + 1;\n\t\t\t\tif (splitComputation) { // Do this first twiddle in two halves\n\t\t\t\t\tif (splitFirst) {\n\t\t\t\t\t\tendI = (startI + endI)/2;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstartI = (startI + endI)/2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (size_t i = startI; i < endI; ++i) {\n\t\t\t\t\tsize_t conjI = halfBinShift ? (hSize - 1 - i) : (hSize - i);\n\t\t\t\t\tComplex twiddle = twiddles[i];\n\n\t\t\t\t\tComplex odd = freq[i] + std::conj(freq[conjI]);\n\t\t\t\t\tComplex evenRotMinusI = freq[i] - std::conj(freq[conjI]);\n\t\t\t\t\tComplex evenI = { // Conjugate twiddle\n\t\t\t\t\t\tevenRotMinusI.real()*twiddle.real() + evenRotMinusI.imag()*twiddle.imag(),\n\t\t\t\t\t\tevenRotMinusI.imag()*twiddle.real() - evenRotMinusI.real()*twiddle.imag()\n\t\t\t\t\t};\n\n\t\t\t\t\ttmpFreq[i] = odd + evenI;\n\t\t\t\t\ttmpFreq[conjI] = {odd.real() - evenI.real(), evenI.imag() - odd.imag()};\n\t\t\t\t}\n\t\t\t} else if (step < complexFft.steps()) {\n\t\t\t\t// Can't just use time as (Complex *), since it might not be aligned properly\n\t\t\t\tcomplexFft.ifft(step, tmpFreq.data(), canUseTime ? (Complex *)time : tmpTime.data());\n\t\t\t} else {\n\t\t\t\tsize_t hSize = complexFft.size();\n\t\t\t\tif (halfBinShift) {\n\t\t\t\t\tfor (size_t i = 0; i < hSize; ++i) {\n\t\t\t\t\t\tComplex t = tmpTime[i];\n\t\t\t\t\t\tComplex twist = halfBinTwists[i];\n\t\t\t\t\t\ttime[2*i] = \tt.real()*twist.real() + t.imag()*twist.imag();\n\t\t\t\t\t\ttime[2*i + 1] = t.imag()*twist.real() - t.real()*twist.imag();\n\t\t\t\t\t}\n\t\t\t\t} else if (!canUseTime) {\n\t\t\t\t\tstd::memcpy(time, tmpTime.data(), sizeof(Complex)*hSize);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvoid ifft(const Sample *inR, const Sample *inI, Sample *outR) {\n\t\tfor (size_t s = 0; s < steps(); ++s) {\n\t\t\tifft(s, inR, inI, outR);\n\t\t}\n\t}\n\tvoid ifft(size_t step, const Sample *inR, const Sample *inI, Sample *outR) {\n\t\tsize_t hSize = complexFft.size();\n\t\tSample *tmpTimeR = (Sample *)tmpTime.data(), *tmpTimeI = tmpTimeR + hSize;\n\t\tSample *tmpFreqR = (Sample *)tmpFreq.data(), *tmpFreqI = tmpFreqR + hSize;\n\n\t\tbool splitFirst = splitComputation && (step-- == 0);\n\t\tif (splitFirst || step-- == 0) {\n\t\t\tSample bin0r = inR[0], bin0i = inI[0];\n\t\t\tif (!halfBinShift) {\n\t\t\t\ttmpFreqR[0] = bin0r + bin0i;\n\t\t\t\ttmpFreqI[0] = bin0r - bin0i;\n\t\t\t}\n\t\t\tsize_t startI = halfBinShift ? 0 : 1;\n\t\t\tsize_t endI = hSize/2 + 1;\n\t\t\tif (splitComputation) { // Do this first twiddle in two halves\n\t\t\t\tif (splitFirst) {\n\t\t\t\t\tendI = (startI + endI)/2;\n\t\t\t\t} else {\n\t\t\t\t\tstartI = (startI + endI)/2;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (size_t i = startI; i < endI; ++i) {\n\t\t\t\tsize_t conjI = halfBinShift ? (hSize - 1 - i) : (hSize - i);\n\t\t\t\tComplex twiddle = twiddles[i];\n\t\t\t\tSample fir = inR[i], fii = inI[i];\n\t\t\t\tSample fcir = inR[conjI], fcii = inI[conjI];\n\n\t\t\t\tComplex odd = {fir + fcir, fii - fcii};\n\t\t\t\tComplex evenRotMinusI = {fir - fcir, fii + fcii};\n\t\t\t\tComplex evenI = { // Conjugate twiddle\n\t\t\t\t\tevenRotMinusI.real()*twiddle.real() + evenRotMinusI.imag()*twiddle.imag(),\n\t\t\t\t\tevenRotMinusI.imag()*twiddle.real() - evenRotMinusI.real()*twiddle.imag()\n\t\t\t\t};\n\n\t\t\t\ttmpFreqR[i] = odd.real() + evenI.real();\n\t\t\t\ttmpFreqI[i] = odd.imag() + evenI.imag();\n\t\t\t\ttmpFreqR[conjI] = odd.real() - evenI.real();\n\t\t\t\ttmpFreqI[conjI] = evenI.imag() - odd.imag();\n\t\t\t}\n\t\t} else if (step < complexFft.steps()) {\n\t\t\t// Can't just use time as (Complex *), since it might not be aligned properly\n\t\t\tcomplexFft.ifft(step, tmpFreqR, tmpFreqI, tmpTimeR, tmpTimeI);\n\t\t} else {\n\t\t\tif (halfBinShift) {\n\t\t\t\tfor (size_t i = 0; i < hSize; ++i) {\n\t\t\t\t\tSample tr = tmpTimeR[i], ti = tmpTimeI[i];\n\t\t\t\t\tComplex twist = halfBinTwists[i];\n\t\t\t\t\toutR[2*i] = \ttr*twist.real() + ti*twist.imag();\n\t\t\t\t\toutR[2*i + 1] = ti*twist.real() - tr*twist.imag();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor (size_t i = 0; i < hSize; ++i) {\n\t\t\t\t\toutR[2*i] = tmpTimeR[i];\n\t\t\t\t\toutR[2*i + 1] = tmpTimeI[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\nprivate:\n\tusing ComplexFFT = SplitFFT<Sample, splitComputation>;\n\tComplexFFT complexFft;\n\n\tstatic constexpr bool complexPrefersSplit = ComplexFFT::prefersSplit;\n\tstd::vector<Complex> tmpFreq, tmpTime;\n\tstd::vector<Complex> twiddles, halfBinTwists;\n};\n\ntemplate<typename Sample, bool splitComputation=false>\nusing ModifiedRealFFT = RealFFT<Sample, splitComputation, true>;\n\n}} // namespace\n\n// Override `Pow2FFT` / `Pow2RealFFT` templates with faster implementations\n#include <audioapi/libs/signalsmith-stretch/fft-pffft.h>\n#if defined(SIGNALSMITH_USE_PFFFT) || defined(SIGNALSMITH_USE_PFFFT_DOUBLE)\n#\tif defined(SIGNALSMITH_USE_PFFFT)\n#\t\tinclude \"./platform/fft-pffft.h\"\n#\tendif\n#\tif defined(SIGNALSMITH_USE_PFFFT_DOUBLE)\n#\t\tinclude \"./platform/fft-pffft-double.h\"\n#\tendif\n#elif defined(SIGNALSMITH_USE_ACCELERATE)\n#\tinclude \"./platform/fft-accelerate.h\"\n#elif defined(SIGNALSMITH_USE_IPP)\n#\tinclude \"./platform/fft-ipp.h\"\n#endif\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/signalsmith-stretch/signalsmith-stretch.h",
    "content": "#ifndef SIGNALSMITH_STRETCH_H\n#define SIGNALSMITH_STRETCH_H\n\n#include <audioapi/libs/signalsmith-stretch/stft.h> // https://github.com/Signalsmith-Audio/linear\n\n#include <vector>\n#include <array>\n#include <algorithm>\n#include <functional>\n#include <random>\n#include <limits>\n#include <type_traits>\n\nnamespace signalsmith { namespace stretch {\n\nnamespace _impl {\n\ttemplate<bool conjugateSecond=false, typename V>\n\tstatic std::complex<V> mul(const std::complex<V> &a, const std::complex<V> &b) {\n\t\treturn conjugateSecond ? std::complex<V>{\n\t\t\tb.real()*a.real() + b.imag()*a.imag(),\n\t\t\t\tb.real()*a.imag() - b.imag()*a.real()\n\t\t} : std::complex<V>{\n\t\t\ta.real()*b.real() - a.imag()*b.imag(),\n\t\t\ta.real()*b.imag() + a.imag()*b.real()\n\t\t};\n\t}\n\ttemplate<typename V>\n\tstatic V norm(const std::complex<V> &a) {\n\t\tV r = a.real(), i = a.imag();\n\t\treturn r*r + i*i;\n\t}\n}\n\ntemplate<typename Sample=float, class RandomEngine=void>\nstruct SignalsmithStretch {\n\tstatic constexpr size_t version[3] = {1, 3, 2};\n\n\tSignalsmithStretch() : randomEngine(std::random_device{}()) {}\n\tSignalsmithStretch(long seed) : randomEngine(seed) {}\n\n\t// The difference between the internal position (centre of a block) and the input samples you're supplying\n\tint inputLatency() const {\n\t\treturn int(stft.analysisLatency());\n\t}\n\tint outputLatency() const {\n\t\treturn int(stft.synthesisLatency() + _splitComputation*stft.defaultInterval());\n\t}\n\n\tvoid reset() {\n\t\tstft.reset(0.1);\n\t\tstashedInput = stft.input;\n\t\tstashedOutput = stft.output;\n\n\t\tprevInputOffset = -1;\n\t\tchannelBands.assign(channelBands.size(), Band());\n\t\tsilenceCounter = 0;\n\t\tdidSeek = false;\n\t\tblockProcess = {};\n\t\tfreqEstimateWeighted = freqEstimateWeight = 0;\n\t}\n\n\t// Configures using a default preset\n\tvoid presetDefault(int nChannels, Sample sampleRate, bool splitComputation=false) {\n\t\tconfigure(nChannels, sampleRate*0.12, sampleRate*0.03, splitComputation);\n\t}\n\tvoid presetCheaper(int nChannels, Sample sampleRate, bool splitComputation=true) {\n\t\tconfigure(nChannels, sampleRate*0.1, sampleRate*0.04, splitComputation);\n\t}\n\n\t// Manual setup\n\tvoid configure(int nChannels, int blockSamples, int intervalSamples, bool splitComputation=false) {\n\t\t_splitComputation = splitComputation;\n\t\tchannels = nChannels;\n\t\tstft.configure(channels, channels, blockSamples, intervalSamples + 1);\n\t\tstft.setInterval(intervalSamples, stft.kaiser);\n\t\tstft.reset(0.1);\n\t\tstashedInput = stft.input;\n\t\tstashedOutput = stft.output;\n\n\t\tbands = int(stft.bands());\n\t\tchannelBands.assign(bands*channels, Band());\n\n\t\tpeaks.reserve(bands/2);\n\t\tenergy.resize(bands);\n\t\tsmoothedEnergy.resize(bands);\n\t\toutputMap.resize(bands);\n\t\tchannelPredictions.resize(channels*bands);\n\n\t\tblockProcess = {};\n\t\tformantMetric.resize(bands + 2);\n\n\t\ttmpProcessBuffer.resize(blockSamples + intervalSamples);\n\t\ttmpPreRollBuffer.resize(outputLatency()*channels);\n\t}\n\t// For querying the existing config\n\tint blockSamples() const {\n\t\treturn int(stft.blockSamples());\n\t}\n\tint intervalSamples() const {\n\t\treturn int(stft.defaultInterval());\n\t}\n\tbool splitComputation() const {\n\t\treturn _splitComputation;\n\t}\n\n\t/// Frequency multiplier, and optional tonality limit (as multiple of sample-rate)\n\tvoid setTransposeFactor(Sample multiplier, Sample tonalityLimit=0) {\n\t\tfreqMultiplier = multiplier;\n\t\tif (tonalityLimit > 0) {\n\t\t\tfreqTonalityLimit = tonalityLimit/std::sqrt(multiplier); // compromise between input and output limits\n\t\t} else {\n\t\t\tfreqTonalityLimit = 1;\n\t\t}\n\t\tcustomFreqMap = nullptr;\n\t}\n\tvoid setTransposeSemitones(Sample semitones, Sample tonalityLimit=0) {\n\t\tsetTransposeFactor(std::pow(2, semitones/12), tonalityLimit);\n\t}\n\t// Sets a custom frequency map - should be monotonically increasing\n\tvoid setFreqMap(std::function<Sample(Sample)> inputToOutput) {\n\t\tcustomFreqMap = inputToOutput;\n\t}\n\n\tvoid setFormantFactor(Sample multiplier, bool compensatePitch=false) {\n\t\tformantMultiplier = multiplier;\n\t\tinvFormantMultiplier = 1/multiplier;\n\t\tformantCompensation = compensatePitch;\n\t}\n\tvoid setFormantSemitones(Sample semitones, bool compensatePitch=false) {\n\t\tsetFormantFactor(std::pow(2, semitones/12), compensatePitch);\n\t}\n\t// Rough guesstimate of the fundamental frequency, used for formant analysis. 0 means attempting to detect the pitch\n\tvoid setFormantBase(Sample baseFreq=0) {\n\t\tformantBaseFreq = baseFreq;\n\t}\n\n\t// Provide previous input (\"pre-roll\") to smoothly change the input location without interrupting the output.  This doesn't do any calculation, just copies intput to a buffer.\n\t// You should ideally feed it `seekLength()` frames of input, unless it's directly after a `.reset()` (in which case `.outputSeek()` might be a better choice)\n\ttemplate<class Inputs>\n\tvoid seek(Inputs &&inputs, int inputSamples, double playbackRate) {\n\t\ttmpProcessBuffer.resize(0);\n\t\ttmpProcessBuffer.resize(stft.blockSamples() + stft.defaultInterval());\n\n\t\tint startIndex = std::max<int>(0, inputSamples - int(tmpProcessBuffer.size())); // start position in input\n\t\tint padStart = int(tmpProcessBuffer.size() + startIndex) - inputSamples; // start position in tmpProcessBuffer\n\n\t\tSample totalEnergy = 0;\n\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\tauto &&inputChannel = inputs[c];\n\t\t\tfor (int i = startIndex; i < inputSamples; ++i) {\n\t\t\t\tSample s = inputChannel[i];\n\t\t\t\ttotalEnergy += s*s;\n\t\t\t\ttmpProcessBuffer[i - startIndex + padStart] = s;\n\t\t\t}\n\n\t\t\tstft.writeInput(c, tmpProcessBuffer.size(), tmpProcessBuffer.data());\n\t\t}\n\t\tstft.moveInput(tmpProcessBuffer.size());\n\t\tif (totalEnergy >= noiseFloor) {\n\t\t\tsilenceCounter = 0;\n\t\t\tsilenceFirst = true;\n\t\t}\n\t\tdidSeek = true;\n\t\tseekTimeFactor = (playbackRate*stft.defaultInterval() > 1) ? 1/playbackRate : stft.defaultInterval();\n\t}\n\tint seekLength() const {\n\t\treturn int(stft.blockSamples() + stft.defaultInterval());\n\t}\n\n\t// Moves the input position *and* pre-calculates some output, so that the next samples returned from `.process()` are aligned to the beginning of the sample.\n\t// The time-stretch rate is inferred from `inputLength`, so use `.outputSeekLength()` to get a correct value for that.\n\ttemplate<class Inputs>\n\tvoid outputSeek(Inputs &&inputs, int inputLength) {\n\t\t// TODO: add fade-out parameter to avoid clicks, instead of doing a full reset\n\t\treset();\n\t\t// Assume we've been handed enough surplus input to produce `outputLatency()` samples of pre-roll\n\t\tint surplusInput = std::max<int>(inputLength - inputLatency(), 0);\n\t\tSample playbackRate = surplusInput/Sample(outputLatency());\n\n\t\t// Move the input position to the start of the sound\n\t\tint seekSamples = inputLength - surplusInput;\n\t\tseek(inputs, seekSamples, playbackRate);\n\n\t\ttmpPreRollBuffer.resize(outputLatency()*channels);\n\t\tstruct BufferOutput {\n\t\t\tSample *samples;\n\t\t\tint length;\n\n\t\t\tSample * operator[](int c) {\n\t\t\t\treturn samples + c*length;\n\t\t\t}\n\t\t} preRollOutput{tmpPreRollBuffer.data(), outputLatency()};\n\n\t\t// Use the surplus input to produce pre-roll output\n\t\tOffsetIO<Inputs> offsetInput{inputs, seekSamples};\n\t\tprocess(offsetInput, surplusInput, preRollOutput, preRollOutput.length);\n\n\t\t// put the thing down, flip it and reverse it\n\t\tfor (auto &v : tmpPreRollBuffer) v = -v;\n\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\tstd::reverse(preRollOutput[c], preRollOutput[c] + preRollOutput.length);\n\t\t\tstft.addOutput(c, preRollOutput.length, preRollOutput[c]);\n\t\t}\n\t}\n\tint outputSeekLength(Sample playbackRate) const {\n\t\treturn inputLatency() + playbackRate*outputLatency();\n\t}\n\n\ttemplate<class Inputs, class Outputs>\n\tvoid process(Inputs &&inputs, int inputSamples, Outputs &&outputs, int outputSamples) {\n#ifdef SIGNALSMITH_STRETCH_PROFILE_PROCESS_START\n\t\tSIGNALSMITH_STRETCH_PROFILE_PROCESS_START(inputSamples, outputSamples);\n#endif\n\t\tint prevCopiedInput = 0;\n\t\tauto copyInput = [&](int toIndex){\n\n\t\t\tint length = std::min<int>(int(stft.blockSamples() + stft.defaultInterval()), toIndex - prevCopiedInput);\n\t\t\ttmpProcessBuffer.resize(length);\n\t\t\tint offset = toIndex - length;\n\t\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\t\tauto &&inputBuffer = inputs[c];\n\t\t\t\tfor (int i = 0; i < length; ++i) {\n\t\t\t\t\ttmpProcessBuffer[i] = inputBuffer[i + offset];\n\t\t\t\t}\n\t\t\t\tstft.writeInput(c, length, tmpProcessBuffer.data());\n\t\t\t}\n\t\t\tstft.moveInput(length);\n\t\t\tprevCopiedInput = toIndex;\n\t\t};\n\n\t\tSample totalEnergy = 0;\n\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\tauto &&inputChannel = inputs[c];\n\t\t\tfor (int i = 0; i < inputSamples; ++i) {\n\t\t\t\tSample s = inputChannel[i];\n\t\t\t\ttotalEnergy += s*s;\n\t\t\t}\n\t\t}\n\n\t\tif (totalEnergy < noiseFloor) {\n\t\t\tif (silenceCounter >= 2*stft.blockSamples()) {\n\t\t\t\tif (silenceFirst) { // first block of silence processing\n\t\t\t\t\tsilenceFirst = false;\n\t\t\t\t\t//stft.reset();\n\t\t\t\t\tblockProcess = {};\n\t\t\t\t\tfor (auto &b : channelBands) {\n\t\t\t\t\t\tb.input = b.prevInput = b.output = 0;\n\t\t\t\t\t\tb.inputEnergy = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (inputSamples > 0) {\n\t\t\t\t\t// copy from the input, wrapping around if needed\n\t\t\t\t\tfor (int outputIndex = 0; outputIndex < outputSamples; ++outputIndex) {\n\t\t\t\t\t\tint inputIndex = outputIndex%inputSamples;\n\t\t\t\t\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\t\t\t\t\toutputs[c][outputIndex] = inputs[c][inputIndex];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\t\t\t\tauto &&outputChannel = outputs[c];\n\t\t\t\t\t\tfor (int outputIndex = 0; outputIndex < outputSamples; ++outputIndex) {\n\t\t\t\t\t\t\toutputChannel[outputIndex] = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Store input in history buffer\n\t\t\t\tcopyInput(inputSamples);\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tsilenceCounter += inputSamples;\n\t\t\t}\n\t\t} else {\n\t\t\tsilenceCounter = 0;\n\t\t\tsilenceFirst = true;\n\t\t}\n\n\t\tfor (int outputIndex = 0; outputIndex < outputSamples; ++outputIndex) {\n\t\t\tbool newBlock = blockProcess.samplesSinceLast >= stft.defaultInterval();\n\t\t\tif (newBlock) {\n\t\t\t\tblockProcess.step = 0;\n\t\t\t\tblockProcess.steps = 0; // how many processing steps this block will have\n\t\t\t\tblockProcess.samplesSinceLast = 0;\n\n\t\t\t\t// Time to process a spectrum!  Where should it come from in the input?\n\t\t\t\tint inputOffset = std::round(outputIndex*Sample(inputSamples)/outputSamples);\n\t\t\t\tint inputInterval = inputOffset - prevInputOffset;\n\t\t\t\tprevInputOffset = inputOffset;\n\n\t\t\t\tcopyInput(inputOffset);\n\t\t\t\tstashedInput = stft.input; // save the input state, since that's what we'll analyse later\n\t\t\t\tif (_splitComputation) {\n\t\t\t\t\tstashedOutput = stft.output; // save the current output, and read from it\n\t\t\t\t\tstft.moveOutput(stft.defaultInterval()); // the actual input jumps forward in time by one interval, ready for the synthesis\n\t\t\t\t}\n\n\t\t\t\tblockProcess.newSpectrum = didSeek || (inputInterval > 0);\n\t\t\t\tblockProcess.mappedFrequencies = customFreqMap || freqMultiplier != 1;\n\t\t\t\tif (blockProcess.newSpectrum) {\n\t\t\t\t\t// make sure the previous input is the correct distance in the past (give or take 1 sample)\n\t\t\t\t\tblockProcess.reanalysePrev = didSeek || std::abs(inputInterval - int(stft.defaultInterval())) > 1;\n\t\t\t\t\tif (blockProcess.reanalysePrev) blockProcess.steps += stft.analyseSteps() + 1;\n\n\t\t\t\t\t// analyse a new input\n\t\t\t\t\tblockProcess.steps += stft.analyseSteps() + 1;\n\t\t\t\t}\n\n\t\t\t\tblockProcess.processFormants = formantMultiplier != 1 || (formantCompensation && blockProcess.mappedFrequencies);\n\n\t\t\t\tblockProcess.timeFactor = didSeek ? seekTimeFactor : stft.defaultInterval()/std::max<Sample>(1, inputInterval);\n\t\t\t\tdidSeek = false;\n\n\t\t\t\tupdateProcessSpectrumSteps();\n\t\t\t\tblockProcess.steps += processSpectrumSteps;\n\n\t\t\t\tblockProcess.steps += stft.synthesiseSteps() + 1;\n\t\t\t}\n\n\t\t\tsize_t processToStep = newBlock ? blockProcess.steps : 0;\n\t\t\tif (_splitComputation) {\n\t\t\t\tSample processRatio = Sample(blockProcess.samplesSinceLast + 1)/stft.defaultInterval();\n\t\t\t\tprocessToStep = std::min<size_t>(blockProcess.steps, (blockProcess.steps + 0.999f)*processRatio);\n\t\t\t}\n\n\t\t\twhile (blockProcess.step < processToStep) {\n\t\t\t\tsize_t step = blockProcess.step++;\n#ifdef SIGNALSMITH_STRETCH_PROFILE_PROCESS_STEP\n\t\t\t\tSIGNALSMITH_STRETCH_PROFILE_PROCESS_STEP(step, blockProcess.steps);\n#endif\n\t\t\t\tif (blockProcess.newSpectrum) {\n\t\t\t\t\tif (blockProcess.reanalysePrev) {\n\t\t\t\t\t\t// analyse past input\n\t\t\t\t\t\tif (step < stft.analyseSteps()) {\n\t\t\t\t\t\t\tstashedInput.swap(stft.input);\n\t\t\t\t\t\t\tstft.analyseStep(step, stft.defaultInterval());\n\t\t\t\t\t\t\tstashedInput.swap(stft.input);\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstep -= stft.analyseSteps();\n\t\t\t\t\t\tif (step < 1) {\n\t\t\t\t\t\t\t// Copy previous analysis to our band objects\n\t\t\t\t\t\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\t\t\t\t\t\tauto channelBands = bandsForChannel(c);\n\t\t\t\t\t\t\t\tauto *spectrumBands = stft.spectrum(c);\n\t\t\t\t\t\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\t\t\t\t\t\tchannelBands[b].prevInput = spectrumBands[b];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstep -= 1;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Analyse latest (stashed) input\n\t\t\t\t\tif (step < stft.analyseSteps()) {\n\t\t\t\t\t\tstashedInput.swap(stft.input);\n\t\t\t\t\t\tstft.analyseStep(step);\n\t\t\t\t\t\tstashedInput.swap(stft.input);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstep -= stft.analyseSteps();\n\t\t\t\t\tif (step < 1) {\n\t\t\t\t\t\t// Copy analysed spectrum into our band objects\n\t\t\t\t\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\t\t\t\t\tauto channelBands = bandsForChannel(c);\n\t\t\t\t\t\t\tauto *spectrumBands = stft.spectrum(c);\n\t\t\t\t\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\t\t\t\t\tchannelBands[b].input = spectrumBands[b];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tstep -= 1;\n\t\t\t\t}\n\n\t\t\t\tif (step < processSpectrumSteps) {\n\t\t\t\t\tprocessSpectrum(step);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstep -= processSpectrumSteps;\n\n\t\t\t\tif (step < 1) {\n\t\t\t\t\t// Copy band objects into spectrum\n\t\t\t\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\t\t\t\tauto channelBands = bandsForChannel(c);\n\t\t\t\t\t\tauto *spectrumBands = stft.spectrum(c);\n\t\t\t\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\t\t\t\tspectrumBands[b] = channelBands[b].output;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstep -= 1;\n\n\t\t\t\tif (step < stft.synthesiseSteps()) {\n\t\t\t\t\tstft.synthesiseStep(step);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n#ifdef SIGNALSMITH_STRETCH_PROFILE_PROCESS_ENDSTEP\n\t\t\tSIGNALSMITH_STRETCH_PROFILE_PROCESS_ENDSTEP();\n#endif\n\n\t\t\t++blockProcess.samplesSinceLast;\n\t\t\tif (_splitComputation) stashedOutput.swap(stft.output);\n\t\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\t\tauto &&outputChannel = outputs[c];\n\t\t\t\tSample v = 0;\n\t\t\t\tstft.readOutput(c, 1, &v);\n\t\t\t\toutputChannel[outputIndex] = v;\n\t\t\t}\n\t\t\tstft.moveOutput(1);\n\t\t\tif (_splitComputation) stashedOutput.swap(stft.output);\n\t\t}\n\n\t\tcopyInput(inputSamples);\n\t\tprevInputOffset -= inputSamples;\n#ifdef SIGNALSMITH_STRETCH_PROFILE_PROCESS_END\n\t\tSIGNALSMITH_STRETCH_PROFILE_PROCESS_END();\n#endif\n\t}\n\n\t// Read the remaining output, providing no further input.  If `outputSamples` is more than one interval, it will compute additional blocks assuming a zero-valued input\n\ttemplate<class Outputs>\n\tvoid flush(Outputs &&outputs, int outputSamples, Sample playbackRate=0) {\n\t\tstruct Zeros {\n\t\t\tstruct Channel {\n\t\t\t\tSample operator[](int) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\t\t\t};\n\t\t\tChannel operator[](int) {\n\t\t\t\treturn {};\n\t\t\t}\n\t\t} zeros;\n\t\t// If we're asked for more than an interval of extra output, then zero-pad the input\n\t\tint outputBlock = std::max<int>(0, outputSamples - stft.defaultInterval());\n\t\tif (outputBlock > 0) process(zeros, outputBlock*playbackRate, outputs, outputBlock);\n\n\t\tint tailSamples = outputSamples - outputBlock; // at most one interval\n\t\ttmpProcessBuffer.resize(tailSamples);\n\t\tstft.finishOutput(1);\n\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\tstft.readOutput(c, tailSamples, tmpProcessBuffer.data());\n\t\t\tauto &&outputChannel = outputs[c];\n\t\t\tfor (int i = 0; i < tailSamples; ++i) {\n\t\t\t\toutputChannel[outputBlock + i] = tmpProcessBuffer[i];\n\t\t\t}\n\t\t\tstft.readOutput(c, tailSamples, tailSamples, tmpProcessBuffer.data());\n\t\t\tfor (int i = 0; i < tailSamples; ++i) {\n\t\t\t\toutputChannel[outputBlock + tailSamples - 1 - i] -= tmpProcessBuffer[i];\n\t\t\t}\n\t\t}\n\t\tstft.reset(0.1f);\n\t\t// Reset the phase-vocoder stuff, so the next block gets a fresh start\n\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\tauto channelBands = bandsForChannel(c);\n\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\tchannelBands[b].prevInput = channelBands[b].output = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Process a complete audio buffer all in one go\n\ttemplate<class Inputs, class Outputs>\n\tbool exact(Inputs &&inputs, int inputSamples, Outputs &&outputs, int outputSamples) {\n\t\tSample playbackRate = inputSamples/Sample(outputSamples);\n\t\tauto seekLength = outputSeekLength(playbackRate);\n\t\tif (inputSamples < seekLength) {\n\t\t\t// to short for this - zero the output just to be polite\n\t\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\t\tauto &&channel = outputs[c];\n\t\t\t\tfor (int i = 0; i < outputSamples; ++i) {\n\t\t\t\t\tchannel[i] = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\toutputSeek(inputs, seekLength);\n\n\t\tint outputIndex = outputSamples - seekLength/playbackRate;\n\t\tOffsetIO<Inputs> offsetInput{inputs, seekLength};\n\t\tprocess(offsetInput, inputSamples - seekLength, outputs, outputIndex);\n\n\t\tOffsetIO<Outputs> offsetOutput{outputs, outputIndex};\n\t\tflush(offsetOutput, outputSamples - outputIndex, playbackRate);\n\t\treturn true;\n\t}\n\nprivate:\n\tbool _splitComputation = false;\n\tstruct {\n\t\tsize_t samplesSinceLast = std::numeric_limits<size_t>::max();\n\t\tsize_t steps = 0;\n\t\tsize_t step = 0;\n\n\t\tbool newSpectrum = false;\n\t\tbool reanalysePrev = false;\n\t\tbool mappedFrequencies = false;\n\t\tbool processFormants = false;\n\t\tSample timeFactor;\n\t} blockProcess;\n\n\tusing Complex = std::complex<Sample>;\n\tstatic constexpr Sample noiseFloor{1e-15};\n\tstatic constexpr Sample maxCleanStretch{2}; // time-stretch ratio before we start randomising phases\n\tsize_t silenceCounter = 0;\n\tbool silenceFirst = true;\n\n\tSample freqMultiplier = 1, freqTonalityLimit = 0.5;\n\tstd::function<Sample(Sample)> customFreqMap = nullptr;\n\n\tbool formantCompensation = false; // compensate for pitch/freq change\n\tSample formantMultiplier = 1, invFormantMultiplier = 1;\n\n\tusing STFT = signalsmith::linear::DynamicSTFT<Sample, false, true>;\n\tSTFT stft;\n\ttypename STFT::Input stashedInput;\n\ttypename STFT::Output stashedOutput;\n\n\tstd::vector<Sample> tmpProcessBuffer, tmpPreRollBuffer;\n\n\tint channels = 0, bands = 0;\n\tint prevInputOffset = -1;\n\tbool didSeek = false;\n\tSample seekTimeFactor = 1;\n\n\tSample bandToFreq(Sample b) const {\n\t\treturn stft.binToFreq(b);\n\t}\n\tSample freqToBand(Sample f) const {\n\t\treturn stft.freqToBin(f);\n\t}\n\n\tstruct Band {\n\t\tComplex input, prevInput{0};\n\t\tComplex output{0};\n\t\tSample inputEnergy;\n\t};\n\tstd::vector<Band> channelBands;\n\tBand * bandsForChannel(int channel) {\n\t\treturn channelBands.data() + channel*bands;\n\t}\n\ttemplate<Complex Band::*member>\n\tComplex getBand(int channel, int index) {\n\t\tif (index < 0 || index >= bands) return 0;\n\t\treturn channelBands[index + channel*bands].*member;\n\t}\n\ttemplate<Complex Band::*member>\n\tComplex getFractional(int channel, int lowIndex, Sample fractional) {\n\t\tComplex low = getBand<member>(channel, lowIndex);\n\t\tComplex high = getBand<member>(channel, lowIndex + 1);\n\t\treturn low + (high - low)*fractional;\n\t}\n\ttemplate<Complex Band::*member>\n\tComplex getFractional(int channel, Sample inputIndex) {\n\t\tint lowIndex = std::floor(inputIndex);\n\t\tSample fracIndex = inputIndex - lowIndex;\n\t\treturn getFractional<member>(channel, lowIndex, fracIndex);\n\t}\n\ttemplate<Sample Band::*member>\n\tSample getBand(int channel, int index) {\n\t\tif (index < 0 || index >= bands) return 0;\n\t\treturn channelBands[index + channel*bands].*member;\n\t}\n\ttemplate<Sample Band::*member>\n\tSample getFractional(int channel, int lowIndex, Sample fractional) {\n\t\tSample low = getBand<member>(channel, lowIndex);\n\t\tSample high = getBand<member>(channel, lowIndex + 1);\n\t\treturn low + (high - low)*fractional;\n\t}\n\ttemplate<Sample Band::*member>\n\tSample getFractional(int channel, Sample inputIndex) {\n\t\tint lowIndex = std::floor(inputIndex);\n\t\tSample fracIndex = inputIndex - lowIndex;\n\t\treturn getFractional<member>(channel, lowIndex, fracIndex);\n\t}\n\n\tstruct Peak {\n\t\tSample input, output;\n\t};\n\tstd::vector<Peak> peaks;\n\tstd::vector<Sample> energy, smoothedEnergy;\n\tstruct PitchMapPoint {\n\t\tSample inputBin, freqGrad;\n\t};\n\tstd::vector<PitchMapPoint> outputMap;\n\n\tstruct Prediction {\n\t\tSample energy = 0;\n\t\tComplex input;\n\n\t\tComplex makeOutput(Complex phase) {\n\t\t\tSample phaseNorm = _impl::norm(phase);\n\t\t\tif (phaseNorm <= noiseFloor) {\n\t\t\t\tphase = input; // prediction is too weak, fall back to the input\n\t\t\t\tphaseNorm = _impl::norm(input) + noiseFloor;\n\t\t\t}\n\t\t\treturn phase*std::sqrt(energy/phaseNorm);\n\t\t}\n\t};\n\tstd::vector<Prediction> channelPredictions;\n\tPrediction * predictionsForChannel(int c) {\n\t\treturn channelPredictions.data() + c*bands;\n\t}\n\n\t// If RandomEngine=void, use std::default_random_engine;\n\tusing RandomEngineImpl = typename std::conditional<\n\t\tstd::is_void<RandomEngine>::value,\n\t\tstd::default_random_engine,\n\t\tRandomEngine\n\t>::type;\n\tRandomEngineImpl randomEngine;\n\n\tsize_t processSpectrumSteps = 0;\n\tstatic constexpr size_t splitMainPrediction = 8; // it's just heavy, since we're blending up to 4 different phase predictions\n\tvoid updateProcessSpectrumSteps() {\n\t\tprocessSpectrumSteps = 0;\n\t\tif (blockProcess.newSpectrum) processSpectrumSteps += channels;\n\t\tif (blockProcess.mappedFrequencies) {\n\t\t\tprocessSpectrumSteps += smoothEnergySteps;\n\t\t\tprocessSpectrumSteps += 1; // findPeaks\n\t\t}\n\t\tprocessSpectrumSteps += 1; // updating the output map\n\t\tprocessSpectrumSteps += channels; // preliminary phase-vocoder prediction\n\t\tprocessSpectrumSteps += splitMainPrediction;\n\t\tif (blockProcess.newSpectrum) processSpectrumSteps += 1; // .input -> .prevInput\n\t\tif (blockProcess.processFormants) processSpectrumSteps += 3;\n\t}\n\tvoid processSpectrum(size_t step) {\n\t\tSample timeFactor = blockProcess.timeFactor;\n\n\t\tSample smoothingBins = Sample(stft.fftSamples())/stft.defaultInterval();\n\t\tint longVerticalStep = std::round(smoothingBins);\n\t\ttimeFactor = std::max<Sample>(timeFactor, 1/maxCleanStretch);\n\t\tbool randomTimeFactor = (timeFactor > maxCleanStretch);\n\t\tstd::uniform_real_distribution<Sample> timeFactorDist(maxCleanStretch*2*randomTimeFactor - timeFactor, timeFactor);\n\n\t\tif (blockProcess.newSpectrum) {\n\t\t\tif (step < size_t(channels)) {\n\t\t\t\tint channel = int(step);\n\t\t\t\tauto bins = bandsForChannel(channel);\n\n\t\t\t\tComplex rot = std::polar(Sample(1), bandToFreq(0)*stft.defaultInterval()*Sample(2*M_PI));\n\t\t\t\tSample freqStep = bandToFreq(1) - bandToFreq(0);\n\t\t\t\tComplex rotStep = std::polar(Sample(1), freqStep*stft.defaultInterval()*Sample(2*M_PI));\n\n\t\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\t\tauto &bin = bins[b];\n\t\t\t\t\tbin.output = _impl::mul(bin.output, rot);\n\t\t\t\t\tbin.prevInput = _impl::mul(bin.prevInput, rot);\n\t\t\t\t\trot = _impl::mul(rot, rotStep);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstep -= channels;\n\t\t}\n\t\tif (blockProcess.mappedFrequencies) {\n\t\t\tif (step < smoothEnergySteps) {\n\t\t\t\tsmoothEnergy(step, smoothingBins);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstep -= smoothEnergySteps;\n\t\t\tif (step-- == 0) {\n\t\t\t\tfindPeaks();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (step-- == 0) {\n\t\t\tif (blockProcess.mappedFrequencies) {\n\t\t\t\tupdateOutputMap();\n\t\t\t} else { // we're not pitch-shifting, so no need to find peaks etc.\n\t\t\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\t\t\tBand *bins = bandsForChannel(c);\n\t\t\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\t\t\tbins[b].inputEnergy = _impl::norm(bins[b].input);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\t\toutputMap[b] = {Sample(b), 1};\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif (blockProcess.processFormants) {\n\t\t\tif (step < 3) {\n\t\t\t\tupdateFormants(step);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstep -= 3;\n\t\t}\n\t\t// Preliminary output prediction from phase-vocoder\n\t\tif (step < size_t(channels)) {\n\t\t\tint c = int(step);\n\t\t\tBand *bins = bandsForChannel(c);\n\t\t\tauto *predictions = predictionsForChannel(c);\n\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\tauto mapPoint = outputMap[b];\n\t\t\t\tint lowIndex = std::floor(mapPoint.inputBin);\n\t\t\t\tSample fracIndex = mapPoint.inputBin - lowIndex;\n\n\t\t\t\tPrediction &prediction = predictions[b];\n\t\t\t\tSample prevEnergy = prediction.energy;\n\t\t\t\tprediction.energy = getFractional<&Band::inputEnergy>(c, lowIndex, fracIndex);\n\t\t\t\tprediction.energy *= std::max<Sample>(0, mapPoint.freqGrad); // scale the energy according to local stretch factor\n\t\t\t\tprediction.input = getFractional<&Band::input>(c, lowIndex, fracIndex);\n\n\t\t\t\tauto &outputBin = bins[b];\n\t\t\t\tComplex prevInput = getFractional<&Band::prevInput>(c, lowIndex, fracIndex);\n\t\t\t\tComplex freqTwist = _impl::mul<true>(prediction.input, prevInput);\n\t\t\t\tComplex phase = _impl::mul(outputBin.output, freqTwist);\n\t\t\t\toutputBin.output = phase/(std::max(prevEnergy, prediction.energy) + noiseFloor);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tstep -= channels;\n\n\t\tif (step < splitMainPrediction) {\n\t\t\t// Re-predict using phase differences between frequencies\n\t\t\tsize_t chunk = step;\n\t\t\tint startB = int(bands*chunk/splitMainPrediction);\n\t\t\tint endB = int(bands*(chunk + 1)/splitMainPrediction);\n\t\t\tfor (int b = startB; b < endB; ++b) {\n\t\t\t\t// Find maximum-energy channel and calculate that\n\t\t\t\tint maxChannel = 0;\n\t\t\t\tSample maxEnergy = predictionsForChannel(0)[b].energy;\n\t\t\t\tfor (int c = 1; c < channels; ++c) {\n\t\t\t\t\tSample e = predictionsForChannel(c)[b].energy;\n\t\t\t\t\tif (e > maxEnergy) {\n\t\t\t\t\t\tmaxChannel = c;\n\t\t\t\t\t\tmaxEnergy = e;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tauto *predictions = predictionsForChannel(maxChannel);\n\t\t\t\tauto &prediction = predictions[b];\n\t\t\t\tauto *bins = bandsForChannel(maxChannel);\n\t\t\t\tauto &outputBin = bins[b];\n\n\t\t\t\tComplex phase = 0;\n\t\t\t\tauto mapPoint = outputMap[b];\n\n\t\t\t\t// Upwards vertical steps\n\t\t\t\tif (b > 0) {\n\t\t\t\t\tSample binTimeFactor = randomTimeFactor ? timeFactorDist(randomEngine) : timeFactor;\n\t\t\t\t\tComplex downInput = getFractional<&Band::input>(maxChannel, mapPoint.inputBin - binTimeFactor);\n\t\t\t\t\tComplex shortVerticalTwist = _impl::mul<true>(prediction.input, downInput);\n\n\t\t\t\t\tauto &downBin = bins[b - 1];\n\t\t\t\t\tphase += _impl::mul(downBin.output, shortVerticalTwist);\n\n\t\t\t\t\tif (b >= longVerticalStep) {\n\t\t\t\t\t\tComplex longDownInput = getFractional<&Band::input>(maxChannel, mapPoint.inputBin - longVerticalStep*binTimeFactor);\n\t\t\t\t\t\tComplex longVerticalTwist = _impl::mul<true>(prediction.input, longDownInput);\n\n\t\t\t\t\t\tauto &longDownBin = bins[b - longVerticalStep];\n\t\t\t\t\t\tphase += _impl::mul(longDownBin.output, longVerticalTwist);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Downwards vertical steps\n\t\t\t\tif (b < bands - 1) {\n\t\t\t\t\tauto &upPrediction = predictions[b + 1];\n\t\t\t\t\tauto &upMapPoint = outputMap[b + 1];\n\n\t\t\t\t\tSample binTimeFactor = randomTimeFactor ? timeFactorDist(randomEngine) : timeFactor;\n\t\t\t\t\tComplex downInput = getFractional<&Band::input>(maxChannel, upMapPoint.inputBin - binTimeFactor);\n\t\t\t\t\tComplex shortVerticalTwist = _impl::mul<true>(upPrediction.input, downInput);\n\n\t\t\t\t\tauto &upBin = bins[b + 1];\n\t\t\t\t\tphase += _impl::mul<true>(upBin.output, shortVerticalTwist);\n\n\t\t\t\t\tif (b < bands - longVerticalStep) {\n\t\t\t\t\t\tauto &longUpPrediction = predictions[b + longVerticalStep];\n\t\t\t\t\t\tauto &longUpMapPoint = outputMap[b + longVerticalStep];\n\n\t\t\t\t\t\tComplex longDownInput = getFractional<&Band::input>(maxChannel, longUpMapPoint.inputBin - longVerticalStep*binTimeFactor);\n\t\t\t\t\t\tComplex longVerticalTwist = _impl::mul<true>(longUpPrediction.input, longDownInput);\n\n\t\t\t\t\t\tauto &longUpBin = bins[b + longVerticalStep];\n\t\t\t\t\t\tphase += _impl::mul<true>(longUpBin.output, longVerticalTwist);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\toutputBin.output = prediction.makeOutput(phase);\n\n\t\t\t\t// All other bins are locked in phase\n\t\t\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\t\t\tif (c != maxChannel) {\n\t\t\t\t\t\tauto &channelBin = bandsForChannel(c)[b];\n\t\t\t\t\t\tauto &channelPrediction = predictionsForChannel(c)[b];\n\n\t\t\t\t\t\tComplex channelTwist = _impl::mul<true>(channelPrediction.input, prediction.input);\n\t\t\t\t\t\tComplex channelPhase = _impl::mul(outputBin.output, channelTwist);\n\t\t\t\t\t\tchannelBin.output = channelPrediction.makeOutput(channelPhase);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tstep -= splitMainPrediction;\n\n\t\tif (blockProcess.newSpectrum) {\n\t\t\tif (step-- == 0) {\n\t\t\t\tfor (auto &bin : channelBands) {\n\t\t\t\t\tbin.prevInput = bin.input;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Produces smoothed energy across all channels\n\tstatic constexpr size_t smoothEnergySteps = 3;\n\tSample smoothEnergyState = 0;\n\tvoid smoothEnergy(size_t step, Sample smoothingBins) {\n\t\tSample smoothingSlew = 1/(1 + smoothingBins*Sample(0.5));\n\t\tif (step-- == 0) {\n\t\t\tfor (auto &e : energy) e = 0;\n\t\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\t\tBand *bins = bandsForChannel(c);\n\t\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\t\tSample e = _impl::norm(bins[b].input);\n\t\t\t\t\tbins[b].inputEnergy = e; // Used for interpolating prediction energy\n\t\t\t\t\tenergy[b] += e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\tsmoothedEnergy[b] = energy[b];\n\t\t\t}\n\t\t\tsmoothEnergyState = 0;\n\t\t\treturn;\n\t\t}\n\n\t\t// The two other steps are repeated smoothing passes, down and up\n\t\tSample e = smoothEnergyState;\n\t\tfor (int b = bands - 1; b >= 0; --b) {\n\t\t\te += (smoothedEnergy[b] - e)*smoothingSlew;\n\t\t\tsmoothedEnergy[b] = e;\n\t\t}\n\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\te += (smoothedEnergy[b] - e)*smoothingSlew;\n\t\t\tsmoothedEnergy[b] = e;\n\t\t}\n\t\tsmoothEnergyState = e;\n\t}\n\n\tSample mapFreq(Sample freq) const {\n\t\tif (customFreqMap) return customFreqMap(freq);\n\t\tif (freq > freqTonalityLimit) {\n\t\t\treturn freq + (freqMultiplier - 1)*freqTonalityLimit;\n\t\t}\n\t\treturn freq*freqMultiplier;\n\t}\n\n\t// Identifies spectral peaks using energy across all channels\n\tvoid findPeaks() {\n\t\tpeaks.resize(0);\n\n\t\tint start = 0;\n\t\twhile (start < bands) {\n\t\t\tif (energy[start] > smoothedEnergy[start]) {\n\t\t\t\tint end = start;\n\t\t\t\tSample bandSum = 0, energySum = 0;\n\t\t\t\twhile (end < bands && energy[end] > smoothedEnergy[end]) {\n\t\t\t\t\tbandSum += end*energy[end];\n\t\t\t\t\tenergySum += energy[end];\n\t\t\t\t\t++end;\n\t\t\t\t}\n\t\t\t\tSample avgBand = bandSum/energySum;\n\t\t\t\tSample avgFreq = bandToFreq(avgBand);\n\t\t\t\tpeaks.emplace_back(Peak{avgBand, freqToBand(mapFreq(avgFreq))});\n\n\t\t\t\tstart = end;\n\t\t\t}\n\t\t\t++start;\n\t\t}\n\t}\n\n\tvoid updateOutputMap() {\n\t\tif (peaks.empty()) {\n\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\toutputMap[b] = {Sample(b), 1};\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tSample bottomOffset = peaks[0].input - peaks[0].output;\n\t\tfor (int b = 0; b < std::min<int>(bands, std::ceil(peaks[0].output)); ++b) {\n\t\t\toutputMap[b] = {b + bottomOffset, 1};\n\t\t}\n\t\t// Interpolate between points\n\t\tfor (size_t p = 1; p < peaks.size(); ++p) {\n\t\t\tconst Peak &prev = peaks[p - 1], &next = peaks[p];\n\t\t\tSample rangeScale = 1/(next.output - prev.output);\n\t\t\tSample outOffset = prev.input - prev.output;\n\t\t\tSample outScale = next.input - next.output - prev.input + prev.output;\n\t\t\tSample gradScale = outScale*rangeScale;\n\t\t\tint startBin = std::max<int>(0, std::ceil(prev.output));\n\t\t\tint endBin = std::min<int>(bands, std::ceil(next.output));\n\t\t\tfor (int b = startBin; b < endBin; ++b) {\n\t\t\t\tSample r = (b - prev.output)*rangeScale;\n\t\t\t\tSample h = r*r*(3 - 2*r);\n\t\t\t\tSample outB = b + outOffset + h*outScale;\n\n\t\t\t\tSample gradH = 6*r*(1 - r);\n\t\t\t\tSample gradB = 1 + gradH*gradScale;\n\n\t\t\t\toutputMap[b] = {outB, gradB};\n\t\t\t}\n\t\t}\n\t\tSample topOffset = peaks.back().input - peaks.back().output;\n\t\tfor (int b = std::max<int>(0, peaks.back().output); b < bands; ++b) {\n\t\t\toutputMap[b] = {b + topOffset, 1};\n\t\t}\n\t}\n\n\t// If we mapped formants the same way as mapFreq(), this would be the inverse\n\tSample invMapFormant(Sample freq) const {\n\t\tif (freq*invFormantMultiplier > freqTonalityLimit) {\n\t\t\treturn freq + (1 - formantMultiplier)*freqTonalityLimit;\n\t\t}\n\t\treturn freq*invFormantMultiplier;\n\t}\n\n\tSample freqEstimateWeighted = 0;\n\tSample freqEstimateWeight = 0;\n\tSample estimateFrequency() {\n\t\t// 3 highest peaks in the input\n\t\tstd::array<int, 3> peakIndices{0, 0, 0};\n\t\tfor (int b = 1; b < bands - 1; ++b) {\n\t\t\tSample e = formantMetric[b];\n\t\t\t// local maxima only\n\t\t\tif (e < formantMetric[b - 1] || e <= formantMetric[b + 1]) continue;\n\n\t\t\tif (e > formantMetric[peakIndices[0]]) {\n\t\t\t\tif (e > formantMetric[peakIndices[1]]) {\n\t\t\t\t\tif (e > formantMetric[peakIndices[2]]) {\n\t\t\t\t\t\tpeakIndices = {peakIndices[1], peakIndices[2], b};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpeakIndices = {peakIndices[1], b, peakIndices[2]};\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tpeakIndices[0] = b;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// VERY rough pitch estimation\n\t\tint peakEstimate = peakIndices[2];\n\t\tif (formantMetric[peakIndices[1]] > formantMetric[peakIndices[2]]*0.1) {\n\t\t\tint diff = std::abs(peakEstimate - peakIndices[1]);\n\t\t\tif (diff > peakEstimate/8 && diff < peakEstimate*7/8) peakEstimate = peakEstimate%diff;\n\t\t\tif (formantMetric[peakIndices[0]] > formantMetric[peakIndices[2]]*0.01) {\n\t\t\t\tint diff = std::abs(peakEstimate - peakIndices[0]);\n\t\t\t\tif (diff > peakEstimate/8 && diff < peakEstimate*7/8) peakEstimate = peakEstimate%diff;\n\t\t\t}\n\t\t}\n\t\tSample weight = formantMetric[peakIndices[2]];\n\t\t// Smooth it out a bit\n\t\tfreqEstimateWeighted += (peakEstimate*weight - freqEstimateWeighted)*0.25;\n\t\tfreqEstimateWeight += (weight - freqEstimateWeight)*0.25;\n\n\t\treturn freqEstimateWeighted/(freqEstimateWeight + Sample(1e-30));\n\t}\n\n\tSample freqEstimate;\n\n\tstd::vector<Sample> formantMetric;\n\tSample formantBaseFreq = 0;\n\tvoid updateFormants(size_t step) {\n\t\tif (step-- == 0) {\n\t\t\tfor (auto &e : formantMetric) e = 0;\n\t\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\t\tBand *bins = bandsForChannel(c);\n\t\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\t\tformantMetric[b] += bins[b].inputEnergy;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfreqEstimate = freqToBand(formantBaseFreq);\n\t\t\tif (formantBaseFreq <= 0) freqEstimate = estimateFrequency();\n\t\t} else if (step-- == 0) {\n\t\t\tSample decay = 1 - 1/(freqEstimate*0.5 + 1);\n\t\t\tSample e = 0;\n\t\t\tfor (size_t repeat = 0; repeat < 2; ++repeat) {\n\t\t\t\tfor (int b = bands - 1; b >= 0; --b) {\n\t\t\t\t\te = std::max(formantMetric[b], e*decay);\n\t\t\t\t\tformantMetric[b] = e;\n\t\t\t\t}\n\t\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\t\te = std::max(formantMetric[b], e*decay);\n\t\t\t\t\tformantMetric[b] = e;\n\t\t\t\t}\n\t\t\t}\n\t\t\tdecay = 1/decay;\n\t\t\tfor (size_t repeat = 0; repeat < 2; ++repeat) {\n\t\t\t\tfor (int b = bands - 1; b >= 0; --b) {\n\t\t\t\t\te = std::min(formantMetric[b], e*decay);\n\t\t\t\t\tformantMetric[b] = e;\n\t\t\t\t}\n\t\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\t\te = std::min(formantMetric[b], e*decay);\n\t\t\t\t\tformantMetric[b] = e;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tauto getFormant = [&](Sample band) -> Sample {\n\t\t\t\tif (band < 0) return 0;\n\t\t\t\tband = std::min<Sample>(band, bands);\n\t\t\t\tint floorBand = std::floor(band);\n\t\t\t\tSample fracBand = band - floorBand;\n\t\t\t\tSample low = formantMetric[floorBand], high = formantMetric[floorBand + 1];\n\t\t\t\treturn low + (high - low)*fracBand;\n\t\t\t};\n\n\t\t\tfor (int b = 0; b < bands; ++b) {\n\t\t\t\tSample inputF = bandToFreq(b);\n\t\t\t\tSample outputF = formantCompensation ? mapFreq(inputF) : inputF;\n\t\t\t\toutputF = invMapFormant(outputF);\n\n\t\t\t\tSample inputE = formantMetric[b];\n\t\t\t\tSample targetE = getFormant(freqToBand(outputF));\n\n\t\t\t\tSample formantRatio = targetE/(inputE + Sample(1e-30));\n\t\t\t\tSample energyRatio = formantRatio;\n\n\t\t\t\tfor (int c = 0; c < channels; ++c) {\n\t\t\t\t\tBand *bins = bandsForChannel(c);\n\t\t\t\t\t// This is what's used to decide the output energy, so this affects the output\n\t\t\t\t\tbins[b].inputEnergy *= energyRatio;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Proxy class to avoid copying/allocating anything\n\ttemplate<class Io>\n\tstruct OffsetIO {\n\t\tIo &io;\n\t\tint offset;\n\n\t\tstruct Channel {\n\t\t\tIo &io;\n\t\t\tint channel;\n\t\t\tint offset;\n\n\t\t\tauto operator[](int i) -> decltype(io[0][0]) {\n\t\t\t\treturn io[channel][i + offset];\n\t\t\t}\n\t\t};\n\t\tChannel operator[](int c) {\n\t\t\treturn {io, c, offset};\n\t\t}\n\t};\n};\n\n}} // namespace\n#endif // include guard\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/libs/signalsmith-stretch/stft.h",
    "content": "#ifndef SIGNALSMITH_AUDIO_LINEAR_STFT_H\n#define SIGNALSMITH_AUDIO_LINEAR_STFT_H\n\n#include <audioapi/libs/signalsmith-stretch/fft.h>\n\nnamespace signalsmith { namespace linear {\n\nenum {\n\tSTFT_SPECTRUM_PACKED=0,\n\tSTFT_SPECTRUM_MODIFIED=1,\n\tSTFT_SPECTRUM_UNPACKED=2,\n};\n\n/// A self-normalising STFT, with variable position/window for output blocks\ntemplate<typename Sample, bool splitComputation=false, int spectrumType=STFT_SPECTRUM_PACKED>\nstruct DynamicSTFT {\n\tstatic constexpr bool modified = (spectrumType == STFT_SPECTRUM_MODIFIED);\n\tstatic constexpr bool unpacked = (spectrumType == STFT_SPECTRUM_UNPACKED);\n\tRealFFT<Sample, splitComputation, modified> fft;\n\n\tusing Complex = std::complex<Sample>;\n\n\tenum class WindowShape {ignore, acg, kaiser};\n\tstatic constexpr WindowShape acg = WindowShape::acg;\n\tstatic constexpr WindowShape kaiser = WindowShape::kaiser;\n\n\tvoid configure(size_t inChannels, size_t outChannels, size_t blockSamples, size_t extraInputHistory=0, size_t intervalSamples=0, Sample asymmetry=0) {\n\t\t_analysisChannels = inChannels;\n\t\t_synthesisChannels = outChannels;\n\t\t_blockSamples = blockSamples;\n\t\t_fftSamples = fft.fastSizeAbove((blockSamples + 1)/2)*2;\n\t\tfft.resize(_fftSamples);\n\t\t_fftBins = _fftSamples/2 + (spectrumType == STFT_SPECTRUM_UNPACKED);\n\n\t\t_inputLengthSamples = _blockSamples + extraInputHistory;\n\t\tinput.buffer.resize(_inputLengthSamples*_analysisChannels);\n\n\t\toutput.buffer.resize(_blockSamples*_synthesisChannels);\n\t\toutput.windowProducts.resize(_blockSamples);\n\t\tspectrumBuffer.resize(_fftBins*std::max(_analysisChannels, _synthesisChannels));\n\t\ttimeBuffer.resize(_fftSamples);\n\n\t\t_analysisWindow.resize(_blockSamples);\n\t\t_synthesisWindow.resize(_blockSamples);\n\t\tsetInterval(intervalSamples ? intervalSamples : blockSamples/4, acg, asymmetry);\n\n\t\treset();\n\t}\n\n\tsize_t blockSamples() const {\n\t\treturn _blockSamples;\n\t}\n\tsize_t fftSamples() const {\n\t\treturn _fftSamples;\n\t}\n\tsize_t defaultInterval() const {\n\t\treturn _defaultInterval;\n\t}\n\tsize_t bands() const {\n\t\treturn _fftBins;\n\t}\n\tsize_t analysisLatency() const {\n\t\treturn _blockSamples - _analysisOffset;\n\t}\n\tsize_t synthesisLatency() const {\n\t\treturn _synthesisOffset;\n\t}\n\tsize_t latency() const {\n\t\treturn synthesisLatency() + analysisLatency();\n\t}\n\tSample binToFreq(Sample b) const {\n\t\treturn (modified ? b + Sample(0.5) : b)/_fftSamples;\n\t}\n\tSample freqToBin(Sample f) const {\n\t\treturn modified ? f*_fftSamples - Sample(0.5) : f*_fftSamples;\n\t}\n\n\tvoid reset(Sample productWeight=1) {\n\t\tinput.pos = _blockSamples;\n\t\toutput.pos = 0;\n\t\tfor (auto &v : input.buffer) v = 0;\n\t\tfor (auto &v : output.buffer) v = 0;\n\t\tfor (auto &v : spectrumBuffer) v = 0;\n\t\tfor (auto &v : output.windowProducts) v = 0;\n\t\taddWindowProduct();\n\t\tfor (int i = int(_blockSamples) - int(_defaultInterval) - 1; i >= 0; --i) {\n\t\t\toutput.windowProducts[i] += output.windowProducts[i + _defaultInterval];\n\t\t}\n\t\tfor (auto &v : output.windowProducts) v = v*productWeight + almostZero;\n\t\tmoveOutput(_defaultInterval); // ready for first block immediately\n\t}\n\n\tvoid writeInput(size_t channel, size_t offset, size_t length, const Sample *inputArray) {\n\t\tSample *buffer = input.buffer.data() + channel*_inputLengthSamples;\n\n\t\tsize_t offsetPos = (input.pos + offset)%_inputLengthSamples;\n\t\tsize_t inputWrapIndex = _inputLengthSamples - offsetPos;\n\t\tsize_t chunk1 = std::min(length, inputWrapIndex);\n\t\tfor (size_t i = 0; i < chunk1; ++i) {\n\t\t\tsize_t i2 = offsetPos + i;\n\t\t\tbuffer[i2] = inputArray[i];\n\t\t}\n\t\tfor (size_t i = chunk1; i < length; ++i) {\n\t\t\tsize_t i2 = i + offsetPos -_inputLengthSamples;\n\t\t\tbuffer[i2] = inputArray[i];\n\t\t}\n\t}\n\tvoid writeInput(size_t channel, size_t length, const Sample *inputArray) {\n\t\twriteInput(channel, 0, length, inputArray);\n\t}\n\tvoid moveInput(size_t samples, bool clearInput=false) {\n\t\tif (clearInput) {\n\t\t\tsize_t inputWrapIndex = _inputLengthSamples - input.pos;\n\t\t\tsize_t chunk1 = std::min(samples, inputWrapIndex);\n\t\t\tfor (size_t c = 0; c < _analysisChannels; ++c) {\n\t\t\t\tSample *buffer = input.buffer.data() + c*_inputLengthSamples;\n\t\t\t\tfor (size_t i = 0; i < chunk1; ++i) {\n\t\t\t\t\tsize_t i2 = input.pos + i;\n\t\t\t\t\tbuffer[i2] = 0;\n\t\t\t\t}\n\t\t\t\tfor (size_t i = chunk1; i < samples; ++i) {\n\t\t\t\t\tsize_t i2 = i + input.pos - _inputLengthSamples;\n\t\t\t\t\tbuffer[i2] = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tinput.pos = (input.pos + samples)%_inputLengthSamples;\n\t\t_samplesSinceAnalysis += samples;\n\t}\n\tsize_t samplesSinceAnalysis() const {\n\t\treturn _samplesSinceAnalysis;\n\t}\n\n\t/// When no more synthesis is expected, let output taper away to 0 based on windowing.  Otherwise, the output will be scaled as if there's just a very long block interval, which can exaggerate artefacts and numerical errors.  You still can't read more than `blockSamples()` into the future.\n\tvoid finishOutput(Sample strength=1, size_t offset=0) {\n\t\tSample maxWindowProduct = 0;\n\n\t\tsize_t chunk1 = std::max(offset, std::min(_blockSamples, _blockSamples - output.pos));\n\n\t\tfor (size_t i = offset; i < chunk1; ++i) {\n\t\t\tsize_t i2 = output.pos + i;\n\t\t\tSample &wp = output.windowProducts[i2];\n\t\t\tmaxWindowProduct = std::max(wp, maxWindowProduct);\n\t\t\twp += (maxWindowProduct - wp)*strength;\n\t\t}\n\t\tfor (size_t i = chunk1; i < _blockSamples; ++i) {\n\t\t\tsize_t i2 = i + output.pos - _blockSamples;\n\t\t\tSample &wp = output.windowProducts[i2];\n\t\t\tmaxWindowProduct = std::max(wp, maxWindowProduct);\n\t\t\twp += (maxWindowProduct - wp)*strength;\n\t\t}\n\t}\n\n\tvoid readOutput(size_t channel, size_t offset, size_t length, Sample *outputArray) {\n\t\tSample *buffer = output.buffer.data() + channel*_blockSamples;\n\t\tsize_t offsetPos = (output.pos + offset)%_blockSamples;\n\t\tsize_t outputWrapIndex = _blockSamples - offsetPos;\n\t\tsize_t chunk1 = std::min(length, outputWrapIndex);\n\t\tfor (size_t i = 0; i < chunk1; ++i) {\n\t\t\tsize_t i2 = offsetPos + i;\n\t\t\toutputArray[i] = buffer[i2]/output.windowProducts[i2];\n\t\t}\n\t\tfor (size_t i = chunk1; i < length; ++i) {\n\t\t\tsize_t i2 = i + offsetPos - _blockSamples;\n\t\t\toutputArray[i] = buffer[i2]/output.windowProducts[i2];\n\t\t}\n\t}\n\tvoid readOutput(size_t channel, size_t length, Sample *outputArray) {\n\t\treturn readOutput(channel, 0, length, outputArray);\n\t}\n\tvoid addOutput(size_t channel, size_t offset, size_t length, const Sample *newOutputArray) {\n\t\tlength = std::min(_blockSamples, length);\n\t\tSample *buffer = output.buffer.data() + channel*_blockSamples;\n\t\tsize_t offsetPos = (output.pos + offset)%_blockSamples;\n\t\tsize_t outputWrapIndex = _blockSamples - offsetPos;\n\t\tsize_t chunk1 = std::min(length, outputWrapIndex);\n\t\tfor (size_t i = 0; i < chunk1; ++i) {\n\t\t\tsize_t i2 = offsetPos + i;\n\t\t\tbuffer[i2] += newOutputArray[i]*output.windowProducts[i2];\n\t\t}\n\t\tfor (size_t i = chunk1; i < length; ++i) {\n\t\t\tsize_t i2 = i + offsetPos - _blockSamples;\n\t\t\tbuffer[i2] += newOutputArray[i]*output.windowProducts[i2];\n\t\t}\n\t}\n\tvoid addOutput(size_t channel, size_t length, const Sample *newOutputArray) {\n\t\treturn addOutput(channel, 0, length, newOutputArray);\n\t}\n\tvoid replaceOutput(size_t channel, size_t offset, size_t length, const Sample *newOutputArray) {\n\t\tlength = std::min(_blockSamples, length);\n\t\tSample *buffer = output.buffer.data() + channel*_blockSamples;\n\t\tsize_t offsetPos = (output.pos + offset)%_blockSamples;\n\t\tsize_t outputWrapIndex = _blockSamples - offsetPos;\n\t\tsize_t chunk1 = std::min(length, outputWrapIndex);\n\t\tfor (size_t i = 0; i < chunk1; ++i) {\n\t\t\tsize_t i2 = offsetPos + i;\n\t\t\tbuffer[i2] = newOutputArray[i]*output.windowProducts[i2];\n\t\t}\n\t\tfor (size_t i = chunk1; i < length; ++i) {\n\t\t\tsize_t i2 = i + offsetPos - _blockSamples;\n\t\t\tbuffer[i2] = newOutputArray[i]*output.windowProducts[i2];\n\t\t}\n\t}\n\tvoid replaceOutput(size_t channel, size_t length, const Sample *newOutputArray) {\n\t\treturn replaceOutput(channel, 0, length, newOutputArray);\n\t}\n\tvoid moveOutput(size_t samples) {\n\t\tif (samples == 1) { // avoid all the loops/chunks if we can\n\t\t\tfor (size_t c = 0; c < _synthesisChannels; ++c) {\n\t\t\t\toutput.buffer[output.pos + c*_blockSamples] = 0;\n\t\t\t}\n\t\t\toutput.windowProducts[output.pos] = almostZero;\n\t\t\tif (++output.pos >= _blockSamples) output.pos = 0;\n\t\t\treturn;\n\t\t}\n\t\t// Zero the output buffer as we cross it\n\t\tsize_t outputWrapIndex = _blockSamples - output.pos;\n\t\tsize_t chunk1 = std::min(samples, outputWrapIndex);\n\t\tfor (size_t c = 0; c < _synthesisChannels; ++c) {\n\t\t\tSample *buffer = output.buffer.data() + c*_blockSamples;\n\t\t\tfor (size_t i = 0; i < chunk1; ++i) {\n\t\t\t\tsize_t i2 = output.pos + i;\n\t\t\t\tbuffer[i2] = 0;\n\t\t\t}\n\t\t\tfor (size_t i = chunk1; i < samples; ++i) {\n\t\t\t\tsize_t i2 = i + output.pos - _blockSamples;\n\t\t\t\tbuffer[i2] = 0;\n\t\t\t}\n\t\t}\n\t\tfor (size_t i = 0; i < chunk1; ++i) {\n\t\t\tsize_t i2 = output.pos + i;\n\t\t\toutput.windowProducts[i2] = almostZero;\n\t\t}\n\t\tfor (size_t i = chunk1; i < samples; ++i) {\n\t\t\tsize_t i2 = i + output.pos - _blockSamples;\n\t\t\toutput.windowProducts[i2] = almostZero;\n\t\t}\n\t\toutput.pos = (output.pos + samples)%_blockSamples;\n\t\t_samplesSinceSynthesis += samples;\n\t}\n\tsize_t samplesSinceSynthesis() const {\n\t\treturn _samplesSinceSynthesis;\n\t}\n\n\tComplex * spectrum(size_t channel) {\n\t\treturn spectrumBuffer.data() + channel*_fftBins;\n\t}\n\tconst Complex * spectrum(size_t channel) const {\n\t\treturn spectrumBuffer.data() + channel*_fftBins;\n\t}\n\n\tSample * analysisWindow() {\n\t\treturn _analysisWindow.data();\n\t}\n\tconst Sample * analysisWindow() const {\n\t\treturn _analysisWindow.data();\n\t}\n\t// Sets the centre index of the window\n\tvoid analysisOffset(size_t offset) {\n\t\t_analysisOffset = offset;\n\t}\n\tsize_t analysisOffset() const {\n\t\treturn _analysisOffset;\n\t}\n\tSample * synthesisWindow() {\n\t\treturn _synthesisWindow.data();\n\t}\n\tconst Sample * synthesisWindow() const {\n\t\treturn _synthesisWindow.data();\n\t}\n\t// Sets the centre index of the window\n\tvoid synthesisOffset(size_t offset) {\n\t\t_synthesisOffset = offset;\n\t}\n\tsize_t synthesisOffset() const {\n\t\treturn _synthesisOffset;\n\t}\n\n\tvoid setInterval(size_t defaultInterval, WindowShape windowShape=WindowShape::ignore, Sample asymmetry=0) {\n\t\t_defaultInterval = defaultInterval;\n\t\tif (windowShape == WindowShape::ignore) return;\n\n\t\tif (windowShape == acg) {\n\t\t\tauto window = ApproximateConfinedGaussian::withBandwidth(double(_blockSamples)/defaultInterval);\n\t\t\twindow.fill(_synthesisWindow, _blockSamples, asymmetry, false);\n\t\t} else if (windowShape == kaiser) {\n\t\t\tauto window = Kaiser::withBandwidth(double(_blockSamples)/defaultInterval, true);\n\t\t\twindow.fill(_synthesisWindow,  _blockSamples, asymmetry, true);\n\t\t}\n\n\t\t_analysisOffset = _synthesisOffset = _blockSamples/2;\n\t\tif (_analysisChannels == 0) {\n\t\t\tfor (auto &v : _analysisWindow) v = 1;\n\t\t} else if (asymmetry == 0) {\n\t\t\tforcePerfectReconstruction(_synthesisWindow, _blockSamples, _defaultInterval);\n\t\t\tfor (size_t i = 0; i < _blockSamples; ++i) {\n\t\t\t\t_analysisWindow[i] = _synthesisWindow[i];\n\t\t\t}\n\t\t} else {\n\t\t\tfor (size_t i = 0; i < _blockSamples; ++i) {\n\t\t\t\t_analysisWindow[i] = _synthesisWindow[_blockSamples - 1 - i];\n\t\t\t}\n\t\t}\n\t\t// Set offsets to peak's index\n\t\tfor (size_t i = 0; i < _blockSamples; ++i) {\n\t\t\tif (_analysisWindow[i] > _analysisWindow[_analysisOffset]) _analysisOffset = i;\n\t\t\tif (_synthesisWindow[i] > _synthesisWindow[_synthesisOffset]) _synthesisOffset = i;\n\t\t}\n\t}\n\n\tvoid analyse(size_t samplesInPast=0) {\n\t\tfor (size_t s = 0; s < analyseSteps(); ++s) {\n\t\t\tanalyseStep(s, samplesInPast);\n\t\t}\n\t}\n\tsize_t analyseSteps() const {\n\t\treturn splitComputation ? _analysisChannels*(fft.steps() + 1) : _analysisChannels;\n\t}\n\tvoid analyseStep(size_t step, std::size_t samplesInPast=0) {\n\t\tsize_t fftSteps = splitComputation ? fft.steps() : 0;\n\t\tsize_t channel = step/(fftSteps + 1);\n\t\tstep -= channel*(fftSteps + 1);\n\n\t\tif (step-- == 0) { // extra step at start of each channel: copy windowed input into buffer\n\t\t\tsize_t offsetPos = (_inputLengthSamples*2 + input.pos - _blockSamples - samplesInPast)%_inputLengthSamples;\n\t\t\tsize_t inputWrapIndex = _inputLengthSamples - offsetPos;\n\t\t\tsize_t chunk1 = std::min(_analysisOffset, inputWrapIndex);\n\t\t\tsize_t chunk2 = std::max(_analysisOffset, std::min(_blockSamples, inputWrapIndex));\n\n\t\t\t_samplesSinceAnalysis = samplesInPast;\n\t\t\tSample *buffer = input.buffer.data() + channel*_inputLengthSamples;\n\t\t\tfor (size_t i = 0; i < chunk1; ++i) {\n\t\t\t\tSample w = modified ? -_analysisWindow[i] : _analysisWindow[i];\n\t\t\t\tsize_t ti = i + (_fftSamples - _analysisOffset);\n\t\t\t\tsize_t bi = offsetPos + i;\n\t\t\t\ttimeBuffer[ti] = buffer[bi]*w;\n\t\t\t}\n\t\t\tfor (size_t i = chunk1; i < _analysisOffset; ++i) {\n\t\t\t\tSample w = modified ? -_analysisWindow[i] : _analysisWindow[i];\n\t\t\t\tsize_t ti = i + (_fftSamples - _analysisOffset);\n\t\t\t\tsize_t bi = i + offsetPos - _inputLengthSamples;\n\t\t\t\ttimeBuffer[ti] = buffer[bi]*w;\n\t\t\t}\n\t\t\tfor (size_t i = _analysisOffset; i < chunk2; ++i) {\n\t\t\t\tSample w = _analysisWindow[i];\n\t\t\t\tsize_t ti = i - _analysisOffset;\n\t\t\t\tsize_t bi = offsetPos + i;\n\t\t\t\ttimeBuffer[ti] = buffer[bi]*w;\n\t\t\t}\n\t\t\tfor (size_t i = chunk2; i < _blockSamples; ++i) {\n\t\t\t\tSample w = _analysisWindow[i];\n\t\t\t\tsize_t ti = i - _analysisOffset;\n\t\t\t\tsize_t bi = i + offsetPos - _inputLengthSamples;\n\t\t\t\ttimeBuffer[ti] = buffer[bi]*w;\n\t\t\t}\n\t\t\tfor (size_t i = _blockSamples - _analysisOffset; i < _fftSamples - _analysisOffset; ++i) {\n\t\t\t\ttimeBuffer[i] = 0;\n\t\t\t}\n\t\t\tif (splitComputation) return;\n\t\t}\n\t\tauto *spectrumPtr = spectrum(channel);\n\t\tif (splitComputation) {\n\t\t\tfft.fft(step, timeBuffer.data(), spectrumPtr);\n\t\t\tif (unpacked && step == fft.steps() - 1) {\n\t\t\t\tspectrumPtr[_fftBins - 1] = spectrumPtr[0].imag();\n\t\t\t\tspectrumPtr[0].imag(0);\n\t\t\t}\n\t\t} else {\n\t\t\tfft.fft(timeBuffer.data(), spectrum(channel));\n\t\t\tif (unpacked) {\n\t\t\t\tspectrumPtr[_fftBins - 1] = spectrumPtr[0].imag();\n\t\t\t\tspectrumPtr[0].imag(0);\n\t\t\t}\n\t\t}\n\t}\n\n\tvoid synthesise() {\n\t\tfor (size_t s = 0; s < synthesiseSteps(); ++s) {\n\t\t\tsynthesiseStep(s);\n\t\t}\n\t}\n\tsize_t synthesiseSteps() const {\n\t\treturn splitComputation ? (_synthesisChannels*(fft.steps() + 1) + 1) : _synthesisChannels;\n\t}\n\tvoid synthesiseStep(size_t step) {\n\t\tif (step == 0) { // Extra first step which adds in the effective gain for a pure analysis-synthesis cycle\n\t\t\taddWindowProduct();\n\t\t\tif (splitComputation) return;\n\t\t}\n\t\tif (splitComputation) --step;\n\n\t\tsize_t fftSteps = splitComputation ? fft.steps() : 0;\n\t\tsize_t channel = step/(fftSteps + 1);\n\t\tstep -= channel*(fftSteps + 1);\n\n\t\tauto *spectrumPtr = spectrum(channel);\n\t\tif (unpacked && step == 0) { // re-pack\n\t\t\tspectrumPtr[0].imag(spectrumPtr[_fftBins - 1].real());\n\t\t}\n\n\t\tif (splitComputation) {\n\t\t\tif (step < fftSteps) {\n\t\t\t\tfft.ifft(step, spectrumPtr, timeBuffer.data());\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\t\t\tfft.ifft(spectrumPtr, timeBuffer.data());\n\t\t}\n\n\t\t// extra step after each channel's FFT\n\t\tSample *buffer = output.buffer.data() + channel*_blockSamples;\n\t\tsize_t outputWrapIndex = _blockSamples - output.pos;\n\t\tsize_t chunk1 = std::min(_synthesisOffset, outputWrapIndex);\n\t\tsize_t chunk2 = std::min(_blockSamples, std::max(_synthesisOffset, outputWrapIndex));\n\n\t\tfor (size_t i = 0; i < chunk1; ++i) {\n\t\t\tSample w = modified ? -_synthesisWindow[i] : _synthesisWindow[i];\n\t\t\tsize_t ti = i + (_fftSamples - _synthesisOffset);\n\t\t\tsize_t bi = output.pos + i;\n\t\t\tbuffer[bi] += timeBuffer[ti]*w;\n\t\t}\n\t\tfor (size_t i = chunk1; i < _synthesisOffset; ++i) {\n\t\t\tSample w = modified ? -_synthesisWindow[i] : _synthesisWindow[i];\n\t\t\tsize_t ti = i + (_fftSamples - _synthesisOffset);\n\t\t\tsize_t bi = i + output.pos - _blockSamples;\n\t\t\tbuffer[bi] += timeBuffer[ti]*w;\n\t\t}\n\t\tfor (size_t i = _synthesisOffset; i < chunk2; ++i) {\n\t\t\tSample w = _synthesisWindow[i];\n\t\t\tsize_t ti = i - _synthesisOffset;\n\t\t\tsize_t bi = output.pos + i;\n\t\t\tbuffer[bi] += timeBuffer[ti]*w;\n\t\t}\n\t\tfor (size_t i = chunk2; i < _blockSamples; ++i) {\n\t\t\tSample w = _synthesisWindow[i];\n\t\t\tsize_t ti = i - _synthesisOffset;\n\t\t\tsize_t bi = i + output.pos - _blockSamples;\n\t\t\tbuffer[bi] += timeBuffer[ti]*w;\n\t\t}\n\t}\n\n#define COMPAT_SPELLING(name, alt) \\\n\ttemplate<class ...Args> \\\n\tvoid alt(Args &&...args) { \\\n\t\tname(std::forward<Args>(args)...); \\\n\t}\n\tCOMPAT_SPELLING(analyse, analyze);\n\tCOMPAT_SPELLING(analyseStep, analyseStep);\n\tCOMPAT_SPELLING(analyseSteps, analyzeSteps);\n\tCOMPAT_SPELLING(synthesise, synthesize);\n\tCOMPAT_SPELLING(synthesiseStep, synthesizeStep);\n\tCOMPAT_SPELLING(synthesiseSteps, synthesizeSteps);\n\n\t/// Input (only available so we can save/restore the input state)\n\tstruct Input {\n\t\tvoid swap(Input &other) {\n\t\t\tstd::swap(pos, other.pos);\n\t\t\tstd::swap(buffer, other.buffer);\n\t\t}\n\n\t\tInput & operator=(const Input &other) {\n\t\t\tpos = other.pos;\n\t\t\tbuffer.assign(other.buffer.begin(), other.buffer.end());\n\t\t\treturn *this;\n\t\t}\n\tprivate:\n\t\tfriend struct DynamicSTFT;\n\t\tsize_t pos = 0;\n\t\tstd::vector<Sample> buffer;\n\t};\n\tInput input;\n\n\t/// Output (only available so we can save/restore the output state)\n\tstruct Output {\n\t\tvoid swap(Output &other) {\n\t\t\tstd::swap(pos, other.pos);\n\t\t\tstd::swap(buffer, other.buffer);\n\t\t\tstd::swap(windowProducts, other.windowProducts);\n\t\t}\n\n\t\tOutput & operator=(const Output &other) {\n\t\t\tpos = other.pos;\n\t\t\tbuffer.assign(other.buffer.begin(), other.buffer.end());\n\t\t\twindowProducts.assign(other.windowProducts.begin(), other.windowProducts.end());\n\t\t\treturn *this;\n\t\t}\n\tprivate:\n\t\tfriend struct DynamicSTFT;\n\t\tsize_t pos = 0;\n\t\tstd::vector<Sample> buffer;\n\t\tstd::vector<Sample> windowProducts;\n\t};\n\tOutput output;\n\nprivate:\n\tstatic constexpr Sample almostZero = 1e-30;\n\n\tsize_t _analysisChannels, _synthesisChannels, _inputLengthSamples, _blockSamples, _fftSamples, _fftBins;\n\tsize_t _defaultInterval = 0;\n\n\tstd::vector<Sample> _analysisWindow, _synthesisWindow;\n\tsize_t _analysisOffset = 0, _synthesisOffset = 0;\n\n\tstd::vector<Complex> spectrumBuffer;\n\tstd::vector<Sample> timeBuffer;\n\n\tsize_t _samplesSinceSynthesis = 0, _samplesSinceAnalysis = 0;\n\n\tvoid addWindowProduct() {\n\t\t_samplesSinceSynthesis = 0;\n\n\t\tint windowShift = int(_synthesisOffset) - int(_analysisOffset);\n\t\tsize_t wMin = std::max<ptrdiff_t>(0, windowShift);\n\t\tsize_t wMax = std::min<ptrdiff_t>(_blockSamples, int(_blockSamples) + windowShift);\n\n\t\tSample *windowProduct = output.windowProducts.data();\n\t\tsize_t outputWrapIndex = _blockSamples - output.pos;\n\t\tsize_t chunk1 = std::min<size_t>(wMax, std::max<size_t>(wMin, outputWrapIndex));\n\t\tfor (size_t i = wMin; i < chunk1; ++i) {\n\t\t\tSample wa = _analysisWindow[i - windowShift];\n\t\t\tSample ws = _synthesisWindow[i];\n\t\t\tsize_t bi = output.pos + i;\n\t\t\twindowProduct[bi] += wa*ws*_fftSamples;\n\t\t}\n\t\tfor (size_t i = chunk1; i < wMax; ++i) {\n\t\t\tSample wa = _analysisWindow[i - windowShift];\n\t\t\tSample ws = _synthesisWindow[i];\n\t\t\tsize_t bi = i + output.pos - _blockSamples;\n\t\t\twindowProduct[bi] += wa*ws*_fftSamples;\n\t\t}\n\t}\n\n\t// Copied from DSP library `windows.h`\n\tclass Kaiser {\n\t\tinline static double bessel0(double x) {\n\t\t\tconst double significanceLimit = 1e-4;\n\t\t\tdouble result = 0;\n\t\t\tdouble term = 1;\n\t\t\tdouble m = 0;\n\t\t\twhile (term > significanceLimit) {\n\t\t\t\tresult += term;\n\t\t\t\t++m;\n\t\t\t\tterm *= (x*x)/(4*m*m);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t\tdouble beta;\n\t\tdouble invB0;\n\n\t\tstatic double heuristicBandwidth(double bandwidth) {\n\t\t\treturn bandwidth + 8/((bandwidth + 3)*(bandwidth + 3)) + 0.25*std::max(3 - bandwidth, 0.0);\n\t\t}\n\tpublic:\n\t\tKaiser(double beta) : beta(beta), invB0(1/bessel0(beta)) {}\n\n\t\tstatic Kaiser withBandwidth(double bandwidth, bool heuristicOptimal=false) {\n\t\t\treturn Kaiser(bandwidthToBeta(bandwidth, heuristicOptimal));\n\t\t}\n\t\tstatic double bandwidthToBeta(double bandwidth, bool heuristicOptimal=false) {\n\t\t\tif (heuristicOptimal) { // Heuristic based on numerical search\n\t\t\t\tbandwidth = heuristicBandwidth(bandwidth);\n\t\t\t}\n\t\t\tbandwidth = std::max(bandwidth, 2.0);\n\t\t\tdouble alpha = std::sqrt(bandwidth*bandwidth*0.25 - 1);\n\t\t\treturn alpha*M_PI;\n\t\t}\n\n\t\ttemplate<typename Data>\n\t\tvoid fill(Data &&data, size_t size, double warp, bool isForSynthesis) const {\n\t\t\tdouble invSize = 1.0/size;\n\t\t\tsize_t offsetI = (size&1) ? 1 : (isForSynthesis ? 0 : 2);\n\t\t\tfor (size_t i = 0; i < size; ++i) {\n\t\t\t\tdouble r = (2*i + offsetI)*invSize - 1;\n\t\t\t\tr = (r + warp)/(1 + r*warp);\n\t\t\t\tdouble arg = std::sqrt(1 - r*r);\n\t\t\t\tdata[i] = bessel0(beta*arg)*invB0;\n\t\t\t}\n\t\t}\n\t};\n\n\tclass ApproximateConfinedGaussian {\n\t\tdouble gaussianFactor;\n\n\t\tdouble gaussian(double x) const {\n\t\t\treturn std::exp(-x*x*gaussianFactor);\n\t\t}\n\tpublic:\n\t\tstatic double bandwidthToSigma(double bandwidth) {\n\t\t\treturn 0.3/std::sqrt(bandwidth);\n\t\t}\n\t\tstatic ApproximateConfinedGaussian withBandwidth(double bandwidth) {\n\t\t\treturn ApproximateConfinedGaussian(bandwidthToSigma(bandwidth));\n\t\t}\n\n\t\tApproximateConfinedGaussian(double sigma) : gaussianFactor(0.0625/(sigma*sigma)) {}\n\n\t\t/// Fills an arbitrary container\n\t\ttemplate<typename Data>\n\t\tvoid fill(Data &&data, size_t size, double warp, bool isForSynthesis) const {\n\t\t\tdouble invSize = 1.0/size;\n\t\t\tdouble offsetScale = gaussian(1)/(gaussian(3) + gaussian(-1));\n\t\t\tdouble norm = 1/(gaussian(0) - 2*offsetScale*(gaussian(2)));\n\t\t\tsize_t offsetI = (size&1) ? 1 : (isForSynthesis ? 0 : 2);\n\t\t\tfor (size_t i = 0; i < size; ++i) {\n\t\t\t\tdouble r = (2*i + offsetI)*invSize - 1;\n\t\t\t\tr = (r + warp)/(1 + r*warp);\n\t\t\t\tdata[i] = norm*(gaussian(r) - offsetScale*(gaussian(r - 2) + gaussian(r + 2)));\n\t\t\t}\n\t\t}\n\t};\n\n\ttemplate<typename Data>\n\tvoid forcePerfectReconstruction(Data &&data, size_t windowLength, size_t interval) {\n\t\tfor (size_t i = 0; i < interval; ++i) {\n\t\t\tdouble sum2 = 0;\n\t\t\tfor (size_t index = i; index < windowLength; index += interval) {\n\t\t\t\tsum2 += data[index]*data[index];\n\t\t\t}\n\t\t\tdouble factor = 1/std::sqrt(sum2);\n\t\t\tfor (size_t index = i; index < windowLength; index += interval) {\n\t\t\t\tdata[index] *= factor;\n\t\t\t}\n\t\t}\n\t}\n};\n\n}} // namespace\n\n#endif // include guard\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/types/NodeOptions.h",
    "content": "#pragma once\n\n#include <memory>\n#include <string>\n#include <utility>\n#include <vector>\n\n#include <audioapi/core/effects/PeriodicWave.h>\n#include <audioapi/core/types/BiquadFilterType.h>\n#include <audioapi/core/types/ChannelCountMode.h>\n#include <audioapi/core/types/ChannelInterpretation.h>\n#include <audioapi/core/types/OscillatorType.h>\n#include <audioapi/core/types/OverSampleType.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n\nnamespace audioapi {\nstruct AudioNodeOptions {\n  int channelCount = 2;\n  ChannelCountMode channelCountMode = ChannelCountMode::MAX;\n  ChannelInterpretation channelInterpretation = ChannelInterpretation::SPEAKERS;\n  int numberOfInputs = 1;\n  int numberOfOutputs = 1;\n  bool requiresTailProcessing = false;\n};\n\nstruct AudioDestinationOptions : AudioNodeOptions {\n  AudioDestinationOptions() {\n    numberOfOutputs = 0;\n    channelCountMode = ChannelCountMode::EXPLICIT;\n  }\n};\n\nstruct AudioScheduledSourceNodeOptions : AudioNodeOptions {\n  AudioScheduledSourceNodeOptions() {\n    numberOfInputs = 0;\n  }\n};\n\nstruct GainOptions : AudioNodeOptions {\n  float gain = 1.0f;\n};\n\nstruct StereoPannerOptions : AudioNodeOptions {\n  float pan = 0.0f;\n\n  StereoPannerOptions() {\n    channelCountMode = ChannelCountMode::CLAMPED_MAX;\n  }\n\n  explicit StereoPannerOptions(AudioNodeOptions options) : AudioNodeOptions(options) {\n    channelCountMode = ChannelCountMode::CLAMPED_MAX;\n  }\n};\n\nstruct ConvolverOptions : AudioNodeOptions {\n  bool disableNormalization = false;\n  std::shared_ptr<AudioBuffer> buffer = nullptr;\n\n  ConvolverOptions() {\n    requiresTailProcessing = true;\n  }\n\n  explicit ConvolverOptions(AudioNodeOptions options) : AudioNodeOptions(options) {\n    requiresTailProcessing = true;\n  }\n};\n\nstruct ConstantSourceOptions : AudioScheduledSourceNodeOptions {\n  float offset = 1.0f;\n};\n\nstruct AnalyserOptions : AudioNodeOptions {\n  static constexpr int kDefaultFftSize = 2048;\n  static constexpr float kDefaultMinDecibels = -100.0f;\n  static constexpr float kDefaultMaxDecibels = -30.0f;\n  static constexpr float kDefaultSmoothingTimeConstant = 0.8f;\n  int fftSize = kDefaultFftSize;\n  float minDecibels = kDefaultMinDecibels;\n  float maxDecibels = kDefaultMaxDecibels;\n  float smoothingTimeConstant = kDefaultSmoothingTimeConstant;\n};\n\nstruct BiquadFilterOptions : AudioNodeOptions {\n  static constexpr float kDefaultFrequency = 350.0f;\n  BiquadFilterType type = BiquadFilterType::LOWPASS;\n  float frequency = kDefaultFrequency;\n  float detune = 0.0f;\n  float Q = 1.0f;\n  float gain = 0.0f;\n};\n\nstruct OscillatorOptions : AudioScheduledSourceNodeOptions {\n  static constexpr float kDefaultFrequency = 440.0f;\n  std::shared_ptr<PeriodicWave> periodicWave = nullptr;\n  float frequency = kDefaultFrequency;\n  float detune = 0.0f;\n  OscillatorType type = OscillatorType::SINE;\n};\n\nstruct BaseAudioBufferSourceOptions : AudioScheduledSourceNodeOptions {\n  bool pitchCorrection = false;\n  float detune = 0.0f;\n  float playbackRate = 1.0f;\n  int onPositionChangedInterval = 100;\n};\n\nstruct AudioBufferSourceOptions : BaseAudioBufferSourceOptions {\n  std::shared_ptr<AudioBuffer> buffer = nullptr;\n  float loopStart = 0.0f;\n  float loopEnd = 0.0f;\n  bool loop = false;\n  bool loopSkip = false;\n\n  explicit AudioBufferSourceOptions(BaseAudioBufferSourceOptions options)\n      : BaseAudioBufferSourceOptions(options) {\n    channelCount = 1;\n  }\n};\n\nstruct AudioFileSourceOptions : AudioScheduledSourceNodeOptions {\n  std::vector<uint8_t> data;\n  std::string filePath;\n  bool requiresFFmpeg = false;\n  bool loop = false;\n  float volume = 1.0f;\n};\n\nstruct StreamerOptions : AudioScheduledSourceNodeOptions {\n  std::string streamPath;\n};\n\nstruct DelayOptions : AudioNodeOptions {\n  float maxDelayTime = 1.0f;\n  float delayTime = 0.0f;\n\n  DelayOptions() {\n    requiresTailProcessing = true;\n  }\n\n  explicit DelayOptions(AudioNodeOptions options) : AudioNodeOptions(options) {\n    requiresTailProcessing = true;\n  }\n};\n\nstruct IIRFilterOptions : AudioNodeOptions {\n  std::vector<float> feedforward;\n  std::vector<float> feedback;\n\n  IIRFilterOptions() = default;\n\n  explicit IIRFilterOptions(AudioNodeOptions options) : AudioNodeOptions(options) {}\n\n  IIRFilterOptions(const std::vector<float> &ff, const std::vector<float> &fb)\n      : feedforward(ff), feedback(fb) {}\n\n  IIRFilterOptions(std::vector<float> &&ff, std::vector<float> &&fb)\n      : feedforward(std::move(ff)), feedback(std::move(fb)) {}\n};\n\nstruct WaveShaperOptions : AudioNodeOptions {\n  std::shared_ptr<AudioArray> curve{nullptr};\n  OverSampleType oversample = OverSampleType::OVERSAMPLE_NONE;\n\n  WaveShaperOptions() {\n    // to change after graph processing improvement - should be max\n    channelCountMode = ChannelCountMode::CLAMPED_MAX;\n  }\n\n  explicit WaveShaperOptions(const AudioNodeOptions &options) : AudioNodeOptions(options) {\n    // to change after graph processing improvement - should be max\n    channelCountMode = ChannelCountMode::CLAMPED_MAX;\n  }\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/AlignedAllocator.hpp",
    "content": "#pragma once\n#include <cstddef>\n#include <new>\n\ntemplate <typename T, std::size_t Align = 16>\nclass AlignedAllocator {\n public:\n  using value_type = T;\n  using size_type = std::size_t;\n  using difference_type = std::ptrdiff_t;\n\n  AlignedAllocator() noexcept = default;\n  template <class U>\n  AlignedAllocator(const AlignedAllocator<U, Align> &) noexcept {}\n\n  T *allocate(std::size_t n) {\n    // We want to maximize performance on hot paths, so we hint unlikely branches\n    if (n == 0) [[unlikely]] {\n      return nullptr;\n    }\n    std::size_t bytes = n * sizeof(T);\n    // C++17 aligned new\n    void *p = ::operator new(bytes, std::align_val_t(Align));\n\n    // We have more serious problems if this happens than speed concerns\n    // so we can opt the branch prediction\n    if (!p) [[unlikely]] {\n      throw std::bad_alloc();\n    }\n    return static_cast<T *>(p);\n  }\n\n  void deallocate(T *p, std::size_t) noexcept {\n    ::operator delete(p, std::align_val_t(Align));\n  }\n\n  // Rebind allocator to type U (required by std::vector)\n  template <class U>\n  struct rebind {\n    using other = AlignedAllocator<U, Align>;\n  };\n\n  // Comparison operators (required by std::vector)\n  template <typename U, std::size_t UAlign>\n  bool operator==(const AlignedAllocator<U, UAlign> &) const noexcept {\n    return Align == UAlign;\n  }\n\n  template <typename U, std::size_t UAlign>\n  bool operator!=(const AlignedAllocator<U, UAlign> &) const noexcept {\n    return Align != UAlign;\n  }\n};\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/AudioArray.hpp",
    "content": "#pragma once\n\n#include <audioapi/dsp/VectorMath.h>\n#include <audioapi/utils/AlignedAllocator.hpp>\n#include <algorithm>\n#include <cstddef>\n#include <cstring>\n#include <memory>\n#include <span>\n#include <stdexcept>\n#include <utility>\n#include <vector>\n\nnamespace audioapi {\n\n/// @brief AlignedAudioArray is a simple wrapper around an aligned float vector for audio data manipulation.\n/// It provides various utility functions for audio processing.\n/// @tparam Alignment The memory alignment in bytes for the underlying storage.\n/// @note AlignedAudioArray manages its own memory and provides copy and move semantics.\n/// @note Not thread-safe.\n/// @note Operations between different alignment specializations are supported.\ntemplate <size_t Alignment>\nclass AlignedAudioArray {\n  template <size_t A>\n  friend class AlignedAudioArray;\n\n public:\n  explicit AlignedAudioArray(size_t size) : data_(size, 0.0f), size_(size) {}\n\n  /// @brief Constructs a AlignedAudioArray from existing data.\n  /// @note The data is copied, so it does not take ownership of the pointer.\n  AlignedAudioArray(const float *data, size_t size) : data_(size), size_(size) {\n    if (size_ > 0) {\n      copy(data, 0, 0, size_);\n    }\n  }\n\n  ~AlignedAudioArray() = default;\n\n  AlignedAudioArray(const AlignedAudioArray &other) : data_(other.data_), size_(other.size_) {}\n\n  AlignedAudioArray(AlignedAudioArray &&other) noexcept\n      : data_(std::move(other.data_)), size_(std::exchange(other.size_, 0)) {}\n\n  AlignedAudioArray &operator=(const AlignedAudioArray &other) {\n    if (this != &other) {\n      if (size_ != other.size_) {\n        size_ = other.size_;\n        data_.resize(size_);\n      }\n      if (size_ > 0) {\n        copy(other);\n      }\n    }\n    return *this;\n  }\n\n  AlignedAudioArray &operator=(AlignedAudioArray &&other) noexcept {\n    if (this != &other) {\n      data_ = std::move(other.data_);\n      size_ = std::exchange(other.size_, 0);\n    }\n    return *this;\n  }\n\n  [[nodiscard]] size_t getSize() const noexcept {\n    return size_;\n  }\n\n  float &operator[](size_t index) noexcept {\n    return data_[index];\n  }\n  const float &operator[](size_t index) const noexcept {\n    return data_[index];\n  }\n\n  [[nodiscard]] float *begin() noexcept {\n    return alignedData();\n  }\n  [[nodiscard]] float *end() noexcept {\n    return alignedData() + size_;\n  }\n\n  [[nodiscard]] const float *begin() const noexcept {\n    return alignedData();\n  }\n  [[nodiscard]] const float *end() const noexcept {\n    return alignedData() + size_;\n  }\n\n  [[nodiscard]] std::span<float> span() noexcept {\n    return {alignedData(), size_};\n  }\n\n  [[nodiscard]] std::span<const float> span() const noexcept {\n    return {alignedData(), size_};\n  }\n\n  [[nodiscard]] std::span<float> subSpan(size_t length, size_t offset = 0) {\n    if (offset + length > size_) {\n      throw std::out_of_range(\"AudioArray::subSpan - offset + length exceeds array size\");\n    }\n    return {alignedData() + offset, length};\n  }\n\n  void zero() noexcept {\n    zero(0, size_);\n  }\n\n  void zero(size_t start, size_t length) noexcept {\n    memset(alignedData() + start, 0, length * sizeof(float));\n  }\n\n  /// @brief Sums the source array into this array with an optional gain.\n  /// @note Assumes source and this are in distinct, non-overlapping memory locations.\n  template <size_t OtherAlignment>\n  void sum(const AlignedAudioArray<OtherAlignment> &source, float gain = 1.0f) {\n    sum(source, 0, 0, size_, gain);\n  }\n\n  /// @brief Sums a sub-range of source into this array with an optional gain.\n  /// @note Assumes source and this are in distinct, non-overlapping memory locations.\n  template <size_t OtherAlignment>\n  void sum(\n      const AlignedAudioArray<OtherAlignment> &source,\n      size_t sourceStart,\n      size_t destinationStart,\n      size_t length,\n      float gain = 1.0f) {\n    if (size_ - destinationStart < length || source.size_ - sourceStart < length) [[unlikely]] {\n      throw std::out_of_range(\"Not enough data to sum two vectors.\");\n    }\n\n    // Using restrict to inform the compiler that the source and destination do not overlap\n    float *__restrict dest = alignedData() + destinationStart;\n    const float *__restrict src = source.alignedData() + sourceStart;\n\n    dsp::multiplyByScalarThenAddToOutput(src, gain, dest, length);\n  }\n\n  /// @brief Multiplies this array by the source array element-wise.\n  /// @note Assumes source and this are in distinct, non-overlapping memory locations.\n  template <size_t OtherAlignment>\n  void multiply(const AlignedAudioArray<OtherAlignment> &source) {\n    multiply(source, size_);\n  }\n\n  /// @brief Multiplies the first length elements of this array by the source array element-wise.\n  /// @note Assumes source and this are in distinct, non-overlapping memory locations.\n  template <size_t OtherAlignment>\n  void multiply(const AlignedAudioArray<OtherAlignment> &source, size_t length) {\n    if (size_ < length || source.size_ < length) [[unlikely]] {\n      throw std::out_of_range(\"Not enough data to perform vector multiplication.\");\n    }\n\n    float *__restrict dest = alignedData();\n    const float *__restrict src = source.alignedData();\n\n    dsp::multiply(src, dest, dest, length);\n  }\n\n  /// @brief Copies source array into this array.\n  /// @note Assumes source and this are in distinct, non-overlapping memory locations.\n  template <size_t OtherAlignment>\n  void copy(const AlignedAudioArray<OtherAlignment> &source) { // NOLINT(build/include_what_you_use)\n    copy(source, 0, 0, size_);\n  }\n\n  /// @brief Copies a sub-range of source into this array.\n  /// @note Assumes source and this are in distinct, non-overlapping memory locations.\n  template <size_t OtherAlignment>\n  void copy(\n      const AlignedAudioArray<OtherAlignment> &source,\n      size_t sourceStart,\n      size_t destinationStart,\n      size_t length) { // NOLINT(build/include_what_you_use)\n    if (source.size_ - sourceStart < length) [[unlikely]] {\n      throw std::out_of_range(\"Not enough data to copy from source.\");\n    }\n    copy(source.alignedData(), sourceStart, destinationStart, length);\n  }\n\n  /// @brief Copies data from a raw float pointer into this array.\n  /// @note Assumes source and this are in distinct, non-overlapping memory locations.\n  void copy(\n      const float *source,\n      size_t sourceStart,\n      size_t destinationStart,\n      size_t length) { // NOLINT(build/include_what_you_use)\n    if (size_ - destinationStart < length) [[unlikely]] {\n      throw std::out_of_range(\"Not enough space to copy to destination.\");\n    }\n    memcpy(alignedData() + destinationStart, source + sourceStart, length * sizeof(float));\n  }\n\n  /// @brief Copies source array in reverse order into this array.\n  /// @note Assumes source and this are in distinct, non-overlapping memory locations.\n  template <size_t OtherAlignment>\n  void copyReverse(\n      const AlignedAudioArray<OtherAlignment> &source,\n      size_t sourceStart,\n      size_t destinationStart,\n      size_t length) {\n    if (size_ - destinationStart < length || source.size_ - sourceStart < length) [[unlikely]] {\n      throw std::out_of_range(\"Not enough space to copy to destination or from source.\");\n    }\n\n    auto dstView = this->subSpan(length, destinationStart);\n    auto srcView = source.span();\n    const float *__restrict srcPtr = &srcView[sourceStart];\n\n    for (size_t i = 0; i < length; ++i) {\n      dstView[i] = srcPtr[-static_cast<ptrdiff_t>(i)];\n    }\n  }\n\n  /// @brief Copies data from this array to a raw float pointer.\n  /// @note Assumes destination and this are in distinct, non-overlapping memory locations.\n  void copyTo(float *destination, size_t sourceStart, size_t destinationStart, size_t length)\n      const {\n    if (size_ - sourceStart < length) [[unlikely]] {\n      throw std::out_of_range(\"Not enough data to copy from source.\");\n    }\n    memcpy(destination + destinationStart, alignedData() + sourceStart, length * sizeof(float));\n  }\n\n  /// @brief Copies a sub-section of the array to another location within itself.\n  void copyWithin(size_t sourceStart, size_t destinationStart, size_t length) {\n    if (size_ - sourceStart < length || size_ - destinationStart < length) [[unlikely]] {\n      throw std::out_of_range(\"Not enough space for moving data or data to move.\");\n    }\n    float *base = alignedData();\n    memmove(base + destinationStart, base + sourceStart, length * sizeof(float));\n  }\n\n  void reverse() {\n    if (size_ <= 1) {\n      return;\n    }\n    std::reverse(begin(), end());\n  }\n\n  void normalize() {\n    float maxAbsValue = getMaxAbsValue();\n    if (maxAbsValue == 0.0f || maxAbsValue == 1.0f) {\n      return;\n    }\n    float *data = alignedData();\n    dsp::multiplyByScalar(data, 1.0f / maxAbsValue, data, size_);\n  }\n\n  void scale(float value) {\n    float *data = alignedData();\n    dsp::multiplyByScalar(data, value, data, size_);\n  }\n\n  [[nodiscard]] float getMaxAbsValue() const {\n    return dsp::maximumMagnitude(alignedData(), size_);\n  }\n\n private:\n  [[nodiscard]] float *alignedData() noexcept {\n    return std::assume_aligned<Alignment>(data_.data());\n  }\n  [[nodiscard]] const float *alignedData() const noexcept {\n    return std::assume_aligned<Alignment>(data_.data());\n  }\n\n protected:\n  std::vector<float, AlignedAllocator<float, Alignment>> data_;\n  size_t size_ = 0;\n};\n\ninline constexpr size_t DSP_ALIGNMENT = 64;\nusing AudioArray = AlignedAudioArray<alignof(std::max_align_t)>;\nusing DSPAudioArray = AlignedAudioArray<DSP_ALIGNMENT>;\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/AudioArrayBuffer.hpp",
    "content": "#pragma once\n\n#include <audioapi/utils/AudioArray.hpp>\n\n#if !RN_AUDIO_API_TEST\n#include <jsi/jsi.h>\nusing JsiBuffer = facebook::jsi::MutableBuffer;\n#else\n// Dummy class to inherit from nothing if testing\nstruct JsiBuffer {\n  virtual size_t size() const = 0;\n  virtual uint8_t *data() = 0;\n};\n#endif\n\nnamespace audioapi {\n\ntemplate <size_t Alignment>\nclass AlignedAudioArrayBuffer : public JsiBuffer, public AlignedAudioArray<Alignment> {\n public:\n  explicit AlignedAudioArrayBuffer(size_t size) : AlignedAudioArray<Alignment>(size) {};\n  AlignedAudioArrayBuffer(const float *data, size_t size)\n      : AlignedAudioArray<Alignment>(data, size) {};\n\n  [[nodiscard]] size_t size() const override {\n    return this->size_ * sizeof(float);\n  }\n  uint8_t *data() override {\n    return reinterpret_cast<uint8_t *>(this->data_.data());\n  }\n};\n\nusing AudioArrayBuffer = AlignedAudioArrayBuffer<alignof(std::max_align_t)>;\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/AudioBuffer.hpp",
    "content": "#pragma once\n\n#include <audioapi/core/types/ChannelInterpretation.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/dsp/VectorMath.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioArrayBuffer.hpp>\n\n#include <algorithm>\n#include <cstddef>\n#include <memory>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\nnamespace audioapi {\n\n/// @brief AlignedAudioBuffer is a multi-channel audio buffer backed by AlignedAudioArray channels.\n/// @tparam Alignment The memory alignment in bytes for the underlying channel arrays.\ntemplate <size_t Alignment>\nclass AlignedAudioBuffer {\n public:\n  enum : uint8_t {\n    ChannelMono = 0,\n    ChannelLeft = 0,\n    ChannelRight = 1,\n    ChannelCenter = 2,\n    ChannelLFE = 3,\n    ChannelSurroundLeft = 4,\n    ChannelSurroundRight = 5,\n  };\n\n  template <size_t A>\n  friend class AlignedAudioBuffer;\n\n  explicit AlignedAudioBuffer() = default;\n\n  explicit AlignedAudioBuffer(size_t size, int numberOfChannels, float sampleRate)\n      : numberOfChannels_(numberOfChannels), sampleRate_(sampleRate), size_(size) {\n    channels_.reserve(numberOfChannels_);\n    for (size_t i = 0; i < numberOfChannels_; ++i) {\n      channels_.emplace_back(std::make_shared<AlignedAudioArrayBuffer<Alignment>>(size_));\n    }\n  }\n\n  AlignedAudioBuffer(const AlignedAudioBuffer &other)\n      : numberOfChannels_(other.numberOfChannels_),\n        sampleRate_(other.sampleRate_),\n        size_(other.size_) {\n    channels_.reserve(numberOfChannels_);\n    for (const auto &channel : other.channels_) {\n      channels_.emplace_back(std::make_shared<AlignedAudioArrayBuffer<Alignment>>(*channel));\n    }\n  }\n\n  AlignedAudioBuffer(AlignedAudioBuffer &&other) noexcept\n      : channels_(std::move(other.channels_)),\n        numberOfChannels_(std::exchange(other.numberOfChannels_, 0)),\n        sampleRate_(std::exchange(other.sampleRate_, 0.0f)),\n        size_(std::exchange(other.size_, 0)) {}\n\n  AlignedAudioBuffer &operator=(const AlignedAudioBuffer &other) {\n    if (this != &other) {\n      sampleRate_ = other.sampleRate_;\n\n      if (numberOfChannels_ != other.numberOfChannels_) {\n        numberOfChannels_ = other.numberOfChannels_;\n        size_ = other.size_;\n        channels_.clear();\n        channels_.reserve(numberOfChannels_);\n\n        for (const auto &channel : other.channels_) {\n          channels_.emplace_back(std::make_shared<AlignedAudioArrayBuffer<Alignment>>(*channel));\n        }\n\n        return *this;\n      }\n\n      if (size_ != other.size_) {\n        size_ = other.size_;\n      }\n\n      for (size_t i = 0; i < numberOfChannels_; ++i) {\n        *channels_[i] = *other.channels_[i];\n      }\n    }\n\n    return *this;\n  }\n\n  AlignedAudioBuffer &operator=(AlignedAudioBuffer &&other) noexcept {\n    if (this != &other) {\n      channels_ = std::move(other.channels_);\n      numberOfChannels_ = std::exchange(other.numberOfChannels_, 0);\n      sampleRate_ = std::exchange(other.sampleRate_, 0.0f);\n      size_ = std::exchange(other.size_, 0);\n    }\n    return *this;\n  }\n\n  ~AlignedAudioBuffer() = default;\n\n  [[nodiscard]] size_t getNumberOfChannels() const noexcept {\n    return numberOfChannels_;\n  }\n  [[nodiscard]] float getSampleRate() const noexcept {\n    return sampleRate_;\n  }\n  [[nodiscard]] size_t getSize() const noexcept {\n    return size_;\n  }\n  [[nodiscard]] double getDuration() const noexcept {\n    return static_cast<double>(size_) / static_cast<double>(getSampleRate());\n  }\n\n  /// @brief Get the channel array for a specific channel index.\n  /// @return Pointer to the AlignedAudioArray for the specified channel - not owning.\n  [[nodiscard]] AlignedAudioArray<Alignment> *getChannel(size_t index) const {\n    return channels_[index].get();\n  }\n\n  /// @brief Get the channel array for a specific channel type.\n  /// @return Pointer to the AlignedAudioArray for the specified channel type - not owning.\n  [[nodiscard]] AlignedAudioArray<Alignment> *getChannelByType(int channelType) const {\n    auto it = kChannelLayouts.find(getNumberOfChannels());\n    if (it == kChannelLayouts.end()) {\n      return nullptr;\n    }\n    const auto &channelOrder = it->second;\n    for (size_t i = 0; i < channelOrder.size(); ++i) {\n      if (channelOrder[i] == channelType) {\n        return getChannel(i);\n      }\n    }\n    return nullptr;\n  }\n\n  /// @brief Get a copy of shared pointer to the channel buffer for a specific index.\n  [[nodiscard]] std::shared_ptr<AlignedAudioArrayBuffer<Alignment>> getSharedChannel(\n      size_t index) const {\n    return channels_[index];\n  }\n\n  AlignedAudioArray<Alignment> &operator[](size_t index) {\n    return *channels_[index];\n  }\n  const AlignedAudioArray<Alignment> &operator[](size_t index) const {\n    return *channels_[index];\n  }\n\n  void zero() {\n    zero(0, getSize());\n  }\n\n  void zero(size_t start, size_t length) {\n    for (auto it = channels_.begin(); it != channels_.end(); it += 1) {\n      it->get()->zero(start, length);\n    }\n  }\n\n  /// @brief Sums audio data from a source buffer into this buffer.\n  /// @note Handles up-mixing and down-mixing based on channel counts.\n  template <size_t OtherAlignment>\n  void sum(\n      const AlignedAudioBuffer<OtherAlignment> &source,\n      ChannelInterpretation interpretation = ChannelInterpretation::SPEAKERS) {\n    sum(source, 0, 0, getSize(), interpretation);\n  }\n\n  template <size_t OtherAlignment>\n  void sum(\n      const AlignedAudioBuffer<OtherAlignment> &source,\n      size_t sourceStart,\n      size_t destinationStart,\n      size_t length,\n      ChannelInterpretation interpretation = ChannelInterpretation::SPEAKERS) {\n    if constexpr (OtherAlignment == Alignment) {\n      if (&source == this) {\n        return;\n      }\n    }\n\n    auto numberOfSourceChannels = source.getNumberOfChannels();\n    auto numberOfChannels = getNumberOfChannels();\n\n    if (interpretation == ChannelInterpretation::DISCRETE) {\n      discreteSum(source, sourceStart, destinationStart, length);\n      return;\n    }\n\n    if (numberOfSourceChannels < numberOfChannels) {\n      sumByUpMixing(source, sourceStart, destinationStart, length);\n      return;\n    }\n\n    if (numberOfSourceChannels > numberOfChannels) {\n      sumByDownMixing(source, sourceStart, destinationStart, length);\n      return;\n    }\n\n    for (size_t i = 0; i < getNumberOfChannels(); ++i) {\n      channels_[i]->sum(*source.channels_[i], sourceStart, destinationStart, length);\n    }\n  }\n\n  /// @brief Copies audio data from a source buffer into this buffer.\n  /// @note Handles up-mixing and down-mixing based on channel counts.\n  template <size_t OtherAlignment>\n  void copy(\n      const AlignedAudioBuffer<OtherAlignment> &source) { // NOLINT(build/include_what_you_use)\n    copy(source, 0, 0, getSize());\n  }\n\n  template <size_t OtherAlignment>\n  void copy(\n      const AlignedAudioBuffer<OtherAlignment> &source,\n      size_t sourceStart,\n      size_t destinationStart,\n      size_t length) { // NOLINT(build/include_what_you_use)\n    if constexpr (OtherAlignment == Alignment) {\n      if (&source == this) {\n        return;\n      }\n    }\n\n    if (source.getNumberOfChannels() == getNumberOfChannels()) {\n      for (size_t i = 0; i < getNumberOfChannels(); ++i) {\n        channels_[i]->copy(*source.channels_[i], sourceStart, destinationStart, length);\n      }\n      return;\n    }\n\n    // zero + sum is equivalent to copy, but takes care of up/down-mixing.\n    zero(destinationStart, length);\n    sum(source, sourceStart, destinationStart, length);\n  }\n\n  /// @brief Deinterleave audio data from an interleaved source buffer.\n  void deinterleaveFrom(const float *source, size_t frames) {\n    if (frames == 0) {\n      return;\n    }\n\n    if (numberOfChannels_ == 1) {\n      channels_[0]->copy(source, 0, 0, frames);\n      return;\n    }\n\n    if (numberOfChannels_ == 2) {\n      dsp::deinterleaveStereo(source, channels_[0]->begin(), channels_[1]->begin(), frames);\n      return;\n    }\n\n    float *channelsPtrs[MAX_CHANNEL_COUNT];\n    for (size_t i = 0; i < numberOfChannels_; ++i) {\n      channelsPtrs[i] = channels_[i]->begin();\n    }\n\n    for (size_t blockStart = 0; blockStart < frames; blockStart += kBlockSize) {\n      size_t blockEnd = std::min(blockStart + kBlockSize, frames);\n      for (size_t i = blockStart; i < blockEnd; ++i) {\n        const float *frameSource = source + (i * numberOfChannels_);\n        for (size_t ch = 0; ch < numberOfChannels_; ++ch) {\n          channelsPtrs[ch][i] = frameSource[ch];\n        }\n      }\n    }\n  }\n\n  /// @brief Interleave audio data from this buffer into a destination buffer.\n  void interleaveTo(float *destination, size_t frames) const {\n    if (frames == 0) {\n      return;\n    }\n\n    if (numberOfChannels_ == 1) {\n      channels_[0]->copyTo(destination, 0, 0, frames);\n      return;\n    }\n\n    if (numberOfChannels_ == 2) {\n      dsp::interleaveStereo(channels_[0]->begin(), channels_[1]->begin(), destination, frames);\n      return;\n    }\n\n    float *channelsPtrs[MAX_CHANNEL_COUNT];\n    for (size_t i = 0; i < numberOfChannels_; ++i) {\n      channelsPtrs[i] = channels_[i]->begin();\n    }\n\n    for (size_t blockStart = 0; blockStart < frames; blockStart += kBlockSize) {\n      size_t blockEnd = std::min(blockStart + kBlockSize, frames);\n      for (size_t i = blockStart; i < blockEnd; ++i) {\n        float *frameDest = destination + (i * numberOfChannels_);\n        for (size_t ch = 0; ch < numberOfChannels_; ++ch) {\n          frameDest[ch] = channelsPtrs[ch][i];\n        }\n      }\n    }\n  }\n\n  void normalize() {\n    float maxAbs = maxAbsValue();\n    if (maxAbs == 0.0f || maxAbs == 1.0f) {\n      return;\n    }\n    scale(1.0f / maxAbs);\n  }\n\n  void scale(float value) {\n    for (auto &channel : channels_) {\n      channel->scale(value);\n    }\n  }\n\n  [[nodiscard]] float maxAbsValue() const {\n    float maxAbs = 1.0f;\n    for (const auto &channel : channels_) {\n      maxAbs = std::max(maxAbs, channel->getMaxAbsValue());\n    }\n    return maxAbs;\n  }\n\n private:\n  std::vector<std::shared_ptr<AlignedAudioArrayBuffer<Alignment>>> channels_;\n\n  size_t numberOfChannels_ = 0;\n  float sampleRate_ = 0.0f;\n  size_t size_ = 0;\n\n  static constexpr float kSqrtHalf = 0.7071067811865476f; // sqrtf(0.5f)\n  static constexpr int kBlockSize = 64;\n\n  inline static const std::unordered_map<size_t, std::vector<int>> kChannelLayouts = {\n      {1, {ChannelMono}},\n      {2, {ChannelLeft, ChannelRight}},\n      {4, {ChannelLeft, ChannelRight, ChannelSurroundLeft, ChannelSurroundRight}},\n      {5, {ChannelLeft, ChannelRight, ChannelCenter, ChannelSurroundLeft, ChannelSurroundRight}},\n      {6,\n       {ChannelLeft,\n        ChannelRight,\n        ChannelCenter,\n        ChannelLFE,\n        ChannelSurroundLeft,\n        ChannelSurroundRight}}};\n\n  template <size_t OtherAlignment>\n  void discreteSum(\n      const AlignedAudioBuffer<OtherAlignment> &source,\n      size_t sourceStart,\n      size_t destinationStart,\n      size_t length) const {\n    auto numberOfChannels = std::min(getNumberOfChannels(), source.getNumberOfChannels());\n    for (size_t i = 0; i < numberOfChannels; i++) {\n      channels_[i]->sum(*source.getChannel(i), sourceStart, destinationStart, length);\n    }\n  }\n\n  template <size_t OtherAlignment>\n  void sumByUpMixing(\n      const AlignedAudioBuffer<OtherAlignment> &source,\n      size_t sourceStart,\n      size_t destinationStart,\n      size_t length) {\n    auto numberOfSourceChannels = source.getNumberOfChannels();\n    auto numberOfChannels = getNumberOfChannels();\n\n    auto mix = [&](int srcType, int dstType) {\n      getChannelByType(dstType)->sum(\n          *source.getChannelByType(srcType), sourceStart, destinationStart, length);\n    };\n\n    // Mono to stereo (1 -> 2, 4)\n    if (numberOfSourceChannels == 1 && (numberOfChannels == 2 || numberOfChannels == 4)) {\n      mix(ChannelMono, ChannelLeft);\n      mix(ChannelMono, ChannelRight);\n    } else if (numberOfSourceChannels == 1 && numberOfChannels == 6) {\n      // Mono to 5.1 (1 -> 6)\n      mix(ChannelMono, ChannelCenter);\n    } else if (numberOfSourceChannels == 2 && (numberOfChannels == 4 || numberOfChannels == 6)) {\n      // Stereo to 4 or 5.1 (2 -> 4, 6)\n      mix(ChannelLeft, ChannelLeft);\n      mix(ChannelRight, ChannelRight);\n    } else if (numberOfSourceChannels == 4 && numberOfChannels == 6) {\n      // Stereo 4 to 5.1 (4 -> 6)\n      mix(ChannelLeft, ChannelLeft);\n      mix(ChannelRight, ChannelRight);\n      mix(ChannelSurroundLeft, ChannelSurroundLeft);\n      mix(ChannelSurroundRight, ChannelSurroundRight);\n    } else {\n      discreteSum(source, sourceStart, destinationStart, length);\n    }\n  }\n\n  template <size_t OtherAlignment>\n  void sumByDownMixing(\n      const AlignedAudioBuffer<OtherAlignment> &source,\n      size_t sourceStart,\n      size_t destinationStart,\n      size_t length) {\n    auto numberOfSourceChannels = source.getNumberOfChannels();\n    auto numberOfChannels = getNumberOfChannels();\n\n    auto mix = [&](int srcType, int dstType, float gain = 1.0f) {\n      getChannelByType(dstType)->sum(\n          *source.getChannelByType(srcType), sourceStart, destinationStart, length, gain);\n    };\n\n    // Stereo to mono (2 -> 1): output += 0.5 * (input.L + input.R)\n    if (numberOfSourceChannels == 2 && numberOfChannels == 1) {\n      mix(ChannelLeft, ChannelMono, 0.5f);\n      mix(ChannelRight, ChannelMono, 0.5f);\n    } else if (numberOfSourceChannels == 4 && numberOfChannels == 1) {\n      // Stereo 4 to mono (4 -> 1): output += 0.25 * (L + R + SL + SR)\n      mix(ChannelLeft, ChannelMono, 0.25f);\n      mix(ChannelRight, ChannelMono, 0.25f);\n      mix(ChannelSurroundLeft, ChannelMono, 0.25f);\n      mix(ChannelSurroundRight, ChannelMono, 0.25f);\n    } else if (numberOfSourceChannels == 6 && numberOfChannels == 1) {\n      // 5.1 to mono (6 -> 1): output += sqrt(0.5)*(L+R) + C + 0.5*(SL+SR)\n      mix(ChannelLeft, ChannelMono, kSqrtHalf);\n      mix(ChannelRight, ChannelMono, kSqrtHalf);\n      mix(ChannelCenter, ChannelMono);\n      mix(ChannelSurroundLeft, ChannelMono, 0.5f);\n      mix(ChannelSurroundRight, ChannelMono, 0.5f);\n    } else if (numberOfSourceChannels == 4 && numberOfChannels == 2) {\n      // Stereo 4 to stereo 2 (4 -> 2): L += 0.5*(L+SL), R += 0.5*(R+SR)\n      mix(ChannelLeft, ChannelLeft, 0.5f);\n      mix(ChannelSurroundLeft, ChannelLeft, 0.5f);\n      mix(ChannelRight, ChannelRight, 0.5f);\n      mix(ChannelSurroundRight, ChannelRight, 0.5f);\n    } else if (numberOfSourceChannels == 6 && numberOfChannels == 2) {\n      // 5.1 to stereo (6 -> 2): L += L + sqrt(0.5)*(C+SL), R += R + sqrt(0.5)*(C+SR)\n      mix(ChannelLeft, ChannelLeft);\n      mix(ChannelCenter, ChannelLeft, kSqrtHalf);\n      mix(ChannelSurroundLeft, ChannelLeft, kSqrtHalf);\n      mix(ChannelRight, ChannelRight);\n      mix(ChannelCenter, ChannelRight, kSqrtHalf);\n      mix(ChannelSurroundRight, ChannelRight, kSqrtHalf);\n    } else if (numberOfSourceChannels == 6 && numberOfChannels == 4) {\n      // 5.1 to stereo 4 (6 -> 4): L += L + sqrt(0.5)*C, R += R + sqrt(0.5)*C, SL += SL, SR += SR\n      mix(ChannelLeft, ChannelLeft);\n      mix(ChannelCenter, ChannelLeft, kSqrtHalf);\n      mix(ChannelRight, ChannelRight);\n      mix(ChannelCenter, ChannelRight, kSqrtHalf);\n      mix(ChannelSurroundLeft, ChannelSurroundLeft);\n      mix(ChannelSurroundRight, ChannelSurroundRight);\n    } else {\n      discreteSum(source, sourceStart, destinationStart, length);\n    }\n  }\n};\n\nusing AudioBuffer = AlignedAudioBuffer<alignof(std::max_align_t)>;\nusing DSPAudioBuffer = AlignedAudioBuffer<DSP_ALIGNMENT>;\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/AudioFileProperties.cpp",
    "content": "#include <audioapi/utils/AudioFileProperties.h>\n\n#include <audioapi/jsi/JsiHostObject.h>\n#include <jsi/jsi.h>\n#include <memory>\n#include <string>\n\nnamespace audioapi {\n\nAudioFileProperties::AudioFileProperties(\n    FileDirectory directory,\n    const std::string &subDirectory,\n    const std::string &fileNamePrefix,\n    int channelCount,\n    size_t rotateIntervalBytes,\n    Format format,\n    float sampleRate,\n    size_t bitRate,\n    BitDepth bitDepth,\n    int flacCompressionLevel,\n    int androidFlushIntervalMs,\n    IOSAudioQuality iosAudioQuality)\n    : directory(directory),\n      subDirectory(subDirectory),\n      fileNamePrefix(fileNamePrefix),\n      channelCount(channelCount),\n      rotateIntervalBytes(rotateIntervalBytes),\n      format(format),\n      sampleRate(sampleRate),\n      bitRate(bitRate),\n      bitDepth(bitDepth),\n      flacCompressionLevel(flacCompressionLevel),\n      androidFlushIntervalMs(androidFlushIntervalMs),\n      iosAudioQuality(iosAudioQuality) {}\n\nstd::shared_ptr<AudioFileProperties> AudioFileProperties::CreateFromJSIValue(\n    facebook::jsi::Runtime &runtime,\n    const facebook::jsi::Value &value) {\n  auto options = value.getObject(runtime);\n\n  FileDirectory directory =\n      static_cast<FileDirectory>(options.getProperty(runtime, \"directory\").getNumber());\n\n  std::string subDirectory =\n      options.getProperty(runtime, \"subDirectory\").asString(runtime).utf8(runtime);\n\n  std::string fileNamePrefix =\n      options.getProperty(runtime, \"fileNamePrefix\").asString(runtime).utf8(runtime);\n\n  int channelCount = static_cast<int>(options.getProperty(runtime, \"channelCount\").getNumber());\n\n  size_t rotateIntervalBytes =\n      static_cast<size_t>(options.getProperty(runtime, \"rotateIntervalBytes\").getNumber());\n\n  Format format = static_cast<Format>(options.getProperty(runtime, \"format\").getNumber());\n\n  int androidFlushIntervalMs =\n      static_cast<int>(options.getProperty(runtime, \"androidFlushIntervalMs\").getNumber());\n\n  auto presetOptions = options.getProperty(runtime, \"preset\").getObject(runtime);\n\n  float sampleRate =\n      static_cast<float>(presetOptions.getProperty(runtime, \"sampleRate\").getNumber());\n\n  size_t bitRate = static_cast<size_t>(presetOptions.getProperty(runtime, \"bitRate\").getNumber());\n\n  BitDepth bitDepth =\n      static_cast<BitDepth>(presetOptions.getProperty(runtime, \"bitDepth\").getNumber());\n\n  int flacCompressionLevel =\n      static_cast<int>(presetOptions.getProperty(runtime, \"flacCompressionLevel\").getNumber());\n\n  IOSAudioQuality iosAudioQuality =\n      static_cast<IOSAudioQuality>(presetOptions.getProperty(runtime, \"iosQuality\").getNumber());\n\n  return std::make_shared<AudioFileProperties>(\n      directory,\n      subDirectory,\n      fileNamePrefix,\n      channelCount,\n      rotateIntervalBytes,\n      format,\n      sampleRate,\n      bitRate,\n      bitDepth,\n      flacCompressionLevel,\n      androidFlushIntervalMs,\n      iosAudioQuality);\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/AudioFileProperties.h",
    "content": "#pragma once\n\n#include <cstddef>\n#include <memory>\n#include <string>\n\nnamespace facebook {\nnamespace jsi {\nclass Runtime;\nclass Value;\n} // namespace jsi\n} // namespace facebook\n\nnamespace audioapi {\n\nclass AudioFileProperties {\n public:\n  enum class FileDirectory {\n    Document = 0,\n    Cache = 1,\n  };\n\n  enum class Format {\n    WAV = 0,\n    CAF = 1,\n    M4A = 2,\n    FLAC = 3,\n  };\n\n  enum class IOSAudioQuality {\n    Min = 0,\n    Low = 1,\n    Medium = 2,\n    High = 3,\n    Max = 4,\n  };\n\n  enum class BitDepth {\n    Bit16 = 0,\n    Bit24 = 1,\n    Bit32 = 2,\n  };\n\n  AudioFileProperties(\n      FileDirectory directory,\n      const std::string &subDirectory,\n      const std::string &fileNamePrefix,\n      int channelCount,\n      size_t rotateIntervalBytes,\n      Format format,\n      float sampleRate,\n      size_t bitRate,\n      BitDepth bitDepth,\n      int flacCompressionLevel,\n      int androidFlushIntervalMs,\n      IOSAudioQuality iosAudioQuality);\n\n  static std::shared_ptr<AudioFileProperties> CreateFromJSIValue(\n      facebook::jsi::Runtime &runtime,\n      const facebook::jsi::Value &value);\n\n  FileDirectory directory;\n  std::string subDirectory;\n  std::string fileNamePrefix;\n  int channelCount;\n  size_t rotateIntervalBytes;\n  Format format;\n  float sampleRate;\n  size_t bitRate;\n  BitDepth bitDepth;\n  int flacCompressionLevel;\n  int androidFlushIntervalMs;\n  IOSAudioQuality iosAudioQuality;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/Benchmark.hpp",
    "content": "#pragma once\n\n// Benchmarking utilities\n#include <chrono>\n#include <cstdio>\n#include <string>\n#include <unordered_map>\n#include <utility>\n\n#ifdef ANDROID\n#include <android/log.h>\n#endif\n\nnamespace audioapi::benchmarks {\n\n/// @brief Gets the execution time of a function\n/// @tparam Func The type of the function to benchmark\n/// @param func The function to benchmark\n/// @return The duration of the function execution in nanoseconds\n/// @note This function is safe to use across threads\ntemplate <typename Func>\ndouble getExecutionTime(Func &&func) {\n  auto start = std::chrono::high_resolution_clock::now();\n  std::forward<Func>(func)();\n  auto end = std::chrono::high_resolution_clock::now();\n  return std::chrono::duration_cast<std::chrono::nanoseconds>(end - start).count();\n}\n\n/// @brief Logs the average execution time of a function\n/// @tparam Func The type of the function to benchmark\n/// @param msg The message to log\n/// @param func The function to benchmark\n/// @return The duration of the function execution in nanoseconds\n/// @note This function should not be used in production\n/// @note This function is not thread-safe and should be used preferably once in a codebase when you need to measure performance\ntemplate <typename Func>\ndouble logAvgExecutionTime(const std::string &msg, Func &&func) {\n  double duration = getExecutionTime(std::forward<Func>(func));\n\n  static std::unordered_map<std::string, double> durationsSum;\n  static std::unordered_map<std::string, int> durationsCount;\n\n  // Ensure initialization for first time\n  if (durationsSum.find(msg) == durationsSum.end()) {\n    durationsSum[msg] = 0.0;\n    durationsCount[msg] = 0;\n  }\n\n  durationsSum[msg] += duration;\n  durationsCount[msg]++;\n\n  int64_t avgDuration = static_cast<int64_t>(durationsSum[msg] / durationsCount[msg]);\n\n#ifdef ANDROID\n  __android_log_print(ANDROID_LOG_INFO, \"AudioAPI\", \"%s: %lld ns\", msg.c_str(), avgDuration);\n#else\n  printf(\"%s: %lld ns\\n\", msg.c_str(), avgDuration);\n#endif\n  return duration;\n}\n} // namespace audioapi::benchmarks\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/BoundedPriorityQueue.hpp",
    "content": "#pragma once\n\n#include <audioapi/utils/Macros.h>\n#include <array>\n#include <cstddef>\n#include <functional>\n#include <memory_resource>\n#include <set>\n#include <utility>\n\nnamespace audioapi {\n\n/// @brief A bounded priority queue with fixed capacity backed by a static pool allocator.\n/// Elements are kept in ascending sorted order (smallest element at front).\n/// All operations avoid heap allocation. Uses std::multiset under the hood\n// to maintain sorted order and provide efficient insertion and removal.\n/// @tparam T The type of elements stored. Must be move-constructible.\n/// @tparam Capacity The maximum number of elements.\n/// @tparam Compare Comparator type. Defaults to std::less<T> (smallest element at front).\n/// @note Stable: for equal keys, insertion order is preserved by std::multiset.\n/// @note This implementation is NOT thread-safe.\ntemplate <typename T, size_t Capacity, typename Compare = std::less<T>>\nclass BoundedPriorityQueue {\n private:\n  using SetType = std::pmr::multiset<T, Compare>;\n\n  static constexpr size_t kNodeOverhead = 96;\n  static constexpr size_t kNodeSize = sizeof(T) + kNodeOverhead;\n  // Extra headroom for pool resource bookkeeping structures.\n  static constexpr size_t kBufferSize = Capacity * kNodeSize + 256;\n\n  // Members must be declared in this order: buffer_ → mono_ → pool_ → set_.\n  alignas(std::max_align_t) std::array<std::byte, kBufferSize> buffer_;\n  std::pmr::monotonic_buffer_resource mono_{\n      buffer_.data(),\n      sizeof(buffer_),\n      std::pmr::null_memory_resource()};\n  std::pmr::unsynchronized_pool_resource pool_{\n      std::pmr::pool_options{.max_blocks_per_chunk = 1, .largest_required_pool_block = 0},\n      &mono_};\n  SetType set_{Compare{}, &pool_};\n\n public:\n  explicit BoundedPriorityQueue() = default;\n  ~BoundedPriorityQueue() = default;\n  DELETE_COPY_AND_MOVE(BoundedPriorityQueue);\n\n  /// @brief Insert a value in sorted order. Amortized O(1) when inserting the largest element\n  /// (common case: events scheduled in chronological order), O(log n) otherwise.\n  /// @return True if inserted, false if full.\n  template <typename U>\n  bool push(U &&value) {\n    if (isFull()) [[unlikely]] {\n      return false;\n    }\n    // Hint with end(): amortized O(1) when the new event has the largest key (in-order scheduling).\n    set_.insert(set_.end(), std::forward<U>(value));\n    return true;\n  }\n\n  /// @brief Remove and return the smallest element (front).\n  /// @return True if successful, false if empty.\n  bool pop(T &out) {\n    if (isEmpty()) [[unlikely]] {\n      return false;\n    }\n    auto node = set_.extract(set_.begin());\n    out = std::move(node.value());\n    return true;\n  }\n\n  /// @brief Remove the smallest element (front) without retrieving it.\n  /// @return True if successful, false if empty.\n  bool pop() {\n    if (isEmpty()) [[unlikely]] {\n      return false;\n    }\n    set_.erase(set_.begin());\n    return true;\n  }\n\n  /// @brief Peek at the smallest element (front).\n  [[nodiscard]] const T &peekFront() const noexcept {\n    return *set_.begin();\n  }\n\n  /// @brief Peek at the largest element (back).\n  [[nodiscard]] const T &peekBack() const noexcept {\n    return *std::prev(set_.end());\n  }\n\n  [[nodiscard]] bool isEmpty() const noexcept {\n    return set_.empty();\n  }\n\n  [[nodiscard]] bool isFull() const noexcept {\n    return set_.size() >= Capacity;\n  }\n\n  [[nodiscard]] size_t size() const noexcept {\n    return set_.size();\n  }\n\n  [[nodiscard]] SetType::const_iterator begin() const noexcept {\n    return set_.begin();\n  }\n\n  [[nodiscard]] SetType::const_iterator end() const noexcept {\n    return set_.end();\n  }\n\n  /// @brief Find the first element with key >= the given key.\n  /// @return An iterator to the first element with key >= the given key, or end() if no such element exists.\n  template <typename Key>\n  [[nodiscard]] SetType::iterator lowerBound(const Key &key) noexcept {\n    return set_.lower_bound(key);\n  }\n\n  /// @brief Find the first element with key > the given key.\n  /// @note For events with duplicate keys, upperBound returns the position after the last duplicate.\n  /// @return An iterator to the first element with key > the given key, or end() if no such element exists.\n  template <typename Key>\n  [[nodiscard]] SetType::iterator upperBound(const Key &key) noexcept {\n    return set_.upper_bound(key);\n  }\n\n  /// @brief Erase all elements in the range [first, last).\n  void erase(SetType::iterator first, SetType::iterator last) noexcept {\n    set_.erase(first, last);\n  }\n\n  /// @brief Extract a node at the given iterator position.\n  /// @note The extracted node can be modified and reinserted without reallocation.\n  /// @param it An iterator pointing to the element to extract. Must be a valid iterator in the set.\n  /// @return A node handle owning the extracted element.\n  [[nodiscard]] SetType::node_type extract(SetType::iterator it) noexcept {\n    return set_.extract(it);\n  }\n\n  /// @brief Reinsert an extracted node with a hint.\n  /// @note Use std::next(original_it) as hint when the sort key has not changed.\n  /// @param hint An iterator pointing to the position before which the node should be reinserted. Must be a valid iterator in the set or end().\n  /// @param node A node handle owning the element to reinsert. Must have been extracted from this set and not yet reinserted.\n  void insert(SetType::iterator hint, SetType::node_type &&node) noexcept {\n    set_.insert(hint, std::move(node));\n  }\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/CircularArray.hpp",
    "content": "#pragma once\n\n#include <audioapi/utils/AudioArray.hpp>\n#include <concepts>\n\nnamespace audioapi {\n\ntemplate <typename T>\nconcept AudioArrayBase = requires(T a, const float *c_data, float *data, size_t size) {\n  { a.begin() } -> std::same_as<float *>;\n  { a.getSize() } -> std::same_as<size_t>;\n  a.copy(c_data, size, size, size);\n  a.copyTo(data, size, size, size);\n} && std::constructible_from<T, size_t>;\n\ntemplate <AudioArrayBase Base>\nclass CircularArray : public Base {\n public:\n  explicit CircularArray(size_t size) : Base(size) {}\n\n  CircularArray(const CircularArray &other) = default;\n  CircularArray(CircularArray &&other) noexcept = default;\n  CircularArray &operator=(const CircularArray &other) = default;\n  CircularArray &operator=(CircularArray &&other) noexcept = default;\n  ~CircularArray() = default;\n\n  void push_back(const Base &data, size_t size, bool skipAvailableSpaceCheck = false) {\n    push_back(data.begin(), size, skipAvailableSpaceCheck);\n  }\n\n  void push_back(const float *data, size_t size, bool skipAvailableSpaceCheck = false) {\n    if (size > this->size_) {\n      throw std::overflow_error(\"size exceeds CircularArray size_\");\n    }\n\n    if (size > getAvailableSpace() && !skipAvailableSpaceCheck) {\n      throw std::overflow_error(\"not enough space in CircularArray\");\n    }\n\n    if (vWriteIndex_ + size > this->size_) {\n      auto partSize = this->size_ - vWriteIndex_;\n      this->copy(data, 0, vWriteIndex_, partSize);    // NOLINT(build/include_what_you_use)\n      this->copy(data, partSize, 0, size - partSize); // NOLINT(build/include_what_you_use)\n    } else {\n      this->copy(data, 0, vWriteIndex_, size); // NOLINT(build/include_what_you_use)\n    }\n\n    vWriteIndex_ =\n        vWriteIndex_ + size > this->size_ ? vWriteIndex_ + size - this->size_ : vWriteIndex_ + size;\n  }\n\n  void pop_front(Base &data, size_t size, bool skipAvailableDataCheck = false) {\n    pop_front(data.begin(), size, skipAvailableDataCheck);\n  }\n\n  void pop_front(float *data, size_t size, bool skipAvailableDataCheck = false) {\n    if (size > this->size_) {\n      throw std::overflow_error(\"size exceeds CircularArray size_\");\n    }\n\n    if (size > getNumberOfAvailableFrames() && !skipAvailableDataCheck) {\n      throw std::overflow_error(\"not enough data in CircularArray\");\n    }\n\n    if (vReadIndex_ + size > this->size_) {\n      auto partSize = this->size_ - vReadIndex_;\n      this->copyTo(data, vReadIndex_, 0, partSize);\n      this->copyTo(data, 0, partSize, size - partSize);\n    } else {\n      this->copyTo(data, vReadIndex_, 0, size);\n    }\n\n    vReadIndex_ =\n        vReadIndex_ + size > this->size_ ? vReadIndex_ + size - this->size_ : vReadIndex_ + size;\n  }\n\n  void pop_back(Base &data, size_t size, size_t offset = 0, bool skipAvailableDataCheck = false) {\n    pop_back(data.begin(), size, offset, skipAvailableDataCheck);\n  }\n\n  void pop_back(float *data, size_t size, size_t offset = 0, bool skipAvailableDataCheck = false) {\n    if (size > this->size_) {\n      throw std::overflow_error(\"size exceeds CircularArray size_\");\n    }\n\n    if (size + offset > getNumberOfAvailableFrames() && !skipAvailableDataCheck) {\n      throw std::overflow_error(\"not enough data in CircularArray\");\n    }\n\n    if (vWriteIndex_ <= offset) {\n      this->copyTo(data, this->size_ - (offset - vWriteIndex_) - size, 0, size);\n    } else if (vWriteIndex_ <= size + offset) {\n      auto partSize = size + offset - vWriteIndex_;\n      this->copyTo(data, this->size_ - partSize, 0, partSize);\n      this->copyTo(data, 0, partSize, size - partSize);\n    } else {\n      this->copyTo(data, vWriteIndex_ - size - offset, 0, size);\n    }\n\n    vReadIndex_ = vWriteIndex_ < offset ? size + vWriteIndex_ - offset : vWriteIndex_ - offset;\n  }\n\n  [[nodiscard]] size_t getNumberOfAvailableFrames() const {\n    return vWriteIndex_ >= vReadIndex_ ? vWriteIndex_ - vReadIndex_\n                                       : this->size_ - vReadIndex_ + vWriteIndex_;\n  }\n\n private:\n  size_t vWriteIndex_ = 0;\n  size_t vReadIndex_ = 0;\n\n  [[nodiscard]] size_t getAvailableSpace() const {\n    return this->size_ - getNumberOfAvailableFrames();\n  }\n};\n\nusing CircularAudioArray = CircularArray<AudioArray>;\nusing CircularDSPAudioArray = CircularArray<DSPAudioArray>;\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/CircularOverflowableAudioArray.cpp",
    "content": "#include <audioapi/utils/CircularOverflowableAudioArray.h>\n#include <algorithm>\n#include <type_traits>\n\nnamespace audioapi {\n\nCircularOverflowableAudioArray::CircularOverflowableAudioArray(size_t size) noexcept(\n    std::is_nothrow_constructible<AudioArray, size_t>::value)\n    : AudioArray(size) {}\n\nvoid CircularOverflowableAudioArray::write(const AudioArray &data, const size_t size) {\n  write(data.begin(), size);\n}\n\nvoid CircularOverflowableAudioArray::write(const float *data, size_t size) {\n  size_t writeIndex = vWriteIndex_.load(std::memory_order_relaxed);\n\n  if (size > size_) {\n    return; // Ignore write if size exceeds buffer size\n  }\n\n  /// Advances the read index if there is not enough space\n  readLock_.lock();\n  size_t availableSpace = (size_ + vReadIndex_ - writeIndex - 1) % size_;\n  if (size > availableSpace) {\n    vReadIndex_ = (writeIndex + size + 1) % size_;\n  }\n  readLock_.unlock();\n\n  size_t partSize = size_ - writeIndex;\n  if (size > partSize) {\n    copy(data, 0, writeIndex, partSize);\n    copy(data, partSize, 0, size - partSize);\n  } else {\n    copy(data, 0, writeIndex, size);\n  }\n  vWriteIndex_.store((writeIndex + size) % size_, std::memory_order_relaxed);\n}\n\nsize_t CircularOverflowableAudioArray::read(AudioArray &data, size_t size) const {\n  return read(data.begin(), size);\n}\n\nsize_t CircularOverflowableAudioArray::read(float *data, size_t size) const {\n  readLock_.lock();\n  size_t availableSpace = getAvailableSpace();\n  size_t readSize = std::min(size, availableSpace);\n\n  size_t partSize = size_ - vReadIndex_;\n  if (readSize > partSize) {\n    copyTo(data, vReadIndex_, 0, partSize);\n    copyTo(data, 0, partSize, readSize - partSize);\n  } else {\n    copyTo(data, vReadIndex_, 0, readSize);\n  }\n  vReadIndex_ = (vReadIndex_ + readSize) % size_;\n  readLock_.unlock();\n  return readSize;\n}\n\nsize_t CircularOverflowableAudioArray::getAvailableSpace() const {\n  return (size_ + vWriteIndex_.load(std::memory_order_relaxed) - vReadIndex_) % size_;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/CircularOverflowableAudioArray.h",
    "content": "\n#pragma once\n\n#include <audioapi/utils/AudioArray.hpp>\n#include <atomic>\n#include <mutex>\n\nnamespace audioapi {\n\n/// @brief CircularOverflowableAudioArray is a circular audio array that allows for overflow.\n/// It provides a way to push data safely from one thread while reading from another.\n/// It is designed to handle cases where the write index may be updated while the read index is being read.\n/// It has read precedence, meaning that read locks are acquired before write locks.\n/// @note read can fail when there are a lot of writes and buffer is small.\nclass CircularOverflowableAudioArray : public AudioArray {\n public:\n  explicit CircularOverflowableAudioArray(size_t size);\n  CircularOverflowableAudioArray(const CircularOverflowableAudioArray &other) = delete;\n  ~CircularOverflowableAudioArray() = default;\n\n  /// @brief Writes data to the circular buffer.\n  /// @note Might wait for read operation to finish if it is in progress. It ignores writes that exceed the buffer size.\n  /// @param data Reference to input AudioArray.\n  /// @param size Number of frames to write.\n  void write(const AudioArray &data, size_t size);\n\n  /// @brief Writes data to the circular buffer.\n  /// @note Might wait for read operation to finish if it is in progress. It ignores writes that exceed the buffer size.\n  /// @param data Pointer to the input buffer.\n  /// @param size Number of frames to write.\n  void write(const float *data, size_t size);\n\n  /// @brief Reads data from the circular buffer.\n  /// @param data Reference to output AudioArray.\n  /// @param size Number of frames to read.\n  /// @return The number of frames actually read.\n  size_t read(AudioArray &data, size_t size) const;\n\n  /// @brief Reads data from the circular buffer.\n  /// @param data Pointer to the output buffer.\n  /// @param size Number of frames to read.\n  /// @return The number of frames actually read.\n  size_t read(float *data, size_t size) const;\n\n private:\n  std::atomic<size_t> vWriteIndex_ = {0};\n  mutable size_t vReadIndex_ = 0; // it is only used after acquiring readLock_\n  mutable std::mutex readLock_;\n\n  [[nodiscard]] size_t getAvailableSpace() const;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/CrossThreadEventScheduler.hpp",
    "content": "#pragma once\n\n#include <audioapi/utils/FatFunction.hpp>\n#include <audioapi/utils/SpscChannel.hpp>\n\n#include <utility>\n\nnamespace audioapi {\nusing namespace channels::spsc;\n\n/// @brief A scheduler for cross-thread events.\n/// @tparam T The type of data to be processed by the events.\n////\n/// It lets to schedule an event that should be performed on a different thread.\n///\n/// - T1 - JS thread\n///\n/// - T2 - Audio thread\n///\n/// Audio thread is looping every render quantum (~128 frames).\n/// We want to modify some parameter on the resource used by audio thread.\n/// We can schedule function on JS-Thread and process it before processing frames.\n/// In this setup no locking happens and modifications can be seen by Audio thread.\n/// @note it is intended to be used for two threads one which schedules events and one which processes them\n/// @note it is not safe to be copied across two threads use std::shared_ptr if you need to share data\ntemplate <typename T, int FunctionSize = 64>\nclass CrossThreadEventScheduler {\n  using EventType = FatFunction<FunctionSize, void(T &)>;\n\n public:\n  explicit CrossThreadEventScheduler(size_t capacity) {\n    auto [sender, receiver] = channel<EventType>(capacity);\n    eventSender_ = std::move(sender);\n    eventReceiver_ = std::move(receiver);\n  }\n  CrossThreadEventScheduler(const CrossThreadEventScheduler &) = delete;\n  CrossThreadEventScheduler &operator=(const CrossThreadEventScheduler &) = delete;\n\n  /// @brief Schedules an event to be processed on the audio thread.\n  /// @param event The event to schedule. Implicitly converts from lambdas.\n  /// @return True if scheduled, false if the queue is full.\n  /// @note Requires that sizeof(lambda) <= FunctionSize.\n  bool scheduleEvent(EventType &&event) noexcept(\n      noexcept(eventSender_.try_send(std::move(event)))) {\n    return eventSender_.try_send(std::move(event)) == ResponseStatus::SUCCESS;\n  }\n\n  /// @brief Processes all scheduled events.\n  /// @param data The data to pass to each event.\n  void processAllEvents(T &data) noexcept {\n    EventType event;\n    while (eventReceiver_.try_receive(event) == ResponseStatus::SUCCESS) {\n      event(data);\n    }\n  }\n\n private:\n  Sender<EventType> eventSender_;\n  Receiver<EventType> eventReceiver_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/FatFunction.hpp",
    "content": "#pragma once\n#include <array>\n#include <concepts>\n#include <cstddef>\n#include <cstring>\n#include <functional>\n#include <new>\n#include <type_traits>\n#include <utility>\n\nnamespace audioapi {\n\ntemplate <size_t N, typename _Callable, typename _FpReturnType, typename... _FpArgs>\nconcept CallableConcept =\n    (sizeof(std::decay_t<_Callable>) <= N) && requires(_Callable &&_c, _FpArgs &&..._args) {\n      { _c(std::forward<_FpArgs>(_args)...) } -> std::convertible_to<_FpReturnType>;\n    };\n\ntemplate <size_t N, typename _Fp>\nclass FatFunction;\n\n/// @brief FatFunction is a fixed-size function wrapper that can store callable objects\n///        of a specific size N without dynamic memory allocation.\n/// @tparam N Size in bytes to allocate for the callable object\n/// @tparam _Fp The function signature (e.g., void(), int(int), etc.)\ntemplate <size_t N, typename _FpReturnType, typename... _FpArgs>\nclass FatFunction<N, _FpReturnType(_FpArgs...)> {\n  template <size_t, typename>\n  friend class FatFunction;\n\n private:\n  using _InvokerType = _FpReturnType (*)(std::byte *storage, _FpArgs... args);\n  using _DeleterType = void (*)(std::byte *storage);\n  using _MoverType = void (*)(std::byte *dest, std::byte *src);\n\n public:\n  FatFunction() = default;\n  FatFunction(std::nullptr_t) : FatFunction() {}\n\n  /// @brief Constructs a FatFunction from a callable object.\n  /// @tparam _Callable The type of the callable object\n  /// @tparam (enable_if) Ensures that the callable fits within the allocated size N\n  ///                    and is invocable with the specified signature.\n  /// @param callable The callable object to store\n  template <typename _Callable>\n    requires CallableConcept<N, _Callable, _FpReturnType, _FpArgs...>\n  FatFunction(_Callable &&callable) {\n    using DecayedCallable = std::decay_t<_Callable>;\n    new (storage_.data.data()) DecayedCallable(std::forward<_Callable>(callable));\n    invoker_ = [](std::byte *storage, _FpArgs... args) -> _FpReturnType {\n      DecayedCallable *callablePtr = reinterpret_cast<DecayedCallable *>(storage);\n      return (*callablePtr)(std::forward<_FpArgs>(args)...);\n    };\n    if constexpr (std::is_trivially_destructible_v<DecayedCallable>) {\n      // No custom deleter needed for trivially destructible types\n      deleter_ = nullptr;\n    } else {\n      deleter_ = [](std::byte *storage) {\n        DecayedCallable *callablePtr = reinterpret_cast<DecayedCallable *>(storage);\n        callablePtr->~DecayedCallable();\n      };\n    }\n    if constexpr (std::is_trivially_move_constructible_v<DecayedCallable>) {\n      // No custom mover needed for trivially moveable types as memcpy is a fallback\n      mover_ = nullptr;\n    } else {\n      mover_ = [](std::byte *dest, std::byte *src) {\n        DecayedCallable *srcPtr = reinterpret_cast<DecayedCallable *>(src);\n        new (dest) DecayedCallable(std::move(*srcPtr));\n      };\n    }\n  }\n\n  /// @brief Move constructor\n  /// @param other The FatFunction to move from\n  /// @tparam M The size of the callable in the other FatFunction, must be less than or equal to N to ensure it fits in the storage\n  /// @note We can freely create FatFunction with bigger storage from FatFunction with smaller storage, but not the other way around\n  FatFunction(FatFunction &&other) noexcept {\n    if (other.invoker_) {\n      if (other.mover_) {\n        other.mover_(storage_.data.data(), other.storage_.data.data());\n      } else {\n        std::memcpy(storage_.data.data(), other.storage_.data.data(), N);\n      }\n      invoker_ = other.invoker_;\n      deleter_ = other.deleter_;\n      mover_ = other.mover_;\n      other.reset();\n    }\n  }\n\n  template <size_t M>\n    requires(M < N)\n  FatFunction(FatFunction<M, _FpReturnType(_FpArgs...)> &&other) {\n    if (other.invoker_) {\n      if (other.mover_) {\n        other.mover_(storage_.data.data(), other.storage_.data.data());\n      } else {\n        std::memcpy(storage_.data.data(), other.storage_.data.data(), M);\n      }\n      invoker_ = other.invoker_;\n      deleter_ = other.deleter_;\n      mover_ = other.mover_;\n      other.reset();\n    }\n  }\n\n  /// @brief Move assignment operator\n  /// @param other\n  FatFunction &operator=(FatFunction &&other) noexcept {\n    if (this != &other) {\n      reset();\n      if (other.invoker_) {\n        if (other.mover_) {\n          other.mover_(storage_.data.data(), other.storage_.data.data());\n        } else {\n          std::memcpy(storage_.data.data(), other.storage_.data.data(), N);\n        }\n        invoker_ = other.invoker_;\n        deleter_ = other.deleter_;\n        mover_ = other.mover_;\n        other.reset();\n      }\n    }\n    return *this;\n  }\n\n  /// @brief Call operator to invoke the stored callable\n  /// @param ...args Arguments to pass to the callable\n  /// @return The result of the callable invocation\n  _FpReturnType operator()(_FpArgs &&...args) const {\n    if (!invoker_) {\n      throw std::bad_function_call();\n    }\n    return invoker_(storage_.data.data(), std::forward<_FpArgs>(args)...);\n  }\n\n  /// @brief Checks if the FatFunction contains a valid callable\n  explicit operator bool() const noexcept {\n    return invoker_ != nullptr;\n  }\n\n  /// @brief Destructor\n  ~FatFunction() {\n    reset();\n  }\n\n  /// @brief Releases the stored callable and returns its storage and deleter.\n  /// @return A pair containing the storage array and the deleter function\n  /// @note To clear resources properly after release, the user must call the deleter on the storage.\n  std::pair<std::array<std::byte, N>, _DeleterType> release() {\n    std::array<std::byte, N> storageCopy;\n    std::memcpy(storageCopy.data(), storage_.data.data(), N);\n    _DeleterType deleterCopy = deleter_;\n    deleter_ = nullptr;\n    invoker_ = nullptr;\n    mover_ = nullptr;\n    return {std::move(storageCopy), deleterCopy};\n  }\n\n private:\n  struct alignas(std::max_align_t) Storage {\n    std::array<std::byte, N> data;\n  };\n  mutable Storage storage_;\n  _InvokerType invoker_ = nullptr; // Function pointer to invoke the stored callable\n  _DeleterType deleter_ = nullptr; // Function pointer to delete the stored callable\n  _MoverType mover_ = nullptr;     // Function pointer to move the stored callable\n\n  void reset() {\n    if (deleter_) {\n      deleter_(storage_.data.data());\n    }\n    deleter_ = nullptr;\n    invoker_ = nullptr;\n    mover_ = nullptr;\n  }\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/Macros.h",
    "content": "#pragma once\n\n#define DELETE_COPY_AND_MOVE(ClassName) \\\n  ClassName(const ClassName &) = delete; \\\n  ClassName &operator=(const ClassName &) = delete; \\\n  ClassName(ClassName &&) = delete; \\\n  ClassName &operator=(ClassName &&) = delete\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/MiniaudioImplementation.cpp",
    "content": "/// Miniaudio implementation\n/// this define tells the miniaudio to also include the definitions and not only declarations.\n/// Which should be done only once in the whole project.\n/// This make its safe to include the header file in multiple places, without causing multiple definition errors.\n#define MINIAUDIO_IMPLEMENTATION\n#define MA_DEBUG_OUTPUT\n#include <audioapi/libs/miniaudio/miniaudio.h>\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/MoveOnlyFunction.hpp",
    "content": "#pragma once\n#include <functional>\n#include <memory>\n#include <utility>\n\nnamespace audioapi {\n\n/// @brief A forward declaration of a move-only function wrapper.\n/// @note it is somehow required to have <R(Args...)> specialization below\n/// @tparam Signature\ntemplate <typename Signature>\nclass move_only_function; // Forward declaration\n\n/// @brief A move-only function wrapper similar to std::function but non-copyable.\n/// @details This class allows you to store and invoke callable objects (like lambdas, function pointers, or functors)\n/// that can be moved but not copied. It is useful for scenarios where you want to ensure that the callable\n/// is unique and cannot be duplicated.\n/// @note This implementation uses type erasure to store the callable object.\n/// @note The callable object must be invocable with the specified arguments and return type.\n/// @note IMPORTANT: This thing is implemented in C++23 standard and can be replaced with std::move_only_function once we switch to C++23.\n/// @tparam R\n/// @tparam ...Args\ntemplate <typename R, typename... Args>\nclass move_only_function<R(Args...)> {\n  /// @brief The base class for type erasure.\n  /// @note It gets optimized by Empty Base Optimization (EBO) when possible.\n  struct callable_base {\n    virtual ~callable_base() = default;\n    virtual R operator()(Args... args) = 0;\n  };\n\n  /// @brief The implementation of the callable object.\n  /// @tparam F\n  template <typename F>\n  struct callable_impl : callable_base {\n    /// @brief The stored callable object.\n    F f;\n\n    /// @brief Construct a new callable_impl object.\n    /// @tparam G\n    /// @param func\n    /// @note The enable_if_t ensures that F can be constructed from G&&.\n    template <typename G, typename = std::enable_if_t<std::is_constructible_v<F, G &&>>>\n    explicit callable_impl(G &&func) : f(std::forward<G>(func)) {}\n\n    /// @brief Invoke the stored callable object with the given arguments.\n    /// @param args\n    /// @return R\n    /// @note The if constexpr is used to handle the case when R is void.\n    inline R operator()(Args... args) override {\n      if constexpr (std::is_void_v<R>) {\n        /// To avoid \"warning: expression result unused\" when R is void\n        f(std::forward<Args>(args)...);\n      } else {\n        return f(std::forward<Args>(args)...);\n      }\n    }\n  };\n\n  /// @brief The unique pointer to the base callable type.\n  std::unique_ptr<callable_base> impl_;\n\n public:\n  move_only_function() = default;\n  move_only_function(std::nullptr_t) noexcept : impl_(nullptr) {}\n\n  template <typename F>\n  move_only_function(F &&f)\n      : impl_(std::make_unique<callable_impl<std::decay_t<F>>>(std::forward<F>(f))) {}\n\n  move_only_function(const move_only_function &) = delete;\n  move_only_function &operator=(const move_only_function &) = delete;\n\n  move_only_function(move_only_function &&) = default;\n  move_only_function &operator=(move_only_function &&) = default;\n\n  inline explicit operator bool() const noexcept {\n    return impl_ != nullptr;\n  }\n\n  inline R operator()(Args... args) {\n    /// We are unlikely to hit this case as we want to optimize for the common case.\n    if (impl_ == nullptr) [[unlikely]] {\n      throw std::bad_function_call{};\n    }\n    return (*impl_)(std::forward<Args>(args)...);\n  }\n\n  void swap(move_only_function &other) noexcept {\n    impl_.swap(other.impl_);\n  }\n};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/Result.hpp",
    "content": "#pragma once\n\n#include <functional>\n#include <stdexcept>\n#include <string>\n#include <type_traits>\n#include <utility>\n\nnamespace audioapi {\n\ntemplate <typename T>\nstruct Ok_wrapper {\n  T value;\n};\n\ntemplate <typename E>\nstruct Err_wrapper {\n  E value;\n};\n\ntemplate <typename T>\nauto Ok(T &&value) {\n  return Ok_wrapper<std::decay_t<T>>{std::forward<T>(value)};\n}\n\ntemplate <typename E>\nauto Err(E &&error) {\n  return Err_wrapper<std::decay_t<E>>{std::forward<E>(error)};\n}\n\nstruct NoneType {};\ninline constexpr NoneType None{};\n\n/// @brief A Result type that can represent either a success (Ok) or an error (Err).\n/// @tparam T value type for success\n/// @tparam E error type for failure\n/// @note Specializations for void T and/or void E are not provided. Use NoneType instead.\n/// Design inspired by Rust's Result type.\n/// https://doc.rust-lang.org/std/result/\n///\n/// @example\n/// /// Creating an Ok Result and mapping its error:\n/// Result<int, std::string> res = Result<int, int>::Err(404)\n///   .map_err<std::string>([](auto code){\n///      return \"Error code: \" + std::to_string(code);\n///    });\n///\ntemplate <typename T = NoneType, typename E = NoneType>\nclass Result {\n  struct OkTag {};\n  struct ErrTag {};\n\n  explicit Result(OkTag okTag, const T &value) : ok_value(value), is_ok_(true) {}\n  explicit Result(OkTag okTag, T &&value) : ok_value(std::move(value)), is_ok_(true) {}\n  explicit Result(ErrTag errTag, const E &error) : err_value(error), is_ok_(false) {}\n  explicit Result(ErrTag errTag, E &&error) : err_value(std::move(error)), is_ok_(false) {}\n\n public:\n  template <typename U>\n  Result(Ok_wrapper<U> &&ok) : is_ok_(true) { // NOLINT(runtime/explicit)\n    new (&ok_value) T(std::move(ok.value));\n  }\n\n  template <typename F>\n  Result(Err_wrapper<F> &&err) : is_ok_(false) { // NOLINT(runtime/explicit)\n    new (&err_value) E(std::move(err.value));\n  }\n\n  Result(const Result<T, E> &other) : is_ok_(other.is_ok_) {\n    if (is_ok_) {\n      new (&ok_value) T(other.ok_value);\n    } else {\n      new (&err_value) E(other.err_value);\n    }\n  }\n\n  Result(Result<T, E> &&other) noexcept(\n      std::is_nothrow_move_constructible_v<T> && std::is_nothrow_move_constructible_v<E>)\n      : is_ok_(other.is_ok_) {\n    if (is_ok_) {\n      new (&ok_value) T(std::move(other.ok_value));\n    } else {\n      new (&err_value) E(std::move(other.err_value));\n    }\n  }\n\n  Result &operator=(const Result &other) {\n    if (this == &other) {\n      return *this;\n    }\n    if (is_ok_ == other.is_ok_) {\n      if (is_ok_) {\n        ok_value = other.ok_value;\n      } else {\n        err_value = other.err_value;\n      }\n    } else {\n      if (is_ok_) {\n        ok_value.~T();\n        new (&err_value) E(other.err_value);\n        is_ok_ = false;\n      } else {\n        err_value.~E();\n        new (&ok_value) T(other.ok_value);\n        is_ok_ = true;\n      }\n    }\n    return *this;\n  }\n\n  Result &operator=(Result &&other) noexcept(\n      std::is_nothrow_move_assignable_v<T> && std::is_nothrow_move_assignable_v<E> &&\n      std::is_nothrow_move_constructible_v<T> && std::is_nothrow_move_constructible_v<E>) {\n    if (this == &other) {\n      return *this;\n    }\n    if (is_ok_ == other.is_ok_) {\n      if (is_ok_) {\n        ok_value = std::move(other.ok_value);\n      } else {\n        err_value = std::move(other.err_value);\n      }\n    } else {\n      if (is_ok_) {\n        ok_value.~T();\n        new (&err_value) E(std::move(other.err_value));\n        is_ok_ = false;\n      } else {\n        err_value.~E();\n        new (&ok_value) T(std::move(other.ok_value));\n        is_ok_ = true;\n      }\n    }\n    return *this;\n  }\n\n  ~Result() {\n    if (is_ok_) {\n      ok_value.~T();\n    } else {\n      err_value.~E();\n    }\n  }\n\n  /// @brief Creates a success Result.\n  static Result<T, E> Ok(const T &value) {\n    return Result<T, E>(OkTag{}, value);\n  }\n\n  /// @brief Creates a success Result from an rvalue.\n  static Result<T, E> Ok(T &&value) {\n    return Result<T, E>(OkTag{}, std::move(value));\n  }\n\n  /// @brief Creates an error Result.\n  static Result<T, E> Err(const E &error) {\n    return Result<T, E>(ErrTag{}, error);\n  }\n\n  /// @brief Creates an error Result from an rvalue.\n  static Result<T, E> Err(E &&error) {\n    return Result<T, E>(ErrTag{}, std::move(error));\n  }\n\n  /// @brief Returns true if the result is Ok.\n  [[nodiscard]] bool is_ok() const {\n    return is_ok_;\n  }\n\n  /// @brief Returns true if the result is Err.\n  [[nodiscard]] bool is_err() const {\n    return !is_ok_;\n  }\n\n  /// @brief Returns the contained Ok value, consuming the Result.\n  /// @throws std::runtime_error if the value is an Err.\n  [[nodiscard]] T expect(const std::string &msg) && {\n    if (!is_ok_) {\n      throw std::runtime_error(msg);\n    }\n    return std::move(ok_value);\n  }\n\n  /// @brief Returns the contained Ok value.\n  /// @throws std::runtime_error if the value is an Err.\n  [[nodiscard]] const T &expect(const std::string &msg) const & {\n    if (!is_ok_) {\n      throw std::runtime_error(msg);\n    }\n    return ok_value;\n  }\n\n  /// @brief Returns the contained Ok value, consuming the Result.\n  /// @throws std::runtime_error if the value is an Err.\n  [[nodiscard]] T unwrap() && {\n    if (!is_ok_) {\n      throw std::runtime_error(\"Called unwrap on an Err value\");\n    }\n    return std::move(ok_value);\n  }\n\n  /// @brief Returns the contained Ok value.\n  /// @throws std::runtime_error if the value is an Err.\n  [[nodiscard]] const T &unwrap() const & {\n    if (!is_ok_) {\n      throw std::runtime_error(\"Called unwrap on an Err value\");\n    }\n    return ok_value;\n  }\n\n  /// @brief Returns the contained Ok value or a default. Consumes self.\n  [[nodiscard]] T unwrap_or(T &&default_value) && {\n    if (is_ok_) {\n      return std::move(ok_value);\n    }\n    return std::move(default_value);\n  }\n\n  /// @brief Returns the contained Ok value or computes it from a closure. Consumes self.\n  [[nodiscard]] T unwrap_or_else(const std::function<T(E &&)> &func) && {\n    if (is_ok_) {\n      return std::move(ok_value);\n    }\n    return func(std::move(err_value));\n  }\n\n  /// @brief Returns the contained Ok value without checking. UB if Err.\n  [[nodiscard]] T unwrap_unchecked() && noexcept {\n    return std::move(ok_value);\n  }\n\n  /// @brief Returns the contained Ok value without checking. UB if Err.\n  [[nodiscard]] const T &unwrap_unchecked() const & noexcept {\n    return ok_value;\n  }\n\n  /// @brief Returns the contained Err value, consuming the Result.\n  /// @throws std::runtime_error if the value is Ok.\n  [[nodiscard]] E unwrap_err() && {\n    if (is_ok_) {\n      throw std::runtime_error(\"Called unwrap_err on an Ok value\");\n    }\n    return std::move(err_value);\n  }\n\n  /// @brief Returns the contained Err value.\n  /// @throws std::runtime_error if the value is Ok.\n  [[nodiscard]] const E &unwrap_err() const & {\n    if (is_ok_) {\n      throw std::runtime_error(\"Called unwrap_err on an Ok value\");\n    }\n    return err_value;\n  }\n\n  /// @brief Returns the contained Err value, consuming the Result.\n  /// @throws std::runtime_error if the value is Ok.\n  [[nodiscard]] E expect_err(const std::string &msg) && {\n    if (is_ok_) {\n      throw std::runtime_error(msg);\n    }\n    return std::move(err_value);\n  }\n\n  /// @brief Returns the contained Err value.\n  /// @throws std::runtime_error if the value is Ok.\n  [[nodiscard]] const E &expect_err(const std::string &msg) const & {\n    if (is_ok_) {\n      throw std::runtime_error(msg);\n    }\n    return err_value;\n  }\n\n  /// @brief Returns the contained Err value without checking. UB if Ok.\n  [[nodiscard]] E unwrap_err_unchecked() && noexcept {\n    return std::move(err_value);\n  }\n\n  /// @brief Returns the contained Err value without checking. UB if Ok.\n  [[nodiscard]] const E &unwrap_err_unchecked() const & noexcept {\n    return err_value;\n  }\n\n  /// @brief Maps a Result<T, E> to Result<U, E> by applying a function to a contained Ok value.\n  template <typename F>\n  [[nodiscard]] auto map(F &&ok_func) && {\n    using U = std::invoke_result_t<F, T>;\n    using ResultType = Result<U, E>;\n    if (is_ok_) {\n      return ResultType::Ok(ok_func(std::move(ok_value)));\n    }\n    return ResultType::Err(std::move(err_value));\n  }\n\n  /// @brief Maps a Result<T, E> to Result<T, F> by applying a function to a contained Err value.\n  template <typename F>\n  [[nodiscard]] auto map_err(F &&err_func) && {\n    using U = std::invoke_result_t<F, E>;\n    using ResultType = Result<T, U>;\n    if (is_ok_) {\n      return ResultType::Ok(std::move(ok_value));\n    }\n    return ResultType::Err(err_func(std::move(err_value)));\n  }\n\n  /// @brief Returns the provided default (if Err), or applies a function to the contained value (if Ok).\n  template <typename F, typename U>\n  [[nodiscard]] auto map_or(F &&ok_func, U &&default_value) && {\n    if (is_ok_) {\n      return ok_func(std::move(ok_value));\n    }\n    return std::forward<U>(default_value);\n  }\n\n  /// @brief Maps a Result<T, E> to U by applying fallback function default to a contained Err value, or function f to a contained Ok value.\n  template <typename FT, typename FE>\n  [[nodiscard]] auto map_or_else(FT &&ok_func, FE &&err_func) && {\n    if (is_ok_) {\n      return ok_func(std::move(ok_value));\n    }\n    return err_func(std::move(err_value));\n  }\n\n  /// @brief Calls the provided closure with the contained Ok value, if any, otherwise returns the Err value of self.\n  /// @tparam for Result<T,E> F is a closure that takes T and returns Result<TNew, E>\n  template <typename F>\n  [[nodiscard]] auto and_then(F &&ok_func) && {\n    using ResultType = std::invoke_result_t<F, T>;\n    if (is_ok_) {\n      return ok_func(std::move(ok_value));\n    }\n    return ResultType::Err(std::move(err_value));\n  }\n\n  /// @brief Calls the provided closure with the contained Err value, if any, otherwise returns the Ok value of self.\n  /// @tparam for Result<T,E> F is a closure that takes E and returns Result<T, ENew>\n  template <typename F>\n  [[nodiscard]] auto or_else(F &&err_func) && {\n    using ResultType = std::invoke_result_t<F, E>;\n    if (is_ok_) {\n      return ResultType::Ok(std::move(ok_value));\n    }\n    return err_func(std::move(err_value));\n  }\n\n private:\n  union {\n    T ok_value;\n    E err_value;\n  };\n  bool is_ok_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/SpscChannel.hpp",
    "content": "#pragma once\n\n#include <audioapi/core/utils/Constants.h>\n#include <algorithm>\n#include <atomic>\n#include <memory>\n#include <new>\n#include <thread>\n#include <type_traits>\n#include <utility>\n\nnamespace audioapi::channels::spsc {\n\n/// @brief Overflow strategy for sender when the channel is full\nenum class OverflowStrategy : uint8_t {\n  /// @brief Block and wait for space (default behavior)\n  WAIT_ON_FULL,\n\n  /// @brief Overwrite the oldest unread element\n  OVERWRITE_ON_FULL\n};\n\n/// @brief Wait strategy for receiver and sender when looping and trying\nenum class WaitStrategy : uint8_t {\n  /// @brief Busy loop waiting strategy\n  /// @note should be used when low latency is required and channel is not expected to wait\n  /// @note should be definitely used with OverflowStrategy::OVERWRITE_ON_FULL\n  /// @note it uses `asm volatile (\"\" ::: \"memory\")` to prevent harmful compiler optimizations\n  BUSY_LOOP,\n\n  /// @brief Yielding waiting strategy\n  /// @note should be used when low latency is not critical and channel is expected to wait\n  /// @note it uses std::this_thread::yield under the hood\n  YIELD,\n\n  /// @brief Atomic waiting strategy\n  /// @note should be used when low latency is required and channel is expected to wait for longer\n  /// @note it uses std::atomic_wait under the hood\n  ATOMIC_WAIT,\n};\n\n/// @brief Response status for channel operations\nenum class ResponseStatus : uint8_t {\n  SUCCESS,\n  CHANNEL_FULL,\n  CHANNEL_EMPTY,\n\n  /// @brief Indicates that the last value is being overwritten or read so try fails\n  /// @note This status is only returned if given channel supports OVERWRITE_ON_FULL strategy\n  SKIP_DUE_TO_OVERWRITE\n};\n\ntemplate <typename T, OverflowStrategy Strategy, WaitStrategy Wait>\nclass Sender;\ntemplate <typename T, OverflowStrategy Strategy, WaitStrategy Wait>\nclass Receiver;\ntemplate <typename T, OverflowStrategy Strategy, WaitStrategy Wait>\nclass InnerChannel;\n\n/// @brief Create a bounded single-producer, single-consumer channel\n/// @param capacity The minimum capacity of the channel, real capacity will be equal to the closest higher or equal power of two - 1. So for example, if capacity = 12 then channel will hold 15 elements.\n/// @tparam T The type of values sent through the channel\n/// @tparam Strategy The overflow strategy (default: WAIT_ON_FULL)\n/// @tparam Wait The wait strategy used when looping and trying to send or receive (default: BUSY_LOOP)\n/// @return A pair of sender and receiver for the channel\ntemplate <\n    typename T,\n    OverflowStrategy Strategy = OverflowStrategy::WAIT_ON_FULL,\n    WaitStrategy Wait = WaitStrategy::BUSY_LOOP>\nstd::pair<Sender<T, Strategy, Wait>, Receiver<T, Strategy, Wait>> channel(size_t capacity) {\n  auto channel = std::make_shared<InnerChannel<T, Strategy, Wait>>(capacity);\n  return {Sender<T, Strategy, Wait>(channel), Receiver<T, Strategy, Wait>(channel)};\n}\n\n/// @brief Sender for a single-producer, single-consumer channel\n/// @tparam T The type of values sent through the channel\n/// @tparam Strategy The overflow strategy used by the channel\n/// It allows to send values to the channel. It is designed to be used only from one thread at a time.\ntemplate <\n    typename T,\n    OverflowStrategy Strategy = OverflowStrategy::WAIT_ON_FULL,\n    WaitStrategy Wait = WaitStrategy::BUSY_LOOP>\nclass Sender {\n  /// Disallows sender creation outside of channel function\n  explicit Sender(std::shared_ptr<InnerChannel<T, Strategy, Wait>> chan) : channel_(chan) {}\n\n public:\n  /// @brief Default constructor\n  /// @note required to have sender as class member\n  Sender() = default;\n  Sender(const Sender &) = delete;\n  Sender &operator=(const Sender &) = delete;\n\n  Sender &operator=(Sender &&other) noexcept {\n    channel_ = std::move(other.channel_);\n    return *this;\n  }\n  Sender(Sender &&other) noexcept : channel_(std::move(other.channel_)) {}\n\n  /// @brief Try to send a value to the channel\n  /// @param value The value to send\n  /// @return ResponseStatus indicating the result of the operation\n  /// @note this function is lock-free and wait-free\n  template <typename U>\n  ResponseStatus try_send(U &&value) noexcept(std::is_nothrow_constructible_v<T, U &&>) {\n    return channel_->try_send(std::forward<U>(value));\n  }\n\n  /// @brief Send a value to the channel (copy version)\n  /// @param value The value to send\n  /// @note This function is lock-free but may block if the channel is full\n  void send(const T &value) noexcept(std::is_nothrow_constructible_v<T, const T &>) {\n    if (channel_->try_send(value) != ResponseStatus::SUCCESS) [[unlikely]] {\n      do {\n        if constexpr (Wait == WaitStrategy::YIELD) {\n          std::this_thread::yield(); // Yield to allow other threads to run\n        } else if constexpr (Wait == WaitStrategy::BUSY_LOOP) {\n          asm volatile(\"\" ::: \"memory\"); // Busy loop, just spin with compiler barrier\n        } else if constexpr (Wait == WaitStrategy::ATOMIC_WAIT) {\n          channel_->rcvCursor_.wait(channel_->rcvCursorCache_, std::memory_order_acquire);\n        }\n      } while (channel_->try_send(value) != ResponseStatus::SUCCESS);\n    }\n  }\n\n  /// @brief Send a value to the channel (move version)\n  /// @param value The value to send\n  /// @note This function is lock-free but may block if the channel is full.\n  void send(T &&value) noexcept(std::is_nothrow_move_constructible_v<T>) {\n    if (channel_->try_send(std::move(value)) != ResponseStatus::SUCCESS) [[unlikely]] {\n      do {\n        if constexpr (Wait == WaitStrategy::YIELD) {\n          std::this_thread::yield(); // Yield to allow other threads to run\n        } else if constexpr (Wait == WaitStrategy::BUSY_LOOP) {\n          asm volatile(\"\" ::: \"memory\"); // Busy loop, just spin with compiler barrier\n        } else if constexpr (Wait == WaitStrategy::ATOMIC_WAIT) {\n          channel_->rcvCursor_.wait(channel_->rcvCursorCache_, std::memory_order_acquire);\n        }\n      } while (channel_->try_send(std::move(value)) != ResponseStatus::SUCCESS);\n    }\n  }\n\n private:\n  std::shared_ptr<InnerChannel<T, Strategy, Wait>> channel_;\n\n  friend std::pair<Sender<T, Strategy, Wait>, Receiver<T, Strategy, Wait>>\n  channel<T, Strategy, Wait>(size_t capacity);\n};\n\n/// @brief Receiver for a single-producer, single-consumer channel\n/// @tparam T The type of values sent through the channel\n/// @tparam Strategy The overflow strategy used by the channel\n/// It allows to receive values from the channel. It is designed to be used only from one thread at a time.\ntemplate <\n    typename T,\n    OverflowStrategy Strategy = OverflowStrategy::WAIT_ON_FULL,\n    WaitStrategy Wait = WaitStrategy::BUSY_LOOP>\nclass Receiver {\n  /// Disallows receiver creation outside of channel function\n  explicit Receiver(std::shared_ptr<InnerChannel<T, Strategy, Wait>> chan) : channel_(chan) {}\n\n public:\n  /// @brief Default constructor\n  /// @note required to have receiver as class member\n  Receiver() = default;\n  Receiver(const Receiver &) = delete;\n  Receiver &operator=(const Receiver &) = delete;\n\n  Receiver &operator=(Receiver &&other) noexcept {\n    channel_ = std::move(other.channel_);\n    return *this;\n  }\n  Receiver(Receiver &&other) noexcept : channel_(std::move(other.channel_)) {}\n\n  /// @brief Try to receive a value from the channel\n  /// @param value The received value\n  /// @return ResponseStatus indicating the result of the operation\n  /// @note This function is lock-free and wait-free.\n  ResponseStatus try_receive(T &value) noexcept(\n      std::is_nothrow_move_assignable_v<T> && std::is_nothrow_destructible_v<T>) {\n    return channel_->try_receive(value);\n  }\n\n  /// @brief Receive a value from the channel\n  /// @return The received value\n  /// @note This function is lock-free but may block if the channel is empty.\n  T receive() noexcept(\n      std::is_nothrow_default_constructible_v<T> && std::is_nothrow_move_assignable_v<T> &&\n      std::is_nothrow_destructible_v<T>) {\n    T value;\n    if (channel_->try_receive(value) != ResponseStatus::SUCCESS) [[unlikely]] {\n      do {\n        if constexpr (Wait == WaitStrategy::YIELD) {\n          std::this_thread::yield(); // Yield to allow other threads to run\n        } else if constexpr (Wait == WaitStrategy::BUSY_LOOP) {\n          asm volatile(\"\" ::: \"memory\"); // Busy loop, just spin with compiler barrier\n        } else if constexpr (Wait == WaitStrategy::ATOMIC_WAIT) {\n          channel_->sendCursor_.wait(channel_->sendCursorCache_, std::memory_order_acquire);\n        }\n      } while (channel_->try_receive(value) != ResponseStatus::SUCCESS);\n    }\n    return value;\n  }\n\n private:\n  std::shared_ptr<InnerChannel<T, Strategy, Wait>> channel_;\n\n  friend std::pair<Sender<T, Strategy, Wait>, Receiver<T, Strategy, Wait>>\n  channel<T, Strategy, Wait>(size_t capacity);\n};\n\n/// @brief Inner channel implementation for the SPSC queue\n/// @tparam T The type of values sent through the channel\n/// @tparam Strategy The overflow strategy to use when the channel is full\n/// @tparam Wait The wait strategy used for internal operations\n/// This class is not intended to be used directly by users.\n/// @note this class is not thread safe and should be wrapped in std::shared_ptr\ntemplate <\n    typename T,\n    OverflowStrategy Strategy = OverflowStrategy::WAIT_ON_FULL,\n    WaitStrategy Wait = WaitStrategy::BUSY_LOOP>\nclass InnerChannel {\n public:\n  /// @brief Construct a channel with a given capacity\n  /// @param capacity The minimum capacity of the channel, for performance it will be allocated with next power of 2\n  /// Uses raw memory allocation so the T type is not required to provide default constructors\n  /// alignment is the key for performance it makes sure that objects are properly aligned in memory for faster access\n  explicit InnerChannel(size_t capacity)\n      : capacity_(next_power_of_2(capacity)),\n        capacity_mask_(capacity_ - 1),\n        buffer_(\n            static_cast<T *>(operator new[](capacity_ * sizeof(T), std::align_val_t{alignof(T)}))) {\n    // Initialize reader state for overwrite strategy\n    if constexpr (Strategy == OverflowStrategy::OVERWRITE_ON_FULL) {\n      oldestOccupied_.store(false, std::memory_order_relaxed);\n    }\n  }\n\n  /// This should not be called if there is existing handle to reader or writer\n  ~InnerChannel() {\n    size_t sendCursor = sendCursor_.load(std::memory_order_seq_cst);\n    size_t rcvCursor = rcvCursor_.load(std::memory_order_seq_cst);\n\n    // Call destructors for all elements in the buffer\n    size_t i = rcvCursor;\n    while (i != sendCursor) {\n      buffer_[i].~T();\n      i = next_index(i);\n    }\n\n    // Deallocate the buffer\n    ::operator delete[](buffer_, capacity_ * sizeof(T), std::align_val_t{alignof(T)});\n  }\n\n  /// @brief Try to send a value to the channel\n  /// @param value The value to send\n  /// @return ResponseStatus indicating the result of the operation\n  /// @note This function is lock-free and wait-free\n  template <typename U>\n  ResponseStatus try_send(U &&value) noexcept(std::is_nothrow_constructible_v<T, U &&>) {\n    if constexpr (Strategy == OverflowStrategy::WAIT_ON_FULL) {\n      return try_send_wait_on_full(std::forward<U>(value));\n    } else {\n      return try_send_overwrite_on_full(std::forward<U>(value));\n    }\n  }\n\n  /// @brief Try to receive a value from the channel\n  /// @param value The variable to store the received value\n  /// @return ResponseStatus indicating the result of the operation\n  /// @note This function is lock-free and wait-free\n  ResponseStatus try_receive(T &value) noexcept(\n      std::is_nothrow_move_assignable_v<T> && std::is_nothrow_destructible_v<T>) {\n    if constexpr (Strategy == OverflowStrategy::OVERWRITE_ON_FULL) {\n      // Set reader active flag to prevent overwrites during read\n      bool isOccupied = oldestOccupied_.exchange(true, std::memory_order_acq_rel);\n      if (isOccupied) {\n        // It means that the oldest element is being overwritten so we cannot read\n        return ResponseStatus::SKIP_DUE_TO_OVERWRITE;\n      }\n    }\n\n    size_t rcvCursor =\n        rcvCursor_.load(std::memory_order_relaxed); // only receiver thread reads this\n\n    if (rcvCursor == sendCursorCache_) {\n      // Refresh cache\n      sendCursorCache_ = sendCursor_.load(std::memory_order_acquire);\n      if (rcvCursor == sendCursorCache_) {\n        if constexpr (Strategy == OverflowStrategy::OVERWRITE_ON_FULL) {\n          oldestOccupied_.store(false, std::memory_order_release);\n        }\n\n        return ResponseStatus::CHANNEL_EMPTY;\n      }\n    }\n\n    value = std::move(buffer_[rcvCursor]);\n    buffer_[rcvCursor].~T(); // Call destructor\n\n    rcvCursor_.store(next_index(rcvCursor), std::memory_order_release);\n\n    if constexpr (Wait == WaitStrategy::ATOMIC_WAIT) {\n      rcvCursor_.notify_one(); // Notify sender that a value has been received\n    }\n\n    if constexpr (Strategy == OverflowStrategy::OVERWRITE_ON_FULL) {\n      oldestOccupied_.store(false, std::memory_order_release);\n    }\n\n    return ResponseStatus::SUCCESS;\n  }\n\n private:\n  /// @brief Try to send with WAIT_ON_FULL strategy (original behavior)\n  template <typename U>\n  ResponseStatus try_send_wait_on_full(U &&value) noexcept(\n      std::is_nothrow_constructible_v<T, U &&>) {\n    size_t sendCursor =\n        sendCursor_.load(std::memory_order_relaxed); // only sender thread writes this\n    size_t next_sendCursor = next_index(sendCursor);\n\n    if (next_sendCursor == rcvCursorCache_) {\n      // Refresh the cache\n      rcvCursorCache_ = rcvCursor_.load(std::memory_order_acquire);\n      if (next_sendCursor == rcvCursorCache_) {\n        return ResponseStatus::CHANNEL_FULL;\n      }\n    }\n\n    // Construct the new element in place\n    new (&buffer_[sendCursor]) T(std::forward<U>(value));\n\n    sendCursor_.store(next_sendCursor, std::memory_order_release);\n\n    if constexpr (Wait == WaitStrategy::ATOMIC_WAIT) {\n      sendCursor_.notify_one(); // Notify receiver that a value has been sent\n    }\n\n    return ResponseStatus::SUCCESS;\n  }\n\n  /// @brief Try to send with OVERWRITE_ON_FULL strategy\n  template <typename U>\n  ResponseStatus try_send_overwrite_on_full(U &&value) noexcept(\n      std::is_nothrow_constructible_v<T, U &&>) {\n    size_t sendCursor =\n        sendCursor_.load(std::memory_order_relaxed); // only sender thread writes this\n    size_t next_sendCursor = next_index(sendCursor);\n\n    if (next_sendCursor == rcvCursorCache_) {\n      // Refresh the cache\n      rcvCursorCache_ = rcvCursor_.load(std::memory_order_acquire);\n      if (next_sendCursor == rcvCursorCache_) {\n        bool isOldestOccupied = oldestOccupied_.exchange(true, std::memory_order_acq_rel);\n        if (isOldestOccupied) {\n          // If the oldest element is occupied, we cannot overwrite\n          return ResponseStatus::SKIP_DUE_TO_OVERWRITE;\n        }\n\n        size_t newestRcvCursor = rcvCursor_.load(std::memory_order_acquire);\n\n        /// If the receiver did not advance, we can safely advance the cursor\n        if (rcvCursorCache_ == newestRcvCursor) {\n          rcvCursorCache_ = next_index(newestRcvCursor);\n          rcvCursor_.store(rcvCursorCache_, std::memory_order_release);\n        } else {\n          rcvCursorCache_ = newestRcvCursor;\n        }\n\n        oldestOccupied_.store(false, std::memory_order_release);\n      }\n    }\n\n    // Normal case: buffer not full\n    new (&buffer_[sendCursor]) T(std::forward<U>(value));\n    sendCursor_.store(next_sendCursor, std::memory_order_release);\n\n    if constexpr (Wait == WaitStrategy::ATOMIC_WAIT) {\n      sendCursor_.notify_one(); // Notify receiver that a value has been sent\n    }\n\n    return ResponseStatus::SUCCESS;\n  }\n\n  /// @brief Calculate the next power of 2 greater than or equal to n\n  /// @param n The input value\n  /// @return The next power of 2\n  static constexpr size_t next_power_of_2(const size_t n) noexcept {\n    if (n <= 1) {\n      return 1;\n    }\n    // Use bit manipulation for efficiency\n    size_t power = 1;\n    while (power < n) [[likely]] {\n      power <<= 1;\n    }\n    return power;\n  }\n\n  /// @brief Get the next index in a circular buffer\n  /// @param val The current index\n  /// @return The next index\n  /// @note it might not be used for performance but it is a good reference\n  size_t next_index(const size_t val) const noexcept {\n    return (val + 1) & capacity_mask_;\n  }\n\n  const size_t capacity_;\n  const size_t capacity_mask_; // mask for bitwise next_index\n  T *buffer_;\n\n  /// Producer-side data (accessed by sender thread)\n  alignas(hardware_constructive_interference_size) std::atomic<size_t> sendCursor_{0};\n  alignas(hardware_constructive_interference_size) size_t rcvCursorCache_{\n      0}; // reduces cache coherency\n\n  /// Consumer-side data (accessed by receiver thread)\n  alignas(hardware_constructive_interference_size) std::atomic<size_t> rcvCursor_{0};\n  alignas(hardware_constructive_interference_size) size_t sendCursorCache_{\n      0}; // reduces cache coherency\n\n  /// Flag indicating if the oldest element is occupied\n  alignas(hardware_constructive_interference_size) std::atomic<bool> oldestOccupied_{false};\n\n  friend class Sender<T, Strategy, Wait>;\n  friend class Receiver<T, Strategy, Wait>;\n};\n\n} // namespace audioapi::channels::spsc\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/TaskOffloader.hpp",
    "content": "#pragma once\n\n#include <audioapi/utils/SpscChannel.hpp>\n#include <cassert>\n#include <concepts>\n#include <utility>\n\nusing namespace audioapi::channels::spsc;\n\nnamespace audioapi::task_offloader {\n\n/// @brief A utility class to offload task to a separate thread using a SPSC channel.\n/// @tparam T The type of data to be sent through the channel. Must be default_initializable.\n/// @tparam Strategy The overflow strategy for the SPSC channel.\n/// @tparam Wait The wait strategy for the SPSC channel.\ntemplate <std::default_initializable T, OverflowStrategy Strategy, WaitStrategy Wait>\nclass TaskOffloader {\n public:\n  template <typename Func>\n  explicit TaskOffloader(size_t capacity, Func &&task) : shouldRun_(true) {\n    auto [sender, receiver] = channels::spsc::channel<T, Strategy, Wait>(capacity);\n    sender_ = std::move(sender);\n    receiver_ = std::move(receiver);\n\n    workerThread_ = std::thread([this, task = std::forward<Func>(task)]() {\n      while (shouldRun_.load(std::memory_order_acquire)) {\n        auto data = receiver_.receive();\n        if (shouldRun_.load(std::memory_order_acquire)) {\n          task(std::move(data));\n        }\n      }\n    });\n  }\n\n  // delete other functions\n  TaskOffloader(const TaskOffloader &) = delete;\n  TaskOffloader &operator=(const TaskOffloader &) = delete;\n  TaskOffloader(TaskOffloader &&other) = delete;\n  TaskOffloader &operator=(TaskOffloader &&other) = delete;\n\n  ~TaskOffloader() {\n    shouldRun_.store(false, std::memory_order_release);\n    sender_.send(T{}); // send a dummy message to unblock the receiver\n    if (workerThread_.joinable()) {\n      workerThread_.join();\n    }\n  }\n\n  /// @brief Get the const pointer to mutable sender of the SPSC channel\n  auto *const getSender() {\n    return &sender_;\n  }\n\n private:\n  Receiver<T, Strategy, Wait> receiver_;\n  Sender<T, Strategy, Wait> sender_;\n  std::thread workerThread_;\n  std::atomic<bool> shouldRun_;\n};\n\n} // namespace audioapi::task_offloader\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/ThreadPool.hpp",
    "content": "#pragma once\n#include <memory>\n#include <thread>\n#include <utility>\n#include <variant>\n#include <vector>\n\n#include <audioapi/utils/MoveOnlyFunction.hpp>\n#include <audioapi/utils/SpscChannel.hpp>\n\nnamespace audioapi {\n\n/// @brief A simple thread pool implementation using lock-free SPSC channels for task scheduling and execution.\n/// @note The thread pool consists of a load balancer thread and multiple worker threads.\n/// @note The load balancer receives tasks and distributes them to worker threads in a round-robin fashion.\n/// @note Each worker thread has its own SPSC channel to receive tasks from the load balancer.\n/// @note The thread pool can be shut down gracefully by sending a stop event to the load balancer, which then propagates the stop event to all worker threads.\n/// @note IMPORTANT: ThreadPool is not thread-safe and events should be scheduled from a single thread only.\nclass ThreadPool {\n  struct StopEvent {};\n  struct TaskEvent {\n    audioapi::move_only_function<void()> task;\n  };\n  using Event = std::variant<TaskEvent, StopEvent>;\n\n  struct Cntrl {\n    std::atomic<bool> waitingForTasks{false};\n    std::atomic<size_t> tasksScheduled{0};\n  };\n\n  using Sender = channels::spsc::Sender<\n      Event,\n      channels::spsc::OverflowStrategy::WAIT_ON_FULL,\n      channels::spsc::WaitStrategy::ATOMIC_WAIT>;\n  using Receiver = channels::spsc::Receiver<\n      Event,\n      channels::spsc::OverflowStrategy::WAIT_ON_FULL,\n      channels::spsc::WaitStrategy::ATOMIC_WAIT>;\n\n public:\n  /// @brief Construct a new ThreadPool\n  /// @param numThreads The number of worker threads to create\n  /// @param loadBalancerQueueSize The size of the load balancer's queue\n  /// @param workerQueueSize The size of each worker thread's queue\n  explicit ThreadPool(\n      size_t numThreads,\n      size_t loadBalancerQueueSize = 32,\n      size_t workerQueueSize = 32) {\n    auto [sender, receiver] = channels::spsc::channel<\n        Event,\n        channels::spsc::OverflowStrategy::WAIT_ON_FULL,\n        channels::spsc::WaitStrategy::ATOMIC_WAIT>(loadBalancerQueueSize);\n    loadBalancerSender = std::move(sender);\n    std::vector<Sender> workerSenders;\n    workerSenders.reserve(numThreads);\n    for (size_t i = 0; i < numThreads; ++i) {\n      auto [workerSender, workerReceiver] = channels::spsc::channel<\n          Event,\n          channels::spsc::OverflowStrategy::WAIT_ON_FULL,\n          channels::spsc::WaitStrategy::ATOMIC_WAIT>(workerQueueSize);\n      workers.emplace_back(&ThreadPool::workerThreadFunc, this, std::move(workerReceiver));\n      workerSenders.emplace_back(std::move(workerSender));\n    }\n    loadBalancerThread = std::thread(\n        &ThreadPool::loadBalancerThreadFunc, this, std::move(receiver), std::move(workerSenders));\n    controlBlock_ = std::make_unique<Cntrl>();\n  }\n  ThreadPool(const ThreadPool &) = delete;\n  ThreadPool &operator=(const ThreadPool &) = delete;\n  ThreadPool(ThreadPool &&other)\n      : loadBalancerThread(std::move(other.loadBalancerThread)),\n        workers(std::move(other.workers)),\n        loadBalancerSender(std::move(other.loadBalancerSender)),\n        controlBlock_(std::move(other.controlBlock_)) {}\n  ThreadPool &operator=(ThreadPool &&other) {\n    if (this != &other) {\n      loadBalancerThread = std::move(other.loadBalancerThread);\n      workers = std::move(other.workers);\n      loadBalancerSender = std::move(other.loadBalancerSender);\n      controlBlock_ = std::move(other.controlBlock_);\n      other.movedFrom_ = true;\n    }\n    return *this;\n  }\n\n  ~ThreadPool() {\n    if (movedFrom_) {\n      return;\n    }\n    loadBalancerSender.send(StopEvent{});\n    loadBalancerThread.join();\n    for (auto &worker : workers) {\n      worker.join();\n    }\n  }\n\n  /// @brief Schedule a task to be executed by the thread pool\n  /// @tparam Func The type of the task function\n  /// @tparam Args The types of the task function arguments\n  /// @param task The task function to be executed\n  /// @param args The arguments to be passed to the task function\n  /// @note This function is lock-free and most of the time wait-free, but may block if the load balancer queue is full.\n  /// @note Please remember that the task will be executed in a different thread, so make sure to pass any required variables by value or with std::move.\n  /// @note The task should not throw exceptions, as they will not be caught.\n  /// @note The task should end at some point, otherwise the thread pool will never be able to shut down.\n  /// @note IMPORTANT: This function is not thread-safe and should be called from a single thread only.\n  template <\n      typename Func,\n      typename... Args,\n      typename = std::enable_if_t<std::is_invocable_r_v<void, Func, Args...>>>\n  void schedule(Func &&task, Args &&...args) noexcept {\n    controlBlock_->tasksScheduled.fetch_add(1, std::memory_order_release);\n\n    /// We know that lifetime of each worker thus spsc thus lambda is strongly bounded by ThreadPool lifetime\n    /// so we can safely capture control block pointer unsafely here\n    Cntrl *cntrl = controlBlock_.get();\n    auto boundTask = [cntrl,\n                      f = std::forward<Func>(task),\n                      ... capturedArgs = std::forward<Args>(args)]() mutable {\n      f(std::forward<Args>(capturedArgs)...);\n      size_t left = cntrl->tasksScheduled.fetch_sub(1, std::memory_order_acq_rel) - 1;\n      if (left == 0) {\n        cntrl->waitingForTasks.store(false, std::memory_order_release);\n        cntrl->waitingForTasks.notify_one();\n      }\n    };\n    loadBalancerSender.send(TaskEvent{audioapi::move_only_function<void()>(std::move(boundTask))});\n  }\n\n  /// @brief Waits for all scheduled tasks to complete\n  void wait() {\n    /// This logic might seem incorrect at first glance\n    /// Main principle for this is that there is only one thread scheduling tasks\n    /// If he is waiting for the tasks he CANNOT schedule new tasks so we can assume partial\n    /// synchronization here.\n    /// We first store true so if any task finishes at this moment he will flip it\n    /// Then we check if there are any tasks scheduled\n    /// If there are none we can return immediately\n    /// If there are some we wait until the last task flips the flag to false\n    controlBlock_->waitingForTasks.store(true, std::memory_order_release);\n    if (controlBlock_->tasksScheduled.load(std::memory_order_acquire) == 0) {\n      controlBlock_->waitingForTasks.store(false, std::memory_order_release);\n      return;\n    }\n    controlBlock_->waitingForTasks.wait(true, std::memory_order_acquire);\n    return;\n  }\n\n private:\n  std::thread loadBalancerThread;\n  std::vector<std::thread> workers;\n  Sender loadBalancerSender;\n  std::unique_ptr<Cntrl> controlBlock_;\n  bool movedFrom_ = false;\n\n  void workerThreadFunc(Receiver &&receiver) {\n    Receiver localReceiver = std::move(receiver);\n    while (true) {\n      auto event = localReceiver.receive();\n      /// We use [[unlikely]] and [[likely]] attributes to help the compiler optimize the branching.\n      /// we expect most of the time to receive TaskEvent, and rarely StopEvent.\n      /// and whenever we receive StopEvent we can burn some cycles as it will not be expected to execute fast.\n      if (std::holds_alternative<StopEvent>(event)) [[unlikely]] {\n        break;\n      } else if (std::holds_alternative<TaskEvent>(event)) [[likely]] {\n        std::get<TaskEvent>(event).task();\n      }\n    }\n  }\n\n  void loadBalancerThreadFunc(Receiver &&receiver, std::vector<Sender> &&workerSenders) {\n    Receiver localReceiver = std::move(receiver);\n    std::vector<Sender> localWorkerSenders = std::move(workerSenders);\n    size_t nextWorker = 0;\n    while (true) {\n      auto event = localReceiver.receive();\n      /// We use [[unlikely]] and [[likely]] attributes to help the compiler optimize the branching.\n      /// we expect most of the time to receive TaskEvent, and rarely StopEvent.\n      /// and whenever we receive StopEvent we can burn some cycles as it will not be expected to execute fast.\n      if (std::holds_alternative<StopEvent>(event)) [[unlikely]] {\n        // Propagate stop event to all workers\n        for (size_t i = 0; i < localWorkerSenders.size(); ++i) {\n          localWorkerSenders[i].send(StopEvent{});\n        }\n        break;\n      } else if (std::holds_alternative<TaskEvent>(event)) [[likely]] {\n        // Dispatch task to the next worker in round-robin fashion\n        auto &taskEvent = std::get<TaskEvent>(event);\n        localWorkerSenders[nextWorker].send(std::move(taskEvent));\n        nextWorker = (nextWorker + 1) % localWorkerSenders.size();\n      }\n    }\n  }\n};\n\n}; // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/TripleBuffer.hpp",
    "content": "#pragma once\n\n#include <audioapi/core/utils/Constants.h>\n#include <atomic>\n#include <concepts>\n#include <cstddef>\n#include <new>\n\nnamespace audioapi {\n\ntemplate <typename T, typename... Args>\nconcept ConstructibleFromCopyable = std::constructible_from<T, Args...> &&\n    (std::copy_constructible<std::remove_cvref_t<Args>> && ...);\n\n/// @brief A lock-free triple buffer for single producer and single consumer scenarios.\n/// The producer can write to one buffer while the consumer reads from another buffer, and the third buffer is idle.\n/// The producer can publish new data by swapping the back buffer with the idle buffer,\n/// and the consumer can get the latest data by swapping the front buffer with the idle buffer if there is an update.\n/// @tparam T The type of the buffer.\ntemplate <typename T>\nclass TripleBuffer {\n public:\n  template <typename... Args>\n    requires ConstructibleFromCopyable<T, Args...>\n  explicit TripleBuffer(Args &&...args) {\n    new (&buffers_[0]) T(args...);\n    new (&buffers_[1]) T(args...);\n    new (&buffers_[2]) T(args...);\n  }\n\n  ~TripleBuffer() {\n    std::launder(reinterpret_cast<T *>(&buffers_[0]))->~T();\n    std::launder(reinterpret_cast<T *>(&buffers_[1]))->~T();\n    std::launder(reinterpret_cast<T *>(&buffers_[2]))->~T();\n  }\n\n  TripleBuffer(const TripleBuffer &) = delete;\n  TripleBuffer &operator=(const TripleBuffer &) = delete;\n\n  TripleBuffer(TripleBuffer &&) = delete;\n  TripleBuffer &operator=(TripleBuffer &&) = delete;\n\n  T *getForWriter() {\n    return std::launder(reinterpret_cast<T *>(&buffers_[backIndex_]));\n  }\n\n  void publish() {\n    State newState{backIndex_, true};\n    auto prevState = state_.exchange(newState, std::memory_order_acq_rel);\n    backIndex_ = prevState.index;\n  }\n\n  T *getForReader() {\n    auto state = state_.load(std::memory_order_relaxed);\n    if (state.hasUpdate) {\n      State newState{frontIndex_, false};\n      auto prevState = state_.exchange(newState, std::memory_order_acq_rel);\n      frontIndex_ = prevState.index;\n    }\n\n    return std::launder(reinterpret_cast<T *>(&buffers_[frontIndex_]));\n  }\n\n private:\n  struct State {\n    uint32_t index : 2;\n    uint32_t hasUpdate : 1;\n  };\n\n  struct alignas(hardware_destructive_interference_size) AlignedBuffer {\n    alignas(T) std::byte data[sizeof(T)];\n  };\n\n  AlignedBuffer buffers_[3];\n  alignas(hardware_destructive_interference_size) uint32_t frontIndex_{0};\n  alignas(hardware_destructive_interference_size) std::atomic<State> state_{{1, false}};\n  alignas(hardware_destructive_interference_size) uint32_t backIndex_{2};\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/audioapi/utils/UnitConversion.h",
    "content": "#pragma once\n\nnamespace audioapi {\n\nstatic constexpr double KB_IN_BYTES = 1024.0;\nstatic constexpr double MB_IN_BYTES = KB_IN_BYTES * 1024.0;\nstatic constexpr double GB_IN_BYTES = MB_IN_BYTES * 1024.0;\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/clangd/CMakeLists.txt",
    "content": "# internal cmake script for instructing how to build the audio api to generate compile_commands.json that cursor uses\n\ncmake_minimum_required(VERSION 3.12.0)\nset(CMAKE_EXPORT_COMPILE_COMMANDS ON)\nset(CMAKE_CXX_STANDARD 20)\nset(COMMON_CPP_DIR ${CMAKE_SOURCE_DIR}/..)\n\n# Toggle: set to 1 to enable test mode, 0 for normal mode\nset(RN_AUDIO_API_TEST 0)\nset(REACT_NATIVE_DIR ../../../../../node_modules/react-native)\n\n\nfile(GLOB_RECURSE COMMON_CPP_SOURCES CONFIGURE_DEPENDS \"${COMMON_CPP_DIR}/audioapi/*.cpp\" \"${COMMON_CPP_DIR}/audioapi/*.c\" \"${COMMON_CPP_DIR}/test/*.cpp\")\nlist(REMOVE_ITEM COMMON_CPP_SOURCES\n  \"${COMMON_CPP_DIR}/audioapi/HostObjects/inputs/AudioRecorderHostObject.cpp\"\n)\n\nset(INCLUDE_DIR ${COMMON_CPP_DIR}/audioapi/external/include)\nset(FFMPEG_INCLUDE_DIR ${COMMON_CPP_DIR}/audioapi/external/include_ffmpeg)\nset(EXTERNAL_DIR ${COMMON_CPP_DIR}/audioapi/external)\nset(JNI_LIBS_DIR ${COMMON_CPP_DIR}/../../android/src/main/jniLibs)\n\nadd_library(rnaudioapi_cursor STATIC ${COMMON_CPP_SOURCES} ${ANDROID_CPP_SOURCES})\n\nforeach(lib IN ITEMS opus opusfile ogg vorbis vorbisenc vorbisfile crypto ssl)\n  add_library(${lib} STATIC IMPORTED)\n  set_target_properties(${lib} PROPERTIES IMPORTED_LOCATION ${EXTERNAL_DIR}/${ANDROID_ABI}/lib${lib}.a)\nendforeach()\n\nforeach (lib IN ITEMS avcodec avformat avutil swresample)\n  add_library(${lib} SHARED IMPORTED)\n  set_target_properties(${lib} PROPERTIES IMPORTED_LOCATION ${JNI_LIBS_DIR}/${ANDROID_ABI}/lib${lib}.so)\nendforeach()\n\ntarget_compile_definitions(rnaudioapi_cursor PRIVATE\n  RN_AUDIO_API_TEST=${RN_AUDIO_API_TEST}\n)\n\ntarget_include_directories(\n  rnaudioapi_cursor\n  PRIVATE\n  \"${COMMON_CPP_DIR}\"\n  \"${INCLUDE_DIR}\"\n  \"${INCLUDE_DIR}/opus\"\n  \"${FFMPEG_INCLUDE_DIR}\"\n  \"${REACT_NATIVE_DIR}/ReactCommon\"\n  \"${REACT_NATIVE_DIR}/ReactCommon/jsi\"\n  \"${REACT_NATIVE_DIR}/ReactCommon/callinvoker\"\n  \"${COMMON_CPP_DIR}/../../ios\"\n  \"/opt/homebrew/Cellar/googletest/1.17.0/include\"\n)\n\nadd_library(worklets SHARED IMPORTED)\nset_target_properties(\n  worklets\n  PROPERTIES\n    IMPORTED_LOCATION\n    \"${REACT_NATIVE_WORKLETS_DIR}/build/intermediates/cmake/${BUILD_TYPE}/obj/${ANDROID_ABI}/libworklets.so\"\n)\nlist(APPEND INCLUDE_LIBRARIES\n  \"${REACT_NATIVE_WORKLETS_DIR}/../Common/cpp\"\n  \"${REACT_NATIVE_WORKLETS_DIR}/src/main/cpp\"\n)\nlist(APPEND LINK_LIBRARIES worklets)\n\ntarget_include_directories(rnaudioapi_cursor PUBLIC ${INCLUDE_LIBRARIES})\n\ntarget_link_libraries(rnaudioapi_cursor ${LINK_LIBRARIES})\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/clangd/SETUP.md",
    "content": "`CMakeLists.txt` in this directory can be used to build the C++ side and generate `compile_commands.json` for the Cursor C++ extension.\n\n**Generate compile_commands.json**\n\nFrom this directory (`common/cpp/cursor`):\n\n```bash\n./generate-and-copy.sh\n```\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/clangd/generate-and-copy.sh",
    "content": "#!/bin/bash\n\ncmake -B build . && cp build/compile_commands.json ../../../../../\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.14)\nproject(rnaudioapi_test)\n\nset(CMAKE_CXX_STANDARD 20)\nset(CMAKE_CXX_STANDARD_REQUIRED ON)\nset(ROOT ${CMAKE_SOURCE_DIR}/../../../../..)\nset(REACT_NATIVE_DIR \"${ROOT}/node_modules/react-native\")\nset(JSI_DIR \"${REACT_NATIVE_DIR}/ReactCommon/jsi\")\n\nfind_package(GTest QUIET)\n\nif(NOT GTest_FOUND)\n  include(FetchContent)\n  FetchContent_Declare(\n    googletest\n    URL https://github.com/google/googletest/archive/3983f67e32fb3e9294487b9d4f9586efa6e5d088.zip\n  )\n\n  # For Windows: Prevent overriding the parent project's compiler/linker settings\n  set(gtest_force_shared_crt ON CACHE BOOL \"\" FORCE)\n  FetchContent_MakeAvailable(googletest)\nendif()\n\nenable_testing()\n\nset(REACT_NATIVE_AUDIO_API_DIR \"${ROOT}/node_modules/react-native-audio-api\")\n\nfile(GLOB_RECURSE RNAUDIOAPI_SRC\n  CONFIGURE_DEPENDS\n  \"${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/*.cpp\"\n)\n\n# exclude HostObjects from tests\nlist(FILTER RNAUDIOAPI_SRC EXCLUDE REGEX \".*/audioapi/HostObjects/.*\\\\.cpp$\")\n# exclude worklet nodes\nlist(FILTER RNAUDIOAPI_SRC EXCLUDE REGEX \".*/Worklet.*Node\\\\.cpp$\")\n\nlist(REMOVE_ITEM RNAUDIOAPI_SRC\n  \"${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/core/AudioContext.cpp\"\n  \"${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/libs/ffmpeg/FFmpegDecoding.cpp\"\n  \"${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/core/sources/AudioFileSourceNode.cpp\"\n)\n\nfile(GLOB_RECURSE RNAUDIOAPI_LIBS\n  CONFIGURE_DEPENDS\n  \"${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/libs/*.c\"\n  \"${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/libs/*.h\"\n)\n\nlist(REMOVE_ITEM RNAUDIOAPI_LIBS\n  \"${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/libs/miniaudio/decoders/libopus/miniaudio_libopus.c\"\n  \"${REACT_NATIVE_AUDIO_API_DIR}/common/cpp/audioapi/libs/miniaudio/decoders/libvorbis/miniaudio_libvorbis.c\"\n)\n\nadd_library(rnaudioapi STATIC ${RNAUDIOAPI_SRC})\nadd_library(rnaudioapi_libs STATIC ${RNAUDIOAPI_LIBS})\n\ntarget_include_directories(rnaudioapi PUBLIC\n  ${ROOT}/packages/react-native-audio-api/common/cpp\n  ${JSI_DIR}\n  \"${REACT_NATIVE_DIR}/ReactCommon\"\n  \"${REACT_NATIVE_DIR}/ReactCommon/callinvoker\"\n)\n\nif(GTest_FOUND)\n  target_link_libraries(rnaudioapi PUBLIC GTest::gtest GTest::gmock)\nelse()\n  target_include_directories(rnaudioapi PUBLIC\n    ${gtest_SOURCE_DIR}/include\n    ${gmock_SOURCE_DIR}/include\n  )\nendif()\n\ntarget_include_directories(rnaudioapi_libs PUBLIC\n  ${ROOT}/packages/react-native-audio-api/common/cpp\n)\n\nfile(GLOB_RECURSE test_src\n  CONFIGURE_DEPENDS\n  \"src/*.cpp\"\n)\n\nadd_executable(\n  tests\n  ${test_src}\n)\n\nadd_compile_definitions(RN_AUDIO_API_ENABLE_WORKLETS=0)\nadd_compile_definitions(RN_AUDIO_API_TEST=1)\nadd_compile_definitions(RN_AUDIO_API_FFMPEG_DISABLED=1)\n\ntarget_link_libraries(tests\n  rnaudioapi\n  rnaudioapi_libs\n  GTest::gtest_main\n  GTest::gmock\n)\n\n# --- Thread Sanitizer build ---\nadd_executable(tests_tsan ${test_src})\ntarget_compile_options(tests_tsan PRIVATE -fsanitize=thread -g -O1)\ntarget_link_options(tests_tsan PRIVATE -fsanitize=thread)\ntarget_link_libraries(tests_tsan rnaudioapi rnaudioapi_libs GTest::gtest_main GTest::gmock)\n\n# --- Address + Undefined Behavior Sanitizer build ---\nadd_executable(tests_asan ${test_src})\ntarget_compile_options(tests_asan PRIVATE -fsanitize=address,undefined -g -O1)\ntarget_link_options(tests_asan PRIVATE -fsanitize=address,undefined)\ntarget_link_libraries(tests_asan rnaudioapi rnaudioapi_libs GTest::gtest_main GTest::gmock)\n\ninclude(GoogleTest)\ngtest_discover_tests(tests)\ngtest_discover_tests(tests_tsan)\ngtest_discover_tests(tests_asan)\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/Dockerfile",
    "content": "FROM ubuntu:22.04\n\n# Install build tools and dependencies, including GCC 13 for full C++20 support\nRUN apt-get update && \\\n    apt-get install -y software-properties-common && \\\n    add-apt-repository ppa:ubuntu-toolchain-r/test && \\\n    apt-get update && \\\n    apt-get install -y gcc-13 g++-13 clang cmake git wget unzip python3 build-essential && \\\n    rm -rf /var/lib/apt/lists/*\n\n# Set GCC 13 as default\nRUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100 && \\\n    update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100\n\n# Set working directory\nWORKDIR /workspace/packages/react-native-audio-api/common/cpp/test\n\n# Entrypoint is left empty so the script can specify the command\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/RunTests.sh",
    "content": "#!/bin/bash\n\nset -e\n\ncleanup() {\n    echo \"Cleaning up...\"\n    rm -rf build/\n}\n\ntrap cleanup EXIT\n\ncd common/cpp/test\n\ncmake -S . -B build -Wno-dev\n\ncd build\nmake -j10\n\nGRAPH_FILTER=\"AudioGraphTest.*:AudioGraphFuzzTest.*:GraphTest.*:GraphFuzzTest.*:GraphCycleDebugTest.*:HostGraphTest.*:Seeds/*\"\n./tests --gtest_print_time=1 --gtest_filter=\"-${GRAPH_FILTER}\"\ncd ..\n\nrm -rf build/\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/RunTestsGraph.sh",
    "content": "#!/bin/bash\n\nset -e\n\ncleanup() {\n    echo \"Cleaning up...\"\n    rm -rf build/\n}\n\ntrap cleanup EXIT\n\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\ncd \"$SCRIPT_DIR\"\n\n# Allow override of GRAPH_FILTER via environment variable\nGRAPH_FILTER=\"${GRAPH_FILTER:-AudioGraphTest.*:AudioGraphFuzzTest.*:GraphTest.*:GraphFuzzTest.*:GraphCycleDebugTest.*:HostGraphTest.*:Seeds/*}\"\n\ncmake -S . -B build -Wno-dev\n\ncd build\nmake tests_asan tests -j10\n\necho \"\"\necho \"=== Running graph tests with AddressSanitizer + UndefinedBehaviorSanitizer ===\"\necho \"\"\n./tests_asan --gtest_print_time=1 --gtest_filter=\"${GRAPH_FILTER}\" \"$@\"\n\necho \"\"\necho \"=== Running graph tests (normal) ===\"\necho \"\"\n./tests --gtest_print_time=1 --gtest_filter=\"${GRAPH_FILTER}\" \"$@\"\n\ncd ..\n\nrm -rf build/\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/RunTestsGraphDocker.sh",
    "content": "#!/bin/bash\n\n# This script builds and runs the AddressSanitizer-enabled tests in a Linux Docker container from macOS.\n# Usage: ./run_graph_tests_in_docker.sh\n# Make sure to run from the root of your repo or adjust paths accordingly.\n\nset -e\n\n# Absolute path to the repo root on the host (macOS)\nREPO_ROOT=$(cd \"$(dirname \"$0\")/../../../../..\" && pwd)\n\n# Name for the Docker image/container\nIMAGE_NAME=asan-graph-test\nCONTAINER_NAME=asan-graph-test-container\n\n# Build the Docker image (Dockerfile must be in the test dir)\ndocker build -t $IMAGE_NAME \"${REPO_ROOT}/packages/react-native-audio-api/common/cpp/test\"\n\n# Run the container, mounting the entire repo for source access\ndocker run --rm -it \\\n  --name $CONTAINER_NAME \\\n  -v \"$REPO_ROOT:/workspace\" \\\n  -w /workspace/packages/react-native-audio-api/common/cpp/test \\\n  -e ASAN_OPTIONS=detect_leaks=1:verbosity=2 \\\n  $IMAGE_NAME \\\n  bash RunTestsGraph.sh\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/graph_tests_docs.md",
    "content": "\nHere is the guide on how to run the graph tests locally with some tips and tricks to make it easier.\n\n\n## Running it normally\n```\nyarn test:graph\n```\n> This is most common way to run the tests, but it has subtle difference on macos\n\n## Running on docker\n```\nyarn test:graph:docker\n```\n> This way we ensure that the test enviroment is simmilar to the one used in CI, it is much slower and requires docker to be installed\n\n\n## Tips and tricks\nAs running docker tests takes forevewer it is recommended to relly on CI/CD. Tests without docker does not have ASAN and may not catch memory leaks or address realated issues. So if any of these issues occur in CI/CD here is how you can run single test with docker to debug it locally:\nadd the following line to the `RunTestsGraphDocker.sh` file in docker command:\n\n```bash\ndocker run --rm -it \\\n  --name $CONTAINER_NAME \\\n  -v \"$REPO_ROOT:/workspace\" \\\n  -w /workspace/packages/react-native-audio-api/common/cpp/test \\\n  -e ASAN_OPTIONS=detect_leaks=1:verbosity=2 \\\n  -e GRAPH_FILTER=\"<your_test_filter_here>\" \\ # Add this line to set the filter for the tests\n  $IMAGE_NAME \\\n  bash RunTestsGraph.sh\n```\n\nThis will add enviromental variable `GRAPH_FILTER` which will limit the tests cases to only ones matching the filter. This way you can run single test case or a group instead of running all the tests all the time.\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/FatFunctionTest.cpp",
    "content": "#include <audioapi/utils/FatFunction.hpp>\n#include <gtest/gtest.h>\n#include <cstddef>\n#include <memory>\n#include <stdexcept>\n#include <type_traits>\n#include <utility>\n\nusing namespace audioapi;\n\nusing IntOp = int(int, int); // NOLINT(readability/casting)\n\nclass FatFunctionTest : public ::testing::Test {\n protected:\n  void SetUp() override {\n    // Code here will be called immediately after the constructor (right\n    // before each test).\n  }\n\n  void TearDown() override {\n    // Code here will be called immediately after each test (right\n    // before the destructor).\n  }\n};\n\nTEST(FatFunctionTest, BasicFunctionality) {\n  FatFunction<64, IntOp> add = [](int a, int b) {\n    return a + b;\n  };\n  EXPECT_EQ(add(2, 3), 5);\n  // FatFunction contains both raw storage and function pointers.\n  // The compiler may add tail padding so each instance still satisfies\n  // alignof(std::max_align_t), especially when objects are placed in arrays.\n  // We therefore compare against the aligned size, not just the raw field sum.\n  constexpr size_t dataSize = 64 + sizeof(void *) * 3;\n  constexpr size_t alignment = alignof(std::max_align_t);\n  constexpr size_t expectedSize = ((dataSize + alignment - 1) / alignment) * alignment;\n  EXPECT_EQ(sizeof(add), expectedSize);\n}\n\nTEST(FatFunctionTest, MoveSemantics) {\n  FatFunction<64, IntOp> add = [](int a, int b) {\n    return a + b;\n  };\n  FatFunction<64, IntOp> movedAdd = std::move(add);\n  EXPECT_EQ(movedAdd(4, 5), 9);\n  EXPECT_THROW(add(1, 2), std::bad_function_call); // Original should be empty\n}\n\nTEST(FatFunctionTest, Release) {\n  int destructorCalls = 0;\n  struct Tracked {\n    int *counter;\n    explicit Tracked(int *c) : counter(c) {}\n    int operator()(int a, int b) const {\n      return a + b;\n    }\n    ~Tracked() {\n      (*counter)++;\n    }\n  };\n\n  {\n    FatFunction<64, IntOp> add = Tracked(&destructorCalls);\n    // we comment this because compiler can optimize it and do not call destructor here\n    // EXPECT_EQ(destructorCalls, 1); // Destructor called for the temporary Tracked object, but not for the one inside add\n    destructorCalls = 0; // Reset counter after construction\n    auto [storage, deleter] = add.release();\n    EXPECT_GT(storage.size(), 0);\n    EXPECT_NE(deleter, nullptr);\n\n    // We can call the deleter to clean up resources if needed\n    if (deleter) {\n      deleter(storage.data());\n    }\n  } // FatFunction goes out of scope here, but it was released so it shouldn't destroy the object again\n\n  EXPECT_EQ(destructorCalls, 1); // Destructor should have been called exactly once from the deleter\n}\n\nTEST(FatFunctionTest, EmptyFunctionCall) {\n  FatFunction<64, IntOp> emptyFunc;\n  EXPECT_THROW(emptyFunc(1, 2), std::bad_function_call);\n}\n\nTEST(FatFunctionTest, SwapFunctions) {\n  FatFunction<64, IntOp> add = [](int a, int b) {\n    return a + b;\n  };\n  FatFunction<64, IntOp> multiply = [](int a, int b) {\n    return a * b;\n  };\n\n  std::swap(add, multiply);\n\n  EXPECT_EQ(add(2, 3), 6);      // Now add should multiply\n  EXPECT_EQ(multiply(2, 3), 5); // Now multiply should add\n}\n\nTEST(FatFunctionTest, LargeCallable) {\n  struct LargeCallable {\n    int operator()(int a, int b) const {\n      return a * b;\n    }\n    char data[65]; // This makes it larger than the storage size\n  };\n\n  // This should fail to compile because LargeCallable exceeds the storage size\n  bool isConstructible = std::is_constructible_v<FatFunction<64, IntOp>, LargeCallable>;\n  EXPECT_FALSE(isConstructible);\n}\n\nTEST(FatFunctionTest, TriviallyMoveableCallable) {\n  struct TrivialCallable {\n    int operator()(int a, int b) const {\n      return a - b;\n    }\n  };\n\n  FatFunction<64, IntOp> func = TrivialCallable();\n  EXPECT_EQ(func(5, 3), 2);\n}\n\nTEST(FatFunctionTest, SmallerToLargerMove) {\n  FatFunction<32, IntOp> smallFunc = [](int a, int b) {\n    return a + b;\n  };\n  FatFunction<64, IntOp> largeFunc = std::move(smallFunc);\n  EXPECT_EQ(largeFunc(2, 3), 5);\n  EXPECT_THROW(smallFunc(1, 2), std::bad_function_call); // Original should be empty\n}\n\nTEST(FatFunctionTest, LargerToSmallerMove) {\n  FatFunction<64, IntOp> largeFunc = [](int a, int b) {\n    return a * b;\n  };\n  // This should fail to compile because largeFunc exceeds the storage size of smallFunc\n  bool isConstructible = std::is_constructible_v<FatFunction<32, IntOp>, decltype(largeFunc)>;\n  EXPECT_FALSE(isConstructible);\n}\n\nTEST(FatFunctionTest, SmallerToLargerMoveWithNonTrivialMoveAndDestruct) {\n  int destructorCalled = 0;\n  int moverCalled = 0;\n\n  struct NonTrivialCallable {\n    int *dCounter;\n    int *mCounter;\n\n    NonTrivialCallable(int *d, int *m) : dCounter(d), mCounter(m) {}\n\n    int operator()(int a, int b) const {\n      return a + b;\n    }\n    ~NonTrivialCallable() {\n      if (dCounter)\n        (*dCounter)++;\n    }\n    NonTrivialCallable(NonTrivialCallable &&other)\n        : dCounter(other.dCounter), mCounter(other.mCounter) {\n      if (mCounter)\n        (*mCounter)++;\n    }\n    NonTrivialCallable(const NonTrivialCallable &) = delete; // Non-copyable\n  };\n\n  {\n    FatFunction<32, IntOp> smallFunc = NonTrivialCallable(&destructorCalled, &moverCalled);\n\n    // Initial construction involves move from temporary\n    EXPECT_EQ(moverCalled, 1);\n    EXPECT_EQ(destructorCalled, 1);\n\n    FatFunction<64, IntOp> largeFunc = std::move(smallFunc);\n\n    // Move to largeFunc invokes move ctor + destruction of smallFunc's content\n    EXPECT_EQ(moverCalled, 2);\n    EXPECT_EQ(destructorCalled, 2);\n\n    EXPECT_EQ(largeFunc(2, 3), 5);\n    EXPECT_THROW(smallFunc(1, 2), std::bad_function_call); // Original should be empty\n  }\n  EXPECT_EQ(moverCalled, 2);\n  EXPECT_EQ(destructorCalled, 3);\n}\n\nTEST(FatFunctionTest, MutableLambdaBasic) {\n  // A mutable lambda that modifies captured state on each call\n  int counter = 0;\n  FatFunction<64, IntOp> func = [counter](int a, int b) mutable {\n    counter++;\n    return a + b + counter;\n  };\n  EXPECT_EQ(func(1, 2), 4); // 1 + 2 + 1\n  EXPECT_EQ(func(1, 2), 5); // 1 + 2 + 2\n  EXPECT_EQ(func(1, 2), 6); // 1 + 2 + 3\n}\n\nTEST(FatFunctionTest, MutableLambdaWithUniquePtr) {\n  // Mutable lambda capturing a unique_ptr — the original Graph.hpp use case\n  auto ptr = std::make_unique<int>(42);\n  FatFunction<64, IntOp> func = [ptr = std::move(ptr)](int a, int b) mutable -> int {\n    int val = *ptr;\n    ptr.reset(); // mutates the captured unique_ptr\n    return a + b + val;\n  };\n  EXPECT_EQ(func(1, 2), 45); // 1 + 2 + 42\n}\n\nTEST(FatFunctionTest, MutableLambdaStateIsolatedAfterMove) {\n  // Verify that state is correctly preserved when a mutable-lambda FatFunction is moved\n  FatFunction<64, IntOp> func = [n = 0](int a, int b) mutable {\n    n++;\n    return a + b + n;\n  };\n  EXPECT_EQ(func(0, 0), 1); // n becomes 1\n  EXPECT_EQ(func(0, 0), 2); // n becomes 2\n\n  FatFunction<64, IntOp> moved = std::move(func);\n  EXPECT_THROW(func(0, 0), std::bad_function_call); // original is empty\n\n  // Moved function should continue from where the state left off\n  EXPECT_EQ(moved(0, 0), 3); // n becomes 3\n  EXPECT_EQ(moved(0, 0), 4); // n becomes 4\n}\n\nTEST(FatFunctionTest, MutableLambdaSmallerToLargerMove) {\n  FatFunction<32, IntOp> small = [n = 0](int a, int b) mutable {\n    n += 10;\n    return a + b + n;\n  };\n  EXPECT_EQ(small(1, 1), 12); // n = 10\n\n  FatFunction<64, IntOp> large = std::move(small);\n  EXPECT_EQ(large(1, 1), 22); // n = 20\n}\n\nTEST(FatFunctionTest, MutableLambdaVoidReturn) {\n  using VoidOp = void(int, int); // NOLINT(readability/casting)\n  int accumulator = 0;\n  FatFunction<64, VoidOp> func = [&accumulator, calls = 0](int a, int b) mutable {\n    calls++;\n    accumulator += (a + b) * calls;\n  };\n  func(1, 2); // calls=1, accumulator += 3*1 = 3\n  func(1, 2); // calls=2, accumulator += 3*2 = 9\n  EXPECT_EQ(accumulator, 9);\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/MockAudioEventHandlerRegistry.h",
    "content": "#pragma once\n\n#include <audioapi/events/AudioEvent.h>\n#include <audioapi/events/IAudioEventHandlerRegistry.h>\n#include <gmock/gmock.h>\n#include <memory>\n#include <string>\n#include <unordered_map>\n\nusing namespace audioapi;\n\nusing EventMap = std::unordered_map<std::string, EventValue>;\n\nclass MockAudioEventHandlerRegistry : public IAudioEventHandlerRegistry {\n public:\n  MOCK_METHOD(\n      uint64_t,\n      registerHandler,\n      (AudioEvent eventName, const std::shared_ptr<facebook::jsi::Function> &handler),\n      (override));\n  MOCK_METHOD(void, unregisterHandler, (AudioEvent eventName, uint64_t listenerId), (override));\n\n  MOCK_METHOD2(invokeHandlerWithEventBody, void(AudioEvent eventName, const EventMap &body));\n  MOCK_METHOD3(\n      invokeHandlerWithEventBody,\n      void(AudioEvent eventName, uint64_t listenerId, const EventMap &body));\n};\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/core/AudioParamTest.cpp",
    "content": "#include <audioapi/core/AudioParam.h>\n#include <audioapi/core/OfflineAudioContext.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <gtest/gtest.h>\n#include <test/src/MockAudioEventHandlerRegistry.h>\n#include <memory>\n\nusing namespace audioapi;\n\n// NOLINTBEGIN\n\nclass AudioParamTest : public ::testing::Test {\n protected:\n  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;\n  std::shared_ptr<OfflineAudioContext> context;\n  static constexpr int sampleRate = 44100;\n\n  void SetUp() override {\n    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();\n    context = std::make_shared<OfflineAudioContext>(\n        2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});\n  }\n};\n\nclass TestableAudioParam : public AudioParam {\n public:\n  explicit TestableAudioParam(\n      float defaultValue,\n      float minValue,\n      float maxValue,\n      std::shared_ptr<BaseAudioContext> context)\n      : AudioParam(defaultValue, minValue, maxValue, context) {}\n\n  float process(double time) {\n    return AudioParam::processKRateParam(1, time);\n  }\n};\n\n// --- Basic ---\n\nTEST_F(AudioParamTest, ValueSetters) {\n  auto param = TestableAudioParam(0.5, 0.0, 1.0, context);\n  param.setValue(0.8);\n  EXPECT_FLOAT_EQ(param.getValue(), 0.8);\n  param.setValue(-0.5);\n  EXPECT_FLOAT_EQ(param.getValue(), 0.0);\n  param.setValue(1.5);\n  EXPECT_FLOAT_EQ(param.getValue(), 1.0);\n}\n\n// No events scheduled — falls back to value_.\nTEST_F(AudioParamTest, NoEventsReturnsCurrentValue) {\n  auto param = TestableAudioParam(0.5, 0.0, 1.0, context);\n  EXPECT_FLOAT_EQ(param.process(0.0), 0.5f);\n  EXPECT_FLOAT_EQ(param.process(1.0), 0.5f);\n\n  param.setValue(0.7f);\n  EXPECT_FLOAT_EQ(param.process(0.0), 0.7f);\n}\n\n// --- Event types ---\n\nTEST_F(AudioParamTest, SetValueAtTime) {\n  auto param = TestableAudioParam(0.5, 0.0, 1.0, context);\n  param.setValueAtTime(0.8, 0.1);\n  param.setValueAtTime(0.3, 0.2);\n\n  EXPECT_FLOAT_EQ(param.process(0.05), 0.5f);\n  EXPECT_FLOAT_EQ(param.process(0.1), 0.8f);\n  EXPECT_FLOAT_EQ(param.process(0.15), 0.8f);\n  EXPECT_FLOAT_EQ(param.process(0.2), 0.3f);\n  EXPECT_FLOAT_EQ(param.process(0.25), 0.3f);\n}\n\nTEST_F(AudioParamTest, LinearRampToValueAtTime) {\n  auto param = TestableAudioParam(0, 0, 1.0, context);\n  param.linearRampToValueAtTime(1.0, 0.2);\n\n  EXPECT_FLOAT_EQ(param.process(0.05), 0.25f);\n  EXPECT_FLOAT_EQ(param.process(0.1), 0.5f);\n  EXPECT_FLOAT_EQ(param.process(0.15), 0.75f);\n  EXPECT_FLOAT_EQ(param.process(0.2), 1.0f);\n  EXPECT_FLOAT_EQ(param.process(0.25), 1.0f);\n}\n\nTEST_F(AudioParamTest, ExponentialRampToValueAtTime) {\n  auto param = TestableAudioParam(0.1, 0.0, 1.0, context);\n  param.exponentialRampToValueAtTime(1.0, 0.2);\n  // value(time) = startValue * (endValue/startValue)^((time - startTime)/(endTime - startTime))\n  // value(time) = 0.1 * (1.0/0.1)^((time - 0.0)/(0.2 - 0.0))\n\n  EXPECT_NEAR(param.process(0.05), 0.17783f, 1e-5f);\n  EXPECT_NEAR(param.process(0.1), 0.316228f, 1e-5f);\n  EXPECT_NEAR(param.process(0.15), 0.562341f, 1e-5f);\n  EXPECT_FLOAT_EQ(param.process(0.2), 1.0f);\n  EXPECT_FLOAT_EQ(param.process(0.25), 1.0f);\n}\n\nTEST_F(AudioParamTest, SetTargetAtTime) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  param.setTargetAtTime(1.0, 0.1, 0.1);\n  // value(time) = target + (startValue - target) * exp(-(time - startTime)/timeConstant)\n  // value(time) = 1.0 + (0.0 - 1.0) * exp(-time/0.1)\n\n  EXPECT_FLOAT_EQ(param.process(0.05), 0.0f);\n  EXPECT_FLOAT_EQ(param.process(0.1), 0.0f);\n  EXPECT_NEAR(param.process(0.15), 0.393469f, 1e-5f);\n  EXPECT_NEAR(param.process(0.2), 0.632120f, 1e-5f);\n  EXPECT_NEAR(param.process(0.25), 0.776869f, 1e-5f);\n  EXPECT_NEAR(param.process(0.5), 0.981684f, 1e-5f);\n}\n\nTEST_F(AudioParamTest, SetValueCurveAtTime) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  param.setValue(0.5);\n  auto curve = std::make_shared<AudioArray>(5);\n  auto curveSpan = curve->span();\n  curveSpan[0] = 0.1f;\n  curveSpan[1] = 0.4f;\n  curveSpan[2] = 0.2f;\n  curveSpan[3] = 0.8f;\n  curveSpan[4] = 0.5f;\n  param.setValueCurveAtTime(curve, curve->getSize(), 0.1, 0.2);\n  // 5 elements over 0.2s => each element is 0.04s apart\n\n  EXPECT_FLOAT_EQ(param.process(0.05), 0.0f);\n  EXPECT_FLOAT_EQ(param.process(0.1), 0.1f);\n  // k = 4/0.2 * (0.14 - 0.1) = 0.8 -> floor is 0\n  // linear interpolation between 0 and 1 -> 0.1 + (0.4 - 0.1) * 0.8 = 0.34\n  EXPECT_FLOAT_EQ(param.process(0.14), 0.34f);\n  // k = 4/0.2 * (0.18 - 0.1) = 1.6 -> floor is 1\n  // linear interpolation between 1 and 2 -> 0.4 + (0.2 - 0.4) * 0.6 = 0.28\n  EXPECT_FLOAT_EQ(param.process(0.18), 0.28f);\n  // k = 4/0.2 * (0.22 - 0.1) = 2.4 -> floor is 2\n  // linear interpolation between 2 and 3 -> 0.2 + (0.8 - 0.2) * 0.4 = 0.44\n  EXPECT_FLOAT_EQ(param.process(0.22), 0.44f);\n  // k = 4/0.2 * (0.26 - 0.1) = 3.2 -> floor is 3\n  // linear interpolation between 3 and 4 -> 0.8 + (0.5 - 0.8) * 0.2 = 0.74\n  EXPECT_FLOAT_EQ(param.process(0.26), 0.74f);\n  // k = 4/0.2 * (0.3 - 0.1) = 4.0 -> floor is 4\n  // at or after end of curve -> last value\n  EXPECT_FLOAT_EQ(param.process(0.35), 0.5f);\n}\n\n// --- Insertion between elements ---\n\n// Insert a linear ramp between two setValueAtTime events.\nTEST_F(AudioParamTest, LinearRampInsertedBetweenSetValueAtTimeEvents) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  param.setValueAtTime(0.2, 0.1);\n  param.setValueAtTime(0.8, 0.3);\n  // Insert ramp between them — ramps from 0.2 to 0.6 over [0.1, 0.2]\n  param.linearRampToValueAtTime(0.6, 0.2);\n\n  EXPECT_FLOAT_EQ(param.process(0.05), 0.0f);\n  EXPECT_FLOAT_EQ(param.process(0.1), 0.2f);\n  // midpoint: 0.2 + (0.6 - 0.2) * 0.5\n  EXPECT_FLOAT_EQ(param.process(0.15), 0.4f);\n  EXPECT_FLOAT_EQ(param.process(0.2), 0.6f);\n  EXPECT_FLOAT_EQ(param.process(0.25), 0.6f);\n  EXPECT_FLOAT_EQ(param.process(0.3), 0.8f);\n}\n\n// Insert an exponential ramp between two setValueAtTime events.\nTEST_F(AudioParamTest, ExponentialRampInsertedBetweenSetValueAtTimeEvents) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  param.setValueAtTime(0.1, 0.0);\n  param.setValueAtTime(0.8, 0.4);\n  // Insert exponential ramp: value(t) = 0.1 * 10^(t/0.2)\n  param.exponentialRampToValueAtTime(1.0, 0.2);\n\n  EXPECT_FLOAT_EQ(param.process(0.0), 0.1f);\n  EXPECT_NEAR(param.process(0.1), 0.1f * std::pow(10.0f, 0.5f), 1e-5f);\n  EXPECT_FLOAT_EQ(param.process(0.2), 1.0f);\n  EXPECT_FLOAT_EQ(param.process(0.3), 1.0f);\n  EXPECT_FLOAT_EQ(param.process(0.4), 0.8f);\n}\n\n// Insert a setValueAtTime before an already-scheduled ramp;\n// the ramp's startTime and startValue update to chain from the new event.\nTEST_F(AudioParamTest, SetValueAtTimeInsertedBeforeRampUpdatesRampChain) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  param.linearRampToValueAtTime(1.0, 0.4);\n  // ramp should now start from 0.5 at t=0.2\n  param.setValueAtTime(0.5, 0.2);\n\n  EXPECT_FLOAT_EQ(param.process(0.1), 0.0f);\n  EXPECT_FLOAT_EQ(param.process(0.2), 0.5f);\n  // midpoint: 0.5 + (1.0 - 0.5) * 0.5\n  EXPECT_FLOAT_EQ(param.process(0.3), 0.75f);\n  EXPECT_FLOAT_EQ(param.process(0.4), 1.0f);\n  EXPECT_FLOAT_EQ(param.process(0.5), 1.0f);\n}\n\n// Insert a setValueAtTime between two ramps: second ramp's startTime/startValue update.\nTEST_F(AudioParamTest, SetValueAtTimeInsertedBetweenTwoRamps) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  param.linearRampToValueAtTime(0.5, 0.2); // ramp1: 0->0.5 over [0, 0.2]\n  param.linearRampToValueAtTime(1.0, 0.4); // ramp2: 0.5->1.0 over [0.2, 0.4]\n  // Insert setValue at t=0.2 — ramp2 now starts at 0.3\n  param.setValueAtTime(0.3, 0.2);\n\n  // midpoint of ramp1: 0 + 0.5 * 0.5\n  EXPECT_FLOAT_EQ(param.process(0.1), 0.25f);\n  EXPECT_FLOAT_EQ(param.process(0.2), 0.3f);\n  // midpoint of ramp2: 0.3 + (1.0 - 0.3) * 0.5\n  EXPECT_NEAR(param.process(0.3), 0.65f, 1e-5f);\n  EXPECT_FLOAT_EQ(param.process(0.4), 1.0f);\n}\n\n// Insert a setValueAtTime after a setTarget: resolveEventValues caps setTarget's endTime.\nTEST_F(AudioParamTest, SetValueAtTimeInsertedAfterSetTargetCapsIt) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  // value(t) = 1.0 - exp(-t/0.1)\n  param.setTargetAtTime(1.0, 0.0, 0.1);\n  param.setValueAtTime(0.5, 0.2);\n\n  EXPECT_NEAR(param.process(0.1), 1.0f - std::exp(-1.0f), 1e-5f);\n  EXPECT_FLOAT_EQ(param.process(0.2), 0.5f);\n  EXPECT_FLOAT_EQ(param.process(0.3), 0.5f);\n}\n\n// --- cancelScheduledValues ---\n\nTEST_F(AudioParamTest, CancelScheduledValues) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  param.setValueAtTime(0.8, 0.1);\n  param.setValueAtTime(0.3, 0.2);\n  param.linearRampToValueAtTime(1.0, 0.4);\n  param.cancelScheduledValues(0.15);\n\n  EXPECT_FLOAT_EQ(param.process(0.05), 0.0f);\n  EXPECT_FLOAT_EQ(param.process(0.1), 0.8f);\n  EXPECT_FLOAT_EQ(param.process(0.15), 0.8f);\n  // Events after cancel time are removed -> stays at last value\n  EXPECT_FLOAT_EQ(param.process(0.2), 0.8f);\n  EXPECT_FLOAT_EQ(param.process(0.25), 0.8f);\n}\n\n// Cancel before all events empties the queue; falls back to value_.\nTEST_F(AudioParamTest, CancelScheduledValuesBeforeAllEvents) {\n  auto param = TestableAudioParam(0.3, 0.0, 1.0, context);\n  param.setValueAtTime(0.5, 0.1);\n  param.setValueAtTime(0.8, 0.2);\n  param.cancelScheduledValues(0.05);\n\n  EXPECT_FLOAT_EQ(param.process(0.05), 0.3f);\n  EXPECT_FLOAT_EQ(param.process(0.1), 0.3f);\n  EXPECT_FLOAT_EQ(param.process(0.2), 0.3f);\n}\n\n// Cancel after all events is a no-op.\nTEST_F(AudioParamTest, CancelScheduledValuesAfterAllEventsIsNoop) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  param.setValueAtTime(0.5, 0.1);\n  param.cancelScheduledValues(0.5);\n\n  EXPECT_FLOAT_EQ(param.process(0.1), 0.5f);\n  EXPECT_FLOAT_EQ(param.process(0.3), 0.5f);\n}\n\n// Cancel at exactly an event's automationTime removes that event.\nTEST_F(AudioParamTest, CancelScheduledValuesAtExactEventTime) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  param.setValueAtTime(0.5, 0.1);\n  param.setValueAtTime(0.8, 0.2);\n  param.cancelScheduledValues(0.2); // event at 0.1 survives, event at 0.2 removed\n\n  EXPECT_FLOAT_EQ(param.process(0.1), 0.5f);\n  EXPECT_FLOAT_EQ(param.process(0.2), 0.5f);\n  EXPECT_FLOAT_EQ(param.process(0.3), 0.5f);\n}\n\n// Cancel at the curve's startTime (= automationTime) removes the curve.\nTEST_F(AudioParamTest, CancelScheduledValuesAtCurveStart) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  auto curve = std::make_shared<AudioArray>(2);\n  curve->span()[0] = 0.0f;\n  curve->span()[1] = 1.0f;\n  param.setValueCurveAtTime(curve, 2, 0.2, 0.2); // automationTime = startTime = 0.2\n  param.cancelScheduledValues(0.2);\n\n  EXPECT_FLOAT_EQ(param.process(0.2), 0.0f);\n  EXPECT_FLOAT_EQ(param.process(0.4), 0.0f);\n}\n\n// Cancel mid-way through a curve's time range leaves the curve intact because\n// automationTime (= startTime) is strictly before cancelTime.\nTEST_F(AudioParamTest, CancelScheduledValuesWithinCurveRangeLeavesCurveIntact) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  auto curve = std::make_shared<AudioArray>(2);\n  curve->span()[0] = 0.0f;\n  curve->span()[1] = 1.0f;\n  param.setValueCurveAtTime(curve, 2, 0.0, 0.4); // automationTime = 0.0\n  param.setValueAtTime(0.5, 0.6);\n  param.cancelScheduledValues(0.2); // curve survives; event at 0.6 removed\n\n  EXPECT_FLOAT_EQ(param.process(0.0), 0.0f);\n  EXPECT_FLOAT_EQ(param.process(0.4), 1.0f);\n  EXPECT_FLOAT_EQ(param.process(0.6), 1.0f); // event gone — holds\n}\n\n// Cancel at a setTarget's startTime removes it.\nTEST_F(AudioParamTest, CancelScheduledValuesAtSetTargetStart) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  param.setValueAtTime(0.5, 0.1);\n  param.setTargetAtTime(1.0, 0.2, 0.1); // automationTime = startTime = 0.2\n  param.cancelScheduledValues(0.2);     // removes setTarget; setValueAtTime survives\n\n  EXPECT_FLOAT_EQ(param.process(0.1), 0.5f);\n  EXPECT_FLOAT_EQ(param.process(0.2), 0.5f);\n  EXPECT_FLOAT_EQ(param.process(0.5), 0.5f);\n}\n\n// Cancel after a setTarget's startTime does NOT remove it.\nTEST_F(AudioParamTest, CancelScheduledValuesAfterSetTargetStartLeavesIt) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  param.setTargetAtTime(1.0, 0.0, 0.1);\n  param.setValueAtTime(0.5, 0.3);\n  param.cancelScheduledValues(0.2); // setTarget survives; event at 0.3 removed\n\n  EXPECT_NEAR(param.process(0.1), 1.0f - std::exp(-1.0f), 1e-5f);\n  // setTarget continues indefinitely\n  EXPECT_NEAR(param.process(0.3), 1.0f - std::exp(-3.0f), 1e-5f);\n}\n\n// --- cancelAndHoldAtTime ---\n\n// No events: no-op, value_ is returned.\nTEST_F(AudioParamTest, CancelAndHoldAtTimeWithNoEvents) {\n  auto param = TestableAudioParam(0.4, 0.0, 1.0, context);\n  param.cancelAndHoldAtTime(0.5);\n\n  EXPECT_FLOAT_EQ(param.process(0.5), 0.4f);\n  EXPECT_FLOAT_EQ(param.process(1.0), 0.4f);\n}\n\n// E2 is a linear ramp: truncate it to end at cancelTime.\nTEST_F(AudioParamTest, CancelAndHoldAtTime) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  param.setValueAtTime(0.8, 0.1);\n  param.linearRampToValueAtTime(1.0, 0.2);\n  // holdValue at t=0.15: 0.8 + (1.0 - 0.8) * 0.5 = 0.9\n  param.cancelAndHoldAtTime(0.15);\n\n  EXPECT_FLOAT_EQ(param.process(0.05), 0.0f);\n  EXPECT_FLOAT_EQ(param.process(0.1), 0.8f);\n  EXPECT_FLOAT_EQ(param.process(0.15), 0.9f);\n  // Events after cancel time are removed -> stays at last value\n  EXPECT_FLOAT_EQ(param.process(0.2), 0.9f);\n  EXPECT_FLOAT_EQ(param.process(0.25), 0.9f);\n}\n\n// E2 is an exponential ramp: truncation exactly preserves values before cancelTime.\nTEST_F(AudioParamTest, CancelAndHoldAtTimeWithExponentialRamp) {\n  auto param = TestableAudioParam(0.1, 0.0, 1.0, context);\n  // value(t) = 0.1 * 10^(t/0.2), holdValue = 0.1 * 10^0.5\n  param.exponentialRampToValueAtTime(1.0, 0.2);\n  param.cancelAndHoldAtTime(0.1);\n\n  const float holdValue = 0.1f * std::pow(10.0f, 0.5f);\n\n  EXPECT_NEAR(param.process(0.05), 0.1f * std::pow(10.0f, 0.25f), 1e-5f);\n  EXPECT_NEAR(param.process(0.1), holdValue, 1e-5f);\n  EXPECT_NEAR(param.process(0.3), holdValue, 1e-5f);\n}\n\n// E1 is setTarget (in queue): insert a setValueAtTime at cancelTime to freeze it.\nTEST_F(AudioParamTest, CancelAndHoldAtTimeWithSetTarget) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  // value(t) = 1.0 - exp(-t/0.1), holdValue = 1.0 - exp(-1)\n  param.setTargetAtTime(1.0, 0.0, 0.1);\n  param.cancelAndHoldAtTime(0.1);\n\n  const float holdValue = 1.0f - std::exp(-1.0f);\n\n  EXPECT_NEAR(param.process(0.05), 1.0f - std::exp(-0.5f), 1e-5f);\n  EXPECT_NEAR(param.process(0.1), holdValue, 1e-5f);\n  EXPECT_NEAR(param.process(0.2), holdValue, 1e-5f);\n  EXPECT_NEAR(param.process(1.0), holdValue, 1e-5f);\n}\n\n// E1 is setTarget already in currentEvent_ (drained from queue): still freezes correctly.\nTEST_F(AudioParamTest, CancelAndHoldAtTimeWithCurrentEventSetTarget) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  param.setTargetAtTime(1.0, 0.0, 0.1);\n\n  // Advance time to drain setTarget into currentEvent_\n  EXPECT_NEAR(param.process(0.1), 1.0f - std::exp(-1.0f), 1e-5f);\n\n  // holdValue at t=0.2: 1.0 - exp(-2)\n  param.cancelAndHoldAtTime(0.2);\n\n  const float holdValue = 1.0f - std::exp(-2.0f);\n\n  EXPECT_NEAR(param.process(0.2), holdValue, 1e-5f);\n  EXPECT_NEAR(param.process(0.5), holdValue, 1e-5f);\n}\n\n// E1 is setValueCurve within range: truncate curve at cancelTime.\n// holdValue is computed using the original duration for sampling accuracy.\nTEST_F(AudioParamTest, CancelAndHoldAtTimeWithSetValueCurveWithinRange) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  // 5-element linear curve [0, 0.25, 0.5, 0.75, 1.0] over [0.0, 0.4]\n  auto curve = std::make_shared<AudioArray>(5);\n  for (int i = 0; i < 5; ++i) {\n    curve->span()[i] = i * 0.25f;\n  }\n  param.setValueCurveAtTime(curve, 5, 0.0, 0.4);\n  // cancelTime = 0.2: k = floor(4/0.4 * 0.2) = 2 -> holdValue = curve[2] = 0.5\n  param.cancelAndHoldAtTime(0.2);\n\n  EXPECT_FLOAT_EQ(param.process(0.2), 0.5f);\n  EXPECT_FLOAT_EQ(param.process(0.3), 0.5f);\n  EXPECT_FLOAT_EQ(param.process(1.0), 0.5f);\n}\n\n// E1 is setValueCurve past its end: only removes later events, curve unmodified.\nTEST_F(AudioParamTest, CancelAndHoldAtTimeWithSetValueCurveAfterRange) {\n  auto param = TestableAudioParam(0.0, 0.0, 1.0, context);\n  auto curve = std::make_shared<AudioArray>(2);\n  curve->span()[0] = 0.0f;\n  curve->span()[1] = 1.0f;\n  param.setValueCurveAtTime(curve, 2, 0.0, 0.2); // curve ends at t=0.2\n  param.setValueAtTime(0.5, 0.4);\n  param.cancelAndHoldAtTime(0.3); // after curve end — event at 0.4 removed\n\n  EXPECT_FLOAT_EQ(param.process(0.2), 1.0f);\n  EXPECT_FLOAT_EQ(param.process(0.3), 1.0f);\n  EXPECT_FLOAT_EQ(param.process(0.4), 1.0f); // event gone — holds\n}\n\n// NOLINTEND\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/core/effects/DelayTest.cpp",
    "content": "#include <audioapi/core/OfflineAudioContext.h>\n#include <audioapi/core/effects/DelayNode.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <gtest/gtest.h>\n#include <test/src/MockAudioEventHandlerRegistry.h>\n#include <memory>\n\nusing namespace audioapi;\n\n// NOLINTBEGIN\n\nclass DelayTest : public ::testing::Test {\n protected:\n  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;\n  std::shared_ptr<OfflineAudioContext> context;\n  static constexpr int sampleRate = 44100;\n\n  void SetUp() override {\n    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();\n    context = std::make_shared<OfflineAudioContext>(\n        2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});\n    context->initialize();\n  }\n};\n\nclass TestableDelayNode : public DelayNode {\n public:\n  explicit TestableDelayNode(std::shared_ptr<BaseAudioContext> context, const DelayOptions &options)\n      : DelayNode(context, options) {}\n\n  void setDelayTimeParam(float value) {\n    getDelayTimeParam()->setValue(value);\n  }\n\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override {\n    return DelayNode::processNode(processingBuffer, framesToProcess);\n  }\n};\n\nTEST_F(DelayTest, DelayCanBeCreated) {\n  auto delay = context->createDelay(DelayOptions());\n  ASSERT_NE(delay, nullptr);\n}\n\nTEST_F(DelayTest, DelayWithZeroDelayOutputsInputSignal) {\n  static constexpr float DELAY_TIME = 0.0f;\n  static constexpr int FRAMES_TO_PROCESS = 4;\n  auto options = DelayOptions();\n  options.maxDelayTime = 1.0f;\n  auto delayNode = TestableDelayNode(context, options);\n  delayNode.setDelayTimeParam(DELAY_TIME);\n\n  auto buffer = std::make_shared<audioapi::DSPAudioBuffer>(FRAMES_TO_PROCESS, 1, sampleRate);\n  for (size_t i = 0; i < buffer->getSize(); ++i) {\n    (*buffer->getChannel(0))[i] = i + 1;\n  }\n\n  auto resultBuffer = delayNode.processNode(buffer, FRAMES_TO_PROCESS);\n  for (size_t i = 0; i < FRAMES_TO_PROCESS; ++i) {\n    EXPECT_FLOAT_EQ((*resultBuffer->getChannel(0))[i], static_cast<float>(i + 1));\n  }\n}\n\nTEST_F(DelayTest, DelayAppliesTimeShiftCorrectly) {\n  float DELAY_TIME = (128.0 / context->getSampleRate()) * 0.5;\n  static constexpr int FRAMES_TO_PROCESS = 128;\n  auto options = DelayOptions();\n  options.maxDelayTime = 1.0f;\n  auto delayNode = TestableDelayNode(context, options);\n  delayNode.setDelayTimeParam(DELAY_TIME);\n\n  auto buffer = std::make_shared<audioapi::DSPAudioBuffer>(FRAMES_TO_PROCESS, 1, sampleRate);\n  for (size_t i = 0; i < buffer->getSize(); ++i) {\n    (*buffer->getChannel(0))[i] = i + 1;\n  }\n\n  auto resultBuffer = delayNode.processNode(buffer, FRAMES_TO_PROCESS);\n  for (size_t i = 0; i < FRAMES_TO_PROCESS; ++i) {\n    if (i < FRAMES_TO_PROCESS / 2) { // First 64 samples should be zero due to delay\n      EXPECT_FLOAT_EQ((*resultBuffer->getChannel(0))[i], 0.0f);\n    } else {\n      EXPECT_FLOAT_EQ(\n          (*resultBuffer->getChannel(0))[i],\n          static_cast<float>(\n              i + 1 - FRAMES_TO_PROCESS / 2.0)); // Last 64 samples should be 1st part of buffer\n    }\n  }\n}\n\nTEST_F(DelayTest, DelayHandlesTailCorrectly) {\n  float DELAY_TIME = (128.0 / context->getSampleRate()) * 0.5;\n  static constexpr int FRAMES_TO_PROCESS = 128;\n  auto options = DelayOptions();\n  options.maxDelayTime = 1.0f;\n  auto delayNode = TestableDelayNode(context, options);\n  delayNode.setDelayTimeParam(DELAY_TIME);\n\n  auto buffer = std::make_shared<audioapi::DSPAudioBuffer>(FRAMES_TO_PROCESS, 1, sampleRate);\n  for (size_t i = 0; i < buffer->getSize(); ++i) {\n    (*buffer->getChannel(0))[i] = i + 1;\n  }\n\n  delayNode.processNode(buffer, FRAMES_TO_PROCESS);\n  auto resultBuffer = delayNode.processNode(buffer, FRAMES_TO_PROCESS);\n  for (size_t i = 0; i < FRAMES_TO_PROCESS; ++i) {\n    if (i < FRAMES_TO_PROCESS / 2) { // First 64 samples should be 2nd part of buffer\n      EXPECT_FLOAT_EQ(\n          (*resultBuffer->getChannel(0))[i], static_cast<float>(i + 1 + FRAMES_TO_PROCESS / 2.0));\n    } else {\n      EXPECT_FLOAT_EQ((*resultBuffer->getChannel(0))[i],\n                      0.0f); // Last 64 samples should be zero\n    }\n  }\n}\n\n// NOLINTEND\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/core/effects/GainTest.cpp",
    "content": "#include <audioapi/core/OfflineAudioContext.h>\n#include <audioapi/core/effects/GainNode.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <gtest/gtest.h>\n#include <test/src/MockAudioEventHandlerRegistry.h>\n#include <memory>\n\nusing namespace audioapi;\n\n// NOLINTBEGIN\n\nclass GainTest : public ::testing::Test {\n protected:\n  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;\n  std::shared_ptr<OfflineAudioContext> context;\n  static constexpr int sampleRate = 44100;\n\n  void SetUp() override {\n    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();\n    context = std::make_shared<OfflineAudioContext>(\n        2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});\n    context->initialize();\n  }\n};\n\nclass TestableGainNode : public GainNode {\n public:\n  explicit TestableGainNode(std::shared_ptr<BaseAudioContext> context)\n      : GainNode(context, GainOptions()) {}\n\n  void setGainParam(float value) {\n    getGainParam()->setValue(value);\n  }\n\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override {\n    return GainNode::processNode(processingBuffer, framesToProcess);\n  }\n};\n\nTEST_F(GainTest, GainCanBeCreated) {\n  auto gain = context->createGain(GainOptions());\n  ASSERT_NE(gain, nullptr);\n}\n\nTEST_F(GainTest, GainModulatesVolumeCorrectly) {\n  static constexpr float GAIN_VALUE = 0.5f;\n  static constexpr int FRAMES_TO_PROCESS = 4;\n  auto gainNode = TestableGainNode(context);\n  gainNode.setGainParam(GAIN_VALUE);\n\n  auto buffer = std::make_shared<audioapi::DSPAudioBuffer>(FRAMES_TO_PROCESS, 1, sampleRate);\n  for (size_t i = 0; i < buffer->getSize(); ++i) {\n    (*buffer->getChannel(0))[i] = i + 1;\n  }\n\n  auto resultBuffer = gainNode.processNode(buffer, FRAMES_TO_PROCESS);\n  for (size_t i = 0; i < FRAMES_TO_PROCESS; ++i) {\n    EXPECT_FLOAT_EQ((*resultBuffer->getChannel(0))[i], (i + 1) * GAIN_VALUE);\n  }\n}\n\nTEST_F(GainTest, GainModulatesVolumeCorrectlyMultiChannel) {\n  static constexpr float GAIN_VALUE = 0.5f;\n  static constexpr int FRAMES_TO_PROCESS = 4;\n  auto gainNode = TestableGainNode(context);\n  gainNode.setGainParam(GAIN_VALUE);\n\n  auto buffer = std::make_shared<audioapi::DSPAudioBuffer>(FRAMES_TO_PROCESS, 2, sampleRate);\n  for (size_t i = 0; i < buffer->getSize(); ++i) {\n    (*buffer->getChannel(0))[i] = i + 1;\n    (*buffer->getChannel(1))[i] = -i - 1;\n  }\n\n  auto resultBuffer = gainNode.processNode(buffer, FRAMES_TO_PROCESS);\n  for (size_t i = 0; i < FRAMES_TO_PROCESS; ++i) {\n    EXPECT_FLOAT_EQ((*resultBuffer->getChannel(0))[i], (i + 1) * GAIN_VALUE);\n    EXPECT_FLOAT_EQ((*resultBuffer->getChannel(1))[i], (-i - 1) * GAIN_VALUE);\n  }\n}\n\n// NOLINTEND\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/core/effects/IIRFilterTest.cpp",
    "content": "#include <audioapi/core/OfflineAudioContext.h>\n#include <audioapi/core/effects/IIRFilterNode.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/types/NodeOptions.h>\n#include <gtest/gtest.h>\n#include <test/src/MockAudioEventHandlerRegistry.h>\n#include <complex>\n#include <memory>\n#include <numbers>\n#include <vector>\n\nusing namespace audioapi;\n\n// NOLINTBEGIN\n\nclass IIRFilterTest : public ::testing::Test {\n protected:\n  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;\n  std::shared_ptr<OfflineAudioContext> context;\n  static constexpr int sampleRate = 44100;\n  static constexpr float nyquistFrequency = sampleRate / 2.0f;\n  static constexpr float tolerance = 0.0001f;\n\n  void SetUp() override {\n    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();\n    context = std::make_shared<OfflineAudioContext>(\n        2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});\n  }\n\n  static std::complex<double>\n  evaluatePolynomial(std::span<const double> coefficients, std::complex<double> z, int order) {\n    // Use Horner's method to evaluate the polynomial P(z) = sum(coef[k]*z^k, k, 0, order);\n    std::complex<double> result = 0;\n    for (int k = order; k >= 0; --k)\n      result = result * z + std::complex<double>(coefficients[k]);\n    return result;\n  }\n\n  static void getFrequencyResponseChromium(\n      std::vector<float> feedforward,\n      std::vector<float> feedback,\n      unsigned length,\n      std::span<const float> frequency,\n      std::span<float> magResponse,\n      std::span<float> phaseResponse,\n      float nyquistFrequency) {\n    assert(!frequency.empty());\n    assert(!magResponse.empty());\n    assert(!phaseResponse.empty());\n\n    std::vector<double> m_feedforward(feedforward.begin(), feedforward.end());\n    std::vector<double> m_feedback(feedback.begin(), feedback.end());\n\n    std::vector<float> normalizedFreq(frequency.size());\n    for (size_t i = 0; i < frequency.size(); ++i) {\n      normalizedFreq[i] = frequency[i] / nyquistFrequency;\n    }\n\n    // Evaluate the z-transform of the filter at the given normalized frequencies\n    // from 0 to 1. (One corresponds to the Nyquist frequency.)\n    //\n    // The z-tranform of the filter is\n    //\n    // H(z) = sum(b[k]*z^(-k), k, 0, M) / sum(a[k]*z^(-k), k, 0, N);\n    //\n    // The desired frequency response is H(exp(j*omega)), where omega is in [0,\n    // 1).\n    //\n    // Let P(x) = sum(c[k]*x^k, k, 0, P) be a polynomial of order P. Then each of\n    // the sums in H(z) is equivalent to evaluating a polynomial at the point\n    // 1/z.\n\n    for (unsigned k = 0; k < length; ++k) {\n      if (normalizedFreq[k] < 0 || normalizedFreq[k] > 1) {\n        // Out-of-bounds frequencies should return NaN.\n        magResponse[k] = std::nanf(\"\");\n        phaseResponse[k] = std::nanf(\"\");\n      } else {\n        // zRecip = 1/z = exp(-j*frequency)\n        double omega = -std::numbers::pi * normalizedFreq[k];\n        auto zRecip = std::complex<double>(cos(omega), sin(omega));\n\n        auto numerator = evaluatePolynomial(m_feedforward, zRecip, m_feedforward.size() - 1);\n        auto denominator = evaluatePolynomial(m_feedback, zRecip, m_feedback.size() - 1);\n        auto response = numerator / denominator;\n        magResponse[k] = static_cast<float>(std::abs(response));\n        phaseResponse[k] = static_cast<float>(atan2(imag(response), real(response)));\n      }\n    }\n  }\n};\n\nTEST_F(IIRFilterTest, IIRFilterCanBeCreated) {\n  const std::vector<float> feedforward = {1.0};\n  const std::vector<float> feedback = {1.0};\n  auto node = context->createIIRFilter(IIRFilterOptions(feedforward, feedback));\n  ASSERT_NE(node, nullptr);\n}\n\nTEST_F(IIRFilterTest, GetFrequencyResponse) {\n  const std::vector<float> feedforward = {0.0050662636, 0.0101325272, 0.0050662636};\n  const std::vector<float> feedback = {1.0632762845, -1.9797349456, 0.9367237155};\n\n  auto node = IIRFilterNode(context, IIRFilterOptions(feedforward, feedback));\n\n  float frequency = 1000.0f;\n  float normalizedFrequency = frequency / nyquistFrequency;\n\n  std::vector<float> TestFrequencies = {\n      -0.0001f,\n      0.0f,\n      0.0001f,\n      0.25f * nyquistFrequency,\n      0.5f * nyquistFrequency,\n      0.75f * nyquistFrequency,\n      nyquistFrequency - 0.0001f,\n      nyquistFrequency,\n      nyquistFrequency + 0.0001f};\n\n  std::vector<float> magResponseNode(TestFrequencies.size());\n  std::vector<float> phaseResponseNode(TestFrequencies.size());\n  std::vector<float> magResponseExpected(TestFrequencies.size());\n  std::vector<float> phaseResponseExpected(TestFrequencies.size());\n\n  node.getFrequencyResponse(\n      TestFrequencies.data(),\n      magResponseNode.data(),\n      phaseResponseNode.data(),\n      TestFrequencies.size());\n  getFrequencyResponseChromium(\n      feedforward,\n      feedback,\n      TestFrequencies.size(),\n      TestFrequencies,\n      magResponseExpected,\n      phaseResponseExpected,\n      nyquistFrequency);\n\n  for (size_t i = 0; i < TestFrequencies.size(); ++i) {\n    float f = TestFrequencies[i];\n    if (std::isnan(magResponseExpected[i])) {\n      EXPECT_TRUE(std::isnan(magResponseNode[i])) << \"Expected NaN at frequency \" << f;\n    } else {\n      EXPECT_NEAR(magResponseNode[i], magResponseExpected[i], tolerance)\n          << \"Magnitude mismatch at \" << f << \" Hz\";\n    }\n\n    if (std::isnan(phaseResponseExpected[i])) {\n      EXPECT_TRUE(std::isnan(phaseResponseNode[i])) << \"Expected NaN at frequency \" << f;\n    } else {\n      EXPECT_NEAR(phaseResponseNode[i], phaseResponseExpected[i], tolerance)\n          << \"Phase mismatch at \" << f << \" Hz\";\n    }\n  }\n}\n\n// NOLINTEND\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/core/effects/StereoPannerTest.cpp",
    "content": "#include <audioapi/core/OfflineAudioContext.h>\n#include <audioapi/core/effects/StereoPannerNode.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <gtest/gtest.h>\n#include <test/src/MockAudioEventHandlerRegistry.h>\n#include <memory>\n\nusing namespace audioapi;\n\n// NOLINTBEGIN\n\nclass StereoPannerTest : public ::testing::Test {\n protected:\n  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;\n  std::shared_ptr<OfflineAudioContext> context;\n  static constexpr int sampleRate = 44100;\n\n  void SetUp() override {\n    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();\n    context = std::make_shared<OfflineAudioContext>(\n        2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});\n    context->initialize();\n  }\n};\n\nclass TestableStereoPannerNode : public StereoPannerNode {\n public:\n  explicit TestableStereoPannerNode(std::shared_ptr<BaseAudioContext> context)\n      : StereoPannerNode(context, StereoPannerOptions()) {}\n\n  void setPanParam(float value) {\n    getPanParam()->setValue(value);\n  }\n\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override {\n    return StereoPannerNode::processNode(processingBuffer, framesToProcess);\n  }\n};\n\nTEST_F(StereoPannerTest, StereoPannerCanBeCreated) {\n  auto panner = context->createStereoPanner(StereoPannerOptions());\n  ASSERT_NE(panner, nullptr);\n}\n\nTEST_F(StereoPannerTest, PanModulatesInputMonoCorrectly) {\n  static constexpr float PAN_VALUE = 0.5;\n  static constexpr int FRAMES_TO_PROCESS = 4;\n  auto panNode = TestableStereoPannerNode(context);\n  panNode.setPanParam(PAN_VALUE);\n\n  auto buffer = std::make_shared<audioapi::DSPAudioBuffer>(FRAMES_TO_PROCESS, 1, sampleRate);\n  for (size_t i = 0; i < buffer->getSize(); ++i) {\n    (*buffer->getChannelByType(AudioBuffer::ChannelLeft))[i] = i + 1;\n  }\n\n  auto resultBuffer = panNode.processNode(buffer, FRAMES_TO_PROCESS);\n  // x = (0.5 + 1) / 2 = 0.75\n  // gainL = cos(x * (π / 2)) = cos(0.75 * (π / 2)) = 0.38268343236508984\n  // gainR = sin(x * (π / 2)) = sin(0.75 * (π / 2)) = 0.9238795325112867\n  for (size_t i = 0; i < FRAMES_TO_PROCESS; ++i) {\n    EXPECT_NEAR(\n        (*resultBuffer->getChannelByType(AudioBuffer::ChannelLeft))[i],\n        (i + 1) * 0.38268343236508984,\n        1e-4);\n    EXPECT_NEAR(\n        (*resultBuffer->getChannelByType(AudioBuffer::ChannelRight))[i],\n        (i + 1) * 0.9238795325112867,\n        1e-4);\n  }\n}\n\nTEST_F(StereoPannerTest, PanModulatesInputStereoCorrectlyWithNegativePan) {\n  static constexpr float PAN_VALUE = -0.5;\n  static constexpr int FRAMES_TO_PROCESS = 4;\n  auto panNode = TestableStereoPannerNode(context);\n  panNode.setPanParam(PAN_VALUE);\n\n  auto buffer = std::make_shared<audioapi::DSPAudioBuffer>(FRAMES_TO_PROCESS, 2, sampleRate);\n  for (size_t i = 0; i < buffer->getSize(); ++i) {\n    (*buffer->getChannelByType(AudioBuffer::ChannelLeft))[i] = i + 1;\n    (*buffer->getChannelByType(AudioBuffer::ChannelRight))[i] = i + 1;\n  }\n\n  auto resultBuffer = panNode.processNode(buffer, FRAMES_TO_PROCESS);\n  // x = -0.5 + 1 = 0.5\n  // gainL = cos(x * (π / 2)) = cos(0.5 * (π / 2)) = 0.7071067811865476\n  // gainR = sin(x * (π / 2)) = sin(0.5 * (π / 2)) = 0.7071067811865476\n  for (size_t i = 0; i < FRAMES_TO_PROCESS; ++i) {\n    EXPECT_NEAR(\n        (*resultBuffer->getChannelByType(AudioBuffer::ChannelLeft))[i],\n        (i + 1) + (i + 1) * 0.7071067811865476,\n        1e-4);\n    EXPECT_NEAR(\n        (*resultBuffer->getChannelByType(AudioBuffer::ChannelRight))[i],\n        (i + 1) * 0.7071067811865476,\n        1e-4);\n  }\n}\n\nTEST_F(StereoPannerTest, PanModulatesInputStereoCorrectlyWithPositivePan) {\n  static constexpr float PAN_VALUE = 0.75;\n  static constexpr int FRAMES_TO_PROCESS = 4;\n  auto panNode = TestableStereoPannerNode(context);\n  panNode.setPanParam(PAN_VALUE);\n\n  auto buffer = std::make_shared<audioapi::DSPAudioBuffer>(FRAMES_TO_PROCESS, 2, sampleRate);\n  for (size_t i = 0; i < buffer->getSize(); ++i) {\n    (*buffer->getChannelByType(AudioBuffer::ChannelLeft))[i] = i + 1;\n    (*buffer->getChannelByType(AudioBuffer::ChannelRight))[i] = i + 1;\n  }\n\n  auto resultBuffer = panNode.processNode(buffer, FRAMES_TO_PROCESS);\n  // x = 0.75\n  // gainL = cos(x * (π / 2)) = cos(0.75 * (π / 2)) = 0.38268343236508984\n  // gainR = sin(x * (π / 2)) = sin(0.75 * (π / 2)) = 0.9238795325112867\n  for (size_t i = 0; i < FRAMES_TO_PROCESS; ++i) {\n    EXPECT_NEAR(\n        (*resultBuffer->getChannelByType(AudioBuffer::ChannelLeft))[i],\n        (i + 1) * 0.38268343236508984,\n        1e-4);\n    EXPECT_NEAR(\n        (*resultBuffer->getChannelByType(AudioBuffer::ChannelRight))[i],\n        (i + 1) + (i + 1) * 0.9238795325112867,\n        1e-4);\n  }\n}\n\n// NOLINTEND\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/core/effects/WaveShaperNodeTest.cpp",
    "content": "#include <audioapi/core/OfflineAudioContext.h>\n#include <audioapi/core/effects/WaveShaperNode.h>\n#include <audioapi/core/types/OverSampleType.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <gtest/gtest.h>\n#include <test/src/MockAudioEventHandlerRegistry.h>\n#include <memory>\n\nusing namespace audioapi;\n\n// NOLINTBEGIN\n\nclass WaveShaperNodeTest : public ::testing::Test {\n protected:\n  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;\n  std::shared_ptr<OfflineAudioContext> context;\n  static constexpr int sampleRate = 44100;\n\n  void SetUp() override {\n    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();\n    context = std::make_shared<OfflineAudioContext>(\n        2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});\n  }\n};\n\nclass TestableWaveShaperNode : public WaveShaperNode {\n public:\n  explicit TestableWaveShaperNode(std::shared_ptr<BaseAudioContext> context)\n      : WaveShaperNode(context, WaveShaperOptions()) {\n    testCurve_ = std::make_shared<AudioArray>(3);\n    auto data = testCurve_->span();\n    data[0] = -2.0f;\n    data[1] = 0.0f;\n    data[2] = 2.0f;\n  }\n\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override {\n    return WaveShaperNode::processNode(processingBuffer, framesToProcess);\n  }\n\n  std::shared_ptr<AudioArray> testCurve_;\n};\n\nTEST_F(WaveShaperNodeTest, WaveShaperNodeCanBeCreated) {\n  auto waveShaper = context->createWaveShaper(WaveShaperOptions());\n  ASSERT_NE(waveShaper, nullptr);\n}\n\nTEST_F(WaveShaperNodeTest, NullCanBeAsignedToCurve) {\n  auto waveShaper = context->createWaveShaper(WaveShaperOptions());\n  ASSERT_NO_THROW(waveShaper->setCurve(nullptr));\n}\n\nTEST_F(WaveShaperNodeTest, NoneOverSamplingProcessesCorrectly) {\n  static constexpr int FRAMES_TO_PROCESS = 5;\n  auto waveShaper = std::make_shared<TestableWaveShaperNode>(context);\n  waveShaper->setOversample(OverSampleType::OVERSAMPLE_NONE);\n  waveShaper->setCurve(waveShaper->testCurve_);\n\n  auto buffer = std::make_shared<audioapi::DSPAudioBuffer>(FRAMES_TO_PROCESS, 1, sampleRate);\n  for (size_t i = 0; i < buffer->getSize(); ++i) {\n    (*buffer->getChannel(0))[i] = -1.0f + i * 0.5f;\n  }\n\n  auto resultBuffer = waveShaper->processNode(buffer, FRAMES_TO_PROCESS);\n  auto curveData = waveShaper->testCurve_->span();\n  auto resultData = resultBuffer->getChannel(0)->span();\n\n  EXPECT_FLOAT_EQ(resultData[0], curveData[0]);\n  EXPECT_FLOAT_EQ(resultData[1], -1.0f);\n  EXPECT_FLOAT_EQ(resultData[2], 0.0f);\n  EXPECT_FLOAT_EQ(resultData[3], 1.0f);\n  EXPECT_FLOAT_EQ(resultData[4], curveData[2]);\n}\n\n// NOLINTEND\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/core/effects/biquad/BiquadFilterChromium.cpp",
    "content": "/*\n * Copyright (C) 2010 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1.  Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n * 3.  Neither the name of Apple Computer, Inc. (\"Apple\") nor the names of\n *     its contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include <assert.h>\n#include <audioapi/core/utils/Constants.h>\n#include <test/src/core/effects/biquad/BiquadFilterChromium.h>\n#include <algorithm>\n#include <cmath>\n#include <complex>\n#include <span>\n#include <vector>\n\nnamespace audioapi {\n\n// NOLINTBEGIN\n\n// Compute 10^x = exp(x*log(10))\nstatic double pow10(double x) {\n  return std::exp(x * 2.30258509299404568402);\n}\n\nvoid getFrequencyResponse(\n    const BiquadCoefficients &coeffs,\n    std::span<const float> frequency,\n    std::span<float> mag_response,\n    std::span<float> phase_response,\n    float nyquistFrequency) {\n  assert(!frequency.empty());\n  assert(!mag_response.empty());\n  assert(!phase_response.empty());\n\n  std::vector<float> normalizedFreq(frequency.size());\n  for (size_t i = 0; i < frequency.size(); ++i) {\n    normalizedFreq[i] = frequency[i] / nyquistFrequency;\n  }\n\n  // Evaluate the Z-transform of the filter at given normalized\n  // frequency from 0 to 1.  (1 corresponds to the Nyquist\n  // frequency.)\n  //\n  // The z-transform of the filter is\n  //\n  // H(z) = (b0 + b1*z^(-1) + b2*z^(-2))/(1 + a1*z^(-1) + a2*z^(-2))\n  //\n  // Evaluate as\n  //\n  // b0 + (b1 + b2*z1)*z1\n  // --------------------\n  // 1 + (a1 + a2*z1)*z1\n  //\n  // with z1 = 1/z and z = exp(j*pi*frequency). Hence z1 = exp(-j*pi*frequency)\n\n  double b0 = coeffs.b0;\n  double b1 = coeffs.b1;\n  double b2 = coeffs.b2;\n  double a1 = coeffs.a1;\n  double a2 = coeffs.a2;\n\n  for (size_t k = 0; k < normalizedFreq.size(); ++k) {\n    if (normalizedFreq[k] < 0.0 || normalizedFreq[k] > 1.0) {\n      // Out-of-bounds frequencies should return NaN.\n      mag_response[k] = std::nanf(\"\");\n      phase_response[k] = std::nanf(\"\");\n    } else {\n      double omega = -PI * normalizedFreq[k];\n      std::complex<double> z = std::complex<double>(std::cos(omega), std::sin(omega));\n      std::complex<double> numerator = b0 + (b1 + b2 * z) * z;\n      std::complex<double> denominator = std::complex<double>(1, 0) + (a1 + a2 * z) * z;\n      std::complex<double> response = numerator / denominator;\n      mag_response[k] = static_cast<float>(abs(response));\n      phase_response[k] = static_cast<float>(std::atan2(imag(response), real(response)));\n    }\n  }\n}\n\nBiquadCoefficients\nnormalizeCoefficients(double b0, double b1, double b2, double a0, double a1, double a2) {\n  return BiquadCoefficients{b0 / a0, b1 / a0, b2 / a0, a1 / a0, a2 / a0};\n}\n\nBiquadCoefficients calculateLowpassCoefficients(double cutoff, double resonance) {\n  // Limit cutoff to 0 to 1.\n  cutoff = std::clamp(cutoff, 0.0, 1.0);\n\n  if (cutoff == 1) {\n    // When cutoff is 1, the z-transform is 1.\n    return normalizeCoefficients(1, 0, 0, 1, 0, 0);\n  } else if (cutoff > 0) {\n    // Compute biquad coefficients for lowpass filter\n\n    resonance = pow10(resonance / 20);\n\n    double theta = kPiDouble * cutoff;\n    double alpha = std::sin(theta) / (2 * resonance);\n    double cosw = std::cos(theta);\n    double beta = (1 - cosw) / 2;\n\n    double b0 = beta;\n    double b1 = 2 * beta;\n    double b2 = beta;\n\n    double a0 = 1 + alpha;\n    double a1 = -2 * cosw;\n    double a2 = 1 - alpha;\n\n    return normalizeCoefficients(b0, b1, b2, a0, a1, a2);\n  } else {\n    // When cutoff is zero, nothing gets through the filter, so set\n    // coefficients up correctly.\n    return normalizeCoefficients(0, 0, 0, 1, 0, 0);\n  }\n}\n\nBiquadCoefficients calculateHighpassCoefficients(double cutoff, double resonance) {\n  // Limit cutoff to 0 to 1.\n  cutoff = std::clamp(cutoff, 0.0, 1.0);\n\n  if (cutoff == 1) {\n    // The z-transform is 0.\n    return normalizeCoefficients(0, 0, 0, 1, 0, 0);\n  } else if (cutoff > 0) {\n    // Compute biquad coefficients for highpass filter\n\n    resonance = pow10(resonance / 20);\n    double theta = kPiDouble * cutoff;\n    double alpha = std::sin(theta) / (2 * resonance);\n    double cosw = std::cos(theta);\n    double beta = (1 + cosw) / 2;\n\n    double b0 = beta;\n    double b1 = -2 * beta;\n    double b2 = beta;\n\n    double a0 = 1 + alpha;\n    double a1 = -2 * cosw;\n    double a2 = 1 - alpha;\n\n    return normalizeCoefficients(b0, b1, b2, a0, a1, a2);\n  } else {\n    // When cutoff is zero, we need to be careful because the above\n    // gives a quadratic divided by the same quadratic, with poles\n    // and zeros on the unit circle in the same place. When cutoff\n    // is zero, the z-transform is 1.\n    return normalizeCoefficients(1, 0, 0, 1, 0, 0);\n  }\n}\n\nBiquadCoefficients calculateLowshelfCoefficients(double frequency, double db_gain) {\n  // Clip frequencies to between 0 and 1, inclusive.\n  frequency = std::clamp(frequency, 0.0, 1.0);\n\n  double a = pow10(db_gain / 40);\n\n  if (frequency == 1) {\n    // The z-transform is a constant gain.\n    return normalizeCoefficients(a * a, 0, 0, 1, 0, 0);\n  } else if (frequency > 0) {\n    double w0 = kPiDouble * frequency;\n    double s = 1; // filter slope (1 is max value)\n    double alpha = 0.5 * std::sin(w0) * sqrt((a + 1 / a) * (1 / s - 1) + 2);\n    double k = std::cos(w0);\n    double k2 = 2 * sqrt(a) * alpha;\n    double a_plus_one = a + 1;\n    double a_minus_one = a - 1;\n\n    double b0 = a * (a_plus_one - a_minus_one * k + k2);\n    double b1 = 2 * a * (a_minus_one - a_plus_one * k);\n    double b2 = a * (a_plus_one - a_minus_one * k - k2);\n    double a0 = a_plus_one + a_minus_one * k + k2;\n    double a1 = -2 * (a_minus_one + a_plus_one * k);\n    double a2 = a_plus_one + a_minus_one * k - k2;\n\n    return normalizeCoefficients(b0, b1, b2, a0, a1, a2);\n  } else {\n    // When frequency is 0, the z-transform is 1.\n    return normalizeCoefficients(1, 0, 0, 1, 0, 0);\n  }\n}\n\nBiquadCoefficients calculateHighshelfCoefficients(double frequency, double db_gain) {\n  // Clip frequencies to between 0 and 1, inclusive.\n  frequency = std::clamp(frequency, 0.0, 1.0);\n\n  double a = pow10(db_gain / 40);\n\n  if (frequency == 1) {\n    // The z-transform is 1.\n    return normalizeCoefficients(1, 0, 0, 1, 0, 0);\n  } else if (frequency > 0) {\n    double w0 = kPiDouble * frequency;\n    double s = 1; // filter slope (1 is max value)\n    double alpha = 0.5 * std::sin(w0) * sqrt((a + 1 / a) * (1 / s - 1) + 2);\n    double k = std::cos(w0);\n    double k2 = 2 * sqrt(a) * alpha;\n    double a_plus_one = a + 1;\n    double a_minus_one = a - 1;\n\n    double b0 = a * (a_plus_one + a_minus_one * k + k2);\n    double b1 = -2 * a * (a_minus_one + a_plus_one * k);\n    double b2 = a * (a_plus_one + a_minus_one * k - k2);\n    double a0 = a_plus_one - a_minus_one * k + k2;\n    double a1 = 2 * (a_minus_one - a_plus_one * k);\n    double a2 = a_plus_one - a_minus_one * k - k2;\n\n    return normalizeCoefficients(b0, b1, b2, a0, a1, a2);\n  } else {\n    // When frequency = 0, the filter is just a gain, A^2.\n    return normalizeCoefficients(a * a, 0, 0, 1, 0, 0);\n  }\n}\n\nBiquadCoefficients calculatePeakingCoefficients(double frequency, double q, double db_gain) {\n  // Clip frequencies to between 0 and 1, inclusive.\n  frequency = std::clamp(frequency, 0.0, 1.0);\n\n  // Don't let Q go negative, which causes an unstable filter.\n  q = std::max(0.0, q);\n\n  double a = pow10(db_gain / 40);\n\n  if (frequency > 0 && frequency < 1) {\n    if (q > 0) {\n      double w0 = kPiDouble * frequency;\n      double alpha = std::sin(w0) / (2 * q);\n      double k = std::cos(w0);\n\n      double b0 = 1 + alpha * a;\n      double b1 = -2 * k;\n      double b2 = 1 - alpha * a;\n      double a0 = 1 + alpha / a;\n      double a1 = -2 * k;\n      double a2 = 1 - alpha / a;\n\n      return normalizeCoefficients(b0, b1, b2, a0, a1, a2);\n    } else {\n      // When Q = 0, the above formulas have problems. If we look at\n      // the z-transform, we can see that the limit as Q->0 is A^2, so\n      // set the filter that way.\n      return normalizeCoefficients(a * a, 0, 0, 1, 0, 0);\n    }\n  } else {\n    // When frequency is 0 or 1, the z-transform is 1.\n    return normalizeCoefficients(1, 0, 0, 1, 0, 0);\n  }\n}\n\nBiquadCoefficients calculateAllpassCoefficients(double frequency, double q) {\n  // Clip frequencies to between 0 and 1, inclusive.\n  frequency = std::clamp(frequency, 0.0, 1.0);\n\n  // Don't let Q go negative, which causes an unstable filter.\n  q = std::max(0.0, q);\n\n  if (frequency > 0 && frequency < 1) {\n    if (q > 0) {\n      double w0 = kPiDouble * frequency;\n      double alpha = std::sin(w0) / (2 * q);\n      double k = std::cos(w0);\n\n      double b0 = 1 - alpha;\n      double b1 = -2 * k;\n      double b2 = 1 + alpha;\n      double a0 = 1 + alpha;\n      double a1 = -2 * k;\n      double a2 = 1 - alpha;\n\n      return normalizeCoefficients(b0, b1, b2, a0, a1, a2);\n    } else {\n      // When Q = 0, the above formulas have problems. If we look at\n      // the z-transform, we can see that the limit as Q->0 is -1, so\n      // set the filter that way.\n      return normalizeCoefficients(-1, 0, 0, 1, 0, 0);\n    }\n  } else {\n    // When frequency is 0 or 1, the z-transform is 1.\n    return normalizeCoefficients(1, 0, 0, 1, 0, 0);\n  }\n}\n\nBiquadCoefficients calculateNotchCoefficients(double frequency, double q) {\n  // Clip frequencies to between 0 and 1, inclusive.\n  frequency = std::clamp(frequency, 0.0, 1.0);\n\n  // Don't let Q go negative, which causes an unstable filter.\n  q = std::max(0.0, q);\n\n  if (frequency > 0 && frequency < 1) {\n    if (q > 0) {\n      double w0 = kPiDouble * frequency;\n      double alpha = std::sin(w0) / (2 * q);\n      double k = std::cos(w0);\n\n      double b0 = 1;\n      double b1 = -2 * k;\n      double b2 = 1;\n      double a0 = 1 + alpha;\n      double a1 = -2 * k;\n      double a2 = 1 - alpha;\n\n      return normalizeCoefficients(b0, b1, b2, a0, a1, a2);\n    } else {\n      // When Q = 0, the above formulas have problems. If we look at\n      // the z-transform, we can see that the limit as Q->0 is 0, so\n      // set the filter that way.\n      return normalizeCoefficients(0, 0, 0, 1, 0, 0);\n    }\n  } else {\n    // When frequency is 0 or 1, the z-transform is 1.\n    return normalizeCoefficients(1, 0, 0, 1, 0, 0);\n  }\n}\n\nBiquadCoefficients calculateBandpassCoefficients(double frequency, double q) {\n  // No negative frequencies allowed.\n  frequency = std::max(0.0, frequency);\n\n  // Don't let Q go negative, which causes an unstable filter.\n  q = std::max(0.0, q);\n\n  if (frequency > 0 && frequency < 1) {\n    double w0 = kPiDouble * frequency;\n    if (q > 0) {\n      double alpha = std::sin(w0) / (2 * q);\n      double k = std::cos(w0);\n\n      double b0 = alpha;\n      double b1 = 0;\n      double b2 = -alpha;\n      double a0 = 1 + alpha;\n      double a1 = -2 * k;\n      double a2 = 1 - alpha;\n\n      return normalizeCoefficients(b0, b1, b2, a0, a1, a2);\n    } else {\n      // When Q = 0, the above formulas have problems. If we look at\n      // the z-transform, we can see that the limit as Q->0 is 1, so\n      // set the filter that way.\n      return normalizeCoefficients(1, 0, 0, 1, 0, 0);\n    }\n  } else {\n    // When the cutoff is zero, the z-transform approaches 0, if Q\n    // > 0. When both Q and cutoff are zero, the z-transform is\n    // pretty much undefined. What should we do in this case?\n    // For now, just make the filter 0. When the cutoff is 1, the\n    // z-transform also approaches 0.\n    return normalizeCoefficients(0, 0, 0, 1, 0, 0);\n  }\n}\n\n// NOLINTEND\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/core/effects/biquad/BiquadFilterChromium.h",
    "content": "/*\n * Copyright (C) 2010 Google Inc. All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1.  Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n * 2.  Redistributions in binary form must reproduce the above copyright\n *     notice, this list of conditions and the following disclaimer in the\n *     documentation and/or other materials provided with the distribution.\n * 3.  Neither the name of Apple Computer, Inc. (\"Apple\") nor the names of\n *     its contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS \"AS IS\" AND ANY\n * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#pragma once\n\n#include <numbers>\n#include <span>\n\nnamespace audioapi {\n\nconstexpr double kPiDouble = std::numbers::pi_v<double>;\n\nstruct BiquadCoefficients {\n  double b0;\n  double b1;\n  double b2;\n  double a1;\n  double a2;\n};\n\nvoid getFrequencyResponse(\n    const BiquadCoefficients &coeffs,\n    std::span<const float> frequency,\n    std::span<float> mag_response,\n    std::span<float> phase_response,\n    float nyquistFrequency);\n\nBiquadCoefficients\nnormalizeCoefficients(double b0, double b1, double b2, double a0, double a1, double a2);\n\nBiquadCoefficients calculateLowpassCoefficients(double cutoff, double Q);\nBiquadCoefficients calculateHighpassCoefficients(double cutoff, double Q);\nBiquadCoefficients calculateBandpassCoefficients(double frequency, double Q);\nBiquadCoefficients calculateNotchCoefficients(double frequency, double Q);\nBiquadCoefficients calculateAllpassCoefficients(double frequency, double Q);\nBiquadCoefficients calculatePeakingCoefficients(double frequency, double Q, double db_gain);\nBiquadCoefficients calculateLowshelfCoefficients(double frequency, double db_gain);\nBiquadCoefficients calculateHighshelfCoefficients(double frequency, double db_gain);\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/core/effects/biquad/BiquadFilterTest.cpp",
    "content": "#include <audioapi/types/NodeOptions.h>\n#include <test/src/core/effects/biquad/BiquadFilterChromium.h>\n#include <test/src/core/effects/biquad/BiquadFilterTest.h>\n#include <memory>\n#include <vector>\n\nnamespace audioapi {\n\n// NOLINTBEGIN\n\nvoid BiquadFilterTest::expectCoefficientsNear(\n    const BiquadFilterNode::FilterCoefficients &actual,\n    const BiquadCoefficients &expected) {\n  EXPECT_NEAR(actual.b0, expected.b0, tolerance);\n  EXPECT_NEAR(actual.b1, expected.b1, tolerance);\n  EXPECT_NEAR(actual.b2, expected.b2, tolerance);\n  EXPECT_NEAR(actual.a1, expected.a1, tolerance);\n  EXPECT_NEAR(actual.a2, expected.a2, tolerance);\n}\n\nvoid BiquadFilterTest::testLowpass(float frequency, float Q) {\n  float normalizedFrequency = frequency / nyquistFrequency;\n  auto coeffs = BiquadFilterNode::getLowpassCoefficients(normalizedFrequency, Q);\n  expectCoefficientsNear(coeffs, calculateLowpassCoefficients(normalizedFrequency, Q));\n}\n\nvoid BiquadFilterTest::testHighpass(float frequency, float Q) {\n  float normalizedFrequency = frequency / nyquistFrequency;\n  auto coeffs = BiquadFilterNode::getHighpassCoefficients(normalizedFrequency, Q);\n  expectCoefficientsNear(coeffs, calculateHighpassCoefficients(normalizedFrequency, Q));\n}\n\nvoid BiquadFilterTest::testBandpass(float frequency, float Q) {\n  float normalizedFrequency = frequency / nyquistFrequency;\n  auto coeffs = BiquadFilterNode::getBandpassCoefficients(normalizedFrequency, Q);\n  expectCoefficientsNear(coeffs, calculateBandpassCoefficients(normalizedFrequency, Q));\n}\n\nvoid BiquadFilterTest::testNotch(float frequency, float Q) {\n  float normalizedFrequency = frequency / nyquistFrequency;\n  auto coeffs = BiquadFilterNode::getNotchCoefficients(normalizedFrequency, Q);\n  expectCoefficientsNear(coeffs, calculateNotchCoefficients(normalizedFrequency, Q));\n}\n\nvoid BiquadFilterTest::testAllpass(float frequency, float Q) {\n  float normalizedFrequency = frequency / nyquistFrequency;\n  auto coeffs = BiquadFilterNode::getAllpassCoefficients(normalizedFrequency, Q);\n  expectCoefficientsNear(coeffs, calculateAllpassCoefficients(normalizedFrequency, Q));\n}\n\nvoid BiquadFilterTest::testPeaking(float frequency, float Q, float gain) {\n  float normalizedFrequency = frequency / nyquistFrequency;\n  auto coeffs = BiquadFilterNode::getPeakingCoefficients(normalizedFrequency, Q, gain);\n  expectCoefficientsNear(coeffs, calculatePeakingCoefficients(normalizedFrequency, Q, gain));\n}\n\nvoid BiquadFilterTest::testLowshelf(float frequency, float gain) {\n  float normalizedFrequency = frequency / nyquistFrequency;\n  auto coeffs = BiquadFilterNode::getLowshelfCoefficients(normalizedFrequency, gain);\n  expectCoefficientsNear(coeffs, calculateLowshelfCoefficients(normalizedFrequency, gain));\n}\n\nvoid BiquadFilterTest::testHighshelf(float frequency, float gain) {\n  float normalizedFrequency = frequency / nyquistFrequency;\n  auto coeffs = BiquadFilterNode::getHighshelfCoefficients(normalizedFrequency, gain);\n  expectCoefficientsNear(coeffs, calculateHighshelfCoefficients(normalizedFrequency, gain));\n}\n\nINSTANTIATE_TEST_SUITE_P(\n    Frequencies,\n    BiquadFilterFrequencyTest,\n    ::testing::Values(\n        0.0f,                       // 0 Hz - the filter should block all input signal\n        10.0f,                      // very low frequency\n        350.0f,                     // default\n        nyquistFrequency - 0.0001f, // frequency near Nyquist\n        nyquistFrequency));         // maximal frequency\n\nINSTANTIATE_TEST_SUITE_P(\n    QEdgeCases,\n    BiquadFilterQTestLowpassHighpass,\n    ::testing::Values(\n        -770.63678f,  // min value for lowpass and highpass\n        0.0f,         // default\n        770.63678f)); // max value for lowpass and highpass\n\nINSTANTIATE_TEST_SUITE_P(\n    QEdgeCases,\n    BiquadFilterQTestRestTypes, // bandpass, notch, allpass, peaking\n    ::testing::Values(\n        0.0f, // default and min value\n        MOST_POSITIVE_SINGLE_FLOAT));\n\nINSTANTIATE_TEST_SUITE_P(\n    GainEdgeCases,\n    BiquadFilterGainTest,\n    ::testing::Values(\n        -40.0f,\n        0.0f, // default\n        40.0f));\n\nTEST_P(BiquadFilterFrequencyTest, TestLowpassCoefficients) {\n  float frequency = GetParam();\n  float Q = 1.0f;\n  testLowpass(frequency, Q);\n}\n\nTEST_P(BiquadFilterFrequencyTest, TestHighpassCoefficients) {\n  float frequency = GetParam();\n  float Q = 1.0f;\n  testHighpass(frequency, Q);\n}\n\nTEST_P(BiquadFilterFrequencyTest, TestBandpassCoefficients) {\n  float frequency = GetParam();\n  float Q = 1.0f;\n  testBandpass(frequency, Q);\n}\n\nTEST_P(BiquadFilterFrequencyTest, TestNotchCoefficients) {\n  float frequency = GetParam();\n  float Q = 1.0f;\n  testNotch(frequency, Q);\n}\n\nTEST_P(BiquadFilterFrequencyTest, TestAllpassCoefficients) {\n  float frequency = GetParam();\n  float Q = 1.0f;\n  testAllpass(frequency, Q);\n}\n\nTEST_P(BiquadFilterFrequencyTest, TestPeakingCoefficients) {\n  float frequency = GetParam();\n  float Q = 1.0f;\n  float gain = 2.0f;\n  testPeaking(frequency, Q, gain);\n}\n\nTEST_P(BiquadFilterFrequencyTest, TestLowshelfCoefficients) {\n  float frequency = GetParam();\n  float gain = 2.0f;\n  testLowshelf(frequency, gain);\n}\n\nTEST_P(BiquadFilterFrequencyTest, TestHighshelfCoefficients) {\n  float frequency = GetParam();\n  float gain = 2.0f;\n  testHighshelf(frequency, gain);\n}\n\nTEST_P(BiquadFilterQTestLowpassHighpass, TestLowpassCoefficients) {\n  float frequency = 1000.0f;\n  float Q = GetParam();\n  testLowpass(frequency, Q);\n}\n\nTEST_P(BiquadFilterQTestLowpassHighpass, TestHighpassCoefficients) {\n  float frequency = 1000.0f;\n  float Q = GetParam();\n  testHighpass(frequency, Q);\n}\n\nTEST_P(BiquadFilterQTestRestTypes, TestBandpassCoefficients) {\n  float frequency = 1000.0f;\n  float Q = GetParam();\n  testBandpass(frequency, Q);\n}\n\nTEST_P(BiquadFilterQTestRestTypes, TestNotchCoefficients) {\n  float frequency = 1000.0f;\n  float Q = GetParam();\n  testNotch(frequency, Q);\n}\n\nTEST_P(BiquadFilterQTestRestTypes, TestAllpassCoefficients) {\n  float frequency = 1000.0f;\n  float Q = GetParam();\n  testAllpass(frequency, Q);\n}\n\nTEST_P(BiquadFilterQTestRestTypes, TestPeakingCoefficients) {\n  float frequency = 1000.0f;\n  float Q = GetParam();\n  float gain = 2.0f;\n  testPeaking(frequency, Q, gain);\n}\n\nTEST_P(BiquadFilterGainTest, TestPeakingCoefficients) {\n  float frequency = 1000.0f;\n  float Q = 1.0f;\n  float gain = GetParam();\n  testPeaking(frequency, Q, gain);\n}\n\nTEST_P(BiquadFilterGainTest, TestLowshelfCoefficients) {\n  float frequency = 1000.0f;\n  float gain = GetParam();\n  testLowshelf(frequency, gain);\n}\n\nTEST_P(BiquadFilterGainTest, TestHighshelfCoefficients) {\n  float frequency = 1000.0f;\n  float gain = GetParam();\n  testHighshelf(frequency, gain);\n}\n\nTEST_F(BiquadFilterTest, GetFrequencyResponse) {\n  auto node = BiquadFilterNode(context, BiquadFilterOptions());\n\n  float frequency = 1000.0f;\n  float Q = 1.0f;\n  float normalizedFrequency = frequency / nyquistFrequency;\n\n  node.frequencyParam_->setValue(frequency);\n  node.QParam_->setValue(Q);\n  auto coeffs = calculateLowpassCoefficients(normalizedFrequency, Q);\n\n  std::vector<float> TestFrequencies = {\n      -0.0001f,\n      0.0f,\n      0.0001f,\n      0.25f * nyquistFrequency,\n      0.5f * nyquistFrequency,\n      0.75f * nyquistFrequency,\n      nyquistFrequency - 0.0001f,\n      nyquistFrequency,\n      nyquistFrequency + 0.0001f};\n\n  std::vector<float> magResponseNode(TestFrequencies.size());\n  std::vector<float> phaseResponseNode(TestFrequencies.size());\n  std::vector<float> magResponseExpected(TestFrequencies.size());\n  std::vector<float> phaseResponseExpected(TestFrequencies.size());\n\n  node.getFrequencyResponse(\n      TestFrequencies.data(),\n      magResponseNode.data(),\n      phaseResponseNode.data(),\n      TestFrequencies.size(),\n      BiquadFilterType::LOWPASS);\n  getFrequencyResponse(\n      coeffs, TestFrequencies, magResponseExpected, phaseResponseExpected, nyquistFrequency);\n\n  for (size_t i = 0; i < TestFrequencies.size(); ++i) {\n    float f = TestFrequencies[i];\n    if (std::isnan(magResponseExpected[i])) {\n      EXPECT_TRUE(std::isnan(magResponseNode[i])) << \"Expected NaN at frequency \" << f;\n    } else {\n      EXPECT_NEAR(magResponseNode[i], magResponseExpected[i], tolerance)\n          << \"Magnitude mismatch at \" << f << \" Hz\";\n    }\n\n    if (std::isnan(phaseResponseExpected[i])) {\n      EXPECT_TRUE(std::isnan(phaseResponseNode[i])) << \"Expected NaN at frequency \" << f;\n    } else {\n      EXPECT_NEAR(phaseResponseNode[i], phaseResponseExpected[i], tolerance)\n          << \"Phase mismatch at \" << f << \" Hz\";\n    }\n  }\n}\n\n} // namespace audioapi\n\n// NOLINTEND\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/core/effects/biquad/BiquadFilterTest.h",
    "content": "#pragma once\n\n#include <audioapi/core/OfflineAudioContext.h>\n#include <audioapi/core/effects/BiquadFilterNode.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <gtest/gtest.h>\n#include <test/src/MockAudioEventHandlerRegistry.h>\n#include <memory>\n\nstatic constexpr int sampleRate = 44100;\nstatic constexpr float nyquistFrequency = sampleRate / 2.0f;\nstatic constexpr float tolerance = 0.0001f;\n\nnamespace audioapi {\nclass BiquadFilterTest : public ::testing::Test {\n protected:\n  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;\n  std::shared_ptr<OfflineAudioContext> context;\n\n  void SetUp() override {\n    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();\n    context = std::make_shared<OfflineAudioContext>(\n        2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});\n  }\n\n  void expectCoefficientsNear(\n      const BiquadFilterNode::FilterCoefficients &actual,\n      const BiquadCoefficients &expected);\n  void testLowpass(float frequency, float Q);\n  void testHighpass(float frequency, float Q);\n  void testBandpass(float frequency, float Q);\n  void testNotch(float frequency, float Q);\n  void testAllpass(float frequency, float Q);\n  void testPeaking(float frequency, float Q, float gain);\n  void testLowshelf(float frequency, float gain);\n  void testHighshelf(float frequency, float gain);\n};\n\nclass BiquadFilterQTestLowpassHighpass : public BiquadFilterTest,\n                                         public ::testing::WithParamInterface<float> {};\nclass BiquadFilterQTestRestTypes : public BiquadFilterTest,\n                                   public ::testing::WithParamInterface<float> {};\nclass BiquadFilterFrequencyTest : public BiquadFilterTest,\n                                  public ::testing::WithParamInterface<float> {};\nclass BiquadFilterGainTest : public BiquadFilterTest,\n                             public ::testing::WithParamInterface<float> {};\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/core/sources/AudioScheduledSourceTest.cpp",
    "content": "#include <audioapi/core/OfflineAudioContext.h>\n#include <audioapi/core/destinations/AudioDestinationNode.h>\n#include <audioapi/core/sources/AudioScheduledSourceNode.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <gtest/gtest.h>\n#include <test/src/MockAudioEventHandlerRegistry.h>\n#include <memory>\n\nusing namespace audioapi;\n\n// NOLINTBEGIN\n\nstatic constexpr int SAMPLE_RATE = 44100;\nstatic constexpr int RENDER_QUANTUM = 128;\nstatic constexpr double RENDER_QUANTUM_TIME = static_cast<double>(RENDER_QUANTUM) / SAMPLE_RATE;\n\nclass AudioScheduledSourceTest : public ::testing::Test {\n protected:\n  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;\n  std::shared_ptr<OfflineAudioContext> context;\n\n  void SetUp() override {\n    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();\n    context = std::make_shared<OfflineAudioContext>(\n        2, 5 * SAMPLE_RATE, SAMPLE_RATE, eventRegistry, RuntimeRegistry{});\n    context->initialize();\n  }\n};\n\nclass TestableAudioScheduledSourceNode : public AudioScheduledSourceNode {\n public:\n  explicit TestableAudioScheduledSourceNode(std::shared_ptr<BaseAudioContext> context)\n      : AudioScheduledSourceNode(context) {\n    isInitialized_.store(true, std::memory_order_release);\n  }\n\n  void updatePlaybackInfo(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess,\n      size_t &startOffset,\n      size_t &nonSilentFramesToProcess,\n      float sampleRate,\n      size_t currentSampleFrame) {\n    AudioScheduledSourceNode::updatePlaybackInfo(\n        processingBuffer,\n        framesToProcess,\n        startOffset,\n        nonSilentFramesToProcess,\n        sampleRate,\n        currentSampleFrame);\n  }\n\n  std::shared_ptr<DSPAudioBuffer> processNode(const std::shared_ptr<DSPAudioBuffer> &, int)\n      override {\n    return nullptr;\n  }\n\n  PlaybackState getPlaybackState() const {\n    return playbackState_;\n  }\n\n  void playFrames(int frames) {\n    if (std::shared_ptr<BaseAudioContext> context = context_.lock()) {\n      size_t startOffset = 0;\n      size_t nonSilentFramesToProcess = 0;\n      auto processingBuffer =\n          std::make_shared<DSPAudioBuffer>(128, 2, static_cast<float>(SAMPLE_RATE));\n      updatePlaybackInfo(\n          processingBuffer,\n          frames,\n          startOffset,\n          nonSilentFramesToProcess,\n          context->getSampleRate(),\n          context->getCurrentSampleFrame());\n      context->getDestination()->renderAudio(processingBuffer, frames);\n    }\n  }\n};\n\nTEST_F(AudioScheduledSourceTest, IsUnscheduledStateSetCorrectly) {\n  auto sourceNode = TestableAudioScheduledSourceNode(context);\n  EXPECT_EQ(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::UNSCHEDULED);\n\n  sourceNode.start(RENDER_QUANTUM_TIME);\n  EXPECT_NE(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::UNSCHEDULED);\n}\n\nTEST_F(AudioScheduledSourceTest, IsScheduledStateSetCorrectly) {\n  auto sourceNode = TestableAudioScheduledSourceNode(context);\n  sourceNode.start(RENDER_QUANTUM_TIME);\n  EXPECT_EQ(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::SCHEDULED);\n\n  sourceNode.playFrames(RENDER_QUANTUM);\n  EXPECT_EQ(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::SCHEDULED);\n\n  sourceNode.playFrames(1);\n  EXPECT_NE(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::SCHEDULED);\n}\n\nTEST_F(AudioScheduledSourceTest, IsPlayingStateSetCorrectly) {\n  auto sourceNode = TestableAudioScheduledSourceNode(context);\n  sourceNode.start(0);\n  sourceNode.stop(RENDER_QUANTUM_TIME);\n\n  sourceNode.playFrames(RENDER_QUANTUM);\n  EXPECT_EQ(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::PLAYING);\n\n  sourceNode.playFrames(1);\n  EXPECT_NE(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::PLAYING);\n}\n\nTEST_F(AudioScheduledSourceTest, IsStopScheduledStateSetCorrectly) {\n  auto sourceNode = TestableAudioScheduledSourceNode(context);\n  sourceNode.start(0);\n  sourceNode.stop(RENDER_QUANTUM_TIME);\n  sourceNode.playFrames(1); // start playing\n  sourceNode.playFrames(RENDER_QUANTUM);\n  EXPECT_EQ(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::STOP_SCHEDULED);\n\n  sourceNode.playFrames(1);\n  EXPECT_NE(sourceNode.getPlaybackState(), AudioScheduledSourceNode::PlaybackState::STOP_SCHEDULED);\n}\n\nTEST_F(AudioScheduledSourceTest, IsFinishedStateSetCorrectly) {\n  auto sourceNode = TestableAudioScheduledSourceNode(context);\n  sourceNode.start(0);\n  sourceNode.stop(RENDER_QUANTUM_TIME);\n  sourceNode.playFrames(1); // start playing\n\n  sourceNode.playFrames(RENDER_QUANTUM);\n  sourceNode.playFrames(1);\n  EXPECT_TRUE(sourceNode.isFinished());\n}\n\n// NOLINTEND\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/core/sources/ConstantSourceTest.cpp",
    "content": "#include <audioapi/core/OfflineAudioContext.h>\n#include <audioapi/core/sources/ConstantSourceNode.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/types/NodeOptions.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <gtest/gtest.h>\n#include <test/src/MockAudioEventHandlerRegistry.h>\n#include <memory>\n\nusing namespace audioapi;\n\n// NOLINTBEGIN\n\nclass ConstantSourceTest : public ::testing::Test {\n protected:\n  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;\n  std::shared_ptr<OfflineAudioContext> context;\n  static constexpr int sampleRate = 44100;\n\n  void SetUp() override {\n    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();\n    context = std::make_shared<OfflineAudioContext>(\n        2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});\n    context->initialize();\n  }\n};\n\nclass TestableConstantSourceNode : public ConstantSourceNode {\n public:\n  explicit TestableConstantSourceNode(std::shared_ptr<BaseAudioContext> context)\n      : ConstantSourceNode(context, ConstantSourceOptions()) {}\n\n  void setOffsetParam(float value) {\n    getOffsetParam()->setValue(value);\n  }\n\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBuffer,\n      int framesToProcess) override {\n    return ConstantSourceNode::processNode(processingBuffer, framesToProcess);\n  }\n};\n\nTEST_F(ConstantSourceTest, ConstantSourceCanBeCreated) {\n  auto constantSource = context->createConstantSource(ConstantSourceOptions());\n  ASSERT_NE(constantSource, nullptr);\n}\n\nTEST_F(ConstantSourceTest, ConstantSourceOutputsConstantValue) {\n  static constexpr int FRAMES_TO_PROCESS = 4;\n\n  auto buffer = std::make_shared<audioapi::DSPAudioBuffer>(FRAMES_TO_PROCESS, 1, sampleRate);\n  auto constantSource = TestableConstantSourceNode(context);\n  // constantSource.start(context->getCurrentTime());\n  // auto resultBuffer = constantSource.processNode(buffer, FRAMES_TO_PROCESS);\n\n  // for (int i = 0; i < FRAMES_TO_PROCESS; ++i) {\n  //   EXPECT_FLOAT_EQ((*resultBuffer->getChannel(0))[i], 1.0f);\n  // }\n\n  // constantSource.setOffsetParam(0.5f);\n  // resultBuffer = constantSource.processNode(buffer, FRAMES_TO_PROCESS);\n  // for (int i = 0; i < FRAMES_TO_PROCESS; ++i) {\n  //   EXPECT_FLOAT_EQ((*resultBuffer->getChannel(0))[i], 0.5f);\n  // }\n}\n\n// NOLINTEND\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/core/sources/OscillatorTest.cpp",
    "content": "#include <audioapi/core/OfflineAudioContext.h>\n#include <audioapi/core/sources/OscillatorNode.h>\n#include <audioapi/core/utils/worklets/SafeIncludes.h>\n#include <audioapi/types/NodeOptions.h>\n#include <gtest/gtest.h>\n#include <test/src/MockAudioEventHandlerRegistry.h>\n#include <memory>\n\nusing namespace audioapi;\n\n// NOLINTBEGIN\n\nclass OscillatorTest : public ::testing::Test {\n protected:\n  std::shared_ptr<MockAudioEventHandlerRegistry> eventRegistry;\n  std::shared_ptr<OfflineAudioContext> context;\n  static constexpr int sampleRate = 44100;\n\n  void SetUp() override {\n    eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();\n    context = std::make_shared<OfflineAudioContext>(\n        2, 5 * sampleRate, sampleRate, eventRegistry, RuntimeRegistry{});\n  }\n};\n\nTEST_F(OscillatorTest, OscillatorCanBeCreated) {\n  auto osc = context->createOscillator(OscillatorOptions());\n  ASSERT_NE(osc, nullptr);\n}\n\n// NOLINTEND\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/graph/AudioGraphFuzzTest.cpp",
    "content": "#include <audioapi/core/utils/graph/AudioGraph.hpp>\n#include <audioapi/core/utils/graph/NodeHandle.hpp>\n#include <gtest/gtest.h>\n#include \"TestGraphUtils.h\"\n\n#include <algorithm>\n#include <iostream>\n#include <memory>\n#include <random>\n#include <set>\n#include <string>\n#include <vector>\n\nnamespace audioapi::utils::graph {\n\n/// Randomized single-threaded AudioGraph test.\n/// Directly mutates the AudioGraph the same way HostGraph events do,\n/// then calls process() and verifies invariants:\n///   1. No input index >= size (dangling index)\n///   2. No duplicate inputs\n///   3. No cycles (Kahn's algorithm)\n///   4. handle->index matches actual position\nclass AudioGraphFuzzTest : public ::testing::TestWithParam<uint64_t> {\n protected:\n  using MNode = MockNode;\n\n  AudioGraph<MNode> graph;\n  std::mt19937_64 rng;\n\n  // Track live handles so we can reference them\n  std::vector<std::shared_ptr<NodeHandle<MNode>>> handles;\n  size_t nextId = 0;\n\n  void SetUp() override {\n    rng.seed(GetParam());\n  }\n\n  // ── Helpers ─────────────────────────────────────────────────────────────\n\n  std::shared_ptr<NodeHandle<MNode>> doAddNode() {\n    auto h = std::make_shared<NodeHandle<MNode>>(0, std::make_unique<MNode>());\n    graph.addNode(h);\n    graph[h->index].test_node_identifier__ = nextId++;\n    handles.push_back(h);\n    return h;\n  }\n\n  void doOrphanNode(size_t handleIdx) {\n    auto &h = handles[handleIdx];\n    graph[h->index].orphaned = true;\n    // Don't null the handle — AudioGraph still has the node.\n    // pickLive() will skip it because it checks orphaned status.\n  }\n\n  void doAddEdge(std::shared_ptr<NodeHandle<MNode>> &from, std::shared_ptr<NodeHandle<MNode>> &to) {\n    auto fromIdx = from->index;\n    auto toIdx = to->index;\n    // Verify at point-of-add that this edge doesn't create a duplicate\n    for (auto inp : graph.pool().view(graph[toIdx].input_head)) {\n      if (inp == fromIdx) {\n        FAIL() << \"BUG: doAddEdge called but edge already exists! \"\n               << \"from=\" << fromIdx << \"(id=\" << graph[fromIdx].test_node_identifier__\n               << \") to=\" << toIdx << \"(id=\" << graph[toIdx].test_node_identifier__ << \")\";\n      }\n    }\n    graph.pool().push(graph[toIdx].input_head, fromIdx);\n    graph.markDirty();\n  }\n\n  void doRemoveEdge(\n      std::shared_ptr<NodeHandle<MNode>> &from,\n      std::shared_ptr<NodeHandle<MNode>> &to) {\n    // Same as what HostGraph's removeEdge event does\n    graph.pool().remove(graph[to->index].input_head, from->index);\n    graph.markDirty();\n  }\n\n  // ── Invariant checks ───────────────────────────────────────────────────\n\n  /// Check that no input index is out of bounds.\n  void assertNoOOBInputs() {\n    auto n = static_cast<uint32_t>(graph.size());\n    for (uint32_t i = 0; i < n; i++) {\n      for (auto inp : graph.pool().view(graph[i].input_head)) {\n        ASSERT_LT(inp, n) << \"Node[\" << i << \"] (id=\" << graph[i].test_node_identifier__\n                          << \") has OOB input index \" << inp << \" (graph size=\" << n << \")\";\n      }\n    }\n  }\n\n  /// Check that no node has duplicate inputs. Returns true if duplicates found.\n  bool checkDuplicateInputs(const std::string &context) {\n    bool found = false;\n    auto n = static_cast<uint32_t>(graph.size());\n    for (uint32_t i = 0; i < n; i++) {\n      std::set<uint32_t> seen;\n      for (auto inp : graph.pool().view(graph[i].input_head)) {\n        if (!seen.insert(inp).second) {\n          if (!found) {\n            std::cerr << \"\\n!!! DUPLICATE INPUTS \" << context << \"\\n\";\n            found = true;\n          }\n          std::cerr << \"  Node[\" << i << \"] (id=\" << graph[i].test_node_identifier__\n                    << \") has duplicate input \" << inp\n                    << \" (id=\" << graph[inp].test_node_identifier__ << \")\\n\";\n        }\n      }\n    }\n    return found;\n  }\n\n  /// Check that handle->index matches actual position.\n  void assertHandleIndicesCorrect() {\n    auto n = static_cast<uint32_t>(graph.size());\n    for (uint32_t i = 0; i < n; i++) {\n      ASSERT_EQ(graph[i].handle->index, i)\n          << \"Node[\" << i << \"] (id=\" << graph[i].test_node_identifier__\n          << \") handle->index=\" << graph[i].handle->index;\n    }\n  }\n\n  /// Check that graph has no cycles via Kahn's algorithm.\n  bool hasCycle() const {\n    auto n = static_cast<uint32_t>(graph.size());\n    if (n <= 1)\n      return false;\n\n    std::vector<uint32_t> outDeg(n, 0);\n    for (uint32_t i = 0; i < n; i++) {\n      for (auto inp : graph.pool().view(graph[i].input_head)) {\n        if (inp < n)\n          outDeg[inp]++;\n      }\n    }\n\n    std::vector<uint32_t> queue;\n    for (uint32_t i = 0; i < n; i++) {\n      if (outDeg[i] == 0)\n        queue.push_back(i);\n    }\n\n    uint32_t visited = 0;\n    size_t head = 0;\n    while (head < queue.size()) {\n      auto idx = queue[head++];\n      visited++;\n      for (auto inp : graph.pool().view(graph[idx].input_head)) {\n        if (inp < n && --outDeg[inp] == 0)\n          queue.push_back(inp);\n      }\n    }\n    return visited != n;\n  }\n\n  void dumpGraph() const {\n    auto n = static_cast<uint32_t>(graph.size());\n    std::cerr << \"=== AudioGraph dump (n=\" << n << \") ===\\n\";\n    for (uint32_t i = 0; i < n; i++) {\n      std::cerr << \"  [\" << i << \"] id=\" << graph[i].test_node_identifier__\n                << \" orphaned=\" << graph[i].orphaned << \" inputs={\";\n      bool first = true;\n      for (auto inp : graph.pool().view(graph[i].input_head)) {\n        if (!first)\n          std::cerr << \",\";\n        first = false;\n        if (inp < n)\n          std::cerr << inp << \"(id=\" << graph[inp].test_node_identifier__ << \")\";\n        else\n          std::cerr << inp << \"(OOB!)\";\n      }\n      std::cerr << \"}\\n\";\n    }\n  }\n\n  void assertAllInvariants(const std::string &context) {\n    assertNoOOBInputs();\n    if (checkDuplicateInputs(context)) {\n      dumpGraph();\n      FAIL() << \"Duplicate inputs found \" << context;\n    }\n    assertHandleIndicesCorrect();\n    if (hasCycle()) {\n      dumpGraph();\n      FAIL() << \"Cycle detected \" << context;\n    }\n  }\n\n  // ── Utility ─────────────────────────────────────────────────────────────\n\n  /// Pick a random live (non-null, non-orphaned) handle index\n  int pickLive() {\n    std::vector<int> live;\n    for (int i = 0; i < static_cast<int>(handles.size()); i++) {\n      if (handles[i] && handles[i]->index < graph.size() && !graph[handles[i]->index].orphaned)\n        live.push_back(i);\n    }\n    if (live.empty())\n      return -1;\n    return live[std::uniform_int_distribution<size_t>(0, live.size() - 1)(rng)];\n  }\n\n  /// Simple DFS cycle check: would adding from->to create a cycle?\n  /// (Check if there's already a path from \"from\" to \"to\" via inputs,\n  ///  i.e. \"to\" can reach \"from\" through the input edges.)\n  bool wouldCreateCycle(uint32_t fromIdx, uint32_t toIdx) {\n    // If adding fromIdx as input of toIdx, check if toIdx can reach fromIdx\n    // through existing inputs (meaning fromIdx depends on toIdx already).\n    auto n = static_cast<uint32_t>(graph.size());\n    if (fromIdx == toIdx)\n      return true;\n\n    std::vector<bool> visited(n, false);\n    std::vector<uint32_t> stack;\n    stack.push_back(fromIdx);\n    visited[fromIdx] = true;\n\n    while (!stack.empty()) {\n      auto cur = stack.back();\n      stack.pop_back();\n      for (auto inp : graph.pool().view(graph[cur].input_head)) {\n        if (inp == toIdx)\n          return true;\n        if (inp < n && !visited[inp]) {\n          visited[inp] = true;\n          stack.push_back(inp);\n        }\n      }\n    }\n    return false;\n  }\n\n  /// Check if edge already exists\n  bool edgeExists(uint32_t fromIdx, uint32_t toIdx) {\n    for (auto inp : graph.pool().view(graph[toIdx].input_head)) {\n      if (inp == fromIdx)\n        return true;\n    }\n    return false;\n  }\n};\n\n// =========================================================================\n// Test: random operations directly on AudioGraph, verify after each process()\n// =========================================================================\n\nTEST_P(AudioGraphFuzzTest, RandomOps) {\n  size_t initialCount = std::uniform_int_distribution<size_t>(8, 64)(rng);\n  size_t opCount = std::uniform_int_distribution<size_t>(100, 1000)(rng);\n\n  // Seed nodes\n  for (size_t i = 0; i < initialCount; i++) {\n    doAddNode();\n  }\n  graph.process();\n  assertAllInvariants(\"after initial seeding\");\n\n  for (size_t i = 0; i < opCount; i++) {\n    size_t op = std::uniform_int_distribution<size_t>(0, 99)(rng);\n\n    if (op < 15) {\n      // Add node\n      doAddNode();\n\n    } else if (op < 30) {\n      // Orphan a random live node\n      int idx = pickLive();\n      if (idx >= 0) {\n        doOrphanNode(idx);\n      }\n\n    } else if (op < 65) {\n      // Add edge (only if it won't create a cycle or duplicate)\n      int a = pickLive();\n      int b = pickLive();\n      if (a >= 0 && b >= 0 && a != b) {\n        auto fromIdx = handles[a]->index;\n        auto toIdx = handles[b]->index;\n        if (!edgeExists(fromIdx, toIdx) && !wouldCreateCycle(fromIdx, toIdx)) {\n          doAddEdge(handles[a], handles[b]);\n        }\n      }\n\n    } else if (op < 80) {\n      // Remove edge\n      int b = pickLive();\n      if (b >= 0) {\n        auto toIdx = handles[b]->index;\n        // Collect input values into a temporary vector for random selection\n        std::vector<uint32_t> inputVals;\n        for (auto inp : graph.pool().view(graph[toIdx].input_head)) {\n          inputVals.push_back(inp);\n        }\n        if (!inputVals.empty()) {\n          // Pick a random input to remove\n          auto inputIdx =\n              inputVals[std::uniform_int_distribution<size_t>(0, inputVals.size() - 1)(rng)];\n          // Find the handle with this index\n          for (auto &h : handles) {\n            if (h && h->index == inputIdx) {\n              doRemoveEdge(h, handles[b]);\n              break;\n            }\n          }\n        }\n      }\n\n    } else {\n      // Process\n      bool hadDupsBefore = checkDuplicateInputs(\"BEFORE process at op \" + std::to_string(i));\n      graph.process();\n\n      // Null out handles for nodes that were compacted away.\n      for (auto &h : handles) {\n        if (h && (h->index >= graph.size() || graph[h->index].handle != h)) {\n          h = nullptr;\n        }\n      }\n\n      bool hasDupsAfter = checkDuplicateInputs(\"AFTER process at op \" + std::to_string(i));\n      if (!hadDupsBefore && hasDupsAfter) {\n        std::cerr << \"\\n*** process() INTRODUCED duplicates at op \" << i << \" ***\\n\";\n        dumpGraph();\n        FAIL() << \"process() introduced duplicate inputs at op \" << i;\n      }\n\n      assertAllInvariants(\"after process() at op \" + std::to_string(i));\n    }\n\n    // Also check OOB before process (should never have OOB inputs)\n    // Note: after process we do full check above, but between ops we at least\n    // verify no OOB indices crept in\n    assertNoOOBInputs();\n  }\n\n  // Final process\n  graph.process();\n  for (auto &h : handles) {\n    if (h && (h->index >= graph.size() || graph[h->index].handle != h)) {\n      h = nullptr;\n    }\n  }\n  assertAllInvariants(\"after final process()\");\n}\n\nINSTANTIATE_TEST_SUITE_P(\n    Seeds,\n    AudioGraphFuzzTest,\n    ::testing::Range(uint64_t{0}, uint64_t{100}),\n    [](const ::testing::TestParamInfo<uint64_t> &info) {\n      return \"seed_\" + std::to_string(info.param);\n    });\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/graph/AudioGraphTest.cpp",
    "content": "#include <audioapi/core/utils/graph/AudioGraph.hpp>\n#include <audioapi/core/utils/graph/NodeHandle.hpp>\n#include <gtest/gtest.h>\n#include <algorithm>\n#include <memory>\n#include <utility>\n#include <vector>\n#include \"TestGraphUtils.h\"\n\nnamespace audioapi::utils::graph {\n\n// ---------------------------------------------------------------------------\n// Test fixture\n// ---------------------------------------------------------------------------\nclass AudioGraphTest : public ::testing::Test {\n protected:\n  AudioGraph<MockNode> graph;\n\n  // Helpers ----------------------------------------------------------------\n\n  /// @brief Creates a shared NodeHandle<MockNode> with no node (for structural tests)\n  std::shared_ptr<NodeHandle<MockNode>> makeHandle(size_t testId = 0) {\n    auto h = std::make_shared<NodeHandle<MockNode>>(0, nullptr);\n    return h;\n  }\n\n  /// @brief Creates a shared NodeHandle<MockNode> with a MockNode\n  std::shared_ptr<NodeHandle<MockNode>> makeHandleWithNode(bool destructible = true) {\n    return std::make_shared<NodeHandle<MockNode>>(0, std::make_unique<MockNode>(destructible));\n  }\n\n  /// @brief Adds N nodes with test identifiers 0..N-1 and returns their handles\n  std::vector<std::shared_ptr<NodeHandle<MockNode>>> addNodes(\n      size_t n,\n      bool withAudioNode = false) {\n    std::vector<std::shared_ptr<NodeHandle<MockNode>>> handles;\n    handles.reserve(n);\n    for (size_t i = 0; i < n; i++) {\n      auto h = withAudioNode ? makeHandleWithNode() : makeHandle(i);\n      graph.addNode(h);\n      graph[h->index].test_node_identifier__ = i;\n      handles.push_back(std::move(h));\n    }\n    return handles;\n  }\n\n  /// @brief Returns the test_node_identifier__ sequence after toposort\n  std::vector<size_t> getOrder() {\n    std::vector<size_t> order;\n    order.reserve(graph.size());\n    for (uint32_t i = 0; i < graph.size(); i++) {\n      order.push_back(graph[i].test_node_identifier__);\n    }\n    return order;\n  }\n\n  /// @brief Returns position of testId in the current order\n  int posOf(size_t testId) {\n    for (uint32_t i = 0; i < graph.size(); i++) {\n      if (graph[i].test_node_identifier__ == testId)\n        return static_cast<int>(i);\n    }\n    return -1;\n  }\n};\n\n// =====================================================================\n// addNode\n// =====================================================================\n\nTEST_F(AudioGraphTest, AddNode_AssignsSequentialIndices) {\n  auto h0 = makeHandle();\n  auto h1 = makeHandle();\n  auto h2 = makeHandle();\n  graph.addNode(h0);\n  graph.addNode(h1);\n  graph.addNode(h2);\n\n  EXPECT_EQ(h0->index, 0u);\n  EXPECT_EQ(h1->index, 1u);\n  EXPECT_EQ(h2->index, 2u);\n  EXPECT_EQ(graph.size(), 3u);\n}\n\nTEST_F(AudioGraphTest, AddNode_EmptyGraph) {\n  EXPECT_TRUE(graph.empty());\n  EXPECT_EQ(graph.size(), 0u);\n}\n\n// =====================================================================\n// Topological sort — simple chain\n// =====================================================================\n\nTEST_F(AudioGraphTest, TopoSort_LinearChain) {\n  // 0 -> 1 -> 2  (inputs: 1 has 0, 2 has 1)\n  auto h = addNodes(3);\n  graph.pool().push(graph[h[1]->index].input_head, h[0]->index);\n  graph.pool().push(graph[h[2]->index].input_head, h[1]->index);\n\n  graph.markDirty();\n  graph.process();\n\n  EXPECT_LT(posOf(0), posOf(1));\n  EXPECT_LT(posOf(1), posOf(2));\n}\n\nTEST_F(AudioGraphTest, TopoSort_ReversedInsertion) {\n  // Insert in reverse but edges say 0 -> 1 -> 2\n  auto h = addNodes(3);\n  // Wire: 2 needs 1, 1 needs 0\n  graph.pool().push(graph[h[2]->index].input_head, h[1]->index);\n  graph.pool().push(graph[h[1]->index].input_head, h[0]->index);\n\n  graph.markDirty();\n  graph.process();\n\n  EXPECT_LT(posOf(0), posOf(1));\n  EXPECT_LT(posOf(1), posOf(2));\n}\n\n// =====================================================================\n// Topological sort — diamond\n// =====================================================================\n\nTEST_F(AudioGraphTest, TopoSort_Diamond) {\n  //     0\n  //    / \\\n  //   1   2\n  //    \\ /\n  //     3\n  auto h = addNodes(4);\n  graph.pool().push(graph[h[1]->index].input_head, h[0]->index);\n  graph.pool().push(graph[h[2]->index].input_head, h[0]->index);\n  graph.pool().push(graph[h[3]->index].input_head, h[1]->index);\n  graph.pool().push(graph[h[3]->index].input_head, h[2]->index);\n\n  graph.markDirty();\n  graph.process();\n\n  EXPECT_LT(posOf(0), posOf(1));\n  EXPECT_LT(posOf(0), posOf(2));\n  EXPECT_LT(posOf(1), posOf(3));\n  EXPECT_LT(posOf(2), posOf(3));\n}\n\n// =====================================================================\n// Topological sort — multi-input fan-in\n// =====================================================================\n\nTEST_F(AudioGraphTest, TopoSort_FanIn) {\n  // 0, 1, 2 all feed into 3\n  auto h = addNodes(4);\n  graph.pool().push(graph[h[3]->index].input_head, h[0]->index);\n  graph.pool().push(graph[h[3]->index].input_head, h[1]->index);\n  graph.pool().push(graph[h[3]->index].input_head, h[2]->index);\n\n  graph.markDirty();\n  graph.process();\n\n  EXPECT_LT(posOf(0), posOf(3));\n  EXPECT_LT(posOf(1), posOf(3));\n  EXPECT_LT(posOf(2), posOf(3));\n}\n\n// =====================================================================\n// Topological sort — disconnected components\n// =====================================================================\n\nTEST_F(AudioGraphTest, TopoSort_DisconnectedComponents) {\n  // Two separate chains: 0->1   2->3\n  auto h = addNodes(4);\n  graph.pool().push(graph[h[1]->index].input_head, h[0]->index);\n  graph.pool().push(graph[h[3]->index].input_head, h[2]->index);\n\n  graph.markDirty();\n  graph.process();\n\n  EXPECT_LT(posOf(0), posOf(1));\n  EXPECT_LT(posOf(2), posOf(3));\n}\n\n// =====================================================================\n// Topological sort — single node (no edges)\n// =====================================================================\n\nTEST_F(AudioGraphTest, TopoSort_SingleNode) {\n  auto h = addNodes(1);\n\n  graph.markDirty();\n  graph.process();\n\n  EXPECT_EQ(graph.size(), 1u);\n  EXPECT_EQ(posOf(0), 0);\n}\n\n// =====================================================================\n// Topological sort — no-op when not dirty\n// =====================================================================\n\nTEST_F(AudioGraphTest, TopoSort_SkippedWhenNotDirty) {\n  auto h = addNodes(3);\n  graph.pool().push(graph[h[1]->index].input_head, h[0]->index);\n  graph.pool().push(graph[h[2]->index].input_head, h[1]->index);\n\n  graph.markDirty();\n  graph.process();\n\n  auto orderAfterFirst = getOrder();\n\n  // process again without marking dirty — order should stay identical\n  graph.process();\n\n  EXPECT_EQ(getOrder(), orderAfterFirst);\n}\n\n// =====================================================================\n// Compaction — orphaned leaf with canBeDestructed=true\n// =====================================================================\n\nTEST_F(AudioGraphTest, Compact_RemovesOrphanedDestructibleLeaf) {\n  // 3 nodes: 0 -> 1 -> 2, mark node 2 as orphaned\n  auto h = addNodes(3, /*withAudioNode=*/true);\n  graph.pool().push(graph[h[1]->index].input_head, h[0]->index);\n  graph.pool().push(graph[h[2]->index].input_head, h[1]->index);\n  graph[h[2]->index].orphaned = true;\n\n  // also clear node 2's inputs so it qualifies (orphaned + no inputs + canBeDestructed)\n  graph.pool().freeAll(graph[h[2]->index].input_head);\n\n  graph.markDirty();\n  graph.process();\n\n  EXPECT_EQ(graph.size(), 2u);\n  // Node 2 should be gone\n  EXPECT_EQ(posOf(2), -1);\n}\n\n// =====================================================================\n// Compaction — orphaned node with inputs is NOT removed\n// =====================================================================\n\nTEST_F(AudioGraphTest, Compact_KeepsOrphanedNodeWithInputs) {\n  auto h = addNodes(2, /*withAudioNode=*/true);\n  graph.pool().push(graph[h[1]->index].input_head, h[0]->index);\n  graph[h[1]->index].orphaned = true;\n\n  graph.markDirty();\n  graph.process();\n\n  // Node 1 is orphaned but still has inputs — should stay\n  EXPECT_EQ(graph.size(), 2u);\n}\n\n// =====================================================================\n// Compaction — orphaned node with canBeDestructed=false is NOT removed\n// =====================================================================\n\nTEST_F(AudioGraphTest, Compact_KeepsNonDestructible) {\n  auto h0 = makeHandleWithNode(/*destructible=*/true);\n  auto h1 = makeHandleWithNode(/*destructible=*/false); // can't be destructed\n\n  graph.addNode(h0);\n  graph[h0->index].test_node_identifier__ = 0;\n  graph.addNode(h1);\n  graph[h1->index].test_node_identifier__ = 1;\n\n  graph[h1->index].orphaned = true;\n  // h1 has no inputs, is orphaned, but canBeDestructed() returns false\n\n  graph.markDirty();\n  graph.process();\n\n  EXPECT_EQ(graph.size(), 2u); // still 2 — node 1 stays\n}\n\n// =====================================================================\n// Compaction — canBeDestructed becomes true later\n// =====================================================================\n\nTEST_F(AudioGraphTest, Compact_RemovesOnceDestructible) {\n  auto h0 = makeHandleWithNode(/*destructible=*/true);\n  auto h1 = makeHandleWithNode(/*destructible=*/false);\n\n  graph.addNode(h0);\n  graph[h0->index].test_node_identifier__ = 0;\n  graph.addNode(h1);\n  graph[h1->index].test_node_identifier__ = 1;\n\n  graph[h1->index].orphaned = true;\n\n  graph.markDirty();\n  graph.process(); // first pass: node 1 stays (not destructible)\n  EXPECT_EQ(graph.size(), 2u);\n\n  // Now make it destructible\n  h1->audioNode->setDestructible(true);\n\n  graph.process(); // second pass: node 1 should be removed\n  EXPECT_EQ(graph.size(), 1u);\n  EXPECT_EQ(posOf(1), -1);\n}\n\n// =====================================================================\n// Compaction — handle indices are updated correctly\n// =====================================================================\n\nTEST_F(AudioGraphTest, Compact_UpdatesHandleIndices) {\n  auto h = addNodes(4, /*withAudioNode=*/true);\n  // Chain: 0 -> 1 -> 2 -> 3\n  graph.pool().push(graph[h[1]->index].input_head, h[0]->index);\n  graph.pool().push(graph[h[2]->index].input_head, h[1]->index);\n  graph.pool().push(graph[h[3]->index].input_head, h[2]->index);\n\n  graph.markDirty();\n  graph.process();\n\n  // Now orphan node 1 (remove its inputs so it can be deleted)\n  graph[h[1]->index].orphaned = true;\n  graph.pool().freeAll(graph[h[1]->index].input_head);\n\n  // Also remove node 1 from node 2's inputs (otherwise it references a deleted node)\n  graph.pool().remove(graph[h[2]->index].input_head, h[1]->index);\n\n  graph.process();\n\n  // After compaction: 3 nodes remain (0, 2, 3)\n  EXPECT_EQ(graph.size(), 3u);\n\n  // Each surviving handle's index should match its actual position\n  for (uint32_t i = 0; i < graph.size(); i++) {\n    EXPECT_EQ(graph[i].handle->index, i);\n  }\n}\n\n// =====================================================================\n// Compaction — multiple orphaned nodes at once\n// =====================================================================\n\nTEST_F(AudioGraphTest, Compact_MultipleOrphans) {\n  auto h = addNodes(5, /*withAudioNode=*/true);\n  // No edges — all independent\n  graph[h[1]->index].orphaned = true;\n  graph[h[3]->index].orphaned = true;\n\n  graph.markDirty();\n  graph.process();\n\n  EXPECT_EQ(graph.size(), 3u);\n  EXPECT_NE(posOf(0), -1);\n  EXPECT_EQ(posOf(1), -1);\n  EXPECT_NE(posOf(2), -1);\n  EXPECT_EQ(posOf(3), -1);\n  EXPECT_NE(posOf(4), -1);\n\n  // Verify handle indices\n  for (uint32_t i = 0; i < graph.size(); i++) {\n    EXPECT_EQ(graph[i].handle->index, i);\n  }\n}\n\n// =====================================================================\n// Compaction — cascading removal (input removed causes downstream to become leaf)\n// =====================================================================\n\nTEST_F(AudioGraphTest, Compact_CascadingRemoval) {\n  // 0 -> 1 (orphaned), node 1 has no other inputs\n  // After removing 1, no further cascade because 0 is not orphaned\n  auto h = addNodes(2, /*withAudioNode=*/true);\n  graph.pool().push(graph[h[1]->index].input_head, h[0]->index);\n\n  // Orphan node 0 — it has no inputs, so it's removable\n  graph[h[0]->index].orphaned = true;\n\n  graph.markDirty();\n  graph.process();\n\n  // Node 0 should be removed (orphaned, no inputs, destructible)\n  // Node 1 still references old index of 0 in its inputs — that input will be cleaned on next process()\n  EXPECT_EQ(graph.size(), 1u);\n}\n\n// =====================================================================\n// Compaction — empty graph after removing all nodes\n// =====================================================================\n\nTEST_F(AudioGraphTest, Compact_RemoveAllNodes) {\n  auto h = addNodes(3, /*withAudioNode=*/true);\n  graph[h[0]->index].orphaned = true;\n  graph[h[1]->index].orphaned = true;\n  graph[h[2]->index].orphaned = true;\n\n  graph.markDirty();\n  graph.process();\n\n  EXPECT_EQ(graph.size(), 0u);\n  EXPECT_TRUE(graph.empty());\n}\n\n// =====================================================================\n// Process on empty graph — no crash\n// =====================================================================\n\nTEST_F(AudioGraphTest, Process_EmptyGraph) {\n  graph.process();\n  EXPECT_EQ(graph.size(), 0u);\n}\n\n// =====================================================================\n// MarkDirty — multiple calls are idempotent\n// =====================================================================\n\nTEST_F(AudioGraphTest, MarkDirty_Idempotent) {\n  auto h = addNodes(2);\n  graph.pool().push(graph[h[1]->index].input_head, h[0]->index);\n\n  graph.markDirty();\n  graph.markDirty();\n  graph.markDirty();\n  graph.process();\n\n  EXPECT_EQ(graph.size(), 2u);\n  EXPECT_LT(posOf(0), posOf(1));\n}\n\n// =====================================================================\n// Toposort — complex multi-layer DAG\n// =====================================================================\n\nTEST_F(AudioGraphTest, TopoSort_ComplexDAG) {\n  //   0    1\n  //   |\\ / |\n  //   | 2  |\n  //   |/ \\ |\n  //   3   4\n  //    \\ /\n  //     5\n  auto h = addNodes(6);\n  graph.pool().push(graph[h[2]->index].input_head, h[0]->index);\n  graph.pool().push(graph[h[2]->index].input_head, h[1]->index);\n  graph.pool().push(graph[h[3]->index].input_head, h[0]->index);\n  graph.pool().push(graph[h[3]->index].input_head, h[2]->index);\n  graph.pool().push(graph[h[4]->index].input_head, h[2]->index);\n  graph.pool().push(graph[h[4]->index].input_head, h[1]->index);\n  graph.pool().push(graph[h[5]->index].input_head, h[3]->index);\n  graph.pool().push(graph[h[5]->index].input_head, h[4]->index);\n\n  graph.markDirty();\n  graph.process();\n\n  // Check all dependency constraints\n  EXPECT_LT(posOf(0), posOf(2));\n  EXPECT_LT(posOf(1), posOf(2));\n  EXPECT_LT(posOf(0), posOf(3));\n  EXPECT_LT(posOf(2), posOf(3));\n  EXPECT_LT(posOf(2), posOf(4));\n  EXPECT_LT(posOf(1), posOf(4));\n  EXPECT_LT(posOf(3), posOf(5));\n  EXPECT_LT(posOf(4), posOf(5));\n}\n\n// =====================================================================\n// Successive process calls — interleaved add & compact\n// =====================================================================\n\nTEST_F(AudioGraphTest, Process_AddAndRemoveInterleaved) {\n  auto h0 = makeHandleWithNode();\n  auto h1 = makeHandleWithNode();\n  graph.addNode(h0);\n  graph[h0->index].test_node_identifier__ = 0;\n  graph.addNode(h1);\n  graph[h1->index].test_node_identifier__ = 1;\n\n  graph.markDirty();\n  graph.process();\n  EXPECT_EQ(graph.size(), 2u);\n\n  // Orphan 0, add 2\n  graph[h0->index].orphaned = true;\n  auto h2 = makeHandleWithNode();\n  graph.addNode(h2);\n  graph[h2->index].test_node_identifier__ = 2;\n\n  graph.markDirty();\n  graph.process();\n\n  EXPECT_EQ(graph.size(), 2u);\n  EXPECT_EQ(posOf(0), -1);\n  EXPECT_NE(posOf(1), -1);\n  EXPECT_NE(posOf(2), -1);\n}\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/graph/AudioThreadGuard.cpp",
    "content": "#include \"AudioThreadGuard.h\"\n\n#include <sys/resource.h>\n#include <cstdint>\n#include <cstdlib>\n#include <new>\n\nnamespace audioapi::test {\n\n// ── Thread-local state ────────────────────────────────────────────────────\n\nstatic thread_local bool g_armed = false;\nstatic thread_local size_t g_violations = 0;\n\nvoid AudioThreadGuard::arm() {\n  g_armed = true;\n  g_violations = 0;\n}\n\nvoid AudioThreadGuard::disarm() {\n  g_armed = false;\n}\n\nbool AudioThreadGuard::isArmed() {\n  return g_armed;\n}\n\nsize_t AudioThreadGuard::allocationViolations() {\n  return g_violations;\n}\n\nvoid AudioThreadGuard::recordAllocation() {\n  if (g_armed)\n    ++g_violations;\n}\n\nvoid AudioThreadGuard::recordDeallocation() {\n  if (g_armed)\n    ++g_violations;\n}\n\n// ── Context switches ──────────────────────────────────────────────────────\n\nAudioThreadGuard::ContextSwitchSnapshot AudioThreadGuard::contextSwitches() {\n  struct rusage usage{};\n#if defined(__linux__)\n  getrusage(RUSAGE_THREAD, &usage); // per-thread (Linux-only)\n#else\n  getrusage(RUSAGE_SELF, &usage); // process-wide fallback (macOS)\n#endif\n  return {usage.ru_nvcsw, usage.ru_nivcsw};\n}\n\n// ── Scope ─────────────────────────────────────────────────────────────────\n\nAudioThreadGuard::Scope::Scope() : startSnapshot_(contextSwitches()) {\n  arm();\n}\n\nAudioThreadGuard::Scope::~Scope() {\n  disarm();\n}\n\nsize_t AudioThreadGuard::Scope::allocationViolations() const {\n  return AudioThreadGuard::allocationViolations();\n}\n\nint64_t AudioThreadGuard::Scope::involuntaryContextSwitches() const {\n  auto now = contextSwitches();\n  return now.involuntary - startSnapshot_.involuntary;\n}\n\nint64_t AudioThreadGuard::Scope::voluntaryContextSwitches() const {\n  auto now = contextSwitches();\n  return now.voluntary - startSnapshot_.voluntary;\n}\n\nbool AudioThreadGuard::Scope::clean() const {\n  return allocationViolations() == 0;\n}\n\n} // namespace audioapi::test\n\n// =========================================================================\n// Global operator new / operator delete overrides\n// =========================================================================\n//\n// Replace the default allocator for the entire test binary.\n// The hot path (when the guard is not armed) is a single thread_local\n// bool check — negligible overhead.\n//\n// IMPORTANT: These use std::malloc/std::free internally, which do NOT\n// recurse back through operator new, so there is no infinite recursion.\n//\n// Disabled when ASan or TSan is active — they provide their own\n// new/delete interceptors and would conflict.\n\n// __has_feature is Clang-only; GCC uses __SANITIZE_ADDRESS__ / __SANITIZE_THREAD__.\n#ifndef __has_feature\n#define __has_feature(x) 0\n#endif\n\n#if !defined(__SANITIZE_ADDRESS__) && !defined(__SANITIZE_THREAD__) && \\\n    !__has_feature(address_sanitizer) && !__has_feature(thread_sanitizer)\n\nvoid *allocate_with_thread_guard(std::size_t size) {\n  audioapi::test::AudioThreadGuard::recordAllocation();\n  void *p = std::malloc(size);\n  if (!p)\n    throw std::bad_alloc();\n  return p;\n}\n\nvoid deallocate_with_thread_guard(void *p) noexcept {\n  audioapi::test::AudioThreadGuard::recordDeallocation();\n  std::free(p);\n}\n\nvoid *operator new(std::size_t size) {\n  return allocate_with_thread_guard(size);\n}\n\nvoid *operator new[](std::size_t size) {\n  return allocate_with_thread_guard(size);\n}\n\nvoid operator delete(void *p) noexcept {\n  deallocate_with_thread_guard(p);\n}\n\nvoid operator delete[](void *p) noexcept {\n  deallocate_with_thread_guard(p);\n}\n\nvoid operator delete(void *p, std::size_t) noexcept {\n  deallocate_with_thread_guard(p);\n}\n\nvoid operator delete[](void *p, std::size_t) noexcept {\n  deallocate_with_thread_guard(p);\n}\n\n#endif // sanitizer guard\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/graph/AudioThreadGuard.h",
    "content": "#pragma once\n\n#include <sys/resource.h>\n#include <cstddef>\n#include <cstdint>\n\nnamespace audioapi::test {\n\n/// @brief Thread-local allocation auditor for real-time safety testing.\n///\n/// When armed on a thread, every call to the globally-overridden\n/// operator new / operator delete increments a per-thread violation\n/// counter. Use the RAII `Scope` to bracket allocation-free zones.\n///\n/// Context-switch counters are also sampled via getrusage:\n///  - Linux (RUSAGE_THREAD): per-thread, exact.\n///  - macOS (RUSAGE_SELF):   process-wide, approximate — keep other\n///    threads idle during measurement for best accuracy.\n///\n/// ## Example\n/// ```cpp\n/// std::thread audioThread([&] {\n///   AudioThreadGuard::Scope guard;\n///   graph.processEvents();\n///   graph.process();\n///   for (auto&& [node, inputs] : graph.iter()) { node.process(); }\n///   EXPECT_EQ(guard.allocationViolations(), 0u);\n///   EXPECT_EQ(guard.involuntaryContextSwitches(), 0);\n/// });\n/// ```\nclass AudioThreadGuard {\n public:\n  // ── Thread-local state control ──────────────────────────────────────────\n\n  /// Arms the guard on the calling thread. Resets the violation counter.\n  static void arm();\n\n  /// Disarms the guard on the calling thread.\n  static void disarm();\n\n  /// Returns true if the guard is currently armed on this thread.\n  static bool isArmed();\n\n  /// Number of allocation/deallocation violations since last arm().\n  static size_t allocationViolations();\n\n  // ── Context-switch snapshot ─────────────────────────────────────────────\n\n  struct ContextSwitchSnapshot {\n    int64_t voluntary = 0;\n    int64_t involuntary = 0;\n  };\n\n  /// Takes a snapshot of context-switch counters.\n  static ContextSwitchSnapshot contextSwitches();\n\n  // ── Internal — called by operator new/delete overrides ──────────────────\n\n  static void recordAllocation();\n  static void recordDeallocation();\n\n  // ── RAII Scope ──────────────────────────────────────────────────────────\n\n  /// @brief RAII guard — arms on construction, disarms on destruction.\n  ///\n  /// Query `allocationViolations()`, `involuntaryContextSwitches()`, etc.\n  /// before the scope ends to inspect the window.\n  class Scope {\n   public:\n    Scope();\n    ~Scope();\n    Scope(const Scope &) = delete;\n    Scope &operator=(const Scope &) = delete;\n\n    /// Number of allocation/deallocation violations within this scope.\n    [[nodiscard]] size_t allocationViolations() const;\n\n    /// Delta of involuntary context switches within this scope.\n    [[nodiscard]] int64_t involuntaryContextSwitches() const;\n\n    /// Delta of voluntary context switches within this scope.\n    [[nodiscard]] int64_t voluntaryContextSwitches() const;\n\n    /// True if no allocation or deallocation violations occurred.\n    [[nodiscard]] bool clean() const;\n\n   private:\n    ContextSwitchSnapshot startSnapshot_;\n  };\n};\n\n} // namespace audioapi::test\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/graph/GraphCycleDebugTest.cpp",
    "content": "#include <audioapi/core/utils/graph/Graph.hpp>\n#include <gtest/gtest.h>\n#include <algorithm>\n#include <iostream>\n#include <memory>\n#include <random>\n#include <set>\n#include <string>\n#include <utility>\n#include <vector>\n#include \"TestGraphUtils.h\"\n\nnamespace audioapi::utils::graph {\n\n/// Single-threaded deterministic test that processes events synchronously\n/// after every mutation and checks for cycles. No concurrency — isolates\n/// the cycle-formation bug.\nclass GraphCycleDebugTest : public ::testing::TestWithParam<uint64_t> {\n protected:\n  using MNode = MockNode;\n  using HNode = HostGraph<MNode>::Node;\n  using AGEvent = HostGraph<MNode>::AGEvent;\n\n  static constexpr size_t kPayloadSize = HostGraph<MNode>::kDisposerPayloadSize;\n\n  std::mt19937_64 rng;\n  AudioGraph<MNode> audioGraph;\n  HostGraph<MNode> hostGraph;\n  DisposerImpl<kPayloadSize> disposer_{64};\n  std::vector<HNode *> liveNodes;\n  size_t nextId = 0;\n\n  void SetUp() override {\n    rng.seed(GetParam());\n  }\n\n  // ── Helpers ─────────────────────────────────────────────────────────────\n\n  HNode *doAddNode() {\n    auto handle = std::make_shared<NodeHandle<MNode>>(0, std::make_unique<MNode>());\n    auto [hostNode, event] = hostGraph.addNode(handle);\n    size_t id = nextId++;\n    hostNode->test_node_identifier__ = id;\n    event(audioGraph, disposer_);\n    audioGraph[handle->index].test_node_identifier__ = id;\n    liveNodes.push_back(hostNode);\n    return hostNode;\n  }\n\n  void doRemoveNode(HNode *node) {\n    auto result = hostGraph.removeNode(node);\n    if (result.is_ok()) {\n      auto event = std::move(result).unwrap();\n      event(audioGraph, disposer_);\n    }\n    // Remove from live tracking\n    liveNodes.erase(std::remove(liveNodes.begin(), liveNodes.end(), node), liveNodes.end());\n  }\n\n  bool doAddEdge(HNode *from, HNode *to) {\n    auto result = hostGraph.addEdge(from, to);\n    if (result.is_ok()) {\n      auto event = std::move(result).unwrap();\n      event(audioGraph, disposer_);\n      return true;\n    }\n    return false;\n  }\n\n  bool doRemoveEdge(HNode *from, HNode *to) {\n    auto result = hostGraph.removeEdge(from, to);\n    if (result.is_ok()) {\n      auto event = std::move(result).unwrap();\n      event(audioGraph, disposer_);\n      return true;\n    }\n    return false;\n  }\n\n  void doProcess() {\n    audioGraph.process();\n    // Note: this test only triggers audioGraph processing here.\n    // Disposed-node collection is handled by higher-level wrappers in production code,\n    // not directly inside the HostGraph addEdge/removeEdge methods used in this test.\n  }\n\n  HNode *pickRandom() {\n    if (liveNodes.empty())\n      return nullptr;\n    return liveNodes[std::uniform_int_distribution<size_t>(0, liveNodes.size() - 1)(rng)];\n  }\n\n  std::pair<HNode *, HNode *> pickTwo() {\n    if (liveNodes.size() < 2)\n      return {nullptr, nullptr};\n    auto dist = std::uniform_int_distribution<size_t>(0, liveNodes.size() - 1);\n    size_t a = dist(rng);\n    size_t b = dist(rng);\n    if (a == b)\n      return {nullptr, nullptr};\n    return {liveNodes[a], liveNodes[b]};\n  }\n\n  // ── Cycle check on AudioGraph ───────────────────────────────────────────\n\n  /// Returns true if AudioGraph has a cycle (via Kahn's out-degree check).\n  bool audioGraphHasCycle() const {\n    auto n = static_cast<uint32_t>(audioGraph.size());\n    if (n <= 1)\n      return false;\n\n    // Compute out-degree\n    std::vector<uint32_t> outDeg(n, 0);\n    for (uint32_t i = 0; i < n; i++) {\n      for (auto inp : audioGraph.pool().view(audioGraph[i].input_head)) {\n        if (inp < n)\n          outDeg[inp]++;\n      }\n    }\n\n    // BFS from zero-out-degree nodes\n    std::vector<uint32_t> queue;\n    for (uint32_t i = 0; i < n; i++) {\n      if (outDeg[i] == 0)\n        queue.push_back(i);\n    }\n\n    uint32_t visited = 0;\n    size_t head = 0;\n    while (head < queue.size()) {\n      auto idx = queue[head++];\n      visited++;\n      for (auto inp : audioGraph.pool().view(audioGraph[idx].input_head)) {\n        if (inp < n && --outDeg[inp] == 0)\n          queue.push_back(inp);\n      }\n    }\n\n    return visited != n;\n  }\n\n  void dumpCycle() const {\n    auto n = static_cast<uint32_t>(audioGraph.size());\n    std::vector<uint32_t> outDeg(n, 0);\n    for (uint32_t i = 0; i < n; i++)\n      for (auto inp : audioGraph.pool().view(audioGraph[i].input_head))\n        if (inp < n)\n          outDeg[inp]++;\n\n    std::vector<uint32_t> queue;\n    for (uint32_t i = 0; i < n; i++)\n      if (outDeg[i] == 0)\n        queue.push_back(i);\n\n    size_t head = 0;\n    while (head < queue.size()) {\n      auto idx = queue[head++];\n      for (auto inp : audioGraph.pool().view(audioGraph[idx].input_head))\n        if (inp < n && --outDeg[inp] == 0)\n          queue.push_back(inp);\n    }\n\n    // Collect cycle node IDs\n    std::set<size_t> cycleIds;\n    std::cerr << \"=== CYCLE DETECTED in AudioGraph (n=\" << n << \") ===\\n\";\n    std::cerr << \"Nodes in cycle (non-zero remaining out-degree):\\n\";\n    for (uint32_t i = 0; i < n; i++) {\n      if (outDeg[i] > 0) {\n        cycleIds.insert(audioGraph[i].test_node_identifier__);\n        std::cerr << \"  node[\" << i << \"] id=\" << audioGraph[i].test_node_identifier__\n                  << \" inputs={\";\n        bool first = true;\n        for (auto inp : audioGraph.pool().view(audioGraph[i].input_head)) {\n          if (!first)\n            std::cerr << \",\";\n          first = false;\n          std::cerr << inp << \"(id=\" << audioGraph[inp].test_node_identifier__ << \")\";\n        }\n        std::cerr << \"} orphaned=\" << audioGraph[i].orphaned << \"\\n\";\n      }\n    }\n\n    // Dump HostGraph adjacency for cycle nodes + all ghost info\n    std::cerr << \"\\n=== HostGraph state ===\\n\";\n    auto hostAdj = TestGraphUtils::convertHostGraphToAdjacencyList(hostGraph);\n    for (auto id : cycleIds) {\n      if (id < hostAdj.size()) {\n        std::cerr << \"  id=\" << id << \" outputs={\";\n        for (size_t j = 0; j < hostAdj[id].size(); j++) {\n          if (j)\n            std::cerr << \",\";\n          std::cerr << hostAdj[id][j];\n        }\n        std::cerr << \"}\\n\";\n      } else {\n        std::cerr << \"  id=\" << id << \" NOT IN HostGraph adj list\\n\";\n      }\n    }\n\n    // Also show ghost status of all HostGraph nodes involved\n    std::cerr << \"\\n=== HostGraph node details ===\\n\";\n    for (auto *hn : hostGraph.nodes) {\n      if (cycleIds.count(hn->test_node_identifier__)) {\n        std::cerr << \"  id=\" << hn->test_node_identifier__ << \" ghost=\" << hn->ghost\n                  << \" handle.idx=\" << hn->handle->index << \" use_count=\" << hn->handle.use_count()\n                  << \" inputs={\";\n        for (size_t j = 0; j < hn->inputs.size(); j++) {\n          if (j)\n            std::cerr << \",\";\n          std::cerr << hn->inputs[j]->test_node_identifier__;\n          if (hn->inputs[j]->ghost)\n            std::cerr << \"(ghost)\";\n        }\n        std::cerr << \"} outputs={\";\n        for (size_t j = 0; j < hn->outputs.size(); j++) {\n          if (j)\n            std::cerr << \",\";\n          std::cerr << hn->outputs[j]->test_node_identifier__;\n          if (hn->outputs[j]->ghost)\n            std::cerr << \"(ghost)\";\n        }\n        std::cerr << \"}\\n\";\n      }\n    }\n  }\n\n  /// Verify consistency between HostGraph and AudioGraph adjacency.\n  void verifyConsistency() const {\n    auto hostAdj = TestGraphUtils::convertHostGraphToAdjacencyList(hostGraph);\n    auto audioAdj = TestGraphUtils::convertAudioGraphToAdjacencyList(audioGraph);\n\n    // Only compare live (non-ghost) edges\n    if (hostAdj.size() != audioAdj.size()) {\n      std::cerr << \"  [WARN] Adj list size mismatch: host=\" << hostAdj.size()\n                << \" audio=\" << audioAdj.size() << \"\\n\";\n    }\n  }\n};\n\n// ── collectDisposedNodes is private; tests access it via friend declarations ──\n// We call it directly in doProcess(), using HostGraph's friend declarations\n// for TestGraphUtils and these test classes (it is not publicly exposed).\n\n// =========================================================================\n// Single-threaded deterministic cycle finder\n// =========================================================================\n\nTEST_P(GraphCycleDebugTest, FindCycleFormation) {\n  // Seed\n  size_t initialNodeCount = std::uniform_int_distribution<size_t>(16, 128)(rng);\n  size_t opCount = std::uniform_int_distribution<size_t>(200, 2000)(rng);\n\n  // Random operation weights\n  size_t total = 100;\n  size_t wAdd = std::uniform_int_distribution<size_t>(0, total)(rng);\n  size_t wRem = std::uniform_int_distribution<size_t>(0, total - wAdd)(rng);\n  size_t wEdge = std::uniform_int_distribution<size_t>(0, total - wAdd - wRem)(rng);\n\n  // Seed graph\n  for (size_t i = 0; i < initialNodeCount; i++) {\n    doAddNode();\n  }\n\n  // Process once to establish baseline\n  doProcess();\n  ASSERT_FALSE(audioGraphHasCycle()) << \"Cycle after initial seeding!\";\n\n  for (size_t i = 0; i < opCount; i++) {\n    size_t op = std::uniform_int_distribution<size_t>(0, 99)(rng);\n    std::string opName;\n\n    if (op < wAdd) {\n      opName = \"addNode\";\n      doAddNode();\n\n    } else if (op < wAdd + wRem) {\n      auto *n = pickRandom();\n      if (n) {\n        opName = \"removeNode(id=\" + std::to_string(n->test_node_identifier__) + \")\";\n        doRemoveNode(n);\n      } else {\n        opName = \"removeNode(skip)\";\n      }\n\n    } else if (op < wAdd + wRem + wEdge) {\n      auto [from, to] = pickTwo();\n      if (from && to) {\n        bool ok = doAddEdge(from, to);\n        opName = \"addEdge(id=\" + std::to_string(from->test_node_identifier__) +\n            \"->id=\" + std::to_string(to->test_node_identifier__) + (ok ? \" OK)\" : \" REJECTED)\");\n      } else {\n        opName = \"addEdge(skip)\";\n      }\n\n    } else {\n      auto [from, to] = pickTwo();\n      if (from && to) {\n        bool ok = doRemoveEdge(from, to);\n        opName = \"removeEdge(id=\" + std::to_string(from->test_node_identifier__) +\n            \"->id=\" + std::to_string(to->test_node_identifier__) + (ok ? \" OK)\" : \" REJECTED)\");\n      } else {\n        opName = \"removeEdge(skip)\";\n      }\n    }\n\n    // Check for cycle BEFORE process (events applied, toposort not yet)\n    if (audioGraphHasCycle()) {\n      std::cerr << \"\\n!!! CYCLE FOUND at operation \" << i << \": \" << opName << \"\\n\";\n      dumpCycle();\n      FAIL() << \"Cycle found at operation \" << i << \": \" << opName;\n    }\n\n    // Process (toposort + compaction) every few operations\n    if (i % 3 == 0) {\n      doProcess();\n      if (audioGraphHasCycle()) {\n        std::cerr << \"\\n!!! CYCLE FOUND after process() at operation \" << i << \": \" << opName\n                  << \"\\n\";\n        dumpCycle();\n        FAIL() << \"Cycle found after process() at operation \" << i;\n      }\n    }\n  }\n\n  // Final process\n  doProcess();\n  ASSERT_FALSE(audioGraphHasCycle()) << \"Cycle after all operations!\";\n}\n\nINSTANTIATE_TEST_SUITE_P(\n    Seeds,\n    GraphCycleDebugTest,\n    ::testing::Range(uint64_t{0}, uint64_t{100}),\n    [](const ::testing::TestParamInfo<uint64_t> &info) {\n      return \"seed_\" + std::to_string(info.param);\n    });\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/graph/GraphFuzzTest.cpp",
    "content": "#include <audioapi/core/utils/graph/Graph.hpp>\n#include <gtest/gtest.h>\n#include <algorithm>\n#include <atomic>\n#include <chrono>\n#include <memory>\n#include <random>\n#include <span>\n#include <thread>\n#include <utility>\n#include <vector>\n#include \"AudioThreadGuard.h\"\n#include \"MockGraphProcessor.h\"\n#include \"TestGraphUtils.h\"\n\nusing namespace audioapi::utils::graph;\nusing audioapi::test::MockGraphProcessor;\n\n// =========================================================================\n// Fixture — parameterized by seed for reproducible randomized testing\n// =========================================================================\n\nclass GraphFuzzTest : public ::testing::TestWithParam<uint64_t> {\n protected:\n  using PNode = ProcessableMockNode;\n  using HNode = HostGraph<PNode>::Node;\n  using Res = Graph<PNode>::Res;\n  using ResultError = Graph<PNode>::ResultError;\n\n  std::mt19937_64 rng;\n  std::unique_ptr<Graph<PNode>> graph;\n  std::vector<HNode *> nodes; // tracks live (non-removed) nodes\n  size_t initialNodeCount;\n  size_t operationCount;\n\n  struct {\n    size_t addNode = 0;\n    size_t removeNode = 0;\n    size_t addEdge = 0;\n    size_t removeEdge = 0;\n  } chances;\n\n  void SetUp() override {\n    rng.seed(GetParam());\n\n    initialNodeCount = std::uniform_int_distribution<size_t>(16, 128)(rng);\n    operationCount = std::uniform_int_distribution<size_t>(200, 2000)(rng);\n\n    // Ensure graph growth does not happen on the audio thread during this fuzz run.\n    const auto maxNodes = static_cast<std::uint32_t>(initialNodeCount + operationCount + 64);\n    const auto maxEdges = static_cast<std::uint32_t>(operationCount * 2 + 64);\n    graph = std::make_unique<Graph<PNode>>(4096, maxNodes, maxEdges);\n\n    // Randomly partition the range 0..99 into 4 operation weights\n    size_t total = 100;\n    chances.addNode = std::uniform_int_distribution<size_t>(0, total)(rng);\n    chances.removeNode = std::uniform_int_distribution<size_t>(0, total - chances.addNode)(rng);\n    chances.addEdge =\n        std::uniform_int_distribution<size_t>(0, total - chances.addNode - chances.removeNode)(rng);\n    chances.removeEdge = total - chances.addNode - chances.removeNode - chances.addEdge;\n  }\n\n  enum class Operation { AddNode, RemoveNode, AddEdge, RemoveEdge, None };\n\n  // ── Helpers ─────────────────────────────────────────────────────────────\n\n  /// @brief Creates a ProcessableMockNode that busy-waits for a short\n  /// duration (10–50 µs) simulating lightweight DSP work, then returns\n  /// the sum of its inputs (or its initial value if no inputs).\n  std::unique_ptr<PNode> makeBusyNode(int initialValue = 0) {\n    // Each node gets a random busy-wait duration in [10, 50] µs\n    auto busyNs = std::uniform_int_distribution<int>(10'000, 50'000)(rng);\n    return std::make_unique<PNode>(\n        [busyNs](std::span<const int> inputs) -> int {\n          // Busy-wait (no syscalls, no allocation)\n          auto start = std::chrono::steady_clock::now();\n          auto target = std::chrono::nanoseconds(busyNs);\n          while (std::chrono::steady_clock::now() - start < target) {\n            // spin\n          }\n          // Sum inputs\n          int sum = 0;\n          for (int v : inputs)\n            sum += v;\n          return sum;\n        },\n        initialValue);\n  }\n\n  /// @brief Pick two distinct random nodes from the live set.\n  std::pair<HNode *, HNode *> pickTwoNodes() {\n    if (nodes.size() < 2)\n      return {nullptr, nullptr};\n    auto dist = std::uniform_int_distribution<size_t>(0, nodes.size() - 1);\n    size_t a = dist(rng);\n    size_t b = dist(rng);\n    if (a == b)\n      return {nullptr, nullptr};\n    return {nodes[a], nodes[b]};\n  }\n\n  /// @brief Seeds the graph with `initialNodeCount` busy nodes.\n  void seedGraph() {\n    for (size_t i = 0; i < initialNodeCount; ++i) {\n      auto *n = graph->addNode(makeBusyNode(static_cast<int>(i)));\n      nodes.push_back(n);\n    }\n  }\n\n  /// @brief Performs a single random graph mutation using only the public API.\n  /// @return (operation, node) — node is present for add/remove, nullptr otherwise\n  std::pair<Operation, HNode *> performRandomOperation() {\n    size_t op = std::uniform_int_distribution<size_t>(0, 99)(rng);\n\n    if (op < chances.addNode) {\n      auto *n = graph->addNode(makeBusyNode());\n      nodes.push_back(n);\n      return {Operation::AddNode, n};\n    }\n\n    if (op < chances.addNode + chances.removeNode) {\n      if (!nodes.empty()) {\n        size_t idx = std::uniform_int_distribution<size_t>(0, nodes.size() - 1)(rng);\n        HNode *target = nodes[idx];\n        nodes.erase(nodes.begin() + static_cast<std::ptrdiff_t>(idx));\n        (void)graph->removeNode(target);\n        return {Operation::RemoveNode, target};\n      }\n      return {Operation::None, nullptr};\n    }\n\n    if (op < chances.addNode + chances.removeNode + chances.addEdge) {\n      auto [from, to] = pickTwoNodes();\n      if (from && to) {\n        (void)graph->addEdge(from, to);\n        return {Operation::AddEdge, nullptr};\n      }\n      return {Operation::None, nullptr};\n    }\n\n    // removeEdge\n    {\n      auto [from, to] = pickTwoNodes();\n      if (from && to) {\n        (void)graph->removeEdge(from, to);\n        return {Operation::RemoveEdge, nullptr};\n      }\n    }\n    return {Operation::None, nullptr};\n  }\n};\n\n// =========================================================================\n// Test: Audio thread processes while host thread mutates the graph\n// =========================================================================\n\nTEST_P(GraphFuzzTest, AudioThreadDoesNotAllocate) {\n  seedGraph();\n\n  // Start the mock audio processor on its own thread\n  MockGraphProcessor<PNode> processor(*graph);\n  processor.start();\n\n  // Host thread: perform random mutations with small intervals\n  for (size_t i = 0; i < operationCount; ++i) {\n    performRandomOperation();\n    // Small sleep to spread mutations over time (50–200 µs)\n    std::this_thread::sleep_for(\n        std::chrono::microseconds(std::uniform_int_distribution<int>(50, 200)(rng)));\n  }\n\n  // Let the audio thread drain remaining work\n  std::this_thread::sleep_for(std::chrono::milliseconds(50));\n  processor.stop();\n\n  // ── Assertions ──────────────────────────────────────────────────────────\n\n  EXPECT_GT(processor.cyclesCompleted(), 0u)\n      << \"Audio thread should have processed at least one cycle\";\n\n  EXPECT_TRUE(processor.allocationClean())\n      << \"Audio thread allocated/deallocated \" << processor.allocationViolations()\n      << \" times across \" << processor.cyclesCompleted() << \" cycles\";\n}\n\nTEST_P(GraphFuzzTest, GraphRemainsConsistentUnderConcurrency) {\n  seedGraph();\n\n  MockGraphProcessor<PNode> processor(*graph);\n  processor.start();\n\n  // Host thread: heavy burst of mutations\n  for (size_t i = 0; i < operationCount; ++i) {\n    performRandomOperation();\n    // Occasional yield to let audio thread run\n    if (i % 50 == 0) {\n      std::this_thread::sleep_for(std::chrono::microseconds(100));\n    }\n  }\n\n  std::this_thread::sleep_for(std::chrono::milliseconds(50));\n  processor.stop();\n\n  // If we got here without crash/hang/TSan report, the graph is consistent.\n  EXPECT_GT(processor.cyclesCompleted(), 0u);\n}\n\nTEST_P(GraphFuzzTest, RapidAddRemoveCycles) {\n  // Stress test: rapidly add and immediately remove nodes\n  MockGraphProcessor<PNode> processor(*graph);\n  processor.start();\n\n  for (size_t i = 0; i < operationCount; ++i) {\n    auto *n = graph->addNode(makeBusyNode(static_cast<int>(i)));\n    // Immediately remove ~50% of them\n    if (std::uniform_int_distribution<int>(0, 1)(rng) == 0) {\n      (void)graph->removeNode(n);\n    } else {\n      nodes.push_back(n);\n    }\n\n    if (i % 100 == 0) {\n      std::this_thread::sleep_for(std::chrono::microseconds(50));\n    }\n  }\n\n  // Now remove everything that's still live\n  for (auto *n : nodes) {\n    (void)graph->removeNode(n);\n  }\n  nodes.clear();\n\n  std::this_thread::sleep_for(std::chrono::milliseconds(50));\n  processor.stop();\n\n  EXPECT_GT(processor.cyclesCompleted(), 0u);\n  EXPECT_TRUE(processor.allocationClean())\n      << \"Audio thread had \" << processor.allocationViolations() << \" allocation violations\";\n}\n\n// =========================================================================\n// Instantiation: 100 seeds (0..99), each producing a unique random scenario\n// =========================================================================\n\nINSTANTIATE_TEST_SUITE_P(\n    Seeds,\n    GraphFuzzTest,\n    ::testing::Range(uint64_t{0}, uint64_t{100}),\n    [](const ::testing::TestParamInfo<uint64_t> &info) {\n      return \"seed_\" + std::to_string(info.param);\n    });\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/graph/GraphTest.cpp",
    "content": "#include <audioapi/core/utils/graph/Graph.hpp>\n#include <gtest/gtest.h>\n#include <atomic>\n#include <chrono>\n#include <cstdlib>\n#include <memory>\n#include <mutex>\n#include <thread>\n#include <vector>\n#include \"TestGraphUtils.h\"\n\nnamespace audioapi::utils::graph {\n\nclass GraphTest : public ::testing::Test {\n protected:\n  std::unique_ptr<Graph<MockNode>> graph;\n\n  void SetUp() override {\n    graph = std::make_unique<Graph<MockNode>>(4096);\n  }\n\n  const AudioGraph<MockNode> &getAudioGraph() {\n    return graph->audioGraph;\n  }\n\n  const HostGraph<MockNode> &getHostGraph() {\n    return graph->hostGraph;\n  }\n};\n\nTEST_F(GraphTest, EventsAreScheduledButNotExecutedUntilProcess) {\n  auto *node = graph->addNode();\n  ASSERT_NE(node, nullptr);\n\n  // AudioGraph<MockNode> should not be aware of the node yet (event not processed)\n  const auto &ag = getAudioGraph();\n\n  size_t sizeBefore = ag.size();\n\n  if (ag.empty()) {\n    EXPECT_EQ(ag.size(), 0u);\n  }\n\n  graph->processEvents();\n\n  EXPECT_GE(ag.size(), 1u);\n}\n\nTEST_F(GraphTest, NoUselessEventsScheduled) {\n  auto *node1 = graph->addNode();\n  auto *node2 = graph->addNode();\n  graph->processEvents();\n\n  // Initial state\n  const auto &ag = getAudioGraph();\n  // Convert to verify\n  auto initialAdj = TestGraphUtils::convertAudioGraphToAdjacencyList(\n      const_cast<AudioGraph<MockNode> &>(\n          ag)); // casting const away if utils need it, or verifyutils usage\n\n  // Try adding duplicate edge (should fail and NOT schedule event)\n  ASSERT_TRUE(graph->addEdge(node1, node2).is_ok()); // Success first time\n  graph->processEvents();\n\n  // Result of valid op\n  auto intermediateAdj =\n      TestGraphUtils::convertAudioGraphToAdjacencyList(const_cast<AudioGraph<MockNode> &>(ag));\n\n  // Try adding SAME edge (should fail)\n  auto result = graph->addEdge(node1, node2);\n  EXPECT_TRUE(result.is_err());\n  EXPECT_EQ(result.unwrap_err(), HostGraph<MockNode>::ResultError::EDGE_ALREADY_EXISTS);\n\n  // Even if we call processEvents, state should not change (and no event should be consumed ideally,\n  // impossible to check queue count easily without friend or mock, but state check is good enough)\n  graph->processEvents();\n\n  auto finalAdj =\n      TestGraphUtils::convertAudioGraphToAdjacencyList(const_cast<AudioGraph<MockNode> &>(ag));\n  EXPECT_EQ(intermediateAdj, finalAdj);\n}\n\nTEST_F(GraphTest, ThreadRaceConcurrency) {\n  // Stress test with threads\n  // One thread produces graph changes\n  // One thread processes events (consumer)\n\n  std::atomic<bool> running{true};\n  std::vector<HostGraph<MockNode>::Node *> nodes;\n\n  // Add initial nodes\n  for (int i = 0; i < 10; ++i) {\n    nodes.push_back(graph->addNode());\n  }\n  graph->processEvents(); // Setup\n\n  std::thread audioThread([&]() {\n    while (running) {\n      graph->processEvents();\n      std::this_thread::sleep_for(std::chrono::microseconds(10));\n    }\n    graph->processEvents();\n  });\n\n  // Main thread mutations\n  unsigned int seed = 12345;\n  for (int i = 0; i < 100; ++i) {\n    // Randomly add edge or remove edge or add node\n    int op = rand_r(&seed) % 3;\n    if (op == 0) {\n      auto *n = graph->addNode();\n      nodes.push_back(n);\n    } else if (op == 1 && nodes.size() > 2) {\n      // Add edge\n      HostGraph<MockNode>::Node *n1, *n2;\n      {\n        n1 = nodes[rand_r(&seed) % nodes.size()];\n        n2 = nodes[rand_r(&seed) % nodes.size()];\n      }\n      if (n1 != n2) {\n        // Ignore result (could be error if edge exists or cycle)\n        (void)graph->addEdge(n1, n2);\n      }\n    } else if (op == 2 && nodes.size() > 5) {\n      // Remove edge\n      HostGraph<MockNode>::Node *n1, *n2;\n      {\n        n1 = nodes[rand_r(&seed) % nodes.size()];\n        n2 = nodes[rand_r(&seed) % nodes.size()];\n      }\n      (void)graph->removeEdge(n1, n2);\n    }\n    std::this_thread::sleep_for(std::chrono::microseconds(100));\n  }\n\n  running = false;\n  audioThread.join();\n\n  // If we reached here without crash (segfault), we are somewhat good.\n  // Verify graph consistency (Host vs Audio)\n  {\n    // Must wait for all events to flush - already done by final processEvents in thread,\n    // but let's do one more to be sure\n    graph->processEvents();\n\n    const auto &ag = getAudioGraph();\n    const auto &hg = getHostGraph();\n\n    auto audioAdj =\n        TestGraphUtils::convertAudioGraphToAdjacencyList(const_cast<AudioGraph<MockNode> &>(ag));\n    auto hostAdj =\n        TestGraphUtils::convertHostGraphToAdjacencyList(const_cast<HostGraph<MockNode> &>(hg));\n\n    // They should match\n    EXPECT_EQ(audioAdj, hostAdj);\n  }\n}\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/graph/HostGraphTest.cpp",
    "content": "#include <audioapi/core/utils/graph/AudioGraph.hpp>\n#include <audioapi/core/utils/graph/Disposer.hpp>\n#include <audioapi/core/utils/graph/HostGraph.hpp>\n#include <audioapi/core/utils/graph/NodeHandle.hpp>\n#include <gtest/gtest.h>\n#include <memory>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n#include \"TestGraphUtils.h\"\n\nnamespace audioapi::utils::graph {\n\nclass HostGraphTest : public ::testing::Test {\n protected:\n  static constexpr size_t kPayloadSize = HostGraph<MockNode>::kDisposerPayloadSize;\n  DisposerImpl<kPayloadSize> disposer_{64};\n\n  void verifyAddEdge(\n      HostGraph<MockNode> &hostGraph,\n      AudioGraph<MockNode> &audioGraph,\n      size_t fromId,\n      size_t toId,\n      const std::vector<std::vector<size_t>> &expectedAdjacencyList) {\n    // Find nodes by ID\n\n    HostGraph<MockNode>::Node *fromNode = nullptr;\n    HostGraph<MockNode>::Node *toNode = nullptr;\n\n    for (auto *n : hostGraph.nodes) {\n      if (n->test_node_identifier__ == fromId)\n        fromNode = n;\n      if (n->test_node_identifier__ == toId)\n        toNode = n;\n    }\n\n    ASSERT_NE(fromNode, nullptr);\n    ASSERT_NE(toNode, nullptr);\n\n    // Snapshot pre-state\n    auto initialAudioAdj = TestGraphUtils::convertAudioGraphToAdjacencyList(audioGraph);\n\n    // Action\n    auto result = hostGraph.addEdge(fromNode, toNode);\n    ASSERT_TRUE(result.is_ok()) << \"addEdge failed\";\n\n    // Verify AudioGraph<MockNode> UNCHANGED\n    auto intermediateAudioAdj = TestGraphUtils::convertAudioGraphToAdjacencyList(audioGraph);\n    EXPECT_EQ(initialAudioAdj, intermediateAudioAdj)\n        << \"AudioGraph<MockNode> changed before event execution\";\n\n    // Perform Event\n    auto event = std::move(result).unwrap();\n    event(audioGraph, disposer_);\n\n    // Verify AudioGraph<MockNode> UPDATED and CONSISTENT\n    auto finalAudioAdj = TestGraphUtils::convertAudioGraphToAdjacencyList(audioGraph);\n    auto finalHostAdj = TestGraphUtils::convertHostGraphToAdjacencyList(hostGraph);\n\n    EXPECT_EQ(finalAudioAdj, expectedAdjacencyList)\n        << \"AudioGraph<MockNode> does not match expected adjacency list\";\n    EXPECT_EQ(finalHostAdj, expectedAdjacencyList)\n        << \"HostGraph<MockNode> does not match expected adjacency list\";\n  }\n\n  HostGraph<MockNode>::Node *findNode(const HostGraph<MockNode> &hostGraph, size_t id) {\n    for (auto *n : hostGraph.nodes) {\n      if (n->test_node_identifier__ == id)\n        return n;\n    }\n    return nullptr;\n  }\n};\n\nTEST_F(HostGraphTest, AddNode) {\n  auto [audioGraph, hostGraph] = TestGraphUtils::createTestGraph({\n      {1, 2}, // 0 -> 1, 2\n      {2},    // 1 -> 2\n      {}      // 2\n  });\n\n  // Create a new handle and add it via HostGraph<MockNode>\n  auto handle = std::make_shared<NodeHandle<MockNode>>(0, nullptr);\n  auto [hostNode, event] = hostGraph.addNode(handle);\n\n  EXPECT_EQ(hostNode->handle, handle);\n  hostNode->test_node_identifier__ = 3;\n\n  // AudioGraph<MockNode> unchanged before event\n  EXPECT_EQ(audioGraph.size(), 3u);\n\n  event(audioGraph, disposer_);\n\n  // After event: node added to AudioGraph<MockNode>\n  EXPECT_EQ(audioGraph.size(), 4u);\n  audioGraph[handle->index].test_node_identifier__ = 3;\n\n  auto adj = TestGraphUtils::convertAudioGraphToAdjacencyList(audioGraph);\n  EXPECT_EQ(adj.size(), 4u);\n}\n\nTEST_F(HostGraphTest, AddEdge_SimpleForward) {\n  // 0 -> 1   2\n  // Add 1 -> 2\n  auto [audioGraph, hostGraph] = TestGraphUtils::createTestGraph({\n      {1}, // 0 -> 1\n      {},  // 1\n      {}   // 2\n  });\n\n  verifyAddEdge(\n      hostGraph,\n      audioGraph,\n      1,\n      2,\n      {\n          {1}, // 0 -> 1\n          {2}, // 1 -> 2\n          {}   // 2\n      });\n}\n\nTEST_F(HostGraphTest, AddEdge_SimpleReorder) {\n  // 0, 1 (Independent, assume 0 creates before 1)\n  // Add 1 -> 0\n  auto [audioGraph, hostGraph] = TestGraphUtils::createTestGraph({{}, {}});\n\n  // Depending on implementation, making 1->0 implies 1 must be before 0.\n  // Initial: 0, 1 (probably)\n  // Expected: 1 -> 0\n\n  verifyAddEdge(\n      hostGraph,\n      audioGraph,\n      1,\n      0,\n      {\n          {}, // 0\n          {0} // 1 -> 0\n      });\n}\n\nTEST_F(HostGraphTest, AddEdge_TransitiveReorder) {\n  // 0 -> 1 -> 2, 3\n  // initial: 0, 1, 2, 3 (3 is likely last or first? usually makes linear)\n  // Add 2 -> 3\n  // If 3 was before 0 (unlikely if created in order), or 3 was isolated.\n  // Let's force a scenario where target is 'behind' source in list but valid topological wise.\n\n  auto [audioGraph, hostGraph] = TestGraphUtils::createTestGraph({\n      {1}, // 0->1\n      {},  // 1\n      {}   // 2\n  });\n\n  verifyAddEdge(hostGraph, audioGraph, 1, 2, {{1}, {2}, {}});\n}\n\nTEST_F(HostGraphTest, AddEdge_BackwardsLinkRequiringSort) {\n  // 0 -> 1\n  // 2\n  // Initial order likely: 0, 1, 2. (or 2, 0, 1).\n  // Add 2 -> 0.\n  // Ensure 2 becomes before 0.\n  auto [audioGraph, hostGraph] = TestGraphUtils::createTestGraph({{1}, {}, {}});\n\n  verifyAddEdge(hostGraph, audioGraph, 2, 0, {{1}, {}, {0}});\n}\n\nTEST_F(HostGraphTest, AddEdge_diamond) {\n  // 0, 1, 2, 3\n  // 0->1, 0->2.\n  // Add 1->3.\n  // Add 2->3.\n  auto [audioGraph, hostGraph] = TestGraphUtils::createTestGraph({{1, 2}, {}, {}, {}});\n\n  verifyAddEdge(hostGraph, audioGraph, 1, 3, {{1, 2}, {3}, {}, {}});\n\n  verifyAddEdge(hostGraph, audioGraph, 2, 3, {{1, 2}, {3}, {3}, {}});\n}\n\nTEST_F(HostGraphTest, AddEdge_MultiInputOutput) {\n  // 0 -> 2\n  // 1 -> 2\n  // Add 2 -> 3\n  auto [audioGraph, hostGraph] = TestGraphUtils::createTestGraph({{2}, {2}, {}, {}});\n\n  verifyAddEdge(hostGraph, audioGraph, 2, 3, {{2}, {2}, {3}, {}});\n}\n\nTEST_F(HostGraphTest, AddEdge_CycleDetection) {\n  // 0 -> 1 -> 2\n  // Try to add 2 -> 0 (Cycle)\n  auto [audioGraph, hostGraph] = TestGraphUtils::createTestGraph({\n      {1}, // 0 -> 1\n      {2}, // 1 -> 2\n      {}   // 2\n  });\n\n  auto hostAdjBefore = TestGraphUtils::convertHostGraphToAdjacencyList(hostGraph);\n  auto audioAdjBefore = TestGraphUtils::convertAudioGraphToAdjacencyList(audioGraph);\n\n  HostGraph<MockNode>::Node *node0 = findNode(hostGraph, 0);\n  HostGraph<MockNode>::Node *node2 = findNode(hostGraph, 2);\n\n  // Try adding cycle 2->0\n  auto result = hostGraph.addEdge(node2, node0);\n  EXPECT_TRUE(result.is_err());\n  EXPECT_EQ(result.unwrap_err(), HostGraph<MockNode>::ResultError::CYCLE_DETECTED);\n\n  // HostGraph<MockNode> should NOT change\n  auto hostAdjAfter = TestGraphUtils::convertHostGraphToAdjacencyList(hostGraph);\n  EXPECT_EQ(hostAdjBefore, hostAdjAfter) << \"HostGraph<MockNode> modified despite cycle detection\";\n\n  // AudioGraph<MockNode> should NOT change (no event executed)\n  auto audioAdjAfter = TestGraphUtils::convertAudioGraphToAdjacencyList(audioGraph);\n  EXPECT_EQ(audioAdjBefore, audioAdjAfter) << \"AudioGraph<MockNode> modified\";\n}\n\nTEST_F(HostGraphTest, AddEdge_LargeSpecificGraph) {\n  // Create two separate chains and link them\n  // Chain 1: 0->1->2->3->4\n  // Chain 2: 5->6->7->8->9\n  // Add 4->5\n\n  std::vector<std::vector<size_t>> adj(10);\n  for (int i = 0; i < 4; ++i)\n    adj[i] = {static_cast<size_t>(i + 1)};\n  adj[4] = {};\n  for (int i = 5; i < 9; ++i)\n    adj[i] = {static_cast<size_t>(i + 1)};\n  adj[9] = {};\n\n  auto [audioGraph, hostGraph] = TestGraphUtils::createTestGraph(adj);\n\n  std::vector<std::vector<size_t>> expectedAdj = adj;\n  expectedAdj[4].push_back(5);\n\n  verifyAddEdge(hostGraph, audioGraph, 4, 5, expectedAdj);\n}\n\nTEST_F(HostGraphTest, AddEdge_GridInterconnect) {\n  // 0  1  2\n  // |  |  |\n  // 3  4  5\n  //\n  // Connections: 0->3, 1->4, 2->5\n  // Add 3->4 (valid)\n  // Add 4->2 (valid, requires 4 before 2? No, 1->4->2... so 1 before 2)\n\n  std::vector<std::vector<size_t>> adj(6);\n  adj[0] = {3};\n  adj[1] = {4};\n  adj[2] = {5};\n\n  auto [audioGraph, hostGraph] = TestGraphUtils::createTestGraph(adj);\n\n  auto expected = adj;\n  expected[3].push_back(4);\n  verifyAddEdge(hostGraph, audioGraph, 3, 4, expected);\n\n  expected[4].push_back(2);\n  verifyAddEdge(hostGraph, audioGraph, 4, 2, expected);\n\n  // Now we have path 0->3->4->2->5\n  // And 1->4->2->5\n  // If we try 5->0 -> Cycle (5 reachable from 0)\n\n  auto hostAdjBefore = TestGraphUtils::convertHostGraphToAdjacencyList(hostGraph);\n  HostGraph<MockNode>::Node *node5 = findNode(hostGraph, 5);\n  HostGraph<MockNode>::Node *node0 = findNode(hostGraph, 0);\n\n  auto result = hostGraph.addEdge(node5, node0);\n  EXPECT_TRUE(result.is_err());\n  EXPECT_EQ(hostAdjBefore, TestGraphUtils::convertHostGraphToAdjacencyList(hostGraph));\n}\n\n// ---------------------------------------------------------------------------\n// BUG demonstration: ghost node in AudioGraph<MockNode> causes accepted cycle\n// ---------------------------------------------------------------------------\n//\n// When a node is removed from HostGraph<MockNode> it is deleted immediately (edges torn\n// down, pointer freed).  The corresponding AudioGraph<MockNode> event only marks the\n// node as `orphaned` — it stays in the vector with all its edges until\n// compaction eventually removes it.\n//\n// This creates a window where HostGraph<MockNode> no longer \"sees\" the node, so its\n// cycle-detection (hasPath) can miss paths that still exist in AudioGraph.\n// If a new edge is added through that blind-spot, AudioGraph<MockNode> ends up with a\n// cycle and toposort produces garbage.\n//\nTEST_F(HostGraphTest, RemoveNode_GhostNodeMustNotAllowCycle) {\n  // Setup: chain  0 → 1 → 2\n  auto [audioGraph, hostGraph] = TestGraphUtils::createTestGraph({\n      {1}, // 0 -> 1\n      {2}, // 1 -> 2\n      {}   // 2\n  });\n\n  HostGraph<MockNode>::Node *node0 = findNode(hostGraph, 0);\n  HostGraph<MockNode>::Node *node1 = findNode(hostGraph, 1);\n  HostGraph<MockNode>::Node *node2 = findNode(hostGraph, 2);\n  ASSERT_NE(node0, nullptr);\n  ASSERT_NE(node1, nullptr);\n  ASSERT_NE(node2, nullptr);\n\n  // ── Step 1: remove node 1 from HostGraph<MockNode> ──\n  auto removeResult = hostGraph.removeNode(node1);\n  ASSERT_TRUE(removeResult.is_ok());\n\n  // Execute the remove-event on AudioGraph<MockNode> (only sets orphaned=true).\n  auto removeEvent = std::move(removeResult).unwrap();\n  removeEvent(audioGraph, disposer_);\n\n  // AudioGraph<MockNode> still has the ghost: 0 → 1(orphaned) → 2\n  EXPECT_EQ(audioGraph.size(), 3u);\n\n  // ── Step 2: add edge 2 → 0 ──\n  // Because node 1 still bridges 0→2 in AudioGraph<MockNode>, this would create\n  // a cycle: 0 → 1 → 2 → 0.  HostGraph<MockNode> MUST reject it.\n  auto addResult = hostGraph.addEdge(node2, node0);\n\n  EXPECT_TRUE(addResult.is_err())\n      << \"HostGraph<MockNode> should detect the cycle through the ghost node\";\n  EXPECT_EQ(addResult.unwrap_err(), HostGraph<MockNode>::ResultError::CYCLE_DETECTED);\n}\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/graph/MockGraphProcessor.h",
    "content": "#pragma once\n\n#include <audioapi/core/utils/graph/Graph.hpp>\n#include \"AudioThreadGuard.h\"\n\n#include <atomic>\n#include <cstddef>\n#include <cstdint>\n#include <thread>\n\n#ifdef __APPLE__\n#include <pthread.h>\n#elif defined(__linux__)\n#include <pthread.h>\n#endif\n\nnamespace audioapi::test {\n\n/// @brief Simulates a real-time audio thread that continuously processes a Graph.\n///\n/// Spawns a dedicated thread that repeatedly:\n///   1. Processes SPSC events (graph mutations from the main thread)\n///   2. Runs toposort + compaction\n///   3. Iterates nodes in topological order, calling `process()` if the\n///      NodeType supports it (SFINAE via `requires`)\n///\n/// The thread is instrumented with AudioThreadGuard to detect heap\n/// allocations / deallocations and sample context-switch counters.\n///\n/// ## Usage\n/// ```cpp\n/// Graph<ProcessableMockNode> graph(4096);\n/// MockGraphProcessor processor(graph);\n/// processor.start();\n/// // … mutate graph from main thread …\n/// processor.stop();\n/// EXPECT_TRUE(processor.allocationClean());\n/// ```\n///\n/// @tparam NodeType the audio graph node type (must satisfy AudioGraphNode)\ntemplate <audioapi::utils::graph::AudioGraphNode NodeType>\nclass MockGraphProcessor {\n public:\n  explicit MockGraphProcessor(audioapi::utils::graph::Graph<NodeType> &graph) : graph_(graph) {}\n\n  ~MockGraphProcessor() {\n    stop();\n  }\n\n  MockGraphProcessor(const MockGraphProcessor &) = delete;\n  MockGraphProcessor &operator=(const MockGraphProcessor &) = delete;\n\n  /// @brief Starts the audio processing thread.\n  void start() {\n    running_.store(true, std::memory_order_release);\n    thread_ = std::thread([this] { run(); });\n  }\n\n  /// @brief Signals the audio thread to stop and waits for it to finish.\n  void stop() {\n    running_.store(false, std::memory_order_release);\n    if (thread_.joinable())\n      thread_.join();\n  }\n\n  /// @brief Total allocation/deallocation violations across all cycles.\n  [[nodiscard]] size_t allocationViolations() const {\n    return allocationViolations_.load(std::memory_order_acquire);\n  }\n\n  /// @brief Total involuntary context switches across all cycles.\n  /// @note macOS: process-wide (approximate). Linux: per-thread (exact).\n  [[nodiscard]] int64_t involuntaryContextSwitches() const {\n    return involuntaryCS_.load(std::memory_order_acquire);\n  }\n\n  /// @brief Total voluntary context switches across all cycles.\n  [[nodiscard]] int64_t voluntaryContextSwitches() const {\n    return voluntaryCS_.load(std::memory_order_acquire);\n  }\n\n  /// @brief Number of processing cycles completed.\n  [[nodiscard]] size_t cyclesCompleted() const {\n    return cycles_.load(std::memory_order_acquire);\n  }\n\n  /// @brief True if no allocation violations were detected.\n  [[nodiscard]] bool allocationClean() const {\n    return allocationViolations() == 0;\n  }\n\n private:\n  void run() {\n    // Name the thread for debugger / profiler visibility\n#ifdef __APPLE__\n    pthread_setname_np(\"MockAudioThread\");\n#elif defined(__linux__)\n    pthread_setname_np(pthread_self(), \"MockAudioThread\");\n#endif\n\n    // Warm up TLS slots so the very first guard check doesn't allocate\n    AudioThreadGuard::arm();\n    AudioThreadGuard::disarm();\n\n    while (running_.load(std::memory_order_acquire)) {\n      // Everything below must be allocation-free.\n      {\n        AudioThreadGuard::Scope guard;\n        graph_.processEvents();\n\n        // Toposort + compact orphaned nodes\n        graph_.process();\n\n        // Iterate topological order and call process()\n        processNodes();\n\n        // Accumulate stats from this cycle\n        allocationViolations_.fetch_add(guard.allocationViolations(), std::memory_order_relaxed);\n        involuntaryCS_.fetch_add(guard.involuntaryContextSwitches(), std::memory_order_relaxed);\n        voluntaryCS_.fetch_add(guard.voluntaryContextSwitches(), std::memory_order_relaxed);\n      }\n      cycles_.fetch_add(1, std::memory_order_relaxed);\n    }\n\n    // One final drain after stop signal\n    graph_.processEvents();\n    {\n      AudioThreadGuard::Scope guard;\n      graph_.process();\n      processNodes();\n\n      allocationViolations_.fetch_add(guard.allocationViolations(), std::memory_order_relaxed);\n      involuntaryCS_.fetch_add(guard.involuntaryContextSwitches(), std::memory_order_relaxed);\n      voluntaryCS_.fetch_add(guard.voluntaryContextSwitches(), std::memory_order_relaxed);\n    }\n    cycles_.fetch_add(1, std::memory_order_relaxed);\n  }\n\n  /// @brief Iterates nodes in topological order and calls process(inputs).\n  void processNodes() {\n    for (auto &&[node, inputs] : graph_.iter()) {\n      if constexpr (requires { node.process(inputs); }) {\n        node.process(inputs);\n      }\n    }\n  }\n\n  audioapi::utils::graph::Graph<NodeType> &graph_;\n  std::thread thread_;\n  std::atomic<bool> running_{false};\n  std::atomic<size_t> allocationViolations_{0};\n  std::atomic<int64_t> involuntaryCS_{0};\n  std::atomic<int64_t> voluntaryCS_{0};\n  std::atomic<size_t> cycles_{0};\n};\n\n} // namespace audioapi::test\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/graph/TestGraphUtils.cpp",
    "content": "#include \"TestGraphUtils.h\"\n\n#include <algorithm>\n#include <map>\n#include <memory>\n#include <utility>\n#include <vector>\n\nnamespace audioapi::utils::graph {\n\nstd::pair<AudioGraph<MockNode>, HostGraph<MockNode>> TestGraphUtils::createTestGraph(\n    std::vector<std::vector<size_t>> adjacencyList) {\n  HostGraph<MockNode> hostGraph = makeFromAdjacencyList(adjacencyList);\n  AudioGraph<MockNode> audioGraph = createAudioGraphFromHostGraph(hostGraph);\n  return {std::move(audioGraph), std::move(hostGraph)};\n}\n\nstd::vector<std::vector<size_t>> TestGraphUtils::convertAudioGraphToAdjacencyList(\n    const AudioGraph<MockNode> &audioGraph) {\n  std::vector<std::vector<size_t>> adjacencyList;\n  if (audioGraph.size() == 0)\n    return {};\n\n  size_t maxId = 0;\n  for (uint32_t i = 0; i < audioGraph.size(); i++) {\n    if (audioGraph[i].test_node_identifier__ > maxId) {\n      maxId = audioGraph[i].test_node_identifier__;\n    }\n  }\n\n  adjacencyList.resize(maxId + 1);\n\n  for (uint32_t i = 0; i < audioGraph.size(); i++) {\n    const auto &node = audioGraph[i];\n    size_t nodeId = node.test_node_identifier__;\n\n    for (uint32_t inputIdx : audioGraph.pool().view(node.input_head)) {\n      if (inputIdx < audioGraph.size()) {\n        size_t inputId = audioGraph[inputIdx].test_node_identifier__;\n        adjacencyList[inputId].push_back(nodeId);\n      }\n    }\n  }\n\n  for (auto &adj : adjacencyList) {\n    std::sort(adj.begin(), adj.end());\n  }\n\n  return adjacencyList;\n}\n\nstd::vector<std::vector<size_t>> TestGraphUtils::convertHostGraphToAdjacencyList(\n    const HostGraph<MockNode> &hostGraph) {\n  std::vector<std::vector<size_t>> adjacencyList;\n  if (hostGraph.nodes.empty())\n    return {};\n\n  size_t maxId = 0;\n  for (auto *n : hostGraph.nodes) {\n    if (n->test_node_identifier__ > maxId) {\n      maxId = n->test_node_identifier__;\n    }\n  }\n\n  adjacencyList.resize(maxId + 1);\n\n  for (auto *n : hostGraph.nodes) {\n    size_t nodeId = n->test_node_identifier__;\n    for (HostGraph<MockNode>::Node *output : n->outputs) {\n      if (output) {\n        adjacencyList[nodeId].push_back(output->test_node_identifier__);\n      }\n    }\n    std::sort(adjacencyList[nodeId].begin(), adjacencyList[nodeId].end());\n  }\n\n  return adjacencyList;\n}\n\nHostGraph<MockNode> TestGraphUtils::makeFromAdjacencyList(\n    const std::vector<std::vector<size_t>> &adjacencyList) {\n  HostGraph<MockNode> graph;\n  std::vector<HostGraph<MockNode>::Node *> nodesVec;\n  nodesVec.reserve(adjacencyList.size());\n\n  for (size_t i = 0; i < adjacencyList.size(); ++i) {\n    auto handle = std::make_shared<NodeHandle<MockNode>>(static_cast<uint32_t>(i), nullptr);\n    auto *node = new HostGraph<MockNode>::Node();\n    node->handle = handle;\n    node->test_node_identifier__ = i;\n    nodesVec.push_back(node);\n    graph.nodes.push_back(node);\n  }\n\n  for (size_t fromIndex = 0; fromIndex < adjacencyList.size(); ++fromIndex) {\n    for (size_t toIndex : adjacencyList[fromIndex]) {\n      if (fromIndex < nodesVec.size() && toIndex < nodesVec.size()) {\n        HostGraph<MockNode>::Node *fromNode = nodesVec[fromIndex];\n        HostGraph<MockNode>::Node *toNode = nodesVec[toIndex];\n        fromNode->outputs.push_back(toNode);\n        toNode->inputs.push_back(fromNode);\n      }\n    }\n  }\n\n  graph.last_term = 1;\n  return graph;\n}\n\nAudioGraph<MockNode> TestGraphUtils::createAudioGraphFromHostGraph(\n    const HostGraph<MockNode> &hostGraph) {\n  AudioGraph<MockNode> audioGraph;\n  if (hostGraph.nodes.empty())\n    return audioGraph;\n\n  for (auto *n : hostGraph.nodes) {\n    audioGraph.addNode(n->handle);\n  }\n\n  for (auto *n : hostGraph.nodes) {\n    uint32_t idx = n->handle->index;\n    audioGraph[idx].test_node_identifier__ = n->test_node_identifier__;\n\n    audioGraph.pool().freeAll(audioGraph[idx].input_head);\n    for (HostGraph<MockNode>::Node *input : n->inputs) {\n      audioGraph.pool().push(audioGraph[idx].input_head, input->handle->index);\n    }\n  }\n\n  audioGraph.markDirty();\n  return audioGraph;\n}\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/graph/TestGraphUtils.h",
    "content": "#pragma once\n\n#if !RN_AUDIO_API_TEST\n#error \"RN_AUDIO_API_TEST must be enabled to use TestGraphUtils\"\n#define RN_AUDIO_API_TEST true // for intellisense\n#endif\n\n#include <audioapi/core/OfflineAudioContext.h>\n#include <audioapi/core/utils/graph/AudioGraph.hpp>\n#include <audioapi/core/utils/graph/HostGraph.hpp>\n#include <audioapi/core/utils/graph/HostNode.hpp>\n#include <test/src/MockAudioEventHandlerRegistry.h>\n#include <atomic>\n#include <functional>\n#include <memory>\n#include <ranges>\n#include <span>\n#include <utility>\n#include <vector>\n\nnamespace audioapi::utils::graph {\n\n// ── MockNode ──────────────────────────────────────────────────────────────\n// Minimal AudioNode-derived type used by graph tests.\n\ninline std::shared_ptr<BaseAudioContext> getGraphTestContext() {\n  static std::shared_ptr<BaseAudioContext> context = [] {\n    auto eventRegistry = std::make_shared<MockAudioEventHandlerRegistry>();\n    auto ctx =\n        std::make_shared<OfflineAudioContext>(2, 1024, 44100.0f, eventRegistry, RuntimeRegistry{});\n    ctx->initialize();\n    return ctx;\n  }();\n  return context;\n}\n\nstruct MockNode : AudioNode {\n  explicit MockNode(bool destructible = true)\n      : AudioNode(getGraphTestContext()), destructible_(destructible) {}\n\n  [[nodiscard]] bool canBeDestructed() const override {\n    return destructible_.load(std::memory_order_acquire);\n  }\n\n  /// @brief Thread-safe setter for use in tests.\n  void setDestructible(bool value) {\n    destructible_.store(value, std::memory_order_release);\n  }\n\n private:\n  std::shared_ptr<DSPAudioBuffer> processNode(\n      const std::shared_ptr<DSPAudioBuffer> &processingBus,\n      int) override {\n    return processingBus;\n  }\n\n  std::atomic<bool> destructible_;\n};\n\n// ── MockHostNode ──────────────────────────────────────────────────────────\n// RAII wrapper around HostNode<MockNode> for testing the HostNode lifecycle.\n\nclass MockHostNode : public HostNode<MockNode> {\n public:\n  explicit MockHostNode(std::shared_ptr<Graph<MockNode>> graph, bool destructible = true)\n      : HostNode(std::move(graph), std::make_unique<MockNode>(destructible)) {}\n};\n\n// ── ProcessableMockNode ──────────────────────────────────────────────────\n// MockNode that carries an integer value and a user-provided callback\n// invoked during audio processing.\n//\n// `process(inputs)` accepts any range of `const ProcessableMockNode&`\n// (the inputs view from iter()), reads their values into a small stack\n// buffer, and passes them to the callback. Zero heap allocation.\n\nstruct ProcessableMockNode : MockNode {\n  /// @brief Callback: receives a span of input values, returns the new value.\n  using ProcessFn = std::function<int(std::span<const int>)>;\n\n  /// @brief The node's current output value, readable from any thread.\n  std::atomic<int> value{0};\n\n  static constexpr size_t kMaxInputs = 128;\n\n  explicit ProcessableMockNode(\n      ProcessFn processFn = nullptr,\n      int initialValue = 0,\n      bool destructible = true)\n      : MockNode(destructible), value(initialValue), processFn_(std::move(processFn)) {}\n\n  /// @brief Called by the audio thread with the inputs range from iter().\n  /// Collects input values into a stack buffer — no heap allocation.\n  template <std::ranges::input_range R>\n  void process(R &&inputs) {\n    if (!processFn_)\n      return;\n    int buf[kMaxInputs];\n    size_t n = 0;\n    for (const auto &input : inputs) {\n      if (n < kMaxInputs)\n        buf[n++] = input.value.load(std::memory_order_acquire);\n    }\n    value.store(processFn_({buf, n}), std::memory_order_release);\n  }\n\n private:\n  ProcessFn processFn_;\n};\n\n// ── TestGraphUtils ────────────────────────────────────────────────────────\n\nclass TestGraphUtils {\n public:\n  /// @brief Creates a paired AudioGraph + HostGraph from an adjacency list.\n  /// @param adjacencyList adjacencyList[i] = {j, k} means edges i→j, i→k\n  /// @return (AudioGraph, HostGraph) pair with consistent structure\n  static std::pair<AudioGraph<MockNode>, HostGraph<MockNode>> createTestGraph(\n      std::vector<std::vector<size_t>> adjacencyList);\n\n  /// @brief Converts AudioGraph to adjacency list for equality comparison.\n  static std::vector<std::vector<size_t>> convertAudioGraphToAdjacencyList(\n      const AudioGraph<MockNode> &audioGraph);\n\n  /// @brief Converts HostGraph to adjacency list for equality comparison.\n  static std::vector<std::vector<size_t>> convertHostGraphToAdjacencyList(\n      const HostGraph<MockNode> &hostGraph);\n\n private:\n  static HostGraph<MockNode> makeFromAdjacencyList(\n      const std::vector<std::vector<size_t>> &adjacencyList);\n\n  static AudioGraph<MockNode> createAudioGraphFromHostGraph(const HostGraph<MockNode> &hostGraph);\n};\n\n} // namespace audioapi::utils::graph\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/utils/AudioArrayTest.cpp",
    "content": "#include <audioapi/utils/AudioArray.hpp>\n#include <gtest/gtest.h>\n\n#include <numeric>\n#include <utility>\n#include <vector>\n\nusing namespace audioapi;\n\nstatic constexpr size_t ARR_SIZE = 128;\n\n// NOLINTBEGIN\n\nclass AudioArrayTest : public ::testing::Test {\n protected:\n  static void fill(AudioArray &arr, float value) {\n    for (size_t i = 0; i < arr.getSize(); ++i) {\n      arr[i] = value;\n    }\n  }\n\n  static void fillRamp(AudioArray &arr) {\n    for (size_t i = 0; i < arr.getSize(); ++i) {\n      arr[i] = static_cast<float>(i + 1);\n    }\n  }\n\n  static void expectAll(const AudioArray &arr, float expected, float tol = 0.0f) {\n    for (size_t i = 0; i < arr.getSize(); ++i) {\n      if (tol > 0.0f) {\n        EXPECT_NEAR(arr[i], expected, tol) << \"i=\" << i;\n      } else {\n        EXPECT_FLOAT_EQ(arr[i], expected) << \"i=\" << i;\n      }\n    }\n  }\n};\n\n// ---------------------------------------------------------------------------\n// Construction\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, SizeConstructorInitializesToZero) {\n  AudioArray arr(ARR_SIZE);\n  EXPECT_EQ(arr.getSize(), ARR_SIZE);\n  expectAll(arr, 0.0f);\n}\n\nTEST_F(AudioArrayTest, DataConstructorCopiesInput) {\n  std::vector<float> data(ARR_SIZE);\n  std::iota(data.begin(), data.end(), 1.0f);\n\n  AudioArray arr(data.data(), data.size());\n  EXPECT_EQ(arr.getSize(), ARR_SIZE);\n  for (size_t i = 0; i < ARR_SIZE; ++i) {\n    EXPECT_FLOAT_EQ(arr[i], static_cast<float>(i + 1));\n  }\n\n  data[0] = 999.0f;\n  EXPECT_FLOAT_EQ(arr[0], 1.0f);\n}\n\nTEST_F(AudioArrayTest, ZeroSizeConstructor) {\n  AudioArray arr(0);\n  EXPECT_EQ(arr.getSize(), 0u);\n}\n\n// ---------------------------------------------------------------------------\n// Copy & Move\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, CopyConstructorDeepCopies) {\n  AudioArray src(ARR_SIZE);\n  fillRamp(src);\n\n  AudioArray dst(src);\n  EXPECT_EQ(dst.getSize(), ARR_SIZE);\n  for (size_t i = 0; i < ARR_SIZE; ++i) {\n    EXPECT_FLOAT_EQ(dst[i], src[i]);\n  }\n\n  dst[0] = 999.0f;\n  EXPECT_FLOAT_EQ(src[0], 1.0f);\n}\n\nTEST_F(AudioArrayTest, MoveConstructorTransfersOwnership) {\n  AudioArray src(ARR_SIZE);\n  fill(src, 3.0f);\n\n  AudioArray dst(std::move(src));\n  EXPECT_EQ(dst.getSize(), ARR_SIZE);\n  expectAll(dst, 3.0f);\n  EXPECT_EQ(src.getSize(), 0u);\n}\n\nTEST_F(AudioArrayTest, CopyAssignment) {\n  AudioArray src(ARR_SIZE);\n  fill(src, 5.0f);\n\n  AudioArray dst(16);\n  dst = src;\n  EXPECT_EQ(dst.getSize(), ARR_SIZE);\n  expectAll(dst, 5.0f);\n}\n\nTEST_F(AudioArrayTest, CopyAssignmentSameSize) {\n  AudioArray src(ARR_SIZE);\n  fill(src, 7.0f);\n\n  AudioArray dst(ARR_SIZE);\n  dst = src;\n  expectAll(dst, 7.0f);\n}\n\nTEST_F(AudioArrayTest, MoveAssignment) {\n  AudioArray src(ARR_SIZE);\n  fill(src, 9.0f);\n\n  AudioArray dst(16);\n  dst = std::move(src);\n  EXPECT_EQ(dst.getSize(), ARR_SIZE);\n  expectAll(dst, 9.0f);\n  EXPECT_EQ(src.getSize(), 0u);\n}\n\nTEST_F(AudioArrayTest, SelfCopyAssignmentIsNoop) {\n  AudioArray arr(ARR_SIZE);\n  fill(arr, 1.0f);\n  arr = arr;\n  expectAll(arr, 1.0f);\n}\n\n// ---------------------------------------------------------------------------\n// operator[], begin/end, span\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, OperatorBracketReadWrite) {\n  AudioArray arr(ARR_SIZE);\n  arr[0] = 42.0f;\n  arr[ARR_SIZE - 1] = 99.0f;\n  EXPECT_FLOAT_EQ(arr[0], 42.0f);\n  EXPECT_FLOAT_EQ(arr[ARR_SIZE - 1], 99.0f);\n}\n\nTEST_F(AudioArrayTest, BeginEndIterators) {\n  AudioArray arr(ARR_SIZE);\n  fillRamp(arr);\n\n  EXPECT_EQ(static_cast<size_t>(arr.end() - arr.begin()), ARR_SIZE);\n  EXPECT_FLOAT_EQ(*arr.begin(), 1.0f);\n  EXPECT_FLOAT_EQ(*(arr.end() - 1), static_cast<float>(ARR_SIZE));\n}\n\nTEST_F(AudioArrayTest, SpanCoversFullArray) {\n  AudioArray arr(ARR_SIZE);\n  fillRamp(arr);\n  auto s = arr.span();\n  EXPECT_EQ(s.size(), ARR_SIZE);\n  EXPECT_FLOAT_EQ(s[0], 1.0f);\n}\n\nTEST_F(AudioArrayTest, SubSpanReturnsCorrectRange) {\n  AudioArray arr(ARR_SIZE);\n  fillRamp(arr);\n\n  auto sub = arr.subSpan(4, 10);\n  EXPECT_EQ(sub.size(), 4u);\n  for (size_t i = 0; i < 4; ++i) {\n    EXPECT_FLOAT_EQ(sub[i], static_cast<float>(11 + i));\n  }\n}\n\nTEST_F(AudioArrayTest, SubSpanThrowsOnOutOfRange) {\n  AudioArray arr(ARR_SIZE);\n  EXPECT_THROW(auto x = arr.subSpan(ARR_SIZE, 1), std::out_of_range);\n}\n\n// ---------------------------------------------------------------------------\n// Zero\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, ZeroEntireArray) {\n  AudioArray arr(ARR_SIZE);\n  fill(arr, 42.0f);\n  arr.zero();\n  expectAll(arr, 0.0f);\n}\n\nTEST_F(AudioArrayTest, ZeroPartialRange) {\n  AudioArray arr(ARR_SIZE);\n  fill(arr, 1.0f);\n  arr.zero(0, ARR_SIZE / 2);\n\n  for (size_t i = 0; i < ARR_SIZE / 2; ++i) {\n    EXPECT_FLOAT_EQ(arr[i], 0.0f);\n  }\n  for (size_t i = ARR_SIZE / 2; i < ARR_SIZE; ++i) {\n    EXPECT_FLOAT_EQ(arr[i], 1.0f);\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Sum\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, SumFullArrayDefaultGain) {\n  AudioArray dst(ARR_SIZE);\n  AudioArray src(ARR_SIZE);\n  fill(dst, 1.0f);\n  fill(src, 2.0f);\n\n  dst.sum(src);\n  expectAll(dst, 3.0f);\n}\n\nTEST_F(AudioArrayTest, SumFullArrayWithGain) {\n  AudioArray dst(ARR_SIZE);\n  AudioArray src(ARR_SIZE);\n  fill(dst, 1.0f);\n  fill(src, 4.0f);\n\n  dst.sum(src, 0.5f);\n  expectAll(dst, 3.0f);\n}\n\nTEST_F(AudioArrayTest, SumPartialRange) {\n  AudioArray dst(ARR_SIZE);\n  AudioArray src(ARR_SIZE);\n  fill(src, 1.0f);\n\n  dst.sum(src, 0, 0, ARR_SIZE / 2);\n  for (size_t i = 0; i < ARR_SIZE / 2; ++i) {\n    EXPECT_FLOAT_EQ(dst[i], 1.0f);\n  }\n  for (size_t i = ARR_SIZE / 2; i < ARR_SIZE; ++i) {\n    EXPECT_FLOAT_EQ(dst[i], 0.0f);\n  }\n}\n\nTEST_F(AudioArrayTest, SumWithOffset) {\n  AudioArray dst(ARR_SIZE);\n  AudioArray src(ARR_SIZE);\n  fill(src, 5.0f);\n\n  dst.sum(src, 0, ARR_SIZE / 2, ARR_SIZE / 2);\n  for (size_t i = 0; i < ARR_SIZE / 2; ++i) {\n    EXPECT_FLOAT_EQ(dst[i], 0.0f);\n  }\n  for (size_t i = ARR_SIZE / 2; i < ARR_SIZE; ++i) {\n    EXPECT_FLOAT_EQ(dst[i], 5.0f);\n  }\n}\n\nTEST_F(AudioArrayTest, SumThrowsOnOutOfRange) {\n  AudioArray dst(ARR_SIZE);\n  AudioArray src(ARR_SIZE);\n  EXPECT_THROW(dst.sum(src, 0, 0, ARR_SIZE + 1), std::out_of_range);\n}\n\nTEST_F(AudioArrayTest, SumAccumulatesMultipleCalls) {\n  AudioArray dst(ARR_SIZE);\n  AudioArray src(ARR_SIZE);\n  fill(src, 1.0f);\n\n  dst.sum(src);\n  dst.sum(src);\n  dst.sum(src);\n  expectAll(dst, 3.0f);\n}\n\n// ---------------------------------------------------------------------------\n// Multiply\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, MultiplyFullArray) {\n  AudioArray dst(ARR_SIZE);\n  AudioArray src(ARR_SIZE);\n  fill(dst, 3.0f);\n  fill(src, 2.0f);\n\n  dst.multiply(src);\n  expectAll(dst, 6.0f);\n}\n\nTEST_F(AudioArrayTest, MultiplyPartialLength) {\n  AudioArray dst(ARR_SIZE);\n  AudioArray src(ARR_SIZE);\n  fill(dst, 3.0f);\n  fill(src, 2.0f);\n\n  dst.multiply(src, ARR_SIZE / 2);\n  for (size_t i = 0; i < ARR_SIZE / 2; ++i) {\n    EXPECT_FLOAT_EQ(dst[i], 6.0f);\n  }\n  for (size_t i = ARR_SIZE / 2; i < ARR_SIZE; ++i) {\n    EXPECT_FLOAT_EQ(dst[i], 3.0f);\n  }\n}\n\nTEST_F(AudioArrayTest, MultiplyByZero) {\n  AudioArray dst(ARR_SIZE);\n  AudioArray src(ARR_SIZE);\n  fill(dst, 5.0f);\n  fill(src, 0.0f);\n\n  dst.multiply(src);\n  expectAll(dst, 0.0f);\n}\n\nTEST_F(AudioArrayTest, MultiplyThrowsOnOutOfRange) {\n  AudioArray dst(ARR_SIZE);\n  AudioArray src(ARR_SIZE / 2);\n  EXPECT_THROW(dst.multiply(src), std::out_of_range);\n}\n\n// ---------------------------------------------------------------------------\n// Copy (AudioArray source)\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, CopyFullArray) {\n  AudioArray src(ARR_SIZE);\n  AudioArray dst(ARR_SIZE);\n  fillRamp(src);\n  fill(dst, 99.0f);\n\n  dst.copy(src);\n  for (size_t i = 0; i < ARR_SIZE; ++i) {\n    EXPECT_FLOAT_EQ(dst[i], static_cast<float>(i + 1));\n  }\n}\n\nTEST_F(AudioArrayTest, CopyPartialRange) {\n  AudioArray src(ARR_SIZE);\n  AudioArray dst(ARR_SIZE);\n  fillRamp(src);\n\n  dst.copy(src, 10, 20, 5);\n  for (size_t i = 0; i < 5; ++i) {\n    EXPECT_FLOAT_EQ(dst[20 + i], static_cast<float>(11 + i));\n  }\n  EXPECT_FLOAT_EQ(dst[0], 0.0f);\n}\n\nTEST_F(AudioArrayTest, CopyThrowsWhenSourceTooSmall) {\n  AudioArray src(4);\n  AudioArray dst(ARR_SIZE);\n  EXPECT_THROW(dst.copy(src, 0, 0, 8), std::out_of_range);\n}\n\nTEST_F(AudioArrayTest, CopyThrowsWhenDestinationTooSmall) {\n  AudioArray src(ARR_SIZE);\n  AudioArray dst(4);\n  EXPECT_THROW(dst.copy(src, 0, 0, 8), std::out_of_range);\n}\n\n// ---------------------------------------------------------------------------\n// Copy (raw float pointer)\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, CopyFromRawPointer) {\n  float data[] = {10, 20, 30, 40};\n  AudioArray dst(4);\n\n  dst.copy(data, 0, 0, 4);\n  for (size_t i = 0; i < 4; ++i) {\n    EXPECT_FLOAT_EQ(dst[i], data[i]);\n  }\n}\n\nTEST_F(AudioArrayTest, CopyFromRawPointerWithOffset) {\n  float data[] = {10, 20, 30, 40, 50};\n  AudioArray dst(8);\n\n  dst.copy(data, 2, 1, 3);\n  EXPECT_FLOAT_EQ(dst[0], 0.0f);\n  EXPECT_FLOAT_EQ(dst[1], 30.0f);\n  EXPECT_FLOAT_EQ(dst[2], 40.0f);\n  EXPECT_FLOAT_EQ(dst[3], 50.0f);\n}\n\n// ---------------------------------------------------------------------------\n// CopyReverse\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, CopyReverse) {\n  AudioArray src(8);\n  AudioArray dst(8);\n  for (size_t i = 0; i < 8; ++i) {\n    src[i] = static_cast<float>(i + 1);\n  }\n\n  // sourceStart=4 means we start at index 4 and go backwards\n  dst.copyReverse(src, 4, 0, 4);\n  EXPECT_FLOAT_EQ(dst[0], 5.0f);\n  EXPECT_FLOAT_EQ(dst[1], 4.0f);\n  EXPECT_FLOAT_EQ(dst[2], 3.0f);\n  EXPECT_FLOAT_EQ(dst[3], 2.0f);\n}\n\n// ---------------------------------------------------------------------------\n// CopyTo (raw float pointer)\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, CopyToRawPointer) {\n  AudioArray src(ARR_SIZE);\n  fillRamp(src);\n\n  std::vector<float> dest(ARR_SIZE, 0.0f);\n  src.copyTo(dest.data(), 0, 0, ARR_SIZE);\n  for (size_t i = 0; i < ARR_SIZE; ++i) {\n    EXPECT_FLOAT_EQ(dest[i], static_cast<float>(i + 1));\n  }\n}\n\nTEST_F(AudioArrayTest, CopyToWithOffsets) {\n  AudioArray src(8);\n  fillRamp(src);\n\n  float dest[16] = {};\n  src.copyTo(dest, 2, 4, 3);\n  EXPECT_FLOAT_EQ(dest[4], 3.0f);\n  EXPECT_FLOAT_EQ(dest[5], 4.0f);\n  EXPECT_FLOAT_EQ(dest[6], 5.0f);\n  EXPECT_FLOAT_EQ(dest[0], 0.0f);\n}\n\nTEST_F(AudioArrayTest, CopyToThrowsOnOutOfRange) {\n  AudioArray src(4);\n  float dest[4] = {};\n  EXPECT_THROW(src.copyTo(dest, 2, 0, 4), std::out_of_range);\n}\n\n// ---------------------------------------------------------------------------\n// CopyWithin\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, CopyWithinForward) {\n  AudioArray arr(8);\n  for (size_t i = 0; i < 8; ++i) {\n    arr[i] = static_cast<float>(i + 1);\n  }\n\n  arr.copyWithin(0, 4, 4);\n  EXPECT_FLOAT_EQ(arr[4], 1.0f);\n  EXPECT_FLOAT_EQ(arr[5], 2.0f);\n  EXPECT_FLOAT_EQ(arr[6], 3.0f);\n  EXPECT_FLOAT_EQ(arr[7], 4.0f);\n}\n\nTEST_F(AudioArrayTest, CopyWithinOverlapping) {\n  AudioArray arr(8);\n  for (size_t i = 0; i < 8; ++i) {\n    arr[i] = static_cast<float>(i + 1);\n  }\n\n  // memmove handles overlapping regions correctly\n  arr.copyWithin(2, 0, 4);\n  EXPECT_FLOAT_EQ(arr[0], 3.0f);\n  EXPECT_FLOAT_EQ(arr[1], 4.0f);\n  EXPECT_FLOAT_EQ(arr[2], 5.0f);\n  EXPECT_FLOAT_EQ(arr[3], 6.0f);\n}\n\nTEST_F(AudioArrayTest, CopyWithinThrowsOnOutOfRange) {\n  AudioArray arr(8);\n  EXPECT_THROW(arr.copyWithin(0, 4, 8), std::out_of_range);\n}\n\n// ---------------------------------------------------------------------------\n// Reverse\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, ReverseArray) {\n  AudioArray arr(8);\n  for (size_t i = 0; i < 8; ++i) {\n    arr[i] = static_cast<float>(i + 1);\n  }\n\n  arr.reverse();\n  for (size_t i = 0; i < 8; ++i) {\n    EXPECT_FLOAT_EQ(arr[i], static_cast<float>(8 - i));\n  }\n}\n\nTEST_F(AudioArrayTest, ReverseSingleElement) {\n  AudioArray arr(1);\n  arr[0] = 42.0f;\n  arr.reverse();\n  EXPECT_FLOAT_EQ(arr[0], 42.0f);\n}\n\n// ---------------------------------------------------------------------------\n// Scale\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, Scale) {\n  AudioArray arr(ARR_SIZE);\n  fill(arr, 2.0f);\n  arr.scale(3.0f);\n  expectAll(arr, 6.0f);\n}\n\nTEST_F(AudioArrayTest, ScaleByZero) {\n  AudioArray arr(ARR_SIZE);\n  fill(arr, 5.0f);\n  arr.scale(0.0f);\n  expectAll(arr, 0.0f);\n}\n\nTEST_F(AudioArrayTest, ScaleNegative) {\n  AudioArray arr(ARR_SIZE);\n  fill(arr, 2.0f);\n  arr.scale(-1.0f);\n  expectAll(arr, -2.0f);\n}\n\n// ---------------------------------------------------------------------------\n// Normalize\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, NormalizeScalesToUnit) {\n  AudioArray arr(ARR_SIZE);\n  fill(arr, 4.0f);\n  arr.normalize();\n  expectAll(arr, 1.0f);\n}\n\nTEST_F(AudioArrayTest, NormalizeWithNegativeValues) {\n  AudioArray arr(4);\n  arr[0] = -8.0f;\n  arr[1] = 4.0f;\n  arr[2] = -2.0f;\n  arr[3] = 1.0f;\n\n  arr.normalize();\n  EXPECT_FLOAT_EQ(arr[0], -1.0f);\n  EXPECT_FLOAT_EQ(arr[1], 0.5f);\n  EXPECT_FLOAT_EQ(arr[2], -0.25f);\n  EXPECT_FLOAT_EQ(arr[3], 0.125f);\n}\n\nTEST_F(AudioArrayTest, NormalizeAllZerosIsNoop) {\n  AudioArray arr(ARR_SIZE);\n  arr.normalize();\n  expectAll(arr, 0.0f);\n}\n\nTEST_F(AudioArrayTest, NormalizeAlreadyNormalizedIsNoop) {\n  AudioArray arr(4);\n  arr[0] = 1.0f;\n  arr[1] = -0.5f;\n  arr[2] = 0.25f;\n  arr[3] = -1.0f;\n\n  arr.normalize();\n  EXPECT_FLOAT_EQ(arr[0], 1.0f);\n  EXPECT_FLOAT_EQ(arr[1], -0.5f);\n  EXPECT_FLOAT_EQ(arr[2], 0.25f);\n  EXPECT_FLOAT_EQ(arr[3], -1.0f);\n}\n\n// ---------------------------------------------------------------------------\n// GetMaxAbsValue\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioArrayTest, GetMaxAbsValue) {\n  AudioArray arr(4);\n  arr[0] = -5.0f;\n  arr[1] = 3.0f;\n  arr[2] = 1.0f;\n  arr[3] = -2.0f;\n  EXPECT_FLOAT_EQ(arr.getMaxAbsValue(), 5.0f);\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/utils/AudioBufferTest.cpp",
    "content": "#include <audioapi/utils/AudioBuffer.hpp>\n#include <gtest/gtest.h>\n\n#include <cmath>\n#include <utility>\n#include <vector>\n\nusing namespace audioapi;\n\n// NOLINTBEGIN\nstatic const float SQRT_HALF = sqrtf(0.5f);\nstatic constexpr size_t BUF_SIZE = 10;\nstatic constexpr float SR = 44100.0f;\n\nclass AudioBufferTest : public ::testing::Test {\n protected:\n  static void fillChannel(AudioBuffer &buf, size_t ch, float value) {\n    auto *channel = buf.getChannel(ch);\n    for (size_t i = 0; i < buf.getSize(); ++i) {\n      (*channel)[i] = value;\n    }\n  }\n\n  static void fillAllChannels(AudioBuffer &buf, float value) {\n    for (size_t ch = 0; ch < buf.getNumberOfChannels(); ++ch) {\n      fillChannel(buf, ch, value);\n    }\n  }\n\n  static void expectChannel(const AudioBuffer &buf, size_t ch, float expected, float tol = 0.0f) {\n    auto *channel = buf.getChannel(ch);\n    for (size_t i = 0; i < buf.getSize(); ++i) {\n      if (tol > 0.0f) {\n        EXPECT_NEAR((*channel)[i], expected, tol) << \"ch=\" << ch << \" i=\" << i;\n      } else {\n        EXPECT_FLOAT_EQ((*channel)[i], expected) << \"ch=\" << ch << \" i=\" << i;\n      }\n    }\n  }\n};\n\n// ---------------------------------------------------------------------------\n// Construction & Properties\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioBufferTest, ConstructorSetsProperties) {\n  AudioBuffer buf(BUF_SIZE, 2, SR);\n  EXPECT_EQ(buf.getSize(), BUF_SIZE);\n  EXPECT_EQ(buf.getNumberOfChannels(), 2u);\n  EXPECT_FLOAT_EQ(buf.getSampleRate(), SR);\n}\n\nTEST_F(AudioBufferTest, DurationIsCorrect) {\n  AudioBuffer buf(static_cast<size_t>(SR), 1, SR);\n  EXPECT_DOUBLE_EQ(buf.getDuration(), 1.0);\n\n  AudioBuffer buf2(static_cast<size_t>(SR * 2), 1, SR);\n  EXPECT_DOUBLE_EQ(buf2.getDuration(), 2.0);\n}\n\nTEST_F(AudioBufferTest, ChannelsInitializedToZero) {\n  AudioBuffer buf(BUF_SIZE, 2, SR);\n  expectChannel(buf, 0, 0.0f);\n  expectChannel(buf, 1, 0.0f);\n}\n\n// ---------------------------------------------------------------------------\n// Copy & Move semantics\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioBufferTest, CopyConstructorDeepCopies) {\n  AudioBuffer src(BUF_SIZE, 2, SR);\n  fillChannel(src, 0, 1.0f);\n  fillChannel(src, 1, 2.0f);\n\n  AudioBuffer dst(src);\n  EXPECT_EQ(dst.getNumberOfChannels(), 2u);\n  expectChannel(dst, 0, 1.0f);\n  expectChannel(dst, 1, 2.0f);\n\n  fillChannel(dst, 0, 99.0f);\n  expectChannel(src, 0, 1.0f);\n}\n\nTEST_F(AudioBufferTest, MoveConstructorTransfersOwnership) {\n  AudioBuffer src(BUF_SIZE, 2, SR);\n  fillChannel(src, 0, 3.0f);\n\n  AudioBuffer dst(std::move(src));\n  EXPECT_EQ(dst.getSize(), BUF_SIZE);\n  EXPECT_EQ(dst.getNumberOfChannels(), 2u);\n  expectChannel(dst, 0, 3.0f);\n\n  EXPECT_EQ(src.getSize(), 0u);\n  EXPECT_EQ(src.getNumberOfChannels(), 0u);\n}\n\nTEST_F(AudioBufferTest, CopyAssignment) {\n  AudioBuffer src(BUF_SIZE, 2, SR);\n  fillChannel(src, 0, 5.0f);\n  fillChannel(src, 1, 6.0f);\n\n  AudioBuffer dst(64, 1, 22050.0f);\n  dst = src;\n  EXPECT_EQ(dst.getSize(), BUF_SIZE);\n  EXPECT_EQ(dst.getNumberOfChannels(), 2u);\n  EXPECT_FLOAT_EQ(dst.getSampleRate(), SR);\n  expectChannel(dst, 0, 5.0f);\n  expectChannel(dst, 1, 6.0f);\n}\n\nTEST_F(AudioBufferTest, CopyAssignmentSameChannelCount) {\n  AudioBuffer src(BUF_SIZE, 2, SR);\n  fillChannel(src, 0, 5.0f);\n  fillChannel(src, 1, 6.0f);\n\n  AudioBuffer dst(BUF_SIZE, 2, SR);\n  dst = src;\n  expectChannel(dst, 0, 5.0f);\n  expectChannel(dst, 1, 6.0f);\n}\n\nTEST_F(AudioBufferTest, MoveAssignment) {\n  AudioBuffer src(BUF_SIZE, 2, SR);\n  fillChannel(src, 0, 7.0f);\n\n  AudioBuffer dst(64, 1, 22050.0f);\n  dst = std::move(src);\n  EXPECT_EQ(dst.getSize(), BUF_SIZE);\n  EXPECT_EQ(dst.getNumberOfChannels(), 2u);\n  expectChannel(dst, 0, 7.0f);\n\n  EXPECT_EQ(src.getSize(), 0u);\n  EXPECT_EQ(src.getNumberOfChannels(), 0u);\n}\n\n// ---------------------------------------------------------------------------\n// getChannelByType\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioBufferTest, GetChannelByType_Stereo) {\n  AudioBuffer buf(BUF_SIZE, 2, SR);\n  fillChannel(buf, 0, 1.0f);\n  fillChannel(buf, 1, 2.0f);\n  EXPECT_FLOAT_EQ((*buf.getChannelByType(AudioBuffer::ChannelLeft))[0], 1.0f);\n  EXPECT_FLOAT_EQ((*buf.getChannelByType(AudioBuffer::ChannelRight))[0], 2.0f);\n}\n\nTEST_F(AudioBufferTest, GetChannelByType_5_1) {\n  AudioBuffer buf(BUF_SIZE, 6, SR);\n  for (size_t ch = 0; ch < 6; ++ch) {\n    fillChannel(buf, ch, static_cast<float>(ch));\n  }\n  EXPECT_FLOAT_EQ((*buf.getChannelByType(AudioBuffer::ChannelLeft))[0], 0.0f);\n  EXPECT_FLOAT_EQ((*buf.getChannelByType(AudioBuffer::ChannelRight))[0], 1.0f);\n  EXPECT_FLOAT_EQ((*buf.getChannelByType(AudioBuffer::ChannelCenter))[0], 2.0f);\n  EXPECT_FLOAT_EQ((*buf.getChannelByType(AudioBuffer::ChannelLFE))[0], 3.0f);\n  EXPECT_FLOAT_EQ((*buf.getChannelByType(AudioBuffer::ChannelSurroundLeft))[0], 4.0f);\n  EXPECT_FLOAT_EQ((*buf.getChannelByType(AudioBuffer::ChannelSurroundRight))[0], 5.0f);\n}\n\nTEST_F(AudioBufferTest, GetChannelByType_ReturnsNullForUnknownLayout) {\n  AudioBuffer buf(BUF_SIZE, 3, SR);\n  EXPECT_EQ(buf.getChannelByType(AudioBuffer::ChannelLeft), nullptr);\n}\n\n// ---------------------------------------------------------------------------\n// operator[]\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioBufferTest, OperatorBracket) {\n  AudioBuffer buf(BUF_SIZE, 2, SR);\n  buf[0][0] = 42.0f;\n  buf[1][0] = 99.0f;\n  EXPECT_FLOAT_EQ(buf[0][0], 42.0f);\n  EXPECT_FLOAT_EQ(buf[1][0], 99.0f);\n\n  const AudioBuffer &cbuf = buf;\n  EXPECT_FLOAT_EQ(cbuf[0][0], 42.0f);\n}\n\n// ---------------------------------------------------------------------------\n// Zero\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioBufferTest, ZeroEntireBuffer) {\n  AudioBuffer buf(BUF_SIZE, 2, SR);\n  fillAllChannels(buf, 42.0f);\n  buf.zero();\n  expectChannel(buf, 0, 0.0f);\n  expectChannel(buf, 1, 0.0f);\n}\n\nTEST_F(AudioBufferTest, ZeroPartialRange) {\n  AudioBuffer buf(BUF_SIZE, 1, SR);\n  fillChannel(buf, 0, 1.0f);\n  buf.zero(0, BUF_SIZE / 2);\n\n  auto *ch = buf.getChannel(0);\n  for (size_t i = 0; i < BUF_SIZE / 2; ++i) {\n    EXPECT_FLOAT_EQ((*ch)[i], 0.0f);\n  }\n  for (size_t i = BUF_SIZE / 2; i < BUF_SIZE; ++i) {\n    EXPECT_FLOAT_EQ((*ch)[i], 1.0f);\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Scale & Normalize\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioBufferTest, ScaleMultipliesAllSamples) {\n  AudioBuffer buf(BUF_SIZE, 2, SR);\n  fillChannel(buf, 0, 2.0f);\n  fillChannel(buf, 1, -3.0f);\n  buf.scale(0.5f);\n  expectChannel(buf, 0, 1.0f);\n  expectChannel(buf, 1, -1.5f);\n}\n\nTEST_F(AudioBufferTest, NormalizeScalesToUnitPeak) {\n  AudioBuffer buf(BUF_SIZE, 1, SR);\n  fillChannel(buf, 0, 4.0f);\n  buf.normalize();\n  expectChannel(buf, 0, 1.0f);\n}\n\n// ---------------------------------------------------------------------------\n// Sum — same channel count\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioBufferTest, SumSameChannelCount) {\n  AudioBuffer dst(BUF_SIZE, 2, SR);\n  AudioBuffer src(BUF_SIZE, 2, SR);\n  fillChannel(dst, 0, 1.0f);\n  fillChannel(dst, 1, 2.0f);\n  fillChannel(src, 0, 10.0f);\n  fillChannel(src, 1, 20.0f);\n\n  dst.sum(src);\n  expectChannel(dst, 0, 11.0f);\n  expectChannel(dst, 1, 22.0f);\n}\n\nTEST_F(AudioBufferTest, SumSelfIsNoop) {\n  AudioBuffer buf(BUF_SIZE, 1, SR);\n  fillChannel(buf, 0, 5.0f);\n  buf.sum(buf);\n  expectChannel(buf, 0, 5.0f);\n}\n\nTEST_F(AudioBufferTest, SumPartialRange) {\n  AudioBuffer dst(BUF_SIZE, 1, SR);\n  AudioBuffer src(BUF_SIZE, 1, SR);\n  fillChannel(src, 0, 1.0f);\n\n  dst.sum(src, 0, 0, BUF_SIZE / 2);\n  auto *ch = dst.getChannel(0);\n  for (size_t i = 0; i < BUF_SIZE / 2; ++i) {\n    EXPECT_FLOAT_EQ((*ch)[i], 1.0f);\n  }\n  for (size_t i = BUF_SIZE / 2; i < BUF_SIZE; ++i) {\n    EXPECT_FLOAT_EQ((*ch)[i], 0.0f);\n  }\n}\n\nTEST_F(AudioBufferTest, SumAccumulatesMultipleSources) {\n  AudioBuffer dst(BUF_SIZE, 1, SR);\n  AudioBuffer a(BUF_SIZE, 1, SR);\n  AudioBuffer b(BUF_SIZE, 1, SR);\n  fillChannel(a, 0, 1.0f);\n  fillChannel(b, 0, 2.0f);\n\n  dst.sum(a);\n  dst.sum(b);\n  expectChannel(dst, 0, 3.0f);\n}\n\n// ---------------------------------------------------------------------------\n// Up-mixing (SPEAKERS interpretation)\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioBufferTest, UpMix_1_to_2) {\n  AudioBuffer src(BUF_SIZE, 1, SR);\n  AudioBuffer dst(BUF_SIZE, 2, SR);\n  fillChannel(src, 0, 1.0f);\n\n  dst.sum(src);\n  expectChannel(dst, 0, 1.0f);\n  expectChannel(dst, 1, 1.0f);\n}\n\nTEST_F(AudioBufferTest, UpMix_1_to_4) {\n  AudioBuffer src(BUF_SIZE, 1, SR);\n  AudioBuffer dst(BUF_SIZE, 4, SR);\n  fillChannel(src, 0, 1.0f);\n\n  dst.sum(src);\n  expectChannel(dst, 0, 1.0f);\n  expectChannel(dst, 1, 1.0f);\n  expectChannel(dst, 2, 0.0f);\n  expectChannel(dst, 3, 0.0f);\n}\n\nTEST_F(AudioBufferTest, UpMix_1_to_6) {\n  AudioBuffer src(BUF_SIZE, 1, SR);\n  AudioBuffer dst(BUF_SIZE, 6, SR);\n  fillChannel(src, 0, 1.0f);\n\n  dst.sum(src);\n  expectChannel(dst, 0, 0.0f);\n  expectChannel(dst, 1, 0.0f);\n  expectChannel(dst, 2, 1.0f); // Center\n  expectChannel(dst, 3, 0.0f);\n  expectChannel(dst, 4, 0.0f);\n  expectChannel(dst, 5, 0.0f);\n}\n\nTEST_F(AudioBufferTest, UpMix_2_to_4) {\n  AudioBuffer src(BUF_SIZE, 2, SR);\n  AudioBuffer dst(BUF_SIZE, 4, SR);\n  fillChannel(src, 0, 1.0f);\n  fillChannel(src, 1, 2.0f);\n\n  dst.sum(src);\n  expectChannel(dst, 0, 1.0f);\n  expectChannel(dst, 1, 2.0f);\n  expectChannel(dst, 2, 0.0f);\n  expectChannel(dst, 3, 0.0f);\n}\n\nTEST_F(AudioBufferTest, UpMix_2_to_6) {\n  AudioBuffer src(BUF_SIZE, 2, SR);\n  AudioBuffer dst(BUF_SIZE, 6, SR);\n  fillChannel(src, 0, 1.0f);\n  fillChannel(src, 1, 2.0f);\n\n  dst.sum(src);\n  expectChannel(dst, 0, 1.0f);\n  expectChannel(dst, 1, 2.0f);\n  expectChannel(dst, 2, 0.0f);\n  expectChannel(dst, 3, 0.0f);\n  expectChannel(dst, 4, 0.0f);\n  expectChannel(dst, 5, 0.0f);\n}\n\nTEST_F(AudioBufferTest, UpMix_4_to_6) {\n  AudioBuffer src(BUF_SIZE, 4, SR);\n  AudioBuffer dst(BUF_SIZE, 6, SR);\n  fillChannel(src, 0, 1.0f);\n  fillChannel(src, 1, 2.0f);\n  fillChannel(src, 2, 3.0f);\n  fillChannel(src, 3, 4.0f);\n\n  dst.sum(src);\n  expectChannel(dst, 0, 1.0f);\n  expectChannel(dst, 1, 2.0f);\n  expectChannel(dst, 2, 0.0f);\n  expectChannel(dst, 3, 0.0f);\n  expectChannel(dst, 4, 3.0f);\n  expectChannel(dst, 5, 4.0f);\n}\n\n// ---------------------------------------------------------------------------\n// Down-mixing (SPEAKERS interpretation)\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioBufferTest, DownMix_2_to_1) {\n  AudioBuffer src(BUF_SIZE, 2, SR);\n  AudioBuffer dst(BUF_SIZE, 1, SR);\n  fillChannel(src, 0, 1.0f);\n  fillChannel(src, 1, 1.0f);\n\n  dst.sum(src);\n  expectChannel(dst, 0, 1.0f); // 0.5 + 0.5\n}\n\nTEST_F(AudioBufferTest, DownMix_2_to_1_Asymmetric) {\n  AudioBuffer src(BUF_SIZE, 2, SR);\n  AudioBuffer dst(BUF_SIZE, 1, SR);\n  fillChannel(src, 0, 2.0f);\n  fillChannel(src, 1, 4.0f);\n\n  dst.sum(src);\n  expectChannel(dst, 0, 3.0f); // 0.5*2 + 0.5*4\n}\n\nTEST_F(AudioBufferTest, DownMix_4_to_1) {\n  AudioBuffer src(BUF_SIZE, 4, SR);\n  AudioBuffer dst(BUF_SIZE, 1, SR);\n  fillAllChannels(src, 1.0f);\n\n  dst.sum(src);\n  expectChannel(dst, 0, 1.0f); // 0.25 * 4\n}\n\nTEST_F(AudioBufferTest, DownMix_6_to_1) {\n  AudioBuffer src(BUF_SIZE, 6, SR);\n  AudioBuffer dst(BUF_SIZE, 1, SR);\n  fillAllChannels(src, 1.0f);\n  fillChannel(src, 3, 0.0f); // LFE not part of the formula\n\n  dst.sum(src);\n  // sqrt(0.5)*L + sqrt(0.5)*R + C + 0.5*SL + 0.5*SR\n  float expected = 2.0f * SQRT_HALF + 1.0f + 2.0f * 0.5f;\n  expectChannel(dst, 0, expected, 1e-6f);\n}\n\nTEST_F(AudioBufferTest, DownMix_4_to_2) {\n  AudioBuffer src(BUF_SIZE, 4, SR);\n  AudioBuffer dst(BUF_SIZE, 2, SR);\n  fillAllChannels(src, 1.0f);\n\n  dst.sum(src);\n  // L += 0.5*(L + SL) = 1.0, R += 0.5*(R + SR) = 1.0\n  expectChannel(dst, 0, 1.0f);\n  expectChannel(dst, 1, 1.0f);\n}\n\nTEST_F(AudioBufferTest, DownMix_6_to_2) {\n  AudioBuffer src(BUF_SIZE, 6, SR);\n  AudioBuffer dst(BUF_SIZE, 2, SR);\n  fillAllChannels(src, 1.0f);\n  fillChannel(src, 3, 0.0f); // LFE\n\n  dst.sum(src);\n  // L += L + sqrt(0.5)*(C + SL), R += R + sqrt(0.5)*(C + SR)\n  float expected = 1.0f + 2.0f * SQRT_HALF;\n  expectChannel(dst, 0, expected, 1e-6f);\n  expectChannel(dst, 1, expected, 1e-6f);\n}\n\nTEST_F(AudioBufferTest, DownMix_6_to_4) {\n  AudioBuffer src(BUF_SIZE, 6, SR);\n  AudioBuffer dst(BUF_SIZE, 4, SR);\n  fillAllChannels(src, 1.0f);\n  fillChannel(src, 3, 0.0f); // LFE\n\n  dst.sum(src);\n  // L += L + sqrt(0.5)*C, R += R + sqrt(0.5)*C\n  float expectedLR = 1.0f + SQRT_HALF;\n  expectChannel(dst, 0, expectedLR, 1e-6f);\n  expectChannel(dst, 1, expectedLR, 1e-6f);\n  // SL += SL, SR += SR\n  expectChannel(dst, 2, 1.0f);\n  expectChannel(dst, 3, 1.0f);\n}\n\n// ---------------------------------------------------------------------------\n// Discrete interpretation\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioBufferTest, DiscreteSum_SourceMoreChannels) {\n  AudioBuffer src(BUF_SIZE, 4, SR);\n  AudioBuffer dst(BUF_SIZE, 2, SR);\n  fillChannel(src, 0, 1.0f);\n  fillChannel(src, 1, 2.0f);\n  fillChannel(src, 2, 3.0f);\n  fillChannel(src, 3, 4.0f);\n\n  dst.sum(src, ChannelInterpretation::DISCRETE);\n  expectChannel(dst, 0, 1.0f);\n  expectChannel(dst, 1, 2.0f);\n}\n\nTEST_F(AudioBufferTest, DiscreteSum_SourceFewerChannels) {\n  AudioBuffer src(BUF_SIZE, 1, SR);\n  AudioBuffer dst(BUF_SIZE, 2, SR);\n  fillChannel(dst, 1, 5.0f);\n  fillChannel(src, 0, 1.0f);\n\n  dst.sum(src, ChannelInterpretation::DISCRETE);\n  expectChannel(dst, 0, 1.0f);\n  expectChannel(dst, 1, 5.0f); // untouched\n}\n\n// ---------------------------------------------------------------------------\n// Copy (including up/down-mix via zero+sum)\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioBufferTest, CopySameChannelCount) {\n  AudioBuffer src(BUF_SIZE, 2, SR);\n  AudioBuffer dst(BUF_SIZE, 2, SR);\n  fillAllChannels(dst, 99.0f);\n  fillChannel(src, 0, 1.0f);\n  fillChannel(src, 1, 2.0f);\n\n  dst.copy(src);\n  expectChannel(dst, 0, 1.0f);\n  expectChannel(dst, 1, 2.0f);\n}\n\nTEST_F(AudioBufferTest, CopyWithUpMixing) {\n  AudioBuffer src(BUF_SIZE, 1, SR);\n  AudioBuffer dst(BUF_SIZE, 2, SR);\n  fillAllChannels(dst, 99.0f);\n  fillChannel(src, 0, 1.0f);\n\n  dst.copy(src);\n  expectChannel(dst, 0, 1.0f);\n  expectChannel(dst, 1, 1.0f);\n}\n\nTEST_F(AudioBufferTest, CopyWithDownMixing) {\n  AudioBuffer src(BUF_SIZE, 2, SR);\n  AudioBuffer dst(BUF_SIZE, 1, SR);\n  fillChannel(dst, 0, 99.0f);\n  fillChannel(src, 0, 1.0f);\n  fillChannel(src, 1, 1.0f);\n\n  dst.copy(src);\n  expectChannel(dst, 0, 1.0f); // 0.5 + 0.5\n}\n\nTEST_F(AudioBufferTest, CopySelfIsNoop) {\n  AudioBuffer buf(BUF_SIZE, 1, SR);\n  fillChannel(buf, 0, 7.0f);\n  buf.copy(buf);\n  expectChannel(buf, 0, 7.0f);\n}\n\nTEST_F(AudioBufferTest, CopyPartialRange) {\n  AudioBuffer src(BUF_SIZE, 1, SR);\n  AudioBuffer dst(BUF_SIZE, 1, SR);\n  fillChannel(dst, 0, 99.0f);\n  fillChannel(src, 0, 1.0f);\n\n  dst.copy(src, 0, 0, BUF_SIZE / 2);\n  auto *ch = dst.getChannel(0);\n  for (size_t i = 0; i < BUF_SIZE / 2; ++i) {\n    EXPECT_FLOAT_EQ((*ch)[i], 1.0f);\n  }\n  for (size_t i = BUF_SIZE / 2; i < BUF_SIZE; ++i) {\n    EXPECT_FLOAT_EQ((*ch)[i], 99.0f);\n  }\n}\n\n// ---------------------------------------------------------------------------\n// Interleave / Deinterleave\n// ---------------------------------------------------------------------------\n\nTEST_F(AudioBufferTest, DeinterleaveMono) {\n  constexpr size_t FRAMES = 4;\n  AudioBuffer buf(FRAMES, 1, SR);\n  float data[] = {10, 20, 30, 40};\n\n  buf.deinterleaveFrom(data, FRAMES);\n  auto *ch = buf.getChannel(0);\n  for (size_t i = 0; i < FRAMES; ++i) {\n    EXPECT_FLOAT_EQ((*ch)[i], data[i]);\n  }\n}\n\nTEST_F(AudioBufferTest, DeinterleaveStereo) {\n  constexpr size_t FRAMES = 4;\n  AudioBuffer buf(FRAMES, 2, SR);\n  float interleaved[] = {1, 2, 3, 4, 5, 6, 7, 8};\n\n  buf.deinterleaveFrom(interleaved, FRAMES);\n  auto *left = buf.getChannel(0);\n  auto *right = buf.getChannel(1);\n  EXPECT_FLOAT_EQ((*left)[0], 1.0f);\n  EXPECT_FLOAT_EQ((*left)[1], 3.0f);\n  EXPECT_FLOAT_EQ((*left)[2], 5.0f);\n  EXPECT_FLOAT_EQ((*left)[3], 7.0f);\n  EXPECT_FLOAT_EQ((*right)[0], 2.0f);\n  EXPECT_FLOAT_EQ((*right)[1], 4.0f);\n  EXPECT_FLOAT_EQ((*right)[2], 6.0f);\n  EXPECT_FLOAT_EQ((*right)[3], 8.0f);\n}\n\nTEST_F(AudioBufferTest, InterleaveStereo) {\n  constexpr size_t FRAMES = 4;\n  AudioBuffer buf(FRAMES, 2, SR);\n  auto *left = buf.getChannel(0);\n  auto *right = buf.getChannel(1);\n  for (size_t i = 0; i < FRAMES; ++i) {\n    (*left)[i] = static_cast<float>(2 * i + 1);\n    (*right)[i] = static_cast<float>(2 * i + 2);\n  }\n\n  float interleaved[8] = {};\n  buf.interleaveTo(interleaved, FRAMES);\n  for (size_t i = 0; i < FRAMES * 2; ++i) {\n    EXPECT_FLOAT_EQ(interleaved[i], static_cast<float>(i + 1));\n  }\n}\n\nTEST_F(AudioBufferTest, InterleaveDeinterleaveRoundtrip) {\n  constexpr size_t FRAMES = 64;\n  AudioBuffer buf(FRAMES, 2, SR);\n  auto *left = buf.getChannel(0);\n  auto *right = buf.getChannel(1);\n  for (size_t i = 0; i < FRAMES; ++i) {\n    (*left)[i] = static_cast<float>(i);\n    (*right)[i] = static_cast<float>(i + 100);\n  }\n\n  std::vector<float> interleaved(FRAMES * 2);\n  buf.interleaveTo(interleaved.data(), FRAMES);\n\n  AudioBuffer buf2(FRAMES, 2, SR);\n  buf2.deinterleaveFrom(interleaved.data(), FRAMES);\n\n  for (size_t i = 0; i < FRAMES; ++i) {\n    EXPECT_FLOAT_EQ((*buf2.getChannel(0))[i], static_cast<float>(i));\n    EXPECT_FLOAT_EQ((*buf2.getChannel(1))[i], static_cast<float>(i + 100));\n  }\n}\n\nTEST_F(AudioBufferTest, DeinterleaveMultichannel) {\n  constexpr size_t FRAMES = 4;\n  constexpr int CHANNELS = 4;\n  AudioBuffer buf(FRAMES, CHANNELS, SR);\n  // [ch0_f0, ch1_f0, ch2_f0, ch3_f0, ch0_f1, ...]\n  float interleaved[FRAMES * CHANNELS];\n  for (size_t i = 0; i < FRAMES * CHANNELS; ++i) {\n    interleaved[i] = static_cast<float>(i);\n  }\n\n  buf.deinterleaveFrom(interleaved, FRAMES);\n  for (size_t f = 0; f < FRAMES; ++f) {\n    for (size_t ch = 0; ch < CHANNELS; ++ch) {\n      EXPECT_FLOAT_EQ((*buf.getChannel(ch))[f], static_cast<float>(f * CHANNELS + ch));\n    }\n  }\n}\n\nTEST_F(AudioBufferTest, DeinterleaveZeroFramesIsNoop) {\n  AudioBuffer buf(BUF_SIZE, 2, SR);\n  fillAllChannels(buf, 42.0f);\n  float dummy[] = {999.0f, 999.0f};\n  buf.deinterleaveFrom(dummy, 0);\n  expectChannel(buf, 0, 42.0f);\n}\n\n// NOLINTEND\n"
  },
  {
    "path": "packages/react-native-audio-api/common/cpp/test/src/utils/TripleBufferTest.cpp",
    "content": "#include <audioapi/utils/TripleBuffer.hpp>\n#include <gtest/gtest.h>\n\n#include <atomic>\n#include <chrono>\n#include <thread>\n\nusing namespace audioapi;\n\nstruct IntVal {\n  int value{0};\n  explicit IntVal(int v = 0) : value(v) {}\n};\n\n// NOLINTBEGIN\n\n// ---------------------------------------------------------------------------\n// Functional Tests\n// ---------------------------------------------------------------------------\n\nclass TripleBufferTest : public ::testing::Test {};\n\nTEST_F(TripleBufferTest, GetForWriterReturnsNonNull) {\n  TripleBuffer<IntVal> buf;\n  EXPECT_NE(buf.getForWriter(), nullptr);\n}\n\nTEST_F(TripleBufferTest, GetForReaderReturnsNonNull) {\n  TripleBuffer<IntVal> buf;\n  EXPECT_NE(buf.getForReader(), nullptr);\n}\n\nTEST_F(TripleBufferTest, ConstructorForwardsArguments) {\n  TripleBuffer<IntVal> buf(42);\n  EXPECT_EQ(buf.getForWriter()->value, 42);\n  EXPECT_EQ(buf.getForReader()->value, 42);\n}\n\nTEST_F(TripleBufferTest, ReaderAndWriterPointToDifferentBuffers) {\n  TripleBuffer<IntVal> buf;\n  EXPECT_NE(buf.getForWriter(), buf.getForReader());\n}\n\nTEST_F(TripleBufferTest, PublishMakesWrittenDataVisibleToReader) {\n  TripleBuffer<IntVal> buf;\n\n  buf.getForWriter()->value = 99;\n  buf.publish();\n\n  EXPECT_EQ(buf.getForReader()->value, 99);\n}\n\nTEST_F(TripleBufferTest, ReaderReturnsSameBufferWithoutPublish) {\n  TripleBuffer<IntVal> buf;\n\n  auto *first = buf.getForReader();\n  auto *second = buf.getForReader();\n  EXPECT_EQ(first, second);\n}\n\nTEST_F(TripleBufferTest, MultiplePublishesWithoutReadShowLatestValue) {\n  TripleBuffer<IntVal> buf;\n\n  for (int i = 1; i <= 5; ++i) {\n    buf.getForWriter()->value = i;\n    buf.publish();\n  }\n\n  EXPECT_EQ(buf.getForReader()->value, 5);\n}\n\nTEST_F(TripleBufferTest, ReadClearsUpdateFlag) {\n  TripleBuffer<IntVal> buf;\n\n  buf.getForWriter()->value = 42;\n  buf.publish();\n\n  auto *first = buf.getForReader();\n  auto *second = buf.getForReader();\n\n  EXPECT_EQ(first, second);\n}\n\nTEST_F(TripleBufferTest, WriterPointerIsStableBeforePublish) {\n  TripleBuffer<IntVal> buf;\n\n  auto *w1 = buf.getForWriter();\n  auto *w2 = buf.getForWriter();\n  EXPECT_EQ(w1, w2);\n}\n\nTEST_F(TripleBufferTest, WriterBufferChangesAfterPublish) {\n  TripleBuffer<IntVal> buf;\n\n  auto *before = buf.getForWriter();\n  buf.publish();\n  auto *after = buf.getForWriter();\n\n  EXPECT_NE(before, after);\n}\n\nTEST_F(TripleBufferTest, AlternatingWriteReadPreservesData) {\n  TripleBuffer<IntVal> buf;\n\n  for (int i = 0; i < 10; ++i) {\n    buf.getForWriter()->value = i;\n    buf.publish();\n    EXPECT_EQ(buf.getForReader()->value, i);\n  }\n}\n\nTEST_F(TripleBufferTest, ReaderWithNoUpdateSeesInitialValue) {\n  TripleBuffer<IntVal> buf(7);\n  EXPECT_EQ(buf.getForReader()->value, 7);\n}\n\nTEST_F(TripleBufferTest, DestructorCalledExactlyThreeTimes) {\n  struct Tracker {\n    std::atomic<int> *count;\n    explicit Tracker(std::atomic<int> *c) : count(c) {}\n    ~Tracker() {\n      ++(*count);\n    }\n  };\n\n  std::atomic<int> count{0};\n  { TripleBuffer<Tracker> buf(&count); }\n  EXPECT_EQ(count.load(), 3);\n}\n\nTEST_F(TripleBufferTest, WriteThenReadSequenceIsConsistent) {\n  TripleBuffer<IntVal> buf;\n\n  buf.getForWriter()->value = 10;\n  buf.publish();\n  EXPECT_EQ(buf.getForReader()->value, 10);\n\n  buf.getForWriter()->value = 20;\n  buf.publish();\n  EXPECT_EQ(buf.getForReader()->value, 20);\n\n  buf.getForWriter()->value = 30;\n  buf.publish();\n  EXPECT_EQ(buf.getForReader()->value, 30);\n}\n\nTEST_F(TripleBufferTest, ReaderPointerAfterReadIsDistinctFromWriter) {\n  TripleBuffer<IntVal> buf;\n\n  buf.getForWriter()->value = 1;\n  buf.publish();\n\n  auto *reader = buf.getForReader();\n  auto *writer = buf.getForWriter();\n  EXPECT_NE(reader, writer);\n}\n\nTEST_F(TripleBufferTest, AllThreeBufferAddressesAreDistinct) {\n  TripleBuffer<IntVal> buf;\n\n  // Initial state: front=0, idle=1, back=2\n  auto *front = buf.getForReader(); // buffers_[0]\n  auto *back = buf.getForWriter();  // buffers_[2]\n\n  // publish: back (2) goes to state, old idle (1) becomes new back\n  buf.getForWriter()->value = 1;\n  buf.publish();\n\n  // consume the update: reader gets old back (2) as new front\n  buf.getForReader();\n\n  // after consume: front=2, state=0, back=1 — writer is now on the idle buffer\n  auto *idle = buf.getForWriter(); // buffers_[1]\n\n  EXPECT_NE(front, back);\n  EXPECT_NE(front, idle);\n  EXPECT_NE(back, idle);\n}\n\n// ---------------------------------------------------------------------------\n// Stress Tests\n// ---------------------------------------------------------------------------\n\nTEST_F(TripleBufferTest, StressReaderValueNeverGoesBackward) {\n  // Writer publishes strictly increasing values; reader must never see a\n  // decrease (the triple buffer may skip values but never go backwards).\n  TripleBuffer<IntVal> buf;\n  std::atomic<bool> stop{false};\n  std::atomic<bool> error{false};\n\n  std::thread writer([&] {\n    for (int i = 1; !stop.load(std::memory_order_relaxed); ++i) {\n      buf.getForWriter()->value = i;\n      buf.publish();\n    }\n  });\n\n  std::thread reader([&] {\n    int lastSeen = 0;\n    while (!stop.load(std::memory_order_relaxed)) {\n      int val = buf.getForReader()->value;\n      if (val < lastSeen) {\n        error.store(true, std::memory_order_relaxed);\n      }\n      lastSeen = val;\n    }\n  });\n\n  std::this_thread::sleep_for(std::chrono::milliseconds(500));\n  stop.store(true);\n  writer.join();\n  reader.join();\n\n  EXPECT_FALSE(error.load());\n}\n\nTEST_F(TripleBufferTest, StressWriterNeverBlocks) {\n  TripleBuffer<IntVal> buf;\n\n  constexpr int N = 1'000'000;\n  for (int i = 0; i < N; ++i) {\n    buf.getForWriter()->value = i;\n    buf.publish();\n  }\n\n  SUCCEED();\n}\n\nTEST_F(TripleBufferTest, StressReaderNeverBlocks) {\n  TripleBuffer<IntVal> buf;\n\n  constexpr int N = 1'000'000;\n  for (int i = 0; i < N; ++i) {\n    (void)buf.getForReader()->value;\n  }\n\n  SUCCEED();\n}\n\nTEST_F(TripleBufferTest, StressBothSidesMakeProgress) {\n  // Verify that neither thread starves the other.\n  TripleBuffer<IntVal> buf;\n  std::atomic<bool> stop{false};\n  std::atomic<int> writeCount{0};\n  std::atomic<int> readCount{0};\n\n  std::thread writer([&] {\n    for (int i = 1; !stop.load(std::memory_order_relaxed); ++i) {\n      buf.getForWriter()->value = i;\n      buf.publish();\n      writeCount.fetch_add(1, std::memory_order_relaxed);\n    }\n  });\n\n  std::thread reader([&] {\n    while (!stop.load(std::memory_order_relaxed)) {\n      (void)buf.getForReader()->value;\n      readCount.fetch_add(1, std::memory_order_relaxed);\n    }\n  });\n\n  std::this_thread::sleep_for(std::chrono::milliseconds(500));\n  stop.store(true);\n  writer.join();\n  reader.join();\n\n  EXPECT_GT(writeCount.load(), 1'000);\n  EXPECT_GT(readCount.load(), 1'000);\n}\n\n// NOLINTEND\n"
  },
  {
    "path": "packages/react-native-audio-api/development/react/package.json",
    "content": "{\n  \"main\": \"../../lib/module/development/react/index\",\n  \"module\": \"../../lib/module/development/react/index\",\n  \"react-native\": \"../../src/development/react/index\",\n  \"types\": \"../../lib/typescript/development/react/index.d.ts\"\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/AudioAPIModule.h",
    "content": "#ifdef RCT_NEW_ARCH_ENABLED\n#import <React/RCTCallInvokerModule.h>\n#import <React/RCTInvalidating.h>\n#import <rnaudioapi/rnaudioapi.h>\n#else // RCT_NEW_ARCH_ENABLED\n#import <React/RCTBridgeModule.h>\n#endif // RCT_NEW_ARCH_ENABLED\n\n#import <React/RCTEventEmitter.h>\n#import <audioapi/events/AudioEvent.h>\n\n@class AudioEngine;\n@class SystemNotificationManager;\n@class AudioSessionManager;\n@class NotificationRegistry;\n\n@interface AudioAPIModule : RCTEventEmitter\n#ifdef RCT_NEW_ARCH_ENABLED\n                            <NativeAudioAPIModuleSpec, RCTCallInvokerModule, RCTInvalidating>\n#else\n                            <RCTBridgeModule>\n#endif // RCT_NEW_ARCH_ENABLED\n\n@property (nonatomic, strong) AudioEngine *audioEngine;\n@property (nonatomic, strong) SystemNotificationManager *notificationManager;\n@property (nonatomic, strong) AudioSessionManager *audioSessionManager;\n@property (nonatomic, strong) NotificationRegistry *notificationRegistry;\n\n- (void)invokeHandlerWithEventName:(audioapi::AudioEvent)eventName\n                         eventBody:(NSDictionary *)eventBody;\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/AudioAPIModule.mm",
    "content": "#import <React/RCTBridge+Private.h>\n#import <audioapi/ios/AudioAPIModule.h>\n\n#import <audioapi/core/utils/worklets/SafeIncludes.h>\n#if RN_AUDIO_API_ENABLE_WORKLETS\n#import <worklets/apple/WorkletsModule.h>\n#endif\n#ifdef RCT_NEW_ARCH_ENABLED\n#import <React/RCTCallInvoker.h>\n#endif // RCT_NEW_ARCH_ENABLED\n#import <audioapi/AudioAPIModuleInstaller.h>\n#import <audioapi/ios/system/AudioEngine.h>\n#import <audioapi/ios/system/AudioSessionManager.h>\n#import <audioapi/ios/system/SystemNotificationManager.h>\n#import <audioapi/ios/system/notification/NotificationRegistry.h>\n\n#import <audioapi/events/AudioEventHandlerRegistry.h>\n\nusing namespace audioapi;\nusing namespace facebook::react;\nusing namespace worklets;\n\n@interface RCTBridge (JSIRuntime)\n- (void *)runtime;\n@end\n\n#if defined(RCT_NEW_ARCH_ENABLED)\n// nothing\n#else  // defined(RCT_NEW_ARCH_ENABLED)\n@interface RCTBridge (RCTTurboModule)\n- (std::shared_ptr<facebook::react::CallInvoker>)jsCallInvoker;\n- (void)_tryAndHandleError:(dispatch_block_t)block;\n@end\n#endif // RCT_NEW_ARCH_ENABLED\n\n@implementation AudioAPIModule {\n  std::shared_ptr<AudioEventHandlerRegistry> _eventHandler;\n  std::weak_ptr<WorkletsModuleProxy> weakWorkletsModuleProxy_;\n}\n\n- (void)handleSessionDeactivation\n{\n  [self.audioSessionManager markInactive];\n  [self.audioEngine onSessionDeactivated];\n}\n\n#if defined(RCT_NEW_ARCH_ENABLED)\n@synthesize callInvoker = _callInvoker;\n@synthesize moduleRegistry = _moduleRegistry;\n#endif // defined(RCT_NEW_ARCH_ENABLED)\n\nRCT_EXPORT_MODULE(AudioAPIModule);\n\n- (void)invalidate\n{\n  [self.audioEngine cleanup];\n  [self.notificationManager cleanup];\n  [self.audioSessionManager cleanup];\n  [self.notificationRegistry cleanup];\n\n  _eventHandler = nullptr;\n\n  [super invalidate];\n}\n\n- (dispatch_queue_t)methodQueue\n{\n  return dispatch_queue_create(\"com.swmansion.audioapi.MainModuleQueue\", DISPATCH_QUEUE_SERIAL);\n}\n\nRCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(install)\n{\n  self.audioSessionManager = [[AudioSessionManager alloc] init];\n  self.audioEngine = [[AudioEngine alloc] init];\n  self.notificationManager = [[SystemNotificationManager alloc] initWithAudioAPIModule:self];\n  self.notificationRegistry = [[NotificationRegistry alloc] initWithAudioAPIModule:self];\n\n  auto jsiRuntime = reinterpret_cast<facebook::jsi::Runtime *>(self.bridge.runtime);\n\n#if defined(RCT_NEW_ARCH_ENABLED)\n  auto jsCallInvoker = _callInvoker.callInvoker;\n#else  // defined(RCT_NEW_ARCH_ENABLED)\n  auto jsCallInvoker = self.bridge.jsCallInvoker;\n#endif // defined(RCT_NEW_ARCH_ENABLED)\n\n  assert(jsiRuntime != nullptr);\n\n  _eventHandler = std::make_shared<AudioEventHandlerRegistry>(jsiRuntime, jsCallInvoker);\n\n#if RN_AUDIO_API_ENABLE_WORKLETS\n  WorkletsModule *workletsModule = [_moduleRegistry moduleForName:\"WorkletsModule\"];\n\n  if (!workletsModule) {\n    NSLog(@\"WorkletsModule not found in module registry\");\n  }\n\n  auto workletsModuleProxy = [workletsModule getWorkletsModuleProxy];\n\n  if (!workletsModuleProxy) {\n    NSLog(@\"WorkletsModuleProxy not available\");\n  }\n\n  weakWorkletsModuleProxy_ = workletsModuleProxy;\n\n  auto uiWorkletRuntime = workletsModuleProxy->getUIWorkletRuntime();\n\n  if (!uiWorkletRuntime) {\n    NSLog(@\"UI Worklet Runtime not available\");\n  }\n\n  // Get the actual JSI Runtime reference\n  audioapi::AudioAPIModuleInstaller::injectJSIBindings(\n      jsiRuntime, jsCallInvoker, _eventHandler, uiWorkletRuntime);\n#else\n  audioapi::AudioAPIModuleInstaller::injectJSIBindings(jsiRuntime, jsCallInvoker, _eventHandler);\n#endif\n\n  NSLog(@\"Successfully installed JSI bindings for react-native-audio-api!\");\n  return @YES;\n}\n\nRCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(getDevicePreferredSampleRate)\n{\n  return [self.audioSessionManager getDevicePreferredSampleRate];\n}\n\nRCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(resolveAndroidReleaseAsset : (NSString *)assetPath)\n{\n  return NULL; //noop\n}\n\nRCT_EXPORT_METHOD(\n    readAndroidReleaseAssetBytesAsBase64 : (NSString *)assetPath resolve : (RCTPromiseResolveBlock)\n        resolve reject : (RCTPromiseRejectBlock)reject)\n{\n  reject(@\"E_PLATFORM\", @\"readAndroidReleaseAssetBytesAsBase64 is only available on Android\", nil);\n}\n\nRCT_EXPORT_METHOD(\n    setAudioSessionActivity : (BOOL)enabled resolve : (RCTPromiseResolveBlock)\n        resolve reject : (RCTPromiseRejectBlock)reject)\n{\n  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n    NSError *error = nil;\n    auto success = [self.audioSessionManager setActive:enabled error:&error];\n\n    if (!success) {\n      NSDictionary *meta = @{\n        @\"nativeCode\" : @(error.code),\n        @\"nativeDomain\" : error.domain ?: @\"\",\n        @\"nativeDesc\" : error.description ?: @\"\",\n      };\n\n      NSError *jsError =\n          [NSError errorWithDomain:@\"AudioAPIModule\"\n                              code:error.code\n                          userInfo:@{\n                            NSLocalizedDescriptionKey : @\"Failed to set audio session active state\",\n                            @\"meta\" : meta,\n                          }];\n\n      reject(@\"E_AUDIO_SESSION\", @\"Failed to set audio session active state\", jsError);\n      return;\n    }\n\n    if (!enabled) {\n      if ([NSThread isMainThread]) {\n        [self handleSessionDeactivation];\n      } else {\n        dispatch_sync(dispatch_get_main_queue(), ^{ [self handleSessionDeactivation]; });\n      }\n    }\n\n    resolve(@(success));\n  });\n}\n\nRCT_EXPORT_METHOD(\n    setAudioSessionOptions : (NSString *)category mode : (NSString *)mode options : (NSArray *)\n        options allowHaptics : (BOOL)allowHaptics notifyOthersOnDeactivation : (BOOL)\n            notifyOthersOnDeactivation)\n{\n  if (!self.audioSessionManager.shouldManageSession) {\n    [self.audioSessionManager setShouldManageSession:true];\n  }\n\n  [self.audioSessionManager setAudioSessionOptions:category\n                                              mode:mode\n                                           options:options\n                                      allowHaptics:allowHaptics\n                        notifyOthersOnDeactivation:notifyOthersOnDeactivation];\n}\n\nRCT_EXPORT_METHOD(observeAudioInterruptions : (NSString *)focusType enabled : (BOOL)enabled)\n{\n  [self.notificationManager observeAudioInterruptions:enabled];\n}\n\nRCT_EXPORT_METHOD(activelyReclaimSession : (BOOL)enabled)\n{\n  [self.notificationManager activelyReclaimSession:enabled];\n}\n\nRCT_EXPORT_METHOD(observeVolumeChanges : (BOOL)enabled)\n{\n  [self.notificationManager observeVolumeChanges:(BOOL)enabled];\n}\n\nRCT_EXPORT_METHOD(\n    requestRecordingPermissions : (nonnull RCTPromiseResolveBlock)\n        resolve reject : (nonnull RCTPromiseRejectBlock)reject)\n{\n  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n    [self.audioSessionManager requestRecordingPermissions:resolve reject:reject];\n  });\n}\n\nRCT_EXPORT_METHOD(\n    checkRecordingPermissions : (nonnull RCTPromiseResolveBlock)\n        resolve reject : (nonnull RCTPromiseRejectBlock)reject)\n{\n  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n    [self.audioSessionManager checkRecordingPermissions:resolve reject:reject];\n  });\n}\n\nRCT_EXPORT_METHOD(\n    requestNotificationPermissions : (nonnull RCTPromiseResolveBlock)\n        resolve reject : (nonnull RCTPromiseRejectBlock)reject)\n{\n  // iOS doesn't require explicit notification permissions for media controls\n  // MPNowPlayingInfoCenter and MPRemoteCommandCenter work without permissions\n  // Return 'Granted' to match the spec interface\n  resolve(@\"Granted\");\n}\n\nRCT_EXPORT_METHOD(\n    checkNotificationPermissions : (nonnull RCTPromiseResolveBlock)\n        resolve reject : (nonnull RCTPromiseRejectBlock)reject)\n{\n  // iOS doesn't require explicit notification permissions for media controls\n  // Return 'Granted' to match the spec interface\n  resolve(@\"Granted\");\n}\n\nRCT_EXPORT_METHOD(\n    getDevicesInfo : (nonnull RCTPromiseResolveBlock)\n        resolve reject : (nonnull RCTPromiseRejectBlock)reject)\n{\n  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n    [self.audioSessionManager getDevicesInfo:resolve reject:reject];\n  });\n}\n\nRCT_EXPORT_METHOD(\n    setInputDevice : (NSString *)deviceId resolve : (RCTPromiseResolveBlock)\n        resolve reject : (RCTPromiseRejectBlock)reject)\n{\n  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n    [self.audioSessionManager setInputDevice:deviceId resolve:resolve reject:reject];\n  });\n}\n\nRCT_EXPORT_METHOD(disableSessionManagement)\n{\n  [self.audioSessionManager disableSessionManagement];\n}\n\n// New notification system methods\nRCT_EXPORT_METHOD(\n    showNotification : (NSString *)type key : (NSString *)key options : (NSDictionary *)\n        options resolve : (RCTPromiseResolveBlock)resolve reject : (RCTPromiseRejectBlock)reject)\n{\n  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n    BOOL success = [self.notificationRegistry showNotificationWithType:type\n                                                                   key:key\n                                                               options:options];\n\n    if (success) {\n      resolve(@{@\"success\" : @true});\n    } else {\n      resolve(@{@\"success\" : @false, @\"error\" : @\"Failed to show notification\"});\n    }\n  });\n}\n\nRCT_EXPORT_METHOD(\n    hideNotification : (NSString *)key resolve : (RCTPromiseResolveBlock)\n        resolve reject : (RCTPromiseRejectBlock)reject)\n{\n  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n    BOOL success = [self.notificationRegistry hideNotificationWithKey:key];\n\n    if (success) {\n      resolve(@{@\"success\" : @true});\n    } else {\n      resolve(@{@\"success\" : @false, @\"error\" : @\"Failed to hide notification\"});\n    }\n  });\n}\n\nRCT_EXPORT_METHOD(\n    isNotificationActive : (NSString *)key resolve : (RCTPromiseResolveBlock)\n        resolve reject : (RCTPromiseRejectBlock)reject)\n{\n  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{\n    BOOL isActive = [self.notificationRegistry isNotificationActiveWithKey:key];\n    resolve(@(isActive));\n  });\n}\n\n#ifdef RCT_NEW_ARCH_ENABLED\n- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:\n    (const facebook::react::ObjCTurboModule::InitParams &)params\n{\n  return std::make_shared<facebook::react::NativeAudioAPIModuleSpecJSI>(params);\n}\n#endif // RCT_NEW_ARCH_ENABLED\n\n- (void)invokeHandlerWithEventName:(audioapi::AudioEvent)eventName\n                         eventBody:(NSDictionary *)eventBody\n{\n  std::unordered_map<std::string, EventValue> body = {};\n\n  for (NSString *key in eventBody) {\n    id value = eventBody[key];\n    std::string stdKey = [key UTF8String];\n\n    if ([value isKindOfClass:[NSString class]]) {\n      std::string stdValue = [value UTF8String];\n      body[stdKey] = EventValue(stdValue);\n    } else if ([value isKindOfClass:[NSNumber class]]) {\n      const char *type = [value objCType];\n      if (strcmp(type, @encode(int)) == 0) {\n        body[stdKey] = EventValue([value intValue]);\n      } else if (strcmp(type, @encode(double)) == 0) {\n        body[stdKey] = EventValue([value doubleValue]);\n      } else if (strcmp(type, @encode(float)) == 0) {\n        body[stdKey] = EventValue([value floatValue]);\n      } else {\n        body[stdKey] = EventValue([value boolValue]);\n      }\n    }\n  }\n\n  if (_eventHandler != nullptr) {\n    _eventHandler->invokeHandlerWithEventBody(eventName, body);\n  }\n}\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/IOSAudioPlayer.h",
    "content": "#pragma once\n\n#ifdef __OBJC__ // when compiled as Objective-C\n#import <NativeAudioPlayer.h>\n#else  // when compiled as C++\ntypedef struct objc_object NativeAudioPlayer;\ntypedef struct objc_object AudioBufferList;\n#endif // __OBJC__\n\n#include <audioapi/utils/AudioBuffer.hpp>\n\n#include <atomic>\n#include <cstddef>\n#include <functional>\nnamespace audioapi {\n\nclass AudioContext;\n\nclass IOSAudioPlayer {\n public:\n  IOSAudioPlayer(\n      const std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> &renderAudio,\n      float sampleRate,\n      int channelCount);\n  ~IOSAudioPlayer();\n\n  bool start();\n  void stop();\n  bool resume();\n  void suspend();\n  void cleanup();\n\n  bool isRunning() const;\n\n private:\n  void clearPendingSaved();\n  /// Audio-thread only. Always pulls the graph in steps of RENDER_QUANTUM_SIZE; if the system\n  /// buffer size is not a multiple of 128, the unused tail of the last quantum is kept (max 128\n  /// frames) and played at the start of the next callback.\n  void deliverOutputBuffers(AudioBufferList *outputData, int numFrames);\n\n  std::shared_ptr<DSPAudioBuffer> audioBuffer_;\n  NativeAudioPlayer *audioPlayer_;\n  std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> renderAudio_;\n  int channelCount_;\n  std::atomic<bool> isRunning_;\n  /// Set from main thread on start/resume; consumed on audio thread to drop stale pending audio.\n  std::atomic<bool> flushOverflowNextPull_{false};\n  /// Frames valid at the front of each `pendingSaved_[ch]` (0 … RENDER_QUANTUM_SIZE).\n  int pendingSavedCount_{0};\n  DSPAudioBuffer pendingSaved_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/IOSAudioPlayer.mm",
    "content": "#import <AVFoundation/AVFoundation.h>\n\n#include <algorithm>\n#include <cstring>\n\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/ios/core/IOSAudioPlayer.h>\n#include <audioapi/ios/system/AudioEngine.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n\nnamespace audioapi {\n\nIOSAudioPlayer::IOSAudioPlayer(\n    const std::function<void(std::shared_ptr<DSPAudioBuffer>, int)> &renderAudio,\n    float sampleRate,\n    int channelCount)\n    : audioBuffer_(nullptr),\n      audioPlayer_(nullptr),\n      renderAudio_(renderAudio),\n      channelCount_(channelCount),\n      isRunning_(false),\n      pendingSaved_(RENDER_QUANTUM_SIZE, channelCount_, sampleRate)\n{\n  RenderAudioBlock renderAudioBlock = ^(AudioBufferList *outputData, int numFrames) {\n    deliverOutputBuffers(outputData, numFrames);\n  };\n\n  audioPlayer_ = [[NativeAudioPlayer alloc] initWithRenderAudio:renderAudioBlock\n                                                     sampleRate:sampleRate\n                                                   channelCount:channelCount_];\n  audioBuffer_ = std::make_shared<DSPAudioBuffer>(RENDER_QUANTUM_SIZE, channelCount_, sampleRate);\n}\n\nIOSAudioPlayer::~IOSAudioPlayer()\n{\n  cleanup();\n}\n\nvoid IOSAudioPlayer::clearPendingSaved()\n{\n  pendingSavedCount_ = 0;\n  pendingSaved_.zero();\n}\n\nvoid IOSAudioPlayer::deliverOutputBuffers(AudioBufferList *outputData, int numFrames)\n{\n  // If requested, clear any saved overflow before continuing normal rendering.\n  if (flushOverflowNextPull_.exchange(false, std::memory_order_acq_rel)) {\n    clearPendingSaved();\n  }\n\n  // if not running, set output to 0\n  if (!isRunning_.load(std::memory_order_acquire)) {\n    for (int channel = 0; channel < channelCount_; ++channel) {\n      auto *outputChannel = static_cast<float *>(outputData->mBuffers[channel].mData);\n      std::memset(outputChannel, 0, static_cast<size_t>(numFrames) * sizeof(float));\n    }\n    return;\n  }\n\n  int outPos = 0;\n  while (outPos < numFrames) {\n    const int need = numFrames - outPos;\n\n    if (pendingSavedCount_ > 0) {\n      const int fromPending = std::min(need, pendingSavedCount_);\n\n      // populate output with pendingSaved\n      for (int ch = 0; ch < channelCount_; ++ch) {\n        float *dst = static_cast<float *>(outputData->mBuffers[ch].mData) + outPos;\n        const float *src = pendingSaved_[ch].begin();\n        std::memcpy(dst, src, fromPending * sizeof(float));\n\n        // move the remaining samples to the beginning of the pendingSaved buffer\n        const int remain = pendingSavedCount_ - fromPending;\n        if (remain > 0) {\n          float *buf = pendingSaved_[ch].begin();\n          std::memmove(buf, buf + fromPending, remain * sizeof(float));\n        }\n      }\n\n      pendingSavedCount_ -= fromPending;\n      outPos += fromPending;\n      continue;\n    }\n\n    renderAudio_(audioBuffer_, RENDER_QUANTUM_SIZE);\n\n    // normal rendering - take RENDER_QUANTUM_SIZE frames from the graph and copy to output\n    const int stillNeed = numFrames - outPos;\n    if (stillNeed >= RENDER_QUANTUM_SIZE) {\n      for (int ch = 0; ch < channelCount_; ++ch) {\n        auto *src = (*audioBuffer_)[ch].begin();\n        float *dst = static_cast<float *>(outputData->mBuffers[ch].mData) + outPos;\n        std::memcpy(dst, src, RENDER_QUANTUM_SIZE * sizeof(float));\n      }\n      outPos += RENDER_QUANTUM_SIZE;\n    } else {\n      // when output will be sliced, copy the remaining frames to pendingSaved\n      const int tail = RENDER_QUANTUM_SIZE - stillNeed;\n      for (int ch = 0; ch < channelCount_; ++ch) {\n        auto *src = (*audioBuffer_)[ch].begin();\n        float *dst = static_cast<float *>(outputData->mBuffers[ch].mData) + outPos;\n        std::memcpy(dst, src, stillNeed * sizeof(float));\n      }\n      pendingSaved_.copy(*audioBuffer_, stillNeed, 0, tail);\n      pendingSavedCount_ = tail;\n      outPos += stillNeed;\n    }\n  }\n}\n\nbool IOSAudioPlayer::start()\n{\n  if (isRunning()) {\n    return true;\n  }\n\n  bool success = [audioPlayer_ start];\n  if (success) {\n    flushOverflowNextPull_.store(true, std::memory_order_release);\n  }\n  isRunning_.store(success, std::memory_order_release);\n  return success;\n}\n\nvoid IOSAudioPlayer::stop()\n{\n  isRunning_.store(false, std::memory_order_release);\n  [audioPlayer_ stop];\n}\n\nbool IOSAudioPlayer::resume()\n{\n  if (isRunning()) {\n    return true;\n  }\n\n  bool success = [audioPlayer_ resume];\n  if (success) {\n    flushOverflowNextPull_.store(true, std::memory_order_release);\n  }\n  isRunning_.store(success, std::memory_order_release);\n  return success;\n}\n\nvoid IOSAudioPlayer::suspend()\n{\n  isRunning_.store(false, std::memory_order_release);\n  [audioPlayer_ suspend];\n}\n\nbool IOSAudioPlayer::isRunning() const\n{\n  AudioEngine *audioEngine = [AudioEngine sharedInstance];\n\n  return isRunning_.load(std::memory_order_acquire) && [audioEngine isEngineRunning] &&\n      [audioEngine getState] == AudioEngineState::AudioEngineStateRunning;\n}\n\nvoid IOSAudioPlayer::cleanup()\n{\n  stop();\n  [audioPlayer_ cleanup];\n  audioBuffer_ = nullptr;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/IOSAudioRecorder.h",
    "content": "#pragma once\n\n#ifdef __OBJC__ // when compiled as Objective-C\n#import <NativeAudioRecorder.h>\n#else\ntypedef struct objc_object NSURL;\ntypedef struct objc_object AVAudioFile;\ntypedef struct objc_object AudioBufferList;\ntypedef struct objc_object NativeAudioRecorder;\n#endif // __OBJC__\n\n#include <audioapi/core/inputs/AudioRecorder.h>\n#include <audioapi/utils/Result.hpp>\n\n#include <memory>\n#include <string>\n#include <vector>\n\nnamespace audioapi {\n\nclass RecorderCallback;\nclass RecorderAdapterNode;\nclass AudioFileProperties;\nclass AudioEventHandlerRegistry;\nclass AudioFileWriter;\n\nclass IOSAudioRecorder : public AudioRecorder {\n public:\n  IOSAudioRecorder(const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry);\n  ~IOSAudioRecorder() override;\n\n  Result<NoneType, std::string> start(const std::string &fileNameOverride = \"\") override;\n  Result<std::tuple<std::vector<std::string>, double, double>, std::string> stop() override;\n\n  Result<NoneType, std::string> enableFileOutput(\n      std::shared_ptr<AudioFileProperties> properties) override;\n  void disableFileOutput() override;\n\n  void connect(const std::shared_ptr<RecorderAdapterNode> &node) override;\n  void disconnect() override;\n\n  void pause() override;\n  void resume() override;\n\n  bool isRecording() const override;\n  bool isPaused() const override;\n  bool isIdle() const override;\n\n  Result<NoneType, std::string> setOnAudioReadyCallback(\n      float sampleRate,\n      size_t bufferLength,\n      int channelCount,\n      uint64_t callbackId) override;\n  void clearOnAudioReadyCallback() override;\n\n protected:\n  NativeAudioRecorder *nativeRecorder_;\n\n private:\n  std::shared_ptr<AudioFileWriter> createFileWriter(\n      const std::shared_ptr<AudioFileProperties> &props);\n  Result<std::string, std::string> setupFileWriter(\n      const std::shared_ptr<AudioFileProperties> &properties,\n      const std::string &fileNameOverride = \"\");\n\n  std::vector<std::string> recordingSegmentPaths_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/IOSAudioRecorder.mm",
    "content": "#import <AVFoundation/AVFoundation.h>\n#import <AudioEngine.h>\n#import <AudioSessionManager.h>\n#import <Foundation/Foundation.h>\n\n#include <unordered_map>\n#include <vector>\n\n#include <audioapi/core/sources/RecorderAdapterNode.h>\n#include <audioapi/core/utils/AudioFileWriter.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/core/utils/Locker.h>\n#include <audioapi/dsp/VectorMath.h>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <audioapi/ios/core/IOSAudioRecorder.h>\n#include <audioapi/ios/core/utils/IOSFileWriter.h>\n#include <audioapi/ios/core/utils/IOSRecorderCallback.h>\n#include <audioapi/ios/core/utils/IOSRotatingFileWriter.h>\n#include <audioapi/ios/system/AudioEngine.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/AudioFileProperties.h>\n#include <audioapi/utils/CircularArray.hpp>\n#include <audioapi/utils/CircularOverflowableAudioArray.h>\n#include <audioapi/utils/Result.hpp>\n\nnamespace audioapi {\n\nstatic inline NSNumber *recorderFormatNumber(id format, NSString *key)\n{\n  if (format == nil) {\n    return nil;\n  }\n\n  if ([format isKindOfClass:[AVAudioFormat class]]) {\n    AVAudioFormat *audioFormat = (AVAudioFormat *)format;\n\n    if ([key isEqualToString:@\"sampleRate\"]) {\n      return @(audioFormat.sampleRate);\n    }\n\n    if ([key isEqualToString:@\"channelCount\"]) {\n      return @(audioFormat.channelCount);\n    }\n\n    if ([key isEqualToString:@\"interleaved\"]) {\n      return @(audioFormat.interleaved);\n    }\n  }\n\n  @try {\n    id value = [format valueForKey:key];\n    return [value isKindOfClass:[NSNumber class]] ? value : nil;\n  } @catch (__unused NSException *exception) {\n    return nil;\n  }\n}\n\nstatic inline double recorderFormatSampleRate(id format)\n{\n  return [recorderFormatNumber(format, @\"sampleRate\") doubleValue];\n}\n\nstatic inline AVAudioChannelCount recorderFormatChannelCount(id format)\n{\n  return (AVAudioChannelCount)[recorderFormatNumber(format, @\"channelCount\") unsignedIntegerValue];\n}\n\nstatic inline bool recorderFormatInterleaved(id format)\n{\n  return [recorderFormatNumber(format, @\"interleaved\") boolValue];\n}\n\nstatic inline bool hasUsableRecorderFormat(id format)\n{\n  return format != nil && recorderFormatSampleRate(format) > 0 &&\n      recorderFormatChannelCount(format) > 0;\n}\n\nstatic std::string describeRecorderFormat(id format)\n{\n  return \"engineFormat={sampleRate=\" + std::to_string(recorderFormatSampleRate(format)) +\n      \", channelCount=\" + std::to_string(recorderFormatChannelCount(format)) +\n      \", interleaved=\" + std::string(recorderFormatInterleaved(format) ? \"true\" : \"false\") + \"}\";\n}\n\nstatic void cleanupStartedRecorder(\n    NativeAudioRecorder *nativeRecorder,\n    const std::shared_ptr<AudioFileWriter> &fileWriter,\n    bool fileWasOpened)\n{\n  [nativeRecorder setInputArmed:false];\n  [nativeRecorder stop];\n\n  if (fileWasOpened && fileWriter != nullptr) {\n    fileWriter->closeFile();\n  }\n}\n\n/// @brief Constructs an IOSAudioRecorder instance.\n/// This constructor initializes the receiver block and native side recorder wrapper (AVAudioSinkNode).\n/// All other necessary fields (like buffers) are initialized in start() method.\n/// This \"method\" should be called from the JS thread only.\n/// @param audioEventHandlerRegistry Shared pointer to the AudioEventHandlerRegistry for event handling.\nIOSAudioRecorder::IOSAudioRecorder(\n    const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry)\n    : AudioRecorder(audioEventHandlerRegistry)\n{\n  AudioReceiverBlock receiverBlock = ^(const AudioBufferList *inputBuffer, int numFrames) {\n    if (usesFileOutput()) {\n      if (auto lock = Locker::tryLock(fileWriterMutex_)) {\n        fileWriter_->writeAudioData(inputBuffer, numFrames);\n      }\n    }\n\n    if (usesCallback()) {\n      if (auto lock = Locker::tryLock(callbackMutex_)) {\n        std::static_pointer_cast<IOSRecorderCallback>(dataCallback_)\n            ->receiveAudioData(inputBuffer, numFrames);\n      }\n    }\n\n    if (isConnected()) {\n      if (auto lock = Locker::tryLock(adapterNodeMutex_)) {\n        for (size_t channel = 0; channel < adapterNode_->getChannelCount(); ++channel) {\n          auto data = (float *)inputBuffer->mBuffers[channel].mData;\n\n          adapterNode_->buff_[channel]->write(data, numFrames);\n        }\n      }\n    }\n  };\n\n  nativeRecorder_ = [[NativeAudioRecorder alloc] initWithReceiverBlock:receiverBlock];\n}\n\nIOSAudioRecorder::~IOSAudioRecorder()\n{\n  stop();\n\n  {\n    std::scoped_lock lock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);\n    callbackOutputConfigured_.store(false, std::memory_order_release);\n    callbackOutputEnabled_.store(false, std::memory_order_release);\n    fileOutputConfigured_.store(false, std::memory_order_release);\n    fileOutputEnabled_.store(false, std::memory_order_release);\n    connectedConfigured_.store(false, std::memory_order_release);\n    isConnected_.store(false, std::memory_order_release);\n    dataCallback_ = nullptr;\n    fileWriter_ = nullptr;\n    adapterNode_ = nullptr;\n  }\n\n  [nativeRecorder_ cleanup];\n}\n\n/// @brief Starts the audio recording process and prepares necessary resources.\n/// This method should be called from the JS thread only.\n/// @returns Result containing the file path if recording started successfully, or an error message.\nResult<NoneType, std::string> IOSAudioRecorder::start(const std::string &fileNameOverride)\n{\n  if (!isIdle()) {\n    return Result<NoneType, std::string>::Err(\"Recorder is already recording\");\n  }\n\n  std::scoped_lock startLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);\n  AudioSessionManager *audioSessionManager = [AudioSessionManager sharedInstance];\n\n  if ([[audioSessionManager checkRecordingPermissions] isEqual:@\"Denied\"]) {\n    return Result<NoneType, std::string>::Err(\"Microphone permissions are not granted\");\n  }\n\n  NSError *nativeStartError = nil;\n  BOOL didStartNativeRecorder = NO;\n\n  @try {\n    didStartNativeRecorder = [nativeRecorder_ start:&nativeStartError];\n  } @catch (NSException *exception) {\n    cleanupStartedRecorder(nativeRecorder_, fileWriter_, false);\n\n    std::string message = \"Failed to start native recorder\";\n    message += \": exception={name=\";\n    message += [[exception.name description] UTF8String];\n    message += \", reason=\";\n    message += [[(exception.reason ?: @\"<none>\") description] UTF8String];\n    message += \"}; \";\n    message += [[audioSessionManager inputDiagnosticsSnapshot] UTF8String];\n\n#if TARGET_OS_SIMULATOR\n    message += \"; simulatorHint={Select a host microphone in Simulator > I/O > Audio Input}\";\n#endif\n\n    return Result<NoneType, std::string>::Err(message);\n  }\n\n  if (!didStartNativeRecorder) {\n    std::string message = \"Failed to start native recorder\";\n\n    if (nativeStartError != nil) {\n      message += \": \";\n      message += [[nativeStartError debugDescription] UTF8String];\n    }\n\n    message += \"; \";\n    message += [[audioSessionManager inputDiagnosticsSnapshot] UTF8String];\n\n#if TARGET_OS_SIMULATOR\n    message += \"; simulatorHint={Select a host microphone in Simulator > I/O > Audio Input}\";\n#endif\n\n    return Result<NoneType, std::string>::Err(message);\n  }\n\n  AVAudioFormat *inputFormat = [nativeRecorder_ getResolvedInputFormat];\n\n  if (!hasUsableRecorderFormat(inputFormat)) {\n    std::string message = \"Audio input format is unavailable. \" +\n        describeRecorderFormat(inputFormat) + \"; \" +\n        [[audioSessionManager inputDiagnosticsSnapshot] UTF8String];\n#if TARGET_OS_SIMULATOR\n    message += \"; simulatorHint={Select a host microphone in Simulator > I/O > Audio Input}\";\n#endif\n\n    cleanupStartedRecorder(nativeRecorder_, fileWriter_, false);\n    return Result<NoneType, std::string>::Err(message);\n  }\n\n  // Estimate the maximum input buffer lengths that can be expected from the sink node\n  size_t maxInputBufferLength = [nativeRecorder_ getResolvedBufferSize];\n  bool fileWasOpened = false;\n\n  if (wantsFileOutput()) {\n    recordingSegmentPaths_.clear();\n    auto writerResult = setupFileWriter(fileProperties_, fileNameOverride);\n    if (writerResult.is_err()) {\n      cleanupStartedRecorder(nativeRecorder_, fileWriter_, false);\n      fileOutputConfigured_.store(false, std::memory_order_release);\n      fileWriter_ = nullptr;\n      return Result<NoneType, std::string>::Err(writerResult.unwrap_err());\n    }\n    filePath_ = writerResult.unwrap();\n    fileWasOpened = true;\n  }\n\n  if (wantsCallback()) {\n    if (dataCallback_ == nullptr) {\n      cleanupStartedRecorder(nativeRecorder_, fileWriter_, fileWasOpened);\n      fileOutputConfigured_.store(false, std::memory_order_release);\n      fileWriter_ = nullptr;\n      filePath_ = \"\";\n      return Result<NoneType, std::string>::Err(\n          \"Failed to prepare callback: callback is unavailable\");\n    }\n\n    dataCallback_->setOnErrorCallback(errorCallbackId_.load(std::memory_order_acquire));\n    auto callbackResult = std::static_pointer_cast<IOSRecorderCallback>(dataCallback_)\n                              ->prepare(inputFormat, maxInputBufferLength);\n\n    if (callbackResult.is_err()) {\n      cleanupStartedRecorder(nativeRecorder_, fileWriter_, fileWasOpened);\n      callbackOutputConfigured_.store(false, std::memory_order_release);\n      fileOutputConfigured_.store(false, std::memory_order_release);\n      fileWriter_ = nullptr;\n      filePath_ = \"\";\n      return Result<NoneType, std::string>::Err(\n          \"Failed to prepare callback: \" + callbackResult.unwrap_err());\n    }\n\n    callbackOutputConfigured_.store(true, std::memory_order_release);\n  }\n\n  if (wantsConnection() && adapterNode_ != nullptr) {\n    adapterNode_->init(\n        maxInputBufferLength,\n        recorderFormatChannelCount(inputFormat),\n        recorderFormatSampleRate(inputFormat));\n    connectedConfigured_.store(true, std::memory_order_release);\n  }\n\n  [nativeRecorder_ setInputArmed:true];\n  state_.store(RecorderState::Recording, std::memory_order_release);\n  return Result<NoneType, std::string>::Ok(None);\n}\n\n/// @brief Stops the audio recording process and releases resources.\n/// It finalizes any data receiver and closes the stream.\n/// This method should be called from the JS thread only.\n/// @returns Result containing paths, size, and duration if stopped successfully, or an error message.\nResult<std::tuple<std::vector<std::string>, double, double>, std::string> IOSAudioRecorder::stop()\n{\n  std::shared_ptr<AudioFileWriter> fileWriter;\n  std::shared_ptr<AudioRecorderCallback> dataCallback;\n  std::shared_ptr<RecorderAdapterNode> adapterNode;\n  std::vector<std::string> outputPaths;\n  std::string filePath;\n\n  double outputFileSize = 0;\n  double outputDuration = 0;\n  bool hadFileOutput = false;\n\n  {\n    std::scoped_lock stopLock(callbackMutex_, fileWriterMutex_, adapterNodeMutex_);\n\n    if (isIdle()) {\n      return Result<std::tuple<std::vector<std::string>, double, double>, std::string>::Err(\n          \"Recorder is not in recording state.\");\n    }\n\n    [nativeRecorder_ setInputArmed:false];\n    state_.store(RecorderState::Idle, std::memory_order_release);\n    [nativeRecorder_ stop];\n\n    hadFileOutput = usesFileOutput();\n    bool hadCallback = usesCallback();\n    bool hadConnection = isConnected();\n    filePath = filePath_;\n\n    if (hadFileOutput) {\n      fileOutputConfigured_.store(false, std::memory_order_release);\n      fileWriter = std::move(fileWriter_);\n    }\n\n    if (hadCallback) {\n      callbackOutputConfigured_.store(false, std::memory_order_release);\n      dataCallback = std::move(dataCallback_);\n    }\n\n    if (hadConnection) {\n      connectedConfigured_.store(false, std::memory_order_release);\n      adapterNode = std::move(adapterNode_);\n    }\n\n    for (const auto &raw : recordingSegmentPaths_) {\n      if (!raw.empty()) {\n        outputPaths.push_back(std::string(\"file://\") + raw);\n      }\n    }\n    if (hadFileOutput && outputPaths.empty() && !filePath.empty()) {\n      outputPaths.push_back(std::string(\"file://\") + filePath);\n    }\n\n    recordingSegmentPaths_.clear();\n    filePath_ = \"\";\n  }\n\n  if (fileWriter != nullptr) {\n    auto fileResult = fileWriter->closeFile();\n\n    if (fileResult.is_err()) {\n      return Result<std::tuple<std::vector<std::string>, double, double>, std::string>::Err(\n          \"Failed to close file: \" + fileResult.unwrap_err());\n    }\n\n    outputFileSize = std::get<0>(fileResult.unwrap());\n    outputDuration = std::get<1>(fileResult.unwrap());\n  }\n\n  if (dataCallback != nullptr) {\n    dataCallback->cleanup();\n  }\n\n  if (adapterNode != nullptr) {\n    adapterNode->adapterCleanup();\n  }\n\n  return Result<std::tuple<std::vector<std::string>, double, double>, std::string>::Ok(\n      std::make_tuple(std::move(outputPaths), outputFileSize, outputDuration));\n}\n\n/// @brief Enables file output for the recorder with specified properties.\n/// If the recorder is already active, it will open the file for writing immediately.\n/// This method should be called from the JS thread only.\n/// @param properties Shared pointer to AudioFileProperties defining the output file format.\n/// @returns Result containing the output file path if enabled successfully, or an error message.\nResult<NoneType, std::string> IOSAudioRecorder::enableFileOutput(\n    std::shared_ptr<AudioFileProperties> properties)\n{\n  std::scoped_lock lock(fileWriterMutex_, errorCallbackMutex_);\n  fileProperties_ = properties;\n  fileOutputEnabled_.store(true, std::memory_order_release);\n  fileOutputConfigured_.store(false, std::memory_order_release);\n\n  if (!isIdle()) {\n    AVAudioFormat *resolvedInputFormat = [nativeRecorder_ getResolvedInputFormat];\n    int resolvedBufferSize = [nativeRecorder_ getResolvedBufferSize];\n\n    if (!hasUsableRecorderFormat(resolvedInputFormat) || resolvedBufferSize <= 0) {\n      return Result<NoneType, std::string>::Err(\n          \"Failed to open file for writing: recorder input format is unavailable\");\n    }\n\n    auto writerResult = setupFileWriter(properties);\n    if (writerResult.is_err()) {\n      fileOutputEnabled_.store(false, std::memory_order_release);\n      return Result<NoneType, std::string>::Err(writerResult.unwrap_err());\n    }\n  }\n\n  return Result<NoneType, std::string>::Ok(None);\n}\n\nstd::shared_ptr<AudioFileWriter> IOSAudioRecorder::createFileWriter(\n    const std::shared_ptr<AudioFileProperties> &props)\n{\n  return std::make_shared<IOSFileWriter>(audioEventHandlerRegistry_, props);\n}\n\nResult<std::string, std::string> IOSAudioRecorder::setupFileWriter(\n    const std::shared_ptr<AudioFileProperties> &properties,\n    const std::string &fileNameOverride)\n{\n  if (properties->rotateIntervalBytes > 0) {\n    fileWriter_ = std::make_shared<IOSRotatingFileWriter>(\n        audioEventHandlerRegistry_,\n        properties,\n        properties->rotateIntervalBytes,\n        [this](const std::shared_ptr<AudioFileProperties> &p) { return createFileWriter(p); },\n        [this](const std::string &path) {\n          if (!path.empty()) {\n            recordingSegmentPaths_.push_back(path);\n          }\n        });\n  } else {\n    fileWriter_ = createFileWriter(properties);\n  }\n\n  fileWriter_->setOnErrorCallback(errorCallbackId_.load(std::memory_order_acquire));\n\n  auto backend = std::static_pointer_cast<IOSFileWriter>(fileWriter_);\n  auto fileResult = backend->openFile(\n      [nativeRecorder_ getResolvedInputFormat],\n      [nativeRecorder_ getResolvedBufferSize],\n      fileNameOverride);\n\n  if (!fileResult.is_ok()) {\n    fileOutputConfigured_.store(false, std::memory_order_release);\n    fileWriter_ = nullptr;\n    return Result<std::string, std::string>::Err(\n        \"Failed to open file for writing: \" + fileResult.unwrap_err());\n  }\n\n  filePath_ = fileResult.unwrap();\n\n  if (properties->rotateIntervalBytes == 0) {\n    recordingSegmentPaths_.push_back(filePath_);\n  }\n  fileOutputConfigured_.store(true, std::memory_order_release);\n  return Result<std::string, std::string>::Ok(filePath_);\n}\n\nvoid IOSAudioRecorder::disableFileOutput()\n{\n  std::scoped_lock lock(fileWriterMutex_);\n  fileOutputConfigured_.store(false, std::memory_order_release);\n  fileOutputEnabled_.store(false, std::memory_order_release);\n\n  if (fileWriter_ != nullptr) {\n    fileWriter_->closeFile();\n  }\n}\n\n/// @brief Connects a RecorderAdapterNode to the recorder for audio data routing.\n/// If the recorder is already active, it will initialize the adapter node immediately.\n/// This method should be called from the JS thread only.\n/// @param node Shared pointer to the RecorderAdapterNode to connect.\nvoid IOSAudioRecorder::connect(const std::shared_ptr<RecorderAdapterNode> &node)\n{\n  std::scoped_lock lock(adapterNodeMutex_);\n  adapterNode_ = node;\n  isConnected_.store(true, std::memory_order_release);\n  connectedConfigured_.store(false, std::memory_order_release);\n\n  if (!isIdle()) {\n    AVAudioFormat *resolvedInputFormat = [nativeRecorder_ getResolvedInputFormat];\n\n    if (!hasUsableRecorderFormat(resolvedInputFormat)) {\n      return;\n    }\n\n    adapterNode_->init(\n        [nativeRecorder_ getResolvedBufferSize],\n        resolvedInputFormat.channelCount,\n        resolvedInputFormat.sampleRate);\n    connectedConfigured_.store(true, std::memory_order_release);\n  }\n}\n\n/// @brief Disconnects the currently connected RecorderAdapterNode from the recorder.\n/// If the recorder is currently active, it will stop routing audio data immediately.\n/// This method should be called from the JS thread only.\nvoid IOSAudioRecorder::disconnect()\n{\n  std::shared_ptr<RecorderAdapterNode> adapterNode;\n  bool hadConnection = false;\n  {\n    std::scoped_lock lock(adapterNodeMutex_);\n    hadConnection = isConnected();\n    connectedConfigured_.store(false, std::memory_order_release);\n    isConnected_.store(false, std::memory_order_release);\n    adapterNode = std::move(adapterNode_);\n  }\n\n  if (hadConnection && adapterNode != nullptr) {\n    adapterNode->adapterCleanup();\n  }\n}\n\nvoid IOSAudioRecorder::pause()\n{\n  if (!isRecording()) {\n    return;\n  }\n\n  [nativeRecorder_ pause];\n  state_.store(RecorderState::Paused, std::memory_order_release);\n}\n\nvoid IOSAudioRecorder::resume()\n{\n  if (!isPaused()) {\n    return;\n  }\n\n  [nativeRecorder_ resume];\n  state_.store(RecorderState::Recording, std::memory_order_release);\n}\n\n/// @brief Checks if the recorder is currently recording.\n/// Besides recorder internal state, it also check if the audio engine is running.\n/// this helps with restarts after interruptions or other audio session changes.\n/// This method can be called from any thread.\n/// @returns True if recording, false otherwise.\nbool IOSAudioRecorder::isRecording() const\n{\n  AudioEngine *audioEngine = [AudioEngine sharedInstance];\n  return state_.load(std::memory_order_acquire) == RecorderState::Recording &&\n      [audioEngine getState] == AudioEngineState::AudioEngineStateRunning;\n}\n\n/// @brief Checks if the recorder is currently paused.\n/// Besides recorder internal state, it also check if the audio engine is running.\n/// this helps with restarts after interruptions or other audio session changes.\n/// This method can be called from any thread.\n/// @returns True if paused, false otherwise.\nbool IOSAudioRecorder::isPaused() const\n{\n  AudioEngine *audioEngine = [AudioEngine sharedInstance];\n  auto currentState = state_.load(std::memory_order_acquire);\n\n  if (currentState == RecorderState::Idle) {\n    return false;\n  }\n\n  return currentState == RecorderState::Paused ||\n      [audioEngine getState] != AudioEngineState::AudioEngineStateRunning;\n}\n\n/// @brief Checks if the recorder is currently idle (not recording or paused).\n/// This method can be called from any thread.\n/// @returns True if idle, false otherwise.\nbool IOSAudioRecorder::isIdle() const\n{\n  return state_.load(std::memory_order_acquire) == RecorderState::Idle;\n}\n\n/// @brief Sets the callback to be invoked when audio data is ready.\n/// If the recorder is already active, it will prepare the callback for receiving audio data immediately.\n/// This method should be called from the JS thread only.\n/// @param sampleRate Desired sample rate for the callback audio data.\n/// @param bufferLength Desired buffer length in frames for the callback audio data.\n/// @param channelCount Number of channels for the callback audio data.\n/// @param callbackId Identifier for the JS callback to be invoked.\n/// @returns Success status or Error status with message.\nResult<NoneType, std::string> IOSAudioRecorder::setOnAudioReadyCallback(\n    float sampleRate,\n    size_t bufferLength,\n    int channelCount,\n    uint64_t callbackId)\n{\n  std::scoped_lock lock(callbackMutex_, errorCallbackMutex_);\n\n  dataCallback_ = std::make_shared<IOSRecorderCallback>(\n      audioEventHandlerRegistry_, sampleRate, bufferLength, channelCount, callbackId);\n  dataCallback_->setOnErrorCallback(errorCallbackId_.load(std::memory_order_acquire));\n  callbackOutputEnabled_.store(true, std::memory_order_release);\n  callbackOutputConfigured_.store(false, std::memory_order_release);\n\n  if (!isIdle()) {\n    AVAudioFormat *resolvedInputFormat = [nativeRecorder_ getResolvedInputFormat];\n\n    if (!hasUsableRecorderFormat(resolvedInputFormat)) {\n      return Result<NoneType, std::string>::Err(\"Recorder input format is unavailable\");\n    }\n\n    auto result = std::static_pointer_cast<IOSRecorderCallback>(dataCallback_)\n                      ->prepare(resolvedInputFormat, [nativeRecorder_ getResolvedBufferSize]);\n\n    if (result.is_err()) {\n      callbackOutputEnabled_.store(false, std::memory_order_release);\n      callbackOutputConfigured_.store(false, std::memory_order_release);\n      dataCallback_ = nullptr;\n      return Result<NoneType, std::string>::Err(result.unwrap_err());\n    }\n\n    callbackOutputConfigured_.store(true, std::memory_order_release);\n  }\n  return Result<NoneType, std::string>::Ok(None);\n}\n\n/// @brief Clears the audio data callback.\n/// If the recorder is currently active, it will stop invoking the callback immediately.\n/// This method should be called from the JS thread only.\nvoid IOSAudioRecorder::clearOnAudioReadyCallback()\n{\n  std::scoped_lock lock(callbackMutex_);\n  callbackOutputConfigured_.store(false, std::memory_order_release);\n  callbackOutputEnabled_.store(false, std::memory_order_release);\n  dataCallback_ = nullptr;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/NativeAudioPlayer.h",
    "content": "#pragma once\n\n#import <AVFoundation/AVFoundation.h>\n#import <Foundation/Foundation.h>\n\ntypedef void (^RenderAudioBlock)(AudioBufferList *outputBuffer, int numFrames);\n\n@interface NativeAudioPlayer : NSObject\n\n@property (nonatomic, copy) RenderAudioBlock renderAudio;\n@property (nonatomic, assign) float sampleRate;\n@property (nonatomic, assign) int channelCount;\n@property (nonatomic, strong) NSString *sourceNodeId;\n@property (nonatomic, strong) AVAudioSourceNodeRenderBlock renderBlock;\n\n- (instancetype)initWithRenderAudio:(RenderAudioBlock)renderAudio\n                         sampleRate:(float)sampleRate\n                       channelCount:(int)channelCount;\n\n- (bool)start;\n\n- (void)stop;\n\n- (bool)resume;\n\n- (void)suspend;\n\n- (void)cleanup;\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/NativeAudioPlayer.m",
    "content": "#import <audioapi/ios/core/NativeAudioPlayer.h>\n#import <audioapi/ios/system/AudioEngine.h>\n#import <audioapi/ios/system/AudioSessionManager.h>\n\n@implementation NativeAudioPlayer\n\n- (void)detachSourceNodeIfAttached:(AudioEngine *)audioEngine\n{\n  if (self.sourceNodeId == nil) {\n    return;\n  }\n\n  [audioEngine detachSourceNodeWithId:self.sourceNodeId];\n  self.sourceNodeId = nil;\n}\n\n- (void)attachSourceNodeIfNeeded:(AudioEngine *)audioEngine\n{\n  if (self.sourceNodeId != nil) {\n    return;\n  }\n\n  self.sourceNodeId = [audioEngine attachSourceNodeWithRenderBlock:self.renderBlock\n                                                        sampleRate:self.sampleRate\n                                                      channelCount:self.channelCount];\n}\n\n- (bool)startPlaybackGraph:(AudioEngine *)audioEngine\n{\n  [audioEngine stopIfNecessary];\n  [self attachSourceNodeIfNeeded:audioEngine];\n  return [audioEngine startIfNecessary];\n}\n\n- (instancetype)initWithRenderAudio:(RenderAudioBlock)renderAudio\n                         sampleRate:(float)sampleRate\n                       channelCount:(int)channelCount\n{\n  if (self = [super init]) {\n    self.sampleRate = sampleRate;\n\n    self.channelCount = channelCount;\n    self.renderAudio = [renderAudio copy];\n\n    __weak typeof(self) weakSelf = self;\n    self.renderBlock = ^OSStatus(\n        BOOL *isSilence,\n        const AudioTimeStamp *timestamp,\n        AVAudioFrameCount frameCount,\n        AudioBufferList *outputData) {\n      if (outputData->mNumberBuffers != weakSelf.channelCount) {\n        return kAudioServicesBadPropertySizeError;\n      }\n\n      weakSelf.renderAudio(outputData, frameCount);\n\n      return kAudioServicesNoError;\n    };\n  }\n\n  return self;\n}\n\n- (bool)start\n{\n  AudioEngine *audioEngine = [AudioEngine sharedInstance];\n  AudioSessionManager *sessionManager = [AudioSessionManager sharedInstance];\n  assert(audioEngine != nil);\n\n  NSError *error = nil;\n  if (![sessionManager ensureActive:false error:&error]) {\n    NSLog(@\"Error while activating audio session for playback: %@\", [error debugDescription]);\n    return false;\n  }\n\n  // AudioEngine allows us to attach and connect nodes at runtime but with few\n  // limitations in this case if it is the first player and recorder started the\n  // engine we need to restart. It can be optimized by tracking if we haven't\n  // break rules of at runtime modifications from docs\n  // https://developer.apple.com/documentation/avfaudio/avaudioengine?language=objc\n  //\n  // Currently we are restarting because we do not see any significant performance issue and case when\n  // you will need to start and stop player very frequently\n  return [self startPlaybackGraph:audioEngine];\n}\n\n- (void)stop\n{\n  AudioEngine *audioEngine = [AudioEngine sharedInstance];\n  assert(audioEngine != nil);\n\n  [self detachSourceNodeIfAttached:audioEngine];\n  [audioEngine stopIfPossible];\n}\n\n- (bool)resume\n{\n  AudioEngine *audioEngine = [AudioEngine sharedInstance];\n  AudioSessionManager *sessionManager = [AudioSessionManager sharedInstance];\n  assert(audioEngine != nil);\n\n  NSError *error = nil;\n  if (![sessionManager ensureActive:false error:&error]) {\n    NSLog(@\"Error while re-activating audio session for playback: %@\", [error debugDescription]);\n    return false;\n  }\n\n  return [self startPlaybackGraph:audioEngine];\n}\n\n- (void)suspend\n{\n  AudioEngine *audioEngine = [AudioEngine sharedInstance];\n  assert(audioEngine != nil);\n\n  [self detachSourceNodeIfAttached:audioEngine];\n  [audioEngine stopIfPossible];\n}\n\n- (void)cleanup\n{\n  self.renderAudio = nil;\n  self.renderBlock = nil;\n}\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/NativeAudioRecorder.h",
    "content": "#pragma once\n\n#import <AVFoundation/AVFoundation.h>\n#import <Foundation/Foundation.h>\n\ntypedef void (^AudioReceiverBlock)(const AudioBufferList *inputBuffer, int numFrames);\n\n@interface NativeAudioRecorder : NSObject\n\n@property (nonatomic, copy) AVAudioSinkNodeReceiverBlock receiverSinkBlock;\n@property (nonatomic, copy) AudioReceiverBlock receiverBlock;\n@property (nonatomic, strong) AVAudioFormat *resolvedInputFormat;\n@property (nonatomic, assign) int resolvedBufferSize;\n@property (nonatomic, assign) BOOL inputArmed;\n\n- (instancetype)initWithReceiverBlock:(AudioReceiverBlock)receiverBlock;\n\n- (int)getBufferSize;\n- (AVAudioFormat *)getResolvedInputFormat;\n- (int)getResolvedBufferSize;\n- (BOOL)start:(NSError **)error;\n\n- (void)stop;\n\n- (void)pause;\n\n- (void)resume;\n\n- (void)cleanup;\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/NativeAudioRecorder.m",
    "content": "#import <audioapi/ios/core/NativeAudioRecorder.h>\n#import <audioapi/ios/system/AudioEngine.h>\n\n@implementation NativeAudioRecorder\n\nstatic inline uint32_t nextPowerOfTwo(uint32_t x)\n{\n  if (x == 0) {\n    return 1;\n  }\n\n  x--;\n  x |= x >> 1;\n  x |= x >> 2;\n  x |= x >> 4;\n  x |= x >> 8;\n  x |= x >> 16;\n  x++;\n\n  return x;\n}\n\n- (AVAudioFormat *)readLiveInputFormat\n{\n  return [[AudioEngine sharedInstance] getLiveInputFormat];\n}\n\n- (instancetype)initWithReceiverBlock:(AudioReceiverBlock)receiverBlock\n{\n  if (self = [super init]) {\n    self.receiverBlock = [receiverBlock copy];\n    self.inputArmed = NO;\n    self.resolvedBufferSize = 0;\n\n    __weak typeof(self) weakSelf = self;\n    self.receiverSinkBlock = ^OSStatus(\n        const AudioTimeStamp *_Nonnull timestamp,\n        AVAudioFrameCount frameCount,\n        const AudioBufferList *_Nonnull inputData) {\n      if (!weakSelf.inputArmed || weakSelf.receiverBlock == nil) {\n        return kAudioServicesNoError;\n      }\n\n      weakSelf.receiverBlock(inputData, frameCount);\n\n      return kAudioServicesNoError;\n    };\n  }\n\n  return self;\n}\n\n- (AVAudioFormat *)getResolvedInputFormat\n{\n  return self.resolvedInputFormat;\n}\n\n- (int)getBufferSize\n{\n  // NOTE: this method should be called only after the session is activated\n  AVAudioSession *audioSession = [AVAudioSession sharedInstance];\n\n  // TMPfix: it seems that buffer duration in some cases (background/device change) can switch\n  // to longer values, exceeding buffer size predicted after session start\n  // since it is just a couple of buffers we can set min value of 200ms\n  // to enforce we always have enough frames allocated to pass further down the pipeline\n  float bufferDuration = MAX(audioSession.IOBufferDuration, 0.2);\n\n  // IOS returns buffer duration rounded, but expects the buffer size to be power of two in runtime\n  return nextPowerOfTwo(ceil(bufferDuration * audioSession.sampleRate));\n}\n\n- (int)getResolvedBufferSize\n{\n  return self.resolvedBufferSize;\n}\n\n- (BOOL)start:(NSError **)error\n{\n  AudioEngine *audioEngine = [AudioEngine sharedInstance];\n  assert(audioEngine != nil);\n\n  // AudioEngine allows us to attach and connect nodes at runtime but with few\n  // limitations in this case if it is the first recorder node and player\n  // started the engine we need to restart. It can be optimized by tracking if\n  // we haven't break rules of at runtime modifications from docs\n  // https://developer.apple.com/documentation/avfaudio/avaudioengine?language=objc\n  //\n  // Currently we are restarting because we do not see any significant performance issue and case when\n  // you will need to start and stop recorder very frequently\n  self.inputArmed = NO;\n  self.resolvedInputFormat = nil;\n  self.resolvedBufferSize = 0;\n\n  [audioEngine stopIfNecessary];\n  [audioEngine attachInputNodeWithReceiverBlock:self.receiverSinkBlock];\n\n  if (![audioEngine startIfNecessary]) {\n    [audioEngine detachInputNode];\n    [audioEngine stopIfPossible];\n\n    if (error != nil) {\n      *error = [NSError\n          errorWithDomain:@\"NativeAudioRecorder\"\n                     code:1\n                 userInfo:@{\n                   NSLocalizedDescriptionKey : @\"Failed to start audio engine for recording\",\n                 }];\n    }\n\n    return NO;\n  }\n\n  self.resolvedInputFormat = [self readLiveInputFormat];\n  self.resolvedBufferSize = [self getBufferSize];\n\n  if (error != nil) {\n    *error = nil;\n  }\n\n  return YES;\n}\n\n- (void)stop\n{\n  AudioEngine *audioEngine = [AudioEngine sharedInstance];\n  assert(audioEngine != nil);\n  self.inputArmed = NO;\n  [audioEngine detachInputNode];\n  [audioEngine stopIfPossible];\n  // This makes sure that the engine releases the input properly when we no longer need it\n  // (i.e. no more misleading dot)\n  [audioEngine restartAudioEngine];\n  self.resolvedInputFormat = nil;\n  self.resolvedBufferSize = 0;\n}\n\n- (void)pause\n{\n  AudioEngine *audioEngine = [AudioEngine sharedInstance];\n  assert(audioEngine != nil);\n\n  self.inputArmed = NO;\n  [audioEngine pauseIfNecessary];\n}\n\n- (void)resume\n{\n  AudioEngine *audioEngine = [AudioEngine sharedInstance];\n  assert(audioEngine != nil);\n\n  if ([audioEngine startIfNecessary]) {\n    self.inputArmed = YES;\n  }\n}\n\n- (void)cleanup\n{\n  self.inputArmed = NO;\n  self.resolvedInputFormat = nil;\n  self.resolvedBufferSize = 0;\n  self.receiverBlock = nil;\n  self.receiverSinkBlock = nil;\n}\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/utils/FileOptions.h",
    "content": "#pragma once\n\n#ifndef __OBJC__ // when compiled as C++\ntypedef struct objc_object AVAudioFile;\ntypedef struct objc_object NSURL;\ntypedef struct objc_object AudioBufferList;\n#endif // __OBJC__\n\n#include <memory>\n\nnamespace audioapi {\n\nclass AudioFileProperties;\n\nnamespace ios::fileoptions {\n\nAudioFormatID getFormat(const std::shared_ptr<AudioFileProperties> &properties);\nNSInteger getQuality(const std::shared_ptr<AudioFileProperties> &properties);\nNSInteger getFlacCompressionLevel(const std::shared_ptr<AudioFileProperties> &properties);\nNSString *getFileExtension(const std::shared_ptr<AudioFileProperties> &properties);\nNSInteger getBitDepth(const std::shared_ptr<AudioFileProperties> &properties);\nfloat getSampleRate(const std::shared_ptr<AudioFileProperties> &properties);\n\nNSDictionary *getFileSettings(const std::shared_ptr<AudioFileProperties> &properties);\nNSURL *getFileURL(\n    const std::shared_ptr<AudioFileProperties> &properties,\n    const std::string &fileNameOverride);\nNSSearchPathDirectory getDirectory(const std::shared_ptr<AudioFileProperties> &properties);\n\nNSString *getDateString();\nNSString *getTimestampString();\n\n} // namespace ios::fileoptions\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/utils/FileOptions.mm",
    "content": "#import <AVFoundation/AVFoundation.h>\n#import <Foundation/Foundation.h>\n\n#include <audioapi/ios/core/utils/FileOptions.h>\n#include <audioapi/utils/AudioFileProperties.h>\n\nnamespace audioapi::ios::fileoptions {\n\n/// @brief Maps AudioFileProperties to iOS AVFoundation AudioFormatID.\n/// @param properties Shared pointer to AudioFileProperties.\n/// @returns Corresponding AudioFormatID for AVFoundation.\nAudioFormatID getFormat(const std::shared_ptr<AudioFileProperties> &properties)\n{\n  switch (properties->format) {\n    case AudioFileProperties::Format::WAV:\n      return kAudioFormatLinearPCM;\n\n    case AudioFileProperties::Format::CAF:\n      return kAudioFormatLinearPCM;\n\n    case AudioFileProperties::Format::M4A:\n      return kAudioFormatMPEG4AAC;\n\n    case AudioFileProperties::Format::FLAC:\n      return kAudioFormatFLAC;\n\n    default:\n      return kAudioFormatLinearPCM;\n  }\n}\n\n/// @brief Maps AudioFileProperties to iOS AVFoundation audio quality settings.\n/// @param properties Shared pointer to AudioFileProperties.\n/// @returns Corresponding NSInteger value for AVAudioQuality.\nNSInteger getQuality(const std::shared_ptr<AudioFileProperties> &properties)\n{\n  switch (properties->iosAudioQuality) {\n    case AudioFileProperties::IOSAudioQuality::Min:\n      return AVAudioQualityMin;\n\n    case AudioFileProperties::IOSAudioQuality::Low:\n      return AVAudioQualityLow;\n\n    case AudioFileProperties::IOSAudioQuality::Medium:\n      return AVAudioQualityMedium;\n\n    case AudioFileProperties::IOSAudioQuality::High:\n      return AVAudioQualityHigh;\n\n    case AudioFileProperties::IOSAudioQuality::Max:\n      return AVAudioQualityMax;\n\n    default:\n      return AVAudioQualityMedium;\n  }\n}\n\n/// @brief Retrieves the FLAC compression level from AudioFileProperties.\n/// @param properties Shared pointer to AudioFileProperties.\n/// @returns NSInteger representing the FLAC compression level.\nNSInteger getFlacCompressionLevel(const std::shared_ptr<AudioFileProperties> &properties)\n{\n  return properties->flacCompressionLevel;\n}\n\n/// @brief Retrieves the file extension based on AudioFileProperties format.\n/// @param properties Shared pointer to AudioFileProperties.\n/// @returns NSString representing the file extension.\nNSString *getFileExtension(const std::shared_ptr<AudioFileProperties> &properties)\n{\n  switch (properties->format) {\n    case AudioFileProperties::Format::WAV:\n      return @\"wav\";\n\n    case AudioFileProperties::Format::CAF:\n      return @\"caf\";\n\n    case AudioFileProperties::Format::M4A:\n      return @\"m4a\";\n\n    case AudioFileProperties::Format::FLAC:\n      return @\"flac\";\n\n    default:\n      return @\"wav\";\n  }\n}\n\n/// @brief Retrieves the bit depth from AudioFileProperties.\n/// @param properties Shared pointer to AudioFileProperties.\n/// @returns NSInteger representing the bit depth.\nNSInteger getBitDepth(const std::shared_ptr<AudioFileProperties> &properties)\n{\n  switch (properties->bitDepth) {\n    case AudioFileProperties::BitDepth::Bit16:\n      return 16;\n\n    case AudioFileProperties::BitDepth::Bit24:\n      return 24;\n\n    case AudioFileProperties::BitDepth::Bit32:\n      return 32;\n\n    default:\n      return 32;\n  }\n}\n\n/// @brief Constructs AVFoundation file settings dictionary from AudioFileProperties.\n/// @param properties Shared pointer to AudioFileProperties.\n/// @returns NSDictionary containing AVFoundation audio file settings.\nNSDictionary *getFileSettings(const std::shared_ptr<AudioFileProperties> &properties)\n{\n  AudioFormatID format = getFormat(properties);\n  NSMutableDictionary *settings = [NSMutableDictionary dictionary];\n\n  settings[AVFormatIDKey] = @(format);\n  settings[AVSampleRateKey] = @(properties->sampleRate);\n  settings[AVNumberOfChannelsKey] = @(properties->channelCount);\n  settings[AVEncoderAudioQualityKey] = @(getQuality(properties));\n\n  if (format == kAudioFormatMPEG4AAC) {\n    settings[AVEncoderBitRateKey] = @(properties->bitRate);\n  }\n\n  if (format == kAudioFormatLinearPCM) {\n    NSInteger bitDepth = getBitDepth(properties);\n\n    settings[AVLinearPCMBitDepthKey] = @(bitDepth);\n    settings[AVLinearPCMIsFloatKey] = @(bitDepth == 32);\n    settings[AVLinearPCMIsBigEndianKey] = @(NO);\n    settings[AVLinearPCMIsNonInterleaved] = @(NO);\n  }\n\n  if (format == kAudioFormatFLAC) {\n    settings[@\"FLACCompressionLevel\"] = @(getFlacCompressionLevel(properties));\n  }\n\n  return settings;\n}\n\nNSURL *getFileURL(\n    const std::shared_ptr<AudioFileProperties> &properties,\n    const std::string &fileNameOverride)\n{\n  NSError *error = nil;\n\n  NSSearchPathDirectory directory = getDirectory(properties);\n  NSString *subDirectory = [NSString stringWithUTF8String:properties->subDirectory.c_str()];\n\n  NSURL *baseURL = [[[NSFileManager defaultManager] URLsForDirectory:directory\n                                                           inDomains:NSUserDomainMask] firstObject];\n  NSURL *directoryURL = [baseURL URLByAppendingPathComponent:subDirectory isDirectory:YES];\n\n  [[NSFileManager defaultManager] createDirectoryAtURL:directoryURL\n                           withIntermediateDirectories:YES\n                                            attributes:nil\n                                                 error:&error];\n\n  if (error != nil) {\n    NSLog(@\"Error creating directory for audio recordings: %@\", [error debugDescription]);\n    directoryURL = baseURL;\n  }\n\n  NSString *fileNamePrefix = [NSString stringWithUTF8String:properties->fileNamePrefix.c_str()];\n  NSString *timestamp = getTimestampString();\n  NSString *fileExtension = getFileExtension(properties);\n\n  NSString *fileName = fileNameOverride.length() > 0 && properties->rotateIntervalBytes == 0\n      ? [NSString stringWithFormat:@\"%@.%@\",\n                                   [NSString stringWithUTF8String:fileNameOverride.c_str()],\n                                   fileExtension]\n      : [NSString stringWithFormat:@\"%@_%@.%@\", fileNamePrefix, timestamp, fileExtension];\n\n  return [directoryURL URLByAppendingPathComponent:fileName];\n}\n\nNSSearchPathDirectory getDirectory(const std::shared_ptr<AudioFileProperties> &properties)\n{\n  switch (properties->directory) {\n    case AudioFileProperties::FileDirectory::Document:\n      return NSDocumentDirectory;\n\n    case AudioFileProperties::FileDirectory::Cache:\n      return NSCachesDirectory;\n\n    default:\n      return NSCachesDirectory;\n  }\n}\n\nNSString *getTimestampString()\n{\n  NSDateFormatter *fmt = [[NSDateFormatter alloc] init];\n  fmt.locale = [NSLocale localeWithLocaleIdentifier:@\"en_US_POSIX\"];\n  fmt.timeZone = [NSTimeZone timeZoneWithAbbreviation:@\"UTC\"]; // or local if you prefer\n  fmt.dateFormat = @\"yyyyMMdd_HHmmss\";\n  return [fmt stringFromDate:[NSDate date]];\n}\n\n} // namespace audioapi::ios::fileoptions\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/utils/IOSFileWriter.h",
    "content": "#pragma once\n\n#include <audioapi/core/utils/AudioFileWriter.h>\n#include <audioapi/utils/Result.hpp>\n#include <audioapi/utils/SpscChannel.hpp>\n#include <audioapi/utils/TaskOffloader.hpp>\n#include <memory>\n#include <string>\n#include <tuple>\n\n#ifndef __OBJC__ // when compiled as C++\ntypedef struct objc_object NSURL;\ntypedef struct objc_object NSString;\ntypedef struct objc_object AVAudioFile;\ntypedef struct objc_object AVAudioFormat;\ntypedef struct objc_object AudioBufferList;\ntypedef struct objc_object AVAudioConverter;\n#endif // __OBJC__\n\nstruct WriterData {\n  const AudioBufferList *audioBufferList;\n  int numFrames;\n};\n\nnamespace audioapi {\n\nclass AudioFileProperties;\nclass AudioEventHandlerRegistry;\n\nclass IOSFileWriter : public AudioFileWriter {\n public:\n  IOSFileWriter(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const std::shared_ptr<AudioFileProperties> &fileProperties);\n  ~IOSFileWriter() override;\n\n  virtual OpenFileResult openFile(\n      AVAudioFormat *bufferFormat,\n      size_t maxInputBufferLength,\n      const std::string &fileNameOverride);\n  CloseFileResult closeFile() override;\n\n  void writeAudioData(const AudioBufferList *audioBufferList, int numFrames) override;\n  double getCurrentDuration() const override;\n\n  std::string getFilePath() const override;\n  size_t getFileSizeBytes() const override;\n\n protected:\n  size_t converterInputBufferSize_;\n  size_t converterOutputBufferSize_;\n\n  AVAudioFile *audioFile_;\n  AVAudioFormat *bufferFormat_;\n  AVAudioConverter *converter_;\n  NSURL *fileURL_;\n\n  AVAudioPCMBuffer *converterInputBuffer_;\n  AVAudioPCMBuffer *converterOutputBuffer_;\n\n private:\n  // delay initialization of offloader until prepare is called\n  std::unique_ptr<task_offloader::TaskOffloader<\n      WriterData,\n      FILE_WRITER_SPSC_OVERFLOW_STRATEGY,\n      FILE_WRITER_SPSC_WAIT_STRATEGY>>\n      offloader_;\n  void taskOffloaderFunction(WriterData data);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/utils/IOSFileWriter.mm",
    "content": "#import <AVFoundation/AVFoundation.h>\n#import <Foundation/Foundation.h>\n\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <audioapi/ios/core/utils/FileOptions.h>\n#include <audioapi/ios/core/utils/IOSFileWriter.h>\n#include <audioapi/utils/AudioFileProperties.h>\n#include <audioapi/utils/Result.hpp>\n#include <audioapi/utils/UnitConversion.h>\n\nnamespace audioapi {\n\nIOSFileWriter::IOSFileWriter(\n    const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    const std::shared_ptr<AudioFileProperties> &fileProperties)\n    : AudioFileWriter(audioEventHandlerRegistry, fileProperties)\n{\n}\n\nIOSFileWriter::~IOSFileWriter()\n{\n  @autoreleasepool {\n    fileURL_ = nil;\n    audioFile_ = nil;\n    converter_ = nil;\n    bufferFormat_ = nil;\n  }\n}\n\n/// @brief Opens an audio file for writing with the specified buffer format and maximum input buffer length.\n/// This method initializes the AVAudioFile and AVAudioConverter for audio data writing and conversion.\n/// This method should be called from the JS thread only.\n/// @param bufferFormat The audio format of the input buffer.\n/// @param maxInputBufferLength The maximum length of the input buffer in frames.\n/// @returns An OpenFileResult indicating success with the file path or an error message.\nOpenFileResult IOSFileWriter::openFile(\n    AVAudioFormat *bufferFormat,\n    size_t maxInputBufferLength,\n    const std::string &fileNameOverride)\n{\n  @autoreleasepool {\n    if (audioFile_ != nil) {\n      return OpenFileResult::Err(\"file already open\");\n    }\n\n    framesWritten_.store(0, std::memory_order_release);\n    bufferFormat_ = bufferFormat;\n\n    NSError *error = nil;\n    NSDictionary *settings = ios::fileoptions::getFileSettings(fileProperties_);\n    fileURL_ = ios::fileoptions::getFileURL(fileProperties_, fileNameOverride);\n\n    if (fileProperties_->sampleRate == 0 || fileProperties_->channelCount == 0) {\n      return OpenFileResult::Err(\n          \"Invalid file properties: sampleRate and channelCount must be greater than 0\");\n    }\n\n    if (bufferFormat.sampleRate == 0 || bufferFormat.channelCount == 0) {\n      return OpenFileResult::Err(\n          \"Invalid input format: sampleRate and channelCount must be greater than 0\");\n    }\n\n    audioFile_ = [[AVAudioFile alloc] initForWriting:fileURL_\n                                            settings:settings\n                                        commonFormat:AVAudioPCMFormatFloat32\n                                         interleaved:bufferFormat.interleaved\n                                               error:&error];\n\n    if (error != nil) {\n      return OpenFileResult::Err(\n          std::string(\"Error creating audio file for writing: \") +\n          [[error debugDescription] UTF8String]);\n    }\n\n    converter_ = [[AVAudioConverter alloc] initFromFormat:bufferFormat\n                                                 toFormat:[audioFile_ processingFormat]];\n    converter_.sampleRateConverterAlgorithm = AVSampleRateConverterAlgorithm_Normal;\n    converter_.sampleRateConverterQuality = AVAudioQualityMax;\n    converter_.primeMethod = AVAudioConverterPrimeMethod_None;\n\n    converterInputBufferSize_ = maxInputBufferLength;\n    converterOutputBufferSize_ = std::max(\n        (double)maxInputBufferLength,\n        fileProperties_->sampleRate / bufferFormat.sampleRate * maxInputBufferLength);\n\n    converterInputBuffer_ =\n        [[AVAudioPCMBuffer alloc] initWithPCMFormat:bufferFormat\n                                      frameCapacity:(AVAudioFrameCount)maxInputBufferLength];\n    converterOutputBuffer_ =\n        [[AVAudioPCMBuffer alloc] initWithPCMFormat:[audioFile_ processingFormat]\n                                      frameCapacity:(AVAudioFrameCount)converterOutputBufferSize_];\n\n    if (converterInputBuffer_ == nil || converterOutputBuffer_ == nil || audioFile_ == nil ||\n        converter_ == nil) {\n      audioFile_ = nil;\n      converter_ = nil;\n      converterInputBuffer_ = nil;\n      converterOutputBuffer_ = nil;\n\n      return OpenFileResult::Err(\"Error creating converter buffers\");\n    }\n\n    auto offloaderLambda = [this](WriterData data) {\n      taskOffloaderFunction(data);\n    };\n\n    offloader_ = std::make_unique<task_offloader::TaskOffloader<\n        WriterData,\n        FILE_WRITER_SPSC_OVERFLOW_STRATEGY,\n        FILE_WRITER_SPSC_WAIT_STRATEGY>>(FILE_WRITER_CHANNEL_CAPACITY, offloaderLambda);\n\n    return OpenFileResult::Ok([[fileURL_ path] UTF8String]);\n  }\n}\n\n/// @brief Closes the currently open audio file and finalizes writing.\n/// This method retrieves the final file duration and size before closing.\n/// This method should be called from the JS thread only.\n/// @returns A CloseFileResult indicating success with file duration and size or an error message.\nCloseFileResult IOSFileWriter::closeFile()\n{\n  @autoreleasepool {\n    NSError *error;\n    std::string filePath = [[fileURL_ path] UTF8String];\n\n    if (audioFile_ == nil) {\n      return CloseFileResult::Err(\"file is not open: \" + filePath);\n    }\n\n    offloader_.reset();\n\n    // AVAudioFile automatically finalizes the file when deallocated\n    audioFile_ = nil;\n\n    double fileDuration = CMTimeGetSeconds([[AVURLAsset URLAssetWithURL:fileURL_\n                                                                options:nil] duration]);\n    double fileSizeBytesMb = static_cast<double>([[[NSFileManager defaultManager]\n                                 attributesOfItemAtPath:fileURL_.path\n                                                  error:&error] fileSize]) /\n        MB_IN_BYTES;\n\n    if (error != nil) {\n      NSLog(@\"⚠️ closeFile: error while retrieving file size\");\n      fileSizeBytesMb = 0;\n    }\n\n    fileURL_ = nil;\n    framesWritten_.store(0, std::memory_order_release);\n\n    return CloseFileResult::Ok(std::make_tuple(fileSizeBytesMb, fileDuration));\n  }\n}\n\n/// @brief Writes audio data to the open audio file, performing format conversion if necessary.\n/// This method should be called from the audio thread.\nvoid IOSFileWriter::writeAudioData(const AudioBufferList *audioBufferList, int numFrames)\n{\n  if (audioFile_ == nil) {\n    invokeOnErrorCallback(\"Attempted to write audio data when file is not open\");\n  } else {\n    offloader_->getSender()->send({audioBufferList, numFrames});\n  }\n}\n\nvoid IOSFileWriter::taskOffloaderFunction(WriterData data)\n{\n  auto [audioBufferList, numFrames] = data;\n  if (audioBufferList == nullptr)\n    return;\n  @autoreleasepool {\n    NSError *error = nil;\n    AVAudioFormat *fileFormat = [audioFile_ processingFormat];\n\n    if (bufferFormat_.sampleRate == fileFormat.sampleRate &&\n        bufferFormat_.channelCount == fileFormat.channelCount &&\n        bufferFormat_.isInterleaved == fileFormat.isInterleaved) {\n      // We can use the converter input buffer as a \"transport\" layer to the file\n      for (size_t i = 0; i < bufferFormat_.channelCount; ++i) {\n        memcpy(\n            converterInputBuffer_.mutableAudioBufferList->mBuffers[i].mData,\n            audioBufferList->mBuffers[i].mData,\n            audioBufferList->mBuffers[i].mDataByteSize);\n      }\n\n      audioBufferList = nullptr;\n      converterInputBuffer_.frameLength = numFrames;\n\n      [audioFile_ writeFromBuffer:converterInputBuffer_ error:&error];\n\n      if (error != nil) {\n        invokeOnErrorCallback(\n            std::string(\"Error writing audio data to file, native error: \") +\n            [[error debugDescription] UTF8String]);\n        return;\n      }\n\n      framesWritten_.fetch_add(numFrames, std::memory_order_acq_rel);\n      return;\n    }\n\n    for (size_t i = 0; i < bufferFormat_.channelCount; ++i) {\n      memcpy(\n          converterInputBuffer_.mutableAudioBufferList->mBuffers[i].mData,\n          audioBufferList->mBuffers[i].mData,\n          audioBufferList->mBuffers[i].mDataByteSize);\n    }\n\n    audioBufferList = nullptr;\n    converterInputBuffer_.frameLength = numFrames;\n\n    __block BOOL handedOff = false;\n    AVAudioConverterInputBlock inputBlock = ^AVAudioBuffer *_Nullable(\n        AVAudioPacketCount inNumberOfPackets, AVAudioConverterInputStatus *outStatus)\n    {\n      if (handedOff) {\n        *outStatus = AVAudioConverterInputStatus_NoDataNow;\n        return nil;\n      }\n\n      handedOff = true;\n      *outStatus = AVAudioConverterInputStatus_HaveData;\n      return converterInputBuffer_;\n    };\n\n    [converter_ convertToBuffer:converterOutputBuffer_ error:&error withInputFromBlock:inputBlock];\n    converterOutputBuffer_.frameLength =\n        fileProperties_->sampleRate / bufferFormat_.sampleRate * numFrames;\n\n    if (error != nil) {\n      invokeOnErrorCallback(\n          std::string(\"Error during audio conversion, native error: \") +\n          [[error debugDescription] UTF8String]);\n      return;\n    }\n\n    [audioFile_ writeFromBuffer:converterOutputBuffer_ error:&error];\n\n    if (error != nil) {\n      invokeOnErrorCallback(\n          std::string(\"Error writing audio data to file, native error: \") +\n          [[error debugDescription] UTF8String]);\n      return;\n    }\n\n    framesWritten_.fetch_add(numFrames, std::memory_order_acq_rel);\n  }\n}\n\ndouble IOSFileWriter::getCurrentDuration() const\n{\n  return static_cast<double>(framesWritten_.load(std::memory_order_acquire)) /\n      bufferFormat_.sampleRate;\n}\n\nstd::string IOSFileWriter::getFilePath() const\n{\n  return [[fileURL_ path] UTF8String];\n}\n\nsize_t IOSFileWriter::getFileSizeBytes() const\n{\n  @autoreleasepool {\n    if (fileURL_ == nil) {\n      return 0;\n    }\n    NSError *error = nil;\n    NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:[fileURL_ path]\n                                                                           error:&error];\n    if (error != nil || attrs == nil) {\n      return 0;\n    }\n    return static_cast<size_t>([attrs fileSize]);\n  }\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/utils/IOSRecorderCallback.h",
    "content": "#pragma once\n\n#ifndef __OBJC__ // when compiled as C++\ntypedef struct objc_object AVAudioFormat;\ntypedef struct objc_object AudioBufferList;\ntypedef struct objc_object AVAudioConverter;\n#endif\n\n#include <audioapi/core/utils/AudioRecorderCallback.h>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/Result.hpp>\n#include <memory>\n\nstruct CallbackData {\n  const AudioBufferList *audioBufferList;\n  int numFrames;\n};\n\nnamespace audioapi {\n\nclass AudioEventHandlerRegistry;\n\nclass IOSRecorderCallback : public AudioRecorderCallback {\n public:\n  IOSRecorderCallback(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      float sampleRate,\n      size_t bufferLength,\n      int channelCount,\n      uint64_t callbackId);\n  ~IOSRecorderCallback();\n\n  Result<NoneType, std::string> prepare(AVAudioFormat *bufferFormat, size_t maxInputBufferLength);\n  void cleanup() override;\n\n  void receiveAudioData(const AudioBufferList *audioBufferList, int numFrames);\n\n protected:\n  size_t converterInputBufferSize_;\n  size_t converterOutputBufferSize_;\n\n  AVAudioFormat *bufferFormat_;\n  AVAudioFormat *callbackFormat_;\n  AVAudioConverter *converter_;\n\n  AVAudioPCMBuffer *converterInputBuffer_;\n  AVAudioPCMBuffer *converterOutputBuffer_;\n\n private:\n  std::unique_ptr<task_offloader::TaskOffloader<\n      CallbackData,\n      RECORDER_CALLBACK_SPSC_OVERFLOW_STRATEGY,\n      RECORDER_CALLBACK_SPSC_WAIT_STRATEGY>>\n      offloader_;\n  // delay initialization of offloader until prepare is called\n  void taskOffloaderFunction(CallbackData data);\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/utils/IOSRecorderCallback.mm",
    "content": "#import <AVFoundation/AVFoundation.h>\n#import <Foundation/Foundation.h>\n\n#include <audioapi/HostObjects/sources/AudioBufferHostObject.h>\n#include <audioapi/core/utils/Constants.h>\n#include <audioapi/dsp/VectorMath.h>\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <audioapi/ios/core/utils/IOSRecorderCallback.h>\n#include <audioapi/utils/AudioArray.hpp>\n#include <audioapi/utils/AudioBuffer.hpp>\n#include <audioapi/utils/CircularArray.hpp>\n#include <audioapi/utils/Result.hpp>\n#include <algorithm>\n#include <utility>\n\nnamespace audioapi {\n\nIOSRecorderCallback::IOSRecorderCallback(\n    const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    float sampleRate,\n    size_t bufferLength,\n    int channelCount,\n    uint64_t callbackId)\n    : AudioRecorderCallback(\n          audioEventHandlerRegistry,\n          sampleRate,\n          bufferLength,\n          channelCount,\n          callbackId)\n{\n}\n\nIOSRecorderCallback::~IOSRecorderCallback()\n{\n  @autoreleasepool {\n    converter_ = nil;\n    bufferFormat_ = nil;\n    callbackFormat_ = nil;\n    converterInputBuffer_ = nil;\n    converterOutputBuffer_ = nil;\n\n    for (size_t i = 0; i < channelCount_; ++i) {\n      circularBuffer_[i]->zero();\n    }\n  }\n}\n\n/// @brief Prepares the IOSRecorderCallback for receiving audio data.\n/// This involves setting up the audio converter and buffers based on the provided input format.\n/// This method should be called from the JS thread only.\n/// @param bufferFormat The format of the incoming audio data.\n/// @param maxInputBufferLength The maximum length of the input buffer in frames.\n/// @returns Result indicating success or error with message.\nResult<NoneType, std::string> IOSRecorderCallback::prepare(\n    AVAudioFormat *bufferFormat,\n    size_t maxInputBufferLength)\n{\n  @autoreleasepool {\n    bufferFormat_ = bufferFormat;\n    converterInputBufferSize_ = maxInputBufferLength;\n\n    if (bufferFormat.sampleRate <= 0 || bufferFormat.channelCount == 0) {\n      return Result<NoneType, std::string>::Err(\n          \"Invalid input format: sampleRate and channelCount must be greater than 0\");\n    }\n\n    if (sampleRate_ <= 0 || channelCount_ == 0) {\n      return Result<NoneType, std::string>::Err(\n          \"Invalid callback format: sampleRate and channelCount must be greater than 0\");\n    }\n\n    converterOutputBufferSize_ = std::max(\n        (double)maxInputBufferLength, sampleRate_ / bufferFormat.sampleRate * maxInputBufferLength);\n\n    callbackFormat_ = [[AVAudioFormat alloc] initWithCommonFormat:AVAudioPCMFormatFloat32\n                                                       sampleRate:sampleRate_\n                                                         channels:channelCount_\n                                                      interleaved:NO];\n\n    converter_ = [[AVAudioConverter alloc] initFromFormat:bufferFormat toFormat:callbackFormat_];\n    converter_.sampleRateConverterAlgorithm = AVSampleRateConverterAlgorithm_Normal;\n    converter_.sampleRateConverterQuality = AVAudioQualityMax;\n    converter_.primeMethod = AVAudioConverterPrimeMethod_None;\n\n    converterInputBuffer_ =\n        [[AVAudioPCMBuffer alloc] initWithPCMFormat:bufferFormat_\n                                      frameCapacity:(AVAudioFrameCount)converterInputBufferSize_];\n    converterOutputBuffer_ =\n        [[AVAudioPCMBuffer alloc] initWithPCMFormat:callbackFormat_\n                                      frameCapacity:(AVAudioFrameCount)converterOutputBufferSize_];\n    auto offloaderLambda = [this](CallbackData data) {\n      taskOffloaderFunction(data);\n    };\n    offloader_ = std::make_unique<task_offloader::TaskOffloader<\n        CallbackData,\n        RECORDER_CALLBACK_SPSC_OVERFLOW_STRATEGY,\n        RECORDER_CALLBACK_SPSC_WAIT_STRATEGY>>(RECORDER_CALLBACK_CHANNEL_CAPACITY, offloaderLambda);\n  }\n\n  return Result<NoneType, std::string>::Ok(None);\n}\n\n/// @brief Cleans up resources used by the IOSRecorderCallback.\n/// This method should be called from the JS thread only.\nvoid IOSRecorderCallback::cleanup()\n{\n  @autoreleasepool {\n    if (circularBuffer_[0]->getNumberOfAvailableFrames() > 0) {\n      emitAudioData(true);\n    }\n\n    converter_ = nil;\n    bufferFormat_ = nil;\n    callbackFormat_ = nil;\n    converterInputBuffer_ = nil;\n    converterOutputBuffer_ = nil;\n\n    for (size_t i = 0; i < channelCount_; ++i) {\n      circularBuffer_[i]->zero();\n    }\n    offloader_.reset();\n  }\n}\n\n/// @brief Receives audio data from the recorder, processes it, and stores it in the circular buffer.\n/// The data is converted using AVAudioConverter if the input format differs from the user desired callback format.\n/// This method runs on the audio thread.\n/// @param inputBuffer Pointer to the AudioBufferList containing the incoming audio data.\n/// @param numFrames Number of frames in the input buffer.\nvoid IOSRecorderCallback::receiveAudioData(const AudioBufferList *inputBuffer, int numFrames)\n{\n  if (!isInitialized_.load(std::memory_order_acquire)) {\n    return;\n  }\n  offloader_->getSender()->send({inputBuffer, numFrames});\n}\n\nvoid IOSRecorderCallback::taskOffloaderFunction(CallbackData data)\n{\n  auto [inputBuffer, numFrames] = data;\n  // dummy data to wake up thread after cleanup, skip processing it\n  if (inputBuffer == nullptr)\n    return;\n  @autoreleasepool {\n    NSError *error = nil;\n\n    if (bufferFormat_.sampleRate == sampleRate_ && bufferFormat_.channelCount == channelCount_ &&\n        !bufferFormat_.isInterleaved) {\n      // Directly write to circular buffer\n      for (size_t i = 0; i < channelCount_; ++i) {\n        auto *data = static_cast<float *>(inputBuffer->mBuffers[i].mData);\n        circularBuffer_[i]->push_back(data, numFrames);\n      }\n\n      inputBuffer = nullptr;\n      if (circularBuffer_[0]->getNumberOfAvailableFrames() >= bufferLength_) {\n        emitAudioData();\n      }\n      return;\n    }\n\n    size_t outputFrameCount = ceil(numFrames * (sampleRate_ / bufferFormat_.sampleRate));\n\n    for (size_t i = 0; i < bufferFormat_.channelCount; ++i) {\n      memcpy(\n          converterInputBuffer_.mutableAudioBufferList->mBuffers[i].mData,\n          inputBuffer->mBuffers[i].mData,\n          inputBuffer->mBuffers[i].mDataByteSize);\n    }\n\n    inputBuffer = nullptr;\n    converterInputBuffer_.frameLength = numFrames;\n\n    __block BOOL handedOff = false;\n    AVAudioConverterInputBlock inputBlock = ^AVAudioBuffer *_Nullable(\n        AVAudioPacketCount inNumberOfPackets, AVAudioConverterInputStatus *outStatus)\n    {\n      if (handedOff) {\n        *outStatus = AVAudioConverterInputStatus_NoDataNow;\n        return nil;\n      }\n\n      handedOff = true;\n      *outStatus = AVAudioConverterInputStatus_HaveData;\n      return converterInputBuffer_;\n    };\n\n    [converter_ convertToBuffer:converterOutputBuffer_ error:&error withInputFromBlock:inputBlock];\n    converterOutputBuffer_.frameLength = sampleRate_ / bufferFormat_.sampleRate * numFrames;\n\n    if (error != nil) {\n      invokeOnErrorCallback(\n          std::string(\"Error during audio conversion, native error: \") +\n          [[error debugDescription] UTF8String]);\n      return;\n    }\n\n    for (size_t i = 0; i < channelCount_; ++i) {\n      auto *data = static_cast<float *>(converterOutputBuffer_.audioBufferList->mBuffers[i].mData);\n      circularBuffer_[i]->push_back(data, outputFrameCount);\n    }\n\n    if (circularBuffer_[0]->getNumberOfAvailableFrames() >= bufferLength_) {\n      emitAudioData();\n    }\n  }\n}\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/utils/IOSRotatingFileWriter.h",
    "content": "#pragma once\n\n#include <audioapi/core/utils/RotatingFileWriter.h>\n#include <audioapi/ios/core/utils/IOSFileWriter.h>\n\n#include <functional>\n#include <memory>\n#include <string>\n#include \"audioapi/utils/AudioFileProperties.h\"\n\nnamespace audioapi {\n\n#ifndef __OBJC__\ntypedef struct objc_object AVAudioFormat;\n#endif\n\nclass IOSRotatingFileWriter : public IOSFileWriter, public RotatingFileWriter {\n public:\n  using WriterFactory =\n      std::function<std::shared_ptr<AudioFileWriter>(const std::shared_ptr<AudioFileProperties> &)>;\n\n  IOSRotatingFileWriter(\n      const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n      const std::shared_ptr<AudioFileProperties> &fileProperties,\n      size_t rotateIntervalBytes,\n      WriterFactory writerFactory,\n      std::function<void(const std::string &)> onSegmentFileOpened = {});\n\n  OpenFileResult openFile(\n      AVAudioFormat *streamFormat,\n      size_t streamMaxBufferSizeInFrames,\n      const std::string &fileNameOverride) override;\n  CloseFileResult closeFile() override;\n  [[nodiscard]] double getCurrentDuration() const override;\n\n  void writeAudioData(AudioDataType data, int numFrames) override;\n\n private:\n  void rotateFiles() override;\n  OpenFileResult openInnerWriter();\n  AVAudioFormat *streamFormat_;\n  size_t streamMaxBufferSizeInFrames_;\n  std::shared_ptr<AudioFileProperties> fileProperties_;\n};\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/core/utils/IOSRotatingFileWriter.mm",
    "content": "#import <AVFoundation/AVFoundation.h>\n#import <Foundation/Foundation.h>\n#include \"audioapi/core/utils/AudioFileWriter.h\"\n#include \"audioapi/core/utils/RotatingFileWriter.h\"\n\n#include <audioapi/events/AudioEventHandlerRegistry.h>\n#include <audioapi/ios/core/utils/IOSFileWriter.h>\n#include <audioapi/ios/core/utils/IOSRotatingFileWriter.h>\n#include <audioapi/utils/AudioFileProperties.h>\n\n#include <memory>\n#include <tuple>\n#include <utility>\n\nnamespace audioapi {\n\nIOSRotatingFileWriter::IOSRotatingFileWriter(\n    const std::shared_ptr<AudioEventHandlerRegistry> &audioEventHandlerRegistry,\n    const std::shared_ptr<AudioFileProperties> &fileProperties,\n    size_t rotateIntervalBytes,\n    WriterFactory writerFactory,\n    std::function<void(const std::string &)> onSegmentFileOpened)\n    : IOSFileWriter(audioEventHandlerRegistry, fileProperties),\n      RotatingFileWriter(\n          rotateIntervalBytes,\n          std::move(writerFactory),\n          std::move(onSegmentFileOpened)),\n      fileProperties_(fileProperties)\n{\n}\n\nOpenFileResult IOSRotatingFileWriter::openFile(\n    AVAudioFormat *streamFormat,\n    size_t streamMaxBufferSizeInFrames,\n    const std::string &fileNameOverride)\n{\n  streamFormat_ = streamFormat;\n  streamMaxBufferSizeInFrames_ = streamMaxBufferSizeInFrames;\n  fileProperties_->fileNamePrefix = !fileNameOverride.empty() ? fileNameOverride : \"recording\";\n  if (currentWriter_ == nullptr) {\n    currentWriter_ = writerFactory_(fileProperties_);\n  }\n\n  return openInnerWriter();\n}\n\nvoid IOSRotatingFileWriter::writeAudioData(AudioDataType data, int numFrames)\n{\n  if (currentWriter_ == nullptr) {\n    return;\n  }\n\n  currentWriter_->writeAudioData(data, numFrames);\n\n  writesSinceLastCheck_++;\n  if (writesSinceLastCheck_ >= FILE_SIZE_CHECK_WRITE_INTERVAL) {\n    writesSinceLastCheck_ = 0;\n    size_t size = currentWriter_->getFileSizeBytes();\n    if (size > rotateIntervalBytes_) {\n      rotateFiles();\n    }\n  }\n  framesWritten_.fetch_add(numFrames, std::memory_order_relaxed);\n}\n\nCloseFileResult IOSRotatingFileWriter::closeFile()\n{\n  return RotatingFileWriter::closeFile();\n}\n\nvoid IOSRotatingFileWriter::rotateFiles()\n{\n  RotatingFileWriter::rotateFiles();\n  openInnerWriter();\n}\n\ndouble IOSRotatingFileWriter::getCurrentDuration() const\n{\n  return static_cast<double>(framesWritten_.load(std::memory_order_relaxed)) /\n      fileProperties_->sampleRate;\n}\n\nOpenFileResult IOSRotatingFileWriter::openInnerWriter()\n{\n  auto inner = std::static_pointer_cast<IOSFileWriter>(currentWriter_);\n  auto result = inner->openFile(streamFormat_, streamMaxBufferSizeInFrames_, \"\");\n  if (result.is_ok() && onSegmentFileOpened_ && currentWriter_ != nullptr) {\n    onSegmentFileOpened_(currentWriter_->getFilePath());\n  }\n  return result;\n}\n\n} // namespace audioapi\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/system/AudioEngine.h",
    "content": "#pragma once\n\n#import <AVFoundation/AVFoundation.h>\n#import <Foundation/Foundation.h>\n\n@class AudioSessionManager;\n\ntypedef NS_ENUM(NSInteger, AudioEngineState) {\n  AudioEngineStateIdle = 0,\n  AudioEngineStateRunning,\n  AudioEngineStatePaused,\n  AudioEngineStateInterrupted\n};\n\n@interface AudioEngine : NSObject\n\n@property (nonatomic, assign) AudioEngineState state;\n@property (nonatomic, strong) AVAudioEngine *audioEngine;\n@property (nonatomic, strong) NSMutableDictionary *sourceNodes;\n@property (nonatomic, strong) NSMutableDictionary *sourceFormats;\n@property (nonatomic, strong) AVAudioSinkNode *inputNode;\n@property (nonatomic, weak) AudioSessionManager *sessionManager;\n@property (nonatomic, assign) BOOL graphNeedsRebuild;\n@property (nonatomic, assign) BOOL sessionDeactivationInvalidatedGraph;\n\n- (instancetype)init;\n+ (instancetype)sharedInstance;\n\n- (void)cleanup;\n\n- (NSString *)attachSourceNodeWithRenderBlock:(AVAudioSourceNodeRenderBlock)renderBlock\n                                   sampleRate:(float)sampleRate\n                                 channelCount:(AVAudioChannelCount)channelCount;\n- (void)detachSourceNodeWithId:(NSString *)sourceNodeId;\n\n- (void)attachInputNodeWithReceiverBlock:(AVAudioSinkNodeReceiverBlock)receiverBlock;\n- (void)detachInputNode;\n- (AVAudioFormat *)getLiveInputFormat;\n\n- (void)onInterruptionBegin;\n- (void)onInterruptionEnd:(bool)shouldResume;\n- (void)onSessionDeactivated;\n\n- (AudioEngineState)getState;\n- (bool)isEngineRunning;\n\n- (bool)startIfNecessary;\n- (void)pauseIfNecessary;\n- (void)stopIfNecessary;\n\n- (void)stopIfPossible;\n\n- (void)restartAudioEngine;\n\n- (void)logAudioEngineState;\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/system/AudioEngine.mm",
    "content": "#import <audioapi/ios/system/AudioEngine.h>\n#import <audioapi/ios/system/AudioSessionManager.h>\n\n@interface AudioEngineSourceRegistration : NSObject\n\n@property (nonatomic, copy) AVAudioSourceNodeRenderBlock renderBlock;\n@property (nonatomic, assign) float sampleRate;\n@property (nonatomic, assign) AVAudioChannelCount channelCount;\n\n@end\n\n@implementation AudioEngineSourceRegistration\n@end\n\n@interface AudioEngineInputRegistration : NSObject\n\n@property (nonatomic, copy) AVAudioSinkNodeReceiverBlock receiverBlock;\n\n@end\n\n@implementation AudioEngineInputRegistration\n@end\n\n@interface AudioEngine ()\n\n@property (nonatomic, strong)\n    NSMutableDictionary<NSString *, AudioEngineSourceRegistration *> *sourceRegistrations;\n@property (nonatomic, strong) AudioEngineInputRegistration *inputRegistration;\n\n- (void)createAudioEngineIfNeeded;\n- (void)destroyAudioEnginePreservingSessionDeactivationState:(BOOL)preserveSessionDeactivationState;\n- (BOOL)hasTrackedGraph;\n- (AVAudioFormat *)currentInputConnectionFormat;\n- (void)materializeSourceNodeWithId:(NSString *)sourceNodeId;\n- (BOOL)materializeInputNodeIfNeeded;\n- (void)materializeTrackedNodesIfNeeded;\n\n@end\n\n@implementation AudioEngine\n\nstatic AudioEngine *_sharedInstance = nil;\n\n- (void)createAudioEngineIfNeeded\n{\n  if (self.audioEngine != nil) {\n    return;\n  }\n\n  self.audioEngine = [[AVAudioEngine alloc] init];\n}\n\n- (void)destroyAudioEngine\n{\n  [self destroyAudioEnginePreservingSessionDeactivationState:NO];\n}\n\n- (BOOL)hasTrackedGraph\n{\n  return [self.sourceRegistrations count] > 0 || self.inputRegistration != nil;\n}\n\n- (void)destroyAudioEnginePreservingSessionDeactivationState:(BOOL)preserveSessionDeactivationState\n{\n  BOOL hadGraph = [self hasTrackedGraph];\n\n  if (self.audioEngine != nil) {\n    if ([self.audioEngine isRunning]) {\n      [self.audioEngine stop];\n    }\n\n    [self.audioEngine reset];\n  }\n\n  self.audioEngine = nil;\n  self.sourceNodes = [[NSMutableDictionary alloc] init];\n  self.sourceFormats = [[NSMutableDictionary alloc] init];\n  self.inputNode = nil;\n  self.graphNeedsRebuild = hadGraph;\n\n  if (!preserveSessionDeactivationState) {\n    self.sessionDeactivationInvalidatedGraph = false;\n  }\n}\n\n+ (instancetype)sharedInstance\n{\n  return _sharedInstance;\n}\n\n- (instancetype)init\n{\n  if (self = [super init]) {\n    self.state = AudioEngineState::AudioEngineStateIdle;\n    self.audioEngine = nil;\n    self.inputNode = nil;\n    self.graphNeedsRebuild = false;\n    self.sessionDeactivationInvalidatedGraph = false;\n\n    self.sourceRegistrations = [[NSMutableDictionary alloc] init];\n    self.sourceNodes = [[NSMutableDictionary alloc] init];\n    self.sourceFormats = [[NSMutableDictionary alloc] init];\n    self.inputRegistration = nil;\n\n    self.sessionManager = [AudioSessionManager sharedInstance];\n    [self createAudioEngineIfNeeded];\n  }\n\n  _sharedInstance = self;\n  return self;\n}\n\n- (void)cleanup\n{\n  [self destroyAudioEngine];\n  self.state = AudioEngineState::AudioEngineStateIdle;\n  self.sourceRegistrations = nil;\n  self.sourceNodes = nil;\n  self.sourceFormats = nil;\n  self.inputRegistration = nil;\n  self.inputNode = nil;\n  self.graphNeedsRebuild = false;\n  self.sessionDeactivationInvalidatedGraph = false;\n\n  [self.sessionManager setActive:false error:nil];\n  self.sessionManager = nil;\n}\n\n- (void)materializeSourceNodeWithId:(NSString *)sourceNodeId\n{\n  AudioEngineSourceRegistration *registration = self.sourceRegistrations[sourceNodeId];\n\n  if (registration == nil || self.audioEngine == nil || self.sourceNodes[sourceNodeId] != nil) {\n    return;\n  }\n\n  AVAudioFormat *format =\n      [[AVAudioFormat alloc] initStandardFormatWithSampleRate:registration.sampleRate\n                                                     channels:registration.channelCount];\n  AVAudioSourceNode *sourceNode =\n      [[AVAudioSourceNode alloc] initWithFormat:format renderBlock:registration.renderBlock];\n\n  self.sourceNodes[sourceNodeId] = sourceNode;\n  self.sourceFormats[sourceNodeId] = format;\n\n  [self.audioEngine attachNode:sourceNode];\n  [self.audioEngine connect:sourceNode to:self.audioEngine.mainMixerNode format:format];\n}\n\n- (AVAudioFormat *)currentInputConnectionFormat\n{\n  AVAudioFormat *inputFormat = [self getLiveInputFormat];\n\n  if (inputFormat == nil || inputFormat.sampleRate <= 0 || inputFormat.channelCount == 0) {\n    return nil;\n  }\n\n  return inputFormat;\n}\n\n- (BOOL)materializeInputNodeIfNeeded\n{\n  if (self.inputRegistration == nil) {\n    return YES;\n  }\n\n  if (self.audioEngine == nil) {\n    return NO;\n  }\n\n  if (self.inputNode != nil) {\n    return YES;\n  }\n\n  AVAudioFormat *inputFormat = [self currentInputConnectionFormat];\n\n  if (inputFormat == nil) {\n    return NO;\n  }\n\n  self.inputNode =\n      [[AVAudioSinkNode alloc] initWithReceiverBlock:self.inputRegistration.receiverBlock];\n  [self.audioEngine attachNode:self.inputNode];\n  [self.audioEngine connect:self.audioEngine.inputNode to:self.inputNode format:inputFormat];\n  return YES;\n}\n\n- (void)materializeTrackedNodesIfNeeded\n{\n  NSArray<NSString *> *sourceNodeIds =\n      [[self.sourceRegistrations allKeys] sortedArrayUsingSelector:@selector(compare:)];\n  for (NSString *sourceNodeId in sourceNodeIds) {\n    [self materializeSourceNodeWithId:sourceNodeId];\n  }\n\n  [self materializeInputNodeIfNeeded];\n}\n\n- (NSString *)attachSourceNodeWithRenderBlock:(AVAudioSourceNodeRenderBlock)renderBlock\n                                   sampleRate:(float)sampleRate\n                                 channelCount:(AVAudioChannelCount)channelCount\n{\n  [self createAudioEngineIfNeeded];\n\n  NSString *sourceNodeId = [[NSUUID UUID] UUIDString];\n  AudioEngineSourceRegistration *registration = [[AudioEngineSourceRegistration alloc] init];\n  registration.renderBlock = renderBlock;\n  registration.sampleRate = sampleRate;\n  registration.channelCount = channelCount;\n\n  self.sourceRegistrations[sourceNodeId] = registration;\n  [self materializeSourceNodeWithId:sourceNodeId];\n\n  return sourceNodeId;\n}\n\n- (void)detachSourceNodeWithId:(NSString *)sourceNodeId\n{\n  AVAudioSourceNode *sourceNode = self.sourceNodes[sourceNodeId];\n\n  if (self.sourceRegistrations[sourceNodeId] == nil) {\n    NSLog(@\"[AudioEngine] No source node found with ID: %@\", sourceNodeId);\n    return;\n  }\n\n  if (sourceNode != nil && self.audioEngine != nil) {\n    [self.audioEngine detachNode:sourceNode];\n  }\n\n  [self.sourceRegistrations removeObjectForKey:sourceNodeId];\n  [self.sourceNodes removeObjectForKey:sourceNodeId];\n  [self.sourceFormats removeObjectForKey:sourceNodeId];\n\n  if (![self hasTrackedGraph]) {\n    self.graphNeedsRebuild = false;\n  }\n}\n\n- (void)attachInputNodeWithReceiverBlock:(AVAudioSinkNodeReceiverBlock)receiverBlock\n{\n  [self createAudioEngineIfNeeded];\n\n  if (self.inputRegistration != nil || self.inputNode != nil) {\n    [self detachInputNode];\n  }\n\n  AudioEngineInputRegistration *registration = [[AudioEngineInputRegistration alloc] init];\n  registration.receiverBlock = receiverBlock;\n  self.inputRegistration = registration;\n\n  [self materializeInputNodeIfNeeded];\n}\n\n- (void)detachInputNode\n{\n  if (self.inputRegistration == nil && self.inputNode == nil) {\n    return;\n  }\n\n  if (self.inputNode != nil && self.audioEngine != nil) {\n    [self.audioEngine detachNode:self.inputNode];\n  }\n\n  self.inputRegistration = nil;\n  self.inputNode = nil;\n\n  if (![self hasTrackedGraph]) {\n    self.graphNeedsRebuild = false;\n  }\n}\n\n- (AVAudioFormat *)getLiveInputFormat\n{\n  if (self.audioEngine == nil) {\n    return nil;\n  }\n\n  AVAudioInputNode *engineInputNode = self.audioEngine.inputNode;\n\n  if (engineInputNode == nil) {\n    return nil;\n  }\n\n  AVAudioFormat *inputFormat = [engineInputNode outputFormatForBus:0];\n\n  if (inputFormat == nil || inputFormat.sampleRate <= 0 || inputFormat.channelCount == 0) {\n    return nil;\n  }\n\n  return inputFormat;\n}\n\n- (void)onInterruptionBegin\n{\n  if (self.state != AudioEngineState::AudioEngineStateRunning) {\n    return;\n  }\n\n  self.state = AudioEngineState::AudioEngineStateInterrupted;\n}\n\n- (void)onSessionDeactivated\n{\n  BOOL hadTrackedGraph = [self hasTrackedGraph];\n  BOOL hadActiveState = self.state != AudioEngineState::AudioEngineStateIdle;\n\n  if (!hadActiveState && !hadTrackedGraph) {\n    return;\n  }\n\n  self.sessionDeactivationInvalidatedGraph = true;\n\n  if (hadTrackedGraph) {\n    self.graphNeedsRebuild = true;\n  }\n\n  if (self.audioEngine != nil && ![self.audioEngine isRunning]) {\n    self.state = AudioEngineState::AudioEngineStatePaused;\n    return;\n  }\n\n  if (self.audioEngine != nil) {\n    [self.audioEngine pause];\n  }\n\n  self.state = AudioEngineState::AudioEngineStatePaused;\n}\n\n- (void)onInterruptionEnd:(bool)shouldResume\n{\n  NSError *error = nil;\n\n  if (self.state != AudioEngineState::AudioEngineStateInterrupted) {\n    return;\n  }\n\n  [self stopIfNecessary];\n  [self rebuildAudioEngine];\n\n  if (!shouldResume) {\n    self.state = AudioEngineState::AudioEngineStatePaused;\n    return;\n  }\n\n  [self.audioEngine prepare];\n  [self.audioEngine startAndReturnError:&error];\n\n  if (error != nil) {\n    NSLog(\n        @\"Error while restarting the audio engine after interruption: %@\",\n        [error debugDescription]);\n    self.state = AudioEngineState::AudioEngineStateIdle;\n    return;\n  }\n\n  self.state = AudioEngineState::AudioEngineStateRunning;\n  self.sessionDeactivationInvalidatedGraph = false;\n}\n\n- (AudioEngineState)getState\n{\n  return self.state;\n}\n\n- (bool)isEngineRunning\n{\n  return self.audioEngine != nil && [self.audioEngine isRunning];\n}\n\n- (void)rebuildAudioEngine\n{\n  [self destroyAudioEnginePreservingSessionDeactivationState:YES];\n  [self createAudioEngineIfNeeded];\n\n  [self materializeTrackedNodesIfNeeded];\n  self.graphNeedsRebuild = false;\n}\n\n- (bool)startEngine\n{\n  NSError *error = nil;\n\n  if ([self isEngineRunning] && self.state == AudioEngineState::AudioEngineStateRunning) {\n    return true;\n  }\n\n  [self createAudioEngineIfNeeded];\n\n  if (![self.sessionManager ensureActive:true error:&error]) {\n    NSLog(@\"Error while activating audio session: %@\", [error debugDescription]);\n    return false;\n  }\n\n  if (self.state == AudioEngineState::AudioEngineStateInterrupted || self.graphNeedsRebuild ||\n      self.sessionDeactivationInvalidatedGraph) {\n    [self restartAudioEngine];\n  } else {\n    [self materializeTrackedNodesIfNeeded];\n  }\n\n  if (self.inputRegistration != nil && self.inputNode == nil) {\n    NSLog(@\"Error while materializing the audio input node: missing live input format\");\n    return false;\n  }\n\n  [self.audioEngine prepare];\n  [self.audioEngine startAndReturnError:&error];\n\n  if (error != nil) {\n    NSLog(@\"Error while starting the audio engine: %@\", [error debugDescription]);\n    return false;\n  }\n\n  self.state = AudioEngineState::AudioEngineStateRunning;\n  self.sessionDeactivationInvalidatedGraph = false;\n  return true;\n}\n\n- (void)stopEngine\n{\n  if (self.state == AudioEngineState::AudioEngineStateIdle) {\n    return;\n  }\n\n  if (self.audioEngine != nil && [self.audioEngine isRunning]) {\n    [self.audioEngine stop];\n  }\n\n  self.state = AudioEngineState::AudioEngineStateIdle;\n}\n\n- (bool)startIfNecessary\n{\n  if (self.state == AudioEngineState::AudioEngineStateRunning && [self isEngineRunning]) {\n    return true;\n  }\n\n  if ([self hasTrackedGraph]) {\n    return [self startEngine];\n  }\n\n  return false;\n}\n\n- (void)pauseIfNecessary\n{\n  if (self.state == AudioEngineState::AudioEngineStatePaused) {\n    return;\n  }\n\n  if (self.audioEngine != nil) {\n    [self.audioEngine pause];\n  }\n\n  self.state = AudioEngineState::AudioEngineStatePaused;\n}\n\n- (void)stopIfNecessary\n{\n  if (self.state == AudioEngineState::AudioEngineStateIdle) {\n    return;\n  }\n\n  [self stopEngine];\n}\n\n- (void)stopIfPossible\n{\n  BOOL hasInput = self.inputRegistration != nil;\n  BOOL hasSources = [self.sourceRegistrations count] > 0;\n\n  if (hasInput || hasSources) {\n    return;\n  }\n\n  if (self.state != AudioEngineState::AudioEngineStateIdle) {\n    [self stopEngine];\n  }\n}\n\n- (void)restartAudioEngine\n{\n  if ([self.audioEngine isRunning]) {\n    [self.audioEngine stop];\n  }\n\n  [self rebuildAudioEngine];\n  if (self.state == AudioEngineState::AudioEngineStateRunning) {\n    [self startEngine];\n  }\n}\n\n- (void)logAudioEngineState\n{\n  AVAudioSession *session = [AVAudioSession sharedInstance];\n\n  NSLog(@\"================ 🎧 AVAudioEngine STATE ================\");\n\n  NSLog(@\"➡️ engine.isRunning: %@\", self.audioEngine.isRunning ? @\"true\" : @\"false\");\n  NSLog(\n      @\"➡️ engine.isInManualRenderingMode: %@\",\n      self.audioEngine.isInManualRenderingMode ? @\"true\" : @\"false\");\n\n  NSLog(@\"🎚️ Session category: %@\", session.category);\n  NSLog(@\"🎚️ Session mode: %@\", session.mode);\n  NSLog(@\"🎚️ Session sampleRate: %f Hz\", session.sampleRate);\n  NSLog(@\"🎚️ Session IO buffer duration: %f s\", session.IOBufferDuration);\n\n  AVAudioSessionRouteDescription *route = session.currentRoute;\n\n  NSLog(@\"🔊 Current audio route outputs:\");\n  for (AVAudioSessionPortDescription *output in route.outputs) {\n    NSLog(@\"  Output: %@ (%@)\", output.portType, output.portName);\n  }\n\n  NSLog(@\"🎤 Current audio route inputs:\");\n  for (AVAudioSessionPortDescription *input in route.inputs) {\n    NSLog(@\"  Input: %@ (%@)\", input.portType, input.portName);\n  }\n\n  AVAudioFormat *format = [self.audioEngine.outputNode inputFormatForBus:0];\n  NSLog(@\"📐 Engine output format: %.0f Hz, %u channels\", format.sampleRate, format.channelCount);\n\n  NSLog(@\"=======================================================\");\n}\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/system/AudioSessionManager.h",
    "content": "#pragma once\n\n#import <AVFoundation/AVFoundation.h>\n#import <Foundation/Foundation.h>\n#import <React/RCTBridgeModule.h>\n\n@interface AudioSessionManager : NSObject\n\n@property (nonatomic, weak) AVAudioSession *audioSession;\n\n// State tracking\n@property (nonatomic, assign) bool isActive;\n@property (nonatomic, assign) bool shouldManageSession;\n\n// Session configuration options (desired by user)\n@property (nonatomic, assign) AVAudioSessionMode desiredMode;\n@property (nonatomic, assign) AVAudioSessionCategory desiredCategory;\n@property (nonatomic, assign) AVAudioSessionCategoryOptions desiredOptions;\n@property (nonatomic, assign) bool allowHapticsAndSounds;\n@property (nonatomic, assign) bool notifyOthersOnDeactivation;\n\n- (instancetype)init;\n+ (instancetype)sharedInstance;\n\n- (void)cleanup;\n\n- (void)setAudioSessionOptions:(NSString *)category\n                          mode:(NSString *)mode\n                       options:(NSArray *)options\n                  allowHaptics:(BOOL)allowHaptics\n    notifyOthersOnDeactivation:(BOOL)notifyOthersOnDeactivation;\n\n- (bool)configureAudioSession;\n/// Ensures the library-managed session is active. In external owner mode this is a no-op.\n- (bool)ensureActive:(bool)force error:(NSError **)error;\n- (bool)setActive:(bool)active error:(NSError **)error;\n/// Drops the cached active-state flag without reclaiming external ownership.\n- (void)markInactive;\n/// Switches the manager into external owner mode and stops all session mutations.\n- (void)disableSessionManagement;\n\n- (NSNumber *)getDevicePreferredSampleRate;\n- (NSString *)inputDiagnosticsSnapshot;\n\n- (void)requestRecordingPermissions:(RCTPromiseResolveBlock)resolve\n                             reject:(RCTPromiseRejectBlock)reject;\n- (NSString *)requestRecordingPermissions;\n\n- (void)checkRecordingPermissions:(RCTPromiseResolveBlock)resolve\n                           reject:(RCTPromiseRejectBlock)reject;\n- (NSString *)checkRecordingPermissions;\n\n- (void)getDevicesInfo:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject;\n- (NSArray<NSDictionary *> *)parseDeviceList:(NSArray<AVAudioSessionPortDescription *> *)devices;\n- (void)setInputDevice:(NSString *)deviceId\n               resolve:(RCTPromiseResolveBlock)resolve\n                reject:(RCTPromiseRejectBlock)reject;\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/system/AudioSessionManager.mm",
    "content": "#import <AVFAudio/AVFAudio.h>\n#import <audioapi/ios/system/AudioEngine.h>\n#import <audioapi/ios/system/AudioSessionManager.h>\n\n@interface AudioSessionManager ()\n\n- (id)microphoneUsageDescriptionValue;\n- (bool)usesAudioApplicationRecordPermissionAPI;\n- (void)requestSystemRecordPermission:(void (^)(BOOL granted))completion;\n- (NSInteger)currentRecordPermissionStatus;\n- (NSString *)recordPermissionStatusString:(NSInteger)status;\n- (NSString *)formatPorts:(NSArray<AVAudioSessionPortDescription *> *)ports;\n\n@end\n\n@implementation AudioSessionManager\n\nstatic AudioSessionManager *_sharedInstance = nil;\n\n- (instancetype)init\n{\n  if (self = [super init]) {\n    self.audioSession = [AVAudioSession sharedInstance];\n\n    self.isActive = false;\n    self.shouldManageSession = true;\n\n    self.desiredCategory = AVAudioSessionCategoryPlayback;\n    self.desiredMode = AVAudioSessionModeDefault;\n    self.desiredOptions = 0;\n    self.allowHapticsAndSounds = false;\n    self.notifyOthersOnDeactivation = true;\n  }\n\n  _sharedInstance = self;\n  return self;\n}\n\n+ (instancetype)sharedInstance\n{\n  return _sharedInstance;\n}\n\n- (void)cleanup\n{\n  self.audioSession = nil;\n}\n\n- (bool)areDesiredOptionsSet\n{\n  return (\n      self.audioSession.category == self.desiredCategory &&\n      self.audioSession.mode == self.desiredMode &&\n      self.audioSession.categoryOptions == self.desiredOptions &&\n      self.audioSession.allowHapticsAndSystemSoundsDuringRecording == self.allowHapticsAndSounds);\n}\n\n- (bool)configureAudioSession\n{\n  NSError *error = nil;\n\n  if (!self.shouldManageSession || [self areDesiredOptionsSet]) {\n    return true;\n  }\n\n  [self.audioSession setCategory:self.desiredCategory\n                            mode:self.desiredMode\n                         options:self.desiredOptions\n                           error:&error];\n\n  if (error != nil) {\n    NSLog(@\"Error while configuring audio session: %@\", [error debugDescription]);\n    return false;\n  } else {\n    NSLog(\n        @\"[AudioSessionManager] Configured audio session: category=%@, mode=%@, options=%lu\",\n        self.audioSession.category,\n        self.audioSession.mode,\n        (unsigned long)self.audioSession.categoryOptions);\n  }\n\n  if (@available(iOS 13.0, *)) {\n    if (self.audioSession.allowHapticsAndSystemSoundsDuringRecording !=\n        self.allowHapticsAndSounds) {\n      [self.audioSession setAllowHapticsAndSystemSoundsDuringRecording:self.allowHapticsAndSounds\n                                                                 error:&error];\n\n      if (error != nil) {\n        NSLog(\n            @\"Error while setting allowHapticsAndSystemSoundsDuringRecording: %@\",\n            [error debugDescription]);\n        return false;\n      }\n    }\n  }\n\n  return true;\n}\n\n- (void)setAudioSessionOptions:(NSString *)categoryStr\n                          mode:(NSString *)modeStr\n                       options:(NSArray *)optionsArray\n                  allowHaptics:(BOOL)allowHaptics\n    notifyOthersOnDeactivation:(BOOL)notifyOthersOnDeactivation\n{\n  AVAudioSessionCategory category = [self categoryFromString:categoryStr];\n  AVAudioSessionMode mode = [self modeFromString:modeStr];\n  AVAudioSessionCategoryOptions options = [self optionsFromArray:optionsArray];\n  bool configChanged = false;\n\n  if (category != self.desiredCategory || mode != self.desiredMode ||\n      options != self.desiredOptions || allowHaptics != self.allowHapticsAndSounds) {\n    configChanged = true;\n  }\n\n  if (configChanged) {\n    AudioEngine *audioEngine = [AudioEngine sharedInstance];\n    audioEngine.sessionDeactivationInvalidatedGraph = YES;\n  }\n\n  self.desiredCategory = category;\n  self.desiredMode = mode;\n  self.desiredOptions = options;\n  self.allowHapticsAndSounds = allowHaptics;\n  self.notifyOthersOnDeactivation = notifyOthersOnDeactivation;\n\n  if (configChanged && self.isActive) {\n    [self configureAudioSession];\n  }\n}\n\n- (bool)setActive:(bool)active error:(NSError **)error\n{\n  if (active) {\n    return [self ensureActive:false error:error];\n  }\n\n  if (!self.shouldManageSession) {\n    return true;\n  }\n\n  if (!self.isActive) {\n    return true;\n  }\n\n  AVAudioSessionSetActiveOptions options = active\n      ? 0\n      : (self.notifyOthersOnDeactivation ? AVAudioSessionSetActiveOptionNotifyOthersOnDeactivation\n                                         : 0);\n  bool success = [self.audioSession setActive:active withOptions:options error:error];\n\n  if (success) {\n    self.isActive = active;\n  }\n\n  return success;\n}\n\n- (bool)ensureActive:(bool)force error:(NSError **)error\n{\n  return [self activateSessionIfNeeded:force error:error];\n}\n\n- (bool)activateSessionIfNeeded:(bool)force error:(NSError **)error\n{\n  if (!self.shouldManageSession) {\n    return true;\n  }\n\n  if (self.isActive && !force) {\n    return true;\n  }\n\n  if (![self configureAudioSession]) {\n    return false;\n  }\n\n  bool success = [self.audioSession setActive:true withOptions:0 error:error];\n\n  if (success) {\n    self.isActive = true;\n  }\n\n  return success;\n}\n\n- (void)markInactive\n{\n  // AVAudioSession does not expose a reliable active-state query, so drop our cached flag and\n  // force the next audio operation to re-assert activation.\n  self.isActive = false;\n}\n\n- (void)disableSessionManagement\n{\n  self.shouldManageSession = false;\n}\n\n- (NSNumber *)getDevicePreferredSampleRate\n{\n  return [NSNumber numberWithFloat:[self.audioSession sampleRate]];\n}\n\n- (NSString *)inputDiagnosticsSnapshot\n{\n  AVAudioSessionRouteDescription *route = [self.audioSession currentRoute];\n  NSArray<AVAudioSessionPortDescription *> *inputs = route != nil ? route.inputs : @[];\n  NSArray<AVAudioSessionPortDescription *> *outputs = route != nil ? route.outputs : @[];\n\n  return [NSString stringWithFormat:\n                       @\"session={active=%@, shouldManage=%@, category=%@, mode=%@, options=%lu, \"\n                       @\"sampleRate=%f, inputChannels=%lu}; route={inputs=%@, outputs=%@}\",\n                       self.isActive ? @\"true\" : @\"false\",\n                       self.shouldManageSession ? @\"true\" : @\"false\",\n                       self.audioSession.category ?: @\"(null)\",\n                       self.audioSession.mode ?: @\"(null)\",\n                       (unsigned long)self.audioSession.categoryOptions,\n                       self.audioSession.sampleRate,\n                       (unsigned long)self.audioSession.inputNumberOfChannels,\n                       [self formatPorts:inputs],\n                       [self formatPorts:outputs]];\n}\n\n- (id)microphoneUsageDescriptionValue\n{\n  return [[NSBundle mainBundle] objectForInfoDictionaryKey:@\"NSMicrophoneUsageDescription\"];\n}\n\n- (bool)usesAudioApplicationRecordPermissionAPI\n{\n#if TARGET_OS_SIMULATOR\n  return false;\n#else\n  if (@available(iOS 17.0, *)) {\n    return true;\n  }\n\n  return false;\n#endif\n}\n\n- (void)requestSystemRecordPermission:(void (^)(BOOL granted))completion\n{\n  if ([self usesAudioApplicationRecordPermissionAPI]) {\n    if (@available(iOS 17.0, *)) {\n      [AVAudioApplication requestRecordPermissionWithCompletionHandler:completion];\n      return;\n    }\n  }\n\n  [self.audioSession requestRecordPermission:completion];\n}\n\n- (NSInteger)currentRecordPermissionStatus\n{\n  if ([self usesAudioApplicationRecordPermissionAPI]) {\n    if (@available(iOS 17.0, *)) {\n      return [[AVAudioApplication sharedInstance] recordPermission];\n    }\n  }\n\n  return [self.audioSession recordPermission];\n}\n\n- (NSString *)recordPermissionStatusString:(NSInteger)status\n{\n  if ([self usesAudioApplicationRecordPermissionAPI]) {\n    switch (status) {\n      case AVAudioApplicationRecordPermissionUndetermined:\n        return @\"Undetermined\";\n      case AVAudioApplicationRecordPermissionGranted:\n        return @\"Granted\";\n      case AVAudioApplicationRecordPermissionDenied:\n        return @\"Denied\";\n      default:\n        return @\"Undetermined\";\n    }\n  }\n\n  switch (status) {\n    case AVAudioSessionRecordPermissionUndetermined:\n      return @\"Undetermined\";\n    case AVAudioSessionRecordPermissionGranted:\n      return @\"Granted\";\n    case AVAudioSessionRecordPermissionDenied:\n      return @\"Denied\";\n    default:\n      return @\"Undetermined\";\n  }\n}\n\n- (NSString *)formatPorts:(NSArray<AVAudioSessionPortDescription *> *)ports\n{\n  if (ports.count == 0) {\n    return @\"[]\";\n  }\n\n  NSMutableArray<NSString *> *formattedPorts =\n      [[NSMutableArray alloc] initWithCapacity:ports.count];\n\n  for (AVAudioSessionPortDescription *port in ports) {\n    [formattedPorts addObject:[NSString stringWithFormat:@\"%@(%@,%@)\",\n                                                         port.portName ?: @\"unknown\",\n                                                         port.portType ?: @\"unknown\",\n                                                         port.UID ?: @\"unknown\"]];\n  }\n\n  return [NSString stringWithFormat:@\"[%@]\", [formattedPorts componentsJoinedByString:@\", \"]];\n}\n\n- (void)requestRecordingPermissions:(RCTPromiseResolveBlock)resolve\n                             reject:(RCTPromiseRejectBlock)reject\n{\n  id value = [self microphoneUsageDescriptionValue];\n  // if there is no entry NSMicrophoneUsageDescription calling\n  // requestRecordPermission will quit an app\n  if (value == nil) {\n    reject(\n        nil,\n        @\"There is no NSMicrophoneUsageDescription entry in info.plist file. App cannot access microphone without it.\",\n        nil);\n    return;\n  }\n\n  resolve([self requestRecordingPermissions]);\n}\n\n- (NSString *)requestRecordingPermissions\n{\n  id value = [self microphoneUsageDescriptionValue];\n\n  if (value == nil) {\n    return @\"Denied\";\n  }\n\n  __block NSString *result = @\"Denied\";\n  dispatch_semaphore_t sem = dispatch_semaphore_create(0);\n\n  [self requestSystemRecordPermission:^(BOOL granted) {\n    result = granted ? @\"Granted\" : @\"Denied\";\n    dispatch_semaphore_signal(sem);\n  }];\n\n  dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);\n  return result;\n}\n\n- (void)checkRecordingPermissions:(RCTPromiseResolveBlock)resolve\n                           reject:(RCTPromiseRejectBlock)reject\n{\n  resolve([self checkRecordingPermissions]);\n}\n\n- (NSString *)checkRecordingPermissions\n{\n  return [self recordPermissionStatusString:[self currentRecordPermissionStatus]];\n}\n\n- (void)getDevicesInfo:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject\n{\n  NSMutableDictionary *devicesInfo = [[NSMutableDictionary alloc] init];\n\n  [devicesInfo setValue:[self parseDeviceList:[self.audioSession availableInputs]]\n                 forKey:@\"availableInputs\"];\n  [devicesInfo setValue:[self parseDeviceList:[[self.audioSession currentRoute] inputs]]\n                 forKey:@\"currentInputs\"];\n  [devicesInfo setValue:[self parseDeviceList:[[self.audioSession currentRoute] outputs]]\n                 forKey:@\"availableOutputs\"];\n  [devicesInfo setValue:[self parseDeviceList:[[self.audioSession currentRoute] outputs]]\n                 forKey:@\"currentOutputs\"];\n\n  resolve(devicesInfo);\n}\n\n- (NSArray<NSDictionary *> *)parseDeviceList:(NSArray<AVAudioSessionPortDescription *> *)devices\n{\n  NSMutableArray<NSDictionary *> *deviceList = [[NSMutableArray alloc] init];\n\n  for (AVAudioSessionPortDescription *device in devices) {\n    [deviceList addObject:@{\n      @\"name\" : device.portName,\n      @\"category\" : device.portType,\n      @\"id\" : device.UID,\n    }];\n  }\n\n  return deviceList;\n}\n\n- (void)setInputDevice:(NSString *)deviceId\n               resolve:(RCTPromiseResolveBlock)resolve\n                reject:(RCTPromiseRejectBlock)reject\n{\n  NSError *error = nil;\n  NSArray<AVAudioSessionPortDescription *> *availableInputs = [self.audioSession availableInputs];\n\n  AVAudioSessionPortDescription *selectedInput = nil;\n\n  for (AVAudioSessionPortDescription *input in availableInputs) {\n    if ([input.UID isEqualToString:deviceId]) {\n      selectedInput = input;\n      break;\n    }\n  }\n\n  if (selectedInput == nil) {\n    reject(nil, [NSString stringWithFormat:@\"Input device with id %@ not found\", deviceId], nil);\n    return;\n  }\n\n  [self.audioSession setPreferredInput:selectedInput error:&error];\n\n  if (error != nil) {\n    reject(\n        nil,\n        [NSString\n            stringWithFormat:@\"Error while setting preferred input: %@\", [error debugDescription]],\n        error);\n    return;\n  }\n\n  resolve(@(true));\n}\n\n- (AVAudioSessionCategory)categoryFromString:(NSString *)categorySTR\n{\n  AVAudioSessionCategory category = 0;\n\n  if ([categorySTR isEqualToString:@\"ambient\"]) {\n    category = AVAudioSessionCategoryAmbient;\n  } else if ([categorySTR isEqualToString:@\"multiRoute\"]) {\n    category = AVAudioSessionCategoryMultiRoute;\n  } else if ([categorySTR isEqualToString:@\"playAndRecord\"]) {\n    category = AVAudioSessionCategoryPlayAndRecord;\n  } else if ([categorySTR isEqualToString:@\"playback\"]) {\n    category = AVAudioSessionCategoryPlayback;\n  } else if ([categorySTR isEqualToString:@\"record\"]) {\n    category = AVAudioSessionCategoryRecord;\n  } else if ([categorySTR isEqualToString:@\"soloAmbient\"]) {\n    category = AVAudioSessionCategorySoloAmbient;\n  }\n\n  return category;\n}\n\n- (AVAudioSessionMode)modeFromString:(NSString *)modeSTR\n{\n  AVAudioSessionMode mode = 0;\n\n  if ([modeSTR isEqualToString:@\"default\"]) {\n    mode = AVAudioSessionModeDefault;\n  } else if ([modeSTR isEqualToString:@\"dualRoute\"]) {\n    if (@available(iOS 26.2, *)) {\n      mode = AVAudioSessionModeDualRoute;\n    } else {\n      mode = AVAudioSessionModeDefault;\n    }\n  } else if ([modeSTR isEqualToString:@\"gameChat\"]) {\n    mode = AVAudioSessionModeGameChat;\n  } else if ([modeSTR isEqualToString:@\"measurement\"]) {\n    mode = AVAudioSessionModeMeasurement;\n  } else if ([modeSTR isEqualToString:@\"moviePlayback\"]) {\n    mode = AVAudioSessionModeMoviePlayback;\n  } else if ([modeSTR isEqualToString:@\"shortFormVideo\"]) {\n    if (@available(iOS 26, *)) {\n      mode = AVAudioSessionModeShortFormVideo;\n    } else {\n      mode = AVAudioSessionModeDefault;\n    }\n  } else if ([modeSTR isEqualToString:@\"spokenAudio\"]) {\n    mode = AVAudioSessionModeSpokenAudio;\n  } else if ([modeSTR isEqualToString:@\"videoChat\"]) {\n    mode = AVAudioSessionModeVideoChat;\n  } else if ([modeSTR isEqualToString:@\"videoRecording\"]) {\n    mode = AVAudioSessionModeVideoRecording;\n  } else if ([modeSTR isEqualToString:@\"voiceChat\"]) {\n    mode = AVAudioSessionModeVoiceChat;\n  } else if ([modeSTR isEqualToString:@\"voicePrompt\"]) {\n    mode = AVAudioSessionModeVoicePrompt;\n  }\n\n  return mode;\n}\n\n- (AVAudioSessionCategoryOptions)optionsFromArray:(NSArray *)optionsArray\n{\n  AVAudioSessionCategoryOptions options = 0;\n\n  for (NSString *option in optionsArray) {\n    if ([option isEqualToString:@\"allowAirPlay\"]) {\n      options |= AVAudioSessionCategoryOptionAllowAirPlay;\n      continue;\n    }\n\n    if ([option isEqualToString:@\"allowBluetoothA2DP\"]) {\n      options |= AVAudioSessionCategoryOptionAllowBluetoothA2DP;\n      continue;\n    }\n\n    if ([option isEqualToString:@\"allowBluetoothHFP\"]) {\n      options |= AVAudioSessionCategoryOptionAllowBluetoothHFP;\n      continue;\n    }\n\n    if ([option isEqualToString:@\"bluetoothHighQualityRecording\"]) {\n      if (@available(iOS 26, *)) {\n        options |= AVAudioSessionCategoryOptionBluetoothHighQualityRecording;\n      }\n      continue;\n    }\n\n    if ([option isEqualToString:@\"defaultToSpeaker\"]) {\n      options |= AVAudioSessionCategoryOptionDefaultToSpeaker;\n      continue;\n    }\n\n    if ([option isEqualToString:@\"duckOthers\"]) {\n      options |= AVAudioSessionCategoryOptionDuckOthers;\n      continue;\n    }\n\n    if ([option isEqualToString:@\"farFieldInput\"]) {\n      if (@available(iOS 26.2, *)) {\n        options |= AVAudioSessionCategoryOptionFarFieldInput;\n        continue;\n      }\n    }\n\n    if ([option isEqualToString:@\"interruptSpokenAudioAndMixWithOthers\"]) {\n      options |= AVAudioSessionCategoryOptionInterruptSpokenAudioAndMixWithOthers;\n      continue;\n    }\n\n    if ([option isEqualToString:@\"mixWithOthers\"]) {\n      options |= AVAudioSessionCategoryOptionMixWithOthers;\n      continue;\n    }\n\n    if ([option isEqualToString:@\"overrideMutedMicrophoneInterruption\"]) {\n      options |= AVAudioSessionCategoryOptionOverrideMutedMicrophoneInterruption;\n      continue;\n    }\n  }\n\n  return options;\n}\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/system/SystemNotificationManager.h",
    "content": "#pragma once\n\n#import <AVFoundation/AVFoundation.h>\n#import <Foundation/Foundation.h>\n\n@class AudioAPIModule;\n\n@interface SystemNotificationManager : NSObject\n\n@property (nonatomic, weak) AudioAPIModule *audioAPIModule;\n@property (nonatomic, weak) NSNotificationCenter *notificationCenter;\n\n@property (nonatomic, assign) bool isInterrupted;\n@property (nonatomic, strong) NSTimer *hintPollingTimer;\n@property (nonatomic, assign) bool hadConfigurationChange;\n@property (nonatomic, assign) bool audioInterruptionsObserved;\n@property (nonatomic, assign) bool volumeChangesObserved;\n@property (nonatomic, assign) bool wasOtherAudioPlaying;\n\n- (instancetype)initWithAudioAPIModule:(AudioAPIModule *)audioAPIModule;\n- (void)cleanup;\n\n- (void)observeAudioInterruptions:(BOOL)enabled;\n- (void)activelyReclaimSession:(BOOL)enabled;\n- (void)observeVolumeChanges:(BOOL)enabled;\n- (void)observeValueForKeyPath:(NSString *)keyPath\n                      ofObject:(id)object\n                        change:(NSDictionary *)change\n                       context:(void *)context;\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/system/SystemNotificationManager.mm",
    "content": "#import <audioapi/events/AudioEvent.h>\n#import <audioapi/ios/AudioAPIModule.h>\n#import <audioapi/ios/system/AudioEngine.h>\n#import <audioapi/ios/system/AudioSessionManager.h>\n#import <audioapi/ios/system/SystemNotificationManager.h>\n\n@implementation SystemNotificationManager\n\nstatic NSString *NotificationManagerContext = @\"SystemNotificationManagerContext\";\n\n- (instancetype)initWithAudioAPIModule:(AudioAPIModule *)audioAPIModule\n{\n  if (self = [super init]) {\n    self.audioAPIModule = audioAPIModule;\n    self.notificationCenter = [NSNotificationCenter defaultCenter];\n    self.audioInterruptionsObserved = false;\n\n    [self configureNotifications];\n  }\n\n  return self;\n}\n\n- (void)cleanup\n{\n  self.notificationCenter = nil;\n}\n\n- (void)observeAudioInterruptions:(BOOL)enabled\n{\n  self.audioInterruptionsObserved = enabled;\n}\n\n- (void)activelyReclaimSession:(BOOL)enabled\n{\n  if (!enabled) {\n    [self stopPollingSecondaryAudioHint];\n\n    [self.notificationCenter removeObserver:self\n                                       name:AVAudioSessionSilenceSecondaryAudioHintNotification\n                                     object:nil];\n    return;\n  }\n\n  [self.notificationCenter addObserver:self\n                              selector:@selector(handleSecondaryAudio:)\n                                  name:AVAudioSessionSilenceSecondaryAudioHintNotification\n                                object:nil];\n\n  dispatch_async(dispatch_get_main_queue(), ^{ [self startPollingSecondaryAudioHint]; });\n}\n\n// WARNING: this does not work in a simulator environment, test it on a real\n// device\n- (void)observeVolumeChanges:(BOOL)enabled\n{\n  if (self.volumeChangesObserved == enabled) {\n    return;\n  }\n\n  if (enabled) {\n    [[AVAudioSession sharedInstance] addObserver:self\n                                      forKeyPath:@\"outputVolume\"\n                                         options:NSKeyValueObservingOptionNew\n                                         context:(void *)&NotificationManagerContext];\n  } else {\n    [[AVAudioSession sharedInstance] removeObserver:self forKeyPath:@\"outputVolume\" context:nil];\n  }\n\n  self.volumeChangesObserved = enabled;\n}\n\n- (void)configureNotifications\n{\n  [self.notificationCenter addObserver:self\n                              selector:@selector(handleRouteChange:)\n                                  name:AVAudioSessionRouteChangeNotification\n                                object:nil];\n  [self.notificationCenter addObserver:self\n                              selector:@selector(handleMediaServicesReset:)\n                                  name:AVAudioSessionMediaServicesWereResetNotification\n                                object:nil];\n  [self.notificationCenter addObserver:self\n                              selector:@selector(handleEngineConfigurationChange:)\n                                  name:AVAudioEngineConfigurationChangeNotification\n                                object:nil];\n  [self.notificationCenter addObserver:self\n                              selector:@selector(handleInterruption:)\n                                  name:AVAudioSessionInterruptionNotification\n                                object:nil];\n}\n\n- (void)observeValueForKeyPath:(NSString *)keyPath\n                      ofObject:(id)object\n                        change:(NSDictionary *)change\n                       context:(void *)context\n{\n  if (context != &NotificationManagerContext) {\n    return;\n  }\n\n  if ([keyPath isEqualToString:@\"outputVolume\"]) {\n    NSDictionary *body = @{@\"value\" : [NSNumber numberWithFloat:[change[@\"new\"] floatValue]]};\n    if (self.volumeChangesObserved) {\n      [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::VOLUME_CHANGE\n                                            eventBody:body];\n    }\n  }\n}\n\n- (void)handleInterruption:(NSNotification *)notification\n{\n  AudioEngine *audioEngine = self.audioAPIModule.audioEngine;\n  AudioSessionManager *sessionManager = self.audioAPIModule.audioSessionManager;\n\n  NSInteger interruptionType =\n      [notification.userInfo[AVAudioSessionInterruptionTypeKey] integerValue];\n  NSInteger interruptionOption =\n      [notification.userInfo[AVAudioSessionInterruptionOptionKey] integerValue];\n\n  if (interruptionType == AVAudioSessionInterruptionTypeBegan) {\n    dispatch_async(dispatch_get_main_queue(), ^{\n      [audioEngine onInterruptionBegin];\n      [sessionManager markInactive];\n    });\n\n    if (self.audioInterruptionsObserved) {\n      NSDictionary *body = @{@\"type\" : @\"began\", @\"shouldResume\" : @false};\n      [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION\n                                            eventBody:body];\n    }\n\n    return;\n  }\n\n  bool shouldResume = interruptionOption == AVAudioSessionInterruptionOptionShouldResume;\n\n  if (self.audioInterruptionsObserved) {\n    NSDictionary *body = @{@\"type\" : @\"ended\", @\"shouldResume\" : @(shouldResume)};\n    [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION\n                                          eventBody:body];\n  } else {\n    dispatch_async(dispatch_get_main_queue(), ^{ [audioEngine onInterruptionEnd:shouldResume]; });\n  }\n}\n\n- (void)handleSecondaryAudio:(NSNotification *)notification\n{\n  AudioEngine *audioEngine = self.audioAPIModule.audioEngine;\n  AudioSessionManager *sessionManager = self.audioAPIModule.audioSessionManager;\n  NSInteger secondaryAudioType =\n      [notification.userInfo[AVAudioSessionSilenceSecondaryAudioHintTypeKey] integerValue];\n\n  if (secondaryAudioType == AVAudioSessionSilenceSecondaryAudioHintTypeBegin) {\n    dispatch_async(dispatch_get_main_queue(), ^{\n      [sessionManager markInactive];\n      [audioEngine onInterruptionBegin];\n    });\n\n    if (self.audioInterruptionsObserved) {\n      NSDictionary *body = @{@\"type\" : @\"began\", @\"shouldResume\" : @false};\n      [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION\n                                            eventBody:body];\n    }\n    return;\n  }\n\n  bool shouldResume = secondaryAudioType == AVAudioSessionSilenceSecondaryAudioHintTypeEnd;\n\n  if (self.audioInterruptionsObserved) {\n    NSDictionary *body = @{@\"type\" : @\"ended\", @\"shouldResume\" : @(shouldResume)};\n    [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION\n                                          eventBody:body];\n  } else {\n    dispatch_async(dispatch_get_main_queue(), ^{ [audioEngine onInterruptionEnd:shouldResume]; });\n  }\n}\n\n- (void)handleRouteChange:(NSNotification *)notification\n{\n  NSInteger routeChangeReason =\n      [notification.userInfo[AVAudioSessionRouteChangeReasonKey] integerValue];\n  NSString *reasonStr;\n\n  switch (routeChangeReason) {\n    case AVAudioSessionRouteChangeReasonUnknown:\n      reasonStr = @\"Unknown\";\n      break;\n    case AVAudioSessionRouteChangeReasonOverride:\n      reasonStr = @\"Override\";\n      break;\n    case AVAudioSessionRouteChangeReasonCategoryChange:\n      reasonStr = @\"CategoryChange\";\n      break;\n    case AVAudioSessionRouteChangeReasonWakeFromSleep:\n      reasonStr = @\"WakeFromSleep\";\n      break;\n    case AVAudioSessionRouteChangeReasonNewDeviceAvailable:\n      reasonStr = @\"NewDeviceAvailable\";\n      break;\n    case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:\n      reasonStr = @\"OldDeviceUnavailable\";\n      break;\n    case AVAudioSessionRouteChangeReasonRouteConfigurationChange:\n      reasonStr = @\"ConfigurationChange\";\n      break;\n    case AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory:\n      reasonStr = @\"NoSuitableRouteForCategory\";\n      break;\n    default:\n      reasonStr = @\"Unknown\";\n      break;\n  }\n\n  NSDictionary *body = @{@\"reason\" : reasonStr};\n\n  [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::ROUTE_CHANGE\n                                        eventBody:body];\n}\n\n- (void)handleMediaServicesReset:(NSNotification *)notification\n{\n  NSLog(\n      @\"[NotificationManager] Media services have been reset, tearing down and rebuilding everything.\");\n  AudioEngine *audioEngine = self.audioAPIModule.audioEngine;\n  AudioSessionManager *sessionManager = self.audioAPIModule.audioSessionManager;\n\n  dispatch_async(dispatch_get_main_queue(), ^{\n    [sessionManager markInactive];\n    [sessionManager ensureActive:true error:nil];\n    [audioEngine restartAudioEngine];\n  });\n}\n\n- (void)handleEngineConfigurationChange:(NSNotification *)notification\n{\n  AudioEngine *audioEngine = self.audioAPIModule.audioEngine;\n  AudioSessionManager *sessionManager = self.audioAPIModule.audioSessionManager;\n\n  dispatch_async(dispatch_get_main_queue(), ^{\n    [sessionManager markInactive];\n    [audioEngine restartAudioEngine];\n  });\n}\n\n- (void)startPollingSecondaryAudioHint\n{\n  if (self.hintPollingTimer) {\n    [self.hintPollingTimer invalidate];\n    self.hintPollingTimer = nil;\n  }\n\n  self.wasOtherAudioPlaying = false;\n  self.hintPollingTimer = [NSTimer scheduledTimerWithTimeInterval:0.5\n                                                           target:self\n                                                         selector:@selector(checkSecondaryAudioHint)\n                                                         userInfo:nil\n                                                          repeats:true];\n\n  [[NSRunLoop mainRunLoop] addTimer:self.hintPollingTimer forMode:NSRunLoopCommonModes];\n}\n\n- (void)stopPollingSecondaryAudioHint\n{\n  [self.hintPollingTimer invalidate];\n  self.hintPollingTimer = nil;\n}\n\n- (void)checkSecondaryAudioHint\n{\n  BOOL shouldSilence = [AVAudioSession sharedInstance].secondaryAudioShouldBeSilencedHint;\n\n  if (shouldSilence == self.wasOtherAudioPlaying) {\n    return;\n  }\n\n  AudioEngine *audioEngine = self.audioAPIModule.audioEngine;\n  AudioSessionManager *sessionManager = self.audioAPIModule.audioSessionManager;\n\n  self.wasOtherAudioPlaying = shouldSilence;\n\n  if (shouldSilence) {\n    dispatch_async(dispatch_get_main_queue(), ^{\n      [sessionManager markInactive];\n      [audioEngine onInterruptionBegin];\n    });\n    NSDictionary *body = @{@\"type\" : @\"began\", @\"shouldResume\" : @false};\n\n    if (self.audioInterruptionsObserved) {\n      [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION\n                                            eventBody:body];\n    }\n\n    return;\n  }\n\n  NSDictionary *body = @{@\"type\" : @\"ended\", @\"shouldResume\" : @true};\n\n  if (self.audioInterruptionsObserved) {\n    [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::INTERRUPTION\n                                          eventBody:body];\n  } else {\n    dispatch_async(dispatch_get_main_queue(), ^{ [audioEngine onInterruptionEnd:true]; });\n  }\n}\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/system/notification/BaseNotification.h",
    "content": "#pragma once\n\n#import <Foundation/Foundation.h>\n\n/**\n * BaseNotification protocol\n *\n * Interface that all notification types must implement.\n */\n@protocol BaseNotification <NSObject>\n\n@required\n\n/**\n * Initialize the notification.\n * @param options Initialization options (can be nil)\n * @return YES if successful\n */\n- (BOOL)initializeWithOptions:(NSDictionary *)options;\n\n/**\n * Show the notification (sets metadata on iOS).\n * @param options Notification options\n * @return YES if successful\n */\n- (BOOL)showWithOptions:(NSDictionary *)options;\n\n/**\n * Hide the notification (clears metadata on iOS).\n * @return YES if successful\n */\n- (BOOL)hide;\n\n/**\n * Clean up and release resources.\n */\n- (void)cleanup;\n\n/**\n * Check if notification is active.\n * @return YES if active\n */\n- (BOOL)isActive;\n\n/**\n * Get notification type identifier.\n * @return Type identifier (e.g., \"playback\", \"recording\")\n */\n- (NSString *)getNotificationType;\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/system/notification/NotificationRegistry.h",
    "content": "#pragma once\n\n#import <Foundation/Foundation.h>\n#import <audioapi/ios/system/notification/BaseNotification.h>\n\n@class AudioAPIModule;\n\n/**\n * NotificationRegistry\n *\n * Central manager for all notification types.\n * Manages registration, lifecycle, and routing of notification implementations.\n */\n@interface NotificationRegistry : NSObject\n\n@property (nonatomic, weak) AudioAPIModule *audioAPIModule;\n\n- (instancetype)initWithAudioAPIModule:(AudioAPIModule *)audioAPIModule;\n\n/**\n * Show a notification. Creates it if it doesn't exist.\n * @param type The notification type identifier\n * @param key The notification key\n * @param options Options for showing the notification\n * @return YES if successful, NO otherwise\n */\n- (BOOL)showNotificationWithType:(NSString *)type\n                             key:(NSString *)key\n                         options:(NSDictionary *)options;\n\n/**\n * Hide a notification.\n * @param key The notification key\n * @return YES if successful, NO otherwise\n */\n- (BOOL)hideNotificationWithKey:(NSString *)key;\n\n/**\n * Check if a notification is active.\n * @param key The notification key\n * @return YES if active, NO otherwise\n */\n- (BOOL)isNotificationActiveWithKey:(NSString *)key;\n\n/**\n * Clean up all notifications.\n */\n- (void)cleanup;\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/system/notification/NotificationRegistry.mm",
    "content": "#import <audioapi/ios/AudioAPIModule.h>\n#import <audioapi/ios/system/notification/NotificationRegistry.h>\n#import <audioapi/ios/system/notification/PlaybackNotification.h>\n\n@implementation NotificationRegistry {\n  NSMutableDictionary<NSString *, id<BaseNotification>> *_notifications;\n}\n\n- (instancetype)initWithAudioAPIModule:(AudioAPIModule *)audioAPIModule\n{\n  if (self = [super init]) {\n    self.audioAPIModule = audioAPIModule;\n    _notifications = [[NSMutableDictionary alloc] init];\n\n    NSLog(@\"[NotificationRegistry] Initialized\");\n  }\n\n  return self;\n}\n\n- (BOOL)showNotificationWithType:(NSString *)type\n                             key:(NSString *)key\n                         options:(NSDictionary *)options\n{\n  if (!key) {\n    NSLog(@\"[NotificationRegistry] Invalid key\");\n    return false;\n  }\n\n  id<BaseNotification> notification = _notifications[key];\n\n  // Create if doesn't exist\n  if (!notification) {\n    if (!type) {\n      NSLog(@\"[NotificationRegistry] Type required for new notification: %@\", key);\n      return false;\n    }\n\n    notification = [self createNotificationForType:type];\n\n    if (!notification) {\n      NSLog(@\"[NotificationRegistry] Unknown notification type: %@\", type);\n      return false;\n    }\n\n    _notifications[key] = notification;\n    NSLog(@\"[NotificationRegistry] Created notification type '%@' with key '%@'\", type, key);\n  }\n\n  // Initialize if first time showing\n  if (![notification isActive]) {\n    if (![notification initializeWithOptions:options]) {\n      NSLog(@\"[NotificationRegistry] Failed to initialize notification: %@\", key);\n      return false;\n    }\n  }\n\n  BOOL success = [notification showWithOptions:options];\n\n  if (success) {\n    NSLog(@\"[NotificationRegistry] Showed/Updated notification: %@\", key);\n  } else {\n    NSLog(@\"[NotificationRegistry] Failed to show notification: %@\", key);\n  }\n\n  return success;\n}\n\n- (BOOL)hideNotificationWithKey:(NSString *)key\n{\n  id<BaseNotification> notification = _notifications[key];\n\n  if (!notification) {\n    NSLog(@\"[NotificationRegistry] No notification found with key: %@\", key);\n    return false;\n  }\n\n  BOOL success = [notification hide];\n\n  if (success) {\n    NSLog(@\"[NotificationRegistry] Hid notification: %@\", key);\n  } else {\n    NSLog(@\"[NotificationRegistry] Failed to hide notification: %@\", key);\n  }\n\n  return success;\n}\n\n- (BOOL)isNotificationActiveWithKey:(NSString *)key\n{\n  id<BaseNotification> notification = _notifications[key];\n\n  if (!notification) {\n    return false;\n  }\n\n  return [notification isActive];\n}\n\n- (void)cleanup\n{\n  NSLog(@\"[NotificationRegistry] Cleaning up all notifications\");\n\n  // Clean up all notifications\n  for (id<BaseNotification> notification in [_notifications allValues]) {\n    [notification cleanup];\n  }\n\n  [_notifications removeAllObjects];\n}\n\n#pragma mark - Private Methods\n\n- (id<BaseNotification>)createNotificationForType:(NSString *)type\n{\n  if ([type isEqualToString:@\"playback\"]) {\n    return [[PlaybackNotification alloc] initWithAudioAPIModule:self.audioAPIModule];\n  }\n  // Future: Add more notification types here\n  // else if ([type isEqualToString:@\"recording\"]) {\n  //   return [[RecordingNotification alloc] initWithAudioAPIModule:self.audioAPIModule];\n  // }\n\n  return nil;\n}\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/system/notification/PlaybackNotification.h",
    "content": "#pragma once\n\n#import <Foundation/Foundation.h>\n#import <MediaPlayer/MediaPlayer.h>\n#import <audioapi/ios/system/notification/BaseNotification.h>\n\n@class AudioAPIModule;\n\n/**\n * PlaybackNotification\n *\n * iOS playback notification using MPNowPlayingInfoCenter and MPRemoteCommandCenter.\n * Provides lock screen controls, Control Center integration, and Now Playing display.\n *\n * Note: On iOS, this only manages metadata. Notification visibility is controlled\n * by the AudioContext state (active audio session shows controls).\n */\n@interface PlaybackNotification : NSObject <BaseNotification>\n\n@property (nonatomic, weak) AudioAPIModule *audioAPIModule;\n@property (nonatomic, weak) MPNowPlayingInfoCenter *playingInfoCenter;\n@property (nonatomic, copy) NSString *artworkUrl;\n@property (nonatomic, assign) BOOL isActive;\n\n- (instancetype)initWithAudioAPIModule:(AudioAPIModule *)audioAPIModule;\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/ios/audioapi/ios/system/notification/PlaybackNotification.mm",
    "content": "#import <audioapi/ios/AudioAPIModule.h>\n#import <audioapi/ios/system/notification/PlaybackNotification.h>\n\n#define NOW_PLAYING_INFO_KEYS \\\n  @{ \\\n    @\"title\" : MPMediaItemPropertyTitle, \\\n    @\"artist\" : MPMediaItemPropertyArtist, \\\n    @\"album\" : MPMediaItemPropertyAlbumTitle, \\\n    @\"duration\" : MPMediaItemPropertyPlaybackDuration, \\\n    @\"elapsedTime\" : MPNowPlayingInfoPropertyElapsedPlaybackTime, \\\n    @\"speed\" : MPNowPlayingInfoPropertyPlaybackRate, \\\n    @\"artwork\" : MPMediaItemPropertyArtwork \\\n  }\n\n@implementation PlaybackNotification {\n  BOOL _isInitialized;\n  NSMutableDictionary *_currentInfo;\n}\n\n- (instancetype)initWithAudioAPIModule:(AudioAPIModule *)audioAPIModule\n{\n  if (self = [super init]) {\n    self.audioAPIModule = audioAPIModule;\n    self.playingInfoCenter = [MPNowPlayingInfoCenter defaultCenter];\n    _isInitialized = false;\n    _isActive = false;\n    _currentInfo = [[NSMutableDictionary alloc] init];\n  }\n\n  return self;\n}\n\n#pragma mark - BaseNotification Protocol\n\n- (BOOL)initializeWithOptions:(NSDictionary *)options\n{\n  if (_isInitialized) {\n    return true;\n  }\n\n  // Enable remote control events\n  dispatch_async(dispatch_get_main_queue(), ^{\n    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];\n  });\n\n  // Enable default remote commands\n  [self enableRemoteCommand:@\"play\" enabled:true];\n  [self enableRemoteCommand:@\"pause\" enabled:true];\n  [self enableRemoteCommand:@\"nextTrack\" enabled:true];\n  [self enableRemoteCommand:@\"previousTrack\" enabled:true];\n  [self enableRemoteCommand:@\"skipForward\" enabled:true];\n  [self enableRemoteCommand:@\"skipBackward\" enabled:true];\n  [self enableRemoteCommand:@\"seekTo\" enabled:true];\n\n  _isInitialized = true;\n  return true;\n}\n\n- (BOOL)showWithOptions:(NSDictionary *)options\n{\n  if (!_isInitialized) {\n    if (![self initializeWithOptions:options]) {\n      return false;\n    }\n  }\n\n  // Handle control enable/disable\n  if (options[@\"control\"] && options[@\"enabled\"]) {\n    NSString *control = options[@\"control\"];\n    BOOL enabled = [options[@\"enabled\"] boolValue];\n    [self enableControl:control enabled:enabled];\n    // If it's a control update, we can return early or continue\n    // Continuing lets us update metadata if provided mixed with controls\n  }\n\n  // Update the now playing info\n  [self updateNowPlayingInfo:options];\n\n  _isActive = true;\n\n  return true;\n}\n\n- (BOOL)hide\n{\n  if (!_isActive) {\n    return true;\n  }\n\n  // Clear now playing info\n  self.playingInfoCenter.nowPlayingInfo = nil;\n  self.artworkUrl = nil;\n  [_currentInfo removeAllObjects];\n\n  _isActive = false;\n\n  return true;\n}\n\n- (void)cleanup\n{\n  // Hide if active\n  if (_isActive) {\n    [self hide];\n  }\n\n  // Disable all remote commands\n  MPRemoteCommandCenter *remoteCenter = [MPRemoteCommandCenter sharedCommandCenter];\n  [remoteCenter.playCommand removeTarget:self];\n  [remoteCenter.pauseCommand removeTarget:self];\n  [remoteCenter.stopCommand removeTarget:self];\n  [remoteCenter.nextTrackCommand removeTarget:self];\n  [remoteCenter.previousTrackCommand removeTarget:self];\n  [remoteCenter.skipForwardCommand removeTarget:self];\n  [remoteCenter.skipBackwardCommand removeTarget:self];\n  [remoteCenter.seekForwardCommand removeTarget:self];\n  [remoteCenter.seekBackwardCommand removeTarget:self];\n  [remoteCenter.changePlaybackPositionCommand removeTarget:self];\n\n  // Disable remote control events\n  dispatch_async(dispatch_get_main_queue(), ^{\n    [[UIApplication sharedApplication] endReceivingRemoteControlEvents];\n  });\n\n  _isInitialized = false;\n}\n\n- (BOOL)isActive\n{\n  return _isActive;\n}\n\n- (NSString *)getNotificationType\n{\n  return @\"playback\";\n}\n\n#pragma mark - Private Methods\n\n- (void)updateNowPlayingInfo:(NSDictionary *)info\n{\n  if (!info) {\n    return;\n  }\n\n  // Get existing now playing info or create new one\n  NSMutableDictionary *nowPlayingInfo = [self.playingInfoCenter.nowPlayingInfo mutableCopy];\n  if (!nowPlayingInfo) {\n    nowPlayingInfo = [[NSMutableDictionary alloc] init];\n  }\n\n  // Map keys from our API to MPNowPlayingInfoCenter keys\n  NSDictionary *keyMap = NOW_PLAYING_INFO_KEYS;\n\n  // Only update the keys that are provided in this update\n  for (NSString *key in info) {\n    NSString *mpKey = keyMap[key];\n    if (mpKey) {\n      // Handle artwork specially - don't set it directly to nowPlayingInfo\n      if ([key isEqualToString:@\"artwork\"]) {\n        _currentInfo[key] = info[key];\n      } else {\n        nowPlayingInfo[mpKey] = info[key];\n        _currentInfo[key] = info[key];\n      }\n    }\n  }\n\n  self.playingInfoCenter.nowPlayingInfo = nowPlayingInfo;\n\n  // Handle playback state\n  NSString *state = _currentInfo[@\"state\"];\n  MPNowPlayingPlaybackState playbackState = MPNowPlayingPlaybackStatePaused;\n\n  if (state) {\n    if ([state isEqualToString:@\"playing\"]) {\n      playbackState = MPNowPlayingPlaybackStatePlaying;\n    } else if ([state isEqualToString:@\"paused\"]) {\n      playbackState = MPNowPlayingPlaybackStatePaused;\n    } else {\n      playbackState = MPNowPlayingPlaybackStatePaused;\n    }\n  }\n\n  self.playingInfoCenter.playbackState = playbackState;\n\n  // Handle artwork\n  NSString *artworkUrl = [self getArtworkUrl:_currentInfo[@\"artwork\"]];\n  [self updateArtworkIfNeeded:artworkUrl];\n}\n\n- (NSString *)getArtworkUrl:(id)artwork\n{\n  if (!artwork) {\n    return nil;\n  }\n\n  // Handle both string and dictionary formats\n  if ([artwork isKindOfClass:[NSString class]]) {\n    return artwork;\n  } else if ([artwork isKindOfClass:[NSDictionary class]]) {\n    return artwork[@\"uri\"];\n  }\n\n  return nil;\n}\n\n- (void)updateArtworkIfNeeded:(NSString *)artworkUrl\n{\n  if (!artworkUrl) {\n    return;\n  }\n\n  MPNowPlayingInfoCenter *center = [MPNowPlayingInfoCenter defaultCenter];\n  if ([artworkUrl isEqualToString:self.artworkUrl] &&\n      center.nowPlayingInfo[MPMediaItemPropertyArtwork] != nil) {\n    return;\n  }\n\n  self.artworkUrl = artworkUrl;\n\n  // Load artwork asynchronously\n  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{\n    NSURL *url = nil;\n    NSData *imageData = nil;\n    UIImage *image = nil;\n\n    @try {\n      if ([artworkUrl hasPrefix:@\"http://\"] || [artworkUrl hasPrefix:@\"https://\"]) {\n        // Remote URL\n        url = [NSURL URLWithString:artworkUrl];\n        imageData = [NSData dataWithContentsOfURL:url];\n      } else {\n        // Local file - try as resource or file path\n        NSString *imagePath = [[NSBundle mainBundle] pathForResource:artworkUrl ofType:nil];\n        if (imagePath) {\n          imageData = [NSData dataWithContentsOfFile:imagePath];\n        } else {\n          // Try as absolute path\n          imageData = [NSData dataWithContentsOfFile:artworkUrl];\n        }\n      }\n\n      if (imageData) {\n        image = [UIImage imageWithData:imageData];\n      }\n    } @catch (NSException *exception) {\n      // Failed to load artwork\n    }\n\n    if (image) {\n      MPMediaItemArtwork *artwork = [[MPMediaItemArtwork alloc]\n          initWithBoundsSize:image.size\n              requestHandler:^UIImage *_Nonnull(CGSize size) { return image; }];\n\n      dispatch_async(dispatch_get_main_queue(), ^{\n        NSMutableDictionary *nowPlayingInfo = [center.nowPlayingInfo mutableCopy];\n        if (!nowPlayingInfo) {\n          nowPlayingInfo = [[NSMutableDictionary alloc] init];\n        }\n        nowPlayingInfo[MPMediaItemPropertyArtwork] = artwork;\n        center.nowPlayingInfo = nowPlayingInfo;\n      });\n    }\n  });\n}\n\n- (void)enableControl:(NSString *)control enabled:(BOOL)enabled\n{\n  NSSet *validControls = [NSSet setWithObjects:@\"play\",\n                                               @\"pause\",\n                                               @\"stop\",\n                                               @\"nextTrack\",\n                                               @\"previousTrack\",\n                                               @\"skipForward\",\n                                               @\"skipBackward\",\n                                               @\"seekTo\",\n                                               nil];\n  if ([validControls containsObject:control]) {\n    [self enableRemoteCommand:control enabled:enabled];\n  }\n}\n\n- (void)enableRemoteCommand:(NSString *)name enabled:(BOOL)enabled\n{\n  MPRemoteCommandCenter *remoteCenter = [MPRemoteCommandCenter sharedCommandCenter];\n\n  if ([name isEqualToString:@\"play\"]) {\n    [self enableCommand:remoteCenter.playCommand withSelector:@selector(onPlay:) enabled:enabled];\n  } else if ([name isEqualToString:@\"pause\"]) {\n    [self enableCommand:remoteCenter.pauseCommand withSelector:@selector(onPause:) enabled:enabled];\n  } else if ([name isEqualToString:@\"stop\"]) {\n    [self enableCommand:remoteCenter.stopCommand withSelector:@selector(onStop:) enabled:enabled];\n  } else if ([name isEqualToString:@\"nextTrack\"]) {\n    [self enableCommand:remoteCenter.nextTrackCommand\n           withSelector:@selector(onNextTrack:)\n                enabled:enabled];\n  } else if ([name isEqualToString:@\"previousTrack\"]) {\n    [self enableCommand:remoteCenter.previousTrackCommand\n           withSelector:@selector(onPreviousTrack:)\n                enabled:enabled];\n  } else if ([name isEqualToString:@\"skipForward\"]) {\n    remoteCenter.skipForwardCommand.preferredIntervals = @[ @(15) ];\n    [self enableCommand:remoteCenter.skipForwardCommand\n           withSelector:@selector(onSkipForward:)\n                enabled:enabled];\n  } else if ([name isEqualToString:@\"skipBackward\"]) {\n    remoteCenter.skipBackwardCommand.preferredIntervals = @[ @(15) ];\n    [self enableCommand:remoteCenter.skipBackwardCommand\n           withSelector:@selector(onSkipBackward:)\n                enabled:enabled];\n  } else if ([name isEqualToString:@\"seekForward\"]) {\n    [self enableCommand:remoteCenter.seekForwardCommand\n           withSelector:@selector(onSeekForward:)\n                enabled:enabled];\n  } else if ([name isEqualToString:@\"seekBackward\"]) {\n    [self enableCommand:remoteCenter.seekBackwardCommand\n           withSelector:@selector(onSeekBackward:)\n                enabled:enabled];\n  } else if ([name isEqualToString:@\"seekTo\"]) {\n    [self enableCommand:remoteCenter.changePlaybackPositionCommand\n           withSelector:@selector(onChangePlaybackPosition:)\n                enabled:enabled];\n  }\n}\n\n- (void)enableCommand:(MPRemoteCommand *)command withSelector:(SEL)selector enabled:(BOOL)enabled\n{\n  [command removeTarget:self];\n  command.enabled = enabled;\n  if (enabled) {\n    [command addTarget:self action:selector];\n  }\n}\n\n#pragma mark - Remote Command Handlers\n\n- (MPRemoteCommandHandlerStatus)onPlay:(MPRemoteCommandEvent *)event\n{\n  [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_PLAY\n                                        eventBody:@{}];\n  return MPRemoteCommandHandlerStatusSuccess;\n}\n\n- (MPRemoteCommandHandlerStatus)onPause:(MPRemoteCommandEvent *)event\n{\n  [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_PAUSE\n                                        eventBody:@{}];\n  return MPRemoteCommandHandlerStatusSuccess;\n}\n\n- (MPRemoteCommandHandlerStatus)onStop:(MPRemoteCommandEvent *)event\n{\n  [self.audioAPIModule invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_STOP\n                                        eventBody:@{}];\n  return MPRemoteCommandHandlerStatusSuccess;\n}\n\n- (MPRemoteCommandHandlerStatus)onNextTrack:(MPRemoteCommandEvent *)event\n{\n  [self.audioAPIModule\n      invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_NEXT_TRACK\n                       eventBody:@{}];\n  return MPRemoteCommandHandlerStatusSuccess;\n}\n\n- (MPRemoteCommandHandlerStatus)onPreviousTrack:(MPRemoteCommandEvent *)event\n{\n  [self.audioAPIModule\n      invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_PREVIOUS_TRACK\n                       eventBody:@{}];\n  return MPRemoteCommandHandlerStatusSuccess;\n}\n\n- (MPRemoteCommandHandlerStatus)onSeekForward:(MPRemoteCommandEvent *)event\n{\n  [self.audioAPIModule\n      invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_SEEK_FORWARD\n                       eventBody:@{}];\n  return MPRemoteCommandHandlerStatusSuccess;\n}\n\n- (MPRemoteCommandHandlerStatus)onSeekBackward:(MPRemoteCommandEvent *)event\n{\n  [self.audioAPIModule\n      invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_SEEK_BACKWARD\n                       eventBody:@{}];\n  return MPRemoteCommandHandlerStatusSuccess;\n}\n\n- (MPRemoteCommandHandlerStatus)onSkipForward:(MPSkipIntervalCommandEvent *)event\n{\n  NSDictionary *body = @{@\"value\" : @(event.interval)};\n  [self.audioAPIModule\n      invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_SKIP_FORWARD\n                       eventBody:body];\n  return MPRemoteCommandHandlerStatusSuccess;\n}\n\n- (MPRemoteCommandHandlerStatus)onSkipBackward:(MPSkipIntervalCommandEvent *)event\n{\n  NSDictionary *body = @{@\"value\" : @(event.interval)};\n  [self.audioAPIModule\n      invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_SKIP_BACKWARD\n                       eventBody:body];\n  return MPRemoteCommandHandlerStatusSuccess;\n}\n\n- (MPRemoteCommandHandlerStatus)onChangePlaybackPosition:\n    (MPChangePlaybackPositionCommandEvent *)event\n{\n  NSDictionary *body = @{@\"value\" : @(event.positionTime)};\n  [self.audioAPIModule\n      invokeHandlerWithEventName:audioapi::AudioEvent::PLAYBACK_NOTIFICATION_SEEK_TO\n                       eventBody:body];\n  return MPRemoteCommandHandlerStatusSuccess;\n}\n\n@end\n"
  },
  {
    "path": "packages/react-native-audio-api/mock/package.json",
    "content": "{\n  \"main\": \"../../lib/module/mock/index\",\n  \"module\": \"../../lib/module/mock/index\",\n  \"react-native\": \"../../src/mock/index\",\n  \"types\": \"../../lib/typescript/mock/index.d.ts\"\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/package.json",
    "content": "{\n  \"name\": \"react-native-audio-api\",\n  \"version\": \"0.13.0\",\n  \"description\": \"react-native-audio-api provides system for controlling audio in React Native environment compatible with Web Audio API specification\",\n  \"bin\": {\n    \"setup-rn-audio-api-web\": \"./scripts/setup-rn-audio-api-web.js\"\n  },\n  \"source\": \"src/index\",\n  \"main\": \"lib/module/index\",\n  \"module\": \"lib/module/index\",\n  \"react-native\": \"src/index\",\n  \"types\": \"lib/typescript/index.d.ts\",\n  \"files\": [\n    \"src/\",\n    \"development/react/\",\n    \"mock/\",\n    \"lib/\",\n    \"common/\",\n    \"android/src/main/AndroidManifest.xml\",\n    \"android/src/main/java/\",\n    \"android/build.gradle\",\n    \"android/\",\n    \"ios\",\n    \"RNAudioAPI.podspec\",\n    \"metro-config\",\n    \"!ios/build\",\n    \"!android/build\",\n    \"!android/gradle\",\n    \"!android/gradlew\",\n    \"!android/gradlew.bat\",\n    \"!android/local.properties\",\n    \"!android/.cxx/\",\n    \"!android/.gradle/\",\n    \"!**/__tests__\",\n    \"!**/__fixtures__\",\n    \"!**/__mocks__\",\n    \"!**/.*\",\n    \"!**/node_modules\",\n    \"!common/cpp/cursor\",\n    \"!common/cpp/test\",\n    \"scripts/setup-rn-audio-api-web.js\",\n    \"scripts/rnaa_utils.rb\",\n    \"scripts/validate-worklets-version.js\",\n    \"scripts/download-prebuilt-binaries.sh\",\n    \"app.plugin.js\"\n  ],\n  \"scripts\": {\n    \"test\": \"yarn test:js && yarn test:cpp\",\n    \"test:js\": \"jest\",\n    \"test:cpp\": \"bash common/cpp/test/RunTests.sh\",\n    \"test:full\": \"yarn test && yarn test:graph\",\n    \"test:graph\": \"bash common/cpp/test/RunTestsGraph.sh\",\n    \"test:graph:docker\": \"bash common/cpp/test/RunTestsGraphDocker.sh\",\n    \"typecheck\": \"tsc --noEmit\",\n    \"lint\": \"yarn lint:js && yarn lint:cpp && yarn lint:ios && yarn lint:kotlin\",\n    \"lint:js\": \"eslint src && yarn prettier --check src\",\n    \"lint:cpp\": \"./scripts/cpplint.sh\",\n    \"lint:ios\": \"yarn format:ios -Werror\",\n    \"lint:kotlin\": \"ktlint 'android/src/main/java/**/*.kt'\",\n    \"format\": \"yarn format:js && yarn format:android:cpp && yarn format:android:kotlin && yarn format:ios && yarn format:common\",\n    \"format:check\": \"yarn format:check:js && yarn format:check:android:cpp && yarn format:check:android:kotlin && yarn format:check:ios && yarn format:check:common\",\n    \"format:check:js\": \"prettier --check src\",\n    \"format:check:android:cpp\": \"find android/src/ -path android/src/main/cpp/audioapi/android/libs -prune -o -type f -iname \\\"*.h\\\" -print -o -type f -iname \\\"*.cpp\\\" -print -o -type f -iname \\\"*.hpp\\\" -print | xargs clang-format --dry-run --Werror\",\n    \"format:check:android:kotlin\": \"ktlint 'android/src/main/java/**/*.kt'\",\n    \"format:check:ios\": \"find ios/audioapi/ios -iname \\\"*.h\\\" -o -iname \\\"*.m\\\" -o -iname \\\"*.mm\\\" | xargs clang-format --dry-run --Werror\",\n    \"format:check:common\": \"find common/cpp/ -path 'common/cpp/audioapi/libs' -prune -o -path 'common/cpp/audioapi/external' -prune -o -type f -iname \\\"*.h\\\" -print -o -type f -iname \\\"*.cpp\\\" -print -o -type f -iname \\\"*.hpp\\\" -print | xargs clang-format --dry-run --Werror\",\n    \"format:js\": \"prettier --write --list-different src\",\n    \"format:android:cpp\": \"find android/src/ -path android/src/main/cpp/audioapi/android/libs -prune -o -type f -iname \\\"*.h\\\" -print -o -type f -iname \\\"*.cpp\\\" -print -o -type f -iname \\\"*.hpp\\\" -print | xargs clang-format -i\",\n    \"format:android:kotlin\": \"ktlint -F 'android/src/main/java/**/*.kt'\",\n    \"format:ios\": \"find ios/audioapi/ios -iname \\\"*.h\\\" -o -iname \\\"*.m\\\" -o -iname \\\"*.mm\\\" | xargs clang-format -i\",\n    \"format:common\": \"find common/cpp/ -path 'common/cpp/audioapi/libs' -prune -o -path 'common/cpp/audioapi/external' -prune -o -type f -iname \\\"*.h\\\" -print -o -type f -iname \\\"*.cpp\\\" -print -o -type f -iname \\\"*.hpp\\\" -print | xargs clang-format -i\",\n    \"build\": \"bob build\",\n    \"create:package\": \"./scripts/create-package.sh\",\n    \"prepack\": \"cp ../../README.md ./README.md\",\n    \"postpack\": \"rm ./README.md\"\n  },\n  \"keywords\": [\n    \"react-native\",\n    \"audio\",\n    \"audio api\",\n    \"web audio api\",\n    \"react\",\n    \"music\",\n    \"player\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/software-mansion/react-native-audio-api.git\"\n  },\n  \"author\": \"Software Mansion (https://github.com/software-mansion)\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/software-mansion/react-native-audio-api/issues\"\n  },\n  \"homepage\": \"https://github.com/software-mansion/react-native-audio-api#readme\",\n  \"publishConfig\": {\n    \"registry\": \"https://registry.npmjs.org/\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"*\",\n    \"react-native\": \"*\",\n    \"react-native-worklets\": \">= 0.6.0\"\n  },\n  \"peerDependenciesMeta\": {\n    \"react-native-worklets\": {\n      \"optional\": true\n    }\n  },\n  \"devDependencies\": {\n    \"@babel/cli\": \"^7.20.0\",\n    \"@babel/core\": \"^7.25.2\",\n    \"@babel/preset-env\": \"^7.25.3\",\n    \"@babel/types\": \"^7.20.0\",\n    \"@commitlint/config-conventional\": \"17.0.2\",\n    \"@evilmartians/lefthook\": \"^1.5.0\",\n    \"@expo/config-plugins\": \"^9.0.0\",\n    \"@expo/config-types\": \"^53.0.4\",\n    \"@react-native/babel-preset\": \"0.85.0\",\n    \"@react-native/eslint-config\": \"0.85.0\",\n    \"@react-native/metro-config\": \"0.85.0\",\n    \"@react-native/typescript-config\": \"0.85.0\",\n    \"@types/babel__core\": \"^7.20.0\",\n    \"@types/babel__generator\": \"^7.6.4\",\n    \"@types/babel__traverse\": \"^7.14.2\",\n    \"@types/convert-source-map\": \"^2.0.0\",\n    \"@types/jest\": \"^29.5.5\",\n    \"@types/node\": \"^18.0.0\",\n    \"@types/react\": \"^19.2.0\",\n    \"@types/react-test-renderer\": \"^19.1.0\",\n    \"@types/semver\": \"7.7.1\",\n    \"babel-plugin-module-resolver\": \"^4.1.0\",\n    \"commitlint\": \"17.0.2\",\n    \"del-cli\": \"^5.1.0\",\n    \"eslint\": \"^8.57.0\",\n    \"eslint-config-prettier\": \"^8.3.0\",\n    \"eslint-config-standard\": \"^17.1.0\",\n    \"eslint-import-resolver-babel-module\": \"^5.3.1\",\n    \"eslint-plugin-import\": \"^2.25.4\",\n    \"eslint-plugin-jest\": \"^27.2.1\",\n    \"eslint-plugin-n\": \"^16.4.0\",\n    \"eslint-plugin-no-inline-styles\": \"^1.0.5\",\n    \"eslint-plugin-prettier\": \"^5.0.1\",\n    \"eslint-plugin-promise\": \"^6.0.0\",\n    \"eslint-plugin-react\": \"^7.34.3\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"eslint-plugin-standard\": \"^5.0.0\",\n    \"eslint-plugin-tsdoc\": \"^0.2.17\",\n    \"jest\": \"^29.7.0\",\n    \"prettier\": \"^3.3.3\",\n    \"react\": \"19.2.3\",\n    \"react-native\": \"0.85.0\",\n    \"react-native-builder-bob\": \"0.33.1\",\n    \"turbo\": \"^1.10.7\",\n    \"typescript\": \"~5.8.3\"\n  },\n  \"react-native-builder-bob\": {\n    \"source\": \"src\",\n    \"output\": \"lib\",\n    \"targets\": [\n      [\n        \"module\",\n        {\n          \"esm\": true\n        }\n      ],\n      \"typescript\",\n      \"commonjs\"\n    ]\n  },\n  \"codegenConfig\": {\n    \"name\": \"rnaudioapi\",\n    \"type\": \"modules\",\n    \"jsSrcsDir\": \"src/specs\",\n    \"android\": {\n      \"javaPackageName\": \"com.swmansion.audioapi\"\n    }\n  },\n  \"create-react-native-library\": {\n    \"type\": \"module-legacy\",\n    \"languages\": \"cpp\",\n    \"version\": \"0.37.1\"\n  },\n  \"dependencies\": {\n    \"semver\": \"^7.7.3\"\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/scripts/check-audio-events-sync.sh",
    "content": "#!/bin/bash\n\n# Script to verify AudioEvent enums are in sync between C++ and Kotlin files\n# Exit with error if they differ in values or order\n\nset -e\n\n# Get the directory where this script is located\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nPACKAGE_DIR=\"$(dirname \"$SCRIPT_DIR\")\"\n\nCPP_FILE=\"$PACKAGE_DIR/common/cpp/audioapi/events/AudioEvent.h\"\nKOTLIN_FILE=\"$PACKAGE_DIR/android/src/main/java/com/swmansion/audioapi/system/AudioEvent.kt\"\n\n# Check if files exist\nif [ ! -f \"$CPP_FILE\" ]; then\n  echo \"❌ Error: C++ file not found: $CPP_FILE\"\n  exit 1\nfi\n\nif [ ! -f \"$KOTLIN_FILE\" ]; then\n  echo \"❌ Error: Kotlin file not found: $KOTLIN_FILE\"\n  exit 1\nfi\n\n# Extract enum values from C++ file (lines between typedef enum { and } AudioEvent;)\nCPP_ENUMS=$(sed -n '/enum class AudioEvent : uint8_t {/,/};/p' \"$CPP_FILE\" | \\\n  grep -E '^\\s*[A-Z_]+' | \\\n  sed 's/,//g' | \\\n  sed 's/^[[:space:]]*//' | \\\n  sed 's/[[:space:]]*$//')\n\n# Extract enum values from Kotlin file (lines between enum class AudioEvent { and })\nKOTLIN_ENUMS=$(sed -n '/enum class AudioEvent {/,/^}/p' \"$KOTLIN_FILE\" | \\\n  grep -E '^\\s*[A-Z_]+' | \\\n  sed 's/,//g' | \\\n  sed 's/^[[:space:]]*//' | \\\n  sed 's/[[:space:]]*$//')\n\n# Compare the enum values\nif [ \"$CPP_ENUMS\" = \"$KOTLIN_ENUMS\" ]; then\n  echo \"✅ AudioEvent enums are in sync!\"\n  echo \"\"\n  echo \"Found $(echo \"$CPP_ENUMS\" | wc -l | tr -d ' ') enum values in both files.\"\n  exit 0\nelse\n  echo \"❌ AudioEvent enums are NOT in sync!\"\n  echo \"\"\n  echo \"C++ enum values ($CPP_FILE):\"\n  echo \"$CPP_ENUMS\" | nl\n  echo \"\"\n  echo \"Kotlin enum values ($KOTLIN_FILE):\"\n  echo \"$KOTLIN_ENUMS\" | nl\n  echo \"\"\n  echo \"Differences:\"\n  diff <(echo \"$CPP_ENUMS\") <(echo \"$KOTLIN_ENUMS\") || true\n  exit 1\nfi\n"
  },
  {
    "path": "packages/react-native-audio-api/scripts/cpplint.sh",
    "content": "#!/bin/bash\n\nif which cpplint >/dev/null; then\n  find common/cpp android/src/main/cpp -path 'common/cpp/audioapi/libs' -prune -o -path 'common/cpp/audioapi/external' -prune -o -path 'common/cpp/audioapi/dsp/r8brain' -prune -o \\( -name '*.cpp' -o -name '*.h' -o -name '*.hpp' \\) -print | xargs cpplint --linelength=100 --filter=-legal/copyright,-readability/todo,-readability/nolint,-build/namespaces,-build/include_order,-whitespace,-build/c++17,-build/c++20,-runtime/references,-runtime/string,-readability/braces --quiet --recursive \"$@\"\nelse\n  echo \"error: cpplint not installed, download from https://github.com/cpplint/cpplint\" 1>&2\n  exit 1\nfi\n"
  },
  {
    "path": "packages/react-native-audio-api/scripts/create-package.sh",
    "content": "#!/bin/bash\n\nyarn install --immutable\n\nif [ $# -ge 1 ] && [ \"$1\" = \"generate_nightly_version\" ]; then\n    VERSION=$(jq -r '.version' package.json)\n    IFS='.' read -r MAJOR MINOR PATCH <<< \"$VERSION\" \n    GIT_COMMIT=$(git rev-parse HEAD)\n    DATE=$(date +%Y%m%d)\n    NIGHTLY_UNIQUE_NAME=\"${GIT_COMMIT:0:7}-$DATE\"\n    if [[ \"$OSTYPE\" == \"darwin\"* ]]; then\n        sed -i '' \"3s/.*/  \\\"version\\\": \\\"$MAJOR.$MINOR.$PATCH-nightly-$NIGHTLY_UNIQUE_NAME\\\",/\" package.json\n    else\n        sed -i \"3s/.*/  \\\"version\\\": \\\"$MAJOR.$MINOR.$PATCH-nightly-$NIGHTLY_UNIQUE_NAME\\\",/\" package.json\n    fi\nfi\n\nyarn bob build\n\nnpm pack\n\nif [ $# -ge 1 ] && [ \"$1\" = \"generate_nightly_version\" ]; then\n    if [[ \"$OSTYPE\" == \"darwin\"* ]]; then\n        sed -i '' \"3s/.*/  \\\"version\\\": \\\"$MAJOR.$MINOR.$PATCH\\\",/\" package.json\n    else\n        sed -i \"3s/.*/  \\\"version\\\": \\\"$MAJOR.$MINOR.$PATCH\\\",/\" package.json\n    fi\nfi\n\necho \"Done!\"\n"
  },
  {
    "path": "packages/react-native-audio-api/scripts/download-prebuilt-binaries.sh",
    "content": "#!/bin/bash\n# Script to download and unzip prebuilt native binaries for React Native.\n\nMAIN_DOWNLOAD_URL=\"https://github.com/software-mansion-labs/rn-audio-libs/releases/download\"\nTAG=\"v3.0.0\"\nDOWNLOAD_NAMES=(\n    \"android.zip\"\n    \"ffmpeg_ios.zip\"\n    \"iphoneos.zip\"\n    \"iphonesimulator.zip\"\n    \"jniLibs.zip\"\n    \"macosx.zip\"\n)\n\n# Use a temporary directory for downloads, ensuring it exists\nTEMP_DOWNLOAD_DIR=\"$(pwd)/audioapi-binaries-temp\"\nmkdir -p \"$TEMP_DOWNLOAD_DIR\"\n\nif [ \"$1\" == \"android\" ]; then\n    PROJECT_ROOT=\"$(pwd)/..\"\nelse\n    PROJECT_ROOT=\"$(pwd)\"\nfi\n\nif [ \"$2\" == \"skipffmpeg\" ]; then\n    SKIP_FFMPEG=true\nelse\n    SKIP_FFMPEG=false\nfi\n\nJNILIBS_DESTINATION=\"${PROJECT_ROOT}/android/src/main\"\nNORMAL_DESTINATION=\"${PROJECT_ROOT}/common/cpp/audioapi/external\"\n\nfor name in \"${DOWNLOAD_NAMES[@]}\"; do\n    ARCH_URL=\"${MAIN_DOWNLOAD_URL}/${TAG}/${name}\"\n    ZIP_FILE_PATH=\"${TEMP_DOWNLOAD_DIR}/${name}\"\n\n    # Get the directory name from the zip name (e.g., \"armeabi-v7a.zip\" -> \"armeabi-v7a\")\n    EXTRACTED_DIR_NAME=\"${name%.zip}\"\n\n    if [[ (\"$EXTRACTED_DIR_NAME\" == \"ffmpeg_ios\" || \"$EXTRACTED_DIR_NAME\" == \"jniLibs\") && \"$SKIP_FFMPEG\" == true ]]; then\n        continue\n    fi\n\n    # Determine the final output path\n    if [[ \"$name\" == \"jniLibs.zip\" ]]; then\n        OUTPUT_DIR=\"${JNILIBS_DESTINATION}\"\n    else\n        OUTPUT_DIR=\"${NORMAL_DESTINATION}\"\n    fi\n    FINAL_CHECK_PATH=\"${OUTPUT_DIR}/${EXTRACTED_DIR_NAME}\"\n\n    if [ -d \"$FINAL_CHECK_PATH\" ]; then\n        continue\n    fi\n\n    # If we are here, the directory does not exist, so we download and unzip.\n    echo \"Downloading from: $ARCH_URL\"\n    curl -fsSL \"$ARCH_URL\" -o \"$ZIP_FILE_PATH\"\n\n    if [ $? -ne 0 ]; then\n        echo \"Error: Download failed for ${name}.\"\n        rm -f \"$ZIP_FILE_PATH\"\n        continue\n    fi\n\n    echo \"Unzipping ${name} to ${OUTPUT_DIR}\"\n    unzip -o \"$ZIP_FILE_PATH\" -d \"$OUTPUT_DIR\"\n\n    # Clean up any __MACOSX directories that may have been created\n    rm -rf \"${OUTPUT_DIR}/__MACOSX\"\n\ndone\n\nrm -rf \"$TEMP_DOWNLOAD_DIR\"\n"
  },
  {
    "path": "packages/react-native-audio-api/scripts/rnaa_utils.rb",
    "content": "def check_if_worklets_enabled()\n  validate_worklets_script = File.expand_path(File.join(__dir__, 'validate-worklets-version.js'))\n  unless system(\"node \\\"#{validate_worklets_script}\\\"\")\n    # If the validation script fails, we assume worklets are not present or have an incompatible version\n    return false\n  end\n  true\nend\n\ndef try_to_parse_react_native_package_json(node_modules_dir)\n  react_native_package_json_path = File.join(node_modules_dir, 'react-native/package.json')\n  if !File.exist?(react_native_package_json_path)\n    return nil\n  end\n  return JSON.parse(File.read(react_native_package_json_path))\nend\n\ndef find_audio_api_config()\n  result = {\n    :worklets_enabled => nil,\n    :react_native_common_dir => nil,\n    :dynamic_frameworks_audio_api_dir => nil,\n    :dynamic_frameworks_worklets_dir => nil\n  }\n\n  result[:worklets_enabled] = check_if_worklets_enabled()\n\n  react_native_node_modules_dir = File.join(File.dirname(`cd \"#{Pod::Config.instance.installation_root.to_s}\" && node --print \"require.resolve('react-native/package.json')\"`), '..')\n  react_native_json = try_to_parse_react_native_package_json(react_native_node_modules_dir)\n\n  if react_native_json == nil\n    # user configuration, just in case\n    node_modules_dir = ENV[\"REACT_NATIVE_NODE_MODULES_DIR\"]\n    react_native_json = try_to_parse_react_native_package_json(node_modules_dir)\n  end\n\n  if react_native_json == nil\n    raise '[AudioAPI] Unable to recognize your `react-native` version. Please set environmental variable with `react-native` location: `export REACT_NATIVE_NODE_MODULES_DIR=\"<path to react-native>\" && pod install`.'\n  end\n\n  pods_root = Pod::Config.instance.project_pods_root\n  react_native_common_dir_absolute = File.join(react_native_node_modules_dir, 'react-native', 'ReactCommon')\n  react_native_common_dir_relative = Pathname.new(react_native_common_dir_absolute).relative_path_from(pods_root).to_s\n  result[:react_native_common_dir] = react_native_common_dir_relative\n\n  react_native_audio_api_dir_absolute = File.join(__dir__, '..')\n  react_native_audio_api_dir_relative = Pathname.new(react_native_audio_api_dir_absolute).relative_path_from(pods_root).to_s\n  result[:dynamic_frameworks_audio_api_dir] = react_native_audio_api_dir_relative\n\n  if result[:worklets_enabled] == true\n    react_native_worklets_node_modules_dir = File.join(File.dirname(`cd \"#{Pod::Config.instance.installation_root.to_s}\" && node --print \"require.resolve('react-native-worklets/package.json')\"`), '..')\n    react_native_worklets_dir_absolute = File.join(react_native_worklets_node_modules_dir, 'react-native-worklets')\n    react_native_worklets_dir_relative = Pathname.new(react_native_worklets_dir_absolute).relative_path_from(pods_root).to_s\n    result[:dynamic_frameworks_worklets_dir] = react_native_worklets_dir_relative\n  end\n\n  return result\nend\n"
  },
  {
    "path": "packages/react-native-audio-api/scripts/setup-rn-audio-api-web.js",
    "content": "#!/usr/bin/env node\n\nconst fs = require('fs');\nconst path = require('path');\n\nconst args = process.argv.slice(2);\n\n/**\n * Resolves and returns the absolute path to the SignalsmithStretch.mjs file.\n *\n * @returns {string} The absolute path to the SignalsmithStretch.mjs file.\n */\nfunction getInputFilePath() {\n  return path.resolve(\n    __dirname,\n    '../lib/module/web-core/custom/signalsmithStretch/SignalsmithStretch.mjs'\n  );\n}\n\n/**\n * Generates the output file path for the WebAssembly module.\n *\n * @param {boolean} isExpoAndMetro - A flag indicating whether the environment is Expo and Metro.\n * @returns {string} The resolved output file path.\n */\nfunction getOutputFilePath() {\n  const publicFolder = path.resolve(\n    args[0] || 'public'\n  );\n\n  const publicFile = './signalsmithStretch.mjs';\n  const outputPath = path.join(publicFolder, publicFile);\n\n  console.log(`> Output file path: ${outputPath}\\n`);\n\n  return outputPath;\n}\n\n/**\n * Copies a file from the input path to the output path.\n *\n * @param {string} inputPath - The path of the file to be copied.\n * @param {string} outputPath - The destination path where the file should be copied.\n */\nfunction copyFile(inputPath, outputPath) {\n  const data = fs.readFileSync(inputPath);\n  fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n  fs.writeFileSync(outputPath, data);\n}\n\n(function main() {\n  const inputPath = getInputFilePath();\n  const outputPath = getOutputFilePath();\n\n  copyFile(inputPath, outputPath);\n\n  console.log(`> WebAssembly module setup complete\\n`);\n})();\n"
  },
  {
    "path": "packages/react-native-audio-api/scripts/validate-worklets-version.js",
    "content": "'use strict';\n\nconst semverGte = require('semver/functions/gte');\n\nconst MIN_WORKLETS_VERSION = '0.6.0';\n\n\n/**\n * Checks if the installed version of react-native-worklets is compatible with react-native-audio-api.\n * @returns {boolean} True if the version is compatible, false otherwise.\n */\nfunction validateVersion() {\n  let workletsVersion;\n  try {\n    const { version } = require('react-native-worklets/package.json');\n    workletsVersion = version;\n  } catch (e) {\n    return false;\n  }\n\n  return semverGte(workletsVersion, MIN_WORKLETS_VERSION);\n}\n\nif (!validateVersion()) {\n  console.warn(\n    '[RNAudioApi] Incompatible version of react-native-worklets detected. Please install a compatible version if you want to use worklet nodes in react-native-audio-api.'\n  );\n  process.exit(1);\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/AudioAPIModule/AudioAPIModule.ts",
    "content": "import { NativeAudioAPIModule } from '../specs';\nimport type {\n  WorkletRuntime,\n  IAudioAPIModule,\n  IWorkletsModule,\n} from './ModuleInterfaces';\nimport { AudioApiError } from '../errors';\nimport semverGte from 'semver/functions/gte';\n\nclass AudioAPIModule implements IAudioAPIModule {\n  #workletsModule_: IWorkletsModule | null = null;\n  #canUseWorklets_ = false;\n  #workletsVersion = 'unknown';\n  #workletsAvailable_ = false;\n  private static readonly MIN_WORKLETS_VERSION = '0.6.0';\n\n  constructor() {\n    // Important! Verify and import worklets first\n    // otherwise the native module installation might crash\n    // if react-native-worklets is not imported before audio-api\n    this.#verifyWorklets();\n\n    if (this.#verifyInstallation()) {\n      return;\n    }\n\n    if (!NativeAudioAPIModule) {\n      throw new AudioApiError(\n        `Failed to install react-native-audio-api: The native module could not be found.`\n      );\n    }\n\n    NativeAudioAPIModule.install();\n  }\n\n  #verifyWorklets(): boolean {\n    try {\n      const workletsPackage = require('react-native-worklets');\n      const workletsPackageJson = require('react-native-worklets/package.json');\n      this.#workletsVersion = workletsPackageJson.version;\n      this.#workletsAvailable_ = true;\n\n      this.#canUseWorklets_ = semverGte(\n        this.#workletsVersion,\n        AudioAPIModule.MIN_WORKLETS_VERSION\n      );\n\n      if (this.#canUseWorklets_) {\n        this.#workletsModule_ = workletsPackage;\n      }\n\n      return this.#canUseWorklets_;\n    } catch {\n      this.#canUseWorklets_ = false;\n      return false;\n    }\n  }\n\n  #verifyInstallation(): boolean {\n    return (\n      global.createAudioContext != null &&\n      global.createOfflineAudioContext != null &&\n      global.createAudioRecorder != null &&\n      global.createAudioBuffer != null &&\n      global.createAudioDecoder != null &&\n      global.createAudioStretcher != null &&\n      global.AudioEventEmitter != null\n    );\n  }\n\n  get workletsModule(): IWorkletsModule | null {\n    return this.#workletsModule_;\n  }\n\n  /**\n   * Indicates whether react-native-worklets are installed in matching version,\n   * for usage with react-native-audio-api.\n   */\n  get canUseWorklets(): boolean {\n    return this.#canUseWorklets_;\n  }\n\n  /** Returns the installed worklets version or 'unknown'. */\n  get workletsVersion(): string {\n    return this.#workletsVersion;\n  }\n\n  /**\n   * Indicates whether react-native-worklets are installed, regardless of\n   * version support. Useful for asserting compatibility.\n   */\n  get areWorkletsAvailable(): boolean {\n    return this.#workletsAvailable_;\n  }\n\n  /**\n   * Indicates whether the installed react-native-worklets version is supported.\n   * Useful for asserting compatibility.\n   */\n  get isWorkletsVersionSupported(): boolean {\n    // Note: if areWorkletsAvailable is true, canUseWorklets is equivalent to version check\n    return this.#canUseWorklets_;\n  }\n\n  /** Returns the range of supported worklets versions. */\n  get supportedWorkletsVersion(): string[] {\n    return [`>=${AudioAPIModule.MIN_WORKLETS_VERSION}`];\n  }\n\n  public createAudioRuntime(): WorkletRuntime | null {\n    if (!this.#canUseWorklets_) {\n      return null;\n    }\n\n    return this.#workletsModule_!.createWorkletRuntime('AudioWorkletRuntime');\n  }\n}\n\nexport default new AudioAPIModule();\n"
  },
  {
    "path": "packages/react-native-audio-api/src/AudioAPIModule/AudioAPIModule.web.ts",
    "content": "import type { IAudioAPIModule, IWorkletsModule } from './ModuleInterfaces';\n\nconst mockGetter = <T>(value: T) => value;\n\nclass AudioAPIModule implements IAudioAPIModule {\n  public supportedWorkletsVersion = [];\n  workletsModule = mockGetter(null as IWorkletsModule | null);\n  canUseWorklets = mockGetter(false);\n  workletsVersion = mockGetter('unknown');\n  areWorkletsAvailable = mockGetter(false);\n  isWorkletsVersionSupported = mockGetter(false);\n\n  createAudioRuntime() {\n    return null;\n  }\n}\n\nexport default new AudioAPIModule();\n"
  },
  {
    "path": "packages/react-native-audio-api/src/AudioAPIModule/ModuleInterfaces.ts",
    "content": "import type { ShareableWorkletCallback } from '../interfaces';\n\n// Hint: Copied from react-native-worklets\n// Doesn't really matter what is inside, just need a unique type\nexport interface WorkletRuntime {\n  __hostObjectWorkletRuntime: never;\n  readonly name: string;\n}\n\nexport interface IWorkletsModule {\n  makeShareableCloneRecursive: (\n    workletCallback: ShareableWorkletCallback\n  ) => ShareableWorkletCallback;\n\n  createWorkletRuntime: (runtimeName: string) => WorkletRuntime;\n}\n\nexport interface IAudioAPIModule {\n  get workletsModule(): IWorkletsModule | null;\n  get canUseWorklets(): boolean;\n  get workletsVersion(): string;\n  get areWorkletsAvailable(): boolean;\n  get isWorkletsVersionSupported(): boolean;\n  createAudioRuntime(): WorkletRuntime | null;\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/AudioAPIModule/globals.d.ts",
    "content": "import type {\n  IAudioContext,\n  IAudioDecoder,\n  IAudioEventEmitter,\n  IAudioRecorder,\n  IAudioBuffer,\n  IAudioStretcher,\n  IOfflineAudioContext,\n} from '../interfaces';\n\n/* eslint-disable no-var */\ndeclare global {\n  var createAudioContext: (\n    sampleRate: number,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    audioWorkletRuntime: any\n  ) => IAudioContext;\n  var createOfflineAudioContext: (\n    numberOfChannels: number,\n    length: number,\n    sampleRate: number,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    audioWorkletRuntime: any\n  ) => IOfflineAudioContext;\n\n  var createAudioRecorder: () => IAudioRecorder;\n\n  var createAudioBuffer: (\n    numberOfChannels: number,\n    length: number,\n    sampleRate: number\n  ) => IAudioBuffer;\n\n  var createAudioDecoder: () => IAudioDecoder;\n\n  var createAudioStretcher: () => IAudioStretcher;\n\n  var AudioEventEmitter: IAudioEventEmitter;\n}\n/* eslint-disable no-var */\n"
  },
  {
    "path": "packages/react-native-audio-api/src/AudioAPIModule/index.ts",
    "content": "export { default } from './AudioAPIModule';\n"
  },
  {
    "path": "packages/react-native-audio-api/src/api.ts",
    "content": "import './AudioAPIModule';\n\nexport { default as AnalyserNode } from './core/AnalyserNode';\nexport { default as AudioBuffer } from './core/AudioBuffer';\nexport { default as AudioBufferQueueSourceNode } from './core/AudioBufferQueueSourceNode';\nexport { default as AudioBufferSourceNode } from './core/AudioBufferSourceNode';\nexport { default as AudioContext } from './core/AudioContext';\nexport { decodeAudioData, decodePCMInBase64 } from './core/AudioDecoder';\nexport { default as AudioDestinationNode } from './core/AudioDestinationNode';\nexport { default as AudioNode } from './core/AudioNode';\nexport { default as AudioParam } from './core/AudioParam';\nexport { default as AudioRecorder } from './core/AudioRecorder';\nexport { default as AudioScheduledSourceNode } from './core/AudioScheduledSourceNode';\nexport { default as changePlaybackSpeed } from './core/AudioStretcher';\nexport { default as BaseAudioContext } from './core/BaseAudioContext';\nexport { default as BiquadFilterNode } from './core/BiquadFilterNode';\nexport { default as ConstantSourceNode } from './core/ConstantSourceNode';\nexport { default as ConvolverNode } from './core/ConvolverNode';\nexport { default as DelayNode } from './core/DelayNode';\nexport { default as GainNode } from './core/GainNode';\nexport { default as OfflineAudioContext } from './core/OfflineAudioContext';\nexport { default as OscillatorNode } from './core/OscillatorNode';\nexport { default as PeriodicWave } from './core/PeriodicWave';\nexport { default as RecorderAdapterNode } from './core/RecorderAdapterNode';\nexport { default as StereoPannerNode } from './core/StereoPannerNode';\nexport { default as StreamerNode } from './core/StreamerNode';\nexport { default as WaveShaperNode } from './core/WaveShaperNode';\nexport { default as WorkletNode } from './core/WorkletNode';\nexport { default as WorkletProcessingNode } from './core/WorkletProcessingNode';\nexport { default as WorkletSourceNode } from './core/WorkletSourceNode';\n\nexport * from './errors';\nexport * from './system/types';\nexport * from './types';\nexport type { default as AudioEventSubscription } from './events/AudioEventSubscription';\nexport { default as FilePreset } from './utils/filePresets';\n\n// Notification System\nexport {\n  PlaybackNotificationManager,\n  RecordingNotificationManager,\n} from './system/notification';\n\nexport { default as AudioManager } from './system';\n\nexport {\n  NotificationManager,\n  PlaybackControlName,\n  PlaybackNotificationEventName,\n  PlaybackNotificationInfo,\n} from './system/notification';\n"
  },
  {
    "path": "packages/react-native-audio-api/src/api.web.ts",
    "content": "export { default as AudioBuffer } from './web-core/AudioBuffer';\nexport { default as AudioBufferSourceNode } from './web-core/AudioBufferSourceNode';\nexport { default as AudioContext } from './web-core/AudioContext';\nexport { default as OfflineAudioContext } from './web-core/OfflineAudioContext';\nexport { default as AudioDestinationNode } from './web-core/AudioDestinationNode';\nexport { default as AudioNode } from './web-core/AudioNode';\nexport { default as AnalyserNode } from './web-core/AnalyserNode';\nexport { default as AudioParam } from './web-core/AudioParam';\nexport { default as AudioScheduledSourceNode } from './web-core/AudioScheduledSourceNode';\nexport { default as BaseAudioContext } from './web-core/BaseAudioContext';\nexport { default as BiquadFilterNode } from './web-core/BiquadFilterNode';\nexport { default as DelayNode } from './web-core/DelayNode';\nexport { default as GainNode } from './web-core/GainNode';\nexport { default as OscillatorNode } from './web-core/OscillatorNode';\nexport { default as StereoPannerNode } from './web-core/StereoPannerNode';\nexport { default as ConstantSourceNode } from './web-core/ConstantSourceNode';\nexport { default as ConvolverNode } from './web-core/ConvolverNode';\nexport { default as PeriodicWave } from './web-core/PeriodicWave';\nexport { default as WaveShaperNode } from './web-core/WaveShaperNode';\n\nexport * from './web-core/custom';\n\nexport type {\n  OscillatorType,\n  ChannelCountMode,\n  ChannelInterpretation,\n  ContextState,\n} from './types';\n\nexport type {\n  IOSCategory,\n  IOSMode,\n  IOSOption,\n  SessionOptions,\n  PermissionStatus,\n} from './system/types';\n\nexport * from './system/notification/types';\nexport type { default as AudioEventSubscription } from './events/AudioEventSubscription';\n\nexport {\n  PlaybackNotificationManager,\n  RecordingNotificationManager,\n  AudioManager,\n} from './web-system';\n\nexport {\n  IndexSizeError,\n  InvalidAccessError,\n  InvalidStateError,\n  RangeError,\n  NotSupportedError,\n} from './errors';\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/AnalyserNode.ts",
    "content": "import type BaseAudioContext from './BaseAudioContext';\nimport { IndexSizeError } from '../errors';\nimport { IAnalyserNode } from '../interfaces';\nimport { AnalyserOptions } from '../types';\nimport AudioNode from './AudioNode';\nimport { AnalyserOptionsValidator } from '../options-validators';\n\nexport default class AnalyserNode extends AudioNode {\n  private static allowedFFTSize: number[] = [\n    32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768,\n  ];\n\n  constructor(context: BaseAudioContext, options?: AnalyserOptions) {\n    AnalyserOptionsValidator.validate(options);\n    const analyserNode: IAnalyserNode = context.context.createAnalyser(\n      options || {}\n    );\n    super(context, analyserNode);\n  }\n\n  public get fftSize(): number {\n    return (this.node as IAnalyserNode).fftSize;\n  }\n\n  public set fftSize(value: number) {\n    if (!AnalyserNode.allowedFFTSize.includes(value)) {\n      throw new IndexSizeError(\n        `Provided value (${value}) must be a power of 2 between 32 and 32768`\n      );\n    }\n\n    (this.node as IAnalyserNode).fftSize = value;\n  }\n\n  public get minDecibels(): number {\n    return (this.node as IAnalyserNode).minDecibels;\n  }\n\n  public set minDecibels(value: number) {\n    if (value >= this.maxDecibels) {\n      throw new IndexSizeError(\n        `The minDecibels value (${value}) must be less than maxDecibels`\n      );\n    }\n\n    (this.node as IAnalyserNode).minDecibels = value;\n  }\n\n  public get maxDecibels(): number {\n    return (this.node as IAnalyserNode).maxDecibels;\n  }\n\n  public set maxDecibels(value: number) {\n    if (value <= this.minDecibels) {\n      throw new IndexSizeError(\n        `The maxDecibels value (${value}) must be greater than minDecibels`\n      );\n    }\n\n    (this.node as IAnalyserNode).maxDecibels = value;\n  }\n\n  public get smoothingTimeConstant(): number {\n    return (this.node as IAnalyserNode).smoothingTimeConstant;\n  }\n\n  public set smoothingTimeConstant(value: number) {\n    if (value < 0 || value > 1) {\n      throw new IndexSizeError(\n        `The smoothingTimeConstant value (${value}) must be between 0 and 1`\n      );\n    }\n\n    (this.node as IAnalyserNode).smoothingTimeConstant = value;\n  }\n\n  public get frequencyBinCount(): number {\n    return Math.floor((this.node as IAnalyserNode).fftSize / 2);\n  }\n\n  public getFloatFrequencyData(array: Float32Array): void {\n    (this.node as IAnalyserNode).getFloatFrequencyData(array);\n  }\n\n  public getByteFrequencyData(array: Uint8Array): void {\n    (this.node as IAnalyserNode).getByteFrequencyData(array);\n  }\n\n  public getFloatTimeDomainData(array: Float32Array): void {\n    (this.node as IAnalyserNode).getFloatTimeDomainData(array);\n  }\n\n  public getByteTimeDomainData(array: Uint8Array): void {\n    (this.node as IAnalyserNode).getByteTimeDomainData(array);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/AudioBuffer.ts",
    "content": "import { IAudioBuffer } from '../interfaces';\nimport { IndexSizeError, NotSupportedError } from '../errors';\nimport { AudioBufferOptions } from '../types';\n\nexport default class AudioBuffer {\n  readonly length: number;\n  readonly duration: number;\n  readonly sampleRate: number;\n  readonly numberOfChannels: number;\n  /** @internal */\n  public readonly buffer: IAudioBuffer;\n\n  constructor(options: AudioBufferOptions);\n\n  /** @internal */\n  constructor(buffer: IAudioBuffer);\n\n  /** @internal */\n  constructor(arg: AudioBufferOptions | IAudioBuffer) {\n    this.buffer = this.isAudioBuffer(arg)\n      ? arg\n      : AudioBuffer.createBufferFromOptions(arg);\n    this.length = this.buffer.length;\n    this.duration = this.buffer.duration;\n    this.sampleRate = this.buffer.sampleRate;\n    this.numberOfChannels = this.buffer.numberOfChannels;\n  }\n\n  public getChannelData(channel: number): Float32Array {\n    if (channel < 0 || channel >= this.numberOfChannels) {\n      throw new IndexSizeError(\n        `The channel number provided (${channel}) is outside the range [0, ${this.numberOfChannels - 1}]`\n      );\n    }\n    return this.buffer.getChannelData(channel);\n  }\n\n  public copyFromChannel(\n    destination: Float32Array,\n    channelNumber: number,\n    startInChannel: number = 0\n  ): void {\n    if (channelNumber < 0 || channelNumber >= this.numberOfChannels) {\n      throw new IndexSizeError(\n        `The channel number provided (${channelNumber}) is outside the range [0, ${this.numberOfChannels - 1}]`\n      );\n    }\n\n    if (startInChannel < 0 || startInChannel >= this.length) {\n      throw new IndexSizeError(\n        `The startInChannel number provided (${startInChannel}) is outside the range [0, ${this.length - 1}]`\n      );\n    }\n\n    this.buffer.copyFromChannel(destination, channelNumber, startInChannel);\n  }\n\n  public copyToChannel(\n    source: Float32Array,\n    channelNumber: number,\n    startInChannel: number = 0\n  ): void {\n    if (channelNumber < 0 || channelNumber >= this.numberOfChannels) {\n      throw new IndexSizeError(\n        `The channel number provided (${channelNumber}) is outside the range [0, ${this.numberOfChannels - 1}]`\n      );\n    }\n\n    if (startInChannel < 0 || startInChannel >= this.length) {\n      throw new IndexSizeError(\n        `The startInChannel number provided (${startInChannel}) is outside the range [0, ${this.length - 1}]`\n      );\n    }\n\n    this.buffer.copyToChannel(source, channelNumber, startInChannel);\n  }\n\n  private static createBufferFromOptions(\n    options: AudioBufferOptions\n  ): IAudioBuffer {\n    const { numberOfChannels = 1, length, sampleRate } = options;\n    if (numberOfChannels < 1 || numberOfChannels >= 32) {\n      throw new NotSupportedError(\n        `The number of channels provided (${numberOfChannels}) is outside the range [1, 32]`\n      );\n    }\n    if (length <= 0) {\n      throw new NotSupportedError(\n        `The number of frames provided (${length}) is less than or equal to the minimum bound (0)`\n      );\n    }\n    if (sampleRate < 8000 || sampleRate > 96000) {\n      throw new NotSupportedError(\n        `The sample rate provided (${sampleRate}) is outside the range [8000, 96000]`\n      );\n    }\n    return global.createAudioBuffer(numberOfChannels, length, sampleRate);\n  }\n\n  private isAudioBuffer(obj: unknown): obj is IAudioBuffer {\n    return (\n      typeof obj === 'object' &&\n      obj !== null &&\n      'getChannelData' in obj &&\n      typeof (obj as IAudioBuffer).getChannelData === 'function'\n    );\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/AudioBufferBaseSourceNode.ts",
    "content": "import AudioParam from './AudioParam';\nimport type BaseAudioContext from './BaseAudioContext';\nimport { AudioEventSubscription } from '../events';\nimport { EventTypeWithValue } from '../events/types';\nimport { IAudioBufferBaseSourceNode } from '../interfaces';\nimport AudioScheduledSourceNode from './AudioScheduledSourceNode';\n\nexport default class AudioBufferBaseSourceNode extends AudioScheduledSourceNode {\n  readonly playbackRate: AudioParam;\n  readonly detune: AudioParam;\n  private onPositionChangedSubscription?: AudioEventSubscription;\n  private onPositionChangedCallback?: (event: EventTypeWithValue) => void;\n\n  constructor(context: BaseAudioContext, node: IAudioBufferBaseSourceNode) {\n    super(context, node);\n\n    this.detune = new AudioParam(node.detune, context);\n    this.playbackRate = new AudioParam(node.playbackRate, context);\n  }\n\n  public get onPositionChanged():\n    | ((event: EventTypeWithValue) => void)\n    | undefined {\n    return this.onPositionChangedCallback;\n  }\n\n  public set onPositionChanged(\n    callback: ((event: EventTypeWithValue) => void) | null\n  ) {\n    if (!callback) {\n      (this.node as IAudioBufferBaseSourceNode).onPositionChanged = '0';\n      this.onPositionChangedSubscription?.remove();\n      this.onPositionChangedSubscription = undefined;\n      this.onPositionChangedCallback = undefined;\n\n      return;\n    }\n\n    this.onPositionChangedCallback = callback;\n    this.onPositionChangedSubscription =\n      this.audioEventEmitter.addAudioEventListener('positionChanged', callback);\n\n    (this.node as IAudioBufferBaseSourceNode).onPositionChanged =\n      this.onPositionChangedSubscription.subscriptionId;\n  }\n\n  public get onPositionChangedInterval(): number {\n    return (this.node as IAudioBufferBaseSourceNode).onPositionChangedInterval;\n  }\n\n  public set onPositionChangedInterval(value: number) {\n    (this.node as IAudioBufferBaseSourceNode).onPositionChangedInterval = value;\n  }\n\n  public getLatency(): number {\n    return (\n      (this.node as IAudioBufferBaseSourceNode).getOutputLatency() +\n      (this.node as IAudioBufferBaseSourceNode).getInputLatency() *\n        (this.node as IAudioBufferBaseSourceNode).playbackRate.value\n    );\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/AudioBufferQueueSourceNode.ts",
    "content": "import { IAudioBufferQueueSourceNode } from '../interfaces';\nimport AudioBufferBaseSourceNode from './AudioBufferBaseSourceNode';\nimport AudioBuffer from './AudioBuffer';\nimport { RangeError } from '../errors';\nimport type BaseAudioContext from './BaseAudioContext';\nimport { BaseAudioBufferSourceOptions } from '../types';\nimport { AudioEventSubscription } from '../events';\nimport { OnBufferEndEventType } from '../events/types';\n\nexport default class AudioBufferQueueSourceNode extends AudioBufferBaseSourceNode {\n  private onBufferEndedSubscription?: AudioEventSubscription;\n  private onBufferEndedCallback?: (event: OnBufferEndEventType) => void;\n\n  constructor(\n    context: BaseAudioContext,\n    options?: BaseAudioBufferSourceOptions\n  ) {\n    const node = context.context.createBufferQueueSource(options || {});\n    super(context, node);\n  }\n\n  public enqueueBuffer(buffer: AudioBuffer): string {\n    return (this.node as IAudioBufferQueueSourceNode).enqueueBuffer(\n      buffer.buffer\n    );\n  }\n\n  public dequeueBuffer(bufferId: string): void {\n    const id = parseInt(bufferId, 10);\n    if (isNaN(id) || id < 0) {\n      throw new RangeError(\n        `bufferId must be a non-negative integer: ${bufferId}`\n      );\n    }\n    (this.node as IAudioBufferQueueSourceNode).dequeueBuffer(id);\n  }\n\n  public clearBuffers(): void {\n    (this.node as IAudioBufferQueueSourceNode).clearBuffers();\n  }\n\n  public override start(when: number = 0, offset: number = -1): void {\n    if (when < 0) {\n      throw new RangeError(\n        `when must be a finite non-negative number: ${when}`\n      );\n    }\n\n    if (offset && offset < 0) {\n      throw new RangeError(\n        `offset must be a finite non-negative number: ${offset}`\n      );\n    }\n\n    (this.node as IAudioBufferQueueSourceNode).start(when, offset);\n  }\n\n  public override stop(when: number = 0): void {\n    if (when < 0) {\n      throw new RangeError(\n        `when must be a finite non-negative number: ${when}`\n      );\n    }\n\n    (this.node as IAudioBufferQueueSourceNode).stop(when);\n  }\n\n  public get onBufferEnded():\n    | ((event: OnBufferEndEventType) => void)\n    | undefined {\n    return this.onBufferEndedCallback;\n  }\n\n  public set onBufferEnded(\n    callback: ((event: OnBufferEndEventType) => void) | null\n  ) {\n    if (!callback) {\n      (this.node as IAudioBufferQueueSourceNode).onBufferEnded = '0';\n      this.onBufferEndedSubscription?.remove();\n      this.onBufferEndedSubscription = undefined;\n      this.onBufferEndedCallback = undefined;\n\n      return;\n    }\n\n    this.onBufferEndedCallback = callback;\n    this.onBufferEndedSubscription =\n      this.audioEventEmitter.addAudioEventListener('bufferEnded', callback);\n\n    (this.node as IAudioBufferQueueSourceNode).onBufferEnded =\n      this.onBufferEndedSubscription.subscriptionId;\n  }\n\n  public pause(): void {\n    (this.node as IAudioBufferQueueSourceNode).pause();\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/AudioBufferSourceNode.ts",
    "content": "import { IAudioBufferSourceNode } from '../interfaces';\nimport AudioBufferBaseSourceNode from './AudioBufferBaseSourceNode';\nimport AudioBuffer from './AudioBuffer';\nimport { InvalidStateError, RangeError } from '../errors';\nimport { EventEmptyType } from '../events/types';\nimport { AudioEventSubscription } from '../events';\nimport { AudioBufferSourceOptions } from '../types';\nimport type BaseAudioContext from './BaseAudioContext';\n\nexport default class AudioBufferSourceNode extends AudioBufferBaseSourceNode {\n  private onLoopEndedSubscription?: AudioEventSubscription;\n  private onLoopEndedCallback?: (event: EventEmptyType) => void;\n\n  private _buffer: AudioBuffer | null = null;\n  private bufferHasBeenSet: boolean = false;\n\n  constructor(context: BaseAudioContext, options?: AudioBufferSourceOptions) {\n    const node = context.context.createBufferSource(options || {});\n    super(context, node);\n\n    if (options?.buffer) {\n      this._buffer = options.buffer;\n      this.bufferHasBeenSet = true;\n    }\n  }\n\n  public get buffer(): AudioBuffer | null {\n    return this._buffer;\n  }\n\n  public set buffer(buffer: AudioBuffer | null) {\n    if (buffer === null) {\n      if (this.buffer !== null) {\n        (this.node as IAudioBufferSourceNode).setBuffer(null);\n        this._buffer = null;\n      }\n\n      return;\n    }\n\n    if (this.bufferHasBeenSet) {\n      throw new InvalidStateError(\n        'The buffer can only be set once and cannot be changed afterwards.'\n      );\n    }\n\n    (this.node as IAudioBufferSourceNode).setBuffer(buffer.buffer);\n    this._buffer = buffer;\n    this.bufferHasBeenSet = true;\n  }\n\n  public get loopSkip(): boolean {\n    return (this.node as IAudioBufferSourceNode).loopSkip;\n  }\n\n  public set loopSkip(value: boolean) {\n    (this.node as IAudioBufferSourceNode).loopSkip = value;\n  }\n\n  public get loop(): boolean {\n    return (this.node as IAudioBufferSourceNode).loop;\n  }\n\n  public set loop(value: boolean) {\n    (this.node as IAudioBufferSourceNode).loop = value;\n  }\n\n  public get loopStart(): number {\n    return (this.node as IAudioBufferSourceNode).loopStart;\n  }\n\n  public set loopStart(value: number) {\n    (this.node as IAudioBufferSourceNode).loopStart = value;\n  }\n\n  public get loopEnd(): number {\n    return (this.node as IAudioBufferSourceNode).loopEnd;\n  }\n\n  public set loopEnd(value: number) {\n    (this.node as IAudioBufferSourceNode).loopEnd = value;\n  }\n\n  public start(when: number = 0, offset: number = 0, duration?: number): void {\n    if (when < 0) {\n      throw new RangeError(\n        `when must be a finite non-negative number: ${when}`\n      );\n    }\n\n    if (offset < 0) {\n      throw new RangeError(\n        `offset must be a finite non-negative number: ${offset}`\n      );\n    }\n\n    if (duration && duration < 0) {\n      throw new RangeError(\n        `duration must be a finite non-negative number: ${duration}`\n      );\n    }\n\n    if (this.hasBeenStarted) {\n      throw new InvalidStateError('Cannot call start more than once');\n    }\n\n    this.hasBeenStarted = true;\n    (this.node as IAudioBufferSourceNode).start(when, offset, duration);\n  }\n\n  public get onLoopEnded(): ((event: EventEmptyType) => void) | undefined {\n    return this.onLoopEndedCallback;\n  }\n\n  public set onLoopEnded(callback: ((event: EventEmptyType) => void) | null) {\n    if (!callback) {\n      (this.node as IAudioBufferSourceNode).onLoopEnded = '0';\n      this.onLoopEndedSubscription?.remove();\n      this.onLoopEndedSubscription = undefined;\n      this.onLoopEndedCallback = undefined;\n\n      return;\n    }\n\n    this.onLoopEndedCallback = callback;\n    this.onLoopEndedSubscription = this.audioEventEmitter.addAudioEventListener(\n      'loopEnded',\n      callback\n    );\n\n    (this.node as IAudioBufferSourceNode).onLoopEnded =\n      this.onLoopEndedSubscription.subscriptionId;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/AudioContext.ts",
    "content": "import AudioAPIModule from '../AudioAPIModule';\nimport { NotSupportedError } from '../errors';\nimport { IAudioContext } from '../interfaces';\nimport AudioManager from '../system';\nimport { AudioContextOptions } from '../types';\nimport BaseAudioContext from './BaseAudioContext';\n\nexport default class AudioContext extends BaseAudioContext {\n  constructor(options?: AudioContextOptions) {\n    if (\n      options &&\n      options.sampleRate &&\n      (options.sampleRate < 8000 || options.sampleRate > 96000)\n    ) {\n      throw new NotSupportedError(\n        `The provided sampleRate is not supported: ${options.sampleRate}`\n      );\n    }\n\n    const audioRuntime = AudioAPIModule.createAudioRuntime();\n\n    super(\n      global.createAudioContext(\n        options?.sampleRate || AudioManager.getDevicePreferredSampleRate(),\n        audioRuntime\n      )\n    );\n  }\n\n  async close(): Promise<void> {\n    return (this.context as IAudioContext).close();\n  }\n\n  async resume(): Promise<boolean> {\n    return (this.context as IAudioContext).resume();\n  }\n\n  async suspend(): Promise<boolean> {\n    return (this.context as IAudioContext).suspend();\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/AudioDecoder.ts",
    "content": "import { Image, Platform } from 'react-native';\nimport { NativeAudioAPIModule } from '../specs';\n\nimport { AudioApiError } from '../errors';\nimport { IAudioDecoder } from '../interfaces';\nimport { DecodeDataInput } from '../types';\nimport {\n  isBase64Source,\n  isDataBlobString,\n  isRemoteSource,\n} from '../utils/paths';\nimport { base64ToArrayBuffer } from '../utils';\nimport AudioBuffer from './AudioBuffer';\n\nclass AudioDecoder {\n  private static instance: AudioDecoder | null = null;\n  protected readonly decoder: IAudioDecoder;\n\n  private constructor() {\n    this.decoder = global.createAudioDecoder();\n  }\n\n  private async decodeAudioDataImplementation(\n    input: DecodeDataInput,\n    sampleRate?: number,\n    fetchOptions?: RequestInit\n  ): Promise<AudioBuffer | null | undefined> {\n    const rate = sampleRate ?? 0;\n\n    if (input instanceof ArrayBuffer) {\n      return this.decodeFromArrayBuffer(input, rate);\n    }\n\n    const stringSource = this.resolveStringSource(input);\n    this.assertSupportedStringSource(stringSource);\n\n    if (isRemoteSource(stringSource)) {\n      return this.decodeFromRemoteUrl(stringSource, rate, fetchOptions);\n    }\n\n    return this.decodeFromLocalFile(stringSource, rate);\n  }\n\n  private async decodeFromArrayBuffer(\n    arrayBuffer: ArrayBuffer,\n    sampleRate: number\n  ): Promise<AudioBuffer> {\n    const buffer = await this.decoder.decodeWithMemoryBlock(\n      // @ts-ignore internal function\n      new Uint8Array(arrayBuffer),\n      sampleRate\n    );\n    return new AudioBuffer(buffer);\n  }\n\n  private resolveStringSource(input: number | string): string | number {\n    return typeof input === 'number'\n      ? Image.resolveAssetSource(input).uri\n      : input;\n  }\n\n  private assertSupportedStringSource(\n    source: string | number\n  ): asserts source is string {\n    if (typeof source !== 'string') {\n      throw new TypeError('Input must be a module, uri or ArrayBuffer');\n    }\n    if (isBase64Source(source)) {\n      throw new AudioApiError(\n        'Base64 source decoding is not currently supported, to decode raw PCM base64 strings use decodePCMInBase64 method.'\n      );\n    }\n    if (isDataBlobString(source)) {\n      throw new AudioApiError(\n        'Data Blob string decoding is not currently supported.'\n      );\n    }\n  }\n\n  private async decodeFromRemoteUrl(\n    url: string,\n    sampleRate: number,\n    fetchOptions?: RequestInit\n  ): Promise<AudioBuffer> {\n    const arrayBuffer = await fetch(url, fetchOptions).then((res) =>\n      res.arrayBuffer()\n    );\n    return this.decodeFromArrayBuffer(arrayBuffer, sampleRate);\n  }\n\n  private resolveLocalFilePath(stringSource: string): string {\n    return stringSource.startsWith('file://')\n      ? stringSource.replace('file://', '')\n      : stringSource;\n  }\n\n  private async decodeFromLocalFile(\n    stringSource: string,\n    sampleRate: number\n  ): Promise<AudioBuffer> {\n    const useAndroidBundledAssetReader =\n      Platform.OS === 'android' &&\n      !stringSource.startsWith('file://') &&\n      !__DEV__;\n\n    // special workaround, because android bundled assets are passed as f.e. asset_example_file\n    // which has to be handled on native side and extension is not passed with it so decode using memory\n    if (useAndroidBundledAssetReader) {\n      const base64Payload =\n        await NativeAudioAPIModule.readAndroidReleaseAssetBytesAsBase64(\n          stringSource\n        );\n      const arrayBuffer = base64ToArrayBuffer(base64Payload);\n      return this.decodeFromArrayBuffer(arrayBuffer, sampleRate);\n    }\n\n    const filePath = this.resolveLocalFilePath(stringSource);\n    const buffer = await this.decoder.decodeWithFilePath(filePath, sampleRate);\n    return new AudioBuffer(buffer);\n  }\n\n  public static getInstance(): AudioDecoder {\n    if (!AudioDecoder.instance) {\n      AudioDecoder.instance = new AudioDecoder();\n    }\n\n    return AudioDecoder.instance;\n  }\n\n  public async decodeAudioDataInstance(\n    input: DecodeDataInput,\n    sampleRate?: number,\n    fetchOptions?: RequestInit\n  ): Promise<AudioBuffer> {\n    const audioBuffer = await this.decodeAudioDataImplementation(\n      input,\n      sampleRate,\n      fetchOptions\n    );\n\n    if (!audioBuffer) {\n      throw new AudioApiError('Failed to decode audio data.');\n    }\n\n    return audioBuffer;\n  }\n\n  public async decodePCMInBase64Instance(\n    base64String: string,\n    inputSampleRate: number,\n    inputChannelCount: number,\n    interleaved: boolean\n  ): Promise<AudioBuffer> {\n    const buffer = await this.decoder.decodeWithPCMInBase64(\n      base64String,\n      inputSampleRate,\n      inputChannelCount,\n      interleaved\n    );\n    return new AudioBuffer(buffer);\n  }\n}\n\nexport async function decodeAudioData(\n  input: DecodeDataInput,\n  sampleRate?: number,\n  fetchOptions?: RequestInit\n): Promise<AudioBuffer> {\n  return AudioDecoder.getInstance().decodeAudioDataInstance(\n    input,\n    sampleRate,\n    fetchOptions\n  );\n}\n\nexport async function decodePCMInBase64(\n  base64String: string,\n  inputSampleRate: number,\n  inputChannelCount: number,\n  isInterleaved: boolean = true\n): Promise<AudioBuffer> {\n  return AudioDecoder.getInstance().decodePCMInBase64Instance(\n    base64String,\n    inputSampleRate,\n    inputChannelCount,\n    isInterleaved\n  );\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/AudioDestinationNode.ts",
    "content": "import AudioNode from './AudioNode';\n\nexport default class AudioDestinationNode extends AudioNode {}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/AudioNode.ts",
    "content": "import { IAudioNode } from '../interfaces';\nimport AudioParam from './AudioParam';\nimport { ChannelCountMode, ChannelInterpretation } from '../types';\nimport type BaseAudioContext from './BaseAudioContext';\nimport { InvalidAccessError } from '../errors';\n\nexport default class AudioNode {\n  readonly context: BaseAudioContext;\n  readonly numberOfInputs: number;\n  readonly numberOfOutputs: number;\n  readonly channelCount: number;\n  readonly channelCountMode: ChannelCountMode;\n  readonly channelInterpretation: ChannelInterpretation;\n  protected readonly node: IAudioNode;\n\n  constructor(context: BaseAudioContext, node: IAudioNode) {\n    this.context = context;\n    this.node = node;\n    this.numberOfInputs = this.node.numberOfInputs;\n    this.numberOfOutputs = this.node.numberOfOutputs;\n    this.channelCount = this.node.channelCount;\n    this.channelCountMode = this.node.channelCountMode;\n    this.channelInterpretation = this.node.channelInterpretation;\n  }\n\n  public connect(destination: AudioNode): AudioNode;\n  public connect(destination: AudioParam): void;\n  public connect(destination: AudioNode | AudioParam): AudioNode | void {\n    if (this.context !== destination.context) {\n      throw new InvalidAccessError(\n        'Source and destination are from different BaseAudioContexts'\n      );\n    }\n\n    if (destination instanceof AudioParam) {\n      this.node.connect(destination.audioParam);\n    } else {\n      this.node.connect(destination.node);\n      return destination;\n    }\n  }\n\n  public disconnect(destination?: AudioNode | AudioParam): void {\n    if (destination instanceof AudioParam) {\n      this.node.disconnect(destination.audioParam);\n    } else {\n      this.node.disconnect(destination?.node);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/AudioParam.ts",
    "content": "import { AutomationEventData, AutomationEventType } from '../types';\nimport { InvalidStateError, NotSupportedError, RangeError } from '../errors';\nimport { IAudioParam } from '../interfaces';\nimport type BaseAudioContext from './BaseAudioContext';\n\nexport default class AudioParam {\n  public readonly defaultValue: number;\n  public readonly minValue: number;\n  public readonly maxValue: number;\n\n  constructor(\n    public readonly audioParam: IAudioParam,\n    public readonly context: BaseAudioContext\n  ) {\n    this.value = audioParam.value;\n    this.defaultValue = audioParam.defaultValue;\n    this.minValue = audioParam.minValue;\n    this.maxValue = audioParam.maxValue;\n  }\n\n  public get value(): number {\n    return this.audioParam.value;\n  }\n\n  public set value(value: number) {\n    this.audioParam.value = value;\n  }\n\n  public setValueAtTime(value: number, startTime: number): AudioParam {\n    if (startTime < 0) {\n      throw new RangeError(\n        `startTime must be a finite non-negative number: ${startTime}`\n      );\n    }\n\n    this.checkCurveExclusion({\n      type: AutomationEventType.SET_VALUE,\n      automationTime: startTime,\n    });\n\n    const clampedTime = Math.max(startTime, this.context.currentTime);\n    this.audioParam.setValueAtTime(value, clampedTime);\n\n    return this;\n  }\n\n  public linearRampToValueAtTime(value: number, endTime: number): AudioParam {\n    if (endTime < 0) {\n      throw new RangeError(\n        `endTime must be a finite non-negative number: ${endTime}`\n      );\n    }\n\n    this.checkCurveExclusion({\n      type: AutomationEventType.LINEAR_RAMP,\n      automationTime: endTime,\n    });\n\n    const clampedTime = Math.max(endTime, this.context.currentTime);\n    this.audioParam.linearRampToValueAtTime(value, clampedTime);\n\n    return this;\n  }\n\n  public exponentialRampToValueAtTime(\n    value: number,\n    endTime: number\n  ): AudioParam {\n    if (value === 0) {\n      throw new RangeError(`value must be a non-zero number: ${value}`);\n    }\n\n    if (endTime <= 0) {\n      throw new RangeError(\n        `endTime must be a finite non-negative number: ${endTime}`\n      );\n    }\n\n    this.checkCurveExclusion({\n      type: AutomationEventType.EXPONENTIAL_RAMP,\n      automationTime: endTime,\n    });\n\n    const clampedTime = Math.max(endTime, this.context.currentTime);\n    this.audioParam.exponentialRampToValueAtTime(value, clampedTime);\n\n    return this;\n  }\n\n  public setTargetAtTime(\n    target: number,\n    startTime: number,\n    timeConstant: number\n  ): AudioParam {\n    if (startTime < 0) {\n      throw new RangeError(\n        `startTime must be a finite non-negative number: ${startTime}`\n      );\n    }\n\n    if (timeConstant < 0) {\n      throw new RangeError(\n        `timeConstant must be a finite non-negative number: ${timeConstant}`\n      );\n    }\n\n    this.checkCurveExclusion({\n      type: AutomationEventType.SET_TARGET,\n      automationTime: startTime,\n    });\n\n    const clampedTime = Math.max(startTime, this.context.currentTime);\n    this.audioParam.setTargetAtTime(target, clampedTime, timeConstant);\n\n    return this;\n  }\n\n  public setValueCurveAtTime(\n    values: Float32Array,\n    startTime: number,\n    duration: number\n  ): AudioParam {\n    if (startTime < 0) {\n      throw new RangeError(\n        `startTime must be a finite non-negative number: ${startTime}`\n      );\n    }\n\n    if (duration <= 0) {\n      throw new RangeError(\n        `duration must be a finite strictly-positive number: ${duration}`\n      );\n    }\n\n    if (values.length < 2) {\n      throw new InvalidStateError(`values must contain at least two values`);\n    }\n\n    this.checkCurveExclusion({\n      type: AutomationEventType.SET_VALUE_CURVE,\n      automationTime: startTime,\n      duration,\n    });\n\n    const clampedTime = Math.max(startTime, this.context.currentTime);\n    this.audioParam.setValueCurveAtTime(values, clampedTime, duration);\n\n    return this;\n  }\n\n  public cancelScheduledValues(cancelTime: number): AudioParam {\n    if (cancelTime < 0) {\n      throw new RangeError(\n        `cancelTime must be a finite non-negative number: ${cancelTime}`\n      );\n    }\n\n    const clampedTime = Math.max(cancelTime, this.context.currentTime);\n    this.audioParam.cancelScheduledValues(clampedTime);\n\n    return this;\n  }\n\n  public cancelAndHoldAtTime(cancelTime: number): AudioParam {\n    if (cancelTime < 0) {\n      throw new RangeError(\n        `cancelTime must be a finite non-negative number: ${cancelTime}`\n      );\n    }\n\n    const clampedTime = Math.max(cancelTime, this.context.currentTime);\n    this.audioParam.cancelAndHoldAtTime(clampedTime);\n\n    return this;\n  }\n\n  private checkCurveExclusion(eventData: AutomationEventData): void {\n    const checkExclusionResult = this.audioParam.checkCurveExclusion(eventData);\n\n    if (checkExclusionResult.status === 'error') {\n      throw new NotSupportedError(checkExclusionResult.message);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/AudioRecorder.ts",
    "content": "import { AudioApiError } from '../errors';\nimport { AudioEventEmitter, AudioEventSubscription } from '../events';\nimport {\n  OnAudioReadyEventType,\n  OnRecorderErrorEventType,\n} from '../events/types';\nimport { IAudioRecorder } from '../interfaces';\nimport {\n  AudioRecorderCallbackOptions,\n  AudioRecorderFileOptions,\n  AudioRecorderStartOptions,\n  FileDirectory,\n  FileFormat,\n  FileInfo,\n  Result,\n} from '../types';\nimport FilePreset from '../utils/filePresets';\nimport AudioBuffer from './AudioBuffer';\nimport RecorderAdapterNode from './RecorderAdapterNode';\n\n// Enforces default options, making sure that all properties are defined\n// for the contract with native code.\nfunction withDefaultOptions(\n  inOptions: AudioRecorderFileOptions\n): Required<AudioRecorderFileOptions> {\n  return {\n    directory: FileDirectory.Cache,\n    subDirectory: 'AudioAPI',\n    fileNamePrefix: 'recording',\n    channelCount: 2,\n    format: FileFormat.M4A,\n    preset: FilePreset.High,\n    androidFlushIntervalMs: 500,\n    rotateIntervalBytes: 0,\n    ...inOptions,\n  };\n}\n\nexport default class AudioRecorder {\n  protected onAudioReadySubscription: AudioEventSubscription | null = null;\n  protected onErrorSubscription: AudioEventSubscription | null = null;\n  protected readonly recorder: IAudioRecorder;\n  protected options_: AudioRecorderFileOptions | null = null;\n  private isFileOutputEnabled: boolean = false;\n\n  protected readonly audioEventEmitter = new AudioEventEmitter(\n    global.AudioEventEmitter\n  );\n\n  constructor() {\n    this.recorder = global.createAudioRecorder();\n  }\n\n  enableFileOutput(options?: AudioRecorderFileOptions): Result<{}> {\n    this.options_ = options || {};\n    const parsedOptions = withDefaultOptions(this.options_);\n    const result = this.recorder.enableFileOutput(parsedOptions);\n    this.isFileOutputEnabled = true;\n\n    return result;\n  }\n\n  public get options(): AudioRecorderFileOptions | null {\n    return this.options_;\n  }\n\n  disableFileOutput(): void {\n    this.options_ = null;\n    this.recorder.disableFileOutput();\n    this.isFileOutputEnabled = false;\n  }\n\n  /** Starts the audio recording process with configured output options */\n  start(options?: AudioRecorderStartOptions): Result<{}> {\n    if (!this.isFileOutputEnabled) {\n      this.recorder.start();\n      return { status: 'success' };\n    }\n\n    return this.recorder.start(options?.fileNameOverride);\n  }\n\n  /** Stops the audio recording process and releases internal resources */\n  stop(): Result<FileInfo> {\n    return this.recorder.stop();\n  }\n\n  /** Pauses the audio recording process without tearing down anything */\n  pause(): void {\n    this.recorder.pause();\n  }\n\n  /** Resumes the audio recording process after being paused */\n  resume(): void {\n    this.recorder.resume();\n  }\n\n  /**\n   * Connects a {@link RecorderAdapterNode} to the recorder’s audio graph.\n   *\n   * Each node can only be connected once. Attempting to connect a node multiple\n   * times will throw an error.\n   *\n   * @param node - The adapter node to connect to the recorder.\n   * @throws If the node has already been connected.\n   */\n  connect(node: RecorderAdapterNode): void {\n    if (node.wasConnected) {\n      throw new AudioApiError(\n        'RecorderAdapterNode cannot be connected more than once. Refer to the documentation for more details.'\n      );\n    }\n\n    node.wasConnected = true;\n    this.recorder.connect(node.getNode());\n  }\n\n  /**\n   * Disconnects the recorder from all connected adapter nodes.\n   *\n   * After calling this method, any connected {@link RecorderAdapterNode} will no\n   * longer receive audio data until reconnected.\n   */\n  disconnect(): void {\n    this.recorder.disconnect();\n  }\n\n  /**\n   * Registers a callback to receive raw audio data during an active recording\n   * session.\n   *\n   * The callback is periodically invoked with audio buffers that match the\n   * preferred configuration provided in `options`. These parameters (sample\n   * rate, buffer length, and channel count) guide how audio data is chunked and\n   * delivered, though the exact values may vary depending on device\n   * capabilities. Values may vary depending on device capabilities.\n   *\n   * @param options - Preferred configuration for the audio buffers delivered to\n   *   the callback.\n   * @param callback - Function invoked each time a new audio buffer is\n   *   available. The callback receives an {@link OnAudioReadyEventType} object\n   *   containing the audio data and associated metadata.\n   */\n  onAudioReady(\n    options: AudioRecorderCallbackOptions,\n    callback: (event: OnAudioReadyEventType) => void\n  ): Result<void> {\n    if (this.onAudioReadySubscription) {\n      this.recorder.clearOnAudioReady();\n      this.onAudioReadySubscription.remove();\n      this.onAudioReadySubscription = null;\n    }\n\n    this.onAudioReadySubscription =\n      this.audioEventEmitter.addAudioEventListener('audioReady', (event) => {\n        const audioBuffer = new AudioBuffer(event.buffer);\n        callback({\n          ...event,\n          buffer: audioBuffer,\n        });\n      });\n\n    return this.recorder.setOnAudioReady({\n      sampleRate: options.sampleRate,\n      bufferLength: options.bufferLength,\n      channelCount: options.channelCount,\n      callbackId: this.onAudioReadySubscription.subscriptionId,\n    });\n  }\n\n  /**\n   * Removes the previously registered audio data callback, if any.\n   *\n   * This stops further `onAudioReady` events from being delivered during\n   * recording. Calling this method is safe even if no callback is currently\n   * registered.\n   */\n  clearOnAudioReady(): void {\n    if (!this.onAudioReadySubscription) {\n      return;\n    }\n\n    this.recorder.clearOnAudioReady();\n\n    this.onAudioReadySubscription.remove();\n    this.onAudioReadySubscription = null;\n  }\n\n  isRecording(): boolean {\n    return this.recorder.isRecording();\n  }\n\n  isPaused(): boolean {\n    return this.recorder.isPaused();\n  }\n\n  getCurrentDuration(): number {\n    return this.recorder.getCurrentDuration();\n  }\n\n  onError(callback: (error: OnRecorderErrorEventType) => void): void {\n    if (this.onErrorSubscription) {\n      this.recorder.clearOnError();\n      this.onErrorSubscription.remove();\n      this.onErrorSubscription = null;\n    }\n\n    this.onErrorSubscription = this.audioEventEmitter.addAudioEventListener(\n      'recorderError',\n      callback\n    );\n\n    this.recorder.setOnError({\n      callbackId: this.onErrorSubscription.subscriptionId,\n    });\n  }\n\n  clearOnError(): void {\n    if (!this.onErrorSubscription) {\n      return;\n    }\n\n    this.recorder.clearOnError();\n\n    this.onErrorSubscription.remove();\n    this.onErrorSubscription = null;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/AudioScheduledSourceNode.ts",
    "content": "import { IAudioScheduledSourceNode } from '../interfaces';\nimport AudioNode from './AudioNode';\nimport { InvalidStateError, RangeError } from '../errors';\nimport { EventEmptyType } from '../events/types';\nimport { AudioEventEmitter, AudioEventSubscription } from '../events';\n\nexport default class AudioScheduledSourceNode extends AudioNode {\n  protected hasBeenStarted: boolean = false;\n  protected readonly audioEventEmitter = new AudioEventEmitter(\n    global.AudioEventEmitter\n  );\n\n  private onEndedSubscription?: AudioEventSubscription;\n  private onEndedCallback?: (event: EventEmptyType) => void;\n\n  public start(when: number = 0): void {\n    if (when < 0) {\n      throw new RangeError(\n        `when must be a finite non-negative number: ${when}`\n      );\n    }\n\n    if (this.hasBeenStarted) {\n      throw new InvalidStateError('Cannot call start more than once');\n    }\n\n    this.hasBeenStarted = true;\n    (this.node as IAudioScheduledSourceNode).start(when);\n  }\n\n  public stop(when: number = 0): void {\n    if (when < 0) {\n      throw new RangeError(\n        `when must be a finite non-negative number: ${when}`\n      );\n    }\n\n    if (!this.hasBeenStarted) {\n      throw new InvalidStateError(\n        'Cannot call stop without calling start first'\n      );\n    }\n\n    (this.node as IAudioScheduledSourceNode).stop(when);\n  }\n\n  public get onEnded(): ((event: EventEmptyType) => void) | undefined {\n    return this.onEndedCallback;\n  }\n\n  public set onEnded(callback: ((event: EventEmptyType) => void) | null) {\n    if (!callback) {\n      (this.node as IAudioScheduledSourceNode).onEnded = '0';\n      this.onEndedSubscription?.remove();\n      this.onEndedSubscription = undefined;\n      this.onEndedCallback = undefined;\n      return;\n    }\n\n    this.onEndedCallback = callback;\n    this.onEndedSubscription = this.audioEventEmitter.addAudioEventListener(\n      'ended',\n      callback\n    );\n\n    (this.node as IAudioScheduledSourceNode).onEnded =\n      this.onEndedSubscription.subscriptionId;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/AudioStretcher.ts",
    "content": "import { IAudioStretcher } from '../interfaces';\nimport AudioBuffer from './AudioBuffer';\nimport { AudioApiError } from '../errors';\n\nclass AudioStretcher {\n  private static instance: AudioStretcher | null = null;\n  protected readonly stretcher: IAudioStretcher;\n\n  private constructor() {\n    this.stretcher = global.createAudioStretcher();\n  }\n\n  public static getInstance(): AudioStretcher {\n    if (!AudioStretcher.instance) {\n      AudioStretcher.instance = new AudioStretcher();\n    }\n    return AudioStretcher.instance;\n  }\n\n  public async changePlaybackSpeedInstance(\n    input: AudioBuffer,\n    playbackSpeed: number\n  ): Promise<AudioBuffer> {\n    const buffer = await this.stretcher.changePlaybackSpeed(\n      input.buffer,\n      playbackSpeed\n    );\n\n    if (!buffer) {\n      throw new AudioApiError('Failed to change playback speed');\n    }\n    return new AudioBuffer(buffer);\n  }\n}\n\nexport default async function changePlaybackSpeed(\n  input: AudioBuffer,\n  playbackSpeed: number\n): Promise<AudioBuffer> {\n  return AudioStretcher.getInstance().changePlaybackSpeedInstance(\n    input,\n    playbackSpeed\n  );\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/BaseAudioContext.ts",
    "content": "import {\n  InvalidAccessError,\n  InvalidStateError,\n  NotSupportedError,\n} from '../errors';\nimport { IBaseAudioContext } from '../interfaces';\nimport { AudioWorkletRuntime, ContextState, DecodeDataInput } from '../types';\nimport { assertWorkletsEnabled } from '../utils';\nimport AnalyserNode from './AnalyserNode';\nimport AudioBuffer from './AudioBuffer';\nimport AudioBufferQueueSourceNode from './AudioBufferQueueSourceNode';\nimport AudioBufferSourceNode from './AudioBufferSourceNode';\nimport { decodeAudioData, decodePCMInBase64 } from './AudioDecoder';\nimport AudioDestinationNode from './AudioDestinationNode';\nimport BiquadFilterNode from './BiquadFilterNode';\nimport ConstantSourceNode from './ConstantSourceNode';\nimport ConvolverNode from './ConvolverNode';\nimport DelayNode from './DelayNode';\nimport GainNode from './GainNode';\nimport IIRFilterNode from './IIRFilterNode';\nimport OscillatorNode from './OscillatorNode';\nimport PeriodicWave from './PeriodicWave';\nimport RecorderAdapterNode from './RecorderAdapterNode';\nimport StereoPannerNode from './StereoPannerNode';\nimport StreamerNode from './StreamerNode';\nimport WaveShaperNode from './WaveShaperNode';\nimport WorkletNode from './WorkletNode';\nimport WorkletProcessingNode from './WorkletProcessingNode';\nimport WorkletSourceNode from './WorkletSourceNode';\n\nexport default class BaseAudioContext {\n  readonly destination: AudioDestinationNode;\n  readonly sampleRate: number;\n  readonly context: IBaseAudioContext;\n\n  constructor(context: IBaseAudioContext) {\n    this.context = context;\n    this.destination = new AudioDestinationNode(this, context.destination);\n    this.sampleRate = context.sampleRate;\n  }\n\n  public get currentTime(): number {\n    return this.context.currentTime;\n  }\n\n  public get state(): ContextState {\n    return this.context.state;\n  }\n\n  public async decodeAudioData(\n    input: DecodeDataInput,\n    fetchOptions?: RequestInit\n  ): Promise<AudioBuffer> {\n    return await decodeAudioData(input, this.sampleRate, fetchOptions);\n  }\n\n  public async decodePCMInBase64(\n    base64String: string,\n    inputSampleRate: number,\n    inputChannelCount: number,\n    isInterleaved: boolean = true\n  ): Promise<AudioBuffer> {\n    return await decodePCMInBase64(\n      base64String,\n      inputSampleRate,\n      inputChannelCount,\n      isInterleaved\n    );\n  }\n\n  createWorkletNode(\n    callback: (audioData: Array<Float32Array>, channelCount: number) => void,\n    bufferLength: number,\n    inputChannelCount: number,\n    workletRuntime: AudioWorkletRuntime = 'AudioRuntime'\n  ): WorkletNode {\n    if (inputChannelCount < 1 || inputChannelCount > 32) {\n      throw new NotSupportedError(\n        `The number of input channels provided (${inputChannelCount}) can not be less than 1 or greater than 32`\n      );\n    }\n\n    if (bufferLength < 1) {\n      throw new NotSupportedError(\n        `The buffer length provided (${bufferLength}) can not be less than 1`\n      );\n    }\n\n    assertWorkletsEnabled();\n    return new WorkletNode(\n      this,\n      workletRuntime,\n      callback,\n      bufferLength,\n      inputChannelCount\n    );\n  }\n\n  createWorkletProcessingNode(\n    callback: (\n      inputData: Array<Float32Array>,\n      outputData: Array<Float32Array>,\n      framesToProcess: number,\n      currentTime: number\n    ) => void,\n    workletRuntime: AudioWorkletRuntime = 'AudioRuntime'\n  ): WorkletProcessingNode {\n    assertWorkletsEnabled();\n    return new WorkletProcessingNode(this, workletRuntime, callback);\n  }\n\n  createWorkletSourceNode(\n    callback: (\n      audioData: Array<Float32Array>,\n      framesToProcess: number,\n      currentTime: number,\n      startOffset: number\n    ) => void,\n    workletRuntime: AudioWorkletRuntime = 'AudioRuntime'\n  ): WorkletSourceNode {\n    assertWorkletsEnabled();\n    return new WorkletSourceNode(this, workletRuntime, callback);\n  }\n\n  createRecorderAdapter(): RecorderAdapterNode {\n    return new RecorderAdapterNode(this);\n  }\n\n  createOscillator(): OscillatorNode {\n    return new OscillatorNode(this);\n  }\n\n  createStreamer(streamPath: string): StreamerNode {\n    return new StreamerNode(this, { streamPath });\n  }\n\n  createConstantSource(): ConstantSourceNode {\n    return new ConstantSourceNode(this);\n  }\n\n  createGain(): GainNode {\n    return new GainNode(this);\n  }\n\n  createDelay(maxDelayTime?: number): DelayNode {\n    if (maxDelayTime !== undefined) {\n      return new DelayNode(this, { maxDelayTime });\n    } else {\n      return new DelayNode(this);\n    }\n  }\n\n  createStereoPanner(): StereoPannerNode {\n    return new StereoPannerNode(this);\n  }\n\n  createBiquadFilter(): BiquadFilterNode {\n    return new BiquadFilterNode(this);\n  }\n\n  createBufferSource(options?: {\n    pitchCorrection: boolean;\n  }): AudioBufferSourceNode {\n    if (options !== undefined) {\n      return new AudioBufferSourceNode(this, options);\n    } else {\n      return new AudioBufferSourceNode(this);\n    }\n  }\n\n  createIIRFilter(feedforward: number[], feedback: number[]): IIRFilterNode {\n    if (feedforward.length < 1 || feedforward.length > 20) {\n      throw new NotSupportedError(\n        `The provided feedforward array has length (${feedforward.length}) outside the range [1, 20]`\n      );\n    }\n    if (feedback.length < 1 || feedback.length > 20) {\n      throw new NotSupportedError(\n        `The provided feedback array has length (${feedback.length}) outside the range [1, 20]`\n      );\n    }\n\n    if (feedforward.every((value) => value === 0)) {\n      throw new InvalidStateError(\n        `Feedforward array must contain at least one non-zero value`\n      );\n    }\n\n    if (feedback[0] === 0) {\n      throw new InvalidStateError(\n        `First value of feedback array cannot be zero`\n      );\n    }\n\n    return new IIRFilterNode(this, { feedforward, feedback });\n  }\n\n  createBufferQueueSource(options?: {\n    pitchCorrection: boolean;\n  }): AudioBufferQueueSourceNode {\n    if (options !== undefined) {\n      return new AudioBufferQueueSourceNode(this, options);\n    } else {\n      return new AudioBufferQueueSourceNode(this);\n    }\n  }\n\n  createBuffer(\n    numberOfChannels: number,\n    length: number,\n    sampleRate: number\n  ): AudioBuffer {\n    return new AudioBuffer({ numberOfChannels, length, sampleRate });\n  }\n\n  createPeriodicWave(\n    real: Float32Array,\n    imag: Float32Array,\n    constraints?: PeriodicWaveConstraints\n  ): PeriodicWave {\n    if (real.length !== imag.length) {\n      throw new InvalidAccessError(\n        `The lengths of the real (${real.length}) and imaginary (${imag.length}) arrays must match.`\n      );\n    }\n    return new PeriodicWave(this, { real, imag, ...constraints });\n  }\n\n  createAnalyser(): AnalyserNode {\n    return new AnalyserNode(this);\n  }\n\n  createConvolver(): ConvolverNode {\n    return new ConvolverNode(this);\n  }\n\n  createWaveShaper(): WaveShaperNode {\n    return new WaveShaperNode(this);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/BiquadFilterNode.ts",
    "content": "import { InvalidAccessError } from '../errors';\nimport { IBiquadFilterNode } from '../interfaces';\nimport AudioNode from './AudioNode';\nimport AudioParam from './AudioParam';\nimport type BaseAudioContext from './BaseAudioContext';\nimport { BiquadFilterOptions } from '../types';\n\nexport default class BiquadFilterNode extends AudioNode {\n  readonly frequency: AudioParam;\n  readonly detune: AudioParam;\n  readonly Q: AudioParam;\n  readonly gain: AudioParam;\n\n  constructor(context: BaseAudioContext, options?: BiquadFilterOptions) {\n    const biquadFilter: IBiquadFilterNode = context.context.createBiquadFilter(\n      options || {}\n    );\n    super(context, biquadFilter);\n    this.frequency = new AudioParam(biquadFilter.frequency, context);\n    this.detune = new AudioParam(biquadFilter.detune, context);\n    this.Q = new AudioParam(biquadFilter.Q, context);\n    this.gain = new AudioParam(biquadFilter.gain, context);\n  }\n\n  public get type(): BiquadFilterType {\n    return (this.node as IBiquadFilterNode).type;\n  }\n\n  public set type(value: BiquadFilterType) {\n    (this.node as IBiquadFilterNode).type = value;\n  }\n\n  public getFrequencyResponse(\n    frequencyArray: Float32Array,\n    magResponseOutput: Float32Array,\n    phaseResponseOutput: Float32Array\n  ) {\n    if (\n      frequencyArray.length !== magResponseOutput.length ||\n      frequencyArray.length !== phaseResponseOutput.length\n    ) {\n      throw new InvalidAccessError(\n        `The lengths of the arrays are not the same frequencyArray: ${frequencyArray.length}, magResponseOutput: ${magResponseOutput.length}, phaseResponseOutput: ${phaseResponseOutput.length}`\n      );\n    }\n    (this.node as IBiquadFilterNode).getFrequencyResponse(\n      frequencyArray,\n      magResponseOutput,\n      phaseResponseOutput\n    );\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/ConstantSourceNode.ts",
    "content": "import { IConstantSourceNode } from '../interfaces';\nimport { ConstantSourceOptions } from '../types';\nimport AudioParam from './AudioParam';\nimport AudioScheduledSourceNode from './AudioScheduledSourceNode';\nimport type BaseAudioContext from './BaseAudioContext';\n\nexport default class ConstantSourceNode extends AudioScheduledSourceNode {\n  readonly offset: AudioParam;\n\n  constructor(context: BaseAudioContext, options?: ConstantSourceOptions) {\n    const node: IConstantSourceNode = context.context.createConstantSource(\n      options || {}\n    );\n    super(context, node);\n    this.offset = new AudioParam(node.offset, context);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/ConvolverNode.ts",
    "content": "import { IConvolverNode } from '../interfaces';\nimport { ConvolverOptions } from '../types';\nimport type BaseAudioContext from './BaseAudioContext';\nimport AudioNode from './AudioNode';\nimport AudioBuffer from './AudioBuffer';\n\nexport default class ConvolverNode extends AudioNode {\n  private _buffer: AudioBuffer | null = null;\n\n  constructor(context: BaseAudioContext, options?: ConvolverOptions) {\n    const convolverNode: IConvolverNode = context.context.createConvolver(\n      options || {}\n    );\n    super(context, convolverNode);\n\n    if (options?.buffer) {\n      this.buffer = options.buffer;\n    }\n    this.normalize = convolverNode.normalize;\n  }\n\n  public get buffer(): AudioBuffer | null {\n    return this._buffer;\n  }\n\n  public set buffer(buffer: AudioBuffer | null) {\n    if (!buffer) {\n      (this.node as IConvolverNode).setBuffer(null);\n      this._buffer = null;\n      return;\n    }\n    (this.node as IConvolverNode).setBuffer(buffer.buffer);\n    this._buffer = buffer;\n  }\n\n  public get normalize(): boolean {\n    return (this.node as IConvolverNode).normalize;\n  }\n\n  public set normalize(value: boolean) {\n    (this.node as IConvolverNode).normalize = value;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/DelayNode.ts",
    "content": "import AudioNode from './AudioNode';\nimport AudioParam from './AudioParam';\nimport type BaseAudioContext from './BaseAudioContext';\nimport { DelayOptions } from '../types';\n\nexport default class DelayNode extends AudioNode {\n  readonly delayTime: AudioParam;\n\n  constructor(context: BaseAudioContext, options?: DelayOptions) {\n    const delay = context.context.createDelay(options || {});\n    super(context, delay);\n    this.delayTime = new AudioParam(delay.delayTime, context);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/GainNode.ts",
    "content": "import { IGainNode } from '../interfaces';\nimport { GainOptions } from '../types';\nimport AudioNode from './AudioNode';\nimport AudioParam from './AudioParam';\nimport type BaseAudioContext from './BaseAudioContext';\n\nexport default class GainNode extends AudioNode {\n  readonly gain: AudioParam;\n\n  constructor(context: BaseAudioContext, options?: GainOptions) {\n    const gainNode: IGainNode = context.context.createGain(options || {});\n    super(context, gainNode);\n    this.gain = new AudioParam(gainNode.gain, context);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/IIRFilterNode.ts",
    "content": "import {\n  InvalidAccessError,\n  InvalidStateError,\n  NotSupportedError,\n} from '../errors';\nimport { IIIRFilterNode } from '../interfaces';\nimport AudioNode from './AudioNode';\nimport { IIRFilterOptions } from '../types';\nimport type BaseAudioContext from './BaseAudioContext';\n\nexport default class IIRFilterNode extends AudioNode {\n  constructor(context: BaseAudioContext, options: IIRFilterOptions) {\n    IIRFilterNode.validateIIRFilterOptions(options);\n    const iirFilterNode = context.context.createIIRFilter(options);\n    super(context, iirFilterNode);\n  }\n\n  public getFrequencyResponse(\n    frequencyArray: Float32Array,\n    magResponseOutput: Float32Array,\n    phaseResponseOutput: Float32Array\n  ) {\n    if (\n      frequencyArray.length !== magResponseOutput.length ||\n      frequencyArray.length !== phaseResponseOutput.length\n    ) {\n      throw new InvalidAccessError(\n        `The lengths of the arrays are not the same frequencyArray: ${frequencyArray.length}, magResponseOutput: ${magResponseOutput.length}, phaseResponseOutput: ${phaseResponseOutput.length}`\n      );\n    }\n    (this.node as IIIRFilterNode).getFrequencyResponse(\n      frequencyArray,\n      magResponseOutput,\n      phaseResponseOutput\n    );\n  }\n\n  private static validateIIRFilterOptions(options: IIRFilterOptions) {\n    const { feedforward, feedback } = options;\n\n    if (feedforward.length === 0 || feedforward.length > 20) {\n      throw new NotSupportedError(\n        `The length of feedforward must be between 1 and 20, but got ${feedforward.length}`\n      );\n    }\n\n    if (feedforward.every((value) => value === 0)) {\n      throw new InvalidStateError(\n        `At least one value in feedforward must be non-zero`\n      );\n    }\n\n    if (feedback.length === 0 || feedback.length > 20) {\n      throw new NotSupportedError(\n        `The length of feedback must be between 1 and 20, but got ${feedback.length}`\n      );\n    }\n\n    if (feedback[0] === 0) {\n      throw new InvalidStateError(\n        `The first value of feedback must be non-zero`\n      );\n    }\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/OfflineAudioContext.ts",
    "content": "import AudioAPIModule from '../AudioAPIModule';\nimport { InvalidStateError, NotSupportedError } from '../errors';\nimport { IOfflineAudioContext } from '../interfaces';\nimport { OfflineAudioContextOptions } from '../types';\nimport AudioBuffer from './AudioBuffer';\nimport BaseAudioContext from './BaseAudioContext';\n\nexport default class OfflineAudioContext extends BaseAudioContext {\n  private isSuspended: boolean;\n  private isRendering: boolean;\n  private duration: number;\n\n  constructor(options: OfflineAudioContextOptions);\n  constructor(numberOfChannels: number, length: number, sampleRate: number);\n  constructor(\n    arg0: OfflineAudioContextOptions | number,\n    arg1?: number,\n    arg2?: number\n  ) {\n    const audioRuntime = AudioAPIModule.createAudioRuntime();\n\n    if (typeof arg0 === 'object') {\n      const { numberOfChannels, length, sampleRate } = arg0;\n      super(\n        global.createOfflineAudioContext(\n          numberOfChannels,\n          length,\n          sampleRate,\n          audioRuntime\n        )\n      );\n\n      this.duration = length / sampleRate;\n    } else if (\n      typeof arg0 === 'number' &&\n      typeof arg1 === 'number' &&\n      typeof arg2 === 'number'\n    ) {\n      super(global.createOfflineAudioContext(arg0, arg1, arg2, audioRuntime));\n      this.duration = arg1 / arg2;\n    } else {\n      throw new NotSupportedError('Invalid constructor arguments');\n    }\n\n    this.isSuspended = false;\n    this.isRendering = false;\n  }\n\n  async resume(): Promise<undefined> {\n    if (!this.isRendering) {\n      throw new InvalidStateError(\n        'Cannot resume an OfflineAudioContext while rendering'\n      );\n    }\n\n    if (!this.isSuspended) {\n      throw new InvalidStateError(\n        'Cannot resume an OfflineAudioContext that is not suspended'\n      );\n    }\n\n    this.isSuspended = false;\n\n    await (this.context as IOfflineAudioContext).resume();\n  }\n\n  async suspend(suspendTime: number): Promise<undefined> {\n    if (suspendTime < 0) {\n      throw new InvalidStateError('suspendTime must be a non-negative number');\n    }\n\n    if (suspendTime < this.context.currentTime) {\n      throw new InvalidStateError(\n        `suspendTime must be greater than the current time: ${suspendTime}`\n      );\n    }\n\n    if (suspendTime > this.duration) {\n      throw new InvalidStateError(\n        `suspendTime must be less than the duration of the context: ${suspendTime}`\n      );\n    }\n\n    this.isSuspended = true;\n\n    await (this.context as IOfflineAudioContext).suspend(suspendTime);\n  }\n\n  async startRendering(): Promise<AudioBuffer> {\n    if (this.isRendering) {\n      throw new InvalidStateError('OfflineAudioContext is already rendering');\n    }\n\n    this.isRendering = true;\n\n    const audioBuffer = await (\n      this.context as IOfflineAudioContext\n    ).startRendering();\n\n    return new AudioBuffer(audioBuffer);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/OscillatorNode.ts",
    "content": "import { IOscillatorNode } from '../interfaces';\nimport AudioScheduledSourceNode from './AudioScheduledSourceNode';\nimport AudioParam from './AudioParam';\nimport type BaseAudioContext from './BaseAudioContext';\nimport PeriodicWave from './PeriodicWave';\nimport { InvalidStateError } from '../errors';\nimport { OscillatorOptions } from '../types';\n\nexport default class OscillatorNode extends AudioScheduledSourceNode {\n  readonly frequency: AudioParam;\n  readonly detune: AudioParam;\n\n  constructor(context: BaseAudioContext, options?: OscillatorOptions) {\n    if (options?.periodicWave) {\n      options.type = 'custom';\n    }\n\n    const node = context.context.createOscillator(options || {});\n    super(context, node);\n    this.frequency = new AudioParam(node.frequency, context);\n    this.detune = new AudioParam(node.detune, context);\n    this.type = node.type;\n  }\n\n  public get type(): OscillatorType {\n    return (this.node as IOscillatorNode).type;\n  }\n\n  public set type(value: OscillatorType) {\n    if (value === 'custom') {\n      throw new InvalidStateError(\n        \"'type' cannot be set directly to 'custom'.  Use setPeriodicWave() to create a custom Oscillator type.\"\n      );\n    }\n\n    (this.node as IOscillatorNode).type = value;\n  }\n\n  public setPeriodicWave(wave: PeriodicWave): void {\n    (this.node as IOscillatorNode).setPeriodicWave(wave.periodicWave);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/PeriodicWave.ts",
    "content": "import { IPeriodicWave } from '../interfaces';\nimport type BaseAudioContext from './BaseAudioContext';\nimport { PeriodicWaveOptions } from '../types';\nimport { PeriodicWaveOptionsValidator } from '../options-validators';\n\nexport function generateRealAndImag(\n  options?: PeriodicWaveOptions\n): PeriodicWaveOptions {\n  let real: Float32Array | undefined;\n  let imag: Float32Array | undefined;\n  if (!options || (!options.real && !options.imag)) {\n    real = new Float32Array(2);\n    imag = new Float32Array(2);\n    imag[1] = 1;\n  } else {\n    real = options.real;\n    imag = options.imag;\n    PeriodicWaveOptionsValidator.validate(options);\n    if (real && !imag) {\n      imag = new Float32Array(real.length);\n    } else if (!real && imag) {\n      real = new Float32Array(imag.length);\n    }\n  }\n  const norm: boolean = options?.disableNormalization\n    ? options.disableNormalization\n    : false;\n  return { real, imag, disableNormalization: norm };\n}\n\nexport default class PeriodicWave {\n  /** @internal */\n  public readonly periodicWave: IPeriodicWave;\n\n  constructor(context: BaseAudioContext, options?: PeriodicWaveOptions) {\n    const finalOptions = generateRealAndImag(options);\n    this.periodicWave = context.context.createPeriodicWave(\n      finalOptions.real!,\n      finalOptions.imag!,\n      finalOptions.disableNormalization!\n    );\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/RecorderAdapterNode.ts",
    "content": "import { IRecorderAdapterNode } from '../interfaces';\nimport AudioNode from './AudioNode';\nimport type BaseAudioContext from './BaseAudioContext';\n\nexport default class RecorderAdapterNode extends AudioNode {\n  /** @internal */\n  public wasConnected: boolean = false;\n\n  constructor(context: BaseAudioContext) {\n    super(context, context.context.createRecorderAdapter());\n  }\n\n  /** @internal */\n  public getNode(): IRecorderAdapterNode {\n    return this.node as IRecorderAdapterNode;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/StereoPannerNode.ts",
    "content": "import { IStereoPannerNode } from '../interfaces';\nimport { StereoPannerOptions } from '../types';\nimport AudioNode from './AudioNode';\nimport AudioParam from './AudioParam';\nimport type BaseAudioContext from './BaseAudioContext';\n\nexport default class StereoPannerNode extends AudioNode {\n  readonly pan: AudioParam;\n\n  constructor(context: BaseAudioContext, options?: StereoPannerOptions) {\n    const pan: IStereoPannerNode = context.context.createStereoPanner(\n      options || {}\n    );\n    super(context, pan);\n    this.pan = new AudioParam(pan.pan, context);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/StreamerNode.ts",
    "content": "import AudioScheduledSourceNode from './AudioScheduledSourceNode';\nimport { StreamerOptions } from '../types';\nimport { NotSupportedError } from '../errors';\nimport type BaseAudioContext from './BaseAudioContext';\n\nexport default class StreamerNode extends AudioScheduledSourceNode {\n  readonly streamPath: string;\n\n  constructor(context: BaseAudioContext, options: StreamerOptions) {\n    const node = context.context.createStreamer(options);\n    if (!node) {\n      throw new NotSupportedError('StreamerNode requires FFmpeg build');\n    }\n    super(context, node);\n    this.streamPath = options.streamPath;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/WaveShaperNode.ts",
    "content": "import AudioNode from './AudioNode';\nimport type BaseAudioContext from './BaseAudioContext';\nimport { InvalidStateError } from '../errors';\nimport { IWaveShaperNode } from '../interfaces';\nimport { WaveShaperOptions } from '../types';\n\nexport default class WaveShaperNode extends AudioNode {\n  private isCurveSet: boolean = false;\n  private _curve: Float32Array | null = null;\n\n  constructor(context: BaseAudioContext, options?: WaveShaperOptions) {\n    const node = context.context.createWaveShaper(options || {});\n    super(context, node);\n    if (options?.curve) {\n      this._curve = options.curve;\n      this.isCurveSet = true;\n    }\n  }\n\n  get curve(): Float32Array | null {\n    return this._curve;\n  }\n\n  get oversample(): OverSampleType {\n    return (this.node as IWaveShaperNode).oversample;\n  }\n\n  set curve(curve: Float32Array | null) {\n    if (curve !== null) {\n      if (this.isCurveSet) {\n        throw new InvalidStateError(\n          'The curve can only be set once and cannot be changed afterwards.'\n        );\n      }\n\n      if (curve.length < 2) {\n        throw new InvalidStateError(\n          'The curve must have at least two values if not null.'\n        );\n      }\n\n      this.isCurveSet = true;\n    }\n\n    (this.node as IWaveShaperNode).setCurve(curve);\n  }\n\n  set oversample(value: OverSampleType) {\n    (this.node as IWaveShaperNode).oversample = value;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/WorkletNode.ts",
    "content": "import AudioNode from './AudioNode';\nimport type BaseAudioContext from './BaseAudioContext';\nimport { AudioWorkletRuntime } from '../types';\nimport AudioAPIModule from '../AudioAPIModule';\n\nexport default class WorkletNode extends AudioNode {\n  constructor(\n    context: BaseAudioContext,\n    runtime: AudioWorkletRuntime,\n    callback: (audioData: Array<Float32Array>, channelCount: number) => void,\n    bufferLength: number,\n    inputChannelCount: number\n  ) {\n    const shareableWorklet =\n      AudioAPIModule.workletsModule!.makeShareableCloneRecursive(\n        (audioBuffers: Array<ArrayBuffer>, channelCount: number) => {\n          'worklet';\n          const floatAudioData: Array<Float32Array> = audioBuffers.map(\n            (buffer) => new Float32Array(buffer)\n          );\n          callback(floatAudioData, channelCount);\n        }\n      );\n    const node = context.context.createWorkletNode(\n      shareableWorklet,\n      runtime === 'UIRuntime',\n      bufferLength,\n      inputChannelCount\n    );\n    super(context, node);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/WorkletProcessingNode.ts",
    "content": "import AudioNode from './AudioNode';\nimport type BaseAudioContext from './BaseAudioContext';\nimport { AudioWorkletRuntime } from '../types';\nimport AudioAPIModule from '../AudioAPIModule';\n\nexport default class WorkletProcessingNode extends AudioNode {\n  constructor(\n    context: BaseAudioContext,\n    runtime: AudioWorkletRuntime,\n    callback: (\n      inputData: Array<Float32Array>,\n      outputData: Array<Float32Array>,\n      framesToProcess: number,\n      currentTime: number\n    ) => void\n  ) {\n    const shareableWorklet =\n      AudioAPIModule.workletsModule!.makeShareableCloneRecursive(\n        (\n          inputBuffers: Array<ArrayBuffer>,\n          outputBuffers: Array<ArrayBuffer>,\n          framesToProcess: number,\n          currentTime: number\n        ) => {\n          'worklet';\n          const inputData: Array<Float32Array> = inputBuffers.map(\n            (buffer) => new Float32Array(buffer, 0, framesToProcess)\n          );\n          const outputData: Array<Float32Array> = outputBuffers.map(\n            (buffer) => new Float32Array(buffer, 0, framesToProcess)\n          );\n          callback(inputData, outputData, framesToProcess, currentTime);\n        }\n      );\n    const node = context.context.createWorkletProcessingNode(\n      shareableWorklet,\n      runtime === 'UIRuntime'\n    );\n    super(context, node);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/core/WorkletSourceNode.ts",
    "content": "import AudioScheduledSourceNode from './AudioScheduledSourceNode';\nimport type BaseAudioContext from './BaseAudioContext';\nimport { AudioWorkletRuntime } from '../types';\nimport AudioAPIModule from '../AudioAPIModule';\n\nexport default class WorkletSourceNode extends AudioScheduledSourceNode {\n  constructor(\n    context: BaseAudioContext,\n    runtime: AudioWorkletRuntime,\n    callback: (\n      audioData: Array<Float32Array>,\n      framesToProcess: number,\n      currentTime: number,\n      startOffset: number\n    ) => void\n  ) {\n    const shareableWorklet =\n      AudioAPIModule.workletsModule!.makeShareableCloneRecursive(\n        (\n          audioBuffers: Array<ArrayBuffer>,\n          framesToProcess: number,\n          currentTime: number,\n          startOffset: number\n        ) => {\n          'worklet';\n          const floatAudioData: Array<Float32Array> = audioBuffers.map(\n            (buffer) => new Float32Array(buffer)\n          );\n          callback(floatAudioData, framesToProcess, currentTime, startOffset);\n        }\n      );\n    const node = context.context.createWorkletSourceNode(\n      shareableWorklet,\n      runtime === 'UIRuntime'\n    );\n    super(context, node);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/development/react/Audio/Audio.tsx",
    "content": "import React, {\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { View, Image, Platform } from 'react-native';\n\nimport type {\n  AudioTagHandle,\n  AudioProps,\n  AudioTagPlaybackState,\n} from './types';\n\nimport { AudioComponentContext } from './AudioTagContext';\nimport { AudioFileSourceNode } from './AudioFileSourceNode';\nimport { useStableAudioProps } from './utils';\nimport { NotSupportedError } from '../../../errors';\nimport { NativeAudioAPIModule } from '../../../specs';\nimport { AudioControls } from '..';\nimport { base64ToArrayBuffer } from '../../../utils';\n\nconst Audio = React.forwardRef<AudioTagHandle, AudioProps>((props, ref) => {\n  const { children } = props;\n  const {\n    autoPlay,\n    controls,\n    loop,\n    muted,\n    preload,\n    source,\n    playbackRate,\n    preservesPitch,\n    volume,\n    context,\n    onLoadStart,\n    onLoad,\n    onError,\n    onPositionChange,\n    onEnded: onEndedCallback,\n    onPlay,\n    onPause,\n    onVolumeChange,\n  } = useStableAudioProps(props);\n  const audioContext = context ?? null;\n  const [volumeState, setVolumeState] = useState<number | null>(null);\n  const [mutedState, setMutedState] = useState<boolean | null>(null);\n  const [ready, setReady] = useState(false);\n\n  const path = useMemo(() => {\n    if (!source) {\n      return '';\n    }\n    if (typeof source === 'string') {\n      return source;\n    }\n    // number\n    if (typeof source === 'number') {\n      return Image.resolveAssetSource(source).uri;\n    }\n    // AudioURISource\n    return source.uri ?? '';\n  }, [source]);\n\n  const fileSourceRef = useRef<AudioFileSourceNode>(null);\n  const sourceRef = useRef<ArrayBuffer | string | null>(null);\n\n  const lastEffectiveVolumeRef = useRef(muted ? 0 : volume);\n\n  const [playbackState, setPlaybackState] =\n    useState<AudioTagPlaybackState>('idle');\n  const [currentTime, setCurrentTime] = useState(0);\n  const [duration, setDuration] = useState(0);\n\n  const effectiveMutedState = useMemo(() => {\n    return mutedState ?? muted;\n  }, [mutedState, muted]);\n\n  const effectiveVolumeState = useMemo(() => {\n    return effectiveMutedState ? 0 : (volumeState ?? volume);\n  }, [effectiveMutedState, volumeState, volume]);\n\n  const effectiveVolumeRef = useRef(effectiveVolumeState);\n  effectiveVolumeRef.current = effectiveVolumeState;\n\n  useEffect(() => {\n    fileSourceRef.current?.setVolume(effectiveVolumeState);\n  }, [effectiveVolumeState]);\n\n  const play = useCallback(() => {\n    fileSourceRef.current?.play();\n    setPlaybackState('playing');\n    onPlay();\n  }, [onPlay]);\n\n  const pause = useCallback(() => {\n    fileSourceRef.current?.pause();\n    setPlaybackState('paused');\n    onPause();\n  }, [onPause]);\n\n  const seekToTime = useCallback(\n    (seconds: number) => {\n      fileSourceRef.current?.seekToTime(seconds);\n      const nextTime =\n        duration > 0\n          ? Math.max(0, Math.min(seconds, duration))\n          : Math.max(0, seconds);\n      setCurrentTime(nextTime);\n      onPositionChange(nextTime);\n    },\n    [duration, setCurrentTime, onPositionChange]\n  );\n\n  const spawnFileSource = useCallback(() => {\n    const nextSource = sourceRef.current;\n    if (!context || !nextSource) {\n      return;\n    }\n\n    fileSourceRef.current?.dispose();\n    setCurrentTime(0);\n    setDuration(0);\n    setPlaybackState('idle');\n\n    const initialVolume = effectiveVolumeRef.current;\n\n    const node = context.context.createFileSource({\n      source: nextSource,\n      loop,\n      volume: initialVolume,\n    });\n    if (!node) {\n      onError(new NotSupportedError('This file format requires FFmpeg build'));\n      return;\n    }\n\n    const fileSource = new AudioFileSourceNode(context, node);\n    const { duration: nextDuration } = fileSource.attach({\n      loop,\n      onEnded: () => {\n        setPlaybackState('idle');\n        setCurrentTime(nextDuration);\n        onEndedCallback();\n        spawnFileSource();\n      },\n    });\n\n    fileSource.setVolume(initialVolume);\n    fileSourceRef.current = fileSource;\n    setDuration(nextDuration);\n    onLoad();\n\n    if (autoPlay) {\n      fileSource.play();\n      setPlaybackState('playing');\n      onPlay();\n    }\n  }, [context, loop, onError, onEndedCallback, onLoad, onPlay, autoPlay]);\n\n  useEffect(() => {\n    if (!path) {\n      fileSourceRef.current?.dispose();\n      sourceRef.current = null;\n      setPlaybackState('idle');\n      setCurrentTime(0);\n      setDuration(0);\n      return;\n    }\n\n    let isCancelled = false;\n\n    const run = async () => {\n      setReady(false);\n      onLoadStart();\n      try {\n        if (path.startsWith('http')) {\n          const arrayBuffer = await fetch(path, {\n            headers:\n              typeof source === 'object' && source && 'headers' in source\n                ? source.headers\n                : undefined,\n          }).then((response) => response.arrayBuffer());\n          sourceRef.current = arrayBuffer;\n        } else if (\n          Platform.OS === 'android' &&\n          !__DEV__ &&\n          !path.startsWith('file://')\n        ) {\n          const base64Payload =\n            await NativeAudioAPIModule.readAndroidReleaseAssetBytesAsBase64(\n              path\n            );\n          const arrayBuffer = base64ToArrayBuffer(base64Payload);\n          sourceRef.current = arrayBuffer;\n        } else if (path.startsWith('file://')) {\n          sourceRef.current = path.replace('file://', '');\n        } else {\n          sourceRef.current = path;\n        }\n\n        if (!isCancelled) {\n          spawnFileSource();\n          setReady(true);\n        }\n      } catch (error) {\n        if (!isCancelled) {\n          onError(error as Error);\n        }\n        setReady(false);\n      }\n    };\n\n    run();\n\n    return () => {\n      isCancelled = true;\n      fileSourceRef.current?.stopPositionTracking();\n      fileSourceRef.current?.dispose();\n    };\n  }, [path, source, spawnFileSource, onError, onLoadStart]);\n\n  useEffect(() => {\n    if (lastEffectiveVolumeRef.current !== effectiveVolumeState) {\n      lastEffectiveVolumeRef.current = effectiveVolumeState;\n      onVolumeChange(effectiveVolumeState);\n    }\n  }, [onVolumeChange, effectiveVolumeState]);\n\n  useEffect(() => {\n    fileSourceRef.current?.setLoop(loop);\n  }, [loop]);\n\n  useEffect(() => {\n    if (playbackState !== 'playing') {\n      return;\n    }\n\n    fileSourceRef.current?.startPositionTracking((seconds) => {\n      setCurrentTime(seconds);\n      onPositionChange(seconds);\n    });\n\n    return () => {\n      fileSourceRef.current?.stopPositionTracking();\n    };\n  }, [onPositionChange, playbackState]);\n\n  useImperativeHandle(\n    ref,\n    () => ({\n      play,\n      pause,\n      seekToTime,\n      setVolume: setVolumeState,\n      setMuted: setMutedState,\n    }),\n    [pause, play, seekToTime, setMutedState, setVolumeState]\n  );\n\n  const ctxValue = useMemo(\n    () => ({\n      play,\n      pause,\n      seekToTime,\n      setVolume: setVolumeState,\n      volume: effectiveVolumeState,\n      ready,\n      setMuted: setMutedState,\n      muted: effectiveMutedState,\n      playbackState,\n      currentTime,\n      duration,\n      autoPlay,\n      controls,\n      loop,\n      preload,\n      playbackRate,\n      preservesPitch,\n      sourcePath: path,\n      source,\n      audioContext,\n    }),\n    [\n      play,\n      pause,\n      seekToTime,\n      setVolumeState,\n      effectiveVolumeState,\n      ready,\n      setMutedState,\n      effectiveMutedState,\n      playbackState,\n      currentTime,\n      duration,\n      autoPlay,\n      controls,\n      loop,\n      preload,\n      playbackRate,\n      preservesPitch,\n      path,\n      source,\n      audioContext,\n    ]\n  );\n\n  return (\n    <AudioComponentContext.Provider value={ctxValue}>\n      <View style={{ alignSelf: 'stretch', width: '100%' }}>\n        {controls && <AudioControls />}\n        {children}\n      </View>\n    </AudioComponentContext.Provider>\n  );\n});\n\nexport default Audio;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/development/react/Audio/Audio.web.tsx",
    "content": "import React, {\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n  useState,\n} from 'react';\nimport { View } from 'react-native';\n\nimport type {\n  AudioTagHandle,\n  AudioProps,\n  AudioTagPlaybackState,\n} from './types';\nimport { AudioComponentContext } from './AudioTagContext';\nimport { useStableAudioProps } from './utils';\n\nconst Audio = React.forwardRef<AudioTagHandle, AudioProps>((props, ref) => {\n  const { children } = props;\n  const {\n    autoPlay,\n    controls,\n    loop,\n    muted,\n    preload,\n    source,\n    playbackRate,\n    preservesPitch,\n    volume,\n    onLoadStart,\n    onLoad,\n    onError,\n    onPositionChange,\n    onEnded: onEndedCallback,\n    onPlay,\n    onPause,\n    onVolumeChange,\n  } = useStableAudioProps(props);\n\n  const audioRef = useRef<HTMLAudioElement>(null);\n  const [volumeState, setVolumeState] = useState(volume);\n  const [mutedState, setMutedState] = useState<boolean | null>(null);\n  const [ready, setReady] = useState(false);\n  const [playbackState, setPlaybackState] =\n    useState<AudioTagPlaybackState>('idle');\n  const [currentTime, setCurrentTime] = useState(0);\n  const [duration, setDuration] = useState(0);\n  const lastElementVolumeRef = useRef(muted ? 0 : volume);\n\n  const effectiveMutedState = useMemo(() => {\n    return mutedState ?? muted;\n  }, [mutedState, muted]);\n\n  const effectiveVolumeState = useMemo(() => {\n    return volumeState ?? volume;\n  }, [volumeState, volume]);\n\n  const reportedVolumeState = useMemo(() => {\n    return effectiveMutedState ? 0 : effectiveVolumeState;\n  }, [effectiveMutedState, effectiveVolumeState]);\n\n  const path = useMemo(() => {\n    if (!source) {\n      return '';\n    }\n    if (typeof source === 'string') {\n      return source;\n    }\n    if (typeof source === 'number') {\n      throw new Error('Asset source is not supported on web');\n    }\n    return source.uri ?? '';\n  }, [source]);\n\n  useEffect(() => {\n    const el = audioRef.current;\n    if (!el) {\n      return;\n    }\n    el.loop = loop;\n    el.playbackRate = playbackRate;\n    // `preservesPitch` is non-standard but supported in modern browsers.\n    (el as HTMLAudioElement & { preservesPitch?: boolean }).preservesPitch =\n      preservesPitch;\n  }, [loop, playbackRate, preservesPitch]);\n\n  useEffect(() => {\n    const el = audioRef.current;\n    if (!el) {\n      return;\n    }\n    el.volume = effectiveVolumeState;\n  }, [effectiveVolumeState]);\n\n  useEffect(() => {\n    const el = audioRef.current;\n    if (!el) {\n      return;\n    }\n    el.muted = effectiveMutedState;\n  }, [effectiveMutedState]);\n\n  useEffect(() => {\n    const el = audioRef.current;\n    if (!el) {\n      return;\n    }\n\n    const handleTimeUpdate = () => {\n      setCurrentTime(el.currentTime);\n      onPositionChange(el.currentTime);\n    };\n\n    const handleVolumeChange = () => {\n      const nextMuted = el.muted;\n      const nextVolume = nextMuted ? 0 : el.volume;\n\n      setMutedState(nextMuted);\n      setVolumeState(el.volume);\n\n      if (lastElementVolumeRef.current !== nextVolume) {\n        lastElementVolumeRef.current = nextVolume;\n        onVolumeChange(nextVolume);\n      }\n    };\n\n    el.addEventListener('timeupdate', handleTimeUpdate);\n    el.addEventListener('volumechange', handleVolumeChange);\n    setDuration(el.duration);\n    setCurrentTime(el.currentTime);\n    lastElementVolumeRef.current = el.muted ? 0 : el.volume;\n\n    return () => {\n      el.removeEventListener('timeupdate', handleTimeUpdate);\n      el.removeEventListener('volumechange', handleVolumeChange);\n    };\n  }, [onPositionChange, onVolumeChange, ready]);\n\n  const play = useCallback(() => {\n    audioRef.current?.play();\n    setPlaybackState('playing');\n    onPlay();\n  }, [onPlay]);\n\n  const pause = useCallback(() => {\n    audioRef.current?.pause();\n    setPlaybackState('paused');\n    onPause();\n  }, [onPause]);\n\n  const seekToTime = useCallback(\n    (seconds: number) => {\n      const el = audioRef.current;\n      if (!el) {\n        return;\n      }\n      const nextTime =\n        duration > 0\n          ? Math.max(0, Math.min(seconds, duration))\n          : Math.max(0, seconds);\n      el.currentTime = nextTime;\n      setCurrentTime(nextTime);\n    },\n    [duration]\n  );\n\n  const setVolume = useCallback((next: number) => {\n    setVolumeState(next);\n  }, []);\n\n  const setMuted = useCallback((next: boolean) => {\n    setMutedState(next);\n  }, []);\n\n  useImperativeHandle(\n    ref,\n    () => ({\n      play,\n      pause,\n      seekToTime,\n      setVolume,\n      setMuted,\n    }),\n    [pause, play, seekToTime, setMuted, setVolume]\n  );\n\n  const ctxValue = useMemo(\n    () => ({\n      play,\n      pause,\n      seekToTime,\n      setVolume,\n      ready,\n      volume: reportedVolumeState,\n      setMuted,\n      muted: effectiveMutedState,\n      playbackState,\n      currentTime,\n      duration,\n      autoPlay,\n      controls,\n      loop,\n      preload,\n      playbackRate,\n      preservesPitch,\n      audioContext: null,\n    }),\n    [\n      play,\n      pause,\n      seekToTime,\n      setVolume,\n      ready,\n      reportedVolumeState,\n      setMuted,\n      effectiveMutedState,\n      playbackState,\n      currentTime,\n      duration,\n      autoPlay,\n      controls,\n      loop,\n      preload,\n      playbackRate,\n      preservesPitch,\n    ]\n  );\n\n  return (\n    <AudioComponentContext.Provider value={ctxValue}>\n      <View style={{ alignSelf: 'stretch', width: '100%' }}>\n        <audio\n          autoPlay={autoPlay}\n          controls={controls}\n          loop={loop}\n          muted={effectiveMutedState}\n          preload={preload}\n          src={path}\n          ref={audioRef}\n          onLoadStart={() => {\n            setReady(false);\n            onLoadStart();\n          }}\n          onLoadedData={() => {\n            setReady(true);\n            onLoad();\n          }}\n          onPlay={() => {\n            setPlaybackState('playing');\n            onPlay();\n          }}\n          onPause={() => {\n            setPlaybackState((state) =>\n              state === 'playing' ? 'paused' : state\n            );\n            onPause();\n          }}\n          onEnded={() => {\n            setPlaybackState('idle');\n            setCurrentTime(duration);\n            onEndedCallback();\n          }}\n          onError={() => {\n            setReady(false);\n            onError(new Error('Failed to load audio element source'));\n          }}\n        />\n        {children}\n      </View>\n    </AudioComponentContext.Provider>\n  );\n});\n\nexport default Audio;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/development/react/Audio/AudioFileSourceNode.ts",
    "content": "import { AudioEventEmitter, AudioEventSubscription } from '../../../events';\nimport type { EventEmptyType } from '../../../events/types';\nimport type {\n  IAudioFileSourceNode,\n  IAudioScheduledSourceNode,\n} from '../../../interfaces';\nimport AudioScheduledSourceNode from '../../../core/AudioScheduledSourceNode';\n\ntype AttachFileSourceOptions = {\n  loop: boolean;\n  onEnded: () => void;\n};\n\nexport class AudioFileSourceNode extends AudioScheduledSourceNode {\n  private readonly emitter = new AudioEventEmitter(global.AudioEventEmitter);\n\n  private didConnectToDestination = false;\n  private positionSubscription?: AudioEventSubscription;\n  private endedSubscription?: AudioEventSubscription;\n\n  attach(options: AttachFileSourceOptions): { duration: number } {\n    this.resetNodeAndSubscriptions();\n\n    this.endedSubscription = this.emitter.addAudioEventListener(\n      'ended',\n      (_event: EventEmptyType) => {\n        options.onEnded();\n      }\n    );\n    (this.node as IAudioFileSourceNode).onEnded =\n      this.endedSubscription.subscriptionId;\n\n    return {\n      duration: (this.node as IAudioFileSourceNode).duration,\n    };\n  }\n\n  dispose(): void {\n    this.resetNodeAndSubscriptions();\n  }\n\n  /**\n   * First call: connect to destination + start. Later calls on the same node\n   * (e.g. resume after pause): only start — avoids duplicate edges and matches\n   * native file-source resume (unpause) semantics.\n   */\n  play(): void {\n    if (!this.didConnectToDestination) {\n      // @ts-expect-error destination.node is the underlying graph node\n      this.node.connect(this.context.destination.node);\n      this.didConnectToDestination = true;\n    }\n    (this.node as IAudioScheduledSourceNode).start(this.context.currentTime);\n  }\n\n  pause(): void {\n    (this.node as IAudioFileSourceNode).pause();\n  }\n\n  seekToTime(seconds: number): void {\n    (this.node as IAudioFileSourceNode).seekToTime(seconds);\n  }\n\n  setVolume(value: number): void {\n    (this.node as IAudioFileSourceNode).volume = value;\n  }\n\n  setLoop(value: boolean): void {\n    (this.node as IAudioFileSourceNode).loop = value;\n  }\n\n  getDuration(): number {\n    return (this.node as IAudioFileSourceNode).duration;\n  }\n\n  getCurrentTime(): number {\n    return (this.node as IAudioFileSourceNode).currentTime;\n  }\n\n  startPositionTracking(onTime: (seconds: number) => void): void {\n    if (!this.node) {\n      return;\n    }\n    this.stopPositionTracking();\n    this.positionSubscription = this.emitter.addAudioEventListener(\n      'positionChanged',\n      (event) => {\n        onTime(event.value);\n      }\n    );\n    (this.node as IAudioFileSourceNode).onPositionChanged =\n      this.positionSubscription.subscriptionId;\n  }\n\n  stopPositionTracking(): void {\n    this.positionSubscription?.remove();\n    this.positionSubscription = undefined;\n    if (this.node) {\n      (this.node as IAudioFileSourceNode).onPositionChanged = '0';\n    }\n  }\n\n  private resetNodeAndSubscriptions(): void {\n    this.positionSubscription?.remove();\n    this.positionSubscription = undefined;\n    this.endedSubscription?.remove();\n    this.endedSubscription = undefined;\n\n    if (this.node) {\n      (this.node as IAudioFileSourceNode).onPositionChanged = '0';\n      (this.node as IAudioFileSourceNode).onEnded = '0';\n      this.node.disconnect(undefined);\n    }\n    this.didConnectToDestination = false;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/development/react/Audio/AudioTagContext.ts",
    "content": "import { createContext, useContext } from 'react';\nimport type BaseAudioContext from '../../../core/BaseAudioContext';\nimport type { AudioTagPlaybackState, PreloadType } from './types';\n\nexport type AudioComponentContextType = {\n  play: () => void;\n  pause: () => void;\n  seekToTime: (seconds: number) => void;\n  setVolume: (volume: number) => void;\n  setMuted: (muted: boolean) => void;\n\n  ready: boolean;\n  volume: number;\n  muted: boolean;\n  playbackState: AudioTagPlaybackState;\n  currentTime: number;\n  duration: number;\n  autoPlay: boolean;\n  loop: boolean;\n  preload: PreloadType;\n  playbackRate: number;\n  preservesPitch: boolean;\n  audioContext: BaseAudioContext | null;\n};\n\nexport const AudioComponentContext = createContext<\n  AudioComponentContextType | undefined\n>(undefined);\n\nexport function useAudioTagContext(): AudioComponentContextType {\n  const context = useContext(AudioComponentContext);\n\n  if (context === undefined) {\n    throw new Error(\n      'useAudioTagContext must be used within an <Audio> component.'\n    );\n  }\n\n  return context;\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/development/react/Audio/controls/AudioControls.tsx",
    "content": "import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport {\n  ActivityIndicator,\n  Image,\n  Platform,\n  Pressable,\n  StyleSheet,\n  Text,\n  View,\n} from 'react-native';\nimport { Gesture, GestureDetector } from 'react-native-gesture-handler';\nimport Animated, {\n  useAnimatedRef,\n  useSharedValue,\n} from 'react-native-reanimated';\nimport { useAudioTagContext } from '../AudioTagContext';\nimport {\n  formatTime,\n  timeFromLocationX,\n  useExpandableTrackHeight,\n} from './audioControlUtils';\n\nimport PlayIcon from './icons/play.png';\nimport PauseIcon from './icons/pause.png';\nimport VolumeIcon from './icons/speaker.png';\nimport MuteIcon from './icons/speaker-x.png';\n\nconst TRACK_BAR_HEIGHT = 12;\nconst TRACK_BAR_HEIGHT_PRESSED = 18;\nconst TRACK_BAR_ANIM_MS = 150;\nconst SCRUB_PAN_MIN_DISTANCE = 8;\n\nconst AudioControls: React.FC = () => {\n  const {\n    ready,\n    play,\n    pause,\n    seekToTime,\n    playbackState,\n    muted,\n    setMuted,\n    currentTime,\n    duration,\n  } = useAudioTagContext();\n\n  const progressTrackAnim = useExpandableTrackHeight(\n    TRACK_BAR_HEIGHT,\n    TRACK_BAR_HEIGHT_PRESSED,\n    TRACK_BAR_ANIM_MS\n  );\n\n  const [scrubTime, setScrubTime] = useState<number | null>(null);\n  const progressTrackRef = useAnimatedRef<View>();\n  const progressMetricsWidth = useSharedValue(0);\n  const durationRef = useRef(duration);\n  durationRef.current = duration;\n\n  const onStart = useCallback(\n    (x: number) => {\n      progressTrackAnim.expand();\n      const d = durationRef.current;\n      progressTrackRef.current?.measureInWindow((_left, _y, width, _h) => {\n        progressMetricsWidth.value = width;\n        setScrubTime(timeFromLocationX(x, width, d));\n      });\n    },\n    [progressTrackAnim, progressMetricsWidth, setScrubTime, progressTrackRef]\n  );\n\n  const onUpdate = useCallback(\n    (x: number) => {\n      const d = durationRef.current;\n      const w = progressMetricsWidth.value;\n      setScrubTime(timeFromLocationX(x, w, d));\n    },\n    [progressMetricsWidth]\n  );\n\n  const seekTo = useCallback(\n    (x: number) => {\n      const d = durationRef.current;\n      const w = progressMetricsWidth.value;\n      const t = timeFromLocationX(x, w, d);\n      seekToTime(t);\n    },\n    [progressMetricsWidth, seekToTime]\n  );\n\n  const onEnd = useCallback(\n    (x: number) => {\n      seekTo(x);\n      progressTrackAnim.collapse();\n      setScrubTime(null);\n    },\n    [progressTrackAnim, seekTo]\n  );\n\n  const onCancel = useCallback(() => {\n    progressTrackAnim.collapse();\n    setScrubTime(null);\n  }, [progressTrackAnim]);\n\n  const onTapSeek = useCallback(\n    (x: number) => {\n      onEnd(x);\n    },\n    [onEnd]\n  );\n\n  const scrubGesture = useMemo(() => {\n    const panGesture = Gesture.Pan()\n      .runOnJS(true)\n      .minDistance(SCRUB_PAN_MIN_DISTANCE)\n      .onStart((e) => {\n        onStart(e.x);\n      })\n      .onUpdate((e) => {\n        onUpdate(e.x);\n      })\n      .onEnd((e) => {\n        onEnd(e.x);\n      })\n      .onFinalize((_e, success) => {\n        if (!success) {\n          onCancel();\n        }\n      });\n\n    const tapGesture = Gesture.Tap()\n      .runOnJS(true)\n      .maxDistance(14)\n      .onEnd((e, success) => {\n        if (success) {\n          onTapSeek(e.x);\n        }\n      });\n\n    return Gesture.Race(panGesture, tapGesture);\n  }, [onStart, onUpdate, onEnd, onCancel, onTapSeek]);\n\n  const onPlayPausePress = useCallback(() => {\n    if (playbackState === 'playing') {\n      pause();\n    } else {\n      play();\n    }\n  }, [playbackState, pause, play]);\n\n  const onProgressTrackLayout = useCallback(() => {\n    progressTrackRef.current?.measureInWindow((_left, _y, width, _h) => {\n      progressMetricsWidth.value = width;\n    });\n  }, [progressMetricsWidth, progressTrackRef]);\n\n  if (!ready) {\n    return (\n      <View style={styles.container}>\n        <ActivityIndicator color=\"#333\" size=\"small\" />\n      </View>\n    );\n  }\n\n  const displayTime = scrubTime ?? currentTime;\n  const progress = duration > 0 ? displayTime / duration : 0;\n\n  return (\n    <View style={styles.container}>\n      <View style={styles.topRow}>\n        <Pressable style={styles.playPause} onPress={onPlayPausePress}>\n          {playbackState === 'playing' ? (\n            <Image source={PauseIcon} style={{ width: 24, height: 24 }} />\n          ) : (\n            <Image source={PlayIcon} style={{ width: 24, height: 24 }} />\n          )}\n        </Pressable>\n\n        <Text style={styles.timeText}>\n          {formatTime(displayTime)} / {formatTime(duration)}\n        </Text>\n\n        <GestureDetector gesture={scrubGesture}>\n          {/* prettier-ignore */}\n          <View\n            ref={progressTrackRef}\n            onLayout={onProgressTrackLayout}\n            style={styles.progressTrack}\n            collapsable={false}>\n            <Animated.View\n              style={[styles.trackInner, progressTrackAnim.animatedStyle]}\n              >\n              <View\n                style={[styles.trackFill, { width: `${progress * 100}%` }]}\n              />\n            </Animated.View>\n          </View>\n        </GestureDetector>\n\n        <Pressable style={styles.volumeIcon} onPress={() => setMuted(!muted)}>\n          {muted ? (\n            <Image source={MuteIcon} style={{ width: 24, height: 24 }} />\n          ) : (\n            <Image source={VolumeIcon} style={{ width: 24, height: 24 }} />\n          )}\n        </Pressable>\n      </View>\n    </View>\n  );\n};\n\nconst styles = StyleSheet.create({\n  container: {\n    flexDirection: 'column',\n    alignSelf: 'stretch',\n    minWidth: 200,\n    paddingVertical: 10,\n    paddingHorizontal: 12,\n    backgroundColor: '#f5f5f5',\n    borderRadius: 8,\n    borderWidth: 1,\n    borderColor: '#333',\n    ...Platform.select({\n      ios: {\n        shadowColor: '#000',\n        shadowOffset: { width: 0, height: 2 },\n        shadowOpacity: 0.15,\n        shadowRadius: 4,\n      },\n      android: {\n        elevation: 4,\n      },\n    }),\n  },\n  topRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n  },\n  playPause: {\n    padding: 4,\n    marginRight: 12,\n  },\n  timeText: {\n    color: '#000',\n    fontSize: 12,\n    marginRight: 10,\n    minWidth: 48,\n  },\n  progressTrack: {\n    flex: 1,\n    minWidth: 40,\n    justifyContent: 'center',\n    marginRight: 10,\n  },\n  trackInner: {\n    alignSelf: 'stretch',\n    backgroundColor: '#ccc',\n    overflow: 'hidden',\n  },\n  trackFill: {\n    height: '100%',\n    backgroundColor: '#000',\n  },\n  volumeIcon: {\n    padding: 4,\n    marginRight: 12,\n  },\n  loadingRow: {\n    flexDirection: 'row',\n    alignItems: 'center',\n  },\n  loadingText: {\n    color: '#333',\n    fontSize: 14,\n  },\n});\n\nexport default AudioControls;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/development/react/Audio/controls/audioControlUtils.ts",
    "content": "import { useMemo } from 'react';\nimport {\n  useSharedValue,\n  useAnimatedStyle,\n  withTiming,\n} from 'react-native-reanimated';\n\nexport function formatTime(seconds: number): string {\n  if (!Number.isFinite(seconds) || seconds < 0) {\n    return '0:00';\n  }\n  const h = Math.floor(seconds / 3600);\n  const m = Math.floor((seconds % 3600) / 60);\n  const s = Math.floor(seconds % 60);\n  if (h > 0) {\n    return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n  } else {\n    return `${m}:${s.toString().padStart(2, '0')}`;\n  }\n}\n\nexport function timeFromLocationX(\n  locationX: number,\n  trackWidth: number,\n  durationSeconds: number\n): number {\n  if (trackWidth <= 0 || durationSeconds <= 0) {\n    return 0;\n  }\n  const pct = Math.max(0, Math.min(1, locationX / trackWidth));\n  return pct * durationSeconds;\n}\n\nexport function useExpandableTrackHeight(\n  trackBarHeight: number,\n  trackBarHeightPressed: number,\n  trackBarAnimMs: number\n) {\n  const height = useSharedValue(trackBarHeight);\n  const animatedStyle = useAnimatedStyle(() => ({\n    height: height.value,\n    borderRadius: height.value / 2,\n  }));\n\n  return useMemo(\n    () => ({\n      animatedStyle,\n      expand: () => {\n        height.value = withTiming(trackBarHeightPressed, {\n          duration: trackBarAnimMs,\n        });\n      },\n      collapse: () => {\n        height.value = withTiming(trackBarHeight, {\n          duration: trackBarAnimMs,\n        });\n      },\n    }),\n    [\n      animatedStyle,\n      height,\n      trackBarHeight,\n      trackBarHeightPressed,\n      trackBarAnimMs,\n    ]\n  );\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/development/react/Audio/index.ts",
    "content": "export { default } from './Audio';\nexport { useAudioTagContext } from './AudioTagContext';\n\nexport type {\n  AudioTagHandle,\n  AudioProps,\n  AudioSource,\n  AudioTagPlaybackState,\n  TimeRanges,\n} from './types';\n"
  },
  {
    "path": "packages/react-native-audio-api/src/development/react/Audio/types.ts",
    "content": "import { ReactNode } from 'react';\nimport type BaseAudioContext from '../../../core/BaseAudioContext';\n\nexport interface AudioURISource {\n  uri?: string | undefined;\n  // bundle?: string | undefined;\n  // method?: string | undefined;\n  headers?: { [key: string]: string } | undefined;\n  // cache?: 'default' | 'reload' | 'force-cache' | 'only-if-cached' | undefined;\n  // body?: string | undefined;\n}\n\nexport type AudioRequireSource = number;\n\nexport interface TimeRanges {\n  length: number;\n  start(index: number): number;\n  end(index: number): number;\n}\n\nexport type AudioSource = AudioURISource | AudioRequireSource | string;\n\nexport type PreloadType = 'auto' | 'metadata' | 'none';\n\nexport type AudioTagPlaybackState = 'idle' | 'playing' | 'paused';\n\nexport interface AudioTagHandle {\n  play: () => void;\n  pause: () => void;\n  seekToTime: (seconds: number) => void;\n  setVolume: (volume: number) => void;\n  setMuted: (muted: boolean) => void;\n}\n\ninterface AudioControlProps {\n  autoPlay: boolean;\n  controls: boolean; // TBD: should we support control display at all?\n  loop: boolean;\n  muted: boolean;\n  preload: PreloadType;\n  source: AudioSource;\n  playbackRate: number;\n  preservesPitch: boolean;\n  volume: number;\n  children?: ReactNode;\n  context?: BaseAudioContext; // optional on web, since web do not use AudioContext for audio tag\n}\n\ninterface AudioReadonlyProps {\n  // TODO: decide if we want to expose them this way\n  // duration: number;\n  // currentTime: number;\n  // ended: boolean;\n  // paused: boolean;\n  // buffered: TimeRanges;\n}\n\ntype TMPEmptyEventHandler = () => void;\ntype TMPNumberEventHandler = (number: number) => void;\ntype TMPErrorEventHandler = (error: Error) => void;\n\ninterface AudioEventProps {\n  onLoadStart: TMPEmptyEventHandler;\n  onLoad: TMPEmptyEventHandler;\n  onError: TMPErrorEventHandler;\n  onPositionChange: TMPNumberEventHandler;\n  onEnded: TMPEmptyEventHandler;\n  onPlay: TMPEmptyEventHandler;\n  onPause: TMPEmptyEventHandler;\n  onVolumeChange: TMPNumberEventHandler;\n}\n\nexport interface AudioPropsBase\n  extends AudioControlProps, AudioReadonlyProps, AudioEventProps {}\n\nexport type AudioProps = Partial<AudioPropsBase> & { source: AudioSource };\n"
  },
  {
    "path": "packages/react-native-audio-api/src/development/react/Audio/utils.ts",
    "content": "import { useMemo } from 'react';\nimport { Platform } from 'react-native';\nimport AudioContext from '../../../core/AudioContext';\nimport type BaseAudioContext from '../../../core/BaseAudioContext';\nimport { AudioProps, AudioPropsBase } from './types';\n\nconst noop = () => {};\nconst noopError = (_error: Error) => {};\nconst noopNumber = (_number: number) => {};\n\n/**\n * Merge props with defaults. `resolvedContext` must be stable when using the\n * implicit default (see `useStableAudioProps` — one `AudioContext` per hook\n * mount).\n */\nexport function withPropsDefaults(\n  props: AudioProps,\n  resolvedContext: BaseAudioContext | undefined\n): AudioPropsBase {\n  return {\n    ...props,\n    autoPlay: props.autoPlay ?? false,\n    controls: props.controls ?? false,\n    loop: props.loop ?? false,\n    muted: props.muted ?? false,\n    preload: props.preload ?? 'auto',\n    source: props.source ?? [],\n    playbackRate: props.playbackRate ?? 1.0,\n    preservesPitch: props.preservesPitch ?? true,\n    volume: props.volume ?? 1.0,\n    context: resolvedContext,\n    onLoadStart: props.onLoadStart ?? noop,\n    onLoad: props.onLoad ?? noop,\n    onError: props.onError ?? noopError,\n    onPositionChange: props.onPositionChange ?? noopNumber,\n    onEnded: props.onEnded ?? noop,\n    onPlay: props.onPlay ?? noop,\n    onPause: props.onPause ?? noop,\n    onVolumeChange: props.onVolumeChange ?? noopNumber,\n  };\n}\n\nexport function useStableAudioProps(props: AudioProps): AudioPropsBase {\n  const resolvedContext = useMemo(() => {\n    if (Platform.OS === 'web') {\n      return undefined;\n    }\n    return props.context ?? new AudioContext();\n  }, [props.context]);\n\n  const {\n    // Control Props\n    autoPlay,\n    controls,\n    loop,\n    muted,\n    preload,\n    source,\n    playbackRate,\n    preservesPitch,\n    volume,\n    context,\n\n    // Event Props\n    onLoadStart,\n    onLoad,\n    onError,\n    onPositionChange,\n    onEnded,\n    onPlay,\n    onPause,\n    onVolumeChange,\n  } = withPropsDefaults(props, resolvedContext);\n\n  return useMemo(\n    () => ({\n      // Control Props\n      autoPlay,\n      controls,\n      loop,\n      muted,\n      preload,\n      source,\n      playbackRate,\n      preservesPitch,\n      volume,\n      context,\n\n      // Event Props\n      onLoadStart,\n      onLoad,\n      onError,\n      onPositionChange,\n      onEnded,\n      onPlay,\n      onPause,\n      onVolumeChange,\n    }),\n    [\n      autoPlay,\n      controls,\n      loop,\n      muted,\n      preload,\n      source,\n      playbackRate,\n      preservesPitch,\n      volume,\n      context,\n      onLoadStart,\n      onLoad,\n      onError,\n      onPositionChange,\n      onEnded,\n      onPlay,\n      onPause,\n      onVolumeChange,\n    ]\n  );\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/development/react/index.ts",
    "content": "export * from './Audio';\nexport { default as Audio } from './Audio';\nexport { default as AudioControls } from './Audio/controls/AudioControls';\n"
  },
  {
    "path": "packages/react-native-audio-api/src/development/react/types.d.ts",
    "content": "declare module '*.png' {\n  const value: number;\n  export default value;\n}\n\ndeclare module '*.jpg' {\n  const value: number;\n  export default value;\n}\n\ndeclare module '*.jpeg' {\n  const value: number;\n  export default value;\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/errors/AudioApiError.ts",
    "content": "class AudioApiError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'AudioApiError';\n  }\n}\n\nexport default AudioApiError;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/errors/IndexSizeError.ts",
    "content": "class IndexSizeError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'IndexSizeError';\n  }\n}\n\nexport default IndexSizeError;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/errors/InvalidAccessError.ts",
    "content": "class InvalidAccessError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'InvalidAccessError';\n  }\n}\n\nexport default InvalidAccessError;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/errors/InvalidStateError.ts",
    "content": "class InvalidStateError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'InvalidStateError';\n  }\n}\n\nexport default InvalidStateError;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/errors/NotSupportedError.ts",
    "content": "class NotSupportedError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'NotSupportedError';\n  }\n}\n\nexport default NotSupportedError;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/errors/RangeError.ts",
    "content": "class RangeError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'RangeError';\n  }\n}\n\nexport default RangeError;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/errors/index.ts",
    "content": "export { default as IndexSizeError } from './IndexSizeError';\nexport { default as InvalidAccessError } from './InvalidAccessError';\nexport { default as InvalidStateError } from './InvalidStateError';\nexport { default as RangeError } from './RangeError';\nexport { default as NotSupportedError } from './NotSupportedError';\nexport { default as AudioApiError } from './AudioApiError';\n"
  },
  {
    "path": "packages/react-native-audio-api/src/events/AudioEventEmitter.ts",
    "content": "import { AudioEventName, AudioEventCallback } from './types';\nimport AudioEventSubscription from './AudioEventSubscription';\nimport { IAudioEventEmitter } from '../interfaces';\n\nexport default class AudioEventEmitter {\n  private readonly audioEventEmitter: IAudioEventEmitter;\n\n  constructor(audioEventEmitter: IAudioEventEmitter) {\n    this.audioEventEmitter = audioEventEmitter;\n  }\n\n  addAudioEventListener<Name extends AudioEventName>(\n    name: Name,\n    callback: AudioEventCallback<Name>\n  ): AudioEventSubscription {\n    const subscriptionId = this.audioEventEmitter.addAudioEventListener(\n      name,\n      callback\n    );\n    return new AudioEventSubscription(subscriptionId, name, this);\n  }\n\n  removeAudioEventListener<Name extends AudioEventName>(\n    name: Name,\n    subscriptionId: string\n  ): void {\n    this.audioEventEmitter.removeAudioEventListener(name, subscriptionId);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/events/AudioEventSubscription.ts",
    "content": "import { AudioEventName } from './types';\nimport { AudioEventEmitter } from './';\n\nexport default class AudioEventSubscription {\n  private readonly audioEventEmitter: AudioEventEmitter;\n  private readonly eventName: AudioEventName;\n  /** @internal */\n  public readonly subscriptionId: string;\n\n  constructor(\n    subscriptionId: string,\n    eventName: AudioEventName,\n    audioEventEmitter: AudioEventEmitter\n  ) {\n    this.subscriptionId = subscriptionId;\n    this.eventName = eventName;\n    this.audioEventEmitter = audioEventEmitter;\n  }\n\n  public remove(): void {\n    this.audioEventEmitter.removeAudioEventListener(\n      this.eventName,\n      this.subscriptionId\n    );\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/events/index.ts",
    "content": "import AudioEventEmitter from './AudioEventEmitter';\nimport AudioEventSubscription from './AudioEventSubscription';\n\nexport { AudioEventEmitter, AudioEventSubscription };\n"
  },
  {
    "path": "packages/react-native-audio-api/src/events/types.ts",
    "content": "import AudioBuffer from '../core/AudioBuffer';\nimport { NotificationEvents } from '../system';\n\nexport interface EventEmptyType {}\n\nexport interface EventTypeWithValue {\n  value: number;\n}\n\nexport type InterruptionType = 'began' | 'ended';\n\nexport interface OnInterruptionEventType {\n  type: InterruptionType;\n  shouldResume: boolean;\n}\n\nexport type RouteChangeReason =\n  | 'Unknown'\n  | 'Override'\n  | 'CategoryChange'\n  | 'WakeFromSleep'\n  | 'NewDeviceAvailable'\n  | 'OldDeviceUnavailable'\n  | 'ConfigurationChange'\n  | 'NoSuitableRouteForCategory';\n\nexport interface OnRouteChangeEventType {\n  reason: RouteChangeReason;\n}\n\nexport interface OnRecorderErrorEventType {\n  message: string;\n}\n\ntype SystemEvents = {\n  volumeChange: EventTypeWithValue;\n  interruption: OnInterruptionEventType;\n  duck: EventEmptyType;\n  routeChange: OnRouteChangeEventType;\n};\n\nexport interface OnBufferEndEventType {\n  bufferId: string;\n  isLastBufferInQueue: boolean;\n}\n\n/**\n * Represents the data payload received by the audio recorder callback each time\n * a new audio buffer becomes available during recording.\n */\nexport interface OnAudioReadyEventType {\n  /**\n   * The audio buffer containing the recorded PCM data. This buffer includes one\n   * or more channels of floating-point samples in the range of -1.0 to 1.0.\n   */\n  buffer: AudioBuffer;\n\n  /**\n   * The number of audio frames contained in this buffer. A frame represents a\n   * single sample across all channels.\n   */\n  numFrames: number;\n\n  /**\n   * The timestamp (in seconds) indicating when this buffer was captured,\n   * relative to the start of the recording session.\n   */\n  when: number;\n}\n\ninterface AudioAPIEvents {\n  ended: EventEmptyType;\n  loopEnded: EventEmptyType;\n  audioReady: OnAudioReadyEventType;\n  positionChanged: EventTypeWithValue;\n  bufferEnded: OnBufferEndEventType;\n  recorderError: OnRecorderErrorEventType;\n}\n\ntype AudioEvents = SystemEvents & AudioAPIEvents & NotificationEvents;\n\nexport type SystemEventName = keyof SystemEvents;\nexport type SystemEventCallback<Name extends SystemEventName> = (\n  event: SystemEvents[Name]\n) => void;\n\nexport type AudioAPIEventName = keyof AudioAPIEvents;\nexport type AudioAPIEventCallback<Name extends AudioAPIEventName> = (\n  event: AudioAPIEvents[Name]\n) => void;\n\nexport type AudioEventName = keyof AudioEvents;\nexport type AudioEventCallback<Name extends AudioEventName> = (\n  event: AudioEvents[Name]\n) => void;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/hooks/index.ts",
    "content": "export { default as useAudioInput } from './useAudioInput';\nexport { default as useSystemVolume } from './useSystemVolume';\n"
  },
  {
    "path": "packages/react-native-audio-api/src/hooks/useAudioInput.ts",
    "content": "import { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { AudioManager } from '../api';\nimport { OnRouteChangeEventType, RouteChangeReason } from '../events/types';\nimport {\n  AudioDeviceInfo,\n  AudioDeviceList,\n  AudioDevicesInfo,\n} from '../system/types';\n\nconst meaningfulReasons: RouteChangeReason[] = [\n  'NewDeviceAvailable',\n  'OldDeviceUnavailable',\n  // e.g. system picks a different device as current one is not suitable for the new configuration\n  'CategoryChange',\n  'ConfigurationChange',\n];\n\n/**\n * A hook that provides basic information and selection capabilities for audio\n * input devices on the system. (iOS only currently). The hook will\n * automatically listen for configuration changes and updates its state. If you\n * need more granular control, consider using the AudioManager API directly.\n *\n * @returns An object containing audio input information and selection\n *   capabilities\n */\nexport default function useAudioInput() {\n  const [availableInputs, setAvailableInputs] = useState<AudioDeviceList>([]);\n  const [currentInput, setCurrentInput] = useState<string | null>(null);\n\n  const onSelectInput = useCallback(async (device: AudioDeviceInfo) => {\n    const success = await AudioManager.setInputDevice(device.id);\n\n    if (success) {\n      setCurrentInput(device.id);\n    }\n\n    const devicesInfo: AudioDevicesInfo = await AudioManager.getDevicesInfo();\n    setAvailableInputs(devicesInfo.availableInputs);\n  }, []);\n\n  useEffect(() => {\n    async function fetchAvailableInputs() {\n      const audioDevices = await AudioManager.getDevicesInfo();\n      const currentDeviceId = audioDevices.currentInputs.length\n        ? audioDevices.currentInputs[0].id\n        : null;\n\n      setAvailableInputs(audioDevices.availableInputs);\n      setCurrentInput(currentDeviceId);\n    }\n\n    async function handleRouteChange(event: OnRouteChangeEventType) {\n      if (!meaningfulReasons.includes(event.reason)) {\n        return;\n      }\n\n      await fetchAvailableInputs();\n    }\n\n    const sub = AudioManager.addSystemEventListener(\n      'routeChange',\n      handleRouteChange\n    );\n\n    fetchAvailableInputs();\n    return () => {\n      sub?.remove();\n    };\n  }, []);\n\n  return useMemo(\n    () => ({\n      /**\n       * The list of available audio input devices under current device\n       * configuration.\n       */\n      availableInputs,\n      /**\n       * The currently selected audio input device, or null if none is yet\n       * decided by the system.\n       */\n      currentInput: availableInputs.find((d) => d.id === currentInput) || null,\n      /**\n       * Selects the given device as the current input. Returns true if\n       * successful, throws otherwise.\n       */\n      onSelectInput,\n    }),\n    [availableInputs, currentInput, onSelectInput]\n  );\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/hooks/useSystemVolume.ts",
    "content": "import { useEffect, useState } from 'react';\n\nimport { AudioManager } from '../api';\n\nexport default function useSystemVolume() {\n  const [volume, setVolume] = useState(0);\n\n  useEffect(() => {\n    AudioManager.observeVolumeChanges(true);\n    const listener = AudioManager.addSystemEventListener(\n      'volumeChange',\n      (e) => {\n        setVolume(parseFloat(e.value.toFixed(2)));\n      }\n    );\n\n    return () => {\n      listener?.remove();\n      AudioManager.observeVolumeChanges(false);\n    };\n  }, []);\n\n  return volume;\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/index.ts",
    "content": "export * from './api';\n\n// Note: hooks are (and always should!) rely only on imports from './api'\n// to be able to use them both in RN and Web environments.\n// Thus they can/have to be exported here.\nexport * from './hooks';\n"
  },
  {
    "path": "packages/react-native-audio-api/src/interfaces.ts",
    "content": "import { AudioEventCallback, AudioEventName } from './events/types';\nimport type {\n  AnalyserOptions,\n  AudioRecorderCallbackOptions,\n  AudioRecorderFileOptions,\n  AutomationEventData,\n  BaseAudioBufferSourceOptions,\n  BiquadFilterOptions,\n  BiquadFilterType,\n  ChannelCountMode,\n  ChannelInterpretation,\n  ConstantSourceOptions,\n  ContextState,\n  DelayOptions,\n  FileInfo,\n  GainOptions,\n  IAudioBufferSourceOptions,\n  IConvolverOptions,\n  IIRFilterOptions,\n  OscillatorOptions,\n  OscillatorType,\n  OverSampleType,\n  Result,\n  StereoPannerOptions,\n  StreamerOptions,\n  WaveShaperOptions,\n  AudioFileSourceOptions,\n} from './types';\n\n// IMPORTANT: use only IClass, because it is a part of contract between cpp host object and js layer\n\nexport type WorkletNodeCallback = (\n  audioData: Array<ArrayBuffer>,\n  channelCount: number\n) => void;\n\nexport type WorkletSourceNodeCallback = (\n  audioData: Array<ArrayBuffer>,\n  framesToProcess: number,\n  currentTime: number,\n  startOffset: number\n) => void;\n\nexport type WorkletProcessingNodeCallback = (\n  inputData: Array<ArrayBuffer>,\n  outputData: Array<ArrayBuffer>,\n  framesToProcess: number,\n  currentTime: number\n) => void;\n\nexport type ShareableWorkletCallback =\n  | WorkletNodeCallback\n  | WorkletSourceNodeCallback\n  | WorkletProcessingNodeCallback;\n\nexport interface IBaseAudioContext {\n  readonly destination: IAudioDestinationNode;\n  readonly state: ContextState;\n  readonly sampleRate: number;\n  readonly currentTime: number;\n  readonly decoder: IAudioDecoder;\n  readonly stretcher: IAudioStretcher;\n\n  createRecorderAdapter(): IRecorderAdapterNode;\n  createWorkletSourceNode(\n    shareableWorklet: ShareableWorkletCallback,\n    shouldUseUiRuntime: boolean\n  ): IWorkletSourceNode;\n  createWorkletNode(\n    shareableWorklet: ShareableWorkletCallback,\n    shouldUseUiRuntime: boolean,\n    bufferLength: number,\n    inputChannelCount: number\n  ): IWorkletNode;\n  createWorkletProcessingNode(\n    shareableWorklet: ShareableWorkletCallback,\n    shouldUseUiRuntime: boolean\n  ): IWorkletProcessingNode;\n  createOscillator(oscillatorOptions: OscillatorOptions): IOscillatorNode;\n  createConstantSource(\n    constantSourceOptions: ConstantSourceOptions\n  ): IConstantSourceNode;\n  createGain(gainOptions: GainOptions): IGainNode;\n  createStereoPanner(\n    stereoPannerOptions: StereoPannerOptions\n  ): IStereoPannerNode;\n  createBiquadFilter: (\n    biquadFilterOptions: BiquadFilterOptions\n  ) => IBiquadFilterNode;\n  createBufferSource: (\n    audioBufferSourceOptions: IAudioBufferSourceOptions\n  ) => IAudioBufferSourceNode;\n  createDelay(delayOptions: DelayOptions): IDelayNode;\n  createIIRFilter: (IIRFilterOptions: IIRFilterOptions) => IIIRFilterNode;\n  createBufferQueueSource: (\n    audioBufferQueueSourceOptions: BaseAudioBufferSourceOptions\n  ) => IAudioBufferQueueSourceNode;\n  createPeriodicWave: (\n    real: Float32Array,\n    imag: Float32Array,\n    disableNormalization: boolean\n  ) => IPeriodicWave;\n  createAnalyser: (analyserOptions: AnalyserOptions) => IAnalyserNode;\n  createConvolver: (convolverOptions: IConvolverOptions) => IConvolverNode;\n  createStreamer: (streamerOptions: StreamerOptions) => IStreamerNode | null; // null when FFmpeg is not enabled\n  createWaveShaper: (waveShaperOptions: WaveShaperOptions) => IWaveShaperNode;\n  createFileSource: (\n    audioFileOptions: AudioFileSourceOptions\n  ) => IAudioFileSourceNode | null; // null when FFmpeg is not enabled, but needed\n}\n\nexport interface IAudioContext extends IBaseAudioContext {\n  close(): Promise<void>;\n  resume(): Promise<boolean>;\n  suspend(): Promise<boolean>;\n}\n\nexport interface IOfflineAudioContext extends IBaseAudioContext {\n  resume(): Promise<void>;\n  suspend(suspendTime: number): Promise<void>;\n  startRendering(): Promise<IAudioBuffer>;\n}\n\nexport interface IAudioNode {\n  readonly context: BaseAudioContext;\n  readonly numberOfInputs: number;\n  readonly numberOfOutputs: number;\n  readonly channelCount: number;\n  readonly channelCountMode: ChannelCountMode;\n  readonly channelInterpretation: ChannelInterpretation;\n\n  connect: (destination: IAudioNode | IAudioParam) => void;\n  disconnect: (destination?: IAudioNode | IAudioParam) => void;\n}\n\nexport interface IDelayNode extends IAudioNode {\n  readonly delayTime: IAudioParam;\n  maxDelayTime: number;\n}\n\nexport interface IGainNode extends IAudioNode {\n  readonly gain: IAudioParam;\n}\n\nexport interface IStereoPannerNode extends IAudioNode {\n  readonly pan: IAudioParam;\n}\n\nexport interface IBiquadFilterNode extends IAudioNode {\n  readonly frequency: IAudioParam;\n  readonly detune: IAudioParam;\n  readonly Q: IAudioParam;\n  readonly gain: IAudioParam;\n  type: BiquadFilterType;\n\n  getFrequencyResponse(\n    frequencyArray: Float32Array,\n    magResponseOutput: Float32Array,\n    phaseResponseOutput: Float32Array\n  ): void;\n}\n\nexport interface IIIRFilterNode extends IAudioNode {\n  getFrequencyResponse(\n    frequencyArray: Float32Array,\n    magResponseOutput: Float32Array,\n    phaseResponseOutput: Float32Array\n  ): void;\n}\n\nexport interface IAudioDestinationNode extends IAudioNode {}\n\nexport interface IAudioScheduledSourceNode extends IAudioNode {\n  start(when: number): void;\n  stop: (when: number) => void;\n\n  // passing subscriptionId(uint_64 in cpp, string in js) to the cpp\n  onEnded: string;\n}\n\nexport interface IAudioBufferBaseSourceNode extends IAudioScheduledSourceNode {\n  detune: IAudioParam;\n  playbackRate: IAudioParam;\n\n  getInputLatency: () => number;\n  getOutputLatency: () => number;\n\n  // passing subscriptionId(uint_64 in cpp, string in js) to the cpp\n  onPositionChanged: string;\n  // set how often the onPositionChanged event is called\n  onPositionChangedInterval: number;\n}\n\nexport interface IOscillatorNode extends IAudioScheduledSourceNode {\n  readonly frequency: IAudioParam;\n  readonly detune: IAudioParam;\n  type: OscillatorType;\n\n  setPeriodicWave(periodicWave: IPeriodicWave): void;\n}\n\nexport interface IStreamerNode extends IAudioNode {}\n\nexport interface IConstantSourceNode extends IAudioScheduledSourceNode {\n  readonly offset: IAudioParam;\n}\n\nexport interface IAudioBufferSourceNode extends IAudioBufferBaseSourceNode {\n  buffer: IAudioBuffer | null;\n  loop: boolean;\n  loopSkip: boolean;\n  loopStart: number;\n  loopEnd: number;\n\n  start: (when?: number, offset?: number, duration?: number) => void;\n  setBuffer: (audioBuffer: IAudioBuffer | null) => void;\n\n  // passing subscriptionId(uint_64 in cpp, string in js) to the cpp\n  onLoopEnded: string;\n}\n\nexport interface IAudioBufferQueueSourceNode extends IAudioBufferBaseSourceNode {\n  dequeueBuffer: (bufferId: number) => void;\n  clearBuffers: () => void;\n\n  // returns bufferId\n  enqueueBuffer: (audioBuffer: IAudioBuffer) => string;\n  start: (when?: number, offset?: number) => void;\n  pause: () => void;\n\n  // passing subscriptionId(uint_64 in cpp, string in js) to the cpp\n  onBufferEnded: string;\n}\n\nexport interface IAudioFileSourceNode extends IAudioScheduledSourceNode {\n  volume?: number;\n  loop: boolean;\n  readonly currentTime: number;\n  readonly duration: number;\n  pause: () => void;\n  seekToTime: (seconds: number) => void;\n\n  // passing subscriptionId(uint_64 in cpp, string in js) to the cpp\n  onPositionChanged: string;\n}\n\nexport interface IConvolverNode extends IAudioNode {\n  readonly buffer: IAudioBuffer | null;\n  normalize: boolean;\n\n  setBuffer: (audioBuffer: IAudioBuffer | null) => void;\n}\n\nexport interface IAudioBuffer {\n  readonly length: number;\n  readonly duration: number;\n  readonly sampleRate: number;\n  readonly numberOfChannels: number;\n\n  getChannelData(channel: number): Float32Array;\n  copyFromChannel(\n    destination: Float32Array,\n    channelNumber: number,\n    startInChannel: number\n  ): void;\n  copyToChannel(\n    source: Float32Array,\n    channelNumber: number,\n    startInChannel: number\n  ): void;\n}\n\nexport interface IAudioParam {\n  value: number;\n  defaultValue: number;\n  minValue: number;\n  maxValue: number;\n\n  setValueAtTime: (value: number, startTime: number) => void;\n  linearRampToValueAtTime: (value: number, endTime: number) => void;\n  exponentialRampToValueAtTime: (value: number, endTime: number) => void;\n  setTargetAtTime: (\n    target: number,\n    startTime: number,\n    timeConstant: number\n  ) => void;\n  setValueCurveAtTime: (\n    values: Float32Array,\n    startTime: number,\n    duration: number\n  ) => void;\n  cancelScheduledValues: (cancelTime: number) => void;\n  cancelAndHoldAtTime: (cancelTime: number) => void;\n  checkCurveExclusion: (eventData: AutomationEventData) => Result<void>;\n}\n\nexport interface IPeriodicWave {}\n\nexport interface IAnalyserNode extends IAudioNode {\n  fftSize: number;\n  readonly frequencyBinCount: number;\n  minDecibels: number;\n  maxDecibels: number;\n  smoothingTimeConstant: number;\n\n  getFloatFrequencyData: (array: Float32Array) => void;\n  getByteFrequencyData: (array: Uint8Array) => void;\n  getFloatTimeDomainData: (array: Float32Array) => void;\n  getByteTimeDomainData: (array: Uint8Array) => void;\n}\n\nexport interface IRecorderAdapterNode extends IAudioNode {}\n\nexport interface IWorkletNode extends IAudioNode {}\n\nexport interface IWorkletSourceNode extends IAudioScheduledSourceNode {}\n\nexport interface IWorkletProcessingNode extends IAudioNode {}\n\nexport interface IWaveShaperNode extends IAudioNode {\n  readonly curve: Float32Array | null;\n  oversample: OverSampleType;\n\n  setCurve(curve: Float32Array | null): void;\n}\nexport interface IAudioRecorderCallbackOptions extends AudioRecorderCallbackOptions {\n  callbackId: string;\n}\n\nexport interface IAudioRecorder {\n  // default recorder methods\n  start: (fileNameOverride?: string) => Result<{}>;\n  stop: () => Result<FileInfo>;\n  isRecording: () => boolean;\n  isPaused: () => boolean;\n\n  enableFileOutput: (options: AudioRecorderFileOptions) => Result<{}>;\n  disableFileOutput: () => void;\n\n  // pause and resume methods for file recording\n  pause: () => void;\n  resume: () => void;\n\n  // Graph integration methods\n  connect: (node: IRecorderAdapterNode) => void;\n  disconnect: () => void;\n\n  setOnAudioReady: (options: IAudioRecorderCallbackOptions) => Result<void>;\n  clearOnAudioReady: () => void;\n\n  setOnError: (options: { callbackId: string }) => void;\n  clearOnError: () => void;\n\n  getCurrentDuration: () => number;\n  getFilePath: () => string | null;\n}\n\nexport interface IAudioDecoder {\n  decodeWithMemoryBlock: (\n    arrayBuffer: ArrayBuffer,\n    sampleRate?: number\n  ) => Promise<IAudioBuffer>;\n  decodeWithFilePath: (\n    sourcePath: string,\n    sampleRate?: number\n  ) => Promise<IAudioBuffer>;\n  decodeWithPCMInBase64: (\n    b64: string,\n    inputSampleRate: number,\n    inputChannelCount: number,\n    interleaved?: boolean\n  ) => Promise<IAudioBuffer>;\n}\n\nexport interface IAudioStretcher {\n  changePlaybackSpeed: (\n    arrayBuffer: IAudioBuffer,\n    playbackSpeed: number\n  ) => Promise<IAudioBuffer>;\n}\n\nexport interface IAudioEventEmitter {\n  addAudioEventListener<Name extends AudioEventName>(\n    name: Name,\n    callback: AudioEventCallback<Name>\n  ): string;\n  removeAudioEventListener<Name extends AudioEventName>(\n    name: Name,\n    subscriptionId: string\n  ): void;\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/mock/index.ts",
    "content": "import {\n  AudioContextOptions,\n  AudioRecorderCallbackOptions,\n  AudioRecorderFileOptions,\n  AudioRecorderStartOptions,\n  AudioWorkletRuntime,\n  BiquadFilterType,\n  ChannelCountMode,\n  ChannelInterpretation,\n  ContextState,\n  FileDirectory,\n  FileFormat,\n  FileInfo,\n  FilePresetType,\n  OfflineAudioContextOptions,\n  OscillatorType,\n  OverSampleType,\n  Result,\n  AnalyserOptions,\n  AudioBufferSourceOptions,\n  BaseAudioBufferSourceOptions,\n  BiquadFilterOptions,\n  ConstantSourceOptions,\n  ConvolverOptions,\n  DelayOptions,\n  GainOptions,\n  OscillatorOptions,\n  PeriodicWaveOptions,\n  StereoPannerOptions,\n  StreamerOptions,\n  WaveShaperOptions,\n} from '../types';\n\n/* eslint-disable no-useless-constructor */\n\nconst noop = () => {};\n\nclass MockEventSubscription {\n  public subscriptionId: string = Number(1).toString();\n\n  remove = noop;\n}\n\nclass MockAudioEventEmitter {\n  private listeners: {\n    [event: string]: Array<\n      (event: Partial<Record<string, unknown>> | undefined) => void\n    >;\n  } = {};\n\n  addAudioEventListener(\n    event: string,\n    callback: (event: Partial<Record<string, unknown>> | undefined) => void\n  ): MockEventSubscription {\n    if (!this.listeners[event]) {\n      this.listeners[event] = [];\n    }\n    this.listeners[event].push(callback);\n    const subscription = new MockEventSubscription();\n\n    subscription.remove = () => {\n      const index = this.listeners[event]?.indexOf(callback);\n      if (index && index > -1) {\n        this.listeners[event].splice(index, 1);\n      }\n    };\n\n    return subscription;\n  }\n\n  emit(event: string, data: Record<string, unknown>): void {\n    this.listeners[event]?.forEach((callback) => callback(data));\n  }\n}\n\nclass AudioParamMock {\n  private _value: number = 0;\n  public defaultValue: number = 0;\n  public minValue: number = -3.4028235e38;\n  public maxValue: number = 3.4028235e38;\n\n  constructor(_audioParam: unknown, _context: BaseAudioContextMock) {}\n\n  get value(): number {\n    return this._value;\n  }\n\n  set value(newValue: number) {\n    this._value = newValue;\n  }\n\n  public setValueAtTime(value: number, _startTime: number): AudioParamMock {\n    this._value = value;\n    return this;\n  }\n\n  public linearRampToValueAtTime(\n    value: number,\n    _endTime: number\n  ): AudioParamMock {\n    this._value = value;\n    return this;\n  }\n\n  public exponentialRampToValueAtTime(\n    value: number,\n    _endTime: number\n  ): AudioParamMock {\n    this._value = value;\n    return this;\n  }\n\n  public setTargetAtTime(\n    target: number,\n    _startTime: number,\n    _timeConstant: number\n  ): AudioParamMock {\n    this._value = target;\n    return this;\n  }\n\n  public setValueCurveAtTime(\n    _values: Float32Array,\n    _startTime: number,\n    _duration: number\n  ): AudioParamMock {\n    return this;\n  }\n\n  public cancelScheduledValues(_startTime: number): AudioParamMock {\n    return this;\n  }\n\n  public cancelAndHoldAtTime(_startTime: number): AudioParamMock {\n    return this;\n  }\n}\n\nclass AudioBufferMock {\n  public sampleRate: number;\n  public length: number;\n  public duration: number;\n  public numberOfChannels: number;\n\n  constructor(options: {\n    numberOfChannels: number;\n    length: number;\n    sampleRate: number;\n  }) {\n    this.numberOfChannels = options.numberOfChannels;\n    this.length = options.length;\n    this.sampleRate = options.sampleRate;\n    this.duration = options.length / options.sampleRate;\n  }\n\n  getChannelData(_channel: number): Float32Array {\n    return new Float32Array(this.length);\n  }\n\n  copyFromChannel(\n    _destination: Float32Array,\n    _channelNumber: number,\n    _startInChannel?: number\n  ): void {}\n\n  copyToChannel(\n    _source: Float32Array,\n    _channelNumber: number,\n    _startInChannel?: number\n  ): void {}\n}\n\nclass AudioNodeMock {\n  public context: BaseAudioContextMock;\n  public numberOfInputs: number = 1;\n  public numberOfOutputs: number = 1;\n  public channelCount: number = 2;\n  public channelCountMode: ChannelCountMode = 'max';\n  public channelInterpretation: ChannelInterpretation = 'speakers';\n\n  constructor(context: BaseAudioContextMock, _node: unknown) {\n    this.context = context;\n  }\n\n  public connect(\n    destination: AudioNodeMock | AudioParamMock\n  ): AudioNodeMock | void {\n    if (destination instanceof AudioParamMock) {\n      return;\n    }\n    return destination;\n  }\n\n  public disconnect(_destination?: AudioNodeMock): void {}\n}\n\nclass AudioScheduledSourceNodeMock extends AudioNodeMock {\n  private _onended: ((event: Event) => void) | null = null;\n\n  constructor(context: BaseAudioContextMock, node: unknown) {\n    super(context, node);\n  }\n\n  public start(_when: number = 0): void {}\n  public stop(_when: number = 0): void {}\n\n  public get onended(): ((event: Event) => void) | null {\n    return this._onended;\n  }\n\n  public set onended(callback: ((event: Event) => void) | null) {\n    this._onended = callback;\n  }\n}\n\nclass AnalyserNodeMock extends AudioNodeMock {\n  public fftSize: number = 2048;\n  public frequencyBinCount: number = 1024;\n  public minDecibels: number = -100;\n  public maxDecibels: number = -30;\n  public smoothingTimeConstant: number = 0.8;\n\n  constructor(context: BaseAudioContextMock, _options?: AnalyserOptions) {\n    super(context, {});\n  }\n\n  getByteFrequencyData(_array: Uint8Array): void {}\n  getByteTimeDomainData(_array: Uint8Array): void {}\n  getFloatFrequencyData(_array: Float32Array): void {}\n  getFloatTimeDomainData(_array: Float32Array): void {}\n}\n\nclass GainNodeMock extends AudioNodeMock {\n  readonly gain: AudioParamMock;\n\n  constructor(context: BaseAudioContextMock, _options?: GainOptions) {\n    super(context, {});\n    this.gain = new AudioParamMock({}, context);\n    this.gain.value = 1;\n  }\n}\n\nclass DelayNodeMock extends AudioNodeMock {\n  readonly delayTime: AudioParamMock;\n\n  constructor(context: BaseAudioContextMock, _options?: DelayOptions) {\n    super(context, {});\n    this.delayTime = new AudioParamMock({}, context);\n    this.delayTime.maxValue = 1;\n  }\n}\n\nclass BiquadFilterNodeMock extends AudioNodeMock {\n  private _type: BiquadFilterType = 'lowpass';\n  readonly frequency: AudioParamMock;\n  readonly detune: AudioParamMock;\n  readonly Q: AudioParamMock;\n  readonly gain: AudioParamMock;\n\n  constructor(context: BaseAudioContextMock, _options?: BiquadFilterOptions) {\n    super(context, {});\n    this.frequency = new AudioParamMock({}, context);\n    this.detune = new AudioParamMock({}, context);\n    this.Q = new AudioParamMock({}, context);\n    this.gain = new AudioParamMock({}, context);\n\n    this.frequency.value = 350;\n    this.Q.value = 1;\n    this.gain.value = 0;\n  }\n\n  get type(): BiquadFilterType {\n    return this._type;\n  }\n\n  set type(value: BiquadFilterType) {\n    this._type = value;\n  }\n\n  getFrequencyResponse(\n    _frequencyHz: Float32Array,\n    _magResponse: Float32Array,\n    _phaseResponse: Float32Array\n  ): void {}\n}\n\nclass ConvolverNodeMock extends AudioNodeMock {\n  private _buffer: AudioBufferMock | null = null;\n  public normalize: boolean = true;\n\n  constructor(context: BaseAudioContextMock, _options?: ConvolverOptions) {\n    super(context, {});\n  }\n\n  get buffer(): AudioBufferMock | null {\n    return this._buffer;\n  }\n\n  set buffer(value: AudioBufferMock | null) {\n    this._buffer = value;\n  }\n}\n\nclass WaveShaperNodeMock extends AudioNodeMock {\n  private _curve: Float32Array | null = null;\n  private _oversample: OverSampleType = 'none';\n\n  constructor(context: BaseAudioContextMock, _options?: WaveShaperOptions) {\n    super(context, {});\n  }\n\n  get curve(): Float32Array | null {\n    return this._curve;\n  }\n\n  set curve(value: Float32Array | null) {\n    this._curve = value;\n  }\n\n  get oversample(): OverSampleType {\n    return this._oversample;\n  }\n\n  set oversample(value: OverSampleType) {\n    this._oversample = value;\n  }\n}\n\nclass StereoPannerNodeMock extends AudioNodeMock {\n  readonly pan: AudioParamMock;\n\n  constructor(context: BaseAudioContextMock, _options?: StereoPannerOptions) {\n    super(context, {});\n    this.pan = new AudioParamMock({}, context);\n  }\n}\n\nclass OscillatorNodeMock extends AudioScheduledSourceNodeMock {\n  private _type: OscillatorType = 'sine';\n  readonly frequency: AudioParamMock;\n  readonly detune: AudioParamMock;\n\n  constructor(context: BaseAudioContextMock, _options?: OscillatorOptions) {\n    super(context, {});\n    this.frequency = new AudioParamMock({}, context);\n    this.detune = new AudioParamMock({}, context);\n    this.frequency.value = 440;\n  }\n\n  get type(): OscillatorType {\n    return this._type;\n  }\n\n  set type(value: OscillatorType) {\n    this._type = value;\n  }\n\n  public setPeriodicWave(_wave: PeriodicWaveMock): void {}\n}\n\nclass ConstantSourceNodeMock extends AudioScheduledSourceNodeMock {\n  readonly offset: AudioParamMock;\n\n  constructor(context: BaseAudioContextMock, _options?: ConstantSourceOptions) {\n    super(context, {});\n    this.offset = new AudioParamMock({}, context);\n    this.offset.value = 1;\n  }\n}\n\nclass AudioBufferSourceNodeMock extends AudioScheduledSourceNodeMock {\n  private _buffer: AudioBufferMock | null = null;\n  private _loop: boolean = false;\n  private _loopStart: number = 0;\n  private _loopEnd: number = 0;\n  readonly playbackRate: AudioParamMock;\n\n  constructor(\n    context: BaseAudioContextMock,\n    _options?: AudioBufferSourceOptions\n  ) {\n    super(context, {});\n    this.playbackRate = new AudioParamMock({}, context);\n    this.playbackRate.value = 1;\n  }\n\n  get buffer(): AudioBufferMock | null {\n    return this._buffer;\n  }\n\n  set buffer(value: AudioBufferMock | null) {\n    this._buffer = value;\n  }\n\n  get loop(): boolean {\n    return this._loop;\n  }\n\n  set loop(value: boolean) {\n    this._loop = value;\n  }\n\n  get loopStart(): number {\n    return this._loopStart;\n  }\n\n  set loopStart(value: number) {\n    this._loopStart = value;\n  }\n\n  get loopEnd(): number {\n    return this._loopEnd;\n  }\n\n  set loopEnd(value: number) {\n    this._loopEnd = value;\n  }\n}\n\nclass RecorderAdapterNodeMock extends AudioNodeMock {\n  public wasConnected: boolean = false;\n\n  constructor(context: BaseAudioContextMock) {\n    super(context, {});\n  }\n\n  getNode(): Record<string, unknown> {\n    return {};\n  }\n}\n\nclass AudioBufferQueueSourceNodeMock extends AudioScheduledSourceNodeMock {\n  private _onBufferEnded: ((event: { bufferId: string }) => void) | null = null;\n  private eventEmitter = new MockAudioEventEmitter();\n\n  constructor(\n    context: BaseAudioContextMock,\n    _options?: BaseAudioBufferSourceOptions\n  ) {\n    super(context, {});\n  }\n\n  enqueueBuffer(_buffer: AudioBufferMock): string {\n    return Math.random().toString(36).substr(2, 9);\n  }\n\n  dequeueBuffer(_bufferId: string): void {}\n  clearBuffers(): void {}\n  pause(): void {}\n\n  get onBufferEnded(): ((event: { bufferId: string }) => void) | null {\n    return this._onBufferEnded;\n  }\n\n  set onBufferEnded(callback: ((event: { bufferId: string }) => void) | null) {\n    this._onBufferEnded = callback;\n  }\n}\n\nclass StreamerNodeMock extends AudioScheduledSourceNodeMock {\n  readonly streamPath: string = '';\n\n  constructor(context: BaseAudioContextMock, options: StreamerOptions) {\n    super(context, options);\n    this.streamPath = options.streamPath;\n  }\n\n  pause(): void {}\n  resume(): void {}\n}\n\nclass WorkletNodeMock extends AudioNodeMock {\n  constructor(\n    context: BaseAudioContextMock,\n    _runtime: AudioWorkletRuntime,\n    _callback: (audioData: Array<Float32Array>, channelCount: number) => void,\n    _bufferLength: number,\n    _inputChannelCount: number\n  ) {\n    super(context, {});\n  }\n}\n\nclass WorkletProcessingNodeMock extends AudioNodeMock {\n  constructor(\n    context: BaseAudioContextMock,\n    _runtime: AudioWorkletRuntime,\n    _callback: (\n      inputData: Array<Float32Array>,\n      outputData: Array<Float32Array>,\n      framesToProcess: number,\n      currentTime: number\n    ) => void\n  ) {\n    super(context, {});\n  }\n}\n\nclass WorkletSourceNodeMock extends AudioScheduledSourceNodeMock {\n  constructor(\n    context: BaseAudioContextMock,\n    _runtime: AudioWorkletRuntime,\n    _callback: (\n      audioData: Array<Float32Array>,\n      framesToProcess: number,\n      currentTime: number,\n      startOffset: number\n    ) => void\n  ) {\n    super(context, {});\n  }\n}\n\nclass PeriodicWaveMock {\n  constructor(_context: BaseAudioContextMock, _options?: PeriodicWaveOptions) {}\n}\n\nclass AudioDestinationNodeMock extends AudioNodeMock {\n  public maxChannelCount: number = 2;\n\n  constructor(context: BaseAudioContextMock) {\n    super(context, {});\n    this.numberOfOutputs = 0;\n  }\n}\n\nclass BaseAudioContextMock {\n  public destination: AudioDestinationNodeMock;\n  private _sampleRate: number = 44100;\n  private _currentTime: number = 0;\n  protected _state: ContextState = 'running';\n\n  constructor(options?: AudioContextOptions) {\n    this.destination = new AudioDestinationNodeMock(this);\n    if (options?.sampleRate) {\n      this._sampleRate = options.sampleRate;\n    }\n  }\n\n  get currentTime(): number {\n    return this._currentTime;\n  }\n\n  get sampleRate(): number {\n    return this._sampleRate;\n  }\n\n  get state(): ContextState {\n    return this._state;\n  }\n\n  createBuffer(\n    numberOfChannels: number,\n    length: number,\n    sampleRate: number\n  ): AudioBufferMock {\n    return new AudioBufferMock({ numberOfChannels, length, sampleRate });\n  }\n\n  createPeriodicWave(\n    _real?: Float32Array,\n    _imag?: Float32Array,\n    _constraints?: { disableNormalization?: boolean }\n  ): PeriodicWaveMock {\n    return new PeriodicWaveMock(this);\n  }\n\n  decodeAudioData(_audioData: ArrayBuffer): Promise<AudioBufferMock> {\n    return Promise.resolve(\n      new AudioBufferMock({\n        numberOfChannels: 2,\n        length: 44100,\n        sampleRate: 44100,\n      })\n    );\n  }\n\n  createAnalyser(options?: AnalyserOptions): AnalyserNodeMock {\n    return new AnalyserNodeMock(this, options);\n  }\n\n  createBiquadFilter(options?: BiquadFilterOptions): BiquadFilterNodeMock {\n    return new BiquadFilterNodeMock(this, options);\n  }\n\n  createBufferSource(\n    options?: AudioBufferSourceOptions\n  ): AudioBufferSourceNodeMock {\n    return new AudioBufferSourceNodeMock(this, options);\n  }\n\n  createChannelMerger(_numberOfInputs?: number): AudioNodeMock {\n    return new AudioNodeMock(this, {});\n  }\n\n  createChannelSplitter(_numberOfOutputs?: number): AudioNodeMock {\n    return new AudioNodeMock(this, {});\n  }\n\n  createConstantSource(\n    options?: ConstantSourceOptions\n  ): ConstantSourceNodeMock {\n    return new ConstantSourceNodeMock(this, options);\n  }\n\n  createConvolver(options?: ConvolverOptions): ConvolverNodeMock {\n    return new ConvolverNodeMock(this, options);\n  }\n\n  createDelay(options?: DelayOptions): DelayNodeMock {\n    return new DelayNodeMock(this, options);\n  }\n\n  createGain(options?: GainOptions): GainNodeMock {\n    return new GainNodeMock(this, options);\n  }\n\n  createOscillator(options?: OscillatorOptions): OscillatorNodeMock {\n    return new OscillatorNodeMock(this, options);\n  }\n\n  createStereoPanner(options?: StereoPannerOptions): StereoPannerNodeMock {\n    return new StereoPannerNodeMock(this, options);\n  }\n\n  createWaveShaper(options?: WaveShaperOptions): WaveShaperNodeMock {\n    return new WaveShaperNodeMock(this, options);\n  }\n\n  createRecorderAdapter(): RecorderAdapterNodeMock {\n    return new RecorderAdapterNodeMock(this);\n  }\n\n  createBufferQueueSource(\n    options?: BaseAudioBufferSourceOptions\n  ): AudioBufferQueueSourceNodeMock {\n    return new AudioBufferQueueSourceNodeMock(this, options);\n  }\n\n  createStreamer(options: StreamerOptions): StreamerNodeMock {\n    return new StreamerNodeMock(this, options);\n  }\n\n  createWorkletNode(\n    _shareableWorklet: Record<string, unknown>,\n    _runOnUI: boolean,\n    _bufferLength: number,\n    _inputChannelCount: number\n  ): WorkletNodeMock {\n    return new WorkletNodeMock(this, 'AudioRuntime', noop, 0, 0);\n  }\n\n  createWorkletProcessingNode(\n    _shareableWorklet: Record<string, unknown>,\n    _runOnUI: boolean\n  ): WorkletProcessingNodeMock {\n    return new WorkletProcessingNodeMock(this, 'AudioRuntime', noop);\n  }\n\n  createWorkletSourceNode(\n    _shareableWorklet: Record<string, unknown>,\n    _runOnUI: boolean\n  ): WorkletSourceNodeMock {\n    return new WorkletSourceNodeMock(this, 'AudioRuntime', noop);\n  }\n}\n\nclass AudioContextMock extends BaseAudioContextMock {\n  constructor(options?: AudioContextOptions) {\n    super(options);\n  }\n\n  close(): Promise<void> {\n    this._state = 'closed';\n    return Promise.resolve();\n  }\n\n  resume(): Promise<void> {\n    this._state = 'running';\n    return Promise.resolve();\n  }\n\n  suspend(): Promise<void> {\n    this._state = 'suspended';\n    return Promise.resolve();\n  }\n}\n\nclass OfflineAudioContextMock extends BaseAudioContextMock {\n  public length: number;\n\n  constructor(options: OfflineAudioContextOptions) {\n    super({ sampleRate: options.sampleRate });\n    this.length = options.length;\n  }\n\n  startRendering(): Promise<AudioBufferMock> {\n    return Promise.resolve(\n      new AudioBufferMock({\n        numberOfChannels: 2,\n        length: this.length,\n        sampleRate: this.sampleRate,\n      })\n    );\n  }\n}\n\nclass AudioRecorderMock {\n  private _isRecording: boolean = false;\n  private _isPaused: boolean = false;\n  private _currentDuration: number = 0;\n  private _options: AudioRecorderFileOptions | null = null;\n  private isFileOutputEnabled: boolean = false;\n  private eventEmitter = new MockAudioEventEmitter();\n  private onAudioReadySubscription: MockEventSubscription | null = null;\n  private onErrorSubscription: MockEventSubscription | null = null;\n\n  constructor() {}\n\n  enableFileOutput(\n    options?: AudioRecorderFileOptions\n  ): Result<{ path: string }> {\n    this._options = options || {};\n    this.isFileOutputEnabled = true;\n    return { status: 'success', path: '/mock/path/recordings' };\n  }\n\n  get options(): AudioRecorderFileOptions | null {\n    return this._options;\n  }\n\n  disableFileOutput(): void {\n    this._options = null;\n    this.isFileOutputEnabled = false;\n  }\n\n  start(options?: AudioRecorderStartOptions): Result<{ path: string }> {\n    this._isRecording = true;\n    this._isPaused = false;\n    const path = options?.fileNameOverride || 'recording.m4a';\n    return { status: 'success', path };\n  }\n\n  stop(): Result<FileInfo> {\n    this._isRecording = false;\n    this._isPaused = false;\n    this._currentDuration = 0;\n    return {\n      status: 'success',\n      paths: ['/mock/path/recording.m4a'],\n      size: 12345,\n      duration: 5.0,\n    };\n  }\n\n  pause(): void {\n    this._isPaused = true;\n  }\n\n  resume(): void {\n    this._isPaused = false;\n  }\n\n  connect(_node: RecorderAdapterNodeMock): void {\n    if (_node.wasConnected) {\n      throw new Error('RecorderAdapterNode cannot be connected more than once');\n    }\n    _node.wasConnected = true;\n  }\n\n  disconnect(): void {}\n\n  onAudioReady(\n    _options: AudioRecorderCallbackOptions,\n    callback: (event: Partial<Record<string, unknown>> | undefined) => void\n  ): Result<{}> {\n    if (this.onAudioReadySubscription) {\n      this.onAudioReadySubscription.remove();\n    }\n\n    this.onAudioReadySubscription = this.eventEmitter.addAudioEventListener(\n      'audioReady',\n      callback\n    );\n\n    return { status: 'success' };\n  }\n\n  clearOnAudioReady(): void {\n    if (this.onAudioReadySubscription) {\n      this.onAudioReadySubscription.remove();\n      this.onAudioReadySubscription = null;\n    }\n  }\n\n  isRecording(): boolean {\n    return this._isRecording;\n  }\n\n  isPaused(): boolean {\n    return this._isPaused;\n  }\n\n  getCurrentDuration(): number {\n    return this._currentDuration;\n  }\n\n  onError(\n    callback: (error: Record<string, unknown> | undefined) => void\n  ): void {\n    if (this.onErrorSubscription) {\n      this.onErrorSubscription.remove();\n    }\n\n    this.onErrorSubscription = this.eventEmitter.addAudioEventListener(\n      'recorderError',\n      callback\n    );\n  }\n\n  clearOnError(): void {\n    if (this.onErrorSubscription) {\n      this.onErrorSubscription.remove();\n      this.onErrorSubscription = null;\n    }\n  }\n}\n\nconst decodeAudioData = (_audioData: ArrayBuffer): Promise<AudioBufferMock> => {\n  return Promise.resolve(\n    new AudioBufferMock({\n      numberOfChannels: 2,\n      length: 44100,\n      sampleRate: 44100,\n    })\n  );\n};\n\nconst decodePCMInBase64 = (_base64Data: string): Promise<AudioBufferMock> => {\n  return Promise.resolve(\n    new AudioBufferMock({\n      numberOfChannels: 2,\n      length: 44100,\n      sampleRate: 44100,\n    })\n  );\n};\n\nconst changePlaybackSpeed = (\n  buffer: AudioBufferMock,\n  _speed: number\n): Promise<AudioBufferMock> => {\n  return Promise.resolve(buffer);\n};\n\nclass AudioManagerMock {\n  static getDevicePreferredSampleRate(): number {\n    return 44100;\n  }\n\n  static observeVolumeChanges(_observe: boolean): void {}\n\n  static addSystemEventListener(\n    _event: string,\n    _callback: (event: { value: number }) => void\n  ): { remove: () => void } {\n    return { remove: noop };\n  }\n\n  static removeSystemEventListener(_listener: { remove: () => void }): void {}\n}\n\nclass NotificationManagerMock {\n  static create(_options: Record<string, unknown>): {\n    update: () => void;\n    destroy: () => void;\n  } {\n    return {\n      update: noop,\n      destroy: noop,\n    };\n  }\n}\n\nclass PlaybackNotificationManagerMock {\n  static create(_options: Record<string, unknown>): {\n    update: () => void;\n    destroy: () => void;\n  } {\n    return {\n      update: noop,\n      destroy: noop,\n    };\n  }\n}\n\nclass RecordingNotificationManagerMock {\n  static create(_options: Record<string, unknown>): {\n    update: () => void;\n    destroy: () => void;\n  } {\n    return {\n      update: noop,\n      destroy: noop,\n    };\n  }\n}\n\nlet mockSystemVolumeValue = 0.5;\nconst useSystemVolume = (): number => mockSystemVolumeValue;\nconst setMockSystemVolume = (volume: number): void => {\n  mockSystemVolumeValue = volume;\n};\n\nclass FilePresetMock {\n  static get Low(): FilePresetType {\n    return {} as FilePresetType;\n  }\n\n  static get Medium(): FilePresetType {\n    return {} as FilePresetType;\n  }\n\n  static get High(): FilePresetType {\n    return {} as FilePresetType;\n  }\n\n  static get Lossless(): FilePresetType {\n    return {} as FilePresetType;\n  }\n}\n\nclass NotSupportedErrorMock extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'NotSupportedError';\n  }\n}\n\nclass InvalidAccessErrorMock extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'InvalidAccessError';\n  }\n}\n\nclass InvalidStateErrorMock extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'InvalidStateError';\n  }\n}\n\nclass IndexSizeErrorMock extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'IndexSizeError';\n  }\n}\n\nclass RangeErrorMock extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'RangeError';\n  }\n}\n\nclass AudioApiErrorMock extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = 'AudioApiError';\n  }\n}\n\n// Export classes with original API names (for compatibility)\nexport const AnalyserNode = AnalyserNodeMock;\nexport const AudioBuffer = AudioBufferMock;\nexport const AudioBufferQueueSourceNode = AudioBufferQueueSourceNodeMock;\nexport const AudioBufferSourceNode = AudioBufferSourceNodeMock;\nexport const AudioContext = AudioContextMock;\nexport const AudioDestinationNode = AudioDestinationNodeMock;\nexport const AudioNode = AudioNodeMock;\nexport const AudioParam = AudioParamMock;\nexport const AudioRecorder = AudioRecorderMock;\nexport const AudioScheduledSourceNode = AudioScheduledSourceNodeMock;\nexport const BaseAudioContext = BaseAudioContextMock;\nexport const BiquadFilterNode = BiquadFilterNodeMock;\nexport const ConstantSourceNode = ConstantSourceNodeMock;\nexport const ConvolverNode = ConvolverNodeMock;\nexport const DelayNode = DelayNodeMock;\nexport const GainNode = GainNodeMock;\nexport const OfflineAudioContext = OfflineAudioContextMock;\nexport const OscillatorNode = OscillatorNodeMock;\nexport const RecorderAdapterNode = RecorderAdapterNodeMock;\nexport const StereoPannerNode = StereoPannerNodeMock;\nexport const StreamerNode = StreamerNodeMock;\nexport const WaveShaperNode = WaveShaperNodeMock;\nexport const WorkletNode = WorkletNodeMock;\nexport const WorkletProcessingNode = WorkletProcessingNodeMock;\nexport const WorkletSourceNode = WorkletSourceNodeMock;\nexport const PeriodicWave = PeriodicWaveMock;\n\nexport const AudioManager = AudioManagerMock;\nexport const NotificationManager = NotificationManagerMock;\nexport const PlaybackNotificationManager = PlaybackNotificationManagerMock;\nexport const RecordingNotificationManager = RecordingNotificationManagerMock;\n\nexport const FilePreset = FilePresetMock;\n\nexport const NotSupportedError = NotSupportedErrorMock;\nexport const InvalidAccessError = InvalidAccessErrorMock;\nexport const InvalidStateError = InvalidStateErrorMock;\nexport const IndexSizeError = IndexSizeErrorMock;\nexport const RangeError = RangeErrorMock;\nexport const AudioApiError = AudioApiErrorMock;\n\n// Export functions\nexport {\n  changePlaybackSpeed,\n  decodeAudioData,\n  decodePCMInBase64,\n  setMockSystemVolume,\n  useSystemVolume,\n};\n\n// Type exports to allow using classes as types\nexport type AnalyserNode = AnalyserNodeMock;\nexport type AudioBuffer = AudioBufferMock;\nexport type AudioBufferQueueSourceNode = AudioBufferQueueSourceNodeMock;\nexport type AudioBufferSourceNode = AudioBufferSourceNodeMock;\nexport type AudioContext = AudioContextMock;\nexport type AudioDestinationNode = AudioDestinationNodeMock;\nexport type AudioNode = AudioNodeMock;\nexport type AudioParam = AudioParamMock;\nexport type AudioRecorder = AudioRecorderMock;\nexport type AudioScheduledSourceNode = AudioScheduledSourceNodeMock;\nexport type BaseAudioContext = BaseAudioContextMock;\nexport type BiquadFilterNode = BiquadFilterNodeMock;\nexport type ConstantSourceNode = ConstantSourceNodeMock;\nexport type ConvolverNode = ConvolverNodeMock;\nexport type DelayNode = DelayNodeMock;\nexport type GainNode = GainNodeMock;\nexport type OfflineAudioContext = OfflineAudioContextMock;\nexport type OscillatorNode = OscillatorNodeMock;\nexport type RecorderAdapterNode = RecorderAdapterNodeMock;\nexport type StereoPannerNode = StereoPannerNodeMock;\nexport type StreamerNode = StreamerNodeMock;\nexport type WaveShaperNode = WaveShaperNodeMock;\nexport type WorkletNode = WorkletNodeMock;\nexport type WorkletProcessingNode = WorkletProcessingNodeMock;\nexport type WorkletSourceNode = WorkletSourceNodeMock;\nexport type PeriodicWave = PeriodicWaveMock;\n\n// Export types and enums\nexport {\n  AudioContextOptions,\n  AudioRecorderCallbackOptions,\n  AudioRecorderFileOptions,\n  AudioRecorderStartOptions,\n  AudioWorkletRuntime,\n  BiquadFilterType,\n  ChannelCountMode,\n  ChannelInterpretation,\n  ContextState,\n  FileDirectory,\n  FileFormat,\n  FileInfo,\n  FilePresetType,\n  OfflineAudioContextOptions,\n  OscillatorType,\n  OverSampleType,\n  Result,\n  AnalyserOptions,\n  AudioBufferSourceOptions,\n  BaseAudioBufferSourceOptions,\n  BiquadFilterOptions,\n  ConstantSourceOptions,\n  ConvolverOptions,\n  DelayOptions,\n  GainOptions,\n  OscillatorOptions,\n  PeriodicWaveOptions,\n  StereoPannerOptions,\n  StreamerOptions,\n  WaveShaperOptions,\n};\n\nexport default {\n  AnalyserNode: AnalyserNodeMock,\n  AudioBuffer: AudioBufferMock,\n  AudioBufferQueueSourceNode: AudioBufferQueueSourceNodeMock,\n  AudioBufferSourceNode: AudioBufferSourceNodeMock,\n  AudioContext: AudioContextMock,\n  AudioDestinationNode: AudioDestinationNodeMock,\n  AudioNode: AudioNodeMock,\n  AudioParam: AudioParamMock,\n  AudioRecorder: AudioRecorderMock,\n  AudioScheduledSourceNode: AudioScheduledSourceNodeMock,\n  BaseAudioContext: BaseAudioContextMock,\n  BiquadFilterNode: BiquadFilterNodeMock,\n  ConstantSourceNode: ConstantSourceNodeMock,\n  ConvolverNode: ConvolverNodeMock,\n  DelayNode: DelayNodeMock,\n  GainNode: GainNodeMock,\n  OfflineAudioContext: OfflineAudioContextMock,\n  OscillatorNode: OscillatorNodeMock,\n  RecorderAdapterNode: RecorderAdapterNodeMock,\n  StereoPannerNode: StereoPannerNodeMock,\n  StreamerNode: StreamerNodeMock,\n  WaveShaperNode: WaveShaperNodeMock,\n  WorkletNode: WorkletNodeMock,\n  WorkletProcessingNode: WorkletProcessingNodeMock,\n  WorkletSourceNode: WorkletSourceNodeMock,\n  PeriodicWave: PeriodicWaveMock,\n\n  // Functions\n  decodeAudioData,\n  decodePCMInBase64,\n  changePlaybackSpeed,\n  useSystemVolume,\n  setMockSystemVolume,\n\n  // System classes\n  AudioManager: AudioManagerMock,\n  NotificationManager: NotificationManagerMock,\n  PlaybackNotificationManager: PlaybackNotificationManagerMock,\n  RecordingNotificationManager: RecordingNotificationManagerMock,\n\n  // Utils\n  FilePreset: FilePresetMock,\n\n  // Errors\n  NotSupportedError: NotSupportedErrorMock,\n  InvalidAccessError: InvalidAccessErrorMock,\n  InvalidStateError: InvalidStateErrorMock,\n  IndexSizeError: IndexSizeErrorMock,\n  RangeError: RangeErrorMock,\n  AudioApiError: AudioApiErrorMock,\n\n  // Enums\n  FileDirectory,\n  FileFormat,\n};\n"
  },
  {
    "path": "packages/react-native-audio-api/src/options-validators.ts",
    "content": "import { IndexSizeError, NotSupportedError } from './errors';\nimport {\n  OptionsValidator,\n  AnalyserOptions,\n  ConvolverOptions,\n  OscillatorOptions,\n  PeriodicWaveOptions,\n} from './types';\n\nexport const AnalyserOptionsValidator: OptionsValidator<AnalyserOptions> = {\n  validate(options?: AnalyserOptions): void {\n    if (!options) {\n      return;\n    }\n    const allowedFFTSize: number[] = [\n      32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768,\n    ];\n    if (options.fftSize && !allowedFFTSize.includes(options.fftSize)) {\n      throw new IndexSizeError(\n        `fftSize must be one of the following values: ${allowedFFTSize.join(\n          ', '\n        )}`\n      );\n    }\n  },\n};\n\nexport const ConvolverOptionsValidator: OptionsValidator<ConvolverOptions> = {\n  validate(options?: ConvolverOptions): void {\n    if (!options) {\n      return;\n    }\n    if (options.buffer) {\n      const numberOfChannels = options.buffer.numberOfChannels;\n      if (\n        numberOfChannels !== 1 &&\n        numberOfChannels !== 2 &&\n        numberOfChannels !== 4\n      ) {\n        throw new NotSupportedError(\n          `The number of channels provided (${numberOfChannels}) in impulse response for ConvolverNode buffer must be 1 or 2 or 4.`\n        );\n      }\n    }\n  },\n};\n\nexport const OscillatorOptionsValidator: OptionsValidator<OscillatorOptions> = {\n  validate(options?: OscillatorOptions): void {\n    if (!options) {\n      return;\n    }\n    if (options.type === 'custom' && !options.periodicWave) {\n      throw new NotSupportedError(\n        \"'type' cannot be set to 'custom' without providing a 'periodicWave'.\"\n      );\n    }\n  },\n};\n\nexport const PeriodicWaveOptionsValidator: OptionsValidator<PeriodicWaveOptions> =\n  {\n    validate(options?: PeriodicWaveOptions): void {\n      if (!options) {\n        return;\n      }\n      if (\n        options.real &&\n        options.imag &&\n        options.real.length !== options.imag.length\n      ) {\n        throw new NotSupportedError(\n          \"'real' and 'imag' arrays must have the same length\"\n        );\n      }\n    },\n  };\n"
  },
  {
    "path": "packages/react-native-audio-api/src/plugin/withAudioAPI.ts",
    "content": "import {\n  AndroidConfig,\n  ConfigPlugin,\n  createRunOncePlugin,\n  withAndroidManifest,\n  withGradleProperties,\n  withInfoPlist,\n  withPodfile,\n} from '@expo/config-plugins';\nconst pkg = require('react-native-audio-api/package.json');\n\ninterface Options {\n  iosMicrophonePermission?: string;\n  iosBackgroundMode: boolean;\n  androidPermissions: string[];\n  androidForegroundService: boolean;\n  androidFSTypes: string[];\n  disableFFmpeg: boolean;\n}\n\nconst withDefaultOptions = (options: Partial<Options>): Options => {\n  return {\n    iosBackgroundMode: true,\n    androidPermissions: [\n      'android.permission.FOREGROUND_SERVICE',\n      'android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK',\n    ],\n    androidForegroundService: true,\n    androidFSTypes: ['mediaPlayback'],\n    disableFFmpeg: false,\n    ...options,\n  };\n};\n\nconst withBackgroundAudio: ConfigPlugin = (config) => {\n  return withInfoPlist(config, (iosConfig) => {\n    iosConfig.modResults.UIBackgroundModes = [\n      ...Array.from(\n        new Set([...(iosConfig.modResults.UIBackgroundModes ?? []), 'audio'])\n      ),\n    ];\n\n    return iosConfig;\n  });\n};\n\nconst withIosMicrophonePermission: ConfigPlugin<Options> = (\n  config,\n  { iosMicrophonePermission }\n) => {\n  return withInfoPlist(config, (iosConfig) => {\n    iosConfig.modResults.NSMicrophoneUsageDescription = iosMicrophonePermission;\n    return iosConfig;\n  });\n};\n\nconst withAndroidPermissions: ConfigPlugin<Options> = (\n  config,\n  { androidPermissions }: Options\n) => {\n  return AndroidConfig.Permissions.withPermissions(config, androidPermissions);\n};\n\nconst withForegroundService: ConfigPlugin<Options> = (\n  config,\n  { androidFSTypes }: Options\n) => {\n  return withAndroidManifest(config, (mod) => {\n    const manifest = mod.modResults;\n    const mainApplication =\n      AndroidConfig.Manifest.getMainApplicationOrThrow(manifest);\n\n    const SFTypes = androidFSTypes.join('|');\n\n    const serviceElement = {\n      $: {\n        'android:name':\n          'com.swmansion.audioapi.system.CentralizedForegroundService',\n        'android:stopWithTask': 'true',\n        'android:foregroundServiceType': SFTypes,\n      },\n      intentFilter: [],\n    };\n\n    if (!mainApplication.service) {\n      mainApplication.service = [];\n    }\n\n    const existingServiceIndex = mainApplication.service.findIndex((service) =>\n      service.$['android:name'].includes(serviceElement.$['android:name'])\n    );\n\n    if (existingServiceIndex !== -1) {\n      mainApplication.service[existingServiceIndex] = serviceElement;\n      return mod;\n    }\n\n    mainApplication.service.push(serviceElement);\n    return mod;\n  });\n};\n\nconst withFFmpegConfig: ConfigPlugin<Options> = (config, options) => {\n  const iosConf = withPodfile(config, (mod) => {\n    let contents = mod.modResults.contents;\n    const ffmpegRegex = /^.*ENV\\['DISABLE_AUDIOAPI_FFMPEG'\\].*$/gm;\n    const podfileString = options.disableFFmpeg\n      ? `ENV['DISABLE_AUDIOAPI_FFMPEG'] = '1'`\n      : '';\n    // No existing setting\n    if (contents.search(ffmpegRegex) === -1) {\n      if (options.disableFFmpeg) {\n        if (contents.endsWith('\\n')) {\n          contents = `${contents}${podfileString}`;\n        } else {\n          contents = `${contents}\\n${podfileString}`;\n        }\n        mod.modResults.contents = contents;\n      }\n    } else {\n      // Existing setting found, will replace\n      contents = contents.replace(ffmpegRegex, podfileString);\n    }\n\n    mod.modResults.contents = contents;\n    return mod;\n  });\n\n  const finalConf = withGradleProperties(iosConf, (mod) => {\n    const gradleProperties = mod.modResults;\n\n    const existingIndex = gradleProperties.findIndex(\n      (prop) => prop.type === 'property' && prop.key === 'disableAudioapiFFmpeg'\n    );\n    if (existingIndex !== -1) {\n      gradleProperties.splice(existingIndex, 1);\n    } else if (!options.disableFFmpeg) {\n      // No existing setting and FFmpeg is enabled, do nothing.\n      return mod;\n    }\n\n    if (options.disableFFmpeg) {\n      gradleProperties.push({\n        type: 'property',\n        key: 'disableAudioapiFFmpeg',\n        value: options.disableFFmpeg ? 'true' : 'false',\n      });\n    }\n\n    return mod;\n  });\n\n  return finalConf;\n};\n\nconst withAudioAPI: ConfigPlugin<Options> = (config, optionsIn) => {\n  const options = withDefaultOptions(optionsIn ?? {});\n\n  if (options.iosBackgroundMode) {\n    config = withBackgroundAudio(config);\n  }\n\n  config = withAndroidPermissions(config, options);\n\n  if (options.androidForegroundService) {\n    config = withForegroundService(config, options);\n  }\n\n  if (options.iosMicrophonePermission) {\n    config = withIosMicrophonePermission(config, options);\n  }\n\n  if (options.disableFFmpeg !== undefined) {\n    config = withFFmpegConfig(config, options);\n  }\n\n  return config;\n};\n\nexport default createRunOncePlugin(withAudioAPI, pkg.name, pkg.version);\n"
  },
  {
    "path": "packages/react-native-audio-api/src/specs/NativeAudioAPIModule.ts",
    "content": "'use strict';\nimport type { TurboModule } from 'react-native';\nimport { TurboModuleRegistry } from 'react-native';\nimport { AudioDevicesInfo, PermissionStatus } from '../system/types';\n\ntype OptionsMap = { [key: string]: string | boolean | number | undefined };\ntype NotificationOpResponse = { success: boolean; error?: string };\ntype NotificationType = 'playback' | 'recording' | 'simple';\ntype AudioFocusType =\n  | 'gain'\n  | 'gainTransient'\n  | 'gainTransientExclusive'\n  | 'gainTransientMayDuck';\n\ninterface Spec extends TurboModule {\n  install(): boolean;\n  getDevicePreferredSampleRate(): number;\n\n  // AVAudioSession management\n  setAudioSessionActivity(enabled: boolean): Promise<boolean>;\n  setAudioSessionOptions(\n    category: string,\n    mode: string,\n    options: Array<string>,\n    allowHaptics: boolean,\n    notifyOthersOnDeactivation: boolean\n  ): void;\n  disableSessionManagement(): void;\n\n  // system events and interruptions\n  observeAudioInterruptions(focusType: AudioFocusType, enabled: boolean): void;\n  activelyReclaimSession(enabled: boolean): void;\n  observeVolumeChanges(enabled: boolean): void;\n\n  // Permissions\n  requestRecordingPermissions(): Promise<PermissionStatus>;\n  checkRecordingPermissions(): Promise<PermissionStatus>;\n  requestNotificationPermissions(): Promise<PermissionStatus>;\n  checkNotificationPermissions(): Promise<PermissionStatus>;\n\n  // Audio devices\n  getDevicesInfo(): Promise<AudioDevicesInfo>;\n  setInputDevice(deviceId: string): Promise<boolean>;\n\n  // Notification system\n  showNotification(\n    type: NotificationType,\n    key: string,\n    options: OptionsMap\n  ): Promise<NotificationOpResponse>;\n  hideNotification(key: string): Promise<NotificationOpResponse>;\n  isNotificationActive(key: string): Promise<boolean>;\n  // Android-only: reads bundled asset bytes and returns a Base64 string.\n  readAndroidReleaseAssetBytesAsBase64(assetPath: string): Promise<string>;\n}\n\nconst NativeAudioAPIModule = TurboModuleRegistry.get<Spec>('AudioAPIModule')!;\n\nexport { NativeAudioAPIModule };\n"
  },
  {
    "path": "packages/react-native-audio-api/src/specs/NativeAudioAPIModule.web.ts",
    "content": "import { TurboModule } from 'react-native';\nimport {\n  AudioDevicesInfo,\n  AudioFocusType,\n  PermissionStatus,\n} from '../system/types';\n\n// copy of spec from NativeAudioAPIModule.ts\ntype OptionsMap = {\n  [key: string]: string | boolean | number | undefined;\n};\ntype NotificationOpResponse = { success: boolean; error?: string };\ntype NotificationType = 'playback' | 'recording' | 'simple';\n\ninterface Spec extends TurboModule {\n  install(): boolean;\n  getDevicePreferredSampleRate(): number;\n\n  // AVAudioSession management\n  setAudioSessionActivity(enabled: boolean): Promise<boolean>;\n  setAudioSessionOptions(\n    category: string,\n    mode: string,\n    options: Array<string>,\n    allowHaptics: boolean,\n    notifyOthersOnDeactivation: boolean\n  ): void;\n  disableSessionManagement(): void;\n\n  // Remote commands, system events and interruptions\n  observeAudioInterruptions(focusType: AudioFocusType, enabled: boolean): void;\n  activelyReclaimSession(enabled: boolean): void;\n  observeVolumeChanges(enabled: boolean): void;\n\n  // Permissions\n  requestRecordingPermissions(): Promise<PermissionStatus>;\n  checkRecordingPermissions(): Promise<PermissionStatus>;\n  requestNotificationPermissions(): Promise<PermissionStatus>;\n  checkNotificationPermissions(): Promise<PermissionStatus>;\n\n  // Audio devices\n  getDevicesInfo(): Promise<AudioDevicesInfo>;\n  setInputDevice(deviceId: string): Promise<boolean>;\n\n  // New notification system\n  showNotification(\n    type: NotificationType,\n    key: string,\n    options: OptionsMap\n  ): Promise<NotificationOpResponse>;\n  hideNotification(key: string): Promise<NotificationOpResponse>;\n  isNotificationActive(key: string): Promise<boolean>;\n  readAndroidReleaseAssetBytesAsBase64(assetPath: string): Promise<string>;\n}\n\nconst mockAsync =\n  <T>(value: T) =>\n  () =>\n    Promise.resolve(value);\nconst mockSync =\n  <T>(value: T) =>\n  () =>\n    value;\n\nconst NativeAudioAPIModule: Spec = {\n  install: mockSync(true),\n  getDevicePreferredSampleRate: mockSync(0),\n  setAudioSessionActivity: mockAsync(true),\n  setAudioSessionOptions: mockSync({}),\n  disableSessionManagement: mockSync({}),\n  observeAudioInterruptions: mockSync({}),\n  activelyReclaimSession: mockSync({}),\n  observeVolumeChanges: mockSync({}),\n  requestRecordingPermissions: mockAsync('Granted' as PermissionStatus),\n  checkRecordingPermissions: mockAsync('Granted' as PermissionStatus),\n  requestNotificationPermissions: mockAsync('Granted' as PermissionStatus),\n  checkNotificationPermissions: mockAsync('Granted' as PermissionStatus),\n  getDevicesInfo: mockAsync({\n    availableInputs: [],\n    availableOutputs: [],\n    currentInputs: [],\n    currentOutputs: [],\n  }),\n  setInputDevice: mockAsync(true),\n  showNotification: mockAsync({ success: true }),\n  hideNotification: mockAsync({ success: true }),\n  isNotificationActive: mockAsync(false),\n  readAndroidReleaseAssetBytesAsBase64: () =>\n    Promise.reject(\n      new Error('readAndroidReleaseAssetBytesAsBase64 is not supported on web')\n    ),\n};\n\nexport { NativeAudioAPIModule };\n"
  },
  {
    "path": "packages/react-native-audio-api/src/specs/index.ts",
    "content": "'use strict';\nimport { NativeAudioAPIModule } from './NativeAudioAPIModule';\n\nexport { NativeAudioAPIModule };\n"
  },
  {
    "path": "packages/react-native-audio-api/src/system/AudioManager.ts",
    "content": "import { AudioEventEmitter, AudioEventSubscription } from '../events';\nimport { SystemEventCallback, SystemEventName } from '../events/types';\nimport { NativeAudioAPIModule } from '../specs';\nimport { parseNativeError } from './errors';\nimport {\n  AudioDevicesInfo,\n  AudioFocusType,\n  IAudioManager,\n  PermissionStatus,\n  SessionOptions,\n} from './types';\n\nclass AudioManager implements IAudioManager {\n  private readonly audioEventEmitter: AudioEventEmitter;\n  constructor() {\n    this.audioEventEmitter = new AudioEventEmitter(global.AudioEventEmitter);\n  }\n\n  getDevicePreferredSampleRate(): number {\n    return NativeAudioAPIModule.getDevicePreferredSampleRate();\n  }\n\n  async setAudioSessionActivity(enabled: boolean): Promise<boolean> {\n    try {\n      const success =\n        await NativeAudioAPIModule.setAudioSessionActivity(enabled);\n\n      return success;\n    } catch (error) {\n      throw parseNativeError(error);\n    }\n  }\n\n  setAudioSessionOptions(options: SessionOptions) {\n    NativeAudioAPIModule.setAudioSessionOptions(\n      options.iosCategory ?? '',\n      options.iosMode ?? '',\n      options.iosOptions ?? [],\n      options.iosAllowHaptics ?? false,\n      options.iosNotifyOthersOnDeactivation ?? true\n    );\n  }\n\n  disableSessionManagement() {\n    NativeAudioAPIModule.disableSessionManagement();\n  }\n\n  observeAudioInterruptions(param: AudioFocusType | boolean | null) {\n    if (typeof param === 'string') {\n      NativeAudioAPIModule.observeAudioInterruptions(param, true);\n    } else {\n      // audiofocusgain as default value if not provided\n      NativeAudioAPIModule.observeAudioInterruptions('gain', param === true);\n    }\n  }\n\n  /**\n   * @param enabled - Whether to actively reclaim the session or not\n   * @experimental more aggressively try to reactivate the audio session during interruptions.\n   * It is subject to change in the future and might be removed.\n   *\n   * In some cases (depends on app session settings and other apps using audio) system may never\n   * send the `interruption ended` event. This method will check if any other audio is playing\n   * and try to reactivate the audio session, as soon as there is \"silence\".\n   * Although this might change the expected behavior.\n   *\n   * Internally method uses `AVAudioSessionSilenceSecondaryAudioHintNotification` as well as\n   * interval polling to check if other audio is playing.\n   */\n  activelyReclaimSession(enabled: boolean) {\n    NativeAudioAPIModule.activelyReclaimSession(enabled);\n  }\n\n  observeVolumeChanges(enabled: boolean) {\n    NativeAudioAPIModule.observeVolumeChanges(enabled);\n  }\n\n  addSystemEventListener<Name extends SystemEventName>(\n    name: Name,\n    callback: SystemEventCallback<Name>\n  ): AudioEventSubscription {\n    return this.audioEventEmitter.addAudioEventListener(name, callback);\n  }\n\n  async requestRecordingPermissions(): Promise<PermissionStatus> {\n    return NativeAudioAPIModule.requestRecordingPermissions();\n  }\n\n  async checkRecordingPermissions(): Promise<PermissionStatus> {\n    return NativeAudioAPIModule.checkRecordingPermissions();\n  }\n\n  async requestNotificationPermissions(): Promise<PermissionStatus> {\n    return NativeAudioAPIModule.requestNotificationPermissions();\n  }\n\n  async checkNotificationPermissions(): Promise<PermissionStatus> {\n    return NativeAudioAPIModule.checkNotificationPermissions();\n  }\n\n  async getDevicesInfo(): Promise<AudioDevicesInfo> {\n    return NativeAudioAPIModule.getDevicesInfo();\n  }\n\n  async setInputDevice(deviceId: string): Promise<boolean> {\n    return NativeAudioAPIModule.setInputDevice(deviceId);\n  }\n}\n\nexport default new AudioManager();\n"
  },
  {
    "path": "packages/react-native-audio-api/src/system/errors.ts",
    "content": "import { AudioApiError } from '../errors';\n\nexport interface NativeActivationErrorMetadata {\n  nativeDesc: string;\n  nativeCode: number;\n  nativeDomain: string;\n}\n\ninterface ErrorWithUserInfo {\n  userInfo?: {\n    meta?: Record<string, unknown>;\n  };\n}\n\ninterface ErrorWithNativeError {\n  nativeError?: {\n    userInfo: {\n      meta?: Record<string, unknown>;\n    };\n  };\n}\n\ninterface ErrorWithDetails {\n  details?: {\n    meta?: Record<string, unknown>;\n  };\n}\n\nfunction parseNativeCode(code: number): string {\n  switch (code) {\n    case 0:\n      return 'NoError';\n    case -50:\n      return 'BadParam';\n    case 1836282486:\n      return 'MediaServicesFailed';\n    case 560030580:\n      return 'IsBusy';\n    case 560161140:\n      return 'IncompatibleCategory';\n    case 560557684:\n      return 'CannotInterruptOthers';\n    case 1701737535:\n      return 'MissingEntitlement';\n    case 1936290409:\n      return 'SiriIsRecording';\n    case 561015905:\n      return 'CannotStartPlaying';\n    case 561145187:\n      return 'CannotStartRecording';\n    case 561017449:\n      return 'InsufficientPriority';\n    case 561145203:\n      return 'ResourceNotAvailable';\n    case 2003329396:\n      return 'Unspecified';\n    case 561210739:\n      return 'ExpiredSession';\n    case 1768841571:\n      return 'SessionNotActive';\n    default:\n      return 'NoError';\n  }\n}\n\nexport class SessionActivationError extends AudioApiError {\n  nativeErrorInfo?: NativeActivationErrorMetadata;\n\n  constructor(nativeErrorInfo?: NativeActivationErrorMetadata) {\n    if (!nativeErrorInfo) {\n      super('Failed to activate audio session with unknown error');\n      this.name = 'SessionActivationError';\n      return;\n    }\n\n    const codeName = parseNativeCode(nativeErrorInfo.nativeCode);\n\n    super(\n      `[${codeName}] Failed to activate audio session, code: ${nativeErrorInfo.nativeCode}`\n    );\n\n    this.name = 'SessionActivationError';\n    this.nativeErrorInfo = nativeErrorInfo;\n  }\n}\n\nexport function parseNativeError(error: unknown): SessionActivationError {\n  const errorMeta =\n    (error as ErrorWithUserInfo)?.userInfo?.meta ??\n    (error as ErrorWithNativeError)?.nativeError?.userInfo?.meta ??\n    (error as ErrorWithDetails)?.details?.meta;\n\n  console.log('Parsed error meta:', errorMeta);\n\n  if (!errorMeta || typeof errorMeta !== 'object') {\n    return new SessionActivationError();\n  }\n\n  const { nativeCode, nativeDesc, nativeDomain } =\n    errorMeta as unknown as NativeActivationErrorMetadata;\n\n  if (isNaN(nativeCode) || !nativeDesc || !nativeDomain) {\n    return new SessionActivationError();\n  }\n\n  return new SessionActivationError({\n    nativeCode,\n    nativeDesc,\n    nativeDomain,\n  });\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/system/index.ts",
    "content": "export { default } from './AudioManager';\nexport * from './notification';\n"
  },
  {
    "path": "packages/react-native-audio-api/src/system/notification/PlaybackNotificationManager.ts",
    "content": "import { AudioEventEmitter, AudioEventSubscription } from '../../events';\nimport { NativeAudioAPIModule } from '../../specs';\nimport type {\n  NotificationCallback,\n  NotificationManager,\n  PlaybackControlName,\n  PlaybackNotificationEventName,\n  PlaybackNotificationInfo,\n} from './types';\nimport { AudioApiError } from '../../errors';\n\nclass PlaybackNotificationManager implements NotificationManager<\n  PlaybackNotificationInfo,\n  PlaybackNotificationEventName\n> {\n  private notificationKey = 'playback';\n  private audioEventEmitter: AudioEventEmitter;\n\n  constructor() {\n    this.audioEventEmitter = new AudioEventEmitter(global.AudioEventEmitter);\n  }\n\n  /**\n   * Show the notification with metadata or update if already visible.\n   * Automatically creates the notification on first call.\n   *\n   * @param info - The info to be displayed.\n   * @returns Promise that resolves after creating notification.\n   */\n  async show(info: PlaybackNotificationInfo): Promise<void> {\n    if (!NativeAudioAPIModule) {\n      throw new AudioApiError('NativeAudioAPIModule is not available');\n    }\n\n    const result = await NativeAudioAPIModule.showNotification(\n      'playback',\n      this.notificationKey,\n      info as Record<string, string | number | boolean | undefined>\n    );\n\n    if (result.error) {\n      throw new AudioApiError(result.error);\n    }\n  }\n\n  /**\n   * Hide the notification.\n   *\n   * @returns Promise that resolves after hiding notification.\n   */\n  async hide(): Promise<void> {\n    if (!NativeAudioAPIModule) {\n      throw new AudioApiError('NativeAudioAPIModule is not available');\n    }\n\n    const result = await NativeAudioAPIModule.hideNotification(\n      this.notificationKey\n    );\n\n    if (result.error) {\n      throw new AudioApiError(result.error);\n    }\n  }\n\n  /**\n   * Enable or disable a specific playback control.\n   *\n   * @param control - The control to enable or disable on the notification.\n   * @param enabled - Whether to enable (true) or disable (false) the control.\n   * @returns Promise that resolves after showing modified notification.\n   */\n  async enableControl(\n    control: PlaybackControlName,\n    enabled: boolean\n  ): Promise<void> {\n    if (!NativeAudioAPIModule) {\n      throw new AudioApiError('NativeAudioAPIModule is not available');\n    }\n\n    const params = { control, enabled };\n    const result = await NativeAudioAPIModule.showNotification(\n      'playback',\n      this.notificationKey,\n      params as Record<string, string | number | boolean | undefined>\n    );\n\n    if (result.error) {\n      throw new AudioApiError(result.error);\n    }\n  }\n\n  /**\n   * Check if the notification is currently active.\n   *\n   * @returns Promise that resolves to whether notification is active.\n   */\n  async isActive(): Promise<boolean> {\n    if (!NativeAudioAPIModule) {\n      return false;\n    }\n\n    return await NativeAudioAPIModule.isNotificationActive(\n      this.notificationKey\n    );\n  }\n\n  /**\n   * Add an event listener for notification actions.\n   *\n   * @param eventName - The event name to listen for.\n   * @param callback - The callback to invoke on event.\n   * @returns Class that represents the subscription.\n   */\n  addEventListener<T extends PlaybackNotificationEventName>(\n    eventName: T,\n    callback: NotificationCallback<T>\n  ): AudioEventSubscription {\n    return this.audioEventEmitter.addAudioEventListener(eventName, callback);\n  }\n}\n\nexport default new PlaybackNotificationManager();\n"
  },
  {
    "path": "packages/react-native-audio-api/src/system/notification/RecordingNotificationManager.ios.ts",
    "content": "import { AudioEventEmitter, AudioEventSubscription } from '../../events';\nimport type {\n  NotificationManager,\n  RecordingNotificationEvent,\n  RecordingNotificationEventName,\n  RecordingNotificationInfo,\n} from './types';\n\nclass RecordingNotificationManager implements NotificationManager<\n  RecordingNotificationInfo,\n  RecordingNotificationEventName\n> {\n  private audioEventEmitter: AudioEventEmitter;\n\n  constructor() {\n    this.audioEventEmitter = new AudioEventEmitter(global.AudioEventEmitter);\n    console.warn(\n      'RecordingNotificationManager is not implemented on iOS. Any calls to it will be no-ops.'\n    );\n  }\n\n  /**\n   * Show the notification with metadata or update if already visible.\n   *\n   * @param info - The info to be displayed.\n   * @returns Promise that resolves after creating notification.\n   */\n  async show(_info: RecordingNotificationInfo): Promise<void> {}\n\n  /**\n   * Hide the notification.\n   *\n   * @returns Promise that resolves after hiding notification.\n   */\n  async hide(): Promise<void> {}\n\n  /**\n   * Check if the notification is currently active.\n   *\n   * @returns Promise that resolves to whether notification is active.\n   */\n  // eslint-disable-next-line @typescript-eslint/require-await\n  async isActive(): Promise<boolean> {\n    return false;\n  }\n\n  /**\n   * Add an event listener for notification actions.\n   *\n   * @param eventName - The event name to listen for.\n   * @param callback - The callback to invoke on event.\n   * @returns Promise that resolves to whether notification is active.\n   */\n  addEventListener<T extends RecordingNotificationEventName>(\n    eventName: T,\n    callback: (event: RecordingNotificationEvent[T]) => void\n  ): AudioEventSubscription {\n    return this.audioEventEmitter.addAudioEventListener(eventName, callback);\n  }\n}\n\nexport default new RecordingNotificationManager();\n"
  },
  {
    "path": "packages/react-native-audio-api/src/system/notification/RecordingNotificationManager.ts",
    "content": "import { AudioEventEmitter, AudioEventSubscription } from '../../events';\nimport { NativeAudioAPIModule } from '../../specs';\nimport type {\n  NotificationCallback,\n  NotificationManager,\n  RecordingNotificationEventName,\n  RecordingNotificationInfo,\n} from './types';\nimport { AudioApiError } from '../../errors';\n\nclass RecordingNotificationManager implements NotificationManager<\n  RecordingNotificationInfo,\n  RecordingNotificationEventName\n> {\n  private notificationKey = 'react-native-audio-api-recording';\n  private audioEventEmitter: AudioEventEmitter;\n\n  constructor() {\n    this.audioEventEmitter = new AudioEventEmitter(global.AudioEventEmitter);\n  }\n\n  /**\n   * Show the notification with metadata or update if already visible.\n   *\n   * @param info - The info to be displayed.\n   * @returns Promise that resolves after creating notification.\n   */\n  async show(info: RecordingNotificationInfo): Promise<void> {\n    if (!NativeAudioAPIModule) {\n      throw new AudioApiError('NativeAudioAPIModule is not available');\n    }\n\n    const result = await NativeAudioAPIModule.showNotification(\n      'recording',\n      this.notificationKey,\n      info as Record<string, string | number | boolean | undefined>\n    );\n\n    if (result.error) {\n      throw new AudioApiError(result.error);\n    }\n  }\n\n  /**\n   * Hide the notification.\n   *\n   * @returns Promise that resolves after hiding notification.\n   */\n  async hide(): Promise<void> {\n    if (!NativeAudioAPIModule) {\n      throw new AudioApiError('NativeAudioAPIModule is not available');\n    }\n\n    const result = await NativeAudioAPIModule.hideNotification(\n      this.notificationKey\n    );\n\n    if (result.error) {\n      throw new AudioApiError(result.error);\n    }\n  }\n\n  /**\n   * Check if the notification is currently active.\n   *\n   * @returns Promise that resolves to whether notification is active.\n   */\n  async isActive(): Promise<boolean> {\n    if (!NativeAudioAPIModule) {\n      return false;\n    }\n\n    return await NativeAudioAPIModule.isNotificationActive(\n      this.notificationKey\n    );\n  }\n\n  /**\n   * Add an event listener for notification actions.\n   *\n   * @param eventName - The event name to listen for.\n   * @param callback - The callback to invoke on event.\n   * @returns Class that represents the subscription.\n   */\n  addEventListener<T extends RecordingNotificationEventName>(\n    eventName: T,\n    callback: NotificationCallback<T>\n  ): AudioEventSubscription {\n    return this.audioEventEmitter.addAudioEventListener(eventName, callback);\n  }\n}\n\nexport default new RecordingNotificationManager();\n"
  },
  {
    "path": "packages/react-native-audio-api/src/system/notification/index.ts",
    "content": "export { default as PlaybackNotificationManager } from './PlaybackNotificationManager';\nexport { default as RecordingNotificationManager } from './RecordingNotificationManager';\nexport * from './types';\n"
  },
  {
    "path": "packages/react-native-audio-api/src/system/notification/types.ts",
    "content": "import type { AudioEventSubscription } from '../../events';\nimport { EventEmptyType, EventTypeWithValue } from '../../events/types';\n\n/// Generic notification manager interface that all notification managers should implement.\n/// Provides a consistent API for managing notification lifecycle and events.\nexport interface NotificationManager<\n  TShowOptions,\n  TEventName extends NotificationEventName,\n> {\n  /// Show the notification with options or update if already visible.\n  /// Automatically creates the notification instance on first call.\n  show(options: TShowOptions): Promise<void>;\n\n  /// Hide the notification.\n  hide(): Promise<void>;\n\n  /// Check if the notification is currently active.\n  isActive(): Promise<boolean>;\n\n  /// Add an event listener for notification events.\n  addEventListener<T extends TEventName>(\n    eventName: T,\n    callback: NotificationCallback<T>\n  ): AudioEventSubscription | undefined;\n}\n\n/// Metadata and state information for playback notifications.\nexport interface PlaybackNotificationInfo {\n  title?: string;\n  artist?: string;\n  album?: string;\n  artwork?: string | { uri: string };\n  androidSmallIcon?: string | { uri: string };\n  duration?: number;\n  elapsedTime?: number;\n  speed?: number;\n  state?: 'playing' | 'paused';\n}\n\n/// Available playback control actions.\nexport type PlaybackControlName =\n  | 'play'\n  | 'pause'\n  | 'stop'\n  | 'nextTrack'\n  | 'previousTrack'\n  | 'skipForward'\n  | 'skipBackward'\n  | 'seekTo';\n\n/// Event names for playback notification actions.\ninterface PlaybackNotificationEvent {\n  playbackNotificationPlay: EventEmptyType;\n  playbackNotificationPause: EventEmptyType;\n  playbackNotificationStop: EventEmptyType;\n  playbackNotificationNextTrack: EventEmptyType;\n  playbackNotificationPreviousTrack: EventEmptyType;\n  playbackNotificationSkipForward: EventTypeWithValue;\n  playbackNotificationSkipBackward: EventTypeWithValue;\n  playbackNotificationSeekTo: EventTypeWithValue;\n  playbackNotificationDismissed: EventEmptyType;\n}\n\nexport interface RecordingNotificationInfo {\n  title?: string;\n  contentText?: string;\n  paused?: boolean;\n  smallIconResourceName?: string;\n  largeIconResourceName?: string;\n  pauseIconResourceName?: string;\n  resumeIconResourceName?: string;\n  color?: number;\n}\n\nexport interface RecordingNotificationEvent {\n  recordingNotificationPause: EventEmptyType;\n  recordingNotificationResume: EventEmptyType;\n}\n\nexport type PlaybackNotificationEventName = keyof PlaybackNotificationEvent;\n\nexport type RecordingNotificationEventName = keyof RecordingNotificationEvent;\n\nexport type NotificationEvents = PlaybackNotificationEvent &\n  RecordingNotificationEvent;\n\nexport type NotificationEventName = keyof NotificationEvents;\n\nexport type NotificationCallback<Name extends NotificationEventName> = (\n  event: NotificationEvents[Name]\n) => void;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/system/types.ts",
    "content": "import type { AudioEventSubscription } from '../events';\nimport type { SystemEventCallback, SystemEventName } from '../events/types';\n\nexport type IOSCategory =\n  | 'ambient'\n  | 'multiRoute'\n  | 'playAndRecord'\n  | 'playback'\n  | 'record'\n  | 'soloAmbient';\n\nexport type IOSMode =\n  | 'default'\n  | 'dualRoute'\n  | 'gameChat'\n  | 'measurement'\n  | 'moviePlayback'\n  | 'shortFormVideo'\n  | 'spokenAudio'\n  | 'videoChat'\n  | 'videoRecording'\n  | 'voiceChat'\n  | 'voicePrompt';\n\nexport type IOSOption =\n  | 'allowAirPlay'\n  | 'allowBluetoothA2DP'\n  | 'allowBluetoothHFP'\n  | 'bluetoothHighQualityRecording'\n  | 'defaultToSpeaker'\n  | 'duckOthers'\n  | 'farFieldInput'\n  | 'interruptSpokenAudioAndMixWithOthers'\n  | 'mixWithOthers'\n  | 'overrideMutedMicrophoneInterruption';\n\nexport type AudioFocusType =\n  | 'gain'\n  | 'gainTransient'\n  | 'gainTransientExclusive'\n  | 'gainTransientMayDuck';\n\nexport interface SessionOptions {\n  iosMode?: IOSMode;\n  iosOptions?: IOSOption[];\n  iosCategory?: IOSCategory;\n  iosAllowHaptics?: boolean;\n  /**\n   * Setting this to `true` will allow other audio apps to resume playing when\n   * the session is deactivated.\n   *\n   * Has no effect when using PlaybackNotificationManager as it takes over the\n   * \"Now playing\" controls.\n   */\n  iosNotifyOthersOnDeactivation?: boolean;\n}\n\nexport type PermissionStatus = 'Undetermined' | 'Denied' | 'Granted';\n\nexport interface AudioDeviceInfo {\n  id: string;\n  name: string;\n  category: string;\n}\n\nexport type AudioDeviceList = AudioDeviceInfo[];\n\nexport interface AudioDevicesInfo {\n  availableInputs: AudioDeviceList;\n  availableOutputs: AudioDeviceList;\n  currentInputs: AudioDeviceList; // iOS only\n  currentOutputs: AudioDeviceList; // iOS only\n}\n\nexport interface IAudioManager {\n  getDevicePreferredSampleRate(): number;\n  setAudioSessionActivity(enabled: boolean): Promise<boolean>;\n  setAudioSessionOptions(options: SessionOptions): void;\n  disableSessionManagement(): void;\n  observeAudioInterruptions(enabled: boolean): void;\n  activelyReclaimSession(enabled: boolean): void;\n  observeAudioInterruptions(param: AudioFocusType | boolean | null): void;\n  addSystemEventListener<Name extends SystemEventName>(\n    name: Name,\n    callback: SystemEventCallback<Name>\n  ): AudioEventSubscription | undefined;\n  requestRecordingPermissions(): Promise<PermissionStatus>;\n  checkRecordingPermissions(): Promise<PermissionStatus>;\n  requestNotificationPermissions(): Promise<PermissionStatus>;\n  checkNotificationPermissions(): Promise<PermissionStatus>;\n  getDevicesInfo(): Promise<AudioDevicesInfo>;\n  setInputDevice(deviceId: string): Promise<boolean>;\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/types.ts",
    "content": "import AudioBuffer from './core/AudioBuffer';\nimport PeriodicWave from './core/PeriodicWave';\nimport { IAudioBuffer } from './interfaces';\n\nexport type Result<T> =\n  | ({ status: 'success' } & T)\n  | { status: 'error'; message: string };\n\nexport type ChannelCountMode = 'max' | 'clamped-max' | 'explicit';\n\nexport type ChannelInterpretation = 'speakers' | 'discrete';\n\nexport type BiquadFilterType =\n  | 'lowpass'\n  | 'highpass'\n  | 'bandpass'\n  | 'lowshelf'\n  | 'highshelf'\n  | 'peaking'\n  | 'notch'\n  | 'allpass';\n\nexport type ContextState = 'running' | 'closed' | 'suspended';\n\nexport type AudioWorkletRuntime = 'AudioRuntime' | 'UIRuntime';\n\nexport type OscillatorType =\n  | 'sine'\n  | 'square'\n  | 'sawtooth'\n  | 'triangle'\n  | 'custom';\n\nexport interface AudioContextOptions {\n  sampleRate?: number;\n}\n\nexport interface OfflineAudioContextOptions {\n  numberOfChannels: number;\n  length: number;\n  sampleRate: number;\n}\n\nexport enum FileDirectory {\n  Document = 0,\n  Cache = 1,\n}\n\nexport enum FileFormat {\n  Wav = 0,\n  Caf = 1,\n  M4A = 2,\n  Flac = 3,\n}\n\nexport enum IOSAudioQuality {\n  Min = 0,\n  Low = 1,\n  Medium = 2,\n  High = 3,\n  Max = 4,\n}\n\nexport enum BitDepth {\n  Bit16 = 0,\n  Bit24 = 1,\n  Bit32 = 2,\n}\n\nexport enum FlacCompressionLevel {\n  L0 = 0,\n  L1 = 1,\n  L2 = 2,\n  L3 = 3,\n  L4 = 4,\n  L5 = 5,\n  L6 = 6,\n  L7 = 7,\n  L8 = 8,\n}\n\nexport interface FilePresetType {\n  bitRate: number;\n  sampleRate: number;\n  bitDepth: BitDepth;\n  iosQuality: IOSAudioQuality;\n  flacCompressionLevel: FlacCompressionLevel;\n}\n\nexport interface AudioRecorderFileOptions {\n  channelCount?: number;\n  rotateIntervalBytes?: number;\n\n  format?: FileFormat;\n  preset?: FilePresetType;\n\n  directory?: FileDirectory;\n  subDirectory?: string;\n  fileNamePrefix?: string;\n  androidFlushIntervalMs?: number;\n}\n\nexport interface FileInfo {\n  paths: string[];\n  /** The size of the recorded file (in MB). */\n  size: number;\n  /** The duration of the recording (in seconds). */\n  duration: number;\n}\n\nexport type ProcessorMode = 'processInPlace' | 'processThrough';\n\nexport interface AudioNodeOptions {\n  channelCount?: number;\n  channelCountMode?: ChannelCountMode;\n  channelInterpretation?: ChannelInterpretation;\n}\n\nexport interface GainOptions extends AudioNodeOptions {\n  gain?: number;\n}\n\nexport interface StereoPannerOptions extends AudioNodeOptions {\n  pan?: number;\n}\n\nexport interface AnalyserOptions extends AudioNodeOptions {\n  fftSize?: number;\n  minDecibels?: number;\n  maxDecibels?: number;\n  smoothingTimeConstant?: number;\n}\n\nexport interface OptionsValidator<T> {\n  validate(options?: T): void;\n}\n\nexport interface BiquadFilterOptions extends AudioNodeOptions {\n  type?: BiquadFilterType;\n  frequency?: number;\n  detune?: number;\n  Q?: number;\n  gain?: number;\n}\n\nexport interface OscillatorOptions {\n  type?: OscillatorType;\n  frequency?: number;\n  detune?: number;\n  periodicWave?: PeriodicWave;\n}\n\nexport interface BaseAudioBufferSourceOptions {\n  detune?: number;\n  playbackRate?: number;\n  pitchCorrection?: boolean;\n}\n\nexport interface AudioBufferSourceOptions extends BaseAudioBufferSourceOptions {\n  buffer?: AudioBuffer;\n  loop?: boolean;\n  loopStart?: number;\n  loopEnd?: number;\n}\n\n// options that are passed to c++ layer\nexport interface IAudioBufferSourceOptions extends BaseAudioBufferSourceOptions {\n  buffer?: IAudioBuffer;\n  loop?: boolean;\n  loopStart?: number;\n  loopEnd?: number;\n}\n\nexport interface ConvolverOptions extends AudioNodeOptions {\n  buffer?: AudioBuffer;\n  disableNormalization?: boolean;\n}\n\n// options that are passed to c++ layer\nexport interface IConvolverOptions extends AudioNodeOptions {\n  buffer?: IAudioBuffer;\n  disableNormalization?: boolean;\n}\n\nexport interface AudioFileSourceOptions extends AudioNodeOptions {\n  source: ArrayBuffer | string;\n  loop?: boolean;\n  volume?: number;\n}\n\nexport interface ConstantSourceOptions {\n  offset?: number;\n}\n\nexport interface StreamerOptions {\n  streamPath: string;\n}\n\nexport interface PeriodicWaveConstraints {\n  disableNormalization?: boolean;\n}\n\nexport interface PeriodicWaveOptions extends PeriodicWaveConstraints {\n  real?: Float32Array;\n  imag?: Float32Array;\n}\n\nexport interface AudioBufferOptions {\n  length: number;\n  numberOfChannels?: number;\n  sampleRate: number;\n}\n\nexport interface IIRFilterOptions extends AudioNodeOptions {\n  feedforward: number[];\n  feedback: number[];\n}\nexport type OverSampleType = 'none' | '2x' | '4x';\n\nexport interface AudioRecorderCallbackOptions {\n  /**\n   * The desired sample rate (in Hz) for audio buffers delivered to the\n   * recording callback. Common values include 44100 or 48000 Hz. The actual\n   * sample rate may differ depending on hardware and system capabilities.\n   */\n  sampleRate: number;\n\n  /**\n   * The preferred size of each audio buffer, expressed as the number of samples\n   * per channel. Smaller buffers reduce latency but increase CPU load, while\n   * larger buffers improve efficiency at the cost of higher latency.\n   */\n  bufferLength: number;\n\n  /**\n   * The desired number of audio channels per buffer. Typically 1 for mono or 2\n   * for stereo recordings.\n   */\n  channelCount: number;\n}\n\nexport interface DelayOptions extends AudioNodeOptions {\n  maxDelayTime?: number;\n  delayTime?: number;\n}\n\nexport interface WaveShaperOptions extends AudioNodeOptions {\n  curve?: Float32Array;\n  oversample?: OverSampleType;\n}\n\nexport type DecodeDataInput = number | string | ArrayBuffer;\n\nexport interface AudioRecorderStartOptions {\n  fileNameOverride?: string;\n}\n\nexport enum AutomationEventType {\n  LINEAR_RAMP,\n  EXPONENTIAL_RAMP,\n  SET_VALUE,\n  SET_TARGET,\n  SET_VALUE_CURVE,\n}\n\nexport type AutomationEventData =\n  | { type: AutomationEventType.SET_VALUE; automationTime: number }\n  | { type: AutomationEventType.LINEAR_RAMP; automationTime: number }\n  | {\n      type: AutomationEventType.EXPONENTIAL_RAMP;\n      automationTime: number;\n    }\n  | {\n      type: AutomationEventType.SET_TARGET;\n      automationTime: number;\n    }\n  | {\n      type: AutomationEventType.SET_VALUE_CURVE;\n      automationTime: number;\n      duration: number;\n    };\n"
  },
  {
    "path": "packages/react-native-audio-api/src/utils/filePresets.ts",
    "content": "import {\n  BitDepth,\n  FilePresetType,\n  FlacCompressionLevel,\n  IOSAudioQuality,\n} from '../types';\n\nconst LowQuality: FilePresetType = {\n  sampleRate: 22050,\n  bitRate: 48000,\n  bitDepth: BitDepth.Bit16,\n  flacCompressionLevel: FlacCompressionLevel.L0,\n  iosQuality: IOSAudioQuality.Low,\n};\n\nconst MediumQuality: FilePresetType = {\n  sampleRate: 44100,\n  bitRate: 128000,\n  bitDepth: BitDepth.Bit16,\n  flacCompressionLevel: FlacCompressionLevel.L3,\n  iosQuality: IOSAudioQuality.Medium,\n};\n\nconst HighQuality: FilePresetType = {\n  sampleRate: 48000,\n  bitRate: 192000,\n  bitDepth: BitDepth.Bit24,\n  flacCompressionLevel: FlacCompressionLevel.L5,\n  iosQuality: IOSAudioQuality.High,\n};\n\nconst LosslessQuality: FilePresetType = {\n  sampleRate: 48000,\n  bitRate: 320000,\n  bitDepth: BitDepth.Bit24,\n  flacCompressionLevel: FlacCompressionLevel.L8,\n  iosQuality: IOSAudioQuality.High,\n};\n\nconst FilePreset = {\n  Low: LowQuality,\n  Medium: MediumQuality,\n  High: HighQuality,\n  Lossless: LosslessQuality,\n} as const;\n\nexport default FilePreset;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/utils/index.ts",
    "content": "import AudioAPIModule from '../AudioAPIModule';\nimport { AudioApiError } from '../errors';\n\nexport function assertWorkletsEnabled() {\n  if (!AudioAPIModule.areWorkletsAvailable) {\n    throw new AudioApiError(\n      '[react-native-audio-api]: Worklets are not available. Please install react-native-worklets to use this feature.'\n    );\n  }\n\n  if (!AudioAPIModule.isWorkletsVersionSupported) {\n    throw new AudioApiError(\n      `[react-native-audio-api]: Worklets version ${AudioAPIModule.workletsVersion} is not supported.\n      Please install react-native-worklets of one of the following versions: [${AudioAPIModule.supportedWorkletsVersion.join(', ')}] to use this feature.`\n    );\n  }\n}\n\nexport function clamp(value: number, min: number, max: number): number {\n  return Math.min(Math.max(value, min), max);\n}\n\nexport function base64ToArrayBuffer(base64: string): ArrayBuffer {\n  const binaryString = globalThis.atob(base64);\n  const len = binaryString.length;\n  const bytes = new Uint8Array(len);\n  for (let i = 0; i < len; i++) {\n    bytes[i] = binaryString.charCodeAt(i);\n  }\n  return bytes.buffer;\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/utils/paths.ts",
    "content": "export function isRemoteSource(url: string): boolean {\n  return url.startsWith('http://') || url.startsWith('https://');\n}\n\nexport function isBase64Source(data: string): boolean {\n  return data.startsWith('data:audio/') && data.includes(';base64,');\n}\n\nexport function isDataBlobString(data: string): boolean {\n  return data.startsWith('blob:');\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/AnalyserNode.tsx",
    "content": "import AudioNode from './AudioNode';\nimport { AnalyserOptions } from '../types';\nimport BaseAudioContext from './BaseAudioContext';\n\nexport default class AnalyserNode extends AudioNode {\n  fftSize: number;\n  readonly frequencyBinCount: number;\n  minDecibels: number;\n  maxDecibels: number;\n  smoothingTimeConstant: number;\n\n  constructor(context: BaseAudioContext, analyserOptions?: AnalyserOptions) {\n    const node = new globalThis.AnalyserNode(context.context, analyserOptions);\n    super(context, node);\n\n    this.fftSize = node.fftSize;\n    this.frequencyBinCount = node.frequencyBinCount;\n    this.minDecibels = node.minDecibels;\n    this.maxDecibels = node.maxDecibels;\n    this.smoothingTimeConstant = node.smoothingTimeConstant;\n  }\n\n  public getByteFrequencyData(array: Uint8Array): void {\n    (this.node as globalThis.AnalyserNode).getByteFrequencyData(\n      array as Uint8Array<ArrayBuffer>\n    );\n  }\n\n  public getByteTimeDomainData(array: Uint8Array): void {\n    (this.node as globalThis.AnalyserNode).getByteTimeDomainData(\n      array as Uint8Array<ArrayBuffer>\n    );\n  }\n\n  public getFloatFrequencyData(array: Float32Array): void {\n    (this.node as globalThis.AnalyserNode).getFloatFrequencyData(\n      array as Float32Array<ArrayBuffer>\n    );\n  }\n\n  public getFloatTimeDomainData(array: Float32Array): void {\n    (this.node as globalThis.AnalyserNode).getFloatTimeDomainData(\n      array as Float32Array<ArrayBuffer>\n    );\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/AudioBuffer.tsx",
    "content": "import { IndexSizeError, NotSupportedError } from '../errors';\nimport { AudioBufferOptions } from '../types';\n\nexport default class AudioBuffer {\n  readonly length: number;\n  readonly duration: number;\n  readonly sampleRate: number;\n  readonly numberOfChannels: number;\n\n  /** @internal */\n  public readonly buffer: globalThis.AudioBuffer;\n\n  constructor(options: AudioBufferOptions);\n\n  /** @internal */\n  constructor(buffer: globalThis.AudioBuffer);\n\n  /** @internal */\n  constructor(arg: AudioBufferOptions | globalThis.AudioBuffer) {\n    this.buffer = this.isAudioBuffer(arg)\n      ? arg\n      : AudioBuffer.createBufferFromOptions(arg);\n    this.length = this.buffer.length;\n    this.duration = this.buffer.duration;\n    this.sampleRate = this.buffer.sampleRate;\n    this.numberOfChannels = this.buffer.numberOfChannels;\n  }\n\n  public getChannelData(channel: number): Float32Array {\n    if (channel < 0 || channel >= this.numberOfChannels) {\n      throw new IndexSizeError(\n        `The channel number provided (${channel}) is outside the range [0, ${this.numberOfChannels - 1}]`\n      );\n    }\n\n    return this.buffer.getChannelData(channel);\n  }\n\n  public copyFromChannel(\n    destination: Float32Array,\n    channelNumber: number,\n    startInChannel: number = 0\n  ): void {\n    if (channelNumber < 0 || channelNumber >= this.numberOfChannels) {\n      throw new IndexSizeError(\n        `The channel number provided (${channelNumber}) is outside the range [0, ${this.numberOfChannels - 1}]`\n      );\n    }\n\n    if (startInChannel < 0 || startInChannel >= this.length) {\n      throw new IndexSizeError(\n        `The startInChannel number provided (${startInChannel}) is outside the range [0, ${this.length - 1}]`\n      );\n    }\n\n    this.buffer.copyFromChannel(\n      destination as Float32Array<ArrayBuffer>,\n      channelNumber,\n      startInChannel\n    );\n  }\n\n  public copyToChannel(\n    source: Float32Array,\n    channelNumber: number,\n    startInChannel: number = 0\n  ): void {\n    if (channelNumber < 0 || channelNumber >= this.numberOfChannels) {\n      throw new IndexSizeError(\n        `The channel number provided (${channelNumber}) is outside the range [0, ${this.numberOfChannels - 1}]`\n      );\n    }\n\n    if (startInChannel < 0 || startInChannel >= this.length) {\n      throw new IndexSizeError(\n        `The startInChannel number provided (${startInChannel}) is outside the range [0, ${this.length - 1}]`\n      );\n    }\n\n    this.buffer.copyToChannel(\n      source as Float32Array<ArrayBuffer>,\n      channelNumber,\n      startInChannel\n    );\n  }\n\n  private static createBufferFromOptions(\n    options: AudioBufferOptions\n  ): globalThis.AudioBuffer {\n    const { numberOfChannels = 1, length, sampleRate } = options;\n    if (numberOfChannels < 1 || numberOfChannels >= 32) {\n      throw new NotSupportedError(\n        `The number of channels provided (${numberOfChannels}) is outside the range [1, 32]`\n      );\n    }\n    if (length <= 0) {\n      throw new NotSupportedError(\n        `The number of frames provided (${length}) is less than or equal to the minimum bound (0)`\n      );\n    }\n    if (sampleRate < 8000 || sampleRate > 96000) {\n      throw new NotSupportedError(\n        `The sample rate provided (${sampleRate}) is outside the range [8000, 96000]`\n      );\n    }\n    return new globalThis.AudioBuffer({ numberOfChannels, length, sampleRate });\n  }\n\n  private isAudioBuffer(obj: unknown): obj is globalThis.AudioBuffer {\n    return (\n      typeof obj === 'object' &&\n      obj !== null &&\n      'getChannelData' in obj &&\n      typeof (obj as globalThis.AudioBuffer).getChannelData === 'function'\n    );\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/AudioBufferSourceNode.tsx",
    "content": "import { InvalidStateError, RangeError } from '../errors';\n\nimport AudioParam from './AudioParam';\nimport AudioBuffer from './AudioBuffer';\nimport BaseAudioContext from './BaseAudioContext';\nimport AudioNode from './AudioNode';\n\nimport { clamp } from '../utils';\nimport { AudioBufferSourceOptions } from '../types';\nimport { globalWasmPromise, globalTag } from './custom/LoadCustomWasm';\n\ninterface ScheduleOptions {\n  rate?: number;\n  active?: boolean;\n  output?: number;\n  input?: number;\n  semitones?: number;\n  loopStart?: number;\n  loopEnd?: number;\n}\n\ninterface IStretcherNode extends globalThis.AudioNode {\n  channelCount: number;\n  channelCountMode: globalThis.ChannelCountMode;\n  channelInterpretation: globalThis.ChannelInterpretation;\n  context: globalThis.BaseAudioContext;\n  numberOfInputs: number;\n  numberOfOutputs: number;\n\n  onEnded:\n    | ((this: globalThis.AudioScheduledSourceNode, ev: Event) => unknown)\n    | null;\n  addEventListener: (\n    type: string,\n    listener: EventListenerOrEventListenerObject | null,\n    options?: boolean | AddEventListenerOptions\n  ) => void;\n  dispatchEvent: (event: Event) => boolean;\n  removeEventListener: (\n    type: string,\n    callback: EventListenerOrEventListenerObject | null,\n    options?: boolean | EventListenerOptions\n  ) => void;\n\n  addBuffers(channels: Float32Array[]): void;\n  dropBuffers(): void;\n\n  schedule(options: ScheduleOptions): void;\n\n  start(\n    when?: number,\n    offset?: number,\n    duration?: number,\n    rate?: number,\n    semitones?: number\n  ): void;\n\n  stop(when?: number): void;\n\n  connect(\n    destination: globalThis.AudioNode,\n    output?: number,\n    input?: number\n  ): globalThis.AudioNode;\n  connect(destination: globalThis.AudioParam, output?: number): void;\n\n  disconnect(): void;\n  disconnect(output: number): void;\n\n  disconnect(destination: globalThis.AudioNode): globalThis.AudioNode;\n  disconnect(destination: globalThis.AudioNode, output: number): void;\n  disconnect(\n    destination: globalThis.AudioNode,\n    output: number,\n    input: number\n  ): void;\n\n  disconnect(destination: globalThis.AudioParam): void;\n  disconnect(destination: globalThis.AudioParam, output: number): void;\n}\n\nclass IStretcherNodeAudioParam implements globalThis.AudioParam {\n  private _value: number;\n  private _setter: (value: number, when?: number) => void;\n\n  public automationRate: AutomationRate;\n  public defaultValue: number;\n  public maxValue: number;\n  public minValue: number;\n\n  constructor(\n    value: number,\n    setter: (value: number, when?: number) => void,\n    automationRate: AutomationRate,\n    minValue: number,\n    maxValue: number,\n    defaultValue: number\n  ) {\n    this._value = value;\n    this.automationRate = automationRate;\n    this.minValue = minValue;\n    this.maxValue = maxValue;\n    this.defaultValue = defaultValue;\n    this._setter = setter;\n  }\n\n  public get value(): number {\n    return this._value;\n  }\n\n  public set value(value: number) {\n    this._value = value;\n\n    this._setter(value);\n  }\n\n  cancelAndHoldAtTime(cancelTime: number): globalThis.AudioParam {\n    this._setter(this.defaultValue, cancelTime);\n    return this;\n  }\n\n  cancelScheduledValues(cancelTime: number): globalThis.AudioParam {\n    this._setter(this.defaultValue, cancelTime);\n    return this;\n  }\n\n  exponentialRampToValueAtTime(\n    _value: number,\n    _endTime: number\n  ): globalThis.AudioParam {\n    console.warn(\n      'exponentialRampToValueAtTime is not implemented for pitch correction mode'\n    );\n    return this;\n  }\n\n  linearRampToValueAtTime(\n    _value: number,\n    _endTime: number\n  ): globalThis.AudioParam {\n    console.warn(\n      'linearRampToValueAtTime is not implemented for pitch correction mode'\n    );\n    return this;\n  }\n\n  setTargetAtTime(\n    _target: number,\n    _startTime: number,\n    _timeConstant: number\n  ): globalThis.AudioParam {\n    console.warn(\n      'setTargetAtTime is not implemented for pitch correction mode'\n    );\n    return this;\n  }\n\n  setValueAtTime(value: number, startTime: number): globalThis.AudioParam {\n    this._setter(value, startTime);\n    return this;\n  }\n\n  setValueCurveAtTime(\n    _values: Float32Array,\n    _startTime: number,\n    _duration: number\n  ): globalThis.AudioParam {\n    console.warn(\n      'setValueCurveAtTime is not implemented for pitch correction mode'\n    );\n    return this;\n  }\n}\n\ntype DefaultSource = globalThis.AudioBufferSourceNode;\n\ndeclare global {\n  interface Window {\n    [globalTag]: (\n      audioContext: globalThis.BaseAudioContext\n    ) => Promise<IStretcherNode>;\n  }\n}\n\ninterface IAudioAPIBufferSourceNodeWeb {\n  connect(destination: AudioNode | AudioParam): AudioNode | AudioParam;\n  disconnect(destination?: AudioNode | AudioParam): void;\n  start(when?: number, offset?: number, duration?: number): void;\n  stop(when: number): void;\n  setDetune(value: number, when?: number): void;\n  setPlaybackRate(value: number, when?: number): void;\n  get buffer(): AudioBuffer | null;\n  set buffer(buffer: AudioBuffer | null);\n  get loop(): boolean;\n  set loop(value: boolean);\n  get loopStart(): number;\n  set loopStart(value: number);\n  get loopEnd(): number;\n  set loopEnd(value: number);\n}\n\nclass AudioBufferSourceNodeStretcher implements IAudioAPIBufferSourceNodeWeb {\n  private stretcherPromise: Promise<IStretcherNode> | null = null;\n  private node: IStretcherNode | null = null;\n  private hasBeenStarted: boolean = false;\n  private context: BaseAudioContext;\n  readonly playbackRate: AudioParam;\n  readonly detune: AudioParam;\n\n  private _loop: boolean = false;\n  private _loopStart: number = -1;\n  private _loopEnd: number = -1;\n\n  private _buffer: AudioBuffer | null = null;\n  private bufferHasBeenSet: boolean = false;\n\n  constructor(context: BaseAudioContext) {\n    const promise = async () => {\n      await globalWasmPromise;\n      return window[globalTag](new window.AudioContext());\n    };\n    this.context = context;\n    this.stretcherPromise = promise();\n    this.stretcherPromise.then((node) => {\n      this.node = node;\n    });\n\n    this.detune = new AudioParam(\n      new IStretcherNodeAudioParam(\n        0,\n        this.setDetune.bind(this),\n        'a-rate',\n        -1200,\n        1200,\n        0\n      ),\n      context\n    );\n\n    this.playbackRate = new AudioParam(\n      new IStretcherNodeAudioParam(\n        1,\n        this.setPlaybackRate.bind(this),\n        'a-rate',\n        0,\n        Infinity,\n        1\n      ),\n      context\n    );\n  }\n\n  connect(destination: AudioNode | AudioParam): AudioNode | AudioParam {\n    const action = (node: IStretcherNode) => {\n      if (destination instanceof AudioParam) {\n        node.connect(destination.param);\n        return;\n      }\n      node.connect(destination.node);\n    };\n\n    if (!this.node) {\n      this.stretcherPromise!.then((node) => {\n        action(node);\n      });\n    } else {\n      action(this.node);\n    }\n\n    return destination;\n  }\n\n  disconnect(destination?: AudioNode | AudioParam): void {\n    const action = (node: IStretcherNode) => {\n      if (destination === undefined) {\n        node.disconnect();\n        return;\n      }\n\n      if (destination instanceof AudioParam) {\n        node.disconnect(destination.param);\n        return;\n      }\n      node.disconnect(destination.node);\n    };\n\n    if (!this.node) {\n      this.stretcherPromise!.then((node) => {\n        action(node);\n      });\n    } else {\n      action(this.node);\n    }\n  }\n\n  start(when?: number, offset?: number, duration?: number): void {\n    if (when && when < 0) {\n      throw new RangeError(\n        `when must be a finite non-negative number: ${when}`\n      );\n    }\n\n    if (offset && offset < 0) {\n      throw new RangeError(\n        `offset must be a finite non-negative number: ${offset}`\n      );\n    }\n\n    if (duration && duration < 0) {\n      throw new RangeError(\n        `duration must be a finite non-negative number: ${duration}`\n      );\n    }\n\n    if (this.hasBeenStarted) {\n      throw new InvalidStateError('Cannot call start more than once');\n    }\n\n    this.hasBeenStarted = true;\n    const startAt =\n      !when || when < this.context.currentTime\n        ? this.context.currentTime\n        : when;\n\n    const scheduleAction = (node: IStretcherNode) => {\n      node.schedule({\n        loopStart: this._loopStart,\n        loopEnd: this._loopEnd,\n      });\n    };\n\n    if (this.loop && this._loopStart !== -1 && this._loopEnd !== -1) {\n      if (!this.node) {\n        this.stretcherPromise!.then((node) => {\n          scheduleAction(node);\n        });\n      } else {\n        scheduleAction(this.node);\n      }\n    }\n\n    const startAction = (node: IStretcherNode) => {\n      node.start(\n        startAt,\n        offset,\n        duration,\n        this.playbackRate.value,\n        Math.floor(clamp(this.detune.value / 100, -12, 12))\n      );\n    };\n    if (!this.node) {\n      this.stretcherPromise!.then((node) => {\n        startAction(node);\n      });\n    } else {\n      startAction(this.node);\n    }\n  }\n\n  stop(when: number): void {\n    if (when < 0) {\n      throw new RangeError(\n        `when must be a finite non-negative number: ${when}`\n      );\n    }\n    const action = (node: IStretcherNode) => {\n      node.stop(when);\n    };\n    if (!this.node) {\n      this.stretcherPromise!.then((node) => {\n        action(node);\n      });\n      return;\n    }\n    action(this.node);\n  }\n\n  setDetune(value: number, when?: number): void {\n    if (!this.hasBeenStarted) {\n      return;\n    }\n    const action = (node: IStretcherNode) => {\n      node.schedule({\n        semitones: Math.floor(clamp(value / 100, -12, 12)),\n        output: when,\n      });\n    };\n\n    if (!this.node) {\n      this.stretcherPromise!.then((node) => {\n        action(node);\n      });\n      return;\n    }\n\n    action(this.node);\n  }\n\n  setPlaybackRate(value: number, when?: number): void {\n    if (!this.hasBeenStarted) {\n      return;\n    }\n    const action = (node: IStretcherNode) => {\n      node.schedule({\n        rate: value,\n        output: when,\n      });\n    };\n\n    if (!this.node) {\n      this.stretcherPromise!.then((node) => {\n        action(node);\n      });\n      return;\n    }\n\n    action(this.node);\n  }\n\n  get buffer(): AudioBuffer | null {\n    return this._buffer;\n  }\n\n  set buffer(buffer: AudioBuffer | null) {\n    if (buffer !== null && this.bufferHasBeenSet) {\n      throw new InvalidStateError(\n        'The buffer can only be set once and cannot be changed afterwards.'\n      );\n    }\n\n    this._buffer = buffer;\n    if (buffer !== null) {\n      this.bufferHasBeenSet = true;\n    }\n\n    const action = (node: IStretcherNode) => {\n      node.dropBuffers();\n\n      if (!buffer) {\n        return;\n      }\n\n      const channelArrays: Float32Array[] = [];\n\n      for (let i = 0; i < buffer.numberOfChannels; i++) {\n        channelArrays.push(buffer.getChannelData(i));\n      }\n\n      node.addBuffers(channelArrays);\n    };\n\n    if (!this.node) {\n      this.stretcherPromise!.then((node) => {\n        action(node);\n      });\n      return;\n    }\n    action(this.node);\n  }\n\n  get loop(): boolean {\n    return this._loop;\n  }\n\n  set loop(value: boolean) {\n    this._loop = value;\n  }\n\n  get loopStart(): number {\n    return this._loopStart;\n  }\n\n  set loopStart(value: number) {\n    this._loopStart = value;\n  }\n\n  get loopEnd(): number {\n    return this._loopEnd;\n  }\n\n  set loopEnd(value: number) {\n    this._loopEnd = value;\n  }\n}\n\nclass AudioBufferSourceNodeWeb implements IAudioAPIBufferSourceNodeWeb {\n  private node: DefaultSource;\n  private hasBeenStarted: boolean = false;\n  readonly playbackRate: AudioParam;\n  readonly detune: AudioParam;\n\n  constructor(context: BaseAudioContext, options?: AudioBufferSourceOptions) {\n    this.node = new globalThis.AudioBufferSourceNode(context.context, {\n      ...options,\n      ...(options?.buffer ? { buffer: options.buffer.buffer } : {}),\n    });\n    this.detune = new AudioParam(this.node.detune, context);\n    this.playbackRate = new AudioParam(this.node.playbackRate, context);\n  }\n\n  start(when: number = 0, offset?: number, duration?: number): void {\n    if (when && when < 0) {\n      throw new RangeError(\n        `when must be a finite non-negative number: ${when}`\n      );\n    }\n\n    if (offset && offset < 0) {\n      throw new RangeError(\n        `offset must be a finite non-negative number: ${offset}`\n      );\n    }\n\n    if (duration && duration < 0) {\n      throw new RangeError(\n        `duration must be a finite non-negative number: ${duration}`\n      );\n    }\n\n    if (this.hasBeenStarted) {\n      throw new InvalidStateError('Cannot call start more than once');\n    }\n\n    this.hasBeenStarted = true;\n    this.node.start(when, offset, duration);\n  }\n\n  stop(when: number = 0): void {\n    if (when < 0) {\n      throw new RangeError(\n        `when must be a finite non-negative number: ${when}`\n      );\n    }\n\n    if (!this.hasBeenStarted) {\n      throw new InvalidStateError(\n        'Cannot call stop without calling start first'\n      );\n    }\n    this.node.stop(when);\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  setDetune(value: number, when?: number): void {\n    console.warn('setDetune is not implemented for non-pitch-correction mode');\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unused-vars\n  setPlaybackRate(value: number, when?: number): void {\n    console.warn(\n      'setPlaybackRate is not implemented for non-pitch-correction mode'\n    );\n  }\n\n  get buffer(): AudioBuffer | null {\n    const buffer = this.node.buffer;\n    if (!buffer) {\n      return null;\n    }\n\n    return new AudioBuffer(buffer);\n  }\n\n  set buffer(buffer: AudioBuffer | null) {\n    if (!buffer) {\n      this.node.buffer = null;\n      return;\n    }\n\n    this.node.buffer = buffer.buffer;\n  }\n\n  get loop(): boolean {\n    return this.node.loop;\n  }\n\n  set loop(value: boolean) {\n    this.node.loop = value;\n  }\n\n  get loopStart(): number {\n    return this.node.loopStart;\n  }\n\n  set loopStart(value: number) {\n    this.node.loopStart = value;\n  }\n\n  get loopEnd(): number {\n    return this.node.loopEnd;\n  }\n\n  set loopEnd(value: number) {\n    this.node.loopEnd = value;\n  }\n\n  connect(destination: AudioNode | AudioParam): AudioNode | AudioParam {\n    if (destination instanceof AudioParam) {\n      this.node.connect(destination.param);\n    } else {\n      this.node.connect(destination.node);\n    }\n    return destination;\n  }\n\n  disconnect(destination?: AudioNode | AudioParam): void {\n    if (destination === undefined) {\n      this.node.disconnect();\n      return;\n    }\n\n    if (destination instanceof AudioParam) {\n      this.node.disconnect(destination.param);\n      return;\n    }\n    this.node.disconnect(destination.node);\n  }\n}\n\nexport default class AudioBufferSourceNode implements IAudioAPIBufferSourceNodeWeb {\n  private node: AudioBufferSourceNodeStretcher | AudioBufferSourceNodeWeb;\n  constructor(context: BaseAudioContext, options?: AudioBufferSourceOptions) {\n    this.node = options?.pitchCorrection\n      ? new AudioBufferSourceNodeStretcher(context)\n      : new AudioBufferSourceNodeWeb(context, options);\n  }\n\n  connect(destination: AudioNode | AudioParam): AudioNode | AudioParam {\n    return this.asAudioBufferSourceNodeWeb().connect(destination);\n  }\n\n  disconnect(destination?: AudioNode | AudioParam): void {\n    this.asAudioBufferSourceNodeWeb().disconnect(destination);\n  }\n\n  asAudioBufferSourceNodeWeb(): IAudioAPIBufferSourceNodeWeb {\n    return this.node as unknown as IAudioAPIBufferSourceNodeWeb;\n  }\n\n  start(when: number = 0, offset?: number, duration?: number): void {\n    this.asAudioBufferSourceNodeWeb().start(when, offset, duration);\n  }\n\n  stop(when: number = 0): void {\n    this.asAudioBufferSourceNodeWeb().stop(when);\n  }\n\n  setDetune(value: number, when?: number): void {\n    this.asAudioBufferSourceNodeWeb().setDetune(value, when);\n  }\n\n  setPlaybackRate(value: number, when?: number): void {\n    this.asAudioBufferSourceNodeWeb().setPlaybackRate(value, when);\n  }\n\n  get buffer(): AudioBuffer | null {\n    return this.asAudioBufferSourceNodeWeb().buffer;\n  }\n\n  set buffer(buffer: AudioBuffer | null) {\n    this.asAudioBufferSourceNodeWeb().buffer = buffer;\n  }\n\n  get loop(): boolean {\n    return this.asAudioBufferSourceNodeWeb().loop;\n  }\n\n  set loop(value: boolean) {\n    this.asAudioBufferSourceNodeWeb().loop = value;\n  }\n\n  get loopStart(): number {\n    return this.asAudioBufferSourceNodeWeb().loopStart;\n  }\n\n  set loopStart(value: number) {\n    this.asAudioBufferSourceNodeWeb().loopStart = value;\n  }\n\n  get loopEnd(): number {\n    return this.asAudioBufferSourceNodeWeb().loopEnd;\n  }\n\n  set loopEnd(value: number) {\n    this.asAudioBufferSourceNodeWeb().loopEnd = value;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/AudioContext.tsx",
    "content": "import { InvalidAccessError, NotSupportedError } from '../errors';\nimport { AudioContextOptions, ContextState, DecodeDataInput } from '../types';\nimport AnalyserNode from './AnalyserNode';\nimport AudioBuffer from './AudioBuffer';\nimport AudioBufferSourceNode from './AudioBufferSourceNode';\nimport AudioDestinationNode from './AudioDestinationNode';\nimport BaseAudioContext from './BaseAudioContext';\nimport BiquadFilterNode from './BiquadFilterNode';\nimport ConvolverNode from './ConvolverNode';\nimport DelayNode from './DelayNode';\nimport GainNode from './GainNode';\nimport IIRFilterNode from './IIRFilterNode';\nimport OscillatorNode from './OscillatorNode';\nimport PeriodicWave from './PeriodicWave';\nimport StereoPannerNode from './StereoPannerNode';\nimport ConstantSourceNode from './ConstantSourceNode';\nimport WaveShaperNode from './WaveShaperNode';\n\nexport default class AudioContext implements BaseAudioContext {\n  readonly context: globalThis.AudioContext;\n\n  readonly destination: AudioDestinationNode;\n  readonly sampleRate: number;\n\n  constructor(options?: AudioContextOptions) {\n    if (\n      options &&\n      options.sampleRate &&\n      (options.sampleRate < 8000 || options.sampleRate > 96000)\n    ) {\n      throw new NotSupportedError(\n        `The provided sampleRate is not supported: ${options.sampleRate}`\n      );\n    }\n\n    this.context = new window.AudioContext({ sampleRate: options?.sampleRate });\n\n    this.sampleRate = this.context.sampleRate;\n    this.destination = new AudioDestinationNode(this, this.context.destination);\n  }\n\n  public get currentTime(): number {\n    return this.context.currentTime;\n  }\n\n  public get state(): ContextState {\n    return this.context.state as ContextState;\n  }\n\n  createOscillator(): OscillatorNode {\n    return new OscillatorNode(this);\n  }\n\n  createConstantSource(): ConstantSourceNode {\n    return new ConstantSourceNode(this);\n  }\n\n  createGain(): GainNode {\n    return new GainNode(this);\n  }\n\n  createDelay(maxDelayTime?: number): DelayNode {\n    return new DelayNode(this, { maxDelayTime });\n  }\n\n  createStereoPanner(): StereoPannerNode {\n    return new StereoPannerNode(this);\n  }\n\n  createBiquadFilter(): BiquadFilterNode {\n    return new BiquadFilterNode(this);\n  }\n\n  createConvolver(): ConvolverNode {\n    return new ConvolverNode(this);\n  }\n\n  createIIRFilter(feedforward: number[], feedback: number[]): IIRFilterNode {\n    return new IIRFilterNode(this, { feedforward, feedback });\n  }\n\n  createBufferSource(pitchCorrection?: boolean): AudioBufferSourceNode {\n    return new AudioBufferSourceNode(this, { pitchCorrection });\n  }\n\n  createBuffer(\n    numberOfChannels: number,\n    length: number,\n    sampleRate: number\n  ): AudioBuffer {\n    if (numberOfChannels < 1 || numberOfChannels >= 32) {\n      throw new NotSupportedError(\n        `The number of channels provided (${numberOfChannels}) is outside the range [1, 32]`\n      );\n    }\n\n    if (length <= 0) {\n      throw new NotSupportedError(\n        `The number of frames provided (${length}) is less than or equal to the minimum bound (0)`\n      );\n    }\n\n    if (sampleRate < 8000 || sampleRate > 96000) {\n      throw new NotSupportedError(\n        `The sample rate provided (${sampleRate}) is outside the range [8000, 96000]`\n      );\n    }\n\n    return new AudioBuffer({ numberOfChannels, length, sampleRate });\n  }\n\n  createPeriodicWave(\n    real: Float32Array,\n    imag: Float32Array,\n    constraints?: PeriodicWaveConstraints\n  ): PeriodicWave {\n    if (real.length !== imag.length) {\n      throw new InvalidAccessError(\n        `The lengths of the real (${real.length}) and imaginary (${imag.length}) arrays must match.`\n      );\n    }\n\n    return new PeriodicWave(this, { real, imag, ...constraints });\n  }\n\n  createAnalyser(): AnalyserNode {\n    return new AnalyserNode(this);\n  }\n\n  createWaveShaper(): WaveShaperNode {\n    return new WaveShaperNode(this, this.context.createWaveShaper());\n  }\n\n  async decodeAudioData(\n    source: DecodeDataInput,\n    fetchOptions?: RequestInit\n  ): Promise<AudioBuffer> {\n    if (source instanceof ArrayBuffer) {\n      const decodedData = await this.context.decodeAudioData(source);\n      return new AudioBuffer(decodedData);\n    }\n\n    if (typeof source === 'string') {\n      const response = await fetch(source, fetchOptions);\n\n      if (!response.ok) {\n        throw new InvalidAccessError(\n          `Failed to fetch audio data from the provided source: ${source}`\n        );\n      }\n\n      const arrayBuffer = await response.arrayBuffer();\n      const decodedData = await this.context.decodeAudioData(arrayBuffer);\n      return new AudioBuffer(decodedData);\n    }\n\n    throw new TypeError('Unsupported source for decodeAudioData: ' + source);\n  }\n\n  async close(): Promise<void> {\n    await this.context.close();\n  }\n\n  async resume(): Promise<void> {\n    await this.context.resume();\n  }\n\n  async suspend(): Promise<void> {\n    await this.context.suspend();\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/AudioDestinationNode.tsx",
    "content": "import AudioNode from './AudioNode';\n\nexport default class AudioDestinationNode extends AudioNode {}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/AudioNode.tsx",
    "content": "import BaseAudioContext from './BaseAudioContext';\nimport { ChannelCountMode, ChannelInterpretation } from '../types';\nimport AudioParam from './AudioParam';\n\nexport default class AudioNode {\n  readonly context: BaseAudioContext;\n  readonly numberOfInputs: number;\n  readonly numberOfOutputs: number;\n  readonly channelCount: number;\n  readonly channelCountMode: ChannelCountMode;\n  readonly channelInterpretation: ChannelInterpretation;\n\n  readonly node: globalThis.AudioNode;\n\n  constructor(context: BaseAudioContext, node: globalThis.AudioNode) {\n    this.context = context;\n    this.node = node;\n    this.numberOfInputs = this.node.numberOfInputs;\n    this.numberOfOutputs = this.node.numberOfOutputs;\n    this.channelCount = this.node.channelCount;\n    this.channelCountMode = this.node.channelCountMode;\n    this.channelInterpretation = this.node.channelInterpretation;\n  }\n\n  public connect(destination: AudioNode | AudioParam): AudioNode | AudioParam {\n    if (this.context !== destination.context) {\n      throw new Error(\n        'Source and destination are from different BaseAudioContexts'\n      );\n    }\n\n    if (destination instanceof AudioParam) {\n      this.node.connect(destination.param);\n    } else {\n      this.node.connect(destination.node);\n    }\n\n    return destination;\n  }\n\n  public disconnect(destination?: AudioNode | AudioParam): void {\n    if (destination === undefined) {\n      this.node.disconnect();\n      return;\n    }\n\n    if (destination instanceof AudioParam) {\n      this.node.disconnect(destination.param);\n      return;\n    }\n    this.node.disconnect(destination.node);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/AudioParam.tsx",
    "content": "import { RangeError, InvalidStateError } from '../errors';\nimport BaseAudioContext from './BaseAudioContext';\n\nexport default class AudioParam {\n  readonly defaultValue: number;\n  readonly minValue: number;\n  readonly maxValue: number;\n  readonly context: BaseAudioContext;\n\n  readonly param: globalThis.AudioParam;\n\n  constructor(param: globalThis.AudioParam, context: BaseAudioContext) {\n    this.param = param;\n    this.defaultValue = param.defaultValue;\n    this.minValue = param.minValue;\n    this.maxValue = param.maxValue;\n    this.context = context;\n  }\n\n  public get value(): number {\n    return this.param.value;\n  }\n\n  public set value(value: number) {\n    this.param.value = value;\n  }\n\n  public setValueAtTime(value: number, startTime: number): AudioParam {\n    if (startTime < 0) {\n      throw new RangeError(\n        `startTime must be a finite non-negative number: ${startTime}`\n      );\n    }\n\n    this.param.setValueAtTime(value, startTime);\n\n    return this;\n  }\n\n  public linearRampToValueAtTime(value: number, endTime: number): AudioParam {\n    if (endTime < 0) {\n      throw new RangeError(\n        `endTime must be a finite non-negative number: ${endTime}`\n      );\n    }\n\n    this.param.linearRampToValueAtTime(value, endTime);\n\n    return this;\n  }\n\n  public exponentialRampToValueAtTime(\n    value: number,\n    endTime: number\n  ): AudioParam {\n    if (endTime < 0) {\n      throw new RangeError(\n        `endTime must be a finite non-negative number: ${endTime}`\n      );\n    }\n\n    this.param.exponentialRampToValueAtTime(value, endTime);\n\n    return this;\n  }\n\n  public setTargetAtTime(\n    target: number,\n    startTime: number,\n    timeConstant: number\n  ): AudioParam {\n    if (startTime < 0) {\n      throw new RangeError(\n        `startTime must be a finite non-negative number: ${startTime}`\n      );\n    }\n\n    if (timeConstant < 0) {\n      throw new RangeError(\n        `timeConstant must be a finite non-negative number: ${startTime}`\n      );\n    }\n\n    this.param.setTargetAtTime(target, startTime, timeConstant);\n\n    return this;\n  }\n\n  public setValueCurveAtTime(\n    values: Float32Array,\n    startTime: number,\n    duration: number\n  ): AudioParam {\n    if (startTime < 0) {\n      throw new RangeError(\n        `startTime must be a finite non-negative number: ${startTime}`\n      );\n    }\n\n    if (duration < 0) {\n      throw new RangeError(\n        `duration must be a finite non-negative number: ${startTime}`\n      );\n    }\n\n    if (values.length < 2) {\n      throw new InvalidStateError(`values must contain at least two values`);\n    }\n\n    this.param.setValueCurveAtTime(values, startTime, duration);\n\n    return this;\n  }\n\n  public cancelScheduledValues(cancelTime: number): AudioParam {\n    if (cancelTime < 0) {\n      throw new RangeError(\n        `cancelTime must be a finite non-negative number: ${cancelTime}`\n      );\n    }\n\n    this.param.cancelScheduledValues(cancelTime);\n\n    return this;\n  }\n\n  public cancelAndHoldAtTime(cancelTime: number): AudioParam {\n    if (cancelTime < 0) {\n      throw new RangeError(\n        `cancelTime must be a finite non-negative number: ${cancelTime}`\n      );\n    }\n\n    this.param.cancelAndHoldAtTime(cancelTime);\n\n    return this;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/AudioScheduledSourceNode.tsx",
    "content": "import AudioNode from './AudioNode';\nimport { EventEmptyType } from '../events/types';\nimport { RangeError, InvalidStateError } from '../errors';\n\nexport default class AudioScheduledSourceNode extends AudioNode {\n  protected hasBeenStarted: boolean = false;\n  private onEndedCallback?: (event: EventEmptyType) => void;\n\n  public start(when: number = 0): void {\n    if (when < 0) {\n      throw new RangeError(\n        `when must be a finite non-negative number: ${when}`\n      );\n    }\n\n    if (this.hasBeenStarted) {\n      throw new InvalidStateError('Cannot call start more than once');\n    }\n\n    this.hasBeenStarted = true;\n    (this.node as globalThis.AudioScheduledSourceNode).start(when);\n  }\n\n  public stop(when: number = 0): void {\n    if (when < 0) {\n      throw new RangeError(\n        `when must be a finite non-negative number: ${when}`\n      );\n    }\n\n    if (!this.hasBeenStarted) {\n      throw new InvalidStateError(\n        'Cannot call stop without calling start first'\n      );\n    }\n\n    (this.node as globalThis.AudioScheduledSourceNode).stop(when);\n  }\n\n  public get onEnded(): ((event: EventEmptyType) => void) | undefined {\n    return this.onEndedCallback;\n  }\n\n  public set onEnded(callback: (event: EventEmptyType) => void | null) {\n    (this.node as globalThis.AudioScheduledSourceNode).onended = callback;\n    this.onEndedCallback = callback;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/BaseAudioContext.tsx",
    "content": "import { ContextState } from '../types';\nimport AnalyserNode from './AnalyserNode';\nimport AudioBuffer from './AudioBuffer';\nimport AudioBufferSourceNode from './AudioBufferSourceNode';\nimport AudioDestinationNode from './AudioDestinationNode';\nimport BiquadFilterNode from './BiquadFilterNode';\nimport ConstantSourceNode from './ConstantSourceNode';\nimport ConvolverNode from './ConvolverNode';\nimport DelayNode from './DelayNode';\nimport GainNode from './GainNode';\nimport IIRFilterNode from './IIRFilterNode';\nimport OscillatorNode from './OscillatorNode';\nimport PeriodicWave from './PeriodicWave';\nimport StereoPannerNode from './StereoPannerNode';\nimport WaveShaperNode from './WaveShaperNode';\n\nexport default interface BaseAudioContext {\n  readonly context: globalThis.BaseAudioContext;\n\n  readonly destination: AudioDestinationNode;\n  readonly sampleRate: number;\n\n  get currentTime(): number;\n  get state(): ContextState;\n  createOscillator(): OscillatorNode;\n  createConstantSource(): ConstantSourceNode;\n  createGain(): GainNode;\n  createDelay(maxDelayTime?: number): DelayNode;\n  createStereoPanner(): StereoPannerNode;\n  createBiquadFilter(): BiquadFilterNode;\n  createIIRFilter(feedforward: number[], feedback: number[]): IIRFilterNode;\n  createConvolver(): ConvolverNode;\n  createBufferSource(): AudioBufferSourceNode;\n  createBuffer(\n    numOfChannels: number,\n    length: number,\n    sampleRate: number\n  ): AudioBuffer;\n  createPeriodicWave(\n    real: Float32Array,\n    imag: Float32Array,\n    constraints?: PeriodicWaveConstraints\n  ): PeriodicWave;\n  createAnalyser(): AnalyserNode;\n  createWaveShaper(): WaveShaperNode;\n  decodeAudioData(\n    arrayBuffer: ArrayBuffer,\n    fetchOptions?: RequestInit\n  ): Promise<AudioBuffer>;\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/BiquadFilterNode.tsx",
    "content": "import AudioParam from './AudioParam';\nimport AudioNode from './AudioNode';\nimport BaseAudioContext from './BaseAudioContext';\nimport { InvalidAccessError } from '../errors';\nimport { BiquadFilterOptions } from '../types';\n\nexport default class BiquadFilterNode extends AudioNode {\n  readonly frequency: AudioParam;\n  readonly detune: AudioParam;\n  readonly Q: AudioParam;\n  readonly gain: AudioParam;\n\n  constructor(\n    context: BaseAudioContext,\n    biquadFilterOptions?: BiquadFilterOptions\n  ) {\n    const biquadFilter = new globalThis.BiquadFilterNode(\n      context.context,\n      biquadFilterOptions\n    );\n    super(context, biquadFilter);\n    this.frequency = new AudioParam(biquadFilter.frequency, context);\n    this.detune = new AudioParam(biquadFilter.detune, context);\n    this.Q = new AudioParam(biquadFilter.Q, context);\n    this.gain = new AudioParam(biquadFilter.gain, context);\n  }\n\n  public get type(): BiquadFilterType {\n    return (this.node as globalThis.BiquadFilterNode).type;\n  }\n\n  public set type(value: BiquadFilterType) {\n    (this.node as globalThis.BiquadFilterNode).type = value;\n  }\n\n  public getFrequencyResponse(\n    frequencyArray: Float32Array,\n    magResponseOutput: Float32Array,\n    phaseResponseOutput: Float32Array\n  ) {\n    if (\n      frequencyArray.length !== magResponseOutput.length ||\n      frequencyArray.length !== phaseResponseOutput.length\n    ) {\n      throw new InvalidAccessError(\n        `The lengths of the arrays are not the same frequencyArray: ${frequencyArray.length}, magResponseOutput: ${magResponseOutput.length}, phaseResponseOutput: ${phaseResponseOutput.length}`\n      );\n    }\n\n    (this.node as globalThis.BiquadFilterNode).getFrequencyResponse(\n      frequencyArray,\n      magResponseOutput,\n      phaseResponseOutput\n    );\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/ConstantSourceNode.tsx",
    "content": "import AudioParam from './AudioParam';\nimport AudioScheduledSourceNode from './AudioScheduledSourceNode';\nimport BaseAudioContext from './BaseAudioContext';\nimport { ConstantSourceOptions } from '../types';\n\nexport default class ConstantSourceNode extends AudioScheduledSourceNode {\n  readonly offset: AudioParam;\n\n  constructor(context: BaseAudioContext, options?: ConstantSourceOptions) {\n    const node = new globalThis.ConstantSourceNode(context.context, options);\n    super(context, node);\n    this.offset = new AudioParam(node.offset, context);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/ConvolverNode.tsx",
    "content": "import BaseAudioContext from './BaseAudioContext';\nimport AudioNode from './AudioNode';\nimport AudioBuffer from './AudioBuffer';\nimport { ConvolverOptions } from '../types';\n\nexport default class ConvolverNode extends AudioNode {\n  constructor(context: BaseAudioContext, convolverOptions?: ConvolverOptions) {\n    const convolver = new globalThis.ConvolverNode(context.context, {\n      ...convolverOptions,\n      ...(convolverOptions?.buffer\n        ? { buffer: convolverOptions.buffer.buffer }\n        : {}),\n    });\n\n    const node = convolver;\n    super(context, node);\n  }\n\n  public get buffer(): AudioBuffer | null {\n    const buffer = (this.node as globalThis.ConvolverNode).buffer;\n    if (!buffer) {\n      return null;\n    }\n    return new AudioBuffer(buffer);\n  }\n\n  public set buffer(buffer: AudioBuffer | null) {\n    if (!buffer) {\n      (this.node as globalThis.ConvolverNode).buffer = null;\n    } else {\n      (this.node as globalThis.ConvolverNode).buffer = buffer.buffer;\n    }\n  }\n\n  public get normalize(): boolean {\n    return (this.node as globalThis.ConvolverNode).normalize;\n  }\n\n  public set normalize(value: boolean) {\n    (this.node as globalThis.ConvolverNode).normalize = value;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/ConvolverNodeOptions.tsx",
    "content": "import AudioBuffer from './AudioBuffer';\n\nexport interface ConvolverNodeOptions {\n  buffer?: AudioBuffer | null;\n  disableNormalization?: boolean;\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/DelayNode.tsx",
    "content": "import BaseAudioContext from './BaseAudioContext';\nimport AudioNode from './AudioNode';\nimport AudioParam from './AudioParam';\nimport { DelayOptions } from '../types';\n\nexport default class DelayNode extends AudioNode {\n  readonly delayTime: AudioParam;\n\n  constructor(context: BaseAudioContext, options?: DelayOptions) {\n    const delay = new globalThis.DelayNode(context.context, options);\n    super(context, delay);\n    this.delayTime = new AudioParam(delay.delayTime, context);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/GainNode.tsx",
    "content": "import BaseAudioContext from './BaseAudioContext';\nimport AudioNode from './AudioNode';\nimport AudioParam from './AudioParam';\nimport { GainOptions } from '../types';\n\nexport default class GainNode extends AudioNode {\n  readonly gain: AudioParam;\n\n  constructor(context: BaseAudioContext, gainOptions?: GainOptions) {\n    const gain = new globalThis.GainNode(context.context, gainOptions);\n    super(context, gain);\n    this.gain = new AudioParam(gain.gain, context);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/IIRFilterNode.tsx",
    "content": "import { NotSupportedError } from '../errors';\nimport AudioNode from './AudioNode';\nimport { IIRFilterOptions } from '../types';\nimport BaseAudioContext from './BaseAudioContext';\n\nexport default class IIRFilterNode extends AudioNode {\n  constructor(context: BaseAudioContext, options: IIRFilterOptions) {\n    const iirFilterNode = new globalThis.IIRFilterNode(\n      context.context,\n      options\n    );\n    super(context, iirFilterNode);\n  }\n\n  public getFrequencyResponse(\n    frequencyArray: Float32Array,\n    magResponseOutput: Float32Array,\n    phaseResponseOutput: Float32Array\n  ) {\n    if (\n      frequencyArray.length !== magResponseOutput.length ||\n      frequencyArray.length !== phaseResponseOutput.length\n    ) {\n      throw new NotSupportedError(\n        `The lengths of the arrays are not the same frequencyArray: ${frequencyArray.length}, magResponseOutput: ${magResponseOutput.length}, phaseResponseOutput: ${phaseResponseOutput.length}`\n      );\n    }\n\n    (this.node as globalThis.IIRFilterNode).getFrequencyResponse(\n      frequencyArray,\n      magResponseOutput,\n      phaseResponseOutput\n    );\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/OfflineAudioContext.tsx",
    "content": "import { ContextState, OfflineAudioContextOptions } from '../types';\nimport { InvalidAccessError, NotSupportedError } from '../errors';\nimport BaseAudioContext from './BaseAudioContext';\nimport AnalyserNode from './AnalyserNode';\nimport AudioDestinationNode from './AudioDestinationNode';\nimport AudioBuffer from './AudioBuffer';\nimport AudioBufferSourceNode from './AudioBufferSourceNode';\nimport BiquadFilterNode from './BiquadFilterNode';\nimport IIRFilterNode from './IIRFilterNode';\nimport GainNode from './GainNode';\nimport OscillatorNode from './OscillatorNode';\nimport PeriodicWave from './PeriodicWave';\nimport StereoPannerNode from './StereoPannerNode';\nimport ConstantSourceNode from './ConstantSourceNode';\nimport WaveShaperNode from './WaveShaperNode';\n\nimport ConvolverNode from './ConvolverNode';\nimport DelayNode from './DelayNode';\n\nexport default class OfflineAudioContext implements BaseAudioContext {\n  readonly context: globalThis.OfflineAudioContext;\n\n  readonly destination: AudioDestinationNode;\n  readonly sampleRate: number;\n\n  constructor(options: OfflineAudioContextOptions);\n  constructor(numberOfChannels: number, length: number, sampleRate: number);\n  constructor(\n    arg0: OfflineAudioContextOptions | number,\n    arg1?: number,\n    arg2?: number\n  ) {\n    if (typeof arg0 === 'object') {\n      this.context = new window.OfflineAudioContext(arg0);\n    } else if (\n      typeof arg0 === 'number' &&\n      typeof arg1 === 'number' &&\n      typeof arg2 === 'number'\n    ) {\n      this.context = new window.OfflineAudioContext(arg0, arg1, arg2);\n    } else {\n      throw new NotSupportedError('Invalid constructor arguments');\n    }\n\n    this.sampleRate = this.context.sampleRate;\n    this.destination = new AudioDestinationNode(this, this.context.destination);\n  }\n\n  public get currentTime(): number {\n    return this.context.currentTime;\n  }\n\n  public get state(): ContextState {\n    return this.context.state as ContextState;\n  }\n\n  createOscillator(): OscillatorNode {\n    return new OscillatorNode(this);\n  }\n\n  createConstantSource(): ConstantSourceNode {\n    return new ConstantSourceNode(this);\n  }\n\n  createGain(): GainNode {\n    return new GainNode(this);\n  }\n\n  createDelay(maxDelayTime?: number): DelayNode {\n    return new DelayNode(this, { maxDelayTime });\n  }\n\n  createStereoPanner(): StereoPannerNode {\n    return new StereoPannerNode(this);\n  }\n\n  createBiquadFilter(): BiquadFilterNode {\n    return new BiquadFilterNode(this);\n  }\n\n  createConvolver(): ConvolverNode {\n    return new ConvolverNode(this);\n  }\n\n  createIIRFilter(feedforward: number[], feedback: number[]): IIRFilterNode {\n    return new IIRFilterNode(this, { feedforward, feedback });\n  }\n\n  createBufferSource(pitchCorrection?: boolean): AudioBufferSourceNode {\n    return new AudioBufferSourceNode(this, { pitchCorrection });\n  }\n\n  createBuffer(\n    numberOfChannels: number,\n    length: number,\n    sampleRate: number\n  ): AudioBuffer {\n    if (numberOfChannels < 1 || numberOfChannels >= 32) {\n      throw new NotSupportedError(\n        `The number of channels provided (${numberOfChannels}) is outside the range [1, 32]`\n      );\n    }\n\n    if (length <= 0) {\n      throw new NotSupportedError(\n        `The number of frames provided (${length}) is less than or equal to the minimum bound (0)`\n      );\n    }\n\n    if (sampleRate < 8000 || sampleRate > 96000) {\n      throw new NotSupportedError(\n        `The sample rate provided (${sampleRate}) is outside the range [8000, 96000]`\n      );\n    }\n\n    return new AudioBuffer({ numberOfChannels, length, sampleRate });\n  }\n\n  createPeriodicWave(\n    real: Float32Array,\n    imag: Float32Array,\n    constraints?: PeriodicWaveConstraints\n  ): PeriodicWave {\n    if (real.length !== imag.length) {\n      throw new InvalidAccessError(\n        `The lengths of the real (${real.length}) and imaginary (${imag.length}) arrays must match.`\n      );\n    }\n\n    return new PeriodicWave(this, { real, imag, ...constraints });\n  }\n\n  createAnalyser(): AnalyserNode {\n    return new AnalyserNode(this);\n  }\n\n  createWaveShaper(): WaveShaperNode {\n    return new WaveShaperNode(this, this.context.createWaveShaper());\n  }\n\n  async decodeAudioDataSource(source: string): Promise<AudioBuffer> {\n    const arrayBuffer = await fetch(source).then((response) =>\n      response.arrayBuffer()\n    );\n\n    return this.decodeAudioData(arrayBuffer);\n  }\n\n  async decodeAudioData(arrayBuffer: ArrayBuffer): Promise<AudioBuffer> {\n    return new AudioBuffer(await this.context.decodeAudioData(arrayBuffer));\n  }\n\n  async startRendering(): Promise<AudioBuffer> {\n    return new AudioBuffer(await this.context.startRendering());\n  }\n\n  async resume(): Promise<void> {\n    await this.context.resume();\n  }\n\n  async suspend(suspendTime: number): Promise<void> {\n    await this.context.suspend(suspendTime);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/OscillatorNode.tsx",
    "content": "import { OscillatorType, OscillatorOptions } from '../types';\nimport { InvalidStateError } from '../errors';\nimport AudioScheduledSourceNode from './AudioScheduledSourceNode';\nimport BaseAudioContext from './BaseAudioContext';\nimport AudioParam from './AudioParam';\nimport PeriodicWave from './PeriodicWave';\n\nexport default class OscillatorNode extends AudioScheduledSourceNode {\n  readonly frequency: AudioParam;\n  readonly detune: AudioParam;\n\n  constructor(context: BaseAudioContext, options?: OscillatorOptions) {\n    const node = new globalThis.OscillatorNode(context.context, options);\n    super(context, node);\n\n    this.detune = new AudioParam(node.detune, context);\n    this.frequency = new AudioParam(node.frequency, context);\n  }\n\n  public get type(): OscillatorType {\n    return (this.node as globalThis.OscillatorNode).type;\n  }\n\n  public set type(value: OscillatorType) {\n    if (value === 'custom') {\n      throw new InvalidStateError(\n        \"'type' cannot be set directly to 'custom'.  Use setPeriodicWave() to create a custom Oscillator type.\"\n      );\n    }\n\n    (this.node as globalThis.OscillatorNode).type = value;\n  }\n\n  public setPeriodicWave(wave: PeriodicWave): void {\n    (this.node as globalThis.OscillatorNode).setPeriodicWave(wave.periodicWave);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/PeriodicWave.tsx",
    "content": "import BaseAudioContext from './BaseAudioContext';\nimport { PeriodicWaveOptions } from '../types';\nimport { generateRealAndImag } from '../core/PeriodicWave';\n\nexport default class PeriodicWave {\n  /** @internal */\n  readonly periodicWave: globalThis.PeriodicWave;\n\n  constructor(context: BaseAudioContext, options?: PeriodicWaveOptions) {\n    const finalOptions = generateRealAndImag(options);\n    const periodicWave = context.context.createPeriodicWave(\n      finalOptions.real!,\n      finalOptions.imag!,\n      { disableNormalization: finalOptions.disableNormalization }\n    );\n    this.periodicWave = periodicWave;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/StereoPannerNode.tsx",
    "content": "import { StereoPannerOptions } from '../types';\nimport AudioNode from './AudioNode';\nimport AudioParam from './AudioParam';\nimport BaseAudioContext from './BaseAudioContext';\n\nexport default class StereoPannerNode extends AudioNode {\n  readonly pan: AudioParam;\n\n  constructor(\n    context: BaseAudioContext,\n    stereoPannerOptions?: StereoPannerOptions\n  ) {\n    const pan = new globalThis.StereoPannerNode(\n      context.context,\n      stereoPannerOptions\n    );\n    super(context, pan);\n    this.pan = new AudioParam(pan.pan, context);\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/WaveShaperNode.tsx",
    "content": "import { InvalidStateError } from '../errors';\nimport AudioNode from './AudioNode';\n\nexport default class WaveShaperNode extends AudioNode {\n  private isCurveSet: boolean = false;\n\n  get curve(): Float32Array | null {\n    if (!this.isCurveSet) {\n      return null;\n    }\n\n    return (this.node as globalThis.WaveShaperNode).curve;\n  }\n\n  get oversample(): OverSampleType {\n    return (this.node as globalThis.WaveShaperNode).oversample;\n  }\n\n  set curve(curve: Float32Array | null) {\n    if (curve !== null) {\n      if (this.isCurveSet) {\n        throw new InvalidStateError(\n          'The curve can only be set once and cannot be changed afterwards.'\n        );\n      }\n\n      if (curve.length < 2) {\n        throw new InvalidStateError(\n          'The curve must have at least two values if not null.'\n        );\n      }\n\n      this.isCurveSet = true;\n    }\n\n    (this.node as globalThis.WaveShaperNode).curve = curve;\n  }\n\n  set oversample(value: OverSampleType) {\n    (this.node as globalThis.WaveShaperNode).oversample = value;\n  }\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/custom/LoadCustomWasm.ts",
    "content": "export const globalTag = '__rnaaCstStretch';\nconst eventTitle = 'rnaaCstStretchLoaded';\n\nexport let globalWasmPromise: Promise<void> | null = null;\n\nconst LoadCustomWasm = async (pathPrefix: string = '') => {\n  if (typeof window === 'undefined') {\n    return null;\n  }\n\n  if (globalWasmPromise) {\n    return globalWasmPromise;\n  }\n\n  globalWasmPromise = new Promise<void>((resolve) => {\n    const loadScript = document.createElement('script');\n    document.head.appendChild(loadScript);\n    loadScript.type = 'module';\n\n    loadScript.textContent = `\n      import SignalsmithStretch from '${pathPrefix}/signalsmithStretch.mjs';\n      window.${globalTag} = SignalsmithStretch;\n      window.postMessage('${eventTitle}');\n    `;\n\n    function onScriptLoaded(event: MessageEvent<string>) {\n      if (event.data !== eventTitle) {\n        return;\n      }\n\n      resolve();\n      window.removeEventListener('message', onScriptLoaded);\n    }\n\n    window.addEventListener('message', onScriptLoaded);\n  });\n};\n\nexport default LoadCustomWasm;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/custom/index.ts",
    "content": "export { default as LoadCustomWasm } from './LoadCustomWasm';\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/custom/signalsmithStretch/LICENSE.txt",
    "content": "MIT License\n\nCopyright (c) 2022 Geraint Luff / Signalsmith Audio Ltd.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/custom/signalsmithStretch/README.md",
    "content": "# Signalsmith Stretch Web\n\nThis is an official release of the Signalsmith Stretch library for Web Audio, using WASM/AudioWorklet. It includes both plain `.js` (UMD), and ES6 `.mjs` versions.\n\n## How to use it\n\nCall `SignalsmithStretch(audioContext, ?channelOptions)` from the main thread. This returns a Promise which resolves to an `AudioNode`, with extra methods attached to it.\n\nIt can operate either on live/streaming input, or on a sample buffer you load into it.\n\n### `stretch.inputTime`\n\nThe current input time, within the sample buffer. You can change how often this is updated, with an optional callback function, using `stretch.setUpdateInterval(seconds, ?callback)`.\n\n### `stretch.schedule({...})`\n\nThis adds a scheduled change, removing any scheduled changes occurring after this one. The object properties are:\n\n- `output` (seconds): audio context time for this change. The node compensates for its own latency, but this means you might want to schedule some things ahead of time, otherwise you'll have a softer transition as it catches up.\n- `active` (bool): processing audio\n- `input` (seconds): position in input buffer\n- `rate` (number): playback rate, e.g. 0.5 == half speed\n- `semitones` (number): pitch shift\n- `loopStart` / `loopEnd`: sets a section of the input to auto-loop. Disabled if both are set to the same value.\n\n### `stretch.start(?when)` / `stretch.stop(?when)`\n\nStarts/stops playback or processing, immediately or at some future time. These are convenience methods which call `.schedule(...)` under the hood.\n\n`.start()` actually has more parameters, presenting a similar interface to [AudioBufferSourceNode](https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode/start).\n\n### `stretch.addBuffers([...])`\n\nThis adds buffers to the end of the current input. Buffers should be typed arrays of equal length, one per channel.\n\nIt can be called multiple times, and the new buffers are inserted after the existing ones, which lets you start playback before the entire audio is loaded. It returns (as a Promise) the new end time for the stored input, in seconds.\n\n### `stretch.dropBuffers()`\n\nThis drops all input buffers, and resets the input buffer start time to 0.\n\n### `stretch.dropBuffers(toSeconds)`\n\nThis drops all input buffers before the given time. It returns (as a Promise) the an object with the current input buffer extent: `{start: ..., end: ...}`.\n\nThis can be useful when processing streams or very long audio files, letting the Stretch node release old buffers once that section of the input will no longer be played back.\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-core/custom/signalsmithStretch/SignalsmithStretch.mjs",
    "content": "let module = {},\n  exports = {};\nvar SignalsmithStretch = (() => {\n  var _scriptName =\n    typeof document != 'undefined' ? document.currentScript?.src : undefined;\n\n  return async function (moduleArg = {}) {\n    var moduleRtn;\n\n    var Module = moduleArg;\n    var readyPromiseResolve, readyPromiseReject;\n    var readyPromise = new Promise((resolve, reject) => {\n      readyPromiseResolve = resolve;\n      readyPromiseReject = reject;\n    });\n    var ENVIRONMENT_IS_WEB = typeof window == 'object';\n    var ENVIRONMENT_IS_WORKER = typeof WorkerGlobalScope != 'undefined';\n    var ENVIRONMENT_IS_NODE =\n      typeof process == 'object' &&\n      typeof process.versions == 'object' &&\n      typeof process.versions.node == 'string' &&\n      process.type != 'renderer';\n    var ENVIRONMENT_IS_SHELL =\n      !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER;\n    var crypto = globalThis?.crypto || {\n      getRandomValues: (array) => {\n        for (var i = 0; i < array.length; i++)\n          array[i] = (Math.random() * 256) | 0;\n      },\n    };\n    var performance = globalThis?.performance || { now: (_) => Date.now() };\n    var moduleOverrides = Object.assign({}, Module);\n    var arguments_ = [];\n    var quit_ = (status, toThrow) => {\n      throw toThrow;\n    };\n    var scriptDirectory = '';\n    var readAsync, readBinary;\n    if (ENVIRONMENT_IS_SHELL) {\n      readBinary = (f) => {\n        if (typeof readbuffer == 'function') {\n          return new Uint8Array(readbuffer(f));\n        }\n        let data = read(f, 'binary');\n        assert(typeof data == 'object');\n        return data;\n      };\n      readAsync = async (f) => readBinary(f);\n      globalThis.clearTimeout ??= (id) => {};\n      globalThis.setTimeout ??= (f) => f();\n      arguments_ = globalThis.arguments || globalThis.scriptArgs;\n      if (typeof quit == 'function') {\n        quit_ = (status, toThrow) => {\n          setTimeout(() => {\n            if (!(toThrow instanceof ExitStatus)) {\n              let toLog = toThrow;\n              if (toThrow && typeof toThrow == 'object' && toThrow.stack) {\n                toLog = [toThrow, toThrow.stack];\n              }\n              err(`exiting due to exception: ${toLog}`);\n            }\n            quit(status);\n          });\n          throw toThrow;\n        };\n      }\n      if (typeof print != 'undefined') {\n        globalThis.console ??= {};\n        console.log = print;\n        console.warn = console.error = globalThis.printErr ?? print;\n      }\n    } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {\n      if (ENVIRONMENT_IS_WORKER) {\n        scriptDirectory = self.location.href;\n      } else if (typeof document != 'undefined' && document.currentScript) {\n        scriptDirectory = document.currentScript.src;\n      }\n      if (_scriptName) {\n        scriptDirectory = _scriptName;\n      }\n      if (scriptDirectory.startsWith('blob:')) {\n        scriptDirectory = '';\n      } else {\n        scriptDirectory = scriptDirectory.slice(\n          0,\n          scriptDirectory.replace(/[?#].*/, '').lastIndexOf('/') + 1\n        );\n      }\n      {\n        if (ENVIRONMENT_IS_WORKER) {\n          readBinary = (url) => {\n            var xhr = new XMLHttpRequest();\n            xhr.open('GET', url, false);\n            xhr.responseType = 'arraybuffer';\n            xhr.send(null);\n            return new Uint8Array(xhr.response);\n          };\n        }\n        readAsync = async (url) => {\n          var response = await fetch(url, { credentials: 'same-origin' });\n          if (response.ok) {\n            return response.arrayBuffer();\n          }\n          throw new Error(response.status + ' : ' + response.url);\n        };\n      }\n    } else {\n    }\n    var out = console.log.bind(console);\n    var err = console.error.bind(console);\n    Object.assign(Module, moduleOverrides);\n    moduleOverrides = null;\n    var wasmBinary;\n    var wasmMemory;\n    var ABORT = false;\n    var EXITSTATUS;\n    var HEAP8,\n      HEAPU8,\n      HEAP16,\n      HEAPU16,\n      HEAP32,\n      HEAPU32,\n      HEAPF32,\n      HEAP64,\n      HEAPU64,\n      HEAPF64;\n    var runtimeInitialized = false;\n    function updateMemoryViews() {\n      var b = wasmMemory.buffer;\n      Module['HEAP8'] = HEAP8 = new Int8Array(b);\n      HEAP16 = new Int16Array(b);\n      HEAPU8 = new Uint8Array(b);\n      HEAPU16 = new Uint16Array(b);\n      HEAP32 = new Int32Array(b);\n      HEAPU32 = new Uint32Array(b);\n      HEAPF32 = new Float32Array(b);\n      HEAPF64 = new Float64Array(b);\n      HEAP64 = new BigInt64Array(b);\n      HEAPU64 = new BigUint64Array(b);\n    }\n    function preRun() {}\n    function initRuntime() {\n      runtimeInitialized = true;\n      wasmExports['e']();\n    }\n    function preMain() {}\n    function postRun() {}\n    var runDependencies = 0;\n    var dependenciesFulfilled = null;\n    function addRunDependency(id) {\n      runDependencies++;\n    }\n    function removeRunDependency(id) {\n      runDependencies--;\n      if (runDependencies == 0) {\n        if (dependenciesFulfilled) {\n          var callback = dependenciesFulfilled;\n          dependenciesFulfilled = null;\n          callback();\n        }\n      }\n    }\n    function abort(what) {\n      what = 'Aborted(' + what + ')';\n      err(what);\n      ABORT = true;\n      what += '. Build with -sASSERTIONS for more info.';\n      var e = new WebAssembly.RuntimeError(what);\n      readyPromiseReject(e);\n      throw e;\n    }\n    var wasmBinaryFile =\n      'data:application/octet-stream;base64,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QQEhA0EBIQQgAiIFIQ8DQEHYMSgCACEBAkAgAyAETwRAIBBBAnQhBiAQQQFqIRAgDyABIAZqKAIAIgpuIg8hBiAKIAQiB2whBAwBCyAFIAEgDkEBayIOQQJ0aigCACIKbiIFIQcgCiADIgZsIQMLAkAgCkECSQ0AIABB/DEoAgAiAUYNAEEBIQJBASAAIAFrQQN1IgEgAUEBTRshEgNAIAIgB2whEyACIAZsIRRBACEBA0AgFEH8MSgCACIMIAFBA3RqKQIAIhmnaiELIBMgGUIgiKdqIRECQEGEMigCACIIIABNBEAgACAMayIAQQN1IhVBAWoiCUH/////AUsNCCAAQf////8BIAggDGsiCEECdSINIAkgCSANSRsgCEH4////B08bIgkEfyAJQf////8BSw0IIAlBA3QQBAVBAAsiDWoiCCALrSARrUIghoQ3AgAgCCAVQQN0ayELIAAEQCALIAwgAPwKAAALQYQyIA0gCUEDdGo2AgBBgDIgCEEIaiIANgIAQfwxIAs2AgAgDBADDAELIAAgC60gEa1CIIaENwIAIABBCGohAAtBgDIgADYCACABQQFqIgEgEkcNAAsgAkEBaiICIApHDQALQcgxKAIAIQILIAMgBGwgAkkNAAsLDAILEAgACxAFAAtByDEoAgAFIAILGguDBwEGf0HoMigCACIDQeAyKAIAIgJrQRxtIABPBEACQEHkMigCACACa0EcbSIFIAAgACAFSxsiBEUNAAJAIARBA3EiBkUEQCAEIQMMAQsgBCEDA0AgAiABKQIANwIAIAIgASgCGDYCGCACIAEpAhA3AhAgAiABKQIINwIIIANBAWshAyACQRxqIQIgB0EBaiIHIAZHDQALCyAEQQRJDQADQCACIAEpAgA3AgAgAiABKAIYNgIYIAIgASkCEDcCECACIAEpAgg3AgggAiABKAIYNgI0IAIgASkCEDcCLCACIAEpAgg3AiQgAiABKQIANwIcIAIgASgCGDYCUCACIAEpAhA3AkggAkFAayABKQIINwIAIAIgASkCADcCOCACIAEpAgA3AlQgAiABKQIINwJcIAIgASkCEDcCZCACIAEoAhg2AmwgAkHwAGohAiADQQRrIgMNAAsLIAAgBUsEQEHkMigCACICIAAgBWtBHGxqIQADQCACIAEpAgA3AgAgAiABKAIYNgIYIAIgASkCEDcCECACIAEpAgg3AgggAkEcaiICIABHDQALQeQyIAA2AgAPC0HkMkHgMigCACAAQRxsajYCAA8LIAIEQEHkMiACNgIAIAIQA0HoMkEANgIAQeAyQgA3AgBBACEDCwJAIABByqSSyQBPDQBByaSSyQAgA0EcbSIDQQF0IgQgACAAIARJGyADQaSSySRPGyIDQcqkkskATw0AQeQyIANBHGwiAxAEIgQ2AgBB4DIgBDYCAEHoMiADIARqNgIAIAQhAiAAQRxsIgBBHGsiBUEcbiIDQQNxQQNHBEAgA0EBakEDcSEGQQAhAwNAIAIgASkCADcCACACIAEoAhg2AhggAiABKQIQNwIQIAIgASkCCDcCCCACQRxqIQIgA0EBaiIDIAZHDQALCyAAIARqIQAgBUHUAE8EQANAIAIgASkCADcCACACIAEoAhg2AhggAiABKQIQNwIQIAIgASkCCDcCCCACIAEoAhg2AjQgAiABKQIQNwIsIAIgASkCCDcCJCACIAEpAgA3AhwgAiABKAIYNgJQIAIgASkCEDcCSCACQUBrIAEpAgg3AgAgAiABKQIANwI4IAIgASkCADcCVCACIAEpAgg3AlwgAiABKQIQNwJkIAIgASgCGDYCbCACQfAAaiICIABHDQALC0HkMiAANgIADwsQBQAL3QQCBn8BfkGUMSgCACIDQYwxKAIAIgJrQQN1IABPBEACQEGQMSgCACACa0EDdSIFIAAgACAFSxsiBEUNAAJAIARBB3EiBkUEQCAEIQMMAQsgBCEDA0AgAiABKQIANwIAIANBAWshAyACQQhqIQIgB0EBaiIHIAZHDQALCyAEQQhJDQADQCACIAEpAgA3AgAgAiABKQIANwIIIAIgASkCADcCECACIAEpAgA3AhggAiABKQIANwIgIAIgASkCADcCKCACIAEpAgA3AjAgAiABKQIANwI4IAJBQGshAiADQQhrIgMNAAsLIAAgBUsEQEGQMSgCACICIAAgBWtBA3RqIQADQCACIAEpAgA3AgAgAkEIaiICIABHDQALQZAxIAA2AgAPC0GQMUGMMSgCACAAQQN0ajYCAA8LIAIEQEGQMSACNgIAIAIQA0GUMUEANgIAQYwxQgA3AgBBACEDCwJAIABBgICAgAJPDQBB/////wEgA0ECdSIEIAAgACAESRsgA0H4////B08b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AgALIANBAEoEQEEAIQIDQCASQZgwNgIgIBJBvDM2AiQgEiASKQIgNwMQIBIgEkEoajYCHCASIBJBLGo2AhggEiASKQIYNwMIIwBBEGsiDSQAQewwKAIAIgAgAiIQSARAA0BBACEHIwBBEGsiEyQAIBIoAhAiAigCSCEBIBIoAggoAgCyIABBAWoiFrKUIBIoAgwoAgCylRAZIRsgAigCsAIhACACIBsgAbKT/AAiBjYCsAICQCACLQDAAiAGIABrIhFBAEpyIg5BAXFFDQACfyACKAKoAkEATARAIAJBADoAwQJBAAwBC0EAIAZrIgxBACAMQQBKGyEEQQEgDCAMQQFMGyIAQfz///8HcSEPIABBA3EhFCACQYABaiEVIAJB/AFqIRggBkEATiEXA0ACQCAXDQAgAigClAIgAigCkAIgB2wgBmpqIQEgAigCtAIhCCACKAKcAiEJIAIoApgCIQpBACEFQQAhAEEAIQMgDEEDSgRAA0AgCCAAQQJ0aiAJIAogACABanFBAnRqKgIAOAIAIAggAEEBciILQQJ0aiAJIAogASALanFBAnRqKgIAOAIAIAggAEECciILQQJ0aiAJIAogASALanFBAnRqKgIAOAIAIAggAEEDciILQQJ0aiAJIAogASALanFBAnRqKgIAOAIAIABBBGohACADQQRqIgMgD0cNAAsLIBRFDQADQCAIIABBAnRqIAkgCiAAIAFqcUECdGoqAgA4AgAgAEEBaiEAIAVBAWoiBSAURw0ACwsCQCAEIAIoAkgiBU4NACASKAIUKAIAIAdBAnRqKAIAIAZBAnRqIQEgAigCtAIhCEEAIQMgBSAEIgBrQQNxIgkEQANAIAggAEECdCIKaiABIApqKgIAOAIAIABBAWohACADQQFqIgMgCUcNAAsLIAQgBWtBfEsNAANAIAggAEECdCIDaiABIANqKgIAOAIAIAggA0EEaiIJaiABIAlqKgIAOAIAIAggA0EIaiIJaiABIAlqKgIAOAIAIAggA0EMaiIDaiABIANqKgIAOAIAIABBBGoiACAFRw0ACwsgEyACKAJ0IAIoAnAgB2xBA3RqNgIIIAIoArABQQF0IQUCQCACKAKIAiIBQQBMDQAgAigC/AEgBSABa0ECdGohACACKALwASEJIAIoArQCIQpBACEIIAFBAUcEQCABQf7///8HcSEZQQAhAwNAIAAgCEECdCILaiAJIAtqKgIAIAogC2oqAgCMlDgCACAAIAtBBHIiC2ogCSALaioCACAKIAtqKgIAjJQ4AgAgCEECaiEIIANBAmoiAyAZRw0ACwsgAUEBcUUNACAAIAhBAnQiA2ogAyAJaioCACADIApqKgIAjJQ4AgALAkAgASAFTg0AIAFBAWohAyACKAL8ASEIIAIoAvABIQkgAigCtAIhCiABIgBBAXEEQCAIIAkgAEECdCIAaioCACAAIApqKgIAlDgCACADIQALIAMgBUYNAANAIAggACABa0ECdGogCSAAQQJ0IgNqKgIAIAMgCmoqAgCUOAIAIAggAEEBaiIDIAFrQQJ0aiAJIANBAnQiA2oqAgAgAyAKaioCAJQ4AgAgAEECaiIAIAVHDQALCyAVIBggE0EIahAdIAdBAWoiByACKAKoAiIDSA0ACyACQQA6AMECQQAgA0EATA0AGkEAIQFBASACKAKsAiIIQQBMDQAaA0BBACEAIAhBAEoEQCACKALIAiABIAhsQRxsaiEDIAIoAnQgAigCcCABbEEDdGohBANAIAMgAEEcbGogBCAAQQN0aikCADcCACAAQQFqIgAgAigCrAIiCEgNAAsgAigCqAIhAwsgAUEBaiIBIANIDQALIANBAEoLIAItAMACRSACKAJQIgEgEUZxDQBFDQBBACEHQQAgBiABayIUayIMQQAgDEEAShshBCACQYABaiEPIAJB/AFqIRUDQAJAIAIoAkgiASAMIAEgDEgbIgtBAEwNACACKAKUAiACKAKQAiAHbCAUamohCCACKAK0AiEGIAIoApwCIQkgAigCmAIhCkEAIQVBACEAIAtBBE8EQCALQfz///8HcSEYQQAhAwNAIAYgAEECdGogCSAKIAAgCGpxQQJ0aioCADgCACAGIABBAXIiF0ECdGogCSAKIAggF2pxQQJ0aioCADgCACAGIABBAnIiF0ECdGogCSAKIAggF2pxQQJ0aioCADgCACAGIABBA3IiF0ECdGogCSAKIAggF2pxQQJ0aioCADgCACAAQQRqIQAgA0EEaiIDIBhHDQALCyALQQNxIgNFDQADQCAGIABBAnRqIAkgCiAAIAhqcUECdGoqAgA4AgAgAEEBaiEAIAVBAWoiBSADRw0ACwsCQCABIARMDQAgEigCFCgCACAHQQJ0aigC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';\n    function getBinarySync(file) {\n      if (file == wasmBinaryFile && wasmBinary) {\n        return new Uint8Array(wasmBinary);\n      }\n      var binary = tryParseAsDataURI(file);\n      if (binary) {\n        return binary;\n      }\n      if (readBinary) {\n        return readBinary(file);\n      }\n      throw 'both async and sync fetching of the wasm failed';\n    }\n    async function getWasmBinary(binaryFile) {\n      return getBinarySync(binaryFile);\n    }\n    async function instantiateArrayBuffer(binaryFile, imports) {\n      try {\n        var binary = await getWasmBinary(binaryFile);\n        var instance = await WebAssembly.instantiate(binary, imports);\n        return instance;\n      } catch (reason) {\n        err(`failed to asynchronously prepare wasm: ${reason}`);\n        abort(reason);\n      }\n    }\n    async function instantiateAsync(binary, binaryFile, imports) {\n      return instantiateArrayBuffer(binaryFile, imports);\n    }\n    function getWasmImports() {\n      return { a: wasmImports };\n    }\n    async function createWasm() {\n      function receiveInstance(instance, module) {\n        wasmExports = instance.exports;\n        wasmMemory = wasmExports['d'];\n        updateMemoryViews();\n        removeRunDependency('wasm-instantiate');\n        return wasmExports;\n      }\n      addRunDependency('wasm-instantiate');\n      function receiveInstantiationResult(result) {\n        return receiveInstance(result['instance']);\n      }\n      var info = getWasmImports();\n      try {\n        var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info);\n        var exports = receiveInstantiationResult(result);\n        return exports;\n      } catch (e) {\n        readyPromiseReject(e);\n        return Promise.reject(e);\n      }\n    }\n    class ExitStatus {\n      name = 'ExitStatus';\n      constructor(status) {\n        this.message = `Program terminated with exit(${status})`;\n        this.status = status;\n      }\n    }\n    var base64Decode = (b64) => {\n      var b1,\n        b2,\n        i = 0,\n        j = 0,\n        bLength = b64.length;\n      var output = new Uint8Array(\n        ((bLength * 3) >> 2) -\n          (b64[bLength - 2] == '=') -\n          (b64[bLength - 1] == '=')\n      );\n      for (; i < bLength; i += 4, j += 3) {\n        b1 = base64ReverseLookup[b64.charCodeAt(i + 1)];\n        b2 = base64ReverseLookup[b64.charCodeAt(i + 2)];\n        output[j] = (base64ReverseLookup[b64.charCodeAt(i)] << 2) | (b1 >> 4);\n        output[j + 1] = (b1 << 4) | (b2 >> 2);\n        output[j + 2] = (b2 << 6) | base64ReverseLookup[b64.charCodeAt(i + 3)];\n      }\n      return output;\n    };\n    var isDataURI = (filename) => filename.startsWith(dataURIPrefix);\n    var dataURIPrefix = 'data:application/octet-stream;base64,';\n    var tryParseAsDataURI = (filename) => {\n      if (isDataURI(filename)) {\n        return base64Decode(filename.slice(dataURIPrefix.length));\n      }\n    };\n    var __abort_js = () => abort('');\n    var getHeapMax = () => 2147483648;\n    var alignMemory = (size, alignment) =>\n      Math.ceil(size / alignment) * alignment;\n    var abortOnCannotGrowMemory = (requestedSize) => {\n      abort('OOM');\n    };\n    var growMemory = (size) => {\n      var b = wasmMemory.buffer;\n      var pages = ((size - b.byteLength + 65535) / 65536) | 0;\n      try {\n        wasmMemory.grow(pages);\n        updateMemoryViews();\n        return 1;\n      } catch (e) {}\n    };\n    var _emscripten_resize_heap = (requestedSize) => {\n      var oldSize = HEAPU8.length;\n      requestedSize >>>= 0;\n      var maxHeapSize = getHeapMax();\n      if (requestedSize > maxHeapSize) {\n        abortOnCannotGrowMemory(requestedSize);\n      }\n      for (var cutDown = 1; cutDown <= 4; cutDown *= 2) {\n        var overGrownHeapSize = oldSize * (1 + 0.5 / cutDown);\n        overGrownHeapSize = Math.min(\n          overGrownHeapSize,\n          requestedSize + 100663296\n        );\n        var newSize = Math.min(\n          maxHeapSize,\n          alignMemory(Math.max(requestedSize, overGrownHeapSize), 65536)\n        );\n        var replacement = growMemory(newSize);\n        if (replacement) {\n          return true;\n        }\n      }\n      abortOnCannotGrowMemory(requestedSize);\n    };\n    var initRandomFill = () => (view) => crypto.getRandomValues(view);\n    var randomFill = (view) => {\n      (randomFill = initRandomFill())(view);\n    };\n    var _random_get = (buffer, size) => {\n      randomFill(HEAPU8.subarray(buffer, buffer + size));\n      return 0;\n    };\n    var keepRuntimeAlive = () => true;\n    var _proc_exit = (code) => {\n      EXITSTATUS = code;\n      if (!keepRuntimeAlive()) {\n        ABORT = true;\n      }\n      quit_(code, new ExitStatus(code));\n    };\n    var exitJS = (status, implicit) => {\n      EXITSTATUS = status;\n      _proc_exit(status);\n    };\n    var handleException = (e) => {\n      if (e instanceof ExitStatus || e == 'unwind') {\n        return EXITSTATUS;\n      }\n      quit_(1, e);\n    };\n    var UTF8Decoder =\n      typeof TextDecoder != 'undefined' ? new TextDecoder() : undefined;\n    var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead = NaN) => {\n      var endIdx = idx + maxBytesToRead;\n      var endPtr = idx;\n      while (heapOrArray[endPtr] && !(endPtr >= endIdx)) ++endPtr;\n      if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) {\n        return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr));\n      }\n      var str = '';\n      while (idx < endPtr) {\n        var u0 = heapOrArray[idx++];\n        if (!(u0 & 128)) {\n          str += String.fromCharCode(u0);\n          continue;\n        }\n        var u1 = heapOrArray[idx++] & 63;\n        if ((u0 & 224) == 192) {\n          str += String.fromCharCode(((u0 & 31) << 6) | u1);\n          continue;\n        }\n        var u2 = heapOrArray[idx++] & 63;\n        if ((u0 & 240) == 224) {\n          u0 = ((u0 & 15) << 12) | (u1 << 6) | u2;\n        } else {\n          u0 =\n            ((u0 & 7) << 18) |\n            (u1 << 12) |\n            (u2 << 6) |\n            (heapOrArray[idx++] & 63);\n        }\n        if (u0 < 65536) {\n          str += String.fromCharCode(u0);\n        } else {\n          var ch = u0 - 65536;\n          str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023));\n        }\n      }\n      return str;\n    };\n    var UTF8ToString = (ptr, maxBytesToRead) =>\n      ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : '';\n    for (var base64ReverseLookup = new Uint8Array(123), i = 25; i >= 0; --i) {\n      base64ReverseLookup[48 + i] = 52 + i;\n      base64ReverseLookup[65 + i] = i;\n      base64ReverseLookup[97 + i] = 26 + i;\n    }\n    base64ReverseLookup[43] = 62;\n    base64ReverseLookup[47] = 63;\n    var wasmImports = {\n      c: __abort_js,\n      b: _emscripten_resize_heap,\n      a: _random_get,\n    };\n    var wasmExports = await createWasm();\n    var ___wasm_call_ctors = wasmExports['e'];\n    var _setBuffers = (Module['_setBuffers'] = wasmExports['g']);\n    var _blockSamples = (Module['_blockSamples'] = wasmExports['h']);\n    var _intervalSamples = (Module['_intervalSamples'] = wasmExports['i']);\n    var _inputLatency = (Module['_inputLatency'] = wasmExports['j']);\n    var _outputLatency = (Module['_outputLatency'] = wasmExports['k']);\n    var _reset = (Module['_reset'] = wasmExports['l']);\n    var _presetDefault = (Module['_presetDefault'] = wasmExports['m']);\n    var _presetCheaper = (Module['_presetCheaper'] = wasmExports['n']);\n    var _configure = (Module['_configure'] = wasmExports['o']);\n    var _setTransposeFactor = (Module['_setTransposeFactor'] =\n      wasmExports['p']);\n    var _setTransposeSemitones = (Module['_setTransposeSemitones'] =\n      wasmExports['q']);\n    var _seek = (Module['_seek'] = wasmExports['r']);\n    var _process = (Module['_process'] = wasmExports['s']);\n    var _flush = (Module['_flush'] = wasmExports['t']);\n    var _main = (Module['_main'] = wasmExports['u']);\n    Module['UTF8ToString'] = UTF8ToString;\n    function callMain() {\n      var entryFunction = _main;\n      var argc = 0;\n      var argv = 0;\n      try {\n        var ret = entryFunction(argc, argv);\n        exitJS(ret, true);\n        return ret;\n      } catch (e) {\n        return handleException(e);\n      }\n    }\n    function run() {\n      if (runDependencies > 0) {\n        dependenciesFulfilled = run;\n        return;\n      }\n      preRun();\n      if (runDependencies > 0) {\n        dependenciesFulfilled = run;\n        return;\n      }\n      function doRun() {\n        Module['calledRun'] = true;\n        if (ABORT) return;\n        initRuntime();\n        preMain();\n        readyPromiseResolve(Module);\n        var noInitialRun;\n        if (!noInitialRun) callMain();\n        postRun();\n      }\n      {\n        doRun();\n      }\n    }\n    run();\n    moduleRtn = readyPromise;\n\n    return moduleRtn;\n  };\n})();\nfunction registerWorkletProcessor(Module, audioNodeKey) {\n  class WasmProcessor extends AudioWorkletProcessor {\n    constructor(options) {\n      super(options);\n      this.wasmReady = false;\n      this.wasmModule = null;\n      this.channels = 0;\n      this.buffersIn = [];\n      this.buffersOut = [];\n\n      this.audioBuffers = []; // list of (multi-channel) audio buffers\n      this.audioBuffersStart = 0; // time-stamp for the first audio buffer\n      this.audioBuffersEnd = 0; // just to be helpful\n\n      this.timeIntervalSamples = sampleRate * 0.1;\n      this.timeIntervalCounter = 0;\n\n      this.timeMap = [\n        {\n          active: false,\n          input: 0,\n          output: 0,\n          rate: 1,\n          semitones: 0,\n          loopStart: 0,\n          loopEnd: 0,\n        },\n      ];\n\n      let remoteMethods = {\n        configure: (config) => {\n          let blockChanged =\n            config.blockMs != this.config.blockMs ||\n            config.intervalMs != this.config.intervalMs;\n          Object.assign(this.config, config);\n          if (config.blockMs && blockChanged) this.configure();\n        },\n        setUpdateInterval: (seconds) => {\n          this.timeIntervalSamples = sampleRate * seconds;\n        },\n        stop: (when) => {\n          if (typeof when !== 'number') when = currentTime;\n          return remoteMethods.schedule({ active: false, output: when });\n        },\n        start: (when, offset, duration, rate, semitones) => {\n          if (typeof when === 'object') {\n            if (!('active' in when)) when.active = true;\n            return remoteMethods.schedule(when);\n          }\n\n          let obj = {\n            active: true,\n            input: 0,\n            output: currentTime + this.outputLatencySeconds,\n          };\n          if (typeof when === 'number') obj.output = when;\n          if (typeof offset === 'number') obj.input = offset;\n          if (typeof rate === 'number') obj.rate = rate;\n          if (typeof semitones === 'number') obj.semitones = semitones;\n          let result = remoteMethods.schedule(obj);\n          if (typeof duration === 'number') {\n            remoteMethods.stop(obj.output + duration);\n            obj.output += duration;\n            obj.active = false;\n            remoteMethods.schedule(obj);\n          }\n          return result;\n        },\n        schedule: (objIn, adjustPrevious) => {\n          let outputTime = 'output' in objIn ? objIn.output : currentTime;\n\n          let latestSegment = this.timeMap[this.timeMap.length - 1];\n          while (\n            this.timeMap.length &&\n            this.timeMap[this.timeMap.length - 1].output >= outputTime\n          ) {\n            latestSegment = this.timeMap.pop();\n          }\n\n          let obj = {\n            active: latestSegment.active,\n            input: null,\n            rate: latestSegment.rate,\n            semitones: latestSegment.semitones,\n            loopStart: latestSegment.loopStart,\n            loopEnd: latestSegment.loopEnd,\n          };\n\n          Object.assign(obj, objIn);\n          obj.output = outputTime;\n\n          if (obj.input === null) {\n            let rate = latestSegment.active ? latestSegment.rate : 0;\n            obj.input =\n              latestSegment.input + (obj.output - latestSegment.output) * rate;\n          }\n          this.timeMap.push(obj);\n\n          if (adjustPrevious && this.timeMap.length > 1) {\n            let previous = this.timeMap[this.timeMap.length - 2];\n            if (previous.output < currentTime) {\n              let rate = previous.active ? previous.rate : 0;\n              previous.input += (currentTime - previous.output) * rate;\n              previous.output = currentTime;\n            }\n            previous.rate =\n              (obj.input - previous.input) / (obj.output - previous.output);\n          }\n\n          let currentMapSegment = this.timeMap[0];\n          while (\n            this.timeMap.length > 1 &&\n            this.timeMap[1].output <= outputTime\n          ) {\n            this.timeMap.shift();\n            currentMapSegment = this.timeMap[0];\n          }\n          let rate = currentMapSegment.active ? currentMapSegment.rate : 0;\n          let inputTime =\n            currentMapSegment.input +\n            (outputTime - currentMapSegment.output) * rate;\n          this.timeIntervalCounter = this.timeIntervalSamples;\n          this.port.postMessage(['time', inputTime]);\n\n          return obj;\n        },\n        dropBuffers: (toSeconds) => {\n          if (typeof toSeconds !== 'number') {\n            let buffers = this.audioBuffers.flat(1).map((b) => b.buffer);\n            this.audioBuffers = [];\n            this.audioBuffersStart = this.audioBuffersEnd = 0;\n            return {\n              value: { start: 0, end: 0 },\n              transfer: buffers,\n            };\n          }\n          let transfer = [];\n          while (this.audioBuffers.length) {\n            let first = this.audioBuffers[0];\n            let length = first[0].length;\n            let endSamples = this.audioBuffersStart + length;\n            let endSeconds = endSamples / sampleRate;\n            if (endSeconds > toSeconds) break;\n\n            this.audioBuffers.shift().forEach((b) => transfer.push(b.buffer));\n            this.audioBuffersStart += length;\n          }\n          return {\n            value: {\n              start: this.audioBuffersStart / sampleRate,\n              end: this.audioBuffersEnd / sampleRate,\n            },\n            transfer: transfer,\n          };\n        },\n        addBuffers: (sampleBuffers) => {\n          sampleBuffers = [].concat(sampleBuffers);\n          this.audioBuffers.push(sampleBuffers);\n          let length = sampleBuffers[0].length;\n          this.audioBuffersEnd += length;\n          return this.audioBuffersEnd / sampleRate;\n        },\n      };\n\n      let pendingMessages = [];\n      this.port.onmessage = (event) => pendingMessages.push(event);\n\n      Module().then((wasmModule) => {\n        this.wasmModule = wasmModule;\n        this.wasmReady = true;\n\n        wasmModule._main();\n\n        this.channels = options.numberOfOutputs\n          ? options.outputChannelCount[0]\n          : 2; // stereo by default\n        this.configure();\n\n        this.port.onmessage = (event) => {\n          let data = event.data;\n          let messageId = data.shift();\n          let method = data.shift();\n          let result = remoteMethods[method](...data);\n          if (result?.transfer) {\n            this.port.postMessage([messageId, result.value], result.transfer);\n          } else {\n            this.port.postMessage([messageId, result]);\n          }\n        };\n        let methodArgCounts = {};\n        for (let key in remoteMethods) {\n          methodArgCounts[key] = remoteMethods[key].length;\n        }\n        this.port.postMessage(['ready', methodArgCounts]);\n        pendingMessages.forEach(this.port.onmessage);\n        pendingMessages = null;\n      });\n    }\n\n    config = {\n      tonalityHz: 8000,\n    };\n    configure() {\n      if (this.config.blockMs) {\n        let blockSamples = Math.round(\n          (this.config.blockMs / 1000) * sampleRate\n        );\n        let intervalSamples = Math.round(\n          ((this.config.intervalMs || this.config.blockMs * 0.25) / 1000) *\n            sampleRate\n        );\n        this.wasmModule._configure(\n          this.channels,\n          blockSamples,\n          intervalSamples\n        );\n        this.wasmModule._reset();\n      } else {\n        this.wasmModule._presetDefault(this.channels, sampleRate);\n      }\n      this.updateBuffers();\n      this.inputLatencySeconds = this.wasmModule._inputLatency() / sampleRate;\n      this.outputLatencySeconds = this.wasmModule._outputLatency() / sampleRate;\n    }\n\n    updateBuffers() {\n      let wasmModule = this.wasmModule;\n      // longer than one STFT block, so we can seek smoothly\n      this.bufferLength =\n        wasmModule._inputLatency() + wasmModule._outputLatency();\n\n      let lengthBytes = this.bufferLength * 4;\n      let bufferPointer = wasmModule._setBuffers(\n        this.channels,\n        this.bufferLength\n      );\n      this.buffersIn = [];\n      this.buffersOut = [];\n      for (let c = 0; c < this.channels; ++c) {\n        this.buffersIn.push(bufferPointer + lengthBytes * c);\n        this.buffersOut.push(bufferPointer + lengthBytes * (c + this.channels));\n      }\n    }\n\n    process(inputList, outputList, parameters) {\n      if (!this.wasmReady) {\n        outputList.forEach((output) => {\n          output.forEach((channel) => {\n            channel.fill(0);\n          });\n        });\n        return true;\n      }\n      if (!outputList[0]?.length) return false;\n\n      let outputTime = currentTime + this.outputLatencySeconds;\n      while (this.timeMap.length > 1 && this.timeMap[1].output <= outputTime) {\n        this.timeMap.shift();\n      }\n      let currentMapSegment = this.timeMap[0];\n\n      let wasmModule = this.wasmModule;\n      wasmModule._setTransposeSemitones(\n        currentMapSegment.semitones,\n        this.config.tonalityHz / sampleRate\n      );\n\n      // Check the input/output channel counts\n      if (outputList[0].length != this.channels) {\n        this.channels = outputList[0]?.length || 0;\n        configure();\n      }\n      let outputBlockSize = outputList[0][0].length;\n\n      let memory = wasmModule.exports\n        ? wasmModule.exports.memory.buffer\n        : wasmModule.HEAP8.buffer;\n      // Buffer list (one per channel)\n      let inputs = inputList[0];\n      if (!currentMapSegment.active) {\n        outputList[0].forEach((_, c) => {\n          let channelBuffer = inputs[c % inputs.length];\n          let buffer = new Float32Array(\n            memory,\n            this.buffersIn[c],\n            outputBlockSize\n          );\n          buffer.fill(0);\n        });\n        // Should detect silent input and skip processing\n        wasmModule._process(outputBlockSize, outputBlockSize);\n      } else if (inputs?.length) {\n        // Live input\n        outputList[0].forEach((_, c) => {\n          let channelBuffer = inputs[c % inputs.length];\n          let buffer = new Float32Array(\n            memory,\n            this.buffersIn[c],\n            outputBlockSize\n          );\n          if (channelBuffer) {\n            buffer.set(channelBuffer);\n          } else {\n            buffer.fill(0);\n          }\n        });\n        wasmModule._process(outputBlockSize, outputBlockSize);\n      } else {\n        let inputTime =\n          currentMapSegment.input +\n          (outputTime - currentMapSegment.output) * currentMapSegment.rate;\n        let loopLength =\n          currentMapSegment.loopEnd - currentMapSegment.loopStart;\n        if (loopLength > 0 && inputTime >= currentMapSegment.loopEnd) {\n          currentMapSegment.input -= loopLength;\n          inputTime -= loopLength;\n        }\n\n        inputTime += this.inputLatencySeconds;\n        let inputSamplesEnd = Math.round(inputTime * sampleRate);\n\n        // Fill the buffer with previous input\n        let buffers = outputList[0].map(\n          (_, c) =>\n            new Float32Array(memory, this.buffersIn[c], this.bufferLength)\n        );\n\n        let blockSamples = 0; // current write position in the temporary input buffer\n        let audioBufferIndex = 0;\n        let audioSamples = this.audioBuffersStart; // start of current audio buffer\n        // zero-pad until the start of the audio data\n        let inputSamples = inputSamplesEnd - this.bufferLength;\n        if (inputSamples < audioSamples) {\n          blockSamples = audioSamples - inputSamples;\n          buffers.forEach((b) => b.fill(0, 0, blockSamples));\n          inputSamples = audioSamples;\n        }\n        while (\n          audioBufferIndex < this.audioBuffers.length &&\n          audioSamples < inputSamplesEnd\n        ) {\n          let audioBuffer = this.audioBuffers[audioBufferIndex];\n          let startIndex = inputSamples - audioSamples; // start index within the audio buffer\n          let bufferEnd = audioSamples + audioBuffer[0].length;\n          // how many samples to copy: min(how many left in the buffer, how many more we need)\n          let count = Math.min(\n            audioBuffer[0].length - startIndex,\n            inputSamplesEnd - inputSamples\n          );\n          if (count > 0) {\n            buffers.forEach((buffer, c) => {\n              let channelBuffer = audioBuffer[c % audioBuffer.length];\n              buffer\n                .subarray(blockSamples)\n                .set(channelBuffer.subarray(startIndex, startIndex + count));\n            });\n            audioSamples += count;\n            blockSamples += count;\n          } else {\n            // we're already past this buffer - skip it\n            audioSamples += audioBuffer[0].length;\n          }\n          ++audioBufferIndex;\n        }\n        if (blockSamples < this.bufferLength) {\n          buffers.forEach((buffer) => buffer.subarray(blockSamples).fill(0));\n        }\n\n        // constantly seeking, so we don't have to worry about the input buffers needing to be a rate-dependent size\n        wasmModule._seek(this.bufferLength, currentMapSegment.rate);\n        wasmModule._process(0, outputBlockSize);\n\n        this.timeIntervalCounter -= outputBlockSize;\n        if (this.timeIntervalCounter <= 0) {\n          this.timeIntervalCounter = this.timeIntervalSamples;\n          this.port.postMessage(['time', inputTime]);\n        }\n      }\n\n      // Re-fetch in case the memory changed (even though there *shouldn't* be any allocations)\n      memory = wasmModule.exports\n        ? wasmModule.exports.memory.buffer\n        : wasmModule.HEAP8.buffer;\n      outputList[0].forEach((channelBuffer, c) => {\n        let buffer = new Float32Array(\n          memory,\n          this.buffersOut[c],\n          outputBlockSize\n        );\n        channelBuffer.set(buffer);\n      });\n\n      return true;\n    }\n  }\n\n  registerProcessor(audioNodeKey, WasmProcessor);\n}\n\n/**\n\tCreates a Stretch node\n\t@async\n\t@function SignalsmithStretch\n\t@param {AudioContext} audioContext\n\t@param {Object} options - channel configuration (as per [options]{@link https://developer.mozilla.org/en-US/docs/Web/API/AudioWorkletNode/AudioWorkletNode#options})\n\t@returns {Promise<StretchNode>}\n*/\nSignalsmithStretch = ((Module, audioNodeKey) => {\n  if (\n    typeof AudioWorkletProcessor === 'function' &&\n    typeof registerProcessor === 'function'\n  ) {\n    // AudioWorklet side\n    registerWorkletProcessor(Module, audioNodeKey);\n    return {};\n  }\n  let promiseKey = Symbol();\n  let createNode = async function (audioContext, options) {\n    /**\n\t\t\t@classdesc An `AudioWorkletNode` with Signalsmith Stretch extensions\n\t\t\t@name StretchNode\n\t\t\t@augments AudioWorkletNode\n\t\t\t@property {number} inputTime - the current playback (in seconds) within the input audio stored by the node\n\t\t */\n    let audioNode;\n    options = options || {\n      numberOfInputs: 1,\n      numberOfOutputs: 1,\n      outputChannelCount: [2],\n    };\n    try {\n      audioNode = new AudioWorkletNode(audioContext, audioNodeKey, options);\n    } catch (e) {\n      if (!audioContext[promiseKey]) {\n        let moduleUrl = createNode.moduleUrl;\n        if (!moduleUrl) {\n          let moduleCode = `(${registerWorkletProcessor})((_scriptName=>${Module})(),${JSON.stringify(audioNodeKey)})`;\n          moduleUrl = URL.createObjectURL(\n            new Blob([moduleCode], { type: 'text/javascript' })\n          );\n        }\n        audioContext[promiseKey] =\n          audioContext.audioWorklet.addModule(moduleUrl);\n      }\n      await audioContext[promiseKey];\n      audioNode = new AudioWorkletNode(audioContext, audioNodeKey, options);\n    }\n\n    // messages with Promise responses\n    let requestMap = {};\n    let idCounter = 0;\n    let timeUpdateCallback = null;\n    let post = (transfer, ...data) => {\n      let id = idCounter++;\n      return new Promise((resolve) => {\n        requestMap[id] = resolve;\n        audioNode.port.postMessage([id].concat(data), transfer);\n      });\n    };\n    audioNode.inputTime = 0;\n    audioNode.port.onmessage = (event) => {\n      let data = event.data;\n      let id = data[0],\n        value = data[1];\n      if (id == 'time') {\n        audioNode.inputTime = value;\n        if (timeUpdateCallback) timeUpdateCallback(value);\n      }\n      if (id in requestMap) {\n        requestMap[id](value);\n        delete requestMap[id];\n      }\n    };\n\n    return new Promise((resolve) => {\n      requestMap['ready'] = (remoteMethodKeys) => {\n        Object.keys(remoteMethodKeys).forEach((key) => {\n          let argCount = remoteMethodKeys[key];\n          audioNode[key] = (...args) => {\n            let transfer = null;\n            if (args.length > argCount) {\n              transfer = args.pop();\n            }\n            return post(transfer, key, ...args);\n          };\n        });\n        /** @lends StretchNode.prototype\n\t\t\t\t\t@method setUpdateInterval\n\t\t\t\t*/\n        audioNode.setUpdateInterval = (seconds, callback) => {\n          timeUpdateCallback = callback;\n          return post(null, 'setUpdateInterval', seconds);\n        };\n        resolve(audioNode);\n      };\n    });\n  };\n  return createNode;\n})(SignalsmithStretch, 'signalsmith-stretch');\n// register as a CommonJS/AMD module\nif (typeof exports === 'object' && typeof module === 'object') {\n  module.exports = SignalsmithStretch;\n} else if (typeof define === 'function' && define['amd']) {\n  define([], () => SignalsmithStretch);\n}\nlet _export = SignalsmithStretch;\nexport default _export;\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-system/AudioManager.ts",
    "content": "import type { IAudioManager, PermissionStatus } from '../system/types';\n\nconst mockAsync =\n  <T>(value: T) =>\n  () =>\n    Promise.resolve(value);\nconst mockSync =\n  <T>(value: T) =>\n  () =>\n    value;\n\nclass AudioManager implements IAudioManager {\n  getDevicePreferredSampleRate = mockSync(44100);\n  setAudioSessionActivity = mockAsync(true);\n  setAudioSessionOptions = mockSync({});\n  disableSessionManagement = mockSync({});\n  observeAudioInterruptions = mockSync(true);\n  activelyReclaimSession = mockSync({});\n  observeVolumeChanges = mockSync({});\n  addSystemEventListener = mockSync(undefined);\n  requestRecordingPermissions = mockAsync('Granted' as PermissionStatus);\n  checkRecordingPermissions = mockAsync('Granted' as PermissionStatus);\n  requestNotificationPermissions = mockAsync('Granted' as PermissionStatus);\n  checkNotificationPermissions = mockAsync('Granted' as PermissionStatus);\n  setInputDevice = mockAsync(true);\n  getDevicesInfo = mockAsync({\n    availableInputs: [],\n    availableOutputs: [],\n    currentInputs: [],\n    currentOutputs: [],\n  });\n}\n\nexport default new AudioManager();\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-system/index.ts",
    "content": "export * from './notification';\nexport { default as AudioManager } from './AudioManager';\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-system/notification/PlaybackNotificationManager.ts",
    "content": "/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable no-useless-constructor */\n/* eslint-disable @typescript-eslint/require-await */\n\nimport type { AudioEventSubscription } from '../../events';\nimport type {\n  NotificationEvents,\n  NotificationManager,\n  PlaybackControlName,\n  PlaybackNotificationEventName,\n  PlaybackNotificationInfo,\n} from '../../system';\n\n/// Mock Manager for playback notifications. Does nothing.\nclass PlaybackNotificationManager implements NotificationManager<\n  PlaybackNotificationInfo,\n  PlaybackNotificationEventName\n> {\n  private isRegistered_ = false;\n  private isShown_ = false;\n\n  constructor() {}\n\n  async register(): Promise<void> {}\n\n  async show(info: PlaybackNotificationInfo): Promise<void> {}\n\n  async update(info: PlaybackNotificationInfo): Promise<void> {}\n\n  async hide(): Promise<void> {}\n\n  async unregister(): Promise<void> {}\n\n  async enableControl(\n    control: PlaybackControlName,\n    enabled: boolean\n  ): Promise<void> {}\n\n  async isActive(): Promise<boolean> {\n    return this.isShown_;\n  }\n\n  isRegistered(): boolean {\n    return this.isRegistered_;\n  }\n\n  addEventListener<T extends PlaybackNotificationEventName>(\n    eventName: T,\n    callback: (event: NotificationEvents[T]) => void\n  ): AudioEventSubscription {\n    // dummy subscription object with a no-op remove method\n    return {\n      remove: () => {},\n    } as unknown as AudioEventSubscription;\n  }\n}\n\nexport default new PlaybackNotificationManager();\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-system/notification/RecordingNotificationManager.ts",
    "content": "/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable no-useless-constructor */\n/* eslint-disable @typescript-eslint/require-await */\n\nimport type { AudioEventSubscription } from '../../events';\nimport type {\n  NotificationEvents,\n  NotificationManager,\n  RecordingNotificationEventName,\n  RecordingNotificationInfo,\n} from '../../system';\n\n/// Mock Manager for playback notifications. Does nothing.\nclass RecordingNotificationManager implements NotificationManager<\n  RecordingNotificationInfo,\n  RecordingNotificationEventName\n> {\n  private isRegistered_ = false;\n  private isShown_ = false;\n\n  constructor() {}\n\n  async show(info: RecordingNotificationInfo): Promise<void> {}\n\n  async hide(): Promise<void> {}\n\n  async isActive(): Promise<boolean> {\n    return this.isShown_;\n  }\n\n  isRegistered(): boolean {\n    return this.isRegistered_;\n  }\n\n  addEventListener<T extends RecordingNotificationEventName>(\n    eventName: T,\n    callback: (event: NotificationEvents[T]) => void\n  ): AudioEventSubscription {\n    // dummy subscription object with a no-op remove method\n    return {\n      remove: () => {},\n    } as unknown as AudioEventSubscription;\n  }\n}\n\nexport default new RecordingNotificationManager();\n"
  },
  {
    "path": "packages/react-native-audio-api/src/web-system/notification/index.ts",
    "content": "export { default as PlaybackNotificationManager } from './PlaybackNotificationManager';\nexport { default as RecordingNotificationManager } from './RecordingNotificationManager';\n"
  },
  {
    "path": "packages/react-native-audio-api/tests/CLAUDE.md",
    "content": "# tests/ — JS/TS Test Suite\n\n<!-- Content to be written by hand -->\n"
  },
  {
    "path": "packages/react-native-audio-api/tests/integration.test.ts",
    "content": "/* eslint-disable */\n\nimport * as MockAPI from '../src/mock';\n\ndescribe('Mock Integration Tests', () => {\n  describe('Audio Graph Creation', () => {\n    it('should create a complete audio graph with oscillator, gain, and destination', () => {\n      const context = new MockAPI.AudioContext();\n\n      // Create nodes\n      const oscillator = context.createOscillator();\n      const gainNode = context.createGain();\n\n      // Configure oscillator\n      oscillator.type = 'sine';\n      oscillator.frequency.value = 440;\n\n      // Configure gain\n      gainNode.gain.value = 0.5;\n\n      // Connect the graph\n      oscillator.connect(gainNode);\n      gainNode.connect(context.destination);\n\n      // Verify the setup\n      expect(oscillator.type).toBe('sine');\n      expect(oscillator.frequency.value).toBe(440);\n      expect(gainNode.gain.value).toBe(0.5);\n      expect(context.destination.numberOfOutputs).toBe(0);\n    });\n\n    it('should create an audio graph with effects chain', () => {\n      const context = new MockAPI.AudioContext();\n\n      const oscillator = context.createOscillator();\n      const filter = context.createBiquadFilter();\n      const delay = context.createDelay();\n      const gainNode = context.createGain();\n\n      // Configure effects\n      filter.type = 'lowpass';\n      filter.frequency.value = 2000;\n      delay.delayTime.value = 0.3;\n      gainNode.gain.value = 0.8;\n\n      // Create effects chain\n      oscillator.connect(filter);\n      filter.connect(delay);\n      delay.connect(gainNode);\n      gainNode.connect(context.destination);\n\n      expect(filter.type).toBe('lowpass');\n      expect(delay.delayTime.value).toBe(0.3);\n    });\n  });\n\n  describe('Audio Recording Workflow', () => {\n    it('should set up recording with adapter node', () => {\n      const context = new MockAPI.AudioContext();\n      const recorder = new MockAPI.AudioRecorder();\n\n      // Configure file output\n      const configResult = recorder.enableFileOutput({\n        format: MockAPI.FileFormat.M4A,\n        channelCount: 2,\n        directory: MockAPI.FileDirectory.Document,\n      });\n\n      expect(configResult.status).toBe('success');\n\n      // Create audio source\n      const oscillator = context.createOscillator();\n      const recorderAdapter = context.createRecorderAdapter();\n\n      // Connect to recorder\n      oscillator.connect(recorderAdapter);\n      recorder.connect(recorderAdapter);\n\n      // Start recording\n      const startResult = recorder.start({\n        fileNameOverride: 'test-recording.m4a',\n      });\n      expect(startResult.status).toBe('success');\n      expect(recorder.isRecording()).toBe(true);\n\n      // Stop recording\n      const stopResult = recorder.stop();\n      expect(stopResult.status).toBe('success');\n      expect(stopResult.paths?.length).toBeGreaterThan(0);\n      expect(recorder.isRecording()).toBe(false);\n    });\n\n    it('should handle audio data callbacks during recording', () => {\n      const recorder = new MockAPI.AudioRecorder();\n      const audioDataCallback = jest.fn();\n\n      const result = recorder.onAudioReady(\n        {\n          sampleRate: 44100,\n          bufferLength: 1024,\n          channelCount: 2,\n        },\n        audioDataCallback\n      );\n\n      expect(result.status).toBe('success');\n\n      // Simulate clearing callback\n      recorder.clearOnAudioReady();\n\n      // Should not throw when clearing again\n      expect(() => recorder.clearOnAudioReady()).not.toThrow();\n    });\n  });\n\n  describe('Offline Audio Processing', () => {\n    it('should render offline audio context', async () => {\n      const offlineContext = new MockAPI.OfflineAudioContext({\n        numberOfChannels: 2,\n        length: 44100, // 1 second at 44.1kHz\n        sampleRate: 44100,\n      });\n\n      // Create a simple tone\n      const oscillator = offlineContext.createOscillator();\n      oscillator.frequency.value = 440;\n      oscillator.connect(offlineContext.destination);\n\n      // Start rendering\n      const renderedBuffer = await offlineContext.startRendering();\n\n      expect(renderedBuffer).toBeInstanceOf(MockAPI.AudioBuffer);\n      expect(renderedBuffer.length).toBe(44100);\n      expect(renderedBuffer.sampleRate).toBe(44100);\n      expect(renderedBuffer.numberOfChannels).toBe(2);\n    });\n  });\n\n  describe('Worklet Processing', () => {\n    it('should create and use worklet nodes for custom processing', () => {\n      const context = new MockAPI.AudioContext();\n\n      const processingCallback = jest.fn(\n        (inputData, outputData, framesToProcess) => {\n          // Mock audio processing logic\n          for (let channel = 0; channel < outputData.length; channel++) {\n            for (let i = 0; i < framesToProcess; i++) {\n              outputData[channel][i] = inputData[channel][i] * 0.5; // Simple gain\n            }\n          }\n        }\n      );\n\n      const workletNode = new MockAPI.WorkletProcessingNode(\n        context,\n        'AudioRuntime',\n        processingCallback\n      );\n\n      expect(workletNode).toBeInstanceOf(MockAPI.WorkletProcessingNode);\n      expect(workletNode.context).toBe(context);\n    });\n\n    it('should create worklet source node for custom audio generation', () => {\n      const context = new MockAPI.AudioContext();\n\n      const sourceCallback = jest.fn(\n        (audioData, framesToProcess, currentTime) => {\n          // Mock audio generation logic\n          for (let channel = 0; channel < audioData.length; channel++) {\n            for (let i = 0; i < framesToProcess; i++) {\n              audioData[channel][i] = Math.sin(currentTime + i); // Simple sine wave\n            }\n          }\n        }\n      );\n\n      const workletSource = new MockAPI.WorkletSourceNode(\n        context,\n        'UIRuntime',\n        sourceCallback\n      );\n\n      expect(workletSource).toBeInstanceOf(MockAPI.WorkletSourceNode);\n      expect(workletSource.context).toBe(context);\n    });\n  });\n\n  describe('Buffer Queue Management', () => {\n    it('should manage audio buffer queue for seamless playback', () => {\n      const context = new MockAPI.AudioContext();\n      const queueSource = context.createBufferQueueSource();\n\n      // Create multiple buffers\n      const buffer1 = context.createBuffer(2, 1024, 44100);\n      const buffer2 = context.createBuffer(2, 1024, 44100);\n      const buffer3 = context.createBuffer(2, 1024, 44100);\n\n      // Enqueue buffers\n      const id1 = queueSource.enqueueBuffer(buffer1);\n      const id2 = queueSource.enqueueBuffer(buffer2);\n      const id3 = queueSource.enqueueBuffer(buffer3);\n\n      expect(typeof id1).toBe('string');\n      expect(typeof id2).toBe('string');\n      expect(typeof id3).toBe('string');\n      expect(id1).not.toBe(id2);\n\n      // Set up buffer ended callback\n      const bufferEndedCallback = jest.fn();\n      queueSource.onBufferEnded = bufferEndedCallback;\n\n      // Dequeue specific buffer\n      queueSource.dequeueBuffer(id2);\n\n      // Clear all buffers\n      queueSource.clearBuffers();\n\n      // Connect and start playback\n      queueSource.connect(context.destination);\n      queueSource.start();\n    });\n  });\n\n  describe('Streaming Audio', () => {\n    it('should set up audio streaming node', () => {\n      const context = new MockAPI.AudioContext();\n\n      // Create streamer with options\n      const streamer = context.createStreamer({\n        streamPath: 'https://example.com/audio-stream',\n      });\n\n      // Connect to output\n      streamer.connect(context.destination);\n\n      // Control playback\n      streamer.start();\n      streamer.pause();\n      streamer.resume();\n      streamer.stop();\n    });\n  });\n\n  describe('System Integration', () => {\n    it('should integrate with system audio management', () => {\n      // Get preferred sample rate\n      const preferredRate = MockAPI.AudioManager.getDevicePreferredSampleRate();\n      expect(preferredRate).toBe(44100);\n\n      // Set up volume monitoring\n      const volumeCallback = jest.fn();\n      const listener = MockAPI.AudioManager.addSystemEventListener(\n        'volumeChange',\n        volumeCallback\n      );\n\n      MockAPI.AudioManager.observeVolumeChanges(true);\n\n      // Simulate volume change\n      MockAPI.setMockSystemVolume(0.7);\n      const currentVolume = MockAPI.useSystemVolume();\n      expect(currentVolume).toBe(0.7);\n\n      // Clean up\n      MockAPI.AudioManager.observeVolumeChanges(false);\n      listener.remove();\n    });\n\n    it('should create and manage notifications', () => {\n      const playbackNotification = MockAPI.PlaybackNotificationManager.create({\n        title: 'Test Song',\n        artist: 'Test Artist',\n        artwork: 'https://example.com/artwork.jpg',\n      });\n\n      expect(playbackNotification.update).toBeDefined();\n      expect(playbackNotification.destroy).toBeDefined();\n\n      // Update notification\n      playbackNotification.update();\n\n      // Clean up\n      playbackNotification.destroy();\n    });\n  });\n\n  describe('Error Handling', () => {\n    it('should handle various error conditions', () => {\n      // Test NotSupportedError\n      expect(() => {\n        throw new MockAPI.NotSupportedError('Feature not supported');\n      }).toThrow('Feature not supported');\n\n      // Test InvalidStateError\n      expect(() => {\n        throw new MockAPI.InvalidStateError('Invalid state');\n      }).toThrow('Invalid state');\n\n      // Test recorder connection errors\n      const recorder = new MockAPI.AudioRecorder();\n      const context = new MockAPI.AudioContext();\n      const adapter = context.createRecorderAdapter();\n\n      // First connection should work\n      recorder.connect(adapter);\n\n      // Second connection should throw\n      expect(() => recorder.connect(adapter)).toThrow();\n    });\n  });\n\n  describe('File Presets and Configuration', () => {\n    it('should use different quality presets', () => {\n      const recorder = new MockAPI.AudioRecorder();\n\n      // Test with different presets\n      const lowQualityConfig = {\n        preset: MockAPI.FilePreset.Low,\n        format: MockAPI.FileFormat.M4A,\n      };\n\n      const highQualityConfig = {\n        preset: MockAPI.FilePreset.High,\n        format: MockAPI.FileFormat.Wav,\n      };\n\n      const losslessConfig = {\n        preset: MockAPI.FilePreset.Lossless,\n        format: MockAPI.FileFormat.Wav,\n      };\n\n      // Configure with different presets\n      recorder.enableFileOutput(lowQualityConfig);\n      expect(recorder.options?.format).toBe(MockAPI.FileFormat.M4A);\n\n      recorder.disableFileOutput();\n      recorder.enableFileOutput(highQualityConfig);\n      expect(recorder.options?.format).toBe(MockAPI.FileFormat.Wav);\n\n      recorder.disableFileOutput();\n      recorder.enableFileOutput(losslessConfig);\n      expect(recorder.options?.format).toBe(MockAPI.FileFormat.Wav);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/react-native-audio-api/tests/jest.config.json",
    "content": "{\n  \"preset\": \"@react-native/jest-preset\",\n  \"rootDir\": \"..\",\n  \"testMatch\": [\"**/tests/**/*.test.ts\", \"**/tests/**/*.test.tsx\"],\n  \"collectCoverageFrom\": [\"src/mock/**/*.{ts,tsx}\", \"!src/mock/**/*.d.ts\"],\n  \"coverageDirectory\": \"tests/coverage\",\n  \"coverageReporters\": [\"text\", \"lcov\", \"html\"],\n  \"setupFilesAfterEnv\": [\"<rootDir>/tests/setup.ts\"]\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/tests/mock.test.ts",
    "content": "/* eslint-disable */\n\nimport * as MockAPI from '../src/mock';\n\ndescribe('React Native Audio API Mocks', () => {\n  describe('AudioContext', () => {\n    it('should create an AudioContext with default sample rate', () => {\n      const context = new MockAPI.AudioContext();\n      expect(context.sampleRate).toBe(44100);\n      expect(context.currentTime).toBe(0);\n      expect(context.state).toBe('running');\n      expect(context.destination).toBeInstanceOf(MockAPI.AudioDestinationNode);\n    });\n\n    it('should create an AudioContext with custom sample rate', () => {\n      const context = new MockAPI.AudioContext({ sampleRate: 48000 });\n      expect(context.sampleRate).toBe(48000);\n    });\n\n    it('should support context state management', async () => {\n      const context = new MockAPI.AudioContext();\n      expect(context.state).toBe('running');\n\n      await context.suspend();\n      expect(context.state).toBe('suspended');\n\n      await context.resume();\n      expect(context.state).toBe('running');\n\n      await context.close();\n      expect(context.state).toBe('closed');\n    });\n  });\n\n  describe('OfflineAudioContext', () => {\n    it('should create an OfflineAudioContext with specified parameters', () => {\n      const context = new MockAPI.OfflineAudioContext({\n        numberOfChannels: 2,\n        length: 44100,\n        sampleRate: 44100,\n      });\n\n      expect(context.sampleRate).toBe(44100);\n      expect(context.length).toBe(44100);\n    });\n\n    it('should start rendering and return an AudioBuffer', async () => {\n      const context = new MockAPI.OfflineAudioContext({\n        numberOfChannels: 2,\n        length: 44100,\n        sampleRate: 44100,\n      });\n\n      const buffer = await context.startRendering();\n      expect(buffer).toBeInstanceOf(MockAPI.AudioBuffer);\n      expect(buffer.numberOfChannels).toBe(2);\n      expect(buffer.length).toBe(44100);\n      expect(buffer.sampleRate).toBe(44100);\n    });\n  });\n\n  describe('AudioBuffer', () => {\n    it('should create an AudioBuffer with correct properties', () => {\n      const buffer = new MockAPI.AudioBuffer({\n        numberOfChannels: 2,\n        length: 1024,\n        sampleRate: 44100,\n      });\n\n      expect(buffer.numberOfChannels).toBe(2);\n      expect(buffer.length).toBe(1024);\n      expect(buffer.sampleRate).toBe(44100);\n      expect(buffer.duration).toBeCloseTo(1024 / 44100);\n    });\n\n    it('should provide channel data', () => {\n      const buffer = new MockAPI.AudioBuffer({\n        numberOfChannels: 2,\n        length: 1024,\n        sampleRate: 44100,\n      });\n\n      const channelData = buffer.getChannelData(0);\n      expect(channelData).toBeInstanceOf(Float32Array);\n      expect(channelData.length).toBe(1024);\n    });\n  });\n\n  describe('Audio Nodes', () => {\n    let context: MockAPI.AudioContext;\n\n    beforeEach(() => {\n      context = new MockAPI.AudioContext();\n    });\n\n    describe('GainNode', () => {\n      it('should create a GainNode with correct properties', () => {\n        const gainNode = context.createGain();\n        expect(gainNode).toBeInstanceOf(MockAPI.GainNode);\n        expect(gainNode.gain).toBeInstanceOf(MockAPI.AudioParam);\n        expect(gainNode.gain.value).toBe(1);\n      });\n\n      it('should allow gain parameter manipulation', () => {\n        const gainNode = context.createGain();\n        gainNode.gain.value = 0.5;\n        expect(gainNode.gain.value).toBe(0.5);\n\n        const result = gainNode.gain.setValueAtTime(0.8, 0);\n        expect(result).toBe(gainNode.gain);\n        expect(gainNode.gain.value).toBe(0.8);\n      });\n    });\n\n    describe('OscillatorNode', () => {\n      it('should create an OscillatorNode with correct properties', () => {\n        const oscillator = context.createOscillator();\n        expect(oscillator).toBeInstanceOf(MockAPI.OscillatorNode);\n        expect(oscillator.frequency).toBeInstanceOf(MockAPI.AudioParam);\n        expect(oscillator.frequency.value).toBe(440);\n        expect(oscillator.type).toBe('sine');\n      });\n\n      it('should allow type changes', () => {\n        const oscillator = context.createOscillator();\n        oscillator.type = 'square';\n        expect(oscillator.type).toBe('square');\n      });\n\n      it('should support start/stop methods', () => {\n        const oscillator = context.createOscillator();\n        expect(() => oscillator.start()).not.toThrow();\n        expect(() => oscillator.stop()).not.toThrow();\n      });\n\n      it('should support onended callback', () => {\n        const oscillator = context.createOscillator();\n        const callback = jest.fn();\n        oscillator.onended = callback;\n        expect(oscillator.onended).toBe(callback);\n      });\n    });\n\n    describe('AnalyserNode', () => {\n      it('should create an AnalyserNode with correct properties', () => {\n        const analyser = context.createAnalyser();\n        expect(analyser).toBeInstanceOf(MockAPI.AnalyserNode);\n        expect(analyser.fftSize).toBe(2048);\n        expect(analyser.frequencyBinCount).toBe(1024);\n      });\n    });\n\n    describe('BiquadFilterNode', () => {\n      it('should create a BiquadFilterNode with correct properties', () => {\n        const filter = context.createBiquadFilter();\n        expect(filter).toBeInstanceOf(MockAPI.BiquadFilterNode);\n        expect(filter.type).toBe('lowpass');\n        expect(filter.frequency.value).toBe(350);\n        expect(filter.Q.value).toBe(1);\n      });\n    });\n  });\n\n  describe('Custom Nodes', () => {\n    let context: MockAPI.AudioContext;\n\n    beforeEach(() => {\n      context = new MockAPI.AudioContext();\n    });\n\n    describe('RecorderAdapterNode', () => {\n      it('should create a RecorderAdapterNode', () => {\n        const recorderAdapter = context.createRecorderAdapter();\n        expect(recorderAdapter).toBeInstanceOf(MockAPI.RecorderAdapterNode);\n        expect(recorderAdapter.wasConnected).toBe(false);\n      });\n    });\n\n    describe('AudioBufferQueueSourceNode', () => {\n      it('should create an AudioBufferQueueSourceNode', () => {\n        const queueSource = context.createBufferQueueSource();\n        expect(queueSource).toBeInstanceOf(MockAPI.AudioBufferQueueSourceNode);\n      });\n\n      it('should support buffer queueing operations', () => {\n        const queueSource = context.createBufferQueueSource();\n        const buffer = context.createBuffer(2, 1024, 44100);\n\n        const bufferId = queueSource.enqueueBuffer(buffer);\n        expect(typeof bufferId).toBe('string');\n        expect(bufferId.length).toBeGreaterThan(0);\n\n        expect(() => queueSource.dequeueBuffer(bufferId)).not.toThrow();\n        expect(() => queueSource.clearBuffers()).not.toThrow();\n      });\n\n      it('should support onBufferEnded callback', () => {\n        const queueSource = context.createBufferQueueSource();\n        const callback = jest.fn();\n        queueSource.onBufferEnded = callback;\n        expect(queueSource.onBufferEnded).toBe(callback);\n      });\n    });\n\n    describe('StreamerNode', () => {\n      it('should create a StreamerNode', () => {\n        const streamer = context.createStreamer({\n          streamPath: 'http://example.com/stream',\n        });\n        expect(streamer).toBeInstanceOf(MockAPI.StreamerNode);\n      });\n    });\n\n    describe('WorkletNodes', () => {\n      it('should create WorkletNode', () => {\n        const workletNode = new MockAPI.WorkletNode(\n          context,\n          'AudioRuntime',\n          () => {},\n          1024,\n          2\n        );\n        expect(workletNode).toBeInstanceOf(MockAPI.WorkletNode);\n      });\n\n      it('should create WorkletProcessingNode', () => {\n        const processingNode = new MockAPI.WorkletProcessingNode(\n          context,\n          'AudioRuntime',\n          () => {}\n        );\n        expect(processingNode).toBeInstanceOf(MockAPI.WorkletProcessingNode);\n      });\n\n      it('should create WorkletSourceNode', () => {\n        const sourceNode = new MockAPI.WorkletSourceNode(\n          context,\n          'AudioRuntime',\n          () => {}\n        );\n        expect(sourceNode).toBeInstanceOf(MockAPI.WorkletSourceNode);\n      });\n    });\n  });\n\n  describe('AudioRecorder', () => {\n    let recorder: MockAPI.AudioRecorder;\n\n    beforeEach(() => {\n      recorder = new MockAPI.AudioRecorder();\n    });\n\n    it('should create an AudioRecorder with correct initial state', () => {\n      expect(recorder.isRecording()).toBe(false);\n      expect(recorder.isPaused()).toBe(false);\n      expect(recorder.getCurrentDuration()).toBe(0);\n      expect(recorder.options).toBeNull();\n    });\n\n    it('should support file output configuration', () => {\n      const result = recorder.enableFileOutput({\n        format: MockAPI.FileFormat.M4A,\n        channelCount: 2,\n      });\n\n      expect(result.status).toBe('success');\n      expect((result as { path?: string }).path).toBeDefined();\n      expect(recorder.options).toBeDefined();\n    });\n\n    it('should support recording workflow', () => {\n      recorder.enableFileOutput();\n\n      const startResult = recorder.start();\n      expect(startResult.status).toBe('success');\n      expect(recorder.isRecording()).toBe(true);\n\n      recorder.pause();\n      expect(recorder.isPaused()).toBe(true);\n\n      recorder.resume();\n      expect(recorder.isPaused()).toBe(false);\n\n      const stopResult = recorder.stop();\n      expect(stopResult.status).toBe('success');\n      expect(stopResult.paths?.length).toBeGreaterThan(0);\n      expect(recorder.isRecording()).toBe(false);\n    });\n\n    it('should support RecorderAdapterNode connection', () => {\n      const context = new MockAPI.AudioContext();\n      const adapter = context.createRecorderAdapter();\n\n      expect(() => recorder.connect(adapter)).not.toThrow();\n      expect(adapter.wasConnected).toBe(true);\n\n      // Should throw on duplicate connection\n      expect(() => recorder.connect(adapter)).toThrow();\n    });\n\n    it('should support audio data callbacks', () => {\n      const callback = jest.fn();\n      const result = recorder.onAudioReady(\n        { sampleRate: 44100, bufferLength: 1024, channelCount: 2 },\n        callback\n      );\n\n      expect(result.status).toBe('success');\n\n      recorder.clearOnAudioReady();\n      // Should not throw\n    });\n\n    it('should support error callbacks', () => {\n      const callback = jest.fn();\n      expect(() => recorder.onError(callback)).not.toThrow();\n      expect(() => recorder.clearOnError()).not.toThrow();\n    });\n  });\n\n  describe('Utility Functions', () => {\n    it('should decode audio data', async () => {\n      const arrayBuffer = new ArrayBuffer(1024);\n      const buffer = await MockAPI.decodeAudioData(arrayBuffer);\n\n      expect(buffer).toBeInstanceOf(MockAPI.AudioBuffer);\n      expect(buffer.numberOfChannels).toBe(2);\n      expect(buffer.sampleRate).toBe(44100);\n    });\n\n    it('should decode PCM in base64', async () => {\n      const base64Data = 'SGVsbG8gV29ybGQ=';\n      const buffer = await MockAPI.decodePCMInBase64(base64Data);\n\n      expect(buffer).toBeInstanceOf(MockAPI.AudioBuffer);\n    });\n\n    it('should change playback speed', async () => {\n      const context = new MockAPI.AudioContext();\n      const inputBuffer = context.createBuffer(2, 1024, 44100);\n      const outputBuffer = await MockAPI.changePlaybackSpeed(inputBuffer, 1.5);\n\n      expect(outputBuffer).toBe(inputBuffer);\n    });\n  });\n\n  describe('System Classes', () => {\n    describe('AudioManager', () => {\n      it('should provide device preferred sample rate', () => {\n        const sampleRate = MockAPI.AudioManager.getDevicePreferredSampleRate();\n        expect(sampleRate).toBe(44100);\n      });\n\n      it('should support volume change observation', () => {\n        expect(() =>\n          MockAPI.AudioManager.observeVolumeChanges(true)\n        ).not.toThrow();\n        expect(() =>\n          MockAPI.AudioManager.observeVolumeChanges(false)\n        ).not.toThrow();\n      });\n\n      it('should support system event listeners', () => {\n        const callback = jest.fn();\n        const listener = MockAPI.AudioManager.addSystemEventListener(\n          'volumeChange',\n          callback\n        );\n\n        expect(listener).toHaveProperty('remove');\n        expect(typeof listener.remove).toBe('function');\n\n        expect(() =>\n          MockAPI.AudioManager.removeSystemEventListener(listener)\n        ).not.toThrow();\n      });\n    });\n\n    describe('Notification Managers', () => {\n      it('should create notification managers', () => {\n        const options = { title: 'Test', artist: 'Test Artist' };\n\n        const notification = MockAPI.NotificationManager.create(options);\n        expect(notification).toHaveProperty('update');\n        expect(notification).toHaveProperty('destroy');\n\n        const playback = MockAPI.PlaybackNotificationManager.create(options);\n        expect(playback).toHaveProperty('update');\n        expect(playback).toHaveProperty('destroy');\n\n        const recording = MockAPI.RecordingNotificationManager.create(options);\n        expect(recording).toHaveProperty('update');\n        expect(recording).toHaveProperty('destroy');\n      });\n    });\n  });\n\n  describe('Hooks', () => {\n    it('should provide useSystemVolume hook', () => {\n      const volume = MockAPI.useSystemVolume();\n      expect(typeof volume).toBe('number');\n      expect(volume).toBe(0.5);\n\n      MockAPI.setMockSystemVolume(0.8);\n      const newVolume = MockAPI.useSystemVolume();\n      expect(newVolume).toBe(0.8);\n    });\n  });\n\n  describe('File Presets', () => {\n    it('should provide file preset configurations', () => {\n      expect(MockAPI.FilePreset.Low).toBeDefined();\n      expect(MockAPI.FilePreset.Medium).toBeDefined();\n      expect(MockAPI.FilePreset.High).toBeDefined();\n      expect(MockAPI.FilePreset.Lossless).toBeDefined();\n\n      expect(typeof MockAPI.FilePreset.Low).toBe('object');\n      expect(typeof MockAPI.FilePreset.Medium).toBe('object');\n      expect(typeof MockAPI.FilePreset.High).toBe('object');\n      expect(typeof MockAPI.FilePreset.Lossless).toBe('object');\n    });\n  });\n\n  describe('Error Classes', () => {\n    it('should provide custom error classes', () => {\n      const notSupportedError = new MockAPI.NotSupportedError('Not supported');\n      expect(notSupportedError).toBeInstanceOf(Error);\n      expect(notSupportedError.name).toBe('NotSupportedError');\n\n      const invalidAccessError = new MockAPI.InvalidAccessError(\n        'Invalid access'\n      );\n      expect(invalidAccessError).toBeInstanceOf(Error);\n      expect(invalidAccessError.name).toBe('InvalidAccessError');\n\n      const invalidStateError = new MockAPI.InvalidStateError('Invalid state');\n      expect(invalidStateError).toBeInstanceOf(Error);\n      expect(invalidStateError.name).toBe('InvalidStateError');\n\n      const indexSizeError = new MockAPI.IndexSizeError('Index size error');\n      expect(indexSizeError).toBeInstanceOf(Error);\n      expect(indexSizeError.name).toBe('IndexSizeError');\n\n      const rangeError = new MockAPI.RangeError('Range error');\n      expect(rangeError).toBeInstanceOf(Error);\n      expect(rangeError.name).toBe('RangeError');\n\n      const audioApiError = new MockAPI.AudioApiError('Audio API error');\n      expect(audioApiError).toBeInstanceOf(Error);\n      expect(audioApiError.name).toBe('AudioApiError');\n    });\n  });\n\n  describe('Constants', () => {\n    it('should export FileDirectory constants', () => {\n      expect(MockAPI.FileDirectory.Document).toBe(0);\n      expect(MockAPI.FileDirectory.Cache).toBe(1);\n    });\n\n    it('should export FileFormat constants', () => {\n      expect(MockAPI.FileFormat.Wav).toBe(0);\n      expect(MockAPI.FileFormat.Caf).toBe(1);\n    });\n  });\n\n  describe('Node Connections', () => {\n    let context: MockAPI.AudioContext;\n\n    beforeEach(() => {\n      context = new MockAPI.AudioContext();\n    });\n\n    it('should support audio node connections', () => {\n      const oscillator = context.createOscillator();\n      const gainNode = context.createGain();\n\n      const result = oscillator.connect(gainNode);\n      expect(result).toBe(gainNode);\n\n      const result2 = gainNode.connect(context.destination);\n      expect(result2).toBe(context.destination);\n    });\n\n    it('should support AudioParam connections', () => {\n      const oscillator = context.createOscillator();\n      const gainNode = context.createGain();\n\n      const result = oscillator.connect(gainNode.gain);\n      expect(result).toBeUndefined();\n    });\n\n    it('should support disconnections', () => {\n      const oscillator = context.createOscillator();\n      const gainNode = context.createGain();\n\n      oscillator.connect(gainNode);\n      expect(() => oscillator.disconnect()).not.toThrow();\n      expect(() => oscillator.disconnect(gainNode)).not.toThrow();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/react-native-audio-api/tests/setup.ts",
    "content": "// __tests__/setup.ts\nimport type { IAudioEventEmitter } from '../src/interfaces';\n\n// Mock global objects that might be needed\nglobal.createAudioContext = jest.fn();\nglobal.createAudioRecorder = jest.fn();\nglobal.AudioEventEmitter = {} as IAudioEventEmitter;\n\n// Set up global test environment\nbeforeAll(() => {\n  // Suppress console warnings for tests\n  jest.spyOn(console, 'warn').mockImplementation(() => {});\n  jest.spyOn(console, 'error').mockImplementation(() => {});\n});\n\nafterAll(() => {\n  // Restore console methods\n  (console.warn as jest.Mock).mockRestore();\n  (console.error as jest.Mock).mockRestore();\n});\n"
  },
  {
    "path": "packages/react-native-audio-api/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"removeComments\": false,\n    \"moduleSuffixes\": [\"\", \".native\", \".web\"],\n    \"paths\": {\n      \"react-native-audio-api\": [\"./src\"]\n    }\n  },\n  \"include\": [\"src\"]\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/tsconfig.test.json",
    "content": "{\n  \"extends\": \"./tsconfig.json\",\n  \"include\": [\"src\", \"tests\"]\n}\n"
  },
  {
    "path": "packages/react-native-audio-api/turbo.json",
    "content": "{\n  \"$schema\": \"https://turbo.build/schema.json\",\n  \"pipeline\": {\n    \"build:android\": {\n      \"inputs\": [\n        \"package.json\",\n        \"android\",\n        \"!android/build\",\n        \"src/*.ts\",\n        \"src/*.tsx\",\n        \"apps/**/package.json\",\n        \"apps/**/android\",\n        \"!apps/**/android/.gradle\",\n        \"!apps/**/android/build\",\n        \"!apps/**/android/app/build\"\n      ],\n      \"outputs\": []\n    },\n    \"build:ios\": {\n      \"inputs\": [\n        \"package.json\",\n        \"*.podspec\",\n        \"ios\",\n        \"src/*.ts\",\n        \"src/*.tsx\",\n        \"apps/**/package.json\",\n        \"apps/**/ios\",\n        \"!apps/**/ios/build\",\n        \"!apps/**/ios/Pods\"\n      ],\n      \"outputs\": []\n    }\n  }\n}\n"
  },
  {
    "path": "packages/test-app-screen/.gitignore",
    "content": ".yarn\n"
  },
  {
    "path": "packages/test-app-screen/index.ts",
    "content": "export { default as TestScreen } from './src/Test';\n"
  },
  {
    "path": "packages/test-app-screen/package.json",
    "content": "{\n  \"name\": \"rn-audio-api-test-screen\",\n  \"version\": \"1.0.0\",\n  \"description\": \"react-native test screen for rn-audio-api\",\n  \"author\": \"michal.dydek@swmansion.com\",\n  \"type\": \"commonjs\",\n  \"main\": \"index.ts\",\n  \"devDependencies\": {\n    \"react-native\": \"0.82.0\",\n    \"react-native-audio-api\": \"^0.9.3\"\n  }\n}\n"
  },
  {
    "path": "packages/test-app-screen/src/AudioBufferTest.ts",
    "content": "import { AudioContext, AudioBuffer } from \"react-native-audio-api\";\nimport { PCM_DATA } from \"./constants\";\n\nconst SUPPORTED_FORMATS = ['mp3', 'wav', 'aac', 'flac', 'ogg', 'opus', 'm4a', 'mp4'];\nconst EXPECTED_BUFFER_DURATION = 16;\nconst EXPECTED_CHANNELS = 2;\n\nconst CHANNELS_MAP: Map<number, string> = new Map([\n  [1, 'https://dl.espressif.com/dl/audio/gs-16b-1c-44100hz.mp3'],\n  [2, 'https://dl.espressif.com/dl/audio/gs-16b-2c-44100hz.mp3'],\n  [4, 'https://www.mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples/SoundCardAttrition/drmapan.wav'],\n  [6, 'https://www.mmsp.ece.mcgill.ca/Documents/AudioFormats/WAVE/Samples/Microsoft/6_Channel_ID.wav']\n]);\n\nconst DURATIONS_MAP: Map<number, number> = new Map([\n  [1, 16],\n  [2, 16],\n  [4, 4.78],\n  [6, 5.84]\n]);\n\nexport const audioBufferFormatsTest = async (audioContextRef: React.RefObject<AudioContext | null>, setTestingInfo: (value: React.SetStateAction<string>) => void) => {\n  let buffers: AudioBuffer[] = [];\n  for (const format of SUPPORTED_FORMATS) {\n    const url = 'https://dl.espressif.com/dl/audio/gs-16b-2c-44100hz.' + format;\n    setTestingInfo(`Loading audio buffer: ${format}`);\n    await fetch(url, {\n      headers: {\n        'User-Agent': 'Mozilla/5.0 (Android; Mobile; rv:122.0) Gecko/122.0 Firefox/122.0',\n      }\n    })\n      .then(response => response.arrayBuffer())\n      .then(async (arrayBuffer) => {\n        try {\n          const audioBuffer = await audioContextRef.current!.decodeAudioData(arrayBuffer);\n          console.log(`Decoded ${format} buffer:`, audioBuffer);\n          if (Math.abs(audioBuffer.duration - EXPECTED_BUFFER_DURATION) > 0.3) {\n            throw new Error(`Unexpected buffer duration: ${audioBuffer.duration}`);\n          }\n          if (audioBuffer.numberOfChannels !== EXPECTED_CHANNELS) {\n            throw new Error(`Unexpected number of channels: ${audioBuffer.numberOfChannels}`);\n          }\n          buffers.push(audioBuffer);\n        } catch (error) {\n          setTestingInfo(`Error decoding audio buffer: ${format} - ${error}`);\n        }\n      })\n  }\n  for (let i = 0; i < buffers.length; i++) {\n    setTestingInfo(`Playing ${SUPPORTED_FORMATS[i]} buffer`);\n    const bufferSource = audioContextRef.current!.createBufferSource();\n    bufferSource.buffer = buffers[i];\n    bufferSource.connect(audioContextRef.current!.destination);\n    bufferSource.start();\n    await new Promise(resolve => setTimeout(resolve, 4000));\n    if (i === buffers.length - 1) {\n      bufferSource.onEnded = () => {\n        setTestingInfo('Audio buffer test completed.');\n      };\n    }\n    bufferSource.stop();\n  }\n}\n\nexport const audioBufferChannelsTest = async (audioContextRef: React.RefObject<AudioContext | null>, setTestingInfo: (value: React.SetStateAction<string>) => void) => {\n  for (const channelsStr in CHANNELS_MAP) {\n    const channels = parseInt(channelsStr, 10);\n    const url = CHANNELS_MAP.get(channels)!;\n    const expectedDuration = DURATIONS_MAP.get(channels)!;\n    setTestingInfo(`Loading audio buffer with ${channels} channels`);\n    await fetch(url, {\n      headers: {\n        'User-Agent': 'Mozilla/5.0 (Android; Mobile; rv:122.0) Gecko/122.0 Firefox/122.0',\n      }\n    })\n      .then(response => response.arrayBuffer())\n      .then(async (arrayBuffer) => {\n        try {\n          const audioBuffer = await audioContextRef.current!.decodeAudioData(arrayBuffer);\n          console.log(`Decoded buffer with ${channels} channels:`, audioBuffer);\n          if (Math.abs(audioBuffer.duration - expectedDuration) > 0.3) {\n            throw new Error(`Unexpected buffer duration: ${audioBuffer.duration}`);\n          }\n          if (audioBuffer.numberOfChannels !== channels) {\n            throw new Error(`Unexpected number of channels: ${audioBuffer.numberOfChannels}`);\n          } else {\n            setTestingInfo(`Playing buffer with ${channels} channels`);\n            const bufferSource = audioContextRef.current!.createBufferSource();\n            bufferSource.buffer = audioBuffer;\n            bufferSource.connect(audioContextRef.current!.destination);\n            bufferSource.start();\n            await new Promise(resolve => setTimeout(resolve, 4000));\n            if (channels === Object.keys(CHANNELS_MAP).length) {\n              bufferSource.onEnded = () => {\n                setTestingInfo('Audio buffer channels test completed.');\n              };\n            }\n            bufferSource.stop();\n          }\n        } catch (error) {\n          setTestingInfo(`Error decoding audio buffer with ${channels} channels - ${error}`);\n        }\n      })\n  }\n}\n\nexport const audioBufferBase64Test = async (audioContextRef: React.RefObject<AudioContext | null>, setTestingInfo: (value: React.SetStateAction<string>) => void) => {\n  const audioBuffer = await audioContextRef.current!.decodePCMInBase64(PCM_DATA, 48000, 1, true);\n  const bufferSource = audioContextRef.current!.createBufferSource();\n  bufferSource.buffer = audioBuffer;\n  bufferSource.connect(audioContextRef.current!.destination);\n  bufferSource.start();\n  bufferSource.stop(audioContextRef.current!.currentTime + 5);\n  setTestingInfo('Playing audio buffer decoded from Base64 PCM data');\n  await new Promise(resolve => setTimeout(resolve, 5000));\n  setTestingInfo('Audio buffer Base64 test completed.');\n}\n"
  },
  {
    "path": "packages/test-app-screen/src/OscillatorTest.ts",
    "content": "import { AudioContext } from \"react-native-audio-api\";\n\nexport const oscillatorTestWithDetune = (audioContextRef: React.RefObject<AudioContext | null>) => {\n  const oscillatorNode = audioContextRef.current!.createOscillator();\n  oscillatorNode.connect(audioContextRef.current!.destination);\n  oscillatorNode.start();\n  oscillatorNode.detune.setValueAtTime(100, audioContextRef.current!.currentTime + 1);\n  oscillatorNode.stop(audioContextRef.current!.currentTime + 2);\n}\n\nexport const oscillatorTestWithGain = (audioContextRef: React.RefObject<AudioContext | null>) => {\n  const oscillatorNode = audioContextRef.current!.createOscillator();\n  const gain = audioContextRef.current!.createGain();\n  oscillatorNode.connect(gain);\n  gain.connect(audioContextRef.current!.destination);\n  oscillatorNode.start();\n  gain.gain.value = 0.5;\n  gain.gain.linearRampToValueAtTime(0.0, audioContextRef.current!.currentTime + 1.5);\n  gain.gain.linearRampToValueAtTime(1.5, audioContextRef.current!.currentTime + 3);\n  oscillatorNode.stop(audioContextRef.current!.currentTime + 4.5);\n}\n\nexport const oscillatorTestWithStereoPanner = (audioContextRef: React.RefObject<AudioContext | null>) => {\n  const oscillatorNode = audioContextRef.current!.createOscillator();\n  const pan = audioContextRef.current!.createStereoPanner();\n  oscillatorNode.connect(pan);\n  pan.connect(audioContextRef.current!.destination);\n  oscillatorNode.start();\n  pan.pan.linearRampToValueAtTime(1.0, audioContextRef.current!.currentTime + 1.5);\n  pan.pan.linearRampToValueAtTime(-1.0, audioContextRef.current!.currentTime + 3);\n  oscillatorNode.stop(audioContextRef.current!.currentTime + 4.5);\n}\n"
  },
  {
    "path": "packages/test-app-screen/src/RecorderTest.ts",
    "content": "import {\n  AudioContext,\n  AudioRecorder,\n  AudioBuffer,\n} from 'react-native-audio-api';\n\nexport const recorderTest = (\n  audioContextRef: React.RefObject<AudioContext | null>,\n  buffers: AudioBuffer[]\n) => {\n  const recorder = new AudioRecorder();\n\n  recorder.onAudioReady(\n    {\n      sampleRate: audioContextRef.current!.sampleRate,\n      bufferLength: audioContextRef.current!.sampleRate * 0.1,\n      channelCount: 1,\n    },\n    (event) => {\n      const { buffer, numFrames } = event;\n      console.log('Audio recorder buffer ready:', numFrames);\n      buffers.push(buffer);\n    }\n  );\n  recorder.start();\n  setTimeout(() => {\n    recorder.stop();\n  }, 5000);\n};\n\nexport const recorderPlaybackTest = (\n  audioContextRef: React.RefObject<AudioContext | null>,\n  buffers: AudioBuffer[]\n) => {\n  let nextStartAt = audioContextRef.current!.currentTime + 0.1;\n  for (let i = 0; i < buffers.length; i++) {\n    const source = audioContextRef.current!.createBufferSource();\n    source.buffer = buffers[i];\n    source.connect(audioContextRef.current!.destination);\n    source.start(nextStartAt);\n    nextStartAt += buffers[i].duration;\n  }\n};\n"
  },
  {
    "path": "packages/test-app-screen/src/StreamingTest.ts",
    "content": "import { AudioContext } from 'react-native-audio-api';\n\nexport const streamerTest = (\n  audioContextRef: React.RefObject<AudioContext | null>\n) => {\n  const streamer = audioContextRef.current!.createStreamer(\n    'https://stream.radioparadise.com/aac-320'\n  );\n  streamer.connect(audioContextRef.current!.destination);\n  streamer.start(audioContextRef.current!.currentTime);\n  streamer.stop(audioContextRef.current!.currentTime + 5);\n};\n"
  },
  {
    "path": "packages/test-app-screen/src/Test.tsx",
    "content": "import React, { useRef, FC, useState, useEffect } from 'react';\nimport {\n  AudioContext,\n  AudioBuffer,\n  AudioManager,\n} from 'react-native-audio-api';\n\nimport {\n  oscillatorTestWithDetune,\n  oscillatorTestWithGain,\n  oscillatorTestWithStereoPanner,\n} from './OscillatorTest';\nimport { streamerTest } from './StreamingTest';\nimport { workletTest } from './WorkletsTest';\nimport { recorderTest, recorderPlaybackTest } from './RecorderTest';\nimport {\n  audioBufferFormatsTest,\n  audioBufferChannelsTest,\n  audioBufferBase64Test,\n} from './AudioBufferTest';\n\nimport { View, Text, Button } from 'react-native';\n\nconst SAMPLE_RATE = 44100;\n\nconst Test: FC = () => {\n  const [testingInfo, setTestingInfo] = useState<string>('');\n  const [isTesting, setIsTesting] = useState<boolean>(false);\n  const audioContextRef = useRef<AudioContext | null>(null);\n\n  useEffect(() => {\n    const init = async () => {\n      try {\n        await AudioManager.requestRecordingPermissions();\n      } catch (err) {\n        console.log(err);\n        console.error('Recording permission denied', err);\n        return;\n      }\n      AudioManager.setAudioSessionOptions({\n        iosCategory: 'playAndRecord',\n        iosMode: 'spokenAudio',\n        iosOptions: ['defaultToSpeaker', 'allowBluetoothA2DP'],\n      });\n    };\n    init();\n    return () => {\n      if (audioContextRef.current) {\n        audioContextRef.current.close();\n        audioContextRef.current = null;\n      }\n    };\n  }, []);\n\n  const setupAudioContext = async () => {\n    if (!audioContextRef.current) {\n      audioContextRef.current = new AudioContext({ sampleRate: SAMPLE_RATE });\n    }\n  };\n\n  const oscillatorTest = () => {\n    setIsTesting(true);\n    setupAudioContext();\n    setTestingInfo('Oscillator Test with Detune');\n\n    oscillatorTestWithDetune(audioContextRef);\n\n    setTimeout(() => {\n      setTestingInfo('Oscillator Test with Gain');\n      oscillatorTestWithGain(audioContextRef);\n    }, 2500);\n\n    setTimeout(() => {\n      setTestingInfo('Oscillator Test with Stereo Panner');\n      oscillatorTestWithStereoPanner(audioContextRef);\n    }, 7500);\n\n    setTimeout(() => {\n      setTestingInfo('Oscillator test completed.');\n      setIsTesting(false);\n    }, 12500);\n  };\n\n  const audioBufferTest = async () => {\n    setupAudioContext();\n    setIsTesting(true);\n    await audioBufferChannelsTest(audioContextRef, setTestingInfo);\n    await audioBufferFormatsTest(audioContextRef, setTestingInfo);\n    await audioBufferBase64Test(audioContextRef, setTestingInfo);\n    setIsTesting(false);\n  };\n\n  const recordingTest = () => {\n    setupAudioContext();\n    setIsTesting(true);\n    setTestingInfo('Recording...');\n    const buffers: AudioBuffer[] = [];\n    recorderTest(audioContextRef, buffers);\n    setTimeout(() => {\n      setTestingInfo('Stopping recording and playing back...');\n      recorderPlaybackTest(audioContextRef, buffers);\n    }, 5500);\n    setTimeout(() => {\n      setTestingInfo('Recording test completed.');\n      setIsTesting(false);\n    }, 11000);\n  };\n\n  const streamingTest = () => {\n    setIsTesting(true);\n    setupAudioContext();\n    setTestingInfo('Streaming test');\n    streamerTest(audioContextRef);\n    setTimeout(() => {\n      setTestingInfo('Streaming test completed.');\n      setIsTesting(false);\n    }, 5000);\n  };\n\n  const workletsTest = () => {\n    setIsTesting(true);\n    setupAudioContext();\n\n    setTestingInfo('Worklet test that reduces gain to 0.1');\n    workletTest(audioContextRef);\n    setTimeout(() => {\n      setTestingInfo('Worklet test completed.');\n      setIsTesting(false);\n    }, 4000);\n  };\n\n  return (\n    <View\n      style={{\n        gap: 40,\n        paddingTop: 200,\n        backgroundColor: 'black',\n        height: '100%',\n      }}\n    >\n      <View style={{ alignItems: 'center', justifyContent: 'center', gap: 5 }}>\n        <Text style={{ color: 'white' }}>{testingInfo}</Text>\n      </View>\n      <View style={{ alignItems: 'center', justifyContent: 'center', gap: 5 }}>\n        <Button\n          title=\"oscillator\"\n          onPress={oscillatorTest}\n          disabled={isTesting}\n        />\n        <Button\n          title=\"audio buffer\"\n          onPress={audioBufferTest}\n          disabled={isTesting}\n        />\n        <Button title=\"recorder\" onPress={recordingTest} disabled={isTesting} />\n        <Button title=\"streamer\" onPress={streamingTest} disabled={isTesting} />\n        <Button\n          title=\"worklet node\"\n          onPress={workletsTest}\n          disabled={isTesting}\n        />\n        <Text style={{ color: 'white', paddingTop: 40 }}>\n          CHECK IF EVERYTHING WORKS AFTER HOT RELOAD\n        </Text>\n      </View>\n    </View>\n  );\n};\n\nexport default Test;\n"
  },
  {
    "path": "packages/test-app-screen/src/WorkletsTest.ts",
    "content": "import { AudioContext } from \"react-native-audio-api\";\n\nexport const workletTest = (audioContextRef: React.RefObject<AudioContext | null>) => {\n    const processingWorklet = (\n      inputAudioData: Array<Float32Array>,\n      outputAudioData: Array<Float32Array>,\n      framesToProcess: number,\n      _currentTime: number\n    ) => {\n      'worklet';\n      const gain = 0.1;\n      for (let channel = 0; channel < inputAudioData.length; channel++) {\n        const inputChannelData = inputAudioData[channel];\n        const outputChannelData = outputAudioData[channel];\n        for (let i = 0; i < framesToProcess; i++) {\n          outputChannelData[i] = inputChannelData[i] * gain;\n        }\n      }\n    };\n\n    const workletNode = audioContextRef.current!.createWorkletProcessingNode(\n      processingWorklet,\n      'AudioRuntime'\n    );\n\n    const oscillatorNode = audioContextRef.current!.createOscillator();\n    oscillatorNode.connect(workletNode);\n    workletNode.connect(audioContextRef.current!.destination);\n    oscillatorNode.start();\n    oscillatorNode.stop(audioContextRef.current!.currentTime + 4);\n}\n"
  },
  {
    "path": "packages/test-app-screen/src/constants.ts",
    "content": "const PCM_DATA1 =\n  'BQADAAEAAAAAAAEA/P/4//v//f///wAAAAD///7//f/+////AQAAAP//AQACAAEAAQD///3//f/+//7//P/6//r//P/9//r/+P/4//n/+f/4//j/+v/8//7/AQACAAYACgALAAsADAALAAkACAAIAAYABAABAP7/+v/5//3//f/6//r//P/5//f/+v/8//z//f/8//z//v8BAAMABAAEAAgACAADAAcADAAKAAkACwAHAAIAAAD9//z//P/1//T/+f/2//T/+P/8//3//v///wAA//8AAAIAAQAEAAoADQAOAA4ADQAPABIADwALAAwABwD///3////+//3//v/+//7//v/+//v/+f/5//T/8f/w/+z/8//9/wIACAALAAkACAAHAAsAEQAUABcAGAAXABkAGAAUABAACQABAPz/9P/t/+v/6v/q/+7/8P/2//v/+v/9////AgAGAAYACQAOAA4ADwAOAA4AEQARAAoAAAD7//3/+//1//T/9P/v/+v/7f/r/+f/7P/v/+3/8v/8/wMADAAVAB0AJAAkACIAIwAeABsAHAAPAP/////6/+//6v/m/+T/5v/j/+H/6f/v/+//9f/+/wEABAAQABoAGwAcAB0AGgAZABgAEQAHAAAA+P/w/+v/5v/i/+f/6f/l/+P/5f/q//L/9//7/wIACQAQABoAIAAiACIAIQAiACEAHAAVAAoAAQD7//X/8P/s/+n/6f/n/+X/5//q/+3/8f/0//v/AAAFAA0AEgATABYAGQAYABcAFgASAAwAAwD+//v/9f/y/+//6P/m/+f/5v/m/+n/7f/x//j///8JABAAEwAaAB0AGwAdAB0AFwAUABUADgADAP///v/4//T/8P/t/+7/7f/r/+//8v/z//j//v8AAAYACQAIAAsACgAIAAkACAAJAAoABgADAAEA/v/8//z//f/6//j/+v/9//3/AAADAAQABgAGAAQABAAFAAQABQAHAAUAAwAEAAMA///9//7///////7//f/9//7//v///wEAAgAEAAkADAAMAA0ADQALAAgACAAKAAUAAAABAP7/+//8//v/9//1//T/8v/0//X/9f/3//z//f8BAAgACwAKAAoACwAKAAkACQAKAAoACwAJAAUABAADAAAA/P/2//P/9f/3//j/9//6//3//P/9//7//f8AAAMAAgADAAUABwAKAA0ADgAMAAsACwAKAAYAAQD+//z/+P/z//D/7f/o/+3/9f/1//j///8AAAEABAAFAAUABwAFAAQACAAHAAcACQAJAAYABAABAP//AQD///z//P/7//7////9/wAAAgACAAIAAgADAAQABAAHAAgABgAIAAoABgAEAAQA///6//n/+f/1//L/8//1//f/+f/7//3///8AAAEAAQACAAcACAAGAAkACQAGAAcABwAFAAUAAgD9///////6//r/+//5//n/+//+/////v8AAAMACAAKAAkACAAIAAUABQAHAAUAAgADAAEA/P/7//3/+v/2//r//v/7//j/+f/2//T/+f/8//r//f8AAAEABgAJAAsADwAQAA4ADgALAAUABwAFAAAAAQD9//X/9v/4//j/+f/4//j//v8CAP//AQAGAAUABAAJAAsACgAKAAoACQAHAAYABQACAAAA/f/3//b/9P/v//P/9f/z//T/9f/2//r/+//9/wIABAAFAAkACwALAA0ADgAPAA8ADAAKAAcAAgAAAP3//P/8//z/+//5//r/+//6//v/+//7/wAAAAD//wMABQAGAAgACAAHAAYABQAGAAMAAQABAAAA/v/+//z/+f/6//v/+//8//v/+//+//////8AAAMABQAEAAMAAwADAAQABQACAAEAAQD+//7/AQD//wAAAgABAAEAAwAFAAUAAwABAAIAAgD///7//v/+//3//f/+//7//P/8//3/+//7//3//f/7//v//v//////AgAGAAYABQAGAAUABQAFAAQABAAEAAAA/v8AAP7//P///wAA/v/9/////v/9////AQACAAMAAgADAAMABQAGAAUABgAGAAQABgADAP//AAD//wAAAgAAAAAAAAD+//z//v////3//f////////8BAAAAAgADAAEAAwAGAAUAAwAEAAYABwAHAAUABQAEAAIAAQABAAAA/v/+//7/+//5//z/AQD///7/AgADAAIABwAJAAQAAgAFAAQAAAAAAAAA/v8AAAIAAAABAAAA/v///wAA/f///wAA/v8BAAEA+//+//7/+//+//////8AAAAAAAAEAAYABQAIAAkABgAEAAYACAAHAAYABgAFAAEAAAD///v//P/9//n/+//6//f/+//7//n//f/9//3/AQAAAAEABAAEAAIABQAHAAcABwAHAAgACQAIAAYABAACAAAA/f/8//3//v/+//z//P/+//3/AAAAAP//AgACAAEABAAHAAcACQAKAAkACAAHAAUAAwD///z/+//7//r/+P/5//v/+v/7//7////+/wIABAADAAMABgAHAAUABQAIAAMA/v8DAAUA//8BAAEA/P/9//7//P///wAA/P/9/wAA/f/9/wAAAQABAAIAAQABAAMAAAABAAQAAgACAP///v8AAAAA//////7//v/+//7///////7//P/9/wAAAQABAAQAAwAGAAkACAAJAAgACQALAAcABAAEAAMAAwADAAAA/v/8//r/+//8//v/+f/6//3//P/6//z//v/8/wAABQAFAAUABQAEAAIAAQADAAQAAgADAAIAAQABAP////8BAP///P///wAA/f/+/wEA/v/8//7/AQABAAEAAgACAAMABAACAAIABQAFAAMAAwADAAIAAwACAAEAAQD/////AAD+//3///8AAP7//v8BAAAA/f8BAAEAAAACAAAA//8BAAEAAQABAAEAAQACAAEAAQABAAAAAgACAAAAAQABAAAAAgACAAEAAQACAAMAAgABAAIAAgABAAEAAQAAAAEAAgAAAAAAAAAAAAIAAQAAAAEAAwABAAAAAwADAAAAAAAAAP////8BAAIAAAABAAMAAQD+/wAA///9/////f/+/////f///////v8BAAEA/v8BAAMAAAAAAAIAAQABAAIAAgACAAMAAgAAAAIAAQD+//7/AAD/////AAD//wAA///////////+/wAAAAAAAAIAAgABAAEAAQADAAQAAQAAAAIAAAAAAAIAAAD+/wAAAAAAAAEAAAAAAAEAAAABAAEAAQAEAAQAAgACAAIAAQAAAAEAAgACAAIAAQAAAP//AAD///7/AAAAAP7////+/wIAAgD+/wAAAQD9////AwACAAAAAgACAAEAAQABAAAAAgABAP7///8CAAEAAAABAP///v8AAAIAAQD//wAAAQD+/wAABAABAAAAAgACAAMAAwAAAAEAAgACAAMAAAD9/wEAAgD//wIAAgD//wEAAgABAAEA///+/wEAAgD9////AwABAP//AAABAAIAAwABAAAAAgACAAEAAQACAAEAAAABAAEA//8AAAEA/////wIAAQD//wAAAwABAP//AQAAAP7/AQACAP//AAAAAAAAAgADAAEAAgACAP//AAABAAAAAQABAAAAAQABAP//AAAAAAAAAQD///7/AQACAP//AAACAAAAAAACAAMAAgACAAIAAgABAAEAAQD//wAAAQD+/wEAAQD9/wAAAAD9/wAAAAAAAAEA/v8AAAIAAQD//wEABAADAAEAAgAEAAIAAQADAAIAAQADAAEA//8AAAIAAgAAAP//AQAAAAAAAQD+/wEAAwAAAP//AAD//wEABAADAAEAAQABAAEAAQABAAEAAwABAP7//v8BAP///v8BAP////8CAAEAAAD//wEAAwAAAAEABAAAAP//BAACAP7/AgADAAEAAwABAP7/AAABAAAAAQADAAIA/////wEAAgABAAAA//8BAAAAAAACAAAA/v8CAAIA/v8AAAEAAAABAAAAAQACAP//AAACAP7///8EAP///v8DAAIAAQACAAAAAQACAAEAAwADAAMAAwABAAIAAwACAAEAAAABAAEAAQABAAAA//8BAAEAAAAAAAEAAQABAAEAAQABAAIAAgABAAEAAQACAAIAAQABAAMAAgAAAAEAAwACAAEAAAAAAAEAAQAAAAAAAQACAAIAAQAAAAEAAAADAAUAAQACAAMAAAACAAMAAQABAAIAAwD///7/AwACAP7/AgAFAP///f8DAAMA/v8AAAIA//8BAAIAAAAFAAQA/v8BAAMAAAABAAIAAQADAAMA//8CAAMAAAABAAMAAQAAAAAA//8BAAEAAAACAAIAAQACAAEAAAAEAAMAAAACAAQAAgAAAAAAAQABAAAAAQD/////AQAAAAAAAAD9////AwAAAP//AQABAAAAAQADAAEA//8CAAQAAgACAAMAAQABAAMAAgD/////AgAFAAEAAAABAAAAAQADAAAAAQADAAAAAQAEAP7//v8EAAMAAgADAAEAAwADAP//AAADAAEA//8AAAEAAAD//wAAAQABAAIAAAD//wAAAgABAAEAAQABAAEAAQACAAEAAgADAP////8EAAEA//8CAAEAAgACAAEAAgADAAAAAAACAAEA/v8AAAMAAQD//wEAAQAAAAEAAQD//wEAAgAAAAAAAAACAAIA//8AAAIAAAAAAAQAAQD//wIAAQABAAIAAAAAAAIAAQAAAAEAAQAAAP////8AAAIAAgAAAAEAAgABAAEAAQAAAAIAAAD//wEAAgABAAAAAAABAAEAAgABAAAAAAACAAIAAQAAAAEAAgACAAEAAQACAAAAAAACAAIAAAAAAAQAAwD//wEAAgD//wAAAwABAP//AQACAAAAAQACAAEAAgADAAEAAQABAAEAAQABAAEAAwABAP3/AgAEAP//AAADAAAAAAACAAIAAQACAAAAAAACAAEAAQABAAEAAQACAAAAAgADAAAAAAABAAEAAwACAP//AQACAAEAAQACAAIAAQABAAMAAQD//wEAAQAAAAEAAgABAAAAAQABAAEAAgAAAAIABQAAAP//AwACAAEAAgACAAAA//8BAAIA//8AAAMAAgAAAAEAAAAAAAIAAQABAAIA//8AAAIAAQABAAAA//8BAAIA/////wIAAQD/////AAABAAEAAAD//wEAAQD//wAAAAAAAAEAAAAAAAEAAAAAAAAA//8BAAEA/////wEAAAAAAAEAAQAAAAEAAAAAAAAA//8AAAAA//8AAAAA//8AAAAAAAABAP////8CAAAA/v8BAAIAAAD//wAAAAD+/wAAAgAAAP//AQD///7/AAAAAP//AQD///7/AAAAAP//AAAAAAAAAAD+////AgAAAP3/AAAAAP////////////////7//v/+//3//P///wAAAAD///z//P/+//////8AAAIAAgABAP//////////AAD///7//v/////////+//3//v///////v/+/////v/+/////f/9//7//v/9//7/AAD///3//v////3//f///////v///////v///wAA//////////8AAAAAAAAAAP////8BAAAA/v8BAAIA/v/+/wEAAAD+/wEAAQD///////8AAAAA////////AAD///////8AAAAAAAAAAAAA//8AAAAA///+/wAA/v///wEAAQD/////AAAAAP///////wAAAAAAAAAAAAD///7/AAABAP//AAACAP///v8BAAEA/v///wEAAAD//wAAAQAAAAAAAAD//wAAAQD/////AAD+////AQAAAP///////wEAAAD9//3/AAD/////AQD///7///8AAAAAAAAAAAAAAQABAP///v/+////AAABAAAA/////wEAAAD+/wAAAQD//wAAAQAAAAAAAAAAAAAAAAABAAAA/v8AAAIAAQAAAAEAAAD9//7/AAD/////AAD/////AAD//wAAAQAAAAAAAQABAAIAAgAAAAAAAQAAAAAAAAD//wAA///+/wAAAQD//wAAAwAAAP3/AAADAAEAAAACAAIAAQACAAEA/v///wAA//8BAAIA//8AAAIA//8AAAMAAQD//wAAAAACAAEA/v///wAA/////wAAAQACAAEAAQABAAEAAQAAAAAAAAACAAIAAQACAAIAAQACAAEAAAACAAEA/////wAAAAABAAAAAAAAAAEAAAD/////AAABAP//AAACAAEAAQABAAIAAgACAAIAAQD//wAAAQAAAP//AQABAP//AgADAP///v8DAAQA//8AAAQAAQABAAMA/////wAAAAABAAEAAAABAAAAAAADAAIA/v8CAAMA//8AAAEAAAABAAEA//8CAAMA/v///wIAAQAAAAAAAAACAAIA//8AAAQABAACAAAAAAAAAP//AAAAAP7/AAABAP////8AAAAAAQAAAAAAAAAAAP7///8CAAEAAAACAAMAAAD//wAAAQABAAAA/f/9////AQABAAIAAQAAAAAA/////wAAAQACAAEAAAABAAAA//8AAAAAAAABAAEAAAAAAAMABAABAAAAAAABAAEA/v/8//7//v/+/wIABAABAP7/AgADAPz//P8BAP7/+v8BAAMA/f/9/wIA/v/8/wEAAgACAAQA/v/9/wMAAwABAAIAAgADAAMA/f/8/wIA///8//7//P/8//7//v///wAA/f/9/////f/6//r//f8AAP7/+v/+/wMAAAD6//f/+v8AAAEA+//4//3/BAAFAAIAAQADAAQAAgD///3//P/8//3/AQAGAAMA/f/+/wQABAD+//v/+//8/wIABQACAAEAAwACAP///f8DAAMA+v/9/wYAAQD//wQABAAGAAkAAwAAAAAA+P/4/wEAAwAAAAEABAANAA8A///3//z//P/8//7/+//2//f//f/2/+f/5//r/+//9P/w//T/BAAVABsADwAMACAAHwAGAP//AQD3//r/DQAgAEMAaABxAF0APQAtADAAKAAZABEA8f/V/+j/7v/P/7f/rP+y/7P/lv+D/6D/zP/X/9v/AgASAP3/+f/1//b/BgD8/+T/2f/i//7/BwAJABMAHAAyADUADwD0/+3/1/+9/6z/sP/T/+//AgBCAHMAXABFAD8ALQAtADsANwAtADEAQwBiAHUA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DgAQABMAEAARABcAFwAXABsAHAAdAB8AHQAcAB4AHQAYABYAFAAQAAwACQAGAAMAAwADAAEAAgAEAAYACAAJAAsADAANAAwACwAKAAgAAgD8//f/8f/s/+n/4//c/9n/1//S/8//zv/L/8r/zP/N/87/z//Q/9P/1P/V/9j/1//X/9v/3P/b/9r/2v/a/9r/2v/Y/9j/2f/a/9v/3P/e/93/3//j/+P/5f/p/+j/6P/q/+z/6v/o/+r/6//q/+r/6f/n/+j/5//k/+L/4P/e/93/3P/a/9v/2f/W/9X/1P/R/9H/0v/P/9D/0f/P/9L/0v/R/9T/1P/S/9L/0v/S/9L/0P/P/8//zv/N/8v/yf/J/8j/xv/I/8n/yP/K/8z/z//P/87/0f/V/9X/2P/a/9n/2f/c/97/2//a/9v/2v/c/9v/2f/b/97/3f/f/+D/4v/k/+b/6f/q/+v/7//w/+7/8v/2//X/9f/2//X/9//2//P/9f/1//T/9f/1//P/8v/y//P/9P/z//D/7//x/+//7P/r/+r/6v/o/+X/5f/n/+f/5f/l/+X/5v/o/+n/6f/r/+z/7f/u//D/8P/y//T/9P/0//X/9v/2//b/9//3//f/+P/6//j/9//5//r/+f/7//3//f/+/wAAAAACAAQAAwAEAAQAAgACAAMAAQAAAP///v/9//z/+f/5//n/+f/5//j/+v/7//v//f///wAAAQACAAQABgAGAAcABwAHAAYABwAGAAMAAwADAAIAAgABAAAAAwAEAAQABgAGAAkADQAOAA8AEwAVABQAGAAcABsAHAAeAB8AHwAfAB8AHQAcAB0AHgAdABwAHQAcABsAHQAfABwAHAAeAB0AHwAfABwAHQAeABwAHAAeABwAGQAaABoAGAAWABYAFQAUABMAEgAQAA8AEAAQABAAEAAQABEAEwASABEAFAAUABEAEgAUABIAEwATABAAEQARAA8ADwAQAA4ADAAMAA0ADQAMAAsADAAMAAoACQAJAAgABQAGAAcABQADAAUAAwABAAMAAwAAAAIAAgACAAMAAgADAAQABAAFAAUAAwAEAAgABQAEAAcABwAHAAkABwAIAAkACQAIAAoACwAKAAgACQAKAAgABwAGAAUABQAFAAMAAgACAAEA///+//z//P/9//z/+v/6//r/+v/5//j/+P/5//j/9v/2//f/9//1//X/9f/1//T/8//y//L/8v/z//T/9P/1//b/9//4//n/+//9/wAAAgACAAQABQAFAAcACAAIAAkACQAKAAkACAAKAAkABwAKAAsABwAGAAgABwADAAUABwAEAAQABQAEAAYABQACAAMABAABAAAA///+//7//f/6//n/9//0//T/8//x//D/7//v//D/7//v//D/8f/x//H/8v/y//P/8//x//H/8v/w/+7/7v/u/+z/6//s/+v/6v/u/+7/7v/w//H/9f/4//j/+v/+/wAAAgADAAYABwAHAAsADQAMAA4ADwANAAwADwAQAA8ADwASABMAEgATABQAEgATABQAEgAUABQAEgATABQAEAAPABMAEgAQABAAEAAPAA0ADAANAA0ADAAKAAkACwAMAAsADAANAA0ADwAQAA8ADgARABEAEAASABQAEgATABMAEwAUABUAEgASABUAFAATABMAFAAUABQAEwAUABMAEQAPABEAEAALAAwADwAKAAcACgAIAAUABwAHAAUABwAGAAQABgAGAAYACAAIAAcABwAFAAcACgAHAAUABwAGAAUABQAEAAQABQAEAAMAAwADAAMAAQAAAAIAAgABAP///v////7//P/7//r/+f/5//b/9f/2//X/9P/0//P/9P/0//L/8P/w//H/8f/v/+7/7//v/+7/7P/s/+3/7f/s/+z/7P/s/+z/7v/t/+z/7v/u/+z/7f/w/+//7f/w//L/8P/w//L/7//x//P/8v/x//L/8v/z//P/8v/0//L/8f/2//j/8//2//v/+P/4//v/+//6//v/+f/4//r/+f/5//r/+v/6//r/9//6//7/+f/6//7//v///////v///wEAAAAAAAEAAAD+/wAAAgD///z//v/+//v//P/+//v/+v////7//P////z//f8BAPv/+f/8//n/9f/0//L/7//r/+r/6f/l/+P/4v/e/93/3P/Z/9j/2v/Y/9j/2f/X/9j/2v/Z/9j/2P/b/9v/2v/Z/9r/2//c/9v/2v/c/97/3f/d/97/3//h/+L/4v/k/+f/6f/r/+3/7f/v//H/8v/z//X/9v/2//f/+f/6//r//P/8//v//f/+//3//P/9/wAA///+/wAAAQD//wIAAwACAAUABQAEAAgACAAGAAoACgAIAAkACgALAAkACwAOAA0ADQAQAA8ADwASABEAEgAVABYAFwAZABoAHAAdAB0AHwAiACEAIwAoACcAJgArAC8ALgAvADAAMwA1ADYANwA4ADsAPAA8AD4APwA+AD4APgA+AD4APgA+ADwAOwA8ADsAOgA8ADwAOwA7ADsAOgA6ADoAOQA3ADUANgA1ADIAMgAwAC4ALQAqACkAKAAmACQAJQAjACEAIAAiAB8AHQAeAB4AHAAbABoAGQAYABgAFwAUABMAEwAQABAAEAALAAwADAAJAAkABwAGAAYAAgABAAQAAwAAAAAAAgD///z//v/8//r/+//4//f/9//1//T/9P/z//P/8f/v//D/8P/v/+//7//u/+7/7v/s/+z/7v/r/+r/7P/q/+n/6v/p/+n/5//n/+j/5//n/+j/5//n/+j/6f/p/+r/6P/p/+v/6P/o/+v/6v/o/+j/6P/n/+j/5//n/+b/5v/m/+X/5v/m/+T/5f/n/+X/5v/n/+b/5//o/+f/5//m/+b/6P/p/+f/5//n/+f/5//n/+j/5//l/+b/5//m/+f/5v/l/+b/5v/n/+j/5//n/+j/6P/o/+f/6P/q/+f/5//p/+j/5//o/+f/5v/m/+b/5v/l/+T/5v/l/+L/4//j/+L/4//j/+L/4//k/+P/5P/k/+P/5P/k/+P/4//i/+L/4//i/+D/4v/i/+D/4P/h/+L/4f/h/+L/4//j/+L/4v/l/+X/4//m/+f/5P/m/+n/6P/n/+r/6//p/+n/6v/p/+z/7P/p/+z/7//t/+//8f/x//H/8//1//b/9v/4//n/+P/7//3//P/9//////8BAAEAAAACAAIAAgAEAAUABAAFAAYABgAHAAgABwAHAAoACgAJAAkACgALAAwACwALAA0ADQAMAA0ADQAOAA8ADwAPABAAEAARABIAEwATABQAFQAVABUAFgAXABcAGAAZABkAGQAaABsAHAAbABwAHQAcAB0AHwAeAB8AIAAgACEAIgAhACMAJAAiACQAJQAkACUAJQAkACYAJgAlACYAJgAmACcAJgAnACkAKQApACkAKwArACsAKwAsAC0ALgAtAC0ALgAuAC4ALQAtAC4ALwAwAC8ALgAxADEAMQAyADEAMwA1ADQANQA3ADYANgA3ADgAOAA4ADkAOgA6ADoAOgA5ADkAOgA6ADgAOQA6ADoAOAA4ADgANwA2ADcANQA1ADYANAAyADIAMQAwADAALwAsACwAKwApACcAJQAjACMAIQAeAB0AGwAYABcAFgATABIAEAANAAsACQAHAAYAAgABAAEA/P/6//v/9//0//P/8f/u/+z/6v/n/+X/5P/h/93/3P/b/9j/1f/T/9L/z//L/8r/yf/G/8P/xP/C/77/v/+9/7n/uv+3/7T/tv+y/7H/sv+w/67/rP+q/6v/rP+o/6f/qP+n/6f/p/+l/6b/pv+m/6b/pf+l/6b/pf+m/6f/pv+m/6b/pv+n/6f/qP+n/6j/q/+r/6r/q/+t/6//sP+x/7L/tP+2/7f/uP+5/7z/vv+//8D/wv/D/8X/yP/I/8r/zP/N/8//0P/R/9T/1v/W/9n/2//e/9//4f/k/+X/6P/r/+r/7f/w//D/8v/0//T/9v/4//n/+f/6//7//v/8/wAAAwD///7/AgACAP7/AQADAP//AQADAAAAAgACAP////8AAP3//f/9//v//P/7//f/+P/2//P/8//z//H/8f/v/+7/7v/u/+z/7P/t/+v/6v/r/+r/6v/q/+n/6f/q/+r/6v/p/+r/7P/q/+3/7v/s//H/8//y//b/9//6//7//v8BAAQABwAKAA0AEQAUABUAGgAfACEAJQApACsALgAzADYAOQA9AEMARwBJAE4AUwBVAFoAXwBhAGcAawBsAHEAdgB3AHoAfwCCAIQAiQCMAI0AkACTAJUAmQCaAJsAngCgAKMApQCmAKgAqgCrAKwAqwCrAKwArQCuAK4ArACsAK0AqgCnAKoAqAChAKMApQCeAJwAnACXAJcAlQCQAI4AigCFAIIAfQB5AHYAcABqAGcAYQBbAFcAUgBOAEkAQgA8ADoANAAtACcAJAAeABYAEgANAAYAAQD8//T/7f/p/+L/3P/X/8//yf/G/7//uP+1/7D/qf+k/6D/nP+X/5H/jf+I/4T/gP97/3f/dP9w/2z/af9k/2D/YP9b/1b/VP9R/07/TP9K/0j/RP9C/0L/P/8+/z3/Ov86/zr/OP83/zj/Nv82/zf/N/84/zn/OP86/zz/PP8+/0H/Qv9E/0b/Sf9L/07/Uf9V/1r/XP9d/2P/af9q/2//dv95/3v/g/+K/4r/jf+Y/5z/m/+k/63/rv+1/7z/vv/I/8//0f/Z/+D/4//q//H/9v/+/wMABQAPABUAFgAdACUAKQAvADUAOQBCAEgASwBSAFkAXQBhAGcAbQBzAHcAfQCBAIQAigCQAJEAlgCcAJ4ApACoAKkAsAC0ALUAugC9AMEAxQDGAMkAzQDOANAA0wDVANcA1wDYANsA3ADcAN4A3ADbAN0A3ADbANsA2wDbANgA1wDXANQA0wDRAM4AzQDLAMYAxQDDAL8AvAC6ALYAsgCvAKwApgCgAJ0AmgCVAJAAiwCGAIEAfAB2AHIAbQBmAGIAXgBWAFEATgBIAEEAPAA4ADEAKgAnACIAGgAWABEACgAFAAAA+f/z/+7/6f/j/97/2f/U/9H/zP/I/8T/v/+9/7z/tf+x/7P/sf+t/6z/qv+o/6j/pf+i/6L/of+e/53/m/+Z/5f/lf+U/5T/kv+Q/5H/j/+P/43/iv+J/4f/h/+G/4L/gP9//3v/ef92/3L/cP9u/23/av9l/2P/YP9e/17/W/9Y/1j/V/9V/1T/Uv9R/1H/T/9N/0v/Sv9K/0r/R/9G/0b/Rv9F/0T/Q/9E/0P/RP9E/0L/Qf9D/0X/Q/9C/0T/Rv9G/0X/R/9J/0v/Tf9O/03/Tv9Q/1H/Uv9T/1X/WP9b/17/YP9j/2f/a/9u/3H/dv96/3z/gP+G/4j/iv+R/5X/mP+e/6L/pv+r/7D/tf+6/7//xv/L/87/1P/b/9//5P/r//D/9f/8/wEABgANABIAFwAgACUAKQAwADgAPABBAEYATABSAFcAXABgAGQAaQBuAHMAeAB7AIAAhgCIAIwAkgCWAJgAnQCiAKQAqACsAK8AswC1ALkAvAC/AMIAwwDGAMsAzADOANIA0wDVANgA2QDcANwA3QDgAOIA4QDiAOQA5ADlAOUA5gDnAOYA5gDnAOcA5wDlAOUA5gDkAOMA4gDgAN8A3gDcANoA1wDXANYA0gDQANAAzQDMAMoAxwDDAMEAvwC7ALYAswCxAK0ApwCjAJ4AmACVAJEAigCFAIEAfAB4AHMAbABoAGMAXQBYAFEASwBGAEAAOAAzAC0AJgAgABoAEwAMAAYAAAD7//T/6//l/+L/2v/R/83/yP+//7n/tf+u/6b/ov+f/5b/kf+O/4j/hf+B/3n/ev94/3L/cP9u/2r/aP9l/2P/Yv9h/17/Xf9c/1z/XP9d/13/Xf9d/1//YP9g/2L/ZP9m/2n/bP9u/2//c/93/3n/ff+C/4X/iv+Q/5P/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';\n\nconst PCM_DATA2 =\n  'eQVdBWoFjwV8BfkERQTYA/ADQwRHBPEDrwO7A/4DQQRiBGcEcAR/BHcEMAS0A1wDZAOKA30DYAOBA7QDkwM+Ax4DQQOCA7YDzgPQA7wDogOpA8IDxwPDA8ADmwNtA3YDxgMUBBwEBwQUBBcE4AOaA5sD1gP1A/4DLARMBEMEfATTBKEERAR+BM0EkQRhBJsE5QQcBVIFcQUvBUkENQPdAnkDQgRgBN0DxgOPBBIFlwQmBIAE5gSeBAAEpAOKA2EDJQP8As8CiAJfAlUCJgLkAfwBVwJwAkYCDwLAAXsBZgE+Ab8AGwC9/8X/3P+y/2z/Zv+Q/3//KP/b/r7+vP6u/nH+E/7R/c393P3P/bD9jf1e/Rz91PyY/G/8WPxl/Jb8rPx0/C78RPyL/Jn8dvxV/Dr8JvwU/Pz74fvH+7f7wfvP+8370/vz+xH8JfxH/Hr8ivx3/If8qPyd/ID8Z/xF/C38SvyF/LD8zfwD/U79h/2Q/Yj9pv3a/fH94/3P/d/9AP7w/cz98/1N/n7+hf6W/sf+G/9z/6v/yf/m/w0ALwBEAFgAbABgAFUAhQC7AMIAxQDmABABPgF8AbwB7QEIAioCYAJ6AmUCWQJ3AqACrAK2AtEC3gLZAs4CvgLLAvsCHwMdAwYD/gIUAykDIwMVAyoDUwNeAzcDCAP5AvwC4gKjAmoCUAI3AgoC2QG4Aa0BqgGWAXcBXQFHAS8BFgEDAfAAyQCJAEMAAAC2/2H/Cf+5/nr+R/4b/vH9yP2l/Y39d/1X/TL9Cf3R/If8Nvzs+6D7Tvv7+qf6V/oe+vb5vPl8+Vv5Svkj+e34yfi7+Kj4d/gw+Oj3qvd490n3DPfO9pz2aPYz9hf2B/bv9dr10/XL9bz1n/WH9X71e/Vx9WP1UPU/9S71GvUE9fX05fTX9Nf05/Tx9Pb0BfUk9Tr1QvVO9W71kvWt9cT12vXo9fH1CPYw9kT2TvZq9on2nfa79uz2JPdV94L3sPfl9xz4UPiH+MX4/fgs+Vj5gPme+bf51/kF+j76evqw+uf6Kft0+7n79vsq/F78lvzM/AD9Of1z/aj93P0a/lH+eP6i/tz+E/9C/3n/uv/7/zwAegC3APIAKwFiAZoBzQH6AScCVwKHArYC5AINAzIDXAORA8cD8wMcBE8EigTABO8EHgVPBXoFoAXKBe0F/QUPBj8GZgZyBo0GuQbZBvcGHQdCB2IHhQeqB9EH8gcHCBsIOwhYCGUIYQhaCF0IaAhoCGUIbgh2CHUIfgiZCLYIwgi/CMUI2QjkCOAI1AjGCLYIqgiaCIQIaghZCFMITQhDCEEIPwg4CCwIHggVCBEIAwjxB90HwwepB5oHjAd7B2YHUAc9BygHCAfvBuYG4AbOBroGrAahBowGdwZoBlwGSwYzBhgGAwbyBd4FwQWsBaoFrgWdBYEFagVbBU0FOQUiBRgFEgUBBewE2wTSBM8ExgSwBJcEjASGBG8EUgRDBDgEKAQaBAsE9QPjA9cDzAO+A6wDmAOKA4ADcwNgA0UDKAMWAwID5QLRAsYCsQKbAowCdAJXAkMCMgIeAgkC8QHYAcEBsQGlAY8BcAFgAVQBLQECAecAzQCuAJQAgABrAFQAOgAoABwABgDs/97/z/+w/5D/eP9f/0H/Jf8L/+7+1/7L/rr+o/6R/n3+bf5i/lD+N/4j/hD+AP7x/d/9zf27/aH9jf2C/W/9Wf1P/Ub9M/0i/R/9HP0T/Qb9/vz7/Pb85PzP/MT8wvy9/K/8oPyd/J/8l/yM/In8ivyM/Iv8iPyI/In8h/yI/Ir8ivyJ/In8jPyU/Jf8lPyS/Jb8nPyk/Kv8sPy0/Lr8xPzP/Nb82/zi/Oz89fz9/Aj9Fv0e/Sf9Nv0//T/9Sf1V/Vr9Yv1z/YL9jf2b/ar9uP3F/c/92P3l/fD99v0A/gz+Gf4l/iv+Mf4+/kj+T/5W/l/+Zv5u/nf+hP6P/pX+mP6h/qv+rv6w/rH+sv60/rX+tf6y/q3+qf6q/qj+pf6k/qP+pP6n/qj+qf6m/pz+lf6O/oL+eP5r/mD+V/5O/kf+RP5A/jr+Mv4t/iz+Jv4e/hb+Df4L/gb++v3r/eD92v3Q/cP9vf22/an9n/2c/Zb9jf2E/Xv9c/1t/WX9Wv1R/Uj9Q/1A/Tj9LP0j/SD9IP0c/RH9CP0F/QL9+fzz/O786vzq/Ov87vzx/PL89Pzz/PD87/zx/PL88vzt/Ov86vzm/OH84vzf/Nv83fzh/N/83vzg/Ob86vzt/PH89Pzx/Pb8/Pzz/O/89/z2/O788fzz/PD88fzx/PX8//wE/QX9Dv0W/Rz9Hv0f/R/9Iv0i/SP9Jv0q/S79Mf0z/Tr9P/1B/Ub9Tf1U/Vz9Yf1p/XL9e/2C/Yv9kv2a/aD9p/2u/bX9u/3D/cf9z/3c/eb97v33/QX+GP4l/iz+N/5H/lv+a/51/n/+jf6c/qz+uv7E/s7+3P7v/gD/Ev8o/z3/UP9o/4D/kv+k/7v/0P/h//b/DgAhADQATwBoAHsAlQCwANAA8wAMASIBPAFXAXQBkQGtAc8B7gEHAiACQAJbAnICkwK6AtUC8gIVAzUDVANxA4wDqQPEA90D9AMKBCQEQQRaBHEEjQSpBMIE3QT2BA8FJwU+BVMFawWABZUFqQW9BcwF3QXzBQgGFgYlBjYGRwZYBmwGegaBBpAGogarBrUGvAbDBtAG3AbiBusG8gb3BvwG/Qb+BgQHCAcKBwgHBgcGBwgHBgcGBwQHAQf7BvcG8wbvBuUG4AbgBt0G0wbFBr0GugauBqEGlwaOBoUGfAZvBmMGVwZMBkEGNQYmBhoGDgb/BewF2AXGBbYFpQWPBXkFZgVSBUAFLwUdBQkF+ATlBNMEwQSsBJUEfwRpBFMEOwQmBA4E8QPYA8cDrQONA30DcQNXAz4DKQMTA/8C6QLNArQCmQJ9AmYCTwIzAhkC/gHkAdIBvAGeAYUBcAFbAUMBKQEQAfoA4gDIAK0AlAB4AFoAQQAoAA4A9f/c/8P/q/+S/3j/X/9H/zD/Gv8D/+n+z/67/qb+j/54/mP+Tf42/h7+Cv71/d/9yf2z/Z79i/16/Wn9WP1I/Tn9Kf0X/QT99Pzo/Nn8y/zA/LD8oPyW/In8efxp/F78VfxM/EL8Nfwq/CX8H/wY/BL8CfwB/P379/vt++T73/vb+9T70fvP+8b7wvvC+8L7v/u9+7v7uvu5+7n7tvu1+7P7svu0+7j7tvu1+7v7vvu/+8P7xfvF+8n7y/vN+837zvvS+9X72fve++H75vvs+/L7+Pv5+//7CvwO/BL8Hvwi/CH8KPww/DP8Ovw+/EH8SfxR/Fj8Yvxp/HD8d/x8/IL8ivyN/JD8l/yc/KL8qPyr/LT8u/y//MT8y/zR/Nb82/zj/Oz88fzy/Pb8/vwE/Qb9CP0N/RT9Gv0e/SD9JP0r/TL9N/08/UL9Sf1O/VD9U/1Z/V/9Yv1j/Wn9bv1x/XP9eP19/YD9hf2K/Y39kP2U/Zn9nv2h/aT9qf2t/a39sP22/bj9u/3B/cX9yf3O/dL92f3g/eT96P3w/fb9+f37/QD+Bf4J/hD+GP4X/hv+J/4s/i3+Nf4//kT+TP5X/l3+Y/5o/m7+df59/n/+hP6M/pP+nP6i/qf+sf68/sL+yf7V/t7+5v7v/vj+AP8H/w3/F/8f/yT/Kv80/z7/Rv9O/1j/Yf9p/3L/fP+F/4//mP+f/6n/sv+5/8P/zf/V/+H/6//0//v/AwANABYAHgAnADAANgBAAEsAUgBdAGgAcAB6AIAAhwCTAJwApQCxAL0AxwDOANkA5QDsAPMA/QAHARMBHQEkAS8BOwFFAU4BWwFlAXABfAGGAYwBlAGfAasBsQG3AcEBygHSAd0B5wHvAfsBBgIPAhoCIgIrAjUCPAJEAkwCUwJdAmYCawJyAn8ChwKJApQCpAKpArACvALFAswC1QLcAuMC6QLtAvQC/QIEAw0DEwMYAyEDKgMwAzcDOwNCA0oDUANTA1kDXANfA2UDawNsA24DcwN6A3wDfwOEA4YDhwOMA40DjAOQA5IDkQOUA5QDkwOXA5kDlwOZA5sDmwOZA5gDlgOVA5MDjwONA4oDiAOGA4MDgQOAA3wDeQN0A28DbANmA2EDXwNeA1gDUQNMA0YDQQM7AzUDMAMpAyQDHgMYAxMDDAMGAwID+wL1Au8C5wLfAtgC0QLLAsUCvQK3ArICqgKiAp0CmAKPAoYCfwJ4Am8CZwJgAlgCUAJJAkMCOQIuAikCIwIYAhACCgIAAvgB8QHoAd0B1gHMAcIBuwGyAagBoAGYAZIBigF+AXgBcgFnAV0BVwFQAUUBPAEzASoBIQEWAQwBBAH6AO8A5wDfANQAygDBALkArwClAJwAkwCIAIAAdwBrAGIAWQBPAEYAOQAtACQAGgAPAAUA/P/x/+f/3f/T/8j/vf+0/6r/nv+T/4b/e/9x/2b/W/9Q/0X/Ov8v/yL/Ff8K/wD/9P7o/t3+0/7H/rr+r/6k/pr+kf6G/nv+cf5m/lz+Uf5G/j3+M/4p/iD+F/4N/gP++v3x/ej94v3Z/c79x/3A/bn9sf2p/aH9mf2Q/Yn9gf16/XT9bv1o/WH9XP1Y/VL9Tv1K/Ub9Q/1B/T79Pf06/Tb9Nf0z/TD9L/0t/S79LP0s/S79Lf0t/S/9Lv0u/TD9Mf0y/Tb9OP05/Tv9Pf0+/UH9Q/1F/Ub9R/1J/U39Tf1N/VD9Uv1U/Vb9Vv1a/V39Xv1f/WD9Yf1i/WP9Zv1n/Wj9a/1w/XX9eP12/Xj9e/18/X39fv18/Xv9e/19/X79ff18/X39ff18/Xr9eP14/Xj9d/13/Xf9d/13/Xf9dv12/Xb9eP15/Xv9ff2A/YL9g/2E/Yj9i/2O/ZH9lf2Z/Zz9oP2l/ar9sP23/bz9wf3G/cr90f3Y/d795P3r/fL9+/0D/gz+Fv4d/iL+LP43/j7+RP5O/lf+Xv5n/m/+dv5//oj+kv6a/qH+qv6z/rn+wv7L/tH+2P7i/un+7/73/v7+Bf8P/xT/Gv8k/yv/L/84/0H/Rf9K/1L/Wv9g/2b/bf9y/3j/gf+H/4z/lf+Z/57/p/+r/7D/uv/A/8P/yf/R/9f/3f/j/+n/7//2//v/AQAIAA0AEQAYAB8AIgAnAC4ANQA8AEIARQBKAFEAWABfAGMAaQBwAHYAewCBAIYAjQCUAJoAoACmAKwAsgC4AL4AxgDNANQA2wDgAOYA6wDyAPgA/QAFAQwBDwEYASABJwEtATMBOwFCAUgBUAFWAVsBZAFvAXEBdAF/AYcBiAGQAZgBmwGkAa0BsQG4Ab8BxAHMAdIB1gHbAeIB5wHuAfQB9gH8AQQCCAINAhICFwIcAiICJgItAjMCNQI5AkACQwJFAksCUQJUAlgCWwJfAmQCaQJqAmsCcAJ1AncCfAJ/An8ChAKIAogCigKOApACkgKVApYClwKZApsCnAKdAp4CnwKgAqQCpAKkAqYCpgKkAqcCqAKmAqcCqgKqAqgCqAKqAqgCqAKqAqgCpwKoAqUCpAKkAqECngKfAp0CmwKbApkClQKUApICkAKOAooChQKDAoACfAJ4AnUCcgJtAmgCZAJgAlwCVAJNAksCRwJAAjoCNQItAiYCJAIdAhACDQIMAgEC+gH1Ae0B6AHkAdsB1AHNAcUBvwG5AbABqwGjAZkBlQGPAYUBfQF4AXABaQFhAVgBUwFOAUMBOgE1ASwBIwEcARYBDgEGAf8A9wDwAOkA3wDXANIAywDCALwAtACrAKUAngCVAI4AiQCBAHkAcgBsAGUAXQBVAE8ASQBDADsAMwAtACYAHgAYABEACAABAPv/8//s/+b/3//X/9H/yv/D/7r/s/+t/6f/oP+X/4//iv+D/3v/dv9v/2f/Yf9b/1P/TP9G/0D/OP8x/yv/JP8e/xf/EP8K/wT//f73/vD+6f7i/tz+1f7O/sr+xf68/rb+sv6t/qb+oP6b/pX+kP6M/oT+fv55/nT+bv5p/mT+Yf5b/lb+Uv5O/kj+RP5C/jv+Nv4z/i7+Kf4m/iH+HP4a/hT+Dv4N/gr+BP4A/vz9+P30/fH97v3s/ef94/3h/d/93P3Y/dX91f3S/c79zf3K/cj9x/3D/cH9v/2+/bv9uf25/bj9tf21/bT9tP20/bP9sf2w/bD9sP2v/a79rv2w/bD9r/2u/bD9sf2y/bP9s/20/bb9tv23/bj9uv27/b39vv2+/b/9wv3D/cX9x/3J/cz9zf3O/dD90v3V/dj92v3f/eH94f3l/en96/3u/fH99P33/fr9AP4F/gb+C/4P/hH+Ff4c/iD+Iv4n/i3+MP41/jv+P/5F/kn+TP5S/ln+Xf5h/mb+a/5x/nX+eP5+/oT+if6O/pP+l/6c/qL+qP6t/rL+tf68/sL+x/7L/s/+1f7c/uH+5v7s/vL+9/77/gD/Bv8L/xH/F/8b/x//Jf8p/y7/M/84/z3/Qv9H/03/Uf9U/1n/Xv9j/2f/bP9x/3n/f/+C/4b/if+O/5X/mv+e/6L/qP+u/7P/t/+7/8D/xv/L/8//1v/b/97/4//p/+3/8f/2//z/AwAKAA8AEwAZACAAJgAqAC4ANAA7AEEASABMAFEAWQBgAGYAbABxAHcAfgCEAIsAkQCYAJ8ApwCsALIAugDCAMYAzQDVANoA4QDpAO8A9gD8AAIBCgERARUBGgEiASkBMAE2ATsBQQFIAU4BVAFYAV4BZQFrAXABdQF7AYEBhwGNAZEBlgGaAaIBqAGtAbIBtwG7AcIBxgHKAdAB1QHYAd4B4gHmAesB7wHyAfcB+gH+AQICBQIIAgwCDwIQAhMCFwIaAhwCHgIhAiMCJQInAikCKgIsAi0CLgIuAi8CLgIvAjECMwIyAjECMAIvAi4CLQIrAikCJwImAiMCIgIfAh4CHAIZAhYCEwIQAg4CDAIJAgUCAQL+AfsB+AH1AfAB7AHpAeYB4QHbAdUB0QHPAcsBxwHCAb0BuQG1AbABqgGlAaEBnQGYAZIBjQGIAYIBfAF1AXABbQFmAV8BWgFVAVABSwFDATwBNgEvASsBJwEfARgBEwEMAQYBAQH8APQA6gDjAOEA2gDRAMwAxwC+ALoAtwCtAKMAnwCaAJQAkACJAIIAgQB6AG8AaQBiAFkAVQBTAE8ATgBGAD0AOAAzAC4AJwAfAB0AGgAWABMADAAEAPv/9f/1//L/7//x/+z/5//k/97/2P/Q/8//0v/J/73/tv+6/8T/v/+5/77/t/+q/6j/q/+l/5z/of+n/6D/oP+h/5T/jf+O/4//j/+J/4D/gv+I/4D/dP9+/4P/cv9z/3z/a/9c/17/Xf9e/3P/iP9+/2v/af9V/0D/Sv9O/0T/Uv9n/2P/Vf87/zT/Qv8n/yH/Q/82/zD/UP9V/07/Pv8Z/wj/Ev8Z/yf/Sf9R/zL/Hv8c/xX/Ff8T/xj/Ov9O/zz/Kv8k/yT/Kf83/0T/Qf8+/z3/Nf87/0X/O/8t/y//Pv8w/xr/PP9a/1b/hP+w/33/Ov8x/yT/Cf8c/0H/Pf8g/xz/Lf8x/zr/UP9G/y3/Tf98/0z/9v4g/3z/c/9M/zz/Zf+o/3H/L/9B/xL/5f4X/zT/PP97/7H/Yf/k/uP+CP/k/uX+R/+3/+7/0f95/yL/Cv8H/w//lf/f/1f/F/8F/1L+TP6v/9AAegBq/4D+4v3H/d79sP1O/lgAGwIiAicBrACnALf/AP4y/U79hv2l/hAA8f94/xIAMgAg/zn+F/6k/lL/LP8p/y4ArAAUAJP/UP/8/tf+rf5o/rj+Vv9d/w3/L/+b/6f/iP9l/xf/Zv8KAGD/O/6n/qD/af/r/ir/wP8nAOT/Nf/o/ov/ewAcAJX/ZAB2AI//H/+x/iv+BP7Y/o8ARgHpAO4A3P9z/bD9GQBjAAIAMAFCAcL/V/+z/4b/h/5A/bL+CgL5AaH/tv/yAF0AEf/6/nEAMQLeAQEAQv9PAE4B5v8G/pb+5P86AYYDdQVJBvkFqgMoAGz9yftB+0b8Kv4NAAIBqwBjAHsAbQAeAIP/2f/sACUBGQEUAfgArQDT/rP86fwT/mb+2P5x/2b/1/8JAb8BxAFPAaUAhQAZAVEBFwBI/rD9+v2L/T39gP78/6QARQETAhQCXQAo/nj9TP6p/yYAMP9j/pX+D/9n/9H+Sv0y/Qf/uwAJA90FOQU2AZ3+jP4R/p/8pPxG/vH/RwGBAYgA1f92/zb/3QDMAzsEuwEv/5v/YAKhASb+fP43AGT/W/9xAEr/Mv6jADcEYwWmAy4BoABqAQsBOP9+/Vn9KP9BAJX/vgDuA3wFcQTFAmgCtgDr+kv3hfypBQAJRgVGAcwA9ABd/oX6kvq1AAcIAAoZBqoA6P3R/o7/Vf59//gC/QILACD/bP/M/WL89P5sBE0HUQUNA4IDeQPV/2H7SvuH/pAAIQH3ABoAMQEvBNUDFQC5/sr/i/8V//MAywKQAWMAJwHf/5n9Hv8wAqcCuwFQAbEB7QFd/2z8UP5JAtADWAQ2BNsB+P6H/H76AftW/W0AUAUICN8EKADO/6ICnwJd/938FvyW/fgAxwIFAhsBUAGlAa8Aj/7x/BT+LAJaBYQEjwGn/zb/h/7G/Vv/YwLtAvv/bP2m/sYAHgHtAnEF1QL7/XD+HAGX/9H8x/0pATkCGAAe//AAeALYAMv9r/5wAqsDggIXAPn9R/5X/lv9QP7OAIAClwF4/6//pQEuAdb+//6lAdgCHgDb/EL+gAHzAQEBRwDi/8L/9P4P/p7+NwCtAXMCugHAAMwB6AK8AIX8V/vu/bv+6f3FAKMDvwHHAYEEcgAs+mz8lwEKAi4B9wHVAdj+9voK+08AxAMvAZ3/KAMrBfkBov2r+5b8eP76/1QCJQThAa/9dP1yANoA7f7//iEBrQLGAaT+evxM/bn/DQIJA70BWv/u/Sv9Pvxl/Ir+JQGkAmcDrwNpAob/ZPwJ+vX5If0nAOj/EAC4AjoCZP7h/hYCDwDP+zb8k/4I//P+V//GAK4CBAKA/pH74fu6/oUA5f9AADQBIv51+jT8sADQAokBqP8+AO4A3f3l+S/65v0mAdYBgQDZ/80AqAFsAC39W/vJ/C//ZwAyAJAAzAEfAEP8zvxHASoC4f7S/EX+zAAmANT9DP9QAdT/Nv2M/Oj8Df/vAo0DQQAy/xABxf8q+zf6Gv8QBPED2P9e/AP8t/2z/+wAKQEAAWYAF//b/cr9C//a/37/q//3/w//w/5iANcBOwFR/9f9Rv2s/BL8Kf05ALADdwXaAwUAaP1n/N/66Pnx+6cAWwSqAuX+e/+jAYQAYP1z/DkA6QMWAVr7pPuuAc0Dhv+s/H39e/04/Jz8uf+jA4gEiQHu/gn/B/92/W39KgKCBk0CyvpJ+er6pfrL+ir+3ANCCM8G5QDd/IH8C/0N/N36j/18Av4DAAM8As3+f/ox++L9L/4q/xQDfgY9BbgAk/3h+5r5s/mv/t4CQwHd/oEAnAK9ATP/cv1Y/k4Ax/9T/ncAuwSaBfUBmPw/+H73C/vV/tL/IQKrBqgGLANpA28DIP5N+0z+Tf6x++f+9QLIAOv+rABOAS4AJf9V/+UAAwLXAisE7gKK/x3/kP8z/rn+ZwAwALX/fwHoA8gBb/36/t8DHQN5/sn+sAIWAigAhgMZBVL+jPgg+63/DQFxADMAXAMPCN4IbwU7AHP73vrC/mgAgv2u/awCGwTrAP3/FAE5AJL/OgFkArMCAwS2AoD90fu6AK8GjQYS/j326/iZAeUFXwOL/pj9DgIoBUADKwE3AS4CfgOSA34AJvtP+CX6l/zl/XEBXAbCB78FPgPaAYICKgKG/dn5Bf1SAuwCl/8o/U3/yAPJA63+jvuH/tECFgL3/iYBQwdkCHwElAIEAQ77MPb596X7NP4qA7cH0gY+A9P/7v4VAqkD7AFbAu4DmgH0/Hr6Pfoo+w/+0gH2A3QEogRPBWwF6gJf/+7+owDs/0X93P3bAbcCjP00+PX5rwDtA6gD5QRJBbADFgUPBlgAuvtv/ikAxfxq+s78bQFpAzUByf/5AOX/sP14/8QDDgekB2oFcwJr/wz7eve9+OH9dALgA/ECyAEBAR8B4AFLAaAAggJ0A1kA2P3I/dH8UPyl/TD+U/6nALMELQeQBQ0Bev0F/SL+EP9PALwBCAK1AIr+Av4i/4n9ufnE+dX9ywFKBi4LBAvoBOv+SfyB+sT3qPb9+VT/kgGqABwBSgNvA3kBqQA9AoMEDwS7//X6dvn/+vL7tvuh/e4AZgLDAZT/U/1F/ZT/GgKmApYCCATqBFMD0AAi/rz6+vdo96v5eP7cAgQFewWtA9IAs/9HAJAB5QLWAQz+afvC+3P9af35+kL8wQIqBgsELwKoAloCJQCD/kv+B/6y/Sb+AP+u/14AAQG9AKv/JP8Y/6z+f/4mAWcHbQpjBYX+KvrC9gD2Xvno/eEApwJrBMYFNQWoAXf9d/2kAL8BuQAwAGX/I/3E+p36Bf1M/+IApARkBwYELwD4APz/Ffut+XD80/1n/7ADJwYtBCEA/vs++mr7wPu9+wIAfQWlBn0FrAMrAPD8lfvx+zv9A/4m/pT+e//b/zj/Jf8jAMoA4ABKASsCiwEQ/rH77/1bAO7+sv0m/8D/Y/8AAZcC2wFDAUUBLf+2+536Kf0qACYB1AGAAsUAE/1V+l/6yf28AkAFPAXoBbMGIQRO/lD5v/dN+Wb9DQImBGEDFgEc/sX7/fu1/sEA+gEYBZYGxAIQ/zv/7f5A/eL9IwBCAW8AjP4P/sn+k/62/goApv82/gkAeAOtA30BHAA5/7P9tPzL/OL9ZgG2BSQGwgJC/7X84/rY+lP8Q/0H/p8A+QJ1AQr+0f31AMMC9gHHAZEC/AEmAAH/Q//q/mP8XPp/+8/9of4C/7EARgJLAnUBNABD/34ASQKuAP39U/5S/37+afy1+23/ZgMrAm//cv8VAJj/e/+6/8z+S/28/P78wf0fAJACPwKBAUMCuAE4AL8A8QFFAiAC1P98/Yj+Uv64+rD5b/x3/ub+QAD2A6EIsQkHBX3/4/3V/iP///5lACQCDAAx+4P6K/6a/+H+SwHOBfAGlQRoAhgBCgAr/779dvyx/L79i/4d/zEAkQLNBAIEzAAT/xsAqwHRAfAArAAvASwBxv+p/Zj8mvxS/Y//2AGqAgwDgAP5A4IDLAHc/4YBEQId/+b8bf1x/RL8eftO/Nn+EAPmBSYFlAOAA28C1f4M/HH8h/23/WH/lwLjA/sCigFq/6T92f3t/n//GwAkAQUCdQHg/jn9ef//AbsAFf9f/5b+XfzS+r/7/v/hBCIHSgYQBC4CJAC8/fn7hfp0+aL6F/63AZYEMgYQBrwELwLQ/+b+Yv12+2f7b/3UABID1wIWAqUBOAHBAOz/2v5G/jX/RgHAATwAsAAnA1oD1gJnBGUEmAA5/B76qPqW/CH+y/+YAiYFoAbcBnYElwC5/lX/KQD+/0X/e/8MAaMBRQCA/+EABAJbAPn9IP4SAPgBYQNmAwcCMwHwAGH/9v1W/3oBHgLFAs4CDQCg/IX7fvwB/wUCigNkBCEFnQPA/wf8lftr/jMAhgCjAh0EXAF6/pD/2AA2//79Sv+0AIoABgA5AZwCBgHP/rj+Df5p/I39lgFTBLkD2wHNAIMAbgBXAGX/Jf6w/i8AGAAV/uv7QvyC/vD+0f5HArEFogPfAIYCbAKh/Zf7gv06/lv9mfy1/QQB9AJeAjYCJwK3/0f9bv1S/S38gP0eAL3/jP9dA0AFCQLc/20AJwCZ/4z/Nf75/JT9of5x/zr/X/3y/Eb/VQB9/lH98v76AbcDSwJEAIgBMQMZAbL+Fv+E/3b9ZfpL+sv9xgDVAMH/2P8mAYwBBQBW/5oAlAAs/7v+sP6g/lL/IQCWAG4BWAJGAjUBCAB5/7b+Nf0A/an+h/9H/woA0QDk/73+Of88AWMCZQEYAZACmwJ9ABD/6v5J/uT9+/6k/8L+JP6M/jn/CgALATcCUwMXA1QB3v/9/g7+DP4E/2L/1f4N/+f/hf4l/Bj9cwCtAjYDvgLYATUBlQBS/+X9Hv0z/Qv+7P5D/wkAWgE/AdX/df9TAMkAUQC2/73/XwCkAI3/Df7u/aT+m/4s/qL+8v+RACUARQDyANkAZgC3AEcBpgDr/sD94f2f/ij/2v4S/pD+OQC/AFwAfgATAfABQwKlARMBZgDA/kr8k/p++1v+swC1AfkBwgFJAQIBigBA/z/+T/+2AaMCRAF0/7T+uv4i/sr8lvwt/g0ANQGjAX0BSwGPAbMByABL/47+v/4Y/zv/b/+z/47/Ev/Q/vb+hf9+AFMBdQELAWEAd/9p/qj92v0D/18AfQFcAgkDZgOSAiUAmv3k+6T6cftg/14CbQE4ADABZQE1ADgAzABQAEAAIwFyASgBmwB4/5L+v/5b/8//9v/I/7H/pf+j/yMAIQB8/7YAkANFBGACvQAAAP7+hv3C/Lj98f71/nP/lAExA8ECCAIoAo8BNgD2/1gA4v+B//b/EwBz/3b+L/4HAD8C1gKsAgMCpABd/2r+Ff5k/4oBkAJpApkBTQDy/gH+S/5a/7z/6P+9AJ4BBgLvAW8BMQGzAJ/+B/2A/ngAAwBY/6IA5wHcAcUBawGw/yP+g/5H/9n+O/5N/gr/mQAgAgECRwA//y8A8AAZAEn/Kf/U/o/+/P7e/zQBpQLpAn0BUP8j/ln+H/4X/Vv9qf9tAtADxgLaAPcA1AEQAP/9Hf8ZAGb+mv0u/4MAjgBaAKYARQFcAagA+v/2/+AAogHKAAMASgCI/xn+bf4oADsBBQGBAIYA9v+h/UX8G/9SA2QEcANOAwoDTwFB/9v9PP01/e38Hv3O/iUAZQC+ASIE7AREA8QAa/+L/4H/Sv90AJYB6wCuAHcBBwAa/WT8X/3N/QH+hv85AisEXASHA5UCgwGp/2v9bPxe/Q3/MAC/ACEBPgHGAB8ACQAuAKz/yv7M/hkACwGCANT/CgCGABcAkP4J/ov/GAG/ATwCvwGh/9P9t/0K/hH+5/7uALYC3QKqATQAxv4Z/b373vuU/Yv/sQBzAXcCVAPgApEAJ/7B/Yv+uf6m/qD/YAFEAqoBYAAU/wr+b/37/Nj8aP62AcYD9gLSAe4BMwGs/kz87/uR/ev/pgHJAeAAegBqALb/rP47/h7/owAkAasAYwBDAI//av7F/WX+mP8SAFgANgECAhgCVgE2AK7/cP+Z/tD9Df7H/nX/YwBNAUQBHAAh/2H/GgAsAJX/KP+6/98ALAFkAA8ApgAzACr+CP2Y/UT+rv6Q/wQBhAIRBCkFnAPe/0X9g/xG/Eb89vxv/qD/yv93ADsCgAL0AMsABgKaAbD/j/5q/j7+gv30/Bb+IADiAAYBNwIUA9EBiv9g/tf+Pf+T/uj+HQF2AnIBCwCy/1v/yf7X/sz+Z/7//oMA4wG1AmsCzAAo/6n+vv53/pL+nQAlAzID+gE7Aaz/sv0t/eX94f7s/+4AvwGgAQkAi/6F/pj+Ev6h/poAQgK3AloCLQJkAo8BXv83/a78Jv6J/7L/UAChAboBKgB5/iP+NP8DAOr/fADCAS0CpgHjADwAlP/Y/pf+G//g/ysA2f+9/24A2wCz/1X+cP/mAdEBkv9R/zYBlgHq/8z+RP9HAI8A0P9m/00AJgHoAAMA4f57/iX/if+l/7QAgQJoAzICnf9G/jv/HQBp//7+XgABAr8BEwD3/rr+Vf7k/Xj+IQDWAboCzgJtAoMBVQB4/+D+g/6O/qj+jP66/qb/yAASAXkANADCAPUADwBN/7f/jgAGATwBRAHiAAsAP/8g/0f/tP7X/QL+Kv9cABoB+AAMAK//hgDjAI//Vv4l//cA7wHwAZQBCwGcAEIAWP9E/kP+/P5f/0//Bf8E/53/MABBAOH/Rf8J/5L/UAALAdsBzwHRAJsAdAGsAfAAJABL/yn+Mf1b/bX+2P8ZAEIAugASAdcA9v89/5D/UQCeAKwAYACB/x3/9v/uANgA5/8w/53/tAAdAZEAFwB4AB0BpgBq/33/SwCB/zT+c/5J/3//5/81AXgCVQIaAY0AoADN/+n+gf9gAMb/kP6z/vb/xQCnABoA+v9SABAAa/9+/3UA2QFpAk4Buf9q/zAAxv/d/UX9Zf63/oX+7P/lAZwCdQLxASUBjgD0/9n+If7P/hwATQDp/oP9Lf6xALQC5wIDAj8BNAHNAP7+bv3B/bb+/f5f/1gA4AB3AOj/5P8iAD8AWgB/AIgAggCDAHoALwBN/yn+9/0X/yUALwA1AP4AuQGQAbgA+f/B/6n/Mv/j/k7/4P/L//3+z/4fANwAFQANADMBwAGDASgBpgAYAGH/1/5n/83//f6B/t7+OP8+/1r/6/9OAJMAigFSAvABNgF4ADT/VP6c/u3+nv6V/rP/ZQEGAjoBdgBWAOD/3/55/iz/GQA5AKr/pf91AJgAZf+W/ob/KQGsAfIAawC8APIAIgDo/qv+eP/N/03/Xf8VANT/+f69/40B9wEnAb0AvgBmAJ//B/8y/4L/Of9C/+P/7v+i/9n/CwDd/wsAxAAQAX0AxP9x/6L/GwAgAKT/n/9vAOsA8/+y/tf+j/+E/5D/YADSAH8AKwAKAOr/u/+7/yEAVgDS/0f/gP/0/8L/bv/v/84ArAB8/wX/CQCYAKP/Av/T/9AAHQEaAQwB9gB0AE3/Vv4C/jn+7P6F/6L/jf+8/z0AeABuAO0AqwG+Aa0BuAHiAKX/Af94/q/9FP19/WT/TgGCAdIA2ABTAVMBlgCm/4r/UQD9AEoBQgE7AHb+pP1m/mP/V//3/vb/LAJzA4wCngCe/+X/tP8//qD93/77/wEAEgCcAAAB/QDcAMEAvAC1AEsAxf+w/7b/Yv/A/nT+Nf8ZAAoABgAaAS8CvAFhANj/+f/B/4r/w//i/9P/IgAwAB3/df6h/7EAIAC5/7sAwQGoAfUAhQCAADIAUf+v/tL+RP9z/0//Qv/F//sAFwL/ARgBtQAcAT8BPgD+/i7/LQDy/y3/p/9vAGIAXwCnAF0Akv9b/xwABQFEAd0ArADuAI0Anv9x/7D/f/9s/9L/FwA3AJIAuQB2AH8AuwBaAC4AOwGyATEAMP/1/8v/Kf4V/oj/jf/x/i8AgQEGAVQAbwC5AE8AXP+O/9gAFQEbAFz/Hv9u/zAANACq/4L/NP8D//X/wQDI/37+8f6lAEIBx/+m/gUA1QFHAS7/e/7J/4QAKf86/rv/QgGFAOH+mv6V/73/Gv+u/xgBdAGbAJH/vP5M/vr+cQCvAH3/j//nAG8AAv+A/zgAF/+F/kUA1wECAUT/Ov+xAOcAOf9m/oX/ZAARAND/AAD8/6j/i//1/3sAfADS/1H/wf9uAKsArwCRAKcA+wC0AN7/X/9N/wb/oP4U/3cAewEpASkA+P++APMABgBY/9D/pQDpAIYADAAjAJUAYwBd/6z+E/+T/27/m/9zAAIBkQCT/5f/rQAGAWYAFgBHAF8AYwCRAH8A3P8U/5z+c/7A/mf/nP/I//IAIgLtAbsAuP9o/1j/KP85/7P/+/+p/43/VgDLAMn/Wv5R/vL/GwFJAG//WABlAfUA9/93/2f/gv9i/xL/KP+4/yMADAADAI4A9ABVAEv/2P4Z/+r/xACzAOv/iv/Z/wwAmv8Z/0n/7/9ZAGQAhgDzAEMB/gAjAEX/Ev9o/5b/X/8m/1D/xf8cABIAwP+k/0UAPgFjAaAAMwB4AGUAWv9I/jn+sv4p/wEACwFtAe0ANQAjAK8A6gBeAJv/Uf+b/+r/gf+y/uT+VgBeAdQApv9I/9D/KwCm/yv//f9tAasBqQDt/xkAYgDi/8b+Vv4g/7f/Iv8G/6wAtQE4AOL+uv+NADkAMQAsAFH/4v5R/3r/VP+V/1EAHAFNAZoAjP/y/lv/LADm/z7/o/+e/4D+i/4PAL8AHgDJ/08AngDo/1b/IgDQALr/if5n/xwB9gD5/iX+9P9uAQIAEf6G/hQAVQCV/2H/HQDlAOIAXwAWAD8AggBfAL7/If82/7f/mP8G/0j/4f9T/6f+kP/sAE8BLwECAakARAD0/3D/6v4u/8D/N/8d/ir+JP+2/xgA0AAPAeMAZgG9AY8AFP8D/wUAggCr/4b+qf7a/5MAPABk/z3/OwAqATUBxgAHAGT/8/8bAQwB/f+W/0EA0QBEAG//xP+xAMMAXgCNAJoAuv8q/zcAmwEcAUf/5/7bAHMCGQGl/rj+ygByAS4AnP+sAG0B+gDSAFoB/gC8/y3/lP8cADsABwDs/6v/Tf/Y/+wAzADt/2gAngFsAZYAugB1AN/+ff68/8P/N/+HALQBxwAZAJsAXABh//L+Xv8OAOr/ZP/u/7EAIAAv/3f/cQC9APT/I/+J/2oARADE/0AAxAAiAFX/a/+z/zn/Mf6+/d7+1ACqAdMAKAA3AXgC4AFBABn/lf7Z/qb/qv+Z/h3+Of+1AOYANACqAFgCZgIdAPj+QABRAP39Mf1p/4EBbgH8/73+7f41AKQAyf96/44AngGgAecA+v9A/1r///9f/3b9ff3T/1MAiP7R/n8ByALyAd8A3gBwAbMA8/49/kf+1v26/fH+kQDvAJD/bv6G/zUB5gBI///+dAD8AEH/m/0X/pD/OAARABMAmQDmAFAAXv/E/rn+Av9V//7/2ACuAFr/bv7m/tj/5f9A/43/FwG+AX0AGv8P/6r/8v8OABEAeP9+/kn+I/+4/x3/tP4gAEwC8QItAooBUAEGAXYAkf+2/mL+qv4G/63+6f0//iUA4AH3AYEBSAKkA1MDMwGW/7z/YwAKAB3/0/4H/wn/FP+Q/3EAaAHBAVUBZAGfAk8DLgLXAJ4AewCU/6T+vP7V/4gA6f8F/0//uwD/AeMBtgA8AB0BOgIvApoA+v5R/yQB6wHgALT/hP99/+n+nP5b/2EArAA8AOv/ugAaArsBtv9v/3sBJQIYAC/+MP71/gH/dP7b/lYA7wAaAGP/vP83AJX/bP5r/sX/rwDr/83+Kv9EAC8AKP8Q//n/EwD0/hv+P/6l/pr+Qf5h/mj/gQB9AOX/QgAYAVkARP6D/cn+0f8Y/8L9tv3h/lX/dv7//cn+m/+6/3j/SP/N/80A/QAnAHn/f/+c/yf/QP7h/Yv+Kv+2/un9J/4z/5n/Sf+d/+cAwAEUAcv/Wf9v/+P+L/6v/t//4v+c/vz9xv56/yz/uP73/vD/wABFACX/df88AcEBEwDY/mD/Yf/M/QX9Yv4EABIAYP/u/yoBrQBE/4P/XQCU/3X+tf5b/4v/j/8x/5f+7v56AJIBNAFvAD0AgQBcADn/Yv4F/9z/tv9g/3D/4//9AM8BGQEEAGIAkgFzAX3/0/3L/rABYAOUAjYB7ADMAMf/Af+q/8UA7wCoAFkBowKfAjgBlAClAeAC0AIEAtcBZAKRAtEB0AA8APz/7v84ANwAigHKAb4BPQJ2A6QEzgSxA3UC/QGLAX8Aif+k/1cAmQDrALgB/gGdAYgBHAIyA1UEbgT1AoABgwF9Ae7/1v45APEBDQFL/jT9v//oApgCOwDn/9AB9QLIAdn/of/jAa4ECQVNAub+Rf0J/pYArwKvAan+Sv0s/p/+cf1u/Mj9gQHEBG8E1QAO/rT+ZP9w/av8yf4q/278W/su/jUBdwDj/LD6jvr8+Db1NfLb8XL00/nV/2oDcgVuCQ8PpRFCDgcHMgC8+/v3KvOr7i7stuuI7cLxvPcX/ykHig5vEyIVoRSCEk4OvwcoAEn6f/Zq8rPteOqk6v7ulfb2/k8GfAxjEVwUvxUsFlsUMg/FCG8DCf6o9qnuhumg6XHu8/Tg+uYABggND84TDRVkE8IQ7Q15CaACD/vy9PHwg+5Y7QXuPfFF9gH7gf4EAiMGKQmZCSQI4QWcAiX+YfkF9d7wY+286y/sfe5U8vX1yPco+cX7OP6l/lP9n/tQ+rn4/PX98hbxWfBi8GvxrvOa9rP4Tfmb+Rr6gfnG96L2ivZP9qv1zPWK9/D5uftU/aD/3wGfAsgBtQA8AHP/Zf02+9j6RfzV/bL+nf9iAbMD4wXXB/MJRwwJDr0O4w7DDrgNVwuBCEwGSwQkAusAgwGVA48GMgp1DgIT/xbeGeEbyBy5G5QYExQbD44K5AYNBDwCcwIqBT4JCw1PELkTehfiGsAcbRy0GnAYXRXuELYLIAf/AxcCPgFwAXoCdgS0B2oLoA7AEd4UIhaVFIQR9w3hCYIFhgF3/mj88/r8+TD69vuF/lkAawGOA2sG8QasBEQC2gBM/+D8JPoE+ND27fX89Dn0xPOs8xf0xPRU9dj1j/aE9134Ovjl9lL1O/QW81vxeu807qTtZ+0p7Rftp+0J75/wcvEh8V/wCPDr70bvWu7E7WXt5exj7D3soeww7abtIe687g7vlO6U7QTtCu3r7F3sC+yD7J7toe4a70rvi++478rvA/B28NPw6fDO8MDw2PAd8XXxrvHk8ZTy3PM/9TT2sfYX9773d/jb+NL4lPhu+J34Cvln+ar5T/rI+879d/8YAPj/BQDAAL8BjQI+A4sD2ALFAdIBDAMMBHUEaAU7B6sI1QiJCAQJUAqAC+ULuwugC6wLlgu7C5cMcQ1KDQINlA0dDkQOOQ/0EAgS4BFMER4RdxHqEf8RcBGUEAMQ4g+DEJkS3RT+FMETzxN/FKYT8xFwETUShxK+EV8RtxFVEY4QchGLE7MTPxFjD/8PFBFyEBkPEA/PDzIPwg0eDq0PEA/8C1cJEwmqCu8LIwtECfEIHQrUCc8HLAfOCHMK3Qq3CT4GtwEo/7L/owFlAqcBpgEDA4gDRwI2AdMBNwNhA5wBPv8l/X76svd393v6Mv0j/ML48Pcs+7b+I/9C/eP7Y/uC+dr1tfJM8VvxufNN+UMAHAWOBr0GpgeTB3sDy/sw9B3vTuyM6zvtzPCn9Wb7YAFsB5cMFg4aC8EHiAfxBqIBT/q19V30RfQb9IT0r/YW+hn9Xf+kAkgISA6gEZoSpRJpECELaAXVACn8VfcG9HjykvF+8Xb0vfvMBDwMkxEvFd0VahN5D1oKdQMX/Av2XvHw7bfsU+428uP2lfoE/RP//gAGA0EF+gWKAxD/v/rN9ojy/O5X7e3siOzK6/XqCOsc7RTxtvWP+Xz7Q/sp+VT14PAM7pbt7u157T7sfusr7KvtRu9S8cXzWfVQ9Vv0QfPx8VXwGu8V7zLw4fHr81/25fjy+mr8JP2+/MD7Ffu0+hH6AfnN9wD33/aA94L5Qf2SARQFiAf8CEkJ3wilCKcIKAi8Bo4EMwKoAFEAbgD4ADkDMgc1CzEOOxB0EdkRnxEyEaQQgw+DDSELFgnYBxoHTgZlBi8J0g0xEToS2xJpFNwVzhWgFEkTWBEWDrwKDgnoCBMJkgnpCtYMxQ5VEGsRVxLrEl4SZxCVDcMK8Qh2CJ4IwwjDCF0IkgcUB5YHwwicCaMJ2whaB5EFCQTtAiwCsQEsAS4An/7q/L37tPvE/Bv+8P7s/lf+wP0I/Zv7ZvnD9jj0L/Kz8KnvWe8O8IDxDfNY9Az19vRX9IvzRvIj8GDtverK6OPnFuj16KTpwumb6aDpAeqi6gbrF+tH673r6Otc62Hqf+nK6DTorecc53fmFOZS5kPnueh86uTrpexL7fDt7u0i7RfslOun66vre+vO6wntsu4A8LTwGvGM8fXxHvIS8gryAfLu8UPyZPPS9AL2SfcX+cr6aPsB+3r6PPod+hj6K/ox+mb6CPvX+8f8Lf7i/3cB+wKdBDgGZQfMB5sHYAc3B8gG7QX5BFMEFgQsBN4EcgZqCDgKQAz4Dr4RahPCE3gTFBNXEv4QTw/IDaUMHgxdDC0NEA5DDzARdhOMFVgXixjgGI0YIhjfF2gXSRaxFB8TtxFXEIoPrw9QEFARIBP/FPMVoBYEGDkZKBlQGB8XbRWnE9sRFhD6DoYOag7EDhQP3Q7eDuoPQxEUEosSghJVEQUQNBDKENQPBw6ADHALHwvzCqsJAggYCNsJ6wrTChML3grECLwHxgmPCiEIEwdxCEwHogLR/x0C+wWbBlUFTQZ4B94DCP4Z/YIBvQSrAlT+1Py0/Rj98/sz/mECngMHAT/9v/rp+gj9Sv6Y/H/4IvQC8sXzwfik/jwE5wlODrQOKAuOBpMC/v6w+4r49fTO8EXuHfHv+HAALgV4CfkN9A+oDvIMUAw3Cz0IdANe/pz6Jvif9jz2tPYU+CL7wf8EBeoKKBFrFdsVnROAELYMVAj3A27/kvpG9rryme+q7pDyr/p3AxIKKQ6NED4RXQ85C3cGzwGU/Gj2r/C07RHtQuzm6/bupfTR+CP6Q/s5/m0B2gFL/z/87fkf9yDz6u6S6wfpu+Ye5Zflmegl7QzysPZH+q/77fpT+XH3+/RW8j/wS+7N65Hp4+i96dDrU+9f81/2kfhZ+lb6Ofg29sf1B/ah9ar0Z/SN9Tb3k/jw+Ub79/tB/Nb8m/3p/Wn9mfyo/PX9Qv9V//f+0P/bAbQDkQTJBPoEQAWFBQ0GrAaPBjAFEgNhAdAA3gDJAAgB9gJ3BpAJEQvRC+UMQA7wDhYOygvDCFgF6gF//8v+LP+b/3sAPwOkB5sLFg6xD/gQuBFMERwPjws7CDQG5wQKA54AEP9f/xgBRwOZBToI7AoeDV0OwA65Di4OjQzvCdYGlgOQADX+rvwe/LL8Kf7S/zwBvALFBNgGAwjiB5gGoASOAnQACP5w+yr5hveQ9iL2JvbC9gD4mvkL+7/7ffu9+gr6dfnQ+Ov3j/bA9MDy5vBi7znuU+247LTsXO0u7uLuue+78GDxR/Gb8LXvgu7n7CzruumN6JjnB+cg5+jn9OjV6XLqverS6sPqmeps6kTqFOr46czpa+kZ6S7pbemi6e3pH+rh6c/pXer76lDr2OvU7PHtqu7e7rnuoO717qPvGPA78IXwJ/HN8UbylfLL8hnzsfN69DP1rvUy9kX3wvjm+Y36KPu3++/7BPwt/CL85Pvx+3v8Yf2K/tj/OAHCAlsEqgWQBiUHcgeJB4UHWAcKB88G2QYvB7UHTQgWCSYKUAtZDEMNFA7KDmEP3Q8gECMQ9w+vD0oP1A53Dm0OuA4vD8EPhhBVEQISrBJ5ExAUDhSnE3QTeBMyE20SmxExERkRCBEJES8RfhH+EXYShRJQEmUS0RLaEloS3BGZEWMR8xAvEKgPrg/ZD7cPUw8KDzAPfQ9bD90OsQ6+DlcOnA2EDR4OdA4dDooN/AxpDOEL0AtsDA8N5gxJDNILRAubCkEKKwokCgIKwAk+CVoIqwezBywIDwkzCs0KSwodCTcI7AdlB8sFvAPjAo4DtwO6AVf/mv8HAmYDowP5BNUGaAeDBu4ESwMxAVf+Yvzf/N796fsK+IL4AACjB7oJoArCDW8OTwr+Be8D9gDi++v4hPpv/M/67fl1/4kHuQqxCZgJcwu1DI4L1whpBkYEDwFi/fH79vy2/X79CP70/1oCQQT6BdgImgzUDh8OpQu7CHQFEAJY/0r9H/ur+L72ifbD+JP8ggBiBE8IGAtnC28JZgb2Avn+0vqK9/X0l/KD8Rby9PJU9Eb3L/pi+/n7Cv0Z/hj+l/xk+o74L/eM9cbybu+L7ajtDe5J7pLvxvHu82P2Svlj+5j7Kvph+BH3hPUi87HwOe8E76LvUPAI8cvy9vUi+ev6hPu8+4T7mfpg+Ur4rvfX90H4IPi/9zL4kPkA+5H83v7wAFgB9QBDAZEBEgEXAToCuwKqAW8AlwDTAXMCHwJ+Ai8EzwWCBuIGhAchCP0H3QagBfQEeATeA6MDBAR/BO0E0QU3B8IIDgqnCnwK2gnHCCwHUAUiBFsEJAUOBXUE4gRQBnUHNAg9CV0K5gqkCtsJFAmDCNMH6wZYBksGIgY0BQ0EHASHBZ0GcAZIBsoHOwpBC2IKCwkCCAcHrAXBA7gBcgAVAOT/pP8XAIIB6QKZA/kDHASRA4ACUwEUALr+X/0C/LH6fvlz+MX3tvcL+EX4Jvjo9/X3Gvik98z2N/aV9Vz01fJA8b7vqO7v7TztyOyx7KLsm+wD7aLt0O1T7b/sauzR67Xq2+mM6SDpLug659LmDOeE5/jnXOi06ALpT+lV6Tbpaunc6d7pb+ku6R3pq+hC6IboHOlu6ZjpAurk6u3rkuzQ7Drt8O2i7gjvFu/07gjvX++s787v+O9R8PTw4PHU8nzz+/O29Jr1RPar9gj3hPcG+GL4g/h9+Hf4w/h6+T/63Ppp+737+vuP/ET9kv3J/Wf+OP/l/2kA1wA9AZ0B9gFDAmwCiALhAnoDCQSJBBIFgAXIBSEGoAYwB7IHBAgrCFQIlQjwCFIJuQk4CrgKAAsNCycLigvwCyIMUAyvDCENZQ1cDUsNgw3lDR0OTg65DiIPIA8BD2UPIRBcEAsQ8Q8nEBUQwg96DzIPIA+QD/QP6Q/PD/APSxDWECARzhAiEMkPCBA7EIUPXg4DDn4OxA5yDgsOCg5UDpoO0w4HD7sOAA7IDVUOmg6sDSEMfAvtCywMfQuXClQKnArTCgILhQv+C/YL6wsJDL0Lwwq2CYsJPwplCg0JOweoBnwHDAhqBzcHCwjFB8EGBgihCoAKugdXBpEHaAjYBtEEjgQEBZsEGwTuA+cC4QFPA74FzQVyBEAESQSeAwAE0gV7BjEEQwD3/cH+tgCUAnYFMAmlC+EL4gqWCXQIzAcdB5IFxAOEAtcAJv87ALsD/AZmCScL7QuxC9sKCQp2CYIJIgosCV8FQAJOAvYBS/96/iUBWQN9A28EfQceCsQJ5AfwB3UJ2QiJBSICDQCr/pL8bvlr9w/48/nb+x7+FQC0AJ8AsgDGAIIAg/88/f/5/Pb09HDzyfGE8LfwKPJ885LzlvIT8knzh/UA9/72bfb29cn0RvLE78Pun+7u7Q7tLu027u/u7O5477rxevTR9a31FfWG9Bf0nfP08oXyuPI283/zkPPP81j0EPUj9qv3IPkA+mH6evpf+mv64/p5+/n7vPzf/ef+JP+J/hb+w/44AGMB3AEqAr4CIQPbAqgCZQODBBoFUgWqBRQGSAZKBosGRQf7ByQI2wd3ByUHxwY+Bs4F4gVXBsYGLAewBzEIkgj+CIcJzwm/Ca4JkwkPCR8IGgdEBqYFmwVyBpkHMghKCHAIAQnzCb0KzQqDCocKkwrrCZEILQdSBhcGLQYtBvoFswWiBQ8GvQY8B7sHVwhsCH0HKgZtBQ0FAQQzAqgALgBqAEYAaf+p/sf+df/n/8n/if99/zn/Sv78/Kv7T/rM+HL3uPaA9iz2avWR9Dz0YfR39Fn0PPT08xbzpfFB8FvvuO4i7tjtqO3p7I7rYury6QDq9OnU6fvpTupE6tzpp+nQ6bvpKemC6Bbozues57fn4Ocd6HXorujd6GTpD+pJ6izqK+py6rbqreqL6tvqoutz7O/sFO037bvtbe7j7jTvle/V7wrwgfAq8bbxIPLB8s7zvvQJ9f70R/Xz9ar2NPem9yj4v/hP+cv5Lfp0+qX67Ppv+/v7V/y2/Fj9Fv6h/uv+K/+M//H/PQB9ALIA4AAVAUABbwHYAW8C6QIpA3AD6QNxBNsELAV0Ba4FxgWyBY0FmwXiBSoGZgbKBlcHwQfqBy0Isgg8CaIJBApdCnYKPwoTCkIKfgptCmMKiwqsCtIKPgvaC1sMmgzFDBwNkA3MDb0Neg0cDc0MywwVDUsNPg09DWENmw0ZDpIORw7ADSkO/Q7MDs0NQg1/DcUNbQ2/DKcMNQ1oDdYMZwy0DCkN+QyQDOQMZQ27DIYLQwu5C8sLJAsbCswJ5grhC/cKKQnpCI0Kpwu7CoAJxQlfCpIJQAghCKcIOAhCB4EHkQiJCCcHPgY1BxkJxAnICKMHZwesB4oHoQbJBRkG6waaBjgFhAQxBREGMgbABV8FnAUQBugFkgXYBXUGkQbIBZkEFARPBA8E4gITAvABUQHjAJICEQVJBcQDoANDBVsGsgV2BD4E0wRoBIkC1wC+AHQCPAUOCPoJ+AleCMMHlAkBC8EIBwRCAZcC7ARDBIsB4wDeA+MH1QmrCSQJ8wgdCb0JQwpYCbIGRQTxA2ME0QK2/23+JgB2AgIDeQLyAuMEzAYtByQGLAUGBXYE7AK1AVwAI/2T+an4o/mw+a741vgn+8n9av6L/Wj9Tf5r/oj8P/kV9iD0G/M58kXxY/C97+jv7PDE8eDx5fF48mHz6/O/8wvzR/LQ8WDxM/Be7g/tCe2G7X/tI+1v7afuFvAW8c7xb/Lj8k3z3/MN9EHzHvL08YnydvLe8WHyDPSL9Y/2bPco+Bj5Uvrp+lr6Yvm/+Kz4Kvn++e768fsK/Ub+kv+pAJABfQI3A4QDigNYA/oCtgK7Av0CYwO5A+ADDwSgBMAFMwdxCCoJbAmDCbQJ6Qm7CQsJMgirB5EHfAf1BjAG2QVLBkMHJQhxCKYIjwnICkIL2ApUCioKzwkJCTAISAeTBtAGxgczCIoH4gaMBykJDQqXCd8I0wgMCQUJCglCCQ8JKwg5B9UGqgb1BQ8FQAVLBlgG1ARfA2gDXgTNBFgErgMzA6gC3gEQAXoADACC/87+Vf5K/g7+J/0o/KT7M/tt+nr5jfic95r26PX+9VT2+vUC9Wr0dPRB9C/zwvG48B3wee997kjtWezf65vrXusi67rqO+oH6k3qnOp36urpU+nA6EnoK+g26PfnqOeE5z/n2+be5j7npOf352boC+nH6VPqkeqH6pTq/Op3643rcuuY6/XrXewG7cHtUO4a7zXwEvGI8dPxOPLM8mnz0fML9E702/Sn9UH2k/YW9+b3xfiN+SL6c/rL+n/7XvzW/Nf8Av3T/dj+X/9x/5j/EADDAHQB6wExAn0C6gJwA+kDKgQ9BGgE0wREBX0FnAXUBSYGfQbZBj8HogcGCHUI0wgDCSgJWwlzCVoJWwmdCdwJ6Qn1CSUKbgqyCuoKKQuMC+4LEAwODEsMuQz4DPIM3wzbDO0MAQ39DO8M6AzMDLsM6Aw4DVINQg1oDdkNPA5sDm4ONg72DRsOZg4zDooNAw2/DKYMsQyjDFoMXQzhDFUNYA0zDe4MsAylDO8MCQ1hDKMLUwuoCtMJ9gltCvgJOgkDCUAJswnpCcAJxgn/Cc0JLQnTCPAInwhsB/oG5QfFBzEGJQb2B4EIvwY2BcwFbgdSCMgIygk0CvoI4QdDCG8IVQe4Bt0GEQbcBGsE4AOwA5kFcAiMCe0IMQhcCGYJQwosCuoJKAoNCokILwbFBOIEAgVWBEIENgV3BZgE4gR+B9cJWAl1B5MH2gm8CmQIfgWiBKMEmANHAlkCfgMnBDwE8QT+BZ8FfQSgBbUICwn7BCwBlAGABMgGHQiOCccK4wphCjAKBwoVCT4HTwVnBDoE2AKeAFMAmAJ/BT0HWgfNBvEGeAiqCqwLpgqUCGsGwAROBP8DfAHP/XL8VP21/Rn9y/yp/bP/zAHaAv0CwQJjAjcCVAIXAi8A7Ptn92/1TfXJ9OTzqPMe9P30F/bv9g33qPZ79sT2lPY89ZzzrfIX8nbx+vCY8PvvBO/a7TfttO2T7ofuzO2b7T/u8+4c78Luce5/7sjuGu997+PvMfB18PXwf/Gm8Y/xuPH98QXy8fEA8urxWPHL8EzxrPKC86LzpPQg96z5Ffu/+2b89vzO/N/79vqa+mL6FPoF+lX61/qI+4n87f2m/1oBiwJFAxgELAUNBm0GZgYpBs8FRQV6BJ4DFgMXA4UDDwRsBKsENgVHBqMH6wjaCSUKGApvCu4KhQpNCWcIFQjOB48HXQf/BvUG2AcECXIJ9gheCHEIMQkRCpsKmQpJCiYKTQp1Cn4KTArdCZUJnglaCYMI2QcECJUIuQhICMUHagftBnQGgga0BlQGrwWBBbsFlwXUBDIEDgTRA+MChAGEABkAgf9G/vb8NPzs+6H7HfvA+tP64/p4+rn5Cvl8+MD3qfZ39XD0mPOv8qvxzPAq8KrvUu/87nHuxe1Q7Q/twexu7Fvsb+xE7Kvr5upG6ufpkukq6c7oqeie6JHoieij6OXoPOly6Y7psOnQ6eLpNOq96hbrPuuP6yrs5+xp7cDtHO6H7v3uWe+I773vDPB/8AXxhvEV8tTyuPO99MD1gfb89m/3+Pej+Dz5cvlj+aL5Q/q5+sD6xfoW+4H7/fvS/LL9Ov7R/qn/QgCYABMBmwH4ATUCTAJZAoUCqgK2AsQC4wIOA0oDmQMBBH4E+gRhBdEFSQaDBoUGxgZGB2YH+QanBu0GdweSB0MHJgdiB5IHkweTB70HEwh2CLsI7ggoCWIJnwn+CV8KfQpTCjAKRgp/CqMKmQpjCi0KOQqJCsgK4AoQC3EL0AsNDCUMNAxmDLgM4AzHDI4MUwweDAsMLQxUDEAMHQw1DHUMjgyBDI8MvwzoDAgN/AzJDJUMTAwaDEoMdgwgDKMLrAsADPcLswukC3wLGwsZC0kLxArxCdsJNAoQCo4JPwlVCWAJ8AibCN4ItAipByQHuwcSCKcHRAfXBiIG+AVsBm0GAwbwBfMFDgaoBgMHfgbdBewFlgYEB4gGsAVlBW8FfAWmBZcFVAVSBYgFAQbDBgkHVQavBSUG5QaBBkkFsgQ9BRAGUQYJBuYFTwYMB5wHjQfyBnQGWgY1BrAFFgXeBAQFRAWbBQMGPAYlBuAFvQUHBoMGiwb4BW0FMQXoBIsEdAStBPgEGgUwBUgF3gTbA0kD+QMiBWYFIwW1BRYHfQjXCQYLcwsrC+gKwgoHClMIRQamBJYD5QI3AkwBhABeAEIBtQI0A3wCNQK8A/8FZgYlBeIETgUoBD0CfQEjAQUAqf6H/Vj82vpp+bv46fgv+dz4Kvjt90f4I/hr95/3gvjm98n1WvQr9NPzkfIs8cjw+PB18Ffvd+677Qftvuym7OLrz+qM6gXrL+vZ6qnqCOuX69Hr5etx7C/teO2E7bzts+1i7XTt6e0L7uft6O3r7c7t4u0j7nfuEe/E7yLwifBU8UXyVfOq9A72NPfk90X4pPgH+VD5sPk1+pz6y/r8+lD7yftw/DT98v2K/vH+Zf8wABsBuwEeArQCkANLBKwECwWoBUwGtgb4Bk0HxAcICA8IKQhYCGkIYQhYCGAIbwh7CIQIfQhuCIUIrQi7CMkICQlhCbIJ7QkOChcKHAo+CmEKTQoaCt0JuwnECagJSwkJCRkJSwkvCe0I9AgJCfAICAldCXYJGAmQCD4IOAgpCNYHdgc3B/YGpwZyBk8GCgaoBVkFLgUBBZwEFgTDA4wD+wICAhUBdgDr/yv/Tf6W/Q79e/zB+w77jvos+rP5EPlm+Nn3Ufev9vr1UfW79Dr0tPP78v7xB/Fl8AXwie/u7mLu+u2v7VbtuOwW7Mzrzuue6yXru+qF6mvqaOpW6jrqPupu6q7q6+oh62DrpOvp6ynsXOx77LfsIu2N7cXt1e357XLuKu/Y713w3PB18TTyCvPJ80X0vvSN9Yv2PveU99z3R/jF+E75rPne+Uj64vpI+4b72vta/PX8g/3x/Vn+0P5l/xEAjwDhAFEB0QFDArkCDAMaAzUDpAMfBEwESQRlBLME/AQMBfkE8wQWBWIFogWxBcgFAQYrBkAGYgaMBqsGzAYHB1UHogfTB/IHIAhXCG4IbwiHCLwI0gixCK0IAQlTCWMJbwmzCRAKWQqDCq0K5gofC1QLhwucC60L6QsrDDkMRgx+DLIMvgzWDCMNdQ2PDZMNpQ3JDeMN0w23DbkNuQ2zDb8NyA2jDXINWw1YDWANew2LDW4NPA0hDQwN9QzjDNAMvAytDIAMPwwTDPALuAuPC4oLhAtVCwILsAptCh8K3AnJCcoJnwk/CdcIwAj+CAUJpQhOCDEIJwj/B8oHngdwB0EHEAfsBg4HNAe8BhwGUAasBlQG2wW2BbcFvAXABd0F7wXcBeUFFAYcBg0GCgb6BQ4GTAYCBjgF8QRoBc0FygW2BQYG0AZ0B0gH1AYWB+MHIQhTB2MGWwaWBgAG9ASIBAsFtwW+BYUF0AVhBngGTQbBBrwHEwhUB3YGQQZJBt4FQAU5BVkFdgRgA3QDoAOsAtEBNwKYArQBnwDfAMMBoAHxAHoBnwJWAkcB0QE/AxED3wGxAQ4CwAE8AV0BHwLmAiwDOwOEA5gDdQP9A7oEHQSJAsABowHYAJD/3v6M/gz+s/00/Uv8/vtU/KD8Hf2c/aL9eP2E/aD9dP0u/Xb91f38/Jn7N/sC+wf6G/mc+O/3F/d69hT2nvX/9Hb0a/R49Mvzp/IG8v3x9fF58bjwWvBr8DDwt++a75bvKO+n7mXuQu4V7t7tou1n7RPtrOw/7Mnraetu67Pr5Ovs6wrsdOwl7dntbe4H7+vv+fC38QLyXfID84zzr/Oy87rzsPOQ83jzgfO78w30dvQC9ZL1B/ac9of3jvhg+SD6CPv1+7j8bf0X/pz+EP+c/zAAtAAzAbgBNAKzAj8DpgP6A3gE7AQlBUMFVwVkBW0FcwWFBaoFzwUBBkcGgQa0BhIHkAcUCJUIAAk5CVUJbwmQCagJjglCCQQJ4AilCDYIvQd5B3AHTAcHB+8GAQcYBz8HcQeVB40HeweYB8cHsQdIB+AGsgaRBlAGCgbQBZoFbAU5BfcEyASpBGcEIgT4A6wDFwN7AgsCtAFPAckAPQDU/4f/Of/k/pH+R/4G/sr9g/0r/dD8h/wx/Lz7P/u5+hf6bvnB+AH4Lvdk9r/1PvXA9E709fOe8zjz5/K+8qjyfPIq8s7xkPFl8R7xovAq8N3vsO+B7znv4u6l7n/uYe4v7ubtv+3c7fjt6u3N7cTt3+0c7k7ugO7J7hfvTu+B79XvTvCy8PfwSPG28R/ycvK28v7yTPOo8/fzMPR89N/0OPWW9fX1VPbE9kr30vdO+Lv4MvnF+VT6x/o1+6f7Efxn/Kf85fw3/Y792v0i/mf+sP4P/3L/yv8iAIIA5wA7AYUB2wE5ApUC7AIpA1IDjAPQAwAENwR4BK8E5QQmBW0FpwXGBeoFIgZSBnEGlAa4BtUG7gYEBx4HTweFB6MHsQfTBwcIOQhlCJIIugjtCCgJXwl8CYAJggmdCbgJuAmvCbQJwAnPCeAJ9gkOCikKTQp9CqQKwArlChALLwtHC04LTwthC3sLhguLC40LlgusC8sL3QviC+EL4AveC94L3AvaC9sL5AvUC6YLkgu4C8oLpguEC4QLhwuBC3wLgwuEC4MLhwuJC3sLYQtMC1MLXgtXC0ALIAv/CusK2ArOCtYK2ArQCtkKxQqDCmUKgwqQClsKDQr/CScKKQr7CfAJCgoVCgcK9wn7CfIJtAmPCaYJngk3CcMIsQjlCNIIcQhLCH8ImQhsCDUIOwhpCFQI9AevB6sHrAduByMHAwfVBo8GZQZDBhQG5gW9BZUFbAU6BS0FRAUUBZ0EeQS7BL8ERwTzAxMEMwQNBNEDnQOEA4ADkgO3A6MDQAMMAy0DCANnAuIBzgG8AUABnQA9AAUAyf+c/3v/S/8Z/xn/Yf+r/6H/lP/8/4cAlwAnAMv/3//l/2z/6v6t/kH+t/2c/dj9Lf6J/t7+V//q/08ApwAeAVwBAQEqAGb/G/+K/i39Dvys+zr7iPoj+kL6nvrv+kz77fug/BH9f/00/pL+KP6d/XL9Mf2I/Lj7B/uG+ib6t/k6+eX44fgn+YP5ofl6+Wn5jPlv+eD4RvjY90r3g/ak9an0pfP28qbydfJY8ljyWPJl8oPynfLF8g3zPfM78/TyVfJx8Y/w5O+J7yjvhe4S7hPuFO7/7TTuw+5r7wXwbfC88BfxZ/GI8YPxWfET8bDwP/Dg757vXe8/727v5u918PHwa/EZ8t/yifMV9Kj0Q/XB9Qr2QfZ+9sH2BfdN95P35/db+Pn4wPmZ+mr7OfwW/fH9qP45/8f/TwC6AAsBRgFrAY8BxAH6AR4CUAK1AjgDsQNABPwEugVbBuAGUQfFByIISwhdCGUIWQhUCF0IXQhRCGEIkAjJCAcJXwnHCSkKfwrBCugKAwv+CtYKqwp2CiQKwwljCRMJ0wiaCF0IKggNCAEI7gfWB8gHzgfVB8AHgQcmB8EGTwbHBS0FjQT+A4sDKwPFAmQCJAIEAukBxgGhAZEBjgFhAf0AhAADAHL/zP4M/jj9Y/yj+wj7jvok+s35k/lj+S75/Pjd+MD4gvgp+L73RPfC9jX2lfXq9DH0i/Md89PygfI58iDyHvIA8uPx3/HM8ZjxafEu8dPwd/As8PDvz++i717vQO9k75bvwO/n7xvwY/Cg8LfwzPDi8Ovw4vDP8LDwn/Ct8ODwIfFY8ZTx/PGA8gTzffP684L0DPWD9eb1MPZ29sL2Avc19233svcL+Hb44/hQ+dL5c/ou++z7jvwY/ar9Uv7y/mj/0f9JALYABwFPAZQB4AFPAtACPQOiAxgEpwRABcoFSQbTBmUH6AdbCL8IEwldCaAJ2gkZClwKnAreCigLeAvaC0QMrQwYDYoN9g1NDowO0w4gD04PYQ+ND7wPyQ/ED80P5w8QEDMQWhCMELwQ3RAFETgRaBGBEY8RlRGIEXIRehF1EU0RORFDETkRMBE7ETwRNRE/EUMRQBE/ETgRHxEEEegQxBCREGIQRhAlEOAPtw/CD7EPbQ9RD10PWQ8vD+sOqw6ADj8O9Q3DDYkNNg39DMIMUQzaC6oLqQuZC2ALJwsUCwoLxwpoCjcKKgryCY0JJAnDCF4IDgjWB5gHXwdGBxUHyga2BrwGfgZBBkwGSgYLBqMFHAW3BIIEQwQCBNsDvAObA3MDSQNEA24DiQOBA2sDRAMTA+4CugJkAgoCwwGKAUoB6gCLAHcAmwClAIMAWQBlAKkAsgBPAPP/DgByAHcABQCr/6f/xf/H/6z/wv8TAFcAZwA9AOL/mf+l/7r/RP9x/vz93v12/cr8cPyN/M/84/zK/Nj8Kv2O/fv9b/63/tn+D/8q/+b+cP4p/hv+5P1Q/a78U/w4/CT89vvO+/77lfxT/fb9R/57/vf+mv/s/6X/Af+E/ij+d/2O/Nj7W/v3+q36cvpq+rf6PPvX+2n86/yF/SX+h/6W/nf+Tv4Q/ov9s/zT+0P77/qQ+iv6BPon+mH6gPqY+uD6TfuH+277KPvf+oD61Pnd+Of3B/c59on16/RL9NrzyPP/80n0kvTk9D/1d/Vy9UP19vRv9MXzJ/N+8oLxXvB17+/une5R7hTuJe6J7gvvdu/N7yrwnvAI8Snx3PBk8BDwxO8w74PuGe797fPt0e2l7b3tQe4A77TvVvD48KzxX/Lq8jDzWvOY8+DzAvT78/jzL/SU9An1kPVF9hz38fe7+J/5n/qM+0r89vyU/RL+Z/6e/sX+5f4Q/0//jf/i/2wADAGzAXACOwMOBO4EtwVVBuEGZgfZBzAIWQhfCGIIcAh1CHAIgAizCPAIOwmtCTMKqgoZC3kLvwvxCwQM7gu+C3QLGQu8CmIKBAqvCWcJOAkqCTQJTAl6CbkJ8QkLChAKBwriCZcJLgmvCBwIZQeiBgEGdwXpBGME9wOyA44DcwNUA0IDPQMtAwMDvwJmAvUBYgGmAM7/Bf9a/rH9Av1r/PT7mvtf+zb7D/v0+vP65fqt+lj6/fmU+Rn5hPjW9y33nvYR9pH1LPXi9Lr0mPRx9Gv0cPRi9D70BfS282fzFvPA8mPyAfKd8U3xFPH28PDwAPEa8TjxU/F78azx2vH28fnx7PHo8eTx1fHF8cXx0fHs8RLyT/Kf8vDyRfOu8yL0kvTu9Dv1jfXm9SX2TfZ39rP2+fY492/3uvcZ+In4B/mN+R36u/pd+/37lPwc/Z79IP6Z/gP/Xf+w/wkAawDTAD0BpgERAokCEgOlAzcEvAQ+BdYFbwbrBloH0gdICKoI8gg7CZYJ+QlPCp4K7ApBC6ELEQyHDO4MQg2nDRYObQ67Dh8Pcw+iD8kP+Q8eEEAQXxB5EJcQxBDnEAQRLRFbEYMRuRHqEQsSIRI2Ek0SXxJOEkESWxJyEl0SQhItEiMSJxIjEg8SBBL+EQoSHhIZEvYR2hHMEcERoRFuET4RJBECEdkQtxCfEHsQURAsEBAQ5A+uD4cPcw9TDxsP2Q6rDosOVQ71DZ8Nfw1zDT0N7QynDG4MNgwDDMgLgwszC90KjApACtkJcgk1CfIIagjrB8UHvAdvB/QGmQZ/BngGOgbBBV4FIgXUBGsEBwSdAzsD+gK2AloCAAK4AZIBjgGMAWUBIQEUAT8BMAHNAHQAdACcAHEA2f9Y/0L/UP8b/43+AP7j/QD+4/2e/WL9Jv0Q/Sv9HP3U/Kr8r/y1/KH8dfxo/K/8Ef0w/fX8uvzy/ED9I/0C/Qz9yfxY/Cb8B/y1+zn7tPp/+pj6ePow+kX6jPqc+pH6rvrf+hf7Wvty+0b7M/to+5b7kvtx+zv7GvsO++T6s/qf+nn6VfqF+vP6T/uq+zD8xvwk/Vf9o/3w/fX9p/0W/XX8zfsE+z36oPka+br4ovi7+On4N/nR+fv6L/zZ/Hf9Sv6r/oT+Sv78/XP9w/z7+zD7cvq9+U35WPmL+ZT5nPnw+XT6yPq++qf6vPqv+in6Tvlk+I/3xPbr9Rf1jvRh9Fz0V/Rp9LL0K/Wp9QX2JPYQ9tL1avXU9Cz0bPOR8sDxDPFR8KjvUe9O73fvwu8T8F7wuPA68bTx4PHa8eXxxvFg8Q/x6/Cm8FHwG/AX8FDwkfC48A3xj/H48Vjy5/KF8wX0aPTC9Bb1ZfW59Rz2ffbN9hD3bvcB+J/4KPnD+YD6RPv5+5n8NP3S/WP+6P50/+7/VADJADUBeQHEATgCuAIpA5MDAwSJBCEFrwUyBsQGXQffB0cIqQgLCWMJqQnhCRQKUgqICp4KrQrTCvkKFAsyC1oLewuMC5ILmwunC7kLxQu+C6MLigtwC0wLJwsMC+4KxAqQCmUKQQoXCt8JpQlwCTcJ6giTCDsI5Qd/BwsHpQZPBtsFWAUBBcUEcgQgBNwDnQNrAzwD+gKuAlsC+gGSASIBogATAH3/5f5M/q39G/2l/Db8vftD+9z6iPoy+tD5bPkP+ab4MPjC92b3/vaE9hv20fV99SH12fSb9Fj0HvTp87bzifNW8xzz6/Kt8mfyOPIf8vXxuPGB8WHxQPEX8fTw5/Dh8NPwuvCv8L3w2fD18B3xUPGF8bvx+/E/8oTywvL88jnzcvOb88Pz5/ML9ET0jfTO9Bn1fvX29XT27/Zp9/j3lPgk+Zr5Avpw+uf6WfvE+y38lvwD/XT95P1Z/t3+bP8CAJMAIAGtAUIC3AJuA+MDRgSzBCkFnQUUBoEG6gZnB+4HYwjaCGMJ8Al4CgELhAsCDIMMAg1oDb0NFQ51DsMOAQ9HD5APxA8DEF4QrBDiEC0RfxHMERYSUBKCEsQS+hIgE0cTZhNxE4ETkROWE5gTpxO2E7oTsBO1E8kT3hPgE9QTyRPKE78TqhONE2oTPxMZE/ASwhKQEmMSNxIPEucRxBGdEXQRSBEhEfgQyBCBEDUQ9A+8D3MPEw+uDmcONg70DYwNNQ0NDe8Mugx0DCsM9AvAC3YLFQu4CmYKGgq/CVsJ/wi/CI8IUgj6B78HogdjBwkHxgZ4Bh4G3wWgBS8FrQRQBBUEzwNsAxYDBwMjAw0DuwJ/AnYCawIyAugBtQGLAVAB9QCDACQA9f/g/77/gv88/xz/Mf9C/yH/+P4B/xf/5v6a/oL+Z/4b/uP91f21/Xz9Rf0c/QL95vzR/Of8+/zE/Gn8Pvw3/B386vu8+6X7lPts+0z7Vvta+zj7I/sq+z/7XPt/+6j7wfvE+8v7x/uj+1/7E/vk+tH6ovpK+gH68vnw+dP5q/mp+c/57Pnt+Qr6ZPq/+t367PoP+yj7Lvss+xD76vrW+sj6m/pV+h76Efoi+ij6HvpX+vD6jPvl+yj8e/zC/NP8rfxm/Bf8yPti+8/6SPr/+cn5lPmM+bP5/fln+tz6YPv5+3380/wE/RH99/yr/CD8jvsq+8P6Rfr3+d75yfnF+df57/ka+kn6X/pU+iX6x/lO+dP4YfjX9xz3bfYI9rD1V/VC9W71jvWZ9az11PXw9dj1i/U69dT0MPRy883yHvJl8d3wjvBF8A7wBvAr8GrwsfDk8BvxZvGb8Z7xi/Fp8TvxCPHH8GTwC/Dp7/TvAPAV8FDws/As8bXxIvJp8rbyHfN/88bz5PP48yj0aPSg9Nr0LPWo9UD21fZz9zf4+viv+Xj6QvvM+yv8nPwj/ZL92v0b/n7+8/5K/4///P+YAEIB4wF6Ah0D1gOHBCEFqgUaBnkG1wYxB3UHqwfjBygIbQitCPAIOwmKCeIJNQqDCtsKNgt2C54LyQvsC+wL4QvbC9QLwguoC4gLcwtgC0MLJQsXCxELEAsFC/cK+gr8CuwK2gq8CnoKIArGCWcJAgmSCB4IrQdBB9YGdwYjBtQFggU6BQIFzgSRBEoE/AOuA1sD8QJ2AvsBgAEFAYkADwCe/zj/2v6A/iv+2v2O/UH97/ye/FX8Cvyy+0z73fpv+gX6nfk9+eL4h/gu+OP3qveB91v3Mff89r72f/ZM9hv23fWU9Ur1A/XF9Iv0V/Qn9AL05fPU89Dz1vPa89/z7PP98wP0CvQd9DP0OvQ89D30RfRa9H70mvSv9M/0B/VR9aP16fUu9of25/Yw93735vdH+JD43Pgu+XL5t/kN+mX6vvok+4/7//t//Af9lP0o/rT+Nv+6/zwAwgBAAaMBBQJ/AvMCVAO7AyoEnwQhBaUFJgavBjsHzwdkCOoIYwngCWEK3gpMC64LEQx+DOkMUQ23DRwOeg7cDkYPrg8JEGMQvxAZEWYRrRH1ET0SgBLCEvoSLxNkE5sTxxPwExUUNBRVFH0UkRSZFJ8UpBSjFKQUmhSKFHYUWhQxFBcUDRT6E8wTlRNkEz4TGBPlEpcSQxL/EcQRfBEvEeIQoxBqECIQ0g+XD1wPEQ/DDn0OKQ7KDXYNMQ3cDG4MAQyzC2cL/QqHCi8K6gmXCUEJ/wizCE0I7AemB2MHEAeyBmoGMAbRBVoFDQXcBIsEGgS0A2ADCAO1AnwCQALlAZEBVwEgAeoApQBGAPz/3f+y/2H/CP+9/pf+eP4v/tv9q/2O/Wn9N/0R/fn85vze/M/8p/yE/HX8aPxL/B789/vq+9r7r/uA+1/7NPsC++768frL+nz6V/p5+oT6SPoi+k/6gvp4+lb6W/p2+nz6gfqs+sv6sPqh+tH64Pp1+gD6NPqQ+k369/kU+hb60/m/+eX59PnM+YD5dPmt+av5c/l++az5oPlw+V35UvlI+WT5lvmd+Yz5lvmv+b75xfmw+Yf5Xfk7+Sn5E/nP+I34mvjd+A75Nvl/+ez5Vvqa+sj6FPtW+0z7EfvS+n76GPqu+Ur56/iu+KD4jvh9+Mj4ZfkG+pT6HPuG+8D7AfxG/C38xvtZ+/j6sPpX+tj5jfmK+YL5gfm4+QP6SfqN+q/6nvpx+j76BPqW+ff4Tfi991X39/aa9n32pvbZ9gL3P/eS9+H3CfgH+Oj3lfcO94X24vUI9TH0k/MW863yXPI58lbymvLl8knzs/MD9DT0WfRo9D/05POL8yjztPJj8kHyEvL28Sfyj/L68lrzw/NP9ND0GPU+9XD1ovW29ab1l/Wb9aX1t/UD9or2KffO94/4b/lP+hT7xvtt/Ab9eP24/dz9Af40/nv+yf4i/5v/MADUAJEBXAIhA+4DtQRtBRkGqQYRB18HkwfCB/cHNAh1CL8IIgmbCRYKtgp6CyEMoQwhDYYNwQ3uDQsOBQ7sDckNrQ2XDYENcQ17DZ8N2A0TDk8Okg7YDgkPKw85DycP9g6wDlQO9A2XDTQNyQxvDCoM+AvWC78Lngt5C2ALRAv8CqAKUQr4CXIJ0ggzCJsH/wZjBtgFawUFBZ8EUwQeBNoDhQMtA9ICZQLYATUBlQD6/0z/k/7n/Ub9r/ws/L/7XvsA+6/6c/o5+u75kvkx+c/4XfjY9073zvZR9tf1aPUN9cT0hfRS9Dj0IfQI9PLz4vPI85zzYPMl8+Tym/JS8hTy4fG/8abxmvGo8dXxD/JV8qDy6/I183vztPPe8/rzEPQn9EP0XPR09I/0vvQH9V/1vfUm9qH2KPeq9yX4nfgX+Yf55Pkv+nX6w/oa+3f72vs+/Kz8Lf25/U3+6/6N/zIA2ABxAfUBbwLpAl8DxgMUBGIEwQQqBZMFBQZ8BvsGiwcmCLcIQwnTCV0K3wpZC74LGQx6DNYMFw1PDZYN7w1GDpsO/Q5tD88PLxCQEOcQMhGBEcQR+hEhEjgSTBJuEokSnhKzEs0S6hIQEzMTTRNaE3ATgxOEE3MTYxNLEyMT7xK8EosSYhI6EhQS6BG6EZERdBFXEToRDxHdELUQjhA/EOIPng9gDwIPqQ5mDigO4w2kDWENKA33DL4MfwxCDP0LxAuGCy0Lzgp3CiUK1Ql1CRUJwAhxCCgI8wfDB4sHRgf8BsIGlgZdBhYGxAVxBRwFuwRhBBMErAM4A+wCuAJqAhsC6AHHAZ4BXwEtARcB7ACjAGUAQgAOAKf/Rv8V/+3+r/5l/h/+6f3G/aj9fP1D/RD97/ze/Mv8ovx9/G78Wfwr/AX89fvj+7j7hPtx+477n/tw+yr7Fvsf+wb72frV+un61/qc+nH6b/pc+iL6C/oc+v75xPnY+Rb6C/q++Zb5rvnD+aj5pfnm+Q766/nl+Rb6/vln+RL5c/mG+df4fPi4+L34evhe+E/4J/j99+33EPhL+GT4j/gB+Vb5Nvnn+MP41Pi++F/4NPhi+Er42/e39/L3M/hQ+Dn4TPjJ+F35yPkE+g36GvpG+j/6xvk5+fr46vi2+IP4nPjH+O34PPmL+df5O/qk+hf7cPuK+6D7ufuT+yb7xfqh+m/6BPq1+bX55vkh+lr6lfrX+gH7DPsW+w774/q3+nT6+vll+fL4oPg4+Mr3o/e299T3+fcp+Fv4kvi4+Lb4mfho+Bf4sfct94j25vVk9en0evQ39Bf0A/QU9F70wvQQ9U71fvWS9ZD1hPVR9ff0lfRH9An0yfN8803zUPN5877zDPRe9N30bPXH9fn1LvZQ9l32XfZC9hX2BvYe9kj2evbH9j730Pdv+Cn53flv+gv7vfs9/ID8vvwA/T/9d/2a/cb9HP6J/g7/tP9fAAIBtwGBAkAD5AN4BP0EagXHBSEGWwaGBsMGBwdZB8AHHgiFCAUJlQknCqYKDwt3C9gLIwxaDIYMoAyuDLsMvAynDJYMmwyvDMQM3Az7DCsNXQ1+DYYNhw2GDYANYA0rDfgMygyQDE0MDAzTC5gLVwsVC+IKswp3Ci8K6wmlCVcJAAmoCEYI1QddB+8GjQYnBrIFRQXnBIkEHQSvA0sD8AKRAigCuAE9AcAATgDn/3r//P55/gj+qf1M/en8gvwh/M77cfsJ+6j6Svrn+YL5HvnA+Gf4FvjO94L3MPf39sb2efY19gT2wvWA9U71EPXE9I/0bfRL9CD07/PK88PzwfO7873zxPO/88Hz0/Pf89jz2PPg8+Tz5fP08xH0OvRr9Kn08vRG9ZX15PU/9qD27vYw93b3v/cB+EX4hPjB+Af5Wvm0+Rr6iPr6+m375fti/Ob8Z/3c/Un+uP4j/4n/8/9jANIAQAGvAR0ClAIaA6gDMwSzBC4FswU9BsYGRwfABy8IlQj0CFwJyAkrCogK6gpFC50LAAx0DOoMXA29DRUObQ7PDi4PgA+9D/IPJBBVEIcQvhDvEA8RKBFNEXMRmRG7EdQR6xH/Ef0RAxIQEhAS/RHkEcoRuxGhEX4RZxFXETURGBEAEdsQsRCYEHYQQRD+D8APkg9sDysP2g6KDkEO/g3HDY8NPg3bDJIMXQwWDMsLnAtgCwYLqgpcCh0K7QmgCTgJ3wiaCFUIEwjHB4MHTwcCB50GWQY9Bh4GzAVqBSsF8AStBHsEQwTvA4wDQAMcA/UCnwJIAhwC8wGtAWUBPQEkAeYAmQB+AHIAMwDY/5f/g/92/0D/7v60/pb+e/5Y/iP+8v3Z/cL9nf1u/UP9Nf07/R391vyZ/Hn8ZvxH/Bj87/vc+8H7j/td+0z7X/tT+wb76vol+yj7z/ql+sX61Pq0+nv6Ufpi+nf6Vfox+jL6Gvro+df59vkG+sb5i/m7+df5gflU+Zj5tPlv+SX5H/lW+Wn5U/lf+Un5Afkc+Z75tvkx+ej4N/lt+TP57/jO+KL4evhh+Ev4Kvje96b30/fz98T3rffS9+z34/fk9/j3+vcA+C74V/g3+PL32vcH+DT4CPiv96T31/fw9+T33Pf19zn4jfjI+Nr43fgK+Wn5kvla+UH5i/mv+Xz5VPlu+Z/5jPlM+VX5pPnu+Q36G/pJ+pf69PpI+1b7LPsD+/76LPtL+yj7BvsB+wb7FPsl+zP7Uvts+2P7Vftp+7H76vut+0n7LfsZ++v6y/qX+kL6EvoW+hv6E/r9+eP54/nu+dP5rfmu+cj5u/lY+eP4vfik+Ez48vfI95z3Vfcd9x33Nfci9+325fb69uL2t/az9qr2fPZY9kr2Jfbw9dn13vXU9bn1qvXJ9Q/2OfYy9j/2dfay9ub2Avf39uj27/YP90X3bfd696T3+vde+Lf4DvmA+Q/6kPrj+hv7a/vk+2D8t/zs/Bz9Yf3K/U7+uP79/l3/6/+QADMBvAFEAtwCYAPLAysEiATeBCMFWgWSBdoFSQbJBiAHWwfDB1oI8gh2CesJWQrMCjULigvMCwAMIgxBDF4MdQyADJIMtgzgDAoNRQ2CDb0N/w02DlMOcQ6JDoMOYA44Dg0O5A26DZINZw0+DSYNHg0HDeQM0gzODK8MgwxiDDUM5wuVCzILuQo7CrgJMwm/CEYIzAdxBzAH6QacBj4G3QWZBVUF7ARmBNgDWgPkAlwCwAEhAYYA/f+H/xX/pP5B/vL9sv1n/Qb9rvxq/A78iPv/+ov6Gvqd+Rn5lPgg+MD3bfco9/H2vvaQ9mv2TvYx9hH24/Wu9X/1UvUb9en0vPSQ9GX0SPRB9E30VPRc9HP0mfTG9Pj0IPU69Uv1XvWE9bL1xvXV9f/1N/Zp9pv22PYo94L32/cw+JD4/fhr+cv5HPpn+rr6Eftn+7X7+Ps9/Jn8Cv16/dv9Ov61/kb/yP8uAJcAGQGfARQCewLRAigDlwMIBF4EpwT/BG4F3gVKBrgGKQekBykIpAgUCX0J4wlRCsAKFQtZC58L6ws9DJkM7gw9DYoN1w0jDnMOxw4ZD2QPsQ/vDxwQRxB6EKUQwxDTEN4Q6BD1EP0QExE0EUoRQhE1ETcRQRE+ETYRKhEVEfMQ0BCwEJAQZBAzEAYQ3A+iD20PQw8XD98Oqg54DkcODQ7HDYINSg0HDbkMawwfDMsLdgshC9IKhAo9CvoJqglOCQcJzgiHCDQI5weZB0QH8QapBlYG9wWiBVUFDQXCBGoEGATTA6EDbwMaA8UCkwJNAvEBxQGgAUYB8wCzAG4ARgAiAN7/kP9K/xj/9/7I/pT+bv4t/uf93P3L/Yv9T/0k/fL8tPyA/Gr8TvwL/L/7pvu0+5j7WftB+zD7Avvl+uL6y/qo+oP6Uvov+jj6N/oF+rL5VPkz+Xb5tPmm+XX5R/kx+T75X/lf+SX5Cvky+UP5IPkR+QH50vjE+NX45Pjw+Mz4n/ig+J/4kfip+OH4//jo+M341vjg+KT4Ofgx+Lf4Fvnl+H34Rfha+Jn4xfjZ+N34w/iW+IT4mfjA+Mv4pfh8+ID4jfiB+Gj4R/go+CT4HvgH+AX4Q/ig+MD4d/gl+Dn4nfjc+Lr4a/hm+LH4wfht+Ef4ePii+LD4qviU+LL4Efl4+bb5xPm2+cL5DPpz+pz6VPoO+kT6hPpk+kb6W/pG+iT6MvpW+ov6t/rU+g37FPu7+pD68/pj+2r7OPsg+yL7Kfsq+xX79fr/+jj7fvur+3z7JPsi+1v7ePti+x/7zfqG+lj6Svo2+vn5s/mj+cP5y/mS+Uj5NPlr+a35sflu+SD5Cvkv+TT54PhV+Pz3CPgj+On3d/cc9xr3a/eb91H36/bv9lH3kfdU98/2mPbb9h/37/Z49kP2g/bI9rv2kPaQ9sz2OPeN94z3Wvdi98P3Lvha+Gr4sfgZ+Sf5z/if+P74rvlC+n/6bPp6+hn7//ue/Nb88PxI/ev9hv7V/v7+YP/6/4oA+ABEAZsBLALRAnED7gMvBJgEUwUQBpMG3AYjB54HNAizCP8INAl1CcwJLgqFCtEKPwvGCzEMdwy8DA0Nag3ADQIOJw4/DlQObQ56Dn0OgA6QDqIOog6SDpwOwQ7TDr4OpQ6SDn0OZA5HDhoO5Q2uDX0NUQ0YDcAMaAwhDOcLrgtxCzML/grMCpEKSQoBCrsJaAkDCaEITgj3B4MH+AZvBgAGpgVLBd0EZQTzA50DYAMeA84ChwJTAiIC2wF/ASoB5gCUACgAwP95/0v/Iv/k/oz+N/4A/tr9p/1r/Tj9Cf3S/JL8WPww/Ar81fuP+0T7+fq7+pf6jvqI+nn6afpf+lr6Xvpn+nD6ZfpF+iP6FPoV+hP6Bvr5+e/56Pno+fD5/fkQ+ij6Rvpn+oz6rPrH+ur6E/su+0D7X/uN+7f73vsJ/DH8X/yf/On8O/2K/cP99v1A/pn+5/4m/23/yv8jAF4AhgC6AAEBWQHAATICoAL8Al4DxwMbBGkE0gRWBdIFKgZyBr8G/QZBB7YHOgibCPkIXgmZCbcJAQpvCt8KSAukCwAMYgybDMEM/wxGDXANjg28DewNGA5eDowOfA5uDpIOvw7NDrgOnQ6aDrgOzg7EDqkOjA5kDjwOFw4FDvwN2w2eDWINJQ3rDMAMnQxvDDgMAgzQC5ILSgsOC+oKtQpTCuIJkwlqCUAJ7giICDcI+QedBzIH0wZzBikG/AW4BVYF5wR6BC8EBATVA4cDFQOnAmsCWAIlArABHQGyAH4AWQAiAMj/Tv/i/pH+R/4J/tL9mf1P/ff8uvyh/H38MfzN+4T7bftT+wP7qfpr+kn6O/oL+rD5d/l0+YT5bfkU+bb4jviZ+MP4y/iT+Ev4MPg2+Cv4DPgF+A748Pek93/3p/fl9+33y/ex96X3rvfJ9773pPe49+j3BPgI+BX4LPg0+GL4lPiP+Jn4qviq+Mv42vjv+Dj5bfll+S35PPmc+ar5z/li+nD6GvqD+g37yPo6+qX53vkh/PT+t//N/dX6XPmX+or9TgCVAI39uvpk+xj98vxZ/M/8iv2Z/d38Q/yX/Kj87PtV/C3+Pf/S/r/9L/z6+s/73f2f/tb9qvy/+6/7NfxK/PL7hPvr+qr6LPtm+5T6q/l1+ZL5vPkD+vT5QfmK+DH4Evgc+PD3iPev96X46/nk+vz6XPpJ+oP7DP2U/Sn9kfw8/FL8x/zr/Fn8ovsm+976h/qT+Xn4Dvgo+Gb4hfht+FD4mfik+ZH6Nfo2+dv4f/mr+nf7iPt5+6X73PtC/On8gP3M/WX9I/yu+r/5rPnW+Wn5kfiq99z2Yvbw9Tb1pPSw9Av1NPUp9WD1PvZ/93H42/gZ+XD5sPmt+Xb5Gfmq+Ez4Bvj49/r3ufd293/3afcI98n2t/bF9jb3z/c++Jr4D/m7+aH6fPsj/Kr8Jv20/U/+xP5n/3YAZAHKAecB/AEfAksCYAJQAj8CPQI5AkECXQKHAtECTQP7A9kEngUjBqYGWwc7CC0JCgrGClULyAs+DL4MKg1DDeQMTwzTC44LeAtcC/wKeQoXCu8J7Qn1CdcJlQlZCUwJZwmUCccJ/gkvClwKfQqNCpIKnQqjCo8KTQruCZsJWwkMCasIQAjABykHhQbPBRUFaQTXA2oDEQO2AnMCZQKbAgIDVQN0A38DnAPyA2oEpwSABDQECAT8A+oDtQNhA/ICbQLeAUoBzwCEAE4AEgDU/6D/fv9v/3v/nP+g/3j/SP89/2D/hv+R/5//xv/v/wYACQDp/7r/kf9X//X+gP4B/oL9CP11/MH7LPvS+pf6Zfo4+gL6x/mv+db5Ifpp+o76n/rI+g77P/s2+/f6rPp1+lL6IvrP+V/5+vi/+Lf4wvij+En48Pfa9xv4ivjS+Of4HfmQ+Sv6z/pQ+5r75Pti/Pf8X/2Z/dT9N/67/iH/Sf9f/4v/x//6/xIAJwBhAMUAMgGSAekBTwLaAowDNQTIBGoFIwbZBm4H5wdyCBIJqwkVCj4KagrOChkLGQv9CtEKpQrECgULFwsHCwYLNQuUC9UL0wuoC58L8wt9DLwMmQxmDEsMQgxSDF4MRQwFDL4LhgtLC+wKiQptCoMKQQqrCT8JDwniCMsIvAiDCEUIJAjiB5IHcAdzB4oHsQe2B5cHlQenB4oHUQcjB/oG6Ab8BvcGwgaUBoIGfwaLBoIGRAYUBi4GZQagBs4GuwaTBqsG6QYiBz4HOwcxByYHAwfLBq4GvwauBkYG4gXgBfMFygVxBf8EmgRuBGIEOATWA3gDVgM7Aw8DCgP5AnoC4gG4AbYBbgEVAbsAZwBMAPP/YP9H/yH/hP4h/hf+qP3N/Kb87fxd/O37WfzP+3j6sfpt++X6Y/oS+kT6UPzx/aD80Pm39zr3cvjG+mL9a/0O+PzyWvVZ+kf7EvpM+Yv4fviA+WH6jvrk+Xr5i/sJ/qf8bfnD+ET5JPlx+lL8zvuB+i36Qfli+Jj5xfvo/Gr8xfr4+en6QPuK+q/7Y/72/h/94/ur+wz74/rs+zT9m/61/7/+B/zc+TT5Ivr0+6v8L/wL/I/75fnZ+KT5RvuX/K38f/t6+hj6zPkM+g77lftj+0j7Ovuh+kP52/ej99P4Svr2+Xb3cPWj9dr22vc3+Er3RfVB9C711fXD9C3zn/Iu9LT2lfeo9l71Q/Sz8/HzqfRZ9Qj2pvbC9ov2iPZp9gX2+PVg9nv2yvWR9L7zkfSW90n7Z/3c/bD+ugAVAqYBTgHFATECWwPkBE4E+QGUAJwAtwDH/1b9cPpz+An3KPbu9on4M/lN+X35lfnr+Vb6Jvq3+cz5Xfoz+wf8Sfzm+1f76PqA+tz5Gfkj+Mb2EPXo8rPwo+/G79LvHO9l7ojuYe9T8ODw6/BS8cPyr/RO9mb3G/jC+LH5H/tX/B38Qvr794P2Bvbj9Zv1GfXv9N/1iPf5+A76Pfvp/Nf+fQAaAiUEIAZbBx8ICglpCjEM/g1WD9UPdA/SDncOYA4HDicNdwyeDBUNQA0bDe4M+QwvDRYNsQynDCoNvQ03DvsOTBDIEdkSIhPFElcSJxLQEe4QlQ8MDnkM3Ao5Ca4HKQaQBCMDOQK7AXIBMQH4AAQBfgEyAuwCpANlBDgF5QUyBk8GTQbtBSAFNQR1A7MCwAHkADsAsP9V/yT/Df8S/x7/PP+C////vwDKAd0CoAM/BCoFOgYQB8gHegjsCC0JfwnCCa4JRwmoCPQHYwfpBlYGwAU8BcwElASHBHsEkQT6BI0FDwabBkcH4gdXCNAINwlBCd0IIwgZB+AFsQSTA2MCCQGb/1T+TP13/Nv7d/s4+yP7JPsT+wn7F/sI+8f6g/pV+iz68vmb+Sz5u/hG+ML3KveD9u/1cPXm9I/0dfRG9BL0DPQd9D70fPTv9Hj18PV49jr3UvjC+T37nPzb/eL+rf9GAK8AFQGPAewBAALgAb8B3QE6ApUC1gILA2AD+APHBLUFlgZCB/YH3gjcCakKCQshC0YLhQvCC8gLaQvJCkwKDArQCWsJ6Qh2CBsItgdAB7IGFgaOBTYFAQXQBIIEHQTMA7UDzwP2A/EDuQN/A2sDgwOSA0MDogIfAvEB0AGMATIBrwALAK3/pf+W/2z/Z/+Y/wQAlwAEAVMB8gH9AhsE7QRPBXAFtwU5Br0GFwdIB24HlwelB5IHeweDB74HJwh7CJ4IwwgSCXMJ4QluCg0LlAv2CysMPwxbDIEMdAxEDC4MCwy5C3wLNAuXCuoJfgkQCWIIoAcIB44GFAa+BZ0FSgXdBOIEDwXEBEsEHgQVBOEDeQMLA8oCiwL0ATABjQDE/7X+9P3k/ef92PwV+2r6Bfty+zT7tPpM+kH6tfo9+zj72vq8+g371vtr/Nb7mPpB+mr7tvxb/Or6Q/rM+o37vfuR+5T7uvsr/DX98v15/Q79/v34/vL+XP+JANEAqgCYAfcBKwDi/nYAbQInAqMAnf/F/0cAr//a/qD+Ov6f/lUAcwDR/QH8P/1x/hX9cvvh+0L9QP19+wn6LvrH+gj7Vfv1+jH56/fr+Cv6TvmX91j3gPiE+Wf5OfiE9jX15fXR+HL6Nvj49PTz8/RQ9pH2t/Wt9FL01vQH9bz0G/Wu9Rb2M/fQ+Gz5Tfi19pn2BPgG+Xz4hff/9lv2aPZH+Fr5Hfdg9Ib0zfWy9aT1WvYY9tv1K/fH93X24fVw9yn5BPkR90z11PXE9xD4i/bJ9Wr2nfYM9Y3zpPRy9kz2xPVO9qn2h/b/9sj3j/fx9Qf0S/Pd8zH1iPe4+tz9AQGIBBsHiAdXBy4ICAm+CL4HRQZxBHYDRwMuAoX//PvC+IP2uvSG84vzJ/Sg9Hr1hPfQ+cz6OvtK/Bz9B/27/Cf85vqS+YD4avci9ov0fvOZ87vzsPL08KPvbu5/7NbqbOqV6hfrNOwz7fftj+/e8ZrzpfS39dr2yPen+Jb5lfqg+7L8HP3p+/H56Pha+D73FvZ99VX1s/Xm9vL4lvta/hEB/wMiB/EJEAynDTYPzBCzEcAR9xGkEq4S2REEEQ0QoA5ZDZEMGQzgC88L9AtdDNcMSw36DeUO1Q+qEC8RIBHEEJQQjBBeEA0Qkw/CDsYN1gyvCzgKywh7B9MFygPzAZMAav+F/iH+JP5L/on+6P54/ycA1QChAbQCyQONBBUFlwX2Bf0FnwXRBKoDjgKkAYkAKf8H/lb9+/wh/dr94f4qANQBtQNZBZAGlQfECBoKRQs7DDsNNA7xDl0PSg+2DusNCg0RDBoLOQpeCacIRAgfCPsH0wezB6IHngerB9IHIQiWCCQJrwkhCmAKYAo/Ch0K0wkUCcgHLQZ7BLYC3wAa/3r9/fut+qX54vhH+N33tve799D39vdB+MD4T/nC+ff5Dfoi+v35h/kD+XX42/dJ97P2FfZ49f/0wvSv9OT0YPXb9WL2GvfK93n4f/m/+t37zPyj/Y3+nv+5AM4B1gK8A3gE8QQIBd8ExwTJBKoEhAR9BF0ELAQ1BG4EpwS8BNEENwXwBbEGSwfMB3IIRgnzCUIKYApmCiIKlgnzCC0IMwcvBk0FgwS+A/ACGgJZAckAYgD8/4b/Nv9A/4b/zv8AAAsACgA4AIgAyQABATABMQEQAfIA4QDWAL8AmwCAAG4AUQAzAB4AEQAVACMALgBcAK0ABgGUAV4CHQPaA5gEVwUsBu0GmAc8CL8IQgnECRoKRQpdCmcKZgpGCgoK3QnWCdcJ5wn+Cf4J/QlICtwKYQu5CysMtwwKDSgNSA1JDTMNMw0CDWUM2QuyC30LuAqgCa0I7Ac9B3oGlQXZBHwEUQQFBI0DMgMjAyQDHgM/A0oD8AKXApcCrAJ4Au0BXgHvAHkAGgDV/1L/qv5Z/jr+ov2u/CH8MvyT/MX8b/xF/PX87v2X/s/+lP5M/tD+JQD7APMAFQEjAYwAzgAsAhcCTwADALABRgIlAWsA1ADAATgClAGvAJQAGAEoAtID+QSGBCQDzgJHBB8FcgMTAnsD/QQ9BPUCbAL/AaABcwHoAFz/j/2F/Rr/lf9K/nH9ov3p/C/7ivo2+4v7J/v3+h77tfps+W34rPgU+Yf48Pfr90j3CfbR9Zj23/a19pL2m/Ub9P3zY/WC9ob2APam9bf1svWS9Q/2j/Yi9hv2BPex9mL1CPbc90n4hvjR+dP5CPiM99f4Vvng+Jz4LPhL92z2evZv+Lf6h/oe+TL5tPlX+R75RPnn+LD3iva59v/3/Pgn+SL5Nvnp+Ef4EvhF+MH3XfZi9U31IfU69K/zbPQf9ZP0K/S49OP0+fQQ9vT2Z/fc99j2LPQz8jny8/Jx8/P0lvfC+b78gwIeB1gHwge4Cp4L+Qi5BtkGKAeHBd0CJQGM/7X7XPco9sr1APPl8MjxkPNo9Xj3Gvln+uP7NP0c/vD+m/8HADsAFv/9+5H4APYq8w7wQe527YfsCuxL7HrsauyH7Knsb+wv7G3sb+1s76HxQ/PH9DT21va99lD29PXb9aP1UfWh9RP26PUO9qz2SfZc9aX1nvYc98H3KPnq+qn8Zv5kALMC9wQzB9gJdQwhDhsPAxB/EBwQUw+ZDqENdgyUCwwLyQrMCvsKbwv/CzgMQQzPDN0N0w6nD6QQkRE6Eq8SzxJoEo0RPBB8DpMMjQpkCHUGzAQ2A+4BKwGyAGwAigALAZsBEgKCAgkDpgNEBNQEYgXdBRIG/wXQBYUF/wRJBHUDewJuAXMAk//n/n/+Wv6a/jr/FgAWATACXQOYBOEFTAe1CPwJMwtfDGoNLg6YDtUO+A7YDnAO5g1ADYoM4gtJC68KMQrUCYMJVwlqCZkJ7AmCCjQLsgv5C0MMogzfDOoM8wztDI4M4wsgCzQK+QhuB7kFIASrAj0BEQAz/0X+U/2R/Pz7j/tH+yX7FfsX+1j7sfv6+0z8cfwl/Gr7evqJ+Yr4cPdn9n/1zfRP9PfzwvOd853zzfPm8w30ifQy9QP2EPcd+Ar5/vkA++b7t/yB/Sn+r/4t/4P/oP+0/+n/GwAYABMAagD4AGwB8gGSAvwCZwMMBKUEHgVkBXsFwQVKBuAGfQcQCHEImwiNCCIIdAfTBkcGmQXhBDsEdAOEAsUBOQGWAOX/Yv8h/wH/3P61/pH+gP6e/uj+Rv+J/5r/k/9q/xn/4f7W/q/+Gv43/W/82PtW+wP79voa+0f7e/vg+1/81/xY/d79ZP4W/+b/mwBFAfoBtAJsA+UDFwRcBK8E2ATdBNME0gQJBaIFewZeB0gIGAl+CZ8J1QkZCkYKeAq8CvsKLQtnC6oL9gtADHoMnwyVDDoMwAtjCxYLpQoVCooJCAmaCF0ICQh+BwgHrgYrBoQFAgXGBIMEFwTYA9gDpQNLAyYDAwOuAksCwwEJAU8Anv/1/oX+Mf6n/SD9+/wZ/Ub9fv2w/d79L/5t/nH+sP4m/xb/vP4M/7P/1//R/yMAbABvAIkA2QAbATcBZAGvAb8BsQEiAs0CDQNBA88DQQR5BOcEcAWpBaQFqgXjBS8GOAYCBvMFAwbTBYMFPgW+BDcE9QOhAzsD1wJEAtYBtQGqAYgBCgFlAOT/cP8L/6P+Qf74/XP94Py+/H78xfus+1z8Hvyb+oP5pPku+h/6M/lE+GL4y/g/+OT3xvjb+Cz3Jvb69u/35veL92T3G/gw+oL7Pvvr+9f8r/wN/qwApwDV/ln/0gDb/vf76v2YALX7C/Vq9kv6fPle+DP6YftL+pH5Qvu3/ZP9lfwb/8YBU/9L/Ev+XwEpAQIA/f6D/CT63PhY91/2APZ39Fry1PDn74XwvvLO8+ryUvOQ9RL2XvSX8xv1Sfeo9+71kvTJ9D717PR29Ez0CPS78zbzNvJz8qb0qfW286HxdvG18cLwSu/w7/PzyPh8/CgAGQQ7B/8JdgzpDEcLxwljCbwIzwbIBCgD+ADz/Sn6cvbf8+HxHvBV7xbwS/Kg9GL2X/iz+sL8Vv6C/4sAnwEAAiwBSv/0+5f3e/OC79HrNunT54jnyOcV6LTovOnl6p7r0etr7AfuafAX82L1//YF+Gn4G/gy9731JfQP83TymPG28KbwCvEo8XzxdPKD82X0t/Xu95P68fzo/pMA4QEuA7wENgbtBwUKpAuJDCENUA31DFwMoQvMChoKnQk2CfYIxgiYCKsI/AgWCRcJdQk0Ci8LagydDYoOXQ8tEKEQhxD8DxIPww0QDAoK1QeEBTcDJAFe/9H9pvwq/Gj8C/3k/Qb/egD9AWkD1wRRBqIHhQjyCP4Iggh/Bz8G7wSaAyMCgwAO/+X9+fx7/ID82PyE/bX+cgBpAmoEiAa4CKkKKQxNDTcO8w5vD6IPng9UD8kOGw5RDX8MzQsmC34KCwoFCkoKnQrxCmQL6wtdDLAMCw2ADfwNWA6SDqQOdQ4FDoEN3QzvC9AKtgmcCHEHSgYQBaYDRwIWAf3/AP85/q/9YP1S/Xr9qf3X/SD+Yv5p/in+zf2E/SX9lvzy+yj7QfpD+Rv45Pan9YD0w/No8zvzVfPr89P0r/WS9q73xPjF+dv64vuo/FP9Bf6m/gj/L/8+/xv/qP5J/iD+/f0e/oj+5v46/67/WAAWAb0BeQJNAxYE2gS2BbAGcgfQBx0IOwjaB0cHwAY+BtQFiAUrBaMEHwSzAyUDUgKHAfMAdwAVAMv/kf+T/6v/y/84ALEAxwCsALAAnwBMAAcA7f+l/0b/Cv+w/hf+i/06/Qn9xPxl/C78Ifzy+9D7A/xS/Kb8Kv3t/cv+j/82ANwAggEiApgCwAKoApgCvALsAvUC/AIyA3kDqwPyA2oE6ARUBckFSgbLBlEH2AdfCOYISwmJCcsJFAo9CkcKOwohCvEJlwkoCcIIVwj8B8MHmAdmBzsHJAcfBxIH8AbGBqUGmQamBqYGiQZrBksGBwaYBSMFxgRQBKsDCgOPAh8ChQHQAF8AIACs/yT/9P4A/xf/Y//m/2MAvAD3ADYBmQEKAh8C1wHfASQC+gGbAXABUQEMAZsAOwAjACEAEwAiAD0AYQDPAFEBmwEPAsECKQN3AwgEXwRnBJsE1AS+BIUEZARcBDoE4AOZA2UD3wJdAkQCKgLtAdMBxgHJAQ8CYgKQApMCXAJPAo0CjQJkAmwCWALoAYEBZAHbAAIAyf+A/5/+Q/5w/kn+BP7D/V/9cv3H/Vb91vw3/UP9ffyW/Jz9c/2R/Pj8fv2D/Mr7X/xR/EH7avoZ+uD6ovvD+on6OvzS/A78+PzA/hb+8PpG+VX8Vv+N/Y385P62/dP4z/fl+gv8G/q1+CP63PvN+if6uv1fAYMAHP5I/Xr8WPtj+0f8kvzg+1T6Ufi09vP1BfbQ9h33RvYL9gv3UPf49nv4gvvG/KL7tfoY+1v7kvrK+TD6Uvp4+Ar2ifRn88ryX/Py82zzIvPC893ztfOH9fL3PfdE9WD17fSN8j7yDfXl9xn6E/2mAF8DegRTBXkH2wheB9IFcAZRBnEEVQR2BbkDJQBB/Q36YPZj86bxtfH48jv00fVa+ND6avyK/moB7AL+AlYDvQP3AvQALf4g+8T3ifNa78/sZOs+6p3pd+lb6fjo9uga6srrnO0p8MLzaPeV+ZH6nPv9+876z/ie9gX0b/Gj76/uI+6z7XHtp+0D7vjtZ+558H3zZ/Y6+eD76v1o/68A8QFEA2sEKAXCBTcGAQY+Ba8ETwSaA8MCOQL9AUECZQMaBbIG6gfcCG4JkgmfCbUJ4gl2CiQLfAu+CwoMOAxcDGUMBQw0CxkK8wj8B+kGtgXaBEQEpwMJA1kCmwEBAaYAhACCAIMArwBFARACwgKBA3QEZAUKBmgGhQZkBjMG4gUjBQ0E2AJsAfj/8f5W/hH+Y/5J/2cAnQHeAikEnAVEBwQJ1QqrDE4Oow+vEEYRNxGVEIcPKw6pDDkLHApiCfIIkAgoCNwHyQfmB1IIMgl8CvoLbg2dDpIPRBBbENEPEg8+DjINAAzQCoYJ/QdCBocE5AJLAdf/1P5g/ln+lP4T/7T/JwBjAGgALQDo/53/V/9C/xv/rv7l/bH8Ufvj+Xj4VfeF9vb1lvV19av15/Xz9Q/2VPbF9kn3zfeJ+Hv5Z/o8+9P7J/xd/G/8Uvw3/DH8Nvxn/Mr8LP1t/ZT9zf0e/nD+2v5e/wQA4QDSAbYChgNYBDEFxAUrBpMGmQZ5Bo8GWQbSBYIFMgWRBO4DWAOiAvoBjQFfAVMBLAEPATQBXQFoAY0BmwFSASABLgH9AIUAFACV/wn/av6T/dL8Uvzd+3j7Mfv3+tn69Po7+4X70vsb/En8lPwl/bX9Ef5e/s3+M/9G/zv/YP+X/7j/vP+s/5//mP+y/yYAwAAhAYoBPgLsApADYARCBQoGzAaPBycInAguCbMJ8An5CfMJ+QnjCYcJMQnzCKEIRwgCCOYH3ge8B7cH6wcfCDIIUQifCO0IDgkpCUQJSAkvCe4IjQgLCGIHxAYvBn8FxAQPBG8D5wJUAroBTgEiASABOAE/AVUBqAEJAnICtwKvAsYC1QKZAokCpwJ3AvsBqQGpAXUBAwHRAL8AmwCEAJsA6QApAXsBGQKlAjoDFwTKBDwFrgUmBpYG4QYFB0QHlgeCBwUHwAa6BpIGgwZwBusFwQV2BscGMgb0BVUGvwYyB1wH6AaQBs8GGAcUBwgHyQY5BtUFcwWhBAkE3AMvAzkC9QG/AakAyP/m/5T/eP7+/T3+QP7F/VT9oP05/tb91/yD/JP81vwS/fr7h/qQ+vf62/og+xn7VPo6+vr5zvgA+aT6EPtW+qn6Wvvp+Sj4L/pj/bD7Ovi9+fv8rvwP/Gf+TgDp/jT9if6BAAv/0vyx/uoAOP6C+5r96v5C/OT7c/6P/QL7I/y1/oX/ff/a/6MAUQAH/jP9sf8QAfv/nAAYAhIAjfyC/M794vsX+ev4rPmA+e34c/h/+LX42PcO90r3VfbC9Hv1aPcG+LH3I/g9+an41fXW86L0HfX98i7yivQj9W7yX/Cm8Knxh/Fp8PPvxO9z7k/tCu7X70TyuPVf+X38Gf+EAUMEqQY2B7MGOQfkB58GfgQqBEUF7ARlAoD/x/x8+fj1i/Ov8o3y0fKe86T0FfYA+FX6bf0kAMMBcAPZBLMEawMtAtoAUv5L+rX2pvQ18qXvC++b7sDsQ+uC6nHp2+gs6hjtQvDh8kH1Iviy+kz7vfqE+r35+/fv9bTz1fHZ8ObvhO5i7bPsDezF61bsdu0b713xpvOO9U73CfnB+oz8cf5cAAECEAOJA4QDAANTAqABoACP/xX/U/+7/wgAvADqAcUCDgNPA84DYQQCBc4FoQY8B6AH6wc6CGYIQQgnCEYIMQjZB3oHBQdTBnoFpQSrA24ChAFaAVQBDgEQAWIBbAEmAdMAcAAtAEIAkAAOAcIBkAJ5A1kEzwTvBAIF2QRZBMoDLwN7AvEBmQFKARoBHQEoAU8B2gHAAr0D1AQfBn8HuQjECbgKqQuWDIkNeA42D50Prg9wD+YOFQ4ODeMLyAr7CZcJhwnBCTgK0Qp5CyIMtAw3DbENPQ7wDq4PRhCpEMQQkxAeEDkPzQ09DNMKgwktCNUGpgWZBIIDkgLjAUwB3ADSACABfQHjAWsC4AIjAysD2QJvAusB+gDl/+L+vf1k/Nf6Tfnk95D2iPXO9ET0BPQt9Nz00PWx9qr30vgJ+lj7o/zH/bX+a//1/0kAUgAoANH/S//V/n/+Ev7G/a/9ZP0M/Rz9f/3w/YL+Zv+gAAoCbwOzBPsFPgcZCIMI2AgRCecIdQjpBzUHZwaJBXIEMAMNAg8BGgA9/5D+CP62/Z39nf26/fn9U/7M/hr/Lf9j/5v/e/8+/xT/o/7l/TD9m/wR/JH7HPu/+mf69fmb+X75Z/la+YD5o/m7+Sb6zPpJ+8X7fvw4/cD9PP7N/mf/8v9rAOEAUwGsAesBKgJ5AqQChAJ2Ap4CogKhAu4CNwNEA38DAAR9BPIEdQUDBqAGKgeJB+YHPgh0CLsI/gjcCIsIZAgUCGkHzgZZBrMFBgWfBEEEyQOFA3QDWANEA0YDQANjA7kDzwO7AwEETAQiBBQEVQQPBHMDMwPPAhYCkgEcAYYA9f92/yn/F//u/s7+Kv+s/+L/TAAUAZwB8QG7AqAD8AMPBH8E1QS+BI0ElQSTBDQE3APTA6wDSAP9AuYCuQKEAr0CTwPGA0EE8wSnBR8GWwaZBuIG9QbiBvwGHQfzBqIGZwYzBr4F9AQ1BJ8D2AInAhECIQLtAQACWQJsAmgCwAJHA2gDUQPMA30EoQSBBHsEXAQHBJEDFgOlAi8CtQFSAcsANQD9/wMAuf/h/mv+EP8w/3L+2P69/03/D/+eAMcBvAAmAHYB/wE5AZsASwCKAOIAPQBQ/+b+a/7E/Tb9w/z0/CP9LPyW+4385/3f/qr/kQCpAZwCzwJEAhECEgOCBOUErgP8ATkBWAGfAewA7f49/tH/lQCs/4v/vwC6AdQBigFpAXABXwGyAfMB6wA7ANUBEwMiADL8Vf2w/6f9D/xh/eT8mvsH/UD+A/09/Az9nv3y/H77RfsD/X79E/tG+fL5PfoQ+f73Jvea9ir3Ivce9RX0r/Wy9r31APVu9S72Qvby9Dzz7/KK8w/z9vDX7g7vH/Ft8lDz0vVR+aP7q/wr/o4AfAJsA0MEjwX9BvgHDAhMBzQGwQSHAjT/jPu/+JL2HPUP9Zz1I/bZ9rL3EfkA+wD9Nv/cAYkEkwZzBw4HGQb8BCwDNgDE/B36Y/hO9q7zRfFD727tSutD6Zzos+lC7H/vmvKu9ZD4l/pf+9L61fkJ+Qn40fa79Xn04vI78VHvv+wJ6g7oCOfr5t3nvekB7E/urPD08sf0UPY9+IP6dvzf/fb+jf9O/0n+/vzP+6b6hfkF+Vz5//nC+tf73/yR/Tj+5P6Z/8wAaQLfAyIFLwaWBlwG7wVXBYgE1QNxAy8D2gJcAsMBNgHIAHcATgBPAH4A+QCtAUMCfwJ9AlkC2QEAAR0AVv/I/m7+Bv6W/Wr9gP2e/bL92f03/sr+Zf8BAJUADwFyAaIBvAHkAdkBngFoARcBrwBAALr/QP8q/6D/bwBeAZcCOwT6BZ4HYQkuC8YMFQ4FD6cPBxDtD2EPlg6xDc0M5QvvChEKVgm1CFEINQguCGwIJQksCj4LeAz9DYUPshBuEZURLxFfEBQPiw0iDLwKSQnrB4YGCQWwA4kCewG5AGMAKAAdAJEARQH/AbkCOgNeAykDrgIIAiwBQgBy/53+mv1o/FX7fPqO+bD4Ffir96r3Bvh8+Cb5C/oi+0v8Mv3P/W7+9P4f/w7/5P6q/mn+CP6n/Uv98vzg/O78+vxA/bT9Uf4M/5//KwDJAFoB5wF9AiUDxAMrBGQEhQR8BDgEyANOA+YCgAIAAnsBFQHOAKUAiQBWABIA1v+I/yn/6P6+/pD+Xv4t/gT+5/3S/br9k/1W/Rr97Pyv/Fn8+fus+4z7c/tb+3v7uvvT++f7F/ww/Bf8BPwc/ET8a/yw/Bf9dv3R/Tn+jv6+/uP+If9V/z3/Ff8q/0T/TP+A/8L/2f/9/1gAvgAPAWQB5QGIAiIDvQNkBPEEZwXtBWoGqAa0BrEGqQZ9BhwGtQVeBQcFlgQOBLIDkwNwA1cDdgPDAxgEbgTYBDsFewW7BfEF/wUQBiwGEwbEBW8FFgWbBPQDLAN0AtsBQAG6AHgAVQA7AD4AXQC6AEkBvgFCAvACeAPaA2IE7wQtBTIFLwUdBf4E9ATyBLsEagRGBBoErANoA3kDZwMrA1gD4gNfBOcElAUmBpoGAgdYB6YH7wcrCGwIlQiJCHsIeQglCIcHKwfyBnQG6gVsBQwF5ASMBCAEEgQWBOUDyAMLBFAEVQS7BFQFCwWiBGEF5QXmBA8ETgQwBIgDXQM7AwcD+wIRAt0AAAGYAVsB5AAEAWYBjQGPAWoBWgG0AcABUgHFAbwCMQKXAdICdQORAkoC0wKwAnsB7QC8AdsBVwHJAbABRAB7AIMCQAJJAHIBCQQJA1EA6/9vAccCAAOoAgIDnAM4A2ACeAE3AeQCkAMNAcj/nAIOBlYGlwQqBCIFtQUCBToDYgK1A3QFqgUMBEECFgLOApwCLAHN//H/GAEXAdz/pv/AAK4B7ACG/kj+qQHpAz4CHAArAQMDNAH3/af9pf6A/sH+S//c/WD85f1l/zf9+PmA+Yn7ufw9+4b61PzW/V37hvnV+Q/5y/cQ+Zf5LPcN95/5u/hU9b70yfVn9erz4/Gy8Frx7vFm8erwGfFK8m70U/YN+Cj7of55AJkB3QIjA1gDVgWCB9IHrgc4CMUHMgXdAYr/3v1d+4348Pa+9qP34vi6+Xr65fv1/eb/TQHvArsFAAkhC74LiwvcCpsJ5QcNBu4DawHf/jb8NPk19o/zTvF672DuS+7z7k7wgfLT9K72Jfht+Zb6P/tU+3n7xfus+8z6QPlC9+f0VfLG713tjeug6jPq6On66Z3qnuvb7G/uOvA/8rv0VPdX+dP6Afye/IL8BvxS+3P63fm2+Wn56vik+HH4Cfiy9+r3tvi/+QL7gPzU/fL+OwBAAWkBUgGVAaMBRQELAecAiQATAIf/4/4u/nz9LP1Q/X79pf3q/S7+Pv4k/t79av0H/c78XfyR+8/6Mvpv+aD4+Pdx9yT3G/cn90/3t/c/+MT4bPk2+t/6eftB/PT8Nv00/Rf9svwp/Kj7Jvva+ur6Hftf+8v7W/wZ/RT+MP9qAOMBggMXBasGUgjUCd4Kcwu8C7wLhQs+C+sKdQrkCUwJtAgfCLIHmAe6BwMIoghrCQ8KywraC8kMSQ2iDQUORg5PDicOxg0JDfQLqgpACa4HMAbyBM8D2QI1AqwBNgEHASIBRQFPAXABuAEAAkACZwJ3AmwCFgKOAfcALgBO/4f+2f00/Zb8Kfz1+837vfvm+1f8Cv3Z/av+hf9TAP8AkwEJAkkCYgJ4ApUCiwI1AugBwgFsAfkAyADBAJsAcgCQAOsAVAHTAW4CAwN3A9oDPwSRBLIE0QQnBWQFOwX9BN8ElwQaBKwDSAO0AgACYwHiAFwAyP9O/xv/9P6I/iT+Bf66/R79tvyO/DD8z/vH+7X7avtB+xv70/qf+oj6Z/og+sP5efk4+QX5/vgK+fL42Pjm+PD46fj++Cn5XvnJ+V/62/pU+/37rvxO/RD+4P56/97/KQBUAGwAdABhAEsAQAAWANf/yv/S/6b/d/+b//P/OQB8APcAiAHdATEC7gK6AxsEVASQBH8EOgQCBKQDHgOdAiQCtQElAXIA7f+Z/1r/MP8c/zj/ZP9S/zf/kv8rAHEAkQDgABABAAEBAfsAqgBLABIAw/8+/8n+mP55/jT+EP5O/pb+ov7W/mT/5v8sAJgAWQEZApMC8AJHA28DiQPJA8sDZANJA54DnQNJAzUDUgNAAyQDYwO6A+UDIgQ6BEMEpQTkBNgE3QTqBBgFRgUpBfAE2gTtBAIF3gSOBDYEBwThA3QDIgNMA28DKQPBAogCiQKPAmsCNQIsAlYCYAIPAsgB+wEqAtoBXQE0AZsBCwL4AcQBpAHFAVACdQLpAYwB8gGmArIChQIcA60DewN+Aw8ESAQTBN8DwgPsAw8E/QMnBHcEnwS6BFsFjAa6BtwF3gXkBtcHDggCB84F0gapCV4K1Qc+BmMHLwg4B7EFhQRtBDwFNAU2BEIEZgVXBVEDYAKrBHAGCwX0A1UFBQeiB60HTQdvBrwFqAV7BXEEugOdBFkFGgShAioDOQR1A4UC8gL8Ag8DxwSeBesDNwO5BfEHxwakBGEFFwi/CCIHswYYCHYI3QbQBQMGBwaLBvcGKwWIA4QEPQVfA3IB/QFVA90C6gC4/9YAkgLQAZT/6v5s/1T/rv4h/sL9BP4P/5r+Mfw7+7/7pfpl+Cb3nPZq9XPzqPHd8GfxSfMd9eL0lPQc9x36OPsr/Bj+EQDPAdcD/gWTB5EIXgmVCVEI8AWQA2IBJ/8t/Qv8fvsI++n6nvoH+tr6zPwJ/gf/DgHzA98GOgnlCiQMJg3ADXYNGAyXCrUJYAilBfsBcv6N+5L4WPX88gnyLvLI8mPzY/QH9un3dfll+k370PzB/mEANgGmAfgBMAHe/hL8XvlL9inzwvAL76btmOzb62DrXesM7BbtEe5z79Lxi/S99qX4g/q0+xf8P/w//O77l/tM+9D6GfpJ+WP4bvds9pn1L/UT9Wz1cfag98X4K/qZ+6D8M/2F/bj92/0g/nn+kv5g/if+6P1i/YT8kPu7+hP6s/mb+Y/5gvmj+cX5oflD+c34Wvjo94b3TfcC94D2AfaO9R/1p/QZ9KDzb/ON8+3zZ/QI9cf1UfaI9rb26/YI9x/3P/de94n3q/ek92n3IPf19t72zfbf9i/31PfN+PT5MfuD/OD9Uf/dAE0CmAPoBBwGAweOB8oH6QfyB74HTQfOBm0GGQazBWcFSgVCBWEFqgXeBTEGBgctCFAJUAoZC7oLIwwyDAEMtAs6C38KpAnUCO8HzAaeBaEEoANrAj0BVQCw/0r/Hf8P/wr/HP9X/5n/uv/f/ysAcACOAIwAaAA2AAMAvP9O/8T+Tv7v/Y79O/35/Lf8gvxi/Ff8YfyL/Oz8a/35/bH+e/8TAIoAAgFfAboBGQJaAqIC+AIrAz8DTQNpA3kDUgMSA9YCnQJlAjQCJgI9AkICQAJyArUCywLbAggDLAMxAzQDPQMoA/oC8ALmAo4CIgLjAZQBGQGvAEUAtv9A/wT/wf5T/vX9zP2s/XT9PP0Z/QD95vzX/Lv8ZfwM/Ov7wPtg+xj7B/v8+vv6FPsu+zD7Ivs1+3f7v/sK/G/81Pwk/XD9vf0V/nD+kf6B/oT+mP6i/rD+2P4H/xH/+v7n/gP/Wf+r/87/BgCDAAEBTAGsAUYCrgK+AtYC7wLDAoYCYwIpAtwBlAEwAckAkwB6AGAAPgAXAAoAJAA5AEYAbACPAJYAlgCfAJ0AbgAVAKj/R/8F/73+Xv4K/s39sf27/cf9zf32/Ur+n/7v/mX/8f9jAMEACAErATsBLwH8AL4AdwAXAL3/dP8q//D+zv7W/gD/DP8R/1n/1v9mAO4AfQEuAtwCagPKA+kD6APTA4ADCAOZAg0CTAGjACoAjP/p/pr+U/7e/bP94f35/SD+l/4X/4b/+/9ZAKUA9gAcAQ0B/wD1AOAAnAAYAKf/YP8Z/7/+Uf4P/hj+HP4L/ib+ev7a/i3/gf/i/00AxQApAVQBhQHnARIC6wH+ASMCxQGPAfYB3wE3AUABzgHMAX0BtwFEAoMCowIuA6kDhwOlA0MEZwRUBLME8gTCBM0EPgWVBVkFyQTlBKkF4AWjBdoFOwY2Bi8GUQZGBnEG/gbqBk4GTgahBsIG3QaNBtkFqgXhBXsFAAWTBTsG9gXTBQAGrgVmBbkFDQbKBc4FqgavBgoGRgZNBtwFAgYnBjYG7wbdB2sIGQkgCnIKggjSBVsGMQj0BnoFGAZABQwDQwOMBH8DLgEwANEAbwHRAJsAtAKRBbIGVQYUBrcGOgiCCX0JVgmOCq0LvAo3CTsJ7QmvCS8ISQZTBfkEywMJAjkBmQGAARsA1P6e/vL+Df+x/jP+jP1Z/Bf7Qvo6+TH4LPhx+B74TPhY+eP5qPkT+l77Jfys/EL+PADPAdEDJgZ1B64HcQcPB4oG9gR6AtAA+/8B/yb+o/3g/Ov7+/vZ/Br9ef1s/zUCwQQEBycJagvRDa8PuhBjEcYR0xFtETMQFw5uC6QI2gXpAgIAmf39+0r79fqK+mL62vqu+2P8Hf2A/nEAZAJiBFQGiwe+B1oHTgYwBI0BM//g/Hj6s/hk94f1VvPA8cPw+u9w73bvbPA58iL08vXw98v5N/tA/Nj8Lf2L/dj9/P0T/vn9Uv1G/Dz7OvpB+Zv4bvi5+Hb5WPr5+oP7ZPx2/TX+x/6T/3EAKgHRAR4C0QFKAasArv+D/n79t/xk/HX8afwo/Oj7v/uv+4X7Q/tJ+4P7t/vJ+3z7qPqZ+Y/4cvcR9o/0U/Nw8oHxb/CH79/uTu7i7ePtXO4a7yfwb/GX8o7zcfQU9Wn1pPXk9SL2ZPaM9nn2K/ao9e70GfRK86HyVvKP8h/z6vMX9Y32Afhx+fH6bvzU/UP/1ABRAoADagQLBU8FLwXEBEQEzANeA+UCQAKGARAB4gCZADoALACHABIBpgFGAvICkAMQBH0EzwTuBOUE2wTXBLQEWATGA/4CDwImATIAGv8k/nD9AP3W/LH8gPxq/Fv8U/xw/LL8B/1u/fP9ev7e/iP/RP8y/wv/6v7M/q7+oP6q/sP+2P7V/rP+i/6A/pv+0/4v/6z/OwDeAIUBFQKEAtkCKAOBA8gD5QPuAw4ERARdBEcEJQQZBBoEBATmA8sDoAOFA4gDYgMjAyMDQwNBAzoDPwM7AzsDRQNFAzADCAPuAugC0AKcAnMCWAIkAtoBmQFXAQgBuQBfAO7/ff8b/7z+X/4N/s39q/2v/bj9n/17/Xv9gP1f/UD9Qf1J/Wn9tP3i/fH9Iv5M/lP+ZP6K/rP+2v4M/07/g/+w/wcAcQCSAIkAqwDjAAUBIwE8AToBOwFUAWUBcQGXAb8B0gHqAQcCIwJDAlYCbgKdArwCrgKcAqsCtgKYAmoCPQL1AYAB/wCPACEAtP9o/zP/+/7Z/tj+y/6c/oL+l/6V/oP+nf7C/uL+A/8G/+7+x/6U/lj+8f13/Rb9vPx0/Ff8NfwE/Br8YPxt/G/8rvzk/BP9kv0k/mn+rf4z/6//4f/x/wcAEQAGAAQA6P9w/wH/Av8V/+H+kP5r/oD+rP7h/hX/Mv9N/5D/8P8nADMAfwDlAPMA/wA+AVABIwHpALgAcwAfAN7/jf8m/+T+xf6z/ob+RP4+/j7+8f3J/R3+gP5k/iv+ev7O/tL++/4m/yj/Uf+Q/7b/0P/U/7X/r//Z//b/9v/k/37/3f4G/+f/qv+i/u/+n//K/h3+A/+Q/zH/Yv/V/7T/zv+pAGUBxQGdAnMDDAOWAuEDFgXfA9ICwQR8BrUEHgIUAlQEogWOA/QA1gAPAoYDBwSnAsYBqwNVBjcGaASlBCoGpAZEB3wIKAh8Bs8FoQavB1wHJwUZA/sCrAOAA0cC3gDmAIECSANHAgYBBAEGA9UF2wY6BU8DNwQTBxAIaQb4BOoFLAilCDQG0QMqBL8F2wXpA6IBPgFnAkUDigPiA20E2QQbBWcFcAVoBSAGYgc1CIcIuginCKUIzAkkCz8K2QfGBnEHKgi/B/UG6QY+B1gHlwZTBVUFJgYkBmAFlQSQBNgEogSwBKIEzgNKA8MCAAEq/5T+E/6g/LD6d/hc9oX13fXP9Rz1ZfUM9w34qvff91v5GPtw/R4AZQH2AQYE7QZtCDUIWAeVBqEF8gNJApIBGQEZAP3+2v2t/Bj8C/wO/JX8R/6gAJECkQRoBzMKUgxNDjwQoBFiEv8SshPNE74S+xDKDgIMXAkGB0kE1AGFAJz/Nv7P/GX8xfz9/E79hP6aANkC4wTyBv8Ifwo7C2wLCAsZCvAIkgcEBpkEDAPaADn+wfu1+ev3S/Yq9ez0VvX99b72nvfF+D/6rvvR/O39S//BAPUBzwJLA0oD7gKQAgoCIQEvAJb/S/8T/8P+hf5p/iz+3f3D/db9CP58/hP/fv/B/wwAWgBrACQAvP9+/4T/e/8O/6D+ef5O/jr+fP6K/hT+yf35/fX9df3q/H38Bvx2+7X61PkO+Uj4Nvfx9an0dfNx8o3x3fDF8B7xZfGq8UnyHvPp85v0O/Xg9Z/2ZPcO+IX45fgU+dn4RfiW99b2CfY69Y70HvTd86fzffOj8zX05/Sg9Yb2pff2+GP6xfsQ/Un+ev+FAD4BuQE7ArECtQJBAtYBngFGAZ4Ayv8J/3/+Gf7H/Xz9N/0m/WL9u/33/Qj+K/6y/nf/AwBKAHYAbgBIAEoAMACl//H+Yf7W/SL9TvyZ+xT7mfoy+tf5d/lM+X/53fkc+mn6EvvS+1b8tvwK/Xb9Dv6U/tb+9v4W/yf/Ev/j/q/+cf46/jT+MP4S/jD+gP6p/tf+P/+u/xcAngA6AdwBkgJQA/QDaQTEBBwFUAVMBS4FEAXmBKcEZgQlBMkDUwP2Aq4CQALNAakBvgHLAboBqAG5AekBJQJiAnoCaAJxAqwCyAKkAoYChAJPAtgBewFCAckADQBp//D+X/6u/Sn9xPxO/Af8A/zd+5r7pfvs+w78MPyW/Ab9VP2b/eT9Vv7k/jT/Rf9L/0T/M/8w/yv/3P50/nP+jf5F/hT+WP6P/mz+WP6S/vb+Zv/H/wEANwCtAGMB4gHfAeABTAKpArgCvwKmAmoCgALCApECEAK9Aa0BoAFYAfoAyQCvAIgAWAAZAOz/8P/c/4v/XP9z/47/cv82/xr/Ev8E//T+y/6T/oH+k/6X/nr+Z/5y/mX+Of4g/vr9k/09/SD98Pyv/I38XfwR/OH71vvZ+/77R/yL/L78Df2c/Ur+9f6V/x8AswBUAb0B9AE9AncCXQIdAgEC2AFgAdMAgQBSAPf/cP8Z/wf/If9p/4v/nv8jAMgAGgFfAcYBDAIKAg8CHALQAXsBQAGjANb/NP+D/qD92vx2/OP77vp7+nn6+vmV+Rv6m/qW+r36IPvP+6b89vzs/CH9nf0X/h/+2v3a/fH9rf16/Wr93Pww/ET8p/xu/OD7Cvzi/FH9Qv3H/dH+J/8I/9f/AAEvAVoBJwK0AUYAJwGSA8cCc/+8/oUAPAEzAKT+Gf7j/oX/iP+j//f/eAAkAZABtgEeArYCPwOGA68DDAQYBMMDaAODAu0BwAIJAxYBS//z/wsBTwB7/6sAowFSAL7/SAHAAUEBwwLABAcERgLzAnMFUwawBHIDMQTLBKoDAAJbASoCZwMXAyoBTABxAVsC/AGrATQCPgPoA3YD+gISBLwFrQVpBEgEBgW9BAYEhgRzBToFbgQ4BBwE7gOaBI0FuwXjBeIGIQiKCDgIjwjSCYAK1gkJCW0JqAosC44KGwomCkoJ4QfFB+gHxAb/BRcG0QVWBfAEgQQGBJMDOgM7AooAt/+i/zj+3vux+kL6Nvn794f3zvfz9/T3Xvif+Fj46fhJ++n9BP/G/+kBSgRfBeQFSAajBXgE1wNcA5AClQGvAOX/3v6s/aT8z/tp+777HP0s//YAeQJlBN0GrgkpDMsNSg9iEWMThBTcFL0UbxSgE6cR4g5JDHEKEwllB1UFVQO3AdUAOgBf/+v+yf+4AbgDSQXdBtoICAuoDEQNZA2cDcANrQ1zDagMCQsMCf4GmAToAXr/iP3z++j6fPoT+o35nPld+jz7F/wd/Wj+KQA3AucD5wSOBTQGiwYoBpYFZAUaBZ8ElQSUBNMD6QJuAgQCfQEvAXMBMALzApYDMQTJBGwFEgZJBgYG5gUbBj4GAgZ4BdkEPAStAy0DlwLrAWsBSAFVATUB4QCmAJAAbgAyAPX/w/+I/yH/aP5G/eH7cvoT+b/3a/ZH9YL04PMk81/yufFJ8QXx//Bu8UXySfNV9G/1g/Zl9wn4iPjR+Nj4zfjC+Gv4zfcr93v2jvWJ9JvzxPIP8q7xvPEK8mryF/M39IX10fY4+Mz5ePsR/XH+h/9SAMwACwEMAdcAfgDs/zL/i/7C/av8j/uw+g76p/lg+Tj5a/nn+Vn6t/oi+6/7Ofyi/A79f/3G/QD+PP4r/rP9L/2e/Nn7Jvuu+iH6gfkc+eb4rvh7+F74Wvhu+K74LPm1+RX6jPot+6L77PtR/LL88/w7/Yn9wv3f/d794/0E/iv+af7K/iH/cP/i/2cA1AAuAYoB7QE4Am0CugIFAykDLwMBA7ECXgIJAs0BowFvAVwBfQGkAasBpgG+AfABDQIBAv8BMgJuAoACgQKEAkYCtgE5AfMAiwDf/zn/x/5y/hz+qf0u/fT8Bv0J/c/8nvy2/P38QP1p/Xv9g/2W/bf9y/23/Yb9av1e/SH9zPyn/J78hPxm/F38Yfxx/K78EP1n/bD9Fv6X/g3/c//L/wQAKgBZAH8AcwA9ABUAIAAbAOj/y/+9/7z/3f/e//D/XAC7ANwABwFZAbEBFQKOArwCSwLvAXkC4wIUAhYBxAB8AA0A1/+V/xL/qP6A/n3+iP6g/un+Zv/k/1MAyAA6AaEBHgKGAm4CDgIPAjACoQGxAD0ACAB8/7X+Ef6r/WT9Kf0H/QP9Uf0N/rH+6/5s/4UAZwHIAU8C+AIzAxgD+gLkArcCQQKjARQBeADO/yj/cP7P/Yv9cv0r/fb8Rv3i/Tv+Vf6p/jn/0f9BAEYAMgBjAKAAjAD0/z//HP80/73+qP2j/Dv8Jvzs+5r7Zvtp+6P72fvl+xH8mvwk/T79NP2X/UD+kv59/lv+Rf5A/mL+Lf5N/ZX8uvwj/QX9afzy+xf8dvxU/AT8R/y4/MX89fxn/YL9sv1s/ob+m/1y/Y3+0f7W/VH9Nv0L/VX9XP2m/C/8Vvyu/P38Iv0x/S394vwK/SH+tf49/uv9IP5n/qT+BP/x/un9a/1M/qj+o/0d/SD+GP+3/iD+ov6T/9f/pv+P/9T/rAB/AT8BKgC6/5IAKgEcAJ7+Uf6U/hb+Gv2u/A39gf11/SD9OP0x/oP/1f8l/2X/XAEPA68CrwF7AlMEuQTWA4QDlgPOAsEBvAEuAnABBQDn/6IA0gCxAJoAuQCIAbwCcAN+A+8DjQUoB9sGiwW2BR4HbgfjBXMEqATbBMADbwIYAaf/0/8MAV0A2v68//sB7gLcAoADJwX7BoAIewl6CbcJPQzYDhAOcQxfDXEODw1JCygLhgugCpcICQdQBkEFAARWA4ACKAFsAAoAwP4u/Wz87PsX+0L66PlY+v76BftH+2P82Pwe/Bv8cP2T/mv/HwHbAvwC9AKRBHoF5gMxAusB7gEsAen/B/+b/uP9zPzJ+4v6Q/l/+Un7XfyG/Pf96QB2A9gE/QUNCOcKSQ2pDscPFhFFEtUSTBLaECMPiw0jDJMKyQgZB6wFcgT/AkABKAD2/x0AwwAtArID+wR5BkEIyAnJCoMLRgwGDXkNnw2UDS8NdgxnC6MJZwdoBb4DXwJoAaUAx/8U/+P+1P6k/sn+W/8nAEEBnwIHBDYFCwbGBnAHtQe2B84Hzge0B+EHGgjRB/AGFgbnBdEFPwXHBP0EkwUCBjMGeAbcBikHSAdNB10HkwfdBxEIBAikBy4H3wZtBqcF6QSHBHEEUAThA2oDMAP9ApYCKQLxAdMBpAFtATMBzwAwAGv/iv5x/Tb8MPt5+sD5v/iw9wX3ePah9fv02vTN9Lb0+PSr9V72A/fh9674FPlu+fb5cPqk+qf6ovqJ+iH6e/nD+O73B/dT9sr1VvX+9MD0ovTF9BH1cPUQ9u/2yPea+Iv5lfqV+3X8Hv2K/cf98P0d/kn+Gv57/fj8uvwp/D37k/oe+mT5uPiX+Kf4bPgW+AH4LfhH+FX4qPgL+Wn5CfqG+nn6c/rc+i77+/qs+sP6Dvsb++/62frV+rT6lPqH+l/6Nfo6+kz6WPp7+q363/oW+0b7Y/uU+/P7YPzB/Cv9p/0n/pb+7/4+/4L/x/8iAG8AigCfANMA9QDoAM0AvwDCAMgApwBYABkAGwA6ADQADQAMADYAUwBrAJoA3gAiAUcBTQFjAZwBvgGaAWUBXgFiATgB8gCvAF8A9P+J/yX/sP44/vH92v3I/aH9ev1r/XP9j/20/cb9yP3j/RX+Pv5h/n/+ff5q/nb+kf55/jL+Af72/fP97P3X/br9uv3Z/fT9FP5B/mT+f/6h/rj+wv7j/ib/S/8l//r+Hv8+/wX/3v4I//f+qf63/u7+7P77/jn/fP+2/9X/8/85AH8AmACQAHMAZgB4AGoAPgAZAMr/Uf8H/9v+fP4W/u797P3r/ev9+v0b/kb+g/7W/ij/Xf+W/w0AfgCSAJ8A6gAUAfMA0wDVAMwArwCkALoAxwCgAGAANAAXAA8AKQAwAC0AUwBUAA0ADABmAGYA9f+y/8r/3v/N/8P/xf+n/3r/j//D/5b/Q/9u/6//ZP8a/z7/Hf+e/nv+dP7m/VP9Rv1F/QT90vy8/Kr8r/zV/DD9nv3X/RT+nf5P/9z/MQCQANoA7wA3AYYBYwEhARQB9QB4AMv/Uf8B/6n+f/5p/sz9Kf1z/RD+N/4w/jb+WP7j/p//4//N/w0AhAC9ALUAWQDN/2H/Lv9u/xj/df2G/Af9Bf0K/HX7rfun+037pPth/K78yvwe/cr9S/5n/uj+vf8LAMP/Zf+J/7v///4K/hn+YP54/dv7//pB+9D7yPsB++D5hfkX+yT93vwR+6v7E/+3ACL/UP6e/8gAXAHnAbYBlgAsAEYBowEAAOP+2f9LAEL+i/wH/hUAAf/s/IT9A/8X/6L/xgCc/7n9g//6AnQCH/+n/jYBeQImAY3/Cf8w/zkAJgHC/839p/5ZAMz/zv5u/9UAuAGbAAL/ngCoA2sD0gBnAE4CbwJ0AKYAtwJ2Aa3+t/83ASv/2/3T/4QA3P2a/F3/wQFtADf/oAHmA+YCrAJeBXMG9QToBe0IHwm7BxoI4ggeCagJ9AkpCc8HOgcdCBIJFQgnBmoGJgjGB7EFEwUqBgEHcQYjBcsE8wX9Bi8GpgSMBBIFyQToA2ECkADI/7X/hf4A/EX6u/pG+1P5HPfj9135lfi698z4Gfru+jT8of3T/hYAqQEqA9sD9QMoBEQEPQR6BHUEqgPyAnYCYAFmAFUApP8M/uT9Y/8uAO//gQB4Am8EnwXbBqkITAqtC1sN6w7sD5UQqBAbEKYPUA9yDhkNbQuYCT8IYgcBBgkElQIrAvoBPQHXANAB4gJCAxEEVQVSBkcHQgjWCCgJvwmaChsLvQrMCRMJpAjkB7sGmAW4BA4EZQO9AnMCawIbAtcBUQL8AjcDjwNjBDgF/AXkBn8HeAd9B/YHMgjeB8YHKghACNwHpwetB4oHZAdgBzEH/AZSBykInQhPCCAIkgjNCGQI6geoB1kH9AaaBjcGqgXuBCUEjQMOA1MCkwFBATgBNQFFAW0BawE8ATUBSgEWAcEApACMADUArf/x/iP+dv2A/Az73Plf+d741/fS9mL2ZfZq9i72AvZa9gb3t/ds+AX5n/mR+oH7v/ul++f7SPwx/M77ivs7+5H6z/kn+Wv4pPcY99D2kfZa9or2/vY192n3C/jR+Hj5Jvqq+vP6fftE/Ln8rvxz/D38+PuV+zz70/ok+lj52/ik+FX46veb94P3vfcZ+Dj4Nfhp+PT4ivnE+e35WPrN+hr7Mfs/+277a/s++zT7MvsZ+x37afuq+4v7nfsi/G78cPzC/Fj9sf3f/Ub+v/7y/gn/Qf9w/3r/gv+e/67/uf/g//7/5f/P/wYAbQC7AOMAEAFyAQ4CbgJHAk0C3wIGA5cCxAJKA8gC4AHrARwCagGZAEoA6/90/2n/ZP/4/sX+Jf9m/z3/TP/W/08AYgB5AOwAXAF+AX4BYAElAfcAywB2AAMAtf98//7+VP7h/cD9sf1l/Sn9bf2d/Uv9Vf0q/rP+cv5l/gr/gv9Z/2//FwAvAJD/h/8BAKv/8v4K/0D/uP5T/o/+gf4W/jT+iv41/sH9Kf7o/gL/t/7F/jH/eP9g/z//Yf95/zT/4P7S/uX+yv51/ir+Bv7I/aT9zf3T/YX9PP02/Vb9hP23/YT9Ef1Z/QD+xf1G/Zj90/1c/Wf96v2E/en8Zf3e/YP9lP1W/pL+Sv5x/vz+Wv+O/7T/7/9YAIQAdgDXAGABOQHVAN4A+wD/AAYB1gCKAHkAlQC5AJgAAwDM/2EAhwDY/8H/WAA7AK7/3v8oAJ7/Hf9R/1b/zf6b/vL+1v4T/qP9o/12/Vv9X/34/Fz8TvzN/AP9sfxy/FT8RPyr/DH9Hf3K/O/8Xv3B/SP+S/4G/vb9kv4F/87+4P44/+f+qP4Z/wr/QP4E/kL+6/2C/dH95f0c/bz8Uv2f/Y39EP53/hr+Nv5u/2UANQDH/wEAnwAfAS0BuwBiAH4AVQCx/zD/dP5f/S39f/2I/Cj7cfsk/Er7ifpy+yv8m/to+2L8f/3+/fj9Mf48//b/Z/+o/kD/5QDwAO7+Ov72/nz+mv29/XL9Lfy9+2z8e/yv+7v7+fyN/cL8efyM/V/+Pf4z/rf+hf+y/2f+C/28/Yb/O/99/O/6Ufyo/c/8xvve+7H71Pvy/S7/A/1D/BoAMQJV/3f+8QHqAj0Axf+YAYkB9/9T/43/Pf/u/eL8Ov3a/WD9ffxU/Az9Ov7z/un+8P72/4sBPQJNAqUCsQIZA6wEJgXoArcAsgGcA18Cy//E/6oAj/9C/gr/0v8S/0z/BAFeAaUAsgE7BB0FBwRgBJYGSQf+BQ4FaQWRBk0HGwaCA2wCmAMoBNkCjQFqATECXgOlA8gCCANNBTEHUQcZB7QHwAgiCskLIgy5CjkKmwvsCzQKLwloCbQIEwc4BvgF7ASCAzgDXAM4AqEAaQDoAL0AGwCn/6v/ff+F/hb++P5y/7H+X/7u/vL+sv54/zoA0//q/30BawLcASoCCAQlBckEpwT+BLUEpwS2BQsGfQTwAl4DlwSuA0YBtQDRARsCmAFnAWYB3AGLAw0FtAQNBFAFjgfUCCAJUAnnCfcKjgsPC1cKPQpvCgkKwQh+B9oGawbABeQE4wPRAjkCVgJmAjUCSwKhAiwD8gNcBFgEygT8BfMGHQc9B70HDggbCEYIQwi5BysHCwf9BrIGWwYRBuoF3wW6BZUFkgWIBagFFAZbBj4GJQY+BlAGWwZ/BmkG8QWjBdQF4gWeBYcFiQVdBT8FYAWbBb0F6gVBBnAGbAarBgEHxwZNBlEGcgYRBnwF8gQsBHYDPwPuAs8BhgAWADAAxv/p/oz+o/56/lX+kf6z/oH+i/4c/4D/U/81/2T/af84/xn/8/5W/nL99/y0/Bj8Rvt++t75aPkI+bL4Q/jv9/n3EPgV+Ez4n/ja+Bv5ovko+i76HfqF+hT7Ovvj+nr6g/rQ+rL68Pk2+RT5G/nc+IL4DfiX9573+Pex9972wvZ196/3X/eT9yP4PPhP+A/5qPlG+Qf52Pmz+r36qPoK+1v7QvtM+5X7iPs4+zT7U/s6+wf71vrQ+gb76Ppr+lz6vvrc+tj6Qfuw+7j7AvzK/C79D/1h/Ur+5/7y/gr/b//i/xgA3v+r/wEANQDG/3f/q/+w/2D/TP9T/wb/3v5O/6//aP8l/8X/pgCnAFUAqQAbARwBLwF4AWcBCgH+AFMBTAGNAP7/HQAvAO7/tv+W/3P/aP+B/6H/vv/e//3/GABBAIUAzgANAQ0BtQCWAMwAsAA/AOT/pP9z/0z/Ev+s/jP+9P0W/jn+7/2P/av9Hf5J/jz+if7f/qr+iv4M/3v/O//D/rz+8/6//iH+zv3a/ar9PP0J/ej8f/w1/Ib85Pyx/G38sfwv/W39ff3D/Tr+c/5k/nz+0/4P/wX/6f7g/tL+of5p/kv+Lf74/cX9mv1Z/Sf9SP1o/Sz9Bf0//W39Yf13/dP9Bv4J/lP+oP6n/s3+F/9K/3D/lf/A/9D/o/+D/9L/SgAxAH7/Hv+R//P/qv9I/+3+k/7O/jz/5f5Z/ob+0v6h/pf+9f4l/xb/Zv8JAEgAHgBXACABjAEbAdgAjAEAAi4BhAARAVABbgC0/7n/nP/s/mX+Sv79/bD96P3k/U/9Wv0x/lz+0f0X/hb/cv80/zv/vv9UAIYAcABpAGYAWQBTADUAAwD+/+v/OP9v/q/+Xv8A/+n9pv1U/rz+Yf71/RD+Yf6i/u3+2/48/iL+KP8VAIj/Nf7u/eP+nP8r/0f+QP7c/tf+Uv5m/v7+If++/qL+5P4R/1r/0f+e/93+Dv8VAPr/vv5f/vL+AP+p/m/+qf3Z/GX9Jv5B/Qf8dvyE/WX9m/yU/HT9QP5I/un90v0d/sD+mv93/9f9M/3c/qj/2P1Y/Mz8KP18/Ar8J/zQ+9r6yPrx+278EfxI/LL8ofw1/Qn/0v9Z/vv9UQCUASIAaP/CAGMBPQCG/xcAKAAW/3X+af7b/YL9+v3z/bj85/sF/Qz+/fwk/DL9Hf6l/Uf9I/7u/of++v07/tj+W/+M//z+1/2Y/R3/eQBx/3X9rP3J/8cAIgDZ/2IA/ADRAcwC9gI7AjYCqwOyBAQEBQPPAvQCCwPcAhkC6QD+/zAACwFEANz9Xv2C/0wAK/4V/Tn/AgGmALwAfQFnAWIC/gRIBRcDXQNdBj8HXAWKBIgF6AWgBcAFAwVhA6cDBQUCBIoC5gPGBEACxAAJA78EEgNfAWYCJQP9AVcCnAMZAhgAiQG3Ay8Cnv+wAL4CDQIIAfwBFAPrApYCMgNXBB4FjgXpBYIFAgWBBr0IFghKBRgFygdaCAEGxAQUBesE9gQgBXQDlgF6AkIErQOzAWsB9wIVBDEEEASeA7EDtwWiB7gGewXtBoYIqQfSBu8HaQjTBiAGbgdUB98EAASeBe4FKgRvAx0EEQS9A3QExQT7A2QEXwbnBnIFJwUBB0UIcAdPBpMGeQd7B6AG2AVhBXgF4AVIBe0DiwMOBCkE0APUAxoEPASVBAAFAQVMBS4GeAb+BTcGKAcdB/YFjQU6BhIGxAQyBDoEYwOHAtwCCgPJAcoAqwGSAs0BGQH6AfkCywKbAnEDJQTqA8cDRwSEBAEEoAPzAwMEFgNPAo4CiAI5ASQAtwCeAeUAV/8i/xwAdQDs/5r/4f82AEcAOQAqACkAXADMABgBmACf/5j/sQDzAKD/5P77/7UAmP+w/mL/7/9j/zT/qP9b/7X+JP/I/yn/Uf6a/h//lv6w/ar9H/4g/s/9mf16/W/9jf3E/fD95P3M/TD+xv6O/hf+p/5S/9D+QP6Y/tn+XP4L/kv+Jv6E/WH9pf17/e78tvwG/VD9Ev3U/EP9uP1+/T79oP0y/jn+3P3r/WH+YP4J/hz+Iv6m/Zj9F/7n/SD9Lv3o/fD9U/1Q/ff9R/4k/i7+Yv6T/tn++v7l/gv/Rv/V/jr+kf73/iL+Vv3I/fX9//yR/Cn9Jf15/LT8iv1m/dP8a/10/mz+Ef6S/iv/8P7I/mb/n//e/oX+Gf9B/1b+h/2a/bf9OP29/Ln8qfwo/OP7b/zV/Gf8Pfz0/HD9M/1m/Uv+cf7n/Ur+Mf8I/03+af7g/or+Df5E/jH+Uf31/Hr9gP3c/MH8C/3R/Jr8Ff13/S39DP2U/RT+C/7i/fz9Pf53/pj+d/5A/mH+j/5c/iz+S/5X/i7+Hv4q/h3+H/5X/mr+F/7b/S/+nP6A/gL+y/0o/pT+Yf7Y/fD9j/6M/vX9BP6S/qz+hP6p/vL+Bv8H/zP/Wv9p/5L/ov93/4L/wP+k/2r/iP+R/1P/Tf9W/xX/B/86/xv/y/7F/t7+wP6c/sH+1f5x/in+mv74/or+FP44/nv+jf6a/ob+U/5q/s3+7f6q/q/+Kf9S//3+2v4F/wP/8P48/2X/of7W/WH+N/+P/nX9oP00/tj9L/1N/Z79Jv3B/Dj9eP0G/QH9q/3O/V39s/2U/pv+N/5//tz+z/4c/5b/Nv+O/s7+bv9T/7P+TP5D/mj+c/4S/oD9av3U/Qb+vP05/f38dP0V/hP+v/3K/R7+RP43/jj+VP5N/kf+aP4r/rX9qf2q/ZH9mf1h/e783Pwh/TD9Ff1c/bj9l/2R/T3+zv5t/gr+5/65//b+Vf43/4b/Q/7Y/eP+vf4r/fP8Cv7X/bf84/yT/Rj9w/zx/eH+Cf5v/d/+IACA/wX/2P9lAN3/j/8BAMX/yf6m/gn/av41/QD9lf1F/SD88vvr/F39wfxg/AT95f1F/kz+aP7R/l3/vP/V/5X/M/9Y//H/xf9v/qH9i/5Y/wT+Pfyh/PD9n/2P/Lb8Rv0T/Ub9bv6n/p/9v/13/00AU/+m/n//RwD6/5L/ef9B//3+4v6s/jf+2v32/Tz+4f0x/VL9I/56/gP+tv1x/oH/mv8L/yz/9v9iAEgAPwBuAGAARQCbAJMA7v/w/3cAKwBS/2D/KAAkAKP//v9xAAUA6v/FAC4BrwBkAKwA9wD1ANUA1ACuACkA8/92AJUAtv9h/3cAagHzACoAqwAzAvYCfgKhAjoETgWkBDUEYwVRBsIFNAVqBRgF9wN6A+8DrQNFAokBGgIHArMAYQCcAawBXADJAAEDkgPWATgBWQMjBUQEDwPTA+IEVQSLAxIEaQRbA+4CMQRABFUCRAKqBAQF0wLtAskFggZ+BDkEXAYtBxsGyQVEBt8FVQWeBUsFwwP+ApUDiwMuAiwBkAE9AswBGQGkAaECzALLAmMDEARlBLYEUQXRBZMFWQX6BTEGTwXsBGUFLQU8BO4DJAT7A6wD4AMaBLQDlgNeBPUEzgS1BCUFjAWEBYgFqAVdBQAFIAUvBZYE8wPvAxkEyQNaA3kD2wPTA6ID0AN4BDYFYgUYBUgFHQafBlcGCwZEBlsG5gWOBXsFAAVsBGoEPARTA84CagO7A9cCeQKOAy4EcQMcAxkE7QS3BIkE6wQQBeUEAgUeBakEMgRdBHcEzAMXAxgDVQMBA0cCKwLFAtACBALQAZoC8QJuAkECnwKcAlUCcgJ7AvMBqwEVAisChAEJAQYBEAEWAf0AsQCbAOEABQHhANIA9wAaARYBDwEpASUB5gDgAA0BxwBKAEYAVQDt/3//ff+G/0b/CP8K/wT/0P7H/gL/C//I/sj+JP9E/wT/7/4X///+uv7j/jP/2f5A/mf+4/6a/vb9I/6r/mn+2P0C/nH+Yf4q/jn+Xv5u/mP+Qv4d/hP+Lv4+/jX+D/7B/az93/3f/ab9d/2T/e393P1P/Rb9df22/U393fwJ/Uf9D/2x/Jb8w/z4/Av9Bv3p/N38L/3H/Q3+1f3s/a7+H/+v/lf+yv5O/xv/d/4g/jf+J/6t/Rz9qfxr/FD8Kvz4+7v7k/vS+1L8ifx1/L38if0k/hz+HP61/kb/W/8y/+n+3v4P/8v+G/62/cf9zv1f/fD89/wb/Rj9Kv1G/WX94/17/n3+Of6M/lT/oP8s/8z+HP+D/0H/qv5v/o/+qP6I/kX+EP4q/on+sf6Q/rT+L/+Q/8H/2v/M/9L/HgBfAEAA0v+P/8f/8P9s/7n+yP5U/0b/wf68/hf/JP8o/2v/hv+R/+n/NgAhAPP/HQCNAK4AWwAVADAAbABcAAIAyf/s/yAADgDW/8H/0P/W/8//2//2//v/3//R/+v////q/9L/0P/P/8D/r/+s/5r/fv+S/5z/Wf8e/zb/Uf8a/9b+7v4l/wv/z/7N/vD+B/8L/wb/G/8W/87+zv4x/yn/uf6+/g//3P5n/mb+n/57/jj+Uf5s/g/+rf3J/e39qv2B/cf94/2G/V79uP3g/ZL9mf0p/lj+2v2Q/eP9M/4S/tr96/0k/gz+kv04/Tz9Qv0m/Rn9AP2p/HP8oPyx/HP8evz4/Gn9XP0L/SP9xv09/gb+tP0K/oj+O/6O/Y79+f38/bH9e/1r/WP9Q/0+/UD9Df0u/dv9Jf6i/U396P2m/or+/f0A/ov+sP4h/rr9/P0z/s/9Vv1B/Uz9M/0l/Tz9Rf1B/Yf9A/4j/u79Fv63/iL/Av/k/i3/kf+l/17/Gv8v/0n/6v52/nn+jP5E/gX+DP4M/uz98P0c/kP+Y/5w/pv+GP9Y/zP/X/+8/6D/TP9U/3X/If+S/oX+zP5r/pD9U/2u/dH9gf05/XD92/0i/mj+t/79/l3/3v9CAF0AaQChANcA2QCxAGUAFQABAOL/NP9Y/hz+Uf49/tL9gv2S/e79Pv5V/m/+3P6V/xkAIgAmAJYAHgE1AQ4BIQE6AeUAewB7AHQA5v9j/37/r/9G/6z+sP4V/yL/B/9e//D/LwBOALUAGgExAWgB+AEzAuABuAHuAfQBhQEjATsBRgHVAFgAJwAKAM3/pP/S/w0AEAAJABoAQQCJAOkANQFWAYwB+QEwAvcBtgHcAT8CPAKzAVABbgGWAUEBuACpABwBdAFTAfYA2AA3Ab8B5AG+AcgBGQJkAlQC+QGiAZkBCQJcAtwBIQEgAZIBngEeAagA7ACbAZcB3QCiAEcB2gG8AZ4BAgI8AhUCZgL4AsECXAL+AuADpgPEArECfgOxA7IC5AFWAtsCIwIdARQBZQEDAVIAOACkALoAXgBUAMgAMQFiAacBHAKDArsC6QItA1gDZwN1A10DIgPpArICcgIIAo0BTgEtAe0AuACvAKkAnwC8APkAKQFcAbcBEQI3AksChALGAtoCywKuApQClgKIAiECpgGUAaoBZwHxAMUA+QAkAf8A3QAVAXkBswHCAeQBHgI+AkkCbgJyAikCGgJyAnEC1QFkAYgBswFmAfQA+QBWAVgB/wAFAWYBdAFdAb0BQQI6AvcBNwK2Ar4CewKBAsoCzgJcAgUCGgIaAtABqAHLAc0BcQE0AYEB0gGfAX8BAQJ6Al0CNAJwArwCzwK/AroC0QLYAqsCewJ7Ao0CgAJPAjkCZQJuAjYCLQJoAqoCzQLLAs0C2ALZAtoC1gLGArwCxwLKApMCPQIjAksCRgL7AcsB2QHkAeIB5QHYAc8B/AE6Aj8CFAILAkcCfgJmAiACFQJfAogCIAKaAaoB8gG/AVsBTAFiAUgBGQEHAQkBBAH+ABYBOQEfAegAAAFIAU8BDAHTAOoAGAHoAIUAbACOAI0AXgAlAAoAGgAhAAAAyv+m/7n/0/+w/2v/Tf9i/27/Rv8j/y3/NP8s/z//QP8a/yf/Yf9n/y7/FP9D/2L/Of8T/xL/B//p/sz+oP5u/kX+Iv4J/ur9uf2q/bz9qf1+/Y39vv3G/cr9A/44/jb+Nf5j/pT+j/5m/mL+i/6J/jT+/P0h/jr+Af7A/af9mv2A/Wb9Y/1v/XT9hv2b/X/9Q/1S/aL9of1L/Un9oP2k/T79D/1P/Xn9RP0i/Vv9e/1B/Sn9dv2+/aP9g/3H/fv9r/19/dr9Hv7q/dz9K/46/uP9xv0W/jn++f3d/Q3+I/74/bv9mv2Z/ZX9dP1S/UP9KP0V/ST9H/0a/Vr9j/2H/Z392v3z/QT+Rf6U/q/+gv5m/pf+oP5H/gD+C/4U/tj9j/14/XH9YP1j/Xj9gv2c/dj9Bv4G/gn+U/6y/q7+c/58/o3+R/4K/g7+8v2n/X39g/11/TT9K/14/ar9sf3k/VL+rv69/r/+Bv9c/2n/Wf9o/2H/D/+i/nf+df41/sz9if1f/Tn9Iv0w/VP9cv29/Tb+dP5m/o7+Gf+Q/53/iP+u/+X/0P97/y7/Cf8G///+tv48/v39IP5E/hf+3P0S/pb+xf6T/qb+H/9m/1f/f//Y/9H/g/90/5P/ef8v/x7/SP9Q/x//3/7Z/iH/Vf9E/zr/Xv+Q/7n/uv+a/6j/8v8YAOv/o/+A/5L/rv+J/0P/Mv9U/23/Tv8Q/wP/RP+O/47/YP9u/7f/1f+o/3n/iv+6/7v/i/9U/0P/Z/+W/6H/fv9b/4T/yP/G/5T/lf/s/zIACAC6/6z/yf/L/5D/Q/8j/y7/Hf/E/mT+Vv55/nP+Qv4k/jP+Z/6X/rT+6P4j/1H/kf+9/6P/gv+s/+L/mf8W/wb/J//k/mL+FP4N/hL+5f2f/Y39sP3i/SP+V/5Z/mz+zv42/1L/Pf9V/7X/2P97/zL/UP9a/wT/p/6H/oD+Uv4R/v39A/77/RH+VP6U/rT+wv7o/jT/ef+e/73/z//T/97/4P/f/+D/z/+2/4n/XP9r/4T/bP9M/2n/uf/Q/57/mf/l/yQAIwAaAEoAoADGAKIAjwC7APIA8QCzAIEAoQDbAMwAjQB8ALIA0gCHADYAXwCkAI0AWwB5AM4A5gC9ALgA5QANAR4BMgFWAV8BSwFuAcUB4wG4AbEB3QHHAXwBeAGqAawBeQFhAYkBjgE4AfkAMQGGAWgB/gAQAakB2gFxAXMBGQJhAgUC3gE0AmwCOwIRAlACkwJaAgwCLgJLAvQBqwHQAQYC+AHQAeQBGgIbAv8BAwIpAjQC/wHaAfMB+gHbAb8BuwHOAdgBrwF3AZAB5gHwAcEB8gFmAn4CVgJbAoECnwKZAmYCTwJiAmwCZQI7AvAByAHfAeABkAFIAWIBnAGUAWoBZAGMAbwBxQGZAYEBrwHkAdkBtAG9Ae4BDAL3AdIBzQHuARUCDQLpAe8BIgJHAjAC8AHSAekB4AGQAVgBXAFNARcB/AD3ANgAwwDkAPwA5wDqACcBVwFmAXgBmgHPAegB0gHkARMCBwLqAfEB8AHTAbYBqgGlAYsBVAE1AUQBUQE/AS0BQgFlAWEBUgFhAXwBhwF/AXcBjQGuAaUBhQGPAbABqAGJAZEBrQGlAYsBkAGqAa8BkgF2AXYBfwFtAUsBPAFGAUoBNAElATsBSgFBAUsBXQFOAUkBagF0AV0BTgFRAWABVQEjAQoBKgFGATYBFAEMATEBRAEkAR4BQQFWAVkBTgFEAUUBPAEuASEBBwHnANcA2QDAAIQAagCOAJwAcwBhAHkAggCIAK0AwQCxALAAxQDYAMoAogChAMAAsAB8AGcAcABnADoACAAFABEA7f/A/7n/uP+k/43/iv+C/2T/X/96/5b/qf+x/8P/2f/c/+D/7//+/xAAFwAPAAQA8v/W/7v/mv9x/1H/Mv8U//r+yv6n/rj+1v7Y/sf+1P4L/yP/GP8j/1f/mP+x/5P/gf+S/43/Yv87/zX/Rf8+/wf/zf62/r/+xf6p/ov+kf6k/qr+pf6W/qD+1/4B//n+6f70/hT/Kv8e/xH/Jf9E/0b/Kv8J//P+5/7c/sn+rf6a/pj+gv5a/lH+ZP5w/nX+if6i/pj+jP6//gX/HP8W/x7/N/9N/0j/Lf8i/y7/Kf8B/8z+of6O/oX+ZP4v/h/+Nv43/iH+Hv41/lb+gf61/t/+7/7//h//O/9D/zT/OP9W/0D//P7O/rr+r/6R/lj+N/44/jP+Fv4C/hD+J/42/kb+Vv5s/oz+rv7M/uX+7v7w/gb/H/8D/7/+pf7D/rD+Wf4s/jz+N/4N/uf93f30/Q7+Fv4i/kP+bv6a/sD+yf7P/vf+Jf8q/xD/8f7i/tv+vv6P/mr+T/4t/gT+6P3n/fH97/3z/RD+NP5P/mj+k/7M/u7+9/4N/y//O/8z/yn/Jf8j/w3/4/69/pn+ev5r/mX+Yv5m/m3+dv6B/pX+uP7b/un+Av80/0j/Nf80/1j/cv9X/yz/JP8v/yT/Af/0/g//JP8c/w//E/8m/zz/UP9n/37/kf+Z/5n/n/+t/7X/rf+X/3r/ZP9W/0b/Mf8m/y//O/8t/xT/Fv8s/0X/Vf9d/3r/p/++/7j/s//L/+j/5P/U/87/yP+2/5L/cf9h/1T/Qv8y/yH/Bf/x/gL/JP8l/xj/N/9s/3T/Vv9P/3v/sf+8/6n/nP+i/7f/sf+H/3n/i/+H/2r/Sv84/0D/P/8U//T+C/8x/zr/J/8j/0H/YP92/5r/tP+m/5//sf+x/5f/gf+P/53/cv8u/x7/MP8g//b+7v4I/xH/B/8P/yX/Pf9i/5D/s//O/+j/+v8BAAIADgAfABIA5v/P/9X/r/9c/zf/TP9P/y3/FP8m/0P/R/9S/3b/nP+x/7n/y//f/+f/CQAxADEAIwAeABwAEQD8//T//P8KABYAFgASABIAFAAmAD8APwA0AEQAYABcAEAANABNAGoAYgA8ACoAUgCJAIQAawCIAL8A2QDTAMgAywDYAN8A1wDBAKQAlACUAJAAgABnAF4AhACwAKAAhQDCAB0BKgEfAUoBdAF4AXgBfAF7AWMBPAEvATABBgHTANcA5ADGAKgAvgDlAN4A3AAWAUMBRgFQAWkBigGRAXkBdQGGAX8BVgEtASABJAEUAfcA9QDxANUA3AAQASEBCQEOATsBaAFuAVgBZgGLAYYBXwFEAUABPgEiAf8A/gAGAeQAvAC7AMoAwQCtALYA0gDWANEA4QAHASQBFwEPATUBXQFoAV8BWgFnAXkBewFuAVoBTAFHATQBDgH1AO4A7QDdAK8AmQC2ANIA1wDNAM0A7QANARsBJQE1AVsBfAF4AWMBYAFyAX8BZAEzASYBPAEyAfsA3AD4ABIB9QDUAOQA/QADAQoBGgEzAU8BXwFsAXcBbwFzAZABkAFxAWABaAFjAT4BJQEwATYBIAENAQoBDAEHAQABEgE1AT0BPAFLAVIBVQFcAVYBTgFRAVcBVAFBASgBJAEzASgBBAH5ABIBGQH2AOIA8wAAAfkA5gDVANgA6ADiAMMAugDaAOwA2QDKANEAzwDJAMQAtQC0AMQAwACzAKQAmQCmALEApwCQAHsAhACZAIkAZABgAH0AgABXAD4AQwBIADsAIQAlAEQAQgA2AD4ARgBFAE4AZQBnAFgAbACHAG0AUQBoAIMAcwBLADQASQBYADgAIwAvACIAAgD+/xMAFgD5/+r/BwAeAP7/2v/x/xcACwDs//f/FwAcABIAGAArADcAMAAdABQAHQAhAA4A9v/v/+v/2//I/7//vf+8/7T/sP/F/9r/2P/Z/+f/+f8FAAcADwAeABUA/f/+/wMA7v/Y/87/xP+1/6f/pv+s/6z/o/+e/6r/u//B/8X/zP/P/9z/7P/l/9f/6f/7/97/u//K/+D/0/+9/7j/wP/A/6v/mf+f/6T/mf+Q/4//mf+h/5n/mf+l/6P/nf+m/7L/uP+0/6v/tP/E/73/s/+1/7b/sP+g/5b/oP+m/5T/ff94/3j/bP9W/0z/U/9Q/zz/L/8+/1z/av9e/1v/ev+b/53/kf+Z/7X/wP+w/6H/nP+O/2n/Pf8l/xf/+v7c/tX+4P7j/tj+2f72/hL/HP8w/1b/fP+R/5b/mP+e/5f/gP9h/zn/E//4/t/+v/6b/oT+gv6H/oT+gv6a/sT+4v70/gz/Kf9E/13/bP9r/2D/V/9G/yX/BP/v/tr+wP6p/pT+gP54/n3+fv6A/o3+pP6z/rz+yf7d/vL+Av8T/yz/NP8k/yP/L/8o/xH/DP8W/w3/8f7f/tr+2P7O/r3+uP68/rr+vf7V/uv+8/4D/xr/IP8i/zf/SP9H/1b/dv97/3D/dP9x/13/Tf9F/0D/PP8x/yn/Lf8s/yD/IP8w/z7/Q/9H/1v/f/+S/5f/s//U/9L/x//X/+T/1v/A/7X/tv+z/5//j/+W/5j/if9//4D/kf+l/67/vv/L/8//2//e/9//6v/p/+H/4f/c/9H/yf/I/8r/wv+3/7n/wP/D/8b/x//C/8r/4//n/9P/z//c/+j/4v/R/9n/7v/n/9L/zf/X/9//0/++/8H/z//B/6r/qv+r/5z/jf+R/5b/kv+Z/6T/qf+1/8L/yv/S/9v/7P/x/+z/9f/2/+f/5f/q/+H/0//H/77/vv+y/6T/sf+2/6f/p/+7/83/x//E/97/7P/k/+T/7P/6/wMA+v/x//r//v/z/+v/8P/7////9v/y//n/AAAIAAkA/v/6/wkAGAAPAP3/AQAeADAAIgAPAB4AOQA7ADAAMgBBAEsASABCADsAOwBFAEAAKwAkAC8ANgAzADAANgBHAE8ATQBWAGMAXABWAGkAewB5AHMAcgB0AHAAbQBrAGQAZQBqAGMAYQBkAGEAZABlAGQAagBuAGwAagBrAG8AdwB5AHsAhACFAHkAcwB9AIcAhAB5AHUAfAB6AGsAYgBlAGcAXwBXAFwAYwBkAGUAZQBlAHEAfAB6AHcAfQCGAIwAiAB8AHcAdgBrAF0AWQBYAFMATQBLAE4AVQBfAGEAWwBiAHUAegB+AIYAhgCDAIIAhACBAHEAZABiAF0AWABYAFYAUwBWAFwAXABeAGYAawBpAGIAYQByAIEAeABpAGoAcABqAFoAVwBlAHAAawBkAGkAcQByAHEAagBlAG4AdgBvAF4AVgBgAGMAWABWAFkAWgBaAFcAWwBjAGQAawB5AHoAbwBsAHIAbwBhAF0AZwBqAGAAWQBWAFEATgBHAEYAUABYAFEASgBXAGcAYgBZAFIATwBUAFYAUABQAFcAYQBgAE8ARQBOAFIATgBRAFIATgBTAFgATABDAEgAUABSAEEAMQA/AE0ARQA+AEUATQBGAD0AQwBGAEIAPgA8AEEAQwA5ADUAOgA3ADMANQA3ADYAPABCAD0ANQA9AEcAOQApACwAKgAkACYAIwAaABwAIAAfACQAKAAqAC0AKQAlACsAMwA2ADMAKAAlACkAIgARAAsAEgAZABMACAAQAB0AGwATABkAKQArACEAJQAuAC4ALQAwAC8AKQAhABwAGwAYABAADwAUAAwAAwAMABcAEgAPABQAFwAZAB8AIwAiACIAJgAnACEAJAAoACMAIgAdABgAHgAYAA4AEAAPAA0AEAAQABEAEAANAA8AGAAXAA4ADwAcABwAEAAMAA0ADQAGAAAABAAJAAgAAwD+////AwD+//j///8EAPz/+P///wAA+v/4//r/+v/0/+//9P/5//j/+P/2//b/+v/3/+7/7P/v/+v/3v/f/+L/1//V/9v/2v/Y/9f/1//f/+T/4//i/+P/6P/v/+j/3//j/+D/1f/U/9X/0//P/8r/zP/P/8v/yP/T/9z/1P/K/9P/4P/e/9j/2//b/9f/2P/V/8r/yv/S/9D/zv/J/8X/yv/L/8X/xv/J/83/0v/R/9L/2P/X/9L/1//d/93/3f/g/+f/6P/h/+H/5P/l/9//1f/V/9j/1//T/87/zv/S/87/y//N/9D/1P/Z/9n/2v/h/+n/7P/o/+b/7P/v/+f/4f/d/9v/3v/e/9f/0v/Y/9v/1f/U/9v/3//i/+b/5P/h/+P/4//g/93/3v/i/9z/1f/f/+P/2P/a/+H/4P/g/+P/4//l/+T/3//h/+P/3P/X/9v/2//V/9D/0P/T/9P/zv/P/9P/1P/W/9T/1P/W/9T/1f/X/9X/1v/T/8//0P/O/8j/wP+9/8b/y//I/8L/v//G/8z/yv/J/8z/0v/W/9D/0P/V/9X/0P/L/8r/yv/I/8f/x//F/8X/xv/H/8j/xf/C/8j/zf/M/9P/2v/X/9j/3P/d/9r/2v/h/+H/2//e/97/2v/b/9n/1f/X/9X/0//X/9b/0P/V/9v/1f/Q/9T/3P/d/9r/2f/f/+T/4f/c/97/5P/j/93/3P/f/9//3v/a/9j/3v/g/9z/2P/b/+H/4f/g/+P/5P/k/+P/4f/j/+v/8P/w/+//8v/1//b/9P/x//H/8v/z//T/7//q/+z/6//m/+X/5//p/+3/7//w//T/+v/8/wEABgADAAIABgAHAAYABgAFAAYABQACAAAA/P/5//r/+P/5//n/9//7//3//v8CAAEAAgAGAAgADAAQAA8AEAAWABoAFAAPABMAEwAMAAcABQAGAAIA+v/4//v//P/7//z/AAADAAUACgANAAoADAAVABYAEQAQABEAEwATAA0ACQAGAAYABQD+//3/BQACAPn//v8CAPz/+v8BAAUABgAFAAMACwASAAoABwAPABIADQAHAAYADAANAAQAAAAFAAQA/f///wIA///+//7///8DAAYACQAMAAwACwALAAoADAAOAAwACQAMAAsACgAJAAUABgAJAAYABwAHAAYABwAJAAsACwAKAA0AEAAQABAAEQARABIAFAATABEAEQAQABAADwAMAAsADwAPAAsACwAPAA8ADgARABMAEwATABQAEgASABgAGwAXABYAFgAWABkAFgARABMAFQAWABYAFAAUABcAFQATABYAFgAUABYAGAAWABUAFAAVABgAFgAQABIAGQAYABMAEwAWABcAFwAVABUAFQAUABQAEwATABQAFAAVABMADgARABUAEgASABYAFgAVABcAFgASABEAEQARAA8ADgANAA0AEAAPAAwADgARABAAEAAQAA8AEgAVABIAEgATABEAEAANAAsADQALAAsADAALAAsADAAMAA4ADgAPABEAEQASABMAFAATABAAEAARABIAEAAMAAsADQAMAA4ADwALAA0ADAALAA4ADwAPABEAEQATABIADwAPABEAEQASABIAEQATABMADwARABEAEQATABAADgAPAA4ADwAOAA0ADwAPAA8ADgANABAAEwARAA8AEQASABMAFAASABQAFAASABIAEAAOABEAEgAPAAwADwATAA4ADQARABAAEAASAA8ADgANAA4AEAAOAA4AEAAMAAkADgAOAAoADgAQAAwADAAMAAwADwANAAoADgASAA0ACgAOAA8ACwAIAAsADAAKAAoACQAGAAgACgAIAAgACAAHAAwADQAJAAsADgAMAAoACgALAAwACgAIAAoADAAIAAQACAAKAAcABAAFAAgACgAIAAYACQAKAAgABwAHAAkACQAIAAgACAAJAAoACQAHAAkACAAGAAYABgAFAAUABgAGAAYABQAFAAcACAAHAAYABwAJAAgABgAJAAgABgAIAAYABAAFAAUABQADAAQABgADAAIABgAFAAEABAAHAAMAAgAHAAYABAAFAAIABAAIAAMAAgAGAAQABAADAAIABgAHAAEAAAACAP///P///wAA/v/9//7/AAABAAAA//8AAAEAAAAAAP//AAABAAAA/v/8//v//P/9//n/+f/8//v/+v/7//v/+//7//z/+//7//z//f/8//z//f/7//n/+//7//j/+P/3//f/+v/4//X/+f/5//b/9//3//j/+v/3//b/+//8//b/9//8//n/9//6//3/+//6//r/+f/5//j/9//4//j/9//4//f/9//4//b/+P/5//f/+f/5//f/+f/7//j/+f/8//v/+v/7//r/+//6//f/+f/6//n/9//3//r/+f/3//n/+v/6//z/+//4//j/+//7//j/+P/6//v/+P/4//n/+f/6//n/9//5//v/+//6//n/+f/7//z/+v/5//n/+f/6//n/9//5//z/+f/3//n/+v/5//n/+P/4//v/+f/4//r/+f/4//r/+v/5//n/+P/5//n/+P/4//n/9//4//j/9//4//j/+P/6//j/+P/6//j/9v/3//j/+P/3//f/+P/4//f/9v/2//f/9//2//f/+f/4//f/+P/5//v/+f/3//j/+P/3//n/+f/3//f/+f/4//b/9v/4//n/+f/4//j/+v/5//j/+P/4//r/+v/3//f/+//5//j/+v/6//r/+v/5//j/+v/6//r/+v/5//n/+v/6//n/+f/5//r/+//7//n/+v/8//v/+//9//z/+//8//z/+//7//r//P/8//r/+//8//v//P/8//v//P/9//3//v/9//v//f/+//3//P/+//7//P/9/////P/7//7//v/9//z//f/8//v//v////3////+////AgD+//3/AQD///7//////////////////v/9//7//v/+//7//P/9///////+//z//f///////f/9//7///8AAP///v/+///////+//7//f/+/////f/9//7//v/8//3//v/+//7///////7//f/+//3//f/+//7//f/+//7//v///////v////////////////////////8AAP7//P/+//////////7//v8BAP///f8AAAEA/////wAAAQD/////AQD/////AQAAAP//AQAAAAAAAgACAAEAAgABAAEAAgACAAIAAgAAAAEABAACAAAABAAFAAIAAgADAAMABAACAAEAAwAFAAQAAwACAAIAAwABAP//AgAEAAIAAwAFAAMAAwAEAAMAAwAFAAQABAAFAAQABAAGAAYABAADAAMABAAEAAQAAgADAAMAAgAEAAQAAwAEAAQABAAFAAMAAgADAAMAAwADAAIAAwACAAIAAgACAAMAAwADAAQAAwADAAQAAwADAAMABAAEAAEAAgAEAAIAAQADAAQAAwADAAYABAACAAUABAAEAAYAAwADAAQAAwAFAAYAAwAEAAQAAwAEAAUAAwAEAAUABAAEAAQAAwAFAAYABAADAAYABQADAAQABQAFAAQABQAFAAQABQAGAAQABAAFAAQABQAFAAQABQAHAAUAAwAGAAYABQAFAAQABAAGAAUABAAGAAUABAAFAAYABQADAAMABgAFAAQABAAEAAcABgAEAAUABAAFAAYABgAGAAYABQAGAAYABgAHAAYABQAHAAYABgAGAAUABgAHAAUABgAHAAYABgAGAAcABgADAAYACAAFAAcABwAEAAcABwAHAAcABQAHAAgABgAHAAgABQAFAAgABgADAAcACAAFAAUABAAFAAkABwAEAAcACAAHAAcABgAGAAcABwAGAAYABgAGAAcABgAFAAcABgAFAAcABgAEAAUABgAGAAYABQAGAAcABgAGAAYABgAGAAYABgAGAAQABAAIAAYAAgAGAAcAAwAFAAcABQADAAUACAAFAAMABgAEAAMABgAFAAQABwAFAAMACAAGAAIABQAFAAMABQAEAAQABgAEAAMABgAFAAIAAwAEAAUABAACAAQAAwADAAMAAgAEAAUAAwADAAMAAwAEAAMAAgABAAIABAADAAIAAgADAAMAAgABAAIAAwACAAEAAgADAAMAAwACAAIAAgACAAIAAQACAAMAAQABAAIAAQACAAIAAQACAAEAAQACAAIAAQACAAIAAgACAAEAAAABAAAAAQACAAEAAAAAAAEAAAAAAAIAAQAAAAEAAgAAAAAAAgABAAAAAQABAP//AAAAAP//AgABAP7/AQABAAAAAQAAAP//AQD/////AgABAP7/AAABAAAAAAABAAIAAQAAAAIAAQD//wIAAQD+////AgACAP////8CAAAAAAACAP////8BAAAAAAACAP7//v8CAAEA//8BAAAAAAAAAP//AAABAAAA//8AAAAA/////wAAAAABAAEAAAAAAAAA//8AAP//AAABAP////8AAP////8AAAAAAAAAAAAAAAD/////AgABAP7/AQABAAAA/////wAA/////wAAAAAAAAAA//8AAAEA/v///wEA/v/9/wEAAAD+/wIAAgD///7///8AAAAAAAAAAP///v8BAAAA/v8CAP////8DAP7///8BAP7/AAABAP3/AQACAP3//v8DAAAA+////wIA/v/+//7///8BAAAA/v8AAAEA//////7///8CAAEA/v8AAP////8BAP///v8AAAAA/v8AAP///v///wAA///+////AAAAAAAAAAD/////AAD//wAAAQD+////AQD///7/AAABAP7//v8BAAEA//8AAAEAAAAAAAAA/////wAAAAAAAAAA/////wEAAQD+////AAD//wAAAQAAAP//AAABAP////8AAAAA//8AAAAA//8AAAAA//8AAAAAAQABAP////8AAP//AAACAAAA/v8BAAIA/////wEA//8BAAAA/v8AAAAA//8BAP////8CAP///f8BAAEA/f8AAAIA//8AAAAAAAABAAEA//8AAAEAAAD//wAAAAAAAAAA/////wEA//8AAAAA//8BAAAA//8AAAAAAAAAAP////8AAAEAAQAAAAAAAAAAAP//AAABAP////8AAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAP//AQABAP////8BAAAA/v///wEA/////wAA//8AAAAAAAABAAAA//8AAAAAAAABAAAA//8BAAEA//8AAAAA//8AAAAAAAABAAEAAAAAAAEAAAD//wAAAQABAAEAAQABAAAAAQABAAAAAAABAAEAAQABAAAAAQABAAEAAQAAAAAAAQABAAAAAQABAAAAAQABAAEAAQABAAEAAgABAAEAAQABAAEAAAACAAIAAQACAAEAAQACAAEAAQABAAEAAwACAAEAAQABAAEAAgACAAEAAQACAAMAAgAAAAIAAwABAAIAAwAAAAAAAwADAAIAAwAAAAEABAABAAEAAgABAAIAAgABAAQAAwABAAEAAwACAAAAAQADAAEAAQACAAIAAgACAAEAAgACAAIAAgACAAEAAwADAAIAAgABAAAAAwACAAEAAwACAAEAAwADAAAAAgADAAEAAQACAAMAAgABAAMAAgABAAMAAgABAAIAAwACAAMAAQD//wMAAwAAAAIAAgABAAMAAgABAAMAAwAAAAIAAwACAAIAAgACAAMAAgACAAIAAgACAAIAAgADAAIAAgADAAIAAQADAAMAAgACAAMAAgABAAIAAgADAAMAAgACAAMAAwACAAIAAgACAAIAAgACAAIAAgADAAEAAQADAAMAAQACAAIAAQABAAMAAgAAAAEAAwACAAAAAgADAAEAAgADAAIAAgACAAIAAwACAAEAAgADAAIAAQACAAIAAgACAAIAAgADAAIAAwADAAIAAgACAAEAAgACAAIAAgACAAEAAAABAAIAAQABAAEAAQABAAEAAgABAAAAAQABAAEAAgD//wAAAwAAAAEAAwABAAAAAAAAAAEAAAD//wAAAgABAAAAAQACAAEA//8AAAEAAAAAAAIAAQABAAIAAgABAAAAAgABAAAAAgAAAAEAAgAAAAEAAwAAAAAAAgACAAEAAAACAAEA//8BAAIAAAABAAEAAAABAAEAAQABAAEAAQABAAIAAQAAAAEAAgACAAIAAQAAAAIAAgABAAEAAgABAAEAAQABAAEAAgABAAIAAgAAAAEAAwAAAP//AgACAAEAAQACAAIAAAABAAIAAQABAAIAAQABAAIAAAACAAMAAAACAAIAAAABAAEAAQADAAIAAAACAAMAAAAAAAEAAgACAAAAAAACAAIAAQABAAEAAgACAAEAAQAAAAAAAwADAAAAAQADAAIAAAACAAMAAQABAAEAAgABAAEAAgAAAAEAAwACAP7/AQADAAEAAQADAAEAAgADAAAAAQAFAAAA//8EAAEAAAADAAMAAQABAAEAAQABAAEAAQABAAIAAgAAAAIABAABAAEAAwABAAEAAgABAAAAAgACAAIAAgABAAEAAwACAAAAAgADAAEAAAACAAIAAQABAAEAAgABAAIAAgAAAAEAAwABAP//AgADAAAAAQABAAEAAQAAAAEAAgACAAIAAQACAAAAAAACAAEAAAABAAEAAQABAAEAAgABAP//AgADAAAAAQAEAAAAAAADAAEA//8BAAMAAQD//wEAAgAAAAIAAwD//wEAAwD//wIAAwD+/wEABAAAAAEAAgAAAAIAAQD+/wIABAD///7/BAADAP//AQACAAEAAgABAAEAAgABAAEAAQAAAAEAAwAAAP//AgAAAAAAAwABAAAAAgABAAAAAQAAAAEAAgABAAEAAQABAAEAAQAAAP//AQACAAEAAQACAAEAAQACAAEAAAABAAEAAQABAAEAAQABAAEAAQABAP//AAACAAAAAQACAAAAAQABAAEAAQABAAIAAgABAAEAAQABAAEAAAAAAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAIAAQAAAAEAAQAAAAEAAQABAAAAAQABAAAAAAABAAEAAAAAAAEAAAABAAEAAQAAAP//AgABAP//AQACAP//AQACAAAAAQACAP//AgADAP//AQACAP//AQABAAIAAgAAAAAAAQABAAEAAAAAAAEAAQD//wEAAQAAAAIAAQAAAAIAAQABAAEAAAABAAMAAQD//wAAAgABAP//AQACAAAAAAABAAAA//8BAAIAAAD+/wIAAgD+/wAAAgD//wAAAwABAP//AQAAAAAAAwAAAP//AwABAP//AgABAAEAAAD//wAAAgAAAP//AQADAAEAAAABAAEAAQABAAAAAQAAAAAAAQAAAAAAAQAAAAEAAQAAAAEAAQABAAIAAgABAAEAAQABAAIAAQABAAEAAAACAAMA//8BAAIAAAAAAAIAAgAAAAAAAgACAAEAAQAAAAAAAgACAAEAAQABAAIAAQAAAAIAAwAAAAEAAwAAAAAAAgABAAEAAQD//wEAAwAAAAAAAgABAAAAAQAAAAIAAgAAAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAIAAQAAAAIAAgABAAEAAQACAAIAAQAAAAEAAgABAAEAAgABAAEAAgABAAAAAQABAAEAAgACAAIAAQABAAEAAQABAAEAAgACAAIAAgABAAEAAQAAAAEAAgABAAEAAQABAAEAAQACAAIAAQABAAEAAgABAAEAAQABAAEAAgACAAEAAQABAAEAAQABAAIAAgABAAEAAgABAAEAAgABAAAAAQABAAAAAQABAAEAAgABAAEAAQABAAIAAgAAAAEAAgACAAEAAgACAAAAAQADAAEAAQABAAEAAgABAAEAAQAAAAEAAwABAP//AgACAAAAAgADAAEAAQACAAIAAgABAAEAAQACAAIAAQACAAEAAgACAAAAAQADAAAAAQADAAEAAQACAAEAAQADAAEAAAACAAEAAAACAAIAAgABAAEAAQABAAEAAgACAAEAAgACAAEAAgABAAEAAwABAAAAAwACAAEAAQACAAIAAQACAAIAAQABAAEAAQACAAEA//8BAAIAAAABAAMAAQABAAIAAgABAAAAAgACAAAAAQABAAEAAgABAAAAAgABAAEAAwADAAAAAAADAAAA//8DAAMA//8AAAMAAQAAAAIAAgAAAAEAAgABAAIAAQABAAIAAQABAAIAAQABAAIAAAD//wMAAwD//wEAAwABAAEAAwAAAAIABAD//wEABAAAAAAAAwACAAEAAQAAAAIAAgABAAIAAgABAAMAAQABAAIAAAACAAMAAAACAAMAAQABAAIAAgABAAEAAQACAAIAAAAAAAEAAgABAAEAAQACAAMAAQABAAIAAgACAAIAAQABAAIAAgACAAIAAQACAAIAAQABAAEAAQABAAEAAQAAAAEAAgACAAEAAQACAAEAAQABAAEAAgABAAEAAwACAAAAAQACAAEAAQACAAIAAAABAAMAAQAAAAIAAgABAAEAAgABAP//AgACAAEAAwAAAAAABAABAAAAAwABAAAAAgABAAEAAgABAAEAAgABAAAAAQACAAEAAAAAAAEAAgABAAEAAQACAAIAAQABAAEAAgACAAMAAQABAAMAAgAAAAEAAgABAAIAAQAAAAIAAQAAAAEAAQABAAEAAQABAAIAAQAAAAEAAQAAAAEAAQABAAAAAAACAAEAAQABAAAAAAAAAAEAAQD//wEAAQD//wAAAwABAAAAAgABAAAAAQAAAAAAAQABAAEAAgABAAEAAQAAAAEAAgABAAEAAgABAAEAAQAAAAEAAgAAAAAAAwABAAAAAQABAAEAAQABAAEAAAABAAIAAQABAAIAAQACAAMAAAAAAAIAAQABAAIAAAAAAAEAAQADAAMAAAAAAAMAAQAAAAEAAQABAAEAAQABAAEAAQABAAAAAQACAAIAAAABAAMAAgABAAIAAQAAAAEAAwABAAEAAQABAAEAAgABAAEAAAAAAAIAAgABAAMAAgAAAAEAAgABAAEAAQABAAEAAgAAAAAAAwABAAAAAwACAP//AQACAAEAAQACAAEAAAAAAAIAAQAAAAIAAQABAAMAAAAAAAIAAAABAAIAAQABAAEAAAACAAIAAAAAAAMAAgAAAAEAAgACAAIAAQABAAIAAQABAAEAAAACAAIA/////wIAAQD//wEAAgABAAEAAQABAAIAAQAAAAEAAQAAAAEAAQAAAAAAAQABAAEAAQABAAEAAgACAAEAAQAAAAEAAgAAAAAAAgABAAEAAgACAAEAAQACAAEA//8BAAIAAAABAAIAAQAAAAEAAAACAAIAAAACAAIAAAAAAAEAAQABAAAAAQABAAAAAQABAAAAAAACAAIA//8BAAMAAQAAAAIAAgABAAEAAwABAP//AwACAP//AQABAAAAAgAAAP7/AgADAP//AAADAAAAAQACAAEAAQAAAP//AgACAAAA//8CAAIA//8BAAIAAAAAAAIAAgAAAAAAAgABAAAAAgACAP//AAADAAEAAAACAAIAAQACAAEAAAACAAEAAAACAAEAAAACAAEAAAACAAAA/v8CAAIA//8BAAMAAQAAAAEAAAABAAIA//8AAAIAAAD//wMAAgAAAAEAAQAAAAAAAQACAAEA//8DAAEA//8CAAEAAQADAAEAAQABAAAAAQACAAAAAQACAAAAAQACAP////8CAAEAAQACAP//AAAEAAAAAAADAAEAAAABAAEAAQABAAAAAQACAAEAAAAAAAAAAAD//wEAAgD//wEAAgAAAAEAAQAAAAIAAAAAAAIAAQAAAAAAAQABAAAAAAACAAIAAQABAAEAAAABAAEAAAAAAAIAAgACAAAAAQABAAIAAQD//wAAAgABAAEAAQAAAAAAAgABAAEAAgABAAEAAgABAAEAAgABAAAAAAABAAIAAQABAAEAAQABAAAAAAABAAIAAAABAAEAAAABAAMAAAD//wMAAwD//wAAAgABAAAAAQABAAEAAgABAAIAAgABAAIAAgAAAAIAAgAAAAEAAwAAAAAAAgAAAAAAAgABAAEAAgABAAAAAgABAAAAAQABAAEAAwABAAAAAgABAAAAAgACAAEAAQABAAIAAgABAAAAAgADAAEAAAACAAEAAQACAAIAAAAAAAEAAQABAAAAAQABAAIAAQABAAEAAQACAAEA//8BAAMAAAABAAIAAQAAAAIAAgAAAAEAAgABAAEAAQABAAEAAQAAAAEAAgACAAEAAQABAAIAAgABAAEAAgACAAEAAQAAAAEAAgABAAEAAgABAAIAAgABAAEAAAAAAAIAAgAAAAAAAQABAAEAAQABAAIAAQACAAMAAAABAAEAAQABAAIAAQABAAAAAQACAAEAAQABAAEAAgABAAAAAQABAAEAAgACAAAAAQADAAEA//8BAAIAAAABAAIAAgABAAEAAQABAAEAAQAAAAEAAQABAAEAAQABAAEAAQAAAAEAAAAAAAIAAQABAAIAAgABAAIAAQAAAAMAAwD//wEAAgABAAIAAQABAAIAAAACAAEAAAACAAAAAQACAAAAAQACAAAA//8DAAMA//8AAAMAAgAAAAEAAgABAAEAAgABAAAAAgACAAAAAQABAAEAAwABAP//AQACAAAAAQABAAEAAgABAAAAAgACAAEAAQABAAEAAgACAAEAAQABAAEAAQACAAEAAQABAAEAAQABAAIAAgABAAEAAQABAAEAAQAAAAIAAgD//wIAAgAAAAEAAgABAAAAAQADAAAA//8CAAEAAAACAAEAAAADAAIAAAADAAIAAAACAAEAAAACAAEAAgABAAAAAgACAAEAAQABAAIAAgABAAEAAQABAAEAAQABAAEAAQADAAEAAAACAAIAAAABAAIAAQAAAAIAAgAAAAEAAgABAAEAAQABAAEAAQACAAIAAQACAAMAAQABAAMAAQD//wEAAgAAAAEAAgAAAAIAAQAAAAMAAgAAAAIAAQAAAAQAAwD//wIAAgD+/wEAAgABAAEAAQAAAAIAAgD//wEABAABAP//AgADAAEAAQAEAAEA//8CAAMA//8AAAMAAQABAAEA//8CAAIA//8BAAEAAQACAAEAAAADAAIA//8BAAIAAQACAAIAAAACAAIAAAABAAMAAQAAAAEAAQABAAIAAQABAAIAAQABAAIAAAAAAAEAAgABAAAAAQACAAEAAQADAAEAAAACAAIAAAABAAMAAQAAAAEAAgABAAEAAgABAAEAAgABAAEAAQABAAEAAAAAAAIAAQD//wIAAgAAAAIAAgAAAAEAAgAAAAIAAgAAAAEAAwAAAAAAAgACAAEAAQAAAAEAAgABAAEAAQABAAIAAQABAAEAAAACAAMAAAABAAIAAAAAAAEAAQAAAAAAAgABAAAAAQABAAAAAQACAAEAAAABAAEAAQABAAEAAgABAAEAAQAAAP//AQABAP7/AQADAAEAAQABAP//AQADAP//AAADAAAAAQACAAEAAQABAAAAAQABAAEAAQABAAIAAQABAAIAAgAAAAEAAQAAAAEAAQAAAAEAAQABAAIAAQD//wEAAwABAAAAAgACAAAAAAABAAEAAQACAAIAAQABAAIAAQAAAAIAAwAAAAAAAwABAP//AQABAAAAAQABAAAAAgACAAEAAQABAAEAAgABAAEAAwABAP//AwACAAAAAgACAAAAAgACAAAAAgACAP//AQADAAEAAAABAAEAAQABAAEAAQABAAIAAgAAAAEAAQAAAAIAAQD+/wIAAgD//wIAAgAAAAAAAAABAAEAAAAAAAEAAgACAAAAAQACAAEAAQACAAEAAQACAAEAAQABAAEAAgACAAEAAAABAAIAAAAAAAMAAQD//wEAAgAAAAEAAgABAAAAAQACAAEAAAACAAIAAAACAAIAAAACAAIAAAACAAIA//8CAAQAAAD//wEAAQACAAIAAAABAAIAAAAAAAIAAgAAAAEAAgABAAAAAQABAAEAAgACAAEAAQABAAEAAQABAAEAAQABAAEAAAABAAIAAAABAAIAAQABAAIAAQABAAIAAQABAAIAAQABAAMAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAQACAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAQABAAEAAQABAAEAAQABAAIAAgABAAEAAgABAAEAAgACAAEAAQABAAAAAgACAAAAAQACAAAAAQABAAAAAQABAAEAAgABAAAAAQACAAEAAQABAAEAAQAAAAEAAQAAAAEAAgABAAEAAgABAAAAAgADAAEAAQABAAEAAgACAAAAAQADAAEAAAACAAEAAAACAAIAAAAAAAIAAgABAAEAAQABAAEAAgABAAEAAgABAAEAAgAAAAAAAgABAAAAAQABAAEAAQACAAEAAQABAAEAAQACAAEAAAACAAEAAQACAAAAAQABAAAAAQABAAEAAAABAAIAAAAAAAIAAQABAAIAAQABAAIAAQABAAMAAgAAAAIAAgABAAEAAgACAAAAAAACAAEAAQACAAEAAAACAAIAAgABAAAAAAABAAEAAQABAAIAAQAAAAEAAQAAAAEAAgABAAEAAgABAAEAAQACAAEAAAABAAIAAAAAAAIAAQAAAAIAAgAAAAAAAwACAP//AQADAAAAAQACAP//AgACAAEAAgAAAAAAAwAAAAAABAABAP//AwACAP7/AgACAAAAAgAAAP//AwADAP//AAACAAEAAAABAAIAAQABAAIAAAAAAAIAAQAAAAEAAQABAAIAAQAAAAIAAgAAAAEAAgABAAEAAgABAAEAAgAAAAEAAgABAAAAAQABAAEAAQAAAAEAAgABAAEAAgABAAEAAQACAAIAAQABAAEAAQABAAEAAQACAAIAAQABAAEAAAACAAEAAQACAAEAAQADAAEA//8BAAMAAQAAAAIAAgABAAEAAQABAAEAAQACAAEAAQADAAIAAAACAAQAAQAAAAMAAQD//wIAAgAAAAEAAQAAAAIAAgAAAAIAAQAAAAEAAQACAAMAAQAAAAIAAQAAAAIAAQAAAAIAAQAAAAMAAwAAAAEAAgABAAEAAQABAAEAAgACAAEAAQABAAIAAQABAAEAAAACAAEA/v8CAAIA//8BAAEAAAABAAEAAQACAAEAAAABAAIAAQABAAEAAgACAAEAAQABAAIAAQAAAAEAAgABAAIAAwABAAAAAQACAAAAAAACAAEAAAACAAEAAQACAAEAAQACAAEAAQABAAAAAQACAAAAAgACAAAAAQABAAAAAQACAAAAAQACAAAAAAACAAIAAQAAAAEAAgABAAEAAQABAAIAAQABAAIAAQABAAIAAgAAAAEAAgABAAAAAgACAAEAAQACAAIAAQABAAEAAAABAAMAAQAAAAEAAQABAAEAAQABAAEAAQACAAEAAAACAAMA//8BAAMA/////wMAAgAAAAIAAQABAAMAAQABAAIAAAABAAIAAAACAAMAAAABAAIAAAAAAAIAAQABAAIAAAAAAAMAAgD//wIAAwAAAAAAAgACAAAAAgACAAAAAAACAAEAAAABAAAAAQAEAAAA//8DAAEAAAACAAEAAgABAAAAAQACAAEAAAABAAMAAQAAAAIAAgABAAIAAgABAAEAAgACAP//AAADAAEAAAABAAEAAAACAAIAAAABAAIAAQABAAIAAAAAAAIAAQABAAIAAgABAAEAAQABAAEAAQABAAEAAQACAAEA//8BAAIAAQABAAIAAQAAAAEAAgABAAAAAQABAAAAAQACAAAA//8CAAEAAAADAAAAAQAFAAAA//8DAAAAAQACAAAAAgADAAAAAQADAAEA//8BAAIAAQD//wAAAQABAAEAAQABAAIAAgABAAEAAAACAAIAAQABAAAAAQADAAEAAAACAAEAAQACAAEAAAABAAEAAQABAAEAAgABAAEAAgABAAEAAgAAAAEAAgAAAAEAAgABAAAAAgACAAEAAQABAAEAAQABAAEAAgACAAEAAAABAAIAAQABAAEAAQACAAIAAQAAAAEAAQABAAEAAgACAAEAAgACAAAAAQABAAEAAQACAAEAAQABAAEAAgABAAEAAgABAAEAAgACAAEAAAACAAIAAAABAAEAAAABAAIAAQABAAEAAQABAAIAAQABAAEAAQACAAAA/v8BAAIA//8AAAIAAAABAAEAAAABAAIAAQABAAEAAAABAAEAAQACAAEA//8BAAIAAAAAAAIAAQAAAAEAAQABAAIAAQABAAEAAAAAAAEAAQABAAEAAAABAAIAAQABAAEAAgABAAEAAQABAAIAAgABAAEAAQAAAAIAAQABAAAAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAgACAAEAAAACAAEAAAACAAIAAAABAAIAAQAAAAAAAQABAAIAAQABAAEAAQABAAEAAQACAAIAAAABAAMAAAAAAAIAAQABAAIA//8BAAMAAQABAAIAAAABAAIAAQACAAIAAQACAAMAAQAAAAEAAgABAAAAAQABAAEAAgABAAAAAQABAAEAAgAAAAEAAgABAAEAAAABAAIAAQAAAAIAAgAAAAIAAgAAAAIAAQABAAIAAQACAAMAAAABAAEAAgACAP//AQACAAAAAAACAAAAAAACAAIAAAABAAIAAgAAAAEAAwABAAAAAwABAP//AgACAAAAAgABAAAAAwACAP//AgABAP//AQABAAEAAgABAAAAAgACAAAAAQAAAAAAAgACAAAAAgABAAAAAQACAAEAAAABAAEAAQABAAEAAQABAAIAAQAAAAEAAAAAAAMAAQD+/wIAAgD//wEAAgABAAEAAQABAAEAAQABAAEAAAABAAIAAAADAAIAAAADAAIAAAADAAEAAAACAAEAAgACAAAAAAACAAIAAAABAAIAAgABAAEAAQABAAIAAQAAAAIAAgABAAEAAAAAAAEAAgABAAEAAQABAAIAAgAAAAEAAgABAAAAAQABAAEAAQABAAEAAgACAAEAAQABAAIAAQAAAAEAAQAAAAIAAQAAAAIAAQAAAAIAAQABAAIAAAABAAMAAQD//wIAAgD//wAAAgABAAAAAQABAAAAAQAAAAAAAQABAAEAAQAAAAEAAgAAAAEAAwAAAAAAAgABAAEAAgABAAEAAgAAAAEAAwABAAAAAQACAAIAAQAAAAAAAgABAAAAAQABAAEAAQACAAEAAQABAAEAAQAAAAEAAQABAAIAAgABAAAAAQABAAAAAAABAAEAAAABAAEAAAAAAAEAAQABAAEAAQACAAEAAQACAAEAAQACAAEAAQABAAEAAQACAAEAAQACAAEAAQACAAEA//8BAAIAAQAAAAEAAQAAAAIAAgABAAEAAQAAAAEAAgABAAIAAgABAAIAAQABAAIAAQD//wEAAgAAAAAAAgAAAAAAAgAAAAEAAgAAAAAAAgAAAAEAAgAAAAEAAQD//wEAAgABAAAAAQACAAEAAAACAAIAAQACAAIAAAAAAAIAAwABAAEAAQABAAEAAQABAAEAAgAAAAEAAwABAP7/AgADAP7/AQAEAAAAAAADAAIAAQAAAAIAAQD//wMAAwD//wEAAwAAAAIAAgD+/wMABAD//wIAAwD//wEAAgABAAMAAQD//wEABAAAAP//AgACAAEAAgAAAAAAAgABAAEAAgABAAEAAgABAAIAAgABAAEAAgABAAAAAQACAAAAAAABAAIAAAABAAIAAQABAAEAAQACAAEAAQABAAEAAQAAAAEAAgAAAAAAAwABAAEAAwACAAEAAQACAAEAAQABAAEAAQACAAEAAAACAAEAAQACAAIAAAAAAAIAAQAAAAIAAQAAAAIAAQABAAIAAAD//wEAAgAAAAEAAgABAAAAAgACAAEAAgABAAEAAQABAAEAAgACAAEAAQACAAAAAAABAAIAAAAAAAQAAQD//wIAAgAAAAEAAgACAAEAAQADAAEA//8CAAIA//8CAAMA/////wMAAgAAAAEAAAABAAMAAAAAAAEAAAACAAIAAAABAAMAAAAAAAMAAQD//wIAAgAAAAIAAQAAAAQAAgD//wMAAwAAAAEAAgABAAEAAQABAAEAAQAAAAEAAQABAAEAAQACAAAAAAACAAEAAAACAAIAAQABAAEAAQACAAEAAAABAAEAAgACAAEAAQACAAEAAQACAAEAAAAAAAEAAQABAAEAAgAAAAAAAgABAAAAAgACAAEAAQABAAEAAwACAAAAAgABAAEAAgABAAEAAgABAAEAAQABAAAAAAACAAEAAQABAAAAAQACAAEAAQACAAEAAQACAAIAAQABAAIAAQABAAEAAgABAAEAAgABAAEAAQACAAEAAQABAAEAAgABAAEAAgAAAAIAAgAAAAIAAQAAAAMAAQAAAAMAAgD//wEAAgAAAAEAAgACAAEAAAACAAMAAQABAAEA//8BAAIAAAACAAIAAAADAAMA//8BAAMAAAAAAAEAAgACAAEAAQABAAEAAQACAAAAAQACAAAAAQABAAAAAgABAAEAAgAAAAAAAwAAAAAAAwABAP//AQACAAEAAQABAAEAAgADAAEAAAACAAEAAAACAAIAAQACAAEAAQACAAEAAQACAAAAAQACAAEAAQAAAAAAAgABAAEAAgABAAEAAgABAAEAAQACAAEAAQABAAEAAQABAAEAAQACAAIAAgAAAAAAAgACAAAAAQACAAAA//8CAAIAAAACAAMAAQABAAIAAgACAAIAAQABAAIAAQACAAEAAAACAAIAAAABAAIAAAABAAIAAAAAAAEAAAABAAIAAAAAAAIAAQABAAEAAAABAAIAAAAAAAIAAQAAAAEAAQABAAEAAQACAAAAAQACAAAAAQACAAEAAQABAAIAAQD+////AAD//wAAAQAAAAEAAgAAAAEAAgAAAAEAAgAAAAEAAgABAAEAAQAAAAEAAgAAAAEAAQABAAEAAQAAAAEAAQABAAEAAQABAAEAAAAAAAEAAQABAAEAAAABAAEAAQABAAEAAQACAAEAAAACAAIAAQAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAQACAAAAAQACAAAAAQACAAEAAQABAAEAAgABAAAAAQACAAIAAQABAAEAAQABAAIAAQABAAEAAQABAAEAAQAAAAEAAQAAAAEAAgABAAEAAQABAAEAAAABAAEAAQABAAEAAQACAAEAAQABAAAAAQABAAEAAQABAAEAAQAAAAEAAQAAAAEAAQAAAAAAAAABAAAAAAABAAEAAAAAAAEAAAABAAEAAQABAAIAAQABAAIAAQACAAMAAQAAAAEAAgABAAEAAQABAAEAAQAAAAEAAQABAAEAAQABAAAAAQABAAAAAQABAAEAAgACAAAAAgACAAEAAQACAAIAAAABAAIAAQAAAAEAAQABAAEAAQABAAEAAAABAAEAAAABAAEAAAABAAAAAgADAAAAAAADAAEAAQAEAAMA//8AAAMAAgAAAAEAAgAAAAAAAwABAAAAAgABAAAAAgAAAAAAAwABAP//AgACAP//AQADAAEAAQABAAEAAgACAAEAAQABAAEAAgABAAEAAQABAAEAAQABAAEAAAACAAMAAAAAAAMAAQD//wIAAgD//wEAAwABAAEAAQAAAAIAAwAAAAEAAgABAAEAAQAAAAIAAgD//wEAAgD//wAAAgAAAAEAAAAAAAEAAQAAAAEAAQABAAIAAQAAAAIAAwABAAEAAgACAAAAAQACAAAAAQACAAAAAQACAAEAAQAAAAAAAgABAAEAAgABAAAAAgABAAAAAQABAAAAAwABAP//AgACAAAAAQACAAAAAQABAAEAAwACAAAAAgADAAEAAQABAAEAAQAAAAIAAQD//wEAAQAAAAEAAQAAAAEAAQACAAIAAQABAAEAAgACAAEAAQADAAIAAQADAAIAAQACAAAAAQACAAEAAgACAAAAAQABAAIAAQD//wEAAQAAAAEAAQAAAAEAAgABAAIAAgABAAIAAQAAAAIAAgABAAAAAAACAAEAAAACAAEAAQACAAEAAAD//wEAAgAAAAAAAgABAAAAAQABAAAAAgACAAEAAgABAAEAAwACAP//AQAEAAEAAAADAAIAAAAAAAIAAQD//wIAAgD//wAAAQAAAAEAAQD//wEAAQAAAAEAAQAAAAEAAQABAAMAAwD//wIABAABAP//AgACAAAAAQABAAAAAwABAAEAAgAAAAAAAQD//wAAAwAAAAAAAgAAAAAAAwAAAAEAAgD//wAAAwABAP//AQACAAEAAAABAAMAAQABAAIAAAABAAIAAQACAAIAAAACAAMA/////wMAAgD//wIABAABAAAAAwADAAEAAQACAAEAAAADAAIAAAACAAEAAAADAAAAAQADAAAAAQACAAAAAwADAAAAAAADAAEA//8BAAIAAQABAAAAAAADAAIAAAACAAIAAAABAAEAAQACAAIAAgABAAAAAgADAAAAAQACAAEAAQACAAEAAQABAAIAAgAAAAEAAgAAAAEAAwABAP//AwADAAAAAQABAAAAAgABAP//AgACAP//AQABAAAAAgAAAAAAAgACAP//AQADAAEAAQACAAIAAgACAAMAAgABAAEAAAABAAIAAQACAAIAAQACAAEAAgABAP//AQABAP//AQABAP//AAACAAEAAQABAAEAAgABAAAAAQACAAEAAQABAAMAAQAAAAIAAgABAAMAAwAAAAAAAgACAP7///8DAAEA/v8BAAEA//8BAAMAAAAAAAIAAgACAAIAAAABAAMAAgABAAIAAQACAAIAAAABAAMAAAAAAAIAAQABAAEA//8BAAMA/////wIAAQD//wEAAgACAAEAAQABAAEAAAACAAIAAAACAAIAAQADAAEAAQAEAAEAAQADAAEAAAABAAEAAQACAAAAAAACAAEAAAABAAEAAQAAAAAAAgABAAEAAAABAAMAAgAAAAIAAQAAAAIAAwABAAEAAwACAAAAAQABAAEAAwABAAAAAgABAAAAAQABAAEAAQAAAAEAAQAAAAEAAQABAAIAAgABAAEAAQABAAIAAgABAAEAAQABAAIAAQAAAAAAAAABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAAAAQACAAIAAQABAAIAAgACAAEAAgACAAIAAwABAAAAAQACAAIAAgABAAEAAAABAAIAAAAAAAIAAQABAAEAAQAAAP//AgACAAAAAgABAAIABAABAAAAAwABAAAAAgACAAEAAQACAAMAAQAAAAEAAQAAAAEAAAAAAAEAAQAAAAAAAAACAAIAAAABAAEAAAACAAIAAAAAAAIAAgACAAIAAAABAAMAAAAAAAIAAQD//wEAAgABAAAAAQABAAEAAAABAAAAAAABAAEAAAABAAEAAQADAAEAAQADAAEAAAACAAIAAQABAAEAAgACAAEAAAAAAAEAAgABAAAAAQABAAEAAAABAAIAAQAAAAIAAQD//wIAAwAAAAAAAwABAAAAAgABAAEAAwABAAAAAgABAAEAAgAAAAIAAgD//wAAAgAAAP//AgACAAAAAQABAAEAAgACAAEAAQABAAIAAgABAAEAAgAAAP7/AQACAP3///8CAAAAAQABAP//AAABAAEAAQABAAAAAAABAAEAAgABAAAAAQADAAEAAAABAAAAAAABAAEAAAABAAEAAQACAAEAAAABAAAAAAAAAAAAAQABAAEAAAABAAEAAAAAAAIAAQABAAIAAgABAAEAAwADAAAAAQACAAAA//8BAAIAAQABAAMAAgAAAAIAAAAAAAIA/////wEA//8BAAIAAQABAAEAAAABAAEAAQACAAIAAgACAAEAAAACAAMAAQABAAMAAgAAAAAAAQAAAP//AQABAP//AAACAAAAAAABAAEAAQABAAAAAgADAAIAAQADAAMAAgACAAIAAQACAAEAAAACAAEAAAACAAEAAAD/////AAAAAAAAAAAAAAIAAAD//wEAAAAAAAEAAQACAAIAAQACAAIAAgACAAEAAQACAAEAAQABAP//AAABAAAAAAAAAAAAAgABAAAAAQD//wAAAQABAAIAAgABAAIAAwACAAIAAQACAAMAAQABAAIAAQABAAIAAQD//wEAAgAAAP////8AAAIAAQAAAAEAAQABAAIAAQABAAIAAgABAAIAAgACAAMAAgABAAMAAQAAAAIAAgD//wAAAQABAAEAAAAAAAEAAQACAAIAAQABAAEAAQACAP////8EAAIA/v8CAAIA//8BAAMAAQD//wAAAwABAAAAAQAAAAAAAwACAAAAAgAAAAAABAACAP//AgABAAEAAwABAAEAAwABAAAAAwACAP//AAACAAIAAQAAAAAAAQACAAEAAQACAAIAAQABAAEAAQACAAEAAQABAAEAAQABAAEAAAAAAAEAAAD//wEAAQAAAAAAAQACAAIAAgACAAEAAQABAAEAAAABAAIAAQABAAEAAQADAAIAAQACAAEAAAABAAEAAAABAAEAAQABAAEAAAAAAP//AQACAAEAAAABAAEAAAABAAIAAgABAAMAAgABAAEAAwACAAEAAgABAP//AAD///7/AgABAP7/AQACAP//AQAAAAAAAQD/////AwACAP//AQADAAIAAQADAAUAAwACAAQAAwAAAAIAAgD//wAAAgACAP7///8CAAAAAAABAP////8AAP//AAACAAAAAAAEAAIAAgAEAAMAAwACAAAAAQACAAEAAQACAAIAAAAAAAAAAAABAAEAAAABAAAA//8AAP//AAABAAAAAAABAAAAAAABAAIAAgACAAIAAwABAAEABAADAAEAAwADAAEAAAAAAAAA/////wAAAQABAAAA//8CAAIA//8AAAIA///+/wIAAQAAAAQABQACAAEAAgACAAIAAgADAAIAAAACAAEA//8CAAAAAQAEAAAAAQACAP//AgACAP7/AwAEAP//AAAFAAIA/f8BAAMAAAAAAAAAAAADAAIAAAACAAMAAQABAAAAAAACAAIAAQACAAAAAQADAAEAAQACAAEAAQABAAAA//8AAAEAAQAAAAEAAgABAAIAAgABAAEAAgABAAIAAgAAAAEAAwACAAEAAwADAAAA//8CAAIAAAACAAIAAQABAAAA/////wAA//8AAAEAAAAAAAMAAgAAAAIAAgAAAAEAAwADAAIAAgADAAEAAAABAAEA//8AAAAAAAABAAEAAAABAAEAAgACAAAAAAAAAP//AQACAAAAAAADAAQAAgACAAIAAQACAAIAAAABAAAAAAABAP////8CAP///f8CAAEA/v8BAAMAAAAAAAEAAQADAAMAAgADAAMAAgABAAIAAgACAAIAAAAAAAIAAAABAAIAAAABAAAA/v///wEAAAAAAAEAAQAAAAIAAwABAAEAAwACAAEAAQABAAAAAQACAAIAAgABAAAAAAABAAEAAAABAAAAAAD/////AQACAAEAAQAEAAIA/v8AAAIAAAAAAAIAAAABAAIAAwAEAAIAAgACAAEAAAACAAAA//8CAAIAAAAAAP////8AAAAAAAABAAEAAAAAAAEAAQAAAAIAAgACAAMAAgABAAIAAgACAAIAAAAAAAAAAQABAAEAAQABAAEAAQD///7/AAD/////AAAAAAAAAQACAAIAAgACAAMAAgACAAMAAgABAAEAAAACAAIAAQACAAIAAQABAAAA////////AgABAP//AAAAAP//AAACAAEAAAACAAQAAQAAAAQABAABAAMABQAAAP//BAADAAEAAgD/////AgD+////AQD+/wEAAQD//wQABAAAAAEAAwACAP7/AAACAP//AAACAAIABAADAAEAAgACAAEAAQAAAP//AgACAAEAAQD/////AQD/////AQAAAP//AQABAP//AQADAAIAAQADAAUAAgABAAQAAgAAAAMAAwAAAAEAAgABAAIAAAD9/wAAAQD+///////+/wEAAAD//wMAAgD+/wEAAgAAAAEAAgAEAAUABAACAAIAAgABAAAAAgACAAEAAgACAAAAAAABAAIA///9/wAA///+/wEAAgABAAEAAgADAAQABAAEAAMAAQACAAIAAQACAAMAAwADAAIAAAABAAIA//8AAAIA/v///wIAAAD+////AgACAAAAAgADAAEAAwADAAEAAQABAAAAAwADAAEAAgAEAAEAAQACAAEAAAAAAAAAAAAAAP//AAACAAEAAQABAAAAAQADAAMAAgADAAIAAgACAAIAAgACAAEAAAAAAAAAAQABAAAAAQABAAIABAABAAIABQACAAIABQADAAIAAwADAAQAAgABAAIAAwACAP////8AAP///f///wAA/v8AAAIAAQABAAIAAgABAAEABAADAAAAAgACAAEABAACAAIABQACAP/////+//3//v8BAP///f///wEAAQACAAEAAgAEAAMAAwADAAMAAwADAAMAAQAAAAEAAgACAAIAAAD/////////////AAABAAAAAQABAAAAAgADAAMABQADAAIAAgD///7/AQADAAMABAAEAAIAAAAAAP///v/+//////8AAAEAAAACAAQAAwAEAAQAAQABAAIAAgAEAAUAAwAEAAQAAQAAAAAAAAABAP//AAAAAP/////+//7/AQACAAIAAQAAAAAAAgAEAAIAAwAFAAMAAgAEAAYAAwABAAEAAQD////////+////AgAAAP3//v//////AQADAAMAAwADAAAAAQAEAAIAAQAEAAIAAQAEAAMAAgACAAEAAAAAAP7//v8AAAEAAQABAAIAAwABAAEAAgABAAAAAAD/////AQADAAQAAwACAAIAAgACAAEAAwAEAAIAAQACAAEAAAAAAAAAAgACAAMAAgAAAAAAAQD/////AgADAAEAAQACAAIAAgABAAIAAQABAAIAAQABAAIAAgADAAEA//////////8AAAAAAQAAAP7/AgAEAAIAAwAFAAEAAAADAAEA//8CAAUAAgD+/wEAAwACAAMAAwD+//7/AAD9////AQD9/wEABAAAAAEAAgABAAMAAgD//wEAAgD+//7/BgAHAAMAAwAEAAIAAgACAAEAAQAAAP///v/8/wAAAwD///7/AQD/////AQABAAEAAgACAAIAAwACAAIAAwADAAIAAwAEAAEA////////AQACAAIAAQACAAEAAgACAAAA/////wAAAAAAAAAA//8BAAMAAgADAAIAAQABAAIAAwACAAIABAADAAIAAwACAAQABAAAAAEAAQABAAIA/////wEAAQD/////AAAAAAAAAwAEAAIAAgABAAIAAwADAAMABAADAAQABAACAAIAAgAAAAAAAQABAAIAAwACAAEA//////7/+//7//3//v8AAAIAAgACAAIAAwADAAEAAgACAAEAAgAEAAQABgAHAAUABAACAP///v/8//v//v///wIABAADAAEAAAD///3//P/9////AAABAAIAAwAFAAYABQAGAAcABAADAAIAAQACAAMAAgAAAAAAAAAAAP7/AAABAAAA///+//3//f8AAAMAAgACAAUABQACAAQABQACAAIABQADAAAAAgADAAIABAABAAAAAAD9//z//v/9////AAD+/wEAAgAAAAAAAgAEAAMAAgABAAAABAAEAAAAAgABAAAAAwACAAAA///8//z//f/8//7///8CAAUABQAFAAUAAgACAAUAAwD///////8CAAQAAwAEAAQAAQAAAAAA///8//z/AQACAP7//v/+//7/AgAHAAcABgAGAAUAAAD9/wEAAwD//wIABQABAAEABAACAAAAAAD8//3/AAD9//7/AwACAAMABAAEAAcABwACAAAAAgABAAAAAgACAAAA///+/wAAAgABAAAA/v/+///////9//7/AgAFAAQABAACAAEAAwACAAIAAgABAAAAAQABAAAAAQACAAEAAQACAAIAAQABAAEAAAD+/wAAAgADAAMAAgABAAEAAAD//wEAAQD//wEAAAD///////8AAAIAAgAAAAAAAQABAAAAAwAGAAUABAAFAAIAAAAAAAAAAQADAAQABAADAAIABAACAAEAAAD8//z//P/6//7/AgABAAMABwAFAAIAAwADAAMAAgAAAAEAAQABAAEAAQADAAIAAAABAAAA/f///wEA/v/9/////v/8//7/AgAAAP7/AQABAAAAAwAEAAMABAAGAAYABQADAAEAAQACAAEAAAAAAP//AAAAAP3///8DAP3//f8CAAEAAAACAAAAAgAGAAEA/v8CAAAA/v8DAAUABQADAAEAAAD+//7/////////AgABAAEAAwACAAMABwAFAAUABwAEAAEAAQAAAAAAAQABAAMABAABAP7//f/8//v/+//7//7/AAABAAEAAwAGAAUAAgADAP///f8AAAIAAgADAAYABQAAAAAAAAD+/wEAAAD+/wAA/P/7//7///8CAAIA/v///wMAAAD//wQABQAFAAUAAwACAAQABQAGAAUAAQD+//3/+//9/////P/7//7////9//7/AQAAAAAAAwACAAIABQAFAAQAAwAAAAAAAwACAAEAAgACAAIAAQD//wAAAgACAAUAAgD8//7///8AAAMABgAIAAQAAwAEAP////8DAAIAAQAAAP///P/7////AgACAAMAAQAEAAgAAwACAAUAAwABAAEA//8AAAIAAwAFAAUABAADAAAA/f/9//z//P/+//7//v/+/wEABAACAAAAAQABAAEAAgABAP//AgAGAAgACAAFAAAAAAABAP7//f8BAAAA/f8AAAQAAgACAAIAAAD+//7//v/9//z///8BAAIABQAFAAQABgAEAAMABAABAAAAAAD//wIABAADAAMABgADAP//AAD///3//P/7//z//f/8//3/AwAGAAYABQAFAAYABQADAAEA//8AAAIAAgACAAMAAwADAAQAAQD//////P/7//v//P/+/wAAAQAEAAUAAwABAAEAAQACAAIABAAHAAgACQAJAAYABQAGAAUAAAD//wEAAAD+/wMAAwD9//3/AQD///7//P/8////BAAHAAgABQAAAAAAAwAGAAcABAABAAQABwADAP3//v/9//r//f8AAAAAAwAEAAMABAAAAP3//v/8//z//f/9/wEABwAGAAQABQAFAAMAAwADAAIAAgAAAAAAAgADAAQABQABAAAA///4//b/+v///wIABAAGAAUAAwAFAAMAAgACAP3/+//8//z/AQAGAAUAAwABAAEAAAD//wEAAgABAAEAAwACAAAAAgAEAAMABAAHAAYAAwACAAIAAQD9//v//P/7/wEABQABAAAAAQAAAAEA///9/wIABwAFAAQACAAIAAMAAwAEAAQABQADAAAA///9//7/AgAFAAQAAAD///7/+v/9/wIAAAABAP7/+v/6//n//f8DAAcABwADAP3//v8EAAgACwALAAcABgADAP//AAD+/wAAAwD///3/AAAAAAMABgAFAP//9//3//r/+//+/wEAAwAIAAkACAAJAAgABwAFAAEAAQAFAAIAAAACAAAA/f8AAP//+//4//n//P////////8DAAYABQAEAAMABAAFAAQAAgABAAIABwAIAAUABQAEAP7/+v/8//3//P/9//7//v/9//3/AAAEAAcACAAGAAMAAQAAAAEAAgD//wAABAABAPv//v8AAP7/AAAEAAEA/v8BAAUAAwAAAAEAAAABAAcACQAGAAYAAwADAAcAAwD9/////v///wEA/v///wQAAQAAAAUABAD+//7/AgADAAMAAQADAAYABgADAAIAAwACAP///v/+/wAAAAD9//v//P/+/wEAAgABAP////8AAAAAAAAEAAcABQAEAAYACAAJAAoACQAFAAAA/v/5//b/9//5//j/+//+/wAAAwAEAAUABwAJAAYAAwABAP7/AgAGAAgACgAHAAEA/v/7//3////8//r/+//6//n/+////wIABAAJAAkAAwACAAUACAAKAAoACAABAPz/+v/6/wAA///6////AAD9/////P/5//n/9//7/wUABQD/////AwAFAAkADgARAA4ACwAMAAgAAQAAAP7/+//+/wIA///3//j/AAACAAMAAgD7//j/9//4//3/BAAFAAcACwAJAAgACwAMAAsACAAFAAIA/v/6//j/+//+//z/+//8//v//v8BAAMABgADAP///f/6//v//////wIABAACAAAAAAAEAAcABwAGAAIA/f/9/wEAAQACAAUABwAFAAEA/P/7//v//P8AAAMABAAAAP7/AgAEAAAAAAD+//r/+v8AAAIAAwAKAA4ABwABAAAA/v/8//3/AQADAAEAAgAAAPz/AAAAAAIABwAFAAcACQAEAAYABAD//wcACwAEAAUADAAGAPz//v8BAPv/9v/2//j//P/8//3/BAAIAAMA/v/8////BQAEAAAAAwAGAAoADgAIAAYABwAFAAMA///3//P/8//3//f/9v/8/wIABwALAAoABQABAP3/+//9//3//f8CAAoADAANABAADQAFAAEAAwABAPz/+f/6//3/AAABAP///f/5//f/+v/9//3/AQAGAAMA/f/+/wIAAgAGAAwACwAHAAYABQADAAMABAADAP7/+//5//v///8AAAEABQAFAAMAAgD///3/+//5//n//P/9/wAADAASAA4ADAAMAAkABgACAP3//P/6//r//f/8//3//v/3//b//f////z///8CAAEAAAAAAAAABQAJAAoACwALAAcABQAGAAUAAgD8//j/+P/7//7/AQACAAEAAAD8//j/+/8AAAMABgAHAAgABwAIAAkABgAEAAYABAD///3/+//5//v///8DAAQA/v/4//r/AAACAAEAAgACAP////8AAAMABwAJAAoACgADAPr/+f/7//n/+v/9//3///8EAAoACwAIAAYABQACAAEAAQD+//7/AgAEAAMAAgD+//7////9//z//v/9//v/+v/8//3//P///wMACAALAAkABAADAAIABAADAP//+//7/wAAAgADAAcACQAHAAQA/v/6//r/+//8//3//P/9/wAAAwAIAAwACwAJAAQAAgAFAAQAAgABAAAAAQACAAEABAAIAAcAAwD8//b/9//+/wYABwAAAPr/+f/6//3////+/wAABQAEAP///v8IAA8ACgAJAAcA+v/2//7/AQD//wAA/v///wIA//////z/+P/9////AQAMAAwAAgADAAgABQD8//v//f/6//v//f8CAAsACQABAAMABAABAPz/9//5/wEABgAFAAUAAQD+/wEAAQAAAP7/+f/3//n/+v/8/wEABQAEAAUADAAPAAcAAgADAP///P8DAAUA/v///wYACAAGAP7/9f/3//n/9v/2//f/+/8BAAIABQAOAAsA///9//3//P/+/wQACwAQAA0ACgAIAAcABQABAAMAAwAAAP3//P/8/wIABwAIAAAA9//0/+//7//4/wAAAwAGAAkACwANAA4ADAAHAAEAAAD+//v///8HAAwADwANAAgABAD9//L/8f/1//P/9v/8//n/+P/+/wYACQAEAAUABwAHAAkABwACAAEA/////wQABgACAAIABQAEAAMAAwD+//n/+f/8//7//P/3//j//v8CAAIA/v/9/wIABwALAA0ADgANAAgABAADAP//+//3//T/+f/8//7//v/5//z/AwAIAAgA///7//////8EAA4ADgAMAA4AEQARAAsACQAJAAQA/P/2//L/8P/t/+3/9f/4//H/8//7//z///8DAAMAAgAHABIAEQAKAAwADQAMAAsABQAFAAYA///2//L/8f/y//X/9//0//L/9//8//7///8CAAsAEwARAA4ADwARABAADQALAAgAAgD8//n/+P/5//f/9v/3//j/+f/5//z/AgACAAEAAQAAAAMABwANABQAEgAOAAYA+f/1//7/BgAJAAoACgAGAAAA/P/4//P/8f/0//f/+//9//7/BAALAAwADQANAAoACQAIAAUABQAHAAcACQAFAPv/+f/7//7/AAD9//z//P/3//L/7//z//7/BwANAAwAAgD7/wAABAAEAAkADAAHAAMACQAKAAUAAAD//wAA/v/5//f/+P/9/wEA+v/y//X/+P/6/wAACgARABEACgACAAAAAQD9//3/AQADAAIAAwAFAAQAAwD///v/+v/5//z/AgADAAIABAAIAAwACgAJAAsABAD9//n/9f/3//3/AAD///3//v////7/AAAGAAsACwAHAAQABQAEAAIAAwAJAAsACgAJAAQA/f/9////+P/2//z//f/3//f//v8DAAUABgAGAAIABAAJAAgACAALAAoABQD7//T/8//0//r////+//v/+P/5/wMACQAGAAsADwAGAAQACwAHAP//BgALAP7/8f/7/woACwAGAAEA9f/u//L/9f/7//7/9//+/wcAAgADAAgACwANAAUA/v8EAAIA+P/9/w4AEQADAAAABwAKAAYAAAAAAAIA/P/y/+v/7////wQA+v/6/wMAAwABAAMACAAOABEAEAANAAsACwAKAAUAAQADAAUAAwD5//D/8P/1//3/AgABAP3/+/8AAAoADQAJAAUABAAEAAQAAQD7//r/AQAEAAAA/f/6//b/9v/8/wQABwAKAAwABwADAAgADAAMAAUA/v8AAAcADAALAAAA/P8CAP3/8v/v//P/8//2/wMACgAGAAQAAQADAAgABwAJAA0ADAANAAsABwAGAAEA+v/7/wIABAAEAAUABQAFAAAA+v/x/+T/4f/o//T///8CAAQACgAMAAkABQAAAAAAAQADAAcACwARABkAGwAUAAgA/f/4//T/7//w//b//P8CAAYABQAAAPz/+f/2//X/+v/9//7/AgAIAAsADQANAAsADQANAAgACQAIAP///f8AAP//+f/4//7/AAD9////AAD7//n/9v/u/+z/+P8EAAgACgAPABEADgANAAoAAgD+/wMABAAFAAwADwALAAkAAgD///7/9P/w//j/+//3//H/9P8AAAQAAAAAAAkADgAIAAAA/v8EAAoABwAAAAEAAgAEAAgABwABAPf/8P/x//P/9v/8/wIABwAOABIAEAAJAAAAAgAMAAcA/f/5//f/+v8AAAgAEgARAAkABgAEAP7/9P/x//r//f/0//L/+P/9/w0AHQAaABIAEgALAPj/7f/4/wEA+v/7/wIA//8BAAYAAwD8//X/7f/z//v/+f///wwACgABAAQAEQAbABUABQD8//3//f/+/wMABwAHAAEA/P/9//3//P/6//f/9//3//H/7P/1/wcAEAAPAAkABQAEAAkADgAOAAsAAwD6//X/+P8AAAcACAAIAAYA///9/wIAAgD+//v/+f/4//z/AgAGAAUAAQD+//3//P/7//z/AwAJAAcAAgD+/wAABQAHAAkACwAIAAMA///5//T/+P/+/wMABAACAAEAAAD+/wAAAgACAAcACgAHAAUABAABAP///v/9/////f/2//b//P8BAP//+v/8/wEABQAKAAYA/v8DAAgAAwD7//7/AgD9//7/BwAHAAEA+//4//n/9f/v//D/9f8BAAcA/f/4/wEABAD8//7/BgAHAAkAEQAWABEACAD///3/AAAAAPz/+//9/wAA/P/3/wAACAD7//X//f8AAAEABAAMABcAFQAGAP//AwABAP7/AgAGAP//7//j/+X/8P/5/wEACQAMAAwADAANAA4ADgARAA8ABQACAA0AEQAMAAsACwACAPj/8//2//v//P///wEA/P/u/+b/8v8BAAQADgAWABAADgAQAAoA/v/0//X/9v/1//v//v/+/wAA/P/7//z/9P/0////BgABAP7/AAAAAAMADAAHAPf/9/8FAAgABQAFAAUABAAFAAUAAgACAAcABwABAP7/AAD8//P/9v////v/+/8JAAcA9P/4/wgABwABAAIABwANAAkA//8FAAgA9f/r//z/AwD6//n/AgAFAAEA//////n/+f8DAAMA//8DAAQADAAQAAwADwASAA0ACAADAAYADQAMAAkACQACAPL/7f/6/wIA+//x/+//9//9//3/AwASABcADwAAAPb/+P/7//f///8SABgAFgATAA0ACgABAPX/6//e/9r/5P/1/wUACgAJAAkABgACAP3/+P/7/wQACwAPABAADwARABYAEgAJAP//+P/w/+r/9v8IAAcAAAD7//b/+f8BAAUAAAD6/wEABQD+////AwAHAA4ACwAFAAIAAAACAAIA//8CAAUAAAD6//n/+f/7//z/9v/z//j///8HAAcA+f/z//3/BAACAAAABwAZAB8AEQAFAAYACAADAPv/9//z/+z/7P/0//3/BAAEAPv/9f/0/+//7f/u//f/BwAOAAUA/f8CAAoACQAFAAgADQAKAAYAAQD8//7/AwD///v/+//7//j/8f/x//f/+v/9//7//P///wMA/v/5//r//P/8//v//v8JABMAEwAPAAwADgAWABIA+//p/+z/+f8AAP//+f/5//3/+P/7/wMA+f/u//b//P/4//T///8IAAEABgANAAUA//8GAA4AEAAJAP//AQAEAP7/AQALAAMA8//0/wYAFQALAPr///8QAAkA9P/1/wEA+//w//T/+//9//z/AwAQABoAFwAGAPj/AAAQAAoA/f8AAAAA+P/8/wUABgABAPr/9/////7/8P/w//r/BgAQABQAGQAeABQABAADAAQA+v/s/+b/6//1//r/AgAKAAwACwAIAAkABAD4//n//f/v/+r/+v8BAAAAEAAiABEA9//8/wsABwD1/+v/9v8FAAUAAwAMABUAEwAHAPn/9f/3//X/+P8AAAAA+//9/wQADAAMAAQAAQD+/+7/6v/1/wEACgAKAA0AHgAmABkABQD8/////P/2//j//f8CAAUABgAHAAYA///z/+f/5v/v//T/7v/n//T/CwASABUAHwAjABoACAACAAgADAAMAAkACAAOAAsA/f/u/9z/1P/a/93/3P/k//r/FAAlACoAJQAZAAoABAAIABAAFAAPAAAA9//+/wAA9//3/wAA/v/t/+D/3v/k//r/EgAWABAAEwAVAA4ABgALABQAFQAOAAMA+P/3/wIADAAMAAgABQD2/97/zf/K/9P/3v/v/xMAJwAVAAYAEQAbABUADgASAA4A/P/0//j/BwAVABQADgD//+D/z//g//j/BAALAAoA+P/n/+j/7v/s//f/DwAXAA8ACAAFAA4AHQAiAB4AFAAJAAkAEAAQAAEA8v/v//D/7P/h/93/7v/+/wAADAAZAAkA9v///xMAGgASAAoACgAJAPv/+f8MABYADgAIAAIA+P/x//T//P/8//v/AQD9//j//f/9//r/CQAaABQAAAD2//n/+//6/wEACwAOAAwAAgDw/+z/+/8DAAEAAAAAAAUABAD5/wIAFgAaABIACQAJABQACQDy//7/HAATAPL/5v/o/+T/3//p//b/9v/z//L/7//w//j/AQAHAAsADgALAAMABgAMAA4ADgAIAAMADAAYABYADwACAPn//P/v/9r/3//4/wcA+v/0/wwAFwARAA8ABQD8/wAABQAHAAcAAwACAAcAEAAYABQAAgD6//7/AgAEAP//8P/m//L/CQAJAO3/3f/v/woABADq//D/CAAEAPj/AgATABoAGAAVAA4ACAAJAAIA8//x/wIAFQAVAAMA+P8FAA4ABAD8//T/3P/M/9z/6//s//7/HAAjABMACQALAAwADgAVABwAHQAIAOv/5P/w//r////9//j/9P/o/9v/4v/w//j/AwANABEAEgAUABsAIgAdABUAEQAJAP7//v8GAAkAAgD7//3/9v/n/+D/4v/l/+j/7P/5/wgADwAXACAAJQAjAB8AGQALAAEABQD9/+b/4//w//P/7//1//n/8v/3/wUAAgD7//3/AwAGAAYADAAZAB8AHAATAAcAAwAGAAIA8//s//L/8v/u//P/9v/x/+T/2f/r/wMAAgAJABwAHwALAPj/+/8JAAgA/P/+/woADQAHAAMABwAMAA4AEgAFAOj/1f/U/9v/6v/9/wcABQAEAAwAEgANAAIA//8OABYADgAIAAwAEQAMAAUACgARAA0A/P/h/93/9/8BAPX/+v8RABkAEQASABgAEgAIAPv/7v/p/+b/5P/r//v/EwAcAAwA/v/3/+r/5//3/wYAAAD1//r/DgAhACUAJAAiAAYA4f/j//7/BwACAAQABwABAP3////6//f///8CAPn/8f/y//z/BwABAPf///8FAAQADAAVAA4ABgALAA4A///4/wkAFgAUAAwAAQD9//7/+P/v/+r/5P/a/9b/3f/x/wMACQAOABoAGgATABMADQACAAMADgASAAcA9//6/wYAAgDz//D/+P/x/+L/4v/x/wAACAAKABMAHgAfABYABQDz/+z/8v/9//z/9/8CABIAGQAaABMAAQDw/+7/8f/n/93/4v/q//f/FAAwADUAKAATAAoAEAAGAPP/7v/w//b/AwAOABAACgADAAMAAADz/+P/4f/s//X/+f/8/wYAEwAXABQAEAANABEADgD//wAAEQAPAP7//P8IAA4ABQDz/+f/5f/l/+f/7P/t/+v/7//+/wsACwADAP//BwAOAAYA+P/3/wMADwARAAcA/f/9//7//v8CAAQAAgD9//v/AgAFAP//AwANAAwAAAD2//P/+v8JABkAGwAHAPD/8f//////9v/4////+f/3/w4AFwAEAAYAGQAOAPr/BQANAPb/7f8EABYADgDw/+H/9P/+/+3/5f/x//n/9v/x//r/CwACAO///f8ZAB0AFAAUABYADwAKABQAHAAcABoAGQAcABUAAADo/9v/4f/q/+z//P8RAAoA7f/Y/93/+/8RAAwABAAFAAEAAgALAA8ADAAFAAcACgD2/+D/4//7/xMAFQAFAPP/5f/s/woAGAAHAPv////+////DAAYAAsA9v/8/wcA/v/3//b/+v8GAAkAAQD7//b/9f/+/wUABAAQACYAHQD2/+H/7f8HABEABAD8//7//v/+//3/AgAGAPT/2//S/93/9P/+//v///8KABQAGQAUAA8AGAAcAA0A+//2//n/+//5//f/8//o/+D/7v8HAA8AAwD4//z/BwAEAPX/+v8RABcADQAMABYAFgAKAAIAAQD8//z//v/7//f/6P/V/8//1f/n//D/9f8MABMAAQD4//r/9//3/wgAJAAsAA0A7P/z/wsAEQANABAAGwAeAA8AAgAJABMADQAEAAMAAADv/93/5f/+/wkA+//m/+f/BAAZAAsA+P8MAC0AJQASABQAEwAPAAgA9v/n/+D/3//p//X//P/3/+//7v/u/+7/7P/t//v/AgAFABMAFgANAA8AGwApACIACAABAAYA+v/q/+//+//0/+L/3v/j/9z/0f/U/+P//v8ZAB8AGAAdACgAIgAOAPz/AQASAAgA7f/8/x8AEwDt/+z/+//t/93/7P/8/wMAEgAYAAoA///8/wQAGQAfAB0AHgAMAPf/9v8KACoAMgATAPn//v8FAPj/7v/8/wwAAwDx//f/DAAKAPX/+f8RAA0A7P/W/93/8v/7/+//5//w/wQAGAAdAB8AIAARAP3/8f/u//X/+f/2////DwAKAAUAHAAsABYA+v/y/+3/4v/e/+//DwAhABgAAwD1/+//5P/W/97/9v/5/+X/5P/8/wQACAAjAC4AGQALAAYA/f/t/+X/+P8VABUA/v/4/wYAEgAUABMAEQAHAPb/6f/l//L/EgAoACIADgAAAPn/8P/g/+L/AgAWAA0A/P/x/+3/8/8IACEAIgAJAPP/7f/5/wwAFwAiADIAOAAmAAMA4P/U/+P/7P/f/9j/3P/W/9f/+v8hABsA9f/f/+z/DwAsADIAMAA5ADoAKgANAO//5P/u//f/9//7/wcAAgDp/+H/6P/s/+z/3//P/9D/2f/m//D///8ZACQAIwAyADsAIQAFAA0ADgDs/93//P8NAP//AgAUABAA9f/d/+T/+//y/9v/4v/0//j/BgAgACgAHQAXABUACgD9////DQAQAP3/6P/p//7/BwAGAAgA/v/s/+b/7/8AABoAMQApAA0ABgAOAAcA9v/q/+X/5//t//r/AQABAAEA/f/8/wAA/f/8/wMADAAQAAIA8v/w/+3/8f8PACsAIQAIAP//DAAfABoADwAZABoACQAKABoAFwADAPX/+v8DAPP/3//g/+n/7f/l/+H/8f/+///////8/wQAEwAMAP3/DQA3ADcACAD6/wIA7//e/+n/+v/8/+z/4//v//7/AQD4//X/+P/z/+z/6v/x/wAADAAWACEAHQAKAPr/7v/i/+T/7//6/wEA/P/+/xIAGwARAA0AEQAQAA8AGwAbAPr/2f/h/wIAFQALAPL/5v/u//X/7P/j/+j/8//8/wUAFQAiACMAJQApABgABQAGAAUA//8GABwAKAAVAPf/9v8KAA4A+P/q/+r/3v/L/8j/1P/o////EgAhACMAGQAMAP///f8MACAAJAATAAUACQAHAO3/2f/k//3/DQARAAMA6//l/+b/5v/t//T/AgAPAAMA7P/n/wAAJQAsACAAFAALABoALgAXAPb/AgASAPX/2v/r/wEA+//v//n/AgDv/9L/z//0/xkAEwD2//X/HgA5ACEAEwAmACAA///t/+j/6P/s//X//f/9//f/9P/1//L/8P/9/wkA/v/p/9z/8P8hADUAHwAOAAYA9f/h/+D//P8eACEADgAKAAoA8f/c/+3/BwAGAPz/+P/u/+f/8v8EABAAGwAjABwADgD9/+v/4//v/wIABAD9/wUACQDy/+z/CgALAOz/8f8HAPL/0//n/yAAQAAxABUADQAJAPz/AgAqAD4AIwAEAPf/8v/t/+z/8v/8/wIA/P/j/8v/0//3/xcAJQAbAAIA+/8CAAsAFgAUAAkAAADu/+D/3v/o//v/BgADAP//9//w/+7/8P/8/wkABwD4/+7/9v8GAAgA+//x//j/CwAZABsAGAAZABcACAD8/wIABgD4//D/AgASAAUA8f/2/wkAGAAiAB4AAADd/9D/4P/2//z/9//7//r/8P/4/w8ADAADACMARQAwAAEA7f/4/wsAEwAFAOn/0f/N/+H//v8RABQAGgAfAA8ABwAWABEA8v/r//f/9f/u//L/AAAPABEADAAFAPH/1P/H/9j/7//0//n/DQAmACsAGQANAA0A///v//j/BwD+//T//v/6/+T/5v/1//X/9v/+////7f/Q/8f/3f/9/xQAGgAYAB8AIwASAA4ALQBBADAADwAAAA8AHgAYABYAIQAWAOz/y//E/8P/wP/E/9T/6P/3/wAACQAMAAMA+/8DABUAJwA4AEIAOAAqACQAHQASAAUA//8GAAUA9v/p/+b/6//y/wQAGQALAOv/5//0//z/AQAFAAkAEwAeABYA+//q//n/DgAOAAYA/f/y//H/+/8IAAsA+P/r/wEADwD5//P/CQANAP3/9f/+/wMA+f/6/wkADwD//+v/7v/6/+3/2//k//D/8v8FABUADgALABIACgD7/wMAIQAgAP7/7f/2/wIAAwDy/+b/7f/w/+n/7v/5/wEADAAGAPP/7//5/xEAHAAIAP//IQBCAC0ABgALABkABgDz//T/AQAKAAYAAQAHAAsABQD3//T/AAABAOn/2P/g/+7///8TABgACADv/97/5f/5/wEA/v/6//X/9/8FACEARABNADAACQD1/+n/1//T/+z//v/8//X/9/8KABAA///7//f/5P/a/+//EgAgABoAFAAJAAAABwASABUAFgAUAA4ABAD6//T/+P8HABMADwD8/+j/5//6/wcA///x//P/CQAYAAoA+f8DABMAFQAMAAAA8P/Q/7n/zf/8/yAAHAD5//L/DgAaAAgA9v/+/wUA8v/0/woAEAATABcAEwAFAPH/5P/d/93/8P/9/+3/3P/Y/9j/5v8CAAwABwARACMAHgAEAPH/AAApADwANAA3ADsAHADs/9v/9v8VABoABADr/+D/2f/Z/+z//v/8/+L/wf+8/83/2//x/xYAMwA1ACYADwACABgASQBWAB8A6f/l//H/BQAgAB8AEQAIAPv/6//V/8f/zv/c/+r/+f8AAAUADwATABEAGwAlACAAEwAMABoALwAdAO3/6P8RAB4AAADp/+n/4P/M/9D/7f8JABQAEQALABUAKgAwACgACQDh/9//5f/K/8D/3//+/wYABgAHAPf/4P/k//r/DAAVABUAFQAdACQAHAAJAAEADQAXABEA/P/r/+3/BQAiACAADAAOAAkA2f+//+f/DgAEAPL/9f8GABQAFwAWABkAEgD8/+f/6P/7//3/6P/3/xUA+//f/wkAQwBBAAgA4f/z/w4A+//b/+j/BwADAPD/8f/6/wEABAD8/+n/2//f/93/2f/5/xoAFQAHAP7/+v/+/wUAFAAfABgADgARABkAGwAJAOr/3P/k/+b/5P/m//H/AQD0/9v/8f8rADYAAgDm/wkALwAvACYAJQAjAB0ADgDz/+X/8/8HAAwABgD4//P/+f/u/+f/AQAaABcAAQD4/woADADm/9X/AQArAB0AAQABAAoAAQD1////FQARAP3/AwAcAB8ABQDv//L/+f/5/+//2v/Y//v/EwAKAP7///8CAP7/9v/7/wkAAADr//X/FgAcAAYAAgAPAAgA/f8AAAMADAAWAAsA+//+/woA+v/N/7X/xf/p/wMAAAD4/wkALABEAC8AAwDx//T///8AAPb/BAAPAPn/9v8SABUA7v/K/8n/zv/O/9z/6v/p/+v/+f8HAAYA/v8NAC0AOAAlAAoA+//+/xwASABQACMA9P/j/9n/1v/g/+3/+//s/8f/yv/u/wcAHwBFAFQANAAOAAMA/P/5/w8AMwBMAD8AFwD+/wYAIQAlAAMA5f/e/9X/x//Q//D/BwD5/93/2//s/+z/4//i//D/BgALAAUADQAZABYAEgAnADEA/v/O/9//CAAiABUA6v/S/9T/5v/8/wQAAgD0/9X/zv/x/wcAAgATADYAPwA1AC4AGwD7/+v/BAAtACkA8f/W//T/DQDx/8T/t//E/87/0v/d//L/+//t//D/FwA9AEEAIwACAPT/8f/z//b//f8OAB0AEAD8//z/AwAFAAUABAAVACoAMQA2AEIAVQBfAFEANwAbAPj/5f/y//v/4//V//L////f/9b/8P/v/9j/2//u//7/8v/S/+L/CAANAAoAAQDn/8v/uf/M//f/DAAFAPz//v8GAAIA8v/x/wEAEgAXAAQA6f/x/wkADgATACUAJAAPAAwAEgACAOr/8v8UACUAEgDy/+n/9P/r/9P/1v/h/9v/2f/k/+v/+P8XACwAKAAhABEA6f/W//X/IAAyAC0AIAAKAPP/6//x//r/+//m/83/w/+8/8X/3v/x//n/+P/0/+b/z//W/woARABmAGoAUwA9AD4APgAkABUALAApAPX/2//3/wUA7//b/9j/3//f/8f/rf+0/+P/GAAuACMAEAAMACQAQgA9ABAA/f8fACYA//8BACsAMQAaABIAFAAOAPf/2P/Q/9X/y//C/8z/1//d/+//EwApABsAAgD//wsAEQAQAAcADgAoAC0AGQAKAAQA+v/t//X/CwAOAAkADgAHAPT/8//y/9z/1//t/+T/s/+i/8z/+/8HAAMADwAuADYAEgDu//b/EQAQAO//7/8bACIA9v/Z/+n/BAAEAO7/9f8ZABAA8P/y////DQAmADIAFwDl/9v//f8SAA4ABQD8//v/AwAJABgAKgAbAPf/5v/j/+b/5v/j/+//BwATAAQA4P/P/+3/FAAOAOz/4P8AAC4ANAAfABoAHgASAPT/6v8MADEAMgAeAA4ACQD9/+r/5f/v/wAA/v/h/9j/AAAwADgAGgAIABMAEgDz/+f/BAArAD4AMwAYAP//4//N/9X/7P/s/9T/yP/O/9T/3v/8/yIAQABIACAA4v/c/xAAGgDy//P/CQDx/9v/+/8aAAkA5P/U/+L/5//M/8v/+v8lAC0AHAAQABMAGQAjADcAQgAjAOb/yP/T/+D/6P/w//X/8v/k/97/7/8DAAkA///5/wwAHAAEAOv/+v8SABoAHQAZAAYA6v/b/+f/+P/9/wUAGAAXAPP/2//1/xcADgD7//j/5//X/+L/8v///xYAMwBIAD0AFwAHABgAHAADAPX/AAADAO//4P/s/wMACwABAPD/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2//s/+T/xv+1/7r/0v///yQAIQAPAAsABwAHACAAPwBEABkA2//M/+P/5f/M/9D/9f/+/+H/zv/J/8z/6P8FAAAAAwAsAEIAKQApAEwATAAhAAAACgAkAA8A2P/O//L/+//g/9j/6v/l/8T/sv/L//T/+P/o//r/GwAiABEABAAbAEIATgA3ABQACQAbACoAJQAYAAIA6v/n//H/6//Y/8r/x//N/9j/4P/l/+T/3f/o/w4AKAAaAPj/+P8xAGoAXwA1AC8ASABXAEgALwAhABEA///p/83/yf/U/9L/2f/2//r/y/+q/83/CAApADsAQQAkAPj/6P8HAEgAawBKABkACQAMAA4A+f/b/9D/2v/o/+L/xv+y/7r/1f/m/+L/2//X/9L/1v/x/xoAMQAqACEAKAAwACIACQAGABkAJAAfAAkA5f/K/83/5f/5//n/5//S/77/t//X/wQADgAFABAAHQAOAP//FgAvADAALwAyACwAKwA0AC8AHwASAAYA+//i/73/wP/p/+n/vP+6/+b/6v/W/+v/DwAVAAwAAwD4//7/GQAvADAAHwAKAP//AAALABYAGQAYABwAHgAcAB0AHAAIAPX///8FAOj/wv+y/7v/0P/f/+X/5v/o//P//v/9/wAAAwD7/xAAPQBBADIANQAzABkA+v/y//b/5P/P/9P/6P/5//L/zP+0/93/FwAOAOb/7/8IAAEA/f8TACoANwBAAEkATwA3AAYA5P/n/w0AMQAmAAYA7v/f/+X/AwAZAAgA6v/v////9//t//X/DAAdABMA8v/a/+X/CQAeAB0AHAAVAPn/4f/s/wsAHgAcAAUA7f/x//z/9//s/+H/7/8HAPv/4v/f//X/EwAVAAMADAAoACIA9f/b/+z/8//V/8L/3f8HABAA9f/a/9z/7v/z/+///f8bACcAEQD7/wkAJwAkAP//6f/8/xoAFgD4/+P/6f///wgA/f/1//v/AAD0/+L/2v/l//b/+P/y//b/CwAaABIABgAQACIAHAAJAAYAGgAuADYANAAwAC4AJgARAPb/4//e/+X/7v/q/9T/wf/B/8n/6v8NAAUA7//2/wEA+f/x/wYAGQAQABQAHwASAAIABQAQABcAFAAJAAkABQD4/wYAHwAPAOv/5f8DABoACADr//T/GgAdAPn/8f8EAPX/0v/S/+3/AgAPABUAEQAJAAEA8v/y/x8ATwA2AP///P8FAPj/AAAVABMA+P/V/8H/w//M/9f/8P8DAAgAAADz/wUAKwAaAOr/AAAqAA4A8f8SADUAJQALABQAJAAMAOL/3P///w4A9f/h/+X/6v/k/9v/5v/8//v/3//J/9P/9P8JABEAGgAdABQADAAPACMANgArABMAHAAxABoA/P8DAAIA3//P/9v/2P/G/8n/2f/f/+H/4f/d/+v/BQAZACEAGQAcADYASwBQADQABAD//xgAGQAGAP7/BQD//+n/4P/u/+//1v/I/9//BgALAN//vv/Z/wYACAD6/w8AMgA0ABoADAAbADMANgAqAC4AMgAQAPL/9v/x/9//4v/i/8T/tP/K//P/DgADAPr/CAAJAPj/+f8YAEMASgAiAAYAFwAtACUAIQA4AD8AGgDt/9j/2//t////AQD//wYABQDp/8//3v8EAAwA9//s/wEAHAAYAA8AEQAIAP3/9f/r/+z/7v/m/+L/7v8AAPz/5P/d/+v/+v8AAPz/8//v//T/+/8CABIAGgAQAA8A/P/J/7H/0f8DABUABwD+/wAA8v/b/9j/7P8LACAAEAD6//7/BQAGAAsAGwAzACcA///9/yIAKQD9/9z/7v8KAAoA+P/r/+3/9P/x/+//9f/r/+D/+/8pADsALwAaABAAEgAYACEAKwArACIAEwABAP3/BAAHAAsADgAIAP//8f/n/+v/6v/n/wMAIQAPAOL/0f/n/wMA/P/j/+7/EAASAPb/7P///xQAEwATACgALwAUAPL/7/8KABgACgD7//L/+v8OAAYA6//3/xUA/P/K/8z/5v/n/+P/9f8GAAUA9P/g/97/8/8EAAUAAAD9/wIABAACAAcADQARABMACQD6//7/CwAVABwACgDw//f/+//k/9//+/8GAN//yP/z/xoALAA/AC8ACQAGACAALQAnACEAHQASAAUABgANAAQA9v/w//L//P/5/9f/uf/O/wIABwDX/7r/0//9//r/3//3/xkABwD2/xQANwA6ADMAOQA6ACkAEgD+//3/DAASABAACQDx/+H/7//6/+n/2v/V/73/sf/P/9n/xP/a/xUAKAAVABIAHQAgADIATQBLADMAGwAHAP7/BAAJAPv/5P/f/+L/w/+l/7z/2f/a/+//CwAIAPn/+f8NACAAGwARACQANgAyADcASABEACUADgASABUABADv/+T/5v/o/9r/z//X/+b/7P/p/+f/5//o/+v/6P/u/woAFQAHAP7/AgAIAAYAAwAGAAoAFwAiABUACwAaACMAEwADAAcADQABAO//6f/s/+7/7v/r/+L/3f/i/+f/8f/8//T/3//Q/9P/8f8MABQALQBKADkABQDr/wEAJQAtABoADQAGAPT/5P/j//r/FQAVAAYA7//T/8P/vv/H/+z/FwAiAA4AAQAOAB8AIwAeAB4AKAAoABoAHwAyADkAIgADAAMADQADAO//3v/q/woABADe/9T/7v8EAAcABwAIAAAA7P/V/8//4//7/wIA/P8CABoAHQABAPX//v8BAP//CQAUAA0A/P/4/wwAIwAlABgACwDy/9r/6P8IAA4AAwAFAAUA9//v//X/+P/8/wgACAD9//v/AwANABcAEQADAAMAAgD6//v//P/1/+//9/8BAPj/8P/9/w0AEQAIAPn/9P/5//r/9f/z//P/6//a/9j/8f8HAP7/8v/7/wQADQAdAB0AEAATACIAIwAQAAAACgAZABIA/v/z/+//4v/T/9r/9P8HAP//6P/p/wUAGAATAP//6v/f/+j/+P/+/wMAGgA0ADsAMQAdAAgA//8LABwAEwD7/+z/5//u/wgAGgANAPT/4//l//b/9P/u////CwAKABMAHgAZAAoABQARABwAEgD9//X/AAAPAA8ACgAUACAAFwD//+z/5//z//b/5//v/wsACQDr/+X//P8SAA4A9v/r//P/8//x//b/+P/x/+T/5P/2//7/6f/X/+T//v///+7/7v8BAA4ACgD7//T///8JAAsAEwAcABwADgABAAwAIgAlABoADwAKAAEA7P/j//T/CQAMAAMA8P/e/+b/AAAJAAAA/P/+//X/9v8SACUAGwAZACAACgD4/xAAIAAJAP7/EgAWAPf/zv/G/+b/+//q/9j/2//h/97/3P/q/wQABQD2/wYAJwAuACYAKQA0ADQAMAAwACoAIgAeAB4AHQATAAEA7f/i/+P/4f/a/+b/9//p/8j/u//P//X/CwAFAP3///8CAAsAFwAcAB4AFwAUABcABgDw/+3/BQAlACgADADr/9X/2P/v//n/7v/p/+z/6v/r//7/EgAOAP//AgAKAAgACwAQABkALgA7AC0AEwAGAAgACgADAPn/AAAQAAEA1v/A/9H/8P/6/+z/5v/q/+3/8P/z/wIAEwAMAPX/7/8AABUAGQAVABoAGgATAAwABQAGABcAIgANAO7/4f/h/9//3//i/+H/1P/H/9b/+P8JAAIA/f8JACAAKwAiAB8ALAAsACIAJQAuACUADQD9//f/8f/z//b/7P/g/9L/xf/C/8z/4P/m/+b/+v8CAPj/+f8BAAAAAQASAC4AOwAlAA0AFwAsAC0AIAAXABsAHgASAAEAAAABAPP/5//t//P/5f/R/9b/9f8KAP//6f/r/wgAIAAhABwALQBCADUAHAAUABgAHgAZAAMA7v/i/97/4//u//X/7//e/9D/zv/T/93/7v8DAAUA/f8AAAMABgASACEAMwAvABQACwAWABYACQAEAAsACQD0/97/3v/l/97/0f/Q/+f////+//L/8//9/wEA+//1/wEAGQAYAAQABwAiACcAFgAUABsADwD9//b/8v/1/wQACgD7/+v/4v/l//P/+/8CAAkA/v/v//L/CwAtADkAKgAdAB8AHwASAAUACgAXABQAAQD4//3/+f/p/+f/9v/4/+j/3f/i/+7/9f/v/+v/9/8NABoAFAAPABIADAAEAP//AAALAA4ABAAGAA0ABQD+/w0AGQAKAPT/7v/y//T/9P/8/wwAEwAGAPT/7v/x/+7/4f/j//v/CAD9//j/AAD9//3/DwAVAAYA/v8AAAUAAwD7//3/CwAQAAgABQAKAAwABwADAAIAAAD8//b/9P/9/xMAHwAUAP7/7//s/+3/5P/k////FQAVAAoA///5//r/BgAcACYAGAACAPb//P8JABAAFAAeAB8AEAD2/9z/0v/f/+n/5v/q//H/4v/R/+f/DwAYAAIA7P/u/wkAIwAtADIAOQA3ACkAFwAKAAYACQAGAPv/+P/9//L/2f/U/93/4P/g/9n/zv/J/8//3P/j/+f/9/8GABAAIgAsACAAFQAfACcAFgAQACcALQAbABIAFAAKAPb/4//j//T/7//b/9r/3v/b/+n/AgAKAAIA/P/9/wIAAwAMACEALwAnAA8AAgAKABAAFgAjACEADQD4/+r/7P/+/xAACgDy/+r/7//u/+T/2v/Y/+T/+v8MAAwAAgABAAUADwAcACIAIAAbABwAIgAeABAABgD7//z/FAAiAA0A7v/i//D/CwASAAwADQAHAPv/AAAQABEACAABAAgAEAACAO3/8v8FAAwAAQD1//r/+//z/+//8//7//7/8P/i//D/FAAcAAIA+f/9//H/7//9/woABwDy/+T/6//6/wEA/v/9/wIA/v/w/+b/7v/+/wYACQANAAUA8v/q/+z/8P/7/wMAAgD///f/9v8GABQAGAAXAA0A+//z//z/BAD7/+z/7f/8/wMA+//r/+P/8P8DAAcA/v/7//3/AAAIABYAIwAjAB8AHwAYABIAFwASAAYABQAOABQADAD6//X//v///+//5v/s/+3/6v/r/+z/7f/w//v/EQAgAB4ADwD///7/DAAYABoAEQAJAAoACQD7/+v/6f/1/wYADAD8/+f/3v/f/+z//v8DAAUADQAJAP3/+P8FAB4AJAAdABoAFwAhAC0AHQAJABEAGQADAO3/9P8AAPr/8f/z//X/6P/U/9H/6f8DAP3/4v/Z//b/GAAVAAoAEQAOAAcACQAHAP3/+/8AAAQABAADAAcACgAEAP7/BAAJAP3/6//f/+z/DQAVAAAA9f/2//j/9v/z//v/DgASAAgABQAFAPr/9v8FABQADgD+//b/9f/5/////f/z//b/AwACAPv/9//0//P/7v/s//P/+P/+/wEA+f/5/wUA+//o//b/DgAHAPX/9/8NAB0AGAARABgAHQAUABEAKAA5AC4AGwAPAAsACQAGAAQAAQABAAAA6//T/9H/4P/0/wIAAQD2/+7/7f/3/woAFwAaABUACgAEAAIAAwAOABgAFwAOAAMA+f/0/+//7f/2//v/8//k/9f/2v/u//X/7f/w/wIADwARABMAGgAfABoAFQAaAB0AFgAOABMAGgAQAAAA/f8DAAoADQABAOr/3P/e/+j/8v/x/+r/6//v/+7/9f8CAP//9/8HAB8AIgAYABQAFAAXAB8AHAAIAPv/AAAFAAIA///5//n//f/7//j/+f/1/+z/5v/j/+T/6f/v//r/BAACAP3//v8DAAgACQAKABQAHAAbABUAFgAWAA0ABwAIAAEA8P/p/+b/4f/j/+v/4//W/9v/6f/u/+z/6f/w//n/8//s//X/CgAfACUAHwAcABoADwAMAB0ALAAmABAA/v/+/wMAAQD//wEA+//p/9f/0//Z/9//3//h/+z/9f/4//3/BgANABYAHgAgACIALAA3ADUALAAlAB4AFwAQABAAFgAUAAUA7f/a/9//8/8BAAAA6//Y/9//7P/w//j/BwAPABEAGQAbAA8ABgARACIAKQApACAADwAHAA4AFgAWAAsA/v8DAAgA9//v//T/8P/q/+r/8f/6//f/7P/s//P/8//z/wAADwAJAPb/7//2//z/CgATAAwABAD8//P/8v/5/wUAAgDt/+D/4v/s//T/7//q/+z/6f/i/+T/7v/8/wwADQADAPz/+/8EABEAGAAdAB8AHAAOAAEACwAaABsAFwANAP//+v/8/wEABQADAP7/+P/z//j/+v/x/+7/9//+/wMABgD9//T/9f8AAAwADQAFAAAA/////wQACwAVACMAJwAcAAwAAgD///7/AwAOABEACAD5//D//f8LAAcAAwABAPf/8f/3/wEABQAKABAABgD4//r/AgAGAA4AFAARAAgAAAD6//z/BgARABMABgD6//f/9v/3//3/9//u//v/BgD5/+z/7P/0//3/AAABAAgABwD5//j/BwASABEABQAFAA8AEAACAPj/AAAHAAEA//8BAP3//f////7/+P/u/+n/5//o//L/9f/t/+f/5//u//n/BgAOABAADwAJAAEAAAADAAoAGAAaAA4ABgACAP7//f///wEA///5//H/6//t//b///8CAPn/7f/p/+3/9/8AAAEAAwAJAA0ADAAPABQAEQATACAAHgADAPT/AAAKAA0ADgAHAAQABwAGAP//8P/m/+3/+P8BAAUA+f/r//X/BQACAP3/AAACAAMA///9/w0AHgAaABcAGwAVAAsABwAJAA0ACwAHAAYABQD///b/8v/2//z/+v/z/+P/1f/g//X/+v/6//v/+v/7//7/AgD///z/BQAPABEADQAHAAkAFAAYABIACAD///z//f/8//r//v8BAAUABgD8//T//P8GAPz/8v/6//3/8v/v//P/+/8HAA4ADgAJAAIA/////wIADwAWAAsABQAMAAIA+P8BAAgAAADz/+v/8f/+/wAA/f/9//n/7//v//j///8AAPj/9P/7/wAAAAAAAAEADwAYAA4ABQACAAEABQAMABMAEAAFAAEABQAHAAoACgD///f/+f/5//n/+f/3//r/+v/0//b/AQACAPX/8P/6/wIABQAIAA0ADgALAAQA/P/9/wkAFQAVAA8AAwD8//7//v8DABEAFwAOAAAA9P/x//T/9v/7/wQACAADAP7/+//6//r//f8HAAsABQD8//v/AwASABgAEgAKAAMAAAAEAAYACgAMAAgABAAAAPr/+//+//r/+v/+//7/9P/r/+7/9//9/wQABQD+//7/BAD///j//v8GAAkACgALAAoABgD//wIAEwAcABIABAAAAAMACQAJAAMA/f/4//X/9f/z//T/9v/y//L/9P/z//L/8v/2//r//f8AAP///P8AAAgADAAHAAIABgAQABQADwADAPz/9v/1////BAD7//D/6f/p/+7/8f/0//3/AwD+//n/9P/1/wMAFwAkAB8AEQAMAAwAFAAiACgAJgAdAA8ABgACAAQACgALAAQA9//p/+P/4f/j/+z/8v/s/+f/6//v//b//f8BAAUABAABAAcADwAUABgAHQAdAA4ABgAQABgAGQAVAAUA9f/w//X/9v/z//b/+//x/+X/6f/t/+z/9/8DAAYACAAHAAIAAwAIAA0AGgAdAA8ABwANABIADwABAPv/BAAJAPz/7v/q/+r/6f/p/+v/7v/t/+b/5f/v//r//v/6//f//v8EAAQACAARABoAIAAfABkAEgAVAB0AHgAcABoAFAAJAAYADQANAAEA+P/z/+r/6v/3//n/7f/o/+v/8v/+/wAA+//8//n/8P/8/wgA/f/6/wgAGAAaAAcA9f/y//v/CwAQAAQA/P/8//r/+f/6//r/AgAEAP3/AAABAPj/9P/2//7/BgAGAAUACAAIAP//+/8EAA8AEAAJAAYACAAKAAoACQAIAAcABQABAP//BAAGAAEA//8AAPz/9P/2//r/+f/4//j/8f/o/+r/9f8AAAUAAwABAP3/+f/+/wMABwAPAA8ACQAGAAIAAwAJAAsAEAAWABIABwADAAcABQABAP////8AAAIA/v/5//X/8f/y//r////8//b/9f/2//n///8CAAEAAwAFAAgABQD8//n/BAALAAkACQANAAoABAADAAUACAAJAAQA/v/4//T/+v8BAAEA+//5//z////8//z//////wQACwAGAAAABgAMAA4ACgAEAAUABwALABAADAAHAAcABQADAAcABQD3//D/9v/2/+7/7v/1//7////3//D/8P/3/wIABAD+/wEABgACAAEACgAKAAYACQALAAoABgD//wAADQAOAAkACwAHAPz/+v/+//3/9v/1//n/+P/3//r/+f/4//r/+v/6//z/+P/3//z//v8BAAUABQAEAAUABgAIAAoABAABAAcACgAHAAIA//8FAAoABgABAP//+//1//T//f8FAAcABgADAP3/+//8/wAABAAIAAcAAQAAAAMABwAMAAkABQAHAAcABAD+//v///8EAAMAAQAAAPz/9v/5/wEAAgD9//n/+P/4//r//P8AAAIAAwADAAEAAgAGAAcABAAFAAYABQAFAAgACQAJAAkABQACAP//+/8BAAoACwAGAPz/9//8/wIABQAIAAgAAQD4//j//P/7//z/AwAGAAQA/v/6//z/AQAFAAUAAAD9/wEAAgD////////+/wAA/v///wIAAAD//wEAAQD+/wIABQD///v/AQAHAAQA//8AAP////8EAAYAAgAAAAAAAQADAP7/+f/8//z/+v/9/wAA///+//3/AQAEAAEA/v8BAAcACAAEAAEABgAMAA4ADwALAAYABQACAAQACQAJAAgAAgD+/wEAAQAAAP3/+P/4//n/9//2//f//P8CAAMAAQD/////AAADAAQAAgAEAAQAAQAAAAgADQAJAAMAAwAEAAQAAwD+//r/+//+/////P/9/wAA+f/z//r//P/3//3/BAACAAIABAAHAAgABQACAAgADQAIAAQABQAGAAcABgAEAAYABwD+//j/9v/1//j/+//7//z/+v/1//b/+//+//3//f/+/wAA///+/wAABgAMABAAEQANAAoACAAKABAAEQAOAAkAAAACAAkACgAHAAUAAwACAP7//P///wMAAwD+//v///////v//P8AAP7/AAAAAP3///8CAAIAAAD9////AgABAAIAAAD+///////9////AQACAAEAAAABAAQAAwD+//z//v8CAAUABAABAAEAAgABAAEAAgAFAAcABgAEAAUABgADAAEABAAGAAMAAgABAP3//f8AAAEAAQAAAAEA///9//7//v8BAAIA+//7////AAACAAMAAQAAAAAA//8CAAMAAQABAAMAAgABAAAAAQACAAIAAgADAAYABAAAAAAABAAGAAIAAAAAAP//BAAHAAMAAAAAAAEAAwACAAIABAAFAAMAAQADAAQAAAAAAAEA//8AAAAA//8BAAEAAwAAAPz////+//3////9//z//P/5//z//f/9/wEAAAD+/wEAAQD+/wAABAAEAAYABwAFAAUABAADAAgADAAIAP///f8DAAMAAwAEAAIAAAD///7/+//6//7/AQACAP///P/9/wEAAQACAAQABAADAAAA//8EAAgABQACAAQABAABAAMABQABAP///v/9/////v/9/wAAAAD9//z/+//4//j/+v/8////AAACAAEA+//9/wIAAgAIAAkAAwAAAAAABQAJAAUABAAFAAEAAwAGAAIAAQAEAAQAAQAAAP3///8CAP7/+////wAA+//7/wIAAgD+//7/AAABAAIAAQD/////BAAHAAQAAgABAAIABwAGAAIAAwADAAUABQD///7/AwACAP//AwADAP3///8DAAAA/v/9//7/AgACAP3///8DAAEA/////wEABAAEAAAAAQADAAAAAQADAAMAAQAAAAAAAAD/////AQACAAIAAgABAP//AQADAAEAAAACAAAA/f///wAA//8AAAEAAAADAAMAAQABAP7//P8AAAQABAADAAEAAAACAAMAAQAAAAAAAgAEAAEA/v8AAAEAAQABAAIAAAD//wEAAgACAAEAAAAAAAAAAgACAP///f/+//7/AgAAAPv///////z///8AAAEAAwACAAIAAwABAP//AgAEAAQABAAGAAgABQACAAUABQAEAAUAAwADAAMAAAAAAAAA/v///wEAAAD9//v//v8AAP7//P/8//z//v8AAAAAAQABAAAAAQABAAAAAgAEAAIAAAACAAQAAQAAAAMAAgABAAIAAQD///7//v////////8AAP3//P////////8BAP////8CAAAAAAADAAEAAAADAAYABQABAAIABQADAAMAAwABAAAAAgABAP/////////////8//v//f/+//3//v///////v/+////AQABAAAAAQAEAAMAAAADAAMAAQADAAIAAQAEAAQABAAEAAAAAAABAAEAAgABAP7//v8AAAAAAAAAAP//AAD///7/AAABAP///v8AAAIAAQD//wAAAgADAAMAAQAAAAIAAwACAAEAAAABAAMAAgD+//7/AQABAP7///8CAAAA//8BAAAA/////wEAAQD//wIAAgAAAAEAAAAAAAMAAgACAAMAAQACAAIAAQAEAAYAAgAAAAQAAQD+/wEAAwAAAP///////wIAAAD9/wAAAQD+////AAAAAAEAAQABAAEAAQABAAEAAAACAAQAAQABAAIAAgACAAIAAgACAAIAAQABAAIAAQABAAAAAQABAAAA//8AAAAAAAAAAP////8BAAEA///+//7/AAADAAEA//8BAAIA//8AAAMAAQABAAMAAwABAAEAAgACAAIAAQAAAAIAAgAAAAIAAgABAAAA//8BAAIAAAABAAEA//8BAAIA//8AAAIAAQABAAEAAQADAAMAAAAAAAIAAQAAAAIAAwABAAAAAwACAAEAAgACAP//AAACAAEAAAD//wAAAQAAAAAAAQAAAAIAAQD//wEAAgACAAMAAQAAAAIAAwACAAEAAQACAAMAAgD//wEABAAAAP7/AgACAAAAAQABAAAAAQABAAAAAAAAAAAAAQABAAAAAQAAAAEAAgABAAEAAgACAAIAAgABAAIAAgABAAIAAgACAAIAAAAAAAEAAgACAAAAAQACAAEAAQACAAEAAQACAAEAAQACAAEAAQACAAEAAgACAAEAAQABAAEAAgACAAAAAQADAAIAAAAAAAIAAgAAAAAAAQABAAEAAgAAAP//AQADAAAAAAACAAEAAAADAAQAAgADAAMAAAACAAMAAgADAAIAAAACAAIAAQABAAAAAAADAAIA//8AAAMAAQAAAAIAAgACAAEAAAAAAAIAAgABAAIAAgABAAIAAwADAAIAAgADAAIAAgAEAAIAAAACAAIAAgACAAEAAgAAAAEAAwAAAP//AwADAP//AQADAAEAAAACAAIAAwAEAAAAAgAHAAEAAAAEAAMAAQADAAIAAQAAAAIAAgABAAEABAACAAEAAgD//wAAAwAAAAEAAwAAAAEAAgABAAEAAgABAAIAAgD//wAABAADAAEAAAABAAMAAwABAAEAAQACAAEAAAABAAEAAQACAAIAAQABAAEAAQABAAMAAwAAAAAAAgACAAEAAgACAAEAAgADAAIAAQACAAMAAQABAAIAAgABAAEAAQABAAMAAgAAAAMAAQD//wMAAwD//wAAAwABAP7/AAADAAAAAAADAAEAAAACAAAAAAADAAIAAAABAAEAAgACAAAAAgAEAP////8EAAEA/f8DAAQAAAAAAAEAAgACAAAA/v8BAAQA///+/wMAAgABAAIAAQADAAQAAQABAAAA//8CAAEA//8BAAEA//8BAAEA//8BAAIAAQABAP//AQACAAEAAgACAAAAAQABAAEAAgABAAEABAADAAAAAQAEAAEA//8BAAEAAAABAAAAAAABAAEAAQAAAAEAAgAAAAEAAgAAAAEAAQABAAQAAAD//wMAAQD+/wMABAD+////BQABAP//AwACAAEAAwAAAAAABAABAP//AwADAAAAAQABAAEAAQABAAIAAQAAAAMAAgD//wEAAgABAAEAAgACAAIAAQABAAEAAAAAAAEAAAABAAIAAQAAAAEAAQACAAEA//8BAAQAAAD+/wIAAwAAAAAAAQAAAAEAAgABAAEAAQABAAEAAQABAP//AAADAAAAAQACAAAAAgABAP//AgACAP//AQADAAAA//8CAAEAAAACAAIAAQABAAEAAQABAAIAAAAAAAMAAQAAAAEAAQABAAIAAQABAAAAAQACAAAA//8CAAIAAQACAAAAAQACAAIAAgABAAAAAgADAAAAAQACAAAAAQACAAAAAAACAAEAAQABAAAAAgADAAAAAAACAAAAAQABAAAAAQACAAEAAQABAAEAAQABAAEAAgACAP//AAADAAIA//8BAAQAAAAAAAMAAgAAAAMAAgAAAAIAAQD//wMAAgD9/wEAAwAAAAEAAwABAAAAAQABAAMAAgAAAAEAAAABAAMAAQABAAIAAQADAAIAAAABAAIAAQACAAIA//8BAAMAAQACAAIAAAACAAQAAgAAAAAAAAACAAIA//8AAAMAAgAAAAAAAQABAAIAAAAAAAIAAQAAAAEAAgABAAAAAQABAAAAAQABAAEAAQACAAEAAQAAAAEAAgABAAEAAQD//wEAAgAAAAAAAQAAAAIAAgAAAAIAAQAAAAEAAQABAAIAAQABAAIAAgAAAAAAAQABAAEAAQAAAAAAAgABAAAAAAAAAAEAAgAAAAEAAgABAAEAAQABAAEAAQABAAEAAQACAAEAAAACAAEAAQACAAEAAQABAAEAAgABAAAAAQACAAEAAgABAAEAAwABAAAAAwABAP//AgABAAAAAAABAAMAAQAAAAEAAAABAAIA//8AAAIAAQAAAAEA//8AAAIAAQABAAIAAQABAAEAAAAAAAMAAgD+/wAAAgD//wAAAgABAAEAAgABAAAAAAABAAIA//8AAAQAAQD+/wMAAgD//wEAAwABAAEAAgAAAAEAAgAAAAAAAwACAAAAAQABAAEAAgAAAAEAAwABAAAAAwACAP//AgACAP//AgABAP//AgAAAAEAAwABAAEAAQD//wEABAAAAP//AgACAAIAAgAAAAEAAQABAAMAAQABAAIAAQABAAIAAQABAAAAAQADAAIAAQAAAAAAAwADAP//AAABAAEAAQABAAAAAQADAAIAAQD//wEAAgABAAEAAQAAAAEAAgABAAEAAQAAAAEAAgAAAAEAAQAAAAEAAQABAAEAAQABAAEAAgACAP//AgADAAAAAQAAAAAAAgACAAEAAAAAAAMAAgD//wIABAAAAP//AgACAP//AAACAAAAAAABAAAAAgACAP//AQACAP//AAACAAEAAgACAAAAAQABAAAAAQABAAAAAQABAP//AQACAP//AQABAAAAAgAAAAAAAwACAAAAAQADAAIA/////wEAAQABAAEAAAAAAAIAAQAAAAAA//8AAAMAAQAAAAEAAQD//wAAAwACAP//AQADAAEAAQABAAAAAQACAAEAAAAAAAAAAwACAAAAAAD//wEAAwABAAEAAgD//wEABAD///7/AwACAAAAAQABAAIAAgD//wAAAQAAAAAAAQACAAEAAAABAAEAAQACAAIAAAAAAAEAAQABAAEAAQABAAEAAQAAAAEAAwAAAAAAAwAAAP//AQABAAEAAQABAAIAAgAAAAEAAgABAP//AQADAAEAAAACAAIAAAABAAEAAAABAAIAAAAAAAAAAgACAP//AAABAP//AAADAAEA//8CAAIAAQABAP//AAADAAEA//8BAAIAAAD//wAAAQACAAEAAAABAAEAAQABAAAAAAACAAEAAAABAAEAAQABAAAAAQABAAEAAQAAAAAAAgACAAEAAAABAAIAAQAAAAEAAgABAAEAAgACAAAAAAADAAIA//8CAAMA//8AAAMAAQD//wIAAwABAAEAAgD//wIAAwAAAAEAAgABAAIAAgABAAIAAAD//wMABAAAAAAAAwABAAEAAwACAAEAAQAAAAEAAgABAAAAAQABAAEAAgABAAEAAgABAAEAAQAAAAMAAgD//wEAAQABAAEAAQABAAAAAQADAAEA//8BAAEA//8AAAIAAQD//wEAAQABAAEA//8BAAUA///9/wIAAQAAAAEAAQAAAP7/AQACAP7/AAAEAAIAAAAAAP//AAADAP//AAACAAAAAAACAAAAAAAAAP//AgACAP//AAADAAIAAAAAAAEAAwADAAAAAAABAAIAAAABAAIAAQACAAIAAQACAAEAAQABAAAAAgADAP///v8BAAIAAQABAAAAAgADAAEAAQAAAAAAAgABAAAAAQABAAAAAAAAAAEAAgAAAAEAAwAAAP3/AgAEAP////8CAAEA/f8AAAQAAAD//wIAAAD//wIAAAAAAAMA///+/wIAAQAAAAEAAAABAAIA/v///wUAAQD9/wEAAgAAAAAAAAAAAAEAAQAAAAEAAgAAAAAABAAEAAMABAACAAMABgAFAAMAAwAEAAUAAgAAAAIABQADAAIAAQD//wEAAwADAAMAAgADAAIAAAACAAQAAgABAP//AAACAAAA/f///////f/+/wEA///7//7/AgACAP///f/+//////////7/AQADAP///v/+//v//f8CAAIAAAD+//7/AAD8//r/BAAHAPz/+/8CAP7/+/8EAAcAAAD8//3/AQACAPz/+P/+/wMAAgD///v/+////wIA/v/4//f///8CAPz/+v/9//z//P/9//z//f8AAAAA/f/5//j/+//+/wEAAQD+//n/+P/5//3/AAD//wIAAQD2//X/AgAGAAAA/P/8//z/+////wAA/P/9/wQAAQD7//7/+//8/wIA/f/7//3/+f/6//z/AAAHAP7/7f/z/wIAAAD8/wEA/v/0//b///8DAAAA+v/5/wEAAQD1//L/+/8CAAcAAwD5//f/+f/8//3/+v/9/wIA/v/6//j/+v///wEA/f/5//r/+//7//z//v8AAP///P/6//z//f/8//3/AAD+//r/+//+/////v///wIA/v/5//n/+/8AAAcABgD9//j//f8CAAEAAgAAAPz/AAAFAAAA+v///wUAAAD6/wMACAD7//f/BAAEAPz/AgAFAP//AAADAAAA///7//j/AgAGAP3///8IAAAA9f/4/wIACQAHAP7/+P/5//7/AwACAP////8BAAIAAQD8//z/AQAEAAMAAQD+/wEAAwAAAAAAAgD9//3/CAAKAAMA+//1//3/BQAEAAQAAgD8//r//P8CAAcAAwD7//v///8CAAEA/f/+/wIAAgAEAAMA+v/2//n/AwANAAoA+//1//7/CAAKAAQAAgABAPz/AAAFAPr///8PAAoA+//7/wMACAAEAAEAAQD//wAACgAEAPr/BQANAAIA+//+/wMABwAAAPn/BgAPAAQAAAABAPz//v8IAA0ACAD8//j/BAASAA0A/v/9/wUACAAFAAMA/v/7/wQACQAFAAAA/v8CAAYAAAD8/wEA/P/w//3/EwAKAPP/8////wEAAwAEAPv/+/8FAAAA8f/w/wAACwAHAAUAAwDz/+//+/8DAAYACQAFAAMAAADz//L/AwAGAAEACQAJAPj/8/8BAAYA+//2//3/CwANAPf/6//3/wAABAAHAAUAAQD9/wAAAQDy/+//AAAQABUABwD5//3/+f/q//X/DwAYABAA/v/o/+j/+f8MAA8AAwADAAwAAwDq/9n/6/8TACIADgD2/+T/5f/+/wUA9P/3/wYAAQDw/+7//P/7//H/+/////f/BQASAPf/2f/q/xAAGAAMAPv/8f/+////7P/3/wcAAAAEABkAGAD9/9v/z//2/yAAIAAPAPT/3//p/wQADwAHAP3///////L/7f/4////AwAEAP//AgD///H/8f/0//b/DgAhAAIA1//e/wUAGwATAP//7f/p//r/DAAKAAAAAQABAPn/8//5/wAA///9/wIACwAJAPv/7f/k/+L/9/8cACEA+P/Z/+T/BAAUAAEA6v/0/wQAAgALAAoA6f/g//f/BwAVACUAGwDw/8n/1P8DACMAJwATAPD/4f/1/wEA8v/r/wEAIgAfAO7/0v/r//7/9f8BAB4ADwDp/+D/5v/o//r/DwACAOj/7f8CAP3/6P/b/+P/BQAOAPL/5v/q/+n/7f/y//X/9f/n/+L/AAALAO7/4//r/+P/4v/3//7/7v/d/97/9v8CAO7/1P/J/9r/+v8NAA4A9//N/73/3P8NAC0AIQDs/8f/3f8FABQADwAFAPj/9f8MABMA8f/m/woAGwAKAAMACQD2/+D/AQAyACwA+P/U/+n/FQAYAP//AwAQAPz/5f/v/xoAOgAcAO3/6P/p/+3/HwA6AAgA6/8FAA4A+P/v/xAAPAA4AA4A7f/i/+r/CAApADkANQAWAPH/6f/9/x0AKwAcABcAJAAeAP3/9P8OABwAGwAlACYAGwAOAPr/9v8YAEgAWAA0AP3/4/8DADwAQAAiACkAMwAiAB0AJQApACwANgA9ADcAMwA0AB4ABAAqAG4AcwA6APb/9f9JAHsAWgArAB4AOgBdAFEALAAnAEAAVABTADIAEAAkAFMAWQA8AC8AMQAgAP////8wAF4ASgAHAOD/9/8jACMA9//s/x0ARAApAOX/tv/K/xcATgAqAO//8f8FAP7/9P/v//D/BwA1AEYAEgDZ/+P//v/5/w0AGgDv/+f/9//0/wIABADz//X/6P/I/8D/0//y//f/wv+q/+j/CwDo/8v/w//E/7f/sf/i/xEACwD4/wAAAwDO/6j/4P8oADkAQAA+ABAA4//r/wYAGwBCAHAAdQA5AN3/xv8LADIAHgAqAFUAVAAkAAAAAwATABcABQD1/xYATQBLAAoA1P/k/0IAmAB3AA0A5f/9/wYAFQA+AGUAiACLAHAAZABeAFoAYQBfAGAAcwCcAL4AoQBpAFMAZACjAPMA6gCDADcAMwBAAEEAJQD+/xUAmgBIAXEBmgAg/0T++P5rABgB1wBJAMj/mP+l/2T/A/9//8AAPgFFABj/5f5c//7/rwARAfkAjAC3/8v+lv4j/9f/YACRAJYAgADv/1T/9f6l/hf/CAARAEf/2f4X/2H/Kv+p/pH++/42/+v+X/7S/Yv9wP0m/ln+Zv5o/k/+6v1B/db8Gv3c/Xb+bP4E/rr9qP2z/bT9r/3h/U7+mP5R/rj9m/0n/sb+A//Z/pb+k/7U/iP/cP/D/yoAuAAoAUgBXAGUAfkBiAIcA3cDiQPGA2wE6ATwBBsFvgVrBrgGmwZdBnsG/wZiB0UH+Ab6BjkHNgfpBrUGuAazBoYGUAYlBgEG5gXEBZ4FpwXwBQ4GiQWnBEIEgAS2BJoEjASTBGkEIwTkA44DQwNQA3kDKwN1AtMBVwHcAG0APABDAAYAKv8N/i39ivzv+1H7s/on+pn55Pgb+Gr3uvYE9mb16vSC9Cj0tfMZ82TyzvGM8YrxjfGJ8XbxTPHy8HbwGvAK8CzwbPCp8Mvwy/C38KLwo/Cv8Mrw/PAd8fzw0vDg8AfxD/Em8XHxrvGr8arxs/GR8Xrxv/Er8pDy7fJD85nz6PMj9G700fQy9aH1Q/YG98/3gPgL+Y/5LPrS+nv7Jvyy/Bv9j/0m/uH+sP97AC4BvAE4Aq0C9gIkA40DLwS9BDQF0gWEBhAHcwfEB/8HNgiFCP0InQlLCuIKbwv+C4AM7Qw7DXIN3g2LDjYPqg/4D1sQ5xBuEd0RCRLmEbwRzhH+ETASYxKKEpASlBK5EtgSgxLWEVIRExH4EBYRTxFcER0RwRBqEPsPXw8FDzYPeQ82D7gOeQ5fDjsOPw5DDuMNVA0bDf0Mnww7DP8LywuvC4sLXQtBCwALkgoyCrUJBwlxCDkISQheCDsI3wdjB9sGQQaQBfYEugShBGAECAShAw8DZQLUAXUBFAGfAF4ATwACAGj/yv40/sb94P1W/nT+9/1l/Tn9Pf0V/eb8I/2//RT+9P3W/ej9Bf4E/tn9zv0r/tP+Yf9p//z+pf6i/nf+7f3R/YP+Df/1/pr+1f2S/ND7N/yo/Dz8Cfx1/PP7bPq9+fD5n/n0+NT4gfmV+vf6Ivrs+Db4Vfhp+bj6Tvs7+9X6nfrZ+p368/mI+qL8Of69/RT8LPt7+w38afzQ/PL8hPz/+7T7Kvsy+qH5xfnC+W/5N/nx+IP4PPgq+O33FvcR9vb18fbj9yn4R/h1+ET40/fJ90z4EPnf+V/6I/pU+cP4CfnQ+UH6Ivrn+Zj5qvgv98310fRl9ML0PvW39EnzL/LM8Xbxv/D574/vou/k793vg+8d7wvv8O9c8TDyevLB8hbznvN89Lf15PbO9/H4RvpK+yP8D/3J/Q/+/v0Q/rz+lP8gANUApgEBAg4CHgIwAvgBpgHJAdgBdQFJAXgB3AFxAvECRAM7A50C1gGpAWoChQMUBPgDyAP8A4sEPwXZBesFgQWMBUIGegb0BeMFhgYSBz0HFwfFBnQGHgbYBdoFEgYSBmQFKwRIAxwD+QKKAjcC8QFeAaIA6P8Y/z3+b/3W/ID8E/yO+z/7//qH+vz5yfnw+ef5Zfml+Cf4SPjB+CP5avmN+YH5UfkI+cv4xvj7+Dv5Tfk++Tb5Svlu+Xz5bvlU+Q/5ufiI+Hb4UPj897b30Pcb+EH4MPgT+Bb4MvhB+D/4RviX+F75Ofqg+sH6JPvP+2n83vxt/UH+M/8VAO0AvgFkAu0ClQM5BJUE8wS4BX8G2wYyB8gHJghJCJsIywiTCJQI7ggdCRsJPAmdCSEKYgogCpgJTQmTCRsKNgo+ChELRAziDBYNXQ2tDfkNYA7mDo4PHBCWEFQRFBJMEloSxBJBE2sTbROBE8UTGhQzFN8TWBP4EtsS4xLzEs8ShBJMEhUSuhF/EWsRMxHpEOMQJRGAEYURFxGWEGIQjBDeEP8QABEUEUERahF2EVYRRhFpEZMRuhHZEdcR2xG0EVIRDhH0EPMQERHfEDMQoQ+PD3AP9Q62DuwODg/uDnwOhQ1WDKoLfQv1CnoKnAuBDbwNHQwaCmoITAcLB50HuAj/Ca0KEwpFCKQFBQP5AUcDmwV9BtsEHAKj/zD9vvt8/YYAuQAG/tL6ufgE+HH3u/Y790r5hvuk+wz4r/IW8OPxQ/W49lr1R/NV8iDyjvEt8Dzv3+818HDuNuzS61Lss+ur6uLqQutM6vTo9Oet5kTmpOc66E3mw+Tg5bjnmOeN5WXkpuUC5wXnQeeQ6B3qWevP6zXrkupW6zXtke6v7rPuGe9Y73/vr+9H8IfxUvI88qnxZPDI7inuSu+08ePzZvT28onwN+7w7Ibto++Z8Yrym/L78T7xQPEL8vrymPPG83Lz5/Li8rbznPRj9dD2Tfhp+IP31/ag9sP2Yvcy+NX4U/mr+aT5VfnG+N33tfar9TT1LvX49Oj0MvXo9Ar0n/NB8yDy7fBY8DHwhPAr8YPxhfGj8c/xzPGn8fDxvvIA8+XyufPK9DH1uPWy9lf3bvdY93r3u/eE9yn3tveW+L/43/jB+Xj6/fmq+Hn3Gve399v4i/ln+Vf5l/mT+XX5jvlB+r77Ev3W/bT+s/+IAGkBtgKEBHAGxgeSCJEJ8gpaDKEN7w6bEKsSDxVCFxgYLhfNFYAV7BZ5GdEbHh13HfscFxxWG9waLxv1HAofsR/yHv8dcR2QHVAecx+aIFghJiGpH6kdMh2+HrogGyI8I+MjVyMfIpUhpCGIISwh/yA2IU0htiAHIHkfUh66HKgbyhpwGT0YuRcEF8kVthS3ExYSQRAGD10O7A1VDQoMYQpoCVMJcgltCS4JmAh6BzUGtwWRBaAE6QOABPMEVQTcA84DdwPwAmwCBAK9AUYB8wBmAegBpgEVAT8A2f5r/XH8UPwI/cz9Jf48/ir+9/3B/ZL9hf2e/bL9yP3A/b79Yv43/6H/OgBHARAC4gEQAZgAigCbAEABjQKeA8sDIwMQAgABLgAVAOAATAHnACEB1wGDASkBAwJKAhIB8P+3//v/AwB//wz/U/8fAOwA8AHAArkBgf9Z/tr9Cf3F/JP9u/5T/7P+3fwU+8X6dvtc+xf6QPno+Tr7lftV+i35gvkB+or5avhH98b2SfbQ9P3zIPUV9hn23vUd9OjxPvEJ8avwlvCk8NrwH/E+8bbwUu6X65bs3O6+7bzsN+6G7Y/qVOok7bzvAPCy7c3ruusN66LqOu158DbxHPFp8kz0Efbx9335VvoR+6X7Qfuj+vz6J/wv/rL/5v5B/Qj8p/q6+XD6uPyp/nX/rv/L/Sj6aviF+Mj3X/aK9aP16vbc9432cPTg8xH1Vvcy+cf4QPZx8/Dxu/K79Ef27Pdf+WD4gvXH8xD0DvUf9bTzwPIA857yYvEY8D3uwevQ6SXpaujS5sjl0OWu5VXlL+Wj5Orj9uNj5KDkK+TG4ubhzuKE5Fzmrejf6h7s2eyU7YLuYO+772HwofKg9Zj3kPhe+bD5ZvlN+eb5TPtm/Vj/cQD1ANkBmgNRBYIGkgcYCAsItAinCjMNrA8CEn0UQRewGXcbTh2ZH+0hwCQgKHsqTytNLK8tMC4TLnsuMy/UL0wwdzCOMK8w+S+2LgYuVi2QK/AoASaFIwwieSEJIVUgjh/HHrgdpxzpG4EbRxsaG8IaPBq1GWAZHxm1GJ4XvBXxE7kSoRHfEKkQdRC/D2wOrgzjCiUJTwdjBZ0DsQEV/2/8C/v9+ib7v/o/+iP6+vmU+ZX5+Pkz+pz65/t2/Xb+Y/96AEwB6gFWAuACLQSpBb0G/Qd5CUcKTwqVCp4KYgl3CMYIDwg9Bv4FawatBVIFPAVRBNsD9AOPAwsDnwJAAm4CCQMeBFMFQQRqAkoD4gPWAQkBlwIqA+wBYgDP/1QAgP+V/MP6/Pks98Dzs/ID8yXzYfKE8Inv9+8p8NDvVe/57sXuK++x8D3yHfPI89Tz/fPI9dn3wveG9vj20PjL+Q36XPp8+ev3dvhB+fj2xPNK8hbzdfVQ9kf1FfUv9Sf0j/OT8/PyIvPF9I31H/QS8c3uEfDt8yb2F/X58tPxmvGc8a3xHvL18jrzIvF97TDsfu197CzphOle7ZfuTOwq6rXp1+kt6MDiC9zL2RbfDOqG9HP3Q/TU9FH9tAd8DOMKmQmZC9kLBQpADPsQnhFPDnIKMAlCC/wLyQnzBTsAyvv7+2L+jv3s98Hx8+u7453bdtfi1hbZSd0s4VrknufS6d/qD+uw6Qfoleff5yPoiecs5lDly+Sf47PjQeaT54jk9N943R/dC93a2x/antgC1m3S+c/fzqDN38tny3jOBdXo3HLkfeuI8TD1m/ZT9+T34fjm+yYBlAZ4CoYMoQ1/Dx8T/BciHJwd4hx3G40akxsPHu8fJyCcHscbXRlnGEUYThieGM4ZNx38Iiopei38LlMucS0hLaIsBCzmK4kryyr6Kk4saS0ULccqrSdtJbMjiCHPHoUb2xcvFBIRHA4LChAFPgDG+634JvgB+eT5tvtz/o8ARQGwAKj/Vf+W/93/cQAoAZQBVALWA0UGWwmLC3AMQw0XDiUOrA20DU8OXA4sDW8Lewp/ChQK+gh9CFsJuAtsD6IT7Bf8G/kecSAYIYIhBiLcIr8jaSRQJdMmxijPKqIs2S0PLvUs8CpmKGslxiKeIKAdqRm7FasRGA3pCMgF7AP2AsEBYwAPAIYA7gAkAdMAS/+o/Jn5yPa89Kvzl/Mj9Df15vb192j31/X/867y1/F18GTu+utB6czmHOUE5FHj8+Jt4qjhb+EH4hbjCuXd57XqOe0O7+/vKfAx8Arx/fJx9Ub4tPog/J7+OwPqBtkHLQiICJ8HqgYnB4IHhAYABbgDbgNkBIQEeAKYAN8AOgJ7AqUBEwIEA08CgQIABZoFxAJVANEAOwMqBFoBZf7c/Uz9iP0+AH4Ao/qJ8wfwZe5W7fjtr+3U6HXjeOMM5mnmDuSI4H3gT+S15kbn7ubJ4ivdTtzO3kreTdgk0bfSjt/w7dz2O/tC/AD8cf5GA0QGWwbVBq8KHw74CrwCpfwK/uIEzwlnCh4IJQOW/Pv1xfHN8kv3gfqc+IXwleQ/2EfP0s141Ljenufu62rqr+dT6gvwKfFP7ifuXfBi7xbrnea341TjX+SB5Q3nEOjz5+PnD+dz43bebtty3EPgxeHi3hzcZduJ2eXWJdc920jjJu44+IL//QMeBtYH5wrZDjsS9RLaEMoPFBDfD64SRxgUGgQYuhf9GYcbBxrqFSMTzBOnFCMUhxPpEa8Oaw3TDxUSCBKXEokVtxmrHtkjWieKKWYrBitzJ4siEh4yG7MZ0hfDFWcV4RUdFb8ShQ/5DCAL6QegA2QAk/7D/C36pPc39rr12vUx9z36F/5JAUED7QS7B5IL6Q50EXgTcBNrEIUM+glNCQAL4Q67EtMUdxVrFT0VaRW4FXEWyxfQGCYZ4hjAF8UW7BYcGKQaeR7OIf8j3yW/J0Mqby3ML+QwwzB8L0Et8ClPJpMjmiACHecbpB02HqwcthrpF2ETPw5lCpYICQeEA3j/jf0k/B35zfZh97n4fPn0+vn74PoI+u36PPuX+p36SPqG+Mf1FvIv72fu5e0G7Rntt+3r7TXuFu+B70zuQut854LlGOYF523nRegP6hjtzfBM9Ev3Pflz+hn8i/4zATYDZwQLBrwIogoxCsgITwjSCAkJSQhOB9MGKAbGBKYDwwPNBGsFGgScACT84vgl+Y/8pf/2/9r+P/4K/TT7lPtX/eL8F/r79i31P/Vk9qf2zfNa7n/qNOst7izujeka5Nji+eck8Hfzr+0E4x7cyN1q49bls+Qi5jPvZPymBTEIdgYmBc8LzxmrH1YWeAlLAZr9sf/pBX4I+ANo/U/5uvai82Xvie0f8iv4U/jS8ajn0d422I/S+dHf1RHWv9E50BnVCd4x5svq5O4l8hnwSevx51/lDOO04VPh0t+03G3b+t3u4ULkxOMP4mfiJeWH55Horede5JfhIeH44MTgPuJT5SzpjO8k+eABbQeLDLgSbhiSHAoeZhzxGd4XAxYkFjkYfBklGcsXpxUXFFEUfhWSFhQXmRbAFfMUoRO2Ec4PAQ5ZDA4LIQqTCdIJvQsZEPUVRRsAHkEd/BrJGSsZAxeCEt0MHAgfBSMDdAELAD7+hPuO+SP6GPw+/QX9Yvw//BH8c/sz+ij4JPfB90P4k/kh/ToB8QTXCZwPyBMvFRUVARZqGEsZrRaXEtsPEw8ZD28OjQ1CDpwQfhOzFsIZshuAHD4dsx5lIIcg1R45HcocPh19HjsgtSGpIvcj/iUDKDkprygaJvIiSSC3HVMa7xTQDSsI/wXlBFQC3P4h/Cv71fv6/Eb8Avm09gT35fZa9SL0P/Mr8nfxMfF08S/yNvKI8mT10fhv+WX4kvf89hH3vvZ89CnxN+4D7T/td+2W7ZLtge7X8f71bvld/FX+of/PAYQEfAb7BzUJnQp0DHIN2w1LDkcOtA6lD/MPzQ9LD9ANXwueCJsGxgYiCBwH+gF7+3f4UPjd9gn2/PYd9WvyH/V7+WD5Evcb9cTzKfRC9X/2GfhM917zkvBw8enztPSp8jTxtvL28ivwcu6o7g7tIOhZ44XiO+W56cfwgPrKAQoC+//oAwwNHBSVFsIV9xHbDFQHLgIsAR4EUwbYBCb/KfgC8wHw9O46743wHvHs7HHlcN/+2v7VWNAgzMHLCs+P013Xxtou34Xkxegc62rsqOzj69LpoeUM4qngfN9L3h3dAtzq3HTfk+Fc4nPhxt8P4C7js+YT6MfmYuTu4jTji+Ud6ZTstfDK9uj+pwd+Dr0SrhVvGDQb+RwRHTQc0hr5GG8XhhaKFW8UfxN5EkYRChCyD5wQZRFOEdoQGxBvDwUPuA1aC64JYAkZCqAL+AyvDfMOORFJFDUYsxqSGDYTmQ4YDF8K8wd0BHb/B/q39uH0zfLL8Ebvi+908vz1FPh4+A74//cg+DH4e/pl/kL/Sv5+AKUE9wcADHwRzBagGkcb5RnnGZEaqxkBGK8WpRURFJARABAWEacSZBMhFdEXuxnaGrAcTyDHI70k7iM9I9Ai/CEYIVUh5CJyJPAkiSTCI50j0CP/IRgeihqnF/wTFA/qCVcFTwHq/QL8RPtE+WP1FfOa9GT21PRb8+T0J/Yx9r32t/X78r3yJfQI9LTzTfMM8yb1P/eQ95r4S/ot+vX4mvl4+if4CPZX9zv4nvde+a37F/xZ/oQB4gH7AXQEaAgMDIENvAwrCzMKTgydECQRZA9/EHsPAAsZDFMRkw9CB9gATgDUAysEpf+G/Zj96/kl9ij4Xvx+/ej7xfo5/Mn8PfiN9AX5hf/1/8b8wPme99L3pPpP/T/81PaP8Rny+/eB/VT+hvwR/xoGAQk6BZwCZwalDa8RJg0LA2j70fkU/1YGUAV6+iDv++r17DfuQevi5p3kneOq4d7fkN2Z1pzNBcqfzG3QktE20MXPEtNr2bXfSuP348jjH+Nt4rbj/eQP48/f/91P3tbfx+B24N7fp98J4JHhQeRU5uPmYOc86WDsTe5D7Q/tb/C38xH2evs7ApgG2QoQELoU6hiPG3McuxxhG3AYzRZLF1wXQxW6EcYOiA0QDWgMiAuuCj0K4wkTCu0L/Q2dDbgLmwtPDaMN2wsPCqUIOwfEBxsKHwtlC0UMfgqDBWkChgJPAtz/bPuq98r27fUg86fwGO9H7fTrwOzH76Tzlfa/+BD8VADJAtwCagO0Bl4LFA5YDToL+AqVDVQRUxRTFmUXLRehFiAXzRd9F2IXIxhKGAcXMxX3E3kUjhZuGBoZqRkZG9YdCCIUJuUnGSiiJ9MlpCNSI5sj7SFKH7EdRhzKGawWgxOvEEEPcw95Dw4NUgdWAA78GvzK/n7/I/v79dTzJfLm8MfyN/X59C307/Tx9lf5X/oI+k36h/rU+Hf2qvUZ9/f47fdl9rb4/vpP+k/7wv7W//T9B/wC/BT+Q/8w/6IBxAS7A0IBGQNiCNoMgg+CEI0PDA6aDZ8N9g2uDw0RrQ9dDEIIyAQ6BFcGmglKDaANawcXAJ7+YAJ7BpUGMwM/ADT+XPz/+7n9rP8H/2n8b/vR/D39k/qz9x37Qwe1E10V6gwiBZMFsww2E+MSYgw4BBz+l/1YAKD+Rffi8JPwPPNM8bPpy+CQ2wXe7+MQ5Eze6diS1AHPusogys7K3crPy6bPH9Za20fciNw24ADjFOL14afixOA+37vfj95126TaqtxK3rreTt9W4Orh3uIN42jl5ela7Pbsd+8b81T0wfG17uTxCfooAIgFZgwTEJcQABR3GiMfgh9xHAUaJRp3Gb0WfxT+EnMQ6Qz+CSgJgwmrCMwHfgnaC9oLZQoxCtsLew3fDMEK9wjFBocDYAG3AtgGgwkPCFwFuQS6BAkD6wDL/xT+Pfth+Jz1RPPf8Ent/OmI6M7oeupW7GDtAO/E8tf3ofxqAG8CegLhAvcGsw16EVYPZwqCB6kIjgyLEN4SyRKUEDAPjBC6EbkQQxAUEr0U7BbtF8IWMhR5EqgSBhWMGREeTyD+H+kdfRyCHgUjSyZYJioknyBIHBQZIBfGEzEPuQzUDBgMAAi8AS79yvyt/mD/jf60/Br6z/mT/J7+af09+e/2evln+sn2Dfa9+t79TfvF9uX1v/n+/UYASgEU/oD1ku/T8t75E/yo+ez4pvvM/Nf6rvw9BQQM0QqABn8EZgRtBSUISwsGDGYJ/gYzCGAJcAYGBMcHQg4jEM4LGAYaBCYF5AXIBkoI9QanASz9v/0GAmIFAgbPBgUIwQZ0A2T+sPeb9DD7cwoMGRMd1BUwDC8KkhIwHn8iuBxOExsNTgpoBVL9MfkB++T65/ZD81DrQNtO0lXcounr6gHlH9+5243XrM88zHzQ4dGbz+DTdtya4ODhheNF5JXiBOB14KLjGOU/4zHhNuLW4iXfUNu622TeWuA94B3eddzI3azh/ObQ7FzxvPK58J7u2++886H4s/16AqcH9QzsEC8TghMCEskRYBVHGhEdEh0EG2AYfRbPFe4VGhWBEWMMeQkJCmALkAvBCwMN/Q19De8MPQ4qEM0PjQ1qDIEMpwu7CREIHAfhBiEGSAPZ/2X9ePuA+lr6sflA+Of1jPIL78TsS+yn7LfsIOwP65bqMuxM7x7yG/Xo+C38XP5dAHECWATWBZ0GWgerCPgJKAt9C0cKQAkdCSIJcwr4DLoN8wx8DTQP4hBHEg0TQRSAFsoXKBcKF+0YURvlHBUesR/JIXsjqSN0Ij0iLiNHIpoffRymGAIVEBJYD7gMygmrB04HugVoAnAB2ACo/F36yvy0/CP5NfjA+Br42fft95n58/zn/E36Yvtw/vT9bPur+gz8j/5IANf/w/3/+xH8tvx8/I379vl5+OD3CvhA+Uv7EvzU+0f9HQCUAjgC5f72/5wF4QWYA4UIlA0NCj8GyQixDHoLBAXnAywNExOSDFQECQPqBLkEqv/I+pT8RAFfCVQaTyjQIqESdQ4vHHos1ix7HZsO6QieCfcLqQtXBov9zPVQ8nnxHe5M5U/eZOLU62PwTu4I5k7amM+ayJLIvM5q05XTX9QV2Q3hCOcL5SzhjOFW4QLgjuHs4hLhu97W3Wndsdv71jLSSdHo0ZLRgNOR2czg6uVO6P/qre908RvuVOzd79jzaPV49/78VwVODMIP8RHxEiIRlA9YEv4XzRzhHtAd0xpLF1kTrg9vDeYLVApDCbIIxgipCpYOYRNtF/0ZABtOGgoYLRUXEw8TMRUmFzQWAxIrDFcH6QQ2A8sACP7Z+yv7ivt7+xP6j/dL9TTzoe9j67roHOf05W7nWOub7TftV+2G7wTzSvYk+Oz5EvwH/Wv+cgJzBrUGmAMsABv+vPw6+3v6dfuY/cb/TQH8AtEFHgkhDJIOCBBhEZYTXBVmFaQUYhRAFvEZPhzrHPEdYR+tIY4knyVNJMUiXyIlInQgYxxuFqYQfQzGCf0HlgaxBG0CGAESAh0FmQdJB0kGkAdxCYQIHAWkArICHgP+Ak8EKwbUBDABOACNA6sHKQezAQP9W/v5+ob7sftF+d30YfG18LXxFfLM8X7yc/Rf92/6S/xn/hQCpAXmB3kItQcgB2gHTwgNCVYJagrXC7UJ7AGT+N/0Q/tPCOUT9BkOGp8WHxd4HtYkaCP2HJUXihXfE3YPXwvyCQQItwT7AQ0Acfyt9VbwZPAs9Mj4Pfrl9Wfv8Om64uHZFdUD1dLUq9MO1rbdFuW55pDkRuTQ5uHmAuQN5B3lD+F43avfn9791cTPY8+yznbNWs4d0A3Tp9Zr2orhAemN6h3qlOzx7TrrlucJ5wbs6/JD9vT4Df4hAbgAnAHrBdkKxw0PD0IRMhQcFPcQ6w5YDp8MBwp8B+IEAgR2BmUKrg2sEDAU8he5G98eWiBKIHUfZx4cHmQeLh06GpkXMxWUEY8NjQpyCCoHDwdxBxYHPgYGBWUCxv6w+wb62/ls+QP36PPT8XPwu+8i8FrxrvNb90H7kf6qAIoAgf/q/78ALgCu/uT8KvvI+B/1XfIK8q3yCPM58/bz1/YO+9v94QBRBskKJAxEDWkPVBClDnwLFQqsC14NQw59ELQTBRbzFu4WXBfiGAgZIBdpFrMWWxSsEPIOFg6UDH8KMwh0B0YIJgi9B9oJgg1+EP0RvxJKFVcX+BS8EtATSxJEDc0KdgrbCGwGBwS8A3QExAH2/r8A6QHp/cn5bfkW+rr5V/nW+Q360Pmk+h37mvrt+vv73v2R/6z/xAB8AkUALPwL/FH+hP7y/aIAkgc2DvwPqg9cETwTqxMTFaQWkxNfDAgIygkLC+oFyv7A+w784/qF9oTzNvTI9X/3kvlm+sL4AvVp8aTumerg5UPkH+Yv6BPpOOok7XrwN/GS8GHx7PKc82jzbfKS8LPtPurG5lfjod/j25DY39Vv1FHVBdjG2iPdD+Bv45blQ+Zm5zDo5Oa45rDqi+/d8FzvVO/l8Sb0CPUk9zn7NP7r/nQAzgNrBZUEGQXlBfICnv6r/C38A/xk/Bf9oP4eAXYDKwbaCdsMQQ+jErgV6xbHF04ZXBrIGhYbihp8GJoVJhPhEWkRyhADEK4Pzw/ZD84PIBAmEPYOOA1sCwsJAAbKAgUAdP56/kr/n//k/8EAfAEoAm8D2QTzBakGGgfLBz0IJAf/BB0DTQFJ/xn9XvrM96n2I/fe+CX7kfwH/az9WP5M/u39Ff6x/tL+7f4cADQB/AAiAa0CnQM0A4IDCQVrBtMH1wmeC1oM8gsmC/cKuwr+CJwGpQUmBk8GHgW9BEIHjQn7CLIIdAp1C6kLaA37D7gRohH5D0oP5Q+PD2sO2w1SDX0LtAhzByYJrArdCEIGxQXbBeQE6wPGA6gDcgJ2AGz/R/9q/oz9E/4H/yT/F//Q/8YAbAGSATwA5P0r/VL+6P7s/i0ADgLkAloCUQGvAKj/of2g/OD9B//8/f/8If6P/n/8VvrS+KT2dfTh8y71cfdV+XL6nfvg/Cb9bPwm+wb55fZq9kD3OvgD+a35XPqq+sT5FvgZ9173S/gC+Rn5b/lz+gT7T/qq+NL24fSV8tjwevDC8Pjwd/G08mD0PPWR9LzzOfQa9Tf1KfW99Xv2rfaq9tL2Q/ax9JDzkPPQ81D0UPU49jn3svjB+ff5JfqZ+rL6NvqN+Sv5HvkL+fP4ZPku+qT6yvrY+vj6nPvI/A3+Lf8bAN8AkwE5ApcCdALxAWwBHwH+AO0AygB8AEsArABwAecB5wHjAQwCLwIvAhACygFmARUBGgGJAfEB6QHiAVoC+wJrA9gDjwROBbgFUwZ0B1MIeAh+COYIRwnzCCMIpwdZB3sGiAVvBbwFsAWGBbYF7gXbBcUFpAUxBfwEfAU3BrYG7QbaBv4GYAcPB04GPwbbBoYHyQevB6cH0AcuCLEI0QggCP0GPwYgBg4GkAX6BL0EmQQJBD8D5QLtArUCcALXAqQDCgQrBJIEWwVtBjIHAge1BlYH3QdpBy4HkwdpB5YGFgYbBgIGUAVvBCMEJQTHA0kDDwM6A7IDngOtAgoCVwKuAmwC+gECAsICjwOlA1wDWAOHA/EDlgTYBIsE/QOAA6YDOQQTBBADgQIbA6sD8gLFAcUBwwInA18CaQE1AW4BYAFIASYBXQBa/xb/d/9p/4z+Gv63/mv/mP+l/wcAZQAjAMn/6f/c/1L/9f4J/zT/b//b/xEArP8c/wn/PP/7/kH+2v0t/nT+9/1r/WL9FP0P/PX6Kvpm+Zz4J/j399D3yvfg99X3nfdB99P2mfau9tj2B/c691H3WPd693/3OPfS9m32+/Vs9b30TfRA9CX0v/Nn80PzG/PB8lDy7vG+8cTxAfJm8rLy2/JG893zAfQG9Nr04vUj9mH2X/cO+An4WvgB+Vn5avkv+Qr5X/mT+Ur5L/mH+dr5xfl++df53vpc+yr7PfuX+737yPsr/Oz8Wv0X/dv8NP2R/bH9Ff7U/lv/Yf+J/1UAIwFZAUABbAEHAmsCCAJxAZABTwLgAuECsALSAk4DsAPGA+kDRASfBP8EnQVZBr8GmwZaBpkGagcdCA0I4AdhCBIJiAnuCU8KrgrYCvkKjAs0DG0Mjgy5DMgMHg3JDSMOLA4yDkAOTQ4oDqQNAQ2XDGEMFQzSC9QLzgtzCz4LYQttC4cLwguwC8ULXQyMDNQLTgu5CxYMiAuqCvsJpgm7CboJewlVCW8JjgntCNMHYwcqB0IGdgViBT8FrwQ9BD4EfgRMBJwDZAO9A5kDBgP7AocDMQSTBH0EagRzBAIERQPkAokC1QFMAUoBlwGNAcsAuP+F/mD9hfyz+xT72vrC+u36SPuq+yD8Xvxv/IP8Vfz3++b7U/zM/Jb87fvH+wr8rvug+qj5SflU+e34Bvjm9+H4x/mt+fH4Y/gi+LL35vYe9sT1p/U/9ZL0IfTP8x3zPPK38YXxavFV8U3xdvEx8knz7fPw8wr0afST9Gn0RfRL9Fz0RfQn9DD0LvTy84LzxfIh8gLy9vGa8V/xbvGX8ePxJ/JN8sPygfMf9LH0j/Wa9oT3I/jF+K35Z/qi+tH6JPtn+2v7O/sg+0H7cfuN+3/7SPsv+1n7Zfs9+1770/vu+6b79fvl/Fv9eP0V/uP+dv8kAPIApAFYAgcDzAOzBDUFbAUQBtMGCQf/BmMH0werB4MHAQiWCMYIyAikCIoI5gg7CRUJ1QiaCF8IdAjeCHMJ9wkACrsJGwoNC38LTgtkCxQMxwwzDaoNCg5LDrQODw8ID6gOFg6rDZsNvQ3nDfwNrw0UDb8MDg11DfkMvAseC1QLiwt9Cx8LcAoXCokKHQv9ClUKBwpqCrgKoQpWCsoJhQl+CcoIBQgBCMQH8wbABgIHbAYjBV4EkgQFBdYESgQaBBAEqgMiA+ACRQP5A6cDYwIQArgCaAL0AB4AXgCMAD0AngAaAsQCkQHwANAC3wR+BA8DygIaA5UCOAEaAA0AEAC//oL8aPqk+Cf3jfZB92D4I/m1+TH6rfob+3n78vva+8X64vlD+oH7Ifxw+3T6Efq9+fP4EviU94z3yvcS+H74CPlv+Xn5yvh99zz2FfXl8+vyVfLt8WDxyfCE8HDwK/DR7/DvjPDp8Lvw9fA78oLznvN18yP0nfTU8y7z6/PI9CT0gPJn8VvxmvGV8cDxMfLb8fzwHvGs8SLx3PAB8oXyzvFW8gD0Y/Q99Hj1KPcE+NP38Pbc9kj4Dfp4+6z80v0n/0IAgACKAHoAdP+E/gr/BgAfAG3/oP5s/tv+0v7m/Tf9n/3R/gAAvAB8AfwC7wSnBrQHhAd1BkMG4gciCiIL4QoJC0MMTw0ZDT4M8gs2DBwMoguxCxQMAAytC4oLQQupCjMK+QlvCQ4JoQmqCp4LaAzcDBUN6wyTDOsMqg2IDaoMdwzwDMEMWwyQDA0Mcgq3CSQKDwoyCVEIzgdXCNkJ0Qo0CpcIggdICMsJRQn2BvgFTAf9CA8J8AcsBxMHMAdJB0oHAwcYBhEF/wSjBaYFqgQkBFkFnAaPBV8DnQLKAlYC6gETApcBnABcALgAjQFNAvgBUwE4ATQBhgHIAsgDRgIe/9X+wAHVADP7PfubAwYJZQbAA2MGJApiC7EMORCvESgNoghoC4YPugucAzD/oP5w/pD8evjV82LyavXj+GD5m/cD9hL31Pku+s33PvYc9wH6y/12/9D9T/xe/Bn7yPjq+AH6NvjH9XP2DPgz99bzUvA272TvfO3G6UHn6eYt52Hmy+Q95HfkgeSv5UnnEeaX46fkNulG7fbume+N8Rn0P/SE8vXxofKf8vTxNvJh85Dzn/FM7/Du5O+b79Ptxuyw7UHv9O958LTyRvZ/+Iv43fjw+hr97P1e/l4AgwQiCIcI8welCaILGwvXCewJowpxC68MzQ2gDQ4MdgocCs0KaQu+CpEIZAcJCcUKVQoMCvULjw7pDysQmhB1EYwRDhH1EdYT9xOHEswRzxFzEV4QcA5/DH8LrwoECQsHjwWSBCUEOwQ6BCwE+APkAukBsAI3BHAEpgP1A+AFqQckCGkHCwb6BJkEfwR5BEwEawPfAW8A1f88AJcAz/9J/6kAwgHN/yf9xf0vAEcAYf7q/av/KAHGAEgAqQHuAroBogBwApoEOAQCA6gDLQXQBAQD6QIgBbcG0gUnBOsDFAUyBlIGqAX7BDoE2wKmAeMBEQP0A88E9wU2BvUEkgMWBDEHHgpiCZEG/AQvAygAWACKBcULGhDjEvwUhBYmFygXBRgvG7oe5h1tGF8UXxSKEgwLwQPqAL39Ifd68HvtNO5Z71HwZPMw9hf19/L78qDy7PAG8kj2R/n0+kv+jAGWAGb7WPW+8Zfwzu7g7Pft6+8B72TsOerV51zkyuCw3t/dmtwv29zb1N183o/eu98i4ALegduu28be7eIC55Hr6PDX9S748/ev9zj46/dH9sX0JvX19lv3H/UF88zy8/Hk7jrsbex27r7wt/Oy93L7Ov6UAE8DFwcjC9IMCwyCDKUPzxL6FGQXqxl4GoIZYhdGFX8TnxEPESETDhVVFFYTLxS/FMwSXQ+4DK0LBgwLDREO2A7JDhEOtQ4rET4TahOsEs0SnBNgE/ISoRRaFlgVQxQxFIsQlgjIAdr+Pv7Y/eb71vhJ9lj0K/Mg8zLzwvIG8470Yfb194X5S/sq/cT+3/9kACYAUP+o/qT+fP49/U37B/rk+dT5ofh99qj07PMI9Fb0ovRe9bz26PdC+JD4J/pe/asAOAJiAg0DRwUaCKIJpwnwCZgLRg2PDRIOYw+iDpAMmg3fD50NvgjGBw4Lng2UDDMKyglKClEJBwlsC2YN4g16EMYSYA6HBmkDegWwCu8TQB41I7wh+x3wG9ocCx9+IRwl7CbBIVgYSBIkEekQWQ0+BR/73PJj7vTrMers6knu+/HT9EH26fT579Dp3Oe57EP09/gE+iP6HPst+xr3q++f6K3jTOHs4mTnYOkj5dPdh9kS2pPbItqx1lvU3tN/1MfVEtip29fewt9m31veFdsz1+3Xbd5w5kPsne938Y/yOfMV9Pr0TPRl8rHyF/Yx+eD4QvYn9Sf3b/nM+CH2lvQV9Vf2O/ir+wAAuwNXB+ULKxDrETURxRBYE5cYSx2CH7Ag8SFLIrYhviAlHn4ZMBVREzwTdBNhE2ATYBPXEtARPBA1DvMMhQyiDKwOgRLNFB0UqxKHEroTEhUtFawTZhHOD+MPyxC8EAUPSQtTBkcDzQFh/ez22/PS89ryG/H57wvvBO4T7frstO4h8aryXvQd94H5FfrN+Ez4GvtR/k7+6Py9/J78fvvb+db3zPV99FP07vTc9Mzzk/Oq9Hr1yPUl9kX2DffA+X39uQAwAxQFggb/B8wJjwvsDHINrwztC1UN/Q8YEW0RLRPeE/ARwBFHE3AQtwtcDZASnxOnEfkP5A5MDr4NbQ4IEd8RKxDHEEITYBC4Bov+3gFJEUkhlyecJTogtRnfFgkciSSyJzgkFSHAIaIfsxUBClAEBwOh/9T4UfFl6i7lauNK5vTsK/LA8QLur+pt6Crnj+ch6tvvlfgmAG0B5Pw998nxeevW5vHkROPH4ojlIedO473cqtel1RXWxdb11v7WjtUj0w3Ux9lp4HbjC+JN4BbhT+C23Afd6ON/61/wcPRK+JH5Cfel857zvvWZ9QL0O/UG+Q/83/wA/KL6S/m399b24/dF+Ub55vml/XIDtAhqDP8OzhACEqYSAxNFFJcXXBzoIBMkzSR3ItoeZhyCGmEXqxMMEYMQJBJhFPYUMhMTEH8NiAzxC3oKaQliCgEOjhLoEwsRPQ6cDvsQEhNmE4cRtw6cDNcL6Qs4C6wIYgUiA7ABo/5c+HrxjO6D73rw1O947uvssevz6wTuk/Ad8ojyOPPe9ET2RPdz+V/8O/6E/64ABQBS/a76Bvk2+DT4YPgq+AX4IvgN+IT3QfaF9C70afZj+Sv7WvwV/qEARASeCP4LLA3ADKYMdw4lETYS1hGsEj0VzxaLFUUTshJsE0kTYBIFEtIRghC+Dn8OBBBCEXIQOg6JDSwPyg+PDf4Log7PE4UWKxQhD8YKIwc4BdYJMxUmHw4iViBxHYUaXhlGGyEfpiLXIpsdyRTADE8Ixwc9CAcEY/kP7VXkXeHc4mjlGOdk6Czq0utX6zroReUg5mrrEPKg9gT5+PoL/Ev6zfWD8BbsB+i542rgyd6b3a3bmdhA1W3T3dM91bfVoNRN0xfUqNcs3BHg5eIN5HzjQ+O45G7mkOe86YjtbfEl9CP1bPSR85/zWvSm9bP2x/bV9lT3cfcw99P3Sfqk/dD+kfwd+iz6BfzB/joCWAUwB9kINAxXEf8VsRcHF3EXuxohH2AilSPDIi4hSiAeHyMcYBhuFWsTpBIME70SpBDmDqEPCxJwE7cR0Q3GC1wO4hPxFxQYwhXqEk0QXA+MEJURLhDvDHsK/gl3CeAGfwMwAf/+V/wm+1D7u/kw9lLzBfF37q3tG+8w8FfwsfDY8Lrw6/Bx8VPzHPYQ9832x/fU+Nr4aPr6/U3/+/yC+sn5EPoD+1j7L/nq9Wv0J/UV9x74mvY/9B7zUPNC9hP9PwTkB6kIvQg5Cc4KsA25Ef4VExhkFjsT1RHhEUIRsA/1DZ8MPgwtDPYK7Ql9C6ENtwx4ChkKlApOC5EO2RKlE2UR7A94EHoRhxBiDloPWhOBFKUQCQorAoj8Qf7tBqARPBowHnIc0Ba5EEIO2RLZHIMk5iLKGPUMDAaTBjMKgAhz/iDxtOdk5Rfn/ef25kbmTOgR7LbtTusN5/vkqOdr7un14/qR/LX7j/lg95b1jPEz6VfiLeO55gnmBOKG3BzWTNOC1traVNv116vUntW42bTcj97w4Q7mT+ip5zHm8Oaa6PXoCuue8Nj0FvR68RXx+PJa9PLzzPMe9dj1NPVK9QL3F/mW+on7mPym/W/9PvxS/Bf+0v86AXYD0QbfCgwPaxKGFPUVuBc8Gtwcnx5gH1kfsx7/HZwdxRy+GuEXMBWeE00TDhPZETAQWw/AD/UQKxK3EhMS6hAhEQgThxXHF4UXKBT5EWATwxSzE9MRsw9hDB0IMQTYAS0B4gCM/xX9y/pR+fH2z/MJ9CP3Avd587jx9fFY8dHwi/Ls9Tz4cfdV9ez0CfXl81f0/feL+/f7Uvmf9vT2u/ja+AP4ivdq9h/1Afau+Dj6BPlY9pv0UPV5+Gb8Cv8JAMf/2/7w/0wFzQuPDhwO9g2qDnwP1xCUEs4T1ROEEpoQuQ7IDF0LZwtCDNkMmgzICwkMAA3CC48JaApnDLMLmwoeDGgPjhK6E1MSUQ/hC+oJPQvsDs8RWBHmDRsLcQngA6P6GveC/7UPFx41IpwZ0gr+AcEHghh0JdQiaRTpB3AFuwkQDXcK2AEB9z7up+qu60brZuad4pnllO0E8/Dv4ebY4MTjCO1R9VL4CvjC+Lb7n/54/ZT2dO1558jmj+mC6xvpdeI624bXk9hj23Lb8dfr1EfV1dfb2v3dweBv4+jmtemA6X7nKud96ljwBvWL9ZjzefK98qXzePTu88vxEvCc8EPy+vKg8oPyRfSh+A39kP2o+vX4+PoT/xcCuwL4Ai0FUwm1DasQ1RGWEvoTKxaEGSgcQRtSGeQaNB6lHj0cURmdFgMUrxGKEG0R+xInExwSPhHYEFEQUQ8/DwoRqRLWEqkTKBY1GC0Y8BbSFQcVMhSSE7oTzxP8EVEOOwoiBkUCmP9a/iX+a/70/az7Pvhr9bf0mvab+VP7//qz+Zr4jfjK+Vv7APyH+6b6lfk8+GT3G/dU9lf1DfUL9cr0f/Tx87TyffGY8Wnz8PV+94L3Mvdf95P39veC+er72v27/tz+G//o/6MA6AC7AEoA4wAZBGoJBQ77DtULhQfuBRkIDQxqD8QQ2w/jDaIMRQzLCygLmwrJCT8JjgnVCW4JSAnCCfcJ2AkNCsEJbggoCQ8Nrg5oDHgLGgy4CrYJWww6EDESyBByCyEEyPzO93n6XwZ5FDMcyRoVE38KtwVdB2MP7BeNGFYQXgdCBSsJzgyXC/kEmPsp83Lu/u2w7pjtUO0N8Q72k/dd8wPqUOHc4Zfri/QE9yj3h/k9/Rz+3fkJ823tpem453bo6+ml6KPkuOBu35HgTuGh3zfcgNjl1aHW5tsK45nnBejQ5gHn4+hN6vTpdemD6w3wS/RH9sv1+fKm79buc/A68cHvVu2g69DrFe6n8QX2UPrB/Lf8MPth+Tb5XvxhASEF1wbXB/cIdgrPDAUQ1hK4E34SvBBwEF8SUhWAF3IYyRhdGLQWAxWjFHgU7xOOFNQVYxVfFAUVEhYfFnQVBRRqErsRUBLuE1cWABlTGq8YAxbiFZgWThXhFLUVahJjC18HIwgmCosKggh/BYACzP5E/DX91v6g/Wz7avsz/fD+tf+t/77/FwCs/4P+J/7J/vX+Sf4+/a77IvmE9Y/xLO9p77LwCvE68DHvNe9r8Mnx8fLS8+zzavOZ86P17Pi9+3796/42AGEAef4q+wz5Afrz/BIAlALAA6YCMv+b+yD7ev4/A7sG2Ac8B38GEQebCZIN4hCZET8P6Qo5B3oGIwgDCrUKTgokChELfAv5CaEHIwZBBngHbwiaCM8IcAr/DA8OkQw2CQgFLQOoBkoMDQ5HDAAMcQ0uC54BKfS87Lv0GAtSIpkqmh5ZCfr9MQRiEXwY4RarEFYMog6tEpcPPwa8/q38oPyo+WPydOpV5//qQPMN+5X7CvMp6RzmuOkh73vyV/Mz9az7ywQaCuMGH/zT7wjpGerp7l7xZe/76hLnxeRs4s/erttU2mvZGNiw12HZZN1U40nphuzh65HoxuXD5sXrxvHq9Y330vdW9271rvFd7VbqZenQ6c/p4+d55QPmQOqH7w7z2PP88hzyC/JQ80L2svqq/6UDMAZlCIcKkwsiDNINYxCrEnQUNhXYE7sQtw2nDOkNCxAwEVIQwg0mC9UJuQrfDtUU0BfbFZUSDhGfEPwQiBKHFAsXZxoqHa4dSBsfF1IU7hRaF4cYRRduFUUV7BQeEWwLIAfmBDQFjgg1DH0MRQnKBWcFrAe8CNQGeQNdAOv+3wDWBVgKuAtvCgEImwUTBCMDCALJAHr/y/3/++P66frg+1z8l/pg91T1sPQh9Jf0Gveg+UL6qvlA+OX1l/QA9gL5YPwf/wIAVf8e/g39dP1y/6wA4/95/on9dv15/igArAELAjoBeQB6AIEAXv8n/RD8Pf6fAi0GzgdFCA8IOwfaBkkIjQoeDBoNYAw6CTIHxgg4CyAM1wsxCp8HZgb4B00L9AymCVMCDfxt+3AAAwbcB3oHTQaqArn+EP8nA3wH2wrQC8IG3fow7kPrEfilDTgdbh6tFIwJZwWZCaEQDhQLEW0JMwIA/zn/LQEIBHUGJQaLAFH2PewW5//oF/BD91H6fvgH9HbvK+yb60zuS/JN9V73w/rwAOgGXgcIAcX36u/R60br0+s764HpsOfk5Tjkf+T05mfoHuZt4GTahNjm3NzkXuvA7OToB+Qm4zjnve0K9Ln3nveR9R301fJg8HXtYOsL6jrp3ejp6P/pEexd7RDtTOyQ7PLuLfP09gP4nvYu9QL2r/nj/rADggbDBpAFUgUBCEENJhLFE54RLw2ICBsGXweLCkAMuAvICtoJMAmGC4kQfxOjE74TaBNyESAQZBFGFNkWGxgVGWQbgB3oHJ0auRiMF3gXjRihGW8ZPRfXE3ARnxC7DzkOtA2PDukOSA0gCzALIw7cEVkTERFIDN4Hega9CJYM/Q7LDkgNTgw4DLcLpAlnBlcDmQEpAcYArf9F/u38zPtd+7b7ufu1+tn5B/pg+kP6Gfq8+R35LPn9+Yz6svr5+mf7UvsB+k/4svhx+/P9cv79/LT6uPgV9zv2pvct+2D+Pf+J/bL6JPlE+rT9zQF5BNoENgO+AHH/Yf+9/gf+T/+aAbACKgMwBPcE8wQqBVIGcwcCB8UEoQJeAkUDVQThBecG7wWdBKcEegSNA/8DqAVFBpgFeQQSA1cCJwNjBGEEiQKs/9f9af57AGYC1QM5Be0FGgTS/iT4E/MI8fnzof68DtYbUB66FRQJKAHRAVEIUw7UDQ4G7vxv+ev9SQYRC8sIfwFk+Ebwc+vy6iLukfNI+VH8yvoo9hnxj+027V7wd/Q39+n6BAHYBBQEhAJy/4z2p+uC5pvnFusu7THseur96fjpfer+6rfo+OIa3eva8N1L5N7qb/CK85Px7es/6Nfptu6p82L3l/k6+dL1efH67hfuuuyG6pLoEecC5jzms+hQ7T3yffTW8pbvKO6877vyxvS79f33ofyxAToFpQYyBVcBMv86AjwIQg2fDygODwkUBEgC0AIFBAgFaAXtBfAGRAjmCgYPfhLpE88TPBL9DjMMygwmEf0WjhsoHdgb+xjJFfMSexEFEtMTyxXPF3UZRRk5FqUROA4bDSYOtRDuEdYPdA18DjASHRasGG8YKBVlEJAM+Qt2DjwRPBKUEfYP3Q2GC6UJzQmUC/ALAQqtB9wFVQTKA64EvgVCBesCUQCg/z8BhgOZBNQDngGs/g38bvsj/df+sf60/Vz9ev1w/Xv94P0T/lL9oPv++Uj5kfkW+5z9gv+u/1X+KPxN+oX5hfno+ZX6bfuD/K398v3o/IP77fpT+/r7P/yk+xf6V/kl+13+OwHqA5kFLQTkADf/NP8R/xr/z/+qAAgBYgDO/+MAqwJmAy0DSQI0AJT9I/yf/Gz+cwDNAf4BTAFTAF7/Rf/AAGcCNgJuAPT+8f5hAIEC5APlAr//mP0D/tX+1P5I/vX8R/wR/gAA8/xR86rof+Y/8fcCghEtF8kTJAtxA1EAzP9o/ycALQKIAh4Asv3k/bMBxgeoCpsFyvmW7LvkweX67IL11vvX/RT70/W48TjwS/BH8e3zKvlaAE0G/gfhBUwCSf4Z+hb2kPK477Lt6uz17TDwFvKh8n/xFO9n7OXpW+e35cvmRetv8dn1Qvar8wbxffA08+34of4qABb9mfgh9YjzgPT79Qj09O7D6uLoyujt6mzuFvHs8Ufxq/AL8Rfxg/AV8gX3mPxg/0D+tPuJ+0v+6wGnBD4FgwO+ASwCzgPtA88Bsv/p/7EB/gFW/5L7+Pkj/OwA7QVYCV4KwQmoCVALcA1jDnQO/w4zEB8RRBGDEfQSyRQEFU0TRRHzELESnhTDFAUTfBB3DnkN7AxwDPcMEQ+/EVsTYhP4EpkTThUdF/0XORcHFcMSrBFWEmMUaxYZF9EVlhK+DlMMSAzdDZgPLRBbD64NvgvsCV0IDgciBn4FQQUFBvQHWAr3C4kLKgnIBt4FRAYqB0gH5gXoA6UCbgJQAoIBhwDM/xv/Rf+dAAkBJwAuAGMABf4A+nv3ovcM+o79cgCvAe8Ap/4D/YT9f/7n/Rj8fPo1+k370Pw+/jn/dP6N+2v47/Y297v4A/sz/Sn+bP0R/Nf70Pzn/b3+4f7w/br8Tvwj/db+hwC2ASQCigH//+L9jvue+eL4w/m6+0z9wP3l/QH+3f05/uz+4v3i+jD5zvrv/cUAfgLUAWf/XP3W/Nj9qf5l/d/69fjr91L3vffV+V39XwHHA3ICBP4n+V31qPK28MzvyfBD9N75ov+VA6YFIwbvBOsCaQEDAOL8e/cH8v3vIvMF+6YEkAoDCt0Exv319hPxWexf623vMvaV/EQATAAz/cH5rfg3+AP2P/Pz8PHvZvM+/AsG+AvbCu8Cs/nR81nxqvA08P7vA/Gn8hb0L/aL+Jf5wPnN+AP1SPAT7+rxHPWF9ZHzmPIQ9Db2Rvj0+lP9lv2n+yj5Pvck9l/1CfRS8m7xWfE+8RjxxvHR8wn2X/ZW9N3xQ/Gz8lf1/viN/Cn+M/6M/fj6A/ek9Rn4xPvJ/94D3gXEBUIEOgGC/uf8gPvb+nP74vzE/mkAcgEzAhADngS5B5ELow22DD4KigijCE0KAQ2RDyoQJw7FCwQMzA6lEZsTiRQXE2MPfAxJDNMN4A+DEbERPRF4EbkRchEuEX4RMhOmFawWIhYaFjkXcRjWGC8YFBf2FQQUXxG7D6YPJxAqEZ0STxOlEoQR4xDcEJoQWg+YDZIMtgwEDd0L4Ak9CV0KkwxwD5MRARHnDE8HIgR5BZUJ1AwFDToK4wXaAp0CJwMFA+8CvAJuAdr+3/yF/q8EEQxpDjoIWfxw8VLvRfhABOwJ3gZR/276D/zlATIFxgCz93/xA/I5+eoD6QmcBTb7y/Kd8iT6LgD5/rj5UfV09D724vcM+bL7AgDSAg0Bu/qx8/rxf/bP+un6VvkU+XH6cfwV/lv+tftc9qvy5/QW+xP/Wf29943z4/Ql+vT9TP19+SD2nvVm9zP6o/z4/NP6D/go99/3+vbU9AT2LPp5/Fb8e/qQ9cfxdfXm+zT8YfY/72Ds/fEV/J0CUQJz+6rxmOxg7vbxKvTN9OT1TflL+9D4kvXY9On08PPK8vXyUPQh9WP1xfZ++BH5yPlZ/CX/sv7Y+vH1ofF18PTzkvms/Rr+3fqs9sr0MfYp+Sz7/frV+T36+fu5+434GPVR8+7zxPd5/T0BDQGL/qb8NP1Y/2cAS/9j/Rb81vun/GT9/fyx/Df9ZP04/Tn9Ef0e/TX+GAB5AfYAPP4V+wr6oPtY/rwA8AFzAff/KP9x/9//DwArAB4AKgCUAAwBlwEYAooBo/9G/aP78Pv6/dn/6v+H/rz90P5IAfUDPwVJBAoCHwCF/y4AyQA7ACX/jP5L/20CPwchCwkMfQm/BF0A3P27/GD84vxF/tgAoAQWCIsJfAlDCVsIkwYEBbMCu//I/rUAOAX9CmAO6gxUCKwFDQiBC+wKBwkGCegHBgYHB7MIfwhoCQQN4RCnEl0QXArzA1j/mv43BK4MqhDUD6IP2RGJE1gRlQuqBoQFFQYKBmYGFQkuDmITpBYEGKgWbhHhCGL/1vnT+1cEAhAQGYIZhRHwB+sD+gbAC5ULZAZ2Aq0EYAsjELQO3AgrBE0FJgvJDyQPWAmwAWb+cQNPC8AM0gZOAMT+AAMNCcMK1QY3AjgBcgNEBZMDwP/N/lID3wksCy4EB/zd+pv+4gF0BDEFSwLC/vP8Zf2J/2b/P/3B/WkAdgGy/977tfg++vP/+gODAWP5kfJ+8476bQCPAHP9r/uc+8D6WviT9e3zCvXF+An9fv8x/rz5wPXc9Kn26fjH+E/29PUj+RL78/d98YTtV/B/9yT9f/0P+TD0bPM094P7qvvT9oTwg+wq7bTzE/zp/27+fvql97z34PcJ9j7zaPD47vrvcfIo9dD4/P3vAMn9qPf+85LyM/Gy8BLya/V/+Y/7Nfyc/ZH+eP1K+mX1AvFS8G7zdveu+q78ffzm+cH3KfnS/Hv+yfu79rHzJfQA9mz4nvt1/R/9Bv0X/T37ivkH+t/5lvjw+d38y/zF+pP6PfwH/uP9Fvuw+JP4tPjq+KL6Cfzf+8j7Kvwv/Wz/FwEoACj9Kvqw+CP5QfuX/XD+M/6x/tb/UwCAACcBhwGCAJb+gP2Q/Wj9svxd/OD8g/5DAaMDkARvBBIEhAQBBfADZAIjARv/3f1KAKkEzAb1BYAEUgS8BEYECQOCAc4ArwFVA3gFzgZmBn4G8gaoBbEDfwJaAvUD7QaACb8KJgs3CyYLUwpsB5cD+wEEA3YFyQlEDlcN0QXm/jr//QQACjkKiwbvBO0JSxAMDygH8wHzAqYF4QZcBzYJ1gzhDQkKigVXBPkGjwuwDTkLTAcnBW8F3Aa+BXgCtAM4CokOLQ4gDNIIVAXwAzgEcwUlB+cHEwgXCQsKDAo3CRwINAn9CmEJ+QXTAtYARAKjBrQLbw67CyEG5APwBTUGQwEg/Fz8CAICC2wS+RD/Blf+4vyi/0YDqAX4A0IB1AGfAy0GRQlECTwGFgJ8/gz+0v+RARsDfQF6/Jn9lgbMCdUCI/1E/hcBJgEI/Ub3TvbB/PAGPA59CiD8p/Id+FIDKAjRA9z6nvQF9Nn2bfx+BNgJdgfP/rT3T/jQ++365fWu8Qr05PvUAQ0DgwH2/6T/4v0z+fn0j/Nx9Ar4ZPy5/TD8hvlS+Dn7BAArApz+Cvbt7sXuM/TH+/sBiAH9+gf21vVp+KH8FgCW/tf35/Al78Lzf/v2ALcBV/9G+9j2GfQ39Cf3Pfkv96L1FPr6ALID0gCk+nT0KfE78nv4lwArA4L+y/iR9pP3+vmN+n/3g/Rn9pb8EQGx/376vvUt9SL5Z/3V/nP8iPdw9df40f0PAJz+9vq098b25/eW+cD6DPyL/tH/wfyd9qzyUvXe+k79Wf1J/K76zvpz+5b6yPkQ+xf9kPxb+or5WvnU+GT4a/kF/qUChwC7+M7z5vZU/av/B/2L+TT5u/tC/Gz5gfjk+3b+ffyj+Tr7TwF3BrEEZPwa9bb0kPlS/qEA6gGjAt4BSwC5/Sv5ove1/ZYDawGy/QX/lgEzA2oDIf/Q+j78xwC5BTwI5AQR/5H8Pf6XAacCLf+A/EQAEQcrC/UKwAY0Aez+JQAWAE79o/yMAbwHdgnRCKUJSQjTAbL9kgEQBnADCv3L+Rv9cgavDnoN4gVjASYDKAjxCGwC+v0NAYIE+wP9Aq0DewQgBMUCZgJ5BWAKCAsoBfsAhQQ/CV0IRAGq+K/3yv+1CEINYgxDBkkBXwO9BiMEDP/C/ikEsQmDC0UJLwS3AHUAmAB4AaIDiwRFA00CDAUYC54OVws1BG3/3f7OAEUEAAfiBvcEWQLsAcQEsQQaAO79pQPXDnYUlg1MAgn+vwGPBq4EiPzQ+UcATQaCCIQKwQzoDLgHiP1E9gb6PQYhEOoQYgnc/wj9VQFOAxz/KfycAb0M2BJ/DM//e/pl/9YDzALNA2QKng6YCZX//vjw9wD7+P9jA+IFIApgDMoH9//9/JcAFAVhBQgCaAA9AqEB9P39/ZUAgABbAW0F0QZKBRIGigbCAs7+B/6t/MP4JvdA+1gEIw2BDBAFEACl+5f3iPk4/soAjAJHArAAwgNXCGsHjgKq+3n1Evd1/YX8QfYq+YwF8Aw1CUcBKv3r/QX+Yvo/9xL4PPtG/nAAqwFUASz/mPui+Rj9vgFr/+D49vdR/hsEMwGn9pjwyvfhA8sHjQNN/WT4JvmD/tf+zPjN9WD3evrDAL4FCwTx/nz5rfY2+R38Lfq09pr3ev1TBDYHtAMD/O/0hPJn9a/66P0D/X78aP/BACv+ifve+qb6MvkT+M/5avsp+u77XgJVBJv/L/qo9Qr0BvlEAGQCRf/d+pn5hfyC/mf9Hvzp+1b8Wvud98T1PPpPAA0CzQAb/5f8ePjA9W75igDqAcr8nvn+/KsCuQNH/mf4LPi3+aj4A/qm/fH9qv6BAgYEYQH2+yL1avIX90b9if8a/zYAEARGBBP+vvjV98n4zPvD/ij8gffo+Bn/9gONBJUANvwH/Fj93P1u/jf9HPtz+Xn4e/ymAuoBoPx3+yL+yv9cABwAgv09+xP9kQDrAMn9sPvb/h4FjgccBBT/svv++lj5bvRK9sIB7AqbDDIH0P5u/d8CpARw/+n5LPk0+978Tf+dAhADTAIEBToHDgV4BIkE2P1H+MH8twKCAif/Mv5HAkUGuwPT/m0AXQWFBL0BXAIgAdz/eQUqCVsD7v8PBBkFsQCE+0T3a/kDBP0LMAlcAnwADgSCCMEGv/4p/JgBnwXaBFf/X/q1/j0G6AWiARIClwQKAr79XQBSB0YIVQNNAQ8DWwM3ArUAF/0a+vz8dgNRB3sHNQYPBtsGMQPy+6j6yQBgBigGgQA8+pf7mwddEZ4K9fyq+88CyAKr/cv8qwAiB+cK5wUy/gf9MQC9A/cFCwMkAEAFXQmTA6z90v52/9z+CARfCVsHBwO9/y795gDwCRoNcAhmAR762/iqAH0H4gXs/zP+dAR8CsUGgv6X/LUA8wSPBykGtgB3/zUFZAn9BaX9LPozAfkHAARF/QH/0AWZCMUFEwI9AlAFwAW4AOD7Lf/bBTEGtQHx/ZH/rgVLBmQAh/6OAk0GBgeJAyP/tv/mALH/RQKjBQ0Dxf/t/2X+KPuT/IICfwa3BDEBXwFzA/0DoQMaA8YBEf8i+3f5Cf5DBAUEzwCFAqsEWQEq/Iv5a/ui/4AACf7s/TkCsgZGBQz/Lv7sAZv+NvnK+nD8nvvq/agATAETAi4AxP1qAPkBY/91/er7SPtM/d/+Vv6n/lwAZgCi/p79vP0K/qz/fgLvAa79yvsN/Nb4i/VM+fn/xgFu//r9nv4L/1//igCnAF//Qf6f/Ff69PnE/CgB0gKM/gL6wvwjAQ7/ePzI/ST9YP0ZBKQGP/6L+HT9MQO/Av39q/hR+YEAnQNWACz+r/0Z/goArv/g/s8CTgWqAKv8yP1q/6n/Nf43+6/6gf++BA0Dtf1l/bsAqAAd/Sz7zPy+/3IBtgFrAQoAUf1G/KT+KgAK/m78pP7WAU4ChQDC/sL92/17/lD9dftN/S8BIQGu/ij/twBr/yz9AP3f/Sn+XP4c/gf+gP9XAIEA6wAm/ln6C/uH/X3+kP8vACz+XfxP/iEBKgGL/+/9FP03/of/j/3D+gX7Svzf/In+mABrAYIBx/9w/H77Kf3X/ksACwCZ/VP9yf/k/wX+XP6n/8T+e/za+9j9d//6/iT/qwDj/5f9vP7oAML+2Pur/N/9wf0i/ywAwf75/bf+wgChA84CAP8p/jL/cf6s/aj+af9d/87/+f98/3D/Y/+F/74ADAGg/1P/FgAR/3z9iP4qAT8CmQBH/ZT7Jv4RAp8BYf4e/rj/oADwAIv//f7uARwD1/8T/mUAawJWAfj9rfvp/Ej/fAAIACv/fQDrAREBMgAYAM3/af+4/mT+/v9QAtUCQQF+/sX8L/5UACwAf//r/2EALgEFAWn+g/31/8UAk/6o/QUAoALBAhAB+P7//a/+m/8tADEAnf9L/2r/WAF9BFEDQf5V/DP+6v9hAUACeABc/h//8wDlAN3+Ev3y/U4AowCt/3MA8gHiAaIAdv9w/94AjAGu/1j9V/3a/nT+//zn/u8B+gCI/gX/3wBDAUsBNQGJ/gf8nf4eA2cDh/9M/M/9bgKsA24AVf4A/1AAnQEkAU3+1vy2/rQBdAMSAjH/rP/eARoBFf8C/8oAAwJoARoBQwLoAgQCwAAaAFwArwAqAIoAkALzAuEASAAFAtsCpwG2//j+SABGAsMDTQMUAZIAQAEYAOb+RQDNAm4DtwIHA90C0QFdAfX/av5i/xABhAHLAVYCrQLSApECMAK/AccAtAChAQsBu/85AIIBNQJwAiQB//6Q/0MCqgJJAD3+pP6vAUkEPALz/RH+sgGPAhkAH/43/v//MALDAk8Bn/8F/0f/wf/c/3f/g/9zAIYB2gE7AVQAkv+m/lH+XP8v/zP9OP49AZMAX//UAd8CgADu/9cA8f9L/jr90f0BAGUBaAFtAKP+TP7W/wIAFP+b////8f9UAYICxgG7ABMBwQEDAcz/ff/a/yQAe/8Z/0UAQAEhARgAQ/+4AA4CzAAbABAB5QAMAF0A6gAAAdAARQBnAAUBsgBsAP0ArwDp/3gBeQN7Aef9Av5+AIIBzwC4/5P//AAYAigB5/9HAMsAVgBTANEA3gCrAJYA5gDNAND/w//RAMUAs/+e/8cAMQG2/5T+XQCDAnUBYf9F/x0AWAAVANr/iv9e//j/0QDIAFQARQD//7n/uv8I/5v+Hv9+/yQAnwDX/1//BgAtALj/1P8nAB4ArP+r/hr+9/4zAE4A4P9KAKMAEwAEAF8Au//T/tv+jv83AFQAs/8L/4b/hwBXAIP/mf8oAA0Aaf8S/3r/FgD//2v/n//iAJoBaQCi/s3+ZgBxACj/Vv90AIsAQwAmAKT/tv+qAKwAwf9Y/5T/NQBvAJb/Kf8kANEASQCy/4n/zv9cAHUANAA8AGsANgC4/8D/RgBeAAgAAgA2AB4A5f/i/wIA7P/H/0cAnQDN/0P/0v8gAOb/8v/r/6P/zf9DAGIA5/9J/5H/fQDiAJEA7v9x/5P/AQAGAMz/q/9t/2X/BwB7AOr/9P6C/s7+f//G/3f/Yf+X/4L/e/+Z/1H/9f7d/g//kf/N/33/Dv/k/kH/4f/4/3z/Kv8j/03/bv8N/8v+Bv8t/zz/E//4/jr/Ff8H/4j/sP+E/y//sf67/i7/Vv/5/on+1f6z/93/Af9L/oP+bP8cALf/6v66/ur+E/8R/7T+jv46/8f/Tf+e/rj+Y/+X/wj/q/7x/mr/xv+t/wz/uf49/8r/of8n/wP/KP8G/53+uf58/+T/hv81/zD/5/7J/mD/yf91/xv/KP9x/77/k//8/uD+cP/g/7v/Jv+6/gf/yv8sAOP/ov+w/4X/Xv+c/4///v7t/r7/fQBCAGb///6M/0AANgDz/9//cP81/5//pf9F/4j/LQB1AGQABgCM/5H/8/8JAMj/mP+c/7X/1//T/6X/5f9ZAPD/Wf/6/7EA6P8q/wwAoQDa/6X/IAAWAO3/zf+o/+7/JgDq//j/ZQBKAOT/9v/g/4r/AACwAIcAKgAbACQAXgCSAFQA/f8FAA4A5/8WAJkAywCGADwAVQCrAKEAPgAYAB0AKwCqABoBjADe/18ANQFFAQIBqQBsALMA3gCZAHgApQDsAAMB5QD0AAsB1gDSACwBGAG3ANoAGQHkAMYAGQFrAW4BKwEUAXQBoAEcAaUA3QBTAWYBDQHjAD8BawEUAfMALwFLATkBKgEvAUMBaAGCAVcB/QDoAE8BtAGEAfoAvQDrABwBIgEgAToBZQFuATcB3gCOAJsA/AAlAQ8BAwETATwBGwG7ALUA5wDwAOkA1ACXAHEArwADAQoBCAEMAcEAcwCbAPkA8wBkAOj/MgDtACwBxwBpAGoAjQCSAIsAkgCOAGwAaQCRAJYAcwBlAHIAfABrAFQAWgBqAGMAVwBUAF8AjwC7AKMAVQAAAP//WgB1ADkAFQAdAEAAaAB6AGgANwAuAEAAHgAJADYATQAqAAYAAgAtAG4AaQANAMj/uf/D/xAAYwA9AAcAMAA4ANj/kv+r/+L/6/+2/6L/4v8eABoA4f+u/6D/lf+n/6z/dv9+/9D/8f/a/57/Tf82/3L/sP+m/2//Pv85/3j/sv+c/3b/a/9K/zf/bv+e/23/Gf/5/hP/Qf9c/0n/Mf9P/2r/L//x/hf/Wv9J/wT/4/4P/2b/d/8v//3+Ef8+/0X/DP/g/uv+7f73/jb/MP/O/uH+Zv9t/xH/7/7d/tr+FP83/yT/C//r/ub+Dv8X//z+Af8a/zb/Lf/h/r3+6f4o/0P/FP/s/gn/FP8A/wz/IP8T/wf/IP8z/xn/7/7q/hL/Jf/u/r3+7v5G/1//Nv8I//f+Af8p/zL/Df8Y/zT/Fv/6/g3/Nv9D/y7/Kf8e/wv/Jv9G/zr/Jv8a/x3/N/89/yX/Kv8q/wr/I/9m/1r/IP89/4j/b/8n/y3/Wf9z/4D/cv9b/3X/of+c/2r/Ov9a/7f/vf91/23/sf/y//v/rP9K/1j/xv/3/9z/z/+//6j/t//B/8f/AQAyABkA6f/j//v/AADs/+3/EAAhABUAFwAoACQABADz/xMANQAqAC8AVgBHACEARgB0AE0AIQBDAFQALABLAJQAfABSAGMAawBhAFUAOABTAKUApgBoAF8AbQBsAG8AbgB/AJkAeQBgAIMAdQBcAJsAtQBnAD0AdACnAJUAZQBRAGkAkQCVAIgAjgB/AE4ATgB+AIQAbwBrAGIAaQCBAHEAPwA3AGcAdgBMAEoAcwCPAJsAiQBWACcALABsAIUAYQBbAGkAbABiAEcAQgBZAGoAdAB5AHIAawB3AIQAYQBEAG4AkwB/AHAAiwClAIcAQwA7AJEA5gDSAHQASwCBAMEAuACDAHYAmwDCAMgAlQBLAFEAsADpAL4AmgC5AMYAtgC2AKUAngC3ALUArgDIANkAxgCqAKkAyADQAK4AqgDJANQA1ADHAK0AtwDTAOAA1QCsAJUAtgDdAM0ArgDFAOoA0QCbAJIAtADUANYAuQCSAIoAswDMAL4ArAChAKsAuQCkAKcAyQCyAHMAcACbAKsAmwCCAHEAfAChAMMAugCJAE4AKwBBAG4AdgBxAHMAdAB+AHoATQAqAFAAgQBaABkAKQBgAGwATwA9AFEAXQA1ABAAIgBCAEMALwAaAA4AEgAaAC8ARgA8ABgAEAAhAA8A8f8IABcAAAADAA4ACAAXAC8AIgDw/83/2//7/xIAMAArANv/uP/y/woA8//m/97/3f/h/9r/3v/v/+b/3f/+/xEA5v+2/7P/zf/h/9j/y//c/+7/4P+9/6//z//Y/7f/tv/P/9T/v/+j/6H/rv+9/9D/wv+e/6T/wv+7/6T/q/+0/6D/kf+h/77/x/+f/3j/i/+e/4T/gP+q/7X/k/+G/5v/p/+e/4f/Z/9e/4v/sP+f/4//kf+c/6b/ff9M/13/iv+n/6b/g/9o/2z/gP+N/4z/gP9v/2//if+T/3z/Zv9o/23/Xf9O/2X/kf+W/3H/Wf9h/27/bP9g/1X/Wv9n/2v/X/9M/0r/af9+/1r/Lf86/1r/Vf9C/0n/Vv9e/2n/W/8v/yf/TP9X/z7/NP8y/yr/Nf9K/1T/VP89/yr/QP9N/y7/H/84/0f/Pf8u/zL/Uf9c/zv/DP8D/zf/YP9N/y7/Iv8v/0v/Vv9P/zr/Jf8q/z//Tf9b/2f/V/84/zf/UP9d/0//Pv9L/3P/hf97/3H/WP9D/1L/ef+b/5b/b/9q/5L/pP+U/5H/lf+G/37/oP/G/8f/vv+3/6P/nv+4/8//1//U/8b/t/+3/9f/9//s/9T/0P/k/wYACADe/8P/0f/x/xIAIAAIAOv/9P8JAAwACAAJABEAFwAMAAEACQARAA4ADwARAA0ACwAZACgAJAAcACIAHAAIAA8AIgAbABAAEAAPABcAKwAzACwAIgAVAAwAFgAjAB0AEgAcAC8ALwAkACYAMQAkAAEA+/8VACUALwA3ACQAEgArAEAALgAYABEAFwAlACkALQA3ADYALAAhAB8AMwBBAC8AIgAtADgASQBOADwAMgAsADEASABaAFoASgA8AEgAXQBbAEkAPQBBAFcAawBpAGAAZQBsAGMAVgBeAGwAZgBjAHAAgACGAHQAZAB0AJEAlgByAFcAewCrAJ4AcQBpAJAAsQCdAHUAdACMAJcAlQCFAHkAjgCpAKYAiQB5AIgApQC0AKIAhgCKAJIAfgB7AJQAoACgAKQAmQCAAH0AhgCAAH8AoQC4AJAAbQB8AIYAfwCCAIAAcQBuAHgAiACTAH4AZABzAIMAbgBfAGUAagBvAHEAbABtAGEASQBKAGMAcwBjAEgARgBQAFwAZQBcAEwAQgBDAFEAWwBUAEUAPwBGAEgAQQBBAEoAVABRAEEANgA4AEAARQA5ACoALgBCAFkAUQAtACYARgBUAD8AKwAnACUAMABQAGEAUwBDAD4AMwAsADIAMwAxADgASABOAEAAQABMAEcAPAAyAC8APwBHADwA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EwATABIAFgAcAB4AHQAcABsAGgAcACEAIgAfACIAJQAhACMAJQAlACcAKQAoACMAIwArAC0AKgAvADIAKAAmADEANQAuACsALQAtADAAMgAyADcANgAvADAANAAzADMANAA0ADYANgAzADIAMwA2ADkANgAxAC8AMQA2ADYAMgAyADUAOAA6ADcAMAAuADQANgAzADQAOAA3ADEAMAAzADUAMwAwAC8AMwA4ADUALgAsAC0AMgA1ADEALwAwADIAMAAtAC0ALAAqAC4AMQAvAC4ALQAqACoALAAqACYAJgApAC0AKgAoACkAKAAnACUAIwAoACwAJwAlACUAIQAgACQAIwAgACMAJgAlACIAIgAkACQAHwAbAB0AIgAkAB8AGQAbACIAJQAiAB0AGQAaABwAHQAbABgAGwAeABoAFwAcABoAEwAVABsAGAATABIAFQAZABcAEgAVABoAFAAOABEAEgAPAA4ADwARABIAEAAMAAkADAAOAAoACQAJAAcACQALAAsACAACAAMABwAHAAYABgACAP//AQACAAAAAAD///3//f/8//z/AAD+//f/9P/4//v/+f/4//n/+P/1//L/8P/y//f/9v/x/+3/7v/0//f/8f/r/+//9v/0/+z/5v/l/+r/8P/1//P/6//l/+T/6v/t/+r/5v/l/+b/6P/o/+b/5f/m/+j/6P/j/9z/3v/n/+r/5v/h/+D/5P/m/+L/3//f/+X/6P/l/9//3P/c/+P/5//l/+D/2//g/+X/4v/g/9//4P/j/+T/4//h/+H/4f/d/9r/3//l/+X/3//c/+D/5f/m/+L/3P/b/97/4//n/+P/3//i/+P/3//e/+P/4//e/97/5P/j/+H/5P/h/9z/2//e/+D/4P/i/+P/5P/h/93/4//r/+P/2//g/+X/4f/e/+L/5//o/+X/4v/i/+f/6//l/+H/5f/q/+3/7f/k/9//4v/k/+j/6//s/+3/7f/t/+7/7P/p/+j/7P/x/+//5f/j//L//P/z/+3/9v/2/+n/6P/x//L/7//2//n/9P/6////8//s//T/+f/2//H/7f/1/wIA/f/1/wEABwD5//r/AQD4//P/8v/2//3/BQAPAAYA9v8AAAEA9f/8/wIA9//1/woAGwAPAPj/+f8BAPD/8f8EAAAAAQAPABIAFgAMAPD/7P/7//f//P8dACQA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';\n\nconst PCM_DATA3 =\n  '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sv+6/6n/lP+U/6T/rv+p/53/nf+h/53/mP+j/7L/ov+P/5v/of+a/57/m/+S/5X/o/+r/53/jf+R/5f/kf+S/5X/k/+a/53/mP+Z/5r/lf+U/43/hf+O/6D/pv+f/57/nf+P/4b/jP+Q/5T/of+n/5f/iP+R/5//n/+V/43/lf+e/5X/lf+p/6r/lP+M/5D/j/+T/5z/mP+R/53/sP+r/5v/j/+E/4j/mP+f/6P/o/+h/6j/qf+X/4r/kf+h/6n/pP+d/6L/q/+r/6j/p/+g/5b/m/+y/77/tf+o/6H/ov+n/6r/r/+z/7L/tf+6/7r/sP+l/6r/rv+s/7f/xf+9/7b/v//B/7f/sv+w/7H/uv/O/9f/vv+s/73/yP+//8D/w/+8/77/wv/F/83/yP/C/9H/2f/O/8H/u//A/83/0f/S/9r/1f/K/8v/0v/X/8r/v//T/+P/1//L/9L/5f/h/9D/1//Z/8n/0f/o/+r/4v/m/+T/1v/R/93/8P/3/+H/zv/j//n/6//b/+P/8P/y//L/9f/1//X/8v/o/+P/9v8GAP3/+P/+/wcADwD9/+n/8/8EAA0ADgADAP//CgAQAA0ADgANAAYADAAbABkACwALABUAGwATAAgAEAAmACgAGQAVABsAJQAmABoAGQAiACYAKwAtACgAIgAkAC8AMQAoACkALQAuADEANwA0ADEAOwBBADMALwBBAEIAMgA4AEQAPAA5AD8AQQBIAEsASgBOAEkAPgBAAEsATwBPAE0AUwBfAFwATQBJAE0AVgBaAFMAVABeAF8AWwBfAGcAYgBWAFcAYgBpAGwAbABoAGMAZQBqAGgAZgBmAGsAeAB3AGwAbgBpAGMAbwB2AHgAdQBwAHwAhwB5AGgAcQCAAHYAagB8AIwAhQB/AIIAewBzAHUAeAB5AH8AhgCEAHwAfgCFAIEAeABxAHgAiwCOAHkAbgB0AH0AiACPAIIAcQBzAHoAeAB5AIAAggB+AHkAdQBxAG0AbQB3AH4AcwBsAHUAewByAGoAcgB0AGYAaAB1AG8AaQBsAGYAYABoAG0AawBqAGQAXABcAGIAYwBfAGEAZABcAFYAWwBiAF0ATwBPAFkAVQBTAFoAVABJAFEAVgBMAEsASwBJAEgARQBIAEwASABDAEAAPABCAEkAPQA4AEIAPgA6ADwAOAA2ADEAMQA8AD0AOAAzACwALAAxADAAKQAlACcALQAvACgAJQAoACwAJwAcABoAIwAlACAAHgAhACMAGwAUABcAHgAeABYADwAVAB4AGgAOAAsAFgAdABMABwAGAA0AEAAOAAgABAAJAA4ACwABAPz/AAADAAgACAAAAP7//P/0//b/+//6//3/AAD6/+z/5//w//H/7f/4//r/6f/k//P/8P/h/+H/5P/h/+H/5f/p/+z/4v/W/9r/4P/Y/9X/2v/b/97/3P/V/9f/1//P/8//1P/V/9D/zP/M/8//z//P/9D/zf/K/8j/xv/J/83/yP/D/8n/zP/D/7z/wP/E/8P/wv/E/8H/vf++/7z/u/+8/7n/vf/B/7r/uv/A/8D/uv+1/7T/sP+v/7z/wv+7/7j/uv+1/7H/s/+v/6j/rP+6/7//tf+x/7b/sv+s/6v/qf+t/7T/tP+3/7f/pv+h/67/r/+q/63/sf+1/7D/p/+s/7P/rP+m/6r/rv+t/6v/rv+z/7L/r/+s/6f/q/+w/6//r/+x/7D/rv+r/63/tP+4/7D/pP+r/7v/s/+q/6//sv+z/7P/tP+4/7r/tP+x/7T/s/+y/7X/uv+6/7n/vP+9/7j/t/+5/7f/uf++/7z/u//F/8r/v/+z/7j/wf+//7//y//I/8H/xf/E/8H/w//E/8X/yf/I/8b/y//N/8j/xP/F/8r/0P/N/8n/z//T/9D/z//N/8b/xP/J/9X/3v/a/9L/zf/Q/9L/zf/O/9X/2f/b/9n/1P/S/9X/2v/c/9j/1v/Z/9v/3P/a/9n/2v/a/97/5//l/93/3f/e/9z/4P/k/+H/4P/m/+j/4v/i/+j/5//n/+j/5//n/+r/6//r/+v/7P/v/+r/5//x//X/6//r//P/8v/y//b/9f/z//X/8//0//f/9v/2//X/9v/8//z/+f/8//z/9v/4//7///////3//f8BAAIA/v/9/wIAAwD+/wEABwADAAEABQAFAAMABgAKAAUAAQAGAAkABwAJAAoADAANAAQABAAPABIADgANAA0ACwALAA4ADgAMABAAGQAXABAADQAMABAAFQASABMAFgAUABUAGAAWABQAEwAUABcAGQAYABoAHQAZABQAFAAZAB4AHQAaABkAGQAbABsAGgAbABsAGgAZABwAHwAfABwAGAAZAB8AHwAWABUAHQAfAB0AHQAdABsAGgAaABoAGgAcAB4AGwAYABsAHAAbABsAGgAbABwAGAAWAB0AHAAXABwAHgAaABgAHAAbABUAGAAgAB4AGwAeABwAGQAcABwAHAAhACEAHgAeAB8AIQAhAB4AIAAjAB4AHwAmACEAGwAiACYAIwAeAB0AIQAkACQAJAAlACQAIAAfACYAJwAhAB4AHwAiACMAIgAgAB4AHwAgAB0AGwAdAB0AHQAeAB4AHAAbABwAHAAZABcAGgAZABYAGQAaABcAFwAWABYAFwAUABEAFQAXABQAFAAYABIACwAPABMAEgAQAA0ADQAOAA8ADwANAA4AEQANAAwADAAJAAsADAAJAAoACQAIAAgABgAGAAwACgACAAMACwAJAAUACgAMAAcABQAGAAYABgADAAIABwAJAAYABQAFAAQABAAFAAQAAgAEAAgACAADAAMABwAEAAIABAADAAMACAAJAAUAAgACAAMAAwAEAAYABQADAAIAAgAEAAYAAwADAAUAAgACAAcABgD/////AwACAP////8BAAMAAwAAAP//AgADAP////8AAP7///8AAP3//v8AAAAAAAD9//j//P8BAP7/+//7//v/+//8//z/+//5//v//P/7//r/9v/2//r/+f/5//3/+//2//f/+f/3//X/+P/5//T/9v/4//f/9v/2//X/9f/1//b/8//x//b/+v/2//P/9f/0//H/8v/0//H/8v/z//H/8v/y//D/8//0//D/7//x//D/8f/x//D/8v/y//H/8P/u/+7/7v/u/+//8//y/+3/7f/w/+3/6//x//P/7P/r//D/8P/u//H/8v/t/+3/7v/u//L/8f/t//D/8f/s/+7/9f/z/+7/7v/x//T/8//t/+7/8v/x/+//7//y//P/8v/z//L/8f/y//L/7//x//T/8//y//T/9P/w/+7/8v/z//T/9v/1//H/8f/x//H/8v/y//P/9f/1//P/8//0//P/8//z//P/9P/0//T/9v/2//X/9v/0//L/8//1//T/9P/2//X/9P/4//j/8//0//r/+f/x//P/+f/2//f/+f/1//T/9v/3//j/+f/4//n/9//2//r/+f/1//r//P/2//f/+//5//n/+P/2//z//f/3//j//f/7//j/+v/8//3/+//5//v////9//n/+v/8//3//f/9//v/+v/9//7/+//6//3//v/+//3//f/+//3/+//9/////v/9//3////9//z////+//z////9//n/+////wEA///+//3//P/9//7////+/wAA///8//7//v/+/wAA/v/9/wAAAQD+//z///8BAAAA/f/9/wAAAwD///3//////wAAAgABAAAAAQACAAIA//8BAAMA///9/wMABAD//wAABAABAAAABAAEAAIAAgACAAIAAwADAAIABAAFAAMAAQAAAAEABAADAAEABAAGAAQAAwABAAEABgAEAAEABQAEAAMABwAJAAYAAgABAAQACQAHAAUABQAGAAYABgAFAAUABQAHAAoACQAJAAoACgAIAAgACQAIAAcABwALAA8ADAAFAAcADQAMAAgACAAJAAgACgAMAAwADAAMAAoACQAJAAoADQANAAwACgAKAAoADAALAAsACwALAAwADQAJAAgACQAKAAwADQAMAAwADAALAAoACwAKAAoADwAPAAoACgAMAAoACgAKAAwADAAMAA4ADAAJAA4AEQAKAAgADwAOAAgACQALAAoACwAMAAkADAAOAAwACwAKAAYACQANAAwADAANAAoACQAJAAoADQALAAkACQAIAAkACwALAAkACQAKAAoACgAKAAsACgAJAAgACQAMAA0ACgAGAAcACgAKAAkACAAIAAoACgAHAAYABwAIAAkACAAHAAoACgAFAAUACAAFAAIABQAIAAgABgAGAAYABgAFAAIAAAABAAQABgAHAAYAAwD///7/AQADAAQAAwACAAIAAgAAAP////////3/AAADAAAA//8BAAAA/v/+/wAAAAD+//3////////////+///////+//7///////3//f8AAAEA/f/8/wEAAgD7//3/AwD///z//////////f/8/wIABAD+//v//v/+//7//////wEAAAD+//3//P/9//7//v/+/wAA///8//z//v/+//3//f///wIAAQD+//7/AQAAAP7//v/+//v/+/8AAP///P/9//3/+//7//3//f/9//7////8//r//P/8//n/+f/6//v//P/7//v/AAD+//j/+v/+//v/+//9//r//P8AAAAA/v/7//z//v/+//3/+v/7/wEA///6//r/+//8////////////AAD///r/+v///////v8BAAMA///+/wIA/v/3//v//v/8//n/+P/8/wAA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';\n\nconst PCM_DATA4 =\n  'OA2YDA8MiAveCvsJ6AjqB0AHxwYqBh4FzAPHAj0CyQExAbUAfgBEAMz/H/96/k3+yf5y/4j/qf4b/X37C/qf+Fn3ufbg9kT3E/f39XD0lvNH9Cb2xfc2+H/3HfbZ9FP0XvRw9DP0jPOQ8o7x0/DD8JzxDfNm9DD1VvUm9ej0nfRT9FP0f/RZ9MvzUPM+82/zovPu84j0TPXf9Vb25PZi99X3pPie+Tf6jfrb+qf64PlD+R/5M/ml+Zz65/tV/Z/+p/+sAIsBwgFoAQMByQCcAE8AFgCBAGkBGwK3AsQD+ATsBbQGXgfsB3II6whcCZAJHAkrCHIHJQcTBy8Hage3B0MIFwnoCXIK8QqkC2YM/wxCDfcMOgxbC6UKSgo9Ch0KyQmJCaAJAQp5CsoK9woxC5ML2wusC/4KQArbCcwJvwl4Cf4IlwhbCDAI9QewB6EHBQiQCLwIgQhFCB8I1wdVB6cG6gVEBcIEjQTHBCQFSwVQBU8FPgUpBREFiQSFA8cCcgLcAVABkAEiAlgCiQLbAh8DbQOTA1QD5gJHAjAB2P/Q/pL+2v65/oL+I//Z//n/bwB/ATUCLQLNAXUBMwG8AB0Axf9I/wX+zvyS/Kr8X/wm/G38HP0G/tr+lP9zAAoB7gBqAJ//xf5Q/g/+af1q/JP7x/qt+ev4Tfn3+fT5N/rq+t364Pq+/LT/twH2AcMA7f4M/RX7YPkd+Gb2j/Sx9Mj2bPgO+Sj63Psl/ZT9CP2++/b6zfv9/Z3/0P3v96rxz+5o78PxpvTJ9yf83AJuCyITRBZiExsNZwbu/mT1/OoI42ng/eNx7Ej2P/4rBAAKjBBoFRgV0A82CdMD1f9u/EL44vKm7hHusu/28Eryn/S59zH7cP5cAbEEQgi9CocLegpbB+YBJPoJ8izsGehU5NrhNeJ35V7rTPPp+94D1AnVDJ4MkAjlAIT4PPKe7UzpXOWO4sPh3eNr6K7tG/Id9QX3vPh9+oj7tfuw+437A/u5+ST3SvN37/Ls1Otv607rsOsr7fPv0PNT+N/8sgBDA48ErwR/AzEBOf71+vf3yvUy9OLyn/J69CP4YPyGAIcESQhIC78MSQwxCjYHjARfA6UDQASTBOkEnAW4BiIIZwkOCmMKIgstDB8NHQ5jD+kQkRLDE6AT1RH1DjoM3QoEC+oL/gw4DosP2hANEgoTrhMFFPwTahNQEuEQTQ/6DUoNQg2RDfYNTg5+DmIOCg6mDVANBQ3gDOMMrQz2Cy0LygqZCjUKkwmTCDMHvgV1BHQD0AKFAqgCTwMZBFwE0AOnAmgBbAB3/1X+N/1E/Ir7H/vJ+j76lfn4+IT4P/jV9xr3YvYS9jf2ffZs9vP1P/VE9ADzy/G58MrvaO/i78bwiPH38SnyTPKB8qvyovJG8qTxGPH58BXxGfH78NrwzvDl8AjxHPEr8XnxLfIE85/zA/Rz9CP1//W+9jT3g/e398v32Pfh97j3efdd93L32veu+Lz51/oH/Fb9ov7B/44A9wAUAQkB4wCkAFEAGwAyAFcAXwCSABsBywGXApoD1gQgBjAH5Qd7CBgJlAm7CWcJmwjGB1wHQgcaB/sGKge0B3IIRgkJCskKtgu+DHUNoQ1+DWENVA0hDXMMUQsvCo8JnAn5CUMKpQo0C8wLdQwWDTkN9QzdDBoNPg3VDN4L+wqtCr0KqQo5CoMJ9AjmCDUJZQk9CeoI7gh7CQMK3QlJCQ0JWAmfCVMJXAhVB+gGAQf5BnsG2QWZBc4FAwbcBYAFMQUZBUUFlAXBBcMFtAW8BQIGYAZVBq0FxgQeBMsDegO9ApsBsQCVABIBnAH9ATQCYwIIAzcEFgUlBeQE1ATHBEkEAwP3ANz+5f1k/pr+aP3D/MX9v/6b/6gB4AP8BL0FNAbDBdAEigP5AZ0AT/+l/Sn8e/uX+/n75/sz/Cf+TQD+AIABtgIkA1QCpAGwAZUBUwBq/kb9qfyl+yz7GPzz/On8Vv0C/jf9zfuM+9n76PtW/Br9Y/34/I38Z/2D/9UAeABo/4P9gvqS+D/5DPrt+Pr3evju+J35qfsU/Wf8m/v8+zP93v7n/7r/h/6E+6/2VPJY8OPwiPOh9yT9zgNaCa0MYw9rET8QIQtSA4v5xu7C5RXiQOXS7AT1GfwLAv4GKQulDo8QzQ9yDFMHgwEI/D33jvOF8arwcvDn8LDxd/Lj88L2tfql/jACsAWVCKkJHwkoB+kC0vxO9sPvzOnA5cjjeOMh5fbo8u6u9pL+xgRQCNIIgwa9ARD7wPTs8CTulOpq5wrmKebZ5zLrKu+n8vn0KPYz92j4HfmU+YX6U/sN+y/50/VJ8vfv5u6l7rnuY+667QruEPB486v3O/yvADIE2AVWBRYD8v+3/ND5Xveb9cH07vQ/9sX4MPz3/50DhQYjCGAIpwexBhUG1wXMBRQGrAZRB9MH/QfZB7sH0AcsCOkIuglgCjoLiAz/DXgP1BDNETUS9BHQELUOGgwXClYJigmGCqIMTg+LEUATgRSpFH8TihFYDy8NSAv0CacJQwofCwgMRQ2HDioP7g7wDXwMCwvKCacIyQd2B5UH1wfvB5UHrAZmBRwEHAN7AhgCyAGTAZUBuQG5AWYBtgDG/8b+tf1d/K766fiR9xX3Xvfw90z4VvhK+Fz4Z/gi+GX3Y/Z+9db0IPQs8wjy7/A38A3wOfB18Krw4PAU8UTxYfFn8WXxdPGf8dDxtfE48ZvwGvDW7/bvOfA48OXvn++67zTw1PCM8WHyTfMz9Aj1pfXd9dv1CfZR9jb2qvUs9Rb1gfVg9mH3LfjS+Kn52fr/+3T8NPwK/IT8hf21/rX/KABPAN8AyQFHAicCwAFFAfoAIgGTARoC7AImBKQFEwcDCFgIbgiBCJIInQiQCGkIUgg+CDMIhQgbCXEJkwnZCSgKOQobCgcKRQrKCkILgAucC6gL1gs4DGkMHwy1C3ALIAukCiwKwwlyCXYJywkYCmMK5wqKC/YLAQydC+wKRwoYCkIKDgpZCQYJMQkxCSYJXQlOCeEIkwhqCE0IUQhaCIoI6QgHCc0ImAhuCEAI7wcyB2MGGgYkBisGLwYwBicGTQbeBqYHBQibB8MGKwYZBlkGgwZZBvkFzQUcBoIGgAZMBi4GJAYeBuYFXgX2BCkF6gW/BiYH8waiBqgG1Qa+BmMGDwbrBcQFZgUnBZ4FgAbtBsMGaAbiBS0FjgRJBHoE+gR0BbAFhwXyBGYEYwSFBHoEzAQhBW0EhwPUA4sEswS1BEwEMwOSAswC1QJrAiwCFwLhAe8B9QLBA+wBLf8g/1cASQCBALcBxAF5AI7/uP+bAPEAXQDB/0r+W/uo+d76l/w1/e39ov4O/vv8yPxd/UP+BP/Q/kn9kvoz97X0PfRG9X330PpI/fD8KPu++hT8rP2m/oT+sPyK+Vj2APRf8wX1uPfY+c76aPp3+Tr5b/l5+en5+frJ+1b7qPhF9LDwQfBM9CH8vQMkB0IHkgfVCPII6AXY/xP5A/TW8HrtBek45hXpTfIi/nQHoguGC+kJuAhsBw0FyAH//Tz6gfZZ8pLuzOxU7V7vTfK29SL5SPto++X76P4DA0YG2gd8BlECSv209wvx7+pg55jmZedU6F7pHeyG8a34Uf89A6YEKAX0A2X/k/jY8XXsXunY6KrpXuqa6nbrJO668U308fWb9/H4uvlb+i/6o/gK97b2Lfcz9xb26PN+8bvv7+5P7/TwX/Mw9lj5QPwl/kb/VwCNAYECYAKZALH9u/qH+Gn3Tvf09zD5DfuQ/XgAZgMLBgAIBwlFCc0IogckBucEVAR9BB8FEgZkB8sI2gl2CpoKLgqOCV8J9gkaC1sMYw0FDlsOyg4yD+kO3g3dDCQMewsjC3oLVAx5DawOag9XD54OpA3YDEAMmAvlCnIKLQoQCl0KHgsoDFkNQg5gDqENQQxjCjcIGQZkBDcDfAIrAkgCxwKcA5oEZwW9BbkFjQXrBJEDBQLlABYAXv+h/pH9J/y7+mH5FPgK9332n/Zs94n4ivki+kz6cvq2+nn6d/n+9zb2SPSl8l/xT/B97/Tuwu4J75vvQvAO8SDyf/P99Bz2lvZz9pb1HfSb8iPxde/q7RztAu1c7Q7uF++L8HLyivRw9sP3avio+L74iPju9wT37fXv9GT0a/Tc9Gf1+vXE9t33H/l9+vz7iv3+/iYA6QBaAXQBQgERAdEA//+9/rj9T/3A/Sv/JwEkA/8EsAYQCPgIWAlBCfEIggj5B3UHGQcIB2IH6wdiCOsIlgkYCloKjwrsCm4L4gsmDH8MFA2jDdcNgw28DPULhgtdC0sLUgtuC4sLkQuUC8YLQwzrDF8NPw2vDC4MAQz2C8ELOwuDCuIJlwmVCZMJdQmACcIJ+wkHCuIJfgkUCfgIEQnqCF0IuweCB8MHEwgICJgH/AaWBp0G1AbCBksGswVOBVAFmwXZBQQGagYKB24HSQfIBlQGIgYSBuEFZAWqBC4EZwTyBBsFAAUGBRwFJgU8BVoFdwWcBeYFfQYbBzwHHAcwBxUHWQaABf0EjgQ4BEsEagRQBJcEYwX8BV4GCQe1BwAIBwjmB7oHjgcaBz0GUAW+BMkE6gSCBFcE7QRDBWQFOQYWByUHFAcPB8MGmwaYBj0GjwXRBB0EYgOoAlwCYQK+AQoBvgHxAisDIwN9A3AD4QKiAu0CJAOBAjEBOwCP/33+wP32/eL9Af23/D79dP1//TH+Uv99AKwBSQJIATn+Ufod+Kr4FfqK+ij6TPlf+Mn4Dvsc/WH9Ov3H/RT+lP1y/FL6IPjb9z35qfpK+1/6S/jQ9rz2lvex+H75HvrR+r76rflh+Mr2+/Vh+Mv8q/59/Mb4S/Yd9lH3evhV+cv5hPmu+Kj3mPYF9mn2qPeB+Qn73/oQ+R/3O/Z89u32FPYZ9IPzLfa8+nX++/9XAJIBIQQqBhwF7/9y+F/xMezN6bTq4u0u8kz3I/ya/+UBJQOaA+4DJwRsA8MAPfyt96b0EfPx8in01PQU9J3zLPTi9Df2C/mf/LD/rQGnAuMCxgG1/tT6ovcQ9aXyIfBN7frqYeqf627uuPLY96j8HwBgAV0A9f0f+1X4mfXT8jPw6+0p7E7rvutZ7ajvMPKI9Ez2G/fV9gv20PXI9lX4Lfmd+Bn3hPU49Pny4fFx8e3xBvMO9Hv0kfQ79SH39fmt/Hv+Vv9C/zD+ovxV+5T6V/p++uL6RPun+5D8Mv78/7kBygOZBRoGawVLBDMDrwI6A5kEPgbzB78JjwvaDPoMMwyTC34Llgt7C/wKXgpjCmEL+gy4DkUQTBHREd4RURFLEGwPVg8yEHMRLRLaEdMQ1Q9bDywPvw7dDfgMsgxADSkO4g5QD8YPdxAsEUcRXhCmDsQMOQsFCssIcgdeBgUGSwaeBp8GgQahBg4HdAd3BwYHSwZZBTQE2wJbAeb/r/6p/b/8CPyW+1P7GvvX+qv6yvoN+w/7svom+on53/gj+F33pPYV9qn1OfWD9IDzkfIe8hLyD/L88QnyOfJ58snyIfNe84TznPOR8yDzKvIG8WbwmfB38Z7yofMY9Af07vMK9Bf0HvQ+9Df02PNh8zHzqvPq9J/2R/h/+QT6D/oy+pX62vrY+rr6pPqi+sz6PfsK/Bn9If7//tD/mwA5AasBHAKZAgIDSQORAwkErgRqBSkGogaQBkQGRgalBjkHCwjpCIcJDgrQCsQLvgx+Dc8Ntw1LDYcMqwspCzcLuQtjDPAMgg03DuAOSw95D2oPLA/WDoYOWw5LDh4OzQ19DVcNVQ1gDXcNkg1aDbAMDAzYC+wLIAxwDJsMZQzyC2gLzwo/CssJZAn5CF4IlQcDB+wGHwd7B94H+gfKB5sHVweiBoYFZASDA/oCpgJgAi8CIgIgAj8ClgLEApAChAK4AkwCIQEqAKf/VP+J/z4AigAwAM3/vP8VAKAA3gDWAN8A4wDOAMUAswCSAJ4A1QApAXgBWQHiAM4ASwHiAWQCwQLkAgkDYQPMAyoEXAQzBLwDZQOUAwEE8QOnA+0DiAQABYgFIAaPBvQGVAdnBx0HeAbABX0FqwW/BZwFawU0BTUFzAWiBg0HHwdFB3sHngdxB7YGygVcBVoFUgUFBUgEYgP0Ai0DlAOJAzYDYgMbBI8ESASqAzQD8gLjAscC4AH8/zL+rv1d/gz/Gf9r/6UAswGrARABw/95/Xb8I/6A/3f+B/1x/PT72/uV/F798P19/nz+mv0Z/ET6RvlG+l78rf0z/Xf79/nu+Kr3fPcB+nX9/f6//Xz6kPf89pP4HPuU/FP7VPjx9Vn1OPaI9434uvk3+/77ivsl+hT46/Wc9IX0m/Sx8xTyNfHr8eTzqfYL+q78sPz0+gP6C/l99j/0RPPR8ZfwlvHM8+T0LfSI8hzyBvSs9jL40PdL9RLyCvEY8+/1Gfh++qP96QBrA2YD6P8H+1n39vSu8kjvZuoO5n/lI+o28jT6EQDWA9gFRQaCBawDrABv/S37+fgw9Xzw1Oxl6xrs5+0Y8MnyifWP9035xPtE/xoDqwUmBgEF/QHa/Nf2Z/EU7Tvq6OiX6DLpTOsy7070a/m7/VgBNQRdBe0D/P+i+pD1LvJ18H/vsu4u7qHuh/A083H1yfax98n4MPo++0T7bfqm+cH5ofpS+0X7nPqb+aD47PdX9/z2aPe8+G766Pve/Iv9Xv5s/2oA4ACVAMr/+v6M/s3+3/+EAVkDIQWMBiIHxwbzBSsFlgToA80CawFrAJYAkwIvBg4K2QxhDkEPJBATEWIRbRB9DmsMvQp1CW4IowdvB0UIDArzCz0N2w1YDjMPbxCIERcSMhIfEukRiRHdEKYP3A30C1MKIQlXCOIHwwcMCLsI9QnDC8INRA/oD60PnQ7jDAkLiQllCFoHMgbrBNUDNQP/AhoDbAO+AwgESQROBP4DkAM7AxED+QKuAvUB1gCX/3f+bf1r/IT7tvoJ+qj5qPns+Vr6w/r7+hf7OvtT+//6APrd+Cr40Pef95j3lveT96n3qPc092H2r/WI9dn1KPYd9vL1Gvax9nz3T/j7+Gv5t/na+cb5j/kh+X/47/es96P3pffB90b4TPmO+qz7hPwv/dz9g/7w/g3/9P7h/gv/X/+v/+j/DQAtAGQAxgA0AXsBqQEXAv4COgRjBS0GrAYfB3kHjAdWB/EGnAagBuwGPwd1B6cHCgjJCM0JvwoyCw8LqQppCngKyAocC0kLVQtWC0gLHgvmCtwKEQtcC4kLggtOCwsL2QrSCusK8wrGCngKKgr+CfYJ2wmHCRwJ0gjMCOkI3QiICB8I1QezB6EHigdPB9kGVgYbBvcFoQV1BckFNgZeBj0GnAV0BHoDEgO9AhoCcgEtAYIBNQKqAroC4QJXA84DywMSA/8BFQFtABEA6f+V/xf/AP+B/x4AVgAuACMAewDwAD4BUgEjAdwAzQDoAM4AfAA9AAkAtf+J/87/KwBaAIkA7gCoAYYCCQMpAzcDTQNwA58DdwPPAkUCUwK7AiADcAOQA34DtQN8BGYF/QUlBv8F6wURBi4GFgbyBfYFJgYvBs4FWQVTBc0FnQZMBzUHjQZYBsoGQAdjBzkH5wazBsEG7gbjBp0GRwbkBagF2AXYBQMFMASEBG4FugVcBd8EfQSDBPcELAWWBI0D5AIbA7YDpAOLAigBigACAY4BNQF/AFQAiwC+AJsAyf8j/73/5gBGAZIAVf9A/v39o/7f/lv9WftK+3j8zfzK/O78F/wO++f72/1p/sf8S/pK+Uj6dfv++1z8C/y3+rL5a/lW+Lz22vaE+ML5N/oE+tb4p/eR9/n3rfip+Yz5pPdj9ZL0XPWr9hD47PiA9xv0N/L48s7zOPQT9jT4Jvik9nT14vTZ9Cb1lvXw9Ur1KfMg8aLwQfHz8SfyRvIb8xb0cvTg9P31E/eu9+H3dfdZ9v703vMH8y3ymfH08RzzVvRd9T72u/aq9l32Jvbv9Zj1XvV09cj1b/YJ+OH6Lf6SAGcB5gBN/7v80fn29tPz5vDO7+Xw6/JT9Xj45/vh/kYB4gJIA3sC8wCY/7/+cf08+175iPj595r31/e29632Xfan9035y/q7/O7+2gBOAtQCXAIxAUz/+PzI+nj4zPWZ86zyDPOB9Ib2ifhv+kf8xP2Q/qr+If74/G/75fmq+Or3tvfk9y74VvhY+HP4xfj++NL4YvgI+O339/ce+HD41fhN+c/5GvoW+vD54fn8+SH6Uvqy+kP74/t3/M78p/wI/Ef7svpH+sX5KfnQ+BL5Jfob/Lz+jAH2A6AFewZpBkwFrAN0AsIB7QDI/9X+ff4C/5AAxwLkBKQGIghRCS8K+grYC6AMGw0qDbEMvwu4CuMJGwlwCEsIvAhcCQoK7QokDKkNSg+aEFgRkxFyEQcRaBCgD70O0g0SDacMhwyRDN0Mag3zDUoOmA7tDiIPCQ+qDhsOZA2FDLgLLAvcCr8K3woaCzELDQvRCoEKHgq9CV0JwgjfB+cGEQaFBTUF3wRzBPwDcgPyArYCrAKrAsoCAAP5ArECYwLoAQIB4v+1/m79TPyN+xz76foE+2f79fty/LP82vwC/fX8ivz1+1z7nvrI+Sj5y/h5+C/4+PfF98X3UPg++RX6rPoa+1b7TPsR+7b6Mfq0+Yn5jPl0+YH58fmI+hL7pPs0/LL8J/2Y/f39Tv58/o3+kP6F/mT+M/4P/i3+k/4K/5b/ZgBnAWECSQMHBGgEcARZBDkECATNA5UDdgOGA8gDNASyBD8F5gWgBlQH5wdDCHgInwjBCM0IpAg4CMEHfgd8B5AHqAfAB+YHUAgcCdoJCwrOCZ4JkQl+CUsJ4whICMAHeQdmB2sHdgeMB7kH4AfnB8QHigdUBzsHPQckB8gGXQYQBr4FRQXHBGMEIwQCBPUD8QPvA90D0APvAykELwTpA3cDywLlATMB4gCoAHcAggC6APQAIgEhAeoAtgCwAMAAtABwAAAAiv9S/4b/5/8QAAQA+P/d/6X/f/+D/6j/7/8/AHAAdgBLABcAJwBpAIIAfQCaALYAvgD3AEYBQQEjAWMBvgHeAfcBCQLpAc8B7AETAiICFwL+ARECUAJ2An0CggKlAg8DjgOuA2ADAgPPAqUCiQKeAsECzQLMArMCdwJVAoYC8QJOA1sDHQPcAsICnAI0ArYBhAGlAccBrgFVAeYA4QB3AQwCHQK3ARkBpQCmAPcAAQF8ABIAFwD+/7z/rv+1/7f/+v9pAIcAOwDQ/2v/C//K/sb+8P4T/x//KP8f/wL/+P7y/s/+xP7i/rL+Dv6G/bP9e/4l/zL/+P4O/0v/F/91/v/98v3u/er9Fv7+/XP9O/2f/ev9ov0V/dj87fz1/PX8O/2Y/Xr9Mv1k/WH9kPwr/Mn83fzU+yX7UPuO+837Jvzz+xL7OPrE+Yz5bPlL+Vr59vnY+kn7B/t/+oL6CPsw+6v6q/lD+Pn2k/bq9hb37PYQ99H3yfiB+br5jflh+ZT50vlt+VP4Pfe09qj2x/bD9qH2zfYw9y/34fbU9u32Bfdh97z3k/eY94X4R/ms+OT3Kfg9+Gr3Cfcv99T2nfZU9xH4S/hf+Gj4f/ib+Hj4PPgT+OL3p/ea9wH49fgc+vz6qPtl/OL86fzY/Mj8Nfwa+xn6bvnX+ET4Efii+KH5fvo9++/7dvzj/C/9Tv1H/TL9I/33/Jf8O/wO/Pj7tfss+6f6Y/o0+iT6gPoj+7T7S/zg/Cf9Mf0+/Q/9WPxx+836bfpK+l/6nvoK+4b72PsR/Dj8E/yt+1r7B/uC+gL61fni+f/5Rvq3+gr7MftZ+3z7jvur+8j7zvvl+wz8BfzG+477gftL+836dvpd+j76YPoB+6P7Dfyv/JX9V/7A/t/+xv56/hD+m/0d/cr82vwU/UD9mP0j/nv+tv42/7z/5/8IAHAA5wA6AX4BzQEtAoQCngJ4AkECJwI6Ak4CVwKNAgADkgM8BO0EfQXgBS0GcwahBpoGeQZwBnUGfwa7BiMHeQeyBwQIVghsCGgIfAiJCIwIpAjMCPgIMglnCYUJlgmcCZkJowmuCawJugn0CScKNgpGCk8KLAoJCgQK5wmlCXYJWQlACToJPwlBCVUJbgl+CYUJeAlHCSAJIQkRCcQIiAh9CGcIPggoCPcHoAdpB0oHBge+BqUGrAasBrUG0AbNBpkGfwaDBkcG1gWDBTcF4wSyBKMEjAReBB8E9QP9A/0D1AO3A6oDfwNYA1gDOQPjAqwClAJOAvsB2AGtAWQBPgE3ASIBCgH7APMA9QD1AO8A7gDlAMgAoQB2AEUAFgDn/6//iP+J/5T/mP+w/93/+v////3/+//x/9b/qf9//2P/V/9J/z3/Tf9z/4v/mv+z/8v/2//v//r/9//3/wAA+f/X/8H/xf/F/8H/0f/b/9H/3P8LADIAUACFALgAzADlAAwBGwEGAd4AtQCfAJkAkACLAJsAwwACATwBZgGXAcEBzQHTAdgByQG0AbgBxgHTAd4B5gHnAeUB7AH4Af4BDgIpAjUCNQI9AkQCPwI8AkYCUgJSAkUCPwJBAjsCMQI7Al0CbgJkAm4CgAJzAmQCYgJHAhsCDgINAvMB3QHmAfEB7wHzAQECCgIFAvIB4AHjAesB6QHlAeAB1AHDAawBmQGVAY8BeAFkAWMBaAFqAWoBZwFiAWIBawFwAWkBYgFfAVgBUAFPAU4BTgFQAUEBKQEmATMBMgEmASQBHwETARQBGwEQAQEBDAEfASIBLAFLAUsBLAEqATwBMAEXAQsB/QDsAOIA3ADaANgAywDDAM0AzwDHAMkAzQC7AKUAmgCPAIAAdgBsAFYANwAZAAcAAgD7/+H/wf+t/53/i/96/2X/S/89/zn/Mv8k/xP//v7y/u3+3v7F/q3+mv6K/nv+a/5Z/kT+Lf4c/g3+/f3s/dv9z/3E/br9u/3E/c790P3L/cr9yf29/az9mf2H/X79d/1j/Uj9O/08/Tj9MP0x/TH9Jf0h/S39Nf01/TH9Kf0f/RT9//zm/ND8wfy+/Mb8w/y0/K78tvy9/LT8n/yN/H/8cPxd/Er8Ovw1/Dr8RfxR/F38Zfxt/HX8dPxk/Fb8Tvw+/Cb8HPwW/AX8+Pv9+/z78Pvq++777/vv+/P7/PsJ/Bb8H/we/Bf8GPwS/Pb73vvU+8T7svut+7L7t/u6+8D70Pvg++f75Pvf+9r71fvN+8X7vPu3+7b7tvu0+7f7uvu6+7j7uvu6+7n7s/ur+6r7rPum+577mPuV+5L7lvue+5z7kvuZ+6j7qPuk+6b7ovuf+577lvuK+4T7g/uM+437h/uG+5D7ovuy+7P7s/u6+8X7zfvO+8P7ufu5+7v7vvvC+8P7wvvH+9v76/vr+/L7DPwZ/Bb8I/w5/Dz8QPxW/GD8VfxS/Fj8YPxm/GX8avx6/Ij8k/yj/Lr80fzj/O389fwC/Q39D/0V/SH9Lf05/Ub9UP1b/Wb9cv1+/Y39m/2l/az9uv3O/d796f32/Qn+Hf4s/jn+SP5Y/mf+dv6K/p3+q/67/s3+3v7w/gb/Gv8o/zb/Rv9Z/27/gf+R/6P/vP/V/+v/AQAZADEATQBqAIQAmgCtAMEA2gDvAAABEQElATgBSgFfAXUBjAGlAcIB3wH5ARUCMQJNAmkCgwKcArYCzgLfAvICDAMiAywDOgNUA2YDbgN/A5YDrAPGA+AD9wMNBCUEQgRbBG0EfgSNBJgEqAS2BLsEwwTcBO8E9wQEBRgFJQUwBTwFRgVPBVQFVgVkBXYFfgWEBZsFrwW0BboFzAXTBdUF6QX9BfkF+AUBBgUGBwYIBgYGAwb9BfUF8wXzBfQF/gUKBhYGKAY2BjkGOwY8BjkGMAYnBiAGGwYSBgoGBQYEBgMGAQb9BfsF+wX2BekF4gXhBd4F1gXOBcoFyAXDBb8FuwW3BbUFrwWmBaIFnwWWBYkFggV3BWEFTgVEBTQFIAUZBRsFGQUaBR8FIgUgBRgFDQUCBe8E2ATFBLQEnASIBHsEbgRcBE4ERAQ8BDQEKwQiBBwEGQQSBAsEAQTuA9kDyQO0A5QDeANnA1ADMgMmAyIDEAP9AvYC8ALkAtICwAKtApcCeQJdAkcCLgITAgMC9gHiAc4BxAG2AaIBkQGAAWoBVAE7AR0B/QDjAMkArQCWAIIAawBTAEIANAAfAAkAAgD8/+f/0P/H/7P/j/93/2H/Q/8p/w3/8f7e/s/+xP6//rj+rv6l/pf+jP6C/m3+Vf5D/jH+H/4P/vz97f3h/dT9x/28/bL9q/2j/Z79n/2c/ZL9jP2N/YX9cP1e/VT9Sf07/S/9Jf0i/Sf9K/0u/TT9Ov08/Tf9L/0m/R/9Ff0K/QP9AP3+/P38/PwA/Qf9C/0M/RD9Ef0S/Rf9G/0f/SL9JP0l/SD9GP0V/Rb9D/0M/RP9Gv0j/S79Nv1D/U79U/1Z/V39Wf1Q/Uf9R/1H/UX9S/1T/VP9Xv1z/Xz9e/2I/Zf9nP2h/ar9rv2u/a39q/2s/az9pv2j/af9rf21/b79xv3U/eT97f31/f/9Bv4H/gT+A/4E/gP+//0A/gP+Bv4L/hf+If4o/jD+Ov4+/j7+Pf48/jn+N/4y/i3+LP4t/i7+Nf49/kb+Uf5c/mX+av5r/m3+bP5o/mL+WP5N/kf+Qv48/jr+PP4//kT+R/5M/lP+Wf5g/mn+bf5t/mn+Z/5h/lT+R/48/jT+Mf4u/ir+K/4z/jv+RP5N/lH+U/5T/k7+R/4//jv+Nf4q/if+Kv4o/ib+K/4x/jP+OP46/jv+Pf47/jn+Nf4t/if+If4c/hn+Fv4Q/hD+GP4e/hz+Jf4y/jT+Nv45/jb+Mf4s/iT+G/4R/gX+AP7//QH+Bv4I/gv+Gv4o/i/+Mv40/jf+PP46/jb+M/4q/iH+If4h/hr+FP4X/h/+I/4m/jD+Nv45/kH+RP5C/kL+Qf4//j/+PP45/jz+P/5B/kf+T/5T/lb+Wf5c/l3+XP5Z/lf+Vv5W/lP+Uv5V/lv+Xv5i/mX+av5x/nf+fP6D/on+jP6O/o7+jf6L/on+if6I/on+jP6Q/pf+n/6m/q3+tv6//sn+zv7O/tL+1v7Z/t7+5P7p/vD++v4D/wf/Df8Y/yH/Kv80/zr/P/9J/1X/Xf9k/2v/df96/3//jf+Z/5v/qf++/8r/0//h/+r/8v/8////AgAJABAAGQAkADAAQQBRAF0AcQCFAIoAkgCkALIAugDCAM0A3QDrAPUA/wAPAR4BKgE4AUcBTgFZAWkBegGJAZcBpQG1AcQB1wHoAfYBCAIaAisCPQJKAlkCbgKAAo4CnwKwArwCyQLYAuUC8gICAxYDJwM3A0oDXgN0A40DnwOzA8oD3QPsA/kDAgQMBBkEJwQ0BEMEUQRkBHYEhgSYBKoEugTMBNcE4QTsBPUE+wQBBQgFEgUZBSEFKgU0BToFQQVKBVEFVgVeBWMFZAVnBW4FcQVwBWsFZwVkBWAFVwVSBVMFVgVXBVcFWAVcBVkFUwVMBUQFNwUmBRQFBwX6BOoE3ATVBMgEtwSnBJoEhQRqBFgESgQtBBMEBwT0A9gDwwOsA5MDfQNkA0oDNwMiAxEDBwP6AuoC2QLGArUCpAKKAm4CXAJLAjcCIwIVAgoC/QHxAecB3QHRAcIBswGpAZ8BkwGFAXgBbgFoAWIBXQFXAVMBUgFMAUQBQgFEAUYBRwFFAUABPAE4ATABJwEiASEBHAEWARUBFwEWARYBFwEZARwBHAEYARcBFwETAQ4BCQEDAfwA+QD0AOkA4gDcANIAxwC+ALQAqQChAJkAjwCEAHoAbwBjAFUARgA3ACoAHQAOAP//8//p/9v/yP+6/6//nf+J/3v/av9V/0P/Mv8g/w///v7w/uT+2P7M/r7+rv6h/pf+if56/nD+Y/5T/kP+Mv4h/hH+//3w/ef93f3R/cz9yP2//bL9qv2f/ZH9hf17/Wz9X/1Y/VD9Rv0+/TX9Lf0l/Rr9D/0I/fz87Pzh/Nv80fzF/Lv8svyp/J/8kvyF/Hv8cfxk/Fn8T/xI/EL8Pfw0/C78J/wd/BD8BPz5+/D75fvd+9X7zfvG+8H7uvuz+6z7p/uh+537mPuU+5D7jfuL+4v7ifuG+4D7evt4+3j7dvt1+3j7eft5+337fft6+3v7f/uE+4j7i/uS+5f7mPue+6P7o/uj+6n7r/ux+7r7xvvP+9f73/vl++778/v0+/z7CfwQ/BX8Hfwn/DH8O/xB/Er8Vfxh/Gv8efyI/Jn8p/y2/Mf81fzg/O/8/fwI/RL9Hv0r/Tf9Q/1S/WH9b/1//Y/9nf2s/bv9y/3c/en99/0J/hn+Jf41/kn+Wf5k/nH+gf6R/p3+p/61/sf+2P7m/vf+Cf8a/yf/Nf9B/03/WP9k/3D/gP+S/6L/sP+9/8r/1//k/+7/9v8BAA0AFQAcACQAKwAyADkAQwBQAF0AaQByAH0AiQCUAJ0AowCpALIAvwDIAM4A1QDZAN8A5gDpAO8A9gD+AAkBFAEdASgBNQE+AUIBSQFUAVwBXQFlAW8BdAF6AYMBhQGGAYwBkwGbAaABogGnAawBsAG4Ab0BvwHFAckByQHOAdIB1AHVAdkB5AHzAfkB9wH6AQMCBQL9AfcB9QH3AfsB/gEAAgECAgIBAv4B/wH+AfwBAQIKAhECGQIdAh0CHwIjAiQCIwIhAh4CHwIgAiACIwIkAiICIwIpAjICNgI4Aj4CRAJIAkoCRQI+AjwCPwJAAkECRgJGAkECQgJIAkoCRAJAAkECRQJGAj0CNQI5AjwCPQI6AjUCMgI1Aj0CPQIqAh0CHgIhAiMCIQIdAh4CHwIbAhICCgICAvUB8AHyAfAB7gHtAe8B8AHgAc0BzAHLAb0BsQGxAbMBrwGoAagBpgGUAYUBjAGNAXUBWQFOAUcBPAFEAU8BPQErASoBIQENAf8A+gAAAQgBAQHwAOEA0wDIAMQAwAC3ALIAtQCzAKMAjQB9AHYAewCFAIkAhAB9AHkAcQBgAEcALAAcABwAIAAiACgALgAnABYABgD8/+v/zP+4/7f/sv+j/4r/e/+L/5L/fv9x/3b/g/+F/3T/av9x/2f/Sf8+/0j/RP8t/xv/D/8N/wz/Av8I/xr/Hf8S/wf/+/7q/tb+0P7j/vr+B/8a/y//OP8y/xn//P7j/tL+2P7h/uv+A/8G/wH/8v7K/rz+xP7W/gv/Ov9q/5P/X//6/rv+ef5A/oT+YP+iAAEC3AKtAqoBYAAT/9P9xvx8/A/9mP1F/rv/sgA+AGH/1v5z/vL9a/2F/Zr+8//FAEUBnAFSAXcAmv/e/mL+Zv6t/vb+ef85ALoAqwBDANn/j/9R/wv/5f4u/8X/LAByANIABgEVAR8BDgECAcgASQDz/9j/z//H/8H/zv/C/4H/U/9b/2v/aP90/8j/UgC7ANQA0ADtABwBOAExAQoB3gDMAMQAqQBpABsA8f/n//X/GAAgABMAEgAiAEMAQQAMAPH/DABGAIoAyQAFATIBOgEuARsB2QCEAG0AjwDKAO0AyQCVAHUAVgAcALH/Tf9G/47//f+LAPQAHgFdAZ8BqAGGATcB4gC5ALEAxwDSAK4AoQC1AJYATwAYAMD/Xf98/woASgAHANL/JgC0ALkAMgD7/1UApwCmAJQAiQB5AHsAiQCKAHYAPwDo/8D/7P8HAM3/df8u/xD/Iv87/23/3f9ZAMIAHgFlAV8B6wB7AJYACAFYAWYBUAFZAZkBhQEDAa0AnACeAKkA2QBeAewBKAJUAngCQALtAQUCWQKGAs4CVQOlA4IDHQPCAqsCowKNArsCJANZA04DTQNhA04DBQPHAt4COgNzA4cD0QMjBBAEpQMwA+0C4wL3AiYDWAN8A5IDfQM+A/kCqgJOAgoC5AHIAcoB/QEiAhkCHQIjAv0BsQFJAe4A1gDmAOcA1wC0AIYAUgDn/2v/Of8Q/7b+ZP40/h3+Lv5W/mH+O/4L/gL+E/70/Yz9Ef21/Hr8SfwR/OL72Pvm++L7tftv+zD78vqY+j76OfqR+sz6nvp6+rf69vrS+nz6Z/p0+hf6n/mr+Qf6PvpB+jD6Lfox+ij6IvoY+tX5kPme+dH5+Pk8+rH6F/s/+2z7ovuK+y/78vr1+in7ZPuA+5f73fs9/Hb8XPz4+6770vsJ/A78Z/w7/eb9Hf4m/i/+C/65/Yb9of38/V/+g/6k/v/+Qv8r/+v+rv6b/sv+Dv86/2z/of/Y/zAAiAB/ACUABgBWAKMAmACBAJQAoQC7AMwAkQBnAJEA8gApAd0ArQDpAPoAAQE9AVEBUwGKAaABcgFVAWoBpwG3AUwB+wA4AWcBHAHkAB0BUwEkAe0AIwGCAWIB1QCbAPgAXAFeAUYBUAFVAUUBKQH+AOIA3QC5AIUAowAIAScBwQBVAEQAIwDz/xkACwBP/6j+M/+3AEMBDAAa/wgAeAGHAXcAYP+s/uX+LAAYAYQADf9h/pH/PgELAQj/rP2Q/i4AUgAp/0n+2v6CAKwBpwHhACMATAD6AOwAQQAeAMUAOQGjAMX/EwA1AUsB/f/q/hr/GgDoAKEAov+p/1YB0gJaAvIAqQCZAZ4CiwIeAUsAEAHwASMCyAEmAeoAJAF5AbABNQFRAKwA4wHZAe4ApQDnAFwBJALTAq8C7AG4Aa4CiAPbAqoBrQFEAtgBtQBmACIBxAFpAVUA0v+aAIgBYwG0AKUAfAGlAioDnwLyARICfQJbAsYBEAFFABEA2QBuAUIBagHDAT4B/QDXAR4CZgGGAOj/TwAaARAB3QBWASMCaQKZAdAAwAFIAx4DHgIkAqgCggL4AdABzgEmAVMAsgCKAeIAp/9sAJ0CjQPOAhICbAJpA9UDOAN4AowCBAPBAt4BbwHTAYQCjgKsAQgBcgELAiECPQKLApACJgK6AfQBogKZAs0BkwFMAsECLAJYAT0B+gHvAiMDjQIYAgYCCgIhAk8CPgKWAcIAiQDZAPsA2gDhABIBPQFqAfUB2QIPA1IC0wEYAnUCcAIWArUBmwHQAfIBoQHwAFIATQAFAbcBWQE0AKb/IQD9AMEBSwKFAmAC2gGJATkCPQPkAmIByQDHAZwC6gG5AFcA1gCYAXwBTQAa/6j+Wf+CAJUA0v/Y/8YAogEaAjwCUgJRAnIBKgAIANEA9ABAAKT/ef9u/zL/9v72/uf+xf7z/jn/AP90/mn+Hv/y/zsA6f8a/y/+Ev6i/tz+sf5x/j3+Sv5O/hL+5v37/RH+7/3L/ZP9JP0o/XD92Pwe/Kz8X/0e/QH9JP3z/An9g/3q/er9d/1X/dn9Bv5t/an8Nvx6/ET9Mf0I/Gz7E/y+/Dz8V/uV+5r87vyd/L/8Hv3z/Pb8BP77/ob+lP1o/Y/9k/1v/cz8Dvw3/Ar9ev0b/T784fuf/GH9Gf1o/HH8cf1v/jX+TP1d/VX+2/6m/jD+0v25/e39Gv6w/e/83Pyb/Tj+//1N/dv8u/zC/AL9eP33/Qb+m/2Y/TX+pv6q/mj+7f3d/aH+Lf+g/n79CP3O/Z7+Pv5I/a/8ifzk/Jb91f1//Wz99/2s/hP/D//N/kv+hP03/QH+4P6s/r/9ff2Q/q7/bP95/kL+uv74/rz+Zf42/g/+Dv6k/n3/vv9X/+/+4P7l/sn+pv5//sz+nf8WAFoAywAfAW0BQwFpAB4AkQA5AAD/Xv5+/o3+qP6G/3MA3f8a/2AA2QFEAYEALgHUAc4BFwJ7AiYCVQHjAGAB2gHHAEj/u/8UAQ0BmAAEAXYBwQFjApMCTQKOAsECEQKnAUECyQLfAi4DcQNRAzIDDgO1An0CWwJDApECrQIIAqABpQFZAZYB8gKUA34CqgGVAsgDhAP6AgMEPgX5BAIEZANXAwwDEwLUAVMCqQE8ADUASwGuAV8BYQHNAVUCrgJdAoUBPwH1AZ8CpAKrAtsChwIQAnMCtQJIAWj/Ef/I/ygAwP/d/p7+fv/5/5H/ZP9x/4r/xv97/xT/j//O/+n+pv7e/+kAhQAM/9z9v/00/mP+zv0K/bz8gvxu/MT81fyL/MX8iv0X/h7+qv33/K38Hf3p/bz+/v4i/jn9mP1a/tv9k/wk/Jf8oPwt/EH8y/y//C78TfxQ/f/9o/3Q/Bj8+vs4/d7+If+Z/vv+RAC9AEP/kf2Z/fH9N/0u/TD+bv1y+1L8Lv+g/zv+Tf66/z4ACv/t/QT/kACn/3j+zP9CAXkA3v5h/gX/W/+t/hT+kf5F/13/bf+V/3z/0//NALoAF/8R/pz+A/9f/rL9B/6O/4YBdwKVAV8ApgCfAf8B5wEbAZX/p/7c/mv/xP8W/4H9Tf0V/5IAggDK/9r/UwHvAjsDLgOFA0MDZwKQARwBwQDH/zr/kv+D/57/BQGPAlcCDAG/ASEEkgTlArQBYgH3AKsAKAEeApkCBgJMARsCEQQmBfsEFgQyAwkEBAZ4BfABiP+AAKgCXwIY/xj9wv4KAeUBVQLiAmMDWATTBSkG/QRaBIME/wO9AoEBsgAFABb/Yv5b/hL/KADZAAcBCgHBAaMDZASPAkUBmQJxA1YB0f7H/kcALAHXAOv/GwCeAvUEsAPTAMsARQOtBF8DfgCC/sP+tP+k/4L+1/yG/Bn/KAKCAukARQBXAtAFmQZqBNoDFwUBBJYBIgEzASUADv+2/h3/Lf9f/mX+4P89ATYCiANcBA0EbwNXA6QDbAMiA0oDnAKLAXEBsgEJArwCGAPHAssChgN0A8MBrQDGAVACngBU/1D/Sv8iAOgBRQIXAbcAaQJdBYwGywSdA8IExAUjBUgDKQH4/93/6v+1/+/+Fv2d+8b8yf+3AZ0BEQFVAVMCbAMTBEEEwgNwAqsB+AHsAf0AqP+P/rj+RgDAAUoBHf/9/YP/eQEdASX/If7Y/pL/Rv+K/9gArAHnARMCVQK+ArkCSgL/AcoBtgGZAaQA8P4s/jD/FgDS/qr8bvzP/WH++/1E/t//pQE/AgsC/AHfAbYBOgK/AvoBUgDc/jn+Rv4u/hj+gP6g/gH+b/2J/fD9LP5s/uj+LP/v/gD/wf8wALf/VP8zAHgBGAFK/07+wv5E/xL/U/6s/a79s/1u/V/9MP3t/OH8gvwM/Ej8Bf1J/QH9e/3d/r//z//X/yIAVADw/xz/jf5V/sL9vPzu+7/75PuW+6j6Cvp3+kn7XvsB+2r7bPwc/b/9ef55/gv+qf65/x7/s/2F/cv9af11/E37CvvK+yv8jvus+n76F/vn+yH8Dfsa+ib7wfz8/IP8k/xj/Yb+Ev+Q/iX+5/58/2L+8fz//MH9Zf0k/IL7lvtk+8v6DvpC+b75WPxM/jT9rvvn/Hn/pwAIAPn+JP/p/4v/x/69/qX+6P0N/dD8RP0O/Zn7UfsQ/Vj+Xf5F/jD+wv2M/W7+dP/1/uL9Pf5o/5r/Y/8IAGcAMv8V/u/+KgCL/wb+rf1l/sn+Sv6U/bX9ev7l/i7/Zf8A//3+FgDtAIwA5P8VAM4AAwFgAKD/qP98AAoBUgAC/0L+Iv5i/mz+AP5E/mn/KwAsAMr/Tf+E/5YAFAFhAML/IQDUANUAcwCwAGwB4AHGAUYBiADR/8D/nABXAdAA9/9gAH4BywFXAUQBxwHSAfAAxQAdAmACwQBEALYBkQKfAeAAQQLcA+0CugBNAJEBPwIcAZH/OADQASkBrv/0//4ATAEMAbIAcgBvAK0ARQEEAkoCKwJOArgC7gKkAt8BWQHNAVoCsAGWAMIA0QHqAQ4BBAHrAQUCHgHaAHUBgAHhAMAATQHWAesBsQGoAbwBiQGRAUECrgJkAhcCkgFnAO//IAErAoMBtwAkAZIBggEMApwCAwJsAdIB6wEbAX8AqgCKAaACwQI5AtgBCwGIADUBfgHAAGkAqQCkAH0AtACpAesCxAJFAbcAWAE8AXsA9QAJAp4BcwBUANkA+ACiAF4AbQCmAPAAugBv/zj+tf5IAIoAA/8g/tH+Wv9a/+7/2gD8ADQAnP8dABQBBQEqAA4AmACjAFkAw/97/gb+ZP/V/6r97vvt/MT+9f68/Zz9j//sAMP/YP7e/u//YQB0AMT/HP79/Ln9Jf+B/8v+HP6L/qX/fv8j/s/9wv77/vz9V/2j/aH9//yF/XL/ZQDd/6P/6P/K/67/TAAnAQgBkv93/iH/JgDJ/0j+Qv3f/bX+0/2i/Gn93f7M/kH+N//hAOsAuP8rADoCpALtAA8A7wBaAYEADgCWAFgA4/55/r3/PgAx/8f+k/9z/1D+OP7T/tL+I/+mABQCvAGsAI8BhQOcAzkCswEWAn4BLwD2/7n/E/5O/eT+8/8s/kL8YP2Y/8H/zP5a/ygBdQGEAEEBeQKwAVABUAOdBBwDiwEeAucCBQKxAHQA1QD5AA8BUwFJAaAAiwD0Ad8CzwFwAJIAFwIVA8cCAwPwAysEXwT5BEUENQJbAU0CfgLpANH/VACCAKr/bf/p/xUAbgAPAe0AtgCiAdIC8wIJApwBvALHAyoDVQIfA04E4AMeA4oDegM0Al0BdAGIAQwBYAAWABYAEwD6/wwAZwCoAAoByAE0ApQCuAN7BJ8DcwKzAuUD7QOuAYT/OgAWAtEBpf9F/tr+3P/8/4D/7f4A/zAASwEoAa0A+gCRAekBIwIrAj0C3QJXA8oCCALvAfoB2AGCAZIA1P+GAIIBrgDE/qb+RQCBADz/Yf+nAKUAcQCdAY0CVAJJAukCUQPiAjcCYAKnAowBUgC/ANUA/f7i/eb+bf+R/l7+fv+AAHcAIgCmALsB7gEaAQ0BAQIXAmkBfwHRATIBRAA2AM0AsQCL/+7+uP+FAGwAJADh/3X/Yf/k/z0A5v9t/6r/dQDMAFgA5v8lAMcAJQEBAc8A7wDAAPP/Qf9o/2UAmwD//nz9vf3k/ln/m/4A/rr+yv/d/0H/yf7u/qr/FwDS/7P/6f+8/+v+Ev7S/f79Rv6T/pb+Of7y/SP+2/6I/zj/Tf54/oj/F/9B/dv8A/5J/rD91v0r/oH9avwi/Dr9nv6F/lL99PyQ/c/9S/3P/Cr9pP3o/Bn8jfzo/Ef8AvzM/JT9W/2w/O/83f32/ab9I/6w/k/+g/1M/bb96v2Y/Sj95/zd/AX9Xf3D/br9CP2B/NX8Jv2i/A38TvwG/V79Vf1r/cH9L/5+/nz+P/4f/ib+Av6g/Xn9+v2Z/kv+Wv0k/dD9Bf5K/er8lP1C/nb+lf62/uv+Rf9g/wn/4v6G/wkAjP/4/in/yP8PAJX/F/9A/1L/yf5H/hL+6v3p/fn9xf2X/a/9of1r/cD9af5J/qf91/2o/tv+av5F/pz+xv51/ln+9f5Z/4v+kv3j/ab+Ov4l/eH8Zv39/Uf+8P1t/an9hv4L/9r+pf60/or+r/61/zMAT//b/uH/fACW/9/+DP/i/gH+Q/2l/Xf+uP02/Gr8pv3B/e/8tPyL/af+4P5h/lr+1P41/3L/kf9X/8v+sP4j/x//0v4p/5z/XP/D/l/+R/58/t/+B//M/pr+Cf/o/xsAc/+E/+AAsQH3AEkA7wDYAboBDwHnAAkBlwDi/8v/AwDU/4D/Wv8D/+v+AQAKAXUAp/9sAEgCZQPDAuwBfwJxAywD5gH+ABoBfAFzARwBsAAtALz/0v8hAMf/Hf8l/6j/vv9B/zb/JwAHAQkBwwD7AKkBKwIfArQBaAHHAbEC7wLzATIBpgEYApUBxgBJAO7/mv9j/0z/J/8Q/67/vgAvAf8A1wBMARsCEQJbAV8BJgJ5AtkBEgEGAXQBggEhAa8AEACG/8X/YAAsADr/2f6Q/1QALAC4/x4AMAHyASMCTgKkArMCnQLPAr8CBgJmAZcB4QEeATEAgQAjAdoA5f8q/5z/2wBHAV0Aiv8NADgBrQFsAVQBpQH/AT0CgwLRAtcCXwLnAdYBzgFLAUcAd/9k/5T/bv/c/kz+Yf7C/s3+7/5u/8P/LwCEAcUCaALqASIDTwSYA2sCZwL6AvMC9AHrAAMBfwH3APb/uv8CAPX/rv8PACgBmwHwAMoAyQGJAjMCqgEQAokC+gGzAZYC/wIUAmYB7AEtAhEB5P/t/4IAcQDj/+v/ZQBqAE4AhgCiAIMAtQBYAYEBHwFrAQ4CywF3AVICUAPIAnkBhQHbAj4D3AGgABUB3QFXAVoAIABOAGkAyQBxAZEB5wCNAGUBSwKnASIAv/+1AE0BrQDz/z0A/AAUAZwAbwCQAHYAVwCyAAoBmwDk//b/yABPAesAKQDy/z4AcQCcAPMA4wA1AMj/JQCbAGoAHACDADQBVwEpATsBUQEZAfkAHQHjABsAqv8GAGQANwAWAJMALQEBATcA5f9vAOwApAAhAB4ATQA0ACAAVwB+AIEAwABQAeUBGwLAAWMBuwFhAk8CggH6ABIBKQHEACIACwCpABQBxQAyAP3/RwB+AHcAvAAdAfoAzAAyAZYBXAEAAQ0BRAEHAYAAZQCAACMA5P+mAG0B1wD8/2UAGgHiAFsAOABZAJMApQBjAEMAgwC7ANQAAAH5AKsAnwDyABwB5QC5ANkA5wCrAGgAdQD7ADYBowB9AFQBygEaAUQAMABbAC4A9/+Y/+j+5v7T/yIAV/8R/73/yf8X//j+aP+O/xT/4P7d/3MAVv+T/of/bgDk/wX/MP8HAEEAof9L/97/jgCXAFcAfQCmAHYAngAeAQcBYwDt/8L/p/+b/4j/Uv88/23/lf+R/3z/mv8kAHUA1f8P/1z/QgAcAAH/4P7r/xcA4P4u/tT+Tf/P/mj+fP5f/un9jf29/VT+ev78/cf9R/7S/vj+3/7X/jL/uP+6/07/Q/+k/9b/uP+x//r/MQDw/2z/M/9l/1H/jv7n/Qv+fP5Y/sb9tP3//c79nf0c/l7+7P3j/WP+dP5M/ob+yf7T/tH+r/6O/pb+hv5U/jX+Ov5F/hP+wf2q/Zz9aP2t/Uv+Pf66/c39Wv6D/iP+0P27/Z39e/2j/Qv+LP76/Uj+Lv+o/2f/GP8y/5P/4P/i/53/Vf9I/2H/Rf/J/ib+wf3G/eD9sv2D/cD9Gf4M/tn9Mf7t/ir/4P7n/qf/hwCkAEgAWwCoAIwAFgCm/1//Hf/m/ub+6/6g/kT+Qf5U/gL+kf2b/e394/2k/cH9J/54/pj+jP6A/rr+Kf+N/8f/w/+6/wEARAAeAOj/AAAMAKD/Ev/j/vf+5P5+/gf+4v35/ef9qf2S/bz99/0p/o7+M/+D/zz/Mv/p/5oAgQDo/5z/+/+AAFoAu/9j/2f/W/8M/7n+g/4+/in+b/6E/j7+SP7X/i7//v4H/6z/IgDV/37/BQDQALoANQAxAFMAEQC9/8r/BQDf/2L/G/8a//f+tf6Y/pL+cv4+/ib+G/4H/j3+rP7O/uv+bP/E/4n/df8hAJoALADH//7/MgD1/3f/Uf/S/zEAyv9o/4z/rP+z/8v/zv/j/zwAqgDOAKYAjACWAL8A+gAFAeYA6gD1AM4AowCtAK0AVADj/7r/wv+q/2L/UP+v/xEAEwDm/+7/YQDqAN8AdQCaACgBPwHLAEgAJgBnAJcAgABiAFQAWwC1AC0BQgENAQsBWQGXAYQBWwFgAY4BsQGpAZgBoQGQAT8B+AD3AA4B+QCrAG8AewCPAHwAbAB2AHcAUgAlABwAIwAdADkAjQDGALQAmAC5AOUAvwCSAN4AKAHEADUAIQAmAPb/4P8BAPz/h/8S/0f/xf++/2f/k/8pAE4ACQALAEMAbgDVAE8BRgEdAYcB/wHiAbsB8gEMAroBPAH2AOoAjQDg/6j/5P+6/yf/8v45/3T/c/98/87/QQB3AKkAKgGQAYQBXAF8AeYBLgILAqcBRwEiASMB3wBWAAgABgDm/6D/dv+V/9r/6//Z/xAAgQDGANIA5QAeAX4B7gEbAs8BYgFoAQUClQJdAssBxAE+AnUCCgJ5AVwBkgGcAS0BjgBxAM0A6ACzALYA3gDcAPYATAFoAUwBiwEDAgACkgFdAY8B4wHmAYMBSwFVAUQBJAEHAdYAqgCqALkAqQCXAK8A2gDrAO0AAwEuAUkBNQEkAWABsgG3AYMBcwGnAecB4wGdAXABjQG4AasBZQEoASgBRwFIASYBDwEnAUgBOAEZATABVwFNAUYBagFfARABDQFxAYgBQAFHAY4BbgETAQYBGQHpAJ4AmQDNAKEAAwDi/3UAlgAFAPn/mQC/AHoAqgALAQ0BEQFPAV8BMQEaAUABdQFZAfcA2AASATABCAHZANUA8QACAQQBDwECAcIApQDkAP0AlgAkACcAbgB6AD8AHgAwAEEARgBFAEQAVwBmAF0AkADlANYAnwC6AOIArwBbAD8ARwAsAPj/7v8JABIAAwDn/9f/CQBQAEcAKQBZAIQAeACgAO0A8gDbAOkA/QAKAfQAtgCHAH0AnQCtAFcA7f/c/+v/zv+t/7D/pv+G/4P/i/98/2b/YP+N/8z/x/+L/3H/mv/R/9n/xv/f//n/w/+Y/8n/7v/E/6P/vP/h/+P/q/+B/5H/gf9d/2H/Yf9L/y3/L/9x/5b/bv9n/6n/yv+Y/3T/if9+/zT/Bf8d/zX/C//M/r/+1P7X/r7+wf4O/2T/V//4/tT+Mf+T/2b/9P74/oL/0v9+/xH/FP9X/37/Yf8a/+n+2f7g/u3+3P61/rv+8v4E/93+2P4b/0v/MP8W/0P/fP9v/zn/Lv9U/3L/cP9c/07/Vf9e/zv/7/61/rj+wf6a/mL+Pf42/jr+Nf5R/oL+hf6J/r/+4f7X/u7+R/9x/0H/Pf+G/57/bf9b/4P/p/+P/1b/WP9u/0b/Kv9D/y//7v7k/if/U/8n//L+Hf9r/03/6v7w/jH/A/+o/rX++P4F//X+Ev9H/1f/Ov8i/zr/g/+p/1j/CP82/2L/Lf/0/uH+zv6x/or+cP5//o3+h/6i/tr+Af8L/xn/aP/L/6n/R/+D//f/xf9k/37/p/9n/xv/J/8//wn/zP7r/iz/HP/a/tz+Fv8r/xP/Af8N/x//H/8W/xP/K/9g/4v/mf+e/7H/2v8AAAgADwAsACoAAwD0/+3/sf90/1//I//J/sf+A//3/sf+6v46/1b/XP96/6r/6/8aACsANAApADIAVQBNACIA4P+f/6b/z//B/5P/j/+t/7L/lv+L/5//n/91/1H/YP+N/5f/Zf9L/4n/0//M/7X///9xAIcAYAByALkA0gCcAF8AXwBgAAwAvP++/7H/gf+G/5v/g/+H/8r/FQBDAFIAfQDBAMoArwC1ANYA6gDJAIsAeACRAJEAWwA1AEgAQwADANb/3f/o/+n/6//n/+P/8/8FAPP/1f/z/zEANQAUABwAWACDAGQAPwBEAEUAMwAJANX/zP/W/8P/rf+//+b/4P+3/7n/6f8BAAMAGgA6AEEANwAvADYARgA5ABkAFgAOAOf/5f8WADoANQAsAEUAWgBGADMARABWAGwAjwCTAIEAjQClAKIAgAB4AKUAqwByAF0AhwCGAC4A5//7/xoA9//B/7X/zv/v/wQAGQBCAFQAYgCtAPoABAHwAPcAGAEdAfAAygDIAMgAswB/ADkAKQBPAFYANgAYABkANAA0ACAAKgA4ADgAWgCEAGwAOQA/AH4AqQCIAGcAngDnANUAlQCTAMUA0ACnAJIAqwCyAI4AagBjAG4AbgBmAGUAZgBvAIcAgwBlAHsAqQCEAEEASgBjAEAAHwA2AEkANgAgABEACwAXACYALQA3AE0AbwB/AH0AjwCtAL0AzwDiAN0A1QDdAOkA6QC/AJgAqgCiAGcAWAB3AHQAPgBDAJEAmwB2AJEAqwCMAIEAowDCAMsAvwCpAKIArADAAMMAoQCEAIUAjACLAHoAUgAuADsAZABLAPr/8/9OAIoAVQAgAHAAzwC2AJEAvwD0APQA7QDwANEArAC1ALkAgwBJAEoAZgBRABMADQBJAFMAFwACACAAEgD+/ysAQQAdADsAkgCcAHcAiwCxALQAwgDSALcAngCdAIYAYQBUAE8ANwATAAkAFgD6/83/9f8uACUALwBhAGgATgBVAH0AjwBuAFIAdQCFAFYAQgBSAD4ADAAAAB4AGgDs/+D///8QAPz/4f/q/xEAJAAbACEAMwA6AEMARwA5ADUARAA8ABQA9//4/wcAEgAMAOn/1P8BACwACQDt/xwARQA1ABoAIQAwACQADQD+/+T/yP/U/+r/z/+s/7z/3f/j/9n/0P/R/9D/0f/0/wgA7v/1/yoAMADz/8v/7v8rAC0AAAD7/xsAJAAOAPH/5//s/+3/5v+//4r/hf+a/5v/mf+t/8L/xv/P/+3/DAAaACAALwBFAD0AGgASAB8ADwDV/6//xf/Y/7n/lv+N/6T/vP+k/4L/lf+6/7z/rv+1/77/tP+n/5P/ef94/4P/gP9x/3L/lv+o/4j/d/+Q/5z/jf+Q/6L/ov+R/47/pf+3/63/o/+g/4P/ZP95/57/lP96/4b/lf+B/2z/bv9p/2P/bP9o/1P/T/9b/17/U/88/zL/Sf9Q/zv/PP9X/2T/YP9k/23/Zv9l/3X/eP9t/1//T/9O/1b/Qv8g/xv/Iv8Q//H+8f4c/zr/Jv8j/1v/g/95/3H/gP+M/4z/iv+K/3r/Zf9u/3v/Zf8//zj/Tv9L/yz/Jv9M/3X/eP9q/4D/rf+6/6r/ov+j/6D/pv+z/7H/s//O/+b/3v/M/8T/wP+7/73/vP+r/5//qf+o/5T/o//F/8H/s/+r/7f/2f/b/9T/7P/0/+3/9P/3/+v/3v/d/+n/9P/o/9L/0v/i/+T/z/++/8//7v/q/83/vv/I/93/2v+z/67/0//S/6n/mv+x/8n/zv/A/7j/wP/B/77/wP+8/7L/rv+2/8n/0f/B/7X/zP/o/+D/y//S/+f/6//j/9b/0P/h/+n/2v/U/9j/2P/S/8v/0//W/8v/0P/i/+H/0P/H/83/2P/a/9r/4//d/8r/1v/q/97/yv/c//j/7f/c//n/EgD6/+3/AwD+/+r//P8GAOb/2v/4/wIA6//N/8j/4//n/8X/uf/Q/+b/6v/i/+X//v8CAOr/9/8lADcAMgA7AEwASwBHAFEAVgBOAEIAOQA3ADAAHQAKAAIABgACAO//9f8JAPr/3f/h/wAAHAAnACMAJgAwADMAPgBDADcALwAsAC4ALgAcABMAHgArACgAGQASABQADQAMAB8AJQASAAsAEwAQAAsAEQAYAAcA8v///xIACQABAAkAFgAnACcADwADABQAIgAYAAcACAAjADsAJwABAP3/GQAyAC4AGAAYAC0AOQA0ACIAIQAzADIAGwAIAAwAIAAlACEAJgApACcALQAzADQAPABEADcAIgAhAC4ALQAbAA4AEAAQAAcADgApADgALAAiADUAVgBfAEkAQgBXAFsASQBFAE0AQQApACIAHwAVAB0AKQAiABcAEAAXACMAJwAxAC4AKwBKAFIAOQA5AEcARAA8AD8AUABeAFAAPQBKAFkAUABJAE4AWgBiAFQARABNAEsAJwATAB8AKQAVAP//EgA4AEQANwAnADcAYgByAFkASABqAJAAdgBIAEAAQwA5ACUADAD//wQABgAHABYAJAAmACQAJQApAC0AKwA2AE8ARAAsADYANgAoACUAJgAvACgAEQAcADMAHwD+/wAAGAATAPP/5//7/woABgD9/wIAIAA6AC0AFwAkAEAAQgAqABUAHwA3ACYA9//1/xgAFgDw/+n/AQAIAAAAAAAJABUALQA5AC4ALQAzADwASgBDADoAQQA9ADoAOAAzAEAASQAyAB0AIgAoABkACQATACEAFgAAAAcAIQAhAAYABQAoADwALgAgAC0ASABKAC8AJQA1AEMAPQAlABwAJQAkABgACwD+/wEACAADAAoAHQAdABoALwA4AB8AEwAvAEMANQAjACkAOAAyABIA+v///wcA+f/i/9//9v8FAPz//P8LAAUA/P8QACEAIAAiACsAMwArABUAEQAfACAAEwAPABwAJgAdAAoAAwAHAAUA/v/6//v/AgAIAAQA9//r/+7/+f/y/+z/AwAXABgAFwAWABYAGQAbAB8AGwARAA4ADwAMAAsACgAHAAsACAD9//b/5f/h//T/8P/b/+b/BgAEAOr/8v8VAB0ACAD4/wQAIgAqABYADQATAA4A9v/h/9n/2//j/+D/zv/O/+f/5v/G/8L/0//b/+D/3v/Z/9//7P/x/+f/4v/x//n/8f/4/wUAAgD8/wgACwDv/+L/9v/4/9v/zv/a/97/0f++/8H/2v/X/8X/1P/p/+T/5f/3//v/9P/2//7//P/x//L//f/7/+z/3v/j//T/7f/k//P/+v/x//H/9//+/wAAAAD8//X/8v/z//T/7v/i/+H/8f8AAP//8f/r//T/+P/1//b/9v/0//j/AAABAPf/8v/6//b/5//y/wsACgD8//L/+/8RAAsA+f8BAAcA+//y//X/+f/y/+b/5//u/+X/1//a/+n/6//Z/83/2//m/9//2P/Y/+L/5//a/9D/2//z//H/1v/c/+//5v/Z/9f/1//W/83/x//M/9T/1f/O/8n/zv/U/9H/zf/O/9H/1P/a/93/0v/C/8P/zf/K/8j/yf/O/9z/3//a/93/5f/s/+7/4//W/9z/6f/p/9r/zf/U/+L/3f/R/8//1//j/+v/5f/e/+X/7f/u/+//9v/9//3/+//9//X/8//+//r/6//q//P/8//o/+T/8f/8//P/4v/n//r//P/1//b/+/8BAAEA//8FAAsACwAIAAMAAAADAAQAAwD+//j/+/8BAAAA+f/2/wAADQAMAP///f8DAP7/+v////7///8FAAAA+//2//b/AQABAPz//////wcAEQAFAPj/AQAGAPb/6v/3/wMA+P/q//D/+v/0/+X/4//y/wIA/v/t/+3/CgAcAAYA9v8BAP7/8//2/+3/2v/e/+7/7f/i/+T/7//0/+z/5v/t//X/+P/6//D/7P/9//7/7v/o/+j/6v/t/+j/7P/9//z/6v/q//T/7//m/+3/+P/3//L/9P/2//X/9//1/+7/8/////7/+v/2//f////9//H/7f/0//7//f/t/+z//f/3/+L/7P/9//T/6//6/xEADgD+/wAAEQAZAA0ABQAXACIAFAAMAAwACwAFAP7//v/4//T//P/3/+n/6//z//7/BAAAAP7/CgAVABcAFgAVABkAGQAOAAwADgAJAAwAEAANAAoABgAFAAUA/v/2//3/CQALAAQA9//6/w4ADgD9////FQAaAA8AEAAdACAAFgAPAA0ACgAEAAAAAwAGAAAA/f8FAAoACwAHAAEAAQABAAIACQANAAcAAwAHAAkAAgD+/wQABAD+/wUAEgAPAAoADgAKAAAABQAIAPv/9f8AAAIA+v/4//z/AgAHAAIA/v8EAAsABwD///v/AAAFAAAA/v8AAPn/9f/3//j//P8AAAQADwAWABMAEQAUABQACwAHAA0ACwAAAAEAAQDy/+z/9//3/+3/9v8GAAoABQAAAAsAGwASAAUADAAZAB8AFwAPABQAFwAQAA0AFgAaABMADAAPABYAFAALAAkADgANAAIA+P/7/wQABwABAAAACQARABMAFgAbACAAKwA1ADEAKAArADMALQAgABwAHAAbABUADgAPABEADwALAAkAEAAYAB0AHgAUAA4AHQAnAB0AGwAlACQAGwAhACgAHwAUABkAHQAXABYAGgAVAA0ADQAQABMAFAAPABgAJAAaABUAHgAeABkAEwAUAB8AHgAOAA4AFgAMAP//BwASAAcA8f/x/wIABwAEAAEABAANAAoAAgADAAcADAALAAMAAAAGABAAEQAFAAMACQAGAAEAAgADAAYADAAJAP7/+P/7//7/+P/4/wMAAwD9//7/AAAEAAgABgAHAAcAAQD//wYACgAGAAAAAQACAP7//P8AAAMAAAD8//7/BQAFAP7//P8EAAkABwAAAP7/BAAFAAMABgALAA4AFAASAAgAAwAFAAcA/v/2//z////7//b/8//9/wMA+P/z//j//f8AAP3//P/8//7////6//L/8//5//r/+v/9//z//P8BAAAA+f/6/wMAAwD4//L/+P/6//b/+P/z/+z/+P/+//D/6v/x//f/+//6//r/AwAGAPr/9////wMA/f/x//L//v/9/+//6v/1//v/8//y//n/+//6//j/+P/7//f/9v/2//X/9//1//P/9v/2//f/+f/7//3/+//8//3/+//8//z/+f/7//n/9//6//n/9f/z//P/+P/4//f/+f/6//3/AQD///3/+v/4//f/9f/3//r/+f/4//j/9//1//r////6//j/BAAEAPT/8/8AAAAA+P/3//n/AAADAAAA/v/8//r/+//6//3/AQD8//T//f8DAPn/8f/1//n/+v/2//L///8LAAIA/P8BAAMAAQD/////BAADAAAAAQAAAPr/9v/2//f/8//x//b/9v/w//T//P/6//r/+//6//r/+/8BAAIA+//7//3/AAACAPv/+P/+/wAA+//1//L/9f/5//T/8P/z//b//P/+//f/9f///wQA+v/x//r//v/0//H/9P/2//v//P/6//n/+//9//v/+P///wQA+f/2//7/9v/t//P/9v/x/+7/7//3/wAA/P/3////AgD9//r//f8DAAQA/P/5//7//f/4//T/7//0//j/9f/2//j/+P/5//r//v////v//P8AAAEAAwACAPv/+v/+//3/+f/4//r/AQABAPj/9v8AAAMA+v/2//z/AQD///z//P/+//z/+v/5//v/AAAEAAMAAQD+//3/AgABAP3/AQACAAEAAAD8//n/+v/4//j//P/+//7///8AAP//+v/3//z//v/9//z//f8BAAUAAwD9//n/+f/7//7//f/8//7//f/+//v/9f/6/////P/7//3/AAD+//r//f8AAP7//v/9//v//v8AAPn/9P/5//7/+f/2//f//P////n/9/8DAAkAAgD8////BAAHAAIA/f8AAP//+//6//n/+//6//b/9//3//j/+//8////AAD+/wIAAwAAAAEAAwAFAAQAAAABAAUABQAAAP3/AAAAAPv/+//+//3/+v/4//v/AQABAP3//v8CAAMAAgD+////BQAHAAgABgADAAcACQAIAAgABgAGAAUAAQABAAIA/////wEA///5//r///////v//v8EAAUAAwAEAAgACwAJAAcABwAFAAQABgAFAAQAAwADAAMAAAD+/wIABQAEAAQAAQD9/wAABAABAPz/AAAHAAQA/f8BAAQAAQAFAAcABQAHAAcABAAGAAYABQAIAAgAAQABAAUABgABAPr/+v8CAAQA/f/7/wAABAADAAAAAQAHAAoABgAEAAYACQALAAYAAQACAAIA//8AAAEAAgADAAQAAwD//wEABwAFAAMABgAGAAEAAQAIAAgA/v/8/wEAAQD//wMAAwABAAQABwAIAAkABQACAAgABQD4/wAADAACAPz/AAAFAAYA/f/7//7/AAAIAAgA//8CAAoABwAEAAQAAwAKAAoAAQAFAAkAAgD/////AQAFAAEA/f8FAAsAAgD8/wIACAAGAAEA//8GAAoABQACAAYABwAGAAMAAwAHAAcABAAEAAYAAwD//wIABAD///7/AwADAAAAAQAFAAgABQACAAUABwAEAAMABAAFAAYAAgACAAMA/v///wMAAwAEAAUABQAFAAUABgAFAAIAAgADAAUABgAEAAMABQADAAMABQAEAAEAAQADAAEAAAAEAAUAAwABAAIABgAFAAAA//8FAAcABAACAAYACAAHAAcABgAGAAYAAwABAAAA/v///wIAAgAAAAEABQAEAAEABAAHAAMABQALAAYAAQAFAAYABQADAAAAAwAEAAQABwAGAAMABQAFAAMABwAGAPz/+/8EAAMA/P/+/wQABwAGAAEAAQAEAAUACAAIAAQABgAJAAMAAgAFAAEA/f///wEAAQACAP7///8IAAUAAAAIAAoABAADAAYABgABAAEABQACAAAAAQACAAIAAwAAAAEABAABAAAABgAFAAIAAwAEAAQAAwAAAAMABwADAP7/AwAHAAQAAQACAAYABwADAAEAAQABAP7//f8CAAUABQAEAAMAAwADAAIAAwACAAQABQADAAMABAAEAAQAAQD//wIABAAEAAMAAgADAAQAAgACAAQAAwAAAAEABQAEAAEAAQACAAEAAAAAAAEAAwAEAAQABAAEAAQABAADAAMAAgACAAMABAADAAIAAgABAAMAAwD//wEABQAEAAMAAQABAAMAAgADAAQAAwACAP//AAAEAAAA/v8DAAQAAQACAAMAAgADAAUABQACAAEABAAGAAIA///9//7/AQD///7/AgACAAEABAADAP7/AQAEAAAA//8BAAUABAABAAIAAQAAAAIAAQAAAAIAAQD+/wAAAAD+/wAA/v/8/wAAAQABAAEA//8CAAUAAQD9////BAAEAAAA/v8BAAUABQACAAAAAQACAP//AAACAAIAAgAAAAEAAgD///7////9//7/AQACAAAAAAAEAAYAAwABAAMABQADAAMAAgD//wAAAgD+//z/AAACAP///v8AAAEABAADAP////8CAAMAAwAAAAEAAwD9//r/AQADAP3/AAAFAAIAAQACAAMABAADAP//AAADAAEA/v8AAAEAAgACAP//AAACAP///v////3///8CAAEAAQABAP//AAADAAEA/v/+////AAD+//v/+//+//////////7//v/+//7/AAD///3//f/7//7/AgD///3//f////7/+v/9/wEAAQAAAP7//P///wAA/f/9/////v///wAA/f///wEAAAD///7//v8BAAAA/v/+//7///////z//f///wAA/////wAAAgABAP///v8AAAEAAQAAAP//AAAAAAAAAAAAAAAAAgABAAEAAgACAAEA//8BAAMAAQAAAP///v8AAAEAAAABAAEAAwACAAEAAQABAAIAAwAAAAAAAgABAAIAAQD//wAAAQAAAAEAAQD//wAAAgABAP///////wAAAQABAAEAAwABAAAAAQACAAIAAAAAAAIAAAACAAMAAAABAAIAAQABAAAAAAABAAIAAQAAAAEAAAD//////////wEAAAABAAMAAwADAAIAAAAEAAMA//8AAAEAAAD+//3///////7///8AAAAAAQACAAAAAgACAAIAAwABAAAAAgACAAAAAAADAAIA/f/+/wMAAQACAAMAAQAAAAAAAAD/////AAAAAAEAAgD+/wAABAACAAEAAwACAAQAAgD//wIABAD+//3/AgABAPz//v8BAP///v8AAAAAAQADAAIABAAEAAAAAAABAP7///8BAAAAAQAAAAMABQD+//7/AwABAAMABQABAP3//v8BAAIA/v/+/wEAAAAAAAQAAQAAAAUABAACAAMAAgACAAMA/v/8/wIAAgD8//7/AgABAAAA//8AAAMABAABAAAAAgAEAAMAAgABAP//AAACAAEA//8AAAEAAwADAP7/AAAGAAIA/v8EAAQA//8AAAMAAQAAAP////8DAAQAAAABAAMAAgACAAAAAAAFAAQA/v8AAAMA//8AAAMAAQAAAAAAAAACAAMAAAABAAMAAgACAAIAAAADAAQAAAABAAMAAQD//wAAAAAAAAIAAAAAAAMAAgD//wAAAAAAAAIAAgADAAMAAgABAAEAAQACAAIA//8BAAIAAQAAAP//AAADAAEA//8BAAMAAwACAAMAAwACAAEAAgABAAIAAgAAAAAAAAACAAIAAAABAAEAAQABAAEAAQABAAIAAgACAAEAAQACAAIAAgACAAMABQACAAEABQAEAAEAAwACAAIAAgAAAAEAAQAAAAIAAQACAAIAAQACAAQAAgACAAMAAQABAAMAAAABAAMAAQABAAAAAAACAAIAAgABAAIABAADAAEABAAEAAIAAgABAAAAAQABAAAAAQABAAEAAwABAAAAAQAEAAMA//8AAAQAAAD//wIAAAAAAAIAAwACAAAAAgAFAAEA//8EAAIA//8FAAIA/f8BAAIAAAACAP///P8DAAQA/v8BAAMAAAABAAEAAgAFAAIAAAABAAQAAgD+/wAAAgAAAAEAAAD//wMAAgACAAIAAQACAAIAAAACAAMAAgABAAEAAAACAAIAAAABAAEAAAABAAEAAQABAAEAAgABAAAAAQACAAIAAgABAAAAAAADAAIAAAABAAMAAwACAAAAAAABAAEA//8AAAEAAAABAAIAAAABAAIAAgACAAIAAgACAAIAAQABAP////8BAAIAAAABAAMAAwAAAAIABQABAP//AgAAAP7/AQACAP//AAABAAEAAgABAAAAAwABAAAAAgABAAEAAwABAP//AgABAAAAAQAAAAAAAwABAP//AwAEAP//AQADAAEAAAAAAAEAAQABAAIAAQABAAEAAgAAAAEAAgAAAAIAAAD+/wIAAQD+/wAAAAAAAAIAAQAAAAIAAgD//wEAAwACAAAAAQADAAIAAQABAAEAAgABAP//AQACAAAAAgADAAAA//8BAAMAAAD//wMAAQD//wEAAQAAAAIAAgACAAIAAQACAAIA//8BAAEA//8BAAIA//8BAAIAAAACAAIAAAACAAMA/////wMAAgAAAP////8CAAIAAAAAAAIAAgABAAEAAwACAAIAAgAAAAAAAAABAAAA//8BAAIAAAABAAMAAQABAAEAAAAAAAIAAwABAAAAAAABAAEAAQAAAAEAAQABAAMAAgAAAAMAAwD//wEAAwD///7/AgABAP//AQABAAEAAwABAAEAAwAAAAEAAgAAAAIABAABAAAAAgABAAAAAQABAAEAAgAAAAAABAACAAAAAgADAAAAAAADAAMAAQACAAMAAAAAAAIAAAAAAAEAAAACAAQAAAD//wQAAgAAAAMAAwADAAIAAAACAAIAAQABAAIAAwACAAEAAgADAAIAAgACAAIAAQACAAEA//8AAAIAAgAAAAEAAQABAAIAAwABAAIABAADAAIAAQAAAAEAAgAAAAAAAgABAAAAAQABAAEAAQACAAIAAgADAAMAAQD//wEAAwABAAAAAQABAAAAAgADAAEAAAACAAIAAQABAAMAAQAAAAIAAQABAAMAAAABAAUAAAAAAAMAAQACAAIAAAADAAMAAAABAAIAAAD+/wAAAgAAAP7///8CAAEAAgACAAEAAwACAAEAAgABAAEAAwABAAAAAAABAAIAAAAAAAIAAQAAAAIAAQAAAAEAAQABAAAAAQACAAEAAQACAAEAAQABAAAAAQACAAAAAAACAAEAAAABAAIAAQABAAAAAAABAAAAAAACAAIAAAAAAAIAAQAAAAEAAQABAAIAAQABAAAAAAAAAAEAAQACAAIAAAABAAIA//8AAAEAAAABAAEAAAABAAEAAQACAAEAAQABAAEAAAABAAIAAAD//wIAAQD//wEAAQAAAAEAAQAAAAAAAAD//wAAAQABAAEAAAAAAAAA/v/9/wAAAAD+/wEAAwABAAAAAQAAAAEAAgABAAEAAgAAAAAAAgABAAEAAAD//wAAAgAAAP//AgACAAAAAQABAAEAAgACAAEAAQAAAAAAAQAAAAEAAAD//wAAAQAAAAAAAQABAAEAAQABAAAAAgACAAAAAQAAAAAAAgABAAAAAAAAAAEAAQABAAEAAQABAAIAAgACAAEAAAABAAEAAQABAAEAAQACAAIAAAAAAAMAAQD//wIAAwD//wAAAwABAAAAAAABAAEAAgACAAIAAQABAAEAAQABAAMAAgD//wEAAwAAAAAAAQAAAAEAAgD//wEABAABAAEAAgAAAAEAAwABAAIAAgABAAIAAwACAAAAAAACAAEA//8AAAEAAAABAAEAAAABAAEAAQACAAAAAQACAAEAAQAAAAEAAwABAAAAAgACAAEAAgABAAAAAgABAAEAAgABAAIAAwABAAEAAgACAAIA//8BAAIA//8AAAIAAQAAAAMAAgAAAAEAAwADAAAAAQAEAAEAAAADAAAA//8CAAIAAAACAAAAAAADAAIA//8CAAIA//8BAAIAAQACAAEAAAACAAIAAAABAAAAAAACAAEAAQABAAEAAAABAAIAAgAAAAEAAgABAAEAAgABAAAAAgABAAAAAQABAAAAAwABAP7/AgADAP//AQACAAEAAQABAAEAAQABAAEAAgAAAAEAAgABAAMAAgAAAAMAAgAAAAMAAQAAAAMAAQABAAIAAAAAAAMAAgAAAAEAAgACAAEAAAAAAAEAAgABAAAAAgADAAIAAQAAAAAAAQACAAEAAgABAAEAAgACAAAAAQACAAEAAAABAAEAAQABAAEAAgACAAIAAgABAAEAAgABAAAAAQABAAAAAQABAAAAAgABAAAAAgACAAEAAgAAAAEAAwABAP//AwADAP//AAACAAEAAAABAAEAAAAAAAEAAQACAAIAAQACAAAAAgADAAAAAQADAAAAAAACAAEAAQACAAEAAQACAAAAAAADAAEA//8AAAIAAgABAAAAAAABAAEAAAABAAEAAQACAAIAAQABAAEAAQACAAAAAQACAAEAAgACAAEAAAABAAEAAAAAAAIAAQAAAAEAAgAAAAAAAgABAAEAAQACAAIAAQABAAIAAQABAAIAAAAAAAIAAQABAAMAAQABAAMAAAAAAAMAAQD//wEAAwACAAEAAQAAAAAAAgACAAEAAQABAAAAAQACAAEAAgACAAEAAgABAAEAAgABAP//AgADAAAAAAACAAEAAAACAAEAAQADAAAAAAACAAEAAgACAAAAAQACAP//AAACAAEAAAACAAMAAQAAAAIAAgACAAIAAgABAAEAAgADAAEAAAABAAEAAAABAAEAAQACAAEAAQADAAEA/v8CAAMA/v8BAAQAAAABAAIAAgACAAAAAQACAAAAAwADAP//AQADAAEAAgACAP7/AwAEAP//AgADAP//AQACAAEAAwABAP//AQADAAEAAAABAAIAAgABAAAAAAACAAIAAQACAAIAAgACAAEAAQACAAEAAQACAAEAAAABAAIAAAD//wEAAgAAAAEAAgABAAEAAQABAAIAAQABAAEAAQACAAEAAQACAAAAAAADAAEAAAADAAMAAQABAAIAAQABAAEAAAABAAIAAQABAAIAAQABAAIAAgAAAAAAAgABAAAAAgABAAEAAgAAAAEAAgAAAP//AQACAAAAAQACAAIAAQADAAMAAgACAAEAAQACAAAAAAACAAIAAQABAAIAAQAAAAIAAwAAAAEAAwABAP//AgACAAEAAQABAAIAAQABAAMAAQAAAAIAAgAAAAEAAwD/////AwACAAAAAQABAAEAAwABAAAAAgABAAIAAwAAAAEAAwABAAAAAwABAAAAAgABAAEAAgABAAAABAADAAAAAgADAAAAAQACAAIAAQABAAIAAQABAAEAAQABAAIAAQABAAMAAAAAAAIAAQAAAAIAAQABAAEAAAABAAIAAgABAAEAAQACAAIAAQACAAMAAQABAAIAAQAAAAAAAgACAAAAAQADAAAAAAADAAEA//8CAAMAAQACAAEAAQAEAAIAAAACAAIAAQACAAEAAgADAAEAAAACAAIA//8AAAMAAgAAAAEAAQABAAEAAQACAAIAAQACAAIAAQACAAIAAAABAAMAAAAAAAMAAgABAAIAAQABAAMAAQABAAMAAQACAAIAAQACAAIAAgACAAEAAgAAAAAAAgAAAAAAAgABAAEAAgABAAEAAgABAAEAAgABAAIAAwACAAEAAAAAAAIAAQABAAIAAgABAAIAAgAAAAEAAgABAAAAAQACAAEAAQACAAEAAQACAAIAAQACAAEAAAADAAIA//8CAAIAAAACAAEAAQACAAEAAgACAAEAAAABAAAAAgACAAEAAgACAAEAAgABAAAAAgABAAEAAgACAAIAAQABAAIAAQABAAIAAAABAAIAAQABAAEAAQACAAIAAQACAAIAAQACAAIAAAABAAIAAQAAAAEAAQABAAEAAAABAAIAAgABAAEAAQACAAIAAAAAAAMAAAD+/wMAAwD//wEAAwABAAEAAgACAAIAAgABAAEAAQABAAEAAQAAAAEAAgAAAAEAAwAAAAEAAgAAAAEAAgAAAAEAAwAAAAAAAwABAAAAAQABAAEAAQD//wAAAQABAAAAAQACAAEAAAABAAIA//8BAAIA/////wIAAAD//wAAAQAAAP7///8BAAAAAQABAAAAAQACAP//AAACAP//AQADAAAAAQACAAEAAQAAAAAAAgACAAAAAAABAAEAAQAAAAEAAQABAAEAAQABAAIAAQAAAAAAAQABAAEAAQAAAAEAAQAAAAEAAAAAAAIAAQAAAAEAAgABAAAAAQABAAAAAAABAAAAAAABAAEAAQAAAAEAAQABAAIAAAABAAIAAAABAAIAAAABAAIAAQACAAEAAAABAAEAAAABAAIAAgABAAEAAAABAAIAAQABAAIAAQABAAEAAQABAAEAAQABAAAAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAAABAAIAAQABAAAAAAABAAEAAQABAAEAAQABAAAAAQAAAAAAAgAAAAAAAQAAAAIAAQAAAAEAAQAAAAEAAQABAAEAAAABAAIAAQABAAEAAQABAAEAAgABAAAAAQACAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAIAAAAAAAIAAQABAAEAAAACAAIAAAACAAIAAAAAAAIAAQD//wEAAgABAAAAAAAAAAEAAgABAAEAAQABAAEAAAAAAAIAAQAAAAIAAQAAAAMAAQAAAAIAAQAAAAMAAgD//wEAAgABAAIAAAABAAMAAQABAAEAAgABAAAAAQACAAAA//8DAAEA//8CAAIA//8BAAMAAQD//wAAAwABAAEAAgAAAAAAAwABAAAAAwAAAAAABAACAP7/AgACAAAAAgABAAEAAgABAAEAAgACAAAAAQACAAIAAQAAAAIAAQAAAAIAAQABAAIAAQAAAAEAAQACAAEAAAAAAAAAAQABAAAAAQABAAEAAQAAAAAAAQABAAAAAQACAAIAAgACAAAAAAACAAEA//8BAAIAAAABAAEAAAACAAIAAAACAAEAAAABAAIAAQABAAEAAQACAAEAAAABAAAAAQACAAAAAAABAAEAAQABAAEAAQAAAAEAAQABAAEAAgABAAEAAgABAAAAAQAAAAAAAwABAP//AgACAAAAAQABAAEAAQAAAAAAAgABAAAAAQABAAEAAQABAAMAAQABAAMAAgAAAAIAAgAAAAAAAgACAAAAAAACAAAAAQADAAEAAAACAAEAAQACAAAA//8DAAEAAQACAAEAAQABAP//AQACAAAAAAABAAEAAAABAAEAAAACAAIAAAABAAEAAAABAAAAAQADAAAA//8BAAAAAAABAAIAAQAAAAEAAwAAAAAAAwACAP//AgACAAAAAAACAAEAAAAAAAEAAQABAAEAAAABAAMA//8AAAMA///+/wMAAQD//wMAAwAAAAAAAQABAAAAAQACAAEAAAACAAEAAAACAAAAAAADAAAAAAACAP//AQACAP//AgADAP7///8FAAEA/f8BAAMAAAAAAAAAAAADAAEA//8BAAIAAQABAAAAAAACAAIAAAACAAAAAAACAAEAAQABAAEAAQABAAEAAAABAAEAAQACAAEAAQACAAIAAQABAAEAAQAAAAIAAgAAAAEAAgAAAAEAAQACAAEAAAACAAIAAQACAAIAAQABAAEAAAD//wEAAQAAAAEAAQAAAAIAAgAAAAEAAQAAAAEAAQABAAIAAQABAAEAAAABAAEAAAABAAIAAQABAAIAAQABAAEAAgABAAAAAQABAAAAAQACAAAAAAACAAMAAAAAAAIAAAACAAIA//8BAAEAAAADAP////8DAAAA/v8DAAIA/v8BAAMAAAAAAAEAAQACAAIAAAABAAIAAQAAAAEAAQACAAIA//8BAAMAAAABAAIAAAABAAIAAAABAAEAAAABAAEAAQABAAEAAgABAAAAAQABAAAAAQACAAAAAAABAAEAAQABAAAAAQABAAEAAQABAAEAAQABAAAAAgACAAAAAAACAAEA//8BAAIAAAABAAEAAAABAAEAAQACAAEAAAABAAEAAQACAAEAAAACAAIAAAABAAEAAAABAAEAAAABAAEAAAAAAAIAAQAAAAEAAgABAAEAAQABAAEAAQACAAEAAQABAAEAAgABAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAQABAAEAAQABAAEAAQABAAIAAQABAAEAAQACAAIAAQACAAEAAAABAAEAAQABAAAAAgACAAAAAQABAAAAAQACAAEAAAABAAIAAQAAAAIAAgAAAAEAAgAAAAAAAwACAAEAAgAAAAEAAwAAAAEAAQAAAAIAAQAAAAMAAwAAAAAAAgACAP//AQACAAAAAAABAAAAAgACAAAAAQABAAAAAQABAAAAAgACAAEAAgAAAAAAAgABAAAAAgABAAAAAgACAP//AQACAAAAAAABAAIAAQAAAAIAAQAAAAIAAgAAAAEAAgABAAIAAQD+/wIAAgAAAAEAAQAAAAEAAQAAAAIAAQD//wEAAgABAAEAAQACAAIAAQABAAEAAQABAAAAAQACAAEAAgACAAEAAAABAAIAAQAAAAIAAgAAAAEAAQABAAEAAQABAAIAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAAACAAIAAAABAAIAAAAAAAIAAQD//wAAAgABAAAAAQABAAAAAgACAAEAAQABAAEAAgACAP//AQACAAEAAQABAAEAAQABAAAAAQABAAEAAQACAAEAAQABAAAAAQACAAAAAAABAAAAAAABAAEAAQABAAEAAQD//wAAAgABAAAAAQABAAAAAgAAAAAAAwAAAAAAAwABAAAAAQABAAIAAgAAAAAAAgABAP//AQACAAEAAAABAAEAAAABAAEAAQABAAEAAQABAAEAAgABAAEAAgAAAAEAAgAAAAEAAwABAAEAAgACAAEAAAACAAIA//8BAAIAAAABAAIAAAAAAAEAAgABAAEAAQABAAIAAQAAAAEAAgABAAIAAQAAAAEAAQAAAAEAAQABAAEAAQABAAEAAQABAAEAAgAAAAEAAgAAAAAAAgACAAEAAQACAAEAAAABAAIAAQABAAIAAQABAAIAAAABAAIAAAACAAIAAAABAAEAAQADAAIAAAACAAIAAAAAAAEAAQABAAAAAAACAAIAAQABAAEAAQABAAEAAQAAAAEAAgACAAAAAAACAAEAAAACAAMAAQAAAAIAAgABAAIAAgAAAAEAAgABAP//AQACAAEAAQACAAEAAgACAAAAAAAEAAAA//8DAAEAAAACAAIAAQABAAEAAQABAAAAAAABAAIAAQAAAAEAAwABAAAAAgABAAEAAgAAAAAAAQABAAIAAQAAAAEAAgACAAAAAQADAAEAAAABAAEAAQABAAEAAgABAAIAAQAAAAEAAwABAP//AgACAAAAAQABAAEAAQAAAAEAAQABAAEAAQABAAAAAAACAAIAAAABAAEAAQABAAEAAgABAP//AgADAAAAAQADAAAAAAADAAEA//8BAAMAAQD//wEAAgAAAAIAAgD//wEAAgAAAAIAAwD+/wEAAwAAAAEAAgAAAAIAAAD+/wIAAwD/////AwADAP//AQADAAEAAQABAAEAAgABAAEAAQAAAAEAAwAAAP//AgABAAAAAwABAAAAAgABAAEAAQAAAAAAAgABAAEAAQABAAEAAQAAAAAAAQACAAEAAQACAAEAAQABAAEAAAABAAIAAQABAAEAAQABAAEAAQACAAAAAAACAAEAAQACAAEAAQABAAEAAQABAAEAAgABAAEAAQABAAIAAAABAAEAAQABAAEAAQABAAEAAQACAAEAAQABAAEAAQABAAEAAQABAAIAAQAAAAEAAQAAAAEAAgABAAAAAQABAAAAAAABAAEAAAABAAEAAQABAAEAAQAAAAAAAgABAAAAAgACAAAAAQACAAAAAQACAAAAAgACAAAAAQABAAAAAQABAAIAAgABAAEAAQABAAEAAAAAAAEAAQAAAAEAAQAAAAIAAgABAAIAAQABAAIAAAABAAMAAQAAAAAAAgABAP//AQACAAEAAAABAAAA//8BAAIAAAD//wIAAgD//wEAAgAAAAAAAwABAAAAAQABAAEAAwAAAP//AwABAAAAAgACAAEAAQAAAAEAAgABAP//AgADAAEAAAABAAEAAQABAAEAAQAAAAAAAQAAAAEAAQAAAAEAAQABAAEAAQABAAIAAgABAAEAAQABAAIAAQABAAEAAAACAAMAAAACAAIAAAABAAIAAgABAAAAAgACAAEAAQAAAAAAAQACAAEAAQABAAIAAQAAAAIAAgAAAAEAAwAAAAAAAgABAAEAAgAAAAEAAwAAAAAAAgABAAEAAQABAAIAAgABAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAIAAAAAAAIAAgAAAAEAAgACAAEAAQAAAAEAAgACAAEAAQABAAEAAQABAAAAAQABAAEAAgACAAEAAQABAAEAAQABAAEAAgABAAIAAgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEAAgABAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAgABAAEAAgABAAEAAgABAAAAAQABAAAAAQABAAEAAgABAAAAAQABAAEAAQAAAAAAAgABAAAAAQACAAAAAQACAAEAAQABAAEAAQABAAEAAQAAAAEAAwAAAP//AQACAAAAAgACAAEAAQACAAEAAQABAAEAAQABAAEAAQABAAEAAgACAAAAAQACAAAAAAACAAEAAQACAAEAAQACAAAAAAACAAEAAQABAAEAAgABAAAAAAABAAAAAQACAAEAAQABAAEAAgABAAEAAgABAAAAAgACAAEAAQACAAEAAQABAAIAAQABAAEAAQACAAEA//8BAAIAAAABAAIAAQABAAIAAQAAAAAAAQACAAAAAQABAAAAAQABAAAAAgABAAAAAwADAP//AAACAAAA//8CAAMA//8AAAIAAQAAAAIAAgAAAAEAAgABAAEAAQABAAEAAQABAAIAAAAAAAIAAAD//wMAAgD//wEAAwAAAAEAAgD//wEAAwD+/wAAAwD//wAAAwACAAEAAQAAAAIAAgABAAIAAQAAAAIAAQABAAIAAAACAAMAAAABAAIAAAABAAIAAQACAAEAAQACAAIAAAD//wEAAgABAAEAAQACAAIAAQABAAIAAgACAAEAAAABAAIAAQACAAIAAQABAAIAAQABAAEAAQABAAEAAQAAAAEAAgABAAEAAQACAAEAAQABAAEAAQABAAEAAwACAAAAAQACAAEAAQACAAIAAAABAAMAAQAAAAIAAQAAAAEAAgAAAAAAAgABAAEAAgAAAAAABAAAAAAAAwAAAAAAAgABAAIAAgABAAEAAgABAAEAAQACAAEAAQAAAAEAAgABAAEAAQABAAIAAQAAAAEAAQACAAIAAAABAAIAAQAAAAEAAQABAAIAAQAAAAIAAQAAAAEAAQABAAEAAQABAAIAAQABAAEAAQABAAEAAgACAAEAAQACAAEAAQACAAEAAAABAAIAAQD//wEAAQAAAAEAAwABAAAAAgACAAEAAgABAAEAAQABAAIAAgABAAEAAQAAAAEAAgABAAEAAgACAAEAAgAAAAEAAwAAAP//AwABAAAAAQABAAEAAQABAAEAAAABAAIAAQABAAIAAQACAAMAAAABAAIAAQABAAIAAQAAAAEAAQADAAMAAAAAAAMAAQAAAAEAAQABAAEAAQABAAEAAQABAAEAAQACAAIAAAABAAMAAgAAAAIAAgAAAAEAAgABAAEAAQABAAEAAQABAAIAAQAAAAIAAgABAAMAAgAAAAEAAgAAAAAAAQABAAEAAgAAAAAAAwAAAAAAAwACAP//AQACAAEAAQACAAEAAAAAAAIAAQAAAAIAAQAAAAIAAQABAAIAAQABAAIAAQABAAEAAAACAAMAAAAAAAMAAgAAAAEAAgACAAIAAQABAAIAAQABAAEAAAACAAMAAAAAAAMAAQD//wIAAgABAAEAAQAAAAIAAQAAAAIAAgAAAAEAAgAAAAAAAQABAAEAAQABAAEAAgACAAEAAQABAAEAAgAAAAEAAgABAAEAAgABAAEAAQACAAEA//8BAAIAAAABAAIAAQAAAAEAAAACAAIAAAABAAIAAAAAAAEAAQABAAAAAQABAAAAAQABAAAAAAACAAIAAAABAAMAAQAAAAIAAgAAAAEAAwAAAP//AwACAP//AQACAAAAAgABAP7/AgADAP7/AAADAAAAAQACAAAAAgAAAP//AgADAAAA//8CAAIAAAABAAIAAQAAAAIAAgAAAAAAAgABAAAAAgACAP//AAADAAEAAAACAAIAAQACAAEAAAACAAEAAQACAAEAAQACAAEAAAACAAAA/v8CAAIA//8BAAMAAQABAAIAAAABAAIA//8AAAIAAAD//wMAAgAAAAEAAQAAAAEAAQACAAEA//8DAAEA//8CAAEAAQADAAEAAQACAAAAAQACAAEAAQACAAAAAQACAP////8CAAEAAQACAP//AAAEAAAAAAADAAEAAAACAAEAAQACAAAAAQACAAEAAAABAAEAAAD//wEAAgAAAAEAAgAAAAIAAQAAAAIAAQAAAAIAAgAAAAAAAQABAAAAAQACAAIAAQABAAEAAQACAAEAAAABAAIAAgACAAAAAQABAAIAAQD//wAAAgABAAEAAgAAAAAAAgABAAEAAgABAAEAAgABAAEAAgABAAAAAQABAAIAAgABAAEAAQABAAEAAQABAAIAAAABAAIAAQABAAMAAQD//wMAAwAAAAAAAwABAAAAAgABAAEAAgABAAIAAgABAAIAAgABAAIAAgAAAAEAAwAAAAAAAgAAAAAAAQACAAEAAQAAAAAAAQABAAAAAQABAAEAAwABAAAAAgABAAAAAgABAAEAAQABAAEAAgABAAAAAgADAAEAAAACAAEAAQACAAIAAAAAAAEAAQAAAAEAAQABAAIAAQABAAIAAQACAAEA//8BAAMAAAAAAAMAAQAAAAIAAgAAAAEAAgABAAEAAQABAAEAAQAAAAEAAgABAAEAAQAAAAEAAQABAAEAAgACAAEAAgABAAEAAgAAAAEAAgAAAAEAAgABAAEAAAAAAAEAAgAAAAEAAQABAAIAAQABAAIAAQACAAMAAAABAAEAAQACAAEAAQABAAEAAQACAAEAAQABAAIAAgABAAAAAQACAAEAAgACAAAAAQADAAEA//8BAAIAAAABAAIAAQAAAAIAAQABAAEAAQAAAAEAAQABAAIAAQABAAEAAQAAAAEAAAAAAAIAAQAAAAIAAgABAAIAAQAAAAMAAwD//wEAAQABAAIAAAABAAIAAAACAAEAAAACAAAAAQACAAAAAQACAAAAAAADAAMAAAAAAAMAAgAAAAEAAgABAAAAAgAAAAAAAgABAAAAAQABAAEAAwABAP//AQACAAAAAQABAAEAAgABAAAAAgACAAAAAQABAAEAAgACAAEAAQABAAEAAQACAAEAAQABAAEAAQABAAIAAgABAAEAAQABAAEAAQAAAAIAAgD//wIAAgAAAAEAAgABAAAAAQADAAAAAAACAAEAAAACAAEAAAADAAIAAAADAAIAAAACAAEAAAACAAEAAgACAAAAAQACAAEAAQABAAIAAgABAAEAAQABAAEAAQABAAEAAQACAAEAAAACAAIAAAABAAIAAQAAAAIAAgAAAAEAAgABAAEAAQABAAEAAQACAAIAAQACAAMAAAAAAAIAAQD//wEAAgAAAAEAAQAAAAIAAQAAAAMAAgAAAAEAAQAAAAQAAgD//wIAAgD+/wEAAgAAAAEAAQAAAAIAAgAAAAEAAwABAP//AQADAAEAAQADAAEA//8CAAMA//8AAAMAAAABAAEA//8CAAIA//8BAAEAAQACAAEAAAADAAIA//8BAAIAAAACAAEAAAACAAIAAAABAAMAAQABAAEAAQABAAIAAAABAAIAAAABAAIAAAAAAAEAAQABAAEAAQABAAEAAQACAAEA//8CAAIAAAAAAAMAAQAAAAEAAgAAAAEAAgABAAEAAgABAAEAAQABAAEAAQAAAAIAAQD//wIAAgD//wIAAgAAAAIAAQAAAAIAAgAAAAEAAwAAAAAAAgACAAEAAQAAAAEAAgABAAEAAQABAAIAAQABAAEAAAACAAMAAAABAAIAAAABAAEAAQAAAAAAAgACAAEAAQABAAEAAgACAAEAAQABAAIAAQABAAEAAQABAAEAAQAAAP//AQABAP//AQACAAAAAAABAP//AQACAP//AAADAAAAAQABAAAAAQAAAAAAAQAAAAEAAQABAAIAAQABAAIAAgAAAAEAAQD//wEAAQAAAAEAAQABAAIAAQD//wEAAwABAAAAAgABAAAAAAABAAEAAAACAAIAAAABAAIAAQD//wIAAwAAAAAAAwAAAP//AQABAAAAAQAAAAAAAwACAAAAAQAAAAAAAgABAAEAAwABAP//AwACAP//AQABAAAAAgABAAAAAgACAP//AQADAAEAAAABAAEAAQABAAEAAQAAAAEAAgAAAAEAAQAAAAMAAQD9/wIAAgD//wIAAQAAAAAAAAABAAEAAAAAAAAAAgACAAAAAQACAAEAAQACAAEAAAACAAAAAAABAAEAAgACAAAAAAABAAIAAAD//wIAAQD//wEAAQAAAAEAAgABAAEAAQACAAEAAAABAAIAAAACAAIAAAACAAIAAAACAAIA//8CAAMA/////wEAAAACAAIAAAABAAIAAAAAAAIAAgAAAAEAAgABAAAAAQABAAAAAQACAAEAAQABAAEAAQABAAAAAQACAAEAAAABAAIAAAABAAIAAQAAAAEAAQABAAEAAAAAAAIAAAABAAMAAQABAAEAAQABAAAAAAABAAEAAQABAAAAAQACAAEAAQABAAAAAQABAAEAAQABAAEAAQAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAgABAAEAAgABAAEAAQACAAEAAQABAAAAAgACAP//AQACAAAAAQABAAAAAQABAAEAAgABAAAAAQABAAAAAQABAAEAAQAAAAIAAQD//wEAAgAAAAEAAgABAAAAAgADAAEAAAABAAEAAgACAAAAAQADAAEAAAACAAEA//8CAAIAAAAAAAIAAgABAAEAAQABAAEAAQABAAEAAgAAAAEAAgAAAAAAAwABAAAAAQABAAEAAQACAAEAAQABAAEAAQACAAEAAAACAAEAAQACAAAAAQAAAAAAAQABAAEAAAAAAAIAAAD//wIAAQAAAAEAAQABAAIAAQAAAAMAAgAAAAIAAQAAAAEAAQACAAAAAAACAAEAAQACAAEAAAACAAIAAgABAAAAAAABAAEAAAABAAIAAQAAAAEAAQAAAAEAAgAAAAEAAgABAAAAAAABAAEAAAABAAEAAAAAAAIAAQAAAAIAAgAAAAAAAgACAP//AQACAAAAAQABAP//AgACAAAAAgAAAAAAAgABAAAAAwABAP//AwABAP7/AQABAAAAAQAAAP//AgACAP//AAACAAEA//8AAAIAAQABAAIAAAD//wIAAgAAAAAAAQABAAEAAAAAAAIAAgAAAAEAAgABAAEAAgAAAAEAAgAAAAEAAgAAAAAAAQAAAAEAAQAAAAEAAgAAAAEAAgABAAEAAQACAAIAAAABAAIAAAABAAIAAAACAAMAAAABAAEAAAACAAEAAAABAAEAAQADAAEA//8BAAMAAQAAAAEAAgABAAEAAAAAAAEAAQACAAEAAQADAAIA//8CAAMAAQAAAAIAAQD//wIAAgAAAAEAAQAAAAEAAQAAAAIAAQD//wEAAQABAAMAAQD//wIAAQAAAAIAAQAAAAIAAQD//wMAAwD//wEAAgAAAAEAAQAAAAIAAgABAAEAAQABAAIAAQABAAEAAAACAAEA/v8CAAIA//8BAAEAAAABAAEAAAACAAEAAAABAAIAAQAAAAEAAgACAAEAAQABAAEAAQAAAAEAAgABAAIAAgABAAAAAQACAAAAAAACAAEAAAABAAEAAQACAAEAAQACAAEAAQABAAAAAQACAAAAAQACAP//AQABAAAAAQACAAAAAQACAAAAAAACAAEAAAAAAAEAAgABAAEAAQABAAIAAQABAAEAAQABAAIAAQAAAAEAAgABAAAAAgACAAAAAQACAAEAAQABAAEAAAABAAIAAQAAAAEAAQABAAEAAQABAAAAAQACAAEAAAACAAIA//8BAAMA/////wIAAQAAAAEAAQABAAMAAAABAAIAAAABAAIAAAACAAMAAAABAAIAAAAAAAEAAAABAAIAAAAAAAMAAQD//wIAAgAAAAAAAgACAAAAAQACAAAAAAACAAEAAAABAAAAAQADAP////8DAAEAAAACAAEAAQABAAAAAgACAAAAAAABAAMAAQAAAAIAAgABAAIAAgABAAAAAgABAP//AAACAAEAAAABAAEAAAACAAIAAAABAAIAAQABAAEAAAABAAIAAQABAAIAAQABAAEAAQABAAEAAQABAAEAAQADAAEA//8BAAIAAQAAAAIAAQAAAAEAAgABAAAAAQABAAAAAQACAAAA//8CAAEAAAADAP//AAAFAP////8DAAAAAQACAAAAAgACAAAAAQACAAAA//8BAAIAAQD//wAAAQAAAAEAAQAAAAEAAgABAAEAAAACAAIAAAABAAAAAAACAAEAAAACAAEAAAACAAEAAAAAAAEAAAABAAEAAQACAAEAAQABAAEAAQAAAAEAAgAAAAAAAgABAAAAAQABAAEAAQABAAEAAQABAAEAAgABAAEAAAABAAEAAAABAAEAAQACAAIAAQAAAAAAAQABAAEAAgACAAAAAQACAAAAAAACAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAQACAP////8CAAAA//8BAAEAAAABAAEAAAABAAAA//8BAAEAAAABAAEAAAABAAAA//8DAAIA//8CAAMAAAABAAEAAAABAAIAAQABAAIAAQABAAIAAQACAAEA//8BAAIAAAAAAAEAAQABAAEAAQABAAIAAQABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAQAAAAEAAQAAAAEAAAAAAAIAAQAAAAAAAAABAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEAAgACAAEAAAACAAEA//8CAAIAAAAAAAIAAQAAAAAAAQABAAEAAgABAAAAAQABAAEAAQACAAIAAAABAAIAAAAAAAEAAAABAAIA//8AAAMAAQABAAIAAAABAAIAAQACAAIAAQACAAIAAQAAAAAAAgABAP//AAABAAAAAgABAAAAAQABAAEAAQAAAAAAAQABAAEAAAABAAIAAQAAAAIAAgABAAIAAQAAAAIAAQAAAAIAAQABAAIAAAABAAEAAQACAP//AQACAAAAAAACAAAAAAACAAIAAAAAAAIAAgAAAAEAAwABAAAAAgAAAP//AQACAAAAAQABAP//AgACAAAAAgABAP//AQABAAEAAgAAAP//AgACAAAAAQAAAAAAAgABAAAAAQABAAAAAQACAAEAAAABAAEAAQABAAEAAQAAAAIAAQAAAAEAAQAAAAMAAQD9/wIAAgD//wEAAgAAAAEAAQABAAEAAAABAAEAAAABAAEAAAACAAIAAAADAAIAAAADAAEAAAACAAEAAgACAAAAAAACAAIAAQAAAAIAAgABAAAAAAABAAEAAQAAAAEAAgABAAEAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAgABAAAAAQABAAEAAQABAAEAAgACAAEAAAAAAAIAAQAAAAEAAgAAAAEAAgABAAIAAQABAAIAAQABAAIAAAAAAAMAAQD//wIAAgD//wAAAgABAAAAAQABAAEAAQAAAAAAAQABAAEAAQAAAAEAAgAAAAEAAgAAAAAAAgABAAEAAgABAAEAAgABAAEAAgABAAAAAQACAAIAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAAAAAAEAAQAAAAEAAQABAAIAAgABAAAAAQABAAEAAAACAAEAAAABAAIAAAAAAAIAAQABAAEAAQABAAAAAQACAAAAAQACAAAAAAACAAEAAQACAAEAAQACAAAAAAADAAEA//8BAAIAAQABAAEAAAAAAAEAAgABAAEAAQABAAEAAQACAAIAAQABAAIAAQAAAAIAAgD//wEAAwD//wAAAgABAAAAAgAAAAEAAwAAAAAAAgAAAAEAAgAAAAEAAgD//wAAAgABAAAAAQACAAEAAQABAAIAAgACAAEAAAABAAIAAgABAAEAAQABAAEAAQAAAAEAAgAAAAAAAwABAP7/AgACAP7/AQADAAAAAQACAAIAAQD//wIAAQD//wMAAgD+/wEAAgAAAAIAAgD+/wMABAD+/wEAAwD//wEAAQABAAIAAQD//wEAAgABAAAAAQABAAEAAQAAAAAAAQABAAEAAQABAAIAAgABAAEAAgABAAEAAQABAAAAAQACAAAA//8BAAIAAAABAAIAAAAAAAEAAQABAAAAAQABAAAAAgAAAAAAAgABAAAAAwABAAAAAwADAAAAAQACAAAAAQABAAAAAQACAAEAAQACAAEAAQACAAIAAAAAAAIAAQAAAAIAAQABAAIAAQABAAIAAAD//wEAAgAAAAEAAgACAAAAAgACAAEAAQABAAEAAQABAAAAAQACAAEAAQABAAEAAAABAAIAAQAAAAMAAQD//wIAAgAAAAEAAgACAAAAAQADAAEAAAACAAIAAAABAAIA/////wIAAQAAAAEAAQABAAMAAQAAAAEAAAABAAIAAAABAAMAAAAAAAMAAQD//wIAAgAAAAIAAAAAAAMAAgD//wIAAgAAAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAEAAQACAAEAAAABAAEAAQABAAEAAQABAAAAAQACAAEAAQABAAEAAgACAAAAAAACAAEAAAABAAEAAAAAAAIAAgAAAAEAAwAAAAAAAgABAP//AgACAAAAAgABAAAAAwACAAAAAgABAAEAAgABAAIAAgABAAEAAgABAAAAAAACAAEAAQABAAAAAQACAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAQABAAEAAQABAAEAAQABAAEAAgABAAEAAQABAAIAAgABAAIAAAAAAAIAAAAAAAIAAQABAAEAAQABAAEAAQABAAEAAAACAAIAAQABAAAAAAABAAEAAQACAAEAAAACAAIAAAABAAIAAAAAAAEAAgABAAEAAQABAAEAAgACAAAAAQABAAAAAgABAP//AgACAAAAAgAAAAAAAgAAAAAAAgABAP//AQACAAEAAQABAAIAAgABAAIAAQABAAIAAQAAAAEAAgACAAAAAAADAAAAAQACAAAAAQACAAAAAQABAAAAAQACAAEAAQABAAEAAgABAAAAAQACAAEAAAABAAEAAQABAAEAAQACAAIAAQAAAAAAAgACAP//AAADAAAA/v8CAAIAAAACAAMAAAABAAIAAQACAAIAAAABAAIAAQABAAEAAAABAAEAAAABAAEAAAABAAEAAAABAAEA//8BAAIAAAAAAAIAAQAAAAEAAAABAAEAAAAAAAEAAQABAAEAAQABAAAAAgACAAAAAQADAAAAAAADAAEAAAABAAEAAgABAAEAAgACAAIAAAD//wIAAgD//wEAAgD//wEAAwABAAEAAwACAAEAAQACAAIAAgACAAIAAQABAAIAAQABAAIAAgACAAIAAQACAAIAAAABAAIAAQACAAIA//8BAAIAAAAAAAEAAQABAAEAAAACAAMAAQAAAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAAAAQACAP//AQACAAEAAgACAAEAAgABAAAAAgACAAAAAQABAAEAAgABAAEAAQABAAIAAgABAAIAAQAAAAIAAgABAAIAAgAAAAEAAgABAAEAAQABAAIAAQAAAAEAAgABAAEAAQABAAEAAQABAAEAAgACAAEAAQABAAIAAQD//wIAAgAAAAEAAQABAAAAAAACAAAA//8CAAEA//8CAAIA//8AAAMAAgAAAAIAAQABAAMAAAAAAAMAAgAAAAEAAQABAAIAAQAAAAIAAQD//wIAAgAAAAEAAgABAAAAAAAAAAEAAgABAAEAAQABAAIAAQABAAEAAQABAAIAAQAAAAEAAQAAAAEAAQABAAEAAgABAAAAAAABAAEAAAAAAAEAAQABAAAAAgACAAAAAQADAAEAAAADAAMA//8AAAMAAgD//wEAAwD/////BAABAP//AwACAAAAAgABAAAAAwABAP7/AgADAP//AAADAAEAAQAAAP//AgACAAAAAQACAAEAAgACAAEAAgACAAIAAgACAAEAAAACAAMAAQABAAEAAQABAAIAAgABAAEAAgABAAEAAQAAAAIAAgAAAAEAAwABAAAAAQABAAEAAgABAAEAAgABAAEAAgACAAEAAAACAAIAAAABAAEAAAACAAIAAQABAAEAAQABAAIAAQABAAIAAQABAAEAAQABAAEAAgABAAIAAgAAAAEAAwABAAEAAgABAAEAAgABAAAAAAACAAEAAQABAAEAAgADAAEAAQACAAEAAQACAAIAAQABAAIAAQABAAEAAQABAAEAAgACAAEAAQACAAEAAgACAAEAAgACAAEAAgABAAEAAQABAAIAAQAAAAEAAQD//wIAAgD//wEAAgAAAAEAAQAAAAEAAAABAAIAAQAAAAAAAgADAAAAAAADAAEAAAADAAMA//8BAAMAAQD//wIAAwAAAP//AwABAP//AwACAP//AgACAAAAAwABAP7/AwADAP//AgACAAAAAgAAAP//AwACAP7/AQADAAEAAAABAAEAAgABAP//AAACAAEAAAABAAEAAQABAAIAAAD//wIAAwABAAAAAgABAAAAAQABAAEAAgABAAEAAgACAAEAAQAAAAAAAgAAAAEAAgAAAAEAAQAAAAEAAQAAAAEAAgAAAAAAAgACAAAAAAACAAEAAAACAAEAAQACAAIAAAABAAIAAAACAAMAAAABAAIAAAABAAIAAQABAAEAAAABAAIAAAABAAEAAQACAAEAAQACAAAAAAABAAEAAgABAAAAAgACAAEAAwABAP//AgAEAAAA/v8CAAMAAAAAAAEAAQACAAEAAQABAAAABAADAP//AgAFAAAAAAAFAAEA/v8CAAMAAAABAAEAAAAEAAIAAAACAAEAAAACAAEAAQADAAIAAAADAAEA//8BAAEAAAADAAIA//8DAAMA//8BAAMAAAD//wEAAgABAAEAAgABAAAAAgACAAAAAgABAP//AwACAP3/AwADAP7/AgACAAAAAQABAAEAAgAAAAAAAQADAAIAAAABAAMAAgABAAIAAQABAAIAAAABAAIAAQACAAIAAAAAAAIAAgAAAAAAAwABAAAAAgABAAEAAgABAAEAAQABAAIAAQAAAAEAAgABAAIAAQAAAAEAAgABAAIAAQAAAAIAAgAAAAAAAQABAAIAAgAAAAIAAgABAAAAAgACAP//AQADAAAAAAACAAEAAQACAAIAAgABAAEAAgABAAEAAgABAAAAAgABAAAAAQABAAEAAwACAAAAAgACAAAAAQACAAAAAAABAAIAAQABAAIAAQABAAIAAgABAAEAAQABAAIAAQAAAAIAAQAAAAIAAQABAAIAAQAAAAIAAQD//wEAAgABAAEAAQABAAIAAgABAAEAAQAAAAEAAgACAAEAAQABAAEAAQABAAEAAQAAAAIAAQABAAIAAQABAAEAAAABAAIAAAABAAEAAgACAAEAAAACAAIAAQAAAAIAAgABAAEAAQABAAAAAQABAAEAAgACAAEAAAABAAIAAQABAAIAAgD//wEAAwAAAAAAAwABAAEAAgABAAIAAQABAAIAAQABAAQAAgD//wMAAgD//wIAAgAAAAIAAQD//wQAAwD//wIAAwAAAAAAAQACAAIAAQACAAIAAQACAAIAAAABAAIAAAABAAEA//8CAAEAAAACAAAAAAACAAEAAAADAAEA/v8BAAQAAQAAAAEAAQACAAMAAAAAAAIAAQAAAAIAAQABAAIAAgABAAEAAAACAAEAAAACAAEAAAACAAEAAAACAAIAAQACAAEAAQACAAEAAAABAAIAAQAAAAEAAgABAAEAAgABAAAAAgACAAAAAAACAAIAAAABAAIAAAD//wIAAgAAAAIAAgAAAAEAAgABAAIAAgD//wEAAwABAAEAAgABAAIAAgAAAAIAAwAAAAEAAgABAAEAAQAAAAEAAgABAAEAAQAAAAEAAQAAAAIAAgAAAAEAAgACAAEAAQABAAEAAQACAAIAAAABAAMAAQABAAIAAQACAAAAAQADAAEAAgAEAAIAAwAAAP7/AwAEAAAAAgAEAAEAAwAFAAMAAwAFAAQAAwABAAEAAwADAAIAAgACAAMAAgACAAIAAgACAAMAAwABAAIAAwABAAAAAwACAAAAAQABAAEAAQABAAEAAQABAAEAAAABAAIAAQABAAEAAQACAAEAAAABAAAAAAACAAEA//8BAAIAAAAAAAIAAQABAAIAAAABAAIAAAABAAIAAQABAAEAAQABAAEAAQABAAEAAQACAAEAAAACAAEAAgACAAEAAgACAAEAAQABAAEAAQAAAAEAAQABAAEAAQAAAAEAAgAAAAEAAQAAAAEAAQAAAAIAAQABAAAAAAABAAEAAQABAAEAAgACAAAAAQABAAAAAQABAAEAAAABAAEAAAAAAAIAAgD//wAAAQAAAAEAAQAAAAEAAgAAAAEAAQD//wEAAwACAAAAAAACAAEAAAACAAEAAAABAAIAAAAAAAEAAQABAAEAAAABAAMAAAAAAAEAAQACAAIAAAACAAMAAAAAAAMAAgD//wEAAwAAAAAAAQAAAAEAAgABAAIAAgABAAIAAQD//wIAAgAAAAIAAQAAAAIAAQAAAAIAAAAAAAMAAgD//wAABAABAP//AQADAAAA//8DAAAA/v8DAAIA//8BAAEAAAADAAEA/v8CAAIA//8BAAIAAAABAAAA//8CAAIA//8BAAIAAAACAAIAAQACAAEAAAABAAIAAQABAAIAAgABAAAAAQABAAAAAgADAAAAAAADAAEAAQABAP//AQACAAAAAQABAAAAAQABAAAAAgACAP//AQADAAAA//8CAAEAAQABAAAAAQACAAAAAAABAAEAAgACAP//AQADAAEAAAADAAEA//8BAAIA//8BAAIAAAACAAIAAQACAAEA//8BAAEAAAACAAEAAAACAAEAAAABAAAAAAADAAEA//8CAAIA//8AAAIAAAAAAAEAAgABAAEAAgABAAAAAgACAP//AQACAP//AgABAP7/AgACAP7/AQACAAAAAQABAAEAAgABAAAAAQACAAEAAQABAAIAAQABAAIAAQABAAEAAQABAAEAAQACAAEAAAABAAAAAgACAAAAAQACAAEAAQAAAP//AAABAAEAAQABAAEAAQAAAAAAAQAAAAEAAQAAAAEAAQAAAAEAAQABAAIAAQAAAAEAAQABAAEAAQABAAEAAQABAAEAAQACAAAAAAACAAAAAQACAAAAAAACAAIAAgAAAAAAAgABAAAAAwABAP//AwACAP//AQAAAAAAAgAAAP//AgACAAAAAAACAAEAAAABAAIAAQABAAEAAAABAAIAAAABAAIAAAABAAIAAAAAAAIAAgABAAEAAQABAAAAAQACAAEAAAACAAEAAQABAAAAAQACAAAAAQACAAEA//8BAAIAAQAAAAIAAgABAAIAAgAAAAEAAwABAAEAAQABAAIAAQAAAAAAAgABAAAAAQACAAEAAQACAAEAAQABAAEAAQABAAIAAgABAAEAAQAAAAEAAQACAAEAAQADAAIAAAACAAQAAAD//wQAAgD9/wEABAD+/wEAAgD//wIAAgAAAAMAAQD+/wEAAQAAAAQAAgD+/wMAAgD+/wEAAQD//wMAAQD+/wMABAD+/wEABAAAAAAAAQABAAEAAQACAAEAAQACAAIAAAABAAIAAAACAAEA/f8CAAIA//8BAAEA//8BAAIAAQACAAIA//8BAAMAAQABAAEAAgACAAEAAQABAAIAAQAAAAAAAQABAAIAAwABAAAAAQACAAAAAAACAAIAAAABAAAAAAABAAEAAQABAAAAAQABAAEAAQACAAEAAQABAAAAAgABAAAAAgABAAAAAgABAAAAAAACAAIAAAAAAAIAAQAAAAIAAgD//wIAAwAAAAEAAQABAAMAAgAAAAEAAgABAAEAAQAAAAIAAgAAAAEAAwAAAP//AwABAP//AQACAAAAAgABAAAAAgABAAEAAgAAAAEAAgAAAAEAAgABAAAAAgABAAEAAQABAAEAAgABAAEAAgACAAEAAQAAAAEAAgACAAAAAgACAAAAAQADAAAAAAACAAEAAQACAAEAAQABAAAAAQACAAAAAQABAAAAAQACAAAAAQADAAEAAAABAAAAAQADAAEAAAABAAEAAQACAAEAAQABAAAAAQACAAAAAAACAAIAAQABAAIAAQABAAIAAQABAAAAAQACAAEAAAACAAAA//8CAAIAAAABAAMAAQABAAIAAQABAAIAAAAAAAIAAAABAAMAAQAAAAEAAQABAAEAAAABAAIAAQADAAEA//8BAAIAAQABAAIAAgAAAAEAAgABAAAAAgACAP//AQADAAAA//8CAAEAAAACAAAAAAAFAAAA//8DAAEAAAACAAIAAQABAAEAAQABAAEAAgABAAEAAgAAAAAAAgABAAEAAgAAAAEAAwABAAEAAQABAAIAAgAAAAEAAgACAAIAAQABAAIAAgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAIAAgAAAAAAAQABAAIAAQAAAAEAAQABAAEAAQAAAAEAAQABAAEAAAAAAAAAAAABAAEAAQABAAIAAQD//wEAAQAAAAAAAQAAAP//AQACAAAA//8BAP///v////////8BAP///v8AAP///v8AAP///v////7//v8AAP7//f///////v/+//////8AAP///v///////v/+////AAAAAP///v8AAAEAAQABAAMABAAEAAQAAwADAAQAAwADAAMAAwADAAMAAwADAAMAAwADAAQAAwADAAMAAwACAAIAAwACAAMAAwADAAIAAQABAAIAAgACAAEAAQAAAAEAAQABAAEAAQAAAAAAAQAAAAEAAQAAAAAAAAAAAAEAAQABAAEAAAAAAAEAAQABAAEAAQAAAAAAAQABAAEAAQAAAAEAAQAAAAEAAgACAAEAAAAAAAAAAAABAAEAAQABAAEAAQAAAAAAAAABAAEAAQABAAEAAAAAAAEAAQABAAAAAAABAAEAAQAAAAEAAQABAAEAAAABAAEAAQAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAAAAAABAAEAAQABAAAAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAAAAAEAAQABAAEAAAAAAAEAAQAAAAAAAQABAAEAAQAAAAEAAQABAAAAAQAAAAEAAQABAAEAAAAAAAEAAQABAAAAAAABAAAAAAABAAAAAQABAAEAAQAAAAEAAQABAAAAAQAAAAAAAQABAAAAAQABAAEAAQABAAEAAQABAAAAAQACAAAAAAABAAIAAQAAAAEAAQABAAEAAQABAAAAAAAAAAEAAQAAAAEAAQAAAAEAAgABAP//AAABAAEAAQABAAAAAAABAAEAAQABAAEAAQACAAEAAAABAAEAAAABAAIAAgABAAAAAAABAAIAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAEAAQABAAEAAAAAAAEAAQAAAAEAAQABAAAAAAABAAEAAQACAAEAAAABAAIAAAABAAIAAQAAAAEAAgABAAEAAQABAAIAAQABAAIAAQAAAAEAAQABAAIAAQAAAAIAAgAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAIAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEAAgABAAAAAQABAAAAAgACAAEAAQABAAEAAgABAAEAAQABAAAAAAABAAIAAgACAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAIAAQABAAEAAQABAAIAAQAAAAEAAgABAAAAAAABAAEAAQABAAEAAAAAAAEAAQABAAEAAQAAAAEAAQAAAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAEAAgABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAAAAQABAAEAAQABAAEAAQABAAEAAAABAAEAAQAAAAEAAQABAAEAAQAAAAAAAQABAAEAAQAAAAEAAQAAAAEAAQAAAAAAAQABAAEAAQAAAAEAAQABAAAAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAQABAAAAAQABAAEAAAABAAEAAgABAAEAAQABAAAAAQABAAIAAgABAAEAAQABAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEAAQAAAAAAAAAAAAEAAQAAAAEAAQAAAAEAAQAAAAAAAAABAAEAAQAAAAAAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAEAAQABAAEAAQABAAEAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAAAAAAAAAQABAAEAAAAAAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////////v/+//7//v/+//7//f/9//3//P/8//z//P/9//z//P/7//v/+//7//z//P/8//z/+//6//v/+//8//z//P/8//3//P/8//z/+v/3//f/+f/8//z//P/9//v//P8=';\n\nexport const PCM_DATA = PCM_DATA1 + PCM_DATA2 + PCM_DATA3 + PCM_DATA4;\n"
  },
  {
    "path": "packages/test-app-screen/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.json\",\n  \"compilerOptions\": {\n    \"moduleSuffixes\": [\".ios\", \".android\", \".native\", \"\"],\n  },\n  \"exclude\": [\n    \"**/node_modules\",\n  ]\n}\n"
  },
  {
    "path": "prettier.config.js",
    "content": "/** @type {import('prettier').Config} */\nmodule.exports = {\n  plugins: ['prettier-plugin-jsdoc'],\n  bracketSameLine: true,\n  jsxBracketSameLine: false,\n  printWidth: 80,\n  singleQuote: true,\n  trailingComma: 'es5',\n  tabWidth: 2,\n  arrowParens: 'always',\n};\n"
  },
  {
    "path": "scripts/collect-knowledge-changes.sh",
    "content": "#!/usr/bin/env bash\n# collect-knowledge-changes.sh\n#\n# Collects git diff context since the last /pre-push-update run.\n# Output is consumed by the Claude Code /pre-push-update command.\n#\n# Usage:\n#   bash scripts/collect-knowledge-changes.sh\n#\n# Marker file: .claude/last-knowledge-update  (stores last processed SHA)\n# First run fallback: HEAD~10 (or the root commit if history is short)\n\nset -euo pipefail\n\nSCRIPT_DIR=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nREPO_ROOT=\"$(git -C \"$SCRIPT_DIR\" rev-parse --show-toplevel)\"\nMARKER_FILE=\"$REPO_ROOT/.claude/last-knowledge-update\"\n\n# ── Resolve base SHA ─────────────────────────────────────────────────────────\n\nif [[ -f \"$MARKER_FILE\" ]]; then\n  STORED=$(cat \"$MARKER_FILE\" | tr -d '[:space:]')\nelse\n  STORED=\"\"\nfi\n\nif [[ -n \"$STORED\" ]] && git -C \"$REPO_ROOT\" cat-file -e \"${STORED}^{commit}\" 2>/dev/null; then\n  BASE_SHA=\"$STORED\"\nelse\n  if [[ -n \"$STORED\" ]]; then\n    echo \"# WARNING: stored SHA '$STORED' not found in history, falling back to HEAD~10\" >&2\n  fi\n  BASE_SHA=$(git -C \"$REPO_ROOT\" rev-parse \"HEAD~10\" 2>/dev/null \\\n    || git -C \"$REPO_ROOT\" rev-list --max-parents=0 HEAD)\nfi\n\nHEAD_SHA=$(git -C \"$REPO_ROOT\" rev-parse HEAD)\n\n# ── Nothing to do? ────────────────────────────────────────────────────────────\n\nif [[ \"$BASE_SHA\" == \"$HEAD_SHA\" ]]; then\n  echo \"NO_NEW_COMMITS base=$BASE_SHA\"\n  exit 0\nfi\n\n# ── Header ────────────────────────────────────────────────────────────────────\n\necho \"=== KNOWLEDGE UPDATE CONTEXT ===\"\necho \"base_sha: $BASE_SHA\"\necho \"head_sha: $HEAD_SHA\"\necho \"\"\n\n# ── Commit log ────────────────────────────────────────────────────────────────\n\necho \"=== COMMITS (newest first) ===\"\ngit -C \"$REPO_ROOT\" log \"$BASE_SHA\"..\"$HEAD_SHA\" --oneline --reverse\necho \"\"\n\n# ── Full file list (ALL changes, unfiltered) ──────────────────────────────────\n# Claude uses this to decide which files are worth deep-reading.\n\necho \"=== ALL CHANGED FILES ===\"\ngit -C \"$REPO_ROOT\" diff --stat \"$BASE_SHA\"..\"$HEAD_SHA\"\necho \"\"\n\n# ── Source diff (filtered to paths that affect skills) ───────────────────────\n# Paths:\n#   common/cpp/audioapi/          → audio-nodes, host-objects, thread-safety, utilities\n#   android/src/main/             → native-android, build\n#   ios/                          → native-ios, build\n#   src/                          → turbo-modules, web-audio-api\n#   .claude/                      → CLAUDE.md / skill files themselves\n#\n# Extensions: .h .hpp .cpp .mm .kt .ts .tsx\n# Excluded:   node_modules, Pods, build artifacts, generated files\n\nDIFF_ARGS=(\n  --unified=3\n  --diff-filter=ACMR\n)\n\n# Build the pathspec: combinations of interesting dirs × interesting extensions.\n# We list them explicitly so git can optimise the tree walk.\nINTERESTING=(\n  \"packages/react-native-audio-api/common/cpp/audioapi/*.h\"\n  \"packages/react-native-audio-api/common/cpp/audioapi/**/*.h\"\n  \"packages/react-native-audio-api/common/cpp/audioapi/*.hpp\"\n  \"packages/react-native-audio-api/common/cpp/audioapi/**/*.hpp\"\n  \"packages/react-native-audio-api/common/cpp/audioapi/*.cpp\"\n  \"packages/react-native-audio-api/common/cpp/audioapi/**/*.cpp\"\n  \"packages/react-native-audio-api/android/src/main/**/*.kt\"\n  \"packages/react-native-audio-api/android/src/main/**/*.cpp\"\n  \"packages/react-native-audio-api/android/src/main/**/*.h\"\n  \"packages/react-native-audio-api/ios/**/*.mm\"\n  \"packages/react-native-audio-api/ios/**/*.h\"\n  \"packages/react-native-audio-api/src/**/*.ts\"\n  \"packages/react-native-audio-api/src/**/*.tsx\"\n  \".claude/**\"\n)\n\nEXCLUDE=(\n  \":(exclude)**/node_modules/**\"\n  \":(exclude)**/Pods/**\"\n  \":(exclude)**/build/**\"\n  \":(exclude)**/lib/**\"\n  \":(exclude)**/.turbo/**\"\n  \":(exclude)**/.gradle/**\"\n  \":(exclude)**/.cxx/**\"\n  \":(exclude)**/DerivedData/**\"\n  \":(exclude)**/CMakeFiles/**\"\n  \":(exclude)**/CMakeLists.txt\"\n  \":(exclude)**/*.lock\"\n  \":(exclude)**/*.pbxproj\"\n  # Prebuilt / vendored external libraries — not our code\n  \":(exclude)**/external/**\"\n  \":(exclude)**/prebuilt_libs/**\"\n  \":(exclude)**/ffmpeg_ios/**\"\n  \":(exclude)**/openssl-prebuilt/**\"\n  \":(exclude)**/jniLibs/**\"\n  \":(exclude)**/vendor/**\"\n  \":(exclude)**/libs/ffmpeg/**\"\n  \":(exclude)**/libs/miniaudio/**\"\n  \":(exclude)**/libs/opus/**\"\n  \":(exclude)**/libs/ogg/**\"\n)\n\nDIFF_OUTPUT=$(git -C \"$REPO_ROOT\" diff \"${DIFF_ARGS[@]}\" \\\n  \"$BASE_SHA\"..\"$HEAD_SHA\" \\\n  -- \"${INTERESTING[@]}\" \"${EXCLUDE[@]}\" 2>/dev/null || true)\n\nDIFF_LINES=$(echo \"$DIFF_OUTPUT\" | wc -l | tr -d ' ')\nMAX_LINES=4000\n\necho \"=== SOURCE DIFF (filtered: C++/ObjC++/Kotlin/TypeScript in audioapi paths) ===\"\n\nif [[ -z \"$DIFF_OUTPUT\" ]]; then\n  echo \"(no changes in tracked source paths)\"\nelif [[ \"$DIFF_LINES\" -gt \"$MAX_LINES\" ]]; then\n  echo \"# TRUNCATED: diff is ${DIFF_LINES} lines, showing first ${MAX_LINES}.\"\n  echo \"# Check git diff manually for the full picture.\"\n  echo \"$DIFF_OUTPUT\" | head -n \"$MAX_LINES\"\n  echo \"\"\n  echo \"... [diff truncated at $MAX_LINES lines] ...\"\nelse\n  echo \"$DIFF_OUTPUT\"\nfi\n\necho \"\"\n\n# ── Maintenance tables ─────────────────────────────────────────────────────────\n# Collected from each skill's maintenance.md so /pre-push-update can triage\n# without making additional file reads.\n\necho \"=== MAINTENANCE TABLES ===\"\nSKILLS_DIR=\"$REPO_ROOT/.claude/skills\"\nfor mfile in \"$SKILLS_DIR\"/*/maintenance.md; do\n  skill_name=$(basename \"$(dirname \"$mfile\")\")\n  echo \"--- $skill_name ---\"\n  cat \"$mfile\"\n  echo \"\"\ndone\n\necho \"\"\necho \"=== END ===\"\necho \"HEAD_SHA=$HEAD_SHA\"\n"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"declaration\": true,\n    \"preserveSymlinks\": true,\n    \"target\": \"es6\",\n    \"module\": \"NodeNext\",\n    \"jsx\": \"react-native\",\n    \"skipLibCheck\": true,\n    \"allowSyntheticDefaultImports\": true,\n    \"moduleResolution\": \"NodeNext\",\n    \"moduleSuffixes\": [\".ios\", \".android\", \".native\", \".web\", \"\"],\n    \"lib\": [\"es6\", \"dom\", \"ES2021\"],\n    \"esModuleInterop\": true,\n    \"strict\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"resolveJsonModule\": true,\n    \"removeComments\": false\n  }\n}\n"
  }
]